ZGlmZiAtLWdpdCBhL2ZzL0tjb25maWcgYi9mcy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNGFkNGIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9LY29uZmlnCkBAIC0wLDAgKzEsMTcyOSBAQAorIworIyBGaWxlIHN5c3RlbSBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIkZpbGUgc3lzdGVtcyIKKworY29uZmlnIEVYVDJfRlMKKwl0cmlzdGF0ZSAiU2Vjb25kIGV4dGVuZGVkIGZzIHN1cHBvcnQiCisJaGVscAorCSAgRXh0MiBpcyBhIHN0YW5kYXJkIExpbnV4IGZpbGUgc3lzdGVtIGZvciBoYXJkIGRpc2tzLgorCisJICBUbyBjb21waWxlIHRoaXMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZXh0Mi4gIEJlIGF3YXJlIGhvd2V2ZXIgdGhhdCB0aGUgZmlsZSBzeXN0ZW0KKwkgIG9mIHlvdXIgcm9vdCBwYXJ0aXRpb24gKHRoZSBvbmUgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IC8pIGNhbm5vdAorCSAgYmUgY29tcGlsZWQgYXMgYSBtb2R1bGUsIGFuZCBzbyB0aGlzIGNvdWxkIGJlIGRhbmdlcm91cy4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIEVYVDJfRlNfWEFUVFIKKwlib29sICJFeHQyIGV4dGVuZGVkIGF0dHJpYnV0ZXMiCisJZGVwZW5kcyBvbiBFWFQyX0ZTCisJaGVscAorCSAgRXh0ZW5kZWQgYXR0cmlidXRlcyBhcmUgbmFtZTp2YWx1ZSBwYWlycyBhc3NvY2lhdGVkIHdpdGggaW5vZGVzIGJ5CisJICB0aGUga2VybmVsIG9yIGJ5IHVzZXJzIChzZWUgdGhlIGF0dHIoNSkgbWFudWFsIHBhZ2UsIG9yIHZpc2l0CisJICA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+IGZvciBkZXRhaWxzKS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEVYVDJfRlNfUE9TSVhfQUNMCisJYm9vbCAiRXh0MiBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyIKKwlkZXBlbmRzIG9uIEVYVDJfRlNfWEFUVFIKKwloZWxwCisJICBQb3NpeCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykgc3VwcG9ydCBwZXJtaXNzaW9ucyBmb3IgdXNlcnMgYW5kCisJICBncm91cHMgYmV5b25kIHRoZSBvd25lci9ncm91cC93b3JsZCBzY2hlbWUuCisKKwkgIFRvIGxlYXJuIG1vcmUgYWJvdXQgQWNjZXNzIENvbnRyb2wgTGlzdHMsIHZpc2l0IHRoZSBQb3NpeCBBQ0xzIGZvcgorCSAgTGludXggd2Vic2l0ZSA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+LgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IEFjY2VzcyBDb250cm9sIExpc3RzIGFyZSwgc2F5IE4KKworY29uZmlnIEVYVDJfRlNfU0VDVVJJVFkKKwlib29sICJFeHQyIFNlY3VyaXR5IExhYmVscyIKKwlkZXBlbmRzIG9uIEVYVDJfRlNfWEFUVFIKKwloZWxwCisJICBTZWN1cml0eSBsYWJlbHMgc3VwcG9ydCBhbHRlcm5hdGl2ZSBhY2Nlc3MgY29udHJvbCBtb2RlbHMKKwkgIGltcGxlbWVudGVkIGJ5IHNlY3VyaXR5IG1vZHVsZXMgbGlrZSBTRUxpbnV4LiAgVGhpcyBvcHRpb24KKwkgIGVuYWJsZXMgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGhhbmRsZXIgZm9yIGZpbGUgc2VjdXJpdHkKKwkgIGxhYmVscyBpbiB0aGUgZXh0MiBmaWxlc3lzdGVtLgorCisJICBJZiB5b3UgYXJlIG5vdCB1c2luZyBhIHNlY3VyaXR5IG1vZHVsZSB0aGF0IHJlcXVpcmVzIHVzaW5nCisJICBleHRlbmRlZCBhdHRyaWJ1dGVzIGZvciBmaWxlIHNlY3VyaXR5IGxhYmVscywgc2F5IE4uCisKK2NvbmZpZyBFWFQzX0ZTCisJdHJpc3RhdGUgIkV4dDMgam91cm5hbGxpbmcgZmlsZSBzeXN0ZW0gc3VwcG9ydCIKKwloZWxwCisJICBUaGlzIGlzIHRoZSBqb3VybmFsaW5nIHZlcnNpb24gb2YgdGhlIFNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbQorCSAgKG9mdGVuIGNhbGxlZCBleHQzKSwgdGhlIGRlIGZhY3RvIHN0YW5kYXJkIExpbnV4IGZpbGUgc3lzdGVtCisJICAobWV0aG9kIHRvIG9yZ2FuaXplIGZpbGVzIG9uIGEgc3RvcmFnZSBkZXZpY2UpIGZvciBoYXJkIGRpc2tzLgorCisJICBUaGUgam91cm5hbGluZyBjb2RlIGluY2x1ZGVkIGluIHRoaXMgZHJpdmVyIG1lYW5zIHlvdSBkbyBub3QgaGF2ZQorCSAgdG8gcnVuIGUyZnNjayAoZmlsZSBzeXN0ZW0gY2hlY2tlcikgb24geW91ciBmaWxlIHN5c3RlbXMgYWZ0ZXIgYQorCSAgY3Jhc2guICBUaGUgam91cm5hbCBrZWVwcyB0cmFjayBvZiBhbnkgY2hhbmdlcyB0aGF0IHdlcmUgYmVpbmcgbWFkZQorCSAgYXQgdGhlIHRpbWUgdGhlIHN5c3RlbSBjcmFzaGVkLCBhbmQgY2FuIGVuc3VyZSB0aGF0IHlvdXIgZmlsZSBzeXN0ZW0KKwkgIGlzIGNvbnNpc3RlbnQgd2l0aG91dCB0aGUgbmVlZCBmb3IgYSBsZW5ndGh5IGNoZWNrLgorCisJICBPdGhlciB0aGFuIGFkZGluZyB0aGUgam91cm5hbCB0byB0aGUgZmlsZSBzeXN0ZW0sIHRoZSBvbi1kaXNrIGZvcm1hdAorCSAgb2YgZXh0MyBpcyBpZGVudGljYWwgdG8gZXh0Mi4gIEl0IGlzIHBvc3NpYmxlIHRvIGZyZWVseSBzd2l0Y2gKKwkgIGJldHdlZW4gdXNpbmcgdGhlIGV4dDMgZHJpdmVyIGFuZCB0aGUgZXh0MiBkcml2ZXIsIGFzIGxvbmcgYXMgdGhlCisJICBmaWxlIHN5c3RlbSBoYXMgYmVlbiBjbGVhbmx5IHVubW91bnRlZCwgb3IgZTJmc2NrIGlzIHJ1biBvbiB0aGUgZmlsZQorCSAgc3lzdGVtLgorCisJICBUbyBhZGQgYSBqb3VybmFsIG9uIGFuIGV4aXN0aW5nIGV4dDIgZmlsZSBzeXN0ZW0gb3IgY2hhbmdlIHRoZQorCSAgYmVoYXZpb3Igb2YgZXh0MyBmaWxlIHN5c3RlbXMsIHlvdSBjYW4gdXNlIHRoZSB0dW5lMmZzIHV0aWxpdHkgKCJtYW4KKwkgIHR1bmUyZnMiKS4gIFRvIG1vZGlmeSBhdHRyaWJ1dGVzIG9mIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBvbiBleHQzCisJICBmaWxlIHN5c3RlbXMsIHVzZSBjaGF0dHIgKCJtYW4gY2hhdHRyIikuICBZb3UgbmVlZCB0byBiZSB1c2luZworCSAgZTJmc3Byb2dzIHZlcnNpb24gMS4yMCBvciBsYXRlciBpbiBvcmRlciB0byBjcmVhdGUgZXh0MyBqb3VybmFscworCSAgKGF2YWlsYWJsZSBhdCA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9lMmZzcHJvZ3MvPikuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBmaWxlIHN5c3RlbSBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBleHQzLiAgQmUgYXdhcmUgaG93ZXZlciB0aGF0IHRoZSBmaWxlIHN5c3RlbQorCSAgb2YgeW91ciByb290IHBhcnRpdGlvbiAodGhlIG9uZSBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkgLykgY2Fubm90CisJICBiZSBjb21waWxlZCBhcyBhIG1vZHVsZSwgYW5kIHNvIHRoaXMgbWF5IGJlIGRhbmdlcm91cy4KKworY29uZmlnIEVYVDNfRlNfWEFUVFIKKwlib29sICJFeHQzIGV4dGVuZGVkIGF0dHJpYnV0ZXMiCisJZGVwZW5kcyBvbiBFWFQzX0ZTCisJZGVmYXVsdCB5CisJaGVscAorCSAgRXh0ZW5kZWQgYXR0cmlidXRlcyBhcmUgbmFtZTp2YWx1ZSBwYWlycyBhc3NvY2lhdGVkIHdpdGggaW5vZGVzIGJ5CisJICB0aGUga2VybmVsIG9yIGJ5IHVzZXJzIChzZWUgdGhlIGF0dHIoNSkgbWFudWFsIHBhZ2UsIG9yIHZpc2l0CisJICA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+IGZvciBkZXRhaWxzKS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworCSAgWW91IG5lZWQgdGhpcyBmb3IgUE9TSVggQUNMIHN1cHBvcnQgb24gZXh0My4KKworY29uZmlnIEVYVDNfRlNfUE9TSVhfQUNMCisJYm9vbCAiRXh0MyBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyIKKwlkZXBlbmRzIG9uIEVYVDNfRlNfWEFUVFIKKwloZWxwCisJICBQb3NpeCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykgc3VwcG9ydCBwZXJtaXNzaW9ucyBmb3IgdXNlcnMgYW5kCisJICBncm91cHMgYmV5b25kIHRoZSBvd25lci9ncm91cC93b3JsZCBzY2hlbWUuCisKKwkgIFRvIGxlYXJuIG1vcmUgYWJvdXQgQWNjZXNzIENvbnRyb2wgTGlzdHMsIHZpc2l0IHRoZSBQb3NpeCBBQ0xzIGZvcgorCSAgTGludXggd2Vic2l0ZSA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+LgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IEFjY2VzcyBDb250cm9sIExpc3RzIGFyZSwgc2F5IE4KKworY29uZmlnIEVYVDNfRlNfU0VDVVJJVFkKKwlib29sICJFeHQzIFNlY3VyaXR5IExhYmVscyIKKwlkZXBlbmRzIG9uIEVYVDNfRlNfWEFUVFIKKwloZWxwCisJICBTZWN1cml0eSBsYWJlbHMgc3VwcG9ydCBhbHRlcm5hdGl2ZSBhY2Nlc3MgY29udHJvbCBtb2RlbHMKKwkgIGltcGxlbWVudGVkIGJ5IHNlY3VyaXR5IG1vZHVsZXMgbGlrZSBTRUxpbnV4LiAgVGhpcyBvcHRpb24KKwkgIGVuYWJsZXMgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGhhbmRsZXIgZm9yIGZpbGUgc2VjdXJpdHkKKwkgIGxhYmVscyBpbiB0aGUgZXh0MyBmaWxlc3lzdGVtLgorCisJICBJZiB5b3UgYXJlIG5vdCB1c2luZyBhIHNlY3VyaXR5IG1vZHVsZSB0aGF0IHJlcXVpcmVzIHVzaW5nCisJICBleHRlbmRlZCBhdHRyaWJ1dGVzIGZvciBmaWxlIHNlY3VyaXR5IGxhYmVscywgc2F5IE4uCisKK2NvbmZpZyBKQkQKKyMgQ09ORklHX0pCRCBjb3VsZCBiZSBpdHMgb3duIG9wdGlvbiAoZXZlbiBtb2R1bGFyKSwgYnV0IHVudGlsIHRoZXJlIGFyZQorIyBvdGhlciB1c2VycyB0aGFuIGV4dDMsIHdlIHdpbGwgc2ltcGx5IG1ha2UgaXQgYmUgdGhlIHNhbWUgYXMgQ09ORklHX0VYVDNfRlMKKyMgZGVwX3RyaXN0YXRlICcgIEpvdXJuYWwgQmxvY2sgRGV2aWNlIHN1cHBvcnQgKEpCRCBmb3IgZXh0MyknIENPTkZJR19KQkQgJENPTkZJR19FWFQzX0ZTCisJdHJpc3RhdGUKKwlkZWZhdWx0IEVYVDNfRlMKKwloZWxwCisJICBUaGlzIGlzIGEgZ2VuZXJpYyBqb3VybmFsaW5nIGxheWVyIGZvciBibG9jayBkZXZpY2VzLiAgSXQgaXMKKwkgIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBleHQzIGZpbGUgc3lzdGVtLCBidXQgaXQgY291bGQgYWxzbyBiZSB1c2VkIHRvCisJICBhZGQgam91cm5hbCBzdXBwb3J0IHRvIG90aGVyIGZpbGUgc3lzdGVtcyBvciBibG9jayBkZXZpY2VzIHN1Y2ggYXMKKwkgIFJBSUQgb3IgTFZNLgorCisJICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBleHQzIGZpbGUgc3lzdGVtLCB5b3UgbmVlZCB0byBzYXkgWSBoZXJlLiBJZgorCSAgeW91IGFyZSBub3QgdXNpbmcgZXh0MyB0aGVuIHlvdSB3aWxsIHByb2JhYmx5IHdhbnQgdG8gc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkZXZpY2UgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGpiZC4gIElmIHlvdSBhcmUgY29tcGlsaW5nIGV4dDMgaW50byB0aGUga2VybmVsLCB5b3UgY2Fubm90CisJICBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZS4KKworY29uZmlnIEpCRF9ERUJVRworCWJvb2wgIkpCRCAoZXh0MykgZGVidWdnaW5nIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBKQkQKKwloZWxwCisJICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBleHQzIGpvdXJuYWxlZCBmaWxlIHN5c3RlbSAob3IgcG90ZW50aWFsbHkgYW55CisJICBvdGhlciBmaWxlIHN5c3RlbS9kZXZpY2UgdXNpbmcgSkJEKSwgdGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0bworCSAgZW5hYmxlIGRlYnVnZ2luZyBvdXRwdXQgd2hpbGUgdGhlIHN5c3RlbSBpcyBydW5uaW5nLCBpbiBvcmRlciB0bworCSAgaGVscCB0cmFjayBkb3duIGFueSBwcm9ibGVtcyB5b3UgYXJlIGhhdmluZy4gIEJ5IGRlZmF1bHQgdGhlCisJICBkZWJ1Z2dpbmcgb3V0cHV0IHdpbGwgYmUgdHVybmVkIG9mZi4KKworCSAgSWYgeW91IHNlbGVjdCBZIGhlcmUsIHRoZW4geW91IHdpbGwgYmUgYWJsZSB0byB0dXJuIG9uIGRlYnVnZ2luZworCSAgd2l0aCAiZWNobyBOID4gL3Byb2Mvc3lzL2ZzL2piZC1kZWJ1ZyIsIHdoZXJlIE4gaXMgYSBudW1iZXIgYmV0d2VlbgorCSAgMSBhbmQgNSwgdGhlIGhpZ2hlciB0aGUgbnVtYmVyLCB0aGUgbW9yZSBkZWJ1Z2dpbmcgb3V0cHV0IGlzCisJICBnZW5lcmF0ZWQuICBUbyB0dXJuIGRlYnVnZ2luZyBvZmYgYWdhaW4sIGRvCisJICAiZWNobyAwID4gL3Byb2Mvc3lzL2ZzL2piZC1kZWJ1ZyIuCisKK2NvbmZpZyBGU19NQkNBQ0hFCisjIE1ldGEgYmxvY2sgY2FjaGUgZm9yIEV4dGVuZGVkIEF0dHJpYnV0ZXMgKGV4dDIvZXh0MykKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gRVhUMl9GU19YQVRUUiB8fCBFWFQzX0ZTX1hBVFRSCisJZGVmYXVsdCB5IGlmIEVYVDJfRlM9eSB8fCBFWFQzX0ZTPXkKKwlkZWZhdWx0IG0gaWYgRVhUMl9GUz1tIHx8IEVYVDNfRlM9bQorCitjb25maWcgUkVJU0VSRlNfRlMKKwl0cmlzdGF0ZSAiUmVpc2VyZnMgc3VwcG9ydCIKKwloZWxwCisJICBTdG9yZXMgbm90IGp1c3QgZmlsZW5hbWVzIGJ1dCB0aGUgZmlsZXMgdGhlbXNlbHZlcyBpbiBhIGJhbGFuY2VkCisJICB0cmVlLiAgVXNlcyBqb3VybmFsaW5nLgorCisJICBCYWxhbmNlZCB0cmVlcyBhcmUgbW9yZSBlZmZpY2llbnQgdGhhbiB0cmFkaXRpb25hbCBmaWxlIHN5c3RlbQorCSAgYXJjaGl0ZWN0dXJhbCBmb3VuZGF0aW9ucy4KKworCSAgSW4gZ2VuZXJhbCwgUmVpc2VyRlMgaXMgYXMgZmFzdCBhcyBleHQyLCBidXQgaXMgdmVyeSBlZmZpY2llbnQgd2l0aAorCSAgbGFyZ2UgZGlyZWN0b3JpZXMgYW5kIHNtYWxsIGZpbGVzLiAgQWRkaXRpb25hbCBwYXRjaGVzIGFyZSBuZWVkZWQKKwkgIGZvciBORlMgYW5kIHF1b3RhcywgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5uYW1lc3lzLmNvbS8+IGZvciBsaW5rcy4KKworCSAgSXQgaXMgbW9yZSBlYXNpbHkgZXh0ZW5kZWQgdG8gaGF2ZSBmZWF0dXJlcyBjdXJyZW50bHkgZm91bmQgaW4KKwkgIGRhdGFiYXNlIGFuZCBrZXl3b3JkIHNlYXJjaCBzeXN0ZW1zIHRoYW4gYmxvY2sgYWxsb2NhdGlvbiBiYXNlZCBmaWxlCisJICBzeXN0ZW1zIGFyZS4gIFRoZSBuZXh0IHZlcnNpb24gd2lsbCBiZSBzbyBleHRlbmRlZCwgYW5kIHdpbGwgc3VwcG9ydAorCSAgcGx1Z2lucyBjb25zaXN0ZW50IHdpdGggb3VyIG1vdHRvIGBgSXQgdGFrZXMgbW9yZSB0aGFuIGEgbGljZW5zZSB0bworCSAgbWFrZSBzb3VyY2UgY29kZSBvcGVuLicnCisKKwkgIFJlYWQgPGh0dHA6Ly93d3cubmFtZXN5cy5jb20vPiB0byBsZWFybiBtb3JlIGFib3V0IHJlaXNlcmZzLgorCisJICBTcG9uc29yZWQgYnkgVGhyZXNob2xkIE5ldHdvcmtzLCBFbXVzaWMuY29tLCBhbmQgQmlnc3RvcmFnZS5jb20uCisKKwkgIElmIHlvdSBsaWtlIGl0LCB5b3UgY2FuIHBheSB1cyB0byBhZGQgbmV3IGZlYXR1cmVzIHRvIGl0IHRoYXQgeW91CisJICBuZWVkLCBidXkgYSBzdXBwb3J0IGNvbnRyYWN0LCBvciBwYXkgdXMgdG8gcG9ydCBpdCB0byBhbm90aGVyIE9TLgorCitjb25maWcgUkVJU0VSRlNfQ0hFQ0sKKwlib29sICJFbmFibGUgcmVpc2VyZnMgZGVidWcgbW9kZSIKKwlkZXBlbmRzIG9uIFJFSVNFUkZTX0ZTCisJaGVscAorCSAgSWYgeW91IHNldCB0aGlzIHRvIFksIHRoZW4gUmVpc2VyRlMgd2lsbCBwZXJmb3JtIGV2ZXJ5IGNoZWNrIGl0IGNhbgorCSAgcG9zc2libHkgaW1hZ2luZSBvZiBpdHMgaW50ZXJuYWwgY29uc2lzdGVuY3kgdGhyb3VnaG91dCBpdHMKKwkgIG9wZXJhdGlvbi4gIEl0IHdpbGwgYWxzbyBnbyBzdWJzdGFudGlhbGx5IHNsb3dlci4gIE1vcmUgdGhhbiBvbmNlIHdlCisJICBoYXZlIGZvcmdvdHRlbiB0aGF0IHRoaXMgd2FzIG9uLCBhbmQgdGhlbiBnb25lIGRlc3BvbmRlbnQgb3ZlciB0aGUKKwkgIGxhdGVzdCBiZW5jaG1hcmtzLjotKSBVc2Ugb2YgdGhpcyBvcHRpb24gYWxsb3dzIG91ciB0ZWFtIHRvIGdvIGFsbAorCSAgb3V0IGluIGNoZWNraW5nIGZvciBjb25zaXN0ZW5jeSB3aGVuIGRlYnVnZ2luZyB3aXRob3V0IGZlYXIgb2YgaXRzCisJICBlZmZlY3Qgb24gZW5kIHVzZXJzLiAgSWYgeW91IGFyZSBvbiB0aGUgdmVyZ2Ugb2Ygc2VuZGluZyBpbiBhIGJ1ZworCSAgcmVwb3J0LCBzYXkgWSBhbmQgeW91IG1pZ2h0IGdldCBhIHVzZWZ1bCBlcnJvciBtZXNzYWdlLiAgQWxtb3N0CisJICBldmVyeW9uZSBzaG91bGQgc2F5IE4uCisKK2NvbmZpZyBSRUlTRVJGU19QUk9DX0lORk8KKwlib29sICJTdGF0cyBpbiAvcHJvYy9mcy9yZWlzZXJmcyIKKwlkZXBlbmRzIG9uIFJFSVNFUkZTX0ZTCisJaGVscAorCSAgQ3JlYXRlIHVuZGVyIC9wcm9jL2ZzL3JlaXNlcmZzIGEgaGllcmFyY2h5IG9mIGZpbGVzLCBkaXNwbGF5aW5nCisJICB2YXJpb3VzIFJlaXNlckZTIHN0YXRpc3RpY3MgYW5kIGludGVybmFsIGRhdGEgYXQgdGhlIGV4cGVuc2Ugb2YKKwkgIG1ha2luZyB5b3VyIGtlcm5lbCBvciBtb2R1bGUgc2xpZ2h0bHkgbGFyZ2VyICgrOCBLQikuIFRoaXMgYWxzbworCSAgaW5jcmVhc2VzIHRoZSBhbW91bnQgb2Yga2VybmVsIG1lbW9yeSByZXF1aXJlZCBmb3IgZWFjaCBtb3VudC4KKwkgIEFsbW9zdCBldmVyeW9uZSBidXQgUmVpc2VyRlMgZGV2ZWxvcGVycyBhbmQgcGVvcGxlIGZpbmUtdHVuaW5nCisJICByZWlzZXJmcyBvciB0cmFjaW5nIHByb2JsZW1zIHNob3VsZCBzYXkgTi4KKworY29uZmlnIFJFSVNFUkZTX0ZTX1hBVFRSCisJYm9vbCAiUmVpc2VyRlMgZXh0ZW5kZWQgYXR0cmlidXRlcyIKKwlkZXBlbmRzIG9uIFJFSVNFUkZTX0ZTCisJaGVscAorCSAgRXh0ZW5kZWQgYXR0cmlidXRlcyBhcmUgbmFtZTp2YWx1ZSBwYWlycyBhc3NvY2lhdGVkIHdpdGggaW5vZGVzIGJ5CisJICB0aGUga2VybmVsIG9yIGJ5IHVzZXJzIChzZWUgdGhlIGF0dHIoNSkgbWFudWFsIHBhZ2UsIG9yIHZpc2l0CisJICA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+IGZvciBkZXRhaWxzKS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFJFSVNFUkZTX0ZTX1BPU0lYX0FDTAorCWJvb2wgIlJlaXNlckZTIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzIgorCWRlcGVuZHMgb24gUkVJU0VSRlNfRlNfWEFUVFIKKwloZWxwCisJICBQb3NpeCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykgc3VwcG9ydCBwZXJtaXNzaW9ucyBmb3IgdXNlcnMgYW5kCisJICBncm91cHMgYmV5b25kIHRoZSBvd25lci9ncm91cC93b3JsZCBzY2hlbWUuCisKKwkgIFRvIGxlYXJuIG1vcmUgYWJvdXQgQWNjZXNzIENvbnRyb2wgTGlzdHMsIHZpc2l0IHRoZSBQb3NpeCBBQ0xzIGZvcgorCSAgTGludXggd2Vic2l0ZSA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+LgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IEFjY2VzcyBDb250cm9sIExpc3RzIGFyZSwgc2F5IE4KKworY29uZmlnIFJFSVNFUkZTX0ZTX1NFQ1VSSVRZCisJYm9vbCAiUmVpc2VyRlMgU2VjdXJpdHkgTGFiZWxzIgorCWRlcGVuZHMgb24gUkVJU0VSRlNfRlNfWEFUVFIKKwloZWxwCisJICBTZWN1cml0eSBsYWJlbHMgc3VwcG9ydCBhbHRlcm5hdGl2ZSBhY2Nlc3MgY29udHJvbCBtb2RlbHMKKwkgIGltcGxlbWVudGVkIGJ5IHNlY3VyaXR5IG1vZHVsZXMgbGlrZSBTRUxpbnV4LiAgVGhpcyBvcHRpb24KKwkgIGVuYWJsZXMgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGhhbmRsZXIgZm9yIGZpbGUgc2VjdXJpdHkKKwkgIGxhYmVscyBpbiB0aGUgUmVpc2VyRlMgZmlsZXN5c3RlbS4KKworCSAgSWYgeW91IGFyZSBub3QgdXNpbmcgYSBzZWN1cml0eSBtb2R1bGUgdGhhdCByZXF1aXJlcyB1c2luZworCSAgZXh0ZW5kZWQgYXR0cmlidXRlcyBmb3IgZmlsZSBzZWN1cml0eSBsYWJlbHMsIHNheSBOLgorCitjb25maWcgSkZTX0ZTCisJdHJpc3RhdGUgIkpGUyBmaWxlc3lzdGVtIHN1cHBvcnQiCisJc2VsZWN0IE5MUworCWhlbHAKKwkgIFRoaXMgaXMgYSBwb3J0IG9mIElCTSdzIEpvdXJuYWxlZCBGaWxlc3lzdGVtIC4gIE1vcmUgaW5mb3JtYXRpb24gaXMKKwkgIGF2YWlsYWJsZSBpbiB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2pmcy50eHQ+LgorCisJICBJZiB5b3UgZG8gbm90IGludGVuZCB0byB1c2UgdGhlIEpGUyBmaWxlc3lzdGVtLCBzYXkgTi4KKworY29uZmlnIEpGU19QT1NJWF9BQ0wKKwlib29sICJKRlMgUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdHMiCisJZGVwZW5kcyBvbiBKRlNfRlMKKwloZWxwCisJICBQb3NpeCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykgc3VwcG9ydCBwZXJtaXNzaW9ucyBmb3IgdXNlcnMgYW5kCisJICBncm91cHMgYmV5b25kIHRoZSBvd25lci9ncm91cC93b3JsZCBzY2hlbWUuCisKKwkgIFRvIGxlYXJuIG1vcmUgYWJvdXQgQWNjZXNzIENvbnRyb2wgTGlzdHMsIHZpc2l0IHRoZSBQb3NpeCBBQ0xzIGZvcgorCSAgTGludXggd2Vic2l0ZSA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+LgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IEFjY2VzcyBDb250cm9sIExpc3RzIGFyZSwgc2F5IE4KKworY29uZmlnIEpGU19TRUNVUklUWQorCWJvb2wgIkpGUyBTZWN1cml0eSBMYWJlbHMiCisJZGVwZW5kcyBvbiBKRlNfRlMKKwloZWxwCisJICBTZWN1cml0eSBsYWJlbHMgc3VwcG9ydCBhbHRlcm5hdGl2ZSBhY2Nlc3MgY29udHJvbCBtb2RlbHMKKwkgIGltcGxlbWVudGVkIGJ5IHNlY3VyaXR5IG1vZHVsZXMgbGlrZSBTRUxpbnV4LiAgVGhpcyBvcHRpb24KKwkgIGVuYWJsZXMgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGhhbmRsZXIgZm9yIGZpbGUgc2VjdXJpdHkKKwkgIGxhYmVscyBpbiB0aGUgamZzIGZpbGVzeXN0ZW0uCisKKwkgIElmIHlvdSBhcmUgbm90IHVzaW5nIGEgc2VjdXJpdHkgbW9kdWxlIHRoYXQgcmVxdWlyZXMgdXNpbmcKKwkgIGV4dGVuZGVkIGF0dHJpYnV0ZXMgZm9yIGZpbGUgc2VjdXJpdHkgbGFiZWxzLCBzYXkgTi4KKworY29uZmlnIEpGU19ERUJVRworCWJvb2wgIkpGUyBkZWJ1Z2dpbmciCisJZGVwZW5kcyBvbiBKRlNfRlMKKwloZWxwCisJICBJZiB5b3UgYXJlIGV4cGVyaWVuY2luZyBhbnkgcHJvYmxlbXMgd2l0aCB0aGUgSkZTIGZpbGVzeXN0ZW0sIHNheQorCSAgWSBoZXJlLiAgVGhpcyB3aWxsIHJlc3VsdCBpbiBhZGRpdGlvbmFsIGRlYnVnZ2luZyBtZXNzYWdlcyB0byBiZQorCSAgd3JpdHRlbiB0byB0aGUgc3lzdGVtIGxvZy4gIFVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCB0aGlzCisJICByZXN1bHRzIGluIHZlcnkgbGl0dGxlIG92ZXJoZWFkLgorCitjb25maWcgSkZTX1NUQVRJU1RJQ1MKKwlib29sICJKRlMgc3RhdGlzdGljcyIKKwlkZXBlbmRzIG9uIEpGU19GUworCWhlbHAKKwkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgY2F1c2Ugc3RhdGlzdGljcyBmcm9tIHRoZSBKRlMgZmlsZSBzeXN0ZW0KKwkgIHRvIGJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSB1c2VyIGluIHRoZSAvcHJvYy9mcy9qZnMvIGRpcmVjdG9yeS4KKworY29uZmlnIEZTX1BPU0lYX0FDTAorIyBQb3NpeCBBQ0wgdXRpbGl0eSByb3V0aW5lcyAoZm9yIG5vdywgb25seSBleHQyL2V4dDMvamZzL3JlaXNlcmZzKQorIworIyBOT1RFOiB5b3UgY2FuIGltcGxlbWVudCBQb3NpeCBBQ0xzIHdpdGhvdXQgdGhlc2UgaGVscGVycyAoWEZTIGRvZXMpLgorIyAJTmV2ZXIgdXNlIHRoaXMgc3ltYm9sIGZvciBpZmRlZnMuCisjCisJYm9vbAorCWRlcGVuZHMgb24gRVhUMl9GU19QT1NJWF9BQ0wgfHwgRVhUM19GU19QT1NJWF9BQ0wgfHwgSkZTX1BPU0lYX0FDTCB8fCBSRUlTRVJGU19GU19QT1NJWF9BQ0wgfHwgTkZTRF9WNAorCWRlZmF1bHQgeQorCitzb3VyY2UgImZzL3hmcy9LY29uZmlnIgorCitjb25maWcgTUlOSVhfRlMKKwl0cmlzdGF0ZSAiTWluaXggZnMgc3VwcG9ydCIKKwloZWxwCisJICBNaW5peCBpcyBhIHNpbXBsZSBvcGVyYXRpbmcgc3lzdGVtIHVzZWQgaW4gbWFueSBjbGFzc2VzIGFib3V0IE9TJ3MuCisJICBUaGUgbWluaXggZmlsZSBzeXN0ZW0gKG1ldGhvZCB0byBvcmdhbml6ZSBmaWxlcyBvbiBhIGhhcmQgZGlzaworCSAgcGFydGl0aW9uIG9yIGEgZmxvcHB5IGRpc2spIHdhcyB0aGUgb3JpZ2luYWwgZmlsZSBzeXN0ZW0gZm9yIExpbnV4LAorCSAgYnV0IGhhcyBiZWVuIHN1cGVyc2VkZWQgYnkgdGhlIHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbSBleHQyZnMuCisJICBZb3UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIG1pbml4IGZpbGUgc3lzdGVtIG9uIHlvdXIgaGFyZCBkaXNrCisJICBiZWNhdXNlIG9mIGNlcnRhaW4gYnVpbHQtaW4gcmVzdHJpY3Rpb25zLCBidXQgaXQgaXMgc29tZXRpbWVzIGZvdW5kCisJICBvbiBvbGRlciBMaW51eCBmbG9wcHkgZGlza3MuICBUaGlzIG9wdGlvbiB3aWxsIGVubGFyZ2UgeW91ciBrZXJuZWwKKwkgIGJ5IGFib3V0IDI4IEtCLiBJZiB1bnN1cmUsIHNheSBOLgorCisJICBUbyBjb21waWxlIHRoaXMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWluaXguICBOb3RlIHRoYXQgdGhlIGZpbGUgc3lzdGVtIG9mIHlvdXIgcm9vdAorCSAgcGFydGl0aW9uICh0aGUgb25lIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeSAvKSBjYW5ub3QgYmUgY29tcGlsZWQgYXMKKwkgIGEgbW9kdWxlLgorCitjb25maWcgUk9NRlNfRlMKKwl0cmlzdGF0ZSAiUk9NIGZpbGUgc3lzdGVtIHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIHZlcnkgc21hbGwgcmVhZC1vbmx5IGZpbGUgc3lzdGVtIG1haW5seSBpbnRlbmRlZCBmb3IKKwkgIGluaXRpYWwgcmFtIGRpc2tzIG9mIGluc3RhbGxhdGlvbiBkaXNrcywgYnV0IGl0IGNvdWxkIGJlIHVzZWQgZm9yCisJICBvdGhlciByZWFkLW9ubHkgbWVkaWEgYXMgd2VsbC4gIFJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcm9tZnMudHh0PiBmb3IgZGV0YWlscy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJvbWZzLiAgTm90ZSB0aGF0IHRoZSBmaWxlIHN5c3RlbSBvZiB5b3VyCisJICByb290IHBhcnRpdGlvbiAodGhlIG9uZSBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkgLykgY2Fubm90IGJlIGEKKwkgIG1vZHVsZS4KKworCSAgSWYgeW91IGRvbid0IGtub3cgd2hldGhlciB5b3UgbmVlZCBpdCwgdGhlbiB5b3UgZG9uJ3QgbmVlZCBpdDoKKwkgIGFuc3dlciBOLgorCitjb25maWcgUVVPVEEKKwlib29sICJRdW90YSBzdXBwb3J0IgorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNldCBwZXIgdXNlciBsaW1pdHMgZm9yIGRpc2sKKwkgIHVzYWdlIChhbHNvIGNhbGxlZCBkaXNrIHF1b3RhcykuIEN1cnJlbnRseSwgaXQgd29ya3MgZm9yIHRoZQorCSAgZXh0MiwgZXh0MywgYW5kIHJlaXNlcmZzIGZpbGUgc3lzdGVtLiBleHQzIGFsc28gc3VwcG9ydHMgam91cm5hbGxlZAorCSAgcXVvdGFzIGZvciB3aGljaCB5b3UgZG9uJ3QgbmVlZCB0byBydW4gcXVvdGFjaGVjayg4KSBhZnRlciBhbiB1bmNsZWFuCisJICBzaHV0ZG93bi4gWW91IG5lZWQgYWRkaXRpb25hbCBzb2Z0d2FyZSBpbiBvcmRlciB0byB1c2UgcXVvdGEgc3VwcG9ydAorCSAgKHlvdSBjYW4gZG93bmxvYWQgc291cmNlcyBmcm9tCisJICA8aHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGludXhxdW90YS8+KS4gRm9yIGZ1cnRoZXIgZGV0YWlscywgcmVhZAorCSAgdGhlIFF1b3RhIG1pbmktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LCBvciB0aGUgZG9jdW1lbnRhdGlvbiBwcm92aWRlZAorCSAgd2l0aCB0aGUgcXVvdGEgdG9vbHMuIFByb2JhYmx5IHRoZSBxdW90YSBzdXBwb3J0IGlzIG9ubHkgdXNlZnVsIGZvcgorCSAgbXVsdGkgdXNlciBzeXN0ZW1zLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUUZNVF9WMQorCXRyaXN0YXRlICJPbGQgcXVvdGEgZm9ybWF0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBRVU9UQQorCWhlbHAKKwkgIFRoaXMgcXVvdGEgZm9ybWF0IHdhcyAoaXMpIHVzZWQgYnkga2VybmVscyBlYXJsaWVyIHRoYW4gMi40LjIyLiBJZgorCSAgeW91IGhhdmUgcXVvdGEgd29ya2luZyBhbmQgeW91IGRvbid0IHdhbnQgdG8gY29udmVydCB0byBuZXcgcXVvdGEKKwkgIGZvcm1hdCBzYXkgWSBoZXJlLgorCitjb25maWcgUUZNVF9WMgorCXRyaXN0YXRlICJRdW90YSBmb3JtYXQgdjIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFFVT1RBCisJaGVscAorCSAgVGhpcyBxdW90YSBmb3JtYXQgYWxsb3dzIHVzaW5nIHF1b3RhcyB3aXRoIDMyLWJpdCBVSURzL0dJRHMuIElmIHlvdQorCSAgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkgc2F5IFkgaGVyZS4gTm90ZSB0aGF0IHlvdSB3aWxsIG5lZWQgcmVjZW50CisJICBxdW90YSB1dGlsaXRpZXMgKD49IDMuMDEpIGZvciBuZXcgcXVvdGEgZm9ybWF0IHdpdGggdGhpcyBrZXJuZWwuCisKK2NvbmZpZyBRVU9UQUNUTAorCWJvb2wKKwlkZXBlbmRzIG9uIFhGU19RVU9UQSB8fCBRVU9UQQorCWRlZmF1bHQgeQorCitjb25maWcgRE5PVElGWQorCWJvb2wgIkRub3RpZnkgc3VwcG9ydCIgaWYgRU1CRURERUQKKwlkZWZhdWx0IHkKKwloZWxwCisJICBEbm90aWZ5IGlzIGEgZGlyZWN0b3J5LWJhc2VkIHBlci1mZCBmaWxlIGNoYW5nZSBub3RpZmljYXRpb24gc3lzdGVtCisJICB0aGF0IHVzZXMgc2lnbmFscyB0byBjb21tdW5pY2F0ZSBldmVudHMgdG8gdXNlci1zcGFjZS4gIFRoZXJlIGV4aXN0CisJICBzdXBlcmlvciBhbHRlcm5hdGl2ZXMsIGJ1dCBzb21lIGFwcGxpY2F0aW9ucyBtYXkgc3RpbGwgcmVseSBvbgorCSAgZG5vdGlmeS4KKworCSAgQmVjYXVzZSBvZiB0aGlzLCBpZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgQVVUT0ZTX0ZTCisJdHJpc3RhdGUgIktlcm5lbCBhdXRvbW91bnRlciBzdXBwb3J0IgorCWhlbHAKKwkgIFRoZSBhdXRvbW91bnRlciBpcyBhIHRvb2wgdG8gYXV0b21hdGljYWxseSBtb3VudCByZW1vdGUgZmlsZSBzeXN0ZW1zCisJICBvbiBkZW1hbmQuIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgcGFydGlhbGx5IGtlcm5lbC1iYXNlZCB0byByZWR1Y2UKKwkgIG92ZXJoZWFkIGluIHRoZSBhbHJlYWR5LW1vdW50ZWQgY2FzZTsgdGhpcyBpcyB1bmxpa2UgdGhlIEJTRAorCSAgYXV0b21vdW50ZXIgKGFtZCksIHdoaWNoIGlzIGEgcHVyZSB1c2VyIHNwYWNlIGRhZW1vbi4KKworCSAgVG8gdXNlIHRoZSBhdXRvbW91bnRlciB5b3UgbmVlZCB0aGUgdXNlci1zcGFjZSB0b29scyBmcm9tIHRoZSBhdXRvZnMKKwkgIHBhY2thZ2U7IHlvdSBjYW4gZmluZCB0aGUgbG9jYXRpb24gaW4gPGZpbGU6RG9jdW1lbnRhdGlvbi9DaGFuZ2VzPi4KKwkgIFlvdSBhbHNvIHdhbnQgdG8gYW5zd2VyIFkgdG8gIk5GUyBmaWxlIHN5c3RlbSBzdXBwb3J0IiwgYmVsb3cuCisKKwkgIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgbmV3ZXIgdmVyc2lvbiBvZiB0aGUgYXV0b21vdW50ZXIgd2l0aCBtb3JlCisJICBmZWF0dXJlcywgc2F5IE4gaGVyZSBhbmQgc2F5IFkgdG8gIktlcm5lbCBhdXRvbW91bnRlciB2NCBzdXBwb3J0IiwKKwkgIGJlbG93LgorCisJICBUbyBjb21waWxlIHRoaXMgc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgYXV0b2ZzLgorCisJICBJZiB5b3UgYXJlIG5vdCBhIHBhcnQgb2YgYSBmYWlybHkgbGFyZ2UsIGRpc3RyaWJ1dGVkIG5ldHdvcmssIHlvdQorCSAgcHJvYmFibHkgZG8gbm90IG5lZWQgYW4gYXV0b21vdW50ZXIsIGFuZCBjYW4gc2F5IE4gaGVyZS4KKworY29uZmlnIEFVVE9GUzRfRlMKKwl0cmlzdGF0ZSAiS2VybmVsIGF1dG9tb3VudGVyIHZlcnNpb24gNCBzdXBwb3J0IChhbHNvIHN1cHBvcnRzIHYzKSIKKwloZWxwCisJICBUaGUgYXV0b21vdW50ZXIgaXMgYSB0b29sIHRvIGF1dG9tYXRpY2FsbHkgbW91bnQgcmVtb3RlIGZpbGUgc3lzdGVtcworCSAgb24gZGVtYW5kLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHBhcnRpYWxseSBrZXJuZWwtYmFzZWQgdG8gcmVkdWNlCisJICBvdmVyaGVhZCBpbiB0aGUgYWxyZWFkeS1tb3VudGVkIGNhc2U7IHRoaXMgaXMgdW5saWtlIHRoZSBCU0QKKwkgIGF1dG9tb3VudGVyIChhbWQpLCB3aGljaCBpcyBhIHB1cmUgdXNlciBzcGFjZSBkYWVtb24uCisKKwkgIFRvIHVzZSB0aGUgYXV0b21vdW50ZXIgeW91IG5lZWQgdGhlIHVzZXItc3BhY2UgdG9vbHMgZnJvbQorCSAgPGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9kYWVtb25zL2F1dG9mcy92NC8+OyB5b3UgYWxzbworCSAgd2FudCB0byBhbnN3ZXIgWSB0byAiTkZTIGZpbGUgc3lzdGVtIHN1cHBvcnQiLCBiZWxvdy4KKworCSAgVG8gY29tcGlsZSB0aGlzIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGF1dG9mczQuICBZb3Ugd2lsbCBuZWVkIHRvIGFkZCAiYWxpYXMgYXV0b2ZzIGF1dG9mczQiIHRvIHlvdXIKKwkgIG1vZHVsZXMgY29uZmlndXJhdGlvbiBmaWxlLgorCisJICBJZiB5b3UgYXJlIG5vdCBhIHBhcnQgb2YgYSBmYWlybHkgbGFyZ2UsIGRpc3RyaWJ1dGVkIG5ldHdvcmsgb3IKKwkgIGRvbid0IGhhdmUgYSBsYXB0b3Agd2hpY2ggbmVlZHMgdG8gZHluYW1pY2FsbHkgcmVjb25maWd1cmUgdG8gdGhlCisJICBsb2NhbCBuZXR3b3JrLCB5b3UgcHJvYmFibHkgZG8gbm90IG5lZWQgYW4gYXV0b21vdW50ZXIsIGFuZCBjYW4gc2F5CisJICBOIGhlcmUuCisKK21lbnUgIkNELVJPTS9EVkQgRmlsZXN5c3RlbXMiCisKK2NvbmZpZyBJU085NjYwX0ZTCisJdHJpc3RhdGUgIklTTyA5NjYwIENEUk9NIGZpbGUgc3lzdGVtIHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBpcyB0aGUgc3RhbmRhcmQgZmlsZSBzeXN0ZW0gdXNlZCBvbiBDRC1ST01zLiAgSXQgd2FzIHByZXZpb3VzbHkKKwkgIGtub3duIGFzICJIaWdoIFNpZXJyYSBGaWxlIFN5c3RlbSIgYW5kIGlzIGNhbGxlZCAiaHNmcyIgb24gb3RoZXIKKwkgIFVuaXggc3lzdGVtcy4gIFRoZSBzby1jYWxsZWQgUm9jay1SaWRnZSBleHRlbnNpb25zIHdoaWNoIGFsbG93IGZvcgorCSAgbG9uZyBVbml4IGZpbGVuYW1lcyBhbmQgc3ltYm9saWMgbGlua3MgYXJlIGFsc28gc3VwcG9ydGVkIGJ5IHRoaXMKKwkgIGRyaXZlci4gIElmIHlvdSBoYXZlIGEgQ0QtUk9NIGRyaXZlIGFuZCB3YW50IHRvIGRvIG1vcmUgd2l0aCBpdCB0aGFuCisJICBqdXN0IGxpc3RlbiB0byBhdWRpbyBDRHMgYW5kIHdhdGNoIGl0cyBMRURzLCBzYXkgWSAoYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaXNvZnMudHh0PiBhbmQgdGhlIENELVJPTS1IT1dUTywKKwkgIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4pLCB0aGVyZWJ5CisJICBlbmxhcmdpbmcgeW91ciBrZXJuZWwgYnkgYWJvdXQgMjcgS0I7IG90aGVyd2lzZSBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlzb2ZzLgorCitjb25maWcgSk9MSUVUCisJYm9vbCAiTWljcm9zb2Z0IEpvbGlldCBDRFJPTSBleHRlbnNpb25zIgorCWRlcGVuZHMgb24gSVNPOTY2MF9GUworCXNlbGVjdCBOTFMKKwloZWxwCisJICBKb2xpZXQgaXMgYSBNaWNyb3NvZnQgZXh0ZW5zaW9uIGZvciB0aGUgSVNPIDk2NjAgQ0QtUk9NIGZpbGUgc3lzdGVtCisJICB3aGljaCBhbGxvd3MgZm9yIGxvbmcgZmlsZW5hbWVzIGluIHVuaWNvZGUgZm9ybWF0ICh1bmljb2RlIGlzIHRoZQorCSAgbmV3IDE2IGJpdCBjaGFyYWN0ZXIgY29kZSwgc3VjY2Vzc29yIHRvIEFTQ0lJLCB3aGljaCBlbmNvZGVzIHRoZQorCSAgY2hhcmFjdGVycyBvZiBhbG1vc3QgYWxsIGxhbmd1YWdlcyBvZiB0aGUgd29ybGQ7IHNlZQorCSAgPGh0dHA6Ly93d3cudW5pY29kZS5vcmcvPiBmb3IgbW9yZSBpbmZvcm1hdGlvbikuICBTYXkgWSBoZXJlIGlmIHlvdQorCSAgd2FudCB0byBiZSBhYmxlIHRvIHJlYWQgSm9saWV0IENELVJPTXMgdW5kZXIgTGludXguCisKK2NvbmZpZyBaSVNPRlMKKwlib29sICJUcmFuc3BhcmVudCBkZWNvbXByZXNzaW9uIGV4dGVuc2lvbiIKKwlkZXBlbmRzIG9uIElTTzk2NjBfRlMKKwlzZWxlY3QgWkxJQl9JTkZMQVRFCisJaGVscAorCSAgVGhpcyBpcyBhIExpbnV4LXNwZWNpZmljIGV4dGVuc2lvbiB0byBSb2NrUmlkZ2Ugd2hpY2ggbGV0cyB5b3Ugc3RvcmUKKwkgIGRhdGEgaW4gY29tcHJlc3NlZCBmb3JtIG9uIGEgQ0QtUk9NIGFuZCBoYXZlIGl0IHRyYW5zcGFyZW50bHkKKwkgIGRlY29tcHJlc3NlZCB3aGVuIHRoZSBDRC1ST00gaXMgYWNjZXNzZWQuICBTZWUKKwkgIDxodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL2ZzL3ppc29mcy8+IGZvciB0aGUgdG9vbHMKKwkgIG5lY2Vzc2FyeSB0byBjcmVhdGUgc3VjaCBhIGZpbGVzeXN0ZW0uICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJlCisJICBhYmxlIHRvIHJlYWQgc3VjaCBjb21wcmVzc2VkIENELVJPTXMuCisKK2NvbmZpZyBaSVNPRlNfRlMKKyMgZm9yIGZzL25scy9Db25maWcuaW4KKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gWklTT0ZTCisJZGVmYXVsdCBJU085NjYwX0ZTCisKK2NvbmZpZyBVREZfRlMKKwl0cmlzdGF0ZSAiVURGIGZpbGUgc3lzdGVtIHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBpcyB0aGUgbmV3IGZpbGUgc3lzdGVtIHVzZWQgb24gc29tZSBDRC1ST01zIGFuZCBEVkRzLiBTYXkgWSBpZgorCSAgeW91IGludGVuZCB0byBtb3VudCBEVkQgZGlzY3Mgb3IgQ0RSVydzIHdyaXR0ZW4gaW4gcGFja2V0IG1vZGUsIG9yCisJICBpZiB3cml0dGVuIHRvIGJ5IG90aGVyIFVERiB1dGlsaXRpZXMsIHN1Y2ggYXMgRGlyZWN0Q0QuCisJICBQbGVhc2UgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3VkZi50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdWRmLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgVURGX05MUworCWJvb2wKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIChVREZfRlM9bSAmJiBOTFMpIHx8IChVREZfRlM9eSAmJiBOTFM9eSkKKworZW5kbWVudQorCittZW51ICJET1MvRkFUL05UIEZpbGVzeXN0ZW1zIgorCitjb25maWcgRkFUX0ZTCisJdHJpc3RhdGUKKwlzZWxlY3QgTkxTCisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gdXNlIG9uZSBvZiB0aGUgRkFULWJhc2VkIGZpbGUgc3lzdGVtcyAodGhlIE1TLURPUyBhbmQKKwkgIFZGQVQgKFdpbmRvd3MgOTUpIGZpbGUgc3lzdGVtcyksIHRoZW4geW91IG11c3Qgc2F5IFkgb3IgTSBoZXJlCisJICB0byBpbmNsdWRlIEZBVCBzdXBwb3J0LiBZb3Ugd2lsbCB0aGVuIGJlIGFibGUgdG8gbW91bnQgcGFydGl0aW9ucyBvcgorCSAgZGlza2V0dGVzIHdpdGggRkFULWJhc2VkIGZpbGUgc3lzdGVtcyBhbmQgdHJhbnNwYXJlbnRseSBhY2Nlc3MgdGhlCisJICBmaWxlcyBvbiB0aGVtLCBpLmUuIE1TRE9TIGZpbGVzIHdpbGwgbG9vayBhbmQgYmVoYXZlIGp1c3QgbGlrZSBhbGwKKwkgIG90aGVyIFVuaXggZmlsZXMuCisKKwkgIFRoaXMgRkFUIHN1cHBvcnQgaXMgbm90IGEgZmlsZSBzeXN0ZW0gaW4gaXRzZWxmLCBpdCBvbmx5IHByb3ZpZGVzCisJICB0aGUgZm91bmRhdGlvbiBmb3IgdGhlIG90aGVyIGZpbGUgc3lzdGVtcy4gWW91IHdpbGwgaGF2ZSB0byBzYXkgWSBvcgorCSAgTSB0byBhdCBsZWFzdCBvbmUgb2YgIk1TRE9TIGZzIHN1cHBvcnQiIG9yICJWRkFUIGZzIHN1cHBvcnQiIGluCisJICBvcmRlciB0byBtYWtlIHVzZSBvZiBpdC4KKworCSAgQW5vdGhlciB3YXkgdG8gcmVhZCBhbmQgd3JpdGUgTVNET1MgZmxvcHBpZXMgYW5kIGhhcmQgZHJpdmUKKwkgIHBhcnRpdGlvbnMgZnJvbSB3aXRoaW4gTGludXggKGJ1dCBub3QgdHJhbnNwYXJlbnRseSkgaXMgd2l0aCB0aGUKKwkgIG10b29scyAoIm1hbiBtdG9vbHMiKSBwcm9ncmFtIHN1aXRlLiBZb3UgZG9uJ3QgbmVlZCB0byBzYXkgWSBoZXJlIGluCisJICBvcmRlciB0byBkbyB0aGF0LgorCisJICBJZiB5b3UgbmVlZCB0byBtb3ZlIGxhcmdlIGZpbGVzIG9uIGZsb3BwaWVzIGJldHdlZW4gYSBET1MgYW5kIGEKKwkgIExpbnV4IGJveCwgc2F5IFkgaGVyZSwgbW91bnQgdGhlIGZsb3BweSB1bmRlciBMaW51eCB3aXRoIGFuIE1TRE9TCisJICBmaWxlIHN5c3RlbSBhbmQgdXNlIEdOVSB0YXIncyBNIG9wdGlvbi4gR05VIHRhciBpcyBhIHByb2dyYW0KKwkgIGF2YWlsYWJsZSBmb3IgVW5peCBhbmQgRE9TICgibWFuIHRhciIgb3IgImluZm8gdGFyIikuCisKKwkgIEl0IGlzIG5vdyBhbHNvIGJlY29taW5nIHBvc3NpYmxlIHRvIHJlYWQgYW5kIHdyaXRlIGNvbXByZXNzZWQgRkFUCisJICBmaWxlIHN5c3RlbXM7IHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mYXRfY3ZmLnR4dD4gZm9yCisJICBkZXRhaWxzLgorCisJICBUaGUgRkFUIHN1cHBvcnQgd2lsbCBlbmxhcmdlIHlvdXIga2VybmVsIGJ5IGFib3V0IDM3IEtCLiBJZiB1bnN1cmUsCisJICBzYXkgWS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCisJICBmYXQuICBOb3RlIHRoYXQgaWYgeW91IGNvbXBpbGUgdGhlIEZBVCBzdXBwb3J0IGFzIGEgbW9kdWxlLCB5b3UKKwkgIGNhbm5vdCBjb21waWxlIGFueSBvZiB0aGUgRkFULWJhc2VkIGZpbGUgc3lzdGVtcyBpbnRvIHRoZSBrZXJuZWwKKwkgIC0tIHRoZXkgd2lsbCBoYXZlIHRvIGJlIG1vZHVsZXMgYXMgd2VsbC4KKworY29uZmlnIE1TRE9TX0ZTCisJdHJpc3RhdGUgIk1TRE9TIGZzIHN1cHBvcnQiCisJc2VsZWN0IEZBVF9GUworCWhlbHAKKwkgIFRoaXMgYWxsb3dzIHlvdSB0byBtb3VudCBNU0RPUyBwYXJ0aXRpb25zIG9mIHlvdXIgaGFyZCBkcml2ZSAodW5sZXNzCisJICB0aGV5IGFyZSBjb21wcmVzc2VkOyB0byBhY2Nlc3MgY29tcHJlc3NlZCBNU0RPUyBwYXJ0aXRpb25zIHVuZGVyCisJICBMaW51eCwgeW91IGNhbiBlaXRoZXIgdXNlIHRoZSBET1MgZW11bGF0b3IgRE9TRU1VLCBkZXNjcmliZWQgaW4gdGhlCisJICBET1NFTVUtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LCBvciB0cnkgZG1zZG9zZnMgaW4KKwkgIDxmdHA6Ly9pYmlibGlvLm9yZy9wdWIvTGludXgvc3lzdGVtL2ZpbGVzeXN0ZW1zL2Rvc2ZzLz4uIElmIHlvdQorCSAgaW50ZW5kIHRvIHVzZSBkb3NlbXUgd2l0aCBhIG5vbi1jb21wcmVzc2VkIE1TRE9TIHBhcnRpdGlvbiwgc2F5IFkKKwkgIGhlcmUpIGFuZCBNU0RPUyBmbG9wcGllcy4gVGhpcyBtZWFucyB0aGF0IGZpbGUgYWNjZXNzIGJlY29tZXMKKwkgIHRyYW5zcGFyZW50LCBpLmUuIHRoZSBNU0RPUyBmaWxlcyBsb29rIGFuZCBiZWhhdmUganVzdCBsaWtlIGFsbAorCSAgb3RoZXIgVW5peCBmaWxlcy4KKworCSAgSWYgeW91IGhhdmUgV2luZG93cyA5NSBvciBXaW5kb3dzIE5UIGluc3RhbGxlZCBvbiB5b3VyIE1TRE9TCisJICBwYXJ0aXRpb25zLCB5b3Ugc2hvdWxkIHVzZSB0aGUgVkZBVCBmaWxlIHN5c3RlbSAoc2F5IFkgdG8gIlZGQVQgZnMKKwkgIHN1cHBvcnQiIGJlbG93KSwgb3IgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gc2VlIHRoZSBsb25nIGZpbGVuYW1lcworCSAgZ2VuZXJhdGVkIGJ5IFdpbmRvd3MgOTUgLyBXaW5kb3dzIE5ULgorCisJICBUaGlzIG9wdGlvbiB3aWxsIGVubGFyZ2UgeW91ciBrZXJuZWwgYnkgYWJvdXQgNyBLQi4gSWYgdW5zdXJlLAorCSAgYW5zd2VyIFkuIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgeW91IHNhaWQgWSB0byAiRE9TIEZBVCBmcyBzdXBwb3J0IgorCSAgYXMgd2VsbC4gVG8gY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBtc2Rvcy4KKworY29uZmlnIFZGQVRfRlMKKwl0cmlzdGF0ZSAiVkZBVCAoV2luZG93cy05NSkgZnMgc3VwcG9ydCIKKwlzZWxlY3QgRkFUX0ZTCisJaGVscAorCSAgVGhpcyBvcHRpb24gcHJvdmlkZXMgc3VwcG9ydCBmb3Igbm9ybWFsIFdpbmRvd3MgZmlsZSBzeXN0ZW1zIHdpdGgKKwkgIGxvbmcgZmlsZW5hbWVzLiAgVGhhdCBpbmNsdWRlcyBub24tY29tcHJlc3NlZCBGQVQtYmFzZWQgZmlsZSBzeXN0ZW1zCisJICB1c2VkIGJ5IFdpbmRvd3MgOTUsIFdpbmRvd3MgOTgsIFdpbmRvd3MgTlQgNC4wLCBhbmQgdGhlIFVuaXgKKwkgIHByb2dyYW1zIGZyb20gdGhlIG10b29scyBwYWNrYWdlLgorCisJICBUaGUgVkZBVCBzdXBwb3J0IGVubGFyZ2VzIHlvdXIga2VybmVsIGJ5IGFib3V0IDEwIEtCIGFuZCBpdCBvbmx5CisJICB3b3JrcyBpZiB5b3Ugc2FpZCBZIHRvIHRoZSAiRE9TIEZBVCBmcyBzdXBwb3J0IiBhYm92ZS4gIFBsZWFzZSByZWFkCisJICB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3ZmYXQudHh0PiBmb3IgZGV0YWlscy4gIElmCisJICB1bnN1cmUsIHNheSBZLgorCisJICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIHZmYXQuCisKK2NvbmZpZyBGQVRfREVGQVVMVF9DT0RFUEFHRQorCWludCAiRGVmYXVsdCBjb2RlcGFnZSBmb3IgRkFUIgorCWRlcGVuZHMgb24gTVNET1NfRlMgfHwgVkZBVF9GUworCWRlZmF1bHQgNDM3CisJaGVscAorCSAgVGhpcyBvcHRpb24gc2hvdWxkIGJlIHNldCB0byB0aGUgY29kZXBhZ2Ugb2YgeW91ciBGQVQgZmlsZXN5c3RlbXMuCisJICBJdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIHRoZSAiY29kZXBhZ2UiIG1vdW50IG9wdGlvbi4KKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3ZmYXQudHh0PiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworY29uZmlnIEZBVF9ERUZBVUxUX0lPQ0hBUlNFVAorCXN0cmluZyAiRGVmYXVsdCBpb2NoYXJzZXQgZm9yIEZBVCIKKwlkZXBlbmRzIG9uIFZGQVRfRlMKKwlkZWZhdWx0ICJpc284ODU5LTEiCisJaGVscAorCSAgU2V0IHRoaXMgdG8gdGhlIGRlZmF1bHQgaW5wdXQvb3V0cHV0IGNoYXJhY3RlciBzZXQgeW91J2QKKwkgIGxpa2UgRkFUIHRvIHVzZS4gSXQgc2hvdWxkIHByb2JhYmx5IG1hdGNoIHRoZSBjaGFyYWN0ZXIgc2V0CisJICB0aGF0IG1vc3Qgb2YgeW91ciBGQVQgZmlsZXN5c3RlbXMgdXNlLCBhbmQgY2FuIGJlIG92ZXJyaWRkZW4KKwkgIHdpdGggdGhlICJpb2NoYXJzZXQiIG1vdW50IG9wdGlvbiBmb3IgRkFUIGZpbGVzeXN0ZW1zLgorCSAgTm90ZSB0aGF0ICJ1dGY4IiBpcyBub3QgcmVjb21tZW5kZWQgZm9yIEZBVCBmaWxlc3lzdGVtcy4KKwkgIElmIHVuc3VyZSwgeW91IHNob3VsZG4ndCBzZXQgInV0ZjgiIGhlcmUuCisJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZmF0LnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK2NvbmZpZyBOVEZTX0ZTCisJdHJpc3RhdGUgIk5URlMgZmlsZSBzeXN0ZW0gc3VwcG9ydCIKKwlzZWxlY3QgTkxTCisJaGVscAorCSAgTlRGUyBpcyB0aGUgZmlsZSBzeXN0ZW0gb2YgTWljcm9zb2Z0IFdpbmRvd3MgTlQsIDIwMDAsIFhQIGFuZCAyMDAzLgorCisJICBTYXlpbmcgWSBvciBNIGhlcmUgZW5hYmxlcyByZWFkIHN1cHBvcnQuICBUaGVyZSBpcyBwYXJ0aWFsLCBidXQKKwkgIHNhZmUsIHdyaXRlIHN1cHBvcnQgYXZhaWxhYmxlLiAgRm9yIHdyaXRlIHN1cHBvcnQgeW91IG11c3QgYWxzbworCSAgc2F5IFkgdG8gIk5URlMgd3JpdGUgc3VwcG9ydCIgYmVsb3cuCisKKwkgIFRoZXJlIGFyZSBhbHNvIGEgbnVtYmVyIG9mIHVzZXItc3BhY2UgdG9vbHMgYXZhaWxhYmxlLCBjYWxsZWQKKwkgIG50ZnNwcm9ncy4gIFRoZXNlIGluY2x1ZGUgbnRmc3VuZGVsZXRlIGFuZCBudGZzcmVzaXplLCB0aGF0IHdvcmsKKwkgIHdpdGhvdXQgTlRGUyBzdXBwb3J0IGVuYWJsZWQgaW4gdGhlIGtlcm5lbC4KKworCSAgVGhpcyBpcyBhIHJld3JpdGUgZnJvbSBzY3JhdGNoIG9mIExpbnV4IE5URlMgc3VwcG9ydCBhbmQgcmVwbGFjZWQKKwkgIHRoZSBvbGQgTlRGUyBjb2RlIHN0YXJ0aW5nIHdpdGggTGludXggMi41LjExLiAgQSBiYWNrcG9ydCB0bworCSAgdGhlIExpbnV4IDIuNCBrZXJuZWwgc2VyaWVzIGlzIHNlcGFyYXRlbHkgYXZhaWxhYmxlIGFzIGEgcGF0Y2gKKwkgIGZyb20gdGhlIHByb2plY3Qgd2ViIHNpdGUuCisKKwkgIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL250ZnMudHh0PgorCSAgYW5kIDxodHRwOi8vbGludXgtbnRmcy5zb3VyY2Vmb3JnZS5uZXQvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG50ZnMuCisKKwkgIElmIHlvdSBhcmUgbm90IHVzaW5nIFdpbmRvd3MgTlQsIDIwMDAsIFhQIG9yIDIwMDMgaW4gYWRkaXRpb24gdG8KKwkgIExpbnV4IG9uIHlvdXIgY29tcHV0ZXIgaXQgaXMgc2FmZSB0byBzYXkgTi4KKworY29uZmlnIE5URlNfREVCVUcKKwlib29sICJOVEZTIGRlYnVnZ2luZyBzdXBwb3J0IgorCWRlcGVuZHMgb24gTlRGU19GUworCWhlbHAKKwkgIElmIHlvdSBhcmUgZXhwZXJpZW5jaW5nIGFueSBwcm9ibGVtcyB3aXRoIHRoZSBOVEZTIGZpbGUgc3lzdGVtLCBzYXkKKwkgIFkgaGVyZS4gIFRoaXMgd2lsbCByZXN1bHQgaW4gYWRkaXRpb25hbCBjb25zaXN0ZW5jeSBjaGVja3MgdG8gYmUKKwkgIHBlcmZvcm1lZCBieSB0aGUgZHJpdmVyIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgbWVzc2FnZXMgdG8KKwkgIGJlIHdyaXR0ZW4gdG8gdGhlIHN5c3RlbSBsb2cuICBOb3RlIHRoYXQgZGVidWdnaW5nIG1lc3NhZ2VzIGFyZQorCSAgZGlzYWJsZWQgYnkgZGVmYXVsdC4gIFRvIGVuYWJsZSB0aGVtLCBzdXBwbHkgdGhlIG9wdGlvbiBkZWJ1Z19tc2dzPTEKKwkgIGF0IHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIHdoZW4gYm9vdGluZyB0aGUga2VybmVsIG9yIGFzIGFuIG9wdGlvbgorCSAgdG8gaW5zbW9kIHdoZW4gbG9hZGluZyB0aGUgbnRmcyBtb2R1bGUuICBPbmNlIHRoZSBkcml2ZXIgaXMgYWN0aXZlLAorCSAgeW91IGNhbiBlbmFibGUgZGVidWdnaW5nIG1lc3NhZ2VzIGJ5IGRvaW5nIChhcyByb290KToKKwkgIGVjaG8gMSA+IC9wcm9jL3N5cy9mcy9udGZzLWRlYnVnCisJICBSZXBsYWNpbmcgdGhlICIxIiB3aXRoICIwIiB3b3VsZCBkaXNhYmxlIGRlYnVnIG1lc3NhZ2VzLgorCisJICBJZiB5b3UgbGVhdmUgZGVidWdnaW5nIG1lc3NhZ2VzIGRpc2FibGVkLCB0aGlzIHJlc3VsdHMgaW4gbGl0dGxlCisJICBvdmVyaGVhZCwgYnV0IGVuYWJsaW5nIGRlYnVnIG1lc3NhZ2VzIHJlc3VsdHMgaW4gdmVyeSBzaWduaWZpY2FudAorCSAgc2xvd2Rvd24gb2YgdGhlIHN5c3RlbS4KKworCSAgV2hlbiByZXBvcnRpbmcgYnVncywgcGxlYXNlIHRyeSB0byBoYXZlIGF2YWlsYWJsZSBhIGZ1bGwgZHVtcCBvZgorCSAgZGVidWdnaW5nIG1lc3NhZ2VzIHdoaWxlIHRoZSBtaXNiZWhhdmlvdXIgd2FzIG9jY3VycmluZy4KKworY29uZmlnIE5URlNfUlcKKwlib29sICJOVEZTIHdyaXRlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBOVEZTX0ZTCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHRoZSBwYXJ0aWFsLCBidXQgc2FmZSwgd3JpdGUgc3VwcG9ydCBpbiB0aGUgTlRGUyBkcml2ZXIuCisKKwkgIFRoZSBvbmx5IHN1cHBvcnRlZCBvcGVyYXRpb24gaXMgb3ZlcndyaXRpbmcgZXhpc3RpbmcgZmlsZXMsIHdpdGhvdXQKKwkgIGNoYW5naW5nIHRoZSBmaWxlIGxlbmd0aC4gIE5vIGZpbGUgb3IgZGlyZWN0b3J5IGNyZWF0aW9uLCBkZWxldGlvbiBvcgorCSAgcmVuYW1pbmcgaXMgcG9zc2libGUuICBOb3RlIG9ubHkgbm9uLXJlc2lkZW50IGZpbGVzIGNhbiBiZSB3cml0dGVuIHRvCisJICBzbyB5b3UgbWF5IGZpbmQgdGhhdCBzb21lIHZlcnkgc21hbGwgZmlsZXMgKDw1MDAgYnl0ZXMgb3Igc28pIGNhbm5vdAorCSAgYmUgd3JpdHRlbiB0by4KKworCSAgV2hpbGUgd2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0IGl0IHdpbGwgbm90IGRhbWFnZSBhbnkgZGF0YSwgd2UgaGF2ZQorCSAgc28gZmFyIG5vdCByZWNlaXZlZCBhIHNpbmdsZSByZXBvcnQgd2hlcmUgdGhlIGRyaXZlciB3b3VsZCBoYXZlCisJICBkYW1hZ2VkIHNvbWVvbmVzIGRhdGEgc28gd2UgYXNzdW1lIGl0IGlzIHBlcmZlY3RseSBzYWZlIHRvIHVzZS4KKworCSAgTm90ZTogIFdoaWxlIHdyaXRlIHN1cHBvcnQgaXMgc2FmZSBpbiB0aGlzIHZlcnNpb24gKGEgcmV3cml0ZSBmcm9tCisJICBzY3JhdGNoIG9mIHRoZSBOVEZTIHN1cHBvcnQpLCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGUgb2xkIE5URlMKKwkgIHdyaXRlIHN1cHBvcnQsIGluY2x1ZGVkIGluIExpbnV4IDIuNS4xMCBhbmQgYmVmb3JlIChzaW5jZSAxOTk3KSwKKwkgIGlzIG5vdCBzYWZlLgorCisJICBUaGlzIGlzIGN1cnJlbnRseSB1c2VmdWwgd2l0aCBUb3BvbG9naUxpbnV4LiAgVG9wb2xvZ2lMaW51eCBpcyBydW4KKwkgIG9uIHRvcCBvZiBhbnkgRE9TL01pY3Jvc29mdCBXaW5kb3dzIHN5c3RlbSB3aXRob3V0IHBhcnRpdGlvbmluZyB5b3VyCisJICBoYXJkIGRpc2suICBVbmxpa2Ugb3RoZXIgTGludXggZGlzdHJpYnV0aW9ucyBUb3BvbG9naUxpbnV4IGRvZXMgbm90CisJICBuZWVkIGl0cyBvd24gcGFydGl0aW9uLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlCisJICA8aHR0cDovL3RvcG9sb2dpLWxpbnV4LnNvdXJjZWZvcmdlLm5ldC8+CisKKwkgIEl0IGlzIHBlcmZlY3RseSBzYWZlIHRvIHNheSBOIGhlcmUuCisKK2VuZG1lbnUKKworbWVudSAiUHNldWRvIGZpbGVzeXN0ZW1zIgorCitjb25maWcgUFJPQ19GUworCWJvb2wgIi9wcm9jIGZpbGUgc3lzdGVtIHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBpcyBhIHZpcnR1YWwgZmlsZSBzeXN0ZW0gcHJvdmlkaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMKKwkgIG9mIHRoZSBzeXN0ZW0uICJWaXJ0dWFsIiBtZWFucyB0aGF0IGl0IGRvZXNuJ3QgdGFrZSB1cCBhbnkgc3BhY2Ugb24KKwkgIHlvdXIgaGFyZCBkaXNrOiB0aGUgZmlsZXMgYXJlIGNyZWF0ZWQgb24gdGhlIGZseSBieSB0aGUga2VybmVsIHdoZW4KKwkgIHlvdSB0cnkgdG8gYWNjZXNzIHRoZW0uIEFsc28sIHlvdSBjYW5ub3QgcmVhZCB0aGUgZmlsZXMgd2l0aCBvbGRlcgorCSAgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbSBsZXNzOiB5b3UgbmVlZCB0byB1c2UgbW9yZSBvciBjYXQuCisKKwkgIEl0J3MgdG90YWxseSBjb29sOyBmb3IgZXhhbXBsZSwgImNhdCAvcHJvYy9pbnRlcnJ1cHRzIiBnaXZlcworCSAgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCB0aGUgZGlmZmVyZW50IElSUXMgYXJlIHVzZWQgZm9yIGF0IHRoZSBtb21lbnQKKwkgICh0aGVyZSBpcyBhIHNtYWxsIG51bWJlciBvZiBJbnRlcnJ1cHQgUmVRdWVzdCBsaW5lcyBpbiB5b3VyIGNvbXB1dGVyCisJICB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBhdHRhY2hlZCBkZXZpY2VzIHRvIGdhaW4gdGhlIENQVSdzIGF0dGVudGlvbiAtLQorCSAgb2Z0ZW4gYSBzb3VyY2Ugb2YgdHJvdWJsZSBpZiB0d28gZGV2aWNlcyBhcmUgbWlzdGFrZW5seSBjb25maWd1cmVkCisJICB0byB1c2UgdGhlIHNhbWUgSVJRKS4gVGhlIHByb2dyYW0gcHJvY2luZm8gdG8gZGlzcGxheSBzb21lCisJICBpbmZvcm1hdGlvbiBhYm91dCB5b3VyIHN5c3RlbSBnYXRoZXJlZCBmcm9tIHRoZSAvcHJvYyBmaWxlIHN5c3RlbS4KKworCSAgQmVmb3JlIHlvdSBjYW4gdXNlIHRoZSAvcHJvYyBmaWxlIHN5c3RlbSwgaXQgaGFzIHRvIGJlIG1vdW50ZWQsCisJICBtZWFuaW5nIGl0IGhhcyB0byBiZSBnaXZlbiBhIGxvY2F0aW9uIGluIHRoZSBkaXJlY3RvcnkgaGllcmFyY2h5LgorCSAgVGhhdCBsb2NhdGlvbiBzaG91bGQgYmUgL3Byb2MuIEEgY29tbWFuZCBzdWNoIGFzICJtb3VudCAtdCBwcm9jIHByb2MKKwkgIC9wcm9jIiBvciB0aGUgZXF1aXZhbGVudCBsaW5lIGluIC9ldGMvZnN0YWIgZG9lcyB0aGUgam9iLgorCisJICBUaGUgL3Byb2MgZmlsZSBzeXN0ZW0gaXMgZXhwbGFpbmVkIGluIHRoZSBmaWxlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0PiBhbmQgb24gdGhlIHByb2MoNSkgbWFucGFnZQorCSAgKCJtYW4gNSBwcm9jIikuCisKKwkgIFRoaXMgb3B0aW9uIHdpbGwgZW5sYXJnZSB5b3VyIGtlcm5lbCBieSBhYm91dCA2NyBLQi4gU2V2ZXJhbAorCSAgcHJvZ3JhbXMgZGVwZW5kIG9uIHRoaXMsIHNvIGV2ZXJ5b25lIHNob3VsZCBzYXkgWSBoZXJlLgorCitjb25maWcgUFJPQ19LQ09SRQorCWJvb2wgIi9wcm9jL2tjb3JlIHN1cHBvcnQiIGlmICFBUk0KKwlkZXBlbmRzIG9uIFBST0NfRlMgJiYgTU1VCisKK2NvbmZpZyBTWVNGUworCWJvb2wgInN5c2ZzIGZpbGUgc3lzdGVtIHN1cHBvcnQiIGlmIEVNQkVEREVECisJZGVmYXVsdCB5CisJaGVscAorCVRoZSBzeXNmcyBmaWxlc3lzdGVtIGlzIGEgdmlydHVhbCBmaWxlc3lzdGVtIHRoYXQgdGhlIGtlcm5lbCB1c2VzIHRvCisJZXhwb3J0IGludGVybmFsIGtlcm5lbCBvYmplY3RzLCB0aGVpciBhdHRyaWJ1dGVzLCBhbmQgdGhlaXIKKwlyZWxhdGlvbnNoaXBzIHRvIG9uZSBhbm90aGVyLgorCisJVXNlcnMgY2FuIHVzZSBzeXNmcyB0byBhc2NlcnRhaW4gdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBydW5uaW5nCisJa2VybmVsLCBzdWNoIGFzIHRoZSBkZXZpY2VzIHRoZSBrZXJuZWwgaGFzIGRpc2NvdmVyZWQgb24gZWFjaCBidXMgYW5kCisJd2hpY2ggZHJpdmVyIGVhY2ggaXMgYm91bmQgdG8uIHN5c2ZzIGNhbiBhbHNvIGJlIHVzZWQgdG8gdHVuZSBkZXZpY2VzCisJYW5kIG90aGVyIGtlcm5lbCBzdWJzeXN0ZW1zLgorCisJU29tZSBzeXN0ZW0gYWdlbnRzIHJlbHkgb24gdGhlIGluZm9ybWF0aW9uIGluIHN5c2ZzIHRvIG9wZXJhdGUuCisJL3NiaW4vaG90cGx1ZyB1c2VzIGRldmljZSBhbmQgb2JqZWN0IGF0dHJpYnV0ZXMgaW4gc3lzZnMgdG8gYXNzaXN0IGluCisJZGVsZWdhdGluZyBwb2xpY3kgZGVjaXNpb25zLCBsaWtlIHBlcnNpc3RhbnRseSBuYW1pbmcgZGV2aWNlcy4KKworCXN5c2ZzIGlzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBibG9jayBzdWJzeXN0ZW0gdG8gbW91bnQgdGhlIHJvb3QKKwlwYXJ0aXRpb24uICBJZiBzeXNmcyBpcyBkaXNhYmxlZCB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBib290IGRldmljZSBvbgorCXRoZSBrZXJuZWwgYm9vdCBjb21tYW5kIGxpbmUgdmlhIGl0cyBtYWpvciBhbmQgbWlub3IgbnVtYmVycy4gIEZvcgorCWV4YW1wbGUsICJyb290PTAzOjAxIiBmb3IgL2Rldi9oZGExLgorCisJRGVzaWduZXJzIG9mIGVtYmVkZGVkIHN5c3RlbXMgbWF5IHdpc2ggdG8gc2F5IE4gaGVyZSB0byBjb25zZXJ2ZSBzcGFjZS4KKworY29uZmlnIERFVkZTX0ZTCisJYm9vbCAiL2RldiBmaWxlIHN5c3RlbSBzdXBwb3J0IChPQlNPTEVURSkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIGRldmZzLCBhIHZpcnR1YWwgZmlsZSBzeXN0ZW0gKGxpa2UgL3Byb2MpIHdoaWNoCisJICBwcm92aWRlcyB0aGUgZmlsZSBzeXN0ZW0gaW50ZXJmYWNlIHRvIGRldmljZSBkcml2ZXJzLCBub3JtYWxseSBmb3VuZAorCSAgaW4gL2Rldi4gRGV2ZnMgZG9lcyBub3QgZGVwZW5kIG9uIG1ham9yIGFuZCBtaW5vciBudW1iZXIKKwkgIGFsbG9jYXRpb25zLiBEZXZpY2UgZHJpdmVycyByZWdpc3RlciBlbnRyaWVzIGluIC9kZXYgd2hpY2ggdGhlbgorCSAgYXBwZWFyIGF1dG9tYXRpY2FsbHksIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGRvZXMKKwkgIG5vdCBoYXZlIHRvIGNyZWF0ZSBjaGFyYWN0ZXIgYW5kIGJsb2NrIHNwZWNpYWwgZGV2aWNlIGZpbGVzIGluIHRoZQorCSAgL2RldiBkaXJlY3RvcnkgdXNpbmcgdGhlIG1rbm9kIGNvbW1hbmQgKG9yIE1BS0VERVYgc2NyaXB0KSBhbnltb3JlLgorCisJICBUaGlzIGlzIHdvcmsgaW4gcHJvZ3Jlc3MuIElmIHlvdSB3YW50IHRvIHVzZSB0aGlzLCB5b3UgKm11c3QqIHJlYWQKKwkgIHRoZSBtYXRlcmlhbCBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2RldmZzLz4sIGVzcGVjaWFsbHkKKwkgIHRoZSBmaWxlIFJFQURNRSB0aGVyZS4KKworCSAgTm90ZSB0aGF0IGRldmZzIG5vIGxvbmdlciBtYW5hZ2VzIC9kZXYvcHRzISAgSWYgeW91IGFyZSB1c2luZyBVTklYOTgKKwkgIHB0eXMsIHlvdSB3aWxsIGFsc28gbmVlZCB0byBtb3VudCB0aGUgL2Rldi9wdHMgZmlsZXN5c3RlbSAoZGV2cHRzKS4KKworCSAgTm90ZSB0aGF0IGRldmZzIGhhcyBiZWVuIG9ic29sZXRlZCBieSB1ZGV2LAorCSAgPGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMva2VybmVsL2hvdHBsdWcvPi4KKwkgIEl0IGhhcyBiZWVuIHN0cmlwcGVkIGRvd24gdG8gYSBiYXJlIG1pbmltdW0gYW5kIGlzIG9ubHkgcHJvdmlkZWQgZm9yCisJICBsZWdhY3kgaW5zdGFsbGF0aW9ucyB0aGF0IHVzZSBpdHMgbmFtaW5nIHNjaGVtZSB3aGljaCBpcworCSAgdW5mb3J0dW5hdGVseSBkaWZmZXJlbnQgZnJvbSB0aGUgbmFtZXMgbm9ybWFsIExpbnV4IGluc3RhbGxhdGlvbnMKKwkgIHVzZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIERFVkZTX01PVU5UCisJYm9vbCAiQXV0b21hdGljYWxseSBtb3VudCBhdCBib290IgorCWRlcGVuZHMgb24gREVWRlNfRlMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhcHBlYXJzIGlmIHlvdSBoYXZlIENPTkZJR19ERVZGU19GUyBlbmFibGVkLiBTZXR0aW5nCisJICB0aGlzIHRvICdZJyB3aWxsIG1ha2UgdGhlIGtlcm5lbCBhdXRvbWF0aWNhbGx5IG1vdW50IGRldmZzIG9udG8gL2RldgorCSAgd2hlbiB0aGUgc3lzdGVtIGlzIGJvb3RlZCwgYmVmb3JlIHRoZSBpbml0IHRocmVhZCBpcyBzdGFydGVkLgorCSAgWW91IGNhbiBvdmVycmlkZSB0aGlzIHdpdGggdGhlICJkZXZmcz1ub21vdW50IiBib290IG9wdGlvbi4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIERFVkZTX0RFQlVHCisJYm9vbCAiRGVidWcgZGV2ZnMiCisJZGVwZW5kcyBvbiBERVZGU19GUworCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGVuIHRoZSAvZGV2IGZpbGUgc3lzdGVtIGNvZGUgd2lsbCBnZW5lcmF0ZQorCSAgZGVidWdnaW5nIG1lc3NhZ2VzLiBTZWUgdGhlIGZpbGUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZGV2ZnMvYm9vdC1vcHRpb25zPiBmb3IgbW9yZQorCSAgZGV0YWlscy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIERFVlBUU19GU19YQVRUUgorCWJvb2wgIi9kZXYvcHRzIEV4dGVuZGVkIEF0dHJpYnV0ZXMiCisJZGVwZW5kcyBvbiBVTklYOThfUFRZUworCWhlbHAKKwkgIEV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIG5hbWU6dmFsdWUgcGFpcnMgYXNzb2NpYXRlZCB3aXRoIGlub2RlcyBieQorCSAgdGhlIGtlcm5lbCBvciBieSB1c2VycyAoc2VlIHRoZSBhdHRyKDUpIG1hbnVhbCBwYWdlLCBvciB2aXNpdAorCSAgPGh0dHA6Ly9hY2wuYmVzdGJpdHMuYXQvPiBmb3IgZGV0YWlscykuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBERVZQVFNfRlNfU0VDVVJJVFkKKwlib29sICIvZGV2L3B0cyBTZWN1cml0eSBMYWJlbHMiCisJZGVwZW5kcyBvbiBERVZQVFNfRlNfWEFUVFIKKwloZWxwCisJICBTZWN1cml0eSBsYWJlbHMgc3VwcG9ydCBhbHRlcm5hdGl2ZSBhY2Nlc3MgY29udHJvbCBtb2RlbHMKKwkgIGltcGxlbWVudGVkIGJ5IHNlY3VyaXR5IG1vZHVsZXMgbGlrZSBTRUxpbnV4LiAgVGhpcyBvcHRpb24KKwkgIGVuYWJsZXMgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGhhbmRsZXIgZm9yIGZpbGUgc2VjdXJpdHkKKwkgIGxhYmVscyBpbiB0aGUgL2Rldi9wdHMgZmlsZXN5c3RlbS4KKworCSAgSWYgeW91IGFyZSBub3QgdXNpbmcgYSBzZWN1cml0eSBtb2R1bGUgdGhhdCByZXF1aXJlcyB1c2luZworCSAgZXh0ZW5kZWQgYXR0cmlidXRlcyBmb3IgZmlsZSBzZWN1cml0eSBsYWJlbHMsIHNheSBOLgorCitjb25maWcgVE1QRlMKKwlib29sICJWaXJ0dWFsIG1lbW9yeSBmaWxlIHN5c3RlbSBzdXBwb3J0IChmb3JtZXIgc2htIGZzKSIKKwloZWxwCisJICBUbXBmcyBpcyBhIGZpbGUgc3lzdGVtIHdoaWNoIGtlZXBzIGFsbCBmaWxlcyBpbiB2aXJ0dWFsIG1lbW9yeS4KKworCSAgRXZlcnl0aGluZyBpbiB0bXBmcyBpcyB0ZW1wb3JhcnkgaW4gdGhlIHNlbnNlIHRoYXQgbm8gZmlsZXMgd2lsbCBiZQorCSAgY3JlYXRlZCBvbiB5b3VyIGhhcmQgZHJpdmUuIFRoZSBmaWxlcyBsaXZlIGluIG1lbW9yeSBhbmQgc3dhcAorCSAgc3BhY2UuIElmIHlvdSB1bm1vdW50IGEgdG1wZnMgaW5zdGFuY2UsIGV2ZXJ5dGhpbmcgc3RvcmVkIHRoZXJlaW4gaXMKKwkgIGxvc3QuCisKKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3RtcGZzLnR4dD4gZm9yIGRldGFpbHMuCisKK2NvbmZpZyBUTVBGU19YQVRUUgorCWJvb2wgInRtcGZzIEV4dGVuZGVkIEF0dHJpYnV0ZXMiCisJZGVwZW5kcyBvbiBUTVBGUworCWhlbHAKKwkgIEV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIG5hbWU6dmFsdWUgcGFpcnMgYXNzb2NpYXRlZCB3aXRoIGlub2RlcyBieQorCSAgdGhlIGtlcm5lbCBvciBieSB1c2VycyAoc2VlIHRoZSBhdHRyKDUpIG1hbnVhbCBwYWdlLCBvciB2aXNpdAorCSAgPGh0dHA6Ly9hY2wuYmVzdGJpdHMuYXQvPiBmb3IgZGV0YWlscykuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBUTVBGU19TRUNVUklUWQorCWJvb2wgInRtcGZzIFNlY3VyaXR5IExhYmVscyIKKwlkZXBlbmRzIG9uIFRNUEZTX1hBVFRSCisJaGVscAorCSAgU2VjdXJpdHkgbGFiZWxzIHN1cHBvcnQgYWx0ZXJuYXRpdmUgYWNjZXNzIGNvbnRyb2wgbW9kZWxzCisJICBpbXBsZW1lbnRlZCBieSBzZWN1cml0eSBtb2R1bGVzIGxpa2UgU0VMaW51eC4gIFRoaXMgb3B0aW9uCisJICBlbmFibGVzIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBoYW5kbGVyIGZvciBmaWxlIHNlY3VyaXR5CisJICBsYWJlbHMgaW4gdGhlIHRtcGZzIGZpbGVzeXN0ZW0uCisJICBJZiB5b3UgYXJlIG5vdCB1c2luZyBhIHNlY3VyaXR5IG1vZHVsZSB0aGF0IHJlcXVpcmVzIHVzaW5nCisJICBleHRlbmRlZCBhdHRyaWJ1dGVzIGZvciBmaWxlIHNlY3VyaXR5IGxhYmVscywgc2F5IE4uCisKK2NvbmZpZyBIVUdFVExCRlMKKwlib29sICJIdWdlVExCIGZpbGUgc3lzdGVtIHN1cHBvcnQiCisJZGVwZW5kcyBYODYgfHwgSUE2NCB8fCBQUEM2NCB8fCBTUEFSQzY0IHx8IFNVUEVSSCB8fCBYODZfNjQgfHwgQlJPS0VOCisKK2NvbmZpZyBIVUdFVExCX1BBR0UKKwlkZWZfYm9vbCBIVUdFVExCRlMKKworY29uZmlnIFJBTUZTCisJYm9vbAorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIFJhbWZzIGlzIGEgZmlsZSBzeXN0ZW0gd2hpY2gga2VlcHMgYWxsIGZpbGVzIGluIFJBTS4gSXQgYWxsb3dzCisJICByZWFkIGFuZCB3cml0ZSBhY2Nlc3MuCisKKwkgIEl0IGlzIG1vcmUgb2YgYW4gcHJvZ3JhbW1pbmcgZXhhbXBsZSB0aGFuIGEgdXNlYWJsZSBmaWxlIHN5c3RlbS4gIElmCisJICB5b3UgbmVlZCBhIGZpbGUgc3lzdGVtIHdoaWNoIGxpdmVzIGluIFJBTSB3aXRoIGxpbWl0IGNoZWNraW5nIHVzZQorCSAgdG1wZnMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgcmFtZnMuCisKK2VuZG1lbnUKKworbWVudSAiTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcyIKKworY29uZmlnIEFERlNfRlMKKwl0cmlzdGF0ZSAiQURGUyBmaWxlIHN5c3RlbSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhlIEFjb3JuIERpc2MgRmlsaW5nIFN5c3RlbSBpcyB0aGUgc3RhbmRhcmQgZmlsZSBzeXN0ZW0gb2YgdGhlCisJICBSaXNjT1Mgb3BlcmF0aW5nIHN5c3RlbSB3aGljaCBydW5zIG9uIEFjb3JuJ3MgQVJNLWJhc2VkIFJpc2MgUEMKKwkgIHN5c3RlbXMgYW5kIHRoZSBBY29ybiBBcmNoaW1lZGVzIHJhbmdlIG9mIG1hY2hpbmVzLiBJZiB5b3Ugc2F5IFkKKwkgIGhlcmUsIExpbnV4IHdpbGwgYmUgYWJsZSB0byByZWFkIGZyb20gQURGUyBwYXJ0aXRpb25zIG9uIGhhcmQgZHJpdmVzCisJICBhbmQgZnJvbSBBREZTLWZvcm1hdHRlZCBmbG9wcHkgZGlzY3MuIElmIHlvdSBhbHNvIHdhbnQgdG8gYmUgYWJsZSB0bworCSAgd3JpdGUgdG8gdGhvc2UgZGV2aWNlcywgc2F5IFkgdG8gIkFERlMgd3JpdGUgc3VwcG9ydCIgYmVsb3cuCisKKwkgIFRoZSBBREZTIHBhcnRpdGlvbiBzaG91bGQgYmUgdGhlIGZpcnN0IHBhcnRpdGlvbiAoaS5lLiwKKwkgIC9kZXYvW2hzXWQ/MSkgb24gZWFjaCBvZiB5b3VyIGRyaXZlcy4gUGxlYXNlIHJlYWQgdGhlIGZpbGUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvYWRmcy50eHQ+IGZvciBmdXJ0aGVyIGRldGFpbHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBhZGZzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQURGU19GU19SVworCWJvb2wgIkFERlMgd3JpdGUgc3VwcG9ydCAoREFOR0VST1VTKSIKKwlkZXBlbmRzIG9uIEFERlNfRlMKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgYmUgYWJsZSB0byB3cml0ZSB0byBBREZTIHBhcnRpdGlvbnMgb24KKwkgIGhhcmQgZHJpdmVzIGFuZCBBREZTLWZvcm1hdHRlZCBmbG9wcHkgZGlza3MuIFRoaXMgaXMgZXhwZXJpbWVudGFsCisJICBjb2Rlcywgc28gaWYgeW91J3JlIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBBRkZTX0ZTCisJdHJpc3RhdGUgIkFtaWdhIEZGUyBmaWxlIHN5c3RlbSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhlIEZhc3QgRmlsZSBTeXN0ZW0gKEZGUykgaXMgdGhlIGNvbW1vbiBmaWxlIHN5c3RlbSB1c2VkIG9uIGhhcmQKKwkgIGRpc2tzIGJ5IEFtaWdhKHRtKSBzeXN0ZW1zIHNpbmNlIEFtaWdhT1MgVmVyc2lvbiAxLjMgKDM0LjIwKS4gIFNheSBZCisJICBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQgYW5kIHdyaXRlIGZpbGVzIGZyb20gYW5kIHRvIGFuIEFtaWdhCisJICBGRlMgcGFydGl0aW9uIG9uIHlvdXIgaGFyZCBkcml2ZS4gIEFtaWdhIGZsb3BwaWVzIGhvd2V2ZXIgY2Fubm90IGJlCisJICByZWFkIHdpdGggdGhpcyBkcml2ZXIgZHVlIHRvIGFuIGluY29tcGF0aWJpbGl0eSBvZiB0aGUgZmxvcHB5CisJICBjb250cm9sbGVyIHVzZWQgaW4gYW4gQW1pZ2EgYW5kIHRoZSBzdGFuZGFyZCBmbG9wcHkgY29udHJvbGxlciBpbgorCSAgUENzIGFuZCB3b3Jrc3RhdGlvbnMuIFJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9hZmZzLnR4dD4KKwkgIGFuZCA8ZmlsZTpmcy9hZmZzL0NoYW5nZXM+LgorCisJICBXaXRoIHRoaXMgZHJpdmVyIHlvdSBjYW4gYWxzbyBtb3VudCBkaXNrIGZpbGVzIHVzZWQgYnkgQmVybmQKKwkgIFNjaG1pZHQncyBVbipYIEFtaWdhIEVtdWxhdG9yCisJICAoPGh0dHA6Ly93d3cuZnJlaWJ1cmcubGludXguZGUvfnVhZS8+KS4KKwkgIElmIHlvdSB3YW50IHRvIGRvIHRoaXMsIHlvdSB3aWxsIGFsc28gbmVlZCB0byBzYXkgWSBvciBNIHRvICJMb29wCisJICBkZXZpY2Ugc3VwcG9ydCIsIGFib3ZlLgorCisJICBUbyBjb21waWxlIHRoaXMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWZmcy4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBIRlNfRlMKKwl0cmlzdGF0ZSAiQXBwbGUgTWFjaW50b3NoIGZpbGUgc3lzdGVtIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgYmUgYWJsZSB0byBtb3VudCBNYWNpbnRvc2gtZm9ybWF0dGVkCisJICBmbG9wcHkgZGlza3MgYW5kIGhhcmQgZHJpdmUgcGFydGl0aW9ucyB3aXRoIGZ1bGwgcmVhZC13cml0ZSBhY2Nlc3MuCisJICBQbGVhc2UgcmVhZCA8ZmlsZTpmcy9oZnMvSEZTLnR4dD4gdG8gbGVhcm4gYWJvdXQgdGhlIGF2YWlsYWJsZSBtb3VudAorCSAgb3B0aW9ucy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGhmcy4KKworY29uZmlnIEhGU1BMVVNfRlMKKwl0cmlzdGF0ZSAiQXBwbGUgRXh0ZW5kZWQgSEZTIGZpbGUgc3lzdGVtIHN1cHBvcnQiCisJc2VsZWN0IE5MUworCXNlbGVjdCBOTFNfVVRGOAorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIG1vdW50IGV4dGVuZGVkIGZvcm1hdAorCSAgTWFjaW50b3NoLWZvcm1hdHRlZCBoYXJkIGRyaXZlIHBhcnRpdGlvbnMgd2l0aCBmdWxsIHJlYWQtd3JpdGUgYWNjZXNzLgorCisJICBUaGlzIGZpbGUgc3lzdGVtIGlzIG9mdGVuIGNhbGxlZCBIRlMrIGFuZCB3YXMgaW50cm9kdWNlZCB3aXRoCisJICBNYWNPUyA4LiBJdCBpbmNsdWRlcyBhbGwgTWFjIHNwZWNpZmljIGZpbGVzeXN0ZW0gZGF0YSBzdWNoIGFzCisJICBkYXRhIGZvcmtzIGFuZCBjcmVhdG9yIGNvZGVzLCBidXQgaXQgYWxzbyBoYXMgc2V2ZXJhbCBVTklYCisJICBzdHlsZSBmZWF0dXJlcyBzdWNoIGFzIGZpbGUgb3duZXJzaGlwIGFuZCBwZXJtaXNzaW9ucy4KKworY29uZmlnIEJFRlNfRlMKKwl0cmlzdGF0ZSAiQmVPUyBmaWxlIHN5c3RlbSAoQmVGUykgc3VwcG9ydCAocmVhZCBvbmx5KSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBOTFMKKwloZWxwCisJICBUaGUgQmVPUyBGaWxlIFN5c3RlbSAoQmVGUykgaXMgdGhlIG5hdGl2ZSBmaWxlIHN5c3RlbSBvZiBCZSwgSW5jJ3MKKwkgIEJlT1MuIE5vdGFibGUgZmVhdHVyZXMgaW5jbHVkZSBzdXBwb3J0IGZvciBhcmJpdHJhcnkgYXR0cmlidXRlcworCSAgb24gZmlsZXMgYW5kIGRpcmVjdG9yaWVzLCBhbmQgZGF0YWJhc2UtbGlrZSBpbmRlY2VzIG9uIHNlbGVjdGVkCisJICBhdHRyaWJ1dGVzLiAoQWxzbyBub3RlIHRoYXQgdGhpcyBkcml2ZXIgZG9lc24ndCBtYWtlIHRob3NlIGZlYXR1cmVzCisJICBhdmFpbGFibGUgYXQgdGhpcyB0aW1lKS4gSXQgaXMgYSA2NCBiaXQgZmlsZXN5c3RlbSwgc28gaXQgc3VwcG9ydHMKKwkgIGV4dHJlbWx5IGxhcmdlIHZvbHVtZXMgYW5kIGZpbGVzLgorCisJICBJZiB5b3UgdXNlIHRoaXMgZmlsZXN5c3RlbSwgeW91IHNob3VsZCBhbHNvIHNheSBZIHRvIGF0IGxlYXN0IG9uZQorCSAgb2YgdGhlIE5MUyAobmF0aXZlIGxhbmd1YWdlIHN1cHBvcnQpIG9wdGlvbnMgYmVsb3cuCisKKwkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdGhpcyBpcyBhYm91dCwgc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgYmVmcy4KKworY29uZmlnIEJFRlNfREVCVUcKKwlib29sICJEZWJ1ZyBCZUZTIgorCWRlcGVuZHMgb24gQkVGU19GUworCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3UgY2FuIHVzZSB0aGUgJ2RlYnVnJyBtb3VudCBvcHRpb24gdG8gZW5hYmxlCisJICBkZWJ1Z2dpbmcgb3V0cHV0IGZyb20gdGhlIGRyaXZlci4gCisKK2NvbmZpZyBCRlNfRlMKKwl0cmlzdGF0ZSAiQkZTIGZpbGUgc3lzdGVtIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBCb290IEZpbGUgU3lzdGVtIChCRlMpIGlzIGEgZmlsZSBzeXN0ZW0gdXNlZCB1bmRlciBTQ08gVW5peFdhcmUgdG8KKwkgIGFsbG93IHRoZSBib290bG9hZGVyIGFjY2VzcyB0byB0aGUga2VybmVsIGltYWdlIGFuZCBvdGhlciBpbXBvcnRhbnQKKwkgIGZpbGVzIGR1cmluZyB0aGUgYm9vdCBwcm9jZXNzLiAgSXQgaXMgdXN1YWxseSBtb3VudGVkIHVuZGVyIC9zdGFuZAorCSAgYW5kIGNvcnJlc3BvbmRzIHRvIHRoZSBzbGljZSBtYXJrZWQgYXMgIlNUQU5EIiBpbiB0aGUgVW5peFdhcmUKKwkgIHBhcnRpdGlvbi4gIFlvdSBzaG91bGQgc2F5IFkgaWYgeW91IHdhbnQgdG8gcmVhZCBvciB3cml0ZSB0aGUgZmlsZXMKKwkgIG9uIHlvdXIgL3N0YW5kIHNsaWNlIGZyb20gd2l0aGluIExpbnV4LiAgWW91IHRoZW4gYWxzbyBuZWVkIHRvIHNheSBZCisJICB0byAiVW5peFdhcmUgc2xpY2VzIHN1cHBvcnQiLCBiZWxvdy4gIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEJGUworCSAgZmlsZSBzeXN0ZW0gaXMgY29udGFpbmVkIGluIHRoZSBmaWxlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Jmcy50eHQ+LgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRoaXMgaXMgYWJvdXQsIHNheSBOLgorCisJICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIGJmcy4gIE5vdGUgdGhhdCB0aGUgZmlsZSBzeXN0ZW0gb2YgeW91ciByb290IHBhcnRpdGlvbiAodGhlIG9uZQorCSAgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IC8pIGNhbm5vdCBiZSBjb21waWxlZCBhcyBhIG1vZHVsZS4KKworCisKK2NvbmZpZyBFRlNfRlMKKwl0cmlzdGF0ZSAiRUZTIGZpbGUgc3lzdGVtIHN1cHBvcnQgKHJlYWQgb25seSkgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBFRlMgaXMgYW4gb2xkZXIgZmlsZSBzeXN0ZW0gdXNlZCBmb3Igbm9uLUlTTzk2NjAgQ0QtUk9NcyBhbmQgaGFyZAorCSAgZGlzayBwYXJ0aXRpb25zIGJ5IFNHSSdzIElSSVggb3BlcmF0aW5nIHN5c3RlbSAoSVJJWCA2LjAgYW5kIG5ld2VyCisJICB1c2VzIHRoZSBYRlMgZmlsZSBzeXN0ZW0gZm9yIGhhcmQgZGlzayBwYXJ0aXRpb25zIGhvd2V2ZXIpLgorCisJICBUaGlzIGltcGxlbWVudGF0aW9uIG9ubHkgb2ZmZXJzIHJlYWQtb25seSBhY2Nlc3MuIElmIHlvdSBkb24ndCBrbm93CisJICB3aGF0IGFsbCB0aGlzIGlzIGFib3V0LCBpdCdzIHNhZmUgdG8gc2F5IE4uIEZvciBtb3JlIGluZm9ybWF0aW9uCisJICBhYm91dCBFRlMgc2VlIGl0cyBob21lIHBhZ2UgYXQgPGh0dHA6Ly9hZXNjaGkuY2guZXUub3JnL2Vmcy8+LgorCisJICBUbyBjb21waWxlIHRoZSBFRlMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZWZzLgorCitjb25maWcgSkZGU19GUworCXRyaXN0YXRlICJKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSAoSkZGUykgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE1URAorCWhlbHAKKwkgIEpGRlMgaXMgdGhlIEpvdXJuYWxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0gZGV2ZWxvcGVkIGJ5IEF4aXMKKwkgIENvbW11bmljYXRpb25zIGluIFN3ZWRlbiwgYWltZWQgYXQgcHJvdmlkaW5nIGEgY3Jhc2gvcG93ZXJkb3duLXNhZmUKKwkgIGZpbGUgc3lzdGVtIGZvciBkaXNrLWxlc3MgZW1iZWRkZWQgZGV2aWNlcy4gRnVydGhlciBpbmZvcm1hdGlvbiBpcworCSAgYXZhaWxhYmxlIGF0ICg8aHR0cDovL2RldmVsb3Blci5heGlzLmNvbS9zb2Z0d2FyZS9qZmZzLz4pLgorCitjb25maWcgSkZGU19GU19WRVJCT1NFCisJaW50ICJKRkZTIGRlYnVnZ2luZyB2ZXJib3NpdHkgKDAgPSBxdWlldCwgMyA9IG5vaXN5KSIKKwlkZXBlbmRzIG9uIEpGRlNfRlMKKwlkZWZhdWx0ICIwIgorCWhlbHAKKwkgIERldGVybWluZXMgdGhlIHZlcmJvc2l0eSBsZXZlbCBvZiB0aGUgSkZGUyBkZWJ1Z2dpbmcgbWVzc2FnZXMuCisKK2NvbmZpZyBKRkZTX1BST0NfRlMKKwlib29sICJKRkZTIHN0YXRzIGF2YWlsYWJsZSBpbiAvcHJvYyBmaWxlc3lzdGVtIgorCWRlcGVuZHMgb24gSkZGU19GUyAmJiBQUk9DX0ZTCisJaGVscAorCSAgRW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBjYXVzZSBzdGF0aXN0aWNzIGZyb20gbW91bnRlZCBKRkZTIGZpbGUgc3lzdGVtcworCSAgdG8gYmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHVzZXIgaW4gdGhlIC9wcm9jL2ZzL2pmZnMvIGRpcmVjdG9yeS4KKworY29uZmlnIEpGRlMyX0ZTCisJdHJpc3RhdGUgIkpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtIHYyIChKRkZTMikgc3VwcG9ydCIKKwlzZWxlY3QgQ1JDMzIKKwlkZXBlbmRzIG9uIE1URAorCWhlbHAKKwkgIEpGRlMyIGlzIHRoZSBzZWNvbmQgZ2VuZXJhdGlvbiBvZiB0aGUgSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0KKwkgIGZvciB1c2Ugb24gZGlza2xlc3MgZW1iZWRkZWQgZGV2aWNlcy4gSXQgcHJvdmlkZXMgaW1wcm92ZWQgd2VhcgorCSAgbGV2ZWxsaW5nLCBjb21wcmVzc2lvbiBhbmQgc3VwcG9ydCBmb3IgaGFyZCBsaW5rcy4gWW91IGNhbm5vdCB1c2UKKwkgIHRoaXMgb24gbm9ybWFsIGJsb2NrIGRldmljZXMsIG9ubHkgb24gJ01URCcgZGV2aWNlcy4KKworCSAgRnVydGhlciBpbmZvcm1hdGlvbiBvbiB0aGUgZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiBKRkZTMiBpcworCSAgYXZhaWxhYmxlIGF0IDxodHRwOi8vc291cmNlcy5yZWRoYXQuY29tL2pmZnMyLz4uCisKK2NvbmZpZyBKRkZTMl9GU19ERUJVRworCWludCAiSkZGUzIgZGVidWdnaW5nIHZlcmJvc2l0eSAoMCA9IHF1aWV0LCAyID0gbm9pc3kpIgorCWRlcGVuZHMgb24gSkZGUzJfRlMKKwlkZWZhdWx0ICIwIgorCWhlbHAKKwkgIFRoaXMgY29udHJvbHMgdGhlIGFtb3VudCBvZiBkZWJ1Z2dpbmcgbWVzc2FnZXMgcHJvZHVjZWQgYnkgdGhlIEpGRlMyCisJICBjb2RlLiBTZXQgaXQgdG8gemVybyBmb3IgdXNlIGluIHByb2R1Y3Rpb24gc3lzdGVtcy4gRm9yIGV2YWx1YXRpb24sCisJICB0ZXN0aW5nIGFuZCBkZWJ1Z2dpbmcsIGl0J3MgYWR2aXNhYmxlIHRvIHNldCBpdCB0byBvbmUuIFRoaXMgd2lsbAorCSAgZW5hYmxlIGEgZmV3IGFzc2VydGlvbnMgYW5kIHdpbGwgcHJpbnQgZGVidWdnaW5nIG1lc3NhZ2VzIGF0IHRoZQorCSAgS0VSTl9ERUJVRyBsb2dsZXZlbCwgd2hlcmUgdGhleSB3b24ndCBub3JtYWxseSBiZSB2aXNpYmxlLiBMZXZlbCAyCisJICBpcyB1bmxpa2VseSB0byBiZSB1c2VmdWwgLSBpdCBlbmFibGVzIGV4dHJhIGRlYnVnZ2luZyBpbiBjZXJ0YWluCisJICBhcmVhcyB3aGljaCBhdCBvbmUgcG9pbnQgbmVlZGVkIGRlYnVnZ2luZywgYnV0IHdoZW4gdGhlIGJ1Z3Mgd2VyZQorCSAgbG9jYXRlZCBhbmQgZml4ZWQsIHRoZSBkZXRhaWxlZCBtZXNzYWdlcyB3ZXJlIHJlbGVnYXRlZCB0byBsZXZlbCAyLgorCisJICBJZiByZXBvcnRpbmcgYnVncywgcGxlYXNlIHRyeSB0byBoYXZlIGF2YWlsYWJsZSBhIGZ1bGwgZHVtcCBvZiB0aGUKKwkgIG1lc3NhZ2VzIGF0IGRlYnVnIGxldmVsIDEgd2hpbGUgdGhlIG1pc2JlaGF2aW91ciB3YXMgb2NjdXJyaW5nLgorCitjb25maWcgSkZGUzJfRlNfTkFORAorCWJvb2wgIkpGRlMyIHN1cHBvcnQgZm9yIE5BTkQgZmxhc2giCisJZGVwZW5kcyBvbiBKRkZTMl9GUworCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgc3VwcG9ydCBmb3IgTkFORCBmbGFzaCBpbiBKRkZTMi4gTkFORCBpcyBhIG5ld2VyCisJICB0eXBlIG9mIGZsYXNoIGNoaXAgZGVzaWduIHRoYW4gdGhlIHRyYWRpdGlvbmFsIE5PUiBmbGFzaCwgd2l0aAorCSAgaGlnaGVyIGRlbnNpdHkgYnV0IGEgaGFuZGZ1bCBvZiBjaGFyYWN0ZXJpc3RpY3Mgd2hpY2ggbWFrZSBpdCBtb3JlCisJICBpbnRlcmVzdGluZyBmb3IgdGhlIGZpbGUgc3lzdGVtIHRvIHVzZS4KKworCSAgU2F5ICdOJyB1bmxlc3MgeW91IGhhdmUgTkFORCBmbGFzaC4KKworY29uZmlnIEpGRlMyX0ZTX05PUl9FQ0MKKyAgICAgICAgYm9vbCAiSkZGUzIgc3VwcG9ydCBmb3IgRUNDJ2QgTk9SIGZsYXNoIChFWFBFUklNRU5UQUwpIgorICAgICAgICBkZXBlbmRzIG9uIEpGRlMyX0ZTICYmIEVYUEVSSU1FTlRBTAorICAgICAgICBkZWZhdWx0IG4KKyAgICAgICAgaGVscAorICAgICAgICAgIFRoaXMgZW5hYmxlcyB0aGUgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIE5PUiBmbGFzaCB3aXRoIHRyYW5zcGFyZW50CisgICAgICAgICAgRUNDIGZvciBKRkZTMi4gVGhpcyB0eXBlIG9mIGZsYXNoIGNoaXAgaXMgbm90IGNvbW1vbiwgaG93ZXZlciBpdCBpcworICAgICAgICAgIGF2YWlsYWJsZSBmcm9tIFNUIE1pY3JvZWxlY3Ryb25pY3MuCisKK2NvbmZpZyBKRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TCisJYm9vbCAiQWR2YW5jZWQgY29tcHJlc3Npb24gb3B0aW9ucyBmb3IgSkZGUzIiCisJZGVwZW5kcyBvbiBKRkZTMl9GUworCWRlZmF1bHQgbgorCWhlbHAKKwkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gZXhwbGljaXRseSBjaG9vc2Ugd2hpY2gKKwkgIGNvbXByZXNzaW9uIG1vZHVsZXMsIGlmIGFueSwgYXJlIGVuYWJsZWQgaW4gSkZGUzIuIFJlbW92aW5nCisJICBjb21wcmVzc29ycyBhbmQgbWVhbiB5b3UgY2Fubm90IHJlYWQgZXhpc3RpbmcgZmlsZSBzeXN0ZW1zLAorCSAgYW5kIGVuYWJsaW5nIGV4cGVyaW1lbnRhbCBjb21wcmVzc29ycyBjYW4gbWVhbiB0aGF0IHlvdQorCSAgd3JpdGUgYSBmaWxlIHN5c3RlbSB3aGljaCBjYW5ub3QgYmUgcmVhZCBieSBhIHN0YW5kYXJkIGtlcm5lbC4KKworCSAgSWYgdW5zdXJlLCB5b3Ugc2hvdWxkIF9kZWZpbml0ZWx5XyBzYXkgJ04nLgorCitjb25maWcgSkZGUzJfWkxJQgorCWJvb2wgIkpGRlMyIFpMSUIgY29tcHJlc3Npb24gc3VwcG9ydCIgaWYgSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUworCXNlbGVjdCBaTElCX0lORkxBVEUKKwlzZWxlY3QgWkxJQl9ERUZMQVRFCisJZGVwZW5kcyBvbiBKRkZTMl9GUworCWRlZmF1bHQgeQorICAgICAgICBoZWxwCisgICAgICAgICAgWmxpYiBpcyBkZXNpZ25lZCB0byBiZSBhIGZyZWUsIGdlbmVyYWwtcHVycG9zZSwgbGVnYWxseSB1bmVuY3VtYmVyZWQsCisgICAgICAgICAgbG9zc2xlc3MgZGF0YS1jb21wcmVzc2lvbiBsaWJyYXJ5IGZvciB1c2Ugb24gdmlydHVhbGx5IGFueSBjb21wdXRlciAKKyAgICAgICAgICBoYXJkd2FyZSBhbmQgb3BlcmF0aW5nIHN5c3RlbS4gU2VlIDxodHRwOi8vd3d3Lmd6aXAub3JnL3psaWIvPiBmb3IKKyAgICAgICAgICBmdXJ0aGVyIGluZm9ybWF0aW9uLgorICAgICAgICAgIAorICAgICAgICAgIFNheSAnWScgaWYgdW5zdXJlLgorCitjb25maWcgSkZGUzJfUlRJTUUKKwlib29sICJKRkZTMiBSVElNRSBjb21wcmVzc2lvbiBzdXBwb3J0IiBpZiBKRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TCisJZGVwZW5kcyBvbiBKRkZTMl9GUworCWRlZmF1bHQgeQorICAgICAgICBoZWxwCisgICAgICAgICAgUnRpbWUgZG9lcyBtYW5hZ2UgdG8gcmVjb21wcmVzcyBhbHJlYWR5LWNvbXByZXNzZWQgZGF0YS4gU2F5ICdZJyBpZiB1bnN1cmUuCisKK2NvbmZpZyBKRkZTMl9SVUJJTgorCWJvb2wgIkpGRlMyIFJVQklOIGNvbXByZXNzaW9uIHN1cHBvcnQiIGlmIEpGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMKKwlkZXBlbmRzIG9uIEpGRlMyX0ZTCisJZGVmYXVsdCBuCisgICAgICAgIGhlbHAKKyAgICAgICAgICBSVUJJTk1JUFMgYW5kIERZTlJVQklOIGNvbXByZXNzb3JzLiBTYXkgJ04nIGlmIHVuc3VyZS4KKworY2hvaWNlCisgICAgICAgIHByb21wdCAiSkZGUzIgZGVmYXVsdCBjb21wcmVzc2lvbiBtb2RlIiBpZiBKRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TCisgICAgICAgIGRlZmF1bHQgSkZGUzJfQ01PREVfUFJJT1JJVFkKKyAgICAgICAgZGVwZW5kcyBvbiBKRkZTMl9GUworICAgICAgICBoZWxwCisgICAgICAgICAgWW91IGNhbiBzZXQgaGVyZSB0aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBtb2RlIG9mIEpGRlMyIGZyb20gCisgICAgICAgICAgdGhlIGF2YWlsYWJsZSBjb21wcmVzc2lvbiBtb2Rlcy4gRG9uJ3QgdG91Y2ggaWYgdW5zdXJlLgorCitjb25maWcgSkZGUzJfQ01PREVfTk9ORQorICAgICAgICBib29sICJubyBjb21wcmVzc2lvbiIKKyAgICAgICAgaGVscAorICAgICAgICAgIFVzZXMgbm8gY29tcHJlc3Npb24uCisKK2NvbmZpZyBKRkZTMl9DTU9ERV9QUklPUklUWQorICAgICAgICBib29sICJwcmlvcml0eSIKKyAgICAgICAgaGVscAorICAgICAgICAgIFRyaWVzIHRoZSBjb21wcmVzc29ycyBpbiBhIHByZWRlZmluaWVkIG9yZGVyIGFuZCBjaG9vc2VzIHRoZSBmaXJzdCAKKyAgICAgICAgICBzdWNjZXNzZnVsIG9uZS4KKworY29uZmlnIEpGRlMyX0NNT0RFX1NJWkUKKyAgICAgICAgYm9vbCAic2l6ZSAoRVhQRVJJTUVOVEFMKSIKKyAgICAgICAgaGVscAorICAgICAgICAgIFRyaWVzIGFsbCBjb21wcmVzc29ycyBhbmQgY2hvb3NlcyB0aGUgb25lIHdoaWNoIGhhcyB0aGUgc21hbGxlc3QgCisgICAgICAgICAgcmVzdWx0LgorCitlbmRjaG9pY2UKKworY29uZmlnIENSQU1GUworCXRyaXN0YXRlICJDb21wcmVzc2VkIFJPTSBmaWxlIHN5c3RlbSBzdXBwb3J0IChjcmFtZnMpIgorCXNlbGVjdCBaTElCX0lORkxBVEUKKwloZWxwCisJICBTYXlpbmcgWSBoZXJlIGluY2x1ZGVzIHN1cHBvcnQgZm9yIENyYW1GcyAoQ29tcHJlc3NlZCBST00gRmlsZQorCSAgU3lzdGVtKS4gIENyYW1GcyBpcyBkZXNpZ25lZCB0byBiZSBhIHNpbXBsZSwgc21hbGwsIGFuZCBjb21wcmVzc2VkCisJICBmaWxlIHN5c3RlbSBmb3IgUk9NIGJhc2VkIGVtYmVkZGVkIHN5c3RlbXMuICBDcmFtRnMgaXMgcmVhZC1vbmx5LAorCSAgbGltaXRlZCB0byAyNTZNQiBmaWxlIHN5c3RlbXMgKHdpdGggMTZNQiBmaWxlcyksIGFuZCBkb2Vzbid0IHN1cHBvcnQKKwkgIDE2LzMyIGJpdHMgdWlkL2dpZCwgaGFyZCBsaW5rcyBhbmQgdGltZXN0YW1wcy4KKworCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY3JhbWZzLnR4dD4gYW5kCisJICA8ZmlsZTpmcy9jcmFtZnMvUkVBRE1FPiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCisJICBjcmFtZnMuICBOb3RlIHRoYXQgdGhlIHJvb3QgZmlsZSBzeXN0ZW0gKHRoZSBvbmUgY29udGFpbmluZyB0aGUKKwkgIGRpcmVjdG9yeSAvKSBjYW5ub3QgYmUgY29tcGlsZWQgYXMgYSBtb2R1bGUuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBWWEZTX0ZTCisJdHJpc3RhdGUgIkZyZWVWeEZTIGZpbGUgc3lzdGVtIHN1cHBvcnQgKFZFUklUQVMgVnhGUyhUTSkgY29tcGF0aWJsZSkiCisJaGVscAorCSAgRnJlZVZ4RlMgaXMgYSBmaWxlIHN5c3RlbSBkcml2ZXIgdGhhdCBzdXBwb3J0IHRoZSBWRVJJVEFTIFZ4RlMoVE0pCisJICBmaWxlIHN5c3RlbSBmb3JtYXQuICBWRVJJVEFTIFZ4RlMoVE0pIGlzIHRoZSBzdGFuZGFyZCBmaWxlIHN5c3RlbQorCSAgb2YgU0NPIFVuaXhXYXJlIChhbmQgcG9zc2libHkgb3RoZXJzKSBhbmQgb3B0aW9uYWxseSBhdmFpbGFibGUKKwkgIGZvciBTdW5zb2Z0IFNvbGFyaXMsIEhQLVVYIGFuZCBtYW55IG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLgorCSAgQ3VycmVudGx5IG9ubHkgcmVhZG9ubHkgYWNjZXNzIGlzIHN1cHBvcnRlZC4KKworCSAgTk9URTogdGhlIGZpbGUgc3lzdGVtIHR5cGUgYXMgdXNlZCBieSBtb3VudCgxKSwgbW91bnQoMikgYW5kCisJICBmc3RhYig1KSBpcyAndnhmcycgYXMgaXQgZGVzY3JpYmVzIHRoZSBmaWxlIHN5c3RlbSBmb3JtYXQsIG5vdAorCSAgdGhlIGFjdHVhbCBkcml2ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgZnJlZXZ4ZnMuICBJZiB1bnN1cmUsIHNheSBOLgorCisKK2NvbmZpZyBIUEZTX0ZTCisJdHJpc3RhdGUgIk9TLzIgSFBGUyBmaWxlIHN5c3RlbSBzdXBwb3J0IgorCWhlbHAKKwkgIE9TLzIgaXMgSUJNJ3Mgb3BlcmF0aW5nIHN5c3RlbSBmb3IgUEMncywgdGhlIHNhbWUgYXMgV2FycCwgYW5kIEhQRlMKKwkgIGlzIHRoZSBmaWxlIHN5c3RlbSB1c2VkIGZvciBvcmdhbml6aW5nIGZpbGVzIG9uIE9TLzIgaGFyZCBkaXNrCisJICBwYXJ0aXRpb25zLiBTYXkgWSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQgZmlsZXMgZnJvbSBhbmQKKwkgIHdyaXRlIGZpbGVzIHRvIGFuIE9TLzIgSFBGUyBwYXJ0aXRpb24gb24geW91ciBoYXJkIGRyaXZlLiBPUy8yCisJICBmbG9wcGllcyBob3dldmVyIGFyZSBpbiByZWd1bGFyIE1TRE9TIGZvcm1hdCwgc28geW91IGRvbid0IG5lZWQgdGhpcworCSAgb3B0aW9uIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gcmVhZCB0aGVtLiBSZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2hwZnMudHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGhwZnMuICBJZiB1bnN1cmUsIHNheSBOLgorCisKKworY29uZmlnIFFOWDRGU19GUworCXRyaXN0YXRlICJRTlg0IGZpbGUgc3lzdGVtIHN1cHBvcnQgKHJlYWQgb25seSkiCisJaGVscAorCSAgVGhpcyBpcyB0aGUgZmlsZSBzeXN0ZW0gdXNlZCBieSB0aGUgcmVhbC10aW1lIG9wZXJhdGluZyBzeXN0ZW1zCisJICBRTlggNCBhbmQgUU5YIDYgKHRoZSBsYXR0ZXIgaXMgYWxzbyBjYWxsZWQgUU5YIFJUUCkuCisJICBGdXJ0aGVyIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBhdCA8aHR0cDovL3d3dy5xbnguY29tLz4uCisJICBTYXkgWSBpZiB5b3UgaW50ZW5kIHRvIG1vdW50IFFOWCBoYXJkIGRpc2tzIG9yIGZsb3BwaWVzLgorCSAgVW5sZXNzIHlvdSBzYXkgWSB0byAiUU5YNEZTIHJlYWQtd3JpdGUgc3VwcG9ydCIgYmVsb3csIHlvdSB3aWxsCisJICBvbmx5IGJlIGFibGUgdG8gcmVhZCB0aGVzZSBmaWxlIHN5c3RlbXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBmaWxlIHN5c3RlbSBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBxbng0LgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGV0aGVyIHlvdSBuZWVkIGl0LCB0aGVuIHlvdSBkb24ndCBuZWVkIGl0OgorCSAgYW5zd2VyIE4uCisKK2NvbmZpZyBRTlg0RlNfUlcKKwlib29sICJRTlg0RlMgd3JpdGUgc3VwcG9ydCAoREFOR0VST1VTKSIKKwlkZXBlbmRzIG9uIFFOWDRGU19GUyAmJiBFWFBFUklNRU5UQUwgJiYgQlJPS0VOCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gdGVzdCB3cml0ZSBzdXBwb3J0IGZvciBRTlg0IGZpbGUgc3lzdGVtcy4KKworCSAgSXQncyBjdXJyZW50bHkgYnJva2VuLCBzbyBmb3Igbm93OgorCSAgYW5zd2VyIE4uCisKKworCitjb25maWcgU1lTVl9GUworCXRyaXN0YXRlICJTeXN0ZW0gVi9YZW5peC9WNy9Db2hlcmVudCBmaWxlIHN5c3RlbSBzdXBwb3J0IgorCWhlbHAKKwkgIFNDTywgWGVuaXggYW5kIENvaGVyZW50IGFyZSBjb21tZXJjaWFsIFVuaXggc3lzdGVtcyBmb3IgSW50ZWwKKwkgIG1hY2hpbmVzLCBhbmQgVmVyc2lvbiA3IHdhcyB1c2VkIG9uIHRoZSBERUMgUERQLTExLiBTYXlpbmcgWQorCSAgaGVyZSB3b3VsZCBhbGxvdyB5b3UgdG8gcmVhZCBmcm9tIHRoZWlyIGZsb3BwaWVzIGFuZCBoYXJkIGRpc2sKKwkgIHBhcnRpdGlvbnMuCisKKwkgIElmIHlvdSBoYXZlIGZsb3BwaWVzIG9yIGhhcmQgZGlzayBwYXJ0aXRpb25zIGxpa2UgdGhhdCwgaXQgaXMgbGlrZWx5CisJICB0aGF0IHRoZXkgY29udGFpbiBiaW5hcmllcyBmcm9tIHRob3NlIG90aGVyIFVuaXggc3lzdGVtczsgaW4gb3JkZXIKKwkgIHRvIHJ1biB0aGVzZSBiaW5hcmllcywgeW91IHdpbGwgd2FudCB0byBpbnN0YWxsIGxpbnV4LWFiaSB3aGljaCBpcyBhCisJICBhIHNldCBvZiBrZXJuZWwgbW9kdWxlcyB0aGF0IGxldHMgeW91IHJ1biBTQ08sIFhlbml4LCBXeXNlLAorCSAgVW5peFdhcmUsIERlbGwgVW5peCBhbmQgU3lzdGVtIFYgcHJvZ3JhbXMgdW5kZXIgTGludXguICBJdCBpcworCSAgYXZhaWxhYmxlIHZpYSBGVFAgKHVzZXI6IGZ0cCkgZnJvbQorCSAgPGZ0cDovL2Z0cC5vcGVubGludXgub3JnL3B1Yi9wZW9wbGUvaGNoL2xpbnV4LWFiaS8+KS4KKwkgIE5PVEU6IHRoYXQgd2lsbCB3b3JrIG9ubHkgZm9yIGJpbmFyaWVzIGZyb20gSW50ZWwtYmFzZWQgc3lzdGVtczsKKwkgIFBEUCBvbmVzIHdpbGwgaGF2ZSB0byB3YWl0IHVudGlsIHNvbWVib2R5IHBvcnRzIExpbnV4IHRvIC0xMSA7LSkKKworCSAgSWYgeW91IG9ubHkgaW50ZW5kIHRvIG1vdW50IGZpbGVzIGZyb20gc29tZSBvdGhlciBVbml4IG92ZXIgdGhlCisJICBuZXR3b3JrIHVzaW5nIE5GUywgeW91IGRvbid0IG5lZWQgdGhlIFN5c3RlbSBWIGZpbGUgc3lzdGVtIHN1cHBvcnQKKwkgIChidXQgeW91IG5lZWQgTkZTIGZpbGUgc3lzdGVtIHN1cHBvcnQgb2J2aW91c2x5KS4KKworCSAgTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGlzIGdlbmVyYWxseSBub3QgbmVlZGVkIGZvciBmbG9wcGllcywgc2luY2UgYQorCSAgZ29vZCBwb3J0YWJsZSB3YXkgdG8gdHJhbnNwb3J0IGZpbGVzIGFuZCBkaXJlY3RvcmllcyBiZXR3ZWVuIHVuaXhlcworCSAgKGFuZCBldmVuIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zKSBpcyBnaXZlbiBieSB0aGUgdGFyIHByb2dyYW0gKCJtYW4KKwkgIHRhciIgb3IgcHJlZmVyYWJseSAiaW5mbyB0YXIiKS4gIE5vdGUgYWxzbyB0aGF0IHRoaXMgb3B0aW9uIGhhcworCSAgbm90aGluZyB3aGF0c29ldmVyIHRvIGRvIHdpdGggdGhlIG9wdGlvbiAiU3lzdGVtIFYgSVBDIi4gUmVhZCBhYm91dAorCSAgdGhlIFN5c3RlbSBWIGZpbGUgc3lzdGVtIGluCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3N5c3YtZnMudHh0Pi4KKwkgIFNheWluZyBZIGhlcmUgd2lsbCBlbmxhcmdlIHlvdXIga2VybmVsIGJ5IGFib3V0IDI3IEtCLgorCisJICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIHN5c3YuCisKKwkgIElmIHlvdSBoYXZlbid0IGhlYXJkIGFib3V0IGFsbCBvZiB0aGlzIGJlZm9yZSwgaXQncyBzYWZlIHRvIHNheSBOLgorCisKKworY29uZmlnIFVGU19GUworCXRyaXN0YXRlICJVRlMgZmlsZSBzeXN0ZW0gc3VwcG9ydCAocmVhZCBvbmx5KSIKKwloZWxwCisJICBCU0QgYW5kIGRlcml2YXRlIHZlcnNpb25zIG9mIFVuaXggKHN1Y2ggYXMgU3VuT1MsIEZyZWVCU0QsIE5ldEJTRCwKKwkgIE9wZW5CU0QgYW5kIE5lWFRzdGVwKSB1c2UgYSBmaWxlIHN5c3RlbSBjYWxsZWQgVUZTLiBTb21lIFN5c3RlbSBWCisJICBVbml4ZXMgY2FuIGNyZWF0ZSBhbmQgbW91bnQgaGFyZCBkaXNrIHBhcnRpdGlvbnMgYW5kIGRpc2tldHRlcyB1c2luZworCSAgdGhpcyBmaWxlIHN5c3RlbSBhcyB3ZWxsLiBTYXlpbmcgWSBoZXJlIHdpbGwgYWxsb3cgeW91IHRvIHJlYWQgZnJvbQorCSAgdGhlc2UgcGFydGl0aW9uczsgaWYgeW91IGFsc28gd2FudCB0byB3cml0ZSB0byB0aGVtLCBzYXkgWSB0byB0aGUKKwkgIGV4cGVyaW1lbnRhbCAiVUZTIGZpbGUgc3lzdGVtIHdyaXRlIHN1cHBvcnQiLCBiZWxvdy4gUGxlYXNlIHJlYWQgdGhlCisJICBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdWZzLnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgICAgICAgICBUaGUgcmVjZW50bHkgcmVsZWFzZWQgVUZTMiB2YXJpYW50ICh1c2VkIGluIEZyZWVCU0QgNS54KSBpcworICAgICAgICAgIFJFQUQtT05MWSBzdXBwb3J0ZWQuCisKKwkgIElmIHlvdSBvbmx5IGludGVuZCB0byBtb3VudCBmaWxlcyBmcm9tIHNvbWUgb3RoZXIgVW5peCBvdmVyIHRoZQorCSAgbmV0d29yayB1c2luZyBORlMsIHlvdSBkb24ndCBuZWVkIHRoZSBVRlMgZmlsZSBzeXN0ZW0gc3VwcG9ydCAoYnV0CisJICB5b3UgbmVlZCBORlMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBvYnZpb3VzbHkpLgorCisJICBOb3RlIHRoYXQgdGhpcyBvcHRpb24gaXMgZ2VuZXJhbGx5IG5vdCBuZWVkZWQgZm9yIGZsb3BwaWVzLCBzaW5jZSBhCisJICBnb29kIHBvcnRhYmxlIHdheSB0byB0cmFuc3BvcnQgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGJldHdlZW4gdW5peGVzCisJICAoYW5kIGV2ZW4gb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMpIGlzIGdpdmVuIGJ5IHRoZSB0YXIgcHJvZ3JhbSAoIm1hbgorCSAgdGFyIiBvciBwcmVmZXJhYmx5ICJpbmZvIHRhciIpLgorCisJICBXaGVuIGFjY2Vzc2luZyBOZVhUc3RlcCBmaWxlcywgeW91IG1heSBuZWVkIHRvIGNvbnZlcnQgdGhlbSBmcm9tIHRoZQorCSAgTmVYVCBjaGFyYWN0ZXIgc2V0IHRvIHRoZSBMYXRpbjEgY2hhcmFjdGVyIHNldDsgdXNlIHRoZSBwcm9ncmFtCisJICByZWNvZGUgKCJpbmZvIHJlY29kZSIpIGZvciB0aGlzIHB1cnBvc2UuCisKKwkgIFRvIGNvbXBpbGUgdGhlIFVGUyBmaWxlIHN5c3RlbSBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB1ZnMuCisKKwkgIElmIHlvdSBoYXZlbid0IGhlYXJkIGFib3V0IGFsbCBvZiB0aGlzIGJlZm9yZSwgaXQncyBzYWZlIHRvIHNheSBOLgorCitjb25maWcgVUZTX0ZTX1dSSVRFCisJYm9vbCAiVUZTIGZpbGUgc3lzdGVtIHdyaXRlIHN1cHBvcnQgKERBTkdFUk9VUykiCisJZGVwZW5kcyBvbiBVRlNfRlMgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB0cnkgd3JpdGluZyB0byBVRlMgcGFydGl0aW9ucy4gVGhpcyBpcworCSAgZXhwZXJpbWVudGFsLCBzbyB5b3Ugc2hvdWxkIGJhY2sgdXAgeW91ciBVRlMgcGFydGl0aW9ucyBiZWZvcmVoYW5kLgorCitlbmRtZW51CisKK21lbnUgIk5ldHdvcmsgRmlsZSBTeXN0ZW1zIgorCWRlcGVuZHMgb24gTkVUCisKK2NvbmZpZyBORlNfRlMKKwl0cmlzdGF0ZSAiTkZTIGZpbGUgc3lzdGVtIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJTkVUCisJc2VsZWN0IExPQ0tECisJc2VsZWN0IFNVTlJQQworCWhlbHAKKwkgIElmIHlvdSBhcmUgY29ubmVjdGVkIHRvIHNvbWUgb3RoZXIgKHVzdWFsbHkgbG9jYWwpIFVuaXggY29tcHV0ZXIKKwkgICh1c2luZyBTTElQLCBQTElQLCBQUFAgb3IgRXRoZXJuZXQpIGFuZCB3YW50IHRvIG1vdW50IGZpbGVzIHJlc2lkaW5nCisJICBvbiB0aGF0IGNvbXB1dGVyICh0aGUgTkZTIHNlcnZlcikgdXNpbmcgdGhlIE5ldHdvcmsgRmlsZSBTaGFyaW5nCisJICBwcm90b2NvbCwgc2F5IFkuICJNb3VudGluZyBmaWxlcyIgbWVhbnMgdGhhdCB0aGUgY2xpZW50IGNhbiBhY2Nlc3MKKwkgIHRoZSBmaWxlcyB3aXRoIHVzdWFsIFVOSVggY29tbWFuZHMgYXMgaWYgdGhleSB3ZXJlIHNpdHRpbmcgb24gdGhlCisJICBjbGllbnQncyBoYXJkIGRpc2suIEZvciB0aGlzIHRvIHdvcmssIHRoZSBzZXJ2ZXIgbXVzdCBydW4gdGhlCisJICBwcm9ncmFtcyBuZnNkIGFuZCBtb3VudGQgKGJ1dCBkb2VzIG5vdCBuZWVkIHRvIGhhdmUgTkZTIGZpbGUgc3lzdGVtCisJICBzdXBwb3J0IGVuYWJsZWQgaW4gaXRzIGtlcm5lbCkuIE5GUyBpcyBleHBsYWluZWQgaW4gdGhlIE5ldHdvcmsKKwkgIEFkbWluaXN0cmF0b3IncyBHdWlkZSwgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNndWlkZT4sIG9uIGl0cyBtYW4gcGFnZTogIm1hbgorCSAgbmZzIiwgYW5kIGluIHRoZSBORlMtSE9XVE8uCisKKwkgIEEgc3VwZXJpb3IgYnV0IGxlc3Mgd2lkZWx5IHVzZWQgYWx0ZXJuYXRpdmUgdG8gTkZTIGlzIHByb3ZpZGVkIGJ5CisJICB0aGUgQ29kYSBmaWxlIHN5c3RlbTsgc2VlICJDb2RhIGZpbGUgc3lzdGVtIHN1cHBvcnQiIGJlbG93LgorCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHNob3VsZCBoYXZlIHNhaWQgWSB0byBUQ1AvSVAgbmV0d29ya2luZyBhbHNvLgorCSAgVGhpcyBvcHRpb24gd291bGQgZW5sYXJnZSB5b3VyIGtlcm5lbCBieSBhYm91dCAyNyBLQi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG5mcy4KKworCSAgSWYgeW91IGFyZSBjb25maWd1cmluZyBhIGRpc2tsZXNzIG1hY2hpbmUgd2hpY2ggd2lsbCBtb3VudCBpdHMgcm9vdAorCSAgZmlsZSBzeXN0ZW0gb3ZlciBORlMgYXQgYm9vdCB0aW1lLCBzYXkgWSBoZXJlIGFuZCB0byAiS2VybmVsCisJICBsZXZlbCBJUCBhdXRvY29uZmlndXJhdGlvbiIgYWJvdmUgYW5kIHRvICJSb290IGZpbGUgc3lzdGVtIG9uIE5GUyIKKwkgIGJlbG93LiBZb3UgY2Fubm90IGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUgaW4gdGhpcyBjYXNlLgorCSAgVGhlcmUgYXJlIHR3byBwYWNrYWdlcyBkZXNpZ25lZCBmb3IgYm9vdGluZyBkaXNrbGVzcyBtYWNoaW5lcyBvdmVyCisJICB0aGUgbmV0OiBuZXRib290LCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly9mdHAxLnNvdXJjZWZvcmdlLm5ldC9uZXRib290Lz4sIGFuZCBFdGhlcmJvb3QsCisJICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL2Z0cDEuc291cmNlZm9yZ2UubmV0L2V0aGVyYm9vdC8+LgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IGFsbCB0aGlzIGlzIGFib3V0LCBzYXkgTi4KKworY29uZmlnIE5GU19WMworCWJvb2wgIlByb3ZpZGUgTkZTdjMgY2xpZW50IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORlNfRlMKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHlvdXIgTkZTIGNsaWVudCB0byBiZSBhYmxlIHRvIHNwZWFrIHZlcnNpb24KKwkgIDMgb2YgdGhlIE5GUyBwcm90b2NvbC4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIE5GU19WNAorCWJvb2wgIlByb3ZpZGUgTkZTdjQgY2xpZW50IHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORlNfRlMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IFJQQ1NFQ19HU1NfS1JCNQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgeW91ciBORlMgY2xpZW50IHRvIGJlIGFibGUgdG8gc3BlYWsgdGhlIG5ld2VyCisJICB2ZXJzaW9uIDQgb2YgdGhlIE5GUyBwcm90b2NvbC4KKworCSAgTm90ZTogUmVxdWlyZXMgYXV4aWxpYXJ5IHVzZXJzcGFjZSBkYWVtb25zIHdoaWNoIG1heSBiZSBmb3VuZCBvbgorCQlodHRwOi8vd3d3LmNpdGkudW1pY2guZWR1L3Byb2plY3RzL25mc3Y0LworCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkZTX0RJUkVDVElPCisJYm9vbCAiQWxsb3cgZGlyZWN0IEkvTyBvbiBORlMgZmlsZXMgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORlNfRlMgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBhcHBsaWNhdGlvbnMgdG8gcGVyZm9ybSB1bmNhY2hlZCBJL08gb24gZmlsZXMKKwkgIGluIE5GUyBmaWxlIHN5c3RlbXMgdXNpbmcgdGhlIE9fRElSRUNUIG9wZW4oKSBmbGFnLiAgV2hlbiBPX0RJUkVDVAorCSAgaXMgc2V0IGZvciBhIGZpbGUsIGl0cyBkYXRhIGlzIG5vdCBjYWNoZWQgaW4gdGhlIHN5c3RlbSdzIHBhZ2UKKwkgIGNhY2hlLiAgRGF0YSBpcyBtb3ZlZCB0byBhbmQgZnJvbSB1c2VyLWxldmVsIGFwcGxpY2F0aW9uIGJ1ZmZlcnMKKwkgIGRpcmVjdGx5LiAgVW5saWtlIGxvY2FsIGRpc2stYmFzZWQgZmlsZSBzeXN0ZW1zLCBORlMgT19ESVJFQ1QgaGFzCisJICBubyBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zLgorCisJICBVbmxlc3MgeW91ciBwcm9ncmFtIGlzIGRlc2lnbmVkIHRvIHVzZSBPX0RJUkVDVCBwcm9wZXJseSwgeW91IGFyZQorCSAgbXVjaCBiZXR0ZXIgb2ZmIGFsbG93aW5nIHRoZSBORlMgY2xpZW50IHRvIG1hbmFnZSBkYXRhIGNhY2hpbmcgZm9yCisJICB5b3UuICBNaXN1c2luZyBPX0RJUkVDVCBjYW4gY2F1c2UgcG9vciBzZXJ2ZXIgcGVyZm9ybWFuY2Ugb3IgbmV0d29yaworCSAgc3Rvcm1zLiAgVGhpcyBrZXJuZWwgYnVpbGQgb3B0aW9uIGRlZmF1bHRzIE9GRiB0byBhdm9pZCBleHBvc2luZworCSAgc3lzdGVtIGFkbWluaXN0cmF0b3JzIHVud2l0dGluZ2x5IHRvIGEgcG90ZW50aWFsbHkgaGF6YXJkb3VzCisJICBmZWF0dXJlLgorCisJICBGb3IgbW9yZSBkZXRhaWxzIG9uIE5GUyBPX0RJUkVDVCwgc2VlIGZzL25mcy9kaXJlY3QuYy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgTkZTIGNsaWVudCwgYW5kCisJICBjYXVzZXMgb3BlbigpIHRvIHJldHVybiBFSU5WQUwgaWYgYSBmaWxlIHJlc2lkaW5nIGluIE5GUyBpcworCSAgb3BlbmVkIHdpdGggdGhlIE9fRElSRUNUIGZsYWcuCisKK2NvbmZpZyBORlNECisJdHJpc3RhdGUgIk5GUyBzZXJ2ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElORVQKKwlzZWxlY3QgTE9DS0QKKwlzZWxlY3QgU1VOUlBDCisJc2VsZWN0IEVYUE9SVEZTCisJaGVscAorCSAgSWYgeW91IHdhbnQgeW91ciBMaW51eCBib3ggdG8gYWN0IGFzIGFuIE5GUyAqc2VydmVyKiwgc28gdGhhdCBvdGhlcgorCSAgY29tcHV0ZXJzIG9uIHlvdXIgbG9jYWwgbmV0d29yayB3aGljaCBzdXBwb3J0IE5GUyBjYW4gYWNjZXNzIGNlcnRhaW4KKwkgIGRpcmVjdG9yaWVzIG9uIHlvdXIgYm94IHRyYW5zcGFyZW50bHksIHlvdSBoYXZlIHR3byBvcHRpb25zOiB5b3UgY2FuCisJICB1c2UgdGhlIHNlbGYtY29udGFpbmVkIHVzZXIgc3BhY2UgcHJvZ3JhbSBuZnNkLCBpbiB3aGljaCBjYXNlIHlvdQorCSAgc2hvdWxkIHNheSBOIGhlcmUsIG9yIHlvdSBjYW4gc2F5IFkgYW5kIHVzZSB0aGUga2VybmVsIGJhc2VkIE5GUworCSAgc2VydmVyLiBUaGUgYWR2YW50YWdlIG9mIHRoZSBrZXJuZWwgYmFzZWQgc29sdXRpb24gaXMgdGhhdCBpdCBpcworCSAgZmFzdGVyLgorCisJICBJbiBlaXRoZXIgY2FzZSwgeW91IHdpbGwgbmVlZCBzdXBwb3J0IHNvZnR3YXJlOyB0aGUgcmVzcGVjdGl2ZQorCSAgbG9jYXRpb25zIGFyZSBnaXZlbiBpbiB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL0NoYW5nZXM+IGluIHRoZQorCSAgTkZTIHNlY3Rpb24uCisKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdmVyc2lvbiAyIG9mIHRoZSBORlMKKwkgIHByb3RvY29sIChORlN2MikuIElmIHlvdSBhbHNvIHdhbnQgTkZTdjMsIHNheSBZIHRvIHRoZSBuZXh0IHF1ZXN0aW9uCisJICBhcyB3ZWxsLgorCisJICBQbGVhc2UgcmVhZCB0aGUgTkZTLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGUgTkZTIHNlcnZlciBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBuZnNkLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5GU0RfVjMKKwlib29sICJQcm92aWRlIE5GU3YzIHNlcnZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkZTRAorCWhlbHAKKwkgIElmIHlvdSB3b3VsZCBsaWtlIHRvIGluY2x1ZGUgdGhlIE5GU3YzIHNlcnZlciBhcyB3ZWxsIGFzIHRoZSBORlN2MgorCSAgc2VydmVyLCBzYXkgWSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIE5GU0RfVjQKKwlib29sICJQcm92aWRlIE5GU3Y0IHNlcnZlciBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gTkZTRF9WMyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgTkZTRF9UQ1AKKwloZWxwCisJICBJZiB5b3Ugd291bGQgbGlrZSB0byBpbmNsdWRlIHRoZSBORlN2NCBzZXJ2ZXIgYXMgd2VsbCBhcyB0aGUgTkZTdjIKKwkgIGFuZCBORlN2MyBzZXJ2ZXJzLCBzYXkgWSBoZXJlLiAgVGhpcyBmZWF0dXJlIGlzIGV4cGVyaW1lbnRhbCwgYW5kCisJICBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBoZWxwaW5nIHRvIHRlc3QgTkZTdjQuCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkZTRF9UQ1AKKwlib29sICJQcm92aWRlIE5GUyBzZXJ2ZXIgb3ZlciBUQ1Agc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5GU0QKKwlkZWZhdWx0IHkKKwloZWxwCisJICBJZiB5b3Ugd2FudCB5b3VyIE5GUyBzZXJ2ZXIgdG8gc3VwcG9ydCBUQ1AgY29ubmVjdGlvbnMsIHNheSBZIGhlcmUuCisJICBUQ1AgY29ubmVjdGlvbnMgdXN1YWxseSBwZXJmb3JtIGJldHRlciB0aGFuIHRoZSBkZWZhdWx0IFVEUCB3aGVuCisJICB0aGUgbmV0d29yayBpcyBsb3NzeSBvciBjb25nZXN0ZWQuICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgUk9PVF9ORlMKKwlib29sICJSb290IGZpbGUgc3lzdGVtIG9uIE5GUyIKKwlkZXBlbmRzIG9uIE5GU19GUz15ICYmIElQX1BOUAorCWhlbHAKKwkgIElmIHlvdSB3YW50IHlvdXIgTGludXggYm94IHRvIG1vdW50IGl0cyB3aG9sZSByb290IGZpbGUgc3lzdGVtICh0aGUKKwkgIG9uZSBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkgLykgZnJvbSBzb21lIG90aGVyIGNvbXB1dGVyIG92ZXIgdGhlCisJICBuZXQgdmlhIE5GUyAocHJlc3VtYWJseSBiZWNhdXNlIHlvdXIgYm94IGRvZXNuJ3QgaGF2ZSBhIGhhcmQgZGlzayksCisJICBzYXkgWS4gUmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL25mc3Jvb3QudHh0PiBmb3IgZGV0YWlscy4gSXQgaXMKKwkgIGxpa2VseSB0aGF0IGluIHRoaXMgY2FzZSwgeW91IGFsc28gd2FudCB0byBzYXkgWSB0byAiS2VybmVsIGxldmVsIElQCisJICBhdXRvY29uZmlndXJhdGlvbiIgc28gdGhhdCB5b3VyIGJveCBjYW4gZGlzY292ZXIgaXRzIG5ldHdvcmsgYWRkcmVzcworCSAgYXQgYm9vdCB0aW1lLgorCisJICBNb3N0IHBlb3BsZSBzYXkgTiBoZXJlLgorCitjb25maWcgTE9DS0QKKwl0cmlzdGF0ZQorCitjb25maWcgTE9DS0RfVjQKKwlib29sCisJZGVwZW5kcyBvbiBORlNEX1YzIHx8IE5GU19WMworCWRlZmF1bHQgeQorCitjb25maWcgRVhQT1JURlMKKwl0cmlzdGF0ZQorCitjb25maWcgU1VOUlBDCisJdHJpc3RhdGUKKworY29uZmlnIFNVTlJQQ19HU1MKKwl0cmlzdGF0ZQorCitjb25maWcgUlBDU0VDX0dTU19LUkI1CisJdHJpc3RhdGUgIlNlY3VyZSBSUEM6IEtlcmJlcm9zIFYgbWVjaGFuaXNtIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gU1VOUlBDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBTVU5SUENfR1NTCisJc2VsZWN0IENSWVBUTworCXNlbGVjdCBDUllQVE9fTUQ1CisJc2VsZWN0IENSWVBUT19ERVMKKwloZWxwCisJICBQcm92aWRlcyBmb3Igc2VjdXJlIFJQQyBjYWxscyBieSBtZWFucyBvZiBhIGdzcy1hcGkKKwkgIG1lY2hhbmlzbSBiYXNlZCBvbiBLZXJiZXJvcyBWNS4gVGhpcyBpcyByZXF1aXJlZCBmb3IKKwkgIE5GU3Y0LgorCisJICBOb3RlOiBSZXF1aXJlcyBhbiBhdXhpbGlhcnkgdXNlcnNwYWNlIGRhZW1vbiB3aGljaCBtYXkgYmUgZm91bmQgb24KKwkJaHR0cDovL3d3dy5jaXRpLnVtaWNoLmVkdS9wcm9qZWN0cy9uZnN2NC8KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFJQQ1NFQ19HU1NfU1BLTTMKKwl0cmlzdGF0ZSAiU2VjdXJlIFJQQzogU1BLTTMgbWVjaGFuaXNtIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gU1VOUlBDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBTVU5SUENfR1NTCisJc2VsZWN0IENSWVBUTworCXNlbGVjdCBDUllQVE9fTUQ1CisJc2VsZWN0IENSWVBUT19ERVMKKwloZWxwCisJICBQcm92aWRlcyBmb3Igc2VjdXJlIFJQQyBjYWxscyBieSBtZWFucyBvZiBhIGdzcy1hcGkKKwkgIG1lY2hhbmlzbSBiYXNlZCBvbiB0aGUgU1BLTTMgcHVibGljLWtleSBtZWNoYW5pc20uCisKKwkgIE5vdGU6IFJlcXVpcmVzIGFuIGF1eGlsaWFyeSB1c2Vyc3BhY2UgZGFlbW9uIHdoaWNoIG1heSBiZSBmb3VuZCBvbgorCSAgCWh0dHA6Ly93d3cuY2l0aS51bWljaC5lZHUvcHJvamVjdHMvbmZzdjQvCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBTTUJfRlMKKwl0cmlzdGF0ZSAiU01CIGZpbGUgc3lzdGVtIHN1cHBvcnQgKHRvIG1vdW50IFdpbmRvd3Mgc2hhcmVzIGV0Yy4pIgorCWRlcGVuZHMgb24gSU5FVAorCXNlbGVjdCBOTFMKKwloZWxwCisJICBTTUIgKFNlcnZlciBNZXNzYWdlIEJsb2NrKSBpcyB0aGUgcHJvdG9jb2wgV2luZG93cyBmb3IgV29ya2dyb3VwcworCSAgKFdmVyksIFdpbmRvd3MgOTUvOTgsIFdpbmRvd3MgTlQgYW5kIE9TLzIgTGFuIE1hbmFnZXIgdXNlIHRvIHNoYXJlCisJICBmaWxlcyBhbmQgcHJpbnRlcnMgb3ZlciBsb2NhbCBuZXR3b3Jrcy4gIFNheWluZyBZIGhlcmUgYWxsb3dzIHlvdSB0bworCSAgbW91bnQgdGhlaXIgZmlsZSBzeXN0ZW1zIChvZnRlbiBjYWxsZWQgInNoYXJlcyIgaW4gdGhpcyBjb250ZXh0KSBhbmQKKwkgIGFjY2VzcyB0aGVtIGp1c3QgbGlrZSBhbnkgb3RoZXIgVW5peCBkaXJlY3RvcnkuICBDdXJyZW50bHksIHRoaXMKKwkgIHdvcmtzIG9ubHkgaWYgdGhlIFdpbmRvd3MgbWFjaGluZXMgdXNlIFRDUC9JUCBhcyB0aGUgdW5kZXJseWluZworCSAgdHJhbnNwb3J0IHByb3RvY29sLCBhbmQgbm90IE5ldEJFVUkuICBGb3IgZGV0YWlscywgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zbWJmcy50eHQ+IGFuZCB0aGUgU01CLUhPV1RPLAorCSAgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgTm90ZTogaWYgeW91IGp1c3Qgd2FudCB5b3VyIGJveCB0byBhY3QgYXMgYW4gU01CICpzZXJ2ZXIqIGFuZCBtYWtlCisJICBmaWxlcyBhbmQgcHJpbnRpbmcgc2VydmljZXMgYXZhaWxhYmxlIHRvIFdpbmRvd3MgY2xpZW50cyAod2hpY2ggbmVlZAorCSAgdG8gaGF2ZSBhIFRDUC9JUCBzdGFjayksIHlvdSBkb24ndCBuZWVkIHRvIHNheSBZIGhlcmU7IHlvdSBjYW4gdXNlCisJICB0aGUgcHJvZ3JhbSBTQU1CQSAoYXZhaWxhYmxlIGZyb20gPGZ0cDovL2Z0cC5zYW1iYS5vcmcvcHViL3NhbWJhLz4pCisJICBmb3IgdGhhdC4KKworCSAgR2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gY29ubmVjdCBMaW51eCwgV2luZG93cyBtYWNoaW5lcyBhbmQKKwkgIE1hY3MgaXMgb24gdGhlIFdXVyBhdCA8aHR0cDovL3d3dy5lYXRzLmNvbS9saW51eF9tYWNfd2luLmh0bWw+LgorCisJICBUbyBjb21waWxlIHRoZSBTTUIgc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgc21iZnMuICBNb3N0IHBlb3BsZSBzYXkgTiwgaG93ZXZlci4KKworY29uZmlnIFNNQl9OTFNfREVGQVVMVAorCWJvb2wgIlVzZSBhIGRlZmF1bHQgTkxTIgorCWRlcGVuZHMgb24gU01CX0ZTCisJaGVscAorCSAgRW5hYmxpbmcgdGhpcyB3aWxsIG1ha2Ugc21iZnMgdXNlIG5scyB0cmFuc2xhdGlvbnMgYnkgZGVmYXVsdC4gWW91CisJICBuZWVkIHRvIHNwZWNpZnkgdGhlIGxvY2FsIGNoYXJzZXQgKENPTkZJR19OTFNfREVGQVVMVCkgaW4gdGhlIG5scworCSAgc2V0dGluZ3MgYW5kIHlvdSBuZWVkIHRvIGdpdmUgdGhlIGRlZmF1bHQgbmxzIGZvciB0aGUgU01CIHNlcnZlciBhcworCSAgQ09ORklHX1NNQl9OTFNfUkVNT1RFLgorCisJICBUaGUgbmxzIHNldHRpbmdzIGNhbiBiZSBjaGFuZ2VkIGF0IG1vdW50IHRpbWUsIGlmIHlvdXIgc21ibW91bnQKKwkgIHN1cHBvcnRzIHRoYXQsIHVzaW5nIHRoZSBjb2RlcGFnZSBhbmQgaW9jaGFyc2V0IHBhcmFtZXRlcnMuCisKKwkgIHNtYm1vdW50IGZyb20gc2FtYmEgMi4yLjAgb3IgbGF0ZXIgc3VwcG9ydHMgdGhpcy4KKworY29uZmlnIFNNQl9OTFNfUkVNT1RFCisJc3RyaW5nICJEZWZhdWx0IFJlbW90ZSBOTFMgT3B0aW9uIgorCWRlcGVuZHMgb24gU01CX05MU19ERUZBVUxUCisJZGVmYXVsdCAiY3A0MzciCisJaGVscAorCSAgVGhpcyBzZXR0aW5nIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBhIGRlZmF1bHQgdmFsdWUgZm9yIHdoaWNoCisJICBjb2RlcGFnZSB0aGUgc2VydmVyIHVzZXMuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayBubworCSAgdHJhbnNsYXRpb25zIHdpbGwgYmUgZG9uZSBieSBkZWZhdWx0LiBUaGUgbG9jYWwgY29kZXBhZ2UvY2hhcnNldAorCSAgZGVmYXVsdCB0byBDT05GSUdfTkxTX0RFRkFVTFQuCisKKwkgIFRoZSBubHMgc2V0dGluZ3MgY2FuIGJlIGNoYW5nZWQgYXQgbW91bnQgdGltZSwgaWYgeW91ciBzbWJtb3VudAorCSAgc3VwcG9ydHMgdGhhdCwgdXNpbmcgdGhlIGNvZGVwYWdlIGFuZCBpb2NoYXJzZXQgcGFyYW1ldGVycy4KKworCSAgc21ibW91bnQgZnJvbSBzYW1iYSAyLjIuMCBvciBsYXRlciBzdXBwb3J0cyB0aGlzLgorCitjb25maWcgQ0lGUworCXRyaXN0YXRlICJDSUZTIHN1cHBvcnQgKGFkdmFuY2VkIG5ldHdvcmsgZmlsZXN5c3RlbSBmb3IgU2FtYmEsIFdpbmRvdyBhbmQgb3RoZXIgQ0lGUyBjb21wbGlhbnQgc2VydmVycykiCisJZGVwZW5kcyBvbiBJTkVUCisJc2VsZWN0IE5MUworCWhlbHAKKwkgIFRoaXMgaXMgdGhlIGNsaWVudCBWRlMgbW9kdWxlIGZvciB0aGUgQ29tbW9uIEludGVybmV0IEZpbGUgU3lzdGVtCisJICAoQ0lGUykgcHJvdG9jb2wgd2hpY2ggaXMgdGhlIHN1Y2Nlc3NvciB0byB0aGUgU2VydmVyIE1lc3NhZ2UgQmxvY2sgCisJICAoU01CKSBwcm90b2NvbCwgdGhlIG5hdGl2ZSBmaWxlIHNoYXJpbmcgbWVjaGFuaXNtIGZvciBtb3N0IGVhcmx5CisJICBQQyBvcGVyYXRpbmcgc3lzdGVtcy4gIFRoZSBDSUZTIHByb3RvY29sIGlzIGZ1bGx5IHN1cHBvcnRlZCBieSAKKwkgIGZpbGUgc2VydmVycyBzdWNoIGFzIFdpbmRvd3MgMjAwMCAoaW5jbHVkaW5nIFdpbmRvd3MgMjAwMywgTlQgNCAgCisJICBhbmQgV2luZG93cyBYUCkgYXMgd2VsbCBieSBTYW1iYSAod2hpY2ggcHJvdmlkZXMgZXhjZWxsZW50IENJRlMKKwkgIHNlcnZlciBzdXBwb3J0IGZvciBMaW51eCBhbmQgbWFueSBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcykuIEN1cnJlbnRseQorCSAgeW91IG11c3QgdXNlIHRoZSBzbWJmcyBjbGllbnQgZmlsZXN5c3RlbSB0byBhY2Nlc3Mgb2xkZXIgU01CIHNlcnZlcnMKKwkgIHN1Y2ggYXMgV2luZG93cyA5eCBhbmQgT1MvMi4KKworCSAgVGhlIGludGVudCBvZiB0aGUgY2lmcyBtb2R1bGUgaXMgdG8gcHJvdmlkZSBhbiBhZHZhbmNlZAorCSAgbmV0d29yayBmaWxlIHN5c3RlbSBjbGllbnQgZm9yIG1vdW50aW5nIHRvIENJRlMgY29tcGxpYW50IHNlcnZlcnMsIAorCSAgaW5jbHVkaW5nIHN1cHBvcnQgZm9yIGRmcyAoaGllcmFyY2hpY2FsIG5hbWUgc3BhY2UpLCBzZWN1cmUgcGVyLXVzZXIKKwkgIHNlc3Npb24gZXN0YWJsaXNobWVudCwgc2FmZSBkaXN0cmlidXRlZCBjYWNoaW5nIChvcGxvY2spLCBvcHRpb25hbAorCSAgcGFja2V0IHNpZ25pbmcsIFVuaWNvZGUgYW5kIG90aGVyIGludGVybmF0aW9uYWxpemF0aW9uIGltcHJvdmVtZW50cywgCisJICBhbmQgb3B0aW9uYWwgV2luYmluZCAobnNzd2l0Y2gpIGludGVncmF0aW9uLiBZb3UgZG8gbm90IG5lZWQgdG8gZW5hYmxlCisJICBjaWZzIGlmIHJ1bm5pbmcgb25seSBhIChTYW1iYSkgc2VydmVyLiBJdCBpcyBwb3NzaWJsZSB0byBlbmFibGUgYm90aAorCSAgc21iZnMgYW5kIGNpZnMgKGUuZy4gaWYgeW91IGFyZSB1c2luZyBDSUZTIGZvciBhY2Nlc3NpbmcgV2luZG93cyAyMDAzCisJICBhbmQgU2FtYmEgMyBzZXJ2ZXJzLCBhbmQgc21iZnMgZm9yIGFjY2Vzc2luZyBvbGQgc2VydmVycykuIElmIHlvdSBuZWVkIAorCSAgdG8gbW91bnQgdG8gU2FtYmEgb3IgV2luZG93cyAyMDAzIHNlcnZlcnMgZnJvbSB0aGlzIG1hY2hpbmUsIHNheSBZLgorCitjb25maWcgQ0lGU19TVEFUUworICAgICAgICBib29sICJDSUZTIHN0YXRpc3RpY3MiCisgICAgICAgIGRlcGVuZHMgb24gQ0lGUworICAgICAgICBoZWxwCisgICAgICAgICAgRW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBjYXVzZSBzdGF0aXN0aWNzIGZvciBlYWNoIHNlcnZlciBzaGFyZQorCSAgbW91bnRlZCBieSB0aGUgY2lmcyBjbGllbnQgdG8gYmUgZGlzcGxheWVkIGluIC9wcm9jL2ZzL2NpZnMvU3RhdHMKKworY29uZmlnIENJRlNfWEFUVFIKKyAgICAgICAgYm9vbCAiQ0lGUyBleHRlbmRlZCBhdHRyaWJ1dGVzIChFWFBFUklNRU5UQUwpIgorICAgICAgICBkZXBlbmRzIG9uIENJRlMKKyAgICAgICAgaGVscAorICAgICAgICAgIEV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIG5hbWU6dmFsdWUgcGFpcnMgYXNzb2NpYXRlZCB3aXRoIGlub2RlcyBieQorICAgICAgICAgIHRoZSBrZXJuZWwgb3IgYnkgdXNlcnMgKHNlZSB0aGUgYXR0cig1KSBtYW51YWwgcGFnZSwgb3IgdmlzaXQKKyAgICAgICAgICA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+IGZvciBkZXRhaWxzKS4gIENJRlMgbWFwcyB0aGUgbmFtZSBvZgorICAgICAgICAgIGV4dGVuZGVkIGF0dHJpYnV0ZXMgYmVnaW5uaW5nIHdpdGggdGhlIHVzZXIgbmFtZXNwYWNlIHByZWZpeAorICAgICAgICAgIHRvIFNNQi9DSUZTIEVBcy4gRUFzIGFyZSBzdG9yZWQgb24gV2luZG93cyBzZXJ2ZXJzIHdpdGhvdXQgdGhlCisgICAgICAgICAgdXNlciBuYW1lc3BhY2UgcHJlZml4LCBidXQgdGhlaXIgbmFtZXMgYXJlIHNlZW4gYnkgTGludXggY2lmcyBjbGllbnRzCisgICAgICAgICAgcHJlZmFjZWQgYnkgdGhlIHVzZXIgbmFtZXNwYWNlIHByZWZpeC4gVGhlIHN5c3RlbSBuYW1lc3BhY2UKKyAgICAgICAgICAodXNlZCBieSBzb21lIGZpbGVzeXN0ZW1zIHRvIHN0b3JlIEFDTHMpIGlzIG5vdCBzdXBwb3J0ZWQgYXQKKyAgICAgICAgICB0aGlzIHRpbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIENJRlNfUE9TSVgKKyAgICAgICAgYm9vbCAiQ0lGUyBQT1NJWCBFeHRlbnNpb25zIChFWFBFUklNRU5UQUwpIgorICAgICAgICBkZXBlbmRzIG9uIENJRlNfWEFUVFIKKyAgICAgICAgaGVscAorICAgICAgICAgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgY2F1c2UgdGhlIGNpZnMgY2xpZW50IHRvIGF0dGVtcHQgdG8KKwkgIG5lZ290aWF0ZSBhIG5ld2VyIGRpYWxlY3Qgd2l0aCBzZXJ2ZXJzLCBzdWNoIGFzIFNhbWJhIDMuMC41CisJICBvciBsYXRlciwgdGhhdCBvcHRpb25hbGx5IGNhbiBoYW5kbGUgbW9yZSBQT1NJWCBsaWtlIChyYXRoZXIKKwkgIHRoYW4gV2luZG93cyBsaWtlKSBmaWxlIGJlaGF2aW9yLiAgSXQgYWxzbyBlbmFibGVzCisJICBzdXBwb3J0IGZvciBQT1NJWCBBQ0xzIChnZXRmYWNsIGFuZCBzZXRmYWNsKSB0byBzZXJ2ZXJzCisJICAoc3VjaCBhcyBTYW1iYSAzLjEwIGFuZCBsYXRlcikgd2hpY2ggY2FuIG5lZ290aWF0ZQorCSAgQ0lGUyBQT1NJWCBBQ0wgc3VwcG9ydC4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBDSUZTX0VYUEVSSU1FTlRBTAorCSAgYm9vbCAiQ0lGUyBFeHBlcmltZW50YWwgRmVhdHVyZXMgKEVYUEVSSU1FTlRBTCkiCisJICBkZXBlbmRzIG9uIENJRlMKKwkgIGhlbHAKKwkgICAgRW5hYmxlcyBjaWZzIGZlYXR1cmVzIHVuZGVyIHRlc3RpbmcuIFRoZXNlIGZlYXR1cmVzCisJICAgIGFyZSBoaWdobHkgZXhwZXJpbWVudGFsLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5DUF9GUworCXRyaXN0YXRlICJOQ1AgZmlsZSBzeXN0ZW0gc3VwcG9ydCAodG8gbW91bnQgTmV0V2FyZSB2b2x1bWVzKSIKKwlkZXBlbmRzIG9uIElQWCE9biB8fCBJTkVUCisJaGVscAorCSAgTkNQIChOZXRXYXJlIENvcmUgUHJvdG9jb2wpIGlzIGEgcHJvdG9jb2wgdGhhdCBydW5zIG92ZXIgSVBYIGFuZCBpcworCSAgdXNlZCBieSBOb3ZlbGwgTmV0V2FyZSBjbGllbnRzIHRvIHRhbGsgdG8gZmlsZSBzZXJ2ZXJzLiAgSXQgaXMgdG8KKwkgIElQWCB3aGF0IE5GUyBpcyB0byBUQ1AvSVAsIGlmIHRoYXQgaGVscHMuICBTYXlpbmcgWSBoZXJlIGFsbG93cyB5b3UKKwkgIHRvIG1vdW50IE5ldFdhcmUgZmlsZSBzZXJ2ZXIgdm9sdW1lcyBhbmQgdG8gYWNjZXNzIHRoZW0ganVzdCBsaWtlCisJICBhbnkgb3RoZXIgVW5peCBkaXJlY3RvcnkuICBGb3IgZGV0YWlscywgcGxlYXNlIHJlYWQgdGhlIGZpbGUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbmNwZnMudHh0PiBpbiB0aGUga2VybmVsIHNvdXJjZSBhbmQKKwkgIHRoZSBJUFgtSE9XVE8gZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBZb3UgZG8gbm90IGhhdmUgdG8gc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB5b3VyIExpbnV4IGJveCB0byBhY3QgYXMgYQorCSAgZmlsZSAqc2VydmVyKiBmb3IgTm92ZWxsIE5ldFdhcmUgY2xpZW50cy4KKworCSAgR2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gY29ubmVjdCBMaW51eCwgV2luZG93cyBtYWNoaW5lcyBhbmQKKwkgIE1hY3MgaXMgb24gdGhlIFdXVyBhdCA8aHR0cDovL3d3dy5lYXRzLmNvbS9saW51eF9tYWNfd2luLmh0bWw+LgorCisJICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIG5jcGZzLiAgU2F5IE4gdW5sZXNzIHlvdSBhcmUgY29ubmVjdGVkIHRvIGEgTm92ZWxsIG5ldHdvcmsuCisKK3NvdXJjZSAiZnMvbmNwZnMvS2NvbmZpZyIKKworY29uZmlnIENPREFfRlMKKwl0cmlzdGF0ZSAiQ29kYSBmaWxlIHN5c3RlbSBzdXBwb3J0IChhZHZhbmNlZCBuZXR3b3JrIGZzKSIKKwlkZXBlbmRzIG9uIElORVQKKwloZWxwCisJICBDb2RhIGlzIGFuIGFkdmFuY2VkIG5ldHdvcmsgZmlsZSBzeXN0ZW0sIHNpbWlsYXIgdG8gTkZTIGluIHRoYXQgaXQKKwkgIGVuYWJsZXMgeW91IHRvIG1vdW50IGZpbGUgc3lzdGVtcyBvZiBhIHJlbW90ZSBzZXJ2ZXIgYW5kIGFjY2VzcyB0aGVtCisJICB3aXRoIHJlZ3VsYXIgVW5peCBjb21tYW5kcyBhcyBpZiB0aGV5IHdlcmUgc2l0dGluZyBvbiB5b3VyIGhhcmQKKwkgIGRpc2suICBDb2RhIGhhcyBzZXZlcmFsIGFkdmFudGFnZXMgb3ZlciBORlM6IHN1cHBvcnQgZm9yCisJICBkaXNjb25uZWN0ZWQgb3BlcmF0aW9uIChlLmcuIGZvciBsYXB0b3BzKSwgcmVhZC93cml0ZSBzZXJ2ZXIKKwkgIHJlcGxpY2F0aW9uLCBzZWN1cml0eSBtb2RlbCBmb3IgYXV0aGVudGljYXRpb24gYW5kIGVuY3J5cHRpb24sCisJICBwZXJzaXN0ZW50IGNsaWVudCBjYWNoZXMgYW5kIHdyaXRlIGJhY2sgY2FjaGluZy4KKworCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdXIgTGludXggYm94IHdpbGwgYmUgYWJsZSB0byBhY3QgYXMgYSBDb2RhCisJICAqY2xpZW50Ki4gIFlvdSB3aWxsIG5lZWQgdXNlciBsZXZlbCBjb2RlIGFzIHdlbGwsIGJvdGggZm9yIHRoZQorCSAgY2xpZW50IGFuZCBzZXJ2ZXIuICBTZXJ2ZXJzIGFyZSBjdXJyZW50bHkgdXNlciBsZXZlbCwgaS5lLiB0aGV5IG5lZWQKKwkgIG5vIGtlcm5lbCBzdXBwb3J0LiAgUGxlYXNlIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29kYS50eHQ+IGFuZCBjaGVjayBvdXQgdGhlIENvZGEKKwkgIGhvbWUgcGFnZSA8aHR0cDovL3d3dy5jb2RhLmNzLmNtdS5lZHUvPi4KKworCSAgVG8gY29tcGlsZSB0aGUgY29kYSBjbGllbnQgc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY29kYS4KKworY29uZmlnIENPREFfRlNfT0xEX0FQSQorCWJvb2wgIlVzZSA5Ni1iaXQgQ29kYSBmaWxlIGlkZW50aWZpZXJzIgorCWRlcGVuZHMgb24gQ09EQV9GUworCWhlbHAKKwkgIEEgbmV3IGtlcm5lbC11c2Vyc3BhY2UgQVBJIGhhZCB0byBiZSBpbnRyb2R1Y2VkIGZvciBDb2RhIHY2LjAKKwkgIHRvIHN1cHBvcnQgbGFyZ2VyIDEyOC1iaXQgZmlsZSBpZGVudGlmaWVycyBhcyBuZWVkZWQgYnkgdGhlCisJICBuZXcgcmVhbG1zIGltcGxlbWVudGF0aW9uLgorCisJICBIb3dldmVyIHRoaXMgbmV3IEFQSSBpcyBub3QgYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoIG9sZGVyCisJICBjbGllbnRzLiBJZiB5b3UgcmVhbGx5IG5lZWQgdG8gcnVuIHRoZSBvbGQgQ29kYSB1c2Vyc3BhY2UKKwkgIGNhY2hlIG1hbmFnZXIgdGhlbiBzYXkgWS4KKwkgIAorCSAgRm9yIG1vc3QgY2FzZXMgeW91IHByb2JhYmx5IHdhbnQgdG8gc2F5IE4uCisKK2NvbmZpZyBBRlNfRlMKKyMgZm9yIGZzL25scy9Db25maWcuaW4KKwl0cmlzdGF0ZSAiQW5kcmV3IEZpbGUgU3lzdGVtIHN1cHBvcnQgKEFGUykgKEV4cGVyaW1lbnRhbCkiCisJZGVwZW5kcyBvbiBJTkVUICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBSWFJQQworCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBnZXQgYW4gZXhwZXJpbWVudGFsIEFuZHJldyBGaWxlIFN5c3RlbQorCSAgZHJpdmVyLiBJdCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyB1bnNlY3VyZWQgcmVhZC1vbmx5IEFGUyBhY2Nlc3MuCisKKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Fmcy50eHQ+IGZvciBtb3JlIGludG9ybWF0aW9uLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUlhSUEMKKwl0cmlzdGF0ZQorCitlbmRtZW51CisKK21lbnUgIlBhcnRpdGlvbiBUeXBlcyIKKworc291cmNlICJmcy9wYXJ0aXRpb25zL0tjb25maWciCisKK2VuZG1lbnUKKworc291cmNlICJmcy9ubHMvS2NvbmZpZyIKKworZW5kbWVudQorCmRpZmYgLS1naXQgYS9mcy9LY29uZmlnLmJpbmZtdCBiL2ZzL0tjb25maWcuYmluZm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNGMxOWQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9LY29uZmlnLmJpbmZtdApAQCAtMCwwICsxLDEzNCBAQAorY29uZmlnIEJJTkZNVF9FTEYKKwlib29sICJLZXJuZWwgc3VwcG9ydCBmb3IgRUxGIGJpbmFyaWVzIgorCWRlcGVuZHMgb24gTU1VCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgRUxGIChFeGVjdXRhYmxlIGFuZCBMaW5rYWJsZSBGb3JtYXQpIGlzIGEgZm9ybWF0IGZvciBsaWJyYXJpZXMgYW5kCisJICBleGVjdXRhYmxlcyB1c2VkIGFjcm9zcyBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcyBhbmQgb3BlcmF0aW5nCisJICBzeXN0ZW1zLiBTYXlpbmcgWSBoZXJlIHdpbGwgZW5hYmxlIHlvdXIga2VybmVsIHRvIHJ1biBFTEYgYmluYXJpZXMKKwkgIGFuZCBlbmxhcmdlIGl0IGJ5IGFib3V0IDEzIEtCLiBFTEYgc3VwcG9ydCB1bmRlciBMaW51eCBoYXMgbm93IGFsbAorCSAgYnV0IHJlcGxhY2VkIHRoZSB0cmFkaXRpb25hbCBMaW51eCBhLm91dCBmb3JtYXRzIChRTUFHSUMgYW5kIFpNQUdJQykKKwkgIGJlY2F1c2UgaXQgaXMgcG9ydGFibGUgKHRoaXMgZG9lcyAqbm90KiBtZWFuIHRoYXQgeW91IHdpbGwgYmUgYWJsZQorCSAgdG8gcnVuIGV4ZWN1dGFibGVzIGZyb20gZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMgb3Igb3BlcmF0aW5nIHN5c3RlbXMKKwkgIGhvd2V2ZXIpIGFuZCBtYWtlcyBidWlsZGluZyBydW4tdGltZSBsaWJyYXJpZXMgdmVyeSBlYXN5LiBNYW55IG5ldworCSAgZXhlY3V0YWJsZXMgYXJlIGRpc3RyaWJ1dGVkIHNvbGVseSBpbiBFTEYgZm9ybWF0LiBZb3UgZGVmaW5pdGVseQorCSAgd2FudCB0byBzYXkgWSBoZXJlLgorCisJICBJbmZvcm1hdGlvbiBhYm91dCBFTEYgaXMgY29udGFpbmVkIGluIHRoZSBFTEYgSE9XVE8gYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIElmIHlvdSBmaW5kIHRoYXQgYWZ0ZXIgdXBncmFkaW5nIGZyb20gTGludXgga2VybmVsIDEuMiBhbmQgc2F5aW5nIFkKKwkgIGhlcmUsIHlvdSBzdGlsbCBjYW4ndCBydW4gYW55IEVMRiBiaW5hcmllcyAodGhleSBqdXN0IGNyYXNoKSwgdGhlbgorCSAgeW91J2xsIGhhdmUgdG8gaW5zdGFsbCB0aGUgbmV3ZXN0IEVMRiBydW50aW1lIGxpYnJhcmllcywgaW5jbHVkaW5nCisJICBsZC5zbyAoY2hlY2sgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9DaGFuZ2VzPiBmb3IgbG9jYXRpb24gYW5kCisJICBsYXRlc3QgdmVyc2lvbikuCisKK2NvbmZpZyBCSU5GTVRfRUxGX0ZEUElDCisJYm9vbCAiS2VybmVsIHN1cHBvcnQgZm9yIEZEUElDIEVMRiBiaW5hcmllcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZSVgorCWhlbHAKKwkgIEVMRiBGRFBJQyBiaW5hcmllcyBhcmUgYmFzZWQgb24gRUxGLCBidXQgYWxsb3cgdGhlIGluZGl2aWR1YWwgbG9hZAorCSAgc2VnbWVudHMgb2YgYSBiaW5hcnkgdG8gYmUgbG9jYXRlZCBpbiBtZW1vcnkgaW5kZXBlbmRlbnRseSBvZiBlYWNoCisJICBvdGhlci4gVGhpcyBtYWtlcyB0aGlzIGZvcm1hdCBpZGVhbCBmb3IgdXNlIGluIGVudmlyb25tZW50cyB3aGVyZSBubworCSAgTU1VIGlzIGF2YWlsYWJsZSBhcyBpdCBzdGlsbCBwZXJtaXRzIHRleHQgc2VnbWVudHMgdG8gYmUgc2hhcmVkLAorCSAgZXZlbiBpZiBkYXRhIHNlZ21lbnRzIGFyZSBub3QuCisKKwkgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gcnVuIEZEUElDIEVMRiBiaW5hcmllcyBvbiBNTVUgbGludXggYWxzby4KKworY29uZmlnIEJJTkZNVF9GTEFUCisJdHJpc3RhdGUgIktlcm5lbCBzdXBwb3J0IGZvciBmbGF0IGJpbmFyaWVzIgorCWRlcGVuZHMgb24gIU1NVSB8fCBTVVBFUkgKKwloZWxwCisJICBTdXBwb3J0IHVDbGludXggRkxBVCBmb3JtYXQgYmluYXJpZXMuCisKK2NvbmZpZyBCSU5GTVRfWkZMQVQKKwlib29sICJFbmFibGUgWkZMQVQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJJTkZNVF9GTEFUCisJc2VsZWN0IFpMSUJfSU5GTEFURQorCWhlbHAKKwkgIFN1cHBvcnQgRkxBVCBmb3JtYXQgY29tcHJlc3NlZCBiaW5hcmllcworCitjb25maWcgQklORk1UX1NIQVJFRF9GTEFUCisJYm9vbCAiRW5hYmxlIHNoYXJlZCBGTEFUIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCSU5GTVRfRkxBVAorCWhlbHAKKwkgIFN1cHBvcnQgRkxBVCBzaGFyZWQgbGlicmFyaWVzCisKK2NvbmZpZyBCSU5GTVRfQU9VVAorCXRyaXN0YXRlICJLZXJuZWwgc3VwcG9ydCBmb3IgYS5vdXQgYW5kIEVDT0ZGIGJpbmFyaWVzIgorCWRlcGVuZHMgb24gKFg4NiAmJiAhWDg2XzY0KSB8fCBBTFBIQSB8fCBBUk0gfHwgTTY4SyB8fCBTUEFSQzMyCisJLS0taGVscC0tLQorCSAgQS5vdXQgKEFzc2VtYmxlci5PVVRwdXQpIGlzIGEgc2V0IG9mIGZvcm1hdHMgZm9yIGxpYnJhcmllcyBhbmQKKwkgIGV4ZWN1dGFibGVzIHVzZWQgaW4gdGhlIGVhcmxpZXN0IHZlcnNpb25zIG9mIFVOSVguICBMaW51eCB1c2VkCisJICB0aGUgYS5vdXQgZm9ybWF0cyBRTUFHSUMgYW5kIFpNQUdJQyB1bnRpbCB0aGV5IHdlcmUgcmVwbGFjZWQKKwkgIHdpdGggdGhlIEVMRiBmb3JtYXQuCisKKwkgIFRoZSBjb252ZXJzaW9uIHRvIEVMRiBzdGFydGVkIGluIDE5OTUuICBUaGlzIG9wdGlvbiBpcyBwcmltYXJpbHkKKwkgIHByb3ZpZGVkIGZvciBoaXN0b3JpY2FsIGludGVyZXN0IGFuZCBmb3IgdGhlIGJlbmVmaXQgb2YgdGhvc2UKKwkgIHdobyBuZWVkIHRvIHJ1biBiaW5hcmllcyBmcm9tIHRoYXQgZXJhLgorCisJICBNb3N0IHBlb3BsZSBzaG91bGQgYW5zd2VyIE4gaGVyZS4gIElmIHlvdSB0aGluayB5b3UgbWF5IGhhdmUKKwkgIG9jY2FzaW9uYWwgdXNlIGZvciB0aGlzIGZvcm1hdCwgZW5hYmxlIG1vZHVsZSBzdXBwb3J0IGFib3ZlCisJICBhbmQgYW5zd2VyIE0gaGVyZSB0byBjb21waWxlIHRoaXMgc3VwcG9ydCBhcyBhIG1vZHVsZSBjYWxsZWQKKwkgIGJpbmZtdF9hb3V0LgorCisJICBJZiBhbnkgY3J1Y2lhbCBjb21wb25lbnRzIG9mIHlvdXIgc3lzdGVtIChzdWNoIGFzIC9zYmluL2luaXQKKwkgIG9yIC9saWIvbGQuc28pIGFyZSBzdGlsbCBpbiBhLm91dCBmb3JtYXQsIHlvdSB3aWxsIGhhdmUgdG8KKwkgIHNheSBZIGhlcmUuCisKK2NvbmZpZyBPU0Y0X0NPTVBBVAorCWJvb2wgIk9TRi8xIHY0IHJlYWR2L3dyaXRldiBjb21wYXRpYmlsaXR5IgorCWRlcGVuZHMgb24gQUxQSEEgJiYgQklORk1UX0FPVVQKKwloZWxwCisJICBTYXkgWSBpZiB5b3UgYXJlIHVzaW5nIE9TRi8xIGJpbmFyaWVzIChsaWtlIE5ldHNjYXBlIGFuZCBBY3JvYmF0KQorCSAgd2l0aCB2NCBzaGFyZWQgbGlicmFyaWVzIGZyZWVseSBhdmFpbGFibGUgZnJvbSBDb21wYXEuIElmIHlvdSdyZQorCSAgZ29pbmcgdG8gdXNlIHNoYXJlZCBsaWJyYXJpZXMgZnJvbSBUcnU2NCB2ZXJzaW9uIDUuMCBvciBsYXRlciwgc2F5IE4uCisKK2NvbmZpZyBCSU5GTVRfRU04NgorCXRyaXN0YXRlICJLZXJuZWwgc3VwcG9ydCBmb3IgTGludXgvSW50ZWwgRUxGIGJpbmFyaWVzIgorCWRlcGVuZHMgb24gQUxQSEEKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gZXhlY3V0ZSBMaW51eC9JbnRlbCBFTEYKKwkgIGJpbmFyaWVzIGp1c3QgbGlrZSBuYXRpdmUgQWxwaGEgYmluYXJpZXMgb24geW91ciBBbHBoYSBtYWNoaW5lLiBGb3IKKwkgIHRoaXMgdG8gd29yaywgeW91IG5lZWQgdG8gaGF2ZSB0aGUgZW11bGF0b3IgL3Vzci9iaW4vZW04NiBpbiBwbGFjZS4KKworCSAgWW91IGNhbiBnZXQgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBieSBzYXlpbmcgTiBoZXJlIGFuZCBzYXlpbmcgWSB0bworCSAgIktlcm5lbCBzdXBwb3J0IGZvciBNSVNDIGJpbmFyaWVzIi4KKworCSAgWW91IG1heSBhbnN3ZXIgTSB0byBjb21waWxlIHRoZSBlbXVsYXRpb24gc3VwcG9ydCBhcyBhIG1vZHVsZSBhbmQKKwkgIGxhdGVyIGxvYWQgdGhlIG1vZHVsZSB3aGVuIHlvdSB3YW50IHRvIHVzZSBhIExpbnV4L0ludGVsIGJpbmFyeS4gVGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYmluZm10X2VtODYuIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBCSU5GTVRfU09NCisJdHJpc3RhdGUgIktlcm5lbCBzdXBwb3J0IGZvciBTT00gYmluYXJpZXMiCisJZGVwZW5kcyBvbiBQQVJJU0MgJiYgSFBVWAorCWhlbHAKKwkgIFNPTSBpcyBhIGJpbmFyeSBleGVjdXRhYmxlIGZvcm1hdCBpbmhlcml0ZWQgZnJvbSBIUC9VWC4gIFNheQorCSAgWSBoZXJlIHRvIGJlIGFibGUgdG8gbG9hZCBhbmQgZXhlY3V0ZSBTT00gYmluYXJpZXMgZGlyZWN0bHkuCisKK2NvbmZpZyBCSU5GTVRfTUlTQworCXRyaXN0YXRlICJLZXJuZWwgc3VwcG9ydCBmb3IgTUlTQyBiaW5hcmllcyIKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBwbHVnIHdyYXBwZXItZHJpdmVuIGJpbmFyeQorCSAgZm9ybWF0cyBpbnRvIHRoZSBrZXJuZWwuIFlvdSB3aWxsIGxpa2UgdGhpcyBlc3BlY2lhbGx5IHdoZW4geW91IHVzZQorCSAgcHJvZ3JhbXMgdGhhdCBuZWVkIGFuIGludGVycHJldGVyIHRvIHJ1biBsaWtlIEphdmEsIFB5dGhvbiwgLk5FVCBvcgorCSAgRW1hY3MtTGlzcC4gSXQncyBhbHNvIHVzZWZ1bCBpZiB5b3Ugb2Z0ZW4gcnVuIERPUyBleGVjdXRhYmxlcyB1bmRlcgorCSAgdGhlIExpbnV4IERPUyBlbXVsYXRvciBET1NFTVUgKHJlYWQgdGhlIERPU0VNVS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4pLiBPbmNlIHlvdSBoYXZlCisJICByZWdpc3RlcmVkIHN1Y2ggYSBiaW5hcnkgY2xhc3Mgd2l0aCB0aGUga2VybmVsLCB5b3UgY2FuIHN0YXJ0IG9uZSBvZgorCSAgdGhvc2UgcHJvZ3JhbXMgc2ltcGx5IGJ5IHR5cGluZyBpbiBpdHMgbmFtZSBhdCBhIHNoZWxsIHByb21wdDsgTGludXgKKwkgIHdpbGwgYXV0b21hdGljYWxseSBmZWVkIGl0IHRvIHRoZSBjb3JyZWN0IGludGVycHJldGVyLgorCisJICBZb3UgY2FuIGRvIG90aGVyIG5pY2UgdGhpbmdzLCB0b28uIFJlYWQgdGhlIGZpbGUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vYmluZm10X21pc2MudHh0PiB0byBsZWFybiBob3cgdG8gdXNlIHRoaXMKKwkgIGZlYXR1cmUsIDxmaWxlOkRvY3VtZW50YXRpb24vamF2YS50eHQ+IGZvciBpbmZvcm1hdGlvbiBhYm91dCBob3cKKwkgIHRvIGluY2x1ZGUgSmF2YSBzdXBwb3J0LiBhbmQgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb25vLnR4dD4gZm9yCisgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGluY2x1ZGUgTW9uby1iYXNlZCAuTkVUIHN1cHBvcnQuCisKKyAgICAgICAgICBUbyB1c2UgYmluZm10X21pc2MsIHlvdSB3aWxsIG5lZWQgdG8gbW91bnQgaXQ6CisJCW1vdW50IGJpbmZtdF9taXNjIC10IGJpbmZtdF9taXNjIC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYworCisJICBZb3UgbWF5IHNheSBNIGhlcmUgZm9yIG1vZHVsZSBzdXBwb3J0IGFuZCBsYXRlciBsb2FkIHRoZSBtb2R1bGUgd2hlbgorCSAgeW91IGhhdmUgdXNlIGZvciBpdDsgdGhlIG1vZHVsZSBpcyBjYWxsZWQgYmluZm10X21pc2MuIElmIHlvdQorCSAgZG9uJ3Qga25vdyB3aGF0IHRvIGFuc3dlciBhdCB0aGlzIHBvaW50LCBzYXkgWS4KZGlmZiAtLWdpdCBhL2ZzL01ha2VmaWxlIGIvZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQzZjJiYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL01ha2VmaWxlCkBAIC0wLDAgKzEsOTcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBmaWxlc3lzdGVtcy4KKyMKKyMgMTQgU2VwIDIwMDAsIENocmlzdG9waCBIZWxsd2lnIDxoY2hAaW5mcmFkZWFkLm9yZz4KKyMgUmV3cml0dGVuIHRvIHVzZSBsaXN0cyBpbnN0ZWFkIG9mIGlmLXN0YXRlbWVudHMuCisjIAorCitvYmoteSA6PQlvcGVuLm8gcmVhZF93cml0ZS5vIGZpbGVfdGFibGUubyBidWZmZXIubyAgYmlvLm8gc3VwZXIubyBcCisJCWJsb2NrX2Rldi5vIGNoYXJfZGV2Lm8gc3RhdC5vIGV4ZWMubyBwaXBlLm8gbmFtZWkubyBmY250bC5vIFwKKwkJaW9jdGwubyByZWFkZGlyLm8gc2VsZWN0Lm8gZmlmby5vIGxvY2tzLm8gZGNhY2hlLm8gaW5vZGUubyBcCisJCWF0dHIubyBiYWRfaW5vZGUubyBmaWxlLm8gZmlsZXN5c3RlbXMubyBuYW1lc3BhY2UubyBhaW8ubyBcCisJCXNlcV9maWxlLm8geGF0dHIubyBsaWJmcy5vIGZzLXdyaXRlYmFjay5vIG1wYWdlLm8gZGlyZWN0LWlvLm8gXAorCitvYmotJChDT05GSUdfRVBPTEwpCQkrPSBldmVudHBvbGwubworb2JqLSQoQ09ORklHX0NPTVBBVCkJCSs9IGNvbXBhdC5vCisKK25mc2QtJChDT05GSUdfTkZTRCkJCTo9IG5mc2N0bC5vCitvYmoteQkJCQkrPSAkKG5mc2QteSkgJChuZnNkLW0pCisKK29iai0kKENPTkZJR19CSU5GTVRfQU9VVCkJKz0gYmluZm10X2FvdXQubworb2JqLSQoQ09ORklHX0JJTkZNVF9FTTg2KQkrPSBiaW5mbXRfZW04Ni5vCitvYmotJChDT05GSUdfQklORk1UX01JU0MpCSs9IGJpbmZtdF9taXNjLm8KKworIyBiaW5mbXRfc2NyaXB0IGlzIGFsd2F5cyB0aGVyZQorb2JqLXkJCQkJKz0gYmluZm10X3NjcmlwdC5vCisKK29iai0kKENPTkZJR19CSU5GTVRfRUxGKQkrPSBiaW5mbXRfZWxmLm8KK29iai0kKENPTkZJR19CSU5GTVRfRUxGX0ZEUElDKQkrPSBiaW5mbXRfZWxmX2ZkcGljLm8KK29iai0kKENPTkZJR19CSU5GTVRfU09NKQkrPSBiaW5mbXRfc29tLm8KK29iai0kKENPTkZJR19CSU5GTVRfRkxBVCkJKz0gYmluZm10X2ZsYXQubworCitvYmotJChDT05GSUdfRlNfTUJDQUNIRSkJKz0gbWJjYWNoZS5vCitvYmotJChDT05GSUdfRlNfUE9TSVhfQUNMKQkrPSBwb3NpeF9hY2wubyB4YXR0cl9hY2wubworCitvYmotJChDT05GSUdfUVVPVEEpCQkrPSBkcXVvdC5vCitvYmotJChDT05GSUdfUUZNVF9WMSkJCSs9IHF1b3RhX3YxLm8KK29iai0kKENPTkZJR19RRk1UX1YyKQkJKz0gcXVvdGFfdjIubworb2JqLSQoQ09ORklHX1FVT1RBQ1RMKQkJKz0gcXVvdGEubworCitvYmotJChDT05GSUdfRE5PVElGWSkJCSs9IGRub3RpZnkubworCitvYmotJChDT05GSUdfUFJPQ19GUykJCSs9IHByb2MvCitvYmoteQkJCQkrPSBwYXJ0aXRpb25zLworb2JqLSQoQ09ORklHX1NZU0ZTKQkJKz0gc3lzZnMvCitvYmoteQkJCQkrPSBkZXZwdHMvCisKK29iai0kKENPTkZJR19QUk9GSUxJTkcpCQkrPSBkY29va2llcy5vCisgCisjIERvIG5vdCBhZGQgYW55IGZpbGVzeXN0ZW1zIGJlZm9yZSB0aGlzIGxpbmUKK29iai0kKENPTkZJR19SRUlTRVJGU19GUykJKz0gcmVpc2VyZnMvCitvYmotJChDT05GSUdfRVhUM19GUykJCSs9IGV4dDMvICMgQmVmb3JlIGV4dDIgc28gcm9vdCBmcyBjYW4gYmUgZXh0Mworb2JqLSQoQ09ORklHX0pCRCkJCSs9IGpiZC8KK29iai0kKENPTkZJR19FWFQyX0ZTKQkJKz0gZXh0Mi8KK29iai0kKENPTkZJR19DUkFNRlMpCQkrPSBjcmFtZnMvCitvYmotJChDT05GSUdfUkFNRlMpCQkrPSByYW1mcy8KK29iai0kKENPTkZJR19IVUdFVExCRlMpCQkrPSBodWdldGxiZnMvCitvYmotJChDT05GSUdfQ09EQV9GUykJCSs9IGNvZGEvCitvYmotJChDT05GSUdfTUlOSVhfRlMpCQkrPSBtaW5peC8KK29iai0kKENPTkZJR19GQVRfRlMpCQkrPSBmYXQvCitvYmotJChDT05GSUdfTVNET1NfRlMpCQkrPSBtc2Rvcy8KK29iai0kKENPTkZJR19WRkFUX0ZTKQkJKz0gdmZhdC8KK29iai0kKENPTkZJR19CRlNfRlMpCQkrPSBiZnMvCitvYmotJChDT05GSUdfSVNPOTY2MF9GUykJKz0gaXNvZnMvCitvYmotJChDT05GSUdfREVWRlNfRlMpCQkrPSBkZXZmcy8KK29iai0kKENPTkZJR19IRlNQTFVTX0ZTKQkrPSBoZnNwbHVzLyAjIEJlZm9yZSBoZnMgdG8gZmluZCB3cmFwcGVkIEhGUysKK29iai0kKENPTkZJR19IRlNfRlMpCQkrPSBoZnMvCitvYmotJChDT05GSUdfVlhGU19GUykJCSs9IGZyZWV2eGZzLworb2JqLSQoQ09ORklHX05GU19GUykJCSs9IG5mcy8KK29iai0kKENPTkZJR19FWFBPUlRGUykJCSs9IGV4cG9ydGZzLworb2JqLSQoQ09ORklHX05GU0QpCQkrPSBuZnNkLworb2JqLSQoQ09ORklHX0xPQ0tEKQkJKz0gbG9ja2QvCitvYmotJChDT05GSUdfTkxTKQkJKz0gbmxzLworb2JqLSQoQ09ORklHX1NZU1ZfRlMpCQkrPSBzeXN2Lworb2JqLSQoQ09ORklHX1NNQl9GUykJCSs9IHNtYmZzLworb2JqLSQoQ09ORklHX0NJRlMpCQkrPSBjaWZzLworb2JqLSQoQ09ORklHX05DUF9GUykJCSs9IG5jcGZzLworb2JqLSQoQ09ORklHX0hQRlNfRlMpCQkrPSBocGZzLworb2JqLSQoQ09ORklHX05URlNfRlMpCQkrPSBudGZzLworb2JqLSQoQ09ORklHX1VGU19GUykJCSs9IHVmcy8KK29iai0kKENPTkZJR19FRlNfRlMpCQkrPSBlZnMvCitvYmotJChDT05GSUdfSkZGU19GUykJCSs9IGpmZnMvCitvYmotJChDT05GSUdfSkZGUzJfRlMpCQkrPSBqZmZzMi8KK29iai0kKENPTkZJR19BRkZTX0ZTKQkJKz0gYWZmcy8KK29iai0kKENPTkZJR19ST01GU19GUykJCSs9IHJvbWZzLworb2JqLSQoQ09ORklHX1FOWDRGU19GUykJCSs9IHFueDQvCitvYmotJChDT05GSUdfQVVUT0ZTX0ZTKQkJKz0gYXV0b2ZzLworb2JqLSQoQ09ORklHX0FVVE9GUzRfRlMpCSs9IGF1dG9mczQvCitvYmotJChDT05GSUdfQURGU19GUykJCSs9IGFkZnMvCitvYmotJChDT05GSUdfVURGX0ZTKQkJKz0gdWRmLworb2JqLSQoQ09ORklHX1NVTl9PUEVOUFJPTUZTKQkrPSBvcGVucHJvbWZzLworb2JqLSQoQ09ORklHX0pGU19GUykJCSs9IGpmcy8KK29iai0kKENPTkZJR19YRlNfRlMpCQkrPSB4ZnMvCitvYmotJChDT05GSUdfQUZTX0ZTKQkJKz0gYWZzLworb2JqLSQoQ09ORklHX0JFRlNfRlMpCQkrPSBiZWZzLworb2JqLSQoQ09ORklHX0hPU1RGUykJCSs9IGhvc3Rmcy8KK29iai0kKENPTkZJR19IUFBGUykJCSs9IGhwcGZzLworb2JqLSQoQ09ORklHX0RFQlVHX0ZTKQkJKz0gZGVidWdmcy8KZGlmZiAtLWdpdCBhL2ZzL2FkZnMvTWFrZWZpbGUgYi9mcy9hZGZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMmQ3MWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZGZzL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGFkZnMgZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX0FERlNfRlMpICs9IGFkZnMubworCithZGZzLW9ianMgOj0gZGlyLm8gZGlyX2YubyBkaXJfZnBsdXMubyBmaWxlLm8gaW5vZGUubyBtYXAubyBzdXBlci5vCmRpZmYgLS1naXQgYS9mcy9hZGZzL2FkZnMuaCBiL2ZzL2FkZnMvYWRmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZjVkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZGZzL2FkZnMuaApAQCAtMCwwICsxLDEyNyBAQAorLyogSW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBBREZTICovCisKKyNkZWZpbmUgQURGU19GUkVFX0ZSQUcJCSAwCisjZGVmaW5lIEFERlNfQkFEX0ZSQUcJCSAxCisjZGVmaW5lIEFERlNfUk9PVF9GUkFHCQkgMgorCisjZGVmaW5lIEFERlNfTkRBX09XTkVSX1JFQUQJKDEgPDwgMCkKKyNkZWZpbmUgQURGU19OREFfT1dORVJfV1JJVEUJKDEgPDwgMSkKKyNkZWZpbmUgQURGU19OREFfTE9DS0VECQkoMSA8PCAyKQorI2RlZmluZSBBREZTX05EQV9ESVJFQ1RPUlkJKDEgPDwgMykKKyNkZWZpbmUgQURGU19OREFfRVhFQ1VURQkoMSA8PCA0KQorI2RlZmluZSBBREZTX05EQV9QVUJMSUNfUkVBRAkoMSA8PCA1KQorI2RlZmluZSBBREZTX05EQV9QVUJMSUNfV1JJVEUJKDEgPDwgNikKKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlICJkaXJfZi5oIgorCitzdHJ1Y3QgYnVmZmVyX2hlYWQ7CisKKy8qCisgKiBEaXJlY3RvcnkgaGFuZGxpbmcKKyAqLworc3RydWN0IGFkZnNfZGlyIHsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiOworCisJaW50CQkJbnJfYnVmZmVyczsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoWzRdOworCXVuc2lnbmVkIGludAkJcG9zOworCXVuc2lnbmVkIGludAkJcGFyZW50X2lkOworCisJc3RydWN0IGFkZnNfZGlyaGVhZGVyCWRpcmhlYWQ7CisJdW5pb24gIGFkZnNfZGlydGFpbAlkaXJ0YWlsOworfTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIG92ZXJhbGwgbWF4aW11bSBuYW1lIGxlbmd0aAorICovCisjZGVmaW5lIEFERlNfTUFYX05BTUVfTEVOCTI1Ngorc3RydWN0IG9iamVjdF9pbmZvIHsKKwlfX3UzMgkJcGFyZW50X2lkOwkJLyogcGFyZW50IG9iamVjdCBpZAkqLworCV9fdTMyCQlmaWxlX2lkOwkJLyogb2JqZWN0IGlkCQkqLworCV9fdTMyCQlsb2FkYWRkcjsJCS8qIGxvYWQgYWRkcmVzcwkJKi8KKwlfX3UzMgkJZXhlY2FkZHI7CQkvKiBleGVjdXRpb24gYWRkcmVzcwkqLworCV9fdTMyCQlzaXplOwkJCS8qIHNpemUJCQkqLworCV9fdTgJCWF0dHI7CQkJLyogUklTQyBPUyBhdHRyaWJ1dGVzCSovCisJdW5zaWduZWQgY2hhcgluYW1lX2xlbjsJCS8qIG5hbWUgbGVuZ3RoCQkqLworCWNoYXIJCW5hbWVbQURGU19NQVhfTkFNRV9MRU5dOy8qIGZpbGUgbmFtZQkJKi8KK307CisKK3N0cnVjdCBhZGZzX2Rpcl9vcHMgeworCWludAkoKnJlYWQpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHN6LCBzdHJ1Y3QgYWRmc19kaXIgKmRpcik7CisJaW50CSgqc2V0cG9zKShzdHJ1Y3QgYWRmc19kaXIgKmRpciwgdW5zaWduZWQgaW50IGZwb3MpOworCWludAkoKmdldG5leHQpKHN0cnVjdCBhZGZzX2RpciAqZGlyLCBzdHJ1Y3Qgb2JqZWN0X2luZm8gKm9iaik7CisJaW50CSgqdXBkYXRlKShzdHJ1Y3QgYWRmc19kaXIgKmRpciwgc3RydWN0IG9iamVjdF9pbmZvICpvYmopOworCWludAkoKmNyZWF0ZSkoc3RydWN0IGFkZnNfZGlyICpkaXIsIHN0cnVjdCBvYmplY3RfaW5mbyAqb2JqKTsKKwlpbnQJKCpyZW1vdmUpKHN0cnVjdCBhZGZzX2RpciAqZGlyLCBzdHJ1Y3Qgb2JqZWN0X2luZm8gKm9iaik7CisJdm9pZAkoKmZyZWUpKHN0cnVjdCBhZGZzX2RpciAqZGlyKTsKK307CisKK3N0cnVjdCBhZGZzX2Rpc2NtYXAgeworCXN0cnVjdCBidWZmZXJfaGVhZAkqZG1fYmg7CisJX191MzIJCQlkbV9zdGFydGJsazsKKwl1bnNpZ25lZCBpbnQJCWRtX3N0YXJ0Yml0OworCXVuc2lnbmVkIGludAkJZG1fZW5kYml0OworfTsKKworLyogSW5vZGUgc3R1ZmYgKi8KK3N0cnVjdCBpbm9kZSAqYWRmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBvYmplY3RfaW5mbyAqb2JqKTsKK2ludCBhZGZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsaW50IHVudXNlZCk7CitpbnQgYWRmc19ub3RpZnlfY2hhbmdlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKTsKKworLyogbWFwLmMgKi8KK2V4dGVybiBpbnQgYWRmc19tYXBfbG9va3VwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBmcmFnX2lkLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYWRmc19tYXBfZnJlZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKworLyogTWlzYyAqLwordm9pZCBfX2FkZnNfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuY3Rpb24sCisJCSAgY29uc3QgY2hhciAqZm10LCAuLi4pOworI2RlZmluZSBhZGZzX2Vycm9yKHNiLCBmbXQuLi4pIF9fYWRmc19lcnJvcihzYiwgX19GVU5DVElPTl9fLCBmbXQpCisKKy8qIHN1cGVyLmMgKi8KKworLyoKKyAqIElub2RlcyBhbmQgZmlsZSBvcGVyYXRpb25zCisgKi8KKworLyogZGlyXyouYyAqLworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFkZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZGZzX2Rpcl9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBhZGZzX2RlbnRyeV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBhZGZzX2Rpcl9vcHMgYWRmc19mX2Rpcl9vcHM7CitleHRlcm4gc3RydWN0IGFkZnNfZGlyX29wcyBhZGZzX2ZwbHVzX2Rpcl9vcHM7CisKK2V4dGVybiBpbnQgYWRmc19kaXJfdXBkYXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBvYmplY3RfaW5mbyAqb2JqKTsKKworLyogZmlsZS5jICovCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYWRmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZGZzX2ZpbGVfb3BlcmF0aW9uczsKKworZXh0ZXJuIGlubGluZSBfX3UzMiBzaWduZWRfYXNsKF9fdTMyIHZhbCwgc2lnbmVkIGludCBzaGlmdCkKK3sKKwlpZiAoc2hpZnQgPj0gMCkKKwkJdmFsIDw8PSBzaGlmdDsKKwllbHNlCisJCXZhbCA+Pj0gLXNoaWZ0OworCXJldHVybiB2YWw7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIGFkZHJlc3Mgb2YgYSBibG9jayBpbiBhbiBvYmplY3QgZ2l2ZW4gdGhlIGJsb2NrIG9mZnNldAorICogYW5kIHRoZSBvYmplY3QgaWRlbnRpdHkuCisgKgorICogVGhlIHJvb3QgZGlyZWN0b3J5IElEIHNob3VsZCBhbHdheXMgYmUgbG9va2VkIHVwIGluIHRoZSBtYXAgWzMuNF0KKyAqLworZXh0ZXJuIGlubGluZSBpbnQKK19fYWRmc19ibG9ja19tYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IG9iamVjdF9pZCwKKwkJIHVuc2lnbmVkIGludCBibG9jaykKK3sKKwlpZiAob2JqZWN0X2lkICYgMjU1KSB7CisJCXVuc2lnbmVkIGludCBvZmY7CisKKwkJb2ZmID0gKG9iamVjdF9pZCAmIDI1NSkgLSAxOworCQlibG9jayArPSBvZmYgPDwgQURGU19TQihzYiktPnNfbG9nMnNoYXJlc2l6ZTsKKwl9CisKKwlyZXR1cm4gYWRmc19tYXBfbG9va3VwKHNiLCBvYmplY3RfaWQgPj4gOCwgYmxvY2spOworfQpkaWZmIC0tZ2l0IGEvZnMvYWRmcy9kaXIuYyBiL2ZzL2FkZnMvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI0YzNhMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2FkZnMvZGlyLmMKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiAgbGludXgvZnMvYWRmcy9kaXIuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDb21tb24gZGlyZWN0b3J5IGhhbmRsaW5nIGZvciBBREZTCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYWRmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CQkvKiBmb3IgZmlsZV9mc3luYygpICovCisKKyNpbmNsdWRlICJhZGZzLmgiCisKKy8qCisgKiBGb3IgZnV0dXJlLiAgVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgcGVyLWRpcmVjdG9yeS4KKyAqLworc3RhdGljIERFRklORV9SV0xPQ0soYWRmc19kaXJfbG9jayk7CisKK3N0YXRpYyBpbnQKK2FkZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBhZGZzX2Rpcl9vcHMgKm9wcyA9IEFERlNfU0Ioc2IpLT5zX2RpcjsKKwlzdHJ1Y3Qgb2JqZWN0X2luZm8gb2JqOworCXN0cnVjdCBhZGZzX2RpciBkaXI7CisJaW50IHJldCA9IDA7CisKKwlsb2NrX2tlcm5lbCgpOwkKKworCWlmIChmaWxwLT5mX3BvcyA+PiAzMikKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBvcHMtPnJlYWQoc2IsIGlub2RlLT5pX2lubywgaW5vZGUtPmlfc2l6ZSwgJmRpcik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlzd2l0Y2ggKCh1bnNpZ25lZCBsb25nKWZpbHAtPmZfcG9zKSB7CisJY2FzZSAwOgorCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgMCwgaW5vZGUtPmlfaW5vLCBEVF9ESVIpIDwgMCkKKwkJCWdvdG8gZnJlZV9vdXQ7CisJCWZpbHAtPmZfcG9zICs9IDE7CisKKwljYXNlIDE6CisJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgMSwgZGlyLnBhcmVudF9pZCwgRFRfRElSKSA8IDApCisJCQlnb3RvIGZyZWVfb3V0OworCQlmaWxwLT5mX3BvcyArPSAxOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmVhZF9sb2NrKCZhZGZzX2Rpcl9sb2NrKTsKKworCXJldCA9IG9wcy0+c2V0cG9zKCZkaXIsIGZpbHAtPmZfcG9zIC0gMik7CisJaWYgKHJldCkKKwkJZ290byB1bmxvY2tfb3V0OworCXdoaWxlIChvcHMtPmdldG5leHQoJmRpciwgJm9iaikgPT0gMCkgeworCQlpZiAoZmlsbGRpcihkaXJlbnQsIG9iai5uYW1lLCBvYmoubmFtZV9sZW4sCisJCQkgICAgZmlscC0+Zl9wb3MsIG9iai5maWxlX2lkLCBEVF9VTktOT1dOKSA8IDApCisJCQlnb3RvIHVubG9ja19vdXQ7CisJCWZpbHAtPmZfcG9zICs9IDE7CisJfQorCit1bmxvY2tfb3V0OgorCXJlYWRfdW5sb2NrKCZhZGZzX2Rpcl9sb2NrKTsKKworZnJlZV9vdXQ6CisJb3BzLT5mcmVlKCZkaXIpOworCitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK2ludAorYWRmc19kaXJfdXBkYXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBvYmplY3RfaW5mbyAqb2JqKQoreworCWludCByZXQgPSAtRUlOVkFMOworI2lmZGVmIENPTkZJR19BREZTX0ZTX1JXCisJc3RydWN0IGFkZnNfZGlyX29wcyAqb3BzID0gQURGU19TQihzYiktPnNfZGlyOworCXN0cnVjdCBhZGZzX2RpciBkaXI7CisKKwlwcmludGsoS0VSTl9JTkZPICJhZGZzX2Rpcl91cGRhdGU6IG9iamVjdCAlMDZYIGluIGRpciAlMDZYXG4iLAorCQkgb2JqLT5maWxlX2lkLCBvYmotPnBhcmVudF9pZCk7CisKKwlpZiAoIW9wcy0+dXBkYXRlKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9wcy0+cmVhZChzYiwgb2JqLT5wYXJlbnRfaWQsIDAsICZkaXIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJd3JpdGVfbG9jaygmYWRmc19kaXJfbG9jayk7CisJcmV0ID0gb3BzLT51cGRhdGUoJmRpciwgb2JqKTsKKwl3cml0ZV91bmxvY2soJmFkZnNfZGlyX2xvY2spOworCisJb3BzLT5mcmVlKCZkaXIpOworb3V0OgorI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorYWRmc19tYXRjaChzdHJ1Y3QgcXN0ciAqbmFtZSwgc3RydWN0IG9iamVjdF9pbmZvICpvYmopCit7CisJaW50IGk7CisKKwlpZiAobmFtZS0+bGVuICE9IG9iai0+bmFtZV9sZW4pCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IG5hbWUtPmxlbjsgaSsrKSB7CisJCWNoYXIgYzEsIGMyOworCisJCWMxID0gbmFtZS0+bmFtZVtpXTsKKwkJYzIgPSBvYmotPm5hbWVbaV07CisKKwkJaWYgKGMxID49ICdBJyAmJiBjMSA8PSAnWicpCisJCQljMSArPSAnYScgLSAnQSc7CisJCWlmIChjMiA+PSAnQScgJiYgYzIgPD0gJ1onKQorCQkJYzIgKz0gJ2EnIC0gJ0EnOworCisJCWlmIChjMSAhPSBjMikKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorYWRmc19kaXJfbG9va3VwX2J5bmFtZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcXN0ciAqbmFtZSwgc3RydWN0IG9iamVjdF9pbmZvICpvYmopCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBhZGZzX2Rpcl9vcHMgKm9wcyA9IEFERlNfU0Ioc2IpLT5zX2RpcjsKKwlzdHJ1Y3QgYWRmc19kaXIgZGlyOworCWludCByZXQ7CisKKwlyZXQgPSBvcHMtPnJlYWQoc2IsIGlub2RlLT5pX2lubywgaW5vZGUtPmlfc2l6ZSwgJmRpcik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAoQURGU19JKGlub2RlKS0+cGFyZW50X2lkICE9IGRpci5wYXJlbnRfaWQpIHsKKwkJYWRmc19lcnJvcihzYiwgInBhcmVudCBkaXJlY3RvcnkgY2hhbmdlZCB1bmRlciBtZSEgKCVseCBidXQgZ290ICVseClcbiIsCisJCQkgICBBREZTX0koaW5vZGUpLT5wYXJlbnRfaWQsIGRpci5wYXJlbnRfaWQpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGZyZWVfb3V0OworCX0KKworCW9iai0+cGFyZW50X2lkID0gaW5vZGUtPmlfaW5vOworCisJLyoKKwkgKiAnLicgaXMgaGFuZGxlZCBieSByZXNlcnZlZF9sb29rdXAoKSBpbiBmcy9uYW1laS5jCisJICovCisJaWYgKG5hbWUtPmxlbiA9PSAyICYmIG5hbWUtPm5hbWVbMF0gPT0gJy4nICYmIG5hbWUtPm5hbWVbMV0gPT0gJy4nKSB7CisJCS8qCisJCSAqIEN1cnJlbnRseSB1bmFibGUgdG8gZmlsbCBpbiB0aGUgcmVzdCBvZiAnb2JqJywKKwkJICogYnV0IHRoaXMgaXMgYmV0dGVyIHRoYW4gbm90aGluZy4gIFdlIG5lZWQgdG8KKwkJICogYXNjZW5kIG9uZSBsZXZlbCB0byBmaW5kIGl0J3MgcGFyZW50LgorCQkgKi8KKwkJb2JqLT5uYW1lX2xlbiA9IDA7CisJCW9iai0+ZmlsZV9pZCAgPSBvYmotPnBhcmVudF9pZDsKKwkJZ290byBmcmVlX291dDsKKwl9CisKKwlyZWFkX2xvY2soJmFkZnNfZGlyX2xvY2spOworCisJcmV0ID0gb3BzLT5zZXRwb3MoJmRpciwgMCk7CisJaWYgKHJldCkKKwkJZ290byB1bmxvY2tfb3V0OworCisJcmV0ID0gLUVOT0VOVDsKKwl3aGlsZSAob3BzLT5nZXRuZXh0KCZkaXIsIG9iaikgPT0gMCkgeworCQlpZiAoYWRmc19tYXRjaChuYW1lLCBvYmopKSB7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKK3VubG9ja19vdXQ6CisJcmVhZF91bmxvY2soJmFkZnNfZGlyX2xvY2spOworCitmcmVlX291dDoKKwlvcHMtPmZyZWUoJmRpcik7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZGZzX2Rpcl9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBhZGZzX3JlYWRkaXIsCisJLmZzeW5jCQk9IGZpbGVfZnN5bmMsCit9OworCitzdGF0aWMgaW50CithZGZzX2hhc2goc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgcXN0ciAqcXN0cikKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgbmFtZV9sZW4gPSBBREZTX1NCKHBhcmVudC0+ZF9zYiktPnNfbmFtZWxlbjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGxvbmcgaGFzaDsKKwlpbnQgaTsKKworCWlmIChxc3RyLT5sZW4gPCBuYW1lX2xlbikKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFRydW5jYXRlIHRoZSBuYW1lIGluIHBsYWNlLCBhdm9pZHMKKwkgKiBoYXZpbmcgdG8gZGVmaW5lIGEgY29tcGFyZSBmdW5jdGlvbi4KKwkgKi8KKwlxc3RyLT5sZW4gPSBpID0gbmFtZV9sZW47CisJbmFtZSA9IHFzdHItPm5hbWU7CisJaGFzaCA9IGluaXRfbmFtZV9oYXNoKCk7CisJd2hpbGUgKGktLSkgeworCQljaGFyIGM7CisKKwkJYyA9ICpuYW1lKys7CisJCWlmIChjID49ICdBJyAmJiBjIDw9ICdaJykKKwkJCWMgKz0gJ2EnIC0gJ0EnOworCisJCWhhc2ggPSBwYXJ0aWFsX25hbWVfaGFzaChjLCBoYXNoKTsKKwl9CisJcXN0ci0+aGFzaCA9IGVuZF9uYW1lX2hhc2goaGFzaCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvbXBhcmUgdHdvIG5hbWVzLCB0YWtpbmcgbm90ZSBvZiB0aGUgbmFtZSBsZW5ndGgKKyAqIHJlcXVpcmVtZW50cyBvZiB0aGUgdW5kZXJseWluZyBmaWxlc3lzdGVtLgorICovCitzdGF0aWMgaW50CithZGZzX2NvbXBhcmUoc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgcXN0ciAqZW50cnksIHN0cnVjdCBxc3RyICpuYW1lKQoreworCWludCBpOworCisJaWYgKGVudHJ5LT5sZW4gIT0gbmFtZS0+bGVuKQorCQlyZXR1cm4gMTsKKworCWZvciAoaSA9IDA7IGkgPCBuYW1lLT5sZW47IGkrKykgeworCQljaGFyIGEsIGI7CisKKwkJYSA9IGVudHJ5LT5uYW1lW2ldOworCQliID0gbmFtZS0+bmFtZVtpXTsKKworCQlpZiAoYSA+PSAnQScgJiYgYSA8PSAnWicpCisJCQlhICs9ICdhJyAtICdBJzsKKwkJaWYgKGIgPj0gJ0EnICYmIGIgPD0gJ1onKQorCQkJYiArPSAnYScgLSAnQSc7CisKKwkJaWYgKGEgIT0gYikKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGFkZnNfZGVudHJ5X29wZXJhdGlvbnMgPSB7CisJLmRfaGFzaAkJPSBhZGZzX2hhc2gsCisJLmRfY29tcGFyZQk9IGFkZnNfY29tcGFyZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKK2FkZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCXN0cnVjdCBvYmplY3RfaW5mbyBvYmo7CisJaW50IGVycm9yOworCisJZGVudHJ5LT5kX29wID0gJmFkZnNfZGVudHJ5X29wZXJhdGlvbnM7CQorCWxvY2tfa2VybmVsKCk7CisJZXJyb3IgPSBhZGZzX2Rpcl9sb29rdXBfYnluYW1lKGRpciwgJmRlbnRyeS0+ZF9uYW1lLCAmb2JqKTsKKwlpZiAoZXJyb3IgPT0gMCkgeworCQllcnJvciA9IC1FQUNDRVM7CisJCS8qCisJCSAqIFRoaXMgb25seSByZXR1cm5zIE5VTEwgaWYgZ2V0X2VtcHR5X2lub2RlCisJCSAqIGZhaWxzLgorCQkgKi8KKwkJaW5vZGUgPSBhZGZzX2lnZXQoZGlyLT5pX3NiLCAmb2JqKTsKKwkJaWYgKGlub2RlKQorCQkJZXJyb3IgPSAwOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworfQorCisvKgorICogZGlyZWN0b3JpZXMgY2FuIGhhbmRsZSBtb3N0IG9wZXJhdGlvbnMuLi4KKyAqLworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYWRmc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IGFkZnNfbG9va3VwLAorCS5zZXRhdHRyCT0gYWRmc19ub3RpZnlfY2hhbmdlLAorfTsKZGlmZiAtLWdpdCBhL2ZzL2FkZnMvZGlyX2YuYyBiL2ZzL2FkZnMvZGlyX2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmZjODYyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWRmcy9kaXJfZi5jCkBAIC0wLDAgKzEsNDYwIEBACisvKgorICogIGxpbnV4L2ZzL2FkZnMvZGlyX2YuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ny0xOTk5IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIEUgYW5kIEYgZm9ybWF0IGRpcmVjdG9yeSBoYW5kbGluZworICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FkZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgImFkZnMuaCIKKyNpbmNsdWRlICJkaXJfZi5oIgorCitzdGF0aWMgdm9pZCBhZGZzX2ZfZnJlZShzdHJ1Y3QgYWRmc19kaXIgKmRpcik7CisKKy8qCisgKiBSZWFkIGFuICh1bmFsaWduZWQpIHZhbHVlIG9mIGxlbmd0aCAxLi40IGJ5dGVzCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGFkZnNfcmVhZHZhbCh1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCisJc3dpdGNoIChsZW4pIHsKKwljYXNlIDQ6CQl2YWwgfD0gcFszXSA8PCAyNDsKKwljYXNlIDM6CQl2YWwgfD0gcFsyXSA8PCAxNjsKKwljYXNlIDI6CQl2YWwgfD0gcFsxXSA8PCA4OworCWRlZmF1bHQ6CXZhbCB8PSBwWzBdOworCX0KKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWRmc193cml0ZXZhbCh1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCXN3aXRjaCAobGVuKSB7CisJY2FzZSA0OgkJcFszXSA9IHZhbCA+PiAyNDsKKwljYXNlIDM6CQlwWzJdID0gdmFsID4+IDE2OworCWNhc2UgMjoJCXBbMV0gPSB2YWwgPj4gODsKKwlkZWZhdWx0OglwWzBdID0gdmFsOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgYWRmc19yZWFkbmFtZShjaGFyICpidWYsIGNoYXIgKnB0ciwgaW50IG1heGxlbikKK3sKKwljaGFyICpvbGRfYnVmID0gYnVmOworCisJd2hpbGUgKCpwdHIgPj0gJyAnICYmIG1heGxlbi0tKSB7CisJCWlmICgqcHRyID09ICcvJykKKwkJCSpidWYrKyA9ICcuJzsKKwkJZWxzZQorCQkJKmJ1ZisrID0gKnB0cjsKKwkJcHRyKys7CisJfQorCSpidWYgPSAnXDAnOworCisJcmV0dXJuIGJ1ZiAtIG9sZF9idWY7Cit9CisKKyNkZWZpbmUgcm9yMTModikgKCh2ID4+IDEzKSB8ICh2IDw8IDE5KSkKKworI2RlZmluZSBkaXJfdTgoaWR4KQkJCQlcCisJKHsgaW50IF9idWYgPSBpZHggPj4gYmxvY2tzaXplX2JpdHM7CVwKKwkgICBpbnQgX29mZiA9IGlkeCAtIChfYnVmIDw8IGJsb2Nrc2l6ZV9iaXRzKTtcCisJICAqKHU4ICopKGJoW19idWZdLT5iX2RhdGEgKyBfb2ZmKTsJXAorCX0pCisKKyNkZWZpbmUgZGlyX3UzMihpZHgpCQkJCVwKKwkoeyBpbnQgX2J1ZiA9IGlkeCA+PiBibG9ja3NpemVfYml0czsJXAorCSAgIGludCBfb2ZmID0gaWR4IC0gKF9idWYgPDwgYmxvY2tzaXplX2JpdHMpO1wKKwkgICooX19sZTMyICopKGJoW19idWZdLT5iX2RhdGEgKyBfb2ZmKTsJXAorCX0pCisKKyNkZWZpbmUgYnVmb2ZmKF9iaCxfaWR4KQkJCVwKKwkoeyBpbnQgX2J1ZiA9IF9pZHggPj4gYmxvY2tzaXplX2JpdHM7CVwKKwkgICBpbnQgX29mZiA9IF9pZHggLSAoX2J1ZiA8PCBibG9ja3NpemVfYml0cyk7XAorCSAgKHU4ICopKF9iaFtfYnVmXS0+Yl9kYXRhICsgX29mZik7CVwKKwl9KQorCisvKgorICogVGhlcmUgYXJlIHNvbWUgYWxnb3JpdGhtcyB0aGF0IGFyZSBuaWNlIGluCisgKiBhc3NlbWJsZXIsIGJ1dCBhIGJpdGNoIGluIEMuLi4gIFRoaXMgaXMgb25lCisgKiBvZiB0aGVtLgorICovCitzdGF0aWMgdTgKK2FkZnNfZGlyX2NoZWNrYnl0ZShjb25zdCBzdHJ1Y3QgYWRmc19kaXIgKmRpcikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBjb25zdCAqYmggPSBkaXItPmJoOworCWNvbnN0IGludCBibG9ja3NpemVfYml0cyA9IGRpci0+c2ItPnNfYmxvY2tzaXplX2JpdHM7CisJdW5pb24geyBfX2xlMzIgKnB0cjMyOyB1OCAqcHRyODsgfSBwdHIsIGVuZDsKKwl1MzIgZGlyY2hlY2sgPSAwOworCWludCBsYXN0ID0gNSAtIDI2OworCWludCBpID0gMDsKKworCS8qCisJICogQWNjdW11bGF0ZSBlYWNoIHdvcmQgdXAgdG8gdGhlIGxhc3Qgd2hvbGUKKwkgKiB3b3JkIG9mIHRoZSBsYXN0IGRpcmVjdG9yeSBlbnRyeS4gIFRoaXMKKwkgKiBjYW4gc3ByZWFkIGFjcm9zcyBzZXZlcmFsIGJ1ZmZlciBoZWFkcy4KKwkgKi8KKwlkbyB7CisJCWxhc3QgKz0gMjY7CisJCWRvIHsKKwkJCWRpcmNoZWNrID0gbGUzMl90b19jcHUoZGlyX3UzMihpKSkgXiByb3IxMyhkaXJjaGVjayk7CisKKwkJCWkgKz0gc2l6ZW9mKHUzMik7CisJCX0gd2hpbGUgKGkgPCAobGFzdCAmIH4zKSk7CisJfSB3aGlsZSAoZGlyX3U4KGxhc3QpICE9IDApOworCisJLyoKKwkgKiBBY2N1bXVsYXRlIHRoZSBsYXN0IGZldyBieXRlcy4gIFRoZXNlCisJICogYnl0ZXMgd2lsbCBiZSB3aXRoaW4gdGhlIHNhbWUgYmguCisJICovCisJaWYgKGkgIT0gbGFzdCkgeworCQlwdHIucHRyOCA9IGJ1Zm9mZihiaCwgaSk7CisJCWVuZC5wdHI4ID0gcHRyLnB0cjggKyBsYXN0IC0gaTsKKworCQlkbworCQkJZGlyY2hlY2sgPSAqcHRyLnB0cjgrKyBeIHJvcjEzKGRpcmNoZWNrKTsKKwkJd2hpbGUgKHB0ci5wdHI4IDwgZW5kLnB0cjgpOworCX0KKworCS8qCisJICogVGhlIGRpcmVjdG9yeSB0YWlsIGlzIGluIHRoZSBmaW5hbCBiaAorCSAqIE5vdGUgdGhhdCBjb250YXJ5IHRvIHRoZSBSSVNDIE9TIFBSTXMsCisJICogdGhlIGZpcnN0IGZldyBieXRlcyBhcmUgTk9UIGluY2x1ZGVkCisJICogaW4gdGhlIGNoZWNrLiAgQWxsIGJ5dGVzIGFyZSBpbiB0aGUKKwkgKiBzYW1lIGJoLgorCSAqLworCXB0ci5wdHI4ID0gYnVmb2ZmKGJoLCAyMDA4KTsKKwllbmQucHRyOCA9IHB0ci5wdHI4ICsgMzY7CisKKwlkbyB7CisJCV9fbGUzMiB2ID0gKnB0ci5wdHIzMisrOworCQlkaXJjaGVjayA9IGxlMzJfdG9fY3B1KHYpIF4gcm9yMTMoZGlyY2hlY2spOworCX0gd2hpbGUgKHB0ci5wdHIzMiA8IGVuZC5wdHIzMik7CisKKwlyZXR1cm4gKGRpcmNoZWNrIF4gKGRpcmNoZWNrID4+IDgpIF4gKGRpcmNoZWNrID4+IDE2KSBeIChkaXJjaGVjayA+PiAyNCkpICYgMHhmZjsKK30KKworLyoKKyAqIFJlYWQgYW5kIGNoZWNrIHRoYXQgYSBkaXJlY3RvcnkgaXMgdmFsaWQKKyAqLworc3RhdGljIGludAorYWRmc19kaXJfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIG9iamVjdF9pZCwKKwkgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgc3RydWN0IGFkZnNfZGlyICpkaXIpCit7CisJY29uc3QgdW5zaWduZWQgaW50IGJsb2Nrc2l6ZV9iaXRzID0gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJaW50IGJsayA9IDA7CisKKwkvKgorCSAqIERpcmVjdG9yaWVzIHdoaWNoIGFyZSBub3QgYSBtdWx0aXBsZSBvZiAyMDQ4IGJ5dGVzCisJICogYXJlIGNvbnNpZGVyZWQgYmFkIHYyIFszLjZdCisJICovCisJaWYgKHNpemUgJiAyMDQ3KQorCQlnb3RvIGJhZF9kaXI7CisKKwlzaXplID4+PSBibG9ja3NpemVfYml0czsKKworCWRpci0+bnJfYnVmZmVycyA9IDA7CisJZGlyLT5zYiA9IHNiOworCisJZm9yIChibGsgPSAwOyBibGsgPCBzaXplOyBibGsrKykgeworCQlpbnQgcGh5czsKKworCQlwaHlzID0gX19hZGZzX2Jsb2NrX21hcChzYiwgb2JqZWN0X2lkLCBibGspOworCQlpZiAoIXBoeXMpIHsKKwkJCWFkZnNfZXJyb3Ioc2IsICJkaXIgb2JqZWN0ICVsWCBoYXMgYSBob2xlIGF0IG9mZnNldCAlZCIsCisJCQkJICAgb2JqZWN0X2lkLCBibGspOworCQkJZ290byByZWxlYXNlX2J1ZmZlcnM7CisJCX0KKworCQlkaXItPmJoW2Jsa10gPSBzYl9icmVhZChzYiwgcGh5cyk7CisJCWlmICghZGlyLT5iaFtibGtdKQorCQkJZ290byByZWxlYXNlX2J1ZmZlcnM7CisJfQorCisJbWVtY3B5KCZkaXItPmRpcmhlYWQsIGJ1Zm9mZihkaXItPmJoLCAwKSwgc2l6ZW9mKGRpci0+ZGlyaGVhZCkpOworCW1lbWNweSgmZGlyLT5kaXJ0YWlsLCBidWZvZmYoZGlyLT5iaCwgMjAwNyksIHNpemVvZihkaXItPmRpcnRhaWwpKTsKKworCWlmIChkaXItPmRpcmhlYWQuc3RhcnRtYXNzZXEgIT0gZGlyLT5kaXJ0YWlsLm5ldy5lbmRtYXNzZXEgfHwKKwkgICAgbWVtY21wKCZkaXItPmRpcmhlYWQuc3RhcnRuYW1lLCAmZGlyLT5kaXJ0YWlsLm5ldy5lbmRuYW1lLCA0KSkKKwkJZ290byBiYWRfZGlyOworCisJaWYgKG1lbWNtcCgmZGlyLT5kaXJoZWFkLnN0YXJ0bmFtZSwgIk5pY2siLCA0KSAmJgorCSAgICBtZW1jbXAoJmRpci0+ZGlyaGVhZC5zdGFydG5hbWUsICJIdWdvIiwgNCkpCisJCWdvdG8gYmFkX2RpcjsKKworCWlmIChhZGZzX2Rpcl9jaGVja2J5dGUoZGlyKSAhPSBkaXItPmRpcnRhaWwubmV3LmRpcmNoZWNrYnl0ZSkKKwkJZ290byBiYWRfZGlyOworCisJZGlyLT5ucl9idWZmZXJzID0gYmxrOworCisJcmV0dXJuIDA7CisKK2JhZF9kaXI6CisJYWRmc19lcnJvcihzYiwgImNvcnJ1cHRlZCBkaXJlY3RvcnkgZnJhZ21lbnQgJWxYIiwKKwkJICAgb2JqZWN0X2lkKTsKK3JlbGVhc2VfYnVmZmVyczoKKwlmb3IgKGJsayAtPSAxOyBibGsgPj0gMDsgYmxrIC09IDEpCisJCWJyZWxzZShkaXItPmJoW2Jsa10pOworCisJZGlyLT5zYiA9IE5VTEw7CisKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIGNvbnZlcnQgYSBkaXNrLWJhc2VkIGRpcmVjdG9yeSBlbnRyeSB0byBhIExpbnV4IEFERlMgZGlyZWN0b3J5IGVudHJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorYWRmc19kaXIyb2JqKHN0cnVjdCBvYmplY3RfaW5mbyAqb2JqLCBzdHJ1Y3QgYWRmc19kaXJlbnRyeSAqZGUpCit7CisJb2JqLT5uYW1lX2xlbiA9CWFkZnNfcmVhZG5hbWUob2JqLT5uYW1lLCBkZS0+ZGlyb2JuYW1lLCBBREZTX0ZfTkFNRV9MRU4pOworCW9iai0+ZmlsZV9pZCAgPSBhZGZzX3JlYWR2YWwoZGUtPmRpcmluZGRpc2NhZGQsIDMpOworCW9iai0+bG9hZGFkZHIgPSBhZGZzX3JlYWR2YWwoZGUtPmRpcmxvYWQsIDQpOworCW9iai0+ZXhlY2FkZHIgPSBhZGZzX3JlYWR2YWwoZGUtPmRpcmV4ZWMsIDQpOworCW9iai0+c2l6ZSAgICAgPSBhZGZzX3JlYWR2YWwoZGUtPmRpcmxlbiwgIDQpOworCW9iai0+YXR0ciAgICAgPSBkZS0+bmV3ZGlyYXR0czsKK30KKworLyoKKyAqIGNvbnZlcnQgYSBMaW51eCBBREZTIGRpcmVjdG9yeSBlbnRyeSB0byBhIGRpc2stYmFzZWQgZGlyZWN0b3J5IGVudHJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorYWRmc19vYmoyZGlyKHN0cnVjdCBhZGZzX2RpcmVudHJ5ICpkZSwgc3RydWN0IG9iamVjdF9pbmZvICpvYmopCit7CisJYWRmc193cml0ZXZhbChkZS0+ZGlyaW5kZGlzY2FkZCwgMywgb2JqLT5maWxlX2lkKTsKKwlhZGZzX3dyaXRldmFsKGRlLT5kaXJsb2FkLCA0LCBvYmotPmxvYWRhZGRyKTsKKwlhZGZzX3dyaXRldmFsKGRlLT5kaXJleGVjLCA0LCBvYmotPmV4ZWNhZGRyKTsKKwlhZGZzX3dyaXRldmFsKGRlLT5kaXJsZW4sICA0LCBvYmotPnNpemUpOworCWRlLT5uZXdkaXJhdHRzID0gb2JqLT5hdHRyOworfQorCisvKgorICogZ2V0IGEgZGlyZWN0b3J5IGVudHJ5LiAgTm90ZSB0aGF0IHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUKKyAqIGZvciBob2xkaW5nIHRoZSByZWxldmFudCBsb2Nrcy4KKyAqLworc3RhdGljIGludAorX19hZGZzX2Rpcl9nZXQoc3RydWN0IGFkZnNfZGlyICpkaXIsIGludCBwb3MsIHN0cnVjdCBvYmplY3RfaW5mbyAqb2JqKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPnNiOworCXN0cnVjdCBhZGZzX2RpcmVudHJ5IGRlOworCWludCB0aGlzc2l6ZSwgYnVmZmVyLCBvZmZzZXQ7CisKKwlidWZmZXIgPSBwb3MgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisKKwlpZiAoYnVmZmVyID4gZGlyLT5ucl9idWZmZXJzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9mZnNldCA9IHBvcyAmIChzYi0+c19ibG9ja3NpemUgLSAxKTsKKwl0aGlzc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldDsKKwlpZiAodGhpc3NpemUgPiAyNikKKwkJdGhpc3NpemUgPSAyNjsKKworCW1lbWNweSgmZGUsIGRpci0+YmhbYnVmZmVyXS0+Yl9kYXRhICsgb2Zmc2V0LCB0aGlzc2l6ZSk7CisJaWYgKHRoaXNzaXplICE9IDI2KQorCQltZW1jcHkoKChjaGFyICopJmRlKSArIHRoaXNzaXplLCBkaXItPmJoW2J1ZmZlciArIDFdLT5iX2RhdGEsCisJCSAgICAgICAyNiAtIHRoaXNzaXplKTsKKworCWlmICghZGUuZGlyb2JuYW1lWzBdKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWFkZnNfZGlyMm9iaihvYmosICZkZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorX19hZGZzX2Rpcl9wdXQoc3RydWN0IGFkZnNfZGlyICpkaXIsIGludCBwb3MsIHN0cnVjdCBvYmplY3RfaW5mbyAqb2JqKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPnNiOworCXN0cnVjdCBhZGZzX2RpcmVudHJ5IGRlOworCWludCB0aGlzc2l6ZSwgYnVmZmVyLCBvZmZzZXQ7CisKKwlidWZmZXIgPSBwb3MgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisKKwlpZiAoYnVmZmVyID4gZGlyLT5ucl9idWZmZXJzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9mZnNldCA9IHBvcyAmIChzYi0+c19ibG9ja3NpemUgLSAxKTsKKwl0aGlzc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldDsKKwlpZiAodGhpc3NpemUgPiAyNikKKwkJdGhpc3NpemUgPSAyNjsKKworCS8qCisJICogR2V0IHRoZSBlbnRyeSBpbiB0b3RhbAorCSAqLworCW1lbWNweSgmZGUsIGRpci0+YmhbYnVmZmVyXS0+Yl9kYXRhICsgb2Zmc2V0LCB0aGlzc2l6ZSk7CisJaWYgKHRoaXNzaXplICE9IDI2KQorCQltZW1jcHkoKChjaGFyICopJmRlKSArIHRoaXNzaXplLCBkaXItPmJoW2J1ZmZlciArIDFdLT5iX2RhdGEsCisJCSAgICAgICAyNiAtIHRoaXNzaXplKTsKKworCS8qCisJICogdXBkYXRlIGl0CisJICovCisJYWRmc19vYmoyZGlyKCZkZSwgb2JqKTsKKworCS8qCisJICogUHV0IHRoZSBuZXcgZW50cnkgYmFjaworCSAqLworCW1lbWNweShkaXItPmJoW2J1ZmZlcl0tPmJfZGF0YSArIG9mZnNldCwgJmRlLCB0aGlzc2l6ZSk7CisJaWYgKHRoaXNzaXplICE9IDI2KQorCQltZW1jcHkoZGlyLT5iaFtidWZmZXIgKyAxXS0+Yl9kYXRhLCAoKGNoYXIgKikmZGUpICsgdGhpc3NpemUsCisJCSAgICAgICAyNiAtIHRoaXNzaXplKTsKKworCXJldHVybiAwOworfQorCisvKgorICogdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgaG9sZGluZyB0aGUgbmVjZXNzYXJ5CisgKiBsb2Nrcy4KKyAqLworc3RhdGljIGludAorYWRmc19kaXJfZmluZF9lbnRyeShzdHJ1Y3QgYWRmc19kaXIgKmRpciwgdW5zaWduZWQgbG9uZyBvYmplY3RfaWQpCit7CisJaW50IHBvcywgcmV0OworCisJcmV0ID0gLUVOT0VOVDsKKworCWZvciAocG9zID0gNTsgcG9zIDwgQURGU19OVU1fRElSX0VOVFJJRVMgKiAyNiArIDU7IHBvcyArPSAyNikgeworCQlzdHJ1Y3Qgb2JqZWN0X2luZm8gb2JqOworCisJCWlmICghX19hZGZzX2Rpcl9nZXQoZGlyLCBwb3MsICZvYmopKQorCQkJYnJlYWs7CisKKwkJaWYgKG9iai5maWxlX2lkID09IG9iamVjdF9pZCkgeworCQkJcmV0ID0gcG9zOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CithZGZzX2ZfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCBzeiwgc3RydWN0IGFkZnNfZGlyICpkaXIpCit7CisJaW50IHJldDsKKworCWlmIChzeiAhPSBBREZTX05FV0RJUl9TSVpFKQorCQlyZXR1cm4gLUVJTzsKKworCXJldCA9IGFkZnNfZGlyX3JlYWQoc2IsIGlkLCBzeiwgZGlyKTsKKwlpZiAocmV0KQorCQlhZGZzX2Vycm9yKHNiLCAidW5hYmxlIHRvIHJlYWQgZGlyZWN0b3J5Iik7CisJZWxzZQorCQlkaXItPnBhcmVudF9pZCA9IGFkZnNfcmVhZHZhbChkaXItPmRpcnRhaWwubmV3LmRpcnBhcmVudCwgMyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CithZGZzX2Zfc2V0cG9zKHN0cnVjdCBhZGZzX2RpciAqZGlyLCB1bnNpZ25lZCBpbnQgZnBvcykKK3sKKwlpZiAoZnBvcyA+PSBBREZTX05VTV9ESVJfRU5UUklFUykKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlkaXItPnBvcyA9IDUgKyBmcG9zICogMjY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2FkZnNfZl9nZXRuZXh0KHN0cnVjdCBhZGZzX2RpciAqZGlyLCBzdHJ1Y3Qgb2JqZWN0X2luZm8gKm9iaikKK3sKKwl1bnNpZ25lZCBpbnQgcmV0OworCisJcmV0ID0gX19hZGZzX2Rpcl9nZXQoZGlyLCBkaXItPnBvcywgb2JqKTsKKwlpZiAocmV0ID09IDApCisJCWRpci0+cG9zICs9IDI2OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorYWRmc19mX3VwZGF0ZShzdHJ1Y3QgYWRmc19kaXIgKmRpciwgc3RydWN0IG9iamVjdF9pbmZvICpvYmopCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+c2I7CisJaW50IHJldCwgaTsKKworCXJldCA9IGFkZnNfZGlyX2ZpbmRfZW50cnkoZGlyLCBvYmotPmZpbGVfaWQpOworCWlmIChyZXQgPCAwKSB7CisJCWFkZnNfZXJyb3IoZGlyLT5zYiwgInVuYWJsZSB0byBsb2NhdGUgZW50cnkgdG8gdXBkYXRlIik7CisJCWdvdG8gb3V0OworCX0KKworCV9fYWRmc19kaXJfcHV0KGRpciwgcmV0LCBvYmopOworIAorCS8qCisJICogSW5jcmVtZW50IGRpcmVjdG9yeSBzZXF1ZW5jZSBudW1iZXIKKwkgKi8KKwlkaXItPmJoWzBdLT5iX2RhdGFbMF0gKz0gMTsKKwlkaXItPmJoW2Rpci0+bnJfYnVmZmVycyAtIDFdLT5iX2RhdGFbc2ItPnNfYmxvY2tzaXplIC0gNl0gKz0gMTsKKworCXJldCA9IGFkZnNfZGlyX2NoZWNrYnl0ZShkaXIpOworCS8qCisJICogVXBkYXRlIGRpcmVjdG9yeSBjaGVjayBieXRlCisJICovCisJZGlyLT5iaFtkaXItPm5yX2J1ZmZlcnMgLSAxXS0+Yl9kYXRhW3NiLT5zX2Jsb2Nrc2l6ZSAtIDFdID0gcmV0OworCisjaWYgMQorCXsKKwljb25zdCB1bnNpZ25lZCBpbnQgYmxvY2tzaXplX2JpdHMgPSBzYi0+c19ibG9ja3NpemVfYml0czsKKworCW1lbWNweSgmZGlyLT5kaXJoZWFkLCBidWZvZmYoZGlyLT5iaCwgMCksIHNpemVvZihkaXItPmRpcmhlYWQpKTsKKwltZW1jcHkoJmRpci0+ZGlydGFpbCwgYnVmb2ZmKGRpci0+YmgsIDIwMDcpLCBzaXplb2YoZGlyLT5kaXJ0YWlsKSk7CisKKwlpZiAoZGlyLT5kaXJoZWFkLnN0YXJ0bWFzc2VxICE9IGRpci0+ZGlydGFpbC5uZXcuZW5kbWFzc2VxIHx8CisJICAgIG1lbWNtcCgmZGlyLT5kaXJoZWFkLnN0YXJ0bmFtZSwgJmRpci0+ZGlydGFpbC5uZXcuZW5kbmFtZSwgNCkpCisJCWdvdG8gYmFkX2RpcjsKKworCWlmIChtZW1jbXAoJmRpci0+ZGlyaGVhZC5zdGFydG5hbWUsICJOaWNrIiwgNCkgJiYKKwkgICAgbWVtY21wKCZkaXItPmRpcmhlYWQuc3RhcnRuYW1lLCAiSHVnbyIsIDQpKQorCQlnb3RvIGJhZF9kaXI7CisKKwlpZiAoYWRmc19kaXJfY2hlY2tieXRlKGRpcikgIT0gZGlyLT5kaXJ0YWlsLm5ldy5kaXJjaGVja2J5dGUpCisJCWdvdG8gYmFkX2RpcjsKKwl9CisjZW5kaWYKKwlmb3IgKGkgPSBkaXItPm5yX2J1ZmZlcnMgLSAxOyBpID49IDA7IGktLSkKKwkJbWFya19idWZmZXJfZGlydHkoZGlyLT5iaFtpXSk7CisKKwlyZXQgPSAwOworb3V0OgorCXJldHVybiByZXQ7CisjaWYgMQorYmFkX2RpcjoKKwlhZGZzX2Vycm9yKGRpci0+c2IsICJ3aG9vcHMhICBJIGJyb2tlIGEgZGlyZWN0b3J5ISIpOworCXJldHVybiAtRUlPOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCithZGZzX2ZfZnJlZShzdHJ1Y3QgYWRmc19kaXIgKmRpcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IGRpci0+bnJfYnVmZmVycyAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCWJyZWxzZShkaXItPmJoW2ldKTsKKwkJZGlyLT5iaFtpXSA9IE5VTEw7CisJfQorCisJZGlyLT5ucl9idWZmZXJzID0gMDsKKwlkaXItPnNiID0gTlVMTDsKK30KKworc3RydWN0IGFkZnNfZGlyX29wcyBhZGZzX2ZfZGlyX29wcyA9IHsKKwkucmVhZAkJPSBhZGZzX2ZfcmVhZCwKKwkuc2V0cG9zCQk9IGFkZnNfZl9zZXRwb3MsCisJLmdldG5leHQJPSBhZGZzX2ZfZ2V0bmV4dCwKKwkudXBkYXRlCQk9IGFkZnNfZl91cGRhdGUsCisJLmZyZWUJCT0gYWRmc19mX2ZyZWUKK307CmRpZmYgLS1naXQgYS9mcy9hZGZzL2Rpcl9mLmggYi9mcy9hZGZzL2Rpcl9mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3MTM0MAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2FkZnMvZGlyX2YuaApAQCAtMCwwICsxLDY1IEBACisvKgorICogIGxpbnV4L2ZzL2FkZnMvZGlyX2YuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgU3RydWN0dXJlcyBvZiBkaXJlY3RvcmllcyBvbiB0aGUgRiBmb3JtYXQgZGlzaworICovCisjaWZuZGVmIEFERlNfRElSX0ZfSAorI2RlZmluZSBBREZTX0RJUl9GX0gKKworLyoKKyAqIERpcmVjdG9yeSBoZWFkZXIKKyAqLworc3RydWN0IGFkZnNfZGlyaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyIHN0YXJ0bWFzc2VxOworCXVuc2lnbmVkIGNoYXIgc3RhcnRuYW1lWzRdOworfTsKKworI2RlZmluZSBBREZTX05FV0RJUl9TSVpFCTIwNDgKKyNkZWZpbmUgQURGU19OVU1fRElSX0VOVFJJRVMJNzcKKworLyoKKyAqIERpcmVjdG9yeSBlbnRyaWVzCisgKi8KK3N0cnVjdCBhZGZzX2RpcmVudHJ5IHsKKyNkZWZpbmUgQURGU19GX05BTUVfTEVOIDEwCisJY2hhciBkaXJvYm5hbWVbQURGU19GX05BTUVfTEVOXTsKKwlfX3U4IGRpcmxvYWRbNF07CisJX191OCBkaXJleGVjWzRdOworCV9fdTggZGlybGVuWzRdOworCV9fdTggZGlyaW5kZGlzY2FkZFszXTsKKwlfX3U4IG5ld2RpcmF0dHM7Cit9OworCisvKgorICogRGlyZWN0b3J5IHRhaWwKKyAqLwordW5pb24gYWRmc19kaXJ0YWlsIHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGRpcmxhc3RtYXNrOworCQljaGFyIGRpcm5hbWVbMTBdOworCQl1bnNpZ25lZCBjaGFyIGRpcnBhcmVudFszXTsKKwkJY2hhciBkaXJ0aXRsZVsxOV07CisJCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbMTRdOworCQl1bnNpZ25lZCBjaGFyIGVuZG1hc3NlcTsKKwkJdW5zaWduZWQgY2hhciBlbmRuYW1lWzRdOworCQl1bnNpZ25lZCBjaGFyIGRpcmNoZWNrYnl0ZTsKKwl9IG9sZDsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGRpcmxhc3RtYXNrOworCQl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzJdOworCQl1bnNpZ25lZCBjaGFyIGRpcnBhcmVudFszXTsKKwkJY2hhciBkaXJ0aXRsZVsxOV07CisJCWNoYXIgZGlybmFtZVsxMF07CisJCXVuc2lnbmVkIGNoYXIgZW5kbWFzc2VxOworCQl1bnNpZ25lZCBjaGFyIGVuZG5hbWVbNF07CisJCXVuc2lnbmVkIGNoYXIgZGlyY2hlY2tieXRlOworCX0gbmV3OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9hZGZzL2Rpcl9mcGx1cy5jIGIvZnMvYWRmcy9kaXJfZnBsdXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWM2NDRlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWRmcy9kaXJfZnBsdXMuYwpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqICBsaW51eC9mcy9hZGZzL2Rpcl9mcGx1cy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5Ny0xOTk5IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYWRmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSAiYWRmcy5oIgorI2luY2x1ZGUgImRpcl9mcGx1cy5oIgorCitzdGF0aWMgaW50CithZGZzX2ZwbHVzX3JlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBpbnQgc3osIHN0cnVjdCBhZGZzX2RpciAqZGlyKQoreworCXN0cnVjdCBhZGZzX2JpZ2RpcmhlYWRlciAqaDsKKwlzdHJ1Y3QgYWRmc19iaWdkaXJ0YWlsICp0OworCXVuc2lnbmVkIGxvbmcgYmxvY2s7CisJdW5zaWduZWQgaW50IGJsaywgc2l6ZTsKKwlpbnQgaSwgcmV0ID0gLUVJTzsKKworCWRpci0+bnJfYnVmZmVycyA9IDA7CisKKwlibG9jayA9IF9fYWRmc19ibG9ja19tYXAoc2IsIGlkLCAwKTsKKwlpZiAoIWJsb2NrKSB7CisJCWFkZnNfZXJyb3Ioc2IsICJkaXIgb2JqZWN0ICVYIGhhcyBhIGhvbGUgYXQgb2Zmc2V0IDAiLCBpZCk7CisJCWdvdG8gb3V0OworCX0KKworCWRpci0+YmhbMF0gPSBzYl9icmVhZChzYiwgYmxvY2spOworCWlmICghZGlyLT5iaFswXSkKKwkJZ290byBvdXQ7CisJZGlyLT5ucl9idWZmZXJzICs9IDE7CisKKwloID0gKHN0cnVjdCBhZGZzX2JpZ2RpcmhlYWRlciAqKWRpci0+YmhbMF0tPmJfZGF0YTsKKwlzaXplID0gbGUzMl90b19jcHUoaC0+YmlnZGlyc2l6ZSk7CisJaWYgKHNpemUgIT0gc3opIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWRmczogYWRmc19mcGx1c19yZWFkOiBkaXJlY3RvcnkgaGVhZGVyIHNpemVcbiIKKwkJCQkiIGRvZXMgbm90IG1hdGNoIGRpcmVjdG9yeSBzaXplXG4iKTsKKwl9CisKKwlpZiAoaC0+YmlnZGlydmVyc2lvblswXSAhPSAwIHx8IGgtPmJpZ2RpcnZlcnNpb25bMV0gIT0gMCB8fAorCSAgICBoLT5iaWdkaXJ2ZXJzaW9uWzJdICE9IDAgfHwgc2l6ZSAmIDIwNDcgfHwKKwkgICAgaC0+YmlnZGlyc3RhcnRuYW1lICE9IGNwdV90b19sZTMyKEJJR0RJUlNUQVJUTkFNRSkpCisJCWdvdG8gb3V0OworCisJc2l6ZSA+Pj0gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJZm9yIChibGsgPSAxOyBibGsgPCBzaXplOyBibGsrKykgeworCQlibG9jayA9IF9fYWRmc19ibG9ja19tYXAoc2IsIGlkLCBibGspOworCQlpZiAoIWJsb2NrKSB7CisJCQlhZGZzX2Vycm9yKHNiLCAiZGlyIG9iamVjdCAlWCBoYXMgYSBob2xlIGF0IG9mZnNldCAlZCIsIGlkLCBibGspOworCQkJZ290byBvdXQ7CisJCX0KKworCQlkaXItPmJoW2Jsa10gPSBzYl9icmVhZChzYiwgYmxvY2spOworCQlpZiAoIWRpci0+YmhbYmxrXSkKKwkJCWdvdG8gb3V0OworCQlkaXItPm5yX2J1ZmZlcnMgPSBibGs7CisJfQorCisJdCA9IChzdHJ1Y3QgYWRmc19iaWdkaXJ0YWlsICopKGRpci0+Ymhbc2l6ZSAtIDFdLT5iX2RhdGEgKyAoc2ItPnNfYmxvY2tzaXplIC0gOCkpOworCisJaWYgKHQtPmJpZ2RpcmVuZG5hbWUgIT0gY3B1X3RvX2xlMzIoQklHRElSRU5ETkFNRSkgfHwKKwkgICAgdC0+YmlnZGlyZW5kbWFzc2VxICE9IGgtPnN0YXJ0bWFzc2VxIHx8CisJICAgIHQtPnJlc2VydmVkWzBdICE9IDAgfHwgdC0+cmVzZXJ2ZWRbMV0gIT0gMCkKKwkJZ290byBvdXQ7CisKKwlkaXItPnBhcmVudF9pZCA9IGxlMzJfdG9fY3B1KGgtPmJpZ2RpcnBhcmVudCk7CisJZGlyLT5zYiA9IHNiOworCXJldHVybiAwOworb3V0OgorCWZvciAoaSA9IDA7IGkgPCBkaXItPm5yX2J1ZmZlcnM7IGkrKykKKwkJYnJlbHNlKGRpci0+YmhbaV0pOworCWRpci0+c2IgPSBOVUxMOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2FkZnNfZnBsdXNfc2V0cG9zKHN0cnVjdCBhZGZzX2RpciAqZGlyLCB1bnNpZ25lZCBpbnQgZnBvcykKK3sKKwlzdHJ1Y3QgYWRmc19iaWdkaXJoZWFkZXIgKmggPSAoc3RydWN0IGFkZnNfYmlnZGlyaGVhZGVyICopZGlyLT5iaFswXS0+Yl9kYXRhOworCWludCByZXQgPSAtRU5PRU5UOworCisJaWYgKGZwb3MgPD0gbGUzMl90b19jcHUoaC0+YmlnZGlyZW50cmllcykpIHsKKwkJZGlyLT5wb3MgPSBmcG9zOworCQlyZXQgPSAwOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitkaXJfbWVtY3B5KHN0cnVjdCBhZGZzX2RpciAqZGlyLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB2b2lkICp0bywgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5zYjsKKwl1bnNpZ25lZCBpbnQgYnVmZmVyLCBwYXJ0aWFsLCByZW1haW5kZXI7CisKKwlidWZmZXIgPSBvZmZzZXQgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJb2Zmc2V0ICY9IHNiLT5zX2Jsb2Nrc2l6ZSAtIDE7CisKKwlwYXJ0aWFsID0gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0OworCisJaWYgKHBhcnRpYWwgPj0gbGVuKQorCQltZW1jcHkodG8sIGRpci0+YmhbYnVmZmVyXS0+Yl9kYXRhICsgb2Zmc2V0LCBsZW4pOworCWVsc2UgeworCQljaGFyICpjID0gKGNoYXIgKil0bzsKKworCQlyZW1haW5kZXIgPSBsZW4gLSBwYXJ0aWFsOworCisJCW1lbWNweShjLCBkaXItPmJoW2J1ZmZlcl0tPmJfZGF0YSArIG9mZnNldCwgcGFydGlhbCk7CisJCW1lbWNweShjICsgcGFydGlhbCwgZGlyLT5iaFtidWZmZXIgKyAxXS0+Yl9kYXRhLCByZW1haW5kZXIpOworCX0KK30KKworc3RhdGljIGludAorYWRmc19mcGx1c19nZXRuZXh0KHN0cnVjdCBhZGZzX2RpciAqZGlyLCBzdHJ1Y3Qgb2JqZWN0X2luZm8gKm9iaikKK3sKKwlzdHJ1Y3QgYWRmc19iaWdkaXJoZWFkZXIgKmggPSAoc3RydWN0IGFkZnNfYmlnZGlyaGVhZGVyICopZGlyLT5iaFswXS0+Yl9kYXRhOworCXN0cnVjdCBhZGZzX2JpZ2RpcmVudHJ5IGJkZTsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCWludCBpLCByZXQgPSAtRU5PRU5UOworCisJaWYgKGRpci0+cG9zID49IGxlMzJfdG9fY3B1KGgtPmJpZ2RpcmVudHJpZXMpKQorCQlnb3RvIG91dDsKKworCW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBhZGZzX2JpZ2RpcmhlYWRlciwgYmlnZGlybmFtZSk7CisJb2Zmc2V0ICs9ICgobGUzMl90b19jcHUoaC0+YmlnZGlybmFtZWxlbikgKyA0KSAmIH4zKTsKKwlvZmZzZXQgKz0gZGlyLT5wb3MgKiBzaXplb2Yoc3RydWN0IGFkZnNfYmlnZGlyZW50cnkpOworCisJZGlyX21lbWNweShkaXIsIG9mZnNldCwgJmJkZSwgc2l6ZW9mKHN0cnVjdCBhZGZzX2JpZ2RpcmVudHJ5KSk7CisKKwlvYmotPmxvYWRhZGRyID0gbGUzMl90b19jcHUoYmRlLmJpZ2RpcmxvYWQpOworCW9iai0+ZXhlY2FkZHIgPSBsZTMyX3RvX2NwdShiZGUuYmlnZGlyZXhlYyk7CisJb2JqLT5zaXplICAgICA9IGxlMzJfdG9fY3B1KGJkZS5iaWdkaXJsZW4pOworCW9iai0+ZmlsZV9pZCAgPSBsZTMyX3RvX2NwdShiZGUuYmlnZGlyaW5kYWRkcik7CisJb2JqLT5hdHRyICAgICA9IGxlMzJfdG9fY3B1KGJkZS5iaWdkaXJhdHRyKTsKKwlvYmotPm5hbWVfbGVuID0gbGUzMl90b19jcHUoYmRlLmJpZ2Rpcm9ibmFtZWxlbik7CisKKwlvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgYWRmc19iaWdkaXJoZWFkZXIsIGJpZ2Rpcm5hbWUpOworCW9mZnNldCArPSAoKGxlMzJfdG9fY3B1KGgtPmJpZ2Rpcm5hbWVsZW4pICsgNCkgJiB+Myk7CisJb2Zmc2V0ICs9IGxlMzJfdG9fY3B1KGgtPmJpZ2RpcmVudHJpZXMpICogc2l6ZW9mKHN0cnVjdCBhZGZzX2JpZ2RpcmVudHJ5KTsKKwlvZmZzZXQgKz0gbGUzMl90b19jcHUoYmRlLmJpZ2Rpcm9ibmFtZXB0cik7CisKKwlkaXJfbWVtY3B5KGRpciwgb2Zmc2V0LCBvYmotPm5hbWUsIG9iai0+bmFtZV9sZW4pOworCWZvciAoaSA9IDA7IGkgPCBvYmotPm5hbWVfbGVuOyBpKyspCisJCWlmIChvYmotPm5hbWVbaV0gPT0gJy8nKQorCQkJb2JqLT5uYW1lW2ldID0gJy4nOworCisJZGlyLT5wb3MgKz0gMTsKKwlyZXQgPSAwOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCithZGZzX2ZwbHVzX2ZyZWUoc3RydWN0IGFkZnNfZGlyICpkaXIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGlyLT5ucl9idWZmZXJzOyBpKyspCisJCWJyZWxzZShkaXItPmJoW2ldKTsKKwlkaXItPnNiID0gTlVMTDsKK30KKworc3RydWN0IGFkZnNfZGlyX29wcyBhZGZzX2ZwbHVzX2Rpcl9vcHMgPSB7CisJLnJlYWQJCT0gYWRmc19mcGx1c19yZWFkLAorCS5zZXRwb3MJCT0gYWRmc19mcGx1c19zZXRwb3MsCisJLmdldG5leHQJPSBhZGZzX2ZwbHVzX2dldG5leHQsCisJLmZyZWUJCT0gYWRmc19mcGx1c19mcmVlCit9OwpkaWZmIC0tZ2l0IGEvZnMvYWRmcy9kaXJfZnBsdXMuaCBiL2ZzL2FkZnMvZGlyX2ZwbHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1YWE0MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2FkZnMvZGlyX2ZwbHVzLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqICBsaW51eC9mcy9hZGZzL2Rpcl9mcGx1cy5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OSBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBTdHJ1Y3R1cmVzIG9mIGRpcmVjdG9yaWVzIG9uIHRoZSBGKyBmb3JtYXQgZGlzaworICovCisKKyNkZWZpbmUgQURGU19GUExVU19OQU1FX0xFTgkyNTUKKworI2RlZmluZSBCSUdESVJTVEFSVE5BTUUgKCdTJyB8ICdCJyA8PCA4IHwgJ1AnIDw8IDE2IHwgJ3InIDw8IDI0KQorI2RlZmluZSBCSUdESVJFTkROQU1FCSgnbycgfCAndicgPDwgOCB8ICdlJyA8PCAxNiB8ICduJyA8PCAyNCkKKworc3RydWN0IGFkZnNfYmlnZGlyaGVhZGVyIHsKKwlfX3U4CXN0YXJ0bWFzc2VxOworCV9fdTgJYmlnZGlydmVyc2lvblszXTsKKwlfX2xlMzIJYmlnZGlyc3RhcnRuYW1lOworCV9fbGUzMgliaWdkaXJuYW1lbGVuOworCV9fbGUzMgliaWdkaXJzaXplOworCV9fbGUzMgliaWdkaXJlbnRyaWVzOworCV9fbGUzMgliaWdkaXJuYW1lc2l6ZTsKKwlfX2xlMzIJYmlnZGlycGFyZW50OworCWNoYXIJYmlnZGlybmFtZVsxXTsKK307CisKK3N0cnVjdCBhZGZzX2JpZ2RpcmVudHJ5IHsKKwlfX2xlMzIJYmlnZGlybG9hZDsKKwlfX2xlMzIJYmlnZGlyZXhlYzsKKwlfX2xlMzIJYmlnZGlybGVuOworCV9fbGUzMgliaWdkaXJpbmRhZGRyOworCV9fbGUzMgliaWdkaXJhdHRyOworCV9fbGUzMgliaWdkaXJvYm5hbWVsZW47CisJX19sZTMyCWJpZ2Rpcm9ibmFtZXB0cjsKK307CisKK3N0cnVjdCBhZGZzX2JpZ2RpcnRhaWwgeworCV9fbGUzMgliaWdkaXJlbmRuYW1lOworCV9fdTgJYmlnZGlyZW5kbWFzc2VxOworCV9fdTgJcmVzZXJ2ZWRbMl07CisJX191OAliaWdkaXJjaGVja2J5dGU7Cit9OwpkaWZmIC0tZ2l0IGEvZnMvYWRmcy9maWxlLmMgYi9mcy9hZGZzL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmViYmZkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWRmcy9maWxlLmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqICBsaW51eC9mcy9hZGZzL2ZpbGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ny0xOTk5IFJ1c3NlbGwgS2luZworICogZnJvbToKKyAqCisgKiAgbGludXgvZnMvZXh0Mi9maWxlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvbWluaXgvZmlsZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgYWRmcyByZWd1bGFyIGZpbGUgaGFuZGxpbmcgcHJpbWl0aXZlcyAgICAgICAgICAgCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CQkJLyogZm9yIGZpbGVfZnN5bmMoKSAqLworI2luY2x1ZGUgPGxpbnV4L2FkZnNfZnMuaD4KKworI2luY2x1ZGUgImFkZnMuaCIKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZGZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19maWxlX3JlYWQsCisJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCisJLmZzeW5jCQk9IGZpbGVfZnN5bmMsCisJLndyaXRlCQk9IGdlbmVyaWNfZmlsZV93cml0ZSwKKwkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBhZGZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkuc2V0YXR0cgk9IGFkZnNfbm90aWZ5X2NoYW5nZSwKK307CmRpZmYgLS1naXQgYS9mcy9hZGZzL2lub2RlLmMgYi9mcy9hZGZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAyODAyYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2FkZnMvaW5vZGUuYwpAQCAtMCwwICsxLDM5NSBAQAorLyoKKyAqICBsaW51eC9mcy9hZGZzL2lub2RlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTE5OTkgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9hZGZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworI2luY2x1ZGUgImFkZnMuaCIKKworLyoKKyAqIExvb2t1cC9DcmVhdGUgYSBibG9jayBhdCBvZmZzZXQgJ2Jsb2NrJyBpbnRvICdpbm9kZScuICBXZSBjdXJyZW50bHkgZG8KKyAqIG5vdCBzdXBwb3J0IGNyZWF0aW9uIG9mIG5ldyBibG9ja3MsIHNvIHdlIHJldHVybiAtRUlPIGZvciB0aGlzIGNhc2UuCisgKi8KK3N0YXRpYyBpbnQKK2FkZnNfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGJsb2NrLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCSAgICAgICBpbnQgY3JlYXRlKQoreworCWlmIChibG9jayA8IDApCisJCWdvdG8gYWJvcnRfbmVnYXRpdmU7CisKKwlpZiAoIWNyZWF0ZSkgeworCQlpZiAoYmxvY2sgPj0gaW5vZGUtPmlfYmxvY2tzKQorCQkJZ290byBhYm9ydF90b29iaWc7CisKKwkJYmxvY2sgPSBfX2FkZnNfYmxvY2tfbWFwKGlub2RlLT5pX3NiLCBpbm9kZS0+aV9pbm8sIGJsb2NrKTsKKwkJaWYgKGJsb2NrKQorCQkJbWFwX2JoKGJoLCBpbm9kZS0+aV9zYiwgYmxvY2spOworCQlyZXR1cm4gMDsKKwl9CisJLyogZG9uJ3Qgc3VwcG9ydCBhbGxvY2F0aW9uIG9mIGJsb2NrcyB5ZXQgKi8KKwlyZXR1cm4gLUVJTzsKKworYWJvcnRfbmVnYXRpdmU6CisJYWRmc19lcnJvcihpbm9kZS0+aV9zYiwgImJsb2NrICVkIDwgMCIsIGJsb2NrKTsKKwlyZXR1cm4gLUVJTzsKKworYWJvcnRfdG9vYmlnOgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZnNfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlyZXR1cm4gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIGFkZnNfZ2V0X2Jsb2NrLCB3YmMpOworfQorCitzdGF0aWMgaW50IGFkZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLCBhZGZzX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgYWRmc19wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IGZyb20sIHVuc2lnbmVkIGludCB0bykKK3sKKwlyZXR1cm4gY29udF9wcmVwYXJlX3dyaXRlKHBhZ2UsIGZyb20sIHRvLCBhZGZzX2dldF9ibG9jaywKKwkJJkFERlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KS0+bW11X3ByaXZhdGUpOworfQorCitzdGF0aWMgc2VjdG9yX3QgX2FkZnNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2spCit7CisJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLCBibG9jaywgYWRmc19nZXRfYmxvY2spOworfQorCitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBhZGZzX2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gYWRmc19yZWFkcGFnZSwKKwkud3JpdGVwYWdlCT0gYWRmc193cml0ZXBhZ2UsCisJLnN5bmNfcGFnZQk9IGJsb2NrX3N5bmNfcGFnZSwKKwkucHJlcGFyZV93cml0ZQk9IGFkZnNfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gZ2VuZXJpY19jb21taXRfd3JpdGUsCisJLmJtYXAJCT0gX2FkZnNfYm1hcAorfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK2FkZnNfZmlsZXR5cGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKworCWlmIChBREZTX0koaW5vZGUpLT5zdGFtcGVkKQorCQl0eXBlID0gKEFERlNfSShpbm9kZSktPmxvYWRhZGRyID4+IDgpICYgMHhmZmY7CisJZWxzZQorCQl0eXBlID0gKHVuc2lnbmVkIGludCkgLTE7CisKKwlyZXR1cm4gdHlwZTsKK30KKworLyoKKyAqIENvbnZlcnQgQURGUyBhdHRyaWJ1dGVzIGFuZCBmaWxldHlwZSB0byBMaW51eCBwZXJtaXNzaW9uLgorICovCitzdGF0aWMgdW1vZGVfdAorYWRmc19hdHRzMm1vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1bnNpZ25lZCBpbnQgZmlsZXR5cGUsIGF0dHIgPSBBREZTX0koaW5vZGUpLT5hdHRyOworCXVtb2RlX3QgbW9kZSwgcm1hc2s7CisJc3RydWN0IGFkZnNfc2JfaW5mbyAqYXNiID0gQURGU19TQihzYik7CisKKwlpZiAoYXR0ciAmIEFERlNfTkRBX0RJUkVDVE9SWSkgeworCQltb2RlID0gU19JUlVHTyAmIGFzYi0+c19vd25lcl9tYXNrOworCQlyZXR1cm4gU19JRkRJUiB8IFNfSVhVR08gfCBtb2RlOworCX0KKworCWZpbGV0eXBlID0gYWRmc19maWxldHlwZShpbm9kZSk7CisKKwlzd2l0Y2ggKGZpbGV0eXBlKSB7CisJY2FzZSAweGZjMDoJLyogTGlua0ZTICovCisJCXJldHVybiBTX0lGTE5LfFNfSVJXWFVHTzsKKworCWNhc2UgMHhmZTY6CS8qIFVuaXhFeGVjICovCisJCXJtYXNrID0gU19JUlVHTyB8IFNfSVhVR087CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcm1hc2sgPSBTX0lSVUdPOworCX0KKworCW1vZGUgPSBTX0lGUkVHOworCisJaWYgKGF0dHIgJiBBREZTX05EQV9PV05FUl9SRUFEKQorCQltb2RlIHw9IHJtYXNrICYgYXNiLT5zX293bmVyX21hc2s7CisKKwlpZiAoYXR0ciAmIEFERlNfTkRBX09XTkVSX1dSSVRFKQorCQltb2RlIHw9IFNfSVdVR08gJiBhc2ItPnNfb3duZXJfbWFzazsKKworCWlmIChhdHRyICYgQURGU19OREFfUFVCTElDX1JFQUQpCisJCW1vZGUgfD0gcm1hc2sgJiBhc2ItPnNfb3RoZXJfbWFzazsKKworCWlmIChhdHRyICYgQURGU19OREFfUFVCTElDX1dSSVRFKQorCQltb2RlIHw9IFNfSVdVR08gJiBhc2ItPnNfb3RoZXJfbWFzazsKKwlyZXR1cm4gbW9kZTsKK30KKworLyoKKyAqIENvbnZlcnQgTGludXggcGVybWlzc2lvbiB0byBBREZTIGF0dHJpYnV0ZS4gIFdlIHRyeSB0byBkbyB0aGUgcmV2ZXJzZQorICogb2YgYXR0czJtb2RlLCBidXQgdGhlcmUgaXMgbm90IGEgMToxIHRyYW5zbGF0aW9uLgorICovCitzdGF0aWMgaW50CithZGZzX21vZGUyYXR0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXVtb2RlX3QgbW9kZTsKKwlpbnQgYXR0cjsKKwlzdHJ1Y3QgYWRmc19zYl9pbmZvICphc2IgPSBBREZTX1NCKHNiKTsKKworCS8qIEZJWE1FOiBzaG91bGQgd2UgYmUgYWJsZSB0byBhbHRlciBhIGxpbms/ICovCisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiBBREZTX0koaW5vZGUpLT5hdHRyOworCisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCWF0dHIgPSBBREZTX05EQV9ESVJFQ1RPUlk7CisJZWxzZQorCQlhdHRyID0gMDsKKworCW1vZGUgPSBpbm9kZS0+aV9tb2RlICYgYXNiLT5zX293bmVyX21hc2s7CisJaWYgKG1vZGUgJiBTX0lSVUdPKQorCQlhdHRyIHw9IEFERlNfTkRBX09XTkVSX1JFQUQ7CisJaWYgKG1vZGUgJiBTX0lXVUdPKQorCQlhdHRyIHw9IEFERlNfTkRBX09XTkVSX1dSSVRFOworCisJbW9kZSA9IGlub2RlLT5pX21vZGUgJiBhc2ItPnNfb3RoZXJfbWFzazsKKwltb2RlICY9IH5hc2ItPnNfb3duZXJfbWFzazsKKwlpZiAobW9kZSAmIFNfSVJVR08pCisJCWF0dHIgfD0gQURGU19OREFfUFVCTElDX1JFQUQ7CisJaWYgKG1vZGUgJiBTX0lXVUdPKQorCQlhdHRyIHw9IEFERlNfTkRBX1BVQkxJQ19XUklURTsKKworCXJldHVybiBhdHRyOworfQorCisvKgorICogQ29udmVydCBhbiBBREZTIHRpbWUgdG8gVW5peCB0aW1lLiAgQURGUyBoYXMgYSA0MC1iaXQgY2VudGktc2Vjb25kIHRpbWUKKyAqIHJlZmVyZW5jZWQgdG8gMSBKYW4gMTkwMCAodGlsIDIyNDgpCisgKi8KK3N0YXRpYyB2b2lkCithZGZzX2FkZnMydW5peF90aW1lKHN0cnVjdCB0aW1lc3BlYyAqdHYsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJdW5zaWduZWQgaW50IGhpZ2gsIGxvdzsKKworCWlmIChBREZTX0koaW5vZGUpLT5zdGFtcGVkID09IDApCisJCWdvdG8gY3VyX3RpbWU7CisKKwloaWdoID0gQURGU19JKGlub2RlKS0+bG9hZGFkZHIgPDwgMjQ7CisJbG93ICA9IEFERlNfSShpbm9kZSktPmV4ZWNhZGRyOworCisJaGlnaCB8PSBsb3cgPj4gODsKKwlsb3cgICY9IDI1NTsKKworCS8qIEZpbGVzIGRhdGVkIHByZSAgMDEgSmFuIDE5NzAgMDA6MDA6MDAuICovCisJaWYgKGhpZ2ggPCAweDMzNmU5OTZhKQorCQlnb3RvIHRvb19lYXJseTsKKworCS8qIEZpbGVzIGRhdGVkIHBvc3QgMTggSmFuIDIwMzggMDM6MTQ6MDUuICovCisJaWYgKGhpZ2ggPj0gMHg2NTZlOTk2OSkKKwkJZ290byB0b29fbGF0ZTsKKworCS8qIGRpc2NhcmQgMjIwODk4ODgwMCAoMHgzMzZlOTk2YTAwKSBzZWNvbmRzIG9mIHRpbWUgKi8KKwloaWdoIC09IDB4MzM2ZTk5NmE7CisKKwkvKiBjb252ZXJ0IDQwLWJpdCBjZW50aS1zZWNvbmRzIHRvIDMyLWJpdCBzZWNvbmRzICovCisJdHYtPnR2X3NlYyA9ICgoKGhpZ2ggJSAxMDApIDw8IDgpICsgbG93KSAvIDEwMCArIChoaWdoIC8gMTAwIDw8IDgpOworCXR2LT50dl9uc2VjID0gMDsKKwlyZXR1cm47CisKKyBjdXJfdGltZToKKwkqdHYgPSBDVVJSRU5UX1RJTUVfU0VDOworCXJldHVybjsKKworIHRvb19lYXJseToKKwl0di0+dHZfc2VjID0gdHYtPnR2X25zZWMgPSAwOworCXJldHVybjsKKworIHRvb19sYXRlOgorCXR2LT50dl9zZWMgPSAweDdmZmZmZmZkOworCXR2LT50dl9uc2VjID0gMDsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBDb252ZXJ0IGFuIFVuaXggdGltZSB0byBBREZTIHRpbWUuICBXZSBvbmx5IGRvIHRoaXMgaWYgdGhlIGVudHJ5IGhhcyBhCisgKiB0aW1lL2RhdGUgc3RhbXAgYWxyZWFkeS4KKyAqLworc3RhdGljIHZvaWQKK2FkZnNfdW5peDJhZGZzX3RpbWUoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgaW50IHNlY3MpCit7CisJdW5zaWduZWQgaW50IGhpZ2gsIGxvdzsKKworCWlmIChBREZTX0koaW5vZGUpLT5zdGFtcGVkKSB7CisJCS8qIGNvbnZlcnQgMzItYml0IHNlY29uZHMgdG8gNDAtYml0IGNlbnRpLXNlY29uZHMgKi8KKwkJbG93ICA9IChzZWNzICYgMjU1KSAqIDEwMDsKKwkJaGlnaCA9IChzZWNzIC8gMjU2KSAqIDEwMCArIChsb3cgPj4gOCkgKyAweDMzNmU5OTZhOworCisJCUFERlNfSShpbm9kZSktPmxvYWRhZGRyID0gKGhpZ2ggPj4gMjQpIHwKKwkJCQkoQURGU19JKGlub2RlKS0+bG9hZGFkZHIgJiB+MHhmZik7CisJCUFERlNfSShpbm9kZSktPmV4ZWNhZGRyID0gKGxvdyAmIDI1NSkgfCAoaGlnaCA8PCA4KTsKKwl9Cit9CisKKy8qCisgKiBGaWxsIGluIHRoZSBpbm9kZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvYmplY3QgaW5mb3JtYXRpb24uCisgKgorICogTm90ZSB0aGF0IHRoaXMgaXMgYW4gaW5vZGUtbGVzcyBmaWxlc3lzdGVtLCBzbyB3ZSBjYW4ndCB1c2UgdGhlIGlub2RlCisgKiBudW1iZXIgdG8gcmVmZXJlbmNlIHRoZSBtZXRhZGF0YSBvbiB0aGUgbWVkaWEuICBJbnN0ZWFkLCB3ZSB1c2UgdGhlCisgKiBpbm9kZSBudW1iZXIgdG8gaG9sZCB0aGUgb2JqZWN0IElELCB3aGljaCBpbiB0dXJuIHdpbGwgdGVsbCB1cyB3aGVyZQorICogdGhlIGRhdGEgaXMgaGVsZC4gIFdlIGFsc28gc2F2ZSB0aGUgcGFyZW50IG9iamVjdCBJRCwgYW5kIHdpdGggdGhlc2UKKyAqIHR3bywgd2UgY2FuIGxvY2F0ZSB0aGUgbWV0YWRhdGEuCisgKgorICogVGhpcyBkb2VzIG1lYW4gdGhhdCB3ZSByZWx5IG9uIGFuIG9iamVjdHMgcGFyZW50IHJlbWFpbmluZyB0aGUgc2FtZSBhdAorICogYWxsIHRpbWVzIC0gd2UgY2Fubm90IGNvcGUgd2l0aCBhIGNyb3NzLWRpcmVjdG9yeSByZW5hbWUgKHlldCkuCisgKi8KK3N0cnVjdCBpbm9kZSAqCithZGZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IG9iamVjdF9pbmZvICpvYmopCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCWlub2RlID0gbmV3X2lub2RlKHNiKTsKKwlpZiAoIWlub2RlKQorCQlnb3RvIG91dDsKKworCWlub2RlLT5pX3VpZAkgPSBBREZTX1NCKHNiKS0+c191aWQ7CisJaW5vZGUtPmlfZ2lkCSA9IEFERlNfU0Ioc2IpLT5zX2dpZDsKKwlpbm9kZS0+aV9pbm8JID0gb2JqLT5maWxlX2lkOworCWlub2RlLT5pX3NpemUJID0gb2JqLT5zaXplOworCWlub2RlLT5pX25saW5rCSA9IDI7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfU0laRTsKKwlpbm9kZS0+aV9ibG9ja3MJID0gKGlub2RlLT5pX3NpemUgKyBzYi0+c19ibG9ja3NpemUgLSAxKSA+PgorCQkJICAgIHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCisJLyoKKwkgKiB3ZSBuZWVkIHRvIHNhdmUgdGhlIHBhcmVudCBkaXJlY3RvcnkgSUQgc28gdGhhdAorCSAqIHdyaXRlX2lub2RlIGNhbiB1cGRhdGUgdGhlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbgorCSAqIGZvciB0aGlzIGZpbGUuICBUaGlzIHdpbGwgbmVlZCBzcGVjaWFsIGhhbmRsaW5nCisJICogZm9yIGNyb3NzLWRpcmVjdG9yeSByZW5hbWVzLgorCSAqLworCUFERlNfSShpbm9kZSktPnBhcmVudF9pZCA9IG9iai0+cGFyZW50X2lkOworCUFERlNfSShpbm9kZSktPmxvYWRhZGRyICA9IG9iai0+bG9hZGFkZHI7CisJQURGU19JKGlub2RlKS0+ZXhlY2FkZHIgID0gb2JqLT5leGVjYWRkcjsKKwlBREZTX0koaW5vZGUpLT5hdHRyICAgICAgPSBvYmotPmF0dHI7CisJQURGU19JKGlub2RlKS0+c3RhbXBlZAkgID0gKChvYmotPmxvYWRhZGRyICYgMHhmZmYwMDAwMCkgPT0gMHhmZmYwMDAwMCk7CisKKwlpbm9kZS0+aV9tb2RlCSA9IGFkZnNfYXR0czJtb2RlKHNiLCBpbm9kZSk7CisJYWRmc19hZGZzMnVuaXhfdGltZSgmaW5vZGUtPmlfbXRpbWUsIGlub2RlKTsKKwlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lOworCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWU7CisKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQlpbm9kZS0+aV9vcAk9ICZhZGZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AJPSAmYWRmc19kaXJfb3BlcmF0aW9uczsKKwl9IGVsc2UgaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AJPSAmYWRmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcAk9ICZhZGZzX2ZpbGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmYWRmc19hb3BzOworCQlBREZTX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA9IGlub2RlLT5pX3NpemU7CisJfQorCisJaW5zZXJ0X2lub2RlX2hhc2goaW5vZGUpOworCitvdXQ6CisJcmV0dXJuIGlub2RlOworfQorCisvKgorICogVmFsaWRhdGUgYW5kIGNvbnZlcnQgYSBjaGFuZ2VkIGFjY2VzcyBtb2RlL3RpbWUgdG8gdGhlaXIgQURGUyBlcXVpdmFsZW50cy4KKyAqIGFkZnNfd3JpdGVfaW5vZGUgd2lsbCBhY3R1YWxseSB3cml0ZSB0aGUgaW5mb3JtYXRpb24gYmFjayB0byB0aGUgZGlyZWN0b3J5CisgKiBsYXRlci4KKyAqLworaW50CithZGZzX25vdGlmeV9jaGFuZ2Uoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJdW5zaWduZWQgaW50IGlhX3ZhbGlkID0gYXR0ci0+aWFfdmFsaWQ7CisJaW50IGVycm9yOworCQorCWxvY2tfa2VybmVsKCk7CisKKwllcnJvciA9IGlub2RlX2NoYW5nZV9vayhpbm9kZSwgYXR0cik7CisKKwkvKgorCSAqIHdlIGNhbid0IGNoYW5nZSB0aGUgVUlEIG9yIEdJRCBvZiBhbnkgZmlsZSAtCisJICogd2UgaGF2ZSBhIGdsb2JhbCBVSUQvR0lEIGluIHRoZSBzdXBlcmJsb2NrCisJICovCisJaWYgKChpYV92YWxpZCAmIEFUVFJfVUlEICYmIGF0dHItPmlhX3VpZCAhPSBBREZTX1NCKHNiKS0+c191aWQpIHx8CisJICAgIChpYV92YWxpZCAmIEFUVFJfR0lEICYmIGF0dHItPmlhX2dpZCAhPSBBREZTX1NCKHNiKS0+c19naWQpKQorCQllcnJvciA9IC1FUEVSTTsKKworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX1NJWkUpCisJCWVycm9yID0gdm10cnVuY2F0ZShpbm9kZSwgYXR0ci0+aWFfc2l6ZSk7CisKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJaWYgKGlhX3ZhbGlkICYgQVRUUl9NVElNRSkgeworCQlpbm9kZS0+aV9tdGltZSA9IGF0dHItPmlhX210aW1lOworCQlhZGZzX3VuaXgyYWRmc190aW1lKGlub2RlLCBhdHRyLT5pYV9tdGltZS50dl9zZWMpOworCX0KKwkvKgorCSAqIEZJWE1FOiBzaG91bGQgd2UgbWFrZSB0aGVzZSA9PSB0byBpX210aW1lIHNpbmNlIHdlIGRvbid0CisJICogaGF2ZSB0aGUgYWJpbGl0eSB0byByZXByZXNlbnQgdGhlbSBpbiBvdXIgZmlsZXN5c3RlbT8KKwkgKi8KKwlpZiAoaWFfdmFsaWQgJiBBVFRSX0FUSU1FKQorCQlpbm9kZS0+aV9hdGltZSA9IGF0dHItPmlhX2F0aW1lOworCWlmIChpYV92YWxpZCAmIEFUVFJfQ1RJTUUpCisJCWlub2RlLT5pX2N0aW1lID0gYXR0ci0+aWFfY3RpbWU7CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CisJCUFERlNfSShpbm9kZSktPmF0dHIgPSBhZGZzX21vZGUyYXR0cyhzYiwgaW5vZGUpOworCQlpbm9kZS0+aV9tb2RlID0gYWRmc19hdHRzMm1vZGUoc2IsIGlub2RlKTsKKwl9CisKKwkvKgorCSAqIEZJWE1FOiBzaG91bGQgd2UgYmUgbWFya2luZyB0aGlzIGlub2RlIGRpcnR5IGV2ZW4gaWYKKwkgKiB3ZSBkb24ndCBoYXZlIGFueSBtZXRhZGF0YSB0byB3cml0ZSBiYWNrPworCSAqLworCWlmIChpYV92YWxpZCAmIChBVFRSX1NJWkUgfCBBVFRSX01USU1FIHwgQVRUUl9NT0RFKSkKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIHdyaXRlIGFuIGV4aXN0aW5nIGlub2RlIGJhY2sgdG8gdGhlIGRpcmVjdG9yeSwgYW5kIHRoZXJlZm9yZSB0aGUgZGlzay4KKyAqIFRoZSBhZGZzLXNwZWNpZmljIGlub2RlIGRhdGEgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkIGJ5CisgKiBhZGZzX25vdGlmeV9jaGFuZ2UoKQorICovCitpbnQgYWRmc193cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdW51c2VkKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3Qgb2JqZWN0X2luZm8gb2JqOworCWludCByZXQ7CisKKwlsb2NrX2tlcm5lbCgpOworCW9iai5maWxlX2lkCT0gaW5vZGUtPmlfaW5vOworCW9iai5uYW1lX2xlbgk9IDA7CisJb2JqLnBhcmVudF9pZAk9IEFERlNfSShpbm9kZSktPnBhcmVudF9pZDsKKwlvYmoubG9hZGFkZHIJPSBBREZTX0koaW5vZGUpLT5sb2FkYWRkcjsKKwlvYmouZXhlY2FkZHIJPSBBREZTX0koaW5vZGUpLT5leGVjYWRkcjsKKwlvYmouYXR0cgk9IEFERlNfSShpbm9kZSktPmF0dHI7CisJb2JqLnNpemUJPSBpbm9kZS0+aV9zaXplOworCisJcmV0ID0gYWRmc19kaXJfdXBkYXRlKHNiLCAmb2JqKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL2FkZnMvbWFwLmMgYi9mcy9hZGZzL21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYWI0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZGZzL21hcC5jCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogIGxpbnV4L2ZzL2FkZnMvbWFwLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDIgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9hZGZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSAiYWRmcy5oIgorCisvKgorICogVGhlIEFERlMgbWFwIGlzIGJhc2ljYWxseSBhIHNldCBvZiBzZWN0b3JzLiAgRWFjaCBzZWN0b3IgaXMgY2FsbGVkIGEKKyAqIHpvbmUgd2hpY2ggY29udGFpbnMgYSBiaXRzdHJlYW0gbWFkZSB1cCBvZiB2YXJpYWJsZSBzaXplZCBmcmFnbWVudHMuCisgKiBFYWNoIGJpdCByZWZlcnMgdG8gYSBzZXQgb2YgYnl0ZXMgaW4gdGhlIGZpbGVzeXN0ZW0sIGRlZmluZWQgYnkKKyAqIGxvZzJicG1iLiAgVGhpcyBtYXkgYmUgbGFyZ2VyIG9yIHNtYWxsZXIgdGhhbiB0aGUgc2VjdG9yIHNpemUsIGJ1dAorICogdGhlIG92ZXJhbGwgc2l6ZSBpdCBkZXNjcmliZXMgd2lsbCBhbHdheXMgYmUgYSByb3VuZCBudW1iZXIgb2YKKyAqIHNlY3RvcnMuICBBIGZyYWdtZW50IGlkIGlzIGFsd2F5cyBpZGxlbiBiaXRzIGxvbmcuCisgKgorICogIDwgaWRsZW4gPiA8ICAgICAgIG4gICAgICAgID4gPDE+CisgKiArLS0tLS0tLS0tKy0tLS0tLS0vLy0tLS0tLS0tLSstLS0rCisgKiB8IGZyYWcgaWQgfCAgMDAwMC4uLi4wMDAwMDAgIHwgMSB8CisgKiArLS0tLS0tLS0tKy0tLS0tLS0vLy0tLS0tLS0tLSstLS0rCisgKgorICogVGhlIHBoeXNpY2FsIGRpc2sgc3BhY2UgdXNlZCBieSBhIGZyYWdtZW50IGlzIHRha2VuIGZyb20gdGhlIHN0YXJ0IG9mCisgKiB0aGUgZnJhZ21lbnQgaWQgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgJzEnIGJpdCAtIGllLCBpZGxlbiArIG4gKyAxCisgKiBiaXRzLgorICoKKyAqIEEgZnJhZ21lbnQgaWQgY2FuIGJlIHJlcGVhdGVkIG11bHRpcGxlIHRpbWVzIGluIHRoZSB3aG9sZSBtYXAgZm9yCisgKiBsYXJnZSBvciBmcmFnbWVudGVkIGZpbGVzLiAgVGhlIGZpcnN0IG1hcCB6b25lIGEgZnJhZ21lbnQgc3RhcnRzIGluCisgKiBpcyBnaXZlbiBieSBmcmFnbWVudCBpZCAvIGlkc19wZXJfem9uZSAtIHRoaXMgYWxsb3dzIG9iamVjdHMgdG8gc3RhcnQKKyAqIGZyb20gYW55IHpvbmUgb24gdGhlIGRpc2suCisgKgorICogRnJlZSBzcGFjZSBpcyBkZXNjcmliZWQgYnkgYSBsaW5rZWQgbGlzdCBvZiBmcmFnbWVudHMuICBFYWNoIGZyZWUKKyAqIGZyYWdtZW50IGRlc2NyaWJlcyBmcmVlIHNwYWNlIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgb3RoZXIgZnJhZ21lbnRzLAorICogaG93ZXZlciwgdGhlIGZyYWcgaWQgc3BlY2lmaWVzIGFuIG9mZnNldCAoaW4gbWFwIGJpdHMpIGZyb20gdGhlIGVuZAorICogb2YgdGhpcyBmcmFnbWVudCB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgZnJlZSBmcmFnbWVudC4KKyAqCisgKiBPYmplY3RzIHN0b3JlZCBvbiB0aGUgZGlzayBhcmUgYWxsb2NhdGVkIG9iamVjdCBpZHMgKHdlIHVzZSB0aGVzZSBhcworICogb3VyIGlub2RlIG51bWJlcnMuKSAgT2JqZWN0IGlkcyBjb250YWluIGEgZnJhZ21lbnQgaWQgYW5kIGFuIG9wdGlvbmFsCisgKiBvZmZzZXQuICBUaGlzIGFsbG93cyBhIGRpcmVjdG9yeSBmcmFnbWVudCB0byBjb250YWluIHNtYWxsIGZpbGVzCisgKiBhc3NvY2lhdGVkIHdpdGggdGhhdCBkaXJlY3RvcnkuCisgKi8KKworLyoKKyAqIEZvciB0aGUgZnV0dXJlLi4uCisgKi8KK3N0YXRpYyBERUZJTkVfUldMT0NLKGFkZnNfbWFwX2xvY2spOworCisvKgorICogVGhpcyBpcyBmdW4uICBXZSBuZWVkIHRvIGxvYWQgdXAgdG8gMTkgYml0cyBmcm9tIHRoZSBtYXAgYXQgYW4KKyAqIGFyYml0YXJ5IGJpdCBhbGlnbm1lbnQuICAoV2UncmUgbGltaXRlZCB0byAxOSBiaXRzIGJ5IEYrIHZlcnNpb24gMikuCisgKi8KKyNkZWZpbmUgR0VUX0ZSQUdfSUQoX21hcCxfc3RhcnQsX2lkbWFzaykJCQkJXAorCSh7CQkJCQkJCQlcCisJCXVuc2lnbmVkIGNoYXIgKl9tID0gX21hcCArIChfc3RhcnQgPj4gMyk7CQlcCisJCXUzMiBfZnJhZyA9IGdldF91bmFsaWduZWQoKHUzMiAqKV9tKTsJCQlcCisJCV9mcmFnID4+PSAoX3N0YXJ0ICYgNyk7CQkJCQlcCisJCV9mcmFnICYgX2lkbWFzazsJCQkJCVwKKwl9KQorCisvKgorICogcmV0dXJuIHRoZSBtYXAgYml0IG9mZnNldCBvZiB0aGUgZnJhZ21lbnQgZnJhZ19pZCBpbiB0aGUgem9uZSBkbS4KKyAqIE5vdGUgdGhhdCB0aGUgbG9vcCBpcyBvcHRpbWlzZWQgZm9yIGJlc3QgYXNtIGNvZGUgLSBsb29rIGF0IHRoZQorICogb3V0cHV0IG9mOgorICogIGdjYyAtRF9fS0VSTkVMX18gLU8yIC1JLi4vLi4vaW5jbHVkZSAtbyAtIC1TIG1hcC5jCisgKi8KK3N0YXRpYyBpbnQKK2xvb2t1cF96b25lKGNvbnN0IHN0cnVjdCBhZGZzX2Rpc2NtYXAgKmRtLCBjb25zdCB1bnNpZ25lZCBpbnQgaWRsZW4sCisJICAgIGNvbnN0IHVuc2lnbmVkIGludCBmcmFnX2lkLCB1bnNpZ25lZCBpbnQgKm9mZnNldCkKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgbWFwc2l6ZSA9IGRtLT5kbV9lbmRiaXQ7CisJY29uc3QgdTMyIGlkbWFzayA9ICgxIDw8IGlkbGVuKSAtIDE7CisJdW5zaWduZWQgY2hhciAqbWFwID0gZG0tPmRtX2JoLT5iX2RhdGEgKyA0OworCXVuc2lnbmVkIGludCBzdGFydCA9IGRtLT5kbV9zdGFydGJpdDsKKwl1bnNpZ25lZCBpbnQgbWFwcHRyOworCXUzMiBmcmFnOworCisJZG8geworCQlmcmFnID0gR0VUX0ZSQUdfSUQobWFwLCBzdGFydCwgaWRtYXNrKTsKKwkJbWFwcHRyID0gc3RhcnQgKyBpZGxlbjsKKworCQkvKgorCQkgKiBmaW5kIGVuZCBvZiBmcmFnbWVudAorCQkgKi8KKwkJeworCQkJX19sZTMyICpfbWFwID0gKF9fbGUzMiAqKW1hcDsKKwkJCXUzMiB2ID0gbGUzMl90b19jcHUoX21hcFttYXBwdHIgPj4gNV0pID4+IChtYXBwdHIgJiAzMSk7CisJCQl3aGlsZSAodiA9PSAwKSB7CisJCQkJbWFwcHRyID0gKG1hcHB0ciAmIH4zMSkgKyAzMjsKKwkJCQlpZiAobWFwcHRyID49IG1hcHNpemUpCisJCQkJCWdvdG8gZXJyb3I7CisJCQkJdiA9IGxlMzJfdG9fY3B1KF9tYXBbbWFwcHRyID4+IDVdKTsKKwkJCX0KKworCQkJbWFwcHRyICs9IDEgKyBmZnoofnYpOworCQl9CisKKwkJaWYgKGZyYWcgPT0gZnJhZ19pZCkKKwkJCWdvdG8gZm91bmQ7CithZ2FpbjoKKwkJc3RhcnQgPSBtYXBwdHI7CisJfSB3aGlsZSAobWFwcHRyIDwgbWFwc2l6ZSk7CisJcmV0dXJuIC0xOworCitlcnJvcjoKKwlwcmludGsoS0VSTl9FUlIgImFkZnM6IG92ZXJzaXplZCBmcmFnbWVudCAweCV4IGF0IDB4JXgtMHgleFxuIiwKKwkJZnJhZywgc3RhcnQsIG1hcHB0cik7CisJcmV0dXJuIC0xOworCitmb3VuZDoKKwl7CisJCWludCBsZW5ndGggPSBtYXBwdHIgLSBzdGFydDsKKwkJaWYgKCpvZmZzZXQgPj0gbGVuZ3RoKSB7CisJCQkqb2Zmc2V0IC09IGxlbmd0aDsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwl9CisJcmV0dXJuIHN0YXJ0ICsgKm9mZnNldDsKK30KKworLyoKKyAqIFNjYW4gdGhlIGZyZWUgc3BhY2UgbWFwLCBmb3IgdGhpcyB6b25lLCBjYWxjdWxhdGluZyB0aGUgdG90YWwKKyAqIG51bWJlciBvZiBtYXAgYml0cyBpbiBlYWNoIGZyZWUgc3BhY2UgZnJhZ21lbnQuCisgKgorICogTm90ZTogaWRtYXNrIGlzIGxpbWl0ZWQgdG8gMTUgYml0cyBbMy4yXQorICovCitzdGF0aWMgdW5zaWduZWQgaW50CitzY2FuX2ZyZWVfbWFwKHN0cnVjdCBhZGZzX3NiX2luZm8gKmFzYiwgc3RydWN0IGFkZnNfZGlzY21hcCAqZG0pCit7CisJY29uc3QgdW5zaWduZWQgaW50IG1hcHNpemUgPSBkbS0+ZG1fZW5kYml0ICsgMzI7CisJY29uc3QgdW5zaWduZWQgaW50IGlkbGVuICA9IGFzYi0+c19pZGxlbjsKKwljb25zdCB1bnNpZ25lZCBpbnQgZnJhZ19pZGxlbiA9IGlkbGVuIDw9IDE1ID8gaWRsZW4gOiAxNTsKKwljb25zdCB1MzIgaWRtYXNrID0gKDEgPDwgZnJhZ19pZGxlbikgLSAxOworCXVuc2lnbmVkIGNoYXIgKm1hcCA9IGRtLT5kbV9iaC0+Yl9kYXRhOworCXVuc2lnbmVkIGludCBzdGFydCA9IDgsIG1hcHB0cjsKKwl1MzIgZnJhZzsKKwl1bnNpZ25lZCBsb25nIHRvdGFsID0gMDsKKworCS8qCisJICogZ2V0IGZyYWdtZW50IGlkCisJICovCisJZnJhZyA9IEdFVF9GUkFHX0lEKG1hcCwgc3RhcnQsIGlkbWFzayk7CisKKwkvKgorCSAqIElmIHRoZSBmcmVlbGluayBpcyBudWxsLCB0aGVuIG5vIGZyZWUgZnJhZ21lbnRzCisJICogZXhpc3QgaW4gdGhpcyB6b25lLgorCSAqLworCWlmIChmcmFnID09IDApCisJCXJldHVybiAwOworCisJZG8geworCQlzdGFydCArPSBmcmFnOworCisJCS8qCisJCSAqIGdldCBmcmFnbWVudCBpZAorCQkgKi8KKwkJZnJhZyA9IEdFVF9GUkFHX0lEKG1hcCwgc3RhcnQsIGlkbWFzayk7CisJCW1hcHB0ciA9IHN0YXJ0ICsgaWRsZW47CisKKwkJLyoKKwkJICogZmluZCBlbmQgb2YgZnJhZ21lbnQKKwkJICovCisJCXsKKwkJCV9fbGUzMiAqX21hcCA9IChfX2xlMzIgKiltYXA7CisJCQl1MzIgdiA9IGxlMzJfdG9fY3B1KF9tYXBbbWFwcHRyID4+IDVdKSA+PiAobWFwcHRyICYgMzEpOworCQkJd2hpbGUgKHYgPT0gMCkgeworCQkJCW1hcHB0ciA9IChtYXBwdHIgJiB+MzEpICsgMzI7CisJCQkJaWYgKG1hcHB0ciA+PSBtYXBzaXplKQorCQkJCQlnb3RvIGVycm9yOworCQkJCXYgPSBsZTMyX3RvX2NwdShfbWFwW21hcHB0ciA+PiA1XSk7CisJCQl9CisKKwkJCW1hcHB0ciArPSAxICsgZmZ6KH52KTsKKwkJfQorCisJCXRvdGFsICs9IG1hcHB0ciAtIHN0YXJ0OworCX0gd2hpbGUgKGZyYWcgPj0gaWRsZW4gKyAxKTsKKworCWlmIChmcmFnICE9IDApCisJCXByaW50ayhLRVJOX0VSUiAiYWRmczogdW5kZXJzaXplZCBmcmVlIGZyYWdtZW50XG4iKTsKKworCXJldHVybiB0b3RhbDsKK2Vycm9yOgorCXByaW50ayhLRVJOX0VSUiAiYWRmczogb3ZlcnNpemVkIGZyZWUgZnJhZ21lbnRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzY2FuX21hcChzdHJ1Y3QgYWRmc19zYl9pbmZvICphc2IsIHVuc2lnbmVkIGludCB6b25lLAorCSBjb25zdCB1bnNpZ25lZCBpbnQgZnJhZ19pZCwgdW5zaWduZWQgaW50IG1hcG9mZikKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgaWRsZW4gPSBhc2ItPnNfaWRsZW47CisJc3RydWN0IGFkZnNfZGlzY21hcCAqZG0sICpkbV9lbmQ7CisJaW50IHJlc3VsdDsKKworCWRtCT0gYXNiLT5zX21hcCArIHpvbmU7CisJem9uZQk9IGFzYi0+c19tYXBfc2l6ZTsKKwlkbV9lbmQJPSBhc2ItPnNfbWFwICsgem9uZTsKKworCWRvIHsKKwkJcmVzdWx0ID0gbG9va3VwX3pvbmUoZG0sIGlkbGVuLCBmcmFnX2lkLCAmbWFwb2ZmKTsKKworCQlpZiAocmVzdWx0ICE9IC0xKQorCQkJZ290byBmb3VuZDsKKworCQlkbSArKzsKKwkJaWYgKGRtID09IGRtX2VuZCkKKwkJCWRtID0gYXNiLT5zX21hcDsKKwl9IHdoaWxlICgtLXpvbmUgPiAwKTsKKworCXJldHVybiAtMTsKK2ZvdW5kOgorCXJlc3VsdCAtPSBkbS0+ZG1fc3RhcnRiaXQ7CisJcmVzdWx0ICs9IGRtLT5kbV9zdGFydGJsazsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBjYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBmcmVlIGJsb2NrcyBpbiB0aGUgbWFwLgorICoKKyAqICAgICAgICAgICAgICBuPTEKKyAqICB0b3RhbF9mcmVlID0gRShmcmVlX2luX3pvbmVfbikKKyAqICAgICAgICAgICAgICBuem9uZXMKKyAqLwordW5zaWduZWQgaW50CithZGZzX21hcF9mcmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGFkZnNfc2JfaW5mbyAqYXNiID0gQURGU19TQihzYik7CisJc3RydWN0IGFkZnNfZGlzY21hcCAqZG07CisJdW5zaWduZWQgaW50IHRvdGFsID0gMDsKKwl1bnNpZ25lZCBpbnQgem9uZTsKKworCWRtICAgPSBhc2ItPnNfbWFwOworCXpvbmUgPSBhc2ItPnNfbWFwX3NpemU7CisKKwlkbyB7CisJCXRvdGFsICs9IHNjYW5fZnJlZV9tYXAoYXNiLCBkbSsrKTsKKwl9IHdoaWxlICgtLXpvbmUgPiAwKTsKKworCXJldHVybiBzaWduZWRfYXNsKHRvdGFsLCBhc2ItPnNfbWFwMmJsayk7Cit9CisKK2ludAorYWRmc19tYXBfbG9va3VwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBmcmFnX2lkLAorCQl1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBhZGZzX3NiX2luZm8gKmFzYiA9IEFERlNfU0Ioc2IpOworCXVuc2lnbmVkIGludCB6b25lLCBtYXBvZmY7CisJaW50IHJlc3VsdDsKKworCS8qCisJICogbWFwICYgcm9vdCBmcmFnbWVudCBpcyBzcGVjaWFsIC0gaXQgc3RhcnRzIGluIHRoZSBjZW50ZXIgb2YgdGhlCisJICogZGlzay4gIFRoZSBvdGhlciBmcmFnbWVudHMgc3RhcnQgYXQgem9uZSAoZnJhZyAvIGlkc19wZXJfem9uZSkKKwkgKi8KKwlpZiAoZnJhZ19pZCA9PSBBREZTX1JPT1RfRlJBRykKKwkJem9uZSA9IGFzYi0+c19tYXBfc2l6ZSA+PiAxOworCWVsc2UKKwkJem9uZSA9IGZyYWdfaWQgLyBhc2ItPnNfaWRzX3Blcl96b25lOworCisJaWYgKHpvbmUgPj0gYXNiLT5zX21hcF9zaXplKQorCQlnb3RvIGJhZF9mcmFnbWVudDsKKworCS8qIENvbnZlcnQgc2VjdG9yIG9mZnNldCB0byBtYXAgb2Zmc2V0ICovCisJbWFwb2ZmID0gc2lnbmVkX2FzbChvZmZzZXQsIC1hc2ItPnNfbWFwMmJsayk7CisKKwlyZWFkX2xvY2soJmFkZnNfbWFwX2xvY2spOworCXJlc3VsdCA9IHNjYW5fbWFwKGFzYiwgem9uZSwgZnJhZ19pZCwgbWFwb2ZmKTsKKwlyZWFkX3VubG9jaygmYWRmc19tYXBfbG9jayk7CisKKwlpZiAocmVzdWx0ID4gMCkgeworCQl1bnNpZ25lZCBpbnQgc2Vjb2ZmOworCisJCS8qIENhbGN1bGF0ZSBzZWN0b3Igb2Zmc2V0IGludG8gbWFwIGJsb2NrICovCisJCXNlY29mZiA9IG9mZnNldCAtIHNpZ25lZF9hc2wobWFwb2ZmLCBhc2ItPnNfbWFwMmJsayk7CisJCXJldHVybiBzZWNvZmYgKyBzaWduZWRfYXNsKHJlc3VsdCwgYXNiLT5zX21hcDJibGspOworCX0KKworCWFkZnNfZXJyb3Ioc2IsICJmcmFnbWVudCAweCUwNHggYXQgb2Zmc2V0ICVkIG5vdCBmb3VuZCBpbiBtYXAiLAorCQkgICBmcmFnX2lkLCBvZmZzZXQpOworCXJldHVybiAwOworCitiYWRfZnJhZ21lbnQ6CisJYWRmc19lcnJvcihzYiwgImludmFsaWQgZnJhZ21lbnQgMHglMDR4ICh6b25lID0gJWQsIG1heCA9ICVkKSIsCisJCSAgIGZyYWdfaWQsIHpvbmUsIGFzYi0+c19tYXBfc2l6ZSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9hZGZzL3N1cGVyLmMgYi9mcy9hZGZzL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzOTYzMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2FkZnMvc3VwZXIuYwpAQCAtMCwwICsxLDUwOCBAQAorLyoKKyAqICBsaW51eC9mcy9hZGZzL3N1cGVyLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTE5OTkgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9hZGZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAiYWRmcy5oIgorI2luY2x1ZGUgImRpcl9mLmgiCisjaW5jbHVkZSAiZGlyX2ZwbHVzLmgiCisKK3ZvaWQgX19hZGZzX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwljaGFyIGVycm9yX2J1ZlsxMjhdOworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnNwcmludGYoZXJyb3JfYnVmLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCXByaW50ayhLRVJOX0NSSVQgIkFERlMtZnMgZXJyb3IgKGRldmljZSAlcyklcyVzOiAlc1xuIiwKKwkJc2ItPnNfaWQsIGZ1bmN0aW9uID8gIjogIiA6ICIiLAorCQlmdW5jdGlvbiA/IGZ1bmN0aW9uIDogIiIsIGVycm9yX2J1Zik7Cit9CisKK3N0YXRpYyBpbnQgYWRmc19jaGVja2Rpc2NyZWNvcmQoc3RydWN0IGFkZnNfZGlzY3JlY29yZCAqZHIpCit7CisJaW50IGk7CisKKwkvKiBzZWN0b3Igc2l6ZSBtdXN0IGJlIDI1NiwgNTEyIG9yIDEwMjQgYnl0ZXMgKi8KKwlpZiAoZHItPmxvZzJzZWNzaXplICE9IDggJiYKKwkgICAgZHItPmxvZzJzZWNzaXplICE9IDkgJiYKKwkgICAgZHItPmxvZzJzZWNzaXplICE9IDEwKQorCQlyZXR1cm4gMTsKKworCS8qIGlkbGVuIG11c3QgYmUgYXQgbGVhc3QgbG9nMnNlY3NpemUgKyAzICovCisJaWYgKGRyLT5pZGxlbiA8IGRyLT5sb2cyc2Vjc2l6ZSArIDMpCisJCXJldHVybiAxOworCisJLyogd2UgY2Fubm90IGhhdmUgc3VjaCBhIGxhcmdlIGRpc2MgdGhhdCB3ZQorCSAqIGFyZSB1bmFibGUgdG8gcmVwcmVzZW50IHNlY3RvciBvZmZzZXRzIGluCisJICogMzIgYml0cy4gIFRoaXMgd29ya3Mgb3V0IGF0IDIuMCBUQi4KKwkgKi8KKwlpZiAobGUzMl90b19jcHUoZHItPmRpc2Nfc2l6ZV9oaWdoKSA+PiBkci0+bG9nMnNlY3NpemUpCisJCXJldHVybiAxOworCisJLyogaWRsZW4gbXVzdCBiZSBubyBncmVhdGVyIHRoYW4gMTkgdjIgWzEuMF0gKi8KKwlpZiAoZHItPmlkbGVuID4gMTkpCisJCXJldHVybiAxOworCisJLyogcmVzZXJ2ZWQgYnl0ZXMgc2hvdWxkIGJlIHplcm8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGRyLT51bnVzZWQ1Mik7IGkrKykKKwkJaWYgKGRyLT51bnVzZWQ1MltpXSAhPSAwKQorCQkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYWRmc19jYWxjem9uZWNoZWNrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGNoYXIgKm1hcCkKK3sKKwl1bnNpZ25lZCBpbnQgdjAsIHYxLCB2MiwgdjM7CisJaW50IGk7CisKKwl2MCA9IHYxID0gdjIgPSB2MyA9IDA7CisJZm9yIChpID0gc2ItPnNfYmxvY2tzaXplIC0gNDsgaTsgaSAtPSA0KSB7CisJCXYwICs9IG1hcFtpXSAgICAgKyAodjMgPj4gOCk7CisJCXYzICY9IDB4ZmY7CisJCXYxICs9IG1hcFtpICsgMV0gKyAodjAgPj4gOCk7CisJCXYwICY9IDB4ZmY7CisJCXYyICs9IG1hcFtpICsgMl0gKyAodjEgPj4gOCk7CisJCXYxICY9IDB4ZmY7CisJCXYzICs9IG1hcFtpICsgM10gKyAodjIgPj4gOCk7CisJCXYyICY9IDB4ZmY7CisJfQorCXYwICs9ICAgICAgICAgICB2MyA+PiA4OworCXYxICs9IG1hcFsxXSArICh2MCA+PiA4KTsKKwl2MiArPSBtYXBbMl0gKyAodjEgPj4gOCk7CisJdjMgKz0gbWFwWzNdICsgKHYyID4+IDgpOworCisJcmV0dXJuIHYwIF4gdjEgXiB2MiBeIHYzOworfQorCitzdGF0aWMgaW50IGFkZnNfY2hlY2ttYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGFkZnNfZGlzY21hcCAqZG0pCit7CisJdW5zaWduZWQgY2hhciBjcm9zc2NoZWNrID0gMCwgem9uZWNoZWNrID0gMTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBREZTX1NCKHNiKS0+c19tYXBfc2l6ZTsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgKm1hcDsKKworCQltYXAgPSBkbVtpXS5kbV9iaC0+Yl9kYXRhOworCisJCWlmIChhZGZzX2NhbGN6b25lY2hlY2soc2IsIG1hcCkgIT0gbWFwWzBdKSB7CisJCQlhZGZzX2Vycm9yKHNiLCAiem9uZSAlZCBmYWlscyB6b25lY2hlY2siLCBpKTsKKwkJCXpvbmVjaGVjayA9IDA7CisJCX0KKwkJY3Jvc3NjaGVjayBePSBtYXBbM107CisJfQorCWlmIChjcm9zc2NoZWNrICE9IDB4ZmYpCisJCWFkZnNfZXJyb3Ioc2IsICJjcm9zc2NoZWNrICE9IDB4ZmYiKTsKKwlyZXR1cm4gY3Jvc3NjaGVjayA9PSAweGZmICYmIHpvbmVjaGVjazsKK30KKworc3RhdGljIHZvaWQgYWRmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYWRmc19zYl9pbmZvICphc2IgPSBBREZTX1NCKHNiKTsKKworCWZvciAoaSA9IDA7IGkgPCBhc2ItPnNfbWFwX3NpemU7IGkrKykKKwkJYnJlbHNlKGFzYi0+c19tYXBbaV0uZG1fYmgpOworCWtmcmVlKGFzYi0+c19tYXApOworCWtmcmVlKGFzYik7CisJc2ItPnNfZnNfaW5mbyA9IE5VTEw7Cit9CisKK2VudW0ge09wdF91aWQsIE9wdF9naWQsIE9wdF9vd25tYXNrLCBPcHRfb3RobWFzaywgT3B0X2Vycn07CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7T3B0X3VpZCwgInVpZD0ldSJ9LAorCXtPcHRfZ2lkLCAiZ2lkPSV1In0sCisJe09wdF9vd25tYXNrLCAib3dubWFzaz0lbyJ9LAorCXtPcHRfb3RobWFzaywgIm90aG1hc2s9JW8ifSwKKwl7T3B0X2VyciwgTlVMTH0KK307CisKK3N0YXRpYyBpbnQgcGFyc2Vfb3B0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpvcHRpb25zKQoreworCWNoYXIgKnA7CisJc3RydWN0IGFkZnNfc2JfaW5mbyAqYXNiID0gQURGU19TQihzYik7CisJaW50IG9wdGlvbjsKKworCWlmICghb3B0aW9ucykKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCQlpbnQgdG9rZW47CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJY2FzZSBPcHRfdWlkOgorCQkJaWYgKG1hdGNoX2ludChhcmdzLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWFzYi0+c191aWQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZ2lkOgorCQkJaWYgKG1hdGNoX2ludChhcmdzLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWFzYi0+c19naWQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfb3dubWFzazoKKwkJCWlmIChtYXRjaF9vY3RhbChhcmdzLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWFzYi0+c19vd25lcl9tYXNrID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X290aG1hc2s6CisJCQlpZiAobWF0Y2hfb2N0YWwoYXJncywgJm9wdGlvbikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlhc2ItPnNfb3RoZXJfbWFzayA9IG9wdGlvbjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJBREZTLWZzOiB1bnJlY29nbmlzZWQgbW91bnQgb3B0aW9uIFwiJXNcIiAiCisJCQkJCSJvciBtaXNzaW5nIHZhbHVlXG4iLCBwKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZnNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCSpmbGFncyB8PSBNU19OT0RJUkFUSU1FOworCXJldHVybiBwYXJzZV9vcHRpb25zKHNiLCBkYXRhKTsKK30KKworc3RhdGljIGludCBhZGZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCXN0cnVjdCBhZGZzX3NiX2luZm8gKmFzYiA9IEFERlNfU0Ioc2IpOworCisJYnVmLT5mX3R5cGUgICAgPSBBREZTX1NVUEVSX01BR0lDOworCWJ1Zi0+Zl9uYW1lbGVuID0gYXNiLT5zX25hbWVsZW47CisJYnVmLT5mX2JzaXplICAgPSBzYi0+c19ibG9ja3NpemU7CisJYnVmLT5mX2Jsb2NrcyAgPSBhc2ItPnNfc2l6ZTsKKwlidWYtPmZfZmlsZXMgICA9IGFzYi0+c19pZHNfcGVyX3pvbmUgKiBhc2ItPnNfbWFwX3NpemU7CisJYnVmLT5mX2JhdmFpbCAgPQorCWJ1Zi0+Zl9iZnJlZSAgID0gYWRmc19tYXBfZnJlZShzYik7CisJYnVmLT5mX2ZmcmVlICAgPSAobG9uZykoYnVmLT5mX2JmcmVlICogYnVmLT5mX2ZpbGVzKSAvIChsb25nKWJ1Zi0+Zl9ibG9ja3M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGttZW1fY2FjaGVfdCAqYWRmc19pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmFkZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgYWRmc19pbm9kZV9pbmZvICplaTsKKwllaSA9IChzdHJ1Y3QgYWRmc19pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhhZGZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghZWkpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmZWktPnZmc19pbm9kZTsKK30KKworc3RhdGljIHZvaWQgYWRmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJa21lbV9jYWNoZV9mcmVlKGFkZnNfaW5vZGVfY2FjaGVwLCBBREZTX0koaW5vZGUpKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgYWRmc19pbm9kZV9pbmZvICplaSA9IChzdHJ1Y3QgYWRmc19pbm9kZV9pbmZvICopIGZvbzsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQorCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpCisJCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7Cit9CisgCitzdGF0aWMgaW50IGluaXRfaW5vZGVjYWNoZSh2b2lkKQoreworCWFkZnNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImFkZnNfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgYWRmc19pbm9kZV9pbmZvKSwKKwkJCQkJICAgICAwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQkJICAgICBpbml0X29uY2UsIE5VTEwpOworCWlmIChhZGZzX2lub2RlX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCit7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShhZGZzX2lub2RlX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX0lORk8gImFkZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGFkZnNfc29wcyA9IHsKKwkuYWxsb2NfaW5vZGUJPSBhZGZzX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gYWRmc19kZXN0cm95X2lub2RlLAorCS53cml0ZV9pbm9kZQk9IGFkZnNfd3JpdGVfaW5vZGUsCisJLnB1dF9zdXBlcgk9IGFkZnNfcHV0X3N1cGVyLAorCS5zdGF0ZnMJCT0gYWRmc19zdGF0ZnMsCisJLnJlbW91bnRfZnMJPSBhZGZzX3JlbW91bnQsCit9OworCitzdGF0aWMgc3RydWN0IGFkZnNfZGlzY21hcCAqYWRmc19yZWFkX21hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYWRmc19kaXNjcmVjb3JkICpkcikKK3sKKwlzdHJ1Y3QgYWRmc19kaXNjbWFwICpkbTsKKwl1bnNpZ25lZCBpbnQgbWFwX2FkZHIsIHpvbmVfc2l6ZSwgbnpvbmVzOworCWludCBpLCB6b25lOworCXN0cnVjdCBhZGZzX3NiX2luZm8gKmFzYiA9IEFERlNfU0Ioc2IpOworCisJbnpvbmVzICAgID0gYXNiLT5zX21hcF9zaXplOworCXpvbmVfc2l6ZSA9ICg4IDw8IGRyLT5sb2cyc2Vjc2l6ZSkgLSBsZTE2X3RvX2NwdShkci0+em9uZV9zcGFyZSk7CisJbWFwX2FkZHIgID0gKG56b25lcyA+PiAxKSAqIHpvbmVfc2l6ZSAtCisJCSAgICAgKChuem9uZXMgPiAxKSA/IEFERlNfRFJfU0laRV9CSVRTIDogMCk7CisJbWFwX2FkZHIgID0gc2lnbmVkX2FzbChtYXBfYWRkciwgYXNiLT5zX21hcDJibGspOworCisJYXNiLT5zX2lkc19wZXJfem9uZSA9IHpvbmVfc2l6ZSAvIChhc2ItPnNfaWRsZW4gKyAxKTsKKworCWRtID0ga21hbGxvYyhuem9uZXMgKiBzaXplb2YoKmRtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRtID09IE5VTEwpIHsKKwkJYWRmc19lcnJvcihzYiwgIm5vdCBlbm91Z2ggbWVtb3J5Iik7CisJCXJldHVybiBOVUxMOworCX0KKworCWZvciAoem9uZSA9IDA7IHpvbmUgPCBuem9uZXM7IHpvbmUrKywgbWFwX2FkZHIrKykgeworCQlkbVt6b25lXS5kbV9zdGFydGJpdCA9IDA7CisJCWRtW3pvbmVdLmRtX2VuZGJpdCAgID0gem9uZV9zaXplOworCQlkbVt6b25lXS5kbV9zdGFydGJsayA9IHpvbmUgKiB6b25lX3NpemUgLSBBREZTX0RSX1NJWkVfQklUUzsKKwkJZG1bem9uZV0uZG1fYmggICAgICAgPSBzYl9icmVhZChzYiwgbWFwX2FkZHIpOworCisJCWlmICghZG1bem9uZV0uZG1fYmgpIHsKKwkJCWFkZnNfZXJyb3Ioc2IsICJ1bmFibGUgdG8gcmVhZCBtYXAiKTsKKwkJCWdvdG8gZXJyb3JfZnJlZTsKKwkJfQorCX0KKworCS8qIGFkanVzdCB0aGUgbGltaXRzIGZvciB0aGUgZmlyc3QgYW5kIGxhc3QgbWFwIHpvbmVzICovCisJaSA9IHpvbmUgLSAxOworCWRtWzBdLmRtX3N0YXJ0YmxrID0gMDsKKwlkbVswXS5kbV9zdGFydGJpdCA9IEFERlNfRFJfU0laRV9CSVRTOworCWRtW2ldLmRtX2VuZGJpdCAgID0gKGxlMzJfdG9fY3B1KGRyLT5kaXNjX3NpemVfaGlnaCkgPDwgKDMyIC0gZHItPmxvZzJicG1iKSkgKworCQkJICAgIChsZTMyX3RvX2NwdShkci0+ZGlzY19zaXplKSA+PiBkci0+bG9nMmJwbWIpICsKKwkJCSAgICAoQURGU19EUl9TSVpFX0JJVFMgLSBpICogem9uZV9zaXplKTsKKworCWlmIChhZGZzX2NoZWNrbWFwKHNiLCBkbSkpCisJCXJldHVybiBkbTsKKworCWFkZnNfZXJyb3Ioc2IsIE5VTEwsICJtYXAgY29ycnVwdGVkIik7CisKK2Vycm9yX2ZyZWU6CisJd2hpbGUgKC0tem9uZSA+PSAwKQorCQlicmVsc2UoZG1bem9uZV0uZG1fYmgpOworCisJa2ZyZWUoZG0pOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYWRmc19kaXNjc2l6ZShzdHJ1Y3QgYWRmc19kaXNjcmVjb3JkICpkciwgaW50IGJsb2NrX2JpdHMpCit7CisJdW5zaWduZWQgbG9uZyBkaXNjc2l6ZTsKKworCWRpc2NzaXplICA9IGxlMzJfdG9fY3B1KGRyLT5kaXNjX3NpemVfaGlnaCkgPDwgKDMyIC0gYmxvY2tfYml0cyk7CisJZGlzY3NpemUgfD0gbGUzMl90b19jcHUoZHItPmRpc2Nfc2l6ZSkgPj4gYmxvY2tfYml0czsKKworCXJldHVybiBkaXNjc2l6ZTsKK30KKworc3RhdGljIGludCBhZGZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgYWRmc19kaXNjcmVjb3JkICpkcjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBvYmplY3RfaW5mbyByb290X29iajsKKwl1bnNpZ25lZCBjaGFyICpiX2RhdGE7CisJc3RydWN0IGFkZnNfc2JfaW5mbyAqYXNiOworCXN0cnVjdCBpbm9kZSAqcm9vdDsKKworCXNiLT5zX2ZsYWdzIHw9IE1TX05PRElSQVRJTUU7CisKKwlhc2IgPSBrbWFsbG9jKHNpemVvZigqYXNiKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhc2IpCisJCXJldHVybiAtRU5PTUVNOworCXNiLT5zX2ZzX2luZm8gPSBhc2I7CisJbWVtc2V0KGFzYiwgMCwgc2l6ZW9mKCphc2IpKTsKKworCS8qIHNldCBkZWZhdWx0IG9wdGlvbnMgKi8KKwlhc2ItPnNfdWlkID0gMDsKKwlhc2ItPnNfZ2lkID0gMDsKKwlhc2ItPnNfb3duZXJfbWFzayA9IFNfSVJXWFU7CisJYXNiLT5zX290aGVyX21hc2sgPSBTX0lSV1hHIHwgU19JUldYTzsKKworCWlmIChwYXJzZV9vcHRpb25zKHNiLCBkYXRhKSkKKwkJZ290byBlcnJvcjsKKworCXNiX3NldF9ibG9ja3NpemUoc2IsIEJMT0NLX1NJWkUpOworCWlmICghKGJoID0gc2JfYnJlYWQoc2IsIEFERlNfRElTQ1JFQ09SRCAvIEJMT0NLX1NJWkUpKSkgeworCQlhZGZzX2Vycm9yKHNiLCAidW5hYmxlIHRvIHJlYWQgc3VwZXJibG9jayIpOworCQlnb3RvIGVycm9yOworCX0KKworCWJfZGF0YSA9IGJoLT5iX2RhdGEgKyAoQURGU19ESVNDUkVDT1JEICUgQkxPQ0tfU0laRSk7CisKKwlpZiAoYWRmc19jaGVja2JibGsoYl9kYXRhKSkgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50aygiVkZTOiBDYW4ndCBmaW5kIGFuIGFkZnMgZmlsZXN5c3RlbSBvbiBkZXYgIgorCQkJCSIlcy5cbiIsIHNiLT5zX2lkKTsKKwkJZ290byBlcnJvcl9mcmVlX2JoOworCX0KKworCWRyID0gKHN0cnVjdCBhZGZzX2Rpc2NyZWNvcmQgKikoYl9kYXRhICsgQURGU19EUl9PRkZTRVQpOworCisJLyoKKwkgKiBEbyBzb21lIHNhbml0eSBjaGVja3Mgb24gdGhlIEFERlMgZGlzYyByZWNvcmQKKwkgKi8KKwlpZiAoYWRmc19jaGVja2Rpc2NyZWNvcmQoZHIpKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKCJWUFM6IENhbid0IGZpbmQgYW4gYWRmcyBmaWxlc3lzdGVtIG9uIGRldiAiCisJCQkJIiVzLlxuIiwgc2ItPnNfaWQpOworCQlnb3RvIGVycm9yX2ZyZWVfYmg7CisJfQorCisJYnJlbHNlKGJoKTsKKwlpZiAoc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgMSA8PCBkci0+bG9nMnNlY3NpemUpKSB7CisJCWJoID0gc2JfYnJlYWQoc2IsIEFERlNfRElTQ1JFQ09SRCAvIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJCWlmICghYmgpIHsKKwkJCWFkZnNfZXJyb3Ioc2IsICJjb3VsZG4ndCByZWFkIHN1cGVyYmxvY2sgb24gIgorCQkJCSIybmQgdHJ5LiIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQliX2RhdGEgPSBiaC0+Yl9kYXRhICsgKEFERlNfRElTQ1JFQ09SRCAlIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJCWlmIChhZGZzX2NoZWNrYmJsayhiX2RhdGEpKSB7CisJCQlhZGZzX2Vycm9yKHNiLCAiZGlzYyByZWNvcmQgbWlzbWF0Y2gsIHZlcnkgd2VpcmQhIik7CisJCQlnb3RvIGVycm9yX2ZyZWVfYmg7CisJCX0KKwkJZHIgPSAoc3RydWN0IGFkZnNfZGlzY3JlY29yZCAqKShiX2RhdGEgKyBBREZTX0RSX09GRlNFVCk7CisJfSBlbHNlIHsKKwkJaWYgKCFzaWxlbnQpCisJCQlwcmludGsoS0VSTl9FUlIgIlZGUzogVW5zdXBwb3J0ZWQgYmxvY2tzaXplIG9uIGRldiAiCisJCQkJIiVzLlxuIiwgc2ItPnNfaWQpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qCisJICogYmxvY2tzaXplIG9uIHRoaXMgZGV2aWNlIHNob3VsZCBub3cgYmUgc2V0IHRvIHRoZSBBREZTIGxvZzJzZWNzaXplCisJICovCisKKwlzYi0+c19tYWdpYwkJPSBBREZTX1NVUEVSX01BR0lDOworCWFzYi0+c19pZGxlbgkJPSBkci0+aWRsZW47CisJYXNiLT5zX21hcF9zaXplCQk9IGRyLT5uem9uZXMgfCAoZHItPm56b25lc19oaWdoIDw8IDgpOworCWFzYi0+c19tYXAyYmxrCQk9IGRyLT5sb2cyYnBtYiAtIGRyLT5sb2cyc2Vjc2l6ZTsKKwlhc2ItPnNfc2l6ZSAgICAJCT0gYWRmc19kaXNjc2l6ZShkciwgc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCWFzYi0+c192ZXJzaW9uIAkJPSBkci0+Zm9ybWF0X3ZlcnNpb247CisJYXNiLT5zX2xvZzJzaGFyZXNpemUJPSBkci0+bG9nMnNoYXJlc2l6ZTsKKwkKKwlhc2ItPnNfbWFwID0gYWRmc19yZWFkX21hcChzYiwgZHIpOworCWlmICghYXNiLT5zX21hcCkKKwkJZ290byBlcnJvcl9mcmVlX2JoOworCisJYnJlbHNlKGJoKTsKKworCS8qCisJICogc2V0IHVwIGVub3VnaCBzbyB0aGF0IHdlIGNhbiByZWFkIGFuIGlub2RlCisJICovCisJc2ItPnNfb3AgPSAmYWRmc19zb3BzOworCisJZHIgPSAoc3RydWN0IGFkZnNfZGlzY3JlY29yZCAqKShhc2ItPnNfbWFwWzBdLmRtX2JoLT5iX2RhdGEgKyA0KTsKKworCXJvb3Rfb2JqLnBhcmVudF9pZCA9IHJvb3Rfb2JqLmZpbGVfaWQgPSBsZTMyX3RvX2NwdShkci0+cm9vdCk7CisJcm9vdF9vYmoubmFtZV9sZW4gID0gMDsKKwlyb290X29iai5sb2FkYWRkciAgPSAwOworCXJvb3Rfb2JqLmV4ZWNhZGRyICA9IDA7CisJcm9vdF9vYmouc2l6ZQkgICA9IEFERlNfTkVXRElSX1NJWkU7CisJcm9vdF9vYmouYXR0cgkgICA9IEFERlNfTkRBX0RJUkVDVE9SWSAgIHwgQURGU19OREFfT1dORVJfUkVBRCB8CisJCQkgICAgIEFERlNfTkRBX09XTkVSX1dSSVRFIHwgQURGU19OREFfUFVCTElDX1JFQUQ7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBGKyBkaXNrIHdpdGggdmFyaWFibGUgbGVuZ3RoIGRpcmVjdG9yaWVzLAorCSAqIGdldCB0aGUgcm9vdF9zaXplIGZyb20gdGhlIGRpc2MgcmVjb3JkLgorCSAqLworCWlmIChhc2ItPnNfdmVyc2lvbikgeworCQlyb290X29iai5zaXplID0gbGUzMl90b19jcHUoZHItPnJvb3Rfc2l6ZSk7CisJCWFzYi0+c19kaXIgICAgID0gJmFkZnNfZnBsdXNfZGlyX29wczsKKwkJYXNiLT5zX25hbWVsZW4gPSBBREZTX0ZQTFVTX05BTUVfTEVOOworCX0gZWxzZSB7CisJCWFzYi0+c19kaXIgICAgID0gJmFkZnNfZl9kaXJfb3BzOworCQlhc2ItPnNfbmFtZWxlbiA9IEFERlNfRl9OQU1FX0xFTjsKKwl9CisKKwlyb290ID0gYWRmc19pZ2V0KHNiLCAmcm9vdF9vYmopOworCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CisJaWYgKCFzYi0+c19yb290KSB7CisJCWludCBpOworCQlpcHV0KHJvb3QpOworCQlmb3IgKGkgPSAwOyBpIDwgYXNiLT5zX21hcF9zaXplOyBpKyspCisJCQlicmVsc2UoYXNiLT5zX21hcFtpXS5kbV9iaCk7CisJCWtmcmVlKGFzYi0+c19tYXApOworCQlhZGZzX2Vycm9yKHNiLCAiZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9IGVsc2UKKwkJc2ItPnNfcm9vdC0+ZF9vcCA9ICZhZGZzX2RlbnRyeV9vcGVyYXRpb25zOworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2JoOgorCWJyZWxzZShiaCk7CitlcnJvcjoKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlrZnJlZShhc2IpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICphZGZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGFkZnNfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBhZGZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJhZGZzIiwKKwkuZ2V0X3NiCQk9IGFkZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2FkZnNfZnModm9pZCkKK3sKKwlpbnQgZXJyID0gaW5pdF9pbm9kZWNhY2hlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmFkZnNfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJcmV0dXJuIDA7CitvdXQ6CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CitvdXQxOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2FkZnNfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmFkZnNfZnNfdHlwZSk7CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfYWRmc19mcykKK21vZHVsZV9leGl0KGV4aXRfYWRmc19mcykKZGlmZiAtLWdpdCBhL2ZzL2FmZnMvQ2hhbmdlcyBiL2ZzL2FmZnMvQ2hhbmdlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjk0MDljCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZmcy9DaGFuZ2VzCkBAIC0wLDAgKzEsMzQzIEBACisoTm90ZTogSSBjb25zaWRlciB2ZXJzaW9uIG51bWJlcnMgYXMgY2hlYXAuIFRoYXQgbWVhbnMKK3RoYXQgSSBkbyBub3QgbGlrZSBudW1iZXJzIGxpa2UgMC4xIGFuZCB0aGUgbGlrZSBmb3IKK3RoaW5ncyB0aGF0IGNhbiBiZSB1c2VkIHNpbmNlIHF1aXRlIHNvbWUgdGltZS4gQnV0Cit0aGVuLCAzLjEgZG9lc24ndCBtZWFuICdwZXJmZWN0bHkgc3RhYmxlJywgdG9vLikKKworS25vd24gYnVnczoKKy0tLS0tLS0tLS0tCisKKy0gRG9lc24ndCB3b3JrIG9uIHRoZSBhbHBoYS4gVGhlIG9ubHkgNjQvMzItYml0CisgIHByb2JsZW0gdGhhdCBJJ20gYXdhcmUgb2YgKHBvaW50ZXIvaW50IGNvbnZlcnNpb24KKyAgaW4gcmVhZGRpcigpKSBnaXZlcyBjb21waWxlciB3YXJuaW5ncyBidXQgaXMKKyAgYXBwYXJlbnRseSBub3QgY2F1c2luZyB0aGUgZmFpbHVyZSwgYXMgZGlyZWN0b3J5CisgIHJlYWRzIGJhc2ljYWxseSB3b3JrIChidXQgYWxsIGZpbGVzIGFyZSBvZiBzaXplIDApLgorICBBbGFzLCBJJ3ZlIGdvdCBubyBhbHBoYSB0byBkZWJ1Zy4gOi0oCisKKy0gVGhlIHBhcnRpdGlvbiBjaGVja2VyIChkcml2ZXJzL2Jsb2NrL2dlbmhkLmMpCisgIGRvZXNuJ3Qgd29yayB3aXRoIGRldmljZXMgd2hpY2ggaGF2ZSAyNTYgYnl0ZQorICBibG9ja3MgKHNvbWUgdmVyeSBvbGQgU0NTSSBkcml2ZXMpLiAKKworLSBUaGUgZmVhdHVyZSB0byBhdXRvbWF0aWNhbGx5IG1ha2UgdGhlIGZzIGNsZWFuCisgIG1pZ2h0IGxlYXZlIGEgdHJhc2hlZCBmaWxlIHN5c3RlbSB3aXRoIHRoZQorICBiaXRtYXAgZmxhZyBzZXQgdmFsaWQuCisKKy0gV2hlbiBhIGZpbGUgaXMgdHJ1bmNhdGVkIHRvIGEgc2l6ZSB0aGF0IGlzIG5vdAorICBhIG11bHRpcGxlIG9mIHRoZSBibG9ja3NpemUsIHRoZSByZXN0IG9mIHRoZQorICBsYXN0IGFsbG9jYXRlZCBibG9jayBpcyBub3QgY2xlYXJlZC4gV2VsbCwKKyAgdGhpcyBmcyBuZXZlciBjbGFpbWVkIHRvIGJlIFBvc2l4IGNvbmZvcm1hbnQuCisKK1BsZWFzZSBkaXJlY3QgYnVnIHJlcG9ydHMgdG86IHppcHBlbEBsaW51eC1tNjhrLm9yZworCitWZXJzaW9uIDMuMjAKKy0tLS0tLS0tLS0tLQorLSBraWxsIGtlcm5lbCBsb2NrCistIGZpeCBmb3IgYSBwb3NzaWJsZSBiaXRtYXAgY29ycnVwdGlvbgorCitWZXJzaW9uIDMuMTkKKy0tLS0tLS0tLS0tLQorCistIHNpemVvZiBjaGFuZ2VzIGZyb20gS2VybmVsIEphbml0b3IgUHJvamVjdAorLSBzZXZlcmFsIGJ1ZyBmaXhlcyBmb3VuZCB3aXRoIGZzeAorCitWZXJzaW9uIDMuMTgKKy0tLS0tLS0tLS0tLQorCistIGNoYW5nZSB0byBnbG9iYWwgbWluIG1hY3JvICsgd2FybmluZyBmaXhlcworLSBhZGQgbW9kdWxlIHRhZ3MKKworVmVyc2lvbiAzLjE3CistLS0tLS0tLS0tLS0KKworLSBsb2NraW5nIGZpeGVzCistIHdyb25nIHNpZ24gaW4gX19hZmZzX2hhc2hfZGVudHJ5CistIHJlbW92ZSB1bm5lY2Vzc2FyeSBjaGVjayBpbiBhZmZzX25ld19pbm9kZQorLSBlbmFibGUgaW50ZXJuYXRpb25hbCBtb2RlIGZvciBkaXJjYWNoZSBmcworCitWZXJzaW9uIDMuMTYKKy0tLS0tLS0tLS0tLQorCistIHVzZSBtYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZSBpbnN0ZWFkIG9mIG1hcmtfYnVmZmVyX2RpcnR5LgorLSBpbnRyb2R1Y2UgYWZmc19sb2NrX3tsaW5rfGRpcnxleHR9LgorCitWZXJzaW9uIDMuMTUKKy0tLS0tLS0tLS0tLQorCistIGRpc2FibGUgbGluayB0byBkaXJlY3RvcmllcyB1bnRpbCB3ZSBjYW4gcHJvcGVybHkgc3VwcG9ydCB0aGVtLgorLSBsb2NraW5nIGZpeGVzIGZvciBsaW5rIGNyZWF0aW9uL3JlbW92YWwuCisKK1ZlcnNpb24gMy4xNAorLS0tLS0tLS0tLS0tCisKKy0gY29ycmVjdGx5IGN1dCBvZmYgbG9uZyBmaWxlIG5hbWVzIGZvciBjb21wYXJlcworLSBjb3JyZWN0bHkgaW5pdGlhbGl6ZSBzX2xhc3RfYm1hcAorCitWZXJzaW9uIDMuMTMKKy0tLS0tLS0tLS0tLQorCitNYWpvciBjbGVhbnVwIGZvciAyLjQgW1JvbWFuIFppcHBlbF0KKy0gbmV3IGV4dGVuZGVkIGJsb2NrIGhhbmRsaW5nCistIG5ldyBiaXRtYXAgYWxsb2NhdGlvbiBmdW5jdGlvbnMKKy0gbG9ja2luZyBzaG91bGQgYmUgc2FmZSBmb3IgdGhlIGZ1dHVyZQorLSBjbGVhbnVwIG9mIHNvbWUgaW50ZXJmYWNlcworCitWZXJzaW9uIDMuMTIKKy0tLS0tLS0tLS0tLQorCittb3JlIDIuNCBmaXhlczogW1JvbWFuIFppcHBlbF0KKy0gc19sb2NrIGNoYW5nZXMKKy0gaW5jcmVhc2VkIGdldGJsb2NrIG1lc3MKKy0gY2xlYXIgbWV0YSBibG9ja3MgCisKK1ZlcnNpb24gMy4xMQorLS0tLS0tLS0tLS0tCisKKy0gQ29udmVydGVkIHRvIHVzZSAyLjMueCBwYWdlIGNhY2hlIFtEYXZlIEpvbmVzIDxkYXZlQHBvd2VydHdlYWsuY29tPl0KKy0gQ29ycnVwdGlvbiBpbiB0cnVuY2F0ZSgpIGJ1Z2ZpeCBbS2VuIFR5bGVyIDxrZW50QHdlcnBsZS5uZXQuYXU+XQorCitWZXJzaW9uIDMuMTAKKy0tLS0tLS0tLS0tLQorCistIENoYW5nZWQgcGFydGl0aW9uIGNoZWNrZXIgdG8gYWxsb3cgZGV2aWNlcworICB3aXRoIHBoeXNpY2FsIGJsb2NrcyAhPSA1MTIgYnl0ZXMuCisKKy0gVGhlIHBhcnRpdGlvbiBjaGVja2VyIG5vdyBhbHNvIGlnbm9yZXMgdGhlCisgIHdvcmQgYXQgMHhkMCB0aGF0IFdpbmRvd3MgbGlrZXMgdG8gd3JpdGUgdG8uCisKK1ZlcnNpb24gMy45CistLS0tLS0tLS0tLQorCistIE1vdmVkIGNsZWFudXAgZnJvbSByZWxlYXNlX2ZpbGUoKSB0byBwdXRfaW5vZGUoKS4KKyAgVGhpcyBtYWtlcyB0aGUgZmlyc3Qgb25lIG9ic29sZXRlLgorCistIHRydW5jYXRlKCkgemVyb2VzIHRoZSB1bnVzZWQgcmVtYWluZGVyIG9mIGEKKyAgcGFydGlhbGx5IHVzZWQgbGFzdCBibG9jayB3aGVuIGEgZmlsZSBpcyB0cnVuY2F0ZWQuCisgIEl0IGFsc28gbWFya3MgdGhlIGlub2RlIGRpcnR5IG5vdyAod2hpY2ggaXMgbm90CisgIHJlYWxseSBuZWNlc3NhcnkgYXMgbm90aWZ5X2NoYW5nZSgpIHdpbGwgZG8KKyAgaXQgYW55d2F5KS4KKworLSBBZGRlZCBhIGZldyBjb21tZW50cywgZml4ZWQgc29tZSB0eXBvcyAoYW5kCisgIGludHJvZHVjZWQgc29tZSBuZXcgb25lcyksIG1hZGUgdGhlIGRlYnVnIG1lc3NhZ2VzCisgIG1vcmUgY29uc2lzdGVudC4gQ2hhbmdlZCBhIGJhZCBleGFtcGxlIGluIHRoZQorICBkb2MgZmlsZSAoYWZmcy50eHQpLgorCistIFNldHMgdGhlIE5PRVhFQyBmbGFnIGluIHJlYWRfc3VwZXIoKSBmb3Igb2xkIGZpbGUKKyAgc3lzdGVtcywgc2luY2UgeW91IGNhbid0IHJ1biBwcm9ncmFtcyBvbiB0aGVtLgorCitWZXJzaW9uIDMuOAorLS0tLS0tLS0tLS0KK0JpbGwgSGF3ZXMga2luZGx5IHJldmlld2VkIHRoZSBhZmZzIGFuZCBzZW50IG1lIHRoZQorcGF0Y2hlcyBoZSBkaWQuIFRoZXkncmUgbWFya2VkIChCSCkuIFRoYW5rcywgQmlsbCEKKworLSBDbGVhbnVwIG9mIGVycm9yIGhhbmRsaW5nIGluIHJlYWRfc3VwZXIoKS4KKyAgRGlkbid0IHJlbGVhc2UgYWxsIHJlc291cmNlcyBpbiBjYXNlIG9mIGFuCisgIGVycm9yLiAoQkgpCisKKy0gcHV0X2lub2RlKCkgcmVsZWFzZXMgdGhlIGV4dCBjYWNoZSBvbmx5IGlmIGl0J3MKKyAgbm8gbG9uZ2VyIG5lZWRlZC4gKEJIKQorCistIE9uZSBzZXQgb2YgZGVudHJ5IGNhbGxiYWNrcyBpcyBlbm91Z2guIChCSCkKKworLSBDbGVhbnVwIG9mIGVycm9yIGhhbmRsaW5nIGluIG5hbWVpLmMuIChCSCkKKworLSBDbGVhbnVwIG9mIGVycm9yIGhhbmRsaW5nIGluIGZpbGUuYy4gKEJIKQorCistIFRoZSBvcmlnaW5hbCBibG9ja3NpemUgb2YgdGhlIGRldmljZSBpcworICByZXN0b3JlZCB3aGVuIHRoZSBmcyBpcyB1bm1vdW50ZWQuIChCSCkKKworLSBnZXRibG9jaygpIGRpZCBub3QgaW52YWxpZGF0ZSB0aGUga2V5IGNhY2hlCisgIHdoZW4gaXQgYWxsb2NhdGVkIGEgbmV3IGJsb2NrLgorCistIFJlbW92ZWQgc29tZSB1bm5lY2Vzc2FyeSBsb2NrcyBhcyBCaWxsCisgIHN1Z2dlc3RlZC4KKworLSBTaW1wbGlmaWVkIG1hdGNoX25hbWUoKSwgY2hhbmdlZCBhbGwgaGFzaGluZworICBhbmQgY2FzZSBpbnNlbnNpdGl2ZSBuYW1lIGNvbXBhcmlzb25zIHRvIHVzZQorICB1cHBlcmNhc2UuIFRoaXMgbWFrZXMgdGhlIHRvbG93ZXIoKSByb3V0aW5lcworICBvYnNvbGV0ZS4KKworLSBBZGRlZCBtb3VudCBvcHRpb24gJ211ZnMnIHRvIGZvcmNlIG11RlMKKyAgdWlkL2dpZCBpbnRlcnByZXRhdGlvbi4KKworLSBGaWxlIG1vZGUgY2hhbmdlcyB3ZXJlIG5vdCB1cGRhdGVkIG9uIGRpc2suCisgIFRoaXMgd2FzIGZpeGVkIGJlZm9yZSwgYnV0IHNvbWVob3cgZ290IGxvc3QuCisKK1ZlcnNpb24gMy43CistLS0tLS0tLS0tLQorCistIEFkZGVkIGRlbnRyeSBjYWxsYmFja3MgdG8gYWxsb3cgdGhlIGRjYWNoZSB0bworICBvcGVyYXRlIGNhc2UgaW5zZW5zaXRpdmUgYW5kIGxlbmd0aCBpZ25vcmFudAorICBsaWtlIHRoZSBhZmZzIGl0c2VsZi4KKworLSBnZXRibG9jaygpIGRpZG4ndCB1cGRhdGUgdGhlIGxhc3RibG9jayBmaWVsZCBpbiB0aGUKKyAgaW5vZGUgaWYgdGhlIGZzIHdhcyBub3QgYW4gT0ZTLiBUaGlzIGJ1ZyBvbmx5IHNob3dzCisgIHVwIGlmIGEgZmlsZSB3YXMgZW5sYXJnZWQgdmlhIHRydW5jYXRlKCkgYW5kIHRoZXJlCisgIHdhcyBub3QgZW5vdWdoIHNwYWNlLgorCistIFJlbW92ZSBzb21lIG1vcmUgc3VwZXJmbHVvdXMgY29kZSBsZWZ0IG92ZXIgZnJvbQorICB0aGUgb2xkIGxpbmsgZGF5cyAuLi4KKworLSBGaXhlZCBzb21lIG92ZXJzaWdodHMgd2hpY2ggd2VyZSBpbiBwYXRjaCAyLjEuNzguCisKKy0gRml4ZWQgYSBmZXcgdHlwb3MuCisKK1ZlcnNpb24gMy42CistLS0tLS0tLS0tLQorCistIGRlbnRyeSBjaGFuZ2VzLiAoVGhhbmtzIHRvIEplcyBTb3JlbnNlbiBmb3IgaGlzIGhlbHAuKQorCistIEZpeGVkIGJ1ZyBpbiBiYWxsb2MoKTogU3VwZXJibG9jayB3YXMgbm90IHNldCBkaXJ0eSBhZnRlcgorICB0aGUgYml0bWFwIHdhcyBjaGFuZ2VkLCBzbyB0aGUgYml0bWFwIHdhc24ndCBzeW5jJ2QuCisKKy0gRml4ZWQgbmFzdHkgYnVnIGluIGZpbmRfbmV3X3pvbmUoKTogSWYgdGhlIGN1cnJlbnQKKyAgem9uZSBudW1iZXIgd2FzIHplcm8sIHRoZSBsb29wIGRpZG4ndCB0ZXJtaW5hdGUsCisgIGNhdXNpbmcgYSBzb2xpZCBsb2NrLXVwLgorCistIFJlbW92ZWQgc3VwcG9ydCBmb3Igb2xkLXN0eWxlIGRpcmVjdG9yeSByZWFkcy4KKworLSBGaXhlZCBidWcgaW4gYWRkX2VudHJ5KCk6IFdoZW4gZG9pbmcgYSBzb3J0ZWQgaW5zZXJ0LAorICB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgaGFzaCBjaGFpbiB3YXNuJ3QKKyAgY29ycmVjdGx5IGJ5dGUtc3dhcHBlZC4gU2luY2UgbW9zdCBvZiB0aGUgdXNlcnMgb2YgdGhlCisgIGFmZnMgdXNlIGl0IG9uIGEgNjhrLCB0aGV5IGRpZG4ndCBub3RpY2UuIEJ1dCB3aHkgZGlkCisgIEkgbm90IGZpbmQgdGhpcyBkdXJpbmcgbXkgdGVzdHM/CisKKy0gRml4ZWQgc29tZSBvdmVyc2lnaHRzICh2ZXJzaW9uIHdhc24ndCB1cGRhdGVkIG9uIHNvbWUKKyAgZGlyZWN0b3J5IGNoYW5nZXMpLgorCistIEhhbmRsaW5nIG9mIGhhcmQgbGlua3MgcmV3cml0dGVuLiBUbyB0aGUgVkZTCisgIHRoZXkgYXBwZWFyIG5vdyBhcyBub3JtYWwgVW5peCBsaW5rcy4gVGhleSBhcmUKKyAgbm93IHJlc29sdmVkIG9ubHkgb25jZSBpbiBsb29rdXAoKS4gVGhlIGJhY2tzaWRlCisgIGlzIHRoYXQgdW5saW5rKCksIHJlbmFtZSgpIGFuZCBybWRpcigpIGhhdmUgdG8KKyAgYmUgc21hcnQgYWJvdXQgdGhlbSwgYnV0IHRoZSByZXN1bHQgaXMgd29ydGggdGhlCisgIGVmZm9ydC4gVGhpcyBhbHNvIGxlZCB0byBzb21lIGNvZGUgY2xlYW51cC4KKworLSBDaGFuZ2VkIG5hbWUgdHlwZSB0byB1bnNpZ25lZCBjaGFyOyB0aGUgdGVzdCBmb3IKKyAgaW52YWxpZCBmaWxlbmFtZXMgZGlkbid0IHdvcmsgY29ycmVjdGx5LgorICAoVGhhbmtzIHRvIE1pY2hhZWwgS3JhdXNlIGZvciBwb2ludGluZyBhdCB0aGlzLikKKworLSBDaGFuZ2VkIG1hcHBpbmcgb2YgZXhlY3V0YWJsZSBmbGFnLgorCistIENoYW5nZWQgYWxsIG5ldHdvcmsgYnl0ZS1vcmRlciBtYWNyb3MgdG8gdGhlCisgIHJlY29tbWVuZGVkIG9uZXMuCisKKy0gQWRkZWQgYSByZW1vdW50IGZ1bmN0aW9uLCBzbyBhdHRlbXB0cyB0byByZW1vdW50CisgIGEgZGlyY2FjaGUgZmlsZXN5c3RlbSBvciBvbmUgd2l0aCBlcnJvcnMgcmVhZC93cml0ZQorICBjYW4gYmUgdHJhcHBlZC4gUHJldmlvdXNseSwgcm8gcmVtb3VudHMgZGlkbid0CisgIGZsdXNoIHRoZSBzdXBlciBibG9jaywgYW5kIHJ3IHJlbW91bnRzIGRpZG4ndAorICBjcmVhdGUgYWxsb2NhdGlvbiB6b25lcyAuLi4KKworLSBDYWxsIHNocmlua19kY2FjaGVfcGFyZW50KCkgaW4gcm1kaXIoKS4KKyAgKFRoYW5rcyB0byBCaWxsIEhhd2VzLikKKworLSBQZXJtaXNzaW9uIGNoZWNrcyBpbiB1bmxpbmsoKS4KKworLSBBbGxvdyBtb3VudGluZyBvZiB2b2x1bWVzIHdpdGggc3VwZXJmbHVvdXMKKyAgYml0bWFwIHBvaW50ZXJzIHJlYWQgb25seSwgYWxzbyBhbGxvd3MgdGhlbQorICB0byBiZSByZW1vdW50ZWQgcmVhZC93cml0ZS4KKworLSBPd25lci9Hcm91cCBkZWZhdWx0cyBub3cgdG8gdGhlIGZzIHVzZXIgKGkuZS4KKyAgdGhlIG9uZSB0aGF0IG1vdW50ZWQgaXQpIGluc3RlYWQgb2Ygcm9vdC4gVGhpcworICBvYnNvbGV0ZXMgdGhlIG1vdW50IG9wdGlvbnMgdWlkIGFuZCBnaWQuCisKKy0gQXJndW1lbnQgdG8gdm9sdW1lIG9wdGlvbiBjb3VsZCBvdmVyZmxvdyB0aGUKKyAgbmFtZSBidWZmZXIuIEl0IGlzIG5vdyBzaWxlbnRseSB0cnVuY2F0ZWQgdG8KKyAgMzAgY2hhcmFjdGVycy4gKERhbW4gaXQhIFRoaXMga2luZCBvZiBidWcKKyAgaXMgdG9vIGVtYmFycmFzc2luZy4pCisKKy0gU3BsaXQgaW5vZGUuYyBpbnRvIDIgZmlsZXMsIHRoZSBzdXBlcmJsb2NrCisgIHJvdXRpbmVzIGRlc3BlcmF0ZWx5IHdhbnRlZCB0aGVpciBvd24gZmlsZS4KKworLSB0cnVuY2F0ZSgpIGRpZG4ndCBhbGxvY2F0ZSBhbiBleHRlbnNpb24gYmxvY2sKKyAgY2FjaGUuIElmIGEgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgbWVhbnMgb2YKKyAgdHJ1bmNhdGUoKSwgdGhpcyBsZWQgdG8gYW4gT29wcy4KKworLSBmc3VzZXIgaXMgbm93IGNoZWNrZWQgbGFzdC4KKworLSByZW5hbWUoKSB3aWxsIG5vdCBpZ25vcmUgY2hhbmdlcyBpbiBmaWxlbmFtZQorICBjYXNpbmcgYW55IG1vcmUgKHRob3VnaCBtdigxKSBzdGlsbCB3b24ndCBhbGxvdworICB5b3UgdG8gZG8gIm12IG9sZG5hbWUgT2xkTmFtZSIpLgorCitWZXJzaW9uIDMuNQorLS0tLS0tLS0tLS0KKworLSBFeHRlbnNpb24gYmxvY2sgY2FjaGVzIGFyZSBub3cgYWxsb2NhdGVkIG9uCisgIGRlbWFuZCBpbnN0ZWFkIG9mIHdoZW4gYSBmaWxlIGlzIG9wZW5lZCwgYXMKKyAgZmlsZXMgY2FuIGJlIHJlYWQgYW5kIHdyaXR0ZW4gd2l0aG91dCBvcGVuaW5nCisgIHRoZW0gKGUuIGcuIHRoZSBsb29wYmFjayBkZXZpY2UgZG9lcyB0aGlzKS4KKworLSBSZW1vdmVkIGFuIHVudXNlZCBmdW5jdGlvbi4KKworVmVyc2lvbiAzLjQKKy0tLS0tLS0tLS0tCisKKy0gSGFzaCBjaGFpbnMgYXJlIG5vdyBzb3J0ZWQgYnkgYmxvY2sgbnVtYmVycy4KKyAgKFRoYW5rcyB0byBLYXJzIGRlIEpvbmcgZm9yIGZpbmRpbmcgdGhpcy4pCistIFJlbW92ZWQgYWxsIHVubmVjZXNzYXJ5IGV4dGVybmFsIHN5bWJvbHMuCisKK1ZlcnNpb24gMy4zCistLS0tLS0tLS0tLQorCistIFRyaWVkIHRvIG1ha2UgYWxsIHR5cGVzICdjb3JyZWN0JyBhbmQgY29uc2lzdGVudC4KKy0gRXJyb3JzIGFuZCB3YXJuaW5ncyBhcmUgbm93IHJlcG9ydGVkIHZpYSBhCisgIGZ1bmN0aW9uLiBUaGV5IGFyZSBhbGwgcHJlZml4ZWQgYnkgYSBzZXZlcml0eQorICBhbmQgaGF2ZSB0aGUgc2FtZSBhcHBlYXJhbmNlOgorICAgICJBRkZTOiA8ZnVuY3Rpb24+OiA8ZXJyb3IgbWVzc2FnZT4iCisgIChUaGVyZSdzIG9uZSBleGNlcHRpb24gdG8gdGhpcywgYXMgaW4gdGhhdCBmdW5jdGlvbgorICBpcyBubyBwb2ludGVyIHRvIHRoZSBzdXBlciBibG9jayBhdmFpbGFibGUuKQorLSBUaGUgZmlsZXN5c3RlbSBpcyByZW1vdW50ZWQgcmVhZC1vbmx5IGFmdGVyIGFuCisgIGVycm9yLgorLSBUaGUgbmFtZXMgb2YgbmV3bHkgY3JlYXRlZCBmaWxlc3lzdGVtIG9iamVjdHMgYXJlCisgIG5vdyBjaGVja2VkIGZvciB2YWxpZGl0eS4KKy0gTWlub3IgY2xlYW51cHMgaW4gY29tbWVudHMuCistIEFkZGVkIHRoaXMgQ2hhbmdlcyBmaWxlLiBBdCBsYXN0IQorCitWZXJzaW9uIDMuMgorLS0tLS0tLS0tLS0KKworLSBFeHRlbnNpb24gYmxvY2sgY2FjaGU6IFJlYWRpbmcvd3JpdGluZyBvZiBodWdlIGZpbGVzCisgIChzZXZlcmFsIE1CKSBpcyBtdWNoIGZhc3RlciAob2YgY291cnNlIHRoZSBhZGRlZAorICBvdmVyaGVhZCBzbG93cyBkb3duIG9wZW5pbmcsIGJ1dCB0aGlzIGlzIGhhcmRseQorICBub3RpY2VhYmxlKS4KKy0gVGhlIHNhbWUgZ2V0X2Jsb2NrKCktcm91dGluZSBjYW4gbm93IGJlIHVzZWQgZm9yCisgIGJvdGggT0ZTIGFuZCBGRlMuCistIFRoZSBzdXBlciBibG9jayBpcyBub3cgc2VhcmNoZWQgaW4gdGhlIGJsb2NrIHRoYXQKKyAgd2FzIGNhbGN1bGF0ZWQgYW5kIGluIHRoZSBvbmUgZm9sbG93aW5nLiBUaGlzCisgIHNob3VsZCByZW1lZHkgdGhlIHJvdW5kLW9mZiBlcnJvciBpbnRyb2R1Y2VkIGJ5CisgIHRoZSAxLWsgYmxvY2tzIHRoYXQgTGludXggdXNlcy4KKy0gTWlub3IgY2hhbmdlcyB0byBhZGhlcmUgdG8gdGhlIG5ldyBWRlMgaW50ZXJmYWNlLgorLSBUaGUgbnVtYmVyIG9mIHVzZWQgYmxvY2tzIGlzIG5vdyBhbHNvIGNhbGN1bGF0ZWQKKyAgaWYgdGhlIGZpbGVzeXN0ZW0gaXMgbW91bnRlZCByZWFkLW9ubHkuCistIFByZWZpeGVkIHNvbWUgY29uc3RhbnRzIHdpdGggQUZGU18gdG8gYXZvaWQgbmFtZQorICBjbGFzaGVzLgorLSBSZW1vdmVkICdFWFBFUklNRU5UQUwnIHN0YXR1cy4KKworVmVyc2lvbiAzLjEKKy0tLS0tLS0tLS0tCisKKy0gRml4ZWQgYSBuYXN0eSBidWcgd2hpY2ggZGlkbid0IGFsbG93IHJlYWQtb25seQorICBtb3VudHMuCistIEFsbG93IGRpci1jYWNoZSBmaWxlc3lzdGVtcyB0byBiZSBtb3VudGVkCisgIHJlYWQgb25seS4KKy0gT0ZTIHN1cHBvcnQuCistIFNldmVyYWwgb3RoZXIgY2hhbmdlcyBJIGp1c3QgY2Fubm90IHJlbWVtYmVyCisgIGFueSBtb3JlLgorCitWZXJzaW9uIDMuMAorLS0tLS0tLS0tLS0KKworLSBBbG1vc3QgY29tcGxldGUgcmV3cml0ZSBmb3IgdGhlIG5ldyBWRlMKKyAgaW50ZXJmYWNlIGluIExpbnV4IDEuMy4KKy0gV3JpdGUgc3VwcG9ydC4KKy0gU3VwcG9ydCBmb3IgaGFyZCBhbmQgc3ltYm9saWMgbGlua3MuCistIExvdHMgb2YgdGhpbmdzIEkgcmVtZW1iZXIgZXZlbiBsZXNzIC4uLgorCitWZXJzaW9uIDIuMAorLS0tLS0tLS0tLS0KKworLSBGaXhlZCBhIGZldyB0aGluZ3MgdG8gZ2V0IGl0IGNvbXBpbGVkLgorLSBBdXRvbWF0aWMgcm9vdCBibG9jayBjYWxjdWxhdGlvbi4KKy0gUGFydGl0aW9uIGNoZWNrZXIgZm9yIGdlbmhkLmMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitMZXQncyBqdXN0IGNhbGwgUmF5IEJ1cnIncyBvcmlnaW5hbCBhZmZzCisnVmVyc2lvbiAxLjAnLgpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9NYWtlZmlsZSBiL2ZzL2FmZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJjNGY1NAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2FmZnMvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggYWZmcyBmaWxlc3lzdGVtIHJvdXRpbmVzLgorIworCisjRVhUUkFfQ0ZMQUdTPS1EREVCVUc9MQorCitvYmotJChDT05GSUdfQUZGU19GUykgKz0gYWZmcy5vCisKK2FmZnMtb2JqcyA6PSBzdXBlci5vIG5hbWVpLm8gaW5vZGUubyBmaWxlLm8gZGlyLm8gYW1pZ2FmZnMubyBiaXRtYXAubyBzeW1saW5rLm8KZGlmZiAtLWdpdCBhL2ZzL2FmZnMvYWZmcy5oIGIvZnMvYWZmcy9hZmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM2Nzk5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2FmZnMvYWZmcy5oCkBAIC0wLDAgKzEsMzA0IEBACisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvYWZmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtaWdhZmZzLmg+CisKKy8qIEFtaWdhT1MgYWxsb3dzIGZpbGUgbmFtZXMgd2l0aCB1cCB0byAzMCBjaGFyYWN0ZXJzIGxlbmd0aC4KKyAqIE5hbWVzIGxvbmdlciB0aGFuIHRoYXQgd2lsbCBiZSBzaWxlbnRseSB0cnVuY2F0ZWQuIElmIHlvdQorICogd2FudCB0byBkaXNhbGxvdyB0aGlzLCBjb21tZW50IG91dCB0aGUgZm9sbG93aW5nICNkZWZpbmUuCisgKiBDcmVhdGluZyBmaWxlc3lzdGVtIG9iamVjdHMgd2l0aCBsb25nZXIgbmFtZXMgd2lsbCB0aGVuCisgKiByZXN1bHQgaW4gYW4gZXJyb3IgKEVOQU1FVE9PTE9ORykuCisgKi8KKy8qI2RlZmluZSBBRkZTX05PX1RSVU5DQVRFICovCisKKy8qIFVnbHkgbWFjcm9zIG1ha2UgdGhlIGNvZGUgbW9yZSBwcmV0dHkuICovCisKKyNkZWZpbmUgR0VUX0VORF9QVFIoc3QscCxzeikJCSAoKHN0ICopKChjaGFyICopKHApKygoc3opLXNpemVvZihzdCkpKSkKKyNkZWZpbmUgQUZGU19HRVRfSEFTSEVOVFJZKGRhdGEsaGFzaGtleSkgYmUzMl90b19jcHUoKChzdHJ1Y3QgZGlyX2Zyb250ICopZGF0YSktPmhhc2h0YWJsZVtoYXNoa2V5XSkKKyNkZWZpbmUgQUZGU19CTE9DSyhzYiwgYmgsIGJsaykJCShBRkZTX0hFQUQoYmgpLT50YWJsZVtBRkZTX1NCKHNiKS0+c19oYXNoc2l6ZS0xLShibGspXSkKKworI2lmZGVmIF9fTElUVExFX0VORElBTgorI2RlZmluZSBCT19FWEJJVFMJMHgxOFVMCisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKyNkZWZpbmUgQk9fRVhCSVRTCTB4MDBVTAorI2Vsc2UKKyNlcnJvciBFbmRpYW5uZXNzIG11c3QgYmUga25vd24gZm9yIGFmZnMgdG8gd29yay4KKyNlbmRpZgorCisjZGVmaW5lIEFGRlNfSEVBRChiaCkJCSgoc3RydWN0IGFmZnNfaGVhZCAqKShiaCktPmJfZGF0YSkKKyNkZWZpbmUgQUZGU19UQUlMKHNiLCBiaCkJKChzdHJ1Y3QgYWZmc190YWlsICopKChiaCktPmJfZGF0YSsoc2IpLT5zX2Jsb2Nrc2l6ZS1zaXplb2Yoc3RydWN0IGFmZnNfdGFpbCkpKQorI2RlZmluZSBBRkZTX1JPT1RfSEVBRChiaCkJKChzdHJ1Y3QgYWZmc19yb290X2hlYWQgKikoYmgpLT5iX2RhdGEpCisjZGVmaW5lIEFGRlNfUk9PVF9UQUlMKHNiLCBiaCkJKChzdHJ1Y3QgYWZmc19yb290X3RhaWwgKikoKGJoKS0+Yl9kYXRhKyhzYiktPnNfYmxvY2tzaXplLXNpemVvZihzdHJ1Y3QgYWZmc19yb290X3RhaWwpKSkKKyNkZWZpbmUgQUZGU19EQVRBX0hFQUQoYmgpCSgoc3RydWN0IGFmZnNfZGF0YV9oZWFkICopKGJoKS0+Yl9kYXRhKQorI2RlZmluZSBBRkZTX0RBVEEoYmgpCQkoKChzdHJ1Y3QgYWZmc19kYXRhX2hlYWQgKikoYmgpLT5iX2RhdGEpLT5kYXRhKQorCisjZGVmaW5lIEFGRlNfQ0FDSEVfU0laRQkJUEFHRV9TSVpFCisKKyNkZWZpbmUgQUZGU19NQVhfUFJFQUxMT0MJMzIKKyNkZWZpbmUgQUZGU19MQ19TSVpFCQkoQUZGU19DQUNIRV9TSVpFL3NpemVvZih1MzIpLzIpCisjZGVmaW5lIEFGRlNfQUNfU0laRQkJKEFGRlNfQ0FDSEVfU0laRS9zaXplb2Yoc3RydWN0IGFmZnNfZXh0X2tleSkvMikKKyNkZWZpbmUgQUZGU19BQ19NQVNLCQkoQUZGU19BQ19TSVpFLTEpCisKK3N0cnVjdCBhZmZzX2V4dF9rZXkgeworCXUzMglleHQ7CQkJCS8qIGlkeCBvZiB0aGUgZXh0ZW5kZWQgYmxvY2sgKi8KKwl1MzIJa2V5OwkJCQkvKiBibG9jayBudW1iZXIgKi8KK307CisKKy8qCisgKiBhZmZzIGZzIGlub2RlIGRhdGEgaW4gbWVtb3J5CisgKi8KK3N0cnVjdCBhZmZzX2lub2RlX2luZm8geworCXUzMgkgaV9vcGVuY250OworCXN0cnVjdCBzZW1hcGhvcmUgaV9saW5rX2xvY2s7CQkvKiBQcm90ZWN0cyBpbnRlcm5hbCBpbm9kZSBhY2Nlc3MuICovCisJc3RydWN0IHNlbWFwaG9yZSBpX2V4dF9sb2NrOwkJLyogUHJvdGVjdHMgaW50ZXJuYWwgaW5vZGUgYWNjZXNzLiAqLworI2RlZmluZSBpX2hhc2hfbG9jayBpX2V4dF9sb2NrCisJdTMyCSBpX2Jsa2NudDsJCQkvKiBibG9jayBjb3VudCAqLworCXUzMgkgaV9leHRjbnQ7CQkJLyogZXh0ZW5kZWQgYmxvY2sgY291bnQgKi8KKwl1MzIJKmlfbGM7CQkJCS8qIGxpbmVhciBjYWNoZSBvZiBleHRlbmRlZCBibG9ja3MgKi8KKwl1MzIJIGlfbGNfc2l6ZTsKKwl1MzIJIGlfbGNfc2hpZnQ7CisJdTMyCSBpX2xjX21hc2s7CisJc3RydWN0IGFmZnNfZXh0X2tleSAqaV9hYzsJCS8qIGFzc29jaWF0aXZlIGNhY2hlIG9mIGV4dGVuZGVkIGJsb2NrcyAqLworCXUzMgkgaV9leHRfbGFzdDsJCQkvKiBsYXN0IGFjY2Vzc2VkIGV4dGVuZGVkIGJsb2NrICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICppX2V4dF9iaDsJCS8qIGJoIG9mIGxhc3QgZXh0ZW5kZWQgYmxvY2sgKi8KKwlsb2ZmX3QJIG1tdV9wcml2YXRlOworCXUzMgkgaV9wcm90ZWN0OwkJCS8qIHVudXNlZCBhdHRyaWJ1dGUgYml0cyAqLworCXUzMgkgaV9sYXN0YWxsb2M7CQkJLyogbGFzdCBhbGxvY2F0ZWQgYmxvY2sgKi8KKwlpbnQJIGlfcGFfY250OwkJCS8qIG51bWJlciBvZiBwcmVhbGxvY2F0ZWQgYmxvY2tzICovCisJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKK307CisKKy8qIHNob3J0IGN1dCB0byBnZXQgdG8gdGhlIGFmZnMgc3BlY2lmaWMgaW5vZGUgZGF0YSAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYWZmc19pbm9kZV9pbmZvICpBRkZTX0koc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gbGlzdF9lbnRyeShpbm9kZSwgc3RydWN0IGFmZnNfaW5vZGVfaW5mbywgdmZzX2lub2RlKTsKK30KKworLyoKKyAqIHN1cGVyLWJsb2NrIGRhdGEgaW4gbWVtb3J5CisgKgorICogQmxvY2sgbnVtYmVycyBhcmUgYWRqdXN0ZWQgZm9yIHRoZWlyIGFjdHVhbCBzaXplCisgKgorICovCisKK3N0cnVjdCBhZmZzX2JtX2luZm8geworCXUzMiBibV9rZXk7CQkJLyogRGlzayBibG9jayBudW1iZXIgKi8KKwl1MzIgYm1fZnJlZTsJCQkvKiBGcmVlIGJsb2NrcyBpbiBoZXJlICovCit9OworCitzdHJ1Y3QgYWZmc19zYl9pbmZvIHsKKwlpbnQgc19wYXJ0aXRpb25fc2l6ZTsJCS8qIFBhcnRpdGlvbiBzaXplIGluIGJsb2Nrcy4gKi8KKwlpbnQgc19yZXNlcnZlZDsJCQkvKiBOdW1iZXIgb2YgcmVzZXJ2ZWQgYmxvY2tzLiAqLworCS8vdTMyIHNfYmxrc2l6ZTsJCQkvKiBJbml0aWFsIGRldmljZSBibGtzaXplICovCisJdTMyIHNfZGF0YV9ibGtzaXplOwkJLyogc2l6ZSBvZiB0aGUgZGF0YSBibG9jayB3L28gaGVhZGVyICovCisJdTMyIHNfcm9vdF9ibG9jazsJCS8qIEZGUyByb290IGJsb2NrIG51bWJlci4gKi8KKwlpbnQgc19oYXNoc2l6ZTsJCQkvKiBTaXplIG9mIGhhc2ggdGFibGUuICovCisJdW5zaWduZWQgbG9uZyBzX2ZsYWdzOwkJLyogU2VlIGJlbG93LiAqLworCXVpZF90IHNfdWlkOwkJCS8qIHVpZCB0byBvdmVycmlkZSAqLworCWdpZF90IHNfZ2lkOwkJCS8qIGdpZCB0byBvdmVycmlkZSAqLworCXVtb2RlX3Qgc19tb2RlOwkJCS8qIG1vZGUgdG8gb3ZlcnJpZGUgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNfcm9vdF9iaDsJLyogQ2FjaGVkIHJvb3QgYmxvY2suICovCisJc3RydWN0IHNlbWFwaG9yZSBzX2JtbG9jazsJLyogUHJvdGVjdHMgYml0bWFwIGFjY2Vzcy4gKi8KKwlzdHJ1Y3QgYWZmc19ibV9pbmZvICpzX2JpdG1hcDsJLyogQml0bWFwIGluZm9zLiAqLworCXUzMiBzX2JtYXBfY291bnQ7CQkvKiAjIG9mIGJpdG1hcCBibG9ja3MuICovCisJdTMyIHNfYm1hcF9iaXRzOwkJLyogIyBvZiBiaXRzIGluIG9uZSBiaXRtYXAgYmxvY2tzICovCisJdTMyIHNfbGFzdF9ibWFwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqc19ibWFwX2JoOworCWNoYXIgKnNfcHJlZml4OwkJCS8qIFByZWZpeCBmb3Igdm9sdW1lcyBhbmQgYXNzaWducy4gKi8KKwlpbnQgc19wcmVmaXhfbGVuOwkJLyogTGVuZ3RoIG9mIHByZWZpeC4gKi8KKwljaGFyIHNfdm9sdW1lWzMyXTsJCS8qIFZvbHVtZSBwcmVmaXggZm9yIGFic29sdXRlIHN5bWxpbmtzLiAqLworfTsKKworI2RlZmluZSBTRl9JTlRMCQkweDAwMDEJCS8qIEludGVybmF0aW9uYWwgZmlsZXN5c3RlbS4gKi8KKyNkZWZpbmUgU0ZfQk1fVkFMSUQJMHgwMDAyCQkvKiBCaXRtYXAgaXMgdmFsaWQuICovCisjZGVmaW5lIFNGX0lNTVVUQUJMRQkweDAwMDQJCS8qIFByb3RlY3Rpb24gYml0cyBjYW5ub3QgYmUgY2hhbmdlZCAqLworI2RlZmluZSBTRl9RVUlFVAkweDAwMDgJCS8qIGNobW9kIGVycm9ycyB3aWxsIGJlIG5vdCByZXBvcnRlZCAqLworI2RlZmluZSBTRl9TRVRVSUQJMHgwMDEwCQkvKiBJZ25vcmUgQW1pZ2EgdWlkICovCisjZGVmaW5lIFNGX1NFVEdJRAkweDAwMjAJCS8qIElnbm9yZSBBbWlnYSBnaWQgKi8KKyNkZWZpbmUgU0ZfU0VUTU9ERQkweDAwNDAJCS8qIElnbm9yZSBBbWlnYSBwcm90ZWN0aW9uIGJpdHMgKi8KKyNkZWZpbmUgU0ZfTVVGUwkJMHgwMTAwCQkvKiBVc2UgTVVGUyB1aWQvZ2lkIG1hcHBpbmcgKi8KKyNkZWZpbmUgU0ZfT0ZTCQkweDAyMDAJCS8qIE9sZCBmaWxlc3lzdGVtICovCisjZGVmaW5lIFNGX1BSRUZJWAkweDA0MDAJCS8qIEJ1ZmZlciBmb3IgcHJlZml4IGlzIGFsbG9jYXRlZCAqLworI2RlZmluZSBTRl9WRVJCT1NFCTB4MDgwMAkJLyogVGFsayBhYm91dCBmcyB3aGVuIG1vdW50aW5nICovCisKKy8qIHNob3J0IGN1dCB0byBnZXQgdG8gdGhlIGFmZnMgc3BlY2lmaWMgc2IgZGF0YSAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYWZmc19zYl9pbmZvICpBRkZTX1NCKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIHNiLT5zX2ZzX2luZm87Cit9CisKKy8qIGFtaWdhZmZzLmMgKi8KKworZXh0ZXJuIGludAlhZmZzX2luc2VydF9oYXNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOworZXh0ZXJuIGludAlhZmZzX3JlbW92ZV9oYXNoKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJlbV9iaCk7CitleHRlcm4gaW50CWFmZnNfcmVtb3ZlX2hlYWRlcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworZXh0ZXJuIHUzMglhZmZzX2NoZWNrc3VtX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOworZXh0ZXJuIHZvaWQJYWZmc19maXhfY2hlY2tzdW0oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CitleHRlcm4gdm9pZAlzZWNzX3RvX2RhdGVzdGFtcCh0aW1lX3Qgc2Vjcywgc3RydWN0IGFmZnNfZGF0ZSAqZHMpOworZXh0ZXJuIG1vZGVfdAlwcm90X3RvX21vZGUodTMyIHByb3QpOworZXh0ZXJuIHZvaWQJbW9kZV90b19wcm90KHN0cnVjdCBpbm9kZSAqaW5vZGUpOworZXh0ZXJuIHZvaWQJYWZmc19lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIHZvaWQJYWZmc193YXJuaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gaW50CWFmZnNfY2hlY2tfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLCBpbnQgbGVuKTsKK2V4dGVybiBpbnQJYWZmc19jb3B5X25hbWUodW5zaWduZWQgY2hhciAqYnN0ciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKKworLyogYml0bWFwLiBjICovCisKK2V4dGVybiB1MzIJYWZmc19jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpOworZXh0ZXJuIHZvaWQJYWZmc19mcmVlX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHUzMiBibG9jayk7CitleHRlcm4gdTMyCWFmZnNfYWxsb2NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgdTMyIGdvYWwpOworZXh0ZXJuIGludAlhZmZzX2luaXRfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MpOworZXh0ZXJuIHZvaWQJYWZmc19mcmVlX2JpdG1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKworLyogbmFtZWkuYyAqLworCitleHRlcm4gaW50CWFmZnNfaGFzaF9uYW1lKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IHU4ICpuYW1lLCB1bnNpZ25lZCBpbnQgbGVuKTsKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5ICphZmZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICopOworZXh0ZXJuIGludAlhZmZzX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKK2V4dGVybiBpbnQJYWZmc19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIHN0cnVjdCBuYW1laWRhdGEgKik7CitleHRlcm4gaW50CWFmZnNfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpOworZXh0ZXJuIGludAlhZmZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworZXh0ZXJuIGludAlhZmZzX2xpbmsoc3RydWN0IGRlbnRyeSAqb2xkZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCSAgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKK2V4dGVybiBpbnQJYWZmc19zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICAgIGNvbnN0IGNoYXIgKnN5bW5hbWUpOworZXh0ZXJuIGludAlhZmZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCQkgICAgc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KTsKKworLyogaW5vZGUuYyAqLworCitleHRlcm4gdW5zaWduZWQgbG9uZwkJIGFmZnNfcGFyZW50X2lubyhzdHJ1Y3QgaW5vZGUgKmRpcik7CitleHRlcm4gc3RydWN0IGlub2RlCQkqYWZmc19uZXdfaW5vZGUoc3RydWN0IGlub2RlICpkaXIpOworZXh0ZXJuIGludAkJCSBhZmZzX25vdGlmeV9jaGFuZ2Uoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpOworZXh0ZXJuIHZvaWQJCQkgYWZmc19wdXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CitleHRlcm4gdm9pZAkJCSBhZmZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2V4dGVybiB2b2lkCQkJIGFmZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CitleHRlcm4gdm9pZAkJCSBhZmZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CitleHRlcm4gaW50CQkJIGFmZnNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50KTsKK2V4dGVybiBpbnQJCQkgYWZmc19hZGRfZW50cnkoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgczMyIHR5cGUpOworCisvKiBmaWxlLmMgKi8KKwordm9pZAkJYWZmc19mcmVlX3ByZWFsbG9jKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworZXh0ZXJuIHZvaWQJYWZmc190cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKik7CisKKy8qIGRpci5jICovCisKK2V4dGVybiB2b2lkICAgYWZmc19kaXJfdHJ1bmNhdGUoc3RydWN0IGlub2RlICopOworCisvKiBqdW1wIHRhYmxlcyAqLworCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMJIGFmZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zCSBhZmZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zICAgYWZmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucwkgYWZmc19maWxlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucwkgYWZmc19maWxlX29wZXJhdGlvbnNfb2ZzOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMJIGFmZnNfZGlyX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucwkgYWZmc19zeW1saW5rX2FvcHM7CitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucwkgYWZmc19hb3BzOworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMJIGFmZnNfYW9wc19vZnM7CisKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMJIGFmZnNfZGVudHJ5X29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zCSBhZmZzX2RlbnRyeV9vcGVyYXRpb25zX2ludGw7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYWZmc19zZXRfYmxvY2tzaXplKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBzaXplKQoreworCXNiX3NldF9ibG9ja3NpemUoc2IsIHNpemUpOworfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorYWZmc19icmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgYmxvY2spCit7CisJcHJfZGVidWcoImFmZnNfYnJlYWQ6ICVkXG4iLCBibG9jayk7CisJaWYgKGJsb2NrID49IEFGRlNfU0Ioc2IpLT5zX3Jlc2VydmVkICYmIGJsb2NrIDwgQUZGU19TQihzYiktPnNfcGFydGl0aW9uX3NpemUpCisJCXJldHVybiBzYl9icmVhZChzYiwgYmxvY2spOworCXJldHVybiBOVUxMOworfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorYWZmc19nZXRibGsoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGJsb2NrKQoreworCXByX2RlYnVnKCJhZmZzX2dldGJsazogJWRcbiIsIGJsb2NrKTsKKwlpZiAoYmxvY2sgPj0gQUZGU19TQihzYiktPnNfcmVzZXJ2ZWQgJiYgYmxvY2sgPCBBRkZTX1NCKHNiKS0+c19wYXJ0aXRpb25fc2l6ZSkKKwkJcmV0dXJuIHNiX2dldGJsayhzYiwgYmxvY2spOworCXJldHVybiBOVUxMOworfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorYWZmc19nZXR6ZXJvYmxrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBibG9jaykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXByX2RlYnVnKCJhZmZzX2dldHplcm9ibGs6ICVkXG4iLCBibG9jayk7CisJaWYgKGJsb2NrID49IEFGRlNfU0Ioc2IpLT5zX3Jlc2VydmVkICYmIGJsb2NrIDwgQUZGU19TQihzYiktPnNfcGFydGl0aW9uX3NpemUpIHsKKwkJYmggPSBzYl9nZXRibGsoc2IsIGJsb2NrKTsKKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1zZXQoYmgtPmJfZGF0YSwgMCAsIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJcmV0dXJuIGJoOworCX0KKwlyZXR1cm4gTlVMTDsKK30KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK2FmZnNfZ2V0ZW1wdHlibGsoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGJsb2NrKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJcHJfZGVidWcoImFmZnNfZ2V0ZW1wdHlibGs6ICVkXG4iLCBibG9jayk7CisJaWYgKGJsb2NrID49IEFGRlNfU0Ioc2IpLT5zX3Jlc2VydmVkICYmIGJsb2NrIDwgQUZGU19TQihzYiktPnNfcGFydGl0aW9uX3NpemUpIHsKKwkJYmggPSBzYl9nZXRibGsoc2IsIGJsb2NrKTsKKwkJd2FpdF9vbl9idWZmZXIoYmgpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJcmV0dXJuIGJoOworCX0KKwlyZXR1cm4gTlVMTDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZAorYWZmc19icmVsc2Uoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpZiAoYmgpCisJCXByX2RlYnVnKCJhZmZzX2JyZWxzZTogJWxsZFxuIiwgKGxvbmcgbG9uZykgYmgtPmJfYmxvY2tucik7CisJYnJlbHNlKGJoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCithZmZzX2FkanVzdF9jaGVja3N1bShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB1MzIgdmFsKQoreworCXUzMiB0bXAgPSBiZTMyX3RvX2NwdSgoKF9fYmUzMiAqKWJoLT5iX2RhdGEpWzVdKTsKKwkoKF9fYmUzMiAqKWJoLT5iX2RhdGEpWzVdID0gY3B1X3RvX2JlMzIodG1wIC0gdmFsKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZAorYWZmc19hZGp1c3RfYml0bWFwY2hlY2tzdW0oc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgdTMyIHZhbCkKK3sKKwl1MzIgdG1wID0gYmUzMl90b19jcHUoKChfX2JlMzIgKiliaC0+Yl9kYXRhKVswXSk7CisJKChfX2JlMzIgKiliaC0+Yl9kYXRhKVswXSA9IGNwdV90b19iZTMyKHRtcCAtIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYWZmc19sb2NrX2xpbmsoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlkb3duKCZBRkZTX0koaW5vZGUpLT5pX2xpbmtfbG9jayk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQKK2FmZnNfdW5sb2NrX2xpbmsoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1cCgmQUZGU19JKGlub2RlKS0+aV9saW5rX2xvY2spOworfQorc3RhdGljIGlubGluZSB2b2lkCithZmZzX2xvY2tfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJZG93bigmQUZGU19JKGlub2RlKS0+aV9oYXNoX2xvY2spOworfQorc3RhdGljIGlubGluZSB2b2lkCithZmZzX3VubG9ja19kaXIoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1cCgmQUZGU19JKGlub2RlKS0+aV9oYXNoX2xvY2spOworfQorc3RhdGljIGlubGluZSB2b2lkCithZmZzX2xvY2tfZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJZG93bigmQUZGU19JKGlub2RlKS0+aV9leHRfbG9jayk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQKK2FmZnNfdW5sb2NrX2V4dChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXVwKCZBRkZTX0koaW5vZGUpLT5pX2V4dF9sb2NrKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2FmZnMvYW1pZ2FmZnMuYyBiL2ZzL2FmZnMvYW1pZ2FmZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Q2MjRlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZmcy9hbWlnYWZmcy5jCkBAIC0wLDAgKzEsNTA5IEBACisvKgorICogIGxpbnV4L2ZzL2FmZnMvYW1pZ2FmZnMuYworICoKKyAqICAoYykgMTk5NiAgSGFucy1Kb2FjaGltIFdpZG1haWVyIC0gUmV3cml0dGVuCisgKgorICogIChDKSAxOTkzICBSYXkgQnVyciAtIEFtaWdhIEZGUyBmaWxlc3lzdGVtLgorICoKKyAqICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyB0bzogaGp3QHp2dy5kZQorICovCisKKyNpbmNsdWRlICJhZmZzLmgiCisKK2V4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OworCitzdGF0aWMgY2hhciBFcnJvckJ1ZmZlclsyNTZdOworCisvKgorICogRnVuY3Rpb25zIGZvciBhY2Nlc3NpbmcgQW1pZ2EtRkZTIHN0cnVjdHVyZXMuCisgKi8KKworCisvKiBJbnNlcnQgYSBoZWFkZXIgYmxvY2sgYmggaW50byB0aGUgZGlyZWN0b3J5IGRpcgorICogY2FsbGVyIG11c3QgaG9sZCBBRkZTX0RJUi0+aV9oYXNoX2xvY2shCisgKi8KKworaW50CithZmZzX2luc2VydF9oYXNoKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaXJfYmg7CisJdTMyIGlubywgaGFzaF9pbm87CisJaW50IG9mZnNldDsKKworCWlubyA9IGJoLT5iX2Jsb2NrbnI7CisJb2Zmc2V0ID0gYWZmc19oYXNoX25hbWUoc2IsIEFGRlNfVEFJTChzYiwgYmgpLT5uYW1lICsgMSwgQUZGU19UQUlMKHNiLCBiaCktPm5hbWVbMF0pOworCisJcHJfZGVidWcoIkFGRlM6IGluc2VydF9oYXNoKGRpcj0ldSwgaW5vPSVkKVxuIiwgKHUzMilkaXItPmlfaW5vLCBpbm8pOworCisJZGlyX2JoID0gYWZmc19icmVhZChzYiwgZGlyLT5pX2lubyk7CisJaWYgKCFkaXJfYmgpCisJCXJldHVybiAtRUlPOworCisJaGFzaF9pbm8gPSBiZTMyX3RvX2NwdShBRkZTX0hFQUQoZGlyX2JoKS0+dGFibGVbb2Zmc2V0XSk7CisJd2hpbGUgKGhhc2hfaW5vKSB7CisJCWFmZnNfYnJlbHNlKGRpcl9iaCk7CisJCWRpcl9iaCA9IGFmZnNfYnJlYWQoc2IsIGhhc2hfaW5vKTsKKwkJaWYgKCFkaXJfYmgpCisJCQlyZXR1cm4gLUVJTzsKKwkJaGFzaF9pbm8gPSBiZTMyX3RvX2NwdShBRkZTX1RBSUwoc2IsIGRpcl9iaCktPmhhc2hfY2hhaW4pOworCX0KKwlBRkZTX1RBSUwoc2IsIGJoKS0+cGFyZW50ID0gY3B1X3RvX2JlMzIoZGlyLT5pX2lubyk7CisJQUZGU19UQUlMKHNiLCBiaCktPmhhc2hfY2hhaW4gPSAwOworCWFmZnNfZml4X2NoZWNrc3VtKHNiLCBiaCk7CisKKwlpZiAoZGlyLT5pX2lubyA9PSBkaXJfYmgtPmJfYmxvY2tucikKKwkJQUZGU19IRUFEKGRpcl9iaCktPnRhYmxlW29mZnNldF0gPSBjcHVfdG9fYmUzMihpbm8pOworCWVsc2UKKwkJQUZGU19UQUlMKHNiLCBkaXJfYmgpLT5oYXNoX2NoYWluID0gY3B1X3RvX2JlMzIoaW5vKTsKKworCWFmZnNfYWRqdXN0X2NoZWNrc3VtKGRpcl9iaCwgaW5vKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShkaXJfYmgsIGRpcik7CisJYWZmc19icmVsc2UoZGlyX2JoKTsKKworCWRpci0+aV9tdGltZSA9IGRpci0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJZGlyLT5pX3ZlcnNpb24rKzsKKwltYXJrX2lub2RlX2RpcnR5KGRpcik7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVtb3ZlIGEgaGVhZGVyIGJsb2NrIGZyb20gaXRzIGRpcmVjdG9yeS4KKyAqIGNhbGxlciBtdXN0IGhvbGQgQUZGU19ESVItPmlfaGFzaF9sb2NrIQorICovCisKK2ludAorYWZmc19yZW1vdmVfaGFzaChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpyZW1fYmgpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXUzMiByZW1faW5vLCBoYXNoX2lubzsKKwlfX2JlMzIgaW5vOworCWludCBvZmZzZXQsIHJldHZhbDsKKworCXNiID0gZGlyLT5pX3NiOworCXJlbV9pbm8gPSByZW1fYmgtPmJfYmxvY2tucjsKKwlvZmZzZXQgPSBhZmZzX2hhc2hfbmFtZShzYiwgQUZGU19UQUlMKHNiLCByZW1fYmgpLT5uYW1lKzEsIEFGRlNfVEFJTChzYiwgcmVtX2JoKS0+bmFtZVswXSk7CisJcHJfZGVidWcoIkFGRlM6IHJlbW92ZV9oYXNoKGRpcj0lZCwgaW5vPSVkLCBoYXNodmFsPSVkKVxuIiwgKHUzMilkaXItPmlfaW5vLCByZW1faW5vLCBvZmZzZXQpOworCisJYmggPSBhZmZzX2JyZWFkKHNiLCBkaXItPmlfaW5vKTsKKwlpZiAoIWJoKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHZhbCA9IC1FTk9FTlQ7CisJaGFzaF9pbm8gPSBiZTMyX3RvX2NwdShBRkZTX0hFQUQoYmgpLT50YWJsZVtvZmZzZXRdKTsKKwl3aGlsZSAoaGFzaF9pbm8pIHsKKwkJaWYgKGhhc2hfaW5vID09IHJlbV9pbm8pIHsKKwkJCWlubyA9IEFGRlNfVEFJTChzYiwgcmVtX2JoKS0+aGFzaF9jaGFpbjsKKwkJCWlmIChkaXItPmlfaW5vID09IGJoLT5iX2Jsb2NrbnIpCisJCQkJQUZGU19IRUFEKGJoKS0+dGFibGVbb2Zmc2V0XSA9IGlubzsKKwkJCWVsc2UKKwkJCQlBRkZTX1RBSUwoc2IsIGJoKS0+aGFzaF9jaGFpbiA9IGlubzsKKwkJCWFmZnNfYWRqdXN0X2NoZWNrc3VtKGJoLCBiZTMyX3RvX2NwdShpbm8pIC0gaGFzaF9pbm8pOworCQkJbWFya19idWZmZXJfZGlydHlfaW5vZGUoYmgsIGRpcik7CisJCQlBRkZTX1RBSUwoc2IsIHJlbV9iaCktPnBhcmVudCA9IDA7CisJCQlyZXR2YWwgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJYWZmc19icmVsc2UoYmgpOworCQliaCA9IGFmZnNfYnJlYWQoc2IsIGhhc2hfaW5vKTsKKwkJaWYgKCFiaCkKKwkJCXJldHVybiAtRUlPOworCQloYXNoX2lubyA9IGJlMzJfdG9fY3B1KEFGRlNfVEFJTChzYiwgYmgpLT5oYXNoX2NoYWluKTsKKwl9CisKKwlhZmZzX2JyZWxzZShiaCk7CisKKwlkaXItPmlfbXRpbWUgPSBkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWRpci0+aV92ZXJzaW9uKys7CisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQKK2FmZnNfZml4X2RjYWNoZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHUzMiBlbnRyeV9pbm8pCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwl2b2lkICpkYXRhID0gZGVudHJ5LT5kX2ZzZGF0YTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCAqbmV4dDsKKworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCWhlYWQgPSAmaW5vZGUtPmlfZGVudHJ5OworCW5leHQgPSBoZWFkLT5uZXh0OworCXdoaWxlIChuZXh0ICE9IGhlYWQpIHsKKwkJZGVudHJ5ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX2FsaWFzKTsKKwkJaWYgKGVudHJ5X2lubyA9PSAodTMyKShsb25nKWRlbnRyeS0+ZF9mc2RhdGEpIHsKKwkJCWRlbnRyeS0+ZF9mc2RhdGEgPSBkYXRhOworCQkJYnJlYWs7CisJCX0KKwkJbmV4dCA9IG5leHQtPm5leHQ7CisJfQorCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7Cit9CisKKworLyogUmVtb3ZlIGhlYWRlciBmcm9tIGxpbmsgY2hhaW4gKi8KKworc3RhdGljIGludAorYWZmc19yZW1vdmVfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICpkaXIsICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEwsICpsaW5rX2JoID0gTlVMTDsKKwl1MzIgbGlua19pbm8sIGlubzsKKwlpbnQgcmV0dmFsOworCisJcHJfZGVidWcoIkFGRlM6IHJlbW92ZV9saW5rKGtleT0lbGQpXG4iLCBpbm9kZS0+aV9pbm8pOworCXJldHZhbCA9IC1FSU87CisJYmggPSBhZmZzX2JyZWFkKHNiLCBpbm9kZS0+aV9pbm8pOworCWlmICghYmgpCisJCWdvdG8gZG9uZTsKKworCWxpbmtfaW5vID0gKHUzMikobG9uZylkZW50cnktPmRfZnNkYXRhOworCWlmIChpbm9kZS0+aV9pbm8gPT0gbGlua19pbm8pIHsKKwkJLyogd2UgY2FuJ3QgcmVtb3ZlIHRoZSBoZWFkIG9mIHRoZSBsaW5rLCBhcyBpdHMgYmxvY2tuciBpcyBzdGlsbCB1c2VkIGFzIGlubywKKwkJICogc28gd2UgcmVtb3ZlIHRoZSBibG9jayBvZiB0aGUgZmlyc3QgbGluayBpbnN0ZWFkLgorCQkgKi8gCisJCWxpbmtfaW5vID0gYmUzMl90b19jcHUoQUZGU19UQUlMKHNiLCBiaCktPmxpbmtfY2hhaW4pOworCQlsaW5rX2JoID0gYWZmc19icmVhZChzYiwgbGlua19pbm8pOworCQlpZiAoIWxpbmtfYmgpCisJCQlnb3RvIGRvbmU7CisKKwkJZGlyID0gaWdldChzYiwgYmUzMl90b19jcHUoQUZGU19UQUlMKHNiLCBsaW5rX2JoKS0+cGFyZW50KSk7CisJCWlmICghZGlyKQorCQkJZ290byBkb25lOworCisJCWFmZnNfbG9ja19kaXIoZGlyKTsKKwkJYWZmc19maXhfZGNhY2hlKGRlbnRyeSwgbGlua19pbm8pOworCQlyZXR2YWwgPSBhZmZzX3JlbW92ZV9oYXNoKGRpciwgbGlua19iaCk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGRvbmU7CisJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGxpbmtfYmgsIGlub2RlKTsKKworCQltZW1jcHkoQUZGU19UQUlMKHNiLCBiaCktPm5hbWUsIEFGRlNfVEFJTChzYiwgbGlua19iaCktPm5hbWUsIDMyKTsKKwkJcmV0dmFsID0gYWZmc19pbnNlcnRfaGFzaChkaXIsIGJoKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZG9uZTsKKwkJbWFya19idWZmZXJfZGlydHlfaW5vZGUoYmgsIGlub2RlKTsKKworCQlhZmZzX3VubG9ja19kaXIoZGlyKTsKKwkJaXB1dChkaXIpOworCX0gZWxzZSB7CisJCWxpbmtfYmggPSBhZmZzX2JyZWFkKHNiLCBsaW5rX2lubyk7CisJCWlmICghbGlua19iaCkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwl3aGlsZSAoKGlubyA9IGJlMzJfdG9fY3B1KEFGRlNfVEFJTChzYiwgYmgpLT5saW5rX2NoYWluKSkgIT0gMCkgeworCQlpZiAoaW5vID09IGxpbmtfaW5vKSB7CisJCQlfX2JlMzIgaW5vMiA9IEFGRlNfVEFJTChzYiwgbGlua19iaCktPmxpbmtfY2hhaW47CisJCQlBRkZTX1RBSUwoc2IsIGJoKS0+bGlua19jaGFpbiA9IGlubzI7CisJCQlhZmZzX2FkanVzdF9jaGVja3N1bShiaCwgYmUzMl90b19jcHUoaW5vMikgLSBsaW5rX2lubyk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCQkJcmV0dmFsID0gMDsKKwkJCS8qIEZpeCB0aGUgbGluayBjb3VudCwgaWYgYmggaXMgYSBub3JtYWwgaGVhZGVyIGJsb2NrIHdpdGhvdXQgbGlua3MgKi8KKwkJCXN3aXRjaCAoYmUzMl90b19jcHUoQUZGU19UQUlMKHNiLCBiaCktPnN0eXBlKSkgeworCQkJY2FzZSBTVF9MSU5LRElSOgorCQkJY2FzZSBTVF9MSU5LRklMRToKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKCFBRkZTX1RBSUwoc2IsIGJoKS0+bGlua19jaGFpbikKKwkJCQkJaW5vZGUtPmlfbmxpbmsgPSAxOworCQkJfQorCQkJYWZmc19mcmVlX2Jsb2NrKHNiLCBsaW5rX2lubyk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJYWZmc19icmVsc2UoYmgpOworCQliaCA9IGFmZnNfYnJlYWQoc2IsIGlubyk7CisJCWlmICghYmgpCisJCQlnb3RvIGRvbmU7CisJfQorCXJldHZhbCA9IC1FTk9FTlQ7Citkb25lOgorCWFmZnNfYnJlbHNlKGxpbmtfYmgpOworCWFmZnNfYnJlbHNlKGJoKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKK3N0YXRpYyBpbnQKK2FmZnNfZW1wdHlfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IHJldHZhbCwgc2l6ZTsKKworCXJldHZhbCA9IC1FSU87CisJYmggPSBhZmZzX2JyZWFkKHNiLCBpbm9kZS0+aV9pbm8pOworCWlmICghYmgpCisJCWdvdG8gZG9uZTsKKworCXJldHZhbCA9IC1FTk9URU1QVFk7CisJZm9yIChzaXplID0gQUZGU19TQihzYiktPnNfaGFzaHNpemUgLSAxOyBzaXplID49IDA7IHNpemUtLSkKKwkJaWYgKEFGRlNfSEVBRChiaCktPnRhYmxlW3NpemVdKQorCQkJZ290byBub3RfZW1wdHk7CisJcmV0dmFsID0gMDsKK25vdF9lbXB0eToKKwlhZmZzX2JyZWxzZShiaCk7Citkb25lOgorCXJldHVybiByZXR2YWw7Cit9CisKKworLyogUmVtb3ZlIGEgZmlsZXN5c3RlbSBvYmplY3QuIElmIHRoZSBvYmplY3QgdG8gYmUgcmVtb3ZlZCBoYXMKKyAqIGxpbmtzIHRvIGl0LCBvbmUgb2YgdGhlIGxpbmtzIG11c3QgYmUgY2hhbmdlZCB0byBpbmhlcml0CisgKiB0aGUgZmlsZSBvciBkaXJlY3RvcnkuIEFzIGFib3ZlLCBhbnkgaW5vZGUgd2lsbCBkby4KKyAqIFRoZSBidWZmZXIgd2lsbCBub3QgYmUgZnJlZWQuIElmIHRoZSBoZWFkZXIgaXMgYSBsaW5rLCB0aGUKKyAqIGJsb2NrIHdpbGwgYmUgbWFya2VkIGFzIGZyZWUuCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgaW4gY2FzZSBvZgorICogYW4gZXJyb3IsIGVsc2UgMCBpZiB0aGUgaW5vZGUgaXMgdG8gYmUgZGVsZXRlZCBvciAxIGlmIG5vdC4KKyAqLworCitpbnQKK2FmZnNfcmVtb3ZlX2hlYWRlcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqZGlyOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWludCByZXR2YWw7CisKKwlkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCXNiID0gZGlyLT5pX3NiOworCisJcmV0dmFsID0gLUVOT0VOVDsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpZiAoIWlub2RlKQorCQlnb3RvIGRvbmU7CisKKwlwcl9kZWJ1ZygiQUZGUzogcmVtb3ZlX2hlYWRlcihrZXk9JWxkKVxuIiwgaW5vZGUtPmlfaW5vKTsKKwlyZXR2YWwgPSAtRUlPOworCWJoID0gYWZmc19icmVhZChzYiwgKHUzMikobG9uZylkZW50cnktPmRfZnNkYXRhKTsKKwlpZiAoIWJoKQorCQlnb3RvIGRvbmU7CisKKwlhZmZzX2xvY2tfbGluayhpbm9kZSk7CisJYWZmc19sb2NrX2RpcihkaXIpOworCXN3aXRjaCAoYmUzMl90b19jcHUoQUZGU19UQUlMKHNiLCBiaCktPnN0eXBlKSkgeworCWNhc2UgU1RfVVNFUkRJUjoKKwkJLyogaWYgd2UgZXZlciB3YW50IHRvIHN1cHBvcnQgbGlua3MgdG8gZGlycworCQkgKiBpX2hhc2hfbG9jayBvZiB0aGUgaW5vZGUgbXVzdCBvbmx5IGJlCisJCSAqIHRha2VuIGFmdGVyIHNvbWUgY2hlY2tzCisJCSAqLworCQlhZmZzX2xvY2tfZGlyKGlub2RlKTsKKwkJcmV0dmFsID0gYWZmc19lbXB0eV9kaXIoaW5vZGUpOworCQlhZmZzX3VubG9ja19kaXIoaW5vZGUpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBkb25lX3VubG9jazsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dmFsID0gYWZmc19yZW1vdmVfaGFzaChkaXIsIGJoKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGRvbmVfdW5sb2NrOworCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGJoLCBpbm9kZSk7CisKKwlhZmZzX3VubG9ja19kaXIoZGlyKTsKKworCWlmIChpbm9kZS0+aV9ubGluayA+IDEpCisJCXJldHZhbCA9IGFmZnNfcmVtb3ZlX2xpbmsoZGVudHJ5KTsKKwllbHNlCisJCWlub2RlLT5pX25saW5rID0gMDsKKwlhZmZzX3VubG9ja19saW5rKGlub2RlKTsKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisKK2RvbmU6CisJYWZmc19icmVsc2UoYmgpOworCXJldHVybiByZXR2YWw7CisKK2RvbmVfdW5sb2NrOgorCWFmZnNfdW5sb2NrX2RpcihkaXIpOworCWFmZnNfdW5sb2NrX2xpbmsoaW5vZGUpOworCWdvdG8gZG9uZTsKK30KKworLyogQ2hlY2tzdW0gYSBibG9jaywgZG8gdmFyaW91cyBjb25zaXN0ZW5jeSBjaGVja3MgYW5kIG9wdGlvbmFsbHkgcmV0dXJuCisgICB0aGUgYmxvY2tzIHR5cGUgbnVtYmVyLiAgREFUQSBwb2ludHMgdG8gdGhlIGJsb2NrLiAgSWYgdGhlaXIgcG9pbnRlcnMKKyAgIGFyZSBub24tbnVsbCwgKlBUWVBFIGFuZCAqU1RZUEUgYXJlIHNldCB0byB0aGUgcHJpbWFyeSBhbmQgc2Vjb25kYXJ5CisgICBibG9jayB0eXBlcyByZXNwZWN0aXZlbHksICpIQVNIU0laRSBpcyBzZXQgdG8gdGhlIHNpemUgb2YgdGhlIGhhc2h0YWJsZQorICAgKHdoaWNoIGxldHMgdXMgY2FsY3VsYXRlIHRoZSBibG9jayBzaXplKS4KKyAgIFJldHVybnMgbm9uLXplcm8gaWYgdGhlIGJsb2NrIGlzIG5vdCBjb25zaXN0ZW50LiAqLworCit1MzIKK2FmZnNfY2hlY2tzdW1fYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlfX2JlMzIgKnB0ciA9IChfX2JlMzIgKiliaC0+Yl9kYXRhOworCXUzMiBzdW07CisJaW50IGJzaXplOworCisJc3VtID0gMDsKKwlmb3IgKGJzaXplID0gc2ItPnNfYmxvY2tzaXplIC8gc2l6ZW9mKF9fYmUzMik7IGJzaXplID4gMDsgYnNpemUtLSkKKwkJc3VtICs9IGJlMzJfdG9fY3B1KCpwdHIrKyk7CisJcmV0dXJuIHN1bTsKK30KKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgY2hlY2tzdW0gb2YgYSBkaXNrIGJsb2NrIGFuZCBzdG9yZSBpdAorICogYXQgdGhlIGluZGljYXRlZCBwb3NpdGlvbi4KKyAqLworCit2b2lkCithZmZzX2ZpeF9jaGVja3N1bShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWludCBjbnQgPSBzYi0+c19ibG9ja3NpemUgLyBzaXplb2YoX19iZTMyKTsKKwlfX2JlMzIgKnB0ciA9IChfX2JlMzIgKiliaC0+Yl9kYXRhOworCXUzMiBjaGVja3N1bTsKKwlfX2JlMzIgKmNoZWNrc3VtcHRyOworCisJY2hlY2tzdW1wdHIgPSBwdHIgKyA1OworCSpjaGVja3N1bXB0ciA9IDA7CisJZm9yIChjaGVja3N1bSA9IDA7IGNudCA+IDA7IHB0cisrLCBjbnQtLSkKKwkJY2hlY2tzdW0gKz0gYmUzMl90b19jcHUoKnB0cik7CisJKmNoZWNrc3VtcHRyID0gY3B1X3RvX2JlMzIoLWNoZWNrc3VtKTsKK30KKwordm9pZAorc2Vjc190b19kYXRlc3RhbXAodGltZV90IHNlY3MsIHN0cnVjdCBhZmZzX2RhdGUgKmRzKQoreworCXUzMgkgZGF5czsKKwl1MzIJIG1pbnV0ZTsKKworCXNlY3MgLT0gc3lzX3R6LnR6X21pbnV0ZXN3ZXN0ICogNjAgKyAoKDggKiAzNjUgKyAyKSAqIDI0ICogNjAgKiA2MCk7CisJaWYgKHNlY3MgPCAwKQorCQlzZWNzID0gMDsKKwlkYXlzICAgID0gc2VjcyAvIDg2NDAwOworCXNlY3MgICAtPSBkYXlzICogODY0MDA7CisJbWludXRlICA9IHNlY3MgLyA2MDsKKwlzZWNzICAgLT0gbWludXRlICogNjA7CisKKwlkcy0+ZGF5cyA9IGNwdV90b19iZTMyKGRheXMpOworCWRzLT5taW5zID0gY3B1X3RvX2JlMzIobWludXRlKTsKKwlkcy0+dGlja3MgPSBjcHVfdG9fYmUzMihzZWNzICogNTApOworfQorCittb2RlX3QKK3Byb3RfdG9fbW9kZSh1MzIgcHJvdCkKK3sKKwlpbnQgbW9kZSA9IDA7CisKKwlpZiAoIShwcm90ICYgRklCRl9OT1dSSVRFKSkKKwkJbW9kZSB8PSBTX0lXVVNSOworCWlmICghKHByb3QgJiBGSUJGX05PUkVBRCkpCisJCW1vZGUgfD0gU19JUlVTUjsKKwlpZiAoIShwcm90ICYgRklCRl9OT0VYRUNVVEUpKQorCQltb2RlIHw9IFNfSVhVU1I7CisJaWYgKHByb3QgJiBGSUJGX0dSUF9XUklURSkKKwkJbW9kZSB8PSBTX0lXR1JQOworCWlmIChwcm90ICYgRklCRl9HUlBfUkVBRCkKKwkJbW9kZSB8PSBTX0lSR1JQOworCWlmIChwcm90ICYgRklCRl9HUlBfRVhFQ1VURSkKKwkJbW9kZSB8PSBTX0lYR1JQOworCWlmIChwcm90ICYgRklCRl9PVFJfV1JJVEUpCisJCW1vZGUgfD0gU19JV09USDsKKwlpZiAocHJvdCAmIEZJQkZfT1RSX1JFQUQpCisJCW1vZGUgfD0gU19JUk9USDsKKwlpZiAocHJvdCAmIEZJQkZfT1RSX0VYRUNVVEUpCisJCW1vZGUgfD0gU19JWE9USDsKKworCXJldHVybiBtb2RlOworfQorCit2b2lkCittb2RlX3RvX3Byb3Qoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1MzIgcHJvdCA9IEFGRlNfSShpbm9kZSktPmlfcHJvdGVjdDsKKwltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CisKKwlpZiAoIShtb2RlICYgU19JWFVTUikpCisJCXByb3QgfD0gRklCRl9OT0VYRUNVVEU7CisJaWYgKCEobW9kZSAmIFNfSVJVU1IpKQorCQlwcm90IHw9IEZJQkZfTk9SRUFEOworCWlmICghKG1vZGUgJiBTX0lXVVNSKSkKKwkJcHJvdCB8PSBGSUJGX05PV1JJVEU7CisJaWYgKG1vZGUgJiBTX0lYR1JQKQorCQlwcm90IHw9IEZJQkZfR1JQX0VYRUNVVEU7CisJaWYgKG1vZGUgJiBTX0lSR1JQKQorCQlwcm90IHw9IEZJQkZfR1JQX1JFQUQ7CisJaWYgKG1vZGUgJiBTX0lXR1JQKQorCQlwcm90IHw9IEZJQkZfR1JQX1dSSVRFOworCWlmIChtb2RlICYgU19JWE9USCkKKwkJcHJvdCB8PSBGSUJGX09UUl9FWEVDVVRFOworCWlmIChtb2RlICYgU19JUk9USCkKKwkJcHJvdCB8PSBGSUJGX09UUl9SRUFEOworCWlmIChtb2RlICYgU19JV09USCkKKwkJcHJvdCB8PSBGSUJGX09UUl9XUklURTsKKworCUFGRlNfSShpbm9kZSktPmlfcHJvdGVjdCA9IHByb3Q7Cit9CisKK3ZvaWQKK2FmZnNfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QJIGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLGZtdCk7CisJdnNwcmludGYoRXJyb3JCdWZmZXIsZm10LGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCXByaW50ayhLRVJOX0NSSVQgIkFGRlMgZXJyb3IgKGRldmljZSAlcyk6ICVzKCk6ICVzXG4iLCBzYi0+c19pZCwKKwkJZnVuY3Rpb24sRXJyb3JCdWZmZXIpOworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQUZGUzogUmVtb3VudGluZyBmaWxlc3lzdGVtIHJlYWQtb25seVxuIik7CisJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworfQorCit2b2lkCithZmZzX3dhcm5pbmcoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QJIGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLGZtdCk7CisJdnNwcmludGYoRXJyb3JCdWZmZXIsZm10LGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIkFGRlMgd2FybmluZyAoZGV2aWNlICVzKTogJXMoKTogJXNcbiIsIHNiLT5zX2lkLAorCQlmdW5jdGlvbixFcnJvckJ1ZmZlcik7Cit9CisKKy8qIENoZWNrIGlmIHRoZSBuYW1lIGlzIHZhbGlkIGZvciBhIGFmZnMgb2JqZWN0LiAqLworCitpbnQKK2FmZnNfY2hlY2tfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLCBpbnQgbGVuKQoreworCWludAkgaTsKKworCWlmIChsZW4gPiAzMCkKKyNpZmRlZiBBRkZTX05PX1RSVU5DQVRFCisJCXJldHVybiAtRU5BTUVUT09MT05HOworI2Vsc2UKKwkJbGVuID0gMzA7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAobmFtZVtpXSA8ICcgJyB8fCBuYW1lW2ldID09ICc6JworCQkgICAgfHwgKG5hbWVbaV0gPiAweDdlICYmIG5hbWVbaV0gPCAweGEwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGNvcGllcyBuYW1lIHRvIGJzdHIsIHdpdGggYXQgbW9zdCAzMAorICogY2hhcmFjdGVycyBsZW5ndGguIFRoZSBic3RyIHdpbGwgYmUgcHJlcGVuZGVkIGJ5CisgKiBhIGxlbmd0aCBieXRlLgorICogTk9URTogVGhlIG5hbWUgd2lsbCBtdXN0IGJlIGFscmVhZHkgY2hlY2tlZCBieQorICogICAgICAgYWZmc19jaGVja19uYW1lKCkhCisgKi8KKworaW50CithZmZzX2NvcHlfbmFtZSh1bnNpZ25lZCBjaGFyICpic3RyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IGxlbiA9IG1pbihkZW50cnktPmRfbmFtZS5sZW4sIDMwdSk7CisKKwkqYnN0cisrID0gbGVuOworCW1lbWNweShic3RyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBsZW4pOworCXJldHVybiBsZW47Cit9CmRpZmYgLS1naXQgYS9mcy9hZmZzL2JpdG1hcC5jIGIvZnMvYWZmcy9iaXRtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGI5NTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZmcy9iaXRtYXAuYwpAQCAtMCwwICsxLDM5MCBAQAorLyoKKyAqICBsaW51eC9mcy9hZmZzL2JpdG1hcC5jCisgKgorICogIChjKSAxOTk2IEhhbnMtSm9hY2hpbSBXaWRtYWllcgorICoKKyAqICBiaXRtYXAuYyBjb250YWlucyB0aGUgY29kZSB0aGF0IGhhbmRsZXMgYWxsIGJpdG1hcCByZWxhdGVkIHN0dWZmIC0KKyAqICBibG9jayBhbGxvY2F0aW9uLCBkZWFsbG9jYXRpb24sIGNhbGN1bGF0aW9uIG9mIGZyZWUgc3BhY2UuCisgKi8KKworI2luY2x1ZGUgImFmZnMuaCIKKworLyogVGhpcyBpcywgb2YgY291cnNlLCBzaGFtZWxlc3NseSBzdG9sZW4gZnJvbSBmcy9taW5peCAqLworCitzdGF0aWMgaW50IG5pYmJsZW1hcFtdID0geyAwLDEsMSwyLDEsMiwyLDMsMSwyLDIsMywyLDMsMyw0IH07CisKK3N0YXRpYyB1MzIKK2FmZnNfY291bnRfZnJlZV9iaXRzKHUzMiBibG9ja3NpemUsIGNvbnN0IHZvaWQgKmRhdGEpCit7CisJY29uc3QgdTMyICptYXA7CisJdTMyIGZyZWU7CisJdTMyIHRtcDsKKworCW1hcCA9IGRhdGE7CisJZnJlZSA9IDA7CisJZm9yIChibG9ja3NpemUgLz0gNDsgYmxvY2tzaXplID4gMDsgYmxvY2tzaXplLS0pIHsKKwkJdG1wID0gKm1hcCsrOworCQl3aGlsZSAodG1wKSB7CisJCQlmcmVlICs9IG5pYmJsZW1hcFt0bXAgJiAweGZdOworCQkJdG1wID4+PSA0OworCQl9CisJfQorCisJcmV0dXJuIGZyZWU7Cit9CisKK3UzMgorYWZmc19jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBhZmZzX2JtX2luZm8gKmJtOworCXUzMiBmcmVlOworCWludCBpOworCisJcHJfZGVidWcoIkFGRlM6IGNvdW50X2ZyZWVfYmxvY2tzKClcbiIpOworCisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlyZXR1cm4gMDsKKworCWRvd24oJkFGRlNfU0Ioc2IpLT5zX2JtbG9jayk7CisKKwlibSA9IEFGRlNfU0Ioc2IpLT5zX2JpdG1hcDsKKwlmcmVlID0gMDsKKwlmb3IgKGkgPSBBRkZTX1NCKHNiKS0+c19ibWFwX2NvdW50OyBpID4gMDsgYm0rKywgaS0tKQorCQlmcmVlICs9IGJtLT5ibV9mcmVlOworCisJdXAoJkFGRlNfU0Ioc2IpLT5zX2JtbG9jayk7CisKKwlyZXR1cm4gZnJlZTsKK30KKwordm9pZAorYWZmc19mcmVlX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHUzMiBibG9jaykKK3sKKwlzdHJ1Y3QgYWZmc19zYl9pbmZvICpzYmkgPSBBRkZTX1NCKHNiKTsKKwlzdHJ1Y3QgYWZmc19ibV9pbmZvICpibTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXUzMiBibGssIGJtYXAsIGJpdCwgbWFzaywgdG1wOworCV9fYmUzMiAqZGF0YTsKKworCXByX2RlYnVnKCJBRkZTOiBmcmVlX2Jsb2NrKCV1KVxuIiwgYmxvY2spOworCisJaWYgKGJsb2NrID4gc2JpLT5zX3BhcnRpdGlvbl9zaXplKQorCQlnb3RvIGVycl9yYW5nZTsKKworCWJsayAgICAgPSBibG9jayAtIHNiaS0+c19yZXNlcnZlZDsKKwlibWFwICAgID0gYmxrIC8gc2JpLT5zX2JtYXBfYml0czsKKwliaXQgICAgID0gYmxrICUgc2JpLT5zX2JtYXBfYml0czsKKwlibSAgICAgID0gJnNiaS0+c19iaXRtYXBbYm1hcF07CisKKwlkb3duKCZzYmktPnNfYm1sb2NrKTsKKworCWJoID0gc2JpLT5zX2JtYXBfYmg7CisJaWYgKHNiaS0+c19sYXN0X2JtYXAgIT0gYm1hcCkgeworCQlhZmZzX2JyZWxzZShiaCk7CisJCWJoID0gYWZmc19icmVhZChzYiwgYm0tPmJtX2tleSk7CisJCWlmICghYmgpCisJCQlnb3RvIGVycl9iaF9yZWFkOworCQlzYmktPnNfYm1hcF9iaCA9IGJoOworCQlzYmktPnNfbGFzdF9ibWFwID0gYm1hcDsKKwl9CisKKwltYXNrID0gMSA8PCAoYml0ICYgMzEpOworCWRhdGEgPSAoX19iZTMyICopYmgtPmJfZGF0YSArIGJpdCAvIDMyICsgMTsKKworCS8qIG1hcmsgYmxvY2sgZnJlZSAqLworCXRtcCA9IGJlMzJfdG9fY3B1KCpkYXRhKTsKKwlpZiAodG1wICYgbWFzaykKKwkJZ290byBlcnJfZnJlZTsKKwkqZGF0YSA9IGNwdV90b19iZTMyKHRtcCB8IG1hc2spOworCisJLyogZml4IGNoZWNrc3VtICovCisJdG1wID0gYmUzMl90b19jcHUoKihfX2JlMzIgKiliaC0+Yl9kYXRhKTsKKwkqKF9fYmUzMiAqKWJoLT5iX2RhdGEgPSBjcHVfdG9fYmUzMih0bXAgLSBtYXNrKTsKKworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlzYi0+c19kaXJ0ID0gMTsKKwlibS0+Ym1fZnJlZSsrOworCisJdXAoJnNiaS0+c19ibWxvY2spOworCXJldHVybjsKKworZXJyX2ZyZWU6CisJYWZmc193YXJuaW5nKHNiLCJhZmZzX2ZyZWVfYmxvY2siLCJUcnlpbmcgdG8gZnJlZSBibG9jayAldSB3aGljaCBpcyBhbHJlYWR5IGZyZWUiLCBibG9jayk7CisJdXAoJnNiaS0+c19ibWxvY2spOworCXJldHVybjsKKworZXJyX2JoX3JlYWQ6CisJYWZmc19lcnJvcihzYiwiYWZmc19mcmVlX2Jsb2NrIiwiQ2Fubm90IHJlYWQgYml0bWFwIGJsb2NrICV1IiwgYm0tPmJtX2tleSk7CisJc2JpLT5zX2JtYXBfYmggPSBOVUxMOworCXNiaS0+c19sYXN0X2JtYXAgPSB+MDsKKwl1cCgmc2JpLT5zX2JtbG9jayk7CisJcmV0dXJuOworCitlcnJfcmFuZ2U6CisJYWZmc19lcnJvcihzYiwgImFmZnNfZnJlZV9ibG9jayIsIkJsb2NrICV1IG91dHNpZGUgcGFydGl0aW9uIiwgYmxvY2spOworCXJldHVybjsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgYmxvY2sgaW4gdGhlIGdpdmVuIGFsbG9jYXRpb24gem9uZS4KKyAqIFNpbmNlIHdlIGhhdmUgdG8gYnl0ZS1zd2FwIHRoZSBiaXRtYXAgb24gbGl0dGxlLWVuZGlhbgorICogbWFjaGluZXMsIHRoaXMgaXMgcmF0aGVyIGV4cGVuc2l2ZS4gVGhlcmVmb3Igd2Ugd2lsbAorICogcHJlYWxsb2NhdGUgdXAgdG8gMTYgYmxvY2tzIGZyb20gdGhlIHNhbWUgd29yZCwgaWYKKyAqIHBvc3NpYmxlLiBXZSBhcmUgbm90IGRvaW5nIHByZWFsbG9jYXRpb25zIGluIHRoZQorICogaGVhZGVyIHpvbmUsIHRob3VnaC4KKyAqLworCit1MzIKK2FmZnNfYWxsb2NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgdTMyIGdvYWwpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgYWZmc19zYl9pbmZvICpzYmk7CisJc3RydWN0IGFmZnNfYm1faW5mbyAqYm07CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlfX2JlMzIgKmRhdGEsICplbmRkYXRhOworCXUzMiBibGssIGJtYXAsIGJpdCwgbWFzaywgbWFzazIsIHRtcDsKKwlpbnQgaTsKKworCXNiID0gaW5vZGUtPmlfc2I7CisJc2JpID0gQUZGU19TQihzYik7CisKKwlwcl9kZWJ1ZygiQUZGUzogYmFsbG9jKGlub2RlPSVsdSxnb2FsPSV1KTogIiwgaW5vZGUtPmlfaW5vLCBnb2FsKTsKKworCWlmIChBRkZTX0koaW5vZGUpLT5pX3BhX2NudCkgeworCQlwcl9kZWJ1ZygiJWRcbiIsIEFGRlNfSShpbm9kZSktPmlfbGFzdGFsbG9jKzEpOworCQlBRkZTX0koaW5vZGUpLT5pX3BhX2NudC0tOworCQlyZXR1cm4gKytBRkZTX0koaW5vZGUpLT5pX2xhc3RhbGxvYzsKKwl9CisKKwlpZiAoIWdvYWwgfHwgZ29hbCA+IHNiaS0+c19wYXJ0aXRpb25fc2l6ZSkgeworCQlpZiAoZ29hbCkKKwkJCWFmZnNfd2FybmluZyhzYiwgImFmZnNfYmFsbG9jIiwgImludmFsaWQgZ29hbCAlZCIsIGdvYWwpOworCQkvL2lmICghQUZGU19JKGlub2RlKS0+aV9sYXN0X2Jsb2NrKQorCQkvLwlhZmZzX3dhcm5pbmcoc2IsICJhZmZzX2JhbGxvYyIsICJubyBsYXN0IGFsbG9jIGJsb2NrIik7CisJCWdvYWwgPSBzYmktPnNfcmVzZXJ2ZWQ7CisJfQorCisJYmxrID0gZ29hbCAtIHNiaS0+c19yZXNlcnZlZDsKKwlibWFwID0gYmxrIC8gc2JpLT5zX2JtYXBfYml0czsKKwlibSA9ICZzYmktPnNfYml0bWFwW2JtYXBdOworCisJZG93bigmc2JpLT5zX2JtbG9jayk7CisKKwlpZiAoYm0tPmJtX2ZyZWUpCisJCWdvdG8gZmluZF9ibWFwX2JpdDsKKworZmluZF9ibWFwOgorCS8qIHNlYXJjaCBmb3IgdGhlIG5leHQgYm1hcCBidWZmZXIgd2l0aCBmcmVlIGJpdHMgKi8KKwlpID0gc2JpLT5zX2JtYXBfY291bnQ7CisJZG8geworCQlpZiAoLS1pIDwgMCkKKwkJCWdvdG8gZXJyX2Z1bGw7CisJCWJtYXArKzsKKwkJYm0rKzsKKwkJaWYgKGJtYXAgPCBzYmktPnNfYm1hcF9jb3VudCkKKwkJCWNvbnRpbnVlOworCQkvKiByZXN0YXJ0IHNlYXJjaCBhdCB6ZXJvICovCisJCWJtYXAgPSAwOworCQlibSA9IHNiaS0+c19iaXRtYXA7CisJfSB3aGlsZSAoIWJtLT5ibV9mcmVlKTsKKwlibGsgPSBibWFwICogc2JpLT5zX2JtYXBfYml0czsKKworZmluZF9ibWFwX2JpdDoKKworCWJoID0gc2JpLT5zX2JtYXBfYmg7CisJaWYgKHNiaS0+c19sYXN0X2JtYXAgIT0gYm1hcCkgeworCQlhZmZzX2JyZWxzZShiaCk7CisJCWJoID0gYWZmc19icmVhZChzYiwgYm0tPmJtX2tleSk7CisJCWlmICghYmgpCisJCQlnb3RvIGVycl9iaF9yZWFkOworCQlzYmktPnNfYm1hcF9iaCA9IGJoOworCQlzYmktPnNfbGFzdF9ibWFwID0gYm1hcDsKKwl9CisKKwkvKiBmaW5kIGFuIHVudXNlZCBibG9jayBpbiB0aGlzIGJpdG1hcCBibG9jayAqLworCWJpdCA9IGJsayAlIHNiaS0+c19ibWFwX2JpdHM7CisJZGF0YSA9IChfX2JlMzIgKiliaC0+Yl9kYXRhICsgYml0IC8gMzIgKyAxOworCWVuZGRhdGEgPSAoX19iZTMyICopKCh1OCAqKWJoLT5iX2RhdGEgKyBzYi0+c19ibG9ja3NpemUpOworCW1hc2sgPSB+MFVMIDw8IChiaXQgJiAzMSk7CisJYmxrICY9IH4zMVVMOworCisJdG1wID0gYmUzMl90b19jcHUoKmRhdGEpOworCWlmICh0bXAgJiBtYXNrKQorCQlnb3RvIGZpbmRfYml0OworCisJLyogc2NhbiB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyICovCisJZG8geworCQlibGsgKz0gMzI7CisJCWlmICgrK2RhdGEgPj0gZW5kZGF0YSkKKwkJCS8qIGRpZG4ndCBmaW5kIHNvbWV0aGluZywgY2FuIG9ubHkgaGFwcGVuCisJCQkgKiBpZiBzY2FuIGRpZG4ndCBzdGFydCBhdCAwLCB0cnkgbmV4dCBibWFwCisJCQkgKi8KKwkJCWdvdG8gZmluZF9ibWFwOworCX0gd2hpbGUgKCEqZGF0YSk7CisJdG1wID0gYmUzMl90b19jcHUoKmRhdGEpOworCW1hc2sgPSB+MDsKKworZmluZF9iaXQ6CisJLyogZmluYWxseSBsb29rIGZvciBhIGZyZWUgYml0IGluIHRoZSB3b3JkICovCisJYml0ID0gZmZzKHRtcCAmIG1hc2spIC0gMTsKKwlibGsgKz0gYml0ICsgc2JpLT5zX3Jlc2VydmVkOworCW1hc2syID0gbWFzayA9IDEgPDwgKGJpdCAmIDMxKTsKKwlBRkZTX0koaW5vZGUpLT5pX2xhc3RhbGxvYyA9IGJsazsKKworCS8qIHByZWFsbG9jIGFzIG11Y2ggYXMgcG9zc2libGUgd2l0aGluIHRoaXMgd29yZCAqLworCXdoaWxlICgobWFzazIgPDw9IDEpKSB7CisJCWlmICghKHRtcCAmIG1hc2syKSkKKwkJCWJyZWFrOworCQlBRkZTX0koaW5vZGUpLT5pX3BhX2NudCsrOworCQltYXNrIHw9IG1hc2syOworCX0KKwlibS0+Ym1fZnJlZSAtPSBBRkZTX0koaW5vZGUpLT5pX3BhX2NudCArIDE7CisKKwkqZGF0YSA9IGNwdV90b19iZTMyKHRtcCAmIH5tYXNrKTsKKworCS8qIGZpeCBjaGVja3N1bSAqLworCXRtcCA9IGJlMzJfdG9fY3B1KCooX19iZTMyICopYmgtPmJfZGF0YSk7CisJKihfX2JlMzIgKiliaC0+Yl9kYXRhID0gY3B1X3RvX2JlMzIodG1wICsgbWFzayk7CisKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJc2ItPnNfZGlydCA9IDE7CisKKwl1cCgmc2JpLT5zX2JtbG9jayk7CisKKwlwcl9kZWJ1ZygiJWRcbiIsIGJsayk7CisJcmV0dXJuIGJsazsKKworZXJyX2JoX3JlYWQ6CisJYWZmc19lcnJvcihzYiwiYWZmc19yZWFkX2Jsb2NrIiwiQ2Fubm90IHJlYWQgYml0bWFwIGJsb2NrICV1IiwgYm0tPmJtX2tleSk7CisJc2JpLT5zX2JtYXBfYmggPSBOVUxMOworCXNiaS0+c19sYXN0X2JtYXAgPSB+MDsKK2Vycl9mdWxsOgorCXVwKCZzYmktPnNfYm1sb2NrKTsKKwlwcl9kZWJ1ZygiZmFpbGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGFmZnNfaW5pdF9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncykKK3sKKwlzdHJ1Y3QgYWZmc19ibV9pbmZvICpibTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJtYXBfYmggPSBOVUxMLCAqYmggPSBOVUxMOworCV9fYmUzMiAqYm1hcF9ibGs7CisJdTMyIHNpemUsIGJsaywgZW5kLCBvZmZzZXQsIG1hc2s7CisJaW50IGksIHJlcyA9IDA7CisJc3RydWN0IGFmZnNfc2JfaW5mbyAqc2JpID0gQUZGU19TQihzYik7CisKKwlpZiAoKmZsYWdzICYgTVNfUkRPTkxZKQorCQlyZXR1cm4gMDsKKworCWlmICghQUZGU19ST09UX1RBSUwoc2IsIHNiaS0+c19yb290X2JoKS0+Ym1fZmxhZykgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIkFGRlM6IEJpdG1hcCBpbnZhbGlkIC0gbW91bnRpbmcgJXMgcmVhZCBvbmx5XG4iLAorCQkJc2ItPnNfaWQpOworCQkqZmxhZ3MgfD0gTVNfUkRPTkxZOworCQlyZXR1cm4gMDsKKwl9CisKKwlzYmktPnNfbGFzdF9ibWFwID0gfjA7CisJc2JpLT5zX2JtYXBfYmggPSBOVUxMOworCXNiaS0+c19ibWFwX2JpdHMgPSBzYi0+c19ibG9ja3NpemUgKiA4IC0gMzI7CisJc2JpLT5zX2JtYXBfY291bnQgPSAoc2JpLT5zX3BhcnRpdGlvbl9zaXplIC0gc2JpLT5zX3Jlc2VydmVkICsKKwkJCQkgc2JpLT5zX2JtYXBfYml0cyAtIDEpIC8gc2JpLT5zX2JtYXBfYml0czsKKwlzaXplID0gc2JpLT5zX2JtYXBfY291bnQgKiBzaXplb2YoKmJtKTsKKwlibSA9IHNiaS0+c19iaXRtYXAgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghc2JpLT5zX2JpdG1hcCkgeworCQlwcmludGsoS0VSTl9FUlIgIkFGRlM6IEJpdG1hcCBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoc2JpLT5zX2JpdG1hcCwgMCwgc2l6ZSk7CisKKwlibWFwX2JsayA9IChfX2JlMzIgKilzYmktPnNfcm9vdF9iaC0+Yl9kYXRhOworCWJsayA9IHNiLT5zX2Jsb2Nrc2l6ZSAvIDQgLSA0OTsKKwllbmQgPSBibGsgKyAyNTsKKworCWZvciAoaSA9IHNiaS0+c19ibWFwX2NvdW50OyBpID4gMDsgYm0rKywgaS0tKSB7CisJCWFmZnNfYnJlbHNlKGJoKTsKKworCQlibS0+Ym1fa2V5ID0gYmUzMl90b19jcHUoYm1hcF9ibGtbYmxrXSk7CisJCWJoID0gYWZmc19icmVhZChzYiwgYm0tPmJtX2tleSk7CisJCWlmICghYmgpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiQUZGUzogQ2Fubm90IHJlYWQgYml0bWFwXG4iKTsKKwkJCXJlcyA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoYWZmc19jaGVja3N1bV9ibG9jayhzYiwgYmgpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJBRkZTOiBCaXRtYXAgJXUgaW52YWxpZCAtIG1vdW50aW5nICVzIHJlYWQgb25seS5cbiIsCisJCQkgICAgICAgYm0tPmJtX2tleSwgc2ItPnNfaWQpOworCQkJKmZsYWdzIHw9IE1TX1JET05MWTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXByX2RlYnVnKCJBRkZTOiByZWFkIGJpdG1hcCBibG9jayAlZDogJWRcbiIsIGJsaywgYm0tPmJtX2tleSk7CisJCWJtLT5ibV9mcmVlID0gYWZmc19jb3VudF9mcmVlX2JpdHMoc2ItPnNfYmxvY2tzaXplIC0gNCwgYmgtPmJfZGF0YSArIDQpOworCisJCS8qIERvbid0IHRyeSByZWFkIHRoZSBleHRlbnNpb24gaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jaywKKwkJICogYnV0IHdlIGFsc28gbmVlZCB0aGUgcmlnaHQgYm0gcG9pbnRlciBiZWxvdworCQkgKi8KKwkJaWYgKCsrYmxrIDwgZW5kIHx8IGkgPT0gMSkKKwkJCWNvbnRpbnVlOworCQlpZiAoYm1hcF9iaCkKKwkJCWFmZnNfYnJlbHNlKGJtYXBfYmgpOworCQlibWFwX2JoID0gYWZmc19icmVhZChzYiwgYmUzMl90b19jcHUoYm1hcF9ibGtbYmxrXSkpOworCQlpZiAoIWJtYXBfYmgpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiQUZGUzogQ2Fubm90IHJlYWQgYml0bWFwIGV4dGVuc2lvblxuIik7CisJCQlyZXMgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwkJYm1hcF9ibGsgPSAoX19iZTMyICopYm1hcF9iaC0+Yl9kYXRhOworCQlibGsgPSAwOworCQllbmQgPSBzYi0+c19ibG9ja3NpemUgLyA0IC0gMTsKKwl9CisKKwlvZmZzZXQgPSAoc2JpLT5zX3BhcnRpdGlvbl9zaXplIC0gc2JpLT5zX3Jlc2VydmVkKSAlIHNiaS0+c19ibWFwX2JpdHM7CisJbWFzayA9IH4oMHhGRkZGRkZGRlUgPDwgKG9mZnNldCAmIDMxKSk7CisJcHJfZGVidWcoImxhc3Qgd29yZDogJWQgJWQgJWRcbiIsIG9mZnNldCwgb2Zmc2V0IC8gMzIgKyAxLCBtYXNrKTsKKwlvZmZzZXQgPSBvZmZzZXQgLyAzMiArIDE7CisKKwlpZiAobWFzaykgeworCQl1MzIgb2xkLCBuZXc7CisKKwkJLyogTWFyayB1bnVzZWQgYml0cyBpbiB0aGUgbGFzdCB3b3JkIGFzIGFsbG9jYXRlZCAqLworCQlvbGQgPSBiZTMyX3RvX2NwdSgoKF9fYmUzMiAqKWJoLT5iX2RhdGEpW29mZnNldF0pOworCQluZXcgPSBvbGQgJiBtYXNrOworCQkvL2lmIChvbGQgIT0gbmV3KSB7CisJCQkoKF9fYmUzMiAqKWJoLT5iX2RhdGEpW29mZnNldF0gPSBjcHVfdG9fYmUzMihuZXcpOworCQkJLyogZml4IGNoZWNrc3VtICovCisJCQkvL25ldyAtPSBvbGQ7CisJCQkvL29sZCA9IGJlMzJfdG9fY3B1KCooX19iZTMyICopYmgtPmJfZGF0YSk7CisJCQkvLyooX19iZTMyICopYmgtPmJfZGF0YSA9IGNwdV90b19iZTMyKG9sZCAtIG5ldyk7CisJCQkvL21hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJLy99CisJCS8qIGNvcnJlY3Qgb2Zmc2V0IGZvciB0aGUgYml0bWFwIGNvdW50IGJlbG93ICovCisJCS8vb2Zmc2V0Kys7CisJfQorCXdoaWxlICgrK29mZnNldCA8IHNiLT5zX2Jsb2Nrc2l6ZSAvIDQpCisJCSgoX19iZTMyICopYmgtPmJfZGF0YSlbb2Zmc2V0XSA9IDA7CisJKChfX2JlMzIgKiliaC0+Yl9kYXRhKVswXSA9IDA7CisJKChfX2JlMzIgKiliaC0+Yl9kYXRhKVswXSA9IGNwdV90b19iZTMyKC1hZmZzX2NoZWNrc3VtX2Jsb2NrKHNiLCBiaCkpOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKworCS8qIHJlY2FsY3VsYXRlIGJpdG1hcCBjb3VudCBmb3IgbGFzdCBibG9jayAqLworCWJtLS07CisJYm0tPmJtX2ZyZWUgPSBhZmZzX2NvdW50X2ZyZWVfYml0cyhzYi0+c19ibG9ja3NpemUgLSA0LCBiaC0+Yl9kYXRhICsgNCk7CisKK291dDoKKwlhZmZzX2JyZWxzZShiaCk7CisJYWZmc19icmVsc2UoYm1hcF9iaCk7CisJcmV0dXJuIHJlczsKK30KKwordm9pZCBhZmZzX2ZyZWVfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGFmZnNfc2JfaW5mbyAqc2JpID0gQUZGU19TQihzYik7CisKKwlpZiAoIXNiaS0+c19iaXRtYXApCisJCXJldHVybjsKKworCWFmZnNfYnJlbHNlKHNiaS0+c19ibWFwX2JoKTsKKwlzYmktPnNfYm1hcF9iaCA9IE5VTEw7CisJc2JpLT5zX2xhc3RfYm1hcCA9IH4wOworCWtmcmVlKHNiaS0+c19iaXRtYXApOworCXNiaS0+c19iaXRtYXAgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9kaXIuYyBiL2ZzL2FmZnMvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4ZWZkMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2FmZnMvZGlyLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiAgbGludXgvZnMvYWZmcy9kaXIuYworICoKKyAqICAoYykgMTk5NiAgSGFucy1Kb2FjaGltIFdpZG1haWVyIC0gUmV3cml0dGVuCisgKgorICogIChDKSAxOTkzICBSYXkgQnVyciAtIE1vZGlmaWVkIGZvciBBbWlnYSBGRlMgZmlsZXN5c3RlbS4KKyAqCisgKiAgKEMpIDE5OTIgIEVyaWMgWW91bmdkYWxlIE1vZGlmaWVkIGZvciBJU08gOTY2MCBmaWxlc3lzdGVtLgorICoKKyAqICAoQykgMTk5MSAgTGludXMgVG9ydmFsZHMgLSBtaW5peCBmaWxlc3lzdGVtCisgKgorICogIGFmZnMgZGlyZWN0b3J5IGhhbmRsaW5nIGZ1bmN0aW9ucworICoKKyAqLworCisjaW5jbHVkZSAiYWZmcy5oIgorCitzdGF0aWMgaW50IGFmZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCB2b2lkICosIGZpbGxkaXJfdCk7CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWZmc19kaXJfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gYWZmc19yZWFkZGlyLAorCS5mc3luYwkJPSBmaWxlX2ZzeW5jLAorfTsKKworLyoKKyAqIGRpcmVjdG9yaWVzIGNhbiBoYW5kbGUgbW9zdCBvcGVyYXRpb25zLi4uCisgKi8KK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmNyZWF0ZQkJPSBhZmZzX2NyZWF0ZSwKKwkubG9va3VwCQk9IGFmZnNfbG9va3VwLAorCS5saW5rCQk9IGFmZnNfbGluaywKKwkudW5saW5rCQk9IGFmZnNfdW5saW5rLAorCS5zeW1saW5rCT0gYWZmc19zeW1saW5rLAorCS5ta2RpcgkJPSBhZmZzX21rZGlyLAorCS5ybWRpcgkJPSBhZmZzX3JtZGlyLAorCS5yZW5hbWUJCT0gYWZmc19yZW5hbWUsCisJLnNldGF0dHIJPSBhZmZzX25vdGlmeV9jaGFuZ2UsCit9OworCitzdGF0aWMgaW50CithZmZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpkaXJfYmg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpmaF9iaDsKKwl1bnNpZ25lZCBjaGFyCQkqbmFtZTsKKwlpbnQJCQkgbmFtZWxlbjsKKwl1MzIJCQkgaTsKKwlpbnQJCQkgaGFzaF9wb3M7CisJaW50CQkJIGNoYWluX3BvczsKKwl1MzIJCQkgZl9wb3M7CisJdTMyCQkJIGlubzsKKwlpbnQJCQkgc3RvcmVkOworCWludAkJCSByZXM7CisKKwlwcl9kZWJ1ZygiQUZGUzogcmVhZGRpcihpbm89JWx1LGZfcG9zPSVseClcbiIsaW5vZGUtPmlfaW5vLCh1bnNpZ25lZCBsb25nKWZpbHAtPmZfcG9zKTsKKworCXN0b3JlZCA9IDA7CisJcmVzICAgID0gLUVJTzsKKwlkaXJfYmggPSBOVUxMOworCWZoX2JoICA9IE5VTEw7CisJZl9wb3MgID0gZmlscC0+Zl9wb3M7CisKKwlpZiAoZl9wb3MgPT0gMCkgeworCQlmaWxwLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKTA7CisJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4iLCAxLCBmX3BvcywgaW5vZGUtPmlfaW5vLCBEVF9ESVIpIDwgMCkKKwkJCXJldHVybiAwOworCQlmaWxwLT5mX3BvcyA9IGZfcG9zID0gMTsKKwkJc3RvcmVkKys7CisJfQorCWlmIChmX3BvcyA9PSAxKSB7CisJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgZl9wb3MsIHBhcmVudF9pbm8oZmlscC0+Zl9kZW50cnkpLCBEVF9ESVIpIDwgMCkKKwkJCXJldHVybiBzdG9yZWQ7CisJCWZpbHAtPmZfcG9zID0gZl9wb3MgPSAyOworCQlzdG9yZWQrKzsKKwl9CisKKwlhZmZzX2xvY2tfZGlyKGlub2RlKTsKKwljaGFpbl9wb3MgPSAoZl9wb3MgLSAyKSAmIDB4ZmZmZjsKKwloYXNoX3BvcyAgPSAoZl9wb3MgLSAyKSA+PiAxNjsKKwlpZiAoY2hhaW5fcG9zID09IDB4ZmZmZikgeworCQlhZmZzX3dhcm5pbmcoc2IsICJyZWFkZGlyIiwgIk1vcmUgdGhhbiA2NTUzNSBlbnRyaWVzIGluIGNoYWluIik7CisJCWNoYWluX3BvcyA9IDA7CisJCWhhc2hfcG9zKys7CisJCWZpbHAtPmZfcG9zID0gKChoYXNoX3BvcyA8PCAxNikgfCBjaGFpbl9wb3MpICsgMjsKKwl9CisJZGlyX2JoID0gYWZmc19icmVhZChzYiwgaW5vZGUtPmlfaW5vKTsKKwlpZiAoIWRpcl9iaCkKKwkJZ290byByZWFkZGlyX291dDsKKworCS8qIElmIHRoZSBkaXJlY3RvcnkgaGFzbid0IGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byByZWFkZGlyKCksCisJICogd2UgY2FuIGp1bXAgZGlyZWN0bHkgdG8gd2hlcmUgd2UgbGVmdCBvZmYuCisJICovCisJaW5vID0gKHUzMikobG9uZylmaWxwLT5wcml2YXRlX2RhdGE7CisJaWYgKGlubyAmJiBmaWxwLT5mX3ZlcnNpb24gPT0gaW5vZGUtPmlfdmVyc2lvbikgeworCQlwcl9kZWJ1ZygiQUZGUzogcmVhZGRpcigpIGxlZnQgb2ZmPSVkXG4iLCBpbm8pOworCQlnb3RvIGluc2lkZTsKKwl9CisKKwlpbm8gPSBiZTMyX3RvX2NwdShBRkZTX0hFQUQoZGlyX2JoKS0+dGFibGVbaGFzaF9wb3NdKTsKKwlmb3IgKGkgPSAwOyBpbm8gJiYgaSA8IGNoYWluX3BvczsgaSsrKSB7CisJCWZoX2JoID0gYWZmc19icmVhZChzYiwgaW5vKTsKKwkJaWYgKCFmaF9iaCkgeworCQkJYWZmc19lcnJvcihzYiwgInJlYWRkaXIiLCJDYW5ub3QgcmVhZCBibG9jayAlZCIsIGkpOworCQkJZ290byByZWFkZGlyX291dDsKKwkJfQorCQlpbm8gPSBiZTMyX3RvX2NwdShBRkZTX1RBSUwoc2IsIGZoX2JoKS0+aGFzaF9jaGFpbik7CisJCWFmZnNfYnJlbHNlKGZoX2JoKTsKKwkJZmhfYmggPSBOVUxMOworCX0KKwlpZiAoaW5vKQorCQlnb3RvIGluc2lkZTsKKwloYXNoX3BvcysrOworCisJZm9yICg7IGhhc2hfcG9zIDwgQUZGU19TQihzYiktPnNfaGFzaHNpemU7IGhhc2hfcG9zKyspIHsKKwkJaW5vID0gYmUzMl90b19jcHUoQUZGU19IRUFEKGRpcl9iaCktPnRhYmxlW2hhc2hfcG9zXSk7CisJCWlmICghaW5vKQorCQkJY29udGludWU7CisJCWZfcG9zID0gKGhhc2hfcG9zIDw8IDE2KSArIDI7CitpbnNpZGU6CisJCWRvIHsKKwkJCWZoX2JoID0gYWZmc19icmVhZChzYiwgaW5vKTsKKwkJCWlmICghZmhfYmgpIHsKKwkJCQlhZmZzX2Vycm9yKHNiLCAicmVhZGRpciIsIkNhbm5vdCByZWFkIGJsb2NrICVkIiwgaW5vKTsKKwkJCQlnb3RvIHJlYWRkaXJfZG9uZTsKKwkJCX0KKworCQkJbmFtZWxlbiA9IG1pbihBRkZTX1RBSUwoc2IsIGZoX2JoKS0+bmFtZVswXSwgKHU4KTMwKTsKKwkJCW5hbWUgPSBBRkZTX1RBSUwoc2IsIGZoX2JoKS0+bmFtZSArIDE7CisJCQlwcl9kZWJ1ZygiQUZGUzogcmVhZGRpcigpOiBmaWxsZGlyKFwiJS4qc1wiLCBpbm89JXUpLCBoYXNoPSVkLCBmX3Bvcz0leFxuIiwKKwkJCQkgbmFtZWxlbiwgbmFtZSwgaW5vLCBoYXNoX3BvcywgZl9wb3MpOworCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBuYW1lLCBuYW1lbGVuLCBmX3BvcywgaW5vLCBEVF9VTktOT1dOKSA8IDApCisJCQkJZ290byByZWFkZGlyX2RvbmU7CisJCQlzdG9yZWQrKzsKKwkJCWZfcG9zKys7CisJCQlpbm8gPSBiZTMyX3RvX2NwdShBRkZTX1RBSUwoc2IsIGZoX2JoKS0+aGFzaF9jaGFpbik7CisJCQlhZmZzX2JyZWxzZShmaF9iaCk7CisJCQlmaF9iaCA9IE5VTEw7CisJCX0gd2hpbGUgKGlubyk7CisJfQorcmVhZGRpcl9kb25lOgorCWZpbHAtPmZfcG9zID0gZl9wb3M7CisJZmlscC0+Zl92ZXJzaW9uID0gaW5vZGUtPmlfdmVyc2lvbjsKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKShsb25nKWlubzsKKwlyZXMgPSBzdG9yZWQ7CisKK3JlYWRkaXJfb3V0OgorCWFmZnNfYnJlbHNlKGRpcl9iaCk7CisJYWZmc19icmVsc2UoZmhfYmgpOworCWFmZnNfdW5sb2NrX2Rpcihpbm9kZSk7CisJcHJfZGVidWcoIkFGRlM6IHJlYWRkaXIoKT0lZFxuIiwgc3RvcmVkKTsKKwlyZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9maWxlLmMgYi9mcy9hZmZzL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzQ0OTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZmcy9maWxlLmMKQEAgLTAsMCArMSw5MjAgQEAKKy8qCisgKiAgbGludXgvZnMvYWZmcy9maWxlLmMKKyAqCisgKiAgKGMpIDE5OTYgIEhhbnMtSm9hY2hpbSBXaWRtYWllciAtIFJld3JpdHRlbgorICoKKyAqICAoQykgMTk5MyAgUmF5IEJ1cnIgLSBNb2RpZmllZCBmb3IgQW1pZ2EgRkZTIGZpbGVzeXN0ZW0uCisgKgorICogIChDKSAxOTkyICBFcmljIFlvdW5nZGFsZSBNb2RpZmllZCBmb3IgSVNPIDk2NjAgZmlsZXN5c3RlbS4KKyAqCisgKiAgKEMpIDE5OTEgIExpbnVzIFRvcnZhbGRzIC0gbWluaXggZmlsZXN5c3RlbQorICoKKyAqICBhZmZzIHJlZ3VsYXIgZmlsZSBoYW5kbGluZyBwcmltaXRpdmVzCisgKi8KKworI2luY2x1ZGUgImFmZnMuaCIKKworI2lmIFBBR0VfU0laRSA8IDQwOTYKKyNlcnJvciBQQUdFX1NJWkUgbXVzdCBiZSBhdCBsZWFzdCA0MDk2CisjZW5kaWYKKworc3RhdGljIGludCBhZmZzX2dyb3dfZXh0Y2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwgdTMyIGxjX2lkeCk7CitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICphZmZzX2FsbG9jX2V4dGJsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHUzMiBleHQpOworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmFmZnNfZ2V0X2V4dGJsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiBleHQpOworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqYWZmc19nZXRfZXh0YmxvY2tfc2xvdyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgZXh0KTsKK3N0YXRpYyBzc2l6ZV90IGFmZnNfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIGludCBhZmZzX2ZpbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdGF0aWMgaW50IGFmZnNfZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZmZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19maWxlX3JlYWQsCisJLndyaXRlCQk9IGFmZnNfZmlsZV93cml0ZSwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkub3BlbgkJPSBhZmZzX2ZpbGVfb3BlbiwKKwkucmVsZWFzZQk9IGFmZnNfZmlsZV9yZWxlYXNlLAorCS5mc3luYwkJPSBmaWxlX2ZzeW5jLAorCS5zZW5kZmlsZQk9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0geworCS50cnVuY2F0ZQk9IGFmZnNfdHJ1bmNhdGUsCisJLnNldGF0dHIJPSBhZmZzX25vdGlmeV9jaGFuZ2UsCit9OworCitzdGF0aWMgaW50CithZmZzX2ZpbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpZiAoYXRvbWljX3JlYWQoJmZpbHAtPmZfY291bnQpICE9IDEpCisJCXJldHVybiAwOworCXByX2RlYnVnKCJBRkZTOiBvcGVuKCVkKVxuIiwgQUZGU19JKGlub2RlKS0+aV9vcGVuY250KTsKKwlBRkZTX0koaW5vZGUpLT5pX29wZW5jbnQrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYWZmc19maWxlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJaWYgKGF0b21pY19yZWFkKCZmaWxwLT5mX2NvdW50KSAhPSAwKQorCQlyZXR1cm4gMDsKKwlwcl9kZWJ1ZygiQUZGUzogcmVsZWFzZSglZClcbiIsIEFGRlNfSShpbm9kZSktPmlfb3BlbmNudCk7CisJQUZGU19JKGlub2RlKS0+aV9vcGVuY250LS07CisJaWYgKCFBRkZTX0koaW5vZGUpLT5pX29wZW5jbnQpCisJCWFmZnNfZnJlZV9wcmVhbGxvYyhpbm9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYWZmc19ncm93X2V4dGNhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiBsY19pZHgpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBidWZmZXJfaGVhZAkqYmg7CisJdTMyIGxjX21heDsKKwlpbnQgaSwgaiwga2V5OworCisJaWYgKCFBRkZTX0koaW5vZGUpLT5pX2xjKSB7CisJCWNoYXIgKnB0ciA9IChjaGFyICopZ2V0X3plcm9lZF9wYWdlKEdGUF9OT0ZTKTsKKwkJaWYgKCFwdHIpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJQUZGU19JKGlub2RlKS0+aV9sYyA9ICh1MzIgKilwdHI7CisJCUFGRlNfSShpbm9kZSktPmlfYWMgPSAoc3RydWN0IGFmZnNfZXh0X2tleSAqKShwdHIgKyBBRkZTX0NBQ0hFX1NJWkUgLyAyKTsKKwl9CisKKwlsY19tYXggPSBBRkZTX0xDX1NJWkUgPDwgQUZGU19JKGlub2RlKS0+aV9sY19zaGlmdDsKKworCWlmIChBRkZTX0koaW5vZGUpLT5pX2V4dGNudCA+IGxjX21heCkgeworCQl1MzIgbGNfc2hpZnQsIGxjX21hc2ssIHRtcCwgb2ZmOworCisJCS8qIG5lZWQgdG8gcmVjYWxjdWxhdGUgbGluZWFyIGNhY2hlLCBzdGFydCBmcm9tIG9sZCBzaXplICovCisJCWxjX3NoaWZ0ID0gQUZGU19JKGlub2RlKS0+aV9sY19zaGlmdDsKKwkJdG1wID0gKEFGRlNfSShpbm9kZSktPmlfZXh0Y250IC8gQUZGU19MQ19TSVpFKSA+PiBsY19zaGlmdDsKKwkJZm9yICg7IHRtcDsgdG1wID4+PSAxKQorCQkJbGNfc2hpZnQrKzsKKwkJbGNfbWFzayA9ICgxIDw8IGxjX3NoaWZ0KSAtIDE7CisKKwkJLyogZml4IGlkeCBhbmQgb2xkIHNpemUgdG8gbmV3IHNoaWZ0ICovCisJCWxjX2lkeCA+Pj0gKGxjX3NoaWZ0IC0gQUZGU19JKGlub2RlKS0+aV9sY19zaGlmdCk7CisJCUFGRlNfSShpbm9kZSktPmlfbGNfc2l6ZSA+Pj0gKGxjX3NoaWZ0IC0gQUZGU19JKGlub2RlKS0+aV9sY19zaGlmdCk7CisKKwkJLyogZmlyc3Qgc2hyaW5rIG9sZCBjYWNoZSB0byBtYWtlIG1vcmUgc3BhY2UgKi8KKwkJb2ZmID0gMSA8PCAobGNfc2hpZnQgLSBBRkZTX0koaW5vZGUpLT5pX2xjX3NoaWZ0KTsKKwkJZm9yIChpID0gMSwgaiA9IG9mZjsgaiA8IEFGRlNfTENfU0laRTsgaSsrLCBqICs9IG9mZikKKwkJCUFGRlNfSShpbm9kZSktPmlfYWNbaV0gPSBBRkZTX0koaW5vZGUpLT5pX2FjW2pdOworCisJCUFGRlNfSShpbm9kZSktPmlfbGNfc2hpZnQgPSBsY19zaGlmdDsKKwkJQUZGU19JKGlub2RlKS0+aV9sY19tYXNrID0gbGNfbWFzazsKKwl9CisKKwkvKiBmaWxsIGNhY2hlIHRvIHRoZSBuZWVkZWQgaW5kZXggKi8KKwlpID0gQUZGU19JKGlub2RlKS0+aV9sY19zaXplOworCUFGRlNfSShpbm9kZSktPmlfbGNfc2l6ZSA9IGxjX2lkeCArIDE7CisJZm9yICg7IGkgPD0gbGNfaWR4OyBpKyspIHsKKwkJaWYgKCFpKSB7CisJCQlBRkZTX0koaW5vZGUpLT5pX2xjWzBdID0gaW5vZGUtPmlfaW5vOworCQkJY29udGludWU7CisJCX0KKwkJa2V5ID0gQUZGU19JKGlub2RlKS0+aV9sY1tpIC0gMV07CisJCWogPSBBRkZTX0koaW5vZGUpLT5pX2xjX21hc2sgKyAxOworCQkvLyB1bmxvY2sgY2FjaGUKKwkJZm9yICg7IGogPiAwOyBqLS0pIHsKKwkJCWJoID0gYWZmc19icmVhZChzYiwga2V5KTsKKwkJCWlmICghYmgpCisJCQkJZ290byBlcnI7CisJCQlrZXkgPSBiZTMyX3RvX2NwdShBRkZTX1RBSUwoc2IsIGJoKS0+ZXh0ZW5zaW9uKTsKKwkJCWFmZnNfYnJlbHNlKGJoKTsKKwkJfQorCQkvLyBsb2NrIGNhY2hlCisJCUFGRlNfSShpbm9kZSktPmlfbGNbaV0gPSBrZXk7CisJfQorCisJcmV0dXJuIDA7CisKK2VycjoKKwkvLyBsb2NrIGNhY2hlCisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorYWZmc19hbGxvY19leHRibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB1MzIgZXh0KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5ld19iaDsKKwl1MzIgYmxvY2tuciwgdG1wOworCisJYmxvY2tuciA9IGFmZnNfYWxsb2NfYmxvY2soaW5vZGUsIGJoLT5iX2Jsb2NrbnIpOworCWlmICghYmxvY2tucikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7CisKKwluZXdfYmggPSBhZmZzX2dldHplcm9ibGsoc2IsIGJsb2NrbnIpOworCWlmICghbmV3X2JoKSB7CisJCWFmZnNfZnJlZV9ibG9jayhzYiwgYmxvY2tucik7CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOworCX0KKworCUFGRlNfSEVBRChuZXdfYmgpLT5wdHlwZSA9IGNwdV90b19iZTMyKFRfTElTVCk7CisJQUZGU19IRUFEKG5ld19iaCktPmtleSA9IGNwdV90b19iZTMyKGJsb2NrbnIpOworCUFGRlNfVEFJTChzYiwgbmV3X2JoKS0+c3R5cGUgPSBjcHVfdG9fYmUzMihTVF9GSUxFKTsKKwlBRkZTX1RBSUwoc2IsIG5ld19iaCktPnBhcmVudCA9IGNwdV90b19iZTMyKGlub2RlLT5pX2lubyk7CisJYWZmc19maXhfY2hlY2tzdW0oc2IsIG5ld19iaCk7CisKKwltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShuZXdfYmgsIGlub2RlKTsKKworCXRtcCA9IGJlMzJfdG9fY3B1KEFGRlNfVEFJTChzYiwgYmgpLT5leHRlbnNpb24pOworCWlmICh0bXApCisJCWFmZnNfd2FybmluZyhzYiwgImFsbG9jX2V4dCIsICJwcmV2aW91cyBleHRlbnNpb24gc2V0ICgleCkiLCB0bXApOworCUFGRlNfVEFJTChzYiwgYmgpLT5leHRlbnNpb24gPSBjcHVfdG9fYmUzMihibG9ja25yKTsKKwlhZmZzX2FkanVzdF9jaGVja3N1bShiaCwgYmxvY2tuciAtIHRtcCk7CisJbWFya19idWZmZXJfZGlydHlfaW5vZGUoYmgsIGlub2RlKTsKKworCUFGRlNfSShpbm9kZSktPmlfZXh0Y250Kys7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisKKwlyZXR1cm4gbmV3X2JoOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBidWZmZXJfaGVhZCAqCithZmZzX2dldF9leHRibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgZXh0KQoreworCS8qIGlubGluZSB0aGUgc2ltcGxlc3QgY2FzZTogc2FtZSBleHRlbmRlZCBibG9jayBhcyBsYXN0IHRpbWUgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gQUZGU19JKGlub2RlKS0+aV9leHRfYmg7CisJaWYgKGV4dCA9PSBBRkZTX0koaW5vZGUpLT5pX2V4dF9sYXN0KQorCQlhdG9taWNfaW5jKCZiaC0+Yl9jb3VudCk7CisJZWxzZQorCQkvKiB3ZSBoYXZlIHRvIGRvIG1vcmUgKG5vdCBpbmxpbmVkKSAqLworCQliaCA9IGFmZnNfZ2V0X2V4dGJsb2NrX3Nsb3coaW5vZGUsIGV4dCk7CisKKwlyZXR1cm4gYmg7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorYWZmc19nZXRfZXh0YmxvY2tfc2xvdyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgZXh0KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXUzMiBleHRfa2V5OworCXUzMiBsY19pZHgsIGxjX29mZiwgYWNfaWR4OworCXUzMiB0bXAsIGlkeDsKKworCWlmIChleHQgPT0gQUZGU19JKGlub2RlKS0+aV9leHRfbGFzdCArIDEpIHsKKwkJLyogcmVhZCB0aGUgbmV4dCBleHRlbmRlZCBibG9jayBmcm9tIHRoZSBjdXJyZW50IG9uZSAqLworCQliaCA9IEFGRlNfSShpbm9kZSktPmlfZXh0X2JoOworCQlleHRfa2V5ID0gYmUzMl90b19jcHUoQUZGU19UQUlMKHNiLCBiaCktPmV4dGVuc2lvbik7CisJCWlmIChleHQgPCBBRkZTX0koaW5vZGUpLT5pX2V4dGNudCkKKwkJCWdvdG8gcmVhZF9leHQ7CisJCWlmIChleHQgPiBBRkZTX0koaW5vZGUpLT5pX2V4dGNudCkKKwkJCUJVRygpOworCQliaCA9IGFmZnNfYWxsb2NfZXh0YmxvY2soaW5vZGUsIGJoLCBleHQpOworCQlpZiAoSVNfRVJSKGJoKSkKKwkJCXJldHVybiBiaDsKKwkJZ290byBzdG9yZV9leHQ7CisJfQorCisJaWYgKGV4dCA9PSAwKSB7CisJCS8qIHdlIHNlZWsgYmFjayB0byB0aGUgZmlsZSBoZWFkZXIgYmxvY2sgKi8KKwkJZXh0X2tleSA9IGlub2RlLT5pX2lubzsKKwkJZ290byByZWFkX2V4dDsKKwl9CisKKwlpZiAoZXh0ID49IEFGRlNfSShpbm9kZSktPmlfZXh0Y250KSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqcHJldl9iaDsKKworCQkvKiBhbGxvY2F0ZSBhIG5ldyBleHRlbmRlZCBibG9jayAqLworCQlpZiAoZXh0ID4gQUZGU19JKGlub2RlKS0+aV9leHRjbnQpCisJCQlCVUcoKTsKKworCQkvKiBnZXQgcHJldmlvdXMgZXh0ZW5kZWQgYmxvY2sgKi8KKwkJcHJldl9iaCA9IGFmZnNfZ2V0X2V4dGJsb2NrKGlub2RlLCBleHQgLSAxKTsKKwkJaWYgKElTX0VSUihwcmV2X2JoKSkKKwkJCXJldHVybiBwcmV2X2JoOworCQliaCA9IGFmZnNfYWxsb2NfZXh0YmxvY2soaW5vZGUsIHByZXZfYmgsIGV4dCk7CisJCWFmZnNfYnJlbHNlKHByZXZfYmgpOworCQlpZiAoSVNfRVJSKGJoKSkKKwkJCXJldHVybiBiaDsKKwkJZ290byBzdG9yZV9leHQ7CisJfQorCithZ2FpbjoKKwkvKiBjaGVjayBpZiB0aGVyZSBpcyBhbiBleHRlbmRlZCBjYWNoZSBhbmQgd2hldGhlciBpdCdzIGxhcmdlIGVub3VnaCAqLworCWxjX2lkeCA9IGV4dCA+PiBBRkZTX0koaW5vZGUpLT5pX2xjX3NoaWZ0OworCWxjX29mZiA9IGV4dCAmIEFGRlNfSShpbm9kZSktPmlfbGNfbWFzazsKKworCWlmIChsY19pZHggPj0gQUZGU19JKGlub2RlKS0+aV9sY19zaXplKSB7CisJCWludCBlcnI7CisKKwkJZXJyID0gYWZmc19ncm93X2V4dGNhY2hlKGlub2RlLCBsY19pZHgpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwkJZ290byBhZ2FpbjsKKwl9CisKKwkvKiBldmVyeSBuJ3RoIGtleSB3ZSBmaW5kIGluIHRoZSBsaW5lYXIgY2FjaGUgKi8KKwlpZiAoIWxjX29mZikgeworCQlleHRfa2V5ID0gQUZGU19JKGlub2RlKS0+aV9sY1tsY19pZHhdOworCQlnb3RvIHJlYWRfZXh0OworCX0KKworCS8qIG1heWJlIGl0J3Mgc3RpbGwgaW4gdGhlIGFzc29jaWF0aXZlIGNhY2hlICovCisJYWNfaWR4ID0gKGV4dCAtIGxjX2lkeCAtIDEpICYgQUZGU19BQ19NQVNLOworCWlmIChBRkZTX0koaW5vZGUpLT5pX2FjW2FjX2lkeF0uZXh0ID09IGV4dCkgeworCQlleHRfa2V5ID0gQUZGU19JKGlub2RlKS0+aV9hY1thY19pZHhdLmtleTsKKwkJZ290byByZWFkX2V4dDsKKwl9CisKKwkvKiB0cnkgdG8gZmluZCBvbmUgb2YgdGhlIHByZXZpb3VzIGV4dGVuZGVkIGJsb2NrcyAqLworCXRtcCA9IGV4dDsKKwlpZHggPSBhY19pZHg7CisJd2hpbGUgKC0tdG1wLCAtLWxjX29mZiA+IDApIHsKKwkJaWR4ID0gKGlkeCAtIDEpICYgQUZGU19BQ19NQVNLOworCQlpZiAoQUZGU19JKGlub2RlKS0+aV9hY1tpZHhdLmV4dCA9PSB0bXApIHsKKwkJCWV4dF9rZXkgPSBBRkZTX0koaW5vZGUpLT5pX2FjW2lkeF0ua2V5OworCQkJZ290byBmaW5kX2V4dDsKKwkJfQorCX0KKworCS8qIGZhbGwgYmFjayB0byB0aGUgbGluZWFyIGNhY2hlICovCisJZXh0X2tleSA9IEFGRlNfSShpbm9kZSktPmlfbGNbbGNfaWR4XTsKK2ZpbmRfZXh0OgorCS8qIHJlYWQgYWxsIGV4dGVuZGVkIGJsb2NrcyB1bnRpbCB3ZSBmaW5kIHRoZSBvbmUgd2UgbmVlZCAqLworCS8vdW5sb2NrIGNhY2hlCisJZG8geworCQliaCA9IGFmZnNfYnJlYWQoc2IsIGV4dF9rZXkpOworCQlpZiAoIWJoKQorCQkJZ290byBlcnJfYnJlYWQ7CisJCWV4dF9rZXkgPSBiZTMyX3RvX2NwdShBRkZTX1RBSUwoc2IsIGJoKS0+ZXh0ZW5zaW9uKTsKKwkJYWZmc19icmVsc2UoYmgpOworCQl0bXArKzsKKwl9IHdoaWxlICh0bXAgPCBleHQpOworCS8vbG9jayBjYWNoZQorCisJLyogc3RvcmUgaXQgaW4gdGhlIGFzc29jaWF0aXZlIGNhY2hlICovCisJLy8gcmVjYWxjdWxhdGUgYWNfaWR4PworCUFGRlNfSShpbm9kZSktPmlfYWNbYWNfaWR4XS5leHQgPSBleHQ7CisJQUZGU19JKGlub2RlKS0+aV9hY1thY19pZHhdLmtleSA9IGV4dF9rZXk7CisKK3JlYWRfZXh0OgorCS8qIGZpbmFsbHkgcmVhZCB0aGUgcmlnaHQgZXh0ZW5kZWQgYmxvY2sgKi8KKwkvL3VubG9jayBjYWNoZQorCWJoID0gYWZmc19icmVhZChzYiwgZXh0X2tleSk7CisJaWYgKCFiaCkKKwkJZ290byBlcnJfYnJlYWQ7CisJLy9sb2NrIGNhY2hlCisKK3N0b3JlX2V4dDoKKwkvKiByZWxlYXNlIG9sZCBjYWNoZWQgZXh0ZW5kZWQgYmxvY2sgYW5kIHN0b3JlIHRoZSBuZXcgb25lICovCisJYWZmc19icmVsc2UoQUZGU19JKGlub2RlKS0+aV9leHRfYmgpOworCUFGRlNfSShpbm9kZSktPmlfZXh0X2xhc3QgPSBleHQ7CisJQUZGU19JKGlub2RlKS0+aV9leHRfYmggPSBiaDsKKwlhdG9taWNfaW5jKCZiaC0+Yl9jb3VudCk7CisKKwlyZXR1cm4gYmg7CisKK2Vycl9icmVhZDoKKwlhZmZzX2JyZWxzZShiaCk7CisJcmV0dXJuIEVSUl9QVFIoLUVJTyk7Cit9CisKK3N0YXRpYyBpbnQKK2FmZnNfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGJsb2NrLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpleHRfYmg7CisJdTMyCQkJIGV4dDsKKworCXByX2RlYnVnKCJBRkZTOiBnZXRfYmxvY2soJXUsICVsdSlcbiIsICh1MzIpaW5vZGUtPmlfaW5vLCAodW5zaWduZWQgbG9uZylibG9jayk7CisKKworCWlmIChibG9jayA+IChzZWN0b3JfdCkweDdmZmZmZmZmVUwpCisJCUJVRygpOworCisJaWYgKGJsb2NrID49IEFGRlNfSShpbm9kZSktPmlfYmxrY250KSB7CisJCWlmIChibG9jayA+IEFGRlNfSShpbm9kZSktPmlfYmxrY250IHx8ICFjcmVhdGUpCisJCQlnb3RvIGVycl9iaWc7CisJfSBlbHNlCisJCWNyZWF0ZSA9IDA7CisKKwkvL2xvY2sgY2FjaGUKKwlhZmZzX2xvY2tfZXh0KGlub2RlKTsKKworCWV4dCA9ICh1MzIpYmxvY2sgLyBBRkZTX1NCKHNiKS0+c19oYXNoc2l6ZTsKKwlibG9jayAtPSBleHQgKiBBRkZTX1NCKHNiKS0+c19oYXNoc2l6ZTsKKwlleHRfYmggPSBhZmZzX2dldF9leHRibG9jayhpbm9kZSwgZXh0KTsKKwlpZiAoSVNfRVJSKGV4dF9iaCkpCisJCWdvdG8gZXJyX2V4dDsKKwltYXBfYmgoYmhfcmVzdWx0LCBzYiwgKHNlY3Rvcl90KWJlMzJfdG9fY3B1KEFGRlNfQkxPQ0soc2IsIGV4dF9iaCwgYmxvY2spKSk7CisKKwlpZiAoY3JlYXRlKSB7CisJCXUzMiBibG9ja25yID0gYWZmc19hbGxvY19ibG9jayhpbm9kZSwgZXh0X2JoLT5iX2Jsb2NrbnIpOworCQlpZiAoIWJsb2NrbnIpCisJCQlnb3RvIGVycl9hbGxvYzsKKwkJc2V0X2J1ZmZlcl9uZXcoYmhfcmVzdWx0KTsKKwkJQUZGU19JKGlub2RlKS0+bW11X3ByaXZhdGUgKz0gQUZGU19TQihzYiktPnNfZGF0YV9ibGtzaXplOworCQlBRkZTX0koaW5vZGUpLT5pX2Jsa2NudCsrOworCisJCS8qIHN0b3JlIG5ldyBibG9jayAqLworCQlpZiAoYmhfcmVzdWx0LT5iX2Jsb2NrbnIpCisJCQlhZmZzX3dhcm5pbmcoc2IsICJnZXRfYmxvY2siLCAiYmxvY2sgYWxyZWFkeSBzZXQgKCV4KSIsIGJoX3Jlc3VsdC0+Yl9ibG9ja25yKTsKKwkJQUZGU19CTE9DSyhzYiwgZXh0X2JoLCBibG9jaykgPSBjcHVfdG9fYmUzMihibG9ja25yKTsKKwkJQUZGU19IRUFEKGV4dF9iaCktPmJsb2NrX2NvdW50ID0gY3B1X3RvX2JlMzIoYmxvY2sgKyAxKTsKKwkJYWZmc19hZGp1c3RfY2hlY2tzdW0oZXh0X2JoLCBibG9ja25yIC0gYmhfcmVzdWx0LT5iX2Jsb2NrbnIgKyAxKTsKKwkJYmhfcmVzdWx0LT5iX2Jsb2NrbnIgPSBibG9ja25yOworCisJCWlmICghYmxvY2spIHsKKwkJCS8qIGluc2VydCBmaXJzdCBibG9jayBpbnRvIGhlYWRlciBibG9jayAqLworCQkJdTMyIHRtcCA9IGJlMzJfdG9fY3B1KEFGRlNfSEVBRChleHRfYmgpLT5maXJzdF9kYXRhKTsKKwkJCWlmICh0bXApCisJCQkJYWZmc193YXJuaW5nKHNiLCAiZ2V0X2Jsb2NrIiwgImZpcnN0IGJsb2NrIGFscmVhZHkgc2V0ICglZCkiLCB0bXApOworCQkJQUZGU19IRUFEKGV4dF9iaCktPmZpcnN0X2RhdGEgPSBjcHVfdG9fYmUzMihibG9ja25yKTsKKwkJCWFmZnNfYWRqdXN0X2NoZWNrc3VtKGV4dF9iaCwgYmxvY2tuciAtIHRtcCk7CisJCX0KKwl9CisKKwlhZmZzX2JyZWxzZShleHRfYmgpOworCS8vdW5sb2NrIGNhY2hlCisJYWZmc191bmxvY2tfZXh0KGlub2RlKTsKKwlyZXR1cm4gMDsKKworZXJyX2JpZzoKKwlhZmZzX2Vycm9yKGlub2RlLT5pX3NiLCJnZXRfYmxvY2siLCJzdHJhbmdlIGJsb2NrIHJlcXVlc3QgJWQiLCBibG9jayk7CisJcmV0dXJuIC1FSU87CitlcnJfZXh0OgorCS8vIHVubG9jayBjYWNoZQorCWFmZnNfdW5sb2NrX2V4dChpbm9kZSk7CisJcmV0dXJuIFBUUl9FUlIoZXh0X2JoKTsKK2Vycl9hbGxvYzoKKwlicmVsc2UoZXh0X2JoKTsKKwljbGVhcl9idWZmZXJfbWFwcGVkKGJoX3Jlc3VsdCk7CisJYmhfcmVzdWx0LT5iX2JkZXYgPSBOVUxMOworCS8vIHVubG9jayBjYWNoZQorCWFmZnNfdW5sb2NrX2V4dChpbm9kZSk7CisJcmV0dXJuIC1FTk9TUEM7Cit9CisKK3N0YXRpYyBpbnQgYWZmc193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXJldHVybiBibG9ja193cml0ZV9mdWxsX3BhZ2UocGFnZSwgYWZmc19nZXRfYmxvY2ssIHdiYyk7Cit9CitzdGF0aWMgaW50IGFmZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLCBhZmZzX2dldF9ibG9jayk7Cit9CitzdGF0aWMgaW50IGFmZnNfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXJldHVybiBjb250X3ByZXBhcmVfd3JpdGUocGFnZSwgZnJvbSwgdG8sIGFmZnNfZ2V0X2Jsb2NrLAorCQkmQUZGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpLT5tbXVfcHJpdmF0ZSk7Cit9CitzdGF0aWMgc2VjdG9yX3QgX2FmZnNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2spCit7CisJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLGJsb2NrLGFmZnNfZ2V0X2Jsb2NrKTsKK30KK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgYWZmc19hb3BzID0geworCS5yZWFkcGFnZSA9IGFmZnNfcmVhZHBhZ2UsCisJLndyaXRlcGFnZSA9IGFmZnNfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UgPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUgPSBhZmZzX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZSA9IGdlbmVyaWNfY29tbWl0X3dyaXRlLAorCS5ibWFwID0gX2FmZnNfYm1hcAorfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorYWZmc19icmVhZF9pbm8oc3RydWN0IGlub2RlICppbm9kZSwgaW50IGJsb2NrLCBpbnQgY3JlYXRlKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHRtcF9iaDsKKwlpbnQgZXJyOworCisJdG1wX2JoLmJfc3RhdGUgPSAwOworCWVyciA9IGFmZnNfZ2V0X2Jsb2NrKGlub2RlLCBibG9jaywgJnRtcF9iaCwgY3JlYXRlKTsKKwlpZiAoIWVycikgeworCQliaCA9IGFmZnNfYnJlYWQoaW5vZGUtPmlfc2IsIHRtcF9iaC5iX2Jsb2NrbnIpOworCQlpZiAoYmgpIHsKKwkJCWJoLT5iX3N0YXRlIHw9IHRtcF9iaC5iX3N0YXRlOworCQkJcmV0dXJuIGJoOworCQl9CisJCWVyciA9IC1FSU87CisJfQorCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK2FmZnNfZ2V0emVyb2Jsa19pbm8oc3RydWN0IGlub2RlICppbm9kZSwgaW50IGJsb2NrKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHRtcF9iaDsKKwlpbnQgZXJyOworCisJdG1wX2JoLmJfc3RhdGUgPSAwOworCWVyciA9IGFmZnNfZ2V0X2Jsb2NrKGlub2RlLCBibG9jaywgJnRtcF9iaCwgMSk7CisJaWYgKCFlcnIpIHsKKwkJYmggPSBhZmZzX2dldHplcm9ibGsoaW5vZGUtPmlfc2IsIHRtcF9iaC5iX2Jsb2NrbnIpOworCQlpZiAoYmgpIHsKKwkJCWJoLT5iX3N0YXRlIHw9IHRtcF9iaC5iX3N0YXRlOworCQkJcmV0dXJuIGJoOworCQl9CisJCWVyciA9IC1FSU87CisJfQorCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK2FmZnNfZ2V0ZW1wdHlibGtfaW5vKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBibG9jaykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB0bXBfYmg7CisJaW50IGVycjsKKworCXRtcF9iaC5iX3N0YXRlID0gMDsKKwllcnIgPSBhZmZzX2dldF9ibG9jayhpbm9kZSwgYmxvY2ssICZ0bXBfYmgsIDEpOworCWlmICghZXJyKSB7CisJCWJoID0gYWZmc19nZXRlbXB0eWJsayhpbm9kZS0+aV9zYiwgdG1wX2JoLmJfYmxvY2tucik7CisJCWlmIChiaCkgeworCQkJYmgtPmJfc3RhdGUgfD0gdG1wX2JoLmJfc3RhdGU7CisJCQlyZXR1cm4gYmg7CisJCX0KKwkJZXJyID0gLUVJTzsKKwl9CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIHNzaXplX3QKK2FmZnNfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3NpemVfdCByZXR2YWw7CisKKwlyZXR2YWwgPSBnZW5lcmljX2ZpbGVfd3JpdGUgKGZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOworCWlmIChyZXR2YWwgPjApIHsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCQlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK2FmZnNfZG9fcmVhZHBhZ2Vfb2ZzKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJY2hhciAqZGF0YTsKKwl1MzIgYmlkeCwgYm9mZiwgYnNpemU7CisJdTMyIHRtcDsKKworCXByX2RlYnVnKCJBRkZTOiByZWFkX3BhZ2UoJXUsICVsZCwgJWQsICVkKVxuIiwgKHUzMilpbm9kZS0+aV9pbm8sIHBhZ2UtPmluZGV4LCBmcm9tLCB0byk7CisJaWYgKGZyb20gPiB0byB8fCB0byA+IFBBR0VfQ0FDSEVfU0laRSkKKwkJQlVHKCk7CisJa21hcChwYWdlKTsKKwlkYXRhID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCWJzaXplID0gQUZGU19TQihzYiktPnNfZGF0YV9ibGtzaXplOworCXRtcCA9IChwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIGZyb207CisJYmlkeCA9IHRtcCAvIGJzaXplOworCWJvZmYgPSB0bXAgJSBic2l6ZTsKKworCXdoaWxlIChmcm9tIDwgdG8pIHsKKwkJYmggPSBhZmZzX2JyZWFkX2lubyhpbm9kZSwgYmlkeCwgMCk7CisJCWlmIChJU19FUlIoYmgpKQorCQkJcmV0dXJuIFBUUl9FUlIoYmgpOworCQl0bXAgPSBtaW4oYnNpemUgLSBib2ZmLCB0byAtIGZyb20pOworCQlpZiAoZnJvbSArIHRtcCA+IHRvIHx8IHRtcCA+IGJzaXplKQorCQkJQlVHKCk7CisJCW1lbWNweShkYXRhICsgZnJvbSwgQUZGU19EQVRBKGJoKSArIGJvZmYsIHRtcCk7CisJCWFmZnNfYnJlbHNlKGJoKTsKKwkJYmlkeCsrOworCQlmcm9tICs9IHRtcDsKKwkJYm9mZiA9IDA7CisJfQorCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYWZmc19leHRlbnRfZmlsZV9vZnMoc3RydWN0IGlub2RlICppbm9kZSwgdTMyIG5ld3NpemUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpwcmV2X2JoOworCXUzMiBiaWR4LCBib2ZmOworCXUzMiBzaXplLCBic2l6ZTsKKwl1MzIgdG1wOworCisJcHJfZGVidWcoIkFGRlM6IGV4dGVudF9maWxlKCV1LCAlZClcbiIsICh1MzIpaW5vZGUtPmlfaW5vLCBuZXdzaXplKTsKKwlic2l6ZSA9IEFGRlNfU0Ioc2IpLT5zX2RhdGFfYmxrc2l6ZTsKKwliaCA9IE5VTEw7CisJc2l6ZSA9IEFGRlNfSShpbm9kZSktPm1tdV9wcml2YXRlOworCWJpZHggPSBzaXplIC8gYnNpemU7CisJYm9mZiA9IHNpemUgJSBic2l6ZTsKKwlpZiAoYm9mZikgeworCQliaCA9IGFmZnNfYnJlYWRfaW5vKGlub2RlLCBiaWR4LCAwKTsKKwkJaWYgKElTX0VSUihiaCkpCisJCQlyZXR1cm4gUFRSX0VSUihiaCk7CisJCXRtcCA9IG1pbihic2l6ZSAtIGJvZmYsIG5ld3NpemUgLSBzaXplKTsKKwkJaWYgKGJvZmYgKyB0bXAgPiBic2l6ZSB8fCB0bXAgPiBic2l6ZSkKKwkJCUJVRygpOworCQltZW1zZXQoQUZGU19EQVRBKGJoKSArIGJvZmYsIDAsIHRtcCk7CisJCUFGRlNfREFUQV9IRUFEKGJoKS0+c2l6ZSA9IGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KEFGRlNfREFUQV9IRUFEKGJoKS0+c2l6ZSkgKyB0bXApOworCQlhZmZzX2ZpeF9jaGVja3N1bShzYiwgYmgpOworCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCQlzaXplICs9IHRtcDsKKwkJYmlkeCsrOworCX0gZWxzZSBpZiAoYmlkeCkgeworCQliaCA9IGFmZnNfYnJlYWRfaW5vKGlub2RlLCBiaWR4IC0gMSwgMCk7CisJCWlmIChJU19FUlIoYmgpKQorCQkJcmV0dXJuIFBUUl9FUlIoYmgpOworCX0KKworCXdoaWxlIChzaXplIDwgbmV3c2l6ZSkgeworCQlwcmV2X2JoID0gYmg7CisJCWJoID0gYWZmc19nZXR6ZXJvYmxrX2lubyhpbm9kZSwgYmlkeCk7CisJCWlmIChJU19FUlIoYmgpKQorCQkJZ290byBvdXQ7CisJCXRtcCA9IG1pbihic2l6ZSwgbmV3c2l6ZSAtIHNpemUpOworCQlpZiAodG1wID4gYnNpemUpCisJCQlCVUcoKTsKKwkJQUZGU19EQVRBX0hFQUQoYmgpLT5wdHlwZSA9IGNwdV90b19iZTMyKFRfREFUQSk7CisJCUFGRlNfREFUQV9IRUFEKGJoKS0+a2V5ID0gY3B1X3RvX2JlMzIoaW5vZGUtPmlfaW5vKTsKKwkJQUZGU19EQVRBX0hFQUQoYmgpLT5zZXF1ZW5jZSA9IGNwdV90b19iZTMyKGJpZHgpOworCQlBRkZTX0RBVEFfSEVBRChiaCktPnNpemUgPSBjcHVfdG9fYmUzMih0bXApOworCQlhZmZzX2ZpeF9jaGVja3N1bShzYiwgYmgpOworCQliaC0+Yl9zdGF0ZSAmPSB+KDFVTCA8PCBCSF9OZXcpOworCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCQlpZiAocHJldl9iaCkgeworCQkJdTMyIHRtcCA9IGJlMzJfdG9fY3B1KEFGRlNfREFUQV9IRUFEKHByZXZfYmgpLT5uZXh0KTsKKwkJCWlmICh0bXApCisJCQkJYWZmc193YXJuaW5nKHNiLCAiZXh0ZW50X2ZpbGVfb2ZzIiwgIm5leHQgYmxvY2sgYWxyZWFkeSBzZXQgZm9yICVkICglZCkiLCBiaWR4LCB0bXApOworCQkJQUZGU19EQVRBX0hFQUQocHJldl9iaCktPm5leHQgPSBjcHVfdG9fYmUzMihiaC0+Yl9ibG9ja25yKTsKKwkJCWFmZnNfYWRqdXN0X2NoZWNrc3VtKHByZXZfYmgsIGJoLT5iX2Jsb2NrbnIgLSB0bXApOworCQkJbWFya19idWZmZXJfZGlydHlfaW5vZGUocHJldl9iaCwgaW5vZGUpOworCQkJYWZmc19icmVsc2UocHJldl9iaCk7CisJCX0KKwkJc2l6ZSArPSBic2l6ZTsKKwkJYmlkeCsrOworCX0KKwlhZmZzX2JyZWxzZShiaCk7CisJaW5vZGUtPmlfc2l6ZSA9IEFGRlNfSShpbm9kZSktPm1tdV9wcml2YXRlID0gbmV3c2l6ZTsKKwlyZXR1cm4gMDsKKworb3V0OgorCWlub2RlLT5pX3NpemUgPSBBRkZTX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA9IG5ld3NpemU7CisJcmV0dXJuIFBUUl9FUlIoYmgpOworfQorCitzdGF0aWMgaW50CithZmZzX3JlYWRwYWdlX29mcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJdTMyIHRvOworCWludCBlcnI7CisKKwlwcl9kZWJ1ZygiQUZGUzogcmVhZF9wYWdlKCV1LCAlbGQpXG4iLCAodTMyKWlub2RlLT5pX2lubywgcGFnZS0+aW5kZXgpOworCXRvID0gUEFHRV9DQUNIRV9TSVpFOworCWlmICgoKHBhZ2UtPmluZGV4ICsgMSkgPDwgUEFHRV9DQUNIRV9TSElGVCkgPiBpbm9kZS0+aV9zaXplKSB7CisJCXRvID0gaW5vZGUtPmlfc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJCW1lbXNldChwYWdlX2FkZHJlc3MocGFnZSkgKyB0bywgMCwgUEFHRV9DQUNIRV9TSVpFIC0gdG8pOworCX0KKworCWVyciA9IGFmZnNfZG9fcmVhZHBhZ2Vfb2ZzKGZpbGUsIHBhZ2UsIDAsIHRvKTsKKwlpZiAoIWVycikKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYWZmc19wcmVwYXJlX3dyaXRlX29mcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXUzMiBzaXplLCBvZmZzZXQ7CisJdTMyIHRtcDsKKwlpbnQgZXJyID0gMDsKKworCXByX2RlYnVnKCJBRkZTOiBwcmVwYXJlX3dyaXRlKCV1LCAlbGQsICVkLCAlZClcbiIsICh1MzIpaW5vZGUtPmlfaW5vLCBwYWdlLT5pbmRleCwgZnJvbSwgdG8pOworCW9mZnNldCA9IHBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaWYgKG9mZnNldCArIGZyb20gPiBBRkZTX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSkgeworCQllcnIgPSBhZmZzX2V4dGVudF9maWxlX29mcyhpbm9kZSwgb2Zmc2V0ICsgZnJvbSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwlzaXplID0gaW5vZGUtPmlfc2l6ZTsKKworCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpCisJCXJldHVybiAwOworCisJaWYgKGZyb20pIHsKKwkJZXJyID0gYWZmc19kb19yZWFkcGFnZV9vZnMoZmlsZSwgcGFnZSwgMCwgZnJvbSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwlpZiAodG8gPCBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJY2hhciAqa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisKKwkJbWVtc2V0KGthZGRyICsgdG8sIDAsIFBBR0VfQ0FDSEVfU0laRSAtIHRvKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJaWYgKHNpemUgPiBvZmZzZXQgKyB0bykgeworCQkJaWYgKHNpemUgPCBvZmZzZXQgKyBQQUdFX0NBQ0hFX1NJWkUpCisJCQkJdG1wID0gc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJCQllbHNlCisJCQkJdG1wID0gUEFHRV9DQUNIRV9TSVpFOworCQkJZXJyID0gYWZmc19kb19yZWFkcGFnZV9vZnMoZmlsZSwgcGFnZSwgdG8sIHRtcCk7CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhZmZzX2NvbW1pdF93cml0ZV9vZnMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKnByZXZfYmg7CisJY2hhciAqZGF0YTsKKwl1MzIgYmlkeCwgYm9mZiwgYnNpemU7CisJdTMyIHRtcDsKKwlpbnQgd3JpdHRlbjsKKworCXByX2RlYnVnKCJBRkZTOiBjb21taXRfd3JpdGUoJXUsICVsZCwgJWQsICVkKVxuIiwgKHUzMilpbm9kZS0+aV9pbm8sIHBhZ2UtPmluZGV4LCBmcm9tLCB0byk7CisJYnNpemUgPSBBRkZTX1NCKHNiKS0+c19kYXRhX2Jsa3NpemU7CisJZGF0YSA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKworCWJoID0gTlVMTDsKKwl3cml0dGVuID0gMDsKKwl0bXAgPSAocGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyBmcm9tOworCWJpZHggPSB0bXAgLyBic2l6ZTsKKwlib2ZmID0gdG1wICUgYnNpemU7CisJaWYgKGJvZmYpIHsKKwkJYmggPSBhZmZzX2JyZWFkX2lubyhpbm9kZSwgYmlkeCwgMCk7CisJCWlmIChJU19FUlIoYmgpKQorCQkJcmV0dXJuIFBUUl9FUlIoYmgpOworCQl0bXAgPSBtaW4oYnNpemUgLSBib2ZmLCB0byAtIGZyb20pOworCQlpZiAoYm9mZiArIHRtcCA+IGJzaXplIHx8IHRtcCA+IGJzaXplKQorCQkJQlVHKCk7CisJCW1lbWNweShBRkZTX0RBVEEoYmgpICsgYm9mZiwgZGF0YSArIGZyb20sIHRtcCk7CisJCUFGRlNfREFUQV9IRUFEKGJoKS0+c2l6ZSA9IGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KEFGRlNfREFUQV9IRUFEKGJoKS0+c2l6ZSkgKyB0bXApOworCQlhZmZzX2ZpeF9jaGVja3N1bShzYiwgYmgpOworCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCQl3cml0dGVuICs9IHRtcDsKKwkJZnJvbSArPSB0bXA7CisJCWJpZHgrKzsKKwl9IGVsc2UgaWYgKGJpZHgpIHsKKwkJYmggPSBhZmZzX2JyZWFkX2lubyhpbm9kZSwgYmlkeCAtIDEsIDApOworCQlpZiAoSVNfRVJSKGJoKSkKKwkJCXJldHVybiBQVFJfRVJSKGJoKTsKKwl9CisJd2hpbGUgKGZyb20gKyBic2l6ZSA8PSB0bykgeworCQlwcmV2X2JoID0gYmg7CisJCWJoID0gYWZmc19nZXRlbXB0eWJsa19pbm8oaW5vZGUsIGJpZHgpOworCQlpZiAoSVNfRVJSKGJoKSkKKwkJCWdvdG8gb3V0OworCQltZW1jcHkoQUZGU19EQVRBKGJoKSwgZGF0YSArIGZyb20sIGJzaXplKTsKKwkJaWYgKGJ1ZmZlcl9uZXcoYmgpKSB7CisJCQlBRkZTX0RBVEFfSEVBRChiaCktPnB0eXBlID0gY3B1X3RvX2JlMzIoVF9EQVRBKTsKKwkJCUFGRlNfREFUQV9IRUFEKGJoKS0+a2V5ID0gY3B1X3RvX2JlMzIoaW5vZGUtPmlfaW5vKTsKKwkJCUFGRlNfREFUQV9IRUFEKGJoKS0+c2VxdWVuY2UgPSBjcHVfdG9fYmUzMihiaWR4KTsKKwkJCUFGRlNfREFUQV9IRUFEKGJoKS0+c2l6ZSA9IGNwdV90b19iZTMyKGJzaXplKTsKKwkJCUFGRlNfREFUQV9IRUFEKGJoKS0+bmV4dCA9IDA7CisJCQliaC0+Yl9zdGF0ZSAmPSB+KDFVTCA8PCBCSF9OZXcpOworCQkJaWYgKHByZXZfYmgpIHsKKwkJCQl1MzIgdG1wID0gYmUzMl90b19jcHUoQUZGU19EQVRBX0hFQUQocHJldl9iaCktPm5leHQpOworCQkJCWlmICh0bXApCisJCQkJCWFmZnNfd2FybmluZyhzYiwgImNvbW1pdF93cml0ZV9vZnMiLCAibmV4dCBibG9jayBhbHJlYWR5IHNldCBmb3IgJWQgKCVkKSIsIGJpZHgsIHRtcCk7CisJCQkJQUZGU19EQVRBX0hFQUQocHJldl9iaCktPm5leHQgPSBjcHVfdG9fYmUzMihiaC0+Yl9ibG9ja25yKTsKKwkJCQlhZmZzX2FkanVzdF9jaGVja3N1bShwcmV2X2JoLCBiaC0+Yl9ibG9ja25yIC0gdG1wKTsKKwkJCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShwcmV2X2JoLCBpbm9kZSk7CisJCQl9CisJCX0KKwkJYWZmc19icmVsc2UocHJldl9iaCk7CisJCWFmZnNfZml4X2NoZWNrc3VtKHNiLCBiaCk7CisJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGJoLCBpbm9kZSk7CisJCXdyaXR0ZW4gKz0gYnNpemU7CisJCWZyb20gKz0gYnNpemU7CisJCWJpZHgrKzsKKwl9CisJaWYgKGZyb20gPCB0bykgeworCQlwcmV2X2JoID0gYmg7CisJCWJoID0gYWZmc19icmVhZF9pbm8oaW5vZGUsIGJpZHgsIDEpOworCQlpZiAoSVNfRVJSKGJoKSkKKwkJCWdvdG8gb3V0OworCQl0bXAgPSBtaW4oYnNpemUsIHRvIC0gZnJvbSk7CisJCWlmICh0bXAgPiBic2l6ZSkKKwkJCUJVRygpOworCQltZW1jcHkoQUZGU19EQVRBKGJoKSwgZGF0YSArIGZyb20sIHRtcCk7CisJCWlmIChidWZmZXJfbmV3KGJoKSkgeworCQkJQUZGU19EQVRBX0hFQUQoYmgpLT5wdHlwZSA9IGNwdV90b19iZTMyKFRfREFUQSk7CisJCQlBRkZTX0RBVEFfSEVBRChiaCktPmtleSA9IGNwdV90b19iZTMyKGlub2RlLT5pX2lubyk7CisJCQlBRkZTX0RBVEFfSEVBRChiaCktPnNlcXVlbmNlID0gY3B1X3RvX2JlMzIoYmlkeCk7CisJCQlBRkZTX0RBVEFfSEVBRChiaCktPnNpemUgPSBjcHVfdG9fYmUzMih0bXApOworCQkJQUZGU19EQVRBX0hFQUQoYmgpLT5uZXh0ID0gMDsKKwkJCWJoLT5iX3N0YXRlICY9IH4oMVVMIDw8IEJIX05ldyk7CisJCQlpZiAocHJldl9iaCkgeworCQkJCXUzMiB0bXAgPSBiZTMyX3RvX2NwdShBRkZTX0RBVEFfSEVBRChwcmV2X2JoKS0+bmV4dCk7CisJCQkJaWYgKHRtcCkKKwkJCQkJYWZmc193YXJuaW5nKHNiLCAiY29tbWl0X3dyaXRlX29mcyIsICJuZXh0IGJsb2NrIGFscmVhZHkgc2V0IGZvciAlZCAoJWQpIiwgYmlkeCwgdG1wKTsKKwkJCQlBRkZTX0RBVEFfSEVBRChwcmV2X2JoKS0+bmV4dCA9IGNwdV90b19iZTMyKGJoLT5iX2Jsb2NrbnIpOworCQkJCWFmZnNfYWRqdXN0X2NoZWNrc3VtKHByZXZfYmgsIGJoLT5iX2Jsb2NrbnIgLSB0bXApOworCQkJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKHByZXZfYmgsIGlub2RlKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChiZTMyX3RvX2NwdShBRkZTX0RBVEFfSEVBRChiaCktPnNpemUpIDwgdG1wKQorCQkJQUZGU19EQVRBX0hFQUQoYmgpLT5zaXplID0gY3B1X3RvX2JlMzIodG1wKTsKKwkJYWZmc19icmVsc2UocHJldl9iaCk7CisJCWFmZnNfZml4X2NoZWNrc3VtKHNiLCBiaCk7CisJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGJoLCBpbm9kZSk7CisJCXdyaXR0ZW4gKz0gdG1wOworCQlmcm9tICs9IHRtcDsKKwkJYmlkeCsrOworCX0KKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisKK2RvbmU6CisJYWZmc19icmVsc2UoYmgpOworCXRtcCA9IChwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIGZyb207CisJaWYgKHRtcCA+IGlub2RlLT5pX3NpemUpCisJCWlub2RlLT5pX3NpemUgPSBBRkZTX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA9IHRtcDsKKworCXJldHVybiB3cml0dGVuOworCitvdXQ6CisJYmggPSBwcmV2X2JoOworCWlmICghd3JpdHRlbikKKwkJd3JpdHRlbiA9IFBUUl9FUlIoYmgpOworCWdvdG8gZG9uZTsKK30KKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBhZmZzX2FvcHNfb2ZzID0geworCS5yZWFkcGFnZSA9IGFmZnNfcmVhZHBhZ2Vfb2ZzLAorCS8vLndyaXRlcGFnZSA9IGFmZnNfd3JpdGVwYWdlX29mcywKKwkvLy5zeW5jX3BhZ2UgPSBhZmZzX3N5bmNfcGFnZV9vZnMsCisJLnByZXBhcmVfd3JpdGUgPSBhZmZzX3ByZXBhcmVfd3JpdGVfb2ZzLAorCS5jb21taXRfd3JpdGUgPSBhZmZzX2NvbW1pdF93cml0ZV9vZnMKK307CisKKy8qIEZyZWUgYW55IHByZWFsbG9jYXRlZCBibG9ja3MuICovCisKK3ZvaWQKK2FmZnNfZnJlZV9wcmVhbGxvYyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKworCXByX2RlYnVnKCJBRkZTOiBmcmVlX3ByZWFsbG9jKGlubz0lbHUpXG4iLCBpbm9kZS0+aV9pbm8pOworCisJd2hpbGUgKEFGRlNfSShpbm9kZSktPmlfcGFfY250KSB7CisJCUFGRlNfSShpbm9kZSktPmlfcGFfY250LS07CisJCWFmZnNfZnJlZV9ibG9jayhzYiwgKytBRkZTX0koaW5vZGUpLT5pX2xhc3RhbGxvYyk7CisJfQorfQorCisvKiBUcnVuY2F0ZSAob3IgZW5sYXJnZSkgYSBmaWxlIHRvIHRoZSByZXF1ZXN0ZWQgc2l6ZS4gKi8KKwordm9pZAorYWZmc190cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwl1MzIgZXh0LCBleHRfa2V5OworCXUzMiBsYXN0X2JsaywgYmxrY250LCBibGs7CisJdTMyIHNpemU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpleHRfYmg7CisJaW50IGk7CisKKwlwcl9kZWJ1ZygiQUZGUzogdHJ1bmNhdGUoaW5vZGU9JWQsIG9sZHNpemU9JXUsIG5ld3NpemU9JXUpXG4iLAorCQkgKHUzMilpbm9kZS0+aV9pbm8sICh1MzIpQUZGU19JKGlub2RlKS0+bW11X3ByaXZhdGUsICh1MzIpaW5vZGUtPmlfc2l6ZSk7CisKKwlsYXN0X2JsayA9IDA7CisJZXh0ID0gMDsKKwlpZiAoaW5vZGUtPmlfc2l6ZSkgeworCQlsYXN0X2JsayA9ICgodTMyKWlub2RlLT5pX3NpemUgLSAxKSAvIEFGRlNfU0Ioc2IpLT5zX2RhdGFfYmxrc2l6ZTsKKwkJZXh0ID0gbGFzdF9ibGsgLyBBRkZTX1NCKHNiKS0+c19oYXNoc2l6ZTsKKwl9CisKKwlpZiAoaW5vZGUtPmlfc2l6ZSA+IEFGRlNfSShpbm9kZSktPm1tdV9wcml2YXRlKSB7CisJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCXUzMiBzaXplID0gaW5vZGUtPmlfc2l6ZSAtIDE7CisJCWludCByZXM7CisKKwkJcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBzaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCQlpZiAoIXBhZ2UpCisJCQlyZXR1cm47CisJCXNpemUgPSAoc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgKyAxOworCQlyZXMgPSBtYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCBzaXplLCBzaXplKTsKKwkJaWYgKCFyZXMpCisJCQlyZXMgPSBtYXBwaW5nLT5hX29wcy0+Y29tbWl0X3dyaXRlKE5VTEwsIHBhZ2UsIHNpemUsIHNpemUpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoaW5vZGUtPmlfc2l6ZSA9PSBBRkZTX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSkKKwkJcmV0dXJuOworCisJLy8gbG9jayBjYWNoZQorCWV4dF9iaCA9IGFmZnNfZ2V0X2V4dGJsb2NrKGlub2RlLCBleHQpOworCWlmIChJU19FUlIoZXh0X2JoKSkgeworCQlhZmZzX3dhcm5pbmcoc2IsICJ0cnVuY2F0ZSIsICJ1bmV4cGVjdGVkIHJlYWQgZXJyb3IgZm9yIGV4dCBibG9jayAldSAoJWQpIiwKKwkJCSAgICAgZXh0LCBQVFJfRVJSKGV4dF9iaCkpOworCQlyZXR1cm47CisJfQorCWlmIChBRkZTX0koaW5vZGUpLT5pX2xjKSB7CisJCS8qIGNsZWFyIGxpbmVhciBjYWNoZSAqLworCQlpID0gKGV4dCArIDEpID4+IEFGRlNfSShpbm9kZSktPmlfbGNfc2hpZnQ7CisJCWlmIChBRkZTX0koaW5vZGUpLT5pX2xjX3NpemUgPiBpKSB7CisJCQlBRkZTX0koaW5vZGUpLT5pX2xjX3NpemUgPSBpOworCQkJZm9yICg7IGkgPCBBRkZTX0xDX1NJWkU7IGkrKykKKwkJCQlBRkZTX0koaW5vZGUpLT5pX2xjW2ldID0gMDsKKwkJfQorCQkvKiBjbGVhciBhc3NvY2lhdGl2ZSBjYWNoZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgQUZGU19BQ19TSVpFOyBpKyspCisJCQlpZiAoQUZGU19JKGlub2RlKS0+aV9hY1tpXS5leHQgPj0gZXh0KQorCQkJCUFGRlNfSShpbm9kZSktPmlfYWNbaV0uZXh0ID0gMDsKKwl9CisJZXh0X2tleSA9IGJlMzJfdG9fY3B1KEFGRlNfVEFJTChzYiwgZXh0X2JoKS0+ZXh0ZW5zaW9uKTsKKworCWJsa2NudCA9IEFGRlNfSShpbm9kZSktPmlfYmxrY250OworCWkgPSAwOworCWJsayA9IGxhc3RfYmxrOworCWlmIChpbm9kZS0+aV9zaXplKSB7CisJCWkgPSBsYXN0X2JsayAlIEFGRlNfU0Ioc2IpLT5zX2hhc2hzaXplICsgMTsKKwkJYmxrKys7CisJfSBlbHNlCisJCUFGRlNfSEVBRChleHRfYmgpLT5maXJzdF9kYXRhID0gMDsKKwlzaXplID0gQUZGU19TQihzYiktPnNfaGFzaHNpemU7CisJaWYgKHNpemUgPiBibGtjbnQgLSBibGsgKyBpKQorCQlzaXplID0gYmxrY250IC0gYmxrICsgaTsKKwlmb3IgKDsgaSA8IHNpemU7IGkrKywgYmxrKyspIHsKKwkJYWZmc19mcmVlX2Jsb2NrKHNiLCBiZTMyX3RvX2NwdShBRkZTX0JMT0NLKHNiLCBleHRfYmgsIGkpKSk7CisJCUFGRlNfQkxPQ0soc2IsIGV4dF9iaCwgaSkgPSAwOworCX0KKwlBRkZTX1RBSUwoc2IsIGV4dF9iaCktPmV4dGVuc2lvbiA9IDA7CisJYWZmc19maXhfY2hlY2tzdW0oc2IsIGV4dF9iaCk7CisJbWFya19idWZmZXJfZGlydHlfaW5vZGUoZXh0X2JoLCBpbm9kZSk7CisJYWZmc19icmVsc2UoZXh0X2JoKTsKKworCWlmIChpbm9kZS0+aV9zaXplKSB7CisJCUFGRlNfSShpbm9kZSktPmlfYmxrY250ID0gbGFzdF9ibGsgKyAxOworCQlBRkZTX0koaW5vZGUpLT5pX2V4dGNudCA9IGV4dCArIDE7CisJCWlmIChBRkZTX1NCKHNiKS0+c19mbGFncyAmIFNGX09GUykgeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGFmZnNfYnJlYWRfaW5vKGlub2RlLCBsYXN0X2JsaywgMCk7CisJCQl1MzIgdG1wOworCQkJaWYgKElTX0VSUihleHRfYmgpKSB7CisJCQkJYWZmc193YXJuaW5nKHNiLCAidHJ1bmNhdGUiLCAidW5leHBlY3RlZCByZWFkIGVycm9yIGZvciBsYXN0IGJsb2NrICV1ICglZCkiLAorCQkJCQkgICAgIGV4dCwgUFRSX0VSUihleHRfYmgpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl0bXAgPSBiZTMyX3RvX2NwdShBRkZTX0RBVEFfSEVBRChiaCktPm5leHQpOworCQkJQUZGU19EQVRBX0hFQUQoYmgpLT5uZXh0ID0gMDsKKwkJCWFmZnNfYWRqdXN0X2NoZWNrc3VtKGJoLCAtdG1wKTsKKwkJCWFmZnNfYnJlbHNlKGJoKTsKKwkJfQorCX0gZWxzZSB7CisJCUFGRlNfSShpbm9kZSktPmlfYmxrY250ID0gMDsKKwkJQUZGU19JKGlub2RlKS0+aV9leHRjbnQgPSAxOworCX0KKwlBRkZTX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA9IGlub2RlLT5pX3NpemU7CisJLy8gdW5sb2NrIGNhY2hlCisKKwl3aGlsZSAoZXh0X2tleSkgeworCQlleHRfYmggPSBhZmZzX2JyZWFkKHNiLCBleHRfa2V5KTsKKwkJc2l6ZSA9IEFGRlNfU0Ioc2IpLT5zX2hhc2hzaXplOworCQlpZiAoc2l6ZSA+IGJsa2NudCAtIGJsaykKKwkJCXNpemUgPSBibGtjbnQgLSBibGs7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyssIGJsaysrKQorCQkJYWZmc19mcmVlX2Jsb2NrKHNiLCBiZTMyX3RvX2NwdShBRkZTX0JMT0NLKHNiLCBleHRfYmgsIGkpKSk7CisJCWFmZnNfZnJlZV9ibG9jayhzYiwgZXh0X2tleSk7CisJCWV4dF9rZXkgPSBiZTMyX3RvX2NwdShBRkZTX1RBSUwoc2IsIGV4dF9iaCktPmV4dGVuc2lvbik7CisJCWFmZnNfYnJlbHNlKGV4dF9iaCk7CisJfQorCWFmZnNfZnJlZV9wcmVhbGxvYyhpbm9kZSk7Cit9CmRpZmYgLS1naXQgYS9mcy9hZmZzL2lub2RlLmMgYi9mcy9hZmZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FhNmYyMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2FmZnMvaW5vZGUuYwpAQCAtMCwwICsxLDQxMSBAQAorLyoKKyAqICBsaW51eC9mcy9hZmZzL2lub2RlLmMKKyAqCisgKiAgKGMpIDE5OTYgIEhhbnMtSm9hY2hpbSBXaWRtYWllciAtIFJld3JpdHRlbgorICoKKyAqICAoQykgMTk5MyAgUmF5IEJ1cnIgLSBNb2RpZmllZCBmb3IgQW1pZ2EgRkZTIGZpbGVzeXN0ZW0uCisgKgorICogIChDKSAxOTkyICBFcmljIFlvdW5nZGFsZSBNb2RpZmllZCBmb3IgSVNPOTY2MCBmaWxlc3lzdGVtLgorICoKKyAqICAoQykgMTk5MSAgTGludXMgVG9ydmFsZHMgLSBtaW5peCBmaWxlc3lzdGVtCisgKi8KKworI2luY2x1ZGUgImFmZnMuaCIKKworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCB0aW1lem9uZSBzeXNfdHo7CisKK3ZvaWQKK2FmZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgYWZmc19zYl9pbmZvCSpzYmkgPSBBRkZTX1NCKHNiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoOworCXN0cnVjdCBhZmZzX2hlYWQJKmhlYWQ7CisJc3RydWN0IGFmZnNfdGFpbAkqdGFpbDsKKwl1MzIJCQkgYmxvY2s7CisJdTMyCQkJIHNpemU7CisJdTMyCQkJIHByb3Q7CisJdTE2CQkJIGlkOworCisJcHJfZGVidWcoIkFGRlM6IHJlYWRfaW5vZGUoJWx1KVxuIixpbm9kZS0+aV9pbm8pOworCisJYmxvY2sgPSBpbm9kZS0+aV9pbm87CisJYmggPSBhZmZzX2JyZWFkKHNiLCBibG9jayk7CisJaWYgKCFiaCkgeworCQlhZmZzX3dhcm5pbmcoc2IsICJyZWFkX2lub2RlIiwgIkNhbm5vdCByZWFkIGJsb2NrICVkIiwgYmxvY2spOworCQlnb3RvIGJhZF9pbm9kZTsKKwl9CisJaWYgKGFmZnNfY2hlY2tzdW1fYmxvY2soc2IsIGJoKSB8fCBiZTMyX3RvX2NwdShBRkZTX0hFQUQoYmgpLT5wdHlwZSkgIT0gVF9TSE9SVCkgeworCQlhZmZzX3dhcm5pbmcoc2IsInJlYWRfaW5vZGUiLAorCQkJICAgIkNoZWNrc3VtIG9yIHR5cGUgKHB0eXBlPSVkKSBlcnJvciBvbiBpbm9kZSAlZCIsCisJCQkgICBBRkZTX0hFQUQoYmgpLT5wdHlwZSwgYmxvY2spOworCQlnb3RvIGJhZF9pbm9kZTsKKwl9CisKKwloZWFkID0gQUZGU19IRUFEKGJoKTsKKwl0YWlsID0gQUZGU19UQUlMKHNiLCBiaCk7CisJcHJvdCA9IGJlMzJfdG9fY3B1KHRhaWwtPnByb3RlY3QpOworCisJaW5vZGUtPmlfc2l6ZSA9IDA7CisJaW5vZGUtPmlfbmxpbmsgPSAxOworCWlub2RlLT5pX21vZGUgPSAwOworCUFGRlNfSShpbm9kZSktPmlfZXh0Y250ID0gMTsKKwlBRkZTX0koaW5vZGUpLT5pX2V4dF9sYXN0ID0gfjE7CisJQUZGU19JKGlub2RlKS0+aV9wcm90ZWN0ID0gcHJvdDsKKwlBRkZTX0koaW5vZGUpLT5pX29wZW5jbnQgPSAwOworCUFGRlNfSShpbm9kZSktPmlfYmxrY250ID0gMDsKKwlBRkZTX0koaW5vZGUpLT5pX2xjID0gTlVMTDsKKwlBRkZTX0koaW5vZGUpLT5pX2xjX3NpemUgPSAwOworCUFGRlNfSShpbm9kZSktPmlfbGNfc2hpZnQgPSAwOworCUFGRlNfSShpbm9kZSktPmlfbGNfbWFzayA9IDA7CisJQUZGU19JKGlub2RlKS0+aV9hYyA9IE5VTEw7CisJQUZGU19JKGlub2RlKS0+aV9leHRfYmggPSBOVUxMOworCUFGRlNfSShpbm9kZSktPm1tdV9wcml2YXRlID0gMDsKKwlBRkZTX0koaW5vZGUpLT5pX2xhc3RhbGxvYyA9IDA7CisJQUZGU19JKGlub2RlKS0+aV9wYV9jbnQgPSAwOworCisJaWYgKHNiaS0+c19mbGFncyAmIFNGX1NFVE1PREUpCisJCWlub2RlLT5pX21vZGUgPSBzYmktPnNfbW9kZTsKKwllbHNlCisJCWlub2RlLT5pX21vZGUgPSBwcm90X3RvX21vZGUocHJvdCk7CisKKwlpZCA9IGJlMTZfdG9fY3B1KHRhaWwtPnVpZCk7CisJaWYgKGlkID09IDAgfHwgc2JpLT5zX2ZsYWdzICYgU0ZfU0VUVUlEKQorCQlpbm9kZS0+aV91aWQgPSBzYmktPnNfdWlkOworCWVsc2UgaWYgKGlkID09IDB4RkZGRiAmJiBzYmktPnNfZmxhZ3MgJiBTRl9NVUZTKQorCQlpbm9kZS0+aV91aWQgPSAwOworCWVsc2UKKwkJaW5vZGUtPmlfdWlkID0gaWQ7CisKKwlpZCA9IGJlMTZfdG9fY3B1KHRhaWwtPmdpZCk7CisJaWYgKGlkID09IDAgfHwgc2JpLT5zX2ZsYWdzICYgU0ZfU0VUR0lEKQorCQlpbm9kZS0+aV9naWQgPSBzYmktPnNfZ2lkOworCWVsc2UgaWYgKGlkID09IDB4RkZGRiAmJiBzYmktPnNfZmxhZ3MgJiBTRl9NVUZTKQorCQlpbm9kZS0+aV9naWQgPSAwOworCWVsc2UKKwkJaW5vZGUtPmlfZ2lkID0gaWQ7CisKKwlzd2l0Y2ggKGJlMzJfdG9fY3B1KHRhaWwtPnN0eXBlKSkgeworCWNhc2UgU1RfUk9PVDoKKwkJaW5vZGUtPmlfdWlkID0gc2JpLT5zX3VpZDsKKwkJaW5vZGUtPmlfZ2lkID0gc2JpLT5zX2dpZDsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTVF9VU0VSRElSOgorCQlpZiAoYmUzMl90b19jcHUodGFpbC0+c3R5cGUpID09IFNUX1VTRVJESVIgfHwKKwkJICAgIHNiaS0+c19mbGFncyAmIFNGX1NFVE1PREUpIHsKKwkJCWlmIChpbm9kZS0+aV9tb2RlICYgU19JUlVTUikKKwkJCQlpbm9kZS0+aV9tb2RlIHw9IFNfSVhVU1I7CisJCQlpZiAoaW5vZGUtPmlfbW9kZSAmIFNfSVJHUlApCisJCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lYR1JQOworCQkJaWYgKGlub2RlLT5pX21vZGUgJiBTX0lST1RIKQorCQkJCWlub2RlLT5pX21vZGUgfD0gU19JWE9USDsKKwkJCWlub2RlLT5pX21vZGUgfD0gU19JRkRJUjsKKwkJfSBlbHNlCisJCQlpbm9kZS0+aV9tb2RlID0gU19JUlVHTyB8IFNfSVhVR08gfCBTX0lXVVNSIHwgU19JRkRJUjsKKwkJaWYgKHRhaWwtPmxpbmtfY2hhaW4pCisJCQlpbm9kZS0+aV9ubGluayA9IDI7CisJCS8qIE1heWJlIGl0IHNob3VsZCBiZSBjb250cm9sbGVkIGJ5IG1vdW50IHBhcmFtZXRlcj8gKi8KKwkJLy9pbm9kZS0+aV9tb2RlIHw9IFNfSVNWVFg7CisJCWlub2RlLT5pX29wID0gJmFmZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZhZmZzX2Rpcl9vcGVyYXRpb25zOworCQlicmVhazsKKwljYXNlIFNUX0xJTktESVI6CisjaWYgMAorCQlhZmZzX3dhcm5pbmcoc2IsICJyZWFkX2lub2RlIiwgImlub2RlIGlzIExJTktESVIiKTsKKwkJZ290byBiYWRfaW5vZGU7CisjZWxzZQorCQlpbm9kZS0+aV9tb2RlIHw9IFNfSUZESVI7CisJCWlub2RlLT5pX29wID0gTlVMTDsKKwkJaW5vZGUtPmlfZm9wID0gTlVMTDsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFNUX0xJTktGSUxFOgorCQlhZmZzX3dhcm5pbmcoc2IsICJyZWFkX2lub2RlIiwgImlub2RlIGlzIExJTktGSUxFIik7CisJCWdvdG8gYmFkX2lub2RlOworCWNhc2UgU1RfRklMRToKKwkJc2l6ZSA9IGJlMzJfdG9fY3B1KHRhaWwtPnNpemUpOworCQlpbm9kZS0+aV9tb2RlIHw9IFNfSUZSRUc7CisJCUFGRlNfSShpbm9kZSktPm1tdV9wcml2YXRlID0gaW5vZGUtPmlfc2l6ZSA9IHNpemU7CisJCWlmIChpbm9kZS0+aV9zaXplKSB7CisJCQlBRkZTX0koaW5vZGUpLT5pX2Jsa2NudCA9IChzaXplIC0gMSkgLworCQkJCQkgICAgICAgc2JpLT5zX2RhdGFfYmxrc2l6ZSArIDE7CisJCQlBRkZTX0koaW5vZGUpLT5pX2V4dGNudCA9IChBRkZTX0koaW5vZGUpLT5pX2Jsa2NudCAtIDEpIC8KKwkJCQkJICAgICAgIHNiaS0+c19oYXNoc2l6ZSArIDE7CisJCX0KKwkJaWYgKHRhaWwtPmxpbmtfY2hhaW4pCisJCQlpbm9kZS0+aV9ubGluayA9IDI7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gKHNiaS0+c19mbGFncyAmIFNGX09GUykgPyAmYWZmc19hb3BzX29mcyA6ICZhZmZzX2FvcHM7CisJCWlub2RlLT5pX29wID0gJmFmZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmYWZmc19maWxlX29wZXJhdGlvbnM7CisJCWJyZWFrOworCWNhc2UgU1RfU09GVExJTks6CisJCWlub2RlLT5pX21vZGUgfD0gU19JRkxOSzsKKwkJaW5vZGUtPmlfb3AgPSAmYWZmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmYWZmc19zeW1saW5rX2FvcHM7CisJCWJyZWFrOworCX0KKworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IGlub2RlLT5pX2N0aW1lLnR2X3NlYworCQkgICAgICAgPSAoYmUzMl90b19jcHUodGFpbC0+Y2hhbmdlLmRheXMpICogKDI0ICogNjAgKiA2MCkgKworCQkgICAgICAgICBiZTMyX3RvX2NwdSh0YWlsLT5jaGFuZ2UubWlucykgKiA2MCArCisJCQkgYmUzMl90b19jcHUodGFpbC0+Y2hhbmdlLnRpY2tzKSAvIDUwICsKKwkJCSAoKDggKiAzNjUgKyAyKSAqIDI0ICogNjAgKiA2MCkpICsKKwkJCSBzeXNfdHoudHpfbWludXRlc3dlc3QgKiA2MDsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IGlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAwOworCWFmZnNfYnJlbHNlKGJoKTsKKwlyZXR1cm47CisKK2JhZF9pbm9kZToKKwltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJYWZmc19icmVsc2UoYmgpOworCXJldHVybjsKK30KKworaW50CithZmZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB1bnVzZWQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBidWZmZXJfaGVhZAkqYmg7CisJc3RydWN0IGFmZnNfdGFpbAkqdGFpbDsKKwl1aWRfdAkJCSB1aWQ7CisJZ2lkX3QJCQkgZ2lkOworCisJcHJfZGVidWcoIkFGRlM6IHdyaXRlX2lub2RlKCVsdSlcbiIsaW5vZGUtPmlfaW5vKTsKKworCWlmICghaW5vZGUtPmlfbmxpbmspCisJCS8vIHBvc3NpYmx5IGZyZWUgYmxvY2sKKwkJcmV0dXJuIDA7CisJYmggPSBhZmZzX2JyZWFkKHNiLCBpbm9kZS0+aV9pbm8pOworCWlmICghYmgpIHsKKwkJYWZmc19lcnJvcihzYiwid3JpdGVfaW5vZGUiLCJDYW5ub3QgcmVhZCBibG9jayAlbHUiLGlub2RlLT5pX2lubyk7CisJCXJldHVybiAtRUlPOworCX0KKwl0YWlsID0gQUZGU19UQUlMKHNiLCBiaCk7CisJaWYgKHRhaWwtPnN0eXBlID09IGNwdV90b19iZTMyKFNUX1JPT1QpKSB7CisJCXNlY3NfdG9fZGF0ZXN0YW1wKGlub2RlLT5pX210aW1lLnR2X3NlYywmQUZGU19ST09UX1RBSUwoc2IsIGJoKS0+cm9vdF9jaGFuZ2UpOworCX0gZWxzZSB7CisJCXRhaWwtPnByb3RlY3QgPSBjcHVfdG9fYmUzMihBRkZTX0koaW5vZGUpLT5pX3Byb3RlY3QpOworCQl0YWlsLT5zaXplID0gY3B1X3RvX2JlMzIoaW5vZGUtPmlfc2l6ZSk7CisJCXNlY3NfdG9fZGF0ZXN0YW1wKGlub2RlLT5pX210aW1lLnR2X3NlYywmdGFpbC0+Y2hhbmdlKTsKKwkJaWYgKCEoaW5vZGUtPmlfaW5vID09IEFGRlNfU0Ioc2IpLT5zX3Jvb3RfYmxvY2spKSB7CisJCQl1aWQgPSBpbm9kZS0+aV91aWQ7CisJCQlnaWQgPSBpbm9kZS0+aV9naWQ7CisJCQlpZiAoQUZGU19TQihzYiktPnNfZmxhZ3MgJiBTRl9NVUZTKSB7CisJCQkJaWYgKGlub2RlLT5pX3VpZCA9PSAwIHx8IGlub2RlLT5pX3VpZCA9PSAweEZGRkYpCisJCQkJCXVpZCA9IGlub2RlLT5pX3VpZCBeIH4wOworCQkJCWlmIChpbm9kZS0+aV9naWQgPT0gMCB8fCBpbm9kZS0+aV9naWQgPT0gMHhGRkZGKQorCQkJCQlnaWQgPSBpbm9kZS0+aV9naWQgXiB+MDsKKwkJCX0KKwkJCWlmICghKEFGRlNfU0Ioc2IpLT5zX2ZsYWdzICYgU0ZfU0VUVUlEKSkKKwkJCQl0YWlsLT51aWQgPSBjcHVfdG9fYmUxNih1aWQpOworCQkJaWYgKCEoQUZGU19TQihzYiktPnNfZmxhZ3MgJiBTRl9TRVRHSUQpKQorCQkJCXRhaWwtPmdpZCA9IGNwdV90b19iZTE2KGdpZCk7CisJCX0KKwl9CisJYWZmc19maXhfY2hlY2tzdW0oc2IsIGJoKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCWFmZnNfYnJlbHNlKGJoKTsKKwlhZmZzX2ZyZWVfcHJlYWxsb2MoaW5vZGUpOworCXJldHVybiAwOworfQorCitpbnQKK2FmZnNfbm90aWZ5X2NoYW5nZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvcjsKKworCXByX2RlYnVnKCJBRkZTOiBub3RpZnlfY2hhbmdlKCVsdSwweCV4KVxuIixpbm9kZS0+aV9pbm8sYXR0ci0+aWFfdmFsaWQpOworCisJZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsYXR0cik7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCWlmICgoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQpICYmIChBRkZTX1NCKGlub2RlLT5pX3NiKS0+c19mbGFncyAmIFNGX1NFVFVJRCkpIHx8CisJICAgICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCkgJiYgKEFGRlNfU0IoaW5vZGUtPmlfc2IpLT5zX2ZsYWdzICYgU0ZfU0VUR0lEKSkgfHwKKwkgICAgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgJiYKKwkgICAgIChBRkZTX1NCKGlub2RlLT5pX3NiKS0+c19mbGFncyAmIChTRl9TRVRNT0RFIHwgU0ZfSU1NVVRBQkxFKSkpKSB7CisJCWlmICghKEFGRlNfU0IoaW5vZGUtPmlfc2IpLT5zX2ZsYWdzICYgU0ZfUVVJRVQpKQorCQkJZXJyb3IgPSAtRVBFUk07CisJCWdvdG8gb3V0OworCX0KKworCWVycm9yID0gaW5vZGVfc2V0YXR0cihpbm9kZSwgYXR0cik7CisJaWYgKCFlcnJvciAmJiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpKQorCQltb2RlX3RvX3Byb3QoaW5vZGUpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKwordm9pZAorYWZmc19wdXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlwcl9kZWJ1ZygiQUZGUzogcHV0X2lub2RlKGlubz0lbHUsIG5saW5rPSV1KVxuIiwgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluayk7CisJYWZmc19mcmVlX3ByZWFsbG9jKGlub2RlKTsKKwlpZiAoYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSA9PSAxKSB7CisJCWRvd24oJmlub2RlLT5pX3NlbSk7CisJCWlmIChpbm9kZS0+aV9zaXplICE9IEFGRlNfSShpbm9kZSktPm1tdV9wcml2YXRlKQorCQkJYWZmc190cnVuY2F0ZShpbm9kZSk7CisJCXVwKCZpbm9kZS0+aV9zZW0pOworCX0KK30KKwordm9pZAorYWZmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlwcl9kZWJ1ZygiQUZGUzogZGVsZXRlX2lub2RlKGlubz0lbHUsIG5saW5rPSV1KVxuIiwgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluayk7CisJaW5vZGUtPmlfc2l6ZSA9IDA7CisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCWFmZnNfdHJ1bmNhdGUoaW5vZGUpOworCWNsZWFyX2lub2RlKGlub2RlKTsKKwlhZmZzX2ZyZWVfYmxvY2soaW5vZGUtPmlfc2IsIGlub2RlLT5pX2lubyk7Cit9CisKK3ZvaWQKK2FmZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIGNhY2hlX3BhZ2UgPSAodW5zaWduZWQgbG9uZykgQUZGU19JKGlub2RlKS0+aV9sYzsKKworCXByX2RlYnVnKCJBRkZTOiBjbGVhcl9pbm9kZShpbm89JWx1LCBubGluaz0ldSlcbiIsIGlub2RlLT5pX2lubywgaW5vZGUtPmlfbmxpbmspOworCWlmIChjYWNoZV9wYWdlKSB7CisJCXByX2RlYnVnKCJBRkZTOiBmcmVlaW5nIGV4dCBjYWNoZVxuIik7CisJCUFGRlNfSShpbm9kZSktPmlfbGMgPSBOVUxMOworCQlBRkZTX0koaW5vZGUpLT5pX2FjID0gTlVMTDsKKwkJZnJlZV9wYWdlKGNhY2hlX3BhZ2UpOworCX0KKwlhZmZzX2JyZWxzZShBRkZTX0koaW5vZGUpLT5pX2V4dF9iaCk7CisJQUZGU19JKGlub2RlKS0+aV9leHRfbGFzdCA9IH4xOworCUFGRlNfSShpbm9kZSktPmlfZXh0X2JoID0gTlVMTDsKK30KKworc3RydWN0IGlub2RlICoKK2FmZnNfbmV3X2lub2RlKHN0cnVjdCBpbm9kZSAqZGlyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IGlub2RlCQkqaW5vZGU7CisJdTMyCQkJIGJsb2NrOworCXN0cnVjdCBidWZmZXJfaGVhZAkqYmg7CisKKwlpZiAoIShpbm9kZSA9IG5ld19pbm9kZShzYikpKQorCQlnb3RvIGVycl9pbm9kZTsKKworCWlmICghKGJsb2NrID0gYWZmc19hbGxvY19ibG9jayhkaXIsIGRpci0+aV9pbm8pKSkKKwkJZ290byBlcnJfYmxvY2s7CisKKwliaCA9IGFmZnNfZ2V0emVyb2JsayhzYiwgYmxvY2spOworCWlmICghYmgpCisJCWdvdG8gZXJyX2JoOworCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGJoLCBpbm9kZSk7CisJYWZmc19icmVsc2UoYmgpOworCisJaW5vZGUtPmlfdWlkICAgICA9IGN1cnJlbnQtPmZzdWlkOworCWlub2RlLT5pX2dpZCAgICAgPSBjdXJyZW50LT5mc2dpZDsKKwlpbm9kZS0+aV9pbm8gICAgID0gYmxvY2s7CisJaW5vZGUtPmlfbmxpbmsgICA9IDE7CisJaW5vZGUtPmlfbXRpbWUgICA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCUFGRlNfSShpbm9kZSktPmlfb3BlbmNudCA9IDA7CisJQUZGU19JKGlub2RlKS0+aV9ibGtjbnQgPSAwOworCUFGRlNfSShpbm9kZSktPmlfbGMgPSBOVUxMOworCUFGRlNfSShpbm9kZSktPmlfbGNfc2l6ZSA9IDA7CisJQUZGU19JKGlub2RlKS0+aV9sY19zaGlmdCA9IDA7CisJQUZGU19JKGlub2RlKS0+aV9sY19tYXNrID0gMDsKKwlBRkZTX0koaW5vZGUpLT5pX2FjID0gTlVMTDsKKwlBRkZTX0koaW5vZGUpLT5pX2V4dF9iaCA9IE5VTEw7CisJQUZGU19JKGlub2RlKS0+bW11X3ByaXZhdGUgPSAwOworCUFGRlNfSShpbm9kZSktPmlfcHJvdGVjdCA9IDA7CisJQUZGU19JKGlub2RlKS0+aV9sYXN0YWxsb2MgPSAwOworCUFGRlNfSShpbm9kZSktPmlfcGFfY250ID0gMDsKKwlBRkZTX0koaW5vZGUpLT5pX2V4dGNudCA9IDE7CisJQUZGU19JKGlub2RlKS0+aV9leHRfbGFzdCA9IH4xOworCisJaW5zZXJ0X2lub2RlX2hhc2goaW5vZGUpOworCisJcmV0dXJuIGlub2RlOworCitlcnJfYmg6CisJYWZmc19mcmVlX2Jsb2NrKHNiLCBibG9jayk7CitlcnJfYmxvY2s6CisJaXB1dChpbm9kZSk7CitlcnJfaW5vZGU6CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBBZGQgYW4gZW50cnkgdG8gYSBkaXJlY3RvcnkuIENyZWF0ZSB0aGUgaGVhZGVyIGJsb2NrCisgKiBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIGhhc2ggdGFibGUuCisgKi8KKworaW50CithZmZzX2FkZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzMzIgdHlwZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqaW5vZGVfYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCXUzMiBibG9jayA9IDA7CisJaW50IHJldHZhbDsKKworCXByX2RlYnVnKCJBRkZTOiBhZGRfZW50cnkoZGlyPSV1LCBpbm9kZT0ldSwgXCIlKnNcIiwgdHlwZT0lZClcbiIsICh1MzIpZGlyLT5pX2lubywKKwkgICAgICAgICAodTMyKWlub2RlLT5pX2lubywgKGludClkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIHR5cGUpOworCisJcmV0dmFsID0gLUVJTzsKKwliaCA9IGFmZnNfYnJlYWQoc2IsIGlub2RlLT5pX2lubyk7CisJaWYgKCFiaCkKKwkJZ290byBkb25lOworCisJYWZmc19sb2NrX2xpbmsoaW5vZGUpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU1RfTElOS0ZJTEU6CisJY2FzZSBTVF9MSU5LRElSOgorCQlpbm9kZV9iaCA9IGJoOworCQlyZXR2YWwgPSAtRU5PU1BDOworCQlibG9jayA9IGFmZnNfYWxsb2NfYmxvY2soZGlyLCBkaXItPmlfaW5vKTsKKwkJaWYgKCFibG9jaykKKwkJCWdvdG8gZXJyOworCQlyZXR2YWwgPSAtRUlPOworCQliaCA9IGFmZnNfZ2V0emVyb2JsayhzYiwgYmxvY2spOworCQlpZiAoIWJoKQorCQkJZ290byBlcnI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCUFGRlNfSEVBRChiaCktPnB0eXBlID0gY3B1X3RvX2JlMzIoVF9TSE9SVCk7CisJQUZGU19IRUFEKGJoKS0+a2V5ID0gY3B1X3RvX2JlMzIoYmgtPmJfYmxvY2tucik7CisJYWZmc19jb3B5X25hbWUoQUZGU19UQUlMKHNiLCBiaCktPm5hbWUsIGRlbnRyeSk7CisJQUZGU19UQUlMKHNiLCBiaCktPnN0eXBlID0gY3B1X3RvX2JlMzIodHlwZSk7CisJQUZGU19UQUlMKHNiLCBiaCktPnBhcmVudCA9IGNwdV90b19iZTMyKGRpci0+aV9pbm8pOworCisJaWYgKGlub2RlX2JoKSB7CisJCV9fYmUzMiBjaGFpbjsKKwkgICAgICAgCWNoYWluID0gQUZGU19UQUlMKHNiLCBpbm9kZV9iaCktPmxpbmtfY2hhaW47CisJCUFGRlNfVEFJTChzYiwgYmgpLT5vcmlnaW5hbCA9IGNwdV90b19iZTMyKGlub2RlLT5pX2lubyk7CisJCUFGRlNfVEFJTChzYiwgYmgpLT5saW5rX2NoYWluID0gY2hhaW47CisJCUFGRlNfVEFJTChzYiwgaW5vZGVfYmgpLT5saW5rX2NoYWluID0gY3B1X3RvX2JlMzIoYmxvY2spOworCQlhZmZzX2FkanVzdF9jaGVja3N1bShpbm9kZV9iaCwgYmxvY2sgLSBiZTMyX3RvX2NwdShjaGFpbikpOworCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShpbm9kZV9iaCwgaW5vZGUpOworCQlpbm9kZS0+aV9ubGluayA9IDI7CisJCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKKwl9CisJYWZmc19maXhfY2hlY2tzdW0oc2IsIGJoKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCWRlbnRyeS0+ZF9mc2RhdGEgPSAodm9pZCAqKShsb25nKWJoLT5iX2Jsb2NrbnI7CisKKwlhZmZzX2xvY2tfZGlyKGRpcik7CisJcmV0dmFsID0gYWZmc19pbnNlcnRfaGFzaChkaXIsIGJoKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCWFmZnNfdW5sb2NrX2RpcihkaXIpOworCWFmZnNfdW5sb2NrX2xpbmsoaW5vZGUpOworCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKK2RvbmU6CisJYWZmc19icmVsc2UoaW5vZGVfYmgpOworCWFmZnNfYnJlbHNlKGJoKTsKKwlyZXR1cm4gcmV0dmFsOworZXJyOgorCWlmIChibG9jaykKKwkJYWZmc19mcmVlX2Jsb2NrKHNiLCBibG9jayk7CisJYWZmc191bmxvY2tfbGluayhpbm9kZSk7CisJZ290byBkb25lOworfQpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9uYW1laS5jIGIvZnMvYWZmcy9uYW1laS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YzJkNjMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZmZzL25hbWVpLmMKQEAgLTAsMCArMSw0NDMgQEAKKy8qCisgKiAgbGludXgvZnMvYWZmcy9uYW1laS5jCisgKgorICogIChjKSAxOTk2ICBIYW5zLUpvYWNoaW0gV2lkbWFpZXIgLSBSZXdyaXR0ZW4KKyAqCisgKiAgKEMpIDE5OTMgIFJheSBCdXJyIC0gTW9kaWZpZWQgZm9yIEFtaWdhIEZGUyBmaWxlc3lzdGVtLgorICoKKyAqICAoQykgMTk5MSAgTGludXMgVG9ydmFsZHMgLSBtaW5peCBmaWxlc3lzdGVtCisgKi8KKworI2luY2x1ZGUgImFmZnMuaCIKKwordHlwZWRlZiBpbnQgKCp0b3VwcGVyX3QpKGludCk7CisKK3N0YXRpYyBpbnQJIGFmZnNfdG91cHBlcihpbnQgY2gpOworc3RhdGljIGludAkgYWZmc19oYXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBxc3RyICopOworc3RhdGljIGludCAgICAgICBhZmZzX2NvbXBhcmVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IHFzdHIgKiwgc3RydWN0IHFzdHIgKik7CitzdGF0aWMgaW50CSBhZmZzX2ludGxfdG91cHBlcihpbnQgY2gpOworc3RhdGljIGludAkgYWZmc19pbnRsX2hhc2hfZGVudHJ5KHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IHFzdHIgKik7CitzdGF0aWMgaW50ICAgICAgIGFmZnNfaW50bF9jb21wYXJlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBxc3RyICosIHN0cnVjdCBxc3RyICopOworCitzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgYWZmc19kZW50cnlfb3BlcmF0aW9ucyA9IHsKKwkuZF9oYXNoCQk9IGFmZnNfaGFzaF9kZW50cnksCisJLmRfY29tcGFyZQk9IGFmZnNfY29tcGFyZV9kZW50cnksCit9OworCitzdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGFmZnNfaW50bF9kZW50cnlfb3BlcmF0aW9ucyA9IHsKKwkuZF9oYXNoCQk9IGFmZnNfaW50bF9oYXNoX2RlbnRyeSwKKwkuZF9jb21wYXJlCT0gYWZmc19pbnRsX2NvbXBhcmVfZGVudHJ5LAorfTsKKworCisvKiBTaW1wbGUgdG91cHBlcigpIGZvciBET1NcMSAqLworCitzdGF0aWMgaW50CithZmZzX3RvdXBwZXIoaW50IGNoKQoreworCXJldHVybiBjaCA+PSAnYScgJiYgY2ggPD0gJ3onID8gY2ggLT0gKCdhJyAtICdBJykgOiBjaDsKK30KKworLyogSW50ZXJuYXRpb25hbCB0b3VwcGVyKCkgZm9yIERPU1wzICgiaW50ZXJuYXRpb25hbCIpICovCisKK3N0YXRpYyBpbnQKK2FmZnNfaW50bF90b3VwcGVyKGludCBjaCkKK3sKKwlyZXR1cm4gKGNoID49ICdhJyAmJiBjaCA8PSAneicpIHx8IChjaCA+PSAweEUwCisJCSYmIGNoIDw9IDB4RkUgJiYgY2ggIT0gMHhGNykgPworCQljaCAtICgnYScgLSAnQScpIDogY2g7Cit9CisKK3N0YXRpYyBpbmxpbmUgdG91cHBlcl90CithZmZzX2dldF90b3VwcGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIEFGRlNfU0Ioc2IpLT5zX2ZsYWdzICYgU0ZfSU5UTCA/IGFmZnNfaW50bF90b3VwcGVyIDogYWZmc190b3VwcGVyOworfQorCisvKgorICogTm90ZTogdGhlIGRlbnRyeSBhcmd1bWVudCBpcyB0aGUgcGFyZW50IGRlbnRyeS4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK19fYWZmc19oYXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxc3RyLCB0b3VwcGVyX3QgdG91cHBlcikKK3sKKwljb25zdCB1OCAqbmFtZSA9IHFzdHItPm5hbWU7CisJdW5zaWduZWQgbG9uZyBoYXNoOworCWludCBpOworCisJaSA9IGFmZnNfY2hlY2tfbmFtZShxc3RyLT5uYW1lLHFzdHItPmxlbik7CisJaWYgKGkpCisJCXJldHVybiBpOworCisJaGFzaCA9IGluaXRfbmFtZV9oYXNoKCk7CisJaSA9IG1pbihxc3RyLT5sZW4sIDMwdSk7CisJZm9yICg7IGkgPiAwOyBuYW1lKyssIGktLSkKKwkJaGFzaCA9IHBhcnRpYWxfbmFtZV9oYXNoKHRvdXBwZXIoKm5hbWUpLCBoYXNoKTsKKwlxc3RyLT5oYXNoID0gZW5kX25hbWVfaGFzaChoYXNoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CithZmZzX2hhc2hfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnFzdHIpCit7CisJcmV0dXJuIF9fYWZmc19oYXNoX2RlbnRyeShkZW50cnksIHFzdHIsIGFmZnNfdG91cHBlcik7Cit9CitzdGF0aWMgaW50CithZmZzX2ludGxfaGFzaF9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0cikKK3sKKwlyZXR1cm4gX19hZmZzX2hhc2hfZGVudHJ5KGRlbnRyeSwgcXN0ciwgYWZmc19pbnRsX3RvdXBwZXIpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19hZmZzX2NvbXBhcmVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKmEsIHN0cnVjdCBxc3RyICpiLCB0b3VwcGVyX3QgdG91cHBlcikKK3sKKwljb25zdCB1OCAqYW5hbWUgPSBhLT5uYW1lOworCWNvbnN0IHU4ICpibmFtZSA9IGItPm5hbWU7CisJaW50IGxlbjsKKworCS8qICdhJyBpcyB0aGUgcXN0ciBvZiBhbiBhbHJlYWR5IGV4aXN0aW5nIGRlbnRyeSwgc28gdGhlIG5hbWUKKwkgKiBtdXN0IGJlIHZhbGlkLiAnYicgbXVzdCBiZSB2YWxpZGF0ZWQgZmlyc3QuCisJICovCisKKwlpZiAoYWZmc19jaGVja19uYW1lKGItPm5hbWUsYi0+bGVuKSkKKwkJcmV0dXJuIDE7CisKKwkvKiBJZiB0aGUgbmFtZXMgYXJlIGxvbmdlciB0aGFuIHRoZSBhbGxvd2VkIDMwIGNoYXJzLAorCSAqIHRoZSBleGNlc3MgaXMgaWdub3JlZCwgc28gdGhlaXIgbGVuZ3RoIG1heSBkaWZmZXIuCisJICovCisJbGVuID0gYS0+bGVuOworCWlmIChsZW4gPj0gMzApIHsKKwkJaWYgKGItPmxlbiA8IDMwKQorCQkJcmV0dXJuIDE7CisJCWxlbiA9IDMwOworCX0gZWxzZSBpZiAobGVuICE9IGItPmxlbikKKwkJcmV0dXJuIDE7CisKKwlmb3IgKDsgbGVuID4gMDsgbGVuLS0pCisJCWlmICh0b3VwcGVyKCphbmFtZSsrKSAhPSB0b3VwcGVyKCpibmFtZSsrKSkKKwkJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2FmZnNfY29tcGFyZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqYSwgc3RydWN0IHFzdHIgKmIpCit7CisJcmV0dXJuIF9fYWZmc19jb21wYXJlX2RlbnRyeShkZW50cnksIGEsIGIsIGFmZnNfdG91cHBlcik7Cit9CitzdGF0aWMgaW50CithZmZzX2ludGxfY29tcGFyZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqYSwgc3RydWN0IHFzdHIgKmIpCit7CisJcmV0dXJuIF9fYWZmc19jb21wYXJlX2RlbnRyeShkZW50cnksIGEsIGIsIGFmZnNfaW50bF90b3VwcGVyKTsKK30KKworLyoKKyAqIE5PVEUhIHVubGlrZSBzdHJuY21wLCBhZmZzX21hdGNoIHJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW5saW5lIGludAorYWZmc19tYXRjaChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IHU4ICpuYW1lMiwgdG91cHBlcl90IHRvdXBwZXIpCit7CisJY29uc3QgdTggKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludCBsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisKKwlpZiAobGVuID49IDMwKSB7CisJCWlmICgqbmFtZTIgPCAzMCkKKwkJCXJldHVybiAwOworCQlsZW4gPSAzMDsKKwl9IGVsc2UgaWYgKGxlbiAhPSAqbmFtZTIpCisJCXJldHVybiAwOworCisJZm9yIChuYW1lMisrOyBsZW4gPiAwOyBsZW4tLSkKKwkJaWYgKHRvdXBwZXIoKm5hbWUrKykgIT0gdG91cHBlcigqbmFtZTIrKykpCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworaW50CithZmZzX2hhc2hfbmFtZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCB1OCAqbmFtZSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwl0b3VwcGVyX3QgdG91cHBlciA9IGFmZnNfZ2V0X3RvdXBwZXIoc2IpOworCWludCBoYXNoOworCisJaGFzaCA9IGxlbiA9IG1pbihsZW4sIDMwdSk7CisJZm9yICg7IGxlbiA+IDA7IGxlbi0tKQorCQloYXNoID0gKGhhc2ggKiAxMyArIHRvdXBwZXIoKm5hbWUrKykpICYgMHg3ZmY7CisKKwlyZXR1cm4gaGFzaCAlIEFGRlNfU0Ioc2IpLT5zX2hhc2hzaXplOworfQorCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK2FmZnNfZmluZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwl0b3VwcGVyX3QgdG91cHBlciA9IGFmZnNfZ2V0X3RvdXBwZXIoc2IpOworCXUzMiBrZXk7CisKKwlwcl9kZWJ1ZygiQUZGUzogZmluZF9lbnRyeShcIiUuKnNcIilcbiIsIChpbnQpZGVudHJ5LT5kX25hbWUubGVuLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWJoID0gYWZmc19icmVhZChzYiwgZGlyLT5pX2lubyk7CisJaWYgKCFiaCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisKKwlrZXkgPSBiZTMyX3RvX2NwdShBRkZTX0hFQUQoYmgpLT50YWJsZVthZmZzX2hhc2hfbmFtZShzYiwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuKV0pOworCisJZm9yICg7OykgeworCQlhZmZzX2JyZWxzZShiaCk7CisJCWlmIChrZXkgPT0gMCkKKwkJCXJldHVybiBOVUxMOworCQliaCA9IGFmZnNfYnJlYWQoc2IsIGtleSk7CisJCWlmICghYmgpCisJCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwkJaWYgKGFmZnNfbWF0Y2goZGVudHJ5LCBBRkZTX1RBSUwoc2IsIGJoKS0+bmFtZSwgdG91cHBlcikpCisJCQlyZXR1cm4gYmg7CisJCWtleSA9IGJlMzJfdG9fY3B1KEFGRlNfVEFJTChzYiwgYmgpLT5oYXNoX2NoYWluKTsKKwl9Cit9CisKK3N0cnVjdCBkZW50cnkgKgorYWZmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCisJcHJfZGVidWcoIkFGRlM6IGxvb2t1cChcIiUuKnNcIilcbiIsKGludClkZW50cnktPmRfbmFtZS5sZW4sZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlhZmZzX2xvY2tfZGlyKGRpcik7CisJYmggPSBhZmZzX2ZpbmRfZW50cnkoZGlyLCBkZW50cnkpOworCWFmZnNfdW5sb2NrX2RpcihkaXIpOworCWlmIChJU19FUlIoYmgpKSB7CisJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoYmgpKTsKKwl9CisJaWYgKGJoKSB7CisJCXUzMiBpbm8gPSBiaC0+Yl9ibG9ja25yOworCisJCS8qIHN0b3JlIHRoZSByZWFsIGhlYWRlciBpbm8gaW4gZF9mc2RhdGEgZm9yIGZhc3RlciBsb29rdXBzICovCisJCWRlbnRyeS0+ZF9mc2RhdGEgPSAodm9pZCAqKShsb25nKWlubzsKKwkJc3dpdGNoIChiZTMyX3RvX2NwdShBRkZTX1RBSUwoc2IsIGJoKS0+c3R5cGUpKSB7CisJCS8vbGluayB0byBkaXJzIGRpc2FibGVkCisJCS8vY2FzZSBTVF9MSU5LRElSOgorCQljYXNlIFNUX0xJTktGSUxFOgorCQkJaW5vID0gYmUzMl90b19jcHUoQUZGU19UQUlMKHNiLCBiaCktPm9yaWdpbmFsKTsKKwkJfQorCQlhZmZzX2JyZWxzZShiaCk7CisJCWlub2RlID0gaWdldChzYiwgaW5vKTsKKwkJaWYgKCFpbm9kZSkgeworCQkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJCX0KKwl9CisJZGVudHJ5LT5kX29wID0gQUZGU19TQihzYiktPnNfZmxhZ3MgJiBTRl9JTlRMID8gJmFmZnNfaW50bF9kZW50cnlfb3BlcmF0aW9ucyA6ICZhZmZzX2RlbnRyeV9vcGVyYXRpb25zOworCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiBOVUxMOworfQorCitpbnQKK2FmZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJcHJfZGVidWcoIkFGRlM6IHVubGluayhkaXI9JWQsIFwiJS4qc1wiKVxuIiwgKHUzMilkaXItPmlfaW5vLAorCQkgKGludClkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJcmV0dXJuIGFmZnNfcmVtb3ZlX2hlYWRlcihkZW50cnkpOworfQorCitpbnQKK2FmZnNfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBpbm9kZQkqaW5vZGU7CisJaW50CQkgZXJyb3I7CisKKwlwcl9kZWJ1ZygiQUZGUzogY3JlYXRlKCVsdSxcIiUuKnNcIiwwJW8pXG4iLGRpci0+aV9pbm8sKGludClkZW50cnktPmRfbmFtZS5sZW4sCisJCSBkZW50cnktPmRfbmFtZS5uYW1lLG1vZGUpOworCisJaW5vZGUgPSBhZmZzX25ld19pbm9kZShkaXIpOworCWlmICghaW5vZGUpCisJCXJldHVybiAtRU5PU1BDOworCisJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJbW9kZV90b19wcm90KGlub2RlKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKworCWlub2RlLT5pX29wID0gJmFmZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT5pX2ZvcCA9ICZhZmZzX2ZpbGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9IChBRkZTX1NCKHNiKS0+c19mbGFncyAmIFNGX09GUykgPyAmYWZmc19hb3BzX29mcyA6ICZhZmZzX2FvcHM7CisJZXJyb3IgPSBhZmZzX2FkZF9lbnRyeShkaXIsIGlub2RlLCBkZW50cnksIFNUX0ZJTEUpOworCWlmIChlcnJvcikgeworCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCXJldHVybiAwOworfQorCitpbnQKK2FmZnNfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJc3RydWN0IGlub2RlCQkqaW5vZGU7CisJaW50CQkJIGVycm9yOworCisJcHJfZGVidWcoIkFGRlM6IG1rZGlyKCVsdSxcIiUuKnNcIiwwJW8pXG4iLGRpci0+aV9pbm8sCisJCSAoaW50KWRlbnRyeS0+ZF9uYW1lLmxlbixkZW50cnktPmRfbmFtZS5uYW1lLG1vZGUpOworCisJaW5vZGUgPSBhZmZzX25ld19pbm9kZShkaXIpOworCWlmICghaW5vZGUpCisJCXJldHVybiAtRU5PU1BDOworCisJaW5vZGUtPmlfbW9kZSA9IFNfSUZESVIgfCBtb2RlOworCW1vZGVfdG9fcHJvdChpbm9kZSk7CisKKwlpbm9kZS0+aV9vcCA9ICZhZmZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT5pX2ZvcCA9ICZhZmZzX2Rpcl9vcGVyYXRpb25zOworCisJZXJyb3IgPSBhZmZzX2FkZF9lbnRyeShkaXIsIGlub2RlLCBkZW50cnksIFNUX1VTRVJESVIpOworCWlmIChlcnJvcikgeworCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50CithZmZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJcHJfZGVidWcoIkFGRlM6IHJtZGlyKGRpcj0ldSwgXCIlLipzXCIpXG4iLCAodTMyKWRpci0+aV9pbm8sCisJCSAoaW50KWRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlyZXR1cm4gYWZmc19yZW1vdmVfaGVhZGVyKGRlbnRyeSk7Cit9CisKK2ludAorYWZmc19zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKnN5bW5hbWUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYiA9IGRpci0+aV9zYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoOworCXN0cnVjdCBpbm9kZQkJKmlub2RlOworCWNoYXIJCQkqcDsKKwlpbnQJCQkgaSwgbWF4bGVuLCBlcnJvcjsKKwljaGFyCQkJIGMsIGxjOworCisJcHJfZGVidWcoIkFGRlM6IHN5bWxpbmsoJWx1LFwiJS4qc1wiIC0+IFwiJXNcIilcbiIsZGlyLT5pX2lubywKKwkJIChpbnQpZGVudHJ5LT5kX25hbWUubGVuLGRlbnRyeS0+ZF9uYW1lLm5hbWUsc3ltbmFtZSk7CisKKwltYXhsZW4gPSBBRkZTX1NCKHNiKS0+c19oYXNoc2l6ZSAqIHNpemVvZih1MzIpIC0gMTsKKwlpbm9kZSAgPSBhZmZzX25ld19pbm9kZShkaXIpOworCWlmICghaW5vZGUpCisJCXJldHVybiAtRU5PU1BDOworCisJaW5vZGUtPmlfb3AgPSAmYWZmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZhZmZzX3N5bWxpbmtfYW9wczsKKwlpbm9kZS0+aV9tb2RlID0gU19JRkxOSyB8IDA3Nzc7CisJbW9kZV90b19wcm90KGlub2RlKTsKKworCWVycm9yID0gLUVJTzsKKwliaCA9IGFmZnNfYnJlYWQoc2IsIGlub2RlLT5pX2lubyk7CisJaWYgKCFiaCkKKwkJZ290byBlcnI7CisJaSAgPSAwOworCXAgID0gKGNoYXIgKilBRkZTX0hFQUQoYmgpLT50YWJsZTsKKwlsYyA9ICcvJzsKKwlpZiAoKnN5bW5hbWUgPT0gJy8nKSB7CisJCXdoaWxlICgqc3ltbmFtZSA9PSAnLycpCisJCQlzeW1uYW1lKys7CisJCXdoaWxlIChBRkZTX1NCKHNiKS0+c192b2x1bWVbaV0pCS8qIENhbm5vdCBvdmVyZmxvdyAqLworCQkJKnArKyA9IEFGRlNfU0Ioc2IpLT5zX3ZvbHVtZVtpKytdOworCX0KKwl3aGlsZSAoaSA8IG1heGxlbiAmJiAoYyA9ICpzeW1uYW1lKyspKSB7CisJCWlmIChjID09ICcuJyAmJiBsYyA9PSAnLycgJiYgKnN5bW5hbWUgPT0gJy4nICYmIHN5bW5hbWVbMV0gPT0gJy8nKSB7CisJCQkqcCsrID0gJy8nOworCQkJaSsrOworCQkJc3ltbmFtZSArPSAyOworCQkJbGMgPSAnLyc7CisJCX0gZWxzZSBpZiAoYyA9PSAnLicgJiYgbGMgPT0gJy8nICYmICpzeW1uYW1lID09ICcvJykgeworCQkJc3ltbmFtZSsrOworCQkJbGMgPSAnLyc7CisJCX0gZWxzZSB7CisJCQkqcCsrID0gYzsKKwkJCWxjICAgPSBjOworCQkJaSsrOworCQl9CisJCWlmIChsYyA9PSAnLycpCisJCQl3aGlsZSAoKnN5bW5hbWUgPT0gJy8nKQorCQkJCXN5bW5hbWUrKzsKKwl9CisJKnAgPSAwOworCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGJoLCBpbm9kZSk7CisJYWZmc19icmVsc2UoYmgpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCisJZXJyb3IgPSBhZmZzX2FkZF9lbnRyeShkaXIsIGlub2RlLCBkZW50cnksIFNUX1NPRlRMSU5LKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlpbm9kZS0+aV9ubGluayA9IDA7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJaXB1dChpbm9kZSk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQKK2FmZnNfbGluayhzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCisJcHJfZGVidWcoIkFGRlM6IGxpbmsoJXUsICV1LCBcIiUuKnNcIilcbiIsICh1MzIpaW5vZGUtPmlfaW5vLCAodTMyKWRpci0+aV9pbm8sCisJCSAoaW50KWRlbnRyeS0+ZF9uYW1lLmxlbixkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCXJldHVybiBhZmZzX2FkZF9lbnRyeShkaXIsIGlub2RlLCBkZW50cnksIFNUX0xJTktGSUxFKTsKK30KKworaW50CithZmZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJICAgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gb2xkX2Rpci0+aV9zYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlpbnQgcmV0dmFsOworCisJcHJfZGVidWcoIkFGRlM6IHJlbmFtZShvbGQ9JXUsXCIlKnNcIiB0byBuZXc9JXUsXCIlKnNcIilcbiIsCisJCSAodTMyKW9sZF9kaXItPmlfaW5vLCAoaW50KW9sZF9kZW50cnktPmRfbmFtZS5sZW4sIG9sZF9kZW50cnktPmRfbmFtZS5uYW1lLAorCQkgKHUzMiluZXdfZGlyLT5pX2lubywgKGludCluZXdfZGVudHJ5LT5kX25hbWUubGVuLCBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlyZXR2YWwgPSBhZmZzX2NoZWNrX25hbWUobmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsbmV3X2RlbnRyeS0+ZF9uYW1lLmxlbik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCS8qIFVubGluayBkZXN0aW5hdGlvbiBpZiBpdCBhbHJlYWR5IGV4aXN0cyAqLworCWlmIChuZXdfZGVudHJ5LT5kX2lub2RlKSB7CisJCXJldHZhbCA9IGFmZnNfcmVtb3ZlX2hlYWRlcihuZXdfZGVudHJ5KTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCisJcmV0dmFsID0gLUVJTzsKKwliaCA9IGFmZnNfYnJlYWQoc2IsIG9sZF9kZW50cnktPmRfaW5vZGUtPmlfaW5vKTsKKwlpZiAoIWJoKQorCQlnb3RvIGRvbmU7CisKKwkvKiBSZW1vdmUgaGVhZGVyIGZyb20gaXRzIHBhcmVudCBkaXJlY3RvcnkuICovCisJYWZmc19sb2NrX2RpcihvbGRfZGlyKTsKKwlyZXR2YWwgPSBhZmZzX3JlbW92ZV9oYXNoKG9sZF9kaXIsIGJoKTsKKwlhZmZzX3VubG9ja19kaXIob2xkX2Rpcik7CisJaWYgKHJldHZhbCkKKwkJZ290byBkb25lOworCisJLyogQW5kIGluc2VydCBpdCBpbnRvIHRoZSBuZXcgZGlyZWN0b3J5IHdpdGggdGhlIG5ldyBuYW1lLiAqLworCWFmZnNfY29weV9uYW1lKEFGRlNfVEFJTChzYiwgYmgpLT5uYW1lLCBuZXdfZGVudHJ5KTsKKwlhZmZzX2ZpeF9jaGVja3N1bShzYiwgYmgpOworCWFmZnNfbG9ja19kaXIobmV3X2Rpcik7CisJcmV0dmFsID0gYWZmc19pbnNlcnRfaGFzaChuZXdfZGlyLCBiaCk7CisJYWZmc191bmxvY2tfZGlyKG5ld19kaXIpOworCS8qIFRPRE86IG1vdmUgaXQgYmFjayB0byBvbGRfZGlyLCBpZiBlcnJvcj8gKi8KKworZG9uZToKKwltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgcmV0dmFsID8gb2xkX2RpciA6IG5ld19kaXIpOworCWFmZnNfYnJlbHNlKGJoKTsKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9zdXBlci5jIGIvZnMvYWZmcy9zdXBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMzA4MDcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZmZzL3N1cGVyLmMKQEAgLTAsMCArMSw1NjkgQEAKKy8qCisgKiAgbGludXgvZnMvYWZmcy9pbm9kZS5jCisgKgorICogIChjKSAxOTk2ICBIYW5zLUpvYWNoaW0gV2lkbWFpZXIgLSBSZXdyaXR0ZW4KKyAqCisgKiAgKEMpIDE5OTMgIFJheSBCdXJyIC0gTW9kaWZpZWQgZm9yIEFtaWdhIEZGUyBmaWxlc3lzdGVtLgorICoKKyAqICAoQykgMTk5MiAgRXJpYyBZb3VuZ2RhbGUgTW9kaWZpZWQgZm9yIElTTyA5NjYwIGZpbGVzeXN0ZW0uCisgKgorICogIChDKSAxOTkxICBMaW51cyBUb3J2YWxkcyAtIG1pbml4IGZpbGVzeXN0ZW0KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXRmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgImFmZnMuaCIKKworZXh0ZXJuIHN0cnVjdCB0aW1lem9uZSBzeXNfdHo7CisKK3N0YXRpYyBpbnQgYWZmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1Zik7CitzdGF0aWMgaW50IGFmZnNfcmVtb3VudCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSk7CisKK3N0YXRpYyB2b2lkCithZmZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBhZmZzX3NiX2luZm8gKnNiaSA9IEFGRlNfU0Ioc2IpOworCXByX2RlYnVnKCJBRkZTOiBwdXRfc3VwZXIoKVxuIik7CisKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJQUZGU19ST09UX1RBSUwoc2IsIHNiaS0+c19yb290X2JoKS0+Ym1fZmxhZyA9IGNwdV90b19iZTMyKDEpOworCQlzZWNzX3RvX2RhdGVzdGFtcChnZXRfc2Vjb25kcygpLAorCQkJCSAgJkFGRlNfUk9PVF9UQUlMKHNiLCBzYmktPnNfcm9vdF9iaCktPmRpc2tfY2hhbmdlKTsKKwkJYWZmc19maXhfY2hlY2tzdW0oc2IsIHNiaS0+c19yb290X2JoKTsKKwkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX3Jvb3RfYmgpOworCX0KKworCWlmIChzYmktPnNfcHJlZml4KQorCQlrZnJlZShzYmktPnNfcHJlZml4KTsKKwlhZmZzX2ZyZWVfYml0bWFwKHNiKTsKKwlhZmZzX2JyZWxzZShzYmktPnNfcm9vdF9iaCk7CisJa2ZyZWUoc2JpKTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithZmZzX3dyaXRlX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaW50IGNsZWFuID0gMjsKKwlzdHJ1Y3QgYWZmc19zYl9pbmZvICpzYmkgPSBBRkZTX1NCKHNiKTsKKworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkvLwlpZiAoc2JpLT5zX2JpdG1hcFtpXS5ibV9iaCkgeworCQkvLwkJaWYgKGJ1ZmZlcl9kaXJ0eShzYmktPnNfYml0bWFwW2ldLmJtX2JoKSkgeworCQkvLwkJCWNsZWFuID0gMDsKKwkJQUZGU19ST09UX1RBSUwoc2IsIHNiaS0+c19yb290X2JoKS0+Ym1fZmxhZyA9IGNwdV90b19iZTMyKGNsZWFuKTsKKwkJc2Vjc190b19kYXRlc3RhbXAoZ2V0X3NlY29uZHMoKSwKKwkJCQkgICZBRkZTX1JPT1RfVEFJTChzYiwgc2JpLT5zX3Jvb3RfYmgpLT5kaXNrX2NoYW5nZSk7CisJCWFmZnNfZml4X2NoZWNrc3VtKHNiLCBzYmktPnNfcm9vdF9iaCk7CisJCW1hcmtfYnVmZmVyX2RpcnR5KHNiaS0+c19yb290X2JoKTsKKwkJc2ItPnNfZGlydCA9ICFjbGVhbjsJLyogcmVkbyB1bnRpbCBiaXRtYXAgc3luY2VkICovCisJfSBlbHNlCisJCXNiLT5zX2RpcnQgPSAwOworCisJcHJfZGVidWcoIkFGRlM6IHdyaXRlX3N1cGVyKCkgYXQgJWx1LCBjbGVhbj0lZFxuIiwgZ2V0X3NlY29uZHMoKSwgY2xlYW4pOworfQorCitzdGF0aWMga21lbV9jYWNoZV90ICogYWZmc19pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmFmZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgYWZmc19pbm9kZV9pbmZvICplaTsKKwllaSA9IChzdHJ1Y3QgYWZmc19pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhhZmZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghZWkpCisJCXJldHVybiBOVUxMOworCWVpLT52ZnNfaW5vZGUuaV92ZXJzaW9uID0gMTsKKwlyZXR1cm4gJmVpLT52ZnNfaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGFmZnNfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShhZmZzX2lub2RlX2NhY2hlcCwgQUZGU19JKGlub2RlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGFmZnNfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IGFmZnNfaW5vZGVfaW5mbyAqKSBmb287CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKSB7CisJCWluaXRfTVVURVgoJmVpLT5pX2xpbmtfbG9jayk7CisJCWluaXRfTVVURVgoJmVpLT5pX2V4dF9sb2NrKTsKKwkJaW5vZGVfaW5pdF9vbmNlKCZlaS0+dmZzX2lub2RlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpCit7CisJYWZmc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiYWZmc19pbm9kZV9jYWNoZSIsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBhZmZzX2lub2RlX2luZm8pLAorCQkJCQkgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKGFmZnNfaW5vZGVfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKK3sKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGFmZnNfaW5vZGVfY2FjaGVwKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYWZmc19pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgYWZmc19zb3BzID0geworCS5hbGxvY19pbm9kZQk9IGFmZnNfYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSBhZmZzX2Rlc3Ryb3lfaW5vZGUsCisJLnJlYWRfaW5vZGUJPSBhZmZzX3JlYWRfaW5vZGUsCisJLndyaXRlX2lub2RlCT0gYWZmc193cml0ZV9pbm9kZSwKKwkucHV0X2lub2RlCT0gYWZmc19wdXRfaW5vZGUsCisJLmRlbGV0ZV9pbm9kZQk9IGFmZnNfZGVsZXRlX2lub2RlLAorCS5jbGVhcl9pbm9kZQk9IGFmZnNfY2xlYXJfaW5vZGUsCisJLnB1dF9zdXBlcgk9IGFmZnNfcHV0X3N1cGVyLAorCS53cml0ZV9zdXBlcgk9IGFmZnNfd3JpdGVfc3VwZXIsCisJLnN0YXRmcwkJPSBhZmZzX3N0YXRmcywKKwkucmVtb3VudF9mcwk9IGFmZnNfcmVtb3VudCwKK307CisKK2VudW0geworCU9wdF9icywgT3B0X21vZGUsIE9wdF9tdWZzLCBPcHRfcHJlZml4LCBPcHRfcHJvdGVjdCwKKwlPcHRfcmVzZXJ2ZWQsIE9wdF9yb290LCBPcHRfc2V0Z2lkLCBPcHRfc2V0dWlkLAorCU9wdF92ZXJib3NlLCBPcHRfdm9sdW1lLCBPcHRfaWdub3JlLCBPcHRfZXJyLAorfTsKKworc3RhdGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0geworCXtPcHRfYnMsICJicz0ldSJ9LAorCXtPcHRfbW9kZSwgIm1vZGU9JW8ifSwKKwl7T3B0X211ZnMsICJtdWZzIn0sCisJe09wdF9wcmVmaXgsICJwcmVmaXg9JXMifSwKKwl7T3B0X3Byb3RlY3QsICJwcm90ZWN0In0sCisJe09wdF9yZXNlcnZlZCwgInJlc2VydmVkPSV1In0sCisJe09wdF9yb290LCAicm9vdD0ldSJ9LAorCXtPcHRfc2V0Z2lkLCAic2V0Z2lkPSV1In0sCisJe09wdF9zZXR1aWQsICJzZXR1aWQ9JXUifSwKKwl7T3B0X3ZlcmJvc2UsICJ2ZXJib3NlIn0sCisJe09wdF92b2x1bWUsICJ2b2x1bWU9JXMifSwKKwl7T3B0X2lnbm9yZSwgImdycHF1b3RhIn0sCisJe09wdF9pZ25vcmUsICJub3F1b3RhIn0sCisJe09wdF9pZ25vcmUsICJxdW90YSJ9LAorCXtPcHRfaWdub3JlLCAidXNycXVvdGEifSwKKwl7T3B0X2VyciwgTlVMTH0sCit9OworCitzdGF0aWMgaW50CitwYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIHVpZF90ICp1aWQsIGdpZF90ICpnaWQsIGludCAqbW9kZSwgaW50ICpyZXNlcnZlZCwgczMyICpyb290LAorCQlpbnQgKmJsb2Nrc2l6ZSwgY2hhciAqKnByZWZpeCwgY2hhciAqdm9sdW1lLCB1bnNpZ25lZCBsb25nICptb3VudF9vcHRzKQoreworCWNoYXIgKnA7CisJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCisJLyogRmlsbCBpbiBkZWZhdWx0cyAqLworCisJKnVpZCAgICAgICAgPSBjdXJyZW50LT51aWQ7CisJKmdpZCAgICAgICAgPSBjdXJyZW50LT5naWQ7CisJKnJlc2VydmVkICAgPSAyOworCSpyb290ICAgICAgID0gLTE7CisJKmJsb2Nrc2l6ZSAgPSAtMTsKKwl2b2x1bWVbMF0gICA9ICc6JzsKKwl2b2x1bWVbMV0gICA9IDA7CisJKm1vdW50X29wdHMgPSAwOworCWlmICghb3B0aW9ucykKKwkJcmV0dXJuIDE7CisKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJaW50IHRva2VuLCBuLCBvcHRpb247CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJY2FzZSBPcHRfYnM6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmbikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAobiAhPSA1MTIgJiYgbiAhPSAxMDI0ICYmIG4gIT0gMjA0OAorCQkJICAgICYmIG4gIT0gNDA5NikgeworCQkJCXByaW50ayAoIkFGRlM6IEludmFsaWQgYmxvY2tzaXplICg1MTIsIDEwMjQsIDIwNDgsIDQwOTYgYWxsb3dlZClcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJKmJsb2Nrc2l6ZSA9IG47CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbW9kZToKKwkJCWlmIChtYXRjaF9vY3RhbCgmYXJnc1swXSwgJm9wdGlvbikpCisJCQkJcmV0dXJuIDE7CisJCQkqbW9kZSA9IG9wdGlvbiAmIDA3Nzc7CisJCQkqbW91bnRfb3B0cyB8PSBTRl9TRVRNT0RFOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X211ZnM6CisJCQkqbW91bnRfb3B0cyB8PSBTRl9NVUZTOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3ByZWZpeDoKKwkJCWlmICgqcHJlZml4KSB7CQkvKiBGcmVlIGFueSBwcmV2aW91cyBwcmVmaXggKi8KKwkJCQlrZnJlZSgqcHJlZml4KTsKKwkJCQkqcHJlZml4ID0gTlVMTDsKKwkJCX0KKwkJCSpwcmVmaXggPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMF0pOworCQkJaWYgKCEqcHJlZml4KQorCQkJCXJldHVybiAwOworCQkJKm1vdW50X29wdHMgfD0gU0ZfUFJFRklYOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3Byb3RlY3Q6CisJCQkqbW91bnRfb3B0cyB8PSBTRl9JTU1VVEFCTEU7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfcmVzZXJ2ZWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCByZXNlcnZlZCkpCisJCQkJcmV0dXJuIDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfcm9vdDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sIHJvb3QpKQorCQkJCXJldHVybiAxOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3NldGdpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAxOworCQkJKmdpZCA9IG9wdGlvbjsKKwkJCSptb3VudF9vcHRzIHw9IFNGX1NFVEdJRDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9zZXR1aWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCSp1aWQgPSBvcHRpb247CisJCQkqbW91bnRfb3B0cyB8PSBTRl9TRVRVSUQ7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfdmVyYm9zZToKKwkJCSptb3VudF9vcHRzIHw9IFNGX1ZFUkJPU0U7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfdm9sdW1lOiB7CisJCQljaGFyICp2b2wgPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMF0pOworCQkJc3RybGNweSh2b2x1bWUsIHZvbCwgMzIpOworCQkJa2ZyZWUodm9sKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgT3B0X2lnbm9yZToKKwkJIAkvKiBTaWxlbnRseSBpZ25vcmUgdGhlIHF1b3RhIG9wdGlvbnMgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJBRkZTOiBVbnJlY29nbml6ZWQgbW91bnQgb3B0aW9uIFwiJXNcIiAiCisJCQkJCSJvciBtaXNzaW5nIHZhbHVlXG4iLCBwKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGRlZmluaXRlbHkgbmVlZHMgdG8gYmUgc3BsaXQgdXAuIFNvbWUgZmluZSBkYXkgSSdsbAorICogaG9wZWZ1bGx5IGhhdmUgdGhlIGd1dHMgdG8gZG8gc28uIFVudGlsIHRoZW46IHNvcnJ5IGZvciB0aGUgbWVzcy4KKyAqLworCitzdGF0aWMgaW50IGFmZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBhZmZzX3NiX2luZm8JKnNiaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKnJvb3RfYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZAkqYm9vdF9iaDsKKwlzdHJ1Y3QgaW5vZGUJCSpyb290X2lub2RlID0gTlVMTDsKKwlzMzIJCQkgcm9vdF9ibG9jazsKKwlpbnQJCQkgc2l6ZSwgYmxvY2tzaXplOworCXUzMgkJCSBjaGtzdW07CisJaW50CQkJIG51bV9ibTsKKwlpbnQJCQkgaSwgajsKKwlzMzIJCQkga2V5OworCXVpZF90CQkJIHVpZDsKKwlnaWRfdAkJCSBnaWQ7CisJaW50CQkJIHJlc2VydmVkOworCXVuc2lnbmVkIGxvbmcJCSBtb3VudF9mbGFnczsKKwlpbnQJCQkgdG1wX2ZsYWdzOwkvKiBmaXggcmVtb3VudCBwcm90b3R5cGUuLi4gKi8KKworCXByX2RlYnVnKCJBRkZTOiByZWFkX3N1cGVyKCVzKVxuIixkYXRhID8gKGNvbnN0IGNoYXIgKilkYXRhIDogIm5vIG9wdGlvbnMiKTsKKworCXNiLT5zX21hZ2ljICAgICAgICAgICAgID0gQUZGU19TVVBFUl9NQUdJQzsKKwlzYi0+c19vcCAgICAgICAgICAgICAgICA9ICZhZmZzX3NvcHM7CisJc2ItPnNfZmxhZ3MgfD0gTVNfTk9ESVJBVElNRTsKKworCXNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZmZzX3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNiaSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2ItPnNfZnNfaW5mbyA9IHNiaTsKKwltZW1zZXQoc2JpLCAwLCBzaXplb2YoKnNiaSkpOworCWluaXRfTVVURVgoJnNiaS0+c19ibWxvY2spOworCisJaWYgKCFwYXJzZV9vcHRpb25zKGRhdGEsJnVpZCwmZ2lkLCZpLCZyZXNlcnZlZCwmcm9vdF9ibG9jaywKKwkJCQkmYmxvY2tzaXplLCZzYmktPnNfcHJlZml4LAorCQkJCXNiaS0+c192b2x1bWUsICZtb3VudF9mbGFncykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJBRkZTOiBFcnJvciBwYXJzaW5nIG9wdGlvbnNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogTi5CLiBhZnRlciB0aGlzIHBvaW50IHNfcHJlZml4IG11c3QgYmUgcmVsZWFzZWQgKi8KKworCXNiaS0+c19mbGFncyAgID0gbW91bnRfZmxhZ3M7CisJc2JpLT5zX21vZGUgICAgPSBpOworCXNiaS0+c191aWQgICAgID0gdWlkOworCXNiaS0+c19naWQgICAgID0gZ2lkOworCXNiaS0+c19yZXNlcnZlZD0gcmVzZXJ2ZWQ7CisKKwkvKiBHZXQgdGhlIHNpemUgb2YgdGhlIGRldmljZSBpbiA1MTItYnl0ZSBibG9ja3MuCisJICogSWYgd2UgbGF0ZXIgc2VlIHRoYXQgdGhlIHBhcnRpdGlvbiB1c2VzIGJpZ2dlcgorCSAqIGJsb2Nrcywgd2Ugd2lsbCBoYXZlIHRvIGNoYW5nZSBpdC4KKwkgKi8KKworCXNpemUgPSBzYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9zaXplID4+IDk7CisJcHJfZGVidWcoIkFGRlM6IGluaXRpYWwgYmxvY2tzaXplPSVkLCAjYmxvY2tzPSVkXG4iLCA1MTIsIHNpemUpOworCisJYWZmc19zZXRfYmxvY2tzaXplKHNiLCBQQUdFX1NJWkUpOworCS8qIFRyeSB0byBmaW5kIHJvb3QgYmxvY2suIEl0cyBsb2NhdGlvbiBkZXBlbmRzIG9uIHRoZSBibG9jayBzaXplLiAqLworCisJaSA9IDUxMjsKKwlqID0gNDA5NjsKKwlpZiAoYmxvY2tzaXplID4gMCkgeworCQlpID0gaiA9IGJsb2Nrc2l6ZTsKKwkJc2l6ZSA9IHNpemUgLyAoYmxvY2tzaXplIC8gNTEyKTsKKwl9CisJZm9yIChibG9ja3NpemUgPSBpLCBrZXkgPSAwOyBibG9ja3NpemUgPD0gajsgYmxvY2tzaXplIDw8PSAxLCBzaXplID4+PSAxKSB7CisJCXNiaS0+c19yb290X2Jsb2NrID0gcm9vdF9ibG9jazsKKwkJaWYgKHJvb3RfYmxvY2sgPCAwKQorCQkJc2JpLT5zX3Jvb3RfYmxvY2sgPSAocmVzZXJ2ZWQgKyBzaXplIC0gMSkgLyAyOworCQlwcl9kZWJ1ZygiQUZGUzogc2V0dGluZyBibG9ja3NpemUgdG8gJWRcbiIsIGJsb2Nrc2l6ZSk7CisJCWFmZnNfc2V0X2Jsb2Nrc2l6ZShzYiwgYmxvY2tzaXplKTsKKwkJc2JpLT5zX3BhcnRpdGlvbl9zaXplID0gc2l6ZTsKKworCQkvKiBUaGUgcm9vdCBibG9jayBsb2NhdGlvbiB0aGF0IHdhcyBjYWxjdWxhdGVkIGFib3ZlIGlzIG5vdAorCQkgKiBjb3JyZWN0IGlmIHRoZSBwYXJ0aXRpb24gc2l6ZSBpcyBhbiBvZGQgbnVtYmVyIG9mIDUxMi0KKwkJICogYnl0ZSBibG9ja3MsIHdoaWNoIHdpbGwgYmUgcm91bmRlZCBkb3duIHRvIGEgbnVtYmVyIG9mCisJCSAqIDEwMjQtYnl0ZSBibG9ja3MsIGFuZCBpZiB0aGVyZSB3ZXJlIGFuIGV2ZW4gbnVtYmVyIG9mCisJCSAqIHJlc2VydmVkIGJsb2Nrcy4gSWRlYWxseSwgYWxsIHBhcnRpdGlvbiBjaGVja2VycyBzaG91bGQKKwkJICogcmVwb3J0IHRoZSByZWFsIG51bWJlciBvZiBibG9ja3Mgb2YgdGhlIHJlYWwgYmxvY2tzaXplLAorCQkgKiBidXQgc2luY2UgdGhpcyBqdXN0IGNhbm5vdCBiZSBkb25lLCB3ZSBoYXZlIHRvIHRyeSB0bworCQkgKiBmaW5kIHRoZSByb290IGJsb2NrIGFueXdheXMuIEluIHRoZSBhYm92ZSBjYXNlLCBpdCBpcyBvbmUKKwkJICogYmxvY2sgYmVoaW5kIHRoZSBjYWxjdWxhdGVkIG9uZS4gU28gd2UgY2hlY2sgdGhpcyBvbmUsIHRvby4KKwkJICovCisJCWZvciAobnVtX2JtID0gMDsgbnVtX2JtIDwgMjsgbnVtX2JtKyspIHsKKwkJCXByX2RlYnVnKCJBRkZTOiBEZXYgJXMsIHRyeWluZyByb290PSV1LCBicz0lZCwgIgorCQkJCSJzaXplPSVkLCByZXNlcnZlZD0lZFxuIiwKKwkJCQlzYi0+c19pZCwKKwkJCQlzYmktPnNfcm9vdF9ibG9jayArIG51bV9ibSwKKwkJCQlibG9ja3NpemUsIHNpemUsIHJlc2VydmVkKTsKKwkJCXJvb3RfYmggPSBhZmZzX2JyZWFkKHNiLCBzYmktPnNfcm9vdF9ibG9jayArIG51bV9ibSk7CisJCQlpZiAoIXJvb3RfYmgpCisJCQkJY29udGludWU7CisJCQlpZiAoIWFmZnNfY2hlY2tzdW1fYmxvY2soc2IsIHJvb3RfYmgpICYmCisJCQkgICAgYmUzMl90b19jcHUoQUZGU19ST09UX0hFQUQocm9vdF9iaCktPnB0eXBlKSA9PSBUX1NIT1JUICYmCisJCQkgICAgYmUzMl90b19jcHUoQUZGU19ST09UX1RBSUwoc2IsIHJvb3RfYmgpLT5zdHlwZSkgPT0gU1RfUk9PVCkgeworCQkJCXNiaS0+c19oYXNoc2l6ZSAgICA9IGJsb2Nrc2l6ZSAvIDQgLSA1NjsKKwkJCQlzYmktPnNfcm9vdF9ibG9jayArPSBudW1fYm07CisJCQkJa2V5ICAgICAgICAgICAgICAgICAgICAgICAgPSAxOworCQkJCWdvdG8gZ290X3Jvb3Q7CisJCQl9CisJCQlhZmZzX2JyZWxzZShyb290X2JoKTsKKwkJCXJvb3RfYmggPSBOVUxMOworCQl9CisJfQorCWlmICghc2lsZW50KQorCQlwcmludGsoS0VSTl9FUlIgIkFGRlM6IE5vIHZhbGlkIHJvb3QgYmxvY2sgb24gZGV2aWNlICVzXG4iLAorCQkJc2ItPnNfaWQpOworCWdvdG8gb3V0X2Vycm9yOworCisJLyogTi5CLiBhZnRlciB0aGlzIHBvaW50IGJoIG11c3QgYmUgcmVsZWFzZWQgKi8KK2dvdF9yb290OgorCXJvb3RfYmxvY2sgPSBzYmktPnNfcm9vdF9ibG9jazsKKworCS8qIEZpbmQgb3V0IHdoaWNoIGtpbmQgb2YgRlMgd2UgaGF2ZSAqLworCWJvb3RfYmggPSBzYl9icmVhZChzYiwgMCk7CisJaWYgKCFib290X2JoKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQUZGUzogQ2Fubm90IHJlYWQgYm9vdCBibG9ja1xuIik7CisJCWdvdG8gb3V0X2Vycm9yOworCX0KKwljaGtzdW0gPSBiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKWJvb3RfYmgtPmJfZGF0YSk7CisJYnJlbHNlKGJvb3RfYmgpOworCisJLyogRGlyY2FjaGUgZmlsZXN5c3RlbXMgYXJlIGNvbXBhdGlibGUgd2l0aCBub24tZGlyY2FjaGUgb25lcworCSAqIHdoZW4gcmVhZGluZy4gQXMgbG9uZyBhcyB0aGV5IGFyZW4ndCBzdXBwb3J0ZWQsIHdyaXRpbmcgaXMKKwkgKiBub3QgcmVjb21tZW5kZWQuCisJICovCisJaWYgKChjaGtzdW0gPT0gRlNfRENGRlMgfHwgY2hrc3VtID09IE1VRlNfRENGRlMgfHwgY2hrc3VtID09IEZTX0RDT0ZTCisJICAgICB8fCBjaGtzdW0gPT0gTVVGU19EQ09GUykgJiYgIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJBRkZTOiBEaXJjYWNoZSBGUyAtIG1vdW50aW5nICVzIHJlYWQgb25seVxuIiwKKwkJCXNiLT5zX2lkKTsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCX0KKwlzd2l0Y2ggKGNoa3N1bSkgeworCQljYXNlIE1VRlNfRlM6CisJCWNhc2UgTVVGU19JTlRMRkZTOgorCQljYXNlIE1VRlNfRENGRlM6CisJCQlzYmktPnNfZmxhZ3MgfD0gU0ZfTVVGUzsKKwkJCS8qIGZhbGwgdGhydSAqLworCQljYXNlIEZTX0lOVExGRlM6CisJCWNhc2UgRlNfRENGRlM6CisJCQlzYmktPnNfZmxhZ3MgfD0gU0ZfSU5UTDsKKwkJCWJyZWFrOworCQljYXNlIE1VRlNfRkZTOgorCQkJc2JpLT5zX2ZsYWdzIHw9IFNGX01VRlM7CisJCQlicmVhazsKKwkJY2FzZSBGU19GRlM6CisJCQlicmVhazsKKwkJY2FzZSBNVUZTX09GUzoKKwkJCXNiaS0+c19mbGFncyB8PSBTRl9NVUZTOworCQkJLyogZmFsbCB0aHJ1ICovCisJCWNhc2UgRlNfT0ZTOgorCQkJc2JpLT5zX2ZsYWdzIHw9IFNGX09GUzsKKwkJCXNiLT5zX2ZsYWdzIHw9IE1TX05PRVhFQzsKKwkJCWJyZWFrOworCQljYXNlIE1VRlNfRENPRlM6CisJCWNhc2UgTVVGU19JTlRMT0ZTOgorCQkJc2JpLT5zX2ZsYWdzIHw9IFNGX01VRlM7CisJCWNhc2UgRlNfRENPRlM6CisJCWNhc2UgRlNfSU5UTE9GUzoKKwkJCXNiaS0+c19mbGFncyB8PSBTRl9JTlRMIHwgU0ZfT0ZTOworCQkJc2ItPnNfZmxhZ3MgfD0gTVNfTk9FWEVDOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgIkFGRlM6IFVua25vd24gZmlsZXN5c3RlbSBvbiBkZXZpY2UgJXM6ICUwOFhcbiIsCisJCQkJc2ItPnNfaWQsIGNoa3N1bSk7CisJCQlnb3RvIG91dF9lcnJvcjsKKwl9CisKKwlpZiAobW91bnRfZmxhZ3MgJiBTRl9WRVJCT1NFKSB7CisJCWNoa3N1bSA9IGNwdV90b19iZTMyKGNoa3N1bSk7CisJCXByaW50ayhLRVJOX05PVElDRSAiQUZGUzogTW91bnRpbmcgdm9sdW1lIFwiJSpzXCI6IFR5cGU9JS4zc1xcJWMsIEJsb2Nrc2l6ZT0lZFxuIiwKKwkJCUFGRlNfUk9PVF9UQUlMKHNiLCByb290X2JoKS0+ZGlza19uYW1lWzBdLAorCQkJQUZGU19ST09UX1RBSUwoc2IsIHJvb3RfYmgpLT5kaXNrX25hbWUgKyAxLAorCQkJKGNoYXIgKikmY2hrc3VtLCgoY2hhciAqKSZjaGtzdW0pWzNdICsgJzAnLGJsb2Nrc2l6ZSk7CisJfQorCisJc2ItPnNfZmxhZ3MgfD0gTVNfTk9ERVYgfCBNU19OT1NVSUQ7CisKKwlzYmktPnNfZGF0YV9ibGtzaXplID0gc2ItPnNfYmxvY2tzaXplOworCWlmIChzYmktPnNfZmxhZ3MgJiBTRl9PRlMpCisJCXNiaS0+c19kYXRhX2Jsa3NpemUgLT0gMjQ7CisKKwkvKiBLZWVwIHN1cGVyIGJsb2NrIGluIGNhY2hlICovCisJc2JpLT5zX3Jvb3RfYmggPSByb290X2JoOworCS8qIE4uQi4gYWZ0ZXIgdGhpcyBwb2ludCBzX3Jvb3RfYmggbXVzdCBiZSByZWxlYXNlZCAqLworCisJdG1wX2ZsYWdzID0gc2ItPnNfZmxhZ3M7CisJaWYgKGFmZnNfaW5pdF9iaXRtYXAoc2IsICZ0bXBfZmxhZ3MpKQorCQlnb3RvIG91dF9lcnJvcjsKKwlzYi0+c19mbGFncyA9IHRtcF9mbGFnczsKKworCS8qIHNldCB1cCBlbm91Z2ggc28gdGhhdCBpdCBjYW4gcmVhZCBhbiBpbm9kZSAqLworCisJcm9vdF9pbm9kZSA9IGlnZXQoc2IsIHJvb3RfYmxvY2spOworCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdF9pbm9kZSk7CisJaWYgKCFzYi0+c19yb290KSB7CisJCXByaW50ayhLRVJOX0VSUiAiQUZGUzogR2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKKwkJZ290byBvdXRfZXJyb3I7CisJfQorCXNiLT5zX3Jvb3QtPmRfb3AgPSAmYWZmc19kZW50cnlfb3BlcmF0aW9uczsKKworCXByX2RlYnVnKCJBRkZTOiBzX2ZsYWdzPSVsWFxuIixzYi0+c19mbGFncyk7CisJcmV0dXJuIDA7CisKKwkvKgorCSAqIEJlZ2luIHRoZSBjYXNjYWRlZCBjbGVhbnVwIC4uLgorCSAqLworb3V0X2Vycm9yOgorCWlmIChyb290X2lub2RlKQorCQlpcHV0KHJvb3RfaW5vZGUpOworCWlmIChzYmktPnNfYml0bWFwKQorCQlrZnJlZShzYmktPnNfYml0bWFwKTsKKwlhZmZzX2JyZWxzZShyb290X2JoKTsKKwlpZiAoc2JpLT5zX3ByZWZpeCkKKwkJa2ZyZWUoc2JpLT5zX3ByZWZpeCk7CisJa2ZyZWUoc2JpKTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludAorYWZmc19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IGFmZnNfc2JfaW5mbwkqc2JpID0gQUZGU19TQihzYik7CisJaW50CQkJIGJsb2Nrc2l6ZTsKKwl1aWRfdAkJCSB1aWQ7CisJZ2lkX3QJCQkgZ2lkOworCWludAkJCSBtb2RlOworCWludAkJCSByZXNlcnZlZDsKKwlpbnQJCQkgcm9vdF9ibG9jazsKKwl1bnNpZ25lZCBsb25nCQkgbW91bnRfZmxhZ3M7CisJaW50CQkJIHJlcyA9IDA7CisKKwlwcl9kZWJ1ZygiQUZGUzogcmVtb3VudChmbGFncz0weCV4LG9wdHM9XCIlc1wiKVxuIiwqZmxhZ3MsZGF0YSk7CisKKwkqZmxhZ3MgfD0gTVNfTk9ESVJBVElNRTsKKworCWlmICghcGFyc2Vfb3B0aW9ucyhkYXRhLCZ1aWQsJmdpZCwmbW9kZSwmcmVzZXJ2ZWQsJnJvb3RfYmxvY2ssCisJICAgICZibG9ja3NpemUsJnNiaS0+c19wcmVmaXgsc2JpLT5zX3ZvbHVtZSwmbW91bnRfZmxhZ3MpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzYmktPnNfZmxhZ3MgPSBtb3VudF9mbGFnczsKKwlzYmktPnNfbW9kZSAgPSBtb2RlOworCXNiaS0+c191aWQgICA9IHVpZDsKKwlzYmktPnNfZ2lkICAgPSBnaWQ7CisKKwlpZiAoKCpmbGFncyAmIE1TX1JET05MWSkgPT0gKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKwkJcmV0dXJuIDA7CisJaWYgKCpmbGFncyAmIE1TX1JET05MWSkgeworCQlzYi0+c19kaXJ0ID0gMTsKKwkJd2hpbGUgKHNiLT5zX2RpcnQpCisJCQlhZmZzX3dyaXRlX3N1cGVyKHNiKTsKKwkJYWZmc19mcmVlX2JpdG1hcChzYik7CisJfSBlbHNlCisJCXJlcyA9IGFmZnNfaW5pdF9iaXRtYXAoc2IsIGZsYWdzKTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQKK2FmZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCit7CisJaW50CQkgZnJlZTsKKworCXByX2RlYnVnKCJBRkZTOiBzdGF0ZnMoKSBwYXJ0c2l6ZT0lZCwgcmVzZXJ2ZWQ9JWRcbiIsQUZGU19TQihzYiktPnNfcGFydGl0aW9uX3NpemUsCisJICAgICBBRkZTX1NCKHNiKS0+c19yZXNlcnZlZCk7CisKKwlmcmVlICAgICAgICAgID0gYWZmc19jb3VudF9mcmVlX2Jsb2NrcyhzYik7CisJYnVmLT5mX3R5cGUgICAgPSBBRkZTX1NVUEVSX01BR0lDOworCWJ1Zi0+Zl9ic2l6ZSAgID0gc2ItPnNfYmxvY2tzaXplOworCWJ1Zi0+Zl9ibG9ja3MgID0gQUZGU19TQihzYiktPnNfcGFydGl0aW9uX3NpemUgLSBBRkZTX1NCKHNiKS0+c19yZXNlcnZlZDsKKwlidWYtPmZfYmZyZWUgICA9IGZyZWU7CisJYnVmLT5mX2JhdmFpbCAgPSBmcmVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICphZmZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGFmZnNfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBhZmZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJhZmZzIiwKKwkuZ2V0X3NiCQk9IGFmZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2FmZnNfZnModm9pZCkKK3sKKwlpbnQgZXJyID0gaW5pdF9pbm9kZWNhY2hlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmFmZnNfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJcmV0dXJuIDA7CitvdXQ6CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CitvdXQxOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2FmZnNfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmFmZnNfZnNfdHlwZSk7CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7Cit9CisKK01PRFVMRV9ERVNDUklQVElPTigiQW1pZ2EgZmlsZXN5c3RlbSBzdXBwb3J0IGZvciBMaW51eCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChpbml0X2FmZnNfZnMpCittb2R1bGVfZXhpdChleGl0X2FmZnNfZnMpCmRpZmYgLS1naXQgYS9mcy9hZmZzL3N5bWxpbmsuYyBiL2ZzL2FmZnMvc3ltbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNmYwZjAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZmZzL3N5bWxpbmsuYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogIGxpbnV4L2ZzL2FmZnMvc3ltbGluay5jCisgKgorICogIDE5OTUgIEhhbnMtSm9hY2hpbSBXaWRtYWllciAtIE1vZGlmaWVkIGZvciBhZmZzLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIGFmZnMgc3ltbGluayBoYW5kbGluZyBjb2RlCisgKi8KKworI2luY2x1ZGUgImFmZnMuaCIKKworc3RhdGljIGludCBhZmZzX3N5bWxpbmtfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJY2hhciAqbGluayA9IGttYXAocGFnZSk7CisJc3RydWN0IHNsaW5rX2Zyb250ICpsZjsKKwlpbnQgZXJyOworCWludAkJCSBpLCBqOworCWNoYXIJCQkgYzsKKwljaGFyCQkJIGxjOworCWNoYXIJCQkqcGY7CisKKwlwcl9kZWJ1ZygiQUZGUzogZm9sbG93X2xpbmsoaW5vPSVsdSlcbiIsaW5vZGUtPmlfaW5vKTsKKworCWVyciA9IC1FSU87CisJYmggPSBhZmZzX2JyZWFkKGlub2RlLT5pX3NiLCBpbm9kZS0+aV9pbm8pOworCWlmICghYmgpCisJCWdvdG8gZmFpbDsKKwlpICA9IDA7CisJaiAgPSAwOworCWxmID0gKHN0cnVjdCBzbGlua19mcm9udCAqKWJoLT5iX2RhdGE7CisJbGMgPSAwOworCXBmID0gQUZGU19TQihpbm9kZS0+aV9zYiktPnNfcHJlZml4ID8gQUZGU19TQihpbm9kZS0+aV9zYiktPnNfcHJlZml4IDogIi8iOworCisJaWYgKHN0cmNocihsZi0+c3ltbmFtZSwnOicpKSB7CS8qIEhhbmRsZSBhc3NpZ24gb3Igdm9sdW1lIG5hbWUgKi8KKwkJd2hpbGUgKGkgPCAxMDIzICYmIChjID0gcGZbaV0pKQorCQkJbGlua1tpKytdID0gYzsKKwkJd2hpbGUgKGkgPCAxMDIzICYmIGxmLT5zeW1uYW1lW2pdICE9ICc6JykKKwkJCWxpbmtbaSsrXSA9IGxmLT5zeW1uYW1lW2orK107CisJCWlmIChpIDwgMTAyMykKKwkJCWxpbmtbaSsrXSA9ICcvJzsKKwkJaisrOworCQlsYyA9ICcvJzsKKwl9CisJd2hpbGUgKGkgPCAxMDIzICYmIChjID0gbGYtPnN5bW5hbWVbal0pKSB7CisJCWlmIChjID09ICcvJyAmJiBsYyA9PSAnLycgJiYgaSA8IDEwMjApIHsJLyogcGFyZW50IGRpciAqLworCQkJbGlua1tpKytdID0gJy4nOworCQkJbGlua1tpKytdID0gJy4nOworCQl9CisJCWxpbmtbaSsrXSA9IGM7CisJCWxjID0gYzsKKwkJaisrOworCX0KKwlsaW5rW2ldID0gJ1wwJzsKKwlhZmZzX2JyZWxzZShiaCk7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKK2ZhaWw6CisJU2V0UGFnZUVycm9yKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGFmZnNfc3ltbGlua19hb3BzID0geworCS5yZWFkcGFnZQk9IGFmZnNfc3ltbGlua19yZWFkcGFnZSwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zID0geworCS5yZWFkbGluawk9IGdlbmVyaWNfcmVhZGxpbmssCisJLmZvbGxvd19saW5rCT0gcGFnZV9mb2xsb3dfbGlua19saWdodCwKKwkucHV0X2xpbmsJPSBwYWdlX3B1dF9saW5rLAorCS5zZXRhdHRyCT0gYWZmc19ub3RpZnlfY2hhbmdlLAorfTsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9NYWtlZmlsZSBiL2ZzL2Fmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDI5YzlkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL01ha2VmaWxlCkBAIC0wLDAgKzEsMjggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIFJlZCBIYXQgTGludXggQUZTIGNsaWVudC4KKyMKKworI0NGTEFHUyArPSAtZmluc3RydW1lbnQtZnVuY3Rpb25zCisKK2thZnMtb2JqcyA6PSBcCisJY2FsbGJhY2subyBcCisJY2VsbC5vIFwKKwljbXNlcnZpY2UubyBcCisJZGlyLm8gXAorCWZpbGUubyBcCisJZnNjbGllbnQubyBcCisJaW5vZGUubyBcCisJa2Fmc2FzeW5jZC5vIFwKKwlrYWZzdGltb2QubyBcCisJbWFpbi5vIFwKKwltaXNjLm8gXAorCW1udHB0Lm8gXAorCXByb2MubyBcCisJc2VydmVyLm8gXAorCXN1cGVyLm8gXAorCXZsY2xpZW50Lm8gXAorCXZsb2NhdGlvbi5vIFwKKwl2bm9kZS5vIFwKKwl2b2x1bWUubworCitvYmotJChDT05GSUdfQUZTX0ZTKSAgOj0ga2Fmcy5vCmRpZmYgLS1naXQgYS9mcy9hZnMvY2FjaGUuaCBiL2ZzL2Fmcy9jYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYjc3MjIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvY2FjaGUuaApAQCAtMCwwICsxLDI3IEBACisvKiBjYWNoZS5oOiBBRlMgbG9jYWwgY2FjaGUgbWFuYWdlbWVudCBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfQUZTX0NBQ0hFX0gKKyNkZWZpbmUgX0xJTlVYX0FGU19DQUNIRV9ICisKKyN1bmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKyNpbmNsdWRlIDxsaW51eC9jYWNoZWZzLmg+CisjZW5kaWYKKyNpbmNsdWRlICJ0eXBlcy5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX0xJTlVYX0FGU19DQUNIRV9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvY2FsbGJhY2suYyBiL2ZzL2Fmcy9jYWxsYmFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZDYyZjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvY2FsbGJhY2suYwpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBBdXRob3JzOiBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGNhbWJyaWRnZS5yZWRoYXQuY29tPgorICogICAgICAgICAgRGF2aWQgSG93ZWxscyA8ZGhvd2VsbHNAcmVkaGF0LmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlICJzZXJ2ZXIuaCIKKyNpbmNsdWRlICJ2bm9kZS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBhbGxvdyB0aGUgZmlsZXNlcnZlciB0byByZXF1ZXN0IGNhbGxiYWNrIHN0YXRlIChyZS0paW5pdGlhbGlzYXRpb24KKyAqLworaW50IFNSWEFGU0NNX0luaXRDYWxsQmFja1N0YXRlKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIpCit7CisJc3RydWN0IGxpc3RfaGVhZCBjYWxsYmFja3M7CisKKwlfZW50ZXIoIiVwIiwgc2VydmVyKTsKKworCUlOSVRfTElTVF9IRUFEKCZjYWxsYmFja3MpOworCisJLyogdHJhbnNmZXIgdGhlIGNhbGxiYWNrIGxpc3QgZnJvbSB0aGUgc2VydmVyIHRvIGEgdGVtcCBob2xkaW5nIGFyZWEgKi8KKwlzcGluX2xvY2soJnNlcnZlci0+Y2JfbG9jayk7CisKKwlsaXN0X2FkZCgmY2FsbGJhY2tzLCAmc2VydmVyLT5jYl9wcm9taXNlcyk7CisJbGlzdF9kZWxfaW5pdCgmc2VydmVyLT5jYl9wcm9taXNlcyk7CisKKwkvKiBtdW5jaCBvdXIgd2F5IHRocm91Z2ggdGhlIGxpc3QsIGdyYWJiaW5nIHRoZSBpbm9kZSwgZHJvcHBpbmcgYWxsIHRoZQorCSAqIGxvY2tzIGFuZCByZWdldHRpbmcgdGhlbSBpbiB0aGUgcmlnaHQgb3JkZXIKKwkgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmNhbGxiYWNrcykpIHsKKwkJc3RydWN0IGFmc192bm9kZSAqdm5vZGU7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwkJdm5vZGUgPSBsaXN0X2VudHJ5KGNhbGxiYWNrcy5uZXh0LCBzdHJ1Y3QgYWZzX3Zub2RlLCBjYl9saW5rKTsKKwkJbGlzdF9kZWxfaW5pdCgmdm5vZGUtPmNiX2xpbmspOworCisJCS8qIHRyeSBhbmQgZ3JhYiB0aGUgaW5vZGUgLSBtYXkgZmFpbCAqLworCQlpbm9kZSA9IGlncmFiKEFGU19WTk9ERV9UT19JKHZub2RlKSk7CisJCWlmIChpbm9kZSkgeworCQkJaW50IHJlbGVhc2UgPSAwOworCisJCQlzcGluX3VubG9jaygmc2VydmVyLT5jYl9sb2NrKTsKKwkJCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCisJCQlpZiAodm5vZGUtPmNiX3NlcnZlciA9PSBzZXJ2ZXIpIHsKKwkJCQl2bm9kZS0+Y2Jfc2VydmVyID0gTlVMTDsKKwkJCQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmdm5vZGUtPmNiX3RpbWVvdXQpOworCQkJCXNwaW5fbG9jaygmYWZzX2NiX2hhc2hfbG9jayk7CisJCQkJbGlzdF9kZWxfaW5pdCgmdm5vZGUtPmNiX2hhc2hfbGluayk7CisJCQkJc3Bpbl91bmxvY2soJmFmc19jYl9oYXNoX2xvY2spOworCQkJCXJlbGVhc2UgPSAxOworCQkJfQorCisJCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJCQlpcHV0KGlub2RlKTsKKwkJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisKKwkJCXNwaW5fbG9jaygmc2VydmVyLT5jYl9sb2NrKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOworCisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7Cit9IC8qIGVuZCBTUlhBRlNDTV9Jbml0Q2FsbEJhY2tTdGF0ZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBhbGxvdyB0aGUgZmlsZXNlcnZlciB0byBicmVhayBjYWxsYmFjayBwcm9taXNlcworICovCitpbnQgU1JYQUZTQ01fQ2FsbEJhY2soc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwgc2l6ZV90IGNvdW50LAorCQkgICAgICBzdHJ1Y3QgYWZzX2NhbGxiYWNrIGNhbGxiYWNrc1tdKQoreworCV9lbnRlcigiJXAsJXUsIiwgc2VydmVyLCBjb3VudCk7CisKKwlmb3IgKDsgY291bnQgPiAwOyBjYWxsYmFja3MrKywgY291bnQtLSkgeworCQlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IE5VTEw7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCQlpbnQgdmFsaWQgPSAwOworCisJCV9kZWJ1ZygiLSBGaWQgeyB2bD0lMDh4IG49JXUgdT0ldSB9ICBDQiB7IHY9JXUgeD0ldSB0PSV1IH0iLAorCQkgICAgICAgY2FsbGJhY2tzLT5maWQudmlkLAorCQkgICAgICAgY2FsbGJhY2tzLT5maWQudm5vZGUsCisJCSAgICAgICBjYWxsYmFja3MtPmZpZC51bmlxdWUsCisJCSAgICAgICBjYWxsYmFja3MtPnZlcnNpb24sCisJCSAgICAgICBjYWxsYmFja3MtPmV4cGlyeSwKKwkJICAgICAgIGNhbGxiYWNrcy0+dHlwZQorCQkgICAgICAgKTsKKworCQkvKiBmaW5kIHRoZSBpbm9kZSBmb3IgdGhpcyBmaWQgKi8KKwkJc3Bpbl9sb2NrKCZhZnNfY2JfaGFzaF9sb2NrKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZub2RlLAorCQkJCSAgICAmYWZzX2NiX2hhc2goc2VydmVyLCAmY2FsbGJhY2tzLT5maWQpLAorCQkJCSAgICBjYl9oYXNoX2xpbmspIHsKKwkJCWlmIChtZW1jbXAoJnZub2RlLT5maWQsICZjYWxsYmFja3MtPmZpZCwKKwkJCQkgICBzaXplb2Yoc3RydWN0IGFmc19maWQpKSAhPSAwKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiByaWdodCB2bm9kZSwgYnV0IGlzIGl0IHNhbWUgc2VydmVyPyAqLworCQkJaWYgKHZub2RlLT5jYl9zZXJ2ZXIgIT0gc2VydmVyKQorCQkJCWJyZWFrOyAvKiBubyAqLworCisJCQkvKiB0cnkgYW5kIG5haWwgdGhlIGlub2RlIGRvd24gKi8KKwkJCWlub2RlID0gaWdyYWIoQUZTX1ZOT0RFX1RPX0kodm5vZGUpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3Bpbl91bmxvY2soJmFmc19jYl9oYXNoX2xvY2spOworCisJCWlmIChpbm9kZSkgeworCQkJLyogd2UndmUgZm91bmQgdGhlIHJlY29yZCBmb3IgdGhpcyB2bm9kZSAqLworCQkJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJCQlpZiAodm5vZGUtPmNiX3NlcnZlciA9PSBzZXJ2ZXIpIHsKKwkJCQkvKiB0aGUgY2FsbGJhY2sgX2lzXyBvbiB0aGUgY2FsbGluZyBzZXJ2ZXIgKi8KKwkJCQl2bm9kZS0+Y2Jfc2VydmVyID0gTlVMTDsKKwkJCQl2YWxpZCA9IDE7CisKKwkJCQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmdm5vZGUtPmNiX3RpbWVvdXQpOworCQkJCXZub2RlLT5mbGFncyB8PSBBRlNfVk5PREVfQ0hBTkdFRDsKKworCQkJCXNwaW5fbG9jaygmc2VydmVyLT5jYl9sb2NrKTsKKwkJCQlsaXN0X2RlbF9pbml0KCZ2bm9kZS0+Y2JfbGluayk7CisJCQkJc3Bpbl91bmxvY2soJnNlcnZlci0+Y2JfbG9jayk7CisKKwkJCQlzcGluX2xvY2soJmFmc19jYl9oYXNoX2xvY2spOworCQkJCWxpc3RfZGVsX2luaXQoJnZub2RlLT5jYl9oYXNoX2xpbmspOworCQkJCXNwaW5fdW5sb2NrKCZhZnNfY2JfaGFzaF9sb2NrKTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwkJCWlmICh2YWxpZCkgeworCQkJCWludmFsaWRhdGVfcmVtb3RlX2lub2RlKGlub2RlKTsKKwkJCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCQkJfQorCQkJaXB1dChpbm9kZSk7CisJCX0KKwl9CisKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30gLyogZW5kIFNSWEFGU0NNX0NhbGxCYWNrKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGFsbG93IHRoZSBmaWxlc2VydmVyIHRvIHNlZSBpZiB0aGUgY2FjaGUgbWFuYWdlciBpcyBzdGlsbCBhbGl2ZQorICovCitpbnQgU1JYQUZTQ01fUHJvYmUoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcikKK3sKKwlfZGVidWcoIlNSWEFGU0NNX1Byb2JlKCVwKVxuIiwgc2VydmVyKTsKKwlyZXR1cm4gMDsKK30gLyogZW5kIFNSWEFGU0NNX1Byb2JlKCkgKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9jZWxsLmMgYi9mcy9hZnMvY2VsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOWE5YWUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvY2VsbC5jCkBAIC0wLDAgKzEsNTY5IEBACisvKiBjZWxsLmM6IEFGUyBjZWxsIGFuZCBzZXJ2ZXIgcmVjb3JkIG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHJ4cnBjL3BlZXIuaD4KKyNpbmNsdWRlIDxyeHJwYy9jb25uZWN0aW9uLmg+CisjaW5jbHVkZSAidm9sdW1lLmgiCisjaW5jbHVkZSAiY2VsbC5oIgorI2luY2x1ZGUgInNlcnZlci5oIgorI2luY2x1ZGUgInRyYW5zcG9ydC5oIgorI2luY2x1ZGUgInZsY2xpZW50LmgiCisjaW5jbHVkZSAia2Fmc3RpbW9kLmgiCisjaW5jbHVkZSAic3VwZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitERUNMQVJFX1JXU0VNKGFmc19wcm9jX2NlbGxzX3NlbSk7CitMSVNUX0hFQUQoYWZzX3Byb2NfY2VsbHMpOworCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBhZnNfY2VsbHMgPSBMSVNUX0hFQURfSU5JVChhZnNfY2VsbHMpOworc3RhdGljIERFRklORV9SV0xPQ0soYWZzX2NlbGxzX2xvY2spOworc3RhdGljIERFQ0xBUkVfUldTRU0oYWZzX2NlbGxzX3NlbSk7IC8qIGFkZC9yZW1vdmUgc2VyaWFsaXNhdGlvbiAqLworc3RhdGljIHN0cnVjdCBhZnNfY2VsbCAqYWZzX2NlbGxfcm9vdDsKKworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyBjYWNoZWZzX21hdGNoX3ZhbF90IGFmc19jZWxsX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKKwkJCQkJCWNvbnN0IHZvaWQgKmVudHJ5KTsKK3N0YXRpYyB2b2lkIGFmc19jZWxsX2NhY2hlX3VwZGF0ZSh2b2lkICpzb3VyY2UsIHZvaWQgKmVudHJ5KTsKKworc3RydWN0IGNhY2hlZnNfaW5kZXhfZGVmIGFmc19jYWNoZV9jZWxsX2luZGV4X2RlZiA9IHsKKwkubmFtZQkJCT0gImNlbGxfaXgiLAorCS5kYXRhX3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBhZnNfY2FjaGVfY2VsbCksCisJLmtleXNbMF0JCT0geyBDQUNIRUZTX0lOREVYX0tFWVNfQVNDSUlaLCA2NCB9LAorCS5tYXRjaAkJCT0gYWZzX2NlbGxfY2FjaGVfbWF0Y2gsCisJLnVwZGF0ZQkJCT0gYWZzX2NlbGxfY2FjaGVfdXBkYXRlLAorfTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY3JlYXRlIGEgY2VsbCByZWNvcmQKKyAqIC0gIm5hbWUiIGlzIHRoZSBuYW1lIG9mIHRoZSBjZWxsCisgKiAtICJ2bGxpc3QiIGlzIGEgY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgSVAgYWRkcmVzc2VzIGluICJhLmIuYy5kIiBmb3JtYXQKKyAqLworaW50IGFmc19jZWxsX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBjaGFyICp2bGxpc3QsIHN0cnVjdCBhZnNfY2VsbCAqKl9jZWxsKQoreworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbDsKKwljaGFyICpuZXh0OworCWludCByZXQ7CisKKwlfZW50ZXIoIiVzIiwgbmFtZSk7CisKKwlCVUdfT04oIW5hbWUpOyAvKiBUT0RPOiB3YW50IHRvIGxvb2sgdXAgInRoaXMgY2VsbCIgaW4gdGhlIGNhY2hlICovCisKKwkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBhIGNlbGwgcmVjb3JkICovCisJY2VsbCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfY2VsbCkgKyBzdHJsZW4obmFtZSkgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNlbGwpIHsKKwkJX2xlYXZlKCIgPSAtRU5PTUVNIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRvd25fd3JpdGUoJmFmc19jZWxsc19zZW0pOworCisJbWVtc2V0KGNlbGwsIDAsIHNpemVvZihzdHJ1Y3QgYWZzX2NlbGwpKTsKKwlhdG9taWNfc2V0KCZjZWxsLT51c2FnZSwgMCk7CisKKwlJTklUX0xJU1RfSEVBRCgmY2VsbC0+bGluayk7CisKKwlyd2xvY2tfaW5pdCgmY2VsbC0+c3ZfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmNlbGwtPnN2X2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjZWxsLT5zdl9ncmF2ZXlhcmQpOworCXNwaW5fbG9ja19pbml0KCZjZWxsLT5zdl9neWxvY2spOworCisJaW5pdF9yd3NlbSgmY2VsbC0+dmxfc2VtKTsKKwlJTklUX0xJU1RfSEVBRCgmY2VsbC0+dmxfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmNlbGwtPnZsX2dyYXZleWFyZCk7CisJc3Bpbl9sb2NrX2luaXQoJmNlbGwtPnZsX2d5bG9jayk7CisKKwlzdHJjcHkoY2VsbC0+bmFtZSxuYW1lKTsKKworCS8qIGZpbGwgaW4gdGhlIFZMIHNlcnZlciBsaXN0IGZyb20gdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyAqLworCXJldCA9IC1FSU5WQUw7CisJZG8geworCQl1bnNpZ25lZCBhLCBiLCBjLCBkOworCisJCW5leHQgPSBzdHJjaHIodmxsaXN0LCAnOicpOworCQlpZiAobmV4dCkKKwkJCSpuZXh0KysgPSAwOworCisJCWlmIChzc2NhbmYodmxsaXN0LCAiJXUuJXUuJXUuJXUiLCAmYSwgJmIsICZjLCAmZCkgIT0gNCkKKwkJCWdvdG8gYmFkYWRkcjsKKworCQlpZiAoYSA+IDI1NSB8fCBiID4gMjU1IHx8IGMgPiAyNTUgfHwgZCA+IDI1NSkKKwkJCWdvdG8gYmFkYWRkcjsKKworCQljZWxsLT52bF9hZGRyc1tjZWxsLT52bF9uYWRkcnMrK10uc19hZGRyID0KKwkJCWh0b25sKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChjIDw8IDgpIHwgZCk7CisKKwkJaWYgKGNlbGwtPnZsX25hZGRycyA+PSBBRlNfQ0VMTF9NQVhfQUREUlMpCisJCQlicmVhazsKKworCX0gd2hpbGUodmxsaXN0ID0gbmV4dCwgdmxsaXN0KTsKKworCS8qIGFkZCBhIHByb2MgZGlyIGZvciB0aGlzIGNlbGwgKi8KKwlyZXQgPSBhZnNfcHJvY19jZWxsX3NldHVwKGNlbGwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorCS8qIHB1dCBpdCB1cCBmb3IgY2FjaGluZyAqLworCWNhY2hlZnNfYWNxdWlyZV9jb29raWUoYWZzX2NhY2hlX25ldGZzLnByaW1hcnlfaW5kZXgsCisJCQkgICAgICAgJmFmc192bG9jYXRpb25fY2FjaGVfaW5kZXhfZGVmLAorCQkJICAgICAgIGNlbGwsCisJCQkgICAgICAgJmNlbGwtPmNhY2hlKTsKKyNlbmRpZgorCisJLyogYWRkIHRvIHRoZSBjZWxsIGxpc3RzICovCisJd3JpdGVfbG9jaygmYWZzX2NlbGxzX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmNlbGwtPmxpbmssICZhZnNfY2VsbHMpOworCXdyaXRlX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJZG93bl93cml0ZSgmYWZzX3Byb2NfY2VsbHNfc2VtKTsKKwlsaXN0X2FkZF90YWlsKCZjZWxsLT5wcm9jX2xpbmssICZhZnNfcHJvY19jZWxscyk7CisJdXBfd3JpdGUoJmFmc19wcm9jX2NlbGxzX3NlbSk7CisKKwkqX2NlbGwgPSBjZWxsOworCXVwX3dyaXRlKCZhZnNfY2VsbHNfc2VtKTsKKworCV9sZWF2ZSgiID0gMCAoJXApIiwgY2VsbCk7CisJcmV0dXJuIDA7CisKKyBiYWRhZGRyOgorCXByaW50ayhLRVJOX0VSUiAia0FGUzogYmFkIFZMIHNlcnZlciBJUCBhZGRyZXNzOiAnJXMnXG4iLCB2bGxpc3QpOworIGVycm9yOgorCXVwX3dyaXRlKCZhZnNfY2VsbHNfc2VtKTsKKwlrZnJlZShjZWxsKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgYWZzX2NlbGxfY3JlYXRlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGluaXRpYWxpc2UgdGhlIGNlbGwgZGF0YWJhc2UgZnJvbSBtb2R1bGUgcGFyYW1ldGVycworICovCitpbnQgYWZzX2NlbGxfaW5pdChjaGFyICpyb290Y2VsbCkKK3sKKwlzdHJ1Y3QgYWZzX2NlbGwgKm9sZF9yb290LCAqbmV3X3Jvb3Q7CisJY2hhciAqY3A7CisJaW50IHJldDsKKworCV9lbnRlcigiIik7CisKKwlpZiAoIXJvb3RjZWxsKSB7CisJCS8qIG1vZHVsZSBpcyBsb2FkZWQgd2l0aCBubyBwYXJhbWV0ZXJzLCBvciBidWlsdCBzdGF0aWNhbGx5LgorCQkgKiAtIGluIHRoZSBmdXR1cmUgd2UgbWlnaHQgaW5pdGlhbGl6ZSBjZWxsIERCIGhlcmUuCisJCSAqLworCQlfbGVhdmUoIiA9IDAgKGJ1dCBubyByb290KSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwljcCA9IHN0cmNocihyb290Y2VsbCwgJzonKTsKKwlpZiAoIWNwKSB7CisJCXByaW50ayhLRVJOX0VSUiAia0FGUzogbm8gVkwgc2VydmVyIElQIGFkZHJlc3NlcyBzcGVjaWZpZWRcbiIpOworCQlfbGVhdmUoIiA9ICVkIChubyBjb2xvbikiLCAtRUlOVkFMKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogYWxsb2NhdGUgYSBjZWxsIHJlY29yZCBmb3IgdGhlIHJvb3QgY2VsbCAqLworCSpjcCsrID0gMDsKKwlyZXQgPSBhZnNfY2VsbF9jcmVhdGUocm9vdGNlbGwsIGNwLCAmbmV3X3Jvb3QpOworCWlmIChyZXQgPCAwKSB7CisJCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGFzIGFmc19wdXRfY2VsbCgpIHRha2VzIGxvY2tzIGJ5IGl0c2VsZiwgd2UgaGF2ZSB0byBkbworCSAqIGEgbGl0dGxlIGd5bW5hc3RpY3MgdG8gYmUgcmFjZS1mcmVlLgorCSAqLworCWFmc19nZXRfY2VsbChuZXdfcm9vdCk7CisKKwl3cml0ZV9sb2NrKCZhZnNfY2VsbHNfbG9jayk7CisJd2hpbGUgKGFmc19jZWxsX3Jvb3QpIHsKKwkJb2xkX3Jvb3QgPSBhZnNfY2VsbF9yb290OworCQlhZnNfY2VsbF9yb290ID0gTlVMTDsKKwkJd3JpdGVfdW5sb2NrKCZhZnNfY2VsbHNfbG9jayk7CisJCWFmc19wdXRfY2VsbChvbGRfcm9vdCk7CisJCXdyaXRlX2xvY2soJmFmc19jZWxsc19sb2NrKTsKKwl9CisJYWZzX2NlbGxfcm9vdCA9IG5ld19yb290OworCXdyaXRlX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKworfSAvKiBlbmQgYWZzX2NlbGxfaW5pdCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb29rdXAgYSBjZWxsIHJlY29yZAorICovCitpbnQgYWZzX2NlbGxfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIG5hbWVzeiwgc3RydWN0IGFmc19jZWxsICoqX2NlbGwpCit7CisJc3RydWN0IGFmc19jZWxsICpjZWxsOworCWludCByZXQ7CisKKwlfZW50ZXIoIlwiJSouKnNcIiwiLCBuYW1lc3osIG5hbWVzeiwgbmFtZSA/IG5hbWUgOiAiIik7CisKKwkqX2NlbGwgPSBOVUxMOworCisJaWYgKG5hbWUpIHsKKwkJLyogaWYgdGhlIGNlbGwgd2FzIG5hbWVkLCBsb29rIGZvciBpdCBpbiB0aGUgY2VsbCByZWNvcmQgbGlzdCAqLworCQlyZXQgPSAtRU5PRU5UOworCQljZWxsID0gTlVMTDsKKwkJcmVhZF9sb2NrKCZhZnNfY2VsbHNfbG9jayk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjZWxsLCAmYWZzX2NlbGxzLCBsaW5rKSB7CisJCQlpZiAoc3RybmNtcChjZWxsLT5uYW1lLCBuYW1lLCBuYW1lc3opID09IDApIHsKKwkJCQlhZnNfZ2V0X2NlbGwoY2VsbCk7CisJCQkJZ290byBmb3VuZDsKKwkJCX0KKwkJfQorCQljZWxsID0gTlVMTDsKKwlmb3VuZDoKKworCQlyZWFkX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJCWlmIChjZWxsKQorCQkJcmV0ID0gMDsKKwl9CisJZWxzZSB7CisJCXJlYWRfbG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJCWNlbGwgPSBhZnNfY2VsbF9yb290OworCQlpZiAoIWNlbGwpIHsKKwkJCS8qIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gdW5sZXNzIHVzZXIgdHJpZXMgdG8gbW91bnQKKwkJCSAqIHdoZW4gcm9vdCBjZWxsIGlzIG5vdCBzZXQuIFJldHVybiBhbiBpbXBvc3NpYmx5CisJCQkgKiBiaXp6YXJlIGVycm5vIHRvIGFsZXJ0IHRoZSB1c2VyLiBUaGluZ3MgbGlrZQorCQkJICogRU5PRU5UIG1pZ2h0IGJlICJtb3JlIGFwcHJvcHJpYXRlIiBidXQgdGhleSBoYXBwZW4KKwkJCSAqIGZvciBvdGhlciByZWFzb25zLgorCQkJICovCisJCQlyZXQgPSAtRURFU1RBRERSUkVROworCQl9CisJCWVsc2UgeworCQkJYWZzX2dldF9jZWxsKGNlbGwpOworCQkJcmV0ID0gMDsKKwkJfQorCisJCXJlYWRfdW5sb2NrKCZhZnNfY2VsbHNfbG9jayk7CisJfQorCisJKl9jZWxsID0gY2VsbDsKKwlfbGVhdmUoIiA9ICVkICglcCkiLCByZXQsIGNlbGwpOworCXJldHVybiByZXQ7CisKK30gLyogZW5kIGFmc19jZWxsX2xvb2t1cCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiB0cnkgYW5kIGdldCBhIGNlbGwgcmVjb3JkCisgKi8KK3N0cnVjdCBhZnNfY2VsbCAqYWZzX2dldF9jZWxsX21heWJlKHN0cnVjdCBhZnNfY2VsbCAqKl9jZWxsKQoreworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbDsKKworCXdyaXRlX2xvY2soJmFmc19jZWxsc19sb2NrKTsKKworCWNlbGwgPSAqX2NlbGw7CisJaWYgKGNlbGwgJiYgIWxpc3RfZW1wdHkoJmNlbGwtPmxpbmspKQorCQlhZnNfZ2V0X2NlbGwoY2VsbCk7CisJZWxzZQorCQljZWxsID0gTlVMTDsKKworCXdyaXRlX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJcmV0dXJuIGNlbGw7Cit9IC8qIGVuZCBhZnNfZ2V0X2NlbGxfbWF5YmUoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZGVzdHJveSBhIGNlbGwgcmVjb3JkCisgKi8KK3ZvaWQgYWZzX3B1dF9jZWxsKHN0cnVjdCBhZnNfY2VsbCAqY2VsbCkKK3sKKwlpZiAoIWNlbGwpCisJCXJldHVybjsKKworCV9lbnRlcigiJXB7JWQsJXN9IiwgY2VsbCwgYXRvbWljX3JlYWQoJmNlbGwtPnVzYWdlKSwgY2VsbC0+bmFtZSk7CisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlCVUdfT04oYXRvbWljX3JlYWQoJmNlbGwtPnVzYWdlKSA8PSAwKTsKKworCS8qIHRvIHByZXZlbnQgYSByYWNlLCB0aGUgZGVjcmVtZW50IGFuZCB0aGUgZGVxdWV1ZSBtdXN0IGJlIGVmZmVjdGl2ZWx5CisJICogYXRvbWljICovCisJd3JpdGVfbG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJaWYgKGxpa2VseSghYXRvbWljX2RlY19hbmRfdGVzdCgmY2VsbC0+dXNhZ2UpKSkgeworCQl3cml0ZV91bmxvY2soJmFmc19jZWxsc19sb2NrKTsKKwkJX2xlYXZlKCIiKTsKKwkJcmV0dXJuOworCX0KKworCXdyaXRlX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJQlVHX09OKCFsaXN0X2VtcHR5KCZjZWxsLT5zdl9saXN0KSk7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZjZWxsLT5zdl9ncmF2ZXlhcmQpKTsKKwlCVUdfT04oIWxpc3RfZW1wdHkoJmNlbGwtPnZsX2xpc3QpKTsKKwlCVUdfT04oIWxpc3RfZW1wdHkoJmNlbGwtPnZsX2dyYXZleWFyZCkpOworCisJX2xlYXZlKCIgW3VudXNlZF0iKTsKK30gLyogZW5kIGFmc19wdXRfY2VsbCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBkZXN0cm95IGEgY2VsbCByZWNvcmQKKyAqLworc3RhdGljIHZvaWQgYWZzX2NlbGxfZGVzdHJveShzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwpCit7CisJX2VudGVyKCIlcHslZCwlc30iLCBjZWxsLCBhdG9taWNfcmVhZCgmY2VsbC0+dXNhZ2UpLCBjZWxsLT5uYW1lKTsKKworCS8qIHRvIHByZXZlbnQgYSByYWNlLCB0aGUgZGVjcmVtZW50IGFuZCB0aGUgZGVxdWV1ZSBtdXN0IGJlIGVmZmVjdGl2ZWx5CisJICogYXRvbWljICovCisJd3JpdGVfbG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJLyogc2FuaXR5IGNoZWNrICovCisJQlVHX09OKGF0b21pY19yZWFkKCZjZWxsLT51c2FnZSkgIT0gMCk7CisKKwlsaXN0X2RlbF9pbml0KCZjZWxsLT5saW5rKTsKKworCXdyaXRlX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJZG93bl93cml0ZSgmYWZzX2NlbGxzX3NlbSk7CisKKwlhZnNfcHJvY19jZWxsX3JlbW92ZShjZWxsKTsKKworCWRvd25fd3JpdGUoJmFmc19wcm9jX2NlbGxzX3NlbSk7CisJbGlzdF9kZWxfaW5pdCgmY2VsbC0+cHJvY19saW5rKTsKKwl1cF93cml0ZSgmYWZzX3Byb2NfY2VsbHNfc2VtKTsKKworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwljYWNoZWZzX3JlbGlucXVpc2hfY29va2llKGNlbGwtPmNhY2hlLCAwKTsKKyNlbmRpZgorCisJdXBfd3JpdGUoJmFmc19jZWxsc19zZW0pOworCisJQlVHX09OKCFsaXN0X2VtcHR5KCZjZWxsLT5zdl9saXN0KSk7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZjZWxsLT5zdl9ncmF2ZXlhcmQpKTsKKwlCVUdfT04oIWxpc3RfZW1wdHkoJmNlbGwtPnZsX2xpc3QpKTsKKwlCVUdfT04oIWxpc3RfZW1wdHkoJmNlbGwtPnZsX2dyYXZleWFyZCkpOworCisJLyogZmluaXNoIGNsZWFuaW5nIHVwIHRoZSBjZWxsICovCisJa2ZyZWUoY2VsbCk7CisKKwlfbGVhdmUoIiBbZGVzdHJveWVkXSIpOworfSAvKiBlbmQgYWZzX2NlbGxfZGVzdHJveSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb29rdXAgdGhlIHNlcnZlciByZWNvcmQgY29ycmVzcG9uZGluZyB0byBhbiBSeCBSUEMgcGVlcgorICovCitpbnQgYWZzX3NlcnZlcl9maW5kX2J5X3BlZXIoY29uc3Qgc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIsCisJCQkgICAgc3RydWN0IGFmc19zZXJ2ZXIgKipfc2VydmVyKQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJc3RydWN0IGFmc19jZWxsICpjZWxsOworCisJX2VudGVyKCIlcHthPSUwOHh9LCIsIHBlZXIsIG50b2hsKHBlZXItPmFkZHIuc19hZGRyKSk7CisKKwkvKiBzZWFyY2ggdGhlIGNlbGwgbGlzdCAqLworCXJlYWRfbG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZWxsLCAmYWZzX2NlbGxzLCBsaW5rKSB7CisKKwkJX2RlYnVnKCI/IGNlbGwgJXMiLGNlbGwtPm5hbWUpOworCisJCXdyaXRlX2xvY2soJmNlbGwtPnN2X2xvY2spOworCisJCS8qIGNoZWNrIHRoZSBhY3RpdmUgbGlzdCAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlcnZlciwgJmNlbGwtPnN2X2xpc3QsIGxpbmspIHsKKwkJCV9kZWJ1ZygiPz8gc2VydmVyICUwOHgiLCBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7CisKKwkJCWlmIChtZW1jbXAoJnNlcnZlci0+YWRkciwgJnBlZXItPmFkZHIsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgPT0gMCkKKwkJCQlnb3RvIGZvdW5kX3NlcnZlcjsKKwkJfQorCisJCS8qIGNoZWNrIHRoZSBpbmFjdGl2ZSBsaXN0ICovCisJCXNwaW5fbG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShzZXJ2ZXIsICZjZWxsLT5zdl9ncmF2ZXlhcmQsIGxpbmspIHsKKwkJCV9kZWJ1ZygiPz8gZGVhZCBzZXJ2ZXIgJTA4eCIsCisJCQkgICAgICAgbnRvaGwoc2VydmVyLT5hZGRyLnNfYWRkcikpOworCisJCQlpZiAobWVtY21wKCZzZXJ2ZXItPmFkZHIsICZwZWVyLT5hZGRyLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpID09IDApCisJCQkJZ290byBmb3VuZF9kZWFkX3NlcnZlcjsKKwkJfQorCQlzcGluX3VubG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKKworCQl3cml0ZV91bmxvY2soJmNlbGwtPnN2X2xvY2spOworCX0KKwlyZWFkX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJX2xlYXZlKCIgPSAtRU5PRU5UIik7CisJcmV0dXJuIC1FTk9FTlQ7CisKKwkvKiB3ZSBmb3VuZCBpdCBpbiB0aGUgZ3JhdmV5YXJkIC0gcmVzdXJyZWN0IGl0ICovCisgZm91bmRfZGVhZF9zZXJ2ZXI6CisJbGlzdF9kZWwoJnNlcnZlci0+bGluayk7CisJbGlzdF9hZGRfdGFpbCgmc2VydmVyLT5saW5rLCAmY2VsbC0+c3ZfbGlzdCk7CisJYWZzX2dldF9zZXJ2ZXIoc2VydmVyKTsKKwlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmc2VydmVyLT50aW1lb3V0KTsKKwlzcGluX3VubG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKKwlnb3RvIHN1Y2Nlc3M7CisKKwkvKiB3ZSBmb3VuZCBpdCAtIGluY3JlbWVudCBpdHMgcmVmIGNvdW50IGFuZCByZXR1cm4gaXQgKi8KKyBmb3VuZF9zZXJ2ZXI6CisJYWZzX2dldF9zZXJ2ZXIoc2VydmVyKTsKKworIHN1Y2Nlc3M6CisJd3JpdGVfdW5sb2NrKCZjZWxsLT5zdl9sb2NrKTsKKwlyZWFkX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJKl9zZXJ2ZXIgPSBzZXJ2ZXI7CisJX2xlYXZlKCIgPSAwIChzPSVwIGM9JXApIiwgc2VydmVyLCBjZWxsKTsKKwlyZXR1cm4gMDsKKworfSAvKiBlbmQgYWZzX3NlcnZlcl9maW5kX2J5X3BlZXIoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogcHVyZ2UgaW4tbWVtb3J5IGNlbGwgZGF0YWJhc2Ugb24gbW9kdWxlIHVubG9hZCBvciBhZnNfaW5pdCgpIGZhaWx1cmUKKyAqIC0gdGhlIHRpbWVvdXQgZGFlbW9uIGlzIHN0b3BwZWQgYmVmb3JlIGNhbGxpbmcgdGhpcworICovCit2b2lkIGFmc19jZWxsX3B1cmdlKHZvaWQpCit7CisJc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbjsKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGw7CisKKwlfZW50ZXIoIiIpOworCisJYWZzX3B1dF9jZWxsKGFmc19jZWxsX3Jvb3QpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZhZnNfY2VsbHMpKSB7CisJCWNlbGwgPSBOVUxMOworCisJCS8qIHJlbW92ZSB0aGUgbmV4dCBjZWxsIGZyb20gdGhlIGZyb250IG9mIHRoZSBsaXN0ICovCisJCXdyaXRlX2xvY2soJmFmc19jZWxsc19sb2NrKTsKKworCQlpZiAoIWxpc3RfZW1wdHkoJmFmc19jZWxscykpIHsKKwkJCWNlbGwgPSBsaXN0X2VudHJ5KGFmc19jZWxscy5uZXh0LAorCQkJCQkgIHN0cnVjdCBhZnNfY2VsbCwgbGluayk7CisJCQlsaXN0X2RlbF9pbml0KCZjZWxsLT5saW5rKTsKKwkJfQorCisJCXdyaXRlX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJCWlmIChjZWxsKSB7CisJCQlfZGVidWcoIlBVUkdJTkcgQ0VMTCAlcyAoJWQpIiwKKwkJCSAgICAgICBjZWxsLT5uYW1lLCBhdG9taWNfcmVhZCgmY2VsbC0+dXNhZ2UpKTsKKworCQkJQlVHX09OKCFsaXN0X2VtcHR5KCZjZWxsLT5zdl9saXN0KSk7CisJCQlCVUdfT04oIWxpc3RfZW1wdHkoJmNlbGwtPnZsX2xpc3QpKTsKKworCQkJLyogcHVyZ2UgdGhlIGNlbGwncyBWTCBncmF2ZXlhcmQgbGlzdCAqLworCQkJX2RlYnVnKCIgLSBjbGVhcmluZyBWTCBncmF2ZXlhcmQiKTsKKworCQkJc3Bpbl9sb2NrKCZjZWxsLT52bF9neWxvY2spOworCisJCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmNlbGwtPnZsX2dyYXZleWFyZCkpIHsKKwkJCQl2bG9jYXRpb24gPSBsaXN0X2VudHJ5KGNlbGwtPnZsX2dyYXZleWFyZC5uZXh0LAorCQkJCQkJICAgICAgIHN0cnVjdCBhZnNfdmxvY2F0aW9uLAorCQkJCQkJICAgICAgIGxpbmspOworCQkJCWxpc3RfZGVsX2luaXQoJnZsb2NhdGlvbi0+bGluayk7CisKKwkJCQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmdmxvY2F0aW9uLT50aW1lb3V0KTsKKworCQkJCXNwaW5fdW5sb2NrKCZjZWxsLT52bF9neWxvY2spOworCisJCQkJYWZzX3Zsb2NhdGlvbl9kb190aW1lb3V0KHZsb2NhdGlvbik7CisJCQkJLyogVE9ETzogcmFjZSBpZiBtb3ZlIHRvIHVzZSBrcnh0aW1vZCBpbnN0ZWFkCisJCQkJICogb2Yga2Fmc3RpbW9kICovCisKKwkJCQlzcGluX2xvY2soJmNlbGwtPnZsX2d5bG9jayk7CisJCQl9CisKKwkJCXNwaW5fdW5sb2NrKCZjZWxsLT52bF9neWxvY2spOworCisJCQkvKiBwdXJnZSB0aGUgY2VsbCdzIHNlcnZlciBncmF2ZXlhcmQgbGlzdCAqLworCQkJX2RlYnVnKCIgLSBjbGVhcmluZyBzZXJ2ZXIgZ3JhdmV5YXJkIik7CisKKwkJCXNwaW5fbG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKKworCQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZjZWxsLT5zdl9ncmF2ZXlhcmQpKSB7CisJCQkJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKworCQkJCXNlcnZlciA9IGxpc3RfZW50cnkoY2VsbC0+c3ZfZ3JhdmV5YXJkLm5leHQsCisJCQkJCQkgICAgc3RydWN0IGFmc19zZXJ2ZXIsIGxpbmspOworCQkJCWxpc3RfZGVsX2luaXQoJnNlcnZlci0+bGluayk7CisKKwkJCQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmc2VydmVyLT50aW1lb3V0KTsKKworCQkJCXNwaW5fdW5sb2NrKCZjZWxsLT5zdl9neWxvY2spOworCisJCQkJYWZzX3NlcnZlcl9kb190aW1lb3V0KHNlcnZlcik7CisKKwkJCQlzcGluX2xvY2soJmNlbGwtPnN2X2d5bG9jayk7CisJCQl9CisKKwkJCXNwaW5fdW5sb2NrKCZjZWxsLT5zdl9neWxvY2spOworCisJCQkvKiBub3cgdGhlIGNlbGwgc2hvdWxkIGJlIGxlZnQgd2l0aCBubyByZWZlcmVuY2VzICovCisJCQlhZnNfY2VsbF9kZXN0cm95KGNlbGwpOworCQl9CisJfQorCisJX2xlYXZlKCIiKTsKK30gLyogZW5kIGFmc19jZWxsX3B1cmdlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIG1hdGNoIGEgY2VsbCByZWNvcmQgb2J0YWluZWQgZnJvbSB0aGUgY2FjaGUKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyBjYWNoZWZzX21hdGNoX3ZhbF90IGFmc19jZWxsX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKKwkJCQkJCWNvbnN0IHZvaWQgKmVudHJ5KQoreworCWNvbnN0IHN0cnVjdCBhZnNfY2FjaGVfY2VsbCAqY2NlbGwgPSBlbnRyeTsKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSB0YXJnZXQ7CisKKwlfZW50ZXIoInslc30seyVzfSIsIGNjZWxsLT5uYW1lLCBjZWxsLT5uYW1lKTsKKworCWlmIChzdHJuY21wKGNjZWxsLT5uYW1lLCBjZWxsLT5uYW1lLCBzaXplb2YoY2NlbGwtPm5hbWUpKSA9PSAwKSB7CisJCV9sZWF2ZSgiID0gU1VDQ0VTUyIpOworCQlyZXR1cm4gQ0FDSEVGU19NQVRDSF9TVUNDRVNTOworCX0KKworCV9sZWF2ZSgiID0gRkFJTEVEIik7CisJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfRkFJTEVEOworfSAvKiBlbmQgYWZzX2NlbGxfY2FjaGVfbWF0Y2goKSAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiB1cGRhdGUgYSBjZWxsIHJlY29yZCBpbiB0aGUgY2FjaGUKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyB2b2lkIGFmc19jZWxsX2NhY2hlX3VwZGF0ZSh2b2lkICpzb3VyY2UsIHZvaWQgKmVudHJ5KQoreworCXN0cnVjdCBhZnNfY2FjaGVfY2VsbCAqY2NlbGwgPSBlbnRyeTsKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBzb3VyY2U7CisKKwlfZW50ZXIoIiVwLCVwIiwgc291cmNlLCBlbnRyeSk7CisKKwlzdHJuY3B5KGNjZWxsLT5uYW1lLCBjZWxsLT5uYW1lLCBzaXplb2YoY2NlbGwtPm5hbWUpKTsKKworCW1lbWNweShjY2VsbC0+dmxfc2VydmVycywKKwkgICAgICAgY2VsbC0+dmxfYWRkcnMsCisJICAgICAgIG1pbihzaXplb2YoY2NlbGwtPnZsX3NlcnZlcnMpLCBzaXplb2YoY2VsbC0+dmxfYWRkcnMpKSk7CisKK30gLyogZW5kIGFmc19jZWxsX2NhY2hlX3VwZGF0ZSgpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9jZWxsLmggYi9mcy9hZnMvY2VsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MzQ5MTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvY2VsbC5oCkBAIC0wLDAgKzEsNzggQEAKKy8qIGNlbGwuaDogQUZTIGNlbGwgcmVjb3JkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0FGU19DRUxMX0gKKyNkZWZpbmUgX0xJTlVYX0FGU19DRUxMX0gKKworI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKworI2RlZmluZSBBRlNfQ0VMTF9NQVhfQUREUlMgMTUKKworZXh0ZXJuIHZvbGF0aWxlIGludCBhZnNfY2VsbHNfYmVpbmdfcHVyZ2VkOyAvKiBUIHdoZW4gY2VsbHMgYXJlIGJlaW5nIHB1cmdlZCBieSBybW1vZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZW50cnkgaW4gdGhlIGNhY2hlZCBjZWxsIGNhdGFsb2d1ZQorICovCitzdHJ1Y3QgYWZzX2NhY2hlX2NlbGwKK3sKKwljaGFyCQkJbmFtZVs2NF07CS8qIGNlbGwgbmFtZSAocGFkZGVkIHdpdGggTlVMcykgKi8KKwlzdHJ1Y3QgaW5fYWRkcgkJdmxfc2VydmVyc1sxNV07CS8qIGNhY2hlZCBjZWxsIFZMIHNlcnZlcnMgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBBRlMgY2VsbCByZWNvcmQKKyAqLworc3RydWN0IGFmc19jZWxsCit7CisJYXRvbWljX3QJCXVzYWdlOworCXN0cnVjdCBsaXN0X2hlYWQJbGluazsJCS8qIG1haW4gY2VsbCBsaXN0IGxpbmsgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXByb2NfbGluazsJLyogL3Byb2MgY2VsbCBsaXN0IGxpbmsgKi8KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKnByb2NfZGlyOwkvKiAvcHJvYyBkaXIgZm9yIHRoaXMgY2VsbCAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwlzdHJ1Y3QgY2FjaGVmc19jb29raWUJKmNhY2hlOwkJLyogY2FjaGluZyBjb29raWUgKi8KKyNlbmRpZgorCisJLyogc2VydmVyIHJlY29yZCBtYW5hZ2VtZW50ICovCisJcndsb2NrX3QJCXN2X2xvY2s7CS8qIGFjdGl2ZSBzZXJ2ZXIgbGlzdCBsb2NrICovCisJc3RydWN0IGxpc3RfaGVhZAlzdl9saXN0OwkvKiBhY3RpdmUgc2VydmVyIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXN2X2dyYXZleWFyZDsJLyogaW5hY3RpdmUgc2VydmVyIGxpc3QgKi8KKwlzcGlubG9ja190CQlzdl9neWxvY2s7CS8qIGluYWN0aXZlIHNlcnZlciBsaXN0IGxvY2sgKi8KKworCS8qIHZvbHVtZSBsb2NhdGlvbiByZWNvcmQgbWFuYWdlbWVudCAqLworCXN0cnVjdCByd19zZW1hcGhvcmUJdmxfc2VtOwkJLyogdm9sdW1lIG1hbmFnZW1lbnQgc2VyaWFsaXNhdGlvbiBzZW1hcGhvcmUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXZsX2xpc3Q7CS8qIGNlbGwncyBhY3RpdmUgVkwgcmVjb3JkIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXZsX2dyYXZleWFyZDsJLyogY2VsbCdzIGluYWN0aXZlIFZMIHJlY29yZCBsaXN0ICovCisJc3BpbmxvY2tfdAkJdmxfZ3lsb2NrOwkvKiBncmF2ZXlhcmQgbG9jayAqLworCXVuc2lnbmVkIHNob3J0CQl2bF9uYWRkcnM7CS8qIG51bWJlciBvZiBWTCBzZXJ2ZXJzIGluIGFkZHIgbGlzdCAqLworCXVuc2lnbmVkIHNob3J0CQl2bF9jdXJyX3N2aXg7CS8qIGN1cnJlbnQgc2VydmVyIGluZGV4ICovCisJc3RydWN0IGluX2FkZHIJCXZsX2FkZHJzW0FGU19DRUxMX01BWF9BRERSU107CS8qIGNlbGwgVkwgc2VydmVyIGFkZHJlc3NlcyAqLworCisJY2hhcgkJCW5hbWVbMF07CS8qIGNlbGwgbmFtZSAtIG11c3QgZ28gbGFzdCAqLworfTsKKworZXh0ZXJuIGludCBhZnNfY2VsbF9pbml0KGNoYXIgKnJvb3RjZWxsKTsKKworZXh0ZXJuIGludCBhZnNfY2VsbF9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqdmxsaXN0LCBzdHJ1Y3QgYWZzX2NlbGwgKipfY2VsbCk7CisKK2V4dGVybiBpbnQgYWZzX2NlbGxfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIG5tc2l6ZSwgc3RydWN0IGFmc19jZWxsICoqX2NlbGwpOworCisjZGVmaW5lIGFmc19nZXRfY2VsbChDKSBkbyB7IGF0b21pY19pbmMoJihDKS0+dXNhZ2UpOyB9IHdoaWxlKDApCisKK2V4dGVybiBzdHJ1Y3QgYWZzX2NlbGwgKmFmc19nZXRfY2VsbF9tYXliZShzdHJ1Y3QgYWZzX2NlbGwgKipfY2VsbCk7CisKK2V4dGVybiB2b2lkIGFmc19wdXRfY2VsbChzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwpOworCitleHRlcm4gdm9pZCBhZnNfY2VsbF9wdXJnZSh2b2lkKTsKKworI2VuZGlmIC8qIF9MSU5VWF9BRlNfQ0VMTF9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvY21zZXJ2aWNlLmMgYi9mcy9hZnMvY21zZXJ2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE1N2ZkNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9jbXNlcnZpY2UuYwpAQCAtMCwwICsxLDY1MiBAQAorLyogY21zZXJ2aWNlLmM6IEFGUyBDYWNoZSBNYW5hZ2VyIFNlcnZpY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlICJzZXJ2ZXIuaCIKKyNpbmNsdWRlICJjZWxsLmgiCisjaW5jbHVkZSAidHJhbnNwb3J0LmgiCisjaW5jbHVkZSA8cnhycGMvcnhycGMuaD4KKyNpbmNsdWRlIDxyeHJwYy90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxyeHJwYy9jb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8cnhycGMvY2FsbC5oPgorI2luY2x1ZGUgImNtc2VydmljZS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBhZnNjbV91c2FnZTsJCS8qIEFGUyBjYWNoZSBtYW5hZ2VyIHVzYWdlIGNvdW50ICovCitzdGF0aWMgc3RydWN0IHJ3X3NlbWFwaG9yZSBhZnNjbV9zZW07CS8qIEFGUyBjYWNoZSBtYW5hZ2VyIHN0YXJ0L3N0b3Agc2VtYXBob3JlICovCisKK3N0YXRpYyBpbnQgYWZzY21fbmV3X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOworc3RhdGljIHZvaWQgYWZzY21fYXR0ZW50aW9uKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKK3N0YXRpYyB2b2lkIGFmc2NtX2Vycm9yKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKK3N0YXRpYyB2b2lkIGFmc2NtX2FlbWFwKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKKworc3RhdGljIHZvaWQgX1NSWEFGU0NNX0NhbGxCYWNrKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKK3N0YXRpYyB2b2lkIF9TUlhBRlNDTV9Jbml0Q2FsbEJhY2tTdGF0ZShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7CitzdGF0aWMgdm9pZCBfU1JYQUZTQ01fUHJvYmUoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOworCit0eXBlZGVmIHZvaWQgKCpfU1JYQUZTQ01feHh4eF90KShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnhycGNfb3BlcmF0aW9uIEFGU0NNX29wc1tdID0geworCXsKKwkJLmlkCT0gMjA0LAorCQkuYXNpemUJPSBSWFJQQ19BUFBfTUFSS19FT0YsCisJCS5uYW1lCT0gIkNhbGxCYWNrIiwKKwkJLnVzZXIJPSBfU1JYQUZTQ01fQ2FsbEJhY2ssCisJfSwKKwl7CisJCS5pZAk9IDIwNSwKKwkJLmFzaXplCT0gUlhSUENfQVBQX01BUktfRU9GLAorCQkubmFtZQk9ICJJbml0Q2FsbEJhY2tTdGF0ZSIsCisJCS51c2VyCT0gX1NSWEFGU0NNX0luaXRDYWxsQmFja1N0YXRlLAorCX0sCisJeworCQkuaWQJPSAyMDYsCisJCS5hc2l6ZQk9IFJYUlBDX0FQUF9NQVJLX0VPRiwKKwkJLm5hbWUJPSAiUHJvYmUiLAorCQkudXNlcgk9IF9TUlhBRlNDTV9Qcm9iZSwKKwl9LAorI2lmIDAKKwl7CisJCS5pZAk9IDIwNywKKwkJLmFzaXplCT0gUlhSUENfQVBQX01BUktfRU9GLAorCQkubmFtZQk9ICJHZXRMb2NrIiwKKwkJLnVzZXIJPSBfU1JYQUZTQ01fR2V0TG9jaywKKwl9LAorCXsKKwkJLmlkCT0gMjA4LAorCQkuYXNpemUJPSBSWFJQQ19BUFBfTUFSS19FT0YsCisJCS5uYW1lCT0gIkdldENFIiwKKwkJLnVzZXIJPSBfU1JYQUZTQ01fR2V0Q0UsCisJfSwKKwl7CisJCS5pZAk9IDIwOSwKKwkJLmFzaXplCT0gUlhSUENfQVBQX01BUktfRU9GLAorCQkubmFtZQk9ICJHZXRYU3RhdHNWZXJzaW9uIiwKKwkJLnVzZXIJPSBfU1JYQUZTQ01fR2V0WFN0YXRzVmVyc2lvbiwKKwl9LAorCXsKKwkJLmlkCT0gMjEwLAorCQkuYXNpemUJPSBSWFJQQ19BUFBfTUFSS19FT0YsCisJCS5uYW1lCT0gIkdldFhTdGF0cyIsCisJCS51c2VyCT0gX1NSWEFGU0NNX0dldFhTdGF0cywKKwl9CisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgcnhycGNfc2VydmljZSBBRlNDTV9zZXJ2aWNlID0geworCS5uYW1lCQk9ICJBRlMvQ00iLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGluawkJPSBMSVNUX0hFQURfSU5JVChBRlNDTV9zZXJ2aWNlLmxpbmspLAorCS5uZXdfY2FsbAk9IGFmc2NtX25ld19jYWxsLAorCS5zZXJ2aWNlX2lkCT0gMSwKKwkuYXR0bl9mdW5jCT0gYWZzY21fYXR0ZW50aW9uLAorCS5lcnJvcl9mdW5jCT0gYWZzY21fZXJyb3IsCisJLmFlbWFwX2Z1bmMJPSBhZnNjbV9hZW1hcCwKKwkub3BzX2JlZ2luCT0gJkFGU0NNX29wc1swXSwKKwkub3BzX2VuZAk9ICZBRlNDTV9vcHNbc2l6ZW9mKEFGU0NNX29wcykgLyBzaXplb2YoQUZTQ01fb3BzWzBdKV0sCit9OworCitzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGthZnNjbWRfYWxpdmUpOworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihrYWZzY21kX2RlYWQpOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGthZnNjbWRfc2xlZXBxKTsKK3N0YXRpYyBMSVNUX0hFQUQoa2Fmc2NtZF9hdHRlbnRpb25fbGlzdCk7CitzdGF0aWMgTElTVF9IRUFEKGFmc2NtX2NhbGxzKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWZzY21fY2FsbHNfbG9jayk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGthZnNjbWRfYXR0ZW50aW9uX2xvY2spOworc3RhdGljIGludCBrYWZzY21kX2RpZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEFGUyBDYWNoZSBNYW5hZ2VyIGtlcm5lbCB0aHJlYWQKKyAqLworc3RhdGljIGludCBrYWZzY21kKHZvaWQgKmFyZykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOworCisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CisJX1NSWEFGU0NNX3h4eHhfdCBmdW5jOworCWludCBkaWU7CisKKwlwcmludGsoImtBRlM6IFN0YXJ0ZWQga2Fmc2NtZCAlZFxuIiwgY3VycmVudC0+cGlkKTsKKworCWRhZW1vbml6ZSgia2Fmc2NtZCIpOworCisJY29tcGxldGUoJmthZnNjbWRfYWxpdmUpOworCisJLyogbG9vcCBhcm91bmQgbG9va2luZyBmb3IgdGhpbmdzIHRvIGF0dGVuZCB0byAqLworCWRvIHsKKwkJaWYgKGxpc3RfZW1wdHkoJmthZnNjbWRfYXR0ZW50aW9uX2xpc3QpKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJYWRkX3dhaXRfcXVldWUoJmthZnNjbWRfc2xlZXBxLCAmbXlzZWxmKTsKKworCQkJZm9yICg7OykgeworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQkJaWYgKCFsaXN0X2VtcHR5KCZrYWZzY21kX2F0dGVudGlvbl9saXN0KSB8fAorCQkJCSAgICBzaWduYWxfcGVuZGluZyhjdXJyZW50KSB8fAorCQkJCSAgICBrYWZzY21kX2RpZSkKKwkJCQkJYnJlYWs7CisKKwkJCQlzY2hlZHVsZSgpOworCQkJfQorCisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgma2Fmc2NtZF9zbGVlcHEsICZteXNlbGYpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJfQorCisJCWRpZSA9IGthZnNjbWRfZGllOworCisJCS8qIGRlcXVldWUgdGhlIG5leHQgY2FsbCByZXF1aXJpbmcgYXR0ZW50aW9uICovCisJCWNhbGwgPSBOVUxMOworCQlzcGluX2xvY2soJmthZnNjbWRfYXR0ZW50aW9uX2xvY2spOworCisJCWlmICghbGlzdF9lbXB0eSgma2Fmc2NtZF9hdHRlbnRpb25fbGlzdCkpIHsKKwkJCWNhbGwgPSBsaXN0X2VudHJ5KGthZnNjbWRfYXR0ZW50aW9uX2xpc3QubmV4dCwKKwkJCQkJICBzdHJ1Y3QgcnhycGNfY2FsbCwKKwkJCQkJICBhcHBfYXR0bl9saW5rKTsKKwkJCWxpc3RfZGVsX2luaXQoJmNhbGwtPmFwcF9hdHRuX2xpbmspOworCQkJZGllID0gMDsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZrYWZzY21kX2F0dGVudGlvbl9sb2NrKTsKKworCQlpZiAoY2FsbCkgeworCQkJLyogYWN0IHVwb24gaXQgKi8KKwkJCV9kZWJ1ZygiQEBAIEJlZ2luIEF0dGVuZCBDYWxsICVwIiwgY2FsbCk7CisKKwkJCWZ1bmMgPSBjYWxsLT5hcHBfdXNlcjsKKwkJCWlmIChmdW5jKQorCQkJCWZ1bmMoY2FsbCk7CisKKwkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCisJCQlfZGVidWcoIkBAQCBFbmQgQXR0ZW5kIENhbGwgJXAiLCBjYWxsKTsKKwkJfQorCisJfSB3aGlsZSghZGllKTsKKworCS8qIGFuZCB0aGF0J3MgYWxsICovCisJY29tcGxldGVfYW5kX2V4aXQoJmthZnNjbWRfZGVhZCwgMCk7CisKK30gLyogZW5kIGthZnNjbWQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaGFuZGxlIGEgY2FsbCBjb21pbmcgaW4gdG8gdGhlIGNhY2hlIG1hbmFnZXIKKyAqIC0gaWYgSSB3YW50IHRvIGtlZXAgdGhlIGNhbGwsIEkgbXVzdCBpbmNyZW1lbnQgaXRzIHVzYWdlIGNvdW50CisgKiAtIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBuZWdhdGVkIGFuZCBwYXNzZWQgYmFjayBpbiBhbiBhYm9ydCBwYWNrZXQgaWYKKyAqICAgbm9uLXplcm8KKyAqIC0gc2VyaWFsaXNlZCBieSB2aXJ0dWUgb2YgdGhlcmUgb25seSBiZWluZyBvbmUga3J4aW9kCisgKi8KK3N0YXRpYyBpbnQgYWZzY21fbmV3X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJX2VudGVyKCIlcHtjaWQ9JXUgdT0lZH0iLAorCSAgICAgICBjYWxsLCBudG9obChjYWxsLT5jYWxsX2lkKSwgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSk7CisKKwlyeHJwY19nZXRfY2FsbChjYWxsKTsKKworCS8qIGFkZCB0byBteSBjdXJyZW50IGNhbGwgbGlzdCAqLworCXNwaW5fbG9jaygmYWZzY21fY2FsbHNfbG9jayk7CisJbGlzdF9hZGQoJmNhbGwtPmFwcF9saW5rLCZhZnNjbV9jYWxscyk7CisJc3Bpbl91bmxvY2soJmFmc2NtX2NhbGxzX2xvY2spOworCisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7CisKK30gLyogZW5kIGFmc2NtX25ld19jYWxsKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHF1ZXVlIG9uIHRoZSBrYWZzY21kIHF1ZXVlIGZvciBhdHRlbnRpb24KKyAqLworc3RhdGljIHZvaWQgYWZzY21fYXR0ZW50aW9uKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCV9lbnRlcigiJXB7Y2lkPSV1IHU9JWR9IiwKKwkgICAgICAgY2FsbCwgbnRvaGwoY2FsbC0+Y2FsbF9pZCksIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkpOworCisJc3Bpbl9sb2NrKCZrYWZzY21kX2F0dGVudGlvbl9sb2NrKTsKKworCWlmIChsaXN0X2VtcHR5KCZjYWxsLT5hcHBfYXR0bl9saW5rKSkgeworCQlsaXN0X2FkZF90YWlsKCZjYWxsLT5hcHBfYXR0bl9saW5rLCAma2Fmc2NtZF9hdHRlbnRpb25fbGlzdCk7CisJCXJ4cnBjX2dldF9jYWxsKGNhbGwpOworCX0KKworCXNwaW5fdW5sb2NrKCZrYWZzY21kX2F0dGVudGlvbl9sb2NrKTsKKworCXdha2VfdXAoJmthZnNjbWRfc2xlZXBxKTsKKworCV9sZWF2ZSgiIHt1PSVkfSIsIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkpOworfSAvKiBlbmQgYWZzY21fYXR0ZW50aW9uKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGhhbmRsZSBteSBjYWxsIGJlaW5nIGFib3J0ZWQKKyAqIC0gY2xlYW4gdXAsIGRlcXVldWUgYW5kIHB1dCBteSByZWYgdG8gdGhlIGNhbGwKKyAqLworc3RhdGljIHZvaWQgYWZzY21fZXJyb3Ioc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJaW50IHJlbW92ZWQ7CisKKwlfZW50ZXIoIiVwe2VzdD0lcyBhYz0ldSBlcj0lZH0iLAorCSAgICAgICBjYWxsLAorCSAgICAgICByeHJwY19jYWxsX2Vycm9yX3N0YXRlc1tjYWxsLT5hcHBfZXJyX3N0YXRlXSwKKwkgICAgICAgY2FsbC0+YXBwX2Fib3J0X2NvZGUsCisJICAgICAgIGNhbGwtPmFwcF9lcnJubyk7CisKKwlzcGluX2xvY2soJmthZnNjbWRfYXR0ZW50aW9uX2xvY2spOworCisJaWYgKGxpc3RfZW1wdHkoJmNhbGwtPmFwcF9hdHRuX2xpbmspKSB7CisJCWxpc3RfYWRkX3RhaWwoJmNhbGwtPmFwcF9hdHRuX2xpbmssICZrYWZzY21kX2F0dGVudGlvbl9saXN0KTsKKwkJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisJfQorCisJc3Bpbl91bmxvY2soJmthZnNjbWRfYXR0ZW50aW9uX2xvY2spOworCisJcmVtb3ZlZCA9IDA7CisJc3Bpbl9sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmNhbGwtPmFwcF9saW5rKSkgeworCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5hcHBfbGluayk7CisJCXJlbW92ZWQgPSAxOworCX0KKwlzcGluX3VubG9jaygmYWZzY21fY2FsbHNfbG9jayk7CisKKwlpZiAocmVtb3ZlZCkKKwkJcnhycGNfcHV0X2NhbGwoY2FsbCk7CisKKwl3YWtlX3VwKCZrYWZzY21kX3NsZWVwcSk7CisKKwlfbGVhdmUoIiIpOworfSAvKiBlbmQgYWZzY21fZXJyb3IoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbWFwIGFmcyBhYm9ydCBjb2RlcyB0by9mcm9tIExpbnV4IGVycm9yIGNvZGVzCisgKiAtIGNhbGxlZCB3aXRoIGNhbGwtPmxvY2sgaGVsZAorICovCitzdGF0aWMgdm9pZCBhZnNjbV9hZW1hcChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlzd2l0Y2ggKGNhbGwtPmFwcF9lcnJfc3RhdGUpIHsKKwljYXNlIFJYUlBDX0VTVEFURV9MT0NBTF9BQk9SVDoKKwkJY2FsbC0+YXBwX2Fib3J0X2NvZGUgPSAtY2FsbC0+YXBwX2Vycm5vOworCQlicmVhazsKKwljYXNlIFJYUlBDX0VTVEFURV9QRUVSX0FCT1JUOgorCQljYWxsLT5hcHBfZXJybm8gPSAtRUNPTk5BQk9SVEVEOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9IC8qIGVuZCBhZnNjbV9hZW1hcCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBzdGFydCB0aGUgY2FjaGUgbWFuYWdlciBzZXJ2aWNlIGlmIG5vdCBhbHJlYWR5IHN0YXJ0ZWQKKyAqLworaW50IGFmc2NtX3N0YXJ0KHZvaWQpCit7CisJaW50IHJldDsKKworCWRvd25fd3JpdGUoJmFmc2NtX3NlbSk7CisJaWYgKCFhZnNjbV91c2FnZSkgeworCQlyZXQgPSBrZXJuZWxfdGhyZWFkKGthZnNjbWQsIE5VTEwsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmthZnNjbWRfYWxpdmUpOworCisJCXJldCA9IHJ4cnBjX2FkZF9zZXJ2aWNlKGFmc190cmFuc3BvcnQsICZBRlNDTV9zZXJ2aWNlKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGtpbGw7CisKKwkJYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoJmFmc19tbnRwdF9leHBpcnlfdGltZXIsCisJCQkJCWFmc19tbnRwdF9leHBpcnlfdGltZW91dCAqIEhaKTsKKwl9CisKKwlhZnNjbV91c2FnZSsrOworCXVwX3dyaXRlKCZhZnNjbV9zZW0pOworCisJcmV0dXJuIDA7CisKKyBraWxsOgorCWthZnNjbWRfZGllID0gMTsKKwl3YWtlX3VwKCZrYWZzY21kX3NsZWVwcSk7CisJd2FpdF9mb3JfY29tcGxldGlvbigma2Fmc2NtZF9kZWFkKTsKKworIG91dDoKKwl1cF93cml0ZSgmYWZzY21fc2VtKTsKKwlyZXR1cm4gcmV0OworCit9IC8qIGVuZCBhZnNjbV9zdGFydCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBzdG9wIHRoZSBjYWNoZSBtYW5hZ2VyIHNlcnZpY2UKKyAqLwordm9pZCBhZnNjbV9zdG9wKHZvaWQpCit7CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CisKKwlkb3duX3dyaXRlKCZhZnNjbV9zZW0pOworCisJQlVHX09OKGFmc2NtX3VzYWdlID09IDApOworCWFmc2NtX3VzYWdlLS07CisKKwlpZiAoYWZzY21fdXNhZ2UgPT0gMCkgeworCQkvKiBkb24ndCB3YW50IG1vcmUgaW5jb21pbmcgY2FsbHMgKi8KKwkJcnhycGNfZGVsX3NlcnZpY2UoYWZzX3RyYW5zcG9ydCwgJkFGU0NNX3NlcnZpY2UpOworCisJCS8qIGFib3J0IGFueSBjYWxscyBJJ3ZlIHN0aWxsIGdvdCBvcGVuICh0aGUgYWZzY21fZXJyb3IoKSB3aWxsCisJCSAqIGRlcXVldWUgdGhlbSkgKi8KKwkJc3Bpbl9sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKKwkJd2hpbGUgKCFsaXN0X2VtcHR5KCZhZnNjbV9jYWxscykpIHsKKwkJCWNhbGwgPSBsaXN0X2VudHJ5KGFmc2NtX2NhbGxzLm5leHQsCisJCQkJCSAgc3RydWN0IHJ4cnBjX2NhbGwsCisJCQkJCSAgYXBwX2xpbmspOworCisJCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5hcHBfbGluayk7CisJCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKKwkJCXNwaW5fdW5sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKKworCQkJcnhycGNfY2FsbF9hYm9ydChjYWxsLCAtRVNSQ0gpOyAvKiBhYm9ydCwgZGVxdWV1ZSBhbmQKKwkJCQkJCQkgKiBwdXQgKi8KKworCQkJX2RlYnVnKCJudWtpbmcgYWN0aXZlIGNhbGwgJTA4eC4lZCIsCisJCQkgICAgICAgbnRvaGwoY2FsbC0+Y29ubi0+Y29ubl9pZCksCisJCQkgICAgICAgbnRvaGwoY2FsbC0+Y2FsbF9pZCkpOworCQkJcnhycGNfcHV0X2NhbGwoY2FsbCk7CisJCQlyeHJwY19wdXRfY2FsbChjYWxsKTsKKworCQkJc3Bpbl9sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKKwkJfQorCQlzcGluX3VubG9jaygmYWZzY21fY2FsbHNfbG9jayk7CisKKwkJLyogZ2V0IHJpZCBvZiBteSBkYWVtb24gKi8KKwkJa2Fmc2NtZF9kaWUgPSAxOworCQl3YWtlX3VwKCZrYWZzY21kX3NsZWVwcSk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmthZnNjbWRfZGVhZCk7CisKKwkJLyogZGlzcG9zZSBvZiBhbnkgY2FsbHMgd2FpdGluZyBmb3IgYXR0ZW50aW9uICovCisJCXNwaW5fbG9jaygma2Fmc2NtZF9hdHRlbnRpb25fbG9jayk7CisJCXdoaWxlICghbGlzdF9lbXB0eSgma2Fmc2NtZF9hdHRlbnRpb25fbGlzdCkpIHsKKwkJCWNhbGwgPSBsaXN0X2VudHJ5KGthZnNjbWRfYXR0ZW50aW9uX2xpc3QubmV4dCwKKwkJCQkJICBzdHJ1Y3QgcnhycGNfY2FsbCwKKwkJCQkJICBhcHBfYXR0bl9saW5rKTsKKworCQkJbGlzdF9kZWxfaW5pdCgmY2FsbC0+YXBwX2F0dG5fbGluayk7CisJCQlzcGluX3VubG9jaygma2Fmc2NtZF9hdHRlbnRpb25fbG9jayk7CisKKwkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCisJCQlzcGluX2xvY2soJmthZnNjbWRfYXR0ZW50aW9uX2xvY2spOworCQl9CisJCXNwaW5fdW5sb2NrKCZrYWZzY21kX2F0dGVudGlvbl9sb2NrKTsKKworCQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmYWZzX21udHB0X2V4cGlyeV90aW1lcik7CisJfQorCisJdXBfd3JpdGUoJmFmc2NtX3NlbSk7CisKK30gLyogZW5kIGFmc2NtX3N0b3AoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaGFuZGxlIHRoZSBmaWxlc2VydmVyIGJyZWFraW5nIGEgc2V0IG9mIGNhbGxiYWNrcworICovCitzdGF0aWMgdm9pZCBfU1JYQUZTQ01fQ2FsbEJhY2soc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKwlzaXplX3QgY291bnQsIHF0eSwgdG1wOworCWludCByZXQgPSAwLCByZW1vdmVkOworCisJX2VudGVyKCIlcHthY3M9JXN9IiwgY2FsbCwgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+YXBwX2NhbGxfc3RhdGVdKTsKKworCXNlcnZlciA9IGFmc19zZXJ2ZXJfZ2V0X2Zyb21fcGVlcihjYWxsLT5jb25uLT5wZWVyKTsKKworCXN3aXRjaCAoY2FsbC0+YXBwX2NhbGxfc3RhdGUpIHsKKwkJLyogd2UndmUgcmVjZWl2ZWQgdGhlIGxhc3QgcGFja2V0CisJCSAqIC0gZHJhaW4gYWxsIHRoZSBkYXRhIGZyb20gdGhlIGNhbGwgYW5kIHNlbmQgdGhlIHJlcGx5CisJCSAqLworCWNhc2UgUlhSUENfQ1NUQVRFX1NSVlJfR09UX0FSR1M6CisJCXJldCA9IC1FQkFETVNHOworCQlxdHkgPSBjYWxsLT5hcHBfcmVhZHlfcXR5OworCQlpZiAocXR5IDwgOCB8fCBxdHkgPiA1MCAqICg2ICogNCkgKyA4KQorCQkJYnJlYWs7CisKKwkJeworCQkJc3RydWN0IGFmc19jYWxsYmFjayAqY2IsICpwY2I7CisJCQlpbnQgbG9vcDsKKwkJCV9fYmUzMiAqZnAsICpicDsKKworCQkJZnAgPSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goY2FsbCwgcXR5KTsKKworCQkJLyogZHJhZyB0aGUgZW50aXJlIGFyZ3VtZW50IGJsb2NrIG91dCB0byB0aGUgc2NyYXRjaAorCQkJICogc3BhY2UgKi8KKwkJCXJldCA9IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwsIGZwLCBxdHksIDApOworCQkJaWYgKHJldCA8IDApCisJCQkJYnJlYWs7CisKKwkJCS8qIGFuZCB1bm1hcnNoYWxsIHRoZSBwYXJhbWV0ZXIgYmxvY2sgKi8KKwkJCXJldCA9IC1FQkFETVNHOworCQkJY291bnQgPSBudG9obCgqZnArKyk7CisJCQlpZiAoY291bnQ+QUZTQ0JNQVggfHwKKwkJCSAgICAoY291bnQgKiAoMyAqIDQpICsgOCAhPSBxdHkgJiYKKwkJCSAgICAgY291bnQgKiAoNiAqIDQpICsgOCAhPSBxdHkpKQorCQkJCWJyZWFrOworCisJCQlicCA9IGZwICsgY291bnQqMzsKKwkJCXRtcCA9IG50b2hsKCpicCsrKTsKKwkJCWlmICh0bXAgPiAwICYmIHRtcCAhPSBjb3VudCkKKwkJCQlicmVhazsKKwkJCWlmICh0bXAgPT0gMCkKKwkJCQlicCA9IE5VTEw7CisKKwkJCXBjYiA9IGNiID0gcnhycGNfY2FsbF9hbGxvY19zY3JhdGNoX3MoCisJCQkJY2FsbCwgc3RydWN0IGFmc19jYWxsYmFjayk7CisKKwkJCWZvciAobG9vcCA9IGNvdW50IC0gMTsgbG9vcCA+PSAwOyBsb29wLS0pIHsKKwkJCQlwY2ItPmZpZC52aWQJPSBudG9obCgqZnArKyk7CisJCQkJcGNiLT5maWQudm5vZGUJPSBudG9obCgqZnArKyk7CisJCQkJcGNiLT5maWQudW5pcXVlCT0gbnRvaGwoKmZwKyspOworCQkJCWlmIChicCkgeworCQkJCQlwY2ItPnZlcnNpb24JPSBudG9obCgqYnArKyk7CisJCQkJCXBjYi0+ZXhwaXJ5CT0gbnRvaGwoKmJwKyspOworCQkJCQlwY2ItPnR5cGUJPSBudG9obCgqYnArKyk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlwY2ItPnZlcnNpb24JPSAwOworCQkJCQlwY2ItPmV4cGlyeQk9IDA7CisJCQkJCXBjYi0+dHlwZQk9IEFGU0NNX0NCX1VOVFlQRUQ7CisJCQkJfQorCQkJCXBjYisrOworCQkJfQorCisJCQkvKiBpbnZva2UgdGhlIGFjdHVhbCBzZXJ2aWNlIHJvdXRpbmUgKi8KKwkJCXJldCA9IFNSWEFGU0NNX0NhbGxCYWNrKHNlcnZlciwgY291bnQsIGNiKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJLyogc2VuZCB0aGUgcmVwbHkgKi8KKwkJcmV0ID0gcnhycGNfY2FsbF93cml0ZV9kYXRhKGNhbGwsIDAsIE5VTEwsIFJYUlBDX0xBU1RfUEFDS0VULAorCQkJCQkgICAgR0ZQX0tFUk5FTCwgMCwgJmNvdW50KTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwkJYnJlYWs7CisKKwkJLyogb3BlcmF0aW9uIGNvbXBsZXRlICovCisJY2FzZSBSWFJQQ19DU1RBVEVfQ09NUExFVEU6CisJCWNhbGwtPmFwcF91c2VyID0gTlVMTDsKKwkJcmVtb3ZlZCA9IDA7CisJCXNwaW5fbG9jaygmYWZzY21fY2FsbHNfbG9jayk7CisJCWlmICghbGlzdF9lbXB0eSgmY2FsbC0+YXBwX2xpbmspKSB7CisJCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5hcHBfbGluayk7CisJCQlyZW1vdmVkID0gMTsKKwkJfQorCQlzcGluX3VubG9jaygmYWZzY21fY2FsbHNfbG9jayk7CisKKwkJaWYgKHJlbW92ZWQpCisJCQlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwkJYnJlYWs7CisKKwkJLyogb3BlcmF0aW9uIHRlcm1pbmF0ZWQgb24gZXJyb3IgKi8KKwljYXNlIFJYUlBDX0NTVEFURV9FUlJPUjoKKwkJY2FsbC0+YXBwX3VzZXIgPSBOVUxMOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmIChyZXQgPCAwKQorCQlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIHJldCk7CisKKwlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisKK30gLyogZW5kIF9TUlhBRlNDTV9DYWxsQmFjaygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBoYW5kbGUgdGhlIGZpbGVzZXJ2ZXIgYXNraW5nIHVzIHRvIGluaXRpYWxpc2Ugb3VyIGNhbGxiYWNrIHN0YXRlCisgKi8KK3N0YXRpYyB2b2lkIF9TUlhBRlNDTV9Jbml0Q2FsbEJhY2tTdGF0ZShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCXNpemVfdCBjb3VudDsKKwlpbnQgcmV0ID0gMCwgcmVtb3ZlZDsKKworCV9lbnRlcigiJXB7YWNzPSVzfSIsIGNhbGwsIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPmFwcF9jYWxsX3N0YXRlXSk7CisKKwlzZXJ2ZXIgPSBhZnNfc2VydmVyX2dldF9mcm9tX3BlZXIoY2FsbC0+Y29ubi0+cGVlcik7CisKKwlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7CisJCS8qIHdlJ3ZlIHJlY2VpdmVkIHRoZSBsYXN0IHBhY2tldCAtIGRyYWluIGFsbCB0aGUgZGF0YSBmcm9tIHRoZQorCQkgKiBjYWxsICovCisJY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9HT1RfQVJHUzoKKwkJLyogc2hvdWxkbid0IGJlIGFueSBhcmdzICovCisJCXJldCA9IC1FQkFETVNHOworCQlicmVhazsKKworCQkvKiBzZW5kIHRoZSByZXBseSB3aGVuIGFza2VkIGZvciBpdCAqLworCWNhc2UgUlhSUENfQ1NUQVRFX1NSVlJfU05EX1JFUExZOgorCQkvKiBpbnZva2UgdGhlIGFjdHVhbCBzZXJ2aWNlIHJvdXRpbmUgKi8KKwkJcmV0ID0gU1JYQUZTQ01fSW5pdENhbGxCYWNrU3RhdGUoc2VydmVyKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKworCQlyZXQgPSByeHJwY19jYWxsX3dyaXRlX2RhdGEoY2FsbCwgMCwgTlVMTCwgUlhSUENfTEFTVF9QQUNLRVQsCisJCQkJCSAgICBHRlBfS0VSTkVMLCAwLCAmY291bnQpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCQlicmVhazsKKworCQkvKiBvcGVyYXRpb24gY29tcGxldGUgKi8KKwljYXNlIFJYUlBDX0NTVEFURV9DT01QTEVURToKKwkJY2FsbC0+YXBwX3VzZXIgPSBOVUxMOworCQlyZW1vdmVkID0gMDsKKwkJc3Bpbl9sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5hcHBfbGluaykpIHsKKwkJCWxpc3RfZGVsX2luaXQoJmNhbGwtPmFwcF9saW5rKTsKKwkJCXJlbW92ZWQgPSAxOworCQl9CisJCXNwaW5fdW5sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKKworCQlpZiAocmVtb3ZlZCkKKwkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCQlicmVhazsKKworCQkvKiBvcGVyYXRpb24gdGVybWluYXRlZCBvbiBlcnJvciAqLworCWNhc2UgUlhSUENfQ1NUQVRFX0VSUk9SOgorCQljYWxsLT5hcHBfdXNlciA9IE5VTEw7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKHJldCA8IDApCisJCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKKworCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKworfSAvKiBlbmQgX1NSWEFGU0NNX0luaXRDYWxsQmFja1N0YXRlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGhhbmRsZSBhIHByb2JlIGZyb20gYSBmaWxlc2VydmVyCisgKi8KK3N0YXRpYyB2b2lkIF9TUlhBRlNDTV9Qcm9iZShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCXNpemVfdCBjb3VudDsKKwlpbnQgcmV0ID0gMCwgcmVtb3ZlZDsKKworCV9lbnRlcigiJXB7YWNzPSVzfSIsIGNhbGwsIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPmFwcF9jYWxsX3N0YXRlXSk7CisKKwlzZXJ2ZXIgPSBhZnNfc2VydmVyX2dldF9mcm9tX3BlZXIoY2FsbC0+Y29ubi0+cGVlcik7CisKKwlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7CisJCS8qIHdlJ3ZlIHJlY2VpdmVkIHRoZSBsYXN0IHBhY2tldCAtIGRyYWluIGFsbCB0aGUgZGF0YSBmcm9tIHRoZQorCQkgKiBjYWxsICovCisJY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9HT1RfQVJHUzoKKwkJLyogc2hvdWxkbid0IGJlIGFueSBhcmdzICovCisJCXJldCA9IC1FQkFETVNHOworCQlicmVhazsKKworCQkvKiBzZW5kIHRoZSByZXBseSB3aGVuIGFza2VkIGZvciBpdCAqLworCWNhc2UgUlhSUENfQ1NUQVRFX1NSVlJfU05EX1JFUExZOgorCQkvKiBpbnZva2UgdGhlIGFjdHVhbCBzZXJ2aWNlIHJvdXRpbmUgKi8KKwkJcmV0ID0gU1JYQUZTQ01fUHJvYmUoc2VydmVyKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKworCQlyZXQgPSByeHJwY19jYWxsX3dyaXRlX2RhdGEoY2FsbCwgMCwgTlVMTCwgUlhSUENfTEFTVF9QQUNLRVQsCisJCQkJCSAgICBHRlBfS0VSTkVMLCAwLCAmY291bnQpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCQlicmVhazsKKworCQkvKiBvcGVyYXRpb24gY29tcGxldGUgKi8KKwljYXNlIFJYUlBDX0NTVEFURV9DT01QTEVURToKKwkJY2FsbC0+YXBwX3VzZXIgPSBOVUxMOworCQlyZW1vdmVkID0gMDsKKwkJc3Bpbl9sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5hcHBfbGluaykpIHsKKwkJCWxpc3RfZGVsX2luaXQoJmNhbGwtPmFwcF9saW5rKTsKKwkJCXJlbW92ZWQgPSAxOworCQl9CisJCXNwaW5fdW5sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKKworCQlpZiAocmVtb3ZlZCkKKwkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCQlicmVhazsKKworCQkvKiBvcGVyYXRpb24gdGVybWluYXRlZCBvbiBlcnJvciAqLworCWNhc2UgUlhSUENfQ1NUQVRFX0VSUk9SOgorCQljYWxsLT5hcHBfdXNlciA9IE5VTEw7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKHJldCA8IDApCisJCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKKworCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKworfSAvKiBlbmQgX1NSWEFGU0NNX1Byb2JlKCkgKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9jbXNlcnZpY2UuaCBiL2ZzL2Fmcy9jbXNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjhkNGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL2Ntc2VydmljZS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIGNtc2VydmljZS5oOiBBRlMgQ2FjaGUgTWFuYWdlciBTZXJ2aWNlIGRlY2xhcmF0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9BRlNfQ01TRVJWSUNFX0gKKyNkZWZpbmUgX0xJTlVYX0FGU19DTVNFUlZJQ0VfSAorCisjaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSAidHlwZXMuaCIKKworLyogY2FjaGUgbWFuYWdlciBzdGFydC9zdG9wICovCitleHRlcm4gaW50IGFmc2NtX3N0YXJ0KHZvaWQpOworZXh0ZXJuIHZvaWQgYWZzY21fc3RvcCh2b2lkKTsKKworLyogY2FjaGUgbWFuYWdlciBzZXJ2ZXIgZnVuY3Rpb25zICovCitleHRlcm4gaW50IFNSWEFGU0NNX0luaXRDYWxsQmFja1N0YXRlKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIpOworZXh0ZXJuIGludCBTUlhBRlNDTV9DYWxsQmFjayhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkJICAgICBzaXplX3QgY291bnQsCisJCQkgICAgIHN0cnVjdCBhZnNfY2FsbGJhY2sgY2FsbGJhY2tzW10pOworZXh0ZXJuIGludCBTUlhBRlNDTV9Qcm9iZShzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKTsKKworI2VuZGlmIC8qIF9MSU5VWF9BRlNfQ01TRVJWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9kaXIuYyBiL2ZzL2Fmcy9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjgyZDZkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL2Rpci5jCkBAIC0wLDAgKzEsNjY2IEBACisvKiBkaXIuYzogQUZTIGZpbGVzeXN0ZW0gZGlyZWN0b3J5IGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlICJ2bm9kZS5oIgorI2luY2x1ZGUgInZvbHVtZS5oIgorI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KKyNpbmNsdWRlICJzdXBlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICphZnNfZGlyX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpOworc3RhdGljIGludCBhZnNfZGlyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBhZnNfZGlyX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpOworc3RhdGljIGludCBhZnNfZF9yZXZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpOworc3RhdGljIGludCBhZnNfZF9kZWxldGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKK3N0YXRpYyBpbnQgYWZzX2Rpcl9sb29rdXBfZmlsbGRpcih2b2lkICpfY29va2llLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmxlbiwKKwkJCQkgIGxvZmZfdCBmcG9zLCBpbm9fdCBpbm8sIHVuc2lnbmVkIGR0eXBlKTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZnNfZGlyX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBhZnNfZGlyX29wZW4sCisJLnJlYWRkaXIJPSBhZnNfZGlyX3JlYWRkaXIsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBhZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmxvb2t1cAkJPSBhZnNfZGlyX2xvb2t1cCwKKwkuZ2V0YXR0cgk9IGFmc19pbm9kZV9nZXRhdHRyLAorI2lmIDAgLyogVE9ETyAqLworCS5jcmVhdGUJCT0gYWZzX2Rpcl9jcmVhdGUsCisJLmxpbmsJCT0gYWZzX2Rpcl9saW5rLAorCS51bmxpbmsJCT0gYWZzX2Rpcl91bmxpbmssCisJLnN5bWxpbmsJPSBhZnNfZGlyX3N5bWxpbmssCisJLm1rZGlyCQk9IGFmc19kaXJfbWtkaXIsCisJLnJtZGlyCQk9IGFmc19kaXJfcm1kaXIsCisJLm1rbm9kCQk9IGFmc19kaXJfbWtub2QsCisJLnJlbmFtZQkJPSBhZnNfZGlyX3JlbmFtZSwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBhZnNfZnNfZGVudHJ5X29wZXJhdGlvbnMgPSB7CisJLmRfcmV2YWxpZGF0ZQk9IGFmc19kX3JldmFsaWRhdGUsCisJLmRfZGVsZXRlCT0gYWZzX2RfZGVsZXRlLAorfTsKKworI2RlZmluZSBBRlNfRElSX0hBU0hUQkxfU0laRQkxMjgKKyNkZWZpbmUgQUZTX0RJUl9ESVJFTlRfU0laRQkzMgorI2RlZmluZSBBRlNfRElSRU5UX1BFUl9CTE9DSwk2NAorCit1bmlvbiBhZnNfZGlyZW50IHsKKwlzdHJ1Y3QgeworCQl1aW50OF90CQl2YWxpZDsKKwkJdWludDhfdAkJdW51c2VkWzFdOworCQlfX2JlMTYJCWhhc2hfbmV4dDsKKwkJX19iZTMyCQl2bm9kZTsKKwkJX19iZTMyCQl1bmlxdWU7CisJCXVpbnQ4X3QJCW5hbWVbMTZdOworCQl1aW50OF90CQlvdmVyZmxvd1s0XTsJLyogaWYgYW55IGNoYXIgb2YgdGhlIG5hbWUgKGluYworCQkJCQkJICogTlVMKSByZWFjaGVzIGhlcmUsIGNvbnN1bWUKKwkJCQkJCSAqIHRoZSBuZXh0IGRpcmVudCB0b28gKi8KKwl9IHU7CisJdWludDhfdAlleHRlbmRlZF9uYW1lWzMyXTsKK307CisKKy8qIEFGUyBkaXJlY3RvcnkgcGFnZSBoZWFkZXIgKG9uZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IDIwNDgtYnl0ZSBjaHVuaykgKi8KK3N0cnVjdCBhZnNfZGlyX3BhZ2VoZHIgeworCV9fYmUxNgkJbnBhZ2VzOworCV9fYmUxNgkJbWFnaWM7CisjZGVmaW5lIEFGU19ESVJfTUFHSUMgaHRvbnMoMTIzNCkKKwl1aW50OF90CQluZW50cmllczsKKwl1aW50OF90CQliaXRtYXBbOF07CisJdWludDhfdAkJcGFkWzE5XTsKK307CisKKy8qIGRpcmVjdG9yeSBibG9jayBsYXlvdXQgKi8KK3VuaW9uIGFmc19kaXJfYmxvY2sgeworCisJc3RydWN0IGFmc19kaXJfcGFnZWhkciBwYWdlaGRyOworCisJc3RydWN0IHsKKwkJc3RydWN0IGFmc19kaXJfcGFnZWhkcglwYWdlaGRyOworCQl1aW50OF90CQkJYWxsb2NfY3Ryc1sxMjhdOworCQkvKiBkaXIgaGFzaCB0YWJsZSAqLworCQl1aW50MTZfdAkJaGFzaHRhYmxlW0FGU19ESVJfSEFTSFRCTF9TSVpFXTsKKwl9IGhkcjsKKworCXVuaW9uIGFmc19kaXJlbnQgZGlyZW50c1tBRlNfRElSRU5UX1BFUl9CTE9DS107Cit9OworCisvKiBsYXlvdXQgb24gYSBsaW51eCBWTSBwYWdlICovCitzdHJ1Y3QgYWZzX2Rpcl9wYWdlIHsKKwl1bmlvbiBhZnNfZGlyX2Jsb2NrIGJsb2Nrc1tQQUdFX1NJWkUgLyBzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jayldOworfTsKKworc3RydWN0IGFmc19kaXJfbG9va3VwX2Nvb2tpZSB7CisJc3RydWN0IGFmc19maWQJZmlkOworCWNvbnN0IGNoYXIJKm5hbWU7CisJc2l6ZV90CQlubGVuOworCWludAkJZm91bmQ7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY2hlY2sgdGhhdCBhIGRpcmVjdG9yeSBwYWdlIGlzIHZhbGlkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhZnNfZGlyX2NoZWNrX3BhZ2Uoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBhZnNfZGlyX3BhZ2UgKmRidWY7CisJbG9mZl90IGxhdHRlcjsKKwlpbnQgdG1wLCBxdHk7CisKKyNpZiAwCisJLyogY2hlY2sgdGhlIHBhZ2UgY291bnQgKi8KKwlxdHkgPSBkZXNjLnNpemUgLyBzaXplb2YoZGJ1Zi0+YmxvY2tzWzBdKTsKKwlpZiAocXR5ID09IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAocGFnZS0+aW5kZXg9PTAgJiYgcXR5IT1udG9ocyhkYnVmLT5ibG9ja3NbMF0ucGFnZWhkci5ucGFnZXMpKSB7CisJCXByaW50aygia0FGUzogJXMoJWx1KTogd3JvbmcgbnVtYmVyIG9mIGRpciBibG9ja3MgJWQhPSVodVxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXyxkaXItPmlfaW5vLHF0eSxudG9ocyhkYnVmLT5ibG9ja3NbMF0ucGFnZWhkci5ucGFnZXMpKTsKKwkJZ290byBlcnJvcjsKKwl9CisjZW5kaWYKKworCS8qIGRldGVybWluZSBob3cgbWFueSBtYWdpYyBudW1iZXJzIHRoZXJlIHNob3VsZCBiZSBpbiB0aGlzIHBhZ2UgKi8KKwlsYXR0ZXIgPSBkaXItPmlfc2l6ZSAtIChwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKTsKKwlpZiAobGF0dGVyID49IFBBR0VfU0laRSkKKwkJcXR5ID0gUEFHRV9TSVpFOworCWVsc2UKKwkJcXR5ID0gbGF0dGVyOworCXF0eSAvPSBzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jayk7CisKKwkvKiBjaGVjayB0aGVtICovCisJZGJ1ZiA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwlmb3IgKHRtcCA9IDA7IHRtcCA8IHF0eTsgdG1wKyspIHsKKwkJaWYgKGRidWYtPmJsb2Nrc1t0bXBdLnBhZ2VoZHIubWFnaWMgIT0gQUZTX0RJUl9NQUdJQykgeworCQkJcHJpbnRrKCJrQUZTOiAlcyglbHUpOiBiYWQgbWFnaWMgJWQvJWQgaXMgJTA0aHhcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBkaXItPmlfaW5vLCB0bXAsIHF0eSwKKwkJCSAgICAgICBudG9ocyhkYnVmLT5ibG9ja3NbdG1wXS5wYWdlaGRyLm1hZ2ljKSk7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJU2V0UGFnZUNoZWNrZWQocGFnZSk7CisJcmV0dXJuOworCisgZXJyb3I6CisJU2V0UGFnZUNoZWNrZWQocGFnZSk7CisJU2V0UGFnZUVycm9yKHBhZ2UpOworCit9IC8qIGVuZCBhZnNfZGlyX2NoZWNrX3BhZ2UoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZGlzY2FyZCBhIHBhZ2UgY2FjaGVkIGluIHRoZSBwYWdlY2FjaGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGFmc19kaXJfcHV0X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJa3VubWFwKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKworfSAvKiBlbmQgYWZzX2Rpcl9wdXRfcGFnZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBnZXQgYSBwYWdlIGludG8gdGhlIHBhZ2VjYWNoZQorICovCitzdGF0aWMgc3RydWN0IHBhZ2UgKmFmc19kaXJfZ2V0X3BhZ2Uoc3RydWN0IGlub2RlICpkaXIsIHVuc2lnbmVkIGxvbmcgaW5kZXgpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlfZW50ZXIoInslbHV9LCVsdSIsIGRpci0+aV9pbm8sIGluZGV4KTsKKworCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UoZGlyLT5pX21hcHBpbmcsaW5kZXgsCisJCQkgICAgICAgKGZpbGxlcl90ICopIGRpci0+aV9tYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsCisJCQkgICAgICAgTlVMTCk7CisJaWYgKCFJU19FUlIocGFnZSkpIHsKKwkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKwkJa21hcChwYWdlKTsKKwkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpCisJCQlnb3RvIGZhaWw7CisJCWlmICghUGFnZUNoZWNrZWQocGFnZSkpCisJCQlhZnNfZGlyX2NoZWNrX3BhZ2UoZGlyLCBwYWdlKTsKKwkJaWYgKFBhZ2VFcnJvcihwYWdlKSkKKwkJCWdvdG8gZmFpbDsKKwl9CisJcmV0dXJuIHBhZ2U7CisKKyBmYWlsOgorCWFmc19kaXJfcHV0X3BhZ2UocGFnZSk7CisJcmV0dXJuIEVSUl9QVFIoLUVJTyk7Cit9IC8qIGVuZCBhZnNfZGlyX2dldF9wYWdlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIG9wZW4gYW4gQUZTIGRpcmVjdG9yeSBmaWxlCisgKi8KK3N0YXRpYyBpbnQgYWZzX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCV9lbnRlcigieyVsdX0iLCBpbm9kZS0+aV9pbm8pOworCisJQlVHX09OKHNpemVvZih1bmlvbiBhZnNfZGlyX2Jsb2NrKSAhPSAyMDQ4KTsKKwlCVUdfT04oc2l6ZW9mKHVuaW9uIGFmc19kaXJlbnQpICE9IDMyKTsKKworCWlmIChBRlNfRlNfSShpbm9kZSktPmZsYWdzICYgQUZTX1ZOT0RFX0RFTEVURUQpCisJCXJldHVybiAtRU5PRU5UOworCisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7CisKK30gLyogZW5kIGFmc19kaXJfb3BlbigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBkZWFsIHdpdGggb25lIGJsb2NrIGluIGFuIEFGUyBkaXJlY3RvcnkKKyAqLworc3RhdGljIGludCBhZnNfZGlyX2l0ZXJhdGVfYmxvY2sodW5zaWduZWQgKmZwb3MsCisJCQkJIHVuaW9uIGFmc19kaXJfYmxvY2sgKmJsb2NrLAorCQkJCSB1bnNpZ25lZCBibGtvZmYsCisJCQkJIHZvaWQgKmNvb2tpZSwKKwkJCQkgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJdW5pb24gYWZzX2RpcmVudCAqZGlyZTsKKwl1bnNpZ25lZCBvZmZzZXQsIG5leHQsIGN1cnI7CisJc2l6ZV90IG5sZW47CisJaW50IHRtcCwgcmV0OworCisJX2VudGVyKCIldSwleCwlcCwsIiwqZnBvcyxibGtvZmYsYmxvY2spOworCisJY3VyciA9ICgqZnBvcyAtIGJsa29mZikgLyBzaXplb2YodW5pb24gYWZzX2RpcmVudCk7CisKKwkvKiB3YWxrIHRocm91Z2ggdGhlIGJsb2NrLCBhbiBlbnRyeSBhdCBhIHRpbWUgKi8KKwlmb3IgKG9mZnNldCA9IEFGU19ESVJFTlRfUEVSX0JMT0NLIC0gYmxvY2stPnBhZ2VoZHIubmVudHJpZXM7CisJICAgICBvZmZzZXQgPCBBRlNfRElSRU5UX1BFUl9CTE9DSzsKKwkgICAgIG9mZnNldCA9IG5leHQKKwkgICAgICkgeworCQluZXh0ID0gb2Zmc2V0ICsgMTsKKworCQkvKiBza2lwIGVudHJpZXMgbWFya2VkIHVudXNlZCBpbiB0aGUgYml0bWFwICovCisJCWlmICghKGJsb2NrLT5wYWdlaGRyLmJpdG1hcFtvZmZzZXQgLyA4XSAmCisJCSAgICAgICgxIDw8IChvZmZzZXQgJSA4KSkpKSB7CisJCQlfZGVidWcoIkVOVFslWnUuJXVdOiB1bnVzZWRcbiIsCisJCQkgICAgICAgYmxrb2ZmIC8gc2l6ZW9mKHVuaW9uIGFmc19kaXJfYmxvY2spLCBvZmZzZXQpOworCQkJaWYgKG9mZnNldCA+PSBjdXJyKQorCQkJCSpmcG9zID0gYmxrb2ZmICsKKwkJCQkJbmV4dCAqIHNpemVvZih1bmlvbiBhZnNfZGlyZW50KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogZ290IGEgdmFsaWQgZW50cnkgKi8KKwkJZGlyZSA9ICZibG9jay0+ZGlyZW50c1tvZmZzZXRdOworCQlubGVuID0gc3RybmxlbihkaXJlLT51Lm5hbWUsCisJCQkgICAgICAgc2l6ZW9mKCpibG9jaykgLQorCQkJICAgICAgIG9mZnNldCAqIHNpemVvZih1bmlvbiBhZnNfZGlyZW50KSk7CisKKwkJX2RlYnVnKCJFTlRbJVp1LiV1XTogJXMgJVp1IFwiJXNcIlxuIiwKKwkJICAgICAgIGJsa29mZiAvIHNpemVvZih1bmlvbiBhZnNfZGlyX2Jsb2NrKSwgb2Zmc2V0LAorCQkgICAgICAgKG9mZnNldCA8IGN1cnIgPyAic2tpcCIgOiAiZmlsbCIpLAorCQkgICAgICAgbmxlbiwgZGlyZS0+dS5uYW1lKTsKKworCQkvKiB3b3JrIG91dCB3aGVyZSB0aGUgbmV4dCBwb3NzaWJsZSBlbnRyeSBpcyAqLworCQlmb3IgKHRtcCA9IG5sZW47IHRtcCA+IDE1OyB0bXAgLT0gc2l6ZW9mKHVuaW9uIGFmc19kaXJlbnQpKSB7CisJCQlpZiAobmV4dCA+PSBBRlNfRElSRU5UX1BFUl9CTE9DSykgeworCQkJCV9kZWJ1ZygiRU5UWyVadS4ldV06IgorCQkJCSAgICAgICAiICV1IHRyYXZlbGxlZCBiZXlvbmQgZW5kIGRpciBibG9jayIKKwkJCQkgICAgICAgIiAobGVuICV1LyVadSlcbiIsCisJCQkJICAgICAgIGJsa29mZiAvIHNpemVvZih1bmlvbiBhZnNfZGlyX2Jsb2NrKSwKKwkJCQkgICAgICAgb2Zmc2V0LCBuZXh0LCB0bXAsIG5sZW4pOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJaWYgKCEoYmxvY2stPnBhZ2VoZHIuYml0bWFwW25leHQgLyA4XSAmCisJCQkgICAgICAoMSA8PCAobmV4dCAlIDgpKSkpIHsKKwkJCQlfZGVidWcoIkVOVFslWnUuJXVdOiIKKwkJCQkgICAgICAgIiAldSB1bm1hcmtlZCBleHRlbnNpb24gKGxlbiAldS8lWnUpXG4iLAorCQkJCSAgICAgICBibGtvZmYgLyBzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jayksCisJCQkJICAgICAgIG9mZnNldCwgbmV4dCwgdG1wLCBubGVuKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKworCQkJX2RlYnVnKCJFTlRbJVp1LiV1XTogZXh0ICV1LyVadVxuIiwKKwkJCSAgICAgICBibGtvZmYgLyBzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jayksCisJCQkgICAgICAgbmV4dCwgdG1wLCBubGVuKTsKKwkJCW5leHQrKzsKKwkJfQorCisJCS8qIHNraXAgaWYgc3RhcnRzIGJlZm9yZSB0aGUgY3VycmVudCBwb3NpdGlvbiAqLworCQlpZiAob2Zmc2V0IDwgY3VycikKKwkJCWNvbnRpbnVlOworCisJCS8qIGZvdW5kIHRoZSBuZXh0IGVudHJ5ICovCisJCXJldCA9IGZpbGxkaXIoY29va2llLAorCQkJICAgICAgZGlyZS0+dS5uYW1lLAorCQkJICAgICAgbmxlbiwKKwkJCSAgICAgIGJsa29mZiArIG9mZnNldCAqIHNpemVvZih1bmlvbiBhZnNfZGlyZW50KSwKKwkJCSAgICAgIG50b2hsKGRpcmUtPnUudm5vZGUpLAorCQkJICAgICAgZmlsbGRpciA9PSBhZnNfZGlyX2xvb2t1cF9maWxsZGlyID8KKwkJCSAgICAgIG50b2hsKGRpcmUtPnUudW5pcXVlKSA6IERUX1VOS05PV04pOworCQlpZiAocmV0IDwgMCkgeworCQkJX2xlYXZlKCIgPSAwIFtmdWxsXSIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkqZnBvcyA9IGJsa29mZiArIG5leHQgKiBzaXplb2YodW5pb24gYWZzX2RpcmVudCk7CisJfQorCisJX2xlYXZlKCIgPSAxIFttb3JlXSIpOworCXJldHVybiAxOworfSAvKiBlbmQgYWZzX2Rpcl9pdGVyYXRlX2Jsb2NrKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHJlYWQgYW4gQUZTIGRpcmVjdG9yeQorICovCitzdGF0aWMgaW50IGFmc19kaXJfaXRlcmF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgdW5zaWduZWQgKmZwb3MsIHZvaWQgKmNvb2tpZSwKKwkJCSAgIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXVuaW9uIGFmc19kaXJfYmxvY2sJKmRibG9jazsKKwlzdHJ1Y3QgYWZzX2Rpcl9wYWdlICpkYnVmOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGJsa29mZiwgbGltaXQ7CisJaW50IHJldDsKKworCV9lbnRlcigieyVsdX0sJXUsLCIsIGRpci0+aV9pbm8sICpmcG9zKTsKKworCWlmIChBRlNfRlNfSShkaXIpLT5mbGFncyAmIEFGU19WTk9ERV9ERUxFVEVEKSB7CisJCV9sZWF2ZSgiID0gLUVTVEFMRSIpOworCQlyZXR1cm4gLUVTVEFMRTsKKwl9CisKKwkvKiByb3VuZCB0aGUgZmlsZSBwb3NpdGlvbiB1cCB0byB0aGUgbmV4dCBlbnRyeSBib3VuZGFyeSAqLworCSpmcG9zICs9IHNpemVvZih1bmlvbiBhZnNfZGlyZW50KSAtIDE7CisJKmZwb3MgJj0gfihzaXplb2YodW5pb24gYWZzX2RpcmVudCkgLSAxKTsKKworCS8qIHdhbGsgdGhyb3VnaCB0aGUgYmxvY2tzIGluIHNlcXVlbmNlICovCisJcmV0ID0gMDsKKwl3aGlsZSAoKmZwb3MgPCBkaXItPmlfc2l6ZSkgeworCQlibGtvZmYgPSAqZnBvcyAmIH4oc2l6ZW9mKHVuaW9uIGFmc19kaXJfYmxvY2spIC0gMSk7CisKKwkJLyogZmV0Y2ggdGhlIGFwcHJvcHJpYXRlIHBhZ2UgZnJvbSB0aGUgZGlyZWN0b3J5ICovCisJCXBhZ2UgPSBhZnNfZGlyX2dldF9wYWdlKGRpciwgYmxrb2ZmIC8gUEFHRV9TSVpFKTsKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJcmV0ID0gUFRSX0VSUihwYWdlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbGltaXQgPSBibGtvZmYgJiB+KFBBR0VfU0laRSAtIDEpOworCisJCWRidWYgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisKKwkJLyogZGVhbCB3aXRoIHRoZSBpbmRpdmlkdWFsIGJsb2NrcyBzdGFzaGVkIG9uIHRoaXMgcGFnZSAqLworCQlkbyB7CisJCQlkYmxvY2sgPSAmZGJ1Zi0+YmxvY2tzWyhibGtvZmYgJSBQQUdFX1NJWkUpIC8KKwkJCQkJICAgICAgIHNpemVvZih1bmlvbiBhZnNfZGlyX2Jsb2NrKV07CisJCQlyZXQgPSBhZnNfZGlyX2l0ZXJhdGVfYmxvY2soZnBvcywgZGJsb2NrLCBibGtvZmYsCisJCQkJCQkgICAgY29va2llLCBmaWxsZGlyKTsKKwkJCWlmIChyZXQgIT0gMSkgeworCQkJCWFmc19kaXJfcHV0X3BhZ2UocGFnZSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWJsa29mZiArPSBzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jayk7CisKKwkJfSB3aGlsZSAoKmZwb3MgPCBkaXItPmlfc2l6ZSAmJiBibGtvZmYgPCBsaW1pdCk7CisKKwkJYWZzX2Rpcl9wdXRfcGFnZShwYWdlKTsKKwkJcmV0ID0gMDsKKwl9CisKKyBvdXQ6CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30gLyogZW5kIGFmc19kaXJfaXRlcmF0ZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiByZWFkIGFuIEFGUyBkaXJlY3RvcnkKKyAqLworc3RhdGljIGludCBhZnNfZGlyX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmNvb2tpZSwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJdW5zaWduZWQgZnBvczsKKwlpbnQgcmV0OworCisJX2VudGVyKCJ7JUxkLHslbHV9fSIsIGZpbGUtPmZfcG9zLCBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8pOworCisJZnBvcyA9IGZpbGUtPmZfcG9zOworCXJldCA9IGFmc19kaXJfaXRlcmF0ZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgJmZwb3MsIGNvb2tpZSwgZmlsbGRpcik7CisJZmlsZS0+Zl9wb3MgPSBmcG9zOworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30gLyogZW5kIGFmc19kaXJfcmVhZGRpcigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBzZWFyY2ggdGhlIGRpcmVjdG9yeSBmb3IgYSBuYW1lCisgKiAtIGlmIGFmc19kaXJfaXRlcmF0ZV9ibG9jaygpIHNwb3RzIHRoaXMgZnVuY3Rpb24sIGl0J2xsIHBhc3MgdGhlIEZJRAorICogICB1bmlxdWlmaWVyIHRocm91Z2ggZHR5cGUKKyAqLworc3RhdGljIGludCBhZnNfZGlyX2xvb2t1cF9maWxsZGlyKHZvaWQgKl9jb29raWUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBubGVuLAorCQkJCSAgbG9mZl90IGZwb3MsIGlub190IGlubywgdW5zaWduZWQgZHR5cGUpCit7CisJc3RydWN0IGFmc19kaXJfbG9va3VwX2Nvb2tpZSAqY29va2llID0gX2Nvb2tpZTsKKworCV9lbnRlcigieyVzLCVadX0sJXMsJXUsLCVsdSwldSIsCisJICAgICAgIGNvb2tpZS0+bmFtZSwgY29va2llLT5ubGVuLCBuYW1lLCBubGVuLCBpbm8sIGR0eXBlKTsKKworCWlmIChjb29raWUtPm5sZW4gIT0gbmxlbiB8fCBtZW1jbXAoY29va2llLT5uYW1lLCBuYW1lLCBubGVuKSAhPSAwKSB7CisJCV9sZWF2ZSgiID0gMCBbbm9dIik7CisJCXJldHVybiAwOworCX0KKworCWNvb2tpZS0+ZmlkLnZub2RlID0gaW5vOworCWNvb2tpZS0+ZmlkLnVuaXF1ZSA9IGR0eXBlOworCWNvb2tpZS0+Zm91bmQgPSAxOworCisJX2xlYXZlKCIgPSAtMSBbZm91bmRdIik7CisJcmV0dXJuIC0xOworfSAvKiBlbmQgYWZzX2Rpcl9sb29rdXBfZmlsbGRpcigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb29rIHVwIGFuIGVudHJ5IGluIGEgZGlyZWN0b3J5CisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICphZnNfZGlyX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGFmc19kaXJfbG9va3VwX2Nvb2tpZSBjb29raWU7CisJc3RydWN0IGFmc19zdXBlcl9pbmZvICphczsKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXVuc2lnbmVkIGZwb3M7CisJaW50IHJldDsKKworCV9lbnRlcigieyVsdX0sJXB7JXN9IiwgZGlyLT5pX2lubywgZGVudHJ5LCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCS8qIGluc2FuaXR5IGNoZWNrcyBmaXJzdCAqLworCUJVR19PTihzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jaykgIT0gMjA0OCk7CisJQlVHX09OKHNpemVvZih1bmlvbiBhZnNfZGlyZW50KSAhPSAzMik7CisKKwlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gMjU1KSB7CisJCV9sZWF2ZSgiID0gLUVOQU1FVE9PTE9ORyIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKKwl9CisKKwl2bm9kZSA9IEFGU19GU19JKGRpcik7CisJaWYgKHZub2RlLT5mbGFncyAmIEFGU19WTk9ERV9ERUxFVEVEKSB7CisJCV9sZWF2ZSgiID0gLUVTVEFMRSIpOworCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKKwl9CisKKwlhcyA9IGRpci0+aV9zYi0+c19mc19pbmZvOworCisJLyogc2VhcmNoIHRoZSBkaXJlY3RvcnkgKi8KKwljb29raWUubmFtZQk9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJY29va2llLm5sZW4JPSBkZW50cnktPmRfbmFtZS5sZW47CisJY29va2llLmZpZC52aWQJPSBhcy0+dm9sdW1lLT52aWQ7CisJY29va2llLmZvdW5kCT0gMDsKKworCWZwb3MgPSAwOworCXJldCA9IGFmc19kaXJfaXRlcmF0ZShkaXIsICZmcG9zLCAmY29va2llLCBhZnNfZGlyX2xvb2t1cF9maWxsZGlyKTsKKwlpZiAocmV0IDwgMCkgeworCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwlyZXQgPSAtRU5PRU5UOworCWlmICghY29va2llLmZvdW5kKSB7CisJCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCS8qIGluc3RhbnRpYXRlIHRoZSBkZW50cnkgKi8KKwlyZXQgPSBhZnNfaWdldChkaXItPmlfc2IsICZjb29raWUuZmlkLCAmaW5vZGUpOworCWlmIChyZXQgPCAwKSB7CisJCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCWRlbnRyeS0+ZF9vcCA9ICZhZnNfZnNfZGVudHJ5X29wZXJhdGlvbnM7CisJZGVudHJ5LT5kX2ZzZGF0YSA9ICh2b2lkICopICh1bnNpZ25lZCBsb25nKSB2bm9kZS0+c3RhdHVzLnZlcnNpb247CisKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlfbGVhdmUoIiA9IDAgeyB2bj0ldSB1PSV1IH0gLT4geyBpbm89JWx1IHY9JWx1IH0iLAorCSAgICAgICBjb29raWUuZmlkLnZub2RlLAorCSAgICAgICBjb29raWUuZmlkLnVuaXF1ZSwKKwkgICAgICAgZGVudHJ5LT5kX2lub2RlLT5pX2lubywKKwkgICAgICAgZGVudHJ5LT5kX2lub2RlLT5pX3ZlcnNpb24pOworCisJcmV0dXJuIE5VTEw7Cit9IC8qIGVuZCBhZnNfZGlyX2xvb2t1cCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjaGVjayB0aGF0IGEgZGVudHJ5IGxvb2t1cCBoaXQgaGFzIGZvdW5kIGEgdmFsaWQgZW50cnkKKyAqIC0gTk9URSEgdGhlIGhpdCBjYW4gYmUgYSBuZWdhdGl2ZSBoaXQgdG9vLCBzbyB3ZSBjYW4ndCBhc3N1bWUgd2UgaGF2ZSBhbgorICogICBpbm9kZQorICogKGRlcml2ZWQgZnJvbSBuZnNfbG9va3VwX3JldmFsaWRhdGUpCisgKi8KK3N0YXRpYyBpbnQgYWZzX2RfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBhZnNfZGlyX2xvb2t1cF9jb29raWUgY29va2llOworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqZGlyOworCXVuc2lnbmVkIGZwb3M7CisJaW50IHJldDsKKworCV9lbnRlcigie3NiPSVwIG49JXN9LCIsIGRlbnRyeS0+ZF9zYiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwkvKiBsb2NrIGRvd24gdGhlIHBhcmVudCBkZW50cnkgc28gd2UgY2FuIHBlZXIgYXQgaXQgKi8KKwlwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnktPmRfcGFyZW50KTsKKworCWRpciA9IHBhcmVudC0+ZF9pbm9kZTsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCS8qIGhhbmRsZSBhIG5lZ2F0aXZlIGRlbnRyeSAqLworCWlmICghaW5vZGUpCisJCWdvdG8gb3V0X2JhZDsKKworCS8qIGhhbmRsZSBhIGJhZCBpbm9kZSAqLworCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKSB7CisJCXByaW50aygia0FGUzogYWZzX2RfcmV2YWxpZGF0ZTogJXMvJXMgaGFzIGJhZCBpbm9kZVxuIiwKKwkJICAgICAgIGRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJZ290byBvdXRfYmFkOworCX0KKworCS8qIGZvcmNlIGEgZnVsbCBsb29rIHVwIGlmIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGNoYW5nZWQgc2luY2UgbGFzdCB0aGUKKwkgKiBzZXJ2ZXIgd2FzIGNvbnN1bHRlZAorCSAqIC0gb3RoZXJ3aXNlIHRoaXMgaW5vZGUgbXVzdCBzdGlsbCBleGlzdCwgZXZlbiBpZiB0aGUgaW5vZGUgZGV0YWlscworCSAqICAgdGhlbXNlbHZlcyBoYXZlIGNoYW5nZWQKKwkgKi8KKwlpZiAoQUZTX0ZTX0koZGlyKS0+ZmxhZ3MgJiBBRlNfVk5PREVfQ0hBTkdFRCkKKwkJYWZzX3Zub2RlX2ZldGNoX3N0YXR1cyhBRlNfRlNfSShkaXIpKTsKKworCWlmIChBRlNfRlNfSShkaXIpLT5mbGFncyAmIEFGU19WTk9ERV9ERUxFVEVEKSB7CisJCV9kZWJ1ZygiJXM6IHBhcmVudCBkaXIgZGVsZXRlZCIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQlnb3RvIG91dF9iYWQ7CisJfQorCisJaWYgKEFGU19GU19JKGlub2RlKS0+ZmxhZ3MgJiBBRlNfVk5PREVfREVMRVRFRCkgeworCQlfZGVidWcoIiVzOiBmaWxlIGFscmVhZHkgZGVsZXRlZCIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQlnb3RvIG91dF9iYWQ7CisJfQorCisJaWYgKCh1bnNpZ25lZCBsb25nKSBkZW50cnktPmRfZnNkYXRhICE9CisJICAgICh1bnNpZ25lZCBsb25nKSBBRlNfRlNfSShkaXIpLT5zdGF0dXMudmVyc2lvbikgeworCQlfZGVidWcoIiVzOiBwYXJlbnQgY2hhbmdlZCAlbHUgLT4gJXUiLAorCQkgICAgICAgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBkZW50cnktPmRfZnNkYXRhLAorCQkgICAgICAgKHVuc2lnbmVkKSBBRlNfRlNfSShkaXIpLT5zdGF0dXMudmVyc2lvbik7CisKKwkJLyogc2VhcmNoIHRoZSBkaXJlY3RvcnkgZm9yIHRoaXMgdm5vZGUgKi8KKwkJY29va2llLm5hbWUJPSBkZW50cnktPmRfbmFtZS5uYW1lOworCQljb29raWUubmxlbgk9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwkJY29va2llLmZpZC52aWQJPSBBRlNfRlNfSShpbm9kZSktPnZvbHVtZS0+dmlkOworCQljb29raWUuZm91bmQJPSAwOworCisJCWZwb3MgPSAwOworCQlyZXQgPSBhZnNfZGlyX2l0ZXJhdGUoZGlyLCAmZnBvcywgJmNvb2tpZSwKKwkJCQkgICAgICBhZnNfZGlyX2xvb2t1cF9maWxsZGlyKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCV9kZWJ1ZygiZmFpbGVkIHRvIGl0ZXJhdGUgZGlyICVzOiAlZCIsCisJCQkgICAgICAgcGFyZW50LT5kX25hbWUubmFtZSwgcmV0KTsKKwkJCWdvdG8gb3V0X2JhZDsKKwkJfQorCisJCWlmICghY29va2llLmZvdW5kKSB7CisJCQlfZGVidWcoIiVzOiBkaXJlbnQgbm90IGZvdW5kIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCQlnb3RvIG5vdF9mb3VuZDsKKwkJfQorCisJCS8qIGlmIHRoZSB2bm9kZSBJRCBoYXMgY2hhbmdlZCwgdGhlbiB0aGUgZGlyZW50IHBvaW50cyB0byBhCisJCSAqIGRpZmZlcmVudCBmaWxlICovCisJCWlmIChjb29raWUuZmlkLnZub2RlICE9IEFGU19GU19JKGlub2RlKS0+ZmlkLnZub2RlKSB7CisJCQlfZGVidWcoIiVzOiBkaXJlbnQgY2hhbmdlZCIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQkJZ290byBub3RfZm91bmQ7CisJCX0KKworCQkvKiBpZiB0aGUgdm5vZGUgSUQgdW5pcWlmaWVyIGhhcyBjaGFuZ2VkLCB0aGVuIHRoZSBmaWxlIGhhcworCQkgKiBiZWVuIGRlbGV0ZWQgKi8KKwkJaWYgKGNvb2tpZS5maWQudW5pcXVlICE9IEFGU19GU19JKGlub2RlKS0+ZmlkLnVuaXF1ZSkgeworCQkJX2RlYnVnKCIlczogZmlsZSBkZWxldGVkICh1cSAldSAtPiAldSBJOiVsdSkiLAorCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkgICAgICAgY29va2llLmZpZC51bmlxdWUsCisJCQkgICAgICAgQUZTX0ZTX0koaW5vZGUpLT5maWQudW5pcXVlLAorCQkJICAgICAgIGlub2RlLT5pX3ZlcnNpb24pOworCQkJc3Bpbl9sb2NrKCZBRlNfRlNfSShpbm9kZSktPmxvY2spOworCQkJQUZTX0ZTX0koaW5vZGUpLT5mbGFncyB8PSBBRlNfVk5PREVfREVMRVRFRDsKKwkJCXNwaW5fdW5sb2NrKCZBRlNfRlNfSShpbm9kZSktPmxvY2spOworCQkJaW52YWxpZGF0ZV9yZW1vdGVfaW5vZGUoaW5vZGUpOworCQkJZ290byBvdXRfYmFkOworCQl9CisKKwkJZGVudHJ5LT5kX2ZzZGF0YSA9CisJCQkodm9pZCAqKSAodW5zaWduZWQgbG9uZykgQUZTX0ZTX0koZGlyKS0+c3RhdHVzLnZlcnNpb247CisJfQorCisgb3V0X3ZhbGlkOgorCWRwdXQocGFyZW50KTsKKwlfbGVhdmUoIiA9IDEgW3ZhbGlkXSIpOworCXJldHVybiAxOworCisJLyogdGhlIGRpcmVudCwgaWYgaXQgZXhpc3RzLCBub3cgcG9pbnRzIHRvIGEgZGlmZmVyZW50IHZub2RlICovCisgbm90X2ZvdW5kOgorCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCWRlbnRyeS0+ZF9mbGFncyB8PSBEQ0FDSEVfTkZTRlNfUkVOQU1FRDsKKwlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCisgb3V0X2JhZDoKKwlpZiAoaW5vZGUpIHsKKwkJLyogZG9uJ3QgdW5oYXNoIGlmIHdlIGhhdmUgc3VibW91bnRzICovCisJCWlmIChoYXZlX3N1Ym1vdW50cyhkZW50cnkpKQorCQkJZ290byBvdXRfdmFsaWQ7CisJfQorCisJc2hyaW5rX2RjYWNoZV9wYXJlbnQoZGVudHJ5KTsKKworCV9kZWJ1ZygiZHJvcHBpbmcgZGVudHJ5ICVzLyVzIiwKKwkgICAgICAgZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWRfZHJvcChkZW50cnkpOworCisJZHB1dChwYXJlbnQpOworCisJX2xlYXZlKCIgPSAwIFtiYWRdIik7CisJcmV0dXJuIDA7Cit9IC8qIGVuZCBhZnNfZF9yZXZhbGlkYXRlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGFsbG93IHRoZSBWRlMgdG8gZW5xdWlyZSBhcyB0byB3aGV0aGVyIGEgZGVudHJ5IHNob3VsZCBiZSB1bmhhc2hlZCAobXVzdG4ndAorICogc2xlZXApCisgKiAtIGNhbGxlZCBmcm9tIGRwdXQoKSB3aGVuIGRfY291bnQgaXMgZ29pbmcgdG8gMC4KKyAqIC0gcmV0dXJuIDEgdG8gcmVxdWVzdCBkZW50cnkgYmUgdW5oYXNoZWQsIDAgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgYWZzX2RfZGVsZXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlfZW50ZXIoIiVzIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlpZiAoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX05GU0ZTX1JFTkFNRUQpCisJCWdvdG8gemFwOworCisJaWYgKGRlbnRyeS0+ZF9pbm9kZSkgeworCQlpZiAoQUZTX0ZTX0koZGVudHJ5LT5kX2lub2RlKS0+ZmxhZ3MgJiBBRlNfVk5PREVfREVMRVRFRCkKKwkJCWdvdG8gemFwOworCX0KKworCV9sZWF2ZSgiID0gMCBba2VlcF0iKTsKKwlyZXR1cm4gMDsKKworIHphcDoKKwlfbGVhdmUoIiA9IDEgW3phcF0iKTsKKwlyZXR1cm4gMTsKK30gLyogZW5kIGFmc19kX2RlbGV0ZSgpICovCmRpZmYgLS1naXQgYS9mcy9hZnMvZXJyb3JzLmggYi9mcy9hZnMvZXJyb3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc0ZDk0YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9lcnJvcnMuaApAQCAtMCwwICsxLDM0IEBACisvKiBlcnJvcnMuaDogQUZTIGFib3J0L2Vycm9yIGNvZGVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0FGU19FUlJPUlNfSAorI2RlZmluZSBfTElOVVhfQUZTX0VSUk9SU19ICisKKyNpbmNsdWRlICJ0eXBlcy5oIgorCisvKiBmaWxlIHNlcnZlciBhYm9ydCBjb2RlcyAqLwordHlwZWRlZiBlbnVtIHsKKwlWU0FMVkFHRQk9IDEwMSwJLyogdm9sdW1lIG5lZWRzIHNhbHZhZ2luZyAqLworCVZOT1ZOT0RFCT0gMTAyLAkvKiBubyBzdWNoIGZpbGUvZGlyICh2bm9kZSkgKi8KKwlWTk9WT0wJCT0gMTAzLAkvKiBubyBzdWNoIHZvbHVtZSBvciB2b2x1bWUgdW5hdmFpbGFibGUgKi8KKwlWVk9MRVhJU1RTCT0gMTA0LAkvKiB2b2x1bWUgbmFtZSBhbHJlYWR5IGV4aXN0cyAqLworCVZOT1NFUlZJQ0UJPSAxMDUsCS8qIHZvbHVtZSBub3QgY3VycmVudGx5IGluIHNlcnZpY2UgKi8KKwlWT0ZGTElORQk9IDEwNiwJLyogdm9sdW1lIGlzIGN1cnJlbnRseSBvZmZsaW5lIChtb3JlIGluZm8gYXZhaWxhYmxlIFtWVkwtc3BlY10pICovCisJVk9OTElORQkJPSAxMDcsCS8qIHZvbHVtZSBpcyBhbHJlYWR5IG9ubGluZSAqLworCVZESVNLRlVMTAk9IDEwOCwJLyogZGlzayBwYXJ0aXRpb24gaXMgZnVsbCAqLworCVZPVkVSUVVPVEEJPSAxMDksCS8qIHZvbHVtZSdzIG1heGltdW0gcXVvdGEgZXhjZWVkZWQgKi8KKwlWQlVTWQkJPSAxMTAsCS8qIHZvbHVtZSBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSAqLworCVZNT1ZFRAkJPSAxMTEsCS8qIHZvbHVtZSBtb3ZlZCB0byBuZXcgc2VydmVyIC0gYXNrIHRoaXMgRlMgd2hlcmUgKi8KK30gYWZzX3J4ZnNfYWJvcnRfdDsKKworZXh0ZXJuIGludCBhZnNfYWJvcnRfdG9fZXJyb3IoaW50IGFib3J0Y29kZSk7CisKKyNlbmRpZiAvKiBfTElOVVhfQUZTX0VSUk9SU19IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvZmlsZS5jIGIvZnMvYWZzL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjZiYjdjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL2ZpbGUuYwpAQCAtMCwwICsxLDMwNSBAQAorLyogZmlsZS5jOiBBRlMgZmlsZXN5c3RlbSBmaWxlIGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlICJ2b2x1bWUuaCIKKyNpbmNsdWRlICJ2bm9kZS5oIgorI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjaWYgMAorc3RhdGljIGludCBhZnNfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgYWZzX2ZpbGVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CisjZW5kaWYKKworc3RhdGljIGludCBhZnNfZmlsZV9yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpOworc3RhdGljIGludCBhZnNfZmlsZV9pbnZhbGlkYXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpOworc3RhdGljIGludCBhZnNfZmlsZV9yZWxlYXNlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGdmcF9mbGFncyk7CisKK3N0YXRpYyBzc2l6ZV90IGFmc19maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICAgc2l6ZV90IHNpemUsIGxvZmZfdCAqb2ZmKTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkuZ2V0YXR0cgk9IGFmc19pbm9kZV9nZXRhdHRyLAorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZnNfZmlsZV9maWxlX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gZ2VuZXJpY19maWxlX3JlYWQsCisJLndyaXRlCQk9IGFmc19maWxlX3dyaXRlLAorCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAorI2lmIDAKKwkub3BlbgkJPSBhZnNfZmlsZV9vcGVuLAorCS5yZWxlYXNlCT0gYWZzX2ZpbGVfcmVsZWFzZSwKKwkuZnN5bmMJCT0gYWZzX2ZpbGVfZnN5bmMsCisjZW5kaWYKK307CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgYWZzX2ZzX2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gYWZzX2ZpbGVfcmVhZHBhZ2UsCisJLnN5bmNfcGFnZQk9IGJsb2NrX3N5bmNfcGFnZSwKKwkuc2V0X3BhZ2VfZGlydHkJPSBfX3NldF9wYWdlX2RpcnR5X25vYnVmZmVycywKKwkucmVsZWFzZXBhZ2UJPSBhZnNfZmlsZV9yZWxlYXNlcGFnZSwKKwkuaW52YWxpZGF0ZXBhZ2UJPSBhZnNfZmlsZV9pbnZhbGlkYXRlcGFnZSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBBRlMgZmlsZSB3cml0ZQorICovCitzdGF0aWMgc3NpemVfdCBhZnNfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBzaXplLCBsb2ZmX3QgKm9mZikKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZTsKKworCXZub2RlID0gQUZTX0ZTX0koZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWlmICh2bm9kZS0+ZmxhZ3MgJiBBRlNfVk5PREVfREVMRVRFRCkKKwkJcmV0dXJuIC1FU1RBTEU7CisKKwlyZXR1cm4gLUVJTzsKK30gLyogZW5kIGFmc19maWxlX3dyaXRlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGRlYWwgd2l0aCBub3RpZmljYXRpb24gdGhhdCBhIHBhZ2Ugd2FzIHJlYWQgZnJvbSB0aGUgY2FjaGUKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyB2b2lkIGFmc19maWxlX3JlYWRwYWdlX3JlYWRfY29tcGxldGUodm9pZCAqY29va2llX2RhdGEsCisJCQkJCSAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkJICAgIHZvaWQgKmRhdGEsCisJCQkJCSAgICBpbnQgZXJyb3IpCit7CisJX2VudGVyKCIlcCwlcCwlcCwlZCIsIGNvb2tpZV9kYXRhLCBwYWdlLCBkYXRhLCBlcnJvcik7CisKKwlpZiAoZXJyb3IpCisJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwllbHNlCisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKworfSAvKiBlbmQgYWZzX2ZpbGVfcmVhZHBhZ2VfcmVhZF9jb21wbGV0ZSgpICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGRlYWwgd2l0aCBub3RpZmljYXRpb24gdGhhdCBhIHBhZ2Ugd2FzIHdyaXR0ZW4gdG8gdGhlIGNhY2hlCisgKi8KKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitzdGF0aWMgdm9pZCBhZnNfZmlsZV9yZWFkcGFnZV93cml0ZV9jb21wbGV0ZSh2b2lkICpjb29raWVfZGF0YSwKKwkJCQkJICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkJICAgICB2b2lkICpkYXRhLAorCQkJCQkgICAgIGludCBlcnJvcikKK3sKKwlfZW50ZXIoIiVwLCVwLCVwLCVkIiwgY29va2llX2RhdGEsIHBhZ2UsIGRhdGEsIGVycm9yKTsKKworCXVubG9ja19wYWdlKHBhZ2UpOworCit9IC8qIGVuZCBhZnNfZmlsZV9yZWFkcGFnZV93cml0ZV9jb21wbGV0ZSgpICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEFGUyByZWFkIHBhZ2UgZnJvbSBmaWxlIChvciBzeW1saW5rKQorICovCitzdGF0aWMgaW50IGFmc19maWxlX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgYWZzX3J4ZnNfZmV0Y2hfZGVzY3JpcHRvciBkZXNjOworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwlzdHJ1Y3QgY2FjaGVmc19wYWdlICpwYWdlaW87CisjZW5kaWYKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCByZXQ7CisKKwlpbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisKKwlfZW50ZXIoInslbHV9LHslbHV9IiwgaW5vZGUtPmlfaW5vLCBwYWdlLT5pbmRleCk7CisKKwl2bm9kZSA9IEFGU19GU19JKGlub2RlKTsKKworCWlmICghUGFnZUxvY2tlZChwYWdlKSkKKwkJUEFHRV9CVUcocGFnZSk7CisKKwlyZXQgPSAtRVNUQUxFOworCWlmICh2bm9kZS0+ZmxhZ3MgJiBBRlNfVk5PREVfREVMRVRFRCkKKwkJZ290byBlcnJvcjsKKworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwlyZXQgPSBjYWNoZWZzX3BhZ2VfZ2V0X3ByaXZhdGUocGFnZSwgJnBhZ2VpbywgR0ZQX05PSU8pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogaXMgaXQgY2FjaGVkPyAqLworCXJldCA9IGNhY2hlZnNfcmVhZF9vcl9hbGxvY19wYWdlKHZub2RlLT5jYWNoZSwKKwkJCQkJIHBhZ2UsCisJCQkJCSBhZnNfZmlsZV9yZWFkcGFnZV9yZWFkX2NvbXBsZXRlLAorCQkJCQkgTlVMTCwKKwkJCQkJIEdGUF9LRVJORUwpOworI2Vsc2UKKwlyZXQgPSAtRU5PQlVGUzsKKyNlbmRpZgorCisJc3dpdGNoIChyZXQpIHsKKwkJLyogcmVhZCBCSU8gc3VibWl0dGVkIGFuZCB3Yi1qb3VybmFsIGVudHJ5IGZvdW5kICovCisJY2FzZSAxOgorCQlCVUcoKTsgLy8gVE9ETyAtIGhhbmRsZSB3Yi1qb3VybmFsIG1hdGNoCisKKwkJLyogcmVhZCBCSU8gc3VibWl0dGVkIChwYWdlIGluIGNhY2hlKSAqLworCWNhc2UgMDoKKwkJYnJlYWs7CisKKwkJLyogbm8gcGFnZSBhdmFpbGFibGUgaW4gY2FjaGUgKi8KKwljYXNlIC1FTk9CVUZTOgorCWNhc2UgLUVOT0RBVEE6CisJZGVmYXVsdDoKKwkJZGVzYy5maWQJPSB2bm9kZS0+ZmlkOworCQlkZXNjLm9mZnNldAk9IHBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCWRlc2Muc2l6ZQk9IG1pbigoc2l6ZV90KSAoaW5vZGUtPmlfc2l6ZSAtIGRlc2Mub2Zmc2V0KSwKKwkJCQkgICAgICAoc2l6ZV90KSBQQUdFX1NJWkUpOworCQlkZXNjLmJ1ZmZlcgk9IGttYXAocGFnZSk7CisKKwkJY2xlYXJfcGFnZShkZXNjLmJ1ZmZlcik7CisKKwkJLyogcmVhZCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgZnJvbSB0aGUgc2VydmVyIGludG8gdGhlCisJCSAqIHBhZ2UgKi8KKwkJcmV0ID0gYWZzX3Zub2RlX2ZldGNoX2RhdGEodm5vZGUsICZkZXNjKTsKKwkJa3VubWFwKHBhZ2UpOworCQlpZiAocmV0IDwgMCkgeworCQkJaWYgKHJldD09LUVOT0VOVCkgeworCQkJCV9kZWJ1ZygiZ290IE5PRU5UIGZyb20gc2VydmVyIgorCQkJCSAgICAgICAiIC0gbWFya2luZyBmaWxlIGRlbGV0ZWQgYW5kIHN0YWxlIik7CisJCQkJdm5vZGUtPmZsYWdzIHw9IEFGU19WTk9ERV9ERUxFVEVEOworCQkJCXJldCA9IC1FU1RBTEU7CisJCQl9CisKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisJCQljYWNoZWZzX3VuY2FjaGVfcGFnZSh2bm9kZS0+Y2FjaGUsIHBhZ2UpOworI2VuZGlmCisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorCQlpZiAoY2FjaGVmc193cml0ZV9wYWdlKHZub2RlLT5jYWNoZSwKKwkJCQkgICAgICAgcGFnZSwKKwkJCQkgICAgICAgYWZzX2ZpbGVfcmVhZHBhZ2Vfd3JpdGVfY29tcGxldGUsCisJCQkJICAgICAgIE5VTEwsCisJCQkJICAgICAgIEdGUF9LRVJORUwpICE9IDAKKwkJICAgICkgeworCQkJY2FjaGVmc191bmNhY2hlX3BhZ2Uodm5vZGUtPmNhY2hlLCBwYWdlKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQl9CisjZWxzZQorCQl1bmxvY2tfcGFnZShwYWdlKTsKKyNlbmRpZgorCX0KKworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworCisgZXJyb3I6CisJU2V0UGFnZUVycm9yKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKworfSAvKiBlbmQgYWZzX2ZpbGVfcmVhZHBhZ2UoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZ2V0IGEgcGFnZSBjb29raWUgZm9yIHRoZSBzcGVjaWZpZWQgcGFnZQorICovCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAoraW50IGFmc19jYWNoZV9nZXRfcGFnZV9jb29raWUoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICAgICBzdHJ1Y3QgY2FjaGVmc19wYWdlICoqX3BhZ2VfY29va2llKQoreworCWludCByZXQ7CisKKwlfZW50ZXIoIiIpOworCXJldCA9IGNhY2hlZnNfcGFnZV9nZXRfcHJpdmF0ZShwYWdlLF9wYWdlX2Nvb2tpZSwgR0ZQX05PSU8pOworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30gLyogZW5kIGFmc19jYWNoZV9nZXRfcGFnZV9jb29raWUoKSAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBpbnZhbGlkYXRlIHBhcnQgb3IgYWxsIG9mIGEgcGFnZQorICovCitzdGF0aWMgaW50IGFmc19maWxlX2ludmFsaWRhdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlpbnQgcmV0ID0gMTsKKworCV9lbnRlcigieyVsdX0sJWx1IiwgcGFnZS0+aW5kZXgsIG9mZnNldCk7CisKKwlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCisJaWYgKFBhZ2VQcml2YXRlKHBhZ2UpKSB7CisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorCQlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IEFGU19GU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpOworCQljYWNoZWZzX3VuY2FjaGVfcGFnZSh2bm9kZS0+Y2FjaGUscGFnZSk7CisjZW5kaWYKKworCQkvKiBXZSByZWxlYXNlIGJ1ZmZlcnMgb25seSBpZiB0aGUgZW50aXJlIHBhZ2UgaXMgYmVpbmcKKwkJICogaW52YWxpZGF0ZWQuCisJCSAqIFRoZSBnZXRfYmxvY2sgY2FjaGVkIHZhbHVlIGhhcyBiZWVuIHVuY29uZGl0aW9uYWxseQorCQkgKiBpbnZhbGlkYXRlZCwgc28gcmVhbCBJTyBpcyBub3QgcG9zc2libGUgYW55bW9yZS4KKwkJICovCisJCWlmIChvZmZzZXQgPT0gMCkgeworCQkJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKworCQkJcmV0ID0gMDsKKwkJCWlmICghUGFnZVdyaXRlYmFjayhwYWdlKSkKKwkJCQlyZXQgPSBwYWdlLT5tYXBwaW5nLT5hX29wcy0+cmVsZWFzZXBhZ2UocGFnZSwKKwkJCQkJCQkJCTApOworCQl9CisJfQorCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30gLyogZW5kIGFmc19maWxlX2ludmFsaWRhdGVwYWdlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHJlbGVhc2UgYSBwYWdlIGFuZCBjbGVhbnVwIGl0cyBwcml2YXRlIGRhdGEKKyAqLworc3RhdGljIGludCBhZnNfZmlsZV9yZWxlYXNlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGdmcF9mbGFncykKK3sKKwlzdHJ1Y3QgY2FjaGVmc19wYWdlICpwYWdlaW87CisKKwlfZW50ZXIoInslbHV9LCV4IiwgcGFnZS0+aW5kZXgsIGdmcF9mbGFncyk7CisKKwlpZiAoUGFnZVByaXZhdGUocGFnZSkpIHsKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisJCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gQUZTX0ZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCk7CisJCWNhY2hlZnNfdW5jYWNoZV9wYWdlKHZub2RlLT5jYWNoZSwgcGFnZSk7CisjZW5kaWYKKworCQlwYWdlaW8gPSAoc3RydWN0IGNhY2hlZnNfcGFnZSAqKSBwYWdlLT5wcml2YXRlOworCQlwYWdlLT5wcml2YXRlID0gMDsKKwkJQ2xlYXJQYWdlUHJpdmF0ZShwYWdlKTsKKworCQlpZiAocGFnZWlvKQorCQkJa2ZyZWUocGFnZWlvKTsKKwl9CisKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30gLyogZW5kIGFmc19maWxlX3JlbGVhc2VwYWdlKCkgKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9mc2NsaWVudC5jIGIvZnMvYWZzL2ZzY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFiYzM3MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9mc2NsaWVudC5jCkBAIC0wLDAgKzEsODM3IEBACisvKiBmc2NsaWVudC5jOiBBRlMgRmlsZSBTZXJ2ZXIgY2xpZW50IHN0dWJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxyeHJwYy9yeHJwYy5oPgorI2luY2x1ZGUgPHJ4cnBjL3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHJ4cnBjL2Nvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxyeHJwYy9jYWxsLmg+CisjaW5jbHVkZSAiZnNjbGllbnQuaCIKKyNpbmNsdWRlICJjbXNlcnZpY2UuaCIKKyNpbmNsdWRlICJ2bm9kZS5oIgorI2luY2x1ZGUgInNlcnZlci5oIgorI2luY2x1ZGUgImVycm9ycy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgRlNGRVRDSFNUQVRVUwkJMTMyCS8qIEFGUyBGZXRjaCBmaWxlIHN0YXR1cyAqLworI2RlZmluZSBGU0ZFVENIREFUQQkJMTMwCS8qIEFGUyBGZXRjaCBmaWxlIGRhdGEgKi8KKyNkZWZpbmUgRlNHSVZFVVBDQUxMQkFDS1MJMTQ3CS8qIEFGUyBEaXNjYXJkIGNhbGxiYWNrIHByb21pc2VzICovCisjZGVmaW5lIEZTR0VUVk9MVU1FSU5GTwkJMTQ4CS8qIEFGUyBHZXQgcm9vdCB2b2x1bWUgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgRlNHRVRST09UVk9MVU1FCQkxNTEJLyogQUZTIEdldCByb290IHZvbHVtZSBuYW1lICovCisjZGVmaW5lIEZTTE9PS1VQCQkxNjEJLyogQUZTIGxvb2t1cCBmaWxlIGluIGRpcmVjdG9yeSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbWFwIGFmcyBhYm9ydCBjb2RlcyB0by9mcm9tIExpbnV4IGVycm9yIGNvZGVzCisgKiAtIGNhbGxlZCB3aXRoIGNhbGwtPmxvY2sgaGVsZAorICovCitzdGF0aWMgdm9pZCBhZnNfcnhmc19hZW1hcChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlzd2l0Y2ggKGNhbGwtPmFwcF9lcnJfc3RhdGUpIHsKKwljYXNlIFJYUlBDX0VTVEFURV9MT0NBTF9BQk9SVDoKKwkJY2FsbC0+YXBwX2Fib3J0X2NvZGUgPSAtY2FsbC0+YXBwX2Vycm5vOworCQlicmVhazsKKwljYXNlIFJYUlBDX0VTVEFURV9QRUVSX0FCT1JUOgorCQljYWxsLT5hcHBfZXJybm8gPSBhZnNfYWJvcnRfdG9fZXJyb3IoY2FsbC0+YXBwX2Fib3J0X2NvZGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9IC8qIGVuZCBhZnNfcnhmc19hZW1hcCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBnZXQgdGhlIHJvb3Qgdm9sdW1lIG5hbWUgZnJvbSBhIGZpbGVzZXJ2ZXIKKyAqIC0gdGhpcyBvcGVyYXRpb24gZG9lc24ndCBzZWVtIHRvIHdvcmsgY29ycmVjdGx5IGluIE9wZW5BRlMgc2VydmVyIDEuMi4yCisgKi8KKyNpZiAwCitpbnQgYWZzX3J4ZnNfZ2V0X3Jvb3Rfdm9sdW1lKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90ICpidWZsZW4pCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CisJc3RydWN0IGt2ZWMgcGlvdlsyXTsKKwlzaXplX3Qgc2VudDsKKwlpbnQgcmV0OworCXUzMiBwYXJhbVsxXTsKKworCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisKKwlrZW50ZXIoIiVwLCVwLCV1IixzZXJ2ZXIsIGJ1ZiwgKmJ1Zmxlbik7CisKKwkvKiBnZXQgaG9sZCBvZiB0aGUgZmlsZXNlcnZlciBjb25uZWN0aW9uICovCisJcmV0ID0gYWZzX3NlcnZlcl9nZXRfZnNjb25uKHNlcnZlciwgJmNvbm4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KKwlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjb25uLCBOVUxMLCBOVUxMLCBhZnNfcnhmc19hZW1hcCwgJmNhbGwpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygia0FGUzogVW5hYmxlIHRvIGNyZWF0ZSBjYWxsOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXRfcHV0X2Nvbm47CisJfQorCWNhbGwtPmFwcF9vcGNvZGUgPSBGU0dFVFJPT1RWT0xVTUU7CisKKwkvKiB3ZSB3YW50IHRvIGdldCBldmVudCBub3RpZmljYXRpb25zIGZyb20gdGhlIGNhbGwgKi8KKwlhZGRfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCisJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KKwlwYXJhbVswXSA9IGh0b25sKEZTR0VUUk9PVFZPTFVNRSk7CisKKwlwaW92WzBdLmlvdl9sZW4gPSBzaXplb2YocGFyYW0pOworCXBpb3ZbMF0uaW92X2Jhc2UgPSBwYXJhbTsKKworCS8qIHNlbmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciAqLworCXJldCA9IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShjYWxsLCAxLCBwaW92LCBSWFJQQ19MQVNUX1BBQ0tFVCwgR0ZQX05PRlMsCisJCQkJICAgIDAsICZzZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBhYm9ydDsKKworCS8qIHdhaXQgZm9yIHRoZSByZXBseSB0byBjb21wbGV0ZWx5IGFycml2ZSAqLworCWZvciAoOzspIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGNhbGwtPmFwcF9jYWxsX3N0YXRlICE9IFJYUlBDX0NTVEFURV9DTE5UX1JDVl9SRVBMWSB8fAorCQkgICAgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJc2NoZWR1bGUoKTsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCXJldCA9IC1FSU5UUjsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCWdvdG8gYWJvcnQ7CisKKwlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7CisJY2FzZSBSWFJQQ19DU1RBVEVfRVJST1I6CisJCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKKwkJa2RlYnVnKCJHb3QgRXJyb3I6ICVkIiwgcmV0KTsKKwkJZ290byBvdXRfdW53YWl0OworCisJY2FzZSBSWFJQQ19DU1RBVEVfQ0xOVF9HT1RfUkVQTFk6CisJCS8qIHJlYWQgdGhlIHJlcGx5ICovCisJCWtkZWJ1ZygiR290IFJlcGx5OiBxdHk9JWQiLCBjYWxsLT5hcHBfcmVhZHlfcXR5KTsKKworCQlyZXQgPSAtRUJBRE1TRzsKKwkJaWYgKGNhbGwtPmFwcF9yZWFkeV9xdHkgPD0gNCkKKwkJCWdvdG8gYWJvcnQ7CisKKwkJcmV0ID0gcnhycGNfY2FsbF9yZWFkX2RhdGEoY2FsbCwgTlVMTCwgY2FsbC0+YXBwX3JlYWR5X3F0eSwgMCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBhYm9ydDsKKworI2lmIDAKKwkJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgKi8KKwkJYnAgPSBidWZmZXI7CisJCWZvciAobG9vcCA9IDA7IGxvb3AgPCA2NTsgbG9vcCsrKQorCQkJZW50cnktPm5hbWVbbG9vcF0gPSBudG9obCgqYnArKyk7CisJCWVudHJ5LT5uYW1lWzY0XSA9IDA7CisKKwkJZW50cnktPnR5cGUgPSBudG9obCgqYnArKyk7CisJCWVudHJ5LT5udW1fc2VydmVycyA9IG50b2hsKCpicCsrKTsKKworCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgODsgbG9vcCsrKQorCQkJZW50cnktPnNlcnZlcnNbbG9vcF0uYWRkci5zX2FkZHIgPSAqYnArKzsKKworCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgODsgbG9vcCsrKQorCQkJZW50cnktPnNlcnZlcnNbbG9vcF0ucGFydGl0aW9uID0gbnRvaGwoKmJwKyspOworCisJCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspCisJCQllbnRyeS0+c2VydmVyc1tsb29wXS5mbGFncyA9IG50b2hsKCpicCsrKTsKKworCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgMzsgbG9vcCsrKQorCQkJZW50cnktPnZvbHVtZV9pZHNbbG9vcF0gPSBudG9obCgqYnArKyk7CisKKwkJZW50cnktPmNsb25lX2lkID0gbnRvaGwoKmJwKyspOworCQllbnRyeS0+ZmxhZ3MgPSBudG9obCgqYnApOworI2VuZGlmCisKKwkJLyogc3VjY2VzcyAqLworCQlyZXQgPSAwOworCQlnb3RvIG91dF91bndhaXQ7CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKyBhYm9ydDoKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOworCXNjaGVkdWxlKCk7Cisgb3V0X3Vud2FpdDoKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7CisJcnhycGNfcHV0X2NhbGwoY2FsbCk7Cisgb3V0X3B1dF9jb25uOgorCWFmc19zZXJ2ZXJfcmVsZWFzZV9mc2Nvbm4oc2VydmVyLCBjb25uKTsKKyBvdXQ6CisJa2xlYXZlKCIiKTsKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgYWZzX3J4ZnNfZ2V0X3Jvb3Rfdm9sdW1lKCkgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZ2V0IGluZm9ybWF0aW9uIGFib3V0IGEgdm9sdW1lCisgKi8KKyNpZiAwCitpbnQgYWZzX3J4ZnNfZ2V0X3ZvbHVtZV9pbmZvKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgIHN0cnVjdCBhZnNfdm9sdW1lX2luZm8gKnZpbmZvKQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCBrdmVjIHBpb3ZbM107CisJc2l6ZV90IHNlbnQ7CisJaW50IHJldDsKKwl1MzIgcGFyYW1bMl0sICpicCwgemVybzsKKworCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisKKwlfZW50ZXIoIiVwLCVzLCVwIiwgc2VydmVyLCBuYW1lLCB2aW5mbyk7CisKKwkvKiBnZXQgaG9sZCBvZiB0aGUgZmlsZXNlcnZlciBjb25uZWN0aW9uICovCisJcmV0ID0gYWZzX3NlcnZlcl9nZXRfZnNjb25uKHNlcnZlciwgJmNvbm4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KKwlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjb25uLCBOVUxMLCBOVUxMLCBhZnNfcnhmc19hZW1hcCwgJmNhbGwpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygia0FGUzogVW5hYmxlIHRvIGNyZWF0ZSBjYWxsOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXRfcHV0X2Nvbm47CisJfQorCWNhbGwtPmFwcF9vcGNvZGUgPSBGU0dFVFZPTFVNRUlORk87CisKKwkvKiB3ZSB3YW50IHRvIGdldCBldmVudCBub3RpZmljYXRpb25zIGZyb20gdGhlIGNhbGwgKi8KKwlhZGRfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCisJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KKwlwaW92WzFdLmlvdl9sZW4gPSBzdHJsZW4obmFtZSk7CisJcGlvdlsxXS5pb3ZfYmFzZSA9IChjaGFyICopIG5hbWU7CisKKwl6ZXJvID0gMDsKKwlwaW92WzJdLmlvdl9sZW4gPSAoNCAtIChwaW92WzFdLmlvdl9sZW4gJiAzKSkgJiAzOworCXBpb3ZbMl0uaW92X2Jhc2UgPSAmemVybzsKKworCXBhcmFtWzBdID0gaHRvbmwoRlNHRVRWT0xVTUVJTkZPKTsKKwlwYXJhbVsxXSA9IGh0b25sKHBpb3ZbMV0uaW92X2xlbik7CisKKwlwaW92WzBdLmlvdl9sZW4gPSBzaXplb2YocGFyYW0pOworCXBpb3ZbMF0uaW92X2Jhc2UgPSBwYXJhbTsKKworCS8qIHNlbmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciAqLworCXJldCA9IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShjYWxsLCAzLCBwaW92LCBSWFJQQ19MQVNUX1BBQ0tFVCwgR0ZQX05PRlMsCisJCQkJICAgIDAsICZzZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBhYm9ydDsKKworCS8qIHdhaXQgZm9yIHRoZSByZXBseSB0byBjb21wbGV0ZWx5IGFycml2ZSAqLworCWJwID0gcnhycGNfY2FsbF9hbGxvY19zY3JhdGNoKGNhbGwsIDY0KTsKKworCXJldCA9IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwsIGJwLCA2NCwKKwkJCQkgICBSWFJQQ19DQUxMX1JFQURfQkxPQ0sgfAorCQkJCSAgIFJYUlBDX0NBTExfUkVBRF9BTEwpOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChyZXQgPT0gLUVDT05OQUJPUlRFRCkgeworCQkJcmV0ID0gY2FsbC0+YXBwX2Vycm5vOworCQkJZ290byBvdXRfdW53YWl0OworCQl9CisJCWdvdG8gYWJvcnQ7CisJfQorCisJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgKi8KKwl2aW5mby0+dmlkID0gbnRvaGwoKmJwKyspOworCXZpbmZvLT50eXBlID0gbnRvaGwoKmJwKyspOworCisJdmluZm8tPnR5cGVfdmlkc1swXSA9IG50b2hsKCpicCsrKTsKKwl2aW5mby0+dHlwZV92aWRzWzFdID0gbnRvaGwoKmJwKyspOworCXZpbmZvLT50eXBlX3ZpZHNbMl0gPSBudG9obCgqYnArKyk7CisJdmluZm8tPnR5cGVfdmlkc1szXSA9IG50b2hsKCpicCsrKTsKKwl2aW5mby0+dHlwZV92aWRzWzRdID0gbnRvaGwoKmJwKyspOworCisJdmluZm8tPm5zZXJ2ZXJzID0gbnRvaGwoKmJwKyspOworCXZpbmZvLT5zZXJ2ZXJzWzBdLmFkZHIuc19hZGRyID0gKmJwKys7CisJdmluZm8tPnNlcnZlcnNbMV0uYWRkci5zX2FkZHIgPSAqYnArKzsKKwl2aW5mby0+c2VydmVyc1syXS5hZGRyLnNfYWRkciA9ICpicCsrOworCXZpbmZvLT5zZXJ2ZXJzWzNdLmFkZHIuc19hZGRyID0gKmJwKys7CisJdmluZm8tPnNlcnZlcnNbNF0uYWRkci5zX2FkZHIgPSAqYnArKzsKKwl2aW5mby0+c2VydmVyc1s1XS5hZGRyLnNfYWRkciA9ICpicCsrOworCXZpbmZvLT5zZXJ2ZXJzWzZdLmFkZHIuc19hZGRyID0gKmJwKys7CisJdmluZm8tPnNlcnZlcnNbN10uYWRkci5zX2FkZHIgPSAqYnArKzsKKworCXJldCA9IC1FQkFETVNHOworCWlmICh2aW5mby0+bnNlcnZlcnMgPiA4KQorCQlnb3RvIGFib3J0OworCisJLyogc3VjY2VzcyAqLworCXJldCA9IDA7CisKKyBvdXRfdW53YWl0OgorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKKwlyeHJwY19wdXRfY2FsbChjYWxsKTsKKyBvdXRfcHV0X2Nvbm46CisJYWZzX3NlcnZlcl9yZWxlYXNlX2ZzY29ubihzZXJ2ZXIsIGNvbm4pOworIG91dDoKKwlfbGVhdmUoIiIpOworCXJldHVybiByZXQ7CisKKyBhYm9ydDoKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOworCXNjaGVkdWxlKCk7CisJZ290byBvdXRfdW53YWl0OworCit9IC8qIGVuZCBhZnNfcnhmc19nZXRfdm9sdW1lX2luZm8oKSAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBmZXRjaCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGZvciBhIGZpbGUKKyAqLworaW50IGFmc19yeGZzX2ZldGNoX2ZpbGVfc3RhdHVzKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkgICAgICAgc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCQkgICAgICAgc3RydWN0IGFmc192b2xzeW5jICp2b2xzeW5jKQoreworCXN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90IGNhbGxzbG90OworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCBrdmVjIHBpb3ZbMV07CisJc2l6ZV90IHNlbnQ7CisJaW50IHJldDsKKwlfX2JlMzIgKmJwOworCisJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKworCV9lbnRlcigiJXAseyV1LCV1LCV1fSIsCisJICAgICAgIHNlcnZlciwgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsIHZub2RlLT5maWQudW5pcXVlKTsKKworCS8qIGdldCBob2xkIG9mIHRoZSBmaWxlc2VydmVyIGNvbm5lY3Rpb24gKi8KKwlyZXQgPSBhZnNfc2VydmVyX3JlcXVlc3RfY2FsbHNsb3Qoc2VydmVyLCAmY2FsbHNsb3QpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KKwlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjYWxsc2xvdC5jb25uLCBOVUxMLCBOVUxMLCBhZnNfcnhmc19hZW1hcCwKKwkJCQkmY2FsbCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKCJrQUZTOiBVbmFibGUgdG8gY3JlYXRlIGNhbGw6ICVkXG4iLCByZXQpOworCQlnb3RvIG91dF9wdXRfY29ubjsKKwl9CisJY2FsbC0+YXBwX29wY29kZSA9IEZTRkVUQ0hTVEFUVVM7CisKKwkvKiB3ZSB3YW50IHRvIGdldCBldmVudCBub3RpZmljYXRpb25zIGZyb20gdGhlIGNhbGwgKi8KKwlhZGRfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCisJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KKwlicCA9IHJ4cnBjX2NhbGxfYWxsb2Nfc2NyYXRjaChjYWxsLCAxNik7CisJYnBbMF0gPSBodG9ubChGU0ZFVENIU1RBVFVTKTsKKwlicFsxXSA9IGh0b25sKHZub2RlLT5maWQudmlkKTsKKwlicFsyXSA9IGh0b25sKHZub2RlLT5maWQudm5vZGUpOworCWJwWzNdID0gaHRvbmwodm5vZGUtPmZpZC51bmlxdWUpOworCisJcGlvdlswXS5pb3ZfbGVuID0gMTY7CisJcGlvdlswXS5pb3ZfYmFzZSA9IGJwOworCisJLyogc2VuZCB0aGUgcGFyYW1ldGVycyB0byB0aGUgc2VydmVyICovCisJcmV0ID0gcnhycGNfY2FsbF93cml0ZV9kYXRhKGNhbGwsIDEsIHBpb3YsIFJYUlBDX0xBU1RfUEFDS0VULCBHRlBfTk9GUywKKwkJCQkgICAgMCwgJnNlbnQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGFib3J0OworCisJLyogd2FpdCBmb3IgdGhlIHJlcGx5IHRvIGNvbXBsZXRlbHkgYXJyaXZlICovCisJYnAgPSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goY2FsbCwgMTIwKTsKKworCXJldCA9IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwsIGJwLCAxMjAsCisJCQkJICAgUlhSUENfQ0FMTF9SRUFEX0JMT0NLIHwKKwkJCQkgICBSWFJQQ19DQUxMX1JFQURfQUxMKTsKKwlpZiAocmV0IDwgMCkgeworCQlpZiAocmV0ID09IC1FQ09OTkFCT1JURUQpIHsKKwkJCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKKwkJCWdvdG8gb3V0X3Vud2FpdDsKKwkJfQorCQlnb3RvIGFib3J0OworCX0KKworCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5ICovCisJdm5vZGUtPnN0YXR1cy5pZl92ZXJzaW9uCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMudHlwZQkJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5ubGluawkJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5zaXplCQk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLnZlcnNpb24JCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMuYXV0aG9yCQk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLm93bmVyCQk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLmNhbGxlcl9hY2Nlc3MJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5hbm9uX2FjY2Vzcwk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLm1vZGUJCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMucGFyZW50LnZpZAk9IHZub2RlLT5maWQudmlkOworCXZub2RlLT5zdGF0dXMucGFyZW50LnZub2RlCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMucGFyZW50LnVuaXF1ZQk9IG50b2hsKCpicCsrKTsKKwlicCsrOyAvKiBzZWcgc2l6ZSAqLworCXZub2RlLT5zdGF0dXMubXRpbWVfY2xpZW50CT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMubXRpbWVfc2VydmVyCT0gbnRvaGwoKmJwKyspOworCWJwKys7IC8qIGdyb3VwICovCisJYnArKzsgLyogc3luYyBjb3VudGVyICovCisJdm5vZGUtPnN0YXR1cy52ZXJzaW9uIHw9ICgodW5zaWduZWQgbG9uZyBsb25nKSBudG9obCgqYnArKykpIDw8IDMyOworCWJwKys7IC8qIHNwYXJlMiAqLworCWJwKys7IC8qIHNwYXJlMyAqLworCWJwKys7IC8qIHNwYXJlNCAqLworCisJdm5vZGUtPmNiX3ZlcnNpb24JCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5jYl9leHBpcnkJCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5jYl90eXBlCQkJPSBudG9obCgqYnArKyk7CisKKwlpZiAodm9sc3luYykgeworCQl2b2xzeW5jLT5jcmVhdGlvbgk9IG50b2hsKCpicCsrKTsKKwkJYnArKzsgLyogc3BhcmUyICovCisJCWJwKys7IC8qIHNwYXJlMyAqLworCQlicCsrOyAvKiBzcGFyZTQgKi8KKwkJYnArKzsgLyogc3BhcmU1ICovCisJCWJwKys7IC8qIHNwYXJlNiAqLworCX0KKworCS8qIHN1Y2Nlc3MgKi8KKwlyZXQgPSAwOworCisgb3V0X3Vud2FpdDoKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7CisJcnhycGNfcHV0X2NhbGwoY2FsbCk7Cisgb3V0X3B1dF9jb25uOgorCWFmc19zZXJ2ZXJfcmVsZWFzZV9jYWxsc2xvdChzZXJ2ZXIsICZjYWxsc2xvdCk7Cisgb3V0OgorCV9sZWF2ZSgiIik7CisJcmV0dXJuIHJldDsKKworIGFib3J0OgorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIHJldCk7CisJc2NoZWR1bGUoKTsKKwlnb3RvIG91dF91bndhaXQ7Cit9IC8qIGVuZCBhZnNfcnhmc19mZXRjaF9maWxlX3N0YXR1cygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBmZXRjaCB0aGUgY29udGVudHMgb2YgYSBmaWxlIG9yIGRpcmVjdG9yeQorICovCitpbnQgYWZzX3J4ZnNfZmV0Y2hfZmlsZV9kYXRhKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkgICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAorCQkJICAgICBzdHJ1Y3QgYWZzX3J4ZnNfZmV0Y2hfZGVzY3JpcHRvciAqZGVzYywKKwkJCSAgICAgc3RydWN0IGFmc192b2xzeW5jICp2b2xzeW5jKQoreworCXN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90IGNhbGxzbG90OworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCBrdmVjIHBpb3ZbMV07CisJc2l6ZV90IHNlbnQ7CisJaW50IHJldDsKKwlfX2JlMzIgKmJwOworCisJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKworCV9lbnRlcigiJXAse2ZpZD17JXUsJXUsJXV9LHN6PSVadSxvZj0lbHV9IiwKKwkgICAgICAgc2VydmVyLAorCSAgICAgICBkZXNjLT5maWQudmlkLAorCSAgICAgICBkZXNjLT5maWQudm5vZGUsCisJICAgICAgIGRlc2MtPmZpZC51bmlxdWUsCisJICAgICAgIGRlc2MtPnNpemUsCisJICAgICAgIGRlc2MtPm9mZnNldCk7CisKKwkvKiBnZXQgaG9sZCBvZiB0aGUgZmlsZXNlcnZlciBjb25uZWN0aW9uICovCisJcmV0ID0gYWZzX3NlcnZlcl9yZXF1ZXN0X2NhbGxzbG90KHNlcnZlciwgJmNhbGxzbG90KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBjcmVhdGUgYSBjYWxsIHRocm91Z2ggdGhhdCBjb25uZWN0aW9uICovCisJcmV0ID0gcnhycGNfY3JlYXRlX2NhbGwoY2FsbHNsb3QuY29ubiwgTlVMTCwgTlVMTCwgYWZzX3J4ZnNfYWVtYXAsICZjYWxsKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoImtBRlM6IFVuYWJsZSB0byBjcmVhdGUgY2FsbDogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0X3B1dF9jb25uOworCX0KKwljYWxsLT5hcHBfb3Bjb2RlID0gRlNGRVRDSERBVEE7CisKKwkvKiB3ZSB3YW50IHRvIGdldCBldmVudCBub3RpZmljYXRpb25zIGZyb20gdGhlIGNhbGwgKi8KKwlhZGRfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCisJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KKwlicCA9IHJ4cnBjX2NhbGxfYWxsb2Nfc2NyYXRjaChjYWxsLCAyNCk7CisJYnBbMF0gPSBodG9ubChGU0ZFVENIREFUQSk7CisJYnBbMV0gPSBodG9ubChkZXNjLT5maWQudmlkKTsKKwlicFsyXSA9IGh0b25sKGRlc2MtPmZpZC52bm9kZSk7CisJYnBbM10gPSBodG9ubChkZXNjLT5maWQudW5pcXVlKTsKKwlicFs0XSA9IGh0b25sKGRlc2MtPm9mZnNldCk7CisJYnBbNV0gPSBodG9ubChkZXNjLT5zaXplKTsKKworCXBpb3ZbMF0uaW92X2xlbiA9IDI0OworCXBpb3ZbMF0uaW92X2Jhc2UgPSBicDsKKworCS8qIHNlbmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciAqLworCXJldCA9IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShjYWxsLCAxLCBwaW92LCBSWFJQQ19MQVNUX1BBQ0tFVCwgR0ZQX05PRlMsCisJCQkJICAgIDAsICZzZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBhYm9ydDsKKworCS8qIHdhaXQgZm9yIHRoZSBkYXRhIGNvdW50IHRvIGFycml2ZSAqLworCXJldCA9IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwsIGJwLCA0LCBSWFJQQ19DQUxMX1JFQURfQkxPQ0spOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHJlYWRfZmFpbGVkOworCisJZGVzYy0+YWN0dWFsID0gbnRvaGwoYnBbMF0pOworCWlmIChkZXNjLT5hY3R1YWwgIT0gZGVzYy0+c2l6ZSkgeworCQlyZXQgPSAtRUJBRE1TRzsKKwkJZ290byBhYm9ydDsKKwl9CisKKwkvKiBjYWxsIHRoZSBhcHAgdG8gcmVhZCB0aGUgYWN0dWFsIGRhdGEgKi8KKwlyeHJwY19jYWxsX3Jlc2V0X3NjcmF0Y2goY2FsbCk7CisKKwlyZXQgPSByeHJwY19jYWxsX3JlYWRfZGF0YShjYWxsLCBkZXNjLT5idWZmZXIsIGRlc2MtPmFjdHVhbCwKKwkJCQkgICBSWFJQQ19DQUxMX1JFQURfQkxPQ0spOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHJlYWRfZmFpbGVkOworCisJLyogd2FpdCBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJlcGx5IHRvIGNvbXBsZXRlbHkgYXJyaXZlICovCisJcnhycGNfY2FsbF9yZXNldF9zY3JhdGNoKGNhbGwpOworCWJwID0gcnhycGNfY2FsbF9hbGxvY19zY3JhdGNoKGNhbGwsIDEyMCk7CisKKwlyZXQgPSByeHJwY19jYWxsX3JlYWRfZGF0YShjYWxsLCBicCwgMTIwLAorCQkJCSAgIFJYUlBDX0NBTExfUkVBRF9CTE9DSyB8CisJCQkJICAgUlhSUENfQ0FMTF9SRUFEX0FMTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gcmVhZF9mYWlsZWQ7CisKKwkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSAqLworCXZub2RlLT5zdGF0dXMuaWZfdmVyc2lvbgk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLnR5cGUJCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMubmxpbmsJCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMuc2l6ZQkJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy52ZXJzaW9uCQk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLmF1dGhvcgkJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5vd25lcgkJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5jYWxsZXJfYWNjZXNzCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMuYW5vbl9hY2Nlc3MJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5tb2RlCQk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLnBhcmVudC52aWQJPSBkZXNjLT5maWQudmlkOworCXZub2RlLT5zdGF0dXMucGFyZW50LnZub2RlCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMucGFyZW50LnVuaXF1ZQk9IG50b2hsKCpicCsrKTsKKwlicCsrOyAvKiBzZWcgc2l6ZSAqLworCXZub2RlLT5zdGF0dXMubXRpbWVfY2xpZW50CT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMubXRpbWVfc2VydmVyCT0gbnRvaGwoKmJwKyspOworCWJwKys7IC8qIGdyb3VwICovCisJYnArKzsgLyogc3luYyBjb3VudGVyICovCisJdm5vZGUtPnN0YXR1cy52ZXJzaW9uIHw9ICgodW5zaWduZWQgbG9uZyBsb25nKSBudG9obCgqYnArKykpIDw8IDMyOworCWJwKys7IC8qIHNwYXJlMiAqLworCWJwKys7IC8qIHNwYXJlMyAqLworCWJwKys7IC8qIHNwYXJlNCAqLworCisJdm5vZGUtPmNiX3ZlcnNpb24JCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5jYl9leHBpcnkJCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5jYl90eXBlCQkJPSBudG9obCgqYnArKyk7CisKKwlpZiAodm9sc3luYykgeworCQl2b2xzeW5jLT5jcmVhdGlvbgk9IG50b2hsKCpicCsrKTsKKwkJYnArKzsgLyogc3BhcmUyICovCisJCWJwKys7IC8qIHNwYXJlMyAqLworCQlicCsrOyAvKiBzcGFyZTQgKi8KKwkJYnArKzsgLyogc3BhcmU1ICovCisJCWJwKys7IC8qIHNwYXJlNiAqLworCX0KKworCS8qIHN1Y2Nlc3MgKi8KKwlyZXQgPSAwOworCisgb3V0X3Vud2FpdDoKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwmbXlzZWxmKTsKKwlyeHJwY19wdXRfY2FsbChjYWxsKTsKKyBvdXRfcHV0X2Nvbm46CisJYWZzX3NlcnZlcl9yZWxlYXNlX2NhbGxzbG90KHNlcnZlciwgJmNhbGxzbG90KTsKKyBvdXQ6CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKworIHJlYWRfZmFpbGVkOgorCWlmIChyZXQgPT0gLUVDT05OQUJPUlRFRCkgeworCQlyZXQgPSBjYWxsLT5hcHBfZXJybm87CisJCWdvdG8gb3V0X3Vud2FpdDsKKwl9CisKKyBhYm9ydDoKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOworCXNjaGVkdWxlKCk7CisJZ290byBvdXRfdW53YWl0OworCit9IC8qIGVuZCBhZnNfcnhmc19mZXRjaF9maWxlX2RhdGEoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogYXNrIHRoZSBBRlMgZmlsZXNlcnZlciB0byBkaXNjYXJkIGEgY2FsbGJhY2sgcmVxdWVzdCBvbiBhIGZpbGUKKyAqLworaW50IGFmc19yeGZzX2dpdmVfdXBfY2FsbGJhY2soc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCSAgICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKQoreworCXN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90IGNhbGxzbG90OworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCBrdmVjIHBpb3ZbMV07CisJc2l6ZV90IHNlbnQ7CisJaW50IHJldDsKKwlfX2JlMzIgKmJwOworCisJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKworCV9lbnRlcigiJXAseyV1LCV1LCV1fSIsCisJICAgICAgIHNlcnZlciwgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsIHZub2RlLT5maWQudW5pcXVlKTsKKworCS8qIGdldCBob2xkIG9mIHRoZSBmaWxlc2VydmVyIGNvbm5lY3Rpb24gKi8KKwlyZXQgPSBhZnNfc2VydmVyX3JlcXVlc3RfY2FsbHNsb3Qoc2VydmVyLCAmY2FsbHNsb3QpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KKwlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjYWxsc2xvdC5jb25uLCBOVUxMLCBOVUxMLCBhZnNfcnhmc19hZW1hcCwgJmNhbGwpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygia0FGUzogVW5hYmxlIHRvIGNyZWF0ZSBjYWxsOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXRfcHV0X2Nvbm47CisJfQorCWNhbGwtPmFwcF9vcGNvZGUgPSBGU0dJVkVVUENBTExCQUNLUzsKKworCS8qIHdlIHdhbnQgdG8gZ2V0IGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgY2FsbCAqLworCWFkZF93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7CisKKwkvKiBtYXJzaGFsbCB0aGUgcGFyYW1ldGVycyAqLworCWJwID0gcnhycGNfY2FsbF9hbGxvY19zY3JhdGNoKGNhbGwsICgxICsgNCArIDQpICogNCk7CisKKwlwaW92WzBdLmlvdl9sZW4gPSAoMSArIDQgKyA0KSAqIDQ7CisJcGlvdlswXS5pb3ZfYmFzZSA9IGJwOworCisJKmJwKysgPSBodG9ubChGU0dJVkVVUENBTExCQUNLUyk7CisJKmJwKysgPSBodG9ubCgxKTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudmlkKTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudm5vZGUpOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC51bmlxdWUpOworCSpicCsrID0gaHRvbmwoMSk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+Y2JfdmVyc2lvbik7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+Y2JfZXhwaXJ5KTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5jYl90eXBlKTsKKworCS8qIHNlbmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciAqLworCXJldCA9IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShjYWxsLCAxLCBwaW92LCBSWFJQQ19MQVNUX1BBQ0tFVCwgR0ZQX05PRlMsCisJCQkJICAgIDAsICZzZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBhYm9ydDsKKworCS8qIHdhaXQgZm9yIHRoZSByZXBseSB0byBjb21wbGV0ZWx5IGFycml2ZSAqLworCWZvciAoOzspIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGNhbGwtPmFwcF9jYWxsX3N0YXRlICE9IFJYUlBDX0NTVEFURV9DTE5UX1JDVl9SRVBMWSB8fAorCQkgICAgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJc2NoZWR1bGUoKTsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCXJldCA9IC1FSU5UUjsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCWdvdG8gYWJvcnQ7CisKKwlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7CisJY2FzZSBSWFJQQ19DU1RBVEVfRVJST1I6CisJCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKKwkJZ290byBvdXRfdW53YWl0OworCisJY2FzZSBSWFJQQ19DU1RBVEVfQ0xOVF9HT1RfUkVQTFk6CisJCXJldCA9IDA7CisJCWdvdG8gb3V0X3Vud2FpdDsKKworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworIG91dF91bndhaXQ6CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworIG91dF9wdXRfY29ubjoKKwlhZnNfc2VydmVyX3JlbGVhc2VfY2FsbHNsb3Qoc2VydmVyLCAmY2FsbHNsb3QpOworIG91dDoKKwlfbGVhdmUoIiIpOworCXJldHVybiByZXQ7CisKKyBhYm9ydDoKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOworCXNjaGVkdWxlKCk7CisJZ290byBvdXRfdW53YWl0OworfSAvKiBlbmQgYWZzX3J4ZnNfZ2l2ZV91cF9jYWxsYmFjaygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb29rIGEgZmlsZW5hbWUgdXAgaW4gYSBkaXJlY3RvcnkKKyAqIC0gdGhpcyBvcGVyYXRpb24gZG9lc24ndCBzZWVtIHRvIHdvcmsgY29ycmVjdGx5IGluIE9wZW5BRlMgc2VydmVyIDEuMi4yCisgKi8KKyNpZiAwCitpbnQgYWZzX3J4ZnNfbG9va3VwKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCSAgICBzdHJ1Y3QgYWZzX3Zub2RlICpkaXIsCisJCSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAorCQkgICAgc3RydWN0IGFmc192b2xzeW5jICp2b2xzeW5jKQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCBrdmVjIHBpb3ZbM107CisJc2l6ZV90IHNlbnQ7CisJaW50IHJldDsKKwl1MzIgKmJwLCB6ZXJvOworCisJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKworCWtlbnRlcigiJXAseyV1LCV1LCV1fSwlcyIsCisJICAgICAgIHNlcnZlciwgZmlkLT52aWQsIGZpZC0+dm5vZGUsIGZpZC0+dW5pcXVlLCBmaWxlbmFtZSk7CisKKwkvKiBnZXQgaG9sZCBvZiB0aGUgZmlsZXNlcnZlciBjb25uZWN0aW9uICovCisJcmV0ID0gYWZzX3NlcnZlcl9nZXRfZnNjb25uKHNlcnZlciwgJmNvbm4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KKwlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjb25uLCBOVUxMLCBOVUxMLCBhZnNfcnhmc19hZW1hcCwgJmNhbGwpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygia0FGUzogVW5hYmxlIHRvIGNyZWF0ZSBjYWxsOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXRfcHV0X2Nvbm47CisJfQorCWNhbGwtPmFwcF9vcGNvZGUgPSBGU0xPT0tVUDsKKworCS8qIHdlIHdhbnQgdG8gZ2V0IGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgY2FsbCAqLworCWFkZF93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwmbXlzZWxmKTsKKworCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCisJYnAgPSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goY2FsbCwgMjApOworCisJemVybyA9IDA7CisKKwlwaW92WzBdLmlvdl9sZW4gPSAyMDsKKwlwaW92WzBdLmlvdl9iYXNlID0gYnA7CisJcGlvdlsxXS5pb3ZfbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKKwlwaW92WzFdLmlvdl9iYXNlID0gKGNoYXIgKikgZmlsZW5hbWU7CisJcGlvdlsyXS5pb3ZfbGVuID0gKDQgLSAocGlvdlsxXS5pb3ZfbGVuICYgMykpICYgMzsKKwlwaW92WzJdLmlvdl9iYXNlID0gJnplcm87CisKKwkqYnArKyA9IGh0b25sKEZTTE9PS1VQKTsKKwkqYnArKyA9IGh0b25sKGRpcmZpZC0+dmlkKTsKKwkqYnArKyA9IGh0b25sKGRpcmZpZC0+dm5vZGUpOworCSpicCsrID0gaHRvbmwoZGlyZmlkLT51bmlxdWUpOworCSpicCsrID0gaHRvbmwocGlvdlsxXS5pb3ZfbGVuKTsKKworCS8qIHNlbmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciAqLworCXJldCA9IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShjYWxsLCAzLCBwaW92LCBSWFJQQ19MQVNUX1BBQ0tFVCwgR0ZQX05PRlMsCisJCQkJICAgIDAsICZzZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBhYm9ydDsKKworCS8qIHdhaXQgZm9yIHRoZSByZXBseSB0byBjb21wbGV0ZWx5IGFycml2ZSAqLworCWJwID0gcnhycGNfY2FsbF9hbGxvY19zY3JhdGNoKGNhbGwsIDIyMCk7CisKKwlyZXQgPSByeHJwY19jYWxsX3JlYWRfZGF0YShjYWxsLCBicCwgMjIwLAorCQkJCSAgIFJYUlBDX0NBTExfUkVBRF9CTE9DSyB8CisJCQkJICAgUlhSUENfQ0FMTF9SRUFEX0FMTCk7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKHJldCA9PSAtRUNPTk5BQk9SVEVEKSB7CisJCQlyZXQgPSBjYWxsLT5hcHBfZXJybm87CisJCQlnb3RvIG91dF91bndhaXQ7CisJCX0KKwkJZ290byBhYm9ydDsKKwl9CisKKwkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSAqLworCWZpZC0+dmlkCQk9IG50b2hsKCpicCsrKTsKKwlmaWQtPnZub2RlCQk9IG50b2hsKCpicCsrKTsKKwlmaWQtPnVuaXF1ZQkJPSBudG9obCgqYnArKyk7CisKKwl2bm9kZS0+c3RhdHVzLmlmX3ZlcnNpb24JPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy50eXBlCQk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLm5saW5rCQk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLnNpemUJCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMudmVyc2lvbgkJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5hdXRob3IJCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMub3duZXIJCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMuY2FsbGVyX2FjY2Vzcwk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLmFub25fYWNjZXNzCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMubW9kZQkJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5wYXJlbnQudmlkCT0gZGlyZmlkLT52aWQ7CisJdm5vZGUtPnN0YXR1cy5wYXJlbnQudm5vZGUJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5wYXJlbnQudW5pcXVlCT0gbnRvaGwoKmJwKyspOworCWJwKys7IC8qIHNlZyBzaXplICovCisJdm5vZGUtPnN0YXR1cy5tdGltZV9jbGllbnQJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5tdGltZV9zZXJ2ZXIJPSBudG9obCgqYnArKyk7CisJYnArKzsgLyogZ3JvdXAgKi8KKwlicCsrOyAvKiBzeW5jIGNvdW50ZXIgKi8KKwl2bm9kZS0+c3RhdHVzLnZlcnNpb24gfD0gKCh1bnNpZ25lZCBsb25nIGxvbmcpIG50b2hsKCpicCsrKSkgPDwgMzI7CisJYnArKzsgLyogc3BhcmUyICovCisJYnArKzsgLyogc3BhcmUzICovCisJYnArKzsgLyogc3BhcmU0ICovCisKKwlkaXItPnN0YXR1cy5pZl92ZXJzaW9uCQk9IG50b2hsKCpicCsrKTsKKwlkaXItPnN0YXR1cy50eXBlCQk9IG50b2hsKCpicCsrKTsKKwlkaXItPnN0YXR1cy5ubGluawkJPSBudG9obCgqYnArKyk7CisJZGlyLT5zdGF0dXMuc2l6ZQkJPSBudG9obCgqYnArKyk7CisJZGlyLT5zdGF0dXMudmVyc2lvbgkJPSBudG9obCgqYnArKyk7CisJZGlyLT5zdGF0dXMuYXV0aG9yCQk9IG50b2hsKCpicCsrKTsKKwlkaXItPnN0YXR1cy5vd25lcgkJPSBudG9obCgqYnArKyk7CisJZGlyLT5zdGF0dXMuY2FsbGVyX2FjY2Vzcwk9IG50b2hsKCpicCsrKTsKKwlkaXItPnN0YXR1cy5hbm9uX2FjY2VzcwkJPSBudG9obCgqYnArKyk7CisJZGlyLT5zdGF0dXMubW9kZQkJPSBudG9obCgqYnArKyk7CisJZGlyLT5zdGF0dXMucGFyZW50LnZpZAkJPSBkaXJmaWQtPnZpZDsKKwlkaXItPnN0YXR1cy5wYXJlbnQudm5vZGUJPSBudG9obCgqYnArKyk7CisJZGlyLT5zdGF0dXMucGFyZW50LnVuaXF1ZQk9IG50b2hsKCpicCsrKTsKKwlicCsrOyAvKiBzZWcgc2l6ZSAqLworCWRpci0+c3RhdHVzLm10aW1lX2NsaWVudAk9IG50b2hsKCpicCsrKTsKKwlkaXItPnN0YXR1cy5tdGltZV9zZXJ2ZXIJPSBudG9obCgqYnArKyk7CisJYnArKzsgLyogZ3JvdXAgKi8KKwlicCsrOyAvKiBzeW5jIGNvdW50ZXIgKi8KKwlkaXItPnN0YXR1cy52ZXJzaW9uIHw9ICgodW5zaWduZWQgbG9uZyBsb25nKSBudG9obCgqYnArKykpIDw8IDMyOworCWJwKys7IC8qIHNwYXJlMiAqLworCWJwKys7IC8qIHNwYXJlMyAqLworCWJwKys7IC8qIHNwYXJlNCAqLworCisJY2FsbGJhY2stPmZpZAkJPSAqZmlkOworCWNhbGxiYWNrLT52ZXJzaW9uCT0gbnRvaGwoKmJwKyspOworCWNhbGxiYWNrLT5leHBpcnkJPSBudG9obCgqYnArKyk7CisJY2FsbGJhY2stPnR5cGUJCT0gbnRvaGwoKmJwKyspOworCisJaWYgKHZvbHN5bmMpIHsKKwkJdm9sc3luYy0+Y3JlYXRpb24JPSBudG9obCgqYnArKyk7CisJCWJwKys7IC8qIHNwYXJlMiAqLworCQlicCsrOyAvKiBzcGFyZTMgKi8KKwkJYnArKzsgLyogc3BhcmU0ICovCisJCWJwKys7IC8qIHNwYXJlNSAqLworCQlicCsrOyAvKiBzcGFyZTYgKi8KKwl9CisKKwkvKiBzdWNjZXNzICovCisJcmV0ID0gMDsKKworIG91dF91bndhaXQ6CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworIG91dF9wdXRfY29ubjoKKwlhZnNfc2VydmVyX3JlbGVhc2VfZnNjb25uKHNlcnZlciwgY29ubik7Cisgb3V0OgorCWtsZWF2ZSgiIik7CisJcmV0dXJuIHJldDsKKworIGFib3J0OgorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIHJldCk7CisJc2NoZWR1bGUoKTsKKwlnb3RvIG91dF91bndhaXQ7Cit9IC8qIGVuZCBhZnNfcnhmc19sb29rdXAoKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9hZnMvZnNjbGllbnQuaCBiL2ZzL2Fmcy9mc2NsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYTNlNzQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvZnNjbGllbnQuaApAQCAtMCwwICsxLDU0IEBACisvKiBmc2NsaWVudC5oOiBBRlMgRmlsZSBTZXJ2ZXIgY2xpZW50IHN0dWIgZGVjbGFyYXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0FGU19GU0NMSUVOVF9ICisjZGVmaW5lIF9MSU5VWF9BRlNfRlNDTElFTlRfSAorCisjaW5jbHVkZSAic2VydmVyLmgiCisKK2V4dGVybiBpbnQgYWZzX3J4ZnNfZ2V0X3ZvbHVtZV9pbmZvKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgIHN0cnVjdCBhZnNfdm9sdW1lX2luZm8gKnZpbmZvKTsKKworZXh0ZXJuIGludCBhZnNfcnhmc19mZXRjaF9maWxlX3N0YXR1cyhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkJCSAgICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAorCQkJCSAgICAgIHN0cnVjdCBhZnNfdm9sc3luYyAqdm9sc3luYyk7CisKK3N0cnVjdCBhZnNfcnhmc19mZXRjaF9kZXNjcmlwdG9yIHsKKwlzdHJ1Y3QgYWZzX2ZpZAlmaWQ7CQkvKiBmaWxlIElEIHRvIGZldGNoICovCisJc2l6ZV90CQlzaXplOwkJLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHRvIGZldGNoICovCisJb2ZmX3QJCW9mZnNldDsJCS8qIG9mZnNldCBpbiBmaWxlIHRvIHN0YXJ0IGZyb20gKi8KKwl2b2lkCQkqYnVmZmVyOwkvKiByZWFkIGJ1ZmZlciAqLworCXNpemVfdAkJYWN0dWFsOwkJLyogYWN0dWFsIHNpemUgc2VudCBiYWNrIGJ5IHNlcnZlciAqLworfTsKKworZXh0ZXJuIGludCBhZnNfcnhmc19mZXRjaF9maWxlX2RhdGEoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCQkgICAgc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCQkJICAgIHN0cnVjdCBhZnNfcnhmc19mZXRjaF9kZXNjcmlwdG9yICpkZXNjLAorCQkJCSAgICBzdHJ1Y3QgYWZzX3ZvbHN5bmMgKnZvbHN5bmMpOworCitleHRlcm4gaW50IGFmc19yeGZzX2dpdmVfdXBfY2FsbGJhY2soc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCQkgICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKTsKKworLyogdGhpcyBkb2Vzbid0IGFwcGVhciB0byB3b3JrIGluIE9wZW5BRlMgc2VydmVyICovCitleHRlcm4gaW50IGFmc19yeGZzX2xvb2t1cChzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkJICAgc3RydWN0IGFmc192bm9kZSAqZGlyLAorCQkJICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQkgICBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKKwkJCSAgIHN0cnVjdCBhZnNfdm9sc3luYyAqdm9sc3luYyk7CisKKy8qIHRoaXMgaXMgYXBwYXJlbnRseSBtaXMtaW1wbGVtZW50ZWQgaW4gT3BlbkFGUyBzZXJ2ZXIgKi8KK2V4dGVybiBpbnQgYWZzX3J4ZnNfZ2V0X3Jvb3Rfdm9sdW1lKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkJICAgIGNoYXIgKmJ1ZiwKKwkJCQkgICAgc2l6ZV90ICpidWZsZW4pOworCisKKyNlbmRpZiAvKiBfTElOVVhfQUZTX0ZTQ0xJRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9pbm9kZS5jIGIvZnMvYWZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3NmZkZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9pbm9kZS5jCkBAIC0wLDAgKzEsMjg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIEF1dGhvcnM6IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAY2FtYnJpZGdlLnJlZGhhdC5jb20+CisgKiAgICAgICAgICBEYXZpZCBIb3dlbGxzIDxkaG93ZWxsc0ByZWRoYXQuY29tPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgInZvbHVtZS5oIgorI2luY2x1ZGUgInZub2RlLmgiCisjaW5jbHVkZSAic3VwZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdHJ1Y3QgYWZzX2lnZXRfZGF0YSB7CisJc3RydWN0IGFmc19maWQJCWZpZDsKKwlzdHJ1Y3QgYWZzX3ZvbHVtZQkqdm9sdW1lOwkvKiB2b2x1bWUgb24gd2hpY2ggcmVzaWRlcyAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIG1hcCB0aGUgQUZTIGZpbGUgc3RhdHVzIHRvIHRoZSBpbm9kZSBtZW1iZXIgdmFyaWFibGVzCisgKi8KK3N0YXRpYyBpbnQgYWZzX2lub2RlX21hcF9zdGF0dXMoc3RydWN0IGFmc192bm9kZSAqdm5vZGUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IEFGU19WTk9ERV9UT19JKHZub2RlKTsKKworCV9kZWJ1ZygiRlM6IGZ0PSVkIGxrPSVkIHN6PSVadSB2ZXI9JUx1IG1vZD0laHUiLAorCSAgICAgICB2bm9kZS0+c3RhdHVzLnR5cGUsCisJICAgICAgIHZub2RlLT5zdGF0dXMubmxpbmssCisJICAgICAgIHZub2RlLT5zdGF0dXMuc2l6ZSwKKwkgICAgICAgdm5vZGUtPnN0YXR1cy52ZXJzaW9uLAorCSAgICAgICB2bm9kZS0+c3RhdHVzLm1vZGUpOworCisJc3dpdGNoICh2bm9kZS0+c3RhdHVzLnR5cGUpIHsKKwljYXNlIEFGU19GVFlQRV9GSUxFOgorCQlpbm9kZS0+aV9tb2RlCT0gU19JRlJFRyB8IHZub2RlLT5zdGF0dXMubW9kZTsKKwkJaW5vZGUtPmlfb3AJPSAmYWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wCT0gJmFmc19maWxlX2ZpbGVfb3BlcmF0aW9uczsKKwkJYnJlYWs7CisJY2FzZSBBRlNfRlRZUEVfRElSOgorCQlpbm9kZS0+aV9tb2RlCT0gU19JRkRJUiB8IHZub2RlLT5zdGF0dXMubW9kZTsKKwkJaW5vZGUtPmlfb3AJPSAmYWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AJPSAmYWZzX2Rpcl9maWxlX29wZXJhdGlvbnM7CisJCWJyZWFrOworCWNhc2UgQUZTX0ZUWVBFX1NZTUxJTks6CisJCWlub2RlLT5pX21vZGUJPSBTX0lGTE5LIHwgdm5vZGUtPnN0YXR1cy5tb2RlOworCQlpbm9kZS0+aV9vcAk9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCJrQUZTOiBBRlMgdm5vZGUgd2l0aCB1bmRlZmluZWQgdHlwZVxuIik7CisJCXJldHVybiAtRUJBRE1TRzsKKwl9CisKKwlpbm9kZS0+aV9ubGluawkJPSB2bm9kZS0+c3RhdHVzLm5saW5rOworCWlub2RlLT5pX3VpZAkJPSB2bm9kZS0+c3RhdHVzLm93bmVyOworCWlub2RlLT5pX2dpZAkJPSAwOworCWlub2RlLT5pX3NpemUJCT0gdm5vZGUtPnN0YXR1cy5zaXplOworCWlub2RlLT5pX2N0aW1lLnR2X3NlYwk9IHZub2RlLT5zdGF0dXMubXRpbWVfc2VydmVyOworCWlub2RlLT5pX2N0aW1lLnR2X25zZWMJPSAwOworCWlub2RlLT5pX2F0aW1lCQk9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWU7CisJaW5vZGUtPmlfYmxrc2l6ZQk9IFBBR0VfQ0FDSEVfU0laRTsKKwlpbm9kZS0+aV9ibG9ja3MJCT0gMDsKKwlpbm9kZS0+aV92ZXJzaW9uCT0gdm5vZGUtPmZpZC51bmlxdWU7CisJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMJPSAmYWZzX2ZzX2FvcHM7CisKKwkvKiBjaGVjayB0byBzZWUgd2hldGhlciBhIHN5bWJvbGljIGxpbmsgaXMgcmVhbGx5IGEgbW91bnRwb2ludCAqLworCWlmICh2bm9kZS0+c3RhdHVzLnR5cGUgPT0gQUZTX0ZUWVBFX1NZTUxJTkspIHsKKwkJYWZzX21udHB0X2NoZWNrX3N5bWxpbmsodm5vZGUpOworCisJCWlmICh2bm9kZS0+ZmxhZ3MgJiBBRlNfVk5PREVfTU9VTlRQT0lOVCkgeworCQkJaW5vZGUtPmlfbW9kZQk9IFNfSUZESVIgfCB2bm9kZS0+c3RhdHVzLm1vZGU7CisJCQlpbm9kZS0+aV9vcAk9ICZhZnNfbW50cHRfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2ZvcAk9ICZhZnNfbW50cHRfZmlsZV9vcGVyYXRpb25zOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9IC8qIGVuZCBhZnNfaW5vZGVfbWFwX3N0YXR1cygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBhdHRlbXB0IHRvIGZldGNoIHRoZSBzdGF0dXMgb2YgYW4gaW5vZGUsIGNvZWxlc2NpbmcgbXVsdGlwbGUgc2ltdWx0YW5lb3VzCisgKiBmZXRjaGVzCisgKi8KK3N0YXRpYyBpbnQgYWZzX2lub2RlX2ZldGNoX3N0YXR1cyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlOworCWludCByZXQ7CisKKwl2bm9kZSA9IEFGU19GU19JKGlub2RlKTsKKworCXJldCA9IGFmc192bm9kZV9mZXRjaF9zdGF0dXModm5vZGUpOworCisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBhZnNfaW5vZGVfbWFwX3N0YXR1cyh2bm9kZSk7CisKKwlyZXR1cm4gcmV0OworCit9IC8qIGVuZCBhZnNfaW5vZGVfZmV0Y2hfc3RhdHVzKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGlnZXQ1KCkgY29tcGFyYXRvcgorICovCitzdGF0aWMgaW50IGFmc19pZ2V0NV90ZXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKm9wYXF1ZSkKK3sKKwlzdHJ1Y3QgYWZzX2lnZXRfZGF0YSAqZGF0YSA9IG9wYXF1ZTsKKworCXJldHVybiBpbm9kZS0+aV9pbm8gPT0gZGF0YS0+ZmlkLnZub2RlICYmCisJCWlub2RlLT5pX3ZlcnNpb24gPT0gZGF0YS0+ZmlkLnVuaXF1ZTsKK30gLyogZW5kIGFmc19pZ2V0NV90ZXN0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGlnZXQ1KCkgaW5vZGUgaW5pdGlhbGlzZXIKKyAqLworc3RhdGljIGludCBhZnNfaWdldDVfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKm9wYXF1ZSkKK3sKKwlzdHJ1Y3QgYWZzX2lnZXRfZGF0YSAqZGF0YSA9IG9wYXF1ZTsKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IEFGU19GU19JKGlub2RlKTsKKworCWlub2RlLT5pX2lubyA9IGRhdGEtPmZpZC52bm9kZTsKKwlpbm9kZS0+aV92ZXJzaW9uID0gZGF0YS0+ZmlkLnVuaXF1ZTsKKwl2bm9kZS0+ZmlkID0gZGF0YS0+ZmlkOworCXZub2RlLT52b2x1bWUgPSBkYXRhLT52b2x1bWU7CisKKwlyZXR1cm4gMDsKK30gLyogZW5kIGFmc19pZ2V0NV9zZXQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaW5vZGUgcmV0cmlldmFsCisgKi8KK2lubGluZSBpbnQgYWZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGFmc19maWQgKmZpZCwKKwkJICAgIHN0cnVjdCBpbm9kZSAqKl9pbm9kZSkKK3sKKwlzdHJ1Y3QgYWZzX2lnZXRfZGF0YSBkYXRhID0geyAuZmlkID0gKmZpZCB9OworCXN0cnVjdCBhZnNfc3VwZXJfaW5mbyAqYXM7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgcmV0OworCisJX2VudGVyKCIseyV1LCV1LCV1fSwsIiwgZmlkLT52aWQsIGZpZC0+dm5vZGUsIGZpZC0+dW5pcXVlKTsKKworCWFzID0gc2ItPnNfZnNfaW5mbzsKKwlkYXRhLnZvbHVtZSA9IGFzLT52b2x1bWU7CisKKwlpbm9kZSA9IGlnZXQ1X2xvY2tlZChzYiwgZmlkLT52bm9kZSwgYWZzX2lnZXQ1X3Rlc3QsIGFmc19pZ2V0NV9zZXQsCisJCQkgICAgICZkYXRhKTsKKwlpZiAoIWlub2RlKSB7CisJCV9sZWF2ZSgiID0gLUVOT01FTSIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl2bm9kZSA9IEFGU19GU19JKGlub2RlKTsKKworCS8qIGRlYWwgd2l0aCBhbiBleGlzdGluZyBpbm9kZSAqLworCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpKSB7CisJCXJldCA9IGFmc192bm9kZV9mZXRjaF9zdGF0dXModm5vZGUpOworCQlpZiAocmV0PT0wKQorCQkJKl9pbm9kZSA9IGlub2RlOworCQllbHNlCisJCQlpcHV0KGlub2RlKTsKKwkJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorCS8qIHNldCB1cCBjYWNoaW5nIGJlZm9yZSByZWFkaW5nIHRoZSBzdGF0dXMsIGFzIGZldGNoLXN0YXR1cyByZWFkcyB0aGUKKwkgKiBmaXJzdCBwYWdlIG9mIHN5bWxpbmtzIHRvIHNlZSBpZiB0aGV5J3JlIHJlYWxseSBtbnRwdHMgKi8KKwljYWNoZWZzX2FjcXVpcmVfY29va2llKHZub2RlLT52b2x1bWUtPmNhY2hlLAorCQkJICAgICAgIE5VTEwsCisJCQkgICAgICAgdm5vZGUsCisJCQkgICAgICAgJnZub2RlLT5jYWNoZSk7CisjZW5kaWYKKworCS8qIG9rYXkuLi4gaXQncyBhIG5ldyBpbm9kZSAqLworCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9BVElNRTsKKwl2bm9kZS0+ZmxhZ3MgfD0gQUZTX1ZOT0RFX0NIQU5HRUQ7CisJcmV0ID0gYWZzX2lub2RlX2ZldGNoX3N0YXR1cyhpbm9kZSk7CisJaWYgKHJldDwwKQorCQlnb3RvIGJhZF9pbm9kZTsKKworCS8qIHN1Y2Nlc3MgKi8KKwl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKworCSpfaW5vZGUgPSBpbm9kZTsKKwlfbGVhdmUoIiA9IDAgW0NCIHsgdj0ldSB4PSVsdSB0PSV1IH1dIiwKKwkgICAgICAgdm5vZGUtPmNiX3ZlcnNpb24sCisJICAgICAgIHZub2RlLT5jYl90aW1lb3V0LnRpbW9famlmLAorCSAgICAgICB2bm9kZS0+Y2JfdHlwZSk7CisJcmV0dXJuIDA7CisKKwkvKiBmYWlsdXJlICovCisgYmFkX2lub2RlOgorCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwlpcHV0KGlub2RlKTsKKworCV9sZWF2ZSgiID0gJWQgW2JhZF0iLCByZXQpOworCXJldHVybiByZXQ7Cit9IC8qIGVuZCBhZnNfaWdldCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiByZWFkIHRoZSBhdHRyaWJ1dGVzIG9mIGFuIGlub2RlCisgKi8KK2ludCBhZnNfaW5vZGVfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICAgICBzdHJ1Y3Qga3N0YXQgKnN0YXQpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgcmV0OworCisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisKKwlfZW50ZXIoInsgaW5vPSVsdSB2PSVsdSB9IiwgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV92ZXJzaW9uKTsKKworCXZub2RlID0gQUZTX0ZTX0koaW5vZGUpOworCisJcmV0ID0gYWZzX2lub2RlX2ZldGNoX3N0YXR1cyhpbm9kZSk7CisJaWYgKHJldCA9PSAtRU5PRU5UKSB7CisJCV9sZWF2ZSgiID0gJWQgWyVkICVwXSIsCisJCSAgICAgICByZXQsIGF0b21pY19yZWFkKCZkZW50cnktPmRfY291bnQpLCBkZW50cnktPmRfaW5vZGUpOworCQlyZXR1cm4gcmV0OworCX0KKwllbHNlIGlmIChyZXQgPCAwKSB7CisJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogdHJhbnNmZXIgYXR0cmlidXRlcyBmcm9tIHRoZSBpbm9kZSBzdHJ1Y3R1cmUgdG8gdGhlIHN0YXQKKwkgKiBzdHJ1Y3R1cmUgKi8KKwlnZW5lcmljX2ZpbGxhdHRyKGlub2RlLCBzdGF0KTsKKworCV9sZWF2ZSgiID0gMCBDQiB7IHY9JXUgeD0ldSB0PSV1IH0iLAorCSAgICAgICB2bm9kZS0+Y2JfdmVyc2lvbiwKKwkgICAgICAgdm5vZGUtPmNiX2V4cGlyeSwKKwkgICAgICAgdm5vZGUtPmNiX3R5cGUpOworCisJcmV0dXJuIDA7Cit9IC8qIGVuZCBhZnNfaW5vZGVfZ2V0YXR0cigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjbGVhciBhbiBBRlMgaW5vZGUKKyAqLwordm9pZCBhZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZTsKKworCXZub2RlID0gQUZTX0ZTX0koaW5vZGUpOworCisJX2VudGVyKCJpbm89JWx1IHsgdm49JTA4eCB2PSV1IHg9JXUgdD0ldSB9IiwKKwkgICAgICAgaW5vZGUtPmlfaW5vLAorCSAgICAgICB2bm9kZS0+ZmlkLnZub2RlLAorCSAgICAgICB2bm9kZS0+Y2JfdmVyc2lvbiwKKwkgICAgICAgdm5vZGUtPmNiX2V4cGlyeSwKKwkgICAgICAgdm5vZGUtPmNiX3R5cGUKKwkgICAgICAgKTsKKworCUJVR19PTihpbm9kZS0+aV9pbm8gIT0gdm5vZGUtPmZpZC52bm9kZSk7CisKKwlhZnNfdm5vZGVfZ2l2ZV91cF9jYWxsYmFjayh2bm9kZSk7CisKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisJY2FjaGVmc19yZWxpbnF1aXNoX2Nvb2tpZSh2bm9kZS0+Y2FjaGUsIDApOworCXZub2RlLT5jYWNoZSA9IE5VTEw7CisjZW5kaWYKKworCV9sZWF2ZSgiIik7Cit9IC8qIGVuZCBhZnNfY2xlYXJfaW5vZGUoKSAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2ludGVybmFsLmggYi9mcy9hZnMvaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDk4NjBiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL2ludGVybmFsLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qIGludGVybmFsLmg6IGludGVybmFsIEFGUyBzdHVmZgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIEFGU19JTlRFUk5BTF9ICisjZGVmaW5lIEFGU19JTlRFUk5BTF9ICisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorCisvKgorICogZGVidWcgdHJhY2luZworICovCisjZGVmaW5lIGtlbnRlcihGTVQsIGEuLi4pCXByaW50aygiPT0+ICVzKCJGTVQiKVxuIixfX0ZVTkNUSU9OX18gLCAjIyBhKQorI2RlZmluZSBrbGVhdmUoRk1ULCBhLi4uKQlwcmludGsoIjw9PSAlcygpIkZNVCJcbiIsX19GVU5DVElPTl9fICwgIyMgYSkKKyNkZWZpbmUga2RlYnVnKEZNVCwgYS4uLikJcHJpbnRrKEZNVCJcbiIgLCAjIyBhKQorI2RlZmluZSBrcHJvdG8oRk1ULCBhLi4uKQlwcmludGsoIiMjIyAiRk1UIlxuIiAsICMjIGEpCisjZGVmaW5lIGtuZXQoRk1ULCBhLi4uKQkJcHJpbnRrKEZNVCJcbiIgLCAjIyBhKQorCisjaWZkZWYgX19LREVCVUcKKyNkZWZpbmUgX2VudGVyKEZNVCwgYS4uLikJa2VudGVyKEZNVCAsICMjIGEpCisjZGVmaW5lIF9sZWF2ZShGTVQsIGEuLi4pCWtsZWF2ZShGTVQgLCAjIyBhKQorI2RlZmluZSBfZGVidWcoRk1ULCBhLi4uKQlrZGVidWcoRk1UICwgIyMgYSkKKyNkZWZpbmUgX3Byb3RvKEZNVCwgYS4uLikJa3Byb3RvKEZNVCAsICMjIGEpCisjZGVmaW5lIF9uZXQoRk1ULCBhLi4uKQkJa25ldChGTVQgLCAjIyBhKQorI2Vsc2UKKyNkZWZpbmUgX2VudGVyKEZNVCwgYS4uLikJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIF9sZWF2ZShGTVQsIGEuLi4pCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBfZGVidWcoRk1ULCBhLi4uKQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgX3Byb3RvKEZNVCwgYS4uLikJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIF9uZXQoRk1ULCBhLi4uKQkJZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIGFmc19kaXNjYXJkX215X3NpZ25hbHModm9pZCkKK3sKKwl3aGlsZSAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJc2lnaW5mb190IHNpbmZvOworCisJCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCQlkZXF1ZXVlX3NpZ25hbChjdXJyZW50LCZjdXJyZW50LT5ibG9ja2VkLCAmc2luZm8pOworCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCX0KK30KKworLyoKKyAqIGNlbGwuYworICovCitleHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSBhZnNfcHJvY19jZWxsc19zZW07CitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBhZnNfcHJvY19jZWxsczsKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitleHRlcm4gc3RydWN0IGNhY2hlZnNfaW5kZXhfZGVmIGFmc19jYWNoZV9jZWxsX2luZGV4X2RlZjsKKyNlbmRpZgorCisvKgorICogZGlyLmMKKyAqLworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFmc19kaXJfZmlsZV9vcGVyYXRpb25zOworCisvKgorICogZmlsZS5jCisgKi8KK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGFmc19mc19hb3BzOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZnNfZmlsZV9maWxlX29wZXJhdGlvbnM7CisKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitleHRlcm4gaW50IGFmc19jYWNoZV9nZXRfcGFnZV9jb29raWUoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICAgICBzdHJ1Y3QgY2FjaGVmc19wYWdlICoqX3BhZ2VfY29va2llKTsKKyNlbmRpZgorCisvKgorICogaW5vZGUuYworICovCitleHRlcm4gaW50IGFmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBhZnNfZmlkICpmaWQsCisJCSAgICBzdHJ1Y3QgaW5vZGUgKipfaW5vZGUpOworZXh0ZXJuIGludCBhZnNfaW5vZGVfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJICAgICBzdHJ1Y3Qga3N0YXQgKnN0YXQpOworZXh0ZXJuIHZvaWQgYWZzX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCisvKgorICoga2V5X2Fmcy5jCisgKi8KKyNpZmRlZiBDT05GSUdfS0VZUworZXh0ZXJuIGludCBhZnNfa2V5X3JlZ2lzdGVyKHZvaWQpOworZXh0ZXJuIHZvaWQgYWZzX2tleV91bnJlZ2lzdGVyKHZvaWQpOworI2VuZGlmCisKKy8qCisgKiBtYWluLmMKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK2V4dGVybiBzdHJ1Y3QgY2FjaGVmc19uZXRmcyBhZnNfY2FjaGVfbmV0ZnM7CisjZW5kaWYKKworLyoKKyAqIG1udHB0LmMKKyAqLworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmc19tbnRwdF9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWZzX21udHB0X2ZpbGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgYWZzX3RpbWVyIGFmc19tbnRwdF9leHBpcnlfdGltZXI7CitleHRlcm4gc3RydWN0IGFmc190aW1lcl9vcHMgYWZzX21udHB0X2V4cGlyeV90aW1lcl9vcHM7CitleHRlcm4gdW5zaWduZWQgbG9uZyBhZnNfbW50cHRfZXhwaXJ5X3RpbWVvdXQ7CisKK2V4dGVybiBpbnQgYWZzX21udHB0X2NoZWNrX3N5bWxpbmsoc3RydWN0IGFmc192bm9kZSAqdm5vZGUpOworCisvKgorICogc3VwZXIuYworICovCitleHRlcm4gaW50IGFmc19mc19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgYWZzX2ZzX2V4aXQodm9pZCk7CisKKyNkZWZpbmUgQUZTX0NCX0hBU0hfQ09VTlQgKFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSkKKworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgYWZzX2NiX2hhc2hfdGJsW107CitleHRlcm4gc3BpbmxvY2tfdCBhZnNfY2JfaGFzaF9sb2NrOworCisjZGVmaW5lIGFmc19jYl9oYXNoKFNSVixGSUQpIFwKKwlhZnNfY2JfaGFzaF90YmxbKCh1bnNpZ25lZCBsb25nKShTUlYpICsgXAorCQkJKEZJRCktPnZpZCArIChGSUQpLT52bm9kZSArIChGSUQpLT51bmlxdWUpICUgXAorCQkJQUZTX0NCX0hBU0hfQ09VTlRdCisKKy8qCisgKiBwcm9jLmMKKyAqLworZXh0ZXJuIGludCBhZnNfcHJvY19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgYWZzX3Byb2NfY2xlYW51cCh2b2lkKTsKK2V4dGVybiBpbnQgYWZzX3Byb2NfY2VsbF9zZXR1cChzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwpOworZXh0ZXJuIHZvaWQgYWZzX3Byb2NfY2VsbF9yZW1vdmUoc3RydWN0IGFmc19jZWxsICpjZWxsKTsKKworI2VuZGlmIC8qIEFGU19JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMva2Fmc2FzeW5jZC5jIGIvZnMvYWZzL2thZnNhc3luY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmM4OGFlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL2thZnNhc3luY2QuYwpAQCAtMCwwICsxLDI1NyBAQAorLyoga2Fmc2FzeW5jZC5jOiBBRlMgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBkYWVtb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqIFRoZSBBRlMgYXN5bmMgZGFlbW9uIGlzIHVzZWQgdG8gdGhlIGZvbGxvd2luZzoKKyAqIC0gcHJvYmUgImRlYWQiIHNlcnZlcnMgdG8gc2VlIHdoZXRoZXIgdGhleSd2ZSBjb21lIGJhY2sgdG8gbGlmZSB5ZXQuCisgKiAtIHByb2JlICJsaXZlIiBzZXJ2ZXJzIHRoYXQgd2UgaGF2ZW4ndCB0YWxrZWQgdG8gZm9yIGEgd2hpbGUgdG8gc2VlIGlmIHRoZXkgYXJlIGJldHRlcgorICogICBjYW5kaWRhdGVzIGZvciBzZXJ2aW5nIHRoYW4gd2hhdCB3ZSdyZSBjdXJyZW50bHkgdXNpbmcKKyAqIC0gcG9sbCB2b2x1bWUgbG9jYXRpb24gc2VydmVycyB0byBrZWVwIHVwIHRvIGRhdGUgdm9sdW1lIGxvY2F0aW9uIGxpc3RzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlICJjZWxsLmgiCisjaW5jbHVkZSAic2VydmVyLmgiCisjaW5jbHVkZSAidm9sdW1lLmgiCisjaW5jbHVkZSAia2Fmc2FzeW5jZC5oIgorI2luY2x1ZGUgImthZnN0aW1vZC5oIgorI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGthZnNhc3luY2RfYWxpdmUpOworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihrYWZzYXN5bmNkX2RlYWQpOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGthZnNhc3luY2Rfc2xlZXBxKTsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmthZnNhc3luY2RfdGFzazsKK3N0YXRpYyBpbnQga2Fmc2FzeW5jZF9kaWU7CisKK3N0YXRpYyBpbnQga2Fmc2FzeW5jZCh2b2lkICphcmcpOworCitzdGF0aWMgTElTVF9IRUFEKGthZnNhc3luY2RfYXN5bmNfYXR0bnEpOworc3RhdGljIExJU1RfSEVBRChrYWZzYXN5bmNkX2FzeW5jX2J1c3lxKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soa2Fmc2FzeW5jZF9hc3luY19sb2NrKTsKKworc3RhdGljIHZvaWQga2Fmc2FzeW5jZF9udWxsX2NhbGxfYXR0bl9mdW5jKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworfQorCitzdGF0aWMgdm9pZCBrYWZzYXN5bmNkX251bGxfY2FsbF9lcnJvcl9mdW5jKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogc3RhcnQgdGhlIGFzeW5jIGRhZW1vbgorICovCitpbnQgYWZzX2thZnNhc3luY2Rfc3RhcnQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0ga2VybmVsX3RocmVhZChrYWZzYXN5bmNkLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmthZnNhc3luY2RfYWxpdmUpOworCisJcmV0dXJuIHJldDsKK30gLyogZW5kIGFmc19rYWZzYXN5bmNkX3N0YXJ0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHN0b3AgdGhlIGFzeW5jIGRhZW1vbgorICovCit2b2lkIGFmc19rYWZzYXN5bmNkX3N0b3Aodm9pZCkKK3sKKwkvKiBnZXQgcmlkIG9mIG15IGRhZW1vbiAqLworCWthZnNhc3luY2RfZGllID0gMTsKKwl3YWtlX3VwKCZrYWZzYXN5bmNkX3NsZWVwcSk7CisJd2FpdF9mb3JfY29tcGxldGlvbigma2Fmc2FzeW5jZF9kZWFkKTsKKworfSAvKiBlbmQgYWZzX2thZnNhc3luY2Rfc3RvcCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBwcm9iaW5nIGRhZW1vbgorICovCitzdGF0aWMgaW50IGthZnNhc3luY2Qodm9pZCAqYXJnKQoreworCXN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wOworCWludCBkaWU7CisKKwlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOworCisJa2Fmc2FzeW5jZF90YXNrID0gY3VycmVudDsKKworCXByaW50aygia0FGUzogU3RhcnRlZCBrYWZzYXN5bmNkICVkXG4iLCBjdXJyZW50LT5waWQpOworCisJZGFlbW9uaXplKCJrYWZzYXN5bmNkIik7CisKKwljb21wbGV0ZSgma2Fmc2FzeW5jZF9hbGl2ZSk7CisKKwkvKiBsb29wIGFyb3VuZCBsb29raW5nIGZvciB0aGluZ3MgdG8gYXR0ZW5kIHRvICovCisJZG8geworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlhZGRfd2FpdF9xdWV1ZSgma2Fmc2FzeW5jZF9zbGVlcHEsICZteXNlbGYpOworCisJCWZvciAoOzspIHsKKwkJCWlmICghbGlzdF9lbXB0eSgma2Fmc2FzeW5jZF9hc3luY19hdHRucSkgfHwKKwkJCSAgICBzaWduYWxfcGVuZGluZyhjdXJyZW50KSB8fAorCQkJICAgIGthZnNhc3luY2RfZGllKQorCQkJCWJyZWFrOworCisJCQlzY2hlZHVsZSgpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJfQorCisJCXJlbW92ZV93YWl0X3F1ZXVlKCZrYWZzYXN5bmNkX3NsZWVwcSwgJm15c2VsZik7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwkJdHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpOworCisJCS8qIGRpc2NhcmQgcGVuZGluZyBzaWduYWxzICovCisJCWFmc19kaXNjYXJkX215X3NpZ25hbHMoKTsKKworCQlkaWUgPSBrYWZzYXN5bmNkX2RpZTsKKworCQkvKiBkZWFsIHdpdGggdGhlIG5leHQgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiByZXF1aXJpbmcKKwkJICogYXR0ZW50aW9uICovCisJCWlmICghbGlzdF9lbXB0eSgma2Fmc2FzeW5jZF9hc3luY19hdHRucSkpIHsKKwkJCXN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wOworCisJCQlfZGVidWcoIkBAQCBCZWdpbiBBc3luY2hyb25vdXMgT3BlcmF0aW9uIik7CisKKwkJCW9wID0gTlVMTDsKKwkJCXNwaW5fbG9jaygma2Fmc2FzeW5jZF9hc3luY19sb2NrKTsKKworCQkJaWYgKCFsaXN0X2VtcHR5KCZrYWZzYXN5bmNkX2FzeW5jX2F0dG5xKSkgeworCQkJCW9wID0gbGlzdF9lbnRyeShrYWZzYXN5bmNkX2FzeW5jX2F0dG5xLm5leHQsCisJCQkJCQlzdHJ1Y3QgYWZzX2FzeW5jX29wLCBsaW5rKTsKKwkJCQlsaXN0X2RlbCgmb3AtPmxpbmspOworCQkJCWxpc3RfYWRkX3RhaWwoJm9wLT5saW5rLAorCQkJCQkgICAgICAma2Fmc2FzeW5jZF9hc3luY19idXN5cSk7CisJCQl9CisKKwkJCXNwaW5fdW5sb2NrKCZrYWZzYXN5bmNkX2FzeW5jX2xvY2spOworCisJCQlfZGVidWcoIkBAQCBPcGVyYXRpb24gJXAgeyVwfVxuIiwKKwkJCSAgICAgICBvcCwgb3AgPyBvcC0+b3BzIDogTlVMTCk7CisKKwkJCWlmIChvcCkKKwkJCQlvcC0+b3BzLT5hdHRlbmQob3ApOworCisJCQlfZGVidWcoIkBAQCBFbmQgQXN5bmNocm9ub3VzIE9wZXJhdGlvbiIpOworCQl9CisKKwl9IHdoaWxlKCFkaWUpOworCisJLyogbmVlZCB0byBraWxsIGFsbCBvdXRzdGFuZGluZyBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBiZWZvcmUKKwkgKiBleGl0aW5nICovCisJa2Fmc2FzeW5jZF90YXNrID0gTlVMTDsKKwlzcGluX2xvY2soJmthZnNhc3luY2RfYXN5bmNfbG9jayk7CisKKwkvKiBmb2xkIHRoZSBidXN5IGFuZCBhdHRlbnRpb24gcXVldWVzIHRvZ2V0aGVyICovCisJbGlzdF9zcGxpY2VfaW5pdCgma2Fmc2FzeW5jZF9hc3luY19idXN5cSwKKwkJCSAma2Fmc2FzeW5jZF9hc3luY19hdHRucSk7CisKKwkvKiBkZXF1ZXVlIGthZnNhc3luY2QgZnJvbSBhbGwgdGhlaXIgd2FpdCBxdWV1ZXMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wLCAma2Fmc2FzeW5jZF9hc3luY19hdHRucSwgbGluaykgeworCQlvcC0+Y2FsbC0+YXBwX2F0dG5fZnVuYyA9IGthZnNhc3luY2RfbnVsbF9jYWxsX2F0dG5fZnVuYzsKKwkJb3AtPmNhbGwtPmFwcF9lcnJvcl9mdW5jID0ga2Fmc2FzeW5jZF9udWxsX2NhbGxfZXJyb3JfZnVuYzsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJm9wLT5jYWxsLT53YWl0cSwgJm9wLT53YWl0ZXIpOworCX0KKworCXNwaW5fdW5sb2NrKCZrYWZzYXN5bmNkX2FzeW5jX2xvY2spOworCisJLyogYWJvcnQgYWxsIHRoZSBvcGVyYXRpb25zICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZrYWZzYXN5bmNkX2FzeW5jX2F0dG5xKSkgeworCQlvcCA9IGxpc3RfZW50cnkoa2Fmc2FzeW5jZF9hc3luY19hdHRucS5uZXh0LCBzdHJ1Y3QgYWZzX2FzeW5jX29wLCBsaW5rKTsKKwkJbGlzdF9kZWxfaW5pdCgmb3AtPmxpbmspOworCisJCXJ4cnBjX2NhbGxfYWJvcnQob3AtPmNhbGwsIC1FSU8pOworCQlyeHJwY19wdXRfY2FsbChvcC0+Y2FsbCk7CisJCW9wLT5jYWxsID0gTlVMTDsKKworCQlvcC0+b3BzLT5kaXNjYXJkKG9wKTsKKwl9CisKKwkvKiBhbmQgdGhhdCdzIGFsbCAqLworCV9sZWF2ZSgiIik7CisJY29tcGxldGVfYW5kX2V4aXQoJmthZnNhc3luY2RfZGVhZCwgMCk7CisKK30gLyogZW5kIGthZnNhc3luY2QoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogYmVnaW4gYW4gb3BlcmF0aW9uCisgKiAtIHBsYWNlIG9wZXJhdGlvbiBvbiBidXN5IHF1ZXVlCisgKi8KK3ZvaWQgYWZzX2thZnNhc3luY2RfYmVnaW5fb3Aoc3RydWN0IGFmc19hc3luY19vcCAqb3ApCit7CisJX2VudGVyKCIiKTsKKworCXNwaW5fbG9jaygma2Fmc2FzeW5jZF9hc3luY19sb2NrKTsKKworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZvcC0+d2FpdGVyLCBrYWZzYXN5bmNkX3Rhc2spOworCWFkZF93YWl0X3F1ZXVlKCZvcC0+Y2FsbC0+d2FpdHEsICZvcC0+d2FpdGVyKTsKKworCWxpc3RfZGVsKCZvcC0+bGluayk7CisJbGlzdF9hZGRfdGFpbCgmb3AtPmxpbmssICZrYWZzYXN5bmNkX2FzeW5jX2J1c3lxKTsKKworCXNwaW5fdW5sb2NrKCZrYWZzYXN5bmNkX2FzeW5jX2xvY2spOworCisJX2xlYXZlKCIiKTsKK30gLyogZW5kIGFmc19rYWZzYXN5bmNkX2JlZ2luX29wKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHJlcXVlc3QgYXR0ZW50aW9uIGZvciBhbiBvcGVyYXRpb24KKyAqIC0gbW92ZSB0byBhdHRlbnRpb24gcXVldWUKKyAqLwordm9pZCBhZnNfa2Fmc2FzeW5jZF9hdHRlbmRfb3Aoc3RydWN0IGFmc19hc3luY19vcCAqb3ApCit7CisJX2VudGVyKCIiKTsKKworCXNwaW5fbG9jaygma2Fmc2FzeW5jZF9hc3luY19sb2NrKTsKKworCWxpc3RfZGVsKCZvcC0+bGluayk7CisJbGlzdF9hZGRfdGFpbCgmb3AtPmxpbmssICZrYWZzYXN5bmNkX2FzeW5jX2F0dG5xKTsKKworCXNwaW5fdW5sb2NrKCZrYWZzYXN5bmNkX2FzeW5jX2xvY2spOworCisJd2FrZV91cCgma2Fmc2FzeW5jZF9zbGVlcHEpOworCisJX2xlYXZlKCIiKTsKK30gLyogZW5kIGFmc19rYWZzYXN5bmNkX2F0dGVuZF9vcCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiB0ZXJtaW5hdGUgYW4gb3BlcmF0aW9uCisgKiAtIHJlbW92ZSBmcm9tIGVpdGhlciBxdWV1ZQorICovCit2b2lkIGFmc19rYWZzYXN5bmNkX3Rlcm1pbmF0ZV9vcChzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCkKK3sKKwlfZW50ZXIoIiIpOworCisJc3Bpbl9sb2NrKCZrYWZzYXN5bmNkX2FzeW5jX2xvY2spOworCisJaWYgKCFsaXN0X2VtcHR5KCZvcC0+bGluaykpIHsKKwkJbGlzdF9kZWxfaW5pdCgmb3AtPmxpbmspOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmb3AtPmNhbGwtPndhaXRxLCAmb3AtPndhaXRlcik7CisJfQorCisJc3Bpbl91bmxvY2soJmthZnNhc3luY2RfYXN5bmNfbG9jayk7CisKKwl3YWtlX3VwKCZrYWZzYXN5bmNkX3NsZWVwcSk7CisKKwlfbGVhdmUoIiIpOworfSAvKiBlbmQgYWZzX2thZnNhc3luY2RfdGVybWluYXRlX29wKCkgKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9rYWZzYXN5bmNkLmggYi9mcy9hZnMva2Fmc2FzeW5jZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MTgwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMva2Fmc2FzeW5jZC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIGthZnNhc3luY2QuaDogQUZTIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gZGFlbW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0FGU19LQUZTQVNZTkNEX0gKKyNkZWZpbmUgX0xJTlVYX0FGU19LQUZTQVNZTkNEX0gKKworI2luY2x1ZGUgInR5cGVzLmgiCisKK3N0cnVjdCBhZnNfYXN5bmNfb3A7CisKK3N0cnVjdCBhZnNfYXN5bmNfb3Bfb3BzIHsKKwl2b2lkICgqYXR0ZW5kKShzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCk7CisJdm9pZCAoKmRpc2NhcmQpKHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wKTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHJlY29yZAorICovCitzdHJ1Y3QgYWZzX2FzeW5jX29wCit7CisJc3RydWN0IGxpc3RfaGVhZAkJbGluazsKKwlzdHJ1Y3QgYWZzX3NlcnZlcgkJKnNlcnZlcjsJLyogc2VydmVyIGJlaW5nIGNvbnRhY3RlZCAqLworCXN0cnVjdCByeHJwY19jYWxsCQkqY2FsbDsJCS8qIFJ4UlBDIGNhbGwgcGVyZm9ybWluZyBvcCAqLworCXdhaXRfcXVldWVfdAkJCXdhaXRlcjsJCS8qIHdhaXQgcXVldWUgZm9yIGthZnNhc3luY2QgKi8KKwljb25zdCBzdHJ1Y3QgYWZzX2FzeW5jX29wX29wcwkqb3BzOwkJLyogb3BlcmF0aW9ucyAqLworfTsKKworc3RhdGljIGlubGluZSB2b2lkIGFmc19hc3luY19vcF9pbml0KHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGFmc19hc3luY19vcF9vcHMgKm9wcykKK3sKKwlJTklUX0xJU1RfSEVBRCgmb3AtPmxpbmspOworCW9wLT5jYWxsID0gTlVMTDsKKwlvcC0+b3BzID0gb3BzOworfQorCitleHRlcm4gaW50IGFmc19rYWZzYXN5bmNkX3N0YXJ0KHZvaWQpOworZXh0ZXJuIHZvaWQgYWZzX2thZnNhc3luY2Rfc3RvcCh2b2lkKTsKKworZXh0ZXJuIHZvaWQgYWZzX2thZnNhc3luY2RfYmVnaW5fb3Aoc3RydWN0IGFmc19hc3luY19vcCAqb3ApOworZXh0ZXJuIHZvaWQgYWZzX2thZnNhc3luY2RfYXR0ZW5kX29wKHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wKTsKK2V4dGVybiB2b2lkIGFmc19rYWZzYXN5bmNkX3Rlcm1pbmF0ZV9vcChzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCk7CisKKyNlbmRpZiAvKiBfTElOVVhfQUZTX0tBRlNBU1lOQ0RfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2thZnN0aW1vZC5jIGIvZnMvYWZzL2thZnN0aW1vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZTcxMGQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMva2Fmc3RpbW9kLmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qIGthZnN0aW1vZC5jOiBBRlMgdGltZW91dCBkYWVtb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlICJjZWxsLmgiCisjaW5jbHVkZSAidm9sdW1lLmgiCisjaW5jbHVkZSAia2Fmc3RpbW9kLmgiCisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihrYWZzdGltb2RfYWxpdmUpOworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihrYWZzdGltb2RfZGVhZCk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoa2Fmc3RpbW9kX3NsZWVwcSk7CitzdGF0aWMgaW50IGthZnN0aW1vZF9kaWU7CisKK3N0YXRpYyBMSVNUX0hFQUQoa2Fmc3RpbW9kX2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhrYWZzdGltb2RfbG9jayk7CisKK3N0YXRpYyBpbnQga2Fmc3RpbW9kKHZvaWQgKmFyZyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBzdGFydCB0aGUgdGltZW91dCBkYWVtb24KKyAqLworaW50IGFmc19rYWZzdGltb2Rfc3RhcnQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0ga2VybmVsX3RocmVhZChrYWZzdGltb2QsIE5VTEwsIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJd2FpdF9mb3JfY29tcGxldGlvbigma2Fmc3RpbW9kX2FsaXZlKTsKKworCXJldHVybiByZXQ7Cit9IC8qIGVuZCBhZnNfa2Fmc3RpbW9kX3N0YXJ0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHN0b3AgdGhlIHRpbWVvdXQgZGFlbW9uCisgKi8KK3ZvaWQgYWZzX2thZnN0aW1vZF9zdG9wKHZvaWQpCit7CisJLyogZ2V0IHJpZCBvZiBteSBkYWVtb24gKi8KKwlrYWZzdGltb2RfZGllID0gMTsKKwl3YWtlX3VwKCZrYWZzdGltb2Rfc2xlZXBxKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZrYWZzdGltb2RfZGVhZCk7CisKK30gLyogZW5kIGFmc19rYWZzdGltb2Rfc3RvcCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiB0aW1lb3V0IHByb2Nlc3NpbmcgZGFlbW9uCisgKi8KK3N0YXRpYyBpbnQga2Fmc3RpbW9kKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgYWZzX3RpbWVyICp0aW1lcjsKKworCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisKKwlwcmludGsoImtBRlM6IFN0YXJ0ZWQga2Fmc3RpbW9kICVkXG4iLCBjdXJyZW50LT5waWQpOworCisJZGFlbW9uaXplKCJrYWZzdGltb2QiKTsKKworCWNvbXBsZXRlKCZrYWZzdGltb2RfYWxpdmUpOworCisJLyogbG9vcCBhcm91bmQgbG9va2luZyBmb3IgdGhpbmdzIHRvIGF0dGVuZCB0byAqLworIGxvb3A6CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZSgma2Fmc3RpbW9kX3NsZWVwcSwgJm15c2VsZik7CisKKwlmb3IgKDs7KSB7CisJCXVuc2lnbmVkIGxvbmcgamlmOworCQlzaWduZWQgbG9uZyB0aW1lb3V0OworCisJCS8qIGRlYWwgd2l0aCB0aGUgc2VydmVyIGJlaW5nIGFza2VkIHRvIGRpZSAqLworCQlpZiAoa2Fmc3RpbW9kX2RpZSkgeworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmthZnN0aW1vZF9zbGVlcHEsICZteXNlbGYpOworCQkJX2xlYXZlKCIiKTsKKwkJCWNvbXBsZXRlX2FuZF9leGl0KCZrYWZzdGltb2RfZGVhZCwgMCk7CisJCX0KKworCQl0cnlfdG9fZnJlZXplKFBGX0ZSRUVaRSk7CisKKwkJLyogZGlzY2FyZCBwZW5kaW5nIHNpZ25hbHMgKi8KKwkJYWZzX2Rpc2NhcmRfbXlfc2lnbmFscygpOworCisJCS8qIHdvcmsgb3V0IHRoZSB0aW1lIHRvIGVsYXBzZSBiZWZvcmUgdGhlIG5leHQgZXZlbnQgKi8KKwkJc3Bpbl9sb2NrKCZrYWZzdGltb2RfbG9jayk7CisJCWlmIChsaXN0X2VtcHR5KCZrYWZzdGltb2RfbGlzdCkpIHsKKwkJCXRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwkJfQorCQllbHNlIHsKKwkJCXRpbWVyID0gbGlzdF9lbnRyeShrYWZzdGltb2RfbGlzdC5uZXh0LAorCQkJCQkgICBzdHJ1Y3QgYWZzX3RpbWVyLCBsaW5rKTsKKwkJCXRpbWVvdXQgPSB0aW1lci0+dGltb19qaWY7CisJCQlqaWYgPSBqaWZmaWVzOworCisJCQlpZiAodGltZV9iZWZvcmVfZXEoKHVuc2lnbmVkIGxvbmcpIHRpbWVvdXQsIGppZikpCisJCQkJZ290byBpbW1lZGlhdGU7CisKKwkJCWVsc2UgeworCQkJCXRpbWVvdXQgPSAobG9uZykgdGltZW91dCAtIChsb25nKSBqaWZmaWVzOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrKCZrYWZzdGltb2RfbG9jayk7CisKKwkJc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCX0KKworCS8qIHRoZSB0aGluZyBvbiB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlIG5lZWRzIHByb2Nlc3NpbmcKKwkgKiAtIHdlIGNvbWUgaGVyZSB3aXRoIHRoZSBsb2NrIGhlbGQgYW5kIHRpbWVyIHBvaW50aW5nIHRvIHRoZSBleHBpcmVkCisJICogICBlbnRyeQorCSAqLworIGltbWVkaWF0ZToKKwlyZW1vdmVfd2FpdF9xdWV1ZSgma2Fmc3RpbW9kX3NsZWVwcSwgJm15c2VsZik7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCV9kZWJ1ZygiQEBAIEJlZ2luIFRpbWVvdXQgb2YgJXAiLCB0aW1lcik7CisKKwkvKiBkZXF1ZXVlIHRoZSB0aW1lciAqLworCWxpc3RfZGVsX2luaXQoJnRpbWVyLT5saW5rKTsKKwlzcGluX3VubG9jaygma2Fmc3RpbW9kX2xvY2spOworCisJLyogY2FsbCB0aGUgdGltZW91dCBmdW5jdGlvbiAqLworCXRpbWVyLT5vcHMtPnRpbWVkX291dCh0aW1lcik7CisKKwlfZGVidWcoIkBAQCBFbmQgVGltZW91dCIpOworCWdvdG8gbG9vcDsKKworfSAvKiBlbmQga2Fmc3RpbW9kKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIChyZS0pcXVldWUgYSB0aW1lcgorICovCit2b2lkIGFmc19rYWZzdGltb2RfYWRkX3RpbWVyKHN0cnVjdCBhZnNfdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJc3RydWN0IGFmc190aW1lciAqcHRpbWVyOworCXN0cnVjdCBsaXN0X2hlYWQgKl9wOworCisJX2VudGVyKCIlcCwlbHUiLCB0aW1lciwgdGltZW91dCk7CisKKwlzcGluX2xvY2soJmthZnN0aW1vZF9sb2NrKTsKKworCWxpc3RfZGVsKCZ0aW1lci0+bGluayk7CisKKwkvKiB0aGUgdGltZXIgd2FzIGRlZmVycmVkIG9yIHJlc2V0IC0gcHV0IGl0IGJhY2sgaW4gdGhlIHF1ZXVlIGF0IHRoZQorCSAqIHJpZ2h0IHBsYWNlICovCisJdGltZXItPnRpbW9famlmID0gamlmZmllcyArIHRpbWVvdXQ7CisKKwlsaXN0X2Zvcl9lYWNoKF9wLCAma2Fmc3RpbW9kX2xpc3QpIHsKKwkJcHRpbWVyID0gbGlzdF9lbnRyeShfcCwgc3RydWN0IGFmc190aW1lciwgbGluayk7CisJCWlmICh0aW1lX2JlZm9yZSh0aW1lci0+dGltb19qaWYsIHB0aW1lci0+dGltb19qaWYpKQorCQkJYnJlYWs7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmdGltZXItPmxpbmssIF9wKTsgLyogaW5zZXJ0IGJlZm9yZSBzdG9wcGluZyBwb2ludCAqLworCisJc3Bpbl91bmxvY2soJmthZnN0aW1vZF9sb2NrKTsKKworCXdha2VfdXAoJmthZnN0aW1vZF9zbGVlcHEpOworCisJX2xlYXZlKCIiKTsKK30gLyogZW5kIGFmc19rYWZzdGltb2RfYWRkX3RpbWVyKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGRlcXVldWUgYSB0aW1lcgorICogLSByZXR1cm5zIDAgaWYgdGhlIHRpbWVyIHdhcyBkZWxldGVkIG9yIC1FTk9FTlQgaWYgaXQgd2Fzbid0IHF1ZXVlZAorICovCitpbnQgYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoc3RydWN0IGFmc190aW1lciAqdGltZXIpCit7CisJaW50IHJldCA9IDA7CisKKwlfZW50ZXIoIiVwIiwgdGltZXIpOworCisJc3Bpbl9sb2NrKCZrYWZzdGltb2RfbG9jayk7CisKKwlpZiAobGlzdF9lbXB0eSgmdGltZXItPmxpbmspKQorCQlyZXQgPSAtRU5PRU5UOworCWVsc2UKKwkJbGlzdF9kZWxfaW5pdCgmdGltZXItPmxpbmspOworCisJc3Bpbl91bmxvY2soJmthZnN0aW1vZF9sb2NrKTsKKworCXdha2VfdXAoJmthZnN0aW1vZF9zbGVlcHEpOworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30gLyogZW5kIGFmc19rYWZzdGltb2RfZGVsX3RpbWVyKCkgKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9rYWZzdGltb2QuaCBiL2ZzL2Fmcy9rYWZzdGltb2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzEyZjFhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL2thZnN0aW1vZC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIGthZnN0aW1vZC5oOiBBRlMgdGltZW91dCBkYWVtb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfQUZTX0tBRlNUSU1PRF9ICisjZGVmaW5lIF9MSU5VWF9BRlNfS0FGU1RJTU9EX0gKKworI2luY2x1ZGUgInR5cGVzLmgiCisKK3N0cnVjdCBhZnNfdGltZXI7CisKK3N0cnVjdCBhZnNfdGltZXJfb3BzIHsKKwkvKiBjYWxsZWQgd2hlbiB0aGUgZnJvbnQgb2YgdGhlIHRpbWVyIHF1ZXVlIGhhcyB0aW1lZCBvdXQgKi8KKwl2b2lkICgqdGltZWRfb3V0KShzdHJ1Y3QgYWZzX3RpbWVyICp0aW1lcik7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQUZTIHRpbWVyL3RpbWVvdXQgcmVjb3JkCisgKi8KK3N0cnVjdCBhZnNfdGltZXIKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlsaW5rOwkJLyogbGluayBpbiB0aW1lciBxdWV1ZSAqLworCXVuc2lnbmVkIGxvbmcJCQl0aW1vX2ppZjsJLyogdGltZW91dCB0aW1lICovCisJY29uc3Qgc3RydWN0IGFmc190aW1lcl9vcHMJKm9wczsJCS8qIHRpbWVvdXQgZXhwaXJ5IGZ1bmN0aW9uICovCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgYWZzX3RpbWVyX2luaXQoc3RydWN0IGFmc190aW1lciAqdGltZXIsCisJCQkJICBjb25zdCBzdHJ1Y3QgYWZzX3RpbWVyX29wcyAqb3BzKQoreworCUlOSVRfTElTVF9IRUFEKCZ0aW1lci0+bGluayk7CisJdGltZXItPm9wcyA9IG9wczsKK30KKworZXh0ZXJuIGludCBhZnNfa2Fmc3RpbW9kX3N0YXJ0KHZvaWQpOworZXh0ZXJuIHZvaWQgYWZzX2thZnN0aW1vZF9zdG9wKHZvaWQpOworCitleHRlcm4gdm9pZCBhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcihzdHJ1Y3QgYWZzX3RpbWVyICp0aW1lciwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKK2V4dGVybiBpbnQgYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoc3RydWN0IGFmc190aW1lciAqdGltZXIpOworCisjZW5kaWYgLyogX0xJTlVYX0FGU19LQUZTVElNT0RfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL21haW4uYyBiL2ZzL2Fmcy9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzYzY4OQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9tYWluLmMKQEAgLTAsMCArMSwyODYgQEAKKy8qIG1haW4uYzogQUZTIGNsaWVudCBmaWxlIHN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8cnhycGMvcnhycGMuaD4KKyNpbmNsdWRlIDxyeHJwYy90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxyeHJwYy9jYWxsLmg+CisjaW5jbHVkZSA8cnhycGMvcGVlci5oPgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY2VsbC5oIgorI2luY2x1ZGUgInNlcnZlci5oIgorI2luY2x1ZGUgImZzY2xpZW50LmgiCisjaW5jbHVkZSAiY21zZXJ2aWNlLmgiCisjaW5jbHVkZSAia2Fmc3RpbW9kLmgiCisjaW5jbHVkZSAia2Fmc2FzeW5jZC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0cnVjdCByeHJwY190cmFuc3BvcnQgKmFmc190cmFuc3BvcnQ7CisKK3N0YXRpYyBpbnQgYWZzX2FkZGluZ19wZWVyKHN0cnVjdCByeHJwY19wZWVyICpwZWVyKTsKK3N0YXRpYyB2b2lkIGFmc19kaXNjYXJkaW5nX3BlZXIoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpOworCisKK01PRFVMRV9ERVNDUklQVElPTigiQUZTIENsaWVudCBGaWxlIFN5c3RlbSIpOworTU9EVUxFX0FVVEhPUigiUmVkIEhhdCwgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgY2hhciAqcm9vdGNlbGw7CisKK21vZHVsZV9wYXJhbShyb290Y2VsbCwgY2hhcnAsIDApOworTU9EVUxFX1BBUk1fREVTQyhyb290Y2VsbCwgInJvb3QgQUZTIGNlbGwgbmFtZSBhbmQgVkwgc2VydmVyIElQIGFkZHIgbGlzdCIpOworCisKK3N0YXRpYyBzdHJ1Y3QgcnhycGNfcGVlcl9vcHMgYWZzX3BlZXJfb3BzID0geworCS5hZGRpbmcJCT0gYWZzX2FkZGluZ19wZWVyLAorCS5kaXNjYXJkaW5nCT0gYWZzX2Rpc2NhcmRpbmdfcGVlciwKK307CisKK3N0cnVjdCBsaXN0X2hlYWQgYWZzX2NiX2hhc2hfdGJsW0FGU19DQl9IQVNIX0NPVU5UXTsKK0RFRklORV9TUElOTE9DSyhhZnNfY2JfaGFzaF9sb2NrKTsKKworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyBzdHJ1Y3QgY2FjaGVmc19uZXRmc19vcGVyYXRpb25zIGFmc19jYWNoZV9vcHMgPSB7CisJLmdldF9wYWdlX2Nvb2tpZQk9IGFmc19jYWNoZV9nZXRfcGFnZV9jb29raWUsCit9OworCitzdHJ1Y3QgY2FjaGVmc19uZXRmcyBhZnNfY2FjaGVfbmV0ZnMgPSB7CisJLm5hbWUJCQk9ICJhZnMiLAorCS52ZXJzaW9uCQk9IDAsCisJLm9wcwkJCT0gJmFmc19jYWNoZV9vcHMsCit9OworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBpbml0aWFsaXNlIHRoZSBBRlMgY2xpZW50IEZTIG1vZHVsZQorICovCitzdGF0aWMgaW50IF9faW5pdCBhZnNfaW5pdCh2b2lkKQoreworCWludCBsb29wLCByZXQ7CisKKwlwcmludGsoS0VSTl9JTkZPICJrQUZTOiBSZWQgSGF0IEFGUyBjbGllbnQgdjAuMSByZWdpc3RlcmluZy5cbiIpOworCisJLyogaW5pdGlhbGlzZSB0aGUgY2FsbGJhY2sgaGFzaCB0YWJsZSAqLworCXNwaW5fbG9ja19pbml0KCZhZnNfY2JfaGFzaF9sb2NrKTsKKwlmb3IgKGxvb3AgPSBBRlNfQ0JfSEFTSF9DT1VOVCAtIDE7IGxvb3AgPj0gMDsgbG9vcC0tKQorCQlJTklUX0xJU1RfSEVBRCgmYWZzX2NiX2hhc2hfdGJsW2xvb3BdKTsKKworCS8qIHJlZ2lzdGVyIHRoZSAvcHJvYyBzdHVmZiAqLworCXJldCA9IGFmc19wcm9jX2luaXQoKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwkvKiB3ZSB3YW50IHRvIGJlIGFibGUgdG8gY2FjaGUgKi8KKwlyZXQgPSBjYWNoZWZzX3JlZ2lzdGVyX25ldGZzKCZhZnNfY2FjaGVfbmV0ZnMsCisJCQkJICAgICAmYWZzX2NhY2hlX2NlbGxfaW5kZXhfZGVmKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0tFWVNfVFVSTkVEX09GRgorCXJldCA9IGFmc19rZXlfcmVnaXN0ZXIoKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9jYWNoZTsKKyNlbmRpZgorCisJLyogaW5pdGlhbGlzZSB0aGUgY2VsbCBEQiAqLworCXJldCA9IGFmc19jZWxsX2luaXQocm9vdGNlbGwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2tleXM7CisKKwkvKiBzdGFydCB0aGUgdGltZW91dCBkYWVtb24gKi8KKwlyZXQgPSBhZnNfa2Fmc3RpbW9kX3N0YXJ0KCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3Jfa2V5czsKKworCS8qIHN0YXJ0IHRoZSBhc3luYyBvcGVyYXRpb24gZGFlbW9uICovCisJcmV0ID0gYWZzX2thZnNhc3luY2Rfc3RhcnQoKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9rYWZzdGltb2Q7CisKKwkvKiBjcmVhdGUgdGhlIFJ4UlBDIHRyYW5zcG9ydCAqLworCXJldCA9IHJ4cnBjX2NyZWF0ZV90cmFuc3BvcnQoNzAwMSwgJmFmc190cmFuc3BvcnQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2thZnNhc3luY2Q7CisKKwlhZnNfdHJhbnNwb3J0LT5wZWVyX29wcyA9ICZhZnNfcGVlcl9vcHM7CisKKwkvKiByZWdpc3RlciB0aGUgZmlsZXN5c3RlbXMgKi8KKwlyZXQgPSBhZnNfZnNfaW5pdCgpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX3RyYW5zcG9ydDsKKworCXJldHVybiByZXQ7CisKKyBlcnJvcl90cmFuc3BvcnQ6CisJcnhycGNfcHV0X3RyYW5zcG9ydChhZnNfdHJhbnNwb3J0KTsKKyBlcnJvcl9rYWZzYXN5bmNkOgorCWFmc19rYWZzYXN5bmNkX3N0b3AoKTsKKyBlcnJvcl9rYWZzdGltb2Q6CisJYWZzX2thZnN0aW1vZF9zdG9wKCk7CisgZXJyb3Jfa2V5czoKKyNpZmRlZiBDT05GSUdfS0VZU19UVVJORURfT0ZGCisJYWZzX2tleV91bnJlZ2lzdGVyKCk7CisgZXJyb3JfY2FjaGU6CisjZW5kaWYKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisJY2FjaGVmc191bnJlZ2lzdGVyX25ldGZzKCZhZnNfY2FjaGVfbmV0ZnMpOworIGVycm9yOgorI2VuZGlmCisJYWZzX2NlbGxfcHVyZ2UoKTsKKwlhZnNfcHJvY19jbGVhbnVwKCk7CisJcHJpbnRrKEtFUk5fRVJSICJrQUZTOiBmYWlsZWQgdG8gcmVnaXN0ZXI6ICVkXG4iLCByZXQpOworCXJldHVybiByZXQ7Cit9IC8qIGVuZCBhZnNfaW5pdCgpICovCisKKy8qIFhYWCBsYXRlX2luaXRjYWxsIGlzIGtsdWRneSwgYnV0IHRoZSBvbmx5IGFsdGVybmF0aXZlIHNlZW1zIHRvIGNyZWF0ZQorICogYSB0cmFuc3BvcnQgdXBvbiB0aGUgZmlyc3QgbW91bnQsIHdoaWNoIGlzIHdvcnNlLiBPciBpcyBpdD8KKyAqLworbGF0ZV9pbml0Y2FsbChhZnNfaW5pdCk7CS8qIG11c3QgYmUgY2FsbGVkIGFmdGVyIG5ldC8gdG8gY3JlYXRlIHNvY2tldCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNsZWFuIHVwIG9uIG1vZHVsZSByZW1vdmFsCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBhZnNfZXhpdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gImtBRlM6IFJlZCBIYXQgQUZTIGNsaWVudCB2MC4xIHVucmVnaXN0ZXJpbmcuXG4iKTsKKworCWFmc19mc19leGl0KCk7CisJcnhycGNfcHV0X3RyYW5zcG9ydChhZnNfdHJhbnNwb3J0KTsKKwlhZnNfa2Fmc3RpbW9kX3N0b3AoKTsKKwlhZnNfa2Fmc2FzeW5jZF9zdG9wKCk7CisJYWZzX2NlbGxfcHVyZ2UoKTsKKyNpZmRlZiBDT05GSUdfS0VZU19UVVJORURfT0ZGCisJYWZzX2tleV91bnJlZ2lzdGVyKCk7CisjZW5kaWYKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisJY2FjaGVmc191bnJlZ2lzdGVyX25ldGZzKCZhZnNfY2FjaGVfbmV0ZnMpOworI2VuZGlmCisJYWZzX3Byb2NfY2xlYW51cCgpOworCit9IC8qIGVuZCBhZnNfZXhpdCgpICovCisKK21vZHVsZV9leGl0KGFmc19leGl0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIG5vdGlmaWNhdGlvbiB0aGF0IG5ldyBwZWVyIHJlY29yZCBpcyBiZWluZyBhZGRlZAorICogLSBjYWxsZWQgZnJvbSBrcnhzZWNkCisgKiAtIHJldHVybiBhbiBlcnJvciB0byBpbmR1Y2UgYW4gYWJvcnQKKyAqIC0gbXVzdG4ndCBzbGVlcCAoY2FsbGVyIGhvbGRzIGFuIHJ3bG9jaykKKyAqLworc3RhdGljIGludCBhZnNfYWRkaW5nX3BlZXIoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKwlpbnQgcmV0OworCisJX2RlYnVnKCJrQUZTOiBBZGRpbmcgbmV3IHBlZXIgJTA4eFxuIiwgbnRvaGwocGVlci0+YWRkci5zX2FkZHIpKTsKKworCS8qIGRldGVybWluZSB3aGljaCBzZXJ2ZXIgdGhlIHBlZXIgcmVzaWRlcyBpbiAoaWYgYW55KSAqLworCXJldCA9IGFmc19zZXJ2ZXJfZmluZF9ieV9wZWVyKHBlZXIsICZzZXJ2ZXIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OyAvKiBub25lIHRoYXQgd2UgcmVjb2duaXNlLCBzbyBhYm9ydCAqLworCisJX2RlYnVnKCJTZXJ2ZXIgJXB7dT0lZH1cbiIsIHNlcnZlciwgYXRvbWljX3JlYWQoJnNlcnZlci0+dXNhZ2UpKTsKKworCV9kZWJ1ZygiQ2VsbCAlcHt1PSVkfVxuIiwKKwkgICAgICAgc2VydmVyLT5jZWxsLCBhdG9taWNfcmVhZCgmc2VydmVyLT5jZWxsLT51c2FnZSkpOworCisJLyogY3Jvc3MtcG9pbnQgdGhlIHN0cnVjdHMgdW5kZXIgYSBnbG9iYWwgbG9jayAqLworCXNwaW5fbG9jaygmYWZzX3NlcnZlcl9wZWVyX2xvY2spOworCXBlZXItPnVzZXIgPSBzZXJ2ZXI7CisJc2VydmVyLT5wZWVyID0gcGVlcjsKKwlzcGluX3VubG9jaygmYWZzX3NlcnZlcl9wZWVyX2xvY2spOworCisJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKworCXJldHVybiAwOworfSAvKiBlbmQgYWZzX2FkZGluZ19wZWVyKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIG5vdGlmaWNhdGlvbiB0aGF0IGEgcGVlciByZWNvcmQgaXMgYmVpbmcgZGlzY2FyZGVkCisgKiAtIGNhbGxlZCBmcm9tIGtyeGlvZCBvciBrcnhzZWNkCisgKi8KK3N0YXRpYyB2b2lkIGFmc19kaXNjYXJkaW5nX3BlZXIoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKworCV9lbnRlcigiJXAiLHBlZXIpOworCisJX2RlYnVnKCJEaXNjYXJkaW5nIHBlZXIgJTA4eCAocnR0PSVsdS4lbHVtUylcbiIsCisJICAgICAgIG50b2hsKHBlZXItPmFkZHIuc19hZGRyKSwKKwkgICAgICAgKGxvbmcpIChwZWVyLT5ydHQgLyAxMDAwKSwKKwkgICAgICAgKGxvbmcpIChwZWVyLT5ydHQgJSAxMDAwKSk7CisKKwkvKiB1bmNyb3NzLXBvaW50IHRoZSBzdHJ1Y3RzIHVuZGVyIGEgZ2xvYmFsIGxvY2sgKi8KKwlzcGluX2xvY2soJmFmc19zZXJ2ZXJfcGVlcl9sb2NrKTsKKwlzZXJ2ZXIgPSBwZWVyLT51c2VyOworCWlmIChzZXJ2ZXIpIHsKKwkJcGVlci0+dXNlciA9IE5VTEw7CisJCXNlcnZlci0+cGVlciA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrKCZhZnNfc2VydmVyX3BlZXJfbG9jayk7CisKKwlfbGVhdmUoIiIpOworCit9IC8qIGVuZCBhZnNfZGlzY2FyZGluZ19wZWVyKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNsZWFyIHRoZSBkZWFkIHNwYWNlIGJldHdlZW4gdGFza19zdHJ1Y3QgYW5kIGtlcm5lbCBzdGFjaworICogLSBjYWxsZWQgYnkgc3VwcGx5aW5nIC1maW5zdHJ1bWVudC1mdW5jdGlvbnMgdG8gZ2NjCisgKi8KKyNpZiAwCit2b2lkIF9fY3lnX3Byb2ZpbGVfZnVuY19lbnRlciAodm9pZCAqdGhpc19mbiwgdm9pZCAqY2FsbF9zaXRlKQorX19hdHRyaWJ1dGVfXygobm9faW5zdHJ1bWVudF9mdW5jdGlvbikpOworCit2b2lkIF9fY3lnX3Byb2ZpbGVfZnVuY19lbnRlciAodm9pZCAqdGhpc19mbiwgdm9pZCAqY2FsbF9zaXRlKQoreworICAgICAgIGFzbSB2b2xhdGlsZSgiICBtb3ZsICAgICUlZXNwLCUlZWRpICAgICBcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgYW5kbCAgICAlMCwlJWVkaSAgICAgICAgXG4iCisgICAgICAgICAgICAgICAgICAgICIgIGFkZGwgICAgJTEsJSVlZGkgICAgICAgIFxuIgorICAgICAgICAgICAgICAgICAgICAiICBtb3ZsICAgICUlZXNwLCUlZWN4ICAgICBcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgc3VibCAgICAlJWVkaSwlJWVjeCAgICAgXG4iCisgICAgICAgICAgICAgICAgICAgICIgIHNocmwgICAgJDIsJSVlY3ggICAgICAgIFxuIgorICAgICAgICAgICAgICAgICAgICAiICBtb3ZsICAgICQweGVkZWRlZGVkLCUlZWF4ICAgICBcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgcmVwIHN0b3NsICAgICAgICAgICAgICAgXG4iCisgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAgICAgOiAiaSIofihUSFJFQURfU0laRSAtIDEpKSwgImkiKHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pKQorICAgICAgICAgICAgICAgICAgICA6ICJlYXgiLCAiZWN4IiwgImVkaSIsICJtZW1vcnkiLCAiY2MiCisgICAgICAgICAgICAgICAgICAgICk7Cit9CisKK3ZvaWQgX19jeWdfcHJvZmlsZV9mdW5jX2V4aXQodm9pZCAqdGhpc19mbiwgdm9pZCAqY2FsbF9zaXRlKQorX19hdHRyaWJ1dGVfXygobm9faW5zdHJ1bWVudF9mdW5jdGlvbikpOworCit2b2lkIF9fY3lnX3Byb2ZpbGVfZnVuY19leGl0KHZvaWQgKnRoaXNfZm4sIHZvaWQgKmNhbGxfc2l0ZSkKK3sKKyAgICAgICBhc20gdm9sYXRpbGUoIiAgbW92bCAgICAlJWVzcCwlJWVkaSAgICAgXG4iCisgICAgICAgICAgICAgICAgICAgICIgIGFuZGwgICAgJTAsJSVlZGkgICAgICAgIFxuIgorICAgICAgICAgICAgICAgICAgICAiICBhZGRsICAgICUxLCUlZWRpICAgICAgICBcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgbW92bCAgICAlJWVzcCwlJWVjeCAgICAgXG4iCisgICAgICAgICAgICAgICAgICAgICIgIHN1YmwgICAgJSVlZGksJSVlY3ggICAgIFxuIgorICAgICAgICAgICAgICAgICAgICAiICBzaHJsICAgICQyLCUlZWN4ICAgICAgICBcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgbW92bCAgICAkMHhkYWRhZGFkYSwlJWVheCAgICAgXG4iCisgICAgICAgICAgICAgICAgICAgICIgIHJlcCBzdG9zbCAgICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgICAgIDogImkiKH4oVEhSRUFEX1NJWkUgLSAxKSksICJpIihzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSkKKyAgICAgICAgICAgICAgICAgICAgOiAiZWF4IiwgImVjeCIsICJlZGkiLCAibWVtb3J5IiwgImNjIgorICAgICAgICAgICAgICAgICAgICApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9hZnMvbWlzYy5jIGIvZnMvYWZzL21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGZjZTY2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL21pc2MuYwpAQCAtMCwwICsxLDM5IEBACisvKiBtaXNjLmM6IG1pc2NlbGxhbmVvdXMgYml0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlICJlcnJvcnMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY29udmVydCBhbiBBRlMgYWJvcnQgY29kZSB0byBhIExpbnV4IGVycm9yIG51bWJlcgorICovCitpbnQgYWZzX2Fib3J0X3RvX2Vycm9yKGludCBhYm9ydGNvZGUpCit7CisJc3dpdGNoIChhYm9ydGNvZGUpIHsKKwljYXNlIFZTQUxWQUdFOgkJcmV0dXJuIC1FSU87CisJY2FzZSBWTk9WTk9ERToJCXJldHVybiAtRU5PRU5UOworCWNhc2UgVk5PVk9MOgkJcmV0dXJuIC1FTlhJTzsKKwljYXNlIFZWT0xFWElTVFM6CXJldHVybiAtRUVYSVNUOworCWNhc2UgVk5PU0VSVklDRToJcmV0dXJuIC1FSU87CisJY2FzZSBWT0ZGTElORToJCXJldHVybiAtRU5PRU5UOworCWNhc2UgVk9OTElORToJCXJldHVybiAtRUVYSVNUOworCWNhc2UgVkRJU0tGVUxMOgkJcmV0dXJuIC1FTk9TUEM7CisJY2FzZSBWT1ZFUlFVT1RBOglyZXR1cm4gLUVEUVVPVDsKKwljYXNlIFZCVVNZOgkJcmV0dXJuIC1FQlVTWTsKKwljYXNlIFZNT1ZFRDoJCXJldHVybiAtRU5YSU87CisJZGVmYXVsdDoJCXJldHVybiAtRUlPOworCX0KKworfSAvKiBlbmQgYWZzX2Fib3J0X3RvX2Vycm9yKCkgKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9tbnRwdC5jIGIvZnMvYWZzL21udHB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZjMjhhYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9tbnRwdC5jCkBAIC0wLDAgKzEsMjg3IEBACisvKiBtbnRwdC5jOiBtb3VudHBvaW50IG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZXNwYWNlLmg+CisjaW5jbHVkZSAic3VwZXIuaCIKKyNpbmNsdWRlICJjZWxsLmgiCisjaW5jbHVkZSAidm9sdW1lLmgiCisjaW5jbHVkZSAidm5vZGUuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICphZnNfbW50cHRfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJICAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKK3N0YXRpYyBpbnQgYWZzX21udHB0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBhZnNfbW50cHRfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWZzX21udHB0X2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBhZnNfbW50cHRfb3BlbiwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmc19tbnRwdF9pbm9kZV9vcGVyYXRpb25zID0geworCS5sb29rdXAJCT0gYWZzX21udHB0X2xvb2t1cCwKKwkuZm9sbG93X2xpbmsJPSBhZnNfbW50cHRfZm9sbG93X2xpbmssCisJLnJlYWRsaW5rCT0gcGFnZV9yZWFkbGluaywKKwkuZ2V0YXR0cgk9IGFmc19pbm9kZV9nZXRhdHRyLAorfTsKKworc3RhdGljIExJU1RfSEVBRChhZnNfdmZzbW91bnRzKTsKKworc3RhdGljIHZvaWQgYWZzX21udHB0X2V4cGlyeV90aW1lZF9vdXQoc3RydWN0IGFmc190aW1lciAqdGltZXIpOworCitzdHJ1Y3QgYWZzX3RpbWVyX29wcyBhZnNfbW50cHRfZXhwaXJ5X3RpbWVyX29wcyA9IHsKKwkudGltZWRfb3V0CT0gYWZzX21udHB0X2V4cGlyeV90aW1lZF9vdXQsCit9OworCitzdHJ1Y3QgYWZzX3RpbWVyIGFmc19tbnRwdF9leHBpcnlfdGltZXI7CisKK3Vuc2lnbmVkIGxvbmcgYWZzX21udHB0X2V4cGlyeV90aW1lb3V0ID0gMjA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjaGVjayBhIHN5bWJvbGljIGxpbmsgdG8gc2VlIHdoZXRoZXIgaXQgYWN0dWFsbHkgZW5jb2RlcyBhIG1vdW50cG9pbnQKKyAqIC0gc2V0cyB0aGUgQUZTX1ZOT0RFX01PVU5UUE9JTlQgZmxhZyBvbiB0aGUgdm5vZGUgYXBwcm9wcmlhdGVseQorICovCitpbnQgYWZzX21udHB0X2NoZWNrX3N5bWxpbmsoc3RydWN0IGFmc192bm9kZSAqdm5vZGUpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJZmlsbGVyX3QgKmZpbGxlcjsKKwlzaXplX3Qgc2l6ZTsKKwljaGFyICpidWY7CisJaW50IHJldDsKKworCV9lbnRlcigieyV1LCV1fSIsIHZub2RlLT5maWQudm5vZGUsIHZub2RlLT5maWQudW5pcXVlKTsKKworCS8qIHJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzeW1saW5rIGludG8gdGhlIHBhZ2VjYWNoZSAqLworCWZpbGxlciA9IChmaWxsZXJfdCAqKSBBRlNfVk5PREVfVE9fSSh2bm9kZSktPmlfbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlOworCisJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShBRlNfVk5PREVfVE9fSSh2bm9kZSktPmlfbWFwcGluZywgMCwKKwkJCSAgICAgICBmaWxsZXIsIE5VTEwpOworCWlmIChJU19FUlIocGFnZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihwYWdlKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gLUVJTzsKKwl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCWJ1ZiA9IGttYXAocGFnZSk7CisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpCisJCWdvdG8gb3V0X2ZyZWU7CisJaWYgKFBhZ2VFcnJvcihwYWdlKSkKKwkJZ290byBvdXRfZnJlZTsKKworCS8qIGV4YW1pbmUgdGhlIHN5bWxpbmsncyBjb250ZW50cyAqLworCXNpemUgPSB2bm9kZS0+c3RhdHVzLnNpemU7CisJX2RlYnVnKCJzeW1saW5rIHRvICUqLipzIiwgc2l6ZSwgKGludCkgc2l6ZSwgYnVmKTsKKworCWlmIChzaXplID4gMiAmJgorCSAgICAoYnVmWzBdID09ICclJyB8fCBidWZbMF0gPT0gJyMnKSAmJgorCSAgICBidWZbc2l6ZSAtIDFdID09ICcuJworCSAgICApIHsKKwkJX2RlYnVnKCJzeW1saW5rIGlzIGEgbW91bnRwb2ludCIpOworCQlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwkJdm5vZGUtPmZsYWdzIHw9IEFGU19WTk9ERV9NT1VOVFBPSU5UOworCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCX0KKworCXJldCA9IDA7CisKKyBvdXRfZnJlZToKKwlrdW5tYXAocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworIG91dDoKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCit9IC8qIGVuZCBhZnNfbW50cHRfY2hlY2tfc3ltbGluaygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBubyB2YWxpZCBsb29rdXAgcHJvY2VkdXJlIG9uIHRoaXMgc29ydCBvZiBkaXIKKyAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKmFmc19tbnRwdF9sb29rdXAoc3RydWN0IGlub2RlICpkaXIsCisJCQkJICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkgICAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJa2VudGVyKCIlcCwlcHslcHslc30sJXN9IiwKKwkgICAgICAgZGlyLAorCSAgICAgICBkZW50cnksCisJICAgICAgIGRlbnRyeS0+ZF9wYXJlbnQsCisJICAgICAgIGRlbnRyeS0+ZF9wYXJlbnQgPworCSAgICAgICBkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSA6IChjb25zdCB1bnNpZ25lZCBjaGFyICopICIiLAorCSAgICAgICBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCXJldHVybiBFUlJfUFRSKC1FUkVNT1RFKTsKK30gLyogZW5kIGFmc19tbnRwdF9sb29rdXAoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbm8gdmFsaWQgb3BlbiBwcm9jZWR1cmUgb24gdGhpcyBzb3J0IG9mIGRpcgorICovCitzdGF0aWMgaW50IGFmc19tbnRwdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWtlbnRlcigiJXAsJXB7JXB7JXN9LCVzfSIsCisJICAgICAgIGlub2RlLCBmaWxlLAorCSAgICAgICBmaWxlLT5mX2RlbnRyeS0+ZF9wYXJlbnQsCisJICAgICAgIGZpbGUtPmZfZGVudHJ5LT5kX3BhcmVudCA/CisJICAgICAgIGZpbGUtPmZfZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUgOgorCSAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKSAiIiwKKwkgICAgICAgZmlsZS0+Zl9kZW50cnktPmRfbmFtZS5uYW1lKTsKKworCXJldHVybiAtRVJFTU9URTsKK30gLyogZW5kIGFmc19tbnRwdF9vcGVuKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNyZWF0ZSBhIHZmc21vdW50IHRvIGJlIGF1dG9tb3VudGVkCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKmFmc19tbnRwdF9kb19hdXRvbW91bnQoc3RydWN0IGRlbnRyeSAqbW50cHQpCit7CisJc3RydWN0IGFmc19zdXBlcl9pbmZvICpzdXBlcjsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisJc2l6ZV90IHNpemU7CisJY2hhciAqYnVmLCAqZGV2bmFtZSA9IE5VTEwsICpvcHRpb25zID0gTlVMTDsKKwlmaWxsZXJfdCAqZmlsbGVyOworCWludCByZXQ7CisKKwlrZW50ZXIoInslc30iLCBtbnRwdC0+ZF9uYW1lLm5hbWUpOworCisJQlVHX09OKCFtbnRwdC0+ZF9pbm9kZSk7CisKKwlyZXQgPSAtRUlOVkFMOworCXNpemUgPSBtbnRwdC0+ZF9pbm9kZS0+aV9zaXplOworCWlmIChzaXplID4gUEFHRV9TSVpFIC0gMSkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IC1FTk9NRU07CisJZGV2bmFtZSA9IChjaGFyICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWRldm5hbWUpCisJCWdvdG8gZXJyb3I7CisKKwlvcHRpb25zID0gKGNoYXIgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmICghb3B0aW9ucykKKwkJZ290byBlcnJvcjsKKworCS8qIHJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBBRlMgc3BlY2lhbCBzeW1saW5rICovCisJZmlsbGVyID0gKGZpbGxlcl90ICopbW50cHQtPmRfaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlOworCisJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtbnRwdC0+ZF9pbm9kZS0+aV9tYXBwaW5nLCAwLCBmaWxsZXIsIE5VTEwpOworCWlmIChJU19FUlIocGFnZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihwYWdlKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXQgPSAtRUlPOworCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7CisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkgfHwgUGFnZUVycm9yKHBhZ2UpKQorCQlnb3RvIGVycm9yOworCisJYnVmID0ga21hcChwYWdlKTsKKwltZW1jcHkoZGV2bmFtZSwgYnVmLCBzaXplKTsKKwlrdW5tYXAocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXBhZ2UgPSBOVUxMOworCisJLyogd29yayBvdXQgd2hhdCBvcHRpb25zIHdlIHdhbnQgKi8KKwlzdXBlciA9IEFGU19GU19TKG1udHB0LT5kX3NiKTsKKwltZW1jcHkob3B0aW9ucywgImNlbGw9IiwgNSk7CisJc3RyY3B5KG9wdGlvbnMgKyA1LCBzdXBlci0+dm9sdW1lLT5jZWxsLT5uYW1lKTsKKwlpZiAoc3VwZXItPnZvbHVtZS0+dHlwZSA9PSBBRlNWTF9SV1ZPTCkKKwkJc3RyY2F0KG9wdGlvbnMsICIscndwYXRoIik7CisKKwkvKiB0cnkgYW5kIGRvIHRoZSBtb3VudCAqLworCWtkZWJ1ZygiLS0tIGF0dGVtcHRpbmcgbW91bnQgJXMgLW8gJXMgLS0tIiwgZGV2bmFtZSwgb3B0aW9ucyk7CisJbW50ID0gZG9fa2Vybl9tb3VudCgiYWZzIiwgMCwgZGV2bmFtZSwgb3B0aW9ucyk7CisJa2RlYnVnKCItLS0gbW91bnQgcmVzdWx0ICVwIC0tLSIsIG1udCk7CisKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGRldm5hbWUpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgb3B0aW9ucyk7CisJa2xlYXZlKCIgPSAlcCIsIG1udCk7CisJcmV0dXJuIG1udDsKKworIGVycm9yOgorCWlmIChwYWdlKQorCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJaWYgKGRldm5hbWUpCisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgZGV2bmFtZSk7CisJaWYgKG9wdGlvbnMpCisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgb3B0aW9ucyk7CisJa2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30gLyogZW5kIGFmc19tbnRwdF9kb19hdXRvbW91bnQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZm9sbG93IGEgbGluayBmcm9tIGEgbW91bnRwb2ludCBkaXJlY3RvcnksIHRodXMgY2F1c2luZyBpdCB0byBiZSBtb3VudGVkCisgKi8KK3N0YXRpYyBpbnQgYWZzX21udHB0X2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHZmc21vdW50ICpuZXdtbnQ7CisJc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeTsKKwlpbnQgZXJyOworCisJa2VudGVyKCIlcHslc30seyVzOiVweyVzfX0iLAorCSAgICAgICBkZW50cnksCisJICAgICAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJICAgICAgIG5kLT5tbnQtPm1udF9kZXZuYW1lLAorCSAgICAgICBkZW50cnksCisJICAgICAgIG5kLT5kZW50cnktPmRfbmFtZS5uYW1lKTsKKworCW5ld21udCA9IGFmc19tbnRwdF9kb19hdXRvbW91bnQoZGVudHJ5KTsKKwlpZiAoSVNfRVJSKG5ld21udCkpIHsKKwkJcGF0aF9yZWxlYXNlKG5kKTsKKwkJcmV0dXJuIFBUUl9FUlIobmV3bW50KTsKKwl9CisKKwlvbGRfZGVudHJ5ID0gbmQtPmRlbnRyeTsKKwluZC0+ZGVudHJ5ID0gZGVudHJ5OworCWVyciA9IGRvX2FkZF9tb3VudChuZXdtbnQsIG5kLCAwLCAmYWZzX3Zmc21vdW50cyk7CisJbmQtPmRlbnRyeSA9IG9sZF9kZW50cnk7CisKKwlwYXRoX3JlbGVhc2UobmQpOworCisJaWYgKCFlcnIpIHsKKwkJbW50Z2V0KG5ld21udCk7CisJCW5kLT5tbnQgPSBuZXdtbnQ7CisJCWRnZXQobmV3bW50LT5tbnRfcm9vdCk7CisJCW5kLT5kZW50cnkgPSBuZXdtbnQtPm1udF9yb290OworCX0KKworCWtsZWF2ZSgiID0gJWQiLCBlcnIpOworCXJldHVybiBlcnI7Cit9IC8qIGVuZCBhZnNfbW50cHRfZm9sbG93X2xpbmsoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaGFuZGxlIG1vdW50cG9pbnQgZXhwaXJ5IHRpbWVyIGdvaW5nIG9mZgorICovCitzdGF0aWMgdm9pZCBhZnNfbW50cHRfZXhwaXJ5X3RpbWVkX291dChzdHJ1Y3QgYWZzX3RpbWVyICp0aW1lcikKK3sKKwlrZW50ZXIoIiIpOworCisJbWFya19tb3VudHNfZm9yX2V4cGlyeSgmYWZzX3Zmc21vdW50cyk7CisKKwlhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcigmYWZzX21udHB0X2V4cGlyeV90aW1lciwKKwkJCQlhZnNfbW50cHRfZXhwaXJ5X3RpbWVvdXQgKiBIWik7CisKKwlrbGVhdmUoIiIpOworfSAvKiBlbmQgYWZzX21udHB0X2V4cGlyeV90aW1lZF9vdXQoKSAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL21vdW50LmggYi9mcy9hZnMvbW91bnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDJmNDZlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL21vdW50LmgKQEAgLTAsMCArMSwyMyBAQAorLyogbW91bnQuaDogbW91bnQgcGFyYW1ldGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9BRlNfTU9VTlRfSAorI2RlZmluZSBfTElOVVhfQUZTX01PVU5UX0gKKworc3RydWN0IGFmc19tb3VudGRhdGEgeworCWNvbnN0IGNoYXIJCSp2b2x1bWU7CS8qIG5hbWUgb2Ygdm9sdW1lICovCisJY29uc3QgY2hhcgkJKmNlbGw7CQkvKiBuYW1lIG9mIGNlbGwgY29udGFpbmluZyB2b2x1bWUgKi8KKwljb25zdCBjaGFyCQkqY2FjaGU7CQkvKiBuYW1lIG9mIGNhY2hlIGJsb2NrIGRldmljZSAqLworCXNpemVfdAkJCW5zZXJ2ZXJzOwkvKiBudW1iZXIgb2Ygc2VydmVyIGFkZHJlc3NlcyBsaXN0ZWQgKi8KKwl1aW50MzJfdAkJc2VydmVyc1sxMF07CS8qIElQIGFkZHJlc3NlcyBvZiBzZXJ2ZXJzIGluIHRoaXMgY2VsbCAqLworfTsKKworI2VuZGlmIC8qIF9MSU5VWF9BRlNfTU9VTlRfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3Byb2MuYyBiL2ZzL2Fmcy9wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM4MWI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9wcm9jLmMKQEAgLTAsMCArMSw4NTcgQEAKKy8qIHByb2MuYzogL3Byb2MgaW50ZXJmYWNlIGZvciBBRlMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgImNlbGwuaCIKKyNpbmNsdWRlICJ2b2x1bWUuaCIKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfYWZzOworCisKK3N0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbHNfc3RhcnQoc3RydWN0IHNlcV9maWxlICpwLCBsb2ZmX3QgKnBvcyk7CitzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbHNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKTsKK3N0YXRpYyB2b2lkIGFmc19wcm9jX2NlbGxzX3N0b3Aoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KTsKK3N0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbHNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpOworc3RhdGljIHNzaXplX3QgYWZzX3Byb2NfY2VsbHNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJICAgIHNpemVfdCBzaXplLCBsb2ZmX3QgKl9wb3MpOworCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGFmc19wcm9jX2NlbGxzX29wcyA9IHsKKwkuc3RhcnQJPSBhZnNfcHJvY19jZWxsc19zdGFydCwKKwkubmV4dAk9IGFmc19wcm9jX2NlbGxzX25leHQsCisJLnN0b3AJPSBhZnNfcHJvY19jZWxsc19zdG9wLAorCS5zaG93CT0gYWZzX3Byb2NfY2VsbHNfc2hvdywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFmc19wcm9jX2NlbGxzX2ZvcHMgPSB7CisJLm9wZW4JCT0gYWZzX3Byb2NfY2VsbHNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkud3JpdGUJCT0gYWZzX3Byb2NfY2VsbHNfd3JpdGUsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgYWZzX3Byb2Nfcm9vdGNlbGxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGFmc19wcm9jX3Jvb3RjZWxsX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIHNzaXplX3QgYWZzX3Byb2Nfcm9vdGNlbGxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgICAgICBzaXplX3Qgc2l6ZSwgbG9mZl90ICpfcG9zKTsKK3N0YXRpYyBzc2l6ZV90IGFmc19wcm9jX3Jvb3RjZWxsX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgICAgICBzaXplX3Qgc2l6ZSwgbG9mZl90ICpfcG9zKTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWZzX3Byb2Nfcm9vdGNlbGxfZm9wcyA9IHsKKwkub3BlbgkJPSBhZnNfcHJvY19yb290Y2VsbF9vcGVuLAorCS5yZWFkCQk9IGFmc19wcm9jX3Jvb3RjZWxsX3JlYWQsCisJLndyaXRlCQk9IGFmc19wcm9jX3Jvb3RjZWxsX3dyaXRlLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWxlYXNlCT0gYWZzX3Byb2Nfcm9vdGNlbGxfcmVsZWFzZQorfTsKKworc3RhdGljIGludCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxfdm9sdW1lc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbF92b2x1bWVzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcCwgbG9mZl90ICpwb3MpOworc3RhdGljIHZvaWQgKmFmc19wcm9jX2NlbGxfdm9sdW1lc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwKKwkJCQkJbG9mZl90ICpwb3MpOworc3RhdGljIHZvaWQgYWZzX3Byb2NfY2VsbF92b2x1bWVzX3N0b3Aoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KTsKK3N0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbF92b2x1bWVzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KTsKKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfb3BzID0geworCS5zdGFydAk9IGFmc19wcm9jX2NlbGxfdm9sdW1lc19zdGFydCwKKwkubmV4dAk9IGFmc19wcm9jX2NlbGxfdm9sdW1lc19uZXh0LAorCS5zdG9wCT0gYWZzX3Byb2NfY2VsbF92b2x1bWVzX3N0b3AsCisJLnNob3cJPSBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfc2hvdywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFmc19wcm9jX2NlbGxfdm9sdW1lc19mb3BzID0geworCS5vcGVuCQk9IGFmc19wcm9jX2NlbGxfdm9sdW1lc19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gYWZzX3Byb2NfY2VsbF92b2x1bWVzX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxfdmxzZXJ2ZXJzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyB2b2lkICphZnNfcHJvY19jZWxsX3Zsc2VydmVyc19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIGxvZmZfdCAqcG9zKTsKK3N0YXRpYyB2b2lkICphZnNfcHJvY19jZWxsX3Zsc2VydmVyc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwKKwkJCQkJICBsb2ZmX3QgKnBvcyk7CitzdGF0aWMgdm9pZCBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdik7CitzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxfdmxzZXJ2ZXJzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KTsKKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19vcHMgPSB7CisJLnN0YXJ0CT0gYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfc3RhcnQsCisJLm5leHQJPSBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19uZXh0LAorCS5zdG9wCT0gYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfc3RvcCwKKwkuc2hvdwk9IGFmc19wcm9jX2NlbGxfdmxzZXJ2ZXJzX3Nob3csCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19mb3BzID0geworCS5vcGVuCQk9IGFmc19wcm9jX2NlbGxfdmxzZXJ2ZXJzX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBhZnNfcHJvY19jZWxsX3NlcnZlcnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxfc2VydmVyc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcCwgbG9mZl90ICpwb3MpOworc3RhdGljIHZvaWQgKmFmc19wcm9jX2NlbGxfc2VydmVyc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwKKwkJCQkJbG9mZl90ICpwb3MpOworc3RhdGljIHZvaWQgYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3N0b3Aoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KTsKK3N0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KTsKKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBhZnNfcHJvY19jZWxsX3NlcnZlcnNfb3BzID0geworCS5zdGFydAk9IGFmc19wcm9jX2NlbGxfc2VydmVyc19zdGFydCwKKwkubmV4dAk9IGFmc19wcm9jX2NlbGxfc2VydmVyc19uZXh0LAorCS5zdG9wCT0gYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3N0b3AsCisJLnNob3cJPSBhZnNfcHJvY19jZWxsX3NlcnZlcnNfc2hvdywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFmc19wcm9jX2NlbGxfc2VydmVyc19mb3BzID0geworCS5vcGVuCQk9IGFmc19wcm9jX2NlbGxfc2VydmVyc19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3JlbGVhc2UsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaW5pdGlhbGlzZSB0aGUgL3Byb2MvZnMvYWZzLyBkaXJlY3RvcnkKKyAqLworaW50IGFmc19wcm9jX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnA7CisKKwlfZW50ZXIoIiIpOworCisJcHJvY19hZnMgPSBwcm9jX21rZGlyKCJmcy9hZnMiLCBOVUxMKTsKKwlpZiAoIXByb2NfYWZzKQorCQlnb3RvIGVycm9yOworCXByb2NfYWZzLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJjZWxscyIsIDAsIHByb2NfYWZzKTsKKwlpZiAoIXApCisJCWdvdG8gZXJyb3JfcHJvYzsKKwlwLT5wcm9jX2ZvcHMgPSAmYWZzX3Byb2NfY2VsbHNfZm9wczsKKwlwLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJyb290Y2VsbCIsIDAsIHByb2NfYWZzKTsKKwlpZiAoIXApCisJCWdvdG8gZXJyb3JfY2VsbHM7CisJcC0+cHJvY19mb3BzID0gJmFmc19wcm9jX3Jvb3RjZWxsX2ZvcHM7CisJcC0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworCisgZXJyb3JfY2VsbHM6CisgCXJlbW92ZV9wcm9jX2VudHJ5KCJjZWxscyIsIHByb2NfYWZzKTsKKyBlcnJvcl9wcm9jOgorCXJlbW92ZV9wcm9jX2VudHJ5KCJmcy9hZnMiLCBOVUxMKTsKKyBlcnJvcjoKKwlfbGVhdmUoIiA9IC1FTk9NRU0iKTsKKwlyZXR1cm4gLUVOT01FTTsKKworfSAvKiBlbmQgYWZzX3Byb2NfaW5pdCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjbGVhbiB1cCB0aGUgL3Byb2MvZnMvYWZzLyBkaXJlY3RvcnkKKyAqLwordm9pZCBhZnNfcHJvY19jbGVhbnVwKHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoImNlbGxzIiwgcHJvY19hZnMpOworCisJcmVtb3ZlX3Byb2NfZW50cnkoImZzL2FmcyIsIE5VTEwpOworCit9IC8qIGVuZCBhZnNfcHJvY19jbGVhbnVwKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIG9wZW4gIi9wcm9jL2ZzL2Fmcy9jZWxscyIgd2hpY2ggcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIGV4dGFudCBjZWxscworICovCitzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICptOworCWludCByZXQ7CisKKwlyZXQgPSBzZXFfb3BlbihmaWxlLCAmYWZzX3Byb2NfY2VsbHNfb3BzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJbS0+cHJpdmF0ZSA9IFBERShpbm9kZSktPmRhdGE7CisKKwlyZXR1cm4gMDsKK30gLyogZW5kIGFmc19wcm9jX2NlbGxzX29wZW4oKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogc2V0IHVwIHRoZSBpdGVyYXRvciB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGNlbGxzIGxpc3QgYW5kIHJldHVybiB0aGUKKyAqIGZpcnN0IGl0ZW0KKyAqLworc3RhdGljIHZvaWQgKmFmc19wcm9jX2NlbGxzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpfcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKl9wOworCWxvZmZfdCBwb3MgPSAqX3BvczsKKworCS8qIGxvY2sgdGhlIGxpc3QgYWdhaW5zdCBtb2RpZmljYXRpb24gKi8KKwlkb3duX3JlYWQoJmFmc19wcm9jX2NlbGxzX3NlbSk7CisKKwkvKiBhbGxvdyBmb3IgdGhlIGhlYWRlciBsaW5lICovCisJaWYgKCFwb3MpCisJCXJldHVybiAodm9pZCAqKSAxOworCXBvcy0tOworCisJLyogZmluZCB0aGUgbid0aCBlbGVtZW50IGluIHRoZSBsaXN0ICovCisJbGlzdF9mb3JfZWFjaChfcCwgJmFmc19wcm9jX2NlbGxzKQorCQlpZiAoIXBvcy0tKQorCQkJYnJlYWs7CisKKwlyZXR1cm4gX3AgIT0gJmFmc19wcm9jX2NlbGxzID8gX3AgOiBOVUxMOworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbHNfc3RhcnQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbW92ZSB0byBuZXh0IGNlbGwgaW4gY2VsbHMgbGlzdAorICovCitzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbHNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKl9wOworCisJKCpwb3MpKys7CisKKwlfcCA9IHY7CisJX3AgPSB2ID09ICh2b2lkICopIDEgPyBhZnNfcHJvY19jZWxscy5uZXh0IDogX3AtPm5leHQ7CisKKwlyZXR1cm4gX3AgIT0gJmFmc19wcm9jX2NlbGxzID8gX3AgOiBOVUxMOworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbHNfbmV4dCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjbGVhbiB1cCBhZnRlciByZWFkaW5nIGZyb20gdGhlIGNlbGxzIGxpc3QKKyAqLworc3RhdGljIHZvaWQgYWZzX3Byb2NfY2VsbHNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCit7CisJdXBfcmVhZCgmYWZzX3Byb2NfY2VsbHNfc2VtKTsKKworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbHNfc3RvcCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBkaXNwbGF5IGEgaGVhZGVyIGxpbmUgZm9sbG93ZWQgYnkgYSBsb2FkIG9mIGNlbGwgbGluZXMKKyAqLworc3RhdGljIGludCBhZnNfcHJvY19jZWxsc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCBhZnNfY2VsbCwgcHJvY19saW5rKTsKKworCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLworCWlmICh2ID09ICh2b2lkICopIDEpIHsKKwkJc2VxX3B1dHMobSwgIlVTRSBOQU1FXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZGlzcGxheSBvbmUgY2VsbCBwZXIgbGluZSBvbiBzdWJzZXF1ZW50IGxpbmVzICovCisJc2VxX3ByaW50ZihtLCAiJTNkICVzXG4iLCBhdG9taWNfcmVhZCgmY2VsbC0+dXNhZ2UpLCBjZWxsLT5uYW1lKTsKKworCXJldHVybiAwOworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbHNfc2hvdygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBoYW5kbGUgd3JpdGVzIHRvIC9wcm9jL2ZzL2Fmcy9jZWxscworICogLSB0byBhZGQgY2VsbHM6IGVjaG8gImFkZCA8Y2VsbG5hbWU+IDxJUD5bOjxJUD5dWzo8SVA+XSIKKyAqLworc3RhdGljIHNzaXplX3QgYWZzX3Byb2NfY2VsbHNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJICAgIHNpemVfdCBzaXplLCBsb2ZmX3QgKl9wb3MpCit7CisJY2hhciAqa2J1ZiwgKm5hbWUsICphcmdzOworCWludCByZXQ7CisKKwkvKiBzdGFydCBieSBkcmFnZ2luZyB0aGUgY29tbWFuZCBpbnRvIG1lbW9yeSAqLworCWlmIChzaXplIDw9IDEgfHwgc2l6ZSA+PSBQQUdFX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJa2J1ZiA9IGttYWxsb2Moc2l6ZSArIDEsIEdGUF9LRVJORUwpOworCWlmICgha2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcihrYnVmLCBidWYsIHNpemUpICE9IDApCisJCWdvdG8gZG9uZTsKKwlrYnVmW3NpemVdID0gMDsKKworCS8qIHRyaW0gdG8gZmlyc3QgTkwgKi8KKwluYW1lID0gbWVtY2hyKGtidWYsICdcbicsIHNpemUpOworCWlmIChuYW1lKQorCQkqbmFtZSA9IDA7CisKKwkvKiBzcGxpdCBpbnRvIGNvbW1hbmQsIG5hbWUgYW5kIGFyZ3NsaXN0ICovCisJbmFtZSA9IHN0cmNocihrYnVmLCAnICcpOworCWlmICghbmFtZSkKKwkJZ290byBpbnZhbDsKKwlkbyB7CisJCSpuYW1lKysgPSAwOworCX0gd2hpbGUoKm5hbWUgPT0gJyAnKTsKKwlpZiAoISpuYW1lKQorCQlnb3RvIGludmFsOworCisJYXJncyA9IHN0cmNocihuYW1lLCAnICcpOworCWlmICghYXJncykKKwkJZ290byBpbnZhbDsKKwlkbyB7CisJCSphcmdzKysgPSAwOworCX0gd2hpbGUoKmFyZ3MgPT0gJyAnKTsKKwlpZiAoISphcmdzKQorCQlnb3RvIGludmFsOworCisJLyogZGV0ZXJtaW5lIGNvbW1hbmQgdG8gcGVyZm9ybSAqLworCV9kZWJ1ZygiY21kPSVzIG5hbWU9JXMgYXJncz0lcyIsIGtidWYsIG5hbWUsIGFyZ3MpOworCisJaWYgKHN0cmNtcChrYnVmLCAiYWRkIikgPT0gMCkgeworCQlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGw7CisJCXJldCA9IGFmc19jZWxsX2NyZWF0ZShuYW1lLCBhcmdzLCAmY2VsbCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBkb25lOworCisJCXByaW50aygia0FGUzogQWRkZWQgbmV3IGNlbGwgJyVzJ1xuIiwgbmFtZSk7CisJfQorCWVsc2UgeworCQlnb3RvIGludmFsOworCX0KKworCXJldCA9IHNpemU7CisKKyBkb25lOgorCWtmcmVlKGtidWYpOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7CisKKyBpbnZhbDoKKwlyZXQgPSAtRUlOVkFMOworCXByaW50aygia0FGUzogSW52YWxpZCBDb21tYW5kIG9uIC9wcm9jL2ZzL2Fmcy9jZWxscyBmaWxlXG4iKTsKKwlnb3RvIGRvbmU7Cit9IC8qIGVuZCBhZnNfcHJvY19jZWxsc193cml0ZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBTdHVicyBmb3IgL3Byb2MvZnMvYWZzL3Jvb3RjZWxsCisgKi8KK3N0YXRpYyBpbnQgYWZzX3Byb2Nfcm9vdGNlbGxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZnNfcHJvY19yb290Y2VsbF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBhZnNfcHJvY19yb290Y2VsbF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgICAgIHNpemVfdCBzaXplLCBsb2ZmX3QgKl9wb3MpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBoYW5kbGUgd3JpdGVzIHRvIC9wcm9jL2ZzL2Fmcy9yb290Y2VsbAorICogLSB0byBpbml0aWFsaXplIHJvb3RjZWxsOiBlY2hvICJjZWxsLm5hbWU6MTkyLjE2OC4yMzEuMTQiCisgKi8KK3N0YXRpYyBzc2l6ZV90IGFmc19wcm9jX3Jvb3RjZWxsX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgICAgICBzaXplX3Qgc2l6ZSwgbG9mZl90ICpfcG9zKQoreworCWNoYXIgKmtidWYsICpzOworCWludCByZXQ7CisKKwkvKiBzdGFydCBieSBkcmFnZ2luZyB0aGUgY29tbWFuZCBpbnRvIG1lbW9yeSAqLworCWlmIChzaXplIDw9IDEgfHwgc2l6ZSA+PSBQQUdFX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gLUVOT01FTTsKKwlrYnVmID0ga21hbGxvYyhzaXplICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrYnVmKQorCQlnb3RvIG5vbWVtOworCisJcmV0ID0gLUVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIoa2J1ZiwgYnVmLCBzaXplKSAhPSAwKQorCQlnb3RvIGluZmF1bHQ7CisJa2J1ZltzaXplXSA9IDA7CisKKwkvKiB0cmltIHRvIGZpcnN0IE5MICovCisJcyA9IG1lbWNocihrYnVmLCAnXG4nLCBzaXplKTsKKwlpZiAocykKKwkJKnMgPSAwOworCisJLyogZGV0ZXJtaW5lIGNvbW1hbmQgdG8gcGVyZm9ybSAqLworCV9kZWJ1Zygicm9vdGNlbGw9JXMiLCBrYnVmKTsKKworCXJldCA9IGFmc19jZWxsX2luaXQoa2J1Zik7CisJaWYgKHJldCA+PSAwKQorCQlyZXQgPSBzaXplOwkvKiBjb25zdW1lIGV2ZXJ5dGhpbmcsIGFsd2F5cyAqLworCisgaW5mYXVsdDoKKwlrZnJlZShrYnVmKTsKKyBub21lbToKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgYWZzX3Byb2Nfcm9vdGNlbGxfd3JpdGUoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaW5pdGlhbGlzZSAvcHJvYy9mcy9hZnMvPGNlbGw+LworICovCitpbnQgYWZzX3Byb2NfY2VsbF9zZXR1cChzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwOworCisJX2VudGVyKCIlcHslc30iLCBjZWxsLCBjZWxsLT5uYW1lKTsKKworCWNlbGwtPnByb2NfZGlyID0gcHJvY19ta2RpcihjZWxsLT5uYW1lLCBwcm9jX2Fmcyk7CisJaWYgKCFjZWxsLT5wcm9jX2RpcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwID0gY3JlYXRlX3Byb2NfZW50cnkoInNlcnZlcnMiLCAwLCBjZWxsLT5wcm9jX2Rpcik7CisJaWYgKCFwKQorCQlnb3RvIGVycm9yX3Byb2M7CisJcC0+cHJvY19mb3BzID0gJmFmc19wcm9jX2NlbGxfc2VydmVyc19mb3BzOworCXAtPm93bmVyID0gVEhJU19NT0RVTEU7CisJcC0+ZGF0YSA9IGNlbGw7CisKKwlwID0gY3JlYXRlX3Byb2NfZW50cnkoInZsc2VydmVycyIsIDAsIGNlbGwtPnByb2NfZGlyKTsKKwlpZiAoIXApCisJCWdvdG8gZXJyb3Jfc2VydmVyczsKKwlwLT5wcm9jX2ZvcHMgPSAmYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfZm9wczsKKwlwLT5vd25lciA9IFRISVNfTU9EVUxFOworCXAtPmRhdGEgPSBjZWxsOworCisJcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJ2b2x1bWVzIiwgMCwgY2VsbC0+cHJvY19kaXIpOworCWlmICghcCkKKwkJZ290byBlcnJvcl92bHNlcnZlcnM7CisJcC0+cHJvY19mb3BzID0gJmFmc19wcm9jX2NlbGxfdm9sdW1lc19mb3BzOworCXAtPm93bmVyID0gVEhJU19NT0RVTEU7CisJcC0+ZGF0YSA9IGNlbGw7CisKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKKworIGVycm9yX3Zsc2VydmVyczoKKwlyZW1vdmVfcHJvY19lbnRyeSgidmxzZXJ2ZXJzIiwgY2VsbC0+cHJvY19kaXIpOworIGVycm9yX3NlcnZlcnM6CisJcmVtb3ZlX3Byb2NfZW50cnkoInNlcnZlcnMiLCBjZWxsLT5wcm9jX2Rpcik7CisgZXJyb3JfcHJvYzoKKwlyZW1vdmVfcHJvY19lbnRyeShjZWxsLT5uYW1lLCBwcm9jX2Fmcyk7CisJX2xlYXZlKCIgPSAtRU5PTUVNIik7CisJcmV0dXJuIC1FTk9NRU07Cit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3NldHVwKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHJlbW92ZSAvcHJvYy9mcy9hZnMvPGNlbGw+LworICovCit2b2lkIGFmc19wcm9jX2NlbGxfcmVtb3ZlKHN0cnVjdCBhZnNfY2VsbCAqY2VsbCkKK3sKKwlfZW50ZXIoIiIpOworCisJcmVtb3ZlX3Byb2NfZW50cnkoInZvbHVtZXMiLCBjZWxsLT5wcm9jX2Rpcik7CisJcmVtb3ZlX3Byb2NfZW50cnkoInZsc2VydmVycyIsIGNlbGwtPnByb2NfZGlyKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgic2VydmVycyIsIGNlbGwtPnByb2NfZGlyKTsKKwlyZW1vdmVfcHJvY19lbnRyeShjZWxsLT5uYW1lLCBwcm9jX2Fmcyk7CisKKwlfbGVhdmUoIiIpOworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF9yZW1vdmUoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogb3BlbiAiL3Byb2MvZnMvYWZzLzxjZWxsPi92b2x1bWVzIiB3aGljaCBwcm92aWRlcyBhIHN1bW1hcnkgb2YgZXh0YW50IGNlbGxzCisgKi8KK3N0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbF92b2x1bWVzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGFmc19jZWxsICpjZWxsOworCXN0cnVjdCBzZXFfZmlsZSAqbTsKKwlpbnQgcmV0OworCisJY2VsbCA9IGFmc19nZXRfY2VsbF9tYXliZSgoc3RydWN0IGFmc19jZWxsICoqKSAmUERFKGlub2RlKS0+ZGF0YSk7CisJaWYgKCFjZWxsKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJldCA9IHNlcV9vcGVuKGZpbGUsICZhZnNfcHJvY19jZWxsX3ZvbHVtZXNfb3BzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJbS0+cHJpdmF0ZSA9IGNlbGw7CisKKwlyZXR1cm4gMDsKK30gLyogZW5kIGFmc19wcm9jX2NlbGxfdm9sdW1lc19vcGVuKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNsb3NlIHRoZSBmaWxlIGFuZCByZWxlYXNlIHRoZSByZWYgdG8gdGhlIGNlbGwKKyAqLworc3RhdGljIGludCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBQREUoaW5vZGUpLT5kYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzZXFfcmVsZWFzZShpbm9kZSxmaWxlKTsKKworCWFmc19wdXRfY2VsbChjZWxsKTsKKworCXJldHVybiByZXQ7Cit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfcmVsZWFzZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBzZXQgdXAgdGhlIGl0ZXJhdG9yIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgY2VsbHMgbGlzdCBhbmQgcmV0dXJuIHRoZQorICogZmlyc3QgaXRlbQorICovCitzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbF92b2x1bWVzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpfcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKl9wOworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IG0tPnByaXZhdGU7CisJbG9mZl90IHBvcyA9ICpfcG9zOworCisJX2VudGVyKCJjZWxsPSVwIHBvcz0lTGQiLCBjZWxsLCAqX3Bvcyk7CisKKwkvKiBsb2NrIHRoZSBsaXN0IGFnYWluc3QgbW9kaWZpY2F0aW9uICovCisJZG93bl9yZWFkKCZjZWxsLT52bF9zZW0pOworCisJLyogYWxsb3cgZm9yIHRoZSBoZWFkZXIgbGluZSAqLworCWlmICghcG9zKQorCQlyZXR1cm4gKHZvaWQgKikgMTsKKwlwb3MtLTsKKworCS8qIGZpbmQgdGhlIG4ndGggZWxlbWVudCBpbiB0aGUgbGlzdCAqLworCWxpc3RfZm9yX2VhY2goX3AsICZjZWxsLT52bF9saXN0KQorCQlpZiAoIXBvcy0tKQorCQkJYnJlYWs7CisKKwlyZXR1cm4gX3AgIT0gJmNlbGwtPnZsX2xpc3QgPyBfcCA6IE5VTEw7Cit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfc3RhcnQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbW92ZSB0byBuZXh0IGNlbGwgaW4gY2VsbHMgbGlzdAorICovCitzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbF92b2x1bWVzX25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LAorCQkJCQlsb2ZmX3QgKl9wb3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqX3A7CisJc3RydWN0IGFmc19jZWxsICpjZWxsID0gcC0+cHJpdmF0ZTsKKworCV9lbnRlcigiY2VsbD0lcCBwb3M9JUxkIiwgY2VsbCwgKl9wb3MpOworCisJKCpfcG9zKSsrOworCisJX3AgPSB2OworCV9wID0gdiA9PSAodm9pZCAqKSAxID8gY2VsbC0+dmxfbGlzdC5uZXh0IDogX3AtPm5leHQ7CisKKwlyZXR1cm4gX3AgIT0gJmNlbGwtPnZsX2xpc3QgPyBfcCA6IE5VTEw7Cit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfbmV4dCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjbGVhbiB1cCBhZnRlciByZWFkaW5nIGZyb20gdGhlIGNlbGxzIGxpc3QKKyAqLworc3RhdGljIHZvaWQgYWZzX3Byb2NfY2VsbF92b2x1bWVzX3N0b3Aoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQoreworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHAtPnByaXZhdGU7CisKKwl1cF9yZWFkKCZjZWxsLT52bF9zZW0pOworCit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfc3RvcCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBkaXNwbGF5IGEgaGVhZGVyIGxpbmUgZm9sbG93ZWQgYnkgYSBsb2FkIG9mIHZvbHVtZSBsaW5lcworICovCitzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxfdm9sdW1lc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uID0KKwkJbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiwgbGluayk7CisKKwkvKiBkaXNwbGF5IGhlYWRlciBvbiBsaW5lIDEgKi8KKwlpZiAodiA9PSAodm9pZCAqKSAxKSB7CisJCXNlcV9wdXRzKG0sICJVU0UgVkxJRFswXSAgVkxJRFsxXSAgVkxJRFsyXSAgTkFNRVxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIGRpc3BsYXkgb25lIGNlbGwgcGVyIGxpbmUgb24gc3Vic2VxdWVudCBsaW5lcyAqLworCXNlcV9wcmludGYobSwgIiUzZCAlMDh4ICUwOHggJTA4eCAlc1xuIiwKKwkJICAgYXRvbWljX3JlYWQoJnZsb2NhdGlvbi0+dXNhZ2UpLAorCQkgICB2bG9jYXRpb24tPnZsZGIudmlkWzBdLAorCQkgICB2bG9jYXRpb24tPnZsZGIudmlkWzFdLAorCQkgICB2bG9jYXRpb24tPnZsZGIudmlkWzJdLAorCQkgICB2bG9jYXRpb24tPnZsZGIubmFtZQorCQkgICApOworCisJcmV0dXJuIDA7Cit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfc2hvdygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBvcGVuICIvcHJvYy9mcy9hZnMvPGNlbGw+L3Zsc2VydmVycyIgd2hpY2ggcHJvdmlkZXMgYSBsaXN0IG9mIHZvbHVtZQorICogbG9jYXRpb24gc2VydmVyCisgKi8KK3N0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGw7CisJc3RydWN0IHNlcV9maWxlICptOworCWludCByZXQ7CisKKwljZWxsID0gYWZzX2dldF9jZWxsX21heWJlKChzdHJ1Y3QgYWZzX2NlbGwqKikmUERFKGlub2RlKS0+ZGF0YSk7CisJaWYgKCFjZWxsKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJldCA9IHNlcV9vcGVuKGZpbGUsJmFmc19wcm9jX2NlbGxfdmxzZXJ2ZXJzX29wcyk7CisJaWYgKHJldDwwKQorCQlyZXR1cm4gcmV0OworCisJbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwltLT5wcml2YXRlID0gY2VsbDsKKworCXJldHVybiAwOworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfb3BlbigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjbG9zZSB0aGUgZmlsZSBhbmQgcmVsZWFzZSB0aGUgcmVmIHRvIHRoZSBjZWxsCisgKi8KK3N0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBQREUoaW5vZGUpLT5kYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzZXFfcmVsZWFzZShpbm9kZSxmaWxlKTsKKworCWFmc19wdXRfY2VsbChjZWxsKTsKKworCXJldHVybiByZXQ7Cit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19yZWxlYXNlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHNldCB1cCB0aGUgaXRlcmF0b3IgdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBjZWxscyBsaXN0IGFuZCByZXR1cm4gdGhlCisgKiBmaXJzdCBpdGVtCisgKi8KK3N0YXRpYyB2b2lkICphZnNfcHJvY19jZWxsX3Zsc2VydmVyc19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqX3BvcykKK3sKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBtLT5wcml2YXRlOworCWxvZmZfdCBwb3MgPSAqX3BvczsKKworCV9lbnRlcigiY2VsbD0lcCBwb3M9JUxkIiwgY2VsbCwgKl9wb3MpOworCisJLyogbG9jayB0aGUgbGlzdCBhZ2FpbnN0IG1vZGlmaWNhdGlvbiAqLworCWRvd25fcmVhZCgmY2VsbC0+dmxfc2VtKTsKKworCS8qIGFsbG93IGZvciB0aGUgaGVhZGVyIGxpbmUgKi8KKwlpZiAoIXBvcykKKwkJcmV0dXJuICh2b2lkICopIDE7CisJcG9zLS07CisKKwlpZiAocG9zID49IGNlbGwtPnZsX25hZGRycykKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gJmNlbGwtPnZsX2FkZHJzW3Bvc107Cit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19zdGFydCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBtb3ZlIHRvIG5leHQgY2VsbCBpbiBjZWxscyBsaXN0CisgKi8KK3N0YXRpYyB2b2lkICphZnNfcHJvY19jZWxsX3Zsc2VydmVyc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwKKwkJCQkJICBsb2ZmX3QgKl9wb3MpCit7CisJc3RydWN0IGFmc19jZWxsICpjZWxsID0gcC0+cHJpdmF0ZTsKKwlsb2ZmX3QgcG9zOworCisJX2VudGVyKCJjZWxsPSVwe25hZD0ldX0gcG9zPSVMZCIsIGNlbGwsIGNlbGwtPnZsX25hZGRycywgKl9wb3MpOworCisJcG9zID0gKl9wb3M7CisJKCpfcG9zKSsrOworCWlmIChwb3MgPj0gY2VsbC0+dmxfbmFkZHJzKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAmY2VsbC0+dmxfYWRkcnNbcG9zXTsKK30gLyogZW5kIGFmc19wcm9jX2NlbGxfdmxzZXJ2ZXJzX25leHQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY2xlYW4gdXAgYWZ0ZXIgcmVhZGluZyBmcm9tIHRoZSBjZWxscyBsaXN0CisgKi8KK3N0YXRpYyB2b2lkIGFmc19wcm9jX2NlbGxfdmxzZXJ2ZXJzX3N0b3Aoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQoreworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHAtPnByaXZhdGU7CisKKwl1cF9yZWFkKCZjZWxsLT52bF9zZW0pOworCit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19zdG9wKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGRpc3BsYXkgYSBoZWFkZXIgbGluZSBmb2xsb3dlZCBieSBhIGxvYWQgb2Ygdm9sdW1lIGxpbmVzCisgKi8KK3N0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IGluX2FkZHIgKmFkZHIgPSB2OworCisJLyogZGlzcGxheSBoZWFkZXIgb24gbGluZSAxICovCisJaWYgKHYgPT0gKHN0cnVjdCBpbl9hZGRyICopIDEpIHsKKwkJc2VxX3B1dHMobSwgIkFERFJFU1NcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBkaXNwbGF5IG9uZSBjZWxsIHBlciBsaW5lIG9uIHN1YnNlcXVlbnQgbGluZXMgKi8KKwlzZXFfcHJpbnRmKG0sICIldS4ldS4ldS4ldVxuIiwgTklQUVVBRChhZGRyLT5zX2FkZHIpKTsKKworCXJldHVybiAwOworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfc2hvdygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBvcGVuICIvcHJvYy9mcy9hZnMvPGNlbGw+L3NlcnZlcnMiIHdoaWNoIHByb3ZpZGVzIGEgc3VtbWFyeSBvZiBhY3RpdmUKKyAqIHNlcnZlcnMKKyAqLworc3RhdGljIGludCBhZnNfcHJvY19jZWxsX3NlcnZlcnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGw7CisJc3RydWN0IHNlcV9maWxlICptOworCWludCByZXQ7CisKKwljZWxsID0gYWZzX2dldF9jZWxsX21heWJlKChzdHJ1Y3QgYWZzX2NlbGwgKiopICZQREUoaW5vZGUpLT5kYXRhKTsKKwlpZiAoIWNlbGwpCisJCXJldHVybiAtRU5PRU5UOworCisJcmV0ID0gc2VxX29wZW4oZmlsZSwgJmFmc19wcm9jX2NlbGxfc2VydmVyc19vcHMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwltLT5wcml2YXRlID0gY2VsbDsKKworCXJldHVybiAwOworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX29wZW4oKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY2xvc2UgdGhlIGZpbGUgYW5kIHJlbGVhc2UgdGhlIHJlZiB0byB0aGUgY2VsbAorICovCitzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxfc2VydmVyc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBQREUoaW5vZGUpLT5kYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzZXFfcmVsZWFzZShpbm9kZSwgZmlsZSk7CisKKwlhZnNfcHV0X2NlbGwoY2VsbCk7CisKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3JlbGVhc2UoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogc2V0IHVwIHRoZSBpdGVyYXRvciB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGNlbGxzIGxpc3QgYW5kIHJldHVybiB0aGUKKyAqIGZpcnN0IGl0ZW0KKyAqLworc3RhdGljIHZvaWQgKmFmc19wcm9jX2NlbGxfc2VydmVyc19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqX3BvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBtLT5wcml2YXRlOworCWxvZmZfdCBwb3MgPSAqX3BvczsKKworCV9lbnRlcigiY2VsbD0lcCBwb3M9JUxkIiwgY2VsbCwgKl9wb3MpOworCisJLyogbG9jayB0aGUgbGlzdCBhZ2FpbnN0IG1vZGlmaWNhdGlvbiAqLworCXJlYWRfbG9jaygmY2VsbC0+c3ZfbG9jayk7CisKKwkvKiBhbGxvdyBmb3IgdGhlIGhlYWRlciBsaW5lICovCisJaWYgKCFwb3MpCisJCXJldHVybiAodm9pZCAqKSAxOworCXBvcy0tOworCisJLyogZmluZCB0aGUgbid0aCBlbGVtZW50IGluIHRoZSBsaXN0ICovCisJbGlzdF9mb3JfZWFjaChfcCwgJmNlbGwtPnN2X2xpc3QpCisJCWlmICghcG9zLS0pCisJCQlicmVhazsKKworCXJldHVybiBfcCAhPSAmY2VsbC0+c3ZfbGlzdCA/IF9wIDogTlVMTDsKK30gLyogZW5kIGFmc19wcm9jX2NlbGxfc2VydmVyc19zdGFydCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBtb3ZlIHRvIG5leHQgY2VsbCBpbiBjZWxscyBsaXN0CisgKi8KK3N0YXRpYyB2b2lkICphZnNfcHJvY19jZWxsX3NlcnZlcnNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsCisJCQkJCWxvZmZfdCAqX3BvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBwLT5wcml2YXRlOworCisJX2VudGVyKCJjZWxsPSVwIHBvcz0lTGQiLCBjZWxsLCAqX3Bvcyk7CisKKwkoKl9wb3MpKys7CisKKwlfcCA9IHY7CisJX3AgPSB2ID09ICh2b2lkICopIDEgPyBjZWxsLT5zdl9saXN0Lm5leHQgOiBfcC0+bmV4dDsKKworCXJldHVybiBfcCAhPSAmY2VsbC0+c3ZfbGlzdCA/IF9wIDogTlVMTDsKK30gLyogZW5kIGFmc19wcm9jX2NlbGxfc2VydmVyc19uZXh0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNsZWFuIHVwIGFmdGVyIHJlYWRpbmcgZnJvbSB0aGUgY2VsbHMgbGlzdAorICovCitzdGF0aWMgdm9pZCBhZnNfcHJvY19jZWxsX3NlcnZlcnNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCit7CisJc3RydWN0IGFmc19jZWxsICpjZWxsID0gcC0+cHJpdmF0ZTsKKworCXJlYWRfdW5sb2NrKCZjZWxsLT5zdl9sb2NrKTsKKworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3N0b3AoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZGlzcGxheSBhIGhlYWRlciBsaW5lIGZvbGxvd2VkIGJ5IGEgbG9hZCBvZiB2b2x1bWUgbGluZXMKKyAqLworc3RhdGljIGludCBhZnNfcHJvY19jZWxsX3NlcnZlcnNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciA9IGxpc3RfZW50cnkodiwgc3RydWN0IGFmc19zZXJ2ZXIsIGxpbmspOworCWNoYXIgaXBhZGRyWzIwXTsKKworCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLworCWlmICh2ID09ICh2b2lkICopIDEpIHsKKwkJc2VxX3B1dHMobSwgIlVTRSBBRERSICAgICAgICAgICAgU1RBVEVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBkaXNwbGF5IG9uZSBjZWxsIHBlciBsaW5lIG9uIHN1YnNlcXVlbnQgbGluZXMgKi8KKwlzcHJpbnRmKGlwYWRkciwgIiV1LiV1LiV1LiV1IiwgTklQUVVBRChzZXJ2ZXItPmFkZHIpKTsKKwlzZXFfcHJpbnRmKG0sICIlM2QgJS0xNS4xNXMgJTVkXG4iLAorCQkgICBhdG9taWNfcmVhZCgmc2VydmVyLT51c2FnZSksCisJCSAgIGlwYWRkciwKKwkJICAgc2VydmVyLT5mc19zdGF0ZQorCQkgICApOworCisJcmV0dXJuIDA7Cit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3NlcnZlcnNfc2hvdygpICovCmRpZmYgLS1naXQgYS9mcy9hZnMvc2VydmVyLmMgYi9mcy9hZnMvc2VydmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJiMDkzYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9zZXJ2ZXIuYwpAQCAtMCwwICsxLDUwMiBAQAorLyogc2VydmVyLmM6IEFGUyBzZXJ2ZXIgcmVjb3JkIG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHJ4cnBjL3BlZXIuaD4KKyNpbmNsdWRlIDxyeHJwYy9jb25uZWN0aW9uLmg+CisjaW5jbHVkZSAidm9sdW1lLmgiCisjaW5jbHVkZSAiY2VsbC5oIgorI2luY2x1ZGUgInNlcnZlci5oIgorI2luY2x1ZGUgInRyYW5zcG9ydC5oIgorI2luY2x1ZGUgInZsY2xpZW50LmgiCisjaW5jbHVkZSAia2Fmc3RpbW9kLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworREVGSU5FX1NQSU5MT0NLKGFmc19zZXJ2ZXJfcGVlcl9sb2NrKTsKKworI2RlZmluZSBGU19TRVJWSUNFX0lECQkxCS8qIEFGUyBWb2x1bWUgTG9jYXRpb24gU2VydmljZSBJRCAqLworI2RlZmluZSBWTF9TRVJWSUNFX0lECQk1MgkvKiBBRlMgVm9sdW1lIExvY2F0aW9uIFNlcnZpY2UgSUQgKi8KKworc3RhdGljIHZvaWQgX19hZnNfc2VydmVyX3RpbWVvdXQoc3RydWN0IGFmc190aW1lciAqdGltZXIpCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciA9CisJCWxpc3RfZW50cnkodGltZXIsIHN0cnVjdCBhZnNfc2VydmVyLCB0aW1lb3V0KTsKKworCV9kZWJ1ZygiU0VSVkVSIFRJTUVPVVQgWyVwe3U9JWR9XSIsCisJICAgICAgIHNlcnZlciwgYXRvbWljX3JlYWQoJnNlcnZlci0+dXNhZ2UpKTsKKworCWFmc19zZXJ2ZXJfZG9fdGltZW91dChzZXJ2ZXIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmc190aW1lcl9vcHMgYWZzX3NlcnZlcl90aW1lcl9vcHMgPSB7CisJLnRpbWVkX291dAk9IF9fYWZzX3NlcnZlcl90aW1lb3V0LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGxvb2t1cCBhIHNlcnZlciByZWNvcmQgaW4gYSBjZWxsCisgKiAtIFRPRE86IHNlYXJjaCB0aGUgY2VsbCdzIHNlcnZlciBsaXN0CisgKi8KK2ludCBhZnNfc2VydmVyX2xvb2t1cChzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwsIGNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRyLAorCQkgICAgICBzdHJ1Y3QgYWZzX3NlcnZlciAqKl9zZXJ2ZXIpCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwgKmFjdGl2ZSwgKnpvbWJpZTsKKwlpbnQgbG9vcDsKKworCV9lbnRlcigiJXAsJTA4eCwiLCBjZWxsLCBudG9obChhZGRyLT5zX2FkZHIpKTsKKworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIGEgc2VydmVyIHJlY29yZCAqLworCXNlcnZlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfc2VydmVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXJ2ZXIpIHsKKwkJX2xlYXZlKCIgPSAtRU5PTUVNIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChzZXJ2ZXIsIDAsIHNpemVvZihzdHJ1Y3QgYWZzX3NlcnZlcikpOworCWF0b21pY19zZXQoJnNlcnZlci0+dXNhZ2UsIDEpOworCisJSU5JVF9MSVNUX0hFQUQoJnNlcnZlci0+bGluayk7CisJaW5pdF9yd3NlbSgmc2VydmVyLT5zZW0pOworCUlOSVRfTElTVF9IRUFEKCZzZXJ2ZXItPmZzX2NhbGxxKTsKKwlzcGluX2xvY2tfaW5pdCgmc2VydmVyLT5mc19sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmc2VydmVyLT5jYl9wcm9taXNlcyk7CisJc3Bpbl9sb2NrX2luaXQoJnNlcnZlci0+Y2JfbG9jayk7CisKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgQUZTX1NFUlZFUl9DT05OX0xJU1RfU0laRTsgbG9vcCsrKQorCQlzZXJ2ZXItPmZzX2Nvbm5fY250W2xvb3BdID0gNDsKKworCW1lbWNweSgmc2VydmVyLT5hZGRyLCBhZGRyLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKwlzZXJ2ZXItPmFkZHIuc19hZGRyID0gYWRkci0+c19hZGRyOworCisJYWZzX3RpbWVyX2luaXQoJnNlcnZlci0+dGltZW91dCwgJmFmc19zZXJ2ZXJfdGltZXJfb3BzKTsKKworCS8qIGFkZCB0byB0aGUgY2VsbCAqLworCXdyaXRlX2xvY2soJmNlbGwtPnN2X2xvY2spOworCisJLyogY2hlY2sgdGhlIGFjdGl2ZSBsaXN0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhY3RpdmUsICZjZWxsLT5zdl9saXN0LCBsaW5rKSB7CisJCWlmIChhY3RpdmUtPmFkZHIuc19hZGRyID09IGFkZHItPnNfYWRkcikKKwkJCWdvdG8gdXNlX2FjdGl2ZV9zZXJ2ZXI7CisJfQorCisJLyogY2hlY2sgdGhlIGluYWN0aXZlIGxpc3QgKi8KKwlzcGluX2xvY2soJmNlbGwtPnN2X2d5bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh6b21iaWUsICZjZWxsLT5zdl9ncmF2ZXlhcmQsIGxpbmspIHsKKwkJaWYgKHpvbWJpZS0+YWRkci5zX2FkZHIgPT0gYWRkci0+c19hZGRyKQorCQkJZ290byByZXN1cnJlY3Rfc2VydmVyOworCX0KKwlzcGluX3VubG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKKworCWFmc19nZXRfY2VsbChjZWxsKTsKKwlzZXJ2ZXItPmNlbGwgPSBjZWxsOworCWxpc3RfYWRkX3RhaWwoJnNlcnZlci0+bGluaywgJmNlbGwtPnN2X2xpc3QpOworCisJd3JpdGVfdW5sb2NrKCZjZWxsLT5zdl9sb2NrKTsKKworCSpfc2VydmVyID0gc2VydmVyOworCV9sZWF2ZSgiID0gMCAoJXApIiwgc2VydmVyKTsKKwlyZXR1cm4gMDsKKworCS8qIGZvdW5kIGEgbWF0Y2hpbmcgYWN0aXZlIHNlcnZlciAqLworIHVzZV9hY3RpdmVfc2VydmVyOgorCV9kZWJ1ZygiYWN0aXZlIHNlcnZlciIpOworCWFmc19nZXRfc2VydmVyKGFjdGl2ZSk7CisJd3JpdGVfdW5sb2NrKCZjZWxsLT5zdl9sb2NrKTsKKworCWtmcmVlKHNlcnZlcik7CisKKwkqX3NlcnZlciA9IGFjdGl2ZTsKKwlfbGVhdmUoIiA9IDAgKCVwKSIsIGFjdGl2ZSk7CisJcmV0dXJuIDA7CisKKwkvKiBmb3VuZCBhIG1hdGNoaW5nIHNlcnZlciBpbiB0aGUgZ3JhdmV5YXJkLCBzbyByZXN1cnJlY3QgaXQgYW5kCisJICogZGlzcG9zZSBvZiB0aGUgbmV3IHJlY29yZCAqLworIHJlc3VycmVjdF9zZXJ2ZXI6CisJX2RlYnVnKCJyZXN1cnJlY3Rpbmcgc2VydmVyIik7CisKKwlsaXN0X2RlbCgmem9tYmllLT5saW5rKTsKKwlsaXN0X2FkZF90YWlsKCZ6b21iaWUtPmxpbmssICZjZWxsLT5zdl9saXN0KTsKKwlhZnNfZ2V0X3NlcnZlcih6b21iaWUpOworCWFmc19rYWZzdGltb2RfZGVsX3RpbWVyKCZ6b21iaWUtPnRpbWVvdXQpOworCXNwaW5fdW5sb2NrKCZjZWxsLT5zdl9neWxvY2spOworCXdyaXRlX3VubG9jaygmY2VsbC0+c3ZfbG9jayk7CisKKwlrZnJlZShzZXJ2ZXIpOworCisJKl9zZXJ2ZXIgPSB6b21iaWU7CisJX2xlYXZlKCIgPSAwICglcCkiLCB6b21iaWUpOworCXJldHVybiAwOworCit9IC8qIGVuZCBhZnNfc2VydmVyX2xvb2t1cCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBkZXN0cm95IGEgc2VydmVyIHJlY29yZAorICogLSByZW1vdmVzIGZyb20gdGhlIGNlbGwgbGlzdAorICovCit2b2lkIGFmc19wdXRfc2VydmVyKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIpCit7CisJc3RydWN0IGFmc19jZWxsICpjZWxsOworCisJaWYgKCFzZXJ2ZXIpCisJCXJldHVybjsKKworCV9lbnRlcigiJXAiLCBzZXJ2ZXIpOworCisJY2VsbCA9IHNlcnZlci0+Y2VsbDsKKworCS8qIHNhbml0eSBjaGVjayAqLworCUJVR19PTihhdG9taWNfcmVhZCgmc2VydmVyLT51c2FnZSkgPD0gMCk7CisKKwkvKiB0byBwcmV2ZW50IGEgcmFjZSwgdGhlIGRlY3JlbWVudCBhbmQgdGhlIGRlcXVldWUgbXVzdCBiZSBlZmZlY3RpdmVseQorCSAqIGF0b21pYyAqLworCXdyaXRlX2xvY2soJmNlbGwtPnN2X2xvY2spOworCisJaWYgKGxpa2VseSghYXRvbWljX2RlY19hbmRfdGVzdCgmc2VydmVyLT51c2FnZSkpKSB7CisJCXdyaXRlX3VubG9jaygmY2VsbC0+c3ZfbG9jayk7CisJCV9sZWF2ZSgiIik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2soJmNlbGwtPnN2X2d5bG9jayk7CisJbGlzdF9kZWwoJnNlcnZlci0+bGluayk7CisJbGlzdF9hZGRfdGFpbCgmc2VydmVyLT5saW5rLCAmY2VsbC0+c3ZfZ3JhdmV5YXJkKTsKKworCS8qIHRpbWUgb3V0IGluIDEwIHNlY3MgKi8KKwlhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcigmc2VydmVyLT50aW1lb3V0LCAxMCAqIEhaKTsKKworCXNwaW5fdW5sb2NrKCZjZWxsLT5zdl9neWxvY2spOworCXdyaXRlX3VubG9jaygmY2VsbC0+c3ZfbG9jayk7CisKKwlfbGVhdmUoIiBba2lsbGVkXSIpOworfSAvKiBlbmQgYWZzX3B1dF9zZXJ2ZXIoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogdGltZW91dCBzZXJ2ZXIgcmVjb3JkCisgKiAtIHJlbW92ZXMgZnJvbSB0aGUgY2VsbCdzIGdyYXZleWFyZCBpZiB0aGUgdXNhZ2UgY291bnQgaXMgemVybworICovCit2b2lkIGFmc19zZXJ2ZXJfZG9fdGltZW91dChzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKQoreworCXN0cnVjdCByeHJwY19wZWVyICpwZWVyOworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbDsKKwlpbnQgbG9vcDsKKworCV9lbnRlcigiJXAiLCBzZXJ2ZXIpOworCisJY2VsbCA9IHNlcnZlci0+Y2VsbDsKKworCUJVR19PTihhdG9taWNfcmVhZCgmc2VydmVyLT51c2FnZSkgPCAwKTsKKworCS8qIHJlbW92ZSBmcm9tIGdyYXZleWFyZCBpZiBzdGlsbCBkZWFkICovCisJc3Bpbl9sb2NrKCZjZWxsLT52bF9neWxvY2spOworCWlmIChhdG9taWNfcmVhZCgmc2VydmVyLT51c2FnZSkgPT0gMCkKKwkJbGlzdF9kZWxfaW5pdCgmc2VydmVyLT5saW5rKTsKKwllbHNlCisJCXNlcnZlciA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmNlbGwtPnZsX2d5bG9jayk7CisKKwlpZiAoIXNlcnZlcikgeworCQlfbGVhdmUoIiIpOworCQlyZXR1cm47IC8qIHJlc3VycmVjdGVkICovCisJfQorCisJLyogd2UgY2FuIG5vdyBkZXN0cm95IGl0IHByb3Blcmx5ICovCisJYWZzX3B1dF9jZWxsKGNlbGwpOworCisJLyogdW5jcm9zcy1wb2ludCB0aGUgc3RydWN0cyB1bmRlciBhIGdsb2JhbCBsb2NrICovCisJc3Bpbl9sb2NrKCZhZnNfc2VydmVyX3BlZXJfbG9jayk7CisJcGVlciA9IHNlcnZlci0+cGVlcjsKKwlpZiAocGVlcikgeworCQlzZXJ2ZXItPnBlZXIgPSBOVUxMOworCQlwZWVyLT51c2VyID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2soJmFmc19zZXJ2ZXJfcGVlcl9sb2NrKTsKKworCS8qIGZpbmlzaCBjbGVhbmluZyB1cCB0aGUgc2VydmVyICovCisJZm9yIChsb29wID0gQUZTX1NFUlZFUl9DT05OX0xJU1RfU0laRSAtIDE7IGxvb3AgPj0gMDsgbG9vcC0tKQorCQlpZiAoc2VydmVyLT5mc19jb25uW2xvb3BdKQorCQkJcnhycGNfcHV0X2Nvbm5lY3Rpb24oc2VydmVyLT5mc19jb25uW2xvb3BdKTsKKworCWlmIChzZXJ2ZXItPnZsc2VydmVyKQorCQlyeHJwY19wdXRfY29ubmVjdGlvbihzZXJ2ZXItPnZsc2VydmVyKTsKKworCWtmcmVlKHNlcnZlcik7CisKKwlfbGVhdmUoIiBbZGVzdHJveWVkXSIpOworfSAvKiBlbmQgYWZzX3NlcnZlcl9kb190aW1lb3V0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGdldCBhIGNhbGxzbG90IG9uIGEgY29ubmVjdGlvbiB0byB0aGUgZmlsZXNlcnZlciBvbiB0aGUgc3BlY2lmaWVkIHNlcnZlcgorICovCitpbnQgYWZzX3NlcnZlcl9yZXF1ZXN0X2NhbGxzbG90KHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkJc3RydWN0IGFmc19zZXJ2ZXJfY2FsbHNsb3QgKmNhbGxzbG90KQoreworCXN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90ICpwY2FsbHNsb3Q7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47CisJaW50IG5jb25uLCByZXQ7CisKKwlfZW50ZXIoIiVwLCIsc2VydmVyKTsKKworCUlOSVRfTElTVF9IRUFEKCZjYWxsc2xvdC0+bGluayk7CisJY2FsbHNsb3QtPnRhc2sgPSBjdXJyZW50OworCWNhbGxzbG90LT5jb25uID0gTlVMTDsKKwljYWxsc2xvdC0+bmNvbm4gPSAtMTsKKwljYWxsc2xvdC0+cmVhZHkgPSAwOworCisJcmV0ID0gMDsKKwljb25uID0gTlVMTDsKKworCS8qIGdldCBob2xkIG9mIGEgY2FsbHNsb3QgZmlyc3QgKi8KKwlzcGluX2xvY2soJnNlcnZlci0+ZnNfbG9jayk7CisKKwkvKiByZXN1cnJlY3QgdGhlIHNlcnZlciBpZiBpdCdzIGRlYXRoIHRpbWVvdXQgaGFzIGV4cGlyZWQgKi8KKwlpZiAoc2VydmVyLT5mc19zdGF0ZSkgeworCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgc2VydmVyLT5mc19kZWFkX2ppZikpIHsKKwkJCXJldCA9IHNlcnZlci0+ZnNfc3RhdGU7CisJCQlzcGluX3VubG9jaygmc2VydmVyLT5mc19sb2NrKTsKKwkJCV9sZWF2ZSgiID0gJWQgW3N0aWxsIGRlYWRdIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlzZXJ2ZXItPmZzX3N0YXRlID0gMDsKKwl9CisKKwkvKiB0cnkgYW5kIGZpbmQgYSBjb25uZWN0aW9uIHRoYXQgaGFzIHNwYXJlIGNhbGxzbG90cyAqLworCWZvciAobmNvbm4gPSAwOyBuY29ubiA8IEFGU19TRVJWRVJfQ09OTl9MSVNUX1NJWkU7IG5jb25uKyspIHsKKwkJaWYgKHNlcnZlci0+ZnNfY29ubl9jbnRbbmNvbm5dID4gMCkgeworCQkJc2VydmVyLT5mc19jb25uX2NudFtuY29ubl0tLTsKKwkJCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOworCQkJY2FsbHNsb3QtPm5jb25uID0gbmNvbm47CisJCQlnb3RvIG9idGFpbmVkX3Nsb3Q7CisJCX0KKwl9CisKKwkvKiBub25lIHdlcmUgYXZhaWxhYmxlIC0gd2FpdCBpbnRlcnJ1cHRpYmx5IGZvciBvbmUgdG8gYmVjb21lCisJICogYXZhaWxhYmxlICovCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlsaXN0X2FkZF90YWlsKCZjYWxsc2xvdC0+bGluaywgJnNlcnZlci0+ZnNfY2FsbHEpOworCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOworCisJd2hpbGUgKCFjYWxsc2xvdC0+cmVhZHkgJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCXNjaGVkdWxlKCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJfQorCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCS8qIGV2ZW4gaWYgd2Ugd2VyZSBpbnRlcnJ1cHRlZCB3ZSBtYXkgc3RpbGwgYmUgcXVldWVkICovCisJaWYgKCFjYWxsc2xvdC0+cmVhZHkpIHsKKwkJc3Bpbl9sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOworCQlsaXN0X2RlbF9pbml0KCZjYWxsc2xvdC0+bGluayk7CisJCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOworCX0KKworCW5jb25uID0gY2FsbHNsb3QtPm5jb25uOworCisJLyogaWYgaW50ZXJydXB0ZWQsIHdlIG11c3QgcmVsZWFzZSBhbnkgc2xvdCB3ZSBhbHNvIGdvdCBiZWZvcmUKKwkgKiByZXR1cm5pbmcgYW4gZXJyb3IgKi8KKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJcmV0ID0gLUVJTlRSOworCQlnb3RvIGVycm9yX3JlbGVhc2U7CisJfQorCisJLyogaWYgd2Ugd2VyZSB3b2tlbiB1cCB3aXRoIGFuIGVycm9yLCB0aGVuIHBhc3MgdGhhdCBlcnJvciBiYWNrIHRvIHRoZQorCSAqIGNhbGxlZCAqLworCWlmIChuY29ubiA8IDApIHsKKwkJX2xlYXZlKCIgPSAlZCIsIGNhbGxzbG90LT5lcnJubyk7CisJCXJldHVybiBjYWxsc2xvdC0+ZXJybm87CisJfQorCisJLyogd2VyZSB3ZSBnaXZlbiBhIGNvbm5lY3Rpb24gZGlyZWN0bHk/ICovCisJaWYgKGNhbGxzbG90LT5jb25uKSB7CisJCS8qIHllcyAtIHVzZSBpdCAqLworCQlfbGVhdmUoIiA9IDAgKG5jPSVkKSIsIG5jb25uKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZ290IGEgY2FsbHNsb3QsIGJ1dCBubyBjb25uZWN0aW9uICovCisgb2J0YWluZWRfc2xvdDoKKworCS8qIG5lZWQgdG8gZ2V0IGhvbGQgb2YgdGhlIFJ4UlBDIGNvbm5lY3Rpb24gKi8KKwlkb3duX3dyaXRlKCZzZXJ2ZXItPnNlbSk7CisKKwkvKiBxdWljayBjaGVjayB0byBzZWUgaWYgdGhlcmUncyBhbiBvdXRzdGFuZGluZyBlcnJvciAqLworCXJldCA9IHNlcnZlci0+ZnNfc3RhdGU7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZWxlYXNlX3VwdzsKKworCWlmIChzZXJ2ZXItPmZzX2Nvbm5bbmNvbm5dKSB7CisJCS8qIHJldXNlIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24gKi8KKwkJcnhycGNfZ2V0X2Nvbm5lY3Rpb24oc2VydmVyLT5mc19jb25uW25jb25uXSk7CisJCWNhbGxzbG90LT5jb25uID0gc2VydmVyLT5mc19jb25uW25jb25uXTsKKwl9CisJZWxzZSB7CisJCS8qIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uICovCisJCXJldCA9IHJ4cnBjX2NyZWF0ZV9jb25uZWN0aW9uKGFmc190cmFuc3BvcnQsCisJCQkJCSAgICAgIGh0b25zKDcwMDApLAorCQkJCQkgICAgICBzZXJ2ZXItPmFkZHIuc19hZGRyLAorCQkJCQkgICAgICBGU19TRVJWSUNFX0lELAorCQkJCQkgICAgICBOVUxMLAorCQkJCQkgICAgICAmc2VydmVyLT5mc19jb25uW25jb25uXSk7CisKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycm9yX3JlbGVhc2VfdXB3OworCisJCWNhbGxzbG90LT5jb25uID0gc2VydmVyLT5mc19jb25uWzBdOworCQlyeHJwY19nZXRfY29ubmVjdGlvbihjYWxsc2xvdC0+Y29ubik7CisJfQorCisJdXBfd3JpdGUoJnNlcnZlci0+c2VtKTsKKworIAlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKKworCS8qIGhhbmRsZSBhbiBlcnJvciBvY2N1cnJpbmcgKi8KKyBlcnJvcl9yZWxlYXNlX3VwdzoKKwl1cF93cml0ZSgmc2VydmVyLT5zZW0pOworCisgZXJyb3JfcmVsZWFzZToKKwkvKiBlaXRoZXIgcmVsZWFzZSB0aGUgY2FsbHNsb3Qgb3IgcGFzcyBpdCBhbG9uZyB0byBhbm90aGVyIGRlc2VydmluZworCSAqIHRhc2sgKi8KKwlzcGluX2xvY2soJnNlcnZlci0+ZnNfbG9jayk7CisKKwlpZiAobmNvbm4gPCAwKSB7CisJCS8qIG5vIGNhbGxzbG90IGFsbG9jYXRlZCAqLworCX0KKwllbHNlIGlmIChsaXN0X2VtcHR5KCZzZXJ2ZXItPmZzX2NhbGxxKSkgeworCQkvKiBubyBvbmUgd2FpdGluZyAqLworCQlzZXJ2ZXItPmZzX2Nvbm5fY250W25jb25uXSsrOworCQlzcGluX3VubG9jaygmc2VydmVyLT5mc19sb2NrKTsKKwl9CisJZWxzZSB7CisJCS8qIHNvbWVvbmUncyB3YWl0aW5nIC0gZGVxdWV1ZSB0aGVtIGFuZCB3YWtlIHRoZW0gdXAgKi8KKwkJcGNhbGxzbG90ID0gbGlzdF9lbnRyeShzZXJ2ZXItPmZzX2NhbGxxLm5leHQsCisJCQkJICAgICAgIHN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90LCBsaW5rKTsKKwkJbGlzdF9kZWxfaW5pdCgmcGNhbGxzbG90LT5saW5rKTsKKworCQlwY2FsbHNsb3QtPmVycm5vID0gc2VydmVyLT5mc19zdGF0ZTsKKwkJaWYgKCFwY2FsbHNsb3QtPmVycm5vKSB7CisJCQkvKiBwYXNzIHRoZW0gb3V0IGNhbGxzbG90IGRldGFpbHMgKi8KKwkJCWNhbGxzbG90LT5jb25uID0geGNoZygmcGNhbGxzbG90LT5jb25uLAorCQkJCQkgICAgICBjYWxsc2xvdC0+Y29ubik7CisJCQlwY2FsbHNsb3QtPm5jb25uID0gbmNvbm47CisJCQljYWxsc2xvdC0+bmNvbm4gPSBuY29ubiA9IC0xOworCQl9CisJCXBjYWxsc2xvdC0+cmVhZHkgPSAxOworCQl3YWtlX3VwX3Byb2Nlc3MocGNhbGxzbG90LT50YXNrKTsKKwkJc3Bpbl91bmxvY2soJnNlcnZlci0+ZnNfbG9jayk7CisJfQorCisJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY2FsbHNsb3QtPmNvbm4pOworCWNhbGxzbG90LT5jb25uID0gTlVMTDsKKworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7CisKK30gLyogZW5kIGFmc19zZXJ2ZXJfcmVxdWVzdF9jYWxsc2xvdCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiByZWxlYXNlIGEgY2FsbHNsb3QgYmFjayB0byB0aGUgc2VydmVyCisgKiAtIHRyYW5zZmVycyB0aGUgUnhSUEMgY29ubmVjdGlvbiB0byB0aGUgbmV4dCBwZW5kaW5nIGNhbGxzbG90IGlmIHBvc3NpYmxlCisgKi8KK3ZvaWQgYWZzX3NlcnZlcl9yZWxlYXNlX2NhbGxzbG90KHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkJIHN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90ICpjYWxsc2xvdCkKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlcl9jYWxsc2xvdCAqcGNhbGxzbG90OworCisJX2VudGVyKCJ7YWQ9JTA4eCxjbnQ9JXV9LHslZH0iLAorCSAgICAgICBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSwKKwkgICAgICAgc2VydmVyLT5mc19jb25uX2NudFtjYWxsc2xvdC0+bmNvbm5dLAorCSAgICAgICBjYWxsc2xvdC0+bmNvbm4pOworCisJQlVHX09OKGNhbGxzbG90LT5uY29ubiA8IDApOworCisJc3Bpbl9sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOworCisJaWYgKGxpc3RfZW1wdHkoJnNlcnZlci0+ZnNfY2FsbHEpKSB7CisJCS8qIG5vIG9uZSB3YWl0aW5nICovCisJCXNlcnZlci0+ZnNfY29ubl9jbnRbY2FsbHNsb3QtPm5jb25uXSsrOworCQlzcGluX3VubG9jaygmc2VydmVyLT5mc19sb2NrKTsKKwl9CisJZWxzZSB7CisJCS8qIHNvbWVvbmUncyB3YWl0aW5nIC0gZGVxdWV1ZSB0aGVtIGFuZCB3YWtlIHRoZW0gdXAgKi8KKwkJcGNhbGxzbG90ID0gbGlzdF9lbnRyeShzZXJ2ZXItPmZzX2NhbGxxLm5leHQsCisJCQkJICAgICAgIHN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90LCBsaW5rKTsKKwkJbGlzdF9kZWxfaW5pdCgmcGNhbGxzbG90LT5saW5rKTsKKworCQlwY2FsbHNsb3QtPmVycm5vID0gc2VydmVyLT5mc19zdGF0ZTsKKwkJaWYgKCFwY2FsbHNsb3QtPmVycm5vKSB7CisJCQkvKiBwYXNzIHRoZW0gb3V0IGNhbGxzbG90IGRldGFpbHMgKi8KKwkJCWNhbGxzbG90LT5jb25uID0geGNoZygmcGNhbGxzbG90LT5jb25uLCBjYWxsc2xvdC0+Y29ubik7CisJCQlwY2FsbHNsb3QtPm5jb25uID0gY2FsbHNsb3QtPm5jb25uOworCQkJY2FsbHNsb3QtPm5jb25uID0gLTE7CisJCX0KKworCQlwY2FsbHNsb3QtPnJlYWR5ID0gMTsKKwkJd2FrZV91cF9wcm9jZXNzKHBjYWxsc2xvdC0+dGFzayk7CisJCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOworCX0KKworCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNhbGxzbG90LT5jb25uKTsKKworCV9sZWF2ZSgiIik7Cit9IC8qIGVuZCBhZnNfc2VydmVyX3JlbGVhc2VfY2FsbHNsb3QoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZ2V0IGEgaGFuZGxlIHRvIGEgY29ubmVjdGlvbiB0byB0aGUgdmxzZXJ2ZXIgKHZvbHVtZSBsb2NhdGlvbikgb24gdGhlCisgKiBzcGVjaWZpZWQgc2VydmVyCisgKi8KK2ludCBhZnNfc2VydmVyX2dldF92bGNvbm4oc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCSAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKipfY29ubikKK3sKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKKwlpbnQgcmV0OworCisJX2VudGVyKCIlcCwiLCBzZXJ2ZXIpOworCisJcmV0ID0gMDsKKwljb25uID0gTlVMTDsKKwlkb3duX3JlYWQoJnNlcnZlci0+c2VtKTsKKworCWlmIChzZXJ2ZXItPnZsc2VydmVyKSB7CisJCS8qIHJldXNlIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24gKi8KKwkJcnhycGNfZ2V0X2Nvbm5lY3Rpb24oc2VydmVyLT52bHNlcnZlcik7CisJCWNvbm4gPSBzZXJ2ZXItPnZsc2VydmVyOworCQl1cF9yZWFkKCZzZXJ2ZXItPnNlbSk7CisJfQorCWVsc2UgeworCQkvKiBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiAqLworCQl1cF9yZWFkKCZzZXJ2ZXItPnNlbSk7CisJCWRvd25fd3JpdGUoJnNlcnZlci0+c2VtKTsKKwkJaWYgKCFzZXJ2ZXItPnZsc2VydmVyKSB7CisJCQlyZXQgPSByeHJwY19jcmVhdGVfY29ubmVjdGlvbihhZnNfdHJhbnNwb3J0LAorCQkJCQkJICAgICAgaHRvbnMoNzAwMyksCisJCQkJCQkgICAgICBzZXJ2ZXItPmFkZHIuc19hZGRyLAorCQkJCQkJICAgICAgVkxfU0VSVklDRV9JRCwKKwkJCQkJCSAgICAgIE5VTEwsCisJCQkJCQkgICAgICAmc2VydmVyLT52bHNlcnZlcik7CisJCX0KKwkJaWYgKHJldCA9PSAwKSB7CisJCQlyeHJwY19nZXRfY29ubmVjdGlvbihzZXJ2ZXItPnZsc2VydmVyKTsKKwkJCWNvbm4gPSBzZXJ2ZXItPnZsc2VydmVyOworCQl9CisJCXVwX3dyaXRlKCZzZXJ2ZXItPnNlbSk7CisJfQorCisJKl9jb25uID0gY29ubjsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgYWZzX3NlcnZlcl9nZXRfdmxjb25uKCkgKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9zZXJ2ZXIuaCBiL2ZzL2Fmcy9zZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2QyNDExCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL3NlcnZlci5oCkBAIC0wLDAgKzEsMTAyIEBACisvKiBzZXJ2ZXIuaDogQUZTIHNlcnZlciByZWNvcmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfQUZTX1NFUlZFUl9ICisjZGVmaW5lIF9MSU5VWF9BRlNfU0VSVkVSX0gKKworI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAia2Fmc3RpbW9kLmgiCisjaW5jbHVkZSA8cnhycGMvcGVlci5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisKK2V4dGVybiBzcGlubG9ja190IGFmc19zZXJ2ZXJfcGVlcl9sb2NrOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQUZTIHNlcnZlciByZWNvcmQKKyAqLworc3RydWN0IGFmc19zZXJ2ZXIKK3sKKwlhdG9taWNfdAkJdXNhZ2U7CisJc3RydWN0IGFmc19jZWxsCQkqY2VsbDsJCS8qIGNlbGwgaW4gd2hpY2ggc2VydmVyIHJlc2lkZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBsaW5rIGluIGNlbGwncyBzZXJ2ZXIgbGlzdCAqLworCXN0cnVjdCByd19zZW1hcGhvcmUJc2VtOwkJLyogYWNjZXNzIGxvY2sgKi8KKwlzdHJ1Y3QgYWZzX3RpbWVyCXRpbWVvdXQ7CS8qIGdyYXZleWFyZCB0aW1lb3V0ICovCisJc3RydWN0IGluX2FkZHIJCWFkZHI7CQkvKiBzZXJ2ZXIgYWRkcmVzcyAqLworCXN0cnVjdCByeHJwY19wZWVyCSpwZWVyOwkJLyogcGVlciByZWNvcmQgZm9yIHRoaXMgc2VydmVyICovCisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24JKnZsc2VydmVyOwkvKiBjb25uZWN0aW9uIHRvIHRoZSB2b2x1bWUgbG9jYXRpb24gc2VydmljZSAqLworCisJLyogZmlsZSBzZXJ2aWNlIGFjY2VzcyAqLworI2RlZmluZSBBRlNfU0VSVkVSX0NPTk5fTElTVF9TSVpFIDIKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbgkqZnNfY29ubltBRlNfU0VSVkVSX0NPTk5fTElTVF9TSVpFXTsgLyogRlMgY29ubmVjdGlvbnMgKi8KKwl1bnNpZ25lZAkJZnNfY29ubl9jbnRbQUZTX1NFUlZFUl9DT05OX0xJU1RfU0laRV07CS8qIHBlciBjb25uIGNhbGwgY291bnQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWZzX2NhbGxxOwkvKiBxdWV1ZSBvZiBwcm9jZXNzZXMgd2FpdGluZyB0byBtYWtlIGEgY2FsbCAqLworCXNwaW5sb2NrX3QJCWZzX2xvY2s7CS8qIGFjY2VzcyBsb2NrICovCisJaW50CQkJZnNfc3RhdGU7ICAgICAgCS8qIDAgb3IgcmVhc29uIEZTIGN1cnJlbnRseSBtYXJrZWQgZGVhZCAoLWVycm5vKSAqLworCXVuc2lnbmVkCQlmc19ydHQ7CQkvKiBGUyByb3VuZCB0cmlwIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nCQlmc19hY3RfamlmOwkvKiB0aW1lIGF0IHdoaWNoIGxhc3QgYWN0aXZpdHkgb2NjdXJyZWQgKi8KKwl1bnNpZ25lZCBsb25nCQlmc19kZWFkX2ppZjsJLyogdGltZSBhdCB3aGljaCBubyBsb25nZXIgdG8gYmUgY29uc2lkZXJlZCBkZWFkICovCisKKwkvKiBjYWxsYmFjayBwcm9taXNlIG1hbmFnZW1lbnQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWNiX3Byb21pc2VzOwkvKiBhcyB5ZXQgdW5icm9rZW4gcHJvbWlzZXMgZnJvbSB0aGlzIHNlcnZlciAqLworCXNwaW5sb2NrX3QJCWNiX2xvY2s7CS8qIGFjY2VzcyBsb2NrICovCit9OworCitleHRlcm4gaW50IGFmc19zZXJ2ZXJfbG9va3VwKHN0cnVjdCBhZnNfY2VsbCAqY2VsbCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgKmFkZHIsCisJCQkgICAgIHN0cnVjdCBhZnNfc2VydmVyICoqX3NlcnZlcik7CisKKyNkZWZpbmUgYWZzX2dldF9zZXJ2ZXIoUykgZG8geyBhdG9taWNfaW5jKCYoUyktPnVzYWdlKTsgfSB3aGlsZSgwKQorCitleHRlcm4gdm9pZCBhZnNfcHV0X3NlcnZlcihzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKTsKK2V4dGVybiB2b2lkIGFmc19zZXJ2ZXJfZG9fdGltZW91dChzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKTsKKworZXh0ZXJuIGludCBhZnNfc2VydmVyX2ZpbmRfYnlfcGVlcihjb25zdCBzdHJ1Y3QgcnhycGNfcGVlciAqcGVlciwKKwkJCQkgICBzdHJ1Y3QgYWZzX3NlcnZlciAqKl9zZXJ2ZXIpOworCitleHRlcm4gaW50IGFmc19zZXJ2ZXJfZ2V0X3ZsY29ubihzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkJCSBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqKl9jb25uKTsKKworc3RhdGljIGlubGluZQorc3RydWN0IGFmc19zZXJ2ZXIgKmFmc19zZXJ2ZXJfZ2V0X2Zyb21fcGVlcihzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcikKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCisJc3Bpbl9sb2NrKCZhZnNfc2VydmVyX3BlZXJfbG9jayk7CisJc2VydmVyID0gcGVlci0+dXNlcjsKKwlpZiAoc2VydmVyKQorCQlhZnNfZ2V0X3NlcnZlcihzZXJ2ZXIpOworCXNwaW5fdW5sb2NrKCZhZnNfc2VydmVyX3BlZXJfbG9jayk7CisKKwlyZXR1cm4gc2VydmVyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQUZTIHNlcnZlciBjYWxsc2xvdCBncmFudCByZWNvcmQKKyAqLworc3RydWN0IGFmc19zZXJ2ZXJfY2FsbHNsb3QKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBsaW5rIGluIHNlcnZlcidzIGxpc3QgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRhc2s7CQkvKiBwcm9jZXNzIHdhaXRpbmcgdG8gbWFrZSBjYWxsICovCisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24JKmNvbm47CQkvKiBjb25uZWN0aW9uIHRvIHVzZSAob3IgTlVMTCBvbiBlcnJvcikgKi8KKwlzaG9ydAkJCW5jb25uOwkJLyogY29ubmVjdGlvbiBzbG90IG51bWJlciAoLTEgb24gZXJyb3IpICovCisJY2hhcgkJCXJlYWR5OwkJLyogVCB3aGVuIHJlYWR5ICovCisJaW50CQkJZXJybm87CQkvKiBlcnJvciBudW1iZXIgaWYgbmNvbm49PS0xICovCit9OworCitleHRlcm4gaW50IGFmc19zZXJ2ZXJfcmVxdWVzdF9jYWxsc2xvdChzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkJCSAgICAgICBzdHJ1Y3QgYWZzX3NlcnZlcl9jYWxsc2xvdCAqY2FsbHNsb3QpOworCitleHRlcm4gdm9pZCBhZnNfc2VydmVyX3JlbGVhc2VfY2FsbHNsb3Qoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCQkJc3RydWN0IGFmc19zZXJ2ZXJfY2FsbHNsb3QgKmNhbGxzbG90KTsKKworI2VuZGlmIC8qIF9MSU5VWF9BRlNfU0VSVkVSX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9zdXBlci5jIGIvZnMvYWZzL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZmYThlNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9zdXBlci5jCkBAIC0wLDAgKzEsNDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIEF1dGhvcnM6IERhdmlkIEhvd2VsbHMgPGRob3dlbGxzQHJlZGhhdC5jb20+CisgKiAgICAgICAgICBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGNhbWJyaWRnZS5yZWRoYXQuY29tPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlICJ2bm9kZS5oIgorI2luY2x1ZGUgInZvbHVtZS5oIgorI2luY2x1ZGUgImNlbGwuaCIKKyNpbmNsdWRlICJjbXNlcnZpY2UuaCIKKyNpbmNsdWRlICJmc2NsaWVudC5oIgorI2luY2x1ZGUgInN1cGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBBRlNfRlNfTUFHSUMgMHg2QjQxNDY1MyAvKiAna0FGUycgKi8KKworc3RydWN0IGFmc19tb3VudF9wYXJhbXMgeworCWludAkJCXJ3cGF0aDsKKwlzdHJ1Y3QgYWZzX2NlbGwJCSpkZWZhdWx0X2NlbGw7CisJc3RydWN0IGFmc192b2x1bWUJKnZvbHVtZTsKK307CisKK3N0YXRpYyB2b2lkIGFmc19pX2luaXRfb25jZSh2b2lkICpmb28sIGttZW1fY2FjaGVfdCAqY2FjaGVwLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICphZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkJCSAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJICAgICAgdm9pZCAqZGF0YSk7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmFmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKworc3RhdGljIHZvaWQgYWZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKworc3RhdGljIHZvaWQgYWZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBhZnNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImFmcyIsCisJLmdldF9zYgkJPSBhZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9hbm9uX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX0JJTkFSWV9NT1VOVERBVEEsCit9OworCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgYWZzX3N1cGVyX29wcyA9IHsKKwkuc3RhdGZzCQk9IHNpbXBsZV9zdGF0ZnMsCisJLmFsbG9jX2lub2RlCT0gYWZzX2FsbG9jX2lub2RlLAorCS5kcm9wX2lub2RlCT0gZ2VuZXJpY19kZWxldGVfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSBhZnNfZGVzdHJveV9pbm9kZSwKKwkuY2xlYXJfaW5vZGUJPSBhZnNfY2xlYXJfaW5vZGUsCisJLnB1dF9zdXBlcgk9IGFmc19wdXRfc3VwZXIsCit9OworCitzdGF0aWMga21lbV9jYWNoZV90ICphZnNfaW5vZGVfY2FjaGVwOworc3RhdGljIGF0b21pY190IGFmc19jb3VudF9hY3RpdmVfaW5vZGVzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaW5pdGlhbGlzZSB0aGUgZmlsZXN5c3RlbQorICovCitpbnQgX19pbml0IGFmc19mc19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCV9lbnRlcigiIik7CisKKwlhZnNfdGltZXJfaW5pdCgmYWZzX21udHB0X2V4cGlyeV90aW1lciwgJmFmc19tbnRwdF9leHBpcnlfdGltZXJfb3BzKTsKKworCS8qIGNyZWF0ZSBvdXJzZWx2ZXMgYW4gaW5vZGUgY2FjaGUgKi8KKwlhdG9taWNfc2V0KCZhZnNfY291bnRfYWN0aXZlX2lub2RlcywgMCk7CisKKwlyZXQgPSAtRU5PTUVNOworCWFmc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiYWZzX2lub2RlX2NhY2hlIiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IGFmc192bm9kZSksCisJCQkJCSAgICAgMCwKKwkJCQkJICAgICBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJCSAgICAgYWZzX2lfaW5pdF9vbmNlLAorCQkJCQkgICAgIE5VTEwpOworCWlmICghYWZzX2lub2RlX2NhY2hlcCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImtBRlM6IEZhaWxlZCB0byBhbGxvY2F0ZSBpbm9kZSBjYWNoZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogbm93IGV4cG9ydCBvdXIgZmlsZXN5c3RlbSB0byBsZXNzZXIgbW9ydGFscyAqLworCXJldCA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmFmc19mc190eXBlKTsKKwlpZiAocmV0IDwgMCkgeworCQlrbWVtX2NhY2hlX2Rlc3Ryb3koYWZzX2lub2RlX2NhY2hlcCk7CisJCWtsZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWtsZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworfSAvKiBlbmQgYWZzX2ZzX2luaXQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY2xlYW4gdXAgdGhlIGZpbGVzeXN0ZW0KKyAqLwordm9pZCBfX2V4aXQgYWZzX2ZzX2V4aXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmFmc19mc190eXBlKTsKKworCWlmIChhdG9taWNfcmVhZCgmYWZzX2NvdW50X2FjdGl2ZV9pbm9kZXMpICE9IDApIHsKKwkJcHJpbnRrKCJrQUZTOiAlZCBhY3RpdmUgaW5vZGUgb2JqZWN0cyBzdGlsbCBwcmVzZW50XG4iLAorCQkgICAgICAgYXRvbWljX3JlYWQoJmFmc19jb3VudF9hY3RpdmVfaW5vZGVzKSk7CisJCUJVRygpOworCX0KKworCWttZW1fY2FjaGVfZGVzdHJveShhZnNfaW5vZGVfY2FjaGVwKTsKKworfSAvKiBlbmQgYWZzX2ZzX2V4aXQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY2hlY2sgdGhhdCBhbiBhcmd1bWVudCBoYXMgYSB2YWx1ZQorICovCitzdGF0aWMgaW50IHdhbnRfYXJnKGNoYXIgKipfdmFsdWUsIGNvbnN0IGNoYXIgKm9wdGlvbikKK3sKKwlpZiAoIV92YWx1ZSB8fCAhKl92YWx1ZSB8fCAhKipfdmFsdWUpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJrQUZTOiAlczogYXJndW1lbnQgbWlzc2luZ1xuIiwgb3B0aW9uKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfSAvKiBlbmQgd2FudF9hcmcoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY2hlY2sgdGhhdCB0aGVyZSdzIG5vIHN1YnNlcXVlbnQgdmFsdWUKKyAqLworc3RhdGljIGludCB3YW50X25vX3ZhbHVlKGNoYXIgKmNvbnN0ICpfdmFsdWUsIGNvbnN0IGNoYXIgKm9wdGlvbikKK3sKKwlpZiAoKl92YWx1ZSAmJiAqKl92YWx1ZSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImtBRlM6ICVzOiBJbnZhbGlkIGFyZ3VtZW50OiAlc1xuIiwKKwkJICAgICAgIG9wdGlvbiwgKl92YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30gLyogZW5kIHdhbnRfbm9fdmFsdWUoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogcGFyc2UgdGhlIG1vdW50IG9wdGlvbnMKKyAqIC0gdGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBzaGFtZWxlc3NseSBhZGFwdGVkIGZyb20gdGhlIGV4dDMgZnMgd2hpY2gKKyAqICAgc2hhbWVsZXNzbHkgYWRhcHRlZCBpdCBmcm9tIHRoZSBtc2RvcyBmcworICovCitzdGF0aWMgaW50IGFmc19zdXBlcl9wYXJzZV9vcHRpb25zKHN0cnVjdCBhZnNfbW91bnRfcGFyYW1zICpwYXJhbXMsCisJCQkJICAgY2hhciAqb3B0aW9ucywKKwkJCQkgICBjb25zdCBjaGFyICoqZGV2bmFtZSkKK3sKKwljaGFyICprZXksICp2YWx1ZTsKKwlpbnQgcmV0OworCisJX2VudGVyKCIlcyIsIG9wdGlvbnMpOworCisJb3B0aW9uc1tQQUdFX1NJWkUgLSAxXSA9IDA7CisKKwlyZXQgPSAwOworCXdoaWxlICgoa2V5ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSAwKQorCXsKKwkJdmFsdWUgPSBzdHJjaHIoa2V5LCAnPScpOworCQlpZiAodmFsdWUpCisJCQkqdmFsdWUrKyA9IDA7CisKKwkJcHJpbnRrKCJrQUZTOiBLRVk6ICVzLCBWQUw6JXNcbiIsIGtleSwgdmFsdWUgPzogIi0iKTsKKworCQlpZiAoc3RyY21wKGtleSwgInJ3cGF0aCIpID09IDApIHsKKwkJCWlmICghd2FudF9ub192YWx1ZSgmdmFsdWUsICJyd3BhdGgiKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXBhcmFtcy0+cndwYXRoID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgaWYgKHN0cmNtcChrZXksICJ2b2wiKSA9PSAwKSB7CisJCQlpZiAoIXdhbnRfYXJnKCZ2YWx1ZSwgInZvbCIpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJKmRldm5hbWUgPSB2YWx1ZTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgaWYgKHN0cmNtcChrZXksICJjZWxsIikgPT0gMCkgeworCQkJaWYgKCF3YW50X2FyZygmdmFsdWUsICJjZWxsIikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlhZnNfcHV0X2NlbGwocGFyYW1zLT5kZWZhdWx0X2NlbGwpOworCQkJcmV0ID0gYWZzX2NlbGxfbG9va3VwKHZhbHVlLAorCQkJCQkgICAgICBzdHJsZW4odmFsdWUpLAorCQkJCQkgICAgICAmcGFyYW1zLT5kZWZhdWx0X2NlbGwpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQljb250aW51ZTsKKwkJfQorCisJCXByaW50aygia0FGUzogVW5rbm93biBtb3VudCBvcHRpb246ICclcydcbiIsICBrZXkpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCXJldCA9IDA7CisKKyBlcnJvcjoKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgYWZzX3N1cGVyX3BhcnNlX29wdGlvbnMoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY2hlY2sgYSBzdXBlcmJsb2NrIHRvIHNlZSBpZiBpdCdzIHRoZSBvbmUgd2UncmUgbG9va2luZyBmb3IKKyAqLworc3RhdGljIGludCBhZnNfdGVzdF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhZnNfbW91bnRfcGFyYW1zICpwYXJhbXMgPSBkYXRhOworCXN0cnVjdCBhZnNfc3VwZXJfaW5mbyAqYXMgPSBzYi0+c19mc19pbmZvOworCisJcmV0dXJuIGFzLT52b2x1bWUgPT0gcGFyYW1zLT52b2x1bWU7Cit9IC8qIGVuZCBhZnNfdGVzdF9zdXBlcigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBmaWxsIGluIHRoZSBzdXBlcmJsb2NrCisgKi8KK3N0YXRpYyBpbnQgYWZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgYWZzX21vdW50X3BhcmFtcyAqcGFyYW1zID0gZGF0YTsKKwlzdHJ1Y3QgYWZzX3N1cGVyX2luZm8gKmFzID0gTlVMTDsKKwlzdHJ1Y3QgYWZzX2ZpZCBmaWQ7CisJc3RydWN0IGRlbnRyeSAqcm9vdCA9IE5VTEw7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJaW50IHJldDsKKworCWtlbnRlcigiIik7CisKKwkvKiBhbGxvY2F0ZSBhIHN1cGVyYmxvY2sgaW5mbyByZWNvcmQgKi8KKwlhcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfc3VwZXJfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghYXMpIHsKKwkJX2xlYXZlKCIgPSAtRU5PTUVNIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChhcywgMCwgc2l6ZW9mKHN0cnVjdCBhZnNfc3VwZXJfaW5mbykpOworCisJYWZzX2dldF92b2x1bWUocGFyYW1zLT52b2x1bWUpOworCWFzLT52b2x1bWUgPSBwYXJhbXMtPnZvbHVtZTsKKworCS8qIGZpbGwgaW4gdGhlIHN1cGVyYmxvY2sgKi8KKwlzYi0+c19ibG9ja3NpemUJCT0gUEFHRV9DQUNIRV9TSVpFOworCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzCT0gUEFHRV9DQUNIRV9TSElGVDsKKwlzYi0+c19tYWdpYwkJPSBBRlNfRlNfTUFHSUM7CisJc2ItPnNfb3AJCT0gJmFmc19zdXBlcl9vcHM7CisJc2ItPnNfZnNfaW5mbwkJPSBhczsKKworCS8qIGFsbG9jYXRlIHRoZSByb290IGlub2RlIGFuZCBkZW50cnkgKi8KKwlmaWQudmlkCQk9IGFzLT52b2x1bWUtPnZpZDsKKwlmaWQudm5vZGUJPSAxOworCWZpZC51bmlxdWUJPSAxOworCXJldCA9IGFmc19pZ2V0KHNiLCAmZmlkLCAmaW5vZGUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gLUVOT01FTTsKKwlyb290ID0gZF9hbGxvY19yb290KGlub2RlKTsKKwlpZiAoIXJvb3QpCisJCWdvdG8gZXJyb3I7CisKKwlzYi0+c19yb290ID0gcm9vdDsKKworCWtsZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworCisgZXJyb3I6CisJaXB1dChpbm9kZSk7CisJYWZzX3B1dF92b2x1bWUoYXMtPnZvbHVtZSk7CisJa2ZyZWUoYXMpOworCisJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CisKKwlrbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgYWZzX2ZpbGxfc3VwZXIoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZ2V0IGFuIEFGUyBzdXBlcmJsb2NrCisgKiAtIFRPRE86IGRvbid0IHVzZSBnZXRfc2Jfbm9kZXYoKSwgYnV0IHJhdGhlciBjYWxsIHNnZXQoKSBkaXJlY3RseQorICovCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICphZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkJCSAgICAgIGludCBmbGFncywKKwkJCQkgICAgICBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCQkgICAgICB2b2lkICpvcHRpb25zKQoreworCXN0cnVjdCBhZnNfbW91bnRfcGFyYW1zIHBhcmFtczsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCWludCByZXQ7CisKKwlfZW50ZXIoIiwsJXMsJXAiLCBkZXZfbmFtZSwgb3B0aW9ucyk7CisKKwltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOworCisJLyogc3RhcnQgdGhlIGNhY2hlIG1hbmFnZXIgKi8KKwlyZXQgPSBhZnNjbV9zdGFydCgpOworCWlmIChyZXQgPCAwKSB7CisJCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCS8qIHBhcnNlIHRoZSBvcHRpb25zICovCisJaWYgKG9wdGlvbnMpIHsKKwkJcmV0ID0gYWZzX3N1cGVyX3BhcnNlX29wdGlvbnMoJnBhcmFtcywgb3B0aW9ucywgJmRldl9uYW1lKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycm9yOworCQlpZiAoIWRldl9uYW1lKSB7CisJCQlwcmludGsoImtBRlM6IG5vIHZvbHVtZSBuYW1lIHNwZWNpZmllZFxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCS8qIHBhcnNlIHRoZSBkZXZpY2UgbmFtZSAqLworCXJldCA9IGFmc192b2x1bWVfbG9va3VwKGRldl9uYW1lLAorCQkJCXBhcmFtcy5kZWZhdWx0X2NlbGwsCisJCQkJcGFyYW1zLnJ3cGF0aCwKKwkJCQkmcGFyYW1zLnZvbHVtZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBhbGxvY2F0ZSBhIGRldmljZWxlc3Mgc3VwZXJibG9jayAqLworCXNiID0gc2dldChmc190eXBlLCBhZnNfdGVzdF9zdXBlciwgc2V0X2Fub25fc3VwZXIsICZwYXJhbXMpOworCWlmIChJU19FUlIoc2IpKQorCQlnb3RvIGVycm9yOworCisJc2ItPnNfZmxhZ3MgPSBmbGFnczsKKworCXJldCA9IGFmc19maWxsX3N1cGVyKHNiLCAmcGFyYW1zLCBmbGFncyAmIE1TX1ZFUkJPU0UgPyAxIDogMCk7CisJaWYgKHJldCA8IDApIHsKKwkJdXBfd3JpdGUoJnNiLT5zX3Vtb3VudCk7CisJCWRlYWN0aXZhdGVfc3VwZXIoc2IpOworCQlnb3RvIGVycm9yOworCX0KKwlzYi0+c19mbGFncyB8PSBNU19BQ1RJVkU7CisKKwlhZnNfcHV0X3ZvbHVtZShwYXJhbXMudm9sdW1lKTsKKwlhZnNfcHV0X2NlbGwocGFyYW1zLmRlZmF1bHRfY2VsbCk7CisJX2xlYXZlKCIgPSAlcCIsIHNiKTsKKwlyZXR1cm4gc2I7CisKKyBlcnJvcjoKKwlhZnNfcHV0X3ZvbHVtZShwYXJhbXMudm9sdW1lKTsKKwlhZnNfcHV0X2NlbGwocGFyYW1zLmRlZmF1bHRfY2VsbCk7CisJYWZzY21fc3RvcCgpOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9IC8qIGVuZCBhZnNfZ2V0X3NiKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGZpbmlzaCB0aGUgdW5tb3VudGluZyBwcm9jZXNzIG9uIHRoZSBzdXBlcmJsb2NrCisgKi8KK3N0YXRpYyB2b2lkIGFmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgYWZzX3N1cGVyX2luZm8gKmFzID0gc2ItPnNfZnNfaW5mbzsKKworCV9lbnRlcigiIik7CisKKwlhZnNfcHV0X3ZvbHVtZShhcy0+dm9sdW1lKTsKKwlhZnNjbV9zdG9wKCk7CisKKwlfbGVhdmUoIiIpOworfSAvKiBlbmQgYWZzX3B1dF9zdXBlcigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBpbml0aWFsaXNlIGFuIGlub2RlIGNhY2hlIHNsYWIgZWxlbWVudCBwcmlvciB0byBhbnkgdXNlCisgKi8KK3N0YXRpYyB2b2lkIGFmc19pX2luaXRfb25jZSh2b2lkICpfdm5vZGUsIGttZW1fY2FjaGVfdCAqY2FjaGVwLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSAoc3RydWN0IGFmc192bm9kZSAqKSBfdm5vZGU7CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKSB7CisJCW1lbXNldCh2bm9kZSwgMCwgc2l6ZW9mKCp2bm9kZSkpOworCQlpbm9kZV9pbml0X29uY2UoJnZub2RlLT52ZnNfaW5vZGUpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2bm9kZS0+dXBkYXRlX3dhaXRxKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnZub2RlLT5sb2NrKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnZub2RlLT5jYl9saW5rKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnZub2RlLT5jYl9oYXNoX2xpbmspOworCQlhZnNfdGltZXJfaW5pdCgmdm5vZGUtPmNiX3RpbWVvdXQsCisJCQkgICAgICAgJmFmc192bm9kZV9jYl90aW1lZF9vdXRfb3BzKTsKKwl9CisKK30gLyogZW5kIGFmc19pX2luaXRfb25jZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBhbGxvY2F0ZSBhbiBBRlMgaW5vZGUgc3RydWN0IGZyb20gb3VyIHNsYWIgY2FjaGUKKyAqLworc3RhdGljIHN0cnVjdCBpbm9kZSAqYWZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGU7CisKKwl2bm9kZSA9IChzdHJ1Y3QgYWZzX3Zub2RlICopCisJCWttZW1fY2FjaGVfYWxsb2MoYWZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghdm5vZGUpCisJCXJldHVybiBOVUxMOworCisJYXRvbWljX2luYygmYWZzX2NvdW50X2FjdGl2ZV9pbm9kZXMpOworCisJbWVtc2V0KCZ2bm9kZS0+ZmlkLCAwLCBzaXplb2Yodm5vZGUtPmZpZCkpOworCW1lbXNldCgmdm5vZGUtPnN0YXR1cywgMCwgc2l6ZW9mKHZub2RlLT5zdGF0dXMpKTsKKworCXZub2RlLT52b2x1bWUJCT0gTlVMTDsKKwl2bm9kZS0+dXBkYXRlX2NudAk9IDA7CisJdm5vZGUtPmZsYWdzCQk9IDA7CisKKwlyZXR1cm4gJnZub2RlLT52ZnNfaW5vZGU7Cit9IC8qIGVuZCBhZnNfYWxsb2NfaW5vZGUoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZGVzdHJveSBhbiBBRlMgaW5vZGUgc3RydWN0CisgKi8KK3N0YXRpYyB2b2lkIGFmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJX2VudGVyKCJ7JWx1fSIsIGlub2RlLT5pX2lubyk7CisKKwlrbWVtX2NhY2hlX2ZyZWUoYWZzX2lub2RlX2NhY2hlcCwgQUZTX0ZTX0koaW5vZGUpKTsKKworCWF0b21pY19kZWMoJmFmc19jb3VudF9hY3RpdmVfaW5vZGVzKTsKKworfSAvKiBlbmQgYWZzX2Rlc3Ryb3lfaW5vZGUoKSAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3N1cGVyLmggYi9mcy9hZnMvc3VwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzExMzYyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL3N1cGVyLmgKQEAgLTAsMCArMSw0MyBAQAorLyogc3VwZXIuaDogQUZTIGZpbGVzeXN0ZW0gaW50ZXJuYWwgcHJpdmF0ZSBkYXRhCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIEF1dGhvcnM6IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAY2FtYnJpZGdlLnJlZGhhdC5jb20+CisgKiAgICAgICAgICBEYXZpZCBIb3dlbGxzIDxkaG93ZWxsc0ByZWRoYXQuY29tPgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9BRlNfU1VQRVJfSAorI2RlZmluZSBfTElOVVhfQUZTX1NVUEVSX0gKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSAic2VydmVyLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBBRlMgc3VwZXJibG9jayBwcml2YXRlIGRhdGEKKyAqIC0gdGhlcmUncyBvbmUgc3VwZXJibG9jayBwZXIgdm9sdW1lCisgKi8KK3N0cnVjdCBhZnNfc3VwZXJfaW5mbworeworCXN0cnVjdCBhZnNfdm9sdW1lCSp2b2x1bWU7CS8qIHZvbHVtZSByZWNvcmQgKi8KKwljaGFyCQkJcndwYXJlbnQ7CS8qIFQgaWYgcGFyZW50IGlzIFIvVyBBRlMgdm9sdW1lICovCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhZnNfc3VwZXJfaW5mbyAqQUZTX0ZTX1Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gc2ItPnNfZnNfaW5mbzsKK30KKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmIC8qIF9MSU5VWF9BRlNfU1VQRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3RyYW5zcG9ydC5oIGIvZnMvYWZzL3RyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMTNhZTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvdHJhbnNwb3J0LmgKQEAgLTAsMCArMSwyMSBAQAorLyogdHJhbnNwb3J0Lmg6IEFGUyB0cmFuc3BvcnQgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9BRlNfVFJBTlNQT1JUX0gKKyNkZWZpbmUgX0xJTlVYX0FGU19UUkFOU1BPUlRfSAorCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlIDxyeHJwYy90cmFuc3BvcnQuaD4KKworLyogdGhlIGNhY2hlIG1hbmFnZXIgdHJhbnNwb3J0IGVuZHBvaW50ICovCitleHRlcm4gc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqYWZzX3RyYW5zcG9ydDsKKworI2VuZGlmIC8qIF9MSU5VWF9BRlNfVFJBTlNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy90eXBlcy5oIGIvZnMvYWZzL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhMjM2NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy90eXBlcy5oCkBAIC0wLDAgKzEsMTI1IEBACisvKiB0eXBlcy5oOiBBRlMgdHlwZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfQUZTX1RZUEVTX0gKKyNkZWZpbmUgX0xJTlVYX0FGU19UWVBFU19ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8cnhycGMvdHlwZXMuaD4KKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKK3R5cGVkZWYgdW5zaWduZWQJCQlhZnNfdm9saWRfdDsKK3R5cGVkZWYgdW5zaWduZWQJCQlhZnNfdm5vZGVpZF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJCWFmc19kYXRhdmVyc2lvbl90OworCit0eXBlZGVmIGVudW0geworCUFGU1ZMX1JXVk9MLAkJCS8qIHJlYWQvd3JpdGUgdm9sdW1lICovCisJQUZTVkxfUk9WT0wsCQkJLyogcmVhZC1vbmx5IHZvbHVtZSAqLworCUFGU1ZMX0JBQ0tWT0wsCQkJLyogYmFja3VwIHZvbHVtZSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhZnNfdm9sdHlwZV90OworCit0eXBlZGVmIGVudW0geworCUFGU19GVFlQRV9JTlZBTElECT0gMCwKKwlBRlNfRlRZUEVfRklMRQkJPSAxLAorCUFGU19GVFlQRV9ESVIJCT0gMiwKKwlBRlNfRlRZUEVfU1lNTElOSwk9IDMsCit9IGFmc19maWxlX3R5cGVfdDsKKworI2lmZGVmIF9fS0VSTkVMX18KKworc3RydWN0IGFmc19jZWxsOworc3RydWN0IGFmc192bm9kZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEFGUyBmaWxlIGlkZW50aWZpZXIKKyAqLworc3RydWN0IGFmc19maWQKK3sKKwlhZnNfdm9saWRfdAl2aWQ7CQkvKiB2b2x1bWUgSUQgKi8KKwlhZnNfdm5vZGVpZF90CXZub2RlOwkJLyogZmlsZSBpbmRleCB3aXRoaW4gdm9sdW1lICovCisJdW5zaWduZWQJdW5pcXVlOwkJLyogdW5pcXVlIElEIG51bWJlciAoZmlsZSBpbmRleCB2ZXJzaW9uKSAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEFGUyBjYWxsYmFjayBub3RpZmljYXRpb24KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlBRlNDTV9DQl9VTlRZUEVECT0gMCwJLyogbm8gdHlwZSBzZXQgb24gQ0IgYnJlYWsgKi8KKwlBRlNDTV9DQl9FWENMVVNJVkUJPSAxLAkvKiBDQiBleGNsdXNpdmUgdG8gQ00gW25vdCBpbXBsZW1lbnRlZF0gKi8KKwlBRlNDTV9DQl9TSEFSRUQJCT0gMiwJLyogQ0Igc2hhcmVkIGJ5IG90aGVyIENNJ3MgKi8KKwlBRlNDTV9DQl9EUk9QUEVECT0gMywJLyogQ0IgcHJvbWlzZSBjYW5jZWxsZWQgYnkgZmlsZSBzZXJ2ZXIgKi8KK30gYWZzX2NhbGxiYWNrX3R5cGVfdDsKKworc3RydWN0IGFmc19jYWxsYmFjaworeworCXN0cnVjdCBhZnNfc2VydmVyCSpzZXJ2ZXI7CS8qIHNlcnZlciB0aGF0IG1hZGUgdGhlIHByb21pc2UgKi8KKwlzdHJ1Y3QgYWZzX2ZpZAkJZmlkOwkJLyogZmlsZSBpZGVudGlmaWVyICovCisJdW5zaWduZWQJCXZlcnNpb247CS8qIGNhbGxiYWNrIHZlcnNpb24gKi8KKwl1bnNpZ25lZAkJZXhwaXJ5OwkJLyogdGltZSBhdCB3aGljaCBleHBpcmVzICovCisJYWZzX2NhbGxiYWNrX3R5cGVfdAl0eXBlOwkJLyogdHlwZSBvZiBjYWxsYmFjayAqLworfTsKKworI2RlZmluZSBBRlNDQk1BWCA1MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQUZTIHZvbHVtZSBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3QgYWZzX3ZvbHVtZV9pbmZvCit7CisJYWZzX3ZvbGlkX3QJCXZpZDsJCS8qIHZvbHVtZSBJRCAqLworCWFmc192b2x0eXBlX3QJCXR5cGU7CQkvKiB0eXBlIG9mIHRoaXMgdm9sdW1lICovCisJYWZzX3ZvbGlkX3QJCXR5cGVfdmlkc1s1XTsJLyogdm9sdW1lIElEJ3MgZm9yIHBvc3NpYmxlIHR5cGVzIGZvciB0aGlzIHZvbCAqLworCQorCS8qIGxpc3Qgb2YgZmlsZXNlcnZlcnMgc2VydmluZyB0aGlzIHZvbHVtZSAqLworCXNpemVfdAkJCW5zZXJ2ZXJzOwkvKiBudW1iZXIgb2YgZW50cmllcyB1c2VkIGluIHNlcnZlcnNbXSAqLworCXN0cnVjdCB7CisJCXN0cnVjdCBpbl9hZGRyCWFkZHI7CQkvKiBmaWxlc2VydmVyIGFkZHJlc3MgKi8KKwl9IHNlcnZlcnNbOF07Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQUZTIGZpbGUgc3RhdHVzIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBhZnNfZmlsZV9zdGF0dXMKK3sKKwl1bnNpZ25lZAkJaWZfdmVyc2lvbjsJLyogaW50ZXJmYWNlIHZlcnNpb24gKi8KKyNkZWZpbmUgQUZTX0ZTVEFUVVNfVkVSU0lPTgkxCisKKwlhZnNfZmlsZV90eXBlX3QJCXR5cGU7CQkvKiBmaWxlIHR5cGUgKi8KKwl1bnNpZ25lZAkJbmxpbms7CQkvKiBsaW5rIGNvdW50ICovCisJc2l6ZV90CQkJc2l6ZTsJCS8qIGZpbGUgc2l6ZSAqLworCWFmc19kYXRhdmVyc2lvbl90CXZlcnNpb247CS8qIGN1cnJlbnQgZGF0YSB2ZXJzaW9uICovCisJdW5zaWduZWQJCWF1dGhvcjsJCS8qIGF1dGhvciBJRCAqLworCXVuc2lnbmVkCQlvd25lcjsJCS8qIG93bmVyIElEICovCisJdW5zaWduZWQJCWNhbGxlcl9hY2Nlc3M7CS8qIGFjY2VzcyByaWdodHMgZm9yIGF1dGhlbnRpY2F0ZWQgY2FsbGVyICovCisJdW5zaWduZWQJCWFub25fYWNjZXNzOwkvKiBhY2Nlc3MgcmlnaHRzIGZvciB1bmF1dGhlbnRpY2F0ZWQgY2FsbGVyICovCisJdW1vZGVfdAkJCW1vZGU7CQkvKiBVTklYIG1vZGUgKi8KKwlzdHJ1Y3QgYWZzX2ZpZAkJcGFyZW50OwkJLyogcGFyZW50IGZpbGUgSUQgKi8KKwl0aW1lX3QJCQltdGltZV9jbGllbnQ7CS8qIGxhc3QgdGltZSBjbGllbnQgY2hhbmdlZCBkYXRhICovCisJdGltZV90CQkJbXRpbWVfc2VydmVyOwkvKiBsYXN0IHRpbWUgc2VydmVyIGNoYW5nZWQgZGF0YSAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEFGUyB2b2x1bWUgc3luY2hyb25pc2F0aW9uIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBhZnNfdm9sc3luYworeworCXRpbWVfdAkJCWNyZWF0aW9uOwkvKiB2b2x1bWUgY3JlYXRpb24gdGltZSAqLworfTsKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmIC8qIF9MSU5VWF9BRlNfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3ZsY2xpZW50LmMgYi9mcy9hZnMvdmxjbGllbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjBlMzE5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL3ZsY2xpZW50LmMKQEAgLTAsMCArMSw2OTUgQEAKKy8qIHZsY2xpZW50LmM6IEFGUyBWb2x1bWUgTG9jYXRpb24gU2VydmljZSBjbGllbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPHJ4cnBjL3J4cnBjLmg+CisjaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8cnhycGMvY29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KKyNpbmNsdWRlICJzZXJ2ZXIuaCIKKyNpbmNsdWRlICJ2b2x1bWUuaCIKKyNpbmNsdWRlICJ2bGNsaWVudC5oIgorI2luY2x1ZGUgImthZnNhc3luY2QuaCIKKyNpbmNsdWRlICJrYWZzdGltb2QuaCIKKyNpbmNsdWRlICJlcnJvcnMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIFZMR0VURU5UUllCWUlECQk1MDMJLyogQUZTIEdldCBDYWNoZSBFbnRyeSBCeSBJRCBvcGVyYXRpb24gSUQgKi8KKyNkZWZpbmUgVkxHRVRFTlRSWUJZTkFNRQk1MDQJLyogQUZTIEdldCBDYWNoZSBFbnRyeSBCeSBOYW1lIG9wZXJhdGlvbiBJRCAqLworI2RlZmluZSBWTFBST0JFCQkJNTE0CS8qIEFGUyBQcm9iZSBWb2x1bWUgTG9jYXRpb24gU2VydmljZSBvcGVyYXRpb24gSUQgKi8KKworc3RhdGljIHZvaWQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2F0dG4oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOworc3RhdGljIHZvaWQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2Vycm9yKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIG1hcCBhZnMgVkwgYWJvcnQgY29kZXMgdG8vZnJvbSBMaW51eCBlcnJvciBjb2RlcworICogLSBjYWxsZWQgd2l0aCBjYWxsLT5sb2NrIGhlbGQKKyAqLworc3RhdGljIHZvaWQgYWZzX3J4dmxfYWVtYXAoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJaW50IGVycjsKKworCV9lbnRlcigieyV1LCV1LCVkfSIsCisJICAgICAgIGNhbGwtPmFwcF9lcnJfc3RhdGUsIGNhbGwtPmFwcF9hYm9ydF9jb2RlLCBjYWxsLT5hcHBfZXJybm8pOworCisJc3dpdGNoIChjYWxsLT5hcHBfZXJyX3N0YXRlKSB7CisJY2FzZSBSWFJQQ19FU1RBVEVfTE9DQUxfQUJPUlQ6CisJCWNhbGwtPmFwcF9hYm9ydF9jb2RlID0gLWNhbGwtPmFwcF9lcnJubzsKKwkJcmV0dXJuOworCisJY2FzZSBSWFJQQ19FU1RBVEVfUEVFUl9BQk9SVDoKKwkJc3dpdGNoIChjYWxsLT5hcHBfYWJvcnRfY29kZSkgeworCQljYXNlIEFGU1ZMX0lERVhJU1Q6CQllcnIgPSAtRUVYSVNUOwkJYnJlYWs7CisJCWNhc2UgQUZTVkxfSU86CQkJZXJyID0gLUVSRU1PVEVJTzsJYnJlYWs7CisJCWNhc2UgQUZTVkxfTkFNRUVYSVNUOgkJZXJyID0gLUVFWElTVDsJCWJyZWFrOworCQljYXNlIEFGU1ZMX0NSRUFURUZBSUw6CQllcnIgPSAtRVJFTU9URUlPOwlicmVhazsKKwkJY2FzZSBBRlNWTF9OT0VOVDoJCWVyciA9IC1FTk9NRURJVU07CWJyZWFrOworCQljYXNlIEFGU1ZMX0VNUFRZOgkJZXJyID0gLUVOT01FRElVTTsJYnJlYWs7CisJCWNhc2UgQUZTVkxfRU5UREVMRVRFRDoJCWVyciA9IC1FTk9NRURJVU07CWJyZWFrOworCQljYXNlIEFGU1ZMX0JBRE5BTUU6CQllcnIgPSAtRUlOVkFMOwkJYnJlYWs7CisJCWNhc2UgQUZTVkxfQkFESU5ERVg6CQllcnIgPSAtRUlOVkFMOwkJYnJlYWs7CisJCWNhc2UgQUZTVkxfQkFEVk9MVFlQRToJCWVyciA9IC1FSU5WQUw7CQlicmVhazsKKwkJY2FzZSBBRlNWTF9CQURTRVJWRVI6CQllcnIgPSAtRUlOVkFMOwkJYnJlYWs7CisJCWNhc2UgQUZTVkxfQkFEUEFSVElUSU9OOgllcnIgPSAtRUlOVkFMOwkJYnJlYWs7CisJCWNhc2UgQUZTVkxfUkVQU0ZVTEw6CQllcnIgPSAtRUZCSUc7CQlicmVhazsKKwkJY2FzZSBBRlNWTF9OT1JFUFNFUlZFUjoJCWVyciA9IC1FTk9FTlQ7CQlicmVhazsKKwkJY2FzZSBBRlNWTF9EVVBSRVBTRVJWRVI6CWVyciA9IC1FRVhJU1Q7CQlicmVhazsKKwkJY2FzZSBBRlNWTF9SV05PVEZPVU5EOgkJZXJyID0gLUVOT0VOVDsJCWJyZWFrOworCQljYXNlIEFGU1ZMX0JBRFJFRkNPVU5UOgkJZXJyID0gLUVJTlZBTDsJCWJyZWFrOworCQljYXNlIEFGU1ZMX1NJWkVFWENFRURFRDoJZXJyID0gLUVJTlZBTDsJCWJyZWFrOworCQljYXNlIEFGU1ZMX0JBREVOVFJZOgkJZXJyID0gLUVJTlZBTDsJCWJyZWFrOworCQljYXNlIEFGU1ZMX0JBRFZPTElEQlVNUDoJZXJyID0gLUVJTlZBTDsJCWJyZWFrOworCQljYXNlIEFGU1ZMX0lEQUxSRUFEWUhBU0hFRDoJZXJyID0gLUVJTlZBTDsJCWJyZWFrOworCQljYXNlIEFGU1ZMX0VOVFJZTE9DS0VEOgkJZXJyID0gLUVCVVNZOwkJYnJlYWs7CisJCWNhc2UgQUZTVkxfQkFEVk9MT1BFUjoJCWVyciA9IC1FQkFEUlFDOwkJYnJlYWs7CisJCWNhc2UgQUZTVkxfQkFEUkVMTE9DS1RZUEU6CWVyciA9IC1FSU5WQUw7CQlicmVhazsKKwkJY2FzZSBBRlNWTF9SRVJFTEVBU0U6CQllcnIgPSAtRVJFTU9URUlPOwlicmVhazsKKwkJY2FzZSBBRlNWTF9CQURTRVJWRVJGTEFHOgllcnIgPSAtRUlOVkFMOwkJYnJlYWs7CisJCWNhc2UgQUZTVkxfUEVSTToJCWVyciA9IC1FQUNDRVM7CQlicmVhazsKKwkJY2FzZSBBRlNWTF9OT01FTToJCWVyciA9IC1FUkVNT1RFSU87CWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyID0gYWZzX2Fib3J0X3RvX2Vycm9yKGNhbGwtPmFwcF9hYm9ydF9jb2RlKTsKKwkJCWJyZWFrOworCQl9CisJCWNhbGwtPmFwcF9lcnJubyA9IGVycjsKKwkJcmV0dXJuOworCisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KK30gLyogZW5kIGFmc19yeHZsX2FlbWFwKCkgKi8KKworI2lmIDAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBwcm9iZSBhIHZvbHVtZSBsb2NhdGlvbiBzZXJ2ZXIgdG8gc2VlIGlmIGl0IGlzIHN0aWxsIGFsaXZlIC0tIHVudXNlZAorICovCitzdGF0aWMgaW50IGFmc19yeHZsX3Byb2JlKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsIGludCBhbGxvY19mbGFncykKK3sKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwlzdHJ1Y3Qga3ZlYyBwaW92WzFdOworCXNpemVfdCBzZW50OworCWludCByZXQ7CisJX19iZTMyIHBhcmFtWzFdOworCisJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKworCS8qIGdldCBob2xkIG9mIHRoZSB2bHNlcnZlciBjb25uZWN0aW9uICovCisJcmV0ID0gYWZzX3NlcnZlcl9nZXRfdmxjb25uKHNlcnZlciwgJmNvbm4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KKwlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjb25uLCBOVUxMLCBOVUxMLCBhZnNfcnh2bF9hZW1hcCwgJmNhbGwpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygia0FGUzogVW5hYmxlIHRvIGNyZWF0ZSBjYWxsOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXRfcHV0X2Nvbm47CisJfQorCWNhbGwtPmFwcF9vcGNvZGUgPSBWTFBST0JFOworCisJLyogd2Ugd2FudCB0byBnZXQgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBjYWxsICovCisJYWRkX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKKworCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCisJcGFyYW1bMF0gPSBodG9ubChWTFBST0JFKTsKKwlwaW92WzBdLmlvdl9sZW4gPSBzaXplb2YocGFyYW0pOworCXBpb3ZbMF0uaW92X2Jhc2UgPSBwYXJhbTsKKworCS8qIHNlbmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciAqLworCXJldCA9IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShjYWxsLCAxLCBwaW92LCBSWFJQQ19MQVNUX1BBQ0tFVCwKKwkJCQkgICAgYWxsb2NfZmxhZ3MsIDAsICZzZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBhYm9ydDsKKworCS8qIHdhaXQgZm9yIHRoZSByZXBseSB0byBjb21wbGV0ZWx5IGFycml2ZSAqLworCWZvciAoOzspIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGNhbGwtPmFwcF9jYWxsX3N0YXRlICE9IFJYUlBDX0NTVEFURV9DTE5UX1JDVl9SRVBMWSB8fAorCQkgICAgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJc2NoZWR1bGUoKTsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCXJldCA9IC1FSU5UUjsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCWdvdG8gYWJvcnQ7CisKKwlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7CisJY2FzZSBSWFJQQ19DU1RBVEVfRVJST1I6CisJCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKKwkJZ290byBvdXRfdW53YWl0OworCisJY2FzZSBSWFJQQ19DU1RBVEVfQ0xOVF9HT1RfUkVQTFk6CisJCXJldCA9IDA7CisJCWdvdG8gb3V0X3Vud2FpdDsKKworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworIGFib3J0OgorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIHJldCk7CisJc2NoZWR1bGUoKTsKKworIG91dF91bndhaXQ6CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworIG91dF9wdXRfY29ubjoKKwlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKKyBvdXQ6CisJcmV0dXJuIHJldDsKKworfSAvKiBlbmQgYWZzX3J4dmxfcHJvYmUoKSAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb29rIHVwIGEgdm9sdW1lIGxvY2F0aW9uIGRhdGFiYXNlIGVudHJ5IGJ5IG5hbWUKKyAqLworaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9uYW1lKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkgICAgICAgY29uc3QgY2hhciAqdm9sbmFtZSwKKwkJCSAgICAgICB1bnNpZ25lZCB2b2xuYW1lc3osCisJCQkgICAgICAgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKmVudHJ5KQoreworCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwlzdHJ1Y3Qga3ZlYyBwaW92WzNdOworCXVuc2lnbmVkIHRtcDsKKwlzaXplX3Qgc2VudDsKKwlpbnQgcmV0LCBsb29wOworCV9fYmUzMiAqYnAsIHBhcmFtWzJdLCB6ZXJvOworCisJX2VudGVyKCIsJSouKnMsJXUsIiwgdm9sbmFtZXN6LCB2b2xuYW1lc3osIHZvbG5hbWUsIHZvbG5hbWVzeik7CisKKwltZW1zZXQoZW50cnksIDAsIHNpemVvZigqZW50cnkpKTsKKworCS8qIGdldCBob2xkIG9mIHRoZSB2bHNlcnZlciBjb25uZWN0aW9uICovCisJcmV0ID0gYWZzX3NlcnZlcl9nZXRfdmxjb25uKHNlcnZlciwgJmNvbm4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KKwlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjb25uLCBOVUxMLCBOVUxMLCBhZnNfcnh2bF9hZW1hcCwgJmNhbGwpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygia0FGUzogVW5hYmxlIHRvIGNyZWF0ZSBjYWxsOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXRfcHV0X2Nvbm47CisJfQorCWNhbGwtPmFwcF9vcGNvZGUgPSBWTEdFVEVOVFJZQllOQU1FOworCisJLyogd2Ugd2FudCB0byBnZXQgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBjYWxsICovCisJYWRkX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKKworCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCisJcGlvdlsxXS5pb3ZfbGVuID0gdm9sbmFtZXN6OworCXBpb3ZbMV0uaW92X2Jhc2UgPSAoY2hhciAqKSB2b2xuYW1lOworCisJemVybyA9IDA7CisJcGlvdlsyXS5pb3ZfbGVuID0gKDQgLSAocGlvdlsxXS5pb3ZfbGVuICYgMykpICYgMzsKKwlwaW92WzJdLmlvdl9iYXNlID0gJnplcm87CisKKwlwYXJhbVswXSA9IGh0b25sKFZMR0VURU5UUllCWU5BTUUpOworCXBhcmFtWzFdID0gaHRvbmwocGlvdlsxXS5pb3ZfbGVuKTsKKworCXBpb3ZbMF0uaW92X2xlbiA9IHNpemVvZihwYXJhbSk7CisJcGlvdlswXS5pb3ZfYmFzZSA9IHBhcmFtOworCisJLyogc2VuZCB0aGUgcGFyYW1ldGVycyB0byB0aGUgc2VydmVyICovCisJcmV0ID0gcnhycGNfY2FsbF93cml0ZV9kYXRhKGNhbGwsIDMsIHBpb3YsIFJYUlBDX0xBU1RfUEFDS0VULCBHRlBfTk9GUywKKwkJCQkgICAgMCwgJnNlbnQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGFib3J0OworCisJLyogd2FpdCBmb3IgdGhlIHJlcGx5IHRvIGNvbXBsZXRlbHkgYXJyaXZlICovCisJYnAgPSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goY2FsbCwgMzg0KTsKKworCXJldCA9IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwsIGJwLCAzODQsCisJCQkJICAgUlhSUENfQ0FMTF9SRUFEX0JMT0NLIHwKKwkJCQkgICBSWFJQQ19DQUxMX1JFQURfQUxMKTsKKwlpZiAocmV0IDwgMCkgeworCQlpZiAocmV0ID09IC1FQ09OTkFCT1JURUQpIHsKKwkJCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKKwkJCWdvdG8gb3V0X3Vud2FpdDsKKwkJfQorCQlnb3RvIGFib3J0OworCX0KKworCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5ICovCisJZm9yIChsb29wID0gMDsgbG9vcCA8IDY0OyBsb29wKyspCisJCWVudHJ5LT5uYW1lW2xvb3BdID0gbnRvaGwoKmJwKyspOworCWJwKys7IC8qIGZpbmFsIE5VTCAqLworCisJYnArKzsgLyogdHlwZSAqLworCWVudHJ5LT5uc2VydmVycyA9IG50b2hsKCpicCsrKTsKKworCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspCisJCWVudHJ5LT5zZXJ2ZXJzW2xvb3BdLnNfYWRkciA9ICpicCsrOworCisJYnAgKz0gODsgLyogcGFydGl0aW9uIElEcyAqLworCisJZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykgeworCQl0bXAgPSBudG9obCgqYnArKyk7CisJCWlmICh0bXAgJiBBRlNfVkxTRl9SV1ZPTCkKKwkJCWVudHJ5LT5zcnZ0bWFza1tsb29wXSB8PSBBRlNfVk9MX1ZUTV9SVzsKKwkJaWYgKHRtcCAmIEFGU19WTFNGX1JPVk9MKQorCQkJZW50cnktPnNydnRtYXNrW2xvb3BdIHw9IEFGU19WT0xfVlRNX1JPOworCQlpZiAodG1wICYgQUZTX1ZMU0ZfQkFDS1ZPTCkKKwkJCWVudHJ5LT5zcnZ0bWFza1tsb29wXSB8PSBBRlNfVk9MX1ZUTV9CQUs7CisJfQorCisJZW50cnktPnZpZFswXSA9IG50b2hsKCpicCsrKTsKKwllbnRyeS0+dmlkWzFdID0gbnRvaGwoKmJwKyspOworCWVudHJ5LT52aWRbMl0gPSBudG9obCgqYnArKyk7CisKKwlicCsrOyAvKiBjbG9uZSBJRCAqLworCisJdG1wID0gbnRvaGwoKmJwKyspOyAvKiBmbGFncyAqLworCWlmICh0bXAgJiBBRlNfVkxGX1JXRVhJU1RTKQorCQllbnRyeS0+dmlkbWFzayB8PSBBRlNfVk9MX1ZUTV9SVzsKKwlpZiAodG1wICYgQUZTX1ZMRl9ST0VYSVNUUykKKwkJZW50cnktPnZpZG1hc2sgfD0gQUZTX1ZPTF9WVE1fUk87CisJaWYgKHRtcCAmIEFGU19WTEZfQkFDS0VYSVNUUykKKwkJZW50cnktPnZpZG1hc2sgfD0gQUZTX1ZPTF9WVE1fQkFLOworCisJcmV0ID0gLUVOT01FRElVTTsKKwlpZiAoIWVudHJ5LT52aWRtYXNrKQorCQlnb3RvIGFib3J0OworCisJLyogc3VjY2VzcyAqLworCWVudHJ5LT5ydGltZSA9IGdldF9zZWNvbmRzKCk7CisJcmV0ID0gMDsKKworIG91dF91bndhaXQ6CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworIG91dF9wdXRfY29ubjoKKwlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKKyBvdXQ6CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKworIGFib3J0OgorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIHJldCk7CisJc2NoZWR1bGUoKTsKKwlnb3RvIG91dF91bndhaXQ7Cit9IC8qIGVuZCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfbmFtZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb29rIHVwIGEgdm9sdW1lIGxvY2F0aW9uIGRhdGFiYXNlIGVudHJ5IGJ5IElECisgKi8KK2ludCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWQoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCSAgICAgYWZzX3ZvbGlkX3Qgdm9saWQsCisJCQkgICAgIGFmc192b2x0eXBlX3Qgdm9sdHlwZSwKKwkJCSAgICAgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKmVudHJ5KQoreworCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwlzdHJ1Y3Qga3ZlYyBwaW92WzFdOworCXVuc2lnbmVkIHRtcDsKKwlzaXplX3Qgc2VudDsKKwlpbnQgcmV0LCBsb29wOworCV9fYmUzMiAqYnAsIHBhcmFtWzNdOworCisJX2VudGVyKCIsJXgsJWQsIiwgdm9saWQsIHZvbHR5cGUpOworCisJbWVtc2V0KGVudHJ5LCAwLCBzaXplb2YoKmVudHJ5KSk7CisKKwkvKiBnZXQgaG9sZCBvZiB0aGUgdmxzZXJ2ZXIgY29ubmVjdGlvbiAqLworCXJldCA9IGFmc19zZXJ2ZXJfZ2V0X3ZsY29ubihzZXJ2ZXIsICZjb25uKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBjcmVhdGUgYSBjYWxsIHRocm91Z2ggdGhhdCBjb25uZWN0aW9uICovCisJcmV0ID0gcnhycGNfY3JlYXRlX2NhbGwoY29ubiwgTlVMTCwgTlVMTCwgYWZzX3J4dmxfYWVtYXAsICZjYWxsKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoImtBRlM6IFVuYWJsZSB0byBjcmVhdGUgY2FsbDogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0X3B1dF9jb25uOworCX0KKwljYWxsLT5hcHBfb3Bjb2RlID0gVkxHRVRFTlRSWUJZSUQ7CisKKwkvKiB3ZSB3YW50IHRvIGdldCBldmVudCBub3RpZmljYXRpb25zIGZyb20gdGhlIGNhbGwgKi8KKwlhZGRfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCisJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KKwlwYXJhbVswXSA9IGh0b25sKFZMR0VURU5UUllCWUlEKTsKKwlwYXJhbVsxXSA9IGh0b25sKHZvbGlkKTsKKwlwYXJhbVsyXSA9IGh0b25sKHZvbHR5cGUpOworCisJcGlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKHBhcmFtKTsKKwlwaW92WzBdLmlvdl9iYXNlID0gcGFyYW07CisKKwkvKiBzZW5kIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBzZXJ2ZXIgKi8KKwlyZXQgPSByeHJwY19jYWxsX3dyaXRlX2RhdGEoY2FsbCwgMSwgcGlvdiwgUlhSUENfTEFTVF9QQUNLRVQsIEdGUF9OT0ZTLAorCQkJCSAgICAwLCAmc2VudCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gYWJvcnQ7CisKKwkvKiB3YWl0IGZvciB0aGUgcmVwbHkgdG8gY29tcGxldGVseSBhcnJpdmUgKi8KKwlicCA9IHJ4cnBjX2NhbGxfYWxsb2Nfc2NyYXRjaChjYWxsLCAzODQpOworCisJcmV0ID0gcnhycGNfY2FsbF9yZWFkX2RhdGEoY2FsbCwgYnAsIDM4NCwKKwkJCQkgICBSWFJQQ19DQUxMX1JFQURfQkxPQ0sgfAorCQkJCSAgIFJYUlBDX0NBTExfUkVBRF9BTEwpOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChyZXQgPT0gLUVDT05OQUJPUlRFRCkgeworCQkJcmV0ID0gY2FsbC0+YXBwX2Vycm5vOworCQkJZ290byBvdXRfdW53YWl0OworCQl9CisJCWdvdG8gYWJvcnQ7CisJfQorCisJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgKi8KKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgNjQ7IGxvb3ArKykKKwkJZW50cnktPm5hbWVbbG9vcF0gPSBudG9obCgqYnArKyk7CisJYnArKzsgLyogZmluYWwgTlVMICovCisKKwlicCsrOyAvKiB0eXBlICovCisJZW50cnktPm5zZXJ2ZXJzID0gbnRvaGwoKmJwKyspOworCisJZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykKKwkJZW50cnktPnNlcnZlcnNbbG9vcF0uc19hZGRyID0gKmJwKys7CisKKwlicCArPSA4OyAvKiBwYXJ0aXRpb24gSURzICovCisKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgODsgbG9vcCsrKSB7CisJCXRtcCA9IG50b2hsKCpicCsrKTsKKwkJaWYgKHRtcCAmIEFGU19WTFNGX1JXVk9MKQorCQkJZW50cnktPnNydnRtYXNrW2xvb3BdIHw9IEFGU19WT0xfVlRNX1JXOworCQlpZiAodG1wICYgQUZTX1ZMU0ZfUk9WT0wpCisJCQllbnRyeS0+c3J2dG1hc2tbbG9vcF0gfD0gQUZTX1ZPTF9WVE1fUk87CisJCWlmICh0bXAgJiBBRlNfVkxTRl9CQUNLVk9MKQorCQkJZW50cnktPnNydnRtYXNrW2xvb3BdIHw9IEFGU19WT0xfVlRNX0JBSzsKKwl9CisKKwllbnRyeS0+dmlkWzBdID0gbnRvaGwoKmJwKyspOworCWVudHJ5LT52aWRbMV0gPSBudG9obCgqYnArKyk7CisJZW50cnktPnZpZFsyXSA9IG50b2hsKCpicCsrKTsKKworCWJwKys7IC8qIGNsb25lIElEICovCisKKwl0bXAgPSBudG9obCgqYnArKyk7IC8qIGZsYWdzICovCisJaWYgKHRtcCAmIEFGU19WTEZfUldFWElTVFMpCisJCWVudHJ5LT52aWRtYXNrIHw9IEFGU19WT0xfVlRNX1JXOworCWlmICh0bXAgJiBBRlNfVkxGX1JPRVhJU1RTKQorCQllbnRyeS0+dmlkbWFzayB8PSBBRlNfVk9MX1ZUTV9STzsKKwlpZiAodG1wICYgQUZTX1ZMRl9CQUNLRVhJU1RTKQorCQllbnRyeS0+dmlkbWFzayB8PSBBRlNfVk9MX1ZUTV9CQUs7CisKKwlyZXQgPSAtRU5PTUVESVVNOworCWlmICghZW50cnktPnZpZG1hc2spCisJCWdvdG8gYWJvcnQ7CisKKyNpZiAwIC8qIFRPRE86IHJlbW92ZSAqLworCWVudHJ5LT5uc2VydmVycyA9IDM7CisJZW50cnktPnNlcnZlcnNbMF0uc19hZGRyID0gaHRvbmwoMHhhYzEwMTI0OSk7CisJZW50cnktPnNlcnZlcnNbMV0uc19hZGRyID0gaHRvbmwoMHhhYzEwMTI0Myk7CisJZW50cnktPnNlcnZlcnNbMl0uc19hZGRyID0gaHRvbmwoMHhhYzEwMTI1YiAvKjB4YWMxMDEyNWIqLyk7CisKKwllbnRyeS0+c3J2dG1hc2tbMF0gPSBBRlNfVk9MX1ZUTV9STzsKKwllbnRyeS0+c3J2dG1hc2tbMV0gPSBBRlNfVk9MX1ZUTV9STzsKKwllbnRyeS0+c3J2dG1hc2tbMl0gPSBBRlNfVk9MX1ZUTV9STyB8IEFGU19WT0xfVlRNX1JXOworI2VuZGlmCisKKwkvKiBzdWNjZXNzICovCisJZW50cnktPnJ0aW1lID0gZ2V0X3NlY29uZHMoKTsKKwlyZXQgPSAwOworCisgb3V0X3Vud2FpdDoKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7CisJcnhycGNfcHV0X2NhbGwoY2FsbCk7Cisgb3V0X3B1dF9jb25uOgorCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNvbm4pOworIG91dDoKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCisgYWJvcnQ6CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKKwlzY2hlZHVsZSgpOworCWdvdG8gb3V0X3Vud2FpdDsKK30gLyogZW5kIGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb29rIHVwIGEgdm9sdW1lIGxvY2F0aW9uIGRhdGFiYXNlIGVudHJ5IGJ5IElEIGFzeW5jaHJvbm91c2x5CisgKi8KK2ludCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWRfYXN5bmMoc3RydWN0IGFmc19hc3luY19vcCAqb3AsCisJCQkJICAgYWZzX3ZvbGlkX3Qgdm9saWQsCisJCQkJICAgYWZzX3ZvbHR5cGVfdCB2b2x0eXBlKQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCBrdmVjIHBpb3ZbMV07CisJc2l6ZV90IHNlbnQ7CisJaW50IHJldDsKKwlfX2JlMzIgcGFyYW1bM107CisKKwlfZW50ZXIoIiwleCwlZCwiLCB2b2xpZCwgdm9sdHlwZSk7CisKKwkvKiBnZXQgaG9sZCBvZiB0aGUgdmxzZXJ2ZXIgY29ubmVjdGlvbiAqLworCXJldCA9IGFmc19zZXJ2ZXJfZ2V0X3ZsY29ubihvcC0+c2VydmVyLCAmY29ubik7CisJaWYgKHJldCA8IDApIHsKKwkJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogY3JlYXRlIGEgY2FsbCB0aHJvdWdoIHRoYXQgY29ubmVjdGlvbiAqLworCXJldCA9IHJ4cnBjX2NyZWF0ZV9jYWxsKGNvbm4sCisJCQkJYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2F0dG4sCisJCQkJYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2Vycm9yLAorCQkJCWFmc19yeHZsX2FlbWFwLAorCQkJCSZvcC0+Y2FsbCk7CisJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7CisKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoImtBRlM6IFVuYWJsZSB0byBjcmVhdGUgY2FsbDogJWRcbiIsIHJldCk7CisJCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCW9wLT5jYWxsLT5hcHBfb3Bjb2RlID0gVkxHRVRFTlRSWUJZSUQ7CisJb3AtPmNhbGwtPmFwcF91c2VyID0gb3A7CisKKwljYWxsID0gb3AtPmNhbGw7CisJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisKKwkvKiBzZW5kIGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgY2FsbCB0byBrYWZzYXN5bmNkICovCisJYWZzX2thZnNhc3luY2RfYmVnaW5fb3Aob3ApOworCisJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KKwlwYXJhbVswXSA9IGh0b25sKFZMR0VURU5UUllCWUlEKTsKKwlwYXJhbVsxXSA9IGh0b25sKHZvbGlkKTsKKwlwYXJhbVsyXSA9IGh0b25sKHZvbHR5cGUpOworCisJcGlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKHBhcmFtKTsKKwlwaW92WzBdLmlvdl9iYXNlID0gcGFyYW07CisKKwkvKiBhbGxvY2F0ZSByZXN1bHQgcmVhZCBidWZmZXIgaW4gc2NyYXRjaCBzcGFjZSAqLworCWNhbGwtPmFwcF9zY3JfcHRyID0gcnhycGNfY2FsbF9hbGxvY19zY3JhdGNoKG9wLT5jYWxsLCAzODQpOworCisJLyogc2VuZCB0aGUgcGFyYW1ldGVycyB0byB0aGUgc2VydmVyICovCisJcmV0ID0gcnhycGNfY2FsbF93cml0ZV9kYXRhKGNhbGwsIDEsIHBpb3YsIFJYUlBDX0xBU1RfUEFDS0VULCBHRlBfTk9GUywKKwkJCQkgICAgMCwgJnNlbnQpOworCWlmIChyZXQgPCAwKSB7CisJCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsgLyogaGFuZGxlIGZyb20ga2Fmc2FzeW5jZCAqLworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiB3YWl0IGZvciB0aGUgcmVwbHkgdG8gY29tcGxldGVseSBhcnJpdmUgKi8KKwlyZXQgPSByeHJwY19jYWxsX3JlYWRfZGF0YShjYWxsLCBjYWxsLT5hcHBfc2NyX3B0ciwgMzg0LCAwKTsKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgMDoKKwljYXNlIC1FQUdBSU46CisJY2FzZSAtRUNPTk5BQk9SVEVEOgorCQlyZXQgPSAwOworCQlicmVhazsJLyogYWxsIGhhbmRsZWQgYnkga2Fmc2FzeW5jZCAqLworCisJZGVmYXVsdDoKKwkJcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOyAvKiBtYWtlIGthZnNhc3luY2QgaGFuZGxlIGl0ICovCisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKworIG91dDoKKwlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCit9IC8qIGVuZCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWRfYXN5bmMoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogYXR0ZW5kIHRvIHRoZSBhc3luY2hyb25vdXMgZ2V0IFZMREIgZW50cnkgYnkgSUQKKyAqLworaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZF9hc3luYzIoc3RydWN0IGFmc19hc3luY19vcCAqb3AsCisJCQkJICAgIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICplbnRyeSkKK3sKKwlfX2JlMzIgKmJwOworCV9fdTMyIHRtcDsKKwlpbnQgbG9vcCwgcmV0OworCisJX2VudGVyKCJ7b3A9JXAgY3N0PSV1fSIsIG9wLCBvcC0+Y2FsbC0+YXBwX2NhbGxfc3RhdGUpOworCisJbWVtc2V0KGVudHJ5LCAwLCBzaXplb2YoKmVudHJ5KSk7CisKKwlpZiAob3AtPmNhbGwtPmFwcF9jYWxsX3N0YXRlID09IFJYUlBDX0NTVEFURV9DT01QTEVURSkgeworCQkvKiBvcGVyYXRpb24gZmluaXNoZWQgKi8KKwkJYWZzX2thZnNhc3luY2RfdGVybWluYXRlX29wKG9wKTsKKworCQlicCA9IG9wLT5jYWxsLT5hcHBfc2NyX3B0cjsKKworCQkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSAqLworCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgNjQ7IGxvb3ArKykKKwkJCWVudHJ5LT5uYW1lW2xvb3BdID0gbnRvaGwoKmJwKyspOworCQlicCsrOyAvKiBmaW5hbCBOVUwgKi8KKworCQlicCsrOyAvKiB0eXBlICovCisJCWVudHJ5LT5uc2VydmVycyA9IG50b2hsKCpicCsrKTsKKworCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgODsgbG9vcCsrKQorCQkJZW50cnktPnNlcnZlcnNbbG9vcF0uc19hZGRyID0gKmJwKys7CisKKwkJYnAgKz0gODsgLyogcGFydGl0aW9uIElEcyAqLworCisJCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspIHsKKwkJCXRtcCA9IG50b2hsKCpicCsrKTsKKwkJCWlmICh0bXAgJiBBRlNfVkxTRl9SV1ZPTCkKKwkJCQllbnRyeS0+c3J2dG1hc2tbbG9vcF0gfD0gQUZTX1ZPTF9WVE1fUlc7CisJCQlpZiAodG1wICYgQUZTX1ZMU0ZfUk9WT0wpCisJCQkJZW50cnktPnNydnRtYXNrW2xvb3BdIHw9IEFGU19WT0xfVlRNX1JPOworCQkJaWYgKHRtcCAmIEFGU19WTFNGX0JBQ0tWT0wpCisJCQkJZW50cnktPnNydnRtYXNrW2xvb3BdIHw9IEFGU19WT0xfVlRNX0JBSzsKKwkJfQorCisJCWVudHJ5LT52aWRbMF0gPSBudG9obCgqYnArKyk7CisJCWVudHJ5LT52aWRbMV0gPSBudG9obCgqYnArKyk7CisJCWVudHJ5LT52aWRbMl0gPSBudG9obCgqYnArKyk7CisKKwkJYnArKzsgLyogY2xvbmUgSUQgKi8KKworCQl0bXAgPSBudG9obCgqYnArKyk7IC8qIGZsYWdzICovCisJCWlmICh0bXAgJiBBRlNfVkxGX1JXRVhJU1RTKQorCQkJZW50cnktPnZpZG1hc2sgfD0gQUZTX1ZPTF9WVE1fUlc7CisJCWlmICh0bXAgJiBBRlNfVkxGX1JPRVhJU1RTKQorCQkJZW50cnktPnZpZG1hc2sgfD0gQUZTX1ZPTF9WVE1fUk87CisJCWlmICh0bXAgJiBBRlNfVkxGX0JBQ0tFWElTVFMpCisJCQllbnRyeS0+dmlkbWFzayB8PSBBRlNfVk9MX1ZUTV9CQUs7CisKKwkJcmV0ID0gLUVOT01FRElVTTsKKwkJaWYgKCFlbnRyeS0+dmlkbWFzaykgeworCQkJcnhycGNfY2FsbF9hYm9ydChvcC0+Y2FsbCwgcmV0KTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisjaWYgMCAvKiBUT0RPOiByZW1vdmUgKi8KKwkJZW50cnktPm5zZXJ2ZXJzID0gMzsKKwkJZW50cnktPnNlcnZlcnNbMF0uc19hZGRyID0gaHRvbmwoMHhhYzEwMTI0OSk7CisJCWVudHJ5LT5zZXJ2ZXJzWzFdLnNfYWRkciA9IGh0b25sKDB4YWMxMDEyNDMpOworCQllbnRyeS0+c2VydmVyc1syXS5zX2FkZHIgPSBodG9ubCgweGFjMTAxMjViIC8qMHhhYzEwMTI1YiovKTsKKworCQllbnRyeS0+c3J2dG1hc2tbMF0gPSBBRlNfVk9MX1ZUTV9STzsKKwkJZW50cnktPnNydnRtYXNrWzFdID0gQUZTX1ZPTF9WVE1fUk87CisJCWVudHJ5LT5zcnZ0bWFza1syXSA9IEFGU19WT0xfVlRNX1JPIHwgQUZTX1ZPTF9WVE1fUlc7CisjZW5kaWYKKworCQkvKiBzdWNjZXNzICovCisJCWVudHJ5LT5ydGltZSA9IGdldF9zZWNvbmRzKCk7CisJCXJldCA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAob3AtPmNhbGwtPmFwcF9jYWxsX3N0YXRlID09IFJYUlBDX0NTVEFURV9FUlJPUikgeworCQkvKiBvcGVyYXRpb24gZXJyb3IgKi8KKwkJcmV0ID0gb3AtPmNhbGwtPmFwcF9lcnJubzsKKwkJZ290byBkb25lOworCX0KKworCV9sZWF2ZSgiID0gLUVBR0FJTiIpOworCXJldHVybiAtRUFHQUlOOworCisgZG9uZToKKwlyeHJwY19wdXRfY2FsbChvcC0+Y2FsbCk7CisJb3AtPmNhbGwgPSBOVUxMOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9IC8qIGVuZCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWRfYXN5bmMyKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGhhbmRsZSBhdHRlbnRpb24gZXZlbnRzIG9uIGFuIGFzeW5jIGdldC1lbnRyeS1ieS1JRCBvcAorICogLSBjYWxsZWQgZnJvbSBrcnhpb2QKKyAqLworc3RhdGljIHZvaWQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2F0dG4oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJc3RydWN0IGFmc19hc3luY19vcCAqb3AgPSBjYWxsLT5hcHBfdXNlcjsKKworCV9lbnRlcigie29wPSVwIGNzdD0ldX0iLCBvcCwgY2FsbC0+YXBwX2NhbGxfc3RhdGUpOworCisJc3dpdGNoIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSkgeworCWNhc2UgUlhSUENfQ1NUQVRFX0NPTVBMRVRFOgorCQlhZnNfa2Fmc2FzeW5jZF9hdHRlbmRfb3Aob3ApOworCQlicmVhazsKKwljYXNlIFJYUlBDX0NTVEFURV9DTE5UX1JDVl9SRVBMWToKKwkJaWYgKGNhbGwtPmFwcF9hc3luY19yZWFkKQorCQkJYnJlYWs7CisJY2FzZSBSWFJQQ19DU1RBVEVfQ0xOVF9HT1RfUkVQTFk6CisJCWlmIChjYWxsLT5hcHBfcmVhZF9jb3VudCA9PSAwKQorCQkJYnJlYWs7CisJCXByaW50aygia0FGUzogUmVwbHkgYmlnZ2VyIHRoYW4gZXhwZWN0ZWQiCisJCSAgICAgICAiIHtjc3Q9JXUgYXN5bj0lZCBtYXJrPSVadSByZHk9JVp1IHByPSV1JXN9IiwKKwkJICAgICAgIGNhbGwtPmFwcF9jYWxsX3N0YXRlLAorCQkgICAgICAgY2FsbC0+YXBwX2FzeW5jX3JlYWQsCisJCSAgICAgICBjYWxsLT5hcHBfbWFyaywKKwkJICAgICAgIGNhbGwtPmFwcF9yZWFkeV9xdHksCisJCSAgICAgICBjYWxsLT5wa3RfcmN2X2NvdW50LAorCQkgICAgICAgY2FsbC0+YXBwX2xhc3RfcmN2ID8gIiBsYXN0IiA6ICIiKTsKKworCQlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIC1FQkFETVNHKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJX2xlYXZlKCIiKTsKKworfSAvKiBlbmQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2F0dG4oKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaGFuZGxlIGVycm9yIGV2ZW50cyBvbiBhbiBhc3luYyBnZXQtZW50cnktYnktSUQgb3AKKyAqIC0gY2FsbGVkIGZyb20ga3J4aW9kCisgKi8KK3N0YXRpYyB2b2lkIGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZF9lcnJvcihzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCA9IGNhbGwtPmFwcF91c2VyOworCisJX2VudGVyKCJ7b3A9JXAgY3N0PSV1fSIsIG9wLCBjYWxsLT5hcHBfY2FsbF9zdGF0ZSk7CisKKwlhZnNfa2Fmc2FzeW5jZF9hdHRlbmRfb3Aob3ApOworCisJX2xlYXZlKCIiKTsKKworfSAvKiBlbmQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2Vycm9yKCkgKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy92bGNsaWVudC5oIGIvZnMvYWZzL3ZsY2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkNjAxMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy92bGNsaWVudC5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qIHZsY2xpZW50Lmg6IFZvbHVtZSBMb2NhdGlvbiBTZXJ2aWNlIGNsaWVudCBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfQUZTX1ZMQ0xJRU5UX0gKKyNkZWZpbmUgX0xJTlVYX0FGU19WTENMSUVOVF9ICisKKyNpbmNsdWRlICJ0eXBlcy5oIgorCitlbnVtIEFGU1ZMX0Vycm9ycyB7CisJQUZTVkxfSURFWElTVCAJCT0gMzYzNTIwLAkvKiBWb2x1bWUgSWQgZW50cnkgZXhpc3RzIGluIHZsIGRhdGFiYXNlICovCisJQUZTVkxfSU8gCQk9IDM2MzUyMSwJLyogSS9PIHJlbGF0ZWQgZXJyb3IgKi8KKwlBRlNWTF9OQU1FRVhJU1QgCT0gMzYzNTIyLAkvKiBWb2x1bWUgbmFtZSBlbnRyeSBleGlzdHMgaW4gdmwgZGF0YWJhc2UgKi8KKwlBRlNWTF9DUkVBVEVGQUlMIAk9IDM2MzUyMywJLyogSW50ZXJuYWwgY3JlYXRpb24gZmFpbHVyZSAqLworCUFGU1ZMX05PRU5UIAkJPSAzNjM1MjQsCS8qIE5vIHN1Y2ggZW50cnkgKi8KKwlBRlNWTF9FTVBUWSAJCT0gMzYzNTI1LAkvKiBWbCBkYXRhYmFzZSBpcyBlbXB0eSAqLworCUFGU1ZMX0VOVERFTEVURUQgCT0gMzYzNTI2LAkvKiBFbnRyeSBpcyBkZWxldGVkIChzb2Z0IGRlbGV0ZSkgKi8KKwlBRlNWTF9CQUROQU1FIAkJPSAzNjM1MjcsCS8qIFZvbHVtZSBuYW1lIGlzIGlsbGVnYWwgKi8KKwlBRlNWTF9CQURJTkRFWCAJCT0gMzYzNTI4LAkvKiBJbmRleCBpcyBvdXQgb2YgcmFuZ2UgKi8KKwlBRlNWTF9CQURWT0xUWVBFIAk9IDM2MzUyOSwJLyogQmFkIHZvbHVtZSB0eXBlICovCisJQUZTVkxfQkFEU0VSVkVSIAk9IDM2MzUzMCwJLyogSWxsZWdhbCBzZXJ2ZXIgbnVtYmVyIChvdXQgb2YgcmFuZ2UpICovCisJQUZTVkxfQkFEUEFSVElUSU9OIAk9IDM2MzUzMSwJLyogQmFkIHBhcnRpdGlvbiBudW1iZXIgKi8KKwlBRlNWTF9SRVBTRlVMTCAJCT0gMzYzNTMyLAkvKiBSdW4gb3V0IG9mIHNwYWNlIGZvciBSZXBsaWNhdGlvbiBzaXRlcyAqLworCUFGU1ZMX05PUkVQU0VSVkVSIAk9IDM2MzUzMywJLyogTm8gc3VjaCBSZXBsaWNhdGlvbiBzZXJ2ZXIgc2l0ZSBleGlzdHMgKi8KKwlBRlNWTF9EVVBSRVBTRVJWRVIgCT0gMzYzNTM0LAkvKiBSZXBsaWNhdGlvbiBzaXRlIGFscmVhZHkgZXhpc3RzICovCisJQUZTVkxfUldOT1RGT1VORCAJPSAzNjM1MzUsCS8qIFBhcmVudCBSL1cgZW50cnkgbm90IGZvdW5kICovCisJQUZTVkxfQkFEUkVGQ09VTlQgCT0gMzYzNTM2LAkvKiBJbGxlZ2FsIFJlZmVyZW5jZSBDb3VudCBudW1iZXIgKi8KKwlBRlNWTF9TSVpFRVhDRUVERUQgCT0gMzYzNTM3LAkvKiBWbCBzaXplIGZvciBhdHRyaWJ1dGVzIGV4Y2VlZGVkICovCisJQUZTVkxfQkFERU5UUlkgCQk9IDM2MzUzOCwJLyogQmFkIGluY29taW5nIHZsIGVudHJ5ICovCisJQUZTVkxfQkFEVk9MSURCVU1QIAk9IDM2MzUzOSwJLyogSWxsZWdhbCBtYXggdm9saWQgaW5jcmVtZW50ICovCisJQUZTVkxfSURBTFJFQURZSEFTSEVEIAk9IDM2MzU0MCwJLyogUk8vQkFDSyBpZCBhbHJlYWR5IGhhc2hlZCAqLworCUFGU1ZMX0VOVFJZTE9DS0VEIAk9IDM2MzU0MSwJLyogVmwgZW50cnkgaXMgYWxyZWFkeSBsb2NrZWQgKi8KKwlBRlNWTF9CQURWT0xPUEVSIAk9IDM2MzU0MiwJLyogQmFkIHZvbHVtZSBvcGVyYXRpb24gY29kZSAqLworCUFGU1ZMX0JBRFJFTExPQ0tUWVBFIAk9IDM2MzU0MywJLyogQmFkIHJlbGVhc2UgbG9jayB0eXBlICovCisJQUZTVkxfUkVSRUxFQVNFIAk9IDM2MzU0NCwJLyogU3RhdHVzIHJlcG9ydDogbGFzdCByZWxlYXNlIHdhcyBhYm9ydGVkICovCisJQUZTVkxfQkFEU0VSVkVSRkxBRyAJPSAzNjM1NDUsCS8qIEludmFsaWQgcmVwbGljYXRpb24gc2l0ZSBzZXJ2ZXIgsGFnICovCisJQUZTVkxfUEVSTSAJCT0gMzYzNTQ2LAkvKiBObyBwZXJtaXNzaW9uIGFjY2VzcyAqLworCUFGU1ZMX05PTUVNIAkJPSAzNjM1NDcsCS8qIG1hbGxvYy9yZWFsbG9jIGZhaWxlZCB0byBhbGxvYyBlbm91Z2ggbWVtb3J5ICovCit9OworCisvKiBtYXBzIHRvICJzdHJ1Y3QgdmxkYmVudHJ5IiBpbiB2dmwtc3BlYy5wZGYgKi8KK3N0cnVjdCBhZnNfdmxkYmVudHJ5IHsKKwljaGFyCQluYW1lWzY1XTsJCS8qIG5hbWUgb2Ygdm9sdW1lIChpbmNsdWRpbmcgTlVMIGNoYXIpICovCisJYWZzX3ZvbHR5cGVfdAl0eXBlOwkJCS8qIHZvbHVtZSB0eXBlICovCisJdW5zaWduZWQJbnVtX3NlcnZlcnM7CQkvKiBudW0gc2VydmVycyB0aGF0IGhvbGQgaW5zdGFuY2VzIG9mIHRoaXMgdm9sICovCisJdW5zaWduZWQJY2xvbmVfaWQ7CQkvKiBjbG9uaW5nIElEICovCisKKwl1bnNpZ25lZAlmbGFnczsKKyNkZWZpbmUgQUZTX1ZMRl9SV0VYSVNUUwkweDEwMDAJCS8qIFIvVyB2b2x1bWUgZXhpc3RzICovCisjZGVmaW5lIEFGU19WTEZfUk9FWElTVFMJMHgyMDAwCQkvKiBSL08gdm9sdW1lIGV4aXN0cyAqLworI2RlZmluZSBBRlNfVkxGX0JBQ0tFWElTVFMJMHg0MDAwCQkvKiBiYWNrdXAgdm9sdW1lIGV4aXN0cyAqLworCisJYWZzX3ZvbGlkX3QJdm9sdW1lX2lkc1szXTsJCS8qIHZvbHVtZSBJRHMgKi8KKworCXN0cnVjdCB7CisJCXN0cnVjdCBpbl9hZGRyCWFkZHI7CQkvKiBzZXJ2ZXIgYWRkcmVzcyAqLworCQl1bnNpZ25lZAlwYXJ0aXRpb247CS8qIHBhcnRpdGlvbiBJRCBvbiB0aGlzIHNlcnZlciAqLworCQl1bnNpZ25lZAlmbGFnczsJCS8qIHNlcnZlciBzcGVjaWZpYyBmbGFncyAqLworI2RlZmluZSBBRlNfVkxTRl9ORVdSRVBTSVRFCTB4MDAwMQkvKiB1bnVzZWQgKi8KKyNkZWZpbmUgQUZTX1ZMU0ZfUk9WT0wJCTB4MDAwMgkvKiB0aGlzIHNlcnZlciBob2xkcyBhIFIvTyBpbnN0YW5jZSBvZiB0aGUgdm9sdW1lICovCisjZGVmaW5lIEFGU19WTFNGX1JXVk9MCQkweDAwMDQJLyogdGhpcyBzZXJ2ZXIgaG9sZHMgYSBSL1cgaW5zdGFuY2Ugb2YgdGhlIHZvbHVtZSAqLworI2RlZmluZSBBRlNfVkxTRl9CQUNLVk9MCTB4MDAwOAkvKiB0aGlzIHNlcnZlciBob2xkcyBhIGJhY2t1cCBpbnN0YW5jZSBvZiB0aGUgdm9sdW1lICovCisJfSBzZXJ2ZXJzWzhdOworCit9OworCisvKiBsb29rIHVwIGEgdm9sdW1lIGxvY2F0aW9uIGRhdGFiYXNlIGVudHJ5IGJ5IG5hbWUgKi8KK2V4dGVybiBpbnQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X25hbWUoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCQkgICAgICBjb25zdCBjaGFyICp2b2xuYW1lLAorCQkJCSAgICAgIHVuc2lnbmVkIHZvbG5hbWVzeiwKKwkJCQkgICAgICBzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqZW50cnkpOworCisvKiBsb29rIHVwIGEgdm9sdW1lIGxvY2F0aW9uIGRhdGFiYXNlIGVudHJ5IGJ5IElEICovCitleHRlcm4gaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZChzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkJCSAgICBhZnNfdm9saWRfdAl2b2xpZCwKKwkJCQkgICAgYWZzX3ZvbHR5cGVfdCB2b2x0eXBlLAorCQkJCSAgICBzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqZW50cnkpOworCitleHRlcm4gaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZF9hc3luYyhzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCwKKwkJCQkJICBhZnNfdm9saWRfdCB2b2xpZCwKKwkJCQkJICBhZnNfdm9sdHlwZV90IHZvbHR5cGUpOworCitleHRlcm4gaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZF9hc3luYzIoc3RydWN0IGFmc19hc3luY19vcCAqb3AsCisJCQkJCSAgIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICplbnRyeSk7CisKKyNlbmRpZiAvKiBfTElOVVhfQUZTX1ZMQ0xJRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy92bG9jYXRpb24uYyBiL2ZzL2Fmcy92bG9jYXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2VkMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL3Zsb2NhdGlvbi5jCkBAIC0wLDAgKzEsOTU0IEBACisvKiB2bG9jYXRpb24uYzogdm9sdW1lIGxvY2F0aW9uIG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSAidm9sdW1lLmgiCisjaW5jbHVkZSAiY2VsbC5oIgorI2luY2x1ZGUgImNtc2VydmljZS5oIgorI2luY2x1ZGUgImZzY2xpZW50LmgiCisjaW5jbHVkZSAidmxjbGllbnQuaCIKKyNpbmNsdWRlICJrYWZzdGltb2QuaCIKKyNpbmNsdWRlIDxyeHJwYy9jb25uZWN0aW9uLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBBRlNfVkxEQl9USU1FT1VUIEhaKjEwMDAKKworc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfdGltZXIoc3RydWN0IGFmc190aW1lciAqdGltZXIpOworc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfYXR0ZW5kKHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wKTsKK3N0YXRpYyB2b2lkIGFmc192bG9jYXRpb25fdXBkYXRlX2Rpc2NhcmQoc3RydWN0IGFmc19hc3luY19vcCAqb3ApOworc3RhdGljIHZvaWQgX19hZnNfcHV0X3Zsb2NhdGlvbihzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uKTsKKworc3RhdGljIHZvaWQgX19hZnNfdmxvY2F0aW9uX3RpbWVvdXQoc3RydWN0IGFmc190aW1lciAqdGltZXIpCit7CisJc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbiA9CisJCWxpc3RfZW50cnkodGltZXIsIHN0cnVjdCBhZnNfdmxvY2F0aW9uLCB0aW1lb3V0KTsKKworCV9kZWJ1ZygiVkwgVElNRU9VVCBbJXN7dT0lZH1dIiwKKwkgICAgICAgdmxvY2F0aW9uLT52bGRiLm5hbWUsIGF0b21pY19yZWFkKCZ2bG9jYXRpb24tPnVzYWdlKSk7CisKKwlhZnNfdmxvY2F0aW9uX2RvX3RpbWVvdXQodmxvY2F0aW9uKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfdGltZXJfb3BzIGFmc192bG9jYXRpb25fdGltZXJfb3BzID0geworCS50aW1lZF9vdXQJPSBfX2Fmc192bG9jYXRpb25fdGltZW91dCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZzX3RpbWVyX29wcyBhZnNfdmxvY2F0aW9uX3VwZGF0ZV90aW1lcl9vcHMgPSB7CisJLnRpbWVkX291dAk9IGFmc192bG9jYXRpb25fdXBkYXRlX3RpbWVyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfYXN5bmNfb3Bfb3BzIGFmc192bG9jYXRpb25fdXBkYXRlX29wX29wcyA9IHsKKwkuYXR0ZW5kCQk9IGFmc192bG9jYXRpb25fdXBkYXRlX2F0dGVuZCwKKwkuZGlzY2FyZAk9IGFmc192bG9jYXRpb25fdXBkYXRlX2Rpc2NhcmQsCit9OworCitzdGF0aWMgTElTVF9IRUFEKGFmc192bG9jYXRpb25fdXBkYXRlX3BlbmRxKTsJLyogcXVldWUgb2YgVkxzIGF3YWl0aW5nIHVwZGF0ZSAqLworc3RhdGljIHN0cnVjdCBhZnNfdmxvY2F0aW9uICphZnNfdmxvY2F0aW9uX3VwZGF0ZTsJLyogVkwgY3VycmVudGx5IGJlaW5nIHVwZGF0ZWQgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWZzX3Zsb2NhdGlvbl91cGRhdGVfbG9jayk7IC8qIGxvY2sgZ3VhcmRpbmcgdXBkYXRlIHF1ZXVlICovCisKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitzdGF0aWMgY2FjaGVmc19tYXRjaF92YWxfdCBhZnNfdmxvY2F0aW9uX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKKwkJCQkJCSAgICAgY29uc3Qgdm9pZCAqZW50cnkpOworc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl9jYWNoZV91cGRhdGUodm9pZCAqc291cmNlLCB2b2lkICplbnRyeSk7CisKK3N0cnVjdCBjYWNoZWZzX2luZGV4X2RlZiBhZnNfdmxvY2F0aW9uX2NhY2hlX2luZGV4X2RlZiA9IHsKKwkubmFtZQkJPSAidmxkYiIsCisJLmRhdGFfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiksCisJLmtleXNbMF0JPSB7IENBQ0hFRlNfSU5ERVhfS0VZU19BU0NJSVosIDY0IH0sCisJLm1hdGNoCQk9IGFmc192bG9jYXRpb25fY2FjaGVfbWF0Y2gsCisJLnVwZGF0ZQkJPSBhZnNfdmxvY2F0aW9uX2NhY2hlX3VwZGF0ZSwKK307CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGl0ZXJhdGUgdGhyb3VnaCB0aGUgVkwgc2VydmVycyBpbiBhIGNlbGwgdW50aWwgb25lIG9mIHRoZW0gYWRtaXRzIGtub3dpbmcKKyAqIGFib3V0IHRoZSB2b2x1bWUgaW4gcXVlc3Rpb24KKyAqIC0gY2FsbGVyIG11c3QgaGF2ZSBjZWxsLT52bF9zZW0gd3JpdGUtbG9ja2VkCisgKi8KK3N0YXRpYyBpbnQgYWZzX3Zsb2NhdGlvbl9hY2Nlc3NfdmxfYnlfbmFtZShzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uLAorCQkJCQkgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgICB1bnNpZ25lZCBuYW1lc3osCisJCQkJCSAgIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICp2bGRiKQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIgPSBOVUxMOworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHZsb2NhdGlvbi0+Y2VsbDsKKwlpbnQgY291bnQsIHJldDsKKworCV9lbnRlcigiJXMsJSouKnMsJXUiLCBjZWxsLT5uYW1lLCBuYW1lc3osIG5hbWVzeiwgbmFtZSwgbmFtZXN6KTsKKworCXJldCA9IC1FTk9NRURJVU07CisJZm9yIChjb3VudCA9IGNlbGwtPnZsX25hZGRyczsgY291bnQgPiAwOyBjb3VudC0tKSB7CisJCV9kZWJ1ZygiQ2VsbFNlcnZbJWh1XTogJTA4eCIsCisJCSAgICAgICBjZWxsLT52bF9jdXJyX3N2aXgsCisJCSAgICAgICBjZWxsLT52bF9hZGRyc1tjZWxsLT52bF9jdXJyX3N2aXhdLnNfYWRkcik7CisKKwkJLyogdHJ5IGFuZCBjcmVhdGUgYSBzZXJ2ZXIgKi8KKwkJcmV0ID0gYWZzX3NlcnZlcl9sb29rdXAoY2VsbCwKKwkJCQkJJmNlbGwtPnZsX2FkZHJzW2NlbGwtPnZsX2N1cnJfc3ZpeF0sCisJCQkJCSZzZXJ2ZXIpOworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIDA6CisJCQlicmVhazsKKwkJY2FzZSAtRU5PTUVNOgorCQljYXNlIC1FTk9ORVQ6CisJCQlnb3RvIG91dDsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gcm90YXRlOworCQl9CisKKwkJLyogYXR0ZW1wdCB0byBhY2Nlc3MgdGhlIFZMIHNlcnZlciAqLworCQlyZXQgPSBhZnNfcnh2bF9nZXRfZW50cnlfYnlfbmFtZShzZXJ2ZXIsIG5hbWUsIG5hbWVzeiwgdmxkYik7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoKKwkJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisJCQlnb3RvIG91dDsKKwkJY2FzZSAtRU5PTUVNOgorCQljYXNlIC1FTk9ORVQ6CisJCWNhc2UgLUVORVRVTlJFQUNIOgorCQljYXNlIC1FSE9TVFVOUkVBQ0g6CisJCWNhc2UgLUVDT05OUkVGVVNFRDoKKwkJCWRvd25fd3JpdGUoJnNlcnZlci0+c2VtKTsKKwkJCWlmIChzZXJ2ZXItPnZsc2VydmVyKSB7CisJCQkJcnhycGNfcHV0X2Nvbm5lY3Rpb24oc2VydmVyLT52bHNlcnZlcik7CisJCQkJc2VydmVyLT52bHNlcnZlciA9IE5VTEw7CisJCQl9CisJCQl1cF93cml0ZSgmc2VydmVyLT5zZW0pOworCQkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKwkJCWlmIChyZXQgPT0gLUVOT01FTSB8fCByZXQgPT0gLUVOT05FVCkKKwkJCQlnb3RvIG91dDsKKwkJCWdvdG8gcm90YXRlOworCQljYXNlIC1FTk9NRURJVU06CisJCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCQkJZ290byBvdXQ7CisJCWRlZmF1bHQ6CisJCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCQkJcmV0ID0gLUVOT01FRElVTTsKKwkJCWdvdG8gcm90YXRlOworCQl9CisKKwkJLyogcm90YXRlIHRoZSBzZXJ2ZXIgcmVjb3JkcyB1cG9uIGxvb2t1cCBmYWlsdXJlICovCisJcm90YXRlOgorCQljZWxsLT52bF9jdXJyX3N2aXgrKzsKKwkJY2VsbC0+dmxfY3Vycl9zdml4ICU9IGNlbGwtPnZsX25hZGRyczsKKwl9CisKKyBvdXQ6CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKworfSAvKiBlbmQgYWZzX3Zsb2NhdGlvbl9hY2Nlc3NfdmxfYnlfbmFtZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBpdGVyYXRlIHRocm91Z2ggdGhlIFZMIHNlcnZlcnMgaW4gYSBjZWxsIHVudGlsIG9uZSBvZiB0aGVtIGFkbWl0cyBrbm93aW5nCisgKiBhYm91dCB0aGUgdm9sdW1lIGluIHF1ZXN0aW9uCisgKiAtIGNhbGxlciBtdXN0IGhhdmUgY2VsbC0+dmxfc2VtIHdyaXRlLWxvY2tlZAorICovCitzdGF0aWMgaW50IGFmc192bG9jYXRpb25fYWNjZXNzX3ZsX2J5X2lkKHN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24sCisJCQkJCSBhZnNfdm9saWRfdCB2b2xpZCwKKwkJCQkJIGFmc192b2x0eXBlX3Qgdm9sdHlwZSwKKwkJCQkJIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICp2bGRiKQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIgPSBOVUxMOworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHZsb2NhdGlvbi0+Y2VsbDsKKwlpbnQgY291bnQsIHJldDsKKworCV9lbnRlcigiJXMsJXgsJWQsIiwgY2VsbC0+bmFtZSwgdm9saWQsIHZvbHR5cGUpOworCisJcmV0ID0gLUVOT01FRElVTTsKKwlmb3IgKGNvdW50ID0gY2VsbC0+dmxfbmFkZHJzOyBjb3VudCA+IDA7IGNvdW50LS0pIHsKKwkJX2RlYnVnKCJDZWxsU2VydlslaHVdOiAlMDh4IiwKKwkJICAgICAgIGNlbGwtPnZsX2N1cnJfc3ZpeCwKKwkJICAgICAgIGNlbGwtPnZsX2FkZHJzW2NlbGwtPnZsX2N1cnJfc3ZpeF0uc19hZGRyKTsKKworCQkvKiB0cnkgYW5kIGNyZWF0ZSBhIHNlcnZlciAqLworCQlyZXQgPSBhZnNfc2VydmVyX2xvb2t1cChjZWxsLAorCQkJCQkmY2VsbC0+dmxfYWRkcnNbY2VsbC0+dmxfY3Vycl9zdml4XSwKKwkJCQkJJnNlcnZlcik7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoKKwkJCWJyZWFrOworCQljYXNlIC1FTk9NRU06CisJCWNhc2UgLUVOT05FVDoKKwkJCWdvdG8gb3V0OworCQlkZWZhdWx0OgorCQkJZ290byByb3RhdGU7CisJCX0KKworCQkvKiBhdHRlbXB0IHRvIGFjY2VzcyB0aGUgVkwgc2VydmVyICovCisJCXJldCA9IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZChzZXJ2ZXIsIHZvbGlkLCB2b2x0eXBlLCB2bGRiKTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgorCQkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKwkJCWdvdG8gb3V0OworCQljYXNlIC1FTk9NRU06CisJCWNhc2UgLUVOT05FVDoKKwkJY2FzZSAtRU5FVFVOUkVBQ0g6CisJCWNhc2UgLUVIT1NUVU5SRUFDSDoKKwkJY2FzZSAtRUNPTk5SRUZVU0VEOgorCQkJZG93bl93cml0ZSgmc2VydmVyLT5zZW0pOworCQkJaWYgKHNlcnZlci0+dmxzZXJ2ZXIpIHsKKwkJCQlyeHJwY19wdXRfY29ubmVjdGlvbihzZXJ2ZXItPnZsc2VydmVyKTsKKwkJCQlzZXJ2ZXItPnZsc2VydmVyID0gTlVMTDsKKwkJCX0KKwkJCXVwX3dyaXRlKCZzZXJ2ZXItPnNlbSk7CisJCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCQkJaWYgKHJldCA9PSAtRU5PTUVNIHx8IHJldCA9PSAtRU5PTkVUKQorCQkJCWdvdG8gb3V0OworCQkJZ290byByb3RhdGU7CisJCWNhc2UgLUVOT01FRElVTToKKwkJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisJCQlnb3RvIG91dDsKKwkJZGVmYXVsdDoKKwkJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisJCQlyZXQgPSAtRU5PTUVESVVNOworCQkJZ290byByb3RhdGU7CisJCX0KKworCQkvKiByb3RhdGUgdGhlIHNlcnZlciByZWNvcmRzIHVwb24gbG9va3VwIGZhaWx1cmUgKi8KKwlyb3RhdGU6CisJCWNlbGwtPnZsX2N1cnJfc3ZpeCsrOworCQljZWxsLT52bF9jdXJyX3N2aXggJT0gY2VsbC0+dmxfbmFkZHJzOworCX0KKworIG91dDoKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCit9IC8qIGVuZCBhZnNfdmxvY2F0aW9uX2FjY2Vzc192bF9ieV9pZCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb29rdXAgdm9sdW1lIGxvY2F0aW9uCisgKiAtIGNhbGxlciBtdXN0IGhhdmUgY2VsbC0+dm9sX3NlbSB3cml0ZS1sb2NrZWQKKyAqIC0gaXRlcmF0ZSB0aHJvdWdoIHRoZSBWTCBzZXJ2ZXJzIGluIGEgY2VsbCB1bnRpbCBvbmUgb2YgdGhlbSBhZG1pdHMga25vd2luZworICogICBhYm91dCB0aGUgdm9sdW1lIGluIHF1ZXN0aW9uCisgKiAtIGxvb2t1cCBpbiB0aGUgbG9jYWwgY2FjaGUgaWYgbm90IGFibGUgdG8gZmluZCBvbiB0aGUgVkwgc2VydmVyCisgKiAtIGluc2VydC91cGRhdGUgaW4gdGhlIGxvY2FsIGNhY2hlIGlmIGRpZCBnZXQgYSBWTCByZXNwb25zZQorICovCitpbnQgYWZzX3Zsb2NhdGlvbl9sb29rdXAoc3RydWN0IGFmc19jZWxsICpjZWxsLAorCQkJIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgdW5zaWduZWQgbmFtZXN6LAorCQkJIHN0cnVjdCBhZnNfdmxvY2F0aW9uICoqX3Zsb2NhdGlvbikKK3sKKwlzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiB2bGRiOworCXN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb247CisJYWZzX3ZvbHR5cGVfdCB2b2x0eXBlOworCWFmc192b2xpZF90IHZpZDsKKwlpbnQgYWN0aXZlID0gMCwgcmV0OworCisJX2VudGVyKCJ7JXN9LCUqLipzLCV1LCIsIGNlbGwtPm5hbWUsIG5hbWVzeiwgbmFtZXN6LCBuYW1lLCBuYW1lc3opOworCisJaWYgKG5hbWVzeiA+IHNpemVvZih2bG9jYXRpb24tPnZsZGIubmFtZSkpIHsKKwkJX2xlYXZlKCIgPSAtRU5BTUVUT09MT05HIik7CisJCXJldHVybiAtRU5BTUVUT09MT05HOworCX0KKworCS8qIHNlYXJjaCB0aGUgY2VsbCdzIGFjdGl2ZSBsaXN0IGZpcnN0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bG9jYXRpb24sICZjZWxsLT52bF9saXN0LCBsaW5rKSB7CisJCWlmIChuYW1lc3ogPCBzaXplb2YodmxvY2F0aW9uLT52bGRiLm5hbWUpICYmCisJCSAgICB2bG9jYXRpb24tPnZsZGIubmFtZVtuYW1lc3pdICE9ICdcMCcpCisJCQljb250aW51ZTsKKworCQlpZiAobWVtY21wKHZsb2NhdGlvbi0+dmxkYi5uYW1lLCBuYW1lLCBuYW1lc3opID09IDApCisJCQlnb3RvIGZvdW5kX2luX21lbW9yeTsKKwl9CisKKwkvKiBzZWFyY2ggdGhlIGNlbGwncyBncmF2ZXlhcmQgbGlzdCBzZWNvbmQgKi8KKwlzcGluX2xvY2soJmNlbGwtPnZsX2d5bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bG9jYXRpb24sICZjZWxsLT52bF9ncmF2ZXlhcmQsIGxpbmspIHsKKwkJaWYgKG5hbWVzeiA8IHNpemVvZih2bG9jYXRpb24tPnZsZGIubmFtZSkgJiYKKwkJICAgIHZsb2NhdGlvbi0+dmxkYi5uYW1lW25hbWVzel0gIT0gJ1wwJykKKwkJCWNvbnRpbnVlOworCisJCWlmIChtZW1jbXAodmxvY2F0aW9uLT52bGRiLm5hbWUsIG5hbWUsIG5hbWVzeikgPT0gMCkKKwkJCWdvdG8gZm91bmRfaW5fZ3JhdmV5YXJkOworCX0KKwlzcGluX3VubG9jaygmY2VsbC0+dmxfZ3lsb2NrKTsKKworCS8qIG5vdCBpbiB0aGUgY2VsbCdzIGluLW1lbW9yeSBsaXN0cyAtIGNyZWF0ZSBhIG5ldyByZWNvcmQgKi8KKwl2bG9jYXRpb24gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiksIEdGUF9LRVJORUwpOworCWlmICghdmxvY2F0aW9uKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldCh2bG9jYXRpb24sIDAsIHNpemVvZihzdHJ1Y3QgYWZzX3Zsb2NhdGlvbikpOworCWF0b21pY19zZXQoJnZsb2NhdGlvbi0+dXNhZ2UsIDEpOworCUlOSVRfTElTVF9IRUFEKCZ2bG9jYXRpb24tPmxpbmspOworCXJ3bG9ja19pbml0KCZ2bG9jYXRpb24tPmxvY2spOworCW1lbWNweSh2bG9jYXRpb24tPnZsZGIubmFtZSwgbmFtZSwgbmFtZXN6KTsKKworCWFmc190aW1lcl9pbml0KCZ2bG9jYXRpb24tPnRpbWVvdXQsICZhZnNfdmxvY2F0aW9uX3RpbWVyX29wcyk7CisJYWZzX3RpbWVyX2luaXQoJnZsb2NhdGlvbi0+dXBkX3RpbWVyLCAmYWZzX3Zsb2NhdGlvbl91cGRhdGVfdGltZXJfb3BzKTsKKwlhZnNfYXN5bmNfb3BfaW5pdCgmdmxvY2F0aW9uLT51cGRfb3AsICZhZnNfdmxvY2F0aW9uX3VwZGF0ZV9vcF9vcHMpOworCisJYWZzX2dldF9jZWxsKGNlbGwpOworCXZsb2NhdGlvbi0+Y2VsbCA9IGNlbGw7CisKKwlsaXN0X2FkZF90YWlsKCZ2bG9jYXRpb24tPmxpbmssICZjZWxsLT52bF9saXN0KTsKKworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwkvKiB3ZSB3YW50IHRvIHN0b3JlIGl0IGluIHRoZSBjYWNoZSwgcGx1cyBpdCBtaWdodCBhbHJlYWR5IGJlCisJICogZW5jYWNoZWQgKi8KKwljYWNoZWZzX2FjcXVpcmVfY29va2llKGNlbGwtPmNhY2hlLAorCQkJICAgICAgICZhZnNfdm9sdW1lX2NhY2hlX2luZGV4X2RlZiwKKwkJCSAgICAgICB2bG9jYXRpb24sCisJCQkgICAgICAgJnZsb2NhdGlvbi0+Y2FjaGUpOworCisJaWYgKHZsb2NhdGlvbi0+dmFsaWQpCisJCWdvdG8gZm91bmRfaW5fY2FjaGU7CisjZW5kaWYKKworCS8qIHRyeSB0byBsb29rIHVwIGFuIHVua25vd24gdm9sdW1lIGluIHRoZSBjZWxsIFZMIGRhdGFiYXNlcyBieSBuYW1lICovCisJcmV0ID0gYWZzX3Zsb2NhdGlvbl9hY2Nlc3NfdmxfYnlfbmFtZSh2bG9jYXRpb24sIG5hbWUsIG5hbWVzeiwgJnZsZGIpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygia0FGUzogZmFpbGVkIHRvIGxvY2F0ZSAnJSouKnMnIGluIGNlbGwgJyVzJ1xuIiwKKwkJICAgICAgIG5hbWVzeiwgbmFtZXN6LCBuYW1lLCBjZWxsLT5uYW1lKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlnb3RvIGZvdW5kX29uX3Zsc2VydmVyOworCisgZm91bmRfaW5fZ3JhdmV5YXJkOgorCS8qIGZvdW5kIGluIHRoZSBncmF2ZXlhcmQgLSByZXN1cnJlY3QgKi8KKwlfZGVidWcoImZvdW5kIGluIGdyYXZleWFyZCIpOworCWF0b21pY19pbmMoJnZsb2NhdGlvbi0+dXNhZ2UpOworCWxpc3RfZGVsKCZ2bG9jYXRpb24tPmxpbmspOworCWxpc3RfYWRkX3RhaWwoJnZsb2NhdGlvbi0+bGluaywgJmNlbGwtPnZsX2xpc3QpOworCXNwaW5fdW5sb2NrKCZjZWxsLT52bF9neWxvY2spOworCisJYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoJnZsb2NhdGlvbi0+dGltZW91dCk7CisJZ290byBhY3RpdmU7CisKKyBmb3VuZF9pbl9tZW1vcnk6CisJLyogZm91bmQgaW4gbWVtb3J5IC0gY2hlY2sgdG8gc2VlIGlmIGl0J3MgYWN0aXZlICovCisJX2RlYnVnKCJmb3VuZCBpbiBtZW1vcnkiKTsKKwlhdG9taWNfaW5jKCZ2bG9jYXRpb24tPnVzYWdlKTsKKworIGFjdGl2ZToKKwlhY3RpdmUgPSAxOworCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorIGZvdW5kX2luX2NhY2hlOgorI2VuZGlmCisJLyogdHJ5IHRvIGxvb2sgdXAgYSBjYWNoZWQgdm9sdW1lIGluIHRoZSBjZWxsIFZMIGRhdGFiYXNlcyBieSBJRCAqLworCV9kZWJ1ZygiZm91bmQgaW4gY2FjaGUiKTsKKworCV9kZWJ1ZygiTG9jYWxseSBDYWNoZWQ6ICVzICUwMnggeyAlMDh4KCV4KSAlMDh4KCV4KSAlMDh4KCV4KSB9IiwKKwkgICAgICAgdmxvY2F0aW9uLT52bGRiLm5hbWUsCisJICAgICAgIHZsb2NhdGlvbi0+dmxkYi52aWRtYXNrLAorCSAgICAgICBudG9obCh2bG9jYXRpb24tPnZsZGIuc2VydmVyc1swXS5zX2FkZHIpLAorCSAgICAgICB2bG9jYXRpb24tPnZsZGIuc3J2dG1hc2tbMF0sCisJICAgICAgIG50b2hsKHZsb2NhdGlvbi0+dmxkYi5zZXJ2ZXJzWzFdLnNfYWRkciksCisJICAgICAgIHZsb2NhdGlvbi0+dmxkYi5zcnZ0bWFza1sxXSwKKwkgICAgICAgbnRvaGwodmxvY2F0aW9uLT52bGRiLnNlcnZlcnNbMl0uc19hZGRyKSwKKwkgICAgICAgdmxvY2F0aW9uLT52bGRiLnNydnRtYXNrWzJdCisJICAgICAgICk7CisKKwlfZGVidWcoIlZpZHM6ICUwOHggJTA4eCAlMDh4IiwKKwkgICAgICAgdmxvY2F0aW9uLT52bGRiLnZpZFswXSwKKwkgICAgICAgdmxvY2F0aW9uLT52bGRiLnZpZFsxXSwKKwkgICAgICAgdmxvY2F0aW9uLT52bGRiLnZpZFsyXSk7CisKKwlpZiAodmxvY2F0aW9uLT52bGRiLnZpZG1hc2sgJiBBRlNfVk9MX1ZUTV9SVykgeworCQl2aWQgPSB2bG9jYXRpb24tPnZsZGIudmlkWzBdOworCQl2b2x0eXBlID0gQUZTVkxfUldWT0w7CisJfQorCWVsc2UgaWYgKHZsb2NhdGlvbi0+dmxkYi52aWRtYXNrICYgQUZTX1ZPTF9WVE1fUk8pIHsKKwkJdmlkID0gdmxvY2F0aW9uLT52bGRiLnZpZFsxXTsKKwkJdm9sdHlwZSA9IEFGU1ZMX1JPVk9MOworCX0KKwllbHNlIGlmICh2bG9jYXRpb24tPnZsZGIudmlkbWFzayAmIEFGU19WT0xfVlRNX0JBSykgeworCQl2aWQgPSB2bG9jYXRpb24tPnZsZGIudmlkWzJdOworCQl2b2x0eXBlID0gQUZTVkxfQkFDS1ZPTDsKKwl9CisJZWxzZSB7CisJCUJVRygpOworCQl2aWQgPSAwOworCQl2b2x0eXBlID0gMDsKKwl9CisKKwlyZXQgPSBhZnNfdmxvY2F0aW9uX2FjY2Vzc192bF9ieV9pZCh2bG9jYXRpb24sIHZpZCwgdm9sdHlwZSwgJnZsZGIpOworCXN3aXRjaCAocmV0KSB7CisJCS8qIG5ldCBlcnJvciAqLworCWRlZmF1bHQ6CisJCXByaW50aygia0FGUzogZmFpbGVkIHRvIHZvbHVtZSAnJSouKnMnICgleCkgdXAgaW4gJyVzJzogJWRcbiIsCisJCSAgICAgICBuYW1lc3osIG5hbWVzeiwgbmFtZSwgdmlkLCBjZWxsLT5uYW1lLCByZXQpOworCQlnb3RvIGVycm9yOworCisJCS8qIHB1bGxlZCBmcm9tIGxvY2FsIGNhY2hlIGludG8gbWVtb3J5ICovCisJY2FzZSAwOgorCQlnb3RvIGZvdW5kX29uX3Zsc2VydmVyOworCisJCS8qIHVoIG9oLi4uIGxvb2tzIGxpa2UgdGhlIHZvbHVtZSBnb3QgZGVsZXRlZCAqLworCWNhc2UgLUVOT01FRElVTToKKwkJcHJpbnRrKCJrQUZTOiB2b2x1bWUgJyUqLipzJyAoJXgpIGRvZXMgbm90IGV4aXN0ICclcydcbiIsCisJCSAgICAgICBuYW1lc3osIG5hbWVzeiwgbmFtZSwgdmlkLCBjZWxsLT5uYW1lKTsKKworCQkvKiBUT0RPOiBtYWtlIGV4aXN0aW5nIHJlY29yZCB1bmF2YWlsYWJsZSAqLworCQlnb3RvIGVycm9yOworCX0KKworIGZvdW5kX29uX3Zsc2VydmVyOgorCV9kZWJ1ZygiRG9uZSBWTCBMb29rdXA6ICUqLipzICUwMnggeyAlMDh4KCV4KSAlMDh4KCV4KSAlMDh4KCV4KSB9IiwKKwkgICAgICAgbmFtZXN6LCBuYW1lc3osIG5hbWUsCisJICAgICAgIHZsZGIudmlkbWFzaywKKwkgICAgICAgbnRvaGwodmxkYi5zZXJ2ZXJzWzBdLnNfYWRkciksIHZsZGIuc3J2dG1hc2tbMF0sCisJICAgICAgIG50b2hsKHZsZGIuc2VydmVyc1sxXS5zX2FkZHIpLCB2bGRiLnNydnRtYXNrWzFdLAorCSAgICAgICBudG9obCh2bGRiLnNlcnZlcnNbMl0uc19hZGRyKSwgdmxkYi5zcnZ0bWFza1syXQorCSAgICAgICApOworCisJX2RlYnVnKCJWaWRzOiAlMDh4ICUwOHggJTA4eCIsIHZsZGIudmlkWzBdLCB2bGRiLnZpZFsxXSwgdmxkYi52aWRbMl0pOworCisJaWYgKChuYW1lc3ogPCBzaXplb2YodmxvY2F0aW9uLT52bGRiLm5hbWUpICYmCisJICAgICB2bG9jYXRpb24tPnZsZGIubmFtZVtuYW1lc3pdICE9ICdcMCcpIHx8CisJICAgIG1lbWNtcCh2bGRiLm5hbWUsIG5hbWUsIG5hbWVzeikgIT0gMCkKKwkJcHJpbnRrKCJrQUZTOiBuYW1lIG9mIHZvbHVtZSAnJSouKnMnIGNoYW5nZWQgdG8gJyVzJyBvbiBzZXJ2ZXJcbiIsCisJCSAgICAgICBuYW1lc3osIG5hbWVzeiwgbmFtZSwgdmxkYi5uYW1lKTsKKworCW1lbWNweSgmdmxvY2F0aW9uLT52bGRiLCAmdmxkYiwgc2l6ZW9mKHZsb2NhdGlvbi0+dmxkYikpOworCisJYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoJnZsb2NhdGlvbi0+dXBkX3RpbWVyLCAxMCAqIEhaKTsKKworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwkvKiB1cGRhdGUgdm9sdW1lIGVudHJ5IGluIGxvY2FsIGNhY2hlICovCisJY2FjaGVmc191cGRhdGVfY29va2llKHZsb2NhdGlvbi0+Y2FjaGUpOworI2VuZGlmCisKKwkqX3Zsb2NhdGlvbiA9IHZsb2NhdGlvbjsKKwlfbGVhdmUoIiA9IDAgKCVwKSIsdmxvY2F0aW9uKTsKKwlyZXR1cm4gMDsKKworIGVycm9yOgorCWlmICh2bG9jYXRpb24pIHsKKwkJaWYgKGFjdGl2ZSkgeworCQkJX19hZnNfcHV0X3Zsb2NhdGlvbih2bG9jYXRpb24pOworCQl9CisJCWVsc2UgeworCQkJbGlzdF9kZWwoJnZsb2NhdGlvbi0+bGluayk7CisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorCQkJY2FjaGVmc19yZWxpbnF1aXNoX2Nvb2tpZSh2bG9jYXRpb24tPmNhY2hlLCAwKTsKKyNlbmRpZgorCQkJYWZzX3B1dF9jZWxsKHZsb2NhdGlvbi0+Y2VsbCk7CisJCQlrZnJlZSh2bG9jYXRpb24pOworCQl9CisJfQorCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30gLyogZW5kIGFmc192bG9jYXRpb25fbG9va3VwKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGZpbmlzaCB1c2luZyBhIHZvbHVtZSBsb2NhdGlvbiByZWNvcmQKKyAqIC0gY2FsbGVyIG11c3QgaGF2ZSBjZWxsLT52b2xfc2VtIHdyaXRlLWxvY2tlZAorICovCitzdGF0aWMgdm9pZCBfX2Fmc19wdXRfdmxvY2F0aW9uKHN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24pCit7CisJc3RydWN0IGFmc19jZWxsICpjZWxsOworCisJaWYgKCF2bG9jYXRpb24pCisJCXJldHVybjsKKworCV9lbnRlcigiJXMiLCB2bG9jYXRpb24tPnZsZGIubmFtZSk7CisKKwljZWxsID0gdmxvY2F0aW9uLT5jZWxsOworCisJLyogc2FuaXR5IGNoZWNrICovCisJQlVHX09OKGF0b21pY19yZWFkKCZ2bG9jYXRpb24tPnVzYWdlKSA8PSAwKTsKKworCXNwaW5fbG9jaygmY2VsbC0+dmxfZ3lsb2NrKTsKKwlpZiAobGlrZWx5KCFhdG9taWNfZGVjX2FuZF90ZXN0KCZ2bG9jYXRpb24tPnVzYWdlKSkpIHsKKwkJc3Bpbl91bmxvY2soJmNlbGwtPnZsX2d5bG9jayk7CisJCV9sZWF2ZSgiIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBtb3ZlIHRvIGdyYXZleWFyZCBxdWV1ZSAqLworCWxpc3RfZGVsKCZ2bG9jYXRpb24tPmxpbmspOworCWxpc3RfYWRkX3RhaWwoJnZsb2NhdGlvbi0+bGluaywmY2VsbC0+dmxfZ3JhdmV5YXJkKTsKKworCS8qIHJlbW92ZSBmcm9tIHBlbmRpbmcgdGltZW91dCBxdWV1ZSAocmVmY291bnRlZCBpZiBhY3R1YWxseSBiZWluZworCSAqIHVwZGF0ZWQpICovCisJbGlzdF9kZWxfaW5pdCgmdmxvY2F0aW9uLT51cGRfb3AubGluayk7CisKKwkvKiB0aW1lIG91dCBpbiAxMCBzZWNzICovCisJYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoJnZsb2NhdGlvbi0+dXBkX3RpbWVyKTsKKwlhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcigmdmxvY2F0aW9uLT50aW1lb3V0LCAxMCAqIEhaKTsKKworCXNwaW5fdW5sb2NrKCZjZWxsLT52bF9neWxvY2spOworCisJX2xlYXZlKCIgW2tpbGxlZF0iKTsKK30gLyogZW5kIF9fYWZzX3B1dF92bG9jYXRpb24oKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZmluaXNoIHVzaW5nIGEgdm9sdW1lIGxvY2F0aW9uIHJlY29yZAorICovCit2b2lkIGFmc19wdXRfdmxvY2F0aW9uKHN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24pCit7CisJaWYgKHZsb2NhdGlvbikgeworCQlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSB2bG9jYXRpb24tPmNlbGw7CisKKwkJZG93bl93cml0ZSgmY2VsbC0+dmxfc2VtKTsKKwkJX19hZnNfcHV0X3Zsb2NhdGlvbih2bG9jYXRpb24pOworCQl1cF93cml0ZSgmY2VsbC0+dmxfc2VtKTsKKwl9Cit9IC8qIGVuZCBhZnNfcHV0X3Zsb2NhdGlvbigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiB0aW1lb3V0IHZsb2NhdGlvbiByZWNvcmQKKyAqIC0gcmVtb3ZlcyBmcm9tIHRoZSBjZWxsJ3MgZ3JhdmV5YXJkIGlmIHRoZSB1c2FnZSBjb3VudCBpcyB6ZXJvCisgKi8KK3ZvaWQgYWZzX3Zsb2NhdGlvbl9kb190aW1lb3V0KHN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24pCit7CisJc3RydWN0IGFmc19jZWxsICpjZWxsOworCisJX2VudGVyKCIlcyIsIHZsb2NhdGlvbi0+dmxkYi5uYW1lKTsKKworCWNlbGwgPSB2bG9jYXRpb24tPmNlbGw7CisKKwlCVUdfT04oYXRvbWljX3JlYWQoJnZsb2NhdGlvbi0+dXNhZ2UpIDwgMCk7CisKKwkvKiByZW1vdmUgZnJvbSBncmF2ZXlhcmQgaWYgc3RpbGwgZGVhZCAqLworCXNwaW5fbG9jaygmY2VsbC0+dmxfZ3lsb2NrKTsKKwlpZiAoYXRvbWljX3JlYWQoJnZsb2NhdGlvbi0+dXNhZ2UpID09IDApCisJCWxpc3RfZGVsX2luaXQoJnZsb2NhdGlvbi0+bGluayk7CisJZWxzZQorCQl2bG9jYXRpb24gPSBOVUxMOworCXNwaW5fdW5sb2NrKCZjZWxsLT52bF9neWxvY2spOworCisJaWYgKCF2bG9jYXRpb24pIHsKKwkJX2xlYXZlKCIiKTsKKwkJcmV0dXJuOyAvKiByZXN1cnJlY3RlZCAqLworCX0KKworCS8qIHdlIGNhbiBub3cgZGVzdHJveSBpdCBwcm9wZXJseSAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwljYWNoZWZzX3JlbGlucXVpc2hfY29va2llKHZsb2NhdGlvbi0+Y2FjaGUsIDApOworI2VuZGlmCisJYWZzX3B1dF9jZWxsKGNlbGwpOworCisJa2ZyZWUodmxvY2F0aW9uKTsKKworCV9sZWF2ZSgiIFtkZXN0cm95ZWRdIik7Cit9IC8qIGVuZCBhZnNfdmxvY2F0aW9uX2RvX3RpbWVvdXQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogc2VuZCBhbiB1cGRhdGUgb3BlcmF0aW9uIHRvIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc2VydmVyCisgKi8KK3N0YXRpYyBpbnQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfYmVnaW4oc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbikKK3sKKwlhZnNfdm9sdHlwZV90IHZvbHR5cGU7CisJYWZzX3ZvbGlkX3QgdmlkOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVze3Vmcz0ldSB1Y3M9JXV9IiwKKwkgICAgICAgdmxvY2F0aW9uLT52bGRiLm5hbWUsCisJICAgICAgIHZsb2NhdGlvbi0+dXBkX2ZpcnN0X3N2aXgsCisJICAgICAgIHZsb2NhdGlvbi0+dXBkX2N1cnJfc3ZpeCk7CisKKwkvKiB0cnkgdG8gbG9vayB1cCBhIGNhY2hlZCB2b2x1bWUgaW4gdGhlIGNlbGwgVkwgZGF0YWJhc2VzIGJ5IElEICovCisJaWYgKHZsb2NhdGlvbi0+dmxkYi52aWRtYXNrICYgQUZTX1ZPTF9WVE1fUlcpIHsKKwkJdmlkID0gdmxvY2F0aW9uLT52bGRiLnZpZFswXTsKKwkJdm9sdHlwZSA9IEFGU1ZMX1JXVk9MOworCX0KKwllbHNlIGlmICh2bG9jYXRpb24tPnZsZGIudmlkbWFzayAmIEFGU19WT0xfVlRNX1JPKSB7CisJCXZpZCA9IHZsb2NhdGlvbi0+dmxkYi52aWRbMV07CisJCXZvbHR5cGUgPSBBRlNWTF9ST1ZPTDsKKwl9CisJZWxzZSBpZiAodmxvY2F0aW9uLT52bGRiLnZpZG1hc2sgJiBBRlNfVk9MX1ZUTV9CQUspIHsKKwkJdmlkID0gdmxvY2F0aW9uLT52bGRiLnZpZFsyXTsKKwkJdm9sdHlwZSA9IEFGU1ZMX0JBQ0tWT0w7CisJfQorCWVsc2UgeworCQlCVUcoKTsKKwkJdmlkID0gMDsKKwkJdm9sdHlwZSA9IDA7CisJfQorCisJLyogY29udGFjdCB0aGUgY2hvc2VuIHNlcnZlciAqLworCXJldCA9IGFmc19zZXJ2ZXJfbG9va3VwKAorCQl2bG9jYXRpb24tPmNlbGwsCisJCSZ2bG9jYXRpb24tPmNlbGwtPnZsX2FkZHJzW3Zsb2NhdGlvbi0+dXBkX2N1cnJfc3ZpeF0sCisJCSZ2bG9jYXRpb24tPnVwZF9vcC5zZXJ2ZXIpOworCisJc3dpdGNoIChyZXQpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgLUVOT01FTToKKwljYXNlIC1FTk9ORVQ6CisJZGVmYXVsdDoKKwkJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogaW5pdGlhdGUgdGhlIHVwZGF0ZSBvcGVyYXRpb24gKi8KKwlyZXQgPSBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWRfYXN5bmMoJnZsb2NhdGlvbi0+dXBkX29wLCB2aWQsIHZvbHR5cGUpOworCWlmIChyZXQgPCAwKSB7CisJCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9IC8qIGVuZCBhZnNfdmxvY2F0aW9uX3VwZGF0ZV9iZWdpbigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBhYmFuZG9uIHVwZGF0aW5nIGEgVkwgcmVjb3JkCisgKiAtIGRvZXMgbm90IHJlc3RhcnQgdGhlIHVwZGF0ZSB0aW1lcgorICovCitzdGF0aWMgdm9pZCBhZnNfdmxvY2F0aW9uX3VwZGF0ZV9hYmFuZG9uKHN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24sCisJCQkJCSBhZnNfdmxvY2F0aW9uX3VwZF90IHN0YXRlLAorCQkJCQkgaW50IHJldCkKK3sKKwlfZW50ZXIoIiVzLCV1IiwgdmxvY2F0aW9uLT52bGRiLm5hbWUsIHN0YXRlKTsKKworCWlmIChyZXQgPCAwKQorCQlwcmludGsoImtBRlM6IEFiYW5kb25pbmcgVkwgdXBkYXRlICclcyc6ICVkXG4iLAorCQkgICAgICAgdmxvY2F0aW9uLT52bGRiLm5hbWUsIHJldCk7CisKKwkvKiBkaXNjYXJkIHRoZSBzZXJ2ZXIgcmVjb3JkICovCisJYWZzX3B1dF9zZXJ2ZXIodmxvY2F0aW9uLT51cGRfb3Auc2VydmVyKTsKKwl2bG9jYXRpb24tPnVwZF9vcC5zZXJ2ZXIgPSBOVUxMOworCisJc3Bpbl9sb2NrKCZhZnNfdmxvY2F0aW9uX3VwZGF0ZV9sb2NrKTsKKwlhZnNfdmxvY2F0aW9uX3VwZGF0ZSA9IE5VTEw7CisJdmxvY2F0aW9uLT51cGRfc3RhdGUgPSBzdGF0ZTsKKworCS8qIFRPRE86IHN0YXJ0IHVwZGF0aW5nIG5leHQgVkwgcmVjb3JkIG9uIHBlbmRpbmcgbGlzdCAqLworCisJc3Bpbl91bmxvY2soJmFmc192bG9jYXRpb25fdXBkYXRlX2xvY2spOworCisJX2xlYXZlKCIiKTsKK30gLyogZW5kIGFmc192bG9jYXRpb25fdXBkYXRlX2FiYW5kb24oKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaGFuZGxlIHBlcmlvZGljIHVwZGF0ZSB0aW1lb3V0cyBhbmQgYnVzeSByZXRyeSB0aW1lb3V0cworICogLSBjYWxsZWQgZnJvbSBrYWZzdGltb2QKKyAqLworc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfdGltZXIoc3RydWN0IGFmc190aW1lciAqdGltZXIpCit7CisJc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbiA9CisJCWxpc3RfZW50cnkodGltZXIsIHN0cnVjdCBhZnNfdmxvY2F0aW9uLCB1cGRfdGltZXIpOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVzIiwgdmxvY2F0aW9uLT52bGRiLm5hbWUpOworCisJLyogb25seSB1cGRhdGUgaWYgbm90IGluIHRoZSBncmF2ZXlhcmQgKGRlZmVuZCBhZ2FpbnN0IHB1dHRpbmcgdG9vKSAqLworCXNwaW5fbG9jaygmdmxvY2F0aW9uLT5jZWxsLT52bF9neWxvY2spOworCisJaWYgKCFhdG9taWNfcmVhZCgmdmxvY2F0aW9uLT51c2FnZSkpCisJCWdvdG8gb3V0X3VubG9jazE7CisKKwlzcGluX2xvY2soJmFmc192bG9jYXRpb25fdXBkYXRlX2xvY2spOworCisJLyogaWYgd2Ugd2VyZSB3b2tlbiB1cCBkdWUgdG8gRUJVU1kgc2xlZXAgdGhlbiByZXN0YXJ0IGltbWVkaWF0ZWx5IGlmCisJICogcG9zc2libGUgb3IgZWxzZSBqdW1wIHRvIGZyb250IG9mIHBlbmRpbmcgcXVldWUgKi8KKwlpZiAodmxvY2F0aW9uLT51cGRfc3RhdGUgPT0gQUZTX1ZMVVBEX0JVU1lTTEVFUCkgeworCQlpZiAoYWZzX3Zsb2NhdGlvbl91cGRhdGUpIHsKKwkJCWxpc3RfYWRkKCZ2bG9jYXRpb24tPnVwZF9vcC5saW5rLAorCQkJCSAmYWZzX3Zsb2NhdGlvbl91cGRhdGVfcGVuZHEpOworCQl9CisJCWVsc2UgeworCQkJYWZzX2dldF92bG9jYXRpb24odmxvY2F0aW9uKTsKKwkJCWFmc192bG9jYXRpb25fdXBkYXRlID0gdmxvY2F0aW9uOworCQkJdmxvY2F0aW9uLT51cGRfc3RhdGUgPSBBRlNfVkxVUERfSU5QUk9HUkVTUzsKKwkJfQorCQlnb3RvIG91dF91bmxvY2syOworCX0KKworCS8qIHB1dCBvbiBwZW5kaW5nIHF1ZXVlIGlmIHRoZXJlJ3MgYWxyZWFkeSBhbm90aGVyIHVwZGF0ZSBpbiBwcm9ncmVzcyAqLworCWlmIChhZnNfdmxvY2F0aW9uX3VwZGF0ZSkgeworCQl2bG9jYXRpb24tPnVwZF9zdGF0ZSA9IEFGU19WTFVQRF9QRU5ESU5HOworCQlsaXN0X2FkZF90YWlsKCZ2bG9jYXRpb24tPnVwZF9vcC5saW5rLAorCQkJICAgICAgJmFmc192bG9jYXRpb25fdXBkYXRlX3BlbmRxKTsKKwkJZ290byBvdXRfdW5sb2NrMjsKKwl9CisKKwkvKiBob2xkIGEgcmVmIG9uIGl0IHdoaWxlIGFjdHVhbGx5IHVwZGF0aW5nICovCisJYWZzX2dldF92bG9jYXRpb24odmxvY2F0aW9uKTsKKwlhZnNfdmxvY2F0aW9uX3VwZGF0ZSA9IHZsb2NhdGlvbjsKKwl2bG9jYXRpb24tPnVwZF9zdGF0ZSA9IEFGU19WTFVQRF9JTlBST0dSRVNTOworCisJc3Bpbl91bmxvY2soJmFmc192bG9jYXRpb25fdXBkYXRlX2xvY2spOworCXNwaW5fdW5sb2NrKCZ2bG9jYXRpb24tPmNlbGwtPnZsX2d5bG9jayk7CisKKwkvKiBva2F5Li4uIHdlIGNhbiBzdGFydCB0aGUgdXBkYXRlICovCisJX2RlYnVnKCJCRUdJTiBWTCBVUERBVEUgWyVzXSIsIHZsb2NhdGlvbi0+dmxkYi5uYW1lKTsKKwl2bG9jYXRpb24tPnVwZF9maXJzdF9zdml4ID0gdmxvY2F0aW9uLT5jZWxsLT52bF9jdXJyX3N2aXg7CisJdmxvY2F0aW9uLT51cGRfY3Vycl9zdml4ID0gdmxvY2F0aW9uLT51cGRfZmlyc3Rfc3ZpeDsKKwl2bG9jYXRpb24tPnVwZF9yZWpfY250ID0gMDsKKwl2bG9jYXRpb24tPnVwZF9idXN5X2NudCA9IDA7CisKKwlyZXQgPSBhZnNfdmxvY2F0aW9uX3VwZGF0ZV9iZWdpbih2bG9jYXRpb24pOworCWlmIChyZXQgPCAwKSB7CisJCWFmc192bG9jYXRpb25fdXBkYXRlX2FiYW5kb24odmxvY2F0aW9uLCBBRlNfVkxVUERfU0xFRVAsIHJldCk7CisJCWFmc19rYWZzdGltb2RfYWRkX3RpbWVyKCZ2bG9jYXRpb24tPnVwZF90aW1lciwKKwkJCQkJQUZTX1ZMREJfVElNRU9VVCk7CisJCWFmc19wdXRfdmxvY2F0aW9uKHZsb2NhdGlvbik7CisJfQorCisJX2xlYXZlKCIiKTsKKwlyZXR1cm47CisKKyBvdXRfdW5sb2NrMjoKKwlzcGluX3VubG9jaygmYWZzX3Zsb2NhdGlvbl91cGRhdGVfbG9jayk7Cisgb3V0X3VubG9jazE6CisJc3Bpbl91bmxvY2soJnZsb2NhdGlvbi0+Y2VsbC0+dmxfZ3lsb2NrKTsKKwlfbGVhdmUoIiIpOworCXJldHVybjsKKworfSAvKiBlbmQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfdGltZXIoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogYXR0ZW5kIHRvIGFuIHVwZGF0ZSBvcGVyYXRpb24gdXBvbiB3aGljaCBhbiBldmVudCBoYXBwZW5lZAorICogLSBjYWxsZWQgaW4ga2Fmc2FzeW5jZCBjb250ZXh0CisgKi8KK3N0YXRpYyB2b2lkIGFmc192bG9jYXRpb25fdXBkYXRlX2F0dGVuZChzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCkKK3sKKwlzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiB2bGRiOworCXN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24gPQorCQlsaXN0X2VudHJ5KG9wLCBzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiwgdXBkX29wKTsKKwl1bnNpZ25lZCB0bXA7CisJaW50IHJldDsKKworCV9lbnRlcigiJXMiLCB2bG9jYXRpb24tPnZsZGIubmFtZSk7CisKKwlyZXQgPSBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWRfYXN5bmMyKG9wLCAmdmxkYik7CisJc3dpdGNoIChyZXQpIHsKKwljYXNlIC1FQUdBSU46CisJCV9sZWF2ZSgiIFt1bmZpbmlzaGVkXSIpOworCQlyZXR1cm47CisKKwljYXNlIDA6CisJCV9kZWJ1ZygiRU5EIFZMIFVQREFURTogJWRcbiIsIHJldCk7CisJCXZsb2NhdGlvbi0+dmFsaWQgPSAxOworCisJCV9kZWJ1ZygiRG9uZSBWTCBMb29rdXA6ICUwMnggeyAlMDh4KCV4KSAlMDh4KCV4KSAlMDh4KCV4KSB9IiwKKwkJICAgICAgIHZsZGIudmlkbWFzaywKKwkJICAgICAgIG50b2hsKHZsZGIuc2VydmVyc1swXS5zX2FkZHIpLCB2bGRiLnNydnRtYXNrWzBdLAorCQkgICAgICAgbnRvaGwodmxkYi5zZXJ2ZXJzWzFdLnNfYWRkciksIHZsZGIuc3J2dG1hc2tbMV0sCisJCSAgICAgICBudG9obCh2bGRiLnNlcnZlcnNbMl0uc19hZGRyKSwgdmxkYi5zcnZ0bWFza1syXQorCQkgICAgICAgKTsKKworCQlfZGVidWcoIlZpZHM6ICUwOHggJTA4eCAlMDh4IiwKKwkJICAgICAgIHZsZGIudmlkWzBdLCB2bGRiLnZpZFsxXSwgdmxkYi52aWRbMl0pOworCisJCWFmc192bG9jYXRpb25fdXBkYXRlX2FiYW5kb24odmxvY2F0aW9uLCBBRlNfVkxVUERfU0xFRVAsIDApOworCisJCWRvd25fd3JpdGUoJnZsb2NhdGlvbi0+Y2VsbC0+dmxfc2VtKTsKKworCQkvKiBhY3R1YWxseSB1cGRhdGUgdGhlIGNhY2hlICovCisJCWlmIChzdHJuY21wKHZsZGIubmFtZSwgdmxvY2F0aW9uLT52bGRiLm5hbWUsCisJCQkgICAgc2l6ZW9mKHZsb2NhdGlvbi0+dmxkYi5uYW1lKSkgIT0gMCkKKwkJCXByaW50aygia0FGUzogbmFtZSBvZiB2b2x1bWUgJyVzJyIKKwkJCSAgICAgICAiIGNoYW5nZWQgdG8gJyVzJyBvbiBzZXJ2ZXJcbiIsCisJCQkgICAgICAgdmxvY2F0aW9uLT52bGRiLm5hbWUsIHZsZGIubmFtZSk7CisKKwkJbWVtY3B5KCZ2bG9jYXRpb24tPnZsZGIsICZ2bGRiLCBzaXplb2YodmxvY2F0aW9uLT52bGRiKSk7CisKKyNpZiAwCisJCS8qIFRPRE8gdXBkYXRlIHZvbHVtZSBlbnRyeSBpbiBsb2NhbCBjYWNoZSAqLworI2VuZGlmCisKKwkJdXBfd3JpdGUoJnZsb2NhdGlvbi0+Y2VsbC0+dmxfc2VtKTsKKworCQlpZiAocmV0IDwgMCkKKwkJCXByaW50aygia0FGUzogZmFpbGVkIHRvIHVwZGF0ZSBsb2NhbCBjYWNoZTogJWRcbiIsIHJldCk7CisKKwkJYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoJnZsb2NhdGlvbi0+dXBkX3RpbWVyLAorCQkJCQlBRlNfVkxEQl9USU1FT1VUKTsKKwkJYWZzX3B1dF92bG9jYXRpb24odmxvY2F0aW9uKTsKKwkJX2xlYXZlKCIgW2ZvdW5kXSIpOworCQlyZXR1cm47CisKKwljYXNlIC1FTk9NRURJVU06CisJCXZsb2NhdGlvbi0+dXBkX3Jlal9jbnQrKzsKKwkJZ290byB0cnlfbmV4dDsKKworCQkvKiB0aGUgc2VydmVyIGlzIGxvY2tlZCAtIHJldHJ5IGluIGEgdmVyeSBzaG9ydCB3aGlsZSAqLworCWNhc2UgLUVCVVNZOgorCQl2bG9jYXRpb24tPnVwZF9idXN5X2NudCsrOworCQlpZiAodmxvY2F0aW9uLT51cGRfYnVzeV9jbnQgPiAzKQorCQkJZ290byB0cnlfbmV4dDsgLyogdG9vIG1hbnkgcmV0cmllcyAqLworCisJCWFmc192bG9jYXRpb25fdXBkYXRlX2FiYW5kb24odmxvY2F0aW9uLAorCQkJCQkgICAgIEFGU19WTFVQRF9CVVNZU0xFRVAsIDApOworCQlhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcigmdmxvY2F0aW9uLT51cGRfdGltZXIsIEhaIC8gMik7CisJCWFmc19wdXRfdmxvY2F0aW9uKHZsb2NhdGlvbik7CisJCV9sZWF2ZSgiIFtidXN5XSIpOworCQlyZXR1cm47CisKKwljYXNlIC1FTkVUVU5SRUFDSDoKKwljYXNlIC1FSE9TVFVOUkVBQ0g6CisJY2FzZSAtRUNPTk5SRUZVU0VEOgorCWNhc2UgLUVSRU1PVEVJTzoKKwkJLyogcmVjb3JkIGJhZCB2bHNlcnZlciBpbmZvIGluIHRoZSBjZWxsIHRvbworCQkgKiAtIFRPRE86IHVzZSBkb3duX3dyaXRlX3RyeWxvY2soKSBpZiBhdmFpbGFibGUKKwkJICovCisJCWlmICh2bG9jYXRpb24tPnVwZF9jdXJyX3N2aXggPT0gdmxvY2F0aW9uLT5jZWxsLT52bF9jdXJyX3N2aXgpCisJCQl2bG9jYXRpb24tPmNlbGwtPnZsX2N1cnJfc3ZpeCA9CisJCQkJdmxvY2F0aW9uLT5jZWxsLT52bF9jdXJyX3N2aXggJQorCQkJCXZsb2NhdGlvbi0+Y2VsbC0+dmxfbmFkZHJzOworCisJY2FzZSAtRUJBRFJRQzoKKwljYXNlIC1FSU5WQUw6CisJY2FzZSAtRUFDQ0VTOgorCWNhc2UgLUVCQURNU0c6CisJCWdvdG8gdHJ5X25leHQ7CisKKwlkZWZhdWx0OgorCQlnb3RvIGFiYW5kb247CisJfQorCisJLyogdHJ5IGNvbnRhY3RpbmcgdGhlIG5leHQgc2VydmVyICovCisgdHJ5X25leHQ6CisJdmxvY2F0aW9uLT51cGRfYnVzeV9jbnQgPSAwOworCisJLyogZGlzY2FyZCB0aGUgc2VydmVyIHJlY29yZCAqLworCWFmc19wdXRfc2VydmVyKHZsb2NhdGlvbi0+dXBkX29wLnNlcnZlcik7CisJdmxvY2F0aW9uLT51cGRfb3Auc2VydmVyID0gTlVMTDsKKworCXRtcCA9IHZsb2NhdGlvbi0+Y2VsbC0+dmxfbmFkZHJzOworCWlmICh0bXAgPT0gMCkKKwkJZ290byBhYmFuZG9uOworCisJdmxvY2F0aW9uLT51cGRfY3Vycl9zdml4Kys7CisJaWYgKHZsb2NhdGlvbi0+dXBkX2N1cnJfc3ZpeCA+PSB0bXApCisJCXZsb2NhdGlvbi0+dXBkX2N1cnJfc3ZpeCA9IDA7CisJaWYgKHZsb2NhdGlvbi0+dXBkX2ZpcnN0X3N2aXggPj0gdG1wKQorCQl2bG9jYXRpb24tPnVwZF9maXJzdF9zdml4ID0gdG1wIC0gMTsKKworCS8qIG1vdmUgdG8gdGhlIG5leHQgc2VydmVyICovCisJaWYgKHZsb2NhdGlvbi0+dXBkX2N1cnJfc3ZpeCAhPSB2bG9jYXRpb24tPnVwZF9maXJzdF9zdml4KSB7CisJCWFmc192bG9jYXRpb25fdXBkYXRlX2JlZ2luKHZsb2NhdGlvbik7CisJCV9sZWF2ZSgiIFtuZXh0XSIpOworCQlyZXR1cm47CisJfQorCisJLyogcnVuIG91dCBvZiBzZXJ2ZXJzIHRvIHRyeSAtIHdhcyB0aGUgdm9sdW1lIHJlamVjdGVkPyAqLworCWlmICh2bG9jYXRpb24tPnVwZF9yZWpfY250ID4gMCkgeworCQlwcmludGsoImtBRlM6IEFjdGl2ZSB2b2x1bWUgbm8gbG9uZ2VyIHZhbGlkICclcydcbiIsCisJCSAgICAgICB2bG9jYXRpb24tPnZsZGIubmFtZSk7CisJCXZsb2NhdGlvbi0+dmFsaWQgPSAwOworCQlhZnNfdmxvY2F0aW9uX3VwZGF0ZV9hYmFuZG9uKHZsb2NhdGlvbiwgQUZTX1ZMVVBEX1NMRUVQLCAwKTsKKwkJYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoJnZsb2NhdGlvbi0+dXBkX3RpbWVyLAorCQkJCQlBRlNfVkxEQl9USU1FT1VUKTsKKwkJYWZzX3B1dF92bG9jYXRpb24odmxvY2F0aW9uKTsKKwkJX2xlYXZlKCIgW2ludmFsaWRhdGVkXSIpOworCQlyZXR1cm47CisJfQorCisJLyogYWJhbmRvbiB0aGUgdXBkYXRlICovCisgYWJhbmRvbjoKKwlhZnNfdmxvY2F0aW9uX3VwZGF0ZV9hYmFuZG9uKHZsb2NhdGlvbiwgQUZTX1ZMVVBEX1NMRUVQLCByZXQpOworCWFmc19rYWZzdGltb2RfYWRkX3RpbWVyKCZ2bG9jYXRpb24tPnVwZF90aW1lciwgSFogKiAxMCk7CisJYWZzX3B1dF92bG9jYXRpb24odmxvY2F0aW9uKTsKKwlfbGVhdmUoIiBbYWJhbmRvbmVkXSIpOworCit9IC8qIGVuZCBhZnNfdmxvY2F0aW9uX3VwZGF0ZV9hdHRlbmQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZGVhbCB3aXRoIGFuIHVwZGF0ZSBvcGVyYXRpb24gYmVpbmcgZGlzY2FyZGVkCisgKiAtIGNhbGxlZCBpbiBrYWZzYXN5bmNkIGNvbnRleHQgd2hlbiBpdCdzIGR5aW5nIGR1ZSB0byBybW1vZAorICogLSB0aGUgY2FsbCBoYXMgYWxyZWFkeSBiZWVuIGFib3J0ZWQgYW5kIHB1dCgpJ2QKKyAqLworc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfZGlzY2FyZChzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCkKK3sKKwlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uID0KKwkJbGlzdF9lbnRyeShvcCwgc3RydWN0IGFmc192bG9jYXRpb24sIHVwZF9vcCk7CisKKwlfZW50ZXIoIiVzIiwgdmxvY2F0aW9uLT52bGRiLm5hbWUpOworCisJYWZzX3B1dF9zZXJ2ZXIob3AtPnNlcnZlcik7CisJb3AtPnNlcnZlciA9IE5VTEw7CisKKwlhZnNfcHV0X3Zsb2NhdGlvbih2bG9jYXRpb24pOworCisJX2xlYXZlKCIiKTsKK30gLyogZW5kIGFmc192bG9jYXRpb25fdXBkYXRlX2Rpc2NhcmQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbWF0Y2ggYSBWTERCIHJlY29yZCBzdG9yZWQgaW4gdGhlIGNhY2hlCisgKiAtIG1heSBhbHNvIGxvYWQgdGFyZ2V0IGZyb20gZW50cnkKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyBjYWNoZWZzX21hdGNoX3ZhbF90IGFmc192bG9jYXRpb25fY2FjaGVfbWF0Y2godm9pZCAqdGFyZ2V0LAorCQkJCQkJICAgICBjb25zdCB2b2lkICplbnRyeSkKK3sKKwljb25zdCBzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqdmxkYiA9IGVudHJ5OworCXN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24gPSB0YXJnZXQ7CisKKwlfZW50ZXIoInslc30seyVzfSIsIHZsb2NhdGlvbi0+dmxkYi5uYW1lLCB2bGRiLT5uYW1lKTsKKworCWlmIChzdHJuY21wKHZsb2NhdGlvbi0+dmxkYi5uYW1lLCB2bGRiLT5uYW1lLCBzaXplb2YodmxkYi0+bmFtZSkpID09IDAKKwkgICAgKSB7CisJCWlmICghdmxvY2F0aW9uLT52YWxpZCB8fAorCQkgICAgdmxvY2F0aW9uLT52bGRiLnJ0aW1lID09IHZsZGItPnJ0aW1lCisJCSAgICApIHsKKwkJCXZsb2NhdGlvbi0+dmxkYiA9ICp2bGRiOworCQkJdmxvY2F0aW9uLT52YWxpZCA9IDE7CisJCQlfbGVhdmUoIiA9IFNVQ0NFU1MgW2MtPm1dIik7CisJCQlyZXR1cm4gQ0FDSEVGU19NQVRDSF9TVUNDRVNTOworCQl9CisJCS8qIG5lZWQgdG8gdXBkYXRlIGNhY2hlIGlmIGNhY2hlZCBpbmZvIGRpZmZlcnMgKi8KKwkJZWxzZSBpZiAobWVtY21wKCZ2bG9jYXRpb24tPnZsZGIsIHZsZGIsIHNpemVvZigqdmxkYikpICE9IDApIHsKKwkJCS8qIGRlbGV0ZSBpZiBWSURzIGZvciB0aGlzIG5hbWUgZGlmZmVyICovCisJCQlpZiAobWVtY21wKCZ2bG9jYXRpb24tPnZsZGIudmlkLAorCQkJCSAgICZ2bGRiLT52aWQsCisJCQkJICAgc2l6ZW9mKHZsZGItPnZpZCkpICE9IDApIHsKKwkJCQlfbGVhdmUoIiA9IERFTEVURSIpOworCQkJCXJldHVybiBDQUNIRUZTX01BVENIX1NVQ0NFU1NfREVMRVRFOworCQkJfQorCisJCQlfbGVhdmUoIiA9IFVQREFURSIpOworCQkJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfU1VDQ0VTU19VUERBVEU7CisJCX0KKwkJZWxzZSB7CisJCQlfbGVhdmUoIiA9IFNVQ0NFU1MiKTsKKwkJCXJldHVybiBDQUNIRUZTX01BVENIX1NVQ0NFU1M7CisJCX0KKwl9CisKKwlfbGVhdmUoIiA9IEZBSUxFRCIpOworCXJldHVybiBDQUNIRUZTX01BVENIX0ZBSUxFRDsKK30gLyogZW5kIGFmc192bG9jYXRpb25fY2FjaGVfbWF0Y2goKSAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiB1cGRhdGUgYSBWTERCIHJlY29yZCBzdG9yZWQgaW4gdGhlIGNhY2hlCisgKi8KKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitzdGF0aWMgdm9pZCBhZnNfdmxvY2F0aW9uX2NhY2hlX3VwZGF0ZSh2b2lkICpzb3VyY2UsIHZvaWQgKmVudHJ5KQoreworCXN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICp2bGRiID0gZW50cnk7CisJc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbiA9IHNvdXJjZTsKKworCV9lbnRlcigiIik7CisKKwkqdmxkYiA9IHZsb2NhdGlvbi0+dmxkYjsKKworfSAvKiBlbmQgYWZzX3Zsb2NhdGlvbl9jYWNoZV91cGRhdGUoKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9hZnMvdm5vZGUuYyBiL2ZzL2Fmcy92bm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NjdmZWYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvdm5vZGUuYwpAQCAtMCwwICsxLDM5NSBAQAorLyogdm5vZGUuYzogQUZTIHZub2RlIG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSAidm9sdW1lLmgiCisjaW5jbHVkZSAiY2VsbC5oIgorI2luY2x1ZGUgImNtc2VydmljZS5oIgorI2luY2x1ZGUgImZzY2xpZW50LmgiCisjaW5jbHVkZSAidmxjbGllbnQuaCIKKyNpbmNsdWRlICJ2bm9kZS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyB2b2lkIGFmc192bm9kZV9jYl90aW1lZF9vdXQoc3RydWN0IGFmc190aW1lciAqdGltZXIpOworCitzdHJ1Y3QgYWZzX3RpbWVyX29wcyBhZnNfdm5vZGVfY2JfdGltZWRfb3V0X29wcyA9IHsKKwkudGltZWRfb3V0CT0gYWZzX3Zub2RlX2NiX3RpbWVkX291dCwKK307CisKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitzdGF0aWMgY2FjaGVmc19tYXRjaF92YWxfdCBhZnNfdm5vZGVfY2FjaGVfbWF0Y2godm9pZCAqdGFyZ2V0LAorCQkJCQkJIGNvbnN0IHZvaWQgKmVudHJ5KTsKK3N0YXRpYyB2b2lkIGFmc192bm9kZV9jYWNoZV91cGRhdGUodm9pZCAqc291cmNlLCB2b2lkICplbnRyeSk7CisKK3N0cnVjdCBjYWNoZWZzX2luZGV4X2RlZiBhZnNfdm5vZGVfY2FjaGVfaW5kZXhfZGVmID0geworCS5uYW1lCQk9ICJ2bm9kZSIsCisJLmRhdGFfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgYWZzX2NhY2hlX3Zub2RlKSwKKwkua2V5c1swXQk9IHsgQ0FDSEVGU19JTkRFWF9LRVlTX0JJTiwgNCB9LAorCS5tYXRjaAkJPSBhZnNfdm5vZGVfY2FjaGVfbWF0Y2gsCisJLnVwZGF0ZQkJPSBhZnNfdm5vZGVfY2FjaGVfdXBkYXRlLAorfTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaGFuZGxlIGEgY2FsbGJhY2sgdGltaW5nIG91dAorICogVE9ETzogcmV0YWluIGEgcmVmIHRvIHZub2RlIHN0cnVjdCBmb3IgYW4gb3V0c3RhbmRpbmcgY2FsbGJhY2sgdGltZW91dAorICovCitzdGF0aWMgdm9pZCBhZnNfdm5vZGVfY2JfdGltZWRfb3V0KHN0cnVjdCBhZnNfdGltZXIgKnRpbWVyKQoreworCXN0cnVjdCBhZnNfc2VydmVyICpvbGRzZXJ2ZXI7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGU7CisKKwl2bm9kZSA9IGxpc3RfZW50cnkodGltZXIsIHN0cnVjdCBhZnNfdm5vZGUsIGNiX3RpbWVvdXQpOworCisJX2VudGVyKCIlcCIsIHZub2RlKTsKKworCS8qIHNldCB0aGUgY2hhbmdlZCBmbGFnIGluIHRoZSB2bm9kZSBhbmQgcmVsZWFzZSB0aGUgc2VydmVyICovCisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwlvbGRzZXJ2ZXIgPSB4Y2hnKCZ2bm9kZS0+Y2Jfc2VydmVyLCBOVUxMKTsKKwlpZiAob2xkc2VydmVyKSB7CisJCXZub2RlLT5mbGFncyB8PSBBRlNfVk5PREVfQ0hBTkdFRDsKKworCQlzcGluX2xvY2soJmFmc19jYl9oYXNoX2xvY2spOworCQlsaXN0X2RlbF9pbml0KCZ2bm9kZS0+Y2JfaGFzaF9saW5rKTsKKwkJc3Bpbl91bmxvY2soJmFmc19jYl9oYXNoX2xvY2spOworCisJCXNwaW5fbG9jaygmb2xkc2VydmVyLT5jYl9sb2NrKTsKKwkJbGlzdF9kZWxfaW5pdCgmdm5vZGUtPmNiX2xpbmspOworCQlzcGluX3VubG9jaygmb2xkc2VydmVyLT5jYl9sb2NrKTsKKwl9CisKKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJYWZzX3B1dF9zZXJ2ZXIob2xkc2VydmVyKTsKKworCV9sZWF2ZSgiIik7Cit9IC8qIGVuZCBhZnNfdm5vZGVfY2JfdGltZWRfb3V0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGZpbmlzaCBvZmYgdXBkYXRpbmcgdGhlIHJlY29yZGVkIHN0YXR1cyBvZiBhIGZpbGUKKyAqIC0gc3RhcnRzIGNhbGxiYWNrIGV4cGlyeSB0aW1lcgorICogLSBhZGRzIHRvIHNlcnZlcidzIGNhbGxiYWNrIGxpc3QKKyAqLworc3RhdGljIHZvaWQgYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCQkJCSAgICAgc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCQkJICAgICBpbnQgcmV0KQoreworCXN0cnVjdCBhZnNfc2VydmVyICpvbGRzZXJ2ZXIgPSBOVUxMOworCisJX2VudGVyKCIlcCwlcCwlZCIsIHZub2RlLCBzZXJ2ZXIsIHJldCk7CisKKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKworCXZub2RlLT5mbGFncyAmPSB+QUZTX1ZOT0RFX0NIQU5HRUQ7CisKKwlpZiAocmV0ID09IDApIHsKKwkJLyogYWRqdXN0IHRoZSBjYWxsYmFjayB0aW1lb3V0IGFwcHJvcHJpYXRlbHkgKi8KKwkJYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoJnZub2RlLT5jYl90aW1lb3V0LAorCQkJCQl2bm9kZS0+Y2JfZXhwaXJ5ICogSFopOworCisJCXNwaW5fbG9jaygmYWZzX2NiX2hhc2hfbG9jayk7CisJCWxpc3RfZGVsKCZ2bm9kZS0+Y2JfaGFzaF9saW5rKTsKKwkJbGlzdF9hZGRfdGFpbCgmdm5vZGUtPmNiX2hhc2hfbGluaywKKwkJCSAgICAgICZhZnNfY2JfaGFzaChzZXJ2ZXIsICZ2bm9kZS0+ZmlkKSk7CisJCXNwaW5fdW5sb2NrKCZhZnNfY2JfaGFzaF9sb2NrKTsKKworCQkvKiBzd2FwIHJlZiB0byBvbGQgY2FsbGJhY2sgc2VydmVyIHdpdGggdGhhdCBmb3IgbmV3IGNhbGxiYWNrCisJCSAqIHNlcnZlciAqLworCQlvbGRzZXJ2ZXIgPSB4Y2hnKCZ2bm9kZS0+Y2Jfc2VydmVyLCBzZXJ2ZXIpOworCQlpZiAob2xkc2VydmVyICE9IHNlcnZlcikgeworCQkJaWYgKG9sZHNlcnZlcikgeworCQkJCXNwaW5fbG9jaygmb2xkc2VydmVyLT5jYl9sb2NrKTsKKwkJCQlsaXN0X2RlbF9pbml0KCZ2bm9kZS0+Y2JfbGluayk7CisJCQkJc3Bpbl91bmxvY2soJm9sZHNlcnZlci0+Y2JfbG9jayk7CisJCQl9CisKKwkJCWFmc19nZXRfc2VydmVyKHNlcnZlcik7CisJCQlzcGluX2xvY2soJnNlcnZlci0+Y2JfbG9jayk7CisJCQlsaXN0X2FkZF90YWlsKCZ2bm9kZS0+Y2JfbGluaywgJnNlcnZlci0+Y2JfcHJvbWlzZXMpOworCQkJc3Bpbl91bmxvY2soJnNlcnZlci0+Y2JfbG9jayk7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBzYW1lIHNlcnZlciAqLworCQkJb2xkc2VydmVyID0gTlVMTDsKKwkJfQorCX0KKwllbHNlIGlmIChyZXQgPT0gLUVOT0VOVCkgeworCQkvKiB0aGUgZmlsZSB3YXMgZGVsZXRlZCAtIGNsZWFyIHRoZSBjYWxsYmFjayB0aW1lb3V0ICovCisJCW9sZHNlcnZlciA9IHhjaGcoJnZub2RlLT5jYl9zZXJ2ZXIsIE5VTEwpOworCQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmdm5vZGUtPmNiX3RpbWVvdXQpOworCisJCV9kZWJ1ZygiZ290IE5PRU5UIGZyb20gc2VydmVyIC0gbWFya2luZyBmaWxlIGRlbGV0ZWQiKTsKKwkJdm5vZGUtPmZsYWdzIHw9IEFGU19WTk9ERV9ERUxFVEVEOworCX0KKworCXZub2RlLT51cGRhdGVfY250LS07CisKKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJd2FrZV91cF9hbGwoJnZub2RlLT51cGRhdGVfd2FpdHEpOworCisJYWZzX3B1dF9zZXJ2ZXIob2xkc2VydmVyKTsKKworCV9sZWF2ZSgiIik7CisKK30gLyogZW5kIGFmc192bm9kZV9maW5hbGlzZV9zdGF0dXNfdXBkYXRlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGZldGNoIGZpbGUgc3RhdHVzIGZyb20gdGhlIHZvbHVtZQorICogLSBkb24ndCBpc3N1ZSBhIGZldGNoIGlmOgorICogICAtIHRoZSBjaGFuZ2VkIGJpdCBpcyBub3Qgc2V0IGFuZCB0aGVyZSdzIGEgdmFsaWQgY2FsbGJhY2sKKyAqICAgLSB0aGVyZSBhcmUgYW55IG91dHN0YW5kaW5nIG9wcyB0aGF0IHdpbGwgZmV0Y2ggdGhlIHN0YXR1cworICogLSBUT0RPIGltcGxlbWVudCBsb2NhbCBjYWNoaW5nCisgKi8KK2ludCBhZnNfdm5vZGVfZmV0Y2hfc3RhdHVzKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJaW50IHJldDsKKworCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisKKwlfZW50ZXIoIiVzLHsldSwldSwldX0iLAorCSAgICAgICB2bm9kZS0+dm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSwKKwkgICAgICAgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsIHZub2RlLT5maWQudW5pcXVlKTsKKworCWlmICghKHZub2RlLT5mbGFncyAmIEFGU19WTk9ERV9DSEFOR0VEKSAmJiB2bm9kZS0+Y2Jfc2VydmVyKSB7CisJCV9sZWF2ZSgiIFt1bmNoYW5nZWRdIik7CisJCXJldHVybiAwOworCX0KKworCWlmICh2bm9kZS0+ZmxhZ3MgJiBBRlNfVk5PREVfREVMRVRFRCkgeworCQlfbGVhdmUoIiBbZGVsZXRlZF0iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwlpZiAoISh2bm9kZS0+ZmxhZ3MgJiBBRlNfVk5PREVfQ0hBTkdFRCkpIHsKKwkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwkJX2xlYXZlKCIgW3VuY2hhbmdlZF0iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHZub2RlLT51cGRhdGVfY250ID4gMCkgeworCQkvKiBzb21lb25lIGVsc2Ugc3RhcnRlZCBhIGZldGNoICovCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJYWRkX3dhaXRfcXVldWUoJnZub2RlLT51cGRhdGVfd2FpdHEsICZteXNlbGYpOworCisJCS8qIHdhaXQgZm9yIHRoZSBzdGF0dXMgdG8gYmUgdXBkYXRlZCAqLworCQlmb3IgKDs7KSB7CisJCQlpZiAoISh2bm9kZS0+ZmxhZ3MgJiBBRlNfVk5PREVfQ0hBTkdFRCkpCisJCQkJYnJlYWs7CisJCQlpZiAodm5vZGUtPmZsYWdzICYgQUZTX1ZOT0RFX0RFTEVURUQpCisJCQkJYnJlYWs7CisKKwkJCS8qIGl0IGdvdCB1cGRhdGVkIGFuZCBpbnZhbGlkYXRlZCBhbGwgYmVmb3JlIHdlIHNhdworCQkJICogaXQgKi8KKwkJCWlmICh2bm9kZS0+dXBkYXRlX2NudCA9PSAwKSB7CisJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnZub2RlLT51cGRhdGVfd2FpdHEsCisJCQkJCQkgICZteXNlbGYpOworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCQkJZ290byBnZXRfYW55d2F5OworCQkJfQorCisJCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJCQlzY2hlZHVsZSgpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCisJCQlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwkJfQorCisJCXJlbW92ZV93YWl0X3F1ZXVlKCZ2bm9kZS0+dXBkYXRlX3dhaXRxLCAmbXlzZWxmKTsKKwkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCQlyZXR1cm4gdm5vZGUtPmZsYWdzICYgQUZTX1ZOT0RFX0RFTEVURUQgPyAtRU5PRU5UIDogMDsKKwl9CisKKyBnZXRfYW55d2F5OgorCS8qIG9rYXkuLi4gd2UncmUgZ29pbmcgdG8gaGF2ZSB0byBpbml0aWF0ZSB0aGUgb3AgKi8KKwl2bm9kZS0+dXBkYXRlX2NudCsrOworCisJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKworCS8qIG1lcmdlIEFGUyBzdGF0dXMgZmV0Y2hlcyBhbmQgY2xlYXIgb3V0c3RhbmRpbmcgY2FsbGJhY2sgb24gdGhpcworCSAqIHZub2RlICovCisJZG8geworCQkvKiBwaWNrIGEgc2VydmVyIHRvIHF1ZXJ5ICovCisJCXJldCA9IGFmc192b2x1bWVfcGlja19maWxlc2VydmVyKHZub2RlLT52b2x1bWUsICZzZXJ2ZXIpOworCQlpZiAocmV0PDApCisJCQlyZXR1cm4gcmV0OworCisJCV9kZWJ1ZygiVVNJTkcgU0VSVkVSOiAlMDh4XG4iLCBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7CisKKwkJcmV0ID0gYWZzX3J4ZnNfZmV0Y2hfZmlsZV9zdGF0dXMoc2VydmVyLCB2bm9kZSwgTlVMTCk7CisKKwl9IHdoaWxlICghYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIodm5vZGUtPnZvbHVtZSwgc2VydmVyLCByZXQpKTsKKworCS8qIGFkanVzdCB0aGUgZmxhZ3MgKi8KKwlhZnNfdm5vZGVfZmluYWxpc2Vfc3RhdHVzX3VwZGF0ZSh2bm9kZSwgc2VydmVyLCByZXQpOworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30gLyogZW5kIGFmc192bm9kZV9mZXRjaF9zdGF0dXMoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZmV0Y2ggZmlsZSBkYXRhIGZyb20gdGhlIHZvbHVtZQorICogLSBUT0RPIGltcGxlbWVudCBjYWNoaW5nIGFuZCBzZXJ2ZXIgZmFpbG92ZXIKKyAqLworaW50IGFmc192bm9kZV9mZXRjaF9kYXRhKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAorCQkJIHN0cnVjdCBhZnNfcnhmc19mZXRjaF9kZXNjcmlwdG9yICpkZXNjKQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJaW50IHJldDsKKworCV9lbnRlcigiJXMseyV1LCV1LCV1fSIsCisJICAgICAgIHZub2RlLT52b2x1bWUtPnZsb2NhdGlvbi0+dmxkYi5uYW1lLAorCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwKKwkgICAgICAgdm5vZGUtPmZpZC52bm9kZSwKKwkgICAgICAgdm5vZGUtPmZpZC51bmlxdWUpOworCisJLyogdGhpcyBvcCB3aWxsIGZldGNoIHRoZSBzdGF0dXMgKi8KKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwl2bm9kZS0+dXBkYXRlX2NudCsrOworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwkvKiBtZXJnZSBpbiBBRlMgc3RhdHVzIGZldGNoZXMgYW5kIGNsZWFyIG91dHN0YW5kaW5nIGNhbGxiYWNrIG9uIHRoaXMKKwkgKiB2bm9kZSAqLworCWRvIHsKKwkJLyogcGljayBhIHNlcnZlciB0byBxdWVyeSAqLworCQlyZXQgPSBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcih2bm9kZS0+dm9sdW1lLCAmc2VydmVyKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCV9kZWJ1ZygiVVNJTkcgU0VSVkVSOiAlMDh4XG4iLCBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7CisKKwkJcmV0ID0gYWZzX3J4ZnNfZmV0Y2hfZmlsZV9kYXRhKHNlcnZlciwgdm5vZGUsIGRlc2MsIE5VTEwpOworCisJfSB3aGlsZSAoIWFmc192b2x1bWVfcmVsZWFzZV9maWxlc2VydmVyKHZub2RlLT52b2x1bWUsIHNlcnZlciwgcmV0KSk7CisKKwkvKiBhZGp1c3QgdGhlIGZsYWdzICovCisJYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUodm5vZGUsIHNlcnZlciwgcmV0KTsKKworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7CisKK30gLyogZW5kIGFmc192bm9kZV9mZXRjaF9kYXRhKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGJyZWFrIGFueSBvdXRzdGFuZGluZyBjYWxsYmFjayBvbiBhIHZub2RlCisgKiAtIG9ubHkgcmVsZXZlbnQgdG8gc2VydmVyIHRoYXQgaXNzdWVkIGl0CisgKi8KK2ludCBhZnNfdm5vZGVfZ2l2ZV91cF9jYWxsYmFjayhzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVzLHsldSwldSwldX0iLAorCSAgICAgICB2bm9kZS0+dm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSwKKwkgICAgICAgdm5vZGUtPmZpZC52aWQsCisJICAgICAgIHZub2RlLT5maWQudm5vZGUsCisJICAgICAgIHZub2RlLT5maWQudW5pcXVlKTsKKworCXNwaW5fbG9jaygmYWZzX2NiX2hhc2hfbG9jayk7CisJbGlzdF9kZWxfaW5pdCgmdm5vZGUtPmNiX2hhc2hfbGluayk7CisJc3Bpbl91bmxvY2soJmFmc19jYl9oYXNoX2xvY2spOworCisJLyogc2V0IHRoZSBjaGFuZ2VkIGZsYWcgaW4gdGhlIHZub2RlIGFuZCByZWxlYXNlIHRoZSBzZXJ2ZXIgKi8KKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKworCWFmc19rYWZzdGltb2RfZGVsX3RpbWVyKCZ2bm9kZS0+Y2JfdGltZW91dCk7CisKKwlzZXJ2ZXIgPSB4Y2hnKCZ2bm9kZS0+Y2Jfc2VydmVyLCBOVUxMKTsKKwlpZiAoc2VydmVyKSB7CisJCXZub2RlLT5mbGFncyB8PSBBRlNfVk5PREVfQ0hBTkdFRDsKKworCQlzcGluX2xvY2soJnNlcnZlci0+Y2JfbG9jayk7CisJCWxpc3RfZGVsX2luaXQoJnZub2RlLT5jYl9saW5rKTsKKwkJc3Bpbl91bmxvY2soJnNlcnZlci0+Y2JfbG9jayk7CisJfQorCisJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKworCXJldCA9IDA7CisJaWYgKHNlcnZlcikgeworCQlyZXQgPSBhZnNfcnhmc19naXZlX3VwX2NhbGxiYWNrKHNlcnZlciwgdm5vZGUpOworCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCX0KKworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9IC8qIGVuZCBhZnNfdm5vZGVfZ2l2ZV91cF9jYWxsYmFjaygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBtYXRjaCBhIHZub2RlIHJlY29yZCBzdG9yZWQgaW4gdGhlIGNhY2hlCisgKi8KKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitzdGF0aWMgY2FjaGVmc19tYXRjaF92YWxfdCBhZnNfdm5vZGVfY2FjaGVfbWF0Y2godm9pZCAqdGFyZ2V0LAorCQkJCQkJIGNvbnN0IHZvaWQgKmVudHJ5KQoreworCWNvbnN0IHN0cnVjdCBhZnNfY2FjaGVfdm5vZGUgKmN2bm9kZSA9IGVudHJ5OworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gdGFyZ2V0OworCisJX2VudGVyKCJ7JXgsJXgsJUx4fSx7JXgsJXgsJUx4fSIsCisJICAgICAgIHZub2RlLT5maWQudm5vZGUsCisJICAgICAgIHZub2RlLT5maWQudW5pcXVlLAorCSAgICAgICB2bm9kZS0+c3RhdHVzLnZlcnNpb24sCisJICAgICAgIGN2bm9kZS0+dm5vZGVfaWQsCisJICAgICAgIGN2bm9kZS0+dm5vZGVfdW5pcXVlLAorCSAgICAgICBjdm5vZGUtPmRhdGFfdmVyc2lvbik7CisKKwlpZiAodm5vZGUtPmZpZC52bm9kZSAhPSBjdm5vZGUtPnZub2RlX2lkKSB7CisJCV9sZWF2ZSgiID0gRkFJTEVEIik7CisJCXJldHVybiBDQUNIRUZTX01BVENIX0ZBSUxFRDsKKwl9CisKKwlpZiAodm5vZGUtPmZpZC51bmlxdWUgIT0gY3Zub2RlLT52bm9kZV91bmlxdWUgfHwKKwkgICAgdm5vZGUtPnN0YXR1cy52ZXJzaW9uICE9IGN2bm9kZS0+ZGF0YV92ZXJzaW9uKSB7CisJCV9sZWF2ZSgiID0gREVMRVRFIik7CisJCXJldHVybiBDQUNIRUZTX01BVENIX1NVQ0NFU1NfREVMRVRFOworCX0KKworCV9sZWF2ZSgiID0gU1VDQ0VTUyIpOworCXJldHVybiBDQUNIRUZTX01BVENIX1NVQ0NFU1M7Cit9IC8qIGVuZCBhZnNfdm5vZGVfY2FjaGVfbWF0Y2goKSAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiB1cGRhdGUgYSB2bm9kZSByZWNvcmQgc3RvcmVkIGluIHRoZSBjYWNoZQorICovCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorc3RhdGljIHZvaWQgYWZzX3Zub2RlX2NhY2hlX3VwZGF0ZSh2b2lkICpzb3VyY2UsIHZvaWQgKmVudHJ5KQoreworCXN0cnVjdCBhZnNfY2FjaGVfdm5vZGUgKmN2bm9kZSA9IGVudHJ5OworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gc291cmNlOworCisJX2VudGVyKCIiKTsKKworCWN2bm9kZS0+dm5vZGVfaWQJPSB2bm9kZS0+ZmlkLnZub2RlOworCWN2bm9kZS0+dm5vZGVfdW5pcXVlCT0gdm5vZGUtPmZpZC51bmlxdWU7CisJY3Zub2RlLT5kYXRhX3ZlcnNpb24JPSB2bm9kZS0+c3RhdHVzLnZlcnNpb247CisKK30gLyogZW5kIGFmc192bm9kZV9jYWNoZV91cGRhdGUoKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9hZnMvdm5vZGUuaCBiL2ZzL2Fmcy92bm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NmE5NzEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvdm5vZGUuaApAQCAtMCwwICsxLDk0IEBACisvKiB2bm9kZS5oOiBBRlMgdm5vZGUgcmVjb3JkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0FGU19WTk9ERV9ICisjZGVmaW5lIF9MSU5VWF9BRlNfVk5PREVfSAorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlICJzZXJ2ZXIuaCIKKyNpbmNsdWRlICJrYWZzdGltb2QuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCitzdHJ1Y3QgYWZzX3J4ZnNfZmV0Y2hfZGVzY3JpcHRvcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHZub2RlIGNhdGFsb2d1ZSBlbnRyeQorICovCitzdHJ1Y3QgYWZzX2NhY2hlX3Zub2RlCit7CisJYWZzX3Zub2RlaWRfdAkJdm5vZGVfaWQ7CS8qIHZub2RlIElEICovCisJdW5zaWduZWQJCXZub2RlX3VuaXF1ZTsJLyogdm5vZGUgSUQgdW5pcXVpZmllciAqLworCWFmc19kYXRhdmVyc2lvbl90CWRhdGFfdmVyc2lvbjsJLyogZGF0YSB2ZXJzaW9uICovCit9OworCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorZXh0ZXJuIHN0cnVjdCBjYWNoZWZzX2luZGV4X2RlZiBhZnNfdm5vZGVfY2FjaGVfaW5kZXhfZGVmOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBBRlMgaW5vZGUgcHJpdmF0ZSBkYXRhCisgKi8KK3N0cnVjdCBhZnNfdm5vZGUKK3sKKwlzdHJ1Y3QgaW5vZGUJCXZmc19pbm9kZTsJLyogdGhlIFZGUydzIGlub2RlIHJlY29yZCAqLworCisJc3RydWN0IGFmc192b2x1bWUJKnZvbHVtZTsJLyogdm9sdW1lIG9uIHdoaWNoIHZub2RlIHJlc2lkZXMgKi8KKwlzdHJ1Y3QgYWZzX2ZpZAkJZmlkOwkJLyogdGhlIGZpbGUgaWRlbnRpZmllciBmb3IgdGhpcyBpbm9kZSAqLworCXN0cnVjdCBhZnNfZmlsZV9zdGF0dXMJc3RhdHVzOwkJLyogQUZTIHN0YXR1cyBpbmZvIGZvciB0aGlzIGZpbGUgKi8KKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisJc3RydWN0IGNhY2hlZnNfY29va2llCSpjYWNoZTsJCS8qIGNhY2hpbmcgY29va2llICovCisjZW5kaWYKKworCXdhaXRfcXVldWVfaGVhZF90CXVwZGF0ZV93YWl0cTsJLyogc3RhdHVzIGZldGNoIHdhaXRxdWV1ZSAqLworCXVuc2lnbmVkCQl1cGRhdGVfY250OwkvKiBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgb3BzIHRoYXQgd2lsbCB1cGRhdGUgdGhlCisJCQkJCQkgKiBzdGF0dXMgKi8KKwlzcGlubG9ja190CQlsb2NrOwkJLyogd2FpdHF1ZXVlL2ZsYWdzIGxvY2sgKi8KKwl1bnNpZ25lZAkJZmxhZ3M7CisjZGVmaW5lIEFGU19WTk9ERV9DSEFOR0VECTB4MDAwMDAwMDEJLyogc2V0IGlmIHZub2RlIHJlcG9ydGVkIGNoYW5nZWQgYnkgY2FsbGJhY2sgKi8KKyNkZWZpbmUgQUZTX1ZOT0RFX0RFTEVURUQJMHgwMDAwMDAwMgkvKiBzZXQgaWYgdm5vZGUgZGVsZXRlZCBvbiBzZXJ2ZXIgKi8KKyNkZWZpbmUgQUZTX1ZOT0RFX01PVU5UUE9JTlQJMHgwMDAwMDAwNAkvKiBzZXQgaWYgdm5vZGUgaXMgYSBtb3VudHBvaW50IHN5bWxpbmsgKi8KKworCS8qIG91dHN0YW5kaW5nIGNhbGxiYWNrIG5vdGlmaWNhdGlvbiBvbiB0aGlzIGZpbGUgKi8KKwlzdHJ1Y3QgYWZzX3NlcnZlcgkqY2Jfc2VydmVyOwkvKiBzZXJ2ZXIgdGhhdCBtYWRlIHRoZSBjdXJyZW50IHByb21pc2UgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWNiX2xpbms7CS8qIGxpbmsgaW4gc2VydmVyJ3MgcHJvbWlzZXMgbGlzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQJY2JfaGFzaF9saW5rOwkvKiBsaW5rIGluIG1hc3RlciBjYWxsYmFjayBoYXNoICovCisJc3RydWN0IGFmc190aW1lcgljYl90aW1lb3V0OwkvKiB0aW1lb3V0IG9uIHByb21pc2UgKi8KKwl1bnNpZ25lZAkJY2JfdmVyc2lvbjsJLyogY2FsbGJhY2sgdmVyc2lvbiAqLworCXVuc2lnbmVkCQljYl9leHBpcnk7CS8qIGNhbGxiYWNrIGV4cGlyeSB0aW1lICovCisJYWZzX2NhbGxiYWNrX3R5cGVfdAljYl90eXBlOwkvKiB0eXBlIG9mIGNhbGxiYWNrICovCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhZnNfdm5vZGUgKkFGU19GU19JKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihpbm9kZSxzdHJ1Y3QgYWZzX3Zub2RlLHZmc19pbm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlub2RlICpBRlNfVk5PREVfVE9fSShzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKK3sKKwlyZXR1cm4gJnZub2RlLT52ZnNfaW5vZGU7Cit9CisKK2V4dGVybiBpbnQgYWZzX3Zub2RlX2ZldGNoX3N0YXR1cyhzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSk7CisKK2V4dGVybiBpbnQgYWZzX3Zub2RlX2ZldGNoX2RhdGEoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCQkJc3RydWN0IGFmc19yeGZzX2ZldGNoX2Rlc2NyaXB0b3IgKmRlc2MpOworCitleHRlcm4gaW50IGFmc192bm9kZV9naXZlX3VwX2NhbGxiYWNrKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKTsKKworZXh0ZXJuIHN0cnVjdCBhZnNfdGltZXJfb3BzIGFmc192bm9kZV9jYl90aW1lZF9vdXRfb3BzOworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX0xJTlVYX0FGU19WTk9ERV9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvdm9sdW1lLmMgYi9mcy9hZnMvdm9sdW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmNGI4NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy92b2x1bWUuYwpAQCAtMCwwICsxLDUyMCBAQAorLyogdm9sdW1lLmM6IEFGUyB2b2x1bWUgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlICJ2b2x1bWUuaCIKKyNpbmNsdWRlICJ2bm9kZS5oIgorI2luY2x1ZGUgImNlbGwuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNtc2VydmljZS5oIgorI2luY2x1ZGUgImZzY2xpZW50LmgiCisjaW5jbHVkZSAidmxjbGllbnQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjaWZkZWYgX19LREVCVUcKK3N0YXRpYyBjb25zdCBjaGFyICphZnNfdm9sdHlwZXNbXSA9IHsgIlIvVyIsICJSL08iLCAiQkFLIiB9OworI2VuZGlmCisKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitzdGF0aWMgY2FjaGVmc19tYXRjaF92YWxfdCBhZnNfdm9sdW1lX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKKwkJCQkJCSAgY29uc3Qgdm9pZCAqZW50cnkpOworc3RhdGljIHZvaWQgYWZzX3ZvbHVtZV9jYWNoZV91cGRhdGUodm9pZCAqc291cmNlLCB2b2lkICplbnRyeSk7CisKK3N0cnVjdCBjYWNoZWZzX2luZGV4X2RlZiBhZnNfdm9sdW1lX2NhY2hlX2luZGV4X2RlZiA9IHsKKwkubmFtZQkJPSAidm9sdW1lIiwKKwkuZGF0YV9zaXplCT0gc2l6ZW9mKHN0cnVjdCBhZnNfY2FjaGVfdmhhc2gpLAorCS5rZXlzWzBdCT0geyBDQUNIRUZTX0lOREVYX0tFWVNfQklOLCAxIH0sCisJLmtleXNbMV0JPSB7IENBQ0hFRlNfSU5ERVhfS0VZU19CSU4sIDEgfSwKKwkubWF0Y2gJCT0gYWZzX3ZvbHVtZV9jYWNoZV9tYXRjaCwKKwkudXBkYXRlCQk9IGFmc192b2x1bWVfY2FjaGVfdXBkYXRlLAorfTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbG9va3VwIGEgdm9sdW1lIGJ5IG5hbWUKKyAqIC0gdGhpcyBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKgkiJVtjZWxsOl12b2x1bWVbLl0iCQlSL1cgdm9sdW1lCisgKgkiI1tjZWxsOl12b2x1bWVbLl0iCQlSL08gb3IgUi9XIHZvbHVtZSAocndwYXJlbnQ9MCksCisgKgkJCQkJIG9yIFIvVyAocndwYXJlbnQ9MSkgdm9sdW1lCisgKgkiJVtjZWxsOl12b2x1bWUucmVhZG9ubHkiCVIvTyB2b2x1bWUKKyAqCSIjW2NlbGw6XXZvbHVtZS5yZWFkb25seSIJUi9PIHZvbHVtZQorICoJIiVbY2VsbDpddm9sdW1lLmJhY2t1cCIJCUJhY2t1cCB2b2x1bWUKKyAqCSIjW2NlbGw6XXZvbHVtZS5iYWNrdXAiCQlCYWNrdXAgdm9sdW1lCisgKgorICogVGhlIGNlbGwgbmFtZSBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGNlbGwuCisgKgorICogU2VlICJUaGUgUnVsZXMgb2YgTW91bnQgUG9pbnQgVHJhdmVyc2FsIiBpbiBDaGFwdGVyIDUgb2YgdGhlIEFGUyBTeXNBZG1pbgorICogR3VpZGUKKyAqIC0gUnVsZSAxOiBFeHBsaWNpdCB0eXBlIHN1ZmZpeCBmb3JjZXMgYWNjZXNzIG9mIHRoYXQgdHlwZSBvciBub3RoaW5nCisgKiAgICAgICAgICAgKG5vIHN1ZmZpeCwgdGhlbiB1c2UgUnVsZSAyICYgMykKKyAqIC0gUnVsZSAyOiBJZiBwYXJlbnQgdm9sdW1lIGlzIFIvTywgdGhlbiBtb3VudCBSL08gdm9sdW1lIGJ5IHByZWZlcmVuY2UsIFIvVworICogICAgICAgICAgIGlmIG5vdCBhdmFpbGFibGUKKyAqIC0gUnVsZSAzOiBJZiBwYXJlbnQgdm9sdW1lIGlzIFIvVywgdGhlbiBvbmx5IG1vdW50IFIvVyB2b2x1bWUgdW5sZXNzCisgKiAgICAgICAgICAgZXhwbGljaXRseSB0b2xkIG90aGVyd2lzZQorICovCitpbnQgYWZzX3ZvbHVtZV9sb29rdXAoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGFmc19jZWxsICpjZWxsLCBpbnQgcndwYXRoLAorCQkgICAgICBzdHJ1Y3QgYWZzX3ZvbHVtZSAqKl92b2x1bWUpCit7CisJc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbiA9IE5VTEw7CisJc3RydWN0IGFmc192b2x1bWUgKnZvbHVtZSA9IE5VTEw7CisJYWZzX3ZvbHR5cGVfdCB0eXBlOworCWNvbnN0IGNoYXIgKmNlbGxuYW1lLCAqdm9sbmFtZSwgKnN1ZmZpeDsKKwljaGFyIHNydnRtYXNrOworCWludCBmb3JjZSwgcmV0LCBsb29wLCBjZWxsbmFtZXN6LCB2b2xuYW1lc3o7CisKKwlfZW50ZXIoIiVzLCwlZCwiLCBuYW1lLCByd3BhdGgpOworCisJaWYgKCFuYW1lIHx8IChuYW1lWzBdICE9ICclJyAmJiBuYW1lWzBdICE9ICcjJykgfHwgIW5hbWVbMV0pIHsKKwkJcHJpbnRrKCJrQUZTOiB1bnBhcnNhYmxlIHZvbHVtZSBuYW1lXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHZvbHVtZSB3ZSdyZSBsb29raW5nIGZvciAqLworCWZvcmNlID0gMDsKKwl0eXBlID0gQUZTVkxfUk9WT0w7CisKKwlpZiAocndwYXRoIHx8IG5hbWVbMF0gPT0gJyUnKSB7CisJCXR5cGUgPSBBRlNWTF9SV1ZPTDsKKwkJZm9yY2UgPSAxOworCX0KKworCXN1ZmZpeCA9IHN0cnJjaHIobmFtZSwgJy4nKTsKKwlpZiAoc3VmZml4KSB7CisJCWlmIChzdHJjbXAoc3VmZml4LCAiLnJlYWRvbmx5IikgPT0gMCkgeworCQkJdHlwZSA9IEFGU1ZMX1JPVk9MOworCQkJZm9yY2UgPSAxOworCQl9CisJCWVsc2UgaWYgKHN0cmNtcChzdWZmaXgsICIuYmFja3VwIikgPT0gMCkgeworCQkJdHlwZSA9IEFGU1ZMX0JBQ0tWT0w7CisJCQlmb3JjZSA9IDE7CisJCX0KKwkJZWxzZSBpZiAoc3VmZml4WzFdID09IDApIHsKKwkJfQorCQllbHNlIHsKKwkJCXN1ZmZpeCA9IE5VTEw7CisJCX0KKwl9CisKKwkvKiBzcGxpdCB0aGUgY2VsbCBhbmQgdm9sdW1lIG5hbWVzICovCisJbmFtZSsrOworCXZvbG5hbWUgPSBzdHJjaHIobmFtZSwgJzonKTsKKwlpZiAodm9sbmFtZSkgeworCQljZWxsbmFtZSA9IG5hbWU7CisJCWNlbGxuYW1lc3ogPSB2b2xuYW1lIC0gbmFtZTsKKwkJdm9sbmFtZSsrOworCX0KKwllbHNlIHsKKwkJdm9sbmFtZSA9IG5hbWU7CisJCWNlbGxuYW1lID0gTlVMTDsKKwkJY2VsbG5hbWVzeiA9IDA7CisJfQorCisJdm9sbmFtZXN6ID0gc3VmZml4ID8gc3VmZml4IC0gdm9sbmFtZSA6IHN0cmxlbih2b2xuYW1lKTsKKworCV9kZWJ1ZygiQ0VMTDolKi4qcyBbJXBdIFZPTFVNRTolKi4qcyBTVUZGSVg6JXMgVFlQRTolZCVzIiwKKwkgICAgICAgY2VsbG5hbWVzeiwgY2VsbG5hbWVzeiwgY2VsbG5hbWUgPzogIiIsIGNlbGwsCisJICAgICAgIHZvbG5hbWVzeiwgdm9sbmFtZXN6LCB2b2xuYW1lLCBzdWZmaXggPzogIi0iLAorCSAgICAgICB0eXBlLAorCSAgICAgICBmb3JjZSA/ICIgRk9SQ0UiIDogIiIpOworCisJLyogbG9va3VwIHRoZSBjZWxsIHJlY29yZCAqLworCWlmIChjZWxsbmFtZSB8fCAhY2VsbCkgeworCQlyZXQgPSBhZnNfY2VsbF9sb29rdXAoY2VsbG5hbWUsIGNlbGxuYW1lc3osICZjZWxsKTsKKwkJaWYgKHJldDwwKSB7CisJCQlwcmludGsoImtBRlM6IHVuYWJsZSB0byBsb29rdXAgY2VsbCAnJXMnXG4iLAorCQkJICAgICAgIGNlbGxuYW1lID86ICIiKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisJZWxzZSB7CisJCWFmc19nZXRfY2VsbChjZWxsKTsKKwl9CisKKwkvKiBsb29rdXAgdGhlIHZvbHVtZSBsb2NhdGlvbiByZWNvcmQgKi8KKwlyZXQgPSBhZnNfdmxvY2F0aW9uX2xvb2t1cChjZWxsLCB2b2xuYW1lLCB2b2xuYW1lc3osICZ2bG9jYXRpb24pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogbWFrZSB0aGUgZmluYWwgZGVjaXNpb24gb24gdGhlIHR5cGUgd2Ugd2FudCAqLworCXJldCA9IC1FTk9NRURJVU07CisJaWYgKGZvcmNlICYmICEodmxvY2F0aW9uLT52bGRiLnZpZG1hc2sgJiAoMSA8PCB0eXBlKSkpCisJCWdvdG8gZXJyb3I7CisKKwlzcnZ0bWFzayA9IDA7CisJZm9yIChsb29wID0gMDsgbG9vcCA8IHZsb2NhdGlvbi0+dmxkYi5uc2VydmVyczsgbG9vcCsrKQorCQlzcnZ0bWFzayB8PSB2bG9jYXRpb24tPnZsZGIuc3J2dG1hc2tbbG9vcF07CisKKwlpZiAoZm9yY2UpIHsKKwkJaWYgKCEoc3J2dG1hc2sgJiAoMSA8PCB0eXBlKSkpCisJCQlnb3RvIGVycm9yOworCX0KKwllbHNlIGlmIChzcnZ0bWFzayAmIEFGU19WT0xfVlRNX1JPKSB7CisJCXR5cGUgPSBBRlNWTF9ST1ZPTDsKKwl9CisJZWxzZSBpZiAoc3J2dG1hc2sgJiBBRlNfVk9MX1ZUTV9SVykgeworCQl0eXBlID0gQUZTVkxfUldWT0w7CisJfQorCWVsc2UgeworCQlnb3RvIGVycm9yOworCX0KKworCWRvd25fd3JpdGUoJmNlbGwtPnZsX3NlbSk7CisKKwkvKiBpcyB0aGUgdm9sdW1lIGFscmVhZHkgYWN0aXZlPyAqLworCWlmICh2bG9jYXRpb24tPnZvbHNbdHlwZV0pIHsKKwkJLyogeWVzIC0gcmUtdXNlIGl0ICovCisJCXZvbHVtZSA9IHZsb2NhdGlvbi0+dm9sc1t0eXBlXTsKKwkJYWZzX2dldF92b2x1bWUodm9sdW1lKTsKKwkJZ290byBzdWNjZXNzOworCX0KKworCS8qIGNyZWF0ZSBhIG5ldyB2b2x1bWUgcmVjb3JkICovCisJX2RlYnVnKCJjcmVhdGluZyBuZXcgdm9sdW1lIHJlY29yZCIpOworCisJcmV0ID0gLUVOT01FTTsKKwl2b2x1bWUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWZzX3ZvbHVtZSksIEdGUF9LRVJORUwpOworCWlmICghdm9sdW1lKQorCQlnb3RvIGVycm9yX3VwOworCisJbWVtc2V0KHZvbHVtZSwgMCwgc2l6ZW9mKHN0cnVjdCBhZnNfdm9sdW1lKSk7CisJYXRvbWljX3NldCgmdm9sdW1lLT51c2FnZSwgMSk7CisJdm9sdW1lLT50eXBlCQk9IHR5cGU7CisJdm9sdW1lLT50eXBlX2ZvcmNlCT0gZm9yY2U7CisJdm9sdW1lLT5jZWxsCQk9IGNlbGw7CisJdm9sdW1lLT52aWQJCT0gdmxvY2F0aW9uLT52bGRiLnZpZFt0eXBlXTsKKworCWluaXRfcndzZW0oJnZvbHVtZS0+c2VydmVyX3NlbSk7CisKKwkvKiBsb29rIHVwIGFsbCB0aGUgYXBwbGljYWJsZSBzZXJ2ZXIgcmVjb3JkcyAqLworCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspIHsKKwkJaWYgKHZsb2NhdGlvbi0+dmxkYi5zcnZ0bWFza1tsb29wXSAmICgxIDw8IHZvbHVtZS0+dHlwZSkpIHsKKwkJCXJldCA9IGFmc19zZXJ2ZXJfbG9va3VwKAorCQkJCXZvbHVtZS0+Y2VsbCwKKwkJCQkmdmxvY2F0aW9uLT52bGRiLnNlcnZlcnNbbG9vcF0sCisJCQkJJnZvbHVtZS0+c2VydmVyc1t2b2x1bWUtPm5zZXJ2ZXJzXSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIGVycm9yX2Rpc2NhcmQ7CisKKwkJCXZvbHVtZS0+bnNlcnZlcnMrKzsKKwkJfQorCX0KKworCS8qIGF0dGFjaCB0aGUgY2FjaGUgYW5kIHZvbHVtZSBsb2NhdGlvbiAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwljYWNoZWZzX2FjcXVpcmVfY29va2llKHZsb2NhdGlvbi0+Y2FjaGUsCisJCQkgICAgICAgJmFmc192bm9kZV9jYWNoZV9pbmRleF9kZWYsCisJCQkgICAgICAgdm9sdW1lLAorCQkJICAgICAgICZ2b2x1bWUtPmNhY2hlKTsKKyNlbmRpZgorCisJYWZzX2dldF92bG9jYXRpb24odmxvY2F0aW9uKTsKKwl2b2x1bWUtPnZsb2NhdGlvbiA9IHZsb2NhdGlvbjsKKworCXZsb2NhdGlvbi0+dm9sc1t0eXBlXSA9IHZvbHVtZTsKKworIHN1Y2Nlc3M6CisJX2RlYnVnKCJrQUZTIHNlbGVjdGVkICVzIHZvbHVtZSAlMDh4IiwKKwkgICAgICAgYWZzX3ZvbHR5cGVzW3ZvbHVtZS0+dHlwZV0sIHZvbHVtZS0+dmlkKTsKKwkqX3ZvbHVtZSA9IHZvbHVtZTsKKwlyZXQgPSAwOworCisJLyogY2xlYW4gdXAgKi8KKyBlcnJvcl91cDoKKwl1cF93cml0ZSgmY2VsbC0+dmxfc2VtKTsKKyBlcnJvcjoKKwlhZnNfcHV0X3Zsb2NhdGlvbih2bG9jYXRpb24pOworCWFmc19wdXRfY2VsbChjZWxsKTsKKworCV9sZWF2ZSgiID0gJWQgKCVwKSIsIHJldCwgdm9sdW1lKTsKKwlyZXR1cm4gcmV0OworCisgZXJyb3JfZGlzY2FyZDoKKwl1cF93cml0ZSgmY2VsbC0+dmxfc2VtKTsKKworCWZvciAobG9vcCA9IHZvbHVtZS0+bnNlcnZlcnMgLSAxOyBsb29wID49IDA7IGxvb3AtLSkKKwkJYWZzX3B1dF9zZXJ2ZXIodm9sdW1lLT5zZXJ2ZXJzW2xvb3BdKTsKKworCWtmcmVlKHZvbHVtZSk7CisJZ290byBlcnJvcjsKK30gLyogZW5kIGFmc192b2x1bWVfbG9va3VwKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGRlc3Ryb3kgYSB2b2x1bWUgcmVjb3JkCisgKi8KK3ZvaWQgYWZzX3B1dF92b2x1bWUoc3RydWN0IGFmc192b2x1bWUgKnZvbHVtZSkKK3sKKwlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uOworCWludCBsb29wOworCisJaWYgKCF2b2x1bWUpCisJCXJldHVybjsKKworCV9lbnRlcigiJXAiLCB2b2x1bWUpOworCisJdmxvY2F0aW9uID0gdm9sdW1lLT52bG9jYXRpb247CisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlCVUdfT04oYXRvbWljX3JlYWQoJnZvbHVtZS0+dXNhZ2UpIDw9IDApOworCisJLyogdG8gcHJldmVudCBhIHJhY2UsIHRoZSBkZWNyZW1lbnQgYW5kIHRoZSBkZXF1ZXVlIG11c3QgYmUgZWZmZWN0aXZlbHkKKwkgKiBhdG9taWMgKi8KKwlkb3duX3dyaXRlKCZ2bG9jYXRpb24tPmNlbGwtPnZsX3NlbSk7CisKKwlpZiAobGlrZWx5KCFhdG9taWNfZGVjX2FuZF90ZXN0KCZ2b2x1bWUtPnVzYWdlKSkpIHsKKwkJdXBfd3JpdGUoJnZsb2NhdGlvbi0+Y2VsbC0+dmxfc2VtKTsKKwkJX2xlYXZlKCIiKTsKKwkJcmV0dXJuOworCX0KKworCXZsb2NhdGlvbi0+dm9sc1t2b2x1bWUtPnR5cGVdID0gTlVMTDsKKworCXVwX3dyaXRlKCZ2bG9jYXRpb24tPmNlbGwtPnZsX3NlbSk7CisKKwkvKiBmaW5pc2ggY2xlYW5pbmcgdXAgdGhlIHZvbHVtZSAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwljYWNoZWZzX3JlbGlucXVpc2hfY29va2llKHZvbHVtZS0+Y2FjaGUsIDApOworI2VuZGlmCisJYWZzX3B1dF92bG9jYXRpb24odmxvY2F0aW9uKTsKKworCWZvciAobG9vcCA9IHZvbHVtZS0+bnNlcnZlcnMgLSAxOyBsb29wID49IDA7IGxvb3AtLSkKKwkJYWZzX3B1dF9zZXJ2ZXIodm9sdW1lLT5zZXJ2ZXJzW2xvb3BdKTsKKworCWtmcmVlKHZvbHVtZSk7CisKKwlfbGVhdmUoIiBbZGVzdHJveWVkXSIpOworfSAvKiBlbmQgYWZzX3B1dF92b2x1bWUoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogcGljayBhIHNlcnZlciB0byB1c2UgdG8gdHJ5IGFjY2Vzc2luZyB0aGlzIHZvbHVtZQorICogLSByZXR1cm5zIHdpdGggYW4gZWxldmF0ZWQgdXNhZ2UgY291bnQgb24gdGhlIHNlcnZlciBjaG9zZW4KKyAqLworaW50IGFmc192b2x1bWVfcGlja19maWxlc2VydmVyKHN0cnVjdCBhZnNfdm9sdW1lICp2b2x1bWUsCisJCQkgICAgICAgc3RydWN0IGFmc19zZXJ2ZXIgKipfc2VydmVyKQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJaW50IHJldCwgc3RhdGUsIGxvb3A7CisKKwlfZW50ZXIoIiVzIiwgdm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSk7CisKKwlkb3duX3JlYWQoJnZvbHVtZS0+c2VydmVyX3NlbSk7CisKKwkvKiBoYW5kbGUgdGhlIG5vLXNlcnZlciBjYXNlICovCisJaWYgKHZvbHVtZS0+bnNlcnZlcnMgPT0gMCkgeworCQlyZXQgPSB2b2x1bWUtPnJqc2VydmVycyA/IC1FTk9NRURJVU0gOiAtRVNUQUxFOworCQl1cF9yZWFkKCZ2b2x1bWUtPnNlcnZlcl9zZW0pOworCQlfbGVhdmUoIiA9ICVkIFtubyBzZXJ2ZXJzXSIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogYmFzaWNhbGx5LCBqdXN0IHNlYXJjaCB0aGUgbGlzdCBmb3IgdGhlIGZpcnN0IGxpdmUgc2VydmVyIGFuZCB1c2UKKwkgKiB0aGF0ICovCisJcmV0ID0gMDsKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgdm9sdW1lLT5uc2VydmVyczsgbG9vcCsrKSB7CisJCXNlcnZlciA9IHZvbHVtZS0+c2VydmVyc1tsb29wXTsKKwkJc3RhdGUgPSBzZXJ2ZXItPmZzX3N0YXRlOworCisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJCS8qIGZvdW5kIGFuIGFwcGFyZW50bHkgaGVhbHRoeSBzZXJ2ZXIgKi8KKwkJY2FzZSAwOgorCQkJYWZzX2dldF9zZXJ2ZXIoc2VydmVyKTsKKwkJCXVwX3JlYWQoJnZvbHVtZS0+c2VydmVyX3NlbSk7CisJCQkqX3NlcnZlciA9IHNlcnZlcjsKKwkJCV9sZWF2ZSgiID0gMCAocGlja2VkICUwOHgpIiwKKwkJCSAgICAgICBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIC1FTkVUVU5SRUFDSDoKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlyZXQgPSBzdGF0ZTsKKwkJCWJyZWFrOworCisJCWNhc2UgLUVIT1NUVU5SRUFDSDoKKwkJCWlmIChyZXQgPT0gMCB8fAorCQkJICAgIHJldCA9PSAtRU5FVFVOUkVBQ0gpCisJCQkJcmV0ID0gc3RhdGU7CisJCQlicmVhazsKKworCQljYXNlIC1FQ09OTlJFRlVTRUQ6CisJCQlpZiAocmV0ID09IDAgfHwKKwkJCSAgICByZXQgPT0gLUVORVRVTlJFQUNIIHx8CisJCQkgICAgcmV0ID09IC1FSE9TVFVOUkVBQ0gpCisJCQkJcmV0ID0gc3RhdGU7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQljYXNlIC1FUkVNT1RFSU86CisJCQlpZiAocmV0ID09IDAgfHwKKwkJCSAgICByZXQgPT0gLUVORVRVTlJFQUNIIHx8CisJCQkgICAgcmV0ID09IC1FSE9TVFVOUkVBQ0ggfHwKKwkJCSAgICByZXQgPT0gLUVDT05OUkVGVVNFRCkKKwkJCQlyZXQgPSBzdGF0ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogbm8gYXZhaWxhYmxlIHNlcnZlcnMKKwkgKiAtIFRPRE86IGhhbmRsZSB0aGUgbm8gYWN0aXZlIHNlcnZlcnMgY2FzZSBiZXR0ZXIKKwkgKi8KKwl1cF9yZWFkKCZ2b2x1bWUtPnNlcnZlcl9zZW0pOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9IC8qIGVuZCBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiByZWxlYXNlIGEgc2VydmVyIGFmdGVyIHVzZQorICogLSByZWxlYXNlcyB0aGUgcmVmIG9uIHRoZSBzZXJ2ZXIgc3RydWN0IHRoYXQgd2FzIGFjcXVpcmVkIGJ5IHBpY2tpbmcKKyAqIC0gcmVjb3JkcyByZXN1bHQgb2YgdXNpbmcgYSBwYXJ0aWN1bGFyIHNlcnZlciB0byBhY2Nlc3MgYSB2b2x1bWUKKyAqIC0gcmV0dXJuIDAgdG8gdHJ5IGFnYWluLCAxIGlmIG9rYXkgb3IgdG8gaXNzdWUgZXJyb3IKKyAqLworaW50IGFmc192b2x1bWVfcmVsZWFzZV9maWxlc2VydmVyKHN0cnVjdCBhZnNfdm9sdW1lICp2b2x1bWUsCisJCQkJICBzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkJCSAgaW50IHJlc3VsdCkKK3sKKwl1bnNpZ25lZCBsb29wOworCisJX2VudGVyKCIlcywlMDh4LCVkIiwKKwkgICAgICAgdm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSwgbnRvaGwoc2VydmVyLT5hZGRyLnNfYWRkciksCisJICAgICAgIHJlc3VsdCk7CisKKwlzd2l0Y2ggKHJlc3VsdCkgeworCQkvKiBzdWNjZXNzICovCisJY2FzZSAwOgorCQlzZXJ2ZXItPmZzX2FjdF9qaWYgPSBqaWZmaWVzOworCQlicmVhazsKKworCQkvKiB0aGUgZmlsZXNlcnZlciBkZW5pZWQgYWxsIGtub3dsZWRnZSBvZiB0aGUgdm9sdW1lICovCisJY2FzZSAtRU5PTUVESVVNOgorCQlzZXJ2ZXItPmZzX2FjdF9qaWYgPSBqaWZmaWVzOworCQlkb3duX3dyaXRlKCZ2b2x1bWUtPnNlcnZlcl9zZW0pOworCisJCS8qIGZpcnN0LCBmaW5kIHdoZXJlIHRoZSBzZXJ2ZXIgaXMgaW4gdGhlIGFjdGl2ZSBsaXN0IChpZiBpdAorCQkgKiBpcykgKi8KKwkJZm9yIChsb29wID0gMDsgbG9vcCA8IHZvbHVtZS0+bnNlcnZlcnM7IGxvb3ArKykKKwkJCWlmICh2b2x1bWUtPnNlcnZlcnNbbG9vcF0gPT0gc2VydmVyKQorCQkJCWdvdG8gcHJlc2VudDsKKworCQkvKiBubyBsb25nZXIgdGhlcmUgLSBtYXkgaGF2ZSBiZWVuIGRpc2NhcmRlZCBieSBhbm90aGVyIG9wICovCisJCWdvdG8gdHJ5X25leHRfc2VydmVyX3VwdzsKKworCXByZXNlbnQ6CisJCXZvbHVtZS0+bnNlcnZlcnMtLTsKKwkJbWVtbW92ZSgmdm9sdW1lLT5zZXJ2ZXJzW2xvb3BdLAorCQkJJnZvbHVtZS0+c2VydmVyc1tsb29wICsgMV0sCisJCQlzaXplb2Yodm9sdW1lLT5zZXJ2ZXJzW2xvb3BdKSAqCisJCQkodm9sdW1lLT5uc2VydmVycyAtIGxvb3ApKTsKKwkJdm9sdW1lLT5zZXJ2ZXJzW3ZvbHVtZS0+bnNlcnZlcnNdID0gTlVMTDsKKwkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKwkJdm9sdW1lLT5yanNlcnZlcnMrKzsKKworCQlpZiAodm9sdW1lLT5uc2VydmVycyA+IDApCisJCQkvKiBhbm90aGVyIHNlcnZlciBtaWdodCBhY2tub3dsZWRnZSBpdHMgZXhpc3RlbmNlICovCisJCQlnb3RvIHRyeV9uZXh0X3NlcnZlcl91cHc7CisKKwkJLyogaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGFsbCB0aGUgZmlsZXNlcnZlcnMgaGF2ZSByZWplY3RlZCB0aGUKKwkJICogdm9sdW1lCisJCSAqIC0gVE9ETzogdHJ5IGFza2luZyB0aGUgZmlsZXNlcnZlcnMgZm9yIHZvbHVtZSBpbmZvcm1hdGlvbgorCQkgKiAtIFRPRE86IGNvbnRhY3QgdGhlIFZMIHNlcnZlciBhZ2FpbiB0byBzZWUgaWYgdGhlIHZvbHVtZSBpcworCQkgKiAgICAgICAgIG5vIGxvbmdlciByZWdpc3RlcmVkCisJCSAqLworCQl1cF93cml0ZSgmdm9sdW1lLT5zZXJ2ZXJfc2VtKTsKKwkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKwkJX2xlYXZlKCIgW2NvbXBsZXRlbHkgcmVqZWN0ZWRdIik7CisJCXJldHVybiAxOworCisJCS8qIHByb2JsZW0gcmVhY2hpbmcgdGhlIHNlcnZlciAqLworCWNhc2UgLUVORVRVTlJFQUNIOgorCWNhc2UgLUVIT1NUVU5SRUFDSDoKKwljYXNlIC1FQ09OTlJFRlVTRUQ6CisJY2FzZSAtRVRJTUVET1VUOgorCWNhc2UgLUVSRU1PVEVJTzoKKwkJLyogbWFyayB0aGUgc2VydmVyIGFzIGRlYWQKKwkJICogVE9ETzogdmFyeSBkZWFkIHRpbWVvdXQgZGVwZW5kaW5nIG9uIGVycm9yCisJCSAqLworCQlzcGluX2xvY2soJnNlcnZlci0+ZnNfbG9jayk7CisJCWlmICghc2VydmVyLT5mc19zdGF0ZSkgeworCQkJc2VydmVyLT5mc19kZWFkX2ppZiA9IGppZmZpZXMgKyBIWiAqIDEwOworCQkJc2VydmVyLT5mc19zdGF0ZSA9IHJlc3VsdDsKKwkJCXByaW50aygia0FGUzogU0VSVkVSIERFQUQgc3RhdGU9JWRcbiIsIHJlc3VsdCk7CisJCX0KKwkJc3Bpbl91bmxvY2soJnNlcnZlci0+ZnNfbG9jayk7CisJCWdvdG8gdHJ5X25leHRfc2VydmVyOworCisJCS8qIG1pc2NlbGxhbmVvdXMgZXJyb3IgKi8KKwlkZWZhdWx0OgorCQlzZXJ2ZXItPmZzX2FjdF9qaWYgPSBqaWZmaWVzOworCWNhc2UgLUVOT01FTToKKwljYXNlIC1FTk9ORVQ6CisJCWJyZWFrOworCX0KKworCS8qIHRlbGwgdGhlIGNhbGxlciB0byBhY2NlcHQgdGhlIHJlc3VsdCAqLworCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisJX2xlYXZlKCIiKTsKKwlyZXR1cm4gMTsKKworCS8qIHRlbGwgdGhlIGNhbGxlciB0byBsb29wIGFyb3VuZCBhbmQgdHJ5IHRoZSBuZXh0IHNlcnZlciAqLworIHRyeV9uZXh0X3NlcnZlcl91cHc6CisJdXBfd3JpdGUoJnZvbHVtZS0+c2VydmVyX3NlbSk7CisgdHJ5X25leHRfc2VydmVyOgorCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisJX2xlYXZlKCIgW3RyeSBuZXh0IHNlcnZlcl0iKTsKKwlyZXR1cm4gMDsKKworfSAvKiBlbmQgYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbWF0Y2ggYSB2b2x1bWUgaGFzaCByZWNvcmQgc3RvcmVkIGluIHRoZSBjYWNoZQorICovCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorc3RhdGljIGNhY2hlZnNfbWF0Y2hfdmFsX3QgYWZzX3ZvbHVtZV9jYWNoZV9tYXRjaCh2b2lkICp0YXJnZXQsCisJCQkJCQkgIGNvbnN0IHZvaWQgKmVudHJ5KQoreworCWNvbnN0IHN0cnVjdCBhZnNfY2FjaGVfdmhhc2ggKnZoYXNoID0gZW50cnk7CisJc3RydWN0IGFmc192b2x1bWUgKnZvbHVtZSA9IHRhcmdldDsKKworCV9lbnRlcigieyV1fSx7JXV9Iiwgdm9sdW1lLT50eXBlLCB2aGFzaC0+dnR5cGUpOworCisJaWYgKHZvbHVtZS0+dHlwZSA9PSB2aGFzaC0+dnR5cGUpIHsKKwkJX2xlYXZlKCIgPSBTVUNDRVNTIik7CisJCXJldHVybiBDQUNIRUZTX01BVENIX1NVQ0NFU1M7CisJfQorCisJX2xlYXZlKCIgPSBGQUlMRUQiKTsKKwlyZXR1cm4gQ0FDSEVGU19NQVRDSF9GQUlMRUQ7Cit9IC8qIGVuZCBhZnNfdm9sdW1lX2NhY2hlX21hdGNoKCkgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogdXBkYXRlIGEgdm9sdW1lIGhhc2ggcmVjb3JkIHN0b3JlZCBpbiB0aGUgY2FjaGUKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyB2b2lkIGFmc192b2x1bWVfY2FjaGVfdXBkYXRlKHZvaWQgKnNvdXJjZSwgdm9pZCAqZW50cnkpCit7CisJc3RydWN0IGFmc19jYWNoZV92aGFzaCAqdmhhc2ggPSBlbnRyeTsKKwlzdHJ1Y3QgYWZzX3ZvbHVtZSAqdm9sdW1lID0gc291cmNlOworCisJX2VudGVyKCIiKTsKKworCXZoYXNoLT52dHlwZSA9IHZvbHVtZS0+dHlwZTsKKworfSAvKiBlbmQgYWZzX3ZvbHVtZV9jYWNoZV91cGRhdGUoKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9hZnMvdm9sdW1lLmggYi9mcy9hZnMvdm9sdW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU2OTE4OAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy92b2x1bWUuaApAQCAtMCwwICsxLDE0MiBAQAorLyogdm9sdW1lLmg6IEFGUyB2b2x1bWUgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9BRlNfVk9MVU1FX0gKKyNkZWZpbmUgX0xJTlVYX0FGU19WT0xVTUVfSAorCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJmc2NsaWVudC5oIgorI2luY2x1ZGUgImthZnN0aW1vZC5oIgorI2luY2x1ZGUgImthZnNhc3luY2QuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorCisjZGVmaW5lIF9fcGFja2VkIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpCisKK3R5cGVkZWYgZW51bSB7CisJQUZTX1ZMVVBEX1NMRUVQLAkJLyogc2xlZXBpbmcgd2FpdGluZyBmb3IgdXBkYXRlIHRpbWVyIHRvIGZpcmUgKi8KKwlBRlNfVkxVUERfUEVORElORywJCS8qIG9uIHBlbmRpbmcgcXVldWUgKi8KKwlBRlNfVkxVUERfSU5QUk9HUkVTUywJCS8qIG9wIGluIHByb2dyZXNzICovCisJQUZTX1ZMVVBEX0JVU1lTTEVFUCwJCS8qIHNsZWVwaW5nIGJlY2F1c2Ugc2VydmVyIHJldHVybmVkIEVCVVNZICovCisJCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGFmc192bG9jYXRpb25fdXBkX3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBlbnRyeSBpbiB0aGUgY2FjaGVkIHZvbHVtZSBsb2NhdGlvbiBjYXRhbG9ndWUKKyAqLworc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24KK3sKKwl1aW50OF90CQkJbmFtZVs2NF07CS8qIHZvbHVtZSBuYW1lIChsb3dlcmNhc2UsIHBhZGRlZCB3aXRoIE5VTHMpICovCisJdWludDhfdAkJCW5zZXJ2ZXJzOwkvKiBudW1iZXIgb2YgZW50cmllcyB1c2VkIGluIHNlcnZlcnNbXSAqLworCXVpbnQ4X3QJCQl2aWRtYXNrOwkvKiB2b2x0eXBlIG1hc2sgZm9yIHZpZFtdICovCisJdWludDhfdAkJCXNydnRtYXNrWzhdOwkvKiB2b2x0eXBlIG1hc2tzIGZvciBzZXJ2ZXJzW10gKi8KKyNkZWZpbmUgQUZTX1ZPTF9WVE1fUlcJMHgwMSAvKiBSL1cgdmVyc2lvbiBvZiB0aGUgdm9sdW1lIGlzIGF2YWlsYWJsZSAob24gdGhpcyBzZXJ2ZXIpICovCisjZGVmaW5lIEFGU19WT0xfVlRNX1JPCTB4MDIgLyogUi9PIHZlcnNpb24gb2YgdGhlIHZvbHVtZSBpcyBhdmFpbGFibGUgKG9uIHRoaXMgc2VydmVyKSAqLworI2RlZmluZSBBRlNfVk9MX1ZUTV9CQUsJMHgwNCAvKiBiYWNrdXAgdmVyc2lvbiBvZiB0aGUgdm9sdW1lIGlzIGF2YWlsYWJsZSAob24gdGhpcyBzZXJ2ZXIpICovCisKKwlhZnNfdm9saWRfdAkJdmlkWzNdOwkJLyogdm9sdW1lIElEcyBmb3IgUi9XLCBSL08gYW5kIEJhayB2b2x1bWVzICovCisJc3RydWN0IGluX2FkZHIJCXNlcnZlcnNbOF07CS8qIGZpbGVzZXJ2ZXIgYWRkcmVzc2VzICovCisJdGltZV90CQkJcnRpbWU7CQkvKiBsYXN0IHJldHJpZXZhbCB0aW1lICovCit9OworCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorZXh0ZXJuIHN0cnVjdCBjYWNoZWZzX2luZGV4X2RlZiBhZnNfdmxvY2F0aW9uX2NhY2hlX2luZGV4X2RlZjsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogdm9sdW1lIC0+IHZub2RlIGhhc2ggdGFibGUgZW50cnkKKyAqLworc3RydWN0IGFmc19jYWNoZV92aGFzaAoreworCWFmc192b2x0eXBlX3QJCXZ0eXBlOwkJLyogd2hpY2ggdm9sdW1lIHZhcmlhdGlvbiAqLworCXVpbnQ4X3QJCQloYXNoX2J1Y2tldDsJLyogd2hpY2ggaGFzaCBidWNrZXQgdGhpcyByZXByZXNlbnRzICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorZXh0ZXJuIHN0cnVjdCBjYWNoZWZzX2luZGV4X2RlZiBhZnNfdm9sdW1lX2NhY2hlX2luZGV4X2RlZjsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQUZTIHZvbHVtZSBsb2NhdGlvbiByZWNvcmQKKyAqLworc3RydWN0IGFmc192bG9jYXRpb24KK3sKKwlhdG9taWNfdAkJdXNhZ2U7CisJc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbGluayBpbiBjZWxsIHZvbHVtZSBsb2NhdGlvbiBsaXN0ICovCisJc3RydWN0IGFmc190aW1lcgl0aW1lb3V0OwkvKiBkZWNhY2hpbmcgdGltZXIgKi8KKwlzdHJ1Y3QgYWZzX2NlbGwJCSpjZWxsOwkJLyogY2VsbCB0byB3aGljaCB2b2x1bWUgYmVsb25ncyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwlzdHJ1Y3QgY2FjaGVmc19jb29raWUJKmNhY2hlOwkJLyogY2FjaGluZyBjb29raWUgKi8KKyNlbmRpZgorCXN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uIHZsZGI7CS8qIHZvbHVtZSBpbmZvcm1hdGlvbiBEQiByZWNvcmQgKi8KKwlzdHJ1Y3QgYWZzX3ZvbHVtZQkqdm9sc1szXTsJLyogdm9sdW1lIGFjY2VzcyByZWNvcmQgcG9pbnRlciAoaW5kZXggYnkgdHlwZSkgKi8KKwlyd2xvY2tfdAkJbG9jazsJCS8qIGFjY2VzcyBsb2NrICovCisJdW5zaWduZWQgbG9uZwkJcmVhZF9qaWY7CS8qIHRpbWUgYXQgd2hpY2ggbGFzdCByZWFkIGZyb20gdmxzZXJ2ZXIgKi8KKwlzdHJ1Y3QgYWZzX3RpbWVyCXVwZF90aW1lcjsJLyogdXBkYXRlIHRpbWVyICovCisJc3RydWN0IGFmc19hc3luY19vcAl1cGRfb3A7CQkvKiB1cGRhdGUgb3BlcmF0aW9uICovCisJYWZzX3Zsb2NhdGlvbl91cGRfdAl1cGRfc3RhdGU7CS8qIHVwZGF0ZSBzdGF0ZSAqLworCXVuc2lnbmVkIHNob3J0CQl1cGRfZmlyc3Rfc3ZpeDsJLyogZmlyc3Qgc2VydmVyIGluZGV4IGR1cmluZyB1cGRhdGUgKi8KKwl1bnNpZ25lZCBzaG9ydAkJdXBkX2N1cnJfc3ZpeDsJLyogY3VycmVudCBzZXJ2ZXIgaW5kZXggZHVyaW5nIHVwZGF0ZSAqLworCXVuc2lnbmVkIHNob3J0CQl1cGRfcmVqX2NudDsJLyogRU5PTUVESVVNIGNvdW50IGR1cmluZyB1cGRhdGUgKi8KKwl1bnNpZ25lZCBzaG9ydAkJdXBkX2J1c3lfY250OwkvKiBFQlVTWSBjb3VudCBkdXJpbmcgdXBkYXRlICovCisJdW5zaWduZWQgc2hvcnQJCXZhbGlkOwkJLyogVCBpZiB2YWxpZCAqLworfTsKKworZXh0ZXJuIGludCBhZnNfdmxvY2F0aW9uX2xvb2t1cChzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwsCisJCQkJY29uc3QgY2hhciAqbmFtZSwKKwkJCQl1bnNpZ25lZCBuYW1lc3osCisJCQkJc3RydWN0IGFmc192bG9jYXRpb24gKipfdmxvY2F0aW9uKTsKKworI2RlZmluZSBhZnNfZ2V0X3Zsb2NhdGlvbihWKSBkbyB7IGF0b21pY19pbmMoJihWKS0+dXNhZ2UpOyB9IHdoaWxlKDApCisKK2V4dGVybiB2b2lkIGFmc19wdXRfdmxvY2F0aW9uKHN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24pOworZXh0ZXJuIHZvaWQgYWZzX3Zsb2NhdGlvbl9kb190aW1lb3V0KHN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQUZTIHZvbHVtZSBhY2Nlc3MgcmVjb3JkCisgKi8KK3N0cnVjdCBhZnNfdm9sdW1lCit7CisJYXRvbWljX3QJCXVzYWdlOworCXN0cnVjdCBhZnNfY2VsbAkJKmNlbGw7CQkvKiBjZWxsIHRvIHdoaWNoIGJlbG9uZ3MgKHVucmVmZCBwdHIpICovCisJc3RydWN0IGFmc192bG9jYXRpb24JKnZsb2NhdGlvbjsJLyogdm9sdW1lIGxvY2F0aW9uICovCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorCXN0cnVjdCBjYWNoZWZzX2Nvb2tpZQkqY2FjaGU7CQkvKiBjYWNoaW5nIGNvb2tpZSAqLworI2VuZGlmCisJYWZzX3ZvbGlkX3QJCXZpZDsJCS8qIHZvbHVtZSBJRCAqLworCWFmc192b2x0eXBlX3QgX19wYWNrZWQJdHlwZTsJCS8qIHR5cGUgb2Ygdm9sdW1lICovCisJY2hhcgkJCXR5cGVfZm9yY2U7CS8qIGZvcmNlIHZvbHVtZSB0eXBlIChzdXBwcmVzcyBSL08gLT4gUi9XKSAqLworCXVuc2lnbmVkIHNob3J0CQluc2VydmVyczsJLyogbnVtYmVyIG9mIHNlcnZlciBzbG90cyBmaWxsZWQgKi8KKwl1bnNpZ25lZCBzaG9ydAkJcmpzZXJ2ZXJzOwkvKiBudW1iZXIgb2Ygc2VydmVycyBkaXNjYXJkZWQgZHVlIHRvIC1FTk9NRURJVU0gKi8KKwlzdHJ1Y3QgYWZzX3NlcnZlcgkqc2VydmVyc1s4XTsJLyogc2VydmVycyBvbiB3aGljaCB2b2x1bWUgcmVzaWRlcyAob3JkZXJlZCkgKi8KKwlzdHJ1Y3Qgcndfc2VtYXBob3JlCXNlcnZlcl9zZW07CS8qIGxvY2sgZm9yIGFjY2Vzc2luZyBjdXJyZW50IHNlcnZlciAqLworfTsKKworZXh0ZXJuIGludCBhZnNfdm9sdW1lX2xvb2t1cChjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICBzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwsCisJCQkgICAgIGludCByd3BhdGgsCisJCQkgICAgIHN0cnVjdCBhZnNfdm9sdW1lICoqX3ZvbHVtZSk7CisKKyNkZWZpbmUgYWZzX2dldF92b2x1bWUoVikgZG8geyBhdG9taWNfaW5jKCYoViktPnVzYWdlKTsgfSB3aGlsZSgwKQorCitleHRlcm4gdm9pZCBhZnNfcHV0X3ZvbHVtZShzdHJ1Y3QgYWZzX3ZvbHVtZSAqdm9sdW1lKTsKKworZXh0ZXJuIGludCBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcihzdHJ1Y3QgYWZzX3ZvbHVtZSAqdm9sdW1lLAorCQkJCSAgICAgIHN0cnVjdCBhZnNfc2VydmVyICoqX3NlcnZlcik7CisKK2V4dGVybiBpbnQgYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIoc3RydWN0IGFmc192b2x1bWUgKnZvbHVtZSwKKwkJCQkJIHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkJCSBpbnQgcmVzdWx0KTsKKworI2VuZGlmIC8qIF9MSU5VWF9BRlNfVk9MVU1FX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fpby5jIGIvZnMvYWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2YTI2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9haW8uYwpAQCAtMCwwICsxLDE3MjkgQEAKKy8qCisgKglBbiBhc3luYyBJTyBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXgKKyAqCVdyaXR0ZW4gYnkgQmVuamFtaW4gTGFIYWlzZSA8YmNybEBrdmFjay5vcmc+CisgKgorICoJSW1wbGVtZW50cyBhbiBlZmZpY2llbnQgYXN5bmNocm9ub3VzIGlvIGludGVyZmFjZS4KKyAqCisgKglDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqCVNlZSAuLi9DT1BZSU5HIGZvciBsaWNlbnNpbmcgdGVybXMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvYWlvX2FiaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisKKyNkZWZpbmUgREVCVUcgMAorCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9haW8uaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKworI2luY2x1ZGUgPGFzbS9rbWFwX3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKworI2lmIERFQlVHID4gMQorI2RlZmluZSBkcHJpbnRrCQlwcmludGsKKyNlbHNlCisjZGVmaW5lIGRwcmludGsoeC4uLikJZG8geyA7IH0gd2hpbGUgKDApCisjZW5kaWYKKworbG9uZyBhaW9fcnVuID0gMDsgLyogZm9yIHRlc3Rpbmcgb25seSAqLworbG9uZyBhaW9fd2FrZXVwcyA9IDA7IC8qIGZvciB0ZXN0aW5nIG9ubHkgKi8KKworLyotLS0tLS0gc3lzY3RsIHZhcmlhYmxlcy0tLS0qLworYXRvbWljX3QgYWlvX25yID0gQVRPTUlDX0lOSVQoMCk7CS8qIGN1cnJlbnQgc3lzdGVtIHdpZGUgbnVtYmVyIG9mIGFpbyByZXF1ZXN0cyAqLwordW5zaWduZWQgYWlvX21heF9uciA9IDB4MTAwMDA7CS8qIHN5c3RlbSB3aWRlIG1heGltdW0gbnVtYmVyIG9mIGFpbyByZXF1ZXN0cyAqLworLyotLS0tZW5kIHN5c2N0bCB2YXJpYWJsZXMtLS0qLworCitzdGF0aWMga21lbV9jYWNoZV90CSpraW9jYl9jYWNoZXA7CitzdGF0aWMga21lbV9jYWNoZV90CSpraW9jdHhfY2FjaGVwOworCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmFpb193cTsKKworLyogVXNlZCBmb3IgcmFyZSBmcHV0IGNvbXBsZXRpb24uICovCitzdGF0aWMgdm9pZCBhaW9fZnB1dF9yb3V0aW5lKHZvaWQgKik7CitzdGF0aWMgREVDTEFSRV9XT1JLKGZwdXRfd29yaywgYWlvX2ZwdXRfcm91dGluZSwgTlVMTCk7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZnB1dF9sb2NrKTsKK0xJU1RfSEVBRChmcHV0X2hlYWQpOworCitzdGF0aWMgdm9pZCBhaW9fa2lja19oYW5kbGVyKHZvaWQgKik7CisKKy8qIGFpb19zZXR1cAorICoJQ3JlYXRlcyB0aGUgc2xhYiBjYWNoZXMgdXNlZCBieSB0aGUgYWlvIHJvdXRpbmVzLCBwYW5pYyBvbgorICoJZmFpbHVyZSBhcyB0aGlzIGlzIGRvbmUgZWFybHkgZHVyaW5nIHRoZSBib290IHNlcXVlbmNlLgorICovCitzdGF0aWMgaW50IF9faW5pdCBhaW9fc2V0dXAodm9pZCkKK3sKKwlraW9jYl9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgia2lvY2IiLCBzaXplb2Yoc3RydWN0IGtpb2NiKSwKKwkJCQkwLCBTTEFCX0hXQ0FDSEVfQUxJR058U0xBQl9QQU5JQywgTlVMTCwgTlVMTCk7CisJa2lvY3R4X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJraW9jdHgiLCBzaXplb2Yoc3RydWN0IGtpb2N0eCksCisJCQkJMCwgU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfUEFOSUMsIE5VTEwsIE5VTEwpOworCisJYWlvX3dxID0gY3JlYXRlX3dvcmtxdWV1ZSgiYWlvIik7CisKKwlwcl9kZWJ1ZygiYWlvX3NldHVwOiBzaXplb2Yoc3RydWN0IHBhZ2UpID0gJWRcbiIsIChpbnQpc2l6ZW9mKHN0cnVjdCBwYWdlKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWlvX2ZyZWVfcmluZyhzdHJ1Y3Qga2lvY3R4ICpjdHgpCit7CisJc3RydWN0IGFpb19yaW5nX2luZm8gKmluZm8gPSAmY3R4LT5yaW5nX2luZm87CisJbG9uZyBpOworCisJZm9yIChpPTA7IGk8aW5mby0+bnJfcGFnZXM7IGkrKykKKwkJcHV0X3BhZ2UoaW5mby0+cmluZ19wYWdlc1tpXSk7CisKKwlpZiAoaW5mby0+bW1hcF9zaXplKSB7CisJCWRvd25fd3JpdGUoJmN0eC0+bW0tPm1tYXBfc2VtKTsKKwkJZG9fbXVubWFwKGN0eC0+bW0sIGluZm8tPm1tYXBfYmFzZSwgaW5mby0+bW1hcF9zaXplKTsKKwkJdXBfd3JpdGUoJmN0eC0+bW0tPm1tYXBfc2VtKTsKKwl9CisKKwlpZiAoaW5mby0+cmluZ19wYWdlcyAmJiBpbmZvLT5yaW5nX3BhZ2VzICE9IGluZm8tPmludGVybmFsX3BhZ2VzKQorCQlrZnJlZShpbmZvLT5yaW5nX3BhZ2VzKTsKKwlpbmZvLT5yaW5nX3BhZ2VzID0gTlVMTDsKKwlpbmZvLT5uciA9IDA7Cit9CisKK3N0YXRpYyBpbnQgYWlvX3NldHVwX3Jpbmcoc3RydWN0IGtpb2N0eCAqY3R4KQoreworCXN0cnVjdCBhaW9fcmluZyAqcmluZzsKKwlzdHJ1Y3QgYWlvX3JpbmdfaW5mbyAqaW5mbyA9ICZjdHgtPnJpbmdfaW5mbzsKKwl1bnNpZ25lZCBucl9ldmVudHMgPSBjdHgtPm1heF9yZXFzOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgbnJfcGFnZXM7CisKKwkvKiBDb21wZW5zYXRlIGZvciB0aGUgcmluZyBidWZmZXIncyBoZWFkL3RhaWwgb3ZlcmxhcCBlbnRyeSAqLworCW5yX2V2ZW50cyArPSAyOwkvKiAxIGlzIHJlcXVpcmVkLCAyIGZvciBnb29kIGx1Y2sgKi8KKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGFpb19yaW5nKTsKKwlzaXplICs9IHNpemVvZihzdHJ1Y3QgaW9fZXZlbnQpICogbnJfZXZlbnRzOworCW5yX3BhZ2VzID0gKHNpemUgKyBQQUdFX1NJWkUtMSkgPj4gUEFHRV9TSElGVDsKKworCWlmIChucl9wYWdlcyA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJbnJfZXZlbnRzID0gKFBBR0VfU0laRSAqIG5yX3BhZ2VzIC0gc2l6ZW9mKHN0cnVjdCBhaW9fcmluZykpIC8gc2l6ZW9mKHN0cnVjdCBpb19ldmVudCk7CisKKwlpbmZvLT5uciA9IDA7CisJaW5mby0+cmluZ19wYWdlcyA9IGluZm8tPmludGVybmFsX3BhZ2VzOworCWlmIChucl9wYWdlcyA+IEFJT19SSU5HX1BBR0VTKSB7CisJCWluZm8tPnJpbmdfcGFnZXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqIG5yX3BhZ2VzLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFpbmZvLT5yaW5nX3BhZ2VzKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbXNldChpbmZvLT5yaW5nX3BhZ2VzLCAwLCBzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBucl9wYWdlcyk7CisJfQorCisJaW5mby0+bW1hcF9zaXplID0gbnJfcGFnZXMgKiBQQUdFX1NJWkU7CisJZHByaW50aygiYXR0ZW1wdGluZyBtbWFwIG9mICVsdSBieXRlc1xuIiwgaW5mby0+bW1hcF9zaXplKTsKKwlkb3duX3dyaXRlKCZjdHgtPm1tLT5tbWFwX3NlbSk7CisJaW5mby0+bW1hcF9iYXNlID0gZG9fbW1hcChOVUxMLCAwLCBpbmZvLT5tbWFwX3NpemUsIAorCQkJCSAgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9BTk9OfE1BUF9QUklWQVRFLAorCQkJCSAgMCk7CisJaWYgKElTX0VSUigodm9pZCAqKWluZm8tPm1tYXBfYmFzZSkpIHsKKwkJdXBfd3JpdGUoJmN0eC0+bW0tPm1tYXBfc2VtKTsKKwkJcHJpbnRrKCJtbWFwIGVycjogJWxkXG4iLCAtaW5mby0+bW1hcF9iYXNlKTsKKwkJaW5mby0+bW1hcF9zaXplID0gMDsKKwkJYWlvX2ZyZWVfcmluZyhjdHgpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlkcHJpbnRrKCJtbWFwIGFkZHJlc3M6IDB4JTA4bHhcbiIsIGluZm8tPm1tYXBfYmFzZSk7CisJaW5mby0+bnJfcGFnZXMgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdHgtPm1tLAorCQkJCQlpbmZvLT5tbWFwX2Jhc2UsIG5yX3BhZ2VzLCAKKwkJCQkJMSwgMCwgaW5mby0+cmluZ19wYWdlcywgTlVMTCk7CisJdXBfd3JpdGUoJmN0eC0+bW0tPm1tYXBfc2VtKTsKKworCWlmICh1bmxpa2VseShpbmZvLT5ucl9wYWdlcyAhPSBucl9wYWdlcykpIHsKKwkJYWlvX2ZyZWVfcmluZyhjdHgpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwljdHgtPnVzZXJfaWQgPSBpbmZvLT5tbWFwX2Jhc2U7CisKKwlpbmZvLT5uciA9IG5yX2V2ZW50czsJCS8qIHRydXN0ZWQgY29weSAqLworCisJcmluZyA9IGttYXBfYXRvbWljKGluZm8tPnJpbmdfcGFnZXNbMF0sIEtNX1VTRVIwKTsKKwlyaW5nLT5uciA9IG5yX2V2ZW50czsJLyogdXNlciBjb3B5ICovCisJcmluZy0+aWQgPSBjdHgtPnVzZXJfaWQ7CisJcmluZy0+aGVhZCA9IHJpbmctPnRhaWwgPSAwOworCXJpbmctPm1hZ2ljID0gQUlPX1JJTkdfTUFHSUM7CisJcmluZy0+Y29tcGF0X2ZlYXR1cmVzID0gQUlPX1JJTkdfQ09NUEFUX0ZFQVRVUkVTOworCXJpbmctPmluY29tcGF0X2ZlYXR1cmVzID0gQUlPX1JJTkdfSU5DT01QQVRfRkVBVFVSRVM7CisJcmluZy0+aGVhZGVyX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYWlvX3JpbmcpOworCWt1bm1hcF9hdG9taWMocmluZywgS01fVVNFUjApOworCisJcmV0dXJuIDA7Cit9CisKKworLyogYWlvX3JpbmdfZXZlbnQ6IHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBldmVudCBhdCB0aGUgZ2l2ZW4gaW5kZXggZnJvbQorICoga21hcF9hdG9taWMoLCBrbSkuICBSZWxlYXNlIHRoZSBwb2ludGVyIHdpdGggcHV0X2Fpb19yaW5nX2V2ZW50KCk7CisgKi8KKyNkZWZpbmUgQUlPX0VWRU5UU19QRVJfUEFHRQkoUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBpb19ldmVudCkpCisjZGVmaW5lIEFJT19FVkVOVFNfRklSU1RfUEFHRQkoKFBBR0VfU0laRSAtIHNpemVvZihzdHJ1Y3QgYWlvX3JpbmcpKSAvIHNpemVvZihzdHJ1Y3QgaW9fZXZlbnQpKQorI2RlZmluZSBBSU9fRVZFTlRTX09GRlNFVAkoQUlPX0VWRU5UU19QRVJfUEFHRSAtIEFJT19FVkVOVFNfRklSU1RfUEFHRSkKKworI2RlZmluZSBhaW9fcmluZ19ldmVudChpbmZvLCBuciwga20pICh7CQkJCQlcCisJdW5zaWduZWQgcG9zID0gKG5yKSArIEFJT19FVkVOVFNfT0ZGU0VUOwkJCVwKKwlzdHJ1Y3QgaW9fZXZlbnQgKl9fZXZlbnQ7CQkJCQlcCisJX19ldmVudCA9IGttYXBfYXRvbWljKAkJCQkJCVwKKwkJCShpbmZvKS0+cmluZ19wYWdlc1twb3MgLyBBSU9fRVZFTlRTX1BFUl9QQUdFXSwga20pOyBcCisJX19ldmVudCArPSBwb3MgJSBBSU9fRVZFTlRTX1BFUl9QQUdFOwkJCQlcCisJX19ldmVudDsJCQkJCQkJXAorfSkKKworI2RlZmluZSBwdXRfYWlvX3JpbmdfZXZlbnQoZXZlbnQsIGttKSBkbyB7CVwKKwlzdHJ1Y3QgaW9fZXZlbnQgKl9fZXZlbnQgPSAoZXZlbnQpOwlcCisJKHZvaWQpX19ldmVudDsJCQkJXAorCWt1bm1hcF9hdG9taWMoKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpX19ldmVudCAmIFBBR0VfTUFTSyksIGttKTsgXAorfSB3aGlsZSgwKQorCisvKiBpb2N0eF9hbGxvYworICoJQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBhbiBpb2N0eC4gIFJldHVybnMgYW4gRVJSX1BUUiBpZiBpdCBmYWlsZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qga2lvY3R4ICppb2N0eF9hbGxvYyh1bnNpZ25lZCBucl9ldmVudHMpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisJc3RydWN0IGtpb2N0eCAqY3R4OworCisJLyogUHJldmVudCBvdmVyZmxvd3MgKi8KKwlpZiAoKG5yX2V2ZW50cyA+ICgweDEwMDAwMDAwVSAvIHNpemVvZihzdHJ1Y3QgaW9fZXZlbnQpKSkgfHwKKwkgICAgKG5yX2V2ZW50cyA+ICgweDEwMDAwMDAwVSAvIHNpemVvZihzdHJ1Y3Qga2lvY2IpKSkpIHsKKwkJcHJfZGVidWcoIkVOT01FTTogbnJfZXZlbnRzIHRvbyBoaWdoXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJaWYgKG5yX2V2ZW50cyA+IGFpb19tYXhfbnIpCisJCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOworCisJY3R4ID0ga21lbV9jYWNoZV9hbGxvYyhraW9jdHhfY2FjaGVwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwltZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpOworCWN0eC0+bWF4X3JlcXMgPSBucl9ldmVudHM7CisJbW0gPSBjdHgtPm1tID0gY3VycmVudC0+bW07CisJYXRvbWljX2luYygmbW0tPm1tX2NvdW50KTsKKworCWF0b21pY19zZXQoJmN0eC0+dXNlcnMsIDEpOworCXNwaW5fbG9ja19pbml0KCZjdHgtPmN0eF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY3R4LT5yaW5nX2luZm8ucmluZ19sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjdHgtPndhaXQpOworCisJSU5JVF9MSVNUX0hFQUQoJmN0eC0+YWN0aXZlX3JlcXMpOworCUlOSVRfTElTVF9IRUFEKCZjdHgtPnJ1bl9saXN0KTsKKwlJTklUX1dPUksoJmN0eC0+d3EsIGFpb19raWNrX2hhbmRsZXIsIGN0eCk7CisKKwlpZiAoYWlvX3NldHVwX3JpbmcoY3R4KSA8IDApCisJCWdvdG8gb3V0X2ZyZWVjdHg7CisKKwkvKiBsaW1pdCB0aGUgbnVtYmVyIG9mIHN5c3RlbSB3aWRlIGFpb3MgKi8KKwlhdG9taWNfYWRkKGN0eC0+bWF4X3JlcXMsICZhaW9fbnIpOwkvKiB1bmRvbmUgYnkgX19wdXRfaW9jdHggKi8KKwlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJmFpb19ucikgPiBhaW9fbWF4X25yKSkKKwkJZ290byBvdXRfY2xlYW51cDsKKworCS8qIG5vdyBsaW5rIGludG8gZ2xvYmFsIGxpc3QuICBrbHVkZ2UuICBGSVhNRSAqLworCXdyaXRlX2xvY2soJm1tLT5pb2N0eF9saXN0X2xvY2spOworCWN0eC0+bmV4dCA9IG1tLT5pb2N0eF9saXN0OworCW1tLT5pb2N0eF9saXN0ID0gY3R4OworCXdyaXRlX3VubG9jaygmbW0tPmlvY3R4X2xpc3RfbG9jayk7CisKKwlkcHJpbnRrKCJhaW86IGFsbG9jYXRlZCBpb2N0eCAlcFslbGRdOiBtbT0lcCBtYXNrPTB4JXhcbiIsCisJCWN0eCwgY3R4LT51c2VyX2lkLCBjdXJyZW50LT5tbSwgY3R4LT5yaW5nX2luZm8ubnIpOworCXJldHVybiBjdHg7CisKK291dF9jbGVhbnVwOgorCWF0b21pY19zdWIoY3R4LT5tYXhfcmVxcywgJmFpb19ucik7CisJY3R4LT5tYXhfcmVxcyA9IDA7CS8qIHByZXZlbnQgX19wdXRfaW9jdHggZnJvbSBzdWInaW5nIGFpb19uciAqLworCV9fcHV0X2lvY3R4KGN0eCk7CisJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CisKK291dF9mcmVlY3R4OgorCW1tZHJvcChtbSk7CisJa21lbV9jYWNoZV9mcmVlKGtpb2N0eF9jYWNoZXAsIGN0eCk7CisJY3R4ID0gRVJSX1BUUigtRU5PTUVNKTsKKworCWRwcmludGsoImFpbzogZXJyb3IgYWxsb2NhdGluZyBpb2N0eCAlcFxuIiwgY3R4KTsKKwlyZXR1cm4gY3R4OworfQorCisvKiBhaW9fY2FuY2VsX2FsbAorICoJQ2FuY2VscyBhbGwgb3V0c3RhbmRpbmcgYWlvIHJlcXVlc3RzIG9uIGFuIGFpbyBjb250ZXh0LiAgVXNlZCAKKyAqCXdoZW4gdGhlIHByb2Nlc3NlcyBvd25pbmcgYSBjb250ZXh0IGhhdmUgYWxsIGV4aXRlZCB0byBlbmNvdXJhZ2UgCisgKgl0aGUgcmFwaWQgZGVzdHJ1Y3Rpb24gb2YgdGhlIGtpb2N0eC4KKyAqLworc3RhdGljIHZvaWQgYWlvX2NhbmNlbF9hbGwoc3RydWN0IGtpb2N0eCAqY3R4KQoreworCWludCAoKmNhbmNlbCkoc3RydWN0IGtpb2NiICosIHN0cnVjdCBpb19ldmVudCAqKTsKKwlzdHJ1Y3QgaW9fZXZlbnQgcmVzOworCXNwaW5fbG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCWN0eC0+ZGVhZCA9IDE7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjdHgtPmFjdGl2ZV9yZXFzKSkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MgPSBjdHgtPmFjdGl2ZV9yZXFzLm5leHQ7CisJCXN0cnVjdCBraW9jYiAqaW9jYiA9IGxpc3Rfa2lvY2IocG9zKTsKKwkJbGlzdF9kZWxfaW5pdCgmaW9jYi0+a2lfbGlzdCk7CisJCWNhbmNlbCA9IGlvY2ItPmtpX2NhbmNlbDsKKwkJa2lvY2JTZXRDYW5jZWxsZWQoaW9jYik7CisJCWlmIChjYW5jZWwpIHsKKwkJCWlvY2ItPmtpX3VzZXJzKys7CisJCQlzcGluX3VubG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCQkJY2FuY2VsKGlvY2IsICZyZXMpOworCQkJc3Bpbl9sb2NrX2lycSgmY3R4LT5jdHhfbG9jayk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKK30KKwordm9pZCB3YWl0X2Zvcl9hbGxfYWlvcyhzdHJ1Y3Qga2lvY3R4ICpjdHgpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIHRzayk7CisKKwlpZiAoIWN0eC0+cmVxc19hY3RpdmUpCisJCXJldHVybjsKKworCWFkZF93YWl0X3F1ZXVlKCZjdHgtPndhaXQsICZ3YWl0KTsKKwlzZXRfdGFza19zdGF0ZSh0c2ssIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwl3aGlsZSAoY3R4LT5yZXFzX2FjdGl2ZSkgeworCQlzY2hlZHVsZSgpOworCQlzZXRfdGFza19zdGF0ZSh0c2ssIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwl9CisJX19zZXRfdGFza19zdGF0ZSh0c2ssIFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmN0eC0+d2FpdCwgJndhaXQpOworfQorCisvKiB3YWl0X29uX3N5bmNfa2lvY2I6CisgKglXYWl0cyBvbiB0aGUgZ2l2ZW4gc3luYyBraW9jYiB0byBjb21wbGV0ZS4KKyAqLworc3NpemVfdCBmYXN0Y2FsbCB3YWl0X29uX3N5bmNfa2lvY2Ioc3RydWN0IGtpb2NiICppb2NiKQoreworCXdoaWxlIChpb2NiLT5raV91c2VycykgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCWlmICghaW9jYi0+a2lfdXNlcnMpCisJCQlicmVhazsKKwkJc2NoZWR1bGUoKTsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiBpb2NiLT5raV91c2VyX2RhdGE7Cit9CisKKy8qIGV4aXRfYWlvOiBjYWxsZWQgd2hlbiB0aGUgbGFzdCB1c2VyIG9mIG1tIGdvZXMgYXdheS4gIEF0IHRoaXMgcG9pbnQsIAorICogdGhlcmUgaXMgbm8gd2F5IGZvciBhbnkgbmV3IHJlcXVlc3RzIHRvIGJlIHN1Ym1pdGVkIG9yIGFueSBvZiB0aGUgCisgKiBpb18qIHN5c2NhbGxzIHRvIGJlIGNhbGxlZCBvbiB0aGUgY29udGV4dC4gIEhvd2V2ZXIsIHRoZXJlIG1heSBiZSAKKyAqIG91dHN0YW5kaW5nIHJlcXVlc3RzIHdoaWNoIGhvbGQgcmVmZXJlbmNlcyB0byB0aGUgY29udGV4dDsgYXMgdGhleSAKKyAqIGdvIGF3YXksIHRoZXkgd2lsbCBjYWxsIHB1dF9pb2N0eCBhbmQgcmVsZWFzZSBhbnkgcGlubmVkIG1lbW9yeQorICogYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0IChoZWxkIHZpYSBzdHJ1Y3QgcGFnZSAqIHJlZmVyZW5jZXMpLgorICovCit2b2lkIGZhc3RjYWxsIGV4aXRfYWlvKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXN0cnVjdCBraW9jdHggKmN0eCA9IG1tLT5pb2N0eF9saXN0OworCW1tLT5pb2N0eF9saXN0ID0gTlVMTDsKKwl3aGlsZSAoY3R4KSB7CisJCXN0cnVjdCBraW9jdHggKm5leHQgPSBjdHgtPm5leHQ7CisJCWN0eC0+bmV4dCA9IE5VTEw7CisJCWFpb19jYW5jZWxfYWxsKGN0eCk7CisKKwkJd2FpdF9mb3JfYWxsX2Fpb3MoY3R4KTsKKwkJLyoKKwkJICogdGhpcyBpcyBhbiBvdmVya2lsbCwgYnV0IGVuc3VyZXMgd2UgZG9uJ3QgbGVhdmUKKwkJICogdGhlIGN0eCBvbiB0aGUgYWlvX3dxCisJCSAqLworCQlmbHVzaF93b3JrcXVldWUoYWlvX3dxKTsKKworCQlpZiAoMSAhPSBhdG9taWNfcmVhZCgmY3R4LT51c2VycykpCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSJleGl0X2Fpbzppb2N0eCBzdGlsbCBhbGl2ZTogJWQgJWQgJWRcbiIsCisJCQkJYXRvbWljX3JlYWQoJmN0eC0+dXNlcnMpLCBjdHgtPmRlYWQsCisJCQkJY3R4LT5yZXFzX2FjdGl2ZSk7CisJCXB1dF9pb2N0eChjdHgpOworCQljdHggPSBuZXh0OworCX0KK30KKworLyogX19wdXRfaW9jdHgKKyAqCUNhbGxlZCB3aGVuIHRoZSBsYXN0IHVzZXIgb2YgYW4gYWlvIGNvbnRleHQgaGFzIGdvbmUgYXdheSwKKyAqCWFuZCB0aGUgc3RydWN0IG5lZWRzIHRvIGJlIGZyZWVkLgorICovCit2b2lkIGZhc3RjYWxsIF9fcHV0X2lvY3R4KHN0cnVjdCBraW9jdHggKmN0eCkKK3sKKwl1bnNpZ25lZCBucl9ldmVudHMgPSBjdHgtPm1heF9yZXFzOworCisJaWYgKHVubGlrZWx5KGN0eC0+cmVxc19hY3RpdmUpKQorCQlCVUcoKTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmN0eC0+d3EpOworCWZsdXNoX3dvcmtxdWV1ZShhaW9fd3EpOworCWFpb19mcmVlX3JpbmcoY3R4KTsKKwltbWRyb3AoY3R4LT5tbSk7CisJY3R4LT5tbSA9IE5VTEw7CisJcHJfZGVidWcoIl9fcHV0X2lvY3R4OiBmcmVlaW5nICVwXG4iLCBjdHgpOworCWttZW1fY2FjaGVfZnJlZShraW9jdHhfY2FjaGVwLCBjdHgpOworCisJYXRvbWljX3N1Yihucl9ldmVudHMsICZhaW9fbnIpOworfQorCisvKiBhaW9fZ2V0X3JlcQorICoJQWxsb2NhdGUgYSBzbG90IGZvciBhbiBhaW8gcmVxdWVzdC4gIEluY3JlbWVudHMgdGhlIHVzZXJzIGNvdW50CisgKiBvZiB0aGUga2lvY3R4IHNvIHRoYXQgdGhlIGtpb2N0eCBzdGF5cyBhcm91bmQgdW50aWwgYWxsIHJlcXVlc3RzIGFyZQorICogY29tcGxldGUuICBSZXR1cm5zIE5VTEwgaWYgbm8gcmVxdWVzdHMgYXJlIGZyZWUuCisgKgorICogUmV0dXJucyB3aXRoIGtpb2NiLT51c2VycyBzZXQgdG8gMi4gIFRoZSBpbyBzdWJtaXQgY29kZSBwYXRoIGhvbGRzCisgKiBhbiBleHRyYSByZWZlcmVuY2Ugd2hpbGUgc3VibWl0dGluZyB0aGUgaS9vLgorICogVGhpcyBwcmV2ZW50cyByYWNlcyBiZXR3ZWVuIHRoZSBhaW8gY29kZSBwYXRoIHJlZmVyZW5jaW5nIHRoZQorICogcmVxIChhZnRlciBzdWJtaXR0aW5nIGl0KSBhbmQgYWlvX2NvbXBsZXRlKCkgZnJlZWluZyB0aGUgcmVxLgorICovCitzdGF0aWMgc3RydWN0IGtpb2NiICpGQVNUQ0FMTChfX2Fpb19nZXRfcmVxKHN0cnVjdCBraW9jdHggKmN0eCkpOworc3RhdGljIHN0cnVjdCBraW9jYiBmYXN0Y2FsbCAqX19haW9fZ2V0X3JlcShzdHJ1Y3Qga2lvY3R4ICpjdHgpCit7CisJc3RydWN0IGtpb2NiICpyZXEgPSBOVUxMOworCXN0cnVjdCBhaW9fcmluZyAqcmluZzsKKwlpbnQgb2theSA9IDA7CisKKwlyZXEgPSBrbWVtX2NhY2hlX2FsbG9jKGtpb2NiX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFyZXEpKQorCQlyZXR1cm4gTlVMTDsKKworCXJlcS0+a2lfZmxhZ3MgPSAxIDw8IEtJRl9MT0NLRUQ7CisJcmVxLT5raV91c2VycyA9IDI7CisJcmVxLT5raV9rZXkgPSAwOworCXJlcS0+a2lfY3R4ID0gY3R4OworCXJlcS0+a2lfY2FuY2VsID0gTlVMTDsKKwlyZXEtPmtpX3JldHJ5ID0gTlVMTDsKKwlyZXEtPmtpX29iai51c2VyID0gTlVMTDsKKwlyZXEtPmtpX2R0b3IgPSBOVUxMOworCXJlcS0+cHJpdmF0ZSA9IE5VTEw7CisJSU5JVF9MSVNUX0hFQUQoJnJlcS0+a2lfcnVuX2xpc3QpOworCisJLyogQ2hlY2sgaWYgdGhlIGNvbXBsZXRpb24gcXVldWUgaGFzIGVub3VnaCBmcmVlIHNwYWNlIHRvCisJICogYWNjZXB0IGFuIGV2ZW50IGZyb20gdGhpcyBpby4KKwkgKi8KKwlzcGluX2xvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKKwlyaW5nID0ga21hcF9hdG9taWMoY3R4LT5yaW5nX2luZm8ucmluZ19wYWdlc1swXSwgS01fVVNFUjApOworCWlmIChjdHgtPnJlcXNfYWN0aXZlIDwgYWlvX3JpbmdfYXZhaWwoJmN0eC0+cmluZ19pbmZvLCByaW5nKSkgeworCQlsaXN0X2FkZCgmcmVxLT5raV9saXN0LCAmY3R4LT5hY3RpdmVfcmVxcyk7CisJCWdldF9pb2N0eChjdHgpOworCQljdHgtPnJlcXNfYWN0aXZlKys7CisJCW9rYXkgPSAxOworCX0KKwlrdW5tYXBfYXRvbWljKHJpbmcsIEtNX1VTRVIwKTsKKwlzcGluX3VubG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCisJaWYgKCFva2F5KSB7CisJCWttZW1fY2FjaGVfZnJlZShraW9jYl9jYWNoZXAsIHJlcSk7CisJCXJlcSA9IE5VTEw7CisJfQorCisJcmV0dXJuIHJlcTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qga2lvY2IgKmFpb19nZXRfcmVxKHN0cnVjdCBraW9jdHggKmN0eCkKK3sKKwlzdHJ1Y3Qga2lvY2IgKnJlcTsKKwkvKiBIYW5kbGUgYSBwb3RlbnRpYWwgc3RhcnZhdGlvbiBjYXNlIC0tIHNob3VsZCBiZSBleGNlZWRpbmdseSByYXJlIGFzIAorCSAqIHJlcXVlc3RzIHdpbGwgYmUgc3R1Y2sgb24gZnB1dF9oZWFkIG9ubHkgaWYgdGhlIGFpb19mcHV0X3JvdXRpbmUgaXMgCisJICogZGVsYXllZCBhbmQgdGhlIHJlcXVlc3RzIHdlcmUgdGhlIGxhc3QgdXNlciBvZiB0aGUgc3RydWN0IGZpbGUuCisJICovCisJcmVxID0gX19haW9fZ2V0X3JlcShjdHgpOworCWlmICh1bmxpa2VseShOVUxMID09IHJlcSkpIHsKKwkJYWlvX2ZwdXRfcm91dGluZShOVUxMKTsKKwkJcmVxID0gX19haW9fZ2V0X3JlcShjdHgpOworCX0KKwlyZXR1cm4gcmVxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVhbGx5X3B1dF9yZXEoc3RydWN0IGtpb2N0eCAqY3R4LCBzdHJ1Y3Qga2lvY2IgKnJlcSkKK3sKKwlpZiAocmVxLT5raV9kdG9yKQorCQlyZXEtPmtpX2R0b3IocmVxKTsKKwlyZXEtPmtpX2N0eCA9IE5VTEw7CisJcmVxLT5raV9maWxwID0gTlVMTDsKKwlyZXEtPmtpX29iai51c2VyID0gTlVMTDsKKwlyZXEtPmtpX2R0b3IgPSBOVUxMOworCXJlcS0+cHJpdmF0ZSA9IE5VTEw7CisJa21lbV9jYWNoZV9mcmVlKGtpb2NiX2NhY2hlcCwgcmVxKTsKKwljdHgtPnJlcXNfYWN0aXZlLS07CisKKwlpZiAodW5saWtlbHkoIWN0eC0+cmVxc19hY3RpdmUgJiYgY3R4LT5kZWFkKSkKKwkJd2FrZV91cCgmY3R4LT53YWl0KTsKK30KKworc3RhdGljIHZvaWQgYWlvX2ZwdXRfcm91dGluZSh2b2lkICpkYXRhKQoreworCXNwaW5fbG9ja19pcnEoJmZwdXRfbG9jayk7CisJd2hpbGUgKGxpa2VseSghbGlzdF9lbXB0eSgmZnB1dF9oZWFkKSkpIHsKKwkJc3RydWN0IGtpb2NiICpyZXEgPSBsaXN0X2tpb2NiKGZwdXRfaGVhZC5uZXh0KTsKKwkJc3RydWN0IGtpb2N0eCAqY3R4ID0gcmVxLT5raV9jdHg7CisKKwkJbGlzdF9kZWwoJnJlcS0+a2lfbGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycSgmZnB1dF9sb2NrKTsKKworCQkvKiBDb21wbGV0ZSB0aGUgZnB1dCAqLworCQlfX2ZwdXQocmVxLT5raV9maWxwKTsKKworCQkvKiBMaW5rIHRoZSBpb2NiIGludG8gdGhlIGNvbnRleHQncyBmcmVlIGxpc3QgKi8KKwkJc3Bpbl9sb2NrX2lycSgmY3R4LT5jdHhfbG9jayk7CisJCXJlYWxseV9wdXRfcmVxKGN0eCwgcmVxKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKKworCQlwdXRfaW9jdHgoY3R4KTsKKwkJc3Bpbl9sb2NrX2lycSgmZnB1dF9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZmcHV0X2xvY2spOworfQorCisvKiBfX2Fpb19wdXRfcmVxCisgKglSZXR1cm5zIHRydWUgaWYgdGhpcyBwdXQgd2FzIHRoZSBsYXN0IHVzZXIgb2YgdGhlIHJlcXVlc3QuCisgKi8KK3N0YXRpYyBpbnQgX19haW9fcHV0X3JlcShzdHJ1Y3Qga2lvY3R4ICpjdHgsIHN0cnVjdCBraW9jYiAqcmVxKQoreworCWRwcmludGsoS0VSTl9ERUJVRyAiYWlvX3B1dCglcCk6IGZfY291bnQ9JWRcbiIsCisJCXJlcSwgYXRvbWljX3JlYWQoJnJlcS0+a2lfZmlscC0+Zl9jb3VudCkpOworCisJcmVxLT5raV91c2VycyAtLTsKKwlpZiAodW5saWtlbHkocmVxLT5raV91c2VycyA8IDApKQorCQlCVUcoKTsKKwlpZiAobGlrZWx5KHJlcS0+a2lfdXNlcnMpKQorCQlyZXR1cm4gMDsKKwlsaXN0X2RlbCgmcmVxLT5raV9saXN0KTsJCS8qIHJlbW92ZSBmcm9tIGFjdGl2ZV9yZXFzICovCisJcmVxLT5raV9jYW5jZWwgPSBOVUxMOworCXJlcS0+a2lfcmV0cnkgPSBOVUxMOworCisJLyogTXVzdCBiZSBkb25lIHVuZGVyIHRoZSBsb2NrIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IGNhbmNlbGxhdGlvbi4KKwkgKiBDYWxsIHRoaXMgYWlvX2ZwdXQgYXMgaXQgZHVwbGljYXRlcyBmcHV0IHZpYSB0aGUgZnB1dF93b3JrLgorCSAqLworCWlmICh1bmxpa2VseShhdG9taWNfZGVjX2FuZF90ZXN0KCZyZXEtPmtpX2ZpbHAtPmZfY291bnQpKSkgeworCQlnZXRfaW9jdHgoY3R4KTsKKwkJc3Bpbl9sb2NrKCZmcHV0X2xvY2spOworCQlsaXN0X2FkZCgmcmVxLT5raV9saXN0LCAmZnB1dF9oZWFkKTsKKwkJc3Bpbl91bmxvY2soJmZwdXRfbG9jayk7CisJCXF1ZXVlX3dvcmsoYWlvX3dxLCAmZnB1dF93b3JrKTsKKwl9IGVsc2UKKwkJcmVhbGx5X3B1dF9yZXEoY3R4LCByZXEpOworCXJldHVybiAxOworfQorCisvKiBhaW9fcHV0X3JlcQorICoJUmV0dXJucyB0cnVlIGlmIHRoaXMgcHV0IHdhcyB0aGUgbGFzdCB1c2VyIG9mIHRoZSBraW9jYiwKKyAqCWZhbHNlIGlmIHRoZSByZXF1ZXN0IGlzIHN0aWxsIGluIHVzZS4KKyAqLworaW50IGZhc3RjYWxsIGFpb19wdXRfcmVxKHN0cnVjdCBraW9jYiAqcmVxKQoreworCXN0cnVjdCBraW9jdHggKmN0eCA9IHJlcS0+a2lfY3R4OworCWludCByZXQ7CisJc3Bpbl9sb2NrX2lycSgmY3R4LT5jdHhfbG9jayk7CisJcmV0ID0gX19haW9fcHV0X3JlcShjdHgsIHJlcSk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKKwlpZiAocmV0KQorCQlwdXRfaW9jdHgoY3R4KTsKKwlyZXR1cm4gcmV0OworfQorCisvKglMb29rdXAgYW4gaW9jdHggaWQuICBpb2N0eF9saXN0IGlzIGxvY2tsZXNzIGZvciByZWFkcy4KKyAqCUZJWE1FOiB0aGlzIGlzIE8obikgYW5kIGlzIG9ubHkgc3VpdGFibGUgZm9yIGRldmVsb3BtZW50LgorICovCitzdHJ1Y3Qga2lvY3R4ICpsb29rdXBfaW9jdHgodW5zaWduZWQgbG9uZyBjdHhfaWQpCit7CisJc3RydWN0IGtpb2N0eCAqaW9jdHg7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisKKwltbSA9IGN1cnJlbnQtPm1tOworCXJlYWRfbG9jaygmbW0tPmlvY3R4X2xpc3RfbG9jayk7CisJZm9yIChpb2N0eCA9IG1tLT5pb2N0eF9saXN0OyBpb2N0eDsgaW9jdHggPSBpb2N0eC0+bmV4dCkKKwkJaWYgKGxpa2VseShpb2N0eC0+dXNlcl9pZCA9PSBjdHhfaWQgJiYgIWlvY3R4LT5kZWFkKSkgeworCQkJZ2V0X2lvY3R4KGlvY3R4KTsKKwkJCWJyZWFrOworCQl9CisJcmVhZF91bmxvY2soJm1tLT5pb2N0eF9saXN0X2xvY2spOworCisJcmV0dXJuIGlvY3R4OworfQorCisvKgorICogdXNlX21tCisgKglNYWtlcyB0aGUgY2FsbGluZyBrZXJuZWwgdGhyZWFkIHRha2Ugb24gdGhlIHNwZWNpZmllZAorICoJbW0gY29udGV4dC4KKyAqCUNhbGxlZCBieSB0aGUgcmV0cnkgdGhyZWFkIGV4ZWN1dGUgcmV0cmllcyB3aXRoaW4gdGhlCisgKglpb2NiIGlzc3VlcidzIG1tIGNvbnRleHQsIHNvIHRoYXQgY29weV9mcm9tL3RvX3VzZXIKKyAqCW9wZXJhdGlvbnMgd29yayBzZWFtbGVzc2x5IGZvciBhaW8uCisgKgkoTm90ZTogdGhpcyByb3V0aW5lIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBvbmx5CisgKglmcm9tIGEga2VybmVsIHRocmVhZCBjb250ZXh0KQorICovCitzdGF0aWMgdm9pZCB1c2VfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJc3RydWN0IG1tX3N0cnVjdCAqYWN0aXZlX21tOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKworCXRhc2tfbG9jayh0c2spOworCXRzay0+ZmxhZ3MgfD0gUEZfQk9SUk9XRURfTU07CisJYWN0aXZlX21tID0gdHNrLT5hY3RpdmVfbW07CisJYXRvbWljX2luYygmbW0tPm1tX2NvdW50KTsKKwl0c2stPm1tID0gbW07CisJdHNrLT5hY3RpdmVfbW0gPSBtbTsKKwlhY3RpdmF0ZV9tbShhY3RpdmVfbW0sIG1tKTsKKwl0YXNrX3VubG9jayh0c2spOworCisJbW1kcm9wKGFjdGl2ZV9tbSk7Cit9CisKKy8qCisgKiB1bnVzZV9tbQorICoJUmV2ZXJzZXMgdGhlIGVmZmVjdCBvZiB1c2VfbW0sIGkuZS4gcmVsZWFzZXMgdGhlCisgKglzcGVjaWZpZWQgbW0gY29udGV4dCB3aGljaCB3YXMgZWFybGllciB0YWtlbiBvbgorICoJYnkgdGhlIGNhbGxpbmcga2VybmVsIHRocmVhZAorICoJKE5vdGU6IHRoaXMgcm91dGluZSBpcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgb25seQorICoJZnJvbSBhIGtlcm5lbCB0aHJlYWQgY29udGV4dCkKKyAqCisgKiBDb21tZW50czogQ2FsbGVkIHdpdGggY3R4LT5jdHhfbG9jayBoZWxkLiBUaGlzIG5lc3RzCisgKiB0YXNrX2xvY2sgaW5zdGVhZCBjdHhfbG9jay4KKyAqLwordm9pZCB1bnVzZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisKKwl0YXNrX2xvY2sodHNrKTsKKwl0c2stPmZsYWdzICY9IH5QRl9CT1JST1dFRF9NTTsKKwl0c2stPm1tID0gTlVMTDsKKwkvKiBhY3RpdmVfbW0gaXMgc3RpbGwgJ21tJyAqLworCWVudGVyX2xhenlfdGxiKG1tLCB0c2spOworCXRhc2tfdW5sb2NrKHRzayk7Cit9CisKKy8qCisgKiBRdWV1ZSB1cCBhIGtpb2NiIHRvIGJlIHJldHJpZWQuIEFzc3VtZXMgdGhhdCB0aGUga2lvY2IKKyAqIGhhcyBhbHJlYWR5IGJlZW4gbWFya2VkIGFzIGtpY2tlZCwgYW5kIHBsYWNlcyBpdCBvbgorICogdGhlIHJldHJ5IHJ1biBsaXN0IGZvciB0aGUgY29ycmVzcG9uZGluZyBpb2N0eCwgaWYgaXQKKyAqIGlzbid0IGFscmVhZHkgcXVldWVkLiBSZXR1cm5zIDEgaWYgaXQgYWN0dWFsbHkgcXVldWVkCisgKiB0aGUga2lvY2IgKHRvIHRlbGwgdGhlIGNhbGxlciB0byBhY3RpdmF0ZSB0aGUgd29yaworICogcXVldWUgdG8gcHJvY2VzcyBpdCksIG9yIDAsIGlmIGl0IGZvdW5kIHRoYXQgaXQgd2FzCisgKiBhbHJlYWR5IHF1ZXVlZC4KKyAqCisgKiBTaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIHNwaW4gbG9jayBpb2NiLT5raV9jdHgtPmN0eF9sb2NrCisgKiBoZWxkCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fcXVldWVfa2lja2VkX2lvY2Ioc3RydWN0IGtpb2NiICppb2NiKQoreworCXN0cnVjdCBraW9jdHggKmN0eCA9IGlvY2ItPmtpX2N0eDsKKworCWlmIChsaXN0X2VtcHR5KCZpb2NiLT5raV9ydW5fbGlzdCkpIHsKKwkJbGlzdF9hZGRfdGFpbCgmaW9jYi0+a2lfcnVuX2xpc3QsCisJCQkmY3R4LT5ydW5fbGlzdCk7CisJCWlvY2ItPmtpX3F1ZXVlZCsrOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGFpb19ydW5faW9jYgorICoJVGhpcyBpcyB0aGUgY29yZSBhaW8gZXhlY3V0aW9uIHJvdXRpbmUuIEl0IGlzCisgKglpbnZva2VkIGJvdGggZm9yIGluaXRpYWwgaS9vIHN1Ym1pc3Npb24gYW5kCisgKglzdWJzZXF1ZW50IHJldHJpZXMgdmlhIHRoZSBhaW9fa2lja19oYW5kbGVyLgorICoJRXhwZWN0cyB0byBiZSBpbnZva2VkIHdpdGggaW9jYi0+a2lfY3R4LT5sb2NrCisgKglhbHJlYWR5IGhlbGQuIFRoZSBsb2NrIGlzIHJlbGVhc2VkIGFuZCByZWFxdWlyZWQKKyAqCWFzIG5lZWRlZCBkdXJpbmcgcHJvY2Vzc2luZy4KKyAqCisgKiBDYWxscyB0aGUgaW9jYiByZXRyeSBtZXRob2QgKGFscmVhZHkgc2V0dXAgZm9yIHRoZQorICogaW9jYiBvbiBpbml0aWFsIHN1Ym1pc3Npb24pIGZvciBvcGVyYXRpb24gc3BlY2lmaWMKKyAqIGhhbmRsaW5nLCBidXQgdGFrZXMgY2FyZSBvZiBtb3N0IG9mIGNvbW1vbiByZXRyeQorICogZXhlY3V0aW9uIGRldGFpbHMgZm9yIGEgZ2l2ZW4gaW9jYi4gVGhlIHJldHJ5IG1ldGhvZAorICogbmVlZHMgdG8gYmUgbm9uLWJsb2NraW5nIGFzIGZhciBhcyBwb3NzaWJsZSwgdG8gYXZvaWQKKyAqIGhvbGRpbmcgdXAgb3RoZXIgaW9jYnMgd2FpdGluZyB0byBiZSBzZXJ2aWNlZCBieSB0aGUKKyAqIHJldHJ5IGtlcm5lbCB0aHJlYWQuCisgKgorICogVGhlIHRyaWNraWVyIHBhcnRzIGluIHRoaXMgY29kZSBoYXZlIHRvIGRvIHdpdGgKKyAqIGVuc3VyaW5nIHRoYXQgb25seSBvbmUgcmV0cnkgaW5zdGFuY2UgaXMgaW4gcHJvZ3Jlc3MKKyAqIGZvciBhIGdpdmVuIGlvY2IgYXQgYW55IHRpbWUuIFByb3ZpZGluZyB0aGF0IGd1YXJhbnRlZQorICogc2ltcGxpZmllcyB0aGUgY29kaW5nIG9mIGluZGl2aWR1YWwgYWlvIG9wZXJhdGlvbnMgYXMKKyAqIGl0IGF2b2lkcyB2YXJpb3VzIHBvdGVudGlhbCByYWNlcy4KKyAqLworc3RhdGljIHNzaXplX3QgYWlvX3J1bl9pb2NiKHN0cnVjdCBraW9jYiAqaW9jYikKK3sKKwlzdHJ1Y3Qga2lvY3R4CSpjdHggPSBpb2NiLT5raV9jdHg7CisJc3NpemVfdCAoKnJldHJ5KShzdHJ1Y3Qga2lvY2IgKik7CisJc3NpemVfdCByZXQ7CisKKwlpZiAoaW9jYi0+a2lfcmV0cmllZCsrID4gMTAyNCoxMDI0KSB7CisJCXByaW50aygiTWF4aW1hbCByZXRyeSBjb3VudC4gIEJ5dGVzIGRvbmUgJVpkXG4iLAorCQkJaW9jYi0+a2lfbmJ5dGVzIC0gaW9jYi0+a2lfbGVmdCk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWlmICghKGlvY2ItPmtpX3JldHJpZWQgJiAweGZmKSkgeworCQlwcl9kZWJ1ZygiJWxkIHJldHJ5OiAlZCBvZiAlZCAoa2ljayAlbGQsIFEgJWxkIHJ1biAlbGQsIHdha2UgJWxkKVxuIiwKKwkJCWlvY2ItPmtpX3JldHJpZWQsCisJCQlpb2NiLT5raV9uYnl0ZXMgLSBpb2NiLT5raV9sZWZ0LCBpb2NiLT5raV9uYnl0ZXMsCisJCQlpb2NiLT5raV9raWNrZWQsIGlvY2ItPmtpX3F1ZXVlZCwgYWlvX3J1biwgYWlvX3dha2V1cHMpOworCX0KKworCWlmICghKHJldHJ5ID0gaW9jYi0+a2lfcmV0cnkpKSB7CisJCXByaW50aygiYWlvX3J1bl9pb2NiOiBpb2NiLT5raV9yZXRyeSA9IE5VTExcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFdlIGRvbid0IHdhbnQgdGhlIG5leHQgcmV0cnkgaXRlcmF0aW9uIGZvciB0aGlzCisJICogb3BlcmF0aW9uIHRvIHN0YXJ0IHVudGlsIHRoaXMgb25lIGhhcyByZXR1cm5lZCBhbmQKKwkgKiB1cGRhdGVkIHRoZSBpb2NiIHN0YXRlLiBIb3dldmVyLCB3YWl0X3F1ZXVlIGZ1bmN0aW9ucworCSAqIGNhbiB0cmlnZ2VyIGEga2lja19pb2NiIGZyb20gaW50ZXJydXB0IGNvbnRleHQgaW4gdGhlCisJICogbWVhbnRpbWUsIGluZGljYXRpbmcgdGhhdCBkYXRhIGlzIGF2YWlsYWJsZSBmb3IgdGhlIG5leHQKKwkgKiBpdGVyYXRpb24uIFdlIHdhbnQgdG8gcmVtZW1iZXIgdGhhdCBhbmQgZW5hYmxlIHRoZQorCSAqIG5leHQgcmV0cnkgaXRlcmF0aW9uIF9hZnRlcl8gd2UgYXJlIHRocm91Z2ggd2l0aAorCSAqIHRoaXMgb25lLgorCSAqCisJICogU28sIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gcmVnaXN0ZXIgYSAia2ljayIsIGJ1dAorCSAqIHByZXZlbnQgaXQgZnJvbSBiZWluZyBxdWV1ZWQgbm93LCB3ZSBjbGVhciB0aGUga2ljaworCSAqIGZsYWcsIGJ1dCBtYWtlIHRoZSBraWNrIGNvZGUgKnRoaW5rKiB0aGF0IHRoZSBpb2NiIGlzCisJICogc3RpbGwgb24gdGhlIHJ1biBsaXN0IHVudGlsIHdlIGFyZSBhY3R1YWxseSBkb25lLgorCSAqIFdoZW4gd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGl0ZXJhdGlvbiwgd2UgY2hlY2sgaWYKKwkgKiB0aGUgaW9jYiB3YXMga2lja2VkIGluIHRoZSBtZWFudGltZSBhbmQgaWYgc28sIHF1ZXVlCisJICogaXQgdXAgYWZyZXNoLgorCSAqLworCisJa2lvY2JDbGVhcktpY2tlZChpb2NiKTsKKworCS8qCisJICogVGhpcyBpcyBzbyB0aGF0IGFpb19jb21wbGV0ZSBrbm93cyBpdCBkb2Vzbid0IG5lZWQgdG8KKwkgKiBwdWxsIHRoZSBpb2NiIG9mZiB0aGUgcnVuIGxpc3QgKFdlIGNhbid0IGp1c3QgY2FsbAorCSAqIElOSVRfTElTVF9IRUFEIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBhIGtpY2tfaW9jYiB0bworCSAqIHF1ZXVlIHRoaXMgb24gdGhlIHJ1biBsaXN0IHlldCkKKwkgKi8KKwlpb2NiLT5raV9ydW5fbGlzdC5uZXh0ID0gaW9jYi0+a2lfcnVuX2xpc3QucHJldiA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKKworCS8qIFF1aXQgcmV0cnlpbmcgaWYgdGhlIGkvbyBoYXMgYmVlbiBjYW5jZWxsZWQgKi8KKwlpZiAoa2lvY2JJc0NhbmNlbGxlZChpb2NiKSkgeworCQlyZXQgPSAtRUlOVFI7CisJCWFpb19jb21wbGV0ZShpb2NiLCByZXQsIDApOworCQkvKiBtdXN0IG5vdCBhY2Nlc3MgdGhlIGlvY2IgYWZ0ZXIgdGhpcyAqLworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIE5vdyB3ZSBhcmUgYWxsIHNldCB0byBjYWxsIHRoZSByZXRyeSBtZXRob2QgaW4gYXN5bmMKKwkgKiBjb250ZXh0LiBCeSBzZXR0aW5nIHRoaXMgdGhyZWFkJ3MgaW9fd2FpdCBjb250ZXh0CisJICogdG8gcG9pbnQgdG8gdGhlIHdhaXQgcXVldWUgZW50cnkgaW5zaWRlIHRoZSBjdXJyZW50bHkKKwkgKiBydW5uaW5nIGlvY2IgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgcmV0cnksIHdlIGVuc3VyZQorCSAqIHRoYXQgYXN5bmMgbm90aWZpY2F0aW9uIHdha2V1cHMgYXJlIHF1ZXVlZCBieSB0aGUKKwkgKiBvcGVyYXRpb24gaW5zdGVhZCBvZiBibG9ja2luZyB3YWl0cywgYW5kIHdoZW4gbm90aWZpZWQsCisJICogY2F1c2UgdGhlIGlvY2IgdG8gYmUga2lja2VkIGZvciBjb250aW51YXRpb24gKHRocm91Z2gKKwkgKiB0aGUgYWlvX3dha2VfZnVuY3Rpb24gY2FsbGJhY2spLgorCSAqLworCUJVR19PTihjdXJyZW50LT5pb193YWl0ICE9IE5VTEwpOworCWN1cnJlbnQtPmlvX3dhaXQgPSAmaW9jYi0+a2lfd2FpdDsKKwlyZXQgPSByZXRyeShpb2NiKTsKKwljdXJyZW50LT5pb193YWl0ID0gTlVMTDsKKworCWlmICgtRUlPQ0JSRVRSWSAhPSByZXQpIHsKKyAJCWlmICgtRUlPQ0JRVUVVRUQgIT0gcmV0KSB7CisJCQlCVUdfT04oIWxpc3RfZW1wdHkoJmlvY2ItPmtpX3dhaXQudGFza19saXN0KSk7CisJCQlhaW9fY29tcGxldGUoaW9jYiwgcmV0LCAwKTsKKwkJCS8qIG11c3Qgbm90IGFjY2VzcyB0aGUgaW9jYiBhZnRlciB0aGlzICovCisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBJc3N1ZSBhbiBhZGRpdGlvbmFsIHJldHJ5IHRvIGF2b2lkIHdhaXRpbmcgZm9yZXZlciBpZgorCQkgKiBubyB3YWl0cyB3ZXJlIHF1ZXVlZCAoZS5nLiBpbiBjYXNlIG9mIGEgc2hvcnQgcmVhZCkuCisJCSAqLworCQlpZiAobGlzdF9lbXB0eSgmaW9jYi0+a2lfd2FpdC50YXNrX2xpc3QpKQorCQkJa2lvY2JTZXRLaWNrZWQoaW9jYik7CisJfQorb3V0OgorCXNwaW5fbG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCisJaWYgKC1FSU9DQlJFVFJZID09IHJldCkgeworCQkvKgorCQkgKiBPSywgbm93IHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGl0ZXJhdGlvbgorCQkgKiBhbmQga25vdyB0aGF0IHRoZXJlIGlzIG1vcmUgbGVmdCB0byBnbywKKwkJICogdGhpcyBpcyB3aGVyZSB3ZSBsZXQgZ28gc28gdGhhdCBhIHN1YnNlcXVlbnQKKwkJICogImtpY2siIGNhbiBzdGFydCB0aGUgbmV4dCBpdGVyYXRpb24KKwkJICovCisKKwkJLyogd2lsbCBtYWtlIF9fcXVldWVfa2lja2VkX2lvY2Igc3VjY2VlZCBmcm9tIGhlcmUgb24gKi8KKwkJSU5JVF9MSVNUX0hFQUQoJmlvY2ItPmtpX3J1bl9saXN0KTsKKwkJLyogd2UgbXVzdCBxdWV1ZSB0aGUgbmV4dCBpdGVyYXRpb24gb3Vyc2VsdmVzLCBpZiBpdAorCQkgKiBoYXMgYWxyZWFkeSBiZWVuIGtpY2tlZCAqLworCQlpZiAoa2lvY2JJc0tpY2tlZChpb2NiKSkgeworCQkJX19xdWV1ZV9raWNrZWRfaW9jYihpb2NiKTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogX19haW9fcnVuX2lvY2JzOgorICogCVByb2Nlc3MgYWxsIHBlbmRpbmcgcmV0cmllcyBxdWV1ZWQgb24gdGhlIGlvY3R4CisgKiAJcnVuIGxpc3QuCisgKiBBc3N1bWVzIGl0IGlzIG9wZXJhdGluZyB3aXRoaW4gdGhlIGFpbyBpc3N1ZXIncyBtbQorICogY29udGV4dC4gRXhwZWN0cyB0byBiZSBjYWxsZWQgd2l0aCBjdHgtPmN0eF9sb2NrIGhlbGQKKyAqLworc3RhdGljIGludCBfX2Fpb19ydW5faW9jYnMoc3RydWN0IGtpb2N0eCAqY3R4KQoreworCXN0cnVjdCBraW9jYiAqaW9jYjsKKwlpbnQgY291bnQgPSAwOworCUxJU1RfSEVBRChydW5fbGlzdCk7CisKKwlsaXN0X3NwbGljZV9pbml0KCZjdHgtPnJ1bl9saXN0LCAmcnVuX2xpc3QpOworCXdoaWxlICghbGlzdF9lbXB0eSgmcnVuX2xpc3QpKSB7CisJCWlvY2IgPSBsaXN0X2VudHJ5KHJ1bl9saXN0Lm5leHQsIHN0cnVjdCBraW9jYiwKKwkJCWtpX3J1bl9saXN0KTsKKwkJbGlzdF9kZWwoJmlvY2ItPmtpX3J1bl9saXN0KTsKKwkJLyoKKwkJICogSG9sZCBhbiBleHRyYSByZWZlcmVuY2Ugd2hpbGUgcmV0cnlpbmcgaS9vLgorCQkgKi8KKwkJaW9jYi0+a2lfdXNlcnMrKzsgICAgICAgLyogZ3JhYiBleHRyYSByZWZlcmVuY2UgKi8KKwkJYWlvX3J1bl9pb2NiKGlvY2IpOworCQlpZiAoX19haW9fcHV0X3JlcShjdHgsIGlvY2IpKSAgLyogZHJvcCBleHRyYSByZWYgKi8KKwkJCXB1dF9pb2N0eChjdHgpOworCQljb3VudCsrOworIAl9CisJYWlvX3J1bisrOworCWlmICghbGlzdF9lbXB0eSgmY3R4LT5ydW5fbGlzdCkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhaW9fcXVldWVfd29yayhzdHJ1Y3Qga2lvY3R4ICogY3R4KQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwkvKgorCSAqIGlmIHNvbWVvbmUgaXMgd2FpdGluZywgZ2V0IHRoZSB3b3JrIHN0YXJ0ZWQgcmlnaHQKKwkgKiBhd2F5LCBvdGhlcndpc2UsIHVzZSBhIGxvbmdlciBkZWxheQorCSAqLworCXNtcF9tYigpOworCWlmICh3YWl0cXVldWVfYWN0aXZlKCZjdHgtPndhaXQpKQorCQl0aW1lb3V0ID0gMTsKKwllbHNlCisJCXRpbWVvdXQgPSBIWi8xMDsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoYWlvX3dxLCAmY3R4LT53cSwgdGltZW91dCk7Cit9CisKKworLyoKKyAqIGFpb19ydW5faW9jYnM6CisgKiAJUHJvY2VzcyBhbGwgcGVuZGluZyByZXRyaWVzIHF1ZXVlZCBvbiB0aGUgaW9jdHgKKyAqIAlydW4gbGlzdC4KKyAqIEFzc3VtZXMgaXQgaXMgb3BlcmF0aW5nIHdpdGhpbiB0aGUgYWlvIGlzc3VlcidzIG1tCisgKiBjb250ZXh0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYWlvX3J1bl9pb2NicyhzdHJ1Y3Qga2lvY3R4ICpjdHgpCit7CisJaW50IHJlcXVldWU7CisKKwlzcGluX2xvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKKworCXJlcXVldWUgPSBfX2Fpb19ydW5faW9jYnMoY3R4KTsKKwlzcGluX3VubG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCWlmIChyZXF1ZXVlKQorCQlhaW9fcXVldWVfd29yayhjdHgpOworfQorCisvKgorICoganVzdCBsaWtlIGFpb19ydW5faW9jYnMsIGJ1dCBrZWVwcyBydW5uaW5nIHRoZW0gdW50aWwKKyAqIHRoZSBsaXN0IHN0YXlzIGVtcHR5CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhaW9fcnVuX2FsbF9pb2NicyhzdHJ1Y3Qga2lvY3R4ICpjdHgpCit7CisJc3Bpbl9sb2NrX2lycSgmY3R4LT5jdHhfbG9jayk7CisJd2hpbGUgKF9fYWlvX3J1bl9pb2NicyhjdHgpKQorCQk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKK30KKworLyoKKyAqIGFpb19raWNrX2hhbmRsZXI6CisgKiAJV29yayBxdWV1ZSBoYW5kbGVyIHRyaWdnZXJlZCB0byBwcm9jZXNzIHBlbmRpbmcKKyAqIAlyZXRyaWVzIG9uIGFuIGlvY3R4LiBUYWtlcyBvbiB0aGUgYWlvIGlzc3VlcidzCisgKgltbSBjb250ZXh0IGJlZm9yZSBydW5uaW5nIHRoZSBpb2Nicywgc28gdGhhdAorICoJY29weV94eHhfdXNlciBvcGVyYXRlcyBvbiB0aGUgaXNzdWVyJ3MgYWRkcmVzcworICogICAgICBzcGFjZS4KKyAqIFJ1biBvbiBhaW9kJ3MgY29udGV4dC4KKyAqLworc3RhdGljIHZvaWQgYWlvX2tpY2tfaGFuZGxlcih2b2lkICpkYXRhKQoreworCXN0cnVjdCBraW9jdHggKmN0eCA9IGRhdGE7CisJbW1fc2VnbWVudF90IG9sZGZzID0gZ2V0X2ZzKCk7CisJaW50IHJlcXVldWU7CisKKwlzZXRfZnMoVVNFUl9EUyk7CisJdXNlX21tKGN0eC0+bW0pOworCXNwaW5fbG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCXJlcXVldWUgPV9fYWlvX3J1bl9pb2NicyhjdHgpOworIAl1bnVzZV9tbShjdHgtPm1tKTsKKwlzcGluX3VubG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCXNldF9mcyhvbGRmcyk7CisJLyoKKwkgKiB3ZSdyZSBpbiBhIHdvcmtlciB0aHJlYWQgYWxyZWFkeSwgZG9uJ3QgdXNlIHF1ZXVlX2RlbGF5ZWRfd29yaywKKwkgKi8KKwlpZiAocmVxdWV1ZSkKKwkJcXVldWVfd29yayhhaW9fd3EsICZjdHgtPndxKTsKK30KKworCisvKgorICogQ2FsbGVkIGJ5IGtpY2tfaW9jYiB0byBxdWV1ZSB0aGUga2lvY2IgZm9yIHJldHJ5CisgKiBhbmQgaWYgcmVxdWlyZWQgYWN0aXZhdGUgdGhlIGFpbyB3b3JrIHF1ZXVlIHRvIHByb2Nlc3MKKyAqIGl0CisgKi8KK3ZvaWQgcXVldWVfa2lja2VkX2lvY2Ioc3RydWN0IGtpb2NiICppb2NiKQoreworIAlzdHJ1Y3Qga2lvY3R4CSpjdHggPSBpb2NiLT5raV9jdHg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcnVuID0gMDsKKworCVdBUk5fT04oKCFsaXN0X2VtcHR5KCZpb2NiLT5raV93YWl0LnRhc2tfbGlzdCkpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjdHgtPmN0eF9sb2NrLCBmbGFncyk7CisJcnVuID0gX19xdWV1ZV9raWNrZWRfaW9jYihpb2NiKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHgtPmN0eF9sb2NrLCBmbGFncyk7CisJaWYgKHJ1bikgeworCQlhaW9fcXVldWVfd29yayhjdHgpOworCQlhaW9fd2FrZXVwcysrOworCX0KK30KKworLyoKKyAqIGtpY2tfaW9jYjoKKyAqICAgICAgQ2FsbGVkIHR5cGljYWxseSBmcm9tIGEgd2FpdCBxdWV1ZSBjYWxsYmFjayBjb250ZXh0CisgKiAgICAgIChhaW9fd2FrZV9mdW5jdGlvbikgdG8gdHJpZ2dlciBhIHJldHJ5IG9mIHRoZSBpb2NiLgorICogICAgICBUaGUgcmV0cnkgaXMgdXN1YWxseSBleGVjdXRlZCBieSBhaW8gd29ya3F1ZXVlCisgKiAgICAgIHRocmVhZHMgKFNlZSBhaW9fa2lja19oYW5kbGVyKS4KKyAqLwordm9pZCBmYXN0Y2FsbCBraWNrX2lvY2Ioc3RydWN0IGtpb2NiICppb2NiKQoreworCS8qIHN5bmMgaW9jYnMgYXJlIGVhc3k6IHRoZXkgY2FuIG9ubHkgZXZlciBiZSBleGVjdXRpbmcgZnJvbSBhIAorCSAqIHNpbmdsZSBjb250ZXh0LiAqLworCWlmIChpc19zeW5jX2tpb2NiKGlvY2IpKSB7CisJCWtpb2NiU2V0S2lja2VkKGlvY2IpOworCSAgICAgICAgd2FrZV91cF9wcm9jZXNzKGlvY2ItPmtpX29iai50c2spOworCQlyZXR1cm47CisJfQorCisJaW9jYi0+a2lfa2lja2VkKys7CisJLyogSWYgaXRzIGFscmVhZHkga2lja2VkIHdlIHNob3VsZG4ndCBxdWV1ZSBpdCBhZ2FpbiAqLworCWlmICgha2lvY2JUcnlLaWNrKGlvY2IpKSB7CisJCXF1ZXVlX2tpY2tlZF9pb2NiKGlvY2IpOworCX0KK30KK0VYUE9SVF9TWU1CT0woa2lja19pb2NiKTsKKworLyogYWlvX2NvbXBsZXRlCisgKglDYWxsZWQgd2hlbiB0aGUgaW8gcmVxdWVzdCBvbiB0aGUgZ2l2ZW4gaW9jYiBpcyBjb21wbGV0ZS4KKyAqCVJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBsYXN0IHVzZXIgb2YgdGhlIHJlcXVlc3QuICBUaGUgCisgKglvbmx5IG90aGVyIHVzZXIgb2YgdGhlIHJlcXVlc3QgY2FuIGJlIHRoZSBjYW5jZWxsYXRpb24gY29kZS4KKyAqLworaW50IGZhc3RjYWxsIGFpb19jb21wbGV0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGxvbmcgcmVzLCBsb25nIHJlczIpCit7CisJc3RydWN0IGtpb2N0eAkqY3R4ID0gaW9jYi0+a2lfY3R4OworCXN0cnVjdCBhaW9fcmluZ19pbmZvCSppbmZvOworCXN0cnVjdCBhaW9fcmluZwkqcmluZzsKKwlzdHJ1Y3QgaW9fZXZlbnQJKmV2ZW50OworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdW5zaWduZWQgbG9uZwl0YWlsOworCWludAkJcmV0OworCisJLyogU3BlY2lhbCBjYXNlIGhhbmRsaW5nIGZvciBzeW5jIGlvY2JzOiBldmVudHMgZ28gZGlyZWN0bHkKKwkgKiBpbnRvIHRoZSBpb2NiIGZvciBmYXN0IGhhbmRsaW5nLiAgTm90ZSB0aGF0IHRoaXMgd2lsbCBub3QgCisJICogd29yayBpZiB3ZSBhbGxvdyBzeW5jIGtpb2NicyB0byBiZSBjYW5jZWxsZWQuIGluIHdoaWNoCisJICogY2FzZSB0aGUgdXNhZ2UgY291bnQgY2hlY2tzIHdpbGwgaGF2ZSB0byBtb3ZlIHVuZGVyIGN0eF9sb2NrCisJICogZm9yIGFsbCBjYXNlcy4KKwkgKi8KKwlpZiAoaXNfc3luY19raW9jYihpb2NiKSkgeworCQlpbnQgcmV0OworCisJCWlvY2ItPmtpX3VzZXJfZGF0YSA9IHJlczsKKwkJaWYgKGlvY2ItPmtpX3VzZXJzID09IDEpIHsKKwkJCWlvY2ItPmtpX3VzZXJzID0gMDsKKwkJCXJldCA9IDE7CisJCX0gZWxzZSB7CisJCQlzcGluX2xvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKKwkJCWlvY2ItPmtpX3VzZXJzLS07CisJCQlyZXQgPSAoMCA9PSBpb2NiLT5raV91c2Vycyk7CisJCQlzcGluX3VubG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCQl9CisJCS8qIHN5bmMgaW9jYnMgcHV0IHRoZSB0YXNrIGhlcmUgZm9yIHVzICovCisJCXdha2VfdXBfcHJvY2Vzcyhpb2NiLT5raV9vYmoudHNrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbmZvID0gJmN0eC0+cmluZ19pbmZvOworCisJLyogYWRkIGEgY29tcGxldGlvbiBldmVudCB0byB0aGUgcmluZyBidWZmZXIuCisJICogbXVzdCBiZSBkb25lIGhvbGRpbmcgY3R4LT5jdHhfbG9jayB0byBwcmV2ZW50CisJICogb3RoZXIgY29kZSBmcm9tIG1lc3Npbmcgd2l0aCB0aGUgdGFpbAorCSAqIHBvaW50ZXIgc2luY2Ugd2UgbWlnaHQgYmUgY2FsbGVkIGZyb20gaXJxCisJICogY29udGV4dC4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3R4LT5jdHhfbG9jaywgZmxhZ3MpOworCisJaWYgKGlvY2ItPmtpX3J1bl9saXN0LnByZXYgJiYgIWxpc3RfZW1wdHkoJmlvY2ItPmtpX3J1bl9saXN0KSkKKwkJbGlzdF9kZWxfaW5pdCgmaW9jYi0+a2lfcnVuX2xpc3QpOworCisJLyoKKwkgKiBjYW5jZWxsZWQgcmVxdWVzdHMgZG9uJ3QgZ2V0IGV2ZW50cywgdXNlcmxhbmQgd2FzIGdpdmVuIG9uZQorCSAqIHdoZW4gdGhlIGV2ZW50IGdvdCBjYW5jZWxsZWQuCisJICovCisJaWYgKGtpb2NiSXNDYW5jZWxsZWQoaW9jYikpCisJCWdvdG8gcHV0X3JxOworCisJcmluZyA9IGttYXBfYXRvbWljKGluZm8tPnJpbmdfcGFnZXNbMF0sIEtNX0lSUTEpOworCisJdGFpbCA9IGluZm8tPnRhaWw7CisJZXZlbnQgPSBhaW9fcmluZ19ldmVudChpbmZvLCB0YWlsLCBLTV9JUlEwKTsKKwl0YWlsID0gKHRhaWwgKyAxKSAlIGluZm8tPm5yOworCisJZXZlbnQtPm9iaiA9ICh1NjQpKHVuc2lnbmVkIGxvbmcpaW9jYi0+a2lfb2JqLnVzZXI7CisJZXZlbnQtPmRhdGEgPSBpb2NiLT5raV91c2VyX2RhdGE7CisJZXZlbnQtPnJlcyA9IHJlczsKKwlldmVudC0+cmVzMiA9IHJlczI7CisKKwlkcHJpbnRrKCJhaW9fY29tcGxldGU6ICVwWyVsdV06ICVwOiAlcCAlTHggJWx4ICVseFxuIiwKKwkJY3R4LCB0YWlsLCBpb2NiLCBpb2NiLT5raV9vYmoudXNlciwgaW9jYi0+a2lfdXNlcl9kYXRhLAorCQlyZXMsIHJlczIpOworCisJLyogYWZ0ZXIgZmxhZ2dpbmcgdGhlIHJlcXVlc3QgYXMgZG9uZSwgd2UKKwkgKiBtdXN0IG5ldmVyIGV2ZW4gbG9vayBhdCBpdCBhZ2FpbgorCSAqLworCXNtcF93bWIoKTsJLyogbWFrZSBldmVudCB2aXNpYmxlIGJlZm9yZSB1cGRhdGluZyB0YWlsICovCisKKwlpbmZvLT50YWlsID0gdGFpbDsKKwlyaW5nLT50YWlsID0gdGFpbDsKKworCXB1dF9haW9fcmluZ19ldmVudChldmVudCwgS01fSVJRMCk7CisJa3VubWFwX2F0b21pYyhyaW5nLCBLTV9JUlExKTsKKworCXByX2RlYnVnKCJhZGRlZCB0byByaW5nICVwIGF0IFslbHVdXG4iLCBpb2NiLCB0YWlsKTsKKworCXByX2RlYnVnKCIlbGQgcmV0cmllczogJWQgb2YgJWQgKGtpY2tlZCAlbGQsIFEgJWxkIHJ1biAlbGQgd2FrZSAlbGQpXG4iLAorCQlpb2NiLT5raV9yZXRyaWVkLAorCQlpb2NiLT5raV9uYnl0ZXMgLSBpb2NiLT5raV9sZWZ0LCBpb2NiLT5raV9uYnl0ZXMsCisJCWlvY2ItPmtpX2tpY2tlZCwgaW9jYi0+a2lfcXVldWVkLCBhaW9fcnVuLCBhaW9fd2FrZXVwcyk7CitwdXRfcnE6CisJLyogZXZlcnl0aGluZyB0dXJuZWQgb3V0IHdlbGwsIGRpc3Bvc2Ugb2YgdGhlIGFpb2NiLiAqLworCXJldCA9IF9fYWlvX3B1dF9yZXEoY3R4LCBpb2NiKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+Y3R4X2xvY2ssIGZsYWdzKTsKKworCWlmICh3YWl0cXVldWVfYWN0aXZlKCZjdHgtPndhaXQpKQorCQl3YWtlX3VwKCZjdHgtPndhaXQpOworCisJaWYgKHJldCkKKwkJcHV0X2lvY3R4KGN0eCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBhaW9fcmVhZF9ldnQKKyAqCVB1bGwgYW4gZXZlbnQgb2ZmIG9mIHRoZSBpb2N0eCdzIGV2ZW50IHJpbmcuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgCisgKglldmVudHMgZmV0Y2hlZCAoMCBvciAxIDstKQorICoJRklYTUU6IG1ha2UgdGhpcyB1c2UgY21weGNoZy4KKyAqCVRPRE86IG1ha2UgdGhlIHJpbmdidWZmZXIgdXNlciBtbWFwKClhYmxlIChyZXF1aXJlcyBGSVhNRSkuCisgKi8KK3N0YXRpYyBpbnQgYWlvX3JlYWRfZXZ0KHN0cnVjdCBraW9jdHggKmlvY3R4LCBzdHJ1Y3QgaW9fZXZlbnQgKmVudCkKK3sKKwlzdHJ1Y3QgYWlvX3JpbmdfaW5mbyAqaW5mbyA9ICZpb2N0eC0+cmluZ19pbmZvOworCXN0cnVjdCBhaW9fcmluZyAqcmluZzsKKwl1bnNpZ25lZCBsb25nIGhlYWQ7CisJaW50IHJldCA9IDA7CisKKwlyaW5nID0ga21hcF9hdG9taWMoaW5mby0+cmluZ19wYWdlc1swXSwgS01fVVNFUjApOworCWRwcmludGsoImluIGFpb19yZWFkX2V2dCBoJWx1IHQlbHUgbSVsdVxuIiwKKwkJICh1bnNpZ25lZCBsb25nKXJpbmctPmhlYWQsICh1bnNpZ25lZCBsb25nKXJpbmctPnRhaWwsCisJCSAodW5zaWduZWQgbG9uZylyaW5nLT5ucik7CisKKwlpZiAocmluZy0+aGVhZCA9PSByaW5nLT50YWlsKQorCQlnb3RvIG91dDsKKworCXNwaW5fbG9jaygmaW5mby0+cmluZ19sb2NrKTsKKworCWhlYWQgPSByaW5nLT5oZWFkICUgaW5mby0+bnI7CisJaWYgKGhlYWQgIT0gcmluZy0+dGFpbCkgeworCQlzdHJ1Y3QgaW9fZXZlbnQgKmV2cCA9IGFpb19yaW5nX2V2ZW50KGluZm8sIGhlYWQsIEtNX1VTRVIxKTsKKwkJKmVudCA9ICpldnA7CisJCWhlYWQgPSAoaGVhZCArIDEpICUgaW5mby0+bnI7CisJCXNtcF9tYigpOyAvKiBmaW5pc2ggcmVhZGluZyB0aGUgZXZlbnQgYmVmb3JlIHVwZGF0bmcgdGhlIGhlYWQgKi8KKwkJcmluZy0+aGVhZCA9IGhlYWQ7CisJCXJldCA9IDE7CisJCXB1dF9haW9fcmluZ19ldmVudChldnAsIEtNX1VTRVIxKTsKKwl9CisJc3Bpbl91bmxvY2soJmluZm8tPnJpbmdfbG9jayk7CisKK291dDoKKwlrdW5tYXBfYXRvbWljKHJpbmcsIEtNX1VTRVIwKTsKKwlkcHJpbnRrKCJsZWF2aW5nIGFpb19yZWFkX2V2dDogJWQgIGglbHUgdCVsdVxuIiwgcmV0LAorCQkgKHVuc2lnbmVkIGxvbmcpcmluZy0+aGVhZCwgKHVuc2lnbmVkIGxvbmcpcmluZy0+dGFpbCk7CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IGFpb190aW1lb3V0IHsKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKKwlpbnQJCQl0aW1lZF9vdXQ7CisJc3RydWN0IHRhc2tfc3RydWN0CSpwOworfTsKKworc3RhdGljIHZvaWQgdGltZW91dF9mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgYWlvX3RpbWVvdXQgKnRvID0gKHN0cnVjdCBhaW9fdGltZW91dCAqKWRhdGE7CisKKwl0by0+dGltZWRfb3V0ID0gMTsKKwl3YWtlX3VwX3Byb2Nlc3ModG8tPnApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF90aW1lb3V0KHN0cnVjdCBhaW9fdGltZW91dCAqdG8pCit7CisJaW5pdF90aW1lcigmdG8tPnRpbWVyKTsKKwl0by0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXRvOworCXRvLT50aW1lci5mdW5jdGlvbiA9IHRpbWVvdXRfZnVuYzsKKwl0by0+dGltZWRfb3V0ID0gMDsKKwl0by0+cCA9IGN1cnJlbnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfdGltZW91dChsb25nIHN0YXJ0X2ppZmZpZXMsIHN0cnVjdCBhaW9fdGltZW91dCAqdG8sCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwl0by0+dGltZXIuZXhwaXJlcyA9IHN0YXJ0X2ppZmZpZXMgKyB0aW1lc3BlY190b19qaWZmaWVzKHRzKTsKKwlpZiAodGltZV9hZnRlcih0by0+dGltZXIuZXhwaXJlcywgamlmZmllcykpCisJCWFkZF90aW1lcigmdG8tPnRpbWVyKTsKKwllbHNlCisJCXRvLT50aW1lZF9vdXQgPSAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfdGltZW91dChzdHJ1Y3QgYWlvX3RpbWVvdXQgKnRvKQoreworCWRlbF9zaW5nbGVzaG90X3RpbWVyX3N5bmMoJnRvLT50aW1lcik7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9ldmVudHMoc3RydWN0IGtpb2N0eCAqY3R4LAorCQkJbG9uZyBtaW5fbnIsIGxvbmcgbnIsCisJCQlzdHJ1Y3QgaW9fZXZlbnQgX191c2VyICpldmVudCwKKwkJCXN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnRpbWVvdXQpCit7CisJbG9uZwkJCXN0YXJ0X2ppZmZpZXMgPSBqaWZmaWVzOworCXN0cnVjdCB0YXNrX3N0cnVjdAkqdHNrID0gY3VycmVudDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCB0c2spOworCWludAkJCXJldDsKKwlpbnQJCQlpID0gMDsKKwlzdHJ1Y3QgaW9fZXZlbnQJCWVudDsKKwlzdHJ1Y3QgYWlvX3RpbWVvdXQJdG87CisJaW50IAkJCWV2ZW50X2xvb3AgPSAwOyAvKiB0ZXN0aW5nIG9ubHkgKi8KKwlpbnQJCQlyZXRyeSA9IDA7CisKKwkvKiBuZWVkZWQgdG8gemVybyBhbnkgcGFkZGluZyB3aXRoaW4gYW4gZW50cnkgKHRoZXJlIHNob3VsZG4ndCBiZSAKKwkgKiBhbnksIGJ1dCBDIGlzIGZ1biEKKwkgKi8KKwltZW1zZXQoJmVudCwgMCwgc2l6ZW9mKGVudCkpOworcmV0cnk6CisJcmV0ID0gMDsKKwl3aGlsZSAobGlrZWx5KGkgPCBucikpIHsKKwkJcmV0ID0gYWlvX3JlYWRfZXZ0KGN0eCwgJmVudCk7CisJCWlmICh1bmxpa2VseShyZXQgPD0gMCkpCisJCQlicmVhazsKKworCQlkcHJpbnRrKCJyZWFkIGV2ZW50OiAlTHggJUx4ICVMeCAlTHhcbiIsCisJCQllbnQuZGF0YSwgZW50Lm9iaiwgZW50LnJlcywgZW50LnJlczIpOworCisJCS8qIENvdWxkIHdlIHNwbGl0IHRoZSBjaGVjayBpbiB0d28/ICovCisJCXJldCA9IC1FRkFVTFQ7CisJCWlmICh1bmxpa2VseShjb3B5X3RvX3VzZXIoZXZlbnQsICZlbnQsIHNpemVvZihlbnQpKSkpIHsKKwkJCWRwcmludGsoImFpbzogbG9zdCBhbiBldmVudCBkdWUgdG8gRUZBVUxULlxuIik7CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSAwOworCisJCS8qIEdvb2QsIGV2ZW50IGNvcGllZCB0byB1c2VybGFuZCwgdXBkYXRlIGNvdW50cy4gKi8KKwkJZXZlbnQgKys7CisJCWkgKys7CisJfQorCisJaWYgKG1pbl9uciA8PSBpKQorCQlyZXR1cm4gaTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogRW5kIGZhc3QgcGF0aCAqLworCisJLyogcmFjZXkgY2hlY2ssIGJ1dCBpdCBnZXRzIHJlZG9uZSAqLworCWlmICghcmV0cnkgJiYgdW5saWtlbHkoIWxpc3RfZW1wdHkoJmN0eC0+cnVuX2xpc3QpKSkgeworCQlyZXRyeSA9IDE7CisJCWFpb19ydW5fYWxsX2lvY2JzKGN0eCk7CisJCWdvdG8gcmV0cnk7CisJfQorCisJaW5pdF90aW1lb3V0KCZ0byk7CisJaWYgKHRpbWVvdXQpIHsKKwkJc3RydWN0IHRpbWVzcGVjCXRzOworCQlyZXQgPSAtRUZBVUxUOworCQlpZiAodW5saWtlbHkoY29weV9mcm9tX3VzZXIoJnRzLCB0aW1lb3V0LCBzaXplb2YodHMpKSkpCisJCQlnb3RvIG91dDsKKworCQlzZXRfdGltZW91dChzdGFydF9qaWZmaWVzLCAmdG8sICZ0cyk7CisJfQorCisJd2hpbGUgKGxpa2VseShpIDwgbnIpKSB7CisJCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZSgmY3R4LT53YWl0LCAmd2FpdCk7CisJCWRvIHsKKwkJCXNldF90YXNrX3N0YXRlKHRzaywgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXJldCA9IGFpb19yZWFkX2V2dChjdHgsICZlbnQpOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCWlmIChtaW5fbnIgPD0gaSkKKwkJCQlicmVhazsKKwkJCXJldCA9IDA7CisJCQlpZiAodG8udGltZWRfb3V0KQkvKiBPbmx5IGNoZWNrIGFmdGVyIHJlYWQgZXZ0ICovCisJCQkJYnJlYWs7CisJCQlzY2hlZHVsZSgpOworCQkJZXZlbnRfbG9vcCsrOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKHRzaykpIHsKKwkJCQlyZXQgPSAtRUlOVFI7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKnJldCA9IGFpb19yZWFkX2V2dChjdHgsICZlbnQpOyovCisJCX0gd2hpbGUgKDEpIDsKKworCQlzZXRfdGFza19zdGF0ZSh0c2ssIFRBU0tfUlVOTklORyk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZjdHgtPndhaXQsICZ3YWl0KTsKKworCQlpZiAodW5saWtlbHkocmV0IDw9IDApKQorCQkJYnJlYWs7CisKKwkJcmV0ID0gLUVGQVVMVDsKKwkJaWYgKHVubGlrZWx5KGNvcHlfdG9fdXNlcihldmVudCwgJmVudCwgc2l6ZW9mKGVudCkpKSkgeworCQkJZHByaW50aygiYWlvOiBsb3N0IGFuIGV2ZW50IGR1ZSB0byBFRkFVTFQuXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogR29vZCwgZXZlbnQgY29waWVkIHRvIHVzZXJsYW5kLCB1cGRhdGUgY291bnRzLiAqLworCQlldmVudCArKzsKKwkJaSArKzsKKwl9CisKKwlpZiAodGltZW91dCkKKwkJY2xlYXJfdGltZW91dCgmdG8pOworb3V0OgorCXByX2RlYnVnKCJldmVudCBsb29wIGV4ZWN1dGVkICVkIHRpbWVzXG4iLCBldmVudF9sb29wKTsKKwlwcl9kZWJ1ZygiYWlvX3J1biAlbGRcbiIsIGFpb19ydW4pOworCXByX2RlYnVnKCJhaW9fd2FrZXVwcyAlbGRcbiIsIGFpb193YWtldXBzKTsKKwlyZXR1cm4gaSA/IGkgOiByZXQ7Cit9CisKKy8qIFRha2UgYW4gaW9jdHggYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IG9mIGlvY3R4J3MuICBQcm90ZWN0cyAKKyAqIGFnYWluc3QgcmFjZXMgd2l0aCBpdHNlbGYgdmlhIC0+ZGVhZC4KKyAqLworc3RhdGljIHZvaWQgaW9fZGVzdHJveShzdHJ1Y3Qga2lvY3R4ICppb2N0eCkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXN0cnVjdCBraW9jdHggKip0bXA7CisJaW50IHdhc19kZWFkOworCisJLyogZGVsZXRlIHRoZSBlbnRyeSBmcm9tIHRoZSBsaXN0IGlzIHNvbWVvbmUgZWxzZSBoYXNuJ3QgYWxyZWFkeSAqLworCXdyaXRlX2xvY2soJm1tLT5pb2N0eF9saXN0X2xvY2spOworCXdhc19kZWFkID0gaW9jdHgtPmRlYWQ7CisJaW9jdHgtPmRlYWQgPSAxOworCWZvciAodG1wID0gJm1tLT5pb2N0eF9saXN0OyAqdG1wICYmICp0bXAgIT0gaW9jdHg7CisJICAgICB0bXAgPSAmKCp0bXApLT5uZXh0KQorCQk7CisJaWYgKCp0bXApCisJCSp0bXAgPSBpb2N0eC0+bmV4dDsKKwl3cml0ZV91bmxvY2soJm1tLT5pb2N0eF9saXN0X2xvY2spOworCisJZHByaW50aygiYWlvX3JlbGVhc2UoJXApXG4iLCBpb2N0eCk7CisJaWYgKGxpa2VseSghd2FzX2RlYWQpKQorCQlwdXRfaW9jdHgoaW9jdHgpOwkvKiB0d2ljZSBmb3IgdGhlIGxpc3QgKi8KKworCWFpb19jYW5jZWxfYWxsKGlvY3R4KTsKKwl3YWl0X2Zvcl9hbGxfYWlvcyhpb2N0eCk7CisJcHV0X2lvY3R4KGlvY3R4KTsJLyogb25jZSBmb3IgdGhlIGxvb2t1cCAqLworfQorCisvKiBzeXNfaW9fc2V0dXA6CisgKglDcmVhdGUgYW4gYWlvX2NvbnRleHQgY2FwYWJsZSBvZiByZWNlaXZpbmcgYXQgbGVhc3QgbnJfZXZlbnRzLgorICoJY3R4cCBtdXN0IG5vdCBwb2ludCB0byBhbiBhaW9fY29udGV4dCB0aGF0IGFscmVhZHkgZXhpc3RzLCBhbmQKKyAqCW11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gMCBwcmlvciB0byB0aGUgY2FsbC4gIE9uIHN1Y2Nlc3NmdWwKKyAqCWNyZWF0aW9uIG9mIHRoZSBhaW9fY29udGV4dCwgKmN0eHAgaXMgZmlsbGVkIGluIHdpdGggdGhlIHJlc3VsdGluZyAKKyAqCWhhbmRsZS4gIE1heSBmYWlsIHdpdGggLUVJTlZBTCBpZiAqY3R4cCBpcyBub3QgaW5pdGlhbGl6ZWQsCisgKglpZiB0aGUgc3BlY2lmaWVkIG5yX2V2ZW50cyBleGNlZWRzIGludGVybmFsIGxpbWl0cy4gIE1heSBmYWlsIAorICoJd2l0aCAtRUFHQUlOIGlmIHRoZSBzcGVjaWZpZWQgbnJfZXZlbnRzIGV4Y2VlZHMgdGhlIHVzZXIncyBsaW1pdCAKKyAqCW9mIGF2YWlsYWJsZSBldmVudHMuICBNYXkgZmFpbCB3aXRoIC1FTk9NRU0gaWYgaW5zdWZmaWNpZW50IGtlcm5lbAorICoJcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUuICBNYXkgZmFpbCB3aXRoIC1FRkFVTFQgaWYgYW4gaW52YWxpZAorICoJcG9pbnRlciBpcyBwYXNzZWQgZm9yIGN0eHAuICBXaWxsIGZhaWwgd2l0aCAtRU5PU1lTIGlmIG5vdAorICoJaW1wbGVtZW50ZWQuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfaW9fc2V0dXAodW5zaWduZWQgbnJfZXZlbnRzLCBhaW9fY29udGV4dF90IF9fdXNlciAqY3R4cCkKK3sKKwlzdHJ1Y3Qga2lvY3R4ICppb2N0eCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBjdHg7CisJbG9uZyByZXQ7CisKKwlyZXQgPSBnZXRfdXNlcihjdHgsIGN0eHApOworCWlmICh1bmxpa2VseShyZXQpKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FSU5WQUw7CisJaWYgKHVubGlrZWx5KGN0eCB8fCAoaW50KW5yX2V2ZW50cyA8PSAwKSkgeworCQlwcl9kZWJ1ZygiRUlOVkFMOiBpb19zZXR1cDogY3R4IG9yIG5yX2V2ZW50cyA+IG1heFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlvY3R4ID0gaW9jdHhfYWxsb2MobnJfZXZlbnRzKTsKKwlyZXQgPSBQVFJfRVJSKGlvY3R4KTsKKwlpZiAoIUlTX0VSUihpb2N0eCkpIHsKKwkJcmV0ID0gcHV0X3VzZXIoaW9jdHgtPnVzZXJfaWQsIGN0eHApOworCQlpZiAoIXJldCkKKwkJCXJldHVybiAwOworCisJCWdldF9pb2N0eChpb2N0eCk7IC8qIGlvX2Rlc3Ryb3koKSBleHBlY3RzIHVzIHRvIGhvbGQgYSByZWYgKi8KKwkJaW9fZGVzdHJveShpb2N0eCk7CisJfQorCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogc3lzX2lvX2Rlc3Ryb3k6CisgKglEZXN0cm95IHRoZSBhaW9fY29udGV4dCBzcGVjaWZpZWQuICBNYXkgY2FuY2VsIGFueSBvdXRzdGFuZGluZyAKKyAqCUFJT3MgYW5kIGJsb2NrIG9uIGNvbXBsZXRpb24uICBXaWxsIGZhaWwgd2l0aCAtRU5PU1lTIGlmIG5vdAorICoJaW1wbGVtZW50ZWQuICBNYXkgZmFpbCB3aXRoIC1FRkFVTFQgaWYgdGhlIGNvbnRleHQgcG9pbnRlZCB0bworICoJaXMgaW52YWxpZC4KKyAqLworYXNtbGlua2FnZSBsb25nIHN5c19pb19kZXN0cm95KGFpb19jb250ZXh0X3QgY3R4KQoreworCXN0cnVjdCBraW9jdHggKmlvY3R4ID0gbG9va3VwX2lvY3R4KGN0eCk7CisJaWYgKGxpa2VseShOVUxMICE9IGlvY3R4KSkgeworCQlpb19kZXN0cm95KGlvY3R4KTsKKwkJcmV0dXJuIDA7CisJfQorCXByX2RlYnVnKCJFSU5WQUw6IGlvX2Rlc3Ryb3k6IGludmFsaWQgY29udGV4dCBpZFxuIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBEZWZhdWx0IHJldHJ5IG1ldGhvZCBmb3IgYWlvX3JlYWQgKGFsc28gdXNlZCBmb3IgZmlyc3QgdGltZSBzdWJtaXQpCisgKiBSZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgaW9jYiBzdGF0ZSBhcyByZXRyaWVzIHByb2dyZXNzCisgKi8KK3N0YXRpYyBzc2l6ZV90IGFpb19wcmVhZChzdHJ1Y3Qga2lvY2IgKmlvY2IpCit7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXNzaXplX3QgcmV0ID0gMDsKKworCXJldCA9IGZpbGUtPmZfb3AtPmFpb19yZWFkKGlvY2IsIGlvY2ItPmtpX2J1ZiwKKwkJaW9jYi0+a2lfbGVmdCwgaW9jYi0+a2lfcG9zKTsKKworCS8qCisJICogQ2FuJ3QganVzdCBkZXBlbmQgb24gaW9jYi0+a2lfbGVmdCB0byBkZXRlcm1pbmUKKwkgKiB3aGV0aGVyIHdlIGFyZSBkb25lLiBUaGlzIG1heSBoYXZlIGJlZW4gYSBzaG9ydCByZWFkLgorCSAqLworCWlmIChyZXQgPiAwKSB7CisJCWlvY2ItPmtpX2J1ZiArPSByZXQ7CisJCWlvY2ItPmtpX2xlZnQgLT0gcmV0OworCQkvKgorCQkgKiBGb3IgcGlwZXMgYW5kIHNvY2tldHMgd2UgcmV0dXJuIG9uY2Ugd2UgaGF2ZQorCQkgKiBzb21lIGRhdGE7IGZvciByZWd1bGFyIGZpbGVzIHdlIHJldHJ5IHRpbGwgd2UKKwkJICogY29tcGxldGUgdGhlIGVudGlyZSByZWFkIG9yIGZpbmQgdGhhdCB3ZSBjYW4ndAorCQkgKiByZWFkIGFueSBtb3JlIGRhdGEgKGUuZyBzaG9ydCByZWFkcykuCisJCSAqLworCQlpZiAoIVNfSVNGSUZPKGlub2RlLT5pX21vZGUpICYmICFTX0lTU09DSyhpbm9kZS0+aV9tb2RlKSkKKwkJCXJldCA9IC1FSU9DQlJFVFJZOworCX0KKworCS8qIFRoaXMgbWVhbnMgd2UgbXVzdCBoYXZlIHRyYW5zZmVycmVkIGFsbCB0aGF0IHdlIGNvdWxkICovCisJLyogTm8gbmVlZCB0byByZXRyeSBhbnltb3JlICovCisJaWYgKChyZXQgPT0gMCkgfHwgKGlvY2ItPmtpX2xlZnQgPT0gMCkpCisJCXJldCA9IGlvY2ItPmtpX25ieXRlcyAtIGlvY2ItPmtpX2xlZnQ7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRGVmYXVsdCByZXRyeSBtZXRob2QgZm9yIGFpb193cml0ZSAoYWxzbyB1c2VkIGZvciBmaXJzdCB0aW1lIHN1Ym1pdCkKKyAqIFJlc3BvbnNpYmxlIGZvciB1cGRhdGluZyBpb2NiIHN0YXRlIGFzIHJldHJpZXMgcHJvZ3Jlc3MKKyAqLworc3RhdGljIHNzaXplX3QgYWlvX3B3cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IpCit7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXNzaXplX3QgcmV0ID0gMDsKKworCXJldCA9IGZpbGUtPmZfb3AtPmFpb193cml0ZShpb2NiLCBpb2NiLT5raV9idWYsCisJCWlvY2ItPmtpX2xlZnQsIGlvY2ItPmtpX3Bvcyk7CisKKwlpZiAocmV0ID4gMCkgeworCQlpb2NiLT5raV9idWYgKz0gcmV0OworCQlpb2NiLT5raV9sZWZ0IC09IHJldDsKKworCQlyZXQgPSAtRUlPQ0JSRVRSWTsKKwl9CisKKwkvKiBUaGlzIG1lYW5zIHdlIG11c3QgaGF2ZSB0cmFuc2ZlcnJlZCBhbGwgdGhhdCB3ZSBjb3VsZCAqLworCS8qIE5vIG5lZWQgdG8gcmV0cnkgYW55bW9yZSAqLworCWlmICgocmV0ID09IDApIHx8IChpb2NiLT5raV9sZWZ0ID09IDApKQorCQlyZXQgPSBpb2NiLT5raV9uYnl0ZXMgLSBpb2NiLT5raV9sZWZ0OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWlvX2Zkc3luYyhzdHJ1Y3Qga2lvY2IgKmlvY2IpCit7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXNzaXplX3QgcmV0ID0gLUVJTlZBTDsKKworCWlmIChmaWxlLT5mX29wLT5haW9fZnN5bmMpCisJCXJldCA9IGZpbGUtPmZfb3AtPmFpb19mc3luYyhpb2NiLCAxKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhaW9fZnN5bmMoc3RydWN0IGtpb2NiICppb2NiKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzc2l6ZV90IHJldCA9IC1FSU5WQUw7CisKKwlpZiAoZmlsZS0+Zl9vcC0+YWlvX2ZzeW5jKQorCQlyZXQgPSBmaWxlLT5mX29wLT5haW9fZnN5bmMoaW9jYiwgMCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGFpb19zZXR1cF9pb2NiOgorICoJUGVyZm9ybXMgdGhlIGluaXRpYWwgY2hlY2tzIGFuZCBhaW8gcmV0cnkgbWV0aG9kCisgKglzZXR1cCBmb3IgdGhlIGtpb2NiIGF0IHRoZSB0aW1lIG9mIGlvIHN1Ym1pc3Npb24uCisgKi8KK3NzaXplX3QgYWlvX3NldHVwX2lvY2Ioc3RydWN0IGtpb2NiICpraW9jYikKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGtpb2NiLT5raV9maWxwOworCXNzaXplX3QgcmV0ID0gMDsKKworCXN3aXRjaCAoa2lvY2ItPmtpX29wY29kZSkgeworCWNhc2UgSU9DQl9DTURfUFJFQUQ6CisJCXJldCA9IC1FQkFERjsKKwkJaWYgKHVubGlrZWx5KCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpKQorCQkJYnJlYWs7CisJCXJldCA9IC1FRkFVTFQ7CisJCWlmICh1bmxpa2VseSghYWNjZXNzX29rKFZFUklGWV9XUklURSwga2lvY2ItPmtpX2J1ZiwKKwkJCWtpb2NiLT5raV9sZWZ0KSkpCisJCQlicmVhazsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJaWYgKGZpbGUtPmZfb3AtPmFpb19yZWFkKQorCQkJa2lvY2ItPmtpX3JldHJ5ID0gYWlvX3ByZWFkOworCQlicmVhazsKKwljYXNlIElPQ0JfQ01EX1BXUklURToKKwkJcmV0ID0gLUVCQURGOworCQlpZiAodW5saWtlbHkoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpKQorCQkJYnJlYWs7CisJCXJldCA9IC1FRkFVTFQ7CisJCWlmICh1bmxpa2VseSghYWNjZXNzX29rKFZFUklGWV9SRUFELCBraW9jYi0+a2lfYnVmLAorCQkJa2lvY2ItPmtpX2xlZnQpKSkKKwkJCWJyZWFrOworCQlyZXQgPSAtRUlOVkFMOworCQlpZiAoZmlsZS0+Zl9vcC0+YWlvX3dyaXRlKQorCQkJa2lvY2ItPmtpX3JldHJ5ID0gYWlvX3B3cml0ZTsKKwkJYnJlYWs7CisJY2FzZSBJT0NCX0NNRF9GRFNZTkM6CisJCXJldCA9IC1FSU5WQUw7CisJCWlmIChmaWxlLT5mX29wLT5haW9fZnN5bmMpCisJCQlraW9jYi0+a2lfcmV0cnkgPSBhaW9fZmRzeW5jOworCQlicmVhazsKKwljYXNlIElPQ0JfQ01EX0ZTWU5DOgorCQlyZXQgPSAtRUlOVkFMOworCQlpZiAoZmlsZS0+Zl9vcC0+YWlvX2ZzeW5jKQorCQkJa2lvY2ItPmtpX3JldHJ5ID0gYWlvX2ZzeW5jOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkcHJpbnRrKCJFSU5WQUw6IGlvX3N1Ym1pdDogbm8gb3BlcmF0aW9uIHByb3ZpZGVkXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWtpb2NiLT5raV9yZXRyeSkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCisvKgorICogYWlvX3dha2VfZnVuY3Rpb246CisgKiAJd2FpdCBxdWV1ZSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgYWlvIG5vdGlmaWNhdGlvbiwKKyAqIAlTaW1wbHkgdHJpZ2dlcnMgYSByZXRyeSBvZiB0aGUgb3BlcmF0aW9uIHZpYSBraWNrX2lvY2IuCisgKgorICogCVRoaXMgY2FsbGJhY2sgaXMgc3BlY2lmaWVkIGluIHRoZSB3YWl0IHF1ZXVlIGVudHJ5IGluCisgKglhIGtpb2NiCShjdXJyZW50LT5pb193YWl0IHBvaW50cyB0byB0aGlzIHdhaXQgcXVldWUKKyAqCWVudHJ5IHdoZW4gYW4gYWlvIG9wZXJhdGlvbiBleGVjdXRlczsgaXQgaXMgdXNlZAorICogCWluc3RlYWQgb2YgYSBzeW5jaHJvbm91cyB3YWl0IHdoZW4gYW4gaS9vIGJsb2NraW5nCisgKgljb25kaXRpb24gaXMgZW5jb3VudGVyZWQgZHVyaW5nIGFpbykuCisgKgorICogTm90ZToKKyAqIFRoaXMgcm91dGluZSBpcyBleGVjdXRlZCB3aXRoIHRoZSB3YWl0IHF1ZXVlIGxvY2sgaGVsZC4KKyAqIFNpbmNlIGtpY2tfaW9jYiBhY3F1aXJlcyBpb2NiLT5jdHgtPmN0eF9sb2NrLCBpdCBuZXN0cworICogdGhlIGlvY3R4IGxvY2sgaW5zaWRlIHRoZSB3YWl0IHF1ZXVlIGxvY2suIFRoaXMgaXMgc2FmZQorICogYmVjYXVzZSB0aGlzIGNhbGxiYWNrIGlzbid0IHVzZWQgZm9yIHdhaXQgcXVldWVzIHdoaWNoCisgKiBhcmUgbmVzdGVkIGluc2lkZSBpb2N0eCBsb2NrIChpLmUuIGN0eC0+d2FpdCkKKyAqLworaW50IGFpb193YWtlX2Z1bmN0aW9uKHdhaXRfcXVldWVfdCAqd2FpdCwgdW5zaWduZWQgbW9kZSwgaW50IHN5bmMsIHZvaWQgKmtleSkKK3sKKwlzdHJ1Y3Qga2lvY2IgKmlvY2IgPSBjb250YWluZXJfb2Yod2FpdCwgc3RydWN0IGtpb2NiLCBraV93YWl0KTsKKworCWxpc3RfZGVsX2luaXQoJndhaXQtPnRhc2tfbGlzdCk7CisJa2lja19pb2NiKGlvY2IpOworCXJldHVybiAxOworfQorCitpbnQgZmFzdGNhbGwgaW9fc3VibWl0X29uZShzdHJ1Y3Qga2lvY3R4ICpjdHgsIHN0cnVjdCBpb2NiIF9fdXNlciAqdXNlcl9pb2NiLAorCQkJIHN0cnVjdCBpb2NiICppb2NiKQoreworCXN0cnVjdCBraW9jYiAqcmVxOworCXN0cnVjdCBmaWxlICpmaWxlOworCXNzaXplX3QgcmV0OworCisJLyogZW5mb3JjZSBmb3J3YXJkcyBjb21wYXRpYmlsaXR5IG9uIHVzZXJzICovCisJaWYgKHVubGlrZWx5KGlvY2ItPmFpb19yZXNlcnZlZDEgfHwgaW9jYi0+YWlvX3Jlc2VydmVkMiB8fAorCQkgICAgIGlvY2ItPmFpb19yZXNlcnZlZDMpKSB7CisJCXByX2RlYnVnKCJFSU5WQUw6IGlvX3N1Ym1pdDogcmVzZXJ2ZSBmaWVsZCBzZXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBwcmV2ZW50IG92ZXJmbG93cyAqLworCWlmICh1bmxpa2VseSgKKwkgICAgKGlvY2ItPmFpb19idWYgIT0gKHVuc2lnbmVkIGxvbmcpaW9jYi0+YWlvX2J1ZikgfHwKKwkgICAgKGlvY2ItPmFpb19uYnl0ZXMgIT0gKHNpemVfdClpb2NiLT5haW9fbmJ5dGVzKSB8fAorCSAgICAoKHNzaXplX3QpaW9jYi0+YWlvX25ieXRlcyA8IDApCisJICAgKSkgeworCQlwcl9kZWJ1ZygiRUlOVkFMOiBpb19zdWJtaXQ6IG92ZXJmbG93IGNoZWNrXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmlsZSA9IGZnZXQoaW9jYi0+YWlvX2ZpbGRlcyk7CisJaWYgKHVubGlrZWx5KCFmaWxlKSkKKwkJcmV0dXJuIC1FQkFERjsKKworCXJlcSA9IGFpb19nZXRfcmVxKGN0eCk7CQkvKiByZXR1cm5zIHdpdGggMiByZWZlcmVuY2VzIHRvIHJlcSAqLworCWlmICh1bmxpa2VseSghcmVxKSkgeworCQlmcHV0KGZpbGUpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlyZXEtPmtpX2ZpbHAgPSBmaWxlOworCWlvY2ItPmFpb19rZXkgPSByZXEtPmtpX2tleTsKKwlyZXQgPSBwdXRfdXNlcihpb2NiLT5haW9fa2V5LCAmdXNlcl9pb2NiLT5haW9fa2V5KTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlkcHJpbnRrKCJFRkFVTFQ6IGFpb19rZXlcbiIpOworCQlnb3RvIG91dF9wdXRfcmVxOworCX0KKworCXJlcS0+a2lfb2JqLnVzZXIgPSB1c2VyX2lvY2I7CisJcmVxLT5raV91c2VyX2RhdGEgPSBpb2NiLT5haW9fZGF0YTsKKwlyZXEtPmtpX3BvcyA9IGlvY2ItPmFpb19vZmZzZXQ7CisKKwlyZXEtPmtpX2J1ZiA9IChjaGFyIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWlvY2ItPmFpb19idWY7CisJcmVxLT5raV9sZWZ0ID0gcmVxLT5raV9uYnl0ZXMgPSBpb2NiLT5haW9fbmJ5dGVzOworCXJlcS0+a2lfb3Bjb2RlID0gaW9jYi0+YWlvX2xpb19vcGNvZGU7CisJaW5pdF93YWl0cXVldWVfZnVuY19lbnRyeSgmcmVxLT5raV93YWl0LCBhaW9fd2FrZV9mdW5jdGlvbik7CisJSU5JVF9MSVNUX0hFQUQoJnJlcS0+a2lfd2FpdC50YXNrX2xpc3QpOworCXJlcS0+a2lfcnVuX2xpc3QubmV4dCA9IHJlcS0+a2lfcnVuX2xpc3QucHJldiA9IE5VTEw7CisJcmVxLT5raV9yZXRyeSA9IE5VTEw7CisJcmVxLT5raV9yZXRyaWVkID0gMDsKKwlyZXEtPmtpX2tpY2tlZCA9IDA7CisJcmVxLT5raV9xdWV1ZWQgPSAwOworCWFpb19ydW4gPSAwOworCWFpb193YWtldXBzID0gMDsKKworCXJldCA9IGFpb19zZXR1cF9pb2NiKHJlcSk7CisKKwlpZiAocmV0KQorCQlnb3RvIG91dF9wdXRfcmVxOworCisJc3Bpbl9sb2NrX2lycSgmY3R4LT5jdHhfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmcmVxLT5raV9ydW5fbGlzdCwgJmN0eC0+cnVuX2xpc3QpOworCS8qIGRyYWluIHRoZSBydW4gbGlzdCAqLworCXdoaWxlIChfX2Fpb19ydW5faW9jYnMoY3R4KSkKKwkJOworCXNwaW5fdW5sb2NrX2lycSgmY3R4LT5jdHhfbG9jayk7CisJYWlvX3B1dF9yZXEocmVxKTsJLyogZHJvcCBleHRyYSByZWYgdG8gcmVxICovCisJcmV0dXJuIDA7CisKK291dF9wdXRfcmVxOgorCWFpb19wdXRfcmVxKHJlcSk7CS8qIGRyb3AgZXh0cmEgcmVmIHRvIHJlcSAqLworCWFpb19wdXRfcmVxKHJlcSk7CS8qIGRyb3AgaS9vIHJlZiB0byByZXEgKi8KKwlyZXR1cm4gcmV0OworfQorCisvKiBzeXNfaW9fc3VibWl0OgorICoJUXVldWUgdGhlIG5yIGlvY2JzIHBvaW50ZWQgdG8gYnkgaW9jYnBwIGZvciBwcm9jZXNzaW5nLiAgUmV0dXJucworICoJdGhlIG51bWJlciBvZiBpb2NicyBxdWV1ZWQuICBNYXkgcmV0dXJuIC1FSU5WQUwgaWYgdGhlIGFpb19jb250ZXh0CisgKglzcGVjaWZpZWQgYnkgY3R4X2lkIGlzIGludmFsaWQsIGlmIG5yIGlzIDwgMCwgaWYgdGhlIGlvY2IgYXQKKyAqCSppb2NicHBbMF0gaXMgbm90IHByb3Blcmx5IGluaXRpYWxpemVkLCBpZiB0aGUgb3BlcmF0aW9uIHNwZWNpZmllZAorICoJaXMgaW52YWxpZCBmb3IgdGhlIGZpbGUgZGVzY3JpcHRvciBpbiB0aGUgaW9jYi4gIE1heSBmYWlsIHdpdGgKKyAqCS1FRkFVTFQgaWYgYW55IG9mIHRoZSBkYXRhIHN0cnVjdHVyZXMgcG9pbnQgdG8gaW52YWxpZCBkYXRhLiAgTWF5CisgKglmYWlsIHdpdGggLUVCQURGIGlmIHRoZSBmaWxlIGRlc2NyaXB0b3Igc3BlY2lmaWVkIGluIHRoZSBmaXJzdAorICoJaW9jYiBpcyBpbnZhbGlkLiAgTWF5IGZhaWwgd2l0aCAtRUFHQUlOIGlmIGluc3VmZmljaWVudCByZXNvdXJjZXMKKyAqCWFyZSBhdmFpbGFibGUgdG8gcXVldWUgYW55IGlvY2JzLiAgV2lsbCByZXR1cm4gMCBpZiBuciBpcyAwLiAgV2lsbAorICoJZmFpbCB3aXRoIC1FTk9TWVMgaWYgbm90IGltcGxlbWVudGVkLgorICovCithc21saW5rYWdlIGxvbmcgc3lzX2lvX3N1Ym1pdChhaW9fY29udGV4dF90IGN0eF9pZCwgbG9uZyBuciwKKwkJCSAgICAgIHN0cnVjdCBpb2NiIF9fdXNlciAqIF9fdXNlciAqaW9jYnBwKQoreworCXN0cnVjdCBraW9jdHggKmN0eDsKKwlsb25nIHJldCA9IDA7CisJaW50IGk7CisKKwlpZiAodW5saWtlbHkobnIgPCAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodW5saWtlbHkoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgaW9jYnBwLCAobnIqc2l6ZW9mKCppb2NicHApKSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWN0eCA9IGxvb2t1cF9pb2N0eChjdHhfaWQpOworCWlmICh1bmxpa2VseSghY3R4KSkgeworCQlwcl9kZWJ1ZygiRUlOVkFMOiBpb19zdWJtaXQ6IGludmFsaWQgY29udGV4dCBpZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogQUtQTTogc2hvdWxkIHRoaXMgcmV0dXJuIGEgcGFydGlhbCByZXN1bHQgaWYgc29tZSBvZiB0aGUgSU9zIHdlcmUKKwkgKiBzdWNjZXNzZnVsbHkgc3VibWl0dGVkPworCSAqLworCWZvciAoaT0wOyBpPG5yOyBpKyspIHsKKwkJc3RydWN0IGlvY2IgX191c2VyICp1c2VyX2lvY2I7CisJCXN0cnVjdCBpb2NiIHRtcDsKKworCQlpZiAodW5saWtlbHkoX19nZXRfdXNlcih1c2VyX2lvY2IsIGlvY2JwcCArIGkpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHVubGlrZWx5KGNvcHlfZnJvbV91c2VyKCZ0bXAsIHVzZXJfaW9jYiwgc2l6ZW9mKHRtcCkpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0ID0gaW9fc3VibWl0X29uZShjdHgsIHVzZXJfaW9jYiwgJnRtcCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisKKwlwdXRfaW9jdHgoY3R4KTsKKwlyZXR1cm4gaSA/IGkgOiByZXQ7Cit9CisKKy8qIGxvb2t1cF9raW9jYgorICoJRmluZHMgYSBnaXZlbiBpb2NiIGZvciBjYW5jZWxsYXRpb24uCisgKglNVVNUIGJlIGNhbGxlZCB3aXRoIGN0eC0+Y3R4X2xvY2sgaGVsZC4KKyAqLworc3RydWN0IGtpb2NiICpsb29rdXBfa2lvY2Ioc3RydWN0IGtpb2N0eCAqY3R4LCBzdHJ1Y3QgaW9jYiBfX3VzZXIgKmlvY2IsIHUzMiBrZXkpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCS8qIFRPRE86IHVzZSBhIGhhc2ggb3IgYXJyYXksIHRoaXMgc3Vja3MuICovCisJbGlzdF9mb3JfZWFjaChwb3MsICZjdHgtPmFjdGl2ZV9yZXFzKSB7CisJCXN0cnVjdCBraW9jYiAqa2lvY2IgPSBsaXN0X2tpb2NiKHBvcyk7CisJCWlmIChraW9jYi0+a2lfb2JqLnVzZXIgPT0gaW9jYiAmJiBraW9jYi0+a2lfa2V5ID09IGtleSkKKwkJCXJldHVybiBraW9jYjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIHN5c19pb19jYW5jZWw6CisgKglBdHRlbXB0cyB0byBjYW5jZWwgYW4gaW9jYiBwcmV2aW91c2x5IHBhc3NlZCB0byBpb19zdWJtaXQuICBJZgorICoJdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsbHkgY2FuY2VsbGVkLCB0aGUgcmVzdWx0aW5nIGV2ZW50IGlzCisgKgljb3BpZWQgaW50byB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgcmVzdWx0IHdpdGhvdXQgYmVpbmcgcGxhY2VkCisgKglpbnRvIHRoZSBjb21wbGV0aW9uIHF1ZXVlIGFuZCAwIGlzIHJldHVybmVkLiAgTWF5IGZhaWwgd2l0aAorICoJLUVGQVVMVCBpZiBhbnkgb2YgdGhlIGRhdGEgc3RydWN0dXJlcyBwb2ludGVkIHRvIGFyZSBpbnZhbGlkLgorICoJTWF5IGZhaWwgd2l0aCAtRUlOVkFMIGlmIGFpb19jb250ZXh0IHNwZWNpZmllZCBieSBjdHhfaWQgaXMKKyAqCWludmFsaWQuICBNYXkgZmFpbCB3aXRoIC1FQUdBSU4gaWYgdGhlIGlvY2Igc3BlY2lmaWVkIHdhcyBub3QKKyAqCWNhbmNlbGxlZC4gIFdpbGwgZmFpbCB3aXRoIC1FTk9TWVMgaWYgbm90IGltcGxlbWVudGVkLgorICovCithc21saW5rYWdlIGxvbmcgc3lzX2lvX2NhbmNlbChhaW9fY29udGV4dF90IGN0eF9pZCwgc3RydWN0IGlvY2IgX191c2VyICppb2NiLAorCQkJICAgICAgc3RydWN0IGlvX2V2ZW50IF9fdXNlciAqcmVzdWx0KQoreworCWludCAoKmNhbmNlbCkoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW9fZXZlbnQgKnJlcyk7CisJc3RydWN0IGtpb2N0eCAqY3R4OworCXN0cnVjdCBraW9jYiAqa2lvY2I7CisJdTMyIGtleTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2V0X3VzZXIoa2V5LCAmaW9jYi0+YWlvX2tleSk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCXJldHVybiAtRUZBVUxUOworCisJY3R4ID0gbG9va3VwX2lvY3R4KGN0eF9pZCk7CisJaWYgKHVubGlrZWx5KCFjdHgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCXJldCA9IC1FQUdBSU47CisJa2lvY2IgPSBsb29rdXBfa2lvY2IoY3R4LCBpb2NiLCBrZXkpOworCWlmIChraW9jYiAmJiBraW9jYi0+a2lfY2FuY2VsKSB7CisJCWNhbmNlbCA9IGtpb2NiLT5raV9jYW5jZWw7CisJCWtpb2NiLT5raV91c2VycyArKzsKKwkJa2lvY2JTZXRDYW5jZWxsZWQoa2lvY2IpOworCX0gZWxzZQorCQljYW5jZWwgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycSgmY3R4LT5jdHhfbG9jayk7CisKKwlpZiAoTlVMTCAhPSBjYW5jZWwpIHsKKwkJc3RydWN0IGlvX2V2ZW50IHRtcDsKKwkJcHJfZGVidWcoImNhbGxpbmcgY2FuY2VsXG4iKTsKKwkJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKwkJdG1wLm9iaiA9ICh1NjQpKHVuc2lnbmVkIGxvbmcpa2lvY2ItPmtpX29iai51c2VyOworCQl0bXAuZGF0YSA9IGtpb2NiLT5raV91c2VyX2RhdGE7CisJCXJldCA9IGNhbmNlbChraW9jYiwgJnRtcCk7CisJCWlmICghcmV0KSB7CisJCQkvKiBDYW5jZWxsYXRpb24gc3VjY2VlZGVkIC0tIGNvcHkgdGhlIHJlc3VsdAorCQkJICogaW50byB0aGUgdXNlcidzIGJ1ZmZlci4KKwkJCSAqLworCQkJaWYgKGNvcHlfdG9fdXNlcihyZXN1bHQsICZ0bXAsIHNpemVvZih0bXApKSkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQl9CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0RFQlVHICJpb2NiIGhhcyBubyBjYW5jZWwgb3BlcmF0aW9uXG4iKTsKKworCXB1dF9pb2N0eChjdHgpOworCisJcmV0dXJuIHJldDsKK30KKworLyogaW9fZ2V0ZXZlbnRzOgorICoJQXR0ZW1wdHMgdG8gcmVhZCBhdCBsZWFzdCBtaW5fbnIgZXZlbnRzIGFuZCB1cCB0byBuciBldmVudHMgZnJvbQorICoJdGhlIGNvbXBsZXRpb24gcXVldWUgZm9yIHRoZSBhaW9fY29udGV4dCBzcGVjaWZpZWQgYnkgY3R4X2lkLiAgTWF5CisgKglmYWlsIHdpdGggLUVJTlZBTCBpZiBjdHhfaWQgaXMgaW52YWxpZCwgaWYgbWluX25yIGlzIG91dCBvZiByYW5nZSwKKyAqCWlmIG5yIGlzIG91dCBvZiByYW5nZSwgaWYgd2hlbiBpcyBvdXQgb2YgcmFuZ2UuICBNYXkgZmFpbCB3aXRoCisgKgktRUZBVUxUIGlmIGFueSBvZiB0aGUgbWVtb3J5IHNwZWNpZmllZCB0byBpcyBpbnZhbGlkLiAgTWF5IHJldHVybgorICoJMCBvciA8IG1pbl9uciBpZiBubyBldmVudHMgYXJlIGF2YWlsYWJsZSBhbmQgdGhlIHRpbWVvdXQgc3BlY2lmaWVkCisgKglieSB3aGVuCWhhcyBlbGFwc2VkLCB3aGVyZSB3aGVuID09IE5VTEwgc3BlY2lmaWVzIGFuIGluZmluaXRlCisgKgl0aW1lb3V0LiAgTm90ZSB0aGF0IHRoZSB0aW1lb3V0IHBvaW50ZWQgdG8gYnkgd2hlbiBpcyByZWxhdGl2ZSBhbmQKKyAqCXdpbGwgYmUgdXBkYXRlZCBpZiBub3QgTlVMTCBhbmQgdGhlIG9wZXJhdGlvbiBibG9ja3MuICBXaWxsIGZhaWwKKyAqCXdpdGggLUVOT1NZUyBpZiBub3QgaW1wbGVtZW50ZWQuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfaW9fZ2V0ZXZlbnRzKGFpb19jb250ZXh0X3QgY3R4X2lkLAorCQkJCSBsb25nIG1pbl9uciwKKwkJCQkgbG9uZyBuciwKKwkJCQkgc3RydWN0IGlvX2V2ZW50IF9fdXNlciAqZXZlbnRzLAorCQkJCSBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICp0aW1lb3V0KQoreworCXN0cnVjdCBraW9jdHggKmlvY3R4ID0gbG9va3VwX2lvY3R4KGN0eF9pZCk7CisJbG9uZyByZXQgPSAtRUlOVkFMOworCisJaWYgKGxpa2VseShpb2N0eCkpIHsKKwkJaWYgKGxpa2VseShtaW5fbnIgPD0gbnIgJiYgbWluX25yID49IDAgJiYgbnIgPj0gMCkpCisJCQlyZXQgPSByZWFkX2V2ZW50cyhpb2N0eCwgbWluX25yLCBuciwgZXZlbnRzLCB0aW1lb3V0KTsKKwkJcHV0X2lvY3R4KGlvY3R4KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitfX2luaXRjYWxsKGFpb19zZXR1cCk7CisKK0VYUE9SVF9TWU1CT0woYWlvX2NvbXBsZXRlKTsKK0VYUE9SVF9TWU1CT0woYWlvX3B1dF9yZXEpOworRVhQT1JUX1NZTUJPTCh3YWl0X29uX3N5bmNfa2lvY2IpOwpkaWZmIC0tZ2l0IGEvZnMvYXR0ci5jIGIvZnMvYXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzc2ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hdHRyLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiAgbGludXgvZnMvYXR0ci5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqICBjaGFuZ2VzIGJ5IFRob21hcyBTY2hvZWJlbC1UaGV1ZXIKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisvKiBUYWtlbiBvdmVyIGZyb20gdGhlIG9sZCBjb2RlLi4uICovCisKKy8qIFBPU0lYIFVJRC9HSUQgdmVyaWZpY2F0aW9uIGZvciBzZXR0aW5nIGlub2RlIGF0dHJpYnV0ZXMuICovCitpbnQgaW5vZGVfY2hhbmdlX29rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpYXR0ciAqYXR0cikKK3sKKwlpbnQgcmV0dmFsID0gLUVQRVJNOworCXVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHItPmlhX3ZhbGlkOworCisJLyogSWYgZm9yY2UgaXMgc2V0IGRvIGl0IGFueXdheS4gKi8KKwlpZiAoaWFfdmFsaWQgJiBBVFRSX0ZPUkNFKQorCQlnb3RvIGZpbmU7CisKKwkvKiBNYWtlIHN1cmUgYSBjYWxsZXIgY2FuIGNob3duLiAqLworCWlmICgoaWFfdmFsaWQgJiBBVFRSX1VJRCkgJiYKKwkgICAgKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCB8fAorCSAgICAgYXR0ci0+aWFfdWlkICE9IGlub2RlLT5pX3VpZCkgJiYgIWNhcGFibGUoQ0FQX0NIT1dOKSkKKwkJZ290byBlcnJvcjsKKworCS8qIE1ha2Ugc3VyZSBjYWxsZXIgY2FuIGNoZ3JwLiAqLworCWlmICgoaWFfdmFsaWQgJiBBVFRSX0dJRCkgJiYKKwkgICAgKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCB8fAorCSAgICAoIWluX2dyb3VwX3AoYXR0ci0+aWFfZ2lkKSAmJiBhdHRyLT5pYV9naWQgIT0gaW5vZGUtPmlfZ2lkKSkgJiYKKwkgICAgIWNhcGFibGUoQ0FQX0NIT1dOKSkKKwkJZ290byBlcnJvcjsKKworCS8qIE1ha2Ugc3VyZSBhIGNhbGxlciBjYW4gY2htb2QuICovCisJaWYgKGlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CisJCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKKwkJCWdvdG8gZXJyb3I7CisJCS8qIEFsc28gY2hlY2sgdGhlIHNldGdpZCBiaXQhICovCisJCWlmICghaW5fZ3JvdXBfcCgoaWFfdmFsaWQgJiBBVFRSX0dJRCkgPyBhdHRyLT5pYV9naWQgOgorCQkJCWlub2RlLT5pX2dpZCkgJiYgIWNhcGFibGUoQ0FQX0ZTRVRJRCkpCisJCQlhdHRyLT5pYV9tb2RlICY9IH5TX0lTR0lEOworCX0KKworCS8qIENoZWNrIGZvciBzZXR0aW5nIHRoZSBpbm9kZSB0aW1lLiAqLworCWlmIChpYV92YWxpZCAmIChBVFRSX01USU1FX1NFVCB8IEFUVFJfQVRJTUVfU0VUKSkgeworCQlpZiAoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkICYmICFjYXBhYmxlKENBUF9GT1dORVIpKQorCQkJZ290byBlcnJvcjsKKwl9CitmaW5lOgorCXJldHZhbCA9IDA7CitlcnJvcjoKKwlyZXR1cm4gcmV0dmFsOworfQorCitFWFBPUlRfU1lNQk9MKGlub2RlX2NoYW5nZV9vayk7CisKK2ludCBpbm9kZV9zZXRhdHRyKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgaWF0dHIgKiBhdHRyKQoreworCXVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHItPmlhX3ZhbGlkOworCWludCBlcnJvciA9IDA7CisKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKKwkJaWYgKGF0dHItPmlhX3NpemUgIT0gaV9zaXplX3JlYWQoaW5vZGUpKSB7CisJCQllcnJvciA9IHZtdHJ1bmNhdGUoaW5vZGUsIGF0dHItPmlhX3NpemUpOworCQkJaWYgKGVycm9yIHx8IChpYV92YWxpZCA9PSBBVFRSX1NJWkUpKQorCQkJCWdvdG8gb3V0OworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFdlIHNraXBwZWQgdGhlIHRydW5jYXRlIGJ1dCBtdXN0IHN0aWxsIHVwZGF0ZQorCQkJICogdGltZXN0YW1wcworCQkJICovCisJCQlpYV92YWxpZCB8PSBBVFRSX01USU1FfEFUVFJfQ1RJTUU7CisJCX0KKwl9CisKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX1VJRCkKKwkJaW5vZGUtPmlfdWlkID0gYXR0ci0+aWFfdWlkOworCWlmIChpYV92YWxpZCAmIEFUVFJfR0lEKQorCQlpbm9kZS0+aV9naWQgPSBhdHRyLT5pYV9naWQ7CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9BVElNRSkKKwkJaW5vZGUtPmlfYXRpbWUgPSB0aW1lc3BlY190cnVuYyhhdHRyLT5pYV9hdGltZSwKKwkJCQkJCWlub2RlLT5pX3NiLT5zX3RpbWVfZ3Jhbik7CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9NVElNRSkKKwkJaW5vZGUtPmlfbXRpbWUgPSB0aW1lc3BlY190cnVuYyhhdHRyLT5pYV9tdGltZSwKKwkJCQkJCWlub2RlLT5pX3NiLT5zX3RpbWVfZ3Jhbik7CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9DVElNRSkKKwkJaW5vZGUtPmlfY3RpbWUgPSB0aW1lc3BlY190cnVuYyhhdHRyLT5pYV9jdGltZSwKKwkJCQkJCWlub2RlLT5pX3NiLT5zX3RpbWVfZ3Jhbik7CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CisJCXVtb2RlX3QgbW9kZSA9IGF0dHItPmlhX21vZGU7CisKKwkJaWYgKCFpbl9ncm91cF9wKGlub2RlLT5pX2dpZCkgJiYgIWNhcGFibGUoQ0FQX0ZTRVRJRCkpCisJCQltb2RlICY9IH5TX0lTR0lEOworCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwl9CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitFWFBPUlRfU1lNQk9MKGlub2RlX3NldGF0dHIpOworCitpbnQgc2V0YXR0cl9tYXNrKHVuc2lnbmVkIGludCBpYV92YWxpZCkKK3sKKwl1bnNpZ25lZCBsb25nIGRuX21hc2sgPSAwOworCisJaWYgKGlhX3ZhbGlkICYgQVRUUl9VSUQpCisJCWRuX21hc2sgfD0gRE5fQVRUUklCOworCWlmIChpYV92YWxpZCAmIEFUVFJfR0lEKQorCQlkbl9tYXNrIHw9IEROX0FUVFJJQjsKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX1NJWkUpCisJCWRuX21hc2sgfD0gRE5fTU9ESUZZOworCS8qIGJvdGggdGltZXMgaW1wbGllcyBhIHV0aW1lKHMpIGNhbGwgKi8KKwlpZiAoKGlhX3ZhbGlkICYgKEFUVFJfQVRJTUV8QVRUUl9NVElNRSkpID09IChBVFRSX0FUSU1FfEFUVFJfTVRJTUUpKQorCQlkbl9tYXNrIHw9IEROX0FUVFJJQjsKKwllbHNlIGlmIChpYV92YWxpZCAmIEFUVFJfQVRJTUUpCisJCWRuX21hc2sgfD0gRE5fQUNDRVNTOworCWVsc2UgaWYgKGlhX3ZhbGlkICYgQVRUUl9NVElNRSkKKwkJZG5fbWFzayB8PSBETl9NT0RJRlk7CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9NT0RFKQorCQlkbl9tYXNrIHw9IEROX0FUVFJJQjsKKwlyZXR1cm4gZG5fbWFzazsKK30KKworaW50IG5vdGlmeV9jaGFuZ2Uoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IGlhdHRyICogYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCW1vZGVfdCBtb2RlOworCWludCBlcnJvcjsKKwlzdHJ1Y3QgdGltZXNwZWMgbm93OworCXVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHItPmlhX3ZhbGlkOworCisJaWYgKCFpbm9kZSkKKwkJQlVHKCk7CisKKwltb2RlID0gaW5vZGUtPmlfbW9kZTsKKwlub3cgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOworCisJYXR0ci0+aWFfY3RpbWUgPSBub3c7CisJaWYgKCEoaWFfdmFsaWQgJiBBVFRSX0FUSU1FX1NFVCkpCisJCWF0dHItPmlhX2F0aW1lID0gbm93OworCWlmICghKGlhX3ZhbGlkICYgQVRUUl9NVElNRV9TRVQpKQorCQlhdHRyLT5pYV9tdGltZSA9IG5vdzsKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX0tJTExfU1VJRCkgeworCQlhdHRyLT5pYV92YWxpZCAmPSB+QVRUUl9LSUxMX1NVSUQ7CisJCWlmIChtb2RlICYgU19JU1VJRCkgeworCQkJaWYgKCEoaWFfdmFsaWQgJiBBVFRSX01PREUpKSB7CisJCQkJaWFfdmFsaWQgPSBhdHRyLT5pYV92YWxpZCB8PSBBVFRSX01PREU7CisJCQkJYXR0ci0+aWFfbW9kZSA9IGlub2RlLT5pX21vZGU7CisJCQl9CisJCQlhdHRyLT5pYV9tb2RlICY9IH5TX0lTVUlEOworCQl9CisJfQorCWlmIChpYV92YWxpZCAmIEFUVFJfS0lMTF9TR0lEKSB7CisJCWF0dHItPmlhX3ZhbGlkICY9IH4gQVRUUl9LSUxMX1NHSUQ7CisJCWlmICgobW9kZSAmIChTX0lTR0lEIHwgU19JWEdSUCkpID09IChTX0lTR0lEIHwgU19JWEdSUCkpIHsKKwkJCWlmICghKGlhX3ZhbGlkICYgQVRUUl9NT0RFKSkgeworCQkJCWlhX3ZhbGlkID0gYXR0ci0+aWFfdmFsaWQgfD0gQVRUUl9NT0RFOworCQkJCWF0dHItPmlhX21vZGUgPSBpbm9kZS0+aV9tb2RlOworCQkJfQorCQkJYXR0ci0+aWFfbW9kZSAmPSB+U19JU0dJRDsKKwkJfQorCX0KKwlpZiAoIWF0dHItPmlhX3ZhbGlkKQorCQlyZXR1cm4gMDsKKworCWlmIChpYV92YWxpZCAmIEFUVFJfU0laRSkKKwkJZG93bl93cml0ZSgmZGVudHJ5LT5kX2lub2RlLT5pX2FsbG9jX3NlbSk7CisKKwlpZiAoaW5vZGUtPmlfb3AgJiYgaW5vZGUtPmlfb3AtPnNldGF0dHIpIHsKKwkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9zZXRhdHRyKGRlbnRyeSwgYXR0cik7CisJCWlmICghZXJyb3IpCisJCQllcnJvciA9IGlub2RlLT5pX29wLT5zZXRhdHRyKGRlbnRyeSwgYXR0cik7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGF0dHIpOworCQlpZiAoIWVycm9yKQorCQkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9zZXRhdHRyKGRlbnRyeSwgYXR0cik7CisJCWlmICghZXJyb3IpIHsKKwkJCWlmICgoaWFfdmFsaWQgJiBBVFRSX1VJRCAmJiBhdHRyLT5pYV91aWQgIT0gaW5vZGUtPmlfdWlkKSB8fAorCQkJICAgIChpYV92YWxpZCAmIEFUVFJfR0lEICYmIGF0dHItPmlhX2dpZCAhPSBpbm9kZS0+aV9naWQpKQorCQkJCWVycm9yID0gRFFVT1RfVFJBTlNGRVIoaW5vZGUsIGF0dHIpID8gLUVEUVVPVCA6IDA7CisJCQlpZiAoIWVycm9yKQorCQkJCWVycm9yID0gaW5vZGVfc2V0YXR0cihpbm9kZSwgYXR0cik7CisJCX0KKwl9CisKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX1NJWkUpCisJCXVwX3dyaXRlKCZkZW50cnktPmRfaW5vZGUtPmlfYWxsb2Nfc2VtKTsKKworCWlmICghZXJyb3IpIHsKKwkJdW5zaWduZWQgbG9uZyBkbl9tYXNrID0gc2V0YXR0cl9tYXNrKGlhX3ZhbGlkKTsKKwkJaWYgKGRuX21hc2spCisJCQlkbm90aWZ5X3BhcmVudChkZW50cnksIGRuX21hc2spOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK0VYUE9SVF9TWU1CT0wobm90aWZ5X2NoYW5nZSk7CmRpZmYgLS1naXQgYS9mcy9hdXRvZnMvTWFrZWZpbGUgYi9mcy9hdXRvZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzYTYwZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2F1dG9mcy9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBhdXRvZnMtZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX0FVVE9GU19GUykgKz0gYXV0b2ZzLm8KKworYXV0b2ZzLW9ianMgOj0gZGlyaGFzaC5vIGluaXQubyBpbm9kZS5vIHJvb3QubyBzeW1saW5rLm8gd2FpdHEubwpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzL2F1dG9mc19pLmggYi9mcy9hdXRvZnMvYXV0b2ZzX2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTcxNDMxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYXV0b2ZzL2F1dG9mc19pLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qIC0qLSBsaW51eC1jIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqICAgCisgKiBsaW51eC9mcy9hdXRvZnMvYXV0b2ZzX2kuaAorICoKKyAqICAgQ29weXJpZ2h0IDE5OTctMTk5OCBUcmFuc21ldGEgQ29ycG9yYXRpb24gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgb3IgYXQgeW91cgorICogb3B0aW9uLCBhbnkgbGF0ZXIgdmVyc2lvbiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogSW50ZXJuYWwgaGVhZGVyIGZpbGUgZm9yIGF1dG9mcyAqLworCisjaW5jbHVkZSA8bGludXgvYXV0b19mcy5oPgorCisvKiBUaGlzIGlzIHRoZSByYW5nZSBvZiBpb2N0bCgpIG51bWJlcnMgd2UgY2xhaW0gYXMgb3VycyAqLworI2RlZmluZSBBVVRPRlNfSU9DX0ZJUlNUICAgICBBVVRPRlNfSU9DX1JFQURZCisjZGVmaW5lIEFVVE9GU19JT0NfQ09VTlQgICAgIDMyCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERQUklOVEsoRCkgKHByaW50ayBEKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5USyhEKSAoKHZvaWQpMCkKKyNlbmRpZgorCisjZGVmaW5lIEFVVE9GU19TVVBFUl9NQUdJQyAweDAxODcKKworLyoKKyAqIElmIHRoZSBkYWVtb24gcmV0dXJucyBhIG5lZ2F0aXZlIHJlc3BvbnNlIChBVVRPRlNfSU9DX0ZBSUwpIHRoZW4gdGhlCisgKiBrZXJuZWwgd2lsbCBrZWVwIHRoZSBuZWdhdGl2ZSByZXNwb25zZSBjYWNoZWQgZm9yIHVwIHRvIHRoZSB0aW1lIGdpdmVuCisgKiBoZXJlLCBhbHRob3VnaCB0aGUgdGltZSBjYW4gYmUgc2hvcnRlciBpZiB0aGUga2VybmVsIHRocm93cyB0aGUgZGNhY2hlCisgKiBlbnRyeSBhd2F5LiAgVGhpcyBwcm9iYWJseSBzaG91bGQgYmUgc2V0dGFibGUgZnJvbSB1c2VyIHNwYWNlLgorICovCisjZGVmaW5lIEFVVE9GU19ORUdBVElWRV9USU1FT1VUICg2MCpIWikJLyogMSBtaW51dGUgKi8KKworLyogU3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJvb3QgZGlyZWN0b3J5IGhhc2ggdGFibGUgKi8KKworI2RlZmluZSBBVVRPRlNfSEFTSF9TSVpFIDY3CisKK3N0cnVjdCBhdXRvZnNfZGlyX2VudCB7CisJaW50IGhhc2g7CisJY2hhciAqbmFtZTsKKwlpbnQgbGVuOworCWlub190IGlubzsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJLyogTGlua2VkIGxpc3Qgb2YgZW50cmllcyAqLworCXN0cnVjdCBhdXRvZnNfZGlyX2VudCAqbmV4dDsKKwlzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKipiYWNrOworCS8qIFRoZSBmb2xsb3dpbmcgZW50cmllcyBhcmUgZm9yIHRoZSBleHBpcnkgc3lzdGVtICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VzYWdlOworCXN0cnVjdCBsaXN0X2hlYWQgZXhwOworfTsKKworc3RydWN0IGF1dG9mc19kaXJoYXNoIHsKKwlzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmhbQVVUT0ZTX0hBU0hfU0laRV07CisJc3RydWN0IGxpc3RfaGVhZCBleHBpcnlfaGVhZDsKK307CisKK3N0cnVjdCBhdXRvZnNfd2FpdF9xdWV1ZSB7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcXVldWU7CisJc3RydWN0IGF1dG9mc193YWl0X3F1ZXVlICpuZXh0OworCWF1dG9mc193cXRfdCB3YWl0X3F1ZXVlX3Rva2VuOworCS8qIFdlIHVzZSB0aGUgZm9sbG93aW5nIHRvIHNlZSB3aGF0IHdlIGFyZSB3YWl0aW5nIGZvciAqLworCWludCBoYXNoOworCWludCBsZW47CisJY2hhciAqbmFtZTsKKwkvKiBUaGlzIGlzIGZvciBzdGF0dXMgcmVwb3J0aW5nIHVwb24gcmV0dXJuICovCisJaW50IHN0YXR1czsKKwlpbnQgd2FpdF9jdHI7Cit9OworCitzdHJ1Y3QgYXV0b2ZzX3N5bWxpbmsgeworCWNoYXIgKmRhdGE7CisJaW50IGxlbjsKKwl0aW1lX3QgbXRpbWU7Cit9OworCisjZGVmaW5lIEFVVE9GU19NQVhfU1lNTElOS1MgMjU2CisKKyNkZWZpbmUgQVVUT0ZTX1JPT1RfSU5PICAgICAgMQorI2RlZmluZSBBVVRPRlNfRklSU1RfU1lNTElOSyAyCisjZGVmaW5lIEFVVE9GU19GSVJTVF9ESVJfSU5PIChBVVRPRlNfRklSU1RfU1lNTElOSytBVVRPRlNfTUFYX1NZTUxJTktTKQorCisjZGVmaW5lIEFVVE9GU19TWU1MSU5LX0JJVE1BUF9MRU4gXAorCSgoQVVUT0ZTX01BWF9TWU1MSU5LUysoKHNpemVvZihsb25nKSoxKS0xKSkvKHNpemVvZihsb25nKSo4KSkKKworI2RlZmluZSBBVVRPRlNfU0JJX01BR0lDIDB4NmQ0YTU1NmQKKworc3RydWN0IGF1dG9mc19zYl9pbmZvIHsKKwl1MzIgbWFnaWM7CisJc3RydWN0IGZpbGUgKnBpcGU7CisJcGlkX3Qgb3pfcGdycDsKKwlpbnQgY2F0YXRvbmljOworCXVuc2lnbmVkIGxvbmcgZXhwX3RpbWVvdXQ7CisJaW5vX3QgbmV4dF9kaXJfaW5vOworCXN0cnVjdCBhdXRvZnNfd2FpdF9xdWV1ZSAqcXVldWVzOyAvKiBXYWl0IHF1ZXVlIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggZGlyaGFzaDsgLyogUm9vdCBkaXJlY3RvcnkgaGFzaCAqLworCXN0cnVjdCBhdXRvZnNfc3ltbGluayBzeW1saW5rW0FVVE9GU19NQVhfU1lNTElOS1NdOworCXVuc2lnbmVkIGxvbmcgc3ltbGlua19iaXRtYXBbQVVUT0ZTX1NZTUxJTktfQklUTUFQX0xFTl07Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqYXV0b2ZzX3NiaShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiAoc3RydWN0IGF1dG9mc19zYl9pbmZvICopKHNiLT5zX2ZzX2luZm8pOworfQorCisvKiBhdXRvZnNfb3pfbW9kZSgpOiBkbyB3ZSBzZWUgdGhlIG1hbiBiZWhpbmQgdGhlIGN1cnRhaW4/ICAoVGhlCisgICBwcm9jZXNzZXMgd2hpY2ggZG8gbWFuaXB1bGF0aW9ucyBmb3IgdXMgaW4gdXNlciBzcGFjZSBzZWVzIHRoZSByYXcKKyAgIGZpbGVzeXN0ZW0gd2l0aG91dCAibWFnaWMiLikgKi8KKworc3RhdGljIGlubGluZSBpbnQgYXV0b2ZzX296X21vZGUoc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkpIHsKKwlyZXR1cm4gc2JpLT5jYXRhdG9uaWMgfHwgcHJvY2Vzc19ncm91cChjdXJyZW50KSA9PSBzYmktPm96X3BncnA7Cit9CisKKy8qIEhhc2ggb3BlcmF0aW9ucyAqLworCit2b2lkIGF1dG9mc19pbml0aWFsaXplX2hhc2goc3RydWN0IGF1dG9mc19kaXJoYXNoICopOworc3RydWN0IGF1dG9mc19kaXJfZW50ICphdXRvZnNfaGFzaF9sb29rdXAoY29uc3Qgc3RydWN0IGF1dG9mc19kaXJoYXNoICosc3RydWN0IHFzdHIgKik7Cit2b2lkIGF1dG9mc19oYXNoX2luc2VydChzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggKixzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKik7Cit2b2lkIGF1dG9mc19oYXNoX2RlbGV0ZShzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKik7CitzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmF1dG9mc19oYXNoX2VudW0oY29uc3Qgc3RydWN0IGF1dG9mc19kaXJoYXNoICosb2ZmX3QgKixzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKik7Cit2b2lkIGF1dG9mc19oYXNoX2RwdXRhbGwoc3RydWN0IGF1dG9mc19kaXJoYXNoICopOwordm9pZCBhdXRvZnNfaGFzaF9udWtlKHN0cnVjdCBhdXRvZnNfZGlyaGFzaCAqKTsKKworLyogRXhwaXJhdGlvbi1oYW5kbGluZyBmdW5jdGlvbnMgKi8KKwordm9pZCBhdXRvZnNfdXBkYXRlX3VzYWdlKHN0cnVjdCBhdXRvZnNfZGlyaGFzaCAqLHN0cnVjdCBhdXRvZnNfZGlyX2VudCAqKTsKK3N0cnVjdCBhdXRvZnNfZGlyX2VudCAqYXV0b2ZzX2V4cGlyZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKixzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKiwgc3RydWN0IHZmc21vdW50ICptbnQpOworCisvKiBPcGVyYXRpb25zIHN0cnVjdHVyZXMgKi8KKworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGF1dG9mc19yb290X2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYXV0b2ZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1dG9mc19yb290X29wZXJhdGlvbnM7CisKKy8qIEluaXRpYWxpemluZyBmdW5jdGlvbiAqLworCitpbnQgYXV0b2ZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICosIHZvaWQgKiwgaW50KTsKKworLyogUXVldWUgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KKworaW50IGF1dG9mc193YWl0KHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqLHN0cnVjdCBxc3RyICopOworaW50IGF1dG9mc193YWl0X3JlbGVhc2Uoc3RydWN0IGF1dG9mc19zYl9pbmZvICosYXV0b2ZzX3dxdF90LGludCk7Cit2b2lkIGF1dG9mc19jYXRhdG9uaWNfbW9kZShzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKik7CisKKyNpZmRlZiBERUJVRwordm9pZCBhdXRvZnNfc2F5KGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pOworI2Vsc2UKKyNkZWZpbmUgYXV0b2ZzX3NheShuLGwpICgodm9pZCkwKQorI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9hdXRvZnMvZGlyaGFzaC5jIGIvZnMvYXV0b2ZzL2Rpcmhhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDgxNDNmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYXV0b2ZzL2Rpcmhhc2guYwpAQCAtMCwwICsxLDI0OSBAQAorLyogLSotIGxpbnV4LWMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogbGludXgvZnMvYXV0b2ZzL2Rpcmhhc2guYworICoKKyAqICBDb3B5cmlnaHQgMTk5Ny0xOTk4IFRyYW5zbWV0YSBDb3Jwb3JhdGlvbiAtLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgb3IgYXQgeW91cgorICogb3B0aW9uLCBhbnkgbGF0ZXIgdmVyc2lvbiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSAiYXV0b2ZzX2kuaCIKKworLyogRnVuY3Rpb25zIGZvciBtYWludGVuYW5jZSBvZiBleHBpcnkgcXVldWUgKi8KKworc3RhdGljIHZvaWQgYXV0b2ZzX2luaXRfdXNhZ2Uoc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaCwKKwkJCSAgICAgIHN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZW50KQoreworCWxpc3RfYWRkX3RhaWwoJmVudC0+ZXhwLCAmZGgtPmV4cGlyeV9oZWFkKTsKKwllbnQtPmxhc3RfdXNhZ2UgPSBqaWZmaWVzOworfQorCitzdGF0aWMgdm9pZCBhdXRvZnNfZGVsZXRlX3VzYWdlKHN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZW50KQoreworCWxpc3RfZGVsKCZlbnQtPmV4cCk7Cit9CisKK3ZvaWQgYXV0b2ZzX3VwZGF0ZV91c2FnZShzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggKmRoLAorCQkJIHN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZW50KQoreworCWF1dG9mc19kZWxldGVfdXNhZ2UoZW50KTsgICAvKiBVbmxpbmsgZnJvbSBjdXJyZW50IHBvc2l0aW9uICovCisJYXV0b2ZzX2luaXRfdXNhZ2UoZGgsZW50KTsgIC8qIFJlbGluayBhdCBxdWV1ZSB0YWlsICovCit9CisKK3N0cnVjdCBhdXRvZnNfZGlyX2VudCAqYXV0b2ZzX2V4cGlyZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksCisJCQkJICAgICBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggKmRoID0gJnNiaS0+ZGlyaGFzaDsKKwlzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmVudDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gc2JpLT5leHBfdGltZW91dDsKKworCXdoaWxlICgxKSB7CisJCWlmICggbGlzdF9lbXB0eSgmZGgtPmV4cGlyeV9oZWFkKSB8fCBzYmktPmNhdGF0b25pYyApCisJCQlyZXR1cm4gTlVMTDsJLyogTm8gZW50cmllcyAqLworCQkvKiBXZSBrZWVwIHRoZSBsaXN0IHNvcnRlZCBieSBsYXN0X3VzYWdlIGFuZCB3YW50IG9sZCBzdHVmZiAqLworCQllbnQgPSBsaXN0X2VudHJ5KGRoLT5leHBpcnlfaGVhZC5uZXh0LCBzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQsIGV4cCk7CisJCWlmIChqaWZmaWVzIC0gZW50LT5sYXN0X3VzYWdlIDwgdGltZW91dCkKKwkJCWJyZWFrOworCQkvKiBNb3ZlIHRvIGVuZCBvZiBsaXN0IGluIGNhc2UgZXhwaXJ5IGlzbid0IGRlc2lyYWJsZSAqLworCQlhdXRvZnNfdXBkYXRlX3VzYWdlKGRoLCBlbnQpOworCisJCS8qIENoZWNrIHRvIHNlZSB0aGF0IGVudHJ5IGlzIGV4cGlyYWJsZSAqLworCQlpZiAoIGVudC0+aW5vIDwgQVVUT0ZTX0ZJUlNUX0RJUl9JTk8gKQorCQkJcmV0dXJuIGVudDsgLyogU3ltbGlua3MgYXJlIGFsd2F5cyBleHBpcmFibGUgKi8KKworCQkvKiBHZXQgdGhlIGRlbnRyeSBmb3IgdGhlIGF1dG9mcyBzdWJkaXJlY3RvcnkgKi8KKwkJZGVudHJ5ID0gZW50LT5kZW50cnk7CisKKwkJaWYgKCAhZGVudHJ5ICkgeworCQkJLyogU2hvdWxkIG9ubHkgaGFwcGVuIGluIGNhdGF0b25pYyBtb2RlICovCisJCQlwcmludGsoImF1dG9mczogZGVudHJ5ID09IE5VTEwgYnV0IGlub2RlIHJhbmdlIGlzIGRpcmVjdG9yeSwgZW50cnkgJXNcbiIsIGVudC0+bmFtZSk7CisJCQlhdXRvZnNfZGVsZXRlX3VzYWdlKGVudCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICggIWRlbnRyeS0+ZF9pbm9kZSApIHsKKwkJCWRwdXQoZGVudHJ5KTsKKwkJCXByaW50aygiYXV0b2ZzOiBuZWdhdGl2ZSBkZW50cnkgb24gZXhwaXJ5IHF1ZXVlOiAlc1xuIiwKKwkJCSAgICAgICBlbnQtPm5hbWUpOworCQkJYXV0b2ZzX2RlbGV0ZV91c2FnZShlbnQpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBNYWtlIHN1cmUgZW50cnkgaXMgbW91bnRlZCBhbmQgdW51c2VkOyBub3RlIHRoYXQgZGVudHJ5IHdpbGwKKwkJICAgcG9pbnQgdG8gdGhlIG1vdW50ZWQtb24tdG9wIHJvb3QuICovCisJCWlmICghU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSl8fCFkX21vdW50cG9pbnQoZGVudHJ5KSkgeworCQkJRFBSSU5USygoImF1dG9mczogbm90IGV4cGlyYWJsZSAobm90IGEgbW91bnRlZCBkaXJlY3RvcnkpOiAlc1xuIiwgZW50LT5uYW1lKSk7CisJCQljb250aW51ZTsKKwkJfQorCQltbnRnZXQobW50KTsKKwkJZGdldChkZW50cnkpOworCQlpZiAoIWZvbGxvd19kb3duKCZtbnQsICZkZW50cnkpKSB7CisJCQlkcHV0KGRlbnRyeSk7CisJCQltbnRwdXQobW50KTsKKwkJCURQUklOVEsoKCJhdXRvZnM6IG5vdCBleHBpcmFibGUgKG5vdCBhIG1vdW50ZWQgZGlyZWN0b3J5KTogJXNcbiIsIGVudC0+bmFtZSkpOworCQkJY29udGludWU7CisJCX0KKwkJd2hpbGUgKGRfbW91bnRwb2ludChkZW50cnkpICYmIGZvbGxvd19kb3duKCZtbnQsICZkZW50cnkpKQorCQkJOworCQlkcHV0KGRlbnRyeSk7CisKKwkJaWYgKCBtYXlfdW1vdW50KG1udCkgPT0gMCApIHsKKwkJCW1udHB1dChtbnQpOworCQkJRFBSSU5USygoImF1dG9mczogc2lnbmFsaW5nIGV4cGlyZSBvbiAlc1xuIiwgZW50LT5uYW1lKSk7CisJCQlyZXR1cm4gZW50OyAvKiBFeHBpcmFibGUhICovCisJCX0KKwkJRFBSSU5USygoImF1dG9mczogZGlkbid0IGV4cGlyZSBkdWUgdG8gbWF5X3Vtb3VudDogJXNcbiIsIGVudC0+bmFtZSkpOworCQltbnRwdXQobW50KTsKKwl9CisJcmV0dXJuIE5VTEw7CQkvKiBObyBleHBpcmFibGUgZW50cmllcyAqLworfQorCit2b2lkIGF1dG9mc19pbml0aWFsaXplX2hhc2goc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaCkgeworCW1lbXNldCgmZGgtPmgsIDAsIEFVVE9GU19IQVNIX1NJWkUqc2l6ZW9mKHN0cnVjdCBhdXRvZnNfZGlyX2VudCAqKSk7CisJSU5JVF9MSVNUX0hFQUQoJmRoLT5leHBpcnlfaGVhZCk7Cit9CisKK3N0cnVjdCBhdXRvZnNfZGlyX2VudCAqYXV0b2ZzX2hhc2hfbG9va3VwKGNvbnN0IHN0cnVjdCBhdXRvZnNfZGlyaGFzaCAqZGgsIHN0cnVjdCBxc3RyICpuYW1lKQoreworCXN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZGhuOworCisJRFBSSU5USygoImF1dG9mc19oYXNoX2xvb2t1cDogaGFzaCA9IDB4JTA4eCwgbmFtZSA9ICIsIG5hbWUtPmhhc2gpKTsKKwlhdXRvZnNfc2F5KG5hbWUtPm5hbWUsbmFtZS0+bGVuKTsKKworCWZvciAoIGRobiA9IGRoLT5oWyh1bnNpZ25lZCkgbmFtZS0+aGFzaCAlIEFVVE9GU19IQVNIX1NJWkVdIDsgZGhuIDsgZGhuID0gZGhuLT5uZXh0ICkgeworCQlpZiAoIG5hbWUtPmhhc2ggPT0gZGhuLT5oYXNoICYmCisJCSAgICAgbmFtZS0+bGVuID09IGRobi0+bGVuICYmCisJCSAgICAgIW1lbWNtcChuYW1lLT5uYW1lLCBkaG4tPm5hbWUsIG5hbWUtPmxlbikgKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGRobjsKK30KKwordm9pZCBhdXRvZnNfaGFzaF9pbnNlcnQoc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaCwgc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQpCit7CisJc3RydWN0IGF1dG9mc19kaXJfZW50ICoqZGhucDsKKworCURQUklOVEsoKCJhdXRvZnNfaGFzaF9pbnNlcnQ6IGhhc2ggPSAweCUwOHgsIG5hbWUgPSAiLCBlbnQtPmhhc2gpKTsKKwlhdXRvZnNfc2F5KGVudC0+bmFtZSxlbnQtPmxlbik7CisKKwlhdXRvZnNfaW5pdF91c2FnZShkaCxlbnQpOworCWlmIChlbnQtPmRlbnRyeSkKKwkJZGdldChlbnQtPmRlbnRyeSk7CisKKwlkaG5wID0gJmRoLT5oWyh1bnNpZ25lZCkgZW50LT5oYXNoICUgQVVUT0ZTX0hBU0hfU0laRV07CisJZW50LT5uZXh0ID0gKmRobnA7CisJZW50LT5iYWNrID0gZGhucDsKKwkqZGhucCA9IGVudDsKKwlpZiAoIGVudC0+bmV4dCApCisJCWVudC0+bmV4dC0+YmFjayA9ICYoZW50LT5uZXh0KTsKK30KKwordm9pZCBhdXRvZnNfaGFzaF9kZWxldGUoc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQpCit7CisJKihlbnQtPmJhY2spID0gZW50LT5uZXh0OworCWlmICggZW50LT5uZXh0ICkKKwkJZW50LT5uZXh0LT5iYWNrID0gZW50LT5iYWNrOworCisJYXV0b2ZzX2RlbGV0ZV91c2FnZShlbnQpOworCisJaWYgKCBlbnQtPmRlbnRyeSApCisJCWRwdXQoZW50LT5kZW50cnkpOworCWtmcmVlKGVudC0+bmFtZSk7CisJa2ZyZWUoZW50KTsKK30KKworLyoKKyAqIFVzZWQgYnkgcmVhZGRpcigpLiAgV2UgbXVzdCB2YWxpZGF0ZSAicHRyIiwgc28gd2UgY2FuJ3Qgc2ltcGx5IG1ha2UgaXQKKyAqIGEgcG9pbnRlci4gIFZhbHVlcyBiZWxvdyAweGZmZmYgYXJlIHJlc2VydmVkOyBjYWxsaW5nIHdpdGggYW55IHZhbHVlCisgKiA8PSAweDEwMDAwIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCBlbnRyeSBmb3VuZC4KKyAqCisgKiAibGFzdCIgY2FuIGJlIE5VTEwgb3IgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBsYXN0IHNlYXJjaCAqaWYqIHdlCisgKiB3YW50IHRoZSBuZXh0IHNlcXVlbnRpYWwgZW50cnkuCisgKi8KK3N0cnVjdCBhdXRvZnNfZGlyX2VudCAqYXV0b2ZzX2hhc2hfZW51bShjb25zdCBzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggKmRoLAorCQkJCQlvZmZfdCAqcHRyLCBzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmxhc3QpCit7CisJaW50IGJ1Y2tldCwgZWNvdW50LCBpOworCXN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZW50OworCisJYnVja2V0ID0gKCpwdHIgPj4gMTYpIC0gMTsKKwllY291bnQgPSAqcHRyICYgMHhmZmZmOworCisJaWYgKCBidWNrZXQgPCAwICkgeworCQlidWNrZXQgPSBlY291bnQgPSAwOworCX0gCisKKwlEUFJJTlRLKCgiYXV0b2ZzX2hhc2hfZW51bTogYnVja2V0ICVkLCBlbnRyeSAlZFxuIiwgYnVja2V0LCBlY291bnQpKTsKKworCWVudCA9IGxhc3QgPyBsYXN0LT5uZXh0IDogTlVMTDsKKworCWlmICggZW50ICkgeworCQllY291bnQrKzsKKwl9IGVsc2UgeworCQl3aGlsZSAgKCBidWNrZXQgPCBBVVRPRlNfSEFTSF9TSVpFICkgeworCQkJZW50ID0gZGgtPmhbYnVja2V0XTsKKwkJCWZvciAoIGkgPSBlY291bnQgOyBlbnQgJiYgaSA7IGktLSApCisJCQkJZW50ID0gZW50LT5uZXh0OworCQkJCisJCQlpZiAoZW50KSB7CisJCQkJZWNvdW50Kys7IC8qIFBvaW50IHRvICpuZXh0KiBlbnRyeSAqLworCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQlidWNrZXQrKzsgZWNvdW50ID0gMDsKKwkJfQorCX0KKworI2lmZGVmIERFQlVHCisJaWYgKCAhZW50ICkKKwkJcHJpbnRrKCJhdXRvZnNfaGFzaF9lbnVtOiBub3RoaW5nIGZvdW5kXG4iKTsKKwllbHNlIHsKKwkJcHJpbnRrKCJhdXRvZnNfaGFzaF9lbnVtOiBmb3VuZCBoYXNoICUwOHgsIG5hbWUiLCBlbnQtPmhhc2gpOworCQlhdXRvZnNfc2F5KGVudC0+bmFtZSxlbnQtPmxlbik7CisJfQorI2VuZGlmCisKKwkqcHRyID0gKChidWNrZXQrMSkgPDwgMTYpICsgZWNvdW50OworCXJldHVybiBlbnQ7Cit9CisKKy8qIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGVudHMsIGFuZCByZW1vdmUgYWxsIGRlbnRyeSBwb2ludGVycy4gIFVzZWQgb24KKyAgIGVudGVyaW5nIGNhdGF0b25pYyBtb2RlLCBpbiBvcmRlciB0byBtYWtlIHRoZSBmaWxlc3lzdGVtIHVubW91bnRhYmxlLiAqLwordm9pZCBhdXRvZnNfaGFzaF9kcHV0YWxsKHN0cnVjdCBhdXRvZnNfZGlyaGFzaCAqZGgpCit7CisJaW50IGk7CisJc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQ7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBBVVRPRlNfSEFTSF9TSVpFIDsgaSsrICkgeworCQlmb3IgKCBlbnQgPSBkaC0+aFtpXSA7IGVudCA7IGVudCA9IGVudC0+bmV4dCApIHsKKwkJCWlmICggZW50LT5kZW50cnkgKSB7CisJCQkJZHB1dChlbnQtPmRlbnRyeSk7CisJCQkJZW50LT5kZW50cnkgPSBOVUxMOworCQkJfQorCQl9CisJfQorfQorCisvKiBEZWxldGUgZXZlcnl0aGluZy4gIFRoaXMgaXMgdXNlZCBvbiBmaWxlc3lzdGVtIGRlc3RydWN0aW9uLCBzbyB3ZQorICAgbWFrZSBubyBhdHRlbXB0IHRvIGtlZXAgdGhlIHBvaW50ZXJzIHZhbGlkICovCit2b2lkIGF1dG9mc19oYXNoX251a2Uoc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmVudCwgKm5lbnQ7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBBVVRPRlNfSEFTSF9TSVpFIDsgaSsrICkgeworCQlmb3IgKCBlbnQgPSBkaC0+aFtpXSA7IGVudCA7IGVudCA9IG5lbnQgKSB7CisJCQluZW50ID0gZW50LT5uZXh0OworCQkJaWYgKCBlbnQtPmRlbnRyeSApCisJCQkJZHB1dChlbnQtPmRlbnRyeSk7CisJCQlrZnJlZShlbnQtPm5hbWUpOworCQkJa2ZyZWUoZW50KTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2ZzL2F1dG9mcy9pbml0LmMgYi9mcy9hdXRvZnMvaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NzdlY2UKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hdXRvZnMvaW5pdC5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qIC0qLSBsaW51eC1jIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqIGxpbnV4L2ZzL2F1dG9mcy9pbml0LmMKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTctMTk5OCBUcmFuc21ldGEgQ29ycG9yYXRpb24gLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlICJhdXRvZnNfaS5oIgorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICphdXRvZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgZGF0YSwgYXV0b2ZzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYXV0b2ZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJhdXRvZnMiLAorCS5nZXRfc2IJCT0gYXV0b2ZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYW5vbl9zdXBlciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYXV0b2ZzX2ZzKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmF1dG9mc19mc190eXBlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfYXV0b2ZzX2ZzKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZhdXRvZnNfZnNfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfYXV0b2ZzX2ZzKTsKK21vZHVsZV9leGl0KGV4aXRfYXV0b2ZzX2ZzKTsKKworI2lmZGVmIERFQlVHCit2b2lkIGF1dG9mc19zYXkoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKK3sKKwlwcmludGsoIiglZDogIiwgbGVuKTsKKwl3aGlsZSAoIGxlbi0tICkKKwkJcHJpbnRrKCIlYyIsICpuYW1lKyspOworCXByaW50aygiKVxuIik7Cit9CisjZW5kaWYKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mcy9pbm9kZS5jIGIvZnMvYXV0b2ZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg4OGMxZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2F1dG9mcy9pbm9kZS5jCkBAIC0wLDAgKzEsMjUwIEBACisvKiAtKi0gbGludXgtYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiBsaW51eC9mcy9hdXRvZnMvaW5vZGUuYworICoKKyAqICBDb3B5cmlnaHQgMTk5Ny0xOTk4IFRyYW5zbWV0YSBDb3Jwb3JhdGlvbiAtLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgb3IgYXQgeW91cgorICogb3B0aW9uLCBhbnkgbGF0ZXIgdmVyc2lvbiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgImF1dG9mc19pLmgiCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKK3N0YXRpYyB2b2lkIGF1dG9mc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSA9IGF1dG9mc19zYmkoc2IpOworCXVuc2lnbmVkIGludCBuOworCisJaWYgKCAhc2JpLT5jYXRhdG9uaWMgKQorCQlhdXRvZnNfY2F0YXRvbmljX21vZGUoc2JpKTsgLyogRnJlZSB3YWl0IHF1ZXVlcywgY2xvc2UgcGlwZSAqLworCisJYXV0b2ZzX2hhc2hfbnVrZSgmc2JpLT5kaXJoYXNoKTsKKwlmb3IgKCBuID0gMCA7IG4gPCBBVVRPRlNfTUFYX1NZTUxJTktTIDsgbisrICkgeworCQlpZiAoIHRlc3RfYml0KG4sIHNiaS0+c3ltbGlua19iaXRtYXApICkKKwkJCWtmcmVlKHNiaS0+c3ltbGlua1tuXS5kYXRhKTsKKwl9CisKKwlrZnJlZShzYi0+c19mc19pbmZvKTsKKworCURQUklOVEsoKCJhdXRvZnM6IHNodXR0aW5nIGRvd25cbiIpKTsKK30KKworc3RhdGljIHZvaWQgYXV0b2ZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBhdXRvZnNfc29wcyA9IHsKKwkucmVhZF9pbm9kZQk9IGF1dG9mc19yZWFkX2lub2RlLAorCS5wdXRfc3VwZXIJPSBhdXRvZnNfcHV0X3N1cGVyLAorCS5zdGF0ZnMJCT0gc2ltcGxlX3N0YXRmcywKK307CisKK2VudW0ge09wdF9lcnIsIE9wdF9mZCwgT3B0X3VpZCwgT3B0X2dpZCwgT3B0X3BncnAsIE9wdF9taW5wcm90bywgT3B0X21heHByb3RvfTsKKworc3RhdGljIG1hdGNoX3RhYmxlX3QgYXV0b2ZzX3Rva2VucyA9IHsKKwl7T3B0X2ZkLCAiZmQ9JXUifSwKKwl7T3B0X3VpZCwgInVpZD0ldSJ9LAorCXtPcHRfZ2lkLCAiZ2lkPSV1In0sCisJe09wdF9wZ3JwLCAicGdycD0ldSJ9LAorCXtPcHRfbWlucHJvdG8sICJtaW5wcm90bz0ldSJ9LAorCXtPcHRfbWF4cHJvdG8sICJtYXhwcm90bz0ldSJ9LAorCXtPcHRfZXJyLCBOVUxMfQorfTsKKworc3RhdGljIGludCBwYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIGludCAqcGlwZWZkLCB1aWRfdCAqdWlkLCBnaWRfdCAqZ2lkLCBwaWRfdCAqcGdycCwgaW50ICptaW5wcm90bywgaW50ICptYXhwcm90bykKK3sKKwljaGFyICpwOworCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKKwlpbnQgb3B0aW9uOworCisJKnVpZCA9IGN1cnJlbnQtPnVpZDsKKwkqZ2lkID0gY3VycmVudC0+Z2lkOworCSpwZ3JwID0gcHJvY2Vzc19ncm91cChjdXJyZW50KTsKKworCSptaW5wcm90byA9ICptYXhwcm90byA9IEFVVE9GU19QUk9UT19WRVJTSU9OOworCisJKnBpcGVmZCA9IC0xOworCisJaWYgKCFvcHRpb25zKQorCQlyZXR1cm4gMTsKKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpbnQgdG9rZW47CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIGF1dG9mc190b2tlbnMsIGFyZ3MpOworCQlzd2l0Y2ggKHRva2VuKSB7CisJCWNhc2UgT3B0X2ZkOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCisJCQkJcmV0dXJuIDE7CisJCQkqcGlwZWZkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3VpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAxOworCQkJKnVpZCA9IG9wdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9naWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMTsKKwkJCSpnaWQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfcGdycDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAxOworCQkJKnBncnAgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbWlucHJvdG86CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMTsKKwkJCSptaW5wcm90byA9IG9wdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9tYXhwcm90bzoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAxOworCQkJKm1heHByb3RvID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gKCpwaXBlZmQgPCAwKTsKK30KKworaW50IGF1dG9mc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiByb290X2lub2RlOworCXN0cnVjdCBkZW50cnkgKiByb290OworCXN0cnVjdCBmaWxlICogcGlwZTsKKwlpbnQgcGlwZWZkOworCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpOworCWludCBtaW5wcm90bywgbWF4cHJvdG87CisKKwlzYmkgPSBrbWFsbG9jKHNpemVvZigqc2JpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCAhc2JpICkKKwkJZ290byBmYWlsX3VubG9jazsKKwltZW1zZXQoc2JpLCAwLCBzaXplb2YoKnNiaSkpOworCURQUklOVEsoKCJhdXRvZnM6IHN0YXJ0aW5nIHVwLCBzYmkgPSAlcFxuIixzYmkpKTsKKworCXMtPnNfZnNfaW5mbyA9IHNiaTsKKwlzYmktPm1hZ2ljID0gQVVUT0ZTX1NCSV9NQUdJQzsKKwlzYmktPmNhdGF0b25pYyA9IDA7CisJc2JpLT5leHBfdGltZW91dCA9IDA7CisJc2JpLT5vel9wZ3JwID0gcHJvY2Vzc19ncm91cChjdXJyZW50KTsKKwlhdXRvZnNfaW5pdGlhbGl6ZV9oYXNoKCZzYmktPmRpcmhhc2gpOworCXNiaS0+cXVldWVzID0gTlVMTDsKKwltZW1zZXQoc2JpLT5zeW1saW5rX2JpdG1hcCwgMCwgc2l6ZW9mKGxvbmcpKkFVVE9GU19TWU1MSU5LX0JJVE1BUF9MRU4pOworCXNiaS0+bmV4dF9kaXJfaW5vID0gQVVUT0ZTX0ZJUlNUX0RJUl9JTk87CisJcy0+c19ibG9ja3NpemUgPSAxMDI0OworCXMtPnNfYmxvY2tzaXplX2JpdHMgPSAxMDsKKwlzLT5zX21hZ2ljID0gQVVUT0ZTX1NVUEVSX01BR0lDOworCXMtPnNfb3AgPSAmYXV0b2ZzX3NvcHM7CisJcy0+c190aW1lX2dyYW4gPSAxOworCisJcm9vdF9pbm9kZSA9IGlnZXQocywgQVVUT0ZTX1JPT1RfSU5PKTsKKwlyb290ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOworCXBpcGUgPSBOVUxMOworCisJaWYgKCFyb290KQorCQlnb3RvIGZhaWxfaXB1dDsKKworCS8qIENhbiB0aGlzIGNhbGwgYmxvY2s/ICAtIFdURiBjYXJlcz8gcyBpcyBsb2NrZWQuICovCisJaWYgKCBwYXJzZV9vcHRpb25zKGRhdGEsJnBpcGVmZCwmcm9vdF9pbm9kZS0+aV91aWQsJnJvb3RfaW5vZGUtPmlfZ2lkLCZzYmktPm96X3BncnAsJm1pbnByb3RvLCZtYXhwcm90bykgKSB7CisJCXByaW50aygiYXV0b2ZzOiBjYWxsZWQgd2l0aCBib2d1cyBvcHRpb25zXG4iKTsKKwkJZ290byBmYWlsX2RwdXQ7CisJfQorCisJLyogQ291bGRuJ3QgdGhpcyBiZSB0ZXN0ZWQgZWFybGllcj8gKi8KKwlpZiAoIG1pbnByb3RvID4gQVVUT0ZTX1BST1RPX1ZFUlNJT04gfHwgCisJICAgICBtYXhwcm90byA8IEFVVE9GU19QUk9UT19WRVJTSU9OICkgeworCQlwcmludGsoImF1dG9mczoga2VybmVsIGRvZXMgbm90IG1hdGNoIGRhZW1vbiB2ZXJzaW9uXG4iKTsKKwkJZ290byBmYWlsX2RwdXQ7CisJfQorCisJRFBSSU5USygoImF1dG9mczogcGlwZSBmZCA9ICVkLCBwZ3JwID0gJXVcbiIsIHBpcGVmZCwgc2JpLT5vel9wZ3JwKSk7CisJcGlwZSA9IGZnZXQocGlwZWZkKTsKKwkKKwlpZiAoICFwaXBlICkgeworCQlwcmludGsoImF1dG9mczogY291bGQgbm90IG9wZW4gcGlwZSBmaWxlIGRlc2NyaXB0b3JcbiIpOworCQlnb3RvIGZhaWxfZHB1dDsKKwl9CisJaWYgKCAhcGlwZS0+Zl9vcCB8fCAhcGlwZS0+Zl9vcC0+d3JpdGUgKQorCQlnb3RvIGZhaWxfZnB1dDsKKwlzYmktPnBpcGUgPSBwaXBlOworCisJLyoKKwkgKiBTdWNjZXNzISBJbnN0YWxsIHRoZSByb290IGRlbnRyeSBub3cgdG8gaW5kaWNhdGUgY29tcGxldGlvbi4KKwkgKi8KKwlzLT5zX3Jvb3QgPSByb290OworCXJldHVybiAwOworCitmYWlsX2ZwdXQ6CisJcHJpbnRrKCJhdXRvZnM6IHBpcGUgZmlsZSBkZXNjcmlwdG9yIGRvZXMgbm90IGNvbnRhaW4gcHJvcGVyIG9wc1xuIik7CisJZnB1dChwaXBlKTsKK2ZhaWxfZHB1dDoKKwlkcHV0KHJvb3QpOworCWdvdG8gZmFpbF9mcmVlOworZmFpbF9pcHV0OgorCXByaW50aygiYXV0b2ZzOiBnZXQgcm9vdCBkZW50cnkgZmFpbGVkXG4iKTsKKwlpcHV0KHJvb3RfaW5vZGUpOworZmFpbF9mcmVlOgorCWtmcmVlKHNiaSk7CitmYWlsX3VubG9jazoKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgYXV0b2ZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbm9fdCBpbm8gPSBpbm9kZS0+aV9pbm87CisJdW5zaWduZWQgaW50IG47CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnNfc2JpKGlub2RlLT5pX3NiKTsKKworCS8qIEluaXRpYWxpemUgdG8gdGhlIGRlZmF1bHQgY2FzZSAoc3R1YiBkaXJlY3RvcnkpICovCisKKwlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPOworCWlub2RlLT5pX25saW5rID0gMjsKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwlpbm9kZS0+aV9ibGtzaXplID0gMTAyNDsKKworCWlmICggaW5vID09IEFVVE9GU19ST09UX0lOTyApIHsKKwkJaW5vZGUtPmlfbW9kZSA9IFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTyB8IFNfSVdVU1I7CisJCWlub2RlLT5pX29wID0gJmF1dG9mc19yb290X2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZhdXRvZnNfcm9vdF9vcGVyYXRpb25zOworCQlpbm9kZS0+aV91aWQgPSBpbm9kZS0+aV9naWQgPSAwOyAvKiBDaGFuZ2VkIGluIHJlYWRfc3VwZXIgKi8KKwkJcmV0dXJuOworCX0gCisJCisJaW5vZGUtPmlfdWlkID0gaW5vZGUtPmlfc2ItPnNfcm9vdC0+ZF9pbm9kZS0+aV91aWQ7CisJaW5vZGUtPmlfZ2lkID0gaW5vZGUtPmlfc2ItPnNfcm9vdC0+ZF9pbm9kZS0+aV9naWQ7CisJCisJaWYgKCBpbm8gPj0gQVVUT0ZTX0ZJUlNUX1NZTUxJTksgJiYgaW5vIDwgQVVUT0ZTX0ZJUlNUX0RJUl9JTk8gKSB7CisJCS8qIFN5bWxpbmsgaW5vZGUgLSBzaG91bGQgYmUgaW4gc3ltbGluayBsaXN0ICovCisJCXN0cnVjdCBhdXRvZnNfc3ltbGluayAqc2w7CisKKwkJbiA9IGlubyAtIEFVVE9GU19GSVJTVF9TWU1MSU5LOworCQlpZiAoIG4gPj0gQVVUT0ZTX01BWF9TWU1MSU5LUyB8fCAhdGVzdF9iaXQobixzYmktPnN5bWxpbmtfYml0bWFwKSkgeworCQkJcHJpbnRrKCJhdXRvZnM6IExvb2tpbmcgZm9yIGJhZCBzeW1saW5rIGlub2RlICV1XG4iLCAodW5zaWduZWQgaW50KSBpbm8pOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpbm9kZS0+aV9vcCA9ICZhdXRvZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQlzbCA9ICZzYmktPnN5bWxpbmtbbl07CisJCWlub2RlLT51LmdlbmVyaWNfaXAgPSBzbDsKKwkJaW5vZGUtPmlfbW9kZSA9IFNfSUZMTksgfCBTX0lSV1hVR087CisJCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IHNsLT5tdGltZTsKKwkJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IGlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOworCQlpbm9kZS0+aV9zaXplID0gc2wtPmxlbjsKKwkJaW5vZGUtPmlfbmxpbmsgPSAxOworCX0KK30KZGlmZiAtLWdpdCBhL2ZzL2F1dG9mcy9yb290LmMgYi9mcy9hdXRvZnMvcm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYWIxYzAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hdXRvZnMvcm9vdC5jCkBAIC0wLDAgKzEsNTY0IEBACisvKiAtKi0gbGludXgtYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiBsaW51eC9mcy9hdXRvZnMvcm9vdC5jCisgKgorICogIENvcHlyaWdodCAxOTk3LTE5OTggVHJhbnNtZXRhIENvcnBvcmF0aW9uIC0tIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgImF1dG9mc19pLmgiCisKK3N0YXRpYyBpbnQgYXV0b2ZzX3Jvb3RfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLHZvaWQgKixmaWxsZGlyX3QpOworc3RhdGljIHN0cnVjdCBkZW50cnkgKmF1dG9mc19yb290X2xvb2t1cChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBuYW1laWRhdGEgKik7CitzdGF0aWMgaW50IGF1dG9mc19yb290X3N5bWxpbmsoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqLGNvbnN0IGNoYXIgKik7CitzdGF0aWMgaW50IGF1dG9mc19yb290X3VubGluayhzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICopOworc3RhdGljIGludCBhdXRvZnNfcm9vdF9ybWRpcihzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICopOworc3RhdGljIGludCBhdXRvZnNfcm9vdF9ta2RpcihzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosaW50KTsKK3N0YXRpYyBpbnQgYXV0b2ZzX3Jvb3RfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosdW5zaWduZWQgaW50LHVuc2lnbmVkIGxvbmcpOworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1dG9mc19yb290X29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IGF1dG9mc19yb290X3JlYWRkaXIsCisJLmlvY3RsCQk9IGF1dG9mc19yb290X2lvY3RsLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYXV0b2ZzX3Jvb3RfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKyAgICAgICAgLmxvb2t1cAkJPSBhdXRvZnNfcm9vdF9sb29rdXAsCisgICAgICAgIC51bmxpbmsJCT0gYXV0b2ZzX3Jvb3RfdW5saW5rLAorICAgICAgICAuc3ltbGluawk9IGF1dG9mc19yb290X3N5bWxpbmssCisgICAgICAgIC5ta2RpcgkJPSBhdXRvZnNfcm9vdF9ta2RpciwKKyAgICAgICAgLnJtZGlyCQk9IGF1dG9mc19yb290X3JtZGlyLAorfTsKKworc3RhdGljIGludCBhdXRvZnNfcm9vdF9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZW50ID0gTlVMTDsKKwlzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggKmRpcmhhc2g7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmk7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlvZmZfdCBvbnIsIG5yOworCisJbG9ja19rZXJuZWwoKTsKKworCXNiaSA9IGF1dG9mc19zYmkoaW5vZGUtPmlfc2IpOworCWRpcmhhc2ggPSAmc2JpLT5kaXJoYXNoOworCW5yID0gZmlscC0+Zl9wb3M7CisKKwlzd2l0Y2gobnIpCisJeworCWNhc2UgMDoKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIG5yLCBpbm9kZS0+aV9pbm8sIERUX0RJUikgPCAwKQorCQkJZ290byBvdXQ7CisJCWZpbHAtPmZfcG9zID0gKytucjsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAxOgorCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIG5yLCBpbm9kZS0+aV9pbm8sIERUX0RJUikgPCAwKQorCQkJZ290byBvdXQ7CisJCWZpbHAtPmZfcG9zID0gKytucjsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJd2hpbGUgKCBvbnIgPSBuciwgZW50ID0gYXV0b2ZzX2hhc2hfZW51bShkaXJoYXNoLCZucixlbnQpICkgeworCQkJaWYgKCAhZW50LT5kZW50cnkgfHwgZF9tb3VudHBvaW50KGVudC0+ZGVudHJ5KSApIHsKKwkJCQlpZiAoZmlsbGRpcihkaXJlbnQsZW50LT5uYW1lLGVudC0+bGVuLG9ucixlbnQtPmlubyxEVF9VTktOT1dOKSA8IDApCisJCQkJCWdvdG8gb3V0OworCQkJCWZpbHAtPmZfcG9zID0gbnI7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRyeV90b19maWxsX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCXN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZW50OworCWludCBzdGF0dXMgPSAwOworCisJaWYgKCAhKGVudCA9IGF1dG9mc19oYXNoX2xvb2t1cCgmc2JpLT5kaXJoYXNoLCAmZGVudHJ5LT5kX25hbWUpKSApIHsKKwkJZG8geworCQkJaWYgKCBzdGF0dXMgJiYgZGVudHJ5LT5kX2lub2RlICkgeworCQkJCWlmICggc3RhdHVzICE9IC1FTk9FTlQgKQorCQkJCQlwcmludGsoImF1dG9mcyB3YXJuaW5nOiBsb29rdXAgZmFpbHVyZSBvbiBwb3NpdGl2ZSBkZW50cnksIHN0YXR1cyA9ICVkLCBuYW1lID0gJXNcbiIsIHN0YXR1cywgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCQkJcmV0dXJuIDA7IC8qIFRyeSB0byBnZXQgdGhlIGtlcm5lbCB0byBpbnZhbGlkYXRlIHRoaXMgZGVudHJ5ICovCisJCQl9CisKKwkJCS8qIFR1cm4gdGhpcyBpbnRvIGEgcmVhbCBuZWdhdGl2ZSBkZW50cnk/ICovCisJCQlpZiAoc3RhdHVzID09IC1FTk9FTlQpIHsKKwkJCQlkZW50cnktPmRfdGltZSA9IGppZmZpZXMgKyBBVVRPRlNfTkVHQVRJVkVfVElNRU9VVDsKKwkJCQlkZW50cnktPmRfZmxhZ3MgJj0gfkRDQUNIRV9BVVRPRlNfUEVORElORzsKKwkJCQlyZXR1cm4gMTsKKwkJCX0gZWxzZSBpZiAoc3RhdHVzKSB7CisJCQkJLyogUmV0dXJuIGEgbmVnYXRpdmUgZGVudHJ5LCBidXQgbGVhdmUgaXQgInBlbmRpbmciICovCisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlzdGF0dXMgPSBhdXRvZnNfd2FpdChzYmksICZkZW50cnktPmRfbmFtZSk7CisJCX0gd2hpbGUgKCEoZW50ID0gYXV0b2ZzX2hhc2hfbG9va3VwKCZzYmktPmRpcmhhc2gsICZkZW50cnktPmRfbmFtZSkpICk7CisJfQorCisJLyogQWJ1c2UgdGhpcyBmaWVsZCBhcyBhIHBvaW50ZXIgdG8gdGhlIGRpcmVjdG9yeSBlbnRyeSwgdXNlZCB0bworCSAgIGZpbmQgdGhlIGV4cGlyZSBsaXN0IHBvaW50ZXJzICovCisJZGVudHJ5LT5kX3RpbWUgPSAodW5zaWduZWQgbG9uZykgZW50OworCQorCWlmICghZGVudHJ5LT5kX2lub2RlKSB7CisJCWlub2RlID0gaWdldChzYiwgZW50LT5pbm8pOworCQlpZiAoIWlub2RlKSB7CisJCQkvKiBGYWlsZWQsIGJ1dCBsZWF2ZSBwZW5kaW5nIGZvciBuZXh0IHRpbWUgKi8KKwkJCXJldHVybiAxOworCQl9CisJCWRlbnRyeS0+ZF9pbm9kZSA9IGlub2RlOworCX0KKworCS8qIElmIHRoaXMgaXMgYSBkaXJlY3RvcnkgdGhhdCBpc24ndCBhIG1vdW50IHBvaW50LCBiaXRjaCBhdCB0aGUKKwkgICBkYWVtb24gYW5kIGZpeCBpdCBpbiB1c2VyIHNwYWNlICovCisJaWYgKCBTX0lTRElSKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSAmJiAhZF9tb3VudHBvaW50KGRlbnRyeSkgKSB7CisJCXJldHVybiAhYXV0b2ZzX3dhaXQoc2JpLCAmZGVudHJ5LT5kX25hbWUpOworCX0KKworCS8qIFdlIGRvbid0IHVwZGF0ZSB0aGUgdXNhZ2VzIGZvciB0aGUgYXV0b2ZzIGRhZW1vbiBpdHNlbGYsIHRoaXMKKwkgICBpcyBuZWNlc3NhcnkgZm9yIHJlY3Vyc2l2ZSBhdXRvZnMgbW91bnRzICovCisJaWYgKCAhYXV0b2ZzX296X21vZGUoc2JpKSApIHsKKwkJYXV0b2ZzX3VwZGF0ZV91c2FnZSgmc2JpLT5kaXJoYXNoLGVudCk7CisJfQorCisJZGVudHJ5LT5kX2ZsYWdzICY9IH5EQ0FDSEVfQVVUT0ZTX1BFTkRJTkc7CisJcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIFJldmFsaWRhdGUgaXMgY2FsbGVkIG9uIGV2ZXJ5IGNhY2hlIGxvb2t1cC4gIFNvbWUgb2YgdGhvc2UKKyAqIGNhY2hlIGxvb2t1cHMgbWF5IGFjdHVhbGx5IGhhcHBlbiB3aGlsZSB0aGUgZGVudHJ5IGlzIG5vdAorICogeWV0IGNvbXBsZXRlbHkgZmlsbGVkIGluLCBhbmQgcmV2YWxpZGF0ZSBoYXMgdG8gZGVsYXkgc3VjaAorICogbG9va3Vwcy4uCisgKi8KK3N0YXRpYyBpbnQgYXV0b2ZzX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICogZGlyOworCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpOworCXN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZW50OworCWludCByZXM7CisKKwlsb2NrX2tlcm5lbCgpOworCWRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJc2JpID0gYXV0b2ZzX3NiaShkaXItPmlfc2IpOworCisJLyogUGVuZGluZyBkZW50cnkgKi8KKwlpZiAoIGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9BVVRPRlNfUEVORElORyApIHsKKwkJaWYgKGF1dG9mc19vel9tb2RlKHNiaSkpCisJCQlyZXMgPSAxOworCQllbHNlCisJCQlyZXMgPSB0cnlfdG9fZmlsbF9kZW50cnkoZGVudHJ5LCBkaXItPmlfc2IsIHNiaSk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwkvKiBOZWdhdGl2ZSBkZW50cnkuLiBpbnZhbGlkYXRlIGlmICJvbGQiICovCisJaWYgKCFkZW50cnktPmRfaW5vZGUpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gKGRlbnRyeS0+ZF90aW1lIC0gamlmZmllcyA8PSBBVVRPRlNfTkVHQVRJVkVfVElNRU9VVCk7CisJfQorCQkKKwkvKiBDaGVjayBmb3IgYSBub24tbW91bnRwb2ludCBkaXJlY3RvcnkgKi8KKwlpZiAoIFNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpICYmICFkX21vdW50cG9pbnQoZGVudHJ5KSApIHsKKwkJaWYgKGF1dG9mc19vel9tb2RlKHNiaSkpCisJCQlyZXMgPSAxOworCQllbHNlCisJCQlyZXMgPSB0cnlfdG9fZmlsbF9kZW50cnkoZGVudHJ5LCBkaXItPmlfc2IsIHNiaSk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwkvKiBVcGRhdGUgdGhlIHVzYWdlIGxpc3QgKi8KKwlpZiAoICFhdXRvZnNfb3pfbW9kZShzYmkpICkgeworCQllbnQgPSAoc3RydWN0IGF1dG9mc19kaXJfZW50ICopIGRlbnRyeS0+ZF90aW1lOworCQlpZiAoIGVudCApCisJCQlhdXRvZnNfdXBkYXRlX3VzYWdlKCZzYmktPmRpcmhhc2gsZW50KTsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGF1dG9mc19kZW50cnlfb3BlcmF0aW9ucyA9IHsKKwkuZF9yZXZhbGlkYXRlCT0gYXV0b2ZzX3JldmFsaWRhdGUsCit9OworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqYXV0b2ZzX3Jvb3RfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpOworCWludCBvel9tb2RlOworCisJRFBSSU5USygoImF1dG9mc19yb290X2xvb2t1cDogbmFtZSA9ICIpKTsKKwlsb2NrX2tlcm5lbCgpOworCWF1dG9mc19zYXkoZGVudHJ5LT5kX25hbWUubmFtZSxkZW50cnktPmRfbmFtZS5sZW4pOworCisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IE5BTUVfTUFYKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7LyogRmlsZSBuYW1lIHRvbyBsb25nIHRvIGV4aXN0ICovCisJfQorCisJc2JpID0gYXV0b2ZzX3NiaShkaXItPmlfc2IpOworCisJb3pfbW9kZSA9IGF1dG9mc19vel9tb2RlKHNiaSk7CisJRFBSSU5USygoImF1dG9mc19sb29rdXA6IHBpZCA9ICV1LCBwZ3JwID0gJXUsIGNhdGF0b25pYyA9ICVkLCBvel9tb2RlID0gJWRcbiIsCisJCSBjdXJyZW50LT5waWQsIHByb2Nlc3NfZ3JvdXAoY3VycmVudCksIHNiaS0+Y2F0YXRvbmljLCBvel9tb2RlKSk7CisKKwkvKgorCSAqIE1hcmsgdGhlIGRlbnRyeSBpbmNvbXBsZXRlLCBidXQgYWRkIGl0LiBUaGlzIGlzIG5lZWRlZCBzbworCSAqIHRoYXQgdGhlIFZGUyBsYXllciBrbm93cyBhYm91dCB0aGUgZGVudHJ5LCBhbmQgd2UgY2FuIGNvdW50CisJICogb24gY2F0Y2hpbmcgYW55IGxvb2t1cHMgdGhyb3VnaCB0aGUgcmV2YWxpZGF0ZS4KKwkgKgorCSAqIExldCBhbGwgdGhlIGhhcmQgd29yayBiZSBkb25lIGJ5IHRoZSByZXZhbGlkYXRlIGZ1bmN0aW9uIHRoYXQKKwkgKiBuZWVkcyB0byBiZSBhYmxlIHRvIGRvIHRoaXMgYW55d2F5Li4KKwkgKgorCSAqIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWZvcmUgd2UgcmVsZWFzZSB0aGUgZGlyZWN0b3J5IHNlbWFwaG9yZS4KKwkgKi8KKwlkZW50cnktPmRfb3AgPSAmYXV0b2ZzX2RlbnRyeV9vcGVyYXRpb25zOworCWRlbnRyeS0+ZF9mbGFncyB8PSBEQ0FDSEVfQVVUT0ZTX1BFTkRJTkc7CisJZF9hZGQoZGVudHJ5LCBOVUxMKTsKKworCXVwKCZkaXItPmlfc2VtKTsKKwlhdXRvZnNfcmV2YWxpZGF0ZShkZW50cnksIG5kKTsKKwlkb3duKCZkaXItPmlfc2VtKTsKKworCS8qCisJICogSWYgd2UgYXJlIHN0aWxsIHBlbmRpbmcsIGNoZWNrIGlmIHdlIGhhZCB0byBoYW5kbGUKKwkgKiBhIHNpZ25hbC4gSWYgc28gd2UgY2FuIGZvcmNlIGEgcmVzdGFydC4uCisJICovCisJaWYgKGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9BVVRPRlNfUEVORElORykgeworCQkvKiBTZWUgaWYgd2Ugd2VyZSBpbnRlcnJ1cHRlZCAqLworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXNpZ3NldF90ICpzaWdzZXQgPSAmY3VycmVudC0+cGVuZGluZy5zaWduYWw7CisJCQlpZiAoc2lnaXNtZW1iZXIgKHNpZ3NldCwgU0lHS0lMTCkgfHwKKwkJCSAgICBzaWdpc21lbWJlciAoc2lnc2V0LCBTSUdRVUlUKSB8fAorCQkJICAgIHNpZ2lzbWVtYmVyIChzaWdzZXQsIFNJR0lOVCkpIHsKKwkJCQl1bmxvY2tfa2VybmVsKCk7CisJCQkJcmV0dXJuIEVSUl9QVFIoLUVSRVNUQVJUTk9JTlRSKTsKKwkJCX0KKwkJfQorCX0KKwl1bmxvY2tfa2VybmVsKCk7CisKKwkvKgorCSAqIElmIHRoaXMgZGVudHJ5IGlzIHVuaGFzaGVkLCB0aGVuIHdlIHNob3VsZG4ndCBob25vdXIgdGhpcworCSAqIGxvb2t1cCBldmVuIGlmIHRoZSBkZW50cnkgaXMgcG9zaXRpdmUuICBSZXR1cm5pbmcgRU5PRU5UIGhlcmUKKwkgKiBkb2Vzbid0IGRvIHRoZSByaWdodCB0aGluZyBmb3IgYWxsIHN5c3RlbSBjYWxscywgYnV0IGl0IHNob3VsZAorCSAqIGJlIE9LIGZvciB0aGUgb3BlcmF0aW9ucyB3ZSBwZXJtaXQgZnJvbSBhbiBhdXRvZnMuCisJICovCisJaWYgKCBkZW50cnktPmRfaW5vZGUgJiYgZF91bmhhc2hlZChkZW50cnkpICkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBhdXRvZnNfcm9vdF9zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKnN5bW5hbWUpCit7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnNfc2JpKGRpci0+aV9zYik7CisJc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaCA9ICZzYmktPmRpcmhhc2g7CisJc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQ7CisJdW5zaWduZWQgaW50IG47CisJaW50IHNsc2l6ZTsKKwlzdHJ1Y3QgYXV0b2ZzX3N5bWxpbmsgKnNsOworCisJRFBSSU5USygoImF1dG9mc19yb290X3N5bWxpbms6ICVzIDwtICIsIHN5bW5hbWUpKTsKKwlhdXRvZnNfc2F5KGRlbnRyeS0+ZF9uYW1lLm5hbWUsZGVudHJ5LT5kX25hbWUubGVuKTsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKCAhYXV0b2ZzX296X21vZGUoc2JpKSApIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwlpZiAoIGF1dG9mc19oYXNoX2xvb2t1cChkaCwgJmRlbnRyeS0+ZF9uYW1lKSApIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwluID0gZmluZF9maXJzdF96ZXJvX2JpdChzYmktPnN5bWxpbmtfYml0bWFwLEFVVE9GU19NQVhfU1lNTElOS1MpOworCWlmICggbiA+PSBBVVRPRlNfTUFYX1NZTUxJTktTICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCXNldF9iaXQobixzYmktPnN5bWxpbmtfYml0bWFwKTsKKwlzbCA9ICZzYmktPnN5bWxpbmtbbl07CisJc2wtPmxlbiA9IHN0cmxlbihzeW1uYW1lKTsKKwlzbC0+ZGF0YSA9IGttYWxsb2Moc2xzaXplID0gc2wtPmxlbisxLCBHRlBfS0VSTkVMKTsKKwlpZiAoICFzbC0+ZGF0YSApIHsKKwkJY2xlYXJfYml0KG4sc2JpLT5zeW1saW5rX2JpdG1hcCk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1dG9mc19kaXJfZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCAhZW50ICkgeworCQlrZnJlZShzbC0+ZGF0YSk7CisJCWNsZWFyX2JpdChuLHNiaS0+c3ltbGlua19iaXRtYXApOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCWVudC0+bmFtZSA9IGttYWxsb2MoZGVudHJ5LT5kX25hbWUubGVuKzEsIEdGUF9LRVJORUwpOworCWlmICggIWVudC0+bmFtZSApIHsKKwkJa2ZyZWUoc2wtPmRhdGEpOworCQlrZnJlZShlbnQpOworCQljbGVhcl9iaXQobixzYmktPnN5bWxpbmtfYml0bWFwKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwltZW1jcHkoc2wtPmRhdGEsc3ltbmFtZSxzbHNpemUpOworCXNsLT5tdGltZSA9IGdldF9zZWNvbmRzKCk7CisKKwllbnQtPmlubyA9IEFVVE9GU19GSVJTVF9TWU1MSU5LICsgbjsKKwllbnQtPmhhc2ggPSBkZW50cnktPmRfbmFtZS5oYXNoOworCW1lbWNweShlbnQtPm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIDErKGVudC0+bGVuID0gZGVudHJ5LT5kX25hbWUubGVuKSk7CisJZW50LT5kZW50cnkgPSBOVUxMOwkvKiBXZSBkb24ndCBrZWVwIHRoZSBkZW50cnkgZm9yIHN5bWxpbmtzICovCisKKwlhdXRvZnNfaGFzaF9pbnNlcnQoZGgsZW50KTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaWdldChkaXItPmlfc2IsZW50LT5pbm8pKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBOT1RFIQorICoKKyAqIE5vcm1hbCBmaWxlc3lzdGVtcyB3b3VsZCBkbyBhICJkX2RlbGV0ZSgpIiB0byB0ZWxsIHRoZSBWRlMgZGNhY2hlCisgKiB0aGF0IHRoZSBmaWxlIG5vIGxvbmdlciBleGlzdHMuIEhvd2V2ZXIsIGRvaW5nIHRoYXQgbWVhbnMgdGhhdCB0aGUKKyAqIFZGUyBsYXllciBjYW4gdHVybiB0aGUgZGVudHJ5IGludG8gYSBuZWdhdGl2ZSBkZW50cnksIHdoaWNoIHdlCisgKiBvYnZpb3VzbHkgZG8gbm90IHdhbnQgKHdlJ3JlIGRyb3BwaW5nIHRoZSBlbnRyeSBub3QgYmVjYXVzZSBpdAorICogZG9lc24ndCBleGlzdCwgYnV0IGJlY2F1c2UgaXQgaGFzIHRpbWVkIG91dCkuCisgKgorICogQWxzbyBzZWUgYXV0b2ZzX3Jvb3Rfcm1kaXIoKS4uCisgKi8KK3N0YXRpYyBpbnQgYXV0b2ZzX3Jvb3RfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnNfc2JpKGRpci0+aV9zYik7CisJc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaCA9ICZzYmktPmRpcmhhc2g7CisJc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQ7CisJdW5zaWduZWQgaW50IG47CisKKwkvKiBUaGlzIGFsbG93cyByb290IHRvIHJlbW92ZSBzeW1saW5rcyAqLworCWxvY2tfa2VybmVsKCk7CisJaWYgKCAhYXV0b2ZzX296X21vZGUoc2JpKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSApIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwllbnQgPSBhdXRvZnNfaGFzaF9sb29rdXAoZGgsICZkZW50cnktPmRfbmFtZSk7CisJaWYgKCAhZW50ICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCW4gPSBlbnQtPmlubyAtIEFVVE9GU19GSVJTVF9TWU1MSU5LOworCWlmICggbiA+PSBBVVRPRlNfTUFYX1NZTUxJTktTICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlTRElSOwkvKiBJdCdzIGEgZGlyZWN0b3J5LCBkdW1teSAqLworCX0KKwlpZiAoICF0ZXN0X2JpdChuLHNiaS0+c3ltbGlua19iaXRtYXApICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlOVkFMOwkvKiBOb25leGlzdGVudCBzeW1saW5rPyAgU2hvdWxkbid0IGhhcHBlbiAqLworCX0KKwkKKwlkZW50cnktPmRfdGltZSA9ICh1bnNpZ25lZCBsb25nKShzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggKilOVUxMOworCWF1dG9mc19oYXNoX2RlbGV0ZShlbnQpOworCWNsZWFyX2JpdChuLHNiaS0+c3ltbGlua19iaXRtYXApOworCWtmcmVlKHNiaS0+c3ltbGlua1tuXS5kYXRhKTsKKwlkX2Ryb3AoZGVudHJ5KTsKKwkKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXV0b2ZzX3Jvb3Rfcm1kaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSA9IGF1dG9mc19zYmkoZGlyLT5pX3NiKTsKKwlzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggKmRoID0gJnNiaS0+ZGlyaGFzaDsKKwlzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmVudDsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKCAhYXV0b2ZzX296X21vZGUoc2JpKSApIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwllbnQgPSBhdXRvZnNfaGFzaF9sb29rdXAoZGgsICZkZW50cnktPmRfbmFtZSk7CisJaWYgKCAhZW50ICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWlmICggKHVuc2lnbmVkIGludCllbnQtPmlubyA8IEFVVE9GU19GSVJTVF9ESVJfSU5PICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PVERJUjsgLyogTm90IGEgZGlyZWN0b3J5ICovCisJfQorCisJaWYgKCBlbnQtPmRlbnRyeSAhPSBkZW50cnkgKSB7CisJCXByaW50aygiYXV0b2ZzX3JtZGlyOiBvZGVudHJ5ICE9IGRlbnRyeSBmb3IgZW50cnkgJXNcbiIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCX0KKworCWRlbnRyeS0+ZF90aW1lID0gKHVuc2lnbmVkIGxvbmcpKHN0cnVjdCBhdXRvZnNfZGlyX2VudCAqKU5VTEw7CisJYXV0b2ZzX2hhc2hfZGVsZXRlKGVudCk7CisJZGlyLT5pX25saW5rLS07CisJZF9kcm9wKGRlbnRyeSk7CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXV0b2ZzX3Jvb3RfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnNfc2JpKGRpci0+aV9zYik7CisJc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaCA9ICZzYmktPmRpcmhhc2g7CisJc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQ7CisJaW5vX3QgaW5vOworCisJbG9ja19rZXJuZWwoKTsKKwlpZiAoICFhdXRvZnNfb3pfbW9kZShzYmkpICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCWVudCA9IGF1dG9mc19oYXNoX2xvb2t1cChkaCwgJmRlbnRyeS0+ZF9uYW1lKTsKKwlpZiAoIGVudCApIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwlpZiAoIHNiaS0+bmV4dF9kaXJfaW5vIDwgQVVUT0ZTX0ZJUlNUX0RJUl9JTk8gKSB7CisJCXByaW50aygiYXV0b2ZzOiBPdXQgb2YgaW5vZGUgbnVtYmVycyAtLSB3aGF0IHRoZSBoZWNrIGRpZCB5b3UgZG8/P1xuIik7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCWlubyA9IHNiaS0+bmV4dF9kaXJfaW5vKys7CisKKwllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoICFlbnQgKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJZW50LT5uYW1lID0ga21hbGxvYyhkZW50cnktPmRfbmFtZS5sZW4rMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCAhZW50LT5uYW1lICkgeworCQlrZnJlZShlbnQpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCWVudC0+aGFzaCA9IGRlbnRyeS0+ZF9uYW1lLmhhc2g7CisJbWVtY3B5KGVudC0+bmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSwgMSsoZW50LT5sZW4gPSBkZW50cnktPmRfbmFtZS5sZW4pKTsKKwllbnQtPmlubyA9IGlubzsKKwllbnQtPmRlbnRyeSA9IGRlbnRyeTsKKwlhdXRvZnNfaGFzaF9pbnNlcnQoZGgsZW50KTsKKworCWRpci0+aV9ubGluaysrOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpZ2V0KGRpci0+aV9zYixpbm8pKTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogR2V0L3NldCB0aW1lb3V0IGlvY3RsKCkgb3BlcmF0aW9uICovCitzdGF0aWMgaW5saW5lIGludCBhdXRvZnNfZ2V0X3NldF90aW1lb3V0KHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpLAorCQkJCQkgdW5zaWduZWQgbG9uZyBfX3VzZXIgKnApCit7CisJdW5zaWduZWQgbG9uZyBudGltZW91dDsKKworCWlmIChnZXRfdXNlcihudGltZW91dCwgcCkgfHwKKwkgICAgcHV0X3VzZXIoc2JpLT5leHBfdGltZW91dCAvIEhaLCBwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIG50aW1lb3V0ID4gVUxPTkdfTUFYL0haICkKKwkJc2JpLT5leHBfdGltZW91dCA9IDA7CisJZWxzZQorCQlzYmktPmV4cF90aW1lb3V0ID0gbnRpbWVvdXQgKiBIWjsKKworCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gcHJvdG9jb2wgdmVyc2lvbiAqLworc3RhdGljIGlubGluZSBpbnQgYXV0b2ZzX2dldF9wcm90b3ZlcihpbnQgX191c2VyICpwKQoreworCXJldHVybiBwdXRfdXNlcihBVVRPRlNfUFJPVE9fVkVSU0lPTiwgcCk7Cit9CisKKy8qIFBlcmZvcm0gYW4gZXhwaXJ5IG9wZXJhdGlvbiAqLworc3RhdGljIGlubGluZSBpbnQgYXV0b2ZzX2V4cGlyZV9ydW4oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksCisJCQkJICAgIHN0cnVjdCB2ZnNtb3VudCAqbW50LAorCQkJCSAgICBzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9leHBpcmUgX191c2VyICpwa3RfcCkKK3sKKwlzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmVudDsKKwlzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9leHBpcmUgcGt0OworCisJbWVtc2V0KCZwa3QsMCxzaXplb2YgcGt0KTsKKworCXBrdC5oZHIucHJvdG9fdmVyc2lvbiA9IEFVVE9GU19QUk9UT19WRVJTSU9OOworCXBrdC5oZHIudHlwZSA9IGF1dG9mc19wdHlwZV9leHBpcmU7CisKKwlpZiAoICFzYmktPmV4cF90aW1lb3V0IHx8CisJICAgICAhKGVudCA9IGF1dG9mc19leHBpcmUoc2Isc2JpLG1udCkpICkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlwa3QubGVuID0gZW50LT5sZW47CisJbWVtY3B5KHBrdC5uYW1lLCBlbnQtPm5hbWUsIHBrdC5sZW4pOworCXBrdC5uYW1lW3BrdC5sZW5dID0gJ1wwJzsKKworCWlmICggY29weV90b191c2VyKHBrdF9wLCAmcGt0LCBzaXplb2Yoc3RydWN0IGF1dG9mc19wYWNrZXRfZXhwaXJlKSkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisvKgorICogaW9jdGwoKSdzIG9uIHRoZSByb290IGRpcmVjdG9yeSBpcyB0aGUgY2hpZWYgbWV0aG9kIGZvciB0aGUgZGFlbW9uIHRvCisgKiBnZW5lcmF0ZSBrZXJuZWwgcmVhY3Rpb25zCisgKi8KK3N0YXRpYyBpbnQgYXV0b2ZzX3Jvb3RfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpID0gYXV0b2ZzX3NiaShpbm9kZS0+aV9zYik7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlEUFJJTlRLKCgiYXV0b2ZzX2lvY3RsOiBjbWQgPSAweCUwOHgsIGFyZyA9IDB4JTA4bHgsIHNiaSA9ICVwLCBwZ3JwID0gJXVcbiIsY21kLGFyZyxzYmkscHJvY2Vzc19ncm91cChjdXJyZW50KSkpOworCisJaWYgKCBfSU9DX1RZUEUoY21kKSAhPSBfSU9DX1RZUEUoQVVUT0ZTX0lPQ19GSVJTVCkgfHwKKwkgICAgIF9JT0NfTlIoY21kKSAtIF9JT0NfTlIoQVVUT0ZTX0lPQ19GSVJTVCkgPj0gQVVUT0ZTX0lPQ19DT1VOVCApCisJCXJldHVybiAtRU5PVFRZOworCQorCWlmICggIWF1dG9mc19vel9tb2RlKHNiaSkgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgKQorCQlyZXR1cm4gLUVQRVJNOworCQorCXN3aXRjaChjbWQpIHsKKwljYXNlIEFVVE9GU19JT0NfUkVBRFk6CS8qIFdhaXQgcXVldWU6IGdvIGFoZWFkIGFuZCByZXRyeSAqLworCQlyZXR1cm4gYXV0b2ZzX3dhaXRfcmVsZWFzZShzYmksKGF1dG9mc193cXRfdClhcmcsMCk7CisJY2FzZSBBVVRPRlNfSU9DX0ZBSUw6CS8qIFdhaXQgcXVldWU6IGZhaWwgd2l0aCBFTk9FTlQgKi8KKwkJcmV0dXJuIGF1dG9mc193YWl0X3JlbGVhc2Uoc2JpLChhdXRvZnNfd3F0X3QpYXJnLC1FTk9FTlQpOworCWNhc2UgQVVUT0ZTX0lPQ19DQVRBVE9OSUM6IC8qIEVudGVyIGNhdGF0b25pYyBtb2RlIChkYWVtb24gc2h1dGRvd24pICovCisJCWF1dG9mc19jYXRhdG9uaWNfbW9kZShzYmkpOworCQlyZXR1cm4gMDsKKwljYXNlIEFVVE9GU19JT0NfUFJPVE9WRVI6IC8qIEdldCBwcm90b2NvbCB2ZXJzaW9uICovCisJCXJldHVybiBhdXRvZnNfZ2V0X3Byb3RvdmVyKGFyZ3ApOworCWNhc2UgQVVUT0ZTX0lPQ19TRVRUSU1FT1VUOgorCQlyZXR1cm4gYXV0b2ZzX2dldF9zZXRfdGltZW91dChzYmksIGFyZ3ApOworCWNhc2UgQVVUT0ZTX0lPQ19FWFBJUkU6CisJCXJldHVybiBhdXRvZnNfZXhwaXJlX3J1bihpbm9kZS0+aV9zYiwgc2JpLCBmaWxwLT5mX3Zmc21udCwKKwkJCQkJIGFyZ3ApOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PU1lTOworCX0KK30KZGlmZiAtLWdpdCBhL2ZzL2F1dG9mcy9zeW1saW5rLmMgYi9mcy9hdXRvZnMvc3ltbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMjgzOTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hdXRvZnMvc3ltbGluay5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qIC0qLSBsaW51eC1jIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqIGxpbnV4L2ZzL2F1dG9mcy9zeW1saW5rLmMKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTctMTk5OCBUcmFuc21ldGEgQ29ycG9yYXRpb24gLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgImF1dG9mc19pLmgiCisKK3N0YXRpYyBpbnQgYXV0b2ZzX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJY2hhciAqcz0oKHN0cnVjdCBhdXRvZnNfc3ltbGluayAqKWRlbnRyeS0+ZF9pbm9kZS0+dS5nZW5lcmljX2lwKS0+ZGF0YTsKKwluZF9zZXRfbGluayhuZCwgcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGF1dG9mc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBhdXRvZnNfZm9sbG93X2xpbmsKK307CmRpZmYgLS1naXQgYS9mcy9hdXRvZnMvd2FpdHEuYyBiL2ZzL2F1dG9mcy93YWl0cS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmY2FhMTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hdXRvZnMvd2FpdHEuYwpAQCAtMCwwICsxLDIwNiBAQAorLyogLSotIGxpbnV4LWMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogbGludXgvZnMvYXV0b2ZzL3dhaXRxLmMKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTctMTk5OCBUcmFuc21ldGEgQ29ycG9yYXRpb24gLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgImF1dG9mc19pLmgiCisKKy8qIFdlIG1ha2UgdGhpcyBhIHN0YXRpYyB2YXJpYWJsZSByYXRoZXIgdGhhbiBhIHBhcnQgb2YgdGhlIHN1cGVyYmxvY2s7IGl0CisgICBpcyBiZXR0ZXIgaWYgd2UgZG9uJ3QgcmVhc3NpZ24gbnVtYmVycyBlYXNpbHkgZXZlbiBhY3Jvc3MgZmlsZXN5c3RlbXMgKi8KK3N0YXRpYyBhdXRvZnNfd3F0X3QgYXV0b2ZzX25leHRfd2FpdF9xdWV1ZSA9IDE7CisKKy8qIFRoZXNlIGFyZSB0aGUgc2lnbmFscyB3ZSBhbGxvdyBpbnRlcnJ1cHRpbmcgYSBwZW5kaW5nIG1vdW50ICovCisjZGVmaW5lIFNIVVRET1dOX1NJR1MJKHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR0lOVCkgfCBzaWdtYXNrKFNJR1FVSVQpKQorCit2b2lkIGF1dG9mc19jYXRhdG9uaWNfbW9kZShzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSkKK3sKKwlzdHJ1Y3QgYXV0b2ZzX3dhaXRfcXVldWUgKndxLCAqbndxOworCisJRFBSSU5USygoImF1dG9mczogZW50ZXJpbmcgY2F0YXRvbmljIG1vZGVcbiIpKTsKKworCXNiaS0+Y2F0YXRvbmljID0gMTsKKwl3cSA9IHNiaS0+cXVldWVzOworCXNiaS0+cXVldWVzID0gTlVMTDsJLyogRXJhc2UgYWxsIHdhaXQgcXVldWVzICovCisJd2hpbGUgKCB3cSApIHsKKwkJbndxID0gd3EtPm5leHQ7CisJCXdxLT5zdGF0dXMgPSAtRU5PRU5UOyAvKiBNYWdpYyBpcyBnb25lIC0gcmVwb3J0IGZhaWx1cmUgKi8KKwkJa2ZyZWUod3EtPm5hbWUpOworCQl3cS0+bmFtZSA9IE5VTEw7CisJCXdha2VfdXAoJndxLT5xdWV1ZSk7CisJCXdxID0gbndxOworCX0KKwlmcHV0KHNiaS0+cGlwZSk7CS8qIENsb3NlIHRoZSBwaXBlICovCisJYXV0b2ZzX2hhc2hfZHB1dGFsbCgmc2JpLT5kaXJoYXNoKTsgLyogUmVtb3ZlIGFsbCBkZW50cnkgcG9pbnRlcnMgKi8KK30KKworc3RhdGljIGludCBhdXRvZnNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IHZvaWQgKmFkZHIsIGludCBieXRlcykKK3sKKwl1bnNpZ25lZCBsb25nIHNpZ3BpcGUsIGZsYWdzOworCW1tX3NlZ21lbnRfdCBmczsKKwljb25zdCBjaGFyICpkYXRhID0gKGNvbnN0IGNoYXIgKilhZGRyOworCXNzaXplX3Qgd3IgPSAwOworCisJLyoqIFdBUk5JTkc6IHRoaXMgaXMgbm90IHNhZmUgZm9yIHdyaXRpbmcgbW9yZSB0aGFuIFBJUEVfQlVGIGJ5dGVzISAqKi8KKworCXNpZ3BpcGUgPSBzaWdpc21lbWJlcigmY3VycmVudC0+cGVuZGluZy5zaWduYWwsIFNJR1BJUEUpOworCisJLyogU2F2ZSBwb2ludGVyIHRvIHVzZXIgc3BhY2UgYW5kIHBvaW50IGJhY2sgdG8ga2VybmVsIHNwYWNlICovCisJZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKworCXdoaWxlIChieXRlcyAmJgorCSAgICAgICAod3IgPSBmaWxlLT5mX29wLT53cml0ZShmaWxlLGRhdGEsYnl0ZXMsJmZpbGUtPmZfcG9zKSkgPiAwKSB7CisJCWRhdGEgKz0gd3I7CisJCWJ5dGVzIC09IHdyOworCX0KKworCXNldF9mcyhmcyk7CisKKwkvKiBLZWVwIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHByb2Nlc3MgZnJvbSByZWNlaXZpbmcgYQorCSAgIFNJR1BJUEUgdW5sZXNzIGl0IHdhcyBhbHJlYWR5IHN1cHBvc2VkIHRvIGdldCBvbmUgKi8KKwlpZiAod3IgPT0gLUVQSVBFICYmICFzaWdwaXBlKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJCXNpZ2RlbHNldCgmY3VycmVudC0+cGVuZGluZy5zaWduYWwsIFNJR1BJUEUpOworCQlyZWNhbGNfc2lncGVuZGluZygpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIChieXRlcyA+IDApOworfQorCQorc3RhdGljIHZvaWQgYXV0b2ZzX25vdGlmeV9kYWVtb24oc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksIHN0cnVjdCBhdXRvZnNfd2FpdF9xdWV1ZSAqd3EpCit7CisJc3RydWN0IGF1dG9mc19wYWNrZXRfbWlzc2luZyBwa3Q7CisKKwlEUFJJTlRLKCgiYXV0b2ZzX3dhaXQ6IHdhaXQgaWQgPSAweCUwOGx4LCBuYW1lID0gIiwgd3EtPndhaXRfcXVldWVfdG9rZW4pKTsKKwlhdXRvZnNfc2F5KHdxLT5uYW1lLHdxLT5sZW4pOworCisJbWVtc2V0KCZwa3QsMCxzaXplb2YgcGt0KTsgLyogRm9yIHNlY3VyaXR5IHJlYXNvbnMgKi8KKworCXBrdC5oZHIucHJvdG9fdmVyc2lvbiA9IEFVVE9GU19QUk9UT19WRVJTSU9OOworCXBrdC5oZHIudHlwZSA9IGF1dG9mc19wdHlwZV9taXNzaW5nOworCXBrdC53YWl0X3F1ZXVlX3Rva2VuID0gd3EtPndhaXRfcXVldWVfdG9rZW47CisJcGt0LmxlbiA9IHdxLT5sZW47CisgICAgICAgIG1lbWNweShwa3QubmFtZSwgd3EtPm5hbWUsIHBrdC5sZW4pOworCXBrdC5uYW1lW3BrdC5sZW5dID0gJ1wwJzsKKworCWlmICggYXV0b2ZzX3dyaXRlKHNiaS0+cGlwZSwmcGt0LHNpemVvZihzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9taXNzaW5nKSkgKQorCQlhdXRvZnNfY2F0YXRvbmljX21vZGUoc2JpKTsKK30KKworaW50IGF1dG9mc193YWl0KHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpLCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwlzdHJ1Y3QgYXV0b2ZzX3dhaXRfcXVldWUgKndxOworCWludCBzdGF0dXM7CisKKwkvKiBJbiBjYXRhdG9uaWMgbW9kZSwgd2UgZG9uJ3Qgd2FpdCBmb3Igbm9ib2R5ICovCisJaWYgKCBzYmktPmNhdGF0b25pYyApCisJCXJldHVybiAtRU5PRU5UOworCQorCS8qIFdlIHNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBoZXJlLCBidXQganVzdCBpbiBjYXNlICovCisJaWYgKCBuYW1lLT5sZW4gPiBOQU1FX01BWCApCisJCXJldHVybiAtRU5PRU5UOworCisJZm9yICggd3EgPSBzYmktPnF1ZXVlcyA7IHdxIDsgd3EgPSB3cS0+bmV4dCApIHsKKwkJaWYgKCB3cS0+aGFzaCA9PSBuYW1lLT5oYXNoICYmCisJCSAgICAgd3EtPmxlbiA9PSBuYW1lLT5sZW4gJiYKKwkJICAgICB3cS0+bmFtZSAmJiAhbWVtY21wKHdxLT5uYW1lLG5hbWUtPm5hbWUsbmFtZS0+bGVuKSApCisJCQlicmVhazsKKwl9CisJCisJaWYgKCAhd3EgKSB7CisJCS8qIENyZWF0ZSBhIG5ldyB3YWl0IHF1ZXVlICovCisJCXdxID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1dG9mc193YWl0X3F1ZXVlKSxHRlBfS0VSTkVMKTsKKwkJaWYgKCAhd3EgKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJd3EtPm5hbWUgPSBrbWFsbG9jKG5hbWUtPmxlbixHRlBfS0VSTkVMKTsKKwkJaWYgKCAhd3EtPm5hbWUgKSB7CisJCQlrZnJlZSh3cSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQl3cS0+d2FpdF9xdWV1ZV90b2tlbiA9IGF1dG9mc19uZXh0X3dhaXRfcXVldWUrKzsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmd3EtPnF1ZXVlKTsKKwkJd3EtPmhhc2ggPSBuYW1lLT5oYXNoOworCQl3cS0+bGVuID0gbmFtZS0+bGVuOworCQl3cS0+c3RhdHVzID0gLUVJTlRSOyAvKiBTdGF0dXMgcmV0dXJuIGlmIGludGVycnVwdGVkICovCisJCW1lbWNweSh3cS0+bmFtZSwgbmFtZS0+bmFtZSwgbmFtZS0+bGVuKTsKKwkJd3EtPm5leHQgPSBzYmktPnF1ZXVlczsKKwkJc2JpLT5xdWV1ZXMgPSB3cTsKKworCQkvKiBhdXRvZnNfbm90aWZ5X2RhZW1vbigpIG1heSBibG9jayAqLworCQl3cS0+d2FpdF9jdHIgPSAyOworCQlhdXRvZnNfbm90aWZ5X2RhZW1vbihzYmksd3EpOworCX0gZWxzZQorCQl3cS0+d2FpdF9jdHIrKzsKKworCS8qIHdxLT5uYW1lIGlzIE5VTEwgaWYgYW5kIG9ubHkgaWYgdGhlIGxvY2sgaXMgYWxyZWFkeSByZWxlYXNlZCAqLworCisJaWYgKCBzYmktPmNhdGF0b25pYyApIHsKKwkJLyogV2UgbWlnaHQgaGF2ZSBzbGVwdCwgc28gY2hlY2sgYWdhaW4gZm9yIGNhdGF0b25pYyBtb2RlICovCisJCXdxLT5zdGF0dXMgPSAtRU5PRU5UOworCQlpZiAoIHdxLT5uYW1lICkgeworCQkJa2ZyZWUod3EtPm5hbWUpOworCQkJd3EtPm5hbWUgPSBOVUxMOworCQl9CisJfQorCisJaWYgKCB3cS0+bmFtZSApIHsKKwkJLyogQmxvY2sgYWxsIGJ1dCAic2h1dGRvd24iIHNpZ25hbHMgd2hpbGUgd2FpdGluZyAqLworCQlzaWdzZXRfdCBzaWdtYXNrOworCisJCXNpZ2luaXRzZXRpbnYoJnNpZ21hc2ssIFNIVVRET1dOX1NJR1MpOworCQlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzaWdtYXNrLCAmc2lnbWFzayk7CisKKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmd3EtPnF1ZXVlKTsKKworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJnNpZ21hc2ssIE5VTEwpOworCX0gZWxzZSB7CisJCURQUklOVEsoKCJhdXRvZnNfd2FpdDogc2tpcHBlZCBzbGVlcGluZ1xuIikpOworCX0KKworCXN0YXR1cyA9IHdxLT5zdGF0dXM7CisKKwlpZiAoICEgLS13cS0+d2FpdF9jdHIgKQkvKiBBcmUgd2UgdGhlIGxhc3QgcHJvY2VzcyB0byBuZWVkIHN0YXR1cz8gKi8KKwkJa2ZyZWUod3EpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworCitpbnQgYXV0b2ZzX3dhaXRfcmVsZWFzZShzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwgYXV0b2ZzX3dxdF90IHdhaXRfcXVldWVfdG9rZW4sIGludCBzdGF0dXMpCit7CisJc3RydWN0IGF1dG9mc193YWl0X3F1ZXVlICp3cSwgKip3cWw7CisKKwlmb3IgKCB3cWwgPSAmc2JpLT5xdWV1ZXMgOyAod3EgPSAqd3FsKSAhPSAwIDsgd3FsID0gJndxLT5uZXh0ICkgeworCQlpZiAoIHdxLT53YWl0X3F1ZXVlX3Rva2VuID09IHdhaXRfcXVldWVfdG9rZW4gKQorCQkJYnJlYWs7CisJfQorCWlmICggIXdxICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqd3FsID0gd3EtPm5leHQ7CS8qIFVubGluayBmcm9tIGNoYWluICovCisJa2ZyZWUod3EtPm5hbWUpOworCXdxLT5uYW1lID0gTlVMTDsJLyogRG8gbm90IHdhaXQgb24gdGhpcyBxdWV1ZSAqLworCisJd3EtPnN0YXR1cyA9IHN0YXR1czsKKworCWlmICggISAtLXdxLT53YWl0X2N0ciApCS8qIElzIGFueW9uZSBzdGlsbCB3YWl0aW5nIGZvciB0aGlzIGd1eT8gKi8KKwkJa2ZyZWUod3EpOworCWVsc2UKKwkJd2FrZV91cCgmd3EtPnF1ZXVlKTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L01ha2VmaWxlIGIvZnMvYXV0b2ZzNC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmMzYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYXV0b2ZzNC9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBhdXRvZnMtZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX0FVVE9GUzRfRlMpICs9IGF1dG9mczQubworCithdXRvZnM0LW9ianMgOj0gaW5pdC5vIGlub2RlLm8gcm9vdC5vIHN5bWxpbmsubyB3YWl0cS5vIGV4cGlyZS5vCmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L2F1dG9mc19pLmggYi9mcy9hdXRvZnM0L2F1dG9mc19pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhNTJjOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2F1dG9mczQvYXV0b2ZzX2kuaApAQCAtMCwwICsxLDE5MyBAQAorLyogLSotIGMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICogICAKKyAqIGxpbnV4L2ZzL2F1dG9mcy9hdXRvZnNfaS5oCisgKgorICogICBDb3B5cmlnaHQgMTk5Ny0xOTk4IFRyYW5zbWV0YSBDb3Jwb3JhdGlvbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBJbnRlcm5hbCBoZWFkZXIgZmlsZSBmb3IgYXV0b2ZzICovCisKKyNpbmNsdWRlIDxsaW51eC9hdXRvX2ZzNC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworLyogVGhpcyBpcyB0aGUgcmFuZ2Ugb2YgaW9jdGwoKSBudW1iZXJzIHdlIGNsYWltIGFzIG91cnMgKi8KKyNkZWZpbmUgQVVUT0ZTX0lPQ19GSVJTVCAgICAgQVVUT0ZTX0lPQ19SRUFEWQorI2RlZmluZSBBVVRPRlNfSU9DX0NPVU5UICAgICAzMgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKiAjZGVmaW5lIERFQlVHICovCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEUFJJTlRLKGZtdCxhcmdzLi4uKSBkbyB7IHByaW50ayhLRVJOX0RFQlVHICJwaWQgJWQ6ICVzOiAiIGZtdCAiXG4iICwgY3VycmVudC0+cGlkICwgX19GVU5DVElPTl9fICwgIyNhcmdzKTsgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5USyhmbXQsYXJncy4uLikgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgorCisjZGVmaW5lIEFVVE9GU19TVVBFUl9NQUdJQyAweDAxODcKKworLyoKKyAqIElmIHRoZSBkYWVtb24gcmV0dXJucyBhIG5lZ2F0aXZlIHJlc3BvbnNlIChBVVRPRlNfSU9DX0ZBSUwpIHRoZW4gdGhlCisgKiBrZXJuZWwgd2lsbCBrZWVwIHRoZSBuZWdhdGl2ZSByZXNwb25zZSBjYWNoZWQgZm9yIHVwIHRvIHRoZSB0aW1lIGdpdmVuCisgKiBoZXJlLCBhbHRob3VnaCB0aGUgdGltZSBjYW4gYmUgc2hvcnRlciBpZiB0aGUga2VybmVsIHRocm93cyB0aGUgZGNhY2hlCisgKiBlbnRyeSBhd2F5LiAgVGhpcyBwcm9iYWJseSBzaG91bGQgYmUgc2V0dGFibGUgZnJvbSB1c2VyIHNwYWNlLgorICovCisjZGVmaW5lIEFVVE9GU19ORUdBVElWRV9USU1FT1VUICg2MCpIWikJLyogMSBtaW51dGUgKi8KKworLyogVW5pZmllZCBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMgcG9pbnRlZCB0byBieSBib3RoIHRoZSBkZW50cnkgYW5kCisgICBpbm9kZSBzdHJ1Y3R1cmVzLiAgRWFjaCBmaWxlIGluIHRoZSBmaWxlc3lzdGVtIGhhcyBhbiBpbnN0YW5jZSBvZiB0aGlzCisgICBzdHJ1Y3R1cmUuICBJdCBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgZGVudHJ5LCBzbyBkZW50cmllcyBhcmUgbmV2ZXIKKyAgIGZsdXNoZWQgd2hpbGUgdGhlIGZpbGUgZXhpc3RzLiAgQWxsIG5hbWUgbG9va3VwcyBhcmUgZGVhbHQgd2l0aCBhdCB0aGUKKyAgIGRlbnRyeSBsZXZlbCwgYWx0aG91Z2ggdGhlIGZpbGVzeXN0ZW0gY2FuIGludGVyZmVyZSBpbiB0aGUgdmFsaWRhdGlvbgorICAgcHJvY2Vzcy4gIFJlYWRkaXIgaXMgaW1wbGVtZW50ZWQgYnkgdHJhdmVyc2luZyB0aGUgZGVudHJ5IGxpc3RzLiAqLworc3RydWN0IGF1dG9mc19pbmZvIHsKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnk7CisJc3RydWN0IGlub2RlCSppbm9kZTsKKworCWludAkJZmxhZ3M7CisKKwlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaTsKKwl1bnNpZ25lZCBsb25nIGxhc3RfdXNlZDsKKworCW1vZGVfdAltb2RlOworCXNpemVfdAlzaXplOworCisJdm9pZCAoKmZyZWUpKHN0cnVjdCBhdXRvZnNfaW5mbyAqKTsKKwl1bmlvbiB7CisJCWNvbnN0IGNoYXIgKnN5bWxpbms7CisJfSB1OworfTsKKworI2RlZmluZSBBVVRPRlNfSU5GX0VYUElSSU5HCSgxPDwwKSAvKiBkZW50cnkgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgZXhwaXJpbmcgKi8KKworc3RydWN0IGF1dG9mc193YWl0X3F1ZXVlIHsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsKKwlzdHJ1Y3QgYXV0b2ZzX3dhaXRfcXVldWUgKm5leHQ7CisJYXV0b2ZzX3dxdF90IHdhaXRfcXVldWVfdG9rZW47CisJLyogV2UgdXNlIHRoZSBmb2xsb3dpbmcgdG8gc2VlIHdoYXQgd2UgYXJlIHdhaXRpbmcgZm9yICovCisJaW50IGhhc2g7CisJaW50IGxlbjsKKwljaGFyICpuYW1lOworCS8qIFRoaXMgaXMgZm9yIHN0YXR1cyByZXBvcnRpbmcgdXBvbiByZXR1cm4gKi8KKwlpbnQgc3RhdHVzOworCWF0b21pY190IHdhaXRfY3RyOworfTsKKworI2RlZmluZSBBVVRPRlNfU0JJX01BR0lDIDB4NmQ0YTU1NmQKKworc3RydWN0IGF1dG9mc19zYl9pbmZvIHsKKwl1MzIgbWFnaWM7CisJc3RydWN0IGZpbGUgKnBpcGU7CisJcGlkX3Qgb3pfcGdycDsKKwlpbnQgY2F0YXRvbmljOworCWludCB2ZXJzaW9uOworCWludCBzdWJfdmVyc2lvbjsKKwl1bnNpZ25lZCBsb25nIGV4cF90aW1lb3V0OworCWludCByZWdob3N0X2VuYWJsZWQ7CisJaW50IG5lZWRzX3JlZ2hvc3Q7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHdxX3NlbTsKKwlzdHJ1Y3QgYXV0b2ZzX3dhaXRfcXVldWUgKnF1ZXVlczsgLyogV2FpdCBxdWV1ZSBwb2ludGVyICovCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqYXV0b2ZzNF9zYmkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqKShzYi0+c19mc19pbmZvKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYXV0b2ZzX2luZm8gKmF1dG9mczRfZGVudHJ5X2lubyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJcmV0dXJuIChzdHJ1Y3QgYXV0b2ZzX2luZm8gKikoZGVudHJ5LT5kX2ZzZGF0YSk7Cit9CisKKy8qIGF1dG9mczRfb3pfbW9kZSgpOiBkbyB3ZSBzZWUgdGhlIG1hbiBiZWhpbmQgdGhlIGN1cnRhaW4/ICAoVGhlCisgICBwcm9jZXNzZXMgd2hpY2ggZG8gbWFuaXB1bGF0aW9ucyBmb3IgdXMgaW4gdXNlciBzcGFjZSBzZWVzIHRoZSByYXcKKyAgIGZpbGVzeXN0ZW0gd2l0aG91dCAibWFnaWMiLikgKi8KKworc3RhdGljIGlubGluZSBpbnQgYXV0b2ZzNF9vel9tb2RlKHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpKSB7CisJcmV0dXJuIHNiaS0+Y2F0YXRvbmljIHx8IHByb2Nlc3NfZ3JvdXAoY3VycmVudCkgPT0gc2JpLT5vel9wZ3JwOworfQorCisvKiBEb2VzIGEgZGVudHJ5IGhhdmUgc29tZSBwZW5kaW5nIGFjdGl2aXR5PyAqLworc3RhdGljIGlubGluZSBpbnQgYXV0b2ZzNF9pc3BlbmRpbmcoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBhdXRvZnNfaW5mbyAqaW5mID0gYXV0b2ZzNF9kZW50cnlfaW5vKGRlbnRyeSk7CisKKwlyZXR1cm4gKGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9BVVRPRlNfUEVORElORykgfHwKKwkJKGluZiAhPSBOVUxMICYmIGluZi0+ZmxhZ3MgJiBBVVRPRlNfSU5GX0VYUElSSU5HKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF1dG9mczRfY29weV9hdGltZShzdHJ1Y3QgZmlsZSAqc3JjLCBzdHJ1Y3QgZmlsZSAqZHN0KQoreworCWRzdC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfYXRpbWUgPSBzcmMtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2F0aW1lOworCXJldHVybjsKK30KKworc3RydWN0IGlub2RlICphdXRvZnM0X2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGF1dG9mc19pbmZvICopOwordm9pZCBhdXRvZnM0X2ZyZWVfaW5vKHN0cnVjdCBhdXRvZnNfaW5mbyAqKTsKKworLyogRXhwaXJhdGlvbiAqLworaW50IGlzX2F1dG9mczRfZGVudHJ5KHN0cnVjdCBkZW50cnkgKik7CitpbnQgYXV0b2ZzNF9leHBpcmVfcnVuKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgdmZzbW91bnQgKiwKKwkJCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqLAorCQkJc3RydWN0IGF1dG9mc19wYWNrZXRfZXhwaXJlIF9fdXNlciAqKTsKK2ludCBhdXRvZnM0X2V4cGlyZV9tdWx0aShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IHZmc21vdW50ICosCisJCQlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKiwgaW50IF9fdXNlciAqKTsKKworLyogT3BlcmF0aW9ucyBzdHJ1Y3R1cmVzICovCisKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBhdXRvZnM0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBhdXRvZnM0X2Rpcl9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGF1dG9mczRfcm9vdF9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXV0b2ZzNF9kaXJfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1dG9mczRfcm9vdF9vcGVyYXRpb25zOworCisvKiBJbml0aWFsaXppbmcgZnVuY3Rpb24gKi8KKworaW50IGF1dG9mczRfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqLCBpbnQpOworc3RydWN0IGF1dG9mc19pbmZvICphdXRvZnM0X2luaXRfaW5vKHN0cnVjdCBhdXRvZnNfaW5mbyAqLCBzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwgbW9kZV90IG1vZGUpOworCisvKiBRdWV1ZSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLworCitlbnVtIGF1dG9mc19ub3RpZnkKK3sKKwlORllfTk9ORSwKKwlORllfTU9VTlQsCisJTkZZX0VYUElSRQorfTsKKworaW50IGF1dG9mczRfd2FpdChzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKixzdHJ1Y3QgZGVudHJ5ICosIGVudW0gYXV0b2ZzX25vdGlmeSk7CitpbnQgYXV0b2ZzNF93YWl0X3JlbGVhc2Uoc3RydWN0IGF1dG9mc19zYl9pbmZvICosYXV0b2ZzX3dxdF90LGludCk7Cit2b2lkIGF1dG9mczRfY2F0YXRvbmljX21vZGUoc3RydWN0IGF1dG9mc19zYl9pbmZvICopOworCitzdGF0aWMgaW5saW5lIGludCBzaW1wbGVfcG9zaXRpdmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXJldHVybiBkZW50cnktPmRfaW5vZGUgJiYgIWRfdW5oYXNoZWQoZGVudHJ5KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2ltcGxlX2VtcHR5X25vbG9jayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGRlbnRyeSAqY2hpbGQ7CisJaW50IHJldCA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmZGVudHJ5LT5kX3N1YmRpcnMsIGRfY2hpbGQpCisJCWlmIChzaW1wbGVfcG9zaXRpdmUoY2hpbGQpKQorCQkJZ290byBvdXQ7CisJcmV0ID0gMTsKK291dDoKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9leHBpcmUuYyBiL2ZzL2F1dG9mczQvZXhwaXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1NDBhNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2F1dG9mczQvZXhwaXJlLmMKQEAgLTAsMCArMSwzNTggQEAKKy8qIC0qLSBjIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqIGxpbnV4L2ZzL2F1dG9mcy9leHBpcmUuYworICoKKyAqICBDb3B5cmlnaHQgMTk5Ny0xOTk4IFRyYW5zbWV0YSBDb3Jwb3JhdGlvbiAtLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgQ29weXJpZ2h0IDE5OTktMjAwMCBKZXJlbXkgRml0emhhcmRpbmdlIDxqZXJlbXlAZ29vcC5vcmc+CisgKiAgQ29weXJpZ2h0IDIwMDEtMjAwMyBJYW4gS2VudCA8cmF2ZW5AdGhlbWF3Lm5ldD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlICJhdXRvZnNfaS5oIgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBub3c7CisKKy8qIENoZWNrIGlmIGEgZGVudHJ5IGNhbiBiZSBleHBpcmVkIHJldHVybiAxIGlmIGl0IGNhbiBlbHNlIHJldHVybiAwICovCitzdGF0aWMgaW5saW5lIGludCBhdXRvZnM0X2Nhbl9leHBpcmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCQl1bnNpZ25lZCBsb25nIHRpbWVvdXQsIGludCBkb19ub3cpCit7CisJc3RydWN0IGF1dG9mc19pbmZvICppbm8gPSBhdXRvZnM0X2RlbnRyeV9pbm8oZGVudHJ5KTsKKworCS8qIGRlbnRyeSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkZWxldGVkICovCisJaWYgKGlubyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCS8qIE5vIHBvaW50IGV4cGlyaW5nIGEgcGVuZGluZyBtb3VudCAqLworCWlmIChkZW50cnktPmRfZmxhZ3MgJiBEQ0FDSEVfQVVUT0ZTX1BFTkRJTkcpCisJCXJldHVybiAwOworCisJaWYgKCFkb19ub3cpIHsKKwkJLyogVG9vIHlvdW5nIHRvIGRpZSAqLworCQlpZiAodGltZV9hZnRlcihpbm8tPmxhc3RfdXNlZCArIHRpbWVvdXQsIG5vdykpCisJCQlyZXR1cm4gMDsKKworCQkvKiB1cGRhdGUgbGFzdF91c2VkIGhlcmUgOi0KKwkJICAgLSBvYnZpb3VzbHkgbWFrZXMgc2Vuc2UgaWYgaXQgaXMgaW4gdXNlIG5vdworCQkgICAtIGxlc3Mgb2J2aW91c2x5LCBwcmV2ZW50cyByYXBpZC1maXJlIGV4cGlyZQorCQkgICAgIGF0dGVtcHRzIGlmIGV4cGlyZSBmYWlscyB0aGUgZmlyc3QgdGltZSAqLworCQlpbm8tPmxhc3RfdXNlZCA9IG5vdzsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogQ2hlY2sgYSBtb3VudCBwb2ludCBmb3IgYnVzeW5lc3MgcmV0dXJuIDEgaWYgbm90IGJ1c3ksIG90aGVyd2lzZSAqLworc3RhdGljIGludCBhdXRvZnM0X2NoZWNrX21vdW50KHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlEUFJJTlRLKCJkZW50cnkgJXAgJS4qcyIsCisJCWRlbnRyeSwgKGludClkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJbW50Z2V0KG1udCk7CisJZGdldChkZW50cnkpOworCisJaWYgKCFmb2xsb3dfZG93bigmbW50LCAmZGVudHJ5KSkKKwkJZ290byBkb25lOworCisJd2hpbGUgKGRfbW91bnRwb2ludChkZW50cnkpICYmIGZvbGxvd19kb3duKCZtbnQsICZkZW50cnkpKQorCQk7CisKKwkvKiBUaGlzIGlzIGFuIGF1dG9mcyBzdWJtb3VudCwgd2UgY2FuJ3QgZXhwaXJlIGl0ICovCisJaWYgKGlzX2F1dG9mczRfZGVudHJ5KGRlbnRyeSkpCisJCWdvdG8gZG9uZTsKKworCS8qIFRoZSBiaWcgcXVlc3Rpb24gKi8KKwlpZiAobWF5X3Vtb3VudF90cmVlKG1udCkgPT0gMCkKKwkJc3RhdHVzID0gMTsKK2RvbmU6CisJRFBSSU5USygicmV0dXJuaW5nID0gJWQiLCBzdGF0dXMpOworCW1udHB1dChtbnQpOworCWRwdXQoZGVudHJ5KTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBDaGVjayBhIGRpcmVjdG9yeSB0cmVlIG9mIG1vdW50IHBvaW50cyBmb3IgYnVzeW5lc3MKKyAqIFRoZSB0cmVlIGlzIG5vdCBidXN5IGlmZiBubyBtb3VudHBvaW50cyBhcmUgYnVzeQorICogUmV0dXJuIDEgaWYgdGhlIHRyZWUgaXMgYnVzeSBvciAwIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGF1dG9mczRfY2hlY2tfdHJlZShzdHJ1Y3QgdmZzbW91bnQgKm1udCwKKwkgICAgICAgCQkgICAgICBzdHJ1Y3QgZGVudHJ5ICp0b3AsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQsCisJCQkgICAgICBpbnQgZG9fbm93KQoreworCXN0cnVjdCBkZW50cnkgKnRoaXNfcGFyZW50ID0gdG9wOworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CisKKwlEUFJJTlRLKCJwYXJlbnQgJXAgJS4qcyIsCisJCXRvcCwgKGludCl0b3AtPmRfbmFtZS5sZW4sIHRvcC0+ZF9uYW1lLm5hbWUpOworCisJLyogTmVnYXRpdmUgZGVudHJ5IC0gZ2l2ZSB1cCAqLworCWlmICghc2ltcGxlX3Bvc2l0aXZlKHRvcCkpCisJCXJldHVybiAwOworCisJLyogVGltZW91dCBvZiBhIHRyZWUgbW91bnQgaXMgZGV0ZXJtaW5lZCBieSBpdHMgdG9wIGRlbnRyeSAqLworCWlmICghYXV0b2ZzNF9jYW5fZXhwaXJlKHRvcCwgdGltZW91dCwgZG9fbm93KSkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKK3JlcGVhdDoKKwluZXh0ID0gdGhpc19wYXJlbnQtPmRfc3ViZGlycy5uZXh0OworcmVzdW1lOgorCXdoaWxlIChuZXh0ICE9ICZ0aGlzX3BhcmVudC0+ZF9zdWJkaXJzKSB7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IGRlbnRyeSwgZF9jaGlsZCk7CisKKwkJLyogTmVnYXRpdmUgZGVudHJ5IC0gZ2l2ZSB1cCAqLworCQlpZiAoIXNpbXBsZV9wb3NpdGl2ZShkZW50cnkpKSB7CisJCQluZXh0ID0gbmV4dC0+bmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJRFBSSU5USygiZGVudHJ5ICVwICUuKnMiLAorCQkJZGVudHJ5LCAoaW50KWRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwkJaWYgKCFzaW1wbGVfZW1wdHlfbm9sb2NrKGRlbnRyeSkpIHsKKwkJCXRoaXNfcGFyZW50ID0gZGVudHJ5OworCQkJZ290byByZXBlYXQ7CisJCX0KKworCQlkZW50cnkgPSBkZ2V0KGRlbnRyeSk7CisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisKKwkJaWYgKGRfbW91bnRwb2ludChkZW50cnkpKSB7CisJCQkvKiBGaXJzdCBidXN5ID0+IHRyZWUgYnVzeSAqLworCQkJaWYgKCFhdXRvZnM0X2NoZWNrX21vdW50KG1udCwgZGVudHJ5KSkgeworCQkJCWRwdXQoZGVudHJ5KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCisJCWRwdXQoZGVudHJ5KTsKKwkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJCW5leHQgPSBuZXh0LT5uZXh0OworCX0KKworCWlmICh0aGlzX3BhcmVudCAhPSB0b3ApIHsKKwkJbmV4dCA9IHRoaXNfcGFyZW50LT5kX2NoaWxkLm5leHQ7CisJCXRoaXNfcGFyZW50ID0gdGhpc19wYXJlbnQtPmRfcGFyZW50OworCQlnb3RvIHJlc3VtZTsKKwl9CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqYXV0b2ZzNF9jaGVja19sZWF2ZXMoc3RydWN0IHZmc21vdW50ICptbnQsCisJCQkJCSAgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0LAorCQkJCQkgICBpbnQgZG9fbm93KQoreworCXN0cnVjdCBkZW50cnkgKnRoaXNfcGFyZW50ID0gcGFyZW50OworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CisKKwlEUFJJTlRLKCJwYXJlbnQgJXAgJS4qcyIsCisJCXBhcmVudCwgKGludClwYXJlbnQtPmRfbmFtZS5sZW4sIHBhcmVudC0+ZF9uYW1lLm5hbWUpOworCisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CityZXBlYXQ6CisJbmV4dCA9IHRoaXNfcGFyZW50LT5kX3N1YmRpcnMubmV4dDsKK3Jlc3VtZToKKwl3aGlsZSAobmV4dCAhPSAmdGhpc19wYXJlbnQtPmRfc3ViZGlycykgeworCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCBkZW50cnksIGRfY2hpbGQpOworCisJCS8qIE5lZ2F0aXZlIGRlbnRyeSAtIGdpdmUgdXAgKi8KKwkJaWYgKCFzaW1wbGVfcG9zaXRpdmUoZGVudHJ5KSkgeworCQkJbmV4dCA9IG5leHQtPm5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCURQUklOVEsoImRlbnRyeSAlcCAlLipzIiwKKwkJCWRlbnRyeSwgKGludClkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJCWlmICghbGlzdF9lbXB0eSgmZGVudHJ5LT5kX3N1YmRpcnMpKSB7CisJCQl0aGlzX3BhcmVudCA9IGRlbnRyeTsKKwkJCWdvdG8gcmVwZWF0OworCQl9CisKKwkJZGVudHJ5ID0gZGdldChkZW50cnkpOworCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCisJCWlmIChkX21vdW50cG9pbnQoZGVudHJ5KSkgeworCQkJLyogQ2FuIHdlIGV4cGlyZSB0aGlzIGd1eSAqLworCQkJaWYgKCFhdXRvZnM0X2Nhbl9leHBpcmUoZGVudHJ5LCB0aW1lb3V0LCBkb19ub3cpKQorCQkJCWdvdG8gY29udDsKKworCQkJLyogQ2FuIHdlIHVtb3VudCB0aGlzIGd1eSAqLworCQkJaWYgKGF1dG9mczRfY2hlY2tfbW91bnQobW50LCBkZW50cnkpKQorCQkJCXJldHVybiBkZW50cnk7CisKKwkJfQorY29udDoKKwkJZHB1dChkZW50cnkpOworCQlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwkJbmV4dCA9IG5leHQtPm5leHQ7CisJfQorCisJaWYgKHRoaXNfcGFyZW50ICE9IHBhcmVudCkgeworCQluZXh0ID0gdGhpc19wYXJlbnQtPmRfY2hpbGQubmV4dDsKKwkJdGhpc19wYXJlbnQgPSB0aGlzX3BhcmVudC0+ZF9wYXJlbnQ7CisJCWdvdG8gcmVzdW1lOworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBGaW5kIGFuIGVsaWdpYmxlIHRyZWUgdG8gdGltZS1vdXQKKyAqIEEgdHJlZSBpcyBlbGlnaWJsZSBpZiA6LQorICogIC0gaXQgaXMgdW51c2VkIGJ5IGFueSB1c2VyIHByb2Nlc3MKKyAqICAtIGl0IGhhcyBiZWVuIHVudXNlZCBmb3IgZXhwX3RpbWVvdXQgdGltZQorICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqYXV0b2ZzNF9leHBpcmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgIHN0cnVjdCB2ZnNtb3VudCAqbW50LAorCQkJCSAgICAgc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksCisJCQkJICAgICBpbnQgaG93KQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlzdHJ1Y3QgZGVudHJ5ICpyb290ID0gc2ItPnNfcm9vdDsKKwlzdHJ1Y3QgZGVudHJ5ICpleHBpcmVkID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0OworCWludCBkb19ub3cgPSBob3cgJiBBVVRPRlNfRVhQX0lNTUVESUFURTsKKwlpbnQgZXhwX2xlYXZlcyA9IGhvdyAmIEFVVE9GU19FWFBfTEVBVkVTOworCisJaWYgKCAhc2JpLT5leHBfdGltZW91dCB8fCAhcm9vdCApCisJCXJldHVybiBOVUxMOworCisJbm93ID0gamlmZmllczsKKwl0aW1lb3V0ID0gc2JpLT5leHBfdGltZW91dDsKKworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCW5leHQgPSByb290LT5kX3N1YmRpcnMubmV4dDsKKworCS8qIE9uIGV4aXQgZnJvbSB0aGUgbG9vcCBleHBpcmUgaXMgc2V0IHRvIGEgZGdvdCBkZW50cnkKKwkgKiB0byBleHBpcmUgb3IgaXQncyBOVUxMICovCisJd2hpbGUgKCBuZXh0ICE9ICZyb290LT5kX3N1YmRpcnMgKSB7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IGRlbnRyeSwgZF9jaGlsZCk7CisKKwkJLyogTmVnYXRpdmUgZGVudHJ5IC0gZ2l2ZSB1cCAqLworCQlpZiAoICFzaW1wbGVfcG9zaXRpdmUoZGVudHJ5KSApIHsKKwkJCW5leHQgPSBuZXh0LT5uZXh0OworCQkJY29udGludWU7CisJCX0KKworCQlkZW50cnkgPSBkZ2V0KGRlbnRyeSk7CisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisKKwkJLyogQ2FzZSAxOiBpbmRpcmVjdCBtb3VudCBvciB0b3AgbGV2ZWwgZGlyZWN0IG1vdW50ICovCisJCWlmIChkX21vdW50cG9pbnQoZGVudHJ5KSkgeworCQkJRFBSSU5USygiY2hlY2tpbmcgbW91bnRwb2ludCAlcCAlLipzIiwKKwkJCQlkZW50cnksIChpbnQpZGVudHJ5LT5kX25hbWUubGVuLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCQkJLyogQ2FuIHdlIGV4cGlyZSB0aGlzIGd1eSAqLworCQkJaWYgKCFhdXRvZnM0X2Nhbl9leHBpcmUoZGVudHJ5LCB0aW1lb3V0LCBkb19ub3cpKQorCQkJCWdvdG8gbmV4dDsKKworCQkJLyogQ2FuIHdlIHVtb3VudCB0aGlzIGd1eSAqLworCQkJaWYgKGF1dG9mczRfY2hlY2tfbW91bnQobW50LCBkZW50cnkpKSB7CisJCQkJZXhwaXJlZCA9IGRlbnRyeTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCWlmICggc2ltcGxlX2VtcHR5KGRlbnRyeSkgKQorCQkJZ290byBuZXh0OworCisJCS8qIENhc2UgMjogdHJlZSBtb3VudCwgZXhwaXJlIGlmZiBlbnRpcmUgdHJlZSBpcyBub3QgYnVzeSAqLworCQlpZiAoIWV4cF9sZWF2ZXMpIHsKKwkJCWlmIChhdXRvZnM0X2NoZWNrX3RyZWUobW50LCBkZW50cnksIHRpbWVvdXQsIGRvX25vdykpIHsKKwkJCWV4cGlyZWQgPSBkZW50cnk7CisJCQlicmVhazsKKwkJCX0KKwkJLyogQ2FzZSAzOiBkaXJlY3QgbW91bnQsIGV4cGlyZSBpbmRpdmlkdWFsIGxlYXZlcyAqLworCQl9IGVsc2UgeworCQkJZXhwaXJlZCA9IGF1dG9mczRfY2hlY2tfbGVhdmVzKG1udCwgZGVudHJ5LCB0aW1lb3V0LCBkb19ub3cpOworCQkJaWYgKGV4cGlyZWQpIHsKKwkJCQlkcHV0KGRlbnRyeSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KK25leHQ6CisJCWRwdXQoZGVudHJ5KTsKKwkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJCW5leHQgPSBuZXh0LT5uZXh0OworCX0KKworCWlmICggZXhwaXJlZCApIHsKKwkJRFBSSU5USygicmV0dXJuaW5nICVwICUuKnMiLAorCQkJZXhwaXJlZCwgKGludClleHBpcmVkLT5kX25hbWUubGVuLCBleHBpcmVkLT5kX25hbWUubmFtZSk7CisJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCQlsaXN0X2RlbCgmZXhwaXJlZC0+ZF9wYXJlbnQtPmRfc3ViZGlycyk7CisJCWxpc3RfYWRkKCZleHBpcmVkLT5kX3BhcmVudC0+ZF9zdWJkaXJzLCAmZXhwaXJlZC0+ZF9jaGlsZCk7CisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCXJldHVybiBleHBpcmVkOworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFBlcmZvcm0gYW4gZXhwaXJ5IG9wZXJhdGlvbiAqLworaW50IGF1dG9mczRfZXhwaXJlX3J1bihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkgICAgICBzdHJ1Y3QgdmZzbW91bnQgKm1udCwKKwkJICAgICAgc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksCisJCSAgICAgIHN0cnVjdCBhdXRvZnNfcGFja2V0X2V4cGlyZSBfX3VzZXIgKnBrdF9wKQoreworCXN0cnVjdCBhdXRvZnNfcGFja2V0X2V4cGlyZSBwa3Q7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCisJbWVtc2V0KCZwa3QsMCxzaXplb2YgcGt0KTsKKworCXBrdC5oZHIucHJvdG9fdmVyc2lvbiA9IHNiaS0+dmVyc2lvbjsKKwlwa3QuaGRyLnR5cGUgPSBhdXRvZnNfcHR5cGVfZXhwaXJlOworCisJaWYgKChkZW50cnkgPSBhdXRvZnM0X2V4cGlyZShzYiwgbW50LCBzYmksIDApKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXBrdC5sZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJbWVtY3B5KHBrdC5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLCBwa3QubGVuKTsKKwlwa3QubmFtZVtwa3QubGVuXSA9ICdcMCc7CisJZHB1dChkZW50cnkpOworCisJaWYgKCBjb3B5X3RvX3VzZXIocGt0X3AsICZwa3QsIHNpemVvZihzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9leHBpcmUpKSApCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGwgcmVwZWF0ZWRseSB1bnRpbCBpdCByZXR1cm5zIC1FQUdBSU4sIG1lYW5pbmcgdGhlcmUncyBub3RoaW5nCisgICBtb3JlIHRvIGJlIGRvbmUgKi8KK2ludCBhdXRvZnM0X2V4cGlyZV9tdWx0aShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCwKKwkJCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpLCBpbnQgX191c2VyICphcmcpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCWludCByZXQgPSAtRUFHQUlOOworCWludCBkb19ub3cgPSAwOworCisJaWYgKGFyZyAmJiBnZXRfdXNlcihkb19ub3csIGFyZykpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKChkZW50cnkgPSBhdXRvZnM0X2V4cGlyZShzYiwgbW50LCBzYmksIGRvX25vdykpICE9IE5VTEwpIHsKKwkJc3RydWN0IGF1dG9mc19pbmZvICpkZV9pbmZvID0gYXV0b2ZzNF9kZW50cnlfaW5vKGRlbnRyeSk7CisKKwkJLyogVGhpcyBpcyBzeW5jaHJvbm91cyBiZWNhdXNlIGl0IG1ha2VzIHRoZSBkYWVtb24gYQorICAgICAgICAgICAgICAgICAgIGxpdHRsZSBlYXNpZXIgKi8KKwkJZGVfaW5mby0+ZmxhZ3MgfD0gQVVUT0ZTX0lORl9FWFBJUklORzsKKwkJcmV0ID0gYXV0b2ZzNF93YWl0KHNiaSwgZGVudHJ5LCBORllfRVhQSVJFKTsKKwkJZGVfaW5mby0+ZmxhZ3MgJj0gfkFVVE9GU19JTkZfRVhQSVJJTkc7CisJCWRwdXQoZGVudHJ5KTsKKwl9CisJCQorCXJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvaW5pdC5jIGIvZnMvYXV0b2ZzNC9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNlY2VjOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2F1dG9mczQvaW5pdC5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qIC0qLSBjIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqIGxpbnV4L2ZzL2F1dG9mcy9pbml0LmMKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTctMTk5OCBUcmFuc21ldGEgQ29ycG9yYXRpb24gLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlICJhdXRvZnNfaS5oIgorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICphdXRvZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgZGF0YSwgYXV0b2ZzNF9maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGF1dG9mc19mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiYXV0b2ZzIiwKKwkuZ2V0X3NiCQk9IGF1dG9mc19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2Fub25fc3VwZXIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2F1dG9mczRfZnModm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmYXV0b2ZzX2ZzX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9hdXRvZnM0X2ZzKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZhdXRvZnNfZnNfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfYXV0b2ZzNF9mcykgCittb2R1bGVfZXhpdChleGl0X2F1dG9mczRfZnMpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L2lub2RlLmMgYi9mcy9hdXRvZnM0L2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyNTYwNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2F1dG9mczQvaW5vZGUuYwpAQCAtMCwwICsxLDMyNCBAQAorLyogLSotIGMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogbGludXgvZnMvYXV0b2ZzL2lub2RlLmMKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTctMTk5OCBUcmFuc21ldGEgQ29ycG9yYXRpb24gLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgImF1dG9mc19pLmgiCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKK3N0YXRpYyB2b2lkIGlub19sbmtmcmVlKHN0cnVjdCBhdXRvZnNfaW5mbyAqaW5vKQoreworCWlmIChpbm8tPnUuc3ltbGluaykgeworCQlrZnJlZShpbm8tPnUuc3ltbGluayk7CisJCWluby0+dS5zeW1saW5rID0gTlVMTDsKKwl9Cit9CisKK3N0cnVjdCBhdXRvZnNfaW5mbyAqYXV0b2ZzNF9pbml0X2lubyhzdHJ1Y3QgYXV0b2ZzX2luZm8gKmlubywKKwkJCQkgICAgIHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpLCBtb2RlX3QgbW9kZSkKK3sKKwlpbnQgcmVpbml0ID0gMTsKKworCWlmIChpbm8gPT0gTlVMTCkgeworCQlyZWluaXQgPSAwOworCQlpbm8gPSBrbWFsbG9jKHNpemVvZigqaW5vKSwgR0ZQX0tFUk5FTCk7CisJfQorCisJaWYgKGlubyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWluby0+ZmxhZ3MgPSAwOworCWluby0+bW9kZSA9IG1vZGU7CisJaW5vLT5pbm9kZSA9IE5VTEw7CisJaW5vLT5kZW50cnkgPSBOVUxMOworCWluby0+c2l6ZSA9IDA7CisKKwlpbm8tPmxhc3RfdXNlZCA9IGppZmZpZXM7CisKKwlpbm8tPnNiaSA9IHNiaTsKKworCWlmIChyZWluaXQgJiYgaW5vLT5mcmVlKQorCQkoaW5vLT5mcmVlKShpbm8pOworCisJbWVtc2V0KCZpbm8tPnUsIDAsIHNpemVvZihpbm8tPnUpKTsKKworCWluby0+ZnJlZSA9IE5VTEw7CisKKwlpZiAoU19JU0xOSyhtb2RlKSkKKwkJaW5vLT5mcmVlID0gaW5vX2xua2ZyZWU7CisKKwlyZXR1cm4gaW5vOworfQorCit2b2lkIGF1dG9mczRfZnJlZV9pbm8oc3RydWN0IGF1dG9mc19pbmZvICppbm8pCit7CisJaWYgKGluby0+ZGVudHJ5KSB7CisJCWluby0+ZGVudHJ5LT5kX2ZzZGF0YSA9IE5VTEw7CisJCWlmIChpbm8tPmRlbnRyeS0+ZF9pbm9kZSkKKwkJCWRwdXQoaW5vLT5kZW50cnkpOworCQlpbm8tPmRlbnRyeSA9IE5VTEw7CisJfQorCWlmIChpbm8tPmZyZWUpCisJCShpbm8tPmZyZWUpKGlubyk7CisJa2ZyZWUoaW5vKTsKK30KKworc3RhdGljIHZvaWQgYXV0b2ZzNF9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSA9IGF1dG9mczRfc2JpKHNiKTsKKworCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCisJaWYgKCAhc2JpLT5jYXRhdG9uaWMgKQorCQlhdXRvZnM0X2NhdGF0b25pY19tb2RlKHNiaSk7IC8qIEZyZWUgd2FpdCBxdWV1ZXMsIGNsb3NlIHBpcGUgKi8KKworCWtmcmVlKHNiaSk7CisKKwlEUFJJTlRLKCJzaHV0dGluZyBkb3duIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBhdXRvZnM0X3NvcHMgPSB7CisJLnB1dF9zdXBlcgk9IGF1dG9mczRfcHV0X3N1cGVyLAorCS5zdGF0ZnMJCT0gc2ltcGxlX3N0YXRmcywKK307CisKK2VudW0ge09wdF9lcnIsIE9wdF9mZCwgT3B0X3VpZCwgT3B0X2dpZCwgT3B0X3BncnAsIE9wdF9taW5wcm90bywgT3B0X21heHByb3RvfTsKKworc3RhdGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0geworCXtPcHRfZmQsICJmZD0ldSJ9LAorCXtPcHRfdWlkLCAidWlkPSV1In0sCisJe09wdF9naWQsICJnaWQ9JXUifSwKKwl7T3B0X3BncnAsICJwZ3JwPSV1In0sCisJe09wdF9taW5wcm90bywgIm1pbnByb3RvPSV1In0sCisJe09wdF9tYXhwcm90bywgIm1heHByb3RvPSV1In0sCisJe09wdF9lcnIsIE5VTEx9Cit9OworCitzdGF0aWMgaW50IHBhcnNlX29wdGlvbnMoY2hhciAqb3B0aW9ucywgaW50ICpwaXBlZmQsIHVpZF90ICp1aWQsIGdpZF90ICpnaWQsCisJCQkgcGlkX3QgKnBncnAsIGludCAqbWlucHJvdG8sIGludCAqbWF4cHJvdG8pCit7CisJY2hhciAqcDsKKwlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJaW50IG9wdGlvbjsKKworCSp1aWQgPSBjdXJyZW50LT51aWQ7CisJKmdpZCA9IGN1cnJlbnQtPmdpZDsKKwkqcGdycCA9IHByb2Nlc3NfZ3JvdXAoY3VycmVudCk7CisKKwkqbWlucHJvdG8gPSBBVVRPRlNfTUlOX1BST1RPX1ZFUlNJT047CisJKm1heHByb3RvID0gQVVUT0ZTX01BWF9QUk9UT19WRVJTSU9OOworCisJKnBpcGVmZCA9IC0xOworCisJaWYgKCFvcHRpb25zKQorCQlyZXR1cm4gMTsKKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpbnQgdG9rZW47CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJY2FzZSBPcHRfZmQ6CisJCQlpZiAobWF0Y2hfaW50KGFyZ3MsIHBpcGVmZCkpCisJCQkJcmV0dXJuIDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfdWlkOgorCQkJaWYgKG1hdGNoX2ludChhcmdzLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMTsKKwkJCSp1aWQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZ2lkOgorCQkJaWYgKG1hdGNoX2ludChhcmdzLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMTsKKwkJCSpnaWQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfcGdycDoKKwkJCWlmIChtYXRjaF9pbnQoYXJncywgJm9wdGlvbikpCisJCQkJcmV0dXJuIDE7CisJCQkqcGdycCA9IG9wdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9taW5wcm90bzoKKwkJCWlmIChtYXRjaF9pbnQoYXJncywgJm9wdGlvbikpCisJCQkJcmV0dXJuIDE7CisJCQkqbWlucHJvdG8gPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbWF4cHJvdG86CisJCQlpZiAobWF0Y2hfaW50KGFyZ3MsICZvcHRpb24pKQorCQkJCXJldHVybiAxOworCQkJKm1heHByb3RvID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gKCpwaXBlZmQgPCAwKTsKK30KKworc3RhdGljIHN0cnVjdCBhdXRvZnNfaW5mbyAqYXV0b2ZzNF9ta3Jvb3Qoc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkpCit7CisJc3RydWN0IGF1dG9mc19pbmZvICppbm87CisKKwlpbm8gPSBhdXRvZnM0X2luaXRfaW5vKE5VTEwsIHNiaSwgU19JRkRJUiB8IDA3NTUpOworCWlmICghaW5vKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBpbm87Cit9CisKK2ludCBhdXRvZnM0X2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBpbm9kZSAqIHJvb3RfaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqIHJvb3Q7CisJc3RydWN0IGZpbGUgKiBwaXBlOworCWludCBwaXBlZmQ7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmk7CisJc3RydWN0IGF1dG9mc19pbmZvICppbm87CisJaW50IG1pbnByb3RvLCBtYXhwcm90bzsKKworCXNiaSA9IChzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKikga21hbGxvYyhzaXplb2YoKnNiaSksIEdGUF9LRVJORUwpOworCWlmICggIXNiaSApCisJCWdvdG8gZmFpbF91bmxvY2s7CisJRFBSSU5USygic3RhcnRpbmcgdXAsIHNiaSA9ICVwIixzYmkpOworCisJbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKCpzYmkpKTsKKworCXMtPnNfZnNfaW5mbyA9IHNiaTsKKwlzYmktPm1hZ2ljID0gQVVUT0ZTX1NCSV9NQUdJQzsKKwlzYmktPmNhdGF0b25pYyA9IDA7CisJc2JpLT5leHBfdGltZW91dCA9IDA7CisJc2JpLT5vel9wZ3JwID0gcHJvY2Vzc19ncm91cChjdXJyZW50KTsKKwlzYmktPnNiID0gczsKKwlzYmktPnZlcnNpb24gPSAwOworCXNiaS0+c3ViX3ZlcnNpb24gPSAwOworCWluaXRfTVVURVgoJnNiaS0+d3Ffc2VtKTsKKwlzYmktPnF1ZXVlcyA9IE5VTEw7CisJcy0+c19ibG9ja3NpemUgPSAxMDI0OworCXMtPnNfYmxvY2tzaXplX2JpdHMgPSAxMDsKKwlzLT5zX21hZ2ljID0gQVVUT0ZTX1NVUEVSX01BR0lDOworCXMtPnNfb3AgPSAmYXV0b2ZzNF9zb3BzOworCXMtPnNfdGltZV9ncmFuID0gMTsKKworCS8qCisJICogR2V0IHRoZSByb290IGlub2RlIGFuZCBkZW50cnksIGJ1dCBkZWZlciBjaGVja2luZyBmb3IgZXJyb3JzLgorCSAqLworCWlubyA9IGF1dG9mczRfbWtyb290KHNiaSk7CisJaWYgKCFpbm8pCisJCWdvdG8gZmFpbF9mcmVlOworCXJvb3RfaW5vZGUgPSBhdXRvZnM0X2dldF9pbm9kZShzLCBpbm8pOworCWtmcmVlKGlubyk7CisJaWYgKCFyb290X2lub2RlKQorCQlnb3RvIGZhaWxfZnJlZTsKKworCXJvb3RfaW5vZGUtPmlfb3AgPSAmYXV0b2ZzNF9yb290X2lub2RlX29wZXJhdGlvbnM7CisJcm9vdF9pbm9kZS0+aV9mb3AgPSAmYXV0b2ZzNF9yb290X29wZXJhdGlvbnM7CisJcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKKwlwaXBlID0gTlVMTDsKKworCWlmICghcm9vdCkKKwkJZ290byBmYWlsX2lwdXQ7CisKKwkvKiBDYW4gdGhpcyBjYWxsIGJsb2NrPyAqLworCWlmIChwYXJzZV9vcHRpb25zKGRhdGEsICZwaXBlZmQsCisJCQkgICZyb290X2lub2RlLT5pX3VpZCwgJnJvb3RfaW5vZGUtPmlfZ2lkLAorCQkJICAmc2JpLT5vel9wZ3JwLAorCQkJICAmbWlucHJvdG8sICZtYXhwcm90bykpIHsKKwkJcHJpbnRrKCJhdXRvZnM6IGNhbGxlZCB3aXRoIGJvZ3VzIG9wdGlvbnNcbiIpOworCQlnb3RvIGZhaWxfZHB1dDsKKwl9CisKKwkvKiBDb3VsZG4ndCB0aGlzIGJlIHRlc3RlZCBlYXJsaWVyPyAqLworCWlmIChtYXhwcm90byA8IEFVVE9GU19NSU5fUFJPVE9fVkVSU0lPTiB8fAorCSAgICBtaW5wcm90byA+IEFVVE9GU19NQVhfUFJPVE9fVkVSU0lPTikgeworCQlwcmludGsoImF1dG9mczoga2VybmVsIGRvZXMgbm90IG1hdGNoIGRhZW1vbiB2ZXJzaW9uICIKKwkJICAgICAgICJkYWVtb24gKCVkLCAlZCkga2VybmVsICglZCwgJWQpXG4iLAorCQkJbWlucHJvdG8sIG1heHByb3RvLAorCQkJQVVUT0ZTX01JTl9QUk9UT19WRVJTSU9OLCBBVVRPRlNfTUFYX1BST1RPX1ZFUlNJT04pOworCQlnb3RvIGZhaWxfZHB1dDsKKwl9CisKKwlzYmktPnZlcnNpb24gPSBtYXhwcm90byA+IEFVVE9GU19NQVhfUFJPVE9fVkVSU0lPTiA/IEFVVE9GU19NQVhfUFJPVE9fVkVSU0lPTiA6IG1heHByb3RvOworCXNiaS0+c3ViX3ZlcnNpb24gPSBBVVRPRlNfUFJPVE9fU1VCVkVSU0lPTjsKKworCURQUklOVEsoInBpcGUgZmQgPSAlZCwgcGdycCA9ICV1IiwgcGlwZWZkLCBzYmktPm96X3BncnApOworCXBpcGUgPSBmZ2V0KHBpcGVmZCk7CisJCisJaWYgKCAhcGlwZSApIHsKKwkJcHJpbnRrKCJhdXRvZnM6IGNvdWxkIG5vdCBvcGVuIHBpcGUgZmlsZSBkZXNjcmlwdG9yXG4iKTsKKwkJZ290byBmYWlsX2RwdXQ7CisJfQorCWlmICggIXBpcGUtPmZfb3AgfHwgIXBpcGUtPmZfb3AtPndyaXRlICkKKwkJZ290byBmYWlsX2ZwdXQ7CisJc2JpLT5waXBlID0gcGlwZTsKKworCS8qCisJICogU3VjY2VzcyEgSW5zdGFsbCB0aGUgcm9vdCBkZW50cnkgbm93IHRvIGluZGljYXRlIGNvbXBsZXRpb24uCisJICovCisJcy0+c19yb290ID0gcm9vdDsKKwlyZXR1cm4gMDsKKwkKKwkvKgorCSAqIEZhaWx1cmUgLi4uIGNsZWFuIHVwLgorCSAqLworZmFpbF9mcHV0OgorCXByaW50aygiYXV0b2ZzOiBwaXBlIGZpbGUgZGVzY3JpcHRvciBkb2VzIG5vdCBjb250YWluIHByb3BlciBvcHNcbiIpOworCWZwdXQocGlwZSk7CisJLyogZmFsbCB0aHJvdWdoICovCitmYWlsX2RwdXQ6CisJZHB1dChyb290KTsKKwlnb3RvIGZhaWxfZnJlZTsKK2ZhaWxfaXB1dDoKKwlwcmludGsoImF1dG9mczogZ2V0IHJvb3QgZGVudHJ5IGZhaWxlZFxuIik7CisJaXB1dChyb290X2lub2RlKTsKK2ZhaWxfZnJlZToKKwlrZnJlZShzYmkpOworZmFpbF91bmxvY2s6CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0cnVjdCBpbm9kZSAqYXV0b2ZzNF9nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQlzdHJ1Y3QgYXV0b2ZzX2luZm8gKmluZikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmV3X2lub2RlKHNiKTsKKworCWlmIChpbm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWluZi0+aW5vZGUgPSBpbm9kZTsKKwlpbm9kZS0+aV9tb2RlID0gaW5mLT5tb2RlOworCWlmIChzYi0+c19yb290KSB7CisJCWlub2RlLT5pX3VpZCA9IHNiLT5zX3Jvb3QtPmRfaW5vZGUtPmlfdWlkOworCQlpbm9kZS0+aV9naWQgPSBzYi0+c19yb290LT5kX2lub2RlLT5pX2dpZDsKKwl9IGVsc2UgeworCQlpbm9kZS0+aV91aWQgPSAwOworCQlpbm9kZS0+aV9naWQgPSAwOworCX0KKwlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCWlub2RlLT5pX2Jsb2NrcyA9IDA7CisJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCisJaWYgKFNfSVNESVIoaW5mLT5tb2RlKSkgeworCQlpbm9kZS0+aV9ubGluayA9IDI7CisJCWlub2RlLT5pX29wID0gJmF1dG9mczRfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZhdXRvZnM0X2Rpcl9vcGVyYXRpb25zOworCX0gZWxzZSBpZiAoU19JU0xOSyhpbmYtPm1vZGUpKSB7CisJCWlub2RlLT5pX3NpemUgPSBpbmYtPnNpemU7CisJCWlub2RlLT5pX29wID0gJmF1dG9mczRfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCX0KKworCXJldHVybiBpbm9kZTsKK30KZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvcm9vdC5jIGIvZnMvYXV0b2ZzNC9yb290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2NWMwNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2F1dG9mczQvcm9vdC5jCkBAIC0wLDAgKzEsODA4IEBACisvKiAtKi0gYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiBsaW51eC9mcy9hdXRvZnMvcm9vdC5jCisgKgorICogIENvcHlyaWdodCAxOTk3LTE5OTggVHJhbnNtZXRhIENvcnBvcmF0aW9uIC0tIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICBDb3B5cmlnaHQgMTk5OS0yMDAwIEplcmVteSBGaXR6aGFyZGluZ2UgPGplcmVteUBnb29wLm9yZz4KKyAqICBDb3B5cmlnaHQgMjAwMS0yMDAzIElhbiBLZW50IDxyYXZlbkB0aGVtYXcubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSAiYXV0b2ZzX2kuaCIKKworc3RhdGljIGludCBhdXRvZnM0X2Rpcl9zeW1saW5rKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKixjb25zdCBjaGFyICopOworc3RhdGljIGludCBhdXRvZnM0X2Rpcl91bmxpbmsoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqKTsKK3N0YXRpYyBpbnQgYXV0b2ZzNF9kaXJfcm1kaXIoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqKTsKK3N0YXRpYyBpbnQgYXV0b2ZzNF9kaXJfbWtkaXIoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqLGludCk7CitzdGF0aWMgaW50IGF1dG9mczRfcm9vdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKix1bnNpZ25lZCBpbnQsdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgaW50IGF1dG9mczRfZGlyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBhdXRvZnM0X2Rpcl9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGF1dG9mczRfZGlyX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcik7CitzdGF0aWMgaW50IGF1dG9mczRfcm9vdF9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpOworc3RhdGljIHN0cnVjdCBkZW50cnkgKmF1dG9mczRfbG9va3VwKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IG5hbWVpZGF0YSAqKTsKK3N0YXRpYyBpbnQgYXV0b2ZzNF9kY2FjaGVfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCB2b2lkICosIGZpbGxkaXJfdCk7CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXV0b2ZzNF9yb290X29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gZGNhY2hlX2Rpcl9vcGVuLAorCS5yZWxlYXNlCT0gZGNhY2hlX2Rpcl9jbG9zZSwKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gYXV0b2ZzNF9yb290X3JlYWRkaXIsCisJLmlvY3RsCQk9IGF1dG9mczRfcm9vdF9pb2N0bCwKK307CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXV0b2ZzNF9kaXJfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBhdXRvZnM0X2Rpcl9vcGVuLAorCS5yZWxlYXNlCT0gYXV0b2ZzNF9kaXJfY2xvc2UsCisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IGF1dG9mczRfZGlyX3JlYWRkaXIsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBhdXRvZnM0X3Jvb3RfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IGF1dG9mczRfbG9va3VwLAorCS51bmxpbmsJCT0gYXV0b2ZzNF9kaXJfdW5saW5rLAorCS5zeW1saW5rCT0gYXV0b2ZzNF9kaXJfc3ltbGluaywKKwkubWtkaXIJCT0gYXV0b2ZzNF9kaXJfbWtkaXIsCisJLnJtZGlyCQk9IGF1dG9mczRfZGlyX3JtZGlyLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYXV0b2ZzNF9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IGF1dG9mczRfbG9va3VwLAorCS51bmxpbmsJCT0gYXV0b2ZzNF9kaXJfdW5saW5rLAorCS5zeW1saW5rCT0gYXV0b2ZzNF9kaXJfc3ltbGluaywKKwkubWtkaXIJCT0gYXV0b2ZzNF9kaXJfbWtkaXIsCisJLnJtZGlyCQk9IGF1dG9mczRfZGlyX3JtZGlyLAorfTsKKworc3RhdGljIGludCBhdXRvZnM0X3Jvb3RfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZGlyZW50LAorCQkJCWZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpID0gYXV0b2ZzNF9zYmkoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCWludCBvel9tb2RlID0gYXV0b2ZzNF9vel9tb2RlKHNiaSk7CisKKwlEUFJJTlRLKCJjYWxsZWQsIGZpbHAtPmZfcG9zID0gJWxsZCIsIGZpbGUtPmZfcG9zKTsKKworCS8qCisJICogRG9uJ3Qgc2V0IHJlZ2hvc3QgZmxhZyBpZjoKKwkgKiAxKSBmX3BvcyBpcyBsYXJnZXIgdGhhbiB6ZXJvIC0tIHdlJ3ZlIGFscmVhZHkgYmVlbiBoZXJlLgorCSAqIDIpIHdlIGhhdmVuJ3QgZXZlbiBlbmFibGVkIHJlZ2hvc3RpbmcgaW4gdGhlIDFzdCBwbGFjZS4KKwkgKiAzKSB0aGlzIGlzIHRoZSBkYWVtb24gZG9pbmcgYSByZWFkZGlyCisJICovCisJaWYgKG96X21vZGUgJiYgZmlsZS0+Zl9wb3MgPT0gMCAmJiBzYmktPnJlZ2hvc3RfZW5hYmxlZCkKKwkJc2JpLT5uZWVkc19yZWdob3N0ID0gMTsKKworCURQUklOVEsoIm5lZWRzX3JlZ2hvc3QgPSAlZCIsIHNiaS0+bmVlZHNfcmVnaG9zdCk7CisKKwlyZXR1cm4gYXV0b2ZzNF9kY2FjaGVfcmVhZGRpcihmaWxlLCBkaXJlbnQsIGZpbGxkaXIpOworfQorCisvKiBVcGRhdGUgdXNhZ2UgZnJvbSBoZXJlIHRvIHRvcCBvZiB0cmVlLCBzbyB0aGF0IHNjYW4gb2YKKyAgIHRvcC1sZXZlbCBkaXJlY3RvcmllcyB3aWxsIGdpdmUgYSB1c2VmdWwgcmVzdWx0ICovCitzdGF0aWMgdm9pZCBhdXRvZnM0X3VwZGF0ZV91c2FnZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGRlbnRyeSAqdG9wID0gZGVudHJ5LT5kX3NiLT5zX3Jvb3Q7CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwlmb3IoOyBkZW50cnkgIT0gdG9wOyBkZW50cnkgPSBkZW50cnktPmRfcGFyZW50KSB7CisJCXN0cnVjdCBhdXRvZnNfaW5mbyAqaW5vID0gYXV0b2ZzNF9kZW50cnlfaW5vKGRlbnRyeSk7CisKKwkJaWYgKGlubykgeworCQkJdXBkYXRlX2F0aW1lKGRlbnRyeS0+ZF9pbm9kZSk7CisJCQlpbm8tPmxhc3RfdXNlZCA9IGppZmZpZXM7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKK30KKworLyoKKyAqIEZyb20gMi40IGtlcm5lbCByZWFkZGlyLmMKKyAqLworc3RhdGljIGludCBhdXRvZnM0X2RjYWNoZV9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJaW50IGk7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlscC0+Zl9kZW50cnk7CisKKwlpID0gZmlscC0+Zl9wb3M7CisJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4iLCAxLCBpLCBkZW50cnktPmRfaW5vZGUtPmlfaW5vLCBEVF9ESVIpIDwgMCkKKwkJCQlicmVhazsKKwkJCWkrKzsKKwkJCWZpbHAtPmZfcG9zKys7CisJCQkvKiBmYWxsdGhyb3VnaCAqLworCQljYXNlIDE6CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIGksIGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfaW5vLCBEVF9ESVIpIDwgMCkKKwkJCQlicmVhazsKKwkJCWkrKzsKKwkJCWZpbHAtPmZfcG9zKys7CisJCQkvKiBmYWxsdGhyb3VnaCAqLworCQlkZWZhdWx0OiB7CisJCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCQkJaW50IGogPSBpLTI7CisKKwkJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCQkJbGlzdCA9IGRlbnRyeS0+ZF9zdWJkaXJzLm5leHQ7CisKKwkJCWZvciAoOzspIHsKKwkJCQlpZiAobGlzdCA9PSAmZGVudHJ5LT5kX3N1YmRpcnMpIHsKKwkJCQkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCWlmICghaikKKwkJCQkJYnJlYWs7CisJCQkJai0tOworCQkJCWxpc3QgPSBsaXN0LT5uZXh0OworCQkJfQorCisJCQl3aGlsZSgxKSB7CisJCQkJc3RydWN0IGRlbnRyeSAqZGUgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBkZW50cnksIGRfY2hpbGQpOworCisJCQkJaWYgKCFkX3VuaGFzaGVkKGRlKSAmJiBkZS0+ZF9pbm9kZSkgeworCQkJCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQkJCQlpZiAoZmlsbGRpcihkaXJlbnQsIGRlLT5kX25hbWUubmFtZSwgZGUtPmRfbmFtZS5sZW4sIGZpbHAtPmZfcG9zLCBkZS0+ZF9pbm9kZS0+aV9pbm8sIERUX1VOS05PV04pIDwgMCkKKwkJCQkJCWJyZWFrOworCQkJCQlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwkJCQl9CisJCQkJZmlscC0+Zl9wb3MrKzsKKwkJCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJCQlpZiAobGlzdCAhPSAmZGVudHJ5LT5kX3N1YmRpcnMpCisJCQkJCWNvbnRpbnVlOworCQkJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXV0b2ZzNF9kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IGZpbGUtPmZfdmZzbW50OworCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpID0gYXV0b2ZzNF9zYmkoZGVudHJ5LT5kX3NiKTsKKwlpbnQgc3RhdHVzOworCisJRFBSSU5USygiZmlsZT0lcCBkZW50cnk9JXAgJS4qcyIsCisJCWZpbGUsIGRlbnRyeSwgZGVudHJ5LT5kX25hbWUubGVuLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWlmIChhdXRvZnM0X296X21vZGUoc2JpKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoYXV0b2ZzNF9pc3BlbmRpbmcoZGVudHJ5KSkgeworCQlEUFJJTlRLKCJkZW50cnkgYnVzeSIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICghZF9tb3VudHBvaW50KGRlbnRyeSkgJiYgZGVudHJ5LT5kX29wICYmIGRlbnRyeS0+ZF9vcC0+ZF9yZXZhbGlkYXRlKSB7CisJCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJCWludCBlbXB0eTsKKworCQkvKiBJbiBjYXNlIHRoZXJlIGFyZSBzdGFsZSBkaXJlY3RvcnkgZGVudHJ5cyBmcm9tIGEgZmFpbGVkIG1vdW50ICovCisJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCQllbXB0eSA9IGxpc3RfZW1wdHkoJmRlbnRyeS0+ZF9zdWJkaXJzKTsKKwkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKworCQlpZiAoIWVtcHR5KQorCQkJZF9pbnZhbGlkYXRlKGRlbnRyeSk7CisKKwkJbmQuZmxhZ3MgPSBMT09LVVBfRElSRUNUT1JZOworCQlzdGF0dXMgPSAoZGVudHJ5LT5kX29wLT5kX3JldmFsaWRhdGUpKGRlbnRyeSwgJm5kKTsKKworCQlpZiAoIXN0YXR1cykKKwkJCXJldHVybiAtRU5PRU5UOworCX0KKworCWlmIChkX21vdW50cG9pbnQoZGVudHJ5KSkgeworCQlzdHJ1Y3QgZmlsZSAqZnAgPSBOVUxMOworCQlzdHJ1Y3QgdmZzbW91bnQgKmZwX21udCA9IG1udGdldChtbnQpOworCQlzdHJ1Y3QgZGVudHJ5ICpmcF9kZW50cnkgPSBkZ2V0KGRlbnRyeSk7CisKKwkJd2hpbGUgKGZvbGxvd19kb3duKCZmcF9tbnQsICZmcF9kZW50cnkpICYmIGRfbW91bnRwb2ludChmcF9kZW50cnkpKTsKKworCQlmcCA9IGRlbnRyeV9vcGVuKGZwX2RlbnRyeSwgZnBfbW50LCBmaWxlLT5mX2ZsYWdzKTsKKwkJc3RhdHVzID0gUFRSX0VSUihmcCk7CisJCWlmIChJU19FUlIoZnApKSB7CisJCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBmcDsKKwl9CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXV0b2ZzNF9kaXJfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnM0X3NiaShkZW50cnktPmRfc2IpOworCisJRFBSSU5USygiZmlsZT0lcCBkZW50cnk9JXAgJS4qcyIsCisJCWZpbGUsIGRlbnRyeSwgZGVudHJ5LT5kX25hbWUubGVuLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWlmIChhdXRvZnM0X296X21vZGUoc2JpKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoYXV0b2ZzNF9pc3BlbmRpbmcoZGVudHJ5KSkgeworCQlEUFJJTlRLKCJkZW50cnkgYnVzeSIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChkX21vdW50cG9pbnQoZGVudHJ5KSkgeworCQlzdHJ1Y3QgZmlsZSAqZnAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwkJaWYgKCFmcCkKKwkJCXJldHVybiAtRU5PRU5UOworCisJCWZpbHBfY2xvc2UoZnAsIGN1cnJlbnQtPmZpbGVzKTsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwl9CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXV0b2ZzNF9kaXJfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSA9IGF1dG9mczRfc2JpKGRlbnRyeS0+ZF9zYik7CisJaW50IHN0YXR1czsKKworCURQUklOVEsoImZpbGU9JXAgZGVudHJ5PSVwICUuKnMiLAorCQlmaWxlLCBkZW50cnksIGRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlpZiAoYXV0b2ZzNF9vel9tb2RlKHNiaSkpCisJCWdvdG8gb3V0OworCisJaWYgKGF1dG9mczRfaXNwZW5kaW5nKGRlbnRyeSkpIHsKKwkJRFBSSU5USygiZGVudHJ5IGJ1c3kiKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoZF9tb3VudHBvaW50KGRlbnRyeSkpIHsKKwkJc3RydWN0IGZpbGUgKmZwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJCWlmICghZnApCisJCQlyZXR1cm4gLUVOT0VOVDsKKworCQlpZiAoIWZwLT5mX29wIHx8ICFmcC0+Zl9vcC0+cmVhZGRpcikKKwkJCWdvdG8gb3V0OworCisJCXN0YXR1cyA9IHZmc19yZWFkZGlyKGZwLCBmaWxsZGlyLCBkaXJlbnQpOworCQlmaWxlLT5mX3BvcyA9IGZwLT5mX3BvczsKKwkJaWYgKHN0YXR1cykKKwkJCWF1dG9mczRfY29weV9hdGltZShmaWxlLCBmcCk7CisJCXJldHVybiBzdGF0dXM7CisJfQorb3V0OgorCXJldHVybiBhdXRvZnM0X2RjYWNoZV9yZWFkZGlyKGZpbGUsIGRpcmVudCwgZmlsbGRpcik7Cit9CisKK3N0YXRpYyBpbnQgdHJ5X3RvX2ZpbGxfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgCisJCQkgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICAgICAgc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgYXV0b2ZzX2luZm8gKmRlX2luZm8gPSBhdXRvZnM0X2RlbnRyeV9pbm8oZGVudHJ5KTsKKwlpbnQgc3RhdHVzID0gMDsKKworCS8qIEJsb2NrIG9uIGFueSBwZW5kaW5nIGV4cGlyeSBoZXJlOyBpbnZhbGlkYXRlIHRoZSBkZW50cnkKKyAgICAgICAgICAgd2hlbiBleHBpcmF0aW9uIGlzIGRvbmUgdG8gdHJpZ2dlciBtb3VudCByZXF1ZXN0IHdpdGggYSBuZXcKKyAgICAgICAgICAgZGVudHJ5ICovCisJaWYgKGRlX2luZm8gJiYgKGRlX2luZm8tPmZsYWdzICYgQVVUT0ZTX0lORl9FWFBJUklORykpIHsKKwkJRFBSSU5USygid2FpdGluZyBmb3IgZXhwaXJlICVwIG5hbWU9JS4qcyIsCisJCQkgZGVudHJ5LCBkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJCXN0YXR1cyA9IGF1dG9mczRfd2FpdChzYmksIGRlbnRyeSwgTkZZX05PTkUpOworCQkKKwkJRFBSSU5USygiZXhwaXJlIGRvbmUgc3RhdHVzPSVkIiwgc3RhdHVzKTsKKwkJCisJCXJldHVybiAwOworCX0KKworCURQUklOVEsoImRlbnRyeT0lcCAlLipzIGlubz0lcCIsCisJCSBkZW50cnksIGRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX2lub2RlKTsKKworCS8qIFdhaXQgZm9yIGEgcGVuZGluZyBtb3VudCwgdHJpZ2dlcmluZyBvbmUgaWYgdGhlcmUgaXNuJ3Qgb25lIGFscmVhZHkgKi8KKwlpZiAoZGVudHJ5LT5kX2lub2RlID09IE5VTEwpIHsKKwkJRFBSSU5USygid2FpdGluZyBmb3IgbW91bnQgbmFtZT0lLipzIiwKKwkJCSBkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJCXN0YXR1cyA9IGF1dG9mczRfd2FpdChzYmksIGRlbnRyeSwgTkZZX01PVU5UKTsKKwkJIAorCQlEUFJJTlRLKCJtb3VudCBkb25lIHN0YXR1cz0lZCIsIHN0YXR1cyk7CisKKwkJaWYgKHN0YXR1cyAmJiBkZW50cnktPmRfaW5vZGUpCisJCQlyZXR1cm4gMDsgLyogVHJ5IHRvIGdldCB0aGUga2VybmVsIHRvIGludmFsaWRhdGUgdGhpcyBkZW50cnkgKi8KKwkJCisJCS8qIFR1cm4gdGhpcyBpbnRvIGEgcmVhbCBuZWdhdGl2ZSBkZW50cnk/ICovCisJCWlmIChzdGF0dXMgPT0gLUVOT0VOVCkgeworCQkJZGVudHJ5LT5kX3RpbWUgPSBqaWZmaWVzICsgQVVUT0ZTX05FR0FUSVZFX1RJTUVPVVQ7CisJCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJCWRlbnRyeS0+ZF9mbGFncyAmPSB+RENBQ0hFX0FVVE9GU19QRU5ESU5HOworCQkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJCXJldHVybiAxOworCQl9IGVsc2UgaWYgKHN0YXR1cykgeworCQkJLyogUmV0dXJuIGEgbmVnYXRpdmUgZGVudHJ5LCBidXQgbGVhdmUgaXQgInBlbmRpbmciICovCisJCQlyZXR1cm4gMTsKKwkJfQorCS8qIFRyaWdnZXIgbW91bnQgZm9yIHBhdGggY29tcG9uZW50IG9yIGZvbGxvdyBsaW5rICovCisJfSBlbHNlIGlmIChmbGFncyAmIChMT09LVVBfQ09OVElOVUUgfCBMT09LVVBfRElSRUNUT1JZKSB8fAorCQkJY3VycmVudC0+bGlua19jb3VudCkgeworCQlEUFJJTlRLKCJ3YWl0aW5nIGZvciBtb3VudCBuYW1lPSUuKnMiLAorCQkJZGVudHJ5LT5kX25hbWUubGVuLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJZGVudHJ5LT5kX2ZsYWdzIHw9IERDQUNIRV9BVVRPRlNfUEVORElORzsKKwkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJc3RhdHVzID0gYXV0b2ZzNF93YWl0KHNiaSwgZGVudHJ5LCBORllfTU9VTlQpOworCisJCURQUklOVEsoIm1vdW50IGRvbmUgc3RhdHVzPSVkIiwgc3RhdHVzKTsKKworCQlpZiAoc3RhdHVzKSB7CisJCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJCWRlbnRyeS0+ZF9mbGFncyAmPSB+RENBQ0hFX0FVVE9GU19QRU5ESU5HOworCQkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogV2UgZG9uJ3QgdXBkYXRlIHRoZSB1c2FnZXMgZm9yIHRoZSBhdXRvZnMgZGFlbW9uIGl0c2VsZiwgdGhpcworCSAgIGlzIG5lY2Vzc2FyeSBmb3IgcmVjdXJzaXZlIGF1dG9mcyBtb3VudHMgKi8KKwlpZiAoIWF1dG9mczRfb3pfbW9kZShzYmkpKQorCQlhdXRvZnM0X3VwZGF0ZV91c2FnZShkZW50cnkpOworCisJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJZGVudHJ5LT5kX2ZsYWdzICY9IH5EQ0FDSEVfQVVUT0ZTX1BFTkRJTkc7CisJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJldmFsaWRhdGUgaXMgY2FsbGVkIG9uIGV2ZXJ5IGNhY2hlIGxvb2t1cC4gIFNvbWUgb2YgdGhvc2UKKyAqIGNhY2hlIGxvb2t1cHMgbWF5IGFjdHVhbGx5IGhhcHBlbiB3aGlsZSB0aGUgZGVudHJ5IGlzIG5vdAorICogeWV0IGNvbXBsZXRlbHkgZmlsbGVkIGluLCBhbmQgcmV2YWxpZGF0ZSBoYXMgdG8gZGVsYXkgc3VjaAorICogbG9va3Vwcy4uCisgKi8KK3N0YXRpYyBpbnQgYXV0b2ZzNF9yZXZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqIGRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnM0X3NiaShkaXItPmlfc2IpOworCWludCBvel9tb2RlID0gYXV0b2ZzNF9vel9tb2RlKHNiaSk7CisJaW50IGZsYWdzID0gbmQgPyBuZC0+ZmxhZ3MgOiAwOworCWludCBzdGF0dXMgPSAxOworCisJLyogUGVuZGluZyBkZW50cnkgKi8KKwlpZiAoYXV0b2ZzNF9pc3BlbmRpbmcoZGVudHJ5KSkgeworCQlpZiAoIW96X21vZGUpCisJCQlzdGF0dXMgPSB0cnlfdG9fZmlsbF9kZW50cnkoZGVudHJ5LCBkaXItPmlfc2IsIHNiaSwgZmxhZ3MpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIE5lZ2F0aXZlIGRlbnRyeS4uIGludmFsaWRhdGUgaWYgIm9sZCIgKi8KKwlpZiAoZGVudHJ5LT5kX2lub2RlID09IE5VTEwpCisJCXJldHVybiAoZGVudHJ5LT5kX3RpbWUgLSBqaWZmaWVzIDw9IEFVVE9GU19ORUdBVElWRV9USU1FT1VUKTsKKworCS8qIENoZWNrIGZvciBhIG5vbi1tb3VudHBvaW50IGRpcmVjdG9yeSB3aXRoIG5vIGNvbnRlbnRzICovCisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJaWYgKFNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpICYmCisJICAgICFkX21vdW50cG9pbnQoZGVudHJ5KSAmJiAKKwkgICAgbGlzdF9lbXB0eSgmZGVudHJ5LT5kX3N1YmRpcnMpKSB7CisJCURQUklOVEsoImRlbnRyeT0lcCAlLipzLCBlbXB0eWRpciIsCisJCQkgZGVudHJ5LCBkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQlpZiAoIW96X21vZGUpCisJCQlzdGF0dXMgPSB0cnlfdG9fZmlsbF9kZW50cnkoZGVudHJ5LCBkaXItPmlfc2IsIHNiaSwgZmxhZ3MpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCisJLyogVXBkYXRlIHRoZSB1c2FnZSBsaXN0ICovCisJaWYgKCFvel9tb2RlKQorCQlhdXRvZnM0X3VwZGF0ZV91c2FnZShkZW50cnkpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGF1dG9mczRfZGVudHJ5X3JlbGVhc2Uoc3RydWN0IGRlbnRyeSAqZGUpCit7CisJc3RydWN0IGF1dG9mc19pbmZvICppbmY7CisKKwlEUFJJTlRLKCJyZWxlYXNpbmcgJXAiLCBkZSk7CisKKwlpbmYgPSBhdXRvZnM0X2RlbnRyeV9pbm8oZGUpOworCWRlLT5kX2ZzZGF0YSA9IE5VTEw7CisKKwlpZiAoaW5mKSB7CisJCWluZi0+ZGVudHJ5ID0gTlVMTDsKKwkJaW5mLT5pbm9kZSA9IE5VTEw7CisKKwkJYXV0b2ZzNF9mcmVlX2lubyhpbmYpOworCX0KK30KKworLyogRm9yIGRlbnRyaWVzIG9mIGRpcmVjdG9yaWVzIGluIHRoZSByb290IGRpciAqLworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBhdXRvZnM0X3Jvb3RfZGVudHJ5X29wZXJhdGlvbnMgPSB7CisJLmRfcmV2YWxpZGF0ZQk9IGF1dG9mczRfcmV2YWxpZGF0ZSwKKwkuZF9yZWxlYXNlCT0gYXV0b2ZzNF9kZW50cnlfcmVsZWFzZSwKK307CisKKy8qIEZvciBvdGhlciBkZW50cmllcyAqLworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBhdXRvZnM0X2RlbnRyeV9vcGVyYXRpb25zID0geworCS5kX3JldmFsaWRhdGUJPSBhdXRvZnM0X3JldmFsaWRhdGUsCisJLmRfcmVsZWFzZQk9IGF1dG9mczRfZGVudHJ5X3JlbGVhc2UsCit9OworCisvKiBMb29rdXBzIGluIHRoZSByb290IGRpcmVjdG9yeSAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKmF1dG9mczRfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpOworCWludCBvel9tb2RlOworCisJRFBSSU5USygibmFtZSA9ICUuKnMiLAorCQlkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IE5BTUVfTUFYKQorCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsvKiBGaWxlIG5hbWUgdG9vIGxvbmcgdG8gZXhpc3QgKi8KKworCXNiaSA9IGF1dG9mczRfc2JpKGRpci0+aV9zYik7CisKKwlvel9tb2RlID0gYXV0b2ZzNF9vel9tb2RlKHNiaSk7CisJRFBSSU5USygicGlkID0gJXUsIHBncnAgPSAldSwgY2F0YXRvbmljID0gJWQsIG96X21vZGUgPSAlZCIsCisJCSBjdXJyZW50LT5waWQsIHByb2Nlc3NfZ3JvdXAoY3VycmVudCksIHNiaS0+Y2F0YXRvbmljLCBvel9tb2RlKTsKKworCS8qCisJICogTWFyayB0aGUgZGVudHJ5IGluY29tcGxldGUsIGJ1dCBhZGQgaXQuIFRoaXMgaXMgbmVlZGVkIHNvCisJICogdGhhdCB0aGUgVkZTIGxheWVyIGtub3dzIGFib3V0IHRoZSBkZW50cnksIGFuZCB3ZSBjYW4gY291bnQKKwkgKiBvbiBjYXRjaGluZyBhbnkgbG9va3VwcyB0aHJvdWdoIHRoZSByZXZhbGlkYXRlLgorCSAqCisJICogTGV0IGFsbCB0aGUgaGFyZCB3b3JrIGJlIGRvbmUgYnkgdGhlIHJldmFsaWRhdGUgZnVuY3Rpb24gdGhhdAorCSAqIG5lZWRzIHRvIGJlIGFibGUgdG8gZG8gdGhpcyBhbnl3YXkuLgorCSAqCisJICogV2UgbmVlZCB0byBkbyB0aGlzIGJlZm9yZSB3ZSByZWxlYXNlIHRoZSBkaXJlY3Rvcnkgc2VtYXBob3JlLgorCSAqLworCWRlbnRyeS0+ZF9vcCA9ICZhdXRvZnM0X3Jvb3RfZGVudHJ5X29wZXJhdGlvbnM7CisKKwlpZiAoIW96X21vZGUpIHsKKwkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCWRlbnRyeS0+ZF9mbGFncyB8PSBEQ0FDSEVfQVVUT0ZTX1BFTkRJTkc7CisJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJfQorCWRlbnRyeS0+ZF9mc2RhdGEgPSBOVUxMOworCWRfYWRkKGRlbnRyeSwgTlVMTCk7CisKKwlpZiAoZGVudHJ5LT5kX29wICYmIGRlbnRyeS0+ZF9vcC0+ZF9yZXZhbGlkYXRlKSB7CisJCXVwKCZkaXItPmlfc2VtKTsKKwkJKGRlbnRyeS0+ZF9vcC0+ZF9yZXZhbGlkYXRlKShkZW50cnksIG5kKTsKKwkJZG93bigmZGlyLT5pX3NlbSk7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBhcmUgc3RpbGwgcGVuZGluZywgY2hlY2sgaWYgd2UgaGFkIHRvIGhhbmRsZQorCSAqIGEgc2lnbmFsLiBJZiBzbyB3ZSBjYW4gZm9yY2UgYSByZXN0YXJ0Li4KKwkgKi8KKwlpZiAoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX0FVVE9GU19QRU5ESU5HKSB7CisJCS8qIFNlZSBpZiB3ZSB3ZXJlIGludGVycnVwdGVkICovCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJc2lnc2V0X3QgKnNpZ3NldCA9ICZjdXJyZW50LT5wZW5kaW5nLnNpZ25hbDsKKwkJCWlmIChzaWdpc21lbWJlciAoc2lnc2V0LCBTSUdLSUxMKSB8fAorCQkJICAgIHNpZ2lzbWVtYmVyIChzaWdzZXQsIFNJR1FVSVQpIHx8CisJCQkgICAgc2lnaXNtZW1iZXIgKHNpZ3NldCwgU0lHSU5UKSkgeworCQkJICAgIHJldHVybiBFUlJfUFRSKC1FUkVTVEFSVE5PSU5UUik7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHRoaXMgZGVudHJ5IGlzIHVuaGFzaGVkLCB0aGVuIHdlIHNob3VsZG4ndCBob25vdXIgdGhpcworCSAqIGxvb2t1cCBldmVuIGlmIHRoZSBkZW50cnkgaXMgcG9zaXRpdmUuICBSZXR1cm5pbmcgRU5PRU5UIGhlcmUKKwkgKiBkb2Vzbid0IGRvIHRoZSByaWdodCB0aGluZyBmb3IgYWxsIHN5c3RlbSBjYWxscywgYnV0IGl0IHNob3VsZAorCSAqIGJlIE9LIGZvciB0aGUgb3BlcmF0aW9ucyB3ZSBwZXJtaXQgZnJvbSBhbiBhdXRvZnMuCisJICovCisJaWYgKCBkZW50cnktPmRfaW5vZGUgJiYgZF91bmhhc2hlZChkZW50cnkpICkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBhdXRvZnM0X2Rpcl9zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCAKKwkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICAgICAgY29uc3QgY2hhciAqc3ltbmFtZSkKK3sKKwlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSA9IGF1dG9mczRfc2JpKGRpci0+aV9zYik7CisJc3RydWN0IGF1dG9mc19pbmZvICppbm8gPSBhdXRvZnM0X2RlbnRyeV9pbm8oZGVudHJ5KTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWNoYXIgKmNwOworCisJRFBSSU5USygiJXMgPC0gJS4qcyIsIHN5bW5hbWUsCisJCWRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlpZiAoIWF1dG9mczRfb3pfbW9kZShzYmkpKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCWlubyA9IGF1dG9mczRfaW5pdF9pbm8oaW5vLCBzYmksIFNfSUZMTksgfCAwNTU1KTsKKwlpZiAoaW5vID09IE5VTEwpCisJCXJldHVybiAtRU5PU1BDOworCisJaW5vLT5zaXplID0gc3RybGVuKHN5bW5hbWUpOworCWluby0+dS5zeW1saW5rID0gY3AgPSBrbWFsbG9jKGluby0+c2l6ZSArIDEsIEdGUF9LRVJORUwpOworCisJaWYgKGNwID09IE5VTEwpIHsKKwkJa2ZyZWUoaW5vKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJc3RyY3B5KGNwLCBzeW1uYW1lKTsKKworCWlub2RlID0gYXV0b2ZzNF9nZXRfaW5vZGUoZGlyLT5pX3NiLCBpbm8pOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisKKwlpZiAoZGlyID09IGRpci0+aV9zYi0+c19yb290LT5kX2lub2RlKQorCQlkZW50cnktPmRfb3AgPSAmYXV0b2ZzNF9yb290X2RlbnRyeV9vcGVyYXRpb25zOworCWVsc2UKKwkJZGVudHJ5LT5kX29wID0gJmF1dG9mczRfZGVudHJ5X29wZXJhdGlvbnM7CisKKwlkZW50cnktPmRfZnNkYXRhID0gaW5vOworCWluby0+ZGVudHJ5ID0gZGdldChkZW50cnkpOworCWluby0+aW5vZGUgPSBpbm9kZTsKKworCWRpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKKworCXJldHVybiAwOworfQorCisvKgorICogTk9URSEKKyAqCisgKiBOb3JtYWwgZmlsZXN5c3RlbXMgd291bGQgZG8gYSAiZF9kZWxldGUoKSIgdG8gdGVsbCB0aGUgVkZTIGRjYWNoZQorICogdGhhdCB0aGUgZmlsZSBubyBsb25nZXIgZXhpc3RzLiBIb3dldmVyLCBkb2luZyB0aGF0IG1lYW5zIHRoYXQgdGhlCisgKiBWRlMgbGF5ZXIgY2FuIHR1cm4gdGhlIGRlbnRyeSBpbnRvIGEgbmVnYXRpdmUgZGVudHJ5LiAgV2UgZG9uJ3Qgd2FudAorICogdGhpcywgYmVjYXVzZSBzaW5jZSB0aGUgdW5saW5rIGlzIHByb2JhYmx5IHRoZSByZXN1bHQgb2YgYW4gZXhwaXJlLgorICogV2Ugc2ltcGx5IGRfZHJvcCBpdCwgd2hpY2ggYWxsb3dzIHRoZSBkZW50cnkgbG9va3VwIHRvIHJlbW91bnQgaXQKKyAqIGlmIG5lY2Vzc2FyeS4KKyAqCisgKiBJZiBhIHByb2Nlc3MgaXMgYmxvY2tlZCBvbiB0aGUgZGVudHJ5IHdhaXRpbmcgZm9yIHRoZSBleHBpcmUgdG8gZmluaXNoLAorICogaXQgd2lsbCBpbnZhbGlkYXRlIHRoZSBkZW50cnkgYW5kIHRyeSB0byBtb3VudCB3aXRoIGEgbmV3IG9uZS4KKyAqCisgKiBBbHNvIHNlZSBhdXRvZnM0X2Rpcl9ybWRpcigpLi4KKyAqLworc3RhdGljIGludCBhdXRvZnM0X2Rpcl91bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSA9IGF1dG9mczRfc2JpKGRpci0+aV9zYik7CisJc3RydWN0IGF1dG9mc19pbmZvICppbm8gPSBhdXRvZnM0X2RlbnRyeV9pbm8oZGVudHJ5KTsKKwkKKwkvKiBUaGlzIGFsbG93cyByb290IHRvIHJlbW92ZSBzeW1saW5rcyAqLworCWlmICggIWF1dG9mczRfb3pfbW9kZShzYmkpICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pICkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlkcHV0KGluby0+ZGVudHJ5KTsKKworCWRlbnRyeS0+ZF9pbm9kZS0+aV9zaXplID0gMDsKKwlkZW50cnktPmRfaW5vZGUtPmlfbmxpbmsgPSAwOworCisJZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOworCisJZF9kcm9wKGRlbnRyeSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdXRvZnM0X2Rpcl9ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpID0gYXV0b2ZzNF9zYmkoZGlyLT5pX3NiKTsKKwlzdHJ1Y3QgYXV0b2ZzX2luZm8gKmlubyA9IGF1dG9mczRfZGVudHJ5X2lubyhkZW50cnkpOworCQorCWlmICghYXV0b2ZzNF9vel9tb2RlKHNiaSkpCisJCXJldHVybiAtRUFDQ0VTOworCisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZkZW50cnktPmRfc3ViZGlycykpIHsKKwkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJcmV0dXJuIC1FTk9URU1QVFk7CisJfQorCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCV9fZF9kcm9wKGRlbnRyeSk7CisJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCisJZHB1dChpbm8tPmRlbnRyeSk7CisKKwlkZW50cnktPmRfaW5vZGUtPmlfc2l6ZSA9IDA7CisJZGVudHJ5LT5kX2lub2RlLT5pX25saW5rID0gMDsKKworCWlmIChkaXItPmlfbmxpbmspCisJCWRpci0+aV9ubGluay0tOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXV0b2ZzNF9kaXJfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnM0X3NiaShkaXItPmlfc2IpOworCXN0cnVjdCBhdXRvZnNfaW5mbyAqaW5vID0gYXV0b2ZzNF9kZW50cnlfaW5vKGRlbnRyeSk7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCWlmICggIWF1dG9mczRfb3pfbW9kZShzYmkpICkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlEUFJJTlRLKCJkZW50cnkgJXAsIGNyZWF0aW5nICUuKnMiLAorCQlkZW50cnksIGRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlpbm8gPSBhdXRvZnM0X2luaXRfaW5vKGlubywgc2JpLCBTX0lGRElSIHwgMDU1NSk7CisJaWYgKGlubyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWlub2RlID0gYXV0b2ZzNF9nZXRfaW5vZGUoZGlyLT5pX3NiLCBpbm8pOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisKKwlpZiAoZGlyID09IGRpci0+aV9zYi0+c19yb290LT5kX2lub2RlKQorCQlkZW50cnktPmRfb3AgPSAmYXV0b2ZzNF9yb290X2RlbnRyeV9vcGVyYXRpb25zOworCWVsc2UKKwkJZGVudHJ5LT5kX29wID0gJmF1dG9mczRfZGVudHJ5X29wZXJhdGlvbnM7CisKKwlkZW50cnktPmRfZnNkYXRhID0gaW5vOworCWluby0+ZGVudHJ5ID0gZGdldChkZW50cnkpOworCWluby0+aW5vZGUgPSBpbm9kZTsKKwlkaXItPmlfbmxpbmsrKzsKKwlkaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CisKKwlyZXR1cm4gMDsKK30KKworLyogR2V0L3NldCB0aW1lb3V0IGlvY3RsKCkgb3BlcmF0aW9uICovCitzdGF0aWMgaW5saW5lIGludCBhdXRvZnM0X2dldF9zZXRfdGltZW91dChzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgX191c2VyICpwKQoreworCWludCBydjsKKwl1bnNpZ25lZCBsb25nIG50aW1lb3V0OworCisJaWYgKCAocnYgPSBnZXRfdXNlcihudGltZW91dCwgcCkpIHx8CisJICAgICAocnYgPSBwdXRfdXNlcihzYmktPmV4cF90aW1lb3V0L0haLCBwKSkgKQorCQlyZXR1cm4gcnY7CisKKwlpZiAoIG50aW1lb3V0ID4gVUxPTkdfTUFYL0haICkKKwkJc2JpLT5leHBfdGltZW91dCA9IDA7CisJZWxzZQorCQlzYmktPmV4cF90aW1lb3V0ID0gbnRpbWVvdXQgKiBIWjsKKworCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gcHJvdG9jb2wgdmVyc2lvbiAqLworc3RhdGljIGlubGluZSBpbnQgYXV0b2ZzNF9nZXRfcHJvdG92ZXIoc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksIGludCBfX3VzZXIgKnApCit7CisJcmV0dXJuIHB1dF91c2VyKHNiaS0+dmVyc2lvbiwgcCk7Cit9CisKKy8qIFJldHVybiBwcm90b2NvbCBzdWIgdmVyc2lvbiAqLworc3RhdGljIGlubGluZSBpbnQgYXV0b2ZzNF9nZXRfcHJvdG9zdWJ2ZXIoc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksIGludCBfX3VzZXIgKnApCit7CisJcmV0dXJuIHB1dF91c2VyKHNiaS0+c3ViX3ZlcnNpb24sIHApOworfQorCisvKgorICogVGVsbHMgdGhlIGRhZW1vbiB3aGV0aGVyIHdlIG5lZWQgdG8gcmVnaG9zdCBvciBub3QuIEFsc28sIGNsZWFycworICogdGhlIHJlZ2hvc3RfbmVlZGVkIGZsYWcuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF1dG9mczRfYXNrX3JlZ2hvc3Qoc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksIGludCBfX3VzZXIgKnApCit7CisJaW50IHN0YXR1czsKKworCURQUklOVEsoInJldHVybmluZyAlZCIsIHNiaS0+bmVlZHNfcmVnaG9zdCk7CisKKwlzdGF0dXMgPSBwdXRfdXNlcihzYmktPm5lZWRzX3JlZ2hvc3QsIHApOworCWlmICggc3RhdHVzICkKKwkJcmV0dXJuIHN0YXR1czsKKworCXNiaS0+bmVlZHNfcmVnaG9zdCA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFbmFibGUgLyBEaXNhYmxlIHJlZ2hvc3RpbmcgaW9jdGwoKSBvcGVyYXRpb24KKyAqLworc3RhdGljIGlubGluZSBpbnQgYXV0b2ZzNF90b2dnbGVfcmVnaG9zdChzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwgaW50IF9fdXNlciAqcCkKK3sKKwlpbnQgc3RhdHVzOworCWludCB2YWw7CisKKwlzdGF0dXMgPSBnZXRfdXNlcih2YWwsIHApOworCisJRFBSSU5USygicmVnaG9zdCA9ICVkIiwgdmFsKTsKKworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwkvKiB0dXJuIG9uL29mZiByZWdob3N0aW5nLCB3aXRoIHRoZSB2YWwgKi8KKwlzYmktPnJlZ2hvc3RfZW5hYmxlZCA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyogVGVsbHMgdGhlIGRhZW1vbiB3aGV0aGVyIGl0IGNhbiB1bW91bnQgdGhlIGF1dG9mcyBtb3VudC4KKyovCitzdGF0aWMgaW5saW5lIGludCBhdXRvZnM0X2Fza191bW91bnQoc3RydWN0IHZmc21vdW50ICptbnQsIGludCBfX3VzZXIgKnApCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAobWF5X3Vtb3VudChtbnQpID09IDApCisJCXN0YXR1cyA9IDE7CisKKwlEUFJJTlRLKCJyZXR1cm5pbmcgJWQiLCBzdGF0dXMpOworCisJc3RhdHVzID0gcHV0X3VzZXIoc3RhdHVzLCBwKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIElkZW50aWZ5IGF1dG9mczRfZGVudHJpZXMgLSB0aGlzIGlzIHNvIHdlIGNhbiB0ZWxsIGlmIHRoZXJlJ3MKKyAgIGFuIGV4dHJhIGRlbnRyeSByZWZjb3VudCBvciBub3QuICBXZSBvbmx5IGhvbGQgYSByZWZjb3VudCBvbiB0aGUKKyAgIGRlbnRyeSBpZiBpdHMgbm9uLW5lZ2F0aXZlIChpZSwgZF9pbm9kZSAhPSBOVUxMKQorKi8KK2ludCBpc19hdXRvZnM0X2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJcmV0dXJuIGRlbnRyeSAmJiBkZW50cnktPmRfaW5vZGUgJiYKKwkJKGRlbnRyeS0+ZF9vcCA9PSAmYXV0b2ZzNF9yb290X2RlbnRyeV9vcGVyYXRpb25zIHx8CisJCSBkZW50cnktPmRfb3AgPT0gJmF1dG9mczRfZGVudHJ5X29wZXJhdGlvbnMpICYmCisJCWRlbnRyeS0+ZF9mc2RhdGEgIT0gTlVMTDsKK30KKworLyoKKyAqIGlvY3RsKCkncyBvbiB0aGUgcm9vdCBkaXJlY3RvcnkgaXMgdGhlIGNoaWVmIG1ldGhvZCBmb3IgdGhlIGRhZW1vbiB0bworICogZ2VuZXJhdGUga2VybmVsIHJlYWN0aW9ucworICovCitzdGF0aWMgaW50IGF1dG9mczRfcm9vdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnM0X3NiaShpbm9kZS0+aV9zYik7CisJdm9pZCBfX3VzZXIgKnAgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlEUFJJTlRLKCJjbWQgPSAweCUwOHgsIGFyZyA9IDB4JTA4bHgsIHNiaSA9ICVwLCBwZ3JwID0gJXUiLAorCQljbWQsYXJnLHNiaSxwcm9jZXNzX2dyb3VwKGN1cnJlbnQpKTsKKworCWlmICggX0lPQ19UWVBFKGNtZCkgIT0gX0lPQ19UWVBFKEFVVE9GU19JT0NfRklSU1QpIHx8CisJICAgICBfSU9DX05SKGNtZCkgLSBfSU9DX05SKEFVVE9GU19JT0NfRklSU1QpID49IEFVVE9GU19JT0NfQ09VTlQgKQorCQlyZXR1cm4gLUVOT1RUWTsKKwkKKwlpZiAoICFhdXRvZnM0X296X21vZGUoc2JpKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSApCisJCXJldHVybiAtRVBFUk07CisJCisJc3dpdGNoKGNtZCkgeworCWNhc2UgQVVUT0ZTX0lPQ19SRUFEWToJLyogV2FpdCBxdWV1ZTogZ28gYWhlYWQgYW5kIHJldHJ5ICovCisJCXJldHVybiBhdXRvZnM0X3dhaXRfcmVsZWFzZShzYmksKGF1dG9mc193cXRfdClhcmcsMCk7CisJY2FzZSBBVVRPRlNfSU9DX0ZBSUw6CS8qIFdhaXQgcXVldWU6IGZhaWwgd2l0aCBFTk9FTlQgKi8KKwkJcmV0dXJuIGF1dG9mczRfd2FpdF9yZWxlYXNlKHNiaSwoYXV0b2ZzX3dxdF90KWFyZywtRU5PRU5UKTsKKwljYXNlIEFVVE9GU19JT0NfQ0FUQVRPTklDOiAvKiBFbnRlciBjYXRhdG9uaWMgbW9kZSAoZGFlbW9uIHNodXRkb3duKSAqLworCQlhdXRvZnM0X2NhdGF0b25pY19tb2RlKHNiaSk7CisJCXJldHVybiAwOworCWNhc2UgQVVUT0ZTX0lPQ19QUk9UT1ZFUjogLyogR2V0IHByb3RvY29sIHZlcnNpb24gKi8KKwkJcmV0dXJuIGF1dG9mczRfZ2V0X3Byb3RvdmVyKHNiaSwgcCk7CisJY2FzZSBBVVRPRlNfSU9DX1BST1RPU1VCVkVSOiAvKiBHZXQgcHJvdG9jb2wgc3ViIHZlcnNpb24gKi8KKwkJcmV0dXJuIGF1dG9mczRfZ2V0X3Byb3Rvc3VidmVyKHNiaSwgcCk7CisJY2FzZSBBVVRPRlNfSU9DX1NFVFRJTUVPVVQ6CisJCXJldHVybiBhdXRvZnM0X2dldF9zZXRfdGltZW91dChzYmksIHApOworCisJY2FzZSBBVVRPRlNfSU9DX1RPR0dMRVJFR0hPU1Q6CisJCXJldHVybiBhdXRvZnM0X3RvZ2dsZV9yZWdob3N0KHNiaSwgcCk7CisJY2FzZSBBVVRPRlNfSU9DX0FTS1JFR0hPU1Q6CisJCXJldHVybiBhdXRvZnM0X2Fza19yZWdob3N0KHNiaSwgcCk7CisKKwljYXNlIEFVVE9GU19JT0NfQVNLVU1PVU5UOgorCQlyZXR1cm4gYXV0b2ZzNF9hc2tfdW1vdW50KGZpbHAtPmZfdmZzbW50LCBwKTsKKworCS8qIHJldHVybiBhIHNpbmdsZSB0aGluZyB0byBleHBpcmUgKi8KKwljYXNlIEFVVE9GU19JT0NfRVhQSVJFOgorCQlyZXR1cm4gYXV0b2ZzNF9leHBpcmVfcnVuKGlub2RlLT5pX3NiLGZpbHAtPmZfdmZzbW50LHNiaSwgcCk7CisJLyogc2FtZSBhcyBhYm92ZSwgYnV0IGNhbiBzZW5kIG11bHRpcGxlIGV4cGlyZXMgdGhyb3VnaCBwaXBlICovCisJY2FzZSBBVVRPRlNfSU9DX0VYUElSRV9NVUxUSToKKwkJcmV0dXJuIGF1dG9mczRfZXhwaXJlX211bHRpKGlub2RlLT5pX3NiLGZpbHAtPmZfdmZzbW50LHNiaSwgcCk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1NZUzsKKwl9Cit9CmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L3N5bWxpbmsuYyBiL2ZzL2F1dG9mczQvc3ltbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNjVhNjYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hdXRvZnM0L3N5bWxpbmsuYwpAQCAtMCwwICsxLDI1IEBACisvKiAtKi0gYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiBsaW51eC9mcy9hdXRvZnMvc3ltbGluay5jCisgKgorICogIENvcHlyaWdodCAxOTk3LTE5OTggVHJhbnNtZXRhIENvcnBvcmF0aW9uIC0tIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlICJhdXRvZnNfaS5oIgorCitzdGF0aWMgaW50IGF1dG9mczRfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgYXV0b2ZzX2luZm8gKmlubyA9IGF1dG9mczRfZGVudHJ5X2lubyhkZW50cnkpOworCW5kX3NldF9saW5rKG5kLCAoY2hhciAqKWluby0+dS5zeW1saW5rKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYXV0b2ZzNF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBhdXRvZnM0X2ZvbGxvd19saW5rCit9OwpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC93YWl0cS5jIGIvZnMvYXV0b2ZzNC93YWl0cS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYjI0YTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hdXRvZnM0L3dhaXRxLmMKQEAgLTAsMCArMSwzMDMgQEAKKy8qIC0qLSBjIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqIGxpbnV4L2ZzL2F1dG9mcy93YWl0cS5jCisgKgorICogIENvcHlyaWdodCAxOTk3LTE5OTggVHJhbnNtZXRhIENvcnBvcmF0aW9uIC0tIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICBDb3B5cmlnaHQgMjAwMS0yMDAzIElhbiBLZW50IDxyYXZlbkB0aGVtYXcubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgImF1dG9mc19pLmgiCisKKy8qIFdlIG1ha2UgdGhpcyBhIHN0YXRpYyB2YXJpYWJsZSByYXRoZXIgdGhhbiBhIHBhcnQgb2YgdGhlIHN1cGVyYmxvY2s7IGl0CisgICBpcyBiZXR0ZXIgaWYgd2UgZG9uJ3QgcmVhc3NpZ24gbnVtYmVycyBlYXNpbHkgZXZlbiBhY3Jvc3MgZmlsZXN5c3RlbXMgKi8KK3N0YXRpYyBhdXRvZnNfd3F0X3QgYXV0b2ZzNF9uZXh0X3dhaXRfcXVldWUgPSAxOworCisvKiBUaGVzZSBhcmUgdGhlIHNpZ25hbHMgd2UgYWxsb3cgaW50ZXJydXB0aW5nIGEgcGVuZGluZyBtb3VudCAqLworI2RlZmluZSBTSFVURE9XTl9TSUdTCShzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdJTlQpIHwgc2lnbWFzayhTSUdRVUlUKSkKKwordm9pZCBhdXRvZnM0X2NhdGF0b25pY19tb2RlKHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpKQoreworCXN0cnVjdCBhdXRvZnNfd2FpdF9xdWV1ZSAqd3EsICpud3E7CisKKwlEUFJJTlRLKCJlbnRlcmluZyBjYXRhdG9uaWMgbW9kZSIpOworCisJc2JpLT5jYXRhdG9uaWMgPSAxOworCXdxID0gc2JpLT5xdWV1ZXM7CisJc2JpLT5xdWV1ZXMgPSBOVUxMOwkvKiBFcmFzZSBhbGwgd2FpdCBxdWV1ZXMgKi8KKwl3aGlsZSAoIHdxICkgeworCQlud3EgPSB3cS0+bmV4dDsKKwkJd3EtPnN0YXR1cyA9IC1FTk9FTlQ7IC8qIE1hZ2ljIGlzIGdvbmUgLSByZXBvcnQgZmFpbHVyZSAqLworCQlrZnJlZSh3cS0+bmFtZSk7CisJCXdxLT5uYW1lID0gTlVMTDsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ3cS0+cXVldWUpOworCQl3cSA9IG53cTsKKwl9CisJaWYgKHNiaS0+cGlwZSkgeworCQlmcHV0KHNiaS0+cGlwZSk7CS8qIENsb3NlIHRoZSBwaXBlICovCisJCXNiaS0+cGlwZSA9IE5VTEw7CisJfQorCisJc2hyaW5rX2RjYWNoZV9zYihzYmktPnNiKTsKK30KKworc3RhdGljIGludCBhdXRvZnM0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCB2b2lkICphZGRyLCBpbnQgYnl0ZXMpCit7CisJdW5zaWduZWQgbG9uZyBzaWdwaXBlLCBmbGFnczsKKwltbV9zZWdtZW50X3QgZnM7CisJY29uc3QgY2hhciAqZGF0YSA9IChjb25zdCBjaGFyICopYWRkcjsKKwlzc2l6ZV90IHdyID0gMDsKKworCS8qKiBXQVJOSU5HOiB0aGlzIGlzIG5vdCBzYWZlIGZvciB3cml0aW5nIG1vcmUgdGhhbiBQSVBFX0JVRiBieXRlcyEgKiovCisKKwlzaWdwaXBlID0gc2lnaXNtZW1iZXIoJmN1cnJlbnQtPnBlbmRpbmcuc2lnbmFsLCBTSUdQSVBFKTsKKworCS8qIFNhdmUgcG9pbnRlciB0byB1c2VyIHNwYWNlIGFuZCBwb2ludCBiYWNrIHRvIGtlcm5lbCBzcGFjZSAqLworCWZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKEtFUk5FTF9EUyk7CisKKwl3aGlsZSAoYnl0ZXMgJiYKKwkgICAgICAgKHdyID0gZmlsZS0+Zl9vcC0+d3JpdGUoZmlsZSxkYXRhLGJ5dGVzLCZmaWxlLT5mX3BvcykpID4gMCkgeworCQlkYXRhICs9IHdyOworCQlieXRlcyAtPSB3cjsKKwl9CisKKwlzZXRfZnMoZnMpOworCisJLyogS2VlcCB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBwcm9jZXNzIGZyb20gcmVjZWl2aW5nIGEKKwkgICBTSUdQSVBFIHVubGVzcyBpdCB3YXMgYWxyZWFkeSBzdXBwb3NlZCB0byBnZXQgb25lICovCisJaWYgKHdyID09IC1FUElQRSAmJiAhc2lncGlwZSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCQlzaWdkZWxzZXQoJmN1cnJlbnQtPnBlbmRpbmcuc2lnbmFsLCBTSUdQSVBFKTsKKwkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiAoYnl0ZXMgPiAwKTsKK30KKwkKK3N0YXRpYyB2b2lkIGF1dG9mczRfbm90aWZ5X2RhZW1vbihzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwKKwkJCQkgc3RydWN0IGF1dG9mc193YWl0X3F1ZXVlICp3cSwKKwkJCQkgaW50IHR5cGUpCit7CisJdW5pb24gYXV0b2ZzX3BhY2tldF91bmlvbiBwa3Q7CisJc2l6ZV90IHBrdHN6OworCisJRFBSSU5USygid2FpdCBpZCA9IDB4JTA4bHgsIG5hbWUgPSAlLipzLCB0eXBlPSVkIiwKKwkJd3EtPndhaXRfcXVldWVfdG9rZW4sIHdxLT5sZW4sIHdxLT5uYW1lLCB0eXBlKTsKKworCW1lbXNldCgmcGt0LDAsc2l6ZW9mIHBrdCk7IC8qIEZvciBzZWN1cml0eSByZWFzb25zICovCisKKwlwa3QuaGRyLnByb3RvX3ZlcnNpb24gPSBzYmktPnZlcnNpb247CisJcGt0Lmhkci50eXBlID0gdHlwZTsKKwlpZiAodHlwZSA9PSBhdXRvZnNfcHR5cGVfbWlzc2luZykgeworCQlzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9taXNzaW5nICptcCA9ICZwa3QubWlzc2luZzsKKworCQlwa3RzeiA9IHNpemVvZigqbXApOworCisJCW1wLT53YWl0X3F1ZXVlX3Rva2VuID0gd3EtPndhaXRfcXVldWVfdG9rZW47CisJCW1wLT5sZW4gPSB3cS0+bGVuOworCQltZW1jcHkobXAtPm5hbWUsIHdxLT5uYW1lLCB3cS0+bGVuKTsKKwkJbXAtPm5hbWVbd3EtPmxlbl0gPSAnXDAnOworCX0gZWxzZSBpZiAodHlwZSA9PSBhdXRvZnNfcHR5cGVfZXhwaXJlX211bHRpKSB7CisJCXN0cnVjdCBhdXRvZnNfcGFja2V0X2V4cGlyZV9tdWx0aSAqZXAgPSAmcGt0LmV4cGlyZV9tdWx0aTsKKworCQlwa3RzeiA9IHNpemVvZigqZXApOworCisJCWVwLT53YWl0X3F1ZXVlX3Rva2VuID0gd3EtPndhaXRfcXVldWVfdG9rZW47CisJCWVwLT5sZW4gPSB3cS0+bGVuOworCQltZW1jcHkoZXAtPm5hbWUsIHdxLT5uYW1lLCB3cS0+bGVuKTsKKwkJZXAtPm5hbWVbd3EtPmxlbl0gPSAnXDAnOworCX0gZWxzZSB7CisJCXByaW50aygiYXV0b2ZzNF9ub3RpZnlfZGFlbW9uOiBiYWQgdHlwZSAlZCFcbiIsIHR5cGUpOworCQlyZXR1cm47CisJfQorCisJaWYgKGF1dG9mczRfd3JpdGUoc2JpLT5waXBlLCAmcGt0LCBwa3RzeikpCisJCWF1dG9mczRfY2F0YXRvbmljX21vZGUoc2JpKTsKK30KKworc3RhdGljIGludCBhdXRvZnM0X2dldHBhdGgoc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksCisJCQkgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKipuYW1lKQoreworCXN0cnVjdCBkZW50cnkgKnJvb3QgPSBzYmktPnNiLT5zX3Jvb3Q7CisJc3RydWN0IGRlbnRyeSAqdG1wOworCWNoYXIgKmJ1ZiA9ICpuYW1lOworCWNoYXIgKnA7CisJaW50IGxlbiA9IDA7CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwlmb3IgKHRtcCA9IGRlbnRyeSA7IHRtcCAhPSByb290IDsgdG1wID0gdG1wLT5kX3BhcmVudCkKKwkJbGVuICs9IHRtcC0+ZF9uYW1lLmxlbiArIDE7CisKKwlpZiAoLS1sZW4gPiBOQU1FX01BWCkgeworCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKwkqKGJ1ZiArIGxlbikgPSAnXDAnOworCXAgPSBidWYgKyBsZW4gLSBkZW50cnktPmRfbmFtZS5sZW47CisJc3RybmNweShwLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4pOworCisJZm9yICh0bXAgPSBkZW50cnktPmRfcGFyZW50OyB0bXAgIT0gcm9vdCA7IHRtcCA9IHRtcC0+ZF9wYXJlbnQpIHsKKwkJKigtLXApID0gJy8nOworCQlwIC09IHRtcC0+ZF9uYW1lLmxlbjsKKwkJc3RybmNweShwLCB0bXAtPmRfbmFtZS5uYW1lLCB0bXAtPmRfbmFtZS5sZW4pOworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCisJcmV0dXJuIGxlbjsKK30KKworaW50IGF1dG9mczRfd2FpdChzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQllbnVtIGF1dG9mc19ub3RpZnkgbm90aWZ5KQoreworCXN0cnVjdCBhdXRvZnNfd2FpdF9xdWV1ZSAqd3E7CisJY2hhciAqbmFtZTsKKwlpbnQgbGVuLCBzdGF0dXM7CisKKwkvKiBJbiBjYXRhdG9uaWMgbW9kZSwgd2UgZG9uJ3Qgd2FpdCBmb3Igbm9ib2R5ICovCisJaWYgKCBzYmktPmNhdGF0b25pYyApCisJCXJldHVybiAtRU5PRU5UOworCQorCW5hbWUgPSBrbWFsbG9jKE5BTUVfTUFYICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuYW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxlbiA9IGF1dG9mczRfZ2V0cGF0aChzYmksIGRlbnRyeSwgJm5hbWUpOworCWlmICghbGVuKSB7CisJCWtmcmVlKG5hbWUpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzYmktPndxX3NlbSkpIHsKKwkJa2ZyZWUobmFtZSk7CisJCXJldHVybiAtRUlOVFI7CisJfQorCisJZm9yICh3cSA9IHNiaS0+cXVldWVzIDsgd3EgOyB3cSA9IHdxLT5uZXh0KSB7CisJCWlmICh3cS0+aGFzaCA9PSBkZW50cnktPmRfbmFtZS5oYXNoICYmCisJCSAgICB3cS0+bGVuID09IGxlbiAmJgorCQkgICAgd3EtPm5hbWUgJiYgIW1lbWNtcCh3cS0+bmFtZSwgbmFtZSwgbGVuKSkKKwkJCWJyZWFrOworCX0KKworCWlmICggIXdxICkgeworCQkvKiBDcmVhdGUgYSBuZXcgd2FpdCBxdWV1ZSAqLworCQl3cSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdXRvZnNfd2FpdF9xdWV1ZSksR0ZQX0tFUk5FTCk7CisJCWlmICggIXdxICkgeworCQkJa2ZyZWUobmFtZSk7CisJCQl1cCgmc2JpLT53cV9zZW0pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQl3cS0+d2FpdF9xdWV1ZV90b2tlbiA9IGF1dG9mczRfbmV4dF93YWl0X3F1ZXVlOworCQlpZiAoKythdXRvZnM0X25leHRfd2FpdF9xdWV1ZSA9PSAwKQorCQkJYXV0b2ZzNF9uZXh0X3dhaXRfcXVldWUgPSAxOworCQl3cS0+bmV4dCA9IHNiaS0+cXVldWVzOworCQlzYmktPnF1ZXVlcyA9IHdxOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ3cS0+cXVldWUpOworCQl3cS0+aGFzaCA9IGRlbnRyeS0+ZF9uYW1lLmhhc2g7CisJCXdxLT5uYW1lID0gbmFtZTsKKwkJd3EtPmxlbiA9IGxlbjsKKwkJd3EtPnN0YXR1cyA9IC1FSU5UUjsgLyogU3RhdHVzIHJldHVybiBpZiBpbnRlcnJ1cHRlZCAqLworCQlhdG9taWNfc2V0KCZ3cS0+d2FpdF9jdHIsIDIpOworCQl1cCgmc2JpLT53cV9zZW0pOworCisJCURQUklOVEsoIm5ldyB3YWl0IGlkID0gMHglMDhseCwgbmFtZSA9ICUuKnMsIG5meT0lZCIsCisJCQkodW5zaWduZWQgbG9uZykgd3EtPndhaXRfcXVldWVfdG9rZW4sIHdxLT5sZW4sIHdxLT5uYW1lLCBub3RpZnkpOworCQkvKiBhdXRvZnM0X25vdGlmeV9kYWVtb24oKSBtYXkgYmxvY2sgKi8KKwkJaWYgKG5vdGlmeSAhPSBORllfTk9ORSkgeworCQkJYXV0b2ZzNF9ub3RpZnlfZGFlbW9uKHNiaSx3cSwgCisJCQkJCW5vdGlmeSA9PSBORllfTU9VTlQgPworCQkJCQkJICBhdXRvZnNfcHR5cGVfbWlzc2luZyA6CisJCQkJCQkgIGF1dG9mc19wdHlwZV9leHBpcmVfbXVsdGkpOworCQl9CisJfSBlbHNlIHsKKwkJYXRvbWljX2luYygmd3EtPndhaXRfY3RyKTsKKwkJdXAoJnNiaS0+d3Ffc2VtKTsKKwkJa2ZyZWUobmFtZSk7CisJCURQUklOVEsoImV4aXN0aW5nIHdhaXQgaWQgPSAweCUwOGx4LCBuYW1lID0gJS4qcywgbmZ5PSVkIiwKKwkJCSh1bnNpZ25lZCBsb25nKSB3cS0+d2FpdF9xdWV1ZV90b2tlbiwgd3EtPmxlbiwgd3EtPm5hbWUsIG5vdGlmeSk7CisJfQorCisJLyogd3EtPm5hbWUgaXMgTlVMTCBpZiBhbmQgb25seSBpZiB0aGUgbG9jayBpcyBhbHJlYWR5IHJlbGVhc2VkICovCisKKwlpZiAoIHNiaS0+Y2F0YXRvbmljICkgeworCQkvKiBXZSBtaWdodCBoYXZlIHNsZXB0LCBzbyBjaGVjayBhZ2FpbiBmb3IgY2F0YXRvbmljIG1vZGUgKi8KKwkJd3EtPnN0YXR1cyA9IC1FTk9FTlQ7CisJCWlmICggd3EtPm5hbWUgKSB7CisJCQlrZnJlZSh3cS0+bmFtZSk7CisJCQl3cS0+bmFtZSA9IE5VTEw7CisJCX0KKwl9CisKKwlpZiAoIHdxLT5uYW1lICkgeworCQkvKiBCbG9jayBhbGwgYnV0ICJzaHV0ZG93biIgc2lnbmFscyB3aGlsZSB3YWl0aW5nICovCisJCXNpZ3NldF90IG9sZHNldDsKKwkJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgaXJxZmxhZ3MpOworCQlvbGRzZXQgPSBjdXJyZW50LT5ibG9ja2VkOworCQlzaWdpbml0c2V0aW52KCZjdXJyZW50LT5ibG9ja2VkLCBTSFVURE9XTl9TSUdTICYgfm9sZHNldC5zaWdbMF0pOworCQlyZWNhbGNfc2lncGVuZGluZygpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBpcnFmbGFncyk7CisKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHdxLT5xdWV1ZSwgd3EtPm5hbWUgPT0gTlVMTCk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGlycWZsYWdzKTsKKwkJY3VycmVudC0+YmxvY2tlZCA9IG9sZHNldDsKKwkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgaXJxZmxhZ3MpOworCX0gZWxzZSB7CisJCURQUklOVEsoInNraXBwZWQgc2xlZXBpbmciKTsKKwl9CisKKwlzdGF0dXMgPSB3cS0+c3RhdHVzOworCisJLyogQXJlIHdlIHRoZSBsYXN0IHByb2Nlc3MgdG8gbmVlZCBzdGF0dXM/ICovCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJndxLT53YWl0X2N0cikpCisJCWtmcmVlKHdxKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKworaW50IGF1dG9mczRfd2FpdF9yZWxlYXNlKHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpLCBhdXRvZnNfd3F0X3Qgd2FpdF9xdWV1ZV90b2tlbiwgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgYXV0b2ZzX3dhaXRfcXVldWUgKndxLCAqKndxbDsKKworCWRvd24oJnNiaS0+d3Ffc2VtKTsKKwlmb3IgKCB3cWwgPSAmc2JpLT5xdWV1ZXMgOyAod3EgPSAqd3FsKSAhPSAwIDsgd3FsID0gJndxLT5uZXh0ICkgeworCQlpZiAoIHdxLT53YWl0X3F1ZXVlX3Rva2VuID09IHdhaXRfcXVldWVfdG9rZW4gKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCAhd3EgKSB7CisJCXVwKCZzYmktPndxX3NlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCSp3cWwgPSB3cS0+bmV4dDsJLyogVW5saW5rIGZyb20gY2hhaW4gKi8KKwl1cCgmc2JpLT53cV9zZW0pOworCWtmcmVlKHdxLT5uYW1lKTsKKwl3cS0+bmFtZSA9IE5VTEw7CS8qIERvIG5vdCB3YWl0IG9uIHRoaXMgcXVldWUgKi8KKworCXdxLT5zdGF0dXMgPSBzdGF0dXM7CisKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmd3EtPndhaXRfY3RyKSkJLyogSXMgYW55b25lIHN0aWxsIHdhaXRpbmcgZm9yIHRoaXMgZ3V5PyAqLworCQlrZnJlZSh3cSk7CisJZWxzZQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJndxLT5xdWV1ZSk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvYmFkX2lub2RlLmMgYi9mcy9iYWRfaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzJhMzE5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYmFkX2lub2RlLmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiAgbGludXgvZnMvYmFkX2lub2RlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LCBTdGVwaGVuIFR3ZWVkaWUKKyAqCisgKiAgUHJvdmlkZSBzdHViIGZ1bmN0aW9ucyBmb3IgdW5yZWFkYWJsZSBpbm9kZXMKKyAqCisgKiAgRmFiaWFuIEZyZWRlcmljayA6IEF1Z3VzdCAyMDAzIC0gQWxsIGZpbGUgb3BlcmF0aW9ucyBhc3NpZ25lZCB0byBFSU8KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKworc3RhdGljIGludCByZXR1cm5fRUlPKHZvaWQpCit7CisJcmV0dXJuIC1FSU87Cit9CisKKyNkZWZpbmUgRUlPX0VSUk9SICgodm9pZCAqKSAocmV0dXJuX0VJTykpCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJhZF9maWxlX29wcyA9Cit7CisJLmxsc2VlawkJPSBFSU9fRVJST1IsCisJLmFpb19yZWFkCT0gRUlPX0VSUk9SLAorCS5yZWFkCQk9IEVJT19FUlJPUiwKKwkud3JpdGUJCT0gRUlPX0VSUk9SLAorCS5haW9fd3JpdGUJPSBFSU9fRVJST1IsCisJLnJlYWRkaXIJPSBFSU9fRVJST1IsCisJLnBvbGwJCT0gRUlPX0VSUk9SLAorCS5pb2N0bAkJPSBFSU9fRVJST1IsCisJLm1tYXAJCT0gRUlPX0VSUk9SLAorCS5vcGVuCQk9IEVJT19FUlJPUiwKKwkuZmx1c2gJCT0gRUlPX0VSUk9SLAorCS5yZWxlYXNlCT0gRUlPX0VSUk9SLAorCS5mc3luYwkJPSBFSU9fRVJST1IsCisJLmFpb19mc3luYwk9IEVJT19FUlJPUiwKKwkuZmFzeW5jCQk9IEVJT19FUlJPUiwKKwkubG9jawkJPSBFSU9fRVJST1IsCisJLnJlYWR2CQk9IEVJT19FUlJPUiwKKwkud3JpdGV2CQk9IEVJT19FUlJPUiwKKwkuc2VuZGZpbGUJPSBFSU9fRVJST1IsCisJLnNlbmRwYWdlCT0gRUlPX0VSUk9SLAorCS5nZXRfdW5tYXBwZWRfYXJlYSA9IEVJT19FUlJPUiwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGJhZF9pbm9kZV9vcHMgPQoreworCS5jcmVhdGUJCT0gRUlPX0VSUk9SLAorCS5sb29rdXAJCT0gRUlPX0VSUk9SLAorCS5saW5rCQk9IEVJT19FUlJPUiwKKwkudW5saW5rCQk9IEVJT19FUlJPUiwKKwkuc3ltbGluawk9IEVJT19FUlJPUiwKKwkubWtkaXIJCT0gRUlPX0VSUk9SLAorCS5ybWRpcgkJPSBFSU9fRVJST1IsCisJLm1rbm9kCQk9IEVJT19FUlJPUiwKKwkucmVuYW1lCQk9IEVJT19FUlJPUiwKKwkucmVhZGxpbmsJPSBFSU9fRVJST1IsCisJLyogZm9sbG93X2xpbmsgbXVzdCBiZSBuby1vcCwgb3RoZXJ3aXNlIHVubW91bnRpbmcgdGhpcyBpbm9kZQorCSAgIHdvbid0IHdvcmsgKi8KKwkudHJ1bmNhdGUJPSBFSU9fRVJST1IsCisJLnBlcm1pc3Npb24JPSBFSU9fRVJST1IsCisJLmdldGF0dHIJPSBFSU9fRVJST1IsCisJLnNldGF0dHIJPSBFSU9fRVJST1IsCisJLnNldHhhdHRyCT0gRUlPX0VSUk9SLAorCS5nZXR4YXR0cgk9IEVJT19FUlJPUiwKKwkubGlzdHhhdHRyCT0gRUlPX0VSUk9SLAorCS5yZW1vdmV4YXR0cgk9IEVJT19FUlJPUiwKK307CisKKworLyoKKyAqIFdoZW4gYSBmaWxlc3lzdGVtIGlzIHVuYWJsZSB0byByZWFkIGFuIGlub2RlIGR1ZSB0byBhbiBJL08gZXJyb3IgaW4KKyAqIGl0cyByZWFkX2lub2RlKCkgZnVuY3Rpb24sIGl0IGNhbiBjYWxsIG1ha2VfYmFkX2lub2RlKCkgdG8gcmV0dXJuIGEKKyAqIHNldCBvZiBzdHVicyB3aGljaCB3aWxsIHJldHVybiBFSU8gZXJyb3JzIGFzIHJlcXVpcmVkLiAKKyAqCisgKiBXZSBvbmx5IG5lZWQgdG8gZG8gbGltaXRlZCBpbml0aWFsaXNhdGlvbjogYWxsIG90aGVyIGZpZWxkcyBhcmUKKyAqIHByZWluaXRpYWxpc2VkIHRvIHplcm8gYXV0b21hdGljYWxseS4KKyAqLworIAorLyoqCisgKgltYWtlX2JhZF9pbm9kZSAtIG1hcmsgYW4gaW5vZGUgYmFkIGR1ZSB0byBhbiBJL08gZXJyb3IKKyAqCUBpbm9kZTogSW5vZGUgdG8gbWFyayBiYWQKKyAqCisgKglXaGVuIGFuIGlub2RlIGNhbm5vdCBiZSByZWFkIGR1ZSB0byBhIG1lZGlhIG9yIHJlbW90ZSBuZXR3b3JrCisgKglmYWlsdXJlIHRoaXMgZnVuY3Rpb24gbWFrZXMgdGhlIGlub2RlICJiYWQiIGFuZCBjYXVzZXMgSS9PIG9wZXJhdGlvbnMKKyAqCW9uIGl0IHRvIGZhaWwgZnJvbSB0aGlzIHBvaW50IG9uLgorICovCisgCit2b2lkIG1ha2VfYmFkX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKSAKK3sKKwlyZW1vdmVfaW5vZGVfaGFzaChpbm9kZSk7CisKKwlpbm9kZS0+aV9tb2RlID0gU19JRlJFRzsKKwlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPQorCQljdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOworCWlub2RlLT5pX29wID0gJmJhZF9pbm9kZV9vcHM7CQorCWlub2RlLT5pX2ZvcCA9ICZiYWRfZmlsZV9vcHM7CQorfQorRVhQT1JUX1NZTUJPTChtYWtlX2JhZF9pbm9kZSk7CisKKy8qCisgKiBUaGlzIHRlc3RzIHdoZXRoZXIgYW4gaW5vZGUgaGFzIGJlZW4gZmxhZ2dlZCBhcyBiYWQuIFRoZSB0ZXN0IHVzZXMKKyAqICZiYWRfaW5vZGVfb3BzIHRvIGNvdmVyIHRoZSBjYXNlIG9mIGludmFsaWRhdGVkIGlub2RlcyBhcyB3ZWxsIGFzCisgKiB0aG9zZSBjcmVhdGVkIGJ5IG1ha2VfYmFkX2lub2RlKCkgYWJvdmUuCisgKi8KKyAKKy8qKgorICoJaXNfYmFkX2lub2RlIC0gaXMgYW4gaW5vZGUgZXJyb3JlZAorICoJQGlub2RlOiBpbm9kZSB0byB0ZXN0CisgKgorICoJUmV0dXJucyB0cnVlIGlmIHRoZSBpbm9kZSBpbiBxdWVzdGlvbiBoYXMgYmVlbiBtYXJrZWQgYXMgYmFkLgorICovCisgCitpbnQgaXNfYmFkX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKSAKK3sKKwlyZXR1cm4gKGlub2RlLT5pX29wID09ICZiYWRfaW5vZGVfb3BzKTsJCit9CisKK0VYUE9SVF9TWU1CT0woaXNfYmFkX2lub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2JlZnMvQ2hhbmdlTG9nIGIvZnMvYmVmcy9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4Yzc4NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNDE3IEBACitWZXJzaW9uIDAuOTIgKDIwMDItMDMtMjkpCis9PT09PT09PT09CisqIE1pbm9yIGNsZWFudXAuIFJhbiBMaW5kZW50IG9uIHRoZSBzb3VyY2VzLgorCitWZXJzaW9uIDAuOTIgKDIwMDItMDMtMjcpCis9PT09PT09PT09CisqIEZpeGVkIG1vZHVsZSBtYWtlZmlsZSBwcm9ibGVtLiBJdCB3YXMgbm90IGNvbXBpbGluZyBhbGwgdGhlIGNvcnJlY3QgCisgICAgc291cmNlIGZpbGVzIQorKiBSZW1vdmVkIGR1cGxpY2F0ZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorKiBGaXhlZCBwb3RlbnRpYWwgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlIHdoZW4gcmVwb3J0aW5nIGFuIGVycm9yCisKK1ZlcnNpb24gMC45MSAoMjAwMi0wMy0yNikKKz09PT09PT09PT0KKyogT3khIEZpeGVkIHN0dXBpZCBidWcgdGhhdCB3b3VsZCBjYXVzZSBhbiB1bnJlc29sdmVkIHN5bWJvbCBlcnJvci4KKwlUaGFua3MgdG8gTGFzemxvIEJvc3pvcm1lbnlpIGZvciBwb2ludGluZyB0aGlzIG91dCB0byBtZS4KKworVmVyc2lvbiAwLjkgKDIwMDItMDMtMTQpCis9PT09PT09PT09CisqIEFkZGVkIFNlcmdleSBTLiBLb3N0eWxpb3YncyBwYXRjaCB0byBlbGltaW5hdGUgbWVtY3B5KCkgb3ZlcmhlYWQKKwlmcm9tIGIrdHJlZSBvcGVyYXRpb25zLiBDaGFuZ2VzIHRoZSBiZWZzX3JlYWRfZGF0YXN0cmVhbSgpIGludGVyZmFjZS4KKworKiBTZWdyZWdhdGVkIHRoZSBmdW5jdGlvbnMgdGhhdCBpbnRlcmZhY2UgZGlyZWN0bHkgd2l0aCB0aGUgbGludXggIHZmcyAKKwlpbnRlcmZhY2UgaW50byB0aGVpciBvd24gZmlsZSBjYWxsZWQgbGludXh2ZnMuYy4gW1dEXQorCitWZXJzaW9uIDAuNjQgKDIwMDItMDItMDcpCis9PT09PT09PT09CisqIERpZCB0aGUgc3RyaW5nIGNvbXBhcmlzaW9uIHJlYWxseSByaWdodCB0aGlzIHRpbWUgKGJ0cmVlLmMpIFtXRF0KKworKiBGaXhlZCB1cCBzb21lIHBsYWNlcyB3aGVyZSBJIGFzc3VtZWQgdGhhdCBhIGxvbmcgaW50IGNvdWxkIGhvbGQKKwlhIHBvaW50ZXIgdmFsdWUuIChidHJlZS5jKSBbV0RdCisKKyogQW5kcmV3IEZhcm5oYW0gPGFuZHJld2Zhcm5oYW1AdXEubmV0LmF1PiBwb2ludGVkIG91dCB0aGF0IHRoZSBtb2R1bGUKKwl3b3VsZG4ndCB3b3JrIG9uIG9sZGVyICg8Mi40LjEwKSBrZXJuZWxzIGR1ZSB0byBhbiB1bnJlc29sdmVkIHN5bWJvbC4KKwlUaGlzIGlzIGJhZCwgc2luY2UgMi40LjkgaXMgc3RpbGwgdGhlIGN1cnJlbnQgUmVkSGF0IGtlcm5lbC4gSSBhZGRlZAorCWEgd29ya2Fyb3VuZCBmb3IgdGhpcyBwcm9ibGVtIChjb21wYXRpYmlsaXR5LmgpIFtXRF0KKworKiBTZXJnZXkgUy4gS29zdHlsaW92IG1hZGUgYmVmc19maW5kX2tleSgpIHVzZSBhIGJpbmFyeSBzZWFyY2ggdG8gZmluZCAKKwlrZXlzIHdpdGhpbiBidHJlZSBub2RlcywgcmF0aGVyIHRoYW4gdGhlIGxpbmVhciBzZWFyY2ggd2Ugd2VyZSB1c2luZyAKKwliZWZvcmUuIChidHJlZS5jKSBbU2VyZ2V5IFMuIEtvc3R5bGlvdiA8cmF0aGFtYWhhdGFAcGhwNC5ydT5dCisKKyogTWFkZSBhIGRlYmlhbiBwYWNrYWdlIG9mIHRoZSBzb3VyY2UgZm9yIHVzZSB3aXRoIGtlcm5lbC1wYWNrYWdlLiBbV0RdCisKKworVmVyc2lvbiAwLjYzICgyMDAyLTAxLTMxKQorPT09PT09PT09PQorKiBGaXhlZCBidWcgaW4gYmVmc19maW5kX2JydW5faW5kaXJlY3QoKSB0aGF0IHdvdWxkIHJlc3VsdCBpbiB0aGUgd3JvbmcKKwlibG9jayBiZWluZyByZWFkLiBJdCB3YXMgaW50cm9kdWNlZCB3aGVuIGFkZGluZyBieXRlc3dhcHBpbmcgaW4gCisJMC42MS4gKGRhdGFzdHJlYW0uYykgW1dEXQorCisqIEZpeGVkIGEgbG9uZ3N0YW5kaW5nIGJ1ZyBpbiBiZWZzX2ZpbmRfa2V5KCkgdGhhdCB3b3VsZCByZXN1bHQgaW4gaXQgCisJZmluZGluZyB0aGUgZmlyc3Qga2V5IHRoYXQgaXMgYSBzdWJzdHJpbmcgb2YgdGhlIHN0cmluZyBpdCBpcyBzZWFyY2hpbmcKKwlmb3IuIEZvciBleGFtcGxlLCB0aGlzIHdvdWxkIGNhdXNlIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSB3aXRoIAorCW5hbWVzIGxpa2UgZmlsZTEgYW5kIGZpbGUyIHRvIG15c3RlcmlvdXNseSBiZSBkdXBsaWNhdGVzIG9mIGVhY2ggb3RoZXIgCisJKGJlY2F1c2UgdGhleSBoYXZlIHRoZSBzYW1lIGlub2RlIG51bWJlcikuIE1hbnkgdGhhbmtzIHRvIFBhdmVsIFJvc2tpbiAKKwlmb3IgcmVwb3J0aW5nIHRoaXMgc2VyaW91cyBidWchISEKKwkoYnRyZWUuYykgW1dEXQorCisqIEFkZGVkIHN1cHBvcnQgZm9yIGxvbmcgc3ltbGlua3MsIGFmdGVyIEF4ZWwgRG9yZmxlciBleHBsYWluZWQgdXAgaG93IAorCXRoZXkgd29yay4gSSBoYWQgZm9yZ290dGVuIGFsbCBhYm91dCB0aGVtLiAoaW5vZGUuYywgc3ltbGluay5jKSBbV0RdCisKKyogRG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMgaW4gc291cmNlLiBbV0RdCisKKyogTWFrZWZpbGUgZml4IGZvciBpbmRlcGVuZGVudCBtb2R1bGUgd2hlbiBDT05GSUdfTU9EVkVSU0lPTiBpcyBzZXQgaW4gCisJa2VybmVsIGNvbmZpZyBbUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz5dCisKKyogQ29tcGlsZSB3YXJuaW5nIGZpeCBmb3IgbmFtZWkuYy4gW1NlcmdleSBTLiBLb3N0eWxpb3YgPHJhdGhhbWFoYXRhQHBocDQucnU+XQorCisKK1ZlcnNpb24gMC42MgorPT09PT09PT09PQorKiBGaXhlZCBtYWtlZmlsZSBmb3IgbW9kdWxlIGluc3RhbGwgW1dEXQorCisKK1ZlcnNpb24gMC42MSAoMjAwMi0wMS0yMCkKKz09PT09PT09PT0KKyogTWFkZSBmdW5jdGlvbnMgaW4gZW5kaWFuLmggdG8gZG8gdGhlIGNvcnJlY3QgYnl0ZXN3YXBwaW5nLCBubyBtYXR0ZXIKKwl0aGUgYXJjaC4gW1dEXQorCisqIEFiYmFuZG9uZWQgc2lsbHkgY2hlY2tzIGZvciBhIE5VTEwgc3VwZXJibG9jayBwb2ludGVyIGluIGRlYnVnLmMuIFtXRF0KKworKiBNaXNjIGNvZGUgY2xlYW51cHMuIEFsc28gY2xlYW51cCBvZiB0aGlzIGNoYW5nZWxvZyBmaWxlLiBbV0RdCisKKyogQWRkZWQgYnl0ZXN3YXBwaW5nIHRvIGFsbCBtZXRhZGF0YSByZWFkcyBmcm9tIGRpc2suCisJVXNlcyB0aGUgZnVuY3Rpb25zIGZyb20gZW5kaWFuLmggW1dEXQorCisqIFJlbW92ZSB0aGUgdHlwZWRlZiBvZiBzdHJ1Y3Qgc3VwZXJfYmxvY2sgdG8gdmZzX3NiLCBhcyBpdCBvZmZlbmRlZAorCWNlcnRhaW4gcGVvcGxlcycgYWVzdGhldGljIHNlbnNlLiBbV0RdCisKKyogRGl0dG8gd2l0aCB0aGUgYmVmc19yZWFkX2Jsb2NrKCkgaW50ZXJmYWNlLiBbV0RdCisgCisKK1ZlcnNpb24gMC42ICgyMDAxLTEyLTE1KQorPT09PT09PT09PQorKiBDbGVhbnVwIG9mIE5MUyBmdW5jdGlvbnMgKHV0aWwuYykgW1dEXQorCisqIE1ha2UgZGlyZWN0b3J5IGxvb2t1cC9yZWFkIHVzZSB0aGUgTkxTIGlmIGFuIGlvY2hhcnNldCBpcyBwcm92aWRlZC4gW1dEXQorCisqIEZpeGVkIHN0dXBpZCBidWcgd2hlcmUgc3BlY2lmeWluZyB0aGUgdWlkIG9yIGdpZCBtb3VudCBvcHRpb25zIGFzICcwJyAKKwl3b3VsZCByZXN1bHQgaW4gdGhlIGZpbGVzeXN0ZW0gdXNpbmcgdGhlIG9uLWRpc2sgdWlkIGFuZCBnaWQuIFtXRF0KKworKiBBZGRlZCBtb3VudCBvcHRpb24gdG8gY29udHJvbCBkZWJ1ZyBwcmludGluZy4gCisJVGhlIG9wdGlvbiBpcywgc2ltcGx5IGVub3VnaCwgJ2RlYnVnJy4gCisJKHN1cGVyLmMsIGRlYnVnLmMpIFtXRF0KKworKiBSZW1vdmVkIG5vdGlvbiBvZiBidHJlZSBoYW5kbGUgZnJvbSBidHJlZS5jLiBJdCB3YXMgdW5uZWNlc3NhcnksIGFzIHRoZQorCWxpbnV4IFZGUyBkb2Vzbid0IGFsbG93IHVzIHRvIGtlZXAgYW55IHN0YXRlIGJldHdlZW4gY2FsbHMuIFVwZGF0ZWQgCisJZGlyLmMsIG5hbWVpLmMgYmVmc19mcy5oIHRvIGFjY291bnQgZm9yIGl0LiBbV0RdCisKKyogSW1wcm92ZWQgaGFuZGxlaW5nIG9mIG92ZXJmbG93IG5vZGVzIHdoZW4gbGlzdGluZyBkaXJlY3Rvcmllcy4gCisJTm93IHdvcmtzIGZvciBvdmVyZmxvdyBub2RlcyBoYW5naW5nIG9mZiBvZiBub2RlcyBvdGhlciB0aGFuIHRoZSByb290IAorCW5vZGUuIFRoaXMgaXMgdGhlIGNsZWFuZXIgc29sdXRpb24gdG8gQnJlbnQgTWlzemFsYXNraSdzIHByb2JsZW0uIFtXRF0KKworKiBBZGRlZCBuZXcgZGVidWcvd2FybmluZy9lcnJvciBwcmludCBmdW5jdGlvbnMgaW4gZGVidWcuYy4gCisJTW9yZSBmbGV4aWJsZS4gV2lsbCBzb29uIGJlIGNvbnRyb2xsYWJsZSBhdCBtb3VudCB0aW1lIAorCShzZWUgVE9ETykuIFtXRF0KKworKiBSZXdyb3RlIGRhdGFzdHJlYW0gcG9zaXRvbiBsb29rdXBzLgorCShkYXRhc3RyZWFtLmMpIFtXRF0KKworKiBNb3ZlZCB0aGUgVE9ETyBsaXN0IHRvIGl0cyBvd24gZmlsZS4KKworCitWZXJzaW9uIDAuNTAgKDIwMDEtMTEtMTMpCis9PT09PT09PT09CisqIEFkZGVkIHdvcmthcm91bmQgZm9yIG1pcy11bmRlcnN0YW5kaW5nIG9mIHRoZSBuYXR1cmUgb2YgdGhlIGIrdHJlZXMgdXNlZCAKKwlpbiBkaXJlY3Rvcmllcy4gQSBjbGVhbmVyIHNvbHV0aW9uIHdpbGwgY29tZSBhZnRlciBJJ3ZlIHRob3VnaHQgYWJvdXQgaXQgCisJZm9yIGEgd2hpbGUuIFRoYW5rcyB0byBCcmVudCBNaXN6YWxhc2tpIGZvciBmaW5kaW5nIGFuZCByZXBvcnRpbmcgdGhpcyBidWcuIAorCShidHJlZS5jKSBbV0RdCisKKyogTWlub3IgY2xlYW51cHMKKworKiBBZGRlZCB0ZXN0IGZvciAiaW1wb3NzaWJsZSIgY29uZGl0aW9uIG9mIGVtcHR5IGludGVybmFsIG5vZGVzIGluIAorCXNlZWtsZWFmKCkgaW4gYnRyZWUuYyBbV0RdCisKKyogSW1wbGVtZW50ZWQgdGhlIGFic3RyYWN0ZWQgcmVhZF9ibG9jaygpIGluIGlvLmMgW1dEXQorCisqIENsZWFuZWQgdXAgdGhlIGlub2RlIHZhbGlkYXRpb24gaW4gaW5vZGUuYyBbV0RdCisKKyogQW50b24gQWx0YXBhcm1ha292IGZpZ3VyZWQgb3V0IChieSBhc2tpbmcgTGludXMgOikgKSB3aGF0IHdhcyBjYXVzaW5nIHRoZSAKKyAJaGFuZ2luZyBkaXNrIGlvIHByb2JsZW0uIEl0IHR1cm5zIG91dCB5b3UgbmVlZCB0byBoYXZlIHRoZSBzeW5jX3BhZ2VzIAorCWNhbGxiYWNrIGRlZmluZWQgaW4geW91ciBhZGRyZXNzX3NwYWNlX29wcywgZXZlbiBpZiBpdCBqdXN0IHVzZXMgdGhlIAorCWRlZmF1bHQgbGludXgtc3VwcGxpZWQgaW1wbGVtZW50YXRpb24uIEZpeGVkLiBXb3JrcyBub3cuCisJKGZpbGUuYykgW1dEXQorCisqIEFudG9uIEFsdGFwYXJtYWtvdiBhbmQgQ2hyaXN0b3BoIEhlbGx3aWcgYWxlcnRlZCBtZSB0byB0aGUgZmFjdCB0aGF0IAorCWZpbGVzeXN0ZW0gY29kZSBzaG91bGQgYmUgdXNpbmcgR0ZQX05PRlMgaW5zdGVhZCBvZiBHRlBfS0VSTkVMIGFzIHRoZSAKKwlwcmlvcml0eSBwYXJhbWV0ZXIgdG8ga21hbGxvYygpLiBGaXhlZC4gCisJKGRhdGFzdHJlYW0uYywgYnRyZWUuYyBzdXBlci5jIGlub2RlLmMpIFtXRF0KKworKiBBbnRvbiBhbHNvIHRvbGQgbWUgdGhhdCB0aGUgYmxvY2tzaXplIGlzIG5vdCBhbGxvd2VkIHRvIGJlIGxhcmdlciB0aGFuIAorCXRoZSBwYWdlIHNpemUgaW4gbGludXgsIHdoaWNoIGlzIDRrIGkzODYuIE9vcHMuIEFkZGVkIGEgdGVzdCBmb3IgCisJKGJsb2Nrc2l6ZSA+IFBBR0VfU0laRSksIGFuZCByZWZ1c2UgdG8gbW91bnQgaW4gdGhhdCBjYXNlLiBXaGF0IHRoaXMgCisJcHJhY3RpY2FseSBtZWFucyBpcyB0aGF0IDhrIGJsb2Nrc2l6ZSB2b2x1bWVzIHdvbid0IHdvcmsgd2l0aG91dCBhIG1ham9yCisJcmVzdHJ1Y3R1cmluZyBvZiB0aGUgZHJpdmVyIChvciBhbiBhbHBoYSBvciBvdGhlciA2NGJpdCBoYXJkd2FyZSkuIFtXRF0KKworKiBDbGVhbmVkIHVwIHRoZSBiZWZzX2NvdW50X2Jsb2NrcygpIGZ1bmN0aW9uLiBNdWNoIHNtYXJ0ZXIgbm93LiAKKwlBbmQgc29tZXdoYXQgc21hbGxlciB0b28uIFtXRF0KKworKiBNYWRlIGlub2RlIGFsbG9jYXRpb25zIHVzZSBhIHNsYWIgY2FjaGUgCisJKHN1cGVyLmMgaW5vZGUuYykgW1dEXQorCisqIE1vdmVkIHRoZSBmcmVlaW5nIG9mIHRoZSBwcml2YXRlIGlub2RlIHNlY3Rpb24gZnJvbSBwdXRfaW5vZGUoKSB0byAKKwljbGVhcl9pbm9kZSgpLiBUaGlzIGZpeGVzIGEgcG90ZW50aWFsIGZyZWUgdHdpY2UgdHlwZSBidWcuIFB1dF9pbm9kZSgpIAorCWNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGVhY2ggaW5vZGUgc3RydWN0LiBbV0RdCisKKyogQ29udmVydGVkIGFsbCBub24gdmZzLWNhbGxiYWNrIGZ1bmN0aW9ucyB0byB1c2UgYmVmc19zYl9pbmZvIGFzIHRoZSAKKwlzdXBlcmJsb2NrIHR5cGUsIHJhdGhlciB0aGFuIHN0cnVjdCBzdXBlcl9ibG9jay4gVGhpcyBpcyBmb3IgCisJcG9ydGFibGl0eS4gW1dEXQorCisqIEZpeGVkIGEgY291cGxlIG9mIGNvbXBpbGUgd2FybmluZ3MgZHVlIHRvIHVzZSBvZiBtYWxsb2MuaCwgd2hlbiBzbGFiLmggCisJaXMgdGhlIG5ldyB3YXkuIChpbm9kZS5jLCBzdXBlci5jKSBbV0RdCisKKyogRml4ZWQgZXJyb25vdXMgaW5jbHVkZXMgb2YgbGludXgvYmVmc19mc19pLmggYW5kIGxpbnV4L2JlZnNfZnNfc2IuaCAKKwlpbiBpbm9kZS5jIFtXRF0KKworVmVyc2lvbiAwLjQ1ICgyMDAxLTEwLTI5KQorPT09PT09PT09PQorKiBBZGRlZCBmdW5jdGlvbnMgdG8gZ2V0IHRoZSBwcml2YXRlIHN1cGVyYmxvY2sgYW5kIGlub2RlIHN0cnVjdHVyZXMgZnJvbSAKKwl0aGVpciBlbmNsb3NpbmcgcHVibGljIHN0cnVjdHVyZXMuIFN3aXRjaGVkIGFsbCByZWZlcmVuY2VzIHRvIHRoZSAKKwlwcml2YXRlIHBvcnRpb25zIHRvIHVzZSB0aGVtLiAobWFueSBmaWxlcykgW1dEXQorCisqIE1hZGUgcmVhZF9zdXBlciBhbmQgcmVhZF9pbm9kZSBhbGxvY2F0ZSB0aGUgcHJpdmF0ZSBwb3J0aW9ucyBvZiB0aG9zZSAKKwlzdHJ1Y3R1cmVzIGludG8gdGhlIGdlbmVyaWMgcG9pbnRlciBmaWVsZHMgb2YgdGhlIHB1YmxpYyBzdHJ1Y3R1cmVzIAorCXdpdGgga21hbGxvYygpLiBwdXRfc3VwZXIgYW5kIHB1dF9pbm9kZSBmcmVlIHRoZW0uIFRoaXMgYWxsb3dzIHVzIG5vdCAKKwl0byBoYXZlIHRvIHRvdWNoIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgcHVibGljIHN0cnVjdHVyZXMgaW4gCisJaW5jbHVkZS9saW51eC9mcy5oLiBBbHNvLCBiZWZzX2lub2RlX2luZm8gaXMgaHVnZSAoYmVjdWFzZSBvZiB0aGUgCisJc3ltbGluayBzdHJpbmcpLiAoc3VwZXIuYywgaW5vZGUuYywgYmVmc19mcy5oKSBbV0RdCisKKyogRml4ZWQgYSB0aGlua28gdGhhdCB3YXMgY29ycnVwdGluZyBmaWxlIHJlYWRzIGFmdGVyIHRoZSBmaXJzdCBibG9ja19ydW4gCisJaXMgZG9uZSBiZWluZyByZWFkLiAoZGF0YXN0cmVhbS5jKSBbV0RdCisKKyogUmVtb3ZlZCBmc3luYygpIGhvb2tzLCBzaW5jZSBhIHJlYWQtb25seSBmaWxlc3lzdGVtIGRvZXNuJ3QgbmVlZCB0aGVtLiAKKwlbQ2hyaXN0b3BoIEhlbGx3aWddLgorCisqIEZpeGVkIGJlZnNfcmVhZGxpbmsoKSAoc3ltbGluay5jKSBbQ2hyaXN0b3BoIEhlbGx3aWddLgorCisqIFJlbW92ZWQgYWxsIHRoZSBSZWFkLVdyaXRlIHN0dWZmLiBJJ2xsIHJlZG8gaXQgd2hlbiBpdCBpcyB0aW1lIHRvIGFkZCAKKwl3cml0ZSBzdXBwb3J0ICh2YXJpb3VzIGZpbGVzKSBbV0RdLgorCisqIFJlbW92ZWQgcHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIHdobydzIGRlZmluaXRpb25zIGhhdmUgYmVlbiByZW1vdmVkIAorCShiZWZzX2ZzLmgpIFtXRF0uCisKKworVmVyc2lvbiAwLjQgKDIwMDEtMTAtMjgpCis9PT09PT09PT09CisqIE1hZGUgaXQgYW4gb3B0aW9uIHRvIHVzZSB0aGUgb2xkIG5vbi1wYWdlY2FjaGUgYmVmc19maWxlX3JlYWQoKSBmb3IgCisJdGVzdGluZyBwdXJwb3Nlcy4gKGZzL0NvbmZpZy5pbikKKworKiBGaXhlZCB1bnVzZWQgdmFyaWFibGUgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aG91dCBkZWJ1Z2dpbmcuCisKKyogRml4ZWQgYSBidWcgd2hlcmUgdGhlIGlub2RlIGFuZCBzdXBlcl9ibG9jayBkaWRuJ3QgZ2V0IHRoZWlyIGJsb2NrYml0cyAKKwlmaWVsZHMgc2V0IChpbm9kZS5jIGFuZCBzdXBlci5jKS4gCisKKyogUmVsZWFzZSBwYXRjaCB2ZXJzaW9uIDExLiBBS0EgYmVmcy1kcml2ZXIgdmVyc2lvbiAwLjQuCisKKyogVGhhdHMgcmlnaHQuIE5ldyB2ZXJzaW9uaW5nIHNjaGVtZS4gCisJSSd2ZSBkb25lIHNvbWUgc2VyaW91cyB0ZXN0aW5nIG9uIGl0IG5vdyAob24gbXkgYm94IGFueWhvdyksIGFuZCBpdCAKKwlzZWVtcyBzdGFibGUgYW5kIG5vdCBvdXRyYWdvdXNseSBzbG93LiBFeGlzdGluZyBmZWF0dXJlcyBhcmUgbW9yZS1vci1sZXNzIAorCWNvcnJlY3QgKHNlZSBUT0RPIGxpc3QpLiBCdXQgaXQgaXNuJ3QgMS4wIHlldC4gSSB0aGluayAwLjQgZ2l2ZXMgbWUgc29tZSAKKwloZWFkcm9vbSBiZWZvcmUgdGhlIGJpZyAxLjAuCisKKworMjAwMS0xMC0yNgorPT09PT09PT09PQorKiBGaXhlZCBkYXRlIGZvcm1hdCBpbiB0aGlzIGZpbGUuIFdhcyBJIHNtb2tpbmcgY3JhY2s/CisKKyogUmVtb3ZlZCBvbGQgZGF0YXN0cmVhbSBjb2RlIGZyb20gZmlsZS5jLCBzaW5jZSBpdCBpcyBub2xvbmdlciB1c2VkLgorCisqIEdlbmVyaWNfcmVhZF9maWxlKCkgaXMgbm93IHVzZWQgdG8gcmVhZCByZWd1bGFyIGZpbGUgZGF0YS4gCisJSXQgZG9lc24ndCBjaGV3IHVwIHRoZSBidWZmZXIgY2FjaGUgKGl0IGRvZXMgcGFnZSBpbyBpbnN0ZWFkKSwgYW5kIHNlZW1zIAorCXRvIGJlIGFib3V0IGFzIGZhc3QgKGV2ZW4gdGhvdWdoIGl0IGhhcyB0byBsb29rIHVwIGVhY2ggZmlsZSBibG9jayAKKwlpbmRpdmR1YWx5KS4gQW5kIGl0IGtub3dzIGFib3V0IGRvaW5nIHJlYWRhaGVhZCwgd2hpY2ggaXMgYSBtYWpvciBwbHVzLiAKKwlTbyBpdCBkb2VzIGkvbyBpbiBtdWNoIGxhcmdlciBjaHVua3MuIEl0IGlzIHRoZSBjb3JyZWN0IGxpbnV4IHdheS4gSXQgCisJdXNlcyBiZWZzX2dldF9ibG9jaygpIGJ5IHdheSBvZiBiZWZzX3JlYWRwYWdlKCkgdG8gZmluZCB0aGUgZGlzayBvZmZzZXRzIAorCW9mIGJsb2Nrcywgd2hpY2ggaW4gdHVybiBjYWxscyBiZWZzX2Zwb3MyYnJ1bigpIGluIGRhdGFzdHJlYW0uYyB0byBkbyAKKwl0aGUgaGFyZCB3b3JrIG9mIGZpbmRpbmcgdGhlIGRpc2sgYmxvY2sgbnVtYmVyLgorCisqIENoYW5nZWQgbWV0aG9kIG9mIGNoZWNraW5nIGZvciBhIGRpcnR5IGZpbGVzeXN0ZW0gaW4gYmVmc19yZWFkX3N1cGVyIAorCShzdXBlci5jKS4gTm93IHdlIGNoZWNrIHRvIHNlZSBpZiBsb2dfc3RhcnQgYW5kIGxvZ19lbmQgZGlmZmVyLiBJZiBzbywgCisJdGhlIGpvdXJuYWwgbmVlZHMgdG8gYmUgcmVwbGF5ZWQsIGFuZCB0aGUgZmlsZXN5c3RlbSBjYW5ub3QgYmUgbW91bnRlZC4KKworKiBGaXhlZCBhbiBleHRyYSBpbnN0YW5jZSBvZiBNT0RfREVDX1VTRV9DT1VOVCBpbiBzdXBlci5jCisKKyogRml4ZWQgYSBwcm9ibGVtIHdpdGggcmVhZGluZyB0aGUgc3VwZXJibG9jayBvbiBkZXZpY2VzIHdpdGggbGFyZ2Ugc2VjdG9yIAorCXNpemVzIChzdWNoIGFzIGNkcm9tcykgb24gbGludXggMi40LjEwIGFuZCB1cC4KKworMjAwMS0xMC0yNAorPT09PT09PT09PQorKiBGaXggbmFzdHkgYnVnIGluIGNvbnZlcnRpbmcgYmxvY2sgbnVtYmVycyB0byBzdHJ1Y3QgYmVmc19pbm9kZV9hZGRyLiAKKwlTdWJ0bGUsIGJlY2F1c2UgdGhlIG9sZCB2ZXJzaW9uIHdhcyBvbmx5IHNvbWV0aW1lcyB3cm9uZy4gCisJUHJvYmFibHkgcmVzcG9uc2libGUgZm9yIGxvdHMgb2YgcHJvYmxlbXMuIChpbm9kZS5jKQorCisqIEZpeCBidWcgd2l0aCByZWFkaW5nIGFuIGVtcHR5IGRpcmVjdG9yeS4gKGJ0cmVlLmMgYW5kIGRpci5jKQorCisqIFRoaXMgb25lIGxvb2tzIGdvb2QuIFJlbGVhc2UgcGF0Y2ggdmVyc2lvbiAxMAorCisyMDAxLTEwLTIzCis9PT09PT09PT09CisqIEFkZGVkIGJ0cmVlIHNlYXJjaGluZyBmdW5jdGlvbi4KKworKiBVc2UgYmVmc19idHJlZV9maW5kIGluIGJlZnNfbG9va3VwIChuYW1laS5jKQorCisqIEFkZGl0aW9uYWwgY29tbWVudHMgaW4gYnRyZWUuYworCisyMDAxLTEwLTIyCis9PT09PT09PT09CisqIEFkZGVkIEIrdHJlZSByZWFkaW5nIGZ1bmN0aW9ucyAoaW4gYnRyZWUuYykuIAorCU1hZGUgYmVmc19yZWFkZGlyKCkgdXNlIHRoZW0gdGhlbSBpbnN0ZWFkIG9mIHRoZSBjcnVmdCBpbiBpbmRleC5jLgorCisyMDAxLTA5LTExCis9PT09PT09PT09CisqIENvbnZlcnRlZCBiZWZzX3JlYWRfZmlsZSgpIHRvIHVzZSB0aGUgbmV3IGRhdGFzdHJlYW0gY29kZS4KKworKiBGaW5hbGx5IHVwZGF0ZWQgdGhlIFJFQURNRSBmaWxlLgorCisqIEFkZGVkIG1hbnkgY29tbWVudHMuCisKKyogUG9zdGVkIHZlcnNpb24gNgorCisqIFJlbW92ZWQgYnl0ZS1vcmRlciBjb252ZXJzaW9uIGNvZGUuIAorCUkgaGF2ZSBubyBpbnRlbnRpb24gb2Ygc3VwcG9ydGluZyBpdCwgYW5kIGl0IHdhcyB2ZXJ5IHVnbHkuIAorCUZsb3cgY29udHJvbCB3aXRoICNpZmRlZiAodWdoKS4gTWF5YmUgSSdsbCByZWRvIGl0IG9uY2UgCisJbmF0aXZlIGJ5dGVvcmRlciB3b3JrcyAxMDAlLgorCisyMDAxLTA5LTEwCis9PT09PT09PT09CisqIEZpbmlzaGVkIGltcGxlbWVudGluZyByZWFkX2RhdGFzdHJlYW0oKQorCisqIG1hZGUgYmVmc19yZWFkX2JydW4oKSBtb3JlIGdlbmVyYWwKKwlTdXBwb3J0cyBhbiBvZmZzZXQgdG8gc3RhcnQgYXQgYW5kIGEgbWF4IGJ5dGVzIHRvIHJlYWQKKwlBZGRlZCBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gZ2l2ZSB0aGUgb2xkIGNhbGwKKworMjAwMS0wOS0zMAorPT09PT09PT09PQorKiBEaXNjb3ZlcmVkIHRoYXQgdGhlIGRhdGFzdHJlYW0gaGFuZGxlaW5nIGNvZGUgaW4gZmlsZS5jIGlzIHF1aXRlIGRlZmljaWVudCAKKwlpbiBzZXZlcmFsIHJlc3BlY3RzLiBGb3Igb25lIHRoaW5nLCBpdCBkb2Vzbid0IGRlYWwgd2l0aCBpbmRpcmVjdCBibG9ja3MKKworKiBSZXdyb3RlIGRhdGFzdHJlYW0gaGFuZGxlaW5nLgorCisqIENyZWF0ZWQgaW8uYywgZm9yIGlvIHJlbGF0ZWQgZnVuY3Rpb25zLgorCVByZXZpb3VzbHksIHRoZSBiZWZzX2JyZWFkKCkgZnVudGlvbnMgbGl2ZWQgaW4gZmlsZS5jCisJQ3JlYXRlZCB0aGUgYmVmc19yZWFkX2JydW4oKSBmdW5jdGlvbi4KKworCisyMDAxLTA5LTA3Cis9PT09PT09PT09CisqIE1hZGUgYSBmdW5jdGlvbiB0byBhY3R1YWxseSBjb3VudCB0aGUgbnVtYmVyIG9mIGZzIGJsb2NrcyB1c2VkIGJ5IGEgZmlsZS4KKwlBbmQgaGVscGVyIGZ1bmN0aW9ucy4KKwkoZnMvYmVmcy9pbm9kZS5jKQorCisyMDAxLTA5LTA1Cis9PT09PT09PT09CisqIEZpeGVkIGEgbWlzdW5kZXJzdGFuZGluZyBvZiB0aGUgaW5vZGUgZmllbGRzLiAKKwlUaGlzIGZpeGVkIHRoZSBwcm9ibG1lbSB3aXRoIHdyb25nIGZpbGUgc2l6ZXMgZnJvbSBkdSBhbmQgb3RoZXJzLgorCVRoZSBpX2Jsb2NrcyBmaWVsZCBvZiB0aGUgaW5vZGUgc3RydWN0IGlzIG5vdCB0aGUgbnVtYmVyIG9mIGJsb2NrcyBmb3IgdGhlCisJaW5vZGUsIGl0IGlzIHRoZSBudW1iZXIgb2YgYmxvY2tzIGZvciB0aGUgZmlsZS4JQWxzbywgaV9ibGtzaXplIGlzIG5vdAorCW5lY2Vzc2FyaWx5IHRoZSBzaXplIG9mIHRoZSBpbm9kZSwgYWx0aG91Z2ggaW4gIHByYWN0aWNlIGl0IHdvcmtzIG91dC4KKwlDaGFuZ2VkIHRvIGJsb2Nrc2l6ZSBvZiBmaWxlc3lzdGVtLgorCShmcy9iZWZzL2lub2RlLmMpCisKKyogUGVybWFuZW50bHkgcmVtb3ZlZCBjb2RlIHRoYXQgaGFkIGJlZW4gcHJvdmlzaW9uYWxseSBpZmRlZmVkIG91dCBvZiBiZWZzX2ZzLmgKKworKiBTaW5jZSB3ZSBkb24ndCBzdXBwb3J0IGFjY2VzcyB0aW1lLCBtYWtlIHRoYXQgZmllbGQgemVybywgaW5zdGVhZCBvZiAKKwljb3B5aW5nIG1fdGltZS4KKwkoZnMvYmVmcy9pbm9kZS5jKQorCisqIEFkZGVkIHNhbml0eSBjaGVjayBmb3IgaW5vZGUgcmVhZGluZworCU1ha2Ugc3VyZSBpbm9kZSB3ZSBnb3Qgd2FzIHRoZSBvbmUgd2UgYXNrZWQgZm9yLiAKKwkoZnMvYmVmcy9pbm9kZS5jKQorCisqIENvZGUgY2xlYW51cAorCUxvY2FsIHBvaW50ZXJzIHRvIGNvbW1vbmx5IHVzZWQgc3RydWN0dXJlcyBpbiBpbm9kZS5jLgorCUdvdCByaWQgb2YgYWJvbWluYXRpb25zIGJlZnNfaWFkZHIyaW5vZGUoKSBhbmQgYmVmc19pbm9kZTJpbm8oKS4gCisJUmVwbGFjZWQgd2l0aCBzaW5nbGUgZnVuY3Rpb24gaWFkZHIyYmxvY2tubygpLgorCShmcy9iZWZzL3N1cGVyLmMpIChmcy9iZWZzL2lub2RlLmMpCisKKzIwMDEtMDktMDEKKz09PT09PT09PT0KKyogRml4ZWQgdGhlIHByb2JsZW0gd2l0aCBzdGF0ZnMgd2hlcmUgaXQgd291bGQgYWx3YXlzIGNsYWltIHRoZSBkaXNrIHdhcyAKKwloYWxmIGZ1bGwsIGR1ZSB0byBpbXByb3BlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBzdGF0ZnMgZmllbGRzLgorCShmcy9iZWZzL3N1cGVyLmMpCisKKyogUG9zdGVkIHZlcmlvbiA0IG9mIHRoZSBwYXRjaAorCisyMDAxLTA5LTAxCis9PT09PT09PT09CisqIENoYW5nZWQgdGhlIG1hY3JvcyBpbiBiZWZzX2ZzLmggdG8gaW5saW5lIGZ1bmN0aW9ucy4KKwlNb3JlIHJlYWRhYmxlLiBUeXBlc2FmZS4gQmV0dGVyCisJKGluY2x1ZGUvbGludXgvYmVmc19mcy5oKQorCisqIE1vdmVkIHR5cGUgZGVmaW5pdGlvbnMgZnJvbSBiZWZzX2ZzLmggdG8gYSBuZXcgZmlsZSwgYmVmc19mc190eXBlcy5oIAorCUJlY2F1c2UgYmVmc19mc19pLmggYW5kIGJlZnNfZnNfc2IuaCB3ZXJlIGluY2x1ZGluZyBiZWZzX2ZzLmggZm9yIHRoZSAKKwl0eXBlZGVmcywgYW5kIHRoZXkgYXJlIGlubGN1ZGVkIGluIDxsaW51eC9mcy5oPiwgd2hpY2ggaGFzIGRlZmluaXRpb25zIAorCXRoYXQgSSB3YW50IHRoZSBpbmxpbmUgZnVuY3Rpb25zIGluIGJlZnNfZnMuaCB0byBiZSBhYmxlIHRvIHNlZS4gTmFzdHkKKwljaXJjdWxhcml0eS4KKwkoaW5jbHVkZS9saW51eC9iZWZzX2ZzLmgpCisKKzIwMDEtMDgtMzAKKz09PT09PT09PT0KKyogQ2xlYW5lZCB1cCBzb21lIHdvcmRpbmcuCisKKyogQWRkZWQgYWRkaXRpb25hbCBjb25zaXRlbmN5IGNoZWNrcyBvbiBtb3VudAorCUNoZWNrIGJsb2NrX3NpemUgYWdyZWVzIHdpdGggYmxvY2tfc2hpZnQKKwlDaGVjayBmbGFncyA9PSBCRUZTX0NMRUFOCisJKGZzL2JlZnMvc3VwZXIuYykKKworKiBUZWxsIHRoZSBrZXJuZWwgdG8gb25seSBtb3VudCBiZWZzIHJlYWQtb25seS4gCisJQnkgc2V0dGluZyB0aGUgTVNfUkRPTkxZIGZsYWcgaW4gYmVmc19yZWFkX3N1cGVyKCkuCisJTm90IHRoYXQgaXQgd2FzIHBvc3NpYmxlIHRvIHdyaXRlIGJlZm9yZS4gQnV0IG5vdyB0aGUga2VybmVsIHdvbid0IGV2ZW4gdHJ5LgorCShmcy9iZWZzL3N1cGVyLmMpCisKKyogR290IHJpZCBvZiBrZXJuZWwgd2FybmluZyBvbiBtb3VudC4KKwlUaGUga2VybmVsIGRvZXNuJ3QgbGlrZSBpdCBpZiB5b3UgY2FsbCBzZXRfYmxvY2tzaXplKCkgb24gYSBkZXZpY2Ugd2hlbiAKKwl5b3UgaGF2ZSBzb21lIG9mIGl0cyBibG9ja3Mgb3Blbi4gTW92ZWQgdGhlIHNlY29uZCBzZXRfYmxvY2tzaXplKCkgdG8gdGhlCisJdmVyeSBlbmQgb2YgYmVmc19yZWFkX3N1cGVyKCksIGFmdGVyIHdlIGFyZSBkb25lIHdpdGggdGhlIGRpc2sgc3VwZXJibG9jay4KKwkoZnMvYmVmcy9zdXBlci5jKQorCQorKiBGaXhlZCB3cm9uZyBudW1iZXIgb2YgYXJncyBidWcgaW4gYmVmc19kdW1wX2lub2RlCisJKGZzL2JlZnMvZGVidWcuYykKKworKiBTb2x2ZWQgbG90cyBvZiB0eXBlIG1pc21hdGNoZXMgaW4ga3ByaW50KClzCisJKGV2ZXJ3aGVyZSkKKworMjAwMS0wOC0yNworPT09PT09PT09PQorKiBDbGVhbmVkIHVwIHRoZSBmcy9Db25maWcuaW4gZW50cmllcyBhIGJpdCwgbm93IHNsaWdodGx5IG1vcmUgZGVzY3JpcHRpdmUuCisKKyogQmVGUyBkZXBlbmRzIG9uIE5MUywgc28gSSBtYWRlIGFjdGl2YXRpbmcgQmVGUyBlbmFibGUgdGhlIE5MUyBxdWVzdGlvbnMKKwkoZnMvbmxzL0NvbmZpZy5pbikKKworKiBBZGRlZCBDb25maWd1cmUuaGVscCBlbnRyaWVzIGZvciBDT05GSUdfQkVGU19GUyBhbmQgQ09ORklHX0RFQlVHX0JFRlMKKwkoRG9jdW1lbnRhdGlvbi9Db25maWd1cmUuaGVscCkKKworMjAwMS0wOC0/PworPT09PT09PT09PQorKiBSZW1vdmVkIHN1cGVyYmxvY2sgbG9ja2luZyBjYWxscyBpbiBiZWZzX3JlYWRfc3VwZXIoKS4gSW4gMi40LCB0aGUgVkZTIAorCWhhbmRzIHVzIGEgc3VwZXJfYmxvY2sgc3RydWN0IHRoYXQgaXMgYWxyZWFkeSBsb2NrZWQuCisKKzIwMDEtMDgtMTMKKz09PT09PT09PT0KKyogV2lsbCBEeXNvbiA8d2lsbF9keXNvbkBwb2JveC5jb20+IGlzIG5vdyBhdHRlbXB0aW5nIHRvIG1haW50YWluIHRoaXMgbW9kdWxlCisJTWFrb3RvIEthdG8gPG1fa2F0b0BnYTIuc28tbmV0Lm5lLmpwPiBpcyBvcmlnaW5hbCBhdXRob3IuRGFuaWVsIEJlcmxpbiAKKwlhbHNvIGRpZCBzb21lIHdvcmsgb24gaXQgKGZpeGluZyBpdCB1cCBmb3IgdGhlIGxhdGVyIDIuMy54IGtlcm5lbHMsIElJUkMpLgorCisqIEZpeGVkIGNvbXBpbGUgZXJyb3JzIG9uIDIuNC4xIGtlcm5lbCAoV0QpCisJUmVzb2x2ZSByZWplY3RlZCBwYXRjaGVzCisJQWNjb21vZGF0ZSBjaGFuZ2VkIE5MUyBpbnRlcmZhY2UgKHV0aWwuaCkKKwlOZWVkZWQgdG8gaW5jbHVkZSA8bGludXgvc2xhYi5oPiBpbiBtb3N0IGZpbGVzCisJTWFrZWZpbGUgY2hhbmdlcworCWZzL0NvbmZpZy5pbiBjaGFuZ2VzCisKKyogVHJpZWQgdG8gbmljZWlmeSB0aGUgY29kZSB1c2luZyB0aGUgZXh0MiBmcyBhcyBhIGd1aWRlCisJRGVjbGFyZSBiZWZzX2ZzX3R5cGUgdXNpbmcgdGhlIERFQ0xBUkVfRlNUWVBFX0RFVigpIG1hY3JvCisKKyogTWFkZSBpdCBhIGNvbmZpZ3VyZSBvcHRpb24gdG8gdHVybiBvbiBkZWJ1Z2dpbmcgKGZzL0NvbmZpZy5pbikKKworKiBDb21waWxlcyBvbiAyLjQuNwpkaWZmIC0tZ2l0IGEvZnMvYmVmcy9NYWtlZmlsZSBiL2ZzL2JlZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYzNzBiZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggQmVPUyBmaWxlc3lzdGVtIHJvdXRpbmVzLgorIworIAorb2JqLSQoQ09ORklHX0JFRlNfRlMpICs9IGJlZnMubworCitiZWZzLW9ianMgOj0gZGF0YXN0cmVhbS5vIGJ0cmVlLm8gc3VwZXIubyBpbm9kZS5vIGRlYnVnLm8gaW8ubyBsaW51eHZmcy5vCmRpZmYgLS1naXQgYS9mcy9iZWZzL1RPRE8gYi9mcy9iZWZzL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1MDkyMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvVE9ETwpAQCAtMCwwICsxLDE0IEBACitUT0RPCis9PT09PT09PT09CisKKyogQ29udmVydCBjb21tZW50cyB0byB0aGUgS2VybmVsLURvYyBmb3JtYXQuCisKKyogQmVmc19mcy5oIGhhcyBnb3R0ZW4gYmlnIGFuZCBtZXNzeS4gTm8gcmVhc29uIG5vdCB0byBicmVhayBpdCB1cCBpbnRvIAorCXNtYWxsZXIgcGVpY2VzLgorCisqIFNlZSBpZiBBbGV4YW5kZXIgVmlybydzIG9wdGlvbiBwYXJzZXIgbWFkZSBpdCBpbnRvIHRoZSBrZXJuZWwgdHJlZS4gCisJVXNlIHRoYXQgaWYgd2UgY2FuLiAoaW5jbHVkZS9saW51eC9wYXJzZXIuaCkKKworKiBTZWUgaWYgd2UgcmVhbGx5IG5lZWQgc2VwYXJhdGUgdHlwZXMgZm9yIG9uLWRpc2sgYW5kIGluLW1lbW9yeSAKKwlyZXByZXNlbnRhdGlvbnMgb2YgdGhlIHN1cGVyYmxvY2sgYW5kIGlub2RlLgorCmRpZmYgLS1naXQgYS9mcy9iZWZzL2F0dHJpYnV0ZS5jIGIvZnMvYmVmcy9hdHRyaWJ1dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzI5ZDcyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYmVmcy9hdHRyaWJ1dGUuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIGxpbnV4L2ZzL2JlZnMvYXR0cmlidXRlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgV2lsbCBEeXNvbiA8d2lsbF9keXNvbkBwb2JveC5jb20+CisgKgorICogTWFueSB0aGFua3MgdG8gRG9taW5pYyBHaWFtcGFvbG8sIGF1dGhvciBvZiAiUHJhY3RpY2FsIEZpbGUgU3lzdGVtCisgKiBEZXNpZ24gd2l0aCB0aGUgQmUgRmlsZSBTeXN0ZW0iLCBmb3Igc3VjaCBhIGhlbHBmdWwgYm9vay4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlICJiZWZzLmgiCisjaW5jbHVkZSAiZW5kaWFuLmgiCisKKyNkZWZpbmUgU0RfREFUQShzZClcCisJKHZvaWQqKSgoY2hhciopc2QgKyBzaXplb2YoKnNkKSArIChzZC0+bmFtZV9zaXplIC0gc2l6ZW9mKHNkLT5uYW1lKSkpCisKKyNkZWZpbmUgU0RfTkVYVChzZClcCisJKGJlZnNfc21hbGxfZGF0YSopKChjaGFyKilzZCArIHNpemVvZigqc2QpICsgKHNkLT5uYW1lX3NpemUgLSBcCisJc2l6ZW9mKHNkLT5uYW1lKSArIHNkLT5kYXRhX3NpemUpKQorCitpbnQKK2xpc3Rfc21hbGxfZGF0YShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2lub2RlICogaW5vZGUsIGZpbGxkaXJfdCBmaWxsZGlyKTsKKworYmVmc19zbWFsbF9kYXRhICoKK2ZpbmRfc21hbGxfZGF0YShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2lub2RlICogaW5vZGUsCisJCQkJIGNvbnN0IGNoYXIgKm5hbWUpOworaW50CityZWFkX3NtYWxsX2RhdGEoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19pbm9kZSAqIGlub2RlLAorCQkgYmVmc19zbWFsbF9kYXRhICogc2RhdGEsIHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUpOworCisvKioKKyAqCisgKgorICoKKyAqCisgKgorICovCitiZWZzX3NtYWxsX2RhdGEgKgorZmluZF9zbWFsbF9kYXRhKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfaW5vZGUgKiBpbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwliZWZzX3NtYWxsX2RhdGEgKnNkYXRhID0gaW5vZGUtPnNtYWxsX2RhdGE7CisKKwl3aGlsZSAoc2RhdGEtPnR5cGUgIT0gMCkgeworCQlpZiAoc3RyY21wKG5hbWUsIHNkYXRhLT5uYW1lKSAhPSAwKSB7CisJCQlyZXR1cm4gc2RhdGE7CisJCX0KKwkJc2RhdGEgPSBTRF9ORVhUKHNkYXRhKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICoKKyAqCisgKgorICoKKyAqCisgKi8KK2ludAorcmVhZF9zbWFsbF9kYXRhKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfaW5vZGUgKiBpbm9kZSwKKwkJY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmLCBzaXplX3QgYnVmc2l6ZSkKK3sKKwliZWZzX3NtYWxsX2RhdGEgKnNkYXRhOworCisJc2RhdGEgPSBmaW5kX3NtYWxsX2RhdGEoc2IsIGlub2RlLCBuYW1lKTsKKwlpZiAoc2RhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIEJFRlNfRVJSOworCWVsc2UgaWYgKHNkYXRhLT5kYXRhX3NpemUgPiBidWZzaXplKQorCQlyZXR1cm4gQkVGU19FUlI7CisKKwltZW1jcHkoYnVmLCBTRF9EQVRBKHNkYXRhKSwgc2RhdGEtPmRhdGFfc2l6ZSk7CisKKwlyZXR1cm4gQkVGU19PSzsKK30KKworLyoqCisgKgorICoKKyAqCisgKgorICoKKyAqLworaW50CitsaXN0X3NtYWxsX2RhdGEoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19pbm9kZSAqIGlub2RlKQoreworCit9CisKKy8qKgorICoKKyAqCisgKgorICoKKyAqCisgKi8KK2ludAorbGlzdF9hdHRyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfaW5vZGUgKiBpbm9kZSkKK3sKKworfQorCisvKioKKyAqCisgKgorICoKKyAqCisgKgorICovCitpbnQKK3JlYWRfYXR0cihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2lub2RlICogaW5vZGUpCit7CisKK30KZGlmZiAtLWdpdCBhL2ZzL2JlZnMvYmVmcy5oIGIvZnMvYmVmcy9iZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU3YTJjMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvYmVmcy5oCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogYmVmcy5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgV2lsbCBEeXNvbiA8d2lsbF9keXNvbkBwb2JveC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTWFrb3RvIEthdG8gKG1fa2F0b0BnYTIuc28tbmV0Lm5lLmpwKQorICovCisKKyNpZm5kZWYgX0xJTlVYX0JFRlNfSAorI2RlZmluZSBfTElOVVhfQkVGU19ICisKKyNpbmNsdWRlICJiZWZzX2ZzX3R5cGVzLmgiCisKKy8qIHVzZWQgaW4gZGVidWcuYyAqLworI2RlZmluZSBCRUZTX1ZFUlNJT04gIjAuOS4zIgorCisKK3R5cGVkZWYgdTY0IGJlZnNfYmxvY2tucl90OworLyoKKyAqIEJlRlMgaW4gbWVtb3J5IHN0cnVjdHVyZXMKKyAqLworCit0eXBlZGVmIHN0cnVjdCBiZWZzX21vdW50X29wdGlvbnMgeworCWdpZF90IGdpZDsKKwl1aWRfdCB1aWQ7CisJaW50IHVzZV9naWQ7CisJaW50IHVzZV91aWQ7CisJaW50IGRlYnVnOworCWNoYXIgKmlvY2hhcnNldDsKK30gYmVmc19tb3VudF9vcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBiZWZzX3NiX2luZm8geworCXUzMiBtYWdpYzE7CisJdTMyIGJsb2NrX3NpemU7CisJdTMyIGJsb2NrX3NoaWZ0OworCWludCBieXRlX29yZGVyOworCWJlZnNfb2ZmX3QgbnVtX2Jsb2NrczsKKwliZWZzX29mZl90IHVzZWRfYmxvY2tzOworCXUzMiBpbm9kZV9zaXplOworCXUzMiBtYWdpYzI7CisKKwkvKiBBbGxvY2F0aW9uIGdyb3VwIGluZm9ybWF0aW9uICovCisJdTMyIGJsb2Nrc19wZXJfYWc7CisJdTMyIGFnX3NoaWZ0OworCXUzMiBudW1fYWdzOworCisJLyogam9ybmFsIGxvZyBlbnRyeSAqLworCWJlZnNfYmxvY2tfcnVuIGxvZ19ibG9ja3M7CisJYmVmc19vZmZfdCBsb2dfc3RhcnQ7CisJYmVmc19vZmZfdCBsb2dfZW5kOworCisJYmVmc19pbm9kZV9hZGRyIHJvb3RfZGlyOworCWJlZnNfaW5vZGVfYWRkciBpbmRpY2VzOworCXUzMiBtYWdpYzM7CisKKwliZWZzX21vdW50X29wdGlvbnMgbW91bnRfb3B0czsKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHM7CisKK30gYmVmc19zYl9pbmZvOworCit0eXBlZGVmIHN0cnVjdCBiZWZzX2lub2RlX2luZm8geworCXUzMiBpX2ZsYWdzOworCXUzMiBpX3R5cGU7CisKKwliZWZzX2lub2RlX2FkZHIgaV9pbm9kZV9udW07CisJYmVmc19pbm9kZV9hZGRyIGlfcGFyZW50OworCWJlZnNfaW5vZGVfYWRkciBpX2F0dHJpYnV0ZTsKKworCXVuaW9uIHsKKwkJYmVmc19kYXRhX3N0cmVhbSBkczsKKwkJY2hhciBzeW1saW5rW0JFRlNfU1lNTElOS19MRU5dOworCX0gaV9kYXRhOworCisJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKKworfSBiZWZzX2lub2RlX2luZm87CisKK2VudW0gYmVmc19lcnIgeworCUJFRlNfT0ssCisJQkVGU19FUlIsCisJQkVGU19CQURfSU5PREUsCisJQkVGU19CVF9FTkQsCisJQkVGU19CVF9FTVBUWSwKKwlCRUZTX0JUX01BVENILAorCUJFRlNfQlRfUEFSTUFUQ0gsCisJQkVGU19CVF9OT1RfRk9VTkQKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBkZWJ1Zy5jICovCit2b2lkIGJlZnNfZXJyb3IoY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZm10LCAuLi4pOwordm9pZCBiZWZzX3dhcm5pbmcoY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZm10LCAuLi4pOwordm9pZCBiZWZzX2RlYnVnKGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKwordm9pZCBiZWZzX2R1bXBfc3VwZXJfYmxvY2soY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19zdXBlcl9ibG9jayAqKTsKK3ZvaWQgYmVmc19kdW1wX2lub2RlKGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfaW5vZGUgKik7Cit2b2lkIGJlZnNfZHVtcF9pbmRleF9lbnRyeShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2J0cmVlX3N1cGVyICopOwordm9pZCBiZWZzX2R1bXBfaW5kZXhfbm9kZShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2J0cmVlX25vZGVoZWFkICopOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogR2V0cyBhIHBvaW50ZXIgdG8gdGhlIHByaXZhdGUgcG9ydGlvbiBvZiB0aGUgc3VwZXJfYmxvY2sKKyAqIHN0cnVjdHVyZSBmcm9tIHRoZSBwdWJsaWMgcGFydAorICovCitzdGF0aWMgaW5saW5lIGJlZnNfc2JfaW5mbyAqCitCRUZTX1NCKGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc3VwZXIpCit7CisJcmV0dXJuIChiZWZzX3NiX2luZm8gKikgc3VwZXItPnNfZnNfaW5mbzsKK30KKworc3RhdGljIGlubGluZSBiZWZzX2lub2RlX2luZm8gKgorQkVGU19JKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGxpc3RfZW50cnkoaW5vZGUsIHN0cnVjdCBiZWZzX2lub2RlX2luZm8sIHZmc19pbm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYmVmc19ibG9ja25yX3QKK2lhZGRyMmJsb2Nrbm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19pbm9kZV9hZGRyICogaWFkZHIpCit7CisJcmV0dXJuICgoaWFkZHItPmFsbG9jYXRpb25fZ3JvdXAgPDwgQkVGU19TQihzYiktPmFnX3NoaWZ0KSArCisJCWlhZGRyLT5zdGFydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYmVmc19pbm9kZV9hZGRyCitibG9ja25vMmlhZGRyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfYmxvY2tucl90IGJsb2Nrbm8pCit7CisJYmVmc19pbm9kZV9hZGRyIGlhZGRyOworCWlhZGRyLmFsbG9jYXRpb25fZ3JvdXAgPSBibG9ja25vID4+IEJFRlNfU0Ioc2IpLT5hZ19zaGlmdDsKKwlpYWRkci5zdGFydCA9CisJICAgIGJsb2Nrbm8gLSAoaWFkZHIuYWxsb2NhdGlvbl9ncm91cCA8PCBCRUZTX1NCKHNiKS0+YWdfc2hpZnQpOworCWlhZGRyLmxlbiA9IDE7CisKKwlyZXR1cm4gaWFkZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitiZWZzX2lhZGRyc19wZXJfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gQkVGU19TQihzYiktPmJsb2NrX3NpemUgLyBzaXplb2YgKGJlZnNfaW5vZGVfYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitiZWZzX2lhZGRyX2lzX2VtcHR5KGJlZnNfaW5vZGVfYWRkciAqIGlhZGRyKQoreworCXJldHVybiAoIWlhZGRyLT5hbGxvY2F0aW9uX2dyb3VwKSAmJiAoIWlhZGRyLT5zdGFydCkgJiYgKCFpYWRkci0+bGVuKTsKK30KKworc3RhdGljIGlubGluZSBzaXplX3QKK2JlZnNfYnJ1bl9zaXplKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfYmxvY2tfcnVuIHJ1bikKK3sKKwlyZXR1cm4gQkVGU19TQihzYiktPmJsb2NrX3NpemUgKiBydW4ubGVuOworfQorCisjZW5kaWYJCQkJLyogX0xJTlVYX0JFRlNfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYmVmcy9iZWZzX2ZzX3R5cGVzLmggYi9mcy9iZWZzL2JlZnNfZnNfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDk1NTE4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYmVmcy9iZWZzX2ZzX3R5cGVzLmgKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L2JlZnNfZnNfdHlwZXMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBXaWxsIER5c29uICh3aWxsQGNzLmVhcmxoYW0uZWR1KQorICoKKyAqCisgKgorICogZnJvbSBsaW51eC9pbmNsdWRlL2xpbnV4L2JlZnNfZnMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBNYWtvdG8gS2F0byAobV9rYXRvQGdhMi5zby1uZXQubmUuanApCisgKgorICovCisKKyNpZm5kZWYgX0xJTlVYX0JFRlNfRlNfVFlQRVMKKyNkZWZpbmUgX0xJTlVYX0JFRlNfRlNfVFlQRVMKKworI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2VuZGlmIC8qX19LRVJORUxfXyovCisKKyNkZWZpbmUgUEFDS0VEIF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKKworLyoKKyAqIE1heCBuYW1lIGxlbmd0aHMgb2YgQkZTCisgKi8KKworI2RlZmluZSBCRUZTX05BTUVfTEVOIDI1NQorCisjZGVmaW5lIEJFRlNfU1lNTElOS19MRU4gMTQ0CisjZGVmaW5lIEJFRlNfTlVNX0RJUkVDVF9CTE9DS1MgMTIKKyNkZWZpbmUgQl9PU19OQU1FX0xFTkdUSCAzMgorCisvKiBUaGUgZGF0YXN0cmVhbSBibG9ja3MgbWFwcGVkIGJ5IHRoZSBkb3VibGUtaW5kaXJlY3QKKyAqIGJsb2NrIGFyZSBhbHdheXMgNCBmcyBibG9ja3MgbG9uZy4KKyAqIFRoaXMgZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IgbGluZWFyIHNlYXJjaGVzIGFtb25nCisgKiB0aGUgcG90ZW50aWFsbHkgaHVnZSBudW1iZXIgb2YgaW5kaXJlY3QgYmxvY2tzCisgKgorICogRXJyLiBTaG91bGQgdGhhdCBiZSA0IGZzIGJsb2NrcyBvciA0az8/PworICogSXQgbWF0dGVycyBvbiBsYXJnZSBibG9ja3NpemUgdm9sdW1lcworICovCisjZGVmaW5lIEJFRlNfREJMSU5ESVJfQlJVTl9MRU4gNAorCisvKgorICogRmxhZ3Mgb2Ygc3VwZXJibG9jaworICovCisKK2VudW0gc3VwZXJfZmxhZ3MgeworCUJFRlNfQllURVNFWF9CRSwKKwlCRUZTX0JZVEVTRVhfTEUsCisJQkVGU19DTEVBTiA9IDB4NDM0YzQ1NGUsCisJQkVGU19ESVJUWSA9IDB4NDQ0OTUyNTQsCisJQkVGU19TVVBFUl9NQUdJQzEgPSAweDQyNDY1MzMxLAkvKiBCRlMxICovCisJQkVGU19TVVBFUl9NQUdJQzIgPSAweGRkMTIxMDMxLAorCUJFRlNfU1VQRVJfTUFHSUMzID0gMHgxNWI2ODMwZSwKK307CisKKyNkZWZpbmUgQkVGU19CWVRFT1JERVJfTkFUSVZFIDB4NDI0OTQ3NDUKKworI2RlZmluZSBCRUZTX1NVUEVSX01BR0lDIEJFRlNfU1VQRVJfTUFHSUMxCisKKy8qCisgKiBGbGFncyBvZiBpbm9kZQorICovCisKKyNkZWZpbmUgQkVGU19JTk9ERV9NQUdJQzEgMHgzYmJlMGFkOQorCitlbnVtIGlub2RlX2ZsYWdzIHsKKwlCRUZTX0lOT0RFX0lOX1VTRSA9IDB4MDAwMDAwMDEsCisJQkVGU19BVFRSX0lOT0RFID0gMHgwMDAwMDAwNCwKKwlCRUZTX0lOT0RFX0xPR0dFRCA9IDB4MDAwMDAwMDgsCisJQkVGU19JTk9ERV9ERUxFVEVEID0gMHgwMDAwMDAxMCwKKwlCRUZTX0xPTkdfU1lNTElOSyA9IDB4MDAwMDAwNDAsCisJQkVGU19QRVJNQU5FTlRfRkxBRyA9IDB4MDAwMGZmZmYsCisJQkVGU19JTk9ERV9OT19DUkVBVEUgPSAweDAwMDEwMDAwLAorCUJFRlNfSU5PREVfV0FTX1dSSVRURU4gPSAweDAwMDIwMDAwLAorCUJFRlNfTk9fVFJBTlNBQ1RJT04gPSAweDAwMDQwMDAwLAorfTsKKy8qIAorICogT24tRGlzayBkYXRhc3RydWN0dXJlcyBvZiBCZUZTCisgKi8KKwordHlwZWRlZiB1NjQgYmVmc19vZmZfdDsKK3R5cGVkZWYgdTY0IGJlZnNfdGltZV90OwordHlwZWRlZiB2b2lkIGJlZnNfYmlub2RlX2V0YzsKKworLyogQmxvY2sgcnVucyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBhbGxvY2F0aW9uX2dyb3VwOworCXUxNiBzdGFydDsKKwl1MTYgbGVuOworfSBQQUNLRUQgYmVmc19ibG9ja19ydW47CisKK3R5cGVkZWYgYmVmc19ibG9ja19ydW4gYmVmc19pbm9kZV9hZGRyOworCisvKgorICogVGhlIFN1cGVyYmxvY2sgU3RydWN0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyIG5hbWVbQl9PU19OQU1FX0xFTkdUSF07CisJdTMyIG1hZ2ljMTsKKwl1MzIgZnNfYnl0ZV9vcmRlcjsKKworCXUzMiBibG9ja19zaXplOworCXUzMiBibG9ja19zaGlmdDsKKworCWJlZnNfb2ZmX3QgbnVtX2Jsb2NrczsKKwliZWZzX29mZl90IHVzZWRfYmxvY2tzOworCisJdTMyIGlub2RlX3NpemU7CisKKwl1MzIgbWFnaWMyOworCXUzMiBibG9ja3NfcGVyX2FnOworCXUzMiBhZ19zaGlmdDsKKwl1MzIgbnVtX2FnczsKKworCXUzMiBmbGFnczsKKworCWJlZnNfYmxvY2tfcnVuIGxvZ19ibG9ja3M7CisJYmVmc19vZmZfdCBsb2dfc3RhcnQ7CisJYmVmc19vZmZfdCBsb2dfZW5kOworCisJdTMyIG1hZ2ljMzsKKwliZWZzX2lub2RlX2FkZHIgcm9vdF9kaXI7CisJYmVmc19pbm9kZV9hZGRyIGluZGljZXM7CisKK30gUEFDS0VEIGJlZnNfc3VwZXJfYmxvY2s7CisKKy8qIAorICogTm90ZTogdGhlIGluZGlyZWN0IGFuZCBkYmxfaW5kaXIgYmxvY2tfcnVucyBtYXkKKyAqIGJlIGxvbmdlciB0aGFuIG9uZSBibG9jayEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWJlZnNfYmxvY2tfcnVuIGRpcmVjdFtCRUZTX05VTV9ESVJFQ1RfQkxPQ0tTXTsKKwliZWZzX29mZl90IG1heF9kaXJlY3RfcmFuZ2U7CisJYmVmc19ibG9ja19ydW4gaW5kaXJlY3Q7CisJYmVmc19vZmZfdCBtYXhfaW5kaXJlY3RfcmFuZ2U7CisJYmVmc19ibG9ja19ydW4gZG91YmxlX2luZGlyZWN0OworCWJlZnNfb2ZmX3QgbWF4X2RvdWJsZV9pbmRpcmVjdF9yYW5nZTsKKwliZWZzX29mZl90IHNpemU7Cit9IFBBQ0tFRCBiZWZzX2RhdGFfc3RyZWFtOworCisvKiBBdHRyaWJ1dGUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgdHlwZTsKKwl1MTYgbmFtZV9zaXplOworCXUxNiBkYXRhX3NpemU7CisJY2hhciBuYW1lWzFdOworfSBQQUNLRUQgYmVmc19zbWFsbF9kYXRhOworCisvKiBJbm9kZSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgbWFnaWMxOworCWJlZnNfaW5vZGVfYWRkciBpbm9kZV9udW07CisJdTMyIHVpZDsKKwl1MzIgZ2lkOworCXUzMiBtb2RlOworCXUzMiBmbGFnczsKKwliZWZzX3RpbWVfdCBjcmVhdGVfdGltZTsKKwliZWZzX3RpbWVfdCBsYXN0X21vZGlmaWVkX3RpbWU7CisJYmVmc19pbm9kZV9hZGRyIHBhcmVudDsKKwliZWZzX2lub2RlX2FkZHIgYXR0cmlidXRlczsKKwl1MzIgdHlwZTsKKworCXUzMiBpbm9kZV9zaXplOworCXUzMiBldGM7CQkvKiBub3QgdXNlICovCisKKwl1bmlvbiB7CisJCWJlZnNfZGF0YV9zdHJlYW0gZGF0YXN0cmVhbTsKKwkJY2hhciBzeW1saW5rW0JFRlNfU1lNTElOS19MRU5dOworCX0gZGF0YTsKKworCXUzMiBwYWRbNF07CQkvKiBub3QgdXNlICovCisJYmVmc19zbWFsbF9kYXRhIHNtYWxsX2RhdGFbMV07Cit9IFBBQ0tFRCBiZWZzX2lub2RlOworCisvKgorICogQit0cmVlIHN1cGVyYmxvY2sKKyAqLworCisjZGVmaW5lIEJFRlNfQlRSRUVfTUFHSUMgMHg2OWY2YzJlOAorCitlbnVtIGJ0cmVlX3R5cGVzIHsKKwlCVFJFRV9TVFJJTkdfVFlQRSA9IDAsCisJQlRSRUVfSU5UMzJfVFlQRSA9IDEsCisJQlRSRUVfVUlOVDMyX1RZUEUgPSAyLAorCUJUUkVFX0lOVDY0X1RZUEUgPSAzLAorCUJUUkVFX1VJTlQ2NF9UWVBFID0gNCwKKwlCVFJFRV9GTE9BVF9UWVBFID0gNSwKKwlCVFJFRV9ET1VCTEVfVFlQRSA9IDYKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgbWFnaWM7CisJdTMyIG5vZGVfc2l6ZTsKKwl1MzIgbWF4X2RlcHRoOworCXUzMiBkYXRhX3R5cGU7CisJYmVmc19vZmZfdCByb290X25vZGVfcHRyOworCWJlZnNfb2ZmX3QgZnJlZV9ub2RlX3B0cjsKKwliZWZzX29mZl90IG1heF9zaXplOworfSBQQUNLRUQgYmVmc19idHJlZV9zdXBlcjsKKworLyoKKyAqIEhlYWRlciBzdHVjdHVyZSBvZiBlYWNoIGJ0cmVlIG5vZGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWJlZnNfb2ZmX3QgbGVmdDsKKwliZWZzX29mZl90IHJpZ2h0OworCWJlZnNfb2ZmX3Qgb3ZlcmZsb3c7CisJdTE2IGFsbF9rZXlfY291bnQ7CisJdTE2IGFsbF9rZXlfbGVuZ3RoOworfSBQQUNLRUQgYmVmc19idHJlZV9ub2RlaGVhZDsKKworI2VuZGlmCQkJCS8qIF9MSU5VWF9CRUZTX0ZTX1RZUEVTICovCmRpZmYgLS1naXQgYS9mcy9iZWZzL2J0cmVlLmMgYi9mcy9iZWZzL2J0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZlMjE5NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvYnRyZWUuYwpAQCAtMCwwICsxLDc4OCBAQAorLyoKKyAqIGxpbnV4L2ZzL2JlZnMvYnRyZWUuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIFdpbGwgRHlzb24gPHdpbGxfZHlzb25AcG9ib3guY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR1BMLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgZGV0YWlscy4KKyAqCisgKiAyMDAyLTAyLTA1OiBTZXJnZXkgUy4gS29zdHlsaW92IGFkZGVkIGJpbmFyeSBzZWFyY2ggd2l0aGluZworICogCQlidHJlZSBub2Rlcy4KKyAqCisgKiBNYW55IHRoYW5rcyB0bzoKKyAqCisgKiBEb21pbmljIEdpYW1wYW9sbywgYXV0aG9yIG9mICJQcmFjdGljYWwgRmlsZSBTeXN0ZW0KKyAqIERlc2lnbiB3aXRoIHRoZSBCZSBGaWxlIFN5c3RlbSIsIGZvciBzdWNoIGEgaGVscGZ1bCBib29rLgorICogCisgKiBNYXJjdXMgSi4gUmFudW0sIGF1dGhvciBvZiB0aGUgYit0cmVlIHBhY2thZ2UgaW4gCisgKiBjb21wLnNvdXJjZXMubWlzYyB2b2x1bWUgMTAuIFRoaXMgY29kZSBpcyBub3QgY29waWVkIGZyb20gdGhhdAorICogd29yaywgYnV0IGl0IGlzIHBhcnRpYWxseSBiYXNlZCBvbiBpdC4KKyAqCisgKiBNYWtvdG8gS2F0bywgYXV0aG9yIG9mIHRoZSBvcmlnaW5hbCBCZUZTIGZvciBsaW51eCBmaWxlc3lzdGVtCisgKiBkcml2ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKyNpbmNsdWRlICJiZWZzLmgiCisjaW5jbHVkZSAiYnRyZWUuaCIKKyNpbmNsdWRlICJkYXRhc3RyZWFtLmgiCisjaW5jbHVkZSAiZW5kaWFuLmgiCisKKy8qCisgKiBUaGUgYnRyZWUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBhcmUgYnVpbHQgb24gdG9wIG9mIHRoZQorICogZGF0YXN0cmVhbS5jIGludGVyZmFjZSwgd2hpY2ggaXMgaW4gdHVybiBidWlsdCBvbiB0b3Agb2YgdGhlCisgKiBpby5jIGludGVyZmFjZS4KKyAqLworCisvKiBCZWZzIEIrdHJlZSBzdHJ1Y3R1cmU6CisgKiAKKyAqIFRoZSBmaXJzdCB0aGluZyBpbiB0aGUgdHJlZSBpcyB0aGUgdHJlZSBzdXBlcmJsb2NrLiBJdCB0ZWxscyB5b3UKKyAqIGFsbCBraW5kcyBvZiB1c2VmdWwgdGhpbmdzIGFib3V0IHRoZSB0cmVlLCBsaWtlIHdoZXJlIHRoZSByb290bm9kZQorICogaXMgbG9jYXRlZCwgYW5kIHRoZSBzaXplIG9mIHRoZSBub2RlcyAoYWx3YXlzIDEwMjQgd2l0aCBjdXJyZW50IHZlcnNpb24KKyAqIG9mIEJlT1MpLgorICoKKyAqIFRoZSByZXN0IG9mIHRoZSB0cmVlIGNvbnNpc3RzIG9mIGEgc2VyaWVzIG9mIG5vZGVzLiBOb2RlcyBjb250YWluIGEgaGVhZGVyCisgKiAoc3RydWN0IGJlZnNfYnRyZWVfbm9kZWhlYWQpLCB0aGUgcGFja2VkIGtleSBkYXRhLCBhbiBhcnJheSBvZiBzaG9ydHMgCisgKiBjb250YWluaW5nIHRoZSBlbmRpbmcgb2Zmc2V0cyBmb3IgZWFjaCBvZiB0aGUga2V5cywgYW5kIGFuIGFycmF5IG9mCisgKiBiZWZzX29mZl90IHZhbHVlcy4gSW4gaW50ZXJpb3Igbm9kZXMsIHRoZSBrZXlzIGFyZSB0aGUgZW5kaW5nIGtleXMgZm9yIAorICogdGhlIGNoaWxkbm9kZSB0aGV5IHBvaW50IHRvLCBhbmQgdGhlIHZhbHVlcyBhcmUgb2Zmc2V0cyBpbnRvIHRoZSAKKyAqIGRhdGFzdHJlYW0gY29udGFpbmluZyB0aGUgdHJlZS4gCisgKi8KKworLyogTm90ZToKKyAqIAorICogVGhlIGJvb2sgc3RhdGVzIDIgY29uZnVzaW5nIHRoaW5ncyBhYm91dCBiZWZzIGIrdHJlZXMuIEZpcnN0LCAKKyAqIGl0IHN0YXRlcyB0aGF0IHRoZSBvdmVyZmxvdyBmaWVsZCBvZiBub2RlIGhlYWRlcnMgaXMgdXNlZCBieSBpbnRlcm5hbCBub2RlcworICogdG8gcG9pbnQgdG8gYW5vdGhlciBub2RlIHRoYXQgImVmZmVjdGl2ZWx5IGNvbnRpbnVlcyB0aGlzIG9uZSIuIEhlcmUgaXMgd2hhdAorICogSSBiZWxpZXZlIHRoYXQgbWVhbnMuIEVhY2gga2V5IGluIGludGVybmFsIG5vZGVzIHBvaW50cyB0byBhbm90aGVyIG5vZGUgdGhhdAorICogY29udGFpbnMga2V5IHZhbHVlcyBsZXNzIHRoYW4gaXRzZWxmLiBJbnNwZWN0aW9uIHJldmVhbHMgdGhhdCB0aGUgbGFzdCBrZXkgCisgKiBpbiB0aGUgaW50ZXJuYWwgbm9kZSBpcyBub3QgdGhlIGxhc3Qga2V5IGluIHRoZSBpbmRleC4gS2V5cyB0aGF0IGFyZSAKKyAqIGdyZWF0ZXIgdGhhbiB0aGUgbGFzdCBrZXkgaW4gdGhlIGludGVybmFsIG5vZGUgZ28gaW50byB0aGUgb3ZlcmZsb3cgbm9kZS4gCisgKiBJIGltYWdpbmUgdGhlcmUgaXMgYSBwZXJmb3JtYW5jZSByZWFzb24gZm9yIHRoaXMuCisgKgorICogU2Vjb25kLCBpdCBzdGF0ZXMgdGhhdCB0aGUgaGVhZGVyIG9mIGEgYnRyZWUgbm9kZSBpcyBzdWZmaWNpZW50IHRvIAorICogZGlzdGluZ3Vpc2ggaW50ZXJuYWwgbm9kZXMgZnJvbSBsZWFmIG5vZGVzLiBXaXRob3V0IHNheWluZyBleGFjdGx5IGhvdy4gCisgKiBBZnRlciBmaWd1cmluZyBvdXQgdGhlIGZpcnN0LCBpdCBiZWNvbWVzIG9idmlvdXMgdGhhdCBpbnRlcm5hbCBub2RlcyBoYXZlCisgKiBvdmVyZmxvdyBub2RlcyBhbmQgbGVhZm5vZGVzIGRvIG5vdC4KKyAqLworCisvKiAKKyAqIEN1cnJlbnRseSwgdGhpcyBjb2RlIGlzIG9ubHkgZ29vZCBmb3IgZGlyZWN0b3J5IEIrdHJlZXMuCisgKiBJbiBvcmRlciB0byBiZSB1c2VkIGZvciBvdGhlciBCRlMgaW5kZXhlcywgaXQgbmVlZHMgdG8gYmUgZXh0ZW5kZWQgdG8gaGFuZGxlCisgKiBkdXBsaWNhdGUga2V5cyBhbmQgbm9uLXN0cmluZyBrZXl0eXBlcyAoaW50MzIsIGludDY0LCBmbG9hdCwgZG91YmxlKS4KKyAqLworCisvKgorICogSW4gbWVtb3J5IHN0cnVjdHVyZSBvZiBlYWNoIGJ0cmVlIG5vZGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWJlZnNfYnRyZWVfbm9kZWhlYWQgaGVhZDsJLyogaGVhZCBvZiBub2RlIGNvbnZlcnRlZCB0byBjcHUgYnl0ZW9yZGVyICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwliZWZzX2J0cmVlX25vZGVoZWFkICpvZF9ub2RlOwkvKiBvbiBkaXNrIG5vZGUgKi8KK30gYmVmc19idHJlZV9ub2RlOworCisvKiBsb2NhbCBjb25zdGFudHMgKi8KK3N0YXRpYyBjb25zdCBiZWZzX29mZl90IGJlZnNfYnRfaW52YWwgPSAweGZmZmZmZmZmZmZmZmZmZmZVTEw7CisKKy8qIGxvY2FsIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBiZWZzX2J0cmVlX3NlZWtsZWFmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfZGF0YV9zdHJlYW0gKiBkcywKKwkJCSAgICAgICBiZWZzX2J0cmVlX3N1cGVyICogYnRfc3VwZXIsCisJCQkgICAgICAgYmVmc19idHJlZV9ub2RlICogdGhpc19ub2RlLAorCQkJICAgICAgIGJlZnNfb2ZmX3QgKiBub2RlX29mZik7CisKK3N0YXRpYyBpbnQgYmVmc19idF9yZWFkX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfZGF0YV9zdHJlYW0gKiBkcywKKwkJCSAgICAgIGJlZnNfYnRyZWVfc3VwZXIgKiBzdXApOworCitzdGF0aWMgaW50IGJlZnNfYnRfcmVhZF9ub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfZGF0YV9zdHJlYW0gKiBkcywKKwkJCSAgICAgYmVmc19idHJlZV9ub2RlICogbm9kZSwgYmVmc19vZmZfdCBub2RlX29mZik7CisKK3N0YXRpYyBpbnQgYmVmc19sZWFmbm9kZShiZWZzX2J0cmVlX25vZGUgKiBub2RlKTsKKworc3RhdGljIHUxNiAqYmVmc19idF9rZXlsZW5faW5kZXgoYmVmc19idHJlZV9ub2RlICogbm9kZSk7CisKK3N0YXRpYyBiZWZzX29mZl90ICpiZWZzX2J0X3ZhbGFycmF5KGJlZnNfYnRyZWVfbm9kZSAqIG5vZGUpOworCitzdGF0aWMgY2hhciAqYmVmc19idF9rZXlkYXRhKGJlZnNfYnRyZWVfbm9kZSAqIG5vZGUpOworCitzdGF0aWMgaW50IGJlZnNfZmluZF9rZXkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19idHJlZV9ub2RlICogbm9kZSwKKwkJCSBjb25zdCBjaGFyICpmaW5ka2V5LCBiZWZzX29mZl90ICogdmFsdWUpOworCitzdGF0aWMgY2hhciAqYmVmc19idF9nZXRfa2V5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfYnRyZWVfbm9kZSAqIG5vZGUsCisJCQkgICAgIGludCBpbmRleCwgdTE2ICoga2V5bGVuKTsKKworc3RhdGljIGludCBiZWZzX2NvbXBhcmVfc3RyaW5ncyhjb25zdCB2b2lkICprZXkxLCBpbnQga2V5bGVuMSwKKwkJCQljb25zdCB2b2lkICprZXkyLCBpbnQga2V5bGVuMik7CisKKy8qKgorICogYmVmc19idF9yZWFkX3N1cGVyIC0gcmVhZCBpbiBidHJlZSBzdXBlcmJsb2NrIGNvbnZlcnQgdG8gY3B1IGJ5dGVvcmRlcgorICogQHNiOiBGaWxlc3lzdGVtIHN1cGVyYmxvY2sKKyAqIEBkczogRGF0YXN0cmVhbSB0byByZWFkIGZyb20KKyAqIEBzdXA6IEJ1ZmZlciBpbiB3aGljaCB0byBwbGFjZSB0aGUgYnRyZWUgc3VwZXJibG9jaworICoKKyAqIENhbGxzIGJlZnNfcmVhZF9kYXRhc3RyZWFtIHRvIHJlYWQgaW4gdGhlIGJ0cmVlIHN1cGVyYmxvY2sgYW5kCisgKiBtYWtlcyBzdXJlIGl0IGlzIGluIGNwdSBieXRlb3JkZXIsIGJ5dGVzd2FwcGluZyBpZiBuZWNlc3NhcnkuCisgKgorICogT24gc3VjY2VzcywgcmV0dXJucyBCRUZTX09LIGFuZCAqQHN1cCBjb250YWlucyB0aGUgYnRyZWUgc3VwZXJibG9jaywKKyAqIGluIGNwdSBieXRlIG9yZGVyLgorICoKKyAqIE9uIGZhaWx1cmUsIEJFRlNfRVJSIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgaW50CitiZWZzX2J0X3JlYWRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19kYXRhX3N0cmVhbSAqIGRzLAorCQkgICBiZWZzX2J0cmVlX3N1cGVyICogc3VwKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWJlZnNfYnRyZWVfc3VwZXIgKm9kX3N1cCA9IE5VTEw7CisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiBiZWZzX2J0cmVlX3JlYWRfc3VwZXIoKSIpOworCisJYmggPSBiZWZzX3JlYWRfZGF0YXN0cmVhbShzYiwgZHMsIDAsIE5VTEwpOworCisJaWYgKCFiaCkgeworCQliZWZzX2Vycm9yKHNiLCAiQ291bGRuJ3QgcmVhZCBpbmRleCBoZWFkZXIuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCW9kX3N1cCA9IChiZWZzX2J0cmVlX3N1cGVyICopIGJoLT5iX2RhdGE7CisJYmVmc19kdW1wX2luZGV4X2VudHJ5KHNiLCBvZF9zdXApOworCisJc3VwLT5tYWdpYyA9IGZzMzJfdG9fY3B1KHNiLCBvZF9zdXAtPm1hZ2ljKTsKKwlzdXAtPm5vZGVfc2l6ZSA9IGZzMzJfdG9fY3B1KHNiLCBvZF9zdXAtPm5vZGVfc2l6ZSk7CisJc3VwLT5tYXhfZGVwdGggPSBmczMyX3RvX2NwdShzYiwgb2Rfc3VwLT5tYXhfZGVwdGgpOworCXN1cC0+ZGF0YV90eXBlID0gZnMzMl90b19jcHUoc2IsIG9kX3N1cC0+ZGF0YV90eXBlKTsKKwlzdXAtPnJvb3Rfbm9kZV9wdHIgPSBmczY0X3RvX2NwdShzYiwgb2Rfc3VwLT5yb290X25vZGVfcHRyKTsKKwlzdXAtPmZyZWVfbm9kZV9wdHIgPSBmczY0X3RvX2NwdShzYiwgb2Rfc3VwLT5mcmVlX25vZGVfcHRyKTsKKwlzdXAtPm1heF9zaXplID0gZnM2NF90b19jcHUoc2IsIG9kX3N1cC0+bWF4X3NpemUpOworCisJYnJlbHNlKGJoKTsKKwlpZiAoc3VwLT5tYWdpYyAhPSBCRUZTX0JUUkVFX01BR0lDKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJJbmRleCBoZWFkZXIgaGFzIGJhZCBtYWdpYy4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX2J0cmVlX3JlYWRfc3VwZXIoKSIpOworCXJldHVybiBCRUZTX09LOworCisgICAgICBlcnJvcjoKKwliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX2J0cmVlX3JlYWRfc3VwZXIoKSBFUlJPUiIpOworCXJldHVybiBCRUZTX0VSUjsKK30KKworLyoqCisgKiBiZWZzX2J0X3JlYWRfbm9kZSAtIHJlYWQgaW4gYnRyZWUgbm9kZSBhbmQgY29udmVydCB0byBjcHUgYnl0ZW9yZGVyCisgKiBAc2I6IEZpbGVzeXN0ZW0gc3VwZXJibG9jaworICogQGRzOiBEYXRhc3RyZWFtIHRvIHJlYWQgZnJvbQorICogQG5vZGU6IEJ1ZmZlciBpbiB3aGljaCB0byBwbGFjZSB0aGUgYnRyZWUgbm9kZQorICogQG5vZGVfb2ZmOiBTdGFydGluZyBvZmZzZXQgKGluIGJ5dGVzKSBvZiB0aGUgbm9kZSBpbiBAZHMKKyAqCisgKiBDYWxscyBiZWZzX3JlYWRfZGF0YXN0cmVhbSB0byByZWFkIGluIHRoZSBpbmRpY2F0ZWQgYnRyZWUgbm9kZSBhbmQKKyAqIG1ha2VzIHN1cmUgaXRzIGhlYWRlciBmaWVsZHMgYXJlIGluIGNwdSBieXRlb3JkZXIsIGJ5dGVzd2FwcGluZyBpZgorICogbmVjZXNzYXJ5LgorICogTm90ZTogbm9kZS0+YmggbXVzdCBiZSBOVUxMIHdoZW4gdGhpcyBmdW5jdGlvbiBjYWxsZWQgZmlyc3QKKyAqIHRpbWUuIERvbid0IGZvcmdldCBicmVsc2Uobm9kZS0+YmgpIGFmdGVyIGxhc3QgY2FsbC4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm5zIEJFRlNfT0sgYW5kICpAbm9kZSBjb250YWlucyB0aGUgYnRyZWUgbm9kZSB0aGF0CisgKiBzdGFydHMgYXQgQG5vZGVfb2ZmLCB3aXRoIHRoZSBub2RlLT5oZWFkIGZpZWxkcyBpbiBjcHUgYnl0ZSBvcmRlci4KKyAqCisgKiBPbiBmYWlsdXJlLCBCRUZTX0VSUiBpcyByZXR1cm5lZC4KKyAqLworCitzdGF0aWMgaW50CitiZWZzX2J0X3JlYWRfbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2RhdGFfc3RyZWFtICogZHMsCisJCSAgYmVmc19idHJlZV9ub2RlICogbm9kZSwgYmVmc19vZmZfdCBub2RlX29mZikKK3sKKwl1aW50IG9mZiA9IDA7CisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiBiZWZzX2J0X3JlYWRfbm9kZSgpIik7CisKKwlpZiAobm9kZS0+YmgpCisJCWJyZWxzZShub2RlLT5iaCk7CisKKwlub2RlLT5iaCA9IGJlZnNfcmVhZF9kYXRhc3RyZWFtKHNiLCBkcywgbm9kZV9vZmYsICZvZmYpOworCWlmICghbm9kZS0+YmgpIHsKKwkJYmVmc19lcnJvcihzYiwgImJlZnNfYnRfcmVhZF9ub2RlKCkgZmFpbGVkIHRvIHJlYWQgIgorCQkJICAgIm5vZGUgYXQgJUx1Iiwgbm9kZV9vZmYpOworCQliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX2J0X3JlYWRfbm9kZSgpIEVSUk9SIik7CisKKwkJcmV0dXJuIEJFRlNfRVJSOworCX0KKwlub2RlLT5vZF9ub2RlID0KKwkgICAgKGJlZnNfYnRyZWVfbm9kZWhlYWQgKikgKCh2b2lkICopIG5vZGUtPmJoLT5iX2RhdGEgKyBvZmYpOworCisJYmVmc19kdW1wX2luZGV4X25vZGUoc2IsIG5vZGUtPm9kX25vZGUpOworCisJbm9kZS0+aGVhZC5sZWZ0ID0gZnM2NF90b19jcHUoc2IsIG5vZGUtPm9kX25vZGUtPmxlZnQpOworCW5vZGUtPmhlYWQucmlnaHQgPSBmczY0X3RvX2NwdShzYiwgbm9kZS0+b2Rfbm9kZS0+cmlnaHQpOworCW5vZGUtPmhlYWQub3ZlcmZsb3cgPSBmczY0X3RvX2NwdShzYiwgbm9kZS0+b2Rfbm9kZS0+b3ZlcmZsb3cpOworCW5vZGUtPmhlYWQuYWxsX2tleV9jb3VudCA9CisJICAgIGZzMTZfdG9fY3B1KHNiLCBub2RlLT5vZF9ub2RlLT5hbGxfa2V5X2NvdW50KTsKKwlub2RlLT5oZWFkLmFsbF9rZXlfbGVuZ3RoID0KKwkgICAgZnMxNl90b19jcHUoc2IsIG5vZGUtPm9kX25vZGUtPmFsbF9rZXlfbGVuZ3RoKTsKKworCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfYnRyZWVfcmVhZF9ub2RlKCkiKTsKKwlyZXR1cm4gQkVGU19PSzsKK30KKworLyoqCisgKiBiZWZzX2J0cmVlX2ZpbmQgLSBGaW5kIGEga2V5IGluIGEgYmVmcyBCK3RyZWUKKyAqIEBzYjogRmlsZXN5c3RlbSBzdXBlcmJsb2NrCisgKiBAZHM6IERhdGFzdHJlYW0gY29udGFpbmluZyBidHJlZQorICogQGtleTogS2V5IHN0cmluZyB0byBsb29rdXAgaW4gYnRyZWUKKyAqIEB2YWx1ZTogVmFsdWUgc3RvcmVkIHdpdGggQGtleQorICoKKyAqIE9uIHN1Y2VzcywgcmV0dXJucyBCRUZTX09LIGFuZCBzZXRzICpAdmFsdWUgdG8gdGhlIHZhbHVlIHN0b3JlZAorICogd2l0aCBAa2V5ICh1c3VhbGx5IHRoZSBkaXNrIGJsb2NrIG51bWJlciBvZiBhbiBpbm9kZSkuCisgKgorICogT24gZmFpbHVyZSwgcmV0dXJucyBCRUZTX0VSUiBvciBCRUZTX0JUX05PVF9GT1VORC4KKyAqIAorICogQWxnb3JpdGhtOiAKKyAqICAgUmVhZCB0aGUgc3VwZXJibG9jayBhbmQgcm9vdG5vZGUgb2YgdGhlIGIrdHJlZS4KKyAqICAgRHJpbGwgZG93biB0aHJvdWdoIHRoZSBpbnRlcmlvciBub2RlcyB1c2luZyBiZWZzX2ZpbmRfa2V5KCkuCisgKiAgIE9uY2UgYXQgdGhlIGNvcnJlY3QgbGVhZiBub2RlLCB1c2UgYmVmc19maW5kX2tleSgpIGFnYWluIHRvIGdldCB0aGUKKyAqICAgYWN0dWFsbCB2YWx1ZSBzdG9yZWQgd2l0aCB0aGUga2V5LgorICovCitpbnQKK2JlZnNfYnRyZWVfZmluZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2RhdGFfc3RyZWFtICogZHMsCisJCWNvbnN0IGNoYXIgKmtleSwgYmVmc19vZmZfdCAqIHZhbHVlKQoreworCWJlZnNfYnRyZWVfbm9kZSAqdGhpc19ub2RlID0gTlVMTDsKKwliZWZzX2J0cmVlX3N1cGVyIGJ0X3N1cGVyOworCWJlZnNfb2ZmX3Qgbm9kZV9vZmY7CisJaW50IHJlczsKKworCWJlZnNfZGVidWcoc2IsICItLS0+IGJlZnNfYnRyZWVfZmluZCgpIEtleTogJXMiLCBrZXkpOworCisJaWYgKGJlZnNfYnRfcmVhZF9zdXBlcihzYiwgZHMsICZidF9zdXBlcikgIT0gQkVGU19PSykgeworCQliZWZzX2Vycm9yKHNiLAorCQkJICAgImJlZnNfYnRyZWVfZmluZCgpIGZhaWxlZCB0byByZWFkIGluZGV4IHN1cGVyYmxvY2siKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwl0aGlzX25vZGUgPSAoYmVmc19idHJlZV9ub2RlICopIGttYWxsb2Moc2l6ZW9mIChiZWZzX2J0cmVlX25vZGUpLAorCQkJCQkJR0ZQX05PRlMpOworCWlmICghdGhpc19ub2RlKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJiZWZzX2J0cmVlX2ZpbmQoKSBmYWlsZWQgdG8gYWxsb2NhdGUgJXUgIgorCQkJICAgImJ5dGVzIG9mIG1lbW9yeSIsIHNpemVvZiAoYmVmc19idHJlZV9ub2RlKSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJdGhpc19ub2RlLT5iaCA9IE5VTEw7CisKKwkvKiByZWFkIGluIHJvb3Qgbm9kZSAqLworCW5vZGVfb2ZmID0gYnRfc3VwZXIucm9vdF9ub2RlX3B0cjsKKwlpZiAoYmVmc19idF9yZWFkX25vZGUoc2IsIGRzLCB0aGlzX25vZGUsIG5vZGVfb2ZmKSAhPSBCRUZTX09LKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJiZWZzX2J0cmVlX2ZpbmQoKSBmYWlsZWQgdG8gcmVhZCAiCisJCQkgICAibm9kZSBhdCAlTHUiLCBub2RlX29mZik7CisJCWdvdG8gZXJyb3JfYWxsb2M7CisJfQorCisJd2hpbGUgKCFiZWZzX2xlYWZub2RlKHRoaXNfbm9kZSkpIHsKKwkJcmVzID0gYmVmc19maW5kX2tleShzYiwgdGhpc19ub2RlLCBrZXksICZub2RlX29mZik7CisJCWlmIChyZXMgPT0gQkVGU19CVF9OT1RfRk9VTkQpCisJCQlub2RlX29mZiA9IHRoaXNfbm9kZS0+aGVhZC5vdmVyZmxvdzsKKwkJLyogaWYgbm8gbWF0Y2gsIGdvIHRvIG92ZXJmbG93IG5vZGUgKi8KKwkJaWYgKGJlZnNfYnRfcmVhZF9ub2RlKHNiLCBkcywgdGhpc19ub2RlLCBub2RlX29mZikgIT0gQkVGU19PSykgeworCQkJYmVmc19lcnJvcihzYiwgImJlZnNfYnRyZWVfZmluZCgpIGZhaWxlZCB0byByZWFkICIKKwkJCQkgICAibm9kZSBhdCAlTHUiLCBub2RlX29mZik7CisJCQlnb3RvIGVycm9yX2FsbG9jOworCQl9CisJfQorCisJLyogYXQgdGhlIGNvcnJlY3QgbGVhZiBub2RlIG5vdyAqLworCisJcmVzID0gYmVmc19maW5kX2tleShzYiwgdGhpc19ub2RlLCBrZXksIHZhbHVlKTsKKworCWJyZWxzZSh0aGlzX25vZGUtPmJoKTsKKwlrZnJlZSh0aGlzX25vZGUpOworCisJaWYgKHJlcyAhPSBCRUZTX0JUX01BVENIKSB7CisJCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfYnRyZWVfZmluZCgpIEtleSAlcyBub3QgZm91bmQiLCBrZXkpOworCQkqdmFsdWUgPSAwOworCQlyZXR1cm4gQkVGU19CVF9OT1RfRk9VTkQ7CisJfQorCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfYnRyZWVfZmluZCgpIEZvdW5kIGtleSAlcywgdmFsdWUgJUx1IiwKKwkJICAga2V5LCAqdmFsdWUpOworCXJldHVybiBCRUZTX09LOworCisgICAgICBlcnJvcl9hbGxvYzoKKwlrZnJlZSh0aGlzX25vZGUpOworICAgICAgZXJyb3I6CisJKnZhbHVlID0gMDsKKwliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX2J0cmVlX2ZpbmQoKSBFUlJPUiIpOworCXJldHVybiBCRUZTX0VSUjsKK30KKworLyoqCisgKiBiZWZzX2ZpbmRfa2V5IC0gU2VhcmNoIGZvciBhIGtleSB3aXRoaW4gYSBub2RlCisgKiBAc2I6IEZpbGVzeXN0ZW0gc3VwZXJibG9jaworICogQG5vZGU6IE5vZGUgdG8gZmluZCB0aGUga2V5IHdpdGhpbgorICogQGtleTogS2V5c3RyaW5nIHRvIHNlYXJjaCBmb3IKKyAqIEB2YWx1ZTogSWYga2V5IGlzIGZvdW5kLCB0aGUgdmFsdWUgc3RvcmVkIHdpdGggdGhlIGtleSBpcyBwdXQgaGVyZQorICoKKyAqIGZpbmRzIGV4YWN0IG1hdGNoIGlmIG9uZSBleGlzdHMsIGFuZCByZXR1cm5zIEJFRlNfQlRfTUFUQ0gKKyAqIElmIG5vIGV4YWN0IG1hdGNoLCBmaW5kcyBmaXJzdCBrZXkgaW4gbm9kZSB0aGF0IGlzIGdyZWF0ZXIKKyAqIChhbHBoYWJldGljYWxseSkgdGhhbiB0aGUgc2VhcmNoIGtleSBhbmQgcmV0dXJucyBCRUZTX0JUX1BBUk1BVENICisgKiAoZm9yIHBhcnRpYWwgbWF0Y2gsIEkgZ3Vlc3MpLiBDYW4geW91IHRoaW5rIG9mIHNvbWV0aGluZyBiZXR0ZXIgdG8KKyAqIGNhbGwgaXQ/CisgKgorICogSWYgbm8ga2V5IHdhcyBhIG1hdGNoIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc2VhcmNoIGtleSwgcmV0dXJuCisgKiBCRUZTX0JUX05PVF9GT1VORC4KKyAqCisgKiBVc2UgYmluYXJ5IHNlYXJjaCBpbnN0ZWFkIG9mIGEgbGluZWFyLgorICovCitzdGF0aWMgaW50CitiZWZzX2ZpbmRfa2V5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfYnRyZWVfbm9kZSAqIG5vZGUsCisJICAgICAgY29uc3QgY2hhciAqZmluZGtleSwgYmVmc19vZmZfdCAqIHZhbHVlKQoreworCWludCBmaXJzdCwgbGFzdCwgbWlkOworCWludCBlcTsKKwl1MTYga2V5bGVuOworCWludCBmaW5ka2V5X2xlbjsKKwljaGFyICp0aGlza2V5OworCWJlZnNfb2ZmX3QgKnZhbGFycmF5OworCisJYmVmc19kZWJ1ZyhzYiwgIi0tLT4gYmVmc19maW5kX2tleSgpICVzIiwgZmluZGtleSk7CisKKwkqdmFsdWUgPSAwOworCisJZmluZGtleV9sZW4gPSBzdHJsZW4oZmluZGtleSk7CisKKwkvKiBpZiBub2RlIGNhbiBub3QgY29udGFpbiBrZXksIGp1c3Qgc2tlZXAgdGhpcyBub2RlICovCisJbGFzdCA9IG5vZGUtPmhlYWQuYWxsX2tleV9jb3VudCAtIDE7CisJdGhpc2tleSA9IGJlZnNfYnRfZ2V0X2tleShzYiwgbm9kZSwgbGFzdCwgJmtleWxlbik7CisKKwllcSA9IGJlZnNfY29tcGFyZV9zdHJpbmdzKHRoaXNrZXksIGtleWxlbiwgZmluZGtleSwgZmluZGtleV9sZW4pOworCWlmIChlcSA8IDApIHsKKwkJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gYmVmc19maW5kX2tleSgpICVzIG5vdCBmb3VuZCIsIGZpbmRrZXkpOworCQlyZXR1cm4gQkVGU19CVF9OT1RfRk9VTkQ7CisJfQorCisJdmFsYXJyYXkgPSBiZWZzX2J0X3ZhbGFycmF5KG5vZGUpOworCisJLyogc2ltcGxlIGJpbmFyeSBzZWFyY2ggKi8KKwlmaXJzdCA9IDA7CisJbWlkID0gMDsKKwl3aGlsZSAobGFzdCA+PSBmaXJzdCkgeworCQltaWQgPSAobGFzdCArIGZpcnN0KSAvIDI7CisJCWJlZnNfZGVidWcoc2IsICJmaXJzdDogJWQsIGxhc3Q6ICVkLCBtaWQ6ICVkIiwgZmlyc3QsIGxhc3QsCisJCQkgICBtaWQpOworCQl0aGlza2V5ID0gYmVmc19idF9nZXRfa2V5KHNiLCBub2RlLCBtaWQsICZrZXlsZW4pOworCQllcSA9IGJlZnNfY29tcGFyZV9zdHJpbmdzKHRoaXNrZXksIGtleWxlbiwgZmluZGtleSwKKwkJCQkJICBmaW5ka2V5X2xlbik7CisKKwkJaWYgKGVxID09IDApIHsKKwkJCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfZmluZF9rZXkoKSBmb3VuZCAlcyBhdCAlZCIsCisJCQkJICAgdGhpc2tleSwgbWlkKTsKKworCQkJKnZhbHVlID0gZnM2NF90b19jcHUoc2IsIHZhbGFycmF5W21pZF0pOworCQkJcmV0dXJuIEJFRlNfQlRfTUFUQ0g7CisJCX0KKwkJaWYgKGVxID4gMCkKKwkJCWxhc3QgPSBtaWQgLSAxOworCQllbHNlCisJCQlmaXJzdCA9IG1pZCArIDE7CisJfQorCWlmIChlcSA8IDApCisJCSp2YWx1ZSA9IGZzNjRfdG9fY3B1KHNiLCB2YWxhcnJheVttaWQgKyAxXSk7CisJZWxzZQorCQkqdmFsdWUgPSBmczY0X3RvX2NwdShzYiwgdmFsYXJyYXlbbWlkXSk7CisJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gYmVmc19maW5kX2tleSgpIGZvdW5kICVzIGF0ICVkIiwgdGhpc2tleSwgbWlkKTsKKwlyZXR1cm4gQkVGU19CVF9QQVJNQVRDSDsKK30KKworLyoqCisgKiBiZWZzX2J0cmVlX3JlYWQgLSBUcmF2ZXJzZSBsZWFmbm9kZXMgb2YgYSBidHJlZQorICogQHNiOiBGaWxlc3lzdGVtIHN1cGVyYmxvY2sKKyAqIEBkczogRGF0YXN0cmVhbSBjb250YWluaW5nIGJ0cmVlCisgKiBAa2V5X25vOiBLZXkgbnVtYmVyIChhbHBoYWJldGljYWwgb3JkZXIpIG9mIGtleSB0byByZWFkCisgKiBAYnVmc2l6ZTogU2l6ZSBvZiB0aGUgYnVmZmVyIHRvIHJldHVybiBrZXkgaW4KKyAqIEBrZXlidWY6IFBvaW50ZXIgdG8gYSBidWZmZXIgdG8gcHV0IHRoZSBrZXkgaW4KKyAqIEBrZXlzaXplOiBMZW5ndGggb2YgdGhlIHJldHVybmVkIGtleQorICogQHZhbHVlOiBWYWx1ZSBzdG9yZWQgd2l0aCB0aGUgcmV0dXJuZWQga2V5CisgKgorICogSGVyZXMgaG93IGl0IHdvcmtzOiBLZXlfbm8gaXMgdGhlIGluZGV4IG9mIHRoZSBrZXkvdmFsdWUgcGFpciB0byAKKyAqIHJldHVybiBpbiBrZXlidWYvdmFsdWUuCisgKiBCdWZzaXplIGlzIHRoZSBzaXplIG9mIGtleWJ1ZiAoQkVGU19OQU1FX0xFTisxIGlzIGEgZ29vZCBzaXplKS4gS2V5c2l6ZSBpcyAKKyAqIHRoZSBudW1iZXIgb2YgY2hhcmVjdGVycyBpbiB0aGUga2V5IChqdXN0IGEgY29udmVuaWVuY2UpLgorICoKKyAqIEFsZ29yaXRobToKKyAqICAgR2V0IHRoZSBmaXJzdCBsZWFmbm9kZSBvZiB0aGUgdHJlZS4gU2VlIGlmIHRoZSByZXF1ZXN0ZWQga2V5IGlzIGluIHRoYXQKKyAqICAgbm9kZS4gSWYgbm90LCBmb2xsb3cgdGhlIG5vZGUtPnJpZ2h0IGxpbmsgdG8gdGhlIG5leHQgbGVhZm5vZGUuIFJlcGVhdCAKKyAqICAgdW50aWwgdGhlIChrZXlfbm8pdGgga2V5IGlzIGZvdW5kIG9yIHRoZSB0cmVlIGlzIG91dCBvZiBrZXlzLgorICovCitpbnQKK2JlZnNfYnRyZWVfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2RhdGFfc3RyZWFtICogZHMsCisJCWxvZmZfdCBrZXlfbm8sIHNpemVfdCBidWZzaXplLCBjaGFyICprZXlidWYsIHNpemVfdCAqIGtleXNpemUsCisJCWJlZnNfb2ZmX3QgKiB2YWx1ZSkKK3sKKwliZWZzX2J0cmVlX25vZGUgKnRoaXNfbm9kZTsKKwliZWZzX2J0cmVlX3N1cGVyIGJ0X3N1cGVyOworCWJlZnNfb2ZmX3Qgbm9kZV9vZmYgPSAwOworCWludCBjdXJfa2V5OworCWJlZnNfb2ZmX3QgKnZhbGFycmF5OworCWNoYXIgKmtleXN0YXJ0OworCXUxNiBrZXlsZW47CisJaW50IHJlczsKKworCXVpbnQga2V5X3N1bSA9IDA7CisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiBiZWZzX2J0cmVlX3JlYWQoKSIpOworCisJaWYgKGJlZnNfYnRfcmVhZF9zdXBlcihzYiwgZHMsICZidF9zdXBlcikgIT0gQkVGU19PSykgeworCQliZWZzX2Vycm9yKHNiLAorCQkJICAgImJlZnNfYnRyZWVfcmVhZCgpIGZhaWxlZCB0byByZWFkIGluZGV4IHN1cGVyYmxvY2siKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoKHRoaXNfbm9kZSA9IChiZWZzX2J0cmVlX25vZGUgKikKKwkgICAgIGttYWxsb2Moc2l6ZW9mIChiZWZzX2J0cmVlX25vZGUpLCBHRlBfTk9GUykpID09IE5VTEwpIHsKKwkJYmVmc19lcnJvcihzYiwgImJlZnNfYnRyZWVfcmVhZCgpIGZhaWxlZCB0byBhbGxvY2F0ZSAldSAiCisJCQkgICAiYnl0ZXMgb2YgbWVtb3J5Iiwgc2l6ZW9mIChiZWZzX2J0cmVlX25vZGUpKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlub2RlX29mZiA9IGJ0X3N1cGVyLnJvb3Rfbm9kZV9wdHI7CisJdGhpc19ub2RlLT5iaCA9IE5VTEw7CisKKwkvKiBzZWVrcyBkb3duIHRvIGZpcnN0IGxlYWZub2RlLCByZWFkcyBpdCBpbnRvIHRoaXNfbm9kZSAqLworCXJlcyA9IGJlZnNfYnRyZWVfc2Vla2xlYWYoc2IsIGRzLCAmYnRfc3VwZXIsIHRoaXNfbm9kZSwgJm5vZGVfb2ZmKTsKKwlpZiAocmVzID09IEJFRlNfQlRfRU1QVFkpIHsKKwkJYnJlbHNlKHRoaXNfbm9kZS0+YmgpOworCQlrZnJlZSh0aGlzX25vZGUpOworCQkqdmFsdWUgPSAwOworCQkqa2V5c2l6ZSA9IDA7CisJCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfYnRyZWVfcmVhZCgpIFRyZWUgaXMgRU1QVFkiKTsKKwkJcmV0dXJuIEJFRlNfQlRfRU1QVFk7CisJfSBlbHNlIGlmIChyZXMgPT0gQkVGU19FUlIpIHsKKwkJZ290byBlcnJvcl9hbGxvYzsKKwl9CisKKwkvKiBmaW5kIHRoZSBsZWFmIG5vZGUgY29udGFpbmluZyB0aGUga2V5X25vIGtleSAqLworCisJd2hpbGUgKGtleV9zdW0gKyB0aGlzX25vZGUtPmhlYWQuYWxsX2tleV9jb3VudCA8PSBrZXlfbm8pIHsKKworCQkvKiBubyBtb3JlIG5vZGVzIHRvIGxvb2sgaW46IGtleV9ubyBpcyB0b28gbGFyZ2UgKi8KKwkJaWYgKHRoaXNfbm9kZS0+aGVhZC5yaWdodCA9PSBiZWZzX2J0X2ludmFsKSB7CisJCQkqa2V5c2l6ZSA9IDA7CisJCQkqdmFsdWUgPSAwOworCQkJYmVmc19kZWJ1ZyhzYiwKKwkJCQkgICAiPC0tLSBiZWZzX2J0cmVlX3JlYWQoKSBFTkQgb2Yga2V5cyBhdCAlTHUiLAorCQkJCSAgIGtleV9zdW0gKyB0aGlzX25vZGUtPmhlYWQuYWxsX2tleV9jb3VudCk7CisJCQlicmVsc2UodGhpc19ub2RlLT5iaCk7CisJCQlrZnJlZSh0aGlzX25vZGUpOworCQkJcmV0dXJuIEJFRlNfQlRfRU5EOworCQl9CisKKwkJa2V5X3N1bSArPSB0aGlzX25vZGUtPmhlYWQuYWxsX2tleV9jb3VudDsKKwkJbm9kZV9vZmYgPSB0aGlzX25vZGUtPmhlYWQucmlnaHQ7CisKKwkJaWYgKGJlZnNfYnRfcmVhZF9ub2RlKHNiLCBkcywgdGhpc19ub2RlLCBub2RlX29mZikgIT0gQkVGU19PSykgeworCQkJYmVmc19lcnJvcihzYiwgImJlZnNfYnRyZWVfcmVhZCgpIGZhaWxlZCB0byByZWFkICIKKwkJCQkgICAibm9kZSBhdCAlTHUiLCBub2RlX29mZik7CisJCQlnb3RvIGVycm9yX2FsbG9jOworCQl9CisJfQorCisJLyogaG93IG1hbnkga2V5cyBpbnRvIHRoaXNfbm9kZSBpcyBrZXlfbm8gKi8KKwljdXJfa2V5ID0ga2V5X25vIC0ga2V5X3N1bTsKKworCS8qIGdldCBwb2ludGVycyB0byBkYXRhc3RydWN0dXJlcyB3aXRoaW4gdGhlIG5vZGUgYm9keSAqLworCXZhbGFycmF5ID0gYmVmc19idF92YWxhcnJheSh0aGlzX25vZGUpOworCisJa2V5c3RhcnQgPSBiZWZzX2J0X2dldF9rZXkoc2IsIHRoaXNfbm9kZSwgY3VyX2tleSwgJmtleWxlbik7CisKKwliZWZzX2RlYnVnKHNiLCAiUmVhZCBbJUx1LCVkXToga2V5c2l6ZSAlZCIsIG5vZGVfb2ZmLCBjdXJfa2V5LCBrZXlsZW4pOworCisJaWYgKGJ1ZnNpemUgPCBrZXlsZW4gKyAxKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJiZWZzX2J0cmVlX3JlYWQoKSBrZXlidWYgdG9vIHNtYWxsICgldSkgIgorCQkJICAgImZvciBrZXkgb2Ygc2l6ZSAlZCIsIGJ1ZnNpemUsIGtleWxlbik7CisJCWJyZWxzZSh0aGlzX25vZGUtPmJoKTsKKwkJZ290byBlcnJvcl9hbGxvYzsKKwl9OworCisJc3RybmNweShrZXlidWYsIGtleXN0YXJ0LCBrZXlsZW4pOworCSp2YWx1ZSA9IGZzNjRfdG9fY3B1KHNiLCB2YWxhcnJheVtjdXJfa2V5XSk7CisJKmtleXNpemUgPSBrZXlsZW47CisJa2V5YnVmW2tleWxlbl0gPSAnXDAnOworCisJYmVmc19kZWJ1ZyhzYiwgIlJlYWQgWyVMdSwlZF06IEtleSBcIiUuKnNcIiwgVmFsdWUgJUx1Iiwgbm9kZV9vZmYsCisJCSAgIGN1cl9rZXksIGtleWxlbiwga2V5YnVmLCAqdmFsdWUpOworCisJYnJlbHNlKHRoaXNfbm9kZS0+YmgpOworCWtmcmVlKHRoaXNfbm9kZSk7CisKKwliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX2J0cmVlX3JlYWQoKSIpOworCisJcmV0dXJuIEJFRlNfT0s7CisKKyAgICAgIGVycm9yX2FsbG9jOgorCWtmcmVlKHRoaXNfbm9kZSk7CisKKyAgICAgIGVycm9yOgorCSprZXlzaXplID0gMDsKKwkqdmFsdWUgPSAwOworCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfYnRyZWVfcmVhZCgpIEVSUk9SIik7CisJcmV0dXJuIEJFRlNfRVJSOworfQorCisvKioKKyAqIGJlZnNfYnRyZWVfc2Vla2xlYWYgLSBGaW5kIHRoZSBmaXJzdCBsZWFmbm9kZSBpbiB0aGUgYnRyZWUKKyAqIEBzYjogRmlsZXN5c3RlbSBzdXBlcmJsb2NrCisgKiBAZHM6IERhdGFzdHJlYW0gY29udGFpbmluZyBidHJlZQorICogQGJ0X3N1cGVyOiBQb2ludGVyIHRvIHRoZSBzdXBlcmJsb2NrIG9mIHRoZSBidHJlZQorICogQHRoaXNfbm9kZTogQnVmZmVyIHRvIHJldHVybiB0aGUgbGVhZm5vZGUgaW4KKyAqIEBub2RlX29mZjogUG9pbnRlciB0byBvZmZzZXQgb2YgY3VycmVudCBub2RlIHdpdGhpbiBkYXRhc3RyZWFtLiBNb2RpZmllZAorICogCQlieSB0aGUgZnVuY3Rpb24uCisgKgorICoKKyAqIEhlbHBlciBmdW5jdGlvbiBmb3IgYnRyZWUgdHJhdmVyc2UuIE1vdmVzIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSAKKyAqIHN0YXJ0IG9mIHRoZSBmaXJzdCBsZWFmIG5vZGUuCisgKgorICogQWxzbyBjaGVja3MgZm9yIGFuIGVtcHR5IHRyZWUuIElmIHRoZXJlIGFyZSBubyBrZXlzLCByZXR1cm5zIEJFRlNfQlRfRU1QVFkuCisgKi8KK3N0YXRpYyBpbnQKK2JlZnNfYnRyZWVfc2Vla2xlYWYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19kYXRhX3N0cmVhbSAqIGRzLAorCQkgICAgYmVmc19idHJlZV9zdXBlciAqIGJ0X3N1cGVyLCBiZWZzX2J0cmVlX25vZGUgKiB0aGlzX25vZGUsCisJCSAgICBiZWZzX29mZl90ICogbm9kZV9vZmYpCit7CisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiBiZWZzX2J0cmVlX3NlZWtsZWFmKCkiKTsKKworCWlmIChiZWZzX2J0X3JlYWRfbm9kZShzYiwgZHMsIHRoaXNfbm9kZSwgKm5vZGVfb2ZmKSAhPSBCRUZTX09LKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJiZWZzX2J0cmVlX3NlZWtsZWFmKCkgZmFpbGVkIHRvIHJlYWQgIgorCQkJICAgIm5vZGUgYXQgJUx1IiwgKm5vZGVfb2ZmKTsKKwkJZ290byBlcnJvcjsKKwl9CisJYmVmc19kZWJ1ZyhzYiwgIlNlZWtsZWFmIHRvIHJvb3Qgbm9kZSAlTHUiLCAqbm9kZV9vZmYpOworCisJaWYgKHRoaXNfbm9kZS0+aGVhZC5hbGxfa2V5X2NvdW50ID09IDAgJiYgYmVmc19sZWFmbm9kZSh0aGlzX25vZGUpKSB7CisJCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfYnRyZWVfc2Vla2xlYWYoKSBUcmVlIGlzIEVNUFRZIik7CisJCXJldHVybiBCRUZTX0JUX0VNUFRZOworCX0KKworCXdoaWxlICghYmVmc19sZWFmbm9kZSh0aGlzX25vZGUpKSB7CisKKwkJaWYgKHRoaXNfbm9kZS0+aGVhZC5hbGxfa2V5X2NvdW50ID09IDApIHsKKwkJCWJlZnNfZGVidWcoc2IsICJiZWZzX2J0cmVlX3NlZWtsZWFmKCkgZW5jb3VudGVyZWQgIgorCQkJCSAgICJhbiBlbXB0eSBpbnRlcmlvciBub2RlOiAlTHUuIFVzaW5nIE92ZXJmbG93ICIKKwkJCQkgICAibm9kZTogJUx1IiwgKm5vZGVfb2ZmLAorCQkJCSAgIHRoaXNfbm9kZS0+aGVhZC5vdmVyZmxvdyk7CisJCQkqbm9kZV9vZmYgPSB0aGlzX25vZGUtPmhlYWQub3ZlcmZsb3c7CisJCX0gZWxzZSB7CisJCQliZWZzX29mZl90ICp2YWxhcnJheSA9IGJlZnNfYnRfdmFsYXJyYXkodGhpc19ub2RlKTsKKwkJCSpub2RlX29mZiA9IGZzNjRfdG9fY3B1KHNiLCB2YWxhcnJheVswXSk7CisJCX0KKwkJaWYgKGJlZnNfYnRfcmVhZF9ub2RlKHNiLCBkcywgdGhpc19ub2RlLCAqbm9kZV9vZmYpICE9IEJFRlNfT0spIHsKKwkJCWJlZnNfZXJyb3Ioc2IsICJiZWZzX2J0cmVlX3NlZWtsZWFmKCkgZmFpbGVkIHRvIHJlYWQgIgorCQkJCSAgICJub2RlIGF0ICVMdSIsICpub2RlX29mZik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJYmVmc19kZWJ1ZyhzYiwgIlNlZWtsZWFmIHRvIGNoaWxkIG5vZGUgJUx1IiwgKm5vZGVfb2ZmKTsKKwl9CisJYmVmc19kZWJ1ZyhzYiwgIk5vZGUgJUx1IGlzIGEgbGVhZiBub2RlIiwgKm5vZGVfb2ZmKTsKKworCXJldHVybiBCRUZTX09LOworCisgICAgICBlcnJvcjoKKwliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX2J0cmVlX3NlZWtsZWFmKCkgRVJST1IiKTsKKwlyZXR1cm4gQkVGU19FUlI7Cit9CisKKy8qKgorICogYmVmc19sZWFmbm9kZSAtIERldGVybWluZSBpZiB0aGUgYnRyZWUgbm9kZSBpcyBhIGxlYWYgbm9kZSBvciBhbiAKKyAqIGludGVyaW9yIG5vZGUKKyAqIEBub2RlOiBQb2ludGVyIHRvIG5vZGUgc3RydWN0dXJlIHRvIHRlc3QKKyAqIAorICogUmV0dXJuIDEgaWYgbGVhZiwgMCBpZiBpbnRlcmlvcgorICovCitzdGF0aWMgaW50CitiZWZzX2xlYWZub2RlKGJlZnNfYnRyZWVfbm9kZSAqIG5vZGUpCit7CisJLyogYWxsIGludGVyaW9yIG5vZGVzIChhbmQgb25seSBpbnRlcmlvciBub2RlcykgaGF2ZSBhbiBvdmVyZmxvdyBub2RlICovCisJaWYgKG5vZGUtPmhlYWQub3ZlcmZsb3cgPT0gYmVmc19idF9pbnZhbCkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworLyoqCisgKiBiZWZzX2J0X2tleWxlbl9pbmRleCAtIEZpbmRzIHN0YXJ0IG9mIGtleWxlbiBpbmRleCBpbiBhIG5vZGUKKyAqIEBub2RlOiBQb2ludGVyIHRvIHRoZSBub2RlIHN0cnVjdHVyZSB0byBmaW5kIHRoZSBrZXlsZW4gaW5kZXggd2l0aGluCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBrZXkgbGVuZ3RoIGluZGV4IGFycmF5CisgKiBvZiB0aGUgQit0cmVlIG5vZGUgKkBub2RlCisgKgorICogIlRoZSBsZW5ndGggb2YgYWxsIHRoZSBrZXlzIGluIHRoZSBub2RlIGlzIGFkZGVkIHRvIHRoZSBzaXplIG9mIHRoZQorICogaGVhZGVyIGFuZCB0aGVuIHJvdW5kZWQgdXAgdG8gYSBtdWx0aXBsZSBvZiBmb3VyIHRvIGdldCB0aGUgYmVnaW5uaW5nCisgKiBvZiB0aGUga2V5IGxlbmd0aCBpbmRleCIgKHAuODgsIHByYWN0aWNhbCBmaWxlc3lzdGVtIGRlc2lnbikuCisgKgorICogRXhjZXB0IHRoYXQgcm91bmRpbmcgdXAgdG8gOCB3b3JrcywgYW5kIHJvdW5kaW5nIHVwIHRvIDQgZG9lc24ndC4KKyAqLworc3RhdGljIHUxNiAqCitiZWZzX2J0X2tleWxlbl9pbmRleChiZWZzX2J0cmVlX25vZGUgKiBub2RlKQoreworCWNvbnN0IGludCBrZXlsZW5fYWxpZ24gPSA4OworCXVuc2lnbmVkIGxvbmcgaW50IG9mZiA9CisJICAgIChzaXplb2YgKGJlZnNfYnRyZWVfbm9kZWhlYWQpICsgbm9kZS0+aGVhZC5hbGxfa2V5X2xlbmd0aCk7CisJdWxvbmcgdG1wID0gb2ZmICUga2V5bGVuX2FsaWduOworCisJaWYgKHRtcCkKKwkJb2ZmICs9IGtleWxlbl9hbGlnbiAtIHRtcDsKKworCXJldHVybiAodTE2ICopICgodm9pZCAqKSBub2RlLT5vZF9ub2RlICsgb2ZmKTsKK30KKworLyoqCisgKiBiZWZzX2J0X3ZhbGFycmF5IC0gRmluZHMgdGhlIHN0YXJ0IG9mIHZhbHVlIGFycmF5IGluIGEgbm9kZQorICogQG5vZGU6IFBvaW50ZXIgdG8gdGhlIG5vZGUgc3RydWN0dXJlIHRvIGZpbmQgdGhlIHZhbHVlIGFycmF5IHdpdGhpbgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgdmFsdWUgYXJyYXkKKyAqIG9mIHRoZSBub2RlIHBvaW50ZWQgdG8gYnkgdGhlIG5vZGUgaGVhZGVyCisgKi8KK3N0YXRpYyBiZWZzX29mZl90ICoKK2JlZnNfYnRfdmFsYXJyYXkoYmVmc19idHJlZV9ub2RlICogbm9kZSkKK3sKKwl2b2lkICprZXlsZW5faW5kZXhfc3RhcnQgPSAodm9pZCAqKSBiZWZzX2J0X2tleWxlbl9pbmRleChub2RlKTsKKwlzaXplX3Qga2V5bGVuX2luZGV4X3NpemUgPSBub2RlLT5oZWFkLmFsbF9rZXlfY291bnQgKiBzaXplb2YgKHUxNik7CisKKwlyZXR1cm4gKGJlZnNfb2ZmX3QgKikgKGtleWxlbl9pbmRleF9zdGFydCArIGtleWxlbl9pbmRleF9zaXplKTsKK30KKworLyoqCisgKiBiZWZzX2J0X2tleWRhdGEgLSBGaW5kcyBzdGFydCBvZiBrZXlkYXRhIGFycmF5IGluIGEgbm9kZQorICogQG5vZGU6IFBvaW50ZXIgdG8gdGhlIG5vZGUgc3RydWN0dXJlIHRvIGZpbmQgdGhlIGtleWRhdGEgYXJyYXkgd2l0aGluCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBrZXlkYXRhIGFycmF5CisgKiBvZiB0aGUgbm9kZSBwb2ludGVkIHRvIGJ5IHRoZSBub2RlIGhlYWRlciAKKyAqLworc3RhdGljIGNoYXIgKgorYmVmc19idF9rZXlkYXRhKGJlZnNfYnRyZWVfbm9kZSAqIG5vZGUpCit7CisJcmV0dXJuIChjaGFyICopICgodm9pZCAqKSBub2RlLT5vZF9ub2RlICsgc2l6ZW9mIChiZWZzX2J0cmVlX25vZGVoZWFkKSk7Cit9CisKKy8qKgorICogYmVmc19idF9nZXRfa2V5IC0gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGEga2V5CisgKiBAc2I6IGZpbGVzeXN0ZW0gc3VwZXJibG9jaworICogQG5vZGU6IG5vZGUgaW4gd2hpY2ggdG8gbG9vayBmb3IgdGhlIGtleQorICogQGluZGV4OiB0aGUgaW5kZXggb2YgdGhlIGtleSB0byBnZXQKKyAqIEBrZXlsZW46IG1vZGlmaWVkIHRvIGJlIHRoZSBsZW5ndGggb2YgdGhlIGtleSBhdCBAaW5kZXgKKyAqCisgKiBSZXR1cm5zIGEgdmFsaWQgcG9pbnRlciBpbnRvIEBub2RlIG9uIHN1Y2Nlc3MuCisgKiBSZXR1cm5zIE5VTEwgb24gZmFpbHVyZSAoYmFkIGlucHV0KSBhbmQgc2V0cyAqQGtleWxlbiA9IDAKKyAqLworc3RhdGljIGNoYXIgKgorYmVmc19idF9nZXRfa2V5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfYnRyZWVfbm9kZSAqIG5vZGUsCisJCWludCBpbmRleCwgdTE2ICoga2V5bGVuKQoreworCWludCBwcmV2X2tleV9lbmQ7CisJY2hhciAqa2V5c3RhcnQ7CisJdTE2ICprZXlsZW5faW5kZXg7CisKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gbm9kZS0+aGVhZC5hbGxfa2V5X2NvdW50KSB7CisJCSprZXlsZW4gPSAwOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlrZXlzdGFydCA9IGJlZnNfYnRfa2V5ZGF0YShub2RlKTsKKwlrZXlsZW5faW5kZXggPSBiZWZzX2J0X2tleWxlbl9pbmRleChub2RlKTsKKworCWlmIChpbmRleCA9PSAwKQorCQlwcmV2X2tleV9lbmQgPSAwOworCWVsc2UKKwkJcHJldl9rZXlfZW5kID0gZnMxNl90b19jcHUoc2IsIGtleWxlbl9pbmRleFtpbmRleCAtIDFdKTsKKworCSprZXlsZW4gPSBmczE2X3RvX2NwdShzYiwga2V5bGVuX2luZGV4W2luZGV4XSkgLSBwcmV2X2tleV9lbmQ7CisKKwlyZXR1cm4ga2V5c3RhcnQgKyBwcmV2X2tleV9lbmQ7Cit9CisKKy8qKgorICogYmVmc19jb21wYXJlX3N0cmluZ3MgLSBjb21wYXJlIHR3byBzdHJpbmdzCisgKiBAa2V5MTogcG9pbnRlciB0byB0aGUgZmlyc3Qga2V5IHRvIGJlIGNvbXBhcmVkIAorICogQGtleWxlbjE6IGxlbmd0aCBpbiBieXRlcyBvZiBrZXkxCisgKiBAa2V5MjogcG9pbnRlciB0byB0aGUgc2Vjb25kIGtleSB0byBiZSBjb21wYXJlZAorICogQGtlbGVuMjogbGVuZ3RoIGluIGJ5dGVzIG9mIGtleTIKKyAqCisgKiBSZXR1cm5zIDAgaWYgQGtleTEgYW5kIEBrZXkyIGFyZSBlcXVhbC4KKyAqIFJldHVybnMgPjAgaWYgQGtleTEgaXMgZ3JlYXRlci4KKyAqIFJldHVybnMgPDAgaWYgQGtleTIgaXMgZ3JlYXRlci4uCisgKi8KK3N0YXRpYyBpbnQKK2JlZnNfY29tcGFyZV9zdHJpbmdzKGNvbnN0IHZvaWQgKmtleTEsIGludCBrZXlsZW4xLAorCQkgICAgIGNvbnN0IHZvaWQgKmtleTIsIGludCBrZXlsZW4yKQoreworCWludCBsZW4gPSBtaW5fdChpbnQsIGtleWxlbjEsIGtleWxlbjIpOworCWludCByZXN1bHQgPSBzdHJuY21wKGtleTEsIGtleTIsIGxlbik7CisJaWYgKHJlc3VsdCA9PSAwKQorCQlyZXN1bHQgPSBrZXlsZW4xIC0ga2V5bGVuMjsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBUaGVzZSB3aWxsIGJlIHVzZWQgZm9yIG5vbi1zdHJpbmcga2V5ZWQgYnRyZWVzICovCisjaWYgMAorc3RhdGljIGludAorYnRyZWVfY29tcGFyZV9pbnQzMihjb250IHZvaWQgKmtleTEsIGludCBrZXlsZW4xLCBjb25zdCB2b2lkICprZXkyLCBpbnQga2V5bGVuMikKK3sKKwlyZXR1cm4gKihpbnQzMl90ICopIGtleTEgLSAqKGludDMyX3QgKikga2V5MjsKK30KKworc3RhdGljIGludAorYnRyZWVfY29tcGFyZV91aW50MzIoY29udCB2b2lkICprZXkxLCBpbnQga2V5bGVuMSwKKwkJICAgICBjb25zdCB2b2lkICprZXkyLCBpbnQga2V5bGVuMikKK3sKKwlpZiAoKih1X2ludDMyX3QgKikga2V5MSA9PSAqKHVfaW50MzJfdCAqKSBrZXkyKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmICgqKHVfaW50MzJfdCAqKSBrZXkxID4gKih1X2ludDMyX3QgKikga2V5MikKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gLTE7Cit9CitzdGF0aWMgaW50CitidHJlZV9jb21wYXJlX2ludDY0KGNvbnQgdm9pZCAqa2V5MSwgaW50IGtleWxlbjEsIGNvbnN0IHZvaWQgKmtleTIsIGludCBrZXlsZW4yKQoreworCWlmICgqKGludDY0X3QgKikga2V5MSA9PSAqKGludDY0X3QgKikga2V5MikKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAoKihpbnQ2NF90ICopIGtleTEgPiAqKGludDY0X3QgKikga2V5MikKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK2J0cmVlX2NvbXBhcmVfdWludDY0KGNvbnQgdm9pZCAqa2V5MSwgaW50IGtleWxlbjEsCisJCSAgICAgY29uc3Qgdm9pZCAqa2V5MiwgaW50IGtleWxlbjIpCit7CisJaWYgKCoodV9pbnQ2NF90ICopIGtleTEgPT0gKih1X2ludDY0X3QgKikga2V5MikKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAoKih1X2ludDY0X3QgKikga2V5MSA+ICoodV9pbnQ2NF90ICopIGtleTIpCisJCXJldHVybiAxOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50CitidHJlZV9jb21wYXJlX2Zsb2F0KGNvbnQgdm9pZCAqa2V5MSwgaW50IGtleWxlbjEsIGNvbnN0IHZvaWQgKmtleTIsIGludCBrZXlsZW4yKQoreworCWZsb2F0IHJlc3VsdCA9ICooZmxvYXQgKikga2V5MSAtICooZmxvYXQgKikga2V5MjsKKwlpZiAocmVzdWx0ID09IDAuMGYpCisJCXJldHVybiAwOworCisJcmV0dXJuIChyZXN1bHQgPCAwLjBmKSA/IC0xIDogMTsKK30KKworc3RhdGljIGludAorYnRyZWVfY29tcGFyZV9kb3VibGUoY29udCB2b2lkICprZXkxLCBpbnQga2V5bGVuMSwKKwkJICAgICBjb25zdCB2b2lkICprZXkyLCBpbnQga2V5bGVuMikKK3sKKwlkb3VibGUgcmVzdWx0ID0gKihkb3VibGUgKikga2V5MSAtICooZG91YmxlICopIGtleTI7CisJaWYgKHJlc3VsdCA9PSAwLjApCisJCXJldHVybiAwOworCisJcmV0dXJuIChyZXN1bHQgPCAwLjApID8gLTEgOiAxOworfQorI2VuZGlmCQkJCS8vMApkaWZmIC0tZ2l0IGEvZnMvYmVmcy9idHJlZS5oIGIvZnMvYmVmcy9idHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZTc4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iZWZzL2J0cmVlLmgKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIGJ0cmVlLmgKKyAqIAorICovCisKKworaW50IGJlZnNfYnRyZWVfZmluZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2RhdGFfc3RyZWFtICogZHMsCisJCSAgICBjb25zdCBjaGFyICprZXksIGJlZnNfb2ZmX3QgKiB2YWx1ZSk7CisKK2ludCBiZWZzX2J0cmVlX3JlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19kYXRhX3N0cmVhbSAqIGRzLAorCQkgICAgbG9mZl90IGtleV9ubywgc2l6ZV90IGJ1ZnNpemUsIGNoYXIgKmtleWJ1ZiwKKwkJICAgIHNpemVfdCAqIGtleXNpemUsIGJlZnNfb2ZmX3QgKiB2YWx1ZSk7CisKZGlmZiAtLWdpdCBhL2ZzL2JlZnMvZGF0YXN0cmVhbS5jIGIvZnMvYmVmcy9kYXRhc3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1ZjZiMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvZGF0YXN0cmVhbS5jCkBAIC0wLDAgKzEsNTI4IEBACisvKgorICogbGludXgvZnMvYmVmcy9kYXRhc3RyZWFtLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgV2lsbCBEeXNvbiA8d2lsbF9keXNvbkBwb2JveC5jb20+CisgKgorICogQmFzZWQgb24gcG9ydGlvbnMgb2YgZmlsZS5jIGJ5IE1ha290byBLYXRvIDxtX2thdG9AZ2EyLnNvLW5ldC5uZS5qcD4KKyAqCisgKiBNYW55IHRoYW5rcyB0byBEb21pbmljIEdpYW1wYW9sbywgYXV0aG9yIG9mICJQcmFjdGljYWwgRmlsZSBTeXN0ZW0KKyAqIERlc2lnbiB3aXRoIHRoZSBCZSBGaWxlIFN5c3RlbSIsIGZvciBzdWNoIGEgaGVscGZ1bCBib29rLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlICJiZWZzLmgiCisjaW5jbHVkZSAiZGF0YXN0cmVhbS5oIgorI2luY2x1ZGUgImlvLmgiCisjaW5jbHVkZSAiZW5kaWFuLmgiCisKK2NvbnN0IGJlZnNfaW5vZGVfYWRkciBCQURfSUFERFIgPSB7IDAsIDAsIDAgfTsKKworc3RhdGljIGludCBiZWZzX2ZpbmRfYnJ1bl9kaXJlY3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgYmVmc19kYXRhX3N0cmVhbSAqIGRhdGEsCisJCQkJIGJlZnNfYmxvY2tucl90IGJsb2Nrbm8sIGJlZnNfYmxvY2tfcnVuICogcnVuKTsKKworc3RhdGljIGludCBiZWZzX2ZpbmRfYnJ1bl9pbmRpcmVjdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgIGJlZnNfZGF0YV9zdHJlYW0gKiBkYXRhLAorCQkJCSAgIGJlZnNfYmxvY2tucl90IGJsb2Nrbm8sCisJCQkJICAgYmVmc19ibG9ja19ydW4gKiBydW4pOworCitzdGF0aWMgaW50IGJlZnNfZmluZF9icnVuX2RibGluZGlyZWN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICAgYmVmc19kYXRhX3N0cmVhbSAqIGRhdGEsCisJCQkJICAgICAgYmVmc19ibG9ja25yX3QgYmxvY2tubywKKwkJCQkgICAgICBiZWZzX2Jsb2NrX3J1biAqIHJ1bik7CisKKy8qKgorICogYmVmc19yZWFkX2RhdGFzdHJlYW0gLSBnZXQgYnVmZmVyX2hlYWQgY29udGFpbmluZyBkYXRhLCBzdGFydGluZyBmcm9tIHBvcy4KKyAqIEBzYjogRmlsZXN5c3RlbSBzdXBlcmJsb2NrCisgKiBAZHM6IGRhdGFzdHJlbSB0byBmaW5kIGRhdGEgd2l0aAorICogQHBvczogc3RhcnQgb2YgZGF0YQorICogQG9mZjogb2Zmc2V0IG9mIGRhdGEgaW4gYnVmZmVyX2hlYWQtPmJfZGF0YQorICoKKyAqIFJldHVybnMgcG9pbnRlciB0byBidWZmZXJfaGVhZCBjb250YWluaW5nIGRhdGEgc3RhcnRpbmcgd2l0aCBvZmZzZXQgQG9mZiwKKyAqIGlmIHlvdSBkb24ndCBuZWVkIHRvIGtub3cgb2Zmc2V0IGp1c3Qgc2V0IEBvZmYgPSBOVUxMLgorICovCitzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorYmVmc19yZWFkX2RhdGFzdHJlYW0oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19kYXRhX3N0cmVhbSAqIGRzLAorCQkgICAgIGJlZnNfb2ZmX3QgcG9zLCB1aW50ICogb2ZmKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWJlZnNfYmxvY2tfcnVuIHJ1bjsKKwliZWZzX2Jsb2NrbnJfdCBibG9jazsJLyogYmxvY2sgY29yZXNwb25kaW5nIHRvIHBvcyAqLworCisJYmVmc19kZWJ1ZyhzYiwgIi0tLT4gYmVmc19yZWFkX2RhdGFzdHJlYW0oKSAlTHUiLCBwb3MpOworCWJsb2NrID0gcG9zID4+IEJFRlNfU0Ioc2IpLT5ibG9ja19zaGlmdDsKKwlpZiAob2ZmKQorCQkqb2ZmID0gcG9zIC0gKGJsb2NrIDw8IEJFRlNfU0Ioc2IpLT5ibG9ja19zaGlmdCk7CisKKwlpZiAoYmVmc19mYmxvY2syYnJ1bihzYiwgZHMsIGJsb2NrLCAmcnVuKSAhPSBCRUZTX09LKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJCZUZTOiBFcnJvciBmaW5kaW5nIGRpc2sgYWRkciBvZiBibG9jayAlbHUiLAorCQkJICAgYmxvY2spOworCQliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX3JlYWRfZGF0YXN0cmVhbSgpIEVSUk9SIik7CisJCXJldHVybiBOVUxMOworCX0KKwliaCA9IGJlZnNfYnJlYWRfaWFkZHIoc2IsIHJ1bik7CisJaWYgKCFiaCkgeworCQliZWZzX2Vycm9yKHNiLCAiQmVGUzogRXJyb3IgcmVhZGluZyBibG9jayAlbHUgZnJvbSBkYXRhc3RyZWFtIiwKKwkJCSAgIGJsb2NrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gYmVmc19yZWFkX2RhdGFzdHJlYW0oKSByZWFkIGRhdGEsIHN0YXJ0aW5nIGF0ICVMdSIsCisJCSAgIHBvcyk7CisKKwlyZXR1cm4gYmg7Cit9CisKKy8qCisgKiBUYWtlcyBhIGZpbGUgcG9zaXRpb24gYW5kIGdpdmVzIGJhY2sgYSBicnVuIHdobydzIHN0YXJ0aW5nIGJsb2NrCisgKiBpcyBibG9jayBudW1iZXIgZmJsb2NrIG9mIHRoZSBmaWxlLgorICogCisgKiBSZXR1cm5zIEJFRlNfT0sgb3IgQkVGU19FUlIuCisgKiAKKyAqIENhbGxzIHNwZWNpYWxpemVkIGZ1bmN0aW9ucyBmb3IgZWFjaCBvZiB0aGUgdGhyZWUgcG9zc2libGUKKyAqIGRhdGFzdHJlYW0gcmVnaW9ucy4KKyAqCisgKiAyMDAxLTExLTE1IFdpbGwgRHlzb24KKyAqLworaW50CitiZWZzX2ZibG9jazJicnVuKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfZGF0YV9zdHJlYW0gKiBkYXRhLAorCQkgYmVmc19ibG9ja25yX3QgZmJsb2NrLCBiZWZzX2Jsb2NrX3J1biAqIHJ1bikKK3sKKwlpbnQgZXJyOworCWJlZnNfb2ZmX3QgcG9zID0gZmJsb2NrIDw8IEJFRlNfU0Ioc2IpLT5ibG9ja19zaGlmdDsKKworCWlmIChwb3MgPCBkYXRhLT5tYXhfZGlyZWN0X3JhbmdlKSB7CisJCWVyciA9IGJlZnNfZmluZF9icnVuX2RpcmVjdChzYiwgZGF0YSwgZmJsb2NrLCBydW4pOworCisJfSBlbHNlIGlmIChwb3MgPCBkYXRhLT5tYXhfaW5kaXJlY3RfcmFuZ2UpIHsKKwkJZXJyID0gYmVmc19maW5kX2JydW5faW5kaXJlY3Qoc2IsIGRhdGEsIGZibG9jaywgcnVuKTsKKworCX0gZWxzZSBpZiAocG9zIDwgZGF0YS0+bWF4X2RvdWJsZV9pbmRpcmVjdF9yYW5nZSkgeworCQllcnIgPSBiZWZzX2ZpbmRfYnJ1bl9kYmxpbmRpcmVjdChzYiwgZGF0YSwgZmJsb2NrLCBydW4pOworCisJfSBlbHNlIHsKKwkJYmVmc19lcnJvcihzYiwKKwkJCSAgICJiZWZzX2ZibG9jazJicnVuKCkgd2FzIGFza2VkIHRvIGZpbmQgYmxvY2sgJWx1LCAiCisJCQkgICAid2hpY2ggaXMgbm90IG1hcHBlZCBieSB0aGUgZGF0YXN0cmVhbVxuIiwgZmJsb2NrKTsKKwkJZXJyID0gQkVGU19FUlI7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogYmVmc19yZWFkX2xzbXlsaW5rIC0gcmVhZCBsb25nIHN5bWxpbmsgZnJvbSBkYXRhc3RyZWFtLgorICogQHNiOiBGaWxlc3lzdGVtIHN1cGVyYmxvY2sgCisgKiBAZHM6IERhdGFzdHJlbSB0byByZWFkIGZyb20KKyAqIEBidWY6IEJ1ZmZlciBpbiB3aWNoIHRvIHBsYWNlIGxvbmcgc3ltbGluayBkYXRhCisgKiBAbGVuOiBMZW5ndGggb2YgdGhlIGxvbmcgc3ltbGluayBpbiBieXRlcworICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkCisgKi8KK3NpemVfdAorYmVmc19yZWFkX2xzeW1saW5rKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBiZWZzX2RhdGFfc3RyZWFtICogZHMsIHZvaWQgKmJ1ZmYsCisJCSAgIGJlZnNfb2ZmX3QgbGVuKQoreworCWJlZnNfb2ZmX3QgYnl0ZXNfcmVhZCA9IDA7CS8qIGJ5dGVzIHJlYWRlZCAqLworCXUxNiBwbGVuOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWJlZnNfZGVidWcoc2IsICItLS0+IGJlZnNfcmVhZF9sc3ltbGluaygpIGxlbmd0aDogJUx1IiwgbGVuKTsKKworCXdoaWxlIChieXRlc19yZWFkIDwgbGVuKSB7CisJCWJoID0gYmVmc19yZWFkX2RhdGFzdHJlYW0oc2IsIGRzLCBieXRlc19yZWFkLCBOVUxMKTsKKwkJaWYgKCFiaCkgeworCQkJYmVmc19lcnJvcihzYiwgIkJlRlM6IEVycm9yIHJlYWRpbmcgZGF0YXN0cmVhbSBibG9jayAiCisJCQkJICAgInN0YXJ0aW5nIGZyb20gJUx1IiwgYnl0ZXNfcmVhZCk7CisJCQliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX3JlYWRfbHN5bWxpbmsoKSBFUlJPUiIpOworCQkJcmV0dXJuIGJ5dGVzX3JlYWQ7CisKKwkJfQorCQlwbGVuID0gKChieXRlc19yZWFkICsgQkVGU19TQihzYiktPmJsb2NrX3NpemUpIDwgbGVuKSA/CisJCSAgICBCRUZTX1NCKHNiKS0+YmxvY2tfc2l6ZSA6IGxlbiAtIGJ5dGVzX3JlYWQ7CisJCW1lbWNweShidWZmICsgYnl0ZXNfcmVhZCwgYmgtPmJfZGF0YSwgcGxlbik7CisJCWJyZWxzZShiaCk7CisJCWJ5dGVzX3JlYWQgKz0gcGxlbjsKKwl9CisKKwliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX3JlYWRfbHN5bWxpbmsoKSByZWFkICV1IGJ5dGVzIiwgYnl0ZXNfcmVhZCk7CisJcmV0dXJuIGJ5dGVzX3JlYWQ7Cit9CisKKy8qKgorICogYmVmc19jb3VudF9ibG9ja3MgLSBibG9ja3MgdXNlZCBieSBhIGZpbGUKKyAqIEBzYjogRmlsZXN5c3RlbSBzdXBlcmJsb2NrCisgKiBAZHM6IERhdGFzdHJlYW0gb2YgdGhlIGZpbGUKKyAqCisgKiBDb3VudHMgdGhlIG51bWJlciBvZiBmcyBibG9ja3MgdGhhdCB0aGUgZmlsZSByZXByZXNlbnRlZCBieQorICogaW5vZGUgb2NjdXBpZXMgb24gdGhlIGZpbGVzeXN0ZW0sIGNvdW50aW5nIGJvdGggcmVndWxhciBmaWxlCisgKiBkYXRhIGFuZCBmaWxlc3lzdGVtIG1ldGFkYXRhIChhbmQgZXZlbnR1YWxseSBhdHRyaWJ1dGUgZGF0YQorICogd2hlbiB3ZSBzdXBwb3J0IGF0dHJpYnV0ZXMpCisqLworCitiZWZzX2Jsb2NrbnJfdAorYmVmc19jb3VudF9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGJlZnNfZGF0YV9zdHJlYW0gKiBkcykKK3sKKwliZWZzX2Jsb2NrbnJfdCBibG9ja3M7CisJYmVmc19ibG9ja25yX3QgZGF0YWJsb2NrczsJLyogRmlsZSBkYXRhIGJsb2NrcyAqLworCWJlZnNfYmxvY2tucl90IG1ldGFibG9ja3M7CS8qIEZTIG1ldGFkYXRhIGJsb2NrcyAqLworCWJlZnNfc2JfaW5mbyAqYmVmc19zYiA9IEJFRlNfU0Ioc2IpOworCisJYmVmc19kZWJ1ZyhzYiwgIi0tLT4gYmVmc19jb3VudF9ibG9ja3MoKSIpOworCisJZGF0YWJsb2NrcyA9IGRzLT5zaXplID4+IGJlZnNfc2ItPmJsb2NrX3NoaWZ0OworCWlmIChkcy0+c2l6ZSAmIChiZWZzX3NiLT5ibG9ja19zaXplIC0gMSkpCisJCWRhdGFibG9ja3MgKz0gMTsKKworCW1ldGFibG9ja3MgPSAxOwkJLyogU3RhcnQgd2l0aCAxIGJsb2NrIGZvciBpbm9kZSAqLworCisJLyogU2l6ZSBvZiBpbmRpcmVjdCBibG9jayAqLworCWlmIChkcy0+c2l6ZSA+IGRzLT5tYXhfZGlyZWN0X3JhbmdlKQorCQltZXRhYmxvY2tzICs9IGRzLT5pbmRpcmVjdC5sZW47CisKKwkvKgorCSAgIERvdWJsZSBpbmRpciBibG9jaywgcGx1cyBhbGwgdGhlIGluZGlyZWN0IGJsb2NrcyBpdCBtYXBwcworCSAgIEluIHRoZSBkb3VibGUtaW5kaXJlY3QgcmFuZ2UsIGFsbCBibG9jayBydW5zIG9mIGRhdGEgYXJlCisJICAgQkVGU19EQkxJTkRJUl9CUlVOX0xFTiBibG9ja3MgbG9uZy4gVGhlcmVmb3JlLCB3ZSBrbm93IAorCSAgIGhvdyBtYW55IGRhdGEgYmxvY2sgcnVucyBhcmUgaW4gdGhlIGRvdWJsZS1pbmRpcmVjdCByZWdpb24sCisJICAgYW5kIGZyb20gdGhhdCB3ZSBrbm93IGhvdyBtYW55IGluZGlyZWN0IGJsb2NrcyBpdCB0YWtlcyB0bworCSAgIG1hcCB0aGVtLiBXZSBhc3N1bWUgdGhhdCB0aGUgaW5kaXJlY3QgYmxvY2tzIGFyZSBhbHNvCisJICAgQkVGU19EQkxJTkRJUl9CUlVOX0xFTiBibG9ja3MgbG9uZy4KKwkgKi8KKwlpZiAoZHMtPnNpemUgPiBkcy0+bWF4X2luZGlyZWN0X3JhbmdlICYmIGRzLT5tYXhfaW5kaXJlY3RfcmFuZ2UgIT0gMCkgeworCQl1aW50IGRibF9ieXRlczsKKwkJdWludCBkYmxfYnJ1bnM7CisJCXVpbnQgaW5kaXJibG9ja3M7CisKKwkJZGJsX2J5dGVzID0KKwkJICAgIGRzLT5tYXhfZG91YmxlX2luZGlyZWN0X3JhbmdlIC0gZHMtPm1heF9pbmRpcmVjdF9yYW5nZTsKKwkJZGJsX2JydW5zID0KKwkJICAgIGRibF9ieXRlcyAvIChiZWZzX3NiLT5ibG9ja19zaXplICogQkVGU19EQkxJTkRJUl9CUlVOX0xFTik7CisJCWluZGlyYmxvY2tzID0gZGJsX2JydW5zIC8gYmVmc19pYWRkcnNfcGVyX2Jsb2NrKHNiKTsKKworCQltZXRhYmxvY2tzICs9IGRzLT5kb3VibGVfaW5kaXJlY3QubGVuOworCQltZXRhYmxvY2tzICs9IGluZGlyYmxvY2tzOworCX0KKworCWJsb2NrcyA9IGRhdGFibG9ja3MgKyBtZXRhYmxvY2tzOworCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfY291bnRfYmxvY2tzKCkgJXUgYmxvY2tzIiwgYmxvY2tzKTsKKworCXJldHVybiBibG9ja3M7Cit9CisKKy8qCisJRmluZHMgdGhlIGJsb2NrIHJ1biB0aGF0IHN0YXJ0cyBhdCBmaWxlIGJsb2NrIG51bWJlciBibG9ja25vCisJaW4gdGhlIGZpbGUgcmVwcmVzZW50ZWQgYnkgdGhlIGRhdGFzdHJlYW0gZGF0YSwgaWYgdGhhdCAKKwlibG9ja25vIGlzIGluIHRoZSBkaXJlY3QgcmVnaW9uIG9mIHRoZSBkYXRhc3RyZWFtLgorCQorCXNiOiB0aGUgc3VwZXJibG9jaworCWRhdGE6IHRoZSBkYXRhc3RyZWFtCisJYmxvY2tubzogdGhlIGJsb2NrbnVtYmVyIHRvIGZpbmQKKwlydW46IFRoZSBmb3VuZCBydW4gaXMgcGFzc2VkIGJhY2sgdGhyb3VnaCB0aGlzIHBvaW50ZXIKKwkKKwlSZXR1cm4gdmFsdWUgaXMgQkVGU19PSyBpZiB0aGUgYmxvY2tydW4gaXMgZm91bmQsIEJFRlNfRVJSCisJb3RoZXJ3aXNlLgorCQorCUFsZ29yaXRobToKKwlMaW5lYXIgc2VhcmNoLiBDaGVja3MgZWFjaCBlbGVtZW50IG9mIGFycmF5W10gdG8gc2VlIGlmIGl0CisJY29udGFpbnMgdGhlIGJsb2Nrbm8tdGggZmlsZXN5c3RlbSBibG9jay4gVGhpcyBpcyBuZWNlc3NhcnkKKwliZWNhdXNlIHRoZSBibG9jayBydW5zIG1hcCB2YXJpYWJsZSBhbW91bnRzIG9mIGRhdGEuIFNpbXBseQorCWtlZXBzIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBibG9ja3Mgc2VhcmNoZWQgc28gZmFyIChzdW0pLAorCWluY3JlbWVudGluZyB0aGlzIGJ5IHRoZSBsZW5ndGggb2YgZWFjaCBibG9jayBydW4gYXMgd2UgY29tZQorCWFjcm9zcyBpdC4gQWRkcyBzdW0gdG8gKmNvdW50IGJlZm9yZSByZXR1cm5pbmcgKHRoaXMgaXMgc28KKwl5b3UgY2FuIHNlYXJjaCBtdWx0aXBsZSBhcnJheXMgdGhhdCBhcmUgbG9naWNhbHkgb25lIGFycmF5LAorCWFzIGluIHRoZSBpbmRpcmVjdCByZWdpb24gY29kZSkuCisJCisJV2hlbi9pZiBibG9ja25vIGlzIGZvdW5kLCBpZiBibG9ja25vIGlzIGluc2lkZSBvZiBhIGJsb2NrIAorCXJ1biBhcyBzdG9yZWQgb24gZGlzaywgd2Ugb2Zmc2V0IHRoZSBzdGFydCBhbmQgbGVuZ2h0IG1lbWJlcnMgCisJb2YgdGhlIGJsb2NrIHJ1biwgc28gdGhhdCBibG9ja25vIGlzIHRoZSBzdGFydCBhbmQgbGVuIGlzCisJc3RpbGwgdmFsaWQgKHRoZSBydW4gZW5kcyBpbiB0aGUgc2FtZSBwbGFjZSkuCisJCisJMjAwMS0xMS0xNSBXaWxsIER5c29uCisqLworc3RhdGljIGludAorYmVmc19maW5kX2JydW5fZGlyZWN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfZGF0YV9zdHJlYW0gKiBkYXRhLAorCQkgICAgICBiZWZzX2Jsb2NrbnJfdCBibG9ja25vLCBiZWZzX2Jsb2NrX3J1biAqIHJ1bikKK3sKKwlpbnQgaTsKKwliZWZzX2Jsb2NrX3J1biAqYXJyYXkgPSBkYXRhLT5kaXJlY3Q7CisJYmVmc19ibG9ja25yX3Qgc3VtOworCWJlZnNfYmxvY2tucl90IG1heF9ibG9jayA9CisJICAgIGRhdGEtPm1heF9kaXJlY3RfcmFuZ2UgPj4gQkVGU19TQihzYiktPmJsb2NrX3NoaWZ0OworCisJYmVmc19kZWJ1ZyhzYiwgIi0tLT4gYmVmc19maW5kX2JydW5fZGlyZWN0KCksIGZpbmQgJWx1IiwgYmxvY2tubyk7CisKKwlpZiAoYmxvY2tubyA+IG1heF9ibG9jaykgeworCQliZWZzX2Vycm9yKHNiLCAiYmVmc19maW5kX2JydW5fZGlyZWN0KCkgcGFzc2VkIGJsb2NrIG91dHNpZGUgb2YiCisJCQkgICAiZGlyZWN0IHJlZ2lvbiIpOworCQlyZXR1cm4gQkVGU19FUlI7CisJfQorCisJZm9yIChpID0gMCwgc3VtID0gMDsgaSA8IEJFRlNfTlVNX0RJUkVDVF9CTE9DS1M7CisJICAgICBzdW0gKz0gYXJyYXlbaV0ubGVuLCBpKyspIHsKKwkJaWYgKGJsb2Nrbm8gPj0gc3VtICYmIGJsb2Nrbm8gPCBzdW0gKyAoYXJyYXlbaV0ubGVuKSkgeworCQkJaW50IG9mZnNldCA9IGJsb2Nrbm8gLSBzdW07CisJCQlydW4tPmFsbG9jYXRpb25fZ3JvdXAgPSBhcnJheVtpXS5hbGxvY2F0aW9uX2dyb3VwOworCQkJcnVuLT5zdGFydCA9IGFycmF5W2ldLnN0YXJ0ICsgb2Zmc2V0OworCQkJcnVuLT5sZW4gPSBhcnJheVtpXS5sZW4gLSBvZmZzZXQ7CisKKwkJCWJlZnNfZGVidWcoc2IsICItLS0+IGJlZnNfZmluZF9icnVuX2RpcmVjdCgpLCAiCisJCQkJICAgImZvdW5kICVsdSBhdCBkaXJlY3RbJWRdIiwgYmxvY2tubywgaSk7CisJCQlyZXR1cm4gQkVGU19PSzsKKwkJfQorCX0KKworCWJlZnNfZGVidWcoc2IsICItLS0+IGJlZnNfZmluZF9icnVuX2RpcmVjdCgpIEVSUk9SIik7CisJcmV0dXJuIEJFRlNfRVJSOworfQorCisvKgorCUZpbmRzIHRoZSBibG9jayBydW4gdGhhdCBzdGFydHMgYXQgZmlsZSBibG9jayBudW1iZXIgYmxvY2tubworCWluIHRoZSBmaWxlIHJlcHJlc2VudGVkIGJ5IHRoZSBkYXRhc3RyZWFtIGRhdGEsIGlmIHRoYXQgCisJYmxvY2tubyBpcyBpbiB0aGUgaW5kaXJlY3QgcmVnaW9uIG9mIHRoZSBkYXRhc3RyZWFtLgorCQorCXNiOiB0aGUgc3VwZXJibG9jaworCWRhdGE6IHRoZSBkYXRhc3RyZWFtCisJYmxvY2tubzogdGhlIGJsb2NrbnVtYmVyIHRvIGZpbmQKKwlydW46IFRoZSBmb3VuZCBydW4gaXMgcGFzc2VkIGJhY2sgdGhyb3VnaCB0aGlzIHBvaW50ZXIKKwkKKwlSZXR1cm4gdmFsdWUgaXMgQkVGU19PSyBpZiB0aGUgYmxvY2tydW4gaXMgZm91bmQsIEJFRlNfRVJSCisJb3RoZXJ3aXNlLgorCQorCUFsZ29yaXRobToKKwlGb3IgZWFjaCBibG9jayBpbiB0aGUgaW5kaXJlY3QgcnVuIG9mIHRoZSBkYXRhc3RyZWFtLCByZWFkCisJaXQgaW4gYW5kIHNlYXJjaCB0aHJvdWdoIGl0IGZvcglzZWFyY2hfYmxrLgorCQorCVhYWDoKKwlSZWFsbHkgc2hvdWxkIGNoZWNrIHRvIG1ha2Ugc3VyZSBibG9ja25vIGlzIGluc2lkZSBpbmRpcmVjdAorCXJlZ2lvbi4KKwkKKwkyMDAxLTExLTE1IFdpbGwgRHlzb24KKyovCitzdGF0aWMgaW50CitiZWZzX2ZpbmRfYnJ1bl9pbmRpcmVjdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJYmVmc19kYXRhX3N0cmVhbSAqIGRhdGEsIGJlZnNfYmxvY2tucl90IGJsb2Nrbm8sCisJCQliZWZzX2Jsb2NrX3J1biAqIHJ1bikKK3sKKwlpbnQgaSwgajsKKwliZWZzX2Jsb2NrbnJfdCBzdW0gPSAwOworCWJlZnNfYmxvY2tucl90IGluZGlyX3N0YXJ0X2JsazsKKwliZWZzX2Jsb2NrbnJfdCBzZWFyY2hfYmxrOworCXN0cnVjdCBidWZmZXJfaGVhZCAqaW5kaXJibG9jazsKKwliZWZzX2Jsb2NrX3J1biAqYXJyYXk7CisKKwliZWZzX2Jsb2NrX3J1biBpbmRpcmVjdCA9IGRhdGEtPmluZGlyZWN0OworCWJlZnNfYmxvY2tucl90IGluZGlyYmxvY2tubyA9IGlhZGRyMmJsb2Nrbm8oc2IsICZpbmRpcmVjdCk7CisJaW50IGFycmF5bGVuID0gYmVmc19pYWRkcnNfcGVyX2Jsb2NrKHNiKTsKKworCWJlZnNfZGVidWcoc2IsICItLS0+IGJlZnNfZmluZF9icnVuX2luZGlyZWN0KCksIGZpbmQgJWx1IiwgYmxvY2tubyk7CisKKwlpbmRpcl9zdGFydF9ibGsgPSBkYXRhLT5tYXhfZGlyZWN0X3JhbmdlID4+IEJFRlNfU0Ioc2IpLT5ibG9ja19zaGlmdDsKKwlzZWFyY2hfYmxrID0gYmxvY2tubyAtIGluZGlyX3N0YXJ0X2JsazsKKworCS8qIEV4YW1pbmUgYmxvY2tzIG9mIHRoZSBpbmRpcmVjdCBydW4gb25lIGF0IGEgdGltZSAqLworCWZvciAoaSA9IDA7IGkgPCBpbmRpcmVjdC5sZW47IGkrKykgeworCQlpbmRpcmJsb2NrID0gYmVmc19icmVhZChzYiwgaW5kaXJibG9ja25vICsgaSk7CisJCWlmIChpbmRpcmJsb2NrID09IE5VTEwpIHsKKwkJCWJlZnNfZGVidWcoc2IsCisJCQkJICAgIi0tLT4gYmVmc19maW5kX2JydW5faW5kaXJlY3QoKSBmYWlsZWQgdG8gIgorCQkJCSAgICJyZWFkIGRpc2sgYmxvY2sgJWx1IGZyb20gdGhlIGluZGlyZWN0IGJydW4iLAorCQkJCSAgIGluZGlyYmxvY2tubyArIGkpOworCQkJcmV0dXJuIEJFRlNfRVJSOworCQl9CisKKwkJYXJyYXkgPSAoYmVmc19ibG9ja19ydW4gKikgaW5kaXJibG9jay0+Yl9kYXRhOworCisJCWZvciAoaiA9IDA7IGogPCBhcnJheWxlbjsgKytqKSB7CisJCQlpbnQgbGVuID0gZnMxNl90b19jcHUoc2IsIGFycmF5W2pdLmxlbik7CisKKwkJCWlmIChzZWFyY2hfYmxrID49IHN1bSAmJiBzZWFyY2hfYmxrIDwgc3VtICsgbGVuKSB7CisJCQkJaW50IG9mZnNldCA9IHNlYXJjaF9ibGsgLSBzdW07CisJCQkJcnVuLT5hbGxvY2F0aW9uX2dyb3VwID0KKwkJCQkgICAgZnMzMl90b19jcHUoc2IsIGFycmF5W2pdLmFsbG9jYXRpb25fZ3JvdXApOworCQkJCXJ1bi0+c3RhcnQgPQorCQkJCSAgICBmczE2X3RvX2NwdShzYiwgYXJyYXlbal0uc3RhcnQpICsgb2Zmc2V0OworCQkJCXJ1bi0+bGVuID0KKwkJCQkgICAgZnMxNl90b19jcHUoc2IsIGFycmF5W2pdLmxlbikgLSBvZmZzZXQ7CisKKwkJCQlicmVsc2UoaW5kaXJibG9jayk7CisJCQkJYmVmc19kZWJ1ZyhzYiwKKwkJCQkJICAgIjwtLS0gYmVmc19maW5kX2JydW5faW5kaXJlY3QoKSBmb3VuZCAiCisJCQkJCSAgICJmaWxlIGJsb2NrICVsdSBhdCBpbmRpcmVjdFslZF0iLAorCQkJCQkgICBibG9ja25vLCBqICsgKGkgKiBhcnJheWxlbikpOworCQkJCXJldHVybiBCRUZTX09LOworCQkJfQorCQkJc3VtICs9IGxlbjsKKwkJfQorCisJCWJyZWxzZShpbmRpcmJsb2NrKTsKKwl9CisKKwkvKiBPbmx5IGZhbGx0aHJvdWdoIGlzIGFuIGVycm9yICovCisJYmVmc19lcnJvcihzYiwgIkJlRlM6IGJlZnNfZmluZF9icnVuX2luZGlyZWN0KCkgZmFpbGVkIHRvIGZpbmQgIgorCQkgICAiZmlsZSBibG9jayAlbHUiLCBibG9ja25vKTsKKworCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfZmluZF9icnVuX2luZGlyZWN0KCkgRVJST1IiKTsKKwlyZXR1cm4gQkVGU19FUlI7Cit9CisKKy8qCisJRmluZHMgdGhlIGJsb2NrIHJ1biB0aGF0IHN0YXJ0cyBhdCBmaWxlIGJsb2NrIG51bWJlciBibG9ja25vCisJaW4gdGhlIGZpbGUgcmVwcmVzZW50ZWQgYnkgdGhlIGRhdGFzdHJlYW0gZGF0YSwgaWYgdGhhdCAKKwlibG9ja25vIGlzIGluIHRoZSBkb3VibGUtaW5kaXJlY3QgcmVnaW9uIG9mIHRoZSBkYXRhc3RyZWFtLgorCQorCXNiOiB0aGUgc3VwZXJibG9jaworCWRhdGE6IHRoZSBkYXRhc3RyZWFtCisJYmxvY2tubzogdGhlIGJsb2NrbnVtYmVyIHRvIGZpbmQKKwlydW46IFRoZSBmb3VuZCBydW4gaXMgcGFzc2VkIGJhY2sgdGhyb3VnaCB0aGlzIHBvaW50ZXIKKwkKKwlSZXR1cm4gdmFsdWUgaXMgQkVGU19PSyBpZiB0aGUgYmxvY2tydW4gaXMgZm91bmQsIEJFRlNfRVJSCisJb3RoZXJ3aXNlLgorCQorCUFsZ29yaXRobToKKwlUaGUgYmxvY2sgcnVucyBpbiB0aGUgZG91YmxlLWluZGlyZWN0IHJlZ2lvbiBhcmUgZGlmZmVyZW50LgorCVRoZXkgYXJlIGFsd2F5cyBhbGxvY2F0ZWQgNCBmcyBibG9ja3MgYXQgYSB0aW1lLCBzbyBlYWNoCisJYmxvY2sgcnVuIG1hcHMgYSBjb25zdGFudCBhbW91bnQgb2YgZmlsZSBkYXRhLiBUaGlzIG1lYW5zCisJdGhhdCB3ZSBjYW4gZGlyZWN0bHkgY2FsY3VsYXRlIGhvdyBtYW55IGJsb2NrIHJ1bnMgaW50byB0aGUKKwlkb3VibGUtaW5kaXJlY3QgcmVnaW9uIHdlIG5lZWQgdG8gZ28gdG8gZ2V0IHRvIHRoZSBvbmUgdGhhdAorCW1hcHMgYSBwYXJ0aWN1bGFyIGZpbGVzeXN0ZW0gYmxvY2suCisJCisJV2UgZG8gdGhpcyBpbiB0d28gc3RhZ2VzLiBGaXJzdCB3ZSBjYWxjdWxhdGUgd2hpY2ggb2YgdGhlCisJaW5vZGUgYWRkcmVzc2VzIGluIHRoZSBkb3VibGUtaW5kaXJlY3QgYmxvY2sgd2lsbCBwb2ludCB1cworCXRvIHRoZSBpbmRpcmVjdCBibG9jayB0aGF0IGNvbnRhaW5zIHRoZSBtYXBwaW5nIGZvciB0aGUgZGF0YSwKKwl0aGVuIHdlIGNhbGN1bGF0ZSB3aGljaCBvZiB0aGUgaW5vZGUgYWRkcmVzc2VzIGluIHRoYXQgCisJaW5kaXJlY3QgYmxvY2sgbWFwcyB0aGUgZGF0YSBibG9jayB3ZSBhcmUgYWZ0ZXIuCisJCisJT2gsIGFuZCBvbmNlIHdlJ3ZlIGRvbmUgdGhhdCwgd2UgYWN0dWFsbHkgcmVhZCBpbiB0aGUgYmxvY2tzIAorCXRoYXQgY29udGFpbiB0aGUgaW5vZGUgYWRkcmVzc2VzIHdlIGNhbGN1bGF0ZWQgYWJvdmUuIEV2ZW4gCisJdGhvdWdoIHRoZSBkb3VibGUtaW5kaXJlY3QgcnVuIG1heSBiZSBzZXZlcmFsIGJsb2NrcyBsb25nLCAKKwl3ZSBjYW4gY2FsY3VsYXRlIHdoaWNoIG9mIHRob3NlIGJsb2NrcyB3aWxsIGNvbnRhaW4gdGhlIGluZGV4CisJd2UgYXJlIGFmdGVyIGFuZCBvbmx5IHJlYWQgdGhhdCBvbmUuIFdlIHRoZW4gZm9sbG93IGl0IHRvIAorCXRoZSBpbmRpcmVjdCBibG9jayBhbmQgcGVyZm9ybSBhICBzaW1pbGFyIHByb2Nlc3MgdG8gZmluZAorCXRoZSBhY3R1YWwgYmxvY2sgcnVuIHRoYXQgbWFwcyB0aGUgZGF0YSBibG9jayB3ZSBhcmUgaW50ZXJlc3RlZAorCWluLgorCQorCVRoZW4gd2Ugb2Zmc2V0IHRoZSBydW4gYXMgaW4gYmVmc19maW5kX2JydW5fYXJyYXkoKSBhbmQgd2UgYXJlIAorCWRvbmUuCisJCisJMjAwMS0xMS0xNSBXaWxsIER5c29uCisqLworc3RhdGljIGludAorYmVmc19maW5kX2JydW5fZGJsaW5kaXJlY3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgIGJlZnNfZGF0YV9zdHJlYW0gKiBkYXRhLCBiZWZzX2Jsb2NrbnJfdCBibG9ja25vLAorCQkJICAgYmVmc19ibG9ja19ydW4gKiBydW4pCit7CisJaW50IGRibGluZGlyX2luZHg7CisJaW50IGluZGlyX2luZHg7CisJaW50IG9mZnNldDsKKwlpbnQgZGJsX3doaWNoX2Jsb2NrOworCWludCB3aGljaF9ibG9jazsKKwlpbnQgZGJsX2Jsb2NrX2luZHg7CisJaW50IGJsb2NrX2luZHg7CisJb2ZmX3QgZGJsaW5kaXJfbGVmdG92ZXI7CisJYmVmc19ibG9ja25yX3QgYmxvY2tub19hdF9ydW5fc3RhcnQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkYmxfaW5kaXJfYmxvY2s7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICppbmRpcl9ibG9jazsKKwliZWZzX2Jsb2NrX3J1biBpbmRpcl9ydW47CisJYmVmc19pbm9kZV9hZGRyICppYWRkcl9hcnJheSA9IE5VTEw7CisJYmVmc19zYl9pbmZvICpiZWZzX3NiID0gQkVGU19TQihzYik7CisKKwliZWZzX2Jsb2NrbnJfdCBpbmRpcl9zdGFydF9ibGsgPQorCSAgICBkYXRhLT5tYXhfaW5kaXJlY3RfcmFuZ2UgPj4gYmVmc19zYi0+YmxvY2tfc2hpZnQ7CisKKwlvZmZfdCBkYmxfaW5kaXJfb2ZmID0gYmxvY2tubyAtIGluZGlyX3N0YXJ0X2JsazsKKworCS8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyBtYXBwZWQgYnkgZWFjaCBvZiB0aGUgaWFkZHJzIGluCisJICogdGhlIGluZGlyZWN0IGJsb2NrIHBvaW50ZWQgdG8gYnkgdGhlIGRvdWJsZSBpbmRpcmVjdCBibG9jaworCSAqLworCXNpemVfdCBpYmxrbGVuID0gQkVGU19EQkxJTkRJUl9CUlVOX0xFTjsKKworCS8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyBtYXBwZWQgYnkgZWFjaCBvZiB0aGUgaWFkZHJzIGluCisJICogdGhlIGRvdWJsZSBpbmRpcmVjdCBibG9jaworCSAqLworCXNpemVfdCBkaWJsa2xlbiA9IGlibGtsZW4gKiBiZWZzX2lhZGRyc19wZXJfYmxvY2soc2IpCisJICAgICogQkVGU19EQkxJTkRJUl9CUlVOX0xFTjsKKworCWJlZnNfZGVidWcoc2IsICItLS0+IGJlZnNfZmluZF9icnVuX2RibGluZGlyZWN0KCkgZmluZCAlbHUiLCBibG9ja25vKTsKKworCS8qIEZpcnN0LCBkaXNjb3ZlciB3aGljaCBvZiB0aGUgZG91YmxlX2luZGlyLT5pbmRpciBibG9ja3MKKwkgKiBjb250YWlucyBwb3MuIFRoZW4gZmlndXJlIG91dCBob3cgbXVjaCBvZiBwb3MgdGhhdAorCSAqIGFjY291bnRlZCBmb3IuIFRoZW4gZGlzY292ZXIgd2hpY2ggb2YgdGhlIGlhZGRycyBpbgorCSAqIHRoZSBpbmRpcmVjdCBibG9jayBjb250YWlucyBwb3MuCisJICovCisKKwlkYmxpbmRpcl9pbmR4ID0gZGJsX2luZGlyX29mZiAvIGRpYmxrbGVuOworCWRibGluZGlyX2xlZnRvdmVyID0gZGJsX2luZGlyX29mZiAlIGRpYmxrbGVuOworCWluZGlyX2luZHggPSBkYmxpbmRpcl9sZWZ0b3ZlciAvIGRpYmxrbGVuOworCisJLyogUmVhZCBkb3VibGUgaW5kaXJlY3QgYmxvY2sgKi8KKwlkYmxfd2hpY2hfYmxvY2sgPSBkYmxpbmRpcl9pbmR4IC8gYmVmc19pYWRkcnNfcGVyX2Jsb2NrKHNiKTsKKwlpZiAoZGJsX3doaWNoX2Jsb2NrID4gZGF0YS0+ZG91YmxlX2luZGlyZWN0LmxlbikgeworCQliZWZzX2Vycm9yKHNiLCAiVGhlIGRvdWJsZS1pbmRpcmVjdCBpbmRleCBjYWxjdWxhdGVkIGJ5ICIKKwkJCSAgICJiZWZzX3JlYWRfYnJ1bl9kYmxpbmRpcmVjdCgpLCAlZCwgaXMgb3V0c2lkZSB0aGUgcmFuZ2UgIgorCQkJICAgIm9mIHRoZSBkb3VibGUtaW5kaXJlY3QgYmxvY2siLCBkYmxpbmRpcl9pbmR4KTsKKwkJcmV0dXJuIEJFRlNfRVJSOworCX0KKworCWRibF9pbmRpcl9ibG9jayA9CisJICAgIGJlZnNfYnJlYWQoc2IsIGlhZGRyMmJsb2Nrbm8oc2IsICZkYXRhLT5kb3VibGVfaW5kaXJlY3QpICsKKwkJCQkJZGJsX3doaWNoX2Jsb2NrKTsKKwlpZiAoZGJsX2luZGlyX2Jsb2NrID09IE5VTEwpIHsKKwkJYmVmc19lcnJvcihzYiwgImJlZnNfcmVhZF9icnVuX2RibGluZGlyZWN0KCkgY291bGRuJ3QgcmVhZCB0aGUgIgorCQkJICAgImRvdWJsZS1pbmRpcmVjdCBibG9jayBhdCBibG9ja25vICVsdSIsCisJCQkgICBpYWRkcjJibG9ja25vKHNiLAorCQkJCQkgJmRhdGEtPmRvdWJsZV9pbmRpcmVjdCkgKworCQkJICAgZGJsX3doaWNoX2Jsb2NrKTsKKwkJYnJlbHNlKGRibF9pbmRpcl9ibG9jayk7CisJCXJldHVybiBCRUZTX0VSUjsKKwl9CisKKwlkYmxfYmxvY2tfaW5keCA9CisJICAgIGRibGluZGlyX2luZHggLSAoZGJsX3doaWNoX2Jsb2NrICogYmVmc19pYWRkcnNfcGVyX2Jsb2NrKHNiKSk7CisJaWFkZHJfYXJyYXkgPSAoYmVmc19pbm9kZV9hZGRyICopIGRibF9pbmRpcl9ibG9jay0+Yl9kYXRhOworCWluZGlyX3J1biA9IGZzcnVuX3RvX2NwdShzYiwgaWFkZHJfYXJyYXlbZGJsX2Jsb2NrX2luZHhdKTsKKwlicmVsc2UoZGJsX2luZGlyX2Jsb2NrKTsKKwlpYWRkcl9hcnJheSA9IE5VTEw7CisKKwkvKiBSZWFkIGluZGlyZWN0IGJsb2NrICovCisJd2hpY2hfYmxvY2sgPSBpbmRpcl9pbmR4IC8gYmVmc19pYWRkcnNfcGVyX2Jsb2NrKHNiKTsKKwlpZiAod2hpY2hfYmxvY2sgPiBpbmRpcl9ydW4ubGVuKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJUaGUgaW5kaXJlY3QgaW5kZXggY2FsY3VsYXRlZCBieSAiCisJCQkgICAiYmVmc19yZWFkX2JydW5fZGJsaW5kaXJlY3QoKSwgJWQsIGlzIG91dHNpZGUgdGhlIHJhbmdlICIKKwkJCSAgICJvZiB0aGUgaW5kaXJlY3QgYmxvY2siLCBpbmRpcl9pbmR4KTsKKwkJcmV0dXJuIEJFRlNfRVJSOworCX0KKworCWluZGlyX2Jsb2NrID0KKwkgICAgYmVmc19icmVhZChzYiwgaWFkZHIyYmxvY2tubyhzYiwgJmluZGlyX3J1bikgKyB3aGljaF9ibG9jayk7CisJaWYgKGluZGlyX2Jsb2NrID09IE5VTEwpIHsKKwkJYmVmc19lcnJvcihzYiwgImJlZnNfcmVhZF9icnVuX2RibGluZGlyZWN0KCkgY291bGRuJ3QgcmVhZCB0aGUgIgorCQkJICAgImluZGlyZWN0IGJsb2NrIGF0IGJsb2Nrbm8gJWx1IiwKKwkJCSAgIGlhZGRyMmJsb2Nrbm8oc2IsICZpbmRpcl9ydW4pICsgd2hpY2hfYmxvY2spOworCQlicmVsc2UoaW5kaXJfYmxvY2spOworCQlyZXR1cm4gQkVGU19FUlI7CisJfQorCisJYmxvY2tfaW5keCA9IGluZGlyX2luZHggLSAod2hpY2hfYmxvY2sgKiBiZWZzX2lhZGRyc19wZXJfYmxvY2soc2IpKTsKKwlpYWRkcl9hcnJheSA9IChiZWZzX2lub2RlX2FkZHIgKikgaW5kaXJfYmxvY2stPmJfZGF0YTsKKwkqcnVuID0gZnNydW5fdG9fY3B1KHNiLCBpYWRkcl9hcnJheVtibG9ja19pbmR4XSk7CisJYnJlbHNlKGluZGlyX2Jsb2NrKTsKKwlpYWRkcl9hcnJheSA9IE5VTEw7CisKKwlibG9ja25vX2F0X3J1bl9zdGFydCA9IGluZGlyX3N0YXJ0X2JsazsKKwlibG9ja25vX2F0X3J1bl9zdGFydCArPSBkaWJsa2xlbiAqIGRibGluZGlyX2luZHg7CisJYmxvY2tub19hdF9ydW5fc3RhcnQgKz0gaWJsa2xlbiAqIGluZGlyX2luZHg7CisJb2Zmc2V0ID0gYmxvY2tubyAtIGJsb2Nrbm9fYXRfcnVuX3N0YXJ0OworCisJcnVuLT5zdGFydCArPSBvZmZzZXQ7CisJcnVuLT5sZW4gLT0gb2Zmc2V0OworCisJYmVmc19kZWJ1ZyhzYiwgIkZvdW5kIGZpbGUgYmxvY2sgJWx1IGluIGRvdWJsZV9pbmRpcmVjdFslZF1bJWRdLCIKKwkJICAgIiBkb3VibGVfaW5kaXJlY3RfbGVmdG92ZXIgPSAlbHUiLAorCQkgICBibG9ja25vLCBkYmxpbmRpcl9pbmR4LCBpbmRpcl9pbmR4LCBkYmxpbmRpcl9sZWZ0b3Zlcik7CisKKwlyZXR1cm4gQkVGU19PSzsKK30KZGlmZiAtLWdpdCBhL2ZzL2JlZnMvZGF0YXN0cmVhbS5oIGIvZnMvYmVmcy9kYXRhc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlOGEzYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvZGF0YXN0cmVhbS5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBkYXRhc3RyZWFtLmgKKyAqCisgKi8KKworc3RydWN0IGJ1ZmZlcl9oZWFkICpiZWZzX3JlYWRfZGF0YXN0cmVhbShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCQkgYmVmc19kYXRhX3N0cmVhbSAqIGRzLCBiZWZzX29mZl90IHBvcywKKwkJCQkJIHVpbnQgKiBvZmYpOworCitpbnQgYmVmc19mYmxvY2syYnJ1bihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2RhdGFfc3RyZWFtICogZGF0YSwKKwkJICAgICBiZWZzX2Jsb2NrbnJfdCBmYmxvY2ssIGJlZnNfYmxvY2tfcnVuICogcnVuKTsKKworc2l6ZV90IGJlZnNfcmVhZF9sc3ltbGluayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2RhdGFfc3RyZWFtICogZGF0YSwKKwkJCSAgdm9pZCAqYnVmZiwgYmVmc19vZmZfdCBsZW4pOworCitiZWZzX2Jsb2NrbnJfdCBiZWZzX2NvdW50X2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2RhdGFfc3RyZWFtICogZHMpOworCitleHRlcm4gY29uc3QgYmVmc19pbm9kZV9hZGRyIEJBRF9JQUREUjsKKwpkaWZmIC0tZ2l0IGEvZnMvYmVmcy9kZWJ1Zy5jIGIvZnMvYmVmcy9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NWNjMGEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iZWZzL2RlYnVnLmMKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiAgbGludXgvZnMvYmVmcy9kZWJ1Zy5jCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMSBXaWxsIER5c29uICh3aWxsX2R5c29uIGF0IHBvYm94LmNvbSkKKyAqCisgKiBXaXRoIGhlbHAgZnJvbSB0aGUgbnRmcy10bmcgZHJpdmVyIGJ5IEFudG9uIEFsdHBhcm1ha292CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5ICBNYWtvdG8gS2F0byAobV9rYXRvQGdhMi5zby1uZXQubmUuanApCisgKgorICogZGVidWcgZnVuY3Rpb25zCisgKi8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworI2VuZGlmCQkJCS8qIF9fS0VSTkVMX18gKi8KKworI2luY2x1ZGUgImJlZnMuaCIKKyNpbmNsdWRlICJlbmRpYW4uaCIKKworI2RlZmluZSBFUlJCVUZTSVpFIDEwMjQKKwordm9pZAorYmVmc19lcnJvcihjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJY2hhciAqZXJyX2J1ZiA9IChjaGFyICopIGttYWxsb2MoRVJSQlVGU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGVycl9idWYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImNvdWxkIG5vdCBhbGxvY2F0ZSAlZCBieXRlc1xuIiwgRVJSQlVGU0laRSk7CisJCXJldHVybjsKKwl9CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzbnByaW50ZihlcnJfYnVmLCBFUlJCVUZTSVpFLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCXByaW50ayhLRVJOX0VSUiAiQmVGUyglcyk6ICVzXG4iLCBzYi0+c19pZCwgZXJyX2J1Zik7CisJa2ZyZWUoZXJyX2J1Zik7Cit9CisKK3ZvaWQKK2JlZnNfd2FybmluZyhjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJY2hhciAqZXJyX2J1ZiA9IChjaGFyICopIGttYWxsb2MoRVJSQlVGU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGVycl9idWYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImNvdWxkIG5vdCBhbGxvY2F0ZSAlZCBieXRlc1xuIiwgRVJSQlVGU0laRSk7CisJCXJldHVybjsKKwl9CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzbnByaW50ZihlcnJfYnVmLCBFUlJCVUZTSVpFLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIkJlRlMoJXMpOiAlc1xuIiwgc2ItPnNfaWQsIGVycl9idWYpOworCisJa2ZyZWUoZXJyX2J1Zik7Cit9CisKK3ZvaWQKK2JlZnNfZGVidWcoY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisjaWZkZWYgQ09ORklHX0JFRlNfREVCVUcKKworCXZhX2xpc3QgYXJnczsKKwljaGFyICplcnJfYnVmID0gTlVMTDsKKworCWlmIChCRUZTX1NCKHNiKS0+bW91bnRfb3B0cy5kZWJ1ZykgeworCQllcnJfYnVmID0gKGNoYXIgKikga21hbGxvYyhFUlJCVUZTSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGVycl9idWYgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJjb3VsZCBub3QgYWxsb2NhdGUgJWQgYnl0ZXNcbiIsCisJCQkJRVJSQlVGU0laRSk7CisJCQlyZXR1cm47CisJCX0KKworCQl2YV9zdGFydChhcmdzLCBmbXQpOworCQl2c25wcmludGYoZXJyX2J1ZiwgRVJSQlVGU0laRSwgZm10LCBhcmdzKTsKKwkJdmFfZW5kKGFyZ3MpOworCisJCXByaW50ayhLRVJOX0RFQlVHICJCZUZTKCVzKTogJXNcbiIsIHNiLT5zX2lkLCBlcnJfYnVmKTsKKworCQlrZnJlZShlcnJfYnVmKTsKKwl9CisKKyNlbmRpZgkJCQkvL0NPTkZJR19CRUZTX0RFQlVHCit9CisKK3ZvaWQKK2JlZnNfZHVtcF9pbm9kZShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2lub2RlICogaW5vZGUpCit7CisjaWZkZWYgQ09ORklHX0JFRlNfREVCVUcKKworCWJlZnNfYmxvY2tfcnVuIHRtcF9ydW47CisKKwliZWZzX2RlYnVnKHNiLCAiYmVmc19pbm9kZSBpbmZvcm1hdGlvbiIpOworCisJYmVmc19kZWJ1ZyhzYiwgIiAgbWFnaWMxICUwOHgiLCBmczMyX3RvX2NwdShzYiwgaW5vZGUtPm1hZ2ljMSkpOworCisJdG1wX3J1biA9IGZzcnVuX3RvX2NwdShzYiwgaW5vZGUtPmlub2RlX251bSk7CisJYmVmc19kZWJ1ZyhzYiwgIiAgaW5vZGVfbnVtICV1LCAlaHUsICVodSIsCisJCSAgIHRtcF9ydW4uYWxsb2NhdGlvbl9ncm91cCwgdG1wX3J1bi5zdGFydCwgdG1wX3J1bi5sZW4pOworCisJYmVmc19kZWJ1ZyhzYiwgIiAgdWlkICV1IiwgZnMzMl90b19jcHUoc2IsIGlub2RlLT51aWQpKTsKKwliZWZzX2RlYnVnKHNiLCAiICBnaWQgJXUiLCBmczMyX3RvX2NwdShzYiwgaW5vZGUtPmdpZCkpOworCWJlZnNfZGVidWcoc2IsICIgIG1vZGUgJTA4eCIsIGZzMzJfdG9fY3B1KHNiLCBpbm9kZS0+bW9kZSkpOworCWJlZnNfZGVidWcoc2IsICIgIGZsYWdzICUwOHgiLCBmczMyX3RvX2NwdShzYiwgaW5vZGUtPmZsYWdzKSk7CisJYmVmc19kZWJ1ZyhzYiwgIiAgY3JlYXRlX3RpbWUgJUx1IiwKKwkJICAgZnM2NF90b19jcHUoc2IsIGlub2RlLT5jcmVhdGVfdGltZSkpOworCWJlZnNfZGVidWcoc2IsICIgIGxhc3RfbW9kaWZpZWRfdGltZSAlTHUiLAorCQkgICBmczY0X3RvX2NwdShzYiwgaW5vZGUtPmxhc3RfbW9kaWZpZWRfdGltZSkpOworCisJdG1wX3J1biA9IGZzcnVuX3RvX2NwdShzYiwgaW5vZGUtPnBhcmVudCk7CisJYmVmc19kZWJ1ZyhzYiwgIiAgcGFyZW50IFsldSwgJWh1LCAlaHVdIiwKKwkJICAgdG1wX3J1bi5hbGxvY2F0aW9uX2dyb3VwLCB0bXBfcnVuLnN0YXJ0LCB0bXBfcnVuLmxlbik7CisKKwl0bXBfcnVuID0gZnNydW5fdG9fY3B1KHNiLCBpbm9kZS0+YXR0cmlidXRlcyk7CisJYmVmc19kZWJ1ZyhzYiwgIiAgYXR0cmlidXRlcyBbJXUsICVodSwgJWh1XSIsCisJCSAgIHRtcF9ydW4uYWxsb2NhdGlvbl9ncm91cCwgdG1wX3J1bi5zdGFydCwgdG1wX3J1bi5sZW4pOworCisJYmVmc19kZWJ1ZyhzYiwgIiAgdHlwZSAlMDh4IiwgZnMzMl90b19jcHUoc2IsIGlub2RlLT50eXBlKSk7CisJYmVmc19kZWJ1ZyhzYiwgIiAgaW5vZGVfc2l6ZSAldSIsIGZzMzJfdG9fY3B1KHNiLCBpbm9kZS0+aW5vZGVfc2l6ZSkpOworCisJaWYgKFNfSVNMTksoaW5vZGUtPm1vZGUpKSB7CisJCWJlZnNfZGVidWcoc2IsICIgIFN5bWJvbGljIGxpbmsgWyVzXSIsIGlub2RlLT5kYXRhLnN5bWxpbmspOworCX0gZWxzZSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBCRUZTX05VTV9ESVJFQ1RfQkxPQ0tTOyBpKyspIHsKKwkJCXRtcF9ydW4gPQorCQkJICAgIGZzcnVuX3RvX2NwdShzYiwgaW5vZGUtPmRhdGEuZGF0YXN0cmVhbS5kaXJlY3RbaV0pOworCQkJYmVmc19kZWJ1ZyhzYiwgIiAgZGlyZWN0ICVkIFsldSwgJWh1LCAlaHVdIiwgaSwKKwkJCQkgICB0bXBfcnVuLmFsbG9jYXRpb25fZ3JvdXAsIHRtcF9ydW4uc3RhcnQsCisJCQkJICAgdG1wX3J1bi5sZW4pOworCQl9CisJCWJlZnNfZGVidWcoc2IsICIgIG1heF9kaXJlY3RfcmFuZ2UgJUx1IiwKKwkJCSAgIGZzNjRfdG9fY3B1KHNiLAorCQkJCSAgICAgICBpbm9kZS0+ZGF0YS5kYXRhc3RyZWFtLgorCQkJCSAgICAgICBtYXhfZGlyZWN0X3JhbmdlKSk7CisKKwkJdG1wX3J1biA9IGZzcnVuX3RvX2NwdShzYiwgaW5vZGUtPmRhdGEuZGF0YXN0cmVhbS5pbmRpcmVjdCk7CisJCWJlZnNfZGVidWcoc2IsICIgIGluZGlyZWN0IFsldSwgJWh1LCAlaHVdIiwKKwkJCSAgIHRtcF9ydW4uYWxsb2NhdGlvbl9ncm91cCwKKwkJCSAgIHRtcF9ydW4uc3RhcnQsIHRtcF9ydW4ubGVuKTsKKworCQliZWZzX2RlYnVnKHNiLCAiICBtYXhfaW5kaXJlY3RfcmFuZ2UgJUx1IiwKKwkJCSAgIGZzNjRfdG9fY3B1KHNiLAorCQkJCSAgICAgICBpbm9kZS0+ZGF0YS5kYXRhc3RyZWFtLgorCQkJCSAgICAgICBtYXhfaW5kaXJlY3RfcmFuZ2UpKTsKKworCQl0bXBfcnVuID0KKwkJICAgIGZzcnVuX3RvX2NwdShzYiwgaW5vZGUtPmRhdGEuZGF0YXN0cmVhbS5kb3VibGVfaW5kaXJlY3QpOworCQliZWZzX2RlYnVnKHNiLCAiICBkb3VibGUgaW5kaXJlY3QgWyV1LCAlaHUsICVodV0iLAorCQkJICAgdG1wX3J1bi5hbGxvY2F0aW9uX2dyb3VwLCB0bXBfcnVuLnN0YXJ0LAorCQkJICAgdG1wX3J1bi5sZW4pOworCisJCWJlZnNfZGVidWcoc2IsICIgIG1heF9kb3VibGVfaW5kaXJlY3RfcmFuZ2UgJUx1IiwKKwkJCSAgIGZzNjRfdG9fY3B1KHNiLAorCQkJCSAgICAgICBpbm9kZS0+ZGF0YS5kYXRhc3RyZWFtLgorCQkJCSAgICAgICBtYXhfZG91YmxlX2luZGlyZWN0X3JhbmdlKSk7CisKKwkJYmVmc19kZWJ1ZyhzYiwgIiAgc2l6ZSAlTHUiLAorCQkJICAgZnM2NF90b19jcHUoc2IsIGlub2RlLT5kYXRhLmRhdGFzdHJlYW0uc2l6ZSkpOworCX0KKworI2VuZGlmCQkJCS8vQ09ORklHX0JFRlNfREVCVUcKK30KKworLyoKKyAqIERpc3BsYXkgc3VwZXIgYmxvY2sgc3RydWN0dXJlIGZvciBkZWJ1Zy4KKyAqLworCit2b2lkCitiZWZzX2R1bXBfc3VwZXJfYmxvY2soY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19zdXBlcl9ibG9jayAqIHN1cCkKK3sKKyNpZmRlZiBDT05GSUdfQkVGU19ERUJVRworCisJYmVmc19ibG9ja19ydW4gdG1wX3J1bjsKKworCWJlZnNfZGVidWcoc2IsICJiZWZzX3N1cGVyX2Jsb2NrIGluZm9ybWF0aW9uIik7CisKKwliZWZzX2RlYnVnKHNiLCAiICBuYW1lICVzIiwgc3VwLT5uYW1lKTsKKwliZWZzX2RlYnVnKHNiLCAiICBtYWdpYzEgJTA4eCIsIGZzMzJfdG9fY3B1KHNiLCBzdXAtPm1hZ2ljMSkpOworCWJlZnNfZGVidWcoc2IsICIgIGZzX2J5dGVfb3JkZXIgJTA4eCIsCisJCSAgIGZzMzJfdG9fY3B1KHNiLCBzdXAtPmZzX2J5dGVfb3JkZXIpKTsKKworCWJlZnNfZGVidWcoc2IsICIgIGJsb2NrX3NpemUgJXUiLCBmczMyX3RvX2NwdShzYiwgc3VwLT5ibG9ja19zaXplKSk7CisJYmVmc19kZWJ1ZyhzYiwgIiAgYmxvY2tfc2hpZnQgJXUiLCBmczMyX3RvX2NwdShzYiwgc3VwLT5ibG9ja19zaGlmdCkpOworCisJYmVmc19kZWJ1ZyhzYiwgIiAgbnVtX2Jsb2NrcyAlTHUiLCBmczY0X3RvX2NwdShzYiwgc3VwLT5udW1fYmxvY2tzKSk7CisJYmVmc19kZWJ1ZyhzYiwgIiAgdXNlZF9ibG9ja3MgJUx1IiwgZnM2NF90b19jcHUoc2IsIHN1cC0+dXNlZF9ibG9ja3MpKTsKKworCWJlZnNfZGVidWcoc2IsICIgIG1hZ2ljMiAlMDh4IiwgZnMzMl90b19jcHUoc2IsIHN1cC0+bWFnaWMyKSk7CisJYmVmc19kZWJ1ZyhzYiwgIiAgYmxvY2tzX3Blcl9hZyAldSIsCisJCSAgIGZzMzJfdG9fY3B1KHNiLCBzdXAtPmJsb2Nrc19wZXJfYWcpKTsKKwliZWZzX2RlYnVnKHNiLCAiICBhZ19zaGlmdCAldSIsIGZzMzJfdG9fY3B1KHNiLCBzdXAtPmFnX3NoaWZ0KSk7CisJYmVmc19kZWJ1ZyhzYiwgIiAgbnVtX2FncyAldSIsIGZzMzJfdG9fY3B1KHNiLCBzdXAtPm51bV9hZ3MpKTsKKworCWJlZnNfZGVidWcoc2IsICIgIGZsYWdzICUwOHgiLCBmczMyX3RvX2NwdShzYiwgc3VwLT5mbGFncykpOworCisJdG1wX3J1biA9IGZzcnVuX3RvX2NwdShzYiwgc3VwLT5sb2dfYmxvY2tzKTsKKwliZWZzX2RlYnVnKHNiLCAiICBsb2dfYmxvY2tzICV1LCAlaHUsICVodSIsCisJCSAgIHRtcF9ydW4uYWxsb2NhdGlvbl9ncm91cCwgdG1wX3J1bi5zdGFydCwgdG1wX3J1bi5sZW4pOworCisJYmVmc19kZWJ1ZyhzYiwgIiAgbG9nX3N0YXJ0ICVMZCIsIGZzNjRfdG9fY3B1KHNiLCBzdXAtPmxvZ19zdGFydCkpOworCWJlZnNfZGVidWcoc2IsICIgIGxvZ19lbmQgJUxkIiwgZnM2NF90b19jcHUoc2IsIHN1cC0+bG9nX2VuZCkpOworCisJYmVmc19kZWJ1ZyhzYiwgIiAgbWFnaWMzICUwOHgiLCBmczMyX3RvX2NwdShzYiwgc3VwLT5tYWdpYzMpKTsKKworCXRtcF9ydW4gPSBmc3J1bl90b19jcHUoc2IsIHN1cC0+cm9vdF9kaXIpOworCWJlZnNfZGVidWcoc2IsICIgIHJvb3RfZGlyICV1LCAlaHUsICVodSIsCisJCSAgIHRtcF9ydW4uYWxsb2NhdGlvbl9ncm91cCwgdG1wX3J1bi5zdGFydCwgdG1wX3J1bi5sZW4pOworCisJdG1wX3J1biA9IGZzcnVuX3RvX2NwdShzYiwgc3VwLT5pbmRpY2VzKTsKKwliZWZzX2RlYnVnKHNiLCAiICBpbmRpY2VzICV1LCAlaHUsICVodSIsCisJCSAgIHRtcF9ydW4uYWxsb2NhdGlvbl9ncm91cCwgdG1wX3J1bi5zdGFydCwgdG1wX3J1bi5sZW4pOworCisjZW5kaWYJCQkJLy9DT05GSUdfQkVGU19ERUJVRworfQorCisjaWYgMAorLyogdW51c2VkICovCit2b2lkCitiZWZzX2R1bXBfc21hbGxfZGF0YShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX3NtYWxsX2RhdGEgKiBzZCkKK3sKK30KKworLyogdW51c2VkICovCit2b2lkCitiZWZzX2R1bXBfcnVuKGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfYmxvY2tfcnVuIHJ1bikKK3sKKyNpZmRlZiBDT05GSUdfQkVGU19ERUJVRworCisJcnVuID0gZnNydW5fdG9fY3B1KHNiLCBydW4pOworCisJYmVmc19kZWJ1ZyhzYiwgIlsldSwgJWh1LCAlaHVdIiwKKwkJICAgcnVuLmFsbG9jYXRpb25fZ3JvdXAsIHJ1bi5zdGFydCwgcnVuLmxlbik7CisKKyNlbmRpZgkJCQkvL0NPTkZJR19CRUZTX0RFQlVHCit9CisjZW5kaWYgIC8qICAwICAqLworCit2b2lkCitiZWZzX2R1bXBfaW5kZXhfZW50cnkoY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19idHJlZV9zdXBlciAqIHN1cGVyKQoreworI2lmZGVmIENPTkZJR19CRUZTX0RFQlVHCisKKwliZWZzX2RlYnVnKHNiLCAiQnRyZWUgc3VwZXIgc3RydWN0dXJlIik7CisJYmVmc19kZWJ1ZyhzYiwgIiAgbWFnaWMgJTA4eCIsIGZzMzJfdG9fY3B1KHNiLCBzdXBlci0+bWFnaWMpKTsKKwliZWZzX2RlYnVnKHNiLCAiICBub2RlX3NpemUgJXUiLCBmczMyX3RvX2NwdShzYiwgc3VwZXItPm5vZGVfc2l6ZSkpOworCWJlZnNfZGVidWcoc2IsICIgIG1heF9kZXB0aCAlMDh4IiwgZnMzMl90b19jcHUoc2IsIHN1cGVyLT5tYXhfZGVwdGgpKTsKKworCWJlZnNfZGVidWcoc2IsICIgIGRhdGFfdHlwZSAlMDh4IiwgZnMzMl90b19jcHUoc2IsIHN1cGVyLT5kYXRhX3R5cGUpKTsKKwliZWZzX2RlYnVnKHNiLCAiICByb290X25vZGVfcG9pbnRlciAlMDE2TFgiLAorCQkgICBmczY0X3RvX2NwdShzYiwgc3VwZXItPnJvb3Rfbm9kZV9wdHIpKTsKKwliZWZzX2RlYnVnKHNiLCAiICBmcmVlX25vZGVfcG9pbnRlciAlMDE2TFgiLAorCQkgICBmczY0X3RvX2NwdShzYiwgc3VwZXItPmZyZWVfbm9kZV9wdHIpKTsKKwliZWZzX2RlYnVnKHNiLCAiICBtYXhpbXVtIHNpemUgJTAxNkxYIiwKKwkJICAgZnM2NF90b19jcHUoc2IsIHN1cGVyLT5tYXhfc2l6ZSkpOworCisjZW5kaWYJCQkJLy9DT05GSUdfQkVGU19ERUJVRworfQorCit2b2lkCitiZWZzX2R1bXBfaW5kZXhfbm9kZShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2J0cmVlX25vZGVoZWFkICogbm9kZSkKK3sKKyNpZmRlZiBDT05GSUdfQkVGU19ERUJVRworCisJYmVmc19kZWJ1ZyhzYiwgIkJ0cmVlIG5vZGUgc3RydWN0dXJlIik7CisJYmVmc19kZWJ1ZyhzYiwgIiAgbGVmdCAlMDE2TFgiLCBmczY0X3RvX2NwdShzYiwgbm9kZS0+bGVmdCkpOworCWJlZnNfZGVidWcoc2IsICIgIHJpZ2h0ICUwMTZMWCIsIGZzNjRfdG9fY3B1KHNiLCBub2RlLT5yaWdodCkpOworCWJlZnNfZGVidWcoc2IsICIgIG92ZXJmbG93ICUwMTZMWCIsIGZzNjRfdG9fY3B1KHNiLCBub2RlLT5vdmVyZmxvdykpOworCWJlZnNfZGVidWcoc2IsICIgIGFsbF9rZXlfY291bnQgJWh1IiwKKwkJICAgZnMxNl90b19jcHUoc2IsIG5vZGUtPmFsbF9rZXlfY291bnQpKTsKKwliZWZzX2RlYnVnKHNiLCAiICBhbGxfa2V5X2xlbmd0aCAlaHUiLAorCQkgICBmczE2X3RvX2NwdShzYiwgbm9kZS0+YWxsX2tleV9sZW5ndGgpKTsKKworI2VuZGlmCQkJCS8vQ09ORklHX0JFRlNfREVCVUcKK30KZGlmZiAtLWdpdCBhL2ZzL2JlZnMvZW5kaWFuLmggYi9mcy9iZWZzL2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllY2FlYTQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iZWZzL2VuZGlhbi5oCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogbGludXgvZnMvYmVmcy9lbmRpYW4uaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBXaWxsIER5c29uIDx3aWxsX2R5c29uQHBvYm94LmNvbT4KKyAqCisgKiBQYXJ0aWFsbHkgYmFzZWQgb24gc2ltaWxhciBmdW50aW9ucyBpbiB0aGUgc3lzdiBkcml2ZXIuCisgKi8KKworI2lmbmRlZiBMSU5VWF9CRUZTX0VORElBTgorI2RlZmluZSBMSU5VWF9CRUZTX0VORElBTgorCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaD4KKyNpbmNsdWRlICJiZWZzLmgiCisKK3N0YXRpYyBpbmxpbmUgdTY0CitmczY0X3RvX2NwdShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1NjQgbikKK3sKKwlpZiAoQkVGU19TQihzYiktPmJ5dGVfb3JkZXIgPT0gQkVGU19CWVRFU0VYX0xFKQorCQlyZXR1cm4gbGU2NF90b19jcHUobik7CisJZWxzZQorCQlyZXR1cm4gYmU2NF90b19jcHUobik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0CitjcHVfdG9fZnM2NChjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1NjQgbikKK3sKKwlpZiAoQkVGU19TQihzYiktPmJ5dGVfb3JkZXIgPT0gQkVGU19CWVRFU0VYX0xFKQorCQlyZXR1cm4gY3B1X3RvX2xlNjQobik7CisJZWxzZQorCQlyZXR1cm4gY3B1X3RvX2JlNjQobik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitmczMyX3RvX2NwdShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MzIgbikKK3sKKwlpZiAoQkVGU19TQihzYiktPmJ5dGVfb3JkZXIgPT0gQkVGU19CWVRFU0VYX0xFKQorCQlyZXR1cm4gbGUzMl90b19jcHUobik7CisJZWxzZQorCQlyZXR1cm4gYmUzMl90b19jcHUobik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitjcHVfdG9fZnMzMihjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MzIgbikKK3sKKwlpZiAoQkVGU19TQihzYiktPmJ5dGVfb3JkZXIgPT0gQkVGU19CWVRFU0VYX0xFKQorCQlyZXR1cm4gY3B1X3RvX2xlMzIobik7CisJZWxzZQorCQlyZXR1cm4gY3B1X3RvX2JlMzIobik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2CitmczE2X3RvX2NwdShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MTYgbikKK3sKKwlpZiAoQkVGU19TQihzYiktPmJ5dGVfb3JkZXIgPT0gQkVGU19CWVRFU0VYX0xFKQorCQlyZXR1cm4gbGUxNl90b19jcHUobik7CisJZWxzZQorCQlyZXR1cm4gYmUxNl90b19jcHUobik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2CitjcHVfdG9fZnMxNihjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MTYgbikKK3sKKwlpZiAoQkVGU19TQihzYiktPmJ5dGVfb3JkZXIgPT0gQkVGU19CWVRFU0VYX0xFKQorCQlyZXR1cm4gY3B1X3RvX2xlMTYobik7CisJZWxzZQorCQlyZXR1cm4gY3B1X3RvX2JlMTYobik7Cit9CisKKy8qIENvbXBvc2l0ZSB0eXBlcyBiZWxvdyBoZXJlICovCisKK3N0YXRpYyBpbmxpbmUgYmVmc19ibG9ja19ydW4KK2ZzcnVuX3RvX2NwdShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2Jsb2NrX3J1biBuKQoreworCWJlZnNfYmxvY2tfcnVuIHJ1bjsKKworCWlmIChCRUZTX1NCKHNiKS0+Ynl0ZV9vcmRlciA9PSBCRUZTX0JZVEVTRVhfTEUpIHsKKwkJcnVuLmFsbG9jYXRpb25fZ3JvdXAgPSBsZTMyX3RvX2NwdShuLmFsbG9jYXRpb25fZ3JvdXApOworCQlydW4uc3RhcnQgPSBsZTE2X3RvX2NwdShuLnN0YXJ0KTsKKwkJcnVuLmxlbiA9IGxlMTZfdG9fY3B1KG4ubGVuKTsKKwl9IGVsc2UgeworCQlydW4uYWxsb2NhdGlvbl9ncm91cCA9IGJlMzJfdG9fY3B1KG4uYWxsb2NhdGlvbl9ncm91cCk7CisJCXJ1bi5zdGFydCA9IGJlMTZfdG9fY3B1KG4uc3RhcnQpOworCQlydW4ubGVuID0gYmUxNl90b19jcHUobi5sZW4pOworCX0KKwlyZXR1cm4gcnVuOworfQorCitzdGF0aWMgaW5saW5lIGJlZnNfYmxvY2tfcnVuCitjcHVfdG9fZnNydW4oY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19ibG9ja19ydW4gbikKK3sKKwliZWZzX2Jsb2NrX3J1biBydW47CisKKwlpZiAoQkVGU19TQihzYiktPmJ5dGVfb3JkZXIgPT0gQkVGU19CWVRFU0VYX0xFKSB7CisJCXJ1bi5hbGxvY2F0aW9uX2dyb3VwID0gY3B1X3RvX2xlMzIobi5hbGxvY2F0aW9uX2dyb3VwKTsKKwkJcnVuLnN0YXJ0ID0gY3B1X3RvX2xlMTYobi5zdGFydCk7CisJCXJ1bi5sZW4gPSBjcHVfdG9fbGUxNihuLmxlbik7CisJfSBlbHNlIHsKKwkJcnVuLmFsbG9jYXRpb25fZ3JvdXAgPSBjcHVfdG9fYmUzMihuLmFsbG9jYXRpb25fZ3JvdXApOworCQlydW4uc3RhcnQgPSBjcHVfdG9fYmUxNihuLnN0YXJ0KTsKKwkJcnVuLmxlbiA9IGNwdV90b19iZTE2KG4ubGVuKTsKKwl9CisJcmV0dXJuIHJ1bjsKK30KKworc3RhdGljIGlubGluZSBiZWZzX2RhdGFfc3RyZWFtCitmc2RzX3RvX2NwdShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2RhdGFfc3RyZWFtIG4pCit7CisJYmVmc19kYXRhX3N0cmVhbSBkYXRhOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEJFRlNfTlVNX0RJUkVDVF9CTE9DS1M7ICsraSkKKwkJZGF0YS5kaXJlY3RbaV0gPSBmc3J1bl90b19jcHUoc2IsIG4uZGlyZWN0W2ldKTsKKworCWRhdGEubWF4X2RpcmVjdF9yYW5nZSA9IGZzNjRfdG9fY3B1KHNiLCBuLm1heF9kaXJlY3RfcmFuZ2UpOworCWRhdGEuaW5kaXJlY3QgPSBmc3J1bl90b19jcHUoc2IsIG4uaW5kaXJlY3QpOworCWRhdGEubWF4X2luZGlyZWN0X3JhbmdlID0gZnM2NF90b19jcHUoc2IsIG4ubWF4X2luZGlyZWN0X3JhbmdlKTsKKwlkYXRhLmRvdWJsZV9pbmRpcmVjdCA9IGZzcnVuX3RvX2NwdShzYiwgbi5kb3VibGVfaW5kaXJlY3QpOworCWRhdGEubWF4X2RvdWJsZV9pbmRpcmVjdF9yYW5nZSA9IGZzNjRfdG9fY3B1KHNiLAorCQkJCQkJICAgICBuLgorCQkJCQkJICAgICBtYXhfZG91YmxlX2luZGlyZWN0X3JhbmdlKTsKKwlkYXRhLnNpemUgPSBmczY0X3RvX2NwdShzYiwgbi5zaXplKTsKKworCXJldHVybiBkYXRhOworfQorCisjZW5kaWYJCQkJLy9MSU5VWF9CRUZTX0VORElBTgpkaWZmIC0tZ2l0IGEvZnMvYmVmcy9pbm9kZS5jIGIvZnMvYmVmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MWM5MjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iZWZzL2lub2RlLmMKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIGlub2RlLmMKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAxIFdpbGwgRHlzb24gPHdpbGxfZHlzb25AcG9ib3guY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjaW5jbHVkZSAiYmVmcy5oIgorI2luY2x1ZGUgImlub2RlLmgiCisjaW5jbHVkZSAiZW5kaWFuLmgiCisKKy8qCisJVmFsaWRhdGVzIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgYmVmcyBpbm9kZQorCVJldHVybnMgQkVGU19PSyBpZiB0aGUgaW5vZGUgc2hvdWxkIGJlIHVzZWQsIG90aGVyd2lzZQorCXJldHVybnMgQkVGU19CQURfSU5PREUKKyovCitpbnQKK2JlZnNfY2hlY2tfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19pbm9kZSAqIHJhd19pbm9kZSwKKwkJIGJlZnNfYmxvY2tucl90IGlub2RlKQoreworCXUzMiBtYWdpYzEgPSBmczMyX3RvX2NwdShzYiwgcmF3X2lub2RlLT5tYWdpYzEpOworCWJlZnNfaW5vZGVfYWRkciBpbm9fbnVtID0gZnNydW5fdG9fY3B1KHNiLCByYXdfaW5vZGUtPmlub2RlX251bSk7CisJdTMyIGZsYWdzID0gZnMzMl90b19jcHUoc2IsIHJhd19pbm9kZS0+ZmxhZ3MpOworCisJLyogY2hlY2sgbWFnaWMgaGVhZGVyLiAqLworCWlmIChtYWdpYzEgIT0gQkVGU19JTk9ERV9NQUdJQzEpIHsKKwkJYmVmc19lcnJvcihzYiwKKwkJCSAgICJJbm9kZSBoYXMgYSBiYWQgbWFnaWMgaGVhZGVyIC0gaW5vZGUgPSAlbHUiLCBpbm9kZSk7CisJCXJldHVybiBCRUZTX0JBRF9JTk9ERTsKKwl9CisKKwkvKgorCSAqIFNhbml0eSBjaGVjazI6IGlub2RlcyBzdG9yZSB0aGVpciBvd24gYmxvY2sgYWRkcmVzcy4gQ2hlY2sgaXQuCisJICovCisJaWYgKGlub2RlICE9IGlhZGRyMmJsb2Nrbm8oc2IsICZpbm9fbnVtKSkgeworCQliZWZzX2Vycm9yKHNiLCAiaW5vZGUgYmxvY2tuciBmaWVsZCBkaXNhZ3JlZXMgd2l0aCB2ZnMgIgorCQkJICAgIlZGUzogJWx1LCBJbm9kZSAlbHUiLAorCQkJICAgaW5vZGUsIGlhZGRyMmJsb2Nrbm8oc2IsICZpbm9fbnVtKSk7CisJCXJldHVybiBCRUZTX0JBRF9JTk9ERTsKKwl9CisKKwkvKgorCSAqIGNoZWNrIGZsYWcKKwkgKi8KKworCWlmICghKGZsYWdzICYgQkVGU19JTk9ERV9JTl9VU0UpKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJpbm9kZSBpcyBub3QgdXNlZCAtIGlub2RlID0gJWx1IiwgaW5vZGUpOworCQlyZXR1cm4gQkVGU19CQURfSU5PREU7CisJfQorCisJcmV0dXJuIEJFRlNfT0s7Cit9CmRpZmYgLS1naXQgYS9mcy9iZWZzL2lub2RlLmggYi9mcy9iZWZzL2lub2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRjN2ZkOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvaW5vZGUuaApAQCAtMCwwICsxLDggQEAKKy8qCisgKiBpbm9kZS5oCisgKiAKKyAqLworCitpbnQgYmVmc19jaGVja19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2lub2RlICogcmF3X2lub2RlLAorCQkgICAgIGJlZnNfYmxvY2tucl90IGlub2RlKTsKKwpkaWZmIC0tZ2l0IGEvZnMvYmVmcy9pby5jIGIvZnMvYmVmcy9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZWY5OGEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iZWZzL2lvLmMKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIGxpbnV4L2ZzL2JlZnMvaW8uYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBXaWxsIER5c29uIDx3aWxsX2R5c29uQHBvYm94LmNvbQorICoKKyAqIEJhc2VkIG9uIHBvcnRpb25zIG9mIGZpbGUuYyBhbmQgaW5vZGUuYyAKKyAqIGJ5IE1ha290byBLYXRvIChtX2thdG9AZ2EyLnNvLW5ldC5uZS5qcCkKKyAqCisgKiBNYW55IHRoYW5rcyB0byBEb21pbmljIEdpYW1wYW9sbywgYXV0aG9yIG9mIFByYWN0aWNhbCBGaWxlIFN5c3RlbQorICogRGVzaWduIHdpdGggdGhlIEJlIEZpbGUgU3lzdGVtLCBmb3Igc3VjaCBhIGhlbHBmdWwgYm9vay4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKyNpbmNsdWRlICJiZWZzLmgiCisjaW5jbHVkZSAiaW8uaCIKKworLyoKKyAqIENvbnZlcnRzIGJlZnMgbm90aW9uIG9mIGRpc2sgYWRkciB0byBhIGRpc2sgb2Zmc2V0IGFuZCB1c2VzCisgKiBsaW51eCBrZXJuZWwgZnVuY3Rpb24gc2JfYnJlYWQoKSB0byBnZXQgdGhlIGJ1ZmZlciBjb250YWluaW5nCisgKiB0aGUgb2Zmc2V0LiAtV2lsbCBEeXNvbgorICoKKyAqLworCitzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorYmVmc19icmVhZF9pYWRkcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2lub2RlX2FkZHIgaWFkZHIpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJYmVmc19ibG9ja25yX3QgYmxvY2sgPSAwOworCWJlZnNfc2JfaW5mbyAqYmVmc19zYiA9IEJFRlNfU0Ioc2IpOworCisJYmVmc19kZWJ1ZyhzYiwgIi0tLT4gRW50ZXIgYmVmc19yZWFkX2lhZGRyKCkgIgorCQkgICAiWyV1LCAlaHUsICVodV0iLAorCQkgICBpYWRkci5hbGxvY2F0aW9uX2dyb3VwLCBpYWRkci5zdGFydCwgaWFkZHIubGVuKTsKKworCWlmIChpYWRkci5hbGxvY2F0aW9uX2dyb3VwID4gYmVmc19zYi0+bnVtX2FncykgeworCQliZWZzX2Vycm9yKHNiLCAiQkVGUzogSW52YWxpZCBhbGxvY2F0aW9uIGdyb3VwICV1LCBtYXggaXMgJXUiLAorCQkJICAgaWFkZHIuYWxsb2NhdGlvbl9ncm91cCwgYmVmc19zYi0+bnVtX2Fncyk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJYmxvY2sgPSBpYWRkcjJibG9ja25vKHNiLCAmaWFkZHIpOworCisJYmVmc19kZWJ1ZyhzYiwgImJlZnNfcmVhZF9pYWRkcjogb2Zmc2V0ID0gJWx1IiwgYmxvY2spOworCisJYmggPSBzYl9icmVhZChzYiwgYmxvY2spOworCisJaWYgKGJoID09IE5VTEwpIHsKKwkJYmVmc19lcnJvcihzYiwgIkZhaWxlZCB0byByZWFkIGJsb2NrICVsdSIsIGJsb2NrKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX3JlYWRfaWFkZHIoKSIpOworCXJldHVybiBiaDsKKworICAgICAgZXJyb3I6CisJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gYmVmc19yZWFkX2lhZGRyKCkgRVJST1IiKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGJ1ZmZlcl9oZWFkICoKK2JlZnNfYnJlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19ibG9ja25yX3QgYmxvY2spCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiBFbnRlciBiZWZzX3JlYWQoKSAlTHUiLCBibG9jayk7CisKKwliaCA9IHNiX2JyZWFkKHNiLCBibG9jayk7CisKKwlpZiAoYmggPT0gTlVMTCkgeworCQliZWZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIHJlYWQgYmxvY2sgJWx1IiwgYmxvY2spOworCQlnb3RvIGVycm9yOworCX0KKworCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfcmVhZCgpIik7CisKKwlyZXR1cm4gYmg7CisKKyAgICAgIGVycm9yOgorCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfcmVhZCgpIEVSUk9SIik7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9mcy9iZWZzL2lvLmggYi9mcy9iZWZzL2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3ODI2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvaW8uaApAQCAtMCwwICsxLDkgQEAKKy8qCisgKiBpby5oCisgKi8KKworc3RydWN0IGJ1ZmZlcl9oZWFkICpiZWZzX2JyZWFkX2lhZGRyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICBiZWZzX2lub2RlX2FkZHIgaWFkZHIpOworCitzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJlZnNfYnJlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19ibG9ja25yX3QgYmxvY2spOworCmRpZmYgLS1naXQgYS9mcy9iZWZzL2xpbnV4dmZzLmMgYi9mcy9iZWZzL2xpbnV4dmZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU1YmIyOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvbGludXh2ZnMuYwpAQCAtMCwwICsxLDk2NCBAQAorLyoKKyAqIGxpbnV4L2ZzL2JlZnMvbGludXh2ZnMuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBXaWxsIER5c29uIDx3aWxsX2R5c29uQHBvYm94LmNvbQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorCisjaW5jbHVkZSAiYmVmcy5oIgorI2luY2x1ZGUgImJ0cmVlLmgiCisjaW5jbHVkZSAiaW5vZGUuaCIKKyNpbmNsdWRlICJkYXRhc3RyZWFtLmgiCisjaW5jbHVkZSAic3VwZXIuaCIKKyNpbmNsdWRlICJpby5oIgorI2luY2x1ZGUgImVuZGlhbi5oIgorCitNT0RVTEVfREVTQ1JJUFRJT04oIkJlT1MgRmlsZSBTeXN0ZW0gKEJlRlMpIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiV2lsbCBEeXNvbiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBUaGUgdW5pdHMgdGhlIHZmcyBleHBlY3RzIGlub2RlLT5pX2Jsb2NrcyB0byBiZSBpbiAqLworI2RlZmluZSBWRlNfQkxPQ0tfU0laRSA1MTIKKworc3RhdGljIGludCBiZWZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOworc3RhdGljIGludCBiZWZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOworc3RhdGljIGludCBiZWZzX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSk7CitzdGF0aWMgc2VjdG9yX3QgYmVmc19ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jayk7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqYmVmc19sb29rdXAoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IG5hbWVpZGF0YSAqKTsKK3N0YXRpYyB2b2lkIGJlZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlubyk7CitzdGF0aWMgc3RydWN0IGlub2RlICpiZWZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworc3RhdGljIHZvaWQgYmVmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworc3RhdGljIGludCBiZWZzX2luaXRfaW5vZGVjYWNoZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGJlZnNfZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpOworc3RhdGljIGludCBiZWZzX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IG5hbWVpZGF0YSAqKTsKK3N0YXRpYyB2b2lkIGJlZnNfcHV0X2xpbmsoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOworc3RhdGljIGludCBiZWZzX3V0ZjJubHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqaW4sIGludCBpbl9sZW4sCisJCQljaGFyICoqb3V0LCBpbnQgKm91dF9sZW4pOworc3RhdGljIGludCBiZWZzX25sczJ1dGYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqaW4sIGludCBpbl9sZW4sCisJCQljaGFyICoqb3V0LCBpbnQgKm91dF9sZW4pOworc3RhdGljIHZvaWQgYmVmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICopOworc3RhdGljIGludCBiZWZzX3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCAqLCBjaGFyICopOworc3RhdGljIGludCBiZWZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGtzdGF0ZnMgKik7CitzdGF0aWMgaW50IHBhcnNlX29wdGlvbnMoY2hhciAqLCBiZWZzX21vdW50X29wdGlvbnMgKik7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBiZWZzX3NvcHMgPSB7CisJLnJlYWRfaW5vZGUJPSBiZWZzX3JlYWRfaW5vZGUsCS8qIGluaXRpYWxpemUgJiByZWFkIGlub2RlICovCisJLmFsbG9jX2lub2RlCT0gYmVmc19hbGxvY19pbm9kZSwJLyogYWxsb2NhdGUgYSBuZXcgaW5vZGUgKi8KKwkuZGVzdHJveV9pbm9kZQk9IGJlZnNfZGVzdHJveV9pbm9kZSwgLyogZGVhbGxvY2F0ZSBhbiBpbm9kZSAqLworCS5wdXRfc3VwZXIJPSBiZWZzX3B1dF9zdXBlciwJLyogdW5pbml0IHN1cGVyICovCisJLnN0YXRmcwkJPSBiZWZzX3N0YXRmcywJLyogc3RhdGZzICovCisJLnJlbW91bnRfZnMJPSBiZWZzX3JlbW91bnQsCit9OworCisvKiBzbGFiIGNhY2hlIGZvciBiZWZzX2lub2RlX2luZm8gb2JqZWN0cyAqLworc3RhdGljIGttZW1fY2FjaGVfdCAqYmVmc19pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJlZnNfZGlyX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IGJlZnNfcmVhZGRpciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBiZWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0geworCS5sb29rdXAJCT0gYmVmc19sb29rdXAsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBiZWZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGRlZmF1bHRfbGxzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfZmlsZV9yZWFkLAorCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9yZWFkb25seV9tbWFwLAorfTsKKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgYmVmc19hb3BzID0geworCS5yZWFkcGFnZQk9IGJlZnNfcmVhZHBhZ2UsCisJLnN5bmNfcGFnZQk9IGJsb2NrX3N5bmNfcGFnZSwKKwkuYm1hcAkJPSBiZWZzX2JtYXAsCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYmVmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBiZWZzX2ZvbGxvd19saW5rLAorCS5wdXRfbGluawk9IGJlZnNfcHV0X2xpbmssCit9OworCisvKiAKKyAqIENhbGxlZCBieSBnZW5lcmljX2ZpbGVfcmVhZCgpIHRvIHJlYWQgYSBwYWdlIG9mIGRhdGEKKyAqIAorICogSW4gdHVybiwgc2ltcGx5IGNhbGxzIGEgZ2VuZXJpYyBibG9jayByZWFkIGZ1bmN0aW9uIGFuZAorICogcGFzc2VzIGl0IHRoZSBhZGRyZXNzIG9mIGJlZnNfZ2V0X2Jsb2NrLCBmb3IgbWFwcGluZyBmaWxlCisgKiBwb3NpdGlvbnMgdG8gZGlzayBibG9ja3MuCisgKi8KK3N0YXRpYyBpbnQKK2JlZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLCBiZWZzX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBzZWN0b3JfdAorYmVmc19ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jaykKK3sKKwlyZXR1cm4gZ2VuZXJpY19ibG9ja19ibWFwKG1hcHBpbmcsIGJsb2NrLCBiZWZzX2dldF9ibG9jayk7Cit9CisKKy8qIAorICogR2VuZXJpYyBmdW5jdGlvbiB0byBtYXAgYSBmaWxlIHBvc2l0aW9uIChibG9jaykgdG8gYSAKKyAqIGRpc2sgb2Zmc2V0IChwYXNzZWQgYmFjayBpbiBiaF9yZXN1bHQpLgorICoKKyAqIFVzZWQgYnkgbWFueSBoaWdoZXIgbGV2ZWwgZnVuY3Rpb25zLgorICoKKyAqIENhbGxzIGJlZnNfZmJsb2NrMmJydW4oKSBpbiBkYXRhc3RyZWFtLmMgdG8gZG8gdGhlIHJlYWwgd29yay4KKyAqCisgKiAtV0QgMTAtMjYtMDEKKyAqLworCitzdGF0aWMgaW50CitiZWZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBibG9jaywKKwkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCWJlZnNfZGF0YV9zdHJlYW0gKmRzID0gJkJFRlNfSShpbm9kZSktPmlfZGF0YS5kczsKKwliZWZzX2Jsb2NrX3J1biBydW4gPSBCQURfSUFERFI7CisJaW50IHJlcyA9IDA7CisJdWxvbmcgZGlza19vZmY7CisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiBiZWZzX2dldF9ibG9jaygpIGZvciBpbm9kZSAlbHUsIGJsb2NrICVsZCIsCisJCSAgIGlub2RlLT5pX2lubywgYmxvY2spOworCisJaWYgKGJsb2NrIDwgMCkgeworCQliZWZzX2Vycm9yKHNiLCAiYmVmc19nZXRfYmxvY2soKSB3YXMgYXNrZWQgZm9yIGEgYmxvY2sgIgorCQkJICAgIm51bWJlciBsZXNzIHRoYW4gemVybzogYmxvY2sgJWxkIGluIGlub2RlICVsdSIsCisJCQkgICBibG9jaywgaW5vZGUtPmlfaW5vKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGNyZWF0ZSkgeworCQliZWZzX2Vycm9yKHNiLCAiYmVmc19nZXRfYmxvY2soKSB3YXMgYXNrZWQgdG8gd3JpdGUgdG8gIgorCQkJICAgImJsb2NrICVsZCBpbiBpbm9kZSAlbHUiLCBibG9jaywgaW5vZGUtPmlfaW5vKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyZXMgPSBiZWZzX2ZibG9jazJicnVuKHNiLCBkcywgYmxvY2ssICZydW4pOworCWlmIChyZXMgIT0gQkVGU19PSykgeworCQliZWZzX2Vycm9yKHNiLAorCQkJICAgIjwtLS0gYmVmc19nZXRfYmxvY2soKSBmb3IgaW5vZGUgJWx1LCBibG9jayAiCisJCQkgICAiJWxkIEVSUk9SIiwgaW5vZGUtPmlfaW5vLCBibG9jayk7CisJCXJldHVybiAtRUZCSUc7CisJfQorCisJZGlza19vZmYgPSAodWxvbmcpIGlhZGRyMmJsb2Nrbm8oc2IsICZydW4pOworCisJbWFwX2JoKGJoX3Jlc3VsdCwgaW5vZGUtPmlfc2IsIGRpc2tfb2ZmKTsKKworCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfZ2V0X2Jsb2NrKCkgZm9yIGlub2RlICVsdSwgYmxvY2sgJWxkLCAiCisJCSAgICJkaXNrIGFkZHJlc3MgJWx1IiwgaW5vZGUtPmlfaW5vLCBibG9jaywgZGlza19vZmYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKK2JlZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJYmVmc19kYXRhX3N0cmVhbSAqZHMgPSAmQkVGU19JKGRpciktPmlfZGF0YS5kczsKKwliZWZzX29mZl90IG9mZnNldDsKKwlpbnQgcmV0OworCWludCB1dGZuYW1lbGVuOworCWNoYXIgKnV0Zm5hbWU7CisJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiBiZWZzX2xvb2t1cCgpICIKKwkJICAgIm5hbWUgJXMgaW5vZGUgJWxkIiwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGlyLT5pX2lubyk7CisKKwkvKiBDb252ZXJ0IHRvIFVURi04ICovCisJaWYgKEJFRlNfU0Ioc2IpLT5ubHMpIHsKKwkJcmV0ID0KKwkJICAgIGJlZnNfbmxzMnV0ZihzYiwgbmFtZSwgc3RybGVuKG5hbWUpLCAmdXRmbmFtZSwgJnV0Zm5hbWVsZW4pOworCQlpZiAocmV0IDwgMCkgeworCQkJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gYmVmc19sb29rdXAoKSBFUlJPUiIpOworCQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwkJfQorCQlyZXQgPSBiZWZzX2J0cmVlX2ZpbmQoc2IsIGRzLCB1dGZuYW1lLCAmb2Zmc2V0KTsKKwkJa2ZyZWUodXRmbmFtZSk7CisKKwl9IGVsc2UgeworCQlyZXQgPSBiZWZzX2J0cmVlX2ZpbmQoc2IsIGRzLCBkZW50cnktPmRfbmFtZS5uYW1lLCAmb2Zmc2V0KTsKKwl9CisKKwlpZiAocmV0ID09IEJFRlNfQlRfTk9UX0ZPVU5EKSB7CisJCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfbG9va3VwKCkgJXMgbm90IGZvdW5kIiwKKwkJCSAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKworCX0gZWxzZSBpZiAocmV0ICE9IEJFRlNfT0sgfHwgb2Zmc2V0ID09IDApIHsKKwkJYmVmc193YXJuaW5nKHNiLCAiPC0tLSBiZWZzX2xvb2t1cCgpIEVycm9yIik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9EQVRBKTsKKwl9CisKKwlpbm9kZSA9IGlnZXQoZGlyLT5pX3NiLCAoaW5vX3QpIG9mZnNldCk7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKworCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfbG9va3VwKCkiKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50CitiZWZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwliZWZzX2RhdGFfc3RyZWFtICpkcyA9ICZCRUZTX0koaW5vZGUpLT5pX2RhdGEuZHM7CisJYmVmc19vZmZfdCB2YWx1ZTsKKwlpbnQgcmVzdWx0OworCXNpemVfdCBrZXlzaXplOworCXVuc2lnbmVkIGNoYXIgZF90eXBlOworCWNoYXIga2V5YnVmW0JFRlNfTkFNRV9MRU4gKyAxXTsKKwljaGFyICpubHNuYW1lOworCWludCBubHNuYW1lbGVuOworCWNvbnN0IGNoYXIgKmRpcm5hbWUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWU7CisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiBiZWZzX3JlYWRkaXIoKSAiCisJCSAgICJuYW1lICVzLCBpbm9kZSAlbGQsIGZpbHAtPmZfcG9zICVMZCIsCisJCSAgIGRpcm5hbWUsIGlub2RlLT5pX2lubywgZmlscC0+Zl9wb3MpOworCisJcmVzdWx0ID0gYmVmc19idHJlZV9yZWFkKHNiLCBkcywgZmlscC0+Zl9wb3MsIEJFRlNfTkFNRV9MRU4gKyAxLAorCQkJCSBrZXlidWYsICZrZXlzaXplLCAmdmFsdWUpOworCisJaWYgKHJlc3VsdCA9PSBCRUZTX0VSUikgeworCQliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX3JlYWRkaXIoKSBFUlJPUiIpOworCQliZWZzX2Vycm9yKHNiLCAiSU8gZXJyb3IgcmVhZGluZyAlcyAoaW5vZGUgJWx1KSIsCisJCQkgICBkaXJuYW1lLCBpbm9kZS0+aV9pbm8pOworCQlyZXR1cm4gLUVJTzsKKworCX0gZWxzZSBpZiAocmVzdWx0ID09IEJFRlNfQlRfRU5EKSB7CisJCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfcmVhZGRpcigpIEVORCIpOworCQlyZXR1cm4gMDsKKworCX0gZWxzZSBpZiAocmVzdWx0ID09IEJFRlNfQlRfRU1QVFkpIHsKKwkJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gYmVmc19yZWFkZGlyKCkgRW1wdHkgZGlyZWN0b3J5Iik7CisJCXJldHVybiAwOworCX0KKworCWRfdHlwZSA9IERUX1VOS05PV047CisKKwkvKiBDb252ZXJ0IHRvIE5MUyAqLworCWlmIChCRUZTX1NCKHNiKS0+bmxzKSB7CisJCXJlc3VsdCA9CisJCSAgICBiZWZzX3V0ZjJubHMoc2IsIGtleWJ1Ziwga2V5c2l6ZSwgJm5sc25hbWUsICZubHNuYW1lbGVuKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfcmVhZGRpcigpIEVSUk9SIik7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCXJlc3VsdCA9IGZpbGxkaXIoZGlyZW50LCBubHNuYW1lLCBubHNuYW1lbGVuLCBmaWxwLT5mX3BvcywKKwkJCQkgKGlub190KSB2YWx1ZSwgZF90eXBlKTsKKwkJa2ZyZWUobmxzbmFtZSk7CisKKwl9IGVsc2UgeworCQlyZXN1bHQgPSBmaWxsZGlyKGRpcmVudCwga2V5YnVmLCBrZXlzaXplLCBmaWxwLT5mX3BvcywKKwkJCQkgKGlub190KSB2YWx1ZSwgZF90eXBlKTsKKwl9CisKKwlmaWxwLT5mX3BvcysrOworCisJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gYmVmc19yZWFkZGlyKCkgZmlscC0+Zl9wb3MgJUxkIiwgZmlscC0+Zl9wb3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKgorYmVmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworICAgICAgICBzdHJ1Y3QgYmVmc19pbm9kZV9pbmZvICpiaTsKKyAgICAgICAgYmkgPSAoc3RydWN0IGJlZnNfaW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2MoYmVmc19pbm9kZV9jYWNoZXAsCisJCQkJCQkJU0xBQl9LRVJORUwpOworICAgICAgICBpZiAoIWJpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gJmJpLT52ZnNfaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkCitiZWZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKyAgICAgICAga21lbV9jYWNoZV9mcmVlKGJlZnNfaW5vZGVfY2FjaGVwLCBCRUZTX0koaW5vZGUpKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKyAgICAgICAgc3RydWN0IGJlZnNfaW5vZGVfaW5mbyAqYmkgPSAoc3RydWN0IGJlZnNfaW5vZGVfaW5mbyAqKSBmb287CisJCisJICAgICAgICBpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkJICAgICAgICAgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKSB7CisJCQlpbm9kZV9pbml0X29uY2UoJmJpLT52ZnNfaW5vZGUpOworCQl9Cit9CisKK3N0YXRpYyB2b2lkCitiZWZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwliZWZzX2lub2RlICpyYXdfaW5vZGUgPSBOVUxMOworCisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCWJlZnNfc2JfaW5mbyAqYmVmc19zYiA9IEJFRlNfU0Ioc2IpOworCWJlZnNfaW5vZGVfaW5mbyAqYmVmc19pbm8gPSBOVUxMOworCisJYmVmc19kZWJ1ZyhzYiwgIi0tLT4gYmVmc19yZWFkX2lub2RlKCkgIiAiaW5vZGUgPSAlbHUiLCBpbm9kZS0+aV9pbm8pOworCisJYmVmc19pbm8gPSBCRUZTX0koaW5vZGUpOworCisJLyogY29udmVydCBmcm9tIHZmcydzIGlub2RlIG51bWJlciB0byBiZWZzJ3MgaW5vZGUgbnVtYmVyICovCisJYmVmc19pbm8tPmlfaW5vZGVfbnVtID0gYmxvY2tubzJpYWRkcihzYiwgaW5vZGUtPmlfaW5vKTsKKworCWJlZnNfZGVidWcoc2IsICIgIHJlYWwgaW5vZGUgbnVtYmVyIFsldSwgJWh1LCAlaHVdIiwKKwkJICAgYmVmc19pbm8tPmlfaW5vZGVfbnVtLmFsbG9jYXRpb25fZ3JvdXAsCisJCSAgIGJlZnNfaW5vLT5pX2lub2RlX251bS5zdGFydCwgYmVmc19pbm8tPmlfaW5vZGVfbnVtLmxlbik7CisKKwliaCA9IGJlZnNfYnJlYWQoc2IsIGlub2RlLT5pX2lubyk7CisJaWYgKCFiaCkgeworCQliZWZzX2Vycm9yKHNiLCAidW5hYmxlIHRvIHJlYWQgaW5vZGUgYmxvY2sgLSAiCisJCQkgICAiaW5vZGUgPSAlbHUiLCBpbm9kZS0+aV9pbm8pOworCQlnb3RvIHVuYXF1aXJlX25vbmU7CisJfQorCisJcmF3X2lub2RlID0gKGJlZnNfaW5vZGUgKikgYmgtPmJfZGF0YTsKKworCWJlZnNfZHVtcF9pbm9kZShzYiwgcmF3X2lub2RlKTsKKworCWlmIChiZWZzX2NoZWNrX2lub2RlKHNiLCByYXdfaW5vZGUsIGlub2RlLT5pX2lubykgIT0gQkVGU19PSykgeworCQliZWZzX2Vycm9yKHNiLCAiQmFkIGlub2RlOiAlbHUiLCBpbm9kZS0+aV9pbm8pOworCQlnb3RvIHVuYXF1aXJlX2JoOworCX0KKworCWlub2RlLT5pX21vZGUgPSAodW1vZGVfdCkgZnMzMl90b19jcHUoc2IsIHJhd19pbm9kZS0+bW9kZSk7CisKKwkvKgorCSAqIHNldCB1aWQgYW5kIGdpZC4gIEJ1dCBzaW5jZSBjdXJyZW50IEJlT1MgaXMgc2luZ2xlIHVzZXIgT1MsIHNvCisJICogeW91IGNhbiBjaGFuZ2UgYnkgInVpZCIgb3IgImdpZCIgb3B0aW9ucy4KKwkgKi8gICAKKworCWlub2RlLT5pX3VpZCA9IGJlZnNfc2ItPm1vdW50X29wdHMudXNlX3VpZCA/CisJICAgIGJlZnNfc2ItPm1vdW50X29wdHMudWlkIDogKHVpZF90KSBmczMyX3RvX2NwdShzYiwgcmF3X2lub2RlLT51aWQpOworCWlub2RlLT5pX2dpZCA9IGJlZnNfc2ItPm1vdW50X29wdHMudXNlX2dpZCA/CisJICAgIGJlZnNfc2ItPm1vdW50X29wdHMuZ2lkIDogKGdpZF90KSBmczMyX3RvX2NwdShzYiwgcmF3X2lub2RlLT5naWQpOworCisJaW5vZGUtPmlfbmxpbmsgPSAxOworCisJLyoKKwkgKiBCRUZTJ3MgdGltZSBpcyA2NCBiaXRzLCBidXQgY3VycmVudCBWRlMgaXMgMzIgYml0cy4uLgorCSAqIEJFRlMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdGltZS4gTm9yIGlub2RlIGNoYW5nZSB0aW1lLiBWRlMKKwkgKiBkb2Vzbid0IGhhdmUgY3JlYXRpb24gdGltZS4KKwkgKiBBbHNvLCB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgbGFzdF9tb2RpZmllZF90aW1lIGFuZCAKKwkgKiBjcmVhdGVfdGltZSBhcmUganVzdCBhIGNvdW50ZXIgdG8gaGVscCBlbnN1cmUgdW5pcXVlbmVzcworCSAqIGZvciBpbmRleGluZyBwdXJwb3Nlcy4gKFBGRCwgcGFnZSA1NCkKKwkgKi8KKworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9CisJICAgIGZzNjRfdG9fY3B1KHNiLCByYXdfaW5vZGUtPmxhc3RfbW9kaWZpZWRfdGltZSkgPj4gMTY7CisJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IDA7ICAgLyogbG93ZXIgMTYgYml0cyBhcmUgbm90IGEgdGltZSAqLwkKKwlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lOworCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWU7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IGJlZnNfc2ItPmJsb2NrX3NpemU7CisKKwliZWZzX2luby0+aV9pbm9kZV9udW0gPSBmc3J1bl90b19jcHUoc2IsIHJhd19pbm9kZS0+aW5vZGVfbnVtKTsKKwliZWZzX2luby0+aV9wYXJlbnQgPSBmc3J1bl90b19jcHUoc2IsIHJhd19pbm9kZS0+cGFyZW50KTsKKwliZWZzX2luby0+aV9hdHRyaWJ1dGUgPSBmc3J1bl90b19jcHUoc2IsIHJhd19pbm9kZS0+YXR0cmlidXRlcyk7CisJYmVmc19pbm8tPmlfZmxhZ3MgPSBmczMyX3RvX2NwdShzYiwgcmF3X2lub2RlLT5mbGFncyk7CisKKwlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSAmJiAhKGJlZnNfaW5vLT5pX2ZsYWdzICYgQkVGU19MT05HX1NZTUxJTkspKXsKKwkJaW5vZGUtPmlfc2l6ZSA9IDA7CisJCWlub2RlLT5pX2Jsb2NrcyA9IGJlZnNfc2ItPmJsb2NrX3NpemUgLyBWRlNfQkxPQ0tfU0laRTsKKwkJc3RybmNweShiZWZzX2luby0+aV9kYXRhLnN5bWxpbmssIHJhd19pbm9kZS0+ZGF0YS5zeW1saW5rLAorCQkJQkVGU19TWU1MSU5LX0xFTik7CisJfSBlbHNlIHsKKwkJaW50IG51bV9ibGtzOworCisJCWJlZnNfaW5vLT5pX2RhdGEuZHMgPQorCQkgICAgZnNkc190b19jcHUoc2IsIHJhd19pbm9kZS0+ZGF0YS5kYXRhc3RyZWFtKTsKKworCQludW1fYmxrcyA9IGJlZnNfY291bnRfYmxvY2tzKHNiLCAmYmVmc19pbm8tPmlfZGF0YS5kcyk7CisJCWlub2RlLT5pX2Jsb2NrcyA9CisJCSAgICBudW1fYmxrcyAqIChiZWZzX3NiLT5ibG9ja19zaXplIC8gVkZTX0JMT0NLX1NJWkUpOworCQlpbm9kZS0+aV9zaXplID0gYmVmc19pbm8tPmlfZGF0YS5kcy5zaXplOworCX0KKworCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmJlZnNfYW9wczsKKworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX2ZvcCA9ICZiZWZzX2ZpbGVfb3BlcmF0aW9uczsKKwl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmYmVmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmJlZnNfZGlyX29wZXJhdGlvbnM7CisJfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJmJlZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCX0gZWxzZSB7CisJCWJlZnNfZXJyb3Ioc2IsICJJbm9kZSAlbHUgaXMgbm90IGEgcmVndWxhciBmaWxlLCAiCisJCQkgICAiZGlyZWN0b3J5IG9yIHN5bWxpbmsuIFRIQVQgSVMgV1JPTkchIEJlRlMgaGFzIG5vICIKKwkJCSAgICJvbiBkaXNrIHNwZWNpYWwgZmlsZXMiLCBpbm9kZS0+aV9pbm8pOworCQlnb3RvIHVuYXF1aXJlX2JoOworCX0KKworCWJyZWxzZShiaCk7CisJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gYmVmc19yZWFkX2lub2RlKCkiKTsKKwlyZXR1cm47CisKKyAgICAgIHVuYXF1aXJlX2JoOgorCWJyZWxzZShiaCk7CisKKyAgICAgIHVuYXF1aXJlX25vbmU6CisJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfcmVhZF9pbm9kZSgpIC0gQmFkIGlub2RlIik7CisJcmV0dXJuOworfQorCisvKiBJbml0aWFsaXplIHRoZSBpbm9kZSBjYWNoZS4gQ2FsbGVkIGF0IGZzIHNldHVwLgorICogCisgKiBUYWtlbiBmcm9tIE5GUyBpbXBsZW1lbnRhdGlvbiBieSBBbCBWaXJvLgorICovCitzdGF0aWMgaW50CitiZWZzX2luaXRfaW5vZGVjYWNoZSh2b2lkKQoreworCWJlZnNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImJlZnNfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgICBzaXplb2YgKHN0cnVjdCBiZWZzX2lub2RlX2luZm8pLAorCQkJCQkgICAgICAwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQkJICAgICAgaW5pdF9vbmNlLCBOVUxMKTsKKwlpZiAoYmVmc19pbm9kZV9jYWNoZXAgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImJlZnNfaW5pdF9pbm9kZWNhY2hlOiAiCisJCSAgICAgICAiQ291bGRuJ3QgaW5pdGFsaXplIGlub2RlIHNsYWJjYWNoZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgYXQgZnMgdGVhcmRvd24uCisgKiAKKyAqIFRha2VuIGZyb20gTkZTIGltcGxlbWVudGF0aW9uIGJ5IEFsIFZpcm8uCisgKi8KK3N0YXRpYyB2b2lkCitiZWZzX2Rlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQoreworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koYmVmc19pbm9kZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9FUlIgImJlZnNfZGVzdHJveV9pbm9kZWNhY2hlOiAiCisJCSAgICAgICAibm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQorCisvKgorICogVGhlIGlub2RlIG9mIHN5bWJvbGljIGxpbmsgaXMgZGlmZmVyZW50IHRvIGRhdGEgc3RyZWFtLgorICogVGhlIGRhdGEgc3RyZWFtIGJlY29tZSBsaW5rIG5hbWUuIFVubGVzcyB0aGUgTE9OR19TWU1MSU5LCisgKiBmbGFnIGlzIHNldC4KKyAqLworc3RhdGljIGludAorYmVmc19mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWJlZnNfaW5vZGVfaW5mbyAqYmVmc19pbm8gPSBCRUZTX0koZGVudHJ5LT5kX2lub2RlKTsKKwljaGFyICpsaW5rOworCisJaWYgKGJlZnNfaW5vLT5pX2ZsYWdzICYgQkVGU19MT05HX1NZTUxJTkspIHsKKwkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKKwkJYmVmc19kYXRhX3N0cmVhbSAqZGF0YSA9ICZiZWZzX2luby0+aV9kYXRhLmRzOworCQliZWZzX29mZl90IGxlbiA9IGRhdGEtPnNpemU7CisKKwkJYmVmc19kZWJ1ZyhzYiwgIkZvbGxvdyBsb25nIHN5bWxpbmsiKTsKKworCQlsaW5rID0ga21hbGxvYyhsZW4sIEdGUF9OT0ZTKTsKKwkJaWYgKCFsaW5rKSB7CisJCQlsaW5rID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJfSBlbHNlIGlmIChiZWZzX3JlYWRfbHN5bWxpbmsoc2IsIGRhdGEsIGxpbmssIGxlbikgIT0gbGVuKSB7CisJCQlrZnJlZShsaW5rKTsKKwkJCWJlZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gcmVhZCBlbnRpcmUgbG9uZyBzeW1saW5rIik7CisJCQlsaW5rID0gRVJSX1BUUigtRUlPKTsKKwkJfQorCX0gZWxzZSB7CisJCWxpbmsgPSBiZWZzX2luby0+aV9kYXRhLnN5bWxpbms7CisJfQorCisJbmRfc2V0X2xpbmsobmQsIGxpbmspOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiZWZzX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJYmVmc19pbm9kZV9pbmZvICpiZWZzX2lubyA9IEJFRlNfSShkZW50cnktPmRfaW5vZGUpOworCWlmIChiZWZzX2luby0+aV9mbGFncyAmIEJFRlNfTE9OR19TWU1MSU5LKSB7CisJCWNoYXIgKnAgPSBuZF9nZXRfbGluayhuZCk7CisJCWlmICghSVNfRVJSKHApKQorCQkJa2ZyZWUocCk7CisJfQorfQorCisvKgorICogVVRGLTggdG8gTkxTIGNoYXJzZXQgIGNvbnZlcnQgcm91dGluZQorICogCisgKgorICogQ2hhbmdlZCA4LzEwLzAxIGJ5IFdpbGwgRHlzb24uIE5vdyB1c2UgdW5pMmNoYXIoKSAvIGNoYXIydW5pKCkgcmF0aGVyIHRoYW4KKyAqIHRoZSBubHMgdGFibGVzIGRpcmVjdGx5CisgKi8KKworc3RhdGljIGludAorYmVmc191dGYybmxzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmluLAorCSAgICAgaW50IGluX2xlbiwgY2hhciAqKm91dCwgaW50ICpvdXRfbGVuKQoreworCXN0cnVjdCBubHNfdGFibGUgKm5scyA9IEJFRlNfU0Ioc2IpLT5ubHM7CisJaW50IGksIG87CisJd2NoYXJfdCB1bmk7CisJaW50IHVuaWxlbiwgdXRmbGVuOworCWNoYXIgKnJlc3VsdDsKKwlpbnQgbWF4bGVuID0gaW5fbGVuOyAvKiBUaGUgdXRmOC0+bmxzIGNvbnZlcnNpb24gY2FuJ3QgbWFrZSBtb3JlIGNoYXJzICovCisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiB1dGYybmxzKCkiKTsKKworCWlmICghbmxzKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJiZWZzX3V0ZjJubHMgY2FsbGVkIHdpdGggbm8gTkxTIHRhYmxlIGxvYWRlZCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqb3V0ID0gcmVzdWx0ID0ga21hbGxvYyhtYXhsZW4sIEdGUF9OT0ZTKTsKKwlpZiAoISpvdXQpIHsKKwkJYmVmc19lcnJvcihzYiwgImJlZnNfdXRmMm5scygpIGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkiKTsKKwkJKm91dF9sZW4gPSAwOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSBvID0gMDsgaSA8IGluX2xlbjsgaSArPSB1dGZsZW4sIG8gKz0gdW5pbGVuKSB7CisKKwkJLyogY29udmVydCBmcm9tIFVURi04IHRvIFVuaWNvZGUgKi8KKwkJdXRmbGVuID0gdXRmOF9tYnRvd2MoJnVuaSwgJmluW2ldLCBpbl9sZW4gLSBpKTsKKwkJaWYgKHV0ZmxlbiA8IDApIHsKKwkJCWdvdG8gY29udl9lcnI7CisJCX0KKworCQkvKiBjb252ZXJ0IGZyb20gVW5pY29kZSB0byBubHMgKi8KKwkJdW5pbGVuID0gbmxzLT51bmkyY2hhcih1bmksICZyZXN1bHRbb10sIGluX2xlbiAtIG8pOworCQlpZiAodW5pbGVuIDwgMCkgeworCQkJZ290byBjb252X2VycjsKKwkJfQorCX0KKwlyZXN1bHRbb10gPSAnXDAnOworCSpvdXRfbGVuID0gbzsKKworCWJlZnNfZGVidWcoc2IsICI8LS0tIHV0ZjJubHMoKSIpOworCisJcmV0dXJuIG87CisKKyAgICAgIGNvbnZfZXJyOgorCWJlZnNfZXJyb3Ioc2IsICJOYW1lIHVzaW5nIGNoYXJhY3RlciBzZXQgJXMgY29udGFpbnMgYSBjaGFyYWN0ZXIgdGhhdCAiCisJCSAgICJjYW5ub3QgYmUgY29udmVydGVkIHRvIHVuaWNvZGUuIiwgbmxzLT5jaGFyc2V0KTsKKwliZWZzX2RlYnVnKHNiLCAiPC0tLSB1dGYybmxzKCkiKTsKKwlrZnJlZShyZXN1bHQpOworCXJldHVybiAtRUlMU0VROworfQorCisvKioKKyAqIGJlZnNfbmxzMnV0ZiAtIENvbnZlcnQgTkxTIHN0cmluZyB0byB1dGY4IGVuY29kZWluZworICogQHNiOiBTdXBlcmJsb2NrCisgKiBAc3JjOiBJbnB1dCBzdHJpbmcgYnVmZmVyIGluIE5MUyBmb3JtYXQKKyAqIEBzcmNsZW46IExlbmd0aCBvZiBpbnB1dCBzdHJpbmcgaW4gYnl0ZXMKKyAqIEBkZXN0OiBUaGUgb3V0cHV0IHN0cmluZyBpbiBVVEY4IGZvcm1hdAorICogQGRlc3RsZW46IExlbmd0aCBvZiB0aGUgb3V0cHV0IGJ1ZmZlcgorICogCisgKiBDb252ZXJ0cyBpbnB1dCBzdHJpbmcgQHNyYywgd2hpY2ggaXMgaW4gdGhlIGZvcm1hdCBvZiB0aGUgbG9hZGVkIE5MUyBtYXAsCisgKiBpbnRvIGEgdXRmOCBzdHJpbmcuCisgKiAKKyAqIFRoZSBkZXN0aW5hdGlvbiBzdHJpbmcgQGRlc3QgaXMgYWxsb2NhdGVkIGJ5IHRoaXMgZnVuY3Rpb24gYW5kIHRoZSBjYWxsZXIgaXMKKyAqIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0IHdpdGgga2ZyZWUoKQorICogCisgKiBPbiByZXR1cm4sICpAZGVzdGxlbiBpcyB0aGUgbGVuZ3RoIG9mIEBkZXN0IGluIGJ5dGVzLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiB1dGY4IGNoYXJhY3RlcnMgd3JpdHRlbiB0bworICogdGhlIG91dHB1dCBidWZmZXIgQGRlc3QuCisgKiAgCisgKiBPbiBGYWlsdXJlLCBhIG5lZ2F0aXZlIG51bWJlciBjb3Jlc3BvbmRpbmcgdG8gdGhlIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuCisgKi8KKworc3RhdGljIGludAorYmVmc19ubHMydXRmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmluLAorCSAgICAgaW50IGluX2xlbiwgY2hhciAqKm91dCwgaW50ICpvdXRfbGVuKQoreworCXN0cnVjdCBubHNfdGFibGUgKm5scyA9IEJFRlNfU0Ioc2IpLT5ubHM7CisJaW50IGksIG87CisJd2NoYXJfdCB1bmk7CisJaW50IHVuaWxlbiwgdXRmbGVuOworCWNoYXIgKnJlc3VsdDsKKwlpbnQgbWF4bGVuID0gMyAqIGluX2xlbjsKKworCWJlZnNfZGVidWcoc2IsICItLS0+IG5sczJ1dGYoKVxuIik7CisKKwlpZiAoIW5scykgeworCQliZWZzX2Vycm9yKHNiLCAiYmVmc19ubHMydXRmIGNhbGxlZCB3aXRoIG5vIE5MUyB0YWJsZSBsb2FkZWQuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCSpvdXQgPSByZXN1bHQgPSBrbWFsbG9jKG1heGxlbiwgR0ZQX05PRlMpOworCWlmICghKm91dCkgeworCQliZWZzX2Vycm9yKHNiLCAiYmVmc19ubHMydXRmKCkgY2Fubm90IGFsbG9jYXRlIG1lbW9yeSIpOworCQkqb3V0X2xlbiA9IDA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAoaSA9IG8gPSAwOyBpIDwgaW5fbGVuOyBpICs9IHVuaWxlbiwgbyArPSB1dGZsZW4pIHsKKworCQkvKiBjb252ZXJ0IGZyb20gbmxzIHRvIHVuaWNvZGUgKi8KKwkJdW5pbGVuID0gbmxzLT5jaGFyMnVuaSgmaW5baV0sIGluX2xlbiAtIGksICZ1bmkpOworCQlpZiAodW5pbGVuIDwgMCkgeworCQkJZ290byBjb252X2VycjsKKwkJfQorCisJCS8qIGNvbnZlcnQgZnJvbSB1bmljb2RlIHRvIFVURi04ICovCisJCXV0ZmxlbiA9IHV0Zjhfd2N0b21iKCZyZXN1bHRbb10sIHVuaSwgMyk7CisJCWlmICh1dGZsZW4gPD0gMCkgeworCQkJZ290byBjb252X2VycjsKKwkJfQorCX0KKworCXJlc3VsdFtvXSA9ICdcMCc7CisJKm91dF9sZW4gPSBvOworCisJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gbmxzMnV0ZigpIik7CisKKwlyZXR1cm4gaTsKKworICAgICAgY29udl9lcnI6CisJYmVmc19lcnJvcihzYiwgIk5hbWUgdXNpbmcgY2hhcmVjdGVyIHNldCAlcyBjb250YWlucyBhIGNoYXJlY3RlciB0aGF0ICIKKwkJICAgImNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gdW5pY29kZS4iLCBubHMtPmNoYXJzZXQpOworCWJlZnNfZGVidWcoc2IsICI8LS0tIG5sczJ1dGYoKSIpOworCWtmcmVlKHJlc3VsdCk7CisJcmV0dXJuIC1FSUxTRVE7Cit9CisKKy8qKgorICogVXNlIHRoZQorICoKKyAqLworZW51bSB7CisJT3B0X3VpZCwgT3B0X2dpZCwgT3B0X2NoYXJzZXQsIE9wdF9kZWJ1ZywgT3B0X2VyciwKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IGJlZnNfdG9rZW5zID0geworCXtPcHRfdWlkLCAidWlkPSVkIn0sCisJe09wdF9naWQsICJnaWQ9JWQifSwKKwl7T3B0X2NoYXJzZXQsICJpb2NoYXJzZXQ9JXMifSwKKwl7T3B0X2RlYnVnLCAiZGVidWcifSwKKwl7T3B0X2VyciwgTlVMTH0KK307CisKK3N0YXRpYyBpbnQKK3BhcnNlX29wdGlvbnMoY2hhciAqb3B0aW9ucywgYmVmc19tb3VudF9vcHRpb25zICogb3B0cykKK3sKKwljaGFyICpwOworCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKKwlpbnQgb3B0aW9uOworCisJLyogSW5pdGlhbGl6ZSBvcHRpb25zICovCisJb3B0cy0+dWlkID0gMDsKKwlvcHRzLT5naWQgPSAwOworCW9wdHMtPnVzZV91aWQgPSAwOworCW9wdHMtPnVzZV9naWQgPSAwOworCW9wdHMtPmlvY2hhcnNldCA9IE5VTEw7CisJb3B0cy0+ZGVidWcgPSAwOworCisJaWYgKCFvcHRpb25zKQorCQlyZXR1cm4gMTsKKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpbnQgdG9rZW47CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIGJlZnNfdG9rZW5zLCBhcmdzKTsKKwkJc3dpdGNoICh0b2tlbikgeworCQljYXNlIE9wdF91aWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChvcHRpb24gPCAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJCZUZTOiBJbnZhbGlkIHVpZCAlZCwgIgorCQkJCQkJInVzaW5nIGRlZmF1bHRcbiIsIG9wdGlvbik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlvcHRzLT51aWQgPSBvcHRpb247CisJCQlvcHRzLT51c2VfdWlkID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9naWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChvcHRpb24gPCAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJCZUZTOiBJbnZhbGlkIGdpZCAlZCwgIgorCQkJCQkJInVzaW5nIGRlZmF1bHRcbiIsIG9wdGlvbik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlvcHRzLT5naWQgPSBvcHRpb247CisJCQlvcHRzLT51c2VfZ2lkID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9jaGFyc2V0OgorCQkJa2ZyZWUob3B0cy0+aW9jaGFyc2V0KTsKKwkJCW9wdHMtPmlvY2hhcnNldCA9IG1hdGNoX3N0cmR1cCgmYXJnc1swXSk7CisJCQlpZiAoIW9wdHMtPmlvY2hhcnNldCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiQmVGUzogYWxsb2NhdGlvbiBmYWlsdXJlIGZvciAiCisJCQkJCQkiaW9jaGFyc2V0IHN0cmluZ1xuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZGVidWc6CisJCQlvcHRzLT5kZWJ1ZyA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiQmVGUzogVW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbiBcIiVzXCIgIgorCQkJCQkib3IgbWlzc2luZyB2YWx1ZVxuIiwgcCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBoYXMgdGhlIHJlc3BvbnNpYmlsdGl5IG9mIGdldHRpbmcgdGhlCisgKiBmaWxlc3lzdGVtIHJlYWR5IGZvciB1bm1vdW50aW5nLiAKKyAqIEJhc2ljbHksIHdlIGZyZWUgZXZlcnl0aGluZyB0aGF0IHdlIGFsbG9jYXRlZCBpbgorICogYmVmc19yZWFkX2lub2RlCisgKi8KK3N0YXRpYyB2b2lkCitiZWZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWlmIChCRUZTX1NCKHNiKS0+bW91bnRfb3B0cy5pb2NoYXJzZXQpIHsKKwkJa2ZyZWUoQkVGU19TQihzYiktPm1vdW50X29wdHMuaW9jaGFyc2V0KTsKKwkJQkVGU19TQihzYiktPm1vdW50X29wdHMuaW9jaGFyc2V0ID0gTlVMTDsKKwl9CisKKwlpZiAoQkVGU19TQihzYiktPm5scykgeworCQl1bmxvYWRfbmxzKEJFRlNfU0Ioc2IpLT5ubHMpOworCQlCRUZTX1NCKHNiKS0+bmxzID0gTlVMTDsKKwl9CisKKwlpZiAoc2ItPnNfZnNfaW5mbykgeworCQlrZnJlZShzYi0+c19mc19pbmZvKTsKKwkJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CisJfQorCXJldHVybjsKK30KKworLyogQWxsb2NhdGUgcHJpdmF0ZSBmaWVsZCBvZiB0aGUgc3VwZXJibG9jaywgZmlsbCBpdC4KKyAqCisgKiBGaW5pc2ggZmlsbGluZyB0aGUgcHVibGljIHN1cGVyYmxvY2sgZmllbGRzCisgKiBNYWtlIHRoZSByb290IGRpcmVjdG9yeQorICogTG9hZCBhIHNldCBvZiBOTFMgdHJhbnNsYXRpb25zIGlmIG5lZWRlZC4KKyAqLworc3RhdGljIGludAorYmVmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwliZWZzX3NiX2luZm8gKmJlZnNfc2I7CisJYmVmc19zdXBlcl9ibG9jayAqZGlza19zYjsKKwlzdHJ1Y3QgaW5vZGUgKnJvb3Q7CisKKwljb25zdCB1bnNpZ25lZCBsb25nIHNiX2Jsb2NrID0gMDsKKwljb25zdCBvZmZfdCB4ODZfc2Jfb2ZmID0gNTEyOworCisJc2ItPnNfZnNfaW5mbyA9IGttYWxsb2Moc2l6ZW9mICgqYmVmc19zYiksIEdGUF9LRVJORUwpOworCWlmIChzYi0+c19mc19pbmZvID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiQmVGUyglcyk6IFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHByaXZhdGUgIgorCQkgICAgICAgInBvcnRpb24gb2Ygc3VwZXJibG9jay4gQmFpbGluZy5cbiIsIHNiLT5zX2lkKTsKKwkJZ290byB1bmFxdWlyZV9ub25lOworCX0KKwliZWZzX3NiID0gQkVGU19TQihzYik7CisJbWVtc2V0KGJlZnNfc2IsIDAsIHNpemVvZihiZWZzX3NiX2luZm8pKTsKKworCWlmICghcGFyc2Vfb3B0aW9ucygoY2hhciAqKSBkYXRhLCAmYmVmc19zYi0+bW91bnRfb3B0cykpIHsKKwkJYmVmc19lcnJvcihzYiwgImNhbm5vdCBwYXJzZSBtb3VudCBvcHRpb25zIik7CisJCWdvdG8gdW5hcXVpcmVfcHJpdl9zYnA7CisJfQorCisJYmVmc19kZWJ1ZyhzYiwgIi0tLT4gYmVmc19maWxsX3N1cGVyKCkiKTsKKworI2lmbmRlZiBDT05GSUdfQkVGU19SVworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQliZWZzX3dhcm5pbmcoc2IsCisJCQkgICAgICJObyB3cml0ZSBzdXBwb3J0LiBNYXJraW5nIGZpbGVzeXN0ZW0gcmVhZC1vbmx5Iik7CisJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKwl9CisjZW5kaWYJCQkJLyogQ09ORklHX0JFRlNfUlcgKi8KKworCS8qCisJICogU2V0IGR1bW15IGJsb2Nrc2l6ZSB0byByZWFkIHN1cGVyIGJsb2NrLgorCSAqIFdpbGwgYmUgc2V0IHRvIHJlYWwgZnMgYmxvY2tzaXplIGxhdGVyLgorCSAqCisJICogTGludXggMi40LjEwIGFuZCBsYXRlciByZWZ1c2UgdG8gcmVhZCBibG9ja3Mgc21hbGxlciB0aGFuCisJICogdGhlIGhhcmRzZWN0IHNpemUgZm9yIHRoZSBkZXZpY2UuIEJ1dCB3ZSBhbHNvIG5lZWQgdG8gcmVhZCBhdCAKKwkgKiBsZWFzdCAxayB0byBnZXQgdGhlIHNlY29uZCA1MTIgYnl0ZXMgb2YgdGhlIHZvbHVtZS4KKwkgKiAtV0QgMTAtMjYtMDEKKwkgKi8gCisJc2JfbWluX2Jsb2Nrc2l6ZShzYiwgMTAyNCk7CisKKwlpZiAoIShiaCA9IHNiX2JyZWFkKHNiLCBzYl9ibG9jaykpKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJ1bmFibGUgdG8gcmVhZCBzdXBlcmJsb2NrIik7CisJCWdvdG8gdW5hcXVpcmVfcHJpdl9zYnA7CisJfQorCisJLyogYWNjb3VudCBmb3Igb2Zmc2V0IG9mIHN1cGVyIGJsb2NrIG9uIHg4NiAqLworCWRpc2tfc2IgPSAoYmVmc19zdXBlcl9ibG9jayAqKSBiaC0+Yl9kYXRhOworCWlmICgobGUzMl90b19jcHUoZGlza19zYi0+bWFnaWMxKSA9PSBCRUZTX1NVUEVSX01BR0lDMSkgfHwKKwkgICAgKGJlMzJfdG9fY3B1KGRpc2tfc2ItPm1hZ2ljMSkgPT0gQkVGU19TVVBFUl9NQUdJQzEpKSB7CisJCWJlZnNfZGVidWcoc2IsICJVc2luZyBQUEMgc3VwZXJibG9jayBsb2NhdGlvbiIpOworCX0gZWxzZSB7CisJCWJlZnNfZGVidWcoc2IsICJVc2luZyB4ODYgc3VwZXJibG9jayBsb2NhdGlvbiIpOworCQlkaXNrX3NiID0KKwkJICAgIChiZWZzX3N1cGVyX2Jsb2NrICopICgodm9pZCAqKSBiaC0+Yl9kYXRhICsgeDg2X3NiX29mZik7CisJfQorCisJaWYgKGJlZnNfbG9hZF9zYihzYiwgZGlza19zYikgIT0gQkVGU19PSykKKwkJZ290byB1bmFxdWlyZV9iaDsKKworCWJlZnNfZHVtcF9zdXBlcl9ibG9jayhzYiwgZGlza19zYik7CisKKwlicmVsc2UoYmgpOworCisJaWYgKGJlZnNfY2hlY2tfc2Ioc2IpICE9IEJFRlNfT0spCisJCWdvdG8gdW5hcXVpcmVfcHJpdl9zYnA7CisKKwlpZiggYmVmc19zYi0+bnVtX2Jsb2NrcyA+IH4oKHNlY3Rvcl90KTApICkgeworCQliZWZzX2Vycm9yKHNiLCAiYmxvY2tzIGNvdW50OiAlTHUgIgorCQkJImlzIGxhcmdlciB0aGFuIHRoZSBob3N0IGNhbiB1c2UiLAorCQkJYmVmc19zYi0+bnVtX2Jsb2Nrcyk7CisJCWdvdG8gdW5hcXVpcmVfcHJpdl9zYnA7CisJfQorCisJLyoKKwkgKiBzZXQgdXAgZW5vdWdoIHNvIHRoYXQgaXQgY2FuIHJlYWQgYW4gaW5vZGUKKwkgKiBGaWxsIGluIGtlcm5lbCBzdXBlcmJsb2NrIGZpZWxkcyBmcm9tIHByaXZhdGUgc2IKKwkgKi8KKwlzYi0+c19tYWdpYyA9IEJFRlNfU1VQRVJfTUFHSUM7CisJLyogU2V0IHJlYWwgYmxvY2tzaXplIG9mIGZzICovCisJc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgKHVsb25nKSBiZWZzX3NiLT5ibG9ja19zaXplKTsKKwlzYi0+c19vcCA9IChzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyAqKSAmYmVmc19zb3BzOworCXJvb3QgPSBpZ2V0KHNiLCBpYWRkcjJibG9ja25vKHNiLCAmKGJlZnNfc2ItPnJvb3RfZGlyKSkpOworCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CisJaWYgKCFzYi0+c19yb290KSB7CisJCWlwdXQocm9vdCk7CisJCWJlZnNfZXJyb3Ioc2IsICJnZXQgcm9vdCBpbm9kZSBmYWlsZWQiKTsKKwkJZ290byB1bmFxdWlyZV9wcml2X3NicDsKKwl9CisKKwkvKiBsb2FkIG5scyBsaWJyYXJ5ICovCisJaWYgKGJlZnNfc2ItPm1vdW50X29wdHMuaW9jaGFyc2V0KSB7CisJCWJlZnNfZGVidWcoc2IsICJMb2FkaW5nIG5sczogJXMiLAorCQkJICAgYmVmc19zYi0+bW91bnRfb3B0cy5pb2NoYXJzZXQpOworCQliZWZzX3NiLT5ubHMgPSBsb2FkX25scyhiZWZzX3NiLT5tb3VudF9vcHRzLmlvY2hhcnNldCk7CisJCWlmICghYmVmc19zYi0+bmxzKSB7CisJCQliZWZzX3dhcm5pbmcoc2IsICJDYW5ub3QgbG9hZCBubHMgJXMiCisJCQkJCSIgbG9hZGluZyBkZWZhdWx0IG5scyIsCisJCQkJCWJlZnNfc2ItPm1vdW50X29wdHMuaW9jaGFyc2V0KTsKKwkJCWJlZnNfc2ItPm5scyA9IGxvYWRfbmxzX2RlZmF1bHQoKTsKKwkJfQorCS8qIGxvYWQgZGVmYXVsdCBubHMgaWYgbm9uZSBpcyBzcGVjaWZpZWQgIGluIG1vdW50IG9wdGlvbnMgKi8KKwl9IGVsc2UgeworCQliZWZzX2RlYnVnKHNiLCAiTG9hZGluZyBkZWZhdWx0IG5scyIpOworCQliZWZzX3NiLT5ubHMgPSBsb2FkX25sc19kZWZhdWx0KCk7CisJfQorCisJcmV0dXJuIDA7CisvKioqKioqKioqKioqKioqKiovCisgICAgICB1bmFxdWlyZV9iaDoKKwlicmVsc2UoYmgpOworCisgICAgICB1bmFxdWlyZV9wcml2X3NicDoKKwlrZnJlZShzYi0+c19mc19pbmZvKTsKKworICAgICAgdW5hcXVpcmVfbm9uZToKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludAorYmVmc19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJaWYgKCEoKmZsYWdzICYgTVNfUkRPTkxZKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2JlZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCit7CisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiBiZWZzX3N0YXRmcygpIik7CisKKwlidWYtPmZfdHlwZSA9IEJFRlNfU1VQRVJfTUFHSUM7CisJYnVmLT5mX2JzaXplID0gc2ItPnNfYmxvY2tzaXplOworCWJ1Zi0+Zl9ibG9ja3MgPSBCRUZTX1NCKHNiKS0+bnVtX2Jsb2NrczsKKwlidWYtPmZfYmZyZWUgPSBCRUZTX1NCKHNiKS0+bnVtX2Jsb2NrcyAtIEJFRlNfU0Ioc2IpLT51c2VkX2Jsb2NrczsKKwlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlOworCWJ1Zi0+Zl9maWxlcyA9IDA7CS8qIFVOS05PV04gKi8KKwlidWYtPmZfZmZyZWUgPSAwOwkvKiBVTktOT1dOICovCisJYnVmLT5mX25hbWVsZW4gPSBCRUZTX05BTUVfTEVOOworCisJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gYmVmc19zdGF0ZnMoKSIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKgorYmVmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJICAgIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgYmVmc19maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJlZnNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImJlZnMiLAorCS5nZXRfc2IJCT0gYmVmc19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2Jsb2NrX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwJCit9OworCitzdGF0aWMgaW50IF9faW5pdAoraW5pdF9iZWZzX2ZzKHZvaWQpCit7CisJaW50IGVycjsKKworCXByaW50ayhLRVJOX0lORk8gIkJlRlMgdmVyc2lvbjogJXNcbiIsIEJFRlNfVkVSU0lPTik7CisKKwllcnIgPSBiZWZzX2luaXRfaW5vZGVjYWNoZSgpOworCWlmIChlcnIpCisJCWdvdG8gdW5hcXVpcmVfbm9uZTsKKworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmJlZnNfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJZ290byB1bmFxdWlyZV9pbm9kZWNhY2hlOworCisJcmV0dXJuIDA7CisKK3VuYXF1aXJlX2lub2RlY2FjaGU6CisJYmVmc19kZXN0cm95X2lub2RlY2FjaGUoKTsKKwordW5hcXVpcmVfbm9uZToKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2V4aXRfYmVmc19mcyh2b2lkKQoreworCWJlZnNfZGVzdHJveV9pbm9kZWNhY2hlKCk7CisKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmJlZnNfZnNfdHlwZSk7Cit9CisKKy8qCitNYWNyb3MgdGhhdCB0eXBlY2hlY2sgdGhlIGluaXQgYW5kIGV4aXQgZnVuY3Rpb25zLAorZW5zdXJlcyB0aGF0IHRoZXkgYXJlIGNhbGxlZCBhdCBpbml0IGFuZCBjbGVhbnVwLAorYW5kIGVsaW1pbmF0ZXMgd2FybmluZ3MgYWJvdXQgdW51c2VkIGZ1bmN0aW9ucy4KKyovCittb2R1bGVfaW5pdChpbml0X2JlZnNfZnMpCittb2R1bGVfZXhpdChleGl0X2JlZnNfZnMpCmRpZmYgLS1naXQgYS9mcy9iZWZzL3N1cGVyLmMgYi9mcy9iZWZzL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU1N2FjYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvc3VwZXIuYwpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIHN1cGVyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBXaWxsIER5c29uIDx3aWxsX2R5c29uQHBvYm94LmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR05VIEdQTC4gU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjaW5jbHVkZSAiYmVmcy5oIgorI2luY2x1ZGUgInN1cGVyLmgiCisjaW5jbHVkZSAiZW5kaWFuLmgiCisKKy8qKgorICogbG9hZF9iZWZzX3NiIC0tIFJlYWQgZnJvbSBkaXNrIGFuZCBwcm9wZXJseSBieXRlc3dhcCBhbGwgdGhlIGZpZWxkcworICogb2YgdGhlIGJlZnMgc3VwZXJibG9jaworICoKKyAqCisgKgorICoKKyAqLworaW50CitiZWZzX2xvYWRfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19zdXBlcl9ibG9jayAqIGRpc2tfc2IpCit7CisJYmVmc19zYl9pbmZvICpiZWZzX3NiID0gQkVGU19TQihzYik7CisKKwkvKiBDaGVjayB0aGUgYnl0ZSBvcmRlciBvZiB0aGUgZmlsZXN5c3RlbSAqLworCWlmIChsZTMyX3RvX2NwdShkaXNrX3NiLT5mc19ieXRlX29yZGVyKSA9PSBCRUZTX0JZVEVPUkRFUl9OQVRJVkUpCisJICAgIGJlZnNfc2ItPmJ5dGVfb3JkZXIgPSBCRUZTX0JZVEVTRVhfTEU7CisJZWxzZSBpZiAoYmUzMl90b19jcHUoZGlza19zYi0+ZnNfYnl0ZV9vcmRlcikgPT0gQkVGU19CWVRFT1JERVJfTkFUSVZFKQorCSAgICBiZWZzX3NiLT5ieXRlX29yZGVyID0gQkVGU19CWVRFU0VYX0JFOwkKKworCWJlZnNfc2ItPm1hZ2ljMSA9IGZzMzJfdG9fY3B1KHNiLCBkaXNrX3NiLT5tYWdpYzEpOworCWJlZnNfc2ItPm1hZ2ljMiA9IGZzMzJfdG9fY3B1KHNiLCBkaXNrX3NiLT5tYWdpYzIpOworCWJlZnNfc2ItPm1hZ2ljMyA9IGZzMzJfdG9fY3B1KHNiLCBkaXNrX3NiLT5tYWdpYzMpOworCWJlZnNfc2ItPmJsb2NrX3NpemUgPSBmczMyX3RvX2NwdShzYiwgZGlza19zYi0+YmxvY2tfc2l6ZSk7CisJYmVmc19zYi0+YmxvY2tfc2hpZnQgPSBmczMyX3RvX2NwdShzYiwgZGlza19zYi0+YmxvY2tfc2hpZnQpOworCWJlZnNfc2ItPm51bV9ibG9ja3MgPSBmczY0X3RvX2NwdShzYiwgZGlza19zYi0+bnVtX2Jsb2Nrcyk7CisJYmVmc19zYi0+dXNlZF9ibG9ja3MgPSBmczY0X3RvX2NwdShzYiwgZGlza19zYi0+dXNlZF9ibG9ja3MpOworCWJlZnNfc2ItPmlub2RlX3NpemUgPSBmczMyX3RvX2NwdShzYiwgZGlza19zYi0+aW5vZGVfc2l6ZSk7CisKKwliZWZzX3NiLT5ibG9ja3NfcGVyX2FnID0gZnMzMl90b19jcHUoc2IsIGRpc2tfc2ItPmJsb2Nrc19wZXJfYWcpOworCWJlZnNfc2ItPmFnX3NoaWZ0ID0gZnMzMl90b19jcHUoc2IsIGRpc2tfc2ItPmFnX3NoaWZ0KTsKKwliZWZzX3NiLT5udW1fYWdzID0gZnMzMl90b19jcHUoc2IsIGRpc2tfc2ItPm51bV9hZ3MpOworCisJYmVmc19zYi0+bG9nX2Jsb2NrcyA9IGZzcnVuX3RvX2NwdShzYiwgZGlza19zYi0+bG9nX2Jsb2Nrcyk7CisJYmVmc19zYi0+bG9nX3N0YXJ0ID0gZnM2NF90b19jcHUoc2IsIGRpc2tfc2ItPmxvZ19zdGFydCk7CisJYmVmc19zYi0+bG9nX2VuZCA9IGZzNjRfdG9fY3B1KHNiLCBkaXNrX3NiLT5sb2dfZW5kKTsKKworCWJlZnNfc2ItPnJvb3RfZGlyID0gZnNydW5fdG9fY3B1KHNiLCBkaXNrX3NiLT5yb290X2Rpcik7CisJYmVmc19zYi0+aW5kaWNlcyA9IGZzcnVuX3RvX2NwdShzYiwgZGlza19zYi0+aW5kaWNlcyk7CisJYmVmc19zYi0+bmxzID0gTlVMTDsKKworCXJldHVybiBCRUZTX09LOworfQorCitpbnQKK2JlZnNfY2hlY2tfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwliZWZzX3NiX2luZm8gKmJlZnNfc2IgPSBCRUZTX1NCKHNiKTsKKworCS8qIENoZWNrIG1hZ2ljIGhlYWRlcnMgb2Ygc3VwZXIgYmxvY2sgKi8KKwlpZiAoKGJlZnNfc2ItPm1hZ2ljMSAhPSBCRUZTX1NVUEVSX01BR0lDMSkKKwkgICAgfHwgKGJlZnNfc2ItPm1hZ2ljMiAhPSBCRUZTX1NVUEVSX01BR0lDMikKKwkgICAgfHwgKGJlZnNfc2ItPm1hZ2ljMyAhPSBCRUZTX1NVUEVSX01BR0lDMykpIHsKKwkJYmVmc19lcnJvcihzYiwgImludmFsaWQgbWFnaWMgaGVhZGVyIik7CisJCXJldHVybiBCRUZTX0VSUjsKKwl9CisKKwkvKgorCSAqIENoZWNrIGJsb2Nrc2l6ZSBvZiBCRUZTLgorCSAqCisJICogQmxvY2tzaXplIG9mIEJFRlMgaXMgMTAyNCwgMjA0OCwgNDA5NiBvciA4MTkyLgorCSAqLworCisJaWYgKChiZWZzX3NiLT5ibG9ja19zaXplICE9IDEwMjQpCisJICAgICYmIChiZWZzX3NiLT5ibG9ja19zaXplICE9IDIwNDgpCisJICAgICYmIChiZWZzX3NiLT5ibG9ja19zaXplICE9IDQwOTYpCisJICAgICYmIChiZWZzX3NiLT5ibG9ja19zaXplICE9IDgxOTIpKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJpbnZhbGlkIGJsb2Nrc2l6ZTogJXUiLCBiZWZzX3NiLT5ibG9ja19zaXplKTsKKwkJcmV0dXJuIEJFRlNfRVJSOworCX0KKworCWlmIChiZWZzX3NiLT5ibG9ja19zaXplID4gUEFHRV9TSVpFKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJibG9ja3NpemUoJXUpIGNhbm5vdCBiZSBsYXJnZXIiCisJCQkgICAidGhhbiBzeXN0ZW0gcGFnZXNpemUoJWx1KSIsIGJlZnNfc2ItPmJsb2NrX3NpemUsCisJCQkgICBQQUdFX1NJWkUpOworCQlyZXR1cm4gQkVGU19FUlI7CisJfQorCisJLyoKKwkgICAqIGJsb2NrX3NoaWZ0IGFuZCBibG9ja19zaXplIGVuY29kZSB0aGUgc2FtZSBpbmZvcm1hdGlvbgorCSAgICogaW4gZGlmZmVyZW50IHdheXMgYXMgYSBjb25zaXN0ZW5jeSBjaGVjay4KKwkgKi8KKworCWlmICgoMSA8PCBiZWZzX3NiLT5ibG9ja19zaGlmdCkgIT0gYmVmc19zYi0+YmxvY2tfc2l6ZSkgeworCQliZWZzX2Vycm9yKHNiLCAiYmxvY2tfc2hpZnQgZGlzYWdyZWVzIHdpdGggYmxvY2tfc2l6ZS4gIgorCQkJICAgIkNvcnJ1cHRpb24gbGlrZWx5LiIpOworCQlyZXR1cm4gQkVGU19FUlI7CisJfQorCisJaWYgKGJlZnNfc2ItPmxvZ19zdGFydCAhPSBiZWZzX3NiLT5sb2dfZW5kKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJGaWxlc3lzdGVtIG5vdCBjbGVhbiEgVGhlcmUgYXJlIGJsb2NrcyBpbiB0aGUgIgorCQkJICAgImpvdXJuYWwuIFlvdSBtdXN0IGJvb3QgaW50byBCZU9TIGFuZCBtb3VudCB0aGlzIHZvbHVtZSAiCisJCQkgICAidG8gbWFrZSBpdCBjbGVhbi4iKTsKKwkJcmV0dXJuIEJFRlNfRVJSOworCX0KKworCXJldHVybiBCRUZTX09LOworfQpkaWZmIC0tZ2l0IGEvZnMvYmVmcy9zdXBlci5oIGIvZnMvYmVmcy9zdXBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNDU1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iZWZzL3N1cGVyLmgKQEAgLTAsMCArMSw4IEBACisvKgorICogc3VwZXIuaAorICovCisKK2ludCBiZWZzX2xvYWRfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19zdXBlcl9ibG9jayAqIGRpc2tfc2IpOworCitpbnQgYmVmc19jaGVja19zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKwpkaWZmIC0tZ2l0IGEvZnMvYmZzL01ha2VmaWxlIGIvZnMvYmZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ODdiMzYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iZnMvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciBCRlMgZmlsZXN5c3RlbS4KKyMKKworb2JqLSQoQ09ORklHX0JGU19GUykgKz0gYmZzLm8KKworYmZzLW9ianMgOj0gaW5vZGUubyBmaWxlLm8gZGlyLm8KZGlmZiAtLWdpdCBhL2ZzL2Jmcy9iZnMuaCBiL2ZzL2Jmcy9iZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDIwZGJjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYmZzL2Jmcy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKglmcy9iZnMvYmZzLmgKKyAqCUNvcHlyaWdodCAoQykgMTk5OSBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqLworI2lmbmRlZiBfRlNfQkZTX0JGU19ICisjZGVmaW5lIF9GU19CRlNfQkZTX0gKKworI2luY2x1ZGUgPGxpbnV4L2Jmc19mcy5oPgorCisvKgorICogQkZTIGZpbGUgc3lzdGVtIGluLWNvcmUgc3VwZXJibG9jayBpbmZvCisgKi8KK3N0cnVjdCBiZnNfc2JfaW5mbyB7CisJdW5zaWduZWQgbG9uZyBzaV9ibG9ja3M7CisJdW5zaWduZWQgbG9uZyBzaV9mcmVlYjsKKwl1bnNpZ25lZCBsb25nIHNpX2ZyZWVpOworCXVuc2lnbmVkIGxvbmcgc2lfbGZfaW9mZjsKKwl1bnNpZ25lZCBsb25nIHNpX2xmX3NibGs7CisJdW5zaWduZWQgbG9uZyBzaV9sZl9lYmxrOworCXVuc2lnbmVkIGxvbmcgc2lfbGFzdGk7CisJdW5zaWduZWQgbG9uZyAqIHNpX2ltYXA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogc2lfc2JoOwkJLyogYnVmZmVyIGhlYWRlciB3L3N1cGVyYmxvY2sgKi8KKwlzdHJ1Y3QgYmZzX3N1cGVyX2Jsb2NrICogc2lfYmZzX3NiOwkvKiBzdXBlcmJsb2NrIGluIHNpX3NiaC0+Yl9kYXRhICovCit9OworCisvKgorICogQkZTIGZpbGUgc3lzdGVtIGluLWNvcmUgaW5vZGUgaW5mbworICovCitzdHJ1Y3QgYmZzX2lub2RlX2luZm8geworCXVuc2lnbmVkIGxvbmcgaV9kc2tfaW5vOyAvKiBpbm9kZSBudW1iZXIgZnJvbSB0aGUgZGlzaywgY2FuIGJlIDAgKi8KKwl1bnNpZ25lZCBsb25nIGlfc2Jsb2NrOworCXVuc2lnbmVkIGxvbmcgaV9lYmxvY2s7CisJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJmc19zYl9pbmZvICpCRlNfU0Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gc2ItPnNfZnNfaW5mbzsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYmZzX2lub2RlX2luZm8gKkJGU19JKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGxpc3RfZW50cnkoaW5vZGUsIHN0cnVjdCBiZnNfaW5vZGVfaW5mbywgdmZzX2lub2RlKTsKK30KKworCisjZGVmaW5lIHByaW50Zihmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9FUlIgIkJGUy1mczogJXMoKTogIiBmb3JtYXQsIF9fRlVOQ1RJT05fXywgIyMgYXJncykKKworCisvKiBmaWxlLmMgKi8KK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBiZnNfZmlsZV9pbm9wczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJmc19maWxlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBiZnNfYW9wczsKKworLyogZGlyLmMgKi8KK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBiZnNfZGlyX2lub3BzOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYmZzX2Rpcl9vcGVyYXRpb25zOworCisjZW5kaWYgLyogX0ZTX0JGU19CRlNfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYmZzL2Rpci5jIGIvZnMvYmZzL2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMWU1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iZnMvZGlyLmMKQEAgLTAsMCArMSwzNjIgQEAKKy8qCisgKglmcy9iZnMvZGlyLmMKKyAqCUJGUyBkaXJlY3Rvcnkgb3BlcmF0aW9ucy4KKyAqCUNvcHlyaWdodCAoQykgMTk5OSwyMDAwICBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSAiYmZzLmgiCisKKyN1bmRlZiBERUJVRworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgZHByaW50Zih4Li4uKQlwcmludGYoeCkKKyNlbHNlCisjZGVmaW5lIGRwcmludGYoeC4uLikKKyNlbmRpZgorCitzdGF0aWMgaW50IGJmc19hZGRfZW50cnkoc3RydWN0IGlub2RlICogZGlyLCBjb25zdCBjaGFyICogbmFtZSwgaW50IG5hbWVsZW4sIGludCBpbm8pOworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJmc19maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqIGRpciwgCisJY29uc3QgY2hhciAqIG5hbWUsIGludCBuYW1lbGVuLCBzdHJ1Y3QgYmZzX2RpcmVudCAqKiByZXNfZGlyKTsKKworc3RhdGljIGludCBiZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGYsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBpbm9kZSAqIGRpciA9IGYtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBiZnNfZGlyZW50ICogZGU7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwlpbnQgYmxvY2s7CisKKwlsb2NrX2tlcm5lbCgpOworCisJaWYgKGYtPmZfcG9zICYgKEJGU19ESVJFTlRfU0laRS0xKSkgeworCQlwcmludGYoIkJhZCBmX3Bvcz0lMDhseCBmb3IgJXM6JTA4bHhcbiIsICh1bnNpZ25lZCBsb25nKWYtPmZfcG9zLCAKKwkJCWRpci0+aV9zYi0+c19pZCwgZGlyLT5pX2lubyk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FQkFERjsKKwl9CisKKwl3aGlsZSAoZi0+Zl9wb3MgPCBkaXItPmlfc2l6ZSkgeworCQlvZmZzZXQgPSBmLT5mX3BvcyAmIChCRlNfQlNJWkUtMSk7CisJCWJsb2NrID0gQkZTX0koZGlyKS0+aV9zYmxvY2sgKyAoZi0+Zl9wb3MgPj4gQkZTX0JTSVpFX0JJVFMpOworCQliaCA9IHNiX2JyZWFkKGRpci0+aV9zYiwgYmxvY2spOworCQlpZiAoIWJoKSB7CisJCQlmLT5mX3BvcyArPSBCRlNfQlNJWkUgLSBvZmZzZXQ7CisJCQljb250aW51ZTsKKwkJfQorCQlkbyB7CisJCQlkZSA9IChzdHJ1Y3QgYmZzX2RpcmVudCAqKShiaC0+Yl9kYXRhICsgb2Zmc2V0KTsKKwkJCWlmIChkZS0+aW5vKSB7CisJCQkJaW50IHNpemUgPSBzdHJubGVuKGRlLT5uYW1lLCBCRlNfTkFNRUxFTik7CisJCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBkZS0+bmFtZSwgc2l6ZSwgZi0+Zl9wb3MsIGRlLT5pbm8sIERUX1VOS05PV04pIDwgMCkgeworCQkJCQlicmVsc2UoYmgpOworCQkJCQl1bmxvY2tfa2VybmVsKCk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJCW9mZnNldCArPSBCRlNfRElSRU5UX1NJWkU7CisJCQlmLT5mX3BvcyArPSBCRlNfRElSRU5UX1NJWkU7CisJCX0gd2hpbGUgKG9mZnNldCA8IEJGU19CU0laRSAmJiBmLT5mX3BvcyA8IGRpci0+aV9zaXplKTsKKwkJYnJlbHNlKGJoKTsKKwl9CisKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7CQorfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJmc19kaXJfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gYmZzX3JlYWRkaXIsCisJLmZzeW5jCQk9IGZpbGVfZnN5bmMsCit9OworCitleHRlcm4gdm9pZCBkdW1wX2ltYXAoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CisKK3N0YXRpYyBpbnQgYmZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGludCBtb2RlLAorCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHMgPSBkaXItPmlfc2I7CisJc3RydWN0IGJmc19zYl9pbmZvICogaW5mbyA9IEJGU19TQihzKTsKKwl1bnNpZ25lZCBsb25nIGlubzsKKworCWlub2RlID0gbmV3X2lub2RlKHMpOworCWlmICghaW5vZGUpCisJCXJldHVybiAtRU5PU1BDOworCWxvY2tfa2VybmVsKCk7CisJaW5vID0gZmluZF9maXJzdF96ZXJvX2JpdChpbmZvLT5zaV9pbWFwLCBpbmZvLT5zaV9sYXN0aSk7CisJaWYgKGlubyA+IGluZm8tPnNpX2xhc3RpKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKwlzZXRfYml0KGlubywgaW5mby0+c2lfaW1hcCk7CQorCWluZm8tPnNpX2ZyZWVpLS07CisJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJaW5vZGUtPmlfZ2lkID0gKGRpci0+aV9tb2RlICYgU19JU0dJRCkgPyBkaXItPmlfZ2lkIDogY3VycmVudC0+ZnNnaWQ7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpbm9kZS0+aV9ibG9ja3MgPSBpbm9kZS0+aV9ibGtzaXplID0gMDsKKwlpbm9kZS0+aV9vcCA9ICZiZnNfZmlsZV9pbm9wczsKKwlpbm9kZS0+aV9mb3AgPSAmYmZzX2ZpbGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZiZnNfYW9wczsKKwlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwlpbm9kZS0+aV9pbm8gPSBpbm87CisJQkZTX0koaW5vZGUpLT5pX2Rza19pbm8gPSBpbm87CisJQkZTX0koaW5vZGUpLT5pX3NibG9jayA9IDA7CisJQkZTX0koaW5vZGUpLT5pX2VibG9jayA9IDA7CisJaW5zZXJ0X2lub2RlX2hhc2goaW5vZGUpOworICAgICAgICBtYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlkdW1wX2ltYXAoImNyZWF0ZSIscyk7CisKKwllcnIgPSBiZnNfYWRkX2VudHJ5KGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCBpbm9kZS0+aV9pbm8pOworCWlmIChlcnIpIHsKKwkJaW5vZGUtPmlfbmxpbmstLTsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCWlwdXQoaW5vZGUpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiBlcnI7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqIGJmc19sb29rdXAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IGJmc19kaXJlbnQgKiBkZTsKKworCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiBCRlNfTkFNRUxFTikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CisKKwlsb2NrX2tlcm5lbCgpOworCWJoID0gYmZzX2ZpbmRfZW50cnkoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sICZkZSk7CisJaWYgKGJoKSB7CisJCXVuc2lnbmVkIGxvbmcgaW5vID0gbGUzMl90b19jcHUoZGUtPmlubyk7CisJCWJyZWxzZShiaCk7CisJCWlub2RlID0gaWdldChkaXItPmlfc2IsIGlubyk7CisJCWlmICghaW5vZGUpIHsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCQl9CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBiZnNfbGluayhzdHJ1Y3QgZGVudHJ5ICogb2xkLCBzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBuZXcpCit7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBvbGQtPmRfaW5vZGU7CisJaW50IGVycjsKKworCWxvY2tfa2VybmVsKCk7CisJZXJyID0gYmZzX2FkZF9lbnRyeShkaXIsIG5ldy0+ZF9uYW1lLm5hbWUsIG5ldy0+ZF9uYW1lLmxlbiwgaW5vZGUtPmlfaW5vKTsKKwlpZiAoZXJyKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaW5vZGUtPmlfbmxpbmsrKzsKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJYXRvbWljX2luYygmaW5vZGUtPmlfY291bnQpOworCWRfaW5zdGFudGlhdGUobmV3LCBpbm9kZSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYmZzX3VubGluayhzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCit7CisJaW50IGVycm9yID0gLUVOT0VOVDsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgYmZzX2RpcmVudCAqIGRlOworCisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJbG9ja19rZXJuZWwoKTsKKwliaCA9IGJmc19maW5kX2VudHJ5KGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCAmZGUpOworCWlmICghYmggfHwgZGUtPmlubyAhPSBpbm9kZS0+aV9pbm8pIAorCQlnb3RvIG91dF9icmVsc2U7CisKKwlpZiAoIWlub2RlLT5pX25saW5rKSB7CisJCXByaW50ZigidW5saW5raW5nIG5vbi1leGlzdGVudCBmaWxlICVzOiVsdSAobmxpbms9JWQpXG4iLCBpbm9kZS0+aV9zYi0+c19pZCwgCisJCQkJaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluayk7CisJCWlub2RlLT5pX25saW5rID0gMTsKKwl9CisJZGUtPmlubyA9IDA7CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWRpci0+aV9jdGltZSA9IGRpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCWlub2RlLT5pX25saW5rLS07CisJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWU7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJZXJyb3IgPSAwOworCitvdXRfYnJlbHNlOgorCWJyZWxzZShiaCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBiZnNfcmVuYW1lKHN0cnVjdCBpbm9kZSAqIG9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKiBvbGRfZGVudHJ5LCAKKwkJCXN0cnVjdCBpbm9kZSAqIG5ld19kaXIsIHN0cnVjdCBkZW50cnkgKiBuZXdfZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqIG9sZF9pbm9kZSwgKiBuZXdfaW5vZGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogb2xkX2JoLCAqIG5ld19iaDsKKwlzdHJ1Y3QgYmZzX2RpcmVudCAqIG9sZF9kZSwgKiBuZXdfZGU7CQkKKwlpbnQgZXJyb3IgPSAtRU5PRU5UOworCisJb2xkX2JoID0gbmV3X2JoID0gTlVMTDsKKwlvbGRfaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCWlmIChTX0lTRElSKG9sZF9pbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NrX2tlcm5lbCgpOworCW9sZF9iaCA9IGJmc19maW5kX2VudHJ5KG9sZF9kaXIsIAorCQkJCW9sZF9kZW50cnktPmRfbmFtZS5uYW1lLCAKKwkJCQlvbGRfZGVudHJ5LT5kX25hbWUubGVuLCAmb2xkX2RlKTsKKworCWlmICghb2xkX2JoIHx8IG9sZF9kZS0+aW5vICE9IG9sZF9pbm9kZS0+aV9pbm8pCisJCWdvdG8gZW5kX3JlbmFtZTsKKworCWVycm9yID0gLUVQRVJNOworCW5ld19pbm9kZSA9IG5ld19kZW50cnktPmRfaW5vZGU7CisJbmV3X2JoID0gYmZzX2ZpbmRfZW50cnkobmV3X2RpciwgCisJCQkJbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsIAorCQkJCW5ld19kZW50cnktPmRfbmFtZS5sZW4sICZuZXdfZGUpOworCisJaWYgKG5ld19iaCAmJiAhbmV3X2lub2RlKSB7CisJCWJyZWxzZShuZXdfYmgpOworCQluZXdfYmggPSBOVUxMOworCX0KKwlpZiAoIW5ld19iaCkgeworCQllcnJvciA9IGJmc19hZGRfZW50cnkobmV3X2RpciwgCisJCQkJCW5ld19kZW50cnktPmRfbmFtZS5uYW1lLAorCQkJIAkJbmV3X2RlbnRyeS0+ZF9uYW1lLmxlbiwgb2xkX2lub2RlLT5pX2lubyk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZW5kX3JlbmFtZTsKKwl9CisJb2xkX2RlLT5pbm8gPSAwOworCW9sZF9kaXItPmlfY3RpbWUgPSBvbGRfZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KG9sZF9kaXIpOworCWlmIChuZXdfaW5vZGUpIHsKKwkJbmV3X2lub2RlLT5pX25saW5rLS07CisJCW5ld19pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJCW1hcmtfaW5vZGVfZGlydHkobmV3X2lub2RlKTsKKwl9CisJbWFya19idWZmZXJfZGlydHkob2xkX2JoKTsKKwllcnJvciA9IDA7CisKK2VuZF9yZW5hbWU6CisJdW5sb2NrX2tlcm5lbCgpOworCWJyZWxzZShvbGRfYmgpOworCWJyZWxzZShuZXdfYmgpOworCXJldHVybiBlcnJvcjsKK30KKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYmZzX2Rpcl9pbm9wcyA9IHsKKwkuY3JlYXRlCQkJPSBiZnNfY3JlYXRlLAorCS5sb29rdXAJCQk9IGJmc19sb29rdXAsCisJLmxpbmsJCQk9IGJmc19saW5rLAorCS51bmxpbmsJCQk9IGJmc191bmxpbmssCisJLnJlbmFtZQkJCT0gYmZzX3JlbmFtZSwKK307CisKK3N0YXRpYyBpbnQgYmZzX2FkZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKiBkaXIsIGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGlubykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgYmZzX2RpcmVudCAqIGRlOworCWludCBibG9jaywgc2Jsb2NrLCBlYmxvY2ssIG9mZiwgZW9mZjsKKwlpbnQgaTsKKworCWRwcmludGYoIm5hbWU9JXMsIG5hbWVsZW49JWRcbiIsIG5hbWUsIG5hbWVsZW4pOworCisJaWYgKCFuYW1lbGVuKQorCQlyZXR1cm4gLUVOT0VOVDsKKwlpZiAobmFtZWxlbiA+IEJGU19OQU1FTEVOKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXNibG9jayA9IEJGU19JKGRpciktPmlfc2Jsb2NrOworCWVibG9jayA9IEJGU19JKGRpciktPmlfZWJsb2NrOworCWVvZmYgPSBkaXItPmlfc2l6ZSAlIEJGU19CU0laRTsKKwlmb3IgKGJsb2NrPXNibG9jazsgYmxvY2s8PWVibG9jazsgYmxvY2srKykgeworCQliaCA9IHNiX2JyZWFkKGRpci0+aV9zYiwgYmxvY2spOworCQlpZighYmgpIAorCQkJcmV0dXJuIC1FTk9TUEM7CisJCWZvciAob2ZmPTA7IG9mZjxCRlNfQlNJWkU7IG9mZis9QkZTX0RJUkVOVF9TSVpFKSB7CisJCQlkZSA9IChzdHJ1Y3QgYmZzX2RpcmVudCAqKShiaC0+Yl9kYXRhICsgb2ZmKTsKKwkJCWlmIChibG9jaz09ZWJsb2NrICYmIG9mZj49ZW9mZikgeworCQkJCS8qIERvIG5vdCByZWFkL2ludGVycHJldCB0aGUgZ2FyYmFnZSBpbiB0aGUgZW5kIG9mIGVibG9jay4gKi8KKwkJCQlkZS0+aW5vID0gMDsKKwkJCX0KKwkJCWlmICghZGUtPmlubykgeworCQkJCWlmICgoYmxvY2stc2Jsb2NrKSpCRlNfQlNJWkUgKyBvZmYgPj0gZGlyLT5pX3NpemUpIHsKKwkJCQkJZGlyLT5pX3NpemUgKz0gQkZTX0RJUkVOVF9TSVpFOworCQkJCQlkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQkJCX0KKwkJCQlkaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQkJCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKKwkJCQlkZS0+aW5vID0gaW5vOworCQkJCWZvciAoaT0wOyBpPEJGU19OQU1FTEVOOyBpKyspCisJCQkJCWRlLT5uYW1lW2ldID0gKGkgPCBuYW1lbGVuKSA/IG5hbWVbaV0gOiAwOworCQkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCQlicmVsc2UoYmgpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCWJyZWxzZShiaCk7CisJfQorCXJldHVybiAtRU5PU1BDOworfQorCitzdGF0aWMgaW5saW5lIGludCBiZnNfbmFtZWNtcChpbnQgbGVuLCBjb25zdCBjaGFyICogbmFtZSwgY29uc3QgY2hhciAqIGJ1ZmZlcikKK3sKKwlpZiAobGVuIDwgQkZTX05BTUVMRU4gJiYgYnVmZmVyW2xlbl0pCisJCXJldHVybiAwOworCXJldHVybiAhbWVtY21wKG5hbWUsIGJ1ZmZlciwgbGVuKTsKK30KKworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJmc19maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqIGRpciwgCisJY29uc3QgY2hhciAqIG5hbWUsIGludCBuYW1lbGVuLCBzdHJ1Y3QgYmZzX2RpcmVudCAqKiByZXNfZGlyKQoreworCXVuc2lnbmVkIGxvbmcgYmxvY2ssIG9mZnNldDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgYmZzX2RpcmVudCAqIGRlOworCisJKnJlc19kaXIgPSBOVUxMOworCWlmIChuYW1lbGVuID4gQkZTX05BTUVMRU4pCisJCXJldHVybiBOVUxMOworCWJoID0gTlVMTDsKKwlibG9jayA9IG9mZnNldCA9IDA7CisJd2hpbGUgKGJsb2NrICogQkZTX0JTSVpFICsgb2Zmc2V0IDwgZGlyLT5pX3NpemUpIHsKKwkJaWYgKCFiaCkgeworCQkJYmggPSBzYl9icmVhZChkaXItPmlfc2IsIEJGU19JKGRpciktPmlfc2Jsb2NrICsgYmxvY2spOworCQkJaWYgKCFiaCkgeworCQkJCWJsb2NrKys7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJZGUgPSAoc3RydWN0IGJmc19kaXJlbnQgKikoYmgtPmJfZGF0YSArIG9mZnNldCk7CisJCW9mZnNldCArPSBCRlNfRElSRU5UX1NJWkU7CisJCWlmIChkZS0+aW5vICYmIGJmc19uYW1lY21wKG5hbWVsZW4sIG5hbWUsIGRlLT5uYW1lKSkgeworCQkJKnJlc19kaXIgPSBkZTsKKwkJCXJldHVybiBiaDsKKwkJfQorCQlpZiAob2Zmc2V0IDwgYmgtPmJfc2l6ZSkKKwkJCWNvbnRpbnVlOworCQlicmVsc2UoYmgpOworCQliaCA9IE5VTEw7CisJCW9mZnNldCA9IDA7CisJCWJsb2NrKys7CisJfQorCWJyZWxzZShiaCk7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9mcy9iZnMvZmlsZS5jIGIvZnMvYmZzL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDdmZDFlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYmZzL2ZpbGUuYwpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqCWZzL2Jmcy9maWxlLmMKKyAqCUJGUyBmaWxlIG9wZXJhdGlvbnMuCisgKglDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSAiYmZzLmgiCisKKyN1bmRlZiBERUJVRworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgZHByaW50Zih4Li4uKQlwcmludGYoeCkKKyNlbHNlCisjZGVmaW5lIGRwcmludGYoeC4uLikKKyNlbmRpZgorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJmc19maWxlX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlayAJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfZmlsZV9yZWFkLAorCS53cml0ZQkJPSBnZW5lcmljX2ZpbGVfd3JpdGUsCisJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCisJLnNlbmRmaWxlCT0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorfTsKKworc3RhdGljIGludCBiZnNfbW92ZV9ibG9jayh1bnNpZ25lZCBsb25nIGZyb20sIHVuc2lnbmVkIGxvbmcgdG8sIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKm5ldzsKKworCWJoID0gc2JfYnJlYWQoc2IsIGZyb20pOworCWlmICghYmgpCisJCXJldHVybiAtRUlPOworCW5ldyA9IHNiX2dldGJsayhzYiwgdG8pOworCW1lbWNweShuZXctPmJfZGF0YSwgYmgtPmJfZGF0YSwgYmgtPmJfc2l6ZSk7CisJbWFya19idWZmZXJfZGlydHkobmV3KTsKKwliZm9yZ2V0KGJoKTsKKwlicmVsc2UobmV3KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZnNfbW92ZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsIAorCQkJCXVuc2lnbmVkIGxvbmcgd2hlcmUpCit7CisJdW5zaWduZWQgbG9uZyBpOworCisJZHByaW50ZigiJTA4bHgtJTA4bHgtPiUwOGx4XG4iLCBzdGFydCwgZW5kLCB3aGVyZSk7CisJZm9yIChpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspCisJCWlmKGJmc19tb3ZlX2Jsb2NrKGksIHdoZXJlICsgaSwgc2IpKSB7CisJCQlkcHJpbnRmKCJmYWlsZWQgdG8gbW92ZSBibG9jayAlMDhseCAtPiAlMDhseFxuIiwgaSwgd2hlcmUgKyBpKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc2VjdG9yX3QgYmxvY2ssIAorCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK3sKKwlsb25nIHBoeXM7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJmc19zYl9pbmZvICppbmZvID0gQkZTX1NCKHNiKTsKKwlzdHJ1Y3QgYmZzX2lub2RlX2luZm8gKmJpID0gQkZTX0koaW5vZGUpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqc2JoID0gaW5mby0+c2lfc2JoOworCisJaWYgKGJsb2NrIDwgMCB8fCBibG9jayA+IGluZm8tPnNpX2Jsb2NrcykKKwkJcmV0dXJuIC1FSU87CisKKwlwaHlzID0gYmktPmlfc2Jsb2NrICsgYmxvY2s7CisJaWYgKCFjcmVhdGUpIHsKKwkJaWYgKHBoeXMgPD0gYmktPmlfZWJsb2NrKSB7CisJCQlkcHJpbnRmKCJjPSVkLCBiPSUwOGx4LCBwaHlzPSUwOGx4IChncmFudGVkKVxuIiwgY3JlYXRlLCBibG9jaywgcGh5cyk7CisJCQltYXBfYmgoYmhfcmVzdWx0LCBzYiwgcGh5cyk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJLyogaWYgdGhlIGZpbGUgaXMgbm90IGVtcHR5IGFuZCB0aGUgcmVxdWVzdGVkIGJsb2NrIGlzIHdpdGhpbiB0aGUgcmFuZ2UKKwkgICBvZiBibG9ja3MgYWxsb2NhdGVkIGZvciB0aGlzIGZpbGUsIHdlIGNhbiBncmFudCBpdCAqLworCWlmIChpbm9kZS0+aV9zaXplICYmIHBoeXMgPD0gYmktPmlfZWJsb2NrKSB7CisJCWRwcmludGYoImM9JWQsIGI9JTA4bHgsIHBoeXM9JTA4bHggKGludGVyaW0gYmxvY2sgZ3JhbnRlZClcbiIsIAorCQkJCWNyZWF0ZSwgYmxvY2ssIHBoeXMpOworCQltYXBfYmgoYmhfcmVzdWx0LCBzYiwgcGh5cyk7CisJCXJldHVybiAwOworCX0KKworCS8qIHRoZSByZXN0IGhhcyB0byBiZSBwcm90ZWN0ZWQgYWdhaW5zdCBpdHNlbGYgKi8KKwlsb2NrX2tlcm5lbCgpOworCisJLyogaWYgdGhlIGxhc3QgZGF0YSBibG9jayBmb3IgdGhpcyBmaWxlIGlzIHRoZSBsYXN0IGFsbG9jYXRlZCBibG9jaywgd2UgY2FuCisJICAgZXh0ZW5kIHRoZSBmaWxlIHRyaXZpYWxseSwgd2l0aG91dCBtb3ZpbmcgaXQgYW55d2hlcmUgKi8KKwlpZiAoYmktPmlfZWJsb2NrID09IGluZm8tPnNpX2xmX2VibGspIHsKKwkJZHByaW50ZigiYz0lZCwgYj0lMDhseCwgcGh5cz0lMDhseCAoc2ltcGxlIGV4dGVuc2lvbilcbiIsIAorCQkJCWNyZWF0ZSwgYmxvY2ssIHBoeXMpOworCQltYXBfYmgoYmhfcmVzdWx0LCBzYiwgcGh5cyk7CisJCWluZm8tPnNpX2ZyZWViIC09IHBoeXMgLSBiaS0+aV9lYmxvY2s7CisJCWluZm8tPnNpX2xmX2VibGsgPSBiaS0+aV9lYmxvY2sgPSBwaHlzOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJbWFya19idWZmZXJfZGlydHkoc2JoKTsKKwkJZXJyID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogT2ssIHdlIGhhdmUgdG8gbW92ZSB0aGlzIGVudGlyZSBmaWxlIHRvIHRoZSBuZXh0IGZyZWUgYmxvY2sgKi8KKwlwaHlzID0gaW5mby0+c2lfbGZfZWJsayArIDE7CisJaWYgKGJpLT5pX3NibG9jaykgeyAvKiBpZiBkYXRhIHN0YXJ0cyBvbiBibG9jayAwIHRoZW4gdGhlcmUgaXMgbm8gZGF0YSAqLworCQllcnIgPSBiZnNfbW92ZV9ibG9ja3MoaW5vZGUtPmlfc2IsIGJpLT5pX3NibG9jaywgCisJCQkJYmktPmlfZWJsb2NrLCBwaHlzKTsKKwkJaWYgKGVycikgeworCQkJZHByaW50ZigiZmFpbGVkIHRvIG1vdmUgaW5vPSUwOGx4IC0+IGZzIGNvcnJ1cHRpb25cbiIsIGlub2RlLT5pX2lubyk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZQorCQllcnIgPSAwOworCisJZHByaW50ZigiYz0lZCwgYj0lMDhseCwgcGh5cz0lMDhseCAobW92ZWQpXG4iLCBjcmVhdGUsIGJsb2NrLCBwaHlzKTsKKwliaS0+aV9zYmxvY2sgPSBwaHlzOworCXBoeXMgKz0gYmxvY2s7CisJaW5mby0+c2lfbGZfZWJsayA9IGJpLT5pX2VibG9jayA9IHBoeXM7CisKKwkvKiB0aGlzIGFzc3VtZXMgbm90aGluZyBjYW4gd3JpdGUgdGhlIGlub2RlIGJhY2sgd2hpbGUgd2UgYXJlIGhlcmUKKwkgKiBhbmQgdGh1cyB1cGRhdGUgaW5vZGUtPmlfYmxvY2tzISAoWFhYKSovCisJaW5mby0+c2lfZnJlZWIgLT0gYmktPmlfZWJsb2NrIC0gYmktPmlfc2Jsb2NrICsgMSAtIGlub2RlLT5pX2Jsb2NrczsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShzYmgpOworCW1hcF9iaChiaF9yZXN1bHQsIHNiLCBwaHlzKTsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiZnNfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlyZXR1cm4gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIGJmc19nZXRfYmxvY2ssIHdiYyk7Cit9CisKK3N0YXRpYyBpbnQgYmZzX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gYmxvY2tfcmVhZF9mdWxsX3BhZ2UocGFnZSwgYmZzX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgYmZzX3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlyZXR1cm4gYmxvY2tfcHJlcGFyZV93cml0ZShwYWdlLCBmcm9tLCB0bywgYmZzX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBzZWN0b3JfdCBiZnNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2spCit7CisJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLCBibG9jaywgYmZzX2dldF9ibG9jayk7Cit9CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgYmZzX2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gYmZzX3JlYWRwYWdlLAorCS53cml0ZXBhZ2UJPSBiZnNfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UJPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUJPSBiZnNfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gZ2VuZXJpY19jb21taXRfd3JpdGUsCisJLmJtYXAJCT0gYmZzX2JtYXAsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBiZnNfZmlsZV9pbm9wczsKZGlmZiAtLWdpdCBhL2ZzL2Jmcy9pbm9kZS5jIGIvZnMvYmZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRlMGZiMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Jmcy9pbm9kZS5jCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICoJZnMvYmZzL2lub2RlLmMKKyAqCUJGUyBzdXBlcmJsb2NrIGFuZCBpbm9kZSBvcGVyYXRpb25zLgorICoJQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKglGcm9tIGZzL21pbml4LCBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgImJmcy5oIgorCitNT0RVTEVfQVVUSE9SKCJUaWdyYW4gQS4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0NPIFVuaXhXYXJlIEJGUyBmaWxlc3lzdGVtIGZvciBMaW51eCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjdW5kZWYgREVCVUcKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIGRwcmludGYoeC4uLikJcHJpbnRmKHgpCisjZWxzZQorI2RlZmluZSBkcHJpbnRmKHguLi4pCisjZW5kaWYKKwordm9pZCBkdW1wX2ltYXAoY29uc3QgY2hhciAqcHJlZml4LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKTsKKworc3RhdGljIHZvaWQgYmZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJdW5zaWduZWQgbG9uZyBpbm8gPSBpbm9kZS0+aV9pbm87CisJc3RydWN0IGJmc19pbm9kZSAqIGRpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCWludCBibG9jaywgb2ZmOworCisJaWYgKGlubyA8IEJGU19ST09UX0lOTyB8fCBpbm8gPiBCRlNfU0IoaW5vZGUtPmlfc2IpLT5zaV9sYXN0aSkgeworCQlwcmludGYoIkJhZCBpbm9kZSBudW1iZXIgJXM6JTA4bHhcbiIsIGlub2RlLT5pX3NiLT5zX2lkLCBpbm8pOworCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCXJldHVybjsKKwl9CisKKwlibG9jayA9IChpbm8gLSBCRlNfUk9PVF9JTk8pL0JGU19JTk9ERVNfUEVSX0JMT0NLICsgMTsKKwliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBibG9jayk7CisJaWYgKCFiaCkgeworCQlwcmludGYoIlVuYWJsZSB0byByZWFkIGlub2RlICVzOiUwOGx4XG4iLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vKTsKKwkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQlyZXR1cm47CisJfQorCisJb2ZmID0gKGlubyAtIEJGU19ST09UX0lOTykgJSBCRlNfSU5PREVTX1BFUl9CTE9DSzsKKwlkaSA9IChzdHJ1Y3QgYmZzX2lub2RlICopYmgtPmJfZGF0YSArIG9mZjsKKworCWlub2RlLT5pX21vZGUgPSAweDAwMDBGRkZGICYgZGktPmlfbW9kZTsKKwlpZiAoZGktPmlfdnR5cGUgPT0gQkZTX1ZESVIpIHsKKwkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGRElSOworCQlpbm9kZS0+aV9vcCA9ICZiZnNfZGlyX2lub3BzOworCQlpbm9kZS0+aV9mb3AgPSAmYmZzX2Rpcl9vcGVyYXRpb25zOworCX0gZWxzZSBpZiAoZGktPmlfdnR5cGUgPT0gQkZTX1ZSRUcpIHsKKwkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGUkVHOworCQlpbm9kZS0+aV9vcCA9ICZiZnNfZmlsZV9pbm9wczsKKwkJaW5vZGUtPmlfZm9wID0gJmJmc19maWxlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmJmc19hb3BzOworCX0KKworCWlub2RlLT5pX3VpZCA9IGRpLT5pX3VpZDsKKwlpbm9kZS0+aV9naWQgPSBkaS0+aV9naWQ7CisJaW5vZGUtPmlfbmxpbmsgPSBkaS0+aV9ubGluazsKKwlpbm9kZS0+aV9zaXplID0gQkZTX0ZJTEVTSVpFKGRpKTsKKwlpbm9kZS0+aV9ibG9ja3MgPSBCRlNfRklMRUJMT0NLUyhkaSk7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfU0laRTsKKwlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBkaS0+aV9hdGltZTsKKwlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBkaS0+aV9tdGltZTsKKwlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBkaS0+aV9jdGltZTsKKwlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKKwlCRlNfSShpbm9kZSktPmlfZHNrX2lubyA9IGRpLT5pX2lubzsgLyogY2FuIGJlIDAgc28gd2Ugc3RvcmUgYSBjb3B5ICovCisJQkZTX0koaW5vZGUpLT5pX3NibG9jayA9IGRpLT5pX3NibG9jazsKKwlCRlNfSShpbm9kZSktPmlfZWJsb2NrID0gZGktPmlfZWJsb2NrOworCisJYnJlbHNlKGJoKTsKK30KKworc3RhdGljIGludCBiZnNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUsIGludCB1bnVzZWQpCit7CisJdW5zaWduZWQgbG9uZyBpbm8gPSBpbm9kZS0+aV9pbm87CisJc3RydWN0IGJmc19pbm9kZSAqIGRpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCWludCBibG9jaywgb2ZmOworCisJaWYgKGlubyA8IEJGU19ST09UX0lOTyB8fCBpbm8gPiBCRlNfU0IoaW5vZGUtPmlfc2IpLT5zaV9sYXN0aSkgeworCQlwcmludGYoIkJhZCBpbm9kZSBudW1iZXIgJXM6JTA4bHhcbiIsIGlub2RlLT5pX3NiLT5zX2lkLCBpbm8pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlsb2NrX2tlcm5lbCgpOworCWJsb2NrID0gKGlubyAtIEJGU19ST09UX0lOTykvQkZTX0lOT0RFU19QRVJfQkxPQ0sgKyAxOworCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIGJsb2NrKTsKKwlpZiAoIWJoKSB7CisJCXByaW50ZigiVW5hYmxlIHRvIHJlYWQgaW5vZGUgJXM6JTA4bHhcbiIsIGlub2RlLT5pX3NiLT5zX2lkLCBpbm8pOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlPOworCX0KKworCW9mZiA9IChpbm8gLSBCRlNfUk9PVF9JTk8pJUJGU19JTk9ERVNfUEVSX0JMT0NLOworCWRpID0gKHN0cnVjdCBiZnNfaW5vZGUgKiliaC0+Yl9kYXRhICsgb2ZmOworCisJaWYgKGlub2RlLT5pX2lubyA9PSBCRlNfUk9PVF9JTk8pCisJCWRpLT5pX3Z0eXBlID0gQkZTX1ZESVI7CisJZWxzZQorCQlkaS0+aV92dHlwZSA9IEJGU19WUkVHOworCisJZGktPmlfaW5vID0gaW5vZGUtPmlfaW5vOworCWRpLT5pX21vZGUgPSBpbm9kZS0+aV9tb2RlOworCWRpLT5pX3VpZCA9IGlub2RlLT5pX3VpZDsKKwlkaS0+aV9naWQgPSBpbm9kZS0+aV9naWQ7CisJZGktPmlfbmxpbmsgPSBpbm9kZS0+aV9ubGluazsKKwlkaS0+aV9hdGltZSA9IGlub2RlLT5pX2F0aW1lLnR2X3NlYzsKKwlkaS0+aV9tdGltZSA9IGlub2RlLT5pX210aW1lLnR2X3NlYzsKKwlkaS0+aV9jdGltZSA9IGlub2RlLT5pX2N0aW1lLnR2X3NlYzsKKwlkaS0+aV9zYmxvY2sgPSBCRlNfSShpbm9kZSktPmlfc2Jsb2NrOworCWRpLT5pX2VibG9jayA9IEJGU19JKGlub2RlKS0+aV9lYmxvY2s7CisJZGktPmlfZW9mZnNldCA9IGRpLT5pX3NibG9jayAqIEJGU19CU0laRSArIGlub2RlLT5pX3NpemUgLSAxOworCisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWJyZWxzZShiaCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiZnNfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXVuc2lnbmVkIGxvbmcgaW5vID0gaW5vZGUtPmlfaW5vOworCXN0cnVjdCBiZnNfaW5vZGUgKiBkaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlpbnQgYmxvY2ssIG9mZjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJmc19zYl9pbmZvICogaW5mbyA9IEJGU19TQihzKTsKKworCWRwcmludGYoImlubz0lMDhseFxuIiwgaW5vZGUtPmlfaW5vKTsKKworCWlmIChpbm9kZS0+aV9pbm8gPCBCRlNfUk9PVF9JTk8gfHwgaW5vZGUtPmlfaW5vID4gaW5mby0+c2lfbGFzdGkpIHsKKwkJcHJpbnRmKCJpbnZhbGlkIGlubz0lMDhseFxuIiwgaW5vZGUtPmlfaW5vKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpbm9kZS0+aV9zaXplID0gMDsKKwlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWxvY2tfa2VybmVsKCk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJYmxvY2sgPSAoaW5vIC0gQkZTX1JPT1RfSU5PKS9CRlNfSU5PREVTX1BFUl9CTE9DSyArIDE7CisJYmggPSBzYl9icmVhZChzLCBibG9jayk7CisJaWYgKCFiaCkgeworCQlwcmludGYoIlVuYWJsZSB0byByZWFkIGlub2RlICVzOiUwOGx4XG4iLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm47CisJfQorCW9mZiA9IChpbm8gLSBCRlNfUk9PVF9JTk8pJUJGU19JTk9ERVNfUEVSX0JMT0NLOworCWRpID0gKHN0cnVjdCBiZnNfaW5vZGUgKiliaC0+Yl9kYXRhICsgb2ZmOworCWlmIChkaS0+aV9pbm8pIHsKKwkJaW5mby0+c2lfZnJlZWIgKz0gQkZTX0ZJTEVCTE9DS1MoZGkpOworCQlpbmZvLT5zaV9mcmVlaSsrOworCQljbGVhcl9iaXQoZGktPmlfaW5vLCBpbmZvLT5zaV9pbWFwKTsKKwkJZHVtcF9pbWFwKCJkZWxldGVfaW5vZGUiLCBzKTsKKwl9CisJZGktPmlfaW5vID0gMDsKKwlkaS0+aV9zYmxvY2sgPSAwOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlicmVsc2UoYmgpOworCisJLyogaWYgdGhpcyB3YXMgdGhlIGxhc3QgZmlsZSwgbWFrZSB0aGUgcHJldmlvdXMgCisJICAgYmxvY2sgImxhc3QgZmlsZXMgbGFzdCBibG9jayIgZXZlbiBpZiB0aGVyZSBpcyBubyByZWFsIGZpbGUgdGhlcmUsCisJICAgc2F2ZXMgdXMgMSBnYXAgKi8KKwlpZiAoaW5mby0+c2lfbGZfZWJsayA9PSBCRlNfSShpbm9kZSktPmlfZWJsb2NrKSB7CisJCWluZm8tPnNpX2xmX2VibGsgPSBCRlNfSShpbm9kZSktPmlfc2Jsb2NrIC0gMTsKKwkJbWFya19idWZmZXJfZGlydHkoaW5mby0+c2lfc2JoKTsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCWNsZWFyX2lub2RlKGlub2RlKTsKK30KKworc3RhdGljIHZvaWQgYmZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJc3RydWN0IGJmc19zYl9pbmZvICppbmZvID0gQkZTX1NCKHMpOworCWJyZWxzZShpbmZvLT5zaV9zYmgpOworCWtmcmVlKGluZm8tPnNpX2ltYXApOworCWtmcmVlKGluZm8pOworCXMtPnNfZnNfaW5mbyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgYmZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBrc3RhdGZzICpidWYpCit7CisJc3RydWN0IGJmc19zYl9pbmZvICppbmZvID0gQkZTX1NCKHMpOworCXU2NCBpZCA9IGh1Z2VfZW5jb2RlX2RldihzLT5zX2JkZXYtPmJkX2Rldik7CisJYnVmLT5mX3R5cGUgPSBCRlNfTUFHSUM7CisJYnVmLT5mX2JzaXplID0gcy0+c19ibG9ja3NpemU7CisJYnVmLT5mX2Jsb2NrcyA9IGluZm8tPnNpX2Jsb2NrczsKKwlidWYtPmZfYmZyZWUgPSBidWYtPmZfYmF2YWlsID0gaW5mby0+c2lfZnJlZWI7CisJYnVmLT5mX2ZpbGVzID0gaW5mby0+c2lfbGFzdGkgKyAxIC0gQkZTX1JPT1RfSU5POworCWJ1Zi0+Zl9mZnJlZSA9IGluZm8tPnNpX2ZyZWVpOworCWJ1Zi0+Zl9mc2lkLnZhbFswXSA9ICh1MzIpaWQ7CisJYnVmLT5mX2ZzaWQudmFsWzFdID0gKHUzMikoaWQgPj4gMzIpOworCWJ1Zi0+Zl9uYW1lbGVuID0gQkZTX05BTUVMRU47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJmc193cml0ZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKwkJbWFya19idWZmZXJfZGlydHkoQkZTX1NCKHMpLT5zaV9zYmgpOworCXMtPnNfZGlydCA9IDA7CisJdW5sb2NrX2tlcm5lbCgpOworfQorCitzdGF0aWMga21lbV9jYWNoZV90ICogYmZzX2lub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqYmZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGJmc19pbm9kZV9pbmZvICpiaTsKKwliaSA9IGttZW1fY2FjaGVfYWxsb2MoYmZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghYmkpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmYmktPnZmc19pbm9kZTsKK30KKworc3RhdGljIHZvaWQgYmZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUoYmZzX2lub2RlX2NhY2hlcCwgQkZTX0koaW5vZGUpKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgYmZzX2lub2RlX2luZm8gKmJpID0gZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikKKwkJaW5vZGVfaW5pdF9vbmNlKCZiaS0+dmZzX2lub2RlKTsKK30KKyAKK3N0YXRpYyBpbnQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpCit7CisJYmZzX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJiZnNfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgYmZzX2lub2RlX2luZm8pLAorCQkJCQkgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKGJmc19pbm9kZV9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQoreworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koYmZzX2lub2RlX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX0lORk8gImJmc19pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgYmZzX3NvcHMgPSB7CisJLmFsbG9jX2lub2RlCT0gYmZzX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gYmZzX2Rlc3Ryb3lfaW5vZGUsCisJLnJlYWRfaW5vZGUJPSBiZnNfcmVhZF9pbm9kZSwKKwkud3JpdGVfaW5vZGUJPSBiZnNfd3JpdGVfaW5vZGUsCisJLmRlbGV0ZV9pbm9kZQk9IGJmc19kZWxldGVfaW5vZGUsCisJLnB1dF9zdXBlcgk9IGJmc19wdXRfc3VwZXIsCisJLndyaXRlX3N1cGVyCT0gYmZzX3dyaXRlX3N1cGVyLAorCS5zdGF0ZnMJCT0gYmZzX3N0YXRmcywKK307CisKK3ZvaWQgZHVtcF9pbWFwKGNvbnN0IGNoYXIgKnByZWZpeCwgc3RydWN0IHN1cGVyX2Jsb2NrICogcykKK3sKKyNpZiAwCisJaW50IGk7CisJY2hhciAqdG1wYnVmID0gKGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXRtcGJ1ZikKKwkJcmV0dXJuOworCWZvciAoaT1CRlNfU0IocyktPnNpX2xhc3RpOyBpPj0wOyBpLS0pIHsKKwkJaWYgKGk+UEFHRV9TSVpFLTEwMCkgYnJlYWs7CisJCWlmICh0ZXN0X2JpdChpLCBCRlNfU0IocyktPnNpX2ltYXApKQorCQkJc3RyY2F0KHRtcGJ1ZiwgIjEiKTsKKwkJZWxzZQorCQkJc3RyY2F0KHRtcGJ1ZiwgIjAiKTsKKwl9CisJcHJpbnRrKEtFUk5fRVJSICJCRlMtZnM6ICVzOiBsYXN0aT0lMDhseCA8JXM+XG4iLCBwcmVmaXgsIEJGU19TQihzKS0+c2lfbGFzdGksIHRtcGJ1Zik7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXRtcGJ1Zik7CisjZW5kaWYKK30KKworc3RhdGljIGludCBiZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IGJmc19zdXBlcl9ibG9jayAqIGJmc19zYjsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlpbnQgaSwgaW1hcF9sZW47CisJc3RydWN0IGJmc19zYl9pbmZvICogaW5mbzsKKworCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisJcy0+c19mc19pbmZvID0gaW5mbzsKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisKKwlzYl9zZXRfYmxvY2tzaXplKHMsIEJGU19CU0laRSk7CisKKwliaCA9IHNiX2JyZWFkKHMsIDApOworCWlmKCFiaCkKKwkJZ290byBvdXQ7CisJYmZzX3NiID0gKHN0cnVjdCBiZnNfc3VwZXJfYmxvY2sgKiliaC0+Yl9kYXRhOworCWlmIChiZnNfc2ItPnNfbWFnaWMgIT0gQkZTX01BR0lDKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRmKCJObyBCRlMgZmlsZXN5c3RlbSBvbiAlcyAobWFnaWM9JTA4eClcbiIsIAorCQkJCXMtPnNfaWQsIGJmc19zYi0+c19tYWdpYyk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoQkZTX1VOQ0xFQU4oYmZzX3NiLCBzKSAmJiAhc2lsZW50KQorCQlwcmludGYoIiVzIGlzIHVuY2xlYW4sIGNvbnRpbnVpbmdcbiIsIHMtPnNfaWQpOworCisJcy0+c19tYWdpYyA9IEJGU19NQUdJQzsKKwlpbmZvLT5zaV9iZnNfc2IgPSBiZnNfc2I7CisJaW5mby0+c2lfc2JoID0gYmg7CisJaW5mby0+c2lfbGFzdGkgPSAoYmZzX3NiLT5zX3N0YXJ0IC0gQkZTX0JTSVpFKS9zaXplb2Yoc3RydWN0IGJmc19pbm9kZSkgCisJCQkrIEJGU19ST09UX0lOTyAtIDE7CisKKwlpbWFwX2xlbiA9IGluZm8tPnNpX2xhc3RpLzggKyAxOworCWluZm8tPnNpX2ltYXAgPSBrbWFsbG9jKGltYXBfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8tPnNpX2ltYXApCisJCWdvdG8gb3V0OworCW1lbXNldChpbmZvLT5zaV9pbWFwLCAwLCBpbWFwX2xlbik7CisJZm9yIChpPTA7IGk8QkZTX1JPT1RfSU5POyBpKyspIAorCQlzZXRfYml0KGksIGluZm8tPnNpX2ltYXApOworCisJcy0+c19vcCA9ICZiZnNfc29wczsKKwlpbm9kZSA9IGlnZXQocywgQkZTX1JPT1RfSU5PKTsKKwlpZiAoIWlub2RlKSB7CisJCWtmcmVlKGluZm8tPnNpX2ltYXApOworCQlnb3RvIG91dDsKKwl9CisJcy0+c19yb290ID0gZF9hbGxvY19yb290KGlub2RlKTsKKwlpZiAoIXMtPnNfcm9vdCkgeworCQlpcHV0KGlub2RlKTsKKwkJa2ZyZWUoaW5mby0+c2lfaW1hcCk7CisJCWdvdG8gb3V0OworCX0KKworCWluZm8tPnNpX2Jsb2NrcyA9IChiZnNfc2ItPnNfZW5kICsgMSk+PkJGU19CU0laRV9CSVRTOyAvKiBmb3Igc3RhdGZzKDIpICovCisJaW5mby0+c2lfZnJlZWIgPSAoYmZzX3NiLT5zX2VuZCArIDEgLSBiZnNfc2ItPnNfc3RhcnQpPj5CRlNfQlNJWkVfQklUUzsKKwlpbmZvLT5zaV9mcmVlaSA9IDA7CisJaW5mby0+c2lfbGZfZWJsayA9IDA7CisJaW5mby0+c2lfbGZfc2JsayA9IDA7CisJaW5mby0+c2lfbGZfaW9mZiA9IDA7CisJZm9yIChpPUJGU19ST09UX0lOTzsgaTw9aW5mby0+c2lfbGFzdGk7IGkrKykgeworCQlpbm9kZSA9IGlnZXQocyxpKTsKKwkJaWYgKEJGU19JKGlub2RlKS0+aV9kc2tfaW5vID09IDApCisJCQlpbmZvLT5zaV9mcmVlaSsrOworCQllbHNlIHsKKwkJCXNldF9iaXQoaSwgaW5mby0+c2lfaW1hcCk7CisJCQlpbmZvLT5zaV9mcmVlYiAtPSBpbm9kZS0+aV9ibG9ja3M7CisJCQlpZiAoQkZTX0koaW5vZGUpLT5pX2VibG9jayA+IGluZm8tPnNpX2xmX2VibGspIHsKKwkJCQlpbmZvLT5zaV9sZl9lYmxrID0gQkZTX0koaW5vZGUpLT5pX2VibG9jazsKKwkJCQlpbmZvLT5zaV9sZl9zYmxrID0gQkZTX0koaW5vZGUpLT5pX3NibG9jazsKKwkJCQlpbmZvLT5zaV9sZl9pb2ZmID0gQkZTX0lOTzJPRkYoaSk7CisJCQl9CisJCX0KKwkJaXB1dChpbm9kZSk7CisJfQorCWlmICghKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJcy0+c19kaXJ0ID0gMTsKKwl9IAorCWR1bXBfaW1hcCgicmVhZF9zdXBlciIsIHMpOworCXJldHVybiAwOworCitvdXQ6CisJYnJlbHNlKGJoKTsKKwlrZnJlZShpbmZvKTsKKwlzLT5zX2ZzX2luZm8gPSBOVUxMOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpiZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgYmZzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYmZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJiZnMiLAorCS5nZXRfc2IJCT0gYmZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9iZnNfZnModm9pZCkKK3sKKwlpbnQgZXJyID0gaW5pdF9pbm9kZWNhY2hlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworICAgICAgICBlcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZiZnNfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJcmV0dXJuIDA7CitvdXQ6CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CitvdXQxOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2Jmc19mcyh2b2lkKQoreworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmYmZzX2ZzX3R5cGUpOworCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworfQorCittb2R1bGVfaW5pdChpbml0X2Jmc19mcykKK21vZHVsZV9leGl0KGV4aXRfYmZzX2ZzKQpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X2FvdXQuYyBiL2ZzL2JpbmZtdF9hb3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5Yjg5MgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JpbmZtdF9hb3V0LmMKQEAgLTAsMCArMSw1NTAgQEAKKy8qCisgKiAgbGludXgvZnMvYmluZm10X2FvdXQuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTYgIExpbnVzIFRvcnZhbGRzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91c2VyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpbmZtdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisKK3N0YXRpYyBpbnQgbG9hZF9hb3V0X2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICosIHN0cnVjdCBwdF9yZWdzICogcmVncyk7CitzdGF0aWMgaW50IGxvYWRfYW91dF9saWJyYXJ5KHN0cnVjdCBmaWxlKik7CitzdGF0aWMgaW50IGFvdXRfY29yZV9kdW1wKGxvbmcgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICogcmVncywgc3RydWN0IGZpbGUgKmZpbGUpOworCitleHRlcm4gdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgdXNlciAqKTsKKworc3RhdGljIHN0cnVjdCBsaW51eF9iaW5mbXQgYW91dF9mb3JtYXQgPSB7CisJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkubG9hZF9iaW5hcnkJPSBsb2FkX2FvdXRfYmluYXJ5LAorCS5sb2FkX3NobGliCT0gbG9hZF9hb3V0X2xpYnJhcnksCisJLmNvcmVfZHVtcAk9IGFvdXRfY29yZV9kdW1wLAorCS5taW5fY29yZWR1bXAJPSBQQUdFX1NJWkUKK307CisKKyNkZWZpbmUgQkFEX0FERFIoeCkJKCh1bnNpZ25lZCBsb25nKSh4KSA+PSBUQVNLX1NJWkUpCisKK3N0YXRpYyBpbnQgc2V0X2Jyayh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlzdGFydCA9IFBBR0VfQUxJR04oc3RhcnQpOworCWVuZCA9IFBBR0VfQUxJR04oZW5kKTsKKwlpZiAoZW5kID4gc3RhcnQpIHsKKwkJdW5zaWduZWQgbG9uZyBhZGRyOworCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQlhZGRyID0gZG9fYnJrKHN0YXJ0LCBlbmQgLSBzdGFydCk7CisJCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQlpZiAoQkFEX0FERFIoYWRkcikpCisJCQlyZXR1cm4gYWRkcjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIG9ubHkgdGhpbmdzIHlvdSBzaG91bGQgZG8gb24gYSBjb3JlLWZpbGU6IHVzZSBvbmx5IHRoZXNlCisgKiBtYWNyb3MgdG8gd3JpdGUgb3V0IGFsbCB0aGUgbmVjZXNzYXJ5IGluZm8uCisgKi8KKworc3RhdGljIGludCBkdW1wX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCB2b2lkICphZGRyLCBpbnQgbnIpCit7CisJcmV0dXJuIGZpbGUtPmZfb3AtPndyaXRlKGZpbGUsIGFkZHIsIG5yLCAmZmlsZS0+Zl9wb3MpID09IG5yOworfQorCisjZGVmaW5lIERVTVBfV1JJVEUoYWRkciwgbnIpCVwKKwlpZiAoIWR1bXBfd3JpdGUoZmlsZSwgKHZvaWQgKikoYWRkciksIChucikpKSBcCisJCWdvdG8gZW5kX2NvcmVkdW1wOworCisjZGVmaW5lIERVTVBfU0VFSyhvZmZzZXQpIFwKK2lmIChmaWxlLT5mX29wLT5sbHNlZWspIHsgXAorCWlmIChmaWxlLT5mX29wLT5sbHNlZWsoZmlsZSwob2Zmc2V0KSwwKSAhPSAob2Zmc2V0KSkgXAorIAkJZ290byBlbmRfY29yZWR1bXA7IFwKK30gZWxzZSBmaWxlLT5mX3BvcyA9IChvZmZzZXQpCisKKy8qCisgKiBSb3V0aW5lIHdyaXRlcyBhIGNvcmUgZHVtcCBpbWFnZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgKiBDdXJyZW50bHkgb25seSBhIHN0dWItZnVuY3Rpb24uCisgKgorICogTm90ZSB0aGF0IHNldHVpZC9zZXRnaWQgZmlsZXMgd29uJ3QgbWFrZSBhIGNvcmUtZHVtcCBpZiB0aGUgdWlkL2dpZAorICogY2hhbmdlZCBkdWUgdG8gdGhlIHNldFt1fGddaWQuIEl0J3MgZW5mb3JjZWQgYnkgdGhlICJjdXJyZW50LT5tbS0+ZHVtcGFibGUiCisgKiBmaWVsZCwgd2hpY2ggYWxzbyBtYWtlcyBzdXJlIHRoZSBjb3JlLWR1bXBzIHdvbid0IGJlIHJlY3Vyc2l2ZSBpZiB0aGUKKyAqIGR1bXBpbmcgb2YgdGhlIHByb2Nlc3MgcmVzdWx0cyBpbiBhbm90aGVyIGVycm9yLi4KKyAqLworCitzdGF0aWMgaW50IGFvdXRfY29yZV9kdW1wKGxvbmcgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICogcmVncywgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJbW1fc2VnbWVudF90IGZzOworCWludCBoYXNfZHVtcGVkID0gMDsKKwl1bnNpZ25lZCBsb25nIGR1bXBfc3RhcnQsIGR1bXBfc2l6ZTsKKwlzdHJ1Y3QgdXNlciBkdW1wOworI2lmIGRlZmluZWQoX19hbHBoYV9fKQorIyAgICAgICBkZWZpbmUgU1RBUlRfREFUQSh1KQkodS5zdGFydF9kYXRhKQorI2VsaWYgZGVmaW5lZChfX2FybV9fKQorIwlkZWZpbmUgU1RBUlRfREFUQSh1KQkoKHUudV90c2l6ZSA8PCBQQUdFX1NISUZUKSArIHUuc3RhcnRfY29kZSkKKyNlbGlmIGRlZmluZWQoX19zcGFyY19fKQorIyAgICAgICBkZWZpbmUgU1RBUlRfREFUQSh1KSAgICAodS51X3RzaXplKQorI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX21jNjgwMDBfXykgfHwgZGVmaW5lZChfX2FyY2hfdW1fXykKKyMgICAgICAgZGVmaW5lIFNUQVJUX0RBVEEodSkJKHUudV90c2l6ZSA8PCBQQUdFX1NISUZUKQorI2VuZGlmCisjaWZkZWYgX19zcGFyY19fCisjICAgICAgIGRlZmluZSBTVEFSVF9TVEFDSyh1KSAgICgocmVncy0+dV9yZWdzW1VSRUdfRlBdKSAmIH4oUEFHRV9TSVpFIC0gMSkpCisjZWxzZQorIyAgICAgICBkZWZpbmUgU1RBUlRfU1RBQ0sodSkgICAodS5zdGFydF9zdGFjaykKKyNlbmRpZgorCisJZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwloYXNfZHVtcGVkID0gMTsKKwljdXJyZW50LT5mbGFncyB8PSBQRl9EVU1QQ09SRTsKKyAgICAgICAJc3RybmNweShkdW1wLnVfY29tbSwgY3VycmVudC0+Y29tbSwgc2l6ZW9mKGR1bXAudV9jb21tKSk7CisjaWZuZGVmIF9fc3BhcmNfXworCWR1bXAudV9hcjAgPSAodm9pZCAqKSgoKHVuc2lnbmVkIGxvbmcpKCZkdW1wLnJlZ3MpKSAtICgodW5zaWduZWQgbG9uZykoJmR1bXApKSk7CisjZW5kaWYKKwlkdW1wLnNpZ25hbCA9IHNpZ25yOworCWR1bXBfdGhyZWFkKHJlZ3MsICZkdW1wKTsKKworLyogSWYgdGhlIHNpemUgb2YgdGhlIGR1bXAgZmlsZSBleGNlZWRzIHRoZSBybGltaXQsIHRoZW4gc2VlIHdoYXQgd291bGQgaGFwcGVuCisgICBpZiB3ZSB3cm90ZSB0aGUgc3RhY2ssIGJ1dCBub3QgdGhlIGRhdGEgYXJlYS4gICovCisjaWZkZWYgX19zcGFyY19fCisJaWYgKChkdW1wLnVfZHNpemUrZHVtcC51X3NzaXplKSA+CisJICAgIGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfQ09SRV0ucmxpbV9jdXIpCisJCWR1bXAudV9kc2l6ZSA9IDA7CisjZWxzZQorCWlmICgoZHVtcC51X2RzaXplK2R1bXAudV9zc2l6ZSsxKSAqIFBBR0VfU0laRSA+CisJICAgIGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfQ09SRV0ucmxpbV9jdXIpCisJCWR1bXAudV9kc2l6ZSA9IDA7CisjZW5kaWYKKworLyogTWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHJvb20gdG8gd3JpdGUgdGhlIHN0YWNrIGFuZCBkYXRhIGFyZWFzLiAqLworI2lmZGVmIF9fc3BhcmNfXworCWlmICgoZHVtcC51X3NzaXplKSA+CisJICAgIGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfQ09SRV0ucmxpbV9jdXIpCisJCWR1bXAudV9zc2l6ZSA9IDA7CisjZWxzZQorCWlmICgoZHVtcC51X3NzaXplKzEpICogUEFHRV9TSVpFID4KKwkgICAgY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9DT1JFXS5ybGltX2N1cikKKwkJZHVtcC51X3NzaXplID0gMDsKKyNlbmRpZgorCisvKiBtYWtlIHN1cmUgd2UgYWN0dWFsbHkgaGF2ZSBhIGRhdGEgYW5kIHN0YWNrIGFyZWEgdG8gZHVtcCAqLworCXNldF9mcyhVU0VSX0RTKTsKKyNpZmRlZiBfX3NwYXJjX18KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgKHZvaWQgX191c2VyICopU1RBUlRfREFUQShkdW1wKSwgZHVtcC51X2RzaXplKSkKKwkJZHVtcC51X2RzaXplID0gMDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgKHZvaWQgX191c2VyICopU1RBUlRfU1RBQ0soZHVtcCksIGR1bXAudV9zc2l6ZSkpCisJCWR1bXAudV9zc2l6ZSA9IDA7CisjZWxzZQorCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCAodm9pZCBfX3VzZXIgKilTVEFSVF9EQVRBKGR1bXApLCBkdW1wLnVfZHNpemUgPDwgUEFHRV9TSElGVCkpCisJCWR1bXAudV9kc2l6ZSA9IDA7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICh2b2lkIF9fdXNlciAqKVNUQVJUX1NUQUNLKGR1bXApLCBkdW1wLnVfc3NpemUgPDwgUEFHRV9TSElGVCkpCisJCWR1bXAudV9zc2l6ZSA9IDA7CisjZW5kaWYKKworCXNldF9mcyhLRVJORUxfRFMpOworLyogc3RydWN0IHVzZXIgKi8KKwlEVU1QX1dSSVRFKCZkdW1wLHNpemVvZihkdW1wKSk7CisvKiBOb3cgZHVtcCBhbGwgb2YgdGhlIHVzZXIgZGF0YS4gIEluY2x1ZGUgbWFsbG9jZWQgc3R1ZmYgYXMgd2VsbCAqLworI2lmbmRlZiBfX3NwYXJjX18KKwlEVU1QX1NFRUsoUEFHRV9TSVpFKTsKKyNlbmRpZgorLyogbm93IHdlIHN0YXJ0IHdyaXRpbmcgb3V0IHRoZSB1c2VyIHNwYWNlIGluZm8gKi8KKwlzZXRfZnMoVVNFUl9EUyk7CisvKiBEdW1wIHRoZSBkYXRhIGFyZWEgKi8KKwlpZiAoZHVtcC51X2RzaXplICE9IDApIHsKKwkJZHVtcF9zdGFydCA9IFNUQVJUX0RBVEEoZHVtcCk7CisjaWZkZWYgX19zcGFyY19fCisJCWR1bXBfc2l6ZSA9IGR1bXAudV9kc2l6ZTsKKyNlbHNlCisJCWR1bXBfc2l6ZSA9IGR1bXAudV9kc2l6ZSA8PCBQQUdFX1NISUZUOworI2VuZGlmCisJCURVTVBfV1JJVEUoZHVtcF9zdGFydCxkdW1wX3NpemUpOworCX0KKy8qIE5vdyBwcmVwYXJlIHRvIGR1bXAgdGhlIHN0YWNrIGFyZWEgKi8KKwlpZiAoZHVtcC51X3NzaXplICE9IDApIHsKKwkJZHVtcF9zdGFydCA9IFNUQVJUX1NUQUNLKGR1bXApOworI2lmZGVmIF9fc3BhcmNfXworCQlkdW1wX3NpemUgPSBkdW1wLnVfc3NpemU7CisjZWxzZQorCQlkdW1wX3NpemUgPSBkdW1wLnVfc3NpemUgPDwgUEFHRV9TSElGVDsKKyNlbmRpZgorCQlEVU1QX1dSSVRFKGR1bXBfc3RhcnQsZHVtcF9zaXplKTsKKwl9CisvKiBGaW5hbGx5IGR1bXAgdGhlIHRhc2sgc3RydWN0LiAgTm90IGJlIHVzZWQgYnkgZ2RiLCBidXQgY291bGQgYmUgdXNlZnVsICovCisJc2V0X2ZzKEtFUk5FTF9EUyk7CisJRFVNUF9XUklURShjdXJyZW50LHNpemVvZigqY3VycmVudCkpOworZW5kX2NvcmVkdW1wOgorCXNldF9mcyhmcyk7CisJcmV0dXJuIGhhc19kdW1wZWQ7Cit9CisKKy8qCisgKiBjcmVhdGVfYW91dF90YWJsZXMoKSBwYXJzZXMgdGhlIGVudi0gYW5kIGFyZy1zdHJpbmdzIGluIG5ldyB1c2VyCisgKiBtZW1vcnkgYW5kIGNyZWF0ZXMgdGhlIHBvaW50ZXIgdGFibGVzIGZyb20gdGhlbSwgYW5kIHB1dHMgdGhlaXIKKyAqIGFkZHJlc3NlcyBvbiB0aGUgInN0YWNrIiwgcmV0dXJuaW5nIHRoZSBuZXcgc3RhY2sgcG9pbnRlciB2YWx1ZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgX191c2VyICpjcmVhdGVfYW91dF90YWJsZXMoY2hhciBfX3VzZXIgKnAsIHN0cnVjdCBsaW51eF9iaW5wcm0gKiBicHJtKQoreworCWNoYXIgX191c2VyICogX191c2VyICphcmd2OworCWNoYXIgX191c2VyICogX191c2VyICplbnZwOworCXVuc2lnbmVkIGxvbmcgX191c2VyICpzcDsKKwlpbnQgYXJnYyA9IGJwcm0tPmFyZ2M7CisJaW50IGVudmMgPSBicHJtLT5lbnZjOworCisJc3AgPSAodm9pZCBfX3VzZXIgKikoKC0odW5zaWduZWQgbG9uZylzaXplb2YoY2hhciAqKSkgJiAodW5zaWduZWQgbG9uZykgcCk7CisjaWZkZWYgX19zcGFyY19fCisJLyogVGhpcyBpbXBvc2VzIHRoZSBwcm9wZXIgc3RhY2sgYWxpZ25tZW50IGZvciBhIG5ldyBwcm9jZXNzLiAqLworCXNwID0gKHZvaWQgX191c2VyICopICgoKHVuc2lnbmVkIGxvbmcpIHNwKSAmIH43KTsKKwlpZiAoKGVudmMrYXJnYyszKSYxKSAtLXNwOworI2VuZGlmCisjaWZkZWYgX19hbHBoYV9fCisvKiB3aGVlLi4gdGVzdC1wcm9ncmFtcyBhcmUgc28gbXVjaCBmdW4uICovCisJcHV0X3VzZXIoMCwgLS1zcCk7CisJcHV0X3VzZXIoMCwgLS1zcCk7CisJaWYgKGJwcm0tPmxvYWRlcikgeworCQlwdXRfdXNlcigwLCAtLXNwKTsKKwkJcHV0X3VzZXIoMHgzZWIsIC0tc3ApOworCQlwdXRfdXNlcihicHJtLT5sb2FkZXIsIC0tc3ApOworCQlwdXRfdXNlcigweDNlYSwgLS1zcCk7CisJfQorCXB1dF91c2VyKGJwcm0tPmV4ZWMsIC0tc3ApOworCXB1dF91c2VyKDB4M2U5LCAtLXNwKTsKKyNlbmRpZgorCXNwIC09IGVudmMrMTsKKwllbnZwID0gKGNoYXIgX191c2VyICogX191c2VyICopIHNwOworCXNwIC09IGFyZ2MrMTsKKwlhcmd2ID0gKGNoYXIgX191c2VyICogX191c2VyICopIHNwOworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19tYzY4MDAwX18pIHx8IGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX2FyY2hfdW1fXykKKwlwdXRfdXNlcigodW5zaWduZWQgbG9uZykgZW52cCwtLXNwKTsKKwlwdXRfdXNlcigodW5zaWduZWQgbG9uZykgYXJndiwtLXNwKTsKKyNlbmRpZgorCXB1dF91c2VyKGFyZ2MsLS1zcCk7CisJY3VycmVudC0+bW0tPmFyZ19zdGFydCA9ICh1bnNpZ25lZCBsb25nKSBwOworCXdoaWxlIChhcmdjLS0+MCkgeworCQljaGFyIGM7CisJCXB1dF91c2VyKHAsYXJndisrKTsKKwkJZG8geworCQkJZ2V0X3VzZXIoYyxwKyspOworCQl9IHdoaWxlIChjKTsKKwl9CisJcHV0X3VzZXIoTlVMTCxhcmd2KTsKKwljdXJyZW50LT5tbS0+YXJnX2VuZCA9IGN1cnJlbnQtPm1tLT5lbnZfc3RhcnQgPSAodW5zaWduZWQgbG9uZykgcDsKKwl3aGlsZSAoZW52Yy0tPjApIHsKKwkJY2hhciBjOworCQlwdXRfdXNlcihwLGVudnArKyk7CisJCWRvIHsKKwkJCWdldF91c2VyKGMscCsrKTsKKwkJfSB3aGlsZSAoYyk7CisJfQorCXB1dF91c2VyKE5VTEwsZW52cCk7CisJY3VycmVudC0+bW0tPmVudl9lbmQgPSAodW5zaWduZWQgbG9uZykgcDsKKwlyZXR1cm4gc3A7Cit9CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyB1c2VkIHRvIGxvYWQgYS5vdXQgc3R5bGUgZXhlY3V0YWJsZXMgYW5kIHNoYXJlZAorICogbGlicmFyaWVzLiAgVGhlcmUgaXMgbm8gYmluYXJ5IGRlcGVuZGVudCBjb2RlIGFueXdoZXJlIGVsc2UuCisgKi8KKworc3RhdGljIGludCBsb2FkX2FvdXRfYmluYXJ5KHN0cnVjdCBsaW51eF9iaW5wcm0gKiBicHJtLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IGV4ZWMgZXg7CisJdW5zaWduZWQgbG9uZyBlcnJvcjsKKwl1bnNpZ25lZCBsb25nIGZkX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHJsaW07CisJaW50IHJldHZhbDsKKworCWV4ID0gKigoc3RydWN0IGV4ZWMgKikgYnBybS0+YnVmKTsJCS8qIGV4ZWMtaGVhZGVyICovCisJaWYgKChOX01BR0lDKGV4KSAhPSBaTUFHSUMgJiYgTl9NQUdJQyhleCkgIT0gT01BR0lDICYmCisJICAgICBOX01BR0lDKGV4KSAhPSBRTUFHSUMgJiYgTl9NQUdJQyhleCkgIT0gTk1BR0lDKSB8fAorCSAgICBOX1RSU0laRShleCkgfHwgTl9EUlNJWkUoZXgpIHx8CisJICAgIGlfc2l6ZV9yZWFkKGJwcm0tPmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSA8IGV4LmFfdGV4dCtleC5hX2RhdGErTl9TWU1TSVpFKGV4KStOX1RYVE9GRihleCkpIHsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKworCWZkX29mZnNldCA9IE5fVFhUT0ZGKGV4KTsKKworCS8qIENoZWNrIGluaXRpYWwgbGltaXRzLiBUaGlzIGF2b2lkcyBsZXR0aW5nIHBlb3BsZSBjaXJjdW12ZW50CisJICogc2l6ZSBsaW1pdHMgaW1wb3NlZCBvbiB0aGVtIGJ5IGNyZWF0aW5nIHByb2dyYW1zIHdpdGggbGFyZ2UKKwkgKiBhcnJheXMgaW4gdGhlIGRhdGEgb3IgYnNzLgorCSAqLworCXJsaW0gPSBjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX0RBVEFdLnJsaW1fY3VyOworCWlmIChybGltID49IFJMSU1fSU5GSU5JVFkpCisJCXJsaW0gPSB+MDsKKwlpZiAoZXguYV9kYXRhICsgZXguYV9ic3MgPiBybGltKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEZsdXNoIGFsbCB0cmFjZXMgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIGV4ZWN1dGFibGUgKi8KKwlyZXR2YWwgPSBmbHVzaF9vbGRfZXhlYyhicHJtKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJLyogT0ssIFRoaXMgaXMgdGhlIHBvaW50IG9mIG5vIHJldHVybiAqLworI2lmIGRlZmluZWQoX19hbHBoYV9fKQorCVNFVF9BT1VUX1BFUlNPTkFMSVRZKGJwcm0sIGV4KTsKKyNlbGlmIGRlZmluZWQoX19zcGFyY19fKQorCXNldF9wZXJzb25hbGl0eShQRVJfU1VOT1MpOworI2lmICFkZWZpbmVkKF9fc3BhcmNfdjlfXykKKwltZW1jcHkoJmN1cnJlbnQtPnRocmVhZC5jb3JlX2V4ZWMsICZleCwgc2l6ZW9mKHN0cnVjdCBleGVjKSk7CisjZW5kaWYKKyNlbHNlCisJc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWCk7CisjZW5kaWYKKworCWN1cnJlbnQtPm1tLT5lbmRfY29kZSA9IGV4LmFfdGV4dCArCisJCShjdXJyZW50LT5tbS0+c3RhcnRfY29kZSA9IE5fVFhUQUREUihleCkpOworCWN1cnJlbnQtPm1tLT5lbmRfZGF0YSA9IGV4LmFfZGF0YSArCisJCShjdXJyZW50LT5tbS0+c3RhcnRfZGF0YSA9IE5fREFUQUREUihleCkpOworCWN1cnJlbnQtPm1tLT5icmsgPSBleC5hX2JzcyArCisJCShjdXJyZW50LT5tbS0+c3RhcnRfYnJrID0gTl9CU1NBRERSKGV4KSk7CisJY3VycmVudC0+bW0tPmZyZWVfYXJlYV9jYWNoZSA9IGN1cnJlbnQtPm1tLT5tbWFwX2Jhc2U7CisKKwlzZXRfbW1fY291bnRlcihjdXJyZW50LT5tbSwgcnNzLCAwKTsKKwljdXJyZW50LT5tbS0+bW1hcCA9IE5VTEw7CisJY29tcHV0ZV9jcmVkcyhicHJtKTsKKyAJY3VycmVudC0+ZmxhZ3MgJj0gflBGX0ZPUktOT0VYRUM7CisjaWZkZWYgX19zcGFyY19fCisJaWYgKE5fTUFHSUMoZXgpID09IE5NQUdJQykgeworCQlsb2ZmX3QgcG9zID0gZmRfb2Zmc2V0OworCQkvKiBGdWNrIG1lIHBsZW50eS4uLiAqLworCQkvKiA8QU9MPjwvQU9MPiAqLworCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwkKKwkJZXJyb3IgPSBkb19icmsoTl9UWFRBRERSKGV4KSwgZXguYV90ZXh0KTsKKwkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCWJwcm0tPmZpbGUtPmZfb3AtPnJlYWQoYnBybS0+ZmlsZSwgKGNoYXIgKikgTl9UWFRBRERSKGV4KSwKKwkJCSAgZXguYV90ZXh0LCAmcG9zKTsKKwkJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwkJZXJyb3IgPSBkb19icmsoTl9EQVRBRERSKGV4KSwgZXguYV9kYXRhKTsKKwkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCWJwcm0tPmZpbGUtPmZfb3AtPnJlYWQoYnBybS0+ZmlsZSwgKGNoYXIgKikgTl9EQVRBRERSKGV4KSwKKwkJCSAgZXguYV9kYXRhLCAmcG9zKTsKKwkJZ290byBiZXlvbmRfaWY7CisJfQorI2VuZGlmCisKKwlpZiAoTl9NQUdJQyhleCkgPT0gT01BR0lDKSB7CisJCXVuc2lnbmVkIGxvbmcgdGV4dF9hZGRyLCBtYXBfc2l6ZTsKKwkJbG9mZl90IHBvczsKKworCQl0ZXh0X2FkZHIgPSBOX1RYVEFERFIoZXgpOworCisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19zcGFyY19fKQorCQlwb3MgPSBmZF9vZmZzZXQ7CisJCW1hcF9zaXplID0gZXguYV90ZXh0K2V4LmFfZGF0YSArIFBBR0VfU0laRSAtIDE7CisjZWxzZQorCQlwb3MgPSAzMjsKKwkJbWFwX3NpemUgPSBleC5hX3RleHQrZXguYV9kYXRhOworI2VuZGlmCisJCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCWVycm9yID0gZG9fYnJrKHRleHRfYWRkciAmIFBBR0VfTUFTSywgbWFwX3NpemUpOworCQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwkJaWYgKGVycm9yICE9ICh0ZXh0X2FkZHIgJiBQQUdFX01BU0spKSB7CisJCQlzZW5kX3NpZyhTSUdLSUxMLCBjdXJyZW50LCAwKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCisJCWVycm9yID0gYnBybS0+ZmlsZS0+Zl9vcC0+cmVhZChicHJtLT5maWxlLAorCQkJICAoY2hhciBfX3VzZXIgKil0ZXh0X2FkZHIsCisJCQkgIGV4LmFfdGV4dCtleC5hX2RhdGEsICZwb3MpOworCQlpZiAoKHNpZ25lZCBsb25nKWVycm9yIDwgMCkgeworCQkJc2VuZF9zaWcoU0lHS0lMTCwgY3VycmVudCwgMCk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJCSAKKwkJZmx1c2hfaWNhY2hlX3JhbmdlKHRleHRfYWRkciwgdGV4dF9hZGRyK2V4LmFfdGV4dCtleC5hX2RhdGEpOworCX0gZWxzZSB7CisJCXN0YXRpYyB1bnNpZ25lZCBsb25nIGVycm9yX3RpbWUsIGVycm9yX3RpbWUyOworCQlpZiAoKGV4LmFfdGV4dCAmIDB4ZmZmIHx8IGV4LmFfZGF0YSAmIDB4ZmZmKSAmJgorCQkgICAgKE5fTUFHSUMoZXgpICE9IE5NQUdJQykgJiYgKGppZmZpZXMtZXJyb3JfdGltZTIpID4gNSpIWikKKwkJeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJleGVjdXRhYmxlIG5vdCBwYWdlIGFsaWduZWRcbiIpOworCQkJZXJyb3JfdGltZTIgPSBqaWZmaWVzOworCQl9CisKKwkJaWYgKChmZF9vZmZzZXQgJiB+UEFHRV9NQVNLKSAhPSAwICYmCisJCSAgICAoamlmZmllcy1lcnJvcl90aW1lKSA+IDUqSFopCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCQkgICAgICAgImZkX29mZnNldCBpcyBub3QgcGFnZSBhbGlnbmVkLiBQbGVhc2UgY29udmVydCBwcm9ncmFtOiAlc1xuIiwKKwkJCSAgICAgICBicHJtLT5maWxlLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQkJZXJyb3JfdGltZSA9IGppZmZpZXM7CisJCX0KKworCQlpZiAoIWJwcm0tPmZpbGUtPmZfb3AtPm1tYXB8fCgoZmRfb2Zmc2V0ICYgflBBR0VfTUFTSykgIT0gMCkpIHsKKwkJCWxvZmZfdCBwb3MgPSBmZF9vZmZzZXQ7CisJCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQkJZG9fYnJrKE5fVFhUQUREUihleCksIGV4LmFfdGV4dCtleC5hX2RhdGEpOworCQkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCQlicHJtLT5maWxlLT5mX29wLT5yZWFkKGJwcm0tPmZpbGUsCisJCQkJCShjaGFyIF9fdXNlciAqKU5fVFhUQUREUihleCksCisJCQkJCWV4LmFfdGV4dCtleC5hX2RhdGEsICZwb3MpOworCQkJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKSBOX1RYVEFERFIoZXgpLAorCQkJCQkgICAodW5zaWduZWQgbG9uZykgTl9UWFRBRERSKGV4KSArCisJCQkJCSAgIGV4LmFfdGV4dCtleC5hX2RhdGEpOworCQkJZ290byBiZXlvbmRfaWY7CisJCX0KKworCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQllcnJvciA9IGRvX21tYXAoYnBybS0+ZmlsZSwgTl9UWFRBRERSKGV4KSwgZXguYV90ZXh0LAorCQkJUFJPVF9SRUFEIHwgUFJPVF9FWEVDLAorCQkJTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUgfCBNQVBfREVOWVdSSVRFIHwgTUFQX0VYRUNVVEFCTEUsCisJCQlmZF9vZmZzZXQpOworCQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworCQlpZiAoZXJyb3IgIT0gTl9UWFRBRERSKGV4KSkgeworCQkJc2VuZF9zaWcoU0lHS0lMTCwgY3VycmVudCwgMCk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKworCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworIAkJZXJyb3IgPSBkb19tbWFwKGJwcm0tPmZpbGUsIE5fREFUQUREUihleCksIGV4LmFfZGF0YSwKKwkJCQlQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDLAorCQkJCU1BUF9GSVhFRCB8IE1BUF9QUklWQVRFIHwgTUFQX0RFTllXUklURSB8IE1BUF9FWEVDVVRBQkxFLAorCQkJCWZkX29mZnNldCArIGV4LmFfdGV4dCk7CisJCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQlpZiAoZXJyb3IgIT0gTl9EQVRBRERSKGV4KSkgeworCQkJc2VuZF9zaWcoU0lHS0lMTCwgY3VycmVudCwgMCk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwl9CitiZXlvbmRfaWY6CisJc2V0X2JpbmZtdCgmYW91dF9mb3JtYXQpOworCisJcmV0dmFsID0gc2V0X2JyayhjdXJyZW50LT5tbS0+c3RhcnRfYnJrLCBjdXJyZW50LT5tbS0+YnJrKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlzZW5kX3NpZyhTSUdLSUxMLCBjdXJyZW50LCAwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR2YWwgPSBzZXR1cF9hcmdfcGFnZXMoYnBybSwgU1RBQ0tfVE9QLCBFWFNUQUNLX0RFRkFVTFQpOworCWlmIChyZXR2YWwgPCAwKSB7IAorCQkvKiBTb21lb25lIGNoZWNrLW1lOiBpcyB0aGlzIGVycm9yIHBhdGggZW5vdWdoPyAqLyAKKwkJc2VuZF9zaWcoU0lHS0lMTCwgY3VycmVudCwgMCk7IAorCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayA9CisJCSh1bnNpZ25lZCBsb25nKSBjcmVhdGVfYW91dF90YWJsZXMoKGNoYXIgX191c2VyICopIGJwcm0tPnAsIGJwcm0pOworI2lmZGVmIF9fYWxwaGFfXworCXJlZ3MtPmdwID0gZXguYV9ncHZhbHVlOworI2VuZGlmCisJc3RhcnRfdGhyZWFkKHJlZ3MsIGV4LmFfZW50cnksIGN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayk7CisJaWYgKHVubGlrZWx5KGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpKSB7CisJCWlmIChjdXJyZW50LT5wdHJhY2UgJiBQVF9UUkFDRV9FWEVDKQorCQkJcHRyYWNlX25vdGlmeSAoKFBUUkFDRV9FVkVOVF9FWEVDIDw8IDgpIHwgU0lHVFJBUCk7CisJCWVsc2UKKwkJCXNlbmRfc2lnKFNJR1RSQVAsIGN1cnJlbnQsIDApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsb2FkX2FvdXRfbGlicmFyeShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwl1bnNpZ25lZCBsb25nIGJzcywgc3RhcnRfYWRkciwgbGVuOworCXVuc2lnbmVkIGxvbmcgZXJyb3I7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgZXhlYyBleDsKKworCWlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisKKwlyZXR2YWwgPSAtRU5PRVhFQzsKKwllcnJvciA9IGtlcm5lbF9yZWFkKGZpbGUsIDAsIChjaGFyICopICZleCwgc2l6ZW9mKGV4KSk7CisJaWYgKGVycm9yICE9IHNpemVvZihleCkpCisJCWdvdG8gb3V0OworCisJLyogV2UgY29tZSBpbiBoZXJlIGZvciB0aGUgcmVndWxhciBhLm91dCBzdHlsZSBvZiBzaGFyZWQgbGlicmFyaWVzICovCisJaWYgKChOX01BR0lDKGV4KSAhPSBaTUFHSUMgJiYgTl9NQUdJQyhleCkgIT0gUU1BR0lDKSB8fCBOX1RSU0laRShleCkgfHwKKwkgICAgTl9EUlNJWkUoZXgpIHx8ICgoZXguYV9lbnRyeSAmIDB4ZmZmKSAmJiBOX01BR0lDKGV4KSA9PSBaTUFHSUMpIHx8CisJICAgIGlfc2l6ZV9yZWFkKGlub2RlKSA8IGV4LmFfdGV4dCtleC5hX2RhdGErTl9TWU1TSVpFKGV4KStOX1RYVE9GRihleCkpIHsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKE5fRkxBR1MoZXgpKQorCQlnb3RvIG91dDsKKworCS8qIEZvciAgUU1BR0lDLCB0aGUgc3RhcnRpbmcgYWRkcmVzcyBpcyAweDIwIGludG8gdGhlIHBhZ2UuICBXZSBtYXNrCisJICAgdGhpcyBvZmYgdG8gZ2V0IHRoZSBzdGFydGluZyBhZGRyZXNzIGZvciB0aGUgcGFnZSAqLworCisJc3RhcnRfYWRkciA9ICBleC5hX2VudHJ5ICYgMHhmZmZmZjAwMDsKKworCWlmICgoTl9UWFRPRkYoZXgpICYgflBBR0VfTUFTSykgIT0gMCkgeworCQlzdGF0aWMgdW5zaWduZWQgbG9uZyBlcnJvcl90aW1lOworCQlsb2ZmX3QgcG9zID0gTl9UWFRPRkYoZXgpOworCisJCWlmICgoamlmZmllcy1lcnJvcl90aW1lKSA+IDUqSFopCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCQkgICAgICAgIk5fVFhUT0ZGIGlzIG5vdCBwYWdlIGFsaWduZWQuIFBsZWFzZSBjb252ZXJ0IGxpYnJhcnk6ICVzXG4iLAorCQkJICAgICAgIGZpbGUtPmZfZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCQllcnJvcl90aW1lID0gamlmZmllczsKKwkJfQorCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQlkb19icmsoc3RhcnRfYWRkciwgZXguYV90ZXh0ICsgZXguYV9kYXRhICsgZXguYV9ic3MpOworCQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwkJCisJCWZpbGUtPmZfb3AtPnJlYWQoZmlsZSwgKGNoYXIgX191c2VyICopc3RhcnRfYWRkciwKKwkJCWV4LmFfdGV4dCArIGV4LmFfZGF0YSwgJnBvcyk7CisJCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZykgc3RhcnRfYWRkciwKKwkJCQkgICAodW5zaWduZWQgbG9uZykgc3RhcnRfYWRkciArIGV4LmFfdGV4dCArIGV4LmFfZGF0YSk7CisKKwkJcmV0dmFsID0gMDsKKwkJZ290byBvdXQ7CisJfQorCS8qIE5vdyB1c2UgbW1hcCB0byBtYXAgdGhlIGxpYnJhcnkgaW50byBtZW1vcnkuICovCisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwllcnJvciA9IGRvX21tYXAoZmlsZSwgc3RhcnRfYWRkciwgZXguYV90ZXh0ICsgZXguYV9kYXRhLAorCQkJUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQywKKwkJCU1BUF9GSVhFRCB8IE1BUF9QUklWQVRFIHwgTUFQX0RFTllXUklURSwKKwkJCU5fVFhUT0ZGKGV4KSk7CisJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJcmV0dmFsID0gZXJyb3I7CisJaWYgKGVycm9yICE9IHN0YXJ0X2FkZHIpCisJCWdvdG8gb3V0OworCisJbGVuID0gUEFHRV9BTElHTihleC5hX3RleHQgKyBleC5hX2RhdGEpOworCWJzcyA9IGV4LmFfdGV4dCArIGV4LmFfZGF0YSArIGV4LmFfYnNzOworCWlmIChic3MgPiBsZW4pIHsKKwkJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwkJZXJyb3IgPSBkb19icmsoc3RhcnRfYWRkciArIGxlbiwgYnNzIC0gbGVuKTsKKwkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCXJldHZhbCA9IGVycm9yOworCQlpZiAoZXJyb3IgIT0gc3RhcnRfYWRkciArIGxlbikKKwkJCWdvdG8gb3V0OworCX0KKwlyZXR2YWwgPSAwOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYW91dF9iaW5mbXQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfYmluZm10KCZhb3V0X2Zvcm1hdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2FvdXRfYmluZm10KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9iaW5mbXQoJmFvdXRfZm9ybWF0KTsKK30KKworY29yZV9pbml0Y2FsbChpbml0X2FvdXRfYmluZm10KTsKK21vZHVsZV9leGl0KGV4aXRfYW91dF9iaW5mbXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X2VsZi5jIGIvZnMvYmluZm10X2VsZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZWM5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iaW5mbXRfZWxmLmMKQEAgLTAsMCArMSwxNjc3IEBACisvKgorICogbGludXgvZnMvYmluZm10X2VsZi5jCisgKgorICogVGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgdXNlZCB0byBsb2FkIEVMRiBmb3JtYXQgZXhlY3V0YWJsZXMgYXMgdXNlZAorICogb24gU1ZyNCBtYWNoaW5lcy4gIEluZm9ybWF0aW9uIG9uIHRoZSBmb3JtYXQgbWF5IGJlIGZvdW5kIGluIHRoZSBib29rCisgKiAiVU5JWCBTWVNURU0gViBSRUxFQVNFIDQgUHJvZ3JhbW1lcnMgR3VpZGU6IEFuc2kgQyBhbmQgUHJvZ3JhbW1pbmcgU3VwcG9ydAorICogVG9vbHMiLgorICoKKyAqIENvcHlyaWdodCAxOTkzLCAxOTk0OiBFcmljIFlvdW5nZGFsZSAoZXJpY3lAY2Fpcy5jb20pLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvYS5vdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpbmZtdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2htLmg+CisjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGZjb3JlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKworc3RhdGljIGludCBsb2FkX2VsZl9iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqIGJwcm0sIHN0cnVjdCBwdF9yZWdzICogcmVncyk7CitzdGF0aWMgaW50IGxvYWRfZWxmX2xpYnJhcnkoc3RydWN0IGZpbGUqKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGVsZl9tYXAgKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBlbGZfcGhkciAqLCBpbnQsIGludCk7CitleHRlcm4gaW50IGR1bXBfZnB1IChzdHJ1Y3QgcHRfcmVncyAqLCBlbGZfZnByZWdzZXRfdCAqKTsKKworI2lmbmRlZiBlbGZfYWRkcl90CisjZGVmaW5lIGVsZl9hZGRyX3QgdW5zaWduZWQgbG9uZworI2VuZGlmCisKKy8qCisgKiBJZiB3ZSBkb24ndCBzdXBwb3J0IGNvcmUgZHVtcGluZywgdGhlbiBzdXBwbHkgYSBOVUxMIHNvIHdlCisgKiBkb24ndCBldmVuIHRyeS4KKyAqLworI2lmZGVmIFVTRV9FTEZfQ09SRV9EVU1QCitzdGF0aWMgaW50IGVsZl9jb3JlX2R1bXAobG9uZyBzaWduciwgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpOworI2Vsc2UKKyNkZWZpbmUgZWxmX2NvcmVfZHVtcAlOVUxMCisjZW5kaWYKKworI2lmIEVMRl9FWEVDX1BBR0VTSVpFID4gUEFHRV9TSVpFCisjIGRlZmluZSBFTEZfTUlOX0FMSUdOCUVMRl9FWEVDX1BBR0VTSVpFCisjZWxzZQorIyBkZWZpbmUgRUxGX01JTl9BTElHTglQQUdFX1NJWkUKKyNlbmRpZgorCisjaWZuZGVmIEVMRl9DT1JFX0VGTEFHUworI2RlZmluZSBFTEZfQ09SRV9FRkxBR1MJMAorI2VuZGlmCisKKyNkZWZpbmUgRUxGX1BBR0VTVEFSVChfdikgKChfdikgJiB+KHVuc2lnbmVkIGxvbmcpKEVMRl9NSU5fQUxJR04tMSkpCisjZGVmaW5lIEVMRl9QQUdFT0ZGU0VUKF92KSAoKF92KSAmIChFTEZfTUlOX0FMSUdOLTEpKQorI2RlZmluZSBFTEZfUEFHRUFMSUdOKF92KSAoKChfdikgKyBFTEZfTUlOX0FMSUdOIC0gMSkgJiB+KEVMRl9NSU5fQUxJR04gLSAxKSkKKworc3RhdGljIHN0cnVjdCBsaW51eF9iaW5mbXQgZWxmX2Zvcm1hdCA9IHsKKwkJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkJLmxvYWRfYmluYXJ5CT0gbG9hZF9lbGZfYmluYXJ5LAorCQkubG9hZF9zaGxpYgk9IGxvYWRfZWxmX2xpYnJhcnksCisJCS5jb3JlX2R1bXAJPSBlbGZfY29yZV9kdW1wLAorCQkubWluX2NvcmVkdW1wCT0gRUxGX0VYRUNfUEFHRVNJWkUKK307CisKKyNkZWZpbmUgQkFEX0FERFIoeCkJKCh1bnNpZ25lZCBsb25nKSh4KSA+IFRBU0tfU0laRSkKKworc3RhdGljIGludCBzZXRfYnJrKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0YXJ0ID0gRUxGX1BBR0VBTElHTihzdGFydCk7CisJZW5kID0gRUxGX1BBR0VBTElHTihlbmQpOworCWlmIChlbmQgPiBzdGFydCkgeworCQl1bnNpZ25lZCBsb25nIGFkZHI7CisJCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCWFkZHIgPSBkb19icmsoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKwkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCWlmIChCQURfQUREUihhZGRyKSkKKwkJCXJldHVybiBhZGRyOworCX0KKwljdXJyZW50LT5tbS0+c3RhcnRfYnJrID0gY3VycmVudC0+bW0tPmJyayA9IGVuZDsKKwlyZXR1cm4gMDsKK30KKworCisvKiBXZSBuZWVkIHRvIGV4cGxpY2l0bHkgemVybyBhbnkgZnJhY3Rpb25hbCBwYWdlcworICAgYWZ0ZXIgdGhlIGRhdGEgc2VjdGlvbiAoaS5lLiBic3MpLiAgVGhpcyB3b3VsZAorICAgY29udGFpbiB0aGUganVuayBmcm9tIHRoZSBmaWxlIHRoYXQgc2hvdWxkIG5vdAorICAgYmUgaW4gbWVtb3J5ICovCisKKworc3RhdGljIGludCBwYWR6ZXJvKHVuc2lnbmVkIGxvbmcgZWxmX2JzcykKK3sKKwl1bnNpZ25lZCBsb25nIG5ieXRlOworCisJbmJ5dGUgPSBFTEZfUEFHRU9GRlNFVChlbGZfYnNzKTsKKwlpZiAobmJ5dGUpIHsKKwkJbmJ5dGUgPSBFTEZfTUlOX0FMSUdOIC0gbmJ5dGU7CisJCWlmIChjbGVhcl91c2VyKCh2b2lkIF9fdXNlciAqKSBlbGZfYnNzLCBuYnl0ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIExldCdzIHVzZSBzb21lIG1hY3JvcyB0byBtYWtlIHRoaXMgc3RhY2sgbWFuaXB1bGF0aW9uIGEgbGl0bGUgY2xlYXJlciAqLworI2lmZGVmIENPTkZJR19TVEFDS19HUk9XU1VQCisjZGVmaW5lIFNUQUNLX0FERChzcCwgaXRlbXMpICgoZWxmX2FkZHJfdCBfX3VzZXIgKikoc3ApICsgKGl0ZW1zKSkKKyNkZWZpbmUgU1RBQ0tfUk9VTkQoc3AsIGl0ZW1zKSBcCisJKCgxNSArICh1bnNpZ25lZCBsb25nKSAoKHNwKSArIChpdGVtcykpKSAmfiAxNVVMKQorI2RlZmluZSBTVEFDS19BTExPQyhzcCwgbGVuKSAoeyBlbGZfYWRkcl90IF9fdXNlciAqb2xkX3NwID0gKGVsZl9hZGRyX3QgX191c2VyICopc3A7IHNwICs9IGxlbjsgb2xkX3NwOyB9KQorI2Vsc2UKKyNkZWZpbmUgU1RBQ0tfQUREKHNwLCBpdGVtcykgKChlbGZfYWRkcl90IF9fdXNlciAqKShzcCkgLSAoaXRlbXMpKQorI2RlZmluZSBTVEFDS19ST1VORChzcCwgaXRlbXMpIFwKKwkoKCh1bnNpZ25lZCBsb25nKSAoc3AgLSBpdGVtcykpICZ+IDE1VUwpCisjZGVmaW5lIFNUQUNLX0FMTE9DKHNwLCBsZW4pICh7IHNwIC09IGxlbiA7IHNwOyB9KQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK2NyZWF0ZV9lbGZfdGFibGVzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0sIHN0cnVjdCBlbGZoZHIgKiBleGVjLAorCQlpbnQgaW50ZXJwX2FvdXQsIHVuc2lnbmVkIGxvbmcgbG9hZF9hZGRyLAorCQl1bnNpZ25lZCBsb25nIGludGVycF9sb2FkX2FkZHIpCit7CisJdW5zaWduZWQgbG9uZyBwID0gYnBybS0+cDsKKwlpbnQgYXJnYyA9IGJwcm0tPmFyZ2M7CisJaW50IGVudmMgPSBicHJtLT5lbnZjOworCWVsZl9hZGRyX3QgX191c2VyICphcmd2OworCWVsZl9hZGRyX3QgX191c2VyICplbnZwOworCWVsZl9hZGRyX3QgX191c2VyICpzcDsKKwllbGZfYWRkcl90IF9fdXNlciAqdV9wbGF0Zm9ybTsKKwljb25zdCBjaGFyICprX3BsYXRmb3JtID0gRUxGX1BMQVRGT1JNOworCWludCBpdGVtczsKKwllbGZfYWRkcl90ICplbGZfaW5mbzsKKwlpbnQgZWlfaW5kZXggPSAwOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKworCS8qCisJICogSWYgdGhpcyBhcmNoaXRlY3R1cmUgaGFzIGEgcGxhdGZvcm0gY2FwYWJpbGl0eSBzdHJpbmcsIGNvcHkgaXQKKwkgKiB0byB1c2Vyc3BhY2UuICBJbiBzb21lIGNhc2VzIChTcGFyYyksIHRoaXMgaW5mbyBpcyBpbXBvc3NpYmxlCisJICogZm9yIHVzZXJzcGFjZSB0byBnZXQgYW55IG90aGVyIHdheSwgaW4gb3RoZXJzIChpMzg2KSBpdCBpcworCSAqIG1lcmVseSBkaWZmaWN1bHQuCisJICovCisKKwl1X3BsYXRmb3JtID0gTlVMTDsKKwlpZiAoa19wbGF0Zm9ybSkgeworCQlzaXplX3QgbGVuID0gc3RybGVuKGtfcGxhdGZvcm0pICsgMTsKKworCQkvKgorCQkgKiBJbiBzb21lIGNhc2VzIChlLmcuIEh5cGVyLVRocmVhZGluZyksIHdlIHdhbnQgdG8gYXZvaWQgTDEKKwkJICogZXZpY3Rpb25zIGJ5IHRoZSBwcm9jZXNzZXMgcnVubmluZyBvbiB0aGUgc2FtZSBwYWNrYWdlLiBPbmUKKwkJICogdGhpbmcgd2UgY2FuIGRvIGlzIHRvIHNodWZmbGUgdGhlIGluaXRpYWwgc3RhY2sgZm9yIHRoZW0uCisJCSAqLworCSAKKwkJcCA9IGFyY2hfYWxpZ25fc3RhY2socCk7CisKKwkJdV9wbGF0Zm9ybSA9IChlbGZfYWRkcl90IF9fdXNlciAqKVNUQUNLX0FMTE9DKHAsIGxlbik7CisJCWlmIChfX2NvcHlfdG9fdXNlcih1X3BsYXRmb3JtLCBrX3BsYXRmb3JtLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogQ3JlYXRlIHRoZSBFTEYgaW50ZXJwcmV0ZXIgaW5mbyAqLworCWVsZl9pbmZvID0gKGVsZl9hZGRyX3QgKikgY3VycmVudC0+bW0tPnNhdmVkX2F1eHY7CisjZGVmaW5lIE5FV19BVVhfRU5UKGlkLCB2YWwpIFwKKwlkbyB7IGVsZl9pbmZvW2VpX2luZGV4KytdID0gaWQ7IGVsZl9pbmZvW2VpX2luZGV4KytdID0gdmFsOyB9IHdoaWxlICgwKQorCisjaWZkZWYgQVJDSF9ETElORk8KKwkvKiAKKwkgKiBBUkNIX0RMSU5GTyBtdXN0IGNvbWUgZmlyc3Qgc28gUFBDIGNhbiBkbyBpdHMgc3BlY2lhbCBhbGlnbm1lbnQgb2YKKwkgKiBBVVhWLgorCSAqLworCUFSQ0hfRExJTkZPOworI2VuZGlmCisJTkVXX0FVWF9FTlQoQVRfSFdDQVAsIEVMRl9IV0NBUCk7CisJTkVXX0FVWF9FTlQoQVRfUEFHRVNaLCBFTEZfRVhFQ19QQUdFU0laRSk7CisJTkVXX0FVWF9FTlQoQVRfQ0xLVENLLCBDTE9DS1NfUEVSX1NFQyk7CisJTkVXX0FVWF9FTlQoQVRfUEhEUiwgbG9hZF9hZGRyICsgZXhlYy0+ZV9waG9mZik7CisJTkVXX0FVWF9FTlQoQVRfUEhFTlQsIHNpemVvZiAoc3RydWN0IGVsZl9waGRyKSk7CisJTkVXX0FVWF9FTlQoQVRfUEhOVU0sIGV4ZWMtPmVfcGhudW0pOworCU5FV19BVVhfRU5UKEFUX0JBU0UsIGludGVycF9sb2FkX2FkZHIpOworCU5FV19BVVhfRU5UKEFUX0ZMQUdTLCAwKTsKKwlORVdfQVVYX0VOVChBVF9FTlRSWSwgZXhlYy0+ZV9lbnRyeSk7CisJTkVXX0FVWF9FTlQoQVRfVUlELCAoZWxmX2FkZHJfdCkgdHNrLT51aWQpOworCU5FV19BVVhfRU5UKEFUX0VVSUQsIChlbGZfYWRkcl90KSB0c2stPmV1aWQpOworCU5FV19BVVhfRU5UKEFUX0dJRCwgKGVsZl9hZGRyX3QpIHRzay0+Z2lkKTsKKwlORVdfQVVYX0VOVChBVF9FR0lELCAoZWxmX2FkZHJfdCkgdHNrLT5lZ2lkKTsKKyAJTkVXX0FVWF9FTlQoQVRfU0VDVVJFLCAoZWxmX2FkZHJfdCkgc2VjdXJpdHlfYnBybV9zZWN1cmVleGVjKGJwcm0pKTsKKwlpZiAoa19wbGF0Zm9ybSkgeworCQlORVdfQVVYX0VOVChBVF9QTEFURk9STSwgKGVsZl9hZGRyX3QpKHVuc2lnbmVkIGxvbmcpdV9wbGF0Zm9ybSk7CisJfQorCWlmIChicHJtLT5pbnRlcnBfZmxhZ3MgJiBCSU5QUk1fRkxBR1NfRVhFQ0ZEKSB7CisJCU5FV19BVVhfRU5UKEFUX0VYRUNGRCwgKGVsZl9hZGRyX3QpIGJwcm0tPmludGVycF9kYXRhKTsKKwl9CisjdW5kZWYgTkVXX0FVWF9FTlQKKwkvKiBBVF9OVUxMIGlzIHplcm87IGNsZWFyIHRoZSByZXN0IHRvbyAqLworCW1lbXNldCgmZWxmX2luZm9bZWlfaW5kZXhdLCAwLAorCSAgICAgICBzaXplb2YgY3VycmVudC0+bW0tPnNhdmVkX2F1eHYgLSBlaV9pbmRleCAqIHNpemVvZiBlbGZfaW5mb1swXSk7CisKKwkvKiBBbmQgYWR2YW5jZSBwYXN0IHRoZSBBVF9OVUxMIGVudHJ5LiAgKi8KKwllaV9pbmRleCArPSAyOworCisJc3AgPSBTVEFDS19BREQocCwgZWlfaW5kZXgpOworCisJaXRlbXMgPSAoYXJnYyArIDEpICsgKGVudmMgKyAxKTsKKwlpZiAoaW50ZXJwX2FvdXQpIHsKKwkJaXRlbXMgKz0gMzsgLyogYS5vdXQgaW50ZXJwcmV0ZXJzIHJlcXVpcmUgYXJndiAmIGVudnAgdG9vICovCisJfSBlbHNlIHsKKwkJaXRlbXMgKz0gMTsgLyogRUxGIGludGVycHJldGVycyBvbmx5IHB1dCBhcmdjIG9uIHRoZSBzdGFjayAqLworCX0KKwlicHJtLT5wID0gU1RBQ0tfUk9VTkQoc3AsIGl0ZW1zKTsKKworCS8qIFBvaW50IHNwIGF0IHRoZSBsb3dlc3QgYWRkcmVzcyBvbiB0aGUgc3RhY2sgKi8KKyNpZmRlZiBDT05GSUdfU1RBQ0tfR1JPV1NVUAorCXNwID0gKGVsZl9hZGRyX3QgX191c2VyICopYnBybS0+cCAtIGl0ZW1zIC0gZWlfaW5kZXg7CisJYnBybS0+ZXhlYyA9ICh1bnNpZ25lZCBsb25nKSBzcDsgLyogWFhYOiBQQVJJU0MgSEFDSyAqLworI2Vsc2UKKwlzcCA9IChlbGZfYWRkcl90IF9fdXNlciAqKWJwcm0tPnA7CisjZW5kaWYKKworCS8qIE5vdywgbGV0J3MgcHV0IGFyZ2MgKGFuZCBhcmd2LCBlbnZwIGlmIGFwcHJvcHJpYXRlKSBvbiB0aGUgc3RhY2sgKi8KKwlpZiAoX19wdXRfdXNlcihhcmdjLCBzcCsrKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGludGVycF9hb3V0KSB7CisJCWFyZ3YgPSBzcCArIDI7CisJCWVudnAgPSBhcmd2ICsgYXJnYyArIDE7CisJCV9fcHV0X3VzZXIoKGVsZl9hZGRyX3QpKHVuc2lnbmVkIGxvbmcpYXJndiwgc3ArKyk7CisJCV9fcHV0X3VzZXIoKGVsZl9hZGRyX3QpKHVuc2lnbmVkIGxvbmcpZW52cCwgc3ArKyk7CisJfSBlbHNlIHsKKwkJYXJndiA9IHNwOworCQllbnZwID0gYXJndiArIGFyZ2MgKyAxOworCX0KKworCS8qIFBvcHVsYXRlIGFyZ3YgYW5kIGVudnAgKi8KKwlwID0gY3VycmVudC0+bW0tPmFyZ19zdGFydDsKKwl3aGlsZSAoYXJnYy0tID4gMCkgeworCQlzaXplX3QgbGVuOworCQlfX3B1dF91c2VyKChlbGZfYWRkcl90KXAsIGFyZ3YrKyk7CisJCWxlbiA9IHN0cm5sZW5fdXNlcigodm9pZCBfX3VzZXIgKilwLCBQQUdFX1NJWkUqTUFYX0FSR19QQUdFUyk7CisJCWlmICghbGVuIHx8IGxlbiA+IFBBR0VfU0laRSpNQVhfQVJHX1BBR0VTKQorCQkJcmV0dXJuIDA7CisJCXAgKz0gbGVuOworCX0KKwlpZiAoX19wdXRfdXNlcigwLCBhcmd2KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJY3VycmVudC0+bW0tPmFyZ19lbmQgPSBjdXJyZW50LT5tbS0+ZW52X3N0YXJ0ID0gcDsKKwl3aGlsZSAoZW52Yy0tID4gMCkgeworCQlzaXplX3QgbGVuOworCQlfX3B1dF91c2VyKChlbGZfYWRkcl90KXAsIGVudnArKyk7CisJCWxlbiA9IHN0cm5sZW5fdXNlcigodm9pZCBfX3VzZXIgKilwLCBQQUdFX1NJWkUqTUFYX0FSR19QQUdFUyk7CisJCWlmICghbGVuIHx8IGxlbiA+IFBBR0VfU0laRSpNQVhfQVJHX1BBR0VTKQorCQkJcmV0dXJuIDA7CisJCXAgKz0gbGVuOworCX0KKwlpZiAoX19wdXRfdXNlcigwLCBlbnZwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJY3VycmVudC0+bW0tPmVudl9lbmQgPSBwOworCisJLyogUHV0IHRoZSBlbGZfaW5mbyBvbiB0aGUgc3RhY2sgaW4gdGhlIHJpZ2h0IHBsYWNlLiAgKi8KKwlzcCA9IChlbGZfYWRkcl90IF9fdXNlciAqKWVudnAgKyAxOworCWlmIChjb3B5X3RvX3VzZXIoc3AsIGVsZl9pbmZvLCBlaV9pbmRleCAqIHNpemVvZihlbGZfYWRkcl90KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisjaWZuZGVmIGVsZl9tYXAKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZWxmX21hcChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCXN0cnVjdCBlbGZfcGhkciAqZXBwbnQsIGludCBwcm90LCBpbnQgdHlwZSkKK3sKKwl1bnNpZ25lZCBsb25nIG1hcF9hZGRyOworCisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwltYXBfYWRkciA9IGRvX21tYXAoZmlsZXAsIEVMRl9QQUdFU1RBUlQoYWRkciksCisJCQkgICBlcHBudC0+cF9maWxlc3ogKyBFTEZfUEFHRU9GRlNFVChlcHBudC0+cF92YWRkciksIHByb3QsIHR5cGUsCisJCQkgICBlcHBudC0+cF9vZmZzZXQgLSBFTEZfUEFHRU9GRlNFVChlcHBudC0+cF92YWRkcikpOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCXJldHVybihtYXBfYWRkcik7Cit9CisKKyNlbmRpZiAvKiAhZWxmX21hcCAqLworCisvKiBUaGlzIGlzIG11Y2ggbW9yZSBnZW5lcmFsaXplZCB0aGFuIHRoZSBsaWJyYXJ5IHJvdXRpbmUgcmVhZCBmdW5jdGlvbiwKKyAgIHNvIHdlIGtlZXAgdGhpcyBzZXBhcmF0ZS4gIFRlY2huaWNhbGx5IHRoZSBsaWJyYXJ5IHJlYWQgZnVuY3Rpb24KKyAgIGlzIG9ubHkgcHJvdmlkZWQgc28gdGhhdCB3ZSBjYW4gcmVhZCBhLm91dCBsaWJyYXJpZXMgdGhhdCBoYXZlCisgICBhbiBFTEYgaGVhZGVyICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvYWRfZWxmX2ludGVycChzdHJ1Y3QgZWxmaGRyICogaW50ZXJwX2VsZl9leCwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICogaW50ZXJwcmV0ZXIsCisJCQkJICAgICB1bnNpZ25lZCBsb25nICppbnRlcnBfbG9hZF9hZGRyKQoreworCXN0cnVjdCBlbGZfcGhkciAqZWxmX3BoZGF0YTsKKwlzdHJ1Y3QgZWxmX3BoZHIgKmVwcG50OworCXVuc2lnbmVkIGxvbmcgbG9hZF9hZGRyID0gMDsKKwlpbnQgbG9hZF9hZGRyX3NldCA9IDA7CisJdW5zaWduZWQgbG9uZyBsYXN0X2JzcyA9IDAsIGVsZl9ic3MgPSAwOworCXVuc2lnbmVkIGxvbmcgZXJyb3IgPSB+MFVMOworCWludCByZXR2YWwsIGksIHNpemU7CisKKwkvKiBGaXJzdCBvZiBhbGwsIHNvbWUgc2ltcGxlIGNvbnNpc3RlbmN5IGNoZWNrcyAqLworCWlmIChpbnRlcnBfZWxmX2V4LT5lX3R5cGUgIT0gRVRfRVhFQyAmJgorCSAgICBpbnRlcnBfZWxmX2V4LT5lX3R5cGUgIT0gRVRfRFlOKQorCQlnb3RvIG91dDsKKwlpZiAoIWVsZl9jaGVja19hcmNoKGludGVycF9lbGZfZXgpKQorCQlnb3RvIG91dDsKKwlpZiAoIWludGVycHJldGVyLT5mX29wIHx8ICFpbnRlcnByZXRlci0+Zl9vcC0+bW1hcCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIElmIHRoZSBzaXplIG9mIHRoaXMgc3RydWN0dXJlIGhhcyBjaGFuZ2VkLCB0aGVuIHB1bnQsIHNpbmNlCisJICogd2Ugd2lsbCBiZSBkb2luZyB0aGUgd3JvbmcgdGhpbmcuCisJICovCisJaWYgKGludGVycF9lbGZfZXgtPmVfcGhlbnRzaXplICE9IHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpKQorCQlnb3RvIG91dDsKKwlpZiAoaW50ZXJwX2VsZl9leC0+ZV9waG51bSA8IDEgfHwKKwkJaW50ZXJwX2VsZl9leC0+ZV9waG51bSA+IDY1NTM2VSAvIHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpKQorCQlnb3RvIG91dDsKKworCS8qIE5vdyByZWFkIGluIGFsbCBvZiB0aGUgaGVhZGVyIGluZm9ybWF0aW9uICovCisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBlbGZfcGhkcikgKiBpbnRlcnBfZWxmX2V4LT5lX3BobnVtOworCWlmIChzaXplID4gRUxGX01JTl9BTElHTikKKwkJZ290byBvdXQ7CisJZWxmX3BoZGF0YSA9IChzdHJ1Y3QgZWxmX3BoZHIgKikga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVsZl9waGRhdGEpCisJCWdvdG8gb3V0OworCisJcmV0dmFsID0ga2VybmVsX3JlYWQoaW50ZXJwcmV0ZXIsaW50ZXJwX2VsZl9leC0+ZV9waG9mZiwoY2hhciAqKWVsZl9waGRhdGEsc2l6ZSk7CisJZXJyb3IgPSAtRUlPOworCWlmIChyZXR2YWwgIT0gc2l6ZSkgeworCQlpZiAocmV0dmFsIDwgMCkKKwkJCWVycm9yID0gcmV0dmFsOwkKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCisJZXBwbnQgPSBlbGZfcGhkYXRhOworCWZvciAoaT0wOyBpPGludGVycF9lbGZfZXgtPmVfcGhudW07IGkrKywgZXBwbnQrKykgeworCSAgaWYgKGVwcG50LT5wX3R5cGUgPT0gUFRfTE9BRCkgeworCSAgICBpbnQgZWxmX3R5cGUgPSBNQVBfUFJJVkFURSB8IE1BUF9ERU5ZV1JJVEU7CisJICAgIGludCBlbGZfcHJvdCA9IDA7CisJICAgIHVuc2lnbmVkIGxvbmcgdmFkZHIgPSAwOworCSAgICB1bnNpZ25lZCBsb25nIGssIG1hcF9hZGRyOworCisJICAgIGlmIChlcHBudC0+cF9mbGFncyAmIFBGX1IpIGVsZl9wcm90ID0gIFBST1RfUkVBRDsKKwkgICAgaWYgKGVwcG50LT5wX2ZsYWdzICYgUEZfVykgZWxmX3Byb3QgfD0gUFJPVF9XUklURTsKKwkgICAgaWYgKGVwcG50LT5wX2ZsYWdzICYgUEZfWCkgZWxmX3Byb3QgfD0gUFJPVF9FWEVDOworCSAgICB2YWRkciA9IGVwcG50LT5wX3ZhZGRyOworCSAgICBpZiAoaW50ZXJwX2VsZl9leC0+ZV90eXBlID09IEVUX0VYRUMgfHwgbG9hZF9hZGRyX3NldCkKKwkgICAgCWVsZl90eXBlIHw9IE1BUF9GSVhFRDsKKworCSAgICBtYXBfYWRkciA9IGVsZl9tYXAoaW50ZXJwcmV0ZXIsIGxvYWRfYWRkciArIHZhZGRyLCBlcHBudCwgZWxmX3Byb3QsIGVsZl90eXBlKTsKKwkgICAgZXJyb3IgPSBtYXBfYWRkcjsKKwkgICAgaWYgKEJBRF9BRERSKG1hcF9hZGRyKSkKKwkgICAgCWdvdG8gb3V0X2Nsb3NlOworCisJICAgIGlmICghbG9hZF9hZGRyX3NldCAmJiBpbnRlcnBfZWxmX2V4LT5lX3R5cGUgPT0gRVRfRFlOKSB7CisJCWxvYWRfYWRkciA9IG1hcF9hZGRyIC0gRUxGX1BBR0VTVEFSVCh2YWRkcik7CisJCWxvYWRfYWRkcl9zZXQgPSAxOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBzZWN0aW9uJ3Mgc2l6ZSB3aWxsIG92ZXJmbG93IHRoZQorCSAgICAgKiBhbGxvd2VkIHRhc2sgc2l6ZS4gTm90ZSB0aGF0IHBfZmlsZXN6IG11c3QgYWx3YXlzIGJlCisJICAgICAqIDw9IHBfbWVtc2l6ZSBzbyBpdCBpcyBvbmx5IG5lY2Vzc2FyeSB0byBjaGVjayBwX21lbXN6LgorCSAgICAgKi8KKwkgICAgayA9IGxvYWRfYWRkciArIGVwcG50LT5wX3ZhZGRyOworCSAgICBpZiAoayA+IFRBU0tfU0laRSB8fCBlcHBudC0+cF9maWxlc3ogPiBlcHBudC0+cF9tZW1zeiB8fAorCQllcHBudC0+cF9tZW1zeiA+IFRBU0tfU0laRSB8fCBUQVNLX1NJWkUgLSBlcHBudC0+cF9tZW1zeiA8IGspIHsKKwkgICAgICAgIGVycm9yID0gLUVOT01FTTsKKwkJZ290byBvdXRfY2xvc2U7CisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGZpbGUgbWFwcGluZyBmb3IgdGhpcyBwaGRyLCBhbmQga2VlcAorCSAgICAgKiB0cmFjayBvZiB0aGUgbGFyZ2VzdCBhZGRyZXNzIHdlIHNlZSBmb3IgdGhpcy4KKwkgICAgICovCisJICAgIGsgPSBsb2FkX2FkZHIgKyBlcHBudC0+cF92YWRkciArIGVwcG50LT5wX2ZpbGVzejsKKwkgICAgaWYgKGsgPiBlbGZfYnNzKQorCQllbGZfYnNzID0gazsKKworCSAgICAvKgorCSAgICAgKiBEbyB0aGUgc2FtZSB0aGluZyBmb3IgdGhlIG1lbW9yeSBtYXBwaW5nIC0gYmV0d2VlbgorCSAgICAgKiBlbGZfYnNzIGFuZCBsYXN0X2JzcyBpcyB0aGUgYnNzIHNlY3Rpb24uCisJICAgICAqLworCSAgICBrID0gbG9hZF9hZGRyICsgZXBwbnQtPnBfbWVtc3ogKyBlcHBudC0+cF92YWRkcjsKKwkgICAgaWYgKGsgPiBsYXN0X2JzcykKKwkJbGFzdF9ic3MgPSBrOworCSAgfQorCX0KKworCS8qCisJICogTm93IGZpbGwgb3V0IHRoZSBic3Mgc2VjdGlvbi4gIEZpcnN0IHBhZCB0aGUgbGFzdCBwYWdlIHVwCisJICogdG8gdGhlIHBhZ2UgYm91bmRhcnksIGFuZCB0aGVuIHBlcmZvcm0gYSBtbWFwIHRvIG1ha2Ugc3VyZQorCSAqIHRoYXQgdGhlcmUgYXJlIHplcm8tbWFwcGVkIHBhZ2VzIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIAorCSAqIGxhc3QgYnNzIHBhZ2UuCisJICovCisJaWYgKHBhZHplcm8oZWxmX2JzcykpIHsKKwkJZXJyb3IgPSAtRUZBVUxUOworCQlnb3RvIG91dF9jbG9zZTsKKwl9CisKKwllbGZfYnNzID0gRUxGX1BBR0VTVEFSVChlbGZfYnNzICsgRUxGX01JTl9BTElHTiAtIDEpOwkvKiBXaGF0IHdlIGhhdmUgbWFwcGVkIHNvIGZhciAqLworCisJLyogTWFwIHRoZSBsYXN0IG9mIHRoZSBic3Mgc2VnbWVudCAqLworCWlmIChsYXN0X2JzcyA+IGVsZl9ic3MpIHsKKwkJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwkJZXJyb3IgPSBkb19icmsoZWxmX2JzcywgbGFzdF9ic3MgLSBlbGZfYnNzKTsKKwkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCWlmIChCQURfQUREUihlcnJvcikpCisJCQlnb3RvIG91dF9jbG9zZTsKKwl9CisKKwkqaW50ZXJwX2xvYWRfYWRkciA9IGxvYWRfYWRkcjsKKwllcnJvciA9ICgodW5zaWduZWQgbG9uZykgaW50ZXJwX2VsZl9leC0+ZV9lbnRyeSkgKyBsb2FkX2FkZHI7CisKK291dF9jbG9zZToKKwlrZnJlZShlbGZfcGhkYXRhKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvYWRfYW91dF9pbnRlcnAoc3RydWN0IGV4ZWMgKiBpbnRlcnBfZXgsCisJCQkgICAgIHN0cnVjdCBmaWxlICogaW50ZXJwcmV0ZXIpCit7CisJdW5zaWduZWQgbG9uZyB0ZXh0X2RhdGEsIGVsZl9lbnRyeSA9IH4wVUw7CisJY2hhciBfX3VzZXIgKiBhZGRyOworCWxvZmZfdCBvZmZzZXQ7CisKKwljdXJyZW50LT5tbS0+ZW5kX2NvZGUgPSBpbnRlcnBfZXgtPmFfdGV4dDsKKwl0ZXh0X2RhdGEgPSBpbnRlcnBfZXgtPmFfdGV4dCArIGludGVycF9leC0+YV9kYXRhOworCWN1cnJlbnQtPm1tLT5lbmRfZGF0YSA9IHRleHRfZGF0YTsKKwljdXJyZW50LT5tbS0+YnJrID0gaW50ZXJwX2V4LT5hX2JzcyArIHRleHRfZGF0YTsKKworCXN3aXRjaCAoTl9NQUdJQygqaW50ZXJwX2V4KSkgeworCWNhc2UgT01BR0lDOgorCQlvZmZzZXQgPSAzMjsKKwkJYWRkciA9IChjaGFyIF9fdXNlciAqKTA7CisJCWJyZWFrOworCWNhc2UgWk1BR0lDOgorCWNhc2UgUU1BR0lDOgorCQlvZmZzZXQgPSBOX1RYVE9GRigqaW50ZXJwX2V4KTsKKwkJYWRkciA9IChjaGFyIF9fdXNlciAqKSBOX1RYVEFERFIoKmludGVycF9leCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gb3V0OworCX0KKworCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CQorCWRvX2JyaygwLCB0ZXh0X2RhdGEpOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCWlmICghaW50ZXJwcmV0ZXItPmZfb3AgfHwgIWludGVycHJldGVyLT5mX29wLT5yZWFkKQorCQlnb3RvIG91dDsKKwlpZiAoaW50ZXJwcmV0ZXItPmZfb3AtPnJlYWQoaW50ZXJwcmV0ZXIsIGFkZHIsIHRleHRfZGF0YSwgJm9mZnNldCkgPCAwKQorCQlnb3RvIG91dDsKKwlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpYWRkciwKKwkgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpYWRkciArIHRleHRfZGF0YSk7CisKKworCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CQorCWRvX2JyayhFTEZfUEFHRVNUQVJUKHRleHRfZGF0YSArIEVMRl9NSU5fQUxJR04gLSAxKSwKKwkJaW50ZXJwX2V4LT5hX2Jzcyk7CisJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJZWxmX2VudHJ5ID0gaW50ZXJwX2V4LT5hX2VudHJ5OworCitvdXQ6CisJcmV0dXJuIGVsZl9lbnRyeTsKK30KKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIHVzZWQgdG8gbG9hZCBFTEYgc3R5bGUgZXhlY3V0YWJsZXMgYW5kIHNoYXJlZAorICogbGlicmFyaWVzLiAgVGhlcmUgaXMgbm8gYmluYXJ5IGRlcGVuZGVudCBjb2RlIGFueXdoZXJlIGVsc2UuCisgKi8KKworI2RlZmluZSBJTlRFUlBSRVRFUl9OT05FIDAKKyNkZWZpbmUgSU5URVJQUkVURVJfQU9VVCAxCisjZGVmaW5lIElOVEVSUFJFVEVSX0VMRiAyCisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZG9taXplX3N0YWNrX3RvcCh1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCkKK3sKKwl1bnNpZ25lZCBpbnQgcmFuZG9tX3ZhcmlhYmxlID0gMDsKKworCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX1JBTkRPTUlaRSkKKwkJcmFuZG9tX3ZhcmlhYmxlID0gZ2V0X3JhbmRvbV9pbnQoKSAlICg4KjEwMjQqMTAyNCk7CisjaWZkZWYgQ09ORklHX1NUQUNLX0dST1dTVVAKKwlyZXR1cm4gUEFHRV9BTElHTihzdGFja190b3AgKyByYW5kb21fdmFyaWFibGUpOworI2Vsc2UKKwlyZXR1cm4gUEFHRV9BTElHTihzdGFja190b3AgLSByYW5kb21fdmFyaWFibGUpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgbG9hZF9lbGZfYmluYXJ5KHN0cnVjdCBsaW51eF9iaW5wcm0gKiBicHJtLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IGZpbGUgKmludGVycHJldGVyID0gTlVMTDsgLyogdG8gc2h1dCBnY2MgdXAgKi8KKyAJdW5zaWduZWQgbG9uZyBsb2FkX2FkZHIgPSAwLCBsb2FkX2JpYXMgPSAwOworCWludCBsb2FkX2FkZHJfc2V0ID0gMDsKKwljaGFyICogZWxmX2ludGVycHJldGVyID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgaW50ZXJwcmV0ZXJfdHlwZSA9IElOVEVSUFJFVEVSX05PTkU7CisJdW5zaWduZWQgY2hhciBpYmNzMl9pbnRlcnByZXRlciA9IDA7CisJdW5zaWduZWQgbG9uZyBlcnJvcjsKKwlzdHJ1Y3QgZWxmX3BoZHIgKiBlbGZfcHBudCwgKmVsZl9waGRhdGE7CisJdW5zaWduZWQgbG9uZyBlbGZfYnNzLCBlbGZfYnJrOworCWludCBlbGZfZXhlY19maWxlbm87CisJaW50IHJldHZhbCwgaTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGVsZl9lbnRyeSwgaW50ZXJwX2xvYWRfYWRkciA9IDA7CisJdW5zaWduZWQgbG9uZyBzdGFydF9jb2RlLCBlbmRfY29kZSwgc3RhcnRfZGF0YSwgZW5kX2RhdGE7CisJdW5zaWduZWQgbG9uZyByZWxvY19mdW5jX2Rlc2MgPSAwOworCWNoYXIgcGFzc2VkX2ZpbGVub1s2XTsKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKKwlpbnQgaGF2ZV9wdF9nbnVfc3RhY2ssIGV4ZWN1dGFibGVfc3RhY2sgPSBFWFNUQUNLX0RFRkFVTFQ7CisJdW5zaWduZWQgbG9uZyBkZWZfZmxhZ3MgPSAwOworCXN0cnVjdCB7CisJCXN0cnVjdCBlbGZoZHIgZWxmX2V4OworCQlzdHJ1Y3QgZWxmaGRyIGludGVycF9lbGZfZXg7CisgIAkJc3RydWN0IGV4ZWMgaW50ZXJwX2V4OworCX0gKmxvYzsKKworCWxvYyA9IGttYWxsb2Moc2l6ZW9mKCpsb2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxvYykgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIG91dF9yZXQ7CisJfQorCQorCS8qIEdldCB0aGUgZXhlYy1oZWFkZXIgKi8KKwlsb2MtPmVsZl9leCA9ICooKHN0cnVjdCBlbGZoZHIgKikgYnBybS0+YnVmKTsKKworCXJldHZhbCA9IC1FTk9FWEVDOworCS8qIEZpcnN0IG9mIGFsbCwgc29tZSBzaW1wbGUgY29uc2lzdGVuY3kgY2hlY2tzICovCisJaWYgKG1lbWNtcChsb2MtPmVsZl9leC5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpICE9IDApCisJCWdvdG8gb3V0OworCisJaWYgKGxvYy0+ZWxmX2V4LmVfdHlwZSAhPSBFVF9FWEVDICYmIGxvYy0+ZWxmX2V4LmVfdHlwZSAhPSBFVF9EWU4pCisJCWdvdG8gb3V0OworCWlmICghZWxmX2NoZWNrX2FyY2goJmxvYy0+ZWxmX2V4KSkKKwkJZ290byBvdXQ7CisJaWYgKCFicHJtLT5maWxlLT5mX29wfHwhYnBybS0+ZmlsZS0+Zl9vcC0+bW1hcCkKKwkJZ290byBvdXQ7CisKKwkvKiBOb3cgcmVhZCBpbiBhbGwgb2YgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiAqLworCisJaWYgKGxvYy0+ZWxmX2V4LmVfcGhlbnRzaXplICE9IHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpKQorCQlnb3RvIG91dDsKKwlpZiAobG9jLT5lbGZfZXguZV9waG51bSA8IDEgfHwKKwkgCWxvYy0+ZWxmX2V4LmVfcGhudW0gPiA2NTUzNlUgLyBzaXplb2Yoc3RydWN0IGVsZl9waGRyKSkKKwkJZ290byBvdXQ7CisJc2l6ZSA9IGxvYy0+ZWxmX2V4LmVfcGhudW0gKiBzaXplb2Yoc3RydWN0IGVsZl9waGRyKTsKKwlyZXR2YWwgPSAtRU5PTUVNOworCWVsZl9waGRhdGEgPSAoc3RydWN0IGVsZl9waGRyICopIGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbGZfcGhkYXRhKQorCQlnb3RvIG91dDsKKworCXJldHZhbCA9IGtlcm5lbF9yZWFkKGJwcm0tPmZpbGUsIGxvYy0+ZWxmX2V4LmVfcGhvZmYsIChjaGFyICopIGVsZl9waGRhdGEsIHNpemUpOworCWlmIChyZXR2YWwgIT0gc2l6ZSkgeworCQlpZiAocmV0dmFsID49IDApCisJCQlyZXR2YWwgPSAtRUlPOworCQlnb3RvIG91dF9mcmVlX3BoOworCX0KKworCWZpbGVzID0gY3VycmVudC0+ZmlsZXM7CQkvKiBSZWZjb3VudGVkIHNvIG9rICovCisJcmV0dmFsID0gdW5zaGFyZV9maWxlcygpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIG91dF9mcmVlX3BoOworCWlmIChmaWxlcyA9PSBjdXJyZW50LT5maWxlcykgeworCQlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKKwkJZmlsZXMgPSBOVUxMOworCX0KKworCS8qIGV4ZWMgd2lsbCBtYWtlIG91ciBmaWxlcyBwcml2YXRlIGFueXdheSwgYnV0IGZvciB0aGUgYS5vdXQKKwkgICBsb2FkZXIgc3R1ZmYgd2UgbmVlZCB0byBkbyBpdCBlYXJsaWVyICovCisKKwlyZXR2YWwgPSBnZXRfdW51c2VkX2ZkKCk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0X2ZyZWVfZmg7CisJZ2V0X2ZpbGUoYnBybS0+ZmlsZSk7CisJZmRfaW5zdGFsbChlbGZfZXhlY19maWxlbm8gPSByZXR2YWwsIGJwcm0tPmZpbGUpOworCisJZWxmX3BwbnQgPSBlbGZfcGhkYXRhOworCWVsZl9ic3MgPSAwOworCWVsZl9icmsgPSAwOworCisJc3RhcnRfY29kZSA9IH4wVUw7CisJZW5kX2NvZGUgPSAwOworCXN0YXJ0X2RhdGEgPSAwOworCWVuZF9kYXRhID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBsb2MtPmVsZl9leC5lX3BobnVtOyBpKyspIHsKKwkJaWYgKGVsZl9wcG50LT5wX3R5cGUgPT0gUFRfSU5URVJQKSB7CisJCQkvKiBUaGlzIGlzIHRoZSBwcm9ncmFtIGludGVycHJldGVyIHVzZWQgZm9yCisJCQkgKiBzaGFyZWQgbGlicmFyaWVzIC0gZm9yIG5vdyBhc3N1bWUgdGhhdCB0aGlzCisJCQkgKiBpcyBhbiBhLm91dCBmb3JtYXQgYmluYXJ5CisJCQkgKi8KKworCQkJcmV0dmFsID0gLUVOT0VYRUM7CisJCQlpZiAoZWxmX3BwbnQtPnBfZmlsZXN6ID4gUEFUSF9NQVggfHwgCisJCQkgICAgZWxmX3BwbnQtPnBfZmlsZXN6IDwgMikKKwkJCQlnb3RvIG91dF9mcmVlX2ZpbGU7CisKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQllbGZfaW50ZXJwcmV0ZXIgPSAoY2hhciAqKSBrbWFsbG9jKGVsZl9wcG50LT5wX2ZpbGVzeiwKKwkJCQkJCQkgICBHRlBfS0VSTkVMKTsKKwkJCWlmICghZWxmX2ludGVycHJldGVyKQorCQkJCWdvdG8gb3V0X2ZyZWVfZmlsZTsKKworCQkJcmV0dmFsID0ga2VybmVsX3JlYWQoYnBybS0+ZmlsZSwgZWxmX3BwbnQtPnBfb2Zmc2V0LAorCQkJCQkgICBlbGZfaW50ZXJwcmV0ZXIsCisJCQkJCSAgIGVsZl9wcG50LT5wX2ZpbGVzeik7CisJCQlpZiAocmV0dmFsICE9IGVsZl9wcG50LT5wX2ZpbGVzeikgeworCQkJCWlmIChyZXR2YWwgPj0gMCkKKwkJCQkJcmV0dmFsID0gLUVJTzsKKwkJCQlnb3RvIG91dF9mcmVlX2ludGVycDsKKwkJCX0KKwkJCS8qIG1ha2Ugc3VyZSBwYXRoIGlzIE5VTEwgdGVybWluYXRlZCAqLworCQkJcmV0dmFsID0gLUVOT0VYRUM7CisJCQlpZiAoZWxmX2ludGVycHJldGVyW2VsZl9wcG50LT5wX2ZpbGVzeiAtIDFdICE9ICdcMCcpCisJCQkJZ290byBvdXRfZnJlZV9pbnRlcnA7CisKKwkJCS8qIElmIHRoZSBwcm9ncmFtIGludGVycHJldGVyIGlzIG9uZSBvZiB0aGVzZSB0d28sCisJCQkgKiB0aGVuIGFzc3VtZSBhbiBpQkNTMiBpbWFnZS4gT3RoZXJ3aXNlIGFzc3VtZQorCQkJICogYSBuYXRpdmUgbGludXggaW1hZ2UuCisJCQkgKi8KKwkJCWlmIChzdHJjbXAoZWxmX2ludGVycHJldGVyLCIvdXNyL2xpYi9saWJjLnNvLjEiKSA9PSAwIHx8CisJCQkgICAgc3RyY21wKGVsZl9pbnRlcnByZXRlciwiL3Vzci9saWIvbGQuc28uMSIpID09IDApCisJCQkJaWJjczJfaW50ZXJwcmV0ZXIgPSAxOworCisJCQkvKgorCQkJICogVGhlIGVhcmx5IFNFVF9QRVJTT05BTElUWSBoZXJlIGlzIHNvIHRoYXQgdGhlIGxvb2t1cAorCQkJICogZm9yIHRoZSBpbnRlcnByZXRlciBoYXBwZW5zIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIAorCQkJICogdG8tYmUtZXhlY2VkIGltYWdlLiAgU0VUX1BFUlNPTkFMSVRZIGNhbiBzZWxlY3QgYW4KKwkJCSAqIGFsdGVybmF0ZSByb290LgorCQkJICoKKwkJCSAqIEhvd2V2ZXIsIFNFVF9QRVJTT05BTElUWSBpcyBOT1QgYWxsb3dlZCB0byBzd2l0Y2gKKwkJCSAqIHRoaXMgdGFzayBpbnRvIHRoZSBuZXcgaW1hZ2VzJ3MgbWVtb3J5IG1hcHBpbmcKKwkJCSAqIHBvbGljeSAtIHRoYXQgaXMsIFRBU0tfU0laRSBtdXN0IHN0aWxsIGV2YWx1YXRlIHRvCisJCQkgKiB0aGF0IHdoaWNoIGlzIGFwcHJvcHJpYXRlIHRvIHRoZSBleGVjaW5nIGFwcGxpY2F0aW9uLgorCQkJICogVGhpcyBpcyBiZWNhdXNlIGV4aXRfbW1hcCgpIG5lZWRzIHRvIGhhdmUgVEFTS19TSVpFCisJCQkgKiBldmFsdWF0ZSB0byB0aGUgc2l6ZSBvZiB0aGUgb2xkIGltYWdlLgorCQkJICoKKwkJCSAqIFNvIGlmIChzYXkpIGEgNjQtYml0IGFwcGxpY2F0aW9uIGlzIGV4ZWNpbmcgYSAzMi1iaXQKKwkJCSAqIGFwcGxpY2F0aW9uIGl0IGlzIHRoZSBhcmNoaXRlY3R1cmUncyByZXNwb25zaWJpbGl0eQorCQkJICogdG8gZGVmZXIgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIFRBU0tfU0laRSB1bnRpbCB0aGUKKwkJCSAqIHN3aXRjaCByZWFsbHkgaXMgZ29pbmcgdG8gaGFwcGVuIC0gZG8gdGhpcyBpbgorCQkJICogZmx1c2hfdGhyZWFkKCkuCS0gYWtwbQorCQkJICovCisJCQlTRVRfUEVSU09OQUxJVFkobG9jLT5lbGZfZXgsIGliY3MyX2ludGVycHJldGVyKTsKKworCQkJaW50ZXJwcmV0ZXIgPSBvcGVuX2V4ZWMoZWxmX2ludGVycHJldGVyKTsKKwkJCXJldHZhbCA9IFBUUl9FUlIoaW50ZXJwcmV0ZXIpOworCQkJaWYgKElTX0VSUihpbnRlcnByZXRlcikpCisJCQkJZ290byBvdXRfZnJlZV9pbnRlcnA7CisJCQlyZXR2YWwgPSBrZXJuZWxfcmVhZChpbnRlcnByZXRlciwgMCwgYnBybS0+YnVmLCBCSU5QUk1fQlVGX1NJWkUpOworCQkJaWYgKHJldHZhbCAhPSBCSU5QUk1fQlVGX1NJWkUpIHsKKwkJCQlpZiAocmV0dmFsID49IDApCisJCQkJCXJldHZhbCA9IC1FSU87CisJCQkJZ290byBvdXRfZnJlZV9kZW50cnk7CisJCQl9CisKKwkJCS8qIEdldCB0aGUgZXhlYyBoZWFkZXJzICovCisJCQlsb2MtPmludGVycF9leCA9ICooKHN0cnVjdCBleGVjICopIGJwcm0tPmJ1Zik7CisJCQlsb2MtPmludGVycF9lbGZfZXggPSAqKChzdHJ1Y3QgZWxmaGRyICopIGJwcm0tPmJ1Zik7CisJCQlicmVhazsKKwkJfQorCQllbGZfcHBudCsrOworCX0KKworCWVsZl9wcG50ID0gZWxmX3BoZGF0YTsKKwlmb3IgKGkgPSAwOyBpIDwgbG9jLT5lbGZfZXguZV9waG51bTsgaSsrLCBlbGZfcHBudCsrKQorCQlpZiAoZWxmX3BwbnQtPnBfdHlwZSA9PSBQVF9HTlVfU1RBQ0spIHsKKwkJCWlmIChlbGZfcHBudC0+cF9mbGFncyAmIFBGX1gpCisJCQkJZXhlY3V0YWJsZV9zdGFjayA9IEVYU1RBQ0tfRU5BQkxFX1g7CisJCQllbHNlCisJCQkJZXhlY3V0YWJsZV9zdGFjayA9IEVYU1RBQ0tfRElTQUJMRV9YOworCQkJYnJlYWs7CisJCX0KKwloYXZlX3B0X2dudV9zdGFjayA9IChpIDwgbG9jLT5lbGZfZXguZV9waG51bSk7CisKKwkvKiBTb21lIHNpbXBsZSBjb25zaXN0ZW5jeSBjaGVja3MgZm9yIHRoZSBpbnRlcnByZXRlciAqLworCWlmIChlbGZfaW50ZXJwcmV0ZXIpIHsKKwkJaW50ZXJwcmV0ZXJfdHlwZSA9IElOVEVSUFJFVEVSX0VMRiB8IElOVEVSUFJFVEVSX0FPVVQ7CisKKwkJLyogTm93IGZpZ3VyZSBvdXQgd2hpY2ggZm9ybWF0IG91ciBiaW5hcnkgaXMgKi8KKwkJaWYgKChOX01BR0lDKGxvYy0+aW50ZXJwX2V4KSAhPSBPTUFHSUMpICYmCisJCSAgICAoTl9NQUdJQyhsb2MtPmludGVycF9leCkgIT0gWk1BR0lDKSAmJgorCQkgICAgKE5fTUFHSUMobG9jLT5pbnRlcnBfZXgpICE9IFFNQUdJQykpCisJCQlpbnRlcnByZXRlcl90eXBlID0gSU5URVJQUkVURVJfRUxGOworCisJCWlmIChtZW1jbXAobG9jLT5pbnRlcnBfZWxmX2V4LmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRykgIT0gMCkKKwkJCWludGVycHJldGVyX3R5cGUgJj0gfklOVEVSUFJFVEVSX0VMRjsKKworCQlyZXR2YWwgPSAtRUxJQkJBRDsKKwkJaWYgKCFpbnRlcnByZXRlcl90eXBlKQorCQkJZ290byBvdXRfZnJlZV9kZW50cnk7CisKKwkJLyogTWFrZSBzdXJlIG9ubHkgb25lIHR5cGUgd2FzIHNlbGVjdGVkICovCisJCWlmICgoaW50ZXJwcmV0ZXJfdHlwZSAmIElOVEVSUFJFVEVSX0VMRikgJiYKKwkJICAgICBpbnRlcnByZXRlcl90eXBlICE9IElOVEVSUFJFVEVSX0VMRikgeworCSAgICAgCQkvLyBGSVhNRSAtIHJhdGVsaW1pdCB0aGlzIGJlZm9yZSByZS1lbmFibGluZworCQkJLy8gcHJpbnRrKEtFUk5fV0FSTklORyAiRUxGOiBBbWJpZ3VvdXMgdHlwZSwgdXNpbmcgRUxGXG4iKTsKKwkJCWludGVycHJldGVyX3R5cGUgPSBJTlRFUlBSRVRFUl9FTEY7CisJCX0KKwkJLyogVmVyaWZ5IHRoZSBpbnRlcnByZXRlciBoYXMgYSB2YWxpZCBhcmNoICovCisJCWlmICgoaW50ZXJwcmV0ZXJfdHlwZSA9PSBJTlRFUlBSRVRFUl9FTEYpICYmCisJCSAgICAhZWxmX2NoZWNrX2FyY2goJmxvYy0+aW50ZXJwX2VsZl9leCkpCisJCQlnb3RvIG91dF9mcmVlX2RlbnRyeTsKKwl9IGVsc2UgeworCQkvKiBFeGVjdXRhYmxlcyB3aXRob3V0IGFuIGludGVycHJldGVyIGFsc28gbmVlZCBhIHBlcnNvbmFsaXR5ICAqLworCQlTRVRfUEVSU09OQUxJVFkobG9jLT5lbGZfZXgsIGliY3MyX2ludGVycHJldGVyKTsKKwl9CisKKwkvKiBPSywgd2UgYXJlIGRvbmUgd2l0aCB0aGF0LCBub3cgc2V0IHVwIHRoZSBhcmcgc3R1ZmYsCisJICAgYW5kIHRoZW4gc3RhcnQgdGhpcyBzdWNrZXIgdXAgKi8KKworCWlmICgoIWJwcm0tPnNoX2JhbmcpICYmIChpbnRlcnByZXRlcl90eXBlID09IElOVEVSUFJFVEVSX0FPVVQpKSB7CisJCWNoYXIgKnBhc3NlZF9wID0gcGFzc2VkX2ZpbGVubzsKKwkJc3ByaW50ZihwYXNzZWRfZmlsZW5vLCAiJWQiLCBlbGZfZXhlY19maWxlbm8pOworCisJCWlmIChlbGZfaW50ZXJwcmV0ZXIpIHsKKwkJCXJldHZhbCA9IGNvcHlfc3RyaW5nc19rZXJuZWwoMSwgJnBhc3NlZF9wLCBicHJtKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJZ290byBvdXRfZnJlZV9kZW50cnk7IAorCQkJYnBybS0+YXJnYysrOworCQl9CisJfQorCisJLyogRmx1c2ggYWxsIHRyYWNlcyBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgZXhlY3V0YWJsZSAqLworCXJldHZhbCA9IGZsdXNoX29sZF9leGVjKGJwcm0pOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X2ZyZWVfZGVudHJ5OworCisJLyogRGlzY2FyZCBvdXIgdW5uZWVkZWQgb2xkIGZpbGVzIHN0cnVjdCAqLworCWlmIChmaWxlcykgeworCQlzdGVhbF9sb2NrcyhmaWxlcyk7CisJCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOworCQlmaWxlcyA9IE5VTEw7CisJfQorCisJLyogT0ssIFRoaXMgaXMgdGhlIHBvaW50IG9mIG5vIHJldHVybiAqLworCWN1cnJlbnQtPm1tLT5zdGFydF9kYXRhID0gMDsKKwljdXJyZW50LT5tbS0+ZW5kX2RhdGEgPSAwOworCWN1cnJlbnQtPm1tLT5lbmRfY29kZSA9IDA7CisJY3VycmVudC0+bW0tPm1tYXAgPSBOVUxMOworCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9GT1JLTk9FWEVDOworCWN1cnJlbnQtPm1tLT5kZWZfZmxhZ3MgPSBkZWZfZmxhZ3M7CisKKwkvKiBEbyB0aGlzIGltbWVkaWF0ZWx5LCBzaW5jZSBTVEFDS19UT1AgYXMgdXNlZCBpbiBzZXR1cF9hcmdfcGFnZXMKKwkgICBtYXkgZGVwZW5kIG9uIHRoZSBwZXJzb25hbGl0eS4gICovCisJU0VUX1BFUlNPTkFMSVRZKGxvYy0+ZWxmX2V4LCBpYmNzMl9pbnRlcnByZXRlcik7CisJaWYgKGVsZl9yZWFkX2ltcGxpZXNfZXhlYyhsb2MtPmVsZl9leCwgZXhlY3V0YWJsZV9zdGFjaykpCisJCWN1cnJlbnQtPnBlcnNvbmFsaXR5IHw9IFJFQURfSU1QTElFU19FWEVDOworCisJaWYgKCAhKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgQUREUl9OT19SQU5ET01JWkUpICYmIHJhbmRvbWl6ZV92YV9zcGFjZSkKKwkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfUkFORE9NSVpFOworCWFyY2hfcGlja19tbWFwX2xheW91dChjdXJyZW50LT5tbSk7CisKKwkvKiBEbyB0aGlzIHNvIHRoYXQgd2UgY2FuIGxvYWQgdGhlIGludGVycHJldGVyLCBpZiBuZWVkIGJlLiAgV2Ugd2lsbAorCSAgIGNoYW5nZSBzb21lIG9mIHRoZXNlIGxhdGVyICovCisJc2V0X21tX2NvdW50ZXIoY3VycmVudC0+bW0sIHJzcywgMCk7CisJY3VycmVudC0+bW0tPmZyZWVfYXJlYV9jYWNoZSA9IGN1cnJlbnQtPm1tLT5tbWFwX2Jhc2U7CisJcmV0dmFsID0gc2V0dXBfYXJnX3BhZ2VzKGJwcm0sIHJhbmRvbWl6ZV9zdGFja190b3AoU1RBQ0tfVE9QKSwKKwkJCQkgZXhlY3V0YWJsZV9zdGFjayk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJc2VuZF9zaWcoU0lHS0lMTCwgY3VycmVudCwgMCk7CisJCWdvdG8gb3V0X2ZyZWVfZGVudHJ5OworCX0KKwkKKyNpZmRlZiBBUkNIX0hBU19TRVRVUF9BRERJVElPTkFMX1BBR0VTCisJcmV0dmFsID0gYXJjaF9zZXR1cF9hZGRpdGlvbmFsX3BhZ2VzKGJwcm0sIGV4ZWN1dGFibGVfc3RhY2spOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXNlbmRfc2lnKFNJR0tJTEwsIGN1cnJlbnQsIDApOworCQlnb3RvIG91dF9mcmVlX2RlbnRyeTsKKwl9CisjZW5kaWYgLyogQVJDSF9IQVNfU0VUVVBfQURESVRJT05BTF9QQUdFUyAqLworCisJY3VycmVudC0+bW0tPnN0YXJ0X3N0YWNrID0gYnBybS0+cDsKKworCS8qIE5vdyB3ZSBkbyBhIGxpdHRsZSBncnVuZ3kgd29yayBieSBtbWFwaW5nIHRoZSBFTEYgaW1hZ2UgaW50bworCSAgIHRoZSBjb3JyZWN0IGxvY2F0aW9uIGluIG1lbW9yeS4gIEF0IHRoaXMgcG9pbnQsIHdlIGFzc3VtZSB0aGF0CisJICAgdGhlIGltYWdlIHNob3VsZCBiZSBsb2FkZWQgYXQgZml4ZWQgYWRkcmVzcywgbm90IGF0IGEgdmFyaWFibGUKKwkgICBhZGRyZXNzLiAqLworCisJZm9yKGkgPSAwLCBlbGZfcHBudCA9IGVsZl9waGRhdGE7IGkgPCBsb2MtPmVsZl9leC5lX3BobnVtOyBpKyssIGVsZl9wcG50KyspIHsKKwkJaW50IGVsZl9wcm90ID0gMCwgZWxmX2ZsYWdzOworCQl1bnNpZ25lZCBsb25nIGssIHZhZGRyOworCisJCWlmIChlbGZfcHBudC0+cF90eXBlICE9IFBUX0xPQUQpCisJCQljb250aW51ZTsKKworCQlpZiAodW5saWtlbHkgKGVsZl9icmsgPiBlbGZfYnNzKSkgeworCQkJdW5zaWduZWQgbG9uZyBuYnl0ZTsKKwkgICAgICAgICAgICAKKwkJCS8qIFRoZXJlIHdhcyBhIFBUX0xPQUQgc2VnbWVudCB3aXRoIHBfbWVtc3ogPiBwX2ZpbGVzegorCQkJICAgYmVmb3JlIHRoaXMgb25lLiBNYXAgYW5vbnltb3VzIHBhZ2VzLCBpZiBuZWVkZWQsCisJCQkgICBhbmQgY2xlYXIgdGhlIGFyZWEuICAqLworCQkJcmV0dmFsID0gc2V0X2JyayAoZWxmX2JzcyArIGxvYWRfYmlhcywKKwkJCQkJICBlbGZfYnJrICsgbG9hZF9iaWFzKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlzZW5kX3NpZyhTSUdLSUxMLCBjdXJyZW50LCAwKTsKKwkJCQlnb3RvIG91dF9mcmVlX2RlbnRyeTsKKwkJCX0KKwkJCW5ieXRlID0gRUxGX1BBR0VPRkZTRVQoZWxmX2Jzcyk7CisJCQlpZiAobmJ5dGUpIHsKKwkJCQluYnl0ZSA9IEVMRl9NSU5fQUxJR04gLSBuYnl0ZTsKKwkJCQlpZiAobmJ5dGUgPiBlbGZfYnJrIC0gZWxmX2JzcykKKwkJCQkJbmJ5dGUgPSBlbGZfYnJrIC0gZWxmX2JzczsKKwkJCQlpZiAoY2xlYXJfdXNlcigodm9pZCBfX3VzZXIgKillbGZfYnNzICsKKwkJCQkJCQlsb2FkX2JpYXMsIG5ieXRlKSkgeworCQkJCQkvKgorCQkJCQkgKiBUaGlzIGJzcy16ZXJvaW5nIGNhbiBmYWlsIGlmIHRoZSBFTEYKKwkJCQkJICogZmlsZSBzcGVjaWZpZXMgb2RkIHByb3RlY3Rpb25zLiAgU28KKwkJCQkJICogd2UgZG9uJ3QgY2hlY2sgdGhlIHJldHVybiB2YWx1ZQorCQkJCQkgKi8KKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoZWxmX3BwbnQtPnBfZmxhZ3MgJiBQRl9SKSBlbGZfcHJvdCB8PSBQUk9UX1JFQUQ7CisJCWlmIChlbGZfcHBudC0+cF9mbGFncyAmIFBGX1cpIGVsZl9wcm90IHw9IFBST1RfV1JJVEU7CisJCWlmIChlbGZfcHBudC0+cF9mbGFncyAmIFBGX1gpIGVsZl9wcm90IHw9IFBST1RfRVhFQzsKKworCQllbGZfZmxhZ3MgPSBNQVBfUFJJVkFURXxNQVBfREVOWVdSSVRFfE1BUF9FWEVDVVRBQkxFOworCisJCXZhZGRyID0gZWxmX3BwbnQtPnBfdmFkZHI7CisJCWlmIChsb2MtPmVsZl9leC5lX3R5cGUgPT0gRVRfRVhFQyB8fCBsb2FkX2FkZHJfc2V0KSB7CisJCQllbGZfZmxhZ3MgfD0gTUFQX0ZJWEVEOworCQl9IGVsc2UgaWYgKGxvYy0+ZWxmX2V4LmVfdHlwZSA9PSBFVF9EWU4pIHsKKwkJCS8qIFRyeSBhbmQgZ2V0IGR5bmFtaWMgcHJvZ3JhbXMgb3V0IG9mIHRoZSB3YXkgb2YgdGhlIGRlZmF1bHQgbW1hcAorCQkJICAgYmFzZSwgYXMgd2VsbCBhcyB3aGF0ZXZlciBwcm9ncmFtIHRoZXkgbWlnaHQgdHJ5IHRvIGV4ZWMuICBUaGlzCisJCQkgICBpcyBiZWNhdXNlIHRoZSBicmsgd2lsbCBmb2xsb3cgdGhlIGxvYWRlciwgYW5kIGlzIG5vdCBtb3ZhYmxlLiAgKi8KKwkJCWxvYWRfYmlhcyA9IEVMRl9QQUdFU1RBUlQoRUxGX0VUX0RZTl9CQVNFIC0gdmFkZHIpOworCQl9CisKKwkJZXJyb3IgPSBlbGZfbWFwKGJwcm0tPmZpbGUsIGxvYWRfYmlhcyArIHZhZGRyLCBlbGZfcHBudCwgZWxmX3Byb3QsIGVsZl9mbGFncyk7CisJCWlmIChCQURfQUREUihlcnJvcikpIHsKKwkJCXNlbmRfc2lnKFNJR0tJTEwsIGN1cnJlbnQsIDApOworCQkJZ290byBvdXRfZnJlZV9kZW50cnk7CisJCX0KKworCQlpZiAoIWxvYWRfYWRkcl9zZXQpIHsKKwkJCWxvYWRfYWRkcl9zZXQgPSAxOworCQkJbG9hZF9hZGRyID0gKGVsZl9wcG50LT5wX3ZhZGRyIC0gZWxmX3BwbnQtPnBfb2Zmc2V0KTsKKwkJCWlmIChsb2MtPmVsZl9leC5lX3R5cGUgPT0gRVRfRFlOKSB7CisJCQkJbG9hZF9iaWFzICs9IGVycm9yIC0KKwkJCQkgICAgICAgICAgICAgRUxGX1BBR0VTVEFSVChsb2FkX2JpYXMgKyB2YWRkcik7CisJCQkJbG9hZF9hZGRyICs9IGxvYWRfYmlhczsKKwkJCQlyZWxvY19mdW5jX2Rlc2MgPSBsb2FkX2JpYXM7CisJCQl9CisJCX0KKwkJayA9IGVsZl9wcG50LT5wX3ZhZGRyOworCQlpZiAoayA8IHN0YXJ0X2NvZGUpIHN0YXJ0X2NvZGUgPSBrOworCQlpZiAoc3RhcnRfZGF0YSA8IGspIHN0YXJ0X2RhdGEgPSBrOworCisJCS8qCisJCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgc2VjdGlvbidzIHNpemUgd2lsbCBvdmVyZmxvdyB0aGUKKwkJICogYWxsb3dlZCB0YXNrIHNpemUuIE5vdGUgdGhhdCBwX2ZpbGVzeiBtdXN0IGFsd2F5cyBiZQorCQkgKiA8PSBwX21lbXN6IHNvIGl0IGlzIG9ubHkgbmVjZXNzYXJ5IHRvIGNoZWNrIHBfbWVtc3ouCisJCSAqLworCQlpZiAoayA+IFRBU0tfU0laRSB8fCBlbGZfcHBudC0+cF9maWxlc3ogPiBlbGZfcHBudC0+cF9tZW1zeiB8fAorCQkgICAgZWxmX3BwbnQtPnBfbWVtc3ogPiBUQVNLX1NJWkUgfHwKKwkJICAgIFRBU0tfU0laRSAtIGVsZl9wcG50LT5wX21lbXN6IDwgaykgeworCQkJLyogc2V0X2JyayBjYW4gbmV2ZXIgd29yay4gIEF2b2lkIG92ZXJmbG93cy4gICovCisJCQlzZW5kX3NpZyhTSUdLSUxMLCBjdXJyZW50LCAwKTsKKwkJCWdvdG8gb3V0X2ZyZWVfZGVudHJ5OworCQl9CisKKwkJayA9IGVsZl9wcG50LT5wX3ZhZGRyICsgZWxmX3BwbnQtPnBfZmlsZXN6OworCisJCWlmIChrID4gZWxmX2JzcykKKwkJCWVsZl9ic3MgPSBrOworCQlpZiAoKGVsZl9wcG50LT5wX2ZsYWdzICYgUEZfWCkgJiYgZW5kX2NvZGUgPCBrKQorCQkJZW5kX2NvZGUgPSBrOworCQlpZiAoZW5kX2RhdGEgPCBrKQorCQkJZW5kX2RhdGEgPSBrOworCQlrID0gZWxmX3BwbnQtPnBfdmFkZHIgKyBlbGZfcHBudC0+cF9tZW1zejsKKwkJaWYgKGsgPiBlbGZfYnJrKQorCQkJZWxmX2JyayA9IGs7CisJfQorCisJbG9jLT5lbGZfZXguZV9lbnRyeSArPSBsb2FkX2JpYXM7CisJZWxmX2JzcyArPSBsb2FkX2JpYXM7CisJZWxmX2JyayArPSBsb2FkX2JpYXM7CisJc3RhcnRfY29kZSArPSBsb2FkX2JpYXM7CisJZW5kX2NvZGUgKz0gbG9hZF9iaWFzOworCXN0YXJ0X2RhdGEgKz0gbG9hZF9iaWFzOworCWVuZF9kYXRhICs9IGxvYWRfYmlhczsKKworCS8qIENhbGxpbmcgc2V0X2JyayBlZmZlY3RpdmVseSBtbWFwcyB0aGUgcGFnZXMgdGhhdCB3ZSBuZWVkCisJICogZm9yIHRoZSBic3MgYW5kIGJyZWFrIHNlY3Rpb25zLiAgV2UgbXVzdCBkbyB0aGlzIGJlZm9yZQorCSAqIG1hcHBpbmcgaW4gdGhlIGludGVycHJldGVyLCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCB3aW5kCisJICogdXAgZ2V0dGluZyBwbGFjZWQgd2hlcmUgdGhlIGJzcyBuZWVkcyB0byBnby4KKwkgKi8KKwlyZXR2YWwgPSBzZXRfYnJrKGVsZl9ic3MsIGVsZl9icmspOworCWlmIChyZXR2YWwpIHsKKwkJc2VuZF9zaWcoU0lHS0lMTCwgY3VycmVudCwgMCk7CisJCWdvdG8gb3V0X2ZyZWVfZGVudHJ5OworCX0KKwlpZiAocGFkemVybyhlbGZfYnNzKSkgeworCQlzZW5kX3NpZyhTSUdTRUdWLCBjdXJyZW50LCAwKTsKKwkJcmV0dmFsID0gLUVGQVVMVDsgLyogTm9ib2R5IGdldHMgdG8gc2VlIHRoaXMsIGJ1dC4uICovCisJCWdvdG8gb3V0X2ZyZWVfZGVudHJ5OworCX0KKworCWlmIChlbGZfaW50ZXJwcmV0ZXIpIHsKKwkJaWYgKGludGVycHJldGVyX3R5cGUgPT0gSU5URVJQUkVURVJfQU9VVCkKKwkJCWVsZl9lbnRyeSA9IGxvYWRfYW91dF9pbnRlcnAoJmxvYy0+aW50ZXJwX2V4LAorCQkJCQkJICAgICBpbnRlcnByZXRlcik7CisJCWVsc2UKKwkJCWVsZl9lbnRyeSA9IGxvYWRfZWxmX2ludGVycCgmbG9jLT5pbnRlcnBfZWxmX2V4LAorCQkJCQkJICAgIGludGVycHJldGVyLAorCQkJCQkJICAgICZpbnRlcnBfbG9hZF9hZGRyKTsKKwkJaWYgKEJBRF9BRERSKGVsZl9lbnRyeSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGxvYWQgaW50ZXJwcmV0ZXIgJS4xMjhzXG4iLAorCQkJCWVsZl9pbnRlcnByZXRlcik7CisJCQlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CisJCQlyZXR2YWwgPSAtRU5PRVhFQzsgLyogTm9ib2R5IGdldHMgdG8gc2VlIHRoaXMsIGJ1dC4uICovCisJCQlnb3RvIG91dF9mcmVlX2RlbnRyeTsKKwkJfQorCQlyZWxvY19mdW5jX2Rlc2MgPSBpbnRlcnBfbG9hZF9hZGRyOworCisJCWFsbG93X3dyaXRlX2FjY2VzcyhpbnRlcnByZXRlcik7CisJCWZwdXQoaW50ZXJwcmV0ZXIpOworCQlrZnJlZShlbGZfaW50ZXJwcmV0ZXIpOworCX0gZWxzZSB7CisJCWVsZl9lbnRyeSA9IGxvYy0+ZWxmX2V4LmVfZW50cnk7CisJfQorCisJa2ZyZWUoZWxmX3BoZGF0YSk7CisKKwlpZiAoaW50ZXJwcmV0ZXJfdHlwZSAhPSBJTlRFUlBSRVRFUl9BT1VUKQorCQlzeXNfY2xvc2UoZWxmX2V4ZWNfZmlsZW5vKTsKKworCXNldF9iaW5mbXQoJmVsZl9mb3JtYXQpOworCisJY29tcHV0ZV9jcmVkcyhicHJtKTsKKwljdXJyZW50LT5mbGFncyAmPSB+UEZfRk9SS05PRVhFQzsKKwljcmVhdGVfZWxmX3RhYmxlcyhicHJtLCAmbG9jLT5lbGZfZXgsIChpbnRlcnByZXRlcl90eXBlID09IElOVEVSUFJFVEVSX0FPVVQpLAorCQkJbG9hZF9hZGRyLCBpbnRlcnBfbG9hZF9hZGRyKTsKKwkvKiBOLkIuIHBhc3NlZF9maWxlbm8gbWlnaHQgbm90IGJlIGluaXRpYWxpemVkPyAqLworCWlmIChpbnRlcnByZXRlcl90eXBlID09IElOVEVSUFJFVEVSX0FPVVQpCisJCWN1cnJlbnQtPm1tLT5hcmdfc3RhcnQgKz0gc3RybGVuKHBhc3NlZF9maWxlbm8pICsgMTsKKwljdXJyZW50LT5tbS0+ZW5kX2NvZGUgPSBlbmRfY29kZTsKKwljdXJyZW50LT5tbS0+c3RhcnRfY29kZSA9IHN0YXJ0X2NvZGU7CisJY3VycmVudC0+bW0tPnN0YXJ0X2RhdGEgPSBzdGFydF9kYXRhOworCWN1cnJlbnQtPm1tLT5lbmRfZGF0YSA9IGVuZF9kYXRhOworCWN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayA9IGJwcm0tPnA7CisKKwlpZiAoY3VycmVudC0+cGVyc29uYWxpdHkgJiBNTUFQX1BBR0VfWkVSTykgeworCQkvKiBXaHkgdGhpcywgeW91IGFzaz8/PyAgV2VsbCBTVnI0IG1hcHMgcGFnZSAwIGFzIHJlYWQtb25seSwKKwkJICAgYW5kIHNvbWUgYXBwbGljYXRpb25zICJkZXBlbmQiIHVwb24gdGhpcyBiZWhhdmlvci4KKwkJICAgU2luY2Ugd2UgZG8gbm90IGhhdmUgdGhlIHBvd2VyIHRvIHJlY29tcGlsZSB0aGVzZSwgd2UKKwkJICAgZW11bGF0ZSB0aGUgU1ZyNCBiZWhhdmlvci4gIFNpZ2guICAqLworCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQllcnJvciA9IGRvX21tYXAoTlVMTCwgMCwgUEFHRV9TSVpFLCBQUk9UX1JFQUQgfCBQUk9UX0VYRUMsCisJCQkJTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUsIDApOworCQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwl9CisKKyNpZmRlZiBFTEZfUExBVF9JTklUCisJLyoKKwkgKiBUaGUgQUJJIG1heSBzcGVjaWZ5IHRoYXQgY2VydGFpbiByZWdpc3RlcnMgYmUgc2V0IHVwIGluIHNwZWNpYWwKKwkgKiB3YXlzIChvbiBpMzg2ICVlZHggaXMgdGhlIGFkZHJlc3Mgb2YgYSBEVF9GSU5JIGZ1bmN0aW9uLCBmb3IKKwkgKiBleGFtcGxlLiAgSW4gYWRkaXRpb24sIGl0IG1heSBhbHNvIHNwZWNpZnkgKGVnLCBQb3dlclBDNjQgRUxGKQorCSAqIHRoYXQgdGhlIGVfZW50cnkgZmllbGQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGRlc2NyaXB0b3IKKwkgKiBmb3IgdGhlIHN0YXJ0dXAgcm91dGluZSwgcmF0aGVyIHRoYW4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0dXAKKwkgKiByb3V0aW5lIGl0c2VsZi4gIFRoaXMgbWFjcm8gcGVyZm9ybXMgd2hhdGV2ZXIgaW5pdGlhbGl6YXRpb24gdG8KKwkgKiB0aGUgcmVncyBzdHJ1Y3R1cmUgaXMgcmVxdWlyZWQgYXMgd2VsbCBhcyBhbnkgcmVsb2NhdGlvbnMgdG8gdGhlCisJICogZnVuY3Rpb24gZGVzY3JpcHRvciBlbnRyaWVzIHdoZW4gZXhlY3V0aW5nIGR5bmFtaWNhbGx5IGxpbmtzIGFwcHMuCisJICovCisJRUxGX1BMQVRfSU5JVChyZWdzLCByZWxvY19mdW5jX2Rlc2MpOworI2VuZGlmCisKKwlzdGFydF90aHJlYWQocmVncywgZWxmX2VudHJ5LCBicHJtLT5wKTsKKwlpZiAodW5saWtlbHkoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpIHsKKwkJaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1RSQUNFX0VYRUMpCisJCQlwdHJhY2Vfbm90aWZ5ICgoUFRSQUNFX0VWRU5UX0VYRUMgPDwgOCkgfCBTSUdUUkFQKTsKKwkJZWxzZQorCQkJc2VuZF9zaWcoU0lHVFJBUCwgY3VycmVudCwgMCk7CisJfQorCXJldHZhbCA9IDA7CitvdXQ6CisJa2ZyZWUobG9jKTsKK291dF9yZXQ6CisJcmV0dXJuIHJldHZhbDsKKworCS8qIGVycm9yIGNsZWFudXAgKi8KK291dF9mcmVlX2RlbnRyeToKKwlhbGxvd193cml0ZV9hY2Nlc3MoaW50ZXJwcmV0ZXIpOworCWlmIChpbnRlcnByZXRlcikKKwkJZnB1dChpbnRlcnByZXRlcik7CitvdXRfZnJlZV9pbnRlcnA6CisJaWYgKGVsZl9pbnRlcnByZXRlcikKKwkJa2ZyZWUoZWxmX2ludGVycHJldGVyKTsKK291dF9mcmVlX2ZpbGU6CisJc3lzX2Nsb3NlKGVsZl9leGVjX2ZpbGVubyk7CitvdXRfZnJlZV9maDoKKwlpZiAoZmlsZXMpIHsKKwkJcHV0X2ZpbGVzX3N0cnVjdChjdXJyZW50LT5maWxlcyk7CisJCWN1cnJlbnQtPmZpbGVzID0gZmlsZXM7CisJfQorb3V0X2ZyZWVfcGg6CisJa2ZyZWUoZWxmX3BoZGF0YSk7CisJZ290byBvdXQ7Cit9CisKKy8qIFRoaXMgaXMgcmVhbGx5IHNpbXBsZW1pbmRlZCBhbmQgc3BlY2lhbGl6ZWQgLSB3ZSBhcmUgbG9hZGluZyBhbgorICAgYS5vdXQgbGlicmFyeSB0aGF0IGlzIGdpdmVuIGFuIEVMRiBoZWFkZXIuICovCisKK3N0YXRpYyBpbnQgbG9hZF9lbGZfbGlicmFyeShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZWxmX3BoZHIgKmVsZl9waGRhdGE7CisJc3RydWN0IGVsZl9waGRyICplcHBudDsKKwl1bnNpZ25lZCBsb25nIGVsZl9ic3MsIGJzcywgbGVuOworCWludCByZXR2YWwsIGVycm9yLCBpLCBqOworCXN0cnVjdCBlbGZoZHIgZWxmX2V4OworCisJZXJyb3IgPSAtRU5PRVhFQzsKKwlyZXR2YWwgPSBrZXJuZWxfcmVhZChmaWxlLCAwLCAoY2hhciAqKSAmZWxmX2V4LCBzaXplb2YoZWxmX2V4KSk7CisJaWYgKHJldHZhbCAhPSBzaXplb2YoZWxmX2V4KSkKKwkJZ290byBvdXQ7CisKKwlpZiAobWVtY21wKGVsZl9leC5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpICE9IDApCisJCWdvdG8gb3V0OworCisJLyogRmlyc3Qgb2YgYWxsLCBzb21lIHNpbXBsZSBjb25zaXN0ZW5jeSBjaGVja3MgKi8KKwlpZiAoZWxmX2V4LmVfdHlwZSAhPSBFVF9FWEVDIHx8IGVsZl9leC5lX3BobnVtID4gMiB8fAorCSAgICFlbGZfY2hlY2tfYXJjaCgmZWxmX2V4KSB8fCAhZmlsZS0+Zl9vcCB8fCAhZmlsZS0+Zl9vcC0+bW1hcCkKKwkJZ290byBvdXQ7CisKKwkvKiBOb3cgcmVhZCBpbiBhbGwgb2YgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiAqLworCisJaiA9IHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpICogZWxmX2V4LmVfcGhudW07CisJLyogaiA8IEVMRl9NSU5fQUxJR04gYmVjYXVzZSBlbGZfZXguZV9waG51bSA8PSAyICovCisKKwllcnJvciA9IC1FTk9NRU07CisJZWxmX3BoZGF0YSA9IGttYWxsb2MoaiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbGZfcGhkYXRhKQorCQlnb3RvIG91dDsKKworCWVwcG50ID0gZWxmX3BoZGF0YTsKKwllcnJvciA9IC1FTk9FWEVDOworCXJldHZhbCA9IGtlcm5lbF9yZWFkKGZpbGUsIGVsZl9leC5lX3Bob2ZmLCAoY2hhciAqKWVwcG50LCBqKTsKKwlpZiAocmV0dmFsICE9IGopCisJCWdvdG8gb3V0X2ZyZWVfcGg7CisKKwlmb3IgKGogPSAwLCBpID0gMDsgaTxlbGZfZXguZV9waG51bTsgaSsrKQorCQlpZiAoKGVwcG50ICsgaSktPnBfdHlwZSA9PSBQVF9MT0FEKQorCQkJaisrOworCWlmIChqICE9IDEpCisJCWdvdG8gb3V0X2ZyZWVfcGg7CisKKwl3aGlsZSAoZXBwbnQtPnBfdHlwZSAhPSBQVF9MT0FEKQorCQllcHBudCsrOworCisJLyogTm93IHVzZSBtbWFwIHRvIG1hcCB0aGUgbGlicmFyeSBpbnRvIG1lbW9yeS4gKi8KKwlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCWVycm9yID0gZG9fbW1hcChmaWxlLAorCQkJRUxGX1BBR0VTVEFSVChlcHBudC0+cF92YWRkciksCisJCQkoZXBwbnQtPnBfZmlsZXN6ICsKKwkJCSBFTEZfUEFHRU9GRlNFVChlcHBudC0+cF92YWRkcikpLAorCQkJUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQywKKwkJCU1BUF9GSVhFRCB8IE1BUF9QUklWQVRFIHwgTUFQX0RFTllXUklURSwKKwkJCShlcHBudC0+cF9vZmZzZXQgLQorCQkJIEVMRl9QQUdFT0ZGU0VUKGVwcG50LT5wX3ZhZGRyKSkpOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCWlmIChlcnJvciAhPSBFTEZfUEFHRVNUQVJUKGVwcG50LT5wX3ZhZGRyKSkKKwkJZ290byBvdXRfZnJlZV9waDsKKworCWVsZl9ic3MgPSBlcHBudC0+cF92YWRkciArIGVwcG50LT5wX2ZpbGVzejsKKwlpZiAocGFkemVybyhlbGZfYnNzKSkgeworCQllcnJvciA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X2ZyZWVfcGg7CisJfQorCisJbGVuID0gRUxGX1BBR0VTVEFSVChlcHBudC0+cF9maWxlc3ogKyBlcHBudC0+cF92YWRkciArIEVMRl9NSU5fQUxJR04gLSAxKTsKKwlic3MgPSBlcHBudC0+cF9tZW1zeiArIGVwcG50LT5wX3ZhZGRyOworCWlmIChic3MgPiBsZW4pIHsKKwkJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwkJZG9fYnJrKGxlbiwgYnNzIC0gbGVuKTsKKwkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJfQorCWVycm9yID0gMDsKKworb3V0X2ZyZWVfcGg6CisJa2ZyZWUoZWxmX3BoZGF0YSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogTm90ZSB0aGF0IHNvbWUgcGxhdGZvcm1zIHN0aWxsIHVzZSB0cmFkaXRpb25hbCBjb3JlIGR1bXBzIGFuZCBub3QKKyAqIHRoZSBFTEYgY29yZSBkdW1wLiAgRWFjaCBwbGF0Zm9ybSBjYW4gc2VsZWN0IGl0IGFzIGFwcHJvcHJpYXRlLgorICovCisjaWZkZWYgVVNFX0VMRl9DT1JFX0RVTVAKKworLyoKKyAqIEVMRiBjb3JlIGR1bXBlcgorICoKKyAqIE1vZGVsbGVkIG9uIGZzL2V4ZWMuYzphb3V0X2NvcmVfZHVtcCgpCisgKiBKZXJlbXkgRml0emhhcmRpbmdlIDxqZXJlbXlAc3cub3ouYXU+CisgKi8KKy8qCisgKiBUaGVzZSBhcmUgdGhlIG9ubHkgdGhpbmdzIHlvdSBzaG91bGQgZG8gb24gYSBjb3JlLWZpbGU6IHVzZSBvbmx5IHRoZXNlCisgKiBmdW5jdGlvbnMgdG8gd3JpdGUgb3V0IGFsbCB0aGUgbmVjZXNzYXJ5IGluZm8uCisgKi8KK3N0YXRpYyBpbnQgZHVtcF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3Qgdm9pZCAqYWRkciwgaW50IG5yKQoreworCXJldHVybiBmaWxlLT5mX29wLT53cml0ZShmaWxlLCBhZGRyLCBuciwgJmZpbGUtPmZfcG9zKSA9PSBucjsKK30KKworc3RhdGljIGludCBkdW1wX3NlZWsoc3RydWN0IGZpbGUgKmZpbGUsIG9mZl90IG9mZikKK3sKKwlpZiAoZmlsZS0+Zl9vcC0+bGxzZWVrKSB7CisJCWlmIChmaWxlLT5mX29wLT5sbHNlZWsoZmlsZSwgb2ZmLCAwKSAhPSBvZmYpCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJZmlsZS0+Zl9wb3MgPSBvZmY7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBEZWNpZGUgd2hldGhlciBhIHNlZ21lbnQgaXMgd29ydGggZHVtcGluZzsgZGVmYXVsdCBpcyB5ZXMgdG8gYmUKKyAqIHN1cmUgKG1pc3NpbmcgaW5mbyBpcyB3b3JzZSB0aGFuIHRvbyBtdWNoOyBldGMpLgorICogUGVyc29uYWxseSBJJ2QgaW5jbHVkZSBldmVyeXRoaW5nLCBhbmQgdXNlIHRoZSBjb3JlZHVtcCBsaW1pdC4uLgorICoKKyAqIEkgdGhpbmsgd2Ugc2hvdWxkIHNraXAgc29tZXRoaW5nLiBCdXQgSSBhbSBub3Qgc3VyZSBob3cuIEguSi4KKyAqLworc3RhdGljIGludCBtYXlkdW1wKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCS8qIERvIG5vdCBkdW1wIEkvTyBtYXBwZWQgZGV2aWNlcyBvciBzcGVjaWFsIG1hcHBpbmdzICovCisJaWYgKHZtYS0+dm1fZmxhZ3MgJiAoVk1fSU8gfCBWTV9SRVNFUlZFRCkpCisJCXJldHVybiAwOworCisJLyogRHVtcCBzaGFyZWQgbWVtb3J5IG9ubHkgaWYgbWFwcGVkIGZyb20gYW4gYW5vbnltb3VzIGZpbGUuICAqLworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKQorCQlyZXR1cm4gdm1hLT52bV9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9ubGluayA9PSAwOworCisJLyogSWYgaXQgaGFzbid0IGJlZW4gd3JpdHRlbiB0bywgZG9uJ3Qgd3JpdGUgaXQgb3V0ICovCisJaWYgKCF2bWEtPmFub25fdm1hKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisjZGVmaW5lIHJvdW5kdXAoeCwgeSkgICgoKCh4KSsoKHkpLTEpKS8oeSkpKih5KSkKKworLyogQW4gRUxGIG5vdGUgaW4gbWVtb3J5ICovCitzdHJ1Y3QgbWVtZWxmbm90ZQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IHR5cGU7CisJdW5zaWduZWQgaW50IGRhdGFzejsKKwl2b2lkICpkYXRhOworfTsKKworc3RhdGljIGludCBub3Rlc2l6ZShzdHJ1Y3QgbWVtZWxmbm90ZSAqZW4pCit7CisJaW50IHN6OworCisJc3ogPSBzaXplb2Yoc3RydWN0IGVsZl9ub3RlKTsKKwlzeiArPSByb3VuZHVwKHN0cmxlbihlbi0+bmFtZSkgKyAxLCA0KTsKKwlzeiArPSByb3VuZHVwKGVuLT5kYXRhc3osIDQpOworCisJcmV0dXJuIHN6OworfQorCisjZGVmaW5lIERVTVBfV1JJVEUoYWRkciwgbnIpCVwKKwlkbyB7IGlmICghZHVtcF93cml0ZShmaWxlLCAoYWRkciksIChucikpKSByZXR1cm4gMDsgfSB3aGlsZSgwKQorI2RlZmluZSBEVU1QX1NFRUsob2ZmKQlcCisJZG8geyBpZiAoIWR1bXBfc2VlayhmaWxlLCAob2ZmKSkpIHJldHVybiAwOyB9IHdoaWxlKDApCisKK3N0YXRpYyBpbnQgd3JpdGVub3RlKHN0cnVjdCBtZW1lbGZub3RlICptZW4sIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBlbGZfbm90ZSBlbjsKKworCWVuLm5fbmFtZXN6ID0gc3RybGVuKG1lbi0+bmFtZSkgKyAxOworCWVuLm5fZGVzY3N6ID0gbWVuLT5kYXRhc3o7CisJZW4ubl90eXBlID0gbWVuLT50eXBlOworCisJRFVNUF9XUklURSgmZW4sIHNpemVvZihlbikpOworCURVTVBfV1JJVEUobWVuLT5uYW1lLCBlbi5uX25hbWVzeik7CisJLyogWFhYIC0gY2FzdCBmcm9tIGxvbmcgbG9uZyB0byBsb25nIHRvIGF2b2lkIG5lZWQgZm9yIGxpYmdjYy5hICovCisJRFVNUF9TRUVLKHJvdW5kdXAoKHVuc2lnbmVkIGxvbmcpZmlsZS0+Zl9wb3MsIDQpKTsJLyogWFhYICovCisJRFVNUF9XUklURShtZW4tPmRhdGEsIG1lbi0+ZGF0YXN6KTsKKwlEVU1QX1NFRUsocm91bmR1cCgodW5zaWduZWQgbG9uZylmaWxlLT5mX3BvcywgNCkpOwkvKiBYWFggKi8KKworCXJldHVybiAxOworfQorI3VuZGVmIERVTVBfV1JJVEUKKyN1bmRlZiBEVU1QX1NFRUsKKworI2RlZmluZSBEVU1QX1dSSVRFKGFkZHIsIG5yKQlcCisJaWYgKChzaXplICs9IChucikpID4gbGltaXQgfHwgIWR1bXBfd3JpdGUoZmlsZSwgKGFkZHIpLCAobnIpKSkgXAorCQlnb3RvIGVuZF9jb3JlZHVtcDsKKyNkZWZpbmUgRFVNUF9TRUVLKG9mZikJXAorCWlmICghZHVtcF9zZWVrKGZpbGUsIChvZmYpKSkgXAorCQlnb3RvIGVuZF9jb3JlZHVtcDsKKworc3RhdGljIGlubGluZSB2b2lkIGZpbGxfZWxmX2hlYWRlcihzdHJ1Y3QgZWxmaGRyICplbGYsIGludCBzZWdzKQoreworCW1lbWNweShlbGYtPmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRyk7CisJZWxmLT5lX2lkZW50W0VJX0NMQVNTXSA9IEVMRl9DTEFTUzsKKwllbGYtPmVfaWRlbnRbRUlfREFUQV0gPSBFTEZfREFUQTsKKwllbGYtPmVfaWRlbnRbRUlfVkVSU0lPTl0gPSBFVl9DVVJSRU5UOworCWVsZi0+ZV9pZGVudFtFSV9PU0FCSV0gPSBFTEZfT1NBQkk7CisJbWVtc2V0KGVsZi0+ZV9pZGVudCtFSV9QQUQsIDAsIEVJX05JREVOVC1FSV9QQUQpOworCisJZWxmLT5lX3R5cGUgPSBFVF9DT1JFOworCWVsZi0+ZV9tYWNoaW5lID0gRUxGX0FSQ0g7CisJZWxmLT5lX3ZlcnNpb24gPSBFVl9DVVJSRU5UOworCWVsZi0+ZV9lbnRyeSA9IDA7CisJZWxmLT5lX3Bob2ZmID0gc2l6ZW9mKHN0cnVjdCBlbGZoZHIpOworCWVsZi0+ZV9zaG9mZiA9IDA7CisJZWxmLT5lX2ZsYWdzID0gRUxGX0NPUkVfRUZMQUdTOworCWVsZi0+ZV9laHNpemUgPSBzaXplb2Yoc3RydWN0IGVsZmhkcik7CisJZWxmLT5lX3BoZW50c2l6ZSA9IHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpOworCWVsZi0+ZV9waG51bSA9IHNlZ3M7CisJZWxmLT5lX3NoZW50c2l6ZSA9IDA7CisJZWxmLT5lX3NobnVtID0gMDsKKwllbGYtPmVfc2hzdHJuZHggPSAwOworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZpbGxfZWxmX25vdGVfcGhkcihzdHJ1Y3QgZWxmX3BoZHIgKnBoZHIsIGludCBzeiwgb2ZmX3Qgb2Zmc2V0KQoreworCXBoZHItPnBfdHlwZSA9IFBUX05PVEU7CisJcGhkci0+cF9vZmZzZXQgPSBvZmZzZXQ7CisJcGhkci0+cF92YWRkciA9IDA7CisJcGhkci0+cF9wYWRkciA9IDA7CisJcGhkci0+cF9maWxlc3ogPSBzejsKKwlwaGRyLT5wX21lbXN6ID0gMDsKKwlwaGRyLT5wX2ZsYWdzID0gMDsKKwlwaGRyLT5wX2FsaWduID0gMDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfbm90ZShzdHJ1Y3QgbWVtZWxmbm90ZSAqbm90ZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IHR5cGUsIAorCQl1bnNpZ25lZCBpbnQgc3osIHZvaWQgKmRhdGEpCit7CisJbm90ZS0+bmFtZSA9IG5hbWU7CisJbm90ZS0+dHlwZSA9IHR5cGU7CisJbm90ZS0+ZGF0YXN6ID0gc3o7CisJbm90ZS0+ZGF0YSA9IGRhdGE7CisJcmV0dXJuOworfQorCisvKgorICogZmlsbCB1cCBhbGwgdGhlIGZpZWxkcyBpbiBwcnN0YXR1cyBmcm9tIHRoZSBnaXZlbiB0YXNrIHN0cnVjdCwgZXhjZXB0IHJlZ2lzdGVycworICogd2hpY2ggbmVlZCB0byBiZSBmaWxsZWQgdXAgc2VwYXJhdGVseS4KKyAqLworc3RhdGljIHZvaWQgZmlsbF9wcnN0YXR1cyhzdHJ1Y3QgZWxmX3Byc3RhdHVzICpwcnN0YXR1cywKKwkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgbG9uZyBzaWducikgCit7CisJcHJzdGF0dXMtPnByX2luZm8uc2lfc2lnbm8gPSBwcnN0YXR1cy0+cHJfY3Vyc2lnID0gc2lnbnI7CisJcHJzdGF0dXMtPnByX3NpZ3BlbmQgPSBwLT5wZW5kaW5nLnNpZ25hbC5zaWdbMF07CisJcHJzdGF0dXMtPnByX3NpZ2hvbGQgPSBwLT5ibG9ja2VkLnNpZ1swXTsKKwlwcnN0YXR1cy0+cHJfcGlkID0gcC0+cGlkOworCXByc3RhdHVzLT5wcl9wcGlkID0gcC0+cGFyZW50LT5waWQ7CisJcHJzdGF0dXMtPnByX3BncnAgPSBwcm9jZXNzX2dyb3VwKHApOworCXByc3RhdHVzLT5wcl9zaWQgPSBwLT5zaWduYWwtPnNlc3Npb247CisJaWYgKHRocmVhZF9ncm91cF9sZWFkZXIocCkpIHsKKwkJLyoKKwkJICogVGhpcyBpcyB0aGUgcmVjb3JkIGZvciB0aGUgZ3JvdXAgbGVhZGVyLiAgQWRkIGluIHRoZQorCQkgKiBjdW11bGF0aXZlIHRpbWVzIG9mIHByZXZpb3VzIGRlYWQgdGhyZWFkcy4gIFRoaXMgdG90YWwKKwkJICogd29uJ3QgaW5jbHVkZSB0aGUgdGltZSBvZiBlYWNoIGxpdmUgdGhyZWFkIHdob3NlIHN0YXRlCisJCSAqIGlzIGluY2x1ZGVkIGluIHRoZSBjb3JlIGR1bXAuICBUaGUgZmluYWwgdG90YWwgcmVwb3J0ZWQKKwkJICogdG8gb3VyIHBhcmVudCBwcm9jZXNzIHdoZW4gaXQgY2FsbHMgd2FpdDQgd2lsbCBpbmNsdWRlCisJCSAqIHRob3NlIHN1bXMgYXMgd2VsbCBhcyB0aGUgbGl0dGxlIGJpdCBtb3JlIHRpbWUgaXQgdGFrZXMKKwkJICogdGhpcyBhbmQgZWFjaCBvdGhlciB0aHJlYWQgdG8gZmluaXNoIGR5aW5nIGFmdGVyIHRoZQorCQkgKiBjb3JlIGR1bXAgc3luY2hyb25pemF0aW9uIHBoYXNlLgorCQkgKi8KKwkJY3B1dGltZV90b190aW1ldmFsKGNwdXRpbWVfYWRkKHAtPnV0aW1lLCBwLT5zaWduYWwtPnV0aW1lKSwKKwkJCQkgICAmcHJzdGF0dXMtPnByX3V0aW1lKTsKKwkJY3B1dGltZV90b190aW1ldmFsKGNwdXRpbWVfYWRkKHAtPnN0aW1lLCBwLT5zaWduYWwtPnN0aW1lKSwKKwkJCQkgICAmcHJzdGF0dXMtPnByX3N0aW1lKTsKKwl9IGVsc2UgeworCQljcHV0aW1lX3RvX3RpbWV2YWwocC0+dXRpbWUsICZwcnN0YXR1cy0+cHJfdXRpbWUpOworCQljcHV0aW1lX3RvX3RpbWV2YWwocC0+c3RpbWUsICZwcnN0YXR1cy0+cHJfc3RpbWUpOworCX0KKwljcHV0aW1lX3RvX3RpbWV2YWwocC0+c2lnbmFsLT5jdXRpbWUsICZwcnN0YXR1cy0+cHJfY3V0aW1lKTsKKwljcHV0aW1lX3RvX3RpbWV2YWwocC0+c2lnbmFsLT5jc3RpbWUsICZwcnN0YXR1cy0+cHJfY3N0aW1lKTsKK30KKworc3RhdGljIGludCBmaWxsX3BzaW5mbyhzdHJ1Y3QgZWxmX3BycHNpbmZvICpwc2luZm8sIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKKwkJICAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCWludCBpLCBsZW47CisJCisJLyogZmlyc3QgY29weSB0aGUgcGFyYW1ldGVycyBmcm9tIHVzZXIgc3BhY2UgKi8KKwltZW1zZXQocHNpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGVsZl9wcnBzaW5mbykpOworCisJbGVuID0gbW0tPmFyZ19lbmQgLSBtbS0+YXJnX3N0YXJ0OworCWlmIChsZW4gPj0gRUxGX1BSQVJHU1opCisJCWxlbiA9IEVMRl9QUkFSR1NaLTE7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZwc2luZm8tPnByX3BzYXJncywKKwkJICAgICAgICAgICAoY29uc3QgY2hhciBfX3VzZXIgKiltbS0+YXJnX3N0YXJ0LCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJaWYgKHBzaW5mby0+cHJfcHNhcmdzW2ldID09IDApCisJCQlwc2luZm8tPnByX3BzYXJnc1tpXSA9ICcgJzsKKwlwc2luZm8tPnByX3BzYXJnc1tsZW5dID0gMDsKKworCXBzaW5mby0+cHJfcGlkID0gcC0+cGlkOworCXBzaW5mby0+cHJfcHBpZCA9IHAtPnBhcmVudC0+cGlkOworCXBzaW5mby0+cHJfcGdycCA9IHByb2Nlc3NfZ3JvdXAocCk7CisJcHNpbmZvLT5wcl9zaWQgPSBwLT5zaWduYWwtPnNlc3Npb247CisKKwlpID0gcC0+c3RhdGUgPyBmZnoofnAtPnN0YXRlKSArIDEgOiAwOworCXBzaW5mby0+cHJfc3RhdGUgPSBpOworCXBzaW5mby0+cHJfc25hbWUgPSAoaSA8IDAgfHwgaSA+IDUpID8gJy4nIDogIlJTRFRaVyJbaV07CisJcHNpbmZvLT5wcl96b21iID0gcHNpbmZvLT5wcl9zbmFtZSA9PSAnWic7CisJcHNpbmZvLT5wcl9uaWNlID0gdGFza19uaWNlKHApOworCXBzaW5mby0+cHJfZmxhZyA9IHAtPmZsYWdzOworCVNFVF9VSUQocHNpbmZvLT5wcl91aWQsIHAtPnVpZCk7CisJU0VUX0dJRChwc2luZm8tPnByX2dpZCwgcC0+Z2lkKTsKKwlzdHJuY3B5KHBzaW5mby0+cHJfZm5hbWUsIHAtPmNvbW0sIHNpemVvZihwc2luZm8tPnByX2ZuYW1lKSk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIEhlcmUgaXMgdGhlIHN0cnVjdHVyZSBpbiB3aGljaCBzdGF0dXMgb2YgZWFjaCB0aHJlYWQgaXMgY2FwdHVyZWQuICovCitzdHJ1Y3QgZWxmX3RocmVhZF9zdGF0dXMKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGVsZl9wcnN0YXR1cyBwcnN0YXR1czsJLyogTlRfUFJTVEFUVVMgKi8KKwllbGZfZnByZWdzZXRfdCBmcHU7CQkvKiBOVF9QUkZQUkVHICovCisJc3RydWN0IHRhc2tfc3RydWN0ICp0aHJlYWQ7CisjaWZkZWYgRUxGX0NPUkVfQ09QWV9YRlBSRUdTCisJZWxmX2ZweHJlZ3NldF90IHhmcHU7CQkvKiBOVF9QUlhGUFJFRyAqLworI2VuZGlmCisJc3RydWN0IG1lbWVsZm5vdGUgbm90ZXNbM107CisJaW50IG51bV9ub3RlczsKK307CisKKy8qCisgKiBJbiBvcmRlciB0byBhZGQgdGhlIHNwZWNpZmljIHRocmVhZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVsZiBmaWxlIGZvcm1hdCwKKyAqIHdlIG5lZWQgdG8ga2VlcCBhIGxpbmtlZCBsaXN0IG9mIGV2ZXJ5IHRocmVhZHMgcHJfc3RhdHVzIGFuZCB0aGVuCisgKiBjcmVhdGUgYSBzaW5nbGUgc2VjdGlvbiBmb3IgdGhlbSBpbiB0aGUgZmluYWwgY29yZSBmaWxlLgorICovCitzdGF0aWMgaW50IGVsZl9kdW1wX3RocmVhZF9zdGF0dXMobG9uZyBzaWduciwgc3RydWN0IGVsZl90aHJlYWRfc3RhdHVzICp0KQoreworCWludCBzeiA9IDA7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwID0gdC0+dGhyZWFkOworCXQtPm51bV9ub3RlcyA9IDA7CisKKwlmaWxsX3Byc3RhdHVzKCZ0LT5wcnN0YXR1cywgcCwgc2lnbnIpOworCWVsZl9jb3JlX2NvcHlfdGFza19yZWdzKHAsICZ0LT5wcnN0YXR1cy5wcl9yZWcpOwkKKwkKKwlmaWxsX25vdGUoJnQtPm5vdGVzWzBdLCAiQ09SRSIsIE5UX1BSU1RBVFVTLCBzaXplb2YodC0+cHJzdGF0dXMpLCAmKHQtPnByc3RhdHVzKSk7CisJdC0+bnVtX25vdGVzKys7CisJc3ogKz0gbm90ZXNpemUoJnQtPm5vdGVzWzBdKTsKKworCWlmICgodC0+cHJzdGF0dXMucHJfZnB2YWxpZCA9IGVsZl9jb3JlX2NvcHlfdGFza19mcHJlZ3MocCwgTlVMTCwgJnQtPmZwdSkpKSB7CisJCWZpbGxfbm90ZSgmdC0+bm90ZXNbMV0sICJDT1JFIiwgTlRfUFJGUFJFRywgc2l6ZW9mKHQtPmZwdSksICYodC0+ZnB1KSk7CisJCXQtPm51bV9ub3RlcysrOworCQlzeiArPSBub3Rlc2l6ZSgmdC0+bm90ZXNbMV0pOworCX0KKworI2lmZGVmIEVMRl9DT1JFX0NPUFlfWEZQUkVHUworCWlmIChlbGZfY29yZV9jb3B5X3Rhc2tfeGZwcmVncyhwLCAmdC0+eGZwdSkpIHsKKwkJZmlsbF9ub3RlKCZ0LT5ub3Rlc1syXSwgIkxJTlVYIiwgTlRfUFJYRlBSRUcsIHNpemVvZih0LT54ZnB1KSwgJnQtPnhmcHUpOworCQl0LT5udW1fbm90ZXMrKzsKKwkJc3ogKz0gbm90ZXNpemUoJnQtPm5vdGVzWzJdKTsKKwl9CisjZW5kaWYJCisJcmV0dXJuIHN6OworfQorCisvKgorICogQWN0dWFsIGR1bXBlcgorICoKKyAqIFRoaXMgaXMgYSB0d28tcGFzcyBwcm9jZXNzOyBmaXJzdCB3ZSBmaW5kIHRoZSBvZmZzZXRzIG9mIHRoZSBiaXRzLAorICogYW5kIHRoZW4gdGhleSBhcmUgYWN0dWFsbHkgd3JpdHRlbiBvdXQuICBJZiB3ZSBydW4gb3V0IG9mIGNvcmUgbGltaXQKKyAqIHdlIGp1c3QgdHJ1bmNhdGUuCisgKi8KK3N0YXRpYyBpbnQgZWxmX2NvcmVfZHVtcChsb25nIHNpZ25yLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKyNkZWZpbmUJTlVNX05PVEVTCTYKKwlpbnQgaGFzX2R1bXBlZCA9IDA7CisJbW1fc2VnbWVudF90IGZzOworCWludCBzZWdzOworCXNpemVfdCBzaXplID0gMDsKKwlpbnQgaTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwlzdHJ1Y3QgZWxmaGRyICplbGYgPSBOVUxMOworCW9mZl90IG9mZnNldCA9IDAsIGRhdGFvZmY7CisJdW5zaWduZWQgbG9uZyBsaW1pdCA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfQ09SRV0ucmxpbV9jdXI7CisJaW50IG51bW5vdGU7CisJc3RydWN0IG1lbWVsZm5vdGUgKm5vdGVzID0gTlVMTDsKKwlzdHJ1Y3QgZWxmX3Byc3RhdHVzICpwcnN0YXR1cyA9IE5VTEw7CS8qIE5UX1BSU1RBVFVTICovCisJc3RydWN0IGVsZl9wcnBzaW5mbyAqcHNpbmZvID0gTlVMTDsJLyogTlRfUFJQU0lORk8gKi8KKyAJc3RydWN0IHRhc2tfc3RydWN0ICpnLCAqcDsKKyAJTElTVF9IRUFEKHRocmVhZF9saXN0KTsKKyAJc3RydWN0IGxpc3RfaGVhZCAqdDsKKwllbGZfZnByZWdzZXRfdCAqZnB1ID0gTlVMTDsKKyNpZmRlZiBFTEZfQ09SRV9DT1BZX1hGUFJFR1MKKwllbGZfZnB4cmVnc2V0X3QgKnhmcHUgPSBOVUxMOworI2VuZGlmCisJaW50IHRocmVhZF9zdGF0dXNfc2l6ZSA9IDA7CisJZWxmX2FkZHJfdCAqYXV4djsKKworCS8qCisJICogV2Ugbm8gbG9uZ2VyIHN0b3AgYWxsIFZNIG9wZXJhdGlvbnMuCisJICogCisJICogVGhpcyBpcyBiZWNhdXNlIHRob3NlIHByb2Nlc2VzIHRoYXQgY291bGQgcG9zc2libHkgY2hhbmdlIG1hcF9jb3VudCBvcgorCSAqIHRoZSBtbWFwIC8gdm1hIHBhZ2VzIGFyZSBub3cgYmxvY2tlZCBpbiBkb19leGl0IG9uIGN1cnJlbnQgZmluaXNoaW5nCisJICogdGhpcyBjb3JlIGR1bXAuCisJICoKKwkgKiBPbmx5IHB0cmFjZSBjYW4gdG91Y2ggdGhlc2UgbWVtb3J5IGFkZHJlc3NlcywgYnV0IGl0IGRvZXNuJ3QgY2hhbmdlCisJICogdGhlIG1hcF9jb3VudCBvciB0aGUgcGFnZXMgYWxsb2NhdGVkLiAgU28gbm8gcG9zc2liaWxpdHkgb2YgY3Jhc2hpbmcKKwkgKiBleGlzdHMgd2hpbGUgZHVtcGluZyB0aGUgbW0tPnZtX25leHQgYXJlYXMgdG8gdGhlIGNvcmUgZmlsZS4KKwkgKi8KKyAgCisJLyogYWxsb2MgbWVtb3J5IGZvciBsYXJnZSBkYXRhIHN0cnVjdHVyZXM6IHRvbyBsYXJnZSB0byBiZSBvbiBzdGFjayAqLworCWVsZiA9IGttYWxsb2Moc2l6ZW9mKCplbGYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVsZikKKwkJZ290byBjbGVhbnVwOworCXByc3RhdHVzID0ga21hbGxvYyhzaXplb2YoKnByc3RhdHVzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcnN0YXR1cykKKwkJZ290byBjbGVhbnVwOworCXBzaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpwc2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBzaW5mbykKKwkJZ290byBjbGVhbnVwOworCW5vdGVzID0ga21hbGxvYyhOVU1fTk9URVMgKiBzaXplb2Yoc3RydWN0IG1lbWVsZm5vdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5vdGVzKQorCQlnb3RvIGNsZWFudXA7CisJZnB1ID0ga21hbGxvYyhzaXplb2YoKmZwdSksIEdGUF9LRVJORUwpOworCWlmICghZnB1KQorCQlnb3RvIGNsZWFudXA7CisjaWZkZWYgRUxGX0NPUkVfQ09QWV9YRlBSRUdTCisJeGZwdSA9IGttYWxsb2Moc2l6ZW9mKCp4ZnB1KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF4ZnB1KQorCQlnb3RvIGNsZWFudXA7CisjZW5kaWYKKworCWlmIChzaWducikgeworCQlzdHJ1Y3QgZWxmX3RocmVhZF9zdGF0dXMgKnRtcDsKKwkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJZG9fZWFjaF90aHJlYWQoZyxwKQorCQkJaWYgKGN1cnJlbnQtPm1tID09IHAtPm1tICYmIGN1cnJlbnQgIT0gcCkgeworCQkJCXRtcCA9IGttYWxsb2Moc2l6ZW9mKCp0bXApLCBHRlBfQVRPTUlDKTsKKwkJCQlpZiAoIXRtcCkgeworCQkJCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJCQkJCWdvdG8gY2xlYW51cDsKKwkJCQl9CisJCQkJbWVtc2V0KHRtcCwgMCwgc2l6ZW9mKCp0bXApKTsKKwkJCQlJTklUX0xJU1RfSEVBRCgmdG1wLT5saXN0KTsKKwkJCQl0bXAtPnRocmVhZCA9IHA7CisJCQkJbGlzdF9hZGQoJnRtcC0+bGlzdCwgJnRocmVhZF9saXN0KTsKKwkJCX0KKwkJd2hpbGVfZWFjaF90aHJlYWQoZyxwKTsKKwkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCQlsaXN0X2Zvcl9lYWNoKHQsICZ0aHJlYWRfbGlzdCkgeworCQkJc3RydWN0IGVsZl90aHJlYWRfc3RhdHVzICp0bXA7CisJCQlpbnQgc3o7CisKKwkJCXRtcCA9IGxpc3RfZW50cnkodCwgc3RydWN0IGVsZl90aHJlYWRfc3RhdHVzLCBsaXN0KTsKKwkJCXN6ID0gZWxmX2R1bXBfdGhyZWFkX3N0YXR1cyhzaWduciwgdG1wKTsKKwkJCXRocmVhZF9zdGF0dXNfc2l6ZSArPSBzejsKKwkJfQorCX0KKwkvKiBub3cgY29sbGVjdCB0aGUgZHVtcCBmb3IgdGhlIGN1cnJlbnQgKi8KKwltZW1zZXQocHJzdGF0dXMsIDAsIHNpemVvZigqcHJzdGF0dXMpKTsKKwlmaWxsX3Byc3RhdHVzKHByc3RhdHVzLCBjdXJyZW50LCBzaWducik7CisJZWxmX2NvcmVfY29weV9yZWdzKCZwcnN0YXR1cy0+cHJfcmVnLCByZWdzKTsKKwkKKwlzZWdzID0gY3VycmVudC0+bW0tPm1hcF9jb3VudDsKKyNpZmRlZiBFTEZfQ09SRV9FWFRSQV9QSERSUworCXNlZ3MgKz0gRUxGX0NPUkVfRVhUUkFfUEhEUlM7CisjZW5kaWYKKworCS8qIFNldCB1cCBoZWFkZXIgKi8KKwlmaWxsX2VsZl9oZWFkZXIoZWxmLCBzZWdzKzEpOwkvKiBpbmNsdWRpbmcgbm90ZXMgc2VjdGlvbiAqLworCisJaGFzX2R1bXBlZCA9IDE7CisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfRFVNUENPUkU7CisKKwkvKgorCSAqIFNldCB1cCB0aGUgbm90ZXMgaW4gc2ltaWxhciBmb3JtIHRvIFNWUjQgY29yZSBkdW1wcyBtYWRlCisJICogd2l0aCBpbmZvIGZyb20gdGhlaXIgL3Byb2MuCisJICovCisKKwlmaWxsX25vdGUobm90ZXMgKzAsICJDT1JFIiwgTlRfUFJTVEFUVVMsIHNpemVvZigqcHJzdGF0dXMpLCBwcnN0YXR1cyk7CisJCisJZmlsbF9wc2luZm8ocHNpbmZvLCBjdXJyZW50LT5ncm91cF9sZWFkZXIsIGN1cnJlbnQtPm1tKTsKKwlmaWxsX25vdGUobm90ZXMgKzEsICJDT1JFIiwgTlRfUFJQU0lORk8sIHNpemVvZigqcHNpbmZvKSwgcHNpbmZvKTsKKwkKKwlmaWxsX25vdGUobm90ZXMgKzIsICJDT1JFIiwgTlRfVEFTS1NUUlVDVCwgc2l6ZW9mKCpjdXJyZW50KSwgY3VycmVudCk7CisgIAorCW51bW5vdGUgPSAzOworCisJYXV4diA9IChlbGZfYWRkcl90ICopIGN1cnJlbnQtPm1tLT5zYXZlZF9hdXh2OworCisJaSA9IDA7CisJZG8KKwkJaSArPSAyOworCXdoaWxlIChhdXh2W2kgLSAyXSAhPSBBVF9OVUxMKTsKKwlmaWxsX25vdGUoJm5vdGVzW251bW5vdGUrK10sICJDT1JFIiwgTlRfQVVYViwKKwkJICBpICogc2l6ZW9mIChlbGZfYWRkcl90KSwgYXV4dik7CisKKyAgCS8qIFRyeSB0byBkdW1wIHRoZSBGUFUuICovCisJaWYgKChwcnN0YXR1cy0+cHJfZnB2YWxpZCA9IGVsZl9jb3JlX2NvcHlfdGFza19mcHJlZ3MoY3VycmVudCwgcmVncywgZnB1KSkpCisJCWZpbGxfbm90ZShub3RlcyArIG51bW5vdGUrKywKKwkJCSAgIkNPUkUiLCBOVF9QUkZQUkVHLCBzaXplb2YoKmZwdSksIGZwdSk7CisjaWZkZWYgRUxGX0NPUkVfQ09QWV9YRlBSRUdTCisJaWYgKGVsZl9jb3JlX2NvcHlfdGFza194ZnByZWdzKGN1cnJlbnQsIHhmcHUpKQorCQlmaWxsX25vdGUobm90ZXMgKyBudW1ub3RlKyssCisJCQkgICJMSU5VWCIsIE5UX1BSWEZQUkVHLCBzaXplb2YoKnhmcHUpLCB4ZnB1KTsKKyNlbmRpZgkKKyAgCisJZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKworCURVTVBfV1JJVEUoZWxmLCBzaXplb2YoKmVsZikpOworCW9mZnNldCArPSBzaXplb2YoKmVsZik7CQkJCS8qIEVsZiBoZWFkZXIgKi8KKwlvZmZzZXQgKz0gKHNlZ3MrMSkgKiBzaXplb2Yoc3RydWN0IGVsZl9waGRyKTsJLyogUHJvZ3JhbSBoZWFkZXJzICovCisKKwkvKiBXcml0ZSBub3RlcyBwaGRyIGVudHJ5ICovCisJeworCQlzdHJ1Y3QgZWxmX3BoZHIgcGhkcjsKKwkJaW50IHN6ID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnVtbm90ZTsgaSsrKQorCQkJc3ogKz0gbm90ZXNpemUobm90ZXMgKyBpKTsKKwkJCisJCXN6ICs9IHRocmVhZF9zdGF0dXNfc2l6ZTsKKworCQlmaWxsX2VsZl9ub3RlX3BoZHIoJnBoZHIsIHN6LCBvZmZzZXQpOworCQlvZmZzZXQgKz0gc3o7CisJCURVTVBfV1JJVEUoJnBoZHIsIHNpemVvZihwaGRyKSk7CisJfQorCisJLyogUGFnZS1hbGlnbiBkdW1wZWQgZGF0YSAqLworCWRhdGFvZmYgPSBvZmZzZXQgPSByb3VuZHVwKG9mZnNldCwgRUxGX0VYRUNfUEFHRVNJWkUpOworCisJLyogV3JpdGUgcHJvZ3JhbSBoZWFkZXJzIGZvciBzZWdtZW50cyBkdW1wICovCisJZm9yICh2bWEgPSBjdXJyZW50LT5tbS0+bW1hcDsgdm1hICE9IE5VTEw7IHZtYSA9IHZtYS0+dm1fbmV4dCkgeworCQlzdHJ1Y3QgZWxmX3BoZHIgcGhkcjsKKwkJc2l6ZV90IHN6OworCisJCXN6ID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCisJCXBoZHIucF90eXBlID0gUFRfTE9BRDsKKwkJcGhkci5wX29mZnNldCA9IG9mZnNldDsKKwkJcGhkci5wX3ZhZGRyID0gdm1hLT52bV9zdGFydDsKKwkJcGhkci5wX3BhZGRyID0gMDsKKwkJcGhkci5wX2ZpbGVzeiA9IG1heWR1bXAodm1hKSA/IHN6IDogMDsKKwkJcGhkci5wX21lbXN6ID0gc3o7CisJCW9mZnNldCArPSBwaGRyLnBfZmlsZXN6OworCQlwaGRyLnBfZmxhZ3MgPSB2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCA/IFBGX1IgOiAwOworCQlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSBwaGRyLnBfZmxhZ3MgfD0gUEZfVzsKKwkJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDKSBwaGRyLnBfZmxhZ3MgfD0gUEZfWDsKKwkJcGhkci5wX2FsaWduID0gRUxGX0VYRUNfUEFHRVNJWkU7CisKKwkJRFVNUF9XUklURSgmcGhkciwgc2l6ZW9mKHBoZHIpKTsKKwl9CisKKyNpZmRlZiBFTEZfQ09SRV9XUklURV9FWFRSQV9QSERSUworCUVMRl9DT1JFX1dSSVRFX0VYVFJBX1BIRFJTOworI2VuZGlmCisKKyAJLyogd3JpdGUgb3V0IHRoZSBub3RlcyBzZWN0aW9uICovCisJZm9yIChpID0gMDsgaSA8IG51bW5vdGU7IGkrKykKKwkJaWYgKCF3cml0ZW5vdGUobm90ZXMgKyBpLCBmaWxlKSkKKwkJCWdvdG8gZW5kX2NvcmVkdW1wOworCisJLyogd3JpdGUgb3V0IHRoZSB0aHJlYWQgc3RhdHVzIG5vdGVzIHNlY3Rpb24gKi8KKwlsaXN0X2Zvcl9lYWNoKHQsICZ0aHJlYWRfbGlzdCkgeworCQlzdHJ1Y3QgZWxmX3RocmVhZF9zdGF0dXMgKnRtcCA9IGxpc3RfZW50cnkodCwgc3RydWN0IGVsZl90aHJlYWRfc3RhdHVzLCBsaXN0KTsKKwkJZm9yIChpID0gMDsgaSA8IHRtcC0+bnVtX25vdGVzOyBpKyspCisJCQlpZiAoIXdyaXRlbm90ZSgmdG1wLT5ub3Rlc1tpXSwgZmlsZSkpCisJCQkJZ290byBlbmRfY29yZWR1bXA7CisJfQorIAorCURVTVBfU0VFSyhkYXRhb2ZmKTsKKworCWZvciAodm1hID0gY3VycmVudC0+bW0tPm1tYXA7IHZtYSAhPSBOVUxMOyB2bWEgPSB2bWEtPnZtX25leHQpIHsKKwkJdW5zaWduZWQgbG9uZyBhZGRyOworCisJCWlmICghbWF5ZHVtcCh2bWEpKQorCQkJY29udGludWU7CisKKwkJZm9yIChhZGRyID0gdm1hLT52bV9zdGFydDsKKwkJICAgICBhZGRyIDwgdm1hLT52bV9lbmQ7CisJCSAgICAgYWRkciArPSBQQUdFX1NJWkUpIHsKKwkJCXN0cnVjdCBwYWdlKiBwYWdlOworCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisKKwkJCWlmIChnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwgYWRkciwgMSwgMCwgMSwKKwkJCQkJCSZwYWdlLCAmdm1hKSA8PSAwKSB7CisJCQkJRFVNUF9TRUVLIChmaWxlLT5mX3BvcyArIFBBR0VfU0laRSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChwYWdlID09IFpFUk9fUEFHRShhZGRyKSkgeworCQkJCQlEVU1QX1NFRUsgKGZpbGUtPmZfcG9zICsgUEFHRV9TSVpFKTsKKwkJCQl9IGVsc2UgeworCQkJCQl2b2lkICprYWRkcjsKKwkJCQkJZmx1c2hfY2FjaGVfcGFnZSh2bWEsIGFkZHIsIHBhZ2VfdG9fcGZuKHBhZ2UpKTsKKwkJCQkJa2FkZHIgPSBrbWFwKHBhZ2UpOworCQkJCQlpZiAoKHNpemUgKz0gUEFHRV9TSVpFKSA+IGxpbWl0IHx8CisJCQkJCSAgICAhZHVtcF93cml0ZShmaWxlLCBrYWRkciwKKwkJCQkJICAgIFBBR0VfU0laRSkpIHsKKwkJCQkJCWt1bm1hcChwYWdlKTsKKwkJCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCQkJCWdvdG8gZW5kX2NvcmVkdW1wOworCQkJCQl9CisJCQkJCWt1bm1hcChwYWdlKTsKKwkJCQl9CisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJfQorCQl9CisJfQorCisjaWZkZWYgRUxGX0NPUkVfV1JJVEVfRVhUUkFfREFUQQorCUVMRl9DT1JFX1dSSVRFX0VYVFJBX0RBVEE7CisjZW5kaWYKKworCWlmICgob2ZmX3QpIGZpbGUtPmZfcG9zICE9IG9mZnNldCkgeworCQkvKiBTYW5pdHkgY2hlY2sgKi8KKwkJcHJpbnRrKCJlbGZfY29yZV9kdW1wOiBmaWxlLT5mX3BvcyAoJWxkKSAhPSBvZmZzZXQgKCVsZClcbiIsCisJCSAgICAgICAob2ZmX3QpIGZpbGUtPmZfcG9zLCBvZmZzZXQpOworCX0KKworZW5kX2NvcmVkdW1wOgorCXNldF9mcyhmcyk7CisKK2NsZWFudXA6CisJd2hpbGUoIWxpc3RfZW1wdHkoJnRocmVhZF9saXN0KSkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAgPSB0aHJlYWRfbGlzdC5uZXh0OworCQlsaXN0X2RlbCh0bXApOworCQlrZnJlZShsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGVsZl90aHJlYWRfc3RhdHVzLCBsaXN0KSk7CisJfQorCisJa2ZyZWUoZWxmKTsKKwlrZnJlZShwcnN0YXR1cyk7CisJa2ZyZWUocHNpbmZvKTsKKwlrZnJlZShub3Rlcyk7CisJa2ZyZWUoZnB1KTsKKyNpZmRlZiBFTEZfQ09SRV9DT1BZX1hGUFJFR1MKKwlrZnJlZSh4ZnB1KTsKKyNlbmRpZgorCXJldHVybiBoYXNfZHVtcGVkOworI3VuZGVmIE5VTV9OT1RFUworfQorCisjZW5kaWYJCS8qIFVTRV9FTEZfQ09SRV9EVU1QICovCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZWxmX2JpbmZtdCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9iaW5mbXQoJmVsZl9mb3JtYXQpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9lbGZfYmluZm10KHZvaWQpCit7CisJLyogUmVtb3ZlIHRoZSBDT0ZGIGFuZCBFTEYgbG9hZGVycy4gKi8KKwl1bnJlZ2lzdGVyX2JpbmZtdCgmZWxmX2Zvcm1hdCk7Cit9CisKK2NvcmVfaW5pdGNhbGwoaW5pdF9lbGZfYmluZm10KTsKK21vZHVsZV9leGl0KGV4aXRfZWxmX2JpbmZtdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZWxmX2ZkcGljLmMgYi9mcy9iaW5mbXRfZWxmX2ZkcGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0YzljMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JpbmZtdF9lbGZfZmRwaWMuYwpAQCAtMCwwICsxLDExMDEgQEAKKy8qIGJpbmZtdF9lbGZfZmRwaWMuYzogRkRQSUMgRUxGIGJpbmFyeSBmb3JtYXQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICogRGVyaXZlZCBmcm9tIGJpbmZtdF9lbGYuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpbmZtdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLWZkcGljLmg+CisjaW5jbHVkZSA8bGludXgvZWxmY29yZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGFyYW0uaD4KKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorCit0eXBlZGVmIGNoYXIgKmVsZl9jYWRkcl90OworI2lmbmRlZiBlbGZfYWRkcl90CisjZGVmaW5lIGVsZl9hZGRyX3QgdW5zaWduZWQgbG9uZworI2VuZGlmCisKKyNpZiAwCisjZGVmaW5lIGtkZWJ1ZyhmbXQsIC4uLikgcHJpbnRrKCJGRFBJQyAiZm10IlxuIiAsIyNfX1ZBX0FSR1NfXyApCisjZWxzZQorI2RlZmluZSBrZGVidWcoZm10LCAuLi4pIGRvIHt9IHdoaWxlKDApCisjZW5kaWYKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IGxvYWRfZWxmX2ZkcGljX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisvL3N0YXRpYyBpbnQgbG9hZF9lbGZfZmRwaWNfbGlicmFyeShzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyBpbnQgZWxmX2ZkcGljX2ZldGNoX3BoZHJzKHN0cnVjdCBlbGZfZmRwaWNfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgZWxmX2ZkcGljX21hcF9maWxlKHN0cnVjdCBlbGZfZmRwaWNfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJICAgICAgY29uc3QgY2hhciAqd2hhdCk7CisKK3N0YXRpYyBpbnQgY3JlYXRlX2VsZl9mZHBpY190YWJsZXMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwKKwkJCQkgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkgICBzdHJ1Y3QgZWxmX2ZkcGljX3BhcmFtcyAqZXhlY19wYXJhbXMsCisJCQkJICAgc3RydWN0IGVsZl9mZHBpY19wYXJhbXMgKmludGVycF9wYXJhbXMpOworCisjaWZuZGVmIENPTkZJR19NTVUKK3N0YXRpYyBpbnQgZWxmX2ZkcGljX3RyYW5zZmVyX2FyZ3NfdG9fc3RhY2soc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwgdW5zaWduZWQgbG9uZyAqX3NwKTsKK3N0YXRpYyBpbnQgZWxmX2ZkcGljX21hcF9maWxlX2NvbnN0ZGlzcF9vbl91Y2xpbnV4KHN0cnVjdCBlbGZfZmRwaWNfcGFyYW1zICpwYXJhbXMsCisJCQkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJCSAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGVsZl9mZHBpY19tYXBfZmlsZV9ieV9kaXJlY3RfbW1hcChzdHJ1Y3QgZWxmX2ZkcGljX3BhcmFtcyAqcGFyYW1zLAorCQkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKKworc3RhdGljIHN0cnVjdCBsaW51eF9iaW5mbXQgZWxmX2ZkcGljX2Zvcm1hdCA9IHsKKwkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAorCS5sb2FkX2JpbmFyeQk9IGxvYWRfZWxmX2ZkcGljX2JpbmFyeSwKKy8vCS5sb2FkX3NobGliCT0gbG9hZF9lbGZfZmRwaWNfbGlicmFyeSwKKy8vCS5jb3JlX2R1bXAJPSBlbGZfZmRwaWNfY29yZV9kdW1wLAorCS5taW5fY29yZWR1bXAJPSBFTEZfRVhFQ19QQUdFU0laRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZWxmX2ZkcGljX2JpbmZtdCh2b2lkKSAgeyByZXR1cm4gcmVnaXN0ZXJfYmluZm10KCZlbGZfZmRwaWNfZm9ybWF0KTsgfQorc3RhdGljIHZvaWQgX19leGl0IGV4aXRfZWxmX2ZkcGljX2JpbmZtdCh2b2lkKSB7IHVucmVnaXN0ZXJfYmluZm10KCZlbGZfZmRwaWNfZm9ybWF0KTsgfQorCittb2R1bGVfaW5pdChpbml0X2VsZl9mZHBpY19iaW5mbXQpCittb2R1bGVfZXhpdChleGl0X2VsZl9mZHBpY19iaW5mbXQpCisKK3N0YXRpYyBpbnQgaXNfZWxmX2ZkcGljKHN0cnVjdCBlbGZoZHIgKmhkciwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKG1lbWNtcChoZHItPmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRykgIT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKGhkci0+ZV90eXBlICE9IEVUX0VYRUMgJiYgaGRyLT5lX3R5cGUgIT0gRVRfRFlOKQorCQlyZXR1cm4gMDsKKwlpZiAoIWVsZl9jaGVja19hcmNoKGhkcikgfHwgIWVsZl9jaGVja19mZHBpYyhoZHIpKQorCQlyZXR1cm4gMDsKKwlpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPm1tYXApCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogcmVhZCB0aGUgcHJvZ3JhbSBoZWFkZXJzIHRhYmxlIGludG8gbWVtb3J5CisgKi8KK3N0YXRpYyBpbnQgZWxmX2ZkcGljX2ZldGNoX3BoZHJzKHN0cnVjdCBlbGZfZmRwaWNfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBlbGYzMl9waGRyICpwaGRyOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgcmV0dmFsLCBsb29wOworCisJaWYgKHBhcmFtcy0+aGRyLmVfcGhlbnRzaXplICE9IHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAocGFyYW1zLT5oZHIuZV9waG51bSA+IDY1NTM2VSAvIHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNpemUgPSBwYXJhbXMtPmhkci5lX3BobnVtICogc2l6ZW9mKHN0cnVjdCBlbGZfcGhkcik7CisJcGFyYW1zLT5waGRycyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXJhbXMtPnBoZHJzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHZhbCA9IGtlcm5lbF9yZWFkKGZpbGUsIHBhcmFtcy0+aGRyLmVfcGhvZmYsIChjaGFyICopIHBhcmFtcy0+cGhkcnMsIHNpemUpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJLyogZGV0ZXJtaW5lIHN0YWNrIHNpemUgZm9yIHRoaXMgYmluYXJ5ICovCisJcGhkciA9IHBhcmFtcy0+cGhkcnM7CisJZm9yIChsb29wID0gMDsgbG9vcCA8IHBhcmFtcy0+aGRyLmVfcGhudW07IGxvb3ArKywgcGhkcisrKSB7CisJCWlmIChwaGRyLT5wX3R5cGUgIT0gUFRfR05VX1NUQUNLKQorCQkJY29udGludWU7CisKKwkJaWYgKHBoZHItPnBfZmxhZ3MgJiBQRl9YKQorCQkJcGFyYW1zLT5mbGFncyB8PSBFTEZfRkRQSUNfRkxBR19FWEVDX1NUQUNLOworCQllbHNlCisJCQlwYXJhbXMtPmZsYWdzIHw9IEVMRl9GRFBJQ19GTEFHX05PRVhFQ19TVEFDSzsKKworCQlwYXJhbXMtPnN0YWNrX3NpemUgPSBwaGRyLT5wX21lbXN6OworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30gLyogZW5kIGVsZl9mZHBpY19mZXRjaF9waGRycygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb2FkIGFuIGZkcGljIGJpbmFyeSBpbnRvIHZhcmlvdXMgYml0cyBvZiBtZW1vcnkKKyAqLworc3RhdGljIGludCBsb2FkX2VsZl9mZHBpY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGVsZl9mZHBpY19wYXJhbXMgZXhlY19wYXJhbXMsIGludGVycF9wYXJhbXM7CisJc3RydWN0IGVsZl9waGRyICpwaGRyOworCXVuc2lnbmVkIGxvbmcgc3RhY2tfc2l6ZTsKKwlzdHJ1Y3QgZmlsZSAqaW50ZXJwcmV0ZXIgPSBOVUxMOyAvKiB0byBzaHV0IGdjYyB1cCAqLworCWNoYXIgKmludGVycHJldGVyX25hbWUgPSBOVUxMOworCWludCBleGVjdXRhYmxlX3N0YWNrOworCWludCByZXR2YWwsIGk7CisKKwltZW1zZXQoJmV4ZWNfcGFyYW1zLCAwLCBzaXplb2YoZXhlY19wYXJhbXMpKTsKKwltZW1zZXQoJmludGVycF9wYXJhbXMsIDAsIHNpemVvZihpbnRlcnBfcGFyYW1zKSk7CisKKwlleGVjX3BhcmFtcy5oZHIgPSAqKHN0cnVjdCBlbGZoZHIgKikgYnBybS0+YnVmOworCWV4ZWNfcGFyYW1zLmZsYWdzID0gRUxGX0ZEUElDX0ZMQUdfUFJFU0VOVCB8IEVMRl9GRFBJQ19GTEFHX0VYRUNVVEFCTEU7CisKKwkvKiBjaGVjayB0aGF0IHRoaXMgaXMgYSBiaW5hcnkgd2Uga25vdyBob3cgdG8gZGVhbCB3aXRoICovCisJcmV0dmFsID0gLUVOT0VYRUM7CisJaWYgKCFpc19lbGZfZmRwaWMoJmV4ZWNfcGFyYW1zLmhkciwgYnBybS0+ZmlsZSkpCisJCWdvdG8gZXJyb3I7CisKKwkvKiByZWFkIHRoZSBwcm9ncmFtIGhlYWRlciB0YWJsZSAqLworCXJldHZhbCA9IGVsZl9mZHBpY19mZXRjaF9waGRycygmZXhlY19wYXJhbXMsIGJwcm0tPmZpbGUpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogc2NhbiBmb3IgYSBwcm9ncmFtIGhlYWRlciB0aGF0IHNwZWNpZmllcyBhbiBpbnRlcnByZXRlciAqLworCXBoZHIgPSBleGVjX3BhcmFtcy5waGRyczsKKworCWZvciAoaSA9IDA7IGkgPCBleGVjX3BhcmFtcy5oZHIuZV9waG51bTsgaSsrLCBwaGRyKyspIHsKKwkJc3dpdGNoIChwaGRyLT5wX3R5cGUpIHsKKwkJY2FzZSBQVF9JTlRFUlA6CisJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJaWYgKHBoZHItPnBfZmlsZXN6ID4gUEFUSF9NQVgpCisJCQkJZ290byBlcnJvcjsKKwkJCXJldHZhbCA9IC1FTk9FTlQ7CisJCQlpZiAocGhkci0+cF9maWxlc3ogPCAyKQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCS8qIHJlYWQgdGhlIG5hbWUgb2YgdGhlIGludGVycHJldGVyIGludG8gbWVtb3J5ICovCisJCQlpbnRlcnByZXRlcl9uYW1lID0gKGNoYXIgKikga21hbGxvYyhwaGRyLT5wX2ZpbGVzeiwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWludGVycHJldGVyX25hbWUpCisJCQkJZ290byBlcnJvcjsKKworCQkJcmV0dmFsID0ga2VybmVsX3JlYWQoYnBybS0+ZmlsZSwKKwkJCQkJICAgICBwaGRyLT5wX29mZnNldCwKKwkJCQkJICAgICBpbnRlcnByZXRlcl9uYW1lLAorCQkJCQkgICAgIHBoZHItPnBfZmlsZXN6KTsKKwkJCWlmIChyZXR2YWwgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCXJldHZhbCA9IC1FTk9FTlQ7CisJCQlpZiAoaW50ZXJwcmV0ZXJfbmFtZVtwaGRyLT5wX2ZpbGVzeiAtIDFdICE9ICdcMCcpCisJCQkJZ290byBlcnJvcjsKKworCQkJa2RlYnVnKCJVc2luZyBFTEYgaW50ZXJwcmV0ZXIgJXMiLCBpbnRlcnByZXRlcl9uYW1lKTsKKworCQkJLyogcmVwbGFjZSB0aGUgcHJvZ3JhbSB3aXRoIHRoZSBpbnRlcnByZXRlciAqLworCQkJaW50ZXJwcmV0ZXIgPSBvcGVuX2V4ZWMoaW50ZXJwcmV0ZXJfbmFtZSk7CisJCQlyZXR2YWwgPSBQVFJfRVJSKGludGVycHJldGVyKTsKKwkJCWlmIChJU19FUlIoaW50ZXJwcmV0ZXIpKSB7CisJCQkJaW50ZXJwcmV0ZXIgPSBOVUxMOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisKKwkJCXJldHZhbCA9IGtlcm5lbF9yZWFkKGludGVycHJldGVyLCAwLCBicHJtLT5idWYsIEJJTlBSTV9CVUZfU0laRSk7CisJCQlpZiAocmV0dmFsIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCisJCQlpbnRlcnBfcGFyYW1zLmhkciA9ICooKHN0cnVjdCBlbGZoZHIgKikgYnBybS0+YnVmKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUFRfTE9BRDoKKyNpZmRlZiBDT05GSUdfTU1VCisJCQlpZiAoZXhlY19wYXJhbXMubG9hZF9hZGRyID09IDApCisJCQkJZXhlY19wYXJhbXMubG9hZF9hZGRyID0gcGhkci0+cF92YWRkcjsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworCX0KKworCWlmIChlbGZfY2hlY2tfY29uc3RfZGlzcGxhY2VtZW50KCZleGVjX3BhcmFtcy5oZHIpKQorCQlleGVjX3BhcmFtcy5mbGFncyB8PSBFTEZfRkRQSUNfRkxBR19DT05TVERJU1A7CisKKwkvKiBwZXJmb3JtIGluc2FuaXR5IGNoZWNrcyBvbiB0aGUgaW50ZXJwcmV0ZXIgKi8KKwlpZiAoaW50ZXJwcmV0ZXJfbmFtZSkgeworCQlyZXR2YWwgPSAtRUxJQkJBRDsKKwkJaWYgKCFpc19lbGZfZmRwaWMoJmludGVycF9wYXJhbXMuaGRyLCBpbnRlcnByZXRlcikpCisJCQlnb3RvIGVycm9yOworCisJCWludGVycF9wYXJhbXMuZmxhZ3MgPSBFTEZfRkRQSUNfRkxBR19QUkVTRU5UOworCisJCS8qIHJlYWQgdGhlIGludGVycHJldGVyJ3MgcHJvZ3JhbSBoZWFkZXIgdGFibGUgKi8KKwkJcmV0dmFsID0gZWxmX2ZkcGljX2ZldGNoX3BoZHJzKCZpbnRlcnBfcGFyYW1zLCBpbnRlcnByZXRlcik7CisJCWlmIChyZXR2YWwgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwlzdGFja19zaXplID0gZXhlY19wYXJhbXMuc3RhY2tfc2l6ZTsKKwlpZiAoc3RhY2tfc2l6ZSA8IGludGVycF9wYXJhbXMuc3RhY2tfc2l6ZSkKKwkJc3RhY2tfc2l6ZSA9IGludGVycF9wYXJhbXMuc3RhY2tfc2l6ZTsKKworCWlmIChleGVjX3BhcmFtcy5mbGFncyAmIEVMRl9GRFBJQ19GTEFHX0VYRUNfU1RBQ0spCisJCWV4ZWN1dGFibGVfc3RhY2sgPSBFWFNUQUNLX0VOQUJMRV9YOworCWVsc2UgaWYgKGV4ZWNfcGFyYW1zLmZsYWdzICYgRUxGX0ZEUElDX0ZMQUdfTk9FWEVDX1NUQUNLKQorCQlleGVjdXRhYmxlX3N0YWNrID0gRVhTVEFDS19ESVNBQkxFX1g7CisJZWxzZSBpZiAoaW50ZXJwX3BhcmFtcy5mbGFncyAmIEVMRl9GRFBJQ19GTEFHX0VYRUNfU1RBQ0spCisJCWV4ZWN1dGFibGVfc3RhY2sgPSBFWFNUQUNLX0VOQUJMRV9YOworCWVsc2UgaWYgKGludGVycF9wYXJhbXMuZmxhZ3MgJiBFTEZfRkRQSUNfRkxBR19OT0VYRUNfU1RBQ0spCisJCWV4ZWN1dGFibGVfc3RhY2sgPSBFWFNUQUNLX0RJU0FCTEVfWDsKKwllbHNlCisJCWV4ZWN1dGFibGVfc3RhY2sgPSBFWFNUQUNLX0RFRkFVTFQ7CisKKwlyZXR2YWwgPSAtRU5PRVhFQzsKKwlpZiAoc3RhY2tfc2l6ZSA9PSAwKQorCQlnb3RvIGVycm9yOworCisJaWYgKGVsZl9jaGVja19jb25zdF9kaXNwbGFjZW1lbnQoJmludGVycF9wYXJhbXMuaGRyKSkKKwkJaW50ZXJwX3BhcmFtcy5mbGFncyB8PSBFTEZfRkRQSUNfRkxBR19DT05TVERJU1A7CisKKwkvKiBmbHVzaCBhbGwgdHJhY2VzIG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyBleGVjdXRhYmxlICovCisJcmV0dmFsID0gZmx1c2hfb2xkX2V4ZWMoYnBybSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvcjsKKworCS8qIHRoZXJlJ3Mgbm93IG5vIHR1cm5pbmcgYmFjay4uLiB0aGUgb2xkIHVzZXJzcGFjZSBpbWFnZSBpcyBkZWFkLAorCSAqIGRlZnVuY3QsIGRlY2Vhc2VkLCBldGMuIGFmdGVyIHRoaXMgcG9pbnQgd2UgaGF2ZSB0byBleGl0IHZpYQorCSAqIGVycm9yX2tpbGwgKi8KKwlzZXRfcGVyc29uYWxpdHkoUEVSX0xJTlVYX0ZEUElDKTsKKwlzZXRfYmluZm10KCZlbGZfZmRwaWNfZm9ybWF0KTsKKworCWN1cnJlbnQtPm1tLT5zdGFydF9jb2RlID0gMDsKKwljdXJyZW50LT5tbS0+ZW5kX2NvZGUgPSAwOworCWN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayA9IDA7CisJY3VycmVudC0+bW0tPnN0YXJ0X2RhdGEgPSAwOworCWN1cnJlbnQtPm1tLT5lbmRfZGF0YSA9IDA7CisJY3VycmVudC0+bW0tPmNvbnRleHQuZXhlY19mZHBpY19sb2FkbWFwID0gMDsKKwljdXJyZW50LT5tbS0+Y29udGV4dC5pbnRlcnBfZmRwaWNfbG9hZG1hcCA9IDA7CisKKwljdXJyZW50LT5mbGFncyAmPSB+UEZfRk9SS05PRVhFQzsKKworI2lmZGVmIENPTkZJR19NTVUKKwllbGZfZmRwaWNfYXJjaF9sYXlfb3V0X21tKCZleGVjX3BhcmFtcywKKwkJCQkgICZpbnRlcnBfcGFyYW1zLAorCQkJCSAgJmN1cnJlbnQtPm1tLT5zdGFydF9zdGFjaywKKwkJCQkgICZjdXJyZW50LT5tbS0+c3RhcnRfYnJrKTsKKyNlbmRpZgorCisJLyogZG8gdGhpcyBzbyB0aGF0IHdlIGNhbiBsb2FkIHRoZSBpbnRlcnByZXRlciwgaWYgbmVlZCBiZQorCSAqIC0gd2Ugd2lsbCBjaGFuZ2Ugc29tZSBvZiB0aGVzZSBsYXRlcgorCSAqLworCXNldF9tbV9jb3VudGVyKGN1cnJlbnQtPm1tLCByc3MsIDApOworCisjaWZkZWYgQ09ORklHX01NVQorCXJldHZhbCA9IHNldHVwX2FyZ19wYWdlcyhicHJtLCBjdXJyZW50LT5tbS0+c3RhcnRfc3RhY2ssIGV4ZWN1dGFibGVfc3RhY2spOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXNlbmRfc2lnKFNJR0tJTEwsIGN1cnJlbnQsIDApOworCQlnb3RvIGVycm9yX2tpbGw7CisJfQorI2VuZGlmCisKKwkvKiBsb2FkIHRoZSBleGVjdXRhYmxlIGFuZCBpbnRlcnByZXRlciBpbnRvIG1lbW9yeSAqLworCXJldHZhbCA9IGVsZl9mZHBpY19tYXBfZmlsZSgmZXhlY19wYXJhbXMsIGJwcm0tPmZpbGUsIGN1cnJlbnQtPm1tLCAiZXhlY3V0YWJsZSIpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGVycm9yX2tpbGw7CisKKwlpZiAoaW50ZXJwcmV0ZXJfbmFtZSkgeworCQlyZXR2YWwgPSBlbGZfZmRwaWNfbWFwX2ZpbGUoJmludGVycF9wYXJhbXMsIGludGVycHJldGVyLAorCQkJCQkgICAgY3VycmVudC0+bW0sICJpbnRlcnByZXRlciIpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gbG9hZCBpbnRlcnByZXRlclxuIik7CisJCQlnb3RvIGVycm9yX2tpbGw7CisJCX0KKworCQlhbGxvd193cml0ZV9hY2Nlc3MoaW50ZXJwcmV0ZXIpOworCQlmcHV0KGludGVycHJldGVyKTsKKwkJaW50ZXJwcmV0ZXIgPSBOVUxMOworCX0KKworI2lmZGVmIENPTkZJR19NTVUKKwlpZiAoIWN1cnJlbnQtPm1tLT5zdGFydF9icmspCisJCWN1cnJlbnQtPm1tLT5zdGFydF9icmsgPSBjdXJyZW50LT5tbS0+ZW5kX2RhdGE7CisKKwljdXJyZW50LT5tbS0+YnJrID0gY3VycmVudC0+bW0tPnN0YXJ0X2JyayA9IFBBR0VfQUxJR04oY3VycmVudC0+bW0tPnN0YXJ0X2Jyayk7CisKKyNlbHNlCisJLyogY3JlYXRlIGEgc3RhY2sgYW5kIGJyayBhcmVhIGJpZyBlbm91Z2ggZm9yIGV2ZXJ5b25lCisJICogLSB0aGUgYnJrIGhlYXAgc3RhcnRzIGF0IHRoZSBib3R0b20gYW5kIHdvcmtzIHVwCisJICogLSB0aGUgc3RhY2sgc3RhcnRzIGF0IHRoZSB0b3AgYW5kIHdvcmtzIGRvd24KKwkgKi8KKwlzdGFja19zaXplID0gKHN0YWNrX3NpemUgKyBQQUdFX1NJWkUgLSAxKSAmIFBBR0VfTUFTSzsKKwlpZiAoc3RhY2tfc2l6ZSA8IFBBR0VfU0laRSAqIDIpCisJCXN0YWNrX3NpemUgPSBQQUdFX1NJWkUgKiAyOworCisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwljdXJyZW50LT5tbS0+c3RhcnRfYnJrID0gZG9fbW1hcChOVUxMLAorCQkJCQkgMCwKKwkJCQkJIHN0YWNrX3NpemUsCisJCQkJCSBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDLAorCQkJCQkgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTiB8IE1BUF9HUk9XU0RPV04sCisJCQkJCSAwKTsKKworCWlmIChJU19FUlIoKHZvaWQgKikgY3VycmVudC0+bW0tPnN0YXJ0X2JyaykpIHsKKwkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCXJldHZhbCA9IGN1cnJlbnQtPm1tLT5zdGFydF9icms7CisJCWN1cnJlbnQtPm1tLT5zdGFydF9icmsgPSAwOworCQlnb3RvIGVycm9yX2tpbGw7CisJfQorCisJaWYgKGRvX21yZW1hcChjdXJyZW50LT5tbS0+c3RhcnRfYnJrLAorCQkgICAgICBzdGFja19zaXplLAorCQkgICAgICBrc2l6ZSgoY2hhciAqKSBjdXJyZW50LT5tbS0+c3RhcnRfYnJrKSwKKwkJICAgICAgMCwgMAorCQkgICAgICApID09IGN1cnJlbnQtPm1tLT5zdGFydF9icmsKKwkgICAgKQorCQlzdGFja19zaXplID0ga3NpemUoKGNoYXIgKikgY3VycmVudC0+bW0tPnN0YXJ0X2Jyayk7CisJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisKKwljdXJyZW50LT5tbS0+YnJrID0gY3VycmVudC0+bW0tPnN0YXJ0X2JyazsKKwljdXJyZW50LT5tbS0+Y29udGV4dC5lbmRfYnJrID0gY3VycmVudC0+bW0tPnN0YXJ0X2JyazsKKwljdXJyZW50LT5tbS0+Y29udGV4dC5lbmRfYnJrICs9IChzdGFja19zaXplID4gUEFHRV9TSVpFKSA/IChzdGFja19zaXplIC0gUEFHRV9TSVpFKSA6IDA7CisJY3VycmVudC0+bW0tPnN0YXJ0X3N0YWNrID0gY3VycmVudC0+bW0tPnN0YXJ0X2JyayArIHN0YWNrX3NpemU7CisjZW5kaWYKKworCWNvbXB1dGVfY3JlZHMoYnBybSk7CisJY3VycmVudC0+ZmxhZ3MgJj0gflBGX0ZPUktOT0VYRUM7CisJaWYgKGNyZWF0ZV9lbGZfZmRwaWNfdGFibGVzKGJwcm0sIGN1cnJlbnQtPm1tLCAmZXhlY19wYXJhbXMsICZpbnRlcnBfcGFyYW1zKSA8IDApCisJCWdvdG8gZXJyb3Jfa2lsbDsKKworCWtkZWJ1ZygiLSBzdGFydF9jb2RlICAlbHgiLAkobG9uZykgY3VycmVudC0+bW0tPnN0YXJ0X2NvZGUpOworCWtkZWJ1ZygiLSBlbmRfY29kZSAgICAlbHgiLAkobG9uZykgY3VycmVudC0+bW0tPmVuZF9jb2RlKTsKKwlrZGVidWcoIi0gc3RhcnRfZGF0YSAgJWx4IiwJKGxvbmcpIGN1cnJlbnQtPm1tLT5zdGFydF9kYXRhKTsKKwlrZGVidWcoIi0gZW5kX2RhdGEgICAgJWx4IiwJKGxvbmcpIGN1cnJlbnQtPm1tLT5lbmRfZGF0YSk7CisJa2RlYnVnKCItIHN0YXJ0X2JyayAgICVseCIsCShsb25nKSBjdXJyZW50LT5tbS0+c3RhcnRfYnJrKTsKKwlrZGVidWcoIi0gYnJrICAgICAgICAgJWx4IiwJKGxvbmcpIGN1cnJlbnQtPm1tLT5icmspOworCWtkZWJ1ZygiLSBzdGFydF9zdGFjayAlbHgiLAkobG9uZykgY3VycmVudC0+bW0tPnN0YXJ0X3N0YWNrKTsKKworI2lmZGVmIEVMRl9GRFBJQ19QTEFUX0lOSVQKKwkvKgorCSAqIFRoZSBBQkkgbWF5IHNwZWNpZnkgdGhhdCBjZXJ0YWluIHJlZ2lzdGVycyBiZSBzZXQgdXAgaW4gc3BlY2lhbAorCSAqIHdheXMgKG9uIGkzODYgJWVkeCBpcyB0aGUgYWRkcmVzcyBvZiBhIERUX0ZJTkkgZnVuY3Rpb24sIGZvcgorCSAqIGV4YW1wbGUuICBUaGlzIG1hY3JvIHBlcmZvcm1zIHdoYXRldmVyIGluaXRpYWxpemF0aW9uIHRvCisJICogdGhlIHJlZ3Mgc3RydWN0dXJlIGlzIHJlcXVpcmVkLgorCSAqLworCUVMRl9GRFBJQ19QTEFUX0lOSVQocmVncywKKwkJCSAgICBleGVjX3BhcmFtcy5tYXBfYWRkciwKKwkJCSAgICBpbnRlcnBfcGFyYW1zLm1hcF9hZGRyLAorCQkJICAgIGludGVycF9wYXJhbXMuZHluYW1pY19hZGRyID86IGV4ZWNfcGFyYW1zLmR5bmFtaWNfYWRkcgorCQkJICAgICk7CisjZW5kaWYKKworCS8qIGV2ZXJ5dGhpbmcgaXMgbm93IHJlYWR5Li4uIGdldCB0aGUgdXNlcnNwYWNlIGNvbnRleHQgcmVhZHkgdG8gcm9sbCAqLworCXN0YXJ0X3RocmVhZChyZWdzLAorCQkgICAgIGludGVycF9wYXJhbXMuZW50cnlfYWRkciA/OiBleGVjX3BhcmFtcy5lbnRyeV9hZGRyLAorCQkgICAgIGN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayk7CisKKwlpZiAodW5saWtlbHkoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpIHsKKwkJaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1RSQUNFX0VYRUMpCisJCQlwdHJhY2Vfbm90aWZ5ICgoUFRSQUNFX0VWRU5UX0VYRUMgPDwgOCkgfCBTSUdUUkFQKTsKKwkJZWxzZQorCQkJc2VuZF9zaWcoU0lHVFJBUCwgY3VycmVudCwgMCk7CisJfQorCisJcmV0dmFsID0gMDsKKworZXJyb3I6CisJaWYgKGludGVycHJldGVyKSB7CisJCWFsbG93X3dyaXRlX2FjY2VzcyhpbnRlcnByZXRlcik7CisJCWZwdXQoaW50ZXJwcmV0ZXIpOworCX0KKwlpZiAoaW50ZXJwcmV0ZXJfbmFtZSkKKwkJa2ZyZWUoaW50ZXJwcmV0ZXJfbmFtZSk7CisJaWYgKGV4ZWNfcGFyYW1zLnBoZHJzKQorCQlrZnJlZShleGVjX3BhcmFtcy5waGRycyk7CisJaWYgKGV4ZWNfcGFyYW1zLmxvYWRtYXApCisJCWtmcmVlKGV4ZWNfcGFyYW1zLmxvYWRtYXApOworCWlmIChpbnRlcnBfcGFyYW1zLnBoZHJzKQorCQlrZnJlZShpbnRlcnBfcGFyYW1zLnBoZHJzKTsKKwlpZiAoaW50ZXJwX3BhcmFtcy5sb2FkbWFwKQorCQlrZnJlZShpbnRlcnBfcGFyYW1zLmxvYWRtYXApOworCXJldHVybiByZXR2YWw7CisKKwkvKiB1bnJlY292ZXJhYmxlIGVycm9yIC0ga2lsbCB0aGUgcHJvY2VzcyAqLworIGVycm9yX2tpbGw6CisJc2VuZF9zaWcoU0lHU0VHViwgY3VycmVudCwgMCk7CisJZ290byBlcnJvcjsKKworfSAvKiBlbmQgbG9hZF9lbGZfZmRwaWNfYmluYXJ5KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHByZXNlbnQgdXNlZnVsIGluZm9ybWF0aW9uIHRvIHRoZSBwcm9ncmFtCisgKi8KK3N0YXRpYyBpbnQgY3JlYXRlX2VsZl9mZHBpY190YWJsZXMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwKKwkJCQkgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkgICBzdHJ1Y3QgZWxmX2ZkcGljX3BhcmFtcyAqZXhlY19wYXJhbXMsCisJCQkJICAgc3RydWN0IGVsZl9mZHBpY19wYXJhbXMgKmludGVycF9wYXJhbXMpCit7CisJdW5zaWduZWQgbG9uZyBzcCwgY3NwLCBuaXRlbXM7CisJZWxmX2NhZGRyX3QgKmFyZ3YsICplbnZwOworCXNpemVfdCBwbGF0Zm9ybV9sZW4gPSAwLCBsZW47CisJY2hhciAqa19wbGF0Zm9ybSwgKnVfcGxhdGZvcm0sICpwOworCWxvbmcgaHdjYXA7CisJaW50IGxvb3A7CisKKwkvKiB3ZSdyZSBnb2luZyB0byBzaG92ZWwgYSB3aG9sZSBsb2FkIG9mIHN0dWZmIG9udG8gdGhlIHN0YWNrICovCisjaWZkZWYgQ09ORklHX01NVQorCXNwID0gYnBybS0+cDsKKyNlbHNlCisJc3AgPSBtbS0+c3RhcnRfc3RhY2s7CisKKwkvKiBzdGFjayB0aGUgcHJvZ3JhbSBhcmd1bWVudHMgYW5kIGVudmlyb25tZW50ICovCisJaWYgKGVsZl9mZHBpY190cmFuc2Zlcl9hcmdzX3RvX3N0YWNrKGJwcm0sICZzcCkgPCAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKyNlbmRpZgorCisJLyogZ2V0IGhvbGQgb2YgcGxhdGZvcm0gYW5kIGhhcmR3YXJlIGNhcGFiaWxpdGllcyBtYXNrcyBmb3IgdGhlIG1hY2hpbmUKKwkgKiB3ZSBhcmUgcnVubmluZyBvbi4gIEluIHNvbWUgY2FzZXMgKFNwYXJjKSwgdGhpcyBpbmZvIGlzIGltcG9zc2libGUKKwkgKiB0byBnZXQsIGluIG90aGVycyAoaTM4NikgaXQgaXMgbWVyZWx5IGRpZmZpY3VsdC4KKwkgKi8KKwlod2NhcCA9IEVMRl9IV0NBUDsKKwlrX3BsYXRmb3JtID0gRUxGX1BMQVRGT1JNOworCisJaWYgKGtfcGxhdGZvcm0pIHsKKwkJcGxhdGZvcm1fbGVuID0gc3RybGVuKGtfcGxhdGZvcm0pICsgMTsKKwkJc3AgLT0gcGxhdGZvcm1fbGVuOworCQlpZiAoX19jb3B5X3RvX3VzZXIodV9wbGF0Zm9ybSwga19wbGF0Zm9ybSwgcGxhdGZvcm1fbGVuKSAhPSAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJdV9wbGF0Zm9ybSA9IChjaGFyICopIHNwOworCisjaWYgZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChDT05GSUdfU01QKQorCS8qIGluIHNvbWUgY2FzZXMgKGUuZy4gSHlwZXItVGhyZWFkaW5nKSwgd2Ugd2FudCB0byBhdm9pZCBMMSBldmljdGlvbnMKKwkgKiBieSB0aGUgcHJvY2Vzc2VzIHJ1bm5pbmcgb24gdGhlIHNhbWUgcGFja2FnZS4gT25lIHRoaW5nIHdlIGNhbiBkbworCSAqIGlzIHRvIHNodWZmbGUgdGhlIGluaXRpYWwgc3RhY2sgZm9yIHRoZW0uCisJICoKKwkgKiB0aGUgY29uZGl0aW9uYWxzIGhlcmUgYXJlIHVubmVlZGVkLCBidXQga2VwdCBpbiB0byBtYWtlIHRoZQorCSAqIGNvZGUgYmVoYXZpb3VyIHRoZSBzYW1lIGFzIHByZSBjaGFuZ2UgdW5sZXNzIHdlIGhhdmUgaHlwZXJ0aHJlYWRlZAorCSAqIHByb2Nlc3NvcnMuIFRoaXMga2VlcHMgTXIgTWFyY2VsbyBQZXJzb24gaGFwcGllciBidXQgc2hvdWxkIGJlCisJICogcmVtb3ZlZCBmb3IgMi41CisJICovCisJaWYgKHNtcF9udW1fc2libGluZ3MgPiAxKQorCQlzcCA9IHNwIC0gKChjdXJyZW50LT5waWQgJSA2NCkgPDwgNyk7CisjZW5kaWYKKworCXNwICY9IH43VUw7CisKKwkvKiBzdGFjayB0aGUgbG9hZCBtYXAocykgKi8KKwlsZW4gPSBzaXplb2Yoc3RydWN0IGVsZjMyX2ZkcGljX2xvYWRtYXApOworCWxlbiArPSBzaXplb2Yoc3RydWN0IGVsZjMyX2ZkcGljX2xvYWRzZWcpICogZXhlY19wYXJhbXMtPmxvYWRtYXAtPm5zZWdzOworCXNwID0gKHNwIC0gbGVuKSAmIH43VUw7CisJZXhlY19wYXJhbXMtPm1hcF9hZGRyID0gc3A7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkICopIHNwLCBleGVjX3BhcmFtcy0+bG9hZG1hcCwgbGVuKSAhPSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWN1cnJlbnQtPm1tLT5jb250ZXh0LmV4ZWNfZmRwaWNfbG9hZG1hcCA9ICh1bnNpZ25lZCBsb25nKSBzcDsKKworCWlmIChpbnRlcnBfcGFyYW1zLT5sb2FkbWFwKSB7CisJCWxlbiA9IHNpemVvZihzdHJ1Y3QgZWxmMzJfZmRwaWNfbG9hZG1hcCk7CisJCWxlbiArPSBzaXplb2Yoc3RydWN0IGVsZjMyX2ZkcGljX2xvYWRzZWcpICogaW50ZXJwX3BhcmFtcy0+bG9hZG1hcC0+bnNlZ3M7CisJCXNwID0gKHNwIC0gbGVuKSAmIH43VUw7CisJCWludGVycF9wYXJhbXMtPm1hcF9hZGRyID0gc3A7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBzcCwgaW50ZXJwX3BhcmFtcy0+bG9hZG1hcCwgbGVuKSAhPSAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJY3VycmVudC0+bW0tPmNvbnRleHQuaW50ZXJwX2ZkcGljX2xvYWRtYXAgPSAodW5zaWduZWQgbG9uZykgc3A7CisJfQorCisJLyogZm9yY2UgMTYgYnl0ZSBfZmluYWxfIGFsaWdubWVudCBoZXJlIGZvciBnZW5lcmFsaXR5ICovCisjZGVmaW5lIERMSU5GT19JVEVNUyAxMworCisJbml0ZW1zID0gMSArIERMSU5GT19JVEVNUyArIChrX3BsYXRmb3JtID8gMSA6IDApOworI2lmZGVmIERMSU5GT19BUkNIX0lURU1TCisJbml0ZW1zICs9IERMSU5GT19BUkNIX0lURU1TOworI2VuZGlmCisKKwljc3AgPSBzcDsKKwlzcCAtPSBuaXRlbXMgKiAyICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCXNwIC09IChicHJtLT5lbnZjICsgMSkgKiBzaXplb2YoY2hhciAqKTsJLyogZW52dltdICovCisJc3AgLT0gKGJwcm0tPmFyZ2MgKyAxKSAqIHNpemVvZihjaGFyICopOwkvKiBhcmd2W10gKi8KKwlzcCAtPSAxICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOwkJLyogYXJnYyAqLworCisJY3NwIC09IHNwICYgMTVVTDsKKwlzcCAtPSBzcCAmIDE1VUw7CisKKwkvKiBwdXQgdGhlIEVMRiBpbnRlcnByZXRlciBpbmZvIG9uIHRoZSBzdGFjayAqLworI2RlZmluZSBORVdfQVVYX0VOVChuciwgaWQsIHZhbCkJCQkJCQlcCisJZG8gewkJCQkJCQkJCVwKKwkJc3RydWN0IHsgdW5zaWduZWQgbG9uZyBfaWQsIF92YWw7IH0gKmVudCA9ICh2b2lkICopIGNzcDsJXAorCQlfX3B1dF91c2VyKChpZCksICZlbnRbbnJdLl9pZCk7CQkJCQlcCisJCV9fcHV0X3VzZXIoKHZhbCksICZlbnRbbnJdLl92YWwpOwkJCQlcCisJfSB3aGlsZSAoMCkKKworCWNzcCAtPSAyICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCU5FV19BVVhfRU5UKDAsIEFUX05VTEwsIDApOworCWlmIChrX3BsYXRmb3JtKSB7CisJCWNzcCAtPSAyICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCQlORVdfQVVYX0VOVCgwLCBBVF9QTEFURk9STSwgKGVsZl9hZGRyX3QpKHVuc2lnbmVkIGxvbmcpIHVfcGxhdGZvcm0pOworCX0KKworCWNzcCAtPSBETElORk9fSVRFTVMgKiAyICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCU5FV19BVVhfRU5UKCAwLCBBVF9IV0NBUCwJCWh3Y2FwKTsKKwlORVdfQVVYX0VOVCggMSwgQVRfUEFHRVNaLAkJUEFHRV9TSVpFKTsKKwlORVdfQVVYX0VOVCggMiwgQVRfQ0xLVENLLAkJQ0xPQ0tTX1BFUl9TRUMpOworCU5FV19BVVhfRU5UKCAzLCBBVF9QSERSLAkJZXhlY19wYXJhbXMtPnBoX2FkZHIpOworCU5FV19BVVhfRU5UKCA0LCBBVF9QSEVOVCwJCXNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpKTsKKwlORVdfQVVYX0VOVCggNSwgQVRfUEhOVU0sCQlleGVjX3BhcmFtcy0+aGRyLmVfcGhudW0pOworCU5FV19BVVhfRU5UKCA2LAlBVF9CQVNFLAkJaW50ZXJwX3BhcmFtcy0+ZWxmaGRyX2FkZHIpOworCU5FV19BVVhfRU5UKCA3LCBBVF9GTEFHUywJCTApOworCU5FV19BVVhfRU5UKCA4LCBBVF9FTlRSWSwJCWV4ZWNfcGFyYW1zLT5lbnRyeV9hZGRyKTsKKwlORVdfQVVYX0VOVCggOSwgQVRfVUlELAkJCShlbGZfYWRkcl90KSBjdXJyZW50LT51aWQpOworCU5FV19BVVhfRU5UKDEwLCBBVF9FVUlELAkJKGVsZl9hZGRyX3QpIGN1cnJlbnQtPmV1aWQpOworCU5FV19BVVhfRU5UKDExLCBBVF9HSUQsCQkJKGVsZl9hZGRyX3QpIGN1cnJlbnQtPmdpZCk7CisJTkVXX0FVWF9FTlQoMTIsIEFUX0VHSUQsCQkoZWxmX2FkZHJfdCkgY3VycmVudC0+ZWdpZCk7CisKKyNpZmRlZiBBUkNIX0RMSU5GTworCS8qIEFSQ0hfRExJTkZPIG11c3QgY29tZSBsYXN0IHNvIHBsYXRmb3JtIHNwZWNpZmljIGNvZGUgY2FuIGVuZm9yY2UKKwkgKiBzcGVjaWFsIGFsaWdubWVudCByZXF1aXJlbWVudHMgb24gdGhlIEFVWFYgaWYgbmVjZXNzYXJ5IChlZy4gUFBDKS4KKwkgKi8KKwlBUkNIX0RMSU5GTzsKKyNlbmRpZgorI3VuZGVmIE5FV19BVVhfRU5UCisKKwkvKiBhbGxvY2F0ZSByb29tIGZvciBhcmd2W10gYW5kIGVudnZbXSAqLworCWNzcCAtPSAoYnBybS0+ZW52YyArIDEpICogc2l6ZW9mKGVsZl9jYWRkcl90KTsKKwllbnZwID0gKGVsZl9jYWRkcl90ICopIGNzcDsKKwljc3AgLT0gKGJwcm0tPmFyZ2MgKyAxKSAqIHNpemVvZihlbGZfY2FkZHJfdCk7CisJYXJndiA9IChlbGZfY2FkZHJfdCAqKSBjc3A7CisKKwkvKiBzdGFjayBhcmdjICovCisJY3NwIC09IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwlfX3B1dF91c2VyKGJwcm0tPmFyZ2MsICh1bnNpZ25lZCBsb25nICopIGNzcCk7CisKKwlpZiAoY3NwICE9IHNwKQorCQlCVUcoKTsKKworCS8qIGZpbGwgaW4gdGhlIGFyZ3ZbXSBhcnJheSAqLworI2lmZGVmIENPTkZJR19NTVUKKwljdXJyZW50LT5tbS0+YXJnX3N0YXJ0ID0gYnBybS0+cDsKKyNlbHNlCisJY3VycmVudC0+bW0tPmFyZ19zdGFydCA9IGN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayAtIChNQVhfQVJHX1BBR0VTICogUEFHRV9TSVpFIC0gYnBybS0+cCk7CisjZW5kaWYKKworCXAgPSAoY2hhciAqKSBjdXJyZW50LT5tbS0+YXJnX3N0YXJ0OworCWZvciAobG9vcCA9IGJwcm0tPmFyZ2M7IGxvb3AgPiAwOyBsb29wLS0pIHsKKwkJX19wdXRfdXNlcigoZWxmX2NhZGRyX3QpIHAsIGFyZ3YrKyk7CisJCWxlbiA9IHN0cm5sZW5fdXNlcihwLCBQQUdFX1NJWkUgKiBNQVhfQVJHX1BBR0VTKTsKKwkJaWYgKCFsZW4gfHwgbGVuID4gUEFHRV9TSVpFICogTUFYX0FSR19QQUdFUykKKwkJCXJldHVybiAtRUlOVkFMOworCQlwICs9IGxlbjsKKwl9CisJX19wdXRfdXNlcihOVUxMLCBhcmd2KTsKKwljdXJyZW50LT5tbS0+YXJnX2VuZCA9ICh1bnNpZ25lZCBsb25nKSBwOworCisJLyogZmlsbCBpbiB0aGUgZW52dltdIGFycmF5ICovCisJY3VycmVudC0+bW0tPmVudl9zdGFydCA9ICh1bnNpZ25lZCBsb25nKSBwOworCWZvciAobG9vcCA9IGJwcm0tPmVudmM7IGxvb3AgPiAwOyBsb29wLS0pIHsKKwkJX19wdXRfdXNlcigoZWxmX2NhZGRyX3QpKHVuc2lnbmVkIGxvbmcpIHAsIGVudnArKyk7CisJCWxlbiA9IHN0cm5sZW5fdXNlcihwLCBQQUdFX1NJWkUgKiBNQVhfQVJHX1BBR0VTKTsKKwkJaWYgKCFsZW4gfHwgbGVuID4gUEFHRV9TSVpFICogTUFYX0FSR19QQUdFUykKKwkJCXJldHVybiAtRUlOVkFMOworCQlwICs9IGxlbjsKKwl9CisJX19wdXRfdXNlcihOVUxMLCBlbnZwKTsKKwljdXJyZW50LT5tbS0+ZW52X2VuZCA9ICh1bnNpZ25lZCBsb25nKSBwOworCisJbW0tPnN0YXJ0X3N0YWNrID0gKHVuc2lnbmVkIGxvbmcpIHNwOworCXJldHVybiAwOworfSAvKiBlbmQgY3JlYXRlX2VsZl9mZHBpY190YWJsZXMoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogdHJhbnNmZXIgdGhlIHByb2dyYW0gYXJndW1lbnRzIGFuZCBlbnZpcm9ubWVudCBmcm9tIHRoZSBob2xkaW5nIHBhZ2VzIG9udG8KKyAqIHRoZSBzdGFjaworICovCisjaWZuZGVmIENPTkZJR19NTVUKK3N0YXRpYyBpbnQgZWxmX2ZkcGljX3RyYW5zZmVyX2FyZ3NfdG9fc3RhY2soc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwgdW5zaWduZWQgbG9uZyAqX3NwKQoreworCXVuc2lnbmVkIGxvbmcgaW5kZXgsIHN0b3AsIHNwOworCWNoYXIgKnNyYzsKKwlpbnQgcmV0ID0gMDsKKworCXN0b3AgPSBicHJtLT5wID4+IFBBR0VfU0hJRlQ7CisJc3AgPSAqX3NwOworCisJZm9yIChpbmRleCA9IE1BWF9BUkdfUEFHRVMgLSAxOyBpbmRleCA+PSBzdG9wOyBpbmRleC0tKSB7CisJCXNyYyA9IGttYXAoYnBybS0+cGFnZVtpbmRleF0pOworCQlzcCAtPSBQQUdFX1NJWkU7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgc3AsIHNyYywgUEFHRV9TSVpFKSAhPSAwKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJa3VubWFwKGJwcm0tPnBhZ2VbaW5kZXhdKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwl9CisKKwkqX3NwID0gKCpfc3AgLSAoTUFYX0FSR19QQUdFUyAqIFBBR0VfU0laRSAtIGJwcm0tPnApKSAmIH4xNTsKKworIG91dDoKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgZWxmX2ZkcGljX3RyYW5zZmVyX2FyZ3NfdG9fc3RhY2soKSAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb2FkIHRoZSBhcHByb3ByaWF0ZSBiaW5hcnkgaW1hZ2UgKGV4ZWN1dGFibGUgb3IgaW50ZXJwcmV0ZXIpIGludG8gbWVtb3J5CisgKiAtIHdlIGFzc3VtZSBubyBNTVUgaXMgYXZhaWxhYmxlCisgKiAtIGlmIG5vIG90aGVyIFBJQyBiaXRzIGFyZSBzZXQgaW4gcGFyYW1zLT5oZHItPmVfZmxhZ3MKKyAqICAgLSB3ZSBhc3N1bWUgdGhhdCB0aGUgTE9BRGFibGUgc2VnbWVudHMgaW4gdGhlIGJpbmFyeSBhcmUgaW5kZXBlbmRlbnRseSByZWxvY2F0YWJsZQorICogICAtIHdlIGFzc3VtZSBSL08gZXhlY3V0YWJsZSBzZWdtZW50cyBhcmUgc2hhcmVhYmxlCisgKiAtIGVsc2UKKyAqICAgLSB3ZSBhc3N1bWUgdGhlIGxvYWRhYmxlIHBhcnRzIG9mIHRoZSBpbWFnZSB0byByZXF1aXJlIGZpeGVkIGRpc3BsYWNlbWVudAorICogICAtIHRoZSBpbWFnZSBpcyBub3Qgc2hhcmVhYmxlCisgKi8KK3N0YXRpYyBpbnQgZWxmX2ZkcGljX21hcF9maWxlKHN0cnVjdCBlbGZfZmRwaWNfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJICAgICAgY29uc3QgY2hhciAqd2hhdCkKK3sKKwlzdHJ1Y3QgZWxmMzJfZmRwaWNfbG9hZG1hcCAqbG9hZG1hcDsKKyNpZmRlZiBDT05GSUdfTU1VCisJc3RydWN0IGVsZjMyX2ZkcGljX2xvYWRzZWcgKm1zZWc7CisjZW5kaWYKKwlzdHJ1Y3QgZWxmMzJfZmRwaWNfbG9hZHNlZyAqc2VnOworCXN0cnVjdCBlbGYzMl9waGRyICpwaGRyOworCXVuc2lnbmVkIGxvbmcgbG9hZF9hZGRyLCBzdG9wOworCXVuc2lnbmVkIG5sb2FkcywgdG1wOworCXNpemVfdCBzaXplOworCWludCBsb29wLCByZXQ7CisKKwkvKiBhbGxvY2F0ZSBhIGxvYWQgbWFwIHRhYmxlICovCisJbmxvYWRzID0gMDsKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgcGFyYW1zLT5oZHIuZV9waG51bTsgbG9vcCsrKQorCQlpZiAocGFyYW1zLT5waGRyc1tsb29wXS5wX3R5cGUgPT0gUFRfTE9BRCkKKwkJCW5sb2FkcysrOworCisJaWYgKG5sb2FkcyA9PSAwKQorCQlyZXR1cm4gLUVMSUJCQUQ7CisKKwlzaXplID0gc2l6ZW9mKCpsb2FkbWFwKSArIG5sb2FkcyAqIHNpemVvZigqc2VnKTsKKwlsb2FkbWFwID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxvYWRtYXApCisJCXJldHVybiAtRU5PTUVNOworCisJcGFyYW1zLT5sb2FkbWFwID0gbG9hZG1hcDsKKwltZW1zZXQobG9hZG1hcCwgMCwgc2l6ZSk7CisKKwlsb2FkbWFwLT52ZXJzaW9uID0gRUxGMzJfRkRQSUNfTE9BRE1BUF9WRVJTSU9OOworCWxvYWRtYXAtPm5zZWdzID0gbmxvYWRzOworCisJbG9hZF9hZGRyID0gcGFyYW1zLT5sb2FkX2FkZHI7CisJc2VnID0gbG9hZG1hcC0+c2VnczsKKworCS8qIG1hcCB0aGUgcmVxdWVzdGVkIExPQURzIGludG8gdGhlIG1lbW9yeSBzcGFjZSAqLworCXN3aXRjaCAocGFyYW1zLT5mbGFncyAmIEVMRl9GRFBJQ19GTEFHX0FSUkFOR0VNRU5UKSB7CisJY2FzZSBFTEZfRkRQSUNfRkxBR19DT05TVERJU1A6CisJY2FzZSBFTEZfRkRQSUNfRkxBR19DT05USUdVT1VTOgorI2lmbmRlZiBDT05GSUdfTU1VCisJCXJldCA9IGVsZl9mZHBpY19tYXBfZmlsZV9jb25zdGRpc3Bfb25fdWNsaW51eChwYXJhbXMsIGZpbGUsIG1tKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXJldCA9IGVsZl9mZHBpY19tYXBfZmlsZV9ieV9kaXJlY3RfbW1hcChwYXJhbXMsIGZpbGUsIG1tKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlicmVhazsKKwl9CisKKwkvKiBtYXAgdGhlIGVudHJ5IHBvaW50ICovCisJaWYgKHBhcmFtcy0+aGRyLmVfZW50cnkpIHsKKwkJc2VnID0gbG9hZG1hcC0+c2VnczsKKwkJZm9yIChsb29wID0gbG9hZG1hcC0+bnNlZ3M7IGxvb3AgPiAwOyBsb29wLS0sIHNlZysrKSB7CisJCQlpZiAocGFyYW1zLT5oZHIuZV9lbnRyeSA+PSBzZWctPnBfdmFkZHIgJiYKKwkJCSAgICBwYXJhbXMtPmhkci5lX2VudHJ5IDwgc2VnLT5wX3ZhZGRyICsgc2VnLT5wX21lbXN6CisJCQkgICAgKSB7CisJCQkJcGFyYW1zLT5lbnRyeV9hZGRyID0KKwkJCQkJKHBhcmFtcy0+aGRyLmVfZW50cnkgLSBzZWctPnBfdmFkZHIpICsgc2VnLT5hZGRyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLyogZGV0ZXJtaW5lIHdoZXJlIHRoZSBwcm9ncmFtIGhlYWRlciB0YWJsZSBoYXMgd291bmQgdXAgaWYgbWFwcGVkICovCisJc3RvcCA9IHBhcmFtcy0+aGRyLmVfcGhvZmYgKyBwYXJhbXMtPmhkci5lX3BobnVtICogc2l6ZW9mIChzdHJ1Y3QgZWxmX3BoZHIpOworCXBoZHIgPSBwYXJhbXMtPnBoZHJzOworCisJZm9yIChsb29wID0gMDsgbG9vcCA8IHBhcmFtcy0+aGRyLmVfcGhudW07IGxvb3ArKywgcGhkcisrKSB7CisJCWlmIChwaGRyLT5wX3R5cGUgIT0gUFRfTE9BRCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwaGRyLT5wX29mZnNldCA+IHBhcmFtcy0+aGRyLmVfcGhvZmYgfHwKKwkJICAgIHBoZHItPnBfb2Zmc2V0ICsgcGhkci0+cF9maWxlc3ogPCBzdG9wKQorCQkJY29udGludWU7CisKKwkJc2VnID0gbG9hZG1hcC0+c2VnczsKKwkJZm9yIChsb29wID0gbG9hZG1hcC0+bnNlZ3M7IGxvb3AgPiAwOyBsb29wLS0sIHNlZysrKSB7CisJCQlpZiAocGhkci0+cF92YWRkciA+PSBzZWctPnBfdmFkZHIgJiYKKwkJCSAgICBwaGRyLT5wX3ZhZGRyICsgcGhkci0+cF9maWxlc3ogPD0gc2VnLT5wX3ZhZGRyICsgc2VnLT5wX21lbXN6CisJCQkgICAgKSB7CisJCQkJcGFyYW1zLT5waF9hZGRyID0gKHBoZHItPnBfdmFkZHIgLSBzZWctPnBfdmFkZHIpICsgc2VnLT5hZGRyICsKKwkJCQkJcGFyYW1zLT5oZHIuZV9waG9mZiAtIHBoZHItPnBfb2Zmc2V0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCS8qIGRldGVybWluZSB3aGVyZSB0aGUgZHluYW1pYyBzZWN0aW9uIGhhcyB3b3VuZCB1cCBpZiB0aGVyZSBpcyBvbmUgKi8KKwlwaGRyID0gcGFyYW1zLT5waGRyczsKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgcGFyYW1zLT5oZHIuZV9waG51bTsgbG9vcCsrLCBwaGRyKyspIHsKKwkJaWYgKHBoZHItPnBfdHlwZSAhPSBQVF9EWU5BTUlDKQorCQkJY29udGludWU7CisKKwkJc2VnID0gbG9hZG1hcC0+c2VnczsKKwkJZm9yIChsb29wID0gbG9hZG1hcC0+bnNlZ3M7IGxvb3AgPiAwOyBsb29wLS0sIHNlZysrKSB7CisJCQlpZiAocGhkci0+cF92YWRkciA+PSBzZWctPnBfdmFkZHIgJiYKKwkJCSAgICBwaGRyLT5wX3ZhZGRyICsgcGhkci0+cF9tZW1zeiA8PSBzZWctPnBfdmFkZHIgKyBzZWctPnBfbWVtc3oKKwkJCSAgICApIHsKKwkJCQlwYXJhbXMtPmR5bmFtaWNfYWRkciA9IChwaGRyLT5wX3ZhZGRyIC0gc2VnLT5wX3ZhZGRyKSArIHNlZy0+YWRkcjsKKworCQkJCS8qIGNoZWNrIHRoZSBkeW5hbWljIHNlY3Rpb24gY29udGFpbnMgYXQgbGVhc3Qgb25lIGl0ZW0sIGFuZCB0aGF0CisJCQkJICogdGhlIGxhc3QgaXRlbSBpcyBhIE5VTEwgZW50cnkgKi8KKwkJCQlpZiAocGhkci0+cF9tZW1zeiA9PSAwIHx8CisJCQkJICAgIHBoZHItPnBfbWVtc3ogJSBzaXplb2YoRWxmMzJfRHluKSAhPSAwKQorCQkJCQlnb3RvIGR5bmFtaWNfZXJyb3I7CisKKwkJCQl0bXAgPSBwaGRyLT5wX21lbXN6IC8gc2l6ZW9mKEVsZjMyX0R5bik7CisJCQkJaWYgKCgoRWxmMzJfRHluICopIHBhcmFtcy0+ZHluYW1pY19hZGRyKVt0bXAgLSAxXS5kX3RhZyAhPSAwKQorCQkJCQlnb3RvIGR5bmFtaWNfZXJyb3I7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCisJLyogbm93IGVsaWRlIGFkamFjZW50IHNlZ21lbnRzIGluIHRoZSBsb2FkIG1hcCBvbiBNTVUgbGludXgKKwkgKiAtIG9uIHVDbGludXggdGhlIGhvbGVzIGJldHdlZW4gbWF5IGFjdHVhbGx5IGJlIGZpbGxlZCB3aXRoIHN5c3RlbSBzdHVmZiBvciBzdHVmZiBmcm9tCisJICogICBvdGhlciBwcm9jZXNzZXMKKwkgKi8KKyNpZmRlZiBDT05GSUdfTU1VCisJbmxvYWRzID0gbG9hZG1hcC0+bnNlZ3M7CisJbXNlZyA9IGxvYWRtYXAtPnNlZ3M7CisJc2VnID0gbXNlZyArIDE7CisJZm9yIChsb29wID0gMTsgbG9vcCA8IG5sb2FkczsgbG9vcCsrKSB7CisJCS8qIHNlZSBpZiB3ZSBoYXZlIGEgY2FuZGlkYXRlIGZvciBtZXJnaW5nICovCisJCWlmIChzZWctPnBfdmFkZHIgLSBtc2VnLT5wX3ZhZGRyID09IHNlZy0+YWRkciAtIG1zZWctPmFkZHIpIHsKKwkJCWxvYWRfYWRkciA9IFBBR0VfQUxJR04obXNlZy0+YWRkciArIG1zZWctPnBfbWVtc3opOworCQkJaWYgKGxvYWRfYWRkciA9PSAoc2VnLT5hZGRyICYgUEFHRV9NQVNLKSkgeworCQkJCW1zZWctPnBfbWVtc3ogKz0gbG9hZF9hZGRyIC0gKG1zZWctPmFkZHIgKyBtc2VnLT5wX21lbXN6KTsKKwkJCQltc2VnLT5wX21lbXN6ICs9IHNlZy0+YWRkciAmIH5QQUdFX01BU0s7CisJCQkJbXNlZy0+cF9tZW1zeiArPSBzZWctPnBfbWVtc3o7CisJCQkJbG9hZG1hcC0+bnNlZ3MtLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCW1zZWcrKzsKKwkJaWYgKG1zZWcgIT0gc2VnKQorCQkJKm1zZWcgPSAqc2VnOworCX0KKyNlbmRpZgorCisJa2RlYnVnKCJNYXBwZWQgT2JqZWN0IFslc106Iiwgd2hhdCk7CisJa2RlYnVnKCItIGVsZmhkciAgIDogJWx4IiwgcGFyYW1zLT5lbGZoZHJfYWRkcik7CisJa2RlYnVnKCItIGVudHJ5ICAgIDogJWx4IiwgcGFyYW1zLT5lbnRyeV9hZGRyKTsKKwlrZGVidWcoIi0gUEhEUltdICAgOiAlbHgiLCBwYXJhbXMtPnBoX2FkZHIpOworCWtkZWJ1ZygiLSBEWU5BTUlDW106ICVseCIsIHBhcmFtcy0+ZHluYW1pY19hZGRyKTsKKwlzZWcgPSBsb2FkbWFwLT5zZWdzOworCWZvciAobG9vcCA9IDA7IGxvb3AgPCBsb2FkbWFwLT5uc2VnczsgbG9vcCsrLCBzZWcrKykKKwkJa2RlYnVnKCItIExPQURbJWRdIDogJTA4eC0lMDh4IFt2YT0leCBtcz0leF0iLAorCQkgICAgICAgbG9vcCwKKwkJICAgICAgIHNlZy0+YWRkciwgc2VnLT5hZGRyICsgc2VnLT5wX21lbXN6IC0gMSwKKwkJICAgICAgIHNlZy0+cF92YWRkciwgc2VnLT5wX21lbXN6KTsKKworCXJldHVybiAwOworCisgZHluYW1pY19lcnJvcjoKKwlwcmludGsoIkVMRiBGRFBJQyAlcyB3aXRoIGludmFsaWQgRFlOQU1JQyBzZWN0aW9uIChpbm9kZT0lbHUpXG4iLAorCSAgICAgICB3aGF0LCBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8pOworCXJldHVybiAtRUxJQkJBRDsKK30gLyogZW5kIGVsZl9mZHBpY19tYXBfZmlsZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBtYXAgYSBmaWxlIHdpdGggY29uc3RhbnQgZGlzcGxhY2VtZW50IHVuZGVyIHVDbGludXgKKyAqLworI2lmbmRlZiBDT05GSUdfTU1VCitzdGF0aWMgaW50IGVsZl9mZHBpY19tYXBfZmlsZV9jb25zdGRpc3Bfb25fdWNsaW51eChzdHJ1Y3QgZWxmX2ZkcGljX3BhcmFtcyAqcGFyYW1zLAorCQkJCQkJICAgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCQkgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlzdHJ1Y3QgZWxmMzJfZmRwaWNfbG9hZHNlZyAqc2VnOworCXN0cnVjdCBlbGYzMl9waGRyICpwaGRyOworCXVuc2lnbmVkIGxvbmcgbG9hZF9hZGRyLCBiYXNlID0gVUxPTkdfTUFYLCB0b3AgPSAwLCBtYWRkciA9IDAsIG1mbGFnczsKKwlsb2ZmX3QgZnBvczsKKwlpbnQgbG9vcCwgcmV0OworCisJbG9hZF9hZGRyID0gcGFyYW1zLT5sb2FkX2FkZHI7CisJc2VnID0gcGFyYW1zLT5sb2FkbWFwLT5zZWdzOworCisJLyogZGV0ZXJtaW5lIHRoZSBib3VuZHMgb2YgdGhlIGNvbnRpZ3VvdXMgb3ZlcmFsbCBhbGxvY2F0aW9uIHdlIG11c3QgbWFrZSAqLworCXBoZHIgPSBwYXJhbXMtPnBoZHJzOworCWZvciAobG9vcCA9IDA7IGxvb3AgPCBwYXJhbXMtPmhkci5lX3BobnVtOyBsb29wKyssIHBoZHIrKykgeworCQlpZiAocGFyYW1zLT5waGRyc1tsb29wXS5wX3R5cGUgIT0gUFRfTE9BRCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChiYXNlID4gcGhkci0+cF92YWRkcikKKwkJCWJhc2UgPSBwaGRyLT5wX3ZhZGRyOworCQlpZiAodG9wIDwgcGhkci0+cF92YWRkciArIHBoZHItPnBfbWVtc3opCisJCQl0b3AgPSBwaGRyLT5wX3ZhZGRyICsgcGhkci0+cF9tZW1zejsKKwl9CisKKwkvKiBhbGxvY2F0ZSBvbmUgYmlnIGFub24gYmxvY2sgZm9yIGV2ZXJ5dGhpbmcgKi8KKwltZmxhZ3MgPSBNQVBfUFJJVkFURTsKKwlpZiAocGFyYW1zLT5mbGFncyAmIEVMRl9GRFBJQ19GTEFHX0VYRUNVVEFCTEUpCisJCW1mbGFncyB8PSBNQVBfRVhFQ1VUQUJMRTsKKworCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJbWFkZHIgPSBkb19tbWFwKE5VTEwsIGxvYWRfYWRkciwgdG9wIC0gYmFzZSwKKwkJCVBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMsIG1mbGFncywgMCk7CisJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJaWYgKElTX0VSUigodm9pZCAqKSBtYWRkcikpCisJCXJldHVybiAoaW50KSBtYWRkcjsKKworCWlmIChsb2FkX2FkZHIgIT0gMCkKKwkJbG9hZF9hZGRyICs9IFBBR0VfQUxJR04odG9wIC0gYmFzZSk7CisKKwkvKiBhbmQgdGhlbiBsb2FkIHRoZSBmaWxlIHNlZ21lbnRzIGludG8gaXQgKi8KKwlwaGRyID0gcGFyYW1zLT5waGRyczsKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgcGFyYW1zLT5oZHIuZV9waG51bTsgbG9vcCsrLCBwaGRyKyspIHsKKwkJaWYgKHBhcmFtcy0+cGhkcnNbbG9vcF0ucF90eXBlICE9IFBUX0xPQUQpCisJCQljb250aW51ZTsKKworCQlmcG9zID0gcGhkci0+cF9vZmZzZXQ7CisKKwkJc2VnLT5hZGRyID0gbWFkZHIgKyAocGhkci0+cF92YWRkciAtIGJhc2UpOworCQlzZWctPnBfdmFkZHIgPSBwaGRyLT5wX3ZhZGRyOworCQlzZWctPnBfbWVtc3ogPSBwaGRyLT5wX21lbXN6OworCisJCXJldCA9IGZpbGUtPmZfb3AtPnJlYWQoZmlsZSwgKHZvaWQgKikgc2VnLT5hZGRyLCBwaGRyLT5wX2ZpbGVzeiwgJmZwb3MpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJLyogbWFwIHRoZSBFTEYgaGVhZGVyIGFkZHJlc3MgaWYgaW4gdGhpcyBzZWdtZW50ICovCisJCWlmIChwaGRyLT5wX29mZnNldCA9PSAwKQorCQkJcGFyYW1zLT5lbGZoZHJfYWRkciA9IHNlZy0+YWRkcjsKKworCQkvKiBjbGVhciBhbnkgc3BhY2UgYWxsb2NhdGVkIGJ1dCBub3QgbG9hZGVkICovCisJCWlmIChwaGRyLT5wX2ZpbGVzeiA8IHBoZHItPnBfbWVtc3opCisJCQljbGVhcl91c2VyKCh2b2lkICopIChzZWctPmFkZHIgKyBwaGRyLT5wX2ZpbGVzeiksCisJCQkJICAgcGhkci0+cF9tZW1zeiAtIHBoZHItPnBfZmlsZXN6KTsKKworCQlpZiAobW0pIHsKKwkJCWlmIChwaGRyLT5wX2ZsYWdzICYgUEZfWCkgeworCQkJCW1tLT5zdGFydF9jb2RlID0gc2VnLT5hZGRyOworCQkJCW1tLT5lbmRfY29kZSA9IHNlZy0+YWRkciArIHBoZHItPnBfbWVtc3o7CisJCQl9CisJCQllbHNlIGlmICghbW0tPnN0YXJ0X2RhdGEpIHsKKwkJCQltbS0+c3RhcnRfZGF0YSA9IHNlZy0+YWRkcjsKKyNpZm5kZWYgQ09ORklHX01NVQorCQkJCW1tLT5lbmRfZGF0YSA9IHNlZy0+YWRkciArIHBoZHItPnBfbWVtc3o7CisjZW5kaWYKKwkJCX0KKworI2lmZGVmIENPTkZJR19NTVUKKwkJCWlmIChzZWctPmFkZHIgKyBwaGRyLT5wX21lbXN6ID4gbW0tPmVuZF9kYXRhKQorCQkJCW1tLT5lbmRfZGF0YSA9IHNlZy0+YWRkciArIHBoZHItPnBfbWVtc3o7CisjZW5kaWYKKwkJfQorCisJCXNlZysrOworCX0KKworCXJldHVybiAwOworfSAvKiBlbmQgZWxmX2ZkcGljX21hcF9maWxlX2NvbnN0ZGlzcF9vbl91Y2xpbnV4KCkgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbWFwIGEgYmluYXJ5IGJ5IGRpcmVjdCBtbWFwKCkgb2YgdGhlIGluZGl2aWR1YWwgUFRfTE9BRCBzZWdtZW50cworICovCitzdGF0aWMgaW50IGVsZl9mZHBpY19tYXBfZmlsZV9ieV9kaXJlY3RfbW1hcChzdHJ1Y3QgZWxmX2ZkcGljX3BhcmFtcyAqcGFyYW1zLAorCQkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXN0cnVjdCBlbGYzMl9mZHBpY19sb2Fkc2VnICpzZWc7CisJc3RydWN0IGVsZjMyX3BoZHIgKnBoZHI7CisJdW5zaWduZWQgbG9uZyBsb2FkX2FkZHIsIGRlbHRhX3ZhZGRyOworCWludCBsb29wLCBkdnNldDsKKworCWxvYWRfYWRkciA9IHBhcmFtcy0+bG9hZF9hZGRyOworCWRlbHRhX3ZhZGRyID0gMDsKKwlkdnNldCA9IDA7CisKKwlzZWcgPSBwYXJhbXMtPmxvYWRtYXAtPnNlZ3M7CisKKwkvKiBkZWFsIHdpdGggZWFjaCBsb2FkIHNlZ21lbnQgc2VwYXJhdGVseSAqLworCXBoZHIgPSBwYXJhbXMtPnBoZHJzOworCWZvciAobG9vcCA9IDA7IGxvb3AgPCBwYXJhbXMtPmhkci5lX3BobnVtOyBsb29wKyssIHBoZHIrKykgeworCQl1bnNpZ25lZCBsb25nIG1hZGRyLCBkaXNwLCBleGNlc3MsIGV4Y2VzczE7CisJCWludCBwcm90ID0gMCwgZmxhZ3M7CisKKwkJaWYgKHBoZHItPnBfdHlwZSAhPSBQVF9MT0FEKQorCQkJY29udGludWU7CisKKwkJa2RlYnVnKCJbTE9BRF0gdmE9JWx4IG9mPSVseCBmcz0lbHggbXM9JWx4IiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBwaGRyLT5wX3ZhZGRyLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHBoZHItPnBfb2Zmc2V0LAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHBoZHItPnBfZmlsZXN6LAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHBoZHItPnBfbWVtc3opOworCisJCS8qIGRldGVybWluZSB0aGUgbWFwcGluZyBwYXJhbWV0ZXJzICovCisJCWlmIChwaGRyLT5wX2ZsYWdzICYgUEZfUikgcHJvdCB8PSBQUk9UX1JFQUQ7CisJCWlmIChwaGRyLT5wX2ZsYWdzICYgUEZfVykgcHJvdCB8PSBQUk9UX1dSSVRFOworCQlpZiAocGhkci0+cF9mbGFncyAmIFBGX1gpIHByb3QgfD0gUFJPVF9FWEVDOworCisJCWZsYWdzID0gTUFQX1BSSVZBVEUgfCBNQVBfREVOWVdSSVRFOworCQlpZiAocGFyYW1zLT5mbGFncyAmIEVMRl9GRFBJQ19GTEFHX0VYRUNVVEFCTEUpCisJCQlmbGFncyB8PSBNQVBfRVhFQ1VUQUJMRTsKKworCQltYWRkciA9IDA7CisKKwkJc3dpdGNoIChwYXJhbXMtPmZsYWdzICYgRUxGX0ZEUElDX0ZMQUdfQVJSQU5HRU1FTlQpIHsKKwkJY2FzZSBFTEZfRkRQSUNfRkxBR19JTkRFUEVOREVOVDoKKwkJCS8qIFBUX0xPQURzIGFyZSBpbmRlcGVuZGVudGx5IGxvY2F0YWJsZSAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBFTEZfRkRQSUNfRkxBR19IT05PVVJWQUREUjoKKwkJCS8qIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIG11c3QgYmUgaG9ub3VyZWQgKi8KKwkJCW1hZGRyID0gcGhkci0+cF92YWRkcjsKKwkJCWZsYWdzIHw9IE1BUF9GSVhFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgRUxGX0ZEUElDX0ZMQUdfQ09OU1RESVNQOgorCQkJLyogY29uc3RhbnQgZGlzcGxhY2VtZW50CisJCQkgKiAtIGNhbiBiZSBtYXBwZWQgYW55d2hlcmUsIGJ1dCBtdXN0IGJlIG1hcHBlZCBhcyBhIHVuaXQKKwkJCSAqLworCQkJaWYgKCFkdnNldCkgeworCQkJCW1hZGRyID0gbG9hZF9hZGRyOworCQkJCWRlbHRhX3ZhZGRyID0gcGhkci0+cF92YWRkcjsKKwkJCQlkdnNldCA9IDE7CisJCQl9CisJCQllbHNlIHsKKwkJCQltYWRkciA9IGxvYWRfYWRkciArIHBoZHItPnBfdmFkZHIgLSBkZWx0YV92YWRkcjsKKwkJCQlmbGFncyB8PSBNQVBfRklYRUQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEVMRl9GRFBJQ19GTEFHX0NPTlRJR1VPVVM6CisJCQkvKiBjb250aWd1aXR5IGhhbmRsZWQgbGF0ZXIgKi8KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJfQorCisJCW1hZGRyICY9IFBBR0VfTUFTSzsKKworCQkvKiBjcmVhdGUgdGhlIG1hcHBpbmcgKi8KKwkJZGlzcCA9IHBoZHItPnBfdmFkZHIgJiB+UEFHRV9NQVNLOworCQlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCQltYWRkciA9IGRvX21tYXAoZmlsZSwgbWFkZHIsIHBoZHItPnBfbWVtc3ogKyBkaXNwLCBwcm90LCBmbGFncywKKwkJCQlwaGRyLT5wX29mZnNldCAtIGRpc3ApOworCQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKworCQlrZGVidWcoIm1tYXBbJWRdIDxmaWxlPiBzej0lbHggcHI9JXggZmw9JXggb2Y9JWx4IC0tPiAlMDhseCIsCisJCSAgICAgICBsb29wLCBwaGRyLT5wX21lbXN6ICsgZGlzcCwgcHJvdCwgZmxhZ3MsIHBoZHItPnBfb2Zmc2V0IC0gZGlzcCwKKwkJICAgICAgIG1hZGRyKTsKKworCQlpZiAoSVNfRVJSKCh2b2lkICopIG1hZGRyKSkKKwkJCXJldHVybiAoaW50KSBtYWRkcjsKKworCQlpZiAoKHBhcmFtcy0+ZmxhZ3MgJiBFTEZfRkRQSUNfRkxBR19BUlJBTkdFTUVOVCkgPT0gRUxGX0ZEUElDX0ZMQUdfQ09OVElHVU9VUykKKwkJCWxvYWRfYWRkciArPSBQQUdFX0FMSUdOKHBoZHItPnBfbWVtc3ogKyBkaXNwKTsKKworCQlzZWctPmFkZHIgPSBtYWRkciArIGRpc3A7CisJCXNlZy0+cF92YWRkciA9IHBoZHItPnBfdmFkZHI7CisJCXNlZy0+cF9tZW1zeiA9IHBoZHItPnBfbWVtc3o7CisKKwkJLyogbWFwIHRoZSBFTEYgaGVhZGVyIGFkZHJlc3MgaWYgaW4gdGhpcyBzZWdtZW50ICovCisJCWlmIChwaGRyLT5wX29mZnNldCA9PSAwKQorCQkJcGFyYW1zLT5lbGZoZHJfYWRkciA9IHNlZy0+YWRkcjsKKworCQkvKiBjbGVhciB0aGUgYml0IGJldHdlZW4gYmVnaW5uaW5nIG9mIG1hcHBpbmcgYW5kIGJlZ2lubmluZyBvZiBQVF9MT0FEICovCisJCWlmIChwcm90ICYgUFJPVF9XUklURSAmJiBkaXNwID4gMCkgeworCQkJa2RlYnVnKCJjbGVhclslZF0gYWQ9JWx4IHN6PSVseCIsIGxvb3AsIG1hZGRyLCBkaXNwKTsKKwkJCWNsZWFyX3VzZXIoKHZvaWQgKikgbWFkZHIsIGRpc3ApOworCQkJbWFkZHIgKz0gZGlzcDsKKwkJfQorCisJCS8qIGNsZWFyIGFueSBzcGFjZSBhbGxvY2F0ZWQgYnV0IG5vdCBsb2FkZWQKKwkJICogLSBvbiB1Q2xpbnV4IHdlIGNhbiBqdXN0IGNsZWFyIHRoZSBsb3QKKwkJICogLSBvbiBNTVUgbGludXggd2UnbGwgZ2V0IGEgU0lHQlVTIGJleW9uZCB0aGUgbGFzdCBwYWdlCisJCSAqICAgZXh0YW50IGluIHRoZSBmaWxlCisJCSAqLworCQlleGNlc3MgPSBwaGRyLT5wX21lbXN6IC0gcGhkci0+cF9maWxlc3o7CisJCWV4Y2VzczEgPSBQQUdFX1NJWkUgLSAoKG1hZGRyICsgcGhkci0+cF9maWxlc3opICYgflBBR0VfTUFTSyk7CisKKyNpZmRlZiBDT05GSUdfTU1VCisKKwkJaWYgKGV4Y2VzcyA+IGV4Y2VzczEpIHsKKwkJCXVuc2lnbmVkIGxvbmcgeGFkZHIgPSBtYWRkciArIHBoZHItPnBfZmlsZXN6ICsgZXhjZXNzMTsKKwkJCXVuc2lnbmVkIGxvbmcgeG1hZGRyOworCisJCQlmbGFncyB8PSBNQVBfRklYRUQgfCBNQVBfQU5PTllNT1VTOworCQkJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwkJCXhtYWRkciA9IGRvX21tYXAoTlVMTCwgeGFkZHIsIGV4Y2VzcyAtIGV4Y2VzczEsIHByb3QsIGZsYWdzLCAwKTsKKwkJCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCisJCQlrZGVidWcoIm1tYXBbJWRdIDxhbm9uPiIKKwkJCSAgICAgICAiIGFkPSVseCBzej0lbHggcHI9JXggZmw9JXggb2Y9MCAtLT4gJTA4bHgiLAorCQkJICAgICAgIGxvb3AsIHhhZGRyLCBleGNlc3MgLSBleGNlc3MxLCBwcm90LCBmbGFncywgeG1hZGRyKTsKKworCQkJaWYgKHhtYWRkciAhPSB4YWRkcikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWlmIChwcm90ICYgUFJPVF9XUklURSAmJiBleGNlc3MxID4gMCkgeworCQkJa2RlYnVnKCJjbGVhclslZF0gYWQ9JWx4IHN6PSVseCIsCisJCQkgICAgICAgbG9vcCwgbWFkZHIgKyBwaGRyLT5wX2ZpbGVzeiwgZXhjZXNzMSk7CisJCQljbGVhcl91c2VyKCh2b2lkICopIG1hZGRyICsgcGhkci0+cF9maWxlc3osIGV4Y2VzczEpOworCQl9CisKKyNlbHNlCisJCWlmIChleGNlc3MgPiAwKSB7CisJCQlrZGVidWcoImNsZWFyWyVkXSBhZD0lbHggc3o9JWx4IiwKKwkJCSAgICAgICBsb29wLCBtYWRkciArIHBoZHItPnBfZmlsZXN6LCBleGNlc3MpOworCQkJY2xlYXJfdXNlcigodm9pZCAqKSBtYWRkciArIHBoZHItPnBfZmlsZXN6LCBleGNlc3MpOworCQl9CisjZW5kaWYKKworCQlpZiAobW0pIHsKKwkJCWlmIChwaGRyLT5wX2ZsYWdzICYgUEZfWCkgeworCQkJCW1tLT5zdGFydF9jb2RlID0gbWFkZHI7CisJCQkJbW0tPmVuZF9jb2RlID0gbWFkZHIgKyBwaGRyLT5wX21lbXN6OworCQkJfQorCQkJZWxzZSBpZiAoIW1tLT5zdGFydF9kYXRhKSB7CisJCQkJbW0tPnN0YXJ0X2RhdGEgPSBtYWRkcjsKKwkJCQltbS0+ZW5kX2RhdGEgPSBtYWRkciArIHBoZHItPnBfbWVtc3o7CisJCQl9CisJCX0KKworCQlzZWcrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30gLyogZW5kIGVsZl9mZHBpY19tYXBfZmlsZV9ieV9kaXJlY3RfbW1hcCgpICovCmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZW04Ni5jIGIvZnMvYmluZm10X2VtODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjJkMWFkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYmluZm10X2VtODYuYwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqICBsaW51eC9mcy9iaW5mbXRfZW04Ni5jCisgKgorICogIEJhc2VkIG9uIGxpbnV4L2ZzL2JpbmZtdF9zY3JpcHQuYworICogIENvcHlyaWdodCAoQykgMTk5NiAgTWFydGluIHZvbiBM9ndpcworICogIG9yaWdpbmFsICMhLWNoZWNraW5nIGltcGxlbWVudGVkIGJ5IHR5dHNvLgorICoKKyAqICBlbTg2IGNoYW5nZXMgQ29weXJpZ2h0IChDKSAxOTk3ICBKaW0gUGFyYWRpcworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisKKyNkZWZpbmUgRU04Nl9JTlRFUlAJIi91c3IvYmluL2VtODYiCisjZGVmaW5lIEVNODZfSV9OQU1FCSJlbTg2IgorCitzdGF0aWMgaW50IGxvYWRfZW04NihzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWNoYXIgKmludGVycCwgKmlfbmFtZSwgKmlfYXJnOworCXN0cnVjdCBmaWxlICogZmlsZTsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBlbGZoZHIJZWxmX2V4OworCisJLyogTWFrZSBzdXJlIHRoaXMgaXMgYSBMaW51eC9JbnRlbCBFTEYgZXhlY3V0YWJsZS4uLiAqLworCWVsZl9leCA9ICooKHN0cnVjdCBlbGZoZHIgKilicHJtLT5idWYpOworCisJaWYgKG1lbWNtcChlbGZfZXguZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKSAhPSAwKQorCQlyZXR1cm4gIC1FTk9FWEVDOworCisJLyogRmlyc3Qgb2YgYWxsLCBzb21lIHNpbXBsZSBjb25zaXN0ZW5jeSBjaGVja3MgKi8KKwlpZiAoKGVsZl9leC5lX3R5cGUgIT0gRVRfRVhFQyAmJiBlbGZfZXguZV90eXBlICE9IEVUX0RZTikgfHwKKwkJKCEoKGVsZl9leC5lX21hY2hpbmUgPT0gRU1fMzg2KSB8fCAoZWxmX2V4LmVfbWFjaGluZSA9PSBFTV80ODYpKSkgfHwKKwkJKCFicHJtLT5maWxlLT5mX29wIHx8ICFicHJtLT5maWxlLT5mX29wLT5tbWFwKSkgeworCQkJcmV0dXJuIC1FTk9FWEVDOworCX0KKworCWJwcm0tPnNoX2JhbmcrKzsJLyogV2VsbCwgdGhlIGJhbmctc2hlbGwgaXMgaW1wbGljaXQuLi4gKi8KKwlhbGxvd193cml0ZV9hY2Nlc3MoYnBybS0+ZmlsZSk7CisJZnB1dChicHJtLT5maWxlKTsKKwlicHJtLT5maWxlID0gTlVMTDsKKworCS8qIFVubGlrZSBpbiB0aGUgc2NyaXB0IGNhc2UsIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55IGhhaXJ5CisJICogcGFyc2luZyB0byBmaW5kIG91ciBpbnRlcnByZXRlci4uLiBpdCdzIGhhcmRjb2RlZCEKKwkgKi8KKwlpbnRlcnAgPSBFTTg2X0lOVEVSUDsKKwlpX25hbWUgPSBFTTg2X0lfTkFNRTsKKwlpX2FyZyA9IE5VTEw7CQkvKiBXZSByZXNlcnZlIHRoZSByaWdodCB0byBhZGQgYW4gYXJnIGxhdGVyICovCisKKwkvKgorCSAqIFNwbGljZSBpbiAoMSkgdGhlIGludGVycHJldGVyJ3MgbmFtZSBmb3IgYXJndlswXQorCSAqICAgICAgICAgICAoMikgKG9wdGlvbmFsKSBhcmd1bWVudCB0byBpbnRlcnByZXRlcgorCSAqICAgICAgICAgICAoMykgZmlsZW5hbWUgb2YgZW11bGF0ZWQgZmlsZSAocmVwbGFjZSBhcmd2WzBdKQorCSAqCisJICogVGhpcyBpcyBkb25lIGluIHJldmVyc2Ugb3JkZXIsIGJlY2F1c2Ugb2YgaG93IHRoZQorCSAqIHVzZXIgZW52aXJvbm1lbnQgYW5kIGFyZ3VtZW50cyBhcmUgc3RvcmVkLgorCSAqLworCXJlbW92ZV9hcmdfemVybyhicHJtKTsKKwlyZXR2YWwgPSBjb3B5X3N0cmluZ3Nfa2VybmVsKDEsICZicHJtLT5maWxlbmFtZSwgYnBybSk7CisJaWYgKHJldHZhbCA8IDApIHJldHVybiByZXR2YWw7IAorCWJwcm0tPmFyZ2MrKzsKKwlpZiAoaV9hcmcpIHsKKwkJcmV0dmFsID0gY29weV9zdHJpbmdzX2tlcm5lbCgxLCAmaV9hcmcsIGJwcm0pOworCQlpZiAocmV0dmFsIDwgMCkgcmV0dXJuIHJldHZhbDsgCisJCWJwcm0tPmFyZ2MrKzsKKwl9CisJcmV0dmFsID0gY29weV9zdHJpbmdzX2tlcm5lbCgxLCAmaV9uYW1lLCBicHJtKTsKKwlpZiAocmV0dmFsIDwgMCkJcmV0dXJuIHJldHZhbDsKKwlicHJtLT5hcmdjKys7CisKKwkvKgorCSAqIE9LLCBub3cgcmVzdGFydCB0aGUgcHJvY2VzcyB3aXRoIHRoZSBpbnRlcnByZXRlcidzIGlub2RlLgorCSAqIE5vdGUgdGhhdCB3ZSB1c2Ugb3Blbl9leGVjKCkgYXMgdGhlIG5hbWUgaXMgbm93IGluIGtlcm5lbAorCSAqIHNwYWNlLCBhbmQgd2UgZG9uJ3QgbmVlZCB0byBjb3B5IGl0LgorCSAqLworCWZpbGUgPSBvcGVuX2V4ZWMoaW50ZXJwKTsKKwlpZiAoSVNfRVJSKGZpbGUpKQorCQlyZXR1cm4gUFRSX0VSUihmaWxlKTsKKworCWJwcm0tPmZpbGUgPSBmaWxlOworCisJcmV0dmFsID0gcHJlcGFyZV9iaW5wcm0oYnBybSk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gc2VhcmNoX2JpbmFyeV9oYW5kbGVyKGJwcm0sIHJlZ3MpOworfQorCitzdGF0aWMgc3RydWN0IGxpbnV4X2JpbmZtdCBlbTg2X2Zvcm1hdCA9IHsKKwkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAorCS5sb2FkX2JpbmFyeQk9IGxvYWRfZW04NiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZW04Nl9iaW5mbXQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfYmluZm10KCZlbTg2X2Zvcm1hdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2VtODZfYmluZm10KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9iaW5mbXQoJmVtODZfZm9ybWF0KTsKK30KKworY29yZV9pbml0Y2FsbChpbml0X2VtODZfYmluZm10KTsKK21vZHVsZV9leGl0KGV4aXRfZW04Nl9iaW5mbXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X2ZsYXQuYyBiL2ZzL2JpbmZtdF9mbGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjZDY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JpbmZtdF9mbGF0LmMKQEAgLTAsMCArMSw5MDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqICBsaW51eC9mcy9iaW5mbXRfZmxhdC5jCisgKgorICoJQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRtQHNuYXBnZWFyLmNvbT4KKyAqCUNvcHlyaWdodCAoQykgMjAwMiBHcmVnIFVuZ2VyZXIgPGdlcmdAc25hcGdlYXIuY29tPgorICoJQ29weXJpZ2h0IChDKSAyMDAyIFNuYXBHZWFyLCBieSBQYXVsIERhbGUgPHBhdWxpQHNuYXBnZWFyLmNvbT4KKyAqCUNvcHlyaWdodCAoQykgMjAwMCwgMjAwMSBMaW5lbywgYnkgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRtQGxpbmVvLmNvbT4KKyAqICBiYXNlZCBoZWF2aWx5IG9uOgorICoKKyAqICBsaW51eC9mcy9iaW5mbXRfYW91dC5jOgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTYgIExpbnVzIFRvcnZhbGRzCisgKiAgbGludXgvZnMvYmluZm10X2ZsYXQuYyBmb3IgMi4wIGtlcm5lbAorICoJICAgIENvcHlyaWdodCAoQykgMTk5OCAgS2VubmV0aCBBbGJhbm93c2tpIDxramFoZHNAa2phaGRzLmNvbT4KKyAqCUpBTi85OSAtLSBjb2RlZCBmdWxsIHByb2dyYW0gcmVsb2NhdGlvbiAoZ2VyZ0BzbmFwZ2Vhci5jb20pCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvYS5vdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZsYXQuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAwCisjZGVmaW5lIERFQlVHIDEKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUJREJHX0ZMVChhLi4uKQlwcmludGsoYSkKKyNlbHNlCisjZGVmaW5lCURCR19GTFQoYS4uLikKKyNlbmRpZgorCisjZGVmaW5lIFJFTE9DX0ZBSUxFRCAweGZmMDBmZjAxCQkvKiBSZWxvY2F0aW9uIGluY29ycmVjdCBzb21ld2hlcmUgKi8KKyNkZWZpbmUgVU5MT0FERURfTElCIDB4N2ZmMDAwZmYJCS8qIFBsYWNlaG9sZGVyIGZvciB1bnVzZWQgbGlicmFyeSAqLworCitzdHJ1Y3QgbGliX2luZm8geworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnRfY29kZTsJCS8qIFN0YXJ0IG9mIHRleHQgc2VnbWVudCAqLworCQl1bnNpZ25lZCBsb25nIHN0YXJ0X2RhdGE7CQkvKiBTdGFydCBvZiBkYXRhIHNlZ21lbnQgKi8KKwkJdW5zaWduZWQgbG9uZyBzdGFydF9icms7CQkvKiBFbmQgb2YgZGF0YSBzZWdtZW50ICovCisJCXVuc2lnbmVkIGxvbmcgdGV4dF9sZW47CQkJLyogTGVuZ3RoIG9mIHRleHQgc2VnbWVudCAqLworCQl1bnNpZ25lZCBsb25nIGVudHJ5OwkJCS8qIFN0YXJ0IGFkZHJlc3MgZm9yIHRoaXMgbW9kdWxlICovCisJCXVuc2lnbmVkIGxvbmcgYnVpbGRfZGF0ZTsJCS8qIFdoZW4gdGhpcyBvbmUgd2FzIGNvbXBpbGVkICovCisJCXNob3J0IGxvYWRlZDsJCQkJLyogSGFzIHRoaXMgbGlicmFyeSBiZWVuIGxvYWRlZD8gKi8KKwl9IGxpYl9saXN0W01BWF9TSEFSRURfTElCU107Cit9OworCisjaWZkZWYgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVAorc3RhdGljIGludCBsb2FkX2ZsYXRfc2hhcmVkX2xpYnJhcnkoaW50IGlkLCBzdHJ1Y3QgbGliX2luZm8gKnApOworI2VuZGlmCisKK3N0YXRpYyBpbnQgbG9hZF9mbGF0X2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICosIHN0cnVjdCBwdF9yZWdzICogcmVncyk7CitzdGF0aWMgaW50IGZsYXRfY29yZV9kdW1wKGxvbmcgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICogcmVncywgc3RydWN0IGZpbGUgKmZpbGUpOworCitleHRlcm4gdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgdXNlciAqKTsKKworc3RhdGljIHN0cnVjdCBsaW51eF9iaW5mbXQgZmxhdF9mb3JtYXQgPSB7CisJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkubG9hZF9iaW5hcnkJPSBsb2FkX2ZsYXRfYmluYXJ5LAorCS5jb3JlX2R1bXAJPSBmbGF0X2NvcmVfZHVtcCwKKwkubWluX2NvcmVkdW1wCT0gUEFHRV9TSVpFCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBSb3V0aW5lIHdyaXRlcyBhIGNvcmUgZHVtcCBpbWFnZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgKiBDdXJyZW50bHkgb25seSBhIHN0dWItZnVuY3Rpb24uCisgKi8KKworc3RhdGljIGludCBmbGF0X2NvcmVfZHVtcChsb25nIHNpZ25yLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXByaW50aygiUHJvY2VzcyAlczolZCByZWNlaXZlZCBzaWduciAlZCBhbmQgc2hvdWxkIGhhdmUgY29yZSBkdW1wZWRcbiIsCisJCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIChpbnQpIHNpZ25yKTsKKwlyZXR1cm4oMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNyZWF0ZV9mbGF0X3RhYmxlcygpIHBhcnNlcyB0aGUgZW52LSBhbmQgYXJnLXN0cmluZ3MgaW4gbmV3IHVzZXIKKyAqIG1lbW9yeSBhbmQgY3JlYXRlcyB0aGUgcG9pbnRlciB0YWJsZXMgZnJvbSB0aGVtLCBhbmQgcHV0cyB0aGVpcgorICogYWRkcmVzc2VzIG9uIHRoZSAic3RhY2siLCByZXR1cm5pbmcgdGhlIG5ldyBzdGFjayBwb2ludGVyIHZhbHVlLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNyZWF0ZV9mbGF0X3RhYmxlcygKKwl1bnNpZ25lZCBsb25nIHBwLAorCXN0cnVjdCBsaW51eF9iaW5wcm0gKiBicHJtKQoreworCXVuc2lnbmVkIGxvbmcgKmFyZ3YsKmVudnA7CisJdW5zaWduZWQgbG9uZyAqIHNwOworCWNoYXIgKiBwID0gKGNoYXIqKXBwOworCWludCBhcmdjID0gYnBybS0+YXJnYzsKKwlpbnQgZW52YyA9IGJwcm0tPmVudmM7CisJY2hhciBkdW1teTsKKworCXNwID0gKHVuc2lnbmVkIGxvbmcgKikgKCgtKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKGNoYXIgKikpJih1bnNpZ25lZCBsb25nKSBwKTsKKworCXNwIC09IGVudmMrMTsKKwllbnZwID0gc3A7CisJc3AgLT0gYXJnYysxOworCWFyZ3YgPSBzcDsKKworCWZsYXRfc3RhY2tfYWxpZ24oc3ApOworCWlmIChmbGF0X2FyZ3ZwX2VudnBfb25fc3RhY2soKSkgeworCQktLXNwOyBwdXRfdXNlcigodW5zaWduZWQgbG9uZykgZW52cCwgc3ApOworCQktLXNwOyBwdXRfdXNlcigodW5zaWduZWQgbG9uZykgYXJndiwgc3ApOworCX0KKworCXB1dF91c2VyKGFyZ2MsLS1zcCk7CisJY3VycmVudC0+bW0tPmFyZ19zdGFydCA9ICh1bnNpZ25lZCBsb25nKSBwOworCXdoaWxlIChhcmdjLS0+MCkgeworCQlwdXRfdXNlcigodW5zaWduZWQgbG9uZykgcCwgYXJndisrKTsKKwkJZG8geworCQkJZ2V0X3VzZXIoZHVtbXksIHApOyBwKys7CisJCX0gd2hpbGUgKGR1bW15KTsKKwl9CisJcHV0X3VzZXIoKHVuc2lnbmVkIGxvbmcpIE5VTEwsIGFyZ3YpOworCWN1cnJlbnQtPm1tLT5hcmdfZW5kID0gY3VycmVudC0+bW0tPmVudl9zdGFydCA9ICh1bnNpZ25lZCBsb25nKSBwOworCXdoaWxlIChlbnZjLS0+MCkgeworCQlwdXRfdXNlcigodW5zaWduZWQgbG9uZylwLCBlbnZwKTsgZW52cCsrOworCQlkbyB7CisJCQlnZXRfdXNlcihkdW1teSwgcCk7IHArKzsKKwkJfSB3aGlsZSAoZHVtbXkpOworCX0KKwlwdXRfdXNlcigodW5zaWduZWQgbG9uZykgTlVMTCwgZW52cCk7CisJY3VycmVudC0+bW0tPmVudl9lbmQgPSAodW5zaWduZWQgbG9uZykgcDsKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpc3A7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ09ORklHX0JJTkZNVF9aRkxBVAorCisjaW5jbHVkZSA8bGludXgvemxpYi5oPgorCisjZGVmaW5lIExCVUZTSVpFCTQwMDAKKworLyogZ3ppcCBmbGFnIGJ5dGUgKi8KKyNkZWZpbmUgQVNDSUlfRkxBRyAgIDB4MDEgLyogYml0IDAgc2V0OiBmaWxlIHByb2JhYmx5IEFTQ0lJIHRleHQgKi8KKyNkZWZpbmUgQ09OVElOVUFUSU9OIDB4MDIgLyogYml0IDEgc2V0OiBjb250aW51YXRpb24gb2YgbXVsdGktcGFydCBnemlwIGZpbGUgKi8KKyNkZWZpbmUgRVhUUkFfRklFTEQgIDB4MDQgLyogYml0IDIgc2V0OiBleHRyYSBmaWVsZCBwcmVzZW50ICovCisjZGVmaW5lIE9SSUdfTkFNRSAgICAweDA4IC8qIGJpdCAzIHNldDogb3JpZ2luYWwgZmlsZSBuYW1lIHByZXNlbnQgKi8KKyNkZWZpbmUgQ09NTUVOVCAgICAgIDB4MTAgLyogYml0IDQgc2V0OiBmaWxlIGNvbW1lbnQgcHJlc2VudCAqLworI2RlZmluZSBFTkNSWVBURUQgICAgMHgyMCAvKiBiaXQgNSBzZXQ6IGZpbGUgaXMgZW5jcnlwdGVkICovCisjZGVmaW5lIFJFU0VSVkVEICAgICAweEMwIC8qIGJpdCA2LDc6ICAgcmVzZXJ2ZWQgKi8KKworc3RhdGljIGludCBkZWNvbXByZXNzX2V4ZWMoCisJc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwKKwljaGFyICpkc3QsCisJbG9uZyBsZW4sCisJaW50IGZkKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl6X3N0cmVhbSBzdHJtOworCWxvZmZfdCBmcG9zOworCWludCByZXQsIHJldHZhbDsKKworCURCR19GTFQoImRlY29tcHJlc3NfZXhlYyhvZmZzZXQ9JXgsYnVmPSV4LGxlbj0leClcbiIsKGludClvZmZzZXQsIChpbnQpZHN0LCAoaW50KWxlbik7CisKKwltZW1zZXQoJnN0cm0sIDAsIHNpemVvZihzdHJtKSk7CisJc3RybS53b3Jrc3BhY2UgPSBrbWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCksIEdGUF9LRVJORUwpOworCWlmIChzdHJtLndvcmtzcGFjZSA9PSBOVUxMKSB7CisJCURCR19GTFQoImJpbmZtdF9mbGF0OiBubyBtZW1vcnkgZm9yIGRlY29tcHJlc3Mgd29ya3NwYWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWJ1ZiA9IGttYWxsb2MoTEJVRlNJWkUsIEdGUF9LRVJORUwpOworCWlmIChidWYgPT0gTlVMTCkgeworCQlEQkdfRkxUKCJiaW5mbXRfZmxhdDogbm8gbWVtb3J5IGZvciByZWFkIGJ1ZmZlclxuIik7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJLyogUmVhZCBpbiBmaXJzdCBjaHVuayBvZiBkYXRhIGFuZCBwYXJzZSBnemlwIGhlYWRlci4gKi8KKwlmcG9zID0gb2Zmc2V0OworCXJldCA9IGJwcm0tPmZpbGUtPmZfb3AtPnJlYWQoYnBybS0+ZmlsZSwgYnVmLCBMQlVGU0laRSwgJmZwb3MpOworCisJc3RybS5uZXh0X2luID0gYnVmOworCXN0cm0uYXZhaWxfaW4gPSByZXQ7CisJc3RybS50b3RhbF9pbiA9IDA7CisKKwlyZXR2YWwgPSAtRU5PRVhFQzsKKworCS8qIENoZWNrIG1pbmltdW0gc2l6ZSAtLSBnemlwIGhlYWRlciAqLworCWlmIChyZXQgPCAxMCkgeworCQlEQkdfRkxUKCJiaW5mbXRfZmxhdDogZmlsZSB0b28gc21hbGw/XG4iKTsKKwkJZ290byBvdXRfZnJlZV9idWY7CisJfQorCisJLyogQ2hlY2sgZ3ppcCBtYWdpYyBudW1iZXIgKi8KKwlpZiAoKGJ1ZlswXSAhPSAwMzcpIHx8ICgoYnVmWzFdICE9IDAyMTMpICYmIChidWZbMV0gIT0gMDIzNikpKSB7CisJCURCR19GTFQoImJpbmZtdF9mbGF0OiB1bmtub3duIGNvbXByZXNzaW9uIG1hZ2ljP1xuIik7CisJCWdvdG8gb3V0X2ZyZWVfYnVmOworCX0KKworCS8qIENoZWNrIGd6aXAgbWV0aG9kICovCisJaWYgKGJ1ZlsyXSAhPSA4KSB7CisJCURCR19GTFQoImJpbmZtdF9mbGF0OiB1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZD9cbiIpOworCQlnb3RvIG91dF9mcmVlX2J1ZjsKKwl9CisJLyogQ2hlY2sgZ3ppcCBmbGFncyAqLworCWlmICgoYnVmWzNdICYgRU5DUllQVEVEKSB8fCAoYnVmWzNdICYgQ09OVElOVUFUSU9OKSB8fAorCSAgICAoYnVmWzNdICYgUkVTRVJWRUQpKSB7CisJCURCR19GTFQoImJpbmZtdF9mbGF0OiB1bmtub3duIGZsYWdzP1xuIik7CisJCWdvdG8gb3V0X2ZyZWVfYnVmOworCX0KKworCXJldCA9IDEwOworCWlmIChidWZbM10gJiBFWFRSQV9GSUVMRCkgeworCQlyZXQgKz0gMiArIGJ1ZlsxMF0gKyAoYnVmWzExXSA8PCA4KTsKKwkJaWYgKHVubGlrZWx5KExCVUZTSVpFID09IHJldCkpIHsKKwkJCURCR19GTFQoImJpbmZtdF9mbGF0OiBidWZmZXIgb3ZlcmZsb3cgKEVYVFJBKT9cbiIpOworCQkJZ290byBvdXRfZnJlZV9idWY7CisJCX0KKwl9CisJaWYgKGJ1ZlszXSAmIE9SSUdfTkFNRSkgeworCQlmb3IgKDsgcmV0IDwgTEJVRlNJWkUgJiYgKGJ1ZltyZXRdICE9IDApOyByZXQrKykKKwkJCTsKKwkJaWYgKHVubGlrZWx5KExCVUZTSVpFID09IHJldCkpIHsKKwkJCURCR19GTFQoImJpbmZtdF9mbGF0OiBidWZmZXIgb3ZlcmZsb3cgKE9SSUdfTkFNRSk/XG4iKTsKKwkJCWdvdG8gb3V0X2ZyZWVfYnVmOworCQl9CisJfQorCWlmIChidWZbM10gJiBDT01NRU5UKSB7CisJCWZvciAoOyAgcmV0IDwgTEJVRlNJWkUgJiYgKGJ1ZltyZXRdICE9IDApOyByZXQrKykKKwkJCTsKKwkJaWYgKHVubGlrZWx5KExCVUZTSVpFID09IHJldCkpIHsKKwkJCURCR19GTFQoImJpbmZtdF9mbGF0OiBidWZmZXIgb3ZlcmZsb3cgKENPTU1FTlQpP1xuIik7CisJCQlnb3RvIG91dF9mcmVlX2J1ZjsKKwkJfQorCX0KKworCXN0cm0ubmV4dF9pbiArPSByZXQ7CisJc3RybS5hdmFpbF9pbiAtPSByZXQ7CisKKwlzdHJtLm5leHRfb3V0ID0gZHN0OworCXN0cm0uYXZhaWxfb3V0ID0gbGVuOworCXN0cm0udG90YWxfb3V0ID0gMDsKKworCWlmICh6bGliX2luZmxhdGVJbml0Migmc3RybSwgLU1BWF9XQklUUykgIT0gWl9PSykgeworCQlEQkdfRkxUKCJiaW5mbXRfZmxhdDogemxpYiBpbml0IGZhaWxlZD9cbiIpOworCQlnb3RvIG91dF9mcmVlX2J1ZjsKKwl9CisKKwl3aGlsZSAoKHJldCA9IHpsaWJfaW5mbGF0ZSgmc3RybSwgWl9OT19GTFVTSCkpID09IFpfT0spIHsKKwkJcmV0ID0gYnBybS0+ZmlsZS0+Zl9vcC0+cmVhZChicHJtLT5maWxlLCBidWYsIExCVUZTSVpFLCAmZnBvcyk7CisJCWlmIChyZXQgPD0gMCkKKwkJCWJyZWFrOworCQlpZiAocmV0ID49ICh1bnNpZ25lZCBsb25nKSAtNDA5NikKKwkJCWJyZWFrOworCQlsZW4gLT0gcmV0OworCisJCXN0cm0ubmV4dF9pbiA9IGJ1ZjsKKwkJc3RybS5hdmFpbF9pbiA9IHJldDsKKwkJc3RybS50b3RhbF9pbiA9IDA7CisJfQorCisJaWYgKHJldCA8IDApIHsKKwkJREJHX0ZMVCgiYmluZm10X2ZsYXQ6IGRlY29tcHJlc3Npb24gZmFpbGVkICglZCksICVzXG4iLAorCQkJcmV0LCBzdHJtLm1zZyk7CisJCWdvdG8gb3V0X3psaWI7CisJfQorCisJcmV0dmFsID0gMDsKK291dF96bGliOgorCXpsaWJfaW5mbGF0ZUVuZCgmc3RybSk7CitvdXRfZnJlZV9idWY6CisJa2ZyZWUoYnVmKTsKK291dF9mcmVlOgorCWtmcmVlKHN0cm0ud29ya3NwYWNlKTsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisjZW5kaWYgLyogQ09ORklHX0JJTkZNVF9aRkxBVCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2NhbGNfcmVsb2ModW5zaWduZWQgbG9uZyByLCBzdHJ1Y3QgbGliX2luZm8gKnAsIGludCBjdXJpZCwgaW50IGludGVybmFscCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJaW50IGlkOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfYnJrOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHRleHRfbGVuOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfY29kZTsKKworI2lmZGVmIENPTkZJR19CSU5GTVRfU0hBUkVEX0ZMQVQKKwlpZiAociA9PSAwKQorCQlpZCA9IGN1cmlkOwkvKiBSZWxvY3Mgb2YgMCBhcmUgYWx3YXlzIHNlbGYgcmVmZXJyaW5nICovCisJZWxzZSB7CisJCWlkID0gKHIgPj4gMjQpICYgMHhmZjsJLyogRmluZCBJRCBmb3IgdGhpcyByZWxvYyAqLworCQlyICY9IDB4MDBmZmZmZmY7CS8qIFRyaW0gSUQgb2ZmIGhlcmUgKi8KKwl9CisJaWYgKGlkID49IE1BWF9TSEFSRURfTElCUykgeworCQlwcmludGsoIkJJTkZNVF9GTEFUOiByZWZlcmVuY2UgMHgleCB0byBzaGFyZWQgbGlicmFyeSAlZCIsCisJCQkJKHVuc2lnbmVkKSByLCBpZCk7CisJCWdvdG8gZmFpbGVkOworCX0KKwlpZiAoY3VyaWQgIT0gaWQpIHsKKwkJaWYgKGludGVybmFscCkgeworCQkJcHJpbnRrKCJCSU5GTVRfRkxBVDogcmVsb2MgYWRkcmVzcyAweCV4IG5vdCBpbiBzYW1lIG1vZHVsZSAiCisJCQkJCSIoJWQgIT0gJWQpIiwgKHVuc2lnbmVkKSByLCBjdXJpZCwgaWQpOworCQkJZ290byBmYWlsZWQ7CisJCX0gZWxzZSBpZiAoICEgcC0+bGliX2xpc3RbaWRdLmxvYWRlZCAmJgorCQkJCWxvYWRfZmxhdF9zaGFyZWRfbGlicmFyeShpZCwgcCkgPiAodW5zaWduZWQgbG9uZykgLTQwOTYpIHsKKwkJCXByaW50aygiQklORk1UX0ZMQVQ6IGZhaWxlZCB0byBsb2FkIGxpYnJhcnkgJWQiLCBpZCk7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCQkvKiBDaGVjayB2ZXJzaW9uaW5nIGluZm9ybWF0aW9uIChpLmUuIHRpbWUgc3RhbXBzKSAqLworCQlpZiAocC0+bGliX2xpc3RbaWRdLmJ1aWxkX2RhdGUgJiYgcC0+bGliX2xpc3RbY3VyaWRdLmJ1aWxkX2RhdGUgJiYKKwkJCQlwLT5saWJfbGlzdFtjdXJpZF0uYnVpbGRfZGF0ZSA8IHAtPmxpYl9saXN0W2lkXS5idWlsZF9kYXRlKSB7CisJCQlwcmludGsoIkJJTkZNVF9GTEFUOiBsaWJyYXJ5ICVkIGlzIHlvdW5nZXIgdGhhbiAlZCIsIGlkLCBjdXJpZCk7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCX0KKyNlbHNlCisJaWQgPSAwOworI2VuZGlmCisKKwlzdGFydF9icmsgPSBwLT5saWJfbGlzdFtpZF0uc3RhcnRfYnJrOworCXN0YXJ0X2RhdGEgPSBwLT5saWJfbGlzdFtpZF0uc3RhcnRfZGF0YTsKKwlzdGFydF9jb2RlID0gcC0+bGliX2xpc3RbaWRdLnN0YXJ0X2NvZGU7CisJdGV4dF9sZW4gPSBwLT5saWJfbGlzdFtpZF0udGV4dF9sZW47CisKKwlpZiAoIWZsYXRfcmVsb2NfdmFsaWQociwgc3RhcnRfYnJrIC0gc3RhcnRfZGF0YSArIHRleHRfbGVuKSkgeworCQlwcmludGsoIkJJTkZNVF9GTEFUOiByZWxvYyBvdXRzaWRlIHByb2dyYW0gMHgleCAoMCAtIDB4JXgvMHgleCkiLAorCQkgICAgICAgKGludCkgciwoaW50KShzdGFydF9icmstc3RhcnRfY29kZSksKGludCl0ZXh0X2xlbik7CisJCWdvdG8gZmFpbGVkOworCX0KKworCWlmIChyIDwgdGV4dF9sZW4pCQkJLyogSW4gdGV4dCBzZWdtZW50ICovCisJCWFkZHIgPSByICsgc3RhcnRfY29kZTsKKwllbHNlCQkJCQkvKiBJbiBkYXRhIHNlZ21lbnQgKi8KKwkJYWRkciA9IHIgLSB0ZXh0X2xlbiArIHN0YXJ0X2RhdGE7CisKKwkvKiBSYW5nZSBjaGVja2VkIGFscmVhZHkgYWJvdmUgc28gZG9pbmcgdGhlIHJhbmdlIHRlc3RzIGlzIHJlZHVuZGFudC4uLiovCisJcmV0dXJuKGFkZHIpOworCitmYWlsZWQ6CisJcHJpbnRrKCIsIGtpbGxpbmcgJXMhXG4iLCBjdXJyZW50LT5jb21tKTsKKwlzZW5kX3NpZyhTSUdTRUdWLCBjdXJyZW50LCAwKTsKKworCXJldHVybiBSRUxPQ19GQUlMRUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIG9sZF9yZWxvYyh1bnNpZ25lZCBsb25nIHJsKQoreworI2lmZGVmIERFQlVHCisJY2hhciAqc2VnbWVudFtdID0geyAiVEVYVCIsICJEQVRBIiwgIkJTUyIsICIqVU5LTk9XTioiIH07CisjZW5kaWYKKwlmbGF0X3YyX3JlbG9jX3QJcjsKKwl1bnNpZ25lZCBsb25nICpwdHI7CisJCisJci52YWx1ZSA9IHJsOworI2lmIGRlZmluZWQoQ09ORklHX0NPTERGSVJFKQorCXB0ciA9ICh1bnNpZ25lZCBsb25nICopIChjdXJyZW50LT5tbS0+c3RhcnRfY29kZSArIHIucmVsb2Mub2Zmc2V0KTsKKyNlbHNlCisJcHRyID0gKHVuc2lnbmVkIGxvbmcgKikgKGN1cnJlbnQtPm1tLT5zdGFydF9kYXRhICsgci5yZWxvYy5vZmZzZXQpOworI2VuZGlmCisKKyNpZmRlZiBERUJVRworCXByaW50aygiUmVsb2NhdGlvbiBvZiB2YXJpYWJsZSBhdCBEQVRBU0VHKyV4ICIKKwkJIihhZGRyZXNzICVwLCBjdXJyZW50bHkgJXgpIGludG8gc2VnbWVudCAlc1xuIiwKKwkJci5yZWxvYy5vZmZzZXQsIHB0ciwgKGludCkqcHRyLCBzZWdtZW50W3IucmVsb2MudHlwZV0pOworI2VuZGlmCisJCisJc3dpdGNoIChyLnJlbG9jLnR5cGUpIHsKKwljYXNlIE9MRF9GTEFUX1JFTE9DX1RZUEVfVEVYVDoKKwkJKnB0ciArPSBjdXJyZW50LT5tbS0+c3RhcnRfY29kZTsKKwkJYnJlYWs7CisJY2FzZSBPTERfRkxBVF9SRUxPQ19UWVBFX0RBVEE6CisJCSpwdHIgKz0gY3VycmVudC0+bW0tPnN0YXJ0X2RhdGE7CisJCWJyZWFrOworCWNhc2UgT0xEX0ZMQVRfUkVMT0NfVFlQRV9CU1M6CisJCSpwdHIgKz0gY3VycmVudC0+bW0tPmVuZF9kYXRhOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoIkJJTkZNVF9GTEFUOiBVbmtub3duIHJlbG9jYXRpb24gdHlwZT0leFxuIiwgci5yZWxvYy50eXBlKTsKKwkJYnJlYWs7CisJfQorCisjaWZkZWYgREVCVUcKKwlwcmludGsoIlJlbG9jYXRpb24gYmVjYW1lICV4XG4iLCAoaW50KSpwdHIpOworI2VuZGlmCit9CQkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgbG9hZF9mbGF0X2ZpbGUoc3RydWN0IGxpbnV4X2JpbnBybSAqIGJwcm0sCisJCXN0cnVjdCBsaWJfaW5mbyAqbGliaW5mbywgaW50IGlkLCB1bnNpZ25lZCBsb25nICpleHRyYV9zdGFjaykKK3sKKwlzdHJ1Y3QgZmxhdF9oZHIgKiBoZHI7CisJdW5zaWduZWQgbG9uZyB0ZXh0cG9zID0gMCwgZGF0YXBvcyA9IDAsIHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIHJlYWxkYXRhc3RhcnQgPSAwOworCXVuc2lnbmVkIGxvbmcgdGV4dF9sZW4sIGRhdGFfbGVuLCBic3NfbGVuLCBzdGFja19sZW4sIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgbWVtcCA9IDA7IC8qIGZvciBmaW5kaW5nIHRoZSBicmsgYXJlYSAqLworCXVuc2lnbmVkIGxvbmcgZXh0cmEsIHJsaW07CisJdW5zaWduZWQgbG9uZyAqcmVsb2MgPSAwLCAqcnA7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgaSwgcmV2LCByZWxvY3MgPSAwOworCWxvZmZfdCBmcG9zOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfY29kZSwgZW5kX2NvZGU7CisKKwloZHIgPSAoKHN0cnVjdCBmbGF0X2hkciAqKSBicHJtLT5idWYpOwkJLyogZXhlYy1oZWFkZXIgKi8KKwlpbm9kZSA9IGJwcm0tPmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCisJdGV4dF9sZW4gID0gbnRvaGwoaGRyLT5kYXRhX3N0YXJ0KTsKKwlkYXRhX2xlbiAgPSBudG9obChoZHItPmRhdGFfZW5kKSAtIG50b2hsKGhkci0+ZGF0YV9zdGFydCk7CisJYnNzX2xlbiAgID0gbnRvaGwoaGRyLT5ic3NfZW5kKSAtIG50b2hsKGhkci0+ZGF0YV9lbmQpOworCXN0YWNrX2xlbiA9IG50b2hsKGhkci0+c3RhY2tfc2l6ZSk7CisJaWYgKGV4dHJhX3N0YWNrKSB7CisJCXN0YWNrX2xlbiArPSAqZXh0cmFfc3RhY2s7CisJCSpleHRyYV9zdGFjayA9IHN0YWNrX2xlbjsKKwl9CisJcmVsb2NzICAgID0gbnRvaGwoaGRyLT5yZWxvY19jb3VudCk7CisJZmxhZ3MgICAgID0gbnRvaGwoaGRyLT5mbGFncyk7CisJcmV2ICAgICAgID0gbnRvaGwoaGRyLT5yZXYpOworCisJaWYgKGZsYWdzICYgRkxBVF9GTEFHX0tUUkFDRSkKKwkJcHJpbnRrKCJCSU5GTVRfRkxBVDogTG9hZGluZyBmaWxlOiAlc1xuIiwgYnBybS0+ZmlsZW5hbWUpOworCisJaWYgKHN0cm5jbXAoaGRyLT5tYWdpYywgImJGTFQiLCA0KSB8fAorCQkJKHJldiAhPSBGTEFUX1ZFUlNJT04gJiYgcmV2ICE9IE9MRF9GTEFUX1ZFUlNJT04pKSB7CisJCS8qCisJCSAqIGJlY2F1c2UgYSBsb3Qgb2YgcGVvcGxlIGRvIG5vdCBtYW5hZ2UgdG8gcHJvZHVjZSBnb29kCisJCSAqIGZsYXQgYmluYXJpZXMsICB3ZSBsZWF2ZSB0aGlzIHByaW50ayB0byBoZWxwIHRoZW0gcmVhbGlzZQorCQkgKiB0aGUgcHJvYmxlbS4gIFdlIG9ubHkgcHJpbnQgdGhlIGVycm9yIGlmIGl0cyBub3QgYSBzY3JpcHQgZmlsZQorCQkgKi8KKwkJaWYgKHN0cm5jbXAoaGRyLT5tYWdpYywgIiMhIiwgMikpCisJCQlwcmludGsoIkJJTkZNVF9GTEFUOiBiYWQgbWFnaWMvcmV2ICgweCV4LCBuZWVkIDB4JXgpXG4iLAorCQkJCQlyZXYsIChpbnQpIEZMQVRfVkVSU0lPTik7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisJCisJLyogRG9uJ3QgYWxsb3cgb2xkIGZvcm1hdCBleGVjdXRhYmxlcyB0byB1c2Ugc2hhcmVkIGxpYnJhcmllcyAqLworCWlmIChyZXYgPT0gT0xEX0ZMQVRfVkVSU0lPTiAmJiBpZCAhPSAwKSB7CisJCXByaW50aygiQklORk1UX0ZMQVQ6IHNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBhdmFpbGFibGUgYmVmb3JlIHJldiAweCV4XG4iLAorCQkJCShpbnQpIEZMQVRfVkVSU0lPTik7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisKKwkvKgorCSAqIGZpeCB1cCB0aGUgZmxhZ3MgZm9yIHRoZSBvbGRlciBmb3JtYXQsICB0aGVyZSB3ZXJlIGFsbCBraW5kcworCSAqIG9mIGVuZGlhbiBoYWNrcywgIHRoaXMgb25seSB3b3JrcyBmb3IgdGhlIHNpbXBsZSBjYXNlcworCSAqLworCWlmIChyZXYgPT0gT0xEX0ZMQVRfVkVSU0lPTiAmJiBmbGF0X29sZF9yYW1fZmxhZyhmbGFncykpCisJCWZsYWdzID0gRkxBVF9GTEFHX1JBTTsKKworI2lmbmRlZiBDT05GSUdfQklORk1UX1pGTEFUCisJaWYgKGZsYWdzICYgKEZMQVRfRkxBR19HWklQfEZMQVRfRkxBR19HWkRBVEEpKSB7CisJCXByaW50aygiU3VwcG9ydCBmb3IgWkZMQVQgZXhlY3V0YWJsZXMgaXMgbm90IGVuYWJsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKyNlbmRpZgorCisJLyoKKwkgKiBDaGVjayBpbml0aWFsIGxpbWl0cy4gVGhpcyBhdm9pZHMgbGV0dGluZyBwZW9wbGUgY2lyY3VtdmVudAorCSAqIHNpemUgbGltaXRzIGltcG9zZWQgb24gdGhlbSBieSBjcmVhdGluZyBwcm9ncmFtcyB3aXRoIGxhcmdlCisJICogYXJyYXlzIGluIHRoZSBkYXRhIG9yIGJzcy4KKwkgKi8KKwlybGltID0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9EQVRBXS5ybGltX2N1cjsKKwlpZiAocmxpbSA+PSBSTElNX0lORklOSVRZKQorCQlybGltID0gfjA7CisJaWYgKGRhdGFfbGVuICsgYnNzX2xlbiA+IHJsaW0pCisJCXJldHVybiAtRU5PTUVNOworCisJLyogRmx1c2ggYWxsIHRyYWNlcyBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgZXhlY3V0YWJsZSAqLworCWlmIChpZCA9PSAwKSB7CisJCXJlc3VsdCA9IGZsdXNoX29sZF9leGVjKGJwcm0pOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQkvKiBPSywgVGhpcyBpcyB0aGUgcG9pbnQgb2Ygbm8gcmV0dXJuICovCisJCXNldF9wZXJzb25hbGl0eShQRVJfTElOVVgpOworCX0KKworCS8qCisJICogY2FsY3VsYXRlIHRoZSBleHRyYSBzcGFjZSB3ZSBuZWVkIHRvIG1hcCBpbgorCSAqLworCWV4dHJhID0gbWF4KGJzc19sZW4gKyBzdGFja19sZW4sIHJlbG9jcyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisKKwkvKgorCSAqIHRoZXJlIGFyZSBhIGNvdXBsZSBvZiBjYXNlcyBoZXJlLCAgdGhlIHNlcGFyYXRlIGNvZGUvZGF0YQorCSAqIGNhc2UsICBhbmQgdGhlbiB0aGUgZnVsbHkgY29waWVkIHRvIFJBTSBjYXNlIHdoaWNoIGx1bXBzCisJICogaXQgYWxsIHRvZ2V0aGVyLgorCSAqLworCWlmICgoZmxhZ3MgJiAoRkxBVF9GTEFHX1JBTXxGTEFUX0ZMQUdfR1pJUCkpID09IDApIHsKKwkJLyoKKwkJICogdGhpcyBzaG91bGQgZ2l2ZSB1cyBhIFJPTSBwdHIsICBidXQgaWYgaXQgZG9lc24ndCB3ZSBkb24ndAorCQkgKiByZWFsbHkgY2FyZQorCQkgKi8KKwkJREJHX0ZMVCgiQklORk1UX0ZMQVQ6IFJPTSBtYXBwaW5nIG9mIGZpbGUgKHdlIGhvcGUpXG4iKTsKKworCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQl0ZXh0cG9zID0gZG9fbW1hcChicHJtLT5maWxlLCAwLCB0ZXh0X2xlbiwgUFJPVF9SRUFEfFBST1RfRVhFQywgMCwgMCk7CisJCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQlpZiAoIXRleHRwb3MgIHx8IHRleHRwb3MgPj0gKHVuc2lnbmVkIGxvbmcpIC00MDk2KSB7CisJCQlpZiAoIXRleHRwb3MpCisJCQkJdGV4dHBvcyA9ICh1bnNpZ25lZCBsb25nKSAtRU5PTUVNOworCQkJcHJpbnRrKCJVbmFibGUgdG8gbW1hcCBwcm9jZXNzIHRleHQsIGVycm5vICVkXG4iLCAoaW50KS10ZXh0cG9zKTsKKwkJCXJldHVybih0ZXh0cG9zKTsKKwkJfQorCisJCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCXJlYWxkYXRhc3RhcnQgPSBkb19tbWFwKDAsIDAsIGRhdGFfbGVuICsgZXh0cmEgKworCQkJCU1BWF9TSEFSRURfTElCUyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJCQlQUk9UX1JFQUR8UFJPVF9XUklURXxQUk9UX0VYRUMsIDAsIDApOworCQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworCQlpZiAocmVhbGRhdGFzdGFydCA9PSAwIHx8IHJlYWxkYXRhc3RhcnQgPj0gKHVuc2lnbmVkIGxvbmcpLTQwOTYpIHsKKwkJCWlmICghcmVhbGRhdGFzdGFydCkKKwkJCQlyZWFsZGF0YXN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIC1FTk9NRU07CisJCQlwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBSQU0gZm9yIHByb2Nlc3MgZGF0YSwgZXJybm8gJWRcbiIsCisJCQkJCShpbnQpLWRhdGFwb3MpOworCQkJZG9fbXVubWFwKGN1cnJlbnQtPm1tLCB0ZXh0cG9zLCB0ZXh0X2xlbik7CisJCQlyZXR1cm4gcmVhbGRhdGFzdGFydDsKKwkJfQorCQlkYXRhcG9zID0gcmVhbGRhdGFzdGFydCArIE1BWF9TSEFSRURfTElCUyAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKKworCQlEQkdfRkxUKCJCSU5GTVRfRkxBVDogQWxsb2NhdGVkIGRhdGErYnNzK3N0YWNrICglZCBieXRlcyk6ICV4XG4iLAorCQkJCShpbnQpKGRhdGFfbGVuICsgYnNzX2xlbiArIHN0YWNrX2xlbiksIChpbnQpZGF0YXBvcyk7CisKKwkJZnBvcyA9IG50b2hsKGhkci0+ZGF0YV9zdGFydCk7CisjaWZkZWYgQ09ORklHX0JJTkZNVF9aRkxBVAorCQlpZiAoZmxhZ3MgJiBGTEFUX0ZMQUdfR1pEQVRBKSB7CisJCQlyZXN1bHQgPSBkZWNvbXByZXNzX2V4ZWMoYnBybSwgZnBvcywgKGNoYXIgKikgZGF0YXBvcywgCisJCQkJCQkgZGF0YV9sZW4gKyAocmVsb2NzICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSwgMCk7CisJCX0gZWxzZQorI2VuZGlmCisJCXsKKwkJCXJlc3VsdCA9IGJwcm0tPmZpbGUtPmZfb3AtPnJlYWQoYnBybS0+ZmlsZSwgKGNoYXIgKikgZGF0YXBvcywKKwkJCQkJZGF0YV9sZW4gKyAocmVsb2NzICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSwgJmZwb3MpOworCQl9CisJCWlmIChyZXN1bHQgPj0gKHVuc2lnbmVkIGxvbmcpLTQwOTYpIHsKKwkJCXByaW50aygiVW5hYmxlIHRvIHJlYWQgZGF0YStic3MsIGVycm5vICVkXG4iLCAoaW50KS1yZXN1bHQpOworCQkJZG9fbXVubWFwKGN1cnJlbnQtPm1tLCB0ZXh0cG9zLCB0ZXh0X2xlbik7CisJCQlkb19tdW5tYXAoY3VycmVudC0+bW0sIHJlYWxkYXRhc3RhcnQsIGRhdGFfbGVuICsgZXh0cmEpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCXJlbG9jID0gKHVuc2lnbmVkIGxvbmcgKikgKGRhdGFwb3MrKG50b2hsKGhkci0+cmVsb2Nfc3RhcnQpLXRleHRfbGVuKSk7CisJCW1lbXAgPSByZWFsZGF0YXN0YXJ0OworCisJfSBlbHNlIHsKKworCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQl0ZXh0cG9zID0gZG9fbW1hcCgwLCAwLCB0ZXh0X2xlbiArIGRhdGFfbGVuICsgZXh0cmEgKworCQkJCQlNQVhfU0hBUkVEX0xJQlMgKiBzaXplb2YodW5zaWduZWQgbG9uZyksCisJCQkJUFJPVF9SRUFEIHwgUFJPVF9FWEVDIHwgUFJPVF9XUklURSwgMCwgMCk7CisJCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQlpZiAoIXRleHRwb3MgIHx8IHRleHRwb3MgPj0gKHVuc2lnbmVkIGxvbmcpIC00MDk2KSB7CisJCQlpZiAoIXRleHRwb3MpCisJCQkJdGV4dHBvcyA9ICh1bnNpZ25lZCBsb25nKSAtRU5PTUVNOworCQkJcHJpbnRrKCJVbmFibGUgdG8gYWxsb2NhdGUgUkFNIGZvciBwcm9jZXNzIHRleHQvZGF0YSwgZXJybm8gJWRcbiIsCisJCQkJCShpbnQpLXRleHRwb3MpOworCQkJcmV0dXJuKHRleHRwb3MpOworCQl9CisKKwkJcmVhbGRhdGFzdGFydCA9IHRleHRwb3MgKyBudG9obChoZHItPmRhdGFfc3RhcnQpOworCQlkYXRhcG9zID0gcmVhbGRhdGFzdGFydCArIE1BWF9TSEFSRURfTElCUyAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwkJcmVsb2MgPSAodW5zaWduZWQgbG9uZyAqKSAodGV4dHBvcyArIG50b2hsKGhkci0+cmVsb2Nfc3RhcnQpICsKKwkJCQlNQVhfU0hBUkVEX0xJQlMgKiBzaXplb2YodW5zaWduZWQgbG9uZykpOworCQltZW1wID0gdGV4dHBvczsKKworI2lmZGVmIENPTkZJR19CSU5GTVRfWkZMQVQKKwkJLyoKKwkJICogbG9hZCBpdCBhbGwgaW4gYW5kIHRyZWF0IGl0IGxpa2UgYSBSQU0gbG9hZCBmcm9tIG5vdyBvbgorCQkgKi8KKwkJaWYgKGZsYWdzICYgRkxBVF9GTEFHX0daSVApIHsKKwkJCXJlc3VsdCA9IGRlY29tcHJlc3NfZXhlYyhicHJtLCBzaXplb2YgKHN0cnVjdCBmbGF0X2hkciksCisJCQkJCSAoKChjaGFyICopIHRleHRwb3MpICsgc2l6ZW9mIChzdHJ1Y3QgZmxhdF9oZHIpKSwKKwkJCQkJICh0ZXh0X2xlbiArIGRhdGFfbGVuICsgKHJlbG9jcyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkKKwkJCQkJCSAgLSBzaXplb2YgKHN0cnVjdCBmbGF0X2hkcikpLAorCQkJCQkgMCk7CisJCQltZW1tb3ZlKCh2b2lkICopIGRhdGFwb3MsICh2b2lkICopIHJlYWxkYXRhc3RhcnQsCisJCQkJCWRhdGFfbGVuICsgKHJlbG9jcyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkpOworCQl9IGVsc2UgaWYgKGZsYWdzICYgRkxBVF9GTEFHX0daREFUQSkgeworCQkJZnBvcyA9IDA7CisJCQlyZXN1bHQgPSBicHJtLT5maWxlLT5mX29wLT5yZWFkKGJwcm0tPmZpbGUsCisJCQkJCShjaGFyICopIHRleHRwb3MsIHRleHRfbGVuLCAmZnBvcyk7CisJCQlpZiAocmVzdWx0IDwgKHVuc2lnbmVkIGxvbmcpIC00MDk2KQorCQkJCXJlc3VsdCA9IGRlY29tcHJlc3NfZXhlYyhicHJtLCB0ZXh0X2xlbiwgKGNoYXIgKikgZGF0YXBvcywKKwkJCQkJCSBkYXRhX2xlbiArIChyZWxvY3MgKiBzaXplb2YodW5zaWduZWQgbG9uZykpLCAwKTsKKwkJfQorCQllbHNlCisjZW5kaWYKKwkJeworCQkJZnBvcyA9IDA7CisJCQlyZXN1bHQgPSBicHJtLT5maWxlLT5mX29wLT5yZWFkKGJwcm0tPmZpbGUsCisJCQkJCShjaGFyICopIHRleHRwb3MsIHRleHRfbGVuLCAmZnBvcyk7CisJCQlpZiAocmVzdWx0IDwgKHVuc2lnbmVkIGxvbmcpIC00MDk2KSB7CisJCQkJZnBvcyA9IG50b2hsKGhkci0+ZGF0YV9zdGFydCk7CisJCQkJcmVzdWx0ID0gYnBybS0+ZmlsZS0+Zl9vcC0+cmVhZChicHJtLT5maWxlLCAoY2hhciAqKSBkYXRhcG9zLAorCQkJCQlkYXRhX2xlbiArIChyZWxvY3MgKiBzaXplb2YodW5zaWduZWQgbG9uZykpLCAmZnBvcyk7CisJCQl9CisJCX0KKwkJaWYgKHJlc3VsdCA+PSAodW5zaWduZWQgbG9uZyktNDA5NikgeworCQkJcHJpbnRrKCJVbmFibGUgdG8gcmVhZCBjb2RlK2RhdGErYnNzLCBlcnJubyAlZFxuIiwoaW50KS1yZXN1bHQpOworCQkJZG9fbXVubWFwKGN1cnJlbnQtPm1tLCB0ZXh0cG9zLCB0ZXh0X2xlbiArIGRhdGFfbGVuICsgZXh0cmEgKworCQkJCU1BWF9TSEFSRURfTElCUyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJfQorCisJaWYgKGZsYWdzICYgRkxBVF9GTEFHX0tUUkFDRSkKKwkJcHJpbnRrKCJNYXBwaW5nIGlzICV4LCBFbnRyeSBwb2ludCBpcyAleCwgZGF0YV9zdGFydCBpcyAleFxuIiwKKwkJCShpbnQpdGV4dHBvcywgMHgwMGZmZmZmZiZudG9obChoZHItPmVudHJ5KSwgbnRvaGwoaGRyLT5kYXRhX3N0YXJ0KSk7CisKKwkvKiBUaGUgbWFpbiBwcm9ncmFtIG5lZWRzIGEgbGl0dGxlIGV4dHJhIHNldHVwIGluIHRoZSB0YXNrIHN0cnVjdHVyZSAqLworCXN0YXJ0X2NvZGUgPSB0ZXh0cG9zICsgc2l6ZW9mIChzdHJ1Y3QgZmxhdF9oZHIpOworCWVuZF9jb2RlID0gdGV4dHBvcyArIHRleHRfbGVuOworCWlmIChpZCA9PSAwKSB7CisJCWN1cnJlbnQtPm1tLT5zdGFydF9jb2RlID0gc3RhcnRfY29kZTsKKwkJY3VycmVudC0+bW0tPmVuZF9jb2RlID0gZW5kX2NvZGU7CisJCWN1cnJlbnQtPm1tLT5zdGFydF9kYXRhID0gZGF0YXBvczsKKwkJY3VycmVudC0+bW0tPmVuZF9kYXRhID0gZGF0YXBvcyArIGRhdGFfbGVuOworCQkvKgorCQkgKiBzZXQgdXAgdGhlIGJyayBzdHVmZiwgdXNlcyBhbnkgc2xhY2sgbGVmdCBpbiBkYXRhL2Jzcy9zdGFjaworCQkgKiBhbGxvY2F0aW9uLiAgV2UgcHV0IHRoZSBicmsgYWZ0ZXIgdGhlIGJzcyAoYmV0d2VlbiB0aGUgYnNzCisJCSAqIGFuZCBzdGFjaykgbGlrZSBvdGhlciBwbGF0Zm9ybXMuCisJCSAqLworCQljdXJyZW50LT5tbS0+c3RhcnRfYnJrID0gZGF0YXBvcyArIGRhdGFfbGVuICsgYnNzX2xlbjsKKwkJY3VycmVudC0+bW0tPmJyayA9IChjdXJyZW50LT5tbS0+c3RhcnRfYnJrICsgMykgJiB+MzsKKwkJY3VycmVudC0+bW0tPmNvbnRleHQuZW5kX2JyayA9IG1lbXAgKyBrc2l6ZSgodm9pZCAqKSBtZW1wKSAtIHN0YWNrX2xlbjsKKwkJc2V0X21tX2NvdW50ZXIoY3VycmVudC0+bW0sIHJzcywgMCk7CisJfQorCisJaWYgKGZsYWdzICYgRkxBVF9GTEFHX0tUUkFDRSkKKwkJcHJpbnRrKCIlcyAlczogVEVYVD0leC0leCBEQVRBPSV4LSV4IEJTUz0leC0leFxuIiwKKwkJCWlkID8gIkxpYiIgOiAiTG9hZCIsIGJwcm0tPmZpbGVuYW1lLAorCQkJKGludCkgc3RhcnRfY29kZSwgKGludCkgZW5kX2NvZGUsCisJCQkoaW50KSBkYXRhcG9zLAorCQkJKGludCkgKGRhdGFwb3MgKyBkYXRhX2xlbiksCisJCQkoaW50KSAoZGF0YXBvcyArIGRhdGFfbGVuKSwKKwkJCShpbnQpICgoKGRhdGFwb3MgKyBkYXRhX2xlbiArIGJzc19sZW4pICsgMykgJiB+MykpOworCisJdGV4dF9sZW4gLT0gc2l6ZW9mKHN0cnVjdCBmbGF0X2hkcik7IC8qIHRoZSByZWFsIGNvZGUgbGVuICovCisKKwkvKiBTdG9yZSB0aGUgY3VycmVudCBtb2R1bGUgdmFsdWVzIGludG8gdGhlIGdsb2JhbCBsaWJyYXJ5IHN0cnVjdHVyZSAqLworCWxpYmluZm8tPmxpYl9saXN0W2lkXS5zdGFydF9jb2RlID0gc3RhcnRfY29kZTsKKwlsaWJpbmZvLT5saWJfbGlzdFtpZF0uc3RhcnRfZGF0YSA9IGRhdGFwb3M7CisJbGliaW5mby0+bGliX2xpc3RbaWRdLnN0YXJ0X2JyayA9IGRhdGFwb3MgKyBkYXRhX2xlbiArIGJzc19sZW47CisJbGliaW5mby0+bGliX2xpc3RbaWRdLnRleHRfbGVuID0gdGV4dF9sZW47CisJbGliaW5mby0+bGliX2xpc3RbaWRdLmxvYWRlZCA9IDE7CisJbGliaW5mby0+bGliX2xpc3RbaWRdLmVudHJ5ID0gKDB4MDBmZmZmZmYgJiBudG9obChoZHItPmVudHJ5KSkgKyB0ZXh0cG9zOworCWxpYmluZm8tPmxpYl9saXN0W2lkXS5idWlsZF9kYXRlID0gbnRvaGwoaGRyLT5idWlsZF9kYXRlKTsKKwkKKwkvKgorCSAqIFdlIGp1c3QgbG9hZCB0aGUgYWxsb2NhdGlvbnMgaW50byBzb21lIHRlbXBvcmFyeSBtZW1vcnkgdG8KKwkgKiBoZWxwIHNpbXBsaWZ5IGFsbCB0aGlzIG11bWJvIGp1bWJvCisJICoKKwkgKiBXZSd2ZSBnb3QgdHdvIGRpZmZlcmVudCBzZWN0aW9ucyBvZiByZWxvY2F0aW9uIGVudHJpZXMuCisJICogVGhlIGZpcnN0IGlzIHRoZSBHT1Qgd2hpY2ggcmVzaWRlcyBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIGRhdGEgc2VnbWVudAorCSAqIGFuZCBpcyB0ZXJtaW5hdGVkIHdpdGggYSAtMS4gIFRoaXMgb25lIGNhbiBiZSByZWxvY2F0ZWQgaW4gcGxhY2UuCisJICogVGhlIHNlY29uZCBpcyB0aGUgZXh0cmEgcmVsb2NhdGlvbiBlbnRyaWVzIHRhY2tlZCBhZnRlciB0aGUgaW1hZ2UncworCSAqIGRhdGEgc2VnbWVudC4gVGhlc2UgcmVxdWlyZSBhIGxpdHRsZSBtb3JlIHByb2Nlc3NpbmcgYXMgdGhlIGVudHJ5IGlzCisJICogcmVhbGx5IGFuIG9mZnNldCBpbnRvIHRoZSBpbWFnZSB3aGljaCBjb250YWlucyBhbiBvZmZzZXQgaW50byB0aGUKKwkgKiBpbWFnZS4KKwkgKi8KKwlpZiAoZmxhZ3MgJiBGTEFUX0ZMQUdfR09UUElDKSB7CisJCWZvciAocnAgPSAodW5zaWduZWQgbG9uZyAqKWRhdGFwb3M7ICpycCAhPSAweGZmZmZmZmZmOyBycCsrKSB7CisJCQl1bnNpZ25lZCBsb25nIGFkZHI7CisJCQlpZiAoKnJwKSB7CisJCQkJYWRkciA9IGNhbGNfcmVsb2MoKnJwLCBsaWJpbmZvLCBpZCwgMCk7CisJCQkJaWYgKGFkZHIgPT0gUkVMT0NfRkFJTEVEKQorCQkJCQlyZXR1cm4gLUVOT0VYRUM7CisJCQkJKnJwID0gYWRkcjsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogTm93IHJ1biB0aHJvdWdoIHRoZSByZWxvY2F0aW9uIGVudHJpZXMuCisJICogV2UndmUgZ290IHRvIGJlIGNhcmVmdWwgaGVyZSBhcyBDKysgcHJvZHVjZXMgcmVsb2NhdGFibGUgemVybworCSAqIGVudHJpZXMgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIHRhYmxlcyB3aGljaCBhcmUgdGhlbgorCSAqIHRlc3RlZCBmb3IgYmVpbmcgbm90IHplcm8gKHdoaWNoIHdpbGwgYWx3YXlzIG9jY3VyIHVubGVzcyB3ZSdyZQorCSAqIGJhc2VkIGZyb20gYWRkcmVzcyB6ZXJvKS4gIFRoaXMgY2F1c2VzIGFuIGVuZGxlc3MgbG9vcCBhcyBfX3N0YXJ0CisJICogaXMgYXQgemVyby4gIFRoZSBzb2x1dGlvbiB1c2VkIGlzIHRvIG5vdCByZWxvY2F0ZSB6ZXJvIGFkZHJlc3Nlcy4KKwkgKiBUaGlzIGhhcyB0aGUgbmVnYXRpdmUgc2lkZSBlZmZlY3Qgb2Ygbm90IGFsbG93aW5nIGEgZ2xvYmFsIGRhdGEKKwkgKiByZWZlcmVuY2UgdG8gYmUgc3RhdGljYWxseSBpbml0aWFsaXNlZCB0byBfc3RleHQgKEkndmUgbW92ZWQKKwkgKiBfX3N0YXJ0IHRvIGFkZHJlc3MgNCBzbyB0aGF0IGlzIG9rYXkpLgorCSAqLworCWlmIChyZXYgPiBPTERfRkxBVF9WRVJTSU9OKSB7CisJCWZvciAoaT0wOyBpIDwgcmVsb2NzOyBpKyspIHsKKwkJCXVuc2lnbmVkIGxvbmcgYWRkciwgcmVsdmFsOworCisJCQkvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHBvaW50ZXIgdG8gYmUKKwkJCSAgIHJlbG9jYXRlZCAob2YgY291cnNlLCB0aGUgYWRkcmVzcyBoYXMgdG8gYmUKKwkJCSAgIHJlbG9jYXRlZCBmaXJzdCkuICAqLworCQkJcmVsdmFsID0gbnRvaGwocmVsb2NbaV0pOworCQkJYWRkciA9IGZsYXRfZ2V0X3JlbG9jYXRlX2FkZHIocmVsdmFsKTsKKwkJCXJwID0gKHVuc2lnbmVkIGxvbmcgKikgY2FsY19yZWxvYyhhZGRyLCBsaWJpbmZvLCBpZCwgMSk7CisJCQlpZiAocnAgPT0gKHVuc2lnbmVkIGxvbmcgKilSRUxPQ19GQUlMRUQpCisJCQkJcmV0dXJuIC1FTk9FWEVDOworCisJCQkvKiBHZXQgdGhlIHBvaW50ZXIncyB2YWx1ZS4gICovCisJCQlhZGRyID0gZmxhdF9nZXRfYWRkcl9mcm9tX3JwKHJwLCByZWx2YWwsIGZsYWdzKTsKKwkJCWlmIChhZGRyICE9IDApIHsKKwkJCQkvKgorCQkJCSAqIERvIHRoZSByZWxvY2F0aW9uLiAgUElDIHJlbG9jcyBpbiB0aGUgZGF0YSBzZWN0aW9uIGFyZQorCQkJCSAqIGFscmVhZHkgaW4gdGFyZ2V0IG9yZGVyCisJCQkJICovCisJCQkJaWYgKChmbGFncyAmIEZMQVRfRkxBR19HT1RQSUMpID09IDApCisJCQkJCWFkZHIgPSBudG9obChhZGRyKTsKKwkJCQlhZGRyID0gY2FsY19yZWxvYyhhZGRyLCBsaWJpbmZvLCBpZCwgMCk7CisJCQkJaWYgKGFkZHIgPT0gUkVMT0NfRkFJTEVEKQorCQkJCQlyZXR1cm4gLUVOT0VYRUM7CisKKwkJCQkvKiBXcml0ZSBiYWNrIHRoZSByZWxvY2F0ZWQgcG9pbnRlci4gICovCisJCQkJZmxhdF9wdXRfYWRkcl9hdF9ycChycCwgYWRkciwgcmVsdmFsKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaT0wOyBpIDwgcmVsb2NzOyBpKyspCisJCQlvbGRfcmVsb2MobnRvaGwocmVsb2NbaV0pKTsKKwl9CisJCisJZmx1c2hfaWNhY2hlX3JhbmdlKHN0YXJ0X2NvZGUsIGVuZF9jb2RlKTsKKworCS8qIHplcm8gdGhlIEJTUywgIEJSSyBhbmQgc3RhY2sgYXJlYXMgKi8KKwltZW1zZXQoKHZvaWQqKShkYXRhcG9zICsgZGF0YV9sZW4pLCAwLCBic3NfbGVuICsgCisJCQkobWVtcCArIGtzaXplKCh2b2lkICopIG1lbXApIC0gc3RhY2tfbGVuIC0JLyogZW5kIGJyayAqLworCQkJbGliaW5mby0+bGliX2xpc3RbaWRdLnN0YXJ0X2JyaykgKwkJLyogc3RhcnQgYnJrICovCisJCQlzdGFja19sZW4pOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVAorCisvKgorICogTG9hZCBhIHNoYXJlZCBsaWJyYXJ5IGludG8gbWVtb3J5LiAgVGhlIGxpYnJhcnkgZ2V0cyBpdHMgb3duIGRhdGEKKyAqIHNlZ21lbnQgKGluY2x1ZGluZyBic3MpIGJ1dCBub3QgYXJndi9hcmdjL2Vudmlyb24uCisgKi8KKworc3RhdGljIGludCBsb2FkX2ZsYXRfc2hhcmVkX2xpYnJhcnkoaW50IGlkLCBzdHJ1Y3QgbGliX2luZm8gKmxpYnMpCit7CisJc3RydWN0IGxpbnV4X2JpbnBybSBicHJtOworCWludCByZXM7CisJY2hhciBidWZbMTZdOworCisJLyogQ3JlYXRlIHRoZSBmaWxlIG5hbWUgKi8KKwlzcHJpbnRmKGJ1ZiwgIi9saWIvbGliJWQuc28iLCBpZCk7CisKKwkvKiBPcGVuIHRoZSBmaWxlIHVwICovCisJYnBybS5maWxlbmFtZSA9IGJ1ZjsKKwlicHJtLmZpbGUgPSBvcGVuX2V4ZWMoYnBybS5maWxlbmFtZSk7CisJcmVzID0gUFRSX0VSUihicHJtLmZpbGUpOworCWlmIChJU19FUlIoYnBybS5maWxlKSkKKwkJcmV0dXJuIHJlczsKKworCXJlcyA9IHByZXBhcmVfYmlucHJtKCZicHJtKTsKKworCWlmIChyZXMgPD0gKHVuc2lnbmVkIGxvbmcpLTQwOTYpCisJCXJlcyA9IGxvYWRfZmxhdF9maWxlKCZicHJtLCBsaWJzLCBpZCwgTlVMTCk7CisJaWYgKGJwcm0uZmlsZSkgeworCQlhbGxvd193cml0ZV9hY2Nlc3MoYnBybS5maWxlKTsKKwkJZnB1dChicHJtLmZpbGUpOworCQlicHJtLmZpbGUgPSBOVUxMOworCX0KKwlyZXR1cm4ocmVzKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19CSU5GTVRfU0hBUkVEX0ZMQVQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgdXNlZCB0byBsb2FkIGZsYXQgc3R5bGUgZXhlY3V0YWJsZXMgYW5kIHNoYXJlZAorICogbGlicmFyaWVzLiAgVGhlcmUgaXMgbm8gYmluYXJ5IGRlcGVuZGVudCBjb2RlIGFueXdoZXJlIGVsc2UuCisgKi8KKworc3RhdGljIGludCBsb2FkX2ZsYXRfYmluYXJ5KHN0cnVjdCBsaW51eF9iaW5wcm0gKiBicHJtLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IGxpYl9pbmZvIGxpYmluZm87CisJdW5zaWduZWQgbG9uZyBwID0gYnBybS0+cDsKKwl1bnNpZ25lZCBsb25nIHN0YWNrX2xlbjsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHI7CisJdW5zaWduZWQgbG9uZyAqc3A7CisJaW50IHJlczsKKwlpbnQgaSwgajsKKworCW1lbXNldCgmbGliaW5mbywgMCwgc2l6ZW9mKGxpYmluZm8pKTsKKwkvKgorCSAqIFdlIGhhdmUgdG8gYWRkIHRoZSBzaXplIG9mIG91ciBhcmd1bWVudHMgdG8gb3VyIHN0YWNrIHNpemUKKwkgKiBvdGhlcndpc2UgaXQncyB0b28gZWFzeSBmb3IgdXNlcnMgdG8gY3JlYXRlIHN0YWNrIG92ZXJmbG93cworCSAqIGJ5IHBhc3NpbmcgaW4gYSBodWdlIGFyZ3VtZW50IGxpc3QuICBBbmQgeWVzLCAgd2UgaGF2ZSB0byBiZQorCSAqIHBlZGFudGljIGFuZCBpbmNsdWRlIHNwYWNlIGZvciB0aGUgYXJndi9lbnZwIGFycmF5IGFzIGl0IG1heSBoYXZlCisJICogYSBsb3Qgb2YgZW50cmllcy4KKwkgKi8KKyNkZWZpbmUgVE9QX09GX0FSR1MgKFBBR0VfU0laRSAqIE1BWF9BUkdfUEFHRVMgLSBzaXplb2Yodm9pZCAqKSkKKwlzdGFja19sZW4gPSBUT1BfT0ZfQVJHUyAtIGJwcm0tPnA7ICAgICAgICAgICAgIC8qIHRoZSBzdHJpbmdzICovCisJc3RhY2tfbGVuICs9IChicHJtLT5hcmdjICsgMSkgKiBzaXplb2YoY2hhciAqKTsgLyogdGhlIGFyZ3YgYXJyYXkgKi8KKwlzdGFja19sZW4gKz0gKGJwcm0tPmVudmMgKyAxKSAqIHNpemVvZihjaGFyICopOyAvKiB0aGUgZW52cCBhcnJheSAqLworCisJCisJcmVzID0gbG9hZF9mbGF0X2ZpbGUoYnBybSwgJmxpYmluZm8sIDAsICZzdGFja19sZW4pOworCWlmIChyZXMgPiAodW5zaWduZWQgbG9uZyktNDA5NikKKwkJcmV0dXJuIHJlczsKKwkKKwkvKiBVcGRhdGUgZGF0YSBzZWdtZW50IHBvaW50ZXJzIGZvciBhbGwgbGlicmFyaWVzICovCisJZm9yIChpPTA7IGk8TUFYX1NIQVJFRF9MSUJTOyBpKyspCisJCWlmIChsaWJpbmZvLmxpYl9saXN0W2ldLmxvYWRlZCkKKwkJCWZvciAoaj0wOyBqPE1BWF9TSEFSRURfTElCUzsgaisrKQorCQkJCSgtKGorMSkpWyh1bnNpZ25lZCBsb25nICopKGxpYmluZm8ubGliX2xpc3RbaV0uc3RhcnRfZGF0YSldID0KKwkJCQkJKGxpYmluZm8ubGliX2xpc3Rbal0ubG9hZGVkKT8KKwkJCQkJCWxpYmluZm8ubGliX2xpc3Rbal0uc3RhcnRfZGF0YTpVTkxPQURFRF9MSUI7CisKKwljb21wdXRlX2NyZWRzKGJwcm0pOworIAljdXJyZW50LT5mbGFncyAmPSB+UEZfRk9SS05PRVhFQzsKKworCXNldF9iaW5mbXQoJmZsYXRfZm9ybWF0KTsKKworCXAgPSAoKGN1cnJlbnQtPm1tLT5jb250ZXh0LmVuZF9icmsgKyBzdGFja19sZW4gKyAzKSAmIH4zKSAtIDQ7CisJREJHX0ZMVCgicD0leFxuIiwgKGludClwKTsKKworCS8qIGNvcHkgdGhlIGFyZyBwYWdlcyBvbnRvIHRoZSBzdGFjaywgdGhpcyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudCA6LSkgKi8KKwlmb3IgKGkgPSBUT1BfT0ZfQVJHUyAtIDE7IGkgPj0gYnBybS0+cDsgaS0tKQorCQkqIChjaGFyICopIC0tcCA9CisJCQkoKGNoYXIgKikgcGFnZV9hZGRyZXNzKGJwcm0tPnBhZ2VbaS9QQUdFX1NJWkVdKSlbaSAlIFBBR0VfU0laRV07CisKKwlzcCA9ICh1bnNpZ25lZCBsb25nICopIGNyZWF0ZV9mbGF0X3RhYmxlcyhwLCBicHJtKTsKKwkKKwkvKiBGYWtlIHNvbWUgcmV0dXJuIGFkZHJlc3NlcyB0byBlbnN1cmUgdGhlIGNhbGwgY2hhaW4gd2lsbAorCSAqIGluaXRpYWxpc2UgbGlicmFyeSBpbiBvcmRlciBmb3IgdXMuICBXZSBhcmUgcmVxdWlyZWQgdG8gY2FsbAorCSAqIGxpYiAxIGZpcnN0LCB0aGVuIDIsIC4uLiBhbmQgZmluYWxseSB0aGUgbWFpbiBwcm9ncmFtIChpZCAwKS4KKwkgKi8KKwlzdGFydF9hZGRyID0gbGliaW5mby5saWJfbGlzdFswXS5lbnRyeTsKKworI2lmZGVmIENPTkZJR19CSU5GTVRfU0hBUkVEX0ZMQVQKKwlmb3IgKGkgPSBNQVhfU0hBUkVEX0xJQlMtMTsgaT4wOyBpLS0pIHsKKwkJaWYgKGxpYmluZm8ubGliX2xpc3RbaV0ubG9hZGVkKSB7CisJCQkvKiBQdXNoIHByZXZpb3MgZmlyc3QgdG8gY2FsbCBhZGRyZXNzICovCisJCQktLXNwOwlwdXRfdXNlcihzdGFydF9hZGRyLCBzcCk7CisJCQlzdGFydF9hZGRyID0gbGliaW5mby5saWJfbGlzdFtpXS5lbnRyeTsKKwkJfQorCX0KKyNlbmRpZgorCQorCS8qIFN0YXNoIG91ciBpbml0aWFsIHN0YWNrIHBvaW50ZXIgaW50byB0aGUgbW0gc3RydWN0dXJlICovCisJY3VycmVudC0+bW0tPnN0YXJ0X3N0YWNrID0gKHVuc2lnbmVkIGxvbmcgKXNwOworCisJCisJREJHX0ZMVCgic3RhcnRfdGhyZWFkKHJlZ3M9MHgleCwgZW50cnk9MHgleCwgc3RhcnRfc3RhY2s9MHgleClcbiIsCisJCShpbnQpcmVncywgKGludClzdGFydF9hZGRyLCAoaW50KWN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayk7CisJCisJc3RhcnRfdGhyZWFkKHJlZ3MsIHN0YXJ0X2FkZHIsIGN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayk7CisKKwlpZiAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkKKwkJc2VuZF9zaWcoU0lHVFJBUCwgY3VycmVudCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZmxhdF9iaW5mbXQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfYmluZm10KCZmbGF0X2Zvcm1hdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2ZsYXRfYmluZm10KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9iaW5mbXQoJmZsYXRfZm9ybWF0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NvcmVfaW5pdGNhbGwoaW5pdF9mbGF0X2JpbmZtdCk7Cittb2R1bGVfZXhpdChleGl0X2ZsYXRfYmluZm10KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfbWlzYy5jIGIvZnMvYmluZm10X21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWUwZGI2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYmluZm10X21pc2MuYwpAQCAtMCwwICsxLDc4MCBAQAorLyoKKyAqICBiaW5mbXRfbWlzYy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NyBSaWNoYXJkIEf8bnRoZXIKKyAqCisgKiAgYmluZm10X21pc2MgZGV0ZWN0cyBiaW5hcmllcyB2aWEgYSBtYWdpYyBvciBmaWxlbmFtZSBleHRlbnNpb24gYW5kIGludm9rZXMKKyAqICBhIHNwZWNpZmllZCB3cmFwcGVyLiBUaGlzIHNob3VsZCBvYnNvbGV0ZSBiaW5mbXRfamF2YSwgYmluZm10X2VtODYgYW5kCisgKiAgYmluZm10X216LgorICoKKyAqICAxOTk3LTA0LTI1IGZpcnN0IHZlcnNpb24KKyAqICBbLi4uXQorICogIDE5OTctMDUtMTkgY2xlYW51cAorICogIDE5OTctMDYtMjYgaHBhOiBwYXNzIHRoZSByZWFsIGZpbGVuYW1lIHJhdGhlciB0aGFuIGFyZ3ZbMF0KKyAqICAxOTk3LTA2LTMwIG1pbm9yIGNsZWFudXAKKyAqICAxOTk3LTA4LTA5IHJlbW92ZWQgZXh0ZW5zaW9uIHN0cmlwcGluZywgbG9ja2luZyBjbGVhbnVwCisgKiAgMjAwMS0wMi0yOCBBVjogcmV3cml0dGVuIGludG8gc29tZXRoaW5nIHRoYXQgcmVzZW1ibGVzIEMuIE9yaWdpbmFsIGRpZG4ndC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitlbnVtIHsKKwlWRVJCT1NFX1NUQVRVUyA9IDEgLyogbWFrZSBpdCB6ZXJvIHRvIHNhdmUgNDAwIGJ5dGVzIGtlcm5lbCBtZW1vcnkgKi8KK307CisKK3N0YXRpYyBMSVNUX0hFQUQoZW50cmllcyk7CitzdGF0aWMgaW50IGVuYWJsZWQgPSAxOworCitlbnVtIHtFbmFibGVkLCBNYWdpY307CisjZGVmaW5lIE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwICgxPDwzMSkKKyNkZWZpbmUgTUlTQ19GTVRfT1BFTl9CSU5BUlkgKDE8PDMwKQorI2RlZmluZSBNSVNDX0ZNVF9DUkVERU5USUFMUyAoMTw8MjkpCisKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdW5zaWduZWQgbG9uZyBmbGFnczsJCS8qIHR5cGUsIHN0YXR1cywgZXRjLiAqLworCWludCBvZmZzZXQ7CQkJLyogb2Zmc2V0IG9mIG1hZ2ljICovCisJaW50IHNpemU7CQkJLyogc2l6ZSBvZiBtYWdpYy9tYXNrICovCisJY2hhciAqbWFnaWM7CQkJLyogbWFnaWMgb3IgZmlsZW5hbWUgZXh0ZW5zaW9uICovCisJY2hhciAqbWFzazsJCQkvKiBtYXNrLCBOVUxMIGZvciBleGFjdCBtYXRjaCAqLworCWNoYXIgKmludGVycHJldGVyOwkJLyogZmlsZW5hbWUgb2YgaW50ZXJwcmV0ZXIgKi8KKwljaGFyICpuYW1lOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKK30gTm9kZTsKKworc3RhdGljIERFRklORV9SV0xPQ0soZW50cmllc19sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKmJtX21udDsKK3N0YXRpYyBpbnQgZW50cnlfY291bnQ7CisKKy8qIAorICogQ2hlY2sgaWYgd2Ugc3VwcG9ydCB0aGUgYmluZm10CisgKiBpZiB3ZSBkbywgcmV0dXJuIHRoZSBub2RlLCBlbHNlIE5VTEwKKyAqIGxvY2tpbmcgaXMgZG9uZSBpbiBsb2FkX21pc2NfYmluYXJ5CisgKi8KK3N0YXRpYyBOb2RlICpjaGVja19maWxlKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCit7CisJY2hhciAqcCA9IHN0cnJjaHIoYnBybS0+aW50ZXJwLCAnLicpOworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisKKwlsaXN0X2Zvcl9lYWNoKGwsICZlbnRyaWVzKSB7CisJCU5vZGUgKmUgPSBsaXN0X2VudHJ5KGwsIE5vZGUsIGxpc3QpOworCQljaGFyICpzOworCQlpbnQgajsKKworCQlpZiAoIXRlc3RfYml0KEVuYWJsZWQsICZlLT5mbGFncykpCisJCQljb250aW51ZTsKKworCQlpZiAoIXRlc3RfYml0KE1hZ2ljLCAmZS0+ZmxhZ3MpKSB7CisJCQlpZiAocCAmJiAhc3RyY21wKGUtPm1hZ2ljLCBwICsgMSkpCisJCQkJcmV0dXJuIGU7CisJCQljb250aW51ZTsKKwkJfQorCisJCXMgPSBicHJtLT5idWYgKyBlLT5vZmZzZXQ7CisJCWlmIChlLT5tYXNrKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgZS0+c2l6ZTsgaisrKQorCQkJCWlmICgoKnMrKyBeIGUtPm1hZ2ljW2pdKSAmIGUtPm1hc2tbal0pCisJCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJZm9yIChqID0gMDsgaiA8IGUtPnNpemU7IGorKykKKwkJCQlpZiAoKCpzKysgXiBlLT5tYWdpY1tqXSkpCisJCQkJCWJyZWFrOworCQl9CisJCWlmIChqID09IGUtPnNpemUpCisJCQlyZXR1cm4gZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiB0aGUgbG9hZGVyIGl0c2VsZgorICovCitzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJTm9kZSAqZm10OworCXN0cnVjdCBmaWxlICogaW50ZXJwX2ZpbGUgPSBOVUxMOworCWNoYXIgaW5hbWVbQklOUFJNX0JVRl9TSVpFXTsKKwljaGFyICppbmFtZV9hZGRyID0gaW5hbWU7CisJaW50IHJldHZhbDsKKwlpbnQgZmRfYmluYXJ5ID0gLTE7CisJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBOVUxMOworCisJcmV0dmFsID0gLUVOT0VYRUM7CisJaWYgKCFlbmFibGVkKQorCQlnb3RvIF9yZXQ7CisKKwkvKiB0byBrZWVwIGxvY2tpbmcgdGltZSBsb3csIHdlIGNvcHkgdGhlIGludGVycHJldGVyIHN0cmluZyAqLworCXJlYWRfbG9jaygmZW50cmllc19sb2NrKTsKKwlmbXQgPSBjaGVja19maWxlKGJwcm0pOworCWlmIChmbXQpCisJCXN0cmxjcHkoaW5hbWUsIGZtdC0+aW50ZXJwcmV0ZXIsIEJJTlBSTV9CVUZfU0laRSk7CisJcmVhZF91bmxvY2soJmVudHJpZXNfbG9jayk7CisJaWYgKCFmbXQpCisJCWdvdG8gX3JldDsKKworCWlmICghKGZtdC0+ZmxhZ3MgJiBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMCkpIHsKKwkJcmVtb3ZlX2FyZ196ZXJvKGJwcm0pOworCX0KKworCWlmIChmbXQtPmZsYWdzICYgTUlTQ19GTVRfT1BFTl9CSU5BUlkpIHsKKworCQlmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOworCQlyZXR2YWwgPSB1bnNoYXJlX2ZpbGVzKCk7CisJCWlmIChyZXR2YWwgPCAwKQorCQkJZ290byBfcmV0OworCQlpZiAoZmlsZXMgPT0gY3VycmVudC0+ZmlsZXMpIHsKKwkJCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOworCQkJZmlsZXMgPSBOVUxMOworCQl9CisJCS8qIGlmIHRoZSBiaW5hcnkgc2hvdWxkIGJlIG9wZW5lZCBvbiBiZWhhbGYgb2YgdGhlCisJCSAqIGludGVycHJldGVyIHRoYW4ga2VlcCBpdCBvcGVuIGFuZCBhc3NpZ24gZGVzY3JpcHRvcgorCQkgKiB0byBpdCAqLworIAkJZmRfYmluYXJ5ID0gZ2V0X3VudXNlZF9mZCgpOworIAkJaWYgKGZkX2JpbmFyeSA8IDApIHsKKyAJCQlyZXR2YWwgPSBmZF9iaW5hcnk7CisgCQkJZ290byBfdW5zaGFyZTsKKyAJCX0KKyAJCWZkX2luc3RhbGwoZmRfYmluYXJ5LCBicHJtLT5maWxlKTsKKworCQkvKiBpZiB0aGUgYmluYXJ5IGlzIG5vdCByZWFkYWJsZSB0aGFuIGVuZm9yY2UgbW0tPmR1bXBhYmxlPTAKKwkJICAgcmVnYXJkbGVzcyBvZiB0aGUgaW50ZXJwcmV0ZXIncyBwZXJtaXNzaW9ucyAqLworCQlpZiAocGVybWlzc2lvbihicHJtLT5maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgTUFZX1JFQUQsIE5VTEwpKQorCQkJYnBybS0+aW50ZXJwX2ZsYWdzIHw9IEJJTlBSTV9GTEFHU19FTkZPUkNFX05PTkRVTVA7CisKKwkJYWxsb3dfd3JpdGVfYWNjZXNzKGJwcm0tPmZpbGUpOworCQlicHJtLT5maWxlID0gTlVMTDsKKworCQkvKiBtYXJrIHRoZSBicHJtIHRoYXQgZmQgc2hvdWxkIGJlIHBhc3NlZCB0byBpbnRlcnAgKi8KKwkJYnBybS0+aW50ZXJwX2ZsYWdzIHw9IEJJTlBSTV9GTEFHU19FWEVDRkQ7CisJCWJwcm0tPmludGVycF9kYXRhID0gZmRfYmluYXJ5OworCisgCX0gZWxzZSB7CisgCQlhbGxvd193cml0ZV9hY2Nlc3MoYnBybS0+ZmlsZSk7CisgCQlmcHV0KGJwcm0tPmZpbGUpOworIAkJYnBybS0+ZmlsZSA9IE5VTEw7CisgCX0KKwkvKiBtYWtlIGFyZ3ZbMV0gYmUgdGhlIHBhdGggdG8gdGhlIGJpbmFyeSAqLworCXJldHZhbCA9IGNvcHlfc3RyaW5nc19rZXJuZWwgKDEsICZicHJtLT5pbnRlcnAsIGJwcm0pOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIF9lcnJvcjsKKwlicHJtLT5hcmdjKys7CisKKwkvKiBhZGQgdGhlIGludGVycCBhcyBhcmd2WzBdICovCisJcmV0dmFsID0gY29weV9zdHJpbmdzX2tlcm5lbCAoMSwgJmluYW1lX2FkZHIsIGJwcm0pOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIF9lcnJvcjsKKwlicHJtLT5hcmdjICsrOworCisJYnBybS0+aW50ZXJwID0gaW5hbWU7CS8qIGZvciBiaW5mbXRfc2NyaXB0ICovCisKKwlpbnRlcnBfZmlsZSA9IG9wZW5fZXhlYyAoaW5hbWUpOworCXJldHZhbCA9IFBUUl9FUlIgKGludGVycF9maWxlKTsKKwlpZiAoSVNfRVJSIChpbnRlcnBfZmlsZSkpCisJCWdvdG8gX2Vycm9yOworCisJYnBybS0+ZmlsZSA9IGludGVycF9maWxlOworCWlmIChmbXQtPmZsYWdzICYgTUlTQ19GTVRfQ1JFREVOVElBTFMpIHsKKwkJLyoKKwkJICogTm8gbmVlZCB0byBjYWxsIHByZXBhcmVfYmlucHJtKCksIGl0J3MgYWxyZWFkeSBiZWVuCisJCSAqIGRvbmUuICBicHJtLT5idWYgaXMgc3RhbGUsIHVwZGF0ZSBmcm9tIGludGVycF9maWxlLgorCQkgKi8KKwkJbWVtc2V0KGJwcm0tPmJ1ZiwgMCwgQklOUFJNX0JVRl9TSVpFKTsKKwkJcmV0dmFsID0ga2VybmVsX3JlYWQoYnBybS0+ZmlsZSwgMCwgYnBybS0+YnVmLCBCSU5QUk1fQlVGX1NJWkUpOworCX0gZWxzZQorCQlyZXR2YWwgPSBwcmVwYXJlX2JpbnBybSAoYnBybSk7CisKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBfZXJyb3I7CisKKwlyZXR2YWwgPSBzZWFyY2hfYmluYXJ5X2hhbmRsZXIgKGJwcm0sIHJlZ3MpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIF9lcnJvcjsKKworCWlmIChmaWxlcykgeworCQlzdGVhbF9sb2NrcyhmaWxlcyk7CisJCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOworCQlmaWxlcyA9IE5VTEw7CisJfQorX3JldDoKKwlyZXR1cm4gcmV0dmFsOworX2Vycm9yOgorCWlmIChmZF9iaW5hcnkgPiAwKQorCQlzeXNfY2xvc2UoZmRfYmluYXJ5KTsKKwlicHJtLT5pbnRlcnBfZmxhZ3MgPSAwOworCWJwcm0tPmludGVycF9kYXRhID0gMDsKK191bnNoYXJlOgorCWlmIChmaWxlcykgeworCQlwdXRfZmlsZXNfc3RydWN0KGN1cnJlbnQtPmZpbGVzKTsKKwkJY3VycmVudC0+ZmlsZXMgPSBmaWxlczsKKwl9CisJZ290byBfcmV0OworfQorCisvKiBDb21tYW5kIHBhcnNlcnMgKi8KKworLyoKKyAqIHBhcnNlcyBhbmQgY29waWVzIG9uZSBhcmd1bWVudCBlbmNsb3NlZCBpbiBkZWwgZnJvbSAqc3AgdG8gKmRwLAorICogcmVjb2duaXNpbmcgdGhlIFx4IHNwZWNpYWwuCisgKiByZXR1cm5zIHBvaW50ZXIgdG8gdGhlIGNvcGllZCBhcmd1bWVudCBvciBOVUxMIGluIGNhc2Ugb2YgYW4KKyAqIGVycm9yIChhbmQgc2V0cyBlcnIpIG9yIG51bGwgYXJndW1lbnQgbGVuZ3RoLgorICovCitzdGF0aWMgY2hhciAqc2NhbmFyZyhjaGFyICpzLCBjaGFyIGRlbCkKK3sKKwljaGFyIGM7CisKKwl3aGlsZSAoKGMgPSAqcysrKSAhPSBkZWwpIHsKKwkJaWYgKGMgPT0gJ1xcJyAmJiAqcyA9PSAneCcpIHsKKwkJCXMrKzsKKwkJCWlmICghaXN4ZGlnaXQoKnMrKykpCisJCQkJcmV0dXJuIE5VTEw7CisJCQlpZiAoIWlzeGRpZ2l0KCpzKyspKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJfQorCXJldHVybiBzOworfQorCitzdGF0aWMgaW50IHVucXVvdGUoY2hhciAqZnJvbSkKK3sKKwljaGFyIGMgPSAwLCAqcyA9IGZyb20sICpwID0gZnJvbTsKKworCXdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcpIHsKKwkJaWYgKGMgPT0gJ1xcJyAmJiAqcyA9PSAneCcpIHsKKwkJCXMrKzsKKwkJCWMgPSB0b3VwcGVyKCpzKyspOworCQkJKnAgPSAoYyAtIChpc2RpZ2l0KGMpID8gJzAnIDogJ0EnIC0gMTApKSA8PCA0OworCQkJYyA9IHRvdXBwZXIoKnMrKyk7CisJCQkqcCsrIHw9IGMgLSAoaXNkaWdpdChjKSA/ICcwJyA6ICdBJyAtIDEwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCSpwKysgPSBjOworCX0KKwlyZXR1cm4gcCAtIGZyb207Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqIGNoZWNrX3NwZWNpYWxfZmxhZ3MgKGNoYXIgKiBzZnMsIE5vZGUgKiBlKQoreworCWNoYXIgKiBwID0gc2ZzOworCWludCBjb250ID0gMTsKKworCS8qIHNwZWNpYWwgZmxhZ3MgKi8KKwl3aGlsZSAoY29udCkgeworCQlzd2l0Y2ggKCpwKSB7CisJCQljYXNlICdQJzoKKwkJCQlwKys7CisJCQkJZS0+ZmxhZ3MgfD0gTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjA7CisJCQkJYnJlYWs7CisJCQljYXNlICdPJzoKKwkJCQlwKys7CisJCQkJZS0+ZmxhZ3MgfD0gTUlTQ19GTVRfT1BFTl9CSU5BUlk7CisJCQkJYnJlYWs7CisJCQljYXNlICdDJzoKKwkJCQlwKys7CisJCQkJLyogdGhpcyBmbGFncyBhbHNvIGltcGxpZXMgdGhlCisJCQkJICAgb3Blbi1iaW5hcnkgZmxhZyAqLworCQkJCWUtPmZsYWdzIHw9IChNSVNDX0ZNVF9DUkVERU5USUFMUyB8CisJCQkJCQlNSVNDX0ZNVF9PUEVOX0JJTkFSWSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWNvbnQgPSAwOworCQl9CisJfQorCisJcmV0dXJuIHA7Cit9CisvKgorICogVGhpcyByZWdpc3RlcnMgYSBuZXcgYmluYXJ5IGZvcm1hdCwgaXQgcmVjb2duaXNlcyB0aGUgc3ludGF4CisgKiAnOm5hbWU6dHlwZTpvZmZzZXQ6bWFnaWM6bWFzazppbnRlcnByZXRlcjpmbGFncycKKyAqIHdoZXJlIHRoZSAnOicgaXMgdGhlIElGUywgdGhhdCBjYW4gYmUgY2hvc2VuIHdpdGggdGhlIGZpcnN0IGNoYXIKKyAqLworc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpCit7CisJTm9kZSAqZTsKKwlpbnQgbWVtc2l6ZSwgZXJyOworCWNoYXIgKmJ1ZiwgKnA7CisJY2hhciBkZWw7CisKKwkvKiBzb21lIHNhbml0eSBjaGVja3MgKi8KKwllcnIgPSAtRUlOVkFMOworCWlmICgoY291bnQgPCAxMSkgfHwgKGNvdW50ID4gMjU2KSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRU5PTUVNOworCW1lbXNpemUgPSBzaXplb2YoTm9kZSkgKyBjb3VudCArIDg7CisJZSA9IChOb2RlICopIGttYWxsb2MobWVtc2l6ZSwgR0ZQX1VTRVIpOworCWlmICghZSkKKwkJZ290byBvdXQ7CisKKwlwID0gYnVmID0gKGNoYXIgKillICsgc2l6ZW9mKE5vZGUpOworCisJbWVtc2V0KGUsIDAsIHNpemVvZihOb2RlKSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBjb3VudCkpCisJCWdvdG8gRWZhdWx0OworCisJZGVsID0gKnArKzsJLyogZGVsaW1ldGVyICovCisKKwltZW1zZXQoYnVmK2NvdW50LCBkZWwsIDgpOworCisJZS0+bmFtZSA9IHA7CisJcCA9IHN0cmNocihwLCBkZWwpOworCWlmICghcCkKKwkJZ290byBFaW52YWw7CisJKnArKyA9ICdcMCc7CisJaWYgKCFlLT5uYW1lWzBdIHx8CisJICAgICFzdHJjbXAoZS0+bmFtZSwgIi4iKSB8fAorCSAgICAhc3RyY21wKGUtPm5hbWUsICIuLiIpIHx8CisJICAgIHN0cmNocihlLT5uYW1lLCAnLycpKQorCQlnb3RvIEVpbnZhbDsKKwlzd2l0Y2ggKCpwKyspIHsKKwkJY2FzZSAnRSc6IGUtPmZsYWdzID0gMTw8RW5hYmxlZDsgYnJlYWs7CisJCWNhc2UgJ00nOiBlLT5mbGFncyA9ICgxPDxFbmFibGVkKSB8ICgxPDxNYWdpYyk7IGJyZWFrOworCQlkZWZhdWx0OiBnb3RvIEVpbnZhbDsKKwl9CisJaWYgKCpwKysgIT0gZGVsKQorCQlnb3RvIEVpbnZhbDsKKwlpZiAodGVzdF9iaXQoTWFnaWMsICZlLT5mbGFncykpIHsKKwkJY2hhciAqcyA9IHN0cmNocihwLCBkZWwpOworCQlpZiAoIXMpCisJCQlnb3RvIEVpbnZhbDsKKwkJKnMrKyA9ICdcMCc7CisJCWUtPm9mZnNldCA9IHNpbXBsZV9zdHJ0b3VsKHAsICZwLCAxMCk7CisJCWlmICgqcCsrKQorCQkJZ290byBFaW52YWw7CisJCWUtPm1hZ2ljID0gcDsKKwkJcCA9IHNjYW5hcmcocCwgZGVsKTsKKwkJaWYgKCFwKQorCQkJZ290byBFaW52YWw7CisJCXBbLTFdID0gJ1wwJzsKKwkJaWYgKCFlLT5tYWdpY1swXSkKKwkJCWdvdG8gRWludmFsOworCQllLT5tYXNrID0gcDsKKwkJcCA9IHNjYW5hcmcocCwgZGVsKTsKKwkJaWYgKCFwKQorCQkJZ290byBFaW52YWw7CisJCXBbLTFdID0gJ1wwJzsKKwkJaWYgKCFlLT5tYXNrWzBdKQorCQkJZS0+bWFzayA9IE5VTEw7CisJCWUtPnNpemUgPSB1bnF1b3RlKGUtPm1hZ2ljKTsKKwkJaWYgKGUtPm1hc2sgJiYgdW5xdW90ZShlLT5tYXNrKSAhPSBlLT5zaXplKQorCQkJZ290byBFaW52YWw7CisJCWlmIChlLT5zaXplICsgZS0+b2Zmc2V0ID4gQklOUFJNX0JVRl9TSVpFKQorCQkJZ290byBFaW52YWw7CisJfSBlbHNlIHsKKwkJcCA9IHN0cmNocihwLCBkZWwpOworCQlpZiAoIXApCisJCQlnb3RvIEVpbnZhbDsKKwkJKnArKyA9ICdcMCc7CisJCWUtPm1hZ2ljID0gcDsKKwkJcCA9IHN0cmNocihwLCBkZWwpOworCQlpZiAoIXApCisJCQlnb3RvIEVpbnZhbDsKKwkJKnArKyA9ICdcMCc7CisJCWlmICghZS0+bWFnaWNbMF0gfHwgc3RyY2hyKGUtPm1hZ2ljLCAnLycpKQorCQkJZ290byBFaW52YWw7CisJCXAgPSBzdHJjaHIocCwgZGVsKTsKKwkJaWYgKCFwKQorCQkJZ290byBFaW52YWw7CisJCSpwKysgPSAnXDAnOworCX0KKwllLT5pbnRlcnByZXRlciA9IHA7CisJcCA9IHN0cmNocihwLCBkZWwpOworCWlmICghcCkKKwkJZ290byBFaW52YWw7CisJKnArKyA9ICdcMCc7CisJaWYgKCFlLT5pbnRlcnByZXRlclswXSkKKwkJZ290byBFaW52YWw7CisKKworCXAgPSBjaGVja19zcGVjaWFsX2ZsYWdzIChwLCBlKTsKKworCWlmICgqcCA9PSAnXG4nKQorCQlwKys7CisJaWYgKHAgIT0gYnVmICsgY291bnQpCisJCWdvdG8gRWludmFsOworCXJldHVybiBlOworCitvdXQ6CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKworRWZhdWx0OgorCWtmcmVlKGUpOworCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworRWludmFsOgorCWtmcmVlKGUpOworCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworfQorCisvKgorICogU2V0IHN0YXR1cyBvZiBlbnRyeS9iaW5mbXRfbWlzYzoKKyAqICcxJyBlbmFibGVzLCAnMCcgZGlzYWJsZXMgYW5kICctMScgY2xlYXJzIGVudHJ5L2JpbmZtdF9taXNjCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfY29tbWFuZChjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpCit7CisJY2hhciBzWzRdOworCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIDA7CisJaWYgKGNvdW50ID4gMykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNvcHlfZnJvbV91c2VyKHMsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoc1tjb3VudC0xXSA9PSAnXG4nKQorCQljb3VudC0tOworCWlmIChjb3VudCA9PSAxICYmIHNbMF0gPT0gJzAnKQorCQlyZXR1cm4gMTsKKwlpZiAoY291bnQgPT0gMSAmJiBzWzBdID09ICcxJykKKwkJcmV0dXJuIDI7CisJaWYgKGNvdW50ID09IDIgJiYgc1swXSA9PSAnLScgJiYgc1sxXSA9PSAnMScpCisJCXJldHVybiAzOworCXJldHVybiAtRUlOVkFMOworfQorCisvKiBnZW5lcmljIHN0dWZmICovCisKK3N0YXRpYyB2b2lkIGVudHJ5X3N0YXR1cyhOb2RlICplLCBjaGFyICpwYWdlKQoreworCWNoYXIgKmRwOworCWNoYXIgKnN0YXR1cyA9ICJkaXNhYmxlZCI7CisJY29uc3QgY2hhciAqIGZsYWdzID0gImZsYWdzOiAiOworCisJaWYgKHRlc3RfYml0KEVuYWJsZWQsICZlLT5mbGFncykpCisJCXN0YXR1cyA9ICJlbmFibGVkIjsKKworCWlmICghVkVSQk9TRV9TVEFUVVMpIHsKKwkJc3ByaW50ZihwYWdlLCAiJXNcbiIsIHN0YXR1cyk7CisJCXJldHVybjsKKwl9CisKKwlzcHJpbnRmKHBhZ2UsICIlc1xuaW50ZXJwcmV0ZXIgJXNcbiIsIHN0YXR1cywgZS0+aW50ZXJwcmV0ZXIpOworCWRwID0gcGFnZSArIHN0cmxlbihwYWdlKTsKKworCS8qIHByaW50IHRoZSBzcGVjaWFsIGZsYWdzICovCisJc3ByaW50ZiAoZHAsICIlcyIsIGZsYWdzKTsKKwlkcCArPSBzdHJsZW4gKGZsYWdzKTsKKwlpZiAoZS0+ZmxhZ3MgJiBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMCkgeworCQkqZHAgKysgPSAnUCc7CisJfQorCWlmIChlLT5mbGFncyAmIE1JU0NfRk1UX09QRU5fQklOQVJZKSB7CisJCSpkcCArKyA9ICdPJzsKKwl9CisJaWYgKGUtPmZsYWdzICYgTUlTQ19GTVRfQ1JFREVOVElBTFMpIHsKKwkJKmRwICsrID0gJ0MnOworCX0KKwkqZHAgKysgPSAnXG4nOworCisKKwlpZiAoIXRlc3RfYml0KE1hZ2ljLCAmZS0+ZmxhZ3MpKSB7CisJCXNwcmludGYoZHAsICJleHRlbnNpb24gLiVzXG4iLCBlLT5tYWdpYyk7CisJfSBlbHNlIHsKKwkJaW50IGk7CisKKwkJc3ByaW50ZihkcCwgIm9mZnNldCAlaVxubWFnaWMgIiwgZS0+b2Zmc2V0KTsKKwkJZHAgPSBwYWdlICsgc3RybGVuKHBhZ2UpOworCQlmb3IgKGkgPSAwOyBpIDwgZS0+c2l6ZTsgaSsrKSB7CisJCQlzcHJpbnRmKGRwLCAiJTAyeCIsIDB4ZmYgJiAoaW50KSAoZS0+bWFnaWNbaV0pKTsKKwkJCWRwICs9IDI7CisJCX0KKwkJaWYgKGUtPm1hc2spIHsKKwkJCXNwcmludGYoZHAsICJcbm1hc2sgIik7CisJCQlkcCArPSA2OworCQkJZm9yIChpID0gMDsgaSA8IGUtPnNpemU7IGkrKykgeworCQkJCXNwcmludGYoZHAsICIlMDJ4IiwgMHhmZiAmIChpbnQpIChlLT5tYXNrW2ldKSk7CisJCQkJZHAgKz0gMjsKKwkJCX0KKwkJfQorCQkqZHArKyA9ICdcbic7CisJCSpkcCA9ICdcMCc7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGlub2RlICpibV9nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vZGUpCit7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCisJaWYgKGlub2RlKSB7CisJCWlub2RlLT5pX21vZGUgPSBtb2RlOworCQlpbm9kZS0+aV91aWQgPSAwOworCQlpbm9kZS0+aV9naWQgPSAwOworCQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCQlpbm9kZS0+aV9ibG9ja3MgPSAwOworCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPQorCQkJY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKwl9CisJcmV0dXJuIGlub2RlOworfQorCitzdGF0aWMgdm9pZCBibV9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWtmcmVlKGlub2RlLT51LmdlbmVyaWNfaXApOworfQorCitzdGF0aWMgdm9pZCBraWxsX25vZGUoTm9kZSAqZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisKKwl3cml0ZV9sb2NrKCZlbnRyaWVzX2xvY2spOworCWRlbnRyeSA9IGUtPmRlbnRyeTsKKwlpZiAoZGVudHJ5KSB7CisJCWxpc3RfZGVsX2luaXQoJmUtPmxpc3QpOworCQllLT5kZW50cnkgPSBOVUxMOworCX0KKwl3cml0ZV91bmxvY2soJmVudHJpZXNfbG9jayk7CisKKwlpZiAoZGVudHJ5KSB7CisJCWRlbnRyeS0+ZF9pbm9kZS0+aV9ubGluay0tOworCQlkX2Ryb3AoZGVudHJ5KTsKKwkJZHB1dChkZW50cnkpOworCQlzaW1wbGVfcmVsZWFzZV9mcygmYm1fbW50LCAmZW50cnlfY291bnQpOworCX0KK30KKworLyogLzxlbnRyeT4gKi8KKworc3RhdGljIHNzaXplX3QKK2JtX2VudHJ5X3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQoreworCU5vZGUgKmUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+dS5nZW5lcmljX2lwOworCWxvZmZfdCBwb3MgPSAqcHBvczsKKwlzc2l6ZV90IHJlczsKKwljaGFyICpwYWdlOworCWludCBsZW47CisKKwlpZiAoIShwYWdlID0gKGNoYXIqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVudHJ5X3N0YXR1cyhlLCBwYWdlKTsKKwlsZW4gPSBzdHJsZW4ocGFnZSk7CisKKwlyZXMgPSAtRUlOVkFMOworCWlmIChwb3MgPCAwKQorCQlnb3RvIG91dDsKKwlyZXMgPSAwOworCWlmIChwb3MgPj0gbGVuKQorCQlnb3RvIG91dDsKKwlpZiAobGVuIDwgcG9zICsgbmJ5dGVzKQorCQluYnl0ZXMgPSBsZW4gLSBwb3M7CisJcmVzID0gLUVGQVVMVDsKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgcGFnZSArIHBvcywgbmJ5dGVzKSkKKwkJZ290byBvdXQ7CisJKnBwb3MgPSBwb3MgKyBuYnl0ZXM7CisJcmVzID0gbmJ5dGVzOworb3V0OgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcGFnZSk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHNzaXplX3QgYm1fZW50cnlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGRlbnRyeSAqcm9vdDsKKwlOb2RlICplID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPnUuZ2VuZXJpY19pcDsKKwlpbnQgcmVzID0gcGFyc2VfY29tbWFuZChidWZmZXIsIGNvdW50KTsKKworCXN3aXRjaCAocmVzKSB7CisJCWNhc2UgMTogY2xlYXJfYml0KEVuYWJsZWQsICZlLT5mbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSAyOiBzZXRfYml0KEVuYWJsZWQsICZlLT5mbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSAzOiByb290ID0gZGdldChmaWxlLT5mX3Zmc21udC0+bW50X3NiLT5zX3Jvb3QpOworCQkJZG93bigmcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOworCisJCQlraWxsX25vZGUoZSk7CisKKwkJCXVwKCZyb290LT5kX2lub2RlLT5pX3NlbSk7CisJCQlkcHV0KHJvb3QpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IHJldHVybiByZXM7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYm1fZW50cnlfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBibV9lbnRyeV9yZWFkLAorCS53cml0ZQkJPSBibV9lbnRyeV93cml0ZSwKK307CisKKy8qIC9yZWdpc3RlciAqLworCitzdGF0aWMgc3NpemVfdCBibV9yZWdpc3Rlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlOb2RlICplOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqcm9vdCwgKmRlbnRyeTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZmlsZS0+Zl92ZnNtbnQtPm1udF9zYjsKKwlpbnQgZXJyID0gMDsKKworCWUgPSBjcmVhdGVfZW50cnkoYnVmZmVyLCBjb3VudCk7CisKKwlpZiAoSVNfRVJSKGUpKQorCQlyZXR1cm4gUFRSX0VSUihlKTsKKworCXJvb3QgPSBkZ2V0KHNiLT5zX3Jvb3QpOworCWRvd24oJnJvb3QtPmRfaW5vZGUtPmlfc2VtKTsKKwlkZW50cnkgPSBsb29rdXBfb25lX2xlbihlLT5uYW1lLCByb290LCBzdHJsZW4oZS0+bmFtZSkpOworCWVyciA9IFBUUl9FUlIoZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGRlbnRyeSkpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVFWElTVDsKKwlpZiAoZGVudHJ5LT5kX2lub2RlKQorCQlnb3RvIG91dDI7CisKKwlpbm9kZSA9IGJtX2dldF9pbm9kZShzYiwgU19JRlJFRyB8IDA2NDQpOworCisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWlub2RlKQorCQlnb3RvIG91dDI7CisKKwllcnIgPSBzaW1wbGVfcGluX2ZzKCJiaW5mbXRfbWlzYyIsICZibV9tbnQsICZlbnRyeV9jb3VudCk7CisJaWYgKGVycikgeworCQlpcHV0KGlub2RlKTsKKwkJaW5vZGUgPSBOVUxMOworCQlnb3RvIG91dDI7CisJfQorCisJZS0+ZGVudHJ5ID0gZGdldChkZW50cnkpOworCWlub2RlLT51LmdlbmVyaWNfaXAgPSBlOworCWlub2RlLT5pX2ZvcCA9ICZibV9lbnRyeV9vcGVyYXRpb25zOworCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwl3cml0ZV9sb2NrKCZlbnRyaWVzX2xvY2spOworCWxpc3RfYWRkKCZlLT5saXN0LCAmZW50cmllcyk7CisJd3JpdGVfdW5sb2NrKCZlbnRyaWVzX2xvY2spOworCisJZXJyID0gMDsKK291dDI6CisJZHB1dChkZW50cnkpOworb3V0OgorCXVwKCZyb290LT5kX2lub2RlLT5pX3NlbSk7CisJZHB1dChyb290KTsKKworCWlmIChlcnIpIHsKKwkJa2ZyZWUoZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJtX3JlZ2lzdGVyX29wZXJhdGlvbnMgPSB7CisJLndyaXRlCQk9IGJtX3JlZ2lzdGVyX3dyaXRlLAorfTsKKworLyogL3N0YXR1cyAqLworCitzdGF0aWMgc3NpemVfdAorYm1fc3RhdHVzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyICpzID0gZW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCI7CisJaW50IGxlbiA9IHN0cmxlbihzKTsKKwlsb2ZmX3QgcG9zID0gKnBwb3M7CisKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBvcyA+PSBsZW4pCisJCXJldHVybiAwOworCWlmIChsZW4gPCBwb3MgKyBuYnl0ZXMpCisJCW5ieXRlcyA9IGxlbiAtIHBvczsKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgcyArIHBvcywgbmJ5dGVzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJKnBwb3MgPSBwb3MgKyBuYnl0ZXM7CisJcmV0dXJuIG5ieXRlczsKK30KKworc3RhdGljIHNzaXplX3QgYm1fc3RhdHVzX3dyaXRlKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCByZXMgPSBwYXJzZV9jb21tYW5kKGJ1ZmZlciwgY291bnQpOworCXN0cnVjdCBkZW50cnkgKnJvb3Q7CisKKwlzd2l0Y2ggKHJlcykgeworCQljYXNlIDE6IGVuYWJsZWQgPSAwOyBicmVhazsKKwkJY2FzZSAyOiBlbmFibGVkID0gMTsgYnJlYWs7CisJCWNhc2UgMzogcm9vdCA9IGRnZXQoZmlsZS0+Zl92ZnNtbnQtPm1udF9zYi0+c19yb290KTsKKwkJCWRvd24oJnJvb3QtPmRfaW5vZGUtPmlfc2VtKTsKKworCQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZlbnRyaWVzKSkKKwkJCQlraWxsX25vZGUobGlzdF9lbnRyeShlbnRyaWVzLm5leHQsIE5vZGUsIGxpc3QpKTsKKworCQkJdXAoJnJvb3QtPmRfaW5vZGUtPmlfc2VtKTsKKwkJCWRwdXQocm9vdCk7CisJCWRlZmF1bHQ6IHJldHVybiByZXM7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYm1fc3RhdHVzX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gYm1fc3RhdHVzX3JlYWQsCisJLndyaXRlCQk9IGJtX3N0YXR1c193cml0ZSwKK307CisKKy8qIFN1cGVyYmxvY2sgaGFuZGxpbmcgKi8KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHNfb3BzID0geworCS5zdGF0ZnMJCT0gc2ltcGxlX3N0YXRmcywKKwkuY2xlYXJfaW5vZGUJPSBibV9jbGVhcl9pbm9kZSwKK307CisKK3N0YXRpYyBpbnQgYm1fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgdm9pZCAqIGRhdGEsIGludCBzaWxlbnQpCit7CisJc3RhdGljIHN0cnVjdCB0cmVlX2Rlc2NyIGJtX2ZpbGVzW10gPSB7CisJCVsxXSA9IHsic3RhdHVzIiwgJmJtX3N0YXR1c19vcGVyYXRpb25zLCBTX0lXVVNSfFNfSVJVR099LAorCQlbMl0gPSB7InJlZ2lzdGVyIiwgJmJtX3JlZ2lzdGVyX29wZXJhdGlvbnMsIFNfSVdVU1J9LAorCQkvKiBsYXN0IG9uZSAqLyB7IiJ9CisJfTsKKwlpbnQgZXJyID0gc2ltcGxlX2ZpbGxfc3VwZXIoc2IsIDB4NDI0OTRlNGQsIGJtX2ZpbGVzKTsKKwlpZiAoIWVycikKKwkJc2ItPnNfb3AgPSAmc19vcHM7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqYm1fZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIGJtX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGxpbnV4X2JpbmZtdCBtaXNjX2Zvcm1hdCA9IHsKKwkubW9kdWxlID0gVEhJU19NT0RVTEUsCisJLmxvYWRfYmluYXJ5ID0gbG9hZF9taXNjX2JpbmFyeSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBibV9mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiYmluZm10X21pc2MiLAorCS5nZXRfc2IJCT0gYm1fZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9saXR0ZXJfc3VwZXIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X21pc2NfYmluZm10KHZvaWQpCit7CisJaW50IGVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmJtX2ZzX3R5cGUpOworCWlmICghZXJyKSB7CisJCWVyciA9IHJlZ2lzdGVyX2JpbmZtdCgmbWlzY19mb3JtYXQpOworCQlpZiAoZXJyKQorCQkJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZibV9mc190eXBlKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbWlzY19iaW5mbXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2JpbmZtdCgmbWlzY19mb3JtYXQpOworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmYm1fZnNfdHlwZSk7Cit9CisKK2NvcmVfaW5pdGNhbGwoaW5pdF9taXNjX2JpbmZtdCk7Cittb2R1bGVfZXhpdChleGl0X21pc2NfYmluZm10KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9zY3JpcHQuYyBiL2ZzL2JpbmZtdF9zY3JpcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWRiY2NhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYmluZm10X3NjcmlwdC5jCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogIGxpbnV4L2ZzL2JpbmZtdF9zY3JpcHQuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTYgIE1hcnRpbiB2b24gTPZ3aXMKKyAqICBvcmlnaW5hbCAjIS1jaGVja2luZyBpbXBsZW1lbnRlZCBieSB0eXRzby4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKK3N0YXRpYyBpbnQgbG9hZF9zY3JpcHQoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSxzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwljaGFyICpjcCwgKmlfbmFtZSwgKmlfYXJnOworCXN0cnVjdCBmaWxlICpmaWxlOworCWNoYXIgaW50ZXJwW0JJTlBSTV9CVUZfU0laRV07CisJaW50IHJldHZhbDsKKworCWlmICgoYnBybS0+YnVmWzBdICE9ICcjJykgfHwgKGJwcm0tPmJ1ZlsxXSAhPSAnIScpIHx8IChicHJtLT5zaF9iYW5nKSkgCisJCXJldHVybiAtRU5PRVhFQzsKKwkvKgorCSAqIFRoaXMgc2VjdGlvbiBkb2VzIHRoZSAjISBpbnRlcnByZXRhdGlvbi4KKwkgKiBTb3J0YSBjb21wbGljYXRlZCwgYnV0IGhvcGVmdWxseSBpdCB3aWxsIHdvcmsuICAtVFlUCisJICovCisKKwlicHJtLT5zaF9iYW5nKys7CisJYWxsb3dfd3JpdGVfYWNjZXNzKGJwcm0tPmZpbGUpOworCWZwdXQoYnBybS0+ZmlsZSk7CisJYnBybS0+ZmlsZSA9IE5VTEw7CisKKwlicHJtLT5idWZbQklOUFJNX0JVRl9TSVpFIC0gMV0gPSAnXDAnOworCWlmICgoY3AgPSBzdHJjaHIoYnBybS0+YnVmLCAnXG4nKSkgPT0gTlVMTCkKKwkJY3AgPSBicHJtLT5idWYrQklOUFJNX0JVRl9TSVpFLTE7CisJKmNwID0gJ1wwJzsKKwl3aGlsZSAoY3AgPiBicHJtLT5idWYpIHsKKwkJY3AtLTsKKwkJaWYgKCgqY3AgPT0gJyAnKSB8fCAoKmNwID09ICdcdCcpKQorCQkJKmNwID0gJ1wwJzsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCWZvciAoY3AgPSBicHJtLT5idWYrMjsgKCpjcCA9PSAnICcpIHx8ICgqY3AgPT0gJ1x0Jyk7IGNwKyspOworCWlmICgqY3AgPT0gJ1wwJykgCisJCXJldHVybiAtRU5PRVhFQzsgLyogTm8gaW50ZXJwcmV0ZXIgbmFtZSBmb3VuZCAqLworCWlfbmFtZSA9IGNwOworCWlfYXJnID0gTlVMTDsKKwlmb3IgKCA7ICpjcCAmJiAoKmNwICE9ICcgJykgJiYgKCpjcCAhPSAnXHQnKTsgY3ArKykKKwkJLyogbm90aGluZyAqLyA7CisJd2hpbGUgKCgqY3AgPT0gJyAnKSB8fCAoKmNwID09ICdcdCcpKQorCQkqY3ArKyA9ICdcMCc7CisJaWYgKCpjcCkKKwkJaV9hcmcgPSBjcDsKKwlzdHJjcHkgKGludGVycCwgaV9uYW1lKTsKKwkvKgorCSAqIE9LLCB3ZSd2ZSBwYXJzZWQgb3V0IHRoZSBpbnRlcnByZXRlciBuYW1lIGFuZAorCSAqIChvcHRpb25hbCkgYXJndW1lbnQuCisJICogU3BsaWNlIGluICgxKSB0aGUgaW50ZXJwcmV0ZXIncyBuYW1lIGZvciBhcmd2WzBdCisJICogICAgICAgICAgICgyKSAob3B0aW9uYWwpIGFyZ3VtZW50IHRvIGludGVycHJldGVyCisJICogICAgICAgICAgICgzKSBmaWxlbmFtZSBvZiBzaGVsbCBzY3JpcHQgKHJlcGxhY2UgYXJndlswXSkKKwkgKgorCSAqIFRoaXMgaXMgZG9uZSBpbiByZXZlcnNlIG9yZGVyLCBiZWNhdXNlIG9mIGhvdyB0aGUKKwkgKiB1c2VyIGVudmlyb25tZW50IGFuZCBhcmd1bWVudHMgYXJlIHN0b3JlZC4KKwkgKi8KKwlyZW1vdmVfYXJnX3plcm8oYnBybSk7CisJcmV0dmFsID0gY29weV9zdHJpbmdzX2tlcm5lbCgxLCAmYnBybS0+aW50ZXJwLCBicHJtKTsKKwlpZiAocmV0dmFsIDwgMCkgcmV0dXJuIHJldHZhbDsgCisJYnBybS0+YXJnYysrOworCWlmIChpX2FyZykgeworCQlyZXR2YWwgPSBjb3B5X3N0cmluZ3Nfa2VybmVsKDEsICZpX2FyZywgYnBybSk7CisJCWlmIChyZXR2YWwgPCAwKSByZXR1cm4gcmV0dmFsOyAKKwkJYnBybS0+YXJnYysrOworCX0KKwlyZXR2YWwgPSBjb3B5X3N0cmluZ3Nfa2VybmVsKDEsICZpX25hbWUsIGJwcm0pOworCWlmIChyZXR2YWwpIHJldHVybiByZXR2YWw7IAorCWJwcm0tPmFyZ2MrKzsKKwlicHJtLT5pbnRlcnAgPSBpbnRlcnA7CisKKwkvKgorCSAqIE9LLCBub3cgcmVzdGFydCB0aGUgcHJvY2VzcyB3aXRoIHRoZSBpbnRlcnByZXRlcidzIGRlbnRyeS4KKwkgKi8KKwlmaWxlID0gb3Blbl9leGVjKGludGVycCk7CisJaWYgKElTX0VSUihmaWxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoZmlsZSk7CisKKwlicHJtLT5maWxlID0gZmlsZTsKKwlyZXR2YWwgPSBwcmVwYXJlX2JpbnBybShicHJtKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gc2VhcmNoX2JpbmFyeV9oYW5kbGVyKGJwcm0scmVncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGludXhfYmluZm10IHNjcmlwdF9mb3JtYXQgPSB7CisJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkubG9hZF9iaW5hcnkJPSBsb2FkX3NjcmlwdCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfc2NyaXB0X2JpbmZtdCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9iaW5mbXQoJnNjcmlwdF9mb3JtYXQpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9zY3JpcHRfYmluZm10KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9iaW5mbXQoJnNjcmlwdF9mb3JtYXQpOworfQorCitjb3JlX2luaXRjYWxsKGluaXRfc2NyaXB0X2JpbmZtdCk7Cittb2R1bGVfZXhpdChleGl0X3NjcmlwdF9iaW5mbXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X3NvbS5jIGIvZnMvYmluZm10X3NvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyN2EyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iaW5mbXRfc29tLmMKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBsaW51eC9mcy9iaW5mbXRfc29tLmMKKyAqCisgKiBUaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyB1c2VkIHRvIGxvYWQgU09NIGZvcm1hdCBleGVjdXRhYmxlcyBhcyB1c2VkCisgKiBieSBIUC1VWC4gIAorICoKKyAqIENvcHlyaWdodCAxOTk5IE1hdHRoZXcgV2lsY294IDx3aWxseUBib2ZoLmFpPgorICogYmFzZWQgb24gYmluZm10X2VsZiB3aGljaCBpcworICogQ29weXJpZ2h0IDE5OTMsIDE5OTQ6IEVyaWMgWW91bmdkYWxlIChlcmljeUBjYWlzLmNvbSkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpbmZtdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb20uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2htLmg+CisjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorCitzdGF0aWMgaW50IGxvYWRfc29tX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICogYnBybSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKTsKK3N0YXRpYyBpbnQgbG9hZF9zb21fbGlicmFyeShzdHJ1Y3QgZmlsZSAqKTsKKworLyoKKyAqIElmIHdlIGRvbid0IHN1cHBvcnQgY29yZSBkdW1waW5nLCB0aGVuIHN1cHBseSBhIE5VTEwgc28gd2UKKyAqIGRvbid0IGV2ZW4gdHJ5LgorICovCisjaWYgMAorc3RhdGljIGludCBzb21fY29yZV9kdW1wKGxvbmcgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICogcmVncyk7CisjZWxzZQorI2RlZmluZSBzb21fY29yZV9kdW1wCU5VTEwKKyNlbmRpZgorCisjZGVmaW5lIFNPTV9QQUdFU1RBUlQoX3YpICgoX3YpICYgfih1bnNpZ25lZCBsb25nKShTT01fUEFHRVNJWkUtMSkpCisjZGVmaW5lIFNPTV9QQUdFT0ZGU0VUKF92KSAoKF92KSAmIChTT01fUEFHRVNJWkUtMSkpCisjZGVmaW5lIFNPTV9QQUdFQUxJR04oX3YpICgoKF92KSArIFNPTV9QQUdFU0laRSAtIDEpICYgfihTT01fUEFHRVNJWkUgLSAxKSkKKworc3RhdGljIHN0cnVjdCBsaW51eF9iaW5mbXQgc29tX2Zvcm1hdCA9IHsKKwkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAorCS5sb2FkX2JpbmFyeQk9IGxvYWRfc29tX2JpbmFyeSwKKwkubG9hZF9zaGxpYgk9IGxvYWRfc29tX2xpYnJhcnksCisJLmNvcmVfZHVtcAk9IHNvbV9jb3JlX2R1bXAsCisJLm1pbl9jb3JlZHVtcAk9IFNPTV9QQUdFU0laRQorfTsKKworLyoKKyAqIGNyZWF0ZV9zb21fdGFibGVzKCkgcGFyc2VzIHRoZSBlbnYtIGFuZCBhcmctc3RyaW5ncyBpbiBuZXcgdXNlcgorICogbWVtb3J5IGFuZCBjcmVhdGVzIHRoZSBwb2ludGVyIHRhYmxlcyBmcm9tIHRoZW0sIGFuZCBwdXRzIHRoZWlyCisgKiBhZGRyZXNzZXMgb24gdGhlICJzdGFjayIsIHJldHVybmluZyB0aGUgbmV3IHN0YWNrIHBvaW50ZXIgdmFsdWUuCisgKi8KK3N0YXRpYyB2b2lkIGNyZWF0ZV9zb21fdGFibGVzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCit7CisJY2hhciAqKmFyZ3YsICoqZW52cDsKKwlpbnQgYXJnYyA9IGJwcm0tPmFyZ2M7CisJaW50IGVudmMgPSBicHJtLT5lbnZjOworCXVuc2lnbmVkIGxvbmcgcDsKKwl1bnNpZ25lZCBsb25nICpzcDsKKworCS8qIFdvcmQtYWxpZ24gdGhlIHN0YWNrIHBvaW50ZXIgKi8KKwlzcCA9ICh1bnNpZ25lZCBsb25nICopKChicHJtLT5wICsgMykgJiB+Myk7CisKKwllbnZwID0gKGNoYXIgKiopIHNwOworCXNwICs9IGVudmMgKyAxOworCWFyZ3YgPSAoY2hhciAqKikgc3A7CisJc3AgKz0gYXJnYyArIDE7CisKKwlfX3B1dF91c2VyKCh1bnNpZ25lZCBsb25nKSBlbnZwLCsrc3ApOworCV9fcHV0X3VzZXIoKHVuc2lnbmVkIGxvbmcpIGFyZ3YsKytzcCk7CisKKwlfX3B1dF91c2VyKGFyZ2MsICsrc3ApOworCisJYnBybS0+cCA9ICh1bnNpZ25lZCBsb25nKSBzcDsKKworCXAgPSBjdXJyZW50LT5tbS0+YXJnX3N0YXJ0OworCXdoaWxlIChhcmdjLS0gPiAwKSB7CisJCV9fcHV0X3VzZXIoKGNoYXIgKilwLGFyZ3YrKyk7CisJCXAgKz0gc3RybGVuX3VzZXIoKGNoYXIgKilwKTsKKwl9CisJX19wdXRfdXNlcihOVUxMLCBhcmd2KTsKKwljdXJyZW50LT5tbS0+YXJnX2VuZCA9IGN1cnJlbnQtPm1tLT5lbnZfc3RhcnQgPSBwOworCXdoaWxlIChlbnZjLS0gPiAwKSB7CisJCV9fcHV0X3VzZXIoKGNoYXIgKilwLGVudnArKyk7CisJCXAgKz0gc3RybGVuX3VzZXIoKGNoYXIgKilwKTsKKwl9CisJX19wdXRfdXNlcihOVUxMLCBlbnZwKTsKKwljdXJyZW50LT5tbS0+ZW52X2VuZCA9IHA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfc29tX2hlYWRlcihzdHJ1Y3Qgc29tX2hkciAqc29tX2V4KQoreworCWludCAqYnVmID0gKGludCAqKXNvbV9leDsKKwlpbnQgaSwgY2s7CisKKwlpZiAoc29tX2V4LT5zeXN0ZW1faWQgIT0gU09NX1NJRF9QQVJJU0NfMV8wICYmCisJICAgIHNvbV9leC0+c3lzdGVtX2lkICE9IFNPTV9TSURfUEFSSVNDXzFfMSAmJgorCSAgICBzb21fZXgtPnN5c3RlbV9pZCAhPSBTT01fU0lEX1BBUklTQ18yXzApCisJCXJldHVybiAtRU5PRVhFQzsKKworCWlmIChzb21fZXgtPmFfbWFnaWMgIT0gU09NX0VYRUNfTk9OU0hBUkUgJiYKKwkgICAgc29tX2V4LT5hX21hZ2ljICE9IFNPTV9FWEVDX1NIQVJFICYmCisJICAgIHNvbV9leC0+YV9tYWdpYyAhPSBTT01fRVhFQ19ERU1BTkQpCisJCXJldHVybiAtRU5PRVhFQzsKKworCWlmIChzb21fZXgtPnZlcnNpb25faWQgIT0gU09NX0lEX09MRCAmJgorCSAgICBzb21fZXgtPnZlcnNpb25faWQgIT0gU09NX0lEX05FVykKKwkJcmV0dXJuIC1FTk9FWEVDOworCisJY2sgPSAwOworCWZvciAoaT0wOyBpPDMyOyBpKyspCisJCWNrIF49IGJ1ZltpXTsKKwlpZiAoY2sgIT0gMCkKKwkJcmV0dXJuIC1FTk9FWEVDOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFwX3NvbV9iaW5hcnkoc3RydWN0IGZpbGUgKmZpbGUsCisJCWNvbnN0IHN0cnVjdCBzb21fZXhlY19hdXhoZHIgKmhwdXhoZHIpCit7CisJdW5zaWduZWQgbG9uZyBjb2RlX3N0YXJ0LCBjb2RlX3NpemUsIGRhdGFfc3RhcnQsIGRhdGFfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGJzc19zdGFydCwgc29tX2JyazsKKwlpbnQgcmV0dmFsOworCWludCBwcm90ID0gUFJPVF9SRUFEIHwgUFJPVF9FWEVDOworCWludCBmbGFncyA9IE1BUF9GSVhFRHxNQVBfUFJJVkFURXxNQVBfREVOWVdSSVRFfE1BUF9FWEVDVVRBQkxFOworCisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCXNldF9mcyhnZXRfZHMoKSk7CisKKwljb2RlX3N0YXJ0ID0gU09NX1BBR0VTVEFSVChocHV4aGRyLT5leGVjX3RtZW0pOworCWNvZGVfc2l6ZSA9IFNPTV9QQUdFQUxJR04oaHB1eGhkci0+ZXhlY190c2l6ZSk7CisJY3VycmVudC0+bW0tPnN0YXJ0X2NvZGUgPSBjb2RlX3N0YXJ0OworCWN1cnJlbnQtPm1tLT5lbmRfY29kZSA9IGNvZGVfc3RhcnQgKyBjb2RlX3NpemU7CisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlyZXR2YWwgPSBkb19tbWFwKGZpbGUsIGNvZGVfc3RhcnQsIGNvZGVfc2l6ZSwgcHJvdCwKKwkJCWZsYWdzLCBTT01fUEFHRVNUQVJUKGhwdXhoZHItPmV4ZWNfdGZpbGUpKTsKKwl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlpZiAocmV0dmFsIDwgMCAmJiByZXR2YWwgPiAtMTAyNCkKKwkJZ290byBvdXQ7CisKKwlkYXRhX3N0YXJ0ID0gU09NX1BBR0VTVEFSVChocHV4aGRyLT5leGVjX2RtZW0pOworCWRhdGFfc2l6ZSA9IFNPTV9QQUdFQUxJR04oaHB1eGhkci0+ZXhlY19kc2l6ZSk7CisJY3VycmVudC0+bW0tPnN0YXJ0X2RhdGEgPSBkYXRhX3N0YXJ0OworCWN1cnJlbnQtPm1tLT5lbmRfZGF0YSA9IGJzc19zdGFydCA9IGRhdGFfc3RhcnQgKyBkYXRhX3NpemU7CisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlyZXR2YWwgPSBkb19tbWFwKGZpbGUsIGRhdGFfc3RhcnQsIGRhdGFfc2l6ZSwKKwkJCXByb3QgfCBQUk9UX1dSSVRFLCBmbGFncywKKwkJCVNPTV9QQUdFU1RBUlQoaHB1eGhkci0+ZXhlY19kZmlsZSkpOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCWlmIChyZXR2YWwgPCAwICYmIHJldHZhbCA+IC0xMDI0KQorCQlnb3RvIG91dDsKKworCXNvbV9icmsgPSBic3Nfc3RhcnQgKyBTT01fUEFHRUFMSUdOKGhwdXhoZHItPmV4ZWNfYnNpemUpOworCWN1cnJlbnQtPm1tLT5zdGFydF9icmsgPSBjdXJyZW50LT5tbS0+YnJrID0gc29tX2JyazsKKwlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCXJldHZhbCA9IGRvX21tYXAoTlVMTCwgYnNzX3N0YXJ0LCBzb21fYnJrIC0gYnNzX3N0YXJ0LAorCQkJcHJvdCB8IFBST1RfV1JJVEUsIE1BUF9GSVhFRCB8IE1BUF9QUklWQVRFLCAwKTsKKwl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlpZiAocmV0dmFsID4gMCB8fCByZXR2YWwgPCAtMTAyNCkKKwkJcmV0dmFsID0gMDsKK291dDoKKwlzZXRfZnMob2xkX2ZzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyB1c2VkIHRvIGxvYWQgU09NIGV4ZWN1dGFibGVzIGFuZCBzaGFyZWQKKyAqIGxpYnJhcmllcy4gIFRoZXJlIGlzIG5vIGJpbmFyeSBkZXBlbmRlbnQgY29kZSBhbnl3aGVyZSBlbHNlLgorICovCisKK3N0YXRpYyBpbnQKK2xvYWRfc29tX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICogYnBybSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWludCBzb21fZXhlY19maWxlbm87CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHNvbV9lbnRyeTsKKwlzdHJ1Y3Qgc29tX2hkciAqc29tX2V4OworCXN0cnVjdCBzb21fZXhlY19hdXhoZHIgKmhwdXhoZHI7CisKKwkvKiBHZXQgdGhlIGV4ZWMtaGVhZGVyICovCisJc29tX2V4ID0gKHN0cnVjdCBzb21faGRyICopIGJwcm0tPmJ1ZjsKKworCXJldHZhbCA9IGNoZWNrX3NvbV9oZWFkZXIoc29tX2V4KTsKKwlpZiAocmV0dmFsICE9IDApCisJCWdvdG8gb3V0OworCisJLyogTm93IHJlYWQgaW4gdGhlIGF1eGlsaWFyeSBoZWFkZXIgaW5mb3JtYXRpb24gKi8KKworCXJldHZhbCA9IC1FTk9NRU07CisJc2l6ZSA9IHNvbV9leC0+YXV4X2hlYWRlcl9zaXplOworCWlmIChzaXplID4gU09NX1BBR0VTSVpFKQorCQlnb3RvIG91dDsKKwlocHV4aGRyID0gKHN0cnVjdCBzb21fZXhlY19hdXhoZHIgKikga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhwdXhoZHIpCisJCWdvdG8gb3V0OworCisJcmV0dmFsID0ga2VybmVsX3JlYWQoYnBybS0+ZmlsZSwgc29tX2V4LT5hdXhfaGVhZGVyX2xvY2F0aW9uLAorCQkJKGNoYXIgKikgaHB1eGhkciwgc2l6ZSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisjZXJyb3IgIkZpeCBzZWN1cml0eSBob2xlIGJlZm9yZSBlbmFibGluZyBtZSIKKwlyZXR2YWwgPSBnZXRfdW51c2VkX2ZkKCk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJZ2V0X2ZpbGUoYnBybS0+ZmlsZSk7CisJZmRfaW5zdGFsbChzb21fZXhlY19maWxlbm8gPSByZXR2YWwsIGJwcm0tPmZpbGUpOworCisJLyogRmx1c2ggYWxsIHRyYWNlcyBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgZXhlY3V0YWJsZSAqLworCXJldHZhbCA9IGZsdXNoX29sZF9leGVjKGJwcm0pOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwkvKiBPSywgVGhpcyBpcyB0aGUgcG9pbnQgb2Ygbm8gcmV0dXJuICovCisJY3VycmVudC0+ZmxhZ3MgJj0gflBGX0ZPUktOT0VYRUM7CisJY3VycmVudC0+cGVyc29uYWxpdHkgPSBQRVJfSFBVWDsKKworCS8qIFNldCB0aGUgdGFzayBzaXplIGZvciBIUC1VWCBwcm9jZXNzZXMgc3VjaCB0aGF0CisJICogdGhlIGdhdGV3YXkgcGFnZSBpcyBvdXRzaWRlIHRoZSBhZGRyZXNzIHNwYWNlLgorCSAqIFRoaXMgY2FuIGJlIGZpeGVkIGxhdGVyLCBidXQgZm9yIG5vdywgdGhpcyBpcyBtdWNoCisJICogZWFzaWVyLgorCSAqLworCisJY3VycmVudC0+dGhyZWFkLnRhc2tfc2l6ZSA9IDB4YzAwMDAwMDA7CisKKwkvKiBTZXQgbWFwIGJhc2UgdG8gYWxsb3cgZW5vdWdoIHJvb20gZm9yIGhwLXV4IGhlYXAgZ3Jvd3RoICovCisKKwljdXJyZW50LT50aHJlYWQubWFwX2Jhc2UgPSAweDgwMDAwMDAwOworCisJcmV0dmFsID0gbWFwX3NvbV9iaW5hcnkoYnBybS0+ZmlsZSwgaHB1eGhkcik7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlzb21fZW50cnkgPSBocHV4aGRyLT5leGVjX2VudHJ5OworCWtmcmVlKGhwdXhoZHIpOworCisJc2V0X2JpbmZtdCgmc29tX2Zvcm1hdCk7CisJY29tcHV0ZV9jcmVkcyhicHJtKTsKKwlzZXR1cF9hcmdfcGFnZXMoYnBybSwgU1RBQ0tfVE9QLCBFWFNUQUNLX0RFRkFVTFQpOworCisJY3JlYXRlX3NvbV90YWJsZXMoYnBybSk7CisKKwljdXJyZW50LT5tbS0+c3RhcnRfc3RhY2sgPSBicHJtLT5wOworCXNldF9tbV9jb3VudGVyKGN1cnJlbnQtPm1tLCByc3MsIDApOworCisjaWYgMAorCXByaW50aygiKHN0YXJ0X2JyaykgJTA4bHhcbiIgLCAodW5zaWduZWQgbG9uZykgY3VycmVudC0+bW0tPnN0YXJ0X2Jyayk7CisJcHJpbnRrKCIoZW5kX2NvZGUpICUwOGx4XG4iICwgKHVuc2lnbmVkIGxvbmcpIGN1cnJlbnQtPm1tLT5lbmRfY29kZSk7CisJcHJpbnRrKCIoc3RhcnRfY29kZSkgJTA4bHhcbiIgLCAodW5zaWduZWQgbG9uZykgY3VycmVudC0+bW0tPnN0YXJ0X2NvZGUpOworCXByaW50aygiKGVuZF9kYXRhKSAlMDhseFxuIiAsICh1bnNpZ25lZCBsb25nKSBjdXJyZW50LT5tbS0+ZW5kX2RhdGEpOworCXByaW50aygiKHN0YXJ0X3N0YWNrKSAlMDhseFxuIiAsICh1bnNpZ25lZCBsb25nKSBjdXJyZW50LT5tbS0+c3RhcnRfc3RhY2spOworCXByaW50aygiKGJyaykgJTA4bHhcbiIgLCAodW5zaWduZWQgbG9uZykgY3VycmVudC0+bW0tPmJyayk7CisjZW5kaWYKKworCW1hcF9ocHV4X2dhdGV3YXlfcGFnZShjdXJyZW50LGN1cnJlbnQtPm1tKTsKKworCXN0YXJ0X3RocmVhZF9zb20ocmVncywgc29tX2VudHJ5LCBicHJtLT5wKTsKKwlpZiAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkKKwkJc2VuZF9zaWcoU0lHVFJBUCwgY3VycmVudCwgMCk7CisJcmV0dXJuIDA7CisKKwkvKiBlcnJvciBjbGVhbnVwICovCitvdXRfZnJlZToKKwlrZnJlZShocHV4aGRyKTsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGxvYWRfc29tX2xpYnJhcnkoc3RydWN0IGZpbGUgKmYpCit7CisvKiBObyBsaWIgc3VwcG9ydCBpbiBTT00geWV0LiAgZ2l6emEgY2hhbmNlLi4gKi8KKwlyZXR1cm4gLUVOT0VYRUM7Cit9CisJLyogSW5zdGFsbCB0aGUgU09NIGxvYWRlci4KKwkgKiBOLkIuIFdlICpyZWx5KiBvbiB0aGUgdGFibGUgYmVpbmcgdGhlIHJpZ2h0IHNpemUgd2l0aCB0aGUKKwkgKiByaWdodCBudW1iZXIgb2YgZnJlZSBzbG90cy4uLgorCSAqLworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3NvbV9iaW5mbXQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfYmluZm10KCZzb21fZm9ybWF0KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfc29tX2JpbmZtdCh2b2lkKQoreworCS8qIFJlbW92ZSB0aGUgU09NIGxvYWRlci4gKi8KKwl1bnJlZ2lzdGVyX2JpbmZtdCgmc29tX2Zvcm1hdCk7Cit9CisKK2NvcmVfaW5pdGNhbGwoaW5pdF9zb21fYmluZm10KTsKK21vZHVsZV9leGl0KGV4aXRfc29tX2JpbmZtdCk7CmRpZmYgLS1naXQgYS9mcy9iaW8uYyBiL2ZzL2Jpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MzQ5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iaW8uYwpAQCAtMCwwICsxLDEwOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgSmVucyBBeGJvZSA8YXhib2VAc3VzZS5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VucworICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC9iaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2RlZmluZSBCSU9fUE9PTF9TSVpFIDI1NgorCitzdGF0aWMga21lbV9jYWNoZV90ICpiaW9fc2xhYjsKKworI2RlZmluZSBCSU9WRUNfTlJfUE9PTFMgNgorCisvKgorICogYSBzbWFsbCBudW1iZXIgb2YgZW50cmllcyBpcyBmaW5lLCBub3QgZ29pbmcgdG8gYmUgcGVyZm9ybWFuY2UgY3JpdGljYWwuCisgKiBiYXNpY2FsbHkgd2UganVzdCBuZWVkIHRvIHN1cnZpdmUKKyAqLworI2RlZmluZSBCSU9fU1BMSVRfRU5UUklFUyA4CQorbWVtcG9vbF90ICpiaW9fc3BsaXRfcG9vbDsKKworc3RydWN0IGJpb3ZlY19zbGFiIHsKKwlpbnQgbnJfdmVjczsKKwljaGFyICpuYW1lOyAKKwlrbWVtX2NhY2hlX3QgKnNsYWI7Cit9OworCisvKgorICogaWYgeW91IGNoYW5nZSB0aGlzIGxpc3QsIGFsc28gY2hhbmdlIGJ2ZWNfYWxsb2Mgb3IgdGhpbmdzIHdpbGwKKyAqIGJyZWFrIGJhZGx5ISBjYW5ub3QgYmUgYmlnZ2VyIHRoYW4gd2hhdCB5b3UgY2FuIGZpdCBpbnRvIGFuCisgKiB1bnNpZ25lZCBzaG9ydAorICovCisKKyNkZWZpbmUgQlYoeCkgeyAubnJfdmVjcyA9IHgsIC5uYW1lID0gImJpb3ZlYy0iX19zdHJpbmdpZnkoeCkgfQorc3RhdGljIHN0cnVjdCBiaW92ZWNfc2xhYiBidmVjX3NsYWJzW0JJT1ZFQ19OUl9QT09MU10gPSB7CisJQlYoMSksIEJWKDQpLCBCVigxNiksIEJWKDY0KSwgQlYoMTI4KSwgQlYoQklPX01BWF9QQUdFUyksCit9OworI3VuZGVmIEJWCisKKy8qCisgKiBiaW9fc2V0IGlzIHVzZWQgdG8gYWxsb3cgb3RoZXIgcG9ydGlvbnMgb2YgdGhlIElPIHN5c3RlbSB0bworICogYWxsb2NhdGUgdGhlaXIgb3duIHByaXZhdGUgbWVtb3J5IHBvb2xzIGZvciBiaW8gYW5kIGlvdmVjIHN0cnVjdHVyZXMuCisgKiBUaGVzZSBtZW1vcnkgcG9vbHMgaW4gdHVybiBhbGwgYWxsb2NhdGUgZnJvbSB0aGUgYmlvX3NsYWIKKyAqIGFuZCB0aGUgYnZlY19zbGFic1tdLgorICovCitzdHJ1Y3QgYmlvX3NldCB7CisJbWVtcG9vbF90ICpiaW9fcG9vbDsKKwltZW1wb29sX3QgKmJ2ZWNfcG9vbHNbQklPVkVDX05SX1BPT0xTXTsKK307CisKKy8qCisgKiBmc19iaW9fc2V0IGlzIHRoZSBiaW9fc2V0IGNvbnRhaW5pbmcgYmlvIGFuZCBpb3ZlYyBtZW1vcnkgcG9vbHMgdXNlZCBieQorICogSU8gY29kZSB0aGF0IGRvZXMgbm90IG5lZWQgcHJpdmF0ZSBtZW1vcnkgcG9vbHMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmlvX3NldCAqZnNfYmlvX3NldDsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYmlvX3ZlYyAqYnZlY19hbGxvY19icyh1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2ssIGludCBuciwgdW5zaWduZWQgbG9uZyAqaWR4LCBzdHJ1Y3QgYmlvX3NldCAqYnMpCit7CisJc3RydWN0IGJpb192ZWMgKmJ2bDsKKwlzdHJ1Y3QgYmlvdmVjX3NsYWIgKmJwOworCisJLyoKKwkgKiBzZWUgY29tbWVudCBuZWFyIGJ2ZWNfYXJyYXkgZGVmaW5lIQorCSAqLworCXN3aXRjaCAobnIpIHsKKwkJY2FzZSAgIDEgICAgICAgIDogKmlkeCA9IDA7IGJyZWFrOworCQljYXNlICAgMiAuLi4gICA0OiAqaWR4ID0gMTsgYnJlYWs7CisJCWNhc2UgICA1IC4uLiAgMTY6ICppZHggPSAyOyBicmVhazsKKwkJY2FzZSAgMTcgLi4uICA2NDogKmlkeCA9IDM7IGJyZWFrOworCQljYXNlICA2NSAuLi4gMTI4OiAqaWR4ID0gNDsgYnJlYWs7CisJCWNhc2UgMTI5IC4uLiBCSU9fTUFYX1BBR0VTOiAqaWR4ID0gNTsgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gTlVMTDsKKwl9CisJLyoKKwkgKiBpZHggbm93IHBvaW50cyB0byB0aGUgcG9vbCB3ZSB3YW50IHRvIGFsbG9jYXRlIGZyb20KKwkgKi8KKworCWJwID0gYnZlY19zbGFicyArICppZHg7CisJYnZsID0gbWVtcG9vbF9hbGxvYyhicy0+YnZlY19wb29sc1sqaWR4XSwgZ2ZwX21hc2spOworCWlmIChidmwpCisJCW1lbXNldChidmwsIDAsIGJwLT5ucl92ZWNzICogc2l6ZW9mKHN0cnVjdCBiaW9fdmVjKSk7CisKKwlyZXR1cm4gYnZsOworfQorCisvKgorICogZGVmYXVsdCBkZXN0cnVjdG9yIGZvciBhIGJpbyBhbGxvY2F0ZWQgd2l0aCBiaW9fYWxsb2NfYmlvc2V0KCkKKyAqLworc3RhdGljIHZvaWQgYmlvX2Rlc3RydWN0b3Ioc3RydWN0IGJpbyAqYmlvKQoreworCWNvbnN0IGludCBwb29sX2lkeCA9IEJJT19QT09MX0lEWChiaW8pOworCXN0cnVjdCBiaW9fc2V0ICpicyA9IGJpby0+Ymlfc2V0OworCisJQklPX0JVR19PTihwb29sX2lkeCA+PSBCSU9WRUNfTlJfUE9PTFMpOworCisJbWVtcG9vbF9mcmVlKGJpby0+YmlfaW9fdmVjLCBicy0+YnZlY19wb29sc1twb29sX2lkeF0pOworCW1lbXBvb2xfZnJlZShiaW8sIGJzLT5iaW9fcG9vbCk7Cit9CisKK2lubGluZSB2b2lkIGJpb19pbml0KHN0cnVjdCBiaW8gKmJpbykKK3sKKwliaW8tPmJpX25leHQgPSBOVUxMOworCWJpby0+YmlfZmxhZ3MgPSAxIDw8IEJJT19VUFRPREFURTsKKwliaW8tPmJpX3J3ID0gMDsKKwliaW8tPmJpX3ZjbnQgPSAwOworCWJpby0+YmlfaWR4ID0gMDsKKwliaW8tPmJpX3BoeXNfc2VnbWVudHMgPSAwOworCWJpby0+YmlfaHdfc2VnbWVudHMgPSAwOworCWJpby0+YmlfaHdfZnJvbnRfc2l6ZSA9IDA7CisJYmlvLT5iaV9od19iYWNrX3NpemUgPSAwOworCWJpby0+Ymlfc2l6ZSA9IDA7CisJYmlvLT5iaV9tYXhfdmVjcyA9IDA7CisJYmlvLT5iaV9lbmRfaW8gPSBOVUxMOworCWF0b21pY19zZXQoJmJpby0+YmlfY250LCAxKTsKKwliaW8tPmJpX3ByaXZhdGUgPSBOVUxMOworfQorCisvKioKKyAqIGJpb19hbGxvY19iaW9zZXQgLSBhbGxvY2F0ZSBhIGJpbyBmb3IgSS9PCisgKiBAZ2ZwX21hc2s6ICAgdGhlIEdGUF8gbWFzayBnaXZlbiB0byB0aGUgc2xhYiBhbGxvY2F0b3IKKyAqIEBucl9pb3ZlY3M6CW51bWJlciBvZiBpb3ZlY3MgdG8gcHJlLWFsbG9jYXRlCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIGJpb19hbGxvY19iaW9zZXQgd2lsbCBmaXJzdCB0cnkgaXQncyBvbiBtZW1wb29sIHRvIHNhdGlzZnkgdGhlIGFsbG9jYXRpb24uCisgKiAgIElmICVfX0dGUF9XQUlUIGlzIHNldCB0aGVuIHdlIHdpbGwgYmxvY2sgb24gdGhlIGludGVybmFsIHBvb2wgd2FpdGluZworICogICBmb3IgYSAmc3RydWN0IGJpbyB0byBiZWNvbWUgZnJlZS4KKyAqCisgKiAgIGFsbG9jYXRlIGJpbyBhbmQgaW92ZWNzIGZyb20gdGhlIG1lbW9yeSBwb29scyBzcGVjaWZpZWQgYnkgdGhlCisgKiAgIGJpb19zZXQgc3RydWN0dXJlLgorICoqLworc3RydWN0IGJpbyAqYmlvX2FsbG9jX2Jpb3NldCh1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2ssIGludCBucl9pb3ZlY3MsIHN0cnVjdCBiaW9fc2V0ICpicykKK3sKKwlzdHJ1Y3QgYmlvICpiaW8gPSBtZW1wb29sX2FsbG9jKGJzLT5iaW9fcG9vbCwgZ2ZwX21hc2spOworCisJaWYgKGxpa2VseShiaW8pKSB7CisJCXN0cnVjdCBiaW9fdmVjICpidmwgPSBOVUxMOworCisJCWJpb19pbml0KGJpbyk7CisJCWlmIChsaWtlbHkobnJfaW92ZWNzKSkgeworCQkJdW5zaWduZWQgbG9uZyBpZHg7CisKKwkJCWJ2bCA9IGJ2ZWNfYWxsb2NfYnMoZ2ZwX21hc2ssIG5yX2lvdmVjcywgJmlkeCwgYnMpOworCQkJaWYgKHVubGlrZWx5KCFidmwpKSB7CisJCQkJbWVtcG9vbF9mcmVlKGJpbywgYnMtPmJpb19wb29sKTsKKwkJCQliaW8gPSBOVUxMOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJYmlvLT5iaV9mbGFncyB8PSBpZHggPDwgQklPX1BPT0xfT0ZGU0VUOworCQkJYmlvLT5iaV9tYXhfdmVjcyA9IGJ2ZWNfc2xhYnNbaWR4XS5ucl92ZWNzOworCQl9CisJCWJpby0+YmlfaW9fdmVjID0gYnZsOworCQliaW8tPmJpX2Rlc3RydWN0b3IgPSBiaW9fZGVzdHJ1Y3RvcjsKKwkJYmlvLT5iaV9zZXQgPSBiczsKKwl9CitvdXQ6CisJcmV0dXJuIGJpbzsKK30KKworc3RydWN0IGJpbyAqYmlvX2FsbG9jKHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaywgaW50IG5yX2lvdmVjcykKK3sKKwlyZXR1cm4gYmlvX2FsbG9jX2Jpb3NldChnZnBfbWFzaywgbnJfaW92ZWNzLCBmc19iaW9fc2V0KTsKK30KKwordm9pZCB6ZXJvX2ZpbGxfYmlvKHN0cnVjdCBiaW8gKmJpbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBiaW9fdmVjICpidjsKKwlpbnQgaTsKKworCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2LCBiaW8sIGkpIHsKKwkJY2hhciAqZGF0YSA9IGJ2ZWNfa21hcF9pcnEoYnYsICZmbGFncyk7CisJCW1lbXNldChkYXRhLCAwLCBidi0+YnZfbGVuKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UoYnYtPmJ2X3BhZ2UpOworCQlidmVjX2t1bm1hcF9pcnEoZGF0YSwgJmZsYWdzKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHplcm9fZmlsbF9iaW8pOworCisvKioKKyAqIGJpb19wdXQgLSByZWxlYXNlIGEgcmVmZXJlbmNlIHRvIGEgYmlvCisgKiBAYmlvOiAgIGJpbyB0byByZWxlYXNlIHJlZmVyZW5jZSB0bworICoKKyAqIERlc2NyaXB0aW9uOgorICogICBQdXQgYSByZWZlcmVuY2UgdG8gYSAmc3RydWN0IGJpbywgZWl0aGVyIG9uZSB5b3UgaGF2ZSBnb3R0ZW4gd2l0aAorICogICBiaW9fYWxsb2Mgb3IgYmlvX2dldC4gVGhlIGxhc3QgcHV0IG9mIGEgYmlvIHdpbGwgZnJlZSBpdC4KKyAqKi8KK3ZvaWQgYmlvX3B1dChzdHJ1Y3QgYmlvICpiaW8pCit7CisJQklPX0JVR19PTighYXRvbWljX3JlYWQoJmJpby0+YmlfY250KSk7CisKKwkvKgorCSAqIGxhc3QgcHV0IGZyZWVzIGl0CisJICovCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJpby0+YmlfY250KSkgeworCQliaW8tPmJpX25leHQgPSBOVUxMOworCQliaW8tPmJpX2Rlc3RydWN0b3IoYmlvKTsKKwl9Cit9CisKK2lubGluZSBpbnQgYmlvX3BoeXNfc2VnbWVudHMocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJaWYgKHVubGlrZWx5KCFiaW9fZmxhZ2dlZChiaW8sIEJJT19TRUdfVkFMSUQpKSkKKwkJYmxrX3JlY291bnRfc2VnbWVudHMocSwgYmlvKTsKKworCXJldHVybiBiaW8tPmJpX3BoeXNfc2VnbWVudHM7Cit9CisKK2lubGluZSBpbnQgYmlvX2h3X3NlZ21lbnRzKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqYmlvKQoreworCWlmICh1bmxpa2VseSghYmlvX2ZsYWdnZWQoYmlvLCBCSU9fU0VHX1ZBTElEKSkpCisJCWJsa19yZWNvdW50X3NlZ21lbnRzKHEsIGJpbyk7CisKKwlyZXR1cm4gYmlvLT5iaV9od19zZWdtZW50czsKK30KKworLyoqCisgKiAJX19iaW9fY2xvbmUJLQljbG9uZSBhIGJpbworICogCUBiaW86IGRlc3RpbmF0aW9uIGJpbworICogCUBiaW9fc3JjOiBiaW8gdG8gY2xvbmUKKyAqCisgKglDbG9uZSBhICZiaW8uIENhbGxlciB3aWxsIG93biB0aGUgcmV0dXJuZWQgYmlvLCBidXQgbm90CisgKgl0aGUgYWN0dWFsIGRhdGEgaXQgcG9pbnRzIHRvLiBSZWZlcmVuY2UgY291bnQgb2YgcmV0dXJuZWQKKyAqIAliaW8gd2lsbCBiZSBvbmUuCisgKi8KK2lubGluZSB2b2lkIF9fYmlvX2Nsb25lKHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGJpbyAqYmlvX3NyYykKK3sKKwlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBiZGV2X2dldF9xdWV1ZShiaW9fc3JjLT5iaV9iZGV2KTsKKworCW1lbWNweShiaW8tPmJpX2lvX3ZlYywgYmlvX3NyYy0+YmlfaW9fdmVjLCBiaW9fc3JjLT5iaV9tYXhfdmVjcyAqIHNpemVvZihzdHJ1Y3QgYmlvX3ZlYykpOworCisJYmlvLT5iaV9zZWN0b3IgPSBiaW9fc3JjLT5iaV9zZWN0b3I7CisJYmlvLT5iaV9iZGV2ID0gYmlvX3NyYy0+YmlfYmRldjsKKwliaW8tPmJpX2ZsYWdzIHw9IDEgPDwgQklPX0NMT05FRDsKKwliaW8tPmJpX3J3ID0gYmlvX3NyYy0+Ymlfcnc7CisKKwkvKgorCSAqIG5vdGVzIC0tIG1heWJlIGp1c3QgbGVhdmUgYmlfaWR4IGFsb25lLiBhc3N1bWUgaWRlbnRpY2FsIG1hcHBpbmcKKwkgKiBmb3IgdGhlIGNsb25lCisJICovCisJYmlvLT5iaV92Y250ID0gYmlvX3NyYy0+YmlfdmNudDsKKwliaW8tPmJpX3NpemUgPSBiaW9fc3JjLT5iaV9zaXplOworCWJpb19waHlzX3NlZ21lbnRzKHEsIGJpbyk7CisJYmlvX2h3X3NlZ21lbnRzKHEsIGJpbyk7Cit9CisKKy8qKgorICoJYmlvX2Nsb25lCS0JY2xvbmUgYSBiaW8KKyAqCUBiaW86IGJpbyB0byBjbG9uZQorICoJQGdmcF9tYXNrOiBhbGxvY2F0aW9uIHByaW9yaXR5CisgKgorICogCUxpa2UgX19iaW9fY2xvbmUsIG9ubHkgYWxzbyBhbGxvY2F0ZXMgdGhlIHJldHVybmVkIGJpbworICovCitzdHJ1Y3QgYmlvICpiaW9fY2xvbmUoc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spCit7CisJc3RydWN0IGJpbyAqYiA9IGJpb19hbGxvY19iaW9zZXQoZ2ZwX21hc2ssIGJpby0+YmlfbWF4X3ZlY3MsIGZzX2Jpb19zZXQpOworCisJaWYgKGIpCisJCV9fYmlvX2Nsb25lKGIsIGJpbyk7CisKKwlyZXR1cm4gYjsKK30KKworLyoqCisgKgliaW9fZ2V0X25yX3ZlY3MJCS0gcmV0dXJuIGFwcHJveCBudW1iZXIgb2YgdmVjcworICoJQGJkZXY6ICBJL08gdGFyZ2V0CisgKgorICoJUmV0dXJuIHRoZSBhcHByb3hpbWF0ZSBudW1iZXIgb2YgcGFnZXMgd2UgY2FuIHNlbmQgdG8gdGhpcyB0YXJnZXQuCisgKglUaGVyZSdzIG5vIGd1YXJhbnRlZSB0aGF0IHlvdSB3aWxsIGJlIGFibGUgdG8gZml0IHRoaXMgbnVtYmVyIG9mIHBhZ2VzCisgKglpbnRvIGEgYmlvLCBpdCBkb2VzIG5vdCBhY2NvdW50IGZvciBkeW5hbWljIHJlc3RyaWN0aW9ucyB0aGF0IHZhcnkKKyAqCW9uIG9mZnNldC4KKyAqLworaW50IGJpb19nZXRfbnJfdmVjcyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCXJlcXVlc3RfcXVldWVfdCAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGJkZXYpOworCWludCBucl9wYWdlczsKKworCW5yX3BhZ2VzID0gKChxLT5tYXhfc2VjdG9ycyA8PCA5KSArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJaWYgKG5yX3BhZ2VzID4gcS0+bWF4X3BoeXNfc2VnbWVudHMpCisJCW5yX3BhZ2VzID0gcS0+bWF4X3BoeXNfc2VnbWVudHM7CisJaWYgKG5yX3BhZ2VzID4gcS0+bWF4X2h3X3NlZ21lbnRzKQorCQlucl9wYWdlcyA9IHEtPm1heF9od19zZWdtZW50czsKKworCXJldHVybiBucl9wYWdlczsKK30KKworc3RhdGljIGludCBfX2Jpb19hZGRfcGFnZShyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IHBhZ2UKKwkJCSAgKnBhZ2UsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJaW50IHJldHJpZWRfc2VnbWVudHMgPSAwOworCXN0cnVjdCBiaW9fdmVjICpidmVjOworCisJLyoKKwkgKiBjbG9uZWQgYmlvIG11c3Qgbm90IG1vZGlmeSB2ZWMgbGlzdAorCSAqLworCWlmICh1bmxpa2VseShiaW9fZmxhZ2dlZChiaW8sIEJJT19DTE9ORUQpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYmlvLT5iaV92Y250ID49IGJpby0+YmlfbWF4X3ZlY3MpCisJCXJldHVybiAwOworCisJaWYgKCgoYmlvLT5iaV9zaXplICsgbGVuKSA+PiA5KSA+IHEtPm1heF9zZWN0b3JzKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogd2UgbWlnaHQgbG9zZSBhIHNlZ21lbnQgb3IgdHdvIGhlcmUsIGJ1dCByYXRoZXIgdGhhdCB0aGFuCisJICogbWFrZSB0aGlzIHRvbyBjb21wbGV4LgorCSAqLworCisJd2hpbGUgKGJpby0+YmlfcGh5c19zZWdtZW50cyA+PSBxLT5tYXhfcGh5c19zZWdtZW50cworCSAgICAgICB8fCBiaW8tPmJpX2h3X3NlZ21lbnRzID49IHEtPm1heF9od19zZWdtZW50cworCSAgICAgICB8fCBCSU9WRUNfVklSVF9PVkVSU0laRShiaW8tPmJpX3NpemUpKSB7CisKKwkJaWYgKHJldHJpZWRfc2VnbWVudHMpCisJCQlyZXR1cm4gMDsKKworCQlyZXRyaWVkX3NlZ21lbnRzID0gMTsKKwkJYmxrX3JlY291bnRfc2VnbWVudHMocSwgYmlvKTsKKwl9CisKKwkvKgorCSAqIHNldHVwIHRoZSBuZXcgZW50cnksIHdlIG1pZ2h0IGNsZWFyIGl0IGFnYWluIGxhdGVyIGlmIHdlCisJICogY2Fubm90IGFkZCB0aGUgcGFnZQorCSAqLworCWJ2ZWMgPSAmYmlvLT5iaV9pb192ZWNbYmlvLT5iaV92Y250XTsKKwlidmVjLT5idl9wYWdlID0gcGFnZTsKKwlidmVjLT5idl9sZW4gPSBsZW47CisJYnZlYy0+YnZfb2Zmc2V0ID0gb2Zmc2V0OworCisJLyoKKwkgKiBpZiBxdWV1ZSBoYXMgb3RoZXIgcmVzdHJpY3Rpb25zIChlZyB2YXJ5aW5nIG1heCBzZWN0b3Igc2l6ZQorCSAqIGRlcGVuZGluZyBvbiBvZmZzZXQpLCBpdCBjYW4gc3BlY2lmeSBhIG1lcmdlX2J2ZWNfZm4gaW4gdGhlCisJICogcXVldWUgdG8gZ2V0IGZ1cnRoZXIgY29udHJvbAorCSAqLworCWlmIChxLT5tZXJnZV9idmVjX2ZuKSB7CisJCS8qCisJCSAqIG1lcmdlX2J2ZWNfZm4oKSByZXR1cm5zIG51bWJlciBvZiBieXRlcyBpdCBjYW4gYWNjZXB0CisJCSAqIGF0IHRoaXMgb2Zmc2V0CisJCSAqLworCQlpZiAocS0+bWVyZ2VfYnZlY19mbihxLCBiaW8sIGJ2ZWMpIDwgbGVuKSB7CisJCQlidmVjLT5idl9wYWdlID0gTlVMTDsKKwkJCWJ2ZWMtPmJ2X2xlbiA9IDA7CisJCQlidmVjLT5idl9vZmZzZXQgPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBJZiB3ZSBtYXkgYmUgYWJsZSB0byBtZXJnZSB0aGVzZSBiaW92ZWNzLCBmb3JjZSBhIHJlY291bnQgKi8KKwlpZiAoYmlvLT5iaV92Y250ICYmIChCSU9WRUNfUEhZU19NRVJHRUFCTEUoYnZlYy0xLCBidmVjKSB8fAorCSAgICBCSU9WRUNfVklSVF9NRVJHRUFCTEUoYnZlYy0xLCBidmVjKSkpCisJCWJpby0+YmlfZmxhZ3MgJj0gfigxIDw8IEJJT19TRUdfVkFMSUQpOworCisJYmlvLT5iaV92Y250Kys7CisJYmlvLT5iaV9waHlzX3NlZ21lbnRzKys7CisJYmlvLT5iaV9od19zZWdtZW50cysrOworCWJpby0+Ymlfc2l6ZSArPSBsZW47CisJcmV0dXJuIGxlbjsKK30KKworLyoqCisgKgliaW9fYWRkX3BhZ2UJLQlhdHRlbXB0IHRvIGFkZCBwYWdlIHRvIGJpbworICoJQGJpbzogZGVzdGluYXRpb24gYmlvCisgKglAcGFnZTogcGFnZSB0byBhZGQKKyAqCUBsZW46IHZlYyBlbnRyeSBsZW5ndGgKKyAqCUBvZmZzZXQ6IHZlYyBlbnRyeSBvZmZzZXQKKyAqCisgKglBdHRlbXB0IHRvIGFkZCBhIHBhZ2UgdG8gdGhlIGJpb192ZWMgbWFwbGlzdC4gVGhpcyBjYW4gZmFpbCBmb3IgYQorICoJbnVtYmVyIG9mIHJlYXNvbnMsIHN1Y2ggYXMgdGhlIGJpbyBiZWluZyBmdWxsIG9yIHRhcmdldCBibG9jaworICoJZGV2aWNlIGxpbWl0YXRpb25zLiBUaGUgdGFyZ2V0IGJsb2NrIGRldmljZSBtdXN0IGFsbG93IGJpbydzCisgKiAgICAgIHNtYWxsZXIgdGhhbiBQQUdFX1NJWkUsIHNvIGl0IGlzIGFsd2F5cyBwb3NzaWJsZSB0byBhZGQgYSBzaW5nbGUKKyAqICAgICAgcGFnZSB0byBhbiBlbXB0eSBiaW8uCisgKi8KK2ludCBiaW9fYWRkX3BhZ2Uoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IGxlbiwKKwkJIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJcmV0dXJuIF9fYmlvX2FkZF9wYWdlKGJkZXZfZ2V0X3F1ZXVlKGJpby0+YmlfYmRldiksIGJpbywgcGFnZSwKKwkJCSAgICAgIGxlbiwgb2Zmc2V0KTsKK30KKworc3RydWN0IGJpb19tYXBfZGF0YSB7CisJc3RydWN0IGJpb192ZWMgKmlvdmVjczsKKwl2b2lkIF9fdXNlciAqdXNlcnB0cjsKK307CisKK3N0YXRpYyB2b2lkIGJpb19zZXRfbWFwX2RhdGEoc3RydWN0IGJpb19tYXBfZGF0YSAqYm1kLCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJbWVtY3B5KGJtZC0+aW92ZWNzLCBiaW8tPmJpX2lvX3ZlYywgc2l6ZW9mKHN0cnVjdCBiaW9fdmVjKSAqIGJpby0+YmlfdmNudCk7CisJYmlvLT5iaV9wcml2YXRlID0gYm1kOworfQorCitzdGF0aWMgdm9pZCBiaW9fZnJlZV9tYXBfZGF0YShzdHJ1Y3QgYmlvX21hcF9kYXRhICpibWQpCit7CisJa2ZyZWUoYm1kLT5pb3ZlY3MpOworCWtmcmVlKGJtZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmlvX21hcF9kYXRhICpiaW9fYWxsb2NfbWFwX2RhdGEoaW50IG5yX3NlZ3MpCit7CisJc3RydWN0IGJpb19tYXBfZGF0YSAqYm1kID0ga21hbGxvYyhzaXplb2YoKmJtZCksIEdGUF9LRVJORUwpOworCisJaWYgKCFibWQpCisJCXJldHVybiBOVUxMOworCisJYm1kLT5pb3ZlY3MgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYmlvX3ZlYykgKiBucl9zZWdzLCBHRlBfS0VSTkVMKTsKKwlpZiAoYm1kLT5pb3ZlY3MpCisJCXJldHVybiBibWQ7CisKKwlrZnJlZShibWQpOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqCWJpb191bmNvcHlfdXNlcgktCWZpbmlzaCBwcmV2aW91c2x5IG1hcHBlZCBiaW8KKyAqCUBiaW86IGJpbyBiZWluZyB0ZXJtaW5hdGVkCisgKgorICoJRnJlZSBwYWdlcyBhbGxvY2F0ZWQgZnJvbSBiaW9fY29weV91c2VyKCkgYW5kIHdyaXRlIGJhY2sgZGF0YQorICoJdG8gdXNlciBzcGFjZSBpbiBjYXNlIG9mIGEgcmVhZC4KKyAqLworaW50IGJpb191bmNvcHlfdXNlcihzdHJ1Y3QgYmlvICpiaW8pCit7CisJc3RydWN0IGJpb19tYXBfZGF0YSAqYm1kID0gYmlvLT5iaV9wcml2YXRlOworCWNvbnN0IGludCByZWFkID0gYmlvX2RhdGFfZGlyKGJpbykgPT0gUkVBRDsKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKKwlpbnQgaSwgcmV0ID0gMDsKKworCV9fYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpLCAwKSB7CisJCWNoYXIgKmFkZHIgPSBwYWdlX2FkZHJlc3MoYnZlYy0+YnZfcGFnZSk7CisJCXVuc2lnbmVkIGludCBsZW4gPSBibWQtPmlvdmVjc1tpXS5idl9sZW47CisKKwkJaWYgKHJlYWQgJiYgIXJldCAmJiBjb3B5X3RvX3VzZXIoYm1kLT51c2VycHRyLCBhZGRyLCBsZW4pKQorCQkJcmV0ID0gLUVGQVVMVDsKKworCQlfX2ZyZWVfcGFnZShidmVjLT5idl9wYWdlKTsKKwkJYm1kLT51c2VycHRyICs9IGxlbjsKKwl9CisJYmlvX2ZyZWVfbWFwX2RhdGEoYm1kKTsKKwliaW9fcHV0KGJpbyk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKgliaW9fY29weV91c2VyCS0JY29weSB1c2VyIGRhdGEgdG8gYmlvCisgKglAcTogZGVzdGluYXRpb24gYmxvY2sgcXVldWUKKyAqCUB1YWRkcjogc3RhcnQgb2YgdXNlciBhZGRyZXNzCisgKglAbGVuOiBsZW5ndGggaW4gYnl0ZXMKKyAqCUB3cml0ZV90b192bTogYm9vbCBpbmRpY2F0aW5nIHdyaXRpbmcgdG8gcGFnZXMgb3Igbm90CisgKgorICoJUHJlcGFyZXMgYW5kIHJldHVybnMgYSBiaW8gZm9yIGluZGlyZWN0IHVzZXIgaW8sIGJvdW5jaW5nIGRhdGEKKyAqCXRvL2Zyb20ga2VybmVsIHBhZ2VzIGFzIG5lY2Vzc2FyeS4gTXVzdCBiZSBwYWlyZWQgd2l0aAorICoJY2FsbCBiaW9fdW5jb3B5X3VzZXIoKSBvbiBpbyBjb21wbGV0aW9uLgorICovCitzdHJ1Y3QgYmlvICpiaW9fY29weV91c2VyKHJlcXVlc3RfcXVldWVfdCAqcSwgdW5zaWduZWQgbG9uZyB1YWRkciwKKwkJCSAgdW5zaWduZWQgaW50IGxlbiwgaW50IHdyaXRlX3RvX3ZtKQoreworCXVuc2lnbmVkIGxvbmcgZW5kID0gKHVhZGRyICsgbGVuICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gdWFkZHIgPj4gUEFHRV9TSElGVDsKKwlzdHJ1Y3QgYmlvX21hcF9kYXRhICpibWQ7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWM7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IGJpbyAqYmlvOworCWludCBpLCByZXQ7CisKKwlibWQgPSBiaW9fYWxsb2NfbWFwX2RhdGEoZW5kIC0gc3RhcnQpOworCWlmICghYm1kKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWJtZC0+dXNlcnB0ciA9ICh2b2lkIF9fdXNlciAqKSB1YWRkcjsKKworCXJldCA9IC1FTk9NRU07CisJYmlvID0gYmlvX2FsbG9jKEdGUF9LRVJORUwsIGVuZCAtIHN0YXJ0KTsKKwlpZiAoIWJpbykKKwkJZ290byBvdXRfYm1kOworCisJYmlvLT5iaV9ydyB8PSAoIXdyaXRlX3RvX3ZtIDw8IEJJT19SVyk7CisKKwlyZXQgPSAwOworCXdoaWxlIChsZW4pIHsKKwkJdW5zaWduZWQgaW50IGJ5dGVzID0gUEFHRV9TSVpFOworCisJCWlmIChieXRlcyA+IGxlbikKKwkJCWJ5dGVzID0gbGVuOworCisJCXBhZ2UgPSBhbGxvY19wYWdlKHEtPmJvdW5jZV9nZnAgfCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwYWdlKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoX19iaW9fYWRkX3BhZ2UocSwgYmlvLCBwYWdlLCBieXRlcywgMCkgPCBieXRlcykgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJbGVuIC09IGJ5dGVzOworCX0KKworCWlmIChyZXQpCisJCWdvdG8gY2xlYW51cDsKKworCS8qCisJICogc3VjY2VzcworCSAqLworCWlmICghd3JpdGVfdG9fdm0pIHsKKwkJY2hhciBfX3VzZXIgKnAgPSAoY2hhciBfX3VzZXIgKikgdWFkZHI7CisKKwkJLyoKKwkJICogZm9yIGEgd3JpdGUsIGNvcHkgaW4gZGF0YSB0byBrZXJuZWwgcGFnZXMKKwkJICovCisJCXJldCA9IC1FRkFVTFQ7CisJCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaSkgeworCQkJY2hhciAqYWRkciA9IHBhZ2VfYWRkcmVzcyhidmVjLT5idl9wYWdlKTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGFkZHIsIHAsIGJ2ZWMtPmJ2X2xlbikpCisJCQkJZ290byBjbGVhbnVwOworCQkJcCArPSBidmVjLT5idl9sZW47CisJCX0KKwl9CisKKwliaW9fc2V0X21hcF9kYXRhKGJtZCwgYmlvKTsKKwlyZXR1cm4gYmlvOworY2xlYW51cDoKKwliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGkpCisJCV9fZnJlZV9wYWdlKGJ2ZWMtPmJ2X3BhZ2UpOworCisJYmlvX3B1dChiaW8pOworb3V0X2JtZDoKKwliaW9fZnJlZV9tYXBfZGF0YShibWQpOworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmlvICpfX2Jpb19tYXBfdXNlcihyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCQkJICB1bnNpZ25lZCBsb25nIHVhZGRyLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJCSAgaW50IHdyaXRlX3RvX3ZtKQoreworCXVuc2lnbmVkIGxvbmcgZW5kID0gKHVhZGRyICsgbGVuICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gdWFkZHIgPj4gUEFHRV9TSElGVDsKKwljb25zdCBpbnQgbnJfcGFnZXMgPSBlbmQgLSBzdGFydDsKKwlpbnQgcmV0LCBvZmZzZXQsIGk7CisJc3RydWN0IHBhZ2UgKipwYWdlczsKKwlzdHJ1Y3QgYmlvICpiaW87CisKKwkvKgorCSAqIHRyYW5zZmVyIGFuZCBidWZmZXIgbXVzdCBiZSBhbGlnbmVkIHRvIGF0IGxlYXN0IGhhcmRzZWN0b3IKKwkgKiBzaXplIGZvciBub3csIGluIHRoZSBmdXR1cmUgd2UgY2FuIHJlbGF4IHRoaXMgcmVzdHJpY3Rpb24KKwkgKi8KKwlpZiAoKHVhZGRyICYgcXVldWVfZG1hX2FsaWdubWVudChxKSkgfHwgKGxlbiAmIHF1ZXVlX2RtYV9hbGlnbm1lbnQocSkpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWJpbyA9IGJpb19hbGxvYyhHRlBfS0VSTkVMLCBucl9wYWdlcyk7CisJaWYgKCFiaW8pCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJcmV0ID0gLUVOT01FTTsKKwlwYWdlcyA9IGttYWxsb2MobnJfcGFnZXMgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKiksIEdGUF9LRVJORUwpOworCWlmICghcGFnZXMpCisJCWdvdG8gb3V0OworCisJZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCXJldCA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCB1YWRkciwgbnJfcGFnZXMsCisJCQkJCQl3cml0ZV90b192bSwgMCwgcGFnZXMsIE5VTEwpOworCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisKKwlpZiAocmV0IDwgbnJfcGFnZXMpCisJCWdvdG8gb3V0OworCisJYmlvLT5iaV9iZGV2ID0gYmRldjsKKworCW9mZnNldCA9IHVhZGRyICYgflBBR0VfTUFTSzsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgYnl0ZXMgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7CisKKwkJaWYgKGxlbiA8PSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKGJ5dGVzID4gbGVuKQorCQkJYnl0ZXMgPSBsZW47CisKKwkJLyoKKwkJICogc29ycnkuLi4KKwkJICovCisJCWlmIChfX2Jpb19hZGRfcGFnZShxLCBiaW8sIHBhZ2VzW2ldLCBieXRlcywgb2Zmc2V0KSA8IGJ5dGVzKQorCQkJYnJlYWs7CisKKwkJbGVuIC09IGJ5dGVzOworCQlvZmZzZXQgPSAwOworCX0KKworCS8qCisJICogcmVsZWFzZSB0aGUgcGFnZXMgd2UgZGlkbid0IG1hcCBpbnRvIHRoZSBiaW8sIGlmIGFueQorCSAqLworCXdoaWxlIChpIDwgbnJfcGFnZXMpCisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlc1tpKytdKTsKKworCWtmcmVlKHBhZ2VzKTsKKworCS8qCisJICogc2V0IGRhdGEgZGlyZWN0aW9uLCBhbmQgY2hlY2sgaWYgbWFwcGVkIHBhZ2VzIG5lZWQgYm91bmNpbmcKKwkgKi8KKwlpZiAoIXdyaXRlX3RvX3ZtKQorCQliaW8tPmJpX3J3IHw9ICgxIDw8IEJJT19SVyk7CisKKwliaW8tPmJpX2ZsYWdzIHw9ICgxIDw8IEJJT19VU0VSX01BUFBFRCk7CisJcmV0dXJuIGJpbzsKK291dDoKKwlrZnJlZShwYWdlcyk7CisJYmlvX3B1dChiaW8pOworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CisKKy8qKgorICoJYmlvX21hcF91c2VyCS0JbWFwIHVzZXIgYWRkcmVzcyBpbnRvIGJpbworICoJQGJkZXY6IGRlc3RpbmF0aW9uIGJsb2NrIGRldmljZQorICoJQHVhZGRyOiBzdGFydCBvZiB1c2VyIGFkZHJlc3MKKyAqCUBsZW46IGxlbmd0aCBpbiBieXRlcworICoJQHdyaXRlX3RvX3ZtOiBib29sIGluZGljYXRpbmcgd3JpdGluZyB0byBwYWdlcyBvciBub3QKKyAqCisgKglNYXAgdGhlIHVzZXIgc3BhY2UgYWRkcmVzcyBpbnRvIGEgYmlvIHN1aXRhYmxlIGZvciBpbyB0byBhIGJsb2NrCisgKglkZXZpY2UuIFJldHVybnMgYW4gZXJyb3IgcG9pbnRlciBpbiBjYXNlIG9mIGVycm9yLgorICovCitzdHJ1Y3QgYmlvICpiaW9fbWFwX3VzZXIocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJIHVuc2lnbmVkIGxvbmcgdWFkZHIsIHVuc2lnbmVkIGludCBsZW4sIGludCB3cml0ZV90b192bSkKK3sKKwlzdHJ1Y3QgYmlvICpiaW87CisKKwliaW8gPSBfX2Jpb19tYXBfdXNlcihxLCBiZGV2LCB1YWRkciwgbGVuLCB3cml0ZV90b192bSk7CisKKwlpZiAoSVNfRVJSKGJpbykpCisJCXJldHVybiBiaW87CisKKwkvKgorCSAqIHN1YnRsZSAtLSBpZiBfX2Jpb19tYXBfdXNlcigpIGVuZGVkIHVwIGJvdW5jaW5nIGEgYmlvLAorCSAqIGl0IHdvdWxkIG5vcm1hbGx5IGRpc2FwcGVhciB3aGVuIGl0cyBiaV9lbmRfaW8gaXMgcnVuLgorCSAqIGhvd2V2ZXIsIHdlIG5lZWQgaXQgZm9yIHRoZSB1bm1hcCwgc28gZ3JhYiBhbiBleHRyYQorCSAqIHJlZmVyZW5jZSB0byBpdAorCSAqLworCWJpb19nZXQoYmlvKTsKKworCWlmIChiaW8tPmJpX3NpemUgPT0gbGVuKQorCQlyZXR1cm4gYmlvOworCisJLyoKKwkgKiBkb24ndCBzdXBwb3J0IHBhcnRpYWwgbWFwcGluZ3MKKwkgKi8KKwliaW9fZW5kaW8oYmlvLCBiaW8tPmJpX3NpemUsIDApOworCWJpb191bm1hcF91c2VyKGJpbyk7CisJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fYmlvX3VubWFwX3VzZXIoc3RydWN0IGJpbyAqYmlvKQoreworCXN0cnVjdCBiaW9fdmVjICpidmVjOworCWludCBpOworCisJLyoKKwkgKiBtYWtlIHN1cmUgd2UgZGlydHkgcGFnZXMgd2Ugd3JvdGUgdG8KKwkgKi8KKwlfX2Jpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaSwgMCkgeworCQlpZiAoYmlvX2RhdGFfZGlyKGJpbykgPT0gUkVBRCkKKwkJCXNldF9wYWdlX2RpcnR5X2xvY2soYnZlYy0+YnZfcGFnZSk7CisKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKGJ2ZWMtPmJ2X3BhZ2UpOworCX0KKworCWJpb19wdXQoYmlvKTsKK30KKworLyoqCisgKgliaW9fdW5tYXBfdXNlcgktCXVubWFwIGEgYmlvCisgKglAYmlvOgkJdGhlIGJpbyBiZWluZyB1bm1hcHBlZAorICoKKyAqCVVubWFwIGEgYmlvIHByZXZpb3VzbHkgbWFwcGVkIGJ5IGJpb19tYXBfdXNlcigpLiBNdXN0IGJlIGNhbGxlZCB3aXRoCisgKglhIHByb2Nlc3MgY29udGV4dC4KKyAqCisgKgliaW9fdW5tYXBfdXNlcigpIG1heSBzbGVlcC4KKyAqLwordm9pZCBiaW9fdW5tYXBfdXNlcihzdHJ1Y3QgYmlvICpiaW8pCit7CisJX19iaW9fdW5tYXBfdXNlcihiaW8pOworCWJpb19wdXQoYmlvKTsKK30KKworLyoKKyAqIGJpb19zZXRfcGFnZXNfZGlydHkoKSBhbmQgYmlvX2NoZWNrX3BhZ2VzX2RpcnR5KCkgYXJlIHN1cHBvcnQgZnVuY3Rpb25zCisgKiBmb3IgcGVyZm9ybWluZyBkaXJlY3QtSU8gaW4gQklPcy4KKyAqCisgKiBUaGUgcHJvYmxlbSBpcyB0aGF0IHdlIGNhbm5vdCBydW4gc2V0X3BhZ2VfZGlydHkoKSBmcm9tIGludGVycnVwdCBjb250ZXh0CisgKiBiZWNhdXNlIHRoZSByZXF1aXJlZCBsb2NrcyBhcmUgbm90IGludGVycnVwdC1zYWZlLiAgU28gd2hhdCB3ZSBjYW4gZG8gaXMgdG8KKyAqIG1hcmsgdGhlIHBhZ2VzIGRpcnR5IF9iZWZvcmVfIHBlcmZvcm1pbmcgSU8uICBBbmQgaW4gaW50ZXJydXB0IGNvbnRleHQsCisgKiBjaGVjayB0aGF0IHRoZSBwYWdlcyBhcmUgc3RpbGwgZGlydHkuICAgSWYgc28sIGZpbmUuICBJZiBub3QsIHJlZGlydHkgdGhlbQorICogaW4gcHJvY2VzcyBjb250ZXh0LgorICoKKyAqIFdlIHNwZWNpYWwtY2FzZSBjb21wb3VuZCBwYWdlcyBoZXJlOiBub3JtYWxseSB0aGlzIG1lYW5zIHJlYWRzIGludG8gaHVnZXRsYgorICogcGFnZXMuICBUaGUgbG9naWMgaW4gaGVyZSBkb2Vzbid0IHJlYWxseSB3b3JrIHJpZ2h0IGZvciBjb21wb3VuZCBwYWdlcworICogYmVjYXVzZSB0aGUgVk0gZG9lcyBub3QgdW5pZm9ybWx5IGNoYXNlIGRvd24gdGhlIGhlYWQgcGFnZSBpbiBhbGwgY2FzZXMuCisgKiBCdXQgZGlydGluZXNzIG9mIGNvbXBvdW5kIHBhZ2VzIGlzIHByZXR0eSBtZWFuaW5nbGVzcyBhbnl3YXk6IHRoZSBWTSBkb2Vzbid0CisgKiBoYW5kbGUgdGhlbSBhdCBhbGwuICBTbyB3ZSBza2lwIGNvbXBvdW5kIHBhZ2VzIGhlcmUgYXQgYW4gZWFybHkgc3RhZ2UuCisgKgorICogTm90ZSB0aGF0IHRoaXMgY29kZSBpcyB2ZXJ5IGhhcmQgdG8gdGVzdCB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcyBiZWNhdXNlCisgKiBkaXJlY3QtaW8gcGlucyB0aGUgcGFnZXMgd2l0aCBnZXRfdXNlcl9wYWdlcygpLiAgVGhpcyBtYWtlcworICogaXNfcGFnZV9jYWNoZV9mcmVlYWJsZSByZXR1cm4gZmFsc2UsIGFuZCB0aGUgVk0gd2lsbCBub3QgY2xlYW4gdGhlIHBhZ2VzLgorICogQnV0IG90aGVyIGNvZGUgKGVnLCBwZGZsdXNoKSBjb3VsZCBjbGVhbiB0aGUgcGFnZXMgaWYgdGhleSBhcmUgbWFwcGVkCisgKiBwYWdlY2FjaGUuCisgKgorICogU2ltcGx5IGRpc2FibGluZyB0aGUgY2FsbCB0byBiaW9fc2V0X3BhZ2VzX2RpcnR5KCkgaXMgYSBnb29kIHdheSB0byB0ZXN0IHRoZQorICogZGVmZXJyZWQgYmlvIGRpcnR5aW5nIHBhdGhzLgorICovCisKKy8qCisgKiBiaW9fc2V0X3BhZ2VzX2RpcnR5KCkgd2lsbCBtYXJrIGFsbCB0aGUgYmlvJ3MgcGFnZXMgYXMgZGlydHkuCisgKi8KK3ZvaWQgYmlvX3NldF9wYWdlc19kaXJ0eShzdHJ1Y3QgYmlvICpiaW8pCit7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBiaW8tPmJpX3ZjbnQ7IGkrKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGJ2ZWNbaV0uYnZfcGFnZTsKKworCQlpZiAocGFnZSAmJiAhUGFnZUNvbXBvdW5kKHBhZ2UpKQorCQkJc2V0X3BhZ2VfZGlydHlfbG9jayhwYWdlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJpb19yZWxlYXNlX3BhZ2VzKHN0cnVjdCBiaW8gKmJpbykKK3sKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYyA9IGJpby0+YmlfaW9fdmVjOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGJpby0+YmlfdmNudDsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gYnZlY1tpXS5idl9wYWdlOworCisJCWlmIChwYWdlKQorCQkJcHV0X3BhZ2UocGFnZSk7CisJfQorfQorCisvKgorICogYmlvX2NoZWNrX3BhZ2VzX2RpcnR5KCkgd2lsbCBjaGVjayB0aGF0IGFsbCB0aGUgQklPJ3MgcGFnZXMgYXJlIHN0aWxsIGRpcnR5LgorICogSWYgdGhleSBhcmUsIHRoZW4gZmluZS4gIElmLCBob3dldmVyLCBzb21lIHBhZ2VzIGFyZSBjbGVhbiB0aGVuIHRoZXkgbXVzdAorICogaGF2ZSBiZWVuIHdyaXR0ZW4gb3V0IGR1cmluZyB0aGUgZGlyZWN0LUlPIHJlYWQuICBTbyB3ZSB0YWtlIGFub3RoZXIgcmVmIG9uCisgKiB0aGUgQklPIGFuZCB0aGUgb2ZmZW5kaW5nIHBhZ2VzIGFuZCByZS1kaXJ0eSB0aGUgcGFnZXMgaW4gcHJvY2VzcyBjb250ZXh0LgorICoKKyAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgYmlvX2NoZWNrX3BhZ2VzX2RpcnR5KCkgd2lsbCB3aG9sbHkgb3duIHRoZSBCSU8gZnJvbQorICogaGVyZSBvbi4gIEl0IHdpbGwgcnVuIG9uZSBwYWdlX2NhY2hlX3JlbGVhc2UoKSBhZ2FpbnN0IGVhY2ggcGFnZSBhbmQgd2lsbAorICogcnVuIG9uZSBiaW9fcHV0KCkgYWdhaW5zdCB0aGUgQklPLgorICovCisKK3N0YXRpYyB2b2lkIGJpb19kaXJ0eV9mbih2b2lkICpkYXRhKTsKKworc3RhdGljIERFQ0xBUkVfV09SSyhiaW9fZGlydHlfd29yaywgYmlvX2RpcnR5X2ZuLCBOVUxMKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYmlvX2RpcnR5X2xvY2spOworc3RhdGljIHN0cnVjdCBiaW8gKmJpb19kaXJ0eV9saXN0OworCisvKgorICogVGhpcyBydW5zIGluIHByb2Nlc3MgY29udGV4dAorICovCitzdGF0aWMgdm9pZCBiaW9fZGlydHlfZm4odm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBiaW8gKmJpbzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiaW9fZGlydHlfbG9jaywgZmxhZ3MpOworCWJpbyA9IGJpb19kaXJ0eV9saXN0OworCWJpb19kaXJ0eV9saXN0ID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaW9fZGlydHlfbG9jaywgZmxhZ3MpOworCisJd2hpbGUgKGJpbykgeworCQlzdHJ1Y3QgYmlvICpuZXh0ID0gYmlvLT5iaV9wcml2YXRlOworCisJCWJpb19zZXRfcGFnZXNfZGlydHkoYmlvKTsKKwkJYmlvX3JlbGVhc2VfcGFnZXMoYmlvKTsKKwkJYmlvX3B1dChiaW8pOworCQliaW8gPSBuZXh0OworCX0KK30KKwordm9pZCBiaW9fY2hlY2tfcGFnZXNfZGlydHkoc3RydWN0IGJpbyAqYmlvKQoreworCXN0cnVjdCBiaW9fdmVjICpidmVjID0gYmlvLT5iaV9pb192ZWM7CisJaW50IG5yX2NsZWFuX3BhZ2VzID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBiaW8tPmJpX3ZjbnQ7IGkrKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGJ2ZWNbaV0uYnZfcGFnZTsKKworCQlpZiAoUGFnZURpcnR5KHBhZ2UpIHx8IFBhZ2VDb21wb3VuZChwYWdlKSkgeworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJYnZlY1tpXS5idl9wYWdlID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCW5yX2NsZWFuX3BhZ2VzKys7CisJCX0KKwl9CisKKwlpZiAobnJfY2xlYW5fcGFnZXMpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmlvX2RpcnR5X2xvY2ssIGZsYWdzKTsKKwkJYmlvLT5iaV9wcml2YXRlID0gYmlvX2RpcnR5X2xpc3Q7CisJCWJpb19kaXJ0eV9saXN0ID0gYmlvOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaW9fZGlydHlfbG9jaywgZmxhZ3MpOworCQlzY2hlZHVsZV93b3JrKCZiaW9fZGlydHlfd29yayk7CisJfSBlbHNlIHsKKwkJYmlvX3B1dChiaW8pOworCX0KK30KKworLyoqCisgKiBiaW9fZW5kaW8gLSBlbmQgSS9PIG9uIGEgYmlvCisgKiBAYmlvOgliaW8KKyAqIEBieXRlc19kb25lOgludW1iZXIgb2YgYnl0ZXMgY29tcGxldGVkCisgKiBAZXJyb3I6CWVycm9yLCBpZiBhbnkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgYmlvX2VuZGlvKCkgd2lsbCBlbmQgSS9PIG9uIEBieXRlc19kb25lIG51bWJlciBvZiBieXRlcy4gVGhpcyBtYXkgYmUKKyAqICAganVzdCBhIHBhcnRpYWwgcGFydCBvZiB0aGUgYmlvLCBvciBpdCBtYXkgYmUgdGhlIHdob2xlIGJpby4gYmlvX2VuZGlvKCkKKyAqICAgaXMgdGhlIHByZWZlcnJlZCB3YXkgdG8gZW5kIEkvTyBvbiBhIGJpbywgaXQgdGFrZXMgY2FyZSBvZiBkZWNyZW1lbnRpbmcKKyAqICAgYmlfc2l6ZSBhbmQgY2xlYXJpbmcgQklPX1VQVE9EQVRFIG9uIGVycm9yLiBAZXJyb3IgaXMgMCBvbiBzdWNjZXNzLCBhbmQKKyAqICAgYW5kIG9uZSBvZiB0aGUgZXN0YWJsaXNoZWQgLUV4eHh4ICgtRUlPLCBmb3IgaW5zdGFuY2UpIGVycm9yIHZhbHVlcyBpbgorICogICBjYXNlIHNvbWV0aGluZyB3ZW50IHdyb25nLiBOb29uZSBzaG91bGQgY2FsbCBiaV9lbmRfaW8oKSBkaXJlY3RseSBvbgorICogICBhIGJpbyB1bmxlc3MgdGhleSBvd24gaXQgYW5kIHRodXMga25vdyB0aGF0IGl0IGhhcyBhbiBlbmRfaW8gZnVuY3Rpb24uCisgKiovCit2b2lkIGJpb19lbmRpbyhzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGludCBieXRlc19kb25lLCBpbnQgZXJyb3IpCit7CisJaWYgKGVycm9yKQorCQljbGVhcl9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CisKKwlpZiAodW5saWtlbHkoYnl0ZXNfZG9uZSA+IGJpby0+Ymlfc2l6ZSkpIHsKKwkJcHJpbnRrKCIlczogd2FudCAldSBieXRlcyBkb25lLCBvbmx5ICV1IGxlZnRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkJCWJ5dGVzX2RvbmUsIGJpby0+Ymlfc2l6ZSk7CisJCWJ5dGVzX2RvbmUgPSBiaW8tPmJpX3NpemU7CisJfQorCisJYmlvLT5iaV9zaXplIC09IGJ5dGVzX2RvbmU7CisJYmlvLT5iaV9zZWN0b3IgKz0gKGJ5dGVzX2RvbmUgPj4gOSk7CisKKwlpZiAoYmlvLT5iaV9lbmRfaW8pCisJCWJpby0+YmlfZW5kX2lvKGJpbywgYnl0ZXNfZG9uZSwgZXJyb3IpOworfQorCit2b2lkIGJpb19wYWlyX3JlbGVhc2Uoc3RydWN0IGJpb19wYWlyICpicCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYnAtPmNudCkpIHsKKwkJc3RydWN0IGJpbyAqbWFzdGVyID0gYnAtPmJpbzEuYmlfcHJpdmF0ZTsKKworCQliaW9fZW5kaW8obWFzdGVyLCBtYXN0ZXItPmJpX3NpemUsIGJwLT5lcnJvcik7CisJCW1lbXBvb2xfZnJlZShicCwgYnAtPmJpbzIuYmlfcHJpdmF0ZSk7CisJfQorfQorCitzdGF0aWMgaW50IGJpb19wYWlyX2VuZF8xKHN0cnVjdCBiaW8gKiBiaSwgdW5zaWduZWQgaW50IGRvbmUsIGludCBlcnIpCit7CisJc3RydWN0IGJpb19wYWlyICpicCA9IGNvbnRhaW5lcl9vZihiaSwgc3RydWN0IGJpb19wYWlyLCBiaW8xKTsKKworCWlmIChlcnIpCisJCWJwLT5lcnJvciA9IGVycjsKKworCWlmIChiaS0+Ymlfc2l6ZSkKKwkJcmV0dXJuIDE7CisKKwliaW9fcGFpcl9yZWxlYXNlKGJwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiaW9fcGFpcl9lbmRfMihzdHJ1Y3QgYmlvICogYmksIHVuc2lnbmVkIGludCBkb25lLCBpbnQgZXJyKQoreworCXN0cnVjdCBiaW9fcGFpciAqYnAgPSBjb250YWluZXJfb2YoYmksIHN0cnVjdCBiaW9fcGFpciwgYmlvMik7CisKKwlpZiAoZXJyKQorCQlicC0+ZXJyb3IgPSBlcnI7CisKKwlpZiAoYmktPmJpX3NpemUpCisJCXJldHVybiAxOworCisJYmlvX3BhaXJfcmVsZWFzZShicCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzcGxpdCBhIGJpbyAtIG9ubHkgd29ycnkgYWJvdXQgYSBiaW8gd2l0aCBhIHNpbmdsZSBwYWdlCisgKiBpbiBpdCdzIGlvdmVjCisgKi8KK3N0cnVjdCBiaW9fcGFpciAqYmlvX3NwbGl0KHN0cnVjdCBiaW8gKmJpLCBtZW1wb29sX3QgKnBvb2wsIGludCBmaXJzdF9zZWN0b3JzKQoreworCXN0cnVjdCBiaW9fcGFpciAqYnAgPSBtZW1wb29sX2FsbG9jKHBvb2wsIEdGUF9OT0lPKTsKKworCWlmICghYnApCisJCXJldHVybiBicDsKKworCUJVR19PTihiaS0+YmlfdmNudCAhPSAxKTsKKwlCVUdfT04oYmktPmJpX2lkeCAhPSAwKTsKKwlhdG9taWNfc2V0KCZicC0+Y250LCAzKTsKKwlicC0+ZXJyb3IgPSAwOworCWJwLT5iaW8xID0gKmJpOworCWJwLT5iaW8yID0gKmJpOworCWJwLT5iaW8yLmJpX3NlY3RvciArPSBmaXJzdF9zZWN0b3JzOworCWJwLT5iaW8yLmJpX3NpemUgLT0gZmlyc3Rfc2VjdG9ycyA8PCA5OworCWJwLT5iaW8xLmJpX3NpemUgPSBmaXJzdF9zZWN0b3JzIDw8IDk7CisKKwlicC0+YnYxID0gYmktPmJpX2lvX3ZlY1swXTsKKwlicC0+YnYyID0gYmktPmJpX2lvX3ZlY1swXTsKKwlicC0+YnYyLmJ2X29mZnNldCArPSBmaXJzdF9zZWN0b3JzIDw8IDk7CisJYnAtPmJ2Mi5idl9sZW4gLT0gZmlyc3Rfc2VjdG9ycyA8PCA5OworCWJwLT5idjEuYnZfbGVuID0gZmlyc3Rfc2VjdG9ycyA8PCA5OworCisJYnAtPmJpbzEuYmlfaW9fdmVjID0gJmJwLT5idjE7CisJYnAtPmJpbzIuYmlfaW9fdmVjID0gJmJwLT5idjI7CisKKwlicC0+YmlvMS5iaV9lbmRfaW8gPSBiaW9fcGFpcl9lbmRfMTsKKwlicC0+YmlvMi5iaV9lbmRfaW8gPSBiaW9fcGFpcl9lbmRfMjsKKworCWJwLT5iaW8xLmJpX3ByaXZhdGUgPSBiaTsKKwlicC0+YmlvMi5iaV9wcml2YXRlID0gcG9vbDsKKworCXJldHVybiBicDsKK30KKworc3RhdGljIHZvaWQgKmJpb19wYWlyX2FsbG9jKHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfZmxhZ3MsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBiaW9fcGFpciksIGdmcF9mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGJpb19wYWlyX2ZyZWUodm9pZCAqYnAsIHZvaWQgKmRhdGEpCit7CisJa2ZyZWUoYnApOworfQorCisKKy8qCisgKiBjcmVhdGUgbWVtb3J5IHBvb2xzIGZvciBiaW92ZWMncyBpbiBhIGJpb19zZXQuCisgKiB1c2UgdGhlIGdsb2JhbCBiaW92ZWMgc2xhYnMgY3JlYXRlZCBmb3IgZ2VuZXJhbCB1c2UuCisgKi8KK3N0YXRpYyBpbnQgYmlvdmVjX2NyZWF0ZV9wb29scyhzdHJ1Y3QgYmlvX3NldCAqYnMsIGludCBwb29sX2VudHJpZXMsIGludCBzY2FsZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBCSU9WRUNfTlJfUE9PTFM7IGkrKykgeworCQlzdHJ1Y3QgYmlvdmVjX3NsYWIgKmJwID0gYnZlY19zbGFicyArIGk7CisJCW1lbXBvb2xfdCAqKmJ2cCA9IGJzLT5idmVjX3Bvb2xzICsgaTsKKworCQlpZiAoaSA+PSBzY2FsZSkKKwkJCXBvb2xfZW50cmllcyA+Pj0gMTsKKworCQkqYnZwID0gbWVtcG9vbF9jcmVhdGUocG9vbF9lbnRyaWVzLCBtZW1wb29sX2FsbG9jX3NsYWIsCisJCQkJCW1lbXBvb2xfZnJlZV9zbGFiLCBicC0+c2xhYik7CisJCWlmICghKmJ2cCkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmlvdmVjX2ZyZWVfcG9vbHMoc3RydWN0IGJpb19zZXQgKmJzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEJJT1ZFQ19OUl9QT09MUzsgaSsrKSB7CisJCW1lbXBvb2xfdCAqYnZwID0gYnMtPmJ2ZWNfcG9vbHNbaV07CisKKwkJaWYgKGJ2cCkKKwkJCW1lbXBvb2xfZGVzdHJveShidnApOworCX0KKworfQorCit2b2lkIGJpb3NldF9mcmVlKHN0cnVjdCBiaW9fc2V0ICpicykKK3sKKwlpZiAoYnMtPmJpb19wb29sKQorCQltZW1wb29sX2Rlc3Ryb3koYnMtPmJpb19wb29sKTsKKworCWJpb3ZlY19mcmVlX3Bvb2xzKGJzKTsKKworCWtmcmVlKGJzKTsKK30KKworc3RydWN0IGJpb19zZXQgKmJpb3NldF9jcmVhdGUoaW50IGJpb19wb29sX3NpemUsIGludCBidmVjX3Bvb2xfc2l6ZSwgaW50IHNjYWxlKQoreworCXN0cnVjdCBiaW9fc2V0ICpicyA9IGttYWxsb2Moc2l6ZW9mKCpicyksIEdGUF9LRVJORUwpOworCisJaWYgKCFicykKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQoYnMsIDAsIHNpemVvZigqYnMpKTsKKwlicy0+YmlvX3Bvb2wgPSBtZW1wb29sX2NyZWF0ZShiaW9fcG9vbF9zaXplLCBtZW1wb29sX2FsbG9jX3NsYWIsCisJCQltZW1wb29sX2ZyZWVfc2xhYiwgYmlvX3NsYWIpOworCisJaWYgKCFicy0+YmlvX3Bvb2wpCisJCWdvdG8gYmFkOworCisJaWYgKCFiaW92ZWNfY3JlYXRlX3Bvb2xzKGJzLCBidmVjX3Bvb2xfc2l6ZSwgc2NhbGUpKQorCQlyZXR1cm4gYnM7CisKK2JhZDoKKwliaW9zZXRfZnJlZShicyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBiaW92ZWNfaW5pdF9zbGFicyh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEJJT1ZFQ19OUl9QT09MUzsgaSsrKSB7CisJCWludCBzaXplOworCQlzdHJ1Y3QgYmlvdmVjX3NsYWIgKmJ2cyA9IGJ2ZWNfc2xhYnMgKyBpOworCisJCXNpemUgPSBidnMtPm5yX3ZlY3MgKiBzaXplb2Yoc3RydWN0IGJpb192ZWMpOworCQlidnMtPnNsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZShidnMtPm5hbWUsIHNpemUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMQUJfSFdDQUNIRV9BTElHTnxTTEFCX1BBTklDLCBOVUxMLCBOVUxMKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYmlvKHZvaWQpCit7CisJaW50IG1lZ2FieXRlcywgYnZlY19wb29sX2VudHJpZXM7CisJaW50IHNjYWxlID0gQklPVkVDX05SX1BPT0xTOworCisJYmlvX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiYmlvIiwgc2l6ZW9mKHN0cnVjdCBiaW8pLCAwLAorCQkJCVNMQUJfSFdDQUNIRV9BTElHTnxTTEFCX1BBTklDLCBOVUxMLCBOVUxMKTsKKworCWJpb3ZlY19pbml0X3NsYWJzKCk7CisKKwltZWdhYnl0ZXMgPSBucl9mcmVlX3BhZ2VzKCkgPj4gKDIwIC0gUEFHRV9TSElGVCk7CisKKwkvKgorCSAqIGZpbmQgb3V0IHdoZXJlIHRvIHN0YXJ0IHNjYWxpbmcKKwkgKi8KKwlpZiAobWVnYWJ5dGVzIDw9IDE2KQorCQlzY2FsZSA9IDA7CisJZWxzZSBpZiAobWVnYWJ5dGVzIDw9IDMyKQorCQlzY2FsZSA9IDE7CisJZWxzZSBpZiAobWVnYWJ5dGVzIDw9IDY0KQorCQlzY2FsZSA9IDI7CisJZWxzZSBpZiAobWVnYWJ5dGVzIDw9IDk2KQorCQlzY2FsZSA9IDM7CisJZWxzZSBpZiAobWVnYWJ5dGVzIDw9IDEyOCkKKwkJc2NhbGUgPSA0OworCisJLyoKKwkgKiBzY2FsZSBudW1iZXIgb2YgZW50cmllcworCSAqLworCWJ2ZWNfcG9vbF9lbnRyaWVzID0gbWVnYWJ5dGVzICogMjsKKwlpZiAoYnZlY19wb29sX2VudHJpZXMgPiAyNTYpCisJCWJ2ZWNfcG9vbF9lbnRyaWVzID0gMjU2OworCisJZnNfYmlvX3NldCA9IGJpb3NldF9jcmVhdGUoQklPX1BPT0xfU0laRSwgYnZlY19wb29sX2VudHJpZXMsIHNjYWxlKTsKKwlpZiAoIWZzX2Jpb19zZXQpCisJCXBhbmljKCJiaW86IGNhbid0IGFsbG9jYXRlIGJpb3NcbiIpOworCisJYmlvX3NwbGl0X3Bvb2wgPSBtZW1wb29sX2NyZWF0ZShCSU9fU1BMSVRfRU5UUklFUywKKwkJCQliaW9fcGFpcl9hbGxvYywgYmlvX3BhaXJfZnJlZSwgTlVMTCk7CisJaWYgKCFiaW9fc3BsaXRfcG9vbCkKKwkJcGFuaWMoImJpbzogY2FuJ3QgY3JlYXRlIHNwbGl0IHBvb2xcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N1YnN5c19pbml0Y2FsbChpbml0X2Jpbyk7CisKK0VYUE9SVF9TWU1CT0woYmlvX2FsbG9jKTsKK0VYUE9SVF9TWU1CT0woYmlvX3B1dCk7CitFWFBPUlRfU1lNQk9MKGJpb19lbmRpbyk7CitFWFBPUlRfU1lNQk9MKGJpb19pbml0KTsKK0VYUE9SVF9TWU1CT0woX19iaW9fY2xvbmUpOworRVhQT1JUX1NZTUJPTChiaW9fY2xvbmUpOworRVhQT1JUX1NZTUJPTChiaW9fcGh5c19zZWdtZW50cyk7CitFWFBPUlRfU1lNQk9MKGJpb19od19zZWdtZW50cyk7CitFWFBPUlRfU1lNQk9MKGJpb19hZGRfcGFnZSk7CitFWFBPUlRfU1lNQk9MKGJpb19nZXRfbnJfdmVjcyk7CitFWFBPUlRfU1lNQk9MKGJpb19tYXBfdXNlcik7CitFWFBPUlRfU1lNQk9MKGJpb191bm1hcF91c2VyKTsKK0VYUE9SVF9TWU1CT0woYmlvX3BhaXJfcmVsZWFzZSk7CitFWFBPUlRfU1lNQk9MKGJpb19zcGxpdCk7CitFWFBPUlRfU1lNQk9MKGJpb19zcGxpdF9wb29sKTsKK0VYUE9SVF9TWU1CT0woYmlvX2NvcHlfdXNlcik7CitFWFBPUlRfU1lNQk9MKGJpb191bmNvcHlfdXNlcik7CitFWFBPUlRfU1lNQk9MKGJpb3NldF9jcmVhdGUpOworRVhQT1JUX1NZTUJPTChiaW9zZXRfZnJlZSk7CitFWFBPUlRfU1lNQk9MKGJpb19hbGxvY19iaW9zZXQpOwpkaWZmIC0tZ2l0IGEvZnMvYmxvY2tfZGV2LmMgYi9mcy9ibG9ja19kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTlkMDdjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYmxvY2tfZGV2LmMKQEAgLTAsMCArMSw5MjMgQEAKKy8qCisgKiAgbGludXgvZnMvYmxvY2tfZGV2LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICogIENvcHlyaWdodCAoQykgMjAwMSAgQW5kcmVhIEFyY2FuZ2VsaSA8YW5kcmVhQHN1c2UuZGU+IFN1U0UKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYmxrcGcuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0cnVjdCBiZGV2X2lub2RlIHsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlIGJkZXY7CisJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJkZXZfaW5vZGUgKkJERVZfSShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBjb250YWluZXJfb2YoaW5vZGUsIHN0cnVjdCBiZGV2X2lub2RlLCB2ZnNfaW5vZGUpOworfQorCitpbmxpbmUgc3RydWN0IGJsb2NrX2RldmljZSAqSV9CREVWKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuICZCREVWX0koaW5vZGUpLT5iZGV2OworfQorCitFWFBPUlRfU1lNQk9MKElfQkRFVik7CisKK3N0YXRpYyBzZWN0b3JfdCBtYXhfYmxvY2soc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlzZWN0b3JfdCByZXR2YWwgPSB+KChzZWN0b3JfdCkwKTsKKwlsb2ZmX3Qgc3ogPSBpX3NpemVfcmVhZChiZGV2LT5iZF9pbm9kZSk7CisKKwlpZiAoc3opIHsKKwkJdW5zaWduZWQgaW50IHNpemUgPSBibG9ja19zaXplKGJkZXYpOworCQl1bnNpZ25lZCBpbnQgc2l6ZWJpdHMgPSBibGtzaXplX2JpdHMoc2l6ZSk7CisJCXJldHZhbCA9IChzeiA+PiBzaXplYml0cyk7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIEtpbGwgX2FsbF8gYnVmZmVycywgZGlydHkgb3Igbm90Li4gKi8KK3N0YXRpYyB2b2lkIGtpbGxfYmRldihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCWludmFsaWRhdGVfYmRldihiZGV2LCAxKTsKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhiZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nLCAwKTsKK30JCisKK2ludCBzZXRfYmxvY2tzaXplKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGludCBzaXplKQoreworCS8qIFNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIHR3bywgYW5kIGJldHdlZW4gNTEyIGFuZCBQQUdFX1NJWkUgKi8KKwlpZiAoc2l6ZSA+IFBBR0VfU0laRSB8fCBzaXplIDwgNTEyIHx8IChzaXplICYgKHNpemUtMSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFNpemUgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiB0aGUgc2l6ZSBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSAqLworCWlmIChzaXplIDwgYmRldl9oYXJkc2VjdF9zaXplKGJkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIERvbid0IGNoYW5nZSB0aGUgc2l6ZSBpZiBpdCBpcyBzYW1lIGFzIGN1cnJlbnQgKi8KKwlpZiAoYmRldi0+YmRfYmxvY2tfc2l6ZSAhPSBzaXplKSB7CisJCXN5bmNfYmxvY2tkZXYoYmRldik7CisJCWJkZXYtPmJkX2Jsb2NrX3NpemUgPSBzaXplOworCQliZGV2LT5iZF9pbm9kZS0+aV9ibGtiaXRzID0gYmxrc2l6ZV9iaXRzKHNpemUpOworCQlraWxsX2JkZXYoYmRldik7CisJfQorCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHNldF9ibG9ja3NpemUpOworCitpbnQgc2Jfc2V0X2Jsb2Nrc2l6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgc2l6ZSkKK3sKKwlpbnQgYml0cyA9IDk7IC8qIDJeOSA9IDUxMiAqLworCisJaWYgKHNldF9ibG9ja3NpemUoc2ItPnNfYmRldiwgc2l6ZSkpCisJCXJldHVybiAwOworCS8qIElmIHdlIGdldCBoZXJlLCB3ZSBrbm93IHNpemUgaXMgcG93ZXIgb2YgdHdvCisJICogYW5kIGl0J3MgdmFsdWUgaXMgYmV0d2VlbiA1MTIgYW5kIFBBR0VfU0laRSAqLworCXNiLT5zX2Jsb2Nrc2l6ZSA9IHNpemU7CisJZm9yIChzaXplID4+PSAxMDsgc2l6ZTsgc2l6ZSA+Pj0gMSkKKwkJKytiaXRzOworCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gYml0czsKKwlyZXR1cm4gc2ItPnNfYmxvY2tzaXplOworfQorCitFWFBPUlRfU1lNQk9MKHNiX3NldF9ibG9ja3NpemUpOworCitpbnQgc2JfbWluX2Jsb2Nrc2l6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgc2l6ZSkKK3sKKwlpbnQgbWluc2l6ZSA9IGJkZXZfaGFyZHNlY3Rfc2l6ZShzYi0+c19iZGV2KTsKKwlpZiAoc2l6ZSA8IG1pbnNpemUpCisJCXNpemUgPSBtaW5zaXplOworCXJldHVybiBzYl9zZXRfYmxvY2tzaXplKHNiLCBzaXplKTsKK30KKworRVhQT1JUX1NZTUJPTChzYl9taW5fYmxvY2tzaXplKTsKKworc3RhdGljIGludAorYmxrZGV2X2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssCisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBjcmVhdGUpCit7CisJaWYgKGlibG9jayA+PSBtYXhfYmxvY2soSV9CREVWKGlub2RlKSkpIHsKKwkJaWYgKGNyZWF0ZSkKKwkJCXJldHVybiAtRUlPOworCisJCS8qCisJCSAqIGZvciByZWFkcywgd2UncmUganVzdCB0cnlpbmcgdG8gZmlsbCBhIHBhcnRpYWwgcGFnZS4KKwkJICogcmV0dXJuIGEgaG9sZSwgdGhleSB3aWxsIGhhdmUgdG8gY2FsbCBnZXRfYmxvY2sgYWdhaW4KKwkJICogYmVmb3JlIHRoZXkgY2FuIGZpbGwgaXQsIGFuZCB0aGV5IHdpbGwgZ2V0IC1FSU8gYXQgdGhhdAorCQkgKiB0aW1lCisJCSAqLworCQlyZXR1cm4gMDsKKwl9CisJYmgtPmJfYmRldiA9IElfQkRFVihpbm9kZSk7CisJYmgtPmJfYmxvY2tuciA9IGlibG9jazsKKwlzZXRfYnVmZmVyX21hcHBlZChiaCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2Jsa2Rldl9nZXRfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKKwkJdW5zaWduZWQgbG9uZyBtYXhfYmxvY2tzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgY3JlYXRlKQoreworCXNlY3Rvcl90IGVuZF9ibG9jayA9IG1heF9ibG9jayhJX0JERVYoaW5vZGUpKTsKKworCWlmICgoaWJsb2NrICsgbWF4X2Jsb2NrcykgPiBlbmRfYmxvY2spIHsKKwkJbWF4X2Jsb2NrcyA9IGVuZF9ibG9jayAtIGlibG9jazsKKwkJaWYgKChsb25nKW1heF9ibG9ja3MgPD0gMCkgeworCQkJaWYgKGNyZWF0ZSkKKwkJCQlyZXR1cm4gLUVJTzsJLyogd3JpdGUgZnVsbHkgYmV5b25kIEVPRiAqLworCQkJLyoKKwkJCSAqIEl0IGlzIGEgcmVhZCB3aGljaCBpcyBmdWxseSBiZXlvbmQgRU9GLiAgV2UgcmV0dXJuCisJCQkgKiBhICFidWZmZXJfbWFwcGVkIGJ1ZmZlcgorCQkJICovCisJCQltYXhfYmxvY2tzID0gMDsKKwkJfQorCX0KKworCWJoLT5iX2JkZXYgPSBJX0JERVYoaW5vZGUpOworCWJoLT5iX2Jsb2NrbnIgPSBpYmxvY2s7CisJYmgtPmJfc2l6ZSA9IG1heF9ibG9ja3MgPDwgaW5vZGUtPmlfYmxrYml0czsKKwlpZiAobWF4X2Jsb2NrcykKKwkJc2V0X2J1ZmZlcl9tYXBwZWQoYmgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAorYmxrZGV2X2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCisJCQlsb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCit7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CisKKwlyZXR1cm4gYmxvY2tkZXZfZGlyZWN0X0lPX25vX2xvY2tpbmcocncsIGlvY2IsIGlub2RlLCBJX0JERVYoaW5vZGUpLAorCQkJCWlvdiwgb2Zmc2V0LCBucl9zZWdzLCBibGtkZXZfZ2V0X2Jsb2NrcywgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgYmxrZGV2X3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJcmV0dXJuIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLCBibGtkZXZfZ2V0X2Jsb2NrLCB3YmMpOworfQorCitzdGF0aWMgaW50IGJsa2Rldl9yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIHN0cnVjdCBwYWdlICogcGFnZSkKK3sKKwlyZXR1cm4gYmxvY2tfcmVhZF9mdWxsX3BhZ2UocGFnZSwgYmxrZGV2X2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgYmxrZGV2X3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlyZXR1cm4gYmxvY2tfcHJlcGFyZV93cml0ZShwYWdlLCBmcm9tLCB0bywgYmxrZGV2X2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgYmxrZGV2X2NvbW1pdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXJldHVybiBibG9ja19jb21taXRfd3JpdGUocGFnZSwgZnJvbSwgdG8pOworfQorCisvKgorICogcHJpdmF0ZSBsbHNlZWs6CisgKiBmb3IgYSBibG9jayBzcGVjaWFsIGZpbGUgZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2l6ZSBpcyB6ZXJvCisgKiBzbyB3ZSBjb21wdXRlIHRoZSBzaXplIGJ5IGhhbmQgKGp1c3QgYXMgaW4gYmxvY2tfcmVhZC93cml0ZSBhYm92ZSkKKyAqLworc3RhdGljIGxvZmZfdCBibG9ja19sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pCit7CisJc3RydWN0IGlub2RlICpiZF9pbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKwlsb2ZmX3Qgc2l6ZTsKKwlsb2ZmX3QgcmV0dmFsOworCisJZG93bigmYmRfaW5vZGUtPmlfc2VtKTsKKwlzaXplID0gaV9zaXplX3JlYWQoYmRfaW5vZGUpOworCisJc3dpdGNoIChvcmlnaW4pIHsKKwkJY2FzZSAyOgorCQkJb2Zmc2V0ICs9IHNpemU7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJb2Zmc2V0ICs9IGZpbGUtPmZfcG9zOworCX0KKwlyZXR2YWwgPSAtRUlOVkFMOworCWlmIChvZmZzZXQgPj0gMCAmJiBvZmZzZXQgPD0gc2l6ZSkgeworCQlpZiAob2Zmc2V0ICE9IGZpbGUtPmZfcG9zKSB7CisJCQlmaWxlLT5mX3BvcyA9IG9mZnNldDsKKwkJfQorCQlyZXR2YWwgPSBvZmZzZXQ7CisJfQorCXVwKCZiZF9pbm9kZS0+aV9zZW0pOworCXJldHVybiByZXR2YWw7Cit9CisJCisvKgorICoJRmlscCBpcyBuZXZlciBOVUxMOyB0aGUgb25seSBjYXNlIHdoZW4gLT5mc3luYygpIGlzIGNhbGxlZCB3aXRoCisgKglOVUxMIGZpcnN0IGFyZ3VtZW50IGlzIG5mc2Rfc3luY19kaXIoKSBhbmQgdGhhdCdzIG5vdCBhIGRpcmVjdG9yeS4KKyAqLworIAorc3RhdGljIGludCBibG9ja19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCit7CisJcmV0dXJuIHN5bmNfYmxvY2tkZXYoSV9CREVWKGZpbHAtPmZfbWFwcGluZy0+aG9zdCkpOworfQorCisvKgorICogcHNldWRvLWZzCisgKi8KKworc3RhdGljICBfX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcCBERUZJTkVfU1BJTkxPQ0soYmRldl9sb2NrKTsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKiBiZGV2X2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqYmRldl9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBiZGV2X2lub2RlICplaSA9IGttZW1fY2FjaGVfYWxsb2MoYmRldl9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIWVpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gJmVpLT52ZnNfaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGJkZXZfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBiZGV2X2lub2RlICpiZGkgPSBCREVWX0koaW5vZGUpOworCisJYmRpLT5iZGV2LmJkX2lub2RlX2JhY2tpbmdfZGV2X2luZm8gPSBOVUxMOworCWttZW1fY2FjaGVfZnJlZShiZGV2X2NhY2hlcCwgYmRpKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgYmRldl9pbm9kZSAqZWkgPSAoc3RydWN0IGJkZXZfaW5vZGUgKikgZm9vOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSAmZWktPmJkZXY7CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKQorCXsKKwkJbWVtc2V0KGJkZXYsIDAsIHNpemVvZigqYmRldikpOworCQlzZW1hX2luaXQoJmJkZXYtPmJkX3NlbSwgMSk7CisJCXNlbWFfaW5pdCgmYmRldi0+YmRfbW91bnRfc2VtLCAxKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmJkZXYtPmJkX2lub2Rlcyk7CisJCUlOSVRfTElTVF9IRUFEKCZiZGV2LT5iZF9saXN0KTsKKwkJaW5vZGVfaW5pdF9vbmNlKCZlaS0+dmZzX2lub2RlKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2JkX2ZvcmdldChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2RldmljZXMpOworCWlub2RlLT5pX2JkZXYgPSBOVUxMOworCWlub2RlLT5pX21hcHBpbmcgPSAmaW5vZGUtPmlfZGF0YTsKK30KKworc3RhdGljIHZvaWQgYmRldl9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSAmQkRFVl9JKGlub2RlKS0+YmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXNwaW5fbG9jaygmYmRldl9sb2NrKTsKKwl3aGlsZSAoIChwID0gYmRldi0+YmRfaW5vZGVzLm5leHQpICE9ICZiZGV2LT5iZF9pbm9kZXMgKSB7CisJCV9fYmRfZm9yZ2V0KGxpc3RfZW50cnkocCwgc3RydWN0IGlub2RlLCBpX2RldmljZXMpKTsKKwl9CisJbGlzdF9kZWxfaW5pdCgmYmRldi0+YmRfbGlzdCk7CisJc3Bpbl91bmxvY2soJmJkZXZfbG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBiZGV2X3NvcHMgPSB7CisJLnN0YXRmcyA9IHNpbXBsZV9zdGF0ZnMsCisJLmFsbG9jX2lub2RlID0gYmRldl9hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZSA9IGJkZXZfZGVzdHJveV9pbm9kZSwKKwkuZHJvcF9pbm9kZSA9IGdlbmVyaWNfZGVsZXRlX2lub2RlLAorCS5jbGVhcl9pbm9kZSA9IGJkZXZfY2xlYXJfaW5vZGUsCit9OworCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpiZF9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX3BzZXVkbyhmc190eXBlLCAiYmRldjoiLCAmYmRldl9zb3BzLCAweDYyNjQ2NTc2KTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJkX3R5cGUgPSB7CisJLm5hbWUJCT0gImJkZXYiLAorCS5nZXRfc2IJCT0gYmRfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9hbm9uX3N1cGVyLAorfTsKKworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqYmRfbW50Oworc3RydWN0IHN1cGVyX2Jsb2NrICpibG9ja2Rldl9zdXBlcmJsb2NrOworCit2b2lkIF9faW5pdCBiZGV2X2NhY2hlX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCWJkZXZfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImJkZXZfY2FjaGUiLCBzaXplb2Yoc3RydWN0IGJkZXZfaW5vZGUpLAorCQkJMCwgU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfUkVDTEFJTV9BQ0NPVU5UfFNMQUJfUEFOSUMsCisJCQlpbml0X29uY2UsIE5VTEwpOworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmJkX3R5cGUpOworCWlmIChlcnIpCisJCXBhbmljKCJDYW5ub3QgcmVnaXN0ZXIgYmRldiBwc2V1ZG8tZnMiKTsKKwliZF9tbnQgPSBrZXJuX21vdW50KCZiZF90eXBlKTsKKwllcnIgPSBQVFJfRVJSKGJkX21udCk7CisJaWYgKElTX0VSUihiZF9tbnQpKQorCQlwYW5pYygiQ2Fubm90IGNyZWF0ZSBiZGV2IHBzZXVkby1mcyIpOworCWJsb2NrZGV2X3N1cGVyYmxvY2sgPSBiZF9tbnQtPm1udF9zYjsJLyogRm9yIHdyaXRlYmFjayAqLworfQorCisvKgorICogTW9zdCBsaWtlbHkgX3ZlcnlfIGJhZCBvbmUgLSBidXQgdGhlbiBpdCdzIGhhcmRseSBjcml0aWNhbCBmb3Igc21hbGwKKyAqIC9kZXYgYW5kIGNhbiBiZSBmaXhlZCB3aGVuIHNvbWVib2R5IHdpbGwgbmVlZCByZWFsbHkgbGFyZ2Ugb25lLgorICogS2VlcCBpbiBtaW5kIHRoYXQgaXQgd2lsbCBiZSBmZWQgdGhyb3VnaCBpY2FjaGUgaGFzaCBmdW5jdGlvbiB0b28uCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBoYXNoKGRldl90IGRldikKK3sKKwlyZXR1cm4gTUFKT1IoZGV2KStNSU5PUihkZXYpOworfQorCitzdGF0aWMgaW50IGJkZXZfdGVzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKQoreworCXJldHVybiBCREVWX0koaW5vZGUpLT5iZGV2LmJkX2RldiA9PSAqKGRldl90ICopZGF0YTsKK30KKworc3RhdGljIGludCBiZGV2X3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKQoreworCUJERVZfSShpbm9kZSktPmJkZXYuYmRfZGV2ID0gKihkZXZfdCAqKWRhdGE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBMSVNUX0hFQUQoYWxsX2JkZXZzKTsKKworc3RydWN0IGJsb2NrX2RldmljZSAqYmRnZXQoZGV2X3QgZGV2KQoreworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCWlub2RlID0gaWdldDVfbG9ja2VkKGJkX21udC0+bW50X3NiLCBoYXNoKGRldiksCisJCQliZGV2X3Rlc3QsIGJkZXZfc2V0LCAmZGV2KTsKKworCWlmICghaW5vZGUpCisJCXJldHVybiBOVUxMOworCisJYmRldiA9ICZCREVWX0koaW5vZGUpLT5iZGV2OworCisJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJYmRldi0+YmRfY29udGFpbnMgPSBOVUxMOworCQliZGV2LT5iZF9pbm9kZSA9IGlub2RlOworCQliZGV2LT5iZF9ibG9ja19zaXplID0gKDEgPDwgaW5vZGUtPmlfYmxrYml0cyk7CisJCWJkZXYtPmJkX3BhcnRfY291bnQgPSAwOworCQliZGV2LT5iZF9pbnZhbGlkYXRlZCA9IDA7CisJCWlub2RlLT5pX21vZGUgPSBTX0lGQkxLOworCQlpbm9kZS0+aV9yZGV2ID0gZGV2OworCQlpbm9kZS0+aV9iZGV2ID0gYmRldjsKKwkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZkZWZfYmxrX2FvcHM7CisJCW1hcHBpbmdfc2V0X2dmcF9tYXNrKCZpbm9kZS0+aV9kYXRhLCBHRlBfVVNFUik7CisJCWlub2RlLT5pX2RhdGEuYmFja2luZ19kZXZfaW5mbyA9ICZkZWZhdWx0X2JhY2tpbmdfZGV2X2luZm87CisJCXNwaW5fbG9jaygmYmRldl9sb2NrKTsKKwkJbGlzdF9hZGQoJmJkZXYtPmJkX2xpc3QsICZhbGxfYmRldnMpOworCQlzcGluX3VubG9jaygmYmRldl9sb2NrKTsKKwkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CisJfQorCXJldHVybiBiZGV2OworfQorCitFWFBPUlRfU1lNQk9MKGJkZ2V0KTsKKworbG9uZyBucl9ibG9ja2Rldl9wYWdlcyh2b2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJbG9uZyByZXQgPSAwOworCXNwaW5fbG9jaygmYmRldl9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKHAsICZhbGxfYmRldnMpIHsKKwkJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwkJYmRldiA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJsb2NrX2RldmljZSwgYmRfbGlzdCk7CisJCXJldCArPSBiZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nLT5ucnBhZ2VzOworCX0KKwlzcGluX3VubG9jaygmYmRldl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGJkcHV0KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJaXB1dChiZGV2LT5iZF9pbm9kZSk7Cit9CisKK0VYUE9SVF9TWU1CT0woYmRwdXQpOworIAorc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkX2FjcXVpcmUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCXNwaW5fbG9jaygmYmRldl9sb2NrKTsKKwliZGV2ID0gaW5vZGUtPmlfYmRldjsKKwlpZiAoYmRldiAmJiBpZ3JhYihiZGV2LT5iZF9pbm9kZSkpIHsKKwkJc3Bpbl91bmxvY2soJmJkZXZfbG9jayk7CisJCXJldHVybiBiZGV2OworCX0KKwlzcGluX3VubG9jaygmYmRldl9sb2NrKTsKKwliZGV2ID0gYmRnZXQoaW5vZGUtPmlfcmRldik7CisJaWYgKGJkZXYpIHsKKwkJc3Bpbl9sb2NrKCZiZGV2X2xvY2spOworCQlpZiAoaW5vZGUtPmlfYmRldikKKwkJCV9fYmRfZm9yZ2V0KGlub2RlKTsKKwkJaW5vZGUtPmlfYmRldiA9IGJkZXY7CisJCWlub2RlLT5pX21hcHBpbmcgPSBiZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nOworCQlsaXN0X2FkZCgmaW5vZGUtPmlfZGV2aWNlcywgJmJkZXYtPmJkX2lub2Rlcyk7CisJCXNwaW5fdW5sb2NrKCZiZGV2X2xvY2spOworCX0KKwlyZXR1cm4gYmRldjsKK30KKworLyogQ2FsbCB3aGVuIHlvdSBmcmVlIGlub2RlICovCisKK3ZvaWQgYmRfZm9yZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3Bpbl9sb2NrKCZiZGV2X2xvY2spOworCWlmIChpbm9kZS0+aV9iZGV2KQorCQlfX2JkX2ZvcmdldChpbm9kZSk7CisJc3Bpbl91bmxvY2soJmJkZXZfbG9jayk7Cit9CisKK2ludCBiZF9jbGFpbShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB2b2lkICpob2xkZXIpCit7CisJaW50IHJlczsKKwlzcGluX2xvY2soJmJkZXZfbG9jayk7CisKKwkvKiBmaXJzdCBkZWNpZGUgcmVzdWx0ICovCisJaWYgKGJkZXYtPmJkX2hvbGRlciA9PSBob2xkZXIpCisJCXJlcyA9IDA7CSAvKiBhbHJlYWR5IGEgaG9sZGVyICovCisJZWxzZSBpZiAoYmRldi0+YmRfaG9sZGVyICE9IE5VTEwpCisJCXJlcyA9IC1FQlVTWTsgCSAvKiBoZWxkIGJ5IHNvbWVvbmUgZWxzZSAqLworCWVsc2UgaWYgKGJkZXYtPmJkX2NvbnRhaW5zID09IGJkZXYpCisJCXJlcyA9IDA7ICAJIC8qIGlzIGEgd2hvbGUgZGV2aWNlIHdoaWNoIGlzbid0IGhlbGQgKi8KKworCWVsc2UgaWYgKGJkZXYtPmJkX2NvbnRhaW5zLT5iZF9ob2xkZXIgPT0gYmRfY2xhaW0pCisJCXJlcyA9IDA7IAkgLyogaXMgYSBwYXJ0aXRpb24gb2YgYSBkZXZpY2UgdGhhdCBpcyBiZWluZyBwYXJ0aXRpb25lZCAqLworCWVsc2UgaWYgKGJkZXYtPmJkX2NvbnRhaW5zLT5iZF9ob2xkZXIgIT0gTlVMTCkKKwkJcmVzID0gLUVCVVNZOwkgLyogaXMgYSBwYXJ0aXRpb24gb2YgYSBoZWxkIGRldmljZSAqLworCWVsc2UKKwkJcmVzID0gMDsJIC8qIGlzIGEgcGFydGl0aW9uIG9mIGFuIHVuLWhlbGQgZGV2aWNlICovCisKKwkvKiBub3cgaW1wb3NlIGNoYW5nZSAqLworCWlmIChyZXM9PTApIHsKKwkJLyogbm90ZSB0aGF0IGZvciBhIHdob2xlIGRldmljZSBiZF9ob2xkZXJzCisJCSAqIHdpbGwgYmUgaW5jcmVtZW50ZWQgdHdpY2UsIGFuZCBiZF9ob2xkZXIgd2lsbAorCQkgKiBiZSBzZXQgdG8gYmRfY2xhaW0gYmVmb3JlIGJlaW5nIHNldCB0byBob2xkZXIKKwkJICovCisJCWJkZXYtPmJkX2NvbnRhaW5zLT5iZF9ob2xkZXJzICsrOworCQliZGV2LT5iZF9jb250YWlucy0+YmRfaG9sZGVyID0gYmRfY2xhaW07CisJCWJkZXYtPmJkX2hvbGRlcnMrKzsKKwkJYmRldi0+YmRfaG9sZGVyID0gaG9sZGVyOworCX0KKwlzcGluX3VubG9jaygmYmRldl9sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCitFWFBPUlRfU1lNQk9MKGJkX2NsYWltKTsKKwordm9pZCBiZF9yZWxlYXNlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJc3Bpbl9sb2NrKCZiZGV2X2xvY2spOworCWlmICghLS1iZGV2LT5iZF9jb250YWlucy0+YmRfaG9sZGVycykKKwkJYmRldi0+YmRfY29udGFpbnMtPmJkX2hvbGRlciA9IE5VTEw7CisJaWYgKCEtLWJkZXYtPmJkX2hvbGRlcnMpCisJCWJkZXYtPmJkX2hvbGRlciA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmJkZXZfbG9jayk7Cit9CisKK0VYUE9SVF9TWU1CT0woYmRfcmVsZWFzZSk7CisKKy8qCisgKiBUcmllcyB0byBvcGVuIGJsb2NrIGRldmljZSBieSBkZXZpY2UgbnVtYmVyLiAgVXNlIGl0IE9OTFkgaWYgeW91CisgKiByZWFsbHkgZG8gbm90IGhhdmUgYW55dGhpbmcgYmV0dGVyIC0gaS5lLiB3aGVuIHlvdSBhcmUgYmVoaW5kIGEKKyAqIHRydWx5IHN1Y2t5IGludGVyZmFjZSBhbmQgYWxsIHlvdSBhcmUgZ2l2ZW4gaXMgYSBkZXZpY2UgbnVtYmVyLiAgX05ldmVyXworICogdG8gYmUgdXNlZCBmb3IgaW50ZXJuYWwgcHVycG9zZXMuICBJZiB5b3UgZXZlciBuZWVkIGl0IC0gcmVjb25zaWRlcgorICogeW91ciBBUEkuCisgKi8KK3N0cnVjdCBibG9ja19kZXZpY2UgKm9wZW5fYnlfZGV2bnVtKGRldl90IGRldiwgdW5zaWduZWQgbW9kZSkKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gYmRnZXQoZGV2KTsKKwlpbnQgZXJyID0gLUVOT01FTTsKKwlpbnQgZmxhZ3MgPSBtb2RlICYgRk1PREVfV1JJVEUgPyBPX1JEV1IgOiBPX1JET05MWTsKKwlpZiAoYmRldikKKwkJZXJyID0gYmxrZGV2X2dldChiZGV2LCBtb2RlLCBmbGFncyk7CisJcmV0dXJuIGVyciA/IEVSUl9QVFIoZXJyKSA6IGJkZXY7Cit9CisKK0VYUE9SVF9TWU1CT0wob3Blbl9ieV9kZXZudW0pOworCisvKgorICogVGhpcyByb3V0aW5lIGNoZWNrcyB3aGV0aGVyIGEgcmVtb3ZhYmxlIG1lZGlhIGhhcyBiZWVuIGNoYW5nZWQsCisgKiBhbmQgaW52YWxpZGF0ZXMgYWxsIGJ1ZmZlci1jYWNoZS1lbnRyaWVzIGluIHRoYXQgY2FzZS4gVGhpcworICogaXMgYSByZWxhdGl2ZWx5IHNsb3cgcm91dGluZSwgc28gd2UgaGF2ZSB0byB0cnkgdG8gbWluaW1pemUgdXNpbmcKKyAqIGl0LiBUaHVzIGl0IGlzIGNhbGxlZCBvbmx5IHVwb24gYSAnbW91bnQnIG9yICdvcGVuJy4gVGhpcworICogaXMgdGhlIGJlc3Qgd2F5IG9mIGNvbWJpbmluZyBzcGVlZCBhbmQgdXRpbGl0eSwgSSB0aGluay4KKyAqIFBlb3BsZSBjaGFuZ2luZyBkaXNrZXR0ZXMgaW4gdGhlIG1pZGRsZSBvZiBhbiBvcGVyYXRpb24gZGVzZXJ2ZQorICogdG8gbG9zZSA6LSkKKyAqLworaW50IGNoZWNrX2Rpc2tfY2hhbmdlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBiZGV2LT5iZF9kaXNrOworCXN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyAqIGJkb3BzID0gZGlzay0+Zm9wczsKKworCWlmICghYmRvcHMtPm1lZGlhX2NoYW5nZWQpCisJCXJldHVybiAwOworCWlmICghYmRvcHMtPm1lZGlhX2NoYW5nZWQoYmRldi0+YmRfZGlzaykpCisJCXJldHVybiAwOworCisJaWYgKF9faW52YWxpZGF0ZV9kZXZpY2UoYmRldiwgMCkpCisJCXByaW50aygiVkZTOiBidXN5IGlub2RlcyBvbiBjaGFuZ2VkIG1lZGlhLlxuIik7CisKKwlpZiAoYmRvcHMtPnJldmFsaWRhdGVfZGlzaykKKwkJYmRvcHMtPnJldmFsaWRhdGVfZGlzayhiZGV2LT5iZF9kaXNrKTsKKwlpZiAoYmRldi0+YmRfZGlzay0+bWlub3JzID4gMSkKKwkJYmRldi0+YmRfaW52YWxpZGF0ZWQgPSAxOworCXJldHVybiAxOworfQorCitFWFBPUlRfU1lNQk9MKGNoZWNrX2Rpc2tfY2hhbmdlKTsKKwordm9pZCBiZF9zZXRfc2l6ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBsb2ZmX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBic2l6ZSA9IGJkZXZfaGFyZHNlY3Rfc2l6ZShiZGV2KTsKKworCWJkZXYtPmJkX2lub2RlLT5pX3NpemUgPSBzaXplOworCXdoaWxlIChic2l6ZSA8IFBBR0VfQ0FDSEVfU0laRSkgeworCQlpZiAoc2l6ZSAmIGJzaXplKQorCQkJYnJlYWs7CisJCWJzaXplIDw8PSAxOworCX0KKwliZGV2LT5iZF9ibG9ja19zaXplID0gYnNpemU7CisJYmRldi0+YmRfaW5vZGUtPmlfYmxrYml0cyA9IGJsa3NpemVfYml0cyhic2l6ZSk7Cit9CitFWFBPUlRfU1lNQk9MKGJkX3NldF9zaXplKTsKKworc3RhdGljIGludCBkb19vcGVuKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBtb2R1bGUgKm93bmVyID0gTlVMTDsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKKwlpbnQgcmV0ID0gLUVOWElPOworCWludCBwYXJ0OworCisJZmlsZS0+Zl9tYXBwaW5nID0gYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZzsKKwlsb2NrX2tlcm5lbCgpOworCWRpc2sgPSBnZXRfZ2VuZGlzayhiZGV2LT5iZF9kZXYsICZwYXJ0KTsKKwlpZiAoIWRpc2spIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQliZHB1dChiZGV2KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJb3duZXIgPSBkaXNrLT5mb3BzLT5vd25lcjsKKworCWRvd24oJmJkZXYtPmJkX3NlbSk7CisJaWYgKCFiZGV2LT5iZF9vcGVuZXJzKSB7CisJCWJkZXYtPmJkX2Rpc2sgPSBkaXNrOworCQliZGV2LT5iZF9jb250YWlucyA9IGJkZXY7CisJCWlmICghcGFydCkgeworCQkJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaTsKKwkJCWlmIChkaXNrLT5mb3BzLT5vcGVuKSB7CisJCQkJcmV0ID0gZGlzay0+Zm9wcy0+b3BlbihiZGV2LT5iZF9pbm9kZSwgZmlsZSk7CisJCQkJaWYgKHJldCkKKwkJCQkJZ290byBvdXRfZmlyc3Q7CisJCQl9CisJCQlpZiAoIWJkZXYtPmJkX29wZW5lcnMpIHsKKwkJCQliZF9zZXRfc2l6ZShiZGV2LChsb2ZmX3QpZ2V0X2NhcGFjaXR5KGRpc2spPDw5KTsKKwkJCQliZGkgPSBibGtfZ2V0X2JhY2tpbmdfZGV2X2luZm8oYmRldik7CisJCQkJaWYgKGJkaSA9PSBOVUxMKQorCQkJCQliZGkgPSAmZGVmYXVsdF9iYWNraW5nX2Rldl9pbmZvOworCQkJCWJkZXYtPmJkX2lub2RlLT5pX2RhdGEuYmFja2luZ19kZXZfaW5mbyA9IGJkaTsKKwkJCX0KKwkJCWlmIChiZGV2LT5iZF9pbnZhbGlkYXRlZCkKKwkJCQlyZXNjYW5fcGFydGl0aW9ucyhkaXNrLCBiZGV2KTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBoZF9zdHJ1Y3QgKnA7CisJCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICp3aG9sZTsKKwkJCXdob2xlID0gYmRnZXRfZGlzayhkaXNrLCAwKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlpZiAoIXdob2xlKQorCQkJCWdvdG8gb3V0X2ZpcnN0OworCQkJcmV0ID0gYmxrZGV2X2dldCh3aG9sZSwgZmlsZS0+Zl9tb2RlLCBmaWxlLT5mX2ZsYWdzKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBvdXRfZmlyc3Q7CisJCQliZGV2LT5iZF9jb250YWlucyA9IHdob2xlOworCQkJZG93bigmd2hvbGUtPmJkX3NlbSk7CisJCQl3aG9sZS0+YmRfcGFydF9jb3VudCsrOworCQkJcCA9IGRpc2stPnBhcnRbcGFydCAtIDFdOworCQkJYmRldi0+YmRfaW5vZGUtPmlfZGF0YS5iYWNraW5nX2Rldl9pbmZvID0KKwkJCSAgIHdob2xlLT5iZF9pbm9kZS0+aV9kYXRhLmJhY2tpbmdfZGV2X2luZm87CisJCQlpZiAoIShkaXNrLT5mbGFncyAmIEdFTkhEX0ZMX1VQKSB8fCAhcCB8fCAhcC0+bnJfc2VjdHMpIHsKKwkJCQl3aG9sZS0+YmRfcGFydF9jb3VudC0tOworCQkJCXVwKCZ3aG9sZS0+YmRfc2VtKTsKKwkJCQlyZXQgPSAtRU5YSU87CisJCQkJZ290byBvdXRfZmlyc3Q7CisJCQl9CisJCQlrb2JqZWN0X2dldCgmcC0+a29iaik7CisJCQliZGV2LT5iZF9wYXJ0ID0gcDsKKwkJCWJkX3NldF9zaXplKGJkZXYsIChsb2ZmX3QpIHAtPm5yX3NlY3RzIDw8IDkpOworCQkJdXAoJndob2xlLT5iZF9zZW0pOworCQl9CisJfSBlbHNlIHsKKwkJcHV0X2Rpc2soZGlzayk7CisJCW1vZHVsZV9wdXQob3duZXIpOworCQlpZiAoYmRldi0+YmRfY29udGFpbnMgPT0gYmRldikgeworCQkJaWYgKGJkZXYtPmJkX2Rpc2stPmZvcHMtPm9wZW4pIHsKKwkJCQlyZXQgPSBiZGV2LT5iZF9kaXNrLT5mb3BzLT5vcGVuKGJkZXYtPmJkX2lub2RlLCBmaWxlKTsKKwkJCQlpZiAocmV0KQorCQkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmIChiZGV2LT5iZF9pbnZhbGlkYXRlZCkKKwkJCQlyZXNjYW5fcGFydGl0aW9ucyhiZGV2LT5iZF9kaXNrLCBiZGV2KTsKKwkJfSBlbHNlIHsKKwkJCWRvd24oJmJkZXYtPmJkX2NvbnRhaW5zLT5iZF9zZW0pOworCQkJYmRldi0+YmRfY29udGFpbnMtPmJkX3BhcnRfY291bnQrKzsKKwkJCXVwKCZiZGV2LT5iZF9jb250YWlucy0+YmRfc2VtKTsKKwkJfQorCX0KKwliZGV2LT5iZF9vcGVuZXJzKys7CisJdXAoJmJkZXYtPmJkX3NlbSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworCitvdXRfZmlyc3Q6CisJYmRldi0+YmRfZGlzayA9IE5VTEw7CisJYmRldi0+YmRfaW5vZGUtPmlfZGF0YS5iYWNraW5nX2Rldl9pbmZvID0gJmRlZmF1bHRfYmFja2luZ19kZXZfaW5mbzsKKwlpZiAoYmRldiAhPSBiZGV2LT5iZF9jb250YWlucykKKwkJYmxrZGV2X3B1dChiZGV2LT5iZF9jb250YWlucyk7CisJYmRldi0+YmRfY29udGFpbnMgPSBOVUxMOworCXB1dF9kaXNrKGRpc2spOworCW1vZHVsZV9wdXQob3duZXIpOworb3V0OgorCXVwKCZiZGV2LT5iZF9zZW0pOworCXVubG9ja19rZXJuZWwoKTsKKwlpZiAocmV0KQorCQliZHB1dChiZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYmxrZGV2X2dldChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBtb2RlX3QgbW9kZSwgdW5zaWduZWQgZmxhZ3MpCit7CisJLyoKKwkgKiBUaGlzIGNyb2NrbG9hZCBpcyBkdWUgdG8gYmFkIGNob2ljZSBvZiAtPm9wZW4oKSB0eXBlLgorCSAqIEl0IHdpbGwgZ28gYXdheS4KKwkgKiBGb3Igbm93LCBibG9jayBkZXZpY2UgLT5vcGVuKCkgcm91dGluZSBtdXN0IF9ub3RfCisJICogZXhhbWluZSBhbnl0aGluZyBpbiAnaW5vZGUnIGFyZ3VtZW50IGV4Y2VwdCAtPmlfcmRldi4KKwkgKi8KKwlzdHJ1Y3QgZmlsZSBmYWtlX2ZpbGUgPSB7fTsKKwlzdHJ1Y3QgZGVudHJ5IGZha2VfZGVudHJ5ID0ge307CisJZmFrZV9maWxlLmZfbW9kZSA9IG1vZGU7CisJZmFrZV9maWxlLmZfZmxhZ3MgPSBmbGFnczsKKwlmYWtlX2ZpbGUuZl9kZW50cnkgPSAmZmFrZV9kZW50cnk7CisJZmFrZV9kZW50cnkuZF9pbm9kZSA9IGJkZXYtPmJkX2lub2RlOworCisJcmV0dXJuIGRvX29wZW4oYmRldiwgJmZha2VfZmlsZSk7Cit9CisKK0VYUE9SVF9TWU1CT0woYmxrZGV2X2dldCk7CisKK3N0YXRpYyBpbnQgYmxrZGV2X29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCWludCByZXM7CisKKwkvKgorCSAqIFByZXNlcnZlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZCBhbGxvdyBsYXJnZSBmaWxlIGFjY2VzcworCSAqIGV2ZW4gaWYgdXNlcnNwYWNlIGRvZXNuJ3QgYXNrIGZvciBpdCBleHBsaWNpdGx5LiBTb21lIG1rZnMKKwkgKiBiaW5hcnkgbmVlZHMgaXQuIFdlIG1pZ2h0IHdhbnQgdG8gZHJvcCB0aGlzIHdvcmthcm91bmQKKwkgKiBkdXJpbmcgYW4gdW5zdGFibGUgYnJhbmNoLgorCSAqLworCWZpbHAtPmZfZmxhZ3MgfD0gT19MQVJHRUZJTEU7CisKKwliZGV2ID0gYmRfYWNxdWlyZShpbm9kZSk7CisKKwlyZXMgPSBkb19vcGVuKGJkZXYsIGZpbHApOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKKwlpZiAoIShmaWxwLT5mX2ZsYWdzICYgT19FWENMKSApCisJCXJldHVybiAwOworCisJaWYgKCEocmVzID0gYmRfY2xhaW0oYmRldiwgZmlscCkpKQorCQlyZXR1cm4gMDsKKworCWJsa2Rldl9wdXQoYmRldik7CisJcmV0dXJuIHJlczsKK30KKworaW50IGJsa2Rldl9wdXQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKmJkX2lub2RlID0gYmRldi0+YmRfaW5vZGU7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBiZGV2LT5iZF9kaXNrOworCisJZG93bigmYmRldi0+YmRfc2VtKTsKKwlsb2NrX2tlcm5lbCgpOworCWlmICghLS1iZGV2LT5iZF9vcGVuZXJzKSB7CisJCXN5bmNfYmxvY2tkZXYoYmRldik7CisJCWtpbGxfYmRldihiZGV2KTsKKwl9CisJaWYgKGJkZXYtPmJkX2NvbnRhaW5zID09IGJkZXYpIHsKKwkJaWYgKGRpc2stPmZvcHMtPnJlbGVhc2UpCisJCQlyZXQgPSBkaXNrLT5mb3BzLT5yZWxlYXNlKGJkX2lub2RlLCBOVUxMKTsKKwl9IGVsc2UgeworCQlkb3duKCZiZGV2LT5iZF9jb250YWlucy0+YmRfc2VtKTsKKwkJYmRldi0+YmRfY29udGFpbnMtPmJkX3BhcnRfY291bnQtLTsKKwkJdXAoJmJkZXYtPmJkX2NvbnRhaW5zLT5iZF9zZW0pOworCX0KKwlpZiAoIWJkZXYtPmJkX29wZW5lcnMpIHsKKwkJc3RydWN0IG1vZHVsZSAqb3duZXIgPSBkaXNrLT5mb3BzLT5vd25lcjsKKworCQlwdXRfZGlzayhkaXNrKTsKKwkJbW9kdWxlX3B1dChvd25lcik7CisKKwkJaWYgKGJkZXYtPmJkX2NvbnRhaW5zICE9IGJkZXYpIHsKKwkJCWtvYmplY3RfcHV0KCZiZGV2LT5iZF9wYXJ0LT5rb2JqKTsKKwkJCWJkZXYtPmJkX3BhcnQgPSBOVUxMOworCQl9CisJCWJkZXYtPmJkX2Rpc2sgPSBOVUxMOworCQliZGV2LT5iZF9pbm9kZS0+aV9kYXRhLmJhY2tpbmdfZGV2X2luZm8gPSAmZGVmYXVsdF9iYWNraW5nX2Rldl9pbmZvOworCQlpZiAoYmRldiAhPSBiZGV2LT5iZF9jb250YWlucykgeworCQkJYmxrZGV2X3B1dChiZGV2LT5iZF9jb250YWlucyk7CisJCX0KKwkJYmRldi0+YmRfY29udGFpbnMgPSBOVUxMOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJdXAoJmJkZXYtPmJkX3NlbSk7CisJYmRwdXQoYmRldik7CisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTChibGtkZXZfcHV0KTsKKworc3RhdGljIGludCBibGtkZXZfY2xvc2Uoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gSV9CREVWKGZpbHAtPmZfbWFwcGluZy0+aG9zdCk7CisJaWYgKGJkZXYtPmJkX2hvbGRlciA9PSBmaWxwKQorCQliZF9yZWxlYXNlKGJkZXYpOworCXJldHVybiBibGtkZXZfcHV0KGJkZXYpOworfQorCitzdGF0aWMgc3NpemVfdCBibGtkZXZfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW92ZWMgbG9jYWxfaW92ID0geyAuaW92X2Jhc2UgPSAodm9pZCBfX3VzZXIgKilidWYsIC5pb3ZfbGVuID0gY291bnQgfTsKKworCXJldHVybiBnZW5lcmljX2ZpbGVfd3JpdGVfbm9sb2NrKGZpbGUsICZsb2NhbF9pb3YsIDEsIHBwb3MpOworfQorCitzdGF0aWMgc3NpemVfdCBibGtkZXZfZmlsZV9haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgaW92ZWMgbG9jYWxfaW92ID0geyAuaW92X2Jhc2UgPSAodm9pZCBfX3VzZXIgKilidWYsIC5pb3ZfbGVuID0gY291bnQgfTsKKworCXJldHVybiBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlX25vbG9jayhpb2NiLCAmbG9jYWxfaW92LCAxLCAmaW9jYi0+a2lfcG9zKTsKK30KKworc3RhdGljIGludCBibG9ja19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIGJsa2Rldl9pb2N0bChmaWxlLT5mX21hcHBpbmctPmhvc3QsIGZpbGUsIGNtZCwgYXJnKTsKK30KKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBkZWZfYmxrX2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gYmxrZGV2X3JlYWRwYWdlLAorCS53cml0ZXBhZ2UJPSBibGtkZXZfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UJPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUJPSBibGtkZXZfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gYmxrZGV2X2NvbW1pdF93cml0ZSwKKwkud3JpdGVwYWdlcwk9IGdlbmVyaWNfd3JpdGVwYWdlcywKKwkuZGlyZWN0X0lPCT0gYmxrZGV2X2RpcmVjdF9JTywKK307CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVmX2Jsa19mb3BzID0geworCS5vcGVuCQk9IGJsa2Rldl9vcGVuLAorCS5yZWxlYXNlCT0gYmxrZGV2X2Nsb3NlLAorCS5sbHNlZWsJCT0gYmxvY2tfbGxzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfZmlsZV9yZWFkLAorCS53cml0ZQkJPSBibGtkZXZfZmlsZV93cml0ZSwKKyAgCS5haW9fcmVhZAk9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKKyAgCS5haW9fd3JpdGUJPSBibGtkZXZfZmlsZV9haW9fd3JpdGUsIAorCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAorCS5mc3luYwkJPSBibG9ja19mc3luYywKKwkuaW9jdGwJCT0gYmxvY2tfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwJPSBjb21wYXRfYmxrZGV2X2lvY3RsLAorI2VuZGlmCisJLnJlYWR2CQk9IGdlbmVyaWNfZmlsZV9yZWFkdiwKKwkud3JpdGV2CQk9IGdlbmVyaWNfZmlsZV93cml0ZV9ub2xvY2ssCisJLnNlbmRmaWxlCT0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorfTsKKworaW50IGlvY3RsX2J5X2JkZXYoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmVzOworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwlyZXMgPSBibGtkZXZfaW9jdGwoYmRldi0+YmRfaW5vZGUsIE5VTEwsIGNtZCwgYXJnKTsKKwlzZXRfZnMob2xkX2ZzKTsKKwlyZXR1cm4gcmVzOworfQorCitFWFBPUlRfU1lNQk9MKGlvY3RsX2J5X2JkZXYpOworCisvKioKKyAqIGxvb2t1cF9iZGV2ICAtIGxvb2t1cCBhIHN0cnVjdCBibG9ja19kZXZpY2UgYnkgbmFtZQorICoKKyAqIEBwYXRoOglzcGVjaWFsIGZpbGUgcmVwcmVzZW50aW5nIHRoZSBibG9jayBkZXZpY2UKKyAqCisgKiBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGJsb2NrZGV2aWNlIGF0IEBwYXRoIGluIHRoZSBjdXJyZW50CisgKiBuYW1lc3BhY2UgaWYgcG9zc2libGUgYW5kIHJldHVybiBpdC4gIFJldHVybiBFUlJfUFRSKGVycm9yKQorICogb3RoZXJ3aXNlLgorICovCitzdHJ1Y3QgYmxvY2tfZGV2aWNlICpsb29rdXBfYmRldihjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCBlcnJvcjsKKworCWlmICghcGF0aCB8fCAhKnBhdGgpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJZXJyb3IgPSBwYXRoX2xvb2t1cChwYXRoLCBMT09LVVBfRk9MTE9XLCAmbmQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworCisJaW5vZGUgPSBuZC5kZW50cnktPmRfaW5vZGU7CisJZXJyb3IgPSAtRU5PVEJMSzsKKwlpZiAoIVNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCisJCWdvdG8gZmFpbDsKKwllcnJvciA9IC1FQUNDRVM7CisJaWYgKG5kLm1udC0+bW50X2ZsYWdzICYgTU5UX05PREVWKQorCQlnb3RvIGZhaWw7CisJZXJyb3IgPSAtRU5PTUVNOworCWJkZXYgPSBiZF9hY3F1aXJlKGlub2RlKTsKKwlpZiAoIWJkZXYpCisJCWdvdG8gZmFpbDsKK291dDoKKwlwYXRoX3JlbGVhc2UoJm5kKTsKKwlyZXR1cm4gYmRldjsKK2ZhaWw6CisJYmRldiA9IEVSUl9QVFIoZXJyb3IpOworCWdvdG8gb3V0OworfQorCisvKioKKyAqIG9wZW5fYmRldl9leGNsICAtICBvcGVuIGEgYmxvY2sgZGV2aWNlIGJ5IG5hbWUgYW5kIHNldCBpdCB1cCBmb3IgdXNlCisgKgorICogQHBhdGg6CXNwZWNpYWwgZmlsZSByZXByZXNlbnRpbmcgdGhlIGJsb2NrIGRldmljZQorICogQGZsYWdzOgklTVNfUkRPTkxZIGZvciBvcGVuaW5nIHJlYWQtb25seQorICogQGhvbGRlcjoJb3duZXIgZm9yIGV4Y2x1c2lvbgorICoKKyAqIE9wZW4gdGhlIGJsb2NrZGV2aWNlIGRlc2NyaWJlZCBieSB0aGUgc3BlY2lhbCBmaWxlIGF0IEBwYXRoLCBjbGFpbSBpdAorICogZm9yIHRoZSBAaG9sZGVyLgorICovCitzdHJ1Y3QgYmxvY2tfZGV2aWNlICpvcGVuX2JkZXZfZXhjbChjb25zdCBjaGFyICpwYXRoLCBpbnQgZmxhZ3MsIHZvaWQgKmhvbGRlcikKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCW1vZGVfdCBtb2RlID0gRk1PREVfUkVBRDsKKwlpbnQgZXJyb3IgPSAwOworCisJYmRldiA9IGxvb2t1cF9iZGV2KHBhdGgpOworCWlmIChJU19FUlIoYmRldikpCisJCXJldHVybiBiZGV2OworCisJaWYgKCEoZmxhZ3MgJiBNU19SRE9OTFkpKQorCQltb2RlIHw9IEZNT0RFX1dSSVRFOworCWVycm9yID0gYmxrZGV2X2dldChiZGV2LCBtb2RlLCAwKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKKwllcnJvciA9IC1FQUNDRVM7CisJaWYgKCEoZmxhZ3MgJiBNU19SRE9OTFkpICYmIGJkZXZfcmVhZF9vbmx5KGJkZXYpKQorCQlnb3RvIGJsa2Rldl9wdXQ7CisJZXJyb3IgPSBiZF9jbGFpbShiZGV2LCBob2xkZXIpOworCWlmIChlcnJvcikKKwkJZ290byBibGtkZXZfcHV0OworCisJcmV0dXJuIGJkZXY7CisJCitibGtkZXZfcHV0OgorCWJsa2Rldl9wdXQoYmRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworfQorCitFWFBPUlRfU1lNQk9MKG9wZW5fYmRldl9leGNsKTsKKworLyoqCisgKiBjbG9zZV9iZGV2X2V4Y2wgIC0gIHJlbGVhc2UgYSBibG9ja2RldmljZSBvcGVuZW4gYnkgb3Blbl9iZGV2X2V4Y2woKQorICoKKyAqIEBiZGV2OglibG9ja2RldmljZSB0byBjbG9zZQorICoKKyAqIFRoaXMgaXMgdGhlIGNvdW50ZXJwYXJ0IHRvIG9wZW5fYmRldl9leGNsKCkuCisgKi8KK3ZvaWQgY2xvc2VfYmRldl9leGNsKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJYmRfcmVsZWFzZShiZGV2KTsKKwlibGtkZXZfcHV0KGJkZXYpOworfQorCitFWFBPUlRfU1lNQk9MKGNsb3NlX2JkZXZfZXhjbCk7CmRpZmYgLS1naXQgYS9mcy9idWZmZXIuYyBiL2ZzL2J1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjE2MDUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idWZmZXIuYwpAQCAtMCwwICsxLDMxNTIgQEAKKy8qCisgKiAgbGludXgvZnMvYnVmZmVyLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAyMDAyICBMaW51cyBUb3J2YWxkcworICovCisKKy8qCisgKiBTdGFydCBiZGZsdXNoKCkgd2l0aCBrZXJuZWxfdGhyZWFkIG5vdCBzeXNjYWxsIC0gUGF1bCBHb3J0bWFrZXIsIDEyLzk1CisgKgorICogUmVtb3ZlZCBhIGxvdCBvZiB1bm5lY2Vzc2FyeSBjb2RlIGFuZCBzaW1wbGlmaWVkIHRoaW5ncyBub3cgdGhhdAorICogdGhlIGJ1ZmZlciBjYWNoZSBpc24ndCBvdXIgcHJpbWFyeSBjYWNoZSAtIEFuZHJldyBUcmlkZ2VsbCAxMi85NgorICoKKyAqIFNwZWVkIHVwIGhhc2gsIGxydSwgYW5kIGZyZWUgbGlzdCBvcGVyYXRpb25zLiAgVXNlIGdmcCgpIGZvciBhbGxvY2F0aW5nCisgKiBoYXNoIHRhYmxlLCB1c2UgU0xBQiBjYWNoZSBmb3IgYnVmZmVyIGhlYWRzLiBTTVAgdGhyZWFkaW5nLiAgLURhdmVNCisgKgorICogQWRkZWQgMzJrIGJ1ZmZlciBibG9jayBzaXplcyAtIHRoZXNlIGFyZSByZXF1aXJlZCBvbGRlciBBUk0gc3lzdGVtcy4gLSBSTUsKKyAqCisgKiBhc3luYyBidWZmZXIgZmx1c2hpbmcsIDE5OTkgQW5kcmVhIEFyY2FuZ2VsaSA8YW5kcmVhQHN1c2UuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvYmlvLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tcGFnZS5oPgorCitzdGF0aWMgaW50IGZzeW5jX2J1ZmZlcnNfbGlzdChzcGlubG9ja190ICpsb2NrLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTsKK3N0YXRpYyB2b2lkIGludmFsaWRhdGVfYmhfbHJ1cyh2b2lkKTsKKworI2RlZmluZSBCSF9FTlRSWShsaXN0KSBsaXN0X2VudHJ5KChsaXN0KSwgc3RydWN0IGJ1ZmZlcl9oZWFkLCBiX2Fzc29jX2J1ZmZlcnMpCisKK2lubGluZSB2b2lkCitpbml0X2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBiaF9lbmRfaW9fdCAqaGFuZGxlciwgdm9pZCAqcHJpdmF0ZSkKK3sKKwliaC0+Yl9lbmRfaW8gPSBoYW5kbGVyOworCWJoLT5iX3ByaXZhdGUgPSBwcml2YXRlOworfQorCitzdGF0aWMgaW50IHN5bmNfYnVmZmVyKHZvaWQgKndvcmQpCit7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaAorCQk9IGNvbnRhaW5lcl9vZih3b3JkLCBzdHJ1Y3QgYnVmZmVyX2hlYWQsIGJfc3RhdGUpOworCisJc21wX21iKCk7CisJYmQgPSBiaC0+Yl9iZGV2OworCWlmIChiZCkKKwkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKGJkLT5iZF9pbm9kZS0+aV9tYXBwaW5nKTsKKwlpb19zY2hlZHVsZSgpOworCXJldHVybiAwOworfQorCit2b2lkIGZhc3RjYWxsIF9fbG9ja19idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwl3YWl0X29uX2JpdF9sb2NrKCZiaC0+Yl9zdGF0ZSwgQkhfTG9jaywgc3luY19idWZmZXIsCisJCQkJCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOworfQorRVhQT1JUX1NZTUJPTChfX2xvY2tfYnVmZmVyKTsKKwordm9pZCBmYXN0Y2FsbCB1bmxvY2tfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJY2xlYXJfYnVmZmVyX2xvY2tlZChiaCk7CisJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKKwl3YWtlX3VwX2JpdCgmYmgtPmJfc3RhdGUsIEJIX0xvY2spOworfQorCisvKgorICogQmxvY2sgdW50aWwgYSBidWZmZXIgY29tZXMgdW5sb2NrZWQuICBUaGlzIGRvZXNuJ3Qgc3RvcCBpdAorICogZnJvbSBiZWNvbWluZyBsb2NrZWQgYWdhaW4gLSB5b3UgaGF2ZSB0byBsb2NrIGl0IHlvdXJzZWxmCisgKiBpZiB5b3Ugd2FudCB0byBwcmVzZXJ2ZSBpdHMgc3RhdGUuCisgKi8KK3ZvaWQgX193YWl0X29uX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3sKKwl3YWl0X29uX2JpdCgmYmgtPmJfc3RhdGUsIEJIX0xvY2ssIHN5bmNfYnVmZmVyLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2NsZWFyX3BhZ2VfYnVmZmVycyhzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlDbGVhclBhZ2VQcml2YXRlKHBhZ2UpOworCXBhZ2UtPnByaXZhdGUgPSAwOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKK30KKworc3RhdGljIHZvaWQgYnVmZmVyX2lvX2Vycm9yKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJY2hhciBiW0JERVZOQU1FX1NJWkVdOworCisJcHJpbnRrKEtFUk5fRVJSICJCdWZmZXIgSS9PIGVycm9yIG9uIGRldmljZSAlcywgbG9naWNhbCBibG9jayAlTHVcbiIsCisJCQliZGV2bmFtZShiaC0+Yl9iZGV2LCBiKSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7Cit9CisKKy8qCisgKiBEZWZhdWx0IHN5bmNocm9ub3VzIGVuZC1vZi1JTyBoYW5kbGVyLi4gIEp1c3QgbWFyayBpdCB1cC10by1kYXRlIGFuZAorICogdW5sb2NrIHRoZSBidWZmZXIuIFRoaXMgaXMgd2hhdCBsbF9yd19ibG9jayB1c2VzIHRvby4KKyAqLwordm9pZCBlbmRfYnVmZmVyX3JlYWRfc3luYyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdXB0b2RhdGUpCit7CisJaWYgKHVwdG9kYXRlKSB7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCX0gZWxzZSB7CisJCS8qIFRoaXMgaGFwcGVucywgZHVlIHRvIGZhaWxlZCBSRUFEQSBhdHRlbXB0cy4gKi8KKwkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwl9CisJdW5sb2NrX2J1ZmZlcihiaCk7CisJcHV0X2JoKGJoKTsKK30KKwordm9pZCBlbmRfYnVmZmVyX3dyaXRlX3N5bmMoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKQoreworCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKKworCWlmICh1cHRvZGF0ZSkgeworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwl9IGVsc2UgeworCQlpZiAoIWJ1ZmZlcl9lb3Bub3RzdXBwKGJoKSAmJiBwcmludGtfcmF0ZWxpbWl0KCkpIHsKKwkJCWJ1ZmZlcl9pb19lcnJvcihiaCk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb3N0IHBhZ2Ugd3JpdGUgZHVlIHRvICIKKwkJCQkJIkkvTyBlcnJvciBvbiAlc1xuIiwKKwkJCQkgICAgICAgYmRldm5hbWUoYmgtPmJfYmRldiwgYikpOworCQl9CisJCXNldF9idWZmZXJfd3JpdGVfaW9fZXJyb3IoYmgpOworCQljbGVhcl9idWZmZXJfdXB0b2RhdGUoYmgpOworCX0KKwl1bmxvY2tfYnVmZmVyKGJoKTsKKwlwdXRfYmgoYmgpOworfQorCisvKgorICogV3JpdGUgb3V0IGFuZCB3YWl0IHVwb24gYWxsIHRoZSBkaXJ0eSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIGJsb2NrCisgKiBkZXZpY2UgdmlhIGl0cyBtYXBwaW5nLiAgRG9lcyBub3QgdGFrZSB0aGUgc3VwZXJibG9jayBsb2NrLgorICovCitpbnQgc3luY19ibG9ja2RldihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCWludCByZXQgPSAwOworCisJaWYgKGJkZXYpIHsKKwkJaW50IGVycjsKKworCQlyZXQgPSBmaWxlbWFwX2ZkYXRhd3JpdGUoYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZyk7CisJCWVyciA9IGZpbGVtYXBfZmRhdGF3YWl0KGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGVycjsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woc3luY19ibG9ja2Rldik7CisKKy8qCisgKiBXcml0ZSBvdXQgYW5kIHdhaXQgdXBvbiBhbGwgZGlydHkgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcworICogc3VwZXJibG9jay4gIEZpbGVzeXN0ZW0gZGF0YSBhcyB3ZWxsIGFzIHRoZSB1bmRlcmx5aW5nIGJsb2NrCisgKiBkZXZpY2UuICBUYWtlcyB0aGUgc3VwZXJibG9jayBsb2NrLgorICovCitpbnQgZnN5bmNfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzeW5jX2lub2Rlc19zYihzYiwgMCk7CisJRFFVT1RfU1lOQyhzYik7CisJbG9ja19zdXBlcihzYik7CisJaWYgKHNiLT5zX2RpcnQgJiYgc2ItPnNfb3AtPndyaXRlX3N1cGVyKQorCQlzYi0+c19vcC0+d3JpdGVfc3VwZXIoc2IpOworCXVubG9ja19zdXBlcihzYik7CisJaWYgKHNiLT5zX29wLT5zeW5jX2ZzKQorCQlzYi0+c19vcC0+c3luY19mcyhzYiwgMSk7CisJc3luY19ibG9ja2RldihzYi0+c19iZGV2KTsKKwlzeW5jX2lub2Rlc19zYihzYiwgMSk7CisKKwlyZXR1cm4gc3luY19ibG9ja2RldihzYi0+c19iZGV2KTsKK30KKworLyoKKyAqIFdyaXRlIG91dCBhbmQgd2FpdCB1cG9uIGFsbCBkaXJ0eSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiBkZXZpY2UuICAgRmlsZXN5c3RlbSBkYXRhIGFzIHdlbGwgYXMgdGhlIHVuZGVybHlpbmcgYmxvY2sKKyAqIGRldmljZS4gIFRha2VzIHRoZSBzdXBlcmJsb2NrIGxvY2suCisgKi8KK2ludCBmc3luY19iZGV2KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGdldF9zdXBlcihiZGV2KTsKKwlpZiAoc2IpIHsKKwkJaW50IHJlcyA9IGZzeW5jX3N1cGVyKHNiKTsKKwkJZHJvcF9zdXBlcihzYik7CisJCXJldHVybiByZXM7CisJfQorCXJldHVybiBzeW5jX2Jsb2NrZGV2KGJkZXYpOworfQorCisvKioKKyAqIGZyZWV6ZV9iZGV2ICAtLSAgbG9jayBhIGZpbGVzeXN0ZW0gYW5kIGZvcmNlIGl0IGludG8gYSBjb25zaXN0ZW50IHN0YXRlCisgKiBAYmRldjoJYmxvY2tkZXZpY2UgdG8gbG9jaworICoKKyAqIFRoaXMgdGFrZXMgdGhlIGJsb2NrIGRldmljZSBiZF9tb3VudF9zZW0gdG8gbWFrZSBzdXJlIG5vIG5ldyBtb3VudHMKKyAqIGhhcHBlbiBvbiBiZGV2IHVudGlsIHRoYXdfYmRldigpIGlzIGNhbGxlZC4KKyAqIElmIGEgc3VwZXJibG9jayBpcyBmb3VuZCBvbiB0aGlzIGRldmljZSwgd2UgdGFrZSB0aGUgc191bW91bnQgc2VtYXBob3JlCisgKiBvbiBpdCB0byBtYWtlIHN1cmUgbm9ib2R5IHVubW91bnRzIHVudGlsIHRoZSBzbmFwc2hvdCBjcmVhdGlvbiBpcyBkb25lLgorICovCitzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmZyZWV6ZV9iZGV2KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKworCWRvd24oJmJkZXYtPmJkX21vdW50X3NlbSk7CisJc2IgPSBnZXRfc3VwZXIoYmRldik7CisJaWYgKHNiICYmICEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCXNiLT5zX2Zyb3plbiA9IFNCX0ZSRUVaRV9XUklURTsKKwkJd21iKCk7CisKKwkJc3luY19pbm9kZXNfc2Ioc2IsIDApOworCQlEUVVPVF9TWU5DKHNiKTsKKworCQlsb2NrX3N1cGVyKHNiKTsKKwkJaWYgKHNiLT5zX2RpcnQgJiYgc2ItPnNfb3AtPndyaXRlX3N1cGVyKQorCQkJc2ItPnNfb3AtPndyaXRlX3N1cGVyKHNiKTsKKwkJdW5sb2NrX3N1cGVyKHNiKTsKKworCQlpZiAoc2ItPnNfb3AtPnN5bmNfZnMpCisJCQlzYi0+c19vcC0+c3luY19mcyhzYiwgMSk7CisKKwkJc3luY19ibG9ja2RldihzYi0+c19iZGV2KTsKKwkJc3luY19pbm9kZXNfc2Ioc2IsIDEpOworCisJCXNiLT5zX2Zyb3plbiA9IFNCX0ZSRUVaRV9UUkFOUzsKKwkJd21iKCk7CisKKwkJc3luY19ibG9ja2RldihzYi0+c19iZGV2KTsKKworCQlpZiAoc2ItPnNfb3AtPndyaXRlX3N1cGVyX2xvY2tmcykKKwkJCXNiLT5zX29wLT53cml0ZV9zdXBlcl9sb2NrZnMoc2IpOworCX0KKworCXN5bmNfYmxvY2tkZXYoYmRldik7CisJcmV0dXJuIHNiOwkvKiB0aGF3X2JkZXYgcmVsZWFzZXMgcy0+c191bW91bnQgYW5kIGJkX21vdW50X3NlbSAqLworfQorRVhQT1JUX1NZTUJPTChmcmVlemVfYmRldik7CisKKy8qKgorICogdGhhd19iZGV2ICAtLSB1bmxvY2sgZmlsZXN5c3RlbQorICogQGJkZXY6CWJsb2NrZGV2aWNlIHRvIHVubG9jaworICogQHNiOgkJYXNzb2NpYXRlZCBzdXBlcmJsb2NrCisgKgorICogVW5sb2NrcyB0aGUgZmlsZXN5c3RlbSBhbmQgbWFya3MgaXQgd3JpdGVhYmxlIGFnYWluIGFmdGVyIGZyZWV6ZV9iZGV2KCkuCisgKi8KK3ZvaWQgdGhhd19iZGV2KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaWYgKHNiKSB7CisJCUJVR19PTihzYi0+c19iZGV2ICE9IGJkZXYpOworCisJCWlmIChzYi0+c19vcC0+dW5sb2NrZnMpCisJCQlzYi0+c19vcC0+dW5sb2NrZnMoc2IpOworCQlzYi0+c19mcm96ZW4gPSBTQl9VTkZST1pFTjsKKwkJd21iKCk7CisJCXdha2VfdXAoJnNiLT5zX3dhaXRfdW5mcm96ZW4pOworCQlkcm9wX3N1cGVyKHNiKTsKKwl9CisKKwl1cCgmYmRldi0+YmRfbW91bnRfc2VtKTsKK30KK0VYUE9SVF9TWU1CT0wodGhhd19iZGV2KTsKKworLyoKKyAqIHN5bmMgZXZlcnl0aGluZy4gIFN0YXJ0IG91dCBieSB3YWtpbmcgcGRmbHVzaCwgYmVjYXVzZSB0aGF0IHdyaXRlcyBiYWNrCisgKiBhbGwgcXVldWVzIGluIHBhcmFsbGVsLgorICovCitzdGF0aWMgdm9pZCBkb19zeW5jKHVuc2lnbmVkIGxvbmcgd2FpdCkKK3sKKwl3YWtldXBfYmRmbHVzaCgwKTsKKwlzeW5jX2lub2RlcygwKTsJCS8qIEFsbCBtYXBwaW5ncywgaW5vZGVzIGFuZCB0aGVpciBibG9ja2RldnMgKi8KKwlEUVVPVF9TWU5DKE5VTEwpOworCXN5bmNfc3VwZXJzKCk7CQkvKiBXcml0ZSB0aGUgc3VwZXJibG9ja3MgKi8KKwlzeW5jX2ZpbGVzeXN0ZW1zKDApOwkvKiBTdGFydCBzeW5jaW5nIHRoZSBmaWxlc3lzdGVtcyAqLworCXN5bmNfZmlsZXN5c3RlbXMod2FpdCk7CS8qIFdhaXRpbmdseSBzeW5jIHRoZSBmaWxlc3lzdGVtcyAqLworCXN5bmNfaW5vZGVzKHdhaXQpOwkvKiBNYXBwaW5ncywgaW5vZGVzIGFuZCBibG9ja2RldnMsIGFnYWluLiAqLworCWlmICghd2FpdCkKKwkJcHJpbnRrKCJFbWVyZ2VuY3kgU3luYyBjb21wbGV0ZVxuIik7CisJaWYgKHVubGlrZWx5KGxhcHRvcF9tb2RlKSkKKwkJbGFwdG9wX3N5bmNfY29tcGxldGlvbigpOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX3N5bmModm9pZCkKK3sKKwlkb19zeW5jKDEpOworCXJldHVybiAwOworfQorCit2b2lkIGVtZXJnZW5jeV9zeW5jKHZvaWQpCit7CisJcGRmbHVzaF9vcGVyYXRpb24oZG9fc3luYywgMCk7Cit9CisKKy8qCisgKiBHZW5lcmljIGZ1bmN0aW9uIHRvIGZzeW5jIGEgZmlsZS4KKyAqCisgKiBmaWxwIG1heSBiZSBOVUxMIGlmIGNhbGxlZCB2aWEgdGhlIG1zeW5jIG9mIGEgdm1hLgorICovCisgCitpbnQgZmlsZV9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCit7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJaW50IHJldCwgZXJyOworCisJLyogc3luYyB0aGUgaW5vZGUgdG8gYnVmZmVycyAqLworCXJldCA9IHdyaXRlX2lub2RlX25vdyhpbm9kZSwgMCk7CisKKwkvKiBzeW5jIHRoZSBzdXBlcmJsb2NrIHRvIGJ1ZmZlcnMgKi8KKwlzYiA9IGlub2RlLT5pX3NiOworCWxvY2tfc3VwZXIoc2IpOworCWlmIChzYi0+c19vcC0+d3JpdGVfc3VwZXIpCisJCXNiLT5zX29wLT53cml0ZV9zdXBlcihzYik7CisJdW5sb2NrX3N1cGVyKHNiKTsKKworCS8qIC4uIGZpbmFsbHkgc3luYyB0aGUgYnVmZmVycyB0byBkaXNrICovCisJZXJyID0gc3luY19ibG9ja2RldihzYi0+c19iZGV2KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gZXJyOworCXJldHVybiByZXQ7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfZnN5bmModW5zaWduZWQgaW50IGZkKQoreworCXN0cnVjdCBmaWxlICogZmlsZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlpbnQgcmV0LCBlcnI7CisKKwlyZXQgPSAtRUJBREY7CisJZmlsZSA9IGZnZXQoZmQpOworCWlmICghZmlsZSkKKwkJZ290byBvdXQ7CisKKwltYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOworCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPmZzeW5jKSB7CisJCS8qIFdoeT8gIFdlIGNhbiBzdGlsbCBjYWxsIGZpbGVtYXBfZmRhdGF3cml0ZSAqLworCQlnb3RvIG91dF9wdXRmOworCX0KKworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX1NZTkNXUklURTsKKwlyZXQgPSBmaWxlbWFwX2ZkYXRhd3JpdGUobWFwcGluZyk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgd3JpdGVycywKKwkgKiB3aGljaCBjb3VsZCBjYXVzZSBsaXZlbG9ja3MgaW4gZnN5bmNfYnVmZmVyc19saXN0CisJICovCisJZG93bigmbWFwcGluZy0+aG9zdC0+aV9zZW0pOworCWVyciA9IGZpbGUtPmZfb3AtPmZzeW5jKGZpbGUsIGZpbGUtPmZfZGVudHJ5LCAwKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gZXJyOworCXVwKCZtYXBwaW5nLT5ob3N0LT5pX3NlbSk7CisJZXJyID0gZmlsZW1hcF9mZGF0YXdhaXQobWFwcGluZyk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKKwljdXJyZW50LT5mbGFncyAmPSB+UEZfU1lOQ1dSSVRFOworCitvdXRfcHV0ZjoKKwlmcHV0KGZpbGUpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfZmRhdGFzeW5jKHVuc2lnbmVkIGludCBmZCkKK3sKKwlzdHJ1Y3QgZmlsZSAqIGZpbGU7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJaW50IHJldCwgZXJyOworCisJcmV0ID0gLUVCQURGOworCWZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gb3V0OworCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPmZzeW5jKQorCQlnb3RvIG91dF9wdXRmOworCisJbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKKworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX1NZTkNXUklURTsKKwlyZXQgPSBmaWxlbWFwX2ZkYXRhd3JpdGUobWFwcGluZyk7CisJZG93bigmbWFwcGluZy0+aG9zdC0+aV9zZW0pOworCWVyciA9IGZpbGUtPmZfb3AtPmZzeW5jKGZpbGUsIGZpbGUtPmZfZGVudHJ5LCAxKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gZXJyOworCXVwKCZtYXBwaW5nLT5ob3N0LT5pX3NlbSk7CisJZXJyID0gZmlsZW1hcF9mZGF0YXdhaXQobWFwcGluZyk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKKwljdXJyZW50LT5mbGFncyAmPSB+UEZfU1lOQ1dSSVRFOworCitvdXRfcHV0ZjoKKwlmcHV0KGZpbGUpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBWYXJpb3VzIGZpbGVzeXN0ZW1zIGFwcGVhciB0byB3YW50IF9fZmluZF9nZXRfYmxvY2sgdG8gYmUgbm9uLWJsb2NraW5nLgorICogQnV0IGl0J3MgdGhlIHBhZ2UgbG9jayB3aGljaCBwcm90ZWN0cyB0aGUgYnVmZmVycy4gIFRvIGdldCBhcm91bmQgdGhpcywKKyAqIHdlIGdldCBleGNsdXNpb24gZnJvbSB0cnlfdG9fZnJlZV9idWZmZXJzIHdpdGggdGhlIGJsb2NrZGV2IG1hcHBpbmcncworICogcHJpdmF0ZV9sb2NrLgorICoKKyAqIEhhY2sgaWRlYTogZm9yIHRoZSBibG9ja2RldiBtYXBwaW5nLCBpX2J1ZmZlcmxpc3RfbG9jayBjb250ZW50aW9uCisgKiBtYXkgYmUgcXVpdGUgaGlnaC4gIFRoaXMgY29kZSBjb3VsZCBUcnlMb2NrIHRoZSBwYWdlLCBhbmQgaWYgdGhhdAorICogc3VjY2VlZHMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gdGFrZSBwcml2YXRlX2xvY2suIChCdXQgaWYKKyAqIHByaXZhdGVfbG9jayBpcyBjb250ZW5kZWQgdGhlbiBzbyBpcyBtYXBwaW5nLT50cmVlX2xvY2spLgorICovCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK19fZmluZF9nZXRfYmxvY2tfc2xvdyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBibG9jaywgaW50IHVudXNlZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmJkX2lub2RlID0gYmRldi0+YmRfaW5vZGU7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmJkX21hcHBpbmcgPSBiZF9pbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBidWZmZXJfaGVhZCAqcmV0ID0gTlVMTDsKKwlwZ29mZl90IGluZGV4OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkOworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCBhbGxfbWFwcGVkID0gMTsKKworCWluZGV4ID0gYmxvY2sgPj4gKFBBR0VfQ0FDSEVfU0hJRlQgLSBiZF9pbm9kZS0+aV9ibGtiaXRzKTsKKwlwYWdlID0gZmluZF9nZXRfcGFnZShiZF9tYXBwaW5nLCBpbmRleCk7CisJaWYgKCFwYWdlKQorCQlnb3RvIG91dDsKKworCXNwaW5fbG9jaygmYmRfbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCWdvdG8gb3V0X3VubG9jazsKKwloZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWJoID0gaGVhZDsKKwlkbyB7CisJCWlmIChiaC0+Yl9ibG9ja25yID09IGJsb2NrKSB7CisJCQlyZXQgPSBiaDsKKwkJCWdldF9iaChiaCk7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkKKwkJCWFsbF9tYXBwZWQgPSAwOworCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKworCS8qIHdlIG1pZ2h0IGJlIGhlcmUgYmVjYXVzZSBzb21lIG9mIHRoZSBidWZmZXJzIG9uIHRoaXMgcGFnZSBhcmUKKwkgKiBub3QgbWFwcGVkLiAgVGhpcyBpcyBkdWUgdG8gdmFyaW91cyByYWNlcyBiZXR3ZWVuCisJICogZmlsZSBpbyBvbiB0aGUgYmxvY2sgZGV2aWNlIGFuZCBnZXRibGsuICBJdCBnZXRzIGRlYWx0IHdpdGgKKwkgKiBlbHNld2hlcmUsIGRvbid0IGJ1ZmZlcl9lcnJvciBpZiB3ZSBoYWQgc29tZSB1bm1hcHBlZCBidWZmZXJzCisJICovCisJaWYgKGFsbF9tYXBwZWQpIHsKKwkJcHJpbnRrKCJfX2ZpbmRfZ2V0X2Jsb2NrX3Nsb3coKSBmYWlsZWQuICIKKwkJCSJibG9jaz0lbGx1LCBiX2Jsb2NrbnI9JWxsdVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmxvY2ssICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CisJCXByaW50aygiYl9zdGF0ZT0weCUwOGx4LCBiX3NpemU9JXVcbiIsIGJoLT5iX3N0YXRlLCBiaC0+Yl9zaXplKTsKKwkJcHJpbnRrKCJkZXZpY2UgYmxvY2tzaXplOiAlZFxuIiwgMSA8PCBiZF9pbm9kZS0+aV9ibGtiaXRzKTsKKwl9CitvdXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrKCZiZF9tYXBwaW5nLT5wcml2YXRlX2xvY2spOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBJZiBpbnZhbGlkYXRlX2J1ZmZlcnMoKSB3aWxsIHRyYXNoIGRpcnR5IGJ1ZmZlcnMsIGl0IG1lYW5zIHNvbWUga2luZAorICAgb2YgZnMgY29ycnVwdGlvbiBpcyBnb2luZyBvbi4gVHJhc2hpbmcgZGlydHkgZGF0YSBhbHdheXMgaW1wbHkgbG9zaW5nCisgICBpbmZvcm1hdGlvbiB0aGF0IHdhcyBzdXBwb3NlZCB0byBiZSBqdXN0IHN0b3JlZCBvbiB0aGUgcGh5c2ljYWwgbGF5ZXIKKyAgIGJ5IHRoZSB1c2VyLgorCisgICBUaHVzIGludmFsaWRhdGVfYnVmZmVycyBpbiBnZW5lcmFsIHVzYWdlIGlzIG5vdCBhbGx3b3dlZCB0byB0cmFzaAorICAgZGlydHkgYnVmZmVycy4gRm9yIGV4YW1wbGUgaW9jdGwoRkxTQkxLQlVGKSBleHBlY3RzIGRpcnR5IGRhdGEgdG8KKyAgIGJlIHByZXNlcnZlZC4gIFRoZXNlIGJ1ZmZlcnMgYXJlIHNpbXBseSBza2lwcGVkLgorICAKKyAgIFdlIGFsc28gc2tpcCBidWZmZXJzIHdoaWNoIGFyZSBzdGlsbCBpbiB1c2UuICBGb3IgZXhhbXBsZSB0aGlzIGNhbgorICAgaGFwcGVuIGlmIGEgdXNlcnNwYWNlIHByb2dyYW0gaXMgcmVhZGluZyB0aGUgYmxvY2sgZGV2aWNlLgorCisgICBOT1RFOiBJbiB0aGUgY2FzZSB3aGVyZSB0aGUgdXNlciByZW1vdmVkIGEgcmVtb3ZhYmxlLW1lZGlhLWRpc2sgZXZlbiBpZgorICAgdGhlcmUncyBzdGlsbCBkaXJ0eSBkYXRhIG5vdCBzeW5jZWQgb24gZGlzayAoZHVlIGEgYnVnIGluIHRoZSBkZXZpY2UgZHJpdmVyCisgICBvciBkdWUgYW4gZXJyb3Igb2YgdGhlIHVzZXIpLCBieSBub3QgZGVzdHJveWluZyB0aGUgZGlydHkgYnVmZmVycyB3ZSBjb3VsZAorICAgZ2VuZXJhdGUgY29ycnVwdGlvbiBhbHNvIG9uIHRoZSBuZXh0IG1lZGlhIGluc2VydGVkLCB0aHVzIGEgcGFyYW1ldGVyIGlzCisgICBuZWNlc3NhcnkgdG8gaGFuZGxlIHRoaXMgY2FzZSBpbiB0aGUgbW9zdCBzYWZlIHdheSBwb3NzaWJsZSAodHJ5aW5nCisgICB0byBub3QgY29ycnVwdCBhbHNvIHRoZSBuZXcgZGlzayBpbnNlcnRlZCB3aXRoIHRoZSBkYXRhIGJlbG9uZ2luZyB0bworICAgdGhlIG9sZCBub3cgY29ycnVwdGVkIGRpc2spLiBBbHNvIGZvciB0aGUgcmFtZGlzayB0aGUgbmF0dXJhbCB0aGluZworICAgdG8gZG8gaW4gb3JkZXIgdG8gcmVsZWFzZSB0aGUgcmFtZGlzayBtZW1vcnkgaXMgdG8gZGVzdHJveSBkaXJ0eSBidWZmZXJzLgorCisgICBUaGVzZSBhcmUgdHdvIHNwZWNpYWwgY2FzZXMuIE5vcm1hbCB1c2FnZSBpbXBseSB0aGUgZGV2aWNlIGRyaXZlcgorICAgdG8gaXNzdWUgYSBzeW5jIG9uIHRoZSBkZXZpY2UgKHdpdGhvdXQgd2FpdGluZyBJL08gY29tcGxldGlvbikgYW5kCisgICB0aGVuIGFuIGludmFsaWRhdGVfYnVmZmVycyBjYWxsIHRoYXQgZG9lc24ndCB0cmFzaCBkaXJ0eSBidWZmZXJzLgorCisgICBGb3IgaGFuZGxpbmcgY2FjaGUgY29oZXJlbmN5IHdpdGggdGhlIGJsa2RldiBwYWdlY2FjaGUgdGhlICd1cGRhdGUnIGNhc2UKKyAgIGlzIGJlZW4gaW50cm9kdWNlZC4gSXQgaXMgbmVlZGVkIHRvIHJlLXJlYWQgZnJvbSBkaXNrIGFueSBwaW5uZWQKKyAgIGJ1ZmZlci4gTk9URTogcmUtcmVhZGluZyBmcm9tIGRpc2sgaXMgZGVzdHJ1Y3RpdmUgc28gd2UgY2FuIGRvIGl0IG9ubHkKKyAgIHdoZW4gd2UgYXNzdW1lIG5vYm9keSBpcyBjaGFuZ2luZyB0aGUgYnVmZmVyY2FjaGUgdW5kZXIgb3VyIEkvTyBhbmQgd2hlbgorICAgd2UgdGhpbmsgdGhlIGRpc2sgY29udGFpbnMgbW9yZSByZWNlbnQgaW5mb3JtYXRpb24gdGhhbiB0aGUgYnVmZmVyY2FjaGUuCisgICBUaGUgdXBkYXRlID09IDEgcGFzcyBtYXJrcyB0aGUgYnVmZmVycyB3ZSBuZWVkIHRvIHVwZGF0ZSwgdGhlIHVwZGF0ZSA9PSAyCisgICBwYXNzIGRvZXMgdGhlIGFjdHVhbCBJL08uICovCit2b2lkIGludmFsaWRhdGVfYmRldihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBpbnQgZGVzdHJveV9kaXJ0eV9idWZmZXJzKQoreworCWludmFsaWRhdGVfYmhfbHJ1cygpOworCS8qCisJICogRklYTUU6IHdoYXQgYWJvdXQgZGVzdHJveV9kaXJ0eV9idWZmZXJzPworCSAqIFdlIHJlYWxseSB3YW50IHRvIHVzZSBpbnZhbGlkYXRlX2lub2RlX3BhZ2VzMigpIGZvcgorCSAqIHRoYXQsIGJ1dCBub3QgdW50aWwgdGhhdCdzIGNsZWFuZWQgdXAuCisJICovCisJaW52YWxpZGF0ZV9pbm9kZV9wYWdlcyhiZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nKTsKK30KKworLyoKKyAqIEtpY2sgcGRmbHVzaCB0aGVuIHRyeSB0byBmcmVlIHVwIHNvbWUgWk9ORV9OT1JNQUwgbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCBmcmVlX21vcmVfbWVtb3J5KHZvaWQpCit7CisJc3RydWN0IHpvbmUgKip6b25lczsKKwlwZ19kYXRhX3QgKnBnZGF0OworCisJd2FrZXVwX2JkZmx1c2goMTAyNCk7CisJeWllbGQoKTsKKworCWZvcl9lYWNoX3BnZGF0KHBnZGF0KSB7CisJCXpvbmVzID0gcGdkYXQtPm5vZGVfem9uZWxpc3RzW0dGUF9OT0ZTJkdGUF9aT05FTUFTS10uem9uZXM7CisJCWlmICgqem9uZXMpCisJCQl0cnlfdG9fZnJlZV9wYWdlcyh6b25lcywgR0ZQX05PRlMsIDApOworCX0KK30KKworLyoKKyAqIEkvTyBjb21wbGV0aW9uIGhhbmRsZXIgZm9yIGJsb2NrX3JlYWRfZnVsbF9wYWdlKCkgLSBwYWdlcworICogd2hpY2ggY29tZSB1bmxvY2tlZCBhdCB0aGUgZW5kIG9mIEkvTy4KKyAqLworc3RhdGljIHZvaWQgZW5kX2J1ZmZlcl9hc3luY19yZWFkKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB1cHRvZGF0ZSkKK3sKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBhZ2VfdXB0b2RhdGVfbG9jayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRtcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgcGFnZV91cHRvZGF0ZSA9IDE7CisKKwlCVUdfT04oIWJ1ZmZlcl9hc3luY19yZWFkKGJoKSk7CisKKwlwYWdlID0gYmgtPmJfcGFnZTsKKwlpZiAodXB0b2RhdGUpIHsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJfSBlbHNlIHsKKwkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCWJ1ZmZlcl9pb19lcnJvcihiaCk7CisJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwl9CisKKwkvKgorCSAqIEJlIF92ZXJ5XyBjYXJlZnVsIGZyb20gaGVyZSBvbi4gQmFkIHRoaW5ncyBjYW4gaGFwcGVuIGlmCisJICogdHdvIGJ1ZmZlciBoZWFkcyBlbmQgSU8gYXQgYWxtb3N0IHRoZSBzYW1lIHRpbWUgYW5kIGJvdGgKKwkgKiBkZWNpZGUgdGhhdCB0aGUgcGFnZSBpcyBub3cgY29tcGxldGVseSBkb25lLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwYWdlX3VwdG9kYXRlX2xvY2ssIGZsYWdzKTsKKwljbGVhcl9idWZmZXJfYXN5bmNfcmVhZChiaCk7CisJdW5sb2NrX2J1ZmZlcihiaCk7CisJdG1wID0gYmg7CisJZG8geworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZSh0bXApKQorCQkJcGFnZV91cHRvZGF0ZSA9IDA7CisJCWlmIChidWZmZXJfYXN5bmNfcmVhZCh0bXApKSB7CisJCQlCVUdfT04oIWJ1ZmZlcl9sb2NrZWQodG1wKSk7CisJCQlnb3RvIHN0aWxsX2J1c3k7CisJCX0KKwkJdG1wID0gdG1wLT5iX3RoaXNfcGFnZTsKKwl9IHdoaWxlICh0bXAgIT0gYmgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhZ2VfdXB0b2RhdGVfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBJZiBub25lIG9mIHRoZSBidWZmZXJzIGhhZCBlcnJvcnMgYW5kIHRoZXkgYXJlIGFsbAorCSAqIHVwdG9kYXRlIHRoZW4gd2UgY2FuIHNldCB0aGUgcGFnZSB1cHRvZGF0ZS4KKwkgKi8KKwlpZiAocGFnZV91cHRvZGF0ZSAmJiAhUGFnZUVycm9yKHBhZ2UpKQorCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuOworCitzdGlsbF9idXN5OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhZ2VfdXB0b2RhdGVfbG9jaywgZmxhZ3MpOworCXJldHVybjsKK30KKworLyoKKyAqIENvbXBsZXRpb24gaGFuZGxlciBmb3IgYmxvY2tfd3JpdGVfZnVsbF9wYWdlKCkgLSBwYWdlcyB3aGljaCBhcmUgdW5sb2NrZWQKKyAqIGR1cmluZyBJL08sIGFuZCB3aGljaCBoYXZlIFBhZ2VXcml0ZWJhY2sgY2xlYXJlZCB1cG9uIEkvTyBjb21wbGV0aW9uLgorICovCit2b2lkIGVuZF9idWZmZXJfYXN5bmNfd3JpdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKQoreworCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBhZ2VfdXB0b2RhdGVfbG9jayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRtcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCUJVR19PTighYnVmZmVyX2FzeW5jX3dyaXRlKGJoKSk7CisKKwlwYWdlID0gYmgtPmJfcGFnZTsKKwlpZiAodXB0b2RhdGUpIHsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJfSBlbHNlIHsKKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkgeworCQkJYnVmZmVyX2lvX2Vycm9yKGJoKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImxvc3QgcGFnZSB3cml0ZSBkdWUgdG8gIgorCQkJCQkiSS9PIGVycm9yIG9uICVzXG4iLAorCQkJICAgICAgIGJkZXZuYW1lKGJoLT5iX2JkZXYsIGIpKTsKKwkJfQorCQlzZXRfYml0KEFTX0VJTywgJnBhZ2UtPm1hcHBpbmctPmZsYWdzKTsKKwkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJU2V0UGFnZUVycm9yKHBhZ2UpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwYWdlX3VwdG9kYXRlX2xvY2ssIGZsYWdzKTsKKwljbGVhcl9idWZmZXJfYXN5bmNfd3JpdGUoYmgpOworCXVubG9ja19idWZmZXIoYmgpOworCXRtcCA9IGJoLT5iX3RoaXNfcGFnZTsKKwl3aGlsZSAodG1wICE9IGJoKSB7CisJCWlmIChidWZmZXJfYXN5bmNfd3JpdGUodG1wKSkgeworCQkJQlVHX09OKCFidWZmZXJfbG9ja2VkKHRtcCkpOworCQkJZ290byBzdGlsbF9idXN5OworCQl9CisJCXRtcCA9IHRtcC0+Yl90aGlzX3BhZ2U7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhZ2VfdXB0b2RhdGVfbG9jaywgZmxhZ3MpOworCWVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwlyZXR1cm47CisKK3N0aWxsX2J1c3k6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGFnZV91cHRvZGF0ZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuOworfQorCisvKgorICogSWYgYSBwYWdlJ3MgYnVmZmVycyBhcmUgdW5kZXIgYXN5bmMgcmVhZGluIChlbmRfYnVmZmVyX2FzeW5jX3JlYWQKKyAqIGNvbXBsZXRpb24pIHRoZW4gdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IGFub3RoZXIgdGhyZWFkIG9mCisgKiBjb250cm9sIGNvdWxkIGxvY2sgb25lIG9mIHRoZSBidWZmZXJzIGFmdGVyIGl0IGhhcyBjb21wbGV0ZWQKKyAqIGJ1dCB3aGlsZSBzb21lIG9mIHRoZSBvdGhlciBidWZmZXJzIGhhdmUgbm90IGNvbXBsZXRlZC4gIFRoaXMKKyAqIGxvY2tlZCBidWZmZXIgd291bGQgY29uZnVzZSBlbmRfYnVmZmVyX2FzeW5jX3JlYWQoKSBpbnRvIG5vdCB1bmxvY2tpbmcKKyAqIHRoZSBwYWdlLiAgU28gdGhlIGFic2VuY2Ugb2YgQkhfQXN5bmNfUmVhZCB0ZWxscyBlbmRfYnVmZmVyX2FzeW5jX3JlYWQoKQorICogdGhhdCB0aGlzIGJ1ZmZlciBpcyBub3QgdW5kZXIgYXN5bmMgSS9PLgorICoKKyAqIFRoZSBwYWdlIGNvbWVzIHVubG9ja2VkIHdoZW4gaXQgaGFzIG5vIGxvY2tlZCBidWZmZXJfYXN5bmMgYnVmZmVycworICogbGVmdC4KKyAqCisgKiBQYWdlTG9ja2VkIHByZXZlbnRzIGFueW9uZSBzdGFydGluZyBuZXcgYXN5bmMgSS9PIHJlYWRzIGFueSBvZgorICogdGhlIGJ1ZmZlcnMuCisgKgorICogUGFnZVdyaXRlYmFjayBpcyB1c2VkIHRvIHByZXZlbnQgc2ltdWx0YW5lb3VzIHdyaXRlb3V0IG9mIHRoZSBzYW1lCisgKiBwYWdlLgorICoKKyAqIFBhZ2VMb2NrZWQgcHJldmVudHMgYW55b25lIGZyb20gc3RhcnRpbmcgd3JpdGViYWNrIG9mIGEgcGFnZSB3aGljaCBpcworICogdW5kZXIgcmVhZCBJL08gKFBhZ2VXcml0ZWJhY2sgaXMgb25seSBldmVyIHNldCBhZ2FpbnN0IGEgbG9ja2VkIHBhZ2UpLgorICovCitzdGF0aWMgdm9pZCBtYXJrX2J1ZmZlcl9hc3luY19yZWFkKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJYmgtPmJfZW5kX2lvID0gZW5kX2J1ZmZlcl9hc3luY19yZWFkOworCXNldF9idWZmZXJfYXN5bmNfcmVhZChiaCk7Cit9CisKK3ZvaWQgbWFya19idWZmZXJfYXN5bmNfd3JpdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwliaC0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX2FzeW5jX3dyaXRlOworCXNldF9idWZmZXJfYXN5bmNfd3JpdGUoYmgpOworfQorRVhQT1JUX1NZTUJPTChtYXJrX2J1ZmZlcl9hc3luY193cml0ZSk7CisKKworLyoKKyAqIGZzL2J1ZmZlci5jIGNvbnRhaW5zIGhlbHBlciBmdW5jdGlvbnMgZm9yIGJ1ZmZlci1iYWNrZWQgYWRkcmVzcyBzcGFjZSdzCisgKiBmc3luYyBmdW5jdGlvbnMuICBBIGNvbW1vbiByZXF1aXJlbWVudCBmb3IgYnVmZmVyLWJhc2VkIGZpbGVzeXN0ZW1zIGlzCisgKiB0aGF0IGNlcnRhaW4gZGF0YSBmcm9tIHRoZSBiYWNraW5nIGJsb2NrZGV2IG5lZWRzIHRvIGJlIHdyaXR0ZW4gb3V0IGZvcgorICogYSBzdWNjZXNzZnVsIGZzeW5jKCkuICBGb3IgZXhhbXBsZSwgZXh0MiBpbmRpcmVjdCBibG9ja3MgbmVlZCB0byBiZQorICogd3JpdHRlbiBiYWNrIGFuZCB3YWl0ZWQgdXBvbiBiZWZvcmUgZnN5bmMoKSByZXR1cm5zLgorICoKKyAqIFRoZSBmdW5jdGlvbnMgbWFya19idWZmZXJfaW5vZGVfZGlydHkoKSwgZnN5bmNfaW5vZGVfYnVmZmVycygpLAorICogaW5vZGVfaGFzX2J1ZmZlcnMoKSBhbmQgaW52YWxpZGF0ZV9pbm9kZV9idWZmZXJzKCkgYXJlIHByb3ZpZGVkIGZvciB0aGUKKyAqIG1hbmFnZW1lbnQgb2YgYSBsaXN0IG9mIGRlcGVuZGVudCBidWZmZXJzIGF0IC0+aV9tYXBwaW5nLT5wcml2YXRlX2xpc3QuCisgKgorICogTG9ja2luZyBpcyBhIGxpdHRsZSBzdWJ0bGU6IHRyeV90b19mcmVlX2J1ZmZlcnMoKSB3aWxsIHJlbW92ZSBidWZmZXJzCisgKiBmcm9tIHRoZWlyIGNvbnRyb2xsaW5nIGlub2RlJ3MgcXVldWUgd2hlbiB0aGV5IGFyZSBiZWluZyBmcmVlZC4gIEJ1dAorICogdHJ5X3RvX2ZyZWVfYnVmZmVycygpIHdpbGwgYmUgb3BlcmF0aW5nIGFnYWluc3QgdGhlICpibG9ja2RldiogbWFwcGluZworICogYXQgdGhlIHRpbWUsIG5vdCBhZ2FpbnN0IHRoZSBTX0lTUkVHIGZpbGUgd2hpY2ggZGVwZW5kcyBvbiB0aG9zZSBidWZmZXJzLgorICogU28gdGhlIGxvY2tpbmcgZm9yIHByaXZhdGVfbGlzdCBpcyB2aWEgdGhlIHByaXZhdGVfbG9jayBpbiB0aGUgYWRkcmVzc19zcGFjZQorICogd2hpY2ggYmFja3MgdGhlIGJ1ZmZlcnMuICBXaGljaCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYWRkcmVzc19zcGFjZSAKKyAqIGFnYWluc3Qgd2hpY2ggdGhlIGJ1ZmZlcnMgYXJlIGxpc3RlZC4gIFNvIGZvciBhIHBhcnRpY3VsYXIgYWRkcmVzc19zcGFjZSwKKyAqIG1hcHBpbmctPnByaXZhdGVfbG9jayBkb2VzICpub3QqIHByb3RlY3QgbWFwcGluZy0+cHJpdmF0ZV9saXN0ISAgSW4gZmFjdCwKKyAqIG1hcHBpbmctPnByaXZhdGVfbGlzdCB3aWxsIGFsd2F5cyBiZSBwcm90ZWN0ZWQgYnkgdGhlIGJhY2tpbmcgYmxvY2tkZXYncworICogLT5wcml2YXRlX2xvY2suCisgKgorICogV2hpY2ggaW50cm9kdWNlcyBhIHJlcXVpcmVtZW50OiBhbGwgYnVmZmVycyBvbiBhbiBhZGRyZXNzX3NwYWNlJ3MKKyAqIC0+cHJpdmF0ZV9saXN0IG11c3QgYmUgZnJvbSB0aGUgc2FtZSBhZGRyZXNzX3NwYWNlOiB0aGUgYmxvY2tkZXYncy4KKyAqCisgKiBhZGRyZXNzX3NwYWNlcyB3aGljaCBkbyBub3QgcGxhY2UgYnVmZmVycyBhdCAtPnByaXZhdGVfbGlzdCB2aWEgdGhlc2UKKyAqIHV0aWxpdHkgZnVuY3Rpb25zIGFyZSBmcmVlIHRvIHVzZSBwcml2YXRlX2xvY2sgYW5kIHByaXZhdGVfbGlzdCBmb3IKKyAqIHdoYXRldmVyIHRoZXkgd2FudC4gIFRoZSBvbmx5IHJlcXVpcmVtZW50IGlzIHRoYXQgbGlzdF9lbXB0eShwcml2YXRlX2xpc3QpCisgKiBiZSB0cnVlIGF0IGNsZWFyX2lub2RlKCkgdGltZS4KKyAqCisgKiBGSVhNRTogY2xlYXJfaW5vZGUgc2hvdWxkIG5vdCBjYWxsIGludmFsaWRhdGVfaW5vZGVfYnVmZmVycygpLiAgVGhlCisgKiBmaWxlc3lzdGVtcyBzaG91bGQgZG8gdGhhdC4gIGludmFsaWRhdGVfaW5vZGVfYnVmZmVycygpIHNob3VsZCBqdXN0IGdvCisgKiBCVUdfT04oIWxpc3RfZW1wdHkpLgorICoKKyAqIEZJWE1FOiBtYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZSgpIGlzIGEgZGF0YS1wbGFuZSBvcGVyYXRpb24uICBJdCBzaG91bGQKKyAqIHRha2UgYW4gYWRkcmVzc19zcGFjZSwgbm90IGFuIGlub2RlLiAgQW5kIGl0IHNob3VsZCBiZSBjYWxsZWQKKyAqIG1hcmtfYnVmZmVyX2RpcnR5X2ZzeW5jKCkgdG8gY2xlYXJseSBkZWZpbmUgd2h5IHRob3NlIGJ1ZmZlcnMgYXJlIGJlaW5nCisgKiBxdWV1ZWQgdXAuCisgKgorICogRklYTUU6IG1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKCkgZG9lc24ndCBuZWVkIHRvIGFkZCB0aGUgYnVmZmVyIHRvIHRoZQorICogbGlzdCBpZiBpdCBpcyBhbHJlYWR5IG9uIGEgbGlzdC4gIEJlY2F1c2UgaWYgdGhlIGJ1ZmZlciBpcyBvbiBhIGxpc3QsCisgKiBpdCAqbXVzdCogYWxyZWFkeSBiZSBvbiB0aGUgcmlnaHQgb25lLiAgSWYgbm90LCB0aGUgZmlsZXN5c3RlbSBpcyBiZWluZworICogc2lsbHkuICBUaGlzIHdpbGwgc2F2ZSBhIHRvbiBvZiBsb2NraW5nLiAgQnV0IGZpcnN0IHdlIGhhdmUgdG8gZW5zdXJlCisgKiB0aGF0IGJ1ZmZlcnMgYXJlIHRha2VuICpvZmYqIHRoZSBvbGQgaW5vZGUncyBsaXN0IHdoZW4gdGhleSBhcmUgZnJlZWQKKyAqIChwcmVzdW1hYmx5IGluIHRydW5jYXRlKS4gIFRoYXQgcmVxdWlyZXMgY2FyZWZ1bCBhdWRpdGluZyBvZiBhbGwKKyAqIGZpbGVzeXN0ZW1zIChkbyBpdCBpbnNpZGUgYmZvcmdldCgpKS4gIEl0IGNvdWxkIGFsc28gYmUgZG9uZSBieSBicmluZ2luZworICogYl9pbm9kZSBiYWNrLgorICovCisKKy8qCisgKiBUaGUgYnVmZmVyJ3MgYmFja2luZyBhZGRyZXNzX3NwYWNlJ3MgcHJpdmF0ZV9sb2NrIG11c3QgYmUgaGVsZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19yZW1vdmVfYXNzb2NfcXVldWUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlsaXN0X2RlbF9pbml0KCZiaC0+Yl9hc3NvY19idWZmZXJzKTsKK30KKworaW50IGlub2RlX2hhc19idWZmZXJzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuICFsaXN0X2VtcHR5KCZpbm9kZS0+aV9kYXRhLnByaXZhdGVfbGlzdCk7Cit9CisKKy8qCisgKiBvc3luYyBpcyBkZXNpZ25lZCB0byBzdXBwb3J0IE9fU1lOQyBpby4gIEl0IHdhaXRzIHN5bmNocm9ub3VzbHkgZm9yCisgKiBhbGwgYWxyZWFkeS1zdWJtaXR0ZWQgSU8gdG8gY29tcGxldGUsIGJ1dCBkb2VzIG5vdCBxdWV1ZSBhbnkgbmV3CisgKiB3cml0ZXMgdG8gdGhlIGRpc2suCisgKgorICogVG8gZG8gT19TWU5DIHdyaXRlcywganVzdCBxdWV1ZSB0aGUgYnVmZmVyIHdyaXRlcyB3aXRoIGxsX3J3X2Jsb2NrIGFzCisgKiB5b3UgZGlydHkgdGhlIGJ1ZmZlcnMsIGFuZCB0aGVuIHVzZSBvc3luY19pbm9kZV9idWZmZXJzIHRvIHdhaXQgZm9yCisgKiBjb21wbGV0aW9uLiAgQW55IG90aGVyIGRpcnR5IGJ1ZmZlcnMgd2hpY2ggYXJlIG5vdCB5ZXQgcXVldWVkIGZvcgorICogd3JpdGUgd2lsbCBub3QgYmUgZmx1c2hlZCB0byBkaXNrIGJ5IHRoZSBvc3luYy4KKyAqLworc3RhdGljIGludCBvc3luY19idWZmZXJzX2xpc3Qoc3BpbmxvY2tfdCAqbG9jaywgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJaW50IGVyciA9IDA7CisKKwlzcGluX2xvY2sobG9jayk7CityZXBlYXQ6CisJbGlzdF9mb3JfZWFjaF9wcmV2KHAsIGxpc3QpIHsKKwkJYmggPSBCSF9FTlRSWShwKTsKKwkJaWYgKGJ1ZmZlcl9sb2NrZWQoYmgpKSB7CisJCQlnZXRfYmgoYmgpOworCQkJc3Bpbl91bmxvY2sobG9jayk7CisJCQl3YWl0X29uX2J1ZmZlcihiaCk7CisJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQkJZXJyID0gLUVJTzsKKwkJCWJyZWxzZShiaCk7CisJCQlzcGluX2xvY2sobG9jayk7CisJCQlnb3RvIHJlcGVhdDsKKwkJfQorCX0KKwlzcGluX3VubG9jayhsb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHN5bmNfbWFwcGluZ19idWZmZXJzIC0gd3JpdGUgb3V0IGFuZCB3YWl0IHVwb24gYSBtYXBwaW5nJ3MgImFzc29jaWF0ZWQiCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnMKKyAqIEBidWZmZXJfbWFwcGluZyAtIHRoZSBtYXBwaW5nIHdoaWNoIGJhY2tzIHRoZSBidWZmZXJzJyBkYXRhCisgKiBAbWFwcGluZyAtIHRoZSBtYXBwaW5nIHdoaWNoIHdhbnRzIHRob3NlIGJ1ZmZlcnMgd3JpdHRlbgorICoKKyAqIFN0YXJ0cyBJL08gYWdhaW5zdCB0aGUgYnVmZmVycyBhdCBtYXBwaW5nLT5wcml2YXRlX2xpc3QsIGFuZCB3YWl0cyB1cG9uCisgKiB0aGF0IEkvTy4KKyAqCisgKiBCYXNpY2FsbHksIHRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgZnN5bmMoKS4gIEBidWZmZXJfbWFwcGluZyBpcworICogdGhlIGJsb2NrZGV2IHdoaWNoICJvd25zIiB0aGUgYnVmZmVycyBhbmQgQG1hcHBpbmcgaXMgYSBmaWxlIG9yIGRpcmVjdG9yeQorICogd2hpY2ggbmVlZHMgdGhvc2UgYnVmZmVycyB0byBiZSB3cml0dGVuIGZvciBhIHN1Y2Nlc3NmdWwgZnN5bmMoKS4KKyAqLworaW50IHN5bmNfbWFwcGluZ19idWZmZXJzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICpidWZmZXJfbWFwcGluZyA9IG1hcHBpbmctPmFzc29jX21hcHBpbmc7CisKKwlpZiAoYnVmZmVyX21hcHBpbmcgPT0gTlVMTCB8fCBsaXN0X2VtcHR5KCZtYXBwaW5nLT5wcml2YXRlX2xpc3QpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBmc3luY19idWZmZXJzX2xpc3QoJmJ1ZmZlcl9tYXBwaW5nLT5wcml2YXRlX2xvY2ssCisJCQkJCSZtYXBwaW5nLT5wcml2YXRlX2xpc3QpOworfQorRVhQT1JUX1NZTUJPTChzeW5jX21hcHBpbmdfYnVmZmVycyk7CisKKy8qCisgKiBDYWxsZWQgd2hlbiB3ZSd2ZSByZWNlbnRseSB3cml0dGVuIGJsb2NrIGBiYmxvY2snLCBhbmQgaXQgaXMga25vd24gdGhhdAorICogYGJibG9jaycgd2FzIGZvciBhIGJ1ZmZlcl9ib3VuZGFyeSgpIGJ1ZmZlci4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgYmxvY2sgYXQKKyAqIGBiYmxvY2sgKyAxJyBpcyBwcm9iYWJseSBhIGRpcnR5IGluZGlyZWN0IGJsb2NrLiAgSHVudCBpdCBkb3duIGFuZCwgaWYgaXQncworICogZGlydHksIHNjaGVkdWxlIGl0IGZvciBJTy4gIFNvIHRoYXQgaW5kaXJlY3RzIG1lcmdlIG5pY2VseSB3aXRoIHRoZWlyIGRhdGEuCisgKi8KK3ZvaWQgd3JpdGVfYm91bmRhcnlfYmxvY2soc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJCXNlY3Rvcl90IGJibG9jaywgdW5zaWduZWQgYmxvY2tzaXplKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBfX2ZpbmRfZ2V0X2Jsb2NrKGJkZXYsIGJibG9jayArIDEsIGJsb2Nrc2l6ZSk7CisJaWYgKGJoKSB7CisJCWlmIChidWZmZXJfZGlydHkoYmgpKQorCQkJbGxfcndfYmxvY2soV1JJVEUsIDEsICZiaCk7CisJCXB1dF9iaChiaCk7CisJfQorfQorCit2b2lkIG1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICpidWZmZXJfbWFwcGluZyA9IGJoLT5iX3BhZ2UtPm1hcHBpbmc7CisKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKCFtYXBwaW5nLT5hc3NvY19tYXBwaW5nKSB7CisJCW1hcHBpbmctPmFzc29jX21hcHBpbmcgPSBidWZmZXJfbWFwcGluZzsKKwl9IGVsc2UgeworCQlpZiAobWFwcGluZy0+YXNzb2NfbWFwcGluZyAhPSBidWZmZXJfbWFwcGluZykKKwkJCUJVRygpOworCX0KKwlpZiAobGlzdF9lbXB0eSgmYmgtPmJfYXNzb2NfYnVmZmVycykpIHsKKwkJc3Bpbl9sb2NrKCZidWZmZXJfbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKKwkJbGlzdF9tb3ZlX3RhaWwoJmJoLT5iX2Fzc29jX2J1ZmZlcnMsCisJCQkJJm1hcHBpbmctPnByaXZhdGVfbGlzdCk7CisJCXNwaW5fdW5sb2NrKCZidWZmZXJfbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKG1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKTsKKworLyoKKyAqIEFkZCBhIHBhZ2UgdG8gdGhlIGRpcnR5IHBhZ2UgbGlzdC4KKyAqCisgKiBJdCBpcyBhIHNhZCBmYWN0IG9mIGxpZmUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHNldmVyYWwgcGxhY2VzCisgKiBkZWVwbHkgdW5kZXIgc3BpbmxvY2tpbmcuICBJdCBtYXkgbm90IHNsZWVwLgorICoKKyAqIElmIHRoZSBwYWdlIGhhcyBidWZmZXJzLCB0aGUgdXB0b2RhdGUgYnVmZmVycyBhcmUgc2V0IGRpcnR5LCB0byBwcmVzZXJ2ZQorICogZGlydHktc3RhdGUgY29oZXJlbmN5IGJldHdlZW4gdGhlIHBhZ2UgYW5kIHRoZSBidWZmZXJzLiAgSXQgdGhlIHBhZ2UgZG9lcworICogbm90IGhhdmUgYnVmZmVycyB0aGVuIHdoZW4gdGhleSBhcmUgbGF0ZXIgYXR0YWNoZWQgdGhleSB3aWxsIGFsbCBiZSBzZXQKKyAqIGRpcnR5LgorICoKKyAqIFRoZSBidWZmZXJzIGFyZSBkaXJ0aWVkIGJlZm9yZSB0aGUgcGFnZSBpcyBkaXJ0aWVkLiAgVGhlcmUncyBhIHNtYWxsIHJhY2UKKyAqIHdpbmRvdyBpbiB3aGljaCBhIHdyaXRlcGFnZSBjYWxsZXIgbWF5IHNlZSB0aGUgcGFnZSBjbGVhbm5lc3MgYnV0IG5vdCB0aGUKKyAqIGJ1ZmZlciBkaXJ0aW5lc3MuICBUaGF0J3MgZmluZS4gIElmIHRoaXMgY29kZSB3ZXJlIHRvIHNldCB0aGUgcGFnZSBkaXJ0eQorICogYmVmb3JlIHRoZSBidWZmZXJzLCBhIGNvbmN1cnJlbnQgd3JpdGVwYWdlIGNhbGxlciBjb3VsZCBjbGVhciB0aGUgcGFnZSBkaXJ0eQorICogYml0LCBzZWUgYSBidW5jaCBvZiBjbGVhbiBidWZmZXJzIGFuZCB3ZSdkIGVuZCB1cCB3aXRoIGRpcnR5IGJ1ZmZlcnMvY2xlYW4KKyAqIHBhZ2Ugb24gdGhlIGRpcnR5IHBhZ2UgbGlzdC4KKyAqCisgKiBXZSB1c2UgcHJpdmF0ZV9sb2NrIHRvIGxvY2sgYWdhaW5zdCB0cnlfdG9fZnJlZV9idWZmZXJzIHdoaWxlIHVzaW5nIHRoZQorICogcGFnZSdzIGJ1ZmZlciBsaXN0LiAgQWxzbyB1c2UgdGhpcyB0byBwcm90ZWN0IGFnYWluc3QgY2xlYW4gYnVmZmVycyBiZWluZworICogYWRkZWQgdG8gdGhlIHBhZ2UgYWZ0ZXIgaXQgd2FzIHNldCBkaXJ0eS4KKyAqCisgKiBGSVhNRTogbWF5IG5lZWQgdG8gY2FsbCAtPnJlc2VydmVwYWdlIGhlcmUgYXMgd2VsbC4gIFRoYXQncyByYXRoZXIgdXAgdG8gdGhlCisgKiBhZGRyZXNzX3NwYWNlIHRob3VnaC4KKyAqLworaW50IF9fc2V0X3BhZ2VfZGlydHlfYnVmZmVycyhzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqIGNvbnN0IG1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOworCisJc3Bpbl9sb2NrKCZtYXBwaW5nLT5wcml2YXRlX2xvY2spOworCWlmIChwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGhlYWQ7CisKKwkJZG8geworCQkJc2V0X2J1ZmZlcl9kaXJ0eShiaCk7CisJCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJfSB3aGlsZSAoYmggIT0gaGVhZCk7CisJfQorCXNwaW5fdW5sb2NrKCZtYXBwaW5nLT5wcml2YXRlX2xvY2spOworCisJaWYgKCFUZXN0U2V0UGFnZURpcnR5KHBhZ2UpKSB7CisJCXdyaXRlX2xvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOworCQlpZiAocGFnZS0+bWFwcGluZykgewkvKiBSYWNlIHdpdGggdHJ1bmNhdGU/ICovCisJCQlpZiAobWFwcGluZ19jYXBfYWNjb3VudF9kaXJ0eShtYXBwaW5nKSkKKwkJCQlpbmNfcGFnZV9zdGF0ZShucl9kaXJ0eSk7CisJCQlyYWRpeF90cmVlX3RhZ19zZXQoJm1hcHBpbmctPnBhZ2VfdHJlZSwKKwkJCQkJCXBhZ2VfaW5kZXgocGFnZSksCisJCQkJCQlQQUdFQ0FDSEVfVEFHX0RJUlRZKTsKKwkJfQorCQl3cml0ZV91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOworCQlfX21hcmtfaW5vZGVfZGlydHkobWFwcGluZy0+aG9zdCwgSV9ESVJUWV9QQUdFUyk7CisJfQorCQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnMpOworCisvKgorICogV3JpdGUgb3V0IGFuZCB3YWl0IHVwb24gYSBsaXN0IG9mIGJ1ZmZlcnMuCisgKgorICogV2UgaGF2ZSBjb25mbGljdGluZyBwcmVzc3VyZXM6IHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsCisgKiBpbml0aWFsbHkgZGlydHkgYnVmZmVycyBnZXQgd2FpdGVkIG9uLCBidXQgdGhhdCBhbnkgc3Vic2VxdWVudGx5CisgKiBkaXJ0aWVkIGJ1ZmZlcnMgZG9uJ3QuICBBZnRlciBhbGwsIHdlIGRvbid0IHdhbnQgZnN5bmMgdG8gbGFzdAorICogZm9yZXZlciBpZiBzb21lYm9keSBpcyBhY3RpdmVseSB3cml0aW5nIHRvIHRoZSBmaWxlLgorICoKKyAqIERvIHRoaXMgaW4gdHdvIG1haW4gc3RhZ2VzOiBmaXJzdCB3ZSBjb3B5IGRpcnR5IGJ1ZmZlcnMgdG8gYQorICogdGVtcG9yYXJ5IGlub2RlIGxpc3QsIHF1ZXVlaW5nIHRoZSB3cml0ZXMgYXMgd2UgZ28uICBUaGVuIHdlIGNsZWFuCisgKiB1cCwgd2FpdGluZyBmb3IgdGhvc2Ugd3JpdGVzIHRvIGNvbXBsZXRlLgorICogCisgKiBEdXJpbmcgdGhpcyBzZWNvbmQgc3RhZ2UsIGFueSBzdWJzZXF1ZW50IHVwZGF0ZXMgdG8gdGhlIGZpbGUgbWF5IGVuZAorICogdXAgcmVmaWxpbmcgdGhlIGJ1ZmZlciBvbiB0aGUgb3JpZ2luYWwgaW5vZGUncyBkaXJ0eSBsaXN0IGFnYWluLCBzbworICogdGhlcmUgaXMgYSBjaGFuY2Ugd2Ugd2lsbCBlbmQgdXAgd2l0aCBhIGJ1ZmZlciBxdWV1ZWQgZm9yIHdyaXRlIGJ1dAorICogbm90IHlldCBjb21wbGV0ZWQgb24gdGhhdCBsaXN0LiAgU28sIGFzIGEgZmluYWwgY2xlYW51cCB3ZSBnbyB0aHJvdWdoCisgKiB0aGUgb3N5bmMgY29kZSB0byBjYXRjaCB0aGVzZSBsb2NrZWQsIGRpcnR5IGJ1ZmZlcnMgd2l0aG91dCByZXF1ZXVpbmcKKyAqIGFueSBuZXdseSBkaXJ0eSBidWZmZXJzIGZvciB3cml0ZS4KKyAqLworc3RhdGljIGludCBmc3luY19idWZmZXJzX2xpc3Qoc3BpbmxvY2tfdCAqbG9jaywgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBsaXN0X2hlYWQgdG1wOworCWludCBlcnIgPSAwLCBlcnIyOworCisJSU5JVF9MSVNUX0hFQUQoJnRtcCk7CisKKwlzcGluX2xvY2sobG9jayk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KGxpc3QpKSB7CisJCWJoID0gQkhfRU5UUlkobGlzdC0+bmV4dCk7CisJCWxpc3RfZGVsX2luaXQoJmJoLT5iX2Fzc29jX2J1ZmZlcnMpOworCQlpZiAoYnVmZmVyX2RpcnR5KGJoKSB8fCBidWZmZXJfbG9ja2VkKGJoKSkgeworCQkJbGlzdF9hZGQoJmJoLT5iX2Fzc29jX2J1ZmZlcnMsICZ0bXApOworCQkJaWYgKGJ1ZmZlcl9kaXJ0eShiaCkpIHsKKwkJCQlnZXRfYmgoYmgpOworCQkJCXNwaW5fdW5sb2NrKGxvY2spOworCQkJCS8qCisJCQkJICogRW5zdXJlIGFueSBwZW5kaW5nIEkvTyBjb21wbGV0ZXMgc28gdGhhdAorCQkJCSAqIGxsX3J3X2Jsb2NrKCkgYWN0dWFsbHkgd3JpdGVzIHRoZSBjdXJyZW50CisJCQkJICogY29udGVudHMgLSBpdCBpcyBhIG5vb3AgaWYgSS9PIGlzIHN0aWxsIGluCisJCQkJICogZmxpZ2h0IG9uIHBvdGVudGlhbGx5IG9sZGVyIGNvbnRlbnRzLgorCQkJCSAqLworCQkJCXdhaXRfb25fYnVmZmVyKGJoKTsKKwkJCQlsbF9yd19ibG9jayhXUklURSwgMSwgJmJoKTsKKwkJCQlicmVsc2UoYmgpOworCQkJCXNwaW5fbG9jayhsb2NrKTsKKwkJCX0KKwkJfQorCX0KKworCXdoaWxlICghbGlzdF9lbXB0eSgmdG1wKSkgeworCQliaCA9IEJIX0VOVFJZKHRtcC5wcmV2KTsKKwkJX19yZW1vdmVfYXNzb2NfcXVldWUoYmgpOworCQlnZXRfYmgoYmgpOworCQlzcGluX3VubG9jayhsb2NrKTsKKwkJd2FpdF9vbl9idWZmZXIoYmgpOworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQllcnIgPSAtRUlPOworCQlicmVsc2UoYmgpOworCQlzcGluX2xvY2sobG9jayk7CisJfQorCQorCXNwaW5fdW5sb2NrKGxvY2spOworCWVycjIgPSBvc3luY19idWZmZXJzX2xpc3QobG9jaywgbGlzdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwllbHNlCisJCXJldHVybiBlcnIyOworfQorCisvKgorICogSW52YWxpZGF0ZSBhbnkgYW5kIGFsbCBkaXJ0eSBidWZmZXJzIG9uIGEgZ2l2ZW4gaW5vZGUuICBXZSBhcmUKKyAqIHByb2JhYmx5IHVubW91bnRpbmcgdGhlIGZzLCBidXQgdGhhdCBkb2Vzbid0IG1lYW4gd2UgaGF2ZSBhbHJlYWR5CisgKiBkb25lIGEgc3luYygpLiAgSnVzdCBkcm9wIHRoZSBidWZmZXJzIGZyb20gdGhlIGlub2RlIGxpc3QuCisgKgorICogTk9URTogd2UgdGFrZSB0aGUgaW5vZGUncyBibG9ja2RldidzIG1hcHBpbmcncyBwcml2YXRlX2xvY2suICBXaGljaAorICogYXNzdW1lcyB0aGF0IGFsbCB0aGUgYnVmZmVycyBhcmUgYWdhaW5zdCB0aGUgYmxvY2tkZXYuICBOb3QgdHJ1ZQorICogZm9yIHJlaXNlcmZzLgorICovCit2b2lkIGludmFsaWRhdGVfaW5vZGVfYnVmZmVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmIChpbm9kZV9oYXNfYnVmZmVycyhpbm9kZSkpIHsKKwkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSAmaW5vZGUtPmlfZGF0YTsKKwkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCA9ICZtYXBwaW5nLT5wcml2YXRlX2xpc3Q7CisJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICpidWZmZXJfbWFwcGluZyA9IG1hcHBpbmctPmFzc29jX21hcHBpbmc7CisKKwkJc3Bpbl9sb2NrKCZidWZmZXJfbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKKwkJd2hpbGUgKCFsaXN0X2VtcHR5KGxpc3QpKQorCQkJX19yZW1vdmVfYXNzb2NfcXVldWUoQkhfRU5UUlkobGlzdC0+bmV4dCkpOworCQlzcGluX3VubG9jaygmYnVmZmVyX21hcHBpbmctPnByaXZhdGVfbG9jayk7CisJfQorfQorCisvKgorICogUmVtb3ZlIGFueSBjbGVhbiBidWZmZXJzIGZyb20gdGhlIGlub2RlJ3MgYnVmZmVyIGxpc3QuICBUaGlzIGlzIGNhbGxlZAorICogd2hlbiB3ZSdyZSB0cnlpbmcgdG8gZnJlZSB0aGUgaW5vZGUgaXRzZWxmLiAgVGhvc2UgYnVmZmVycyBjYW4gcGluIGl0LgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgYnVmZmVycyB3ZXJlIHJlbW92ZWQuCisgKi8KK2ludCByZW1vdmVfaW5vZGVfYnVmZmVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWludCByZXQgPSAxOworCisJaWYgKGlub2RlX2hhc19idWZmZXJzKGlub2RlKSkgeworCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9ICZpbm9kZS0+aV9kYXRhOworCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0ID0gJm1hcHBpbmctPnByaXZhdGVfbGlzdDsKKwkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmJ1ZmZlcl9tYXBwaW5nID0gbWFwcGluZy0+YXNzb2NfbWFwcGluZzsKKworCQlzcGluX2xvY2soJmJ1ZmZlcl9tYXBwaW5nLT5wcml2YXRlX2xvY2spOworCQl3aGlsZSAoIWxpc3RfZW1wdHkobGlzdCkpIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBCSF9FTlRSWShsaXN0LT5uZXh0KTsKKwkJCWlmIChidWZmZXJfZGlydHkoYmgpKSB7CisJCQkJcmV0ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCV9fcmVtb3ZlX2Fzc29jX3F1ZXVlKGJoKTsKKwkJfQorCQlzcGluX3VubG9jaygmYnVmZmVyX21hcHBpbmctPnByaXZhdGVfbG9jayk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDcmVhdGUgdGhlIGFwcHJvcHJpYXRlIGJ1ZmZlcnMgd2hlbiBnaXZlbiBhIHBhZ2UgZm9yIGRhdGEgYXJlYSBhbmQKKyAqIHRoZSBzaXplIG9mIGVhY2ggYnVmZmVyLi4gVXNlIHRoZSBiaC0+Yl90aGlzX3BhZ2UgbGlua2VkIGxpc3QgdG8KKyAqIGZvbGxvdyB0aGUgYnVmZmVycyBjcmVhdGVkLiAgUmV0dXJuIE5VTEwgaWYgdW5hYmxlIHRvIGNyZWF0ZSBtb3JlCisgKiBidWZmZXJzLgorICoKKyAqIFRoZSByZXRyeSBmbGFnIGlzIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBhc3luYyBJTyAocGFnaW5nLCBzd2FwcGluZykKKyAqIHdoaWNoIG1heSBub3QgZmFpbCBmcm9tIG9yZGluYXJ5IGJ1ZmZlciBhbGxvY2F0aW9ucy4KKyAqLworc3RydWN0IGJ1ZmZlcl9oZWFkICphbGxvY19wYWdlX2J1ZmZlcnMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJaW50IHJldHJ5KQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkOworCWxvbmcgb2Zmc2V0OworCit0cnlfYWdhaW46CisJaGVhZCA9IE5VTEw7CisJb2Zmc2V0ID0gUEFHRV9TSVpFOworCXdoaWxlICgob2Zmc2V0IC09IHNpemUpID49IDApIHsKKwkJYmggPSBhbGxvY19idWZmZXJfaGVhZChHRlBfTk9GUyk7CisJCWlmICghYmgpCisJCQlnb3RvIG5vX2dyb3c7CisKKwkJYmgtPmJfYmRldiA9IE5VTEw7CisJCWJoLT5iX3RoaXNfcGFnZSA9IGhlYWQ7CisJCWJoLT5iX2Jsb2NrbnIgPSAtMTsKKwkJaGVhZCA9IGJoOworCisJCWJoLT5iX3N0YXRlID0gMDsKKwkJYXRvbWljX3NldCgmYmgtPmJfY291bnQsIDApOworCQliaC0+Yl9zaXplID0gc2l6ZTsKKworCQkvKiBMaW5rIHRoZSBidWZmZXIgdG8gaXRzIHBhZ2UgKi8KKwkJc2V0X2JoX3BhZ2UoYmgsIHBhZ2UsIG9mZnNldCk7CisKKwkJYmgtPmJfZW5kX2lvID0gTlVMTDsKKwl9CisJcmV0dXJuIGhlYWQ7CisvKgorICogSW4gY2FzZSBhbnl0aGluZyBmYWlsZWQsIHdlIGp1c3QgZnJlZSBldmVyeXRoaW5nIHdlIGdvdC4KKyAqLworbm9fZ3JvdzoKKwlpZiAoaGVhZCkgeworCQlkbyB7CisJCQliaCA9IGhlYWQ7CisJCQloZWFkID0gaGVhZC0+Yl90aGlzX3BhZ2U7CisJCQlmcmVlX2J1ZmZlcl9oZWFkKGJoKTsKKwkJfSB3aGlsZSAoaGVhZCk7CisJfQorCisJLyoKKwkgKiBSZXR1cm4gZmFpbHVyZSBmb3Igbm9uLWFzeW5jIElPIHJlcXVlc3RzLiAgQXN5bmMgSU8gcmVxdWVzdHMKKwkgKiBhcmUgbm90IGFsbG93ZWQgdG8gZmFpbCwgc28gd2UgaGF2ZSB0byB3YWl0IHVudGlsIGJ1ZmZlciBoZWFkcworCSAqIGJlY29tZSBhdmFpbGFibGUuICBCdXQgd2UgZG9uJ3Qgd2FudCB0YXNrcyBzbGVlcGluZyB3aXRoIAorCSAqIHBhcnRpYWxseSBjb21wbGV0ZSBidWZmZXJzLCBzbyBhbGwgd2VyZSByZWxlYXNlZCBhYm92ZS4KKwkgKi8KKwlpZiAoIXJldHJ5KQorCQlyZXR1cm4gTlVMTDsKKworCS8qIFdlJ3JlIF9yZWFsbHlfIGxvdyBvbiBtZW1vcnkuIE5vdyB3ZSBqdXN0CisJICogd2FpdCBmb3Igb2xkIGJ1ZmZlciBoZWFkcyB0byBiZWNvbWUgZnJlZSBkdWUgdG8KKwkgKiBmaW5pc2hpbmcgSU8uICBTaW5jZSB0aGlzIGlzIGFuIGFzeW5jIHJlcXVlc3QgYW5kCisJICogdGhlIHJlc2VydmUgbGlzdCBpcyBlbXB0eSwgd2UncmUgc3VyZSB0aGVyZSBhcmUgCisJICogYXN5bmMgYnVmZmVyIGhlYWRzIGluIHVzZS4KKwkgKi8KKwlmcmVlX21vcmVfbWVtb3J5KCk7CisJZ290byB0cnlfYWdhaW47Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhbGxvY19wYWdlX2J1ZmZlcnMpOworCitzdGF0aWMgaW5saW5lIHZvaWQKK2xpbmtfZGV2X2J1ZmZlcnMoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqdGFpbDsKKworCWJoID0gaGVhZDsKKwlkbyB7CisJCXRhaWwgPSBiaDsKKwkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJfSB3aGlsZSAoYmgpOworCXRhaWwtPmJfdGhpc19wYWdlID0gaGVhZDsKKwlhdHRhY2hfcGFnZV9idWZmZXJzKHBhZ2UsIGhlYWQpOworfQorCisvKgorICogSW5pdGlhbGlzZSB0aGUgc3RhdGUgb2YgYSBibG9ja2RldiBwYWdlJ3MgYnVmZmVycy4KKyAqLyAKK3N0YXRpYyB2b2lkCitpbml0X3BhZ2VfYnVmZmVycyhzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJCXNlY3Rvcl90IGJsb2NrLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGhlYWQ7CisJaW50IHVwdG9kYXRlID0gUGFnZVVwdG9kYXRlKHBhZ2UpOworCisJZG8geworCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKSB7CisJCQlpbml0X2J1ZmZlcihiaCwgTlVMTCwgTlVMTCk7CisJCQliaC0+Yl9iZGV2ID0gYmRldjsKKwkJCWJoLT5iX2Jsb2NrbnIgPSBibG9jazsKKwkJCWlmICh1cHRvZGF0ZSkKKwkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCXNldF9idWZmZXJfbWFwcGVkKGJoKTsKKwkJfQorCQlibG9jaysrOworCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKK30KKworLyoKKyAqIENyZWF0ZSB0aGUgcGFnZS1jYWNoZSBwYWdlIHRoYXQgY29udGFpbnMgdGhlIHJlcXVlc3RlZCBibG9jay4KKyAqCisgKiBUaGlzIGlzIHVzZXIgcHVyZWx5IGZvciBibG9ja2RldiBtYXBwaW5ncy4KKyAqLworc3RhdGljIHN0cnVjdCBwYWdlICoKK2dyb3dfZGV2X3BhZ2Uoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3QgYmxvY2ssCisJCXBnb2ZmX3QgaW5kZXgsIGludCBzaXplKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBiZGV2LT5iZF9pbm9kZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5kZXgsIEdGUF9OT0ZTKTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFQYWdlTG9ja2VkKHBhZ2UpKQorCQlCVUcoKTsKKworCWlmIChwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCWJoID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCQlpZiAoYmgtPmJfc2l6ZSA9PSBzaXplKSB7CisJCQlpbml0X3BhZ2VfYnVmZmVycyhwYWdlLCBiZGV2LCBibG9jaywgc2l6ZSk7CisJCQlyZXR1cm4gcGFnZTsKKwkJfQorCQlpZiAoIXRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSkpCisJCQlnb3RvIGZhaWxlZDsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIHNvbWUgYnVmZmVycyBmb3IgdGhpcyBwYWdlCisJICovCisJYmggPSBhbGxvY19wYWdlX2J1ZmZlcnMocGFnZSwgc2l6ZSwgMCk7CisJaWYgKCFiaCkKKwkJZ290byBmYWlsZWQ7CisKKwkvKgorCSAqIExpbmsgdGhlIHBhZ2UgdG8gdGhlIGJ1ZmZlcnMgYW5kIGluaXRpYWxpc2UgdGhlbS4gIFRha2UgdGhlCisJICogbG9jayB0byBiZSBhdG9taWMgd3J0IF9fZmluZF9nZXRfYmxvY2soKSwgd2hpY2ggZG9lcyBub3QKKwkgKiBydW4gdW5kZXIgdGhlIHBhZ2UgbG9jay4KKwkgKi8KKwlzcGluX2xvY2soJmlub2RlLT5pX21hcHBpbmctPnByaXZhdGVfbG9jayk7CisJbGlua19kZXZfYnVmZmVycyhwYWdlLCBiaCk7CisJaW5pdF9wYWdlX2J1ZmZlcnMocGFnZSwgYmRldiwgYmxvY2ssIHNpemUpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9tYXBwaW5nLT5wcml2YXRlX2xvY2spOworCXJldHVybiBwYWdlOworCitmYWlsZWQ6CisJQlVHKCk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogQ3JlYXRlIGJ1ZmZlcnMgZm9yIHRoZSBzcGVjaWZpZWQgYmxvY2sgZGV2aWNlIGJsb2NrJ3MgcGFnZS4gIElmCisgKiB0aGF0IHBhZ2Ugd2FzIGRpcnR5LCB0aGUgYnVmZmVycyBhcmUgc2V0IGRpcnR5IGFsc28uCisgKgorICogRXhjZXB0IHRoYXQncyBhIGJ1Zy4gIEF0dGFjaGluZyBkaXJ0eSBidWZmZXJzIHRvIGEgZGlydHkKKyAqIGJsb2NrZGV2J3MgcGFnZSBjYW4gcmVzdWx0IGluIGZpbGVzeXN0ZW0gY29ycnVwdGlvbiwgYmVjYXVzZQorICogc29tZSBvZiB0aG9zZSBidWZmZXJzIG1heSBiZSBhbGlhc2VzIG9mIGZpbGVzeXN0ZW0gZGF0YS4KKyAqIGdyb3dfZGV2X3BhZ2UoKSB3aWxsIGdvIEJVRygpIGlmIHRoaXMgaGFwcGVucy4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2dyb3dfYnVmZmVycyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBibG9jaywgaW50IHNpemUpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJcGdvZmZfdCBpbmRleDsKKwlpbnQgc2l6ZWJpdHM7CisKKwlzaXplYml0cyA9IC0xOworCWRvIHsKKwkJc2l6ZWJpdHMrKzsKKwl9IHdoaWxlICgoc2l6ZSA8PCBzaXplYml0cykgPCBQQUdFX1NJWkUpOworCisJaW5kZXggPSBibG9jayA+PiBzaXplYml0czsKKwlibG9jayA9IGluZGV4IDw8IHNpemViaXRzOworCisJLyogQ3JlYXRlIGEgcGFnZSB3aXRoIHRoZSBwcm9wZXIgc2l6ZSBidWZmZXJzLi4gKi8KKwlwYWdlID0gZ3Jvd19kZXZfcGFnZShiZGV2LCBibG9jaywgaW5kZXgsIHNpemUpOworCWlmICghcGFnZSkKKwkJcmV0dXJuIDA7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXJldHVybiAxOworfQorCitzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorX19nZXRibGtfc2xvdyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBibG9jaywgaW50IHNpemUpCit7CisJLyogU2l6ZSBtdXN0IGJlIG11bHRpcGxlIG9mIGhhcmQgc2VjdG9yc2l6ZSAqLworCWlmICh1bmxpa2VseShzaXplICYgKGJkZXZfaGFyZHNlY3Rfc2l6ZShiZGV2KS0xKSB8fAorCQkJKHNpemUgPCA1MTIgfHwgc2l6ZSA+IFBBR0VfU0laRSkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZ2V0YmxrKCk6IGludmFsaWQgYmxvY2sgc2l6ZSAlZCByZXF1ZXN0ZWRcbiIsCisJCQkJCXNpemUpOworCQlwcmludGsoS0VSTl9FUlIgImhhcmRzZWN0IHNpemU6ICVkXG4iLAorCQkJCQliZGV2X2hhcmRzZWN0X3NpemUoYmRldikpOworCisJCWR1bXBfc3RhY2soKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZm9yICg7OykgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKworCQliaCA9IF9fZmluZF9nZXRfYmxvY2soYmRldiwgYmxvY2ssIHNpemUpOworCQlpZiAoYmgpCisJCQlyZXR1cm4gYmg7CisKKwkJaWYgKCFncm93X2J1ZmZlcnMoYmRldiwgYmxvY2ssIHNpemUpKQorCQkJZnJlZV9tb3JlX21lbW9yeSgpOworCX0KK30KKworLyoKKyAqIFRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBkaXJ0eSBidWZmZXJzIGFuZCBkaXJ0eSBwYWdlczoKKyAqCisgKiBXaGVuZXZlciBhIHBhZ2UgaGFzIGFueSBkaXJ0eSBidWZmZXJzLCB0aGUgcGFnZSdzIGRpcnR5IGJpdCBpcyBzZXQsIGFuZAorICogdGhlIHBhZ2UgaXMgdGFnZ2VkIGRpcnR5IGluIGl0cyByYWRpeCB0cmVlLgorICoKKyAqIEF0IGFsbCB0aW1lcywgdGhlIGRpcnRpbmVzcyBvZiB0aGUgYnVmZmVycyByZXByZXNlbnRzIHRoZSBkaXJ0aW5lc3Mgb2YKKyAqIHN1YnNlY3Rpb25zIG9mIHRoZSBwYWdlLiAgSWYgdGhlIHBhZ2UgaGFzIGJ1ZmZlcnMsIHRoZSBwYWdlIGRpcnR5IGJpdCBpcworICogbWVyZWx5IGEgaGludCBhYm91dCB0aGUgdHJ1ZSBkaXJ0eSBzdGF0ZS4KKyAqCisgKiBXaGVuIGEgcGFnZSBpcyBzZXQgZGlydHkgaW4gaXRzIGVudGlyZXR5LCBhbGwgaXRzIGJ1ZmZlcnMgYXJlIG1hcmtlZCBkaXJ0eQorICogKGlmIHRoZSBwYWdlIGhhcyBidWZmZXJzKS4KKyAqCisgKiBXaGVuIGEgYnVmZmVyIGlzIG1hcmtlZCBkaXJ0eSwgaXRzIHBhZ2UgaXMgZGlydGllZCwgYnV0IHRoZSBwYWdlJ3Mgb3RoZXIKKyAqIGJ1ZmZlcnMgYXJlIG5vdC4KKyAqCisgKiBBbHNvLiAgV2hlbiBibG9ja2RldiBidWZmZXJzIGFyZSBleHBsaWNpdGx5IHJlYWQgd2l0aCBicmVhZCgpLCB0aGV5CisgKiBpbmRpdmlkdWFsbHkgYmVjb21lIHVwdG9kYXRlLiAgQnV0IHRoZWlyIGJhY2tpbmcgcGFnZSByZW1haW5zIG5vdAorICogdXB0b2RhdGUgLSBldmVuIGlmIGFsbCBvZiBpdHMgYnVmZmVycyBhcmUgdXB0b2RhdGUuICBBIHN1YnNlcXVlbnQKKyAqIGJsb2NrX3JlYWRfZnVsbF9wYWdlKCkgYWdhaW5zdCB0aGF0IHBhZ2Ugd2lsbCBkaXNjb3ZlciBhbGwgdGhlIHVwdG9kYXRlCisgKiBidWZmZXJzLCB3aWxsIHNldCB0aGUgcGFnZSB1cHRvZGF0ZSBhbmQgd2lsbCBwZXJmb3JtIG5vIEkvTy4KKyAqLworCisvKioKKyAqIG1hcmtfYnVmZmVyX2RpcnR5IC0gbWFyayBhIGJ1ZmZlcl9oZWFkIGFzIG5lZWRpbmcgd3JpdGVvdXQKKyAqCisgKiBtYXJrX2J1ZmZlcl9kaXJ0eSgpIHdpbGwgc2V0IHRoZSBkaXJ0eSBiaXQgYWdhaW5zdCB0aGUgYnVmZmVyLCB0aGVuIHNldCBpdHMKKyAqIGJhY2tpbmcgcGFnZSBkaXJ0eSwgdGhlbiB0YWcgdGhlIHBhZ2UgYXMgZGlydHkgaW4gaXRzIGFkZHJlc3Nfc3BhY2UncyByYWRpeAorICogdHJlZSBhbmQgdGhlbiBhdHRhY2ggdGhlIGFkZHJlc3Nfc3BhY2UncyBpbm9kZSB0byBpdHMgc3VwZXJibG9jaydzIGRpcnR5CisgKiBpbm9kZSBsaXN0LgorICoKKyAqIG1hcmtfYnVmZmVyX2RpcnR5KCkgaXMgYXRvbWljLiAgSXQgdGFrZXMgYmgtPmJfcGFnZS0+bWFwcGluZy0+cHJpdmF0ZV9sb2NrLAorICogbWFwcGluZy0+dHJlZV9sb2NrIGFuZCB0aGUgZ2xvYmFsIGlub2RlX2xvY2suCisgKi8KK3ZvaWQgZmFzdGNhbGwgbWFya19idWZmZXJfZGlydHkoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpZiAoIWJ1ZmZlcl9kaXJ0eShiaCkgJiYgIXRlc3Rfc2V0X2J1ZmZlcl9kaXJ0eShiaCkpCisJCV9fc2V0X3BhZ2VfZGlydHlfbm9idWZmZXJzKGJoLT5iX3BhZ2UpOworfQorCisvKgorICogRGVjcmVtZW50IGEgYnVmZmVyX2hlYWQncyByZWZlcmVuY2UgY291bnQuICBJZiBhbGwgYnVmZmVycyBhZ2FpbnN0IGEgcGFnZQorICogaGF2ZSB6ZXJvIHJlZmVyZW5jZSBjb3VudCwgYXJlIGNsZWFuIGFuZCB1bmxvY2tlZCwgYW5kIGlmIHRoZSBwYWdlIGlzIGNsZWFuCisgKiBhbmQgdW5sb2NrZWQgdGhlbiB0cnlfdG9fZnJlZV9idWZmZXJzKCkgbWF5IHN0cmlwIHRoZSBidWZmZXJzIGZyb20gdGhlIHBhZ2UKKyAqIGluIHByZXBhcmF0aW9uIGZvciBmcmVlaW5nIGl0IChzb21ldGltZXMsIHJhcmVseSwgYnVmZmVycyBhcmUgcmVtb3ZlZCBmcm9tCisgKiBhIHBhZ2UgYnV0IGl0IGVuZHMgdXAgbm90IGJlaW5nIGZyZWVkLCBhbmQgYnVmZmVycyBtYXkgbGF0ZXIgYmUgcmVhdHRhY2hlZCkuCisgKi8KK3ZvaWQgX19icmVsc2Uoc3RydWN0IGJ1ZmZlcl9oZWFkICogYnVmKQoreworCWlmIChhdG9taWNfcmVhZCgmYnVmLT5iX2NvdW50KSkgeworCQlwdXRfYmgoYnVmKTsKKwkJcmV0dXJuOworCX0KKwlwcmludGsoS0VSTl9FUlIgIlZGUzogYnJlbHNlOiBUcnlpbmcgdG8gZnJlZSBmcmVlIGJ1ZmZlclxuIik7CisJV0FSTl9PTigxKTsKK30KKworLyoKKyAqIGJmb3JnZXQoKSBpcyBsaWtlIGJyZWxzZSgpLCBleGNlcHQgaXQgZGlzY2FyZHMgYW55CisgKiBwb3RlbnRpYWxseSBkaXJ0eSBkYXRhLgorICovCit2b2lkIF9fYmZvcmdldChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKCFsaXN0X2VtcHR5KCZiaC0+Yl9hc3NvY19idWZmZXJzKSkgeworCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqYnVmZmVyX21hcHBpbmcgPSBiaC0+Yl9wYWdlLT5tYXBwaW5nOworCisJCXNwaW5fbG9jaygmYnVmZmVyX21hcHBpbmctPnByaXZhdGVfbG9jayk7CisJCWxpc3RfZGVsX2luaXQoJmJoLT5iX2Fzc29jX2J1ZmZlcnMpOworCQlzcGluX3VubG9jaygmYnVmZmVyX21hcHBpbmctPnByaXZhdGVfbG9jayk7CisJfQorCV9fYnJlbHNlKGJoKTsKK30KKworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqX19icmVhZF9zbG93KHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJbG9ja19idWZmZXIoYmgpOworCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCXVubG9ja19idWZmZXIoYmgpOworCQlyZXR1cm4gYmg7CisJfSBlbHNlIHsKKwkJZ2V0X2JoKGJoKTsKKwkJYmgtPmJfZW5kX2lvID0gZW5kX2J1ZmZlcl9yZWFkX3N5bmM7CisJCXN1Ym1pdF9iaChSRUFELCBiaCk7CisJCXdhaXRfb25fYnVmZmVyKGJoKTsKKwkJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQlyZXR1cm4gYmg7CisJfQorCWJyZWxzZShiaCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBQZXItY3B1IGJ1ZmZlciBMUlUgaW1wbGVtZW50YXRpb24uICBUbyByZWR1Y2UgdGhlIGNvc3Qgb2YgX19maW5kX2dldF9ibG9jaygpLgorICogVGhlIGJoc1tdIGFycmF5IGlzIHNvcnRlZCAtIG5ld2VzdCBidWZmZXIgaXMgYXQgYmhzWzBdLiAgQnVmZmVycyBoYXZlIHRoZWlyCisgKiByZWZjb3VudCBlbGV2YXRlZCBieSBvbmUgd2hlbiB0aGV5J3JlIGluIGFuIExSVS4gIEEgYnVmZmVyIGNhbiBvbmx5IGFwcGVhcgorICogb25jZSBpbiBhIHBhcnRpY3VsYXIgQ1BVJ3MgTFJVLiAgQSBzaW5nbGUgYnVmZmVyIGNhbiBiZSBwcmVzZW50IGluIG11bHRpcGxlCisgKiBDUFUncyBMUlVzIGF0IHRoZSBzYW1lIHRpbWUuCisgKgorICogVGhpcyBpcyBhIHRyYW5zcGFyZW50IGNhY2hpbmcgZnJvbnQtZW5kIHRvIHNiX2JyZWFkKCksIHNiX2dldGJsaygpIGFuZAorICogc2JfZmluZF9nZXRfYmxvY2soKS4KKyAqCisgKiBUaGUgTFJVcyB0aGVtc2VsdmVzIG9ubHkgbmVlZCBsb2NraW5nIGFnYWluc3QgaW52YWxpZGF0ZV9iaF9scnVzLiAgV2UgdXNlCisgKiBhIGxvY2FsIGludGVycnVwdCBkaXNhYmxlIGZvciB0aGF0LgorICovCisKKyNkZWZpbmUgQkhfTFJVX1NJWkUJOAorCitzdHJ1Y3QgYmhfbHJ1IHsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tCSF9MUlVfU0laRV07Cit9OworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGJoX2xydSwgYmhfbHJ1cykgPSB7eyBOVUxMIH19OworCisjaWZkZWYgQ09ORklHX1NNUAorI2RlZmluZSBiaF9scnVfbG9jaygpCWxvY2FsX2lycV9kaXNhYmxlKCkKKyNkZWZpbmUgYmhfbHJ1X3VubG9jaygpCWxvY2FsX2lycV9lbmFibGUoKQorI2Vsc2UKKyNkZWZpbmUgYmhfbHJ1X2xvY2soKQlwcmVlbXB0X2Rpc2FibGUoKQorI2RlZmluZSBiaF9scnVfdW5sb2NrKCkJcHJlZW1wdF9lbmFibGUoKQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19pcnFzX29uKHZvaWQpCit7CisjaWZkZWYgaXJxc19kaXNhYmxlZAorCUJVR19PTihpcnFzX2Rpc2FibGVkKCkpOworI2VuZGlmCit9CisKKy8qCisgKiBUaGUgTFJVIG1hbmFnZW1lbnQgYWxnb3JpdGhtIGlzIGRvcGV5LWJ1dC1zaW1wbGUuICBTb3JyeS4KKyAqLworc3RhdGljIHZvaWQgYmhfbHJ1X2luc3RhbGwoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmV2aWN0ZWUgPSBOVUxMOworCXN0cnVjdCBiaF9scnUgKmxydTsKKworCWNoZWNrX2lycXNfb24oKTsKKwliaF9scnVfbG9jaygpOworCWxydSA9ICZfX2dldF9jcHVfdmFyKGJoX2xydXMpOworCWlmIChscnUtPmJoc1swXSAhPSBiaCkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tCSF9MUlVfU0laRV07CisJCWludCBpbjsKKwkJaW50IG91dCA9IDA7CisKKwkJZ2V0X2JoKGJoKTsKKwkJYmhzW291dCsrXSA9IGJoOworCQlmb3IgKGluID0gMDsgaW4gPCBCSF9MUlVfU0laRTsgaW4rKykgeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDIgPSBscnUtPmJoc1tpbl07CisKKwkJCWlmIChiaDIgPT0gYmgpIHsKKwkJCQlfX2JyZWxzZShiaDIpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAob3V0ID49IEJIX0xSVV9TSVpFKSB7CisJCQkJCUJVR19PTihldmljdGVlICE9IE5VTEwpOworCQkJCQlldmljdGVlID0gYmgyOworCQkJCX0gZWxzZSB7CisJCQkJCWJoc1tvdXQrK10gPSBiaDI7CisJCQkJfQorCQkJfQorCQl9CisJCXdoaWxlIChvdXQgPCBCSF9MUlVfU0laRSkKKwkJCWJoc1tvdXQrK10gPSBOVUxMOworCQltZW1jcHkobHJ1LT5iaHMsIGJocywgc2l6ZW9mKGJocykpOworCX0KKwliaF9scnVfdW5sb2NrKCk7CisKKwlpZiAoZXZpY3RlZSkKKwkJX19icmVsc2UoZXZpY3RlZSk7Cit9CisKKy8qCisgKiBMb29rIHVwIHRoZSBiaCBpbiB0aGlzIGNwdSdzIExSVS4gIElmIGl0J3MgdGhlcmUsIG1vdmUgaXQgdG8gdGhlIGhlYWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK2xvb2t1cF9iaF9scnUoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3QgYmxvY2ssIGludCBzaXplKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqcmV0ID0gTlVMTDsKKwlzdHJ1Y3QgYmhfbHJ1ICpscnU7CisJaW50IGk7CisKKwljaGVja19pcnFzX29uKCk7CisJYmhfbHJ1X2xvY2soKTsKKwlscnUgPSAmX19nZXRfY3B1X3ZhcihiaF9scnVzKTsKKwlmb3IgKGkgPSAwOyBpIDwgQkhfTFJVX1NJWkU7IGkrKykgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gbHJ1LT5iaHNbaV07CisKKwkJaWYgKGJoICYmIGJoLT5iX2JkZXYgPT0gYmRldiAmJgorCQkJCWJoLT5iX2Jsb2NrbnIgPT0gYmxvY2sgJiYgYmgtPmJfc2l6ZSA9PSBzaXplKSB7CisJCQlpZiAoaSkgeworCQkJCXdoaWxlIChpKSB7CisJCQkJCWxydS0+YmhzW2ldID0gbHJ1LT5iaHNbaSAtIDFdOworCQkJCQlpLS07CisJCQkJfQorCQkJCWxydS0+YmhzWzBdID0gYmg7CisJCQl9CisJCQlnZXRfYmgoYmgpOworCQkJcmV0ID0gYmg7CisJCQlicmVhazsKKwkJfQorCX0KKwliaF9scnVfdW5sb2NrKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFBlcmZvcm0gYSBwYWdlY2FjaGUgbG9va3VwIGZvciB0aGUgbWF0Y2hpbmcgYnVmZmVyLiAgSWYgaXQncyB0aGVyZSwgcmVmcmVzaAorICogaXQgaW4gdGhlIExSVSBhbmQgbWFyayBpdCBhcyBhY2Nlc3NlZC4gIElmIGl0IGlzIG5vdCBwcmVzZW50IHRoZW4gcmV0dXJuCisgKiBOVUxMCisgKi8KK3N0cnVjdCBidWZmZXJfaGVhZCAqCitfX2ZpbmRfZ2V0X2Jsb2NrKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IGJsb2NrLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gbG9va3VwX2JoX2xydShiZGV2LCBibG9jaywgc2l6ZSk7CisKKwlpZiAoYmggPT0gTlVMTCkgeworCQliaCA9IF9fZmluZF9nZXRfYmxvY2tfc2xvdyhiZGV2LCBibG9jaywgc2l6ZSk7CisJCWlmIChiaCkKKwkJCWJoX2xydV9pbnN0YWxsKGJoKTsKKwl9CisJaWYgKGJoKQorCQl0b3VjaF9idWZmZXIoYmgpOworCXJldHVybiBiaDsKK30KK0VYUE9SVF9TWU1CT0woX19maW5kX2dldF9ibG9jayk7CisKKy8qCisgKiBfX2dldGJsayB3aWxsIGxvY2F0ZSAoYW5kLCBpZiBuZWNlc3NhcnksIGNyZWF0ZSkgdGhlIGJ1ZmZlcl9oZWFkCisgKiB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgcGFzc2VkIGJsb2NrX2RldmljZSwgYmxvY2sgYW5kIHNpemUuIFRoZQorICogcmV0dXJuZWQgYnVmZmVyIGhhcyBpdHMgcmVmZXJlbmNlIGNvdW50IGluY3JlbWVudGVkLgorICoKKyAqIF9fZ2V0YmxrKCkgY2Fubm90IGZhaWwgLSBpdCBqdXN0IGtlZXBzIHRyeWluZy4gIElmIHlvdSBwYXNzIGl0IGFuCisgKiBpbGxlZ2FsIGJsb2NrIG51bWJlciwgX19nZXRibGsoKSB3aWxsIGhhcHBpbHkgcmV0dXJuIGEgYnVmZmVyX2hlYWQKKyAqIHdoaWNoIHJlcHJlc2VudHMgdGhlIG5vbi1leGlzdGVudCBibG9jay4gIFZlcnkgd2VpcmQuCisgKgorICogX19nZXRibGsoKSB3aWxsIGxvY2sgdXAgdGhlIG1hY2hpbmUgaWYgZ3Jvd19kZXZfcGFnZSdzIHRyeV90b19mcmVlX2J1ZmZlcnMoKQorICogYXR0ZW1wdCBpcyBmYWlsaW5nLiAgRklYTUUsIHBlcmhhcHM/CisgKi8KK3N0cnVjdCBidWZmZXJfaGVhZCAqCitfX2dldGJsayhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBibG9jaywgaW50IHNpemUpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IF9fZmluZF9nZXRfYmxvY2soYmRldiwgYmxvY2ssIHNpemUpOworCisJbWlnaHRfc2xlZXAoKTsKKwlpZiAoYmggPT0gTlVMTCkKKwkJYmggPSBfX2dldGJsa19zbG93KGJkZXYsIGJsb2NrLCBzaXplKTsKKwlyZXR1cm4gYmg7Cit9CitFWFBPUlRfU1lNQk9MKF9fZ2V0YmxrKTsKKworLyoKKyAqIERvIGFzeW5jIHJlYWQtYWhlYWQgb24gYSBidWZmZXIuLgorICovCit2b2lkIF9fYnJlYWRhaGVhZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBibG9jaywgaW50IHNpemUpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IF9fZ2V0YmxrKGJkZXYsIGJsb2NrLCBzaXplKTsKKwlsbF9yd19ibG9jayhSRUFEQSwgMSwgJmJoKTsKKwlicmVsc2UoYmgpOworfQorRVhQT1JUX1NZTUJPTChfX2JyZWFkYWhlYWQpOworCisvKioKKyAqICBfX2JyZWFkKCkgLSByZWFkcyBhIHNwZWNpZmllZCBibG9jayBhbmQgcmV0dXJucyB0aGUgYmgKKyAqICBAYmxvY2s6IG51bWJlciBvZiBibG9jaworICogIEBzaXplOiBzaXplIChpbiBieXRlcykgdG8gcmVhZAorICogCisgKiAgUmVhZHMgYSBzcGVjaWZpZWQgYmxvY2ssIGFuZCByZXR1cm5zIGJ1ZmZlciBoZWFkIHRoYXQgY29udGFpbnMgaXQuCisgKiAgSXQgcmV0dXJucyBOVUxMIGlmIHRoZSBibG9jayB3YXMgdW5yZWFkYWJsZS4KKyAqLworc3RydWN0IGJ1ZmZlcl9oZWFkICoKK19fYnJlYWQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3QgYmxvY2ssIGludCBzaXplKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBfX2dldGJsayhiZGV2LCBibG9jaywgc2l6ZSk7CisKKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCWJoID0gX19icmVhZF9zbG93KGJoKTsKKwlyZXR1cm4gYmg7Cit9CitFWFBPUlRfU1lNQk9MKF9fYnJlYWQpOworCisvKgorICogaW52YWxpZGF0ZV9iaF9scnVzKCkgaXMgY2FsbGVkIHJhcmVseSAtIGJ1dCBub3Qgb25seSBhdCB1bm1vdW50LgorICogVGhpcyBkb2Vzbid0IHJhY2UgYmVjYXVzZSBpdCBydW5zIGluIGVhY2ggY3B1IGVpdGhlciBpbiBpcnEKKyAqIG9yIHdpdGggcHJlZW1wdCBkaXNhYmxlZC4KKyAqLworc3RhdGljIHZvaWQgaW52YWxpZGF0ZV9iaF9scnUodm9pZCAqYXJnKQoreworCXN0cnVjdCBiaF9scnUgKmIgPSAmZ2V0X2NwdV92YXIoYmhfbHJ1cyk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQkhfTFJVX1NJWkU7IGkrKykgeworCQlicmVsc2UoYi0+YmhzW2ldKTsKKwkJYi0+YmhzW2ldID0gTlVMTDsKKwl9CisJcHV0X2NwdV92YXIoYmhfbHJ1cyk7Cit9CisJCitzdGF0aWMgdm9pZCBpbnZhbGlkYXRlX2JoX2xydXModm9pZCkKK3sKKwlvbl9lYWNoX2NwdShpbnZhbGlkYXRlX2JoX2xydSwgTlVMTCwgMSwgMSk7Cit9CisKK3ZvaWQgc2V0X2JoX3BhZ2Uoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCWJoLT5iX3BhZ2UgPSBwYWdlOworCWlmIChvZmZzZXQgPj0gUEFHRV9TSVpFKQorCQlCVUcoKTsKKwlpZiAoUGFnZUhpZ2hNZW0ocGFnZSkpCisJCS8qCisJCSAqIFRoaXMgY2F0Y2hlcyBpbGxlZ2FsIHVzZXMgYW5kIHByZXNlcnZlcyB0aGUgb2Zmc2V0OgorCQkgKi8KKwkJYmgtPmJfZGF0YSA9IChjaGFyICopKDAgKyBvZmZzZXQpOworCWVsc2UKKwkJYmgtPmJfZGF0YSA9IHBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mZnNldDsKK30KK0VYUE9SVF9TWU1CT0woc2V0X2JoX3BhZ2UpOworCisvKgorICogQ2FsbGVkIHdoZW4gdHJ1bmNhdGluZyBhIGJ1ZmZlciBvbiBhIHBhZ2UgY29tcGxldGVseS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRpc2NhcmRfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQoreworCWxvY2tfYnVmZmVyKGJoKTsKKwljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCWJoLT5iX2JkZXYgPSBOVUxMOworCWNsZWFyX2J1ZmZlcl9tYXBwZWQoYmgpOworCWNsZWFyX2J1ZmZlcl9yZXEoYmgpOworCWNsZWFyX2J1ZmZlcl9uZXcoYmgpOworCWNsZWFyX2J1ZmZlcl9kZWxheShiaCk7CisJdW5sb2NrX2J1ZmZlcihiaCk7Cit9CisKKy8qKgorICogdHJ5X3RvX3JlbGVhc2VfcGFnZSgpIC0gcmVsZWFzZSBvbGQgZnMtc3BlY2lmaWMgbWV0YWRhdGEgb24gYSBwYWdlCisgKgorICogQHBhZ2U6IHRoZSBwYWdlIHdoaWNoIHRoZSBrZXJuZWwgaXMgdHJ5aW5nIHRvIGZyZWUKKyAqIEBnZnBfbWFzazogbWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MgKGFuZCBJL08gbW9kZSkKKyAqCisgKiBUaGUgYWRkcmVzc19zcGFjZSBpcyB0byB0cnkgdG8gcmVsZWFzZSBhbnkgZGF0YSBhZ2FpbnN0IHRoZSBwYWdlCisgKiAocHJlc3VtYWJseSBhdCBwYWdlLT5wcml2YXRlKS4gIElmIHRoZSByZWxlYXNlIHdhcyBzdWNjZXNzZnVsLCByZXR1cm4gYDEnLgorICogT3RoZXJ3aXNlIHJldHVybiB6ZXJvLgorICoKKyAqIFRoZSBAZ2ZwX21hc2sgYXJndW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgSS9PIG1heSBiZSBwZXJmb3JtZWQgdG8gcmVsZWFzZQorICogdGhpcyBwYWdlIChfX0dGUF9JTyksIGFuZCB3aGV0aGVyIHRoZSBjYWxsIG1heSBibG9jayAoX19HRlBfV0FJVCkuCisgKgorICogTk9URTogQGdmcF9tYXNrIG1heSBnbyBhd2F5LCBhbmQgdGhpcyBmdW5jdGlvbiBtYXkgYmVjb21lIG5vbi1ibG9ja2luZy4KKyAqLworaW50IHRyeV90b19yZWxlYXNlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBnZnBfbWFzaykKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqIGNvbnN0IG1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOworCisJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkKKwkJcmV0dXJuIDA7CisJCisJaWYgKG1hcHBpbmcgJiYgbWFwcGluZy0+YV9vcHMtPnJlbGVhc2VwYWdlKQorCQlyZXR1cm4gbWFwcGluZy0+YV9vcHMtPnJlbGVhc2VwYWdlKHBhZ2UsIGdmcF9tYXNrKTsKKwlyZXR1cm4gdHJ5X3RvX2ZyZWVfYnVmZmVycyhwYWdlKTsKK30KK0VYUE9SVF9TWU1CT0wodHJ5X3RvX3JlbGVhc2VfcGFnZSk7CisKKy8qKgorICogYmxvY2tfaW52YWxpZGF0ZXBhZ2UgLSBpbnZhbGlkYXRlIHBhcnQgb2YgYWxsIG9mIGEgYnVmZmVyLWJhY2tlZCBwYWdlCisgKgorICogQHBhZ2U6IHRoZSBwYWdlIHdoaWNoIGlzIGFmZmVjdGVkCisgKiBAb2Zmc2V0OiB0aGUgaW5kZXggb2YgdGhlIHRydW5jYXRpb24gcG9pbnQKKyAqCisgKiBibG9ja19pbnZhbGlkYXRlcGFnZSgpIGlzIGNhbGxlZCB3aGVuIGFsbCBvciBwYXJ0IG9mIHRoZSBwYWdlIGhhcyBiZWNvbWUKKyAqIGludmFsaWRhdGVkYnkgYSB0cnVuY2F0ZSBvcGVyYXRpb24uCisgKgorICogYmxvY2tfaW52YWxpZGF0ZXBhZ2UoKSBkb2VzIG5vdCBoYXZlIHRvIHJlbGVhc2UgYWxsIGJ1ZmZlcnMsIGJ1dCBpdCBtdXN0CisgKiBlbnN1cmUgdGhhdCBubyBkaXJ0eSBidWZmZXIgaXMgbGVmdCBvdXRzaWRlIEBvZmZzZXQgYW5kIHRoYXQgbm8gSS9PCisgKiBpcyB1bmRlcndheSBhZ2FpbnN0IGFueSBvZiB0aGUgYmxvY2tzIHdoaWNoIGFyZSBvdXRzaWRlIHRoZSB0cnVuY2F0aW9uCisgKiBwb2ludC4gIEJlY2F1c2UgdGhlIGNhbGxlciBpcyBhYm91dCB0byBmcmVlIChhbmQgcG9zc2libHkgcmV1c2UpIHRob3NlCisgKiBibG9ja3Mgb24tZGlzay4KKyAqLworaW50IGJsb2NrX2ludmFsaWRhdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsICpiaCwgKm5leHQ7CisJdW5zaWduZWQgaW50IGN1cnJfb2ZmID0gMDsKKwlpbnQgcmV0ID0gMTsKKworCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQorCQlnb3RvIG91dDsKKworCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJYmggPSBoZWFkOworCWRvIHsKKwkJdW5zaWduZWQgaW50IG5leHRfb2ZmID0gY3Vycl9vZmYgKyBiaC0+Yl9zaXplOworCQluZXh0ID0gYmgtPmJfdGhpc19wYWdlOworCisJCS8qCisJCSAqIGlzIHRoaXMgYmxvY2sgZnVsbHkgaW52YWxpZGF0ZWQ/CisJCSAqLworCQlpZiAob2Zmc2V0IDw9IGN1cnJfb2ZmKQorCQkJZGlzY2FyZF9idWZmZXIoYmgpOworCQljdXJyX29mZiA9IG5leHRfb2ZmOworCQliaCA9IG5leHQ7CisJfSB3aGlsZSAoYmggIT0gaGVhZCk7CisKKwkvKgorCSAqIFdlIHJlbGVhc2UgYnVmZmVycyBvbmx5IGlmIHRoZSBlbnRpcmUgcGFnZSBpcyBiZWluZyBpbnZhbGlkYXRlZC4KKwkgKiBUaGUgZ2V0X2Jsb2NrIGNhY2hlZCB2YWx1ZSBoYXMgYmVlbiB1bmNvbmRpdGlvbmFsbHkgaW52YWxpZGF0ZWQsCisJICogc28gcmVhbCBJTyBpcyBub3QgcG9zc2libGUgYW55bW9yZS4KKwkgKi8KKwlpZiAob2Zmc2V0ID09IDApCisJCXJldCA9IHRyeV90b19yZWxlYXNlX3BhZ2UocGFnZSwgMCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woYmxvY2tfaW52YWxpZGF0ZXBhZ2UpOworCisvKgorICogV2UgYXR0YWNoIGFuZCBwb3NzaWJseSBkaXJ0eSB0aGUgYnVmZmVycyBhdG9taWNhbGx5IHdydAorICogX19zZXRfcGFnZV9kaXJ0eV9idWZmZXJzKCkgdmlhIHByaXZhdGVfbG9jay4gIHRyeV90b19mcmVlX2J1ZmZlcnMKKyAqIGlzIGFscmVhZHkgZXhjbHVkZWQgdmlhIHRoZSBwYWdlIGxvY2suCisgKi8KK3ZvaWQgY3JlYXRlX2VtcHR5X2J1ZmZlcnMoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQl1bnNpZ25lZCBsb25nIGJsb2Nrc2l6ZSwgdW5zaWduZWQgbG9uZyBiX3N0YXRlKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkLCAqdGFpbDsKKworCWhlYWQgPSBhbGxvY19wYWdlX2J1ZmZlcnMocGFnZSwgYmxvY2tzaXplLCAxKTsKKwliaCA9IGhlYWQ7CisJZG8geworCQliaC0+Yl9zdGF0ZSB8PSBiX3N0YXRlOworCQl0YWlsID0gYmg7CisJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCX0gd2hpbGUgKGJoKTsKKwl0YWlsLT5iX3RoaXNfcGFnZSA9IGhlYWQ7CisKKwlzcGluX2xvY2soJnBhZ2UtPm1hcHBpbmctPnByaXZhdGVfbG9jayk7CisJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSB8fCBQYWdlRGlydHkocGFnZSkpIHsKKwkJYmggPSBoZWFkOworCQlkbyB7CisJCQlpZiAoUGFnZURpcnR5KHBhZ2UpKQorCQkJCXNldF9idWZmZXJfZGlydHkoYmgpOworCQkJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCQl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKwl9CisJYXR0YWNoX3BhZ2VfYnVmZmVycyhwYWdlLCBoZWFkKTsKKwlzcGluX3VubG9jaygmcGFnZS0+bWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0woY3JlYXRlX2VtcHR5X2J1ZmZlcnMpOworCisvKgorICogV2UgYXJlIHRha2luZyBhIGJsb2NrIGZvciBkYXRhIGFuZCB3ZSBkb24ndCB3YW50IGFueSBvdXRwdXQgZnJvbSBhbnkKKyAqIGJ1ZmZlci1jYWNoZSBhbGlhc2VzIHN0YXJ0aW5nIGZyb20gcmV0dXJuIGZyb20gdGhhdCBmdW5jdGlvbiBhbmQKKyAqIHVudGlsIHRoZSBtb21lbnQgd2hlbiBzb21ldGhpbmcgd2lsbCBleHBsaWNpdGx5IG1hcmsgdGhlIGJ1ZmZlcgorICogZGlydHkgKGhvcGVmdWxseSB0aGF0IHdpbGwgbm90IGhhcHBlbiB1bnRpbCB3ZSB3aWxsIGZyZWUgdGhhdCBibG9jayA7LSkKKyAqIFdlIGRvbid0IGV2ZW4gbmVlZCB0byBtYXJrIGl0IG5vdC11cHRvZGF0ZSAtIG5vYm9keSBjYW4gZXhwZWN0CisgKiBhbnl0aGluZyBmcm9tIGEgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBhbnl3YXkuIFdlIHVzZWQgdG8gdXNlZAorICogdW5tYXBfYnVmZmVyKCkgZm9yIHN1Y2ggaW52YWxpZGF0aW9uLCBidXQgdGhhdCB3YXMgd3JvbmcuIFdlIGRlZmluaXRlbHkKKyAqIGRvbid0IHdhbnQgdG8gbWFyayB0aGUgYWxpYXMgdW5tYXBwZWQsIGZvciBleGFtcGxlIC0gaXQgd291bGQgY29uZnVzZQorICogYW55b25lIHdobyBtaWdodCBwaWNrIGl0IHdpdGggYnJlYWQoKSBhZnRlcndhcmRzLi4uCisgKgorICogQWxzby4uICBOb3RlIHRoYXQgYmZvcmdldCgpIGRvZXNuJ3QgbG9jayB0aGUgYnVmZmVyLiAgU28gdGhlcmUgY2FuCisgKiBiZSB3cml0ZW91dCBJL08gZ29pbmcgb24gYWdhaW5zdCByZWNlbnRseS1mcmVlZCBidWZmZXJzLiAgV2UgZG9uJ3QKKyAqIHdhaXQgb24gdGhhdCBJL08gaW4gYmZvcmdldCgpIC0gaXQncyBtb3JlIGVmZmljaWVudCB0byB3YWl0IG9uIHRoZSBJL08KKyAqIG9ubHkgaWYgd2UgcmVhbGx5IG5lZWQgdG8uICBUaGF0IGhhcHBlbnMgaGVyZS4KKyAqLwordm9pZCB1bm1hcF91bmRlcmx5aW5nX21ldGFkYXRhKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IGJsb2NrKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqb2xkX2JoOworCisJbWlnaHRfc2xlZXAoKTsKKworCW9sZF9iaCA9IF9fZmluZF9nZXRfYmxvY2tfc2xvdyhiZGV2LCBibG9jaywgMCk7CisJaWYgKG9sZF9iaCkgeworCQljbGVhcl9idWZmZXJfZGlydHkob2xkX2JoKTsKKwkJd2FpdF9vbl9idWZmZXIob2xkX2JoKTsKKwkJY2xlYXJfYnVmZmVyX3JlcShvbGRfYmgpOworCQlfX2JyZWxzZShvbGRfYmgpOworCX0KK30KK0VYUE9SVF9TWU1CT0wodW5tYXBfdW5kZXJseWluZ19tZXRhZGF0YSk7CisKKy8qCisgKiBOT1RFISBBbGwgbWFwcGVkL3VwdG9kYXRlIGNvbWJpbmF0aW9ucyBhcmUgdmFsaWQ6CisgKgorICoJTWFwcGVkCVVwdG9kYXRlCU1lYW5pbmcKKyAqCisgKglObwlObwkJInVua25vd24iIC0gbXVzdCBkbyBnZXRfYmxvY2soKQorICoJTm8JWWVzCQkiaG9sZSIgLSB6ZXJvLWZpbGxlZAorICoJWWVzCU5vCQkiYWxsb2NhdGVkIiAtIGFsbG9jYXRlZCBvbiBkaXNrLCBub3QgcmVhZCBpbgorICoJWWVzCVllcwkJInZhbGlkIiAtIGFsbG9jYXRlZCBhbmQgdXAtdG8tZGF0ZSBpbiBtZW1vcnkuCisgKgorICogIkRpcnR5IiBpcyB2YWxpZCBvbmx5IHdpdGggdGhlIGxhc3QgY2FzZSAobWFwcGVkK3VwdG9kYXRlKS4KKyAqLworCisvKgorICogV2hpbGUgYmxvY2tfd3JpdGVfZnVsbF9wYWdlIGlzIHdyaXRpbmcgYmFjayB0aGUgZGlydHkgYnVmZmVycyB1bmRlcgorICogdGhlIHBhZ2UgbG9jaywgd2hvZXZlciBkaXJ0aWVkIHRoZSBidWZmZXJzIG1heSBkZWNpZGUgdG8gY2xlYW4gdGhlbQorICogYWdhaW4gYXQgYW55IHRpbWUuICBXZSBoYW5kbGUgdGhhdCBieSBvbmx5IGxvb2tpbmcgYXQgdGhlIGJ1ZmZlcgorICogc3RhdGUgaW5zaWRlIGxvY2tfYnVmZmVyKCkuCisgKgorICogSWYgYmxvY2tfd3JpdGVfZnVsbF9wYWdlKCkgaXMgY2FsbGVkIGZvciByZWd1bGFyIHdyaXRlYmFjaworICogKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfTk9ORSkgdGhlbiBpdCB3aWxsIHJlZGlydHkgYSBwYWdlIHdoaWNoIGhhcyBhCisgKiBsb2NrZWQgYnVmZmVyLiAgIFRoaXMgb25seSBjYW4gaGFwcGVuIGlmIHNvbWVvbmUgaGFzIHdyaXR0ZW4gdGhlIGJ1ZmZlcgorICogZGlyZWN0bHksIHdpdGggc3VibWl0X2JoKCkuICBBdCB0aGUgYWRkcmVzc19zcGFjZSBsZXZlbCBQYWdlV3JpdGViYWNrCisgKiBwcmV2ZW50cyB0aGlzIGNvbnRlbnRpb24gZnJvbSBvY2N1cnJpbmcuCisgKi8KK3N0YXRpYyBpbnQgX19ibG9ja193cml0ZV9mdWxsX3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQlnZXRfYmxvY2tfdCAqZ2V0X2Jsb2NrLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlpbnQgZXJyOworCXNlY3Rvcl90IGJsb2NrOworCXNlY3Rvcl90IGxhc3RfYmxvY2s7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQ7CisJaW50IG5yX3VuZGVyd2F5ID0gMDsKKworCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisKKwlsYXN0X2Jsb2NrID0gKGlfc2l6ZV9yZWFkKGlub2RlKSAtIDEpID4+IGlub2RlLT5pX2Jsa2JpdHM7CisKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKKwkJY3JlYXRlX2VtcHR5X2J1ZmZlcnMocGFnZSwgMSA8PCBpbm9kZS0+aV9ibGtiaXRzLAorCQkJCQkoMSA8PCBCSF9EaXJ0eSl8KDEgPDwgQkhfVXB0b2RhdGUpKTsKKwl9CisKKwkvKgorCSAqIEJlIHZlcnkgY2FyZWZ1bC4gIFdlIGhhdmUgbm8gZXhjbHVzaW9uIGZyb20gX19zZXRfcGFnZV9kaXJ0eV9idWZmZXJzCisJICogaGVyZSwgYW5kIHRoZSAocG90ZW50aWFsbHkgdW5tYXBwZWQpIGJ1ZmZlcnMgbWF5IGJlY29tZSBkaXJ0eSBhdAorCSAqIGFueSB0aW1lLiAgSWYgYSBidWZmZXIgYmVjb21lcyBkaXJ0eSBoZXJlIGFmdGVyIHdlJ3ZlIGluc3BlY3RlZCBpdAorCSAqIHRoZW4gd2UganVzdCBtaXNzIHRoYXQgZmFjdCwgYW5kIHRoZSBwYWdlIHN0YXlzIGRpcnR5LgorCSAqCisJICogQnVmZmVycyBvdXRzaWRlIGlfc2l6ZSBtYXkgYmUgZGlydGllZCBieSBfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnM7CisJICogaGFuZGxlIHRoYXQgaGVyZSBieSBqdXN0IGNsZWFuaW5nIHRoZW0uCisJICovCisKKwlibG9jayA9IHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cyk7CisJaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwliaCA9IGhlYWQ7CisKKwkvKgorCSAqIEdldCBhbGwgdGhlIGRpcnR5IGJ1ZmZlcnMgbWFwcGVkIHRvIGRpc2sgYWRkcmVzc2VzIGFuZAorCSAqIGhhbmRsZSBhbnkgYWxpYXNlcyBmcm9tIHRoZSB1bmRlcmx5aW5nIGJsb2NrZGV2J3MgbWFwcGluZy4KKwkgKi8KKwlkbyB7CisJCWlmIChibG9jayA+IGxhc3RfYmxvY2spIHsKKwkJCS8qCisJCQkgKiBtYXBwZWQgYnVmZmVycyBvdXRzaWRlIGlfc2l6ZSB3aWxsIG9jY3VyLCBiZWNhdXNlCisJCQkgKiB0aGlzIHBhZ2UgY2FuIGJlIG91dHNpZGUgaV9zaXplIHdoZW4gdGhlcmUgaXMgYQorCQkJICogdHJ1bmNhdGUgaW4gcHJvZ3Jlc3MuCisJCQkgKi8KKwkJCS8qCisJCQkgKiBUaGUgYnVmZmVyIHdhcyB6ZXJvZWQgYnkgYmxvY2tfd3JpdGVfZnVsbF9wYWdlKCkKKwkJCSAqLworCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQl9IGVsc2UgaWYgKCFidWZmZXJfbWFwcGVkKGJoKSAmJiBidWZmZXJfZGlydHkoYmgpKSB7CisJCQllcnIgPSBnZXRfYmxvY2soaW5vZGUsIGJsb2NrLCBiaCwgMSk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gcmVjb3ZlcjsKKwkJCWlmIChidWZmZXJfbmV3KGJoKSkgeworCQkJCS8qIGJsb2NrZGV2IG1hcHBpbmdzIG5ldmVyIGNvbWUgaGVyZSAqLworCQkJCWNsZWFyX2J1ZmZlcl9uZXcoYmgpOworCQkJCXVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEoYmgtPmJfYmRldiwKKwkJCQkJCQliaC0+Yl9ibG9ja25yKTsKKwkJCX0KKwkJfQorCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJYmxvY2srKzsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKworCWRvIHsKKwkJZ2V0X2JoKGJoKTsKKwkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBJZiBpdCdzIGEgZnVsbHkgbm9uLWJsb2NraW5nIHdyaXRlIGF0dGVtcHQgYW5kIHdlIGNhbm5vdAorCQkgKiBsb2NrIHRoZSBidWZmZXIgdGhlbiByZWRpcnR5IHRoZSBwYWdlLiAgTm90ZSB0aGF0IHRoaXMgY2FuCisJCSAqIHBvdGVudGlhbGx5IGNhdXNlIGEgYnVzeS13YWl0IGxvb3AgZnJvbSBwZGZsdXNoIGFuZCBrc3dhcGQKKwkJICogYWN0aXZpdHksIGJ1dCB0aG9zZSBjb2RlIHBhdGhzIGhhdmUgdGhlaXIgb3duIGhpZ2hlci1sZXZlbAorCQkgKiB0aHJvdHRsaW5nLgorCQkgKi8KKwkJaWYgKHdiYy0+c3luY19tb2RlICE9IFdCX1NZTkNfTk9ORSB8fCAhd2JjLT5ub25ibG9ja2luZykgeworCQkJbG9ja19idWZmZXIoYmgpOworCQl9IGVsc2UgaWYgKHRlc3Rfc2V0X2J1ZmZlcl9sb2NrZWQoYmgpKSB7CisJCQlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHRlc3RfY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSkgeworCQkJbWFya19idWZmZXJfYXN5bmNfd3JpdGUoYmgpOworCQl9IGVsc2UgeworCQkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCX0KKwl9IHdoaWxlICgoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOworCisJLyoKKwkgKiBUaGUgcGFnZSBhbmQgaXRzIGJ1ZmZlcnMgYXJlIHByb3RlY3RlZCBieSBQYWdlV3JpdGViYWNrKCksIHNvIHdlIGNhbgorCSAqIGRyb3AgdGhlIGJoIHJlZmNvdW50cyBlYXJseS4KKwkgKi8KKwlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CisJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCisJZG8geworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7CisJCWlmIChidWZmZXJfYXN5bmNfd3JpdGUoYmgpKSB7CisJCQlzdWJtaXRfYmgoV1JJVEUsIGJoKTsKKwkJCW5yX3VuZGVyd2F5Kys7CisJCX0KKwkJcHV0X2JoKGJoKTsKKwkJYmggPSBuZXh0OworCX0gd2hpbGUgKGJoICE9IGhlYWQpOworCisJZXJyID0gMDsKK2RvbmU6CisJaWYgKG5yX3VuZGVyd2F5ID09IDApIHsKKwkJLyoKKwkJICogVGhlIHBhZ2Ugd2FzIG1hcmtlZCBkaXJ0eSwgYnV0IHRoZSBidWZmZXJzIHdlcmUKKwkJICogY2xlYW4uICBTb21lb25lIHdyb3RlIHRoZW0gYmFjayBieSBoYW5kIHdpdGgKKwkJICogbGxfcndfYmxvY2svc3VibWl0X2JoLiAgQSByYXJlIGNhc2UuCisJCSAqLworCQlpbnQgdXB0b2RhdGUgPSAxOworCQlkbyB7CisJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJCQl1cHRvZGF0ZSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJfSB3aGlsZSAoYmggIT0gaGVhZCk7CisJCWlmICh1cHRvZGF0ZSkKKwkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCQkvKgorCQkgKiBUaGUgcGFnZSBhbmQgYnVmZmVyX2hlYWRzIGNhbiBiZSByZWxlYXNlZCBhdCBhbnkgdGltZSBmcm9tCisJCSAqIGhlcmUgb24uCisJCSAqLworCQl3YmMtPnBhZ2VzX3NraXBwZWQrKzsJLyogV2UgZGlkbid0IHdyaXRlIHRoaXMgcGFnZSAqLworCX0KKwlyZXR1cm4gZXJyOworCityZWNvdmVyOgorCS8qCisJICogRU5PU1BDLCBvciBzb21lIG90aGVyIGVycm9yLiAgV2UgbWF5IGFscmVhZHkgaGF2ZSBhZGRlZCBzb21lCisJICogYmxvY2tzIHRvIHRoZSBmaWxlLCBzbyB3ZSBuZWVkIHRvIHdyaXRlIHRoZXNlIG91dCB0byBhdm9pZAorCSAqIGV4cG9zaW5nIHN0YWxlIGRhdGEuCisJICogVGhlIHBhZ2UgaXMgY3VycmVudGx5IGxvY2tlZCBhbmQgbm90IG1hcmtlZCBmb3Igd3JpdGViYWNrCisJICovCisJYmggPSBoZWFkOworCS8qIFJlY292ZXJ5OiBsb2NrIGFuZCBzdWJtaXQgdGhlIG1hcHBlZCBidWZmZXJzICovCisJZG8geworCQlnZXRfYmgoYmgpOworCQlpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYnVmZmVyX2RpcnR5KGJoKSkgeworCQkJbG9ja19idWZmZXIoYmgpOworCQkJbWFya19idWZmZXJfYXN5bmNfd3JpdGUoYmgpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFRoZSBidWZmZXIgbWF5IGhhdmUgYmVlbiBzZXQgZGlydHkgZHVyaW5nCisJCQkgKiBhdHRhY2htZW50IHRvIGEgZGlydHkgcGFnZS4KKwkJCSAqLworCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJfQorCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisJU2V0UGFnZUVycm9yKHBhZ2UpOworCUJVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKKwlzZXRfcGFnZV93cml0ZWJhY2socGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJZG8geworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7CisJCWlmIChidWZmZXJfYXN5bmNfd3JpdGUoYmgpKSB7CisJCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCQkJc3VibWl0X2JoKFdSSVRFLCBiaCk7CisJCQlucl91bmRlcndheSsrOworCQl9CisJCXB1dF9iaChiaCk7CisJCWJoID0gbmV4dDsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKwlnb3RvIGRvbmU7Cit9CisKK3N0YXRpYyBpbnQgX19ibG9ja19wcmVwYXJlX3dyaXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQl1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bywgZ2V0X2Jsb2NrX3QgKmdldF9ibG9jaykKK3sKKwl1bnNpZ25lZCBibG9ja19zdGFydCwgYmxvY2tfZW5kOworCXNlY3Rvcl90IGJsb2NrOworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGJsb2Nrc2l6ZSwgYmJpdHM7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQsICp3YWl0WzJdLCAqKndhaXRfYmg9d2FpdDsKKworCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJQlVHX09OKGZyb20gPiBQQUdFX0NBQ0hFX1NJWkUpOworCUJVR19PTih0byA+IFBBR0VfQ0FDSEVfU0laRSk7CisJQlVHX09OKGZyb20gPiB0byk7CisKKwlibG9ja3NpemUgPSAxIDw8IGlub2RlLT5pX2Jsa2JpdHM7CisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQorCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBibG9ja3NpemUsIDApOworCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisKKwliYml0cyA9IGlub2RlLT5pX2Jsa2JpdHM7CisJYmxvY2sgPSAoc2VjdG9yX3QpcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBiYml0cyk7CisKKwlmb3IoYmggPSBoZWFkLCBibG9ja19zdGFydCA9IDA7IGJoICE9IGhlYWQgfHwgIWJsb2NrX3N0YXJ0OworCSAgICBibG9jaysrLCBibG9ja19zdGFydD1ibG9ja19lbmQsIGJoID0gYmgtPmJfdGhpc19wYWdlKSB7CisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYmxvY2tzaXplOworCQlpZiAoYmxvY2tfZW5kIDw9IGZyb20gfHwgYmxvY2tfc3RhcnQgPj0gdG8pIHsKKwkJCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKGJ1ZmZlcl9uZXcoYmgpKQorCQkJY2xlYXJfYnVmZmVyX25ldyhiaCk7CisJCWlmICghYnVmZmVyX21hcHBlZChiaCkpIHsKKwkJCWVyciA9IGdldF9ibG9jayhpbm9kZSwgYmxvY2ssIGJoLCAxKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisJCQlpZiAoYnVmZmVyX25ldyhiaCkpIHsKKwkJCQljbGVhcl9idWZmZXJfbmV3KGJoKTsKKwkJCQl1bm1hcF91bmRlcmx5aW5nX21ldGFkYXRhKGJoLT5iX2JkZXYsCisJCQkJCQkJYmgtPmJfYmxvY2tucik7CisJCQkJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChibG9ja19lbmQgPiB0byB8fCBibG9ja19zdGFydCA8IGZyb20pIHsKKwkJCQkJdm9pZCAqa2FkZHI7CisKKwkJCQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCQkJCWlmIChibG9ja19lbmQgPiB0bykKKwkJCQkJCW1lbXNldChrYWRkcit0bywgMCwKKwkJCQkJCQlibG9ja19lbmQtdG8pOworCQkJCQlpZiAoYmxvY2tfc3RhcnQgPCBmcm9tKQorCQkJCQkJbWVtc2V0KGthZGRyK2Jsb2NrX3N0YXJ0LAorCQkJCQkJCTAsIGZyb20tYmxvY2tfc3RhcnQpOworCQkJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQljb250aW51ZTsgCisJCX0KKwkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpICYmICFidWZmZXJfZGVsYXkoYmgpICYmCisJCSAgICAgKGJsb2NrX3N0YXJ0IDwgZnJvbSB8fCBibG9ja19lbmQgPiB0bykpIHsKKwkJCWxsX3J3X2Jsb2NrKFJFQUQsIDEsICZiaCk7CisJCQkqd2FpdF9iaCsrPWJoOworCQl9CisJfQorCS8qCisJICogSWYgd2UgaXNzdWVkIHJlYWQgcmVxdWVzdHMgLSBsZXQgdGhlbSBjb21wbGV0ZS4KKwkgKi8KKwl3aGlsZSh3YWl0X2JoID4gd2FpdCkgeworCQl3YWl0X29uX2J1ZmZlcigqLS13YWl0X2JoKTsKKwkJaWYgKCFidWZmZXJfdXB0b2RhdGUoKndhaXRfYmgpKQorCQkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworb3V0OgorCS8qCisJICogWmVybyBvdXQgYW55IG5ld2x5IGFsbG9jYXRlZCBibG9ja3MgdG8gYXZvaWQgZXhwb3Npbmcgc3RhbGUKKwkgKiBkYXRhLiAgSWYgQkhfTmV3IGlzIHNldCwgd2Uga25vdyB0aGF0IHRoZSBibG9jayB3YXMgbmV3bHkKKwkgKiBhbGxvY2F0ZWQgaW4gdGhlIGFib3ZlIGxvb3AuCisJICovCisJYmggPSBoZWFkOworCWJsb2NrX3N0YXJ0ID0gMDsKKwlkbyB7CisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0K2Jsb2Nrc2l6ZTsKKwkJaWYgKGJsb2NrX2VuZCA8PSBmcm9tKQorCQkJZ290byBuZXh0X2JoOworCQlpZiAoYmxvY2tfc3RhcnQgPj0gdG8pCisJCQlicmVhazsKKwkJaWYgKGJ1ZmZlcl9uZXcoYmgpKSB7CisJCQl2b2lkICprYWRkcjsKKworCQkJY2xlYXJfYnVmZmVyX25ldyhiaCk7CisJCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJCW1lbXNldChrYWRkcitibG9ja19zdGFydCwgMCwgYmgtPmJfc2l6ZSk7CisJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJfQorbmV4dF9iaDoKKwkJYmxvY2tfc3RhcnQgPSBibG9ja19lbmQ7CisJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCX0gd2hpbGUgKGJoICE9IGhlYWQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19ibG9ja19jb21taXRfd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCXVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXVuc2lnbmVkIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7CisJaW50IHBhcnRpYWwgPSAwOworCXVuc2lnbmVkIGJsb2Nrc2l6ZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZDsKKworCWJsb2Nrc2l6ZSA9IDEgPDwgaW5vZGUtPmlfYmxrYml0czsKKworCWZvcihiaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSksIGJsb2NrX3N0YXJ0ID0gMDsKKwkgICAgYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQ7CisJICAgIGJsb2NrX3N0YXJ0PWJsb2NrX2VuZCwgYmggPSBiaC0+Yl90aGlzX3BhZ2UpIHsKKwkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBibG9ja3NpemU7CisJCWlmIChibG9ja19lbmQgPD0gZnJvbSB8fCBibG9ja19zdGFydCA+PSB0bykgeworCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQkJCXBhcnRpYWwgPSAxOworCQl9IGVsc2UgeworCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBwYXJ0aWFsIHdyaXRlIHdoaWNoIGhhcHBlbmVkIHRvIG1ha2UgYWxsIGJ1ZmZlcnMKKwkgKiB1cHRvZGF0ZSB0aGVuIHdlIGNhbiBvcHRpbWl6ZSBhd2F5IGEgYm9ndXMgcmVhZHBhZ2UoKSBmb3IKKwkgKiB0aGUgbmV4dCByZWFkKCkuIEhlcmUgd2UgJ2Rpc2NvdmVyJyB3aGV0aGVyIHRoZSBwYWdlIHdlbnQKKwkgKiB1cHRvZGF0ZSBhcyBhIHJlc3VsdCBvZiB0aGlzIChwb3RlbnRpYWxseSBwYXJ0aWFsKSB3cml0ZS4KKwkgKi8KKwlpZiAoIXBhcnRpYWwpCisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdlbmVyaWMgInJlYWQgcGFnZSIgZnVuY3Rpb24gZm9yIGJsb2NrIGRldmljZXMgdGhhdCBoYXZlIHRoZSBub3JtYWwKKyAqIGdldF9ibG9jayBmdW5jdGlvbmFsaXR5LiBUaGlzIGlzIG1vc3Qgb2YgdGhlIGJsb2NrIGRldmljZSBmaWxlc3lzdGVtcy4KKyAqIFJlYWRzIHRoZSBwYWdlIGFzeW5jaHJvbm91c2x5IC0tLSB0aGUgdW5sb2NrX2J1ZmZlcigpIGFuZAorICogc2V0L2NsZWFyX2J1ZmZlcl91cHRvZGF0ZSgpIGZ1bmN0aW9ucyBwcm9wYWdhdGUgYnVmZmVyIHN0YXRlIGludG8gdGhlCisgKiBwYWdlIHN0cnVjdCBvbmNlIElPIGhhcyBjb21wbGV0ZWQuCisgKi8KK2ludCBibG9ja19yZWFkX2Z1bGxfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgZ2V0X2Jsb2NrX3QgKmdldF9ibG9jaykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzZWN0b3JfdCBpYmxvY2ssIGxibG9jazsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZCwgKmFycltNQVhfQlVGX1BFUl9QQUdFXTsKKwl1bnNpZ25lZCBpbnQgYmxvY2tzaXplOworCWludCBuciwgaTsKKwlpbnQgZnVsbHlfbWFwcGVkID0gMTsKKworCWlmICghUGFnZUxvY2tlZChwYWdlKSkKKwkJUEFHRV9CVUcocGFnZSk7CisJYmxvY2tzaXplID0gMSA8PCBpbm9kZS0+aV9ibGtiaXRzOworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwkJY3JlYXRlX2VtcHR5X2J1ZmZlcnMocGFnZSwgYmxvY2tzaXplLCAwKTsKKwloZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCisJaWJsb2NrID0gKHNlY3Rvcl90KXBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cyk7CisJbGJsb2NrID0gKGlfc2l6ZV9yZWFkKGlub2RlKStibG9ja3NpemUtMSkgPj4gaW5vZGUtPmlfYmxrYml0czsKKwliaCA9IGhlYWQ7CisJbnIgPSAwOworCWkgPSAwOworCisJZG8geworCQlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghYnVmZmVyX21hcHBlZChiaCkpIHsKKwkJCWZ1bGx5X21hcHBlZCA9IDA7CisJCQlpZiAoaWJsb2NrIDwgbGJsb2NrKSB7CisJCQkJaWYgKGdldF9ibG9jayhpbm9kZSwgaWJsb2NrLCBiaCwgMCkpCisJCQkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJCX0KKwkJCWlmICghYnVmZmVyX21hcHBlZChiaCkpIHsKKwkJCQl2b2lkICprYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJCQltZW1zZXQoa2FkZHIgKyBpICogYmxvY2tzaXplLCAwLCBibG9ja3NpemUpOworCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qCisJCQkgKiBnZXRfYmxvY2soKSBtaWdodCBoYXZlIHVwZGF0ZWQgdGhlIGJ1ZmZlcgorCQkJICogc3luY2hyb25vdXNseQorCQkJICovCisJCQlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCQljb250aW51ZTsKKwkJfQorCQlhcnJbbnIrK10gPSBiaDsKKwl9IHdoaWxlIChpKyssIGlibG9jaysrLCAoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOworCisJaWYgKGZ1bGx5X21hcHBlZCkKKwkJU2V0UGFnZU1hcHBlZFRvRGlzayhwYWdlKTsKKworCWlmICghbnIpIHsKKwkJLyoKKwkJICogQWxsIGJ1ZmZlcnMgYXJlIHVwdG9kYXRlIC0gd2UgY2FuIHNldCB0aGUgcGFnZSB1cHRvZGF0ZQorCQkgKiBhcyB3ZWxsLiBCdXQgbm90IGlmIGdldF9ibG9jaygpIHJldHVybmVkIGFuIGVycm9yLgorCQkgKi8KKwkJaWYgKCFQYWdlRXJyb3IocGFnZSkpCisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBTdGFnZSB0d286IGxvY2sgdGhlIGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQliaCA9IGFycltpXTsKKwkJbG9ja19idWZmZXIoYmgpOworCQltYXJrX2J1ZmZlcl9hc3luY19yZWFkKGJoKTsKKwl9CisKKwkvKgorCSAqIFN0YWdlIDM6IHN0YXJ0IHRoZSBJTy4gIENoZWNrIGZvciB1cHRvZGF0ZW5lc3MKKwkgKiBpbnNpZGUgdGhlIGJ1ZmZlciBsb2NrIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzIHJlYWRpbmcKKwkgKiB0aGUgdW5kZXJseWluZyBibG9ja2RldiBicm91Z2h0IGl0IHVwdG9kYXRlICh0aGUgc2N0IGZpeCkuCisJICovCisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJYmggPSBhcnJbaV07CisJCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKQorCQkJZW5kX2J1ZmZlcl9hc3luY19yZWFkKGJoLCAxKTsKKwkJZWxzZQorCQkJc3VibWl0X2JoKFJFQUQsIGJoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGZpbGVzeXN0ZW1zIHRoYXQgbmVlZCB0byBkbyB3b3JrIG9uIGV4cGFuZGluZworICogdHJ1bmNhdGVzLiAgVXNlcyBwcmVwYXJlL2NvbW1pdF93cml0ZSB0byBhbGxvdyB0aGUgZmlsZXN5c3RlbSB0bworICogZGVhbCB3aXRoIHRoZSBob2xlLiAgCisgKi8KK2ludCBnZW5lcmljX2NvbnRfZXhwYW5kKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBzaXplKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIGluZGV4LCBvZmZzZXQsIGxpbWl0OworCWludCBlcnI7CisKKwllcnIgPSAtRUZCSUc7CisgICAgICAgIGxpbWl0ID0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9GU0laRV0ucmxpbV9jdXI7CisJaWYgKGxpbWl0ICE9IFJMSU1fSU5GSU5JVFkgJiYgc2l6ZSA+IChsb2ZmX3QpbGltaXQpIHsKKwkJc2VuZF9zaWcoU0lHWEZTWiwgY3VycmVudCwgMCk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoc2l6ZSA+IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKQorCQlnb3RvIG91dDsKKworCW9mZnNldCA9IChzaXplICYgKFBBR0VfQ0FDSEVfU0laRS0xKSk7IC8qIFdpdGhpbiBwYWdlICovCisKKwkvKiB1Z2guICBpbiBwcmVwYXJlL2NvbW1pdF93cml0ZSwgaWYgZnJvbT09dG89PXN0YXJ0IG9mIGJsb2NrLCB3ZSAKKwkqKiBza2lwIHRoZSBwcmVwYXJlLiAgbWFrZSBzdXJlIHdlIG5ldmVyIHNlbmQgYW4gb2Zmc2V0IGZvciB0aGUgc3RhcnQKKwkqKiBvZiBhIGJsb2NrCisJKi8KKwlpZiAoKG9mZnNldCAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSkgPT0gMCkgeworCQlvZmZzZXQrKzsKKwl9CisJaW5kZXggPSBzaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJZXJyID0gLUVOT01FTTsKKwlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4KTsKKwlpZiAoIXBhZ2UpCisJCWdvdG8gb3V0OworCWVyciA9IG1hcHBpbmctPmFfb3BzLT5wcmVwYXJlX3dyaXRlKE5VTEwsIHBhZ2UsIG9mZnNldCwgb2Zmc2V0KTsKKwlpZiAoIWVycikgeworCQllcnIgPSBtYXBwaW5nLT5hX29wcy0+Y29tbWl0X3dyaXRlKE5VTEwsIHBhZ2UsIG9mZnNldCwgb2Zmc2V0KTsKKwl9CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCWlmIChlcnIgPiAwKQorCQllcnIgPSAwOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBGb3IgbW9yb25pYyBmaWxlc3lzdGVtcyB0aGF0IGRvIG5vdCBhbGxvdyBob2xlcyBpbiBmaWxlLgorICogV2UgbWF5IGhhdmUgdG8gZXh0ZW5kIHRoZSBmaWxlLgorICovCisKK2ludCBjb250X3ByZXBhcmVfd3JpdGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIG9mZnNldCwKKwkJdW5zaWduZWQgdG8sIGdldF9ibG9ja190ICpnZXRfYmxvY2ssIGxvZmZfdCAqYnl0ZXMpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXN0cnVjdCBwYWdlICpuZXdfcGFnZTsKKwlwZ29mZl90IHBncG9zOworCWxvbmcgc3RhdHVzOworCXVuc2lnbmVkIHplcm9mcm9tOworCXVuc2lnbmVkIGJsb2Nrc2l6ZSA9IDEgPDwgaW5vZGUtPmlfYmxrYml0czsKKwl2b2lkICprYWRkcjsKKworCXdoaWxlKHBhZ2UtPmluZGV4ID4gKHBncG9zID0gKmJ5dGVzPj5QQUdFX0NBQ0hFX1NISUZUKSkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQluZXdfcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBwZ3Bvcyk7CisJCWlmICghbmV3X3BhZ2UpCisJCQlnb3RvIG91dDsKKwkJLyogd2UgbWlnaHQgc2xlZXAgKi8KKwkJaWYgKCpieXRlcz4+UEFHRV9DQUNIRV9TSElGVCAhPSBwZ3BvcykgeworCQkJdW5sb2NrX3BhZ2UobmV3X3BhZ2UpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKG5ld19wYWdlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXplcm9mcm9tID0gKmJ5dGVzICYgflBBR0VfQ0FDSEVfTUFTSzsKKwkJaWYgKHplcm9mcm9tICYgKGJsb2Nrc2l6ZS0xKSkgeworCQkJKmJ5dGVzIHw9IChibG9ja3NpemUtMSk7CisJCQkoKmJ5dGVzKSsrOworCQl9CisJCXN0YXR1cyA9IF9fYmxvY2tfcHJlcGFyZV93cml0ZShpbm9kZSwgbmV3X3BhZ2UsIHplcm9mcm9tLAorCQkJCQkJUEFHRV9DQUNIRV9TSVpFLCBnZXRfYmxvY2spOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBvdXRfdW5tYXA7CisJCWthZGRyID0ga21hcF9hdG9taWMobmV3X3BhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtc2V0KGthZGRyK3plcm9mcm9tLCAwLCBQQUdFX0NBQ0hFX1NJWkUtemVyb2Zyb20pOworCQlmbHVzaF9kY2FjaGVfcGFnZShuZXdfcGFnZSk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJZ2VuZXJpY19jb21taXRfd3JpdGUoTlVMTCwgbmV3X3BhZ2UsIHplcm9mcm9tLCBQQUdFX0NBQ0hFX1NJWkUpOworCQl1bmxvY2tfcGFnZShuZXdfcGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShuZXdfcGFnZSk7CisJfQorCisJaWYgKHBhZ2UtPmluZGV4IDwgcGdwb3MpIHsKKwkJLyogY29tcGxldGVseSBpbnNpZGUgdGhlIGFyZWEgKi8KKwkJemVyb2Zyb20gPSBvZmZzZXQ7CisJfSBlbHNlIHsKKwkJLyogcGFnZSBjb3ZlcnMgdGhlIGJvdW5kYXJ5LCBmaW5kIHRoZSBib3VuZGFyeSBvZmZzZXQgKi8KKwkJemVyb2Zyb20gPSAqYnl0ZXMgJiB+UEFHRV9DQUNIRV9NQVNLOworCisJCS8qIGlmIHdlIHdpbGwgZXhwYW5kIHRoZSB0aGluZyBsYXN0IGJsb2NrIHdpbGwgYmUgZmlsbGVkICovCisJCWlmICh0byA+IHplcm9mcm9tICYmICh6ZXJvZnJvbSAmIChibG9ja3NpemUtMSkpKSB7CisJCQkqYnl0ZXMgfD0gKGJsb2Nrc2l6ZS0xKTsKKwkJCSgqYnl0ZXMpKys7CisJCX0KKworCQkvKiBzdGFydGluZyBiZWxvdyB0aGUgYm91bmRhcnk/IE5vdGhpbmcgdG8gemVybyBvdXQgKi8KKwkJaWYgKG9mZnNldCA8PSB6ZXJvZnJvbSkKKwkJCXplcm9mcm9tID0gb2Zmc2V0OworCX0KKwlzdGF0dXMgPSBfX2Jsb2NrX3ByZXBhcmVfd3JpdGUoaW5vZGUsIHBhZ2UsIHplcm9mcm9tLCB0bywgZ2V0X2Jsb2NrKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDE7CisJaWYgKHplcm9mcm9tIDwgb2Zmc2V0KSB7CisJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQltZW1zZXQoa2FkZHIremVyb2Zyb20sIDAsIG9mZnNldC16ZXJvZnJvbSk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCV9fYmxvY2tfY29tbWl0X3dyaXRlKGlub2RlLCBwYWdlLCB6ZXJvZnJvbSwgb2Zmc2V0KTsKKwl9CisJcmV0dXJuIDA7CitvdXQxOgorCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOworCXJldHVybiBzdGF0dXM7CisKK291dF91bm1hcDoKKwlDbGVhclBhZ2VVcHRvZGF0ZShuZXdfcGFnZSk7CisJdW5sb2NrX3BhZ2UobmV3X3BhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShuZXdfcGFnZSk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IGJsb2NrX3ByZXBhcmVfd3JpdGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvLAorCQkJZ2V0X2Jsb2NrX3QgKmdldF9ibG9jaykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlpbnQgZXJyID0gX19ibG9ja19wcmVwYXJlX3dyaXRlKGlub2RlLCBwYWdlLCBmcm9tLCB0bywgZ2V0X2Jsb2NrKTsKKwlpZiAoZXJyKQorCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgYmxvY2tfY29tbWl0X3dyaXRlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlfX2Jsb2NrX2NvbW1pdF93cml0ZShpbm9kZSxwYWdlLGZyb20sdG8pOworCXJldHVybiAwOworfQorCitpbnQgZ2VuZXJpY19jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQl1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlsb2ZmX3QgcG9zID0gKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyB0bzsKKwlfX2Jsb2NrX2NvbW1pdF93cml0ZShpbm9kZSxwYWdlLGZyb20sdG8pOworCS8qCisJICogTm8gbmVlZCB0byB1c2UgaV9zaXplX3JlYWQoKSBoZXJlLCB0aGUgaV9zaXplCisJICogY2Fubm90IGNoYW5nZSB1bmRlciB1cyBiZWNhdXNlIHdlIGhvbGQgaV9zZW0uCisJICovCisJaWYgKHBvcyA+IGlub2RlLT5pX3NpemUpIHsKKwkJaV9zaXplX3dyaXRlKGlub2RlLCBwb3MpOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIG5vYmhfcHJlcGFyZV93cml0ZSgpJ3MgcHJlcmVhZHMgYXJlIHNwZWNpYWw6IHRoZSBidWZmZXJfaGVhZHMgYXJlIGZyZWVkCisgKiBpbW1lZGlhdGVseSwgd2hpbGUgdW5kZXIgdGhlIHBhZ2UgbG9jay4gIFNvIGl0IG5lZWRzIGEgc3BlY2lhbCBlbmRfaW8KKyAqIGhhbmRsZXIgd2hpY2ggZG9lcyBub3QgdG91Y2ggdGhlIGJoIGFmdGVyIHVubG9ja2luZyBpdC4KKyAqCisgKiBOb3RlOiB1bmxvY2tfYnVmZmVyKCkgc29ydC1vZiBkb2VzIHRvdWNoIHRoZSBiaCBhZnRlciB1bmxvY2tpbmcgaXQsIGJ1dAorICogYSByYWNlIHRoZXJlIGlzIGJlbmlnbjogdW5sb2NrX2J1ZmZlcigpIG9ubHkgdXNlIHRoZSBiaCdzIGFkZHJlc3MgZm9yCisgKiBoYXNoaW5nIGFmdGVyIHVubG9ja2luZyB0aGUgYnVmZmVyLCBzbyBpdCBkb2Vzbid0IGFjdHVhbGx5IHRvdWNoIHRoZSBiaAorICogaXRzZWxmLgorICovCitzdGF0aWMgdm9pZCBlbmRfYnVmZmVyX3JlYWRfbm9iaChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdXB0b2RhdGUpCit7CisJaWYgKHVwdG9kYXRlKSB7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCX0gZWxzZSB7CisJCS8qIFRoaXMgaGFwcGVucywgZHVlIHRvIGZhaWxlZCBSRUFEQSBhdHRlbXB0cy4gKi8KKwkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwl9CisJdW5sb2NrX2J1ZmZlcihiaCk7Cit9CisKKy8qCisgKiBPbiBlbnRyeSwgdGhlIHBhZ2UgaXMgZnVsbHkgbm90IHVwdG9kYXRlLgorICogT24gZXhpdCB0aGUgcGFnZSBpcyBmdWxseSB1cHRvZGF0ZSBpbiB0aGUgYXJlYXMgb3V0c2lkZSAoZnJvbSx0bykKKyAqLworaW50IG5vYmhfcHJlcGFyZV93cml0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sCisJCQlnZXRfYmxvY2tfdCAqZ2V0X2Jsb2NrKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCWNvbnN0IHVuc2lnbmVkIGJsa2JpdHMgPSBpbm9kZS0+aV9ibGtiaXRzOworCWNvbnN0IHVuc2lnbmVkIGJsb2Nrc2l6ZSA9IDEgPDwgYmxrYml0czsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgbWFwX2JoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqcmVhZF9iaFtNQVhfQlVGX1BFUl9QQUdFXTsKKwl1bnNpZ25lZCBibG9ja19pbl9wYWdlOworCXVuc2lnbmVkIGJsb2NrX3N0YXJ0OworCXNlY3Rvcl90IGJsb2NrX2luX2ZpbGU7CisJY2hhciAqa2FkZHI7CisJaW50IG5yX3JlYWRzID0gMDsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaXNfbWFwcGVkX3RvX2Rpc2sgPSAxOworCWludCBkaXJ0aWVkX2l0ID0gMDsKKworCWlmIChQYWdlTWFwcGVkVG9EaXNrKHBhZ2UpKQorCQlyZXR1cm4gMDsKKworCWJsb2NrX2luX2ZpbGUgPSAoc2VjdG9yX3QpcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBibGtiaXRzKTsKKwltYXBfYmguYl9wYWdlID0gcGFnZTsKKworCS8qCisJICogV2UgbG9vcCBhY3Jvc3MgYWxsIGJsb2NrcyBpbiB0aGUgcGFnZSwgd2hldGhlciBvciBub3QgdGhleSBhcmUKKwkgKiBwYXJ0IG9mIHRoZSBhZmZlY3RlZCByZWdpb24uICBUaGlzIGlzIHNvIHdlIGNhbiBkaXNjb3ZlciBpZiB0aGUKKwkgKiBwYWdlIGlzIGZ1bGx5IG1hcHBlZC10by1kaXNrLgorCSAqLworCWZvciAoYmxvY2tfc3RhcnQgPSAwLCBibG9ja19pbl9wYWdlID0gMDsKKwkJICBibG9ja19zdGFydCA8IFBBR0VfQ0FDSEVfU0laRTsKKwkJICBibG9ja19pbl9wYWdlKyssIGJsb2NrX3N0YXJ0ICs9IGJsb2Nrc2l6ZSkgeworCQl1bnNpZ25lZCBibG9ja19lbmQgPSBibG9ja19zdGFydCArIGJsb2Nrc2l6ZTsKKwkJaW50IGNyZWF0ZTsKKworCQltYXBfYmguYl9zdGF0ZSA9IDA7CisJCWNyZWF0ZSA9IDE7CisJCWlmIChibG9ja19zdGFydCA+PSB0bykKKwkJCWNyZWF0ZSA9IDA7CisJCXJldCA9IGdldF9ibG9jayhpbm9kZSwgYmxvY2tfaW5fZmlsZSArIGJsb2NrX2luX3BhZ2UsCisJCQkJCSZtYXBfYmgsIGNyZWF0ZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGZhaWxlZDsKKwkJaWYgKCFidWZmZXJfbWFwcGVkKCZtYXBfYmgpKQorCQkJaXNfbWFwcGVkX3RvX2Rpc2sgPSAwOworCQlpZiAoYnVmZmVyX25ldygmbWFwX2JoKSkKKwkJCXVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEobWFwX2JoLmJfYmRldiwKKwkJCQkJCQltYXBfYmguYl9ibG9ja25yKTsKKwkJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoYnVmZmVyX25ldygmbWFwX2JoKSB8fCAhYnVmZmVyX21hcHBlZCgmbWFwX2JoKSkgeworCQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCQlpZiAoYmxvY2tfc3RhcnQgPCBmcm9tKSB7CisJCQkJbWVtc2V0KGthZGRyK2Jsb2NrX3N0YXJ0LCAwLCBmcm9tLWJsb2NrX3N0YXJ0KTsKKwkJCQlkaXJ0aWVkX2l0ID0gMTsKKwkJCX0KKwkJCWlmIChibG9ja19lbmQgPiB0bykgeworCQkJCW1lbXNldChrYWRkciArIHRvLCAwLCBibG9ja19lbmQgLSB0byk7CisJCQkJZGlydGllZF9pdCA9IDE7CisJCQl9CisJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChidWZmZXJfdXB0b2RhdGUoJm1hcF9iaCkpCisJCQljb250aW51ZTsJLyogcmVpc2VyZnMgZG9lcyB0aGlzICovCisJCWlmIChibG9ja19zdGFydCA8IGZyb20gfHwgYmxvY2tfZW5kID4gdG8pIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBhbGxvY19idWZmZXJfaGVhZChHRlBfTk9GUyk7CisKKwkJCWlmICghYmgpIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gZmFpbGVkOworCQkJfQorCQkJYmgtPmJfc3RhdGUgPSBtYXBfYmguYl9zdGF0ZTsKKwkJCWF0b21pY19zZXQoJmJoLT5iX2NvdW50LCAwKTsKKwkJCWJoLT5iX3RoaXNfcGFnZSA9IE5VTEw7CisJCQliaC0+Yl9wYWdlID0gcGFnZTsKKwkJCWJoLT5iX2Jsb2NrbnIgPSBtYXBfYmguYl9ibG9ja25yOworCQkJYmgtPmJfc2l6ZSA9IGJsb2Nrc2l6ZTsKKwkJCWJoLT5iX2RhdGEgPSAoY2hhciAqKShsb25nKWJsb2NrX3N0YXJ0OworCQkJYmgtPmJfYmRldiA9IG1hcF9iaC5iX2JkZXY7CisJCQliaC0+Yl9wcml2YXRlID0gTlVMTDsKKwkJCXJlYWRfYmhbbnJfcmVhZHMrK10gPSBiaDsKKwkJfQorCX0KKworCWlmIChucl9yZWFkcykgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJCS8qCisJCSAqIFRoZSBwYWdlIGlzIGxvY2tlZCwgc28gdGhlc2UgYnVmZmVycyBhcmUgcHJvdGVjdGVkIGZyb20KKwkJICogYW55IFZNIG9yIHRydW5jYXRlIGFjdGl2aXR5LiAgSGVuY2Ugd2UgZG9uJ3QgbmVlZCB0byBjYXJlCisJCSAqIGZvciB0aGUgYnVmZmVyX2hlYWQgcmVmY291bnRzLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IG5yX3JlYWRzOyBpKyspIHsKKwkJCWJoID0gcmVhZF9iaFtpXTsKKwkJCWxvY2tfYnVmZmVyKGJoKTsKKwkJCWJoLT5iX2VuZF9pbyA9IGVuZF9idWZmZXJfcmVhZF9ub2JoOworCQkJc3VibWl0X2JoKFJFQUQsIGJoKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgbnJfcmVhZHM7IGkrKykgeworCQkJYmggPSByZWFkX2JoW2ldOworCQkJd2FpdF9vbl9idWZmZXIoYmgpOworCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQkJCXJldCA9IC1FSU87CisJCQlmcmVlX2J1ZmZlcl9oZWFkKGJoKTsKKwkJCXJlYWRfYmhbaV0gPSBOVUxMOworCQl9CisJCWlmIChyZXQpCisJCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlpZiAoaXNfbWFwcGVkX3RvX2Rpc2spCisJCVNldFBhZ2VNYXBwZWRUb0Rpc2socGFnZSk7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCisJLyoKKwkgKiBTZXR0aW5nIHRoZSBwYWdlIGRpcnR5IGhlcmUgaXNuJ3QgbmVjZXNzYXJ5IGZvciB0aGUgcHJlcGFyZV93cml0ZQorCSAqIGZ1bmN0aW9uIC0gY29tbWl0X3dyaXRlIHdpbGwgZG8gdGhhdC4gIEJ1dCBpZi93aGVuIHRoaXMgZnVuY3Rpb24gaXMKKwkgKiB1c2VkIHdpdGhpbiB0aGUgcGFnZWZhdWx0IGhhbmRsZXIgdG8gZW5zdXJlIHRoYXQgYWxsIG1tYXBwZWQgcGFnZXMKKwkgKiBoYXZlIGJhY2tpbmcgc3BhY2UgaW4gdGhlIGZpbGVzeXN0ZW0sIHdlIHdpbGwgbmVlZCB0byBkaXJ0eSB0aGUgcGFnZQorCSAqIGlmIGl0cyBjb250ZW50cyB3ZXJlIGFsdGVyZWQuCisJICovCisJaWYgKGRpcnRpZWRfaXQpCisJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCisJcmV0dXJuIDA7CisKK2ZhaWxlZDoKKwlmb3IgKGkgPSAwOyBpIDwgbnJfcmVhZHM7IGkrKykgeworCQlpZiAocmVhZF9iaFtpXSkKKwkJCWZyZWVfYnVmZmVyX2hlYWQocmVhZF9iaFtpXSk7CisJfQorCisJLyoKKwkgKiBFcnJvciByZWNvdmVyeSBpcyBwcmV0dHkgc2xhY2suICBDbGVhciB0aGUgcGFnZSBhbmQgbWFyayBpdCBkaXJ0eQorCSAqIHNvIHdlJ2xsIGxhdGVyIHplcm8gb3V0IGFueSBibG9ja3Mgd2hpY2ggX3dlcmVfIGFsbG9jYXRlZC4KKwkgKi8KKwlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwltZW1zZXQoa2FkZHIsIDAsIFBBR0VfQ0FDSEVfU0laRSk7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChub2JoX3ByZXBhcmVfd3JpdGUpOworCitpbnQgbm9iaF9jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQl1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlsb2ZmX3QgcG9zID0gKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyB0bzsKKworCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCWlmIChwb3MgPiBpbm9kZS0+aV9zaXplKSB7CisJCWlfc2l6ZV93cml0ZShpbm9kZSwgcG9zKTsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChub2JoX2NvbW1pdF93cml0ZSk7CisKKy8qCisgKiBub2JoX3dyaXRlcGFnZSgpIC0gYmFzZWQgb24gYmxvY2tfZnVsbF93cml0ZV9wYWdlKCkgZXhjZXB0CisgKiB0aGF0IGl0IHRyaWVzIHRvIG9wZXJhdGUgd2l0aG91dCBhdHRhY2hpbmcgYnVmZmVyaGVhZHMgdG8KKyAqIHRoZSBwYWdlLgorICovCitpbnQgbm9iaF93cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGdldF9ibG9ja190ICpnZXRfYmxvY2ssCisJCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBjb25zdCBpbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJbG9mZl90IGlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwljb25zdCBwZ29mZl90IGVuZF9pbmRleCA9IGlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIG9mZnNldDsKKwl2b2lkICprYWRkcjsKKwlpbnQgcmV0OworCisJLyogSXMgdGhlIHBhZ2UgZnVsbHkgaW5zaWRlIGlfc2l6ZT8gKi8KKwlpZiAocGFnZS0+aW5kZXggPCBlbmRfaW5kZXgpCisJCWdvdG8gb3V0OworCisJLyogSXMgdGhlIHBhZ2UgZnVsbHkgb3V0c2lkZSBpX3NpemU/ICh0cnVuY2F0ZSBpbiBwcm9ncmVzcykgKi8KKwlvZmZzZXQgPSBpX3NpemUgJiAoUEFHRV9DQUNIRV9TSVpFLTEpOworCWlmIChwYWdlLT5pbmRleCA+PSBlbmRfaW5kZXgrMSB8fCAhb2Zmc2V0KSB7CisJCS8qCisJCSAqIFRoZSBwYWdlIG1heSBoYXZlIGRpcnR5LCB1bm1hcHBlZCBidWZmZXJzLiAgRm9yIGV4YW1wbGUsCisJCSAqIHRoZXkgbWF5IGhhdmUgYmVlbiBhZGRlZCBpbiBleHQzX3dyaXRlcGFnZSgpLiAgTWFrZSB0aGVtCisJCSAqIGZyZWVhYmxlIGhlcmUsIHNvIHRoZSBwYWdlIGRvZXMgbm90IGxlYWsuCisJCSAqLworI2lmIDAKKwkJLyogTm90IHJlYWxseSBzdXJlIGFib3V0IHRoaXMgIC0gZG8gd2UgbmVlZCB0aGlzID8gKi8KKwkJaWYgKHBhZ2UtPm1hcHBpbmctPmFfb3BzLT5pbnZhbGlkYXRlcGFnZSkKKwkJCXBhZ2UtPm1hcHBpbmctPmFfb3BzLT5pbnZhbGlkYXRlcGFnZShwYWdlLCBvZmZzZXQpOworI2VuZGlmCisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlyZXR1cm4gMDsgLyogZG9uJ3QgY2FyZSAqLworCX0KKworCS8qCisJICogVGhlIHBhZ2Ugc3RyYWRkbGVzIGlfc2l6ZS4gIEl0IG11c3QgYmUgemVyb2VkIG91dCBvbiBlYWNoIGFuZCBldmVyeQorCSAqIHdyaXRlcGFnZSBpbnZvY2F0aW9uIGJlY2F1c2UgaXQgbWF5IGJlIG1tYXBwZWQuICAiQSBmaWxlIGlzIG1hcHBlZAorCSAqIGluIG11bHRpcGxlcyBvZiB0aGUgcGFnZSBzaXplLiAgRm9yIGEgZmlsZSB0aGF0IGlzIG5vdCBhIG11bHRpcGxlIG9mCisJICogdGhlICBwYWdlIHNpemUsIHRoZSByZW1haW5pbmcgbWVtb3J5IGlzIHplcm9lZCB3aGVuIG1hcHBlZCwgYW5kCisJICogd3JpdGVzIHRvIHRoYXQgcmVnaW9uIGFyZSBub3Qgd3JpdHRlbiBvdXQgdG8gdGhlIGZpbGUuIgorCSAqLworCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCW1lbXNldChrYWRkciArIG9mZnNldCwgMCwgUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0KTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CitvdXQ6CisJcmV0ID0gbXBhZ2Vfd3JpdGVwYWdlKHBhZ2UsIGdldF9ibG9jaywgd2JjKTsKKwlpZiAocmV0ID09IC1FQUdBSU4pCisJCXJldCA9IF9fYmxvY2tfd3JpdGVfZnVsbF9wYWdlKGlub2RlLCBwYWdlLCBnZXRfYmxvY2ssIHdiYyk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wobm9iaF93cml0ZXBhZ2UpOworCisvKgorICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgLT5wcmVwYXJlX3dyaXRlKCkgdXNlcyBub2JoX3ByZXBhcmVfd3JpdGUoKS4KKyAqLworaW50IG5vYmhfdHJ1bmNhdGVfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IGZyb20pCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJdW5zaWduZWQgYmxvY2tzaXplID0gMSA8PCBpbm9kZS0+aV9ibGtiaXRzOworCXBnb2ZmX3QgaW5kZXggPSBmcm9tID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdW5zaWduZWQgb2Zmc2V0ID0gZnJvbSAmIChQQUdFX0NBQ0hFX1NJWkUtMSk7CisJdW5zaWduZWQgdG87CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyAqYV9vcHMgPSBtYXBwaW5nLT5hX29wczsKKwljaGFyICprYWRkcjsKKwlpbnQgcmV0ID0gMDsKKworCWlmICgob2Zmc2V0ICYgKGJsb2Nrc2l6ZSAtIDEpKSA9PSAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FTk9NRU07CisJcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCk7CisJaWYgKCFwYWdlKQorCQlnb3RvIG91dDsKKworCXRvID0gKG9mZnNldCArIGJsb2Nrc2l6ZSkgJiB+KGJsb2Nrc2l6ZSAtIDEpOworCXJldCA9IGFfb3BzLT5wcmVwYXJlX3dyaXRlKE5VTEwsIHBhZ2UsIG9mZnNldCwgdG8pOworCWlmIChyZXQgPT0gMCkgeworCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtc2V0KGthZGRyICsgb2Zmc2V0LCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQpOworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwl9CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworb3V0OgorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG5vYmhfdHJ1bmNhdGVfcGFnZSk7CisKK2ludCBibG9ja190cnVuY2F0ZV9wYWdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJbG9mZl90IGZyb20sIGdldF9ibG9ja190ICpnZXRfYmxvY2spCit7CisJcGdvZmZfdCBpbmRleCA9IGZyb20gPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBvZmZzZXQgPSBmcm9tICYgKFBBR0VfQ0FDSEVfU0laRS0xKTsKKwl1bnNpZ25lZCBibG9ja3NpemU7CisJcGdvZmZfdCBpYmxvY2s7CisJdW5zaWduZWQgbGVuZ3RoLCBwb3M7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwl2b2lkICprYWRkcjsKKwlpbnQgZXJyOworCisJYmxvY2tzaXplID0gMSA8PCBpbm9kZS0+aV9ibGtiaXRzOworCWxlbmd0aCA9IG9mZnNldCAmIChibG9ja3NpemUgLSAxKTsKKworCS8qIEJsb2NrIGJvdW5kYXJ5PyBOb3RoaW5nIHRvIGRvICovCisJaWYgKCFsZW5ndGgpCisJCXJldHVybiAwOworCisJbGVuZ3RoID0gYmxvY2tzaXplIC0gbGVuZ3RoOworCWlibG9jayA9IGluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cyk7CisJCisJcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIXBhZ2UpCisJCWdvdG8gb3V0OworCisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQorCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBibG9ja3NpemUsIDApOworCisJLyogRmluZCB0aGUgYnVmZmVyIHRoYXQgY29udGFpbnMgIm9mZnNldCIgKi8KKwliaCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlwb3MgPSBibG9ja3NpemU7CisJd2hpbGUgKG9mZnNldCA+PSBwb3MpIHsKKwkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJCWlibG9jaysrOworCQlwb3MgKz0gYmxvY2tzaXplOworCX0KKworCWVyciA9IDA7CisJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkgeworCQllcnIgPSBnZXRfYmxvY2soaW5vZGUsIGlibG9jaywgYmgsIDApOworCQlpZiAoZXJyKQorCQkJZ290byB1bmxvY2s7CisJCS8qIHVubWFwcGVkPyBJdCdzIGEgaG9sZSAtIG5vdGhpbmcgdG8gZG8gKi8KKwkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkKKwkJCWdvdG8gdW5sb2NrOworCX0KKworCS8qIE9rLCBpdCdzIG1hcHBlZC4gTWFrZSBzdXJlIGl0J3MgdXAtdG8tZGF0ZSAqLworCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpCisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCisJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpICYmICFidWZmZXJfZGVsYXkoYmgpKSB7CisJCWVyciA9IC1FSU87CisJCWxsX3J3X2Jsb2NrKFJFQUQsIDEsICZiaCk7CisJCXdhaXRfb25fYnVmZmVyKGJoKTsKKwkJLyogVWhodWguIFJlYWQgZXJyb3IuIENvbXBsYWluIGFuZCBwdW50LiAqLworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQlnb3RvIHVubG9jazsKKwl9CisKKwlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwltZW1zZXQoa2FkZHIgKyBvZmZzZXQsIDAsIGxlbmd0aCk7CisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWVyciA9IDA7CisKK3VubG9jazoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFRoZSBnZW5lcmljIC0+d3JpdGVwYWdlIGZ1bmN0aW9uIGZvciBidWZmZXItYmFja2VkIGFkZHJlc3Nfc3BhY2VzCisgKi8KK2ludCBibG9ja193cml0ZV9mdWxsX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGdldF9ibG9ja190ICpnZXRfYmxvY2ssCisJCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBjb25zdCBpbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJbG9mZl90IGlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwljb25zdCBwZ29mZl90IGVuZF9pbmRleCA9IGlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIG9mZnNldDsKKwl2b2lkICprYWRkcjsKKworCS8qIElzIHRoZSBwYWdlIGZ1bGx5IGluc2lkZSBpX3NpemU/ICovCisJaWYgKHBhZ2UtPmluZGV4IDwgZW5kX2luZGV4KQorCQlyZXR1cm4gX19ibG9ja193cml0ZV9mdWxsX3BhZ2UoaW5vZGUsIHBhZ2UsIGdldF9ibG9jaywgd2JjKTsKKworCS8qIElzIHRoZSBwYWdlIGZ1bGx5IG91dHNpZGUgaV9zaXplPyAodHJ1bmNhdGUgaW4gcHJvZ3Jlc3MpICovCisJb2Zmc2V0ID0gaV9zaXplICYgKFBBR0VfQ0FDSEVfU0laRS0xKTsKKwlpZiAocGFnZS0+aW5kZXggPj0gZW5kX2luZGV4KzEgfHwgIW9mZnNldCkgeworCQkvKgorCQkgKiBUaGUgcGFnZSBtYXkgaGF2ZSBkaXJ0eSwgdW5tYXBwZWQgYnVmZmVycy4gIEZvciBleGFtcGxlLAorCQkgKiB0aGV5IG1heSBoYXZlIGJlZW4gYWRkZWQgaW4gZXh0M193cml0ZXBhZ2UoKS4gIE1ha2UgdGhlbQorCQkgKiBmcmVlYWJsZSBoZXJlLCBzbyB0aGUgcGFnZSBkb2VzIG5vdCBsZWFrLgorCQkgKi8KKwkJYmxvY2tfaW52YWxpZGF0ZXBhZ2UocGFnZSwgMCk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlyZXR1cm4gMDsgLyogZG9uJ3QgY2FyZSAqLworCX0KKworCS8qCisJICogVGhlIHBhZ2Ugc3RyYWRkbGVzIGlfc2l6ZS4gIEl0IG11c3QgYmUgemVyb2VkIG91dCBvbiBlYWNoIGFuZCBldmVyeQorCSAqIHdyaXRlcGFnZSBpbnZva2F0aW9uIGJlY2F1c2UgaXQgbWF5IGJlIG1tYXBwZWQuICAiQSBmaWxlIGlzIG1hcHBlZAorCSAqIGluIG11bHRpcGxlcyBvZiB0aGUgcGFnZSBzaXplLiAgRm9yIGEgZmlsZSB0aGF0IGlzIG5vdCBhIG11bHRpcGxlIG9mCisJICogdGhlICBwYWdlIHNpemUsIHRoZSByZW1haW5pbmcgbWVtb3J5IGlzIHplcm9lZCB3aGVuIG1hcHBlZCwgYW5kCisJICogd3JpdGVzIHRvIHRoYXQgcmVnaW9uIGFyZSBub3Qgd3JpdHRlbiBvdXQgdG8gdGhlIGZpbGUuIgorCSAqLworCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCW1lbXNldChrYWRkciArIG9mZnNldCwgMCwgUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0KTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJcmV0dXJuIF9fYmxvY2tfd3JpdGVfZnVsbF9wYWdlKGlub2RlLCBwYWdlLCBnZXRfYmxvY2ssIHdiYyk7Cit9CisKK3NlY3Rvcl90IGdlbmVyaWNfYmxvY2tfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2ssCisJCQkgICAgZ2V0X2Jsb2NrX3QgKmdldF9ibG9jaykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgdG1wOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXRtcC5iX3N0YXRlID0gMDsKKwl0bXAuYl9ibG9ja25yID0gMDsKKwlnZXRfYmxvY2soaW5vZGUsIGJsb2NrLCAmdG1wLCAwKTsKKwlyZXR1cm4gdG1wLmJfYmxvY2tucjsKK30KKworc3RhdGljIGludCBlbmRfYmlvX2JoX2lvX3N5bmMoc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBpbnQgYnl0ZXNfZG9uZSwgaW50IGVycikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gYmlvLT5iaV9wcml2YXRlOworCisJaWYgKGJpby0+Ymlfc2l6ZSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoZXJyID09IC1FT1BOT1RTVVBQKSB7CisJCXNldF9iaXQoQklPX0VPUE5PVFNVUFAsICZiaW8tPmJpX2ZsYWdzKTsKKwkJc2V0X2JpdChCSF9Fb3Bub3RzdXBwLCAmYmgtPmJfc3RhdGUpOworCX0KKworCWJoLT5iX2VuZF9pbyhiaCwgdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncykpOworCWJpb19wdXQoYmlvKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHN1Ym1pdF9iaChpbnQgcncsIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQoreworCXN0cnVjdCBiaW8gKmJpbzsKKwlpbnQgcmV0ID0gMDsKKworCUJVR19PTighYnVmZmVyX2xvY2tlZChiaCkpOworCUJVR19PTighYnVmZmVyX21hcHBlZChiaCkpOworCUJVR19PTighYmgtPmJfZW5kX2lvKTsKKworCWlmIChidWZmZXJfb3JkZXJlZChiaCkgJiYgKHJ3ID09IFdSSVRFKSkKKwkJcncgPSBXUklURV9CQVJSSUVSOworCisJLyoKKwkgKiBPbmx5IGNsZWFyIG91dCBhIHdyaXRlIGVycm9yIHdoZW4gcmV3cml0aW5nLCBzaG91bGQgdGhpcworCSAqIGluY2x1ZGUgV1JJVEVfU1lOQyBhcyB3ZWxsPworCSAqLworCWlmICh0ZXN0X3NldF9idWZmZXJfcmVxKGJoKSAmJiAocncgPT0gV1JJVEUgfHwgcncgPT0gV1JJVEVfQkFSUklFUikpCisJCWNsZWFyX2J1ZmZlcl93cml0ZV9pb19lcnJvcihiaCk7CisKKwkvKgorCSAqIGZyb20gaGVyZSBvbiBkb3duLCBpdCdzIGFsbCBiaW8gLS0gZG8gdGhlIGluaXRpYWwgbWFwcGluZywKKwkgKiBzdWJtaXRfYmlvIC0+IGdlbmVyaWNfbWFrZV9yZXF1ZXN0IG1heSBmdXJ0aGVyIG1hcCB0aGlzIGJpbyBhcm91bmQKKwkgKi8KKwliaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIDEpOworCisJYmlvLT5iaV9zZWN0b3IgPSBiaC0+Yl9ibG9ja25yICogKGJoLT5iX3NpemUgPj4gOSk7CisJYmlvLT5iaV9iZGV2ID0gYmgtPmJfYmRldjsKKwliaW8tPmJpX2lvX3ZlY1swXS5idl9wYWdlID0gYmgtPmJfcGFnZTsKKwliaW8tPmJpX2lvX3ZlY1swXS5idl9sZW4gPSBiaC0+Yl9zaXplOworCWJpby0+YmlfaW9fdmVjWzBdLmJ2X29mZnNldCA9IGJoX29mZnNldChiaCk7CisKKwliaW8tPmJpX3ZjbnQgPSAxOworCWJpby0+YmlfaWR4ID0gMDsKKwliaW8tPmJpX3NpemUgPSBiaC0+Yl9zaXplOworCisJYmlvLT5iaV9lbmRfaW8gPSBlbmRfYmlvX2JoX2lvX3N5bmM7CisJYmlvLT5iaV9wcml2YXRlID0gYmg7CisKKwliaW9fZ2V0KGJpbyk7CisJc3VibWl0X2JpbyhydywgYmlvKTsKKworCWlmIChiaW9fZmxhZ2dlZChiaW8sIEJJT19FT1BOT1RTVVBQKSkKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisKKwliaW9fcHV0KGJpbyk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBsbF9yd19ibG9jazogbG93LWxldmVsIGFjY2VzcyB0byBibG9jayBkZXZpY2VzIChERVBSRUNBVEVEKQorICogQHJ3OiB3aGV0aGVyIHRvICVSRUFEIG9yICVXUklURSBvciBtYXliZSAlUkVBREEgKHJlYWRhaGVhZCkKKyAqIEBucjogbnVtYmVyIG9mICZzdHJ1Y3QgYnVmZmVyX2hlYWRzIGluIHRoZSBhcnJheQorICogQGJoczogYXJyYXkgb2YgcG9pbnRlcnMgdG8gJnN0cnVjdCBidWZmZXJfaGVhZAorICoKKyAqIGxsX3J3X2Jsb2NrKCkgdGFrZXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gJnN0cnVjdCBidWZmZXJfaGVhZHMsCisgKiBhbmQgcmVxdWVzdHMgYW4gSS9PIG9wZXJhdGlvbiBvbiB0aGVtLCBlaXRoZXIgYSAlUkVBRCBvciBhICVXUklURS4KKyAqIFRoZSB0aGlyZCAlUkVBREEgb3B0aW9uIGlzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKKyAqIGdlbmVyaWNfbWFrZV9yZXF1ZXN0KCkgd2hpY2ggbGxfcndfYmxvY2soKSBjYWxscy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRyb3BzIGFueSBidWZmZXIgdGhhdCBpdCBjYW5ub3QgZ2V0IGEgbG9jayBvbiAod2l0aCB0aGUKKyAqIEJIX0xvY2sgc3RhdGUgYml0KSwgYW55IGJ1ZmZlciB0aGF0IGFwcGVhcnMgdG8gYmUgY2xlYW4gd2hlbiBkb2luZyBhCisgKiB3cml0ZSByZXF1ZXN0LCBhbmQgYW55IGJ1ZmZlciB0aGF0IGFwcGVhcnMgdG8gYmUgdXAtdG8tZGF0ZSB3aGVuIGRvaW5nCisgKiByZWFkIHJlcXVlc3QuICBGdXJ0aGVyIGl0IG1hcmtzIGFzIGNsZWFuIGJ1ZmZlcnMgdGhhdCBhcmUgcHJvY2Vzc2VkIGZvcgorICogd3JpdGluZyAodGhlIGJ1ZmZlciBjYWNoZSB3b24ndCBhc3N1bWUgdGhhdCB0aGV5IGFyZSBhY3R1YWxseSBjbGVhbiB1bnRpbAorICogdGhlIGJ1ZmZlciBnZXRzIHVubG9ja2VkKS4KKyAqCisgKiBsbF9yd19ibG9jayBzZXRzIGJfZW5kX2lvIHRvIHNpbXBsZSBjb21wbGV0aW9uIGhhbmRsZXIgdGhhdCBtYXJrcworICogdGhlIGJ1ZmZlciB1cC10by1kYXRlIChpZiBhcHByb3JpYXRlKSwgdW5sb2NrcyB0aGUgYnVmZmVyIGFuZCB3YWtlcworICogYW55IHdhaXRlcnMuIAorICoKKyAqIEFsbCBvZiB0aGUgYnVmZmVycyBtdXN0IGJlIGZvciB0aGUgc2FtZSBkZXZpY2UsIGFuZCBtdXN0IGFsc28gYmUgYQorICogbXVsdGlwbGUgb2YgdGhlIGN1cnJlbnQgYXBwcm92ZWQgc2l6ZSBmb3IgdGhlIGRldmljZS4KKyAqLwordm9pZCBsbF9yd19ibG9jayhpbnQgcncsIGludCBuciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbXSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBiaHNbaV07CisKKwkJaWYgKHRlc3Rfc2V0X2J1ZmZlcl9sb2NrZWQoYmgpKQorCQkJY29udGludWU7CisKKwkJZ2V0X2JoKGJoKTsKKwkJaWYgKHJ3ID09IFdSSVRFKSB7CisJCQliaC0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX3dyaXRlX3N5bmM7CisJCQlpZiAodGVzdF9jbGVhcl9idWZmZXJfZGlydHkoYmgpKSB7CisJCQkJc3VibWl0X2JoKFdSSVRFLCBiaCk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQliaC0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX3JlYWRfc3luYzsKKwkJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJCXN1Ym1pdF9iaChydywgYmgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCXVubG9ja19idWZmZXIoYmgpOworCQlwdXRfYmgoYmgpOworCX0KK30KKworLyoKKyAqIEZvciBhIGRhdGEtaW50ZWdyaXR5IHdyaXRlb3V0LCB3ZSBuZWVkIHRvIHdhaXQgdXBvbiBhbnkgaW4tcHJvZ3Jlc3MgSS9PCisgKiBhbmQgdGhlbiBzdGFydCBuZXcgSS9PIGFuZCB0aGVuIHdhaXQgdXBvbiBpdC4gIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGEgcmVmIG9uCisgKiB0aGUgYnVmZmVyX2hlYWQuCisgKi8KK2ludCBzeW5jX2RpcnR5X2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWludCByZXQgPSAwOworCisJV0FSTl9PTihhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpIDwgMSk7CisJbG9ja19idWZmZXIoYmgpOworCWlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaCkpIHsKKwkJZ2V0X2JoKGJoKTsKKwkJYmgtPmJfZW5kX2lvID0gZW5kX2J1ZmZlcl93cml0ZV9zeW5jOworCQlyZXQgPSBzdWJtaXRfYmgoV1JJVEUsIGJoKTsKKwkJd2FpdF9vbl9idWZmZXIoYmgpOworCQlpZiAoYnVmZmVyX2VvcG5vdHN1cHAoYmgpKSB7CisJCQljbGVhcl9idWZmZXJfZW9wbm90c3VwcChiaCk7CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJfQorCQlpZiAoIXJldCAmJiAhYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCXJldCA9IC1FSU87CisJfSBlbHNlIHsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB0cnlfdG9fZnJlZV9idWZmZXJzKCkgY2hlY2tzIGlmIGFsbCB0aGUgYnVmZmVycyBvbiB0aGlzIHBhcnRpY3VsYXIgcGFnZQorICogYXJlIHVudXNlZCwgYW5kIHJlbGVhc2VzIHRoZW0gaWYgc28uCisgKgorICogRXhjbHVzaW9uIGFnYWluc3QgdHJ5X3RvX2ZyZWVfYnVmZmVycyBtYXkgYmUgb2J0YWluZWQgYnkgZWl0aGVyCisgKiBsb2NraW5nIHRoZSBwYWdlIG9yIGJ5IGhvbGRpbmcgaXRzIG1hcHBpbmcncyBwcml2YXRlX2xvY2suCisgKgorICogSWYgdGhlIHBhZ2UgaXMgZGlydHkgYnV0IGFsbCB0aGUgYnVmZmVycyBhcmUgY2xlYW4gdGhlbiB3ZSBuZWVkIHRvCisgKiBiZSBzdXJlIHRvIG1hcmsgdGhlIHBhZ2UgY2xlYW4gYXMgd2VsbC4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgcGFnZQorICogbWF5IGJlIGFnYWluc3QgYSBibG9jayBkZXZpY2UsIGFuZCBhIGxhdGVyIHJlYXR0YWNobWVudCBvZiBidWZmZXJzCisgKiB0byBhIGRpcnR5IHBhZ2Ugd2lsbCBzZXQgKmFsbCogYnVmZmVycyBkaXJ0eS4gIFdoaWNoIHdvdWxkIGNvcnJ1cHQKKyAqIGZpbGVzeXN0ZW0gZGF0YSBvbiB0aGUgc2FtZSBkZXZpY2UuCisgKgorICogVGhlIHNhbWUgYXBwbGllcyB0byByZWd1bGFyIGZpbGVzeXN0ZW0gcGFnZXM6IGlmIGFsbCB0aGUgYnVmZmVycyBhcmUKKyAqIGNsZWFuIHRoZW4gd2Ugc2V0IHRoZSBwYWdlIGNsZWFuIGFuZCBwcm9jZWVkLiAgVG8gZG8gdGhhdCwgd2UgcmVxdWlyZQorICogdG90YWwgZXhjbHVzaW9uIGZyb20gX19zZXRfcGFnZV9kaXJ0eV9idWZmZXJzKCkuICBUaGF0IGlzIG9idGFpbmVkIHdpdGgKKyAqIHByaXZhdGVfbG9jay4KKyAqCisgKiB0cnlfdG9fZnJlZV9idWZmZXJzKCkgaXMgbm9uLWJsb2NraW5nLgorICovCitzdGF0aWMgaW5saW5lIGludCBidWZmZXJfYnVzeShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXJldHVybiBhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpIHwKKwkJKGJoLT5iX3N0YXRlICYgKCgxIDw8IEJIX0RpcnR5KSB8ICgxIDw8IEJIX0xvY2spKSk7Cit9CisKK3N0YXRpYyBpbnQKK2Ryb3BfYnVmZmVycyhzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYnVmZmVyc190b19mcmVlKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJYmggPSBoZWFkOworCWRvIHsKKwkJaWYgKGJ1ZmZlcl93cml0ZV9pb19lcnJvcihiaCkpCisJCQlzZXRfYml0KEFTX0VJTywgJnBhZ2UtPm1hcHBpbmctPmZsYWdzKTsKKwkJaWYgKGJ1ZmZlcl9idXN5KGJoKSkKKwkJCWdvdG8gZmFpbGVkOworCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKworCWRvIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXh0ID0gYmgtPmJfdGhpc19wYWdlOworCisJCWlmICghbGlzdF9lbXB0eSgmYmgtPmJfYXNzb2NfYnVmZmVycykpCisJCQlfX3JlbW92ZV9hc3NvY19xdWV1ZShiaCk7CisJCWJoID0gbmV4dDsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKwkqYnVmZmVyc190b19mcmVlID0gaGVhZDsKKwlfX2NsZWFyX3BhZ2VfYnVmZmVycyhwYWdlKTsKKwlyZXR1cm4gMTsKK2ZhaWxlZDoKKwlyZXR1cm4gMDsKK30KKworaW50IHRyeV90b19mcmVlX2J1ZmZlcnMoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiBjb25zdCBtYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJ1ZmZlcnNfdG9fZnJlZSA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpKQorCQlyZXR1cm4gMDsKKworCWlmIChtYXBwaW5nID09IE5VTEwpIHsJCS8qIGNhbiB0aGlzIHN0aWxsIGhhcHBlbj8gKi8KKwkJcmV0ID0gZHJvcF9idWZmZXJzKHBhZ2UsICZidWZmZXJzX3RvX2ZyZWUpOworCQlnb3RvIG91dDsKKwl9CisKKwlzcGluX2xvY2soJm1hcHBpbmctPnByaXZhdGVfbG9jayk7CisJcmV0ID0gZHJvcF9idWZmZXJzKHBhZ2UsICZidWZmZXJzX3RvX2ZyZWUpOworCWlmIChyZXQpIHsKKwkJLyoKKwkJICogSWYgdGhlIGZpbGVzeXN0ZW0gd3JpdGVzIGl0cyBidWZmZXJzIGJ5IGhhbmQgKGVnIGV4dDMpCisJCSAqIHRoZW4gd2UgY2FuIGhhdmUgY2xlYW4gYnVmZmVycyBhZ2FpbnN0IGEgZGlydHkgcGFnZS4gIFdlCisJCSAqIGNsZWFuIHRoZSBwYWdlIGhlcmU7IG90aGVyd2lzZSBsYXRlciByZWF0dGFjaG1lbnQgb2YgYnVmZmVycworCQkgKiBjb3VsZCBlbmNvdW50ZXIgYSBub24tdXB0b2RhdGUgcGFnZSwgd2hpY2ggaXMgdW5yZXNvbHZhYmxlLgorCQkgKiBUaGlzIG9ubHkgYXBwbGllcyBpbiB0aGUgcmFyZSBjYXNlIHdoZXJlIHRyeV90b19mcmVlX2J1ZmZlcnMKKwkJICogc3VjY2VlZHMgYnV0IHRoZSBwYWdlIGlzIG5vdCBmcmVlZC4KKwkJICovCisJCWNsZWFyX3BhZ2VfZGlydHkocGFnZSk7CisJfQorCXNwaW5fdW5sb2NrKCZtYXBwaW5nLT5wcml2YXRlX2xvY2spOworb3V0OgorCWlmIChidWZmZXJzX3RvX2ZyZWUpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGJ1ZmZlcnNfdG9fZnJlZTsKKworCQlkbyB7CisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7CisJCQlmcmVlX2J1ZmZlcl9oZWFkKGJoKTsKKwkJCWJoID0gbmV4dDsKKwkJfSB3aGlsZSAoYmggIT0gYnVmZmVyc190b19mcmVlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodHJ5X3RvX2ZyZWVfYnVmZmVycyk7CisKK2ludCBibG9ja19zeW5jX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisKKwlzbXBfbWIoKTsKKwltYXBwaW5nID0gcGFnZV9tYXBwaW5nKHBhZ2UpOworCWlmIChtYXBwaW5nKQorCQlibGtfcnVuX2JhY2tpbmdfZGV2KG1hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8sIHBhZ2UpOworCXJldHVybiAwOworfQorCisvKgorICogVGhlcmUgYXJlIG5vIGJkZmx1c2ggdHVuYWJsZXMgbGVmdC4gIEJ1dCBkaXN0cmlidXRpb25zIGFyZQorICogc3RpbGwgcnVubmluZyBvYnNvbGV0ZSBmbHVzaCBkYWVtb25zLCBzbyB3ZSB0ZXJtaW5hdGUgdGhlbSBoZXJlLgorICoKKyAqIFVzZSBvZiBiZGZsdXNoKCkgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIGtlcm5lbC4KKyAqIFRoZSBgcGRmbHVzaCcga2VybmVsIHRocmVhZHMgZnVsbHkgcmVwbGFjZSBiZGZsdXNoIGRhZW1vbnMgYW5kIHRoaXMgY2FsbC4KKyAqLworYXNtbGlua2FnZSBsb25nIHN5c19iZGZsdXNoKGludCBmdW5jLCBsb25nIGRhdGEpCit7CisJc3RhdGljIGludCBtc2dfY291bnQ7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAobXNnX2NvdW50IDwgNSkgeworCQltc2dfY291bnQrKzsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIndhcm5pbmc6IHByb2Nlc3MgYCVzJyB1c2VkIHRoZSBvYnNvbGV0ZSBiZGZsdXNoIgorCQkJIiBzeXN0ZW0gY2FsbFxuIiwgY3VycmVudC0+Y29tbSk7CisJCXByaW50ayhLRVJOX0lORk8gIkZpeCB5b3VyIGluaXRzY3JpcHRzP1xuIik7CisJfQorCisJaWYgKGZ1bmMgPT0gMSkKKwkJZG9fZXhpdCgwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEJ1ZmZlci1oZWFkIGFsbG9jYXRpb24KKyAqLworc3RhdGljIGttZW1fY2FjaGVfdCAqYmhfY2FjaGVwOworCisvKgorICogT25jZSB0aGUgbnVtYmVyIG9mIGJoJ3MgaW4gdGhlIG1hY2hpbmUgZXhjZWVkcyB0aGlzIGxldmVsLCB3ZSBzdGFydAorICogc3RyaXBwaW5nIHRoZW0gaW4gd3JpdGViYWNrLgorICovCitzdGF0aWMgaW50IG1heF9idWZmZXJfaGVhZHM7CisKK2ludCBidWZmZXJfaGVhZHNfb3Zlcl9saW1pdDsKKworc3RydWN0IGJoX2FjY291bnRpbmcgeworCWludCBucjsJCQkvKiBOdW1iZXIgb2YgbGl2ZSBiaCdzICovCisJaW50IHJhdGVsaW1pdDsJCS8qIExpbWl0IGNhY2hlbGluZSBib3VuY2luZyAqLworfTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBiaF9hY2NvdW50aW5nLCBiaF9hY2NvdW50aW5nKSA9IHswLCAwfTsKKworc3RhdGljIHZvaWQgcmVjYWxjX2JoX3N0YXRlKHZvaWQpCit7CisJaW50IGk7CisJaW50IHRvdCA9IDA7CisKKwlpZiAoX19nZXRfY3B1X3ZhcihiaF9hY2NvdW50aW5nKS5yYXRlbGltaXQrKyA8IDQwOTYpCisJCXJldHVybjsKKwlfX2dldF9jcHVfdmFyKGJoX2FjY291bnRpbmcpLnJhdGVsaW1pdCA9IDA7CisJZm9yX2VhY2hfY3B1KGkpCisJCXRvdCArPSBwZXJfY3B1KGJoX2FjY291bnRpbmcsIGkpLm5yOworCWJ1ZmZlcl9oZWFkc19vdmVyX2xpbWl0ID0gKHRvdCA+IG1heF9idWZmZXJfaGVhZHMpOworfQorCQorc3RydWN0IGJ1ZmZlcl9oZWFkICphbGxvY19idWZmZXJfaGVhZCh1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqcmV0ID0ga21lbV9jYWNoZV9hbGxvYyhiaF9jYWNoZXAsIGdmcF9mbGFncyk7CisJaWYgKHJldCkgeworCQlwcmVlbXB0X2Rpc2FibGUoKTsKKwkJX19nZXRfY3B1X3ZhcihiaF9hY2NvdW50aW5nKS5ucisrOworCQlyZWNhbGNfYmhfc3RhdGUoKTsKKwkJcHJlZW1wdF9lbmFibGUoKTsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woYWxsb2NfYnVmZmVyX2hlYWQpOworCit2b2lkIGZyZWVfYnVmZmVyX2hlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlCVUdfT04oIWxpc3RfZW1wdHkoJmJoLT5iX2Fzc29jX2J1ZmZlcnMpKTsKKwlrbWVtX2NhY2hlX2ZyZWUoYmhfY2FjaGVwLCBiaCk7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisJX19nZXRfY3B1X3ZhcihiaF9hY2NvdW50aW5nKS5uci0tOworCXJlY2FsY19iaF9zdGF0ZSgpOworCXByZWVtcHRfZW5hYmxlKCk7Cit9CitFWFBPUlRfU1lNQk9MKGZyZWVfYnVmZmVyX2hlYWQpOworCitzdGF0aWMgdm9pZAoraW5pdF9idWZmZXJfaGVhZCh2b2lkICpkYXRhLCBrbWVtX2NhY2hlX3QgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkJCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggPSAoc3RydWN0IGJ1ZmZlcl9oZWFkICopZGF0YTsKKworCQltZW1zZXQoYmgsIDAsIHNpemVvZigqYmgpKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmJoLT5iX2Fzc29jX2J1ZmZlcnMpOworCX0KK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorc3RhdGljIHZvaWQgYnVmZmVyX2V4aXRfY3B1KGludCBjcHUpCit7CisJaW50IGk7CisJc3RydWN0IGJoX2xydSAqYiA9ICZwZXJfY3B1KGJoX2xydXMsIGNwdSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQkhfTFJVX1NJWkU7IGkrKykgeworCQlicmVsc2UoYi0+YmhzW2ldKTsKKwkJYi0+YmhzW2ldID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYnVmZmVyX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJaWYgKGFjdGlvbiA9PSBDUFVfREVBRCkKKwkJYnVmZmVyX2V4aXRfY3B1KCh1bnNpZ25lZCBsb25nKWhjcHUpOworCXJldHVybiBOT1RJRllfT0s7Cit9CisjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCisKK3ZvaWQgX19pbml0IGJ1ZmZlcl9pbml0KHZvaWQpCit7CisJaW50IG5ycGFnZXM7CisKKwliaF9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiYnVmZmVyX2hlYWQiLAorCQkJc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCksIDAsCisJCQlTTEFCX1BBTklDLCBpbml0X2J1ZmZlcl9oZWFkLCBOVUxMKTsKKworCS8qCisJICogTGltaXQgdGhlIGJoIG9jY3VwYW5jeSB0byAxMCUgb2YgWk9ORV9OT1JNQUwKKwkgKi8KKwlucnBhZ2VzID0gKG5yX2ZyZWVfYnVmZmVyX3BhZ2VzKCkgKiAxMCkgLyAxMDA7CisJbWF4X2J1ZmZlcl9oZWFkcyA9IG5ycGFnZXMgKiAoUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCkpOworCWhvdGNwdV9ub3RpZmllcihidWZmZXJfY3B1X25vdGlmeSwgMCk7Cit9CisKK0VYUE9SVF9TWU1CT0woX19iZm9yZ2V0KTsKK0VYUE9SVF9TWU1CT0woX19icmVsc2UpOworRVhQT1JUX1NZTUJPTChfX3dhaXRfb25fYnVmZmVyKTsKK0VYUE9SVF9TWU1CT0woYmxvY2tfY29tbWl0X3dyaXRlKTsKK0VYUE9SVF9TWU1CT0woYmxvY2tfcHJlcGFyZV93cml0ZSk7CitFWFBPUlRfU1lNQk9MKGJsb2NrX3JlYWRfZnVsbF9wYWdlKTsKK0VYUE9SVF9TWU1CT0woYmxvY2tfc3luY19wYWdlKTsKK0VYUE9SVF9TWU1CT0woYmxvY2tfdHJ1bmNhdGVfcGFnZSk7CitFWFBPUlRfU1lNQk9MKGJsb2NrX3dyaXRlX2Z1bGxfcGFnZSk7CitFWFBPUlRfU1lNQk9MKGNvbnRfcHJlcGFyZV93cml0ZSk7CitFWFBPUlRfU1lNQk9MKGVuZF9idWZmZXJfYXN5bmNfd3JpdGUpOworRVhQT1JUX1NZTUJPTChlbmRfYnVmZmVyX3JlYWRfc3luYyk7CitFWFBPUlRfU1lNQk9MKGVuZF9idWZmZXJfd3JpdGVfc3luYyk7CitFWFBPUlRfU1lNQk9MKGZpbGVfZnN5bmMpOworRVhQT1JUX1NZTUJPTChmc3luY19iZGV2KTsKK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19ibG9ja19ibWFwKTsKK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19jb21taXRfd3JpdGUpOworRVhQT1JUX1NZTUJPTChnZW5lcmljX2NvbnRfZXhwYW5kKTsKK0VYUE9SVF9TWU1CT0woaW5pdF9idWZmZXIpOworRVhQT1JUX1NZTUJPTChpbnZhbGlkYXRlX2JkZXYpOworRVhQT1JUX1NZTUJPTChsbF9yd19ibG9jayk7CitFWFBPUlRfU1lNQk9MKG1hcmtfYnVmZmVyX2RpcnR5KTsKK0VYUE9SVF9TWU1CT0woc3VibWl0X2JoKTsKK0VYUE9SVF9TWU1CT0woc3luY19kaXJ0eV9idWZmZXIpOworRVhQT1JUX1NZTUJPTCh1bmxvY2tfYnVmZmVyKTsKZGlmZiAtLWdpdCBhL2ZzL2NoYXJfZGV2LmMgYi9mcy9jaGFyX2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNTdhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaGFyX2Rldi5jCkBAIC0wLDAgKzEsNDQ5IEBACisvKgorICogIGxpbnV4L2ZzL2NoYXJfZGV2LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqX21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKworI2lmZGVmIENPTkZJR19LTU9ECisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qga29ial9tYXAgKmNkZXZfbWFwOworCisvKiBkZWdyYWRlIHRvIGxpbmtlZCBsaXN0IGZvciBzbWFsbCBzeXN0ZW1zICovCisjZGVmaW5lIE1BWF9QUk9CRV9IQVNIIChDT05GSUdfQkFTRV9TTUFMTCA/IDEgOiAyNTUpCisKK3N0YXRpYyBERUNMQVJFX01VVEVYKGNocmRldnNfbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3QgY2hhcl9kZXZpY2Vfc3RydWN0IHsKKwlzdHJ1Y3QgY2hhcl9kZXZpY2Vfc3RydWN0ICpuZXh0OworCXVuc2lnbmVkIGludCBtYWpvcjsKKwl1bnNpZ25lZCBpbnQgYmFzZW1pbm9yOworCWludCBtaW5vcmN0OworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wczsKKwlzdHJ1Y3QgY2RldiAqY2RldjsJCS8qIHdpbGwgZGllICovCit9ICpjaHJkZXZzW01BWF9QUk9CRV9IQVNIXTsKKworLyogaW5kZXggaW4gdGhlIGFib3ZlICovCitzdGF0aWMgaW5saW5lIGludCBtYWpvcl90b19pbmRleChpbnQgbWFqb3IpCit7CisJcmV0dXJuIG1ham9yICUgTUFYX1BST0JFX0hBU0g7Cit9CisKKy8qIGdldCBjaGFyIGRldmljZSBuYW1lcyBpbiBzb21ld2hhdCByYW5kb20gb3JkZXIgKi8KK2ludCBnZXRfY2hyZGV2X2xpc3QoY2hhciAqcGFnZSkKK3sKKwlzdHJ1Y3QgY2hhcl9kZXZpY2Vfc3RydWN0ICpjZDsKKwlpbnQgaSwgbGVuOworCisJbGVuID0gc3ByaW50ZihwYWdlLCAiQ2hhcmFjdGVyIGRldmljZXM6XG4iKTsKKworCWRvd24oJmNocmRldnNfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hyZGV2cykgOyBpKyspIHsKKwkJZm9yIChjZCA9IGNocmRldnNbaV07IGNkOyBjZCA9IGNkLT5uZXh0KQorCQkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIlM2QgJXNcbiIsCisJCQkJICAgICAgIGNkLT5tYWpvciwgY2QtPm5hbWUpOworCX0KKwl1cCgmY2hyZGV2c19sb2NrKTsKKworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBSZWdpc3RlciBhIHNpbmdsZSBtYWpvciB3aXRoIGEgc3BlY2lmaWVkIG1pbm9yIHJhbmdlLgorICoKKyAqIElmIG1ham9yID09IDAgdGhpcyBmdW5jdGlvbnMgd2lsbCBkeW5hbWljYWxseSBhbGxvY2F0ZSBhIG1ham9yIGFuZCByZXR1cm4KKyAqIGl0cyBudW1iZXIuCisgKgorICogSWYgbWFqb3IgPiAwIHRoaXMgZnVuY3Rpb24gd2lsbCBhdHRlbXB0IHRvIHJlc2VydmUgdGhlIHBhc3NlZCByYW5nZSBvZgorICogbWlub3JzIGFuZCB3aWxsIHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MuCisgKgorICogUmV0dXJucyBhIC12ZSBlcnJubyBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgc3RydWN0IGNoYXJfZGV2aWNlX3N0cnVjdCAqCitfX3JlZ2lzdGVyX2NocmRldl9yZWdpb24odW5zaWduZWQgaW50IG1ham9yLCB1bnNpZ25lZCBpbnQgYmFzZW1pbm9yLAorCQkJICAgaW50IG1pbm9yY3QsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGNoYXJfZGV2aWNlX3N0cnVjdCAqY2QsICoqY3A7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwljZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjaGFyX2RldmljZV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2QgPT0gTlVMTCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwltZW1zZXQoY2QsIDAsIHNpemVvZihzdHJ1Y3QgY2hhcl9kZXZpY2Vfc3RydWN0KSk7CisKKwlkb3duKCZjaHJkZXZzX2xvY2spOworCisJLyogdGVtcG9yYXJ5ICovCisJaWYgKG1ham9yID09IDApIHsKKwkJZm9yIChpID0gQVJSQVlfU0laRShjaHJkZXZzKS0xOyBpID4gMDsgaS0tKSB7CisJCQlpZiAoY2hyZGV2c1tpXSA9PSBOVUxMKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPT0gMCkgeworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKwkJbWFqb3IgPSBpOworCQlyZXQgPSBtYWpvcjsKKwl9CisKKwljZC0+bWFqb3IgPSBtYWpvcjsKKwljZC0+YmFzZW1pbm9yID0gYmFzZW1pbm9yOworCWNkLT5taW5vcmN0ID0gbWlub3JjdDsKKwljZC0+bmFtZSA9IG5hbWU7CisKKwlpID0gbWFqb3JfdG9faW5kZXgobWFqb3IpOworCisJZm9yIChjcCA9ICZjaHJkZXZzW2ldOyAqY3A7IGNwID0gJigqY3ApLT5uZXh0KQorCQlpZiAoKCpjcCktPm1ham9yID4gbWFqb3IgfHwKKwkJICAgICgoKmNwKS0+bWFqb3IgPT0gbWFqb3IgJiYgKCpjcCktPmJhc2VtaW5vciA+PSBiYXNlbWlub3IpKQorCQkJYnJlYWs7CisJaWYgKCpjcCAmJiAoKmNwKS0+bWFqb3IgPT0gbWFqb3IgJiYKKwkgICAgKCpjcCktPmJhc2VtaW5vciA8IGJhc2VtaW5vciArIG1pbm9yY3QpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJY2QtPm5leHQgPSAqY3A7CisJKmNwID0gY2Q7CisJdXAoJmNocmRldnNfbG9jayk7CisJcmV0dXJuIGNkOworb3V0OgorCXVwKCZjaHJkZXZzX2xvY2spOworCWtmcmVlKGNkKTsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCitzdGF0aWMgc3RydWN0IGNoYXJfZGV2aWNlX3N0cnVjdCAqCitfX3VucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbih1bnNpZ25lZCBtYWpvciwgdW5zaWduZWQgYmFzZW1pbm9yLCBpbnQgbWlub3JjdCkKK3sKKwlzdHJ1Y3QgY2hhcl9kZXZpY2Vfc3RydWN0ICpjZCA9IE5VTEwsICoqY3A7CisJaW50IGkgPSBtYWpvcl90b19pbmRleChtYWpvcik7CisKKwl1cCgmY2hyZGV2c19sb2NrKTsKKwlmb3IgKGNwID0gJmNocmRldnNbaV07ICpjcDsgY3AgPSAmKCpjcCktPm5leHQpCisJCWlmICgoKmNwKS0+bWFqb3IgPT0gbWFqb3IgJiYKKwkJICAgICgqY3ApLT5iYXNlbWlub3IgPT0gYmFzZW1pbm9yICYmCisJCSAgICAoKmNwKS0+bWlub3JjdCA9PSBtaW5vcmN0KQorCQkJYnJlYWs7CisJaWYgKCpjcCkgeworCQljZCA9ICpjcDsKKwkJKmNwID0gY2QtPm5leHQ7CisJfQorCXVwKCZjaHJkZXZzX2xvY2spOworCXJldHVybiBjZDsKK30KKworaW50IHJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2X3QgZnJvbSwgdW5zaWduZWQgY291bnQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGNoYXJfZGV2aWNlX3N0cnVjdCAqY2Q7CisJZGV2X3QgdG8gPSBmcm9tICsgY291bnQ7CisJZGV2X3QgbiwgbmV4dDsKKworCWZvciAobiA9IGZyb207IG4gPCB0bzsgbiA9IG5leHQpIHsKKwkJbmV4dCA9IE1LREVWKE1BSk9SKG4pKzEsIDApOworCQlpZiAobmV4dCA+IHRvKQorCQkJbmV4dCA9IHRvOworCQljZCA9IF9fcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNQUpPUihuKSwgTUlOT1IobiksCisJCQkgICAgICAgbmV4dCAtIG4sIG5hbWUpOworCQlpZiAoSVNfRVJSKGNkKSkKKwkJCWdvdG8gZmFpbDsKKwl9CisJcmV0dXJuIDA7CitmYWlsOgorCXRvID0gbjsKKwlmb3IgKG4gPSBmcm9tOyBuIDwgdG87IG4gPSBuZXh0KSB7CisJCW5leHQgPSBNS0RFVihNQUpPUihuKSsxLCAwKTsKKwkJa2ZyZWUoX191bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUFKT1IobiksIE1JTk9SKG4pLCBuZXh0IC0gbikpOworCX0KKwlyZXR1cm4gUFRSX0VSUihjZCk7Cit9CisKK2ludCBhbGxvY19jaHJkZXZfcmVnaW9uKGRldl90ICpkZXYsIHVuc2lnbmVkIGJhc2VtaW5vciwgdW5zaWduZWQgY291bnQsCisJCQljb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBjaGFyX2RldmljZV9zdHJ1Y3QgKmNkOworCWNkID0gX19yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKDAsIGJhc2VtaW5vciwgY291bnQsIG5hbWUpOworCWlmIChJU19FUlIoY2QpKQorCQlyZXR1cm4gUFRSX0VSUihjZCk7CisJKmRldiA9IE1LREVWKGNkLT5tYWpvciwgY2QtPmJhc2VtaW5vcik7CisJcmV0dXJuIDA7Cit9CisKK2ludCByZWdpc3Rlcl9jaHJkZXYodW5zaWduZWQgaW50IG1ham9yLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcykKK3sKKwlzdHJ1Y3QgY2hhcl9kZXZpY2Vfc3RydWN0ICpjZDsKKwlzdHJ1Y3QgY2RldiAqY2RldjsKKwljaGFyICpzOworCWludCBlcnIgPSAtRU5PTUVNOworCisJY2QgPSBfX3JlZ2lzdGVyX2NocmRldl9yZWdpb24obWFqb3IsIDAsIDI1NiwgbmFtZSk7CisJaWYgKElTX0VSUihjZCkpCisJCXJldHVybiBQVFJfRVJSKGNkKTsKKwkKKwljZGV2ID0gY2Rldl9hbGxvYygpOworCWlmICghY2RldikKKwkJZ290byBvdXQyOworCisJY2Rldi0+b3duZXIgPSBmb3BzLT5vd25lcjsKKwljZGV2LT5vcHMgPSBmb3BzOworCWtvYmplY3Rfc2V0X25hbWUoJmNkZXYtPmtvYmosICIlcyIsIG5hbWUpOworCWZvciAocyA9IHN0cmNocihrb2JqZWN0X25hbWUoJmNkZXYtPmtvYmopLCcvJyk7IHM7IHMgPSBzdHJjaHIocywgJy8nKSkKKwkJKnMgPSAnISc7CisJCQorCWVyciA9IGNkZXZfYWRkKGNkZXYsIE1LREVWKGNkLT5tYWpvciwgMCksIDI1Nik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwljZC0+Y2RldiA9IGNkZXY7CisKKwlyZXR1cm4gbWFqb3IgPyAwIDogY2QtPm1ham9yOworb3V0OgorCWtvYmplY3RfcHV0KCZjZGV2LT5rb2JqKTsKK291dDI6CisJa2ZyZWUoX191bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oY2QtPm1ham9yLCAwLCAyNTYpKTsKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIHVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihkZXZfdCBmcm9tLCB1bnNpZ25lZCBjb3VudCkKK3sKKwlkZXZfdCB0byA9IGZyb20gKyBjb3VudDsKKwlkZXZfdCBuLCBuZXh0OworCisJZm9yIChuID0gZnJvbTsgbiA8IHRvOyBuID0gbmV4dCkgeworCQluZXh0ID0gTUtERVYoTUFKT1IobikrMSwgMCk7CisJCWlmIChuZXh0ID4gdG8pCisJCQluZXh0ID0gdG87CisJCWtmcmVlKF9fdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1BSk9SKG4pLCBNSU5PUihuKSwgbmV4dCAtIG4pKTsKKwl9Cit9CisKK2ludCB1bnJlZ2lzdGVyX2NocmRldih1bnNpZ25lZCBpbnQgbWFqb3IsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGNoYXJfZGV2aWNlX3N0cnVjdCAqY2Q7CisJY2QgPSBfX3VucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihtYWpvciwgMCwgMjU2KTsKKwlpZiAoY2QgJiYgY2QtPmNkZXYpCisJCWNkZXZfZGVsKGNkLT5jZGV2KTsKKwlrZnJlZShjZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2Rldl9sb2NrKTsKKworc3RhdGljIHN0cnVjdCBrb2JqZWN0ICpjZGV2X2dldChzdHJ1Y3QgY2RldiAqcCkKK3sKKwlzdHJ1Y3QgbW9kdWxlICpvd25lciA9IHAtPm93bmVyOworCXN0cnVjdCBrb2JqZWN0ICprb2JqOworCisJaWYgKG93bmVyICYmICF0cnlfbW9kdWxlX2dldChvd25lcikpCisJCXJldHVybiBOVUxMOworCWtvYmogPSBrb2JqZWN0X2dldCgmcC0+a29iaik7CisJaWYgKCFrb2JqKQorCQltb2R1bGVfcHV0KG93bmVyKTsKKwlyZXR1cm4ga29iajsKK30KKwordm9pZCBjZGV2X3B1dChzdHJ1Y3QgY2RldiAqcCkKK3sKKwlpZiAocCkgeworCQlrb2JqZWN0X3B1dCgmcC0+a29iaik7CisJCW1vZHVsZV9wdXQocC0+b3duZXIpOworCX0KK30KKworLyoKKyAqIENhbGxlZCBldmVyeSB0aW1lIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSBpcyBvcGVuZWQKKyAqLworaW50IGNocmRldl9vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IGNkZXYgKnA7CisJc3RydWN0IGNkZXYgKm5ldyA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2soJmNkZXZfbG9jayk7CisJcCA9IGlub2RlLT5pX2NkZXY7CisJaWYgKCFwKSB7CisJCXN0cnVjdCBrb2JqZWN0ICprb2JqOworCQlpbnQgaWR4OworCQlzcGluX3VubG9jaygmY2Rldl9sb2NrKTsKKwkJa29iaiA9IGtvYmpfbG9va3VwKGNkZXZfbWFwLCBpbm9kZS0+aV9yZGV2LCAmaWR4KTsKKwkJaWYgKCFrb2JqKQorCQkJcmV0dXJuIC1FTlhJTzsKKwkJbmV3ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBjZGV2LCBrb2JqKTsKKwkJc3Bpbl9sb2NrKCZjZGV2X2xvY2spOworCQlwID0gaW5vZGUtPmlfY2RldjsKKwkJaWYgKCFwKSB7CisJCQlpbm9kZS0+aV9jZGV2ID0gcCA9IG5ldzsKKwkJCWlub2RlLT5pX2NpbmRleCA9IGlkeDsKKwkJCWxpc3RfYWRkKCZpbm9kZS0+aV9kZXZpY2VzLCAmcC0+bGlzdCk7CisJCQluZXcgPSBOVUxMOworCQl9IGVsc2UgaWYgKCFjZGV2X2dldChwKSkKKwkJCXJldCA9IC1FTlhJTzsKKwl9IGVsc2UgaWYgKCFjZGV2X2dldChwKSkKKwkJcmV0ID0gLUVOWElPOworCXNwaW5fdW5sb2NrKCZjZGV2X2xvY2spOworCWNkZXZfcHV0KG5ldyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlmaWxwLT5mX29wID0gZm9wc19nZXQocC0+b3BzKTsKKwlpZiAoIWZpbHAtPmZfb3ApIHsKKwkJY2Rldl9wdXQocCk7CisJCXJldHVybiAtRU5YSU87CisJfQorCWlmIChmaWxwLT5mX29wLT5vcGVuKSB7CisJCWxvY2tfa2VybmVsKCk7CisJCXJldCA9IGZpbHAtPmZfb3AtPm9wZW4oaW5vZGUsZmlscCk7CisJCXVubG9ja19rZXJuZWwoKTsKKwl9CisJaWYgKHJldCkKKwkJY2Rldl9wdXQocCk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBjZF9mb3JnZXQoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzcGluX2xvY2soJmNkZXZfbG9jayk7CisJbGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfZGV2aWNlcyk7CisJaW5vZGUtPmlfY2RldiA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmNkZXZfbG9jayk7Cit9CisKK3ZvaWQgY2Rldl9wdXJnZShzdHJ1Y3QgY2RldiAqY2RldikKK3sKKwlzcGluX2xvY2soJmNkZXZfbG9jayk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjZGV2LT5saXN0KSkgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCQlpbm9kZSA9IGNvbnRhaW5lcl9vZihjZGV2LT5saXN0Lm5leHQsIHN0cnVjdCBpbm9kZSwgaV9kZXZpY2VzKTsKKwkJbGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfZGV2aWNlcyk7CisJCWlub2RlLT5pX2NkZXYgPSBOVUxMOworCX0KKwlzcGluX3VubG9jaygmY2Rldl9sb2NrKTsKK30KKworLyoKKyAqIER1bW15IGRlZmF1bHQgZmlsZS1vcGVyYXRpb25zOiB0aGUgb25seSB0aGluZyB0aGlzIGRvZXMKKyAqIGlzIGNvbnRhaW4gdGhlIG9wZW4gdGhhdCB0aGVuIGZpbGxzIGluIHRoZSBjb3JyZWN0IG9wZXJhdGlvbnMKKyAqIGRlcGVuZGluZyBvbiB0aGUgc3BlY2lhbCBmaWxlLi4uCisgKi8KK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVmX2Nocl9mb3BzID0geworCS5vcGVuID0gY2hyZGV2X29wZW4sCit9OworCitzdGF0aWMgc3RydWN0IGtvYmplY3QgKmV4YWN0X21hdGNoKGRldl90IGRldiwgaW50ICpwYXJ0LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBjZGV2ICpwID0gZGF0YTsKKwlyZXR1cm4gJnAtPmtvYmo7Cit9CisKK3N0YXRpYyBpbnQgZXhhY3RfbG9jayhkZXZfdCBkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNkZXYgKnAgPSBkYXRhOworCXJldHVybiBjZGV2X2dldChwKSA/IDAgOiAtMTsKK30KKworaW50IGNkZXZfYWRkKHN0cnVjdCBjZGV2ICpwLCBkZXZfdCBkZXYsIHVuc2lnbmVkIGNvdW50KQoreworCXAtPmRldiA9IGRldjsKKwlwLT5jb3VudCA9IGNvdW50OworCXJldHVybiBrb2JqX21hcChjZGV2X21hcCwgZGV2LCBjb3VudCwgTlVMTCwgZXhhY3RfbWF0Y2gsIGV4YWN0X2xvY2ssIHApOworfQorCitzdGF0aWMgdm9pZCBjZGV2X3VubWFwKGRldl90IGRldiwgdW5zaWduZWQgY291bnQpCit7CisJa29ial91bm1hcChjZGV2X21hcCwgZGV2LCBjb3VudCk7Cit9CisKK3ZvaWQgY2Rldl9kZWwoc3RydWN0IGNkZXYgKnApCit7CisJY2Rldl91bm1hcChwLT5kZXYsIHAtPmNvdW50KTsKKwlrb2JqZWN0X3B1dCgmcC0+a29iaik7Cit9CisKKworc3RhdGljIHZvaWQgY2Rldl9kZWZhdWx0X3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJc3RydWN0IGNkZXYgKnAgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGNkZXYsIGtvYmopOworCWNkZXZfcHVyZ2UocCk7Cit9CisKK3N0YXRpYyB2b2lkIGNkZXZfZHluYW1pY19yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCXN0cnVjdCBjZGV2ICpwID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBjZGV2LCBrb2JqKTsKKwljZGV2X3B1cmdlKHApOworCWtmcmVlKHApOworfQorCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBrdHlwZV9jZGV2X2RlZmF1bHQgPSB7CisJLnJlbGVhc2UJPSBjZGV2X2RlZmF1bHRfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGt0eXBlX2NkZXZfZHluYW1pYyA9IHsKKwkucmVsZWFzZQk9IGNkZXZfZHluYW1pY19yZWxlYXNlLAorfTsKKworc3RydWN0IGNkZXYgKmNkZXZfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgY2RldiAqcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHApIHsKKwkJbWVtc2V0KHAsIDAsIHNpemVvZihzdHJ1Y3QgY2RldikpOworCQlwLT5rb2JqLmt0eXBlID0gJmt0eXBlX2NkZXZfZHluYW1pYzsKKwkJSU5JVF9MSVNUX0hFQUQoJnAtPmxpc3QpOworCQlrb2JqZWN0X2luaXQoJnAtPmtvYmopOworCX0KKwlyZXR1cm4gcDsKK30KKwordm9pZCBjZGV2X2luaXQoc3RydWN0IGNkZXYgKmNkZXYsIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMpCit7CisJbWVtc2V0KGNkZXYsIDAsIHNpemVvZiAqY2Rldik7CisJSU5JVF9MSVNUX0hFQUQoJmNkZXYtPmxpc3QpOworCWNkZXYtPmtvYmoua3R5cGUgPSAma3R5cGVfY2Rldl9kZWZhdWx0OworCWtvYmplY3RfaW5pdCgmY2Rldi0+a29iaik7CisJY2Rldi0+b3BzID0gZm9wczsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqZWN0ICpiYXNlX3Byb2JlKGRldl90IGRldiwgaW50ICpwYXJ0LCB2b2lkICpkYXRhKQoreworCWlmIChyZXF1ZXN0X21vZHVsZSgiY2hhci1tYWpvci0lZC0lZCIsIE1BSk9SKGRldiksIE1JTk9SKGRldikpID4gMCkKKwkJLyogTWFrZSBvbGQtc3R5bGUgMi40IGFsaWFzZXMgd29yayAqLworCQlyZXF1ZXN0X21vZHVsZSgiY2hhci1tYWpvci0lZCIsIE1BSk9SKGRldikpOworCXJldHVybiBOVUxMOworfQorCit2b2lkIF9faW5pdCBjaHJkZXZfaW5pdCh2b2lkKQoreworCWNkZXZfbWFwID0ga29ial9tYXBfaW5pdChiYXNlX3Byb2JlLCAmY2hyZGV2c19sb2NrKTsKK30KKworCisvKiBMZXQgbW9kdWxlcyBkbyBjaGFyIGRldiBzdHVmZiAqLworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKTsKK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKTsKK0VYUE9SVF9TWU1CT0woYWxsb2NfY2hyZGV2X3JlZ2lvbik7CitFWFBPUlRfU1lNQk9MKGNkZXZfaW5pdCk7CitFWFBPUlRfU1lNQk9MKGNkZXZfYWxsb2MpOworRVhQT1JUX1NZTUJPTChjZGV2X2RlbCk7CitFWFBPUlRfU1lNQk9MKGNkZXZfYWRkKTsKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfY2hyZGV2KTsKK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9jaHJkZXYpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9BVVRIT1JTIGIvZnMvY2lmcy9BVVRIT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjY2UzNmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL0FVVEhPUlMKQEAgLTAsMCArMSw0MiBAQAorT3JpZ2luYWwgQXV0aG9yCis9PT09PT09PT09PT09PT0KK1N0ZXZlIEZyZW5jaCAoc2ZyZW5jaEBzYW1iYS5vcmcpCisKK1RoZSBhdXRob3Igd2lzaGVzIHRvIGV4cHJlc3MgaGlzIGFwcHJlY2lhdGlvbiBhbmQgdGhhbmtzIHRvOgorQW5kcmV3IFRyaWRnZWxsIChTYW1iYSB0ZWFtKSBmb3IgaGlzIGVhcmx5IHN1Z2dlc3Rpb25zIGFib3V0IHNtYi9jaWZzIFZGUworaW1wcm92ZW1lbnRzLiBUaGFua3MgdG8gSUJNIGZvciBhbGxvd2luZyBtZSB0aGUgdGltZSBhbmQgdGVzdCByZXNvdXJjZXMgdG8gcHVyc3VlCit0aGlzIHByb2plY3QuIEppbSBNY0Rvbm91Z2ggZnJvbSBJQk0gKGFuZCB0aGUgU2FtYmEgVGVhbSkgZm9yIGhpcyBoZWxwLgorVGhlIElCTSBMaW51eCBKRlMgdGVhbSBmb3IgZXhwbGFpbmluZyBtYW55IGVzb3RlcmljIExpbnV4IGZpbGVzeXN0ZW0gZmVhdHVyZXMuCitEYXZlIEJvdXRjaGVyIG9mIElCTSBSb2NoZXN0ZXIgKGF1dGhvciBvZiB0aGUgT1MvNDAwIHNtYi9jaWZzIGZpbGVzeXN0ZW0gY2xpZW50KQorZm9yIHByb3ZpbmcgeWVhcnMgYWdvIHRoYXQgYSB2ZXJ5IGdvb2Qgc21iL2NpZnMgY2xpZW50IGNvdWxkIGJlIGRvbmUgb24gYSBVbml4IGxpa2UgCitvcGVyYXRpbmcgc3lzdGVtLiAgVm9sa2VyIExlbmRlY2tlLCBBbmRyZXcgVHJpZGdlbGwsIFVyYmFuIFdpZG1hcmssIEpvaG4gTmV3YmlnaW4gCithbmQgb3RoZXJzIGZvciB0aGVpciB3b3JrIG9uIHRoZSBMaW51eCBzbWJmcyBtb2R1bGUgb3ZlciB0aGUgeWVhcnMuIFRoYW5rcyB0bwordGhlIG90aGVyIG1lbWJlcnMgb2YgdGhlIFN0b3JhZ2UgTmV0d29yayBJbmR1c3RyeSBBc3NvY2lhdGlvbiBDSUZTIFRlY2huaWNhbAorV29ya2dyb3VwIGZvciB0aGVpciB3b3JrIHNwZWNpZnlpbmcgdGhpcyBoaWdobHkgY29tcGxleCBwcm90b2NvbCBhbmQgZmluYWxseQordGhhbmtzIHRvIHRoZSBTYW1iYSB0ZWFtIGZvciB0aGVpciB0ZWNobmljYWwgYWR2aWNlIGFuZCBlbmNvdXJhZ2VtZW50LgorCitQYXRjaCBDb250cmlidXRvcnMKKy0tLS0tLS0tLS0tLS0tLS0tLQorWndhbmUgTXdhaWthbWJvCitBbmRpIEtsZWVuCitBbXJ1dCBKb3NoaQorU2hvYmhpdCBEYXlhbAorU2VyZ2V5IFZsYXNvdgorUmljaGFyZCBIdWdoZXMKK1l1cnkgVW1hbmV0cworTWFyayBIYW16eQorRG9tZW4gUHVuY2VyCitKZXNwZXIgSnVobAorCitUZXN0IGNhc2UgYW5kIEJ1ZyBSZXBvcnQgY29udHJpYnV0b3JzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGFua3MgdG8gdGhvc2UgaW4gdGhlIGNvbW11bml0eSB3aG8gaGF2ZSBzdWJtaXR0ZWQgZGV0YWlsZWQgYnVnIHJlcG9ydHMKK2FuZCBkZWJ1ZyBvZiBwcm9ibGVtcyB0aGV5IGhhdmUgZm91bmQ6ICBKb2NoZW4gRG9semUsIERhdmlkIEJsYWluZSwKK1JlbmUgU2NoYXJmZSwgTWFydGluIEpvc2Vmc3NvbiwgQWxleGFuZGVyIFdpbGQsIEFudGhvbnkgTGlndW9yaSwKK0xhcnMgTXVsbGVyLCBVcmJhbiBXaWRtYXJrLCBNYXNzaW1pbGlhbm8gRmVycmVybywgSG93YXJkIE93ZW4sCitPbGFmIEtpcmNoLCBLaWVyb24gQnJpZ2dzLCBOaWNrIE1pbGxpbmd0b24gYW5kIG90aGVycy4gQWxzbyBzcGVjaWFsCittZW50aW9uIHRvIHRoZSBTdGFuZm9yZCBDaGVja2VyIChTV0FUKSB3aGljaCBwb2ludGVkIG91dCBtYW55IG1pbm9yCitidWdzIGluIGVycm9yIHBhdGhzLgorCitBbmQgdGhhbmtzIHRvIHRoZSBJQk0gTFRDIGFuZCBQb3dlciB0ZXN0IHRlYW1zIGFuZCBTdVNFIHRlc3RlcnMgZm9yCitmaW5kaW5nIG11bHRpcGxlIGJ1Z3MgZHVyaW5nIGV4Y2VsbGVudCBzdHJlc3MgdGVzdCBydW5zLgpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9DSEFOR0VTIGIvZnMvY2lmcy9DSEFOR0VTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMTZjOGQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL0NIQU5HRVMKQEAgLTAsMCArMSw2NzEgQEAKK1ZlcnNpb24gMS4zMQorLS0tLS0tLS0tLS0tCitGaXggb29wcyBpbiBscyB3aGVuIFRyYW5zYWN0MiBGaW5kRmlyc3QgKG9yIEZpbmROZXh0KSByZXR1cm5zIG1vcmUgdGhhbiBvbmUKK3RyYW5zYWN0IHJlc3BvbnNlIGZvciBhbiBTTUIgcmVxdWVzdCBhbmQgc2VhcmNoIGVudHJ5IHNwbGl0IGFjcm9zcyB0d28gZnJhbWVzLgorRml4IHVwZGF0ZXMgb2YgRE9TIGF0dHJpYnV0ZXMgYW5kIHRpbWUgZmllbGRzIHNvIHRoYXQgZmlsZXMgb24gTlQ0IHNlcnZlcnMKK2RvIG5vdCBnZXQgbWFya2VkIGRlbGV0ZSBvbiBjbG9zZS4gRGlzcGxheSBzaXplcyBvZiBjaWZzIGJ1ZmZlciBwb29scyBpbgorY2lmcyBzdGF0cy4gRml4IG9vcHMgaW4gdW5tb3VudCB3aGVuIGNpZnNkIHRocmVhZCBiZWluZyBraWxsZWQgYnkgCitzaHV0ZG93bi4gQWRkIGdlbmVyaWMgcmVhZHYvd3JpdGV2IGFuZCBhaW8gc3VwcG9ydC4gUmVwb3J0IGlub2RlIG51bWJlcnMgCitjb25zaXN0ZW50bHkgaW4gcmVhZGRpciBhbmQgbG9va3VwICh3aGVuIHNlcnZlcmlubyBtb3VudCBvcHRpb24gaXMKK3NwZWNpZmllZCB1c2UgdGhlIGlub2RlIG51bWJlciB0aGF0IHRoZSBzZXJ2ZXIgcmVwb3J0cyAtIGZvciBib3RoIGxvb2t1cAorYW5kIHJlYWRkaXIsIG90aGVyd2lzZSBieSBkZWZhdWx0IHRoZSBsb2NhbGx5IGdlbmVyYXRlZCBpbm9kZSBudW1iZXIgaXMgdXNlZAorZm9yIGlub2RlcyBjcmVhdGVkIGluIGVpdGhlciBwYXRoIHNpbmNlIHNlcnZlcnMgYXJlIG5vdCBhbHdheXMgYWJsZSB0byAKK3Byb3ZpZGUgdW5pcXVlIGlub2RlIG51bWJlcnMgd2hlbiBleHBvcnRpbmcgbXVsdGlwbGUgdm9sdW1lcyBmcm9tIHVuZGVyIG9uZQorc2hhcmVuYW1lKS4KKworVmVyc2lvbiAxLjMwCistLS0tLS0tLS0tLS0KK0FsbG93IG5ldyBub3VzZXJfeGF0dHIgbW91bnQgcGFybSB0byBkaXNhYmxlIHhhdHRyIHN1cHBvcnQgZm9yIHVzZXIgbmFtZXNwYWNlLgorRG8gbm90IGZsYWcgdXNlcl94YXR0ciBtb3VudCBwYXJtIGluIGRtZXNnLiAgUmV0cnkgZmFpbHVyZXMgc2V0dGluZyBmaWxlIHRpbWUgIAorKG1vc3RseSBhZmZlY3RzIE5UNCBzZXJ2ZXJzKSBieSByZXRyeSB3aXRoIGhhbmRsZSBiYXNlZCBuZXR3b3JrIG9wZXJhdGlvbi4gCitBZGQgbmV3IFBPU0lYIFF1ZXJ5IEZTIEluZm8gZm9yIHJldHVybmluZyBzdGF0ZnMgaW5mbyBtb3JlIGFjY3VyYXRlbHkuCitIYW5kbGUgcGFzc3dvcmRzIHdpdGggbXVsdGlwbGUgY29tbWFzIGluIHRoZW0uCisKK1ZlcnNpb24gMS4yOQorLS0tLS0tLS0tLS0tCitGaXggZGVmYXVsdCBtb2RlIGluIHN5c2ZzIG9mIGNpZnMgbW9kdWxlIHBhcm1zLiAgUmVtb3ZlIG9sZCByZWFkZGlyIHJvdXRpbmUuCitGaXggY2FwYWJpbGl0aWVzIGZsYWdzIGZvciBsYXJnZSByZWFkeCBzbyBhcyB0byBhbGxvdyByZWFkcyBsYXJnZXIgdGhhbiA2NEsuCisKK1ZlcnNpb24gMS4yOAorLS0tLS0tLS0tLS0tCitBZGQgbW9kdWxlIGluaXQgcGFybSBmb3IgbGFyZ2UgU01CIGJ1ZmZlciBzaXplICh0byBhbGxvdyBpdCB0byBiZSBjaGFuZ2VkCitmcm9tIGl0cyBkZWZhdWx0IG9mIDE2Sykgd2hpY2ggaXMgZXNwZWNpYWxseSB1c2VmdWwgZm9yIGxhcmdlIGZpbGUgY29weQord2hlbiBtb3VudGluZyB3aXRoIHRoZSBkaXJlY3RpbyBtb3VudCBvcHRpb24uIEZpeCBvb3BzIGFmdGVyIAorcmV0dXJuaW5nIGZyb20gbW91bnQgd2hlbiBleHBlcmltZW50YWwgRXh0ZW5kZWRTZWN1cml0eSBlbmFibGVkIGFuZAorU3BuZWdvTmVnb3RpYXRlZCByZXR1cm5pbmcgaW52YWxpZCBlcnJvci4gRml4IGNhc2UgdG8gcmV0cnkgYmV0dGVyIHdoZW4gCitwZWVrIHJldHVybnMgZnJvbSAxIHRvIDMgYnl0ZXMgb24gc29ja2V0IHdoaWNoIHNob3VsZCBoYXZlIG1vcmUgZGF0YS4KK0ZpeGVkIHBhdGggYmFzZWQgY2FsbHMgKHN1Y2ggYXMgY2lmcyBsb29rdXApIHRvIGhhbmRsZSBwYXRoIG5hbWVzCitsb25nZXIgdGhhbiA1MzAgKG5vdyBjYW4gaGFuZGxlIFBBVEhfTUFYKS4gRml4IHBhc3MgdGhyb3VnaCBhdXRoZW50aWNhdGlvbgorZnJvbSBTYW1iYSBzZXJ2ZXIgdG8gREMgKFNhbWJhIHJlcXVpcmVkIGR1bW15IExNIHBhc3N3b3JkKS4KKworVmVyc2lvbiAxLjI3CistLS0tLS0tLS0tLS0KK1R1cm4gb2ZmIEROT1RJRlkgKGRpcmVjdG9yeSBjaGFuZ2Ugbm90aWZpY2F0aW9uIHN1cHBvcnQpIGJ5IGRlZmF1bHQKKyh1bmxlc3MgYnVpbHQgd2l0aCB0aGUgZXhwZXJpbWVudGFsIGZsYWcpIHRvIGZpeCBoYW5nIHdpdGggS0RFCitmaWxlIGJyb3dzZXIuIEZpeCBETk9USUZZIGZsYWcgbWFwcGluZ3MuICBGaXggaGFuZyAoaW4gd2FpdF9ldmVudAord2FpdGluZyBvbiBhbiBTTUIgcmVzcG9uc2UpIGluIFNlbmRSZWNlaXZlIHdoZW4gc2Vzc2lvbiBkaWVzIGJ1dAorcmVjb25uZWN0cyBxdWlja2x5IGZyb20gYW5vdGhlciB0YXNrLiAgQWRkIG1vZHVsZSBpbml0ICBwYXJtcyBmb3IKK21pbmltdW0gbnVtYmVyIG9mIGxhcmdlIGFuZCBzbWFsbCBuZXR3b3JrIGJ1ZmZlcnMgaW4gdGhlIGJ1ZmZlciBwb29scywKK2FuZCBmb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyByZXF1ZXN0cy4KKworVmVyc2lvbiAxLjI2CistLS0tLS0tLS0tLS0KK0FkZCBzZXRmYWNsIHN1cHBvcnQgdG8gYWxsb3cgc2V0dGluZyBvZiBBQ0xzIHJlbW90ZWx5IHRvIFNhbWJhIDMuMTAgYW5kIGxhdGVyCithbmQgb3RoZXIgUE9TSVggQ0lGUyBjb21wbGlhbnQgc2VydmVycy4gIEZpeCBlcnJvciBtYXBwaW5nIGZvciBnZXRmYWNsIAordG8gRU9QTk9UU1VQUCB3aGVuIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHBvc2l4IGFjbHMgb24gdGhlIHdpcmUuIEZpeCAKK2ltcHJvcGVybHkgemVyb2VkIGJ1ZmZlciBpbiBDSUZTIFVuaXggZXh0ZW5zaW9ucyBzZXQgdGltZXMgY2FsbC4gCisKK1ZlcnNpb24gMS4yNQorLS0tLS0tLS0tLS0tCitGaXggaW50ZXJuYXRpb25saXphdGlvbiBwcm9ibGVtIGluIGNpZnMgcmVhZGRpciB3aXRoIGZpbGVuYW1lcyB0aGF0IG1hcCB0byAKK2xvbmdlciBVVEY4IHN0cmluZ3MgdGhhbiB0aGUgc3RyaW5nIG9uIHRoZSB3aXJlIHdhcyBpbiBVbmljb2RlLiAgQWRkIHdvcmthcm91bmQKK2ZvciByZWFkZGlyIHRvIG5ldGFwcCBzZXJ2ZXJzLiBGaXggc2VhcmNoIHJld2luZCAoc2VlayBpbnRvIHJlYWRkaXIgdG8gcmV0dXJuIAorbm9uLWNvbnNlY3V0aXZlIGVudHJpZXMpLiAgRG8gbm90IGRvIHJlYWRkaXIgd2hlbiBzZXJ2ZXIgbmVnb3RpYXRlcyAKK2J1ZmZlciBzaXplIHRvIHNtYWxsIHRvIGZpdCBmaWxlbmFtZS4gQWRkIHN1cHBvcnQgZm9yIHJlYWRpbmcgUE9TSVggQUNMcyBmcm9tCit0aGUgc2VydmVyIChhZGQgYWxzbyBhY2wgYW5kIG5vYWNsIG1vdW50IG9wdGlvbnMpLgorCitWZXJzaW9uIDEuMjQKKy0tLS0tLS0tLS0tLQorT3B0aW9uYWxseSBhbGxvdyB1c2luZyBzZXJ2ZXIgc2lkZSBpbm9kZSBudW1iZXJzLCByYXRoZXIgdGhhbiBjbGllbnQgZ2VuZXJhdGVkCitvbmVzIGJ5IHNwZWNpZnlpbmcgbW91bnQgb3B0aW9uICJzZXJ2ZXJpbm8iIC0gdGhpcyBpcyByZXF1aXJlZCBmb3Igc29tZSBhcHBzCit0byB3b3JrIHdoaWNoIGRvdWJsZSBjaGVjayBoYXJkbGlua2VkIGZpbGVzIGFuZCBoYXZlIHBlcnNpc3RlbnQgaW5vZGUgbnVtYmVycy4KKworVmVyc2lvbiAxLjIzCistLS0tLS0tLS0tLS0KK011bHRpcGxlIGJpZ2VuZGlhbiBmaXhlcy4gT24gbGl0dGxlIGVuZGlhbiBzeXN0ZW1zIChmb3IgcmVjb25uZWN0IGFmdGVyCituZXR3b3JrIGZhaWx1cmUpIGZpeCB0Y3Agc2Vzc2lvbiByZWNvbm5lY3QgY29kZSBzbyB3ZSBkbyBub3QgdHJ5IGZpcnN0Cit0byByZWNvbm5lY3Qgb24gcmV2ZXJzZSBvZiBwb3J0IDQ0NS4gVHJlYXQgcmVwYXJzZSBwb2ludHMgKE5URlMganVuY3Rpb25zKQorYXMgZGlyZWN0b3JpZXMgcmF0aGVyIHRoYW4gc3ltbGlua3MgYmVjYXVzZSB3ZSBjYW4gZG8gZm9sbG93IGxpbmsgb24gdGhlbS4KKworVmVyc2lvbiAxLjIyCistLS0tLS0tLS0tLS0KK0FkZCBjb25maWcgb3B0aW9uIHRvIGVuYWJsZSBYQVRUUiAoZXh0ZW5kZWQgYXR0cmlidXRlKSBzdXBwb3J0LCBtYXBwaW5nCit4YXR0ciBuYW1lcyBpbiB0aGUgInVzZXIuIiBuYW1lc3BhY2Ugc3BhY2UgdG8gU01CL0NJRlMgRUFzLiBMb3RzIG9mCittaW5vciBmaXhlcyBwb2ludGVkIG91dCBieSB0aGUgU3RhbmZvcmQgU1dBVCBjaGVja2VyIChtb3N0bHkgbWlzc2luZworb3Igb3V0IG9mIG9yZGVyIE5VTEwgcG9pbnRlciBjaGVja3MgaW4gbGl0dGxlIHVzZWQgZXJyb3IgcGF0aHMpLgorCitWZXJzaW9uIDEuMjEKKy0tLS0tLS0tLS0tLQorQWRkIG5ldyBtb3VudCBwYXJtIHRvIGNvbnRyb2wgd2hldGhlciBtb2RlIGNoZWNrIChnZW5lcmljX3Blcm1pc3Npb24pIGlzIGRvbmUKK29uIHRoZSBjbGllbnQuICBJZiBVbml4IGV4dGVuc2lvbnMgYXJlIGVuYWJsZWQgYW5kIHRoZSB1aWRzIG9uIHRoZSBjbGllbnQKK2FuZCBzZXJ2ZXIgZG8gbm90IG1hdGNoLCBjbGllbnQgcGVybWlzc2lvbiBjaGVja3MgYXJlIG1lYW5pbmdsZXNzIG9uCitzZXJ2ZXIgdWlkcyB0aGF0IGRvIG5vdCBleGlzdCBvbiB0aGUgY2xpZW50ICh0aGlzIGRvZXMgbm90IGFmZmVjdCB0aGUKK25vcm1hbCBBQ0wgY2hlY2sgd2hpY2ggb2NjdXJzIG9uIHRoZSBzZXJ2ZXIpLiAgRml4IGRlZmF1bHQgdWlkCitvbiBta25vZCB0byBtYXRjaCBjcmVhdGUgYW5kIG1rZGlyLiBBZGQgb3B0aW9uYWwgbW91bnQgcGFybSB0byBhbGxvdworb3ZlcnJpZGUgb2YgdGhlIGRlZmF1bHQgdWlkIGJlaGF2aW9yIChpbiB3aGljaCB0aGUgc2VydmVyIHNldHMgdGhlIHVpZAorYW5kIGdpZCBvZiBuZXdseSBjcmVhdGVkIGZpbGVzKS4gTm9ybWFsbHkgZm9yIG5ldHdvcmsgZmlsZXN5c3RlbSBtb3VudHMKK3VzZXIgd2FudCB0aGUgc2VydmVyIHRvIHNldCB0aGUgdWlkL2dpZCBvbiBuZXdseSBjcmVhdGVkIGZpbGVzIChyYXRoZXIgdGhhbiAKK3VzaW5nIHVpZCBvZiB0aGUgY2xpZW50IHByb2Nlc3NlcyB5b3Ugd291bGQgaW4gYSBsb2NhbCBmaWxlc3lzdGVtKS4KKworVmVyc2lvbiAxLjIwCistLS0tLS0tLS0tLS0KK01ha2UgdHJhbnNhY3Rpb24gY291bnRzIG1vcmUgY29uc2lzdGVudC4gTWVyZ2UgL3Byb2MvZnMvY2lmcy9TaW11bHRhbmVvdXNPcHMKK2luZm8gaW50byAvcHJvYy9mcy9jaWZzL0RlYnVnRGF0YS4gIEZpeCBvb3BzIGluIHJhcmUgb29wcyBpbiByZWFkZGlyIAorKGluIGJ1aWxkX3dpbGRjYXJkX3BhdGhfZnJvbV9kZW50cnkpLiAgRml4IG1rbm9kIHRvIHBhc3MgdHlwZSBmaWVsZAorKGJsb2NrL2NoYXIvZmlmbykgcHJvcGVybHkuICBSZW1vdmUgc3B1cmlvdXMgbW91bnQgd2FybmluZyBsb2cgZW50cnkgd2hlbgorY3JlZGVudGlhbHMgcGFzc2VkIGFzIG1vdW50IGFyZ3VtZW50LiBTZXQgbWFqb3IvbWlub3IgZGV2aWNlIG51bWJlciBpbgoraW5vZGUgZm9yIGJsb2NrIGFuZCBjaGFyIGRldmljZXMgd2hlbiB1bml4IGV4dGVuc2lvbnMgZW5hYmxlZC4KKworVmVyc2lvbiAxLjE5CistLS0tLS0tLS0tLS0KK0ZpeCAvcHJvYy9mcy9jaWZzL1N0YXRzIGFuZCBEZWJ1Z0RhdGEgZGlzcGxheSB0byBoYW5kbGUgbGFyZ2VyCithbW91bnRzIG9mIHJldHVybiBkYXRhLiBQcm9wZXJseSBsaW1pdCByZXF1ZXN0cyB0byBNQVhfUkVRICg1MAoraXMgdGhlIHVzdWFsIG1heGltdW0gYWN0aXZlIG11bHRpcGxleCBTTUIvQ0lGUyByZXF1ZXN0cyBwZXIgc2VydmVyKS4KK0RvIG5vdCBraWxsIGNpZnNkIChhbmQgdGh1cyBodXJ0IHRoZSBvdGhlciBTTUIgc2Vzc2lvbikgd2hlbiBtb3JlIHRoYW4gb25lCitzZXNzaW9uIHRvIHRoZSBzYW1lIHNlcnZlciAoYnV0IHdpdGggZGlmZmVyZW50IHVzZXJpZHMpIGV4aXN0cyBhbmQgb25lCitvZiB0aGUgdHdvIHVzZXIncyBzbWIgc2Vzc2lvbnMgaXMgYmVpbmcgcmVtb3ZlZCB3aGlsZSBsZWF2aW5nIHRoZSBvdGhlci4KK0RvIG5vdCBsb29wIHJlY29ubmVjdGluZyBpbiBjaWZzZCBkZW11bHRpcGxleCB0aHJlYWQgd2hlbiBhZG1pbgora2lsbHMgdGhlIHRocmVhZCB3aXRob3V0IGdvaW5nIHRocm91Z2ggdW5tb3VudC4KKworVmVyc2lvbiAxLjE4CistLS0tLS0tLS0tLS0KK0RvIG5vdCByZW5hbWUgaGFyZGxpbmtlZCBmaWxlcyAoc2luY2UgdGhhdCBzaG91bGQgYmUgYSBub29wKS4gRmx1c2gKK2NhY2hlZCB3cml0ZSBiZWhpbmQgZGF0YSB3aGVuIHJlb3BlbmluZyBhIGZpbGUgYWZ0ZXIgc2Vzc2lvbiBhYmVuZCwKK2V4Y2VwdCB3aGVuIGFscmVhZHkgaW4gd3JpdGUuIEdyYWIgcGVyIHNvY2tldCBzZW0gZHVyaW5nIHJlY29ubmVjdCAKK3RvIGF2b2lkIG9vcHMgaW4gc2VuZG1zZyBpZiBvdmVybGFwcGluZyB3aXRoIHJlY29ubmVjdC4gRG8gbm90CityZXNldCBjYWNoZWQgaW5vZGUgZmlsZSBzaXplIG9uIHJlYWRkaXIgZm9yIGZpbGVzIG9wZW4gZm9yIHdyaXRlIG9uIAorY2xpZW50LgorCisKK1ZlcnNpb24gMS4xNworLS0tLS0tLS0tLS0tCitVcGRhdGUgbnVtYmVyIG9mIGJsb2NrcyBpbiBmaWxlIHNvIGR1IGNvbW1hbmQgaXMgaGFwcGllciAoaW4gTGludXggYSBmYWtlCitibG9ja3NpemUgb2YgNTEyIGlzIHJlcXVpcmVkIGZvciBjYWxjdWxhdGluZyBudW1iZXIgb2YgYmxvY2tzIGluIGlub2RlKS4KK0ZpeCBwcmVwYXJlIHdyaXRlIG9mIHBhcnRpYWwgcGFnZXMgdG8gcmVhZCBpbiBkYXRhIGZyb20gc2VydmVyIGlmIHBvc3NpYmxlLgorRml4IHJhY2Ugb24gdGNwU3RhdHVzIGZpZWxkIGJldHdlZW4gdW5tb3VudCBhbmQgcmVjb25uZWN0aW9uIGNvZGUsIGNhdXNpbmcKK2NpZnNkIHByb2Nlc3Mgc29tZXRpbWVzIHRvIGhhbmcgYXJvdW5kIGZvcmV2ZXIuIEltcHJvdmUgb3V0IG9mIG1lbW9yeQorY2hlY2tzIGluIGNpZnNfZmlsbGRpcgorCitWZXJzaW9uIDEuMTYKKy0tLS0tLS0tLS0tLQorRml4IGluY29ycmVjdCBmaWxlIHNpemUgaW4gZmlsZSBoYW5kbGUgYmFzZWQgc2V0YXR0ciBvbiBiaWcgZW5kaWFuIGhhcmR3YXJlLgorRml4IG9vcHMgaW4gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeSB3aGVuIG91dCBvZiBtZW1vcnkuICBBZGQgY2hlY2tzIGZvciBpbnZhbGlkCithbmQgY2xvc2luZyBmaWxlIHN0cnVjdHMgaW4gd3JpdGVwYWdlL3BhcnRpYWxwYWdld3JpdGUuICBBZGQgc3RhdGlzdGljcworZm9yIGVhY2ggbW91bnRlZCBzaGFyZSAobmV3IG1lbnVjb25maWcgb3B0aW9uKS4gRml4IGVuZGlhbm5lc3MgcHJvYmxlbSBpbgordm9sdW1lIGluZm9ybWF0aW9uIGRpc3BsYXllZCBpbiAvcHJvYy9mcy9jaWZzL0RlYnVnRGF0YSAob25seSBhZmZlY3RzCithZmZlY3RzIGJpZyBlbmRpYW4gYXJjaGl0ZWN0dXJlcykuIFByZXZlbnQgcmVuYW1lcyB3aGlsZSBjb25zdHJ1Y3RpbmcKK3BhdGggbmFtZXMgZm9yIG9wZW4sIG1rZGlyIGFuZCBybWRpci4KKworVmVyc2lvbiAxLjE1CistLS0tLS0tLS0tLS0KK0NoYW5nZSB0byBtZW1wb29scyBmb3IgYWxsb2Mgc21iIHJlcXVlc3QgYnVmZmVycyBhbmQgbXVsdGlwbGV4IHN0cnVjdHMKK3RvIGJldHRlciBoYW5kbGUgbG93IG1lbW9yeSBwcm9ibGVtcyAoYW5kIHBvdGVudGlhbCBkZWFkbG9ja3MpLgorCitWZXJzaW9uIDEuMTQKKy0tLS0tLS0tLS0tLQorRml4IGluY29tcGxldGUgbGlzdGluZ3Mgb2YgbGFyZ2UgZGlyZWN0b3JpZXMgb24gU2FtYmEgc2VydmVycyB3aGVuIFVuaXgKK2V4dGVuc2lvbnMgZW5hYmxlZC4gIEZpeCBvb3BzIHdoZW4gc21iX2J1ZmZlciBjYW4gbm90IGJlIGFsbG9jYXRlZC4gRml4CityZW5hbWUgZGVhZGxvY2sgd2hlbiB3cml0aW5nIG91dCBkaXJ0eSBwYWdlcyBhdCBzYW1lIHRpbWUuCisKK1ZlcnNpb24gMS4xMworLS0tLS0tLS0tLS0tCitGaXggb3BlbiBvZiBmaWxlcyBpbiB3aGljaCBPX0NSRUFURSBjYW4gY2F1c2UgdGhlIG1vZGUgdG8gY2hhbmdlIGluCitzb21lIGNhc2VzLiBGaXggY2FzZSBpbiB3aGljaCByZXRyeSBvZiB3cml0ZSBvdmVybGFwcyBmaWxlIGNsb3NlLgorRml4IFBQQzY0IGJ1aWxkIGVycm9yLiAgUmVkdWNlIGV4Y2Vzc2l2ZSBzdGFjayB1c2FnZSBpbiBzbWIgcGFzc3dvcmQKK2hhc2hpbmcuIEZpeCBvdmVyd3JpdGUgb2YgTGludXggdXNlcidzIHZpZXcgb2YgZmlsZSBtb2RlIHRvIFdpbmRvd3Mgc2VydmVycy4KKworVmVyc2lvbiAxLjEyCistLS0tLS0tLS0tLS0KK0ZpeGVzIGZvciBsYXJnZSBmaWxlIGNvcHksIHNpZ25hbCBoYW5kbGluZywgc29ja2V0IHJldHJ5LCBidWZmZXIKK2FsbG9jYXRpb24gYW5kIGxvdyBtZW1vcnkgc2l0dWF0aW9ucy4KKworVmVyc2lvbiAxLjExCistLS0tLS0tLS0tLS0KK0JldHRlciBwb3J0IDEzOSBzdXBwb3J0IHRvIFdpbmRvd3Mgc2VydmVycyAoUkZDMTAwMS9SRkMxMDAyIFNlc3Npb25fSW5pdGlhbGl6ZSkKK2Fsc28gbm93IGFsbG93aW5nIHN1cHBvcnQgZm9yIHNwZWNpZnlpbmcgY2xpZW50IG5ldGJpb3NuYW1lLiAgTlQ0IHN1cHBvcnQgYWRkZWQuCisKK1ZlcnNpb24gMS4xMAorLS0tLS0tLS0tLS0tCitGaXggcmVjb25uZWN0aW9uIChhbmQgY2VydGFpbiBmYWlsZWQgbW91bnRzKSB0byBwcm9wZXJseSB3YWtlIHVwIHRoZQorYmxvY2tlZCB1c2VycyB0aHJlYWQgc28gaXQgZG9lcyBub3Qgc2VlbSBodW5nIChpbiBzb21lIGNhc2VzIHdhcyBibG9ja2VkCit1bnRpbCB0aGUgY2lmcyByZWNlaXZlIHRpbWVvdXQgZXhwaXJlZCkuIEZpeCBzcHVyaW91cyBlcnJvciBsb2dnaW5nCit0byBrZXJuZWwgbG9nIHdoZW4gYXBwbGljYXRpb24gd2l0aCBvcGVuIG5ldHdvcmsgZmlsZXMga2lsbGVkLiAKKworVmVyc2lvbiAxLjA5CistLS0tLS0tLS0tLS0KK0ZpeCAvcHJvYy9mcyBtb2R1bGUgdW5sb2FkIHdhcm5pbmcgbWVzc2FnZSAodGhhdCBjb3VsZCBiZSBsb2dnZWQKK3RvIHRoZSBrZXJuZWwgbG9nKS4gRml4IGludGVybWl0dGVudCBmYWlsdXJlIGluIGNvbm5lY3RhdGhvbgordGVzdDcgKGhhcmRsaW5rIGNvdW50IG5vdCBpbW1lZGlhdGVseSByZWZyZXNoZWQgaW4gY2FzZSBpbiB3aGljaAoraW5vZGUgbWV0YWRhdGEgY2FuIGJlIGluY29ycmVjdGx5IGtlcHQgY2FjaGVkIHdoZW4gdGltZSBuZWFyIHplcm8pCisKK1ZlcnNpb24gMS4wOAorLS0tLS0tLS0tLS0tCitBbGxvdyBmaWxlX21vZGUgYW5kIGRpcl9tb2RlIChzcGVjaWZpZWQgYXQgbW91bnQgdGltZSkgdG8gYmUgZW5mb3JjZWQKK2xvY2FsbHkgKHRoZSBzZXJ2ZXIgYWxyZWFkeSBlbmZvcmNlZCBpdHMgb3duIEFDTHMgdG9vKSBmb3Igc2VydmVycwordGhhdCBkbyBub3QgcmVwb3J0IHRoZSBjb3JyZWN0IG1vZGUgKGRvIG5vdCBzdXBwb3J0IHRoZSAKK0NJRlMgVW5peCBFeHRlbnNpb25zKS4KKworVmVyc2lvbiAxLjA3CistLS0tLS0tLS0tLS0KK0ZpeCBzb21lIHNtYWxsIG1lbW9yeSBsZWFrcyBpbiBzb21lIHVubW91bnQgZXJyb3IgcGF0aHMuIEZpeCBtYWpvciBsZWFrCitvZiBjYWNoZSBwYWdlcyBpbiByZWFkcGFnZXMgY2F1c2luZyBtdWx0aXBsZSByZWFkIG9yaWVudGVkIHN0cmVzcwordGVzdGNhc2VzIChpbmNsdWRpbmcgZnN4LCBhbmQgZXZlbiBsYXJnZSBmaWxlIGNvcHkpIHRvIGZhaWwgb3ZlciB0aW1lLiAKKworVmVyc2lvbiAxLjA2CistLS0tLS0tLS0tLS0KK1NlbmQgTlRDcmVhdGVYIHdpdGggQVRUUl9QT1NJWCBpZiBMaW51eC9Vbml4IGV4dGVuc2lvbnMgbmVnb3RpYXRlZCB3aXRoIHNlcnZlci4KK1RoaXMgYWxsb3dzIGZpbGVzIHRoYXQgZGlmZmVyIG9ubHkgaW4gY2FzZSBhbmQgaW1wcm92ZXMgcGVyZm9ybWFuY2Ugb2YgZmlsZQorY3JlYXRpb24gYW5kIGZpbGUgb3BlbiB0byBzdWNoIHNlcnZlcnMuICBGaXggc2VtYXBob3JlIGNvbmZsaWN0IHdoaWNoIGNhdXNlcyAKK3Nsb3cgZGVsZXRlIG9mIG9wZW4gZmlsZSB0byBTYW1iYSAod2hpY2ggdW5mb3J0dW5hdGVseSBjYW4gY2F1c2UgYW4gb3Bsb2NrCiticmVhayB0byBzZWxmIHdoaWxlIHZmc191bmxpbmsgaGVsZCBpX3NlbSkgd2hpY2ggY2FuIGhhbmcgZm9yIDIwIHNlY29uZHMuCisKK1ZlcnNpb24gMS4wNQorLS0tLS0tLS0tLS0tCitmaXhlcyB0byBjaWZzX3JlYWRwYWdlcyBmb3IgZnN4IHRlc3QgY2FzZQorCitWZXJzaW9uIDEuMDQKKy0tLS0tLS0tLS0tLQorRml4IGNhY2hpbmcgZGF0YSBpbnRlZ3JpdHkgYnVnIHdoZW4gZXh0ZW5kaW5nIGZpbGUgc2l6ZSBlc3BlY2lhbGx5IHdoZW4gbm8KK29wbG9jayBvbiBmaWxlLiAgRml4IHNwdXJpb3VzIGxvZ2dpbmcgb2YgdmFsaWQgYWxyZWFkeSBwYXJzZWQgbW91bnQgb3B0aW9ucwordGhhdCBhcmUgcGFyc2VkIG91dHNpZGUgb2YgdGhlIGNpZnMgdmZzIHN1Y2ggYXMgbm9zdWlkLgorCisKK1ZlcnNpb24gMS4wMworLS0tLS0tLS0tLS0tCitDb25uZWN0IHRvIHNlcnZlciB3aGVuIHBvcnQgbnVtYmVyIG92ZXJyaWRlIG5vdCBzcGVjaWZpZWQsIGFuZCB0Y3AgcG9ydAordW5pdGlhbGl6ZWQuICBSZXNldCBzZWFyY2ggdG8gcmVzdGFydCBhdCBjb3JyZWN0IGZpbGUgd2hlbiBrZXJuZWwgcm91dGluZQorZmlsbGRpciByZXR1cm5zIGVycm9yIGR1cmluZyBsYXJnZSBkaXJlY3Rvcnkgc2VhcmNoZXMgKHJlYWRkaXIpLiAKKworVmVyc2lvbiAxLjAyCistLS0tLS0tLS0tLS0KK0ZpeCBjYWNoaW5nIHByb2JsZW0gd2hlbiBmaWxlcyBvcGVuZWQgYnkgbXVsdGlwbGUgY2xpZW50cyBpbiB3aGljaCAKK3BhZ2UgY2FjaGUgY291bGQgY29udGFpbiBzdGFsZSBkYXRhLCBhbmQgd3JpdGUgdGhyb3VnaCBkaWQKK25vdCBvY2N1ciBvZnRlbiBlbm91Z2ggd2hpbGUgZmlsZSB3YXMgc3RpbGwgb3BlbiB3aGVuIHJlYWQgYWhlYWQKKyhyZWFkIG9wbG9jaykgbm90IGFsbG93ZWQuICBUcmVhdCAic2VwPSIgd2hlbiBmaXJzdCBtb3VudCBvcHRpb24KK2FzIGFuIG92ZXJycmlkZSBvZiBjb21tYSBhcyB0aGUgZGVmYXVsdCBzZXBhcmF0b3IgYmV0d2VlbiBtb3VudAorb3B0aW9ucy4gCisKK1ZlcnNpb24gMS4wMQorLS0tLS0tLS0tLS0tCitBbGxvdyBwYXNzd29yZHMgbG9uZ2VyIHRoYW4gMTYgYnl0ZXMuIEFsbG93IG51bGwgcGFzc3dvcmQgc3RyaW5nLgorCitWZXJzaW9uIDEuMDAKKy0tLS0tLS0tLS0tLQorR3JhY2VmdWxseSBjbGVhbiB1cCBmYWlsZWQgbW91bnRzIHdoZW4gYXR0ZW1wdGluZyB0byBtb3VudCB0byBzZXJ2ZXJzIHN1Y2ggYXMKK1dpbmRvd3MgOTggdGhhdCB0ZXJtaW5hdGUgdGNwIHNlc3Npb25zIGR1cmluZyBwcm90b3RvY29sIG5lZ290aWF0aW9uLiAgSGFuZGxlCitlbWJlZGRlZCBjb21tYXMgaW4gbW91bnQgcGFyc2luZyBvZiBwYXNzd29yZHMuCisKK1ZlcnNpb24gMC45OQorLS0tLS0tLS0tLS0tCitJbnZhbGlkYXRlIGxvY2FsIGlub2RlIGNhY2hlZCBwYWdlcyBvbiBvcGxvY2sgYnJlYWsgYW5kIHdoZW4gbGFzdCBmaWxlCitpbnN0YW5jZSBpcyBjbG9zZWQgc28gdGhhdCB0aGUgY2xpZW50IGRvZXMgbm90IGNvbnRpbnVlIHVzaW5nIHN0YWxlIGxvY2FsCitjb3B5IHJhdGhlciB0aGFuIGxhdGVyIG1vZGlmaWVkIHNlcnZlciBjb3B5IG9mIGZpbGUuICBEbyBub3QgcmVjb25uZWN0Cit3aGVuIHNlcnZlciBkcm9wcyB0aGUgdGNwIHNlc3Npb24gcHJlbWF0dXJlbHkgYmVmb3JlIG5lZ290aWF0ZQorcHJvdG9jb2wgcmVzcG9uc2UuICBGaXggb29wcyBpbiByb2VwZW5fZmlsZSB3aGVuIGRlbnRyeSBmcmVlZC4gIEFsbG93Cit0aGUgc3VwcG9ydCBmb3IgQ0lGUyBVbml4IEV4dGVuc2lvbnMgdG8gYmUgZGlzYWJsZWQgdmlhIHByb2MgaW50ZXJmYWNlLgorCitWZXJzaW9uIDAuOTgKKy0tLS0tLS0tLS0tLQorRml4IGhhbmcgaW4gY29tbWl0X3dyaXRlIGR1cmluZyByZWNvbm5lY3Rpb24gb2Ygb3BlbiBmaWxlcyB1bmRlciBoZWF2eSBsb2FkLgorRml4IHVubG9hZF9ubHMgb29wcyBpbiBhIG1vdW50IGZhaWx1cmUgcGF0aC4gU2VyaWFsaXplIHdyaXRlcyB0byBzYW1lIHNvY2tldAord2hpY2ggYWxzbyBmaXhlcyBhbnkgcG9zc2libGUgcmFjZXMgd2hlbiBjaWZzIHNpZ25hdHVyZXMgYXJlIGVuYWJsZWQgaW4gU01CcworYmVpbmcgc2VudCBvdXQgb2Ygc2lnbmF0dXJlIHNlcXVlbmNlIG51bWJlciBvcmRlci4gICAgCisKK1ZlcnNpb24gMC45NworLS0tLS0tLS0tLS0tCitGaXggYnl0ZSByYW5nZSBsb2NraW5nIGJ1ZyAoZW5kaWFuIHByb2JsZW0pIGNhdXNpbmcgYmFkIG9mZnNldCBhbmQKK2xlbmd0aC4KKworVmVyc2lvbiAwLjk2CistLS0tLS0tLS0tLS0KK0ZpeCBvb3BzIChpbiBzZW5kX3NpZykgY2F1c2VkIGJ5IENJRlMgdW5tb3VudCBjb2RlIHRyeWluZyB0bword2FrZSB1cCB0aGUgZGVtdWx0aXBsZXggdGhyZWFkIGFmdGVyIGl0IGhhZCBleGl0ZWQuIERvIG5vdCBsb2cKK2Vycm9yIG9uIGhhcm1sZXNzIG9wbG9jayByZWxlYXNlIG9mIGNsb3NlZCBoYW5kbGUuCisKK1ZlcnNpb24gMC45NQorLS0tLS0tLS0tLS0tCitGaXggdW5zYWZlIGdsb2JhbCB2YXJpYWJsZSB1c2FnZSBhbmQgcGFzc3dvcmQgaGFzaCBmYWlsdXJlIG9uIGdjYyAzLjMuMQorRml4IHByb2JsZW0gcmVjb25uZWN0aW5nIHNlY29uZGFyeSBtb3VudHMgdG8gc2FtZSBzZXJ2ZXIgYWZ0ZXIgc2Vzc2lvbiAKK2ZhaWx1cmUuICBGaXggaW52YWxpZCBkZW50cnkgLSByYWNlIGluIG1rZGlyIHdoZW4gZGlyZWN0b3J5IGdldHMgY3JlYXRlZAorYnkgYW5vdGhlciBjbGllbnQgYmV0d2VlbiB0aGUgbG9va3VwIGFuZCBta2Rpci4KKyAKK1ZlcnNpb24gMC45NAorLS0tLS0tLS0tLS0tCitGaXggdG8gbGlzdCBwcm9jZXNzaW5nIGluIHJlb3Blbl9maWxlcy4gRml4IHJlY29ubmVjdGlvbiB3aGVuIHNlcnZlciBodW5nCitidXQgdGNwaXAgc2Vzc2lvbiBzdGlsbCBhbGl2ZS4gIFNldCBwcm9wZXIgdGltZW91dCBvbiBzb2NrZXQgcmVhZC4KKworVmVyc2lvbiAwLjkzCistLS0tLS0tLS0tLS0KK0FkZCBtaXNzaW5nIG1vdW50IG9wdGlvbnMgaW5jbHVkaW5nIGlvY2hhcnNldC4gIFNNUCBmaXhlcyBpbiB3cml0ZSBhbmQgb3Blbi4gCitGaXggZXJyb3JzIGluIHJlY29ubmVjdGluZyBhZnRlciBUQ1Agc2Vzc2lvbiBmYWlsdXJlLiAgRml4IG1vZHVsZSB1bmxvYWRpbmcKK29mIGRlZmF1bHQgbmxzIGNvZGVwYWdlCisKK1ZlcnNpb24gMC45MgorLS0tLS0tLS0tLS0tCitBY3RpdmUgc21iIHRyYW5zYWN0aW9ucyBzaG91bGQgbmV2ZXIgZ28gbmVnYXRpdmUgKGZpeCBkb3VibGUgRnJlZVhpZCkuIEZpeAorbGlzdCBwcm9jZXNzaW5nIGluIGZpbGUgcm91dGluZXMuIENoZWNrIHJldHVybiBjb2RlIG9uIGttYWxsb2MgaW4gb3Blbi4KK0ZpeCBzcGlubG9jayB1c2FnZSBmb3IgU01QLgorCitWZXJzaW9uIDAuOTEKKy0tLS0tLS0tLS0tLQorRml4IG9vcHMgaW4gcmVvcGVuX2ZpbGVzIHdoZW4gaW52YWxpZCBkZW50cnkuIGRyb3AgZGVudHJ5IG9uIHNlcnZlciByZW5hbWUgCithbmQgb24gcmV2YWxpZGF0ZSBlcnJvcnMuIEZpeCBjYXNlcyB3aGVyZSBwaWQgaXMgbm93IHRnaWQuICBGaXggcmV0dXJuIGNvZGUKK29uIGNyZWF0ZSBoYXJkIGxpbmsgd2hlbiBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGVtLiAKKworVmVyc2lvbiAwLjkwCistLS0tLS0tLS0tLS0KK0ZpeCBzY2hlZHVsaW5nIHdoaWxlIGF0b21pYyBlcnJvciBpbiBnZXR0aW5nIGlub2RlIGluZm8gb24gbmV3bHkgY3JlYXRlZCBmaWxlLiAKK0ZpeCB0cnVuY2F0ZSBvZiBleGlzdGluZyBmaWxlcyBvcGVuZWQgd2l0aCBPX0NSRUFUIGJ1dCBub3QgT19UUlVOQyBzZXQuCisKK1ZlcnNpb24gMC44OQorLS0tLS0tLS0tLS0tCitGaXggb29wcyBvbiB3cml0ZSB0byBkZWFkIHRjcCBzZXNzaW9uLiBSZW1vdmUgZXJyb3IgbG9nIHdyaXRlIGZvciBjYXNlIHdoZW4gZmlsZSBvcGVuCitPX0NSRUFUIGJ1dCBub3QgT19FWENMCisKK1ZlcnNpb24gMC44OAorLS0tLS0tLS0tLS0tCitGaXggbm9uLVBPU0lYIGJlaGF2aW9yIG9uIHJlbmFtZSBvZiBvcGVuIGZpbGUgYW5kIGRlbGV0ZSBvZiBvcGVuIGZpbGUgYnkgdGFraW5nIAorYWR2YW50YWdlIG9mIHRyYW5zMiBTZXRGaWxlSW5mbyByZW5hbWUgZmFjaWxpdHkgaWYgYXZhaWxhYmxlIG9uIHRhcmdldCBzZXJ2ZXIuCitSZXRyeSBvbiBFTk9TUEMgYW5kIEVBR0FJTiBzb2NrZXQgZXJyb3JzLgorCitWZXJzaW9uIDAuODcKKy0tLS0tLS0tLS0tLQorRml4IG9vcHMgb24gYmlnIGVuZGlhbiByZWFkZGlyLiAgU2V0IGJsa3NpemUgdG8gYmUgZXZlbiBwb3dlciBvZiB0d28gKDIqKmJsa2JpdHMpIHRvIGZpeAorYWxsb2NhdGlvbiBzaXplIG1pc2NhbGN1bGF0aW9uLiBBZnRlciBvcGxvY2sgdG9rZW4gbG9zdCBkbyBub3QgcmVhZCB0aHJvdWdoCitjYWNoZS4gCisKK1ZlcnNpb24gMC44NgorLS0tLS0tLS0tLS0tCitGaXggb29wcyBvbiBlbXB0eSBmaWxlIHJlYWRhaGVhZC4gIEZpeCBmb3IgZmlsZSBzaXplIGhhbmRsaW5nIGZvciBsb2NhbGx5IGNhY2hlZCBmaWxlcy4KKworVmVyc2lvbiAwLjg1CistLS0tLS0tLS0tLS0KK0ZpeCBvb3BzIGluIG1rZGlyIHdoZW4gc2VydmVyIGZhaWxzIHRvIHJldHVybiBpbm9kZSBpbmZvLiBGaXggb29wcyBpbiByZW9wZW5fZmlsZXMKK2R1cmluZyBhdXRvIHJlY29ubmVjdGlvbiB0byBzZXJ2ZXIgYWZ0ZXIgc2VydmVyIHJlY292ZXJlZCBmcm9tIGZhaWx1cmUuCisKK1ZlcnNpb24gMC44NAorLS0tLS0tLS0tLS0tCitGaW5pc2ggc3VwcG9ydCBmb3IgTGludXggMi41IG9wZW4vY3JlYXRlIGNoYW5nZXMsIHdoaWNoIHJlbW92ZXMgdGhlCityZWR1bmRhbnQgTlRDcmVhdGUvUVBhdGhJbmZvL2Nsb3NlIHRoYXQgd2FzIHNlbnQgZHVyaW5nIGZpbGUgY3JlYXRlLgorRW5hYmxlIG9wbG9jayBieSBkZWZhdWx0LiBFbmFibGUgcGFja2V0IHNpZ25pbmcgYnkgZGVmYXVsdCAobmVlZGVkIHRvIAorYWNjZXNzIG1hbnkgcmVjZW50IFdpbmRvd3Mgc2VydmVycykKKworVmVyc2lvbiAwLjgzCistLS0tLS0tLS0tLS0KK0ZpeCBvb3BzIHdoZW4gbW91bnRpbmcgdG8gbG9uZyBzZXJ2ZXIgbmFtZXMgY2F1c2VkIGJ5IGludmVydGVkIHBhcm1zIHRvIGttYWxsb2MuCitGaXggTXVsdGl1c2VyTW91bnQgKC9wcm9jL2ZzL2NpZnMgY29uZmlndXJhdGlvbiBzZXR0aW5nKSBzbyB0aGF0IHdoZW4gZW5hYmxlZAord2Ugd2lsbCBjaG9vc2UgYSBjaWZzIHVzZXIgc2Vzc2lvbiAoc21iIHVpZCkgdGhhdCBiZXR0ZXIgbWF0Y2hlcyB0aGUgbG9jYWwKK3VpZCBpZiBhKSB0aGUgbW91bnQgdWlkIGRvZXMgbm90IG1hdGNoIHRoZSBjdXJyZW50IHVpZCBhbmQgYikgd2UgaGF2ZSBhbm90aGVyCitzZXNzaW9uIHRvIHRoZSBzYW1lIHNlcnZlciAoaXAgYWRkcmVzcykgZm9yIGEgZGlmZmVyZW50IG1vdW50IHdoaWNoCittYXRjaGVzIHRoZSBjdXJyZW50IGxvY2FsIHVpZC4KKworVmVyc2lvbiAwLjgyCistLS0tLS0tLS0tLS0KK0FkZCBzdXBwb3J0IGZvciBta25vZCBvZiBibG9jayBvciBjaGFyYWN0ZXIgZGV2aWNlcy4gIEZpeCBvcGxvY2sKK2NvZGUgKGRpc3RyaWJ1dGVkIGNhY2hpbmcpIHRvIHByb3Blcmx5IHNlbmQgcmVzcG9uc2UgdG8gb3Bsb2NrCiticmVhayBmcm9tIHNlcnZlci4KKworVmVyc2lvbiAwLjgxCistLS0tLS0tLS0tLS0KK0ZpbmlzaCB1cCBDSUZTIHBhY2tldCBkaWdpdGFsIHNpZ25pbmcgZm9yIHRoZSBkZWZhdWx0CitOVExNIHNlY3VyaXR5IGNhc2UuIFRoaXMgc2hvdWxkIGhlbHAgV2luZG93cyAyMDAzCituZXR3b3JrIGludGVyb3BlcmFiaWxpdHkgc2luY2UgaXQgaXMgY29tbW9uIGZvcgorcGFja2V0IHNpZ25pbmcgdG8gYmUgcmVxdWlyZWQgbm93LiBGaXggc3RhdGZzIChzdGF0IC1mKQord2hpY2ggcmVjZW50bHkgc3RhcnRlZCByZXR1cm5pbmcgZXJyb3JzIGR1ZSB0byAKK2ludmFsaWQgdmFsdWUgKC0xIGluc3RlYWQgb2YgMCkgYmVpbmcgc2V0IGluIHRoZQorc3RydWN0IGtzdGF0ZnMgZl9mZmlsZXMgZmllbGQuCisKK1ZlcnNpb24gMC44MAorLS0tLS0tLS0tLS0KK0ZpeCBvb3BzIG9uIHN0b3BwaW5nIG9wbG9jayB0aHJlYWQgd2hlbiByZW1vdmluZyBjaWZzIHdoZW4KK2J1aWx0IGFzIG1vZHVsZS4KKworVmVyc2lvbiAwLjc5CistLS0tLS0tLS0tLS0KK0ZpeCBtb3VudCBvcHRpb25zIGZvciBybyAocmVhZG9ubHkpLCB1aWQsIGdpZCBhbmQgZmlsZSBhbmQgZGlyZWN0b3J5IG1vZGUuIAorCitWZXJzaW9uIDAuNzgKKy0tLS0tLS0tLS0tLQorRml4IGVycm9ycyBkaXNwbGF5ZWQgb24gZmFpbGVkIG1vdW50cyB0byBiZSBtb3JlIHVuZGVyc3RhbmRhYmxlLgorRml4ZWQgdmFyaW91cyBpbmNvcnJlY3Qgb3IgbWlzbGVhZGluZyBzbWIgdG8gcG9zaXggZXJyb3IgY29kZSBtYXBwaW5ncy4KKworVmVyc2lvbiAwLjc3CistLS0tLS0tLS0tLS0KK0ZpeCBkaXNwbGF5IG9mIE5URlMgREZTIGp1bmN0aW9ucyB0byBkaXNwbGF5IGFzIHN5bWxpbmtzLgorVGhleSBhcmUgdGhlIG5ldHdvcmsgZXF1aXZhbGVudC4gIEZpeCBvb3BzIGluIAorY2lmc19wYXJ0aWFscGFnZXdyaXRlIGNhdXNlZCBieSBtaXNzaW5nIHNwaW5sb2NrIHByb3RlY3Rpb24KK29mIG9wZW5maWxlIGxpbmtlZCBsaXN0LiAgQWxsb3cgd3JpdGViZWhpbmQgY2FjaGluZyBlcnJvcnMgdG8gCitiZSByZXR1cm5lZCB0byB0aGUgYXBwbGljYXRpb24gYXQgZmlsZSBjbG9zZS4KKworVmVyc2lvbiAwLjc2CistLS0tLS0tLS0tLS0KK0NsZWFuIHVwIG9wdGlvbnMgZGlzcGxheWVkIGluIC9wcm9jL21vdW50cyBieSBzaG93X29wdGlvbnMgdG8KK2JlIG1vcmUgY29uc2lzdGVudCB3aXRoIG90aGVyIGZpbGVzeXN0ZW1zLgorCitWZXJzaW9uIDAuNzUKKy0tLS0tLS0tLS0tLQorRml4IGRlbGV0ZSBvZiByZWFkb25seSBmaWxlIHRvIFdpbmRvd3Mgc2VydmVycy4gIFJlZmxlY3QKK3ByZXNlbmNlIG9yIGFic2VuY2Ugb2YgcmVhZCBvbmx5IGRvcyBhdHRyaWJ1dGUgaW4gbW9kZQorYml0cyBmb3Igc2VydmVycyB0aGF0IGRvIG5vdCBzdXBwb3J0IENJRlMgVW5peCBleHRlbnNpb25zLgorRml4IHNob3J0ZW5lZCByZXN1bHRzIG9uIHJlYWRkaXIgb2YgbGFyZ2UgZGlyZWN0b3JpZXMgdG8KK3NlcnZlcnMgc3VwcG9ydGluZyBDSUZTIFVuaXggZXh0ZW5zaW9ucyAoY2F1c2VkIGJ5CitpbmNvcnJlY3QgcmVzdW1lIGtleSkuCisKK1ZlcnNpb24gMC43NAorLS0tLS0tLS0tLS0tCitGaXggdHJ1bmNhdGUgYnVnIChzZXQgZmlsZSBzaXplKSB0aGF0IGNvdWxkIGNhdXNlIGhhbmdzIGUuZy4gcnVubmluZyBmc3gKKworVmVyc2lvbiAwLjczCistLS0tLS0tLS0tLS0KK3VubG9hZCBubHMgaWYgbW91bnQgZmFpbHMuCisKK1ZlcnNpb24gMC43MgorLS0tLS0tLS0tLS0tCitBZGQgcmVzdW1lIGtleSBzdXBwb3J0IHRvIHNlYXJjaCAocmVhZGRpcikgY29kZSB0byB3b3JrYXJvdW5kCitXaW5kb3dzIGJ1Zy4gIEFkZCAvcHJvYy9mcy9jaWZzL0xvb2t1cENhY2hlRW5hYmxlIHdoaWNoCithbGxvd3MgZGlzYWJsaW5nIGNhY2hpbmcgb2YgYXR0cmlidXRlIGluZm9ybWF0aW9uIGZvcgorbG9va3Vwcy4KKworVmVyc2lvbiAwLjcxCistLS0tLS0tLS0tLS0KK0FkZCBtb3JlIG9wbG9jayBoYW5kbGluZyAoZGlzdHJpYnV0ZWQgY2FjaGluZyBjb2RlKS4gIFJlbW92ZQorZGVhZCBjb2RlLiAgUmVtb3ZlIGV4Y2Vzc2l2ZSBzdGFjayBzcGFjZSB1dGlsaXphdGlvbiBmcm9tCitzeW1saW5rIHJvdXRpbmVzLgorCitWZXJzaW9uIDAuNzAKKy0tLS0tLS0tLS0tLQorRml4IG9vcHMgaW4gZ2V0IGRmcyByZWZlcnJhbCAodHJpZ2dlcmVkIHdoZW4gbnVsbCBwYXRoIHNlbnQgaW4gdG8KK21vdW50KS4gIEFkZCBzdXBwb3J0IGZvciBvdmVycmlkaW5nIHJzaXplIGF0IG1vdW50IHRpbWUuCisKK1ZlcnNpb24gMC42OQorLS0tLS0tLS0tLS0tCitGaXggYnVmZmVyIG92ZXJydW4gaW4gcmVhZGRpciB3aGljaCBjYXVzZWQgaW50ZXJtaXR0ZW50IGtlcm5lbCBvb3BzZXMuCitGaXggd3JpdGVwYWdlIGNvZGUgdG8gcmVsZWFzZSBrbWFwIG9uIHdyaXRlIGRhdGEuICBBbGxvdyAiLWlwPSIgbmV3IAorbW91bnQgb3B0aW9uIHRvIGJlIHBhc3NlZCBpbiBvbiBwYXJhbWV0ZXIgZGlzdGluY3QgZnJvbSB0aGUgZmlyc3QgcGFydAorKHNlcnZlciBuYW1lIHBvcnRpb24gb2YpIHRoZSBVTkMgbmFtZS4gIEFsbG93IG92ZXJyaWRlIG9mIHRoZQordGNwIHBvcnQgb2YgdGhlIHRhcmdldCBzZXJ2ZXIgdmlhIG5ldyBtb3VudCBvcHRpb24gIi1wb3J0PSIgIAorCitWZXJzaW9uIDAuNjgKKy0tLS0tLS0tLS0tLQorRml4IHNlYXJjaCBoYW5kbGUgbGVhayBvbiByZXdpbmQuICBGaXggc2V0dWlkIGFuZCBnaWQgc28gdGhhdCB0aGV5IGFyZSAKK3JlZmxlY3RlZCBpbiB0aGUgbG9jYWwgaW5vZGUgaW1tZWRpYXRlbHkuICBDbGVhbnVwIG9mIHdoaXRlc3BhY2UKK3RvIG1ha2UgMi40IGFuZCAyLjUgdmVyc2lvbnMgbW9yZSBjb25zaXN0ZW50LgorCisKK1ZlcnNpb24gMC42NworLS0tLS0tLS0tLS0tCitGaXggc2lnbmFsIHNlbmRpbmcgc28gdGhhdCBjYXB0aXZlIHRocmVhZCAoY2lmc2QpIGV4aXRzIG9uIHVtb3VudCAKKyh3aGljaCB3YXMgY2F1c2luZyB0aGUgd2FybmluZyBpbiBrbWVtX2NhY2hlX2ZyZWUgb2YgdGhlIHJlcXVlc3QgYnVmZmVycworYXQgcm1tb2QgdGltZSkuICBUaGlzIGhhZCBicm9rZW4gYXMgYSBzaWRlZWZmZWN0IG9mIHRoZSByZWNlbnQgZ2xvYmFsCitrZXJuZWwgY2hhbmdlIHRvIGRhZW1vbml6ZS4gIEZpeCBtZW1vcnkgbGVhayBpbiByZWFkZGlyIGNvZGUgd2hpY2gKK3Nob3dlZCB1cCBpbiAibHMgLVIiIChhbmQgYXBwbGljYXRpb25zIHRoYXQgZGlkIHNlYXJjaCByZXdpbmRpbmcpLgorCitWZXJzaW9uIDAuNjYKKy0tLS0tLS0tLS0tLQorUmVjb25uZWN0IHRpZHMgYW5kIGZpZHMgYWZ0ZXIgc2Vzc2lvbiByZWNvbm5lY3Rpb24gKHN0aWxsIGRvIG5vdAorcmVjb25uZWN0IGJ5dGUgcmFuZ2UgbG9ja3MgdGhvdWdoKS4gIEZpeCBwcm9ibGVtIGNhY2hpbmcKK2xvb2t1cCBpbmZvcm1hdGlvbiBmb3IgZGlyZWN0b3J5IGlub2RlcywgaW1wcm92aW5nIHBlcmZvcm1hbmNlLAorZXNwZWNpYWxseSBpbiBkZWVwIGRpcmVjdG9yeSB0cmVlcy4gIEZpeCB2YXJpb3VzIGJ1aWxkIHdhcm5pbmdzLgorCitWZXJzaW9uIDAuNjUKKy0tLS0tLS0tLS0tLQorRmluaXNoIGZpeGVzIHRvIGNvbW1pdCB3cml0ZSBmb3IgY2FjaGluZy9yZWFkYWhlYWQgY29uc2lzdGVuY3kuICBmc3ggCitub3cgd29ya3MgdG8gU2FtYmEgc2VydmVycy4gIEZpeCBvb3BzIGNhdXNlZCB3aGVuIHJlYWRhaGVhZAord2FzIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLgorCitWZXJzaW9uIDAuNjQKKy0tLS0tLS0tLS0tLQorRml4IGRhdGEgY29ycnVwdGlvbiAoaW4gcGFydGlhbCBwYWdlIGFmdGVyIHRydW5jYXRlKSB0aGF0IGNhdXNlZCBmc3ggdG8KK2ZhaWwgdG8gV2luZG93cyBzZXJ2ZXJzLiAgQ2xlYW5lZCB1cCBzb21lIGV4dHJhbmVvdXMgZXJyb3IgbG9nZ2luZyBpbgorY29tbW9uIGVycm9yIHBhdGhzLiAgQWRkIGdlbmVyaWMgc2VuZGZpbGUgc3VwcG9ydC4KKworVmVyc2lvbiAwLjYzCistLS0tLS0tLS0tLS0KK0ZpeCBtZW1vcnkgbGVhayBpbiBBbGxvY01pZFFFbnRyeS4KK0ZpbmlzaCByZWNvbm5lY3Rpb24gbG9naWMsIHNvIGNvbm5lY3Rpb24gd2l0aCBzZXJ2ZXIgY2FuIGJlIGRyb3BwZWQKKyhvciBzZXJ2ZXIgcmVib290ZWQpIGFuZCB0aGUgY2lmcyBjbGllbnQgd2lsbCByZWNvbm5lY3QuICAKKworVmVyc2lvbiAwLjYyCistLS0tLS0tLS0tLS0KK0ZpeCB0ZW1wb3Jhcnkgc29ja2V0IGxlYWsgd2hlbiBiYWQgdXNlcmlkIG9yIHBhc3N3b3JkIHNwZWNpZmllZCAKKyhvciBvdGhlciBTTUJTZXNzU2V0dXAgZmFpbHVyZSkuICBJbmNyZWFzZSBtYXhpbXVtIGJ1ZmZlciBzaXplIHRvIHNsaWdodGx5CitvdmVyIDE2SyB0byBhbGxvdyBuZWdvdGlhdGlvbiBvZiB1cCB0byBTYW1iYSBhbmQgV2luZG93cyBzZXJ2ZXIgZGVmYXVsdCByZWFkIAorc2l6ZXMuICBBZGQgc3VwcG9ydCBmb3IgcmVhZHBhZ2VzCisKK1ZlcnNpb24gMC42MQorLS0tLS0tLS0tLS0tCitGaXggb29wcyB3aGVuIHVzZXJuYW1lIG5vdCBwYXNzZWQgaW4gb24gbW91bnQuICBFeHRlbnNpdmUgZml4ZXMgYW5kIGltcHJvdmVtZW50cwordG8gZXJyb3IgbG9nZ2luZyAoc3RyaXAgcmVkdW5kYW50IG5ld2xpbmVzLCBjaGFuZ2UgZGVidWcgbWFjcm9zIHRvIGVuc3VyZSBuZXdsaW5lCitwYXNzZWQgaW4gYW5kIHRvIGJlIG1vcmUgY29uc2lzdGVudCkuICBGaXggd3JpdGVwYWdlIHdyb25nIGZpbGUgaGFuZGxlIHByb2JsZW0sCithIHJlYWRvbmx5IGZpbGUgaGFuZGxlIGNvdWxkIGJlIGluY29ycmVjdGx5IHVzZWQgdG8gYXR0ZW1wdCB0byB3cml0ZSBvdXQKK2ZpbGUgdXBkYXRlcyB0aHJvdWdoIHRoZSBwYWdlIGNhY2hlIHRvIG11bHRpcGx5IG9wZW4gZmlsZXMuICBUaGlzIGNvdWxkIGNhdXNlCit0aGUgaW96b25lIGJlbmNobWFyayB0byBmYWlsIG9uIHRoZSBmd3JpdGUgdGVzdC4gRml4IGJ1ZyBtb3VudGluZyB0d28gZGlmZmVyZW50CitzaGFyZXMgdG8gdGhlIHNhbWUgV2luZG93cyBzZXJ2ZXIgd2hlbiB1c2luZyBkaWZmZXJlbnQgdXNlcm5hbWVzCisoZG9pbmcgdGhpcyB0byBTYW1iYSBzZXJ2ZXJzIHdvcmtlZCBidXQgV2luZG93cyB3YXMgcmVqZWN0aW5nIGl0KSAtIG5vdyBpdCBpcworcG9zc2libGUgdG8gdXNlIGRpZmZlcmVudCB1c2VyaWRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgc2FtZSBzZXJ2ZXIgZnJvbSBhCitMaW51eCBjbGllbnQuIEZpeCBvb3BzIHdoZW4gdHJlZURpc2Nvbm5lY3QgY2FsbGVkIGR1cmluZyB1bm1vdW50IG9uCitwcmV2aW91c2x5IGZyZWVkIHNvY2tldC4KKworVmVyc2lvbiAwLjYwCistLS0tLS0tLS0tLS0KK0ZpeCBvb3BzIGluIHJlYWRwYWdlcyBjYXVzZWQgYnkgbm90IHNldHRpbmcgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIGluIGlub2RlIGluIAorcmFyZSBjb2RlIHBhdGguIAorCitWZXJzaW9uIDAuNTkKKy0tLS0tLS0tLS0tLQorSW5jbHVkZXMgc3VwcG9ydCBmb3IgZGVsZXRpbmcgb2Ygb3BlbiBmaWxlcyBhbmQgcmVuYW1pbmcgb3ZlciBleGlzdGluZyBmaWxlcyAocGVyIFBPU0lYCityZXF1aXJlbWVudCkuICBBZGQgcmVhZGxpbmsgc3VwcG9ydCBmb3IgV2luZG93cyBqdW5jdGlvbiBwb2ludHMgKGRpcmVjdG9yeSBzeW1saW5rcykuCisKK1ZlcnNpb24gMC41OAorLS0tLS0tLS0tLS0tCitDaGFuZ2VkIHJlYWQgYW5kIHdyaXRlIHRvIGdvIHRocm91Z2ggcGFnZWNhY2hlLiBBZGRlZCBhZGRpdGlvbmFsIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucy4KK01lbW9yeSBtYXBwZWQgb3BlcmF0aW9ucyBub3cgd29ya2luZy4KKworVmVyc2lvbiAwLjU3CistLS0tLS0tLS0tLS0KK0FkZGVkIHdyaXRlcGFnZSBjb2RlIGZvciBhZGRpdGlvbmFsIG1lbW9yeSBtYXBwaW5nIHN1cHBvcnQuICBGaXhlZCBsZWFrIGluIHhpZHMgY2F1c2luZwordGhlIHNpbXVsdGFuZW91cyBvcGVyYXRpb25zIGNvdW50ZXIgKC9wcm9jL2ZzL2NpZnMvU2ltdWx0YW5lb3VzT3BzKSB0byBpbmNyZWFzZSBvbiAKK2V2ZXJ5IHN0YXQgY2FsbC4gIEFkZGl0aW9uYWwgZm9ybWF0dGluZyBjbGVhbnVwLiAKKworVmVyc2lvbiAwLjU2CistLS0tLS0tLS0tLS0KK0ZpeCBiaWdlbmRpYW4gYnVnIGluIG9yZGVyIG9mIHRpbWUgY29udmVyc2lvbi4gTWVyZ2UgMi41IHRvIDIuNCB2ZXJzaW9uLiAgRm9ybWF0dGluZyBjbGVhbnVwLiAgIAorCitWZXJzaW9uIDAuNTUKKy0tLS0tLS0tLS0tLQorRml4ZXMgZnJvbSBad2FuZSBNd2Fpa2FtYm8gZm9yIGFkZGluZyBtaXNzaW5nIHJldHVybiBjb2RlIGNoZWNraW5nIGluIGEgZmV3IHBsYWNlcy4KK0Fsc28gaW5jbHVkZWQgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGhpcyBmaXggdG8gcHJvdGVjdCBnbG9iYWwgbGlzdCBtYW5pcHVsYXRpb24gb2YKK3RoZSBzbWIgc2Vzc2lvbiBhbmQgdHJlZSBjb25uZWN0aW9uIGFuZCBtaWQgcmVsYXRlZCBnbG9iYWwgdmFyaWFibGVzLgorCitWZXJzaW9uIDAuNTQKKy0tLS0tLS0tLS0tLQorRml4IHByb2JsZW0gd2l0aCBjYXB0aXZlIHRocmVhZCBoYW5naW5nIGFyb3VuZCBhdCB1bm1vdW50IHRpbWUuICBBZGp1c3QgdG8gMi41LjQyLXByZQorY2hhbmdlcyB0byBzdXBlcmJsb2NrIGxheW91dC4gICBSZW1vdmUgd2FzdGVmdWwgYWxsb2NhdGlvbiBvZiBzbWIgYnVmZmVycyAobm93IHRoZSBzZW5kIAorYnVmZmVyIGlzIHJldXNlZCBmb3IgcmVzcG9uc2VzKS4gIEFkZCBtb3JlIG9wbG9jayBoYW5kbGluZy4gQWRkaXRpb25hbCBtaW5vciBjbGVhbnVwLgorCitWZXJzaW9uIDAuNTMKKy0tLS0tLS0tLS0tLQorTW9yZSBzdHlsaXN0aWMgdXBkYXRlcyB0byBiZXR0ZXIgbWF0Y2gga2VybmVsIHN0eWxlLiAgQWRkIGFkZGl0aW9uYWwgc3RhdGlzdGljcworZm9yIGZpbGVzeXN0ZW0gd2hpY2ggY2FuIGJlIHZpZXdlZCB2aWEgL3Byb2MvZnMvY2lmcy4gIEFkZCBtb3JlIHBpZWNlcyBvZiBOVExNdjIKK2FuZCBDSUZTIFBhY2tldCBTaWduaW5nIGVuYWJsZW1lbnQuCisKK1ZlcnNpb24gMC41MgorLS0tLS0tLS0tLS0tCitSZXBsYWNlIGNhbGwgdG8gc2xlZXBfb24gd2l0aCBzYWZlciB3YWl0X29uX2V2ZW50LgorTWFrZSBzdHlsaXN0aWMgY2hhbmdlcyB0byBiZXR0ZXIgbWF0Y2gga2VybmVsIHN0eWxlIHJlY29tbWVuZGF0aW9ucy4KK1JlbW92ZSBtb3N0IHR5cGVkZWYgdXNhZ2UgKGV4Y2VwdCBmb3IgdGhlIFBEVXMgdGhlbXNlbHZlcykuCisKK1ZlcnNpb24gMC41MQorLS0tLS0tLS0tLS0tCitVcGRhdGUgbW91bnQgc28gdGhlIC11bmMgbW91bnQgb3B0aW9uIGlzIG5vIGxvbmdlciByZXF1aXJlZCAodGhlIGlwIGFkZHJlc3MgY2FuIGJlIHNwZWNpZmllZAoraW4gYSBVTkMgc3R5bGUgZGV2aWNlIG5hbWUuICAgSW1wbGVtZW50YXRpb24gb2YgcmVhZHBhZ2Uvd3JpdGVwYWdlIHN0YXJ0ZWQuCisKK1ZlcnNpb24gMC41MAorLS0tLS0tLS0tLS0tCitGaXggaW50ZXJtaXR0ZW50IHByb2JsZW0gd2l0aCBpbmNvcnJlY3Qgc21iIGhlYWRlciBjaGVja2luZyBvbiBiYWRseSAKK2ZyYWdtZW50ZWQgdGNwIHJlc3BvbnNlcworCitWZXJzaW9uIDAuNDkKKy0tLS0tLS0tLS0tLQorRml4ZXMgdG8gc2V0dGluZyBvZiBhbGxvY2F0aW9uIHNpemUgYW5kIGZpbGUgc2l6ZS4KKworVmVyc2lvbiAwLjQ4CistLS0tLS0tLS0tLS0KK1ZhcmlvdXMgMi41LjM4IGZpeGVzLiAgTm93IHdvcmtzIG9uIDIuNS4zOAorCitWZXJzaW9uIDAuNDcKKy0tLS0tLS0tLS0tLQorUHJlcGFyZSBmb3IgMi41IGtlcm5lbCBtZXJnZS4gIFJlbW92ZSBpZmRlZnMuCisKK1ZlcnNpb24gMC40NgorLS0tLS0tLS0tLS0tCitTb2NrZXQgYnVmZmVyIG1hbmFnZW1lbnQgZml4ZXMuICBGaXggZHVhbCBmcmVlLgorCitWZXJzaW9uIDAuNDUKKy0tLS0tLS0tLS0tLQorVmFyaW91cyBiaWcgZW5kaWFuIGZpeGVzIGZvciBoYXJkbGlua3MgYW5kIHN5bWxpbmtzIGFuZCBhbHNvIGZvciBkZnMuCisKK1ZlcnNpb24gMC40NAorLS0tLS0tLS0tLS0tCitWYXJpb3VzIGJpZyBlbmRpYW4gZml4ZXMgZm9yIHNlcnZlcnMgd2l0aCBVbml4IGV4dGVuc2lvbnMgc3VjaCBhcyBTYW1iYQorCitWZXJzaW9uIDAuNDMKKy0tLS0tLS0tLS0tLQorVmFyaW91cyBGaW5kTmV4dCBmaXhlcyBmb3IgaW5jb3JyZWN0IGZpbGVuYW1lcyBvbiBsYXJnZSBkaXJlY3Rvcnkgc2VhcmNoZXMgb24gYmlnIGVuZGlhbgorY2xpZW50cy4gIGJhc2ljIHBvc2l4IGZpbGUgaS9vIHRlc3RzIG5vdyB3b3JrIG9uIGJpZyBlbmRpYW4gbWFjaGluZXMsIG5vdCBqdXN0IGxlCisKK1ZlcnNpb24gMC40MgorLS0tLS0tLS0tLS0tCitTZXNzaW9uU2V0dXAgYW5kIE5lZ290aWF0ZVByb3RvY29sIG5vdyB3b3JrIGZyb20gQmlnIEVuZGlhbiBtYWNoaW5lcy4KK1ZhcmlvdXMgQmlnIEVuZGlhbiBmaXhlcyBmb3VuZCBkdXJpbmcgdGVzdGluZyBvbiB0aGUgTGludXggb24gMzkwLiAgVmFyaW91cyBmaXhlcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyCit2ZXJzaW9ucyBvZiAyLjQga2VybmVsIChub3cgYnVpbGRzIGFuZCB3b3JrcyBhZ2FpbiBvbiBrZXJuZWxzIGF0IGxlYXN0IGFzIGVhcmx5IGFzIDIuNC43KS4KKworVmVyc2lvbiAwLjQxCistLS0tLS0tLS0tLS0KK1ZhcmlvdXMgbWlub3IgZml4ZXMgZm9yIENvbm5lY3RhdGhvbiBQb3NpeCAiYmFzaWMiIGZpbGUgaS9vIHRlc3Qgc3VpdGUuICBEaXJlY3RvcnkgY2FjaGluZyBmaXhlZCBzbyBoYXJkbGlua2VkCitmaWxlcyBub3cgcmV0dXJuIHRoZSBjb3JyZWN0IHJ1bWJlciBvZiBsaW5rcyBvbiBmc3RhdCBhcyB0aGV5IGFyZSByZXBlYXRlZGx5IGxpbmtlZCBhbmQgdW5saW5rZWQuCisKK1ZlcnNpb24gMC40MAorLS0tLS0tLS0tLS0tCitJbXBsZW1lbnRlZCAiUmF3IiAoaS5lLiBub3QgZW5jYXBzdWxhdGVkIGluIFNQTkVHTykgTlRMTVNTUCAoaS5lLiB0aGUgU2VjdXJpdHkgUHJvdmlkZXIgSW50ZXJmYWNlIHVzZWQgdG8gbmVnb3RpYXRlCitzZXNzaW9uIGFkdmFuY2VkIHNlc3Npb24gYXV0aGVudGljYXRpb24pLiAgUmF3IE5UTE1TU1AgaXMgcHJlZmVycmVkIGJ5IFdpbmRvd3MgMjAwMCBQcm9mZXNzaW9uYWwgYW5kIFdpbmRvd3MgWFAuCitCZWdhbiBpbXBsZW1lbnRpbmcgc3VwcG9ydCBmb3IgU1BORUdPIGVuY2Fwc3VsYXRpb24gb2YgTlRMTVNTUCBiYXNlZCBzZXNzaW9uIGF1dGhlbnRpY2F0aW9uIGJsb2JzCisod2hpY2ggaXMgdGhlIG1lY2hhbmlzbSBwcmVmZXJyZWQgYnkgV2luZG93cyAyMDAwIHNlcnZlciBpbiB0aGUgYWJzZW5jZSBvZiBLZXJiZXJvcykuCisKK1ZlcnNpb24gMC4zOAorLS0tLS0tLS0tLS0tCitJbnRyb2R1Y2VkIG9wdGlvbmFsIG1vdW50IGhlbHBlciB1dGlsaXR5IG1vdW50LmNpZnMgYW5kIG1hZGUgY29yZXEgY2hhbmdlcyB0byBjaWZzIHZmcyB0byBlbmFibGUKK2l0LiBGaXhlZCBhIGZldyBidWdzIGluIHRoZSBERlMgY29kZSAoZS5nLiBiY2MgdHdvIGJ5dGVzIHRvbyBzaG9ydCBhbmQgaW5jb3JyZWN0IHVpZCBpbiBQRFUpLgorCitWZXJzaW9uIDAuMzcKKy0tLS0tLS0tLS0tLQorUmV3cm90ZSBtdWNoIG9mIGNvbm5lY3Rpb24gYW5kIG1vdW50L3VubW91bnQgbG9naWMgdG8gaGFuZGxlIGJ1Z3Mgd2l0aAorbXVsdGlwbGUgdXNlcyB0byBzYW1lIHNoYXJlLCBtdWx0aXBsZSB1c2VycyB0byBzYW1lIHNlcnZlciBldGMuCisKK1ZlcnNpb24gMC4zNgorLS0tLS0tLS0tLS0tCitGaXhlZCBtYWpvciBwcm9ibGVtIHdpdGggZGVudHJ5IGNvcnJ1cHRpb24gKG1pc3NpbmcgY2FsbCB0byBkcHV0KQorCitWZXJzaW9uIDAuMzUKKy0tLS0tLS0tLS0tLQorUmV3cml0ZSBvZiByZWFkZGlyIGNvZGUgdG8gZml4IGJ1Zy4gVmFyaW91cyBmaXhlcyBmb3IgYmlnZW5kaWFuIG1hY2hpbmVzLgorQmVnaW4gYWRkaW5nIG9wbG9jayBzdXBwb3J0LiAgTXVsdGl1c2VybW91bnQgYW5kIG9wbG9ja0VuYWJsZWQgZmxhZ3MgYWRkZWQgdG8gL3Byb2MvZnMvY2lmcworYWx0aG91Z2ggY29ycmVzcG9uZGluZyBmdW5jdGlvbiBub3QgZnVsbHkgaW1wbGVtZW50ZWQgaW4gdGhlIHZmcyB5ZXQKKworVmVyc2lvbiAwLjM0CistLS0tLS0tLS0tLS0KK0ZpeGVkIGRlbnRyeSBjYWNoaW5nIGJ1ZywgbWlzYy4gY2xlYW51cCAKKworVmVyc2lvbiAwLjMzCistLS0tLS0tLS0tLS0KK0ZpeGVkIDIuNSBzdXBwb3J0IHRvIGhhbmRsZSBidWlsZCBhbmQgY29uZmlndXJlIGNoYW5nZXMgYXMgd2VsbCBhcyBtaXNjLiAyLjUgY2hhbmdlcy4gIE5vdyBjYW4gYnVpbGQKK29uIGN1cnJlbnQgMi41IGJldGEgdmVyc2lvbiAoMi41LjI0KSBvZiB0aGUgTGludXgga2VybmVsIGFzIHdlbGwgYXMgb24gMi40IExpbnV4IGtlcm5lbHMuCitTdXBwb3J0IGZvciBTVEFUVVMgY29kZXMgKG5ld2VyIDMyIGJpdCBOVCBlcnJvciBjb2RlcykgYWRkZWQuICBERlMgc3VwcG9ydCBiZWd1biB0byBiZSBhZGRlZC4KKworVmVyc2lvbiAwLjMyCistLS0tLS0tLS0tLS0KK1VuaXggZXh0ZW5zaW9ucyAoc3ltbGluaywgcmVhZGxpbmssIGhhcmRsaW5rLCBjaG1vZCBhbmQgc29tZSBjaGdycCBhbmQgY2hvd24pIGltcGxlbWVudGVkCithbmQgdGVzdGVkIGFnYWluc3QgU2FtYmEgMi4yLjUKKworCitWZXJzaW9uIDAuMzEKKy0tLS0tLS0tLS0tLQorMSkgRml4ZWQgbG9ja3JhbmdlIHRvIGJlIGNvcnJlY3QgKGl0IHdhcyBvbmUgYnl0ZSB0b28gc2hvcnQpCisKKzIpIEZpeGVkIEdFVExLIChpLmUuIHRoZSBmY250bCBjYWxsIHRvIHRlc3QgYSByYW5nZSBvZiBieXRlcyBpbiBhIGZpbGUgdG8gc2VlIGlmIGxvY2tlZCkgdG8gY29ycmVjdGx5IAorc2hvdyByYW5nZSBhcyBsb2NrZWQgd2hlbiB0aGVyZSBpcyBhIGNvbmZsaWN0IHdpdGggYW4gZXhpc3RpbmcgbG9jay4KKworMykgZGVmYXVsdCBmaWxlIHBlcm1zIGFyZSBub3cgMjc2NyAoaW5kaWNhdGluZyBzdXBwb3J0IGZvciBtYW5kYXRvcnkgbG9ja3MpIGluc3RlYWQgb2YgNzc3IGZvciBkaXJlY3RvcmllcworaW4gbW9zdCBjYXNlcy4gIEV2ZW50dWFsbHkgd2lsbCBvZmZlciBvcHRpb25hbCBhYmlsaXR5IHRvIHF1ZXJ5IHNlcnZlciBmb3IgdGhlIGNvcnJlY3QgcGVybXMuCisKKzMpIEZpeGVkIGV2ZW50dWFsIHRyYXAgd2hlbiBtb3VudGluZyB0d2ljZSB0byBkaWZmZXJlbnQgc2hhcmVzIG9uIHRoZSBzYW1lIHNlcnZlciB3aGVuIHRoZSBmaXJzdCBzdWNjZWVkZWQgCitidXQgdGhlIHNlY29uZCBvbmUgd2FzIGludmFsaWQgYW5kIGZhaWxlZCAodGhlIHNlY29uZCBvbmUgd2FzIGluY29ycmVjdGx5IGRpc2Nvbm5lY3RpbmcgdGhlIHRjcCBhbmQgc21iCitzZXNzaW9uKSAKKworNCkgRml4ZWQgZXJyb3IgbG9nZ2luZyBvZiB2YWxpZCBtb3VudCBvcHRpb25zCisKKzUpIFJlbW92ZWQgbG9nZ2luZyBvZiBwYXNzd29yZCBmaWVsZC4KKworNikgTW92ZWQgbmVnb3RpYXRlLCB0cmVlRGlzY29ubmVjdCBhbmQgdWxvZ2dvZmZYIChvbmx5IHRDb254IGFuZCBTZXNzU2V0dXAgcmVtYWluIGluIGNvbm5lY3QuYykgdG8gY2lmc3NtYi5jCithbmQgY2xlYW5lZCB0aGVtIHVwIGFuZCBtYWRlIHRoZW0gbW9yZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgY2lmcyBmdW5jdGlvbnMuIAorCis3KSBTZXJ2ZXIgc3VwcG9ydCBmb3IgVW5peCBleHRlbnNpb25zIGlzIG5vdyBmdWxseSBkZXRlY3RlZCBhbmQgRmluZEZpcnN0IGlzIGltcGxlbWVudGVkIGJvdGggd2F5cyAKKyh3aXRoIG9yIHdpdGhvdXQgVW5peCBleGVudGlvbnMpIGJ1dCBGaW5kTmV4dCBhbmQgUXVlcnlQYXRoSW5mbyB3aXRoIHRoZSBVbml4IGV4dGVuc2lvbnMgYXJlIG5vdCBjb21wbGV0ZWQsCitub3IgaXMgdGhlIHN5bWxpbmsgc3VwcG9ydCB1c2luZyB0aGUgVW5peCBleHRlbnNpb25zCisKKzgpIFN0YXJ0ZWQgYWRkaW5nIHRoZSByZWFkbGluayBhbmQgZm9sbG93X2xpbmsgY29kZSAKKworVmVyc2lvbiAwLjMgCistLS0tLS0tLS0tLQorSW5pdGlhbCBkcm9wCisKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvTWFrZWZpbGUgYi9mcy9jaWZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczODQ5NDcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIworIyBNYWtlZmlsZSBmb3IgTGludXggQ0lGUyBWRlMgY2xpZW50IAorIworb2JqLSQoQ09ORklHX0NJRlMpICs9IGNpZnMubworCitjaWZzLW9ianMgOj0gY2lmc2ZzLm8gY2lmc3NtYi5vIGNpZnNfZGVidWcubyBjb25uZWN0Lm8gZGlyLm8gZmlsZS5vIGlub2RlLm8gbGluay5vIG1pc2MubyBuZXRtaXNjLm8gc21iZGVzLm8gc21iZW5jcnlwdC5vIHRyYW5zcG9ydC5vIGFzbjEubyBtZDQubyBtZDUubyBjaWZzX3VuaWNvZGUubyBudGVyci5vIHhhdHRyLm8gY2lmc2VuY3J5cHQubyBmY250bC5vIHJlYWRkaXIubyBpb2N0bC5vCmRpZmYgLS1naXQgYS9mcy9jaWZzL1JFQURNRSBiL2ZzL2NpZnMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMjBlZGMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL1JFQURNRQpAQCAtMCwwICsxLDQ3NSBAQAorVGhlIENJRlMgVkZTIHN1cHBvcnQgZm9yIExpbnV4IHN1cHBvcnRzIG1hbnkgYWR2YW5jZWQgbmV0d29yayBmaWxlc3lzdGVtIAorZmVhdHVyZXMgc3VjaCBhcyBoZWlyYXJjaGljYWwgZGZzIGxpa2UgbmFtZXNwYWNlLCBoYXJkbGlua3MsIGxvY2tpbmcgYW5kIG1vcmUuICAKK0l0IHdhcyBkZXNpZ25lZCB0byBjb21wbHkgd2l0aCB0aGUgU05JQSBDSUZTIFRlY2huaWNhbCBSZWZlcmVuY2UgKHdoaWNoIAorc3VwZXJzZWRlcyB0aGUgMTk5MiBYL09wZW4gU01CIFN0YW5kYXJkKSBhcyB3ZWxsIGFzIHRvIHBlcmZvcm0gYmVzdCBwcmFjdGljZSAKK3ByYWN0aWNhbCBpbnRlcm9wZXJhYmlsaXR5IHdpdGggV2luZG93cyAyMDAwLCBXaW5kb3dzIFhQLCBTYW1iYSBhbmQgZXF1aXZhbGVudCAKK3NlcnZlcnMuICAKKworRm9yIHF1ZXN0aW9ucyBvciBidWcgcmVwb3J0cyBwbGVhc2UgY29udGFjdDoKKyAgICBzZnJlbmNoQHNhbWJhLm9yZyAoc2ZyZW5jaEB1cy5pYm0uY29tKSAKKworQnVpbGQgaW5zdHJ1Y3Rpb25zOgorPT09PT09PT09PT09PT09PT09CitGb3IgTGludXggMi40OgorMSkgR2V0IHRoZSBrZXJuZWwgc291cmNlIChlLmcuZnJvbSBodHRwOi8vd3d3Lmtlcm5lbC5vcmcpCithbmQgZG93bmxvYWQgdGhlIGNpZnMgdmZzIHNvdXJjZSAoc2VlIHRoZSBwcm9qZWN0IHBhZ2UKK2F0IGh0dHA6Ly91czEuc2FtYmEub3JnL3NhbWJhL0xpbnV4X0NJRlNfY2xpZW50Lmh0bWwpCithbmQgY2hhbmdlIGRpcmVjdG9yeSBpbnRvIHRoZSB0b3Agb2YgdGhlIGtlcm5lbCBkaXJlY3RvcnkKK3RoZW4gcGF0Y2ggdGhlIGtlcm5lbCAoZS5nLiAicGF0Y2ggLXAxIDwgY2lmc18yNC5wYXRjaCIpIAordG8gYWRkIHRoZSBjaWZzIHZmcyB0byB5b3VyIGtlcm5lbCBjb25maWd1cmUgb3B0aW9ucyBpZgoraXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWRkZWQgKGUuZy4gY3VycmVudCBTdVNFIGFuZCBVTAordXNlcnMgZG8gbm90IG5lZWQgdG8gYXBwbHkgdGhlIGNpZnNfMjQucGF0Y2ggc2luY2UgdGhlIGNpZnMgdmZzIGlzCithbHJlYWR5IGluIHRoZSBrZXJuZWwgY29uZmlndXJlIG1lbnUpIGFuZCB0aGVuCitta2RpciBsaW51eC9mcy9jaWZzIGFuZCB0aGVuIGNvcHkgdGhlIGN1cnJlbnQgY2lmcyB2ZnMgZmlsZXMgZnJvbQordGhlIGNpZnMgZG93bmxvYWQgdG8geW91ciBrZXJuZWwgYnVpbGQgZGlyZWN0b3J5IGUuZy4KKworCWNwIDxjaWZzX2Rvd25sb2FkX2Rpcj4vZnMvY2lmcy8qIHRvIDxrZXJuZWxfZG93bmxvYWRfZGlyPi9mcy9jaWZzCisJCisyKSBtYWtlIG1lbnVjb25maWcgKG9yIG1ha2UgeGNvbmZpZykKKzMpIHNlbGVjdCBjaWZzIGZyb20gd2l0aGluIHRoZSBuZXR3b3JrIGZpbGVzeXN0ZW0gY2hvaWNlcworNCkgc2F2ZSBhbmQgZXhpdAorNSkgbWFrZSBkZXAKKzYpIG1ha2UgbW9kdWxlcyAob3IgIm1ha2UiIGlmIENJRlMgVkZTIG5vdCB0byBiZSBidWlsdCBhcyBhIG1vZHVsZSkKKworRm9yIExpbnV4IDIuNjoKKzEpIERvd25sb2FkIHRoZSBrZXJuZWwgKGUuZy4gZnJvbSBodHRwOi8vd3d3Lmtlcm5lbC5vcmcgb3IgZnJvbSBiaXRrZWVwZXIKK2F0IGJrOi8vbGludXguYmtiaXRzLm5ldC9saW51eC0yLjUpIGFuZCBjaGFuZ2UgZGlyZWN0b3J5IGludG8gdGhlIHRvcAorb2YgdGhlIGtlcm5lbCBkaXJlY3RvcnkgdHJlZSAoZS5nLiAvdXNyL3NyYy9saW51eC0yLjUuNzMpCisyKSBtYWtlIG1lbnVjb25maWcgKG9yIG1ha2UgeGNvbmZpZykKKzMpIHNlbGVjdCBjaWZzIGZyb20gd2l0aGluIHRoZSBuZXR3b3JrIGZpbGVzeXN0ZW0gY2hvaWNlcworNCkgc2F2ZSBhbmQgZXhpdAorNSkgbWFrZQorCisKK0luc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnM6Cis9PT09PT09PT09PT09PT09PT09PT09PT09CitJZiB5b3UgaGF2ZSBidWlsdCB0aGUgQ0lGUyB2ZnMgYXMgbW9kdWxlIChzdWNjZXNzZnVsbHkpIHNpbXBseQordHlwZSAibWFrZSBtb2R1bGVzX2luc3RhbGwiIChvciBpZiB5b3UgcHJlZmVyLCBtYW51YWxseSBjb3B5IHRoZSBmaWxlIHRvCit0aGUgbW9kdWxlcyBkaXJlY3RvcnkgZS5nLiAvbGliL21vZHVsZXMvMi40LjEwLTRHQi9rZXJuZWwvZnMvY2lmcy9jaWZzLm8pLgorCitJZiB5b3UgaGF2ZSBidWlsdCB0aGUgQ0lGUyB2ZnMgaW50byB0aGUga2VybmVsIGl0c2VsZiwgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMKK2ZvciB5b3VyIGRpc3RyaWJ1dGlvbiBvbiBob3cgdG8gaW5zdGFsbCBhIG5ldyBrZXJuZWwgKHVzdWFsbHkgeW91Cit3b3VsZCBzaW1wbHkgdHlwZSAibWFrZSBpbnN0YWxsIikuCisKK0lmIHlvdSBkbyBub3QgaGF2ZSB0aGUgdXRpbGl0eSBtb3VudC5jaWZzIChpbiB0aGUgU2FtYmEgMy4wIHNvdXJjZSB0cmVlIGFuZCBvbiAKK3RoZSBDSUZTIFZGUyB3ZWIgc2l0ZSkgY29weSBpdCB0byB0aGUgc2FtZSBkaXJlY3RvcnkgaW4gd2hpY2ggbW91bnQuc21iZnMgYW5kIAorc2ltaWxhciBmaWxlcyByZXNpZGUgKHVzdWFsbHkgL3NiaW4pLiAgQWx0aG91Z2ggdGhlIGhlbHBlciBzb2Z0d2FyZSBpcyBub3QgIAorcmVxdWlyZWQsIG1vdW50LmNpZnMgaXMgcmVjb21tZW5kZWQuICBFdmVudHVhbGx5IHRoZSBTYW1iYSAzLjAgdXRpbGl0eSBwcm9ncmFtIAorIm5ldCIgbWF5IGFsc28gYmUgaGVscGZ1bCBzaW5jZSBpdCBtYXkgc29tZWRheSBwcm92aWRlIGVhc2llciBtb3VudCBzeW50YXggZm9yCit1c2VycyB3aG8gYXJlIHVzZWQgdG8gV2luZG93cyBlLmcuICBuZXQgdXNlIDxtb3VudCBwb2ludD4gPFVOQyBuYW1lIG9yIGNpZnMgVVJMPgorTm90ZSB0aGF0IHJ1bm5pbmcgdGhlIFdpbmJpbmQgcGFtL25zcyBtb2R1bGUgKGxvZ29uIHNlcnZpY2UpIG9uIGFsbCBvZiB5b3VyCitMaW51eCBjbGllbnRzIGlzIHVzZWZ1bCBpbiBtYXBwaW5nIFVpZHMgYW5kIEdpZHMgY29uc2lzdGVudGx5IGFjcm9zcyB0aGUKK2RvbWFpbiB0byB0aGUgcHJvcGVyIG5ldHdvcmsgdXNlci4gIFRoZSBtb3VudC5jaWZzIG1vdW50IGhlbHBlciBjYW4gYmUKK3RyaXZpYWxseSBidWlsdCBmcm9tIFNhbWJhIDMuMCBvciBsYXRlciBzb3VyY2UgZS5nLiBieSBleGVjdXRpbmc6CisKKwlnY2Mgc2FtYmEvc291cmNlL2NsaWVudC9tb3VudC5jaWZzLmMgLW8gbW91bnQuY2lmcworCitJZiBjaWZzIGlzIGJ1aWx0IGFzIGEgbW9kdWxlLCB0aGVuIHRoZSBzaXplIGFuZCBudW1iZXIgb2YgbmV0d29yayBidWZmZXJzCithbmQgbWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIHJlcXVlc3RzIHRvIG9uZSBzZXJ2ZXIgY2FuIGJlIGNvbmZpZ3VyZWQuCitDaGFuZ2luZyB0aGVzZSBmcm9tIHRoZWlyIGRlZmF1bHRzIGlzIG5vdCByZWNvbW1lbmRlZC4gQnkgZXhlY3V0aW5nIG1vZGluZm8KKwltb2RpbmZvIGtlcm5lbC9mcy9jaWZzL2NpZnMua28KK29uIGtlcm5lbC9mcy9jaWZzL2NpZnMua28gdGhlIGxpc3Qgb2YgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHRoYXQgY2FuIGJlIG1hZGUKK2F0IG1vZHVsZSBpbml0aWFsaXphdGlvbiB0aW1lIChieSBydW5uaW5nIGluc21vZCBjaWZzLmtvKSBjYW4gYmUgc2Vlbi4KKworQWxsb3dpbmcgVXNlciBNb3VudHMKKz09PT09PT09PT09PT09PT09PT09CitUbyBwZXJtaXQgdXNlcnMgdG8gbW91bnQgYW5kIHVubW91bnQgb3ZlciBkaXJlY3RvcmllcyB0aGV5IG93biBpcyBwb3NzaWJsZQord2l0aCB0aGUgY2lmcyB2ZnMuICBBIHdheSB0byBlbmFibGUgc3VjaCBtb3VudGluZyBpcyB0byBtYXJrIHRoZSBtb3VudC5jaWZzCit1dGlsaXR5IGFzIHN1aWQgKGUuZy4gImNobW9kICtzIC9zYmluL21vdW50L2NpZnMpLiBUbyBlbmFibGUgdXNlcnMgdG8gCit1bW91bnQgc2hhcmVzIHRoZXkgbW91bnQgcmVxdWlyZXMKKzEpIG1vdW50LmNpZnMgdmVyc2lvbiAxLjQgb3IgbGF0ZXIKKzIpIGFuIGVudHJ5IGZvciB0aGUgc2hhcmUgaW4gL2V0Yy9mc3RhYiBpbmRpY2F0aW5nIHRoYXQgYSB1c2VyIG1heQordW5tb3VudCBpdCBlLmcuCisvL3NlcnZlci91c2Vyc2hhcmVuYW1lICAvbW50L3VzZXJuYW1lIGNpZnMgdXNlciAwIDAKKworTm90ZSB0aGF0IHdoZW4gdGhlIG1vdW50LmNpZnMgdXRpbGl0eSBpcyBydW4gc3VpZCAoYWxsb3dpbmcgdXNlciBtb3VudHMpLCAKK2luIG9yZGVyIHRvIHJlZHVjZSByaXNrcywgdGhlICJub3N1aWQiIG1vdW50IGZsYWcgaXMgcGFzc2VkIGluIG9uIG1vdW50IHRvCitkaXNhbGxvdyBleGVjdXRpb24gb2YgYW4gc3VpZCBwcm9ncmFtIG1vdW50ZWQgb24gdGhlIHJlbW90ZSB0YXJnZXQuCitXaGVuIG1vdW50IGlzIGV4ZWN1dGVkIGFzIHJvb3QsIG5vc3VpZCBpcyBub3QgcGFzc2VkIGluIGJ5IGRlZmF1bHQsCithbmQgZXhlY3V0aW9uIG9mIHN1aWQgcHJvZ3JhbXMgb24gdGhlIHJlbW90ZSB0YXJnZXQgd291bGQgYmUgZW5hYmxlZAorYnkgZGVmYXVsdC4gVGhpcyBjYW4gYmUgY2hhbmdlZCwgYXMgd2l0aCBuZnMgYW5kIG90aGVyIGZpbGVzeXN0ZW1zLCAKK2J5IHNpbXBseSBzcGVjaWZ5aW5nICJub3N1aWQiIGFtb25nIHRoZSBtb3VudCBvcHRpb25zLiBGb3IgdXNlciBtb3VudHMgCit0aG91Z2ggdG8gYmUgYWJsZSB0byBwYXNzIHRoZSBzdWlkIGZsYWcgdG8gbW91bnQgcmVxdWlyZXMgcmVidWlsZGluZyAKK21vdW50LmNpZnMgd2l0aCB0aGUgZm9sbG93aW5nIGZsYWc6IAorIAorICAgICAgICBnY2Mgc2FtYmEvc291cmNlL2NsaWVudC9tb3VudC5jaWZzLmMgLURDSUZTX0FMTE9XX1VTUl9TVUlEIC1vIG1vdW50LmNpZnMKKworVGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIG1hbnVhbCBwYWdlIGZvciBjaWZzIG1vdW50aW5nIGluIHRoZSBTYW1iYSAzLjAgYW5kCitsYXRlciBzb3VyY2UgdHJlZSBpbiBkb2NzL21hbnBhZ2VzL21vdW50LmNpZnMuOCAKKworU2FtYmEgQ29uc2lkZXJhdGlvbnMgCis9PT09PT09PT09PT09PT09PT09PSAKK1RvIGdldCB0aGUgbWF4aW11bSBiZW5lZml0IGZyb20gdGhlIENJRlMgVkZTLCB3ZSByZWNvbW1lbmQgdXNpbmcgYSBzZXJ2ZXIgdGhhdCAKK3N1cHBvcnRzIHRoZSBTTklBIENJRlMgVW5peCBFeHRlbnNpb25zIHN0YW5kYXJkIChlLmcuICBTYW1iYSAyLjIuNSBvciBsYXRlciBvciAKK1NhbWJhIDMuMCkgYnV0IHRoZSBDSUZTIHZmcyB3b3JrcyBmaW5lIHdpdGggYSB3aWRlIHZhcmlldHkgb2YgQ0lGUyBzZXJ2ZXJzLiAgCitOb3RlIHRoYXQgdWlkLCBnaWQgYW5kIGZpbGUgcGVybWlzc2lvbnMgd2lsbCBkaXNwbGF5IGRlZmF1bHQgdmFsdWVzIGlmIHlvdSBkbyAKK25vdCBoYXZlIGEgc2VydmVyIHRoYXQgc3VwcG9ydHMgdGhlIFVuaXggZXh0ZW5zaW9ucyBmb3IgQ0lGUyAoc3VjaCBhcyBTYW1iYSAKKzIuMi41IG9yIGxhdGVyKS4gIFRvIGVuYWJsZSB0aGUgVW5peCBDSUZTIEV4dGVuc2lvbnMgaW4gdGhlIFNhbWJhIHNlcnZlciwgYWRkIAordGhlIGxpbmU6IAorCisJdW5peCBleHRlbnNpb25zID0geWVzCisJCit0byB5b3VyIHNtYi5jb25mIGZpbGUgb24gdGhlIHNlcnZlci4gIE5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIHNtYi5jb25mIHNldHRpbmdzIAorYXJlIGFsc28gdXNlZnVsIChvbiB0aGUgU2FtYmEgc2VydmVyKSB3aGVuIHRoZSBtYWpvcml0eSBvZiBjbGllbnRzIGFyZSBVbml4IG9yIAorTGludXg6IAorCisJY2FzZSBzZW5zaXRpdmUgPSB5ZXMKKwlkZWxldGUgcmVhZG9ubHkgPSB5ZXMgCisJZWEgc3VwcG9ydCA9IHllcworCitOb3RlIHRoYXQgc2VydmVyIGVhIHN1cHBvcnQgaXMgcmVxdWlyZWQgZm9yIHN1cHBvcnRpbmcgeGF0dHJzIGZyb20gdGhlIExpbnV4CitjaWZzIGNsaWVudCwgYW5kIHRoYXQgRUEgc3VwcG9ydCBpcyBwcmVzZW50IGluIGxhdGVyIHZlcnNpb25zIG9mIFNhbWJhIChlLmcuIAorMy4wLjYgYW5kIGxhdGVyIChhbHNvIEVBIHN1cHBvcnQgd29ya3MgaW4gYWxsIHZlcnNpb25zIG9mIFdpbmRvd3MsIGF0IGxlYXN0IHRvCitzaGFyZXMgb24gTlRGUyBmaWxlc3lzdGVtcykuICBFeHRlbmRlZCBBdHRyaWJ1dGUgKHhhdHRyKSBzdXBwb3J0IGlzIGFuIG9wdGlvbmFsCitmZWF0dXJlIG9mIG1vc3QgTGludXggZmlsZXN5c3RlbXMgd2hpY2ggbWF5IHJlcXVpcmUgZW5hYmxpbmcgdmlhCittYWtlIG1lbnVjb25maWcuIENsaWVudCBzdXBwb3J0IGZvciBleHRlbmRlZCBhdHRyaWJ1dGVzICh1c2VyIHhhdHRyKSBjYW4gYmUKK2Rpc2FibGVkIG9uIGEgcGVyLW1vdW50IGJhc2lzIGJ5IHNwZWNpZnlpbmcgIm5vdXNlcl94YXR0ciIgb24gbW91bnQuCisKK1RoZSBDSUZTIGNsaWVudCBjYW4gZ2V0IGFuZCBzZXQgUE9TSVggQUNMcyAoZ2V0ZmFjbCwgc2V0ZmFjbCkgdG8gU2FtYmEgc2VydmVycwordmVyc2lvbiAzLjEwIGFuZCBsYXRlci4gIFNldHRpbmcgUE9TSVggQUNMcyByZXF1aXJlcyBlbmFibGluZyBib3RoIFhBVFRSIGFuZCAKK3RoZW4gUE9TSVggc3VwcG9ydCBpbiB0aGUgQ0lGUyBjb25maWd1cmF0aW9uIG9wdGlvbnMgd2hlbiBidWlsZGluZyB0aGUgY2lmcworbW9kdWxlLiAgUE9TSVggQUNMIHN1cHBvcnQgY2FuIGJlIGRpc2FibGVkIG9uIGEgcGVyIG1vdW50IGJhc2ljIGJ5IHNwZWNpZnlpbmcKKyJub2FjbCIgb24gbW91bnQuCisgCitTb21lIGFkbWluaXN0cmF0b3JzIG1heSB3YW50IHRvIGNoYW5nZSBTYW1iYSdzIHNtYi5jb25mICJtYXAgYXJjaGl2ZSIgYW5kIAorImNyZWF0ZSBtYXNrIiBwYXJhbWV0ZXJzIGZyb20gdGhlIGRlZmF1bHQuICBVbmxlc3MgdGhlIGNyZWF0ZSBtYXNrIGlzIGNoYW5nZWQKK25ld2x5IGNyZWF0ZWQgZmlsZXMgY2FuIGVuZCB1cCB3aXRoIGFuIHVubmVjZXNzYXJpbHkgcmVzdHJpY3RpdmUgZGVmYXVsdCBtb2RlLAord2hpY2ggbWF5IG5vdCBiZSB3aGF0IHlvdSB3YW50LCBhbHRob3VnaCBpZiB0aGUgQ0lGUyBVbml4IGV4dGVuc2lvbnMgYXJlCitlbmFibGVkIG9uIHRoZSBzZXJ2ZXIgYW5kIGNsaWVudCwgc3Vic2VxdWVudCBzZXRhdHRyIGNhbGxzIChlLmcuIGNobW9kKSBjYW4KK2ZpeCB0aGUgbW9kZS4gIE5vdGUgdGhhdCBjcmVhdGluZyBzcGVjaWFsIGRldmljZXMgKG1rbm9kKSByZW1vdGVseSAKK21heSByZXF1aXJlIHNwZWNpZnlpbmcgYSBta2RldiBmdW5jdGlvbiB0byBTYW1iYSBpZiB5b3UgYXJlIG5vdCB1c2luZyAKK1NhbWJhIDMuMC42IG9yIGxhdGVyLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2Ugc2VlIHRoZSBtYW51YWwgcGFnZXMKKygibWFuIHNtYi5jb25mIikgb24gdGhlIFNhbWJhIHNlcnZlciBzeXN0ZW0uICBOb3RlIHRoYXQgdGhlIGNpZnMgdmZzLAordW5saWtlIHRoZSBzbWJmcyB2ZnMsIGRvZXMgbm90IHJlYWQgdGhlIHNtYi5jb25mIG9uIHRoZSBjbGllbnQgc3lzdGVtIAorKHRoZSBmZXcgb3B0aW9uYWwgc2V0dGluZ3MgYXJlIHBhc3NlZCBpbiBvbiBtb3VudCB2aWEgLW8gcGFyYW1ldGVycyBpbnN0ZWFkKS4gIAorTm90ZSB0aGF0IFNhbWJhIDIuMi43IG9yIGxhdGVyIGluY2x1ZGVzIGEgZml4IHRoYXQgYWxsb3dzIHRoZSBDSUZTIFZGUyB0byBkZWxldGUKK29wZW4gZmlsZXMgKHJlcXVpcmVkIGZvciBzdHJpY3QgUE9TSVggY29tcGxpYW5jZSkuICBXaW5kb3dzIFNlcnZlcnMgYWxyZWFkeSAKK3N1cHBvcnRlZCB0aGlzIGZlYXR1cmUuIFNhbWJhIHNlcnZlciBkb2VzIG5vdCBhbGxvdyBzeW1saW5rcyB0aGF0IHJlZmVyIHRvIGZpbGVzCitvdXRzaWRlIG9mIHRoZSBzaGFyZSwgc28gaW4gU2FtYmEgdmVyc2lvbnMgcHJpb3IgdG8gMy4wLjYsIG1vc3Qgc3ltbGlua3MgdG8KK2ZpbGVzIHdpdGggYWJzb2x1dGUgcGF0aHMgKGllIGJlZ2lubmluZyB3aXRoIHNsYXNoKSBzdWNoIGFzOgorCSBsbiAtcyAvbW50L2ZvbyBiYXIKK3dvdWxkIGJlIGZvcmJpZGRlbi4gU2FtYmEgMy4wLjYgc2VydmVyIG9yIGxhdGVyIGluY2x1ZGVzIHRoZSBhYmlsaXR5IHRvIGNyZWF0ZSAKK3N1Y2ggc3ltbGlua3Mgc2FmZWx5IGJ5IGNvbnZlcnRpbmcgdW5zYWZlIHN5bWxpbmtzIChpZSBzeW1saW5rcyB0byBzZXJ2ZXIgCitmaWxlcyB0aGF0IGFyZSBvdXRzaWRlIG9mIHRoZSBzaGFyZSkgdG8gYSBzYW1iYSBzcGVjaWZpYyBmb3JtYXQgb24gdGhlIHNlcnZlcgordGhhdCBpcyBpZ25vcmVkIGJ5IGxvY2FsIHNlcnZlciBhcHBsaWNhdGlvbnMgYW5kIG5vbi1jaWZzIGNsaWVudHMgYW5kIHRoYXQgd2lsbAorbm90IGJlIHRyYXZlcnNlZCBieSB0aGUgU2FtYmEgc2VydmVyKS4gIFRoaXMgaXMgb3BhcXVlIHRvIHRoZSBMaW51eCBjbGllbnQKK2FwcGxpY2F0aW9uIHVzaW5nIHRoZSBjaWZzIHZmcy4gQWJzb2x1dGUgc3ltbGlua3Mgd2lsbCB3b3JrIHRvIFNhbWJhIDMuMC41IG9yCitsYXRlciwgYnV0IG9ubHkgZm9yIHJlbW90ZSBjbGllbnRzIHVzaW5nIHRoZSBDSUZTIFVuaXggZXh0ZW5zaW9ucywgYW5kIHdpbGwKK2JlIGludmlzYmlsZSB0byBXaW5kb3dzIGNsaWVudHMgYW5kIHR5cGljYWxseSB3aWxsIG5vdCBhZmZlY3QgbG9jYWwKK2FwcGxpY2F0aW9ucyBydW5uaW5nIG9uIHRoZSBzYW1lIHNlcnZlciBhcyBTYW1iYS4gIAorCitVc2UgaW5zdHJ1Y3Rpb25zOgorPT09PT09PT09PT09PT09PQorT25jZSB0aGUgQ0lGUyBWRlMgc3VwcG9ydCBpcyBidWlsdCBpbnRvIHRoZSBrZXJuZWwgb3IgaW5zdGFsbGVkIGFzIGEgbW9kdWxlIAorKGNpZnMubyksIHlvdSBjYW4gdXNlIG1vdW50IHN5bnRheCBsaWtlIHRoZSBmb2xsb3dpbmcgdG8gYWNjZXNzIFNhbWJhIG9yIFdpbmRvd3MgCitzZXJ2ZXJzOiAKKworICBtb3VudCAtdCBjaWZzIC8vOS41My4yMTYuMTEvZSQgL21udCAtbyB1c2VyPW15bmFtZSxwYXNzPW15cGFzc3dvcmQKKworQmVmb3JlIC1vIHRoZSBvcHRpb24gLXYgbWF5IGJlIHNwZWNpZmllZCB0byBtYWtlIHRoZSBtb3VudC5jaWZzCittb3VudCBoZWxwZXIgZGlzcGxheSB0aGUgbW91bnQgc3RlcHMgbW9yZSB2ZXJib3NlbHkuICAKK0FmdGVyIC1vIHRoZSBmb2xsb3dpbmcgY29tbW9ubHkgdXNlZCBjaWZzIHZmcyBzcGVjaWZpYyBvcHRpb25zCithcmUgc3VwcG9ydGVkOgorCisgIHVzZXI9PHVzZXJuYW1lPgorICBwYXNzPTxwYXNzd29yZD4KKyAgZG9tYWluPTxkb21haW4gbmFtZT4KKyAgCitPdGhlciBjaWZzIG1vdW50IG9wdGlvbnMgYXJlIGRlc2NyaWJlZCBiZWxvdy4gIFVzZSBvZiBUQ1AgbmFtZXMgKGluIGFkZGl0aW9uIHRvCitpcCBhZGRyZXNzZXMpIGlzIGF2YWlsYWJsZSBpZiB0aGUgbW91bnQgaGVscGVyIChtb3VudC5jaWZzKSBpcyBpbnN0YWxsZWQuIElmCit5b3UgZG8gbm90IHRydXN0IHRoZSBzZXJ2ZXIgdG8gd2hpY2ggYXJlIG1vdW50ZWQsIG9yIGlmIHlvdSBkbyBub3QgaGF2ZQorY2lmcyBzaWduaW5nIGVuYWJsZWQgKGFuZCB0aGUgcGh5c2ljYWwgbmV0d29yayBpcyBpbnNlY3VyZSksIGNvbnNpZGVyIHVzZQorb2YgdGhlIHN0YW5kYXJkIG1vdW50IG9wdGlvbnMgIm5vZXhlYyIgYW5kICJub3N1aWQiIHRvIHJlZHVjZSB0aGUgcmlzayBvZiAKK3J1bm5pbmcgYW4gYWx0ZXJlZCBiaW5hcnkgb24geW91ciBsb2NhbCBzeXN0ZW0gKGRvd25sb2FkZWQgZnJvbSBhIGhvc3RpbGUgc2VydmVyCitvciBhbHRlcmVkIGJ5IGEgaG9zdGlsZSByb3V0ZXIpLgorCitBbHRob3VnaCBtb3VudGluZyB1c2luZyBmb3JtYXQgY29ycmVzcG9uZGluZyB0byB0aGUgQ0lGUyBVUkwgc3BlY2lmaWNhdGlvbiBpcworbm90IHBvc3NpYmxlIGluIG1vdW50LmNpZnMgeWV0LCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgYW4gYWx0ZXJuYXRlIGZvcm1hdAorZm9yIHRoZSBzZXJ2ZXIgYW5kIHNoYXJlbmFtZSAod2hpY2ggaXMgc29tZXdoYXQgc2ltaWxhciB0byBORlMgc3R5bGUgbW91bnQKK3N5bnRheCkgaW5zdGVhZCBvZiB0aGUgbW9yZSB3aWRlbHkgdXNlZCBVTkMgZm9ybWF0IChpLmUuIFxcc2VydmVyXHNoYXJlKToKKyAgbW91bnQgLXQgY2lmcyB0Y3BfbmFtZV9vZl9zZXJ2ZXI6c2hhcmVfbmFtZSAvbW50IC1vIHVzZXI9bXluYW1lLHBhc3M9bXlwYXNzd2QKKworV2hlbiB1c2luZyB0aGUgbW91bnQgaGVscGVyIG1vdW50LmNpZnMsIHBhc3N3b3JkcyBtYXkgYmUgc3BlY2lmaWVkIHZpYSBhbHRlcm5hdGUKK21lY2hhbmlzbXMsIGluc3RlYWQgb2Ygc3BlY2lmeWluZyBpdCBhZnRlciAtbyB1c2luZyB0aGUgbm9ybWFsICJwYXNzPSIgc3ludGF4CitvbiB0aGUgY29tbWFuZCBsaW5lOgorMSkgQnkgaW5jbHVkaW5nIGl0IGluIGEgY3JlZGVudGlhbCBmaWxlLiBTcGVjaWZ5IGNyZWRlbnRpYWxzPWZpbGVuYW1lIGFzIG9uZQorb2YgdGhlIG1vdW50IG9wdGlvbnMuIENyZWRlbnRpYWwgZmlsZXMgY29udGFpbiB0d28gbGluZXMKKyAgICAgICAgdXNlcm5hbWU9c29tZXVzZXIKKyAgICAgICAgcGFzc3dvcmQ9eW91cl9wYXNzd29yZAorMikgQnkgc3BlY2lmeWluZyB0aGUgcGFzc3dvcmQgaW4gdGhlIFBBU1NXRCBlbnZpcm9ubWVudCB2YXJpYWJsZSAoc2ltaWxhcmx5Cit0aGUgdXNlciBuYW1lIGNhbiBiZSB0YWtlbiBmcm9tIHRoZSBVU0VSIGVudmlyb25tZW50IHZhcmlhYmxlKS4KKzMpIEJ5IHNwZWNpZnlpbmcgdGhlIHBhc3N3b3JkIGluIGEgZmlsZSBieSBuYW1lIHZpYSBQQVNTV0RfRklMRQorNCkgQnkgc3BlY2lmeWluZyB0aGUgcGFzc3dvcmQgaW4gYSBmaWxlIGJ5IGZpbGUgZGVzY3JpcHRvciB2aWEgUEFTU1dEX0ZECisKK0lmIG5vIHBhc3N3b3JkIGlzIHByb3ZpZGVkLCBtb3VudC5jaWZzIHdpbGwgcHJvbXB0IGZvciBwYXNzd29yZCBlbnRyeQorCitSZXN0cmljdGlvbnMKKz09PT09PT09PT09PQorU2VydmVycyBtdXN0IHN1cHBvcnQgdGhlIE5UTE0gU01CIGRpYWxlY3QgKHdoaWNoIGlzIHRoZSBtb3N0IHJlY2VudCwgc3VwcG9ydGVkIAorYnkgU2FtYmEgYW5kIFdpbmRvd3MgTlQgdmVyc2lvbiA0LCAyMDAwIGFuZCBYUCBhbmQgbWFueSBvdGhlciBTTUIvQ0lGUyBzZXJ2ZXJzKSAKK1NlcnZlcnMgbXVzdCBzdXBwb3J0IGVpdGhlciAicHVyZS1UQ1AiIChwb3J0IDQ0NSBUQ1AvSVAgQ0lGUyBjb25uZWN0aW9ucykgb3IgUkZDIAorMTAwMS8xMDAyIHN1cHBvcnQgZm9yICJOZXRiaW9zLU92ZXItVENQL0lQLiIgTmVpdGhlciBvZiB0aGVzZSBpcyBsaWtlbHkgdG8gYmUgYSAKK3Byb2JsZW0gYXMgbW9zdCBzZXJ2ZXJzIHN1cHBvcnQgdGhpcy4gIElQdjYgc3VwcG9ydCBpcyBwbGFubmVkIGZvciB0aGUgZnV0dXJlLAorYW5kIGlzIGFsbW9zdCBjb21wbGV0ZS4KKworVmFsaWQgZmlsZW5hbWVzIGRpZmZlciBiZXR3ZWVuIFdpbmRvd3MgYW5kIExpbnV4LiAgV2luZG93cyB0eXBpY2FsbHkgcmVzdHJpY3RzCitmaWxlbmFtZXMgd2hpY2ggY29udGFpbiBjZXJ0YWluIHJlc2VydmVkIGNoYXJhY3RlcnMgKGUuZy50aGUgY2hhcmFjdGVyIDogCit3aGljaCBpcyB1c2VkIHRvIGRlbGltaXQgdGhlIGJlZ2lubmluZyBvZiBhIHN0cmVhbSBuYW1lIGJ5IFdpbmRvd3MpLCB3aGlsZQorTGludXggYWxsb3dzIGEgc2xpZ2h0bHkgd2lkZXIgc2V0IG9mIHZhbGlkIGNoYXJhY3RlcnMgaW4gZmlsZW5hbWVzLiBXaW5kb3dzCitzZXJ2ZXJzIGNhbiByZW1hcCBzdWNoIGNoYXJhY3RlcnMgd2hlbiBhbiBleHBsaWNpdCBtYXBwaW5nIGlzIHNwZWNpZmllZCBpbgordGhlIFNlcnZlcidzIHJlZ2lzdHJ5LiAgU2FtYmEgc3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDMuMTAgd2lsbCBhbGxvdyBzdWNoIAorZmlsZW5hbWVzIChpZSB0aG9zZSB3aGljaCBjb250YWluIHZhbGlkIExpbnV4IGNoYXJhY3RlcnMsIHdoaWNoIG5vcm1hbGx5Cit3b3VsZCBiZSBmb3JiaWRkZW4gZm9yIFdpbmRvd3MvQ0lGUyBzZW1hbnRpY3MpIGFzIGxvbmcgYXMgdGhlIHNlcnZlciBpcworY29uZmlndXJlZCBmb3IgVW5peCBFeHRlbnNpb25zIChhbmQgdGhlIGNsaWVudCBoYXMgbm90IGRpc2FibGVkCisvcHJvYy9mcy9jaWZzL0xpbnV4RXh0ZW5zaW9uc0VuYWJsZWQpLgorICAKKworQ0lGUyBWRlMgTW91bnQgT3B0aW9ucworPT09PT09PT09PT09PT09PT09PT09PQorQSBwYXJ0aWFsIGxpc3Qgb2YgdGhlIHN1cHBvcnRlZCBtb3VudCBvcHRpb25zIGZvbGxvd3M6CisgIHVzZXIJCVRoZSB1c2VyIG5hbWUgdG8gdXNlIHdoZW4gdHJ5aW5nIHRvIGVzdGFibGlzaAorCQl0aGUgQ0lGUyBzZXNzaW9uLgorICBwYXNzd29yZAlUaGUgdXNlciBwYXNzd29yZC4gIElmIHRoZSBtb3VudCBoZWxwZXIgaXMKKwkJaW5zdGFsbGVkLCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIGZvciBwYXNzd29yZAorCQlpZiBpdCBpcyBub3Qgc3VwcGxpZWQuCisgIGlwCQlUaGUgaXAgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IHNlcnZlcgorICB1bmMJCVRoZSB0YXJnZXQgc2VydmVyIFVuaXZlcnNhbCBOZXR3b3JrIE5hbWUgKGV4cG9ydCkgdG8gCisJCW1vdW50LgkKKyAgZG9tYWluCVNldCB0aGUgU01CL0NJRlMgd29ya2dyb3VwIG5hbWUgcHJlcGVuZGVkIHRvIHRoZQorCQl1c2VybmFtZSBkdXJpbmcgQ0lGUyBzZXNzaW9uIGVzdGFibGlzaG1lbnQKKyAgdWlkCQlJZiBDSUZTIFVuaXggZXh0ZW5zaW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyCisJCXRoaXMgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHVpZCBmb3IgaW5vZGVzLiBGb3IgbW91bnRzIHRvCisJCXNlcnZlcnMgd2hpY2ggZG8gc3VwcG9ydCB0aGUgQ0lGUyBVbml4IGV4dGVuc2lvbnMsIHN1Y2gKKwkJYXMgYSBwcm9wZXJseSBjb25maWd1cmVkIFNhbWJhIHNlcnZlciwgdGhlIHNlcnZlciBwcm92aWRlcworCQl0aGUgdWlkLCBnaWQgYW5kIG1vZGUuICBGb3Igc2VydmVycyB3aGljaCBkbyBub3Qgc3VwcG9ydAorCQl0aGUgVW5peCBleHRlbnNpb25zLCB0aGUgZGVmYXVsdCB1aWQgKGFuZCBnaWQpIHJldHVybmVkIG9uCisJCWxvb2t1cCBvZiBleGlzdGluZyBmaWxlcyBpcyB0aGUgdWlkIChnaWQpIG9mIHRoZSBwZXJzb24KKwkJd2hvIGV4ZWN1dGVkIHRoZSBtb3VudCAocm9vdCwgZXhjZXB0IHdoZW4gbW91bnQuY2lmcworCQlpcyBjb25maWd1cmVkIHNldHVpZCBmb3IgdXNlciBtb3VudHMpIHVubGVzcyB0aGUgInVpZD0iIAorCQkoZ2lkKSBtb3VudCBvcHRpb24gaXMgc3BlY2lmaWVkLiAgRm9yIHRoZSB1aWQgKGdpZCkgb2YgbmV3bHkKKwkJY3JlYXRlZCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMsIGllIGZpbGVzIGNyZWF0ZWQgc2luY2UgCisJCXRoZSBsYXN0IG1vdW50IG9mIHRoZSBzZXJ2ZXIgc2hhcmUsIHRoZSBleHBlY3RlZCB1aWQgCisJCShnaWQpIGlzIGNhY2hlZCBhcyBhcyBsb25nIGFzIHRoZSBpbm9kZSByZW1haW5zIGluIAorCQltZW1vcnkgb24gdGhlIGNsaWVudC4gICBBbHNvIG5vdGUgdGhhdCBwZXJtaXNzaW9uCisJCWNoZWNrcyAoYXV0aG9yaXphdGlvbiBjaGVja3MpIG9uIGFjY2Vzc2VzIHRvIGEgZmlsZSBvY2N1cgorCQlhdCB0aGUgc2VydmVyLCBidXQgdGhlcmUgYXJlIGNhc2VzIGluIHdoaWNoIGFuIGFkbWluaXN0cmF0b3IKKwkJbWF5IHdhbnQgdG8gcmVzdHJpY3QgYXQgdGhlIGNsaWVudCBhcyB3ZWxsLiAgRm9yIHRob3NlCisJCXNlcnZlcnMgd2hpY2ggZG8gbm90IHJlcG9ydCBhIHVpZC9naWQgb3duZXIKKwkJKHN1Y2ggYXMgV2luZG93cyksIHBlcm1pc3Npb25zIGNhbiBhbHNvIGJlIGNoZWNrZWQgYXQgdGhlCisJCWNsaWVudCwgYW5kIGEgY3J1ZGUgZm9ybSBvZiBjbGllbnQgc2lkZSBwZXJtaXNzaW9uIGNoZWNraW5nIAorCQljYW4gYmUgZW5hYmxlZCBieSBzcGVjaWZ5aW5nIGZpbGVfbW9kZSBhbmQgZGlyX21vZGUgb24gCisJCXRoZSBjbGllbnQKKyAgZ2lkCQlJZiBDSUZTIFVuaXggZXh0ZW5zaW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyCisJCXRoaXMgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGdpZCBmb3IgaW5vZGVzLgorICBmaWxlX21vZGUgICAgIElmIENJRlMgVW5peCBleHRlbnNpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIKKwkJdGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgbW9kZSBmb3IgZmlsZSBpbm9kZXMuCisgIGRpcl9tb2RlICAgICAgSWYgQ0lGUyBVbml4IGV4dGVuc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlciAKKwkJdGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgbW9kZSBmb3IgZGlyZWN0b3J5IGlub2Rlcy4KKyAgcG9ydAkJYXR0ZW1wdCB0byBjb250YWN0IHRoZSBzZXJ2ZXIgb24gdGhpcyB0Y3AgcG9ydCwgYmVmb3JlCisJCXRyeWluZyB0aGUgdXN1YWwgcG9ydHMgKHBvcnQgNDQ1LCB0aGVuIDEzOSkuCisgIGlvY2hhcnNldCAgICAgQ29kZXBhZ2UgdXNlZCB0byBjb252ZXJ0IGxvY2FsIHBhdGggbmFtZXMgdG8gYW5kIGZyb20KKwkJVW5pY29kZS4gVW5pY29kZSBpcyB1c2VkIGJ5IGRlZmF1bHQgZm9yIG5ldHdvcmsgcGF0aAorCQluYW1lcyBpZiB0aGUgc2VydmVyIHN1cHBvcnRzIGl0LiAgSWYgaW9jaGFyc2V0IGlzCisJCW5vdCBzcGVjaWZpZWQgdGhlbiB0aGUgbmxzX2RlZmF1bHQgc3BlY2lmaWVkCisJCWR1cmluZyB0aGUgbG9jYWwgY2xpZW50IGtlcm5lbCBidWlsZCB3aWxsIGJlIHVzZWQuCisJCUlmIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IFVuaWNvZGUsIHRoaXMgcGFyYW1ldGVyIGlzCisJCXVudXNlZC4KKyAgcnNpemUJCWRlZmF1bHQgcmVhZCBzaXplCisgIHdzaXplCQlkZWZhdWx0IHdyaXRlIHNpemUKKyAgcncJCW1vdW50IHRoZSBuZXR3b3JrIHNoYXJlIHJlYWQtd3JpdGUgKG5vdGUgdGhhdCB0aGUKKwkJc2VydmVyIG1heSBzdGlsbCBjb25zaWRlciB0aGUgc2hhcmUgcmVhZC1vbmx5KQorICBybwkJbW91bnQgbmV0d29yayBzaGFyZSByZWFkLW9ubHkKKyAgdmVyc2lvbgl1c2VkIHRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUKKwkJbW91bnQgaGVscGVyIHV0aWxpdHkgKG5vdCB0eXBpY2FsbHkgbmVlZGVkKQorICBzZXAJCWlmIGZpcnN0IG1vdW50IG9wdGlvbiAoYWZ0ZXIgdGhlIC1vKSwgb3ZlcnJpZGVzCisJCXRoZSBjb21tYSBhcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gdGhlIG1vdW50CisJCXBhcm1zLiBlLmcuCisJCQktbyB1c2VyPW15bmFtZSxwYXNzd29yZD1teXBhc3N3b3JkLGRvbWFpbj1teWRvbQorCQljb3VsZCBiZSBwYXNzZWQgaW5zdGVhZCB3aXRoIHBlcmlvZCBhcyB0aGUgc2VwYXJhdG9yIGJ5CisJCQktbyBzZXA9LnVzZXI9bXluYW1lLnBhc3N3b3JkPW15cGFzc3dvcmQuZG9tYWluPW15ZG9tCisJCXRoaXMgbWlnaHQgYmUgdXNlZnVsIHdoZW4gY29tbWEgaXMgY29udGFpbmVkIHdpdGhpbiB1c2VybmFtZQorCQlvciBwYXNzd29yZCBvciBkb21haW4uIFRoaXMgb3B0aW9uIGlzIGxlc3MgaW1wb3J0YW50CisJCXdoZW4gdGhlIGNpZnMgbW91bnQgaGVscGVyIGNpZnMubW91bnQgKHZlcnNpb24gMS4xIG9yIGxhdGVyKQorCQlpcyB1c2VkLgorICBub3N1aWQgICAgICAgIERvIG5vdCBhbGxvdyByZW1vdGUgZXhlY3V0YWJsZXMgd2l0aCB0aGUgc3VpZCBiaXQgCisJCXByb2dyYW0gdG8gYmUgZXhlY3V0ZWQuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgbW91bnRzCisJCXRvIHNlcnZlcnMgc3VjaCBhcyBTYW1iYSB3aGljaCBzdXBwb3J0IHRoZSBDSUZTIFVuaXggRXh0ZW5zaW9ucy4KKwkJSWYgeW91IGRvIG5vdCB0cnVzdCB0aGUgc2VydmVycyBpbiB5b3VyIG5ldHdvcmsgKHlvdXIgbW91bnQKKwkJdGFyZ2V0cykgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3Ugc3BlY2lmeSB0aGlzIG9wdGlvbiBmb3IKKwkJZ3JlYXRlciBzZWN1cml0eS4KKyAgZXhlYwkJUGVybWl0IGV4ZWN1dGlvbiBvZiBiaW5hcmllcyBvbiB0aGUgbW91bnQuCisgIG5vZXhlYwlEbyBub3QgcGVybWl0IGV4ZWN1dGlvbiBvZiBiaW5hcmllcyBvbiB0aGUgbW91bnQuCisgIGRldgkJUmVjb2duaXplIGJsb2NrIGRldmljZXMgb24gdGhlIHJlbW90ZSBtb3VudC4KKyAgbm9kZXYJCURvIG5vdCByZWNvZ25pemUgZGV2aWNlcyBvbiB0aGUgcmVtb3RlIG1vdW50LgorICBzdWlkICAgICAgICAgIEFsbG93IHJlbW90ZSBmaWxlcyBvbiB0aGlzIG1vdW50cG9pbnQgd2l0aCBzdWlkIGVuYWJsZWQgdG8gCisJCWJlIGV4ZWN1dGVkIChkZWZhdWx0IGZvciBtb3VudHMgd2hlbiBleGVjdXRlZCBhcyByb290LAorCQlub3N1aWQgaXMgZGVmYXVsdCBmb3IgdXNlciBtb3VudHMpLgorICBjcmVkZW50aWFscyAgIEFsdGhvdWdoIGlnbm9yZWQgYnkgdGhlIGNpZnMga2VybmVsIGNvbXBvbmVudCwgaXQgaXMgdXNlZCBieSAKKwkJdGhlIG1vdW50IGhlbHBlciwgbW91bnQuY2lmcy4gV2hlbiBtb3VudC5jaWZzIGlzIGluc3RhbGxlZCBpdAorCQlvcGVucyBhbmQgcmVhZHMgdGhlIGNyZWRlbnRpYWwgZmlsZSBzcGVjaWZpZWQgaW4gb3JkZXIgIAorCQl0byBvYnRhaW4gdGhlIHVzZXJpZCBhbmQgcGFzc3dvcmQgYXJndW1lbnRzIHdoaWNoIGFyZSBwYXNzZWQgdG8KKwkJdGhlIGNpZnMgdmZzLgorICBndWVzdCAgICAgICAgIEFsdGhvdWdoIGlnbm9yZWQgYnkgdGhlIGtlcm5lbCBjb21wb25lbnQsIHRoZSBtb3VudC5jaWZzCisJCW1vdW50IGhlbHBlciB3aWxsIG5vdCBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgcGFzc3dvcmQKKwkJaWYgZ3Vlc3QgaXMgc3BlY2lmaWVkIG9uIHRoZSBtb3VudCBvcHRpb25zLiAgSWYgbm8KKwkJcGFzc3dvcmQgaXMgc3BlY2lmaWVkIGEgbnVsbCBwYXNzd29yZCB3aWxsIGJlIHVzZWQuCisgIHBlcm0gICAgICAgICAgQ2xpZW50IGRvZXMgcGVybWlzc2lvbiBjaGVja3MgKHZmc19wZXJtaXNzaW9uIGNoZWNrIG9mIHVpZAorCQlhbmQgZ2lkIG9mIHRoZSBmaWxlIGFnYWluc3QgdGhlIG1vZGUgYW5kIGRlc2lyZWQgb3BlcmF0aW9uKSwKKwkJTm90ZSB0aGF0IHRoaXMgaXMgaW4gYWRkaXRpb24gdG8gdGhlIG5vcm1hbCBBQ0wgY2hlY2sgb24gdGhlCisJCXRhcmdldCBtYWNoaW5lIGRvbmUgYnkgdGhlIHNlcnZlciBzb2Z0d2FyZS4gCisJCUNsaWVudCBwZXJtaXNzaW9uIGNoZWNraW5nIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAgbm9wZXJtICAgICAgICBDbGllbnQgZG9lcyBub3QgZG8gcGVybWlzc2lvbiBjaGVja3MuICBUaGlzIGNhbiBleHBvc2UKKwkJZmlsZXMgb24gdGhpcyBtb3VudCB0byBhY2Nlc3MgYnkgb3RoZXIgdXNlcnMgb24gdGhlIGxvY2FsCisJCWNsaWVudCBzeXN0ZW0uIEl0IGlzIHR5cGljYWxseSBvbmx5IG5lZWRlZCB3aGVuIHRoZSBzZXJ2ZXIKKwkJc3VwcG9ydHMgdGhlIENJRlMgVW5peCBFeHRlbnNpb25zIGJ1dCB0aGUgVUlEcy9HSURzIG9uIHRoZQorCQljbGllbnQgYW5kIHNlcnZlciBzeXN0ZW0gZG8gbm90IG1hdGNoIGNsb3NlbHkgZW5vdWdoIHRvIGFsbG93CisJCWFjY2VzcyBieSB0aGUgdXNlciBkb2luZyB0aGUgbW91bnQuCisJCU5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFmZmVjdCB0aGUgbm9ybWFsIEFDTCBjaGVjayBvbiB0aGUKKwkJdGFyZ2V0IG1hY2hpbmUgZG9uZSBieSB0aGUgc2VydmVyIHNvZnR3YXJlIChvZiB0aGUgc2VydmVyCisJCUFDTCBhZ2FpbnN0IHRoZSB1c2VyIG5hbWUgcHJvdmlkZWQgYXQgbW91bnQgdGltZSkuCisgIHNlcnZlcmlubwlVc2Ugc2VydmVycyBpbm9kZSBudW1iZXJzIGluc3RlYWQgb2YgZ2VuZXJhdGluZyBhdXRvbWF0aWNhbGx5CisJCWluY3JlbWVudGluZyBpbm9kZSBudW1iZXJzIG9uIHRoZSBjbGllbnQuICBBbHRob3VnaCB0aGlzIHdpbGwKKwkJbWFrZSBpdCBlYXNpZXIgdG8gc3BvdCBoYXJkbGlua2VkIGZpbGVzIChhcyB0aGV5IHdpbGwgaGF2ZQorCQl0aGUgc2FtZSBpbm9kZSBudW1iZXJzKSBhbmQgaW5vZGUgbnVtYmVycyBtYXkgYmUgcGVyc2lzdGVudCwKKwkJbm90ZSB0aGF0IHRoZSBzZXJ2ZXIgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhlIGlub2RlIG51bWJlcnMKKwkJYXJlIHVuaXF1ZSBpZiBtdWx0aXBsZSBzZXJ2ZXIgc2lkZSBtb3VudHMgYXJlIGV4cG9ydGVkIHVuZGVyIGEKKwkJc2luZ2xlIHNoYXJlIChzaW5jZSBpbm9kZSBudW1iZXJzIG9uIHRoZSBzZXJ2ZXJzIG1pZ2h0IG5vdAorCQliZSB1bmlxdWUgaWYgbXVsdGlwbGUgZmlsZXN5c3RlbXMgYXJlIG1vdW50ZWQgdW5kZXIgdGhlIHNhbWUKKwkJc2hhcmVkIGhpZ2hlciBsZXZlbCBkaXJlY3RvcnkpLiAgTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgdGhhdAorCQl0aGUgc2VydmVyIHN1cHBvcnQgdGhlIENJRlMgVW5peCBFeHRlbnNpb25zIGFzIG90aGVyIHNlcnZlcnMKKwkJZG8gbm90IHJldHVybiBhIHVuaXF1ZSBJbmRleE51bWJlciBvbiBTTUIgRmluZEZpcnN0IChtb3N0CisJCXNlcnZlcnMgcmV0dXJuIHplcm8gYXMgdGhlIEluZGV4TnVtYmVyKS4gIFBhcmFtZXRlciBoYXMgbm8KKwkJZWZmZWN0IHRvIFdpbmRvd3Mgc2VydmVycyBhbmQgb3RoZXJzIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHRoZQorCQlDSUZTIFVuaXggRXh0ZW5zaW9ucy4KKyAgbm9zZXJ2ZXJpbm8gICBDbGllbnQgZ2VuZXJhdGVzIGlub2RlIG51bWJlcnMgKHJhdGhlciB0aGFuIHVzaW5nIHRoZSBhY3R1YWwgb25lCisJCWZyb20gdGhlIHNlcnZlcikgYnkgZGVmYXVsdC4KKyAgc2V0dWlkcyAgICAgICBJZiB0aGUgQ0lGUyBVbml4IGV4dGVuc2lvbnMgYXJlIG5lZ290aWF0ZWQgd2l0aCB0aGUgc2VydmVyCisJCXRoZSBjbGllbnQgd2lsbCBhdHRlbXB0IHRvIHNldCB0aGUgZWZmZWN0aXZlIHVpZCBhbmQgZ2lkIG9mCisJCXRoZSBsb2NhbCBwcm9jZXNzIG9uIG5ld2x5IGNyZWF0ZWQgZmlsZXMsIGRpcmVjdG9yaWVzLCBhbmQKKwkJZGV2aWNlcyAoY3JlYXRlLCBta2RpciwgbWtub2QpLgorICBub3NldHVpZHMgICAgIFRoZSBjbGllbnQgd2lsbCBub3QgYXR0ZW1wdCB0byBzZXQgdGhlIHVpZCBhbmQgZ2lkIG9uCisJCW9uIG5ld2x5IGNyZWF0ZWQgZmlsZXMsIGRpcmVjdG9yaWVzLCBhbmQgZGV2aWNlcyAoY3JlYXRlLCAKKwkJbWtkaXIsIG1rbm9kKSB3aGljaCB3aWxsIHJlc3VsdCBpbiB0aGUgc2VydmVyIHNldHRpbmcgdGhlCisJCXVpZCBhbmQgZ2lkIHRvIHRoZSBkZWZhdWx0ICh1c3VhbGx5IHRoZSBzZXJ2ZXIgdWlkIG9mIHRoZQorCQl1c2VybiB3aG8gbW91bnRlZCB0aGUgc2hhcmUpLiAgTGV0dGluZyB0aGUgc2VydmVyIChyYXRoZXIgdGhhbgorCQl0aGUgY2xpZW50KSBzZXQgdGhlIHVpZCBhbmQgZ2lkIGlzIHRoZSBkZWZhdWx0LiBUaGlzCisJCXBhcmFtZXRlciBoYXMgbm8gZWZmZWN0IGlmIHRoZSBDSUZTIFVuaXggRXh0ZW5zaW9ucyBhcmUgbm90CisJCW5lZ290aWF0ZWQuCisgIG5ldGJpb3NuYW1lICAgV2hlbiBtb3VudGluZyB0byBzZXJ2ZXJzIHZpYSBwb3J0IDEzOSwgc3BlY2lmaWVzIHRoZSBSRkMxMDAxCisJCXNvdXJjZSBuYW1lIHRvIHVzZSB0byByZXByZXNlbnQgdGhlIGNsaWVudCBuZXRiaW9zIG1hY2hpbmUgCisJCW5hbWUgd2hlbiBkb2luZyB0aGUgUkZDMTAwMSBuZXRiaW9zIHNlc3Npb24gaW5pdGlhbGl6ZS4KKyAgZGlyZWN0ICAgICAgICBEbyBub3QgZG8gaW5vZGUgZGF0YSBjYWNoaW5nIG9uIGZpbGVzIG9wZW5lZCBvbiB0aGlzIG1vdW50LgorCQlUaGlzIHByZWNsdWRlcyBtbWFwaW5nIGZpbGVzIG9uIHRoaXMgbW91bnQuIEluIHNvbWUgY2FzZXMKKwkJd2l0aCBmYXN0IG5ldHdvcmtzIGFuZCBsaXR0bGUgb3Igbm8gY2FjaGluZyBiZW5lZml0cyBvbiB0aGUKKwkJY2xpZW50IChlLmcuIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIGRvaW5nIGxhcmdlIHNlcXVlbnRpYWwKKwkJcmVhZHMgYmlnZ2VyIHRoYW4gcGFnZSBzaXplIHdpdGhvdXQgcmVyZWFkaW5nIHRoZSBzYW1lIGRhdGEpIAorCQl0aGlzIGNhbiBwcm92aWRlIGJldHRlciBwZXJmb3JtYW5jZSB0aGFuIHRoZSBkZWZhdWx0CisJCWJlaGF2aW9yIHdoaWNoIGNhY2hlcyByZWFkcyAocmVhYWRhaGVhZCkgYW5kIHdyaXRlcyAKKwkJKHdyaXRlYmVoaW5kKSB0aHJvdWdoIHRoZSBsb2NhbCBMaW51eCBjbGllbnQgcGFnZWNhY2hlIAorCQlpZiBvcGxvY2sgKGNhY2hpbmcgdG9rZW4pIGlzIGdyYW50ZWQgYW5kIGhlbGQuIE5vdGUgdGhhdAorCQlkaXJlY3QgYWxsb3dzIHdyaXRlIG9wZXJhdGlvbnMgbGFyZ2VyIHRoYW4gcGFnZSBzaXplCisJCXRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4KKyAgYWNsICAgCUFsbG93IHNldGZhY2wgYW5kIGdldGZhY2wgdG8gbWFuYWdlIHBvc2l4IEFDTHMgaWYgc2VydmVyCisJCXN1cHBvcnRzIHRoZW0uICAoZGVmYXVsdCkKKyAgbm9hY2wgCURvIG5vdCBhbGxvdyBzZXRmYWNsIGFuZCBnZXRmYWNsIGNhbGxzIG9uIHRoaXMgbW91bnQKKyAgdXNlcl94YXR0ciAgICBBbGxvdyBnZXR0aW5nIGFuZCBzZXR0aW5nIHVzZXIgeGF0dHJzIGFzIE9TLzIgRUFzIChleHRlbmRlZAorCQlhdHRyaWJ1dGVzKSB0byB0aGUgc2VydmVyIChkZWZhdWx0KSBlLmcuIHZpYSBzZXRmYXR0ciAKKwkJYW5kIGdldGZhdHRyIHV0aWxpdGllcy4gCisgIG5vdXNlcl94YXR0ciAgRG8gbm90IGFsbG93IGdldGZhdHRyL3NldGZhdHRyIHRvIGdldC9zZXQgeGF0dHJzIAorCQkKK1RoZSBtb3VudC5jaWZzIG1vdW50IGhlbHBlciBhbHNvIGFjY2VwdHMgYSBmZXcgbW91bnQgb3B0aW9ucyBiZWZvcmUgLW8KK2luY2x1ZGluZzoKKworCS1TICAgICAgdGFrZSBwYXNzd29yZCBmcm9tIHN0ZGluIChlcXVpdmFsZW50IHRvIHNldHRpbmcgdGhlIGVudmlyb25tZW50CisJCXZhcmlhYmxlICJQQVNTV0RfRkQ9MCIKKwktViAgICAgIHByaW50IG1vdW50LmNpZnMgdmVyc2lvbgorCS0/ICAgICAgZGlzcGxheSBzaW1wbGUgdXNhZ2UgaW5mb3JtYXRpb24KKworV2l0aCByZWNlbnQgMi42IGtlcm5lbCB2ZXJzaW9ucyBvZiBtb2R1dGlscywgdGhlIHZlcnNpb24gb2YgdGhlIGNpZnMga2VybmVsCittb2R1bGUgY2FuIGJlIGRpc3BsYXllZCB2aWEgbW9kaW5mby4KKworTWlzYyAvcHJvYy9mcy9jaWZzIEZsYWdzIGFuZCBEZWJ1ZyBJbmZvCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0luZm9ybWF0aW9uYWwgcHNldWRvLWZpbGVzOgorRGVidWdEYXRhCQlEaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCBhY3RpdmUgQ0lGUyBzZXNzaW9ucworCQkJYW5kIHNoYXJlcy4KK1N0YXRzCQkJTGlzdHMgc3VtbWFyeSByZXNvdXJjZSB1c2FnZSBpbmZvcm1hdGlvbiBhcyB3ZWxsIGFzIHBlcgorCQkJc2hhcmUgc3RhdGlzdGljcywgaWYgQ09ORklHX0NJRlNfU1RBVFMgaW4gZW5hYmxlZAorCQkJaW4gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLgorCitDb25maWd1cmF0aW9uIHBzZXVkby1maWxlczoKK011bHRpdXNlck1vdW50CQlJZiBzZXQgdG8gb25lLCBtb3JlIHRoYW4gb25lIENJRlMgc2Vzc2lvbiB0byAKKwkJCXRoZSBzYW1lIHNlcnZlciBpcCBhZGRyZXNzIGNhbiBiZSBlc3RhYmxpc2hlZAorCQkJaWYgbW9yZSB0aGFuIG9uZSB1aWQgYWNjZXNzZXMgdGhlIHNhbWUgbW91bnQKKwkJCXBvaW50IGFuZCBpZiB0aGUgdWlkcyB1c2VyL3Bhc3N3b3JkIG1hcHBpbmcKKwkJCWluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4gKGRlZmF1bHQgaXMgMCkKK1BhY2tldFNpZ25pbmdFbmFibGVkCUlmIHNldCB0byBvbmUsIGNpZnMgcGFja2V0IHNpZ25pbmcgaXMgZW5hYmxlZAorCQkJYW5kIHdpbGwgYmUgdXNlZCBpZiB0aGUgc2VydmVyIHJlcXVpcmVzIAorCQkJaXQuICBJZiBzZXQgdG8gdHdvLCBjaWZzIHBhY2tldCBzaWduaW5nIGlzCisJCQlyZXF1aXJlZCBldmVuIGlmIHRoZSBzZXJ2ZXIgY29uc2lkZXJzIHBhY2tldAorCQkJc2lnbmluZyBvcHRpb25hbC4gKGRlZmF1bHQgMSkKK2NpZnNGWUkJCQlJZiBzZXQgdG8gb25lLCBhZGRpdGlvbmFsIGRlYnVnIGluZm9ybWF0aW9uIGlzCisJCQlsb2dnZWQgdG8gdGhlIHN5c3RlbSBlcnJvciBsb2cuIChkZWZhdWx0IDApCitFeHRlbmRlZFNlY3VyaXR5CUlmIHNldCB0byBvbmUsIFNQTkVHTyBzZXNzaW9uIGVzdGFibGlzaG1lbnQKKwkJCWlzIGFsbG93ZWQgd2hpY2ggZW5hYmxlcyBtb3JlIGFkdmFuY2VkIAorCQkJc2VjdXJlIENJRlMgc2Vzc2lvbiBlc3RhYmxpc2htZW50IChkZWZhdWx0IDApCitOVExNVjJFbmFibGVkCQlJZiBzZXQgdG8gb25lLCBtb3JlIHNlY3VyZSBwYXNzd29yZCBoYXNoZXMKKwkJCWFyZSB1c2VkIHdoZW4gdGhlIHNlcnZlciBzdXBwb3J0cyB0aGVtIGFuZAorCQkJd2hlbiBrZXJiZXJvcyBpcyBub3QgbmVnb3RpYXRlZCAoZGVmYXVsdCAwKQordHJhY2VTTUIJCUlmIHNldCB0byBvbmUsIGRlYnVnIGluZm9ybWF0aW9uIGlzIGxvZ2dlZCB0byB0aGUKKwkJCXN5c3RlbSBlcnJvciBsb2cgd2l0aCB0aGUgc3RhcnQgb2Ygc21iIHJlcXVlc3RzCisJCQlhbmQgcmVzcG9uc2VzIChkZWZhdWx0IDApCitMb29rdXBDYWNoZUVuYWJsZQlJZiBzZXQgdG8gb25lLCBpbm9kZSBpbmZvcm1hdGlvbiBpcyBrZXB0IGNhY2hlZAorCQkJZm9yIG9uZSBzZWNvbmQgaW1wcm92aW5nIHBlcmZvcm1hbmNlIG9mIGxvb2t1cHMKKwkJCShkZWZhdWx0IDEpCitPcGxvY2tFbmFibGVkCQlJZiBzZXQgdG8gb25lLCBzYWZlIGRpc3RyaWJ1dGVkIGNhY2hpbmcgZW5hYmxlZC4KKwkJCShkZWZhdWx0IDEpCitMaW51eEV4dGVuc2lvbnNFbmFibGVkCUlmIHNldCB0byBvbmUgdGhlbiB0aGUgY2xpZW50IHdpbGwgYXR0ZW1wdCB0bworCQkJdXNlIHRoZSBDSUZTICJVTklYIiBleHRlbnNpb25zIHdoaWNoIGFyZSBvcHRpb25hbAorCQkJcHJvdG9jb2wgZW5oYW5jZW1lbnRzIHRoYXQgYWxsb3cgQ0lGUyBzZXJ2ZXJzCisJCQl0byByZXR1cm4gYWNjdXJhdGUgVUlEL0dJRCBpbmZvcm1hdGlvbiBhcyB3ZWxsCisJCQlhcyBzdXBwb3J0IHN5bWJvbGljIGxpbmtzLiBJZiB5b3UgdXNlIHNlcnZlcnMKKwkJCXN1Y2ggYXMgU2FtYmEgdGhhdCBzdXBwb3J0IHRoZSBDSUZTIFVuaXgKKwkJCWV4dGVuc2lvbnMgYnV0IGRvIG5vdCB3YW50IHRvIHVzZSBzeW1ib2xpYyBsaW5rCisJCQlzdXBwb3J0IGFuZCB3YW50IHRvIG1hcCB0aGUgdWlkIGFuZCBnaWQgZmllbGRzIAorCQkJdG8gdmFsdWVzIHN1cHBsaWVkIGF0IG1vdW50IChyYXRoZXIgdGhhbiB0aGUgCisJCQlhY3R1YWwgdmFsdWVzLCB0aGVuIHNldCB0aGlzIHRvIHplcm8uIChkZWZhdWx0IDEpCisKK1RoZXNlIGV4cGVyaW1lbnRhbCBmZWF0dXJlcyBhbmQgdHJhY2luZyBjYW4gYmUgZW5hYmxlZCBieSBjaGFuZ2luZyBmbGFncyBpbiAKKy9wcm9jL2ZzL2NpZnMgKGFmdGVyIHRoZSBjaWZzIG1vZHVsZSBoYXMgYmVlbiBpbnN0YWxsZWQgb3IgYnVpbHQgaW50byB0aGUgCitrZXJuZWwsIGUuZy4gIGluc21vZCBjaWZzKS4gIFRvIGVuYWJsZSBhIGZlYXR1cmUgc2V0IGl0IHRvIDEgZS5nLiAgdG8gZW5hYmxlIAordHJhY2luZyB0byB0aGUga2VybmVsIG1lc3NhZ2UgbG9nIHR5cGU6IAorCisJZWNobyAxID4gL3Byb2MvZnMvY2lmcy9jaWZzRllJCisJCithbmQgZm9yIG1vcmUgZXh0ZW5zaXZlIHRyYWNpbmcgaW5jbHVkaW5nIHRoZSBzdGFydCBvZiBzbWIgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcworCisJZWNobyAxID4gL3Byb2MvZnMvY2lmcy90cmFjZVNNQgorCitUd28gb3RoZXIgZXhwZXJpbWVudGFsIGZlYXR1cmVzIGFyZSB1bmRlciBkZXZlbG9wbWVudCBhbmQgdG8gdGVzdCAKK3JlcXVpcmUgZW5hYmxpbmcgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMCisKKwlNb3JlIGVmZmljaWVudCB3cml0ZSBvcGVyYXRpb25zIGFuZCBTTUIgYnVmZmVyIGhhbmRsaW5nCisKKwlETk9USUZZIGZjbnRsOiBuZWVkZWQgZm9yIHN1cHBvcnQgb2YgZGlyZWN0b3J5IGNoYW5nZSAKKwkJCSAgICBub3RpZmljYXRpb24gYW5kIHBlcmhhcHMgbGF0ZXIgZm9yIGZpbGUgbGVhc2VzKQorCitQZXIgc2hhcmUgKHBlciBjbGllbnQgbW91bnQpIHN0YXRpc3RpY3MgYXJlIGF2YWlsYWJsZSBpbiAvcHJvYy9mcy9jaWZzL1N0YXRzCitpZiB0aGUga2VybmVsIHdhcyBjb25maWd1cmVkIHdpdGggY2lmcyBzdGF0aXN0aWNzIGVuYWJsZWQuICBUaGUgc3RhdGlzdGljcworcmVwcmVzZW50IHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCAoaWUgbm9uLXplcm8gcmV0dXJuIGNvZGUgZnJvbSB0aGUgc2VydmVyKSAKK1NNQiByZXNwb25zZXMgdG8gc29tZSBvZiB0aGUgbW9yZSBjb21tb24gY29tbWFuZHMgKG9wZW4sIGRlbGV0ZSwgbWtkaXIgZXRjLikuCitBbHNvIHJlY29yZGVkIGlzIHRoZSB0b3RhbCBieXRlcyByZWFkIGFuZCBieXRlcyB3cml0dGVuIHRvIHRoZSBzZXJ2ZXIgZm9yCit0aGF0IHNoYXJlLiAgTm90ZSB0aGF0IGR1ZSB0byBjbGllbnQgY2FjaGluZyBlZmZlY3RzIHRoaXMgY2FuIGJlIGxlc3MgdGhhbiB0aGUKK251bWJlciBvZiBieXRlcyByZWFkIGFuZCB3cml0dGVuIGJ5IHRoZSBhcHBsaWNhdGlvbiBydW5uaW5nIG9uIHRoZSBjbGllbnQuCitUaGUgc3RhdGlzdGljcyBmb3IgdGhlIG51bWJlciBvZiB0b3RhbCBTTUJzIGFuZCBvcGxvY2sgYnJlYWtzIGFyZSBkaWZmZXJlbnQgaW4KK3RoYXQgdGhleSByZXByZXNlbnQgYWxsIGZvciB0aGF0IHNoYXJlLCBub3QganVzdCB0aG9zZSBmb3Igd2hpY2ggdGhlIHNlcnZlcgorcmV0dXJuZWQgc3VjY2Vzcy4KKwkKK0Fsc28gbm90ZSB0aGF0ICJjYXQgL3Byb2MvZnMvY2lmcy9EZWJ1Z0RhdGEiIHdpbGwgZGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCAKK3RoZSBhY3RpdmUgc2Vzc2lvbnMgYW5kIHRoZSBzaGFyZXMgdGhhdCBhcmUgbW91bnRlZC4gIE5vdGU6IE5UTE12MiBlbmFibGVtZW50IAord2lsbCBub3Qgd29yayBzaW5jZSB0aGV5IGl0cyBpbXBsZW1lbnRhdGlvbiBpcyBub3QgcXVpdGUgY29tcGxldGUgeWV0LgorRG8gbm90IGFsdGVyIHRoZXNlIGNvbmZpZ3VyYXRpb24gdmFsdWVzIHVubGVzcyB5b3UgYXJlIGRvaW5nIHNwZWNpZmljIHRlc3RpbmcuICAKK0VuYWJsaW5nIGV4dGVuZGVkIHNlY3VyaXR5IHdvcmtzIHRvIFdpbmRvd3MgMjAwMCBXb3Jrc3RhdGlvbnMgYW5kIFhQIGJ1dCBub3QgdG8gCitXaW5kb3dzIDIwMDAgc2VydmVyIG9yIFNhbWJhIHNpbmNlIGl0IGRvZXMgbm90IHVzdWFsbHkgc2VuZCAicmF3IE5UTE1TU1AiIAorKGluc3RlYWQgaXQgc2VuZHMgTlRMTVNTUCBlbmNhcHN1bGF0ZWQgaW4gU1BORUdPL0dTU0FQSSwgd2hpY2ggc3VwcG9ydCBpcyBub3QgCitjb21wbGV0ZSBpbiB0aGUgQ0lGUyBWRlMgeWV0KS4gIApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9UT0RPIGIvZnMvY2lmcy9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZTNlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL1RPRE8KQEAgLTAsMCArMSwxMDQgQEAKK3ZlcnNpb24gMS4yMiBKdWx5IDMwLCAyMDA0IAorCitBIFBhcnRpYWwgTGlzdCBvZiBNaXNzaW5nIEZlYXR1cmVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvbnRyaWJ1dGlvbnMgYXJlIHdlbGNvbWUuICBUaGVyZSBhcmUgcGxlbnR5IG9mIG9wcG9ydHVuaXRpZXMKK2ZvciB2aXNpYmxlLCBpbXBvcnRhbnQgY29udHJpYnV0aW9ucyB0byB0aGlzIG1vZHVsZS4gIEhlcmUKK2lzIGEgcGFydGlhbCBsaXN0IG9mIHRoZSBrbm93biBwcm9ibGVtcyBhbmQgbWlzc2luZyBmZWF0dXJlczoKKworYSkgU3VwcG9ydCBmb3IgU2VjdXJpdHlEZXNjcmlwdG9ycyBmb3IgY2htb2QvY2hncnAvY2hvd24gc28KK3RoZXNlIGNhbiBiZSBzdXBwb3J0ZWQgZm9yIFdpbmRvd3Mgc2VydmVycworCitiKSBCZXR0ZXIgcGFtL3dpbmJpbmQgaW50ZWdyYXRpb24gKGUuZy4gdG8gaGFuZGxlIHVpZCBtYXBwaW5nCitiZXR0ZXIpCisKK2MpIG11bHRpLXVzZXIgbW91bnRzIC0gbXVsdGlwbGV4ZWQgc2Vzc2lvbnNldHVwcyBvdmVyIHNpbmdsZSB2YworKGllIHRjcCBzZXNzaW9uKSAtIHByZXR0eWluZyB1cCBuZWVkZWQsIGFuZCBtb3JlIHRlc3RpbmcgbmVlZGVkCisKK2QpIEtlcmJlcm9zL1NQTkVHTyBzZXNzaW9uIHNldHVwIHN1cHBvcnQgLSAoc3RhcnRlZCkKKworZSkgTlRMTXYyIGF1dGhlbnRpY2F0aW9uIChtb3N0bHkgaW1wbGVtZW50ZWQpCisKK2YpIE1ENS1ITUFDIHNpZ25pbmcgU01CIFBEVXMgd2hlbiBTUE5FR08gc3R5bGUgU2Vzc2lvblNldHVwIAordXNlZCAoS2VyYmVyb3Mgb3IgTlRMTVNTUCkuIFNpZ25pbmcgYWxyZWFkeWltcGxlbWVudGVkIGZvciBOVExNCithbmQgcmF3IE5UTE1TU1AgYWxyZWFkeS4gVGhpcyBpcyBpbXBvcnRhbnQgd2hlbiBlbmFibGluZworZXh0ZW5kZWQgc2VjdXJpdHkgYW5kIG1vdW50aW5nIHRvIFdpbmRvd3MgMjAwMyBTZXJ2ZXJzCisKK2YpIERpcmVjdG9yeSBlbnRyeSBjYWNoaW5nIHJlbGllcyBvbiBhIDEgc2Vjb25kIHRpbWVyLCByYXRoZXIgdGhhbiAKK3VzaW5nIEZpbmROb3RpZnkgb3IgZXF1aXZhbGVudC4gIC0gKHN0YXJ0ZWQpCisKK2cpIEEgZmV3IGJ5dGUgcmFuZ2UgdGVzdGNhc2VzIGZhaWwgZHVlIHRvIFBPU0lYIHZzLiBXaW5kb3dzL0NJRlMKK3N0eWxlIGJ5dGUgcmFuZ2UgbG9jayBkaWZmZXJlbmNlcworCitoKSBxdW90YSBzdXBwb3J0CisKK2opIGZpbmlzaCB3cml0ZXBhZ2VzIHN1cHBvcnQgKG11bHRpLXBhZ2Ugd3JpdGUgYmVoaW5kIGZvciBpbXByb3ZlZAorcGVyZm9ybWFuY2UpIGFuZCBzeW5jcGFnZQorCitrKSBob29rIGxvd2VyIGludG8gdGhlIHNvY2tldHMgYXBpIChhcyBORlMvU3VuUlBDIGRvZXMpIHRvIGF2b2lkIHRoZQorZXh0cmEgY29weSBpbi9vdXQgb2YgdGhlIHNvY2tldCBidWZmZXJzIGluIHNvbWUgY2FzZXMuCisKK2wpIGZpbmlzaCBzdXBwb3J0IGZvciBJUHY2LiAgVGhpcyBpcyBtb3N0bHkgY29tcGxldGUgYnV0CituZWVkcyBhIHNpbXBsZSBjb252ZXJzaW9uIG9mIGlwdjYgdG8gc2luNl9hZGRyIGZyb20gdGhlCithZGRyZXNzIGluIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKworbSkgQmV0dGVyIG9wdGltaXplIG9wZW4gKGFuZCBwYXRoYmFzZWQgc2V0ZmlsZXNpemUpIHRvIHJlZHVjZSB0aGUKK29wbG9jayBicmVha3MgY29taW5nIGZyb20gd2luZG93cyBzcnYuICBQaWdneWJhY2sgaWRlbnRpY2FsIGZpbGUKK29wZW5zIG9uIHRvcCBvZiBlYWNoIG90aGVyIGJ5IGluY3JlbWVudGluZyByZWZlcmVuY2UgY291bnQgcmF0aGVyCit0aGFuIHJlc2VuZGluZyAoaGVscHMgcmVkdWNlIHNlcnZlciByZXNvdXJjZSB1dGlsaXphdGlvbiBhbmQgYXZvaWQKK3NwdXJpb3VzIG9wbG9jayBicmVha3MpLgorCitvKSBJbXByb3ZlIHBlcmZvcm1hbmNlIG9mIHJlYWRwYWdlcyBieSBzZW5kaW5nIG1vcmUgdGhhbiBvbmUgcmVhZAorYXQgYSB0aW1lIHdoZW4gOCBwYWdlcyBvciBtb3JlIGFyZSByZXF1ZXN0ZWQuIEluIGNvbmp1bnRpb24KK2FkZCBzdXBwb3J0IGZvciBhc3luY19jaWZzX3JlYWRwYWdlcy4KKworcCkgQWRkIHN1cHBvcnQgZm9yIHN0b3Jpbmcgc3ltbGluayBhbmQgZmlmbyBpbmZvIHRvIFdpbmRvd3Mgc2VydmVycyAKK2luIHRoZSBFeHRlbmRlZCBBdHRyaWJ1dGUgZm9ybWF0IHRoZWlyIFNGVSBjbGllbnRzIHdvdWxkIHJlY29nbml6ZS4KKworcSkgRmluaXNoIGZjbnRsIERfTk9USUZZIHN1cHBvcnQgc28ga2RlIGFuZCBnbm9tZSBmaWxlIGxpc3Qgd2luZG93cword2lsbCBhdXRvcmVmcmVzaCAoc3RhcnRlZCkKKworcikgQWRkIEdVSSB0b29sIHRvIGNvbmZpZ3VyZSAvcHJvYy9mcy9jaWZzIHNldHRpbmdzIGFuZCBmb3IgZGlzcGxheSBvZgordGhlIENJRlMgc3RhdGlzdGljcyAoc3RhcnRlZCkKKworcSkgaW1wbGVtZW50IHN1cHBvcnQgZm9yIHNlY3VyaXR5IGFuZCB0cnVzdGVkIGNhdGVnb3JpZXMgb2YgeGF0dHJzCisocmVxdWlyZXMgbWlub3IgcHJvdG9jb2wgZXh0ZW5zaW9uKSB0byBlbmFibGUgYmV0dGVyIHN1cHBvcnQgZm9yIFNFTElOVVgKKworcikgSW1wbGVtZW50IE9fRElSRUNUIGZsYWcgb24gb3BlbiAoYWxyZWFkeSBzdXBwb3J0ZWQgb24gbW91bnQpCisKK0tOT1dOIEJVR1MgKHVwZGF0ZWQgRGVjZW1iZXIgMTAsIDIwMDQpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzEpIGV4aXN0aW5nIHN5bWJvbGljIGxpbmtzIChXaW5kb3dzIHJlcGFyc2UgcG9pbnRzKSBhcmUgcmVjb2duaXplZCBidXQKK2NhbiBub3QgYmUgY3JlYXRlZCByZW1vdGVseS4gVGhleSBhcmUgaW1wbGVtZW50ZWQgZm9yIFNhbWJhIGFuZCB0aG9zZSB0aGF0CitzdXBwb3J0IHRoZSBDSUZTIFVuaXggZXh0ZW5zaW9ucyBidXQgU2FtYmEgaGFzIGEgYnVnIGN1cnJlbnRseSBoYW5kbGluZworc3ltbGluayB0ZXh0IGJlZ2lubmluZyB3aXRoIHNsYXNoCisyKSBmb2xsb3dfbGluayBhbmQgcmVhZGRpciBjb2RlIGRvZXMgbm90IGZvbGxvdyBkZnMganVuY3Rpb25zCitidXQgcmVjb2duaXplcyB0aGVtCiszKSBjcmVhdGUgb2YgbmV3IGZpbGVzIHRvIEZBVCBwYXJ0aXRpb25zIG9uIFdpbmRvd3Mgc2VydmVycyBjYW4KK3N1Y2NlZWQgYnV0IHN0aWxsIHJldHVybiBhY2Nlc3MgZGVuaWVkIChhcHBlYXJzIHRvIGJlIFdpbmRvd3MgCitzZXJ2ZXIgbm90IGNpZnMgY2xpZW50IHByb2JsZW0pIGFuZCBoYXMgbm90IGJlZW4gcmVwcm9kdWNlZCByZWNlbnRseS4KK05URlMgcGFydGl0aW9ucyBkbyBub3QgaGF2ZSB0aGlzIHByb2JsZW0uCis0KSBkZWJ1ZyBjb25uZWN0YXRob24gbG9jayB0ZXN0IGNhc2UgMTAgd2hpY2ggZmFpbHMgYWdhaW5zdAorU2FtYmEgKG1heSBiZSB1bm1hcHBhYmxlIGR1ZSB0byBQT1NJWCB0byBXaW5kb3dzIGxvY2sgbW9kZWwKK2RpZmZlcmVuY2VzIGJ1dCB3b3J0aCBpbnZlc3RpZ2F0aW5nKS4gIEFsc28gZGVidWcgU2FtYmEgdG8gCitzZWUgd2h5IGxvY2sgdGVzdCBjYXNlIDcgdGFrZXMgbG9uZ2VyIHRvIGNvbXBsZXRlIHRvIFNhbWJhCit0aGFuIHRvIFdpbmRvd3MuCisKK01pc2MgdGVzdGluZyB0byBkbworPT09PT09PT09PT09PT09PT09CisxKSBjaGVjayBvdXQgbWF4IHBhdGggbmFtZXMgYW5kIG1heCBwYXRoIG5hbWUgY29tcG9uZW50cyBhZ2FpbnN0IHZhcmlvdXMgc2VydmVyCit0eXBlcy4gVHJ5IG5lc3RlZCBzeW1saW5rcyAoOCBkZWVwKS4gUmV0dXJuIG1heCBwYXRoIG5hbWUgaW4gc3RhdCAtZiBpbmZvcm1hdGlvbgorCisyKSBNb2RpZnkgZmlsZSBwb3J0aW9uIG9mIGx0cCBzbyBpdCBjYW4gcnVuIGFnYWluc3QgYSBtb3VudGVkIG5ldHdvcmsKK3NoYXJlIGFuZCBydW4gaXQgYWdhaW5zdCBjaWZzIHZmcy4KKworMykgQWRkaXRpb25hbCBwZXJmb3JtYW5jZSB0ZXN0aW5nIGFuZCBvcHRpbWl6YXRpb24gdXNpbmcgaW96b25lIGFuZCBzaW1pbGFyIC0gCit0aGVyZSBhcmUgc29tZSBlYXN5IGNoYW5nZXMgdGhhdCBjYW4gYmUgZG9uZSB0byBwYXJhbGxlbGl6ZSBzZXF1ZW50aWFsIHdyaXRlcywKK2FuZCB3aGVuIHNpZ25pbmcgaXMgZGlzYWJsZWQgdG8gcmVxdWVzdCBsYXJnZXIgcmVhZCBzaXplcyAobGFyZ2VyIHRoYW4gCituZWdvdGlhdGVkIHNpemUpIGFuZCBzZW5kIGxhcmdlciB3cml0ZSBzaXplcyB0byBtb2Rlcm4gc2VydmVycy4KKworNCkgTW9yZSBleGhhdXN0aXZlbHkgdGVzdCB0aGUgcmVjZW50bHkgYWRkZWQgTlQ0IHN1cHBvcnQgYWdhaW5zdCB2YXJpb3VzCitOVDQgc2VydmljZSBwYWNrIGxldmVscywgYW5kIGZpeCBjaWZzX3NldGF0dHIgZm9yIHNldHRpbmcgZmlsZSB0aW1lcyBhbmQgCitzaXplIHRvIGZhbGwgYmFjayB0byBsZXZlbCAxIHdoZW4gZXJyb3IgaW52YWxpZCBsZXZlbCByZXR1cm5lZC4KKwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9hc24xLmMgYi9mcy9jaWZzL2FzbjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDIwMTBkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9hc24xLmMKQEAgLTAsMCArMSw2MTggQEAKKy8qIAorICogVGhlIEFTQi4xL0JFUiBwYXJzaW5nIGNvZGUgaXMgZGVyaXZlZCBmcm9tIGlwX25hdF9zbm1wX2Jhc2ljLmMgd2hpY2ggd2FzIGluCisgKiB0dXJuIGRlcml2ZWQgZnJvbSB0aGUgZ3hzbm1wIHBhY2thZ2UgYnkgR3JlZ29yeSBNY0xlYW4gJiBKb2NoZW4gRnJpZWRyaWNoCisgKiAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDAwIFJQIEludGVybmV0ICh3d3cucnBpLm5ldC5hdSkuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImNpZnNwZHUuaCIKKyNpbmNsdWRlICJjaWZzZ2xvYi5oIgorI2luY2x1ZGUgImNpZnNfZGVidWcuaCIKKyNpbmNsdWRlICJjaWZzcHJvdG8uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQmFzaWMgQVNOLjEgZGVjb2Rpbmcgcm91dGluZXMgKGd4c25tcCBhdXRob3IgRGlyayBXaXNzZSkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENsYXNzICovCisjZGVmaW5lIEFTTjFfVU5JCTAJLyogVW5pdmVyc2FsICovCisjZGVmaW5lIEFTTjFfQVBMCTEJLyogQXBwbGljYXRpb24gKi8KKyNkZWZpbmUgQVNOMV9DVFgJMgkvKiBDb250ZXh0ICovCisjZGVmaW5lIEFTTjFfUFJWCTMJLyogUHJpdmF0ZSAqLworCisvKiBUYWcgKi8KKyNkZWZpbmUgQVNOMV9FT0MJMAkvKiBFbmQgT2YgQ29udGVudHMgb3IgTi9BICovCisjZGVmaW5lIEFTTjFfQk9MCTEJLyogQm9vbGVhbiAqLworI2RlZmluZSBBU04xX0lOVAkyCS8qIEludGVnZXIgKi8KKyNkZWZpbmUgQVNOMV9CVFMJMwkvKiBCaXQgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfT1RTCTQJLyogT2N0ZXQgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfTlVMCTUJLyogTnVsbCAqLworI2RlZmluZSBBU04xX09KSQk2CS8qIE9iamVjdCBJZGVudGlmaWVyICAqLworI2RlZmluZSBBU04xX09KRAk3CS8qIE9iamVjdCBEZXNjcmlwdGlvbiAqLworI2RlZmluZSBBU04xX0VYVAk4CS8qIEV4dGVybmFsICovCisjZGVmaW5lIEFTTjFfU0VRCTE2CS8qIFNlcXVlbmNlICovCisjZGVmaW5lIEFTTjFfU0VUCTE3CS8qIFNldCAqLworI2RlZmluZSBBU04xX05VTVNUUgkxOAkvKiBOdW1lcmljYWwgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfUFJOU1RSCTE5CS8qIFByaW50YWJsZSBTdHJpbmcgKi8KKyNkZWZpbmUgQVNOMV9URVhTVFIJMjAJLyogVGVsZXRleHQgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfVklEU1RSCTIxCS8qIFZpZGVvIFN0cmluZyAqLworI2RlZmluZSBBU04xX0lBNVNUUgkyMgkvKiBJQTUgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfVU5JVElNCTIzCS8qIFVuaXZlcnNhbCBUaW1lICovCisjZGVmaW5lIEFTTjFfR0VOVElNCTI0CS8qIEdlbmVyYWwgVGltZSAqLworI2RlZmluZSBBU04xX0dSQVNUUgkyNQkvKiBHcmFwaGljYWwgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfVklTU1RSCTI2CS8qIFZpc2libGUgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfR0VOU1RSCTI3CS8qIEdlbmVyYWwgU3RyaW5nICovCisKKy8qIFByaW1pdGl2ZSAvIENvbnN0cnVjdGVkIG1ldGhvZHMqLworI2RlZmluZSBBU04xX1BSSQkwCS8qIFByaW1pdGl2ZSAqLworI2RlZmluZSBBU04xX0NPTgkxCS8qIENvbnN0cnVjdGVkICovCisKKy8qCisgKiBFcnJvciBjb2Rlcy4KKyAqLworI2RlZmluZSBBU04xX0VSUl9OT0VSUk9SCQkwCisjZGVmaW5lIEFTTjFfRVJSX0RFQ19FTVBUWQkJMgorI2RlZmluZSBBU04xX0VSUl9ERUNfRU9DX01JU01BVENICTMKKyNkZWZpbmUgQVNOMV9FUlJfREVDX0xFTkdUSF9NSVNNQVRDSAk0CisjZGVmaW5lIEFTTjFfRVJSX0RFQ19CQURWQUxVRQkJNQorCisjZGVmaW5lIFNQTkVHT19PSURfTEVOIDcKKyNkZWZpbmUgTlRMTVNTUF9PSURfTEVOICAxMAorc3RhdGljIHVuc2lnbmVkIGxvbmcgU1BORUdPX09JRFs3XSA9IHsgMSwgMywgNiwgMSwgNSwgNSwgMiB9Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgTlRMTVNTUF9PSURbMTBdID0geyAxLCAzLCA2LCAxLCA0LCAxLCAzMTEsIDIsIDIsIDEwIH07CisKKy8qIAorICogQVNOLjEgY29udGV4dC4KKyAqLworc3RydWN0IGFzbjFfY3R4IHsKKwlpbnQgZXJyb3I7CQkvKiBFcnJvciBjb25kaXRpb24gKi8KKwl1bnNpZ25lZCBjaGFyICpwb2ludGVyOwkvKiBPY3RldCBqdXN0IHRvIGJlIGRlY29kZWQgKi8KKwl1bnNpZ25lZCBjaGFyICpiZWdpbjsJLyogRmlyc3Qgb2N0ZXQgKi8KKwl1bnNpZ25lZCBjaGFyICplbmQ7CS8qIE9jdGV0IGFmdGVyIGxhc3Qgb2N0ZXQgKi8KK307CisKKy8qCisgKiBPY3RldCBzdHJpbmcgKG5vdCBudWxsIHRlcm1pbmF0ZWQpCisgKi8KK3N0cnVjdCBhc24xX29jdHN0ciB7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwl1bnNpZ25lZCBpbnQgbGVuOworfTsKKworc3RhdGljIHZvaWQKK2FzbjFfb3BlbihzdHJ1Y3QgYXNuMV9jdHggKmN0eCwgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWN0eC0+YmVnaW4gPSBidWY7CisJY3R4LT5lbmQgPSBidWYgKyBsZW47CisJY3R4LT5wb2ludGVyID0gYnVmOworCWN0eC0+ZXJyb3IgPSBBU04xX0VSUl9OT0VSUk9SOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhcgorYXNuMV9vY3RldF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmNoKQoreworCWlmIChjdHgtPnBvaW50ZXIgPj0gY3R4LT5lbmQpIHsKKwkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19FTVBUWTsKKwkJcmV0dXJuIDA7CisJfQorCSpjaCA9ICooY3R4LT5wb2ludGVyKSsrOworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhcgorYXNuMV90YWdfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LCB1bnNpZ25lZCBpbnQgKnRhZykKK3sKKwl1bnNpZ25lZCBjaGFyIGNoOworCisJKnRhZyA9IDA7CisKKwlkbyB7CisJCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQorCQkJcmV0dXJuIDA7CisJCSp0YWcgPDw9IDc7CisJCSp0YWcgfD0gY2ggJiAweDdGOworCX0gd2hpbGUgKChjaCAmIDB4ODApID09IDB4ODApOworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhcgorYXNuMV9pZF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCisJICAgICAgIHVuc2lnbmVkIGludCAqY2xzLCB1bnNpZ25lZCBpbnQgKmNvbiwgdW5zaWduZWQgaW50ICp0YWcpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKworCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQorCQlyZXR1cm4gMDsKKworCSpjbHMgPSAoY2ggJiAweEMwKSA+PiA2OworCSpjb24gPSAoY2ggJiAweDIwKSA+PiA1OworCSp0YWcgPSAoY2ggJiAweDFGKTsKKworCWlmICgqdGFnID09IDB4MUYpIHsKKwkJaWYgKCFhc24xX3RhZ19kZWNvZGUoY3R4LCB0YWcpKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhcgorYXNuMV9sZW5ndGhfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LCB1bnNpZ25lZCBpbnQgKmRlZiwgdW5zaWduZWQgaW50ICpsZW4pCit7CisJdW5zaWduZWQgY2hhciBjaCwgY250OworCisJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCXJldHVybiAwOworCisJaWYgKGNoID09IDB4ODApCisJCSpkZWYgPSAwOworCWVsc2UgeworCQkqZGVmID0gMTsKKworCQlpZiAoY2ggPCAweDgwKQorCQkJKmxlbiA9IGNoOworCQllbHNlIHsKKwkJCWNudCA9ICh1bnNpZ25lZCBjaGFyKSAoY2ggJiAweDdGKTsKKwkJCSpsZW4gPSAwOworCisJCQl3aGlsZSAoY250ID4gMCkgeworCQkJCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQorCQkJCQlyZXR1cm4gMDsKKwkJCQkqbGVuIDw8PSA4OworCQkJCSpsZW4gfD0gY2g7CisJCQkJY250LS07CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCithc24xX2hlYWRlcl9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCisJCSAgIHVuc2lnbmVkIGNoYXIgKiplb2MsCisJCSAgIHVuc2lnbmVkIGludCAqY2xzLCB1bnNpZ25lZCBpbnQgKmNvbiwgdW5zaWduZWQgaW50ICp0YWcpCit7CisJdW5zaWduZWQgaW50IGRlZiwgbGVuOworCisJaWYgKCFhc24xX2lkX2RlY29kZShjdHgsIGNscywgY29uLCB0YWcpKQorCQlyZXR1cm4gMDsKKworCWlmICghYXNuMV9sZW5ndGhfZGVjb2RlKGN0eCwgJmRlZiwgJmxlbikpCisJCXJldHVybiAwOworCisJaWYgKGRlZikKKwkJKmVvYyA9IGN0eC0+cG9pbnRlciArIGxlbjsKKwllbHNlCisJCSplb2MgPSBOVUxMOworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhcgorYXNuMV9lb2NfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LCB1bnNpZ25lZCBjaGFyICplb2MpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKworCWlmIChlb2MgPT0gTlVMTCkgeworCQlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgJmNoKSkKKwkJCXJldHVybiAwOworCisJCWlmIChjaCAhPSAweDAwKSB7CisJCQljdHgtPmVycm9yID0gQVNOMV9FUlJfREVDX0VPQ19NSVNNQVRDSDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoY2ggIT0gMHgwMCkgeworCQkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19FT0NfTUlTTUFUQ0g7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlpZiAoY3R4LT5wb2ludGVyICE9IGVvYykgeworCQkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19MRU5HVEhfTUlTTUFUQ0g7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMTsKKwl9Cit9CisKKy8qIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfbnVsbF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCisJCQkJICAgICAgdW5zaWduZWQgY2hhciAqZW9jKQoreworCWN0eC0+cG9pbnRlciA9IGVvYzsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNuMV9sb25nX2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwKKwkJCQkgICAgICB1bnNpZ25lZCBjaGFyICplb2MsIGxvbmcgKmludGVnZXIpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCXJldHVybiAwOworCisJKmludGVnZXIgPSAoc2lnbmVkIGNoYXIpIGNoOworCWxlbiA9IDE7CisKKwl3aGlsZSAoY3R4LT5wb2ludGVyIDwgZW9jKSB7CisJCWlmICgrK2xlbiA+IHNpemVvZihsb25nKSkgeworCQkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19CQURWQUxVRTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCQlyZXR1cm4gMDsKKworCQkqaW50ZWdlciA8PD0gODsKKwkJKmludGVnZXIgfD0gY2g7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhc24xX3VpbnRfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAorCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmVvYywKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgKmludGVnZXIpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCXJldHVybiAwOworCisJKmludGVnZXIgPSBjaDsKKwlpZiAoY2ggPT0gMCkKKwkJbGVuID0gMDsKKwllbHNlCisJCWxlbiA9IDE7CisKKwl3aGlsZSAoY3R4LT5wb2ludGVyIDwgZW9jKSB7CisJCWlmICgrK2xlbiA+IHNpemVvZih1bnNpZ25lZCBpbnQpKSB7CisJCQljdHgtPmVycm9yID0gQVNOMV9FUlJfREVDX0JBRFZBTFVFOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgJmNoKSkKKwkJCXJldHVybiAwOworCisJCSppbnRlZ2VyIDw8PSA4OworCQkqaW50ZWdlciB8PSBjaDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfdWxvbmdfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAorCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICplb2MsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmludGVnZXIpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCXJldHVybiAwOworCisJKmludGVnZXIgPSBjaDsKKwlpZiAoY2ggPT0gMCkKKwkJbGVuID0gMDsKKwllbHNlCisJCWxlbiA9IDE7CisKKwl3aGlsZSAoY3R4LT5wb2ludGVyIDwgZW9jKSB7CisJCWlmICgrK2xlbiA+IHNpemVvZih1bnNpZ25lZCBsb25nKSkgeworCQkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19CQURWQUxVRTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCQlyZXR1cm4gMDsKKworCQkqaW50ZWdlciA8PD0gODsKKwkJKmludGVnZXIgfD0gY2g7CisJfQorCXJldHVybiAxOworfSAKKworc3RhdGljIHVuc2lnbmVkIGNoYXIKK2FzbjFfb2N0ZXRzX2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwKKwkJICAgdW5zaWduZWQgY2hhciAqZW9jLAorCQkgICB1bnNpZ25lZCBjaGFyICoqb2N0ZXRzLCB1bnNpZ25lZCBpbnQgKmxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisKKwkqbGVuID0gMDsKKworCSpvY3RldHMgPSBrbWFsbG9jKGVvYyAtIGN0eC0+cG9pbnRlciwgR0ZQX0FUT01JQyk7CisJaWYgKCpvY3RldHMgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlwdHIgPSAqb2N0ZXRzOworCXdoaWxlIChjdHgtPnBvaW50ZXIgPCBlb2MpIHsKKwkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICh1bnNpZ25lZCBjaGFyICopIHB0cisrKSkgeworCQkJa2ZyZWUoKm9jdGV0cyk7CisJCQkqb2N0ZXRzID0gTlVMTDsKKwkJCXJldHVybiAwOworCQl9CisJCSgqbGVuKSsrOworCX0KKwlyZXR1cm4gMTsKK30gKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIKK2FzbjFfc3ViaWRfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nICpzdWJpZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGNoOworCisJKnN1YmlkID0gMDsKKworCWRvIHsKKwkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCQlyZXR1cm4gMDsKKworCQkqc3ViaWQgPDw9IDc7CisJCSpzdWJpZCB8PSBjaCAmIDB4N0Y7CisJfSB3aGlsZSAoKGNoICYgMHg4MCkgPT0gMHg4MCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgCithc24xX29pZF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCisJCXVuc2lnbmVkIGNoYXIgKmVvYywgdW5zaWduZWQgbG9uZyAqKm9pZCwgdW5zaWduZWQgaW50ICpsZW4pCit7CisJdW5zaWduZWQgbG9uZyBzdWJpZDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1bnNpZ25lZCBsb25nICpvcHRyOworCisJc2l6ZSA9IGVvYyAtIGN0eC0+cG9pbnRlciArIDE7CisJKm9pZCA9IGttYWxsb2Moc2l6ZSAqIHNpemVvZiAodW5zaWduZWQgbG9uZyksIEdGUF9BVE9NSUMpOworCWlmICgqb2lkID09IE5VTEwpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJb3B0ciA9ICpvaWQ7CisKKwlpZiAoIWFzbjFfc3ViaWRfZGVjb2RlKGN0eCwgJnN1YmlkKSkgeworCQlrZnJlZSgqb2lkKTsKKwkJKm9pZCA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdWJpZCA8IDQwKSB7CisJCW9wdHJbMF0gPSAwOworCQlvcHRyWzFdID0gc3ViaWQ7CisJfSBlbHNlIGlmIChzdWJpZCA8IDgwKSB7CisJCW9wdHJbMF0gPSAxOworCQlvcHRyWzFdID0gc3ViaWQgLSA0MDsKKwl9IGVsc2UgeworCQlvcHRyWzBdID0gMjsKKwkJb3B0clsxXSA9IHN1YmlkIC0gODA7CisJfQorCisJKmxlbiA9IDI7CisJb3B0ciArPSAyOworCisJd2hpbGUgKGN0eC0+cG9pbnRlciA8IGVvYykgeworCQlpZiAoKysoKmxlbikgPiBzaXplKSB7CisJCQljdHgtPmVycm9yID0gQVNOMV9FUlJfREVDX0JBRFZBTFVFOworCQkJa2ZyZWUoKm9pZCk7CisJCQkqb2lkID0gTlVMTDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFhc24xX3N1YmlkX2RlY29kZShjdHgsIG9wdHIrKykpIHsKKwkJCWtmcmVlKCpvaWQpOworCQkJKm9pZCA9IE5VTEw7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorY29tcGFyZV9vaWQodW5zaWduZWQgbG9uZyAqb2lkMSwgdW5zaWduZWQgaW50IG9pZDFsZW4sCisJICAgIHVuc2lnbmVkIGxvbmcgKm9pZDIsIHVuc2lnbmVkIGludCBvaWQybGVuKQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKG9pZDFsZW4gIT0gb2lkMmxlbikKKwkJcmV0dXJuIDA7CisJZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBvaWQxbGVuOyBpKyspIHsKKwkJCWlmIChvaWQxW2ldICE9IG9pZDJbaV0pCisJCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorfQorCisJLyogQkIgY2hlY2sgZm9yIGVuZGlhbiBjb252ZXJzaW9uIGlzc3VlcyBoZXJlICovCisKK2ludAorZGVjb2RlX25lZ1Rva2VuSW5pdCh1bnNpZ25lZCBjaGFyICpzZWN1cml0eV9ibG9iLCBpbnQgbGVuZ3RoLAorCQkgICAgZW51bSBzZWN1cml0eUVudW0gKnNlY1R5cGUpCit7CisJc3RydWN0IGFzbjFfY3R4IGN0eDsKKwl1bnNpZ25lZCBjaGFyICplbmQ7CisJdW5zaWduZWQgY2hhciAqc2VxdWVuY2VfZW5kOworCXVuc2lnbmVkIGxvbmcgKm9pZCA9IE5VTEw7CisJdW5zaWduZWQgaW50IGNscywgY29uLCB0YWcsIG9pZGxlbiwgcmM7CisJaW50IHVzZV9udGxtc3NwID0gRkFMU0U7CisKKwkqc2VjVHlwZSA9IE5UTE07IC8qIEJCIGV2ZW50dWFsbHkgbWFrZSBLZXJiZXJvcyBvciBOTFRNU1NQIHRoZSBkZWZhdWx0ICovCisKKwkvKiBjaWZzX2R1bXBfbWVtKCIgUmVjZWl2ZWQgU2VjQmxvYiAiLCBzZWN1cml0eV9ibG9iLCBsZW5ndGgpOyAqLworCisJYXNuMV9vcGVuKCZjdHgsIHNlY3VyaXR5X2Jsb2IsIGxlbmd0aCk7CisKKwlpZiAoYXNuMV9oZWFkZXJfZGVjb2RlKCZjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpID09IDApIHsKKwkJY0ZZSSgxLCAoIkVycm9yIGRlY29kaW5nIG5lZ1Rva2VuSW5pdCBoZWFkZXIgIikpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKChjbHMgIT0gQVNOMV9BUEwpIHx8IChjb24gIT0gQVNOMV9DT04pCisJCSAgIHx8ICh0YWcgIT0gQVNOMV9FT0MpKSB7CisJCWNGWUkoMSwgKCJjbHMgPSAlZCBjb24gPSAlZCB0YWcgPSAlZCIsIGNscywgY29uLCB0YWcpKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogICAgICByZW1lbWJlciB0byBmcmVlIG9iai0+b2lkICovCisJCXJjID0gYXNuMV9oZWFkZXJfZGVjb2RlKCZjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpOworCQlpZiAocmMpIHsKKwkJCWlmICgodGFnID09IEFTTjFfT0pJKSAmJiAoY2xzID09IEFTTjFfUFJJKSkgeworCQkJCXJjID0gYXNuMV9vaWRfZGVjb2RlKCZjdHgsIGVuZCwgJm9pZCwgJm9pZGxlbik7CisJCQkJaWYgKHJjKSB7CisJCQkJCXJjID0gY29tcGFyZV9vaWQob2lkLCBvaWRsZW4sCisJCQkJCQkJIFNQTkVHT19PSUQsCisJCQkJCQkJIFNQTkVHT19PSURfTEVOKTsKKwkJCQkJa2ZyZWUob2lkKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlyYyA9IDA7CisJCX0KKworCQlpZiAoIXJjKSB7CisJCQljRllJKDEsICgiRXJyb3IgZGVjb2RpbmcgbmVnVG9rZW5Jbml0IGhlYWRlciIpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKGFzbjFfaGVhZGVyX2RlY29kZSgmY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKSA9PSAwKSB7CisJCQljRllJKDEsICgiRXJyb3IgZGVjb2RpbmcgbmVnVG9rZW5Jbml0ICIpKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKChjbHMgIT0gQVNOMV9DVFgpIHx8IChjb24gIT0gQVNOMV9DT04pCisJCQkgICB8fCAodGFnICE9IEFTTjFfRU9DKSkgeworCQkJY0ZZSSgxLCgiY2xzID0gJWQgY29uID0gJWQgdGFnID0gJWQgZW5kID0gJXAgKCVkKSBleGl0IDAiLAorCQkJICAgICAgY2xzLCBjb24sIHRhZywgZW5kLCAqZW5kKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChhc24xX2hlYWRlcl9kZWNvZGUoJmN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykgPT0gMCkgeworCQkJY0ZZSSgxLCAoIkVycm9yIGRlY29kaW5nIG5lZ1Rva2VuSW5pdCAiKSk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmICgoY2xzICE9IEFTTjFfVU5JKSB8fCAoY29uICE9IEFTTjFfQ09OKQorCQkJICAgfHwgKHRhZyAhPSBBU04xX1NFUSkpIHsKKwkJCWNGWUkoMSwoImNscyA9ICVkIGNvbiA9ICVkIHRhZyA9ICVkIGVuZCA9ICVwICglZCkgZXhpdCAxIiwKKwkJCSAgICAgIGNscywgY29uLCB0YWcsIGVuZCwgKmVuZCkpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoYXNuMV9oZWFkZXJfZGVjb2RlKCZjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpID09IDApIHsKKwkJCWNGWUkoMSwgKCJFcnJvciBkZWNvZGluZyAybmQgcGFydCBvZiBuZWdUb2tlbkluaXQgIikpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoKGNscyAhPSBBU04xX0NUWCkgfHwgKGNvbiAhPSBBU04xX0NPTikKKwkJCSAgIHx8ICh0YWcgIT0gQVNOMV9FT0MpKSB7CisJCQljRllJKDEsCisJCQkgICAgICgiY2xzID0gJWQgY29uID0gJWQgdGFnID0gJWQgZW5kID0gJXAgKCVkKSBleGl0IDAiLAorCQkJICAgICAgY2xzLCBjb24sIHRhZywgZW5kLCAqZW5kKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChhc24xX2hlYWRlcl9kZWNvZGUKKwkJICAgICgmY3R4LCAmc2VxdWVuY2VfZW5kLCAmY2xzLCAmY29uLCAmdGFnKSA9PSAwKSB7CisJCQljRllJKDEsICgiRXJyb3IgZGVjb2RpbmcgMm5kIHBhcnQgb2YgbmVnVG9rZW5Jbml0ICIpKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKChjbHMgIT0gQVNOMV9VTkkpIHx8IChjb24gIT0gQVNOMV9DT04pCisJCQkgICB8fCAodGFnICE9IEFTTjFfU0VRKSkgeworCQkJY0ZZSSgxLAorCQkJICAgICAoImNscyA9ICVkIGNvbiA9ICVkIHRhZyA9ICVkIGVuZCA9ICVwICglZCkgZXhpdCAxIiwKKwkJCSAgICAgIGNscywgY29uLCB0YWcsIGVuZCwgKmVuZCkpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQl3aGlsZSAoIWFzbjFfZW9jX2RlY29kZSgmY3R4LCBzZXF1ZW5jZV9lbmQpKSB7CisJCQlyYyA9IGFzbjFfaGVhZGVyX2RlY29kZSgmY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKTsKKwkJCWlmICghcmMpIHsKKwkJCQljRllJKDEsCisJCQkJICAgICAoIkVycm9yIDEgZGVjb2RpbmcgbmVnVG9rZW5Jbml0IGhlYWRlciBleGl0IDIiKSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoKHRhZyA9PSBBU04xX09KSSkgJiYgKGNvbiA9PSBBU04xX1BSSSkpIHsKKwkJCQlyYyA9IGFzbjFfb2lkX2RlY29kZSgmY3R4LCBlbmQsICZvaWQsICZvaWRsZW4pOworCQkJCWlmKHJjKSB7CQkKKwkJCQkJY0ZZSSgxLAorCQkJCQkgICgiT0lEIGxlbiA9ICVkIG9pZCA9IDB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4IiwKKwkJCQkJICAgb2lkbGVuLCAqb2lkLCAqKG9pZCArIDEpLCAqKG9pZCArIDIpLAorCQkJCQkgICAqKG9pZCArIDMpKSk7CisJCQkJCXJjID0gY29tcGFyZV9vaWQob2lkLCBvaWRsZW4sIE5UTE1TU1BfT0lELAorCQkJCQkJIE5UTE1TU1BfT0lEX0xFTik7CisJCQkJCWlmKG9pZCkKKwkJCQkJCWtmcmVlKG9pZCk7CisJCQkJCWlmIChyYykKKwkJCQkJCXVzZV9udGxtc3NwID0gVFJVRTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWNGWUkoMSwoIlRoaXMgc2hvdWxkIGJlIGFuIG9pZCB3aGF0IGlzIGdvaW5nIG9uPyAiKSk7CisJCQl9CisJCX0KKworCQlpZiAoYXNuMV9oZWFkZXJfZGVjb2RlKCZjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpID09IDApIHsKKwkJCWNGWUkoMSwKKwkJCSAgICAgKCJFcnJvciBkZWNvZGluZyBsYXN0IHBhcnQgb2YgbmVnVG9rZW5Jbml0IGV4aXQgMyIpKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKChjbHMgIT0gQVNOMV9DVFgpIHx8IChjb24gIT0gQVNOMV9DT04pKSB7CS8qIHRhZyA9IDMgaW5kaWNhdGluZyBtZWNoTGlzdE1JQyAqLworCQkJY0ZZSSgxLAorCQkJICAgICAoIkV4aXQgNCBjbHMgPSAlZCBjb24gPSAlZCB0YWcgPSAlZCBlbmQgPSAlcCAoJWQpIiwKKwkJCSAgICAgIGNscywgY29uLCB0YWcsIGVuZCwgKmVuZCkpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGFzbjFfaGVhZGVyX2RlY29kZSgmY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKSA9PSAwKSB7CisJCQljRllJKDEsCisJCQkgICAgICgiRXJyb3IgZGVjb2RpbmcgbGFzdCBwYXJ0IG9mIG5lZ1Rva2VuSW5pdCBleGl0IDUiKSk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmICgoY2xzICE9IEFTTjFfVU5JKSB8fCAoY29uICE9IEFTTjFfQ09OKQorCQkJICAgfHwgKHRhZyAhPSBBU04xX1NFUSkpIHsKKwkJCWNGWUkoMSwKKwkJCSAgICAgKCJFeGl0IDYgY2xzID0gJWQgY29uID0gJWQgdGFnID0gJWQgZW5kID0gJXAgKCVkKSIsCisJCQkgICAgICBjbHMsIGNvbiwgdGFnLCBlbmQsICplbmQpKTsKKwkJfQorCisJCWlmIChhc24xX2hlYWRlcl9kZWNvZGUoJmN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykgPT0gMCkgeworCQkJY0ZZSSgxLAorCQkJICAgICAoIkVycm9yIGRlY29kaW5nIGxhc3QgcGFydCBvZiBuZWdUb2tlbkluaXQgZXhpdCA3IikpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoKGNscyAhPSBBU04xX0NUWCkgfHwgKGNvbiAhPSBBU04xX0NPTikpIHsKKwkJCWNGWUkoMSwKKwkJCSAgICAgKCJFeGl0IDggY2xzID0gJWQgY29uID0gJWQgdGFnID0gJWQgZW5kID0gJXAgKCVkKSIsCisJCQkgICAgICBjbHMsIGNvbiwgdGFnLCBlbmQsICplbmQpKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChhc24xX2hlYWRlcl9kZWNvZGUoJmN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykgPT0gMCkgeworCQkJY0ZZSSgxLAorCQkJICAgICAoIkVycm9yIGRlY29kaW5nIGxhc3QgcGFydCBvZiBuZWdUb2tlbkluaXQgZXhpdCA5IikpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoKGNscyAhPSBBU04xX1VOSSkgfHwgKGNvbiAhPSBBU04xX1BSSSkKKwkJCSAgIHx8ICh0YWcgIT0gQVNOMV9HRU5TVFIpKSB7CisJCQljRllJKDEsCisJCQkgICAgICgiRXhpdCAxMCBjbHMgPSAlZCBjb24gPSAlZCB0YWcgPSAlZCBlbmQgPSAlcCAoJWQpIiwKKwkJCSAgICAgIGNscywgY29uLCB0YWcsIGVuZCwgKmVuZCkpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY0ZZSSgxLCAoIk5lZWQgdG8gY2FsbCBhc24xX29jdGV0c19kZWNvZGUoKSBmdW5jdGlvbiBmb3IgdGhpcyAlcyIsIGN0eC5wb2ludGVyKSk7CS8qIGlzIHRoaXMgVVRGLTggb3IgQVNDSUk/ICovCisJfQorCisJLyogaWYgKHVzZV9rZXJiZXJvcykgCisJICAgKnNlY1R5cGUgPSBLZXJiZXJvcyAKKwkgICBlbHNlICovCisJaWYgKHVzZV9udGxtc3NwKSB7CisJCSpzZWNUeXBlID0gTlRMTVNTUDsKKwl9CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc19kZWJ1Zy5jIGIvZnMvY2lmcy9jaWZzX2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyOGI1NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NpZnMvY2lmc19kZWJ1Zy5jCkBAIC0wLDAgKzEsODA1IEBACisvKgorICogICBmcy9jaWZzX2RlYnVnLmMKKyAqCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDAsMjAwMworICoKKyAqICAgTW9kaWZpZWQgYnkgU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSAiY2lmc3BkdS5oIgorI2luY2x1ZGUgImNpZnNnbG9iLmgiCisjaW5jbHVkZSAiY2lmc3Byb3RvLmgiCisjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgorCit2b2lkCitjaWZzX2R1bXBfbWVtKGNoYXIgKmxhYmVsLCB2b2lkICpkYXRhLCBpbnQgbGVuZ3RoKQoreworCWludCBpLCBqOworCWludCAqaW50cHRyID0gZGF0YTsKKwljaGFyICpjaGFycHRyID0gZGF0YTsKKwljaGFyIGJ1ZlsxMF0sIGxpbmVbODBdOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkdW1wIG9mICVkIGJ5dGVzIG9mIGRhdGEgYXQgMHglcFxuXG4iLCAKKwkJbGFiZWwsIGxlbmd0aCwgZGF0YSk7CisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxNikgeworCQlsaW5lWzBdID0gMDsKKwkJZm9yIChqID0gMDsgKGogPCA0KSAmJiAoaSArIGogKiA0IDwgbGVuZ3RoKTsgaisrKSB7CisJCQlzcHJpbnRmKGJ1ZiwgIiAlMDh4IiwgaW50cHRyW2kgLyA0ICsgal0pOworCQkJc3RyY2F0KGxpbmUsIGJ1Zik7CisJCX0KKwkJYnVmWzBdID0gJyAnOworCQlidWZbMl0gPSAwOworCQlmb3IgKGogPSAwOyAoaiA8IDE2KSAmJiAoaSArIGogPCBsZW5ndGgpOyBqKyspIHsKKwkJCWJ1ZlsxXSA9IGlzcHJpbnQoY2hhcnB0cltpICsgal0pID8gY2hhcnB0cltpICsgal0gOiAnLic7CisJCQlzdHJjYXQobGluZSwgYnVmKTsKKwkJfQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGxpbmUpOworCX0KK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgaW50CitjaWZzX2RlYnVnX2RhdGFfcmVhZChjaGFyICpidWYsIGNoYXIgKipiZWdpbkJ1ZmZlciwgb2ZmX3Qgb2Zmc2V0LAorCQkgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDE7CisJc3RydWN0IG1pZF9xX2VudHJ5ICogbWlkX2VudHJ5OworCXN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb247CisJaW50IGk7CisJaW50IGxlbmd0aCA9IDA7CisJY2hhciAqIG9yaWdpbmFsX2J1ZiA9IGJ1ZjsKKworCSpiZWdpbkJ1ZmZlciA9IGJ1ZiArIG9mZnNldDsKKworCQorCWxlbmd0aCA9CisJICAgIHNwcmludGYoYnVmLAorCQkgICAgIkRpc3BsYXkgSW50ZXJuYWwgQ0lGUyBEYXRhIFN0cnVjdHVyZXMgZm9yIERlYnVnZ2luZ1xuIgorCQkgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJYnVmICs9IGxlbmd0aDsKKworCWxlbmd0aCA9IHNwcmludGYoYnVmLCAiU2VydmVyczpcbiIpOworCWJ1ZiArPSBsZW5ndGg7CisKKwlpID0gMDsKKwlyZWFkX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCWxpc3RfZm9yX2VhY2godG1wLCAmR2xvYmFsU01CU2Vzc2lvbkxpc3QpIHsKKwkJaSsrOworCQlzZXMgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNpZnNTZXNJbmZvLCBjaWZzU2Vzc2lvbkxpc3QpOworCQlsZW5ndGggPQorCQkgICAgc3ByaW50ZihidWYsCisJCQkgICAgIlxuJWQpIE5hbWU6ICVzICBEb21haW46ICVzIE1vdW50czogJWQgU2VydmVyT1M6ICVzICBcblx0U2VydmVyTk9TOiAlc1x0Q2FwYWJpbGl0aWVzOiAweCV4XG5cdFNNQiBzZXNzaW9uIHN0YXR1czogJWRcdCIsCisJCQkJaSwgc2VzLT5zZXJ2ZXJOYW1lLCBzZXMtPnNlcnZlckRvbWFpbiwgYXRvbWljX3JlYWQoJnNlcy0+aW5Vc2UpLAorCQkJCXNlcy0+c2VydmVyT1MsIHNlcy0+c2VydmVyTk9TLCBzZXMtPmNhcGFiaWxpdGllcyxzZXMtPnN0YXR1cyk7CisJCWJ1ZiArPSBsZW5ndGg7CisJCWlmKHNlcy0+c2VydmVyKSB7CisJCQlidWYgKz0gc3ByaW50ZihidWYsICJUQ1Agc3RhdHVzOiAlZFxuXHRMb2NhbCBVc2VycyBUbyBTZXJ2ZXI6ICVkIFNlY01vZGU6IDB4JXggUmVxIEFjdGl2ZTogJWQiLAorCQkJCXNlcy0+c2VydmVyLT50Y3BTdGF0dXMsCisJCQkJYXRvbWljX3JlYWQoJnNlcy0+c2VydmVyLT5zb2NrZXRVc2VDb3VudCksCisJCQkJc2VzLT5zZXJ2ZXItPnNlY01vZGUsCisJCQkJYXRvbWljX3JlYWQoJnNlcy0+c2VydmVyLT5pbkZsaWdodCkpOworCQkJCisJCQlsZW5ndGggPSBzcHJpbnRmKGJ1ZiwgIlxuTUlEczogXG4iKTsKKwkJCWJ1ZiArPSBsZW5ndGg7CisKKwkJCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCQkJbGlzdF9mb3JfZWFjaCh0bXAxLCAmc2VzLT5zZXJ2ZXItPnBlbmRpbmdfbWlkX3EpIHsKKwkJCQltaWRfZW50cnkgPSBsaXN0X2VudHJ5KHRtcDEsIHN0cnVjdAorCQkJCQltaWRfcV9lbnRyeSwKKwkJCQkJcWhlYWQpOworCQkJCWlmKG1pZF9lbnRyeSkgeworCQkJCQlsZW5ndGggPSBzcHJpbnRmKGJ1ZiwiU3RhdGU6ICVkIGNvbTogJWQgcGlkOiAlZCB0c2s6ICVwIG1pZCAlZFxuIixtaWRfZW50cnktPm1pZFN0YXRlLG1pZF9lbnRyeS0+Y29tbWFuZCxtaWRfZW50cnktPnBpZCxtaWRfZW50cnktPnRzayxtaWRfZW50cnktPm1pZCk7CisJCQkJCWJ1ZiArPSBsZW5ndGg7CisJCQkJfQorCQkJfQorCQkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsgCisJCX0KKworCX0KKwlyZWFkX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJc3ByaW50ZihidWYsICJcbiIpOworCWJ1ZisrOworCisJbGVuZ3RoID0gc3ByaW50ZihidWYsICJcblNoYXJlczpcbiIpOworCWJ1ZiArPSBsZW5ndGg7CisKKwlpID0gMDsKKwlyZWFkX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCWxpc3RfZm9yX2VhY2godG1wLCAmR2xvYmFsVHJlZUNvbm5lY3Rpb25MaXN0KSB7CisJCV9fdTMyIGRldl90eXBlOworCQlpKys7CisJCXRjb24gPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNpZnNUY29uSW5mbywgY2lmc0Nvbm5lY3Rpb25MaXN0KTsKKwkJZGV2X3R5cGUgPSBsZTMyX3RvX2NwdSh0Y29uLT5mc0RldkluZm8uRGV2aWNlVHlwZSk7CisJCWxlbmd0aCA9CisJCSAgICBzcHJpbnRmKGJ1ZiwKKwkJCSAgICAiXG4lZCkgJXMgVXNlczogJWQgVHlwZTogJXMgQ2hhcmFjdGVyaXN0aWNzOiAweCV4IEF0dHJpYnV0ZXM6IDB4JXhcblBhdGhDb21wb25lbnRNYXg6ICVkIFN0YXR1czogJWQiLAorCQkJICAgIGksIHRjb24tPnRyZWVOYW1lLAorCQkJICAgIGF0b21pY19yZWFkKCZ0Y29uLT51c2VDb3VudCksCisJCQkgICAgdGNvbi0+bmF0aXZlRmlsZVN5c3RlbSwKKwkJCSAgICBsZTMyX3RvX2NwdSh0Y29uLT5mc0RldkluZm8uRGV2aWNlQ2hhcmFjdGVyaXN0aWNzKSwKKwkJCSAgICBsZTMyX3RvX2NwdSh0Y29uLT5mc0F0dHJJbmZvLkF0dHJpYnV0ZXMpLAorCQkJICAgIGxlMzJfdG9fY3B1KHRjb24tPmZzQXR0ckluZm8uTWF4UGF0aE5hbWVDb21wb25lbnRMZW5ndGgpLAorCQkJICAgIHRjb24tPnRpZFN0YXR1cyk7CisJCWJ1ZiArPSBsZW5ndGg7ICAgICAgICAKKwkJaWYgKGRldl90eXBlID09IEZJTEVfREVWSUNFX0RJU0spCisJCQlsZW5ndGggPSBzcHJpbnRmKGJ1ZiwgIiB0eXBlOiBESVNLICIpOworCQllbHNlIGlmIChkZXZfdHlwZSA9PSBGSUxFX0RFVklDRV9DRF9ST00pCisJCQlsZW5ndGggPSBzcHJpbnRmKGJ1ZiwgIiB0eXBlOiBDRFJPTSAiKTsKKwkJZWxzZQorCQkJbGVuZ3RoID0KKwkJCSAgICBzcHJpbnRmKGJ1ZiwgIiB0eXBlOiAlZCAiLCBkZXZfdHlwZSk7CisJCWJ1ZiArPSBsZW5ndGg7CisJCWlmKHRjb24tPnRpZFN0YXR1cyA9PSBDaWZzTmVlZFJlY29ubmVjdCkgeworCQkJYnVmICs9IHNwcmludGYoYnVmLCAiXHRESVNDT05ORUNURUQgIik7CisJCQlsZW5ndGggKz0gMTQ7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCisJbGVuZ3RoID0gc3ByaW50ZihidWYsICJcbiIpOworCWJ1ZiArPSBsZW5ndGg7CisKKwkvKiBCQiBhZGQgY29kZSB0byBkdW1wIGFkZGl0aW9uYWwgaW5mbyBzdWNoIGFzIFRDUCBzZXNzaW9uIGluZm8gbm93ICovCisJLyogTm93IGNhbGN1bGF0ZSB0b3RhbCBzaXplIG9mIHJldHVybmVkIGRhdGEgKi8KKwlsZW5ndGggPSBidWYgLSBvcmlnaW5hbF9idWY7CisKKwlpZihvZmZzZXQgKyBjb3VudCA+PSBsZW5ndGgpCisJCSplb2YgPSAxOworCWlmKGxlbmd0aCA8IG9mZnNldCkgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJbGVuZ3RoID0gbGVuZ3RoIC0gb2Zmc2V0OworCX0KKwlpZiAobGVuZ3RoID4gY291bnQpCisJCWxlbmd0aCA9IGNvdW50OworCisJcmV0dXJuIGxlbmd0aDsKK30KKworI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTCitzdGF0aWMgaW50CitjaWZzX3N0YXRzX3JlYWQoY2hhciAqYnVmLCBjaGFyICoqYmVnaW5CdWZmZXIsIG9mZl90IG9mZnNldCwKKwkJICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBpdGVtX2xlbmd0aCxpLGxlbmd0aDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbjsKKworCSpiZWdpbkJ1ZmZlciA9IGJ1ZiArIG9mZnNldDsKKworCWxlbmd0aCA9IHNwcmludGYoYnVmLAorCQkJIlJlc291cmNlcyBpbiB1c2VcbkNJRlMgU2Vzc2lvbjogJWRcbiIsCisJCQlzZXNJbmZvQWxsb2NDb3VudC5jb3VudGVyKTsKKwlidWYgKz0gbGVuZ3RoOworCWl0ZW1fbGVuZ3RoID0gCisJCXNwcmludGYoYnVmLCJTaGFyZSAodW5pcXVlIG1vdW50IHRhcmdldHMpOiAlZFxuIiwKKwkJCXRjb25JbmZvQWxsb2NDb3VudC5jb3VudGVyKTsKKwlsZW5ndGggKz0gaXRlbV9sZW5ndGg7CisJYnVmICs9IGl0ZW1fbGVuZ3RoOyAgICAgIAorCWl0ZW1fbGVuZ3RoID0gCisJCXNwcmludGYoYnVmLCJTTUIgUmVxdWVzdC9SZXNwb25zZSBCdWZmZXI6ICVkIFBvb2wgc2l6ZTogJWRcbiIsCisJCQlidWZBbGxvY0NvdW50LmNvdW50ZXIsY2lmc19taW5fcmN2ICsgdGNwU2VzQWxsb2NDb3VudC5jb3VudGVyKTsKKwlsZW5ndGggKz0gaXRlbV9sZW5ndGg7CisJYnVmICs9IGl0ZW1fbGVuZ3RoOworCWl0ZW1fbGVuZ3RoID0gCisJCXNwcmludGYoYnVmLCJTTUIgU21hbGwgUmVxL1Jlc3AgQnVmZmVyOiAlZCBQb29sIHNpemU6ICVkXG4iLAorCQkJc21CdWZBbGxvY0NvdW50LmNvdW50ZXIsY2lmc19taW5fc21hbGwpOworCWxlbmd0aCArPSBpdGVtX2xlbmd0aDsKKwlidWYgKz0gaXRlbV9sZW5ndGg7CisJaXRlbV9sZW5ndGggPSAKKwkJc3ByaW50ZihidWYsIk9wZXJhdGlvbnMgKE1JRHMpOiAlZFxuIiwKKwkJCW1pZENvdW50LmNvdW50ZXIpOworCWxlbmd0aCArPSBpdGVtX2xlbmd0aDsKKwlidWYgKz0gaXRlbV9sZW5ndGg7CisJaXRlbV9sZW5ndGggPSBzcHJpbnRmKGJ1ZiwKKwkJIlxuJWQgc2Vzc2lvbiAlZCBzaGFyZSByZWNvbm5lY3RzXG4iLAorCQl0Y3BTZXNSZWNvbm5lY3RDb3VudC5jb3VudGVyLHRjb25JbmZvUmVjb25uZWN0Q291bnQuY291bnRlcik7CisJbGVuZ3RoICs9IGl0ZW1fbGVuZ3RoOworCWJ1ZiArPSBpdGVtX2xlbmd0aDsKKworCWl0ZW1fbGVuZ3RoID0gc3ByaW50ZihidWYsCisJCSJUb3RhbCB2ZnMgb3BlcmF0aW9uczogJWQgbWF4aW11bSBhdCBvbmUgdGltZTogJWRcbiIsCisJCUdsb2JhbEN1cnJlbnRYaWQsR2xvYmFsTWF4QWN0aXZlWGlkKTsKKwlsZW5ndGggKz0gaXRlbV9sZW5ndGg7CisJYnVmICs9IGl0ZW1fbGVuZ3RoOworCisJaSA9IDA7CisJcmVhZF9sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJkdsb2JhbFRyZWVDb25uZWN0aW9uTGlzdCkgeworCQlpKys7CisJCXRjb24gPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNpZnNUY29uSW5mbywgY2lmc0Nvbm5lY3Rpb25MaXN0KTsKKwkJaXRlbV9sZW5ndGggPSBzcHJpbnRmKGJ1ZiwiXG4lZCkgJXMiLGksIHRjb24tPnRyZWVOYW1lKTsKKwkJYnVmICs9IGl0ZW1fbGVuZ3RoOworCQlsZW5ndGggKz0gaXRlbV9sZW5ndGg7CisJCWlmKHRjb24tPnRpZFN0YXR1cyA9PSBDaWZzTmVlZFJlY29ubmVjdCkgeworCQkJYnVmICs9IHNwcmludGYoYnVmLCAiXHRESVNDT05ORUNURUQgIik7CisJCQlsZW5ndGggKz0gMTQ7CisJCX0KKwkJaXRlbV9sZW5ndGggPSBzcHJpbnRmKGJ1ZiwiXG5TTUJzOiAlZCBPcGxvY2sgQnJlYWtzOiAlZCIsCisJCQlhdG9taWNfcmVhZCgmdGNvbi0+bnVtX3NtYnNfc2VudCksCisJCQlhdG9taWNfcmVhZCgmdGNvbi0+bnVtX29wbG9ja19icmtzKSk7CisJCWJ1ZiArPSBpdGVtX2xlbmd0aDsKKwkJbGVuZ3RoICs9IGl0ZW1fbGVuZ3RoOworCQlpdGVtX2xlbmd0aCA9IHNwcmludGYoYnVmLCJcblJlYWRzOiAlZCBCeXRlcyAlbGxkIiwKKwkJCWF0b21pY19yZWFkKCZ0Y29uLT5udW1fcmVhZHMpLAorCQkJKGxvbmcgbG9uZykodGNvbi0+Ynl0ZXNfcmVhZCkpOworCQlidWYgKz0gaXRlbV9sZW5ndGg7CisJCWxlbmd0aCArPSBpdGVtX2xlbmd0aDsKKwkJaXRlbV9sZW5ndGggPSBzcHJpbnRmKGJ1ZiwiXG5Xcml0ZXM6ICVkIEJ5dGVzOiAlbGxkIiwKKwkJCWF0b21pY19yZWFkKCZ0Y29uLT5udW1fd3JpdGVzKSwKKwkJCShsb25nIGxvbmcpKHRjb24tPmJ5dGVzX3dyaXR0ZW4pKTsKKwkJYnVmICs9IGl0ZW1fbGVuZ3RoOworCQlsZW5ndGggKz0gaXRlbV9sZW5ndGg7CisJCWl0ZW1fbGVuZ3RoID0gc3ByaW50ZihidWYsCisJCQkiXG5PcGVuczogJWQgRGVsZXRlczogJWRcbk1rZGlyczogJWQgUm1kaXJzOiAlZCIsCisJCQlhdG9taWNfcmVhZCgmdGNvbi0+bnVtX29wZW5zKSwKKwkJCWF0b21pY19yZWFkKCZ0Y29uLT5udW1fZGVsZXRlcyksCisJCQlhdG9taWNfcmVhZCgmdGNvbi0+bnVtX21rZGlycyksCisJCQlhdG9taWNfcmVhZCgmdGNvbi0+bnVtX3JtZGlycykpOworCQlidWYgKz0gaXRlbV9sZW5ndGg7CisJCWxlbmd0aCArPSBpdGVtX2xlbmd0aDsKKwkJaXRlbV9sZW5ndGggPSBzcHJpbnRmKGJ1ZiwKKwkJCSJcblJlbmFtZXM6ICVkIFQyIFJlbmFtZXMgJWQiLAorCQkJYXRvbWljX3JlYWQoJnRjb24tPm51bV9yZW5hbWVzKSwKKwkJCWF0b21pY19yZWFkKCZ0Y29uLT5udW1fdDJyZW5hbWVzKSk7CisJCWJ1ZiArPSBpdGVtX2xlbmd0aDsKKwkJbGVuZ3RoICs9IGl0ZW1fbGVuZ3RoOworCX0KKwlyZWFkX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisKKwlidWYgKz0gc3ByaW50ZihidWYsIlxuIik7CisJbGVuZ3RoKys7CisKKwlpZihvZmZzZXQgKyBjb3VudCA+PSBsZW5ndGgpCisJCSplb2YgPSAxOworCWlmKGxlbmd0aCA8IG9mZnNldCkgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJbGVuZ3RoID0gbGVuZ3RoIC0gb2Zmc2V0OworCX0KKwlpZiAobGVuZ3RoID4gY291bnQpCisJCWxlbmd0aCA9IGNvdW50OworCQkKKwlyZXR1cm4gbGVuZ3RoOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfZnNfY2lmczsKK3JlYWRfcHJvY190IGNpZnNfdHhhbmNob3JfcmVhZDsKK3N0YXRpYyByZWFkX3Byb2NfdCBjaWZzRllJX3JlYWQ7CitzdGF0aWMgd3JpdGVfcHJvY190IGNpZnNGWUlfd3JpdGU7CitzdGF0aWMgcmVhZF9wcm9jX3Qgb3Bsb2NrRW5hYmxlZF9yZWFkOworc3RhdGljIHdyaXRlX3Byb2NfdCBvcGxvY2tFbmFibGVkX3dyaXRlOworc3RhdGljIHJlYWRfcHJvY190IGxvb2t1cEZsYWdfcmVhZDsKK3N0YXRpYyB3cml0ZV9wcm9jX3QgbG9va3VwRmxhZ193cml0ZTsKK3N0YXRpYyByZWFkX3Byb2NfdCB0cmFjZVNNQl9yZWFkOworc3RhdGljIHdyaXRlX3Byb2NfdCB0cmFjZVNNQl93cml0ZTsKK3N0YXRpYyByZWFkX3Byb2NfdCBtdWx0aXVzZXJfbW91bnRfcmVhZDsKK3N0YXRpYyB3cml0ZV9wcm9jX3QgbXVsdGl1c2VyX21vdW50X3dyaXRlOworc3RhdGljIHJlYWRfcHJvY190IGV4dGVuZGVkX3NlY3VyaXR5X3JlYWQ7CitzdGF0aWMgd3JpdGVfcHJvY190IGV4dGVuZGVkX3NlY3VyaXR5X3dyaXRlOworc3RhdGljIHJlYWRfcHJvY190IG50bG12Ml9lbmFibGVkX3JlYWQ7CitzdGF0aWMgd3JpdGVfcHJvY190IG50bG12Ml9lbmFibGVkX3dyaXRlOworc3RhdGljIHJlYWRfcHJvY190IHBhY2tldF9zaWduaW5nX2VuYWJsZWRfcmVhZDsKK3N0YXRpYyB3cml0ZV9wcm9jX3QgcGFja2V0X3NpZ25pbmdfZW5hYmxlZF93cml0ZTsKK3N0YXRpYyByZWFkX3Byb2NfdCBxdW90YUVuYWJsZWRfcmVhZDsKK3N0YXRpYyB3cml0ZV9wcm9jX3QgcXVvdGFFbmFibGVkX3dyaXRlOworc3RhdGljIHJlYWRfcHJvY190IGxpbnV4RXh0ZW5zaW9uc0VuYWJsZWRfcmVhZDsKK3N0YXRpYyB3cml0ZV9wcm9jX3QgbGludXhFeHRlbnNpb25zRW5hYmxlZF93cml0ZTsKKwordm9pZAorY2lmc19wcm9jX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZTsKKworCXByb2NfZnNfY2lmcyA9IHByb2NfbWtkaXIoImNpZnMiLCBwcm9jX3Jvb3RfZnMpOworCWlmIChwcm9jX2ZzX2NpZnMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcHJvY19mc19jaWZzLT5vd25lciA9IFRISVNfTU9EVUxFOworCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIkRlYnVnRGF0YSIsIDAsIHByb2NfZnNfY2lmcywKKwkJCQljaWZzX2RlYnVnX2RhdGFfcmVhZCwgTlVMTCk7CisKKyNpZmRlZiBDT05GSUdfQ0lGU19TVEFUUworCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIlN0YXRzIiwgMCwgcHJvY19mc19jaWZzLAorCQkJCWNpZnNfc3RhdHNfcmVhZCwgTlVMTCk7CisjZW5kaWYKKwlwZGUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJjaWZzRllJIiwgMCwgcHJvY19mc19jaWZzLAorCQkJCWNpZnNGWUlfcmVhZCwgTlVMTCk7CisJaWYgKHBkZSkKKwkJcGRlLT53cml0ZV9wcm9jID0gY2lmc0ZZSV93cml0ZTsKKworCXBkZSA9CisJICAgIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInRyYWNlU01CIiwgMCwgcHJvY19mc19jaWZzLAorCQkJCXRyYWNlU01CX3JlYWQsIE5VTEwpOworCWlmIChwZGUpCisJCXBkZS0+d3JpdGVfcHJvYyA9IHRyYWNlU01CX3dyaXRlOworCisJcGRlID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiT3Bsb2NrRW5hYmxlZCIsIDAsIHByb2NfZnNfY2lmcywKKwkJCQlvcGxvY2tFbmFibGVkX3JlYWQsIE5VTEwpOworCWlmIChwZGUpCisJCXBkZS0+d3JpdGVfcHJvYyA9IG9wbG9ja0VuYWJsZWRfd3JpdGU7CisKKwlwZGUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJSZWVuYWJsZU9sZENpZnNSZWFkZGlyQ29kZSIsIDAsIHByb2NfZnNfY2lmcywKKwkJCQlxdW90YUVuYWJsZWRfcmVhZCwgTlVMTCk7CisJaWYgKHBkZSkKKwkJcGRlLT53cml0ZV9wcm9jID0gcXVvdGFFbmFibGVkX3dyaXRlOworCisJcGRlID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiTGludXhFeHRlbnNpb25zRW5hYmxlZCIsIDAsIHByb2NfZnNfY2lmcywKKwkJCQlsaW51eEV4dGVuc2lvbnNFbmFibGVkX3JlYWQsIE5VTEwpOworCWlmIChwZGUpCisJCXBkZS0+d3JpdGVfcHJvYyA9IGxpbnV4RXh0ZW5zaW9uc0VuYWJsZWRfd3JpdGU7CisKKwlwZGUgPQorCSAgICBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJNdWx0aXVzZXJNb3VudCIsIDAsIHByb2NfZnNfY2lmcywKKwkJCQltdWx0aXVzZXJfbW91bnRfcmVhZCwgTlVMTCk7CisJaWYgKHBkZSkKKwkJcGRlLT53cml0ZV9wcm9jID0gbXVsdGl1c2VyX21vdW50X3dyaXRlOworCisJcGRlID0KKwkgICAgY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiRXh0ZW5kZWRTZWN1cml0eSIsIDAsIHByb2NfZnNfY2lmcywKKwkJCQlleHRlbmRlZF9zZWN1cml0eV9yZWFkLCBOVUxMKTsKKwlpZiAocGRlKQorCQlwZGUtPndyaXRlX3Byb2MgPSBleHRlbmRlZF9zZWN1cml0eV93cml0ZTsKKworCXBkZSA9CisJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiTG9va3VwQ2FjaGVFbmFibGVkIiwgMCwgcHJvY19mc19jaWZzLAorCQkJCWxvb2t1cEZsYWdfcmVhZCwgTlVMTCk7CisJaWYgKHBkZSkKKwkJcGRlLT53cml0ZV9wcm9jID0gbG9va3VwRmxhZ193cml0ZTsKKworCXBkZSA9CisJICAgIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIk5UTE1WMkVuYWJsZWQiLCAwLCBwcm9jX2ZzX2NpZnMsCisJCQkJbnRsbXYyX2VuYWJsZWRfcmVhZCwgTlVMTCk7CisJaWYgKHBkZSkKKwkJcGRlLT53cml0ZV9wcm9jID0gbnRsbXYyX2VuYWJsZWRfd3JpdGU7CisKKwlwZGUgPQorCSAgICBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJQYWNrZXRTaWduaW5nRW5hYmxlZCIsIDAsIHByb2NfZnNfY2lmcywKKwkJCQlwYWNrZXRfc2lnbmluZ19lbmFibGVkX3JlYWQsIE5VTEwpOworCWlmIChwZGUpCisJCXBkZS0+d3JpdGVfcHJvYyA9IHBhY2tldF9zaWduaW5nX2VuYWJsZWRfd3JpdGU7Cit9CisKK3ZvaWQKK2NpZnNfcHJvY19jbGVhbih2b2lkKQoreworCWlmIChwcm9jX2ZzX2NpZnMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcmVtb3ZlX3Byb2NfZW50cnkoIkRlYnVnRGF0YSIsIHByb2NfZnNfY2lmcyk7CisJcmVtb3ZlX3Byb2NfZW50cnkoImNpZnNGWUkiLCBwcm9jX2ZzX2NpZnMpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJ0cmFjZVNNQiIsIHByb2NfZnNfY2lmcyk7CisjaWZkZWYgQ09ORklHX0NJRlNfU1RBVFMKKwlyZW1vdmVfcHJvY19lbnRyeSgiU3RhdHMiLCBwcm9jX2ZzX2NpZnMpOworI2VuZGlmCisJcmVtb3ZlX3Byb2NfZW50cnkoIk11bHRpdXNlck1vdW50IiwgcHJvY19mc19jaWZzKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiT3Bsb2NrRW5hYmxlZCIsIHByb2NfZnNfY2lmcyk7CisJcmVtb3ZlX3Byb2NfZW50cnkoIk5UTE1WMkVuYWJsZWQiLHByb2NfZnNfY2lmcyk7CisJcmVtb3ZlX3Byb2NfZW50cnkoIkV4dGVuZGVkU2VjdXJpdHkiLHByb2NfZnNfY2lmcyk7CisJcmVtb3ZlX3Byb2NfZW50cnkoIlBhY2tldFNpZ25pbmdFbmFibGVkIixwcm9jX2ZzX2NpZnMpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJMaW51eEV4dGVuc2lvbnNFbmFibGVkIixwcm9jX2ZzX2NpZnMpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJSZWVuYWJsZU9sZENpZnNSZWFkZGlyQ29kZSIscHJvY19mc19jaWZzKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiTG9va3VwQ2FjaGVFbmFibGVkIixwcm9jX2ZzX2NpZnMpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJjaWZzIiwgcHJvY19yb290X2ZzKTsKK30KKworc3RhdGljIGludAorY2lmc0ZZSV9yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCisJICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuOworCisJbGVuID0gc3ByaW50ZihwYWdlLCAiJWRcbiIsIGNpZnNGWUkpOworCisJbGVuIC09IG9mZjsKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCisJaWYgKGxlbiA+IGNvdW50KQorCQlsZW4gPSBjb3VudDsKKwllbHNlCisJCSplb2YgPSAxOworCisJaWYgKGxlbiA8IDApCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIGludAorY2lmc0ZZSV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCWNoYXIgYzsKKwlpbnQgcmM7CisKKwlyYyA9IGdldF91c2VyKGMsIGJ1ZmZlcik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJaWYgKGMgPT0gJzAnIHx8IGMgPT0gJ24nIHx8IGMgPT0gJ04nKQorCQljaWZzRllJID0gMDsKKwllbHNlIGlmIChjID09ICcxJyB8fCBjID09ICd5JyB8fCBjID09ICdZJykKKwkJY2lmc0ZZSSA9IDE7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQKK29wbG9ja0VuYWJsZWRfcmVhZChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuOworCisJbGVuID0gc3ByaW50ZihwYWdlLCAiJWRcbiIsIG9wbG9ja0VuYWJsZWQpOworCisJbGVuIC09IG9mZjsKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCisJaWYgKGxlbiA+IGNvdW50KQorCQlsZW4gPSBjb3VudDsKKwllbHNlCisJCSplb2YgPSAxOworCisJaWYgKGxlbiA8IDApCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIGludAorb3Bsb2NrRW5hYmxlZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJY2hhciBjOworCWludCByYzsKKworCXJjID0gZ2V0X3VzZXIoYywgYnVmZmVyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwlpZiAoYyA9PSAnMCcgfHwgYyA9PSAnbicgfHwgYyA9PSAnTicpCisJCW9wbG9ja0VuYWJsZWQgPSAwOworCWVsc2UgaWYgKGMgPT0gJzEnIHx8IGMgPT0gJ3knIHx8IGMgPT0gJ1knKQorCQlvcGxvY2tFbmFibGVkID0gMTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludAorcXVvdGFFbmFibGVkX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKyAgICAgICAgaW50IGxlbjsKKworICAgICAgICBsZW4gPSBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgZXhwZXJpbUVuYWJsZWQpOworLyogY291bGQgYWxzbyBjaGVjayBpZiBxdW90YXMgYXJlIGVuYWJsZWQgaW4ga2VybmVsCisJYXMgYSB3aG9sZSBmaXJzdCAqLworICAgICAgICBsZW4gLT0gb2ZmOworICAgICAgICAqc3RhcnQgPSBwYWdlICsgb2ZmOworCisgICAgICAgIGlmIChsZW4gPiBjb3VudCkKKyAgICAgICAgICAgICAgICBsZW4gPSBjb3VudDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICplb2YgPSAxOworCisgICAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICAgICAgICAgIGxlbiA9IDA7CisKKyAgICAgICAgcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBpbnQKK3F1b3RhRW5hYmxlZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKyAgICAgICAgY2hhciBjOworICAgICAgICBpbnQgcmM7CisKKyAgICAgICAgcmMgPSBnZXRfdXNlcihjLCBidWZmZXIpOworICAgICAgICBpZiAocmMpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICBpZiAoYyA9PSAnMCcgfHwgYyA9PSAnbicgfHwgYyA9PSAnTicpCisgICAgICAgICAgICAgICAgZXhwZXJpbUVuYWJsZWQgPSAwOworICAgICAgICBlbHNlIGlmIChjID09ICcxJyB8fCBjID09ICd5JyB8fCBjID09ICdZJykKKyAgICAgICAgICAgICAgICBleHBlcmltRW5hYmxlZCA9IDE7CisKKyAgICAgICAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50CitsaW51eEV4dGVuc2lvbnNFbmFibGVkX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKyAgICAgICAgaW50IGxlbjsKKworICAgICAgICBsZW4gPSBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgbGludXhFeHRFbmFibGVkKTsKKy8qIGNvdWxkIGFsc28gY2hlY2sgaWYgcXVvdGFzIGFyZSBlbmFibGVkIGluIGtlcm5lbAorCWFzIGEgd2hvbGUgZmlyc3QgKi8KKyAgICAgICAgbGVuIC09IG9mZjsKKyAgICAgICAgKnN0YXJ0ID0gcGFnZSArIG9mZjsKKworICAgICAgICBpZiAobGVuID4gY291bnQpCisgICAgICAgICAgICAgICAgbGVuID0gY291bnQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAqZW9mID0gMTsKKworICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICAgICAgICBsZW4gPSAwOworCisgICAgICAgIHJldHVybiBsZW47Cit9CitzdGF0aWMgaW50CitsaW51eEV4dGVuc2lvbnNFbmFibGVkX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworICAgICAgICBjaGFyIGM7CisgICAgICAgIGludCByYzsKKworICAgICAgICByYyA9IGdldF91c2VyKGMsIGJ1ZmZlcik7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIGlmIChjID09ICcwJyB8fCBjID09ICduJyB8fCBjID09ICdOJykKKyAgICAgICAgICAgICAgICBsaW51eEV4dEVuYWJsZWQgPSAwOworICAgICAgICBlbHNlIGlmIChjID09ICcxJyB8fCBjID09ICd5JyB8fCBjID09ICdZJykKKyAgICAgICAgICAgICAgICBsaW51eEV4dEVuYWJsZWQgPSAxOworCisgICAgICAgIHJldHVybiBjb3VudDsKK30KKworCitzdGF0aWMgaW50Citsb29rdXBGbGFnX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCSAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbjsKKworCWxlbiA9IHNwcmludGYocGFnZSwgIiVkXG4iLCBsb29rdXBDYWNoZUVuYWJsZWQpOworCisJbGVuIC09IG9mZjsKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCisJaWYgKGxlbiA+IGNvdW50KQorCQlsZW4gPSBjb3VudDsKKwllbHNlCisJCSplb2YgPSAxOworCisJaWYgKGxlbiA8IDApCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIGludAorbG9va3VwRmxhZ193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJY2hhciBjOworCWludCByYzsKKworCXJjID0gZ2V0X3VzZXIoYywgYnVmZmVyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwlpZiAoYyA9PSAnMCcgfHwgYyA9PSAnbicgfHwgYyA9PSAnTicpCisJCWxvb2t1cENhY2hlRW5hYmxlZCA9IDA7CisJZWxzZSBpZiAoYyA9PSAnMScgfHwgYyA9PSAneScgfHwgYyA9PSAnWScpCisJCWxvb2t1cENhY2hlRW5hYmxlZCA9IDE7CisKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgaW50Cit0cmFjZVNNQl9yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCisJICAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbjsKKworCWxlbiA9IHNwcmludGYocGFnZSwgIiVkXG4iLCB0cmFjZVNNQik7CisKKwlsZW4gLT0gb2ZmOworCSpzdGFydCA9IHBhZ2UgKyBvZmY7CisKKwlpZiAobGVuID4gY291bnQpCisJCWxlbiA9IGNvdW50OworCWVsc2UKKwkJKmVvZiA9IDE7CisKKwlpZiAobGVuIDwgMCkKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW47Cit9CitzdGF0aWMgaW50Cit0cmFjZVNNQl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwljaGFyIGM7CisJaW50IHJjOworCisJcmMgPSBnZXRfdXNlcihjLCBidWZmZXIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCWlmIChjID09ICcwJyB8fCBjID09ICduJyB8fCBjID09ICdOJykKKwkJdHJhY2VTTUIgPSAwOworCWVsc2UgaWYgKGMgPT0gJzEnIHx8IGMgPT0gJ3knIHx8IGMgPT0gJ1knKQorCQl0cmFjZVNNQiA9IDE7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQKK211bHRpdXNlcl9tb3VudF9yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbjsKKworCWxlbiA9IHNwcmludGYocGFnZSwgIiVkXG4iLCBtdWx0aXVzZXJfbW91bnQpOworCisJbGVuIC09IG9mZjsKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCisJaWYgKGxlbiA+IGNvdW50KQorCQlsZW4gPSBjb3VudDsKKwllbHNlCisJCSplb2YgPSAxOworCisJaWYgKGxlbiA8IDApCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIGludAorbXVsdGl1c2VyX21vdW50X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCWNoYXIgYzsKKwlpbnQgcmM7CisKKwlyYyA9IGdldF91c2VyKGMsIGJ1ZmZlcik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJaWYgKGMgPT0gJzAnIHx8IGMgPT0gJ24nIHx8IGMgPT0gJ04nKQorCQltdWx0aXVzZXJfbW91bnQgPSAwOworCWVsc2UgaWYgKGMgPT0gJzEnIHx8IGMgPT0gJ3knIHx8IGMgPT0gJ1knKQorCQltdWx0aXVzZXJfbW91bnQgPSAxOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50CitleHRlbmRlZF9zZWN1cml0eV9yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuOworCisJbGVuID0gc3ByaW50ZihwYWdlLCAiJWRcbiIsIGV4dGVuZGVkX3NlY3VyaXR5KTsKKworCWxlbiAtPSBvZmY7CisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKworCWlmIChsZW4gPiBjb3VudCkKKwkJbGVuID0gY291bnQ7CisJZWxzZQorCQkqZW9mID0gMTsKKworCWlmIChsZW4gPCAwKQorCQlsZW4gPSAwOworCisJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBpbnQKK2V4dGVuZGVkX3NlY3VyaXR5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwljaGFyIGM7CisJaW50IHJjOworCisJcmMgPSBnZXRfdXNlcihjLCBidWZmZXIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCWlmIChjID09ICcwJyB8fCBjID09ICduJyB8fCBjID09ICdOJykKKwkJZXh0ZW5kZWRfc2VjdXJpdHkgPSAwOworCWVsc2UgaWYgKGMgPT0gJzEnIHx8IGMgPT0gJ3knIHx8IGMgPT0gJ1knKQorCQlleHRlbmRlZF9zZWN1cml0eSA9IDE7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQKK250bG12Ml9lbmFibGVkX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCSAgICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW47CisKKwlsZW4gPSBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgbnRsbXYyX3N1cHBvcnQpOworCisJbGVuIC09IG9mZjsKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCisJaWYgKGxlbiA+IGNvdW50KQorCQlsZW4gPSBjb3VudDsKKwllbHNlCisJCSplb2YgPSAxOworCisJaWYgKGxlbiA8IDApCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIGludAorbnRsbXYyX2VuYWJsZWRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCWNoYXIgYzsKKwlpbnQgcmM7CisKKwlyYyA9IGdldF91c2VyKGMsIGJ1ZmZlcik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJaWYgKGMgPT0gJzAnIHx8IGMgPT0gJ24nIHx8IGMgPT0gJ04nKQorCQludGxtdjJfc3VwcG9ydCA9IDA7CisJZWxzZSBpZiAoYyA9PSAnMScgfHwgYyA9PSAneScgfHwgYyA9PSAnWScpCisJCW50bG12Ml9zdXBwb3J0ID0gMTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludAorcGFja2V0X3NpZ25pbmdfZW5hYmxlZF9yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuOworCisJbGVuID0gc3ByaW50ZihwYWdlLCAiJWRcbiIsIHNpZ25fQ0lGU19QRFVzKTsKKworCWxlbiAtPSBvZmY7CisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKworCWlmIChsZW4gPiBjb3VudCkKKwkJbGVuID0gY291bnQ7CisJZWxzZQorCQkqZW9mID0gMTsKKworCWlmIChsZW4gPCAwKQorCQlsZW4gPSAwOworCisJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBpbnQKK3BhY2tldF9zaWduaW5nX2VuYWJsZWRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCWNoYXIgYzsKKwlpbnQgcmM7CisKKwlyYyA9IGdldF91c2VyKGMsIGJ1ZmZlcik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJaWYgKGMgPT0gJzAnIHx8IGMgPT0gJ24nIHx8IGMgPT0gJ04nKQorCQlzaWduX0NJRlNfUERVcyA9IDA7CisJZWxzZSBpZiAoYyA9PSAnMScgfHwgYyA9PSAneScgfHwgYyA9PSAnWScpCisJCXNpZ25fQ0lGU19QRFVzID0gMTsKKwllbHNlIGlmIChjID09ICcyJykKKwkJc2lnbl9DSUZTX1BEVXMgPSAyOworCisJcmV0dXJuIGNvdW50OworfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzX2RlYnVnLmggYi9mcy9jaWZzL2NpZnNfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjI0ZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9jaWZzX2RlYnVnLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDAsMjAwMgorICogICBNb2RpZmllZCBieSBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisqLworI2RlZmluZSBDSUZTX0RFQlVHCQkvKiBCQiB0ZW1wb3JhcnkgKi8KKworI2lmbmRlZiBfSF9DSUZTX0RFQlVHCisjZGVmaW5lIF9IX0NJRlNfREVCVUcKKwordm9pZCBjaWZzX2R1bXBfbWVtKGNoYXIgKmxhYmVsLCB2b2lkICpkYXRhLCBpbnQgbGVuZ3RoKTsKK2V4dGVybiBpbnQgdHJhY2VTTUI7CQkvKiBmbGFnIHdoaWNoIGVuYWJsZXMgdGhlIGZ1bmN0aW9uIGJlbG93ICovCit2b2lkIGR1bXBfc21iKHN0cnVjdCBzbWJfaGRyICosIGludCk7CisKKy8qCisgKglkZWJ1ZyBPTgorICoJLS0tLS0tLS0KKyAqLworI2lmZGVmIENJRlNfREVCVUcKKworCisvKiBpbmZvcm1hdGlvbiBtZXNzYWdlOiBlLmcuLCBjb25maWd1cmF0aW9uLCBtYWpvciBldmVudCAqLworZXh0ZXJuIGludCBjaWZzRllJOworI2RlZmluZSBjaWZzZnlpKGZvcm1hdCxhcmcuLi4pIGlmIChjaWZzRllJKSBwcmludGsoS0VSTl9ERUJVRyAiICIgX19GSUxFX18gIjogIiBmb3JtYXQgIlxuIiAiIiAsICMjIGFyZykKKworI2RlZmluZSBjRllJKGJ1dHRvbixwcnNwZWMpIGlmIChidXR0b24pIGNpZnNmeWkgcHJzcGVjCisKKyNkZWZpbmUgY2lmc3dhcm4oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKworLyogZGVidWcgZXZlbnQgbWVzc2FnZTogKi8KK2V4dGVybiBpbnQgY2lmc0VSUk9SOworCisjZGVmaW5lIGNFVkVOVChmb3JtYXQsYXJnLi4uKSBpZiAoY2lmc0VSUk9SKSBwcmludGsoS0VSTl9FVkVOVCBfX0ZJTEVfXyAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorCisvKiBlcnJvciBldmVudCBtZXNzYWdlOiBlLmcuLCBpL28gZXJyb3IgKi8KKyNkZWZpbmUgY2lmc2Vycm9yKGZvcm1hdCxhcmcuLi4pIGlmIChjaWZzRVJST1IpIHByaW50ayhLRVJOX0VSUiAiIENJRlMgVkZTOiAiIGZvcm1hdCAiXG4iICIiICwgIyMgYXJnKQorCisjZGVmaW5lIGNFUlJPUihidXR0b24sIHByc3BlYykgaWYgKGJ1dHRvbikgY2lmc2Vycm9yIHByc3BlYworCisvKgorICoJZGVidWcgT0ZGCisgKgktLS0tLS0tLS0KKyAqLworI2Vsc2UJCS8qIF9DSUZTX0RFQlVHICovCisjZGVmaW5lIGNFUlJPUihidXR0b24scHJzcGVjKQorI2RlZmluZSBjRVZFTlQoZm9ybWF0LGFyZy4uLikKKyNkZWZpbmUgY0ZZSShidXR0b24sIHByc3BlYykKKyNkZWZpbmUgY2lmc2Vycm9yKGZvcm1hdCxhcmcuLi4pCisjZW5kaWYJCS8qIF9DSUZTX0RFQlVHICovCisKKyNlbmRpZgkJCQkvKiBfSF9DSUZTX0RFQlVHICovCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNfZnNfc2IuaCBiL2ZzL2NpZnMvY2lmc19mc19zYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZGE5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL2NpZnNfZnNfc2IuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogICBmcy9jaWZzL2NpZnNfZnNfc2IuaAorICoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMiwyMDA0CisgKiAgIEF1dGhvcihzKTogU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaWZuZGVmIF9DSUZTX0ZTX1NCX0gKKyNkZWZpbmUgX0NJRlNfRlNfU0JfSAorCisjZGVmaW5lIENJRlNfTU9VTlRfTk9fUEVSTSAgICAgIDEgLyogZG8gbm90IGRvIGNsaWVudCB2ZnNfcGVybSBjaGVjayAqLworI2RlZmluZSBDSUZTX01PVU5UX1NFVF9VSUQgICAgICAyIC8qIHNldCBjdXJyZW50LT5ldWlkIGluIGNyZWF0ZSBldGMuICovCisjZGVmaW5lIENJRlNfTU9VTlRfU0VSVkVSX0lOVU0gIDQgLyogaW5vZGUgbnVtYmVycyBmcm9tIHVuaXF1ZWlkIGZyb20gc2VydmVyICovCisjZGVmaW5lIENJRlNfTU9VTlRfRElSRUNUX0lPICAgIDggLyogZG8gbm90IHdyaXRlIG5vciByZWFkIHRocm91Z2ggcGFnZSBjYWNoZSAqLworI2RlZmluZSBDSUZTX01PVU5UX05PX1hBVFRSICAweDEwIC8qIGlmIHNldCAtIGRpc2FibGUgeGF0dHIgc3VwcG9ydCAqLworCitzdHJ1Y3QgY2lmc19zYl9pbmZvIHsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uOwkvKiBwcmltYXJ5IG1vdW50ICovCisJc3RydWN0IGxpc3RfaGVhZCBuZXN0ZWRfdGNvbl9xOworCXN0cnVjdCBubHNfdGFibGUgKmxvY2FsX25sczsKKwl1bnNpZ25lZCBpbnQgcnNpemU7CisJdW5zaWduZWQgaW50IHdzaXplOworCXVpZF90CW1udF91aWQ7CisJZ2lkX3QJbW50X2dpZDsKKwltb2RlX3QJbW50X2ZpbGVfbW9kZTsKKwltb2RlX3QJbW50X2Rpcl9tb2RlOworCWludCAgICAgbW50X2NpZnNfZmxhZ3M7Cit9OworI2VuZGlmCQkJCS8qIF9DSUZTX0ZTX1NCX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc191bmljb2RlLmMgYi9mcy9jaWZzL2NpZnNfdW5pY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExN2FkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL2NpZnNfdW5pY29kZS5jCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiAgIGZzL2NpZnMvY2lmc191bmljb2RlLmMKKyAqCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDAsMjAwMgorICogICBNb2RpZmllZCBieSBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSAiY2lmc191bmljb2RlLmgiCisjaW5jbHVkZSAiY2lmc191bml1cHIuaCIKKyNpbmNsdWRlICJjaWZzcGR1LmgiCisjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgorCisvKgorICogTkFNRToJY2lmc19zdHJmcm9tVUNTKCkKKyAqCisgKiBGVU5DVElPTjoJQ29udmVydCBsaXR0bGUtZW5kaWFuIHVuaWNvZGUgc3RyaW5nIHRvIGNoYXJhY3RlciBzdHJpbmcKKyAqCisgKi8KK2ludAorY2lmc19zdHJmcm9tVUNTX2xlKGNoYXIgKnRvLCBjb25zdCB3Y2hhcl90ICogZnJvbSwJLyogTElUVExFIEVORElBTiAqLworCQkgICBpbnQgbGVuLCBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpjb2RlcGFnZSkKK3sKKwlpbnQgaTsKKwlpbnQgb3V0bGVuID0gMDsKKworCWZvciAoaSA9IDA7IChpIDwgbGVuKSAmJiBmcm9tW2ldOyBpKyspIHsKKwkJaW50IGNoYXJsZW47CisJCS8qIDIuNC4wIGtlcm5lbCBvciBncmVhdGVyICovCisJCWNoYXJsZW4gPQorCQkgICAgY29kZXBhZ2UtPnVuaTJjaGFyKGxlMTZfdG9fY3B1KGZyb21baV0pLCAmdG9bb3V0bGVuXSwKKwkJCQkgICAgICAgTkxTX01BWF9DSEFSU0VUX1NJWkUpOworCQlpZiAoY2hhcmxlbiA+IDApIHsKKwkJCW91dGxlbiArPSBjaGFybGVuOworCQl9IGVsc2UgeworCQkJdG9bb3V0bGVuKytdID0gJz8nOworCQl9CisJfQorCXRvW291dGxlbl0gPSAwOworCXJldHVybiBvdXRsZW47Cit9CisKKy8qCisgKiBOQU1FOgljaWZzX3N0cnRvVUNTKCkKKyAqCisgKiBGVU5DVElPTjoJQ29udmVydCBjaGFyYWN0ZXIgc3RyaW5nIHRvIHVuaWNvZGUgc3RyaW5nCisgKgorICovCitpbnQKK2NpZnNfc3RydG9VQ1Mod2NoYXJfdCAqIHRvLCBjb25zdCBjaGFyICpmcm9tLCBpbnQgbGVuLAorCSAgICAgIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKmNvZGVwYWdlKQoreworCWludCBjaGFybGVuOworCWludCBpOworCisJZm9yIChpID0gMDsgbGVuICYmICpmcm9tOyBpKyssIGZyb20gKz0gY2hhcmxlbiwgbGVuIC09IGNoYXJsZW4pIHsKKworCQkvKiB3b3JrcyBmb3IgMi40LjAga2VybmVsIG9yIGxhdGVyICovCisJCWNoYXJsZW4gPSBjb2RlcGFnZS0+Y2hhcjJ1bmkoZnJvbSwgbGVuLCAmdG9baV0pOworCQlpZiAoY2hhcmxlbiA8IDEpIHsKKwkJCWNFUlJPUigxLAorCQkJICAgICAgICgiY2lmc19zdHJ0b1VDUzogY2hhcjJ1bmkgcmV0dXJuZWQgJWQiLAorCQkJCWNoYXJsZW4pKTsKKwkJCXRvW2ldID0gY3B1X3RvX2xlMTYoMHgwMDNmKTsJLyogYSBxdWVzdGlvbiBtYXJrICovCisJCQljaGFybGVuID0gMTsKKwkJfQorCQl0b1tpXSA9IGNwdV90b19sZTE2KHRvW2ldKTsKKworCX0KKworCXRvW2ldID0gMDsKKwlyZXR1cm4gaTsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzX3VuaWNvZGUuaCBiL2ZzL2NpZnMvY2lmc191bmljb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE4ZGRlOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NpZnMvY2lmc191bmljb2RlLmgKQEAgLTAsMCArMSwzNTMgQEAKKy8qCisgKiBjaWZzX3VuaWNvZGU6ICBVbmljb2RlIGtlcm5lbCBjYXNlIHN1cHBvcnQKKyAqCisgKiBGdW5jdGlvbjoKKyAqICAgICBDb252ZXJ0IGEgdW5pY29kZSBjaGFyYWN0ZXIgdG8gdXBwZXIgb3IgbG93ZXIgY2FzZSB1c2luZworICogICAgIGNvbXByZXNzZWQgdGFibGVzLgorICoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMCwyMDAyCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICoKKyAqIE5vdGVzOgorICogICAgIFRoZXNlIEFQSXMgYXJlIGJhc2VkIG9uIHRoZSBDIGxpYnJhcnkgZnVuY3Rpb25zLiAgVGhlIHNlbWFudGljcworICogICAgIHNob3VsZCBtYXRjaCB0aGUgQyBmdW5jdGlvbnMgYnV0IHdpdGggZXhwYW5kZWQgc2l6ZSBvcGVyYW5kcy4KKyAqCisgKiAgICAgVGhlIHVwcGVyL2xvd2VyIGZ1bmN0aW9ucyBhcmUgYmFzZWQgb24gYSB0YWJsZSBjcmVhdGVkIGJ5IG1rdXByLgorICogICAgIFRoaXMgaXMgYSBjb21wcmVzc2VkIHRhYmxlIG9mIHVwcGVyIGFuZCBsb3dlciBjYXNlIGNvbnZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKworI2RlZmluZSAgVU5JVVBSX05PTE9XRVIJCS8qIEV4YW1wbGUgdG8gbm90IGV4cGFuZCBsb3dlciBjYXNlIHRhYmxlcyAqLworCisvKiBKdXN0IGRlZmluZSB3aGF0IHdlIHdhbnQgZnJvbSB1bml1cHIuaC4gIFdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIHRoZSB0YWJsZXMKKyAqIGluIGVhY2ggc291cmNlIGZpbGUuCisgKi8KKyNpZm5kZWYJVU5JQ0FTRVJBTkdFX0RFRklORUQKK3N0cnVjdCBVbmlDYXNlUmFuZ2UgeworCXdjaGFyX3Qgc3RhcnQ7CisJd2NoYXJfdCBlbmQ7CisJc2lnbmVkIGNoYXIgKnRhYmxlOworfTsKKyNlbmRpZgkJCQkvKiBVTklDQVNFUkFOR0VfREVGSU5FRCAqLworCisjaWZuZGVmIFVOSVVQUl9OT1VQUEVSCitleHRlcm4gc2lnbmVkIGNoYXIgQ2lmc1VuaVVwcGVyVGFibGVbNTEyXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgVW5pQ2FzZVJhbmdlIENpZnNVbmlVcHBlclJhbmdlW107CisjZW5kaWYJCQkJLyogVU5JVVBSX05PVVBQRVIgKi8KKworI2lmbmRlZiBVTklVUFJfTk9MT1dFUgorZXh0ZXJuIHNpZ25lZCBjaGFyIFVuaUxvd2VyVGFibGVbNTEyXTsKK2V4dGVybiBzdHJ1Y3QgVW5pQ2FzZVJhbmdlIFVuaUxvd2VyUmFuZ2VbXTsKKyNlbmRpZgkJCQkvKiBVTklVUFJfTk9MT1dFUiAqLworCisjaWZkZWYgX19LRVJORUxfXworaW50IGNpZnNfc3RyZnJvbVVDU19sZShjaGFyICosIGNvbnN0IHdjaGFyX3QgKiwgaW50LCBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICopOworaW50IGNpZnNfc3RydG9VQ1Mod2NoYXJfdCAqLCBjb25zdCBjaGFyICosIGludCwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqKTsKKyNlbmRpZgorCisvKgorICogVW5pU3RyY2F0OiAgQ29uY2F0ZW5hdGUgdGhlIHNlY29uZCBzdHJpbmcgdG8gdGhlIGZpcnN0CisgKgorICogUmV0dXJuczoKKyAqICAgICBBZGRyZXNzIG9mIHRoZSBmaXJzdCBzdHJpbmcKKyAqLworc3RhdGljIGlubGluZSB3Y2hhcl90ICoKK1VuaVN0cmNhdCh3Y2hhcl90ICogdWNzMSwgY29uc3Qgd2NoYXJfdCAqIHVjczIpCit7CisJd2NoYXJfdCAqYW5jaG9yID0gdWNzMTsJLyogc2F2ZSBhIHBvaW50ZXIgdG8gc3RhcnQgb2YgdWNzMSAqLworCisJd2hpbGUgKCp1Y3MxKyspIDsJLyogVG8gZW5kIG9mIGZpcnN0IHN0cmluZyAqLworCXVjczEtLTsJCQkvKiBSZXR1cm4gdG8gdGhlIG51bGwgKi8KKwl3aGlsZSAoKCp1Y3MxKysgPSAqdWNzMisrKSkgOwkvKiBjb3B5IHN0cmluZyAyIG92ZXIgKi8KKwlyZXR1cm4gYW5jaG9yOworfQorCisvKgorICogVW5pU3RyY2hyOiAgRmluZCBhIGNoYXJhY3RlciBpbiBhIHN0cmluZworICoKKyAqIFJldHVybnM6CisgKiAgICAgQWRkcmVzcyBvZiBmaXJzdCBvY2N1cnJlbmNlIG9mIGNoYXJhY3RlciBpbiBzdHJpbmcKKyAqICAgICBvciBOVUxMIGlmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IGluIHRoZSBzdHJpbmcKKyAqLworc3RhdGljIGlubGluZSB3Y2hhcl90ICoKK1VuaVN0cmNocihjb25zdCB3Y2hhcl90ICogdWNzLCB3Y2hhcl90IHVjKQoreworCXdoaWxlICgoKnVjcyAhPSB1YykgJiYgKnVjcykKKwkJdWNzKys7CisKKwlpZiAoKnVjcyA9PSB1YykKKwkJcmV0dXJuICh3Y2hhcl90ICopIHVjczsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFVuaVN0cmNtcDogIENvbXBhcmUgdHdvIHN0cmluZ3MKKyAqCisgKiBSZXR1cm5zOgorICogICAgIDwgMDogIEZpcnN0IHN0cmluZyBpcyBsZXNzIHRoYW4gc2Vjb25kCisgKiAgICAgPSAwOiAgU3RyaW5ncyBhcmUgZXF1YWwKKyAqICAgICA+IDA6ICBGaXJzdCBzdHJpbmcgaXMgZ3JlYXRlciB0aGFuIHNlY29uZAorICovCitzdGF0aWMgaW5saW5lIGludAorVW5pU3RyY21wKGNvbnN0IHdjaGFyX3QgKiB1Y3MxLCBjb25zdCB3Y2hhcl90ICogdWNzMikKK3sKKwl3aGlsZSAoKCp1Y3MxID09ICp1Y3MyKSAmJiAqdWNzMSkgeworCQl1Y3MxKys7CisJCXVjczIrKzsKKwl9CisJcmV0dXJuIChpbnQpICp1Y3MxIC0gKGludCkgKnVjczI7Cit9CisKKy8qCisgKiBVbmlTdHJjcHk6ICBDb3B5IGEgc3RyaW5nCisgKi8KK3N0YXRpYyBpbmxpbmUgd2NoYXJfdCAqCitVbmlTdHJjcHkod2NoYXJfdCAqIHVjczEsIGNvbnN0IHdjaGFyX3QgKiB1Y3MyKQoreworCXdjaGFyX3QgKmFuY2hvciA9IHVjczE7CS8qIHNhdmUgdGhlIHN0YXJ0IG9mIHJlc3VsdCBzdHJpbmcgKi8KKworCXdoaWxlICgoKnVjczErKyA9ICp1Y3MyKyspKSA7CisJcmV0dXJuIGFuY2hvcjsKK30KKworLyoKKyAqIFVuaVN0cmxlbjogIFJldHVybiB0aGUgbGVuZ3RoIG9mIGEgc3RyaW5nIChpbiAxNiBiaXQgVW5pY29kZSBjaGFycyBub3QgYnl0ZXMpCisgKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90CitVbmlTdHJsZW4oY29uc3Qgd2NoYXJfdCAqIHVjczEpCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKCp1Y3MxKyspCisJCWkrKzsKKwlyZXR1cm4gaTsKK30KKworLyoKKyAqIFVuaVN0cm5sZW46ICBSZXR1cm4gdGhlIGxlbmd0aCAoaW4gMTYgYml0IFVuaWNvZGUgY2hhcnMgbm90IGJ5dGVzKSBvZiBhIHN0cmluZyAobGVuZ3RoIGxpbWl0ZWQpCisgKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90CitVbmlTdHJubGVuKGNvbnN0IHdjaGFyX3QgKiB1Y3MxLCBpbnQgbWF4bGVuKQoreworCWludCBpID0gMDsKKworCXdoaWxlICgqdWNzMSsrKSB7CisJCWkrKzsKKwkJaWYgKGkgPj0gbWF4bGVuKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBpOworfQorCisvKgorICogVW5pU3RybmNhdDogIENvbmNhdGVuYXRlIGxlbmd0aCBsaW1pdGVkIHN0cmluZworICovCitzdGF0aWMgaW5saW5lIHdjaGFyX3QgKgorVW5pU3RybmNhdCh3Y2hhcl90ICogdWNzMSwgY29uc3Qgd2NoYXJfdCAqIHVjczIsIHNpemVfdCBuKQoreworCXdjaGFyX3QgKmFuY2hvciA9IHVjczE7CS8qIHNhdmUgcG9pbnRlciB0byBzdHJpbmcgMSAqLworCisJd2hpbGUgKCp1Y3MxKyspIDsKKwl1Y3MxLS07CQkJLyogcG9pbnQgdG8gbnVsbCB0ZXJtaW5hdG9yIG9mIHMxICovCisJd2hpbGUgKG4tLSAmJiAoKnVjczEgPSAqdWNzMikpIHsJLyogY29weSBzMiBhZnRlciBzMSAqLworCQl1Y3MxKys7CisJCXVjczIrKzsKKwl9CisJKnVjczEgPSAwOwkJLyogTnVsbCB0ZXJtaW5hdGUgdGhlIHJlc3VsdCAqLworCXJldHVybiAoYW5jaG9yKTsKK30KKworLyoKKyAqIFVuaVN0cm5jbXA6ICBDb21wYXJlIGxlbmd0aCBsaW1pdGVkIHN0cmluZworICovCitzdGF0aWMgaW5saW5lIGludAorVW5pU3RybmNtcChjb25zdCB3Y2hhcl90ICogdWNzMSwgY29uc3Qgd2NoYXJfdCAqIHVjczIsIHNpemVfdCBuKQoreworCWlmICghbikKKwkJcmV0dXJuIDA7CS8qIE51bGwgc3RyaW5ncyBhcmUgZXF1YWwgKi8KKwl3aGlsZSAoKCp1Y3MxID09ICp1Y3MyKSAmJiAqdWNzMSAmJiAtLW4pIHsKKwkJdWNzMSsrOworCQl1Y3MyKys7CisJfQorCXJldHVybiAoaW50KSAqdWNzMSAtIChpbnQpICp1Y3MyOworfQorCisvKgorICogVW5pU3RybmNtcF9sZTogIENvbXBhcmUgbGVuZ3RoIGxpbWl0ZWQgc3RyaW5nIC0gbmF0aXZlIHRvIGxpdHRsZS1lbmRpYW4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK1VuaVN0cm5jbXBfbGUoY29uc3Qgd2NoYXJfdCAqIHVjczEsIGNvbnN0IHdjaGFyX3QgKiB1Y3MyLCBzaXplX3QgbikKK3sKKwlpZiAoIW4pCisJCXJldHVybiAwOwkvKiBOdWxsIHN0cmluZ3MgYXJlIGVxdWFsICovCisJd2hpbGUgKCgqdWNzMSA9PSBfX2xlMTZfdG9fY3B1KCp1Y3MyKSkgJiYgKnVjczEgJiYgLS1uKSB7CisJCXVjczErKzsKKwkJdWNzMisrOworCX0KKwlyZXR1cm4gKGludCkgKnVjczEgLSAoaW50KSBfX2xlMTZfdG9fY3B1KCp1Y3MyKTsKK30KKworLyoKKyAqIFVuaVN0cm5jcHk6ICBDb3B5IGxlbmd0aCBsaW1pdGVkIHN0cmluZyB3aXRoIHBhZAorICovCitzdGF0aWMgaW5saW5lIHdjaGFyX3QgKgorVW5pU3RybmNweSh3Y2hhcl90ICogdWNzMSwgY29uc3Qgd2NoYXJfdCAqIHVjczIsIHNpemVfdCBuKQoreworCXdjaGFyX3QgKmFuY2hvciA9IHVjczE7CisKKwl3aGlsZSAobi0tICYmICp1Y3MyKQkvKiBDb3B5IHRoZSBzdHJpbmdzICovCisJCSp1Y3MxKysgPSAqdWNzMisrOworCisJbisrOworCXdoaWxlIChuLS0pCQkvKiBQYWQgd2l0aCBudWxscyAqLworCQkqdWNzMSsrID0gMDsKKwlyZXR1cm4gYW5jaG9yOworfQorCisvKgorICogVW5pU3RybmNweV9sZTogIENvcHkgbGVuZ3RoIGxpbWl0ZWQgc3RyaW5nIHdpdGggcGFkIHRvIGxpdHRsZS1lbmRpYW4KKyAqLworc3RhdGljIGlubGluZSB3Y2hhcl90ICoKK1VuaVN0cm5jcHlfbGUod2NoYXJfdCAqIHVjczEsIGNvbnN0IHdjaGFyX3QgKiB1Y3MyLCBzaXplX3QgbikKK3sKKwl3Y2hhcl90ICphbmNob3IgPSB1Y3MxOworCisJd2hpbGUgKG4tLSAmJiAqdWNzMikJLyogQ29weSB0aGUgc3RyaW5ncyAqLworCQkqdWNzMSsrID0gX19sZTE2X3RvX2NwdSgqdWNzMisrKTsKKworCW4rKzsKKwl3aGlsZSAobi0tKQkJLyogUGFkIHdpdGggbnVsbHMgKi8KKwkJKnVjczErKyA9IDA7CisJcmV0dXJuIGFuY2hvcjsKK30KKworLyoKKyAqIFVuaVN0cnN0cjogIEZpbmQgYSBzdHJpbmcgaW4gYSBzdHJpbmcKKyAqCisgKiBSZXR1cm5zOgorICogICAgIEFkZHJlc3Mgb2YgZmlyc3QgbWF0Y2ggZm91bmQKKyAqICAgICBOVUxMIGlmIG5vIG1hdGNoaW5nIHN0cmluZyBpcyBmb3VuZAorICovCitzdGF0aWMgaW5saW5lIHdjaGFyX3QgKgorVW5pU3Ryc3RyKGNvbnN0IHdjaGFyX3QgKiB1Y3MxLCBjb25zdCB3Y2hhcl90ICogdWNzMikKK3sKKwljb25zdCB3Y2hhcl90ICphbmNob3IxID0gdWNzMTsKKwljb25zdCB3Y2hhcl90ICphbmNob3IyID0gdWNzMjsKKworCXdoaWxlICgqdWNzMSkgeworCQlpZiAoKnVjczEgPT0gKnVjczIpIHsJLyogUGFydGlhbCBtYXRjaCBmb3VuZCAqLworCQkJdWNzMSsrOworCQkJdWNzMisrOworCQl9IGVsc2UgeworCQkJaWYgKCEqdWNzMikJLyogTWF0Y2ggZm91bmQgKi8KKwkJCQlyZXR1cm4gKHdjaGFyX3QgKikgYW5jaG9yMTsKKwkJCXVjczEgPSArK2FuY2hvcjE7CS8qIE5vIG1hdGNoICovCisJCQl1Y3MyID0gYW5jaG9yMjsKKwkJfQorCX0KKworCWlmICghKnVjczIpCQkvKiBCb3RoIGVuZCB0b2dldGhlciAqLworCQlyZXR1cm4gKHdjaGFyX3QgKikgYW5jaG9yMTsJLyogTWF0Y2ggZm91bmQgKi8KKwlyZXR1cm4gTlVMTDsJCS8qIE5vIG1hdGNoICovCit9CisKKyNpZm5kZWYgVU5JVVBSX05PVVBQRVIKKy8qCisgKiBVbmlUb3VwcGVyOiAgQ29udmVydCBhIHVuaWNvZGUgY2hhcmFjdGVyIHRvIHVwcGVyIGNhc2UKKyAqLworc3RhdGljIGlubGluZSB3Y2hhcl90CitVbmlUb3VwcGVyKHJlZ2lzdGVyIHdjaGFyX3QgdWMpCit7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IFVuaUNhc2VSYW5nZSAqcnA7CisKKwlpZiAodWMgPCBzaXplb2YgKENpZnNVbmlVcHBlclRhYmxlKSkgewkvKiBMYXRpbiBjaGFyYWN0ZXJzICovCisJCXJldHVybiB1YyArIENpZnNVbmlVcHBlclRhYmxlW3VjXTsJLyogVXNlIGJhc2UgdGFibGVzICovCisJfSBlbHNlIHsKKwkJcnAgPSBDaWZzVW5pVXBwZXJSYW5nZTsJLyogVXNlIHJhbmdlIHRhYmxlcyAqLworCQl3aGlsZSAocnAtPnN0YXJ0KSB7CisJCQlpZiAodWMgPCBycC0+c3RhcnQpCS8qIEJlZm9yZSBzdGFydCBvZiByYW5nZSAqLworCQkJCXJldHVybiB1YzsJLyogVXBwZXJjYXNlID0gaW5wdXQgKi8KKwkJCWlmICh1YyA8PSBycC0+ZW5kKQkvKiBJbiByYW5nZSAqLworCQkJCXJldHVybiB1YyArIHJwLT50YWJsZVt1YyAtIHJwLT5zdGFydF07CisJCQlycCsrOwkvKiBUcnkgbmV4dCByYW5nZSAqLworCQl9CisJfQorCXJldHVybiB1YzsJCS8qIFBhc3QgbGFzdCByYW5nZSAqLworfQorCisvKgorICogVW5pU3RydXByOiAgVXBwZXIgY2FzZSBhIHVuaWNvZGUgc3RyaW5nCisgKi8KK3N0YXRpYyBpbmxpbmUgd2NoYXJfdCAqCitVbmlTdHJ1cHIocmVnaXN0ZXIgd2NoYXJfdCAqIHVwaW4pCit7CisJcmVnaXN0ZXIgd2NoYXJfdCAqdXA7CisKKwl1cCA9IHVwaW47CisJd2hpbGUgKCp1cCkgewkJLyogRm9yIGFsbCBjaGFyYWN0ZXJzICovCisJCSp1cCA9IFVuaVRvdXBwZXIoKnVwKTsKKwkJdXArKzsKKwl9CisJcmV0dXJuIHVwaW47CQkvKiBSZXR1cm4gaW5wdXQgcG9pbnRlciAqLworfQorI2VuZGlmCQkJCS8qIFVOSVVQUl9OT1VQUEVSICovCisKKyNpZm5kZWYgVU5JVVBSX05PTE9XRVIKKy8qCisgKiBVbmlUb2xvd2VyOiAgQ29udmVydCBhIHVuaWNvZGUgY2hhcmFjdGVyIHRvIGxvd2VyIGNhc2UKKyAqLworc3RhdGljIGlubGluZSB3Y2hhcl90CitVbmlUb2xvd2VyKHdjaGFyX3QgdWMpCit7CisJcmVnaXN0ZXIgc3RydWN0IFVuaUNhc2VSYW5nZSAqcnA7CisKKwlpZiAodWMgPCBzaXplb2YgKFVuaUxvd2VyVGFibGUpKSB7CS8qIExhdGluIGNoYXJhY3RlcnMgKi8KKwkJcmV0dXJuIHVjICsgVW5pTG93ZXJUYWJsZVt1Y107CS8qIFVzZSBiYXNlIHRhYmxlcyAqLworCX0gZWxzZSB7CisJCXJwID0gVW5pTG93ZXJSYW5nZTsJLyogVXNlIHJhbmdlIHRhYmxlcyAqLworCQl3aGlsZSAocnAtPnN0YXJ0KSB7CisJCQlpZiAodWMgPCBycC0+c3RhcnQpCS8qIEJlZm9yZSBzdGFydCBvZiByYW5nZSAqLworCQkJCXJldHVybiB1YzsJLyogVXBwZXJjYXNlID0gaW5wdXQgKi8KKwkJCWlmICh1YyA8PSBycC0+ZW5kKQkvKiBJbiByYW5nZSAqLworCQkJCXJldHVybiB1YyArIHJwLT50YWJsZVt1YyAtIHJwLT5zdGFydF07CisJCQlycCsrOwkvKiBUcnkgbmV4dCByYW5nZSAqLworCQl9CisJfQorCXJldHVybiB1YzsJCS8qIFBhc3QgbGFzdCByYW5nZSAqLworfQorCisvKgorICogVW5pU3RybHdyOiAgTG93ZXIgY2FzZSBhIHVuaWNvZGUgc3RyaW5nCisgKi8KK3N0YXRpYyBpbmxpbmUgd2NoYXJfdCAqCitVbmlTdHJsd3IocmVnaXN0ZXIgd2NoYXJfdCAqIHVwaW4pCit7CisJcmVnaXN0ZXIgd2NoYXJfdCAqdXA7CisKKwl1cCA9IHVwaW47CisJd2hpbGUgKCp1cCkgewkJLyogRm9yIGFsbCBjaGFyYWN0ZXJzICovCisJCSp1cCA9IFVuaVRvbG93ZXIoKnVwKTsKKwkJdXArKzsKKwl9CisJcmV0dXJuIHVwaW47CQkvKiBSZXR1cm4gaW5wdXQgcG9pbnRlciAqLworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc191bml1cHIuaCBiL2ZzL2NpZnMvY2lmc191bml1cHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWNkMTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9jaWZzX3VuaXVwci5oCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgIENvcnAuLCAyMDAwLDIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiB1bml1cHIuaCAtIFVuaWNvZGUgY29tcHJlc3NlZCBjYXNlIHJhbmdlcworICoKKyovCisKKyNpZm5kZWYgVU5JVVBSX05PVVBQRVIKKy8qCisgKiBMYXRpbiB1cHBlciBjYXNlCisgKi8KK3NpZ25lZCBjaGFyIENpZnNVbmlVcHBlclRhYmxlWzUxMl0gPSB7CisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMDAwLTAwZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDAxMC0wMWYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAwMjAtMDJmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMDMwLTAzZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDA0MC0wNGYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAwNTAtMDVmICovCisJMCwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwJLyogMDYwLTA2ZiAqLworCS0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAwLCAwLCAwLCAwLCAwLAkvKiAwNzAtMDdmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMDgwLTA4ZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDA5MC0wOWYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAwYTAtMGFmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMGIwLTBiZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDBjMC0wY2YgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAwZDAtMGRmICovCisJLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLAkvKiAwZTAtMGVmICovCisJLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAwLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIDEyMSwJLyogMGYwLTBmZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogMTAwLTEwZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogMTEwLTExZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogMTIwLTEyZiAqLworCTAsIDAsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsCS8qIDEzMC0xM2YgKi8KKwktMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIDAsIC0xLCAwLCAtMSwgMCwgLTEsCS8qIDE0MC0xNGYgKi8KKwkwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsCS8qIDE1MC0xNWYgKi8KKwkwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsCS8qIDE2MC0xNmYgKi8KKwkwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwJLyogMTcwLTE3ZiAqLworCTAsIDAsIDAsIC0xLCAwLCAtMSwgMCwgMCwgLTEsIDAsIDAsIDAsIC0xLCAwLCAwLCAwLAkvKiAxODAtMThmICovCisJMCwgMCwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIC0xLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAxOTAtMTlmICovCisJMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgMCwgLTEsIDAsIDAsIDAsIDAsIC0xLCAwLCAwLAkvKiAxYTAtMWFmICovCisJLTEsIDAsIDAsIDAsIC0xLCAwLCAtMSwgMCwgMCwgLTEsIDAsIDAsIDAsIC0xLCAwLCAwLAkvKiAxYjAtMWJmICovCisJMCwgMCwgMCwgMCwgMCwgLTEsIC0yLCAwLCAtMSwgLTIsIDAsIC0xLCAtMiwgMCwgLTEsIDAsCS8qIDFjMC0xY2YgKi8KKwktMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgLTc5LCAwLCAtMSwJLyogMWQwLTFkZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogMWUwLTFlZiAqLworCTAsIDAsIC0xLCAtMiwgMCwgLTEsIDAsIDAsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLAkvKiAxZjAtMWZmICovCit9OworCisvKiBVcHBlciBjYXNlIHJhbmdlIC0gR3JlZWsgKi8KK3N0YXRpYyBzaWduZWQgY2hhciBVbmlDYXNlUmFuZ2VVMDNhMFs0N10gPSB7CisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTM4LCAtMzcsIC0zNywgLTM3LAkvKiAzYTAtM2FmICovCisJMCwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwJLyogM2IwLTNiZiAqLworCS0zMiwgLTMyLCAtMzEsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC02NCwKKwktNjMsIC02MywKK307CisKKy8qIFVwcGVyIGNhc2UgcmFuZ2UgLSBDeXJpbGxpYyAqLworc3RhdGljIHNpZ25lZCBjaGFyIFVuaUNhc2VSYW5nZVUwNDMwWzQ4XSA9IHsKKwktMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsCS8qIDQzMC00M2YgKi8KKwktMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsCS8qIDQ0MC00NGYgKi8KKwkwLCAtODAsIC04MCwgLTgwLCAtODAsIC04MCwgLTgwLCAtODAsIC04MCwgLTgwLCAtODAsIC04MCwgLTgwLCAwLCAtODAsIC04MCwJLyogNDUwLTQ1ZiAqLworfTsKKworLyogVXBwZXIgY2FzZSByYW5nZSAtIEV4dGVuZGVkIGN5cmlsbGljICovCitzdGF0aWMgc2lnbmVkIGNoYXIgVW5pQ2FzZVJhbmdlVTA0OTBbNjFdID0geworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogNDkwLTQ5ZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogNGEwLTRhZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogNGIwLTRiZiAqLworCTAsIDAsIC0xLCAwLCAtMSwgMCwgMCwgMCwgLTEsIDAsIDAsIDAsIC0xLAorfTsKKworLyogVXBwZXIgY2FzZSByYW5nZSAtIEV4dGVuZGVkIGxhdGluIGFuZCBncmVlayAqLworc3RhdGljIHNpZ25lZCBjaGFyIFVuaUNhc2VSYW5nZVUxZTAwWzUwOV0gPSB7CisJMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLAkvKiAxZTAwLTFlMGYgKi8KKwkwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsCS8qIDFlMTAtMWUxZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogMWUyMC0xZTJmICovCisJMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLAkvKiAxZTMwLTFlM2YgKi8KKwkwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsCS8qIDFlNDAtMWU0ZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogMWU1MC0xZTVmICovCisJMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLAkvKiAxZTYwLTFlNmYgKi8KKwkwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsCS8qIDFlNzAtMWU3ZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogMWU4MC0xZThmICovCisJMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgMCwgMCwgMCwgMCwgLTU5LCAwLCAtMSwgMCwgLTEsCS8qIDFlOTAtMWU5ZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogMWVhMC0xZWFmICovCisJMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLAkvKiAxZWIwLTFlYmYgKi8KKwkwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsCS8qIDFlYzAtMWVjZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogMWVkMC0xZWRmICovCisJMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLAkvKiAxZWUwLTFlZWYgKi8KKwkwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFlZjAtMWVmZiAqLworCTgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmMDAtMWYwZiAqLworCTgsIDgsIDgsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmMTAtMWYxZiAqLworCTgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmMjAtMWYyZiAqLworCTgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmMzAtMWYzZiAqLworCTgsIDgsIDgsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmNDAtMWY0ZiAqLworCTAsIDgsIDAsIDgsIDAsIDgsIDAsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmNTAtMWY1ZiAqLworCTgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmNjAtMWY2ZiAqLworCTc0LCA3NCwgODYsIDg2LCA4NiwgODYsIDEwMCwgMTAwLCAwLCAwLCAxMTIsIDExMiwgMTI2LCAxMjYsIDAsIDAsCS8qIDFmNzAtMWY3ZiAqLworCTgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmODAtMWY4ZiAqLworCTgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmOTAtMWY5ZiAqLworCTgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmYTAtMWZhZiAqLworCTgsIDgsIDAsIDksIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmYjAtMWZiZiAqLworCTAsIDAsIDAsIDksIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmYzAtMWZjZiAqLworCTgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmZDAtMWZkZiAqLworCTgsIDgsIDAsIDAsIDAsIDcsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmZTAtMWZlZiAqLworCTAsIDAsIDAsIDksIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCit9OworCisvKiBVcHBlciBjYXNlIHJhbmdlIC0gV2lkZSBsYXRpbiAqLworc3RhdGljIHNpZ25lZCBjaGFyIFVuaUNhc2VSYW5nZVVmZjQwWzI3XSA9IHsKKwkwLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLAkvKiBmZjQwLWZmNGYgKi8KKwktMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwKK307CisKKy8qCisgKiBVcHBlciBDYXNlIFJhbmdlCisgKi8KK2NvbnN0IHN0cnVjdCBVbmlDYXNlUmFuZ2UgQ2lmc1VuaVVwcGVyUmFuZ2VbXSA9IHsKKwl7MHgwM2EwLCAweDAzY2UsIFVuaUNhc2VSYW5nZVUwM2EwfSwKKwl7MHgwNDMwLCAweDA0NWYsIFVuaUNhc2VSYW5nZVUwNDMwfSwKKwl7MHgwNDkwLCAweDA0Y2MsIFVuaUNhc2VSYW5nZVUwNDkwfSwKKwl7MHgxZTAwLCAweDFmZmMsIFVuaUNhc2VSYW5nZVUxZTAwfSwKKwl7MHhmZjQwLCAweGZmNWEsIFVuaUNhc2VSYW5nZVVmZjQwfSwKKwl7MH0KK307CisjZW5kaWYKKworI2lmbmRlZiBVTklVUFJfTk9MT1dFUgorLyoKKyAqIExhdGluIGxvd2VyIGNhc2UKKyAqLworc3RhdGljIHNpZ25lZCBjaGFyIENpZnNVbmlMb3dlclRhYmxlWzUxMl0gPSB7CisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMDAwLTAwZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDAxMC0wMWYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAwMjAtMDJmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMDMwLTAzZiAqLworCTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCS8qIDA0MC0wNGYgKi8KKwkzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDAsIDAsIDAsIDAsIDAsCS8qIDA1MC0wNWYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAwNjAtMDZmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMDcwLTA3ZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDA4MC0wOGYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAwOTAtMDlmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMGEwLTBhZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDBiMC0wYmYgKi8KKwkzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwJLyogMGMwLTBjZiAqLworCTMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMCwJLyogMGQwLTBkZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDBlMC0wZWYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAwZjAtMGZmICovCisJMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwJLyogMTAwLTEwZiAqLworCTEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsCS8qIDExMC0xMWYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxMjAtMTJmICovCisJMCwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwJLyogMTMwLTEzZiAqLworCTAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDAsIDEsIDAsIDEsIDAsIDEsIDAsCS8qIDE0MC0xNGYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxNTAtMTVmICovCisJMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwJLyogMTYwLTE2ZiAqLworCTEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIC0xMjEsIDEsIDAsIDEsIDAsIDEsIDAsIDAsCS8qIDE3MC0xN2YgKi8KKwkwLCAwLCAxLCAwLCAxLCAwLCAwLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCA3OSwgMCwJLyogMTgwLTE4ZiAqLworCTAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDE5MC0xOWYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAxLAkvKiAxYTAtMWFmICovCisJMCwgMCwgMCwgMSwgMCwgMSwgMCwgMCwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwJLyogMWIwLTFiZiAqLworCTAsIDAsIDAsIDAsIDIsIDEsIDAsIDIsIDEsIDAsIDIsIDEsIDAsIDEsIDAsIDEsCS8qIDFjMC0xY2YgKi8KKwkwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAwLCAxLCAwLAkvKiAxZDAtMWRmICovCisJMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwJLyogMWUwLTFlZiAqLworCTAsIDIsIDEsIDAsIDEsIDAsIDAsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsCS8qIDFmMC0xZmYgKi8KK307CisKKy8qIExvd2VyIGNhc2UgcmFuZ2UgLSBHcmVlayAqLworc3RhdGljIHNpZ25lZCBjaGFyIFVuaUNhc2VSYW5nZUwwMzgwWzQ0XSA9IHsKKwkwLCAwLCAwLCAwLCAwLCAwLCAzOCwgMCwgMzcsIDM3LCAzNywgMCwgNjQsIDAsIDYzLCA2MywJLyogMzgwLTM4ZiAqLworCTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCS8qIDM5MC0zOWYgKi8KKwkzMiwgMzIsIDAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCit9OworCisvKiBMb3dlciBjYXNlIHJhbmdlIC0gQ3lyaWxsaWMgKi8KK3N0YXRpYyBzaWduZWQgY2hhciBVbmlDYXNlUmFuZ2VMMDQwMFs0OF0gPSB7CisJMCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgMCwgODAsIDgwLAkvKiA0MDAtNDBmICovCisJMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCS8qIDQxMC00MWYgKi8KKwkzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwJLyogNDIwLTQyZiAqLworfTsKKworLyogTG93ZXIgY2FzZSByYW5nZSAtIEV4dGVuZGVkIGN5cmlsbGljICovCitzdGF0aWMgc2lnbmVkIGNoYXIgVW5pQ2FzZVJhbmdlTDA0OTBbNjBdID0geworCTEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsCS8qIDQ5MC00OWYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiA0YTAtNGFmICovCisJMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwJLyogNGIwLTRiZiAqLworCTAsIDEsIDAsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEsCit9OworCisvKiBMb3dlciBjYXNlIHJhbmdlIC0gRXh0ZW5kZWQgbGF0aW4gYW5kIGdyZWVrICovCitzdGF0aWMgc2lnbmVkIGNoYXIgVW5pQ2FzZVJhbmdlTDFlMDBbNTA0XSA9IHsKKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTAwLTFlMGYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTEwLTFlMWYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTIwLTFlMmYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTMwLTFlM2YgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTQwLTFlNGYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTUwLTFlNWYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTYwLTFlNmYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTcwLTFlN2YgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTgwLTFlOGYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTkwLTFlOWYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZWEwLTFlYWYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZWIwLTFlYmYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZWMwLTFlY2YgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZWQwLTFlZGYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZWUwLTFlZWYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAxZWYwLTFlZmYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtOCwgLTgsIC04LCAtOCwgLTgsIC04LCAtOCwgLTgsCS8qIDFmMDAtMWYwZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC04LCAtOCwgLTgsIC04LCAtOCwgLTgsIDAsIDAsCS8qIDFmMTAtMWYxZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC04LCAtOCwgLTgsIC04LCAtOCwgLTgsIC04LCAtOCwJLyogMWYyMC0xZjJmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTgsIC04LCAtOCwgLTgsIC04LCAtOCwgLTgsIC04LAkvKiAxZjMwLTFmM2YgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtOCwgLTgsIC04LCAtOCwgLTgsIC04LCAwLCAwLAkvKiAxZjQwLTFmNGYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtOCwgMCwgLTgsIDAsIC04LCAwLCAtOCwJLyogMWY1MC0xZjVmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTgsIC04LCAtOCwgLTgsIC04LCAtOCwgLTgsIC04LAkvKiAxZjYwLTFmNmYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAxZjcwLTFmN2YgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtOCwgLTgsIC04LCAtOCwgLTgsIC04LCAtOCwgLTgsCS8qIDFmODAtMWY4ZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC04LCAtOCwgLTgsIC04LCAtOCwgLTgsIC04LCAtOCwJLyogMWY5MC0xZjlmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTgsIC04LCAtOCwgLTgsIC04LCAtOCwgLTgsIC04LAkvKiAxZmEwLTFmYWYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtOCwgLTgsIC03NCwgLTc0LCAtOSwgMCwgMCwgMCwJLyogMWZiMC0xZmJmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTg2LCAtODYsIC04NiwgLTg2LCAtOSwgMCwgMCwgMCwJLyogMWZjMC0xZmNmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTgsIC04LCAtMTAwLCAtMTAwLCAwLCAwLCAwLCAwLAkvKiAxZmQwLTFmZGYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtOCwgLTgsIC0xMTIsIC0xMTIsIC03LCAwLCAwLCAwLAkvKiAxZmUwLTFmZWYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorfTsKKworLyogTG93ZXIgY2FzZSByYW5nZSAtIFdpZGUgbGF0aW4gKi8KK3N0YXRpYyBzaWduZWQgY2hhciBVbmlDYXNlUmFuZ2VMZmYyMFsyN10gPSB7CisJMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwJLyogZmYyMC1mZjJmICovCisJMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorfTsKKworLyoKKyAqIExvd2VyIENhc2UgUmFuZ2UKKyAqLworY29uc3Qgc3RhdGljIHN0cnVjdCBVbmlDYXNlUmFuZ2UgQ2lmc1VuaUxvd2VyUmFuZ2VbXSA9IHsKKwkweDAzODAsIDB4MDNhYiwgVW5pQ2FzZVJhbmdlTDAzODAsCisJMHgwNDAwLCAweDA0MmYsIFVuaUNhc2VSYW5nZUwwNDAwLAorCTB4MDQ5MCwgMHgwNGNiLCBVbmlDYXNlUmFuZ2VMMDQ5MCwKKwkweDFlMDAsIDB4MWZmNywgVW5pQ2FzZVJhbmdlTDFlMDAsCisJMHhmZjIwLCAweGZmM2EsIFVuaUNhc2VSYW5nZUxmZjIwLAorCTAsIDAsIDAKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYyBiL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODgyOWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9jaWZzZW5jcnlwdC5jCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogICBmcy9jaWZzL2NpZnNlbmNyeXB0LmMKKyAqCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDMKKyAqICAgQXV0aG9yKHMpOiBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgImNpZnNwZHUuaCIKKyNpbmNsdWRlICJjaWZzZ2xvYi5oIiAKKyNpbmNsdWRlICJjaWZzX2RlYnVnLmgiCisjaW5jbHVkZSAibWQ1LmgiCisjaW5jbHVkZSAiY2lmc191bmljb2RlLmgiCisjaW5jbHVkZSAiY2lmc3Byb3RvLmgiCisKKy8qIENhbGN1bGF0ZSBhbmQgcmV0dXJuIHRoZSBDSUZTIHNpZ25hdHVyZSBiYXNlZCBvbiB0aGUgbWFjIGtleSBhbmQgdGhlIHNtYiBwZHUgKi8KKy8qIHRoZSAxNiBieXRlIHNpZ25hdHVyZSBtdXN0IGJlIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyICAqLworLyogTm90ZSB3ZSBvbmx5IHVzZSB0aGUgMXN0IGVpZ2h0IGJ5dGVzICovCisvKiBOb3RlIHRoYXQgdGhlIHNtYiBoZWFkZXIgc2lnbmF0dXJlIGZpZWxkIG9uIGlucHV0IGNvbnRhaW5zIHRoZSAgCisJc2VxdWVuY2UgbnVtYmVyIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAqLworCitleHRlcm4gdm9pZCBtZGZvdXIodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBjaGFyICppbiwgaW50IG4pOworZXh0ZXJuIHZvaWQgRV9tZDRoYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhc3N3ZCwgdW5zaWduZWQgY2hhciAqcDE2KTsKKwkKK3N0YXRpYyBpbnQgY2lmc19jYWxjdWxhdGVfc2lnbmF0dXJlKGNvbnN0IHN0cnVjdCBzbWJfaGRyICogY2lmc19wZHUsIGNvbnN0IGNoYXIgKiBrZXksIGNoYXIgKiBzaWduYXR1cmUpCit7CisJc3RydWN0CU1ENUNvbnRleHQgY29udGV4dDsKKworCWlmKChjaWZzX3BkdSA9PSBOVUxMKSB8fCAoc2lnbmF0dXJlID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCU1ENUluaXQoJmNvbnRleHQpOworCU1ENVVwZGF0ZSgmY29udGV4dCxrZXksQ0lGU19TRVNTSU9OX0tFWV9TSVpFKzE2KTsKKwlNRDVVcGRhdGUoJmNvbnRleHQsY2lmc19wZHUtPlByb3RvY29sLGNpZnNfcGR1LT5zbWJfYnVmX2xlbmd0aCk7CisJTUQ1RmluYWwoc2lnbmF0dXJlLCZjb250ZXh0KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNpZnNfc2lnbl9zbWIoc3RydWN0IHNtYl9oZHIgKiBjaWZzX3BkdSwgc3RydWN0IGNpZnNTZXNJbmZvICogc2VzLAorCV9fdTMyICogcGV4cGVjdGVkX3Jlc3BvbnNlX3NlcXVlbmNlX251bWJlcikKK3sKKwlpbnQgcmMgPSAwOworCWNoYXIgc21iX3NpZ25hdHVyZVsyMF07CisKKwkvKiBCQiByZW1lbWJlciB0byBpbml0aWFsaXplIHNlcXVlbmNlIG51bWJlciBlbHNld2hlcmUgYW5kIGluaXRpYWxpemUgbWFjX3NpZ25pbmcga2V5IGVsc2V3aGVyZSBCQiAqLworCS8qIEJCIHJlbWVtYmVyIHRvIGFkZCBjb2RlIHRvIHNhdmUgZXhwZWN0ZWQgc2VxdWVuY2UgbnVtYmVyIGluIG1pZFEgZW50cnkgQkIgKi8KKworCWlmKChjaWZzX3BkdSA9PSBOVUxMKSB8fCAoc2VzID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmKChjaWZzX3BkdS0+RmxhZ3MyICYgU01CRkxHMl9TRUNVUklUWV9TSUdOQVRVUkUpID09IDApIAorCQlyZXR1cm4gcmM7CisKKwlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwljaWZzX3BkdS0+U2lnbmF0dXJlLlNlcXVlbmNlLlNlcXVlbmNlTnVtYmVyID0gY3B1X3RvX2xlMzIoc2VzLT5zZXF1ZW5jZV9udW1iZXIpOworCWNpZnNfcGR1LT5TaWduYXR1cmUuU2VxdWVuY2UuUmVzZXJ2ZWQgPSAwOworCQorCSpwZXhwZWN0ZWRfcmVzcG9uc2Vfc2VxdWVuY2VfbnVtYmVyID0gc2VzLT5zZXF1ZW5jZV9udW1iZXIrKzsKKwlzZXMtPnNlcXVlbmNlX251bWJlcisrOworCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisKKwlyYyA9IGNpZnNfY2FsY3VsYXRlX3NpZ25hdHVyZShjaWZzX3BkdSwgc2VzLT5tYWNfc2lnbmluZ19rZXksc21iX3NpZ25hdHVyZSk7CisJaWYocmMpCisJCW1lbXNldChjaWZzX3BkdS0+U2lnbmF0dXJlLlNlY3VyaXR5U2lnbmF0dXJlLCAwLCA4KTsKKwllbHNlCisJCW1lbWNweShjaWZzX3BkdS0+U2lnbmF0dXJlLlNlY3VyaXR5U2lnbmF0dXJlLCBzbWJfc2lnbmF0dXJlLCA4KTsKKworCXJldHVybiByYzsKK30KKworaW50IGNpZnNfdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3Qgc21iX2hkciAqIGNpZnNfcGR1LCBjb25zdCBjaGFyICogbWFjX2tleSwKKwlfX3UzMiBleHBlY3RlZF9zZXF1ZW5jZV9udW1iZXIpCit7CisJdW5zaWduZWQgaW50IHJjOworCWNoYXIgc2VydmVyX3Jlc3BvbnNlX3NpZ1s4XTsKKwljaGFyIHdoYXRfd2VfdGhpbmtfc2lnX3Nob3VsZF9iZVsyMF07CisKKwlpZigoY2lmc19wZHUgPT0gTlVMTCkgfHwgKG1hY19rZXkgPT0gTlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNpZnNfcGR1LT5Db21tYW5kID09IFNNQl9DT01fTkVHT1RJQVRFKQorCQlyZXR1cm4gMDsKKworCWlmIChjaWZzX3BkdS0+Q29tbWFuZCA9PSBTTUJfQ09NX0xPQ0tJTkdfQU5EWCkgeworCQlzdHJ1Y3Qgc21iX2NvbV9sb2NrX3JlcSAqIHBTTUIgPSAoc3RydWN0IHNtYl9jb21fbG9ja19yZXEgKiljaWZzX3BkdTsKKwkgICAgaWYocFNNQi0+TG9ja1R5cGUgJiBMT0NLSU5HX0FORFhfT1BMT0NLX1JFTEVBU0UpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBCQiB3aGF0IGlmIHNpZ25hdHVyZXMgYXJlIHN1cHBvc2VkIHRvIGJlIG9uIGZvciBzZXNzaW9uIGJ1dCBzZXJ2ZXIgZG9lcyBub3QKKwkJc2VuZCBvbmU/IEJCICovCisJCisJLyogRG8gbm90IG5lZWQgdG8gdmVyaWZ5IHNlc3Npb24gc2V0dXBzIHdpdGggc2lnbmF0dXJlICJCU1JTUFlMICIgICovCisJaWYobWVtY21wKGNpZnNfcGR1LT5TaWduYXR1cmUuU2VjdXJpdHlTaWduYXR1cmUsIkJTUlNQWUwgIiw4KT09MCkKKwkJY0ZZSSgxLCgiZHVtbXkgc2lnbmF0dXJlIHJlY2VpdmVkIGZvciBzbWIgY29tbWFuZCAweCV4IixjaWZzX3BkdS0+Q29tbWFuZCkpOworCisJLyogc2F2ZSBvZmYgdGhlIG9yaWdpZ2luYWwgc2lnbmF0dXJlIHNvIHdlIGNhbiBtb2RpZnkgdGhlIHNtYiBhbmQgY2hlY2sKKwkJaXRzIHNpZ25hdHVyZSBhZ2FpbnN0IHdoYXQgdGhlIHNlcnZlciBzZW50ICovCisJbWVtY3B5KHNlcnZlcl9yZXNwb25zZV9zaWcsY2lmc19wZHUtPlNpZ25hdHVyZS5TZWN1cml0eVNpZ25hdHVyZSw4KTsKKworCWNpZnNfcGR1LT5TaWduYXR1cmUuU2VxdWVuY2UuU2VxdWVuY2VOdW1iZXIgPSBjcHVfdG9fbGUzMihleHBlY3RlZF9zZXF1ZW5jZV9udW1iZXIpOworCWNpZnNfcGR1LT5TaWduYXR1cmUuU2VxdWVuY2UuUmVzZXJ2ZWQgPSAwOworCisJcmMgPSBjaWZzX2NhbGN1bGF0ZV9zaWduYXR1cmUoY2lmc19wZHUsIG1hY19rZXksCisJCXdoYXRfd2VfdGhpbmtfc2lnX3Nob3VsZF9iZSk7CisKKwlpZihyYykKKwkJcmV0dXJuIHJjOworCisJCisvKgljaWZzX2R1bXBfbWVtKCJ3aGF0IHdlIHRoaW5rIGl0IHNob3VsZCBiZTogIix3aGF0X3dlX3RoaW5rX3NpZ19zaG91bGRfYmUsMTYpOyAqLworCisJaWYobWVtY21wKHNlcnZlcl9yZXNwb25zZV9zaWcsIHdoYXRfd2VfdGhpbmtfc2lnX3Nob3VsZF9iZSwgOCkpCisJCXJldHVybiAtRUFDQ0VTOworCWVsc2UKKwkJcmV0dXJuIDA7CisKK30KKworLyogV2UgZmlsbCBpbiBrZXkgYnkgcHV0dGluZyBpbiA0MCBieXRlIGFycmF5IHdoaWNoIHdhcyBhbGxvY2F0ZWQgYnkgY2FsbGVyICovCitpbnQgY2lmc19jYWxjdWxhdGVfbWFjX2tleShjaGFyICoga2V5LCBjb25zdCBjaGFyICogcm4sIGNvbnN0IGNoYXIgKiBwYXNzd29yZCkKK3sKKwljaGFyIHRlbXBfa2V5WzE2XTsKKwlpZiAoKGtleSA9PSBOVUxMKSB8fCAocm4gPT0gTlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJRV9tZDRoYXNoKHBhc3N3b3JkLCB0ZW1wX2tleSk7CisJbWRmb3VyKGtleSx0ZW1wX2tleSwxNik7CisJbWVtY3B5KGtleSsxNixybiwgQ0lGU19TRVNTSU9OX0tFWV9TSVpFKTsKKwlyZXR1cm4gMDsKK30KKworaW50IENhbGNOVExNdjJfcGFydGlhbF9tYWNfa2V5KHN0cnVjdCBjaWZzU2VzSW5mbyAqIHNlcywgc3RydWN0IG5sc190YWJsZSAqIG5sc19pbmZvKQoreworCWNoYXIgdGVtcF9oYXNoWzE2XTsKKwlzdHJ1Y3QgSE1BQ01ENUNvbnRleHQgY3R4OworCWNoYXIgKiB1Y2FzZV9idWY7CisJd2NoYXJfdCAqIHVuaWNvZGVfYnVmOworCXVuc2lnbmVkIGludCBpLHVzZXJfbmFtZV9sZW4sZG9tX25hbWVfbGVuOworCisJaWYoc2VzID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJRV9tZDRoYXNoKHNlcy0+cGFzc3dvcmQsIHRlbXBfaGFzaCk7CisKKwlobWFjX21kNV9pbml0X2xpbUtfdG9fNjQodGVtcF9oYXNoLCAxNiwgJmN0eCk7CisJdXNlcl9uYW1lX2xlbiA9IHN0cmxlbihzZXMtPnVzZXJOYW1lKTsKKwlpZih1c2VyX25hbWVfbGVuID4gTUFYX1VTRVJOQU1FX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCWRvbV9uYW1lX2xlbiA9IHN0cmxlbihzZXMtPmRvbWFpbk5hbWUpOworCWlmKGRvbV9uYW1lX2xlbiA+IE1BWF9VU0VSTkFNRV9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKyAgCisJdWNhc2VfYnVmID0ga21hbGxvYygoTUFYX1VTRVJOQU1FX1NJWkUrMSksIEdGUF9LRVJORUwpOworCWlmKHVjYXNlX2J1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwl1bmljb2RlX2J1ZiA9IGttYWxsb2MoKE1BWF9VU0VSTkFNRV9TSVpFKzEpKjQsIEdGUF9LRVJORUwpOworCWlmKHVuaWNvZGVfYnVmID09IE5VTEwpIHsKKwkJa2ZyZWUodWNhc2VfYnVmKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorICAgCisJZm9yKGk9MDtpPHVzZXJfbmFtZV9sZW47aSsrKQorCQl1Y2FzZV9idWZbaV0gPSBubHNfaW5mby0+Y2hhcnNldDJ1cHBlclsoaW50KXNlcy0+dXNlck5hbWVbaV1dOworCXVjYXNlX2J1ZltpXSA9IDA7CisJdXNlcl9uYW1lX2xlbiA9IGNpZnNfc3RydG9VQ1ModW5pY29kZV9idWYsIHVjYXNlX2J1ZiwgTUFYX1VTRVJOQU1FX1NJWkUqMiwgbmxzX2luZm8pOworCXVuaWNvZGVfYnVmW3VzZXJfbmFtZV9sZW5dID0gMDsKKwl1c2VyX25hbWVfbGVuKys7CisKKwlmb3IoaT0wO2k8ZG9tX25hbWVfbGVuO2krKykKKwkJdWNhc2VfYnVmW2ldID0gbmxzX2luZm8tPmNoYXJzZXQydXBwZXJbKGludClzZXMtPmRvbWFpbk5hbWVbaV1dOworCXVjYXNlX2J1ZltpXSA9IDA7CisJZG9tX25hbWVfbGVuID0gY2lmc19zdHJ0b1VDUyh1bmljb2RlX2J1Zit1c2VyX25hbWVfbGVuLCB1Y2FzZV9idWYsIE1BWF9VU0VSTkFNRV9TSVpFKjIsIG5sc19pbmZvKTsKKworCXVuaWNvZGVfYnVmW3VzZXJfbmFtZV9sZW4gKyBkb21fbmFtZV9sZW5dID0gMDsKKwlobWFjX21kNV91cGRhdGUoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgdW5pY29kZV9idWYsCisJCSh1c2VyX25hbWVfbGVuK2RvbV9uYW1lX2xlbikqMiwmY3R4KTsKKworCWhtYWNfbWQ1X2ZpbmFsKHNlcy0+bWFjX3NpZ25pbmdfa2V5LCZjdHgpOworCWtmcmVlKHVjYXNlX2J1Zik7CisJa2ZyZWUodW5pY29kZV9idWYpOworCXJldHVybiAwOworfQordm9pZCBDYWxjTlRMTXYyX3Jlc3BvbnNlKGNvbnN0IHN0cnVjdCBjaWZzU2VzSW5mbyAqIHNlcyxjaGFyICogdjJfc2Vzc2lvbl9yZXNwb25zZSkKK3sKKwlzdHJ1Y3QgSE1BQ01ENUNvbnRleHQgY29udGV4dDsKKwltZW1jcHkodjJfc2Vzc2lvbl9yZXNwb25zZSArIDgsIHNlcy0+c2VydmVyLT5jcnlwdEtleSw4KTsKKwkvKiBnZW5fYmxvYih2Ml9zZXNzaW9uX3Jlc3BvbnNlICsgMTYpOyAqLworCWhtYWNfbWQ1X2luaXRfbGltS190b182NChzZXMtPm1hY19zaWduaW5nX2tleSwgMTYsICZjb250ZXh0KTsKKworCWhtYWNfbWQ1X3VwZGF0ZShzZXMtPnNlcnZlci0+Y3J5cHRLZXksOCwmY29udGV4dCk7CisvKglobWFjX21kNV91cGRhdGUodjJfc2Vzc2lvbl9yZXNwb25zZSsxNiljbGllbnQgdGhpbmcsOCwmY29udGV4dCk7ICovIC8qIEJCIGZpeCAqLworCisJaG1hY19tZDVfZmluYWwodjJfc2Vzc2lvbl9yZXNwb25zZSwmY29udGV4dCk7Cit9CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNlbmNyeXB0LmggYi9mcy9jaWZzL2NpZnNlbmNyeXB0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNlMzU5YgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NpZnMvY2lmc2VuY3J5cHQuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogICBmcy9jaWZzL2NpZnNlbmNyeXB0LmgKKyAqCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDUKKyAqICAgQXV0aG9yKHMpOiBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqCisgKiAgIEV4dGVybnMgZm9yIG1pc2MuIHNtYWxsIGVuY3J5cHRpb24gcm91dGluZXMKKyAqICAgc28gd2UgZG8gbm90IGhhdmUgdG8gcHV0IHRoZW0gaW4gY2lmc3Byb3RvLmgKKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qIG1kNC5jICovCitleHRlcm4gdm9pZCBtZGZvdXIodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBjaGFyICppbiwgaW50IG4pOworLyogc21iZGVzLmMgKi8KK2V4dGVybiB2b2lkIEVfUDE2KHVuc2lnbmVkIGNoYXIgKnAxNCwgdW5zaWduZWQgY2hhciAqcDE2KTsKK2V4dGVybiB2b2lkIEVfUDI0KHVuc2lnbmVkIGNoYXIgKnAyMSwgdW5zaWduZWQgY2hhciAqYzgsIHVuc2lnbmVkIGNoYXIgKnAyNCk7CitleHRlcm4gdm9pZCBEX1AxNih1bnNpZ25lZCBjaGFyICpwMTQsIHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQpOworZXh0ZXJuIHZvaWQgRV9vbGRfcHdfaGFzaCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqKTsKKworCisKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2ZzLmMgYi9mcy9jaWZzL2NpZnNmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwODJmY2UKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL2NpZnNmcy5jCkBAIC0wLDAgKzEsOTEzIEBACisvKgorICogICBmcy9jaWZzL2NpZnNmcy5jCisgKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgIENvcnAuLCAyMDAyLDIwMDQKKyAqICAgQXV0aG9yKHMpOiBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqCisgKiAgIENvbW1vbiBJbnRlcm5ldCBGaWxlU3lzdGVtIChDSUZTKSBjbGllbnQKKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qIE5vdGUgdGhhdCBCQiBtZWFucyBCVUdCVUcgKGllIHNvbWV0aGluZyB0byBmaXggZXZlbnR1YWxseSkgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlICJjaWZzZnMuaCIKKyNpbmNsdWRlICJjaWZzcGR1LmgiCisjZGVmaW5lIERFQ0xBUkVfR0xPQkFMU19IRVJFCisjaW5jbHVkZSAiY2lmc2dsb2IuaCIKKyNpbmNsdWRlICJjaWZzcHJvdG8uaCIKKyNpbmNsdWRlICJjaWZzX2RlYnVnLmgiCisjaW5jbHVkZSAiY2lmc19mc19zYi5oIgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjZGVmaW5lIENJRlNfTUFHSUNfTlVNQkVSIDB4RkY1MzRENDIJLyogdGhlIGZpcnN0IGZvdXIgYnl0ZXMgb2YgU01CIFBEVXMgKi8KKworI2lmZGVmIENPTkZJR19DSUZTX1FVT1RBCitzdGF0aWMgc3RydWN0IHF1b3RhY3RsX29wcyBjaWZzX3F1b3RhY3RsX29wczsKKyNlbmRpZgorCitpbnQgY2lmc0ZZSSA9IDA7CitpbnQgY2lmc0VSUk9SID0gMTsKK2ludCB0cmFjZVNNQiA9IDA7Cit1bnNpZ25lZCBpbnQgb3Bsb2NrRW5hYmxlZCA9IDE7Cit1bnNpZ25lZCBpbnQgZXhwZXJpbUVuYWJsZWQgPSAwOwordW5zaWduZWQgaW50IGxpbnV4RXh0RW5hYmxlZCA9IDE7Cit1bnNpZ25lZCBpbnQgbG9va3VwQ2FjaGVFbmFibGVkID0gMTsKK3Vuc2lnbmVkIGludCBtdWx0aXVzZXJfbW91bnQgPSAwOwordW5zaWduZWQgaW50IGV4dGVuZGVkX3NlY3VyaXR5ID0gMDsKK3Vuc2lnbmVkIGludCBudGxtdjJfc3VwcG9ydCA9IDA7Cit1bnNpZ25lZCBpbnQgc2lnbl9DSUZTX1BEVXMgPSAxOworZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqIG9wbG9ja1RocmVhZDsgLyogcmVtb3ZlIHNwYXJzZSB3YXJuaW5nICovCitzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBvcGxvY2tUaHJlYWQgPSBOVUxMOwordW5zaWduZWQgaW50IENJRlNNYXhCdWZTaXplID0gQ0lGU19NQVhfTVNHU0laRTsKK21vZHVsZV9wYXJhbShDSUZTTWF4QnVmU2l6ZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoQ0lGU01heEJ1ZlNpemUsIk5ldHdvcmsgYnVmZmVyIHNpemUgKG5vdCBpbmNsdWRpbmcgaGVhZGVyKS4gRGVmYXVsdDogMTYzODQgUmFuZ2U6IDgxOTIgdG8gMTMwMDQ4Iik7Cit1bnNpZ25lZCBpbnQgY2lmc19taW5fcmN2ID0gQ0lGU19NSU5fUkNWX1BPT0w7Cittb2R1bGVfcGFyYW0oY2lmc19taW5fcmN2LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhjaWZzX21pbl9yY3YsIk5ldHdvcmsgYnVmZmVycyBpbiBwb29sLiBEZWZhdWx0OiA0IFJhbmdlOiAxIHRvIDY0Iik7Cit1bnNpZ25lZCBpbnQgY2lmc19taW5fc21hbGwgPSAzMDsKK21vZHVsZV9wYXJhbShjaWZzX21pbl9zbWFsbCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY2lmc19taW5fc21hbGwsIlNtYWxsIG5ldHdvcmsgYnVmZmVycyBpbiBwb29sLiBEZWZhdWx0OiAzMCBSYW5nZTogMiB0byAyNTYiKTsKK3Vuc2lnbmVkIGludCBjaWZzX21heF9wZW5kaW5nID0gQ0lGU19NQVhfUkVROworbW9kdWxlX3BhcmFtKGNpZnNfbWF4X3BlbmRpbmcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGNpZnNfbWF4X3BlbmRpbmcsIlNpbXVsdGFuZW91cyByZXF1ZXN0cyB0byBzZXJ2ZXIuIERlZmF1bHQ6IDUwIFJhbmdlOiAyIHRvIDI1NiIpOworCitzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGNpZnNfb3Bsb2NrX2V4aXRlZCk7CisKK2V4dGVybiBtZW1wb29sX3QgKmNpZnNfc21fcmVxX3Bvb2xwOworZXh0ZXJuIG1lbXBvb2xfdCAqY2lmc19yZXFfcG9vbHA7CitleHRlcm4gbWVtcG9vbF90ICpjaWZzX21pZF9wb29scDsKKworZXh0ZXJuIGttZW1fY2FjaGVfdCAqY2lmc19vcGxvY2tfY2FjaGVwOworCitzdGF0aWMgaW50CitjaWZzX3JlYWRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwKKwkJY29uc3QgY2hhciAqZGV2bmFtZSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJaW50IHJjID0gMDsKKworCXNiLT5zX2ZsYWdzIHw9IE1TX05PRElSQVRJTUU7IC8qIGFuZCBwcm9iYWJseSBldmVuIG5vYXRpbWUgKi8KKwlzYi0+c19mc19pbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNpZnNfc2JfaW5mbyksR0ZQX0tFUk5FTCk7CisJY2lmc19zYiA9IENJRlNfU0Ioc2IpOworCWlmKGNpZnNfc2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZWxzZQorCQltZW1zZXQoY2lmc19zYiwwLHNpemVvZihzdHJ1Y3QgY2lmc19zYl9pbmZvKSk7CisJCisKKwlyYyA9IGNpZnNfbW91bnQoc2IsIGNpZnNfc2IsIGRhdGEsIGRldm5hbWUpOworCisJaWYgKHJjKSB7CisJCWlmICghc2lsZW50KQorCQkJY0VSUk9SKDEsCisJCQkgICAgICAgKCJjaWZzX21vdW50IGZhaWxlZCB3L3JldHVybiBjb2RlID0gJWQiLCByYykpOworCQlnb3RvIG91dF9tb3VudF9mYWlsZWQ7CisJfQorCisJc2ItPnNfbWFnaWMgPSBDSUZTX01BR0lDX05VTUJFUjsKKwlzYi0+c19vcCA9ICZjaWZzX3N1cGVyX29wczsKKy8qCWlmKGNpZnNfc2ItPnRjb24tPnNlcy0+c2VydmVyLT5tYXhCdWYgPiBNQVhfQ0lGU19IRFJfU0laRSArIDUxMikKKwkgICAgc2ItPnNfYmxvY2tzaXplID0gY2lmc19zYi0+dGNvbi0+c2VzLT5zZXJ2ZXItPm1heEJ1ZiAtIE1BWF9DSUZTX0hEUl9TSVpFOyAqLworI2lmZGVmIENPTkZJR19DSUZTX1FVT1RBCisJc2ItPnNfcWNvcCA9ICZjaWZzX3F1b3RhY3RsX29wczsKKyNlbmRpZgorCXNiLT5zX2Jsb2Nrc2l6ZSA9IENJRlNfTUFYX01TR1NJWkU7CisJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSAxNDsJLyogZGVmYXVsdCAyKioxNCA9IENJRlNfTUFYX01TR1NJWkUgKi8KKwlpbm9kZSA9IGlnZXQoc2IsIFJPT1RfSSk7CisKKwlpZiAoIWlub2RlKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfbm9fcm9vdDsKKwl9CisKKwlzYi0+c19yb290ID0gZF9hbGxvY19yb290KGlub2RlKTsKKworCWlmICghc2ItPnNfcm9vdCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vX3Jvb3Q7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9ub19yb290OgorCWNFUlJPUigxLCAoImNpZnNfcmVhZF9zdXBlcjogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkIikpOworCWlmIChpbm9kZSkKKwkJaXB1dChpbm9kZSk7CisKK291dF9tb3VudF9mYWlsZWQ6CisJaWYoY2lmc19zYikgeworCQlpZihjaWZzX3NiLT5sb2NhbF9ubHMpCisJCQl1bmxvYWRfbmxzKGNpZnNfc2ItPmxvY2FsX25scyk7CQorCQlrZnJlZShjaWZzX3NiKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZAorY2lmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisKKwljRllJKDEsICgiSW4gY2lmc19wdXRfc3VwZXIiKSk7CisJY2lmc19zYiA9IENJRlNfU0Ioc2IpOworCWlmKGNpZnNfc2IgPT0gTlVMTCkgeworCQljRllJKDEsKCJFbXB0eSBjaWZzIHN1cGVyYmxvY2sgaW5mbyBwYXNzZWQgdG8gdW5tb3VudCIpKTsKKwkJcmV0dXJuOworCX0KKwlyYyA9IGNpZnNfdW1vdW50KHNiLCBjaWZzX3NiKTsgCisJaWYgKHJjKSB7CisJCWNFUlJPUigxLCAoImNpZnNfdW1vdW50IGZhaWxlZCB3aXRoIHJldHVybiBjb2RlICVkIiwgcmMpKTsKKwl9CisJdW5sb2FkX25scyhjaWZzX3NiLT5sb2NhbF9ubHMpOworCWtmcmVlKGNpZnNfc2IpOworCXJldHVybjsKK30KKworc3RhdGljIGludAorY2lmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlpbnQgeGlkLCByYyA9IC1FT1BOT1RTVVBQOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisKKwl4aWQgPSBHZXRYaWQoKTsKKworCWNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKKwlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisKKwlidWYtPmZfdHlwZSA9IENJRlNfTUFHSUNfTlVNQkVSOworCisJLyogaW5zdGVhZCBjb3VsZCBnZXQgdGhlIHJlYWwgdmFsdWUgdmlhIFNNQl9RVUVSWV9GU19BVFRSSUJVVEVfSU5GTyAqLworCWJ1Zi0+Zl9uYW1lbGVuID0gUEFUSF9NQVg7CS8qIFBBVEhfTUFYIG1heSBiZSB0b28gbG9uZyAtIGl0IHdvdWxkIHByZXN1bWFibHkKKwkJCQkJICAgYmUgbGVuZ3RoIG9mIHRvdGFsIHBhdGgsIG5vdGUgdGhhdCBzb21lIHNlcnZlcnMgbWF5IGJlIAorCQkJCQkgICBhYmxlIHRvIHN1cHBvcnQgbW9yZSB0aGFuIHRoaXMsIGJ1dCBiZXN0IHRvIGJlIHNhZmUKKwkJCQkJICAgc2luY2UgV2luMmsgYW5kIG90aGVycyBjYW4gbm90IGhhbmRsZSB2ZXJ5IGxvbmcgZmlsZW5hbWVzICovCisJYnVmLT5mX2ZpbGVzID0gMDsJLyogdW5kZWZpbmVkICovCisJYnVmLT5mX2ZmcmVlID0gMDsJLyogdW5saW1pdGVkICovCisKKyNpZmRlZiBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwKKy8qIEJCIHdlIGNvdWxkIGFkZCBhIHNlY29uZCBjaGVjayBmb3IgYSBRRlMgVW5peCBjYXBhYmlsaXR5IGJpdCAqLworICAgIGlmIChwVGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKKwkgICAgcmMgPSBDSUZTU01CUUZTUG9zaXhJbmZvKHhpZCwgcFRjb24sIGJ1ZiwgY2lmc19zYi0+bG9jYWxfbmxzKTsKKworICAgIC8qIE9ubHkgbmVlZCB0byBjYWxsIHRoZSBvbGQgUUZTSW5mbyBpZiBmYWlsZWQKKyAgICBvbiBuZXdlciBvbmUgKi8KKyAgICBpZihyYykKKyNlbmRpZiAvKiBDSUZTX0VYUEVSSU1FTlRBTCAqLworCXJjID0gQ0lGU1NNQlFGU0luZm8oeGlkLCBwVGNvbiwgYnVmLCBjaWZzX3NiLT5sb2NhbF9ubHMpOworCisJLyogICAgIAorCSAgIGludCBmX3R5cGU7CisJICAgX19mc2lkX3QgZl9mc2lkOworCSAgIGludCBmX25hbWVsZW47ICAqLworCS8qIEJCIGdldCBmcm9tIGluZm8gcHV0IGluIHRjb24gc3RydWN0IGF0IG1vdW50IHRpbWUgd2l0aCBjYWxsIHRvIFFGU0F0dHJJbmZvICovCisJRnJlZVhpZCh4aWQpOworCXJldHVybiAwOwkJLyogYWx3YXlzIHJldHVybiBzdWNjZXNzPyB3aGF0IGlmIHZvbHVtZSBpcyBubyBsb25nZXIgYXZhaWxhYmxlPyAqLworfQorCitzdGF0aWMgaW50IGNpZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IG1hc2ssIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisKKwljaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisKKwlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX05PX1BFUk0pIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIC8qIGZpbGUgbW9kZSBtaWdodCBoYXZlIGJlZW4gcmVzdHJpY3RlZCBhdCBtb3VudCB0aW1lIAorCQlvbiB0aGUgY2xpZW50IChhYm92ZSBhbmQgYmV5b25kIEFDTCBvbiBzZXJ2ZXJzKSBmb3IgIAorCQlzZXJ2ZXJzIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHNldHRpbmcgYW5kIHZpZXdpbmcgbW9kZSBiaXRzLAorCQlzbyBhbGxvd2luZyBjbGllbnQgdG8gY2hlY2sgcGVybWlzc2lvbnMgaXMgdXNlZnVsICovIAorCQlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBOVUxMKTsKK30KKworc3RhdGljIGttZW1fY2FjaGVfdCAqY2lmc19pbm9kZV9jYWNoZXA7CitzdGF0aWMga21lbV9jYWNoZV90ICpjaWZzX3JlcV9jYWNoZXA7CitzdGF0aWMga21lbV9jYWNoZV90ICpjaWZzX21pZF9jYWNoZXA7CitrbWVtX2NhY2hlX3QgKmNpZnNfb3Bsb2NrX2NhY2hlcDsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmNpZnNfc21fcmVxX2NhY2hlcDsKK21lbXBvb2xfdCAqY2lmc19zbV9yZXFfcG9vbHA7CittZW1wb29sX3QgKmNpZnNfcmVxX3Bvb2xwOworbWVtcG9vbF90ICpjaWZzX21pZF9wb29scDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqCitjaWZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNfaW5vZGU7CisJY2lmc19pbm9kZSA9IGttZW1fY2FjaGVfYWxsb2MoY2lmc19pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIWNpZnNfaW5vZGUpCisJCXJldHVybiBOVUxMOworCWNpZnNfaW5vZGUtPmNpZnNBdHRycyA9IDB4MjA7CS8qIGRlZmF1bHQgKi8KKwlhdG9taWNfc2V0KCZjaWZzX2lub2RlLT5pblVzZSwgMCk7CisJY2lmc19pbm9kZS0+dGltZSA9IDA7CisJLyogVW50aWwgdGhlIGZpbGUgaXMgb3BlbiBhbmQgd2UgaGF2ZSBnb3R0ZW4gb3Bsb2NrCisJaW5mbyBiYWNrIGZyb20gdGhlIHNlcnZlciwgY2FuIG5vdCBhc3N1bWUgY2FjaGluZyBvZgorCWZpbGUgZGF0YSBvciBtZXRhZGF0YSAqLworCWNpZnNfaW5vZGUtPmNsaWVudENhbkNhY2hlUmVhZCA9IEZBTFNFOworCWNpZnNfaW5vZGUtPmNsaWVudENhbkNhY2hlQWxsID0gRkFMU0U7CisJY2lmc19pbm9kZS0+dmZzX2lub2RlLmlfYmxrc2l6ZSA9IENJRlNfTUFYX01TR1NJWkU7CisJY2lmc19pbm9kZS0+dmZzX2lub2RlLmlfYmxrYml0cyA9IDE0OyAgLyogMioqMTQgPSBDSUZTX01BWF9NU0dTSVpFICovCisKKwlJTklUX0xJU1RfSEVBRCgmY2lmc19pbm9kZS0+b3BlbkZpbGVMaXN0KTsKKwlyZXR1cm4gJmNpZnNfaW5vZGUtPnZmc19pbm9kZTsKK30KKworc3RhdGljIHZvaWQKK2NpZnNfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShjaWZzX2lub2RlX2NhY2hlcCwgQ0lGU19JKGlub2RlKSk7Cit9CisKKy8qCisgKiBjaWZzX3Nob3dfb3B0aW9ucygpIGlzIGZvciBkaXNwbGF5aW5nIG1vdW50IG9wdGlvbnMgaW4gL3Byb2MvbW91bnRzLgorICogTm90IGFsbCBzZXR0YWJsZSBvcHRpb25zIGFyZSBkaXNwbGF5ZWQgYnV0IG1vc3Qgb2YgdGhlIGltcG9ydGFudAorICogb25lcyBhcmUuCisgKi8KK3N0YXRpYyBpbnQKK2NpZnNfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IHZmc21vdW50ICptKQoreworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisKKwljaWZzX3NiID0gQ0lGU19TQihtLT5tbnRfc2IpOworCisJaWYgKGNpZnNfc2IpIHsKKwkJaWYgKGNpZnNfc2ItPnRjb24pIHsKKwkJCXNlcV9wcmludGYocywgIix1bmM9JXMiLCBjaWZzX3NiLT50Y29uLT50cmVlTmFtZSk7CisJCQlpZiAoY2lmc19zYi0+dGNvbi0+c2VzKSB7CisJCQkJaWYgKGNpZnNfc2ItPnRjb24tPnNlcy0+dXNlck5hbWUpCisJCQkJCXNlcV9wcmludGYocywgIix1c2VybmFtZT0lcyIsCisJCQkJCSAgIGNpZnNfc2ItPnRjb24tPnNlcy0+dXNlck5hbWUpOworCQkJCWlmKGNpZnNfc2ItPnRjb24tPnNlcy0+ZG9tYWluTmFtZSkKKwkJCQkJc2VxX3ByaW50ZihzLCAiLGRvbWFpbj0lcyIsCisJCQkJCSAgIGNpZnNfc2ItPnRjb24tPnNlcy0+ZG9tYWluTmFtZSk7CisJCQl9CisJCX0KKwkJc2VxX3ByaW50ZihzLCAiLHJzaXplPSVkIixjaWZzX3NiLT5yc2l6ZSk7CisJCXNlcV9wcmludGYocywgIix3c2l6ZT0lZCIsY2lmc19zYi0+d3NpemUpOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19DSUZTX1FVT1RBCitpbnQgY2lmc194cXVvdGFfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBpbnQgcXVvdGFfdHlwZSwgcWlkX3QgcWlkLAorCQlzdHJ1Y3QgZnNfZGlza19xdW90YSAqIHBkcXVvdGEpCit7CisJaW50IHhpZDsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwkKKwlpZihjaWZzX3NiKQorCQlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisJZWxzZQorCQlyZXR1cm4gLUVJTzsKKworCisJeGlkID0gR2V0WGlkKCk7CisJaWYocFRjb24pIHsKKwkJY0ZZSSgxLCgic2V0IHR5cGU6IDB4JXggaWQ6ICVkIixxdW90YV90eXBlLHFpZCkpOwkJCisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworaW50IGNpZnNfeHF1b3RhX2dldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgaW50IHF1b3RhX3R5cGUsIHFpZF90IHFpZCwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZnNfZGlza19xdW90YSAqIHBkcXVvdGEpCit7CisJaW50IHhpZDsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKworCWlmKGNpZnNfc2IpCisJCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKwllbHNlCisJCXJldHVybiAtRUlPOworCisJeGlkID0gR2V0WGlkKCk7CisJaWYocFRjb24pIHsKKyAgICAgICAgICAgICAgICBjRllJKDEsKCJzZXQgdHlwZTogMHgleCBpZDogJWQiLHF1b3RhX3R5cGUscWlkKSk7CisJfSBlbHNlIHsKKwkJcmMgPSAtRUlPOworCX0KKworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBjaWZzX3hzdGF0ZV9zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHVuc2lnbmVkIGludCBmbGFncywgaW50IG9wZXJhdGlvbikKK3sKKwlpbnQgeGlkOyAKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKworCWlmKGNpZnNfc2IpCisJCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKwllbHNlCisJCXJldHVybiAtRUlPOworCisJeGlkID0gR2V0WGlkKCk7CisJaWYocFRjb24pIHsKKyAgICAgICAgICAgICAgICBjRllJKDEsKCJmbGFnczogMHgleCBvcGVyYXRpb246IDB4JXgiLGZsYWdzLG9wZXJhdGlvbikpOworCX0gZWxzZSB7CisJCXJjID0gLUVJTzsKKwl9CisKKwlGcmVlWGlkKHhpZCk7CisJcmV0dXJuIHJjOworfQorCitpbnQgY2lmc194c3RhdGVfZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBzdHJ1Y3QgZnNfcXVvdGFfc3RhdCAqcXN0YXRzKQoreworCWludCB4aWQ7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiID0gQ0lGU19TQihzYik7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisKKwlpZihjaWZzX3NiKSB7CisJCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTzsKKwl9CisJeGlkID0gR2V0WGlkKCk7CisJaWYocFRjb24pIHsKKwkJY0ZZSSgxLCgicHFzdGF0cyAlcCIscXN0YXRzKSk7CQkKKwl9IGVsc2UgeworCQlyYyA9IC1FSU87CisJfQorCisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBxdW90YWN0bF9vcHMgY2lmc19xdW90YWN0bF9vcHMgPSB7CisJLnNldF94cXVvdGEJPSBjaWZzX3hxdW90YV9zZXQsCisJLmdldF94cXVvdGEJPSBjaWZzX3hxdW90YV9zZXQsCisJLnNldF94c3RhdGUJPSBjaWZzX3hzdGF0ZV9zZXQsCisJLmdldF94c3RhdGUJPSBjaWZzX3hzdGF0ZV9nZXQsCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgY2lmc19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJKmZsYWdzIHw9IE1TX05PRElSQVRJTUU7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGNpZnNfc3VwZXJfb3BzID0geworCS5yZWFkX2lub2RlID0gY2lmc19yZWFkX2lub2RlLAorCS5wdXRfc3VwZXIgPSBjaWZzX3B1dF9zdXBlciwKKwkuc3RhdGZzID0gY2lmc19zdGF0ZnMsCisJLmFsbG9jX2lub2RlID0gY2lmc19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZSA9IGNpZnNfZGVzdHJveV9pbm9kZSwKKy8qCS5kcm9wX2lub2RlCSAgICA9IGdlbmVyaWNfZGVsZXRlX2lub2RlLCAKKwkuZGVsZXRlX2lub2RlCT0gY2lmc19kZWxldGVfaW5vZGUsICAqLy8qIERvIG5vdCBuZWVkIHRoZSBhYm92ZSB0d28gZnVuY3Rpb25zICAgICAKKyAgIHVubGVzcyBsYXRlciB3ZSBhZGQgbGF6eSBjbG9zZSBvZiBpbm9kZXMgb3IgdW5sZXNzIHRoZSBrZXJuZWwgZm9yZ2V0cyB0byBjYWxsCisgICB1cyB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiByZWxlYXNlcyAoY2xvc2VzKSBhcyBvcGVucyAqLworCS5zaG93X29wdGlvbnMgPSBjaWZzX3Nob3dfb3B0aW9ucywKKy8qICAgIC51bW91bnRfYmVnaW4gICA9IGNpZnNfdW1vdW50X2JlZ2luLCAqLy8qIGNvbnNpZGVyIGFkZGluZyBpbiB0aGUgZnV0dXJlICovCisJLnJlbW91bnRfZnMgPSBjaWZzX3JlbW91bnQsCit9OworCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICoKK2NpZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCSAgICBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCWludCByYzsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gc2dldChmc190eXBlLCBOVUxMLCBzZXRfYW5vbl9zdXBlciwgTlVMTCk7CisKKwljRllJKDEsICgiRGV2bmFtZTogJXMgZmxhZ3M6ICVkICIsIGRldl9uYW1lLCBmbGFncykpOworCisJaWYgKElTX0VSUihzYikpCisJCXJldHVybiBzYjsKKworCXNiLT5zX2ZsYWdzID0gZmxhZ3M7CisKKwlyYyA9IGNpZnNfcmVhZF9zdXBlcihzYiwgZGF0YSwgZGV2X25hbWUsIGZsYWdzICYgTVNfVkVSQk9TRSA/IDEgOiAwKTsKKwlpZiAocmMpIHsKKwkJdXBfd3JpdGUoJnNiLT5zX3Vtb3VudCk7CisJCWRlYWN0aXZhdGVfc3VwZXIoc2IpOworCQlyZXR1cm4gRVJSX1BUUihyYyk7CisJfQorCXNiLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKKwlyZXR1cm4gc2I7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitjaWZzX3JlYWRfd3JhcHBlcihzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICpyZWFkX2RhdGEsIHNpemVfdCByZWFkX3NpemUsCisgICAgICAgICAgbG9mZl90ICogcG9mZnNldCkKK3sKKwlpZihmaWxlLT5mX2RlbnRyeSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKwllbHNlIGlmKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJY0ZZSSgxLCgiSW4gcmVhZF93cmFwcGVyIHNpemUgJXpkIGF0ICVsbGQiLHJlYWRfc2l6ZSwqcG9mZnNldCkpOworCisJaWYoQ0lGU19JKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKS0+Y2xpZW50Q2FuQ2FjaGVSZWFkKSB7CisJCXJldHVybiBnZW5lcmljX2ZpbGVfcmVhZChmaWxlLHJlYWRfZGF0YSxyZWFkX3NpemUscG9mZnNldCk7CisJfSBlbHNlIHsKKwkJLyogQkIgZG8gd2UgbmVlZCB0byBsb2NrIGlub2RlIGZyb20gaGVyZSB1bnRpbCBhZnRlciBpbnZhbGlkYXRlPyAqLworLyoJCWlmKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcpIHsKKwkJCWZpbGVtYXBfZmRhdGF3cml0ZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nKTsKKwkJCWZpbGVtYXBfZmRhdGF3YWl0KGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcpOworCQl9Ki8KKy8qCQljaWZzX3JldmFsaWRhdGUoZmlsZS0+Zl9kZW50cnkpOyovIC8qIEJCIGZpeG1lICovCisKKwkJLyogQkIgd2Ugc2hvdWxkIG1ha2UgdGltZXIgY29uZmlndXJhYmxlIC0gcGVyaGFwcyAKKwkJICAgYnkgc2ltcGx5IGNhbGxpbmcgY2lmc19yZXZhbGlkYXRlIGhlcmUgKi8KKwkJLyogaW52YWxpZGF0ZV9yZW1vdGVfaW5vZGUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOyovCisJCXJldHVybiBnZW5lcmljX2ZpbGVfcmVhZChmaWxlLHJlYWRfZGF0YSxyZWFkX3NpemUscG9mZnNldCk7CisJfQorfQorCitzdGF0aWMgc3NpemVfdAorY2lmc193cml0ZV93cmFwcGVyKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKndyaXRlX2RhdGEsCisgICAgICAgICAgIHNpemVfdCB3cml0ZV9zaXplLCBsb2ZmX3QgKiBwb2Zmc2V0KSAKK3sKKwlzc2l6ZV90IHdyaXR0ZW47CisKKwlpZihmaWxlLT5mX2RlbnRyeSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKwllbHNlIGlmKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJY0ZZSSgxLCgiSW4gd3JpdGVfd3JhcHBlciBzaXplICV6ZCBhdCAlbGxkIix3cml0ZV9zaXplLCpwb2Zmc2V0KSk7CisKKwl3cml0dGVuID0gZ2VuZXJpY19maWxlX3dyaXRlKGZpbGUsd3JpdGVfZGF0YSx3cml0ZV9zaXplLHBvZmZzZXQpOworCWlmKCFDSUZTX0koZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpLT5jbGllbnRDYW5DYWNoZUFsbCkgIHsKKwkJaWYoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZykgeworCQkJZmlsZW1hcF9mZGF0YXdyaXRlKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcpOworCQl9CisJfQorCXJldHVybiB3cml0dGVuOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBjaWZzX2ZzX3R5cGUgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm5hbWUgPSAiY2lmcyIsCisJLmdldF9zYiA9IGNpZnNfZ2V0X3NiLAorCS5raWxsX3NiID0ga2lsbF9hbm9uX3N1cGVyLAorCS8qICAuZnNfZmxhZ3MgKi8KK307CitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBjaWZzX2Rpcl9pbm9kZV9vcHMgPSB7CisJLmNyZWF0ZSA9IGNpZnNfY3JlYXRlLAorCS5sb29rdXAgPSBjaWZzX2xvb2t1cCwKKwkuZ2V0YXR0ciA9IGNpZnNfZ2V0YXR0ciwKKwkudW5saW5rID0gY2lmc191bmxpbmssCisJLmxpbmsgPSBjaWZzX2hhcmRsaW5rLAorCS5ta2RpciA9IGNpZnNfbWtkaXIsCisJLnJtZGlyID0gY2lmc19ybWRpciwKKwkucmVuYW1lID0gY2lmc19yZW5hbWUsCisJLnBlcm1pc3Npb24gPSBjaWZzX3Blcm1pc3Npb24sCisvKglyZXZhbGlkYXRlOmNpZnNfcmV2YWxpZGF0ZSwgICAqLworCS5zZXRhdHRyID0gY2lmc19zZXRhdHRyLAorCS5zeW1saW5rID0gY2lmc19zeW1saW5rLAorCS5ta25vZCAgID0gY2lmc19ta25vZCwKKyNpZmRlZiBDT05GSUdfQ0lGU19YQVRUUgorCS5zZXR4YXR0ciA9IGNpZnNfc2V0eGF0dHIsCisJLmdldHhhdHRyID0gY2lmc19nZXR4YXR0ciwKKwkubGlzdHhhdHRyID0gY2lmc19saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyID0gY2lmc19yZW1vdmV4YXR0ciwKKyNlbmRpZgorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgY2lmc19maWxlX2lub2RlX29wcyA9IHsKKy8qCXJldmFsaWRhdGU6Y2lmc19yZXZhbGlkYXRlLCAqLworCS5zZXRhdHRyID0gY2lmc19zZXRhdHRyLAorCS5nZXRhdHRyID0gY2lmc19nZXRhdHRyLCAvKiBkbyB3ZSBuZWVkIHRoaXMgYW55bW9yZT8gKi8KKwkucmVuYW1lID0gY2lmc19yZW5hbWUsCisJLnBlcm1pc3Npb24gPSBjaWZzX3Blcm1pc3Npb24sCisjaWZkZWYgQ09ORklHX0NJRlNfWEFUVFIKKwkuc2V0eGF0dHIgPSBjaWZzX3NldHhhdHRyLAorCS5nZXR4YXR0ciA9IGNpZnNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0ciA9IGNpZnNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0ciA9IGNpZnNfcmVtb3ZleGF0dHIsCisjZW5kaWYgCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBjaWZzX3N5bWxpbmtfaW5vZGVfb3BzID0geworCS5yZWFkbGluayA9IGdlbmVyaWNfcmVhZGxpbmssIAorCS5mb2xsb3dfbGluayA9IGNpZnNfZm9sbG93X2xpbmssCisJLnB1dF9saW5rID0gY2lmc19wdXRfbGluaywKKwkucGVybWlzc2lvbiA9IGNpZnNfcGVybWlzc2lvbiwKKwkvKiBCQiBhZGQgdGhlIGZvbGxvd2luZyB0d28gZXZlbnR1YWxseSAqLworCS8qIHJldmFsaWRhdGU6IGNpZnNfcmV2YWxpZGF0ZSwKKwkgICBzZXRhdHRyOiAgICBjaWZzX25vdGlmeV9jaGFuZ2UsICovLyogQkIgZG8gd2UgbmVlZCBub3RpZnkgY2hhbmdlICovCisjaWZkZWYgQ09ORklHX0NJRlNfWEFUVFIKKwkuc2V0eGF0dHIgPSBjaWZzX3NldHhhdHRyLAorCS5nZXR4YXR0ciA9IGNpZnNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0ciA9IGNpZnNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0ciA9IGNpZnNfcmVtb3ZleGF0dHIsCisjZW5kaWYgCit9OworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNpZnNfZmlsZV9vcHMgPSB7CisJLnJlYWQgPSBjaWZzX3JlYWRfd3JhcHBlciwKKwkud3JpdGUgPSBjaWZzX3dyaXRlX3dyYXBwZXIsIAorCS5vcGVuID0gY2lmc19vcGVuLAorCS5yZWxlYXNlID0gY2lmc19jbG9zZSwKKwkubG9jayA9IGNpZnNfbG9jaywKKwkuZnN5bmMgPSBjaWZzX2ZzeW5jLAorCS5mbHVzaCA9IGNpZnNfZmx1c2gsCisJLm1tYXAgID0gY2lmc19maWxlX21tYXAsCisJLnNlbmRmaWxlID0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorI2lmZGVmIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTAorCS5yZWFkdiA9IGdlbmVyaWNfZmlsZV9yZWFkdiwKKwkud3JpdGV2ID0gZ2VuZXJpY19maWxlX3dyaXRldiwKKwkuYWlvX3JlYWQgPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCisJLmFpb193cml0ZSA9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUsCisJLmRpcl9ub3RpZnkgPSBjaWZzX2Rpcl9ub3RpZnksCisjZW5kaWYgLyogQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMICovCit9OworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNpZnNfZmlsZV9kaXJlY3Rfb3BzID0geworCS8qIG5vIG1tYXAsIG5vIGFpbywgbm8gcmVhZHYgLSAKKwkgICBCQiByZWV2YWx1YXRlIHdoZXRoZXIgdGhleSBjYW4gYmUgZG9uZSB3aXRoIGRpcmVjdGlvLCBubyBjYWNoZSAqLworCS5yZWFkID0gY2lmc191c2VyX3JlYWQsCisJLndyaXRlID0gY2lmc191c2VyX3dyaXRlLAorCS5vcGVuID0gY2lmc19vcGVuLAorCS5yZWxlYXNlID0gY2lmc19jbG9zZSwKKwkubG9jayA9IGNpZnNfbG9jaywKKwkuZnN5bmMgPSBjaWZzX2ZzeW5jLAorCS5mbHVzaCA9IGNpZnNfZmx1c2gsCisJLnNlbmRmaWxlID0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLCAvKiBCQiByZW1vdmVtZSBCQiAqLworI2lmZGVmIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTAorCS5kaXJfbm90aWZ5ID0gY2lmc19kaXJfbm90aWZ5LAorI2VuZGlmIC8qIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTCAqLworfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjaWZzX2Rpcl9vcHMgPSB7CisJLnJlYWRkaXIgPSBjaWZzX3JlYWRkaXIsCisJLnJlbGVhc2UgPSBjaWZzX2Nsb3NlZGlyLAorCS5yZWFkICAgID0gZ2VuZXJpY19yZWFkX2RpciwKKyNpZmRlZiBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwKKwkuZGlyX25vdGlmeSA9IGNpZnNfZGlyX25vdGlmeSwKKyNlbmRpZiAvKiBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwgKi8KK307CisKK3N0YXRpYyB2b2lkCitjaWZzX2luaXRfb25jZSh2b2lkICppbm9kZSwga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzaSA9IGlub2RlOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZIHwgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKSB7CisJCWlub2RlX2luaXRfb25jZSgmY2lmc2ktPnZmc19pbm9kZSk7CisJCUlOSVRfTElTVF9IRUFEKCZjaWZzaS0+bG9ja0xpc3QpOworCX0KK30KKworc3RhdGljIGludAorY2lmc19pbml0X2lub2RlY2FjaGUodm9pZCkKK3sKKwljaWZzX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJjaWZzX2lub2RlX2NhY2hlIiwKKwkJCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgY2lmc0lub2RlSW5mbyksCisJCQkJCSAgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkgICAgICBjaWZzX2luaXRfb25jZSwgTlVMTCk7CisJaWYgKGNpZnNfaW5vZGVfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitjaWZzX2Rlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQoreworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koY2lmc19pbm9kZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJjaWZzX2lub2RlX2NhY2hlOiBlcnJvciBmcmVlaW5nXG4iKTsKK30KKworc3RhdGljIGludAorY2lmc19pbml0X3JlcXVlc3RfYnVmcyh2b2lkKQoreworCWlmKENJRlNNYXhCdWZTaXplIDwgODE5MikgeworCS8qIEJ1ZmZlciBzaXplIGNhbiBub3QgYmUgc21hbGxlciB0aGFuIDIgKiBQQVRIX01BWCBzaW5jZSBtYXhpbXVtCisJVW5pY29kZSBwYXRoIG5hbWUgaGFzIHRvIGZpdCBpbiBhbnkgU01CL0NJRlMgcGF0aCBiYXNlZCBmcmFtZXMgKi8KKwkJQ0lGU01heEJ1ZlNpemUgPSA4MTkyOworCX0gZWxzZSBpZiAoQ0lGU01heEJ1ZlNpemUgPiAxMDI0KjEyNykgeworCQlDSUZTTWF4QnVmU2l6ZSA9IDEwMjQgKiAxMjc7CisJfSBlbHNlIHsKKwkJQ0lGU01heEJ1ZlNpemUgJj0gMHgxRkUwMDsgLyogUm91bmQgc2l6ZSB0byBldmVuIDUxMiBieXRlIG11bHQqLworCX0KKy8qCWNFUlJPUigxLCgiQ0lGU01heEJ1ZlNpemUgJWQgMHgleCIsQ0lGU01heEJ1ZlNpemUsQ0lGU01heEJ1ZlNpemUpKTsgKi8KKwljaWZzX3JlcV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiY2lmc19yZXF1ZXN0IiwKKwkJCQkJICAgIENJRlNNYXhCdWZTaXplICsKKwkJCQkJICAgIE1BWF9DSUZTX0hEUl9TSVpFLCAwLAorCQkJCQkgICAgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMLCBOVUxMKTsKKwlpZiAoY2lmc19yZXFfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYoY2lmc19taW5fcmN2IDwgMSkKKwkJY2lmc19taW5fcmN2ID0gMTsKKwllbHNlIGlmIChjaWZzX21pbl9yY3YgPiA2NCkgeworCQljaWZzX21pbl9yY3YgPSA2NDsKKwkJY0VSUk9SKDEsKCJjaWZzX21pbl9yY3Ygc2V0IHRvIG1heGltdW0gKDY0KSIpKTsKKwl9CisKKwljaWZzX3JlcV9wb29scCA9IG1lbXBvb2xfY3JlYXRlKGNpZnNfbWluX3JjdiwKKwkJCQkJbWVtcG9vbF9hbGxvY19zbGFiLAorCQkJCQltZW1wb29sX2ZyZWVfc2xhYiwKKwkJCQkJY2lmc19yZXFfY2FjaGVwKTsKKworCWlmKGNpZnNfcmVxX3Bvb2xwID09IE5VTEwpIHsKKwkJa21lbV9jYWNoZV9kZXN0cm95KGNpZnNfcmVxX2NhY2hlcCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiAyNTYgKE1BWF9DSUZTX0hEUl9TSVpFIGJ5dGVzIGlzIGVub3VnaCBmb3IgbW9zdCBTTUIgcmVzcG9uc2VzIGFuZAorCWFsbW9zdCBhbGwgaGFuZGxlIGJhc2VkIHJlcXVlc3RzIChidXQgbm90IHdyaXRlIHJlc3BvbnNlLCBub3IgaXMgaXQKKwlzdWZmaWNpZW50IGZvciBwYXRoIGJhc2VkIHJlcXVlc3RzKS4gIEEgc21hbGxlciBzaXplIHdvdWxkIGhhdmUKKwliZWVuIG1vcmUgZWZmaWNpZW50IChjb21wYWN0aW5nIG11bHRpcGxlIHNsYWIgaXRlbXMgb24gb25lIDRrIHBhZ2UpIAorCWZvciB0aGUgY2FzZSBpbiB3aGljaCBkZWJ1ZyB3YXMgb24sIGJ1dCB0aGlzIGxhcmdlciBzaXplIGFsbG93cworCW1vcmUgU01CcyB0byB1c2Ugc21hbGwgYnVmZmVyIGFsbG9jIGFuZCBpcyBzdGlsbCBtdWNoIG1vcmUKKwllZmZpY2llbnQgdG8gYWxsb2MgMSBwZXIgcGFnZSBvZmYgdGhlIHNsYWIgY29tcGFyZWQgdG8gMTdLICg1cGFnZSkgCisJYWxsb2Mgb2YgbGFyZ2UgY2lmcyBidWZmZXJzIGV2ZW4gd2hlbiBwYWdlIGRlYnVnZ2luZyBpcyBvbiAqLworCWNpZnNfc21fcmVxX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJjaWZzX3NtYWxsX3JxIiwKKwkJCU1BWF9DSUZTX0hEUl9TSVpFLCAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwsIE5VTEwpOworCWlmIChjaWZzX3NtX3JlcV9jYWNoZXAgPT0gTlVMTCkgeworCQltZW1wb29sX2Rlc3Ryb3koY2lmc19yZXFfcG9vbHApOworCQlrbWVtX2NhY2hlX2Rlc3Ryb3koY2lmc19yZXFfY2FjaGVwKTsKKwkJcmV0dXJuIC1FTk9NRU07ICAgICAgICAgICAgICAKKwl9CisKKwlpZihjaWZzX21pbl9zbWFsbCA8IDIpCisJCWNpZnNfbWluX3NtYWxsID0gMjsKKwllbHNlIGlmIChjaWZzX21pbl9zbWFsbCA+IDI1NikgeworCQljaWZzX21pbl9zbWFsbCA9IDI1NjsKKwkJY0ZZSSgxLCgiY2lmc19taW5fc21hbGwgc2V0IHRvIG1heGltdW0gKDI1NikiKSk7CisJfQorCisJY2lmc19zbV9yZXFfcG9vbHAgPSBtZW1wb29sX2NyZWF0ZShjaWZzX21pbl9zbWFsbCwKKwkJCQltZW1wb29sX2FsbG9jX3NsYWIsCisJCQkJbWVtcG9vbF9mcmVlX3NsYWIsCisJCQkJY2lmc19zbV9yZXFfY2FjaGVwKTsKKworCWlmKGNpZnNfc21fcmVxX3Bvb2xwID09IE5VTEwpIHsKKwkJbWVtcG9vbF9kZXN0cm95KGNpZnNfcmVxX3Bvb2xwKTsKKwkJa21lbV9jYWNoZV9kZXN0cm95KGNpZnNfcmVxX2NhY2hlcCk7CisJCWttZW1fY2FjaGVfZGVzdHJveShjaWZzX3NtX3JlcV9jYWNoZXApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2NpZnNfZGVzdHJveV9yZXF1ZXN0X2J1ZnModm9pZCkKK3sKKwltZW1wb29sX2Rlc3Ryb3koY2lmc19yZXFfcG9vbHApOworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koY2lmc19yZXFfY2FjaGVwKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgImNpZnNfZGVzdHJveV9yZXF1ZXN0X2NhY2hlOiBlcnJvciBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7CisJbWVtcG9vbF9kZXN0cm95KGNpZnNfc21fcmVxX3Bvb2xwKTsKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGNpZnNfc21fcmVxX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgImNpZnNfZGVzdHJveV9yZXF1ZXN0X2NhY2hlOiBjaWZzX3NtYWxsX3JxIGZyZWUgZXJyb3JcbiIpOworfQorCitzdGF0aWMgaW50CitjaWZzX2luaXRfbWlkcyh2b2lkKQoreworCWNpZnNfbWlkX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJjaWZzX21weF9pZHMiLAorCQkJCXNpemVvZiAoc3RydWN0IG1pZF9xX2VudHJ5KSwgMCwKKwkJCQlTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwsIE5VTEwpOworCWlmIChjaWZzX21pZF9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljaWZzX21pZF9wb29scCA9IG1lbXBvb2xfY3JlYXRlKDMgLyogYSByZWFzb25hYmxlIG1pbiBzaW11bHRhbiBvcGVycyAqLywKKwkJCQkJbWVtcG9vbF9hbGxvY19zbGFiLAorCQkJCQltZW1wb29sX2ZyZWVfc2xhYiwKKwkJCQkJY2lmc19taWRfY2FjaGVwKTsKKwlpZihjaWZzX21pZF9wb29scCA9PSBOVUxMKSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShjaWZzX21pZF9jYWNoZXApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljaWZzX29wbG9ja19jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiY2lmc19vcGxvY2tfc3RydWN0cyIsCisJCQkJc2l6ZW9mIChzdHJ1Y3Qgb3Bsb2NrX3FfZW50cnkpLCAwLAorCQkJCVNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCwgTlVMTCk7CisJaWYgKGNpZnNfb3Bsb2NrX2NhY2hlcCA9PSBOVUxMKSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShjaWZzX21pZF9jYWNoZXApOworCQltZW1wb29sX2Rlc3Ryb3koY2lmc19taWRfcG9vbHApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2NpZnNfZGVzdHJveV9taWRzKHZvaWQpCit7CisJbWVtcG9vbF9kZXN0cm95KGNpZnNfbWlkX3Bvb2xwKTsKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGNpZnNfbWlkX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJjaWZzX2Rlc3Ryb3lfbWlkczogZXJyb3Igbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworCisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShjaWZzX29wbG9ja19jYWNoZXApKQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiZXJyb3Igbm90IGFsbCBvcGxvY2sgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworc3RhdGljIGludCBjaWZzX29wbG9ja190aHJlYWQodm9pZCAqIGR1bW15YXJnKQoreworCXN0cnVjdCBvcGxvY2tfcV9lbnRyeSAqIG9wbG9ja19pdGVtOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uOworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCV9fdTE2ICBuZXRmaWQ7CisJaW50IHJjOworCisJZGFlbW9uaXplKCJjaWZzb3Bsb2NrZCIpOworCWFsbG93X3NpZ25hbChTSUdURVJNKTsKKworCW9wbG9ja1RocmVhZCA9IGN1cnJlbnQ7CisJZG8geworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkKKwkJc2NoZWR1bGVfdGltZW91dCgxKkhaKTsgIAorCQlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJaWYobGlzdF9lbXB0eSgmR2xvYmFsT3Bsb2NrX1EpKSB7CisJCQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMzkqSFopOworCQl9IGVsc2UgeworCQkJb3Bsb2NrX2l0ZW0gPSBsaXN0X2VudHJ5KEdsb2JhbE9wbG9ja19RLm5leHQsIAorCQkJCXN0cnVjdCBvcGxvY2tfcV9lbnRyeSwgcWhlYWQpOworCQkJaWYob3Bsb2NrX2l0ZW0pIHsKKwkJCQljRllJKDEsKCJmb3VuZCBvcGxvY2sgaXRlbSB0byB3cml0ZSBvdXQiKSk7IAorCQkJCXBUY29uID0gb3Bsb2NrX2l0ZW0tPnRjb247CisJCQkJaW5vZGUgPSBvcGxvY2tfaXRlbS0+cGlub2RlOworCQkJCW5ldGZpZCA9IG9wbG9ja19pdGVtLT5uZXRmaWQ7CisJCQkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJCQlEZWxldGVPcGxvY2tRRW50cnkob3Bsb2NrX2l0ZW0pOworCQkJCS8qIGNhbiBub3QgZ3JhYiBpbm9kZSBzZW0gaGVyZSBzaW5jZSBpdCB3b3VsZAorCQkJCWRlYWRsb2NrIHdoZW4gb3Bsb2NrIHJlY2VpdmVkIG9uIGRlbGV0ZSAKKwkJCQlzaW5jZSB2ZnNfdW5saW5rIGhvbGRzIHRoZSBpX3NlbSBhY3Jvc3MKKwkJCQl0aGUgY2FsbCAqLworCQkJCS8qIGRvd24oJmlub2RlLT5pX3NlbSk7Ki8KKwkJCQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQkJCQlyYyA9IGZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0+aV9tYXBwaW5nKTsKKwkJCQkJaWYoQ0lGU19JKGlub2RlKS0+Y2xpZW50Q2FuQ2FjaGVSZWFkID09IDApIHsKKwkJCQkJCWZpbGVtYXBfZmRhdGF3YWl0KGlub2RlLT5pX21hcHBpbmcpOworCQkJCQkJaW52YWxpZGF0ZV9yZW1vdGVfaW5vZGUoaW5vZGUpOworCQkJCQl9CisJCQkJfSBlbHNlCisJCQkJCXJjID0gMDsKKwkJCQkvKiB1cCgmaW5vZGUtPmlfc2VtKTsqLworCQkJCWlmIChyYykKKwkJCQkJQ0lGU19JKGlub2RlKS0+d3JpdGVfYmVoaW5kX3JjID0gcmM7CisJCQkJY0ZZSSgxLCgiT3Bsb2NrIGZsdXNoIGlub2RlICVwIHJjICVkIixpbm9kZSxyYykpOworCisJCQkJLyogcmVsZWFzaW5nIGEgc3RhbGUgb3Bsb2NrIGFmdGVyIHJlY2VudCByZWNvbm5lY3Rpb24gCisJCQkJb2Ygc21iIHNlc3Npb24gdXNpbmcgYSBub3cgaW5jb3JyZWN0IGZpbGUgCisJCQkJaGFuZGxlIGlzIG5vdCBhIGRhdGEgaW50ZWdyaXR5IGlzc3VlIGJ1dCBkbyAgCisJCQkJbm90IGJvdGhlciBzZW5kaW5nIGFuIG9wbG9jayByZWxlYXNlIGlmIHNlc3Npb24gCisJCQkJdG8gc2VydmVyIHN0aWxsIGlzIGRpc2Nvbm5lY3RlZCBzaW5jZSBvcGxvY2sgCisJCQkJYWxyZWFkeSByZWxlYXNlZCBieSB0aGUgc2VydmVyIGluIHRoYXQgY2FzZSAqLworCQkJCWlmKHBUY29uLT50aWRTdGF0dXMgIT0gQ2lmc05lZWRSZWNvbm5lY3QpIHsKKwkJCQkgICAgcmMgPSBDSUZTU01CTG9jaygwLCBwVGNvbiwgbmV0ZmlkLAorCQkJCQkgICAgMCAvKiBsZW4gKi8gLCAwIC8qIG9mZnNldCAqLywgMCwgCisJCQkJCSAgICAwLCBMT0NLSU5HX0FORFhfT1BMT0NLX1JFTEVBU0UsCisJCQkJCSAgICAwIC8qIHdhaXQgZmxhZyAqLyk7CisJCQkJCWNGWUkoMSwoIk9wbG9jayByZWxlYXNlIHJjID0gJWQgIixyYykpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJCX0KKwl9IHdoaWxlKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7CisJY29tcGxldGVfYW5kX2V4aXQgKCZjaWZzX29wbG9ja19leGl0ZWQsIDApOworfQorCitzdGF0aWMgaW50IF9faW5pdAoraW5pdF9jaWZzKHZvaWQpCit7CisJaW50IHJjID0gMDsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWNpZnNfcHJvY19pbml0KCk7CisjZW5kaWYKKwlJTklUX0xJU1RfSEVBRCgmR2xvYmFsU2VydmVyTGlzdCk7CS8qIEJCIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKwlJTklUX0xJU1RfSEVBRCgmR2xvYmFsU01CU2Vzc2lvbkxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZHbG9iYWxUcmVlQ29ubmVjdGlvbkxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZHbG9iYWxPcGxvY2tfUSk7CisvKgorICogIEluaXRpYWxpemUgR2xvYmFsIGNvdW50ZXJzCisgKi8KKwlhdG9taWNfc2V0KCZzZXNJbmZvQWxsb2NDb3VudCwgMCk7CisJYXRvbWljX3NldCgmdGNvbkluZm9BbGxvY0NvdW50LCAwKTsKKwlhdG9taWNfc2V0KCZ0Y3BTZXNBbGxvY0NvdW50LDApOworCWF0b21pY19zZXQoJnRjcFNlc1JlY29ubmVjdENvdW50LCAwKTsKKwlhdG9taWNfc2V0KCZ0Y29uSW5mb1JlY29ubmVjdENvdW50LCAwKTsKKworCWF0b21pY19zZXQoJmJ1ZkFsbG9jQ291bnQsIDApOworCWF0b21pY19zZXQoJm1pZENvdW50LCAwKTsKKwlHbG9iYWxDdXJyZW50WGlkID0gMDsKKwlHbG9iYWxUb3RhbEFjdGl2ZVhpZCA9IDA7CisJR2xvYmFsTWF4QWN0aXZlWGlkID0gMDsKKwlyd2xvY2tfaW5pdCgmR2xvYmFsU01CU2VzbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJkdsb2JhbE1pZF9Mb2NrKTsKKworCWlmKGNpZnNfbWF4X3BlbmRpbmcgPCAyKSB7CisJCWNpZnNfbWF4X3BlbmRpbmcgPSAyOworCQljRllJKDEsKCJjaWZzX21heF9wZW5kaW5nIHNldCB0byBtaW4gb2YgMiIpKTsKKwl9IGVsc2UgaWYoY2lmc19tYXhfcGVuZGluZyA+IDI1NikgeworCQljaWZzX21heF9wZW5kaW5nID0gMjU2OworCQljRllJKDEsKCJjaWZzX21heF9wZW5kaW5nIHNldCB0byBtYXggb2YgMjU2IikpOworCX0KKworCXJjID0gY2lmc19pbml0X2lub2RlY2FjaGUoKTsKKwlpZiAoIXJjKSB7CisJCXJjID0gY2lmc19pbml0X21pZHMoKTsKKwkJaWYgKCFyYykgeworCQkJcmMgPSBjaWZzX2luaXRfcmVxdWVzdF9idWZzKCk7CisJCQlpZiAoIXJjKSB7CisJCQkJcmMgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZjaWZzX2ZzX3R5cGUpOworCQkJCWlmICghcmMpIHsgICAgICAgICAgICAgICAgCisJCQkJCXJjID0gKGludClrZXJuZWxfdGhyZWFkKGNpZnNfb3Bsb2NrX3RocmVhZCwgTlVMTCwgCisJCQkJCQlDTE9ORV9GUyB8IENMT05FX0ZJTEVTIHwgQ0xPTkVfVk0pOworCQkJCQlpZihyYyA+IDApCisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJZWxzZSAKKwkJCQkJCWNFUlJPUigxLCgiZXJyb3IgJWQgY3JlYXRlIG9wbG9jayB0aHJlYWQiLHJjKSk7CisJCQkJfQorCQkJCWNpZnNfZGVzdHJveV9yZXF1ZXN0X2J1ZnMoKTsKKwkJCX0KKwkJCWNpZnNfZGVzdHJveV9taWRzKCk7CisJCX0KKwkJY2lmc19kZXN0cm95X2lub2RlY2FjaGUoKTsKKwl9CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwljaWZzX3Byb2NfY2xlYW4oKTsKKyNlbmRpZgorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitleGl0X2NpZnModm9pZCkKK3sKKwljRllJKDAsICgiSW4gdW5yZWdpc3RlciBpZSBleGl0X2NpZnMiKSk7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwljaWZzX3Byb2NfY2xlYW4oKTsKKyNlbmRpZgorCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmY2lmc19mc190eXBlKTsKKwljaWZzX2Rlc3Ryb3lfaW5vZGVjYWNoZSgpOworCWNpZnNfZGVzdHJveV9taWRzKCk7CisJY2lmc19kZXN0cm95X3JlcXVlc3RfYnVmcygpOworCWlmKG9wbG9ja1RocmVhZCkgeworCQlzZW5kX3NpZyhTSUdURVJNLCBvcGxvY2tUaHJlYWQsIDEpOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjaWZzX29wbG9ja19leGl0ZWQpOworCX0KK30KKworTU9EVUxFX0FVVEhPUigiU3RldmUgRnJlbmNoIDxzZnJlbmNoQHVzLmlibS5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CQkvKiBjb21iaW5hdGlvbiBvZiBMR1BMICsgR1BMIHNvdXJjZSBiZWhhdmVzIGFzIEdQTCAqLworTU9EVUxFX0RFU0NSSVBUSU9OCisgICAgKCJWRlMgdG8gYWNjZXNzIHNlcnZlcnMgY29tcGx5aW5nIHdpdGggdGhlIFNOSUEgQ0lGUyBTcGVjaWZpY2F0aW9uIGUuZy4gU2FtYmEgYW5kIFdpbmRvd3MiKTsKK01PRFVMRV9WRVJTSU9OKENJRlNfVkVSU0lPTik7Cittb2R1bGVfaW5pdChpbml0X2NpZnMpCittb2R1bGVfZXhpdChleGl0X2NpZnMpCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNmcy5oIGIvZnMvY2lmcy9jaWZzZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTFmMThhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9jaWZzZnMuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogICBmcy9jaWZzL2NpZnNmcy5oCisgKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgIENvcnAuLCAyMDAyCisgKiAgIEF1dGhvcihzKTogU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EgCisgKi8KKworI2lmbmRlZiBfQ0lGU0ZTX0gKKyNkZWZpbmUgX0NJRlNGU19ICisKKyNkZWZpbmUgUk9PVF9JIDIKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgMQorI2VuZGlmCisKK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGNpZnNfYWRkcl9vcHM7CisKKy8qIEZ1bmN0aW9ucyByZWxhdGVkIHRvIHN1cGVyIGJsb2NrIG9wZXJhdGlvbnMgKi8KK2V4dGVybiBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBjaWZzX3N1cGVyX29wczsKK2V4dGVybiB2b2lkIGNpZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gdm9pZCBjaWZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CisvKiBleHRlcm4gdm9pZCBjaWZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsgKi8vKiBCQiBub3QgbmVlZGVkIHlldCAqLworCisvKiBGdW5jdGlvbnMgcmVsYXRlZCB0byBpbm9kZXMgKi8KK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBjaWZzX2Rpcl9pbm9kZV9vcHM7CitleHRlcm4gaW50IGNpZnNfY3JlYXRlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCwgCisJCSAgICAgICBzdHJ1Y3QgbmFtZWlkYXRhICopOworZXh0ZXJuIHN0cnVjdCBkZW50cnkgKiBjaWZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLAorCQkJCSAgc3RydWN0IG5hbWVpZGF0YSAqKTsKK2V4dGVybiBpbnQgY2lmc191bmxpbmsoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKik7CitleHRlcm4gaW50IGNpZnNfaGFyZGxpbmsoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqKTsKK2V4dGVybiBpbnQgY2lmc19ta25vZChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQsIGRldl90KTsKK2V4dGVybiBpbnQgY2lmc19ta2RpcihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOworZXh0ZXJuIGludCBjaWZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICopOworZXh0ZXJuIGludCBjaWZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaW5vZGUgKiwKKwkJICAgICAgIHN0cnVjdCBkZW50cnkgKik7CitleHRlcm4gaW50IGNpZnNfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICopOworZXh0ZXJuIGludCBjaWZzX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICosIHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGtzdGF0ICopOworZXh0ZXJuIGludCBjaWZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaWF0dHIgKik7CisKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBjaWZzX2ZpbGVfaW5vZGVfb3BzOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGNpZnNfc3ltbGlua19pbm9kZV9vcHM7CisKKy8qIEZ1bmN0aW9ucyByZWxhdGVkIHRvIGZpbGVzIGFuZCBkaXJlY3RvcmllcyAqLworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2lmc19maWxlX29wczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNpZnNfZmlsZV9kaXJlY3Rfb3BzOyAvKiBpZiBkaXJlY3RpbyBtb3VudCAqLworZXh0ZXJuIGludCBjaWZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworZXh0ZXJuIGludCBjaWZzX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK2V4dGVybiBpbnQgY2lmc19jbG9zZWRpcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitleHRlcm4gc3NpemVfdCBjaWZzX3VzZXJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnJlYWRfZGF0YSwKKwkJCSBzaXplX3QgcmVhZF9zaXplLCBsb2ZmX3QgKiBwb2Zmc2V0KTsKK2V4dGVybiBzc2l6ZV90IGNpZnNfdXNlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKndyaXRlX2RhdGEsCisJCQkgc2l6ZV90IHdyaXRlX3NpemUsIGxvZmZfdCAqIHBvZmZzZXQpOworZXh0ZXJuIGludCBjaWZzX2xvY2soc3RydWN0IGZpbGUgKiwgaW50LCBzdHJ1Y3QgZmlsZV9sb2NrICopOworZXh0ZXJuIGludCBjaWZzX2ZzeW5jKHN0cnVjdCBmaWxlICosIHN0cnVjdCBkZW50cnkgKiwgaW50KTsKK2V4dGVybiBpbnQgY2lmc19mbHVzaChzdHJ1Y3QgZmlsZSAqKTsKK2V4dGVybiBpbnQgY2lmc19maWxlX21tYXAoc3RydWN0IGZpbGUgKiAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNpZnNfZGlyX29wczsKK2V4dGVybiBpbnQgY2lmc19kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitleHRlcm4gaW50IGNpZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZGlyZW50cnksIGZpbGxkaXJfdCBmaWxsZGlyKTsKK2V4dGVybiBpbnQgY2lmc19kaXJfbm90aWZ5KHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworLyogRnVuY3Rpb25zIHJlbGF0ZWQgdG8gZGlyIGVudHJpZXMgKi8KK2V4dGVybiBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgY2lmc19kZW50cnlfb3BzOworCisvKiBGdW5jdGlvbnMgcmVsYXRlZCB0byBzeW1saW5rcyAqLworZXh0ZXJuIGludCBjaWZzX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRpcmVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CitleHRlcm4gdm9pZCBjaWZzX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRpcmVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CitleHRlcm4gaW50IGNpZnNfcmVhZGxpbmsoc3RydWN0IGRlbnRyeSAqZGlyZW50cnksIGNoYXIgX191c2VyICpidWZmZXIsIAorCQkJIGludCBidWZsZW4pOworZXh0ZXJuIGludCBjaWZzX3N5bWxpbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGlyZW50cnksCisJCQljb25zdCBjaGFyICpzeW1uYW1lKTsKK2V4dGVybiBpbnQJY2lmc19yZW1vdmV4YXR0cihzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gaW50IAljaWZzX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqLCBjb25zdCB2b2lkICosCisJCQkgc2l6ZV90LCBpbnQpOworZXh0ZXJuIHNzaXplX3QJY2lmc19nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCBzaXplX3QpOworZXh0ZXJuIHNzaXplX3QJY2lmc19saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqLCBjaGFyICosIHNpemVfdCk7CisjZGVmaW5lIENJRlNfVkVSU0lPTiAgICIxLjMxIgorI2VuZGlmCQkJCS8qIF9DSUZTRlNfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZ2xvYi5oIGIvZnMvY2lmcy9jaWZzZ2xvYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YWZmMWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9jaWZzZ2xvYi5oCkBAIC0wLDAgKzEsNDM5IEBACisvKgorICogICBmcy9jaWZzL2NpZnNnbG9iLmgKKyAqCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDIsMjAwMworICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgImNpZnNfZnNfc2IuaCIKKy8qCisgKiBUaGUgc2l6ZXMgb2YgdmFyaW91cyBpbnRlcm5hbCB0YWJsZXMgYW5kIHN0cmluZ3MKKyAqLworI2RlZmluZSBNQVhfVUlEX0lORk8gMTYKKyNkZWZpbmUgTUFYX1NFU19JTkZPIDIKKyNkZWZpbmUgTUFYX1RDT05fSU5GTyA0CisKKyNkZWZpbmUgTUFYX1RSRUVfU0laRSAyICsgTUFYX1NFUlZFUl9TSVpFICsgMSArIE1BWF9TSEFSRV9TSVpFICsgMQorI2RlZmluZSBNQVhfU0VSVkVSX1NJWkUgMTUKKyNkZWZpbmUgTUFYX1NIQVJFX1NJWkUgIDY0CS8qIHVzZWQgdG8gYmUgMjAgLSB0aGlzIHNob3VsZCBzdGlsbCBiZSBlbm91Z2ggKi8KKyNkZWZpbmUgTUFYX1VTRVJOQU1FX1NJWkUgMzIJLyogMzIgaXMgdG8gYWxsb3cgZm9yIDE1IGNoYXIgbmFtZXMgKyBudWxsCisJCQkJICAgdGVybWluYXRpb24gdGhlbiAqMiBmb3IgdW5pY29kZSB2ZXJzaW9ucyAqLworI2RlZmluZSBNQVhfUEFTU1dPUkRfU0laRSAxNgorCisjZGVmaW5lIENJRlNfTUlOX1JDVl9QT09MIDQKKworLyoKKyAqIE1BWF9SRVEgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIHRoYXQgV0Ugd2lsbCBzZW5kCisgKiBvbiBvbmUgc29ja2V0IGNvbmN1cmVudGx5LiBJdCBhbHNvIG1hdGNoZXMgdGhlIG1vc3QgY29tbW9uCisgKiB2YWx1ZSBvZiBtYXggbXVsdGlwbGV4IHJldHVybmVkIGJ5IHNlcnZlcnMuICBXZSBtYXkgCisgKiBldmVudHVhbGx5IHdhbnQgdG8gdXNlIHRoZSBuZWdvdGlhdGVkIHZhbHVlIChpbiBjYXNlCisgKiBmdXR1cmUgc2VydmVycyBjYW4gaGFuZGxlIG1vcmUpIHdoZW4gd2UgYXJlIG1vcmUgY29uZmlkZW50IHRoYXQKKyAqIHdlIHdpbGwgbm90IGhhdmUgcHJvYmxlbXMgb3ZlbG9hZGluZyB0aGUgc29ja2V0IHdpdGggcGVuZGluZworICogd3JpdGUgZGF0YS4KKyAqLworI2RlZmluZSBDSUZTX01BWF9SRVEgNTAgCisKKyNkZWZpbmUgU0VSVkVSX05BTUVfTEVOR1RIIDE1CisjZGVmaW5lIFNFUlZFUl9OQU1FX0xFTl9XSVRIX05VTEwgICAgIChTRVJWRVJfTkFNRV9MRU5HVEggKyAxKQorCisvKiB1c2VkIHRvIGRlZmluZSBzdHJpbmcgbGVuZ3RocyBmb3IgcmV2ZXJzaW5nIHVuaWNvZGUgc3RyaW5ncyAqLworLyogICAgICAgICAoMjU2KzEpKjIgPSA1MTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAobWF4IHBhdGggbGVuZ3RoICsgMSBmb3IgbnVsbCkgKiAyIGZvciB1bmljb2RlICAgICovCisjZGVmaW5lIE1BWF9OQU1FIDUxNAorCisjaW5jbHVkZSAiY2lmc3BkdS5oIgorCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAxCisjZW5kaWYKKworI2lmbmRlZiBYQVRUUl9ET1NfQVRUUklCCisjZGVmaW5lIFhBVFRSX0RPU19BVFRSSUIgInVzZXIuRE9TQVRUUklCIgorI2VuZGlmCisKKy8qCisgKiBUaGlzIGluZm9ybWF0aW9uIGlzIGtlcHQgb24gZXZlcnkgU2VydmVyIHdlIGtub3cgYWJvdXQuCisgKgorICogU29tZSB0aGluZ3MgdG8gbm90ZToKKyAqCisgKi8KKyNkZWZpbmUgU0VSVkVSX05BTUVfTEVOX1dJVEhfTlVMTAkoU0VSVkVSX05BTUVfTEVOR1RIICsgMSkKKworLyoKKyAqIENJRlMgdmZzIGNsaWVudCBTdGF0dXMgaW5mb3JtYXRpb24gKGJhc2VkIG9uIHdoYXQgd2Uga25vdy4pCisgKi8KKworIC8qIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHRjcCBhbmQgc21iIHNlc3Npb24gKi8KK2VudW0gc3RhdHVzRW51bSB7CisJQ2lmc05ldyA9IDAsCisJQ2lmc0dvb2QsCisJQ2lmc0V4aXRpbmcsCisJQ2lmc05lZWRSZWNvbm5lY3QKK307CisKK2VudW0gc2VjdXJpdHlFbnVtIHsKKwlOVExNID0gMCwJCS8qIExlZ2FjeSBOVExNMDEyIGF1dGggd2l0aCBOVExNIGhhc2ggKi8KKwlOVExNdjIsCQkJLyogTGVnYWN5IE5UTE0gYXV0aCB3aXRoIE5UTE12MiBoYXNoICovCisJUmF3TlRMTVNTUCwJCS8qIE5UTE1TU1Agd2l0aG91dCBTUE5FR08gKi8KKwlOVExNU1NQLAkJLyogTlRMTVNTUCB2aWEgU1BORUdPICovCisJS2VyYmVyb3MJCS8qIEtlcmJlcm9zIHZpYSBTUE5FR08gKi8KK307CisKK2VudW0gcHJvdG9jb2xFbnVtIHsKKwlJUFY0ID0gMCwKKwlJUFY2LAorCVNDVFAKKwkvKiBOZXRiaW9zIGZyYW1lcyBwcm90b2NvbCBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZSAqLworfTsKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXhjZXB0IHRoZSBDSUZTIFBEVXMgdGhlbXNlbHZlcyBhbGwgdGhlCisgKiBnbG9iYWxseSBpbnRlcmVzdGluZyBzdHJ1Y3RzIHNob3VsZCBnbyBoZXJlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvIHsKKwljaGFyIHNlcnZlcl9OYW1lW1NFUlZFUl9OQU1FX0xFTl9XSVRIX05VTExdOwkvKiAxNSBjaGFycyArIFgnMjAnaW4gMTZ0aCAqLworCWNoYXIgdW5pY29kZV9zZXJ2ZXJfTmFtZVtTRVJWRVJfTkFNRV9MRU5fV0lUSF9OVUxMICogMl07CS8qIFVuaWNvZGUgdmVyc2lvbiBvZiBzZXJ2ZXJfTmFtZSAqLworCXN0cnVjdCBzb2NrZXQgKnNzb2NrZXQ7CisJdW5pb24geworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja0FkZHI7CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgc29ja0FkZHI2OworCX0gYWRkcjsKKwl3YWl0X3F1ZXVlX2hlYWRfdCByZXNwb25zZV9xOyAKKwl3YWl0X3F1ZXVlX2hlYWRfdCByZXF1ZXN0X3E7IC8qIGlmIG1vcmUgdGhhbiBtYXhtcHggdG8gc3J2ciBtdXN0IGJsb2NrKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHBlbmRpbmdfbWlkX3E7CisJdm9pZCAqU2VydmVyX05sc0luZm87CS8qIEJCIC0gcGxhY2Vob2xkZXIgZm9yIGZ1dHVyZSBOTFMgaW5mbyAgKi8KKwl1bnNpZ25lZCBzaG9ydCBzZXJ2ZXJfY29kZXBhZ2U7CS8qIGNvZGVwYWdlIGZvciB0aGUgc2VydmVyICAgICovCisJdW5zaWduZWQgbG9uZyBpcF9hZGRyZXNzOwkvKiBJUCBhZGRyIGZvciB0aGUgc2VydmVyIGlmIGtub3duICAgICAqLworCWVudW0gcHJvdG9jb2xFbnVtIHByb3RvY29sVHlwZTsJCisJY2hhciB2ZXJzaW9uTWFqb3I7CisJY2hhciB2ZXJzaW9uTWlub3I7CisJdW5zaWduZWQgc3Zsb2NhbDoxOwkvKiBsb2NhbCBzZXJ2ZXIgb3IgcmVtb3RlICovCisJYXRvbWljX3Qgc29ja2V0VXNlQ291bnQ7IC8qIG51bWJlciBvZiBvcGVuIGNpZnMgc2Vzc2lvbnMgb24gc29ja2V0ICovCisJYXRvbWljX3QgaW5GbGlnaHQ7ICAvKiBudW1iZXIgb2YgcmVxdWVzdHMgb24gdGhlIHdpcmUgdG8gc2VydmVyICovCisJZW51bSBzdGF0dXNFbnVtIHRjcFN0YXR1czsgLyogd2hhdCB3ZSB0aGluayB0aGUgc3RhdHVzIGlzICovCisJc3RydWN0IHNlbWFwaG9yZSB0Y3BTZW07CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisJY2hhciBzZXJ2ZXJfR1VJRFsxNl07CisJY2hhciBzZWNNb2RlOworCWVudW0gc2VjdXJpdHlFbnVtIHNlY1R5cGU7CisJdW5zaWduZWQgaW50IG1heFJlcTsJLyogQ2xpZW50cyBzaG91bGQgc3VibWl0IG5vIG1vcmUgKi8KKwkvKiB0aGFuIG1heFJlcSBkaXN0aW5jdCB1bmFuc3dlcmVkIFNNQnMgdG8gdGhlIHNlcnZlciB3aGVuIHVzaW5nICAqLworCS8qIG11bHRpcGxleGVkIHJlYWRzIG9yIHdyaXRlcyAqLworCXVuc2lnbmVkIGludCBtYXhCdWY7CS8qIG1heEJ1ZiBzcGVjaWZpZXMgdGhlIG1heGltdW0gKi8KKwkvKiBtZXNzYWdlIHNpemUgdGhlIHNlcnZlciBjYW4gc2VuZCBvciByZWNlaXZlIGZvciBub24tcmF3IFNNQnMgKi8KKwl1bnNpZ25lZCBpbnQgbWF4Unc7CS8qIG1heFJ3IHNwZWNpZmllcyB0aGUgbWF4aW11bSAqLworCS8qIG1lc3NhZ2Ugc2l6ZSB0aGUgc2VydmVyIGNhbiBzZW5kIG9yIHJlY2VpdmUgZm9yICovCisJLyogU01CX0NPTV9XUklURV9SQVcgb3IgU01CX0NPTV9SRUFEX1JBVy4gKi8KKwljaGFyIHNlc3NpZFs0XTsJCS8qIHVuaXF1ZSB0b2tlbiBpZCBmb3IgdGhpcyBzZXNzaW9uICovCisJLyogKHJldHVybmVkIG9uIE5lZ290aWF0ZSAqLworCWludCBjYXBhYmlsaXRpZXM7IC8qIGFsbG93IHNlbGVjdGl2ZSBkaXNhYmxpbmcgb2YgY2FwcyBieSBzbWIgc2VzcyAqLworCV9fdTE2IHRpbWVab25lOworCWNoYXIgY3J5cHRLZXlbQ0lGU19DUllQVE9fS0VZX1NJWkVdOworCWNoYXIgd29ya3N0YXRpb25fUkZDMTAwMV9uYW1lWzE2XTsgLyogMTZ0aCBieXRlIGlzIGFsd2F5cyB6ZXJvICovCit9OworCisvKgorICogVGhlIGZvbGxvd2luZyBpcyBvdXIgc2hvcnRjdXQgdG8gdXNlciBpbmZvcm1hdGlvbi4gIFdlIHN1cmZhY2UgdGhlIHVpZCwKKyAqIGFuZCBuYW1lLiBXZSBhbHdheXMgZ2V0IHRoZSBwYXNzd29yZCBvbiB0aGUgZmx5IGluIGNhc2UgaXQKKyAqIGhhcyBjaGFuZ2VkLiBXZSBhbHNvIGhhbmcgYSBsaXN0IG9mIHNlc3Npb25zIG93bmVkIGJ5IHRoaXMgdXNlciBvZmYgaGVyZS4gCisgKi8KK3N0cnVjdCBjaWZzVWlkSW5mbyB7CisJc3RydWN0IGxpc3RfaGVhZCB1c2VyTGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHNlc3Npb25MaXN0OyAvKiBTTUIgc2Vzc2lvbnMgZm9yIHRoaXMgdXNlciAqLworCXVpZF90IGxpbnV4X3VpZDsKKwljaGFyIHVzZXJbTUFYX1VTRVJOQU1FX1NJWkUgKyAxXTsJLyogYXNjaWkgbmFtZSBvZiB1c2VyICovCisJLyogQkIgbWF5IG5lZWQgcHRyIG9yIGNhbGxiYWNrIGZvciBQQU0gb3IgV2luQmluZCBpbmZvICovCit9OworCisvKgorICogU2Vzc2lvbiBzdHJ1Y3R1cmUuICBPbmUgb2YgdGhlc2UgZm9yIGVhY2ggdWlkIHNlc3Npb24gd2l0aCBhIHBhcnRpY3VsYXIgaG9zdAorICovCitzdHJ1Y3QgY2lmc1Nlc0luZm8geworCXN0cnVjdCBsaXN0X2hlYWQgY2lmc1Nlc3Npb25MaXN0OworCXN0cnVjdCBzZW1hcGhvcmUgc2VzU2VtOworCXN0cnVjdCBjaWZzVWlkSW5mbyAqdWlkSW5mbzsJLyogcG9pbnRlciB0byB1c2VyIGluZm8gKi8KKwlzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXI7CS8qIHBvaW50ZXIgdG8gc2VydmVyIGluZm8gKi8KKwlhdG9taWNfdCBpblVzZTsgLyogIyBvZiBtb3VudHMgKHRyZWUgY29ubmVjdGlvbnMpIG9uIHRoaXMgc2VzICovCisJZW51bSBzdGF0dXNFbnVtIHN0YXR1czsKKwlfX3UzMiBzZXF1ZW5jZV9udW1iZXI7ICAvKiBuZWVkZWQgZm9yIENJRlMgUERVIHNpZ25hdHVyZSAqLworCV9fdTE2IGlwY190aWQ7CQkvKiBzcGVjaWFsIHRpZCBmb3IgY29ubmVjdGlvbiB0byBJUEMgc2hhcmUgKi8KKwlfX3UxNiBmbGFnczsKKwljaGFyIG1hY19zaWduaW5nX2tleVtDSUZTX1NFU1NJT05fS0VZX1NJWkUgKyAxNl07CQorCWNoYXIgKnNlcnZlck9TOwkJLyogbmFtZSBvZiBvcGVyYXRpbmcgc3lzdGVtIHVuZGVybHlpbmcgdGhlIHNlcnZlciAqLworCWNoYXIgKnNlcnZlck5PUzsJLyogbmFtZSBvZiBuZXR3b3JrIG9wZXJhdGluZyBzeXN0ZW0gdGhhdCB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgKi8KKwljaGFyICpzZXJ2ZXJEb21haW47CS8qIHNlY3VyaXR5IHJlYWxtIG9mIHNlcnZlciAqLworCWludCBTdWlkOwkJLyogcmVtb3RlIHNtYiB1aWQgICovCisJdWlkX3QgbGludXhfdWlkOyAgICAgICAgLyogbG9jYWwgTGludXggdWlkICovCisJaW50IGNhcGFiaWxpdGllczsKKwljaGFyIHNlcnZlck5hbWVbU0VSVkVSX05BTUVfTEVOX1dJVEhfTlVMTCAqIDJdOwkvKiBCQiBtYWtlIGJpZ2dlciBmb3IgdGNwIG5hbWVzIC0gd2lsbCBpcHY2IGFuZCBzY3RwIGFkZHJlc3NlcyBmaXQgaGVyZT8/ICovCisJY2hhciB1c2VyTmFtZVtNQVhfVVNFUk5BTUVfU0laRSArIDFdOworCWNoYXIgZG9tYWluTmFtZVtNQVhfVVNFUk5BTUVfU0laRSArIDFdOworCWNoYXIgKiBwYXNzd29yZDsKK307CisvKiBzZXNzaW9uIGZsYWdzICovCisjZGVmaW5lIENJRlNfU0VTX05UNCAxCisKKy8qCisgKiB0aGVyZSBpcyBvbmUgb2YgdGhlc2UgZm9yIGVhY2ggY29ubmVjdGlvbiB0byBhIHJlc291cmNlIG9uIGEgcGFydGljdWxhcgorICogc2Vzc2lvbiAKKyAqLworc3RydWN0IGNpZnNUY29uSW5mbyB7CisJc3RydWN0IGxpc3RfaGVhZCBjaWZzQ29ubmVjdGlvbkxpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBvcGVuRmlsZUxpc3Q7CisJc3RydWN0IHNlbWFwaG9yZSB0Y29uU2VtOworCXN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzOwkvKiBwb2ludGVyIHRvIHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoICovCisJY2hhciB0cmVlTmFtZVtNQVhfVFJFRV9TSVpFICsgMV07IC8qIFVOQyBuYW1lIG9mIHJlc291cmNlIChpbiBBU0NJSSBub3QgVVRGKSAqLworCWNoYXIgKm5hdGl2ZUZpbGVTeXN0ZW07CisJX191MTYgdGlkOwkJLyogVGhlIDIgYnl0ZSB0cmVlIGlkICovCisJX191MTYgRmxhZ3M7CQkvKiBvcHRpb25hbCBzdXBwb3J0IGJpdHMgKi8KKwllbnVtIHN0YXR1c0VudW0gdGlkU3RhdHVzOworCWF0b21pY190IHVzZUNvdW50OwkvKiBob3cgbWFueSBtb3VudHMgKGV4cGxpY2l0IG9yIGltcGxpY2l0KSB0byB0aGlzIHNoYXJlICovCisjaWZkZWYgQ09ORklHX0NJRlNfU1RBVFMKKwlhdG9taWNfdCBudW1fc21ic19zZW50OworCWF0b21pY190IG51bV93cml0ZXM7CisJYXRvbWljX3QgbnVtX3JlYWRzOworCWF0b21pY190IG51bV9vcGxvY2tfYnJrczsKKwlhdG9taWNfdCBudW1fb3BlbnM7CisJYXRvbWljX3QgbnVtX2RlbGV0ZXM7CisJYXRvbWljX3QgbnVtX21rZGlyczsKKwlhdG9taWNfdCBudW1fcm1kaXJzOworCWF0b21pY190IG51bV9yZW5hbWVzOworCWF0b21pY190IG51bV90MnJlbmFtZXM7CisJX191NjQgICAgYnl0ZXNfcmVhZDsKKwlfX3U2NCAgICBieXRlc193cml0dGVuOworCXNwaW5sb2NrX3Qgc3RhdF9sb2NrOworI2VuZGlmCisJRklMRV9TWVNURU1fREVWSUNFX0lORk8gZnNEZXZJbmZvOworCUZJTEVfU1lTVEVNX0FUVFJJQlVURV9JTkZPIGZzQXR0ckluZm87CS8qIG9rIGlmIGZpbGUgc3lzdGVtIG5hbWUgdHJ1bmNhdGVkICovCisJRklMRV9TWVNURU1fVU5JWF9JTkZPIGZzVW5peEluZm87CisJdW5zaWduZWQgcmV0cnk6MTsKKwkvKiBCQiBhZGQgZmllbGQgZm9yIGJhY2sgcG9pbnRlciB0byBzYiBzdHJ1Y3Q/ICovCit9OworCisvKgorICogVGhpcyBpbmZvIGhhbmdzIG9mZiB0aGUgY2lmc0ZpbGVJbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMgdXNlZCB0byB0cmFjaworICogYnl0ZSBzdHJlYW0gbG9ja3Mgb24gdGhlIGZpbGUKKyAqLworc3RydWN0IGNpZnNMb2NrSW5mbyB7CisJc3RydWN0IGNpZnNMb2NrSW5mbyAqbmV4dDsKKwlpbnQgc3RhcnQ7CisJaW50IGxlbmd0aDsKKwlpbnQgdHlwZTsKK307CisKKy8qCisgKiBPbmUgb2YgdGhlc2UgZm9yIGVhY2ggb3BlbiBpbnN0YW5jZSBvZiBhIGZpbGUKKyAqLworc3RydWN0IGNpZnNfc2VhcmNoX2luZm8geworCWxvZmZfdCBpbmRleF9vZl9sYXN0X2VudHJ5OworCV9fdTE2IGVudHJpZXNfaW5fYnVmZmVyOworCV9fdTE2IGluZm9fbGV2ZWw7CisJX191MzIgcmVzdW1lX2tleTsKKwljaGFyICogbnR3cmtfYnVmX3N0YXJ0OworCWNoYXIgKiBzcmNoX2VudHJpZXNfc3RhcnQ7CisJY2hhciAqIHByZXN1bWVfbmFtZTsKKwl1bnNpZ25lZCBpbnQgcmVzdW1lX25hbWVfbGVuOworCXVuc2lnbmVkIGVuZE9mU2VhcmNoOjE7CisJdW5zaWduZWQgZW1wdHlEaXI6MTsKKwl1bnNpZ25lZCB1bmljb2RlOjE7Cit9OworCitzdHJ1Y3QgY2lmc0ZpbGVJbmZvIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRsaXN0OwkvKiBwb2ludGVyIHRvIG5leHQgZmlkIG93bmVkIGJ5IHRjb24gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGZsaXN0OwkvKiBuZXh0IGZpZCAoZmlsZSBpbnN0YW5jZSkgZm9yIHRoaXMgaW5vZGUgKi8KKwl1bnNpZ25lZCBpbnQgdWlkOwkvKiBhbGxvd3MgZmluZGluZyB3aGljaCBGaWxlSW5mbyBzdHJ1Y3R1cmUgKi8KKwlfX3UzMiBwaWQ7CQkvKiBwcm9jZXNzIGlkIHdobyBvcGVuZWQgZmlsZSAqLworCV9fdTE2IG5ldGZpZDsJCS8qIGZpbGUgaWQgZnJvbSByZW1vdGUgKi8KKwkvKiBCQiBhZGQgbG9jayBzY29wZSBpbmZvIGhlcmUgaWYgbmVlZGVkICovIDsKKwkvKiBsb2NrIHNjb3BlIGlkICgwIGlmIG5vbmUpICovCisJc3RydWN0IGZpbGUgKiBwZmlsZTsgLyogbmVlZGVkIGZvciB3cml0ZXBhZ2UgKi8KKwlzdHJ1Y3QgaW5vZGUgKiBwSW5vZGU7IC8qIG5lZWRlZCBmb3Igb3Bsb2NrIGJyZWFrICovCisJdW5zaWduZWQgY2xvc2VQZW5kOjE7CS8qIGZpbGUgaXMgbWFya2VkIHRvIGNsb3NlICovCisJdW5zaWduZWQgaW52YWxpZEhhbmRsZToxOyAgLyogZmlsZSBjbG9zZWQgdmlhIHNlc3Npb24gYWJlbmQgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIGZoX3NlbTsgLyogcHJldmVudHMgcmVvcGVuIHJhY2UgYWZ0ZXIgZGVhZCBzZXMqLworCWNoYXIgKiBzZWFyY2hfcmVzdW1lX25hbWU7IC8qIEJCIHJlbW92ZW1lIEJCICovCisJdW5zaWduZWQgaW50IHJlc3VtZV9uYW1lX2xlbmd0aDsgLyogQkIgcmVtb3ZlbWUgLSBmaWVsZCByZW5hbWVkIGFuZCBtb3ZlZCBCQiAqLworCXN0cnVjdCBjaWZzX3NlYXJjaF9pbmZvIHNyY2hfaW5mOworfTsKKworLyoKKyAqIE9uZSBvZiB0aGVzZSBmb3IgZWFjaCBmaWxlIGlub2RlCisgKi8KKworc3RydWN0IGNpZnNJbm9kZUluZm8geworCXN0cnVjdCBsaXN0X2hlYWQgbG9ja0xpc3Q7CisJLyogQkIgYWRkIGluIGxpc3RzIGZvciBkaXJ0eSBwYWdlcyAtIGkuZS4gd3JpdGUgY2FjaGluZyBpbmZvIGZvciBvcGxvY2sgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG9wZW5GaWxlTGlzdDsKKwlpbnQgd3JpdGVfYmVoaW5kX3JjOworCV9fdTMyIGNpZnNBdHRyczsgLyogZS5nLiBET1MgYXJjaGl2ZSBiaXQsIHNwYXJzZSwgY29tcHJlc3NlZCwgc3lzdGVtICovCisJYXRvbWljX3QgaW5Vc2U7CSAvKiBudW0gY29uY3VycmVudCB1c2VycyAobG9jYWwgb3BlbmVycyBjaWZzKSBvZiBmaWxlKi8KKwl1bnNpZ25lZCBsb25nIHRpbWU7CS8qIGppZmZpZXMgb2YgbGFzdCB1cGRhdGUvY2hlY2sgb2YgaW5vZGUgKi8KKwl1bnNpZ25lZCBjbGllbnRDYW5DYWNoZVJlYWQ6MTsgLyogcmVhZCBvcGxvY2sgKi8KKwl1bnNpZ25lZCBjbGllbnRDYW5DYWNoZUFsbDoxOyAgLyogcmVhZCBhbmQgd3JpdGViZWhpbmQgb3Bsb2NrICovCisJdW5zaWduZWQgb3Bsb2NrUGVuZGluZzoxOworCXN0cnVjdCBpbm9kZSB2ZnNfaW5vZGU7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjaWZzSW5vZGVJbmZvICoKK0NJRlNfSShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBjb250YWluZXJfb2YoaW5vZGUsIHN0cnVjdCBjaWZzSW5vZGVJbmZvLCB2ZnNfaW5vZGUpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjaWZzX3NiX2luZm8gKgorQ0lGU19TQihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiBzYi0+c19mc19pbmZvOworfQorCisKKy8qIG9uZSBvZiB0aGVzZSBmb3IgZXZlcnkgcGVuZGluZyBDSUZTIHJlcXVlc3QgdG8gdGhlIHNlcnZlciAqLworc3RydWN0IG1pZF9xX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHFoZWFkOwkvKiBtaWRzIHdhaXRpbmcgb24gcmVwbHkgZnJvbSB0aGlzIHNlcnZlciAqLworCV9fdTE2IG1pZDsJCS8qIG11bHRpcGxleCBpZCAqLworCV9fdTE2IHBpZDsJCS8qIHByb2Nlc3MgaWQgKi8KKwlfX3UzMiBzZXF1ZW5jZV9udW1iZXI7ICAvKiBmb3IgQ0lGUyBzaWduaW5nICovCisJX191MTYgY29tbWFuZDsJCS8qIHNtYiBjb21tYW5kIGNvZGUgKi8KKwlzdHJ1Y3QgdGltZXZhbCB3aGVuX3NlbnQ7CS8qIHRpbWUgd2hlbiBzbWIgc2VudCAqLworCXN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzOwkvKiBzbWIgd2FzIHNlbnQgdG8gdGhpcyBzZXJ2ZXIgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsJLyogdGFzayB3YWl0aW5nIGZvciByZXNwb25zZSAqLworCXN0cnVjdCBzbWJfaGRyICpyZXNwX2J1ZjsJLyogcmVzcG9uc2UgYnVmZmVyICovCisJaW50IG1pZFN0YXRlOwkvKiB3aXNoIHRoaXMgd2VyZSBlbnVtIGJ1dCBjYW4gbm90IHBhc3MgdG8gd2FpdF9ldmVudCAqLworfTsKKworc3RydWN0IG9wbG9ja19xX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHFoZWFkOworCXN0cnVjdCBpbm9kZSAqIHBpbm9kZTsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICogdGNvbjsgCisJX191MTYgbmV0ZmlkOworfTsKKworI2RlZmluZSAgIE1JRF9GUkVFIDAKKyNkZWZpbmUgICBNSURfUkVRVUVTVF9BTExPQ0FURUQgMQorI2RlZmluZSAgIE1JRF9SRVFVRVNUX1NVQk1JVFRFRCAyCisjZGVmaW5lICAgTUlEX1JFU1BPTlNFX1JFQ0VJVkVEIDQKKyNkZWZpbmUgICBNSURfUkVUUllfTkVFREVEICAgICAgOCAvKiBzZXNzaW9uIGNsb3NlZCB3aGlsZSB0aGlzIHJlcXVlc3Qgb3V0ICovCisjZGVmaW5lICAgTUlEX05PX1JFU1BfTkVFREVEIDB4MTAKKyNkZWZpbmUgICBNSURfU01BTExfQlVGRkVSICAgMHgyMCAvKiAxMTIgYnl0ZSByZXNwb25zZSBidWZmZXIgaW5zdGVhZCBvZiA0SyAqLworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBbGwgY29uc3RhbnRzIGdvIGhlcmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNkZWZpbmUgVUlEX0hBU0ggKDE2KQorCisvKgorICogTm90ZSB0aGF0IE9ORSBtb2R1bGUgc2hvdWxkIGRlZmluZSBfREVDTEFSRV9HTE9CQUxTX0hFUkUgdG8gY2F1c2UgdGhlCisgKiBmb2xsb3dpbmcgdG8gYmUgZGVjbGFyZWQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBMb2NraW5nIG5vdGVzLiAgQWxsIHVwZGF0ZXMgdG8gZ2xvYmFsIHZhcmlhYmxlcyBhbmQgbGlzdHMgc2hvdWxkIGJlCisgKiAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBieSBzcGlubG9ja3Mgb3Igc2VtYXBob3Jlcy4KKyAqCisgKiAgU3BpbmxvY2tzCisgKiAgLS0tLS0tLS0tCisgKiAgR2xvYmFsTWlkX0xvY2sgcHJvdGVjdHM6CisgKglsaXN0IG9wZXJhdGlvbnMgb24gcGVuZGluZ19taWRfcSBhbmQgb3Bsb2NrUQorICogICAgICB1cGRhdGVzIHRvIFhJRCBjb3VudGVycywgbXVsdGlwbGV4IGlkICBhbmQgU01CIHNlcXVlbmNlIG51bWJlcnMKKyAqICBHbG9iYWxTTUJTZXNMb2NrIHByb3RlY3RzOgorICoJbGlzdCBvcGVyYXRpb25zIG9uIHRjcCBhbmQgU01CIHNlc3Npb24gbGlzdHMgYW5kIHRDb24gbGlzdHMKKyAqICBmX293bmVyLmxvY2sgcHJvdGVjdHMgY2VydGFpbiBwZXIgZmlsZSBzdHJ1Y3Qgb3BlcmF0aW9ucworICogIG1hcHBpbmctPnBhZ2VfbG9jayBwcm90ZWN0cyBjZXJ0YWluIHBlciBwYWdlIG9wZXJhdGlvbnMKKyAqCisgKiAgU2VtYXBob3JlcworICogIC0tLS0tLS0tLS0KKyAqICBzZXNTZW0gICAgIG9wZXJhdGlvbnMgb24gc21iIHNlc3Npb24KKyAqICB0Y29uU2VtICAgIG9wZXJhdGlvbnMgb24gdHJlZSBjb25uZWN0aW9uCisgKiAgZmhfc2VtICAgICAgZmlsZSBoYW5kbGUgcmVjb25uZWN0aW9uIG9wZXJhdGlvbnMgCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBERUNMQVJFX0dMT0JBTFNfSEVSRQorI2RlZmluZSBHTE9CQUxfRVhURVJOCisjZWxzZQorI2RlZmluZSBHTE9CQUxfRVhURVJOIGV4dGVybgorI2VuZGlmCisKKy8qCisgKiBUaGUgbGlzdCBvZiBzZXJ2ZXJzIHRoYXQgZGlkIG5vdCByZXNwb25kIHdpdGggTlQgTE0gMC4xMi4KKyAqIFRoaXMgbGlzdCBoZWxwcyBpbXByb3ZlIHBlcmZvcm1hbmNlIGFuZCBlbGltaW5hdGUgdGhlIG1lc3NhZ2VzIGluZGljYXRpbmcKKyAqIHRoYXQgd2UgaGFkIGEgY29tbXVuaWNhdGlvbnMgZXJyb3IgdGFsa2luZyB0byB0aGUgc2VydmVyIGluIHRoaXMgbGlzdC4gCisgKi8KK0dMT0JBTF9FWFRFUk4gc3RydWN0IHNlcnZlcnNfbm90X3N1cHBvcnRlZCAqTm90U3VwcExpc3Q7CS8qQHo0YSAqLworCisvKgorICogVGhlIGZvbGxvd2luZyBpcyBhIGhhc2ggdGFibGUgb2YgYWxsIHRoZSB1c2VycyB3ZSBrbm93IGFib3V0LgorICovCitHTE9CQUxfRVhURVJOIHN0cnVjdCBzbWJVaWRJbmZvICpHbG9iYWxVaWRMaXN0W1VJRF9IQVNIXTsKKworR0xPQkFMX0VYVEVSTiBzdHJ1Y3QgbGlzdF9oZWFkIEdsb2JhbFNlcnZlckxpc3Q7IC8qIEJCIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KK0dMT0JBTF9FWFRFUk4gc3RydWN0IGxpc3RfaGVhZCBHbG9iYWxTTUJTZXNzaW9uTGlzdDsKK0dMT0JBTF9FWFRFUk4gc3RydWN0IGxpc3RfaGVhZCBHbG9iYWxUcmVlQ29ubmVjdGlvbkxpc3Q7CitHTE9CQUxfRVhURVJOIHJ3bG9ja190IEdsb2JhbFNNQlNlc2xvY2s7ICAvKiBwcm90ZWN0cyBsaXN0IGluc2VydHMgb24gMyBhYm92ZSAqLworCitHTE9CQUxfRVhURVJOIHN0cnVjdCBsaXN0X2hlYWQgR2xvYmFsT3Bsb2NrX1E7CisKKy8qCisgKiBHbG9iYWwgdHJhbnNhY3Rpb24gaWQgKFhJRCkgaW5mb3JtYXRpb24KKyAqLworR0xPQkFMX0VYVEVSTiB1bnNpZ25lZCBpbnQgR2xvYmFsQ3VycmVudFhpZDsJLyogcHJvdGVjdGVkIGJ5IEdsb2JhbE1pZF9TZW0gKi8KK0dMT0JBTF9FWFRFUk4gdW5zaWduZWQgaW50IEdsb2JhbFRvdGFsQWN0aXZlWGlkOwkvKiBwcm90IGJ5IEdsb2JhbE1pZF9TZW0gKi8KK0dMT0JBTF9FWFRFUk4gdW5zaWduZWQgaW50IEdsb2JhbE1heEFjdGl2ZVhpZDsJLyogcHJvdCBieSBHbG9iYWxNaWRfU2VtICovCitHTE9CQUxfRVhURVJOIHNwaW5sb2NrX3QgR2xvYmFsTWlkX0xvY2s7ICAvKiBwcm90ZWN0cyBhYm92ZSBhbmQgbGlzdCBvcGVyYXRpb25zICovCisJCQkJCS8qIG9uIG1pZFEgZW50cmllcyAqLworR0xPQkFMX0VYVEVSTiBjaGFyIExvY2FsX1N5c3RlbV9OYW1lWzE1XTsKKworLyoKKyAqICBHbG9iYWwgY291bnRlcnMsIHVwZGF0ZWQgYXRvbWljYWxseQorICovCitHTE9CQUxfRVhURVJOIGF0b21pY190IHNlc0luZm9BbGxvY0NvdW50OworR0xPQkFMX0VYVEVSTiBhdG9taWNfdCB0Y29uSW5mb0FsbG9jQ291bnQ7CitHTE9CQUxfRVhURVJOIGF0b21pY190IHRjcFNlc0FsbG9jQ291bnQ7CitHTE9CQUxfRVhURVJOIGF0b21pY190IHRjcFNlc1JlY29ubmVjdENvdW50OworR0xPQkFMX0VYVEVSTiBhdG9taWNfdCB0Y29uSW5mb1JlY29ubmVjdENvdW50OworCisvKiBWYXJpb3VzIERlYnVnIGNvdW50ZXJzIHRvIHJlbW92ZSBzb21lZGF5IChCQikgKi8KK0dMT0JBTF9FWFRFUk4gYXRvbWljX3QgYnVmQWxsb2NDb3VudDsKK0dMT0JBTF9FWFRFUk4gYXRvbWljX3Qgc21CdWZBbGxvY0NvdW50OyAgICAgIAorR0xPQkFMX0VYVEVSTiBhdG9taWNfdCBtaWRDb3VudDsKKworLyogTWlzYyBnbG9iYWxzICovCitHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBtdWx0aXVzZXJfbW91bnQ7CS8qIGlmIGVuYWJsZWQgYWxsb3dzIG5ldyBzZXNzaW9ucworCQkJCXRvIGJlIGVzdGFibGlzaGVkIG9uIGV4aXN0aW5nIG1vdW50IGlmIHdlCisJCQkJaGF2ZSB0aGUgdWlkL3Bhc3N3b3JkIG9yIEtlcmJlcm9zIGNyZWRlbnRpYWwgCisJCQkJb3IgZXF1aXZhbGVudCBmb3IgY3VycmVudCB1c2VyICovCitHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBvcGxvY2tFbmFibGVkOworR0xPQkFMX0VYVEVSTiB1bnNpZ25lZCBpbnQgZXhwZXJpbUVuYWJsZWQ7CitHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBsb29rdXBDYWNoZUVuYWJsZWQ7CitHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBleHRlbmRlZF9zZWN1cml0eTsJLyogaWYgb24sIHNlc3Npb24gc2V0dXAgc2VudCAKKwkJCQl3aXRoIG1vcmUgc2VjdXJlIG50bG1zc3AyIGNoYWxsZW5nZS9yZXNwICovCitHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBudGxtdjJfc3VwcG9ydDsgIC8qIGJldHRlciBvcHRpb25hbCBwYXNzd29yZCBoYXNoICovCitHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBzaWduX0NJRlNfUERVczsgIC8qIGVuYWJsZSBzbWIgcGFja2V0IHNpZ25pbmcgKi8KK0dMT0JBTF9FWFRFUk4gdW5zaWduZWQgaW50IGxpbnV4RXh0RW5hYmxlZDsvKmVuYWJsZSBMaW51eC9Vbml4IENJRlMgZXh0ZW5zaW9ucyovCitHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBDSUZTTWF4QnVmU2l6ZTsgIC8qIG1heCBzaXplIG5vdCBpbmNsdWRpbmcgaGRyICovCitHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBjaWZzX21pbl9yY3Y7ICAgIC8qIG1pbiBzaXplIG9mIGJpZyBudHdyayBidWYgcG9vbCAqLworR0xPQkFMX0VYVEVSTiB1bnNpZ25lZCBpbnQgY2lmc19taW5fc21hbGw7ICAvKiBtaW4gc2l6ZSBvZiBzbWFsbCBidWYgcG9vbCAqLworR0xPQkFMX0VYVEVSTiB1bnNpZ25lZCBpbnQgY2lmc19tYXhfcGVuZGluZzsgLyogTUFYIHJlcXVlc3RzIGF0IG9uY2UgdG8gc2VydmVyKi8KKwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzcGR1LmggYi9mcy9jaWZzL2NpZnNwZHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2Q0YTYxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9jaWZzcGR1LmgKQEAgLTAsMCArMSwxOTg3IEBACisvKgorICogICBmcy9jaWZzL2NpZnNwZHUuaAorICoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMgorICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIAorICovCisKKyNpZm5kZWYgX0NJRlNQRFVfSAorI2RlZmluZSBfQ0lGU1BEVV9ICisKKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjZGVmaW5lIENJRlNfUFJPVCAgIDAKKyNkZWZpbmUgQkFEX1BST1QgICAgQ0lGU19QUk9UKzEKKworLyogU01CIGNvbW1hbmQgY29kZXMgKi8KKy8qIFNvbWUgY29tbWFuZHMgaGF2ZSBtaW5pbWFsICh3Y3Q9MCxiY2M9MCksIG9yIHVuaW50ZXJlc3RpbmcsIHJlc3BvbnNlcworIChpZSB3aGljaCBpbmNsdWRlIG5vIHVzZWZ1bCBkYXRhIG90aGVyIHRoYW4gdGhlIFNNQiBlcnJvciBjb2RlIGl0c2VsZikuCisgS25vd2luZyB0aGlzIGhlbHBzIGF2b2lkIHJlc3BvbnNlIGJ1ZmZlciBhbGxvY2F0aW9ucyBhbmQgY29weSBpbiBzb21lIGNhc2VzICovCisjZGVmaW5lIFNNQl9DT01fQ1JFQVRFX0RJUkVDVE9SWSAgICAgIDB4MDAgLyogdHJpdmlhbCByZXNwb25zZSAqLworI2RlZmluZSBTTUJfQ09NX0RFTEVURV9ESVJFQ1RPUlkgICAgICAweDAxIC8qIHRyaXZpYWwgcmVzcG9uc2UgKi8KKyNkZWZpbmUgU01CX0NPTV9DTE9TRSAgICAgICAgICAgICAgICAgMHgwNCAvKiB0cml2IHJlcS9yc3AsIHRpbWVzdGFtcCBpZ25vcmVkICovCisjZGVmaW5lIFNNQl9DT01fREVMRVRFICAgICAgICAgICAgICAgIDB4MDYgLyogdHJpdmlhbCByZXNwb25zZSAqLworI2RlZmluZSBTTUJfQ09NX1JFTkFNRSAgICAgICAgICAgICAgICAweDA3IC8qIHRyaXZpYWwgcmVzcG9uc2UgKi8KKyNkZWZpbmUgU01CX0NPTV9TRVRBVFRSICAgICAgICAgICAgICAgMHgwOSAvKiB0cml2aWFsIHJlc3BvbnNlICovCisjZGVmaW5lIFNNQl9DT01fTE9DS0lOR19BTkRYICAgICAgICAgIDB4MjQgLyogdHJpdmlhbCByZXNwb25zZSAqLworI2RlZmluZSBTTUJfQ09NX0NPUFkgICAgICAgICAgICAgICAgICAweDI5IC8qIHRyaXZpYWwgcnNwLCBmYWlsIGZpbGVuYW1lIGlnbnJkKi8KKyNkZWZpbmUgU01CX0NPTV9SRUFEX0FORFggICAgICAgICAgICAgMHgyRQorI2RlZmluZSBTTUJfQ09NX1dSSVRFX0FORFggICAgICAgICAgICAweDJGCisjZGVmaW5lIFNNQl9DT01fVFJBTlNBQ1RJT04yICAgICAgICAgIDB4MzIKKyNkZWZpbmUgU01CX0NPTV9UUkFOU0FDVElPTjJfU0VDT05EQVJZIDB4MzMKKyNkZWZpbmUgU01CX0NPTV9GSU5EX0NMT1NFMiAgICAgICAgICAgMHgzNCAvKiB0cml2aWFsIHJlc3BvbnNlICovCisjZGVmaW5lIFNNQl9DT01fVFJFRV9ESVNDT05ORUNUICAgICAgIDB4NzEgLyogdHJpdmlhbCByZXNwb25zZSAqLworI2RlZmluZSBTTUJfQ09NX05FR09USUFURSAgICAgICAgICAgICAweDcyCisjZGVmaW5lIFNNQl9DT01fU0VTU0lPTl9TRVRVUF9BTkRYICAgIDB4NzMKKyNkZWZpbmUgU01CX0NPTV9MT0dPRkZfQU5EWCAgICAgICAgICAgMHg3NCAvKiB0cml2aWFsIHJlc3BvbnNlICovCisjZGVmaW5lIFNNQl9DT01fVFJFRV9DT05ORUNUX0FORFggICAgIDB4NzUKKyNkZWZpbmUgU01CX0NPTV9OVF9UUkFOU0FDVCAgICAgICAgICAgMHhBMAorI2RlZmluZSBTTUJfQ09NX05UX1RSQU5TQUNUX1NFQ09OREFSWSAweEExCisjZGVmaW5lIFNNQl9DT01fTlRfQ1JFQVRFX0FORFggICAgICAgIDB4QTIKKyNkZWZpbmUgU01CX0NPTV9OVF9SRU5BTUUgICAgICAgICAgICAgMHhBNSAvKiB0cml2aWFsIHJlc3BvbnNlICovCisKKy8qIFRyYW5zYWN0MiBzdWJjb21tYW5kIGNvZGVzICovCisjZGVmaW5lIFRSQU5TMl9PUEVOICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgVFJBTlMyX0ZJTkRfRklSU1QgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBUUkFOUzJfRklORF9ORVhUICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFRSQU5TMl9RVUVSWV9GU19JTkZPUk1BVElPTiAgIDB4MDMKKyNkZWZpbmUgVFJBTlMyX1FVRVJZX1BBVEhfSU5GT1JNQVRJT04gMHgwNQorI2RlZmluZSBUUkFOUzJfU0VUX1BBVEhfSU5GT1JNQVRJT04gICAweDA2CisjZGVmaW5lIFRSQU5TMl9RVUVSWV9GSUxFX0lORk9STUFUSU9OIDB4MDcKKyNkZWZpbmUgVFJBTlMyX1NFVF9GSUxFX0lORk9STUFUSU9OICAgMHgwOAorI2RlZmluZSBUUkFOUzJfR0VUX0RGU19SRUZFUlJBTCAgICAgICAweDEwCisjZGVmaW5lIFRSQU5TMl9SRVBPUlRfREZTX0lOQ09TSVNURU5DWSAweDExCisKKy8qIE5UIFRyYW5zYWN0IHN1YmNvbW1hbmQgY29kZXMgKi8KKyNkZWZpbmUgTlRfVFJBTlNBQ1RfQ1JFQVRFICAgICAgICAgICAgMHgwMQorI2RlZmluZSBOVF9UUkFOU0FDVF9JT0NUTCAgICAgICAgICAgICAweDAyCisjZGVmaW5lIE5UX1RSQU5TQUNUX1NFVF9TRUNVUklUWV9ERVNDIDB4MDMKKyNkZWZpbmUgTlRfVFJBTlNBQ1RfTk9USUZZX0NIQU5HRSAgICAgMHgwNAorI2RlZmluZSBOVF9UUkFOU0FDVF9SRU5BTUUgICAgICAgICAgICAweDA1CisjZGVmaW5lIE5UX1RSQU5TQUNUX1FVRVJZX1NFQ1VSSVRZX0RFU0MgMHgwNgorI2RlZmluZSBOVF9UUkFOU0FDVF9HRVRfVVNFUl9RVU9UQSAgICAweDA3CisjZGVmaW5lIE5UX1RSQU5TQUNUX1NFVF9VU0VSX1FVT1RBICAgIDB4MDgKKworI2RlZmluZSBNQVhfQ0lGU19IRFJfU0laRSAyNTYJLyogY2hhaW5lZCBOVENyZWF0ZVhSZWFkWCB3aWxsIHByb2JhYmx5IGJlIGJpZ2dlc3QgKi8KKworLyogaW50ZXJuYWwgY2lmcyB2ZnMgc3RydWN0dXJlcyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBbGwgY29uc3RhbnRzIGdvIGhlcmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qCisgKiBTdGFydGluZyB2YWx1ZSBmb3IgbWF4aW11bSBTTUIgc2l6ZSBuZWdvdGlhdGlvbgorICovCisjZGVmaW5lIENJRlNfTUFYX01TR1NJWkUgKDQqNDA5NikKKworLyoKKyAqIFNpemUgb2YgZW5jcnlwdGVkIHVzZXIgcGFzc3dvcmQgaW4gYnl0ZXMKKyAqLworI2RlZmluZSBDSUZTX0VOQ1BXRF9TSVpFICgxNikKKworLyoKKyAqIFNpemUgb2YgdGhlIGNyeXB0byBrZXkgcmV0dXJuZWQgb24gdGhlIG5lZ290aWF0ZSBTTUIgaW4gYnl0ZXMKKyAqLworI2RlZmluZSBDSUZTX0NSWVBUT19LRVlfU0laRSAoOCkKKworLyoKKyAqIFNpemUgb2YgdGhlIHNlc3Npb24ga2V5IChjcnlwdG8ga2V5IGVuY3J5cHRlZCB3aXRoIHRoZSBwYXNzd29yZAorICovCisjZGVmaW5lIENJRlNfU0VTU0lPTl9LRVlfU0laRSAoMjQpCisKKy8qCisgKiBNYXhpbXVtIHVzZXIgbmFtZSBsZW5ndGgKKyAqLworI2RlZmluZSBDSUZTX1VOTEVOICgyMCkKKworLyoKKyAqIEZsYWdzIG9uIFNNQiBvcGVuCisgKi8KKyNkZWZpbmUgU01CT1BFTl9XUklURV9USFJPVUdIIDB4NDAwMAorI2RlZmluZSBTTUJPUEVOX0RFTllfQUxMICAgICAgMHgwMDEwCisjZGVmaW5lIFNNQk9QRU5fREVOWV9XUklURSAgICAweDAwMjAKKyNkZWZpbmUgU01CT1BFTl9ERU5ZX1JFQUQgICAgIDB4MDAzMAorI2RlZmluZSBTTUJPUEVOX0RFTllfTk9ORSAgICAgMHgwMDQwCisjZGVmaW5lIFNNQk9QRU5fUkVBRCAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgU01CT1BFTl9XUklURSAgICAgICAgIDB4MDAwMQorI2RlZmluZSBTTUJPUEVOX1JFQURXUklURSAgICAgMHgwMDAyCisjZGVmaW5lIFNNQk9QRU5fRVhFQ1VURSAgICAgICAweDAwMDMKKworI2RlZmluZSBTTUJPUEVOX09DUkVBVEUgICAgICAgMHgwMDEwCisjZGVmaW5lIFNNQk9QRU5fT1RSVU5DICAgICAgICAweDAwMDIKKyNkZWZpbmUgU01CT1BFTl9PQVBQRU5EICAgICAgIDB4MDAwMQorCisvKgorICogU01CIGZsYWcgZGVmaW5pdGlvbnMgCisgKi8KKyNkZWZpbmUgU01CRkxHX0VYVERfTE9DSyAweDAxCS8qIHNlcnZlciBzdXBwb3J0cyBsb2NrLXJlYWQgd3JpdGUtdW5sb2NrIHByaW1pdGl2ZXMgKi8KKyNkZWZpbmUgU01CRkxHX1JDVl9QT1NURUQgMHgwMgkvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBTTUJGTEdfUlNWRCAweDA0CisjZGVmaW5lIFNNQkZMR19DQVNFTEVTUyAweDA4CS8qIGFsbCBwYXRobmFtZXMgdHJlYXRlZCBhcyBjYXNlbGVzcyAob2ZmIGltcGxpZXMgY2FzZSBzZW5zaXRpdmUgZmlsZSBoYW5kbGluZyByZXF1ZXN0ZWQpICovCisjZGVmaW5lIFNNQkZMR19DQU5PTklDQUxfUEFUSF9GT1JNQVQgMHgxMAkvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBTTUJGTEdfT0xEX09QTE9DSyAweDIwCS8qIG9ic29sZXRlICovCisjZGVmaW5lIFNNQkZMR19PTERfT1BMT0NLX05PVElGWSAweDQwCS8qIG9ic29sZXRlICovCisjZGVmaW5lIFNNQkZMR19SRVNQT05TRSAweDgwCS8qIHRoaXMgUERVIGlzIGEgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIgKi8KKworLyoKKyAqIFNNQiBmbGFnMiBkZWZpbml0aW9ucyAKKyAqLworI2RlZmluZSBTTUJGTEcyX0tOT1dTX0xPTkdfTkFNRVMgY3B1X3RvX2xlMTYoMSkJLyogY2FuIHNlbmQgbG9uZyAobm9uLTguMykgcGF0aCBuYW1lcyBpbiByZXNwb25zZSAqLworI2RlZmluZSBTTUJGTEcyX0tOT1dTX0VBUyBjcHVfdG9fbGUxNigyKQorI2RlZmluZSBTTUJGTEcyX1NFQ1VSSVRZX1NJR05BVFVSRSBjcHVfdG9fbGUxNig0KQorI2RlZmluZSBTTUJGTEcyX0lTX0xPTkdfTkFNRSBjcHVfdG9fbGUxNigweDQwKQorI2RlZmluZSBTTUJGTEcyX0VYVF9TRUMgY3B1X3RvX2xlMTYoMHg4MDApCisjZGVmaW5lIFNNQkZMRzJfREZTIGNwdV90b19sZTE2KDB4MTAwMCkKKyNkZWZpbmUgU01CRkxHMl9QQUdJTkdfSU8gY3B1X3RvX2xlMTYoMHgyMDAwKQorI2RlZmluZSBTTUJGTEcyX0VSUl9TVEFUVVMgY3B1X3RvX2xlMTYoMHg0MDAwKQorI2RlZmluZSBTTUJGTEcyX1VOSUNPREUgY3B1X3RvX2xlMTYoMHg4MDAwKQorCisvKgorICogVGhlc2UgYXJlIHRoZSBmaWxlIGFjY2VzcyBwZXJtaXNzaW9uIGJpdHMgZGVmaW5lZCBpbiBDSUZTIGZvciB0aGUKKyAqIE5UQ3JlYXRlQW5kWCBhcyB3ZWxsIGFzIHRoZSBsZXZlbCAweDEwNworICogVFJBTlMyX1FVRVJZX1BBVEhfSU5GT1JNQVRJT04gQVBJLiAgVGhlIGxldmVsIDB4MTA3LCBTTUJfUVVFUllfRklMRV9BTExfSU5GTworICogcmVzcG9uZHMgd2l0aCB0aGUgQWNjZXNzRmxhZ3MuCisgKiBUaGUgQWNjZXNzRmxhZ3Mgc3BlY2lmaWVzIHRoZSBhY2Nlc3MgcGVybWlzc2lvbnMgYSBjYWxsZXIgaGFzIHRvIHRoZQorICogZmlsZSBhbmQgY2FuIGhhdmUgYW55IHN1aXRhYmxlIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICovCisKKyNkZWZpbmUgRklMRV9SRUFEX0RBVEEgICAgICAgIDB4MDAwMDAwMDEJLyogRGF0YSBjYW4gYmUgcmVhZCBmcm9tIHRoZSBmaWxlICAgKi8KKyNkZWZpbmUgRklMRV9XUklURV9EQVRBICAgICAgIDB4MDAwMDAwMDIJLyogRGF0YSBjYW4gYmUgd3JpdHRlbiB0byB0aGUgZmlsZSAgKi8KKyNkZWZpbmUgRklMRV9BUFBFTkRfREFUQSAgICAgIDB4MDAwMDAwMDQJLyogRGF0YSBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIGZpbGUgKi8KKyNkZWZpbmUgRklMRV9SRUFEX0VBICAgICAgICAgIDB4MDAwMDAwMDgJLyogRXh0ZW5kZWQgYXR0cmlidXRlcyBhc3NvY2lhdGVkICAgKi8KKwkJCQkJIC8qIHdpdGggdGhlIGZpbGUgY2FuIGJlIHJlYWQgICAgICAgICovCisjZGVmaW5lIEZJTEVfV1JJVEVfRUEgICAgICAgICAweDAwMDAwMDEwCS8qIEV4dGVuZGVkIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCAgICovCisJCQkJCSAvKiB3aXRoIHRoZSBmaWxlIGNhbiBiZSB3cml0dGVuICAgICAqLworI2RlZmluZSBGSUxFX0VYRUNVVEUgICAgICAgICAgMHgwMDAwMDAyMAkvKkRhdGEgY2FuIGJlIHJlYWQgaW50byBtZW1vcnkgZnJvbSAqLworCQkJCQkgLyogdGhlIGZpbGUgdXNpbmcgc3lzdGVtIHBhZ2luZyBJL08gKi8KKyNkZWZpbmUgRklMRV9ERUxFVEVfQ0hJTEQgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRklMRV9SRUFEX0FUVFJJQlVURVMgIDB4MDAwMDAwODAJLyogQXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlICAgKi8KKwkJCQkJIC8qIGZpbGUgY2FuIGJlIHJlYWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZJTEVfV1JJVEVfQVRUUklCVVRFUyAweDAwMDAwMTAwCS8qIEF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSAgICovCisJCQkJCSAvKiBmaWxlIGNhbiBiZSB3cml0dGVuICAgICAgICAgICAgICAqLworI2RlZmluZSBERUxFVEUgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAkvKiBUaGUgZmlsZSBjYW4gYmUgZGVsZXRlZCAgICAgICAgICAqLworI2RlZmluZSBSRUFEX0NPTlRST0wgICAgICAgICAgMHgwMDAyMDAwMAkvKiBUaGUgYWNjZXNzIGNvbnRyb2wgbGlzdCBhbmQgICAgICAqLworCQkJCQkgLyogb3duZXJzaGlwIGFzc29jaWF0ZWQgd2l0aCB0aGUgICAgKi8KKwkJCQkJIC8qIGZpbGUgY2FuIGJlIHJlYWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFdSSVRFX0RBQyAgICAgICAgICAgICAweDAwMDQwMDAwCS8qIFRoZSBhY2Nlc3MgY29udHJvbCBsaXN0IGFuZCAgICAgICovCisJCQkJCSAvKiBvd25lcnNoaXAgYXNzb2NpYXRlZCB3aXRoIHRoZSAgICAqLworCQkJCQkgLyogZmlsZSBjYW4gYmUgd3JpdHRlbi4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgV1JJVEVfT1dORVIgICAgICAgICAgIDB4MDAwODAwMDAJLyogT3duZXJzaGlwIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgKi8KKwkJCQkJIC8qIHdpdGggdGhlIGZpbGUgY2FuIGJlIHdyaXR0ZW4gICAgICovCisjZGVmaW5lIFNZTkNIUk9OSVpFICAgICAgICAgICAweDAwMTAwMDAwCS8qIFRoZSBmaWxlIGhhbmRsZSBjYW4gd2FpdGVkIG9uIHRvICovCisJCQkJCSAvKiBzeW5jaHJvbml6ZSB3aXRoIHRoZSBjb21wbGV0aW9uICAqLworCQkJCQkgLyogb2YgYW4gaW5wdXQvb3V0cHV0IHJlcXVlc3QgICAgICAgKi8KKyNkZWZpbmUgR0VORVJJQ19BTEwgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgR0VORVJJQ19FWEVDVVRFICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgR0VORVJJQ19XUklURSAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgR0VORVJJQ19SRUFEICAgICAgICAgIDB4ODAwMDAwMDAKKwkJCQkJIC8qIEluIHN1bW1hcnkgLSBSZWxldmFudCBmaWxlICAgICAgICovCisJCQkJCSAvKiBhY2Nlc3MgZmxhZ3MgZnJvbSBDSUZTIGFyZSAgICAgICAqLworCQkJCQkgLyogZmlsZV9yZWFkX2RhdGEsIGZpbGVfd3JpdGVfZGF0YSAgKi8KKwkJCQkJIC8qIGZpbGVfZXhlY3V0ZSwgZmlsZV9yZWFkX2F0dHJpYnV0ZXMgKi8KKwkJCQkJIC8qIHdyaXRlX2RhYywgYW5kIGRlbGV0ZS4gICAgICAgICAgICovCisKKy8qCisgKiBJbnZhbGlkIHJlYWRkaXIgaGFuZGxlCisgKi8KKyNkZWZpbmUgQ0lGU19OT19IQU5ETEUgICAgICAgIDB4RkZGRgorCisvKiBJUEMkIGluIEFTQ0lJICovCisjZGVmaW5lIENJRlNfSVBDX1JFU09VUkNFICJceDQ5XHg1MFx4NDNceDI0IgorCisvKiBJUEMkIGluIFVuaWNvZGUgKi8KKyNkZWZpbmUgQ0lGU19JUENfVU5JQ09ERV9SRVNPVVJDRSAiXHgwMFx4NDlceDAwXHg1MFx4MDBceDQzXHgwMFx4MjRceDAwXHgwMCIKKworLyogVW5pY29kZSBOdWxsIHRlcm1pbmF0ZSAyIGJ5dGVzIG9mIDAgKi8KKyNkZWZpbmUgVU5JQ09ERV9OVUxMICJceDAwXHgwMCIKKyNkZWZpbmUgQVNDSUlfTlVMTCAweDAwCisKKy8qCisgKiBTZXJ2ZXIgdHlwZSB2YWx1ZXMgKHJldHVybmVkIG9uIEVudW1TZXJ2ZXIgQVBJCisgKi8KKyNkZWZpbmUgQ0lGU19TVl9UWVBFX0RDICAgICAweDAwMDAwMDA4CisjZGVmaW5lIENJRlNfU1ZfVFlQRV9CQUNLREMgMHgwMDAwMDAxMAorCisvKgorICogQWxpYXMgdHlwZSBmbGFncyAoRnJvbSBFbnVtQWxpYXMgQVBJIGNhbGwKKyAqLworI2RlZmluZSBDSUZTX0FMSUFTX1RZUEVfRklMRSAweDAwMDEKKyNkZWZpbmUgQ0lGU19TSEFSRV9UWVBFX0ZJTEUgMHgwMDAwCisKKy8qCisgKiBGaWxlIEF0dHJpYnV0ZSBmbGFncworICovCisjZGVmaW5lIEFUVFJfUkVBRE9OTFkgIDB4MDAwMQorI2RlZmluZSBBVFRSX0hJRERFTiAgICAweDAwMDIKKyNkZWZpbmUgQVRUUl9TWVNURU0gICAgMHgwMDA0CisjZGVmaW5lIEFUVFJfVk9MVU1FICAgIDB4MDAwOAorI2RlZmluZSBBVFRSX0RJUkVDVE9SWSAweDAwMTAKKyNkZWZpbmUgQVRUUl9BUkNISVZFICAgMHgwMDIwCisjZGVmaW5lIEFUVFJfREVWSUNFICAgIDB4MDA0MAorI2RlZmluZSBBVFRSX05PUk1BTCAgICAweDAwODAKKyNkZWZpbmUgQVRUUl9URU1QT1JBUlkgMHgwMTAwCisjZGVmaW5lIEFUVFJfU1BBUlNFICAgIDB4MDIwMAorI2RlZmluZSBBVFRSX1JFUEFSU0UgICAweDA0MDAKKyNkZWZpbmUgQVRUUl9DT01QUkVTU0VEIDB4MDgwMAorI2RlZmluZSBBVFRSX09GRkxJTkUgICAgMHgxMDAwCS8qIGllIGZpbGUgbm90IGltbWVkaWF0ZWx5IGF2YWlsYWJsZSAtIG9mZmxpbmUgc3RvcmFnZSAqLworI2RlZmluZSBBVFRSX05PVF9DT05URU5UX0lOREVYRUQgMHgyMDAwCisjZGVmaW5lIEFUVFJfRU5DUllQVEVEICAweDQwMDAKKyNkZWZpbmUgQVRUUl9QT1NJWF9TRU1BTlRJQ1MgMHgwMTAwMDAwMAorI2RlZmluZSBBVFRSX0JBQ0tVUF9TRU1BTlRJQ1MgMHgwMjAwMDAwMAorI2RlZmluZSBBVFRSX0RFTEVURV9PTl9DTE9TRSAweDA0MDAwMDAwCisjZGVmaW5lIEFUVFJfU0VRVUVOVElBTF9TQ0FOIDB4MDgwMDAwMDAKKyNkZWZpbmUgQVRUUl9SQU5ET01fQUNDRVNTICAgMHgxMDAwMDAwMAorI2RlZmluZSBBVFRSX05PX0JVRkZFUklORyAgICAweDIwMDAwMDAwCisjZGVmaW5lIEFUVFJfV1JJVEVfVEhST1VHSCAgIDB4ODAwMDAwMDAKKworLyogU2hhcmVBY2Nlc3MgZmxhZ3MgKi8KKyNkZWZpbmUgRklMRV9OT19TSEFSRSAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBGSUxFX1NIQVJFX1JFQUQgICAweDAwMDAwMDAxCisjZGVmaW5lIEZJTEVfU0hBUkVfV1JJVEUgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRklMRV9TSEFSRV9ERUxFVEUgMHgwMDAwMDAwNAorI2RlZmluZSBGSUxFX1NIQVJFX0FMTCAgICAweDAwMDAwMDA3CisKKy8qIENyZWF0ZURpc3Bvc2l0aW9uIGZsYWdzICovCisjZGVmaW5lIEZJTEVfU1VQRVJTRURFICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRklMRV9PUEVOICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBGSUxFX0NSRUFURSAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEZJTEVfT1BFTl9JRiAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgRklMRV9PVkVSV1JJVEUgICAgMHgwMDAwMDAwNAorI2RlZmluZSBGSUxFX09WRVJXUklURV9JRiAweDAwMDAwMDA1CisKKy8qIENyZWF0ZU9wdGlvbnMgKi8KKyNkZWZpbmUgQ1JFQVRFX05PVF9GSUxFCQkweDAwMDAwMDAxCS8qIGlmIHNldCBtdXN0IG5vdCBiZSBmaWxlICovCisjZGVmaW5lIENSRUFURV9XUklURV9USFJPVUdICTB4MDAwMDAwMDIKKyNkZWZpbmUgQ1JFQVRFX05PVF9ESVIJCTB4MDAwMDAwNDAJLyogaWYgc2V0IG11c3Qgbm90IGJlIGRpcmVjdG9yeSAqLworI2RlZmluZSBDUkVBVEVfUkFORE9NX0FDQ0VTUwkweDAwMDAwODAwCisjZGVmaW5lIENSRUFURV9ERUxFVEVfT05fQ0xPU0UJMHgwMDAwMTAwMAorI2RlZmluZSBPUEVOX1JFUEFSU0VfUE9JTlQJMHgwMDIwMDAwMAorCisvKiBJbXBlcnNvbmF0aW9uTGV2ZWwgZmxhZ3MgKi8KKyNkZWZpbmUgU0VDVVJJVFlfQU5PTllNT1VTICAgICAgMAorI2RlZmluZSBTRUNVUklUWV9JREVOVElGSUNBVElPTiAxCisjZGVmaW5lIFNFQ1VSSVRZX0lNUEVSU09OQVRJT04gIDIKKyNkZWZpbmUgU0VDVVJJVFlfREVMRUdBVElPTiAgICAgMworCisvKiBTZWN1cml0eUZsYWdzICovCisjZGVmaW5lIFNFQ1VSSVRZX0NPTlRFWFRfVFJBQ0tJTkcgMHgwMQorI2RlZmluZSBTRUNVUklUWV9FRkZFQ1RJVkVfT05MWSAgIDB4MDIKKworLyoKKyAqIERlZmF1bHQgUElEIHZhbHVlLCB1c2VkIGluIGFsbCBTTUJzIHdoZXJlIHRoZSBQSUQgaXMgbm90IGltcG9ydGFudAorICovCisjZGVmaW5lIENJRlNfREZUX1BJRCAgMHgxMjM0CisKKy8qCisgKiBXZSB1c2UgdGhlIHNhbWUgcm91dGluZSBmb3IgQ29weSBhbmQgTW92ZSBTTUJzLiAgVGhpcyBmbGFnIGlzIHVzZWQgdG8KKyAqIGRpc3Rpbmd1aXNoCisgKi8KKyNkZWZpbmUgQ0lGU19DT1BZX09QIDEKKyNkZWZpbmUgQ0lGU19SRU5BTUVfT1AgMgorCisjZGVmaW5lIEdFVFUxNih2YXIpICAoKigoX191MTYgKil2YXIpKQkvKiBCQiBjaGVjayBmb3IgZW5kaWFuIGlzc3VlcyAqLworI2RlZmluZSBHRVRVMzIodmFyKSAgKCooKF9fdTMyICopdmFyKSkJLyogQkIgY2hlY2sgZm9yIGVuZGlhbiBpc3N1ZXMgKi8KKworI3ByYWdtYSBwYWNrKDEpCisKK3N0cnVjdCBzbWJfaGRyIHsKKwlfX3UzMiBzbWJfYnVmX2xlbmd0aDsJLyogYmlnIGVuZGlhbiBvbiB3aXJlICovLyogQkIgbGVuZ3RoIGlzIG9ubHkgdHdvIG9yIHRocmVlIGJ5dGVzIC0gd2l0aCBvbmUgb3IgdHdvIGJ5dGUgdHlwZSBwcmVjZWRpbmcgaXQgYnV0IHRoYXQgaXMgYWx3YXlzIHplcm8gLSB3ZSBjb3VsZCBtYXNrIHRoZSB0eXBlIGJ5dGUgb2ZmIGp1c3QgaW4gY2FzZSBCQiAqLworCV9fdTggUHJvdG9jb2xbNF07CisJX191OCBDb21tYW5kOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTggRXJyb3JDbGFzczsKKwkJCV9fdTggUmVzZXJ2ZWQ7CisJCQlfX2xlMTYgRXJyb3I7CisJCX0gRG9zRXJyb3I7CisJCV9fbGUzMiBDaWZzRXJyb3I7CisJfSBTdGF0dXM7CisJX191OCBGbGFnczsKKwlfX2xlMTYgRmxhZ3MyOwkJLyogbm90ZTogbGUgKi8KKwlfX2xlMTYgUGlkSGlnaDsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX2xlMzIgU2VxdWVuY2VOdW1iZXI7ICAvKiBsZSAqLworCQkJX191MzIgUmVzZXJ2ZWQ7IC8qIHplcm8gKi8KKwkJfSBTZXF1ZW5jZTsKKwkJX191OCBTZWN1cml0eVNpZ25hdHVyZVs4XTsJLyogbGUgKi8KKwl9IFNpZ25hdHVyZTsKKwlfX3U4IHBhZFsyXTsKKwlfX3UxNiBUaWQ7CisJX19sZTE2IFBpZDsKKwlfX3UxNiBVaWQ7CisJX191MTYgTWlkOworCV9fdTggV29yZENvdW50OworfTsKKy8qIGdpdmVuIGEgcG9pbnRlciB0byBhbiBzbWJfaGRyIHJldHJpZXZlIHRoZSB2YWx1ZSBvZiBieXRlIGNvdW50ICovCisjZGVmaW5lIEJDQyhzbWJfdmFyKSAoICooX191MTYgKikoKGNoYXIgKilzbWJfdmFyICsgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSArICgyKiBzbWJfdmFyLT5Xb3JkQ291bnQpICkgKQorCisvKiBnaXZlbiBhIHBvaW50ZXIgdG8gYW4gc21iX2hkciByZXRyaWV2ZSB0aGUgcG9pbnRlciB0byB0aGUgYnl0ZSBhcmVhICovCisjZGVmaW5lIHBCeXRlQXJlYShzbWJfdmFyKSAoKHVuc2lnbmVkIGNoYXIgKilzbWJfdmFyICsgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSArICgyKiBzbWJfdmFyLT5Xb3JkQ291bnQpICsgMiApCisKKy8qCisgKiBDb21wdXRlciBOYW1lIExlbmd0aAorICovCisjZGVmaW5lIENOTEVOIDE1CisKKy8qCisgKiBTaGFyZSBOYW1lIExlbmd0aAkJCQkJICBAUzhBCisgKiBOb3RlOiAgVGhpcyBsZW5ndGggaXMgbGltaXRlZCBieSB0aGUgU01CIHVzZWQgdG8gZ2V0ICAgQFM4QQorICogICAgICAgIHRoZSBTaGFyZSBpbmZvLiAgIE5ldFNoYXJlRW51bSBvbmx5IHJldHVybnMgMTMgIEBTOEEKKyAqICAgICAgICBjaGFycywgaW5jbHVkaW5nIHRoZSBudWxsIHRlcm1pbmF0aW9uLiAgICAgICAgICBAUzhBIAorICovCisjZGVmaW5lIFNOTEVOIDEyCQkvKkBTOEEgKi8KKworLyoKKyAqIENvbW1lbnQgTGVuZ3RoCisgKi8KKyNkZWZpbmUgTUFYQ09NTUVOVExFTiA0MAorCisvKgorICogVGhlIE9TLzIgbWF4aW11bSBwYXRoIG5hbWUKKyAqLworI2RlZmluZSBNQVhfUEFUSENPTkYgMjU2CisKKy8qCisgKiAgU01CIGZyYW1lIGRlZmluaXRpb25zICAoZm9sbG93aW5nIG11c3QgYmUgcGFja2VkIHN0cnVjdHMpCisgKiAgU2VlIHRoZSBTTklBIENJRlMgU3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKyAqCisgKiAgVGhlIE5hbWluZyBjb252ZW50aW9uIGlzIHRoZSBsb3dlciBjYXNlIHZlcnNpb24gb2YgdGhlCisgKiAgc21iIGNvbW1hbmQgY29kZSBuYW1lIGZvciB0aGUgc3RydWN0IGFuZCB0aGlzIGlzIHR5cGVkZWYgdG8gdGhlCisgKiAgdXBwZXJjYXNlIHZlcnNpb24gb2YgdGhlIHNhbWUgbmFtZSB3aXRoIHRoZSBwcmVmaXggU01CXyByZW1vdmVkIAorICogIGZvciBicmV2aXR5LiAgQWx0aG91Z2ggdHlwZWRlZnMgYXJlIG5vdCBjb21tb25seSB1c2VkIGZvciAKKyAqICBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgaW4gdGhlIExpbnV4IGtlcm5lbCwgdGhlaXIgdXNlIGluIHRoZQorICogIENJRlMgc3RhbmRhcmRzIGRvY3VtZW50LCB3aGljaCB0aGlzIGNvZGUgaXMgYmFzZWQgb24sIG1heQorICogIG1ha2UgdGhpcyBvbmUgb2YgdGhlIGNhc2VzIHdoZXJlIHR5cGVkZWZzIGZvciBzdHJ1Y3R1cmVzIG1ha2UKKyAqICBzZW5zZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5IGZvciByZWFkZXJzIG9mIHRoZSBzdGFuZGFyZHMgZG9jLgorICogIFR5cGVkZWZzIGNhbiBhbHdheXMgYmUgcmVtb3ZlZCBsYXRlciBpZiB0aGV5IGFyZSB0b28gZGlzdHJhY3RpbmcKKyAqICBhbmQgdGhleSBhcmUgb25seSB1c2VkIGZvciB0aGUgQ0lGU3MgUERVcyB0aGVtc2VsdmVzLCBub3QKKyAqICBpbnRlcm5hbCBjaWZzIHZmcyBzdHJ1Y3R1cmVzCisgKiAgCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbmVnb3RpYXRlX3JlcSB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAwICovCisJX19sZTE2IEJ5dGVDb3VudDsKKwl1bnNpZ25lZCBjaGFyIERpYWxlY3RzQXJyYXlbMV07Cit9IE5FR09USUFURV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IG5lZ290aWF0ZV9yc3AgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTcgKi8KKwlfX2xlMTYgRGlhbGVjdEluZGV4OworCV9fdTggU2VjdXJpdHlNb2RlOworCV9fbGUxNiBNYXhNcHhDb3VudDsKKwlfX2xlMTYgTWF4TnVtYmVyVmNzOworCV9fbGUzMiBNYXhCdWZmZXJTaXplOworCV9fbGUzMiBNYXhSYXdTaXplOworCV9fbGUzMiBTZXNzaW9uS2V5OworCV9fbGUzMiBDYXBhYmlsaXRpZXM7CS8qIHNlZSBiZWxvdyAqLworCV9fbGUzMiBTeXN0ZW1UaW1lTG93OworCV9fbGUzMiBTeXN0ZW1UaW1lSGlnaDsKKwlfX2xlMTYgU2VydmVyVGltZVpvbmU7CisJX191OCBFbmNyeXB0aW9uS2V5TGVuZ3RoOworCV9fdTE2IEJ5dGVDb3VudDsKKwl1bmlvbiB7CisJCXVuc2lnbmVkIGNoYXIgRW5jcnlwdGlvbktleVsxXTsJLyogaWYgY2FwIGV4dGVuZGVkIHNlY3VyaXR5IGlzIG9mZiAqLworCQkvKiBmb2xsb3dlZCBieSBEb21haW4gbmFtZSAtIGlmIGV4dGVuZGVkIHNlY3VyaXR5IGlzIG9mZiAqLworCQkvKiBmb2xsb3dlZCBieSAxNiBieXRlcyBvZiBzZXJ2ZXIgR1VJRCAqLworCQkvKiBmb2xsb3dlZCBieSBzZWN1cml0eSBibG9iIGlmIGNhcF9leHRlbmRlZF9zZWN1cml0eSBuZWdvdGlhdGVkICovCisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBjaGFyIEdVSURbMTZdOworCQkJdW5zaWduZWQgY2hhciBTZWN1cml0eUJsb2JbMV07CisJCX0gZXh0ZW5kZWRfcmVzcG9uc2U7CisJfSB1OworfSBORUdPVElBVEVfUlNQOworCisvKiBTZWN1cml0eU1vZGUgYml0cyAqLworI2RlZmluZSBTRUNNT0RFX1VTRVIgICAgICAgICAgMHgwMQkvKiBvZmYgaW5kaWNhdGVzIHNoYXJlIGxldmVsIHNlY3VyaXR5ICovCisjZGVmaW5lIFNFQ01PREVfUFdfRU5DUllQVCAgICAweDAyCisjZGVmaW5lIFNFQ01PREVfU0lHTl9FTkFCTEVEICAweDA0CS8qIFNNQiBzZWN1cml0eSBzaWduYXR1cmVzIGVuYWJsZWQgKi8KKyNkZWZpbmUgU0VDTU9ERV9TSUdOX1JFUVVJUkVEIDB4MDgJLyogU01CIHNlY3VyaXR5IHNpZ25hdHVyZXMgcmVxdWlyZWQgKi8KKworLyogTmVnb3RpYXRlIHJlc3BvbnNlIENhcGFiaWxpdGllcyAqLworI2RlZmluZSBDQVBfUkFXX01PREUgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQ0FQX01QWF9NT0RFICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIENBUF9VTklDT0RFICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBDQVBfTEFSR0VfRklMRVMgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQ0FQX05UX1NNQlMgICAgICAgICAgICAweDAwMDAwMDEwCS8qIGltcGxpZXMgQ0FQX05UX0ZJTkQgKi8KKyNkZWZpbmUgQ0FQX1JQQ19SRU1PVEVfQVBJUyAgICAweDAwMDAwMDIwCisjZGVmaW5lIENBUF9TVEFUVVMzMiAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBDQVBfTEVWRUxfSUlfT1BMT0NLUyAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQ0FQX0xPQ0tfQU5EX1JFQUQgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIENBUF9OVF9GSU5EICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBDQVBfREZTICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgQ0FQX0lORk9MRVZFTF9QQVNTVEhSVSAweDAwMDAyMDAwCisjZGVmaW5lIENBUF9MQVJHRV9SRUFEX1ggICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBDQVBfTEFSR0VfV1JJVEVfWCAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgQ0FQX1VOSVggICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIENBUF9SRVNFUlZFRCAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBDQVBfQlVMS19UUkFOU0ZFUiAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgQ0FQX0NPTVBSRVNTRURfREFUQSAgICAweDQwMDAwMDAwCisjZGVmaW5lIENBUF9FWFRFTkRFRF9TRUNVUklUWSAgMHg4MDAwMDAwMAorCit0eXBlZGVmIHVuaW9uIHNtYl9jb21fc2Vzc2lvbl9zZXR1cF9hbmR4IHsKKwlzdHJ1Y3QgewkJLyogcmVxdWVzdCBmb3JtYXQgKi8KKwkJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxMiAqLworCQlfX3U4IEFuZFhDb21tYW5kOworCQlfX3U4IEFuZFhSZXNlcnZlZDsKKwkJX19sZTE2IEFuZFhPZmZzZXQ7CisJCV9fbGUxNiBNYXhCdWZmZXJTaXplOworCQlfX2xlMTYgTWF4TXB4Q291bnQ7CisJCV9fbGUxNiBWY051bWJlcjsKKwkJX191MzIgU2Vzc2lvbktleTsKKwkJX19sZTE2IFNlY3VyaXR5QmxvYkxlbmd0aDsKKwkJX191MzIgUmVzZXJ2ZWQ7CisJCV9fbGUzMiBDYXBhYmlsaXRpZXM7CS8qIHNlZSBiZWxvdyAqLworCQlfX2xlMTYgQnl0ZUNvdW50OworCQl1bnNpZ25lZCBjaGFyIFNlY3VyaXR5QmxvYlsxXTsJLyogZm9sbG93ZWQgYnkgKi8KKwkJLyogU1RSSU5HIE5hdGl2ZU9TICovCisJCS8qIFNUUklORyBOYXRpdmVMYW5NYW4gKi8KKwl9IHJlcTsJCQkvKiBOVExNIHJlcXVlc3QgZm9ybWF0ICh3aXRoIGV4dGVuZGVkIHNlY3VyaXR5ICovCisKKwlzdHJ1Y3QgewkJLyogcmVxdWVzdCBmb3JtYXQgKi8KKwkJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxMyAqLworCQlfX3U4IEFuZFhDb21tYW5kOworCQlfX3U4IEFuZFhSZXNlcnZlZDsKKwkJX19sZTE2IEFuZFhPZmZzZXQ7CisJCV9fbGUxNiBNYXhCdWZmZXJTaXplOworCQlfX2xlMTYgTWF4TXB4Q291bnQ7CisJCV9fbGUxNiBWY051bWJlcjsKKwkJX191MzIgU2Vzc2lvbktleTsKKwkJX19sZTE2IENhc2VJbnNlbnNpdGl2ZVBhc3N3b3JkTGVuZ3RoOwkvKiBBU0NJSSBwYXNzd29yZCBsZW5ndGggKi8KKwkJX19sZTE2IENhc2VTZW5zaXRpdmVQYXNzd29yZExlbmd0aDsJLyogVW5pY29kZSBwYXNzd29yZCBsZW5ndGggKi8KKwkJX191MzIgUmVzZXJ2ZWQ7CS8qIHNlZSBiZWxvdyAqLworCQlfX2xlMzIgQ2FwYWJpbGl0aWVzOworCQlfX2xlMTYgQnl0ZUNvdW50OworCQl1bnNpZ25lZCBjaGFyIENhc2VJbnNlbnNpdGl2ZVBhc3N3b3JkWzFdOwkvKiBmb2xsb3dlZCBieTogKi8KKwkJLyogdW5zaWduZWQgY2hhciAqIENhc2VTZW5zaXRpdmVQYXNzd29yZDsgKi8KKwkJLyogU1RSSU5HIEFjY291bnROYW1lICovCisJCS8qIFNUUklORyBQcmltYXJ5RG9tYWluICovCisJCS8qIFNUUklORyBOYXRpdmVPUyAqLworCQkvKiBTVFJJTkcgTmF0aXZlTGFuTWFuICovCisJfSByZXFfbm9fc2VjZXh0OwkvKiBOVExNIHJlcXVlc3QgZm9ybWF0ICh3aXRob3V0IGV4dGVuZGVkIHNlY3VyaXR5ICovCisKKwlzdHJ1Y3QgewkJLyogZGVmYXVsdCAoTlRMTSkgcmVzcG9uc2UgZm9ybWF0ICovCisJCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gNCAqLworCQlfX3U4IEFuZFhDb21tYW5kOworCQlfX3U4IEFuZFhSZXNlcnZlZDsKKwkJX19sZTE2IEFuZFhPZmZzZXQ7CisJCV9fbGUxNiBBY3Rpb247CS8qIHNlZSBiZWxvdyAqLworCQlfX2xlMTYgU2VjdXJpdHlCbG9iTGVuZ3RoOworCQlfX3UxNiBCeXRlQ291bnQ7CisJCXVuc2lnbmVkIGNoYXIgU2VjdXJpdHlCbG9iWzFdOwkvKiBmb2xsb3dlZCBieSAqLworLyogICAgICB1bnNpZ25lZCBjaGFyICAqIE5hdGl2ZU9TOyAgICAgICovCisvKgl1bnNpZ25lZCBjaGFyICAqIE5hdGl2ZUxhbk1hbjsgICovCisvKiAgICAgIHVuc2lnbmVkIGNoYXIgICogUHJpbWFyeURvbWFpbjsgKi8KKwl9IHJlc3A7CQkJLyogTlRMTSByZXNwb25zZSBmb3JtYXQgKHdpdGggb3Igd2l0aG91dCBleHRlbmRlZCBzZWN1cml0eSAqLworCisJc3RydWN0IHsJCS8qIHJlcXVlc3QgZm9ybWF0ICovCisJCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTAgKi8KKwkJX191OCBBbmRYQ29tbWFuZDsKKwkJX191OCBBbmRYUmVzZXJ2ZWQ7CisJCV9fbGUxNiBBbmRYT2Zmc2V0OworCQlfX2xlMTYgTWF4QnVmZmVyU2l6ZTsKKwkJX19sZTE2IE1heE1weENvdW50OworCQlfX2xlMTYgVmNOdW1iZXI7CisJCV9fdTMyIFNlc3Npb25LZXk7CisJCV9fbGUxNiBQYXNzc3dvcmRMZW5ndGg7CisJCV9fdTMyIFJlc2VydmVkOworCQlfX2xlMTYgQnl0ZUNvdW50OworCQl1bnNpZ25lZCBjaGFyIEFjY291bnRQYXNzd29yZFsxXTsJLyogZm9sbG93ZWQgYnkgKi8KKwkJLyogU1RSSU5HIEFjY291bnROYW1lICovCisJCS8qIFNUUklORyBQcmltYXJ5RG9tYWluICovCisJCS8qIFNUUklORyBOYXRpdmVPUyAqLworCQkvKiBTVFJJTkcgTmF0aXZlTGFuTWFuICovCisJfSBvbGRfcmVxOwkJLyogcHJlLU5UTE0gKExBTk1BTjIuMSkgcmVxdWVzdCBmb3JtYXQgKi8KKworCXN0cnVjdCB7CQkvKiBkZWZhdWx0IChOVExNKSByZXNwb25zZSBmb3JtYXQgKi8KKwkJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAzICovCisJCV9fdTggQW5kWENvbW1hbmQ7CisJCV9fdTggQW5kWFJlc2VydmVkOworCQlfX2xlMTYgQW5kWE9mZnNldDsKKwkJX19sZTE2IEFjdGlvbjsJLyogc2VlIGJlbG93ICovCisJCV9fdTE2IEJ5dGVDb3VudDsKKwkJdW5zaWduZWQgY2hhciBOYXRpdmVPU1sxXTsJLyogZm9sbG93ZWQgYnkgKi8KKy8qCXVuc2lnbmVkIGNoYXIgKiBOYXRpdmVMYW5NYW47ICovCisvKiAgICAgIHVuc2lnbmVkIGNoYXIgKiBQcmltYXJ5RG9tYWluOyAqLworCX0gb2xkX3Jlc3A7CQkvKiBwcmUtTlRMTSAoTEFOTUFOMi4xKSByZXNwb25zZSBmb3JtYXQgKi8KK30gU0VTU0lPTl9TRVRVUF9BTkRYOworCisjZGVmaW5lIENJRlNfTkVUV09SS19PUFNZUyAiQ0lGUyBWRlMgQ2xpZW50IGZvciBMaW51eCIKKworLyogQ2FwYWJpbGl0aWVzIGJpdHMgKGZvciBOVExNIFNlc3NTZXR1cCByZXF1ZXN0KSAqLworI2RlZmluZSBDQVBfVU5JQ09ERSAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQ0FQX0xBUkdFX0ZJTEVTICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIENBUF9OVF9TTUJTICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBDQVBfU1RBVFVTMzIgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgQ0FQX0xFVkVMX0lJX09QTE9DS1MgICAweDAwMDAwMDgwCisjZGVmaW5lIENBUF9OVF9GSU5EICAgICAgICAgICAgMHgwMDAwMDIwMAkvKiByZXNlcnZlZCBzaG91bGQgYmUgemVybyAocHJlc3VtYWJseSBiZWNhdXNlIE5UX1NNQnMgaW1wbGllcyB0aGUgc2FtZSB0aGluZykgKi8KKyNkZWZpbmUgQ0FQX0JVTEtfVFJBTlNGRVIgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIENBUF9FWFRFTkRFRF9TRUNVUklUWSAgMHg4MDAwMDAwMAorCisvKiBBY3Rpb24gYml0cyAqLworI2RlZmluZSBHVUVTVF9MT0dJTiAxCisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdGNvbnhfcmVxIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDQgKi8KKwlfX3U4IEFuZFhDb21tYW5kOworCV9fdTggQW5kWFJlc2VydmVkOworCV9fbGUxNiBBbmRYT2Zmc2V0OworCV9fbGUxNiBGbGFnczsJCS8qIHNlZSBiZWxvdyAqLworCV9fbGUxNiBQYXNzd29yZExlbmd0aDsKKwlfX2xlMTYgQnl0ZUNvdW50OworCXVuc2lnbmVkIGNoYXIgUGFzc3dvcmRbMV07CS8qIGZvbGxvd2VkIGJ5ICovCisvKiBTVFJJTkcgUGF0aCAgICAqLy8qIFxcc2VydmVyXHNoYXJlIG5hbWUgKi8KKwkvKiBTVFJJTkcgU2VydmljZSAqLworfSBUQ09OWF9SRVE7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdGNvbnhfcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDMgKi8vKiBub3RlIHRoYXQgV2luMjAwMCBoYXMgc2VudCB3Y3Q9NyBpbiBzb21lIGNhc2VzIG9uIHJlc3BvbnNlcy4gRm91ciB1bnNwZWNpZmllZCB3b3JkcyBmb2xsb3dlZCBPcHRpb25hbFN1cHBvcnQgKi8KKwlfX3U4IEFuZFhDb21tYW5kOworCV9fdTggQW5kWFJlc2VydmVkOworCV9fbGUxNiBBbmRYT2Zmc2V0OworCV9fbGUxNiBPcHRpb25hbFN1cHBvcnQ7CS8qIHNlZSBiZWxvdyAqLworCV9fdTE2IEJ5dGVDb3VudDsKKwl1bnNpZ25lZCBjaGFyIFNlcnZpY2VbMV07CS8qIGFsd2F5cyBBU0NJSSwgbm90IFVuaWNvZGUgKi8KKwkvKiBTVFJJTkcgTmF0aXZlRmlsZVN5c3RlbSAqLworfSBUQ09OWF9SU1A7CisKKy8qIHRyZWUgY29ubmVjdCBGbGFncyAqLworI2RlZmluZSBESVNDT05ORUNUX1RJRCAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgVENPTl9FWFRFTkRFRF9TRUNJTkZPICAgMHgwMDA4CisvKiBPcHRpb25hbFN1cHBvcnQgYml0cyAqLworI2RlZmluZSBTTUJfU1VQUE9SVF9TRUFSQ0hfQklUUyAweDAwMDEJLyogbXVzdCBoYXZlIGJpdHMgKGV4Y2x1c2l2ZSBzZWFyY2hlcyBzdXBwdC4gKi8KKyNkZWZpbmUgU01CX1NIQVJFX0lTX0lOX0RGUyAgICAgMHgwMDAyCisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fbG9nb2ZmX2FuZHhfcmVxIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDIgKi8KKwlfX3U4IEFuZFhDb21tYW5kOworCV9fdTggQW5kWFJlc2VydmVkOworCV9fdTE2IEFuZFhPZmZzZXQ7CisJX191MTYgQnl0ZUNvdW50OworfSBMT0dPRkZfQU5EWF9SRVE7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fbG9nb2ZmX2FuZHhfcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDIgKi8KKwlfX3U4IEFuZFhDb21tYW5kOworCV9fdTggQW5kWFJlc2VydmVkOworCV9fdTE2IEFuZFhPZmZzZXQ7CisJX191MTYgQnl0ZUNvdW50OworfSBMT0dPRkZfQU5EWF9SU1A7CisKK3R5cGVkZWYgdW5pb24gc21iX2NvbV90cmVlX2Rpc2Nvbm5lY3QgewkvKiBhcyBhbiBhbHRldG5hdGl2ZSBjYW4gdXNlIGZsYWcgb24gdHJlZV9jb25uZWN0IFBEVSB0byBlZmZlY3QgZGlzY29ubmVjdCAqLy8qIHByb2JhYmx5IHRoZSBzaW1wbGVzdCBTTUIgUERVICovCisJc3RydWN0IHsKKwkJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAwICovCisJCV9fdTE2IEJ5dGVDb3VudDsJLyogYmNjID0gMCAqLworCX0gcmVxOworCXN0cnVjdCB7CisJCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMCAqLworCQlfX3UxNiBCeXRlQ291bnQ7CS8qIGJjYyA9IDAgKi8KKwl9IHJlc3A7Cit9IFRSRUVfRElTQ09OTkVDVDsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV9jbG9zZV9yZXEgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMyAqLworCV9fdTE2IEZpbGVJRDsKKwlfX3UzMiBMYXN0V3JpdGVUaW1lOwkvKiBzaG91bGQgYmUgemVybyAqLworCV9fdTE2IEJ5dGVDb3VudDsJLyogMCAqLworfSBDTE9TRV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fY2xvc2VfcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDAgKi8KKwlfX3UxNiBCeXRlQ291bnQ7CS8qIGJjdCA9IDAgKi8KK30gQ0xPU0VfUlNQOworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX2ZpbmRjbG9zZV9yZXEgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsgLyogd2N0ID0gMSAqLworCV9fdTE2IEZpbGVJRDsKKwlfX3UxNiBCeXRlQ291bnQ7ICAgIC8qIDAgKi8KK30gRklORENMT1NFX1JFUTsKKworLyogT3BlbkZsYWdzICovCisjZGVmaW5lIFJFUV9PUExPQ0sgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFJFUV9CQVRDSE9QTE9DSyAgICAweDAwMDAwMDA0CisjZGVmaW5lIFJFUV9PUEVORElST05MWSAgICAweDAwMDAwMDA4CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fb3Blbl9yZXEgewkvKiBhbHNvIGhhbmRsZXMgY3JlYXRlICovCisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAyNCAqLworCV9fdTggQW5kWENvbW1hbmQ7CisJX191OCBBbmRYUmVzZXJ2ZWQ7CisJX19sZTE2IEFuZFhPZmZzZXQ7CisJX191OCBSZXNlcnZlZDsJCS8qIE11c3QgQmUgWmVybyAqLworCV9fbGUxNiBOYW1lTGVuZ3RoOworCV9fbGUzMiBPcGVuRmxhZ3M7CisJX19sZTMyIFJvb3REaXJlY3RvcnlGaWQ7CisJX19sZTMyIERlc2lyZWRBY2Nlc3M7CisJX19sZTY0IEFsbG9jYXRpb25TaXplOworCV9fbGUzMiBGaWxlQXR0cmlidXRlczsKKwlfX2xlMzIgU2hhcmVBY2Nlc3M7CisJX19sZTMyIENyZWF0ZURpc3Bvc2l0aW9uOworCV9fbGUzMiBDcmVhdGVPcHRpb25zOworCV9fbGUzMiBJbXBlcnNvbmF0aW9uTGV2ZWw7CisJX191OCBTZWN1cml0eUZsYWdzOworCV9fbGUxNiBCeXRlQ291bnQ7CisJY2hhciBmaWxlTmFtZVsxXTsKK30gT1BFTl9SRVE7CisKKy8qIG9wZW4gcmVzcG9uc2U6IG9wbG9jayBsZXZlbHMgKi8KKyNkZWZpbmUgT1BMT0NLX05PTkUgIAkgMAorI2RlZmluZSBPUExPQ0tfRVhDTFVTSVZFIDEKKyNkZWZpbmUgT1BMT0NLX0JBVENICSAyCisjZGVmaW5lIE9QTE9DS19SRUFECSAzICAvKiBsZXZlbCAyIG9wbG9jayAqLworCisvKiBvcGVuIHJlc3BvbnNlIGZvciBDcmVhdGVBY3Rpb24gc2hpZnRlZCBsZWZ0ICovCisjZGVmaW5lIENJRlNfQ1JFQVRFX0FDVElPTiAweDIwMDAwIC8qIGZpbGUgY3JlYXRlZCAqLworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX29wZW5fcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDM0IEJCICovCisJX191OCBBbmRYQ29tbWFuZDsKKwlfX3U4IEFuZFhSZXNlcnZlZDsKKwlfX2xlMTYgQW5kWE9mZnNldDsKKwlfX3U4IE9wbG9ja0xldmVsOworCV9fdTE2IEZpZDsKKwlfX2xlMzIgQ3JlYXRlQWN0aW9uOworCV9fbGU2NCBDcmVhdGlvblRpbWU7CisJX19sZTY0IExhc3RBY2Nlc3NUaW1lOworCV9fbGU2NCBMYXN0V3JpdGVUaW1lOworCV9fbGU2NCBDaGFuZ2VUaW1lOworCV9fbGUzMiBGaWxlQXR0cmlidXRlczsKKwlfX2xlNjQgQWxsb2NhdGlvblNpemU7CisJX19sZTY0IEVuZE9mRmlsZTsKKwlfX2xlMTYgRmlsZVR5cGU7CisJX19sZTE2IERldmljZVN0YXRlOworCV9fdTggRGlyZWN0b3J5RmxhZzsKKwlfX3UxNiBCeXRlQ291bnQ7CS8qIGJjdCA9IDAgKi8KK30gT1BFTl9SU1A7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fd3JpdGVfcmVxIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDE0ICovCisJX191OCBBbmRYQ29tbWFuZDsKKwlfX3U4IEFuZFhSZXNlcnZlZDsKKwlfX2xlMTYgQW5kWE9mZnNldDsKKwlfX3UxNiBGaWQ7CisJX19sZTMyIE9mZnNldExvdzsKKwlfX3UzMiBSZXNlcnZlZDsKKwlfX2xlMTYgV3JpdGVNb2RlOworCV9fbGUxNiBSZW1haW5pbmc7CisJX19sZTE2IERhdGFMZW5ndGhIaWdoOworCV9fbGUxNiBEYXRhTGVuZ3RoTG93OworCV9fbGUxNiBEYXRhT2Zmc2V0OworCV9fbGUzMiBPZmZzZXRIaWdoOworCV9fbGUxNiBCeXRlQ291bnQ7CisJX191OCBQYWQ7CQkvKiBCQiBjaGVjayBmb3Igd2hldGhlciBwYWRkZWQgdG8gRFdPUkQgYm91bmRhcnkgYW5kIG9wdGltdW0gcGVyZm9ybWFuY2UgaGVyZSAqLworCWNoYXIgRGF0YVswXTsKK30gV1JJVEVfUkVROworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX3dyaXRlX3JzcCB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSA2ICovCisJX191OCBBbmRYQ29tbWFuZDsKKwlfX3U4IEFuZFhSZXNlcnZlZDsKKwlfX2xlMTYgQW5kWE9mZnNldDsKKwlfX2xlMTYgQ291bnQ7CisJX19sZTE2IFJlbWFpbmluZzsKKwlfX2xlMTYgQ291bnRIaWdoOworCV9fdTE2ICBSZXNlcnZlZDsKKwlfX3UxNiBCeXRlQ291bnQ7Cit9IFdSSVRFX1JTUDsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV9yZWFkX3JlcSB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxMiAqLworCV9fdTggQW5kWENvbW1hbmQ7CisJX191OCBBbmRYUmVzZXJ2ZWQ7CisJX19sZTE2IEFuZFhPZmZzZXQ7CisJX191MTYgRmlkOworCV9fbGUzMiBPZmZzZXRMb3c7CisJX19sZTE2IE1heENvdW50OworCV9fbGUxNiBNaW5Db3VudDsJCS8qIG9ic29sZXRlICovCisJX19sZTMyIE1heENvdW50SGlnaDsKKwlfX2xlMTYgUmVtYWluaW5nOworCV9fbGUzMiBPZmZzZXRIaWdoOworCV9fbGUxNiBCeXRlQ291bnQ7Cit9IFJFQURfUkVROworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX3JlYWRfcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDEyICovCisJX191OCBBbmRYQ29tbWFuZDsKKwlfX3U4IEFuZFhSZXNlcnZlZDsKKwlfX2xlMTYgQW5kWE9mZnNldDsKKwlfX2xlMTYgUmVtYWluaW5nOworCV9fbGUxNiBEYXRhQ29tcGFjdGlvbk1vZGU7CisJX19sZTE2IFJlc2VydmVkOworCV9fbGUxNiBEYXRhTGVuZ3RoOworCV9fbGUxNiBEYXRhT2Zmc2V0OworCV9fbGUxNiBEYXRhTGVuZ3RoSGlnaDsKKwlfX3U2NCBSZXNlcnZlZDI7CisJX191MTYgQnl0ZUNvdW50OworCV9fdTggUGFkOwkJLyogQkIgY2hlY2sgZm9yIHdoZXRoZXIgcGFkZGVkIHRvIERXT1JEIGJvdW5kYXJ5IGFuZCBvcHRpbXVtIHBlcmZvcm1hbmNlIGhlcmUgKi8KKwljaGFyIERhdGFbMV07Cit9IFJFQURfUlNQOworCit0eXBlZGVmIHN0cnVjdCBsb2NraW5nX2FuZHhfcmFuZ2UgeworCV9fbGUxNiBQaWQ7CisJX19sZTE2IFBhZDsKKwlfX2xlMzIgT2Zmc2V0SGlnaDsKKwlfX2xlMzIgT2Zmc2V0TG93OworCV9fbGUzMiBMZW5ndGhIaWdoOworCV9fbGUzMiBMZW5ndGhMb3c7Cit9IExPQ0tJTkdfQU5EWF9SQU5HRTsKKworI2RlZmluZSBMT0NLSU5HX0FORFhfU0hBUkVEX0xPQ0sgICAgIDB4MDEKKyNkZWZpbmUgTE9DS0lOR19BTkRYX09QTE9DS19SRUxFQVNFICAweDAyCisjZGVmaW5lIExPQ0tJTkdfQU5EWF9DSEFOR0VfTE9DS1RZUEUgMHgwNAorI2RlZmluZSBMT0NLSU5HX0FORFhfQ0FOQ0VMX0xPQ0sgICAgIDB4MDgKKyNkZWZpbmUgTE9DS0lOR19BTkRYX0xBUkdFX0ZJTEVTICAgICAweDEwCS8qIGFsd2F5cyBvbiBmb3IgdXMgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV9sb2NrX3JlcSB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSA4ICovCisJX191OCBBbmRYQ29tbWFuZDsKKwlfX3U4IEFuZFhSZXNlcnZlZDsKKwlfX2xlMTYgQW5kWE9mZnNldDsKKwlfX3UxNiBGaWQ7CisJX191OCBMb2NrVHlwZTsKKwlfX3U4IE9wbG9ja0xldmVsOworCV9fbGUzMiBUaW1lb3V0OworCV9fbGUxNiBOdW1iZXJPZlVubG9ja3M7CisJX19sZTE2IE51bWJlck9mTG9ja3M7CisJX19sZTE2IEJ5dGVDb3VudDsKKwlMT0NLSU5HX0FORFhfUkFOR0UgTG9ja3NbMV07Cit9IExPQ0tfUkVROworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX2xvY2tfcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDIgKi8KKwlfX3U4IEFuZFhDb21tYW5kOworCV9fdTggQW5kWFJlc2VydmVkOworCV9fbGUxNiBBbmRYT2Zmc2V0OworCV9fdTE2IEJ5dGVDb3VudDsKK30gTE9DS19SU1A7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fcmVuYW1lX3JlcSB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxICovCisJX19sZTE2IFNlYXJjaEF0dHJpYnV0ZXM7CS8qIHRhcmdldCBmaWxlIGF0dHJpYnV0ZXMgKi8KKwlfX2xlMTYgQnl0ZUNvdW50OworCV9fdTggQnVmZmVyRm9ybWF0OwkvKiA0ID0gQVNDSUkgb3IgVW5pY29kZSAqLworCXVuc2lnbmVkIGNoYXIgT2xkRmlsZU5hbWVbMV07CisJLyogZm9sbG93ZWQgYnkgX191OCBCdWZmZXJGb3JtYXQyICovCisJLyogZm9sbG93ZWQgYnkgTmV3RmlsZU5hbWUgKi8KK30gUkVOQU1FX1JFUTsKKworCS8qIGNvcHkgcmVxdWVzdCBmbGFncyAqLworI2RlZmluZSBDT1BZX01VU1RfQkVfRklMRSAgICAgIDB4MDAwMQorI2RlZmluZSBDT1BZX01VU1RfQkVfRElSICAgICAgIDB4MDAwMgorI2RlZmluZSBDT1BZX1RBUkdFVF9NT0RFX0FTQ0lJIDB4MDAwNCAvKiBpZiBub3Qgc2V0LCBiaW5hcnkgKi8KKyNkZWZpbmUgQ09QWV9TT1VSQ0VfTU9ERV9BU0NJSSAweDAwMDggLyogaWYgbm90IHNldCwgYmluYXJ5ICovCisjZGVmaW5lIENPUFlfVkVSSUZZX1dSSVRFUyAgICAgMHgwMDEwCisjZGVmaW5lIENPUFlfVFJFRSAgICAgICAgICAgICAgMHgwMDIwIAorCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX2NvcHlfcmVxIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDMgKi8KKwlfX3UxNiBUaWQyOworCV9fbGUxNiBPcGVuRnVuY3Rpb247CisJX19sZTE2IEZsYWdzOworCV9fbGUxNiBCeXRlQ291bnQ7CisJX191OCBCdWZmZXJGb3JtYXQ7CS8qIDQgPSBBU0NJSSBvciBVbmljb2RlICovIAorCXVuc2lnbmVkIGNoYXIgT2xkRmlsZU5hbWVbMV07CisJLyogZm9sbG93ZWQgYnkgX191OCBCdWZmZXJGb3JtYXQyICovCisJLyogZm9sbG93ZWQgYnkgTmV3RmlsZU5hbWUgc3RyaW5nICovCit9IENPUFlfUkVROworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX2NvcHlfcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7ICAgICAvKiB3Y3QgPSAxICovCisJX19sZTE2IENvcHlDb3VudDsgICAgLyogbnVtYmVyIG9mIGZpbGVzIGNvcGllZCAqLworCV9fdTE2IEJ5dGVDb3VudDsgICAgLyogbWF5IGJlIHplcm8gKi8KKwlfX3U4IEJ1ZmZlckZvcm1hdDsgIC8qIDB4MDQgLSBvbmx5IHByZXNlbnQgaWYgZXJyb3JlZCBmaWxlIGZvbGxvd3MgKi8KKwl1bnNpZ25lZCBjaGFyIEVycm9yRmlsZU5hbWVbMV07IC8qIG9ubHkgcHJlc2VudCBpZiBlcnJvciBpbiBjb3B5ICovCit9IENPUFlfUlNQOworCisjZGVmaW5lIENSRUFURV9IQVJEX0xJTksJCTB4MTAzCisjZGVmaW5lIE1PVkVGSUxFX0NPUFlfQUxMT1dFRAkJMHgwMDAyCisjZGVmaW5lIE1PVkVGSUxFX1JFUExBQ0VfRVhJU1RJTkcJMHgwMDAxCisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fbnRfcmVuYW1lX3JlcSB7CS8qIEE1IC0gYWxzbyB1c2VkIGZvciBjcmVhdGUgaGFyZGxpbmsgKi8KKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDQgKi8KKwlfX2xlMTYgU2VhcmNoQXR0cmlidXRlczsJLyogdGFyZ2V0IGZpbGUgYXR0cmlidXRlcyAqLworCV9fbGUxNiBGbGFnczsJCS8qIHNwZWMgc2F5cyBJbmZvcm1hdGlvbiBMZXZlbCAqLworCV9fbGUzMiBDbHVzdGVyQ291bnQ7CisJX19sZTE2IEJ5dGVDb3VudDsKKwlfX3U4IEJ1ZmZlckZvcm1hdDsJLyogNCA9IEFTQ0lJIG9yIFVuaWNvZGUgKi8KKwl1bnNpZ25lZCBjaGFyIE9sZEZpbGVOYW1lWzFdOworCS8qIGZvbGxvd2VkIGJ5IF9fdTggQnVmZmVyRm9ybWF0MiAqLworCS8qIGZvbGxvd2VkIGJ5IE5ld0ZpbGVOYW1lICovCit9IE5UX1JFTkFNRV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fcmVuYW1lX3JzcCB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAwICovCisJX191MTYgQnl0ZUNvdW50OwkvKiBiY3QgPSAwICovCit9IFJFTkFNRV9SU1A7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fZGVsZXRlX2ZpbGVfcmVxIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDEgKi8KKwlfX2xlMTYgU2VhcmNoQXR0cmlidXRlczsKKwlfX2xlMTYgQnl0ZUNvdW50OworCV9fdTggQnVmZmVyRm9ybWF0OwkvKiA0ID0gQVNDSUkgKi8KKwl1bnNpZ25lZCBjaGFyIGZpbGVOYW1lWzFdOworfSBERUxFVEVfRklMRV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fZGVsZXRlX2ZpbGVfcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDAgKi8KKwlfX3UxNiBCeXRlQ291bnQ7CS8qIGJjdCA9IDAgKi8KK30gREVMRVRFX0ZJTEVfUlNQOworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX2RlbGV0ZV9kaXJlY3RvcnlfcmVxIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDAgKi8KKwlfX2xlMTYgQnl0ZUNvdW50OworCV9fdTggQnVmZmVyRm9ybWF0OwkvKiA0ID0gQVNDSUkgKi8KKwl1bnNpZ25lZCBjaGFyIERpck5hbWVbMV07Cit9IERFTEVURV9ESVJFQ1RPUllfUkVROworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX2RlbGV0ZV9kaXJlY3RvcnlfcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDAgKi8KKwlfX3UxNiBCeXRlQ291bnQ7CS8qIGJjdCA9IDAgKi8KK30gREVMRVRFX0RJUkVDVE9SWV9SU1A7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fY3JlYXRlX2RpcmVjdG9yeV9yZXEgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMCAqLworCV9fbGUxNiBCeXRlQ291bnQ7CisJX191OCBCdWZmZXJGb3JtYXQ7CS8qIDQgPSBBU0NJSSAqLworCXVuc2lnbmVkIGNoYXIgRGlyTmFtZVsxXTsKK30gQ1JFQVRFX0RJUkVDVE9SWV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fY3JlYXRlX2RpcmVjdG9yeV9yc3AgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMCAqLworCV9fdTE2IEJ5dGVDb3VudDsJLyogYmN0ID0gMCAqLworfSBDUkVBVEVfRElSRUNUT1JZX1JTUDsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV9zZXRhdHRyX3JlcSB7CisJc3RydWN0IHNtYl9oZHIgaGRyOyAvKiB3Y3QgPSA4ICovCisJX19sZTE2IGF0dHI7CisJX19sZTE2IHRpbWVfbG93OworCV9fbGUxNiB0aW1lX2hpZ2g7CisJX19sZTE2IHJlc2VydmVkWzVdOyAvKiBtdXN0IGJlIHplcm8gKi8KKwlfX3UxNiAgQnl0ZUNvdW50OworCV9fdTggICBCdWZmZXJGb3JtYXQ7IC8qIDQgPSBBU0NJSSAqLworCXVuc2lnbmVkIGNoYXIgZmlsZU5hbWVbMV07Cit9IFNFVEFUVFJfUkVROworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX3NldGF0dHJfcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7ICAgICAvKiB3Y3QgPSAwICovCisJX191MTYgQnl0ZUNvdW50OyAgICAgICAgLyogYmN0ID0gMCAqLworfSBTRVRBVFRSX1JTUDsKKworLyogZW1wdHkgd2N0IHJlc3BvbnNlIHRvIHNldGF0dHIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5UIFRyYW5zYWN0IHN0cnVjdHVyZSBkZWZpbnRpb25zIGZvbGxvdyAgICAgICAgICovCisvKiBDdXJyZW50bHkgb25seSBpb2N0bCBhbmQgbm90aWZ5IGFyZSBpbXBsZW1lbnRlZCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb25faW9jdGxfcmVxIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDIzICovCisJX191OCBNYXhTZXR1cENvdW50OworCV9fdTE2IFJlc2VydmVkOworCV9fbGUzMiBUb3RhbFBhcmFtZXRlckNvdW50OworCV9fbGUzMiBUb3RhbERhdGFDb3VudDsKKwlfX2xlMzIgTWF4UGFyYW1ldGVyQ291bnQ7CisJX19sZTMyIE1heERhdGFDb3VudDsKKwlfX2xlMzIgUGFyYW1ldGVyQ291bnQ7CisJX19sZTMyIFBhcmFtZXRlck9mZnNldDsKKwlfX2xlMzIgRGF0YUNvdW50OworCV9fbGUzMiBEYXRhT2Zmc2V0OworCV9fdTggU2V0dXBDb3VudDsgLyogZm91ciBzZXR1cCB3b3JkcyBmb2xsb3cgc3ViY29tbWFuZCAqLworCS8qIFNOSUEgc3BlYyBpbmNvcnJlY3RseSBpbmNsdWRlZCBzcHVyaW91cyBwYWQgaGVyZSAqLworCV9fbGUxNiBTdWJDb21tYW5kOy8qIDIgPSBJT0NUTC9GU0NUTCAqLworCV9fbGUzMiBGdW5jdGlvbkNvZGU7CisJX191MTYgRmlkOworCV9fdTggSXNGc2N0bDsgICAgLyogMSA9IEZpbGUgU3lzdGVtIENvbnRyb2wsIDAgPSBkZXZpY2UgY29udHJvbCAoSU9DVEwpKi8KKwlfX3U4IElzUm9vdEZsYWc7IC8qIDEgPSBhcHBseSBjb21tYW5kIHRvIHJvb3Qgb2Ygc2hhcmUgKG11c3QgYmUgREZTIHNoYXJlKSovCisJX19sZTE2IEJ5dGVDb3VudDsKKwlfX3U4IFBhZFszXTsKKwlfX3U4IERhdGFbMV07Cit9IFRSQU5TQUNUX0lPQ1RMX1JFUTsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9pb2N0bF9yc3AgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTkgKi8KKwlfX3U4IFJlc2VydmVkWzNdOworCV9fbGUzMiBUb3RhbFBhcmFtZXRlckNvdW50OworCV9fbGUzMiBUb3RhbERhdGFDb3VudDsKKwlfX2xlMzIgUGFyYW1ldGVyQ291bnQ7CisJX19sZTMyIFBhcmFtZXRlck9mZnNldDsKKwlfX2xlMzIgUGFyYW1ldGVyRGlzcGxhY2VtZW50OworCV9fbGUzMiBEYXRhQ291bnQ7CisJX19sZTMyIERhdGFPZmZzZXQ7CisJX19sZTMyIERhdGFEaXNwbGFjZW1lbnQ7CisJX191OCBTZXR1cENvdW50OwkvKiAxICovCisJX19sZTE2IFJldHVybmVkRGF0YUxlbjsKKwlfX3UxNiBCeXRlQ291bnQ7CisJX191OCBQYWRbM107Cit9IFRSQU5TQUNUX0lPQ1RMX1JTUDsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9jaGFuZ2Vfbm90aWZ5X3JlcSB7CisJc3RydWN0IHNtYl9oZHIgaGRyOyAgICAgLyogd2N0ID0gMjMgKi8KKwlfX3U4IE1heFNldHVwQ291bnQ7CisJX191MTYgUmVzZXJ2ZWQ7CisJX19sZTMyIFRvdGFsUGFyYW1ldGVyQ291bnQ7CisJX19sZTMyIFRvdGFsRGF0YUNvdW50OworCV9fbGUzMiBNYXhQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMzIgTWF4RGF0YUNvdW50OworCV9fbGUzMiBQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMzIgUGFyYW1ldGVyT2Zmc2V0OworCV9fbGUzMiBEYXRhQ291bnQ7CisJX19sZTMyIERhdGFPZmZzZXQ7CisJX191OCBTZXR1cENvdW50OyAvKiBmb3VyIHNldHVwIHdvcmRzIGZvbGxvdyBzdWJjb21tYW5kICovCisJLyogU05JQSBzcGVjIGluY29ycmVjdGx5IGluY2x1ZGVkIHNwdXJpb3VzIHBhZCBoZXJlICovCisJX19sZTE2IFN1YkNvbW1hbmQ7LyogNCA9IENoYW5nZSBOb3RpZnkgKi8KKwlfX2xlMzIgQ29tcGxldGlvbkZpbHRlcjsgIC8qIG9wZXJhdGlvbiB0byBtb25pdG9yICovCisJX191MTYgRmlkOworCV9fdTggV2F0Y2hUcmVlOyAgLyogMSA9IE1vbml0b3Igc3ViZGlyZWN0b3JpZXMgKi8KKwlfX3U4IFJlc2VydmVkMjsKKwlfX2xlMTYgQnl0ZUNvdW50OworLyogX191OCBQYWRbM107Ki8KKy8qCV9fdTggRGF0YVsxXTsqLworfSBUUkFOU0FDVF9DSEFOR0VfTk9USUZZX1JFUTsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9jaGFuZ2Vfbm90aWZ5X3JzcCB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxOCAqLworCV9fdTggUmVzZXJ2ZWRbM107CisJX19sZTMyIFRvdGFsUGFyYW1ldGVyQ291bnQ7CisJX19sZTMyIFRvdGFsRGF0YUNvdW50OworCV9fbGUzMiBQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMzIgUGFyYW1ldGVyT2Zmc2V0OworCV9fbGUzMiBQYXJhbWV0ZXJEaXNwbGFjZW1lbnQ7CisJX19sZTMyIERhdGFDb3VudDsKKwlfX2xlMzIgRGF0YU9mZnNldDsKKwlfX2xlMzIgRGF0YURpc3BsYWNlbWVudDsKKwlfX3U4IFNldHVwQ291bnQ7ICAgLyogMCAqLworCV9fdTE2IEJ5dGVDb3VudDsKKwkvKiBfX3U4IFBhZFszXTsgKi8KK30gVFJBTlNBQ1RfQ0hBTkdFX05PVElGWV9SU1A7CisvKiBDb21wbGV0aW9uIEZpbHRlciBmbGFncyBmb3IgTm90aWZ5ICovCisjZGVmaW5lIEZJTEVfTk9USUZZX0NIQU5HRV9GSUxFX05BTUUgICAgMHgwMDAwMDAwMQorI2RlZmluZSBGSUxFX05PVElGWV9DSEFOR0VfRElSX05BTUUgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRklMRV9OT1RJRllfQ0hBTkdFX05BTUUgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEZJTEVfTk9USUZZX0NIQU5HRV9BVFRSSUJVVEVTICAgMHgwMDAwMDAwNAorI2RlZmluZSBGSUxFX05PVElGWV9DSEFOR0VfU0laRSAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRklMRV9OT1RJRllfQ0hBTkdFX0xBU1RfV1JJVEUgICAweDAwMDAwMDEwCisjZGVmaW5lIEZJTEVfTk9USUZZX0NIQU5HRV9MQVNUX0FDQ0VTUyAgMHgwMDAwMDAyMAorI2RlZmluZSBGSUxFX05PVElGWV9DSEFOR0VfQ1JFQVRJT04gICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRklMRV9OT1RJRllfQ0hBTkdFX0VBICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEZJTEVfTk9USUZZX0NIQU5HRV9TRUNVUklUWSAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBGSUxFX05PVElGWV9DSEFOR0VfU1RSRUFNX05BTUUgIDB4MDAwMDAyMDAKKyNkZWZpbmUgRklMRV9OT1RJRllfQ0hBTkdFX1NUUkVBTV9TSVpFICAweDAwMDAwNDAwCisjZGVmaW5lIEZJTEVfTk9USUZZX0NIQU5HRV9TVFJFQU1fV1JJVEUgMHgwMDAwMDgwMAorCisjZGVmaW5lIEZJTEVfQUNUSU9OX0FEREVECQkweDAwMDAwMDAxCisjZGVmaW5lIEZJTEVfQUNUSU9OX1JFTU9WRUQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRklMRV9BQ1RJT05fTU9ESUZJRUQJCTB4MDAwMDAwMDMKKyNkZWZpbmUgRklMRV9BQ1RJT05fUkVOQU1FRF9PTERfTkFNRQkweDAwMDAwMDA0CisjZGVmaW5lIEZJTEVfQUNUSU9OX1JFTkFNRURfTkVXX05BTUUJMHgwMDAwMDAwNQorI2RlZmluZSBGSUxFX0FDVElPTl9BRERFRF9TVFJFQU0JMHgwMDAwMDAwNgorI2RlZmluZSBGSUxFX0FDVElPTl9SRU1PVkVEX1NUUkVBTQkweDAwMDAwMDA3CisjZGVmaW5lIEZJTEVfQUNUSU9OX01PRElGSUVEX1NUUkVBTQkweDAwMDAwMDA4CisKKy8qIHJlc3BvbnNlIGNvbnRhaW5zIGFycmF5IG9mIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlcyAqLworc3RydWN0IGZpbGVfbm90aWZ5X2luZm9ybWF0aW9uIHsKKwlfX2xlMzIgTmV4dEVudHJ5T2Zmc2V0OworCV9fbGUzMiBBY3Rpb247CisJX19sZTMyIEZpbGVOYW1lTGVuZ3RoOworCV9fdTggIEZpbGVOYW1lWzBdOworfTsgCisKK3N0cnVjdCByZXBhcnNlX2RhdGEgeworCV9fdTMyCVJlcGFyc2VUYWc7CisJX191MTYJUmVwYXJzZURhdGFMZW5ndGg7CisJX191MTYJUmVzZXJ2ZWQ7CisJX191MTYJQWx0TmFtZU9mZnNldDsKKwlfX3UxNglBbHROYW1lTGVuOworCV9fdTE2CVRhcmdldE5hbWVPZmZzZXQ7CisJX191MTYJVGFyZ2V0TmFtZUxlbjsKKwljaGFyCUxpbmtOYW1lc0J1ZlsxXTsKK307CisKK3N0cnVjdCBjaWZzX3F1b3RhX2RhdGEgeworCV9fdTMyCXJzcnZkMTsgIC8qIDAgKi8KKwlfX3UzMglzaWRfc2l6ZTsKKwlfX3U2NAlyc3J2ZDI7ICAvKiAwICovCisJX191NjQJc3BhY2VfdXNlZDsKKwlfX3U2NAlzb2Z0X2xpbWl0OworCV9fdTY0CWhhcmRfbGltaXQ7CisJY2hhcglzaWRbMV07ICAvKiB2YXJpYWJsZSBzaXplPyAqLworfTsKKworLyogcXVvdGEgc3ViIGNvbW1hbmRzICovCisjZGVmaW5lIFFVT1RBX0xJU1RfQ09OVElOVUUJICAgIDAKKyNkZWZpbmUgUVVPVEFfTElTVF9TVEFSVAkweDEwMAorI2RlZmluZSBRVU9UQV9GT1JfU0lECQkweDEwMQorCitzdHJ1Y3QgdHJhbnMyX3JlcSB7CisJLyogc3RydWN0IHNtYl9oZHIgaGRyIHByZWNlZGVzLiBTZXQgd2N0ID0gMTQrICovCisJX19sZTE2IFRvdGFsUGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IFRvdGFsRGF0YUNvdW50OworCV9fbGUxNiBNYXhQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMTYgTWF4RGF0YUNvdW50OworCV9fdTggTWF4U2V0dXBDb3VudDsKKwlfX3U4IFJlc2VydmVkOworCV9fbGUxNiBGbGFnczsKKwlfX2xlMzIgVGltZW91dDsKKwlfX3UxNiBSZXNlcnZlZDI7CisJX19sZTE2IFBhcmFtZXRlckNvdW50OworCV9fbGUxNiBQYXJhbWV0ZXJPZmZzZXQ7CisJX19sZTE2IERhdGFDb3VudDsKKwlfX2xlMTYgRGF0YU9mZnNldDsKKwlfX3U4IFNldHVwQ291bnQ7CisJX191OCBSZXNlcnZlZDM7CisJX19sZTE2IFN1YkNvbW1hbmQ7IC8qIDFzdCBzZXR1cCB3b3JkIC0gU2V0dXBDb3VudCB3b3JkcyBmb2xsb3cgKi8KKwlfX2xlMTYgQnl0ZUNvdW50OworfTsKKworc3RydWN0IHNtYl90Ml9yZXEgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsKKwlzdHJ1Y3QgdHJhbnMyX3JlcSB0Ml9yZXE7Cit9OworCitzdHJ1Y3QgdHJhbnMyX3Jlc3AgeworCS8qIHN0cnVjdCBzbWJfaGRyIGhkciBwcmVjZWRlcy4gTm90ZSB3Y3QgPSAxMCArIHNldHVwIGNvdW50ICovCisJX19sZTE2IFRvdGFsUGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IFRvdGFsRGF0YUNvdW50OworCV9fdTE2IFJlc2VydmVkOworCV9fbGUxNiBQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMTYgUGFyYW1ldGVyT2Zmc2V0OworCV9fbGUxNiBQYXJhbWV0ZXJEaXNwbGFjZW1lbnQ7CisJX19sZTE2IERhdGFDb3VudDsKKwlfX2xlMTYgRGF0YU9mZnNldDsKKwlfX2xlMTYgRGF0YURpc3BsYWNlbWVudDsKKwlfX3U4IFNldHVwQ291bnQ7CisJX191OCBSZXNlcnZlZDE7CisJLyogU2V0dXBXb3Jkc1tTZXR1cENvdW50XTsKKwlfX3UxNiBCeXRlQ291bnQ7CisJX191MTYgUmVzZXJ2ZWQyOyovCQorCS8qIGRhdGEgYXJlYSBmb2xsb3dzICovCit9OworCitzdHJ1Y3Qgc21iX3QyX3JzcCB7CisJc3RydWN0IHNtYl9oZHIgaGRyOworCXN0cnVjdCB0cmFuczJfcmVzcCB0Ml9yc3A7Cit9OworCisvKiBQYXRoSW5mby9GaWxlSW5mbyBpbmZvbGV2ZWxzICovCisjZGVmaW5lIFNNQl9JTkZPX1NUQU5EQVJEICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU01CX1NFVF9GSUxFX0VBICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBTTUJfUVVFUllfRklMRV9FQV9TSVpFICAgICAgICAgICAgICAyCisjZGVmaW5lIFNNQl9JTkZPX1FVRVJZX0VBU19GUk9NX0xJU1QgICAgICAgIDMKKyNkZWZpbmUgU01CX0lORk9fUVVFUllfQUxMX0VBUyAgICAgICAgICAgICAgNAorI2RlZmluZSBTTUJfSU5GT19JU19OQU1FX1ZBTElEICAgICAgICAgICAgICA2CisjZGVmaW5lIFNNQl9RVUVSWV9GSUxFX0JBU0lDX0lORk8gICAgICAgMHgxMDEKKyNkZWZpbmUgU01CX1FVRVJZX0ZJTEVfU1RBTkRBUkRfSU5GTyAgICAweDEwMgorI2RlZmluZSBTTUJfUVVFUllfRklMRV9FQV9JTkZPICAgICAgICAgIDB4MTAzCisjZGVmaW5lIFNNQl9RVUVSWV9GSUxFX05BTUVfSU5GTyAgICAgICAgMHgxMDQKKyNkZWZpbmUgU01CX1FVRVJZX0ZJTEVfQUxMT0NBVElPTl9JTkZPICAweDEwNQorI2RlZmluZSBTTUJfUVVFUllfRklMRV9FTkRfT0ZfRklMRUlORk8gIDB4MTA2CisjZGVmaW5lIFNNQl9RVUVSWV9GSUxFX0FMTF9JTkZPICAgICAgICAgMHgxMDcKKyNkZWZpbmUgU01CX1FVRVJZX0FMVF9OQU1FX0lORk8gICAgICAgICAweDEwOAorI2RlZmluZSBTTUJfUVVFUllfRklMRV9TVFJFQU1fSU5GTyAgICAgIDB4MTA5CisjZGVmaW5lIFNNQl9RVUVSWV9GSUxFX0NPTVBSRVNTSU9OX0lORk8gMHgxMEIKKyNkZWZpbmUgU01CX1FVRVJZX0ZJTEVfVU5JWF9CQVNJQyAgICAgICAweDIwMAorI2RlZmluZSBTTUJfUVVFUllfRklMRV9VTklYX0xJTksgICAgICAgIDB4MjAxCisjZGVmaW5lIFNNQl9RVUVSWV9QT1NJWF9BQ0wgICAgICAgICAgICAgMHgyMDQKKyNkZWZpbmUgU01CX1FVRVJZX1hBVFRSICAgICAgICAgICAgICAgICAweDIwNQorI2RlZmluZSBTTUJfUVVFUllfQVRUUl9GTEFHUyAgICAgICAgICAgIDB4MjA2ICAvKiBhcHBlbmQsaW1tdXRhYmxlIGV0Yy4gKi8KKyNkZWZpbmUgU01CX1FVRVJZX0ZJTEVfSU5URVJOQUxfSU5GTyAgICAweDNlZQorI2RlZmluZSBTTUJfUVVFUllfRklMRV9BQ0NFU1NfSU5GTyAgICAgIDB4M2YwCisjZGVmaW5lIFNNQl9RVUVSWV9GSUxFX05BTUVfSU5GTzIgICAgICAgMHgzZjEgLyogMHgzMCBieXRlcyAqLworI2RlZmluZSBTTUJfUVVFUllfRklMRV9QT1NJVElPTl9JTkZPICAgIDB4M2Y2IAorI2RlZmluZSBTTUJfUVVFUllfRklMRV9NT0RFX0lORk8gICAgICAgIDB4M2Y4CisjZGVmaW5lIFNNQl9RVUVSWV9GSUxFX0FMR05fSU5GTyAgICAgICAgMHgzZjkgCisKKworI2RlZmluZSBTTUJfU0VUX0ZJTEVfQkFTSUNfSU5GTwkgICAgICAgIDB4MTAxCisjZGVmaW5lIFNNQl9TRVRfRklMRV9ESVNQT1NJVElPTl9JTkZPICAgMHgxMDIKKyNkZWZpbmUgU01CX1NFVF9GSUxFX0FMTE9DQVRJT05fSU5GTyAgICAweDEwMworI2RlZmluZSBTTUJfU0VUX0ZJTEVfRU5EX09GX0ZJTEVfSU5GTyAgIDB4MTA0CisjZGVmaW5lIFNNQl9TRVRfRklMRV9VTklYX0JBU0lDICAgICAgICAgMHgyMDAKKyNkZWZpbmUgU01CX1NFVF9GSUxFX1VOSVhfTElOSyAgICAgICAgICAweDIwMQorI2RlZmluZSBTTUJfU0VUX0ZJTEVfVU5JWF9ITElOSyAgICAgICAgIDB4MjAzCisjZGVmaW5lIFNNQl9TRVRfUE9TSVhfQUNMICAgICAgICAgICAgICAgMHgyMDQKKyNkZWZpbmUgU01CX1NFVF9YQVRUUiAgICAgICAgICAgICAgICAgICAweDIwNQorI2RlZmluZSBTTUJfU0VUX0FUVFJfRkxBR1MgICAgICAgICAgICAgIDB4MjA2ICAvKiBhcHBlbmQsIGltbXV0YWJsZSBldGMuICovCisjZGVmaW5lIFNNQl9TRVRfRklMRV9CQVNJQ19JTkZPMiAgICAgICAgMHgzZWMKKyNkZWZpbmUgU01CX1NFVF9GSUxFX1JFTkFNRV9JTkZPUk1BVElPTiAweDNmMiAvKiBCQiBjaGVjayBpZiBxcGF0aGluZm8gbGV2ZWwgdG9vICovCisjZGVmaW5lIFNNQl9GSUxFX0FMTF9JTkZPMiAgICAgICAgICAgICAgMHgzZmEKKyNkZWZpbmUgU01CX1NFVF9GSUxFX0FMTE9DQVRJT05fSU5GTzIgICAweDNmYgorI2RlZmluZSBTTUJfU0VUX0ZJTEVfRU5EX09GX0ZJTEVfSU5GTzIgIDB4M2ZjCisjZGVmaW5lIFNNQl9GSUxFX01PVkVfQ0xVU1RFUl9JTkZPICAgICAgMHg0MDcKKyNkZWZpbmUgU01CX0ZJTEVfUVVPVEFfSU5GTyAgICAgICAgICAgICAweDQwOAorI2RlZmluZSBTTUJfRklMRV9SRVBBUlNFUE9JTlRfSU5GTyAgICAgIDB4NDA5CisjZGVmaW5lIFNNQl9GSUxFX01BWElNVU1fSU5GTyAgICAgICAgICAgMHg0MGQKKworLyogRmluZCBGaWxlIGluZm9sZXZlbHMgKi8KKyNkZWZpbmUgU01CX0ZJTkRfRklMRV9ESVJFQ1RPUllfSU5GTyAgICAgIDB4MTAxCisjZGVmaW5lIFNNQl9GSU5EX0ZJTEVfRlVMTF9ESVJFQ1RPUllfSU5GTyAweDEwMgorI2RlZmluZSBTTUJfRklORF9GSUxFX05BTUVTX0lORk8gICAgICAgICAgMHgxMDMKKyNkZWZpbmUgU01CX0ZJTkRfRklMRV9CT1RIX0RJUkVDVE9SWV9JTkZPIDB4MTA0CisjZGVmaW5lIFNNQl9GSU5EX0ZJTEVfSURfRlVMTF9ESVJfSU5GTyAgICAweDEwNQorI2RlZmluZSBTTUJfRklORF9GSUxFX0lEX0JPVEhfRElSX0lORk8gICAgMHgxMDYKKyNkZWZpbmUgU01CX0ZJTkRfRklMRV9VTklYICAgICAgICAgICAgICAgIDB4MjAyCisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3FwaV9yZXEgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTQrICovCisJX19sZTE2IFRvdGFsUGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IFRvdGFsRGF0YUNvdW50OworCV9fbGUxNiBNYXhQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMTYgTWF4RGF0YUNvdW50OworCV9fdTggTWF4U2V0dXBDb3VudDsKKwlfX3U4IFJlc2VydmVkOworCV9fbGUxNiBGbGFnczsKKwlfX2xlMzIgVGltZW91dDsKKwlfX3UxNiBSZXNlcnZlZDI7CisJX19sZTE2IFBhcmFtZXRlckNvdW50OworCV9fbGUxNiBQYXJhbWV0ZXJPZmZzZXQ7CisJX19sZTE2IERhdGFDb3VudDsKKwlfX2xlMTYgRGF0YU9mZnNldDsKKwlfX3U4IFNldHVwQ291bnQ7CisJX191OCBSZXNlcnZlZDM7CisJX19sZTE2IFN1YkNvbW1hbmQ7CS8qIG9uZSBzZXR1cCB3b3JkICovCisJX19sZTE2IEJ5dGVDb3VudDsKKwlfX3U4IFBhZDsKKwlfX2xlMTYgSW5mb3JtYXRpb25MZXZlbDsKKwlfX3UzMiBSZXNlcnZlZDQ7CisJY2hhciBGaWxlTmFtZVsxXTsKK30gVFJBTlNBQ1RJT04yX1FQSV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3FwaV9yc3AgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTAgKyBTZXR1cENvdW50ICovCisJc3RydWN0IHRyYW5zMl9yZXNwIHQyOworCV9fdTE2IEJ5dGVDb3VudDsKKwlfX3UxNiBSZXNlcnZlZDI7CS8qIHBhcmFtZXRlciB3b3JkIHJlc2VydmVkIC0gcHJlc2VudCBmb3IgaW5mb2xldmVscyA+IDEwMCAqLworfSBUUkFOU0FDVElPTjJfUVBJX1JTUDsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc3BpX3JlcSB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxNSAqLworCV9fbGUxNiBUb3RhbFBhcmFtZXRlckNvdW50OworCV9fbGUxNiBUb3RhbERhdGFDb3VudDsKKwlfX2xlMTYgTWF4UGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IE1heERhdGFDb3VudDsKKwlfX3U4IE1heFNldHVwQ291bnQ7CisJX191OCBSZXNlcnZlZDsKKwlfX2xlMTYgRmxhZ3M7CisJX19sZTMyIFRpbWVvdXQ7CisJX191MTYgUmVzZXJ2ZWQyOworCV9fbGUxNiBQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMTYgUGFyYW1ldGVyT2Zmc2V0OworCV9fbGUxNiBEYXRhQ291bnQ7CisJX19sZTE2IERhdGFPZmZzZXQ7CisJX191OCBTZXR1cENvdW50OworCV9fdTggUmVzZXJ2ZWQzOworCV9fbGUxNiBTdWJDb21tYW5kOwkvKiBvbmUgc2V0dXAgd29yZCAqLworCV9fbGUxNiBCeXRlQ291bnQ7CisJX191OCBQYWQ7CisJX191MTYgUGFkMTsKKwlfX2xlMTYgSW5mb3JtYXRpb25MZXZlbDsKKwlfX3UzMiBSZXNlcnZlZDQ7CisJY2hhciBGaWxlTmFtZVsxXTsKK30gVFJBTlNBQ1RJT04yX1NQSV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NwaV9yc3AgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTAgKyBTZXR1cENvdW50ICovCisJc3RydWN0IHRyYW5zMl9yZXNwIHQyOworCV9fdTE2IEJ5dGVDb3VudDsKKwlfX3UxNiBSZXNlcnZlZDI7CS8qIHBhcmFtZXRlciB3b3JkIHJlc2VydmVkIC0gcHJlc2VudCBmb3IgaW5mb2xldmVscyA+IDEwMCAqLworfSBUUkFOU0FDVElPTjJfU1BJX1JTUDsKKworc3RydWN0IHNldF9maWxlX3JlbmFtZSB7CisJX19sZTMyIG92ZXJ3cml0ZTsgICAvKiAxID0gb3ZlcndyaXRlIGRlc3QgKi8KKwlfX3UzMiByb290X2ZpZDsgICAvKiB6ZXJvICovCisJX19sZTMyIHRhcmdldF9uYW1lX2xlbjsKKwljaGFyICB0YXJnZXRfbmFtZVswXTsgIC8qIE11c3QgYmUgdW5pY29kZSAqLworfTsKKworc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NmaV9yZXEgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTUgKi8KKwlfX2xlMTYgVG90YWxQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMTYgVG90YWxEYXRhQ291bnQ7CisJX19sZTE2IE1heFBhcmFtZXRlckNvdW50OworCV9fbGUxNiBNYXhEYXRhQ291bnQ7CisJX191OCBNYXhTZXR1cENvdW50OworCV9fdTggUmVzZXJ2ZWQ7CisJX19sZTE2IEZsYWdzOworCV9fbGUzMiBUaW1lb3V0OworCV9fdTE2IFJlc2VydmVkMjsKKwlfX2xlMTYgUGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IFBhcmFtZXRlck9mZnNldDsKKwlfX2xlMTYgRGF0YUNvdW50OworCV9fbGUxNiBEYXRhT2Zmc2V0OworCV9fdTggU2V0dXBDb3VudDsKKwlfX3U4IFJlc2VydmVkMzsKKwlfX2xlMTYgU3ViQ29tbWFuZDsJLyogb25lIHNldHVwIHdvcmQgKi8KKwlfX2xlMTYgQnl0ZUNvdW50OworCV9fdTggUGFkOworCV9fdTE2IFBhZDE7CisJX191MTYgRmlkOworCV9fbGUxNiBJbmZvcm1hdGlvbkxldmVsOworCV9fdTE2IFJlc2VydmVkNDsJCit9OworCitzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc2ZpX3JzcCB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxMCArIFNldHVwQ291bnQgKi8KKwlzdHJ1Y3QgdHJhbnMyX3Jlc3AgdDI7CisJX191MTYgQnl0ZUNvdW50OworCV9fdTE2IFJlc2VydmVkMjsJLyogcGFyYW1ldGVyIHdvcmQgcmVzZXJ2ZWQgLSBwcmVzZW50IGZvciBpbmZvbGV2ZWxzID4gMTAwICovCit9OworCisKKy8qCisgKiBGbGFncyBvbiBUMiBGSU5ERklSU1QgYW5kIEZJTkRORVhUIAorICovCisjZGVmaW5lIENJRlNfU0VBUkNIX0NMT1NFX0FMV0FZUyAgMHgwMDAxCisjZGVmaW5lIENJRlNfU0VBUkNIX0NMT1NFX0FUX0VORCAgMHgwMDAyCisjZGVmaW5lIENJRlNfU0VBUkNIX1JFVFVSTl9SRVNVTUUgMHgwMDA0CisjZGVmaW5lIENJRlNfU0VBUkNIX0NPTlRJTlVFX0ZST01fTEFTVCAweDAwMDgKKyNkZWZpbmUgQ0lGU19TRUFSQ0hfQkFDS1VQX1NFQVJDSCAweDAwMTAKKworLyoKKyAqIFNpemUgb2YgdGhlIHJlc3VtZSBrZXkgb24gRklOREZJUlNUIGFuZCBGSU5ETkVYVCBjYWxscworICovCisjZGVmaW5lIENJRlNfU01CX1JFU1VNRV9LRVlfU0laRSA0CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX2ZmaXJzdF9yZXEgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTUgKi8KKwlfX2xlMTYgVG90YWxQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMTYgVG90YWxEYXRhQ291bnQ7CisJX19sZTE2IE1heFBhcmFtZXRlckNvdW50OworCV9fbGUxNiBNYXhEYXRhQ291bnQ7CisJX191OCBNYXhTZXR1cENvdW50OworCV9fdTggUmVzZXJ2ZWQ7CisJX19sZTE2IEZsYWdzOworCV9fbGUzMiBUaW1lb3V0OworCV9fdTE2IFJlc2VydmVkMjsKKwlfX2xlMTYgUGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IFBhcmFtZXRlck9mZnNldDsKKwlfX2xlMTYgRGF0YUNvdW50OworCV9fbGUxNiBEYXRhT2Zmc2V0OworCV9fdTggU2V0dXBDb3VudDsJLyogb25lICovCisJX191OCBSZXNlcnZlZDM7CisJX19sZTE2IFN1YkNvbW1hbmQ7CS8qIFRSQU5TMl9GSU5EX0ZJUlNUICovCisJX19sZTE2IEJ5dGVDb3VudDsKKwlfX3U4IFBhZDsKKwlfX2xlMTYgU2VhcmNoQXR0cmlidXRlczsKKwlfX2xlMTYgU2VhcmNoQ291bnQ7CisJX19sZTE2IFNlYXJjaEZsYWdzOworCV9fbGUxNiBJbmZvcm1hdGlvbkxldmVsOworCV9fbGUzMiBTZWFyY2hTdG9yYWdlVHlwZTsKKwljaGFyIEZpbGVOYW1lWzFdOworfSBUUkFOU0FDVElPTjJfRkZJUlNUX1JFUTsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfZmZpcnN0X3JzcCB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxMCAqLworCXN0cnVjdCB0cmFuczJfcmVzcCB0MjsKKwlfX3UxNiBCeXRlQ291bnQ7Cit9IFRSQU5TQUNUSU9OMl9GRklSU1RfUlNQOworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9mZmlyc3RfcnNwX3Bhcm1zIHsKKwlfX3UxNiBTZWFyY2hIYW5kbGU7CisJX19sZTE2IFNlYXJjaENvdW50OworCV9fbGUxNiBFbmRvZlNlYXJjaDsKKwlfX2xlMTYgRUFFcnJvck9mZnNldDsKKwlfX2xlMTYgTGFzdE5hbWVPZmZzZXQ7Cit9IFQyX0ZGSVJTVF9SU1BfUEFSTVM7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX2ZuZXh0X3JlcSB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxNSAqLworCV9fbGUxNiBUb3RhbFBhcmFtZXRlckNvdW50OworCV9fbGUxNiBUb3RhbERhdGFDb3VudDsKKwlfX2xlMTYgTWF4UGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IE1heERhdGFDb3VudDsKKwlfX3U4IE1heFNldHVwQ291bnQ7CisJX191OCBSZXNlcnZlZDsKKwlfX2xlMTYgRmxhZ3M7CisJX19sZTMyIFRpbWVvdXQ7CisJX191MTYgUmVzZXJ2ZWQyOworCV9fbGUxNiBQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMTYgUGFyYW1ldGVyT2Zmc2V0OworCV9fbGUxNiBEYXRhQ291bnQ7CisJX19sZTE2IERhdGFPZmZzZXQ7CisJX191OCBTZXR1cENvdW50OwkvKiBvbmUgKi8KKwlfX3U4IFJlc2VydmVkMzsKKwlfX2xlMTYgU3ViQ29tbWFuZDsJLyogVFJBTlMyX0ZJTkRfTkVYVCAqLworCV9fbGUxNiBCeXRlQ291bnQ7CisJX191OCBQYWQ7CisJX191MTYgU2VhcmNoSGFuZGxlOworCV9fbGUxNiBTZWFyY2hDb3VudDsKKwlfX2xlMTYgSW5mb3JtYXRpb25MZXZlbDsKKwlfX3UzMiBSZXN1bWVLZXk7CisJX19sZTE2IFNlYXJjaEZsYWdzOworCWNoYXIgUmVzdW1lRmlsZU5hbWVbMV07Cit9IFRSQU5TQUNUSU9OMl9GTkVYVF9SRVE7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX2ZuZXh0X3JzcCB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxMCAqLworCXN0cnVjdCB0cmFuczJfcmVzcCB0MjsKKwlfX3UxNiBCeXRlQ291bnQ7Cit9IFRSQU5TQUNUSU9OMl9GTkVYVF9SU1A7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX2ZuZXh0X3JzcF9wYXJtcyB7CisJX19sZTE2IFNlYXJjaENvdW50OworCV9fbGUxNiBFbmRvZlNlYXJjaDsKKwlfX2xlMTYgRUFFcnJvck9mZnNldDsKKwlfX2xlMTYgTGFzdE5hbWVPZmZzZXQ7Cit9IFQyX0ZORVhUX1JTUF9QQVJNUzsKKworLyogUUZTSW5mbyBMZXZlbHMgKi8KKyNkZWZpbmUgU01CX0lORk9fQUxMT0NBVElPTiAgICAgICAgIDEKKyNkZWZpbmUgU01CX0lORk9fVk9MVU1FICAgICAgICAgICAgIDIKKyNkZWZpbmUgU01CX1FVRVJZX0ZTX1ZPTFVNRV9JTkZPICAgIDB4MTAyCisjZGVmaW5lIFNNQl9RVUVSWV9GU19TSVpFX0lORk8gICAgICAweDEwMworI2RlZmluZSBTTUJfUVVFUllfRlNfREVWSUNFX0lORk8gICAgMHgxMDQKKyNkZWZpbmUgU01CX1FVRVJZX0ZTX0FUVFJJQlVURV9JTkZPIDB4MTA1CisjZGVmaW5lIFNNQl9RVUVSWV9DSUZTX1VOSVhfSU5GTyAgICAweDIwMAorI2RlZmluZSBTTUJfUVVFUllfUE9TSVhfRlNfSU5GTyAgICAgMHgyMDEKKyNkZWZpbmUgU01CX1FVRVJZX0xBQkVMX0lORk8gICAgICAgIDB4M2VhCisjZGVmaW5lIFNNQl9RVUVSWV9GU19RVU9UQV9JTkZPICAgICAweDNlZQorI2RlZmluZSBTTUJfUVVFUllfRlNfRlVMTF9TSVpFX0lORk8gMHgzZWYKKyNkZWZpbmUgU01CX1FVRVJZX09CSkVDVElEX0lORk8gICAgIDB4M2YwCisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3Fmc2lfcmVxIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDE0KyAqLworCV9fbGUxNiBUb3RhbFBhcmFtZXRlckNvdW50OworCV9fbGUxNiBUb3RhbERhdGFDb3VudDsKKwlfX2xlMTYgTWF4UGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IE1heERhdGFDb3VudDsKKwlfX3U4IE1heFNldHVwQ291bnQ7CisJX191OCBSZXNlcnZlZDsKKwlfX2xlMTYgRmxhZ3M7CisJX19sZTMyIFRpbWVvdXQ7CisJX191MTYgUmVzZXJ2ZWQyOworCV9fbGUxNiBQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMTYgUGFyYW1ldGVyT2Zmc2V0OworCV9fbGUxNiBEYXRhQ291bnQ7CisJX19sZTE2IERhdGFPZmZzZXQ7CisJX191OCBTZXR1cENvdW50OworCV9fdTggUmVzZXJ2ZWQzOworCV9fbGUxNiBTdWJDb21tYW5kOwkvKiBvbmUgc2V0dXAgd29yZCAqLworCV9fbGUxNiBCeXRlQ291bnQ7CisJX191OCBQYWQ7CisJX19sZTE2IEluZm9ybWF0aW9uTGV2ZWw7Cit9IFRSQU5TQUNUSU9OMl9RRlNJX1JFUTsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9xZnNpX3JzcCB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxMCArIFNldHVwQ291bnQgKi8KKwlzdHJ1Y3QgdHJhbnMyX3Jlc3AgdDI7CisJX191MTYgQnl0ZUNvdW50OworCV9fdTggUGFkOwkJLyogbWF5IGJlIHRocmVlIGJ5dGVzICovLyogZm9sbG93ZWQgYnkgZGF0YSBhcmVhICovCit9IFRSQU5TQUNUSU9OMl9RRlNJX1JTUDsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfZ2V0X2Rmc19yZWZlcl9yZXEgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTUgKi8KKwlfX2xlMTYgVG90YWxQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMTYgVG90YWxEYXRhQ291bnQ7CisJX19sZTE2IE1heFBhcmFtZXRlckNvdW50OworCV9fbGUxNiBNYXhEYXRhQ291bnQ7CisJX191OCBNYXhTZXR1cENvdW50OworCV9fdTggUmVzZXJ2ZWQ7CisJX19sZTE2IEZsYWdzOworCV9fbGUzMiBUaW1lb3V0OworCV9fdTE2IFJlc2VydmVkMjsKKwlfX2xlMTYgUGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IFBhcmFtZXRlck9mZnNldDsKKwlfX2xlMTYgRGF0YUNvdW50OworCV9fbGUxNiBEYXRhT2Zmc2V0OworCV9fdTggU2V0dXBDb3VudDsKKwlfX3U4IFJlc2VydmVkMzsKKwlfX2xlMTYgU3ViQ29tbWFuZDsJLyogb25lIHNldHVwIHdvcmQgKi8KKwlfX2xlMTYgQnl0ZUNvdW50OworCV9fdTggUGFkWzNdOwkJLyogV2luMksgaGFzIHNlbnQgMHgwRjAxIChtYXggcmVzcCBsZW5ndGggcGVyaGFwcz8pIGZvbGxvd2VkIGJ5IG9uZSBieXRlIHBhZCAtIGRvZXNuJ3Qgc2VlbSB0byBtYXR0ZXIgdGhvdWdoICovCisJX19sZTE2IE1heFJlZmVycmFsTGV2ZWw7CisJY2hhciBSZXF1ZXN0RmlsZU5hbWVbMV07Cit9IFRSQU5TQUNUSU9OMl9HRVRfREZTX1JFRkVSX1JFUTsKKwordHlwZWRlZiBzdHJ1Y3QgZGZzX3JlZmVycmFsX2xldmVsXzMgeworCV9fbGUxNiBWZXJzaW9uTnVtYmVyOworCV9fbGUxNiBSZWZlcnJhbFNpemU7CisJX19sZTE2IFNlcnZlclR5cGU7CS8qIDB4MDAwMSA9IENJRlMgc2VydmVyICovCisJX19sZTE2IFJlZmVycmFsRmxhZ3M7CS8qIG9yIHByb3hpbWl0eSAtIG5vdCBjbGVhciB3aGljaCBzaW5jZSBhbHdheXMgc2V0IHRvIHplcm8gLSBTTklBIHNwZWMgc2F5cyAweDAxIG1lYW5zIHN0cmlwIG9mZiBQYXRoQ29uc3VtZWQgY2hhcnMgYmVmb3JlIHN1Ym1pdHRpbmcgUmVxdWVzdEZpbGVOYW1lIHRvIHJlbW90ZSBub2RlICovCisJX19sZTE2IFRpbWVUb0xpdmU7CisJX19sZTE2IFByb3hpbWl0eTsKKwlfX2xlMTYgRGZzUGF0aE9mZnNldDsKKwlfX2xlMTYgRGZzQWx0ZXJuYXRlUGF0aE9mZnNldDsKKwlfX2xlMTYgTmV0d29ya0FkZHJlc3NPZmZzZXQ7Cit9IFJFRkVSUkFMMzsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9nZXRfZGZzX3JlZmVyX3JzcCB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxMCAqLworCXN0cnVjdCB0cmFuczJfcmVzcCB0MjsKKwlfX3UxNiBCeXRlQ291bnQ7CisJX191OCBQYWQ7CisJX19sZTE2IFBhdGhDb25zdW1lZDsKKwlfX2xlMTYgTnVtYmVyT2ZSZWZlcnJhbHM7CisJX19sZTE2IERGU0ZsYWdzOworCV9fdTE2IFBhZDI7CisJUkVGRVJSQUwzIHJlZmVycmFsc1sxXTsJLyogYXJyYXkgb2YgbGV2ZWwgMyBkZnNfcmVmZXJyYWwgc3RydWN0dXJlcyAqLworCS8qIGZvbGxvd2VkIGJ5IHRoZSBzdHJpbmdzIHBvaW50ZWQgdG8gYnkgdGhlIHJlZmVycmFsIHN0cnVjdHVyZXMgKi8KK30gVFJBTlNBQ1RJT04yX0dFVF9ERlNfUkVGRVJfUlNQOworCisvKiBERlMgRmxhZ3MgKi8KKyNkZWZpbmUgREZTUkVGX1JFRkVSUkFMX1NFUlZFUiAgMHgwMDAxCisjZGVmaW5lIERGU1JFRl9TVE9SQUdFX1NFUlZFUiAgIDB4MDAwMgorCisvKiBJT0NUTCBpbmZvcm1hdGlvbiAqLworLyogTGlzdCBvZiBpb2N0bCBmdW5jdGlvbiBjb2RlcyB0aGF0IGxvb2sgdG8gYmUgb2YgaW50ZXJlc3QgdG8gcmVtb3RlIGNsaWVudHMgbGlrZSB0aGlzLiAqLworLyogTmVlZCB0byBkbyBzb21lIGV4cGVyaW1lbnRhdGlvbiB0byBtYWtlIHN1cmUgdGhleSBhbGwgd29yayByZW1vdGVseS4gICAgICAgICAgICAgICAgICAqLworLyogU29tZSBvZiB0aGUgZm9sbG93aW5nIHN1Y2ggYXMgdGhlIGVuY3J5cHRpb24vY29tcHJlc3Npb24gb25lcyB3b3VsZCBiZSAgICAgICAgICAgICAgICAqLworLyogaW52b2tlZCBmcm9tIHRvb2xzIHZpYSBhIHNwZWNpYWxpemVkIGhvb2sgaW50byB0aGUgVkZTIHJhdGhlciB0aGFuIHZpYSB0aGUgICAgICAgICAgICAqLworLyogc3RhbmRhcmQgdmZzIGVudHJ5IHBvaW50cyAqLworI2RlZmluZSBGU0NUTF9SRVFVRVNUX09QTE9DS19MRVZFTF8xIDB4MDAwOTAwMDAKKyNkZWZpbmUgRlNDVExfUkVRVUVTVF9PUExPQ0tfTEVWRUxfMiAweDAwMDkwMDA0CisjZGVmaW5lIEZTQ1RMX1JFUVVFU1RfQkFUQ0hfT1BMT0NLICAgMHgwMDA5MDAwOAorI2RlZmluZSBGU0NUTF9MT0NLX1ZPTFVNRSAgICAgICAgICAgIDB4MDAwOTAwMTgKKyNkZWZpbmUgRlNDVExfVU5MT0NLX1ZPTFVNRSAgICAgICAgICAweDAwMDkwMDFDCisjZGVmaW5lIEZTQ1RMX0dFVF9DT01QUkVTU0lPTiAgICAgICAgMHgwMDA5MDAzQworI2RlZmluZSBGU0NUTF9TRVRfQ09NUFJFU1NJT04gICAgICAgIDB4MDAwOUMwNDAKKyNkZWZpbmUgRlNDVExfUkVRVUVTVF9GSUxURVJfT1BMT0NLICAweDAwMDkwMDhDCisjZGVmaW5lIEZTQ1RMX0ZJTEVTWVNfR0VUX1NUQVRJU1RJQ1MgMHgwMDA5MDA5MAorI2RlZmluZSBGU0NUTF9TRVRfUkVQQVJTRV9QT0lOVCAgICAgIDB4MDAwOTAwQTQKKyNkZWZpbmUgRlNDVExfR0VUX1JFUEFSU0VfUE9JTlQgICAgICAweDAwMDkwMEE4CisjZGVmaW5lIEZTQ1RMX0RFTEVURV9SRVBBUlNFX1BPSU5UICAgMHgwMDA5MDBBQworI2RlZmluZSBGU0NUTF9TRVRfU1BBUlNFICAgICAgICAgICAgIDB4MDAwOTAwQzQKKyNkZWZpbmUgRlNDVExfU0VUX1pFUk9fREFUQSAgICAgICAgICAweDAwMDkwMEM4CisjZGVmaW5lIEZTQ1RMX1NFVF9FTkNSWVBUSU9OICAgICAgICAgMHgwMDA5MDBENworI2RlZmluZSBGU0NUTF9FTkNSWVBUSU9OX0ZTQ1RMX0lPICAgIDB4MDAwOTAwREIKKyNkZWZpbmUgRlNDVExfV1JJVEVfUkFXX0VOQ1JZUFRFRCAgICAweDAwMDkwMERGCisjZGVmaW5lIEZTQ1RMX1JFQURfUkFXX0VOQ1JZUFRFRCAgICAgMHgwMDA5MDBFMworI2RlZmluZSBGU0NUTF9TSVNfQ09QWUZJTEUgICAgICAgICAgIDB4MDAwOTAxMDAKKyNkZWZpbmUgRlNDVExfU0lTX0xJTktfRklMRVMgICAgICAgICAweDAwMDlDMTA0CisKKyNkZWZpbmUgSU9fUkVQQVJTRV9UQUdfTU9VTlRfUE9JTlQgICAweEEwMDAwMDAzCisjZGVmaW5lIElPX1JFUEFSU0VfVEFHX0hTTSAgICAgICAgICAgMHhDMDAwMDAwNAorI2RlZmluZSBJT19SRVBBUlNFX1RBR19TSVMgICAgICAgICAgIDB4ODAwMDAwMDcKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFsbCBzdHJ1Y3RzIGZvciBldmVyeXRoaW5nIGFib3ZlIHRoZSBTTUIgUERVcyB0aGVtc2VsdmVzCisgKiAoc3VjaCBhcyB0aGUgVDIgbGV2ZWwgc3BlY2lmaWMgZGF0YSkgZ28gaGVyZSAgICAgICAgICAgICAgICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qCisgKiBJbmZvcm1hdGlvbiBvbiBhIHNlcnZlcgorICovCisKK3N0cnVjdCBzZXJ2ZXJJbmZvIHsKKwljaGFyIG5hbWVbMTZdOworCXVuc2lnbmVkIGNoYXIgdmVyc2lvbk1ham9yOworCXVuc2lnbmVkIGNoYXIgdmVyc2lvbk1pbm9yOworCXVuc2lnbmVkIGxvbmcgdHlwZTsKKwl1bnNpZ25lZCBpbnQgY29tbWVudE9mZnNldDsKK307CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIHJldHVybmVkIG9uIGEgTmV0U2hhcmVFbnVtCisgKiB3aXRoIGxldmVsICI5MCIgKHg1QSkKKyAqLworCitzdHJ1Y3Qgc2hhcmVJbmZvIHsKKwljaGFyIHNoYXJlTmFtZVsxM107CisJY2hhciBwYWQ7CisJdW5zaWduZWQgc2hvcnQgdHlwZTsKKwl1bnNpZ25lZCBpbnQgY29tbWVudE9mZnNldDsKK307CisKK3N0cnVjdCBhbGlhc0luZm8geworCWNoYXIgYWxpYXNOYW1lWzldOworCWNoYXIgcGFkOworCXVuc2lnbmVkIGludCBjb21tZW50T2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgdHlwZVsyXTsKK307CisKK3N0cnVjdCBhbGlhc0luZm85MiB7CisJaW50IGFsaWFzTmFtZU9mZnNldDsKKwlpbnQgc2VydmVyTmFtZU9mZnNldDsKKwlpbnQgc2hhcmVOYW1lT2Zmc2V0OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fbGU2NCBUb3RhbEFsbG9jYXRpb25Vbml0czsKKwlfX2xlNjQgRnJlZUFsbG9jYXRpb25Vbml0czsKKwlfX2xlMzIgU2VjdG9yc1BlckFsbG9jYXRpb25Vbml0OworCV9fbGUzMiBCeXRlc1BlclNlY3RvcjsKK30gRklMRV9TWVNURU1fSU5GTzsJCS8qIHNpemUgaW5mbywgbGV2ZWwgMHgxMDMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fbGUxNiBNYWpvclZlcnNpb25OdW1iZXI7CisJX19sZTE2IE1pbm9yVmVyc2lvbk51bWJlcjsKKwlfX2xlNjQgQ2FwYWJpbGl0eTsKK30gRklMRV9TWVNURU1fVU5JWF9JTkZPOwkvKiBVbml4IGV4dGVuc2lvbnMgaW5mbywgbGV2ZWwgMHgyMDAgKi8KKy8qIExpbnV4L1VuaXggZXh0ZW5zaW9ucyBjYXBhYmlsaXR5IGZsYWdzICovCisjZGVmaW5lIENJRlNfVU5JWF9GQ05UTF9DQVAgICAgICAgICAgICAgMHgwMDAwMDAwMSAvKiBzdXBwb3J0IGZvciBmY250bCBsb2NrcyAqLworI2RlZmluZSBDSUZTX1VOSVhfUE9TSVhfQUNMX0NBUCAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQ0lGU19VTklYX1hBVFRSX0NBUCAgICAgICAgICAgICAweDAwMDAwMDA0IC8qc3VwcG9ydCBmb3IgbmV3IG5hbWVzcGFjZSovCisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBGb3IgdW5kZWZpbmVkIHJlY29tbWVuZGVkIHRyYW5zZmVyIHNpemUgcmV0dXJuIC0xIGluIHRoYXQgZmllbGQgKi8KKwlfX2xlMzIgT3B0aW1hbFRyYW5zZmVyU2l6ZTsgIC8qIGJzaXplIG9uIHNvbWUgb3MsIGlvc2l6ZSBvbiBvdGhlciBvcyAqLworCV9fbGUzMiBCbG9ja1NpemU7IAorICAgIC8qIFRoZSBuZXh0IHRocmVlIGZpZWxkcyBhcmUgaW4gdGVybXMgb2YgdGhlIGJsb2NrIHNpemUuCisJKGFib3ZlKS4gSWYgYmxvY2sgc2l6ZSBpcyB1bmtub3duLCA0MDk2IHdvdWxkIGJlIGEKKwlyZWFzb25hYmxlIGJsb2NrIHNpemUgZm9yIGEgc2VydmVyIHRvIHJlcG9ydC4gCisJTm90ZSB0aGF0IHJldHVybmluZyB0aGUgYmxvY2tzL2Jsb2Nrc2F2YWlsIHJlbW92ZXMgbmVlZAorCXRvIG1ha2UgYSBzZWNvbmQgY2FsbCAodG8gUUZTSW5mbyBsZXZlbCAweDEwMyB0byBnZXQgdGhpcyBpbmZvLgorCVVzZXJCbG9ja0F2YWlsIGlzIHR5cGljYWxseSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gQmxvY2tzQXZhaWwsCisJaWYgbm8gZGlzdGluY3Rpb24gaXMgbWFkZSByZXR1cm4gdGhlIHNhbWUgdmFsdWUgaW4gZWFjaCAqLworCV9fbGU2NCBUb3RhbEJsb2NrczsKKwlfX2xlNjQgQmxvY2tzQXZhaWw7ICAgICAgIC8qIGJmcmVlICovCisJX19sZTY0IFVzZXJCbG9ja3NBdmFpbDsgICAvKiBiYXZhaWwgKi8KKyAgICAvKiBGb3IgdW5kZWZpbmVkIE5vZGUgZmllbGRzIG9yIEZTSUQgcmV0dXJuIC0xICovCisJX19sZTY0IFRvdGFsRmlsZU5vZGVzOworCV9fbGU2NCBGcmVlRmlsZU5vZGVzOworCV9fbGU2NCBGaWxlU3lzSWRlbnRpZmllcjsgICAvKiBmc2lkICovCisJLyogTkIgTmFtZWxlbiBjb21lcyBmcm9tIEZJTEVfU1lTVEVNX0FUVFJJQlVURV9JTkZPIGNhbGwgKi8KKwkvKiBOQiBmbGFncyBjYW4gY29tZSBmcm9tIEZJTEVfU1lTVEVNX0RFVklDRV9JTkZPIGNhbGwgICAqLworfSBGSUxFX1NZU1RFTV9QT1NJWF9JTkZPOworCisvKiBEZXZpY2VUeXBlIEZsYWdzICovCisjZGVmaW5lIEZJTEVfREVWSUNFX0NEX1JPTSAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBGSUxFX0RFVklDRV9DRF9ST01fRklMRV9TWVNURU0gIDB4MDAwMDAwMDMKKyNkZWZpbmUgRklMRV9ERVZJQ0VfREZTICAgICAgICAgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIEZJTEVfREVWSUNFX0RJU0sgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBGSUxFX0RFVklDRV9ESVNLX0ZJTEVfU1lTVEVNICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRklMRV9ERVZJQ0VfRklMRV9TWVNURU0gICAgICAgICAweDAwMDAwMDA5CisjZGVmaW5lIEZJTEVfREVWSUNFX05BTUVEX1BJUEUgICAgICAgICAgMHgwMDAwMDAxMQorI2RlZmluZSBGSUxFX0RFVklDRV9ORVRXT1JLICAgICAgICAgICAgIDB4MDAwMDAwMTIKKyNkZWZpbmUgRklMRV9ERVZJQ0VfTkVUV09SS19GSUxFX1NZU1RFTSAweDAwMDAwMDE0CisjZGVmaW5lIEZJTEVfREVWSUNFX05VTEwgICAgICAgICAgICAgICAgMHgwMDAwMDAxNQorI2RlZmluZSBGSUxFX0RFVklDRV9QQVJBTExFTF9QT1JUICAgICAgIDB4MDAwMDAwMTYKKyNkZWZpbmUgRklMRV9ERVZJQ0VfUFJJTlRFUiAgICAgICAgICAgICAweDAwMDAwMDE4CisjZGVmaW5lIEZJTEVfREVWSUNFX1NFUklBTF9QT1JUICAgICAgICAgMHgwMDAwMDAxYgorI2RlZmluZSBGSUxFX0RFVklDRV9TVFJFQU1TICAgICAgICAgICAgIDB4MDAwMDAwMWUKKyNkZWZpbmUgRklMRV9ERVZJQ0VfVEFQRSAgICAgICAgICAgICAgICAweDAwMDAwMDFmCisjZGVmaW5lIEZJTEVfREVWSUNFX1RBUEVfRklMRV9TWVNURU0gICAgMHgwMDAwMDAyMAorI2RlZmluZSBGSUxFX0RFVklDRV9WSVJUVUFMX0RJU0sgICAgICAgIDB4MDAwMDAwMjQKKyNkZWZpbmUgRklMRV9ERVZJQ0VfTkVUV09SS19SRURJUkVDVE9SICAweDAwMDAwMDI4CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlMzIgRGV2aWNlVHlwZTsKKwlfX2xlMzIgRGV2aWNlQ2hhcmFjdGVyaXN0aWNzOworfSBGSUxFX1NZU1RFTV9ERVZJQ0VfSU5GTzsJLyogZGV2aWNlIGluZm8sIGxldmVsIDB4MTA0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlMzIgQXR0cmlidXRlczsKKwlfX2xlMzIgTWF4UGF0aE5hbWVDb21wb25lbnRMZW5ndGg7CisJX19sZTMyIEZpbGVTeXN0ZW1OYW1lTGVuOworCWNoYXIgRmlsZVN5c3RlbU5hbWVbNTJdOyAvKiBkbyBub3QgcmVhbGx5IG5lZWQgdG8gc2F2ZSB0aGlzIC0gc28gcG90ZW50aWFsbHkgZ2V0IG9ubHkgc3Vic2V0IG9mIG5hbWUgKi8KK30gRklMRV9TWVNURU1fQVRUUklCVVRFX0lORk87CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBRdWVyeUZpbGVJbmZvL1F1ZXJ5UGF0aGluZm8gKGFsc28gZm9yIFNldFBhdGgvU2V0RmlsZSkgZGF0YSBidWZmZXIgZm9ybWF0cyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHsgLyogZGF0YSBibG9jayBlbmNvZGluZyBvZiByZXNwb25zZSB0byBsZXZlbCAyNjMgUVBhdGhJbmZvICovCisJX19sZTY0IENyZWF0aW9uVGltZTsKKwlfX2xlNjQgTGFzdEFjY2Vzc1RpbWU7CisJX19sZTY0IExhc3RXcml0ZVRpbWU7CisJX19sZTY0IENoYW5nZVRpbWU7CisJX19sZTMyIEF0dHJpYnV0ZXM7CisJX191MzIgUGFkMTsKKwlfX2xlNjQgQWxsb2NhdGlvblNpemU7CisJX19sZTY0IEVuZE9mRmlsZTsJLyogc2l6ZSBpZSBvZmZzZXQgdG8gZmlyc3QgZnJlZSBieXRlIGluIGZpbGUgKi8KKwlfX2xlMzIgTnVtYmVyT2ZMaW5rczsJLyogaGFyZCBsaW5rcyAqLworCV9fdTggRGVsZXRlUGVuZGluZzsKKwlfX3U4IERpcmVjdG9yeTsKKwlfX3UxNiBQYWQyOworCV9fdTY0IEluZGV4TnVtYmVyOworCV9fbGUzMiBFQVNpemU7CisJX19sZTMyIEFjY2Vzc0ZsYWdzOworCV9fdTY0IEluZGV4TnVtYmVyMTsKKwlfX2xlNjQgQ3VycmVudEJ5dGVPZmZzZXQ7CisJX19sZTMyIE1vZGU7CisJX19sZTMyIEFsaWdubWVudFJlcXVpcmVtZW50OworCV9fbGUzMiBGaWxlTmFtZUxlbmd0aDsKKwljaGFyIEZpbGVOYW1lWzFdOworfSBGSUxFX0FMTF9JTkZPOwkJLyogbGV2ZWwgMHgxMDcgUVBhdGhJbmZvICovCisKKy8qIGRlZmluZXMgZm9yIGVudW1lcmF0aW5nIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgVW5peCB0eXBlIGZpZWxkIGJlbG93ICovCisjZGVmaW5lIFVOSVhfRklMRSAgICAgIDAKKyNkZWZpbmUgVU5JWF9ESVIgICAgICAgMQorI2RlZmluZSBVTklYX1NZTUxJTksgICAyCisjZGVmaW5lIFVOSVhfQ0hBUkRFViAgIDMKKyNkZWZpbmUgVU5JWF9CTE9DS0RFViAgNAorI2RlZmluZSBVTklYX0ZJRk8gICAgICA1CisjZGVmaW5lIFVOSVhfU09DS0VUICAgIDYKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlNjQgRW5kT2ZGaWxlOworCV9fbGU2NCBOdW1PZkJ5dGVzOworCV9fbGU2NCBMYXN0U3RhdHVzQ2hhbmdlOyAvKlNOSUEgc3BlY3MgRENFIHRpbWUgZm9yIHRoZSAzIHRpbWUgZmllbGRzICovCisJX19sZTY0IExhc3RBY2Nlc3NUaW1lOworCV9fbGU2NCBMYXN0TW9kaWZpY2F0aW9uVGltZTsKKwlfX2xlNjQgVWlkOworCV9fbGU2NCBHaWQ7CisJX19sZTMyIFR5cGU7CisJX19sZTY0IERldk1ham9yOworCV9fbGU2NCBEZXZNaW5vcjsKKwlfX3U2NCBVbmlxdWVJZDsKKwlfX2xlNjQgUGVybWlzc2lvbnM7CisJX19sZTY0IE5saW5rczsKK30gRklMRV9VTklYX0JBU0lDX0lORk87CQkvKiBsZXZlbCAweDIwMCBRUGF0aEluZm8gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIgTGlua0Rlc3RbMV07Cit9IEZJTEVfVU5JWF9MSU5LX0lORk87CQkvKiBsZXZlbCAweDIwMSBRUGF0aEluZm8gKi8KKworLyogVGhlIGZvbGxvd2luZyB0aHJlZSBzdHJ1Y3R1cmVzIGFyZSBuZWVkZWQgb25seSBmb3IKKwlzZXR0aW5nIHRpbWUgdG8gTlQ0IGFuZCBzb21lIG9sZGVyIHNlcnZlcnMgdmlhCisJdGhlIHByaW1pdGl2ZSBET1MgdGltZSBmb3JtYXQgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlfX3UxNiBEYXk6NTsKKwlfX3UxNiBNb250aDo0OworCV9fdTE2IFllYXI6NzsKK30gU01CX0RBVEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX3UxNiBUd29TZWNvbmRzOjU7CisJX191MTYgTWludXRlczo2OworCV9fdTE2IEhvdXJzOjU7Cit9IFNNQl9USU1FOworCit0eXBlZGVmIHN0cnVjdCB7CisJX19sZTE2IENyZWF0aW9uRGF0ZTsgLyogU01CIERhdGUgc2VlIGFib3ZlICovCisJX19sZTE2IENyZWF0aW9uVGltZTsgLyogU01CIFRpbWUgKi8KKwlfX2xlMTYgTGFzdEFjY2Vzc0RhdGU7CisJX19sZTE2IExhc3RBY2Nlc3NUaW1lOworCV9fbGUxNiBMYXN0V3JpdGVEYXRlOworCV9fbGUxNiBMYXN0V3JpdGVUaW1lOworCV9fbGUzMiBEYXRhU2l6ZTsgLyogRmlsZSBTaXplIChFT0YpICovCisJX19sZTMyIEFsbG9jYXRpb25TaXplOworCV9fbGUxNiBBdHRyaWJ1dGVzOyAvKiB2ZXJpZnkgbm90IHUzMiAqLworCV9fbGUzMiBFQVNpemU7Cit9IEZJTEVfSU5GT19TVEFOREFSRDsgIC8qIGxldmVsIDEgU2V0UGF0aC9GaWxlSW5mbyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJX19sZTY0IENyZWF0aW9uVGltZTsKKwlfX2xlNjQgTGFzdEFjY2Vzc1RpbWU7CisJX19sZTY0IExhc3RXcml0ZVRpbWU7CisJX19sZTY0IENoYW5nZVRpbWU7CisJX19sZTMyIEF0dHJpYnV0ZXM7CisJX191MzIgUGFkOworfSBGSUxFX0JBU0lDX0lORk87CQkvKiBzaXplIGluZm8sIGxldmVsIDB4MTAxICovCisKK3N0cnVjdCBmaWxlX2FsbG9jYXRpb25faW5mbyB7CisJX19sZTY0IEFsbG9jYXRpb25TaXplOyAvKiBOb3RlIG9sZCBTYW1iYSBzcnZyIHJvdW5kcyB0aGlzIHVwIHRvbyBtdWNoICovCit9OwkvKiBzaXplIHVzZWQgb24gZGlzaywgbGV2ZWwgMHgxMDMgZm9yIHNldCwgMHgxMDUgZm9yIHF1ZXJ5ICovCisKK3N0cnVjdCBmaWxlX2VuZF9vZl9maWxlX2luZm8geworCV9fbGU2NCBGaWxlU2l6ZTsJCS8qIG9mZnNldCB0byBlbmQgb2YgZmlsZSAqLworfTsJLyogc2l6ZSBpbmZvLCBsZXZlbCAweDEwNCBmb3Igc2V0LCAweDEwNiBmb3IgcXVlcnkgKi8KKworc3RydWN0IGZpbGVfYWx0X25hbWVfaW5mbyB7CisJX191OCAgIGFsdF9uYW1lWzFdOworfTsgICAgICAvKiBsZXZlbCAweDAxMDggKi8KKworc3RydWN0IGZpbGVfc3RyZWFtX2luZm8geworCV9fbGUzMiBudW1iZXJfb2Zfc3RyZWFtczsgIC8qIEJCIGNoZWNrIHNpemVzIGFuZCB2ZXJpZnkgbG9jYXRpb24gKi8KKwkvKiBmb2xsb3dlZCBieSBpbmZvIG9uIHN0cmVhbXMgdGhlbXNlbHZlcyAKKwkJdTY0IHNpemU7CisJCXU2NCBhbGxvY2F0aW9uX3NpemUgCisJCXN0cmVhbSBpbmZvICovCit9OyAgICAgIC8qIGxldmVsIDB4MTA5ICovCisKK3N0cnVjdCBmaWxlX2NvbXByZXNzaW9uX2luZm8geworCV9fbGU2NCBjb21wcmVzc2VkX3NpemU7CisJX19sZTE2IGZvcm1hdDsKKwlfX3U4ICAgdW5pdF9zaGlmdDsKKwlfX3U4ICAgY2hfc2hpZnQ7CisJX191OCAgIGNsX3NoaWZ0OworCV9fdTggICBwYWRbM107Cit9OyAgICAgIC8qIGxldmVsIDB4MTBiICovCisKKy8qIFBPU0lYIEFDTCBzZXQvcXVlcnkgcGF0aCBpbmZvIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgQ0lGU19BQ0xfVkVSU0lPTiAxCitzdHJ1Y3QgY2lmc19wb3NpeF9hY2UgeyAvKiBhY2Nlc3MgY29udHJvbCBlbnRyeSAoQUNFKSAqLworCV9fdTggIGNpZnNfZV90YWc7CisJX191OCAgY2lmc19lX3Blcm07CisJX19sZTY0IGNpZnNfdWlkOyAvKiBvciBnaWQgKi8KK307IAorCitzdHJ1Y3QgY2lmc19wb3NpeF9hY2wgeyAvKiBhY2Nlc3MgY29ucm9sIGxpc3QgIChBQ0wpICovCisJX19sZTE2CXZlcnNpb247CisJX19sZTE2CWFjY2Vzc19lbnRyeV9jb3VudDsgIC8qIGFjY2VzcyBBQ0wgLSBjb3VudCBvZiBlbnRyaWVzICovCisJX19sZTE2CWRlZmF1bHRfZW50cnlfY291bnQ7IC8qIGRlZmF1bHQgQUNMIC0gY291bnQgb2YgZW50cmllcyAqLworCXN0cnVjdCBjaWZzX3Bvc2l4X2FjZSBhY2VfYXJyYXlbMF07CisJLyogZm9sbG93ZWQgYnkKKwlzdHJ1Y3QgY2lmc19wb3NpeF9hY2UgZGVmYXVsdF9hY2VfYXJyYWF5W10gKi8KK307ICAvKiBsZXZlbCAweDIwNCAqLworCisvKiB0eXBlcyBvZiBhY2Nlc3MgY29udHJvbCBlbnRyaWVzIGFscmVhZHkgZGVmaW5lZCBpbiBwb3NpeF9hY2wuaCAqLworLyogI2RlZmluZSBDSUZTX1BPU0lYX0FDTF9VU0VSX09CSgkgMHgwMQorI2RlZmluZSBDSUZTX1BPU0lYX0FDTF9VU0VSICAgICAgMHgwMgorI2RlZmluZSBDSUZTX1BPU0lYX0FDTF9HUk9VUF9PQkogMHgwNAorI2RlZmluZSBDSUZTX1BPU0lYX0FDTF9HUk9VUCAgICAgMHgwOAorI2RlZmluZSBDSUZTX1BPU0lYX0FDTF9NQVNLICAgICAgMHgxMAorI2RlZmluZSBDSUZTX1BPU0lYX0FDTF9PVEhFUiAgICAgMHgyMCAqLworCisvKiB0eXBlcyBvZiBwZXJtcyAqLworLyogI2RlZmluZSBDSUZTX1BPU0lYX0FDTF9FWEVDVVRFICAgMHgwMQorI2RlZmluZSBDSUZTX1BPU0lYX0FDTF9XUklURSAgICAgMHgwMgorI2RlZmluZSBDSUZTX1BPU0lYX0FDTF9SRUFECSAgICAgMHgwNCAqLworCisvKiBlbmQgb2YgUE9TSVggQUNMIGRlZmluaXRpb25zICovCisKK3N0cnVjdCBmaWxlX2ludGVybmFsX2luZm8geworCV9fdTY0ICBVbmlxdWVJZDsgLyogaW5vZGUgbnVtYmVyICovCit9OyAgICAgIC8qIGxldmVsIDB4M2VlICovCitzdHJ1Y3QgZmlsZV9tb2RlX2luZm8geworCV9fbGUzMglNb2RlOworfTsgICAgICAvKiBsZXZlbCAweDNmOCAqLworCitzdHJ1Y3QgZmlsZV9hdHRyaWJfdGFnIHsKKwlfX2xlMzIgQXR0cmlidXRlOworCV9fbGUzMiBSZXBhcnNlVGFnOworfTsgICAgICAvKiBsZXZlbCAweDQwYiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBGaW5kRmlyc3QvRmluZE5leHQgdHJhbnNhY3QyIGRhdGEgYnVmZmVyIGZvcm1hdHMgICAgKi8gCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlMzIgTmV4dEVudHJ5T2Zmc2V0OworCV9fdTMyIFJlc3VtZUtleTsgLyogYXMgd2l0aCBGaWxlSW5kZXggLSBubyBuZWVkIHRvIGNvbnZlcnQgKi8KKwlfX2xlNjQgRW5kT2ZGaWxlOworCV9fbGU2NCBOdW1PZkJ5dGVzOworCV9fbGU2NCBMYXN0U3RhdHVzQ2hhbmdlOyAvKlNOSUEgc3BlY3MgRENFIHRpbWUgZm9yIHRoZSAzIHRpbWUgZmllbGRzICovCisJX19sZTY0IExhc3RBY2Nlc3NUaW1lOworCV9fbGU2NCBMYXN0TW9kaWZpY2F0aW9uVGltZTsKKwlfX2xlNjQgVWlkOworCV9fbGU2NCBHaWQ7CisJX19sZTMyIFR5cGU7CisJX19sZTY0IERldk1ham9yOworCV9fbGU2NCBEZXZNaW5vcjsKKwlfX3U2NCBVbmlxdWVJZDsKKwlfX2xlNjQgUGVybWlzc2lvbnM7CisJX19sZTY0IE5saW5rczsKKwljaGFyIEZpbGVOYW1lWzFdOworfSBGSUxFX1VOSVhfSU5GTzsgLyogbGV2ZWwgMHgyMDIgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fbGUzMiBOZXh0RW50cnlPZmZzZXQ7CisJX191MzIgRmlsZUluZGV4OworCV9fbGU2NCBDcmVhdGlvblRpbWU7CisJX19sZTY0IExhc3RBY2Nlc3NUaW1lOworCV9fbGU2NCBMYXN0V3JpdGVUaW1lOworCV9fbGU2NCBDaGFuZ2VUaW1lOworCV9fbGU2NCBFbmRPZkZpbGU7CisJX19sZTY0IEFsbG9jYXRpb25TaXplOworCV9fbGUzMiBFeHRGaWxlQXR0cmlidXRlczsKKwlfX2xlMzIgRmlsZU5hbWVMZW5ndGg7CisJY2hhciBGaWxlTmFtZVsxXTsKK30gRklMRV9ESVJFQ1RPUllfSU5GTzsgICAvKiBsZXZlbCAweDEwMSBGRiByZXNwb25zZSBkYXRhIGFyZWEgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fbGUzMiBOZXh0RW50cnlPZmZzZXQ7CisJX191MzIgRmlsZUluZGV4OworCV9fbGU2NCBDcmVhdGlvblRpbWU7CisJX19sZTY0IExhc3RBY2Nlc3NUaW1lOworCV9fbGU2NCBMYXN0V3JpdGVUaW1lOworCV9fbGU2NCBDaGFuZ2VUaW1lOworCV9fbGU2NCBFbmRPZkZpbGU7CisJX19sZTY0IEFsbG9jYXRpb25TaXplOworCV9fbGUzMiBFeHRGaWxlQXR0cmlidXRlczsKKwlfX2xlMzIgRmlsZU5hbWVMZW5ndGg7CisJX19sZTMyIEVhU2l6ZTsgLyogbGVuZ3RoIG9mIHRoZSB4YXR0cnMgKi8KKwljaGFyIEZpbGVOYW1lWzFdOworfSBGSUxFX0ZVTExfRElSRUNUT1JZX0lORk87ICAgLyogbGV2ZWwgMHgxMDIgRkYgcmVzcG9uc2UgZGF0YSBhcmVhICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlMzIgTmV4dEVudHJ5T2Zmc2V0OworCV9fdTMyIEZpbGVJbmRleDsKKwlfX2xlNjQgQ3JlYXRpb25UaW1lOworCV9fbGU2NCBMYXN0QWNjZXNzVGltZTsKKwlfX2xlNjQgTGFzdFdyaXRlVGltZTsKKwlfX2xlNjQgQ2hhbmdlVGltZTsKKwlfX2xlNjQgRW5kT2ZGaWxlOworCV9fbGU2NCBBbGxvY2F0aW9uU2l6ZTsKKwlfX2xlMzIgRXh0RmlsZUF0dHJpYnV0ZXM7CisJX19sZTMyIEZpbGVOYW1lTGVuZ3RoOworCV9fbGUzMiBFYVNpemU7IC8qIEVBIHNpemUgKi8KKwlfX2xlMzIgUmVzZXJ2ZWQ7CisJX191NjQgVW5pcXVlSWQ7IC8qIGlub2RlIG51bSAtIGxlIHNpbmNlIFNhbWJhIHB1dHMgaW5vIGluIGxvdyAzMiBiaXQqLworCWNoYXIgRmlsZU5hbWVbMV07Cit9IFNFQVJDSF9JRF9GVUxMX0RJUl9JTkZPOyAgIC8qIGxldmVsIDB4MTA1IEZGIHJlc3BvbnNlIGRhdGEgYXJlYSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJX19sZTMyIE5leHRFbnRyeU9mZnNldDsKKwlfX3UzMiBGaWxlSW5kZXg7CisJX19sZTY0IENyZWF0aW9uVGltZTsKKwlfX2xlNjQgTGFzdEFjY2Vzc1RpbWU7CisJX19sZTY0IExhc3RXcml0ZVRpbWU7CisJX19sZTY0IENoYW5nZVRpbWU7CisJX19sZTY0IEVuZE9mRmlsZTsKKwlfX2xlNjQgQWxsb2NhdGlvblNpemU7CisJX19sZTMyIEV4dEZpbGVBdHRyaWJ1dGVzOworCV9fbGUzMiBGaWxlTmFtZUxlbmd0aDsgCisJX19sZTMyIEVhU2l6ZTsgLyogbGVuZ3RoIG9mIHRoZSB4YXR0cnMgKi8KKwlfX3U4ICAgU2hvcnROYW1lTGVuZ3RoOworCV9fdTggICBSZXNlcnZlZDsKKwlfX3U4ICAgU2hvcnROYW1lWzEyXTsKKwljaGFyIEZpbGVOYW1lWzFdOworfSBGSUxFX0JPVEhfRElSRUNUT1JZX0lORk87ICAgLyogbGV2ZWwgMHgxMDQgRkYgcmVzcG9uc2UgZGF0YSBhcmVhICovCisKKworc3RydWN0IGdlYSB7CisJdW5zaWduZWQgY2hhciBuYW1lX2xlbjsKKwljaGFyIG5hbWVbMV07Cit9OworCitzdHJ1Y3QgZ2VhbGlzdCB7CisJdW5zaWduZWQgbG9uZyBsaXN0X2xlbjsKKwlzdHJ1Y3QgZ2VhIGxpc3RbMV07Cit9OworCitzdHJ1Y3QgZmVhIHsKKwl1bnNpZ25lZCBjaGFyIEVBX2ZsYWdzOworCV9fdTggbmFtZV9sZW47CisJX19sZTE2IHZhbHVlX2xlbjsKKwljaGFyIG5hbWVbMV07CisJLyogb3B0aW9uYWxseSBmb2xsb3dlZCBieSB2YWx1ZSAqLworfTsKKy8qIGZsYWdzIGZvciBfRkVBLmZFQSAqLworI2RlZmluZSBGRUFfTkVFREVBICAgICAgICAgMHg4MAkvKiBuZWVkIEVBIGJpdCAqLworCitzdHJ1Y3QgZmVhbGlzdCB7CisJX19sZTMyIGxpc3RfbGVuOworCXN0cnVjdCBmZWEgbGlzdFsxXTsKK307CisKKy8qIHVzZWQgdG8gaG9sZCBhbiBhcmJpdHJhcnkgYmxvYiBvZiBkYXRhICovCitzdHJ1Y3QgZGF0YV9ibG9iIHsKKwlfX3U4ICpkYXRhOworCXNpemVfdCBsZW5ndGg7CisJdm9pZCAoKmZyZWUpIChzdHJ1Y3QgZGF0YV9ibG9iICogZGF0YV9ibG9iKTsKK307CisKKworI2lmZGVmIENPTkZJR19DSUZTX1BPU0lYCisvKiAKKwlGb3IgYmV0dGVyIFBPU0lYIHNlbWFudGljcyBmcm9tIExpbnV4IGNsaWVudCwgKGV2ZW4gYmV0dGVyCisJdGhhbiB0aGUgZXhpc3RpbmcgQ0lGUyBVbml4IEV4dGVuc2lvbnMpIHdlIG5lZWQgdXBkYXRlZCBQRFVzIGZvcjoKKwkKKwkxKSBQb3NpeENyZWF0ZVggLSB0byBzZXQgYW5kIHJldHVybiB0aGUgbW9kZSwgaW5vZGUjLCBkZXZpY2UgaW5mbyBhbmQKKwlwZXJoYXBzIGFkZCBhIENyZWF0ZURldmljZSAtIHRvIGNyZWF0ZSBQaXBlcyBhbmQgb3RoZXIgc3BlY2lhbCAuaW5vZGVzCisJQWxzbyBub3RlIFBPU0lYIG9wZW4gZmxhZ3MKKwkyKSBDbG9zZSAtIHRvIHJldHVybiB0aGUgbGFzdCB3cml0ZSB0aW1lIHRvIGRvIGNhY2hlIGFjcm9zcyBjbG9zZSBtb3JlIHNhZmVseQorCTMpIFBvc2l4UUZTSW5mbyAtIHRvIHJldHVybiBzdGF0ZnMgaW5mbworCTQpIEZpbmRGaXJzdCByZXR1cm4gdW5pcXVlIGlub2RlIG51bWJlciAtIHdoYXQgYWJvdXQgcmVzdW1lIGtleSwgdHdvIGZvcm1zIHNob3J0IChtYXRjaGVzIHJlYWRkaXIpIGFuZCBmdWxsIChlbm91Z2ggaW5mbyB0byBjYWNoZSBpbm9kZXMpCisJNSkgTWtkaXIgLSBzZXQgbW9kZQorCQorCUFuZCB1bmRlciBjb25zaWRlcmF0aW9uOiAKKwk2KSBGaW5kQ2xvc2UyIChyZXR1cm4gbmFub3NlY29uZCB0aW1lc3RhbXAgPz8pCisJNykgVXNlIG5hbm9zZWNvbmQgdGltZXN0YW1wcyB0aHJvdWdob3V0IGFsbCB0aW1lIGZpZWxkcyBpZiAKKwkgICBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBmbGFnIGlzIHNldAorCTgpIHNlbmRmaWxlIC0gaGFuZGxlIGJhc2VkIGNvcHkKKwk5KSBEaXJlY3QgaS9vCisJMTApICJQT1NJWCBBQ0wiIHN1cHBvcnQKKwkxMSkgTWlzYyBmY250bHM/CisJCisJd2hhdCBhYm91dCBmaXhpbmcgNjQgYml0IGFsaWdubWVudAorCQorCVRoZXJlIGFyZSBhbHNvIHZhcmlvdXMgbGVnYWN5IFNNQi9DSUZTIHJlcXVlc3RzIHVzZWQgYXMgaXMKKwkKKwlGcm9tIGV4aXN0aW5nIExhbm1hbiBhbmQgTlRMTSBkaWFsZWN0czoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5FR09USUFURQorCVNFU1NJT05fU0VUVVBfQU5EWCAoQkIgd2hpY2g/KQorCVRSRUVfQ09OTkVDVF9BTkRYIChCQiB3aGljaCB3Y3Q/KQorCVRSRUVfRElTQ09OTkVDVCAoQkIgYWRkIHZvbHVtZSB0aW1lc3RhbXAgb24gcmVzcG9uc2UpCisJTE9HT0ZGX0FORFgKKwlERUxFVEUgKG5vdGUgZGVsZXRlIG9wZW4gZmlsZSBiZWhhdmlvcikKKwlERUxFVEVfRElSRUNUT1JZCisJUkVBRF9BTkRfWAorCVdSSVRFX0FORF9YCisJTE9DS0lOR19BTkRfWCAobm90ZSBwb3NpeCBsb2NrIHNlbWFudGljcykKKwlSRU5BTUUgKG5vdGUgcmVuYW1lIGFjcm9zcyBkaXJzIGFuZCBvcGVuIGZpbGUgcmVuYW1lIHBvc2l4IGJlaGF2aW9ycykKKwlOVF9SRU5BTUUgKGZvciBoYXJkbGlua3MpIElzIHRoaXMgZ29vZCBlbm91Z2ggZm9yIGFsbCBmZWF0dXJlcz8KKwlGSU5EX0NMT1NFMgorCVRSQU5TQUNUSU9OMiAoMTggY2FzZXMpCisJCVNNQl9TRVRfRklMRV9FTkRfT0ZfRklMRV9JTkZPMiBTTUJfU0VUX1BBVEhfRU5EX09GX0ZJTEVfSU5GTzIKKwkJKEJCIHZlcmlmeSB0aGF0IG5ldmVyIG5lZWQgdG8gc2V0IGFsbG9jYXRpb24gc2l6ZSkKKwkJU01CX1NFVF9GSUxFX0JBU0lDX0lORk8yIChzZXR0aW5nIHRpbWVzIC0gQkIgY2FuIGl0IGJlIGRvbmUgdmlhIFVuaXggZXh0PykKKwkKKwlDT1BZIChub3RlIHN1cHBvcnQgZm9yIGNvcHkgYWNyb3NzIGRpcmVjdG9yaWVzKSAtIEZVVFVSRSwgT1BUSU9OQUwKKwlzZXR0aW5nL2dldHRpbmcgT1MvMiBFQXMgLSBGVVRVUkUgKEJCIGNhbiB0aGlzIGhhbmRsZQorCXNldHRpbmcgTGludXggeGF0dHJzIHBlcmZlY3RseSkgICAgICAgICAtIE9QVElPTkFMCisJZG5vdGlmeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRlVUVVJFLCBPUFRJT05BTAorCXF1b3RhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEZVVFVSRSwgT1BUSU9OQUwKKwkJCQorCU5vdGUgdGhhdCB2YXJpb3VzIHJlcXVlc3RzIGltcGxlbWVudGVkIGZvciBOVCBpbnRlcm9wIHN1Y2ggYXMgCisJCU5UX1RSQU5TQUNUIChJT0NUTCkgUXVlcnlSZXBhcnNlSW5mbworCWFyZSB1bm5lZWRlZCB0byBzZXJ2ZXJzIGNvbXBsaWFudCB3aXRoIHRoZSBDSUZTIFBPU0lYIGV4dGVuc2lvbnMKKwkKKwlGcm9tIENJRlMgVW5peCBFeHRlbnNpb25zOgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlUMiBTRVRfUEFUSF9JTkZPIChTTUJfU0VUX0ZJTEVfVU5JWF9MSU5LKSBmb3Igc3ltbGlua3MKKwlUMiBTRVRfUEFUSF9JTkZPIChTTUJfU0VUX0ZJTEVfQkFTSUNfSU5GTzIpCisJVDIgUVVFUllfUEFUSF9JTkZPIChTTUJfUVVFUllfRklMRV9VTklYX0xJTkspCisJVDIgUVVFUllfUEFUSF9JTkZPIChTTUJfUVVFUllfRklMRV9VTklYX0JBU0lDKSAtIEJCIGNoZWNrIGZvciBtaXNzaW5nIGlub2RlIGZpZWxkcworCQkJCQlBY3R1YWxseSBuZWVkIFFVRVJZX0ZJTEVfVU5JWF9JTkZPIHNpbmNlIGhhcyBpbm9kZSBudW0KKwkJCQkJQkIgd2hhdCBhYm91dCBhKSBibGtzaXplL2Jsa2JpdHMvYmxvY2tzCisJCQkJCQkJCSAgYikgaV92ZXJzaW9uCisJCQkJCQkJCSAgYykgaV9yZGV2CisJCQkJCQkJCSAgZCkgbm90aWZ5IG1hc2s/CisJCQkJCQkJCSAgZSkgZ2VuZXJhdGlvbgorCQkJCQkJCQkgIGYpIHNpemVfc2VxY291bnQKKwlUMiBGSU5EX0ZJUlNUL0ZJTkRfTkVYVCBGSU5EX0ZJTEVfVU5JWAorCVRSQU5TMl9HRVRfREZTX1JFRkVSUkFMCQkJCSAgLSBPUFRJT05BTCBidXQgcmVjb21tZW5kZWQKKwlUMl9RRlNfSU5GTyBRdWVyeURldmljZS9BdHRyaWJ1dGVJbmZvIC0gT1BUSU9OQUwKKwkKKwkKKyAqLworCisvKiB4c3ltbGluayBpcyBhIHN5bWxpbmsgZm9ybWF0IHRoYXQgY2FuIGJlIHVzZWQKKyAgIHRvIHNhdmUgc3ltbGluayBpbmZvIGluIGEgcmVndWxhciBmaWxlIHdoZW4gCisgICBtb3VudGVkIHRvIG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgZG8gbm90CisgICBzdXBwb3J0IHRoZSBjaWZzIFVuaXggZXh0ZW5zaW9ucyBvciBFQXMgKGZvciB4YXR0cgorICAgYmFzZWQgc3ltbGlua3MpLiAgRm9yIHN1Y2ggYSBmaWxlIHRvIGJlIHJlY29nbml6ZWQKKyAgIGFzIGNvbnRhaW5pbmcgc3ltbGluayBkYXRhOiAKKworICAgMSkgZmlsZSBzaXplIG11c3QgYmUgMTA2NywgCisgICAyKSBzaWduYXR1cmUgbXVzdCBiZWdpbiBmaWxlIGRhdGEsCisgICAzKSBsZW5ndGggZmllbGQgbXVzdCBiZSBzZXQgdG8gQVNDSUkgcmVwcmVzZW50YXRpb24KKwlvZiBhIG51bWJlciB3aGljaCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTAyNCwgCisgICA0KSBtZDUgbXVzdCBtYXRjaCB0aGF0IG9mIHRoZSBwYXRoIGRhdGEgKi8KKworc3RydWN0IHhzeW1saW5rIHsKKwkvKiAxMDY3IGJ5dGVzICovCisJY2hhciBzaWduYXR1cmVbNF07IC8qIFhTeW0gKi8gLyogbm90IG51bGwgdGVybWluYXRlZCAqLworCWNoYXIgY3IwOyAgICAgICAgIC8qIFxuICovCisvKiBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiBsZW5ndGggKDQgYnl0ZXMgZGVjaW1hbCkgdGVybWluYXRlZCBieSBcbiBub3QgbnVsbCAqLworCWNoYXIgbGVuZ3RoWzRdOworCWNoYXIgY3IxOyAgICAgICAgIC8qIFxuICovCisvKiBtZDUgb2YgdmFsaWQgc3Vic2V0IG9mIHBhdGggaWUgcGF0aFswXSB0aHJvdWdoIHBhdGhbbGVuZ3RoLTFdICovCisJX191OCBtZDVbMzJdOyAgICAKKwljaGFyIGNyMjsgICAgICAgIC8qIFxuICovCisvKiBpZiByb29tIGxlZnQsIHRoZW4gZW5kIHdpdGggXG4gdGhlbiAweDIwcyBieSBjb252ZW50aW9uIGJ1dCBub3QgcmVxdWlyZWQgKi8KKwljaGFyIHBhdGhbMTAyNF07ICAKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBCQiBkbyB3ZSBuZWVkIGFub3RoZXIgZmllbGQgZm9yIGZsYWdzPyBCQiAqLworCV9fdTMyIHhhdHRyX25hbWVfbGVuOworCV9fdTMyIHhhdHRyX3ZhbHVlX2xlbjsKKwljaGFyICB4YXR0cl9uYW1lWzBdOworCS8qIGZvbGxvd2VkIGJ5IHhhdHRyX3ZhbHVlW3hhdHRyX3ZhbHVlX2xlbl0sIG5vIHBhZCAqLworfSBGSUxFX1hBVFRSX0lORk87CS8qIGV4dGVuZGVkIGF0dHJpYnV0ZSwgaW5mbyBsZXZlbCAyMDUgKi8KKworCisjZW5kaWYgCisKKyNwcmFnbWEgcGFjaygpCQkJLyogcmVzdW1lIGRlZmF1bHQgc3RydWN0dXJlIHBhY2tpbmcgKi8KKworI2VuZGlmCQkJCS8qIF9DSUZTUERVX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc3Byb3RvLmggYi9mcy9jaWZzL2NpZnNwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4N2VlZjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL2NpZnNwcm90by5oCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogICBmcy9jaWZzL2NpZnNwcm90by5oCisgKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgIENvcnAuLCAyMDAyLDIwMDUKKyAqICAgQXV0aG9yKHMpOiBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSAKKyAqLworI2lmbmRlZiBfQ0lGU1BST1RPX0gKKyNkZWZpbmUgX0NJRlNQUk9UT19ICisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisKK3N0cnVjdCBzdGF0ZnM7CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFsbCBQcm90b3R5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitleHRlcm4gc3RydWN0IHNtYl9oZHIgKmNpZnNfYnVmX2dldCh2b2lkKTsKK2V4dGVybiB2b2lkIGNpZnNfYnVmX3JlbGVhc2Uodm9pZCAqKTsKK2V4dGVybiBzdHJ1Y3Qgc21iX2hkciAqY2lmc19zbWFsbF9idWZfZ2V0KHZvaWQpOworZXh0ZXJuIHZvaWQgY2lmc19zbWFsbF9idWZfcmVsZWFzZSh2b2lkICopOworZXh0ZXJuIGludCBzbWJfc2VuZChzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBzbWJfaGRyICosCisJCQl1bnNpZ25lZCBpbnQgLyogbGVuZ3RoICovICwgc3RydWN0IHNvY2thZGRyICopOworZXh0ZXJuIHVuc2lnbmVkIGludCBfR2V0WGlkKHZvaWQpOworZXh0ZXJuIHZvaWQgX0ZyZWVYaWQodW5zaWduZWQgaW50KTsKKyNkZWZpbmUgR2V0WGlkKCkgKGludClfR2V0WGlkKCk7IGNGWUkoMSwoIkNJRlMgVkZTOiBpbiAlcyBhcyBYaWQ6ICVkIHdpdGggdWlkOiAlZCIsX19GVU5DVElPTl9fLCB4aWQsY3VycmVudC0+ZnN1aWQpKTsKKyNkZWZpbmUgRnJlZVhpZChjdXJyX3hpZCkge19GcmVlWGlkKGN1cnJfeGlkKTsgY0ZZSSgxLCgiQ0lGUyBWRlM6IGxlYXZpbmcgJXMgKHhpZCA9ICVkKSByYyA9ICVkIixfX0ZVTkNUSU9OX18sY3Vycl94aWQsKGludClyYykpO30KK2V4dGVybiBjaGFyICpidWlsZF9wYXRoX2Zyb21fZGVudHJ5KHN0cnVjdCBkZW50cnkgKik7CitleHRlcm4gY2hhciAqYnVpbGRfd2lsZGNhcmRfcGF0aF9mcm9tX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSk7CitleHRlcm4gdm9pZCByZW5ld19wYXJlbnRhbF90aW1lc3RhbXBzKHN0cnVjdCBkZW50cnkgKmRpcmVudHJ5KTsKK2V4dGVybiBpbnQgU2VuZFJlY2VpdmUoY29uc3QgdW5zaWduZWQgaW50IC8qIHhpZCAqLyAsIHN0cnVjdCBjaWZzU2VzSW5mbyAqLAorCQkJc3RydWN0IHNtYl9oZHIgKiAvKiBpbnB1dCAqLyAsCisJCQlzdHJ1Y3Qgc21iX2hkciAqIC8qIG91dCAqLyAsCisJCQlpbnQgKiAvKiBieXRlcyByZXR1cm5lZCAqLyAsIGNvbnN0IGludCBsb25nX29wKTsKK2V4dGVybiBpbnQgY2hlY2tTTUJoZHIoc3RydWN0IHNtYl9oZHIgKnNtYiwgX191MTYgbWlkKTsKK2V4dGVybiBpbnQgY2hlY2tTTUIoc3RydWN0IHNtYl9oZHIgKnNtYiwgX191MTYgbWlkLCBpbnQgbGVuZ3RoKTsKK2V4dGVybiBpbnQgaXNfdmFsaWRfb3Bsb2NrX2JyZWFrKHN0cnVjdCBzbWJfaGRyICpzbWIpOworZXh0ZXJuIGludCBpc19zaXplX3NhZmVfdG9fY2hhbmdlKHN0cnVjdCBjaWZzSW5vZGVJbmZvICopOworZXh0ZXJuIHVuc2lnbmVkIGludCBzbWJDYWxjU2l6ZShzdHJ1Y3Qgc21iX2hkciAqcHRyKTsKK2V4dGVybiBpbnQgZGVjb2RlX25lZ1Rva2VuSW5pdCh1bnNpZ25lZCBjaGFyICpzZWN1cml0eV9ibG9iLCBpbnQgbGVuZ3RoLAorCQkJZW51bSBzZWN1cml0eUVudW0gKnNlY1R5cGUpOworZXh0ZXJuIGludCBjaWZzX2luZXRfcHRvbihpbnQsIGNoYXIgKiBzb3VyY2UsIHZvaWQgKmRzdCk7CitleHRlcm4gaW50IG1hcF9zbWJfdG9fbGludXhfZXJyb3Ioc3RydWN0IHNtYl9oZHIgKnNtYik7CitleHRlcm4gdm9pZCBoZWFkZXJfYXNzZW1ibGUoc3RydWN0IHNtYl9oZHIgKiwgY2hhciAvKiBjb21tYW5kICovICwKKwkJCWNvbnN0IHN0cnVjdCBjaWZzVGNvbkluZm8gKiwgaW50CisJCQkvKiBsZW5ndGggb2YgZml4ZWQgc2VjdGlvbiAod29yZCBjb3VudCkgaW4gdHdvIGJ5dGUgdW5pdHMgICovCisJCQkpOworZXh0ZXJuIHN0cnVjdCBvcGxvY2tfcV9lbnRyeSAqIEFsbG9jT3Bsb2NrUUVudHJ5KHN0cnVjdCBpbm9kZSAqLCB1MTYsIHN0cnVjdCBjaWZzVGNvbkluZm8gKik7CitleHRlcm4gdm9pZCBEZWxldGVPcGxvY2tRRW50cnkoc3RydWN0IG9wbG9ja19xX2VudHJ5ICopOworZXh0ZXJuIHN0cnVjdCB0aW1lc3BlYyBjaWZzX05UdGltZVRvVW5peCh1NjQgLyogdXRjIG5hbm9zZWNvbmRzIHNpbmNlIDE2MDEgKi8gKTsKK2V4dGVybiB1NjQgY2lmc19Vbml4VGltZVRvTlQoc3RydWN0IHRpbWVzcGVjKTsKK2V4dGVybiBpbnQgY2lmc19nZXRfaW5vZGVfaW5mbyhzdHJ1Y3QgaW5vZGUgKipwaW5vZGUsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzZWFyY2hfcGF0aCwgCisJCQlGSUxFX0FMTF9JTkZPICogcGZpbGVfaW5mbywKKwkJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB4aWQpOworZXh0ZXJuIGludCBjaWZzX2dldF9pbm9kZV9pbmZvX3VuaXgoc3RydWN0IGlub2RlICoqcGlub2RlLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2VhcmNoX3BhdGgsCisJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLGludCB4aWQpOworCitleHRlcm4gaW50IGNpZnNfbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBjaWZzX3NiX2luZm8gKiwgY2hhciAqLAorCQkJY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgY2lmc191bW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBjaWZzX3NiX2luZm8gKik7Cit2b2lkIGNpZnNfcHJvY19pbml0KHZvaWQpOwordm9pZCBjaWZzX3Byb2NfY2xlYW4odm9pZCk7CisKK2V4dGVybiBpbnQgY2lmc19zZXR1cF9zZXNzaW9uKHVuc2lnbmVkIGludCB4aWQsIHN0cnVjdCBjaWZzU2VzSW5mbyAqcFNlc0luZm8sIAorCQkJc3RydWN0IG5sc190YWJsZSAqIG5sc19pbmZvKTsKK2V4dGVybiBpbnQgQ0lGU1NNQk5lZ290aWF0ZSh1bnNpZ25lZCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Nlc0luZm8gKnNlcyk7CisKK2V4dGVybiBpbnQgQ0lGU1RDb24odW5zaWduZWQgaW50IHhpZCwgc3RydWN0IGNpZnNTZXNJbmZvICpzZXMsCisJCQljb25zdCBjaGFyICp0cmVlLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqKTsKKworZXh0ZXJuIGludCBDSUZTRmluZEZpcnN0KGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisgICAgICAgICAgICBjb25zdCBjaGFyICpzZWFyY2hOYW1lLCBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UsCisgICAgICAgICAgICBfX3UxNiAqc2VhcmNoSGFuZGxlLCBzdHJ1Y3QgY2lmc19zZWFyY2hfaW5mbyAqIHBzcmNoX2luZik7CisKK2V4dGVybiBpbnQgQ0lGU0ZpbmROZXh0KGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisgICAgICAgICAgICBfX3UxNiBzZWFyY2hIYW5kbGUsIHN0cnVjdCBjaWZzX3NlYXJjaF9pbmZvICogcHNyY2hfaW5mKTsKKworZXh0ZXJuIGludCBDSUZTRmluZENsb3NlKGNvbnN0IGludCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IF9fdTE2IHNlYXJjaF9oYW5kbGUpOworCitleHRlcm4gaW50IENJRlNTTUJRUGF0aEluZm8oY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlYXJjaE5hbWUsCisJCQlGSUxFX0FMTF9JTkZPICogZmluZERhdGEsCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworCitleHRlcm4gaW50IENJRlNTTUJVbml4UVBhdGhJbmZvKGNvbnN0IGludCB4aWQsCisJCQlzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2VhcmNoTmFtZSwKKwkJCUZJTEVfVU5JWF9CQVNJQ19JTkZPICogcEZpbmREYXRhLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKTsKKworZXh0ZXJuIGludCBDSUZTR2V0REZTUmVmZXIoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNTZXNJbmZvICpzZXMsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzZWFyY2hOYW1lLAorCQkJdW5zaWduZWQgY2hhciAqKnRhcmdldFVOQ3MsCisJCQl1bnNpZ25lZCBpbnQgKm51bWJlcl9vZl9VTkNfaW5fYXJyYXksCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworCitleHRlcm4gaW50IGNvbm5lY3RfdG9fZGZzX3BhdGgoaW50IHhpZCwgc3RydWN0IGNpZnNTZXNJbmZvICpwU2VzSW5mbywKKwkJCWNvbnN0IGNoYXIgKm9sZF9wYXRoLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKTsKK2V4dGVybiBpbnQgZ2V0X2Rmc19wYXRoKGludCB4aWQsIHN0cnVjdCBjaWZzU2VzSW5mbyAqcFNlc0luZm8sCisJCQljb25zdCBjaGFyICpvbGRfcGF0aCwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlLCAKKwkJCXVuc2lnbmVkIGludCAqcG51bV9yZWZlcnJhbHMsIHVuc2lnbmVkIGNoYXIgKiogcHJlZmVycmFscyk7CitleHRlcm4gaW50IENJRlNTTUJRRlNJbmZvKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQlzdHJ1Y3Qga3N0YXRmcyAqRlNEYXRhLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKTsKK2V4dGVybiBpbnQgQ0lGU1NNQlFGU0F0dHJpYnV0ZUluZm8oY29uc3QgaW50IHhpZCwKKwkJCXN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIGludCBDSUZTU01CUUZTRGV2aWNlSW5mbyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKTsKK2V4dGVybiBpbnQgQ0lGU1NNQlFGU1VuaXhJbmZvKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIGludCBDSUZTU01CUUZTUG9zaXhJbmZvKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQlzdHJ1Y3Qga3N0YXRmcyAqRlNEYXRhLCBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworCitleHRlcm4gaW50IENJRlNTTUJTZXRUaW1lcyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3QgY2hhciAqZmlsZU5hbWUsIGNvbnN0IEZJTEVfQkFTSUNfSU5GTyAqIGRhdGEsCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIGludCBDSUZTU01CU2V0RmlsZVRpbWVzKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQljb25zdCBGSUxFX0JBU0lDX0lORk8gKiBkYXRhLCBfX3UxNiBmaWQpOworI2lmIDAKK2V4dGVybiBpbnQgQ0lGU1NNQlNldEF0dHJMZWdhY3koaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNoYXIgKmZpbGVOYW1lLCBfX3UxNiBkb3NfYXR0cmlidXRlcywKKwkJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CisjZW5kaWYgLyogcG9zc2libHkgdW5uZWVkZWQgZnVuY3Rpb24gKi8KK2V4dGVybiBpbnQgQ0lGU1NNQlNldEVPRihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3QgY2hhciAqZmlsZU5hbWUsIF9fdTY0IHNpemUsaW50IHNldEFsbG9jYXRpb25TaXplRmxhZywKKwkJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CitleHRlcm4gaW50IENJRlNTTUJTZXRGaWxlU2l6ZShjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJIF9fdTY0IHNpemUsIF9fdTE2IGZpbGVIYW5kbGUsX191MzIgb3BlbmVyX3BpZCwgaW50IEFsbG9jU2l6ZUZsYWcpOworZXh0ZXJuIGludCBDSUZTU01CVW5peFNldFBlcm1zKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uLAorCQkJY2hhciAqZnVsbF9wYXRoLCBfX3U2NCBtb2RlLCBfX3U2NCB1aWQsCisJCQlfX3U2NCBnaWQsIGRldl90IGRldiwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKTsKKworZXh0ZXJuIGludCBDSUZTU01CTWtEaXIoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IGNoYXIgKm5ld05hbWUsCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIGludCBDSUZTU01CUm1EaXIoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CisKK2V4dGVybiBpbnQgQ0lGU1NNQkRlbEZpbGUoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IGNoYXIgKm5hbWUsCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIGludCBDSUZTU01CUmVuYW1lKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQljb25zdCBjaGFyICpmcm9tTmFtZSwgY29uc3QgY2hhciAqdG9OYW1lLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKTsKK2V4dGVybiBpbnQgQ0lGU1NNQlJlbmFtZU9wZW5GaWxlKGNvbnN0IGludCB4aWQsc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb24sCisJCQlpbnQgbmV0ZmlkLCBjaGFyICogdGFyZ2V0X25hbWUsIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CitleHRlcm4gaW50IENJRlNDcmVhdGVIYXJkTGluayhjb25zdCBpbnQgeGlkLAorCQkJc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IGNoYXIgKmZyb21OYW1lLCBjb25zdCBjaGFyICp0b05hbWUsCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIGludCBDSUZTVW5peENyZWF0ZUhhcmRMaW5rKGNvbnN0IGludCB4aWQsCisJCQlzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3QgY2hhciAqZnJvbU5hbWUsIGNvbnN0IGNoYXIgKnRvTmFtZSwKKwkJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CitleHRlcm4gaW50IENJRlNVbml4Q3JlYXRlU3ltTGluayhjb25zdCBpbnQgeGlkLAorCQkJc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IGNoYXIgKmZyb21OYW1lLCBjb25zdCBjaGFyICp0b05hbWUsCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIGludCBDSUZTU01CVW5peFF1ZXJ5U3ltTGluayhjb25zdCBpbnQgeGlkLAorCQkJc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlYXJjaE5hbWUsCisJCQljaGFyICpzeW1pbmZvLCBjb25zdCBpbnQgYnVmbGVuLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKTsKK2V4dGVybiBpbnQgQ0lGU1NNQlF1ZXJ5UmVwYXJzZUxpbmtJbmZvKGNvbnN0IGludCB4aWQsIAorCQkJc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlYXJjaE5hbWUsCisJCQljaGFyICpzeW1saW5raW5mbywgY29uc3QgaW50IGJ1ZmxlbiwgX191MTYgZmlkLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKTsKKworZXh0ZXJuIGludCBDSUZTU01CT3Blbihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3QgY2hhciAqZmlsZU5hbWUsIGNvbnN0IGludCBkaXNwb3NpdGlvbiwKKwkJCWNvbnN0IGludCBhY2Nlc3NfZmxhZ3MsIGNvbnN0IGludCBvbW9kZSwKKwkJCV9fdTE2ICogbmV0ZmlkLCBpbnQgKnBPcGxvY2ssIEZJTEVfQUxMX0lORk8gKiwKKwkJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CitleHRlcm4gaW50IENJRlNTTUJDbG9zZShjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3QgaW50IHNtYl9maWxlX2lkKTsKKworZXh0ZXJuIGludCBDSUZTU01CUmVhZChjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3QgaW50IG5ldGZpZCwgdW5zaWduZWQgaW50IGNvdW50LAorCQkJY29uc3QgX191NjQgbHNlZWssIHVuc2lnbmVkIGludCAqbmJ5dGVzLCBjaGFyICoqYnVmKTsKK2V4dGVybiBpbnQgQ0lGU1NNQldyaXRlKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQljb25zdCBpbnQgbmV0ZmlkLCBjb25zdCB1bnNpZ25lZCBpbnQgY291bnQsCisJCQljb25zdCBfX3U2NCBsc2VlaywgdW5zaWduZWQgaW50ICpuYnl0ZXMsCisJCQljb25zdCBjaGFyICpidWYsIGNvbnN0IGNoYXIgX191c2VyICp1YnVmLCAKKwkJCWNvbnN0IGludCBsb25nX29wKTsKKyNpZmRlZiBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwKK2V4dGVybiBpbnQgQ0lGU1NNQldyaXRlMihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3QgaW50IG5ldGZpZCwgY29uc3QgdW5zaWduZWQgaW50IGNvdW50LAorCQkJY29uc3QgX191NjQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgKm5ieXRlcywgCisJCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLGNvbnN0IGludCBsb25nX29wKTsKK2V4dGVybiBpbnQgQ0lGU0dldFNydklub2RlTnVtYmVyKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzZWFyY2hOYW1lLCBfX3U2NCAqIGlub2RlX251bWJlciwKKwkJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CisjZW5kaWYgLyogQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMICovCisKK2V4dGVybiBpbnQgQ0lGU1NNQkxvY2soY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IF9fdTE2IG5ldGZpZCwgY29uc3QgX191NjQgbGVuLAorCQkJY29uc3QgX191NjQgb2Zmc2V0LCBjb25zdCBfX3UzMiBudW1VbmxvY2ssCisJCQljb25zdCBfX3UzMiBudW1Mb2NrLCBjb25zdCBfX3U4IGxvY2tUeXBlLAorCQkJY29uc3QgaW50IHdhaXRGbGFnKTsKKworZXh0ZXJuIGludCBDSUZTU01CVERpcyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uKTsKK2V4dGVybiBpbnQgQ0lGU1NNQkxvZ29mZihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Nlc0luZm8gKnNlcyk7CisKK2V4dGVybiBzdHJ1Y3QgY2lmc1Nlc0luZm8gKnNlc0luZm9BbGxvYyh2b2lkKTsKK2V4dGVybiB2b2lkIHNlc0luZm9GcmVlKHN0cnVjdCBjaWZzU2VzSW5mbyAqKTsKK2V4dGVybiBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uSW5mb0FsbG9jKHZvaWQpOworZXh0ZXJuIHZvaWQgdGNvbkluZm9GcmVlKHN0cnVjdCBjaWZzVGNvbkluZm8gKik7CisKK2V4dGVybiBpbnQgY2lmc19yZWNvbm5lY3Qoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKTsKKworZXh0ZXJuIGludCBjaWZzX3NpZ25fc21iKHN0cnVjdCBzbWJfaGRyICosIHN0cnVjdCBjaWZzU2VzSW5mbyAqLF9fdTMyICopOworZXh0ZXJuIGludCBjaWZzX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IHNtYl9oZHIgKiwgY29uc3QgY2hhciAqIG1hY19rZXksCisJX191MzIgZXhwZWN0ZWRfc2VxdWVuY2VfbnVtYmVyKTsKK2V4dGVybiBpbnQgY2lmc19jYWxjdWxhdGVfbWFjX2tleShjaGFyICoga2V5LGNvbnN0IGNoYXIgKiBybixjb25zdCBjaGFyICogcGFzcyk7CitleHRlcm4gaW50IENhbGNOVExNdjJfcGFydGlhbF9tYWNfa2V5KHN0cnVjdCBjaWZzU2VzSW5mbyAqLCBzdHJ1Y3QgbmxzX3RhYmxlICopOworZXh0ZXJuIHZvaWQgQ2FsY05UTE12Ml9yZXNwb25zZShjb25zdCBzdHJ1Y3QgY2lmc1Nlc0luZm8gKixjaGFyICogKTsKK2V4dGVybiBpbnQgQ0lGU1NNQkNvcHkoaW50IHhpZCwKKwkJCXN0cnVjdCBjaWZzVGNvbkluZm8gKnNvdXJjZV90Y29uLAorCQkJY29uc3QgY2hhciAqZnJvbU5hbWUsCisJCQljb25zdCBfX3UxNiB0YXJnZXRfdGlkLAorCQkJY29uc3QgY2hhciAqdG9OYW1lLCBjb25zdCBpbnQgZmxhZ3MsCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIGludCBDSUZTU01CTm90aWZ5KGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sIAorCQkJY29uc3QgaW50IG5vdGlmeV9zdWJkaXJzLGNvbnN0IF9fdTE2IG5ldGZpZCxfX3UzMiBmaWx0ZXIsCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIHNzaXplX3QgQ0lGU1NNQlFBbGxFQXMoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlYXJjaE5hbWUsIGNoYXIgKiBFQURhdGEsCisJCQlzaXplX3QgYnVmc2l6ZSwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKTsKK2V4dGVybiBzc2l6ZV90IENJRlNTTUJRdWVyeUVBKGNvbnN0IGludCB4aWQsc3RydWN0IGNpZnNUY29uSW5mbyAqIHRjb24sCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzZWFyY2hOYW1lLGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBlYV9uYW1lLAorCQl1bnNpZ25lZCBjaGFyICogZWFfdmFsdWUsIHNpemVfdCBidWZfc2l6ZSwgCisJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CitleHRlcm4gaW50IENJRlNTTUJTZXRFQShjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLCAKKwkJY29uc3QgY2hhciAqZmlsZU5hbWUsIGNvbnN0IGNoYXIgKiBlYV9uYW1lLCAKKwkJY29uc3Qgdm9pZCAqIGVhX3ZhbHVlLCBjb25zdCBfX3UxNiBlYV92YWx1ZV9sZW4sIAorCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIGludCBDSUZTU01CR2V0UG9zaXhBQ0woY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2VhcmNoTmFtZSwKKwkJY2hhciAqYWNsX2luZiwgY29uc3QgaW50IGJ1Zmxlbixjb25zdCBpbnQgYWNsX3R5cGUsCisJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CitleHRlcm4gaW50IENJRlNTTUJTZXRQb3NpeEFDTChjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpmaWxlTmFtZSwKKwkJY29uc3QgY2hhciAqbG9jYWxfYWNsLCBjb25zdCBpbnQgYnVmbGVuLCBjb25zdCBpbnQgYWNsX3R5cGUsCisJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CitpbnQgY2lmc19pb2N0bCAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZXAsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvbW1hbmQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKyNlbmRpZgkJCS8qIF9DSUZTUFJPVE9fSCAqLwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzc21iLmMgYi9mcy9jaWZzL2NpZnNzbWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjZhNjE5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9jaWZzc21iLmMKQEAgLTAsMCArMSw0MTg2IEBACisvKgorICogICBmcy9jaWZzL2NpZnNzbWIuYworICoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMiwyMDA1CisgKiAgIEF1dGhvcihzKTogU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pCisgKgorICogICBDb250YWlucyB0aGUgcm91dGluZXMgZm9yIGNvbnN0cnVjdGluZyB0aGUgU01CIFBEVXMgdGhlbXNlbHZlcworICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworIC8qIFNNQi9DSUZTIFBEVSBoYW5kbGluZyByb3V0aW5lcyBoZXJlIC0gZXhjZXB0IGZvciBsZWZ0b3ZlcnMgaW4gY29ubmVjdC5jICAgKi8KKyAvKiBUaGVzZSBhcmUgbW9zdGx5IHJvdXRpbmVzIHRoYXQgb3BlcmF0ZSBvbiBhIHBhdGhuYW1lLCBvciBvbiBhIHRyZWUgaWQgICAgICovCisgLyogKG1vdW50ZWQgdm9sdW1lKSwgYnV0IHRoZXJlIGFyZSBlaWdodCBoYW5kbGUgYmFzZWQgcm91dGluZXMgd2hpY2ggbXVzdCBiZSAqLworIC8qIHRyZWF0ZWQgc2xpZ2h0bHkgZGlmZmVyZW50IGZvciByZWNvbm5lY3Rpb24gcHVycG9zZXMgc2luY2Ugd2UgbmV2ZXIgd2FudCAgKi8KKyAvKiB0byByZXVzZSBhIHN0YWxlIGZpbGUgaGFuZGxlIGFuZCB0aGUgY2FsbGVyIGtub3dzIHRoZSBmaWxlIGhhbmRsZSAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2xfeGF0dHIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgImNpZnNwZHUuaCIKKyNpbmNsdWRlICJjaWZzZ2xvYi5oIgorI2luY2x1ZGUgImNpZnNwcm90by5oIgorI2luY2x1ZGUgImNpZnNfdW5pY29kZS5oIgorI2luY2x1ZGUgImNpZnNfZGVidWcuaCIKKworI2lmZGVmIENPTkZJR19DSUZTX1BPU0lYCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgaW5kZXg7CisJY2hhciAqbmFtZTsKK30gcHJvdG9jb2xzW10gPSB7CisJe0NJRlNfUFJPVCwgIlwyTlQgTE0gMC4xMiJ9LCAKKwl7Q0lGU19QUk9ULCAiXDJQT1NJWCAyIn0sCisJe0JBRF9QUk9ULCAiXDIifQorfTsKKyNlbHNlCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgaW5kZXg7CisJY2hhciAqbmFtZTsKK30gcHJvdG9jb2xzW10gPSB7CisJe0NJRlNfUFJPVCwgIlwyTlQgTE0gMC4xMiJ9LCAKKwl7QkFEX1BST1QsICJcMiJ9Cit9OworI2VuZGlmCisKKworLyogTWFyayBhcyBpbnZhbGlkLCBhbGwgb3BlbiBmaWxlcyBvbiB0cmVlIGNvbm5lY3Rpb25zIHNpbmNlIHRoZXkKKyAgIHdlcmUgY2xvc2VkIHdoZW4gc2Vzc2lvbiB0byBzZXJ2ZXIgd2FzIGxvc3QgKi8KK3N0YXRpYyB2b2lkIG1hcmtfb3Blbl9maWxlc19pbnZhbGlkKHN0cnVjdCBjaWZzVGNvbkluZm8gKiBwVGNvbikKK3sKKwlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpvcGVuX2ZpbGUgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKiB0bXA7CisJc3RydWN0IGxpc3RfaGVhZCAqIHRtcDE7CisKKy8qIGxpc3QgYWxsIGZpbGVzIG9wZW4gb24gdHJlZSBjb25uZWN0aW9uIGFuZCBtYXJrIHRoZW0gaW52YWxpZCAqLworCXdyaXRlX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCWxpc3RfZm9yX2VhY2hfc2FmZSh0bXAsIHRtcDEsICZwVGNvbi0+b3BlbkZpbGVMaXN0KSB7CisJCW9wZW5fZmlsZSA9IGxpc3RfZW50cnkodG1wLHN0cnVjdCBjaWZzRmlsZUluZm8sIHRsaXN0KTsKKwkJaWYob3Blbl9maWxlKSB7CisJCQlvcGVuX2ZpbGUtPmludmFsaWRIYW5kbGUgPSBUUlVFOworCQl9CisJfQorCXdyaXRlX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJLyogQkIgQWRkIGNhbGwgdG8gaW52YWxpZGF0ZV9pbm9kZXMoc2IpIGZvciBhbGwgc3VwZXJibG9ja3MgbW91bnRlZCB0byB0aGlzIHRjb24gKi8KK30KKworLyogSWYgdGhlIHJldHVybiBjb2RlIGlzIHplcm8sIHRoaXMgZnVuY3Rpb24gbXVzdCBmaWxsIGluIHJlcXVlc3RfYnVmIHBvaW50ZXIgKi8KK3N0YXRpYyBpbnQKK3NtYWxsX3NtYl9pbml0KGludCBzbWJfY29tbWFuZCwgaW50IHdjdCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkgdm9pZCAqKnJlcXVlc3RfYnVmIC8qIHJldHVybmVkICovKQoreworCWludCByYyA9IDA7CisKKwkvKiBTTUJzIE5lZ1Byb3QsIFNlc3NTZXR1cCwgdUxvZ29mZiBkbyBub3QgaGF2ZSB0Y29uIHlldCBzbworCSAgIGNoZWNrIGZvciB0Y3AgYW5kIHNtYiBzZXNzaW9uIHN0YXR1cyBkb25lIGRpZmZlcmVudGx5CisJICAgZm9yIHRob3NlIHRocmVlIC0gaW4gdGhlIGNhbGxpbmcgcm91dGluZSAqLworCWlmKHRjb24pIHsKKwkJaWYoKHRjb24tPnNlcykgJiYgKHRjb24tPnNlcy0+c2VydmVyKSl7CisJCQlzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2U7CisJCQkJLyogR2l2ZSBEZW11bHRpcGxleCB0aHJlYWQgdXAgdG8gMTAgc2Vjb25kcyB0byAKKwkJCQkJcmVjb25uZWN0LCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIGNpZnMgc29ja2V0CisJCQkJCXRpbWVvdXQgd2hpY2ggaXMgNyBzZWNvbmRzICovCisJCQl3aGlsZSh0Y29uLT5zZXMtPnNlcnZlci0+dGNwU3RhdHVzID09IENpZnNOZWVkUmVjb25uZWN0KSB7CisJCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQodGNvbi0+c2VzLT5zZXJ2ZXItPnJlc3BvbnNlX3EsCisJCQkJCSh0Y29uLT5zZXMtPnNlcnZlci0+dGNwU3RhdHVzID09IENpZnNHb29kKSwgMTAgKiBIWik7CisJCQkJaWYodGNvbi0+c2VzLT5zZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzTmVlZFJlY29ubmVjdCkgeworCQkJCQkvKiBvbiAic29mdCIgbW91bnRzIHdlIHdhaXQgb25jZSAqLworCQkJCQlpZigodGNvbi0+cmV0cnkgPT0gRkFMU0UpIHx8IAorCQkJCQkgICAodGNvbi0+c2VzLT5zdGF0dXMgPT0gQ2lmc0V4aXRpbmcpKSB7CisJCQkJCQljRllJKDEsKCJnYXZlIHVwIHdhaXRpbmcgb24gcmVjb25uZWN0IGluIHNtYl9pbml0IikpOworCQkJCQkJcmV0dXJuIC1FSE9TVERPV047CisJCQkJCX0gLyogZWxzZSAiaGFyZCIgbW91bnQgLSBrZWVwIHJldHJ5aW5nIHVudGlsIAorCQkJCQlwcm9jZXNzIGlzIGtpbGxlZCBvciBzZXJ2ZXIgY29tZXMgYmFjayB1cCAqLworCQkJCX0gZWxzZSAvKiBUQ1Agc2Vzc2lvbiBpcyByZWVzdGFibGlzaGVkIG5vdyAqLworCQkJCQlicmVhazsKKwkJCQkgCisJCQl9CisJCQkKKwkJCW5sc19jb2RlcGFnZSA9IGxvYWRfbmxzX2RlZmF1bHQoKTsKKwkJLyogbmVlZCB0byBwcmV2ZW50IG11bHRpcGxlIHRocmVhZHMgdHJ5aW5nIHRvCisJCXNpbXVsdGFuZW91c2x5IHJlY29ubmVjdCB0aGUgc2FtZSBTTUIgc2Vzc2lvbiAqLworCQkJZG93bigmdGNvbi0+c2VzLT5zZXNTZW0pOworCQkJaWYodGNvbi0+c2VzLT5zdGF0dXMgPT0gQ2lmc05lZWRSZWNvbm5lY3QpCisJCQkJcmMgPSBjaWZzX3NldHVwX3Nlc3Npb24oMCwgdGNvbi0+c2VzLCBubHNfY29kZXBhZ2UpOworCQkJaWYoIXJjICYmICh0Y29uLT50aWRTdGF0dXMgPT0gQ2lmc05lZWRSZWNvbm5lY3QpKSB7CisJCQkJbWFya19vcGVuX2ZpbGVzX2ludmFsaWQodGNvbik7CisJCQkJcmMgPSBDSUZTVENvbigwLCB0Y29uLT5zZXMsIHRjb24tPnRyZWVOYW1lLCB0Y29uLAorCQkJCQlubHNfY29kZXBhZ2UpOworCQkJCXVwKCZ0Y29uLT5zZXMtPnNlc1NlbSk7CisJCQkJaWYocmMgPT0gMCkKKwkJCQkJYXRvbWljX2luYygmdGNvbkluZm9SZWNvbm5lY3RDb3VudCk7CisKKwkJCQljRllJKDEsICgicmVjb25uZWN0IHRjb24gcmMgPSAlZCIsIHJjKSk7CisJCQkJLyogUmVtb3ZlZCBjYWxsIHRvIHJlb3BlbiBvcGVuIGZpbGVzIGhlcmUgLSAKKwkJCQkJaXQgaXMgc2FmZXIgKGFuZCBmYXN0ZXIpIHRvIHJlb3BlbiBmaWxlcworCQkJCQlvbmUgYXQgYSB0aW1lIGFzIG5lZWRlZCBpbiByZWFkIGFuZCB3cml0ZSAqLworCisJCQkJLyogQ2hlY2sgaWYgaGFuZGxlIGJhc2VkIG9wZXJhdGlvbiBzbyB3ZSAKKwkJCQkJa25vdyB3aGV0aGVyIHdlIGNhbiBjb250aW51ZSBvciBub3Qgd2l0aG91dAorCQkJCQlyZXR1cm5pbmcgdG8gY2FsbGVyIHRvIHJlc2V0IGZpbGUgaGFuZGxlICovCisJCQkJc3dpdGNoKHNtYl9jb21tYW5kKSB7CisJCQkJCWNhc2UgU01CX0NPTV9SRUFEX0FORFg6CisJCQkJCWNhc2UgU01CX0NPTV9XUklURV9BTkRYOgorCQkJCQljYXNlIFNNQl9DT01fQ0xPU0U6CisJCQkJCWNhc2UgU01CX0NPTV9GSU5EX0NMT1NFMjoKKwkJCQkJY2FzZSBTTUJfQ09NX0xPQ0tJTkdfQU5EWDogeworCQkJCQkJdW5sb2FkX25scyhubHNfY29kZXBhZ2UpOworCQkJCQkJcmV0dXJuIC1FQUdBSU47CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXVwKCZ0Y29uLT5zZXMtPnNlc1NlbSk7CisJCQl9CisJCQl1bmxvYWRfbmxzKG5sc19jb2RlcGFnZSk7CisKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCWlmKHJjKQorCQlyZXR1cm4gcmM7CisKKwkqcmVxdWVzdF9idWYgPSBjaWZzX3NtYWxsX2J1Zl9nZXQoKTsKKwlpZiAoKnJlcXVlc3RfYnVmID09IE5VTEwpIHsKKwkJLyogQkIgc2hvdWxkIHdlIGFkZCBhIHJldHJ5IGluIGhlcmUgaWYgbm90IGEgd3JpdGVwYWdlPyAqLworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwloZWFkZXJfYXNzZW1ibGUoKHN0cnVjdCBzbWJfaGRyICopICpyZXF1ZXN0X2J1Ziwgc21iX2NvbW1hbmQsIHRjb24sd2N0KTsKKworI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTCisgICAgICAgIGlmKHRjb24gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGF0b21pY19pbmMoJnRjb24tPm51bV9zbWJzX3NlbnQpOworICAgICAgICB9CisjZW5kaWYgLyogQ09ORklHX0NJRlNfU1RBVFMgKi8KKwlyZXR1cm4gcmM7Cit9ICAKKworLyogSWYgdGhlIHJldHVybiBjb2RlIGlzIHplcm8sIHRoaXMgZnVuY3Rpb24gbXVzdCBmaWxsIGluIHJlcXVlc3RfYnVmIHBvaW50ZXIgKi8KK3N0YXRpYyBpbnQKK3NtYl9pbml0KGludCBzbWJfY29tbWFuZCwgaW50IHdjdCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkgdm9pZCAqKnJlcXVlc3RfYnVmIC8qIHJldHVybmVkICovICwKKwkgdm9pZCAqKnJlc3BvbnNlX2J1ZiAvKiByZXR1cm5lZCAqLyApCit7CisJaW50IHJjID0gMDsKKworCS8qIFNNQnMgTmVnUHJvdCwgU2Vzc1NldHVwLCB1TG9nb2ZmIGRvIG5vdCBoYXZlIHRjb24geWV0IHNvCisJICAgY2hlY2sgZm9yIHRjcCBhbmQgc21iIHNlc3Npb24gc3RhdHVzIGRvbmUgZGlmZmVyZW50bHkKKwkgICBmb3IgdGhvc2UgdGhyZWUgLSBpbiB0aGUgY2FsbGluZyByb3V0aW5lICovCisJaWYodGNvbikgeworCQlpZigodGNvbi0+c2VzKSAmJiAodGNvbi0+c2VzLT5zZXJ2ZXIpKXsKKwkJCXN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZTsKKwkJCQkvKiBHaXZlIERlbXVsdGlwbGV4IHRocmVhZCB1cCB0byAxMCBzZWNvbmRzIHRvIAorCQkJCQlyZWNvbm5lY3QsIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gY2lmcyBzb2NrZXQKKwkJCQkJdGltZW91dCB3aGljaCBpcyA3IHNlY29uZHMgKi8KKwkJCXdoaWxlKHRjb24tPnNlcy0+c2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc05lZWRSZWNvbm5lY3QpIHsKKwkJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh0Y29uLT5zZXMtPnNlcnZlci0+cmVzcG9uc2VfcSwKKwkJCQkJKHRjb24tPnNlcy0+c2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc0dvb2QpLCAxMCAqIEhaKTsKKwkJCQlpZih0Y29uLT5zZXMtPnNlcnZlci0+dGNwU3RhdHVzID09IENpZnNOZWVkUmVjb25uZWN0KSB7CisJCQkJCS8qIG9uICJzb2Z0IiBtb3VudHMgd2Ugd2FpdCBvbmNlICovCisJCQkJCWlmKCh0Y29uLT5yZXRyeSA9PSBGQUxTRSkgfHwgCisJCQkJCSAgICh0Y29uLT5zZXMtPnN0YXR1cyA9PSBDaWZzRXhpdGluZykpIHsKKwkJCQkJCWNGWUkoMSwoImdhdmUgdXAgd2FpdGluZyBvbiByZWNvbm5lY3QgaW4gc21iX2luaXQiKSk7CisJCQkJCQlyZXR1cm4gLUVIT1NURE9XTjsKKwkJCQkJfSAvKiBlbHNlICJoYXJkIiBtb3VudCAtIGtlZXAgcmV0cnlpbmcgdW50aWwgCisJCQkJCXByb2Nlc3MgaXMga2lsbGVkIG9yIHNlcnZlciBjb21lcyBiYWNrIHVwICovCisJCQkJfSBlbHNlIC8qIFRDUCBzZXNzaW9uIGlzIHJlZXN0YWJsaXNoZWQgbm93ICovCisJCQkJCWJyZWFrOworCQkJCSAKKwkJCX0KKwkJCQorCQkJbmxzX2NvZGVwYWdlID0gbG9hZF9ubHNfZGVmYXVsdCgpOworCQkvKiBuZWVkIHRvIHByZXZlbnQgbXVsdGlwbGUgdGhyZWFkcyB0cnlpbmcgdG8KKwkJc2ltdWx0YW5lb3VzbHkgcmVjb25uZWN0IHRoZSBzYW1lIFNNQiBzZXNzaW9uICovCisJCQlkb3duKCZ0Y29uLT5zZXMtPnNlc1NlbSk7CisJCQlpZih0Y29uLT5zZXMtPnN0YXR1cyA9PSBDaWZzTmVlZFJlY29ubmVjdCkKKwkJCQlyYyA9IGNpZnNfc2V0dXBfc2Vzc2lvbigwLCB0Y29uLT5zZXMsIG5sc19jb2RlcGFnZSk7CisJCQlpZighcmMgJiYgKHRjb24tPnRpZFN0YXR1cyA9PSBDaWZzTmVlZFJlY29ubmVjdCkpIHsKKwkJCQltYXJrX29wZW5fZmlsZXNfaW52YWxpZCh0Y29uKTsKKwkJCQlyYyA9IENJRlNUQ29uKDAsIHRjb24tPnNlcywgdGNvbi0+dHJlZU5hbWUsIHRjb24sCisJCQkJCW5sc19jb2RlcGFnZSk7CisJCQkJdXAoJnRjb24tPnNlcy0+c2VzU2VtKTsKKwkJCQlpZihyYyA9PSAwKQorCQkJCQlhdG9taWNfaW5jKCZ0Y29uSW5mb1JlY29ubmVjdENvdW50KTsKKworCQkJCWNGWUkoMSwgKCJyZWNvbm5lY3QgdGNvbiByYyA9ICVkIiwgcmMpKTsKKwkJCQkvKiBSZW1vdmVkIGNhbGwgdG8gcmVvcGVuIG9wZW4gZmlsZXMgaGVyZSAtIAorCQkJCQlpdCBpcyBzYWZlciAoYW5kIGZhc3RlcikgdG8gcmVvcGVuIGZpbGVzCisJCQkJCW9uZSBhdCBhIHRpbWUgYXMgbmVlZGVkIGluIHJlYWQgYW5kIHdyaXRlICovCisKKwkJCQkvKiBDaGVjayBpZiBoYW5kbGUgYmFzZWQgb3BlcmF0aW9uIHNvIHdlIAorCQkJCQlrbm93IHdoZXRoZXIgd2UgY2FuIGNvbnRpbnVlIG9yIG5vdCB3aXRob3V0CisJCQkJCXJldHVybmluZyB0byBjYWxsZXIgdG8gcmVzZXQgZmlsZSBoYW5kbGUgKi8KKwkJCQlzd2l0Y2goc21iX2NvbW1hbmQpIHsKKwkJCQkJY2FzZSBTTUJfQ09NX1JFQURfQU5EWDoKKwkJCQkJY2FzZSBTTUJfQ09NX1dSSVRFX0FORFg6CisJCQkJCWNhc2UgU01CX0NPTV9DTE9TRToKKwkJCQkJY2FzZSBTTUJfQ09NX0ZJTkRfQ0xPU0UyOgorCQkJCQljYXNlIFNNQl9DT01fTE9DS0lOR19BTkRYOiB7CisJCQkJCQl1bmxvYWRfbmxzKG5sc19jb2RlcGFnZSk7CisJCQkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdXAoJnRjb24tPnNlcy0+c2VzU2VtKTsKKwkJCX0KKwkJCXVubG9hZF9ubHMobmxzX2NvZGVwYWdlKTsKKworCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisJaWYocmMpCisJCXJldHVybiByYzsKKworCSpyZXF1ZXN0X2J1ZiA9IGNpZnNfYnVmX2dldCgpOworCWlmICgqcmVxdWVzdF9idWYgPT0gTlVMTCkgeworCQkvKiBCQiBzaG91bGQgd2UgYWRkIGEgcmV0cnkgaW4gaGVyZSBpZiBub3QgYSB3cml0ZXBhZ2U/ICovCisJCXJldHVybiAtRU5PTUVNOworCX0KKyAgICAvKiBBbHRob3VnaCB0aGUgb3JpZ2luYWwgdGhvdWdodCB3YXMgd2UgbmVlZGVkIHRoZSByZXNwb25zZSBidWYgZm9yICAqLworICAgIC8qIHBvdGVudGlhbCByZXRyaWVzIG9mIHNtYiBvcGVyYXRpb25zIGl0IHR1cm5zIG91dCB3ZSBjYW4gZGV0ZXJtaW5lICovCisgICAgLyogZnJvbSB0aGUgbWlkIGZsYWdzIHdoZW4gdGhlIHJlcXVlc3QgYnVmZmVyIGNhbiBiZSByZXNlbnQgd2l0aG91dCAgKi8KKyAgICAvKiBoYXZpbmcgdG8gdXNlIGEgc2Vjb25kIGRpc3RpbmN0IGJ1ZmZlciBmb3IgdGhlIHJlc3BvbnNlICovCisJKnJlc3BvbnNlX2J1ZiA9ICpyZXF1ZXN0X2J1ZjsgCisKKwloZWFkZXJfYXNzZW1ibGUoKHN0cnVjdCBzbWJfaGRyICopICpyZXF1ZXN0X2J1Ziwgc21iX2NvbW1hbmQsIHRjb24sCisJCQl3Y3QgLyp3Y3QgKi8gKTsKKworI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTCisgICAgICAgIGlmKHRjb24gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGF0b21pY19pbmMoJnRjb24tPm51bV9zbWJzX3NlbnQpOworICAgICAgICB9CisjZW5kaWYgLyogQ09ORklHX0NJRlNfU1RBVFMgKi8KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfdDIoc3RydWN0IHNtYl90Ml9yc3AgKiBwU01CKSAKK3sKKwlpbnQgcmMgPSAtRUlOVkFMOworCWludCB0b3RhbF9zaXplOworCWNoYXIgKiBwQkNDOworCisJLyogY2hlY2sgZm9yIHBsYXVzaWJsZSB3Y3QsIGJjYyBhbmQgdDIgZGF0YSBhbmQgcGFybSBzaXplcyAqLworCS8qIGNoZWNrIGZvciBwYXJtIGFuZCBkYXRhIG9mZnNldCBnb2luZyBiZXlvbmQgZW5kIG9mIHNtYiAqLworCWlmKHBTTUItPmhkci5Xb3JkQ291bnQgPj0gMTApIHsKKwkJaWYoKGxlMTZfdG9fY3B1KHBTTUItPnQyX3JzcC5QYXJhbWV0ZXJPZmZzZXQpIDw9IDEwMjQpICYmCisJCSAgIChsZTE2X3RvX2NwdShwU01CLT50Ml9yc3AuRGF0YU9mZnNldCkgPD0gMTAyNCkpIHsKKwkJCS8qIGNoZWNrIHRoYXQgYmNjIGlzIGF0IGxlYXN0IGFzIGJpZyBhcyBwYXJtcyArIGRhdGEgKi8KKwkJCS8qIGNoZWNrIHRoYXQgYmNjIGlzIGxlc3MgdGhhbiBuZWdvdGlhdGVkIHNtYiBidWZmZXIgKi8KKwkJCXRvdGFsX3NpemUgPSBsZTE2X3RvX2NwdShwU01CLT50Ml9yc3AuUGFyYW1ldGVyQ291bnQpOworCQkJaWYodG90YWxfc2l6ZSA8IDUxMikgeworCQkJCXRvdGFsX3NpemUrPWxlMTZfdG9fY3B1KHBTTUItPnQyX3JzcC5EYXRhQ291bnQpOworCQkJCS8qIEJDQyBsZSBjb252ZXJ0ZWQgaW4gU2VuZFJlY2VpdmUgKi8KKwkJCQlwQkNDID0gKHBTTUItPmhkci5Xb3JkQ291bnQgKiAyKSArIHNpemVvZihzdHJ1Y3Qgc21iX2hkcikgKyAKKwkJCQkJKGNoYXIgKilwU01COworCQkJCWlmKCh0b3RhbF9zaXplIDw9ICgqKHUxNiAqKXBCQ0MpKSAmJiAKKwkJCQkgICAodG90YWxfc2l6ZSA8IAorCQkJCQlDSUZTTWF4QnVmU2l6ZStNQVhfQ0lGU19IRFJfU0laRSkpIHsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCQorCQkJfQorCQl9CisJfQorCWNpZnNfZHVtcF9tZW0oIkludmFsaWQgdHJhbnNhY3QyIFNNQjogIiwoY2hhciAqKXBTTUIsCisJCXNpemVvZihzdHJ1Y3Qgc21iX3QyX3JzcCkgKyAxNik7CisJcmV0dXJuIHJjOworfQoraW50CitDSUZTU01CTmVnb3RpYXRlKHVuc2lnbmVkIGludCB4aWQsIHN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzKQoreworCU5FR09USUFURV9SRVEgKnBTTUI7CisJTkVHT1RJQVRFX1JTUCAqcFNNQnI7CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQ7CisJc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqIHNlcnZlcjsKKwl1MTYgY291bnQ7CisKKwlpZihzZXMtPnNlcnZlcikKKwkJc2VydmVyID0gc2VzLT5zZXJ2ZXI7CisJZWxzZSB7CisJCXJjID0gLUVJTzsKKwkJcmV0dXJuIHJjOworCX0KKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fTkVHT1RJQVRFLCAwLCBOVUxMIC8qIG5vIHRjb24geWV0ICovICwKKwkJICAgICAgKHZvaWQgKiopICZwU01CLCAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBTTUItPmhkci5GbGFnczIgfD0gU01CRkxHMl9VTklDT0RFOworCWlmIChleHRlbmRlZF9zZWN1cml0eSkKKwkJcFNNQi0+aGRyLkZsYWdzMiB8PSBTTUJGTEcyX0VYVF9TRUM7CisKKwljb3VudCA9IHN0cmxlbihwcm90b2NvbHNbMF0ubmFtZSkgKyAxOworCXN0cm5jcHkocFNNQi0+RGlhbGVjdHNBcnJheSwgcHJvdG9jb2xzWzBdLm5hbWUsIDMwKTsJCisgICAgLyogbnVsbCBndWFyYW50ZWVkIHRvIGJlIGF0IGVuZCBvZiBzb3VyY2UgYW5kIHRhcmdldCBidWZmZXJzIGFueXdheSAqLworCisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGNvdW50OworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGNvdW50KTsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCBzZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKwlpZiAocmMgPT0gMCkgeworCQlzZXJ2ZXItPnNlY01vZGUgPSBwU01Cci0+U2VjdXJpdHlNb2RlOwkKKwkJc2VydmVyLT5zZWNUeXBlID0gTlRMTTsgLyogQkIgb3ZlcnJpZGUgZGVmYXVsdCBmb3IgTlRMTXYyIG9yIGtyYiovCisJCS8qIG9uZSBieXRlIC0gbm8gbmVlZCB0byBjb252ZXJ0IHRoaXMgb3IgRW5jcnlwdGlvbktleUxlbiBmcm9tIGxlLCovCisJCXNlcnZlci0+bWF4UmVxID0gbGUxNl90b19jcHUocFNNQnItPk1heE1weENvdW50KTsKKwkJLyogcHJvYmFibHkgbm8gbmVlZCB0byBzdG9yZSBhbmQgY2hlY2sgbWF4dmNzICovCisJCXNlcnZlci0+bWF4QnVmID0KKwkJCW1pbihsZTMyX3RvX2NwdShwU01Cci0+TWF4QnVmZmVyU2l6ZSksCisJCQkoX191MzIpIENJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUpOworCQlzZXJ2ZXItPm1heFJ3ID0gbGUzMl90b19jcHUocFNNQnItPk1heFJhd1NpemUpOworCQljRllJKDAsICgiTWF4IGJ1ZiA9ICVkICIsIHNlcy0+c2VydmVyLT5tYXhCdWYpKTsKKwkJR0VUVTMyKHNlcy0+c2VydmVyLT5zZXNzaWQpID0gbGUzMl90b19jcHUocFNNQnItPlNlc3Npb25LZXkpOworCQlzZXJ2ZXItPmNhcGFiaWxpdGllcyA9IGxlMzJfdG9fY3B1KHBTTUJyLT5DYXBhYmlsaXRpZXMpOworCQlzZXJ2ZXItPnRpbWVab25lID0gbGUxNl90b19jcHUocFNNQnItPlNlcnZlclRpbWVab25lKTsJCisgICAgICAgIC8qIEJCIHdpdGggVVRDIGRvIHdlIGV2ZXIgbmVlZCB0byBiZSB1c2luZyBzcnZyIHRpbWV6b25lPyAqLworCQlpZiAocFNNQnItPkVuY3J5cHRpb25LZXlMZW5ndGggPT0gQ0lGU19DUllQVE9fS0VZX1NJWkUpIHsKKwkJCW1lbWNweShzZXJ2ZXItPmNyeXB0S2V5LCBwU01Cci0+dS5FbmNyeXB0aW9uS2V5LAorCQkJICAgICAgIENJRlNfQ1JZUFRPX0tFWV9TSVpFKTsKKwkJfSBlbHNlIGlmICgocFNNQnItPmhkci5GbGFnczIgJiBTTUJGTEcyX0VYVF9TRUMpCisJCQkgICAmJiAocFNNQnItPkVuY3J5cHRpb25LZXlMZW5ndGggPT0gMCkpIHsKKwkJCS8qIGRlY29kZSBzZWN1cml0eSBibG9iICovCisJCX0gZWxzZQorCQkJcmMgPSAtRUlPOworCisJCS8qIEJCIG1pZ2h0IGJlIGhlbHBmdWwgdG8gc2F2ZSBvZmYgdGhlIGRvbWFpbiBvZiBzZXJ2ZXIgaGVyZSAqLworCisJCWlmICgocFNNQnItPmhkci5GbGFnczIgJiBTTUJGTEcyX0VYVF9TRUMpICYmIAorCQkJKHNlcnZlci0+Y2FwYWJpbGl0aWVzICYgQ0FQX0VYVEVOREVEX1NFQ1VSSVRZKSkgeworCQkJY291bnQgPSBwU01Cci0+Qnl0ZUNvdW50OworCQkJaWYgKGNvdW50IDwgMTYpCisJCQkJcmMgPSAtRUlPOworCQkJZWxzZSBpZiAoY291bnQgPT0gMTYpIHsKKwkJCQlzZXJ2ZXItPnNlY1R5cGUgPSBSYXdOVExNU1NQOworCQkJCWlmIChzZXJ2ZXItPnNvY2tldFVzZUNvdW50LmNvdW50ZXIgPiAxKSB7CisJCQkJCWlmIChtZW1jbXAKKwkJCQkJCShzZXJ2ZXItPnNlcnZlcl9HVUlELAorCQkJCQkJcFNNQnItPnUuZXh0ZW5kZWRfcmVzcG9uc2UuCisJCQkJCQlHVUlELCAxNikgIT0gMCkgeworCQkJCQkJY0ZZSSgxLAorCQkJCQkJCSgiVUlEIG9mIHNlcnZlciBkb2VzIG5vdCBtYXRjaCBwcmV2aW91cyBjb25uZWN0aW9uIHRvIHNhbWUgaXAgYWRkcmVzcyIpKTsKKwkJCQkJCW1lbWNweShzZXJ2ZXItPgorCQkJCQkJCXNlcnZlcl9HVUlELAorCQkJCQkJCXBTTUJyLT51LgorCQkJCQkJCWV4dGVuZGVkX3Jlc3BvbnNlLgorCQkJCQkJCUdVSUQsIDE2KTsKKwkJCQkJfQorCQkJCX0gZWxzZQorCQkJCQltZW1jcHkoc2VydmVyLT5zZXJ2ZXJfR1VJRCwKKwkJCQkJICAgICAgIHBTTUJyLT51LmV4dGVuZGVkX3Jlc3BvbnNlLgorCQkJCQkgICAgICAgR1VJRCwgMTYpOworCQkJfSBlbHNlIHsKKwkJCQlyYyA9IGRlY29kZV9uZWdUb2tlbkluaXQocFNNQnItPnUuCisJCQkJCQkJIGV4dGVuZGVkX3Jlc3BvbnNlLgorCQkJCQkJCSBTZWN1cml0eUJsb2IsCisJCQkJCQkJIGNvdW50IC0gMTYsCisJCQkJCQkJICZzZXJ2ZXItPnNlY1R5cGUpOworCQkJCWlmKHJjID09IDEpIHsKKwkJCQkvKiBCQiBOZWVkIHRvIGZpbGwgc3RydWN0IGZvciBzZXNzZXR1cCBoZXJlICovCisJCQkJCXJjID0gLUVPUE5PVFNVUFA7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmMgPSAtRUlOVkFMOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlCisJCQlzZXJ2ZXItPmNhcGFiaWxpdGllcyAmPSB+Q0FQX0VYVEVOREVEX1NFQ1VSSVRZOworCQlpZihzaWduX0NJRlNfUERVcyA9PSBGQUxTRSkgeyAgICAgICAgCisJCQlpZihzZXJ2ZXItPnNlY01vZGUgJiBTRUNNT0RFX1NJR05fUkVRVUlSRUQpCisJCQkJY0VSUk9SKDEsCisJCQkJICgiU2VydmVyIHJlcXVpcmVzIC9wcm9jL2ZzL2NpZnMvUGFja2V0U2lnbmluZ0VuYWJsZWQiKSk7CisJCQlzZXJ2ZXItPnNlY01vZGUgJj0gfihTRUNNT0RFX1NJR05fRU5BQkxFRCB8IFNFQ01PREVfU0lHTl9SRVFVSVJFRCk7CisJCX0gZWxzZSBpZihzaWduX0NJRlNfUERVcyA9PSAxKSB7CisJCQlpZigoc2VydmVyLT5zZWNNb2RlICYgU0VDTU9ERV9TSUdOX1JFUVVJUkVEKSA9PSAwKQorCQkJCXNlcnZlci0+c2VjTW9kZSAmPSB+KFNFQ01PREVfU0lHTl9FTkFCTEVEIHwgU0VDTU9ERV9TSUdOX1JFUVVJUkVEKTsKKwkJfQorCQkJCQorCX0KKwlpZiAocFNNQikKKwkJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorQ0lGU1NNQlREaXMoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbikKK3sKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlcjsKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlcl9yZXNwb25zZTsgLyogQkIgcmVtb3ZlbWUgQkIgKi8KKwlpbnQgcmMgPSAwOworCWludCBsZW5ndGg7CisKKwljRllJKDEsICgiSW4gdHJlZSBkaXNjb25uZWN0IikpOworCS8qCisJICogIElmIGxhc3QgdXNlciBvZiB0aGUgY29ubmVjdGlvbiBhbmQKKwkgKiAgY29ubmVjdGlvbiBhbGl2ZSAtIGRpc2Nvbm5lY3QgaXQKKwkgKiAgSWYgdGhpcyBpcyB0aGUgbGFzdCBjb25uZWN0aW9uIG9uIHRoZSBzZXJ2ZXIgc2Vzc2lvbiBkaXNjb25uZWN0IGl0CisJICogIChhbmQgaW5zaWRlIHNlc3Npb24gZGlzY29ubmVjdCB3ZSBzaG91bGQgY2hlY2sgaWYgdGNwIHNvY2tldCBuZWVkcyAKKwkgKiAgdG8gYmUgZnJlZWQgYW5kIGtlcm5lbCB0aHJlYWQgd29rZW4gdXApLgorCSAqLworCWlmICh0Y29uKQorCQlkb3duKCZ0Y29uLT50Y29uU2VtKTsKKwllbHNlCisJCXJldHVybiAtRUlPOworCisJYXRvbWljX2RlYygmdGNvbi0+dXNlQ291bnQpOworCWlmIChhdG9taWNfcmVhZCgmdGNvbi0+dXNlQ291bnQpID4gMCkgeworCQl1cCgmdGNvbi0+dGNvblNlbSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogTm8gbmVlZCB0byByZXR1cm4gZXJyb3Igb24gdGhpcyBvcGVyYXRpb24gaWYgdGlkIGludmFsaWRhdGVkIGFuZCAKKwljbG9zZWQgb24gc2VydmVyIGFscmVhZHkgZS5nLiBkdWUgdG8gdGNwIHNlc3Npb24gY3Jhc2hpbmcgKi8KKwlpZih0Y29uLT50aWRTdGF0dXMgPT0gQ2lmc05lZWRSZWNvbm5lY3QpIHsKKwkJdXAoJnRjb24tPnRjb25TZW0pOworCQlyZXR1cm4gMDsgIAorCX0KKworCWlmKCh0Y29uLT5zZXMgPT0gTlVMTCkgfHwgKHRjb24tPnNlcy0+c2VydmVyID09IE5VTEwpKSB7ICAgIAorCQl1cCgmdGNvbi0+dGNvblNlbSk7CisJCXJldHVybiAtRUlPOworCX0KKwlyYyA9IHNtYWxsX3NtYl9pbml0KFNNQl9DT01fVFJFRV9ESVNDT05ORUNULCAwLCB0Y29uLCAodm9pZCAqKikmc21iX2J1ZmZlcik7CisJaWYgKHJjKSB7CisJCXVwKCZ0Y29uLT50Y29uU2VtKTsKKwkJcmV0dXJuIHJjOworCX0gZWxzZSB7CisJCXNtYl9idWZmZXJfcmVzcG9uc2UgPSBzbWJfYnVmZmVyOyAvKiBCQiByZW1vdmVtZSBCQiAqLworICAgIH0KKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCBzbWJfYnVmZmVyLCBzbWJfYnVmZmVyX3Jlc3BvbnNlLAorCQkJICZsZW5ndGgsIDApOworCWlmIChyYykKKwkJY0ZZSSgxLCAoIiBUcmVlIGRpc2Nvbm5lY3QgZmFpbGVkICVkIiwgcmMpKTsKKworCWlmIChzbWJfYnVmZmVyKQorCQljaWZzX3NtYWxsX2J1Zl9yZWxlYXNlKHNtYl9idWZmZXIpOworCXVwKCZ0Y29uLT50Y29uU2VtKTsKKworCS8qIE5vIG5lZWQgdG8gcmV0dXJuIGVycm9yIG9uIHRoaXMgb3BlcmF0aW9uIGlmIHRpZCBpbnZhbGlkYXRlZCBhbmQgCisJY2xvc2VkIG9uIHNlcnZlciBhbHJlYWR5IGUuZy4gZHVlIHRvIHRjcCBzZXNzaW9uIGNyYXNoaW5nICovCisJaWYgKHJjID09IC1FQUdBSU4pCisJCXJjID0gMDsKKworCXJldHVybiByYzsKK30KKworaW50CitDSUZTU01CTG9nb2ZmKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzKQoreworCXN0cnVjdCBzbWJfaGRyICpzbWJfYnVmZmVyX3Jlc3BvbnNlOworCUxPR09GRl9BTkRYX1JFUSAqcFNNQjsKKwlpbnQgcmMgPSAwOworCWludCBsZW5ndGg7CisKKwljRllJKDEsICgiSW4gU01CTG9nb2ZmIGZvciBzZXNzaW9uIGRpc2Nvbm5lY3QiKSk7CisJaWYgKHNlcykKKwkJZG93bigmc2VzLT5zZXNTZW0pOworCWVsc2UKKwkJcmV0dXJuIC1FSU87CisKKwlhdG9taWNfZGVjKCZzZXMtPmluVXNlKTsKKwlpZiAoYXRvbWljX3JlYWQoJnNlcy0+aW5Vc2UpID4gMCkgeworCQl1cCgmc2VzLT5zZXNTZW0pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlyYyA9IHNtYWxsX3NtYl9pbml0KFNNQl9DT01fTE9HT0ZGX0FORFgsIDIsIE5VTEwsICh2b2lkICoqKSZwU01CKTsKKwlpZiAocmMpIHsKKwkJdXAoJnNlcy0+c2VzU2VtKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXNtYl9idWZmZXJfcmVzcG9uc2UgPSAoc3RydWN0IHNtYl9oZHIgKilwU01COyAvKiBCQiByZW1vdmVtZSBCQiAqLworCQorCWlmKHNlcy0+c2VydmVyKSB7CisJCWlmKHNlcy0+c2VydmVyLT5zZWNNb2RlICYgCisJCSAgIChTRUNNT0RFX1NJR05fUkVRVUlSRUQgfCBTRUNNT0RFX1NJR05fRU5BQkxFRCkpCisJCQlwU01CLT5oZHIuRmxhZ3MyIHw9IFNNQkZMRzJfU0VDVVJJVFlfU0lHTkFUVVJFOworCX0KKworCXBTTUItPmhkci5VaWQgPSBzZXMtPlN1aWQ7CisKKwlwU01CLT5BbmRYQ29tbWFuZCA9IDB4RkY7CisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgc21iX2J1ZmZlcl9yZXNwb25zZSwgJmxlbmd0aCwgMCk7CisJaWYgKHNlcy0+c2VydmVyKSB7CisJCWF0b21pY19kZWMoJnNlcy0+c2VydmVyLT5zb2NrZXRVc2VDb3VudCk7CisJCWlmIChhdG9taWNfcmVhZCgmc2VzLT5zZXJ2ZXItPnNvY2tldFVzZUNvdW50KSA9PSAwKSB7CisJCQlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJCXNlcy0+c2VydmVyLT50Y3BTdGF0dXMgPSBDaWZzRXhpdGluZzsKKwkJCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJCQlyYyA9IC1FU0hVVERPV047CisJCX0KKwl9CisJaWYgKHBTTUIpCisJCWNpZnNfc21hbGxfYnVmX3JlbGVhc2UocFNNQik7CisJdXAoJnNlcy0+c2VzU2VtKTsKKworCS8qIGlmIHNlc3Npb24gZGVhZCB0aGVuIHdlIGRvIG5vdCBuZWVkIHRvIGRvIHVsb2dvZmYsCisJCXNpbmNlIHNlcnZlciBjbG9zZWQgc21iIHNlc3Npb24sIG5vIHNlbnNlIHJlcG9ydGluZyAKKwkJZXJyb3IgKi8KKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJcmMgPSAwOworCXJldHVybiByYzsKK30KKworaW50CitDSUZTU01CRGVsRmlsZShjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCSAgICAgICBjb25zdCBjaGFyICpmaWxlTmFtZSwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCURFTEVURV9GSUxFX1JFUSAqcFNNQiA9IE5VTEw7CisJREVMRVRFX0ZJTEVfUlNQICpwU01CciA9IE5VTEw7CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQ7CisJaW50IG5hbWVfbGVuOworCitEZWxGaWxlUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX0RFTEVURSwgMSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChwU01CLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCW5hbWVfbGVuID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+ZmlsZU5hbWUsIGZpbGVOYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJfSBlbHNlIHsJCS8qIEJCIGltcHJvdmUgdGhlIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgQkIgKi8KKwkJbmFtZV9sZW4gPSBzdHJubGVuKGZpbGVOYW1lLCBQQVRIX01BWCk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShwU01CLT5maWxlTmFtZSwgZmlsZU5hbWUsIG5hbWVfbGVuKTsKKwl9CisJcFNNQi0+U2VhcmNoQXR0cmlidXRlcyA9CisJICAgIGNwdV90b19sZTE2KEFUVFJfUkVBRE9OTFkgfCBBVFRSX0hJRERFTiB8IEFUVFJfU1lTVEVNKTsKKwlwU01CLT5CdWZmZXJGb3JtYXQgPSAweDA0OworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBuYW1lX2xlbiArIDE7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYobmFtZV9sZW4gKyAxKTsKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJFcnJvciBpbiBSTUZpbGUgPSAlZCIsIHJjKSk7CisJfSAKKyNpZmRlZiBDT05GSUdfQ0lGU19TVEFUUworICAgICAgICBlbHNlIHsKKwkJYXRvbWljX2luYygmdGNvbi0+bnVtX2RlbGV0ZXMpOworICAgICAgICB9CisjZW5kaWYKKworCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gRGVsRmlsZVJldHJ5OworCisJcmV0dXJuIHJjOworfQorCitpbnQKK0NJRlNTTUJSbURpcihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCSAgICAgY29uc3QgY2hhciAqZGlyTmFtZSwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCURFTEVURV9ESVJFQ1RPUllfUkVRICpwU01CID0gTlVMTDsKKwlERUxFVEVfRElSRUNUT1JZX1JTUCAqcFNNQnIgPSBOVUxMOworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkOworCWludCBuYW1lX2xlbjsKKworCWNGWUkoMSwgKCJJbiBDSUZTU01CUm1EaXIiKSk7CitSbURpclJldHJ5OgorCXJjID0gc21iX2luaXQoU01CX0NPTV9ERUxFVEVfRElSRUNUT1JZLCAwLCB0Y29uLCAodm9pZCAqKikgJnBTTUIsCisJCSAgICAgICh2b2lkICoqKSAmcFNNQnIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKHBTTUItPmhkci5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJbmFtZV9sZW4gPSBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIHBTTUItPkRpck5hbWUsIGRpck5hbWUsIFBBVEhfTUFYCisJCQkJLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSwgbmxzX2NvZGVwYWdlKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQluYW1lX2xlbiAqPSAyOworCX0gZWxzZSB7CQkvKiBCQiBpbXByb3ZlIHRoZSBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW5zIEJCICovCisJCW5hbWVfbGVuID0gc3RybmxlbihkaXJOYW1lLCBQQVRIX01BWCk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShwU01CLT5EaXJOYW1lLCBkaXJOYW1lLCBuYW1lX2xlbik7CisJfQorCisJcFNNQi0+QnVmZmVyRm9ybWF0ID0gMHgwNDsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gbmFtZV9sZW4gKyAxOworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KG5hbWVfbGVuICsgMSk7CisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRllJKDEsICgiRXJyb3IgaW4gUk1EaXIgPSAlZCIsIHJjKSk7CisJfQorI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTCisgICAgICAgIGVsc2UgeworCQlhdG9taWNfaW5jKCZ0Y29uLT5udW1fcm1kaXJzKTsKKyAgICAgICAgfQorI2VuZGlmCisKKwljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIFJtRGlyUmV0cnk7CisJcmV0dXJuIHJjOworfQorCitpbnQKK0NJRlNTTUJNa0Rpcihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCSAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCWludCByYyA9IDA7CisJQ1JFQVRFX0RJUkVDVE9SWV9SRVEgKnBTTUIgPSBOVUxMOworCUNSRUFURV9ESVJFQ1RPUllfUlNQICpwU01CciA9IE5VTEw7CisJaW50IGJ5dGVzX3JldHVybmVkOworCWludCBuYW1lX2xlbjsKKworCWNGWUkoMSwgKCJJbiBDSUZTU01CTWtEaXIiKSk7CitNa0RpclJldHJ5OgorCXJjID0gc21iX2luaXQoU01CX0NPTV9DUkVBVEVfRElSRUNUT1JZLCAwLCB0Y29uLCAodm9pZCAqKikgJnBTTUIsCisJCSAgICAgICh2b2lkICoqKSAmcFNNQnIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKHBTTUItPmhkci5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJbmFtZV9sZW4gPSBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIHBTTUItPkRpck5hbWUsIG5hbWUsIFBBVEhfTUFYCisJCQkJCSAvKiBmaW5kIGRlZmluZSBmb3IgdGhpcyBtYXhwYXRoY29tcG9uZW50ICovCisJCQkJCSAsIG5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJbmFtZV9sZW4gKj0gMjsKKwl9IGVsc2UgewkJLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQluYW1lX2xlbiA9IHN0cm5sZW4obmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCXN0cm5jcHkocFNNQi0+RGlyTmFtZSwgbmFtZSwgbmFtZV9sZW4pOworCX0KKworCXBTTUItPkJ1ZmZlckZvcm1hdCA9IDB4MDQ7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IG5hbWVfbGVuICsgMTsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihuYW1lX2xlbiArIDEpOworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoIkVycm9yIGluIE1rZGlyID0gJWQiLCByYykpOworCX0KKyNpZmRlZiBDT05GSUdfQ0lGU19TVEFUUworICAgICAgICBlbHNlIHsKKwkJYXRvbWljX2luYygmdGNvbi0+bnVtX21rZGlycyk7CisgICAgICAgIH0KKyNlbmRpZgorCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gTWtEaXJSZXRyeTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorQ0lGU1NNQk9wZW4oY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkgICAgY29uc3QgY2hhciAqZmlsZU5hbWUsIGNvbnN0IGludCBvcGVuRGlzcG9zaXRpb24sCisJICAgIGNvbnN0IGludCBhY2Nlc3NfZmxhZ3MsIGNvbnN0IGludCBjcmVhdGVfb3B0aW9ucywgX191MTYgKiBuZXRmaWQsCisJICAgIGludCAqcE9wbG9jaywgRklMRV9BTExfSU5GTyAqIHBmaWxlX2luZm8sIAorCSAgICBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisJaW50IHJjID0gLUVBQ0NFUzsKKwlPUEVOX1JFUSAqcFNNQiA9IE5VTEw7CisJT1BFTl9SU1AgKnBTTUJyID0gTlVMTDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQ7CisJaW50IG5hbWVfbGVuOworCV9fdTE2IGNvdW50OworCitvcGVuUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX05UX0NSRUFURV9BTkRYLCAyNCwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBTTUItPkFuZFhDb21tYW5kID0gMHhGRjsJLyogbm9uZSAqLworCisJaWYgKHBTTUItPmhkci5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJY291bnQgPSAxOwkvKiBhY2NvdW50IGZvciBvbmUgYnl0ZSBwYWQgdG8gd29yZCBib3VuZGFyeSAqLworCQluYW1lX2xlbiA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIChwU01CLT5maWxlTmFtZSArIDEpLAorCQkJCSAgZmlsZU5hbWUsIFBBVEhfTUFYCisJCQkJICAvKiBmaW5kIGRlZmluZSBmb3IgdGhpcyBtYXhwYXRoY29tcG9uZW50ICovCisJCQkJICAsIG5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJbmFtZV9sZW4gKj0gMjsKKwkJcFNNQi0+TmFtZUxlbmd0aCA9IGNwdV90b19sZTE2KG5hbWVfbGVuKTsKKwl9IGVsc2UgewkJLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQljb3VudCA9IDA7CS8qIG5vIHBhZCAqLworCQluYW1lX2xlbiA9IHN0cm5sZW4oZmlsZU5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQlwU01CLT5OYW1lTGVuZ3RoID0gY3B1X3RvX2xlMTYobmFtZV9sZW4pOworCQlzdHJuY3B5KHBTTUItPmZpbGVOYW1lLCBmaWxlTmFtZSwgbmFtZV9sZW4pOworCX0KKwlpZiAoKnBPcGxvY2sgJiBSRVFfT1BMT0NLKQorCQlwU01CLT5PcGVuRmxhZ3MgPSBjcHVfdG9fbGUzMihSRVFfT1BMT0NLKTsKKwllbHNlIGlmICgqcE9wbG9jayAmIFJFUV9CQVRDSE9QTE9DSykgeworCQlwU01CLT5PcGVuRmxhZ3MgPSBjcHVfdG9fbGUzMihSRVFfQkFUQ0hPUExPQ0spOworCX0KKwlwU01CLT5EZXNpcmVkQWNjZXNzID0gY3B1X3RvX2xlMzIoYWNjZXNzX2ZsYWdzKTsKKwlwU01CLT5BbGxvY2F0aW9uU2l6ZSA9IDA7CisJcFNNQi0+RmlsZUF0dHJpYnV0ZXMgPSBjcHVfdG9fbGUzMihBVFRSX05PUk1BTCk7CisJLyogWFAgZG9lcyBub3QgaGFuZGxlIEFUVFJfUE9TSVhfU0VNQU5USUNTICovCisJLyogYnV0IGl0IGhlbHBzIHNwZWVkIHVwIGNhc2Ugc2Vuc2l0aXZlIGNoZWNrcyBmb3Igb3RoZXIKKwlzZXJ2ZXJzIHN1Y2ggYXMgU2FtYmEgKi8KKwlpZiAodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKKwkJcFNNQi0+RmlsZUF0dHJpYnV0ZXMgfD0gY3B1X3RvX2xlMzIoQVRUUl9QT1NJWF9TRU1BTlRJQ1MpOworCisJLyogaWYgKChvbW9kZSAmIFNfSVdVR08pID09IDApCisJCXBTTUItPkZpbGVBdHRyaWJ1dGVzIHw9IGNwdV90b19sZTMyKEFUVFJfUkVBRE9OTFkpOyovCisJLyogIEFib3ZlIGxpbmUgY2F1c2VzIHByb2JsZW1zIGR1ZSB0byB2ZnMgc3BsaXR0aW5nIGNyZWF0ZSBpbnRvIHR3bworCQlwaWVjZXMgLSBuZWVkIHRvIHNldCBtb2RlIGFmdGVyIGZpbGUgY3JlYXRlZCBub3Qgd2hpbGUgaXQgaXMKKwkJYmVpbmcgY3JlYXRlZCAqLworCXBTTUItPlNoYXJlQWNjZXNzID0gY3B1X3RvX2xlMzIoRklMRV9TSEFSRV9BTEwpOworCXBTTUItPkNyZWF0ZURpc3Bvc2l0aW9uID0gY3B1X3RvX2xlMzIob3BlbkRpc3Bvc2l0aW9uKTsKKwlwU01CLT5DcmVhdGVPcHRpb25zID0gY3B1X3RvX2xlMzIoY3JlYXRlX29wdGlvbnMpOworCXBTTUItPkltcGVyc29uYXRpb25MZXZlbCA9IGNwdV90b19sZTMyKFNFQ1VSSVRZX0lNUEVSU09OQVRJT04pOwkvKiBCQiA/PyovCisJcFNNQi0+U2VjdXJpdHlGbGFncyA9CisJICAgIFNFQ1VSSVRZX0NPTlRFWFRfVFJBQ0tJTkcgfCBTRUNVUklUWV9FRkZFQ1RJVkVfT05MWTsKKworCWNvdW50ICs9IG5hbWVfbGVuOworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBjb3VudDsKKworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGNvdW50KTsKKwkvKiBsb25nX29wIHNldCB0byAxIHRvIGFsbG93IGZvciBvcGxvY2sgYnJlYWsgdGltZW91dHMgKi8KKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMSk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJFcnJvciBpbiBPcGVuID0gJWQiLCByYykpOworCX0gZWxzZSB7CisJCSpwT3Bsb2NrID0gcFNNQnItPk9wbG9ja0xldmVsOwkvKiBvbmUgYnl0ZSBubyBuZWVkIHRvIGxlX3RvX2NwdSAqLworCQkqbmV0ZmlkID0gcFNNQnItPkZpZDsJLyogY2lmcyBmaWQgc3RheXMgaW4gbGUgKi8KKwkJLyogTGV0IGNhbGxlciBrbm93IGZpbGUgd2FzIGNyZWF0ZWQgc28gd2UgY2FuIHNldCB0aGUgbW9kZS4gKi8KKwkJLyogRG8gd2UgY2FyZSBhYm91dCB0aGUgQ3JlYXRlQWN0aW9uIGluIGFueSBvdGhlciBjYXNlcz8gKi8KKwkJaWYoY3B1X3RvX2xlMzIoRklMRV9DUkVBVEUpID09IHBTTUJyLT5DcmVhdGVBY3Rpb24pCisJCQkqcE9wbG9jayB8PSBDSUZTX0NSRUFURV9BQ1RJT047IAorCQlpZihwZmlsZV9pbmZvKSB7CisJCSAgICBtZW1jcHkoKGNoYXIgKilwZmlsZV9pbmZvLChjaGFyICopJnBTTUJyLT5DcmVhdGlvblRpbWUsCisJCQkzNiAvKiBDcmVhdGlvblRpbWUgdG8gQXR0cmlidXRlcyAqLyk7CisJCSAgICAvKiB0aGUgZmlsZV9pbmZvIGJ1ZiBpcyBlbmRpYW4gY29udmVydGVkIGJ5IGNhbGxlciAqLworCQkgICAgcGZpbGVfaW5mby0+QWxsb2NhdGlvblNpemUgPSBwU01Cci0+QWxsb2NhdGlvblNpemU7CisJCSAgICBwZmlsZV9pbmZvLT5FbmRPZkZpbGUgPSBwU01Cci0+RW5kT2ZGaWxlOworCQkgICAgcGZpbGVfaW5mby0+TnVtYmVyT2ZMaW5rcyA9IGNwdV90b19sZTMyKDEpOworCQl9CisKKyNpZmRlZiBDT05GSUdfQ0lGU19TVEFUUworCQlhdG9taWNfaW5jKCZ0Y29uLT5udW1fb3BlbnMpOworI2VuZGlmCisJfQorCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gb3BlblJldHJ5OworCXJldHVybiByYzsKK30KKworLyogSWYgbm8gYnVmZmVyIHBhc3NlZCBpbiwgdGhlbiBjYWxsZXIgd2FudHMgdG8gZG8gdGhlIGNvcHkKKwlhcyBpbiB0aGUgY2FzZSBvZiByZWFkcGFnZXMgc28gdGhlIFNNQiBidWZmZXIgbXVzdCBiZQorCWZyZWVkIGJ5IHRoZSBjYWxsZXIgKi8KKworaW50CitDSUZTU01CUmVhZChjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCSAgICBjb25zdCBpbnQgbmV0ZmlkLCBjb25zdCB1bnNpZ25lZCBpbnQgY291bnQsCisJICAgIGNvbnN0IF9fdTY0IGxzZWVrLCB1bnNpZ25lZCBpbnQgKm5ieXRlcywgY2hhciAqKmJ1ZikKK3sKKwlpbnQgcmMgPSAtRUFDQ0VTOworCVJFQURfUkVRICpwU01CID0gTlVMTDsKKwlSRUFEX1JTUCAqcFNNQnIgPSBOVUxMOworCWNoYXIgKnBSZWFkRGF0YSA9IE5VTEw7CisJaW50IGJ5dGVzX3JldHVybmVkOworCisJY0ZZSSgxLCgiUmVhZGluZyAlZCBieXRlcyBvbiBmaWQgJWQiLGNvdW50LG5ldGZpZCkpOworCisJKm5ieXRlcyA9IDA7CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1JFQURfQU5EWCwgMTIsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiB0Y29uIGFuZCBzZXMgcG9pbnRlciBhcmUgY2hlY2tlZCBpbiBzbWJfaW5pdCAqLworCWlmICh0Y29uLT5zZXMtPnNlcnZlciA9PSBOVUxMKQorCQlyZXR1cm4gLUVDT05OQUJPUlRFRDsKKworCXBTTUItPkFuZFhDb21tYW5kID0gMHhGRjsJLyogbm9uZSAqLworCXBTTUItPkZpZCA9IG5ldGZpZDsKKwlwU01CLT5PZmZzZXRMb3cgPSBjcHVfdG9fbGUzMihsc2VlayAmIDB4RkZGRkZGRkYpOworCXBTTUItPk9mZnNldEhpZ2ggPSBjcHVfdG9fbGUzMihsc2VlayA+PiAzMik7CisJcFNNQi0+UmVtYWluaW5nID0gMDsKKwlwU01CLT5NYXhDb3VudCA9IGNwdV90b19sZTE2KGNvdW50ICYgMHhGRkZGKTsKKwlwU01CLT5NYXhDb3VudEhpZ2ggPSBjcHVfdG9fbGUzMihjb3VudCA+PiAxNik7CisJcFNNQi0+Qnl0ZUNvdW50ID0gMDsgIC8qIG5vIG5lZWQgdG8gZG8gbGUgY29udmVyc2lvbiBzaW5jZSBpdCBpcyAwICovCisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNFUlJPUigxLCAoIlNlbmQgZXJyb3IgaW4gcmVhZCA9ICVkIiwgcmMpKTsKKwl9IGVsc2UgeworCQlpbnQgZGF0YV9sZW5ndGggPSBsZTE2X3RvX2NwdShwU01Cci0+RGF0YUxlbmd0aEhpZ2gpOworCQlkYXRhX2xlbmd0aCA9IGRhdGFfbGVuZ3RoIDw8IDE2OworCQlkYXRhX2xlbmd0aCArPSBsZTE2X3RvX2NwdShwU01Cci0+RGF0YUxlbmd0aCk7CisJCSpuYnl0ZXMgPSBkYXRhX2xlbmd0aDsKKworCQkvKmNoZWNrIHRoYXQgRGF0YUxlbmd0aCB3b3VsZCBub3QgZ28gYmV5b25kIGVuZCBvZiBTTUIgKi8KKwkJaWYgKChkYXRhX2xlbmd0aCA+IENJRlNNYXhCdWZTaXplKSAKKwkJCQl8fCAoZGF0YV9sZW5ndGggPiBjb3VudCkpIHsKKwkJCWNGWUkoMSwoImJhZCBsZW5ndGggJWQgZm9yIGNvdW50ICVkIixkYXRhX2xlbmd0aCxjb3VudCkpOworCQkJcmMgPSAtRUlPOworCQkJKm5ieXRlcyA9IDA7CisJCX0gZWxzZSB7CisJCQlwUmVhZERhdGEgPQorCQkJICAgIChjaGFyICopICgmcFNNQnItPmhkci5Qcm90b2NvbCkgKworCQkJICAgIGxlMTZfdG9fY3B1KHBTTUJyLT5EYXRhT2Zmc2V0KTsKKy8qCQkJaWYocmMgPSBjb3B5X3RvX3VzZXIoYnVmLCBwUmVhZERhdGEsIGRhdGFfbGVuZ3RoKSkgeworCQkJCWNFUlJPUigxLCgiRmF1bHRpbmcgb24gcmVhZCByYyA9ICVkIixyYykpOworCQkJCXJjID0gLUVGQVVMVDsKKwkJCX0qLyAvKiBjYW4gbm90IHVzZSBjb3B5X3RvX3VzZXIgd2hlbiB1c2luZyBwYWdlIGNhY2hlKi8KKwkJCWlmKCpidWYpCisJCQkgICAgbWVtY3B5KCpidWYscFJlYWREYXRhLGRhdGFfbGVuZ3RoKTsKKwkJfQorCX0KKwlpZigqYnVmKQorCQljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCWVsc2UKKwkJKmJ1ZiA9IChjaGFyICopcFNNQjsKKworCS8qIE5vdGU6IE9uIC1FQUdBSU4gZXJyb3Igb25seSBjYWxsZXIgY2FuIHJldHJ5IG9uIGhhbmRsZSBiYXNlZCBjYWxscyAKKwkJc2luY2UgZmlsZSBoYW5kbGUgcGFzc2VkIGluIG5vIGxvbmdlciB2YWxpZCAqLworCXJldHVybiByYzsKK30KKworaW50CitDSUZTU01CV3JpdGUoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkgICAgIGNvbnN0IGludCBuZXRmaWQsIGNvbnN0IHVuc2lnbmVkIGludCBjb3VudCwKKwkgICAgIGNvbnN0IF9fdTY0IG9mZnNldCwgdW5zaWduZWQgaW50ICpuYnl0ZXMsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkgICAgIGNvbnN0IGNoYXIgX191c2VyICogdWJ1ZiwgY29uc3QgaW50IGxvbmdfb3ApCit7CisJaW50IHJjID0gLUVBQ0NFUzsKKwlXUklURV9SRVEgKnBTTUIgPSBOVUxMOworCVdSSVRFX1JTUCAqcFNNQnIgPSBOVUxMOworCWludCBieXRlc19yZXR1cm5lZDsKKwlfX3UzMiBieXRlc19zZW50OworCV9fdTE2IGJ5dGVfY291bnQ7CisKKwkvKiBjRllJKDEsKCJ3cml0ZSBhdCAlbGxkICVkIGJ5dGVzIixvZmZzZXQsY291bnQpKTsqLworCXJjID0gc21iX2luaXQoU01CX0NPTV9XUklURV9BTkRYLCAxNCwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwkvKiB0Y29uIGFuZCBzZXMgcG9pbnRlciBhcmUgY2hlY2tlZCBpbiBzbWJfaW5pdCAqLworCWlmICh0Y29uLT5zZXMtPnNlcnZlciA9PSBOVUxMKQorCQlyZXR1cm4gLUVDT05OQUJPUlRFRDsKKworCXBTTUItPkFuZFhDb21tYW5kID0gMHhGRjsJLyogbm9uZSAqLworCXBTTUItPkZpZCA9IG5ldGZpZDsKKwlwU01CLT5PZmZzZXRMb3cgPSBjcHVfdG9fbGUzMihvZmZzZXQgJiAweEZGRkZGRkZGKTsKKwlwU01CLT5PZmZzZXRIaWdoID0gY3B1X3RvX2xlMzIob2Zmc2V0ID4+IDMyKTsKKwlwU01CLT5SZXNlcnZlZCA9IDB4RkZGRkZGRkY7CisJcFNNQi0+V3JpdGVNb2RlID0gMDsKKwlwU01CLT5SZW1haW5pbmcgPSAwOworCisJLyogQ2FuIGluY3JlYXNlIGJ1ZmZlciBzaXplIGlmIGJ1ZmZlciBpcyBiaWcgZW5vdWdoIGluIHNvbWUgY2FzZXMgLSBpZSB3ZSAKKwljYW4gc2VuZCBtb3JlIGlmIExBUkdFX1dSSVRFX1ggY2FwYWJpbGl0eSByZXR1cm5lZCBieSB0aGUgc2VydmVyIGFuZCBpZgorCW91ciBidWZmZXIgaXMgYmlnIGVub3VnaCBvciBpZiB3ZSBjb252ZXJ0IHRvIGlvdmVjcyBvbiBzb2NrZXQgd3JpdGVzCisJYW5kIGVsaW1pbmF0ZSB0aGUgY29weSB0byB0aGUgQ0lGUyBidWZmZXIgKi8KKwlpZih0Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9MQVJHRV9XUklURV9YKSB7CisJCWJ5dGVzX3NlbnQgPSBtaW5fdChjb25zdCB1bnNpZ25lZCBpbnQsIENJRlNNYXhCdWZTaXplLCBjb3VudCk7CisJfSBlbHNlIHsKKwkJYnl0ZXNfc2VudCA9ICh0Y29uLT5zZXMtPnNlcnZlci0+bWF4QnVmIC0gTUFYX0NJRlNfSERSX1NJWkUpCisJCQkgJiB+MHhGRjsKKwl9CisKKwlpZiAoYnl0ZXNfc2VudCA+IGNvdW50KQorCQlieXRlc19zZW50ID0gY291bnQ7CisJcFNNQi0+RGF0YU9mZnNldCA9CisJICAgIGNwdV90b19sZTE2KG9mZnNldG9mKHN0cnVjdCBzbWJfY29tX3dyaXRlX3JlcSxEYXRhKSAtIDQpOworCWlmKGJ1ZikKKwkgICAgbWVtY3B5KHBTTUItPkRhdGEsYnVmLGJ5dGVzX3NlbnQpOworCWVsc2UgaWYodWJ1ZikgeworCQlpZihjb3B5X2Zyb21fdXNlcihwU01CLT5EYXRhLHVidWYsYnl0ZXNfc2VudCkpIHsKKwkJCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIE5vIGJ1ZmZlciAqLworCQljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlieXRlX2NvdW50ID0gYnl0ZXNfc2VudCArIDEgLyogcGFkICovIDsgLyogQkIgZml4IHRoaXMgZm9yIHNlbmRzID4gNjRLICovCisJcFNNQi0+RGF0YUxlbmd0aExvdyA9IGNwdV90b19sZTE2KGJ5dGVzX3NlbnQgJiAweEZGRkYpOworCXBTTUItPkRhdGFMZW5ndGhIaWdoID0gY3B1X3RvX2xlMTYoYnl0ZXNfc2VudCA+PiAxNik7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVzX3NlbnQrMTsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCBsb25nX29wKTsKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoIlNlbmQgZXJyb3IgaW4gd3JpdGUgPSAlZCIsIHJjKSk7CisJCSpuYnl0ZXMgPSAwOworCX0gZWxzZSB7CisJCSpuYnl0ZXMgPSBsZTE2X3RvX2NwdShwU01Cci0+Q291bnRIaWdoKTsKKwkJKm5ieXRlcyA9ICgqbmJ5dGVzKSA8PCAxNjsKKwkJKm5ieXRlcyArPSBsZTE2X3RvX2NwdShwU01Cci0+Q291bnQpOworCX0KKworCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisKKwkvKiBOb3RlOiBPbiAtRUFHQUlOIGVycm9yIG9ubHkgY2FsbGVyIGNhbiByZXRyeSBvbiBoYW5kbGUgYmFzZWQgY2FsbHMgCisJCXNpbmNlIGZpbGUgaGFuZGxlIHBhc3NlZCBpbiBubyBsb25nZXIgdmFsaWQgKi8KKworCXJldHVybiByYzsKK30KKworI2lmZGVmIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTAoraW50IENJRlNTTUJXcml0ZTIoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkgICAgIGNvbnN0IGludCBuZXRmaWQsIGNvbnN0IHVuc2lnbmVkIGludCBjb3VudCwKKwkgICAgIGNvbnN0IF9fdTY0IG9mZnNldCwgdW5zaWduZWQgaW50ICpuYnl0ZXMsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJICAgICBjb25zdCBpbnQgbG9uZ19vcCkKK3sKKwlpbnQgcmMgPSAtRUFDQ0VTOworCVdSSVRFX1JFUSAqcFNNQiA9IE5VTEw7CisJV1JJVEVfUlNQICpwU01CciA9IE5VTEw7CisJLyppbnQgYnl0ZXNfcmV0dXJuZWQ7Ki8KKwl1bnNpZ25lZCBieXRlc19zZW50OworCV9fdTE2IGJ5dGVfY291bnQ7CisKKwlyYyA9IHNtYWxsX3NtYl9pbml0KFNNQl9DT01fV1JJVEVfQU5EWCwgMTQsIHRjb24sICh2b2lkICoqKSAmcFNNQik7CisgICAgCisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJCisJcFNNQnIgPSAoV1JJVEVfUlNQICopcFNNQjsgLyogQkIgcmVtb3ZlbWUgQkIgKi8KKworCS8qIHRjb24gYW5kIHNlcyBwb2ludGVyIGFyZSBjaGVja2VkIGluIHNtYl9pbml0ICovCisJaWYgKHRjb24tPnNlcy0+c2VydmVyID09IE5VTEwpCisJCXJldHVybiAtRUNPTk5BQk9SVEVEOworCisJcFNNQi0+QW5kWENvbW1hbmQgPSAweEZGOyAvKiBub25lICovCisJcFNNQi0+RmlkID0gbmV0ZmlkOworCXBTTUItPk9mZnNldExvdyA9IGNwdV90b19sZTMyKG9mZnNldCAmIDB4RkZGRkZGRkYpOworCXBTTUItPk9mZnNldEhpZ2ggPSBjcHVfdG9fbGUzMihvZmZzZXQgPj4gMzIpOworCXBTTUItPlJlc2VydmVkID0gMHhGRkZGRkZGRjsKKwlwU01CLT5Xcml0ZU1vZGUgPSAwOworCXBTTUItPlJlbWFpbmluZyA9IDA7CisJYnl0ZXNfc2VudCA9ICh0Y29uLT5zZXMtPnNlcnZlci0+bWF4QnVmIC0gTUFYX0NJRlNfSERSX1NJWkUpICYgfjB4RkY7CisJaWYgKGJ5dGVzX3NlbnQgPiBjb3VudCkKKwkJYnl0ZXNfc2VudCA9IGNvdW50OworCXBTTUItPkRhdGFMZW5ndGhIaWdoID0gMDsKKwlwU01CLT5EYXRhT2Zmc2V0ID0KKwkgICAgY3B1X3RvX2xlMTYob2Zmc2V0b2Yoc3RydWN0IHNtYl9jb21fd3JpdGVfcmVxLERhdGEpIC0gNCk7CisKKwlieXRlX2NvdW50ID0gYnl0ZXNfc2VudCArIDEgLyogcGFkICovIDsKKwlwU01CLT5EYXRhTGVuZ3RoTG93ID0gY3B1X3RvX2xlMTYoYnl0ZXNfc2VudCk7CisJcFNNQi0+RGF0YUxlbmd0aEhpZ2ggPSAwOworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBieXRlX2NvdW50OworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGJ5dGVfY291bnQpOworCisvKglyYyA9IFNlbmRSZWNlaXZlMih4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCBidWYsIGJ1ZmxlbiwgJmJ5dGVzX3JldHVybmVkLCBsb25nX29wKTsgKi8gIC8qIEJCIGZpeG1lIEJCICovCisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZW5kIGVycm9yIGluIHdyaXRlMiAobGFyZ2Ugd3JpdGUpID0gJWQiLCByYykpOworCQkqbmJ5dGVzID0gMDsKKwl9IGVsc2UKKwkJKm5ieXRlcyA9IGxlMTZfdG9fY3B1KHBTTUJyLT5Db3VudCk7CisKKwljaWZzX3NtYWxsX2J1Zl9yZWxlYXNlKHBTTUIpOworCisJLyogTm90ZTogT24gLUVBR0FJTiBlcnJvciBvbmx5IGNhbGxlciBjYW4gcmV0cnkgb24gaGFuZGxlIGJhc2VkIGNhbGxzIAorCQlzaW5jZSBmaWxlIGhhbmRsZSBwYXNzZWQgaW4gbm8gbG9uZ2VyIHZhbGlkICovCisKKwlyZXR1cm4gcmM7Cit9CisjZW5kaWYgLyogQ0lGU19FWFBFUklNRU5UQUwgKi8KKworaW50CitDSUZTU01CTG9jayhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCSAgICBjb25zdCBfX3UxNiBzbWJfZmlsZV9pZCwgY29uc3QgX191NjQgbGVuLAorCSAgICBjb25zdCBfX3U2NCBvZmZzZXQsIGNvbnN0IF9fdTMyIG51bVVubG9jaywKKwkgICAgY29uc3QgX191MzIgbnVtTG9jaywgY29uc3QgX191OCBsb2NrVHlwZSwgY29uc3QgaW50IHdhaXRGbGFnKQoreworCWludCByYyA9IDA7CisJTE9DS19SRVEgKnBTTUIgPSBOVUxMOworCUxPQ0tfUlNQICpwU01CciA9IE5VTEw7CisJaW50IGJ5dGVzX3JldHVybmVkOworCWludCB0aW1lb3V0ID0gMDsKKwlfX3UxNiBjb3VudDsKKworCWNGWUkoMSwgKCJJbiBDSUZTU01CTG9jayAtIHRpbWVvdXQgJWQgbnVtTG9jayAlZCIsd2FpdEZsYWcsbnVtTG9jaykpOworCXJjID0gc21iX2luaXQoU01CX0NPTV9MT0NLSU5HX0FORFgsIDgsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZihsb2NrVHlwZSA9PSBMT0NLSU5HX0FORFhfT1BMT0NLX1JFTEVBU0UpIHsKKwkJdGltZW91dCA9IC0xOyAvKiBubyByZXNwb25zZSBleHBlY3RlZCAqLworCQlwU01CLT5UaW1lb3V0ID0gMDsKKwl9IGVsc2UgaWYgKHdhaXRGbGFnID09IFRSVUUpIHsKKwkJdGltZW91dCA9IDM7ICAvKiBibG9ja2luZyBvcGVyYXRpb24sIG5vIHRpbWVvdXQgKi8KKwkJcFNNQi0+VGltZW91dCA9IGNwdV90b19sZTMyKC0xKTsvKiBibG9ja2luZyAtIGRvIG5vdCB0aW1lIG91dCAqLworCX0gZWxzZSB7CisJCXBTTUItPlRpbWVvdXQgPSAwOworCX0KKworCXBTTUItPk51bWJlck9mTG9ja3MgPSBjcHVfdG9fbGUxNihudW1Mb2NrKTsKKwlwU01CLT5OdW1iZXJPZlVubG9ja3MgPSBjcHVfdG9fbGUxNihudW1VbmxvY2spOworCXBTTUItPkxvY2tUeXBlID0gbG9ja1R5cGU7CisJcFNNQi0+QW5kWENvbW1hbmQgPSAweEZGOwkvKiBub25lICovCisJcFNNQi0+RmlkID0gc21iX2ZpbGVfaWQ7IC8qIG5ldGZpZCBzdGF5cyBsZSAqLworCisJaWYoKG51bUxvY2sgIT0gMCkgfHwgKG51bVVubG9jayAhPSAwKSkgeworCQlwU01CLT5Mb2Nrc1swXS5QaWQgPSBjcHVfdG9fbGUxNihjdXJyZW50LT50Z2lkKTsKKwkJLyogQkIgd2hlcmUgdG8gc3RvcmUgcGlkIGhpZ2g/ICovCisJCXBTTUItPkxvY2tzWzBdLkxlbmd0aExvdyA9IGNwdV90b19sZTMyKCh1MzIpbGVuKTsKKwkJcFNNQi0+TG9ja3NbMF0uTGVuZ3RoSGlnaCA9IGNwdV90b19sZTMyKCh1MzIpKGxlbj4+MzIpKTsKKwkJcFNNQi0+TG9ja3NbMF0uT2Zmc2V0TG93ID0gY3B1X3RvX2xlMzIoKHUzMilvZmZzZXQpOworCQlwU01CLT5Mb2Nrc1swXS5PZmZzZXRIaWdoID0gY3B1X3RvX2xlMzIoKHUzMikob2Zmc2V0Pj4zMikpOworCQljb3VudCA9IHNpemVvZihMT0NLSU5HX0FORFhfUkFOR0UpOworCX0gZWxzZSB7CisJCS8qIG9wbG9jayBicmVhayAqLworCQljb3VudCA9IDA7CisJfQorCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBjb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgdGltZW91dCk7CisKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoIlNlbmQgZXJyb3IgaW4gTG9jayA9ICVkIiwgcmMpKTsKKwl9CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCS8qIE5vdGU6IE9uIC1FQUdBSU4gZXJyb3Igb25seSBjYWxsZXIgY2FuIHJldHJ5IG9uIGhhbmRsZSBiYXNlZCBjYWxscyAKKwlzaW5jZSBmaWxlIGhhbmRsZSBwYXNzZWQgaW4gbm8gbG9uZ2VyIHZhbGlkICovCisJcmV0dXJuIHJjOworfQorCitpbnQKK0NJRlNTTUJDbG9zZShjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLCBpbnQgc21iX2ZpbGVfaWQpCit7CisJaW50IHJjID0gMDsKKwlDTE9TRV9SRVEgKnBTTUIgPSBOVUxMOworCUNMT1NFX1JTUCAqcFNNQnIgPSBOVUxMOworCWludCBieXRlc19yZXR1cm5lZDsKKwljRllJKDEsICgiSW4gQ0lGU1NNQkNsb3NlIikpOworCisvKiBkbyBub3QgcmV0cnkgb24gZGVhZCBzZXNzaW9uIG9uIGNsb3NlICovCisJcmMgPSBzbWFsbF9zbWJfaW5pdChTTUJfQ09NX0NMT1NFLCAzLCB0Y29uLCAodm9pZCAqKikgJnBTTUIpOworCWlmKHJjID09IC1FQUdBSU4pCisJCXJldHVybiAwOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcFNNQnIgPSAoQ0xPU0VfUlNQICopcFNNQjsgLyogQkIgcmVtb3ZlbWUgQkIgKi8KKworCXBTTUItPkZpbGVJRCA9IChfX3UxNikgc21iX2ZpbGVfaWQ7CisJcFNNQi0+TGFzdFdyaXRlVGltZSA9IDA7CisJcFNNQi0+Qnl0ZUNvdW50ID0gMDsKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWlmKHJjIT0tRUlOVFIpIHsKKwkJCS8qIEVJTlRSIGlzIGV4cGVjdGVkIHdoZW4gdXNlciBjdGwtYyB0byBraWxsIGFwcCAqLworCQkJY0VSUk9SKDEsICgiU2VuZCBlcnJvciBpbiBDbG9zZSA9ICVkIiwgcmMpKTsKKwkJfQorCX0KKworCWNpZnNfc21hbGxfYnVmX3JlbGVhc2UocFNNQik7CisKKwkvKiBTaW5jZSBzZXNzaW9uIGlzIGRlYWQsIGZpbGUgd2lsbCBiZSBjbG9zZWQgb24gc2VydmVyIGFscmVhZHkgKi8KKwlpZihyYyA9PSAtRUFHQUlOKQorCQlyYyA9IDA7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorQ0lGU1NNQlJlbmFtZShjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCSAgICAgIGNvbnN0IGNoYXIgKmZyb21OYW1lLCBjb25zdCBjaGFyICp0b05hbWUsCisJICAgICAgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCWludCByYyA9IDA7CisJUkVOQU1FX1JFUSAqcFNNQiA9IE5VTEw7CisJUkVOQU1FX1JTUCAqcFNNQnIgPSBOVUxMOworCWludCBieXRlc19yZXR1cm5lZDsKKwlpbnQgbmFtZV9sZW4sIG5hbWVfbGVuMjsKKwlfX3UxNiBjb3VudDsKKworCWNGWUkoMSwgKCJJbiBDSUZTU01CUmVuYW1lIikpOworcmVuYW1lUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1JFTkFNRSwgMSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBTTUItPkJ1ZmZlckZvcm1hdCA9IDB4MDQ7CisJcFNNQi0+U2VhcmNoQXR0cmlidXRlcyA9CisJICAgIGNwdV90b19sZTE2KEFUVFJfUkVBRE9OTFkgfCBBVFRSX0hJRERFTiB8IEFUVFJfU1lTVEVNIHwKKwkJCUFUVFJfRElSRUNUT1JZKTsKKworCWlmIChwU01CLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCW5hbWVfbGVuID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+T2xkRmlsZU5hbWUsIGZyb21OYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJCXBTTUItPk9sZEZpbGVOYW1lW25hbWVfbGVuXSA9IDB4MDQ7CS8qIHBhZCAqLworCS8qIHByb3RvY29sIHJlcXVpcmVzIEFTQ0lJIHNpZ25hdHVyZSBieXRlIG9uIFVuaWNvZGUgc3RyaW5nICovCisJCXBTTUItPk9sZEZpbGVOYW1lW25hbWVfbGVuICsgMV0gPSAweDAwOworCQluYW1lX2xlbjIgPQorCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSAmIHBTTUItPgorCQkJCSAgT2xkRmlsZU5hbWVbbmFtZV9sZW4gKyAyXSwgdG9OYW1lLCBQQVRIX01BWCwKKwkJCQkgIG5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuMiArPSAxIC8qIHRyYWlsaW5nIG51bGwgKi8gICsgMSAvKiBTaWduYXR1cmUgd29yZCAqLyA7CisJCW5hbWVfbGVuMiAqPSAyOwkvKiBjb252ZXJ0IHRvIGJ5dGVzICovCisJfSBlbHNlIHsJCS8qIEJCIGltcHJvdmUgdGhlIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgQkIgKi8KKwkJbmFtZV9sZW4gPSBzdHJubGVuKGZyb21OYW1lLCBQQVRIX01BWCk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShwU01CLT5PbGRGaWxlTmFtZSwgZnJvbU5hbWUsIG5hbWVfbGVuKTsKKwkJbmFtZV9sZW4yID0gc3Rybmxlbih0b05hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4yKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJcFNNQi0+T2xkRmlsZU5hbWVbbmFtZV9sZW5dID0gMHgwNDsgIC8qIDJuZCBidWZmZXIgZm9ybWF0ICovCisJCXN0cm5jcHkoJnBTTUItPk9sZEZpbGVOYW1lW25hbWVfbGVuICsgMV0sIHRvTmFtZSwgbmFtZV9sZW4yKTsKKwkJbmFtZV9sZW4yKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJbmFtZV9sZW4yKys7CS8qIHNpZ25hdHVyZSBieXRlICovCisJfQorCisJY291bnQgPSAxIC8qIDFzdCBzaWduYXR1cmUgYnl0ZSAqLyAgKyBuYW1lX2xlbiArIG5hbWVfbGVuMjsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoY291bnQpOworCisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRllJKDEsICgiU2VuZCBlcnJvciBpbiByZW5hbWUgPSAlZCIsIHJjKSk7CisJfSAKKworI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTCisJICBlbHNlIHsKKwkJYXRvbWljX2luYygmdGNvbi0+bnVtX3JlbmFtZXMpOworCX0KKyNlbmRpZgorCisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIHJlbmFtZVJldHJ5OworCisJcmV0dXJuIHJjOworfQorCitpbnQgQ0lGU1NNQlJlbmFtZU9wZW5GaWxlKGNvbnN0IGludCB4aWQsc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb24sIAorCQlpbnQgbmV0ZmlkLCBjaGFyICogdGFyZ2V0X25hbWUsIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKiBubHNfY29kZXBhZ2UpIAoreworCXN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9zZmlfcmVxICpwU01CICA9IE5VTEw7CisJc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NmaV9yc3AgKnBTTUJyID0gTlVMTDsKKwlzdHJ1Y3Qgc2V0X2ZpbGVfcmVuYW1lICogcmVuYW1lX2luZm87CisJY2hhciAqZGF0YV9vZmZzZXQ7CisJY2hhciBkdW1teV9zdHJpbmdbMzBdOworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwlpbnQgbGVuX29mX3N0cjsKKwlfX3UxNiBwYXJhbXMsIHBhcmFtX29mZnNldCwgb2Zmc2V0LCBjb3VudCwgYnl0ZV9jb3VudDsKKworCWNGWUkoMSwgKCJSZW5hbWUgdG8gRmlsZSBieSBoYW5kbGUiKSk7CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHBUY29uLCAodm9pZCAqKikgJnBTTUIsCisJCQkodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBhcmFtcyA9IDY7CisJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQgPSAwOworCXBTTUItPkZsYWdzID0gMDsKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCXBhcmFtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9zZmlfcmVxLCBGaWQpIC0gNDsKKwlvZmZzZXQgPSBwYXJhbV9vZmZzZXQgKyBwYXJhbXM7CisKKwlkYXRhX29mZnNldCA9IChjaGFyICopICgmcFNNQi0+aGRyLlByb3RvY29sKSArIG9mZnNldDsKKwlyZW5hbWVfaW5mbyA9IChzdHJ1Y3Qgc2V0X2ZpbGVfcmVuYW1lICopIGRhdGFfb2Zmc2V0OworCXBTTUItPk1heFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYoMik7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoMTAwMCk7IC8qIEJCIGZpbmQgbWF4IFNNQiBQRFUgZnJvbSBzZXNzICovCisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CisJcFNNQi0+UmVzZXJ2ZWQzID0gMDsKKwlwU01CLT5TdWJDb21tYW5kID0gY3B1X3RvX2xlMTYoVFJBTlMyX1NFVF9GSUxFX0lORk9STUFUSU9OKTsKKwlieXRlX2NvdW50ID0gMyAvKiBwYWQgKi8gICsgcGFyYW1zOworCXBTTUItPlBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50ID0gcFNNQi0+UGFyYW1ldGVyQ291bnQ7CisJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gY3B1X3RvX2xlMTYocGFyYW1fb2Zmc2V0KTsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmc2V0KTsKKwkvKiBjb25zdHJ1Y3QgcmFuZG9tIG5hbWUgIi5jaWZzX3RtcDxpbm9kZW51bT48bWlkPiIgKi8KKwlyZW5hbWVfaW5mby0+b3ZlcndyaXRlID0gY3B1X3RvX2xlMzIoMSk7CisJcmVuYW1lX2luZm8tPnJvb3RfZmlkICA9IDA7CisJLyogdW5pY29kZSBvbmx5IGNhbGwgKi8KKwlpZih0YXJnZXRfbmFtZSA9PSBOVUxMKSB7CisJCXNwcmludGYoZHVtbXlfc3RyaW5nLCJjaWZzJXgiLHBTTUItPmhkci5NaWQpOworCSAgICAgICAgbGVuX29mX3N0ciA9IGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcmVuYW1lX2luZm8tPnRhcmdldF9uYW1lLCBkdW1teV9zdHJpbmcsIDI0LCBubHNfY29kZXBhZ2UpOworCX0gZWxzZSB7CisJCWxlbl9vZl9zdHIgPSBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIHJlbmFtZV9pbmZvLT50YXJnZXRfbmFtZSwgdGFyZ2V0X25hbWUsIFBBVEhfTUFYLCBubHNfY29kZXBhZ2UpOworCX0KKwlyZW5hbWVfaW5mby0+dGFyZ2V0X25hbWVfbGVuID0gY3B1X3RvX2xlMzIoMiAqIGxlbl9vZl9zdHIpOworCWNvdW50ID0gMTIgLyogc2l6ZW9mKHN0cnVjdCBzZXRfZmlsZV9yZW5hbWUpICovICsgKDIgKiBsZW5fb2Zfc3RyKSArIDI7CisJYnl0ZV9jb3VudCArPSBjb3VudDsKKwlwU01CLT5EYXRhQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CisJcFNNQi0+VG90YWxEYXRhQ291bnQgPSBwU01CLT5EYXRhQ291bnQ7CisJcFNNQi0+RmlkID0gbmV0ZmlkOworCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPQorCQljcHVfdG9fbGUxNihTTUJfU0VUX0ZJTEVfUkVOQU1FX0lORk9STUFUSU9OKTsKKwlwU01CLT5SZXNlcnZlZDQgPSAwOworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBieXRlX2NvdW50OworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGJ5dGVfY291bnQpOworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCBwVGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwoIlNlbmQgZXJyb3IgaW4gUmVuYW1lIChieSBmaWxlIGhhbmRsZSkgPSAlZCIsIHJjKSk7CisJfQorI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTCisJICBlbHNlIHsKKwkJYXRvbWljX2luYygmcFRjb24tPm51bV90MnJlbmFtZXMpOworCX0KKyNlbmRpZgorCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisKKwkvKiBOb3RlOiBPbiAtRUFHQUlOIGVycm9yIG9ubHkgY2FsbGVyIGNhbiByZXRyeSBvbiBoYW5kbGUgYmFzZWQgY2FsbHMKKwkJc2luY2UgZmlsZSBoYW5kbGUgcGFzc2VkIGluIG5vIGxvbmdlciB2YWxpZCAqLworCisJcmV0dXJuIHJjOworfQorCitpbnQKK0NJRlNTTUJDb3B5KGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sIGNvbnN0IGNoYXIgKiBmcm9tTmFtZSwgCisgICAgICAgICAgICBjb25zdCBfX3UxNiB0YXJnZXRfdGlkLCBjb25zdCBjaGFyICp0b05hbWUsIGNvbnN0IGludCBmbGFncywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSkKK3sKKwlpbnQgcmMgPSAwOworCUNPUFlfUkVRICpwU01CID0gTlVMTDsKKwlDT1BZX1JTUCAqcFNNQnIgPSBOVUxMOworCWludCBieXRlc19yZXR1cm5lZDsKKwlpbnQgbmFtZV9sZW4sIG5hbWVfbGVuMjsKKwlfX3UxNiBjb3VudDsKKworCWNGWUkoMSwgKCJJbiBDSUZTU01CQ29weSIpKTsKK2NvcHlSZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fQ09QWSwgMSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkJKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwU01CLT5CdWZmZXJGb3JtYXQgPSAweDA0OworCXBTTUItPlRpZDIgPSB0YXJnZXRfdGlkOworCisJcFNNQi0+RmxhZ3MgPSBjcHVfdG9fbGUxNihmbGFncyAmIENPUFlfVFJFRSk7CisKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbiA9IGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+T2xkRmlsZU5hbWUsIAorCQkJCWZyb21OYW1lLCAKKwkJCQlQQVRIX01BWCAvKiBmaW5kIGRlZmluZSBmb3IgdGhpcyBtYXhwYXRoY29tcG9uZW50ICovLAorCQkJCW5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuKys7ICAgICAvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJCXBTTUItPk9sZEZpbGVOYW1lW25hbWVfbGVuXSA9IDB4MDQ7ICAgICAvKiBwYWQgKi8KKwkJLyogcHJvdG9jb2wgcmVxdWlyZXMgQVNDSUkgc2lnbmF0dXJlIGJ5dGUgb24gVW5pY29kZSBzdHJpbmcgKi8KKwkJcFNNQi0+T2xkRmlsZU5hbWVbbmFtZV9sZW4gKyAxXSA9IDB4MDA7CisJCW5hbWVfbGVuMiA9IGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgJiBwU01CLT4KKwkJCQlPbGRGaWxlTmFtZVtuYW1lX2xlbiArIDJdLCB0b05hbWUsIFBBVEhfTUFYLAorCQkJCW5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuMiArPSAxIC8qIHRyYWlsaW5nIG51bGwgKi8gICsgMSAvKiBTaWduYXR1cmUgd29yZCAqLyA7CisJCW5hbWVfbGVuMiAqPSAyOyAvKiBjb252ZXJ0IHRvIGJ5dGVzICovCisJfSBlbHNlIHsgICAgICAgICAgICAgICAgLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQluYW1lX2xlbiA9IHN0cm5sZW4oZnJvbU5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4rKzsgICAgIC8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShwU01CLT5PbGRGaWxlTmFtZSwgZnJvbU5hbWUsIG5hbWVfbGVuKTsKKwkJbmFtZV9sZW4yID0gc3Rybmxlbih0b05hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4yKys7ICAgIC8qIHRyYWlsaW5nIG51bGwgKi8KKwkJcFNNQi0+T2xkRmlsZU5hbWVbbmFtZV9sZW5dID0gMHgwNDsgIC8qIDJuZCBidWZmZXIgZm9ybWF0ICovCisJCXN0cm5jcHkoJnBTTUItPk9sZEZpbGVOYW1lW25hbWVfbGVuICsgMV0sIHRvTmFtZSwgbmFtZV9sZW4yKTsKKwkJbmFtZV9sZW4yKys7ICAgIC8qIHRyYWlsaW5nIG51bGwgKi8KKwkJbmFtZV9sZW4yKys7ICAgIC8qIHNpZ25hdHVyZSBieXRlICovCisJfQorCisJY291bnQgPSAxIC8qIDFzdCBzaWduYXR1cmUgYnl0ZSAqLyAgKyBuYW1lX2xlbiArIG5hbWVfbGVuMjsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoY291bnQpOworCisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCShzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoIlNlbmQgZXJyb3IgaW4gY29weSA9ICVkIHdpdGggJWQgZmlsZXMgY29waWVkIiwKKwkJCXJjLCBsZTE2X3RvX2NwdShwU01Cci0+Q29weUNvdW50KSkpOworCX0KKwlpZiAocFNNQikKKwkJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIGNvcHlSZXRyeTsKKworCXJldHVybiByYzsKK30KKworaW50CitDSUZTVW5peENyZWF0ZVN5bUxpbmsoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJICAgICAgY29uc3QgY2hhciAqZnJvbU5hbWUsIGNvbnN0IGNoYXIgKnRvTmFtZSwKKwkJICAgICAgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCVRSQU5TQUNUSU9OMl9TUElfUkVRICpwU01CID0gTlVMTDsKKwlUUkFOU0FDVElPTjJfU1BJX1JTUCAqcFNNQnIgPSBOVUxMOworCWNoYXIgKmRhdGFfb2Zmc2V0OworCWludCBuYW1lX2xlbjsKKwlpbnQgbmFtZV9sZW5fdGFyZ2V0OworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwlfX3UxNiBwYXJhbXMsIHBhcmFtX29mZnNldCwgb2Zmc2V0LCBieXRlX2NvdW50OworCisJY0ZZSSgxLCAoIkluIFN5bWxpbmsgVW5peCBzdHlsZSIpKTsKK2NyZWF0ZVN5bUxpbmtSZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChwU01CLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCW5hbWVfbGVuID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+RmlsZU5hbWUsIGZyb21OYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisKKwl9IGVsc2UgewkJLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQluYW1lX2xlbiA9IHN0cm5sZW4oZnJvbU5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQlzdHJuY3B5KHBTTUItPkZpbGVOYW1lLCBmcm9tTmFtZSwgbmFtZV9sZW4pOworCX0KKwlwYXJhbXMgPSA2ICsgbmFtZV9sZW47CisJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQgPSAwOworCXBTTUItPkZsYWdzID0gMDsKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCXBhcmFtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9zcGlfcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uTGV2ZWwpIC0gNDsKKwlvZmZzZXQgPSBwYXJhbV9vZmZzZXQgKyBwYXJhbXM7CisKKwlkYXRhX29mZnNldCA9IChjaGFyICopICgmcFNNQi0+aGRyLlByb3RvY29sKSArIG9mZnNldDsKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbl90YXJnZXQgPQorCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBkYXRhX29mZnNldCwgdG9OYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbl90YXJnZXQrKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQluYW1lX2xlbl90YXJnZXQgKj0gMjsKKwl9IGVsc2UgewkJLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQluYW1lX2xlbl90YXJnZXQgPSBzdHJubGVuKHRvTmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbl90YXJnZXQrKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQlzdHJuY3B5KGRhdGFfb2Zmc2V0LCB0b05hbWUsIG5hbWVfbGVuX3RhcmdldCk7CisJfQorCisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNigyKTsKKwkvKiBCQiBmaW5kIGV4YWN0IG1heCBvbiBkYXRhIGNvdW50IGJlbG93IGZyb20gc2VzcyAqLworCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTE2KDEwMDApOworCXBTTUItPlNldHVwQ291bnQgPSAxOworCXBTTUItPlJlc2VydmVkMyA9IDA7CisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KFRSQU5TMl9TRVRfUEFUSF9JTkZPUk1BVElPTik7CisJYnl0ZV9jb3VudCA9IDMgLyogcGFkICovICArIHBhcmFtcyArIG5hbWVfbGVuX3RhcmdldDsKKwlwU01CLT5EYXRhQ291bnQgPSBjcHVfdG9fbGUxNihuYW1lX2xlbl90YXJnZXQpOworCXBTTUItPlBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IHBTTUItPkRhdGFDb3VudDsKKwlwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50ID0gcFNNQi0+UGFyYW1ldGVyQ291bnQ7CisJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gY3B1X3RvX2xlMTYocGFyYW1fb2Zmc2V0KTsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmc2V0KTsKKwlwU01CLT5JbmZvcm1hdGlvbkxldmVsID0gY3B1X3RvX2xlMTYoU01CX1NFVF9GSUxFX1VOSVhfTElOSyk7CisJcFNNQi0+UmVzZXJ2ZWQ0ID0gMDsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwKKwkJICAgICAoIlNlbmQgZXJyb3IgaW4gU2V0UGF0aEluZm8gKGNyZWF0ZSBzeW1saW5rKSA9ICVkIiwKKwkJICAgICAgcmMpKTsKKwl9CisKKwlpZiAocFNNQikKKwkJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIGNyZWF0ZVN5bUxpbmtSZXRyeTsKKworCXJldHVybiByYzsKK30KKworaW50CitDSUZTVW5peENyZWF0ZUhhcmRMaW5rKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCSAgICAgICBjb25zdCBjaGFyICpmcm9tTmFtZSwgY29uc3QgY2hhciAqdG9OYW1lLAorCQkgICAgICAgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCVRSQU5TQUNUSU9OMl9TUElfUkVRICpwU01CID0gTlVMTDsKKwlUUkFOU0FDVElPTjJfU1BJX1JTUCAqcFNNQnIgPSBOVUxMOworCWNoYXIgKmRhdGFfb2Zmc2V0OworCWludCBuYW1lX2xlbjsKKwlpbnQgbmFtZV9sZW5fdGFyZ2V0OworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwlfX3UxNiBwYXJhbXMsIHBhcmFtX29mZnNldCwgb2Zmc2V0LCBieXRlX2NvdW50OworCisJY0ZZSSgxLCAoIkluIENyZWF0ZSBIYXJkIGxpbmsgVW5peCBzdHlsZSIpKTsKK2NyZWF0ZUhhcmRMaW5rUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbiA9IGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+RmlsZU5hbWUsIHRvTmFtZSwgUEFUSF9NQVgKKwkJCQkJIC8qIGZpbmQgZGVmaW5lIGZvciB0aGlzIG1heHBhdGhjb21wb25lbnQgKi8KKwkJCQkJICwgbmxzX2NvZGVwYWdlKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQluYW1lX2xlbiAqPSAyOworCisJfSBlbHNlIHsJCS8qIEJCIGltcHJvdmUgdGhlIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgQkIgKi8KKwkJbmFtZV9sZW4gPSBzdHJubGVuKHRvTmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCXN0cm5jcHkocFNNQi0+RmlsZU5hbWUsIHRvTmFtZSwgbmFtZV9sZW4pOworCX0KKwlwYXJhbXMgPSA2ICsgbmFtZV9sZW47CisJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQgPSAwOworCXBTTUItPkZsYWdzID0gMDsKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCXBhcmFtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9zcGlfcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uTGV2ZWwpIC0gNDsKKwlvZmZzZXQgPSBwYXJhbV9vZmZzZXQgKyBwYXJhbXM7CisKKwlkYXRhX29mZnNldCA9IChjaGFyICopICgmcFNNQi0+aGRyLlByb3RvY29sKSArIG9mZnNldDsKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbl90YXJnZXQgPQorCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBkYXRhX29mZnNldCwgZnJvbU5hbWUsIFBBVEhfTUFYCisJCQkJICAvKiBmaW5kIGRlZmluZSBmb3IgdGhpcyBtYXhwYXRoY29tcG9uZW50ICovCisJCQkJICAsIG5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuX3RhcmdldCsrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuX3RhcmdldCAqPSAyOworCX0gZWxzZSB7CQkvKiBCQiBpbXByb3ZlIHRoZSBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW5zIEJCICovCisJCW5hbWVfbGVuX3RhcmdldCA9IHN0cm5sZW4oZnJvbU5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW5fdGFyZ2V0Kys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShkYXRhX29mZnNldCwgZnJvbU5hbWUsIG5hbWVfbGVuX3RhcmdldCk7CisJfQorCisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNigyKTsKKwkvKiBCQiBmaW5kIGV4YWN0IG1heCBvbiBkYXRhIGNvdW50IGJlbG93IGZyb20gc2VzcyovCisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoMTAwMCk7CisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CisJcFNNQi0+UmVzZXJ2ZWQzID0gMDsKKwlwU01CLT5TdWJDb21tYW5kID0gY3B1X3RvX2xlMTYoVFJBTlMyX1NFVF9QQVRIX0lORk9STUFUSU9OKTsKKwlieXRlX2NvdW50ID0gMyAvKiBwYWQgKi8gICsgcGFyYW1zICsgbmFtZV9sZW5fdGFyZ2V0OworCXBTTUItPlBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50ID0gcFNNQi0+UGFyYW1ldGVyQ291bnQ7CisJcFNNQi0+RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYobmFtZV9sZW5fdGFyZ2V0KTsKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IHBTTUItPkRhdGFDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihwYXJhbV9vZmZzZXQpOworCXBTTUItPkRhdGFPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXQpOworCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfU0VUX0ZJTEVfVU5JWF9ITElOSyk7CisJcFNNQi0+UmVzZXJ2ZWQ0ID0gMDsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZW5kIGVycm9yIGluIFNldFBhdGhJbmZvIChoYXJkIGxpbmspID0gJWQiLCByYykpOworCX0KKworCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gY3JlYXRlSGFyZExpbmtSZXRyeTsKKworCXJldHVybiByYzsKK30KKworaW50CitDSUZTQ3JlYXRlSGFyZExpbmsoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJICAgY29uc3QgY2hhciAqZnJvbU5hbWUsIGNvbnN0IGNoYXIgKnRvTmFtZSwKKwkJICAgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCWludCByYyA9IDA7CisJTlRfUkVOQU1FX1JFUSAqcFNNQiA9IE5VTEw7CisJUkVOQU1FX1JTUCAqcFNNQnIgPSBOVUxMOworCWludCBieXRlc19yZXR1cm5lZDsKKwlpbnQgbmFtZV9sZW4sIG5hbWVfbGVuMjsKKwlfX3UxNiBjb3VudDsKKworCWNGWUkoMSwgKCJJbiBDSUZTQ3JlYXRlSGFyZExpbmsiKSk7Cit3aW5DcmVhdGVIYXJkTGlua1JldHJ5OgorCisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX05UX1JFTkFNRSwgNCwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBTTUItPlNlYXJjaEF0dHJpYnV0ZXMgPQorCSAgICBjcHVfdG9fbGUxNihBVFRSX1JFQURPTkxZIHwgQVRUUl9ISURERU4gfCBBVFRSX1NZU1RFTSB8CisJCQlBVFRSX0RJUkVDVE9SWSk7CisJcFNNQi0+RmxhZ3MgPSBjcHVfdG9fbGUxNihDUkVBVEVfSEFSRF9MSU5LKTsKKwlwU01CLT5DbHVzdGVyQ291bnQgPSAwOworCisJcFNNQi0+QnVmZmVyRm9ybWF0ID0gMHgwNDsKKworCWlmIChwU01CLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCW5hbWVfbGVuID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+T2xkRmlsZU5hbWUsIGZyb21OYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJCXBTTUItPk9sZEZpbGVOYW1lW25hbWVfbGVuXSA9IDA7CS8qIHBhZCAqLworCQlwU01CLT5PbGRGaWxlTmFtZVtuYW1lX2xlbiArIDFdID0gMHgwNDsgCisJCW5hbWVfbGVuMiA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopICYgcFNNQi0+CisJCQkJICBPbGRGaWxlTmFtZVtuYW1lX2xlbiArIDJdLCB0b05hbWUsIFBBVEhfTUFYLAorCQkJCSAgbmxzX2NvZGVwYWdlKTsKKwkJbmFtZV9sZW4yICs9IDEgLyogdHJhaWxpbmcgbnVsbCAqLyAgKyAxIC8qIFNpZ25hdHVyZSB3b3JkICovIDsKKwkJbmFtZV9sZW4yICo9IDI7CS8qIGNvbnZlcnQgdG8gYnl0ZXMgKi8KKwl9IGVsc2UgewkJLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQluYW1lX2xlbiA9IHN0cm5sZW4oZnJvbU5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQlzdHJuY3B5KHBTTUItPk9sZEZpbGVOYW1lLCBmcm9tTmFtZSwgbmFtZV9sZW4pOworCQluYW1lX2xlbjIgPSBzdHJubGVuKHRvTmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbjIrKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQlwU01CLT5PbGRGaWxlTmFtZVtuYW1lX2xlbl0gPSAweDA0OwkvKiAybmQgYnVmZmVyIGZvcm1hdCAqLworCQlzdHJuY3B5KCZwU01CLT5PbGRGaWxlTmFtZVtuYW1lX2xlbiArIDFdLCB0b05hbWUsIG5hbWVfbGVuMik7CisJCW5hbWVfbGVuMisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuMisrOwkvKiBzaWduYXR1cmUgYnl0ZSAqLworCX0KKworCWNvdW50ID0gMSAvKiBzdHJpbmcgdHlwZSBieXRlICovICArIG5hbWVfbGVuICsgbmFtZV9sZW4yOworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBjb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZW5kIGVycm9yIGluIGhhcmQgbGluayAoTlQgcmVuYW1lKSA9ICVkIiwgcmMpKTsKKwl9CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJZ290byB3aW5DcmVhdGVIYXJkTGlua1JldHJ5OworCisJcmV0dXJuIHJjOworfQorCitpbnQKK0NJRlNTTUJVbml4UXVlcnlTeW1MaW5rKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzZWFyY2hOYW1lLAorCQkJY2hhciAqc3ltbGlua2luZm8sIGNvbnN0IGludCBidWZsZW4sCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisvKiBTTUJfUVVFUllfRklMRV9VTklYX0xJTksgKi8KKwlUUkFOU0FDVElPTjJfUVBJX1JFUSAqcFNNQiA9IE5VTEw7CisJVFJBTlNBQ1RJT04yX1FQSV9SU1AgKnBTTUJyID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCWludCBieXRlc19yZXR1cm5lZDsKKwlpbnQgbmFtZV9sZW47CisJX191MTYgcGFyYW1zLCBieXRlX2NvdW50OworCisJY0ZZSSgxLCAoIkluIFFQYXRoU3ltTGlua0luZm8gKFVuaXgpIGZvciBwYXRoICVzIiwgc2VhcmNoTmFtZSkpOworCitxdWVyeVN5bUxpbmtSZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChwU01CLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCW5hbWVfbGVuID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+RmlsZU5hbWUsIHNlYXJjaE5hbWUsIFBBVEhfTUFYCisJCQkJICAvKiBmaW5kIGRlZmluZSBmb3IgdGhpcyBtYXhwYXRoY29tcG9uZW50ICovCisJCQkJICAsIG5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJbmFtZV9sZW4gKj0gMjsKKwl9IGVsc2UgewkJLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQluYW1lX2xlbiA9IHN0cm5sZW4oc2VhcmNoTmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCXN0cm5jcHkocFNNQi0+RmlsZU5hbWUsIHNlYXJjaE5hbWUsIG5hbWVfbGVuKTsKKwl9CisKKwlwYXJhbXMgPSAyIC8qIGxldmVsICovICArIDQgLyogcnNydmQgKi8gICsgbmFtZV9sZW4gLyogaW5jbCBudWxsICovIDsKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IDA7CisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNigyKTsKKwkvKiBCQiBmaW5kIGV4YWN0IG1heCBkYXRhIGNvdW50IGJlbG93IGZyb20gc2VzcyBzdHJ1Y3R1cmUgQkIgKi8KKwlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUxNig0MDAwKTsKKwlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKKwlwU01CLT5SZXNlcnZlZCA9IDA7CisJcFNNQi0+RmxhZ3MgPSAwOworCXBTTUItPlRpbWVvdXQgPSAwOworCXBTTUItPlJlc2VydmVkMiA9IDA7CisJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmc2V0b2YoCisgICAgICAgIHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9xcGlfcmVxICxJbmZvcm1hdGlvbkxldmVsKSAtIDQpOworCXBTTUItPkRhdGFDb3VudCA9IDA7CisJcFNNQi0+RGF0YU9mZnNldCA9IDA7CisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CisJcFNNQi0+UmVzZXJ2ZWQzID0gMDsKKwlwU01CLT5TdWJDb21tYW5kID0gY3B1X3RvX2xlMTYoVFJBTlMyX1FVRVJZX1BBVEhfSU5GT1JNQVRJT04pOworCWJ5dGVfY291bnQgPSBwYXJhbXMgKyAxIC8qIHBhZCAqLyA7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50OworCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfUVVFUllfRklMRV9VTklYX0xJTkspOworCXBTTUItPlJlc2VydmVkNCA9IDA7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVfY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoYnl0ZV9jb3VudCk7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZW5kIGVycm9yIGluIFF1ZXJ5U3ltTGlua0luZm8gPSAlZCIsIHJjKSk7CisJfSBlbHNlIHsKKwkJLyogZGVjb2RlIHJlc3BvbnNlICovCisKKwkJcmMgPSB2YWxpZGF0ZV90Migoc3RydWN0IHNtYl90Ml9yc3AgKilwU01Ccik7CisJCWlmIChyYyB8fCAocFNNQnItPkJ5dGVDb3VudCA8IDIpKQorCQkvKiBCQiBhbHNvIGNoZWNrIGVub3VnaCB0b3RhbCBieXRlcyByZXR1cm5lZCAqLworCQkJcmMgPSAtRUlPOwkvKiBiYWQgc21iICovCisJCWVsc2UgeworCQkJX191MTYgZGF0YV9vZmZzZXQgPSBsZTE2X3RvX2NwdShwU01Cci0+dDIuRGF0YU9mZnNldCk7CisJCQlfX3UxNiBjb3VudCA9IGxlMTZfdG9fY3B1KHBTTUJyLT50Mi5EYXRhQ291bnQpOworCisJCQlpZiAocFNNQnItPmhkci5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJCQluYW1lX2xlbiA9IFVuaVN0cm5sZW4oKHdjaGFyX3QgKikgKChjaGFyICopCisJCQkJCSZwU01Cci0+aGRyLlByb3RvY29sICtkYXRhX29mZnNldCksCisJCQkJCW1pbl90KGNvbnN0IGludCwgYnVmbGVuLGNvdW50KSAvIDIpOworCQkJCWNpZnNfc3RyZnJvbVVDU19sZShzeW1saW5raW5mbywKKwkJCQkJKHdjaGFyX3QgKikgKChjaGFyICopJnBTTUJyLT5oZHIuUHJvdG9jb2wgKworCQkJCQkJZGF0YV9vZmZzZXQpLAorCQkJCQluYW1lX2xlbiwgbmxzX2NvZGVwYWdlKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RybmNweShzeW1saW5raW5mbywKKwkJCQkJKGNoYXIgKikgJnBTTUJyLT5oZHIuUHJvdG9jb2wgKyAKKwkJCQkJCWRhdGFfb2Zmc2V0LAorCQkJCQltaW5fdChjb25zdCBpbnQsIGJ1ZmxlbiwgY291bnQpKTsKKwkJCX0KKwkJCXN5bWxpbmtpbmZvW2J1Zmxlbl0gPSAwOworCS8qIGp1c3QgaW4gY2FzZSBzbyBjYWxsaW5nIGNvZGUgZG9lcyBub3QgZ28gb2ZmIHRoZSBlbmQgb2YgYnVmZmVyICovCisJCX0KKwl9CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJZ290byBxdWVyeVN5bUxpbmtSZXRyeTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorQ0lGU1NNQlF1ZXJ5UmVwYXJzZUxpbmtJbmZvKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzZWFyY2hOYW1lLAorCQkJY2hhciAqc3ltbGlua2luZm8sIGNvbnN0IGludCBidWZsZW4sX191MTYgZmlkLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkOworCWludCBuYW1lX2xlbjsKKwlzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9pb2N0bF9yZXEgKiBwU01COworCXN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uX2lvY3RsX3JzcCAqIHBTTUJyOworCisJY0ZZSSgxLCAoIkluIFdpbmRvd3MgcmVwYXJzZSBzdHlsZSBRdWVyeUxpbmsgZm9yIHBhdGggJXMiLCBzZWFyY2hOYW1lKSk7CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX05UX1RSQU5TQUNULCAyMywgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQgPSAwIDsKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IDA7CisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUzMigyKTsKKwkvKiBCQiBmaW5kIGV4YWN0IGRhdGEgY291bnQgbWF4IGZyb20gc2VzcyBzdHJ1Y3R1cmUgQkIgKi8KKwlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUzMig0MDAwKTsKKwlwU01CLT5NYXhTZXR1cENvdW50ID0gNDsKKwlwU01CLT5SZXNlcnZlZCA9IDA7CisJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gMDsKKwlwU01CLT5EYXRhQ291bnQgPSAwOworCXBTTUItPkRhdGFPZmZzZXQgPSAwOworCXBTTUItPlNldHVwQ291bnQgPSA0OworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihOVF9UUkFOU0FDVF9JT0NUTCk7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50OworCXBTTUItPkZ1bmN0aW9uQ29kZSA9IGNwdV90b19sZTMyKEZTQ1RMX0dFVF9SRVBBUlNFX1BPSU5UKTsKKwlwU01CLT5Jc0ZzY3RsID0gMTsgLyogRlNDVEwgKi8KKwlwU01CLT5Jc1Jvb3RGbGFnID0gMDsKKwlwU01CLT5GaWQgPSBmaWQ7IC8qIGZpbGUgaGFuZGxlIGFsd2F5cyBsZSAqLworCXBTTUItPkJ5dGVDb3VudCA9IDA7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZW5kIGVycm9yIGluIFF1ZXJ5UmVwYXJzZUxpbmtJbmZvID0gJWQiLCByYykpOworCX0gZWxzZSB7CQkvKiBkZWNvZGUgcmVzcG9uc2UgKi8KKwkJX191MzIgZGF0YV9vZmZzZXQgPSBsZTMyX3RvX2NwdShwU01Cci0+RGF0YU9mZnNldCk7CisJCV9fdTMyIGRhdGFfY291bnQgPSBsZTMyX3RvX2NwdShwU01Cci0+RGF0YUNvdW50KTsKKwkJaWYgKChwU01Cci0+Qnl0ZUNvdW50IDwgMikgfHwgKGRhdGFfb2Zmc2V0ID4gNTEyKSkKKwkJLyogQkIgYWxzbyBjaGVjayBlbm91Z2ggdG90YWwgYnl0ZXMgcmV0dXJuZWQgKi8KKwkJCXJjID0gLUVJTzsJLyogYmFkIHNtYiAqLworCQllbHNlIHsKKwkJCWlmKGRhdGFfY291bnQgJiYgKGRhdGFfY291bnQgPCAyMDQ4KSkgeworCQkJCWNoYXIgKiBlbmRfb2Zfc21iID0gcFNNQnItPkJ5dGVDb3VudCArIChjaGFyICopJnBTTUJyLT5CeXRlQ291bnQ7CisKKwkJCQlzdHJ1Y3QgcmVwYXJzZV9kYXRhICogcmVwYXJzZV9idWYgPSAoc3RydWN0IHJlcGFyc2VfZGF0YSAqKQorCQkJCQkoKGNoYXIgKikmcFNNQnItPmhkci5Qcm90b2NvbCArIGRhdGFfb2Zmc2V0KTsKKwkJCQlpZigoY2hhciopcmVwYXJzZV9idWYgPj0gZW5kX29mX3NtYikgeworCQkJCQlyYyA9IC1FSU87CisJCQkJCWdvdG8gcXJlcGFyc2Vfb3V0OworCQkJCX0KKwkJCQlpZigocmVwYXJzZV9idWYtPkxpbmtOYW1lc0J1ZiArIAorCQkJCQlyZXBhcnNlX2J1Zi0+VGFyZ2V0TmFtZU9mZnNldCArCisJCQkJCXJlcGFyc2VfYnVmLT5UYXJnZXROYW1lTGVuKSA+CisJCQkJCQllbmRfb2Zfc21iKSB7CisJCQkJCWNGWUkoMSwoInJlcGFyc2UgYnVmIGV4dGVuZGVkIGJleW9uZCBTTUIiKSk7CisJCQkJCXJjID0gLUVJTzsKKwkJCQkJZ290byBxcmVwYXJzZV9vdXQ7CisJCQkJfQorCQkJCQorCQkJCWlmIChwU01Cci0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQkJCQluYW1lX2xlbiA9IFVuaVN0cm5sZW4oKHdjaGFyX3QgKikKKwkJCQkJCQkocmVwYXJzZV9idWYtPkxpbmtOYW1lc0J1ZiArIAorCQkJCQkJCXJlcGFyc2VfYnVmLT5UYXJnZXROYW1lT2Zmc2V0KSwKKwkJCQkJCQltaW4oYnVmbGVuLzIsIHJlcGFyc2VfYnVmLT5UYXJnZXROYW1lTGVuIC8gMikpOyAKKwkJCQkJY2lmc19zdHJmcm9tVUNTX2xlKHN5bWxpbmtpbmZvLAorCQkJCQkJKHdjaGFyX3QgKikgKHJlcGFyc2VfYnVmLT5MaW5rTmFtZXNCdWYgKyAKKwkJCQkJCXJlcGFyc2VfYnVmLT5UYXJnZXROYW1lT2Zmc2V0KSwKKwkJCQkJCW5hbWVfbGVuLCBubHNfY29kZXBhZ2UpOworCQkJCX0gZWxzZSB7IC8qIEFTQ0lJIG5hbWVzICovCisJCQkJCXN0cm5jcHkoc3ltbGlua2luZm8scmVwYXJzZV9idWYtPkxpbmtOYW1lc0J1ZiArIAorCQkJCQkJcmVwYXJzZV9idWYtPlRhcmdldE5hbWVPZmZzZXQsIAorCQkJCQkJbWluX3QoY29uc3QgaW50LCBidWZsZW4sIHJlcGFyc2VfYnVmLT5UYXJnZXROYW1lTGVuKSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlyYyA9IC1FSU87CisJCQkJY0ZZSSgxLCgiSW52YWxpZCByZXR1cm4gZGF0YSBjb3VudCBvbiBnZXQgcmVwYXJzZSBpbmZvIGlvY3RsIikpOworCQkJfQorCQkJc3ltbGlua2luZm9bYnVmbGVuXSA9IDA7IC8qIGp1c3QgaW4gY2FzZSBzbyB0aGUgY2FsbGVyCisJCQkJCWRvZXMgbm90IGdvIG9mZiB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KKwkJCWNGWUkoMSwoInJlYWRsaW5rIHJlc3VsdCAtICVzICIsc3ltbGlua2luZm8pKTsKKwkJfQorCX0KK3FyZXBhcnNlX291dDoKKwlpZiAocFNNQikKKwkJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCS8qIE5vdGU6IE9uIC1FQUdBSU4gZXJyb3Igb25seSBjYWxsZXIgY2FuIHJldHJ5IG9uIGhhbmRsZSBiYXNlZCBjYWxscworCQlzaW5jZSBmaWxlIGhhbmRsZSBwYXNzZWQgaW4gbm8gbG9uZ2VyIHZhbGlkICovCisKKwlyZXR1cm4gcmM7Cit9CisKKyNpZmRlZiBDT05GSUdfQ0lGU19QT1NJWAorCisvKkNvbnZlcnQgYW4gQWNjZXNzIENvbnRyb2wgRW50cnkgZnJvbSB3aXJlIGZvcm1hdCB0byBsb2NhbCBQT1NJWCB4YXR0ciBmb3JtYXQqLworc3RhdGljIHZvaWQgY2lmc19jb252ZXJ0X2FjZShwb3NpeF9hY2xfeGF0dHJfZW50cnkgKiBhY2UsIHN0cnVjdCBjaWZzX3Bvc2l4X2FjZSAqIGNpZnNfYWNlKQoreworCS8qIHU4IGNpZnMgZmllbGRzIGRvIG5vdCBuZWVkIGxlIGNvbnZlcnNpb24gKi8KKwlhY2UtPmVfcGVybSA9IChfX3UxNiljaWZzX2FjZS0+Y2lmc19lX3Blcm07IAorCWFjZS0+ZV90YWcgID0gKF9fdTE2KWNpZnNfYWNlLT5jaWZzX2VfdGFnOworCWFjZS0+ZV9pZCAgID0gKF9fdTMyKWxlNjRfdG9fY3B1KGNpZnNfYWNlLT5jaWZzX3VpZCk7CisJLyogY0ZZSSgxLCgicGVybSAlZCB0YWcgJWQgaWQgJWQiLGFjZS0+ZV9wZXJtLGFjZS0+ZV90YWcsYWNlLT5lX2lkKSk7ICovCisKKwlyZXR1cm47Cit9CisKKy8qIENvbnZlcnQgQUNMIGZyb20gQ0lGUyBQT1NJWCB3aXJlIGZvcm1hdCB0byBsb2NhbCBMaW51eCBQT1NJWCBBQ0wgeGF0dHIgKi8KK3N0YXRpYyBpbnQgY2lmc19jb3B5X3Bvc2l4X2FjbChjaGFyICogdHJndCxjaGFyICogc3JjLCBjb25zdCBpbnQgYnVmbGVuLGNvbnN0IGludCBhY2xfdHlwZSxjb25zdCBpbnQgc2l6ZV9vZl9kYXRhX2FyZWEpCit7CisJaW50IHNpemUgPSAgMDsKKwlpbnQgaTsKKwlfX3UxNiBjb3VudDsKKwlzdHJ1Y3QgY2lmc19wb3NpeF9hY2UgKiBwQUNFOworCXN0cnVjdCBjaWZzX3Bvc2l4X2FjbCAqIGNpZnNfYWNsID0gKHN0cnVjdCBjaWZzX3Bvc2l4X2FjbCAqKXNyYzsKKwlwb3NpeF9hY2xfeGF0dHJfaGVhZGVyICogbG9jYWxfYWNsID0gKHBvc2l4X2FjbF94YXR0cl9oZWFkZXIgKil0cmd0OworCisJaWYgKGxlMTZfdG9fY3B1KGNpZnNfYWNsLT52ZXJzaW9uKSAhPSBDSUZTX0FDTF9WRVJTSU9OKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZihhY2xfdHlwZSAmIEFDTF9UWVBFX0FDQ0VTUykgeworCQljb3VudCA9IGxlMTZfdG9fY3B1KGNpZnNfYWNsLT5hY2Nlc3NfZW50cnlfY291bnQpOworCQlwQUNFID0gJmNpZnNfYWNsLT5hY2VfYXJyYXlbMF07CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGNpZnNfcG9zaXhfYWNsKTsKKwkJc2l6ZSArPSBzaXplb2Yoc3RydWN0IGNpZnNfcG9zaXhfYWNlKSAqIGNvdW50OworCQkvKiBjaGVjayBpZiB3ZSB3b3VsZCBnbyBiZXlvbmQgZW5kIG9mIFNNQiAqLworCQlpZihzaXplX29mX2RhdGFfYXJlYSA8IHNpemUpIHsKKwkJCWNGWUkoMSwoImJhZCBDSUZTIFBPU0lYIEFDTCBzaXplICVkIHZzLiAlZCIsc2l6ZV9vZl9kYXRhX2FyZWEsc2l6ZSkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYoYWNsX3R5cGUgJiBBQ0xfVFlQRV9ERUZBVUxUKSB7CisJCWNvdW50ID0gbGUxNl90b19jcHUoY2lmc19hY2wtPmFjY2Vzc19lbnRyeV9jb3VudCk7CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGNpZnNfcG9zaXhfYWNsKTsKKwkJc2l6ZSArPSBzaXplb2Yoc3RydWN0IGNpZnNfcG9zaXhfYWNlKSAqIGNvdW50OworLyogc2tpcCBwYXN0IGFjY2VzcyBBQ0VzIHRvIGdldCB0byBkZWZhdWx0IEFDRXMgKi8KKwkJcEFDRSA9ICZjaWZzX2FjbC0+YWNlX2FycmF5W2NvdW50XTsKKwkJY291bnQgPSBsZTE2X3RvX2NwdShjaWZzX2FjbC0+ZGVmYXVsdF9lbnRyeV9jb3VudCk7CisJCXNpemUgKz0gc2l6ZW9mKHN0cnVjdCBjaWZzX3Bvc2l4X2FjZSkgKiBjb3VudDsKKwkJLyogY2hlY2sgaWYgd2Ugd291bGQgZ28gYmV5b25kIGVuZCBvZiBTTUIgKi8KKwkJaWYoc2l6ZV9vZl9kYXRhX2FyZWEgPCBzaXplKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJLyogaWxsZWdhbCB0eXBlICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNpemUgPSBwb3NpeF9hY2xfeGF0dHJfc2l6ZShjb3VudCk7CisJaWYoKGJ1ZmxlbiA9PSAwKSB8fCAobG9jYWxfYWNsID09IE5VTEwpKSB7CisJCS8qIHVzZWQgdG8gcXVlcnkgQUNMIEVBIHNpemUgKi8JCQkJCisJfSBlbHNlIGlmKHNpemUgPiBidWZsZW4pIHsKKwkJcmV0dXJuIC1FUkFOR0U7CisJfSBlbHNlIC8qIGJ1ZmZlciBiaWcgZW5vdWdoICovIHsKKwkJbG9jYWxfYWNsLT5hX3ZlcnNpb24gPSBQT1NJWF9BQ0xfWEFUVFJfVkVSU0lPTjsKKwkJZm9yKGkgPSAwO2kgPCBjb3VudCA7aSsrKSB7CisJCQljaWZzX2NvbnZlcnRfYWNlKCZsb2NhbF9hY2wtPmFfZW50cmllc1tpXSxwQUNFKTsKKwkJCXBBQ0UgKys7CisJCX0KKwl9CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBfX3UxNiBjb252ZXJ0X2FjZV90b19jaWZzX2FjZShzdHJ1Y3QgY2lmc19wb3NpeF9hY2UgKiBjaWZzX2FjZSwKKwkJCWNvbnN0IHBvc2l4X2FjbF94YXR0cl9lbnRyeSAqIGxvY2FsX2FjZSkKK3sKKwlfX3UxNiByYyA9IDA7IC8qIDAgPSBBQ0wgY29udmVydGVkIG9rICovCisKKwljaWZzX2FjZS0+Y2lmc19lX3Blcm0gPSAoX191OCljcHVfdG9fbGUxNihsb2NhbF9hY2UtPmVfcGVybSk7CisJY2lmc19hY2UtPmNpZnNfZV90YWcgPSAgKF9fdTgpY3B1X3RvX2xlMTYobG9jYWxfYWNlLT5lX3RhZyk7CisJLyogQkIgaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGUgbGFyZ2UgdWlkPyAqLworCWlmKGxvY2FsX2FjZS0+ZV9pZCA9PSAtMSkgeworCS8qIFByb2JhYmx5IG5vIG5lZWQgdG8gbGUgY29udmVydCAtMSBvbiBhbnkgYXJjaCBidXQgY2FuIG5vdCBodXJ0ICovCisJCWNpZnNfYWNlLT5jaWZzX3VpZCA9IGNwdV90b19sZTY0KC0xKTsKKwl9IGVsc2UgCisJCWNpZnNfYWNlLT5jaWZzX3VpZCA9IChfX3U2NCljcHVfdG9fbGUzMihsb2NhbF9hY2UtPmVfaWQpOworICAgICAgICAvKmNGWUkoMSwoInBlcm0gJWQgdGFnICVkIGlkICVkIixhY2UtPmVfcGVybSxhY2UtPmVfdGFnLGFjZS0+ZV9pZCkpOyovCisJcmV0dXJuIHJjOworfQorCisvKiBDb252ZXJ0IEFDTCBmcm9tIGxvY2FsIExpbnV4IFBPU0lYIHhhdHRyIHRvIENJRlMgUE9TSVggQUNMIHdpcmUgZm9ybWF0ICovCitzdGF0aWMgX191MTYgQUNMX3RvX2NpZnNfcG9zaXgoY2hhciAqIHBhcm1fZGF0YSxjb25zdCBjaGFyICogcEFDTCxjb25zdCBpbnQgYnVmbGVuLAorCQljb25zdCBpbnQgYWNsX3R5cGUpCit7CisJX191MTYgcmMgPSAwOworICAgICAgICBzdHJ1Y3QgY2lmc19wb3NpeF9hY2wgKiBjaWZzX2FjbCA9IChzdHJ1Y3QgY2lmc19wb3NpeF9hY2wgKilwYXJtX2RhdGE7CisgICAgICAgIHBvc2l4X2FjbF94YXR0cl9oZWFkZXIgKiBsb2NhbF9hY2wgPSAocG9zaXhfYWNsX3hhdHRyX2hlYWRlciAqKXBBQ0w7CisJaW50IGNvdW50OworCWludCBpOworCisJaWYoKGJ1ZmxlbiA9PSAwKSB8fCAocEFDTCA9PSBOVUxMKSB8fCAoY2lmc19hY2wgPT0gTlVMTCkpCisJCXJldHVybiAwOworCisJY291bnQgPSBwb3NpeF9hY2xfeGF0dHJfY291bnQoKHNpemVfdClidWZsZW4pOworCWNGWUkoMSwoInNldHRpbmcgYWNsIHdpdGggJWQgZW50cmllcyBmcm9tIGJ1ZiBvZiBsZW5ndGggJWQgYW5kIHZlcnNpb24gb2YgJWQiLAorCQljb3VudCxidWZsZW4sbG9jYWxfYWNsLT5hX3ZlcnNpb24pKTsKKwlpZihsb2NhbF9hY2wtPmFfdmVyc2lvbiAhPSAyKSB7CisJCWNGWUkoMSwoInVua25vd24gUE9TSVggQUNMIHZlcnNpb24gJWQiLGxvY2FsX2FjbC0+YV92ZXJzaW9uKSk7CisJCXJldHVybiAwOworCX0KKwljaWZzX2FjbC0+dmVyc2lvbiA9IGNwdV90b19sZTE2KDEpOworCWlmKGFjbF90eXBlID09IEFDTF9UWVBFX0FDQ0VTUykgCisJCWNpZnNfYWNsLT5hY2Nlc3NfZW50cnlfY291bnQgPSBjb3VudDsKKwllbHNlIGlmKGFjbF90eXBlID09IEFDTF9UWVBFX0RFRkFVTFQpCisJCWNpZnNfYWNsLT5kZWZhdWx0X2VudHJ5X2NvdW50ID0gY291bnQ7CisJZWxzZSB7CisJCWNGWUkoMSwoInVua25vd24gQUNMIHR5cGUgJWQiLGFjbF90eXBlKSk7CisJCXJldHVybiAwOworCX0KKwlmb3IoaT0wO2k8Y291bnQ7aSsrKSB7CisJCXJjID0gY29udmVydF9hY2VfdG9fY2lmc19hY2UoJmNpZnNfYWNsLT5hY2VfYXJyYXlbaV0sCisJCQkJCSZsb2NhbF9hY2wtPmFfZW50cmllc1tpXSk7CisJCWlmKHJjICE9IDApIHsKKwkJCS8qIEFDRSBub3QgY29udmVydGVkICovCisJCQlicmVhazsKKwkJfQorCX0KKwlpZihyYyA9PSAwKSB7CisJCXJjID0gKF9fdTE2KShjb3VudCAqIHNpemVvZihzdHJ1Y3QgY2lmc19wb3NpeF9hY2UpKTsKKwkJcmMgKz0gc2l6ZW9mKHN0cnVjdCBjaWZzX3Bvc2l4X2FjbCk7CisJCS8qIEJCIGFkZCBjaGVjayB0byBtYWtlIHN1cmUgQUNMIGRvZXMgbm90IG92ZXJmbG93IFNNQiAqLworCX0KKwlyZXR1cm4gcmM7Cit9CisKK2ludAorQ0lGU1NNQkdldFBvc2l4QUNMKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzZWFyY2hOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYWNsX2luZiwgY29uc3QgaW50IGJ1ZmxlbiwgY29uc3QgaW50IGFjbF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworLyogU01CX1FVRVJZX1BPU0lYX0FDTCAqLworCVRSQU5TQUNUSU9OMl9RUElfUkVRICpwU01CID0gTlVMTDsKKwlUUkFOU0FDVElPTjJfUVBJX1JTUCAqcFNNQnIgPSBOVUxMOworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkOworCWludCBuYW1lX2xlbjsKKwlfX3UxNiBwYXJhbXMsIGJ5dGVfY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwljRllJKDEsICgiSW4gR2V0UG9zaXhBQ0wgKFVuaXgpIGZvciBwYXRoICVzIiwgc2VhcmNoTmFtZSkpOworCitxdWVyeUFjbFJldHJ5OgorCXJjID0gc21iX2luaXQoU01CX0NPTV9UUkFOU0FDVElPTjIsIDE1LCB0Y29uLCAodm9pZCAqKikgJnBTTUIsCisJCSh2b2lkICoqKSAmcFNNQnIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJaWYgKHBTTUItPmhkci5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJbmFtZV9sZW4gPQorCQkJY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBwU01CLT5GaWxlTmFtZSwgc2VhcmNoTmFtZSwgUEFUSF9NQVgKKwkJCQksIG5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuKys7ICAgICAvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJCXBTTUItPkZpbGVOYW1lW25hbWVfbGVuXSA9IDA7CisJCXBTTUItPkZpbGVOYW1lW25hbWVfbGVuKzFdID0gMDsKKwl9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiBCQiBpbXByb3ZlIHRoZSBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW5zIEJCICovCisJCW5hbWVfbGVuID0gc3RybmxlbihzZWFyY2hOYW1lLCBQQVRIX01BWCk7CisJCW5hbWVfbGVuKys7ICAgICAvKiB0cmFpbGluZyBudWxsICovCisJCXN0cm5jcHkocFNNQi0+RmlsZU5hbWUsIHNlYXJjaE5hbWUsIG5hbWVfbGVuKTsKKwl9CisKKwlwYXJhbXMgPSAyIC8qIGxldmVsICovICArIDQgLyogcnNydmQgKi8gICsgbmFtZV9sZW4gLyogaW5jbCBudWxsICovIDsKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IDA7CisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNigyKTsKKyAgICAgICAgLyogQkIgZmluZCBleGFjdCBtYXggZGF0YSBjb3VudCBiZWxvdyBmcm9tIHNlc3Mgc3RydWN0dXJlIEJCICovCisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoNDAwMCk7CisJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQgPSAwOworCXBTTUItPkZsYWdzID0gMDsKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCXBTTUItPlBhcmFtZXRlck9mZnNldCA9IGNwdV90b19sZTE2KAorCQlvZmZzZXRvZihzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfcXBpX3JlcSAsSW5mb3JtYXRpb25MZXZlbCkgLSA0KTsKKwlwU01CLT5EYXRhQ291bnQgPSAwOworCXBTTUItPkRhdGFPZmZzZXQgPSAwOworCXBTTUItPlNldHVwQ291bnQgPSAxOworCXBTTUItPlJlc2VydmVkMyA9IDA7CisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KFRSQU5TMl9RVUVSWV9QQVRIX0lORk9STUFUSU9OKTsKKwlieXRlX2NvdW50ID0gcGFyYW1zICsgMSAvKiBwYWQgKi8gOworCXBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNihwYXJhbXMpOworCXBTTUItPlBhcmFtZXRlckNvdW50ID0gcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudDsKKwlwU01CLT5JbmZvcm1hdGlvbkxldmVsID0gY3B1X3RvX2xlMTYoU01CX1FVRVJZX1BPU0lYX0FDTCk7CisJcFNNQi0+UmVzZXJ2ZWQ0ID0gMDsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZW5kIGVycm9yIGluIFF1ZXJ5IFBPU0lYIEFDTCA9ICVkIiwgcmMpKTsKKwl9IGVsc2UgeworCQkvKiBkZWNvZGUgcmVzcG9uc2UgKi8KKyAKKwkJcmMgPSB2YWxpZGF0ZV90Migoc3RydWN0IHNtYl90Ml9yc3AgKilwU01Ccik7CisJCWlmIChyYyB8fCAocFNNQnItPkJ5dGVDb3VudCA8IDIpKQorCQkvKiBCQiBhbHNvIGNoZWNrIGVub3VnaCB0b3RhbCBieXRlcyByZXR1cm5lZCAqLworCQkJcmMgPSAtRUlPOyAgICAgIC8qIGJhZCBzbWIgKi8KKwkJZWxzZSB7CisJCQlfX3UxNiBkYXRhX29mZnNldCA9IGxlMTZfdG9fY3B1KHBTTUJyLT50Mi5EYXRhT2Zmc2V0KTsKKwkJCV9fdTE2IGNvdW50ID0gbGUxNl90b19jcHUocFNNQnItPnQyLkRhdGFDb3VudCk7CisJCQlyYyA9IGNpZnNfY29weV9wb3NpeF9hY2woYWNsX2luZiwKKwkJCQkoY2hhciAqKSZwU01Cci0+aGRyLlByb3RvY29sK2RhdGFfb2Zmc2V0LAorCQkJCWJ1ZmxlbixhY2xfdHlwZSxjb3VudCk7CisJCX0KKwl9CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJZ290byBxdWVyeUFjbFJldHJ5OworCXJldHVybiByYzsKK30KKworaW50CitDSUZTU01CU2V0UG9zaXhBQ0woY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbG9jYWxfYWNsLCBjb25zdCBpbnQgYnVmbGVuLCBjb25zdCBpbnQgYWNsX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisJc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NwaV9yZXEgKnBTTUIgPSBOVUxMOworCXN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9zcGlfcnNwICpwU01CciA9IE5VTEw7CisJY2hhciAqcGFybV9kYXRhOworCWludCBuYW1lX2xlbjsKKwlpbnQgcmMgPSAwOworCWludCBieXRlc19yZXR1cm5lZCA9IDA7CisJX191MTYgcGFyYW1zLCBieXRlX2NvdW50LCBkYXRhX2NvdW50LCBwYXJhbV9vZmZzZXQsIG9mZnNldDsKKworCWNGWUkoMSwgKCJJbiBTZXRQb3NpeEFDTCAoVW5peCkgZm9yIHBhdGggJXMiLCBmaWxlTmFtZSkpOworc2V0QWNsUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKyAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbiA9CisJCQljaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIHBTTUItPkZpbGVOYW1lLCBmaWxlTmFtZSwgUEFUSF9NQVgKKwkJCQksIG5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuKys7ICAgICAvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJfSBlbHNlIHsgICAgICAgICAgICAgICAgLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQluYW1lX2xlbiA9IHN0cm5sZW4oZmlsZU5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4rKzsgICAgIC8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShwU01CLT5GaWxlTmFtZSwgZmlsZU5hbWUsIG5hbWVfbGVuKTsKKwl9CisJcGFyYW1zID0gNiArIG5hbWVfbGVuOworCXBTTUItPk1heFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYoMik7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoMTAwMCk7IC8qIEJCIGZpbmQgbWF4IFNNQiBzaXplIGZyb20gc2VzcyAqLworCXBTTUItPk1heFNldHVwQ291bnQgPSAwOworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5GbGFncyA9IDA7CisJcFNNQi0+VGltZW91dCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQyID0gMDsKKwlwYXJhbV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc3BpX3JlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbkxldmVsKSAtIDQ7CisJb2Zmc2V0ID0gcGFyYW1fb2Zmc2V0ICsgcGFyYW1zOworCXBhcm1fZGF0YSA9ICgoY2hhciAqKSAmcFNNQi0+aGRyLlByb3RvY29sKSArIG9mZnNldDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihwYXJhbV9vZmZzZXQpOworCisJLyogY29udmVydCB0byBvbiB0aGUgd2lyZSBmb3JtYXQgZm9yIFBPU0lYIEFDTCAqLworCWRhdGFfY291bnQgPSBBQ0xfdG9fY2lmc19wb3NpeChwYXJtX2RhdGEsbG9jYWxfYWNsLGJ1ZmxlbixhY2xfdHlwZSk7CisKKwlpZihkYXRhX2NvdW50ID09IDApIHsKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBzZXRBQ0xlcnJvckV4aXQ7CisJfQorCXBTTUItPkRhdGFPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXQpOworCXBTTUItPlNldHVwQ291bnQgPSAxOworCXBTTUItPlJlc2VydmVkMyA9IDA7CisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KFRSQU5TMl9TRVRfUEFUSF9JTkZPUk1BVElPTik7CisJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9IGNwdV90b19sZTE2KFNNQl9TRVRfUE9TSVhfQUNMKTsKKwlieXRlX2NvdW50ID0gMyAvKiBwYWQgKi8gICsgcGFyYW1zICsgZGF0YV9jb3VudDsKKwlwU01CLT5EYXRhQ291bnQgPSBjcHVfdG9fbGUxNihkYXRhX2NvdW50KTsKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IHBTTUItPkRhdGFDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IHBTTUItPlBhcmFtZXRlckNvdW50OworCXBTTUItPlJlc2VydmVkNCA9IDA7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVfY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoYnl0ZV9jb3VudCk7CisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRllJKDEsICgiU2V0IFBPU0lYIEFDTCByZXR1cm5lZCAlZCIsIHJjKSk7CisJfQorCitzZXRBQ0xlcnJvckV4aXQ6CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJZ290byBzZXRBY2xSZXRyeTsKKwlyZXR1cm4gcmM7Cit9CisKKyNlbmRpZgorCitpbnQKK0NJRlNTTUJRUGF0aEluZm8oY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlYXJjaE5hbWUsCisJCSBGSUxFX0FMTF9JTkZPICogcEZpbmREYXRhLAorCQkgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworLyogbGV2ZWwgMjYzIFNNQl9RVUVSWV9GSUxFX0FMTF9JTkZPICovCisJVFJBTlNBQ1RJT04yX1FQSV9SRVEgKnBTTUIgPSBOVUxMOworCVRSQU5TQUNUSU9OMl9RUElfUlNQICpwU01CciA9IE5VTEw7CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQ7CisJaW50IG5hbWVfbGVuOworCV9fdTE2IHBhcmFtcywgYnl0ZV9jb3VudDsKKworLyogY0ZZSSgxLCAoIkluIFFQYXRoSW5mbyBwYXRoICVzIiwgc2VhcmNoTmFtZSkpOyAqLworUVBhdGhJbmZvUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbiA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIHBTTUItPkZpbGVOYW1lLCBzZWFyY2hOYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJfSBlbHNlIHsJCS8qIEJCIGltcHJvdmUgdGhlIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgQkIgKi8KKwkJbmFtZV9sZW4gPSBzdHJubGVuKHNlYXJjaE5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQlzdHJuY3B5KHBTTUItPkZpbGVOYW1lLCBzZWFyY2hOYW1lLCBuYW1lX2xlbik7CisJfQorCisJcGFyYW1zID0gMiAvKiBsZXZlbCAqLyArIDQgLyogcmVzZXJ2ZWQgKi8gKyBuYW1lX2xlbiAvKiBpbmNsdWRlcyBOVUwgKi8gOworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsKKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KDIpOworCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTE2KDQwMDApOwkvKiBCQiBmaW5kIGV4YWN0IG1heCBTTUIgUERVIGZyb20gc2VzcyBzdHJ1Y3R1cmUgQkIgKi8KKwlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKKwlwU01CLT5SZXNlcnZlZCA9IDA7CisJcFNNQi0+RmxhZ3MgPSAwOworCXBTTUItPlRpbWVvdXQgPSAwOworCXBTTUItPlJlc2VydmVkMiA9IDA7CisJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmc2V0b2YoCisgICAgICAgIHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9xcGlfcmVxICxJbmZvcm1hdGlvbkxldmVsKSAtIDQpOworCXBTTUItPkRhdGFDb3VudCA9IDA7CisJcFNNQi0+RGF0YU9mZnNldCA9IDA7CisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CisJcFNNQi0+UmVzZXJ2ZWQzID0gMDsKKwlwU01CLT5TdWJDb21tYW5kID0gY3B1X3RvX2xlMTYoVFJBTlMyX1FVRVJZX1BBVEhfSU5GT1JNQVRJT04pOworCWJ5dGVfY291bnQgPSBwYXJhbXMgKyAxIC8qIHBhZCAqLyA7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50OworCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfUVVFUllfRklMRV9BTExfSU5GTyk7CisJcFNNQi0+UmVzZXJ2ZWQ0ID0gMDsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoIlNlbmQgZXJyb3IgaW4gUVBhdGhJbmZvID0gJWQiLCByYykpOworCX0gZWxzZSB7CQkvKiBkZWNvZGUgcmVzcG9uc2UgKi8KKwkJcmMgPSB2YWxpZGF0ZV90Migoc3RydWN0IHNtYl90Ml9yc3AgKilwU01Ccik7CisKKwkJaWYgKHJjIHx8IChwU01Cci0+Qnl0ZUNvdW50IDwgNDApKSAKKwkJCXJjID0gLUVJTzsJLyogYmFkIHNtYiAqLworCQllbHNlIGlmIChwRmluZERhdGEpeworCQkJX191MTYgZGF0YV9vZmZzZXQgPSBsZTE2X3RvX2NwdShwU01Cci0+dDIuRGF0YU9mZnNldCk7CisJCQltZW1jcHkoKGNoYXIgKikgcEZpbmREYXRhLAorCQkJICAgICAgIChjaGFyICopICZwU01Cci0+aGRyLlByb3RvY29sICsKKwkJCSAgICAgICBkYXRhX29mZnNldCwgc2l6ZW9mIChGSUxFX0FMTF9JTkZPKSk7CisJCX0gZWxzZQorCQkgICAgcmMgPSAtRU5PTUVNOworCX0KKwljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIFFQYXRoSW5mb1JldHJ5OworCisJcmV0dXJuIHJjOworfQorCitpbnQKK0NJRlNTTUJVbml4UVBhdGhJbmZvKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2VhcmNoTmFtZSwKKwkJICAgICBGSUxFX1VOSVhfQkFTSUNfSU5GTyAqIHBGaW5kRGF0YSwKKwkJICAgICBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisvKiBTTUJfUVVFUllfRklMRV9VTklYX0JBU0lDICovCisJVFJBTlNBQ1RJT04yX1FQSV9SRVEgKnBTTUIgPSBOVUxMOworCVRSQU5TQUNUSU9OMl9RUElfUlNQICpwU01CciA9IE5VTEw7CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQgPSAwOworCWludCBuYW1lX2xlbjsKKwlfX3UxNiBwYXJhbXMsIGJ5dGVfY291bnQ7CisKKwljRllJKDEsICgiSW4gUVBhdGhJbmZvIChVbml4KSB0aGUgcGF0aCAlcyIsIHNlYXJjaE5hbWUpKTsKK1VuaXhRUGF0aEluZm9SZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChwU01CLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCW5hbWVfbGVuID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+RmlsZU5hbWUsIHNlYXJjaE5hbWUsIFBBVEhfTUFYCisJCQkJICAvKiBmaW5kIGRlZmluZSBmb3IgdGhpcyBtYXhwYXRoY29tcG9uZW50ICovCisJCQkJICAsIG5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJbmFtZV9sZW4gKj0gMjsKKwl9IGVsc2UgewkJLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQluYW1lX2xlbiA9IHN0cm5sZW4oc2VhcmNoTmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCXN0cm5jcHkocFNNQi0+RmlsZU5hbWUsIHNlYXJjaE5hbWUsIG5hbWVfbGVuKTsKKwl9CisKKwlwYXJhbXMgPSAyIC8qIGxldmVsICovICsgNCAvKiByZXNlcnZlZCAqLyArIG5hbWVfbGVuIC8qIGluY2x1ZGVzIE5VTCAqLyA7CisJcFNNQi0+VG90YWxEYXRhQ291bnQgPSAwOworCXBTTUItPk1heFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYoMik7CisJLyogQkIgZmluZCBleGFjdCBtYXggU01CIFBEVSBmcm9tIHNlc3Mgc3RydWN0dXJlIEJCICovCisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoNDAwMCk7IAorCXBTTUItPk1heFNldHVwQ291bnQgPSAwOworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5GbGFncyA9IDA7CisJcFNNQi0+VGltZW91dCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQyID0gMDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXRvZigKKyAgICAgICAgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3FwaV9yZXEgLEluZm9ybWF0aW9uTGV2ZWwpIC0gNCk7CisJcFNNQi0+RGF0YUNvdW50ID0gMDsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gMDsKKwlwU01CLT5TZXR1cENvdW50ID0gMTsKKwlwU01CLT5SZXNlcnZlZDMgPSAwOworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihUUkFOUzJfUVVFUllfUEFUSF9JTkZPUk1BVElPTik7CisJYnl0ZV9jb3VudCA9IHBhcmFtcyArIDEgLyogcGFkICovIDsKKwlwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IHBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQ7CisJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9IGNwdV90b19sZTE2KFNNQl9RVUVSWV9GSUxFX1VOSVhfQkFTSUMpOworCXBTTUItPlJlc2VydmVkNCA9IDA7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVfY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoYnl0ZV9jb3VudCk7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZW5kIGVycm9yIGluIFFQYXRoSW5mbyA9ICVkIiwgcmMpKTsKKwl9IGVsc2UgewkJLyogZGVjb2RlIHJlc3BvbnNlICovCisJCXJjID0gdmFsaWRhdGVfdDIoKHN0cnVjdCBzbWJfdDJfcnNwICopcFNNQnIpOworCisJCWlmIChyYyB8fCAocFNNQnItPkJ5dGVDb3VudCA8IHNpemVvZihGSUxFX1VOSVhfQkFTSUNfSU5GTykpKSB7CisJCQlyYyA9IC1FSU87CS8qIGJhZCBzbWIgKi8KKwkJfSBlbHNlIHsKKwkJCV9fdTE2IGRhdGFfb2Zmc2V0ID0gbGUxNl90b19jcHUocFNNQnItPnQyLkRhdGFPZmZzZXQpOworCQkJbWVtY3B5KChjaGFyICopIHBGaW5kRGF0YSwKKwkJCSAgICAgICAoY2hhciAqKSAmcFNNQnItPmhkci5Qcm90b2NvbCArCisJCQkgICAgICAgZGF0YV9vZmZzZXQsCisJCQkgICAgICAgc2l6ZW9mIChGSUxFX1VOSVhfQkFTSUNfSU5GTykpOworCQl9CisJfQorCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gVW5peFFQYXRoSW5mb1JldHJ5OworCisJcmV0dXJuIHJjOworfQorCisjaWYgMCAgLyogZnVuY3Rpb24gdW51c2VkIGF0IHByZXNlbnQgKi8KK2ludCBDSUZTRmluZFNpbmdsZShjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCSAgICAgICBjb25zdCBjaGFyICpzZWFyY2hOYW1lLCBGSUxFX0FMTF9JTkZPICogZmluZERhdGEsCisJICAgICAgIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSkKK3sKKy8qIGxldmVsIDI1NyBTTUJfICovCisJVFJBTlNBQ1RJT04yX0ZGSVJTVF9SRVEgKnBTTUIgPSBOVUxMOworCVRSQU5TQUNUSU9OMl9GRklSU1RfUlNQICpwU01CciA9IE5VTEw7CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQ7CisJaW50IG5hbWVfbGVuOworCV9fdTE2IHBhcmFtcywgYnl0ZV9jb3VudDsKKworCWNGWUkoMSwgKCJJbiBGaW5kVW5pcXVlIikpOworZmluZFVuaXF1ZVJldHJ5OgorCXJjID0gc21iX2luaXQoU01CX0NPTV9UUkFOU0FDVElPTjIsIDE1LCB0Y29uLCAodm9pZCAqKikgJnBTTUIsCisJCSAgICAgICh2b2lkICoqKSAmcFNNQnIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKHBTTUItPmhkci5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJbmFtZV9sZW4gPQorCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBwU01CLT5GaWxlTmFtZSwgc2VhcmNoTmFtZSwgUEFUSF9NQVgKKwkJCQkgIC8qIGZpbmQgZGVmaW5lIGZvciB0aGlzIG1heHBhdGhjb21wb25lbnQgKi8KKwkJCQkgICwgbmxzX2NvZGVwYWdlKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQluYW1lX2xlbiAqPSAyOworCX0gZWxzZSB7CQkvKiBCQiBpbXByb3ZlIHRoZSBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW5zIEJCICovCisJCW5hbWVfbGVuID0gc3RybmxlbihzZWFyY2hOYW1lLCBQQVRIX01BWCk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShwU01CLT5GaWxlTmFtZSwgc2VhcmNoTmFtZSwgbmFtZV9sZW4pOworCX0KKworCXBhcmFtcyA9IDEyICsgbmFtZV9sZW4gLyogaW5jbHVkZXMgbnVsbCAqLyA7CisJcFNNQi0+VG90YWxEYXRhQ291bnQgPSAwOwkvKiBubyBFQXMgKi8KKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KDIpOworCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTE2KDQwMDApOwkvKiBCQiBmaW5kIGV4YWN0IG1heCBTTUIgUERVIGZyb20gc2VzcyBzdHJ1Y3R1cmUgQkIgKi8KKwlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKKwlwU01CLT5SZXNlcnZlZCA9IDA7CisJcFNNQi0+RmxhZ3MgPSAwOworCXBTTUItPlRpbWVvdXQgPSAwOworCXBTTUItPlJlc2VydmVkMiA9IDA7CisJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gY3B1X3RvX2xlMTYoCisgICAgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfZmZpcnN0X3JlcSxJbmZvcm1hdGlvbkxldmVsKSAtIDQpOworCXBTTUItPkRhdGFDb3VudCA9IDA7CisJcFNNQi0+RGF0YU9mZnNldCA9IDA7CisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CS8qIG9uZSBieXRlLCBubyBuZWVkIHRvIGxlIGNvbnZlcnQgKi8KKwlwU01CLT5SZXNlcnZlZDMgPSAwOworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihUUkFOUzJfRklORF9GSVJTVCk7CisJYnl0ZV9jb3VudCA9IHBhcmFtcyArIDEgLyogcGFkICovIDsKKwlwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IHBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQ7CisJcFNNQi0+U2VhcmNoQXR0cmlidXRlcyA9CisJICAgIGNwdV90b19sZTE2KEFUVFJfUkVBRE9OTFkgfCBBVFRSX0hJRERFTiB8IEFUVFJfU1lTVEVNIHwKKwkJCUFUVFJfRElSRUNUT1JZKTsKKwlwU01CLT5TZWFyY2hDb3VudCA9IGNwdV90b19sZTE2KDE2KTsJLyogQkIgaW5jcmVhc2UgKi8KKwlwU01CLT5TZWFyY2hGbGFncyA9IGNwdV90b19sZTE2KDEpOworCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfRklORF9GSUxFX0RJUkVDVE9SWV9JTkZPKTsKKwlwU01CLT5TZWFyY2hTdG9yYWdlVHlwZSA9IDA7CS8qIEJCIHdoYXQgc2hvdWxkIHdlIHNldCB0aGlzIHRvPyBCQiAqLworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBieXRlX2NvdW50OworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGJ5dGVfY291bnQpOworCisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZW5kIGVycm9yIGluIEZpbmRGaWxlRGlySW5mbyA9ICVkIiwgcmMpKTsKKwl9IGVsc2UgewkJLyogZGVjb2RlIHJlc3BvbnNlICovCisKKwkJLyogQkIgZmlsbCBpbiAqLworCX0KKworCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gZmluZFVuaXF1ZVJldHJ5OworCisJcmV0dXJuIHJjOworfQorI2VuZGlmIC8qIGVuZCB1bnVzZWQgKHRlbXBvcmFyaWx5KSBmdW5jdGlvbiAqLworCisvKiB4aWQsIHRjb24sIHNlYXJjaE5hbWUgYW5kIGNvZGVwYWdlIGFyZSBpbnB1dCBwYXJtcywgcmVzdCBhcmUgcmV0dXJuZWQgKi8KK2ludAorQ0lGU0ZpbmRGaXJzdChjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCSAgICAgIGNvbnN0IGNoYXIgKnNlYXJjaE5hbWUsIAorCSAgICAgIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSwKKwkgICAgICBfX3UxNiAqCXBuZXRmaWQsCisJICAgICAgc3RydWN0IGNpZnNfc2VhcmNoX2luZm8gKiBwc3JjaF9pbmYpCit7CisvKiBsZXZlbCAyNTcgU01CXyAqLworCVRSQU5TQUNUSU9OMl9GRklSU1RfUkVRICpwU01CID0gTlVMTDsKKwlUUkFOU0FDVElPTjJfRkZJUlNUX1JTUCAqcFNNQnIgPSBOVUxMOworCVQyX0ZGSVJTVF9SU1BfUEFSTVMgKiBwYXJtczsKKwlpbnQgcmMgPSAwOworCWludCBieXRlc19yZXR1cm5lZCA9IDA7CisJaW50IG5hbWVfbGVuOworCV9fdTE2IHBhcmFtcywgYnl0ZV9jb3VudDsKKworCWNGWUkoMSwgKCJJbiBGaW5kRmlyc3QiKSk7CisKK2ZpbmRGaXJzdFJldHJ5OgorCXJjID0gc21iX2luaXQoU01CX0NPTV9UUkFOU0FDVElPTjIsIDE1LCB0Y29uLCAodm9pZCAqKikgJnBTTUIsCisJCSAgICAgICh2b2lkICoqKSAmcFNNQnIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKHBTTUItPmhkci5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJbmFtZV9sZW4gPQorCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBwU01CLT5GaWxlTmFtZSxzZWFyY2hOYW1lLAorCQkJCSBQQVRIX01BWCwgbmxzX2NvZGVwYWdlKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQluYW1lX2xlbiAqPSAyOworCQlwU01CLT5GaWxlTmFtZVtuYW1lX2xlbl0gPSAwOyAvKiBudWxsIHRlcm1pbmF0ZSBqdXN0IGluIGNhc2UgKi8KKwkJcFNNQi0+RmlsZU5hbWVbbmFtZV9sZW4rMV0gPSAwOworCX0gZWxzZSB7CS8qIEJCIGFkZCBjaGVjayBmb3Igb3ZlcnJ1biBvZiBTTUIgYnVmIEJCICovCisJCW5hbWVfbGVuID0gc3RybmxlbihzZWFyY2hOYW1lLCBQQVRIX01BWCk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKy8qIEJCIGZpeCBoZXJlIGFuZCBpbiB1bmljb2RlIGNsYXVzZSBhYm92ZSBpZQorCQlpZihuYW1lX2xlbiA+IGJ1ZmZlcnNpemUtaGVhZGVyKQorCQkJZnJlZSBidWZmZXIgZXhpdDsgQkIgKi8KKwkJc3RybmNweShwU01CLT5GaWxlTmFtZSwgc2VhcmNoTmFtZSwgbmFtZV9sZW4pOworCQlwU01CLT5GaWxlTmFtZVtuYW1lX2xlbl0gPSAwOyAvKiBqdXN0IGluIGNhc2UgKi8KKwl9CisKKwlwYXJhbXMgPSAxMiArIG5hbWVfbGVuIC8qIGluY2x1ZGVzIG51bGwgKi8gOworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsJLyogbm8gRUFzICovCisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNigxMCk7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoKHRjb24tPnNlcy0+c2VydmVyLT5tYXhCdWYgLQorCQkJCQkgIE1BWF9DSUZTX0hEUl9TSVpFKSAmIDB4RkZGRkZGMDApOworCXBTTUItPk1heFNldHVwQ291bnQgPSAwOworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5GbGFncyA9IDA7CisJcFNNQi0+VGltZW91dCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQyID0gMDsKKwlieXRlX2NvdW50ID0gcGFyYW1zICsgMSAvKiBwYWQgKi8gOworCXBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNihwYXJhbXMpOworCXBTTUItPlBhcmFtZXRlckNvdW50ID0gcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNigKKwkgIG9mZnNldG9mKHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9mZmlyc3RfcmVxLCBTZWFyY2hBdHRyaWJ1dGVzKSAtIDQpOworCXBTTUItPkRhdGFDb3VudCA9IDA7CisJcFNNQi0+RGF0YU9mZnNldCA9IDA7CisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CS8qIG9uZSBieXRlLCBubyBuZWVkIHRvIG1ha2UgZW5kaWFuIG5ldXRyYWwgKi8KKwlwU01CLT5SZXNlcnZlZDMgPSAwOworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihUUkFOUzJfRklORF9GSVJTVCk7CisJcFNNQi0+U2VhcmNoQXR0cmlidXRlcyA9CisJICAgIGNwdV90b19sZTE2KEFUVFJfUkVBRE9OTFkgfCBBVFRSX0hJRERFTiB8IEFUVFJfU1lTVEVNIHwKKwkJCUFUVFJfRElSRUNUT1JZKTsKKwlwU01CLT5TZWFyY2hDb3VudD0gY3B1X3RvX2xlMTYoQ0lGU01heEJ1ZlNpemUvc2l6ZW9mKEZJTEVfVU5JWF9JTkZPKSk7CisJcFNNQi0+U2VhcmNoRmxhZ3MgPSBjcHVfdG9fbGUxNihDSUZTX1NFQVJDSF9DTE9TRV9BVF9FTkQgfCAKKwkJQ0lGU19TRUFSQ0hfUkVUVVJOX1JFU1VNRSk7CisJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9IGNwdV90b19sZTE2KHBzcmNoX2luZi0+aW5mb19sZXZlbCk7CisKKwkvKiBCQiB3aGF0IHNob3VsZCB3ZSBzZXQgU3RvcmFnZVR5cGUgdG8/IERvZXMgaXQgbWF0dGVyPyBCQiAqLworCXBTTUItPlNlYXJjaFN0b3JhZ2VUeXBlID0gMDsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKworCWlmIChyYykgey8qIEJCIGFkZCBsb2dpYyB0byByZXRyeSByZWd1bGFyIHNlYXJjaCBpZiBVbml4IHNlYXJjaCByZWplY3RlZCB1bmV4cGVjdGVkbHkgYnkgc2VydmVyICovCisJCS8qIEJCIEFkZCBjb2RlIHRvIGhhbmRsZSB1bnN1cHBvcnRlZCBsZXZlbCByYyAqLworCQljRllJKDEsICgiRXJyb3IgaW4gRmluZEZpcnN0ID0gJWQiLCByYykpOworCisJCWlmIChwU01CKQorCQkJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCQkvKiBCQiBldmVudHVhbGx5IGNvdWxkIG9wdGltaXplIG91dCBmcmVlIGFuZCByZWFsbG9jIG9mIGJ1ZiAqLworCQkvKiAgICBmb3IgdGhpcyBjYXNlICovCisJCWlmIChyYyA9PSAtRUFHQUlOKQorCQkJZ290byBmaW5kRmlyc3RSZXRyeTsKKwl9IGVsc2UgeyAvKiBkZWNvZGUgcmVzcG9uc2UgKi8KKwkJLyogQkIgcmVtZW1iZXIgdG8gZnJlZSBidWZmZXIgaWYgZXJyb3IgQkIgKi8KKwkJcmMgPSB2YWxpZGF0ZV90Migoc3RydWN0IHNtYl90Ml9yc3AgKilwU01Ccik7CisJCWlmKHJjID09IDApIHsKKwkJCWlmIChwU01Cci0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkKKwkJCQlwc3JjaF9pbmYtPnVuaWNvZGUgPSBUUlVFOworCQkJZWxzZQorCQkJCXBzcmNoX2luZi0+dW5pY29kZSA9IEZBTFNFOworCisJCQlwc3JjaF9pbmYtPm50d3JrX2J1Zl9zdGFydCA9IChjaGFyICopcFNNQnI7CisJCQlwc3JjaF9pbmYtPnNyY2hfZW50cmllc19zdGFydCA9IAorCQkJCShjaGFyICopICZwU01Cci0+aGRyLlByb3RvY29sICsgCisJCQkJCWxlMTZfdG9fY3B1KHBTTUJyLT50Mi5EYXRhT2Zmc2V0KTsKKworCQkJcGFybXMgPSAoVDJfRkZJUlNUX1JTUF9QQVJNUyAqKSgoY2hhciAqKSAmcFNNQnItPmhkci5Qcm90b2NvbCArCisJCQkgICAgICAgbGUxNl90b19jcHUocFNNQnItPnQyLlBhcmFtZXRlck9mZnNldCkpOworCisJCQlpZihwYXJtcy0+RW5kb2ZTZWFyY2gpCisJCQkJcHNyY2hfaW5mLT5lbmRPZlNlYXJjaCA9IFRSVUU7CisJCQllbHNlCisJCQkJcHNyY2hfaW5mLT5lbmRPZlNlYXJjaCA9IEZBTFNFOworCisJCQlwc3JjaF9pbmYtPmVudHJpZXNfaW5fYnVmZmVyICA9IGxlMTZfdG9fY3B1KHBhcm1zLT5TZWFyY2hDb3VudCk7CisJCQlwc3JjaF9pbmYtPmluZGV4X29mX2xhc3RfZW50cnkgPSAKKwkJCQlwc3JjaF9pbmYtPmVudHJpZXNfaW5fYnVmZmVyOworLypjRllJKDEsKCJlbnRyaWVzIGluIGJ1ZiAlZCBpbmRleF9vZl9sYXN0ICVkIixwc3JjaF9pbmYtPmVudHJpZXNfaW5fYnVmZmVyLHBzcmNoX2luZi0+aW5kZXhfb2ZfbGFzdF9lbnRyeSkpOyAgKi8KKwkJCSpwbmV0ZmlkID0gcGFybXMtPlNlYXJjaEhhbmRsZTsKKwkJfSBlbHNlIHsKKwkJCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBDSUZTRmluZE5leHQoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKyAgICAgICAgICAgIF9fdTE2IHNlYXJjaEhhbmRsZSwgc3RydWN0IGNpZnNfc2VhcmNoX2luZm8gKiBwc3JjaF9pbmYpCit7CisJVFJBTlNBQ1RJT04yX0ZORVhUX1JFUSAqcFNNQiA9IE5VTEw7CisJVFJBTlNBQ1RJT04yX0ZORVhUX1JTUCAqcFNNQnIgPSBOVUxMOworCVQyX0ZORVhUX1JTUF9QQVJNUyAqIHBhcm1zOworCWNoYXIgKnJlc3BvbnNlX2RhdGE7CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQsIG5hbWVfbGVuOworCV9fdTE2IHBhcmFtcywgYnl0ZV9jb3VudDsKKworCWNGWUkoMSwgKCJJbiBGaW5kTmV4dCIpKTsKKworCWlmKHBzcmNoX2luZi0+ZW5kT2ZTZWFyY2ggPT0gVFJVRSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBhcmFtcyA9IDE0OyAgICAvKiBpbmNsdWRlcyAyIGJ5dGVzIG9mIG51bGwgc3RyaW5nLCBjb252ZXJ0ZWQgdG8gTEUgYmVsb3cgKi8KKwlieXRlX2NvdW50ID0gMDsKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IDA7ICAgICAgIC8qIG5vIEVBcyAqLworCXBTTUItPk1heFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYoOCk7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0KKyAgICAgICAgICAgIGNwdV90b19sZTE2KCh0Y29uLT5zZXMtPnNlcnZlci0+bWF4QnVmIC0gTUFYX0NJRlNfSERSX1NJWkUpICYgMHhGRkZGRkYwMCk7CisJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQgPSAwOworCXBTTUItPkZsYWdzID0gMDsKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCXBTTUItPlBhcmFtZXRlck9mZnNldCA9ICBjcHVfdG9fbGUxNigKKwkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfZm5leHRfcmVxLFNlYXJjaEhhbmRsZSkgLSA0KTsKKwlwU01CLT5EYXRhQ291bnQgPSAwOworCXBTTUItPkRhdGFPZmZzZXQgPSAwOworCXBTTUItPlNldHVwQ291bnQgPSAxOworCXBTTUItPlJlc2VydmVkMyA9IDA7CisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KFRSQU5TMl9GSU5EX05FWFQpOworCXBTTUItPlNlYXJjaEhhbmRsZSA9IHNlYXJjaEhhbmRsZTsgICAgICAvKiBhbHdheXMga2VwdCBhcyBsZSAqLworCXBTTUItPlNlYXJjaENvdW50ID0KKwkJY3B1X3RvX2xlMTYoQ0lGU01heEJ1ZlNpemUgLyBzaXplb2YgKEZJTEVfVU5JWF9JTkZPKSk7CisJLyogdGVzdCBmb3IgVW5peCBleHRlbnNpb25zICovCisvKglpZiAodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkgeworCQlwU01CLT5JbmZvcm1hdGlvbkxldmVsID0gY3B1X3RvX2xlMTYoU01CX0ZJTkRfRklMRV9VTklYKTsKKwkJcHNyY2hfaW5mLT5pbmZvX2xldmVsID0gU01CX0ZJTkRfRklMRV9VTklYOworCX0gZWxzZSB7CisJCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPQorCQkgICBjcHVfdG9fbGUxNihTTUJfRklORF9GSUxFX0RJUkVDVE9SWV9JTkZPKTsKKwkJcHNyY2hfaW5mLT5pbmZvX2xldmVsID0gU01CX0ZJTkRfRklMRV9ESVJFQ1RPUllfSU5GTzsKKwl9ICovCisJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9IGNwdV90b19sZTE2KHBzcmNoX2luZi0+aW5mb19sZXZlbCk7CisJcFNNQi0+UmVzdW1lS2V5ID0gcHNyY2hfaW5mLT5yZXN1bWVfa2V5OworCXBTTUItPlNlYXJjaEZsYWdzID0KKwkgICAgICBjcHVfdG9fbGUxNihDSUZTX1NFQVJDSF9DTE9TRV9BVF9FTkQgfCBDSUZTX1NFQVJDSF9SRVRVUk5fUkVTVU1FKTsKKworCW5hbWVfbGVuID0gcHNyY2hfaW5mLT5yZXN1bWVfbmFtZV9sZW47CisJcGFyYW1zICs9IG5hbWVfbGVuOworCWlmKG5hbWVfbGVuIDwgUEFUSF9NQVgpIHsKKwkJbWVtY3B5KHBTTUItPlJlc3VtZUZpbGVOYW1lLCBwc3JjaF9pbmYtPnByZXN1bWVfbmFtZSwgbmFtZV9sZW4pOworCQlieXRlX2NvdW50ICs9IG5hbWVfbGVuOworCX0gZWxzZSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBGTmV4dDJfZXJyX2V4aXQ7CisJfQorCWJ5dGVfY291bnQgPSBwYXJhbXMgKyAxIC8qIHBhZCAqLyA7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50OworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBieXRlX2NvdW50OworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGJ5dGVfY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCWlmIChyYykgeworCQlpZiAocmMgPT0gLUVCQURGKSB7CisJCQlwc3JjaF9pbmYtPmVuZE9mU2VhcmNoID0gVFJVRTsKKwkJCXJjID0gMDsgLyogc2VhcmNoIHByb2JhYmx5IHdhcyBjbG9zZWQgYXQgZW5kIG9mIHNlYXJjaCBhYm92ZSAqLworCQl9IGVsc2UKKwkJCWNGWUkoMSwgKCJGaW5kTmV4dCByZXR1cm5lZCA9ICVkIiwgcmMpKTsKKwl9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiBkZWNvZGUgcmVzcG9uc2UgKi8KKwkJcmMgPSB2YWxpZGF0ZV90Migoc3RydWN0IHNtYl90Ml9yc3AgKilwU01Ccik7CisJCQorCQlpZihyYyA9PSAwKSB7CisJCQkvKiBCQiBmaXhtZSBhZGQgbG9jayBmb3IgZmlsZSAoc3JjaF9pbmZvKSBzdHJ1Y3QgaGVyZSAqLworCQkJaWYgKHBTTUJyLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKQorCQkJCXBzcmNoX2luZi0+dW5pY29kZSA9IFRSVUU7CisJCQllbHNlCisJCQkJcHNyY2hfaW5mLT51bmljb2RlID0gRkFMU0U7CisJCQlyZXNwb25zZV9kYXRhID0gKGNoYXIgKikgJnBTTUJyLT5oZHIuUHJvdG9jb2wgKworCQkJICAgICAgIGxlMTZfdG9fY3B1KHBTTUJyLT50Mi5QYXJhbWV0ZXJPZmZzZXQpOworCQkJcGFybXMgPSAoVDJfRk5FWFRfUlNQX1BBUk1TICopcmVzcG9uc2VfZGF0YTsKKwkJCXJlc3BvbnNlX2RhdGEgPSAoY2hhciAqKSZwU01Cci0+aGRyLlByb3RvY29sICsKKwkJCQlsZTE2X3RvX2NwdShwU01Cci0+dDIuRGF0YU9mZnNldCk7CisJCQljaWZzX2J1Zl9yZWxlYXNlKHBzcmNoX2luZi0+bnR3cmtfYnVmX3N0YXJ0KTsKKwkJCXBzcmNoX2luZi0+c3JjaF9lbnRyaWVzX3N0YXJ0ID0gcmVzcG9uc2VfZGF0YTsKKwkJCXBzcmNoX2luZi0+bnR3cmtfYnVmX3N0YXJ0ID0gKGNoYXIgKilwU01COworCQkJaWYocGFybXMtPkVuZG9mU2VhcmNoKQorCQkJCXBzcmNoX2luZi0+ZW5kT2ZTZWFyY2ggPSBUUlVFOworCQkJZWxzZQorCQkJCXBzcmNoX2luZi0+ZW5kT2ZTZWFyY2ggPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCXBzcmNoX2luZi0+ZW50cmllc19pbl9idWZmZXIgID0gbGUxNl90b19jcHUocGFybXMtPlNlYXJjaENvdW50KTsKKwkJCXBzcmNoX2luZi0+aW5kZXhfb2ZfbGFzdF9lbnRyeSArPQorCQkJCXBzcmNoX2luZi0+ZW50cmllc19pbl9idWZmZXI7CisvKiAgY0ZZSSgxLCgiZm54dDIgZW50cmllcyBpbiBidWYgJWQgaW5kZXhfb2ZfbGFzdCAlZCIscHNyY2hfaW5mLT5lbnRyaWVzX2luX2J1ZmZlcixwc3JjaF9pbmYtPmluZGV4X29mX2xhc3RfZW50cnkpKTsgKi8KKworCQkJLyogQkIgZml4bWUgYWRkIHVubG9jayBoZXJlICovCisJCX0KKworCX0KKworCS8qIEJCIE9uIGVycm9yLCBzaG91bGQgd2UgbGVhdmUgcHJldmlvdXMgc2VhcmNoIGJ1ZiAoYW5kIGNvdW50IGFuZAorCWxhc3QgZW50cnkgZmllbGRzKSBpbnRhY3Qgb3IgZnJlZSB0aGUgcHJldmlvdXMgb25lPyAqLworCisJLyogTm90ZTogT24gLUVBR0FJTiBlcnJvciBvbmx5IGNhbGxlciBjYW4gcmV0cnkgb24gaGFuZGxlIGJhc2VkIGNhbGxzCisJc2luY2UgZmlsZSBoYW5kbGUgcGFzc2VkIGluIG5vIGxvbmdlciB2YWxpZCAqLworRk5leHQyX2Vycl9leGl0OgorCWlmIChyYyAhPSAwKQorCQljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCXJldHVybiByYzsKK30KKworaW50CitDSUZTRmluZENsb3NlKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sIGNvbnN0IF9fdTE2IHNlYXJjaEhhbmRsZSkKK3sKKwlpbnQgcmMgPSAwOworCUZJTkRDTE9TRV9SRVEgKnBTTUIgPSBOVUxMOworCUNMT1NFX1JTUCAqcFNNQnIgPSBOVUxMOyAvKiBCQiByZW1vdmVtZSBCQiAqLworCWludCBieXRlc19yZXR1cm5lZDsKKworCWNGWUkoMSwgKCJJbiBDSUZTU01CRmluZENsb3NlIikpOworCXJjID0gc21hbGxfc21iX2luaXQoU01CX0NPTV9GSU5EX0NMT1NFMiwgMSwgdGNvbiwgKHZvaWQgKiopJnBTTUIpOworCisJLyogbm8gc2Vuc2UgcmV0dXJuaW5nIGVycm9yIGlmIHNlc3Npb24gcmVzdGFydGVkCisJCWFzIGZpbGUgaGFuZGxlIGhhcyBiZWVuIGNsb3NlZCAqLworCWlmKHJjID09IC1FQUdBSU4pCisJCXJldHVybiAwOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcFNNQnIgPSAoQ0xPU0VfUlNQICopcFNNQjsgIC8qIEJCIHJlbW92ZW1lIEJCICovCisJcFNNQi0+RmlsZUlEID0gc2VhcmNoSGFuZGxlOworCXBTTUItPkJ5dGVDb3VudCA9IDA7CisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRVJST1IoMSwgKCJTZW5kIGVycm9yIGluIEZpbmRDbG9zZSA9ICVkIiwgcmMpKTsKKwl9CisJY2lmc19zbWFsbF9idWZfcmVsZWFzZShwU01CKTsKKworCS8qIFNpbmNlIHNlc3Npb24gaXMgZGVhZCwgc2VhcmNoIGhhbmRsZSBjbG9zZWQgb24gc2VydmVyIGFscmVhZHkgKi8KKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJcmMgPSAwOworCisJcmV0dXJuIHJjOworfQorCisjaWZkZWYgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMCitpbnQKK0NJRlNHZXRTcnZJbm9kZU51bWJlcihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlYXJjaE5hbWUsCisgICAgICAgICAgICAgICAgX191NjQgKiBpbm9kZV9udW1iZXIsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCWludCByYyA9IDA7CisJVFJBTlNBQ1RJT04yX1FQSV9SRVEgKnBTTUIgPSBOVUxMOworCVRSQU5TQUNUSU9OMl9RUElfUlNQICpwU01CciA9IE5VTEw7CisJaW50IG5hbWVfbGVuLCBieXRlc19yZXR1cm5lZDsKKwlfX3UxNiBwYXJhbXMsIGJ5dGVfY291bnQ7CisKKwljRllJKDEsKCJJbiBHZXRTcnZJbm9kZU51bSBmb3IgJXMiLHNlYXJjaE5hbWUpKTsKKwlpZih0Y29uID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOyAKKworR2V0SW5vZGVOdW1iZXJSZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSAmcFNNQnIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbiA9CisJCQljaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIHBTTUItPkZpbGVOYW1lLCBzZWFyY2hOYW1lLCAKKwkJCQlQQVRIX01BWCxubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOyAgICAgLyogdHJhaWxpbmcgbnVsbCAqLworCQluYW1lX2xlbiAqPSAyOworCX0gZWxzZSB7ICAgICAgICAgICAgICAgIC8qIEJCIGltcHJvdmUgdGhlIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgQkIgKi8KKwkJbmFtZV9sZW4gPSBzdHJubGVuKHNlYXJjaE5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4rKzsgICAgIC8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShwU01CLT5GaWxlTmFtZSwgc2VhcmNoTmFtZSwgbmFtZV9sZW4pOworCX0KKworCXBhcmFtcyA9IDIgLyogbGV2ZWwgKi8gICsgNCAvKiByc3J2ZCAqLyAgKyBuYW1lX2xlbiAvKiBpbmNsIG51bGwgKi8gOworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsKKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KDIpOworCS8qIEJCIGZpbmQgZXhhY3QgbWF4IGRhdGEgY291bnQgYmVsb3cgZnJvbSBzZXNzIHN0cnVjdHVyZSBCQiAqLworCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTE2KDQwMDApOworCXBTTUItPk1heFNldHVwQ291bnQgPSAwOworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5GbGFncyA9IDA7CisJcFNNQi0+VGltZW91dCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQyID0gMDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXRvZigKKwkJc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3FwaV9yZXEgLEluZm9ybWF0aW9uTGV2ZWwpIC0gNCk7CisJcFNNQi0+RGF0YUNvdW50ID0gMDsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gMDsKKwlwU01CLT5TZXR1cENvdW50ID0gMTsKKwlwU01CLT5SZXNlcnZlZDMgPSAwOworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihUUkFOUzJfUVVFUllfUEFUSF9JTkZPUk1BVElPTik7CisJYnl0ZV9jb3VudCA9IHBhcmFtcyArIDEgLyogcGFkICovIDsKKwlwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IHBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQ7CisJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9IGNwdV90b19sZTE2KFNNQl9RVUVSWV9GSUxFX0lOVEVSTkFMX0lORk8pOworCXBTTUItPlJlc2VydmVkNCA9IDA7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVfY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoYnl0ZV9jb3VudCk7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRllJKDEsICgiZXJyb3IgJWQgaW4gUXVlcnlJbnRlcm5hbEluZm8iLCByYykpOworCX0gZWxzZSB7CisJCS8qIGRlY29kZSByZXNwb25zZSAqLworCQlyYyA9IHZhbGlkYXRlX3QyKChzdHJ1Y3Qgc21iX3QyX3JzcCAqKXBTTUJyKTsKKwkJaWYgKHJjIHx8IChwU01Cci0+Qnl0ZUNvdW50IDwgMikpCisJCS8qIEJCIGFsc28gY2hlY2sgZW5vdWdoIHRvdGFsIGJ5dGVzIHJldHVybmVkICovCisJCQkvKiBJZiByYyBzaG91bGQgd2UgY2hlY2sgZm9yIEVPUE5PU1VQUCBhbmQKKwkJCWRpc2FibGUgdGhlIHNydmlubyBmbGFnPyBvciBpbiBjYWxsZXI/ICovCisJCQlyYyA9IC1FSU87ICAgICAgLyogYmFkIHNtYiAqLworICAgICAgICAgICAgICAgIGVsc2UgeworCQkJX191MTYgZGF0YV9vZmZzZXQgPSBsZTE2X3RvX2NwdShwU01Cci0+dDIuRGF0YU9mZnNldCk7CisJCQlfX3UxNiBjb3VudCA9IGxlMTZfdG9fY3B1KHBTTUJyLT50Mi5EYXRhQ291bnQpOworCQkJc3RydWN0IGZpbGVfaW50ZXJuYWxfaW5mbyAqIHBmaW5mbzsKKwkJCS8qIEJCIERvIHdlIG5lZWQgYSBjYXN0IG9yIGhhc2ggaGVyZSA/ICovCisJCQlpZihjb3VudCA8IDgpIHsKKwkJCQljRllJKDEsICgiSWxsZWdhbCBzaXplIHJldCBpbiBRcnlJbnRybmxJbmYiKSk7CisJCQkJcmMgPSAtRUlPOworCQkJCWdvdG8gR2V0SW5vZGVOdW1PdXQ7CisJCQl9CisJCQlwZmluZm8gPSAoc3RydWN0IGZpbGVfaW50ZXJuYWxfaW5mbyAqKQorCQkJCShkYXRhX29mZnNldCArIChjaGFyICopICZwU01Cci0+aGRyLlByb3RvY29sKTsKKwkJCSppbm9kZV9udW1iZXIgPSBwZmluZm8tPlVuaXF1ZUlkOworCQl9CisJfQorR2V0SW5vZGVOdW1PdXQ6CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJZ290byBHZXRJbm9kZU51bWJlclJldHJ5OworCXJldHVybiByYzsKK30KKyNlbmRpZiAvKiBDSUZTX0VYUEVSSU1FTlRBTCAqLworCitpbnQKK0NJRlNHZXRERlNSZWZlcihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Nlc0luZm8gKnNlcywKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2VhcmNoTmFtZSwKKwkJdW5zaWduZWQgY2hhciAqKnRhcmdldFVOQ3MsCisJCXVuc2lnbmVkIGludCAqbnVtYmVyX29mX1VOQ19pbl9hcnJheSwKKwkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworLyogVFJBTlMyX0dFVF9ERlNfUkVGRVJSQUwgKi8KKwlUUkFOU0FDVElPTjJfR0VUX0RGU19SRUZFUl9SRVEgKnBTTUIgPSBOVUxMOworCVRSQU5TQUNUSU9OMl9HRVRfREZTX1JFRkVSX1JTUCAqcFNNQnIgPSBOVUxMOworCXN0cnVjdCBkZnNfcmVmZXJyYWxfbGV2ZWxfMyAqIHJlZmVycmFscyA9IE5VTEw7CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQ7CisJaW50IG5hbWVfbGVuOworCXVuc2lnbmVkIGludCBpOworCWNoYXIgKiB0ZW1wOworCV9fdTE2IHBhcmFtcywgYnl0ZV9jb3VudDsKKwkqbnVtYmVyX29mX1VOQ19pbl9hcnJheSA9IDA7CisJKnRhcmdldFVOQ3MgPSBOVUxMOworCisJY0ZZSSgxLCAoIkluIEdldERGU1JlZmVyIHRoZSBwYXRoICVzIiwgc2VhcmNoTmFtZSkpOworCWlmIChzZXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CitnZXRERlNSZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgTlVMTCwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBTTUItPmhkci5UaWQgPSBzZXMtPmlwY190aWQ7CisJcFNNQi0+aGRyLlVpZCA9IHNlcy0+U3VpZDsKKwlpZiAoc2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfU1RBVFVTMzIpIHsKKwkJcFNNQi0+aGRyLkZsYWdzMiB8PSBTTUJGTEcyX0VSUl9TVEFUVVM7CisJfQorCWlmIChzZXMtPmNhcGFiaWxpdGllcyAmIENBUF9ERlMpIHsKKwkJcFNNQi0+aGRyLkZsYWdzMiB8PSBTTUJGTEcyX0RGUzsKKwl9CisKKwlpZiAoc2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JQ09ERSkgeworCQlwU01CLT5oZHIuRmxhZ3MyIHw9IFNNQkZMRzJfVU5JQ09ERTsKKwkJbmFtZV9sZW4gPQorCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBwU01CLT5SZXF1ZXN0RmlsZU5hbWUsCisJCQkJICBzZWFyY2hOYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJfSBlbHNlIHsJCS8qIEJCIGltcHJvdmUgdGhlIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgQkIgKi8KKwkJbmFtZV9sZW4gPSBzdHJubGVuKHNlYXJjaE5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQlzdHJuY3B5KHBTTUItPlJlcXVlc3RGaWxlTmFtZSwgc2VhcmNoTmFtZSwgbmFtZV9sZW4pOworCX0KKworCXBhcmFtcyA9IDIgLyogbGV2ZWwgKi8gICsgbmFtZV9sZW4gLyppbmNsdWRlcyBudWxsICovIDsKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IDA7CisJcFNNQi0+RGF0YUNvdW50ID0gMDsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gMDsKKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IDA7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoNDAwMCk7CS8qIEJCIGZpbmQgZXhhY3QgbWF4IFNNQiBQRFUgZnJvbSBzZXNzIHN0cnVjdHVyZSBCQiAqLworCXBTTUItPk1heFNldHVwQ291bnQgPSAwOworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5GbGFncyA9IDA7CisJcFNNQi0+VGltZW91dCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQyID0gMDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXRvZigKKyAgICAgICAgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX2dldF9kZnNfcmVmZXJfcmVxLCBNYXhSZWZlcnJhbExldmVsKSAtIDQpOworCXBTTUItPlNldHVwQ291bnQgPSAxOworCXBTTUItPlJlc2VydmVkMyA9IDA7CisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KFRSQU5TMl9HRVRfREZTX1JFRkVSUkFMKTsKKwlieXRlX2NvdW50ID0gcGFyYW1zICsgMyAvKiBwYWQgKi8gOworCXBTTUItPlBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50ID0gcFNNQi0+UGFyYW1ldGVyQ291bnQ7CisJcFNNQi0+TWF4UmVmZXJyYWxMZXZlbCA9IGNwdV90b19sZTE2KDMpOworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBieXRlX2NvdW50OworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGJ5dGVfY291bnQpOworCisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRllJKDEsICgiU2VuZCBlcnJvciBpbiBHZXRERlNSZWZlciA9ICVkIiwgcmMpKTsKKwl9IGVsc2UgewkJLyogZGVjb2RlIHJlc3BvbnNlICovCisvKiBCQiBBZGQgbG9naWMgdG8gcGFyc2UgcmVmZXJyYWxzIGhlcmUgKi8KKwkJcmMgPSB2YWxpZGF0ZV90Migoc3RydWN0IHNtYl90Ml9yc3AgKilwU01Ccik7CisKKwkJaWYgKHJjIHx8IChwU01Cci0+Qnl0ZUNvdW50IDwgMTcpKSAgICAgIC8qIEJCIGFsc28gY2hlY2sgZW5vdWdoIHRvdGFsIGJ5dGVzIHJldHVybmVkICovCisJCQlyYyA9IC1FSU87ICAgICAgLyogYmFkIHNtYiAqLworCQllbHNlIHsKKwkJCV9fdTE2IGRhdGFfb2Zmc2V0ID0gbGUxNl90b19jcHUocFNNQnItPnQyLkRhdGFPZmZzZXQpOyAKKwkJCV9fdTE2IGRhdGFfY291bnQgPSBsZTE2X3RvX2NwdShwU01Cci0+dDIuRGF0YUNvdW50KTsKKworCQkJY0ZZSSgxLAorCQkJICAgICAoIkRlY29kaW5nIEdldERGU1JlZmVyIHJlc3BvbnNlLiAgQkNDOiAlZCAgT2Zmc2V0ICVkIiwKKwkJCSAgICAgIHBTTUJyLT5CeXRlQ291bnQsIGRhdGFfb2Zmc2V0KSk7CisJCQlyZWZlcnJhbHMgPSAKKwkJCSAgICAoc3RydWN0IGRmc19yZWZlcnJhbF9sZXZlbF8zICopIAorCQkJCQkoOCAvKiBzaXplb2Ygc3RhcnQgb2YgZGF0YSBibG9jayAqLyArCisJCQkJCWRhdGFfb2Zmc2V0ICsKKwkJCQkJKGNoYXIgKikgJnBTTUJyLT5oZHIuUHJvdG9jb2wpOyAKKwkJCWNGWUkoMSwoIm51bV9yZWZlcnJhbHM6ICVkIGRmcyBmbGFnczogMHgleCAuLi4gXG5mb3IgcmVmZXJyYWwgb25lIHJlZmVyIHNpemU6IDB4JXggc3J2IHR5cGU6IDB4JXggcmVmZXIgZmxhZ3M6IDB4JXggdHRsOiAweCV4IiwKKwkJCQlsZTE2X3RvX2NwdShwU01Cci0+TnVtYmVyT2ZSZWZlcnJhbHMpLGxlMTZfdG9fY3B1KHBTTUJyLT5ERlNGbGFncyksIGxlMTZfdG9fY3B1KHJlZmVycmFscy0+UmVmZXJyYWxTaXplKSxsZTE2X3RvX2NwdShyZWZlcnJhbHMtPlNlcnZlclR5cGUpLGxlMTZfdG9fY3B1KHJlZmVycmFscy0+UmVmZXJyYWxGbGFncyksbGUxNl90b19jcHUocmVmZXJyYWxzLT5UaW1lVG9MaXZlKSkpOworCQkJLyogQkIgVGhpcyBmaWVsZCBpcyBhY3R1YWxseSB0d28gYnl0ZXMgaW4gZnJvbSBzdGFydCBvZgorCQkJICAgZGF0YSBibG9jayBzbyB3ZSBjb3VsZCBkbyBzYWZldHkgY2hlY2sgdGhhdCBEYXRhQmxvY2sKKwkJCSAgIGJlZ2lucyBhdCBhZGRyZXNzIG9mIHBTTUJyLT5OdW1iZXJPZlJlZmVycmFscyAqLworCQkJKm51bWJlcl9vZl9VTkNfaW5fYXJyYXkgPSBsZTE2X3RvX2NwdShwU01Cci0+TnVtYmVyT2ZSZWZlcnJhbHMpOworCisJCQkvKiBCQiBGaXggYmVsb3cgc28gY2FuIHJldHVybiBtb3JlIHRoYW4gb25lIHJlZmVycmFsICovCisJCQlpZigqbnVtYmVyX29mX1VOQ19pbl9hcnJheSA+IDEpCisJCQkJKm51bWJlcl9vZl9VTkNfaW5fYXJyYXkgPSAxOworCisJCQkvKiBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5ncyBkZXNjcmliaW5nIHJlZnMgKi8KKwkJCW5hbWVfbGVuID0gMDsKKwkJCWZvcihpPTA7aTwqbnVtYmVyX29mX1VOQ19pbl9hcnJheTtpKyspIHsKKwkJCQkvKiBtYWtlIHN1cmUgdGhhdCBEZnNQYXRoT2Zmc2V0IG5vdCBwYXN0IGVuZCAqLworCQkJCV9fdTE2IG9mZnNldCA9IGxlMTZfdG9fY3B1KHJlZmVycmFscy0+RGZzUGF0aE9mZnNldCk7CisJCQkJaWYgKG9mZnNldCA+IGRhdGFfY291bnQpIHsKKwkJCQkJLyogaWYgaW52YWxpZCByZWZlcnJhbCwgc3RvcCBoZXJlIGFuZCBkbyAKKwkJCQkJbm90IHRyeSB0byBjb3B5IGFueSBtb3JlICovCisJCQkJCSpudW1iZXJfb2ZfVU5DX2luX2FycmF5ID0gaTsKKwkJCQkJYnJlYWs7CisJCQkJfSAKKwkJCQl0ZW1wID0gKChjaGFyICopcmVmZXJyYWxzKSArIG9mZnNldDsKKworCQkJCWlmIChwU01Cci0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQkJCQluYW1lX2xlbiArPSBVbmlTdHJubGVuKCh3Y2hhcl90ICopdGVtcCxkYXRhX2NvdW50KTsKKwkJCQl9IGVsc2UgeworCQkJCQluYW1lX2xlbiArPSBzdHJubGVuKHRlbXAsZGF0YV9jb3VudCk7CisJCQkJfQorCQkJCXJlZmVycmFscysrOworCQkJCS8qIEJCIGFkZCBjaGVjayB0aGF0IHJlZmVycmFsIHBvaW50ZXIgZG9lcyBub3QgZmFsbCBvZmYgZW5kIFBEVSAqLworCQkJCQorCQkJfQorCQkJLyogQkIgYWRkIGNoZWNrIGZvciBuYW1lX2xlbiBiaWdnZXIgdGhhbiBiY2MgKi8KKwkJCSp0YXJnZXRVTkNzID0gCisJCQkJa21hbGxvYyhuYW1lX2xlbisxKyAoKm51bWJlcl9vZl9VTkNfaW5fYXJyYXkpLEdGUF9LRVJORUwpOworCQkJaWYoKnRhcmdldFVOQ3MgPT0gTlVMTCkgeworCQkJCXJjID0gLUVOT01FTTsKKwkJCQlnb3RvIEdldERGU1JlZkV4aXQ7CisJCQl9CisJCQkvKiBjb3B5IHRoZSByZWYgc3RyaW5ncyAqLworCQkJcmVmZXJyYWxzID0gIAorCQkJICAgIChzdHJ1Y3QgZGZzX3JlZmVycmFsX2xldmVsXzMgKikgCisJCQkJCSg4IC8qIHNpemVvZiBkYXRhIGhkciAqLyArCisJCQkJCWRhdGFfb2Zmc2V0ICsgCisJCQkJCShjaGFyICopICZwU01Cci0+aGRyLlByb3RvY29sKTsKKworCQkJZm9yKGk9MDtpPCpudW1iZXJfb2ZfVU5DX2luX2FycmF5O2krKykgeworCQkJCXRlbXAgPSAoKGNoYXIgKilyZWZlcnJhbHMpICsgbGUxNl90b19jcHUocmVmZXJyYWxzLT5EZnNQYXRoT2Zmc2V0KTsKKwkJCQlpZiAocFNNQnItPmhkci5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJCQkJY2lmc19zdHJmcm9tVUNTX2xlKCp0YXJnZXRVTkNzLAorCQkJCQkJKHdjaGFyX3QgKikgdGVtcCwgbmFtZV9sZW4sIG5sc19jb2RlcGFnZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3RybmNweSgqdGFyZ2V0VU5Dcyx0ZW1wLG5hbWVfbGVuKTsKKwkJCQl9CisJCQkJLyogIEJCIHVwZGF0ZSB0YXJnZXRfdW5jcyBwb2ludGVycyAqLworCQkJCXJlZmVycmFscysrOworCQkJfQorCQkJdGVtcCA9ICp0YXJnZXRVTkNzOworCQkJdGVtcFtuYW1lX2xlbl0gPSAwOworCQl9CisKKwl9CitHZXRERlNSZWZFeGl0OgorCWlmIChwU01CKQorCQljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gZ2V0REZTUmV0cnk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorQ0lGU1NNQlFGU0luZm8oY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkgICAgICAgc3RydWN0IGtzdGF0ZnMgKkZTRGF0YSwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworLyogbGV2ZWwgMHgxMDMgU01CX1FVRVJZX0ZJTEVfU1lTVEVNX0lORk8gKi8KKwlUUkFOU0FDVElPTjJfUUZTSV9SRVEgKnBTTUIgPSBOVUxMOworCVRSQU5TQUNUSU9OMl9RRlNJX1JTUCAqcFNNQnIgPSBOVUxMOworCUZJTEVfU1lTVEVNX0lORk8gKnJlc3BvbnNlX2RhdGE7CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQgPSAwOworCV9fdTE2IHBhcmFtcywgYnl0ZV9jb3VudDsKKworCWNGWUkoMSwgKCJJbiBRRlNJbmZvIikpOworUUZTSW5mb1JldHJ5OgorCXJjID0gc21iX2luaXQoU01CX0NPTV9UUkFOU0FDVElPTjIsIDE1LCB0Y29uLCAodm9pZCAqKikgJnBTTUIsCisJCSAgICAgICh2b2lkICoqKSAmcFNNQnIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcGFyYW1zID0gMjsJLyogbGV2ZWwgKi8KKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IDA7CisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNigyKTsKKwlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUxNigxMDAwKTsJLyogQkIgZmluZCBleGFjdCBtYXggU01CIFBEVSBmcm9tIHNlc3Mgc3RydWN0dXJlIEJCICovCisJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQgPSAwOworCXBTTUItPkZsYWdzID0gMDsKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCWJ5dGVfY291bnQgPSBwYXJhbXMgKyAxIC8qIHBhZCAqLyA7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50OworCXBTTUItPlBhcmFtZXRlck9mZnNldCA9IGNwdV90b19sZTE2KG9mZnNldG9mKAorICAgICAgICBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfcWZzaV9yZXEsIEluZm9ybWF0aW9uTGV2ZWwpIC0gNCk7CisJcFNNQi0+RGF0YUNvdW50ID0gMDsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gMDsKKwlwU01CLT5TZXR1cENvdW50ID0gMTsKKwlwU01CLT5SZXNlcnZlZDMgPSAwOworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihUUkFOUzJfUVVFUllfRlNfSU5GT1JNQVRJT04pOworCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfUVVFUllfRlNfU0laRV9JTkZPKTsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKwlpZiAocmMpIHsKKwkJY0VSUk9SKDEsICgiU2VuZCBlcnJvciBpbiBRRlNJbmZvID0gJWQiLCByYykpOworCX0gZWxzZSB7CQkvKiBkZWNvZGUgcmVzcG9uc2UgKi8KKyAgICAgICAgICAgICAgICByYyA9IHZhbGlkYXRlX3QyKChzdHJ1Y3Qgc21iX3QyX3JzcCAqKXBTTUJyKTsKKworCQlpZiAocmMgfHwgKHBTTUJyLT5CeXRlQ291bnQgPCAyNCkpIC8qIEJCIGFsc08gQ0hFY2sgZW5vdWdoIHRvdGFsIGJ5dGVzIHJldHVybmVkICovCisJCQlyYyA9IC1FSU87CS8qIGJhZCBzbWIgKi8KKwkJZWxzZSB7CisJCQlfX3UxNiBkYXRhX29mZnNldCA9IGxlMTZfdG9fY3B1KHBTTUJyLT50Mi5EYXRhT2Zmc2V0KTsKKwkJCWNGWUkoMSwKKwkJCQkoIkRlY29kaW5nIHFmc2luZm8gcmVzcG9uc2UuICBCQ0M6ICVkICBPZmZzZXQgJWQiLAorCQkJCXBTTUJyLT5CeXRlQ291bnQsIGRhdGFfb2Zmc2V0KSk7CisKKwkJCXJlc3BvbnNlX2RhdGEgPQorCQkJICAgIChGSUxFX1NZU1RFTV9JTkZPCisJCQkgICAgICopICgoKGNoYXIgKikgJnBTTUJyLT5oZHIuUHJvdG9jb2wpICsKKwkJCQkgZGF0YV9vZmZzZXQpOworCQkJRlNEYXRhLT5mX2JzaXplID0KKwkJCSAgICBsZTMyX3RvX2NwdShyZXNwb25zZV9kYXRhLT5CeXRlc1BlclNlY3RvcikgKgorCQkJICAgIGxlMzJfdG9fY3B1KHJlc3BvbnNlX2RhdGEtPgorCQkJCQlTZWN0b3JzUGVyQWxsb2NhdGlvblVuaXQpOworCQkJRlNEYXRhLT5mX2Jsb2NrcyA9CisJCQkgICAgbGU2NF90b19jcHUocmVzcG9uc2VfZGF0YS0+VG90YWxBbGxvY2F0aW9uVW5pdHMpOworCQkJRlNEYXRhLT5mX2JmcmVlID0gRlNEYXRhLT5mX2JhdmFpbCA9CisJCQkgICAgbGU2NF90b19jcHUocmVzcG9uc2VfZGF0YS0+RnJlZUFsbG9jYXRpb25Vbml0cyk7CisJCQljRllJKDEsCisJCQkgICAgICgiQmxvY2tzOiAlbGxkICBGcmVlOiAlbGxkIEJsb2NrIHNpemUgJWxkIiwKKwkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpRlNEYXRhLT5mX2Jsb2NrcywKKwkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpRlNEYXRhLT5mX2JmcmVlLAorCQkJICAgICAgRlNEYXRhLT5mX2JzaXplKSk7CisJCX0KKwl9CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIFFGU0luZm9SZXRyeTsKKworCXJldHVybiByYzsKK30KKworaW50CitDSUZTU01CUUZTQXR0cmlidXRlSW5mbyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworLyogbGV2ZWwgMHgxMDUgIFNNQl9RVUVSWV9GSUxFX1NZU1RFTV9JTkZPICovCisJVFJBTlNBQ1RJT04yX1FGU0lfUkVRICpwU01CID0gTlVMTDsKKwlUUkFOU0FDVElPTjJfUUZTSV9SU1AgKnBTTUJyID0gTlVMTDsKKwlGSUxFX1NZU1RFTV9BVFRSSUJVVEVfSU5GTyAqcmVzcG9uc2VfZGF0YTsKKwlpbnQgcmMgPSAwOworCWludCBieXRlc19yZXR1cm5lZCA9IDA7CisJX191MTYgcGFyYW1zLCBieXRlX2NvdW50OworCisJY0ZZSSgxLCAoIkluIFFGU0F0dHJpYnV0ZUluZm8iKSk7CitRRlNBdHRyaWJ1dGVSZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBhcmFtcyA9IDI7CS8qIGxldmVsICovCisJcFNNQi0+VG90YWxEYXRhQ291bnQgPSAwOworCXBTTUItPk1heFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYoMik7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoMTAwMCk7CS8qIEJCIGZpbmQgZXhhY3QgbWF4IFNNQiBQRFUgZnJvbSBzZXNzIHN0cnVjdHVyZSBCQiAqLworCXBTTUItPk1heFNldHVwQ291bnQgPSAwOworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5GbGFncyA9IDA7CisJcFNNQi0+VGltZW91dCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQyID0gMDsKKwlieXRlX2NvdW50ID0gcGFyYW1zICsgMSAvKiBwYWQgKi8gOworCXBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNihwYXJhbXMpOworCXBTTUItPlBhcmFtZXRlckNvdW50ID0gcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXRvZigKKyAgICAgICAgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3Fmc2lfcmVxLCBJbmZvcm1hdGlvbkxldmVsKSAtIDQpOworCXBTTUItPkRhdGFDb3VudCA9IDA7CisJcFNNQi0+RGF0YU9mZnNldCA9IDA7CisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CisJcFNNQi0+UmVzZXJ2ZWQzID0gMDsKKwlwU01CLT5TdWJDb21tYW5kID0gY3B1X3RvX2xlMTYoVFJBTlMyX1FVRVJZX0ZTX0lORk9STUFUSU9OKTsKKwlwU01CLT5JbmZvcm1hdGlvbkxldmVsID0gY3B1X3RvX2xlMTYoU01CX1FVRVJZX0ZTX0FUVFJJQlVURV9JTkZPKTsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKwlpZiAocmMpIHsKKwkJY0VSUk9SKDEsICgiU2VuZCBlcnJvciBpbiBRRlNBdHRyaWJ1dGVJbmZvID0gJWQiLCByYykpOworCX0gZWxzZSB7CQkvKiBkZWNvZGUgcmVzcG9uc2UgKi8KKwkJcmMgPSB2YWxpZGF0ZV90Migoc3RydWN0IHNtYl90Ml9yc3AgKilwU01Ccik7CisKKwkJaWYgKHJjIHx8IChwU01Cci0+Qnl0ZUNvdW50IDwgMTMpKSB7CS8qIEJCIGFsc28gY2hlY2sgZW5vdWdoIGJ5dGVzIHJldHVybmVkICovCisJCQlyYyA9IC1FSU87CS8qIGJhZCBzbWIgKi8KKwkJfSBlbHNlIHsKKwkJCV9fdTE2IGRhdGFfb2Zmc2V0ID0gbGUxNl90b19jcHUocFNNQnItPnQyLkRhdGFPZmZzZXQpOworCQkJcmVzcG9uc2VfZGF0YSA9CisJCQkgICAgKEZJTEVfU1lTVEVNX0FUVFJJQlVURV9JTkZPCisJCQkgICAgICopICgoKGNoYXIgKikgJnBTTUJyLT5oZHIuUHJvdG9jb2wpICsKKwkJCQkgZGF0YV9vZmZzZXQpOworCQkJbWVtY3B5KCZ0Y29uLT5mc0F0dHJJbmZvLCByZXNwb25zZV9kYXRhLAorCQkJICAgICAgIHNpemVvZiAoRklMRV9TWVNURU1fQVRUUklCVVRFX0lORk8pKTsKKwkJfQorCX0KKwljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gUUZTQXR0cmlidXRlUmV0cnk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorQ0lGU1NNQlFGU0RldmljZUluZm8oY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisvKiBsZXZlbCAweDEwNCBTTUJfUVVFUllfRklMRV9TWVNURU1fSU5GTyAqLworCVRSQU5TQUNUSU9OMl9RRlNJX1JFUSAqcFNNQiA9IE5VTEw7CisJVFJBTlNBQ1RJT04yX1FGU0lfUlNQICpwU01CciA9IE5VTEw7CisJRklMRV9TWVNURU1fREVWSUNFX0lORk8gKnJlc3BvbnNlX2RhdGE7CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQgPSAwOworCV9fdTE2IHBhcmFtcywgYnl0ZV9jb3VudDsKKworCWNGWUkoMSwgKCJJbiBRRlNEZXZpY2VJbmZvIikpOworUUZTRGV2aWNlUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwYXJhbXMgPSAyOwkvKiBsZXZlbCAqLworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsKKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KDIpOworCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTE2KDEwMDApOwkvKiBCQiBmaW5kIGV4YWN0IG1heCBTTUIgUERVIGZyb20gc2VzcyBzdHJ1Y3R1cmUgQkIgKi8KKwlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKKwlwU01CLT5SZXNlcnZlZCA9IDA7CisJcFNNQi0+RmxhZ3MgPSAwOworCXBTTUItPlRpbWVvdXQgPSAwOworCXBTTUItPlJlc2VydmVkMiA9IDA7CisJYnl0ZV9jb3VudCA9IHBhcmFtcyArIDEgLyogcGFkICovIDsKKwlwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IHBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQ7CisJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmc2V0b2YoCisgICAgICAgIHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9xZnNpX3JlcSwgSW5mb3JtYXRpb25MZXZlbCkgLSA0KTsKKworCXBTTUItPkRhdGFDb3VudCA9IDA7CisJcFNNQi0+RGF0YU9mZnNldCA9IDA7CisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CisJcFNNQi0+UmVzZXJ2ZWQzID0gMDsKKwlwU01CLT5TdWJDb21tYW5kID0gY3B1X3RvX2xlMTYoVFJBTlMyX1FVRVJZX0ZTX0lORk9STUFUSU9OKTsKKwlwU01CLT5JbmZvcm1hdGlvbkxldmVsID0gY3B1X3RvX2xlMTYoU01CX1FVRVJZX0ZTX0RFVklDRV9JTkZPKTsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoIlNlbmQgZXJyb3IgaW4gUUZTRGV2aWNlSW5mbyA9ICVkIiwgcmMpKTsKKwl9IGVsc2UgewkJLyogZGVjb2RlIHJlc3BvbnNlICovCisJCXJjID0gdmFsaWRhdGVfdDIoKHN0cnVjdCBzbWJfdDJfcnNwICopcFNNQnIpOworCisJCWlmIChyYyB8fCAocFNNQnItPkJ5dGVDb3VudCA8IHNpemVvZiAoRklMRV9TWVNURU1fREVWSUNFX0lORk8pKSkKKwkJCXJjID0gLUVJTzsJLyogYmFkIHNtYiAqLworCQllbHNlIHsKKwkJCV9fdTE2IGRhdGFfb2Zmc2V0ID0gbGUxNl90b19jcHUocFNNQnItPnQyLkRhdGFPZmZzZXQpOworCQkJcmVzcG9uc2VfZGF0YSA9CisJCQkgICAgKEZJTEVfU1lTVEVNX0RFVklDRV9JTkZPCisJCQkgICAgICopICgoKGNoYXIgKikgJnBTTUJyLT5oZHIuUHJvdG9jb2wpICsKKwkJCQkgZGF0YV9vZmZzZXQpOworCQkJbWVtY3B5KCZ0Y29uLT5mc0RldkluZm8sIHJlc3BvbnNlX2RhdGEsCisJCQkgICAgICAgc2l6ZW9mIChGSUxFX1NZU1RFTV9ERVZJQ0VfSU5GTykpOworCQl9CisJfQorCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisKKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJZ290byBRRlNEZXZpY2VSZXRyeTsKKworCXJldHVybiByYzsKK30KKworaW50CitDSUZTU01CUUZTVW5peEluZm8oY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJICAgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworLyogbGV2ZWwgMHgyMDAgIFNNQl9RVUVSWV9DSUZTX1VOSVhfSU5GTyAqLworCVRSQU5TQUNUSU9OMl9RRlNJX1JFUSAqcFNNQiA9IE5VTEw7CisJVFJBTlNBQ1RJT04yX1FGU0lfUlNQICpwU01CciA9IE5VTEw7CisJRklMRV9TWVNURU1fVU5JWF9JTkZPICpyZXNwb25zZV9kYXRhOworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwlfX3UxNiBwYXJhbXMsIGJ5dGVfY291bnQ7CisKKwljRllJKDEsICgiSW4gUUZTVW5peEluZm8iKSk7CitRRlNVbml4UmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwYXJhbXMgPSAyOwkvKiBsZXZlbCAqLworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsKKwlwU01CLT5EYXRhQ291bnQgPSAwOworCXBTTUItPkRhdGFPZmZzZXQgPSAwOworCXBTTUItPk1heFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYoMik7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoMTAwKTsJLyogQkIgZmluZCBleGFjdCBtYXggU01CIFBEVSBmcm9tIHNlc3Mgc3RydWN0dXJlIEJCICovCisJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQgPSAwOworCXBTTUItPkZsYWdzID0gMDsKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCWJ5dGVfY291bnQgPSBwYXJhbXMgKyAxIC8qIHBhZCAqLyA7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNihwYXJhbXMpOworCXBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQgPSBwU01CLT5QYXJhbWV0ZXJDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXRvZihzdHJ1Y3QgCisgICAgICAgIHNtYl9jb21fdHJhbnNhY3Rpb24yX3Fmc2lfcmVxLCBJbmZvcm1hdGlvbkxldmVsKSAtIDQpOworCXBTTUItPlNldHVwQ291bnQgPSAxOworCXBTTUItPlJlc2VydmVkMyA9IDA7CisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KFRSQU5TMl9RVUVSWV9GU19JTkZPUk1BVElPTik7CisJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9IGNwdV90b19sZTE2KFNNQl9RVUVSWV9DSUZTX1VOSVhfSU5GTyk7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVfY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoYnl0ZV9jb3VudCk7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNFUlJPUigxLCAoIlNlbmQgZXJyb3IgaW4gUUZTVW5peEluZm8gPSAlZCIsIHJjKSk7CisJfSBlbHNlIHsJCS8qIGRlY29kZSByZXNwb25zZSAqLworCQlyYyA9IHZhbGlkYXRlX3QyKChzdHJ1Y3Qgc21iX3QyX3JzcCAqKXBTTUJyKTsKKworCQlpZiAocmMgfHwgKHBTTUJyLT5CeXRlQ291bnQgPCAxMykpIHsKKwkJCXJjID0gLUVJTzsJLyogYmFkIHNtYiAqLworCQl9IGVsc2UgeworCQkJX191MTYgZGF0YV9vZmZzZXQgPSBsZTE2X3RvX2NwdShwU01Cci0+dDIuRGF0YU9mZnNldCk7CisJCQlyZXNwb25zZV9kYXRhID0KKwkJCSAgICAoRklMRV9TWVNURU1fVU5JWF9JTkZPCisJCQkgICAgICopICgoKGNoYXIgKikgJnBTTUJyLT5oZHIuUHJvdG9jb2wpICsKKwkJCQkgZGF0YV9vZmZzZXQpOworCQkJbWVtY3B5KCZ0Y29uLT5mc1VuaXhJbmZvLCByZXNwb25zZV9kYXRhLAorCQkJICAgICAgIHNpemVvZiAoRklMRV9TWVNURU1fVU5JWF9JTkZPKSk7CisJCX0KKwl9CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIFFGU1VuaXhSZXRyeTsKKworCisJcmV0dXJuIHJjOworfQorCisKK2ludAorQ0lGU1NNQlFGU1Bvc2l4SW5mbyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkgICBzdHJ1Y3Qga3N0YXRmcyAqRlNEYXRhLCBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisvKiBsZXZlbCAweDIwMSAgU01CX1FVRVJZX0NJRlNfUE9TSVhfSU5GTyAqLworCVRSQU5TQUNUSU9OMl9RRlNJX1JFUSAqcFNNQiA9IE5VTEw7CisJVFJBTlNBQ1RJT04yX1FGU0lfUlNQICpwU01CciA9IE5VTEw7CisJRklMRV9TWVNURU1fUE9TSVhfSU5GTyAqcmVzcG9uc2VfZGF0YTsKKwlpbnQgcmMgPSAwOworCWludCBieXRlc19yZXR1cm5lZCA9IDA7CisJX191MTYgcGFyYW1zLCBieXRlX2NvdW50OworCisJY0ZZSSgxLCAoIkluIFFGU1Bvc2l4SW5mbyIpKTsKK1FGU1Bvc2l4UmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwYXJhbXMgPSAyOwkvKiBsZXZlbCAqLworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsKKwlwU01CLT5EYXRhQ291bnQgPSAwOworCXBTTUItPkRhdGFPZmZzZXQgPSAwOworCXBTTUItPk1heFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYoMik7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoMTAwKTsJLyogQkIgZmluZCBleGFjdCBtYXggU01CIFBEVSBmcm9tIHNlc3Mgc3RydWN0dXJlIEJCICovCisJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQgPSAwOworCXBTTUItPkZsYWdzID0gMDsKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCWJ5dGVfY291bnQgPSBwYXJhbXMgKyAxIC8qIHBhZCAqLyA7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNihwYXJhbXMpOworCXBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQgPSBwU01CLT5QYXJhbWV0ZXJDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXRvZihzdHJ1Y3QgCisgICAgICAgIHNtYl9jb21fdHJhbnNhY3Rpb24yX3Fmc2lfcmVxLCBJbmZvcm1hdGlvbkxldmVsKSAtIDQpOworCXBTTUItPlNldHVwQ291bnQgPSAxOworCXBTTUItPlJlc2VydmVkMyA9IDA7CisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KFRSQU5TMl9RVUVSWV9GU19JTkZPUk1BVElPTik7CisJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9IGNwdV90b19sZTE2KFNNQl9RVUVSWV9QT1NJWF9GU19JTkZPKTsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoIlNlbmQgZXJyb3IgaW4gUUZTVW5peEluZm8gPSAlZCIsIHJjKSk7CisJfSBlbHNlIHsJCS8qIGRlY29kZSByZXNwb25zZSAqLworCQlyYyA9IHZhbGlkYXRlX3QyKChzdHJ1Y3Qgc21iX3QyX3JzcCAqKXBTTUJyKTsKKworCQlpZiAocmMgfHwgKHBTTUJyLT5CeXRlQ291bnQgPCAxMykpIHsKKwkJCXJjID0gLUVJTzsJLyogYmFkIHNtYiAqLworCQl9IGVsc2UgeworCQkJX191MTYgZGF0YV9vZmZzZXQgPSBsZTE2X3RvX2NwdShwU01Cci0+dDIuRGF0YU9mZnNldCk7CisJCQlyZXNwb25zZV9kYXRhID0KKwkJCSAgICAoRklMRV9TWVNURU1fUE9TSVhfSU5GTworCQkJICAgICAqKSAoKChjaGFyICopICZwU01Cci0+aGRyLlByb3RvY29sKSArCisJCQkJIGRhdGFfb2Zmc2V0KTsKKwkJCUZTRGF0YS0+Zl9ic2l6ZSA9CisJCQkJCWxlMzJfdG9fY3B1KHJlc3BvbnNlX2RhdGEtPkJsb2NrU2l6ZSk7CisJCQlGU0RhdGEtPmZfYmxvY2tzID0KKwkJCQkJbGU2NF90b19jcHUocmVzcG9uc2VfZGF0YS0+VG90YWxCbG9ja3MpOworCQkJRlNEYXRhLT5mX2JmcmVlID0KKwkJCSAgICBsZTY0X3RvX2NwdShyZXNwb25zZV9kYXRhLT5CbG9ja3NBdmFpbCk7CisJCQlpZihyZXNwb25zZV9kYXRhLT5Vc2VyQmxvY2tzQXZhaWwgPT0gLTEpIHsKKwkJCQlGU0RhdGEtPmZfYmF2YWlsID0gRlNEYXRhLT5mX2JmcmVlOworCQkJfSBlbHNlIHsKKwkJCQlGU0RhdGEtPmZfYmF2YWlsID0KKwkJCQkJbGU2NF90b19jcHUocmVzcG9uc2VfZGF0YS0+VXNlckJsb2Nrc0F2YWlsKTsKKwkJCX0KKwkJCWlmKHJlc3BvbnNlX2RhdGEtPlRvdGFsRmlsZU5vZGVzICE9IC0xKQorCQkJCUZTRGF0YS0+Zl9maWxlcyA9CisJCQkJCWxlNjRfdG9fY3B1KHJlc3BvbnNlX2RhdGEtPlRvdGFsRmlsZU5vZGVzKTsKKwkJCWlmKHJlc3BvbnNlX2RhdGEtPkZyZWVGaWxlTm9kZXMgIT0gLTEpCisJCQkJRlNEYXRhLT5mX2ZmcmVlID0KKwkJCQkJbGU2NF90b19jcHUocmVzcG9uc2VfZGF0YS0+RnJlZUZpbGVOb2Rlcyk7CisJCX0KKwl9CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIFFGU1Bvc2l4UmV0cnk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyogV2UgY2FuIG5vdCB1c2Ugd3JpdGUgb2YgemVybyBieXRlcyB0cmljayB0byAKKyAgIHNldCBmaWxlIHNpemUgZHVlIHRvIG5lZWQgZm9yIGxhcmdlIGZpbGUgc3VwcG9ydC4gIEFsc28gbm90ZSB0aGF0IAorICAgdGhpcyBTZXRQYXRoSW5mbyBpcyBwcmVmZXJyZWQgdG8gU2V0RmlsZUluZm8gYmFzZWQgbWV0aG9kIGluIG5leHQgCisgICByb3V0aW5lIHdoaWNoIGlzIG9ubHkgbmVlZGVkIHRvIHdvcmsgYXJvdW5kIGEgc2hhcmluZyB2aW9sYXRpb24gYnVnCisgICBpbiBTYW1iYSB3aGljaCB0aGlzIHJvdXRpbmUgY2FuIHJ1biBpbnRvICovCisKK2ludAorQ0lGU1NNQlNldEVPRihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLCBjb25zdCBjaGFyICpmaWxlTmFtZSwKKwkgICAgICBfX3U2NCBzaXplLCBpbnQgU2V0QWxsb2NhdGlvbiwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCXN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9zcGlfcmVxICpwU01CID0gTlVMTDsKKwlzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc3BpX3JzcCAqcFNNQnIgPSBOVUxMOworCXN0cnVjdCBmaWxlX2VuZF9vZl9maWxlX2luZm8gKnBhcm1fZGF0YTsKKwlpbnQgbmFtZV9sZW47CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQgPSAwOworCV9fdTE2IHBhcmFtcywgYnl0ZV9jb3VudCwgZGF0YV9jb3VudCwgcGFyYW1fb2Zmc2V0LCBvZmZzZXQ7CisKKwljRllJKDEsICgiSW4gU2V0RU9GIikpOworU2V0RU9GUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbiA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIHBTTUItPkZpbGVOYW1lLCBmaWxlTmFtZSwgUEFUSF9NQVgKKwkJCQkgIC8qIGZpbmQgZGVmaW5lIGZvciB0aGlzIG1heHBhdGhjb21wb25lbnQgKi8KKwkJCQkgICwgbmxzX2NvZGVwYWdlKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQluYW1lX2xlbiAqPSAyOworCX0gZWxzZSB7CQkvKiBCQiBpbXByb3ZlIHRoZSBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW5zIEJCICovCisJCW5hbWVfbGVuID0gc3RybmxlbihmaWxlTmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCXN0cm5jcHkocFNNQi0+RmlsZU5hbWUsIGZpbGVOYW1lLCBuYW1lX2xlbik7CisJfQorCXBhcmFtcyA9IDYgKyBuYW1lX2xlbjsKKwlkYXRhX2NvdW50ID0gc2l6ZW9mIChzdHJ1Y3QgZmlsZV9lbmRfb2ZfZmlsZV9pbmZvKTsKKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KDIpOworCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTE2KDEwMDApOwkvKiBCQiBmaW5kIG1heCBTTUIgc2l6ZSBmcm9tIHNlc3MgKi8KKwlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKKwlwU01CLT5SZXNlcnZlZCA9IDA7CisJcFNNQi0+RmxhZ3MgPSAwOworCXBTTUItPlRpbWVvdXQgPSAwOworCXBTTUItPlJlc2VydmVkMiA9IDA7CisJcGFyYW1fb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NwaV9yZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25MZXZlbCkgLSA0OworCW9mZnNldCA9IHBhcmFtX29mZnNldCArIHBhcmFtczsKKwlpZihTZXRBbGxvY2F0aW9uKSB7CisgICAgICAgIAlpZiAodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfSU5GT0xFVkVMX1BBU1NUSFJVKQorCSAgICAgICAgICAgIHBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPQorICAgICAgICAgICAgICAgIAljcHVfdG9fbGUxNihTTUJfU0VUX0ZJTEVfQUxMT0NBVElPTl9JTkZPMik7CisgICAgICAgIAllbHNlCisJICAgICAgICAgICAgcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9CisgICAgICAgIAkgICAgICAgIGNwdV90b19sZTE2KFNNQl9TRVRfRklMRV9BTExPQ0FUSU9OX0lORk8pOworCX0gZWxzZSAvKiBTZXQgRmlsZSBTaXplICovICB7ICAgIAorCSAgICBpZiAodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfSU5GT0xFVkVMX1BBU1NUSFJVKQorCQkgICAgcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9CisJCSAgICAgICAgY3B1X3RvX2xlMTYoU01CX1NFVF9GSUxFX0VORF9PRl9GSUxFX0lORk8yKTsKKwkgICAgZWxzZQorCQkgICAgcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9CisJCSAgICAgICAgY3B1X3RvX2xlMTYoU01CX1NFVF9GSUxFX0VORF9PRl9GSUxFX0lORk8pOworCX0KKworCXBhcm1fZGF0YSA9CisJICAgIChzdHJ1Y3QgZmlsZV9lbmRfb2ZfZmlsZV9pbmZvICopICgoKGNoYXIgKikgJnBTTUItPmhkci5Qcm90b2NvbCkgKworCQkJCSAgICAgICBvZmZzZXQpOworCXBTTUItPlBhcmFtZXRlck9mZnNldCA9IGNwdV90b19sZTE2KHBhcmFtX29mZnNldCk7CisJcFNNQi0+RGF0YU9mZnNldCA9IGNwdV90b19sZTE2KG9mZnNldCk7CisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CisJcFNNQi0+UmVzZXJ2ZWQzID0gMDsKKwlwU01CLT5TdWJDb21tYW5kID0gY3B1X3RvX2xlMTYoVFJBTlMyX1NFVF9QQVRIX0lORk9STUFUSU9OKTsKKwlieXRlX2NvdW50ID0gMyAvKiBwYWQgKi8gICsgcGFyYW1zICsgZGF0YV9jb3VudDsKKwlwU01CLT5EYXRhQ291bnQgPSBjcHVfdG9fbGUxNihkYXRhX2NvdW50KTsKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IHBTTUItPkRhdGFDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IHBTTUItPlBhcmFtZXRlckNvdW50OworCXBTTUItPlJlc2VydmVkNCA9IDA7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVfY291bnQ7CisJcGFybV9kYXRhLT5GaWxlU2l6ZSA9IGNwdV90b19sZTY0KHNpemUpOworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGJ5dGVfY291bnQpOworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoIlNldFBhdGhJbmZvIChmaWxlIHNpemUpIHJldHVybmVkICVkIiwgcmMpKTsKKwl9CisKKwljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gU2V0RU9GUmV0cnk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorQ0lGU1NNQlNldEZpbGVTaXplKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sIF9fdTY0IHNpemUsIAorICAgICAgICAgICAgICAgICAgIF9fdTE2IGZpZCwgX191MzIgcGlkX29mX29wZW5lciwgaW50IFNldEFsbG9jYXRpb24pCit7CisJc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NmaV9yZXEgKnBTTUIgID0gTlVMTDsKKwlzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc2ZpX3JzcCAqcFNNQnIgPSBOVUxMOworCWNoYXIgKmRhdGFfb2Zmc2V0OworCXN0cnVjdCBmaWxlX2VuZF9vZl9maWxlX2luZm8gKnBhcm1fZGF0YTsKKwlpbnQgcmMgPSAwOworCWludCBieXRlc19yZXR1cm5lZCA9IDA7CisJX191MTYgcGFyYW1zLCBwYXJhbV9vZmZzZXQsIG9mZnNldCwgYnl0ZV9jb3VudCwgY291bnQ7CisKKwljRllJKDEsICgiU2V0RmlsZVNpemUgKHZpYSBTZXRGaWxlSW5mbykgJWxsZCIsCisJCQkobG9uZyBsb25nKXNpemUpKTsKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBTTUItPmhkci5QaWQgPSBjcHVfdG9fbGUxNigoX191MTYpcGlkX29mX29wZW5lcik7CisJcFNNQi0+aGRyLlBpZEhpZ2ggPSBjcHVfdG9fbGUxNigoX191MTYpKHBpZF9vZl9vcGVuZXIgPj4gMTYpKTsKKyAgICAKKwlwYXJhbXMgPSA2OworCXBTTUItPk1heFNldHVwQ291bnQgPSAwOworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5GbGFncyA9IDA7CisJcFNNQi0+VGltZW91dCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQyID0gMDsKKwlwYXJhbV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc2ZpX3JlcSwgRmlkKSAtIDQ7CisJb2Zmc2V0ID0gcGFyYW1fb2Zmc2V0ICsgcGFyYW1zOworCisJZGF0YV9vZmZzZXQgPSAoY2hhciAqKSAoJnBTTUItPmhkci5Qcm90b2NvbCkgKyBvZmZzZXQ7CQorCisJY291bnQgPSBzaXplb2Yoc3RydWN0IGZpbGVfZW5kX29mX2ZpbGVfaW5mbyk7CisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNigyKTsKKwlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUxNigxMDAwKTsJLyogQkIgZmluZCBtYXggU01CIFBEVSBmcm9tIHNlc3MgKi8KKwlwU01CLT5TZXR1cENvdW50ID0gMTsKKwlwU01CLT5SZXNlcnZlZDMgPSAwOworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihUUkFOUzJfU0VUX0ZJTEVfSU5GT1JNQVRJT04pOworCWJ5dGVfY291bnQgPSAzIC8qIHBhZCAqLyAgKyBwYXJhbXMgKyBjb3VudDsKKwlwU01CLT5EYXRhQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNihwYXJhbXMpOworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gcFNNQi0+RGF0YUNvdW50OworCXBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQgPSBwU01CLT5QYXJhbWV0ZXJDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihwYXJhbV9vZmZzZXQpOworCXBhcm1fZGF0YSA9CisJCShzdHJ1Y3QgZmlsZV9lbmRfb2ZfZmlsZV9pbmZvICopICgoKGNoYXIgKikgJnBTTUItPmhkci5Qcm90b2NvbCkgKworCQkJb2Zmc2V0KTsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmc2V0KTsKKwlwYXJtX2RhdGEtPkZpbGVTaXplID0gY3B1X3RvX2xlNjQoc2l6ZSk7CisJcFNNQi0+RmlkID0gZmlkOworCWlmKFNldEFsbG9jYXRpb24pIHsKKwkJaWYgKHRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX0lORk9MRVZFTF9QQVNTVEhSVSkKKwkJCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPQorCQkJCWNwdV90b19sZTE2KFNNQl9TRVRfRklMRV9BTExPQ0FUSU9OX0lORk8yKTsKKwkJZWxzZQorCQkJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9CisJCQkJY3B1X3RvX2xlMTYoU01CX1NFVF9GSUxFX0FMTE9DQVRJT05fSU5GTyk7CisJfSBlbHNlIC8qIFNldCBGaWxlIFNpemUgKi8gIHsgICAgCisJICAgIGlmICh0Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9JTkZPTEVWRUxfUEFTU1RIUlUpCisJCSAgICBwU01CLT5JbmZvcm1hdGlvbkxldmVsID0KKwkJICAgICAgICBjcHVfdG9fbGUxNihTTUJfU0VUX0ZJTEVfRU5EX09GX0ZJTEVfSU5GTzIpOworCSAgICBlbHNlCisJCSAgICBwU01CLT5JbmZvcm1hdGlvbkxldmVsID0KKwkJICAgICAgICBjcHVfdG9fbGUxNihTTUJfU0VUX0ZJTEVfRU5EX09GX0ZJTEVfSU5GTyk7CisJfQorCXBTTUItPlJlc2VydmVkNCA9IDA7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVfY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoYnl0ZV9jb3VudCk7CisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRllJKDEsCisJCSAgICAgKCJTZW5kIGVycm9yIGluIFNldEZpbGVJbmZvIChTZXRGaWxlU2l6ZSkgPSAlZCIsCisJCSAgICAgIHJjKSk7CisJfQorCisJaWYgKHBTTUIpCisJCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisKKwkvKiBOb3RlOiBPbiAtRUFHQUlOIGVycm9yIG9ubHkgY2FsbGVyIGNhbiByZXRyeSBvbiBoYW5kbGUgYmFzZWQgY2FsbHMgCisJCXNpbmNlIGZpbGUgaGFuZGxlIHBhc3NlZCBpbiBubyBsb25nZXIgdmFsaWQgKi8KKworCXJldHVybiByYzsKK30KKworLyogU29tZSBsZWdhY3kgc2VydmVycyBzdWNoIGFzIE5UNCByZXF1aXJlIHRoYXQgdGhlIGZpbGUgdGltZXMgYmUgc2V0IG9uIAorICAgYW4gb3BlbiBoYW5kbGUsIHJhdGhlciB0aGFuIGJ5IHBhdGhuYW1lIC0gdGhpcyBpcyBhd2t3YXJkIGR1ZSB0bworICAgcG90ZW50aWFsIGFjY2VzcyBjb25mbGljdHMgb24gdGhlIG9wZW4sIGJ1dCBpdCBpcyB1bmF2b2lkYWJsZSBmb3IgdGhlc2UKKyAgIG9sZCBzZXJ2ZXJzIHNpbmNlIHRoZSBvbmx5IG90aGVyIGNob2ljZSBpcyB0byBnbyBmcm9tIDEwMCBuYW5vc2Vjb25kIERDRQorICAgdGltZSBhbmQgcmVzb3J0IHRvIHRoZSBvcmlnaW5hbCBzZXRwYXRoaW5mbyBsZXZlbCB3aGljaCB0YWtlcyB0aGUgYW5jaWVudAorICAgRE9TIHRpbWUgZm9ybWF0IHdpdGggMiBzZWNvbmQgZ3JhbnVsYXJpdHkgKi8KK2ludAorQ0lGU1NNQlNldEZpbGVUaW1lcyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLCBjb25zdCBGSUxFX0JBU0lDX0lORk8gKiBkYXRhLCAKKyAgICAgICAgICAgICAgICAgICBfX3UxNiBmaWQpCit7CisJc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NmaV9yZXEgKnBTTUIgID0gTlVMTDsKKwlzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc2ZpX3JzcCAqcFNNQnIgPSBOVUxMOworCWNoYXIgKmRhdGFfb2Zmc2V0OworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwlfX3UxNiBwYXJhbXMsIHBhcmFtX29mZnNldCwgb2Zmc2V0LCBieXRlX2NvdW50LCBjb3VudDsKKworCWNGWUkoMSwgKCJTZXQgVGltZXMgKHZpYSBTZXRGaWxlSW5mbykiKSk7CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiBBdCB0aGlzIHBvaW50IHRoZXJlIGlzIG5vIG5lZWQgdG8gb3ZlcnJpZGUgdGhlIGN1cnJlbnQgcGlkCisJd2l0aCB0aGUgcGlkIG9mIHRoZSBvcGVuZXIsIGJ1dCB0aGF0IGNvdWxkIGNoYW5nZSBpZiB3ZSBzb21lZGF5CisJdXNlIGFuIGV4aXN0aW5nIGhhbmRsZSAocmF0aGVyIHRoYW4gb3BlbmluZyBvbmUgb24gdGhlIGZseSkgKi8KKwkvKiBwU01CLT5oZHIuUGlkID0gY3B1X3RvX2xlMTYoKF9fdTE2KXBpZF9vZl9vcGVuZXIpOworCXBTTUItPmhkci5QaWRIaWdoID0gY3B1X3RvX2xlMTYoKF9fdTE2KShwaWRfb2Zfb3BlbmVyID4+IDE2KSk7Ki8KKyAgICAKKwlwYXJhbXMgPSA2OworCXBTTUItPk1heFNldHVwQ291bnQgPSAwOworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5GbGFncyA9IDA7CisJcFNNQi0+VGltZW91dCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQyID0gMDsKKwlwYXJhbV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc2ZpX3JlcSwgRmlkKSAtIDQ7CisJb2Zmc2V0ID0gcGFyYW1fb2Zmc2V0ICsgcGFyYW1zOworCisJZGF0YV9vZmZzZXQgPSAoY2hhciAqKSAoJnBTTUItPmhkci5Qcm90b2NvbCkgKyBvZmZzZXQ7IAorCisJY291bnQgPSBzaXplb2YgKEZJTEVfQkFTSUNfSU5GTyk7CisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNigyKTsKKwlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUxNigxMDAwKTsJLyogQkIgZmluZCBtYXggU01CIFBEVSBmcm9tIHNlc3MgKi8KKwlwU01CLT5TZXR1cENvdW50ID0gMTsKKwlwU01CLT5SZXNlcnZlZDMgPSAwOworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihUUkFOUzJfU0VUX0ZJTEVfSU5GT1JNQVRJT04pOworCWJ5dGVfY291bnQgPSAzIC8qIHBhZCAqLyAgKyBwYXJhbXMgKyBjb3VudDsKKwlwU01CLT5EYXRhQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNihwYXJhbXMpOworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gcFNNQi0+RGF0YUNvdW50OworCXBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQgPSBwU01CLT5QYXJhbWV0ZXJDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihwYXJhbV9vZmZzZXQpOworCXBTTUItPkRhdGFPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXQpOworCXBTTUItPkZpZCA9IGZpZDsKKwlpZiAodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfSU5GT0xFVkVMX1BBU1NUSFJVKQorCQlwU01CLT5JbmZvcm1hdGlvbkxldmVsID0gY3B1X3RvX2xlMTYoU01CX1NFVF9GSUxFX0JBU0lDX0lORk8yKTsKKwllbHNlCisJCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfU0VUX0ZJTEVfQkFTSUNfSU5GTyk7CisJcFNNQi0+UmVzZXJ2ZWQ0ID0gMDsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKwltZW1jcHkoZGF0YV9vZmZzZXQsZGF0YSxzaXplb2YoRklMRV9CQVNJQ19JTkZPKSk7CisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRllJKDEsKCJTZW5kIGVycm9yIGluIFNldCBUaW1lIChTZXRGaWxlSW5mbykgPSAlZCIscmMpKTsKKwl9CisKKwljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCisJLyogTm90ZTogT24gLUVBR0FJTiBlcnJvciBvbmx5IGNhbGxlciBjYW4gcmV0cnkgb24gaGFuZGxlIGJhc2VkIGNhbGxzIAorCQlzaW5jZSBmaWxlIGhhbmRsZSBwYXNzZWQgaW4gbm8gbG9uZ2VyIHZhbGlkICovCisKKwlyZXR1cm4gcmM7Cit9CisKKworaW50CitDSUZTU01CU2V0VGltZXMoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwgY29uc3QgY2hhciAqZmlsZU5hbWUsCisJCWNvbnN0IEZJTEVfQkFTSUNfSU5GTyAqIGRhdGEsIAorCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisJVFJBTlNBQ1RJT04yX1NQSV9SRVEgKnBTTUIgPSBOVUxMOworCVRSQU5TQUNUSU9OMl9TUElfUlNQICpwU01CciA9IE5VTEw7CisJaW50IG5hbWVfbGVuOworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwljaGFyICpkYXRhX29mZnNldDsKKwlfX3UxNiBwYXJhbXMsIHBhcmFtX29mZnNldCwgb2Zmc2V0LCBieXRlX2NvdW50LCBjb3VudDsKKworCWNGWUkoMSwgKCJJbiBTZXRUaW1lcyIpKTsKKworU2V0VGltZXNSZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChwU01CLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCW5hbWVfbGVuID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+RmlsZU5hbWUsIGZpbGVOYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJfSBlbHNlIHsJCS8qIEJCIGltcHJvdmUgdGhlIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgQkIgKi8KKwkJbmFtZV9sZW4gPSBzdHJubGVuKGZpbGVOYW1lLCBQQVRIX01BWCk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShwU01CLT5GaWxlTmFtZSwgZmlsZU5hbWUsIG5hbWVfbGVuKTsKKwl9CisKKwlwYXJhbXMgPSA2ICsgbmFtZV9sZW47CisJY291bnQgPSBzaXplb2YgKEZJTEVfQkFTSUNfSU5GTyk7CisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNigyKTsKKwlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUxNigxMDAwKTsJLyogQkIgZmluZCBleGFjdCBtYXggU01CIFBEVSBmcm9tIHNlc3Mgc3RydWN0dXJlIEJCICovCisJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQgPSAwOworCXBTTUItPkZsYWdzID0gMDsKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCXBhcmFtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9zcGlfcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uTGV2ZWwpIC0gNDsKKwlvZmZzZXQgPSBwYXJhbV9vZmZzZXQgKyBwYXJhbXM7CisJZGF0YV9vZmZzZXQgPSAoY2hhciAqKSAoJnBTTUItPmhkci5Qcm90b2NvbCkgKyBvZmZzZXQ7CisJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gY3B1X3RvX2xlMTYocGFyYW1fb2Zmc2V0KTsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmc2V0KTsKKwlwU01CLT5TZXR1cENvdW50ID0gMTsKKwlwU01CLT5SZXNlcnZlZDMgPSAwOworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihUUkFOUzJfU0VUX1BBVEhfSU5GT1JNQVRJT04pOworCWJ5dGVfY291bnQgPSAzIC8qIHBhZCAqLyAgKyBwYXJhbXMgKyBjb3VudDsKKworCXBTTUItPkRhdGFDb3VudCA9IGNwdV90b19sZTE2KGNvdW50KTsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJcFNNQi0+VG90YWxEYXRhQ291bnQgPSBwU01CLT5EYXRhQ291bnQ7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IHBTTUItPlBhcmFtZXRlckNvdW50OworCWlmICh0Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9JTkZPTEVWRUxfUEFTU1RIUlUpCisJCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfU0VUX0ZJTEVfQkFTSUNfSU5GTzIpOworCWVsc2UKKwkJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9IGNwdV90b19sZTE2KFNNQl9TRVRfRklMRV9CQVNJQ19JTkZPKTsKKwlwU01CLT5SZXNlcnZlZDQgPSAwOworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBieXRlX2NvdW50OworCW1lbWNweShkYXRhX29mZnNldCwgZGF0YSwgc2l6ZW9mIChGSUxFX0JBU0lDX0lORk8pKTsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZXRQYXRoSW5mbyAodGltZXMpIHJldHVybmVkICVkIiwgcmMpKTsKKwl9CisKKwljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gU2V0VGltZXNSZXRyeTsKKworCXJldHVybiByYzsKK30KKworLyogQ2FuIG5vdCBiZSB1c2VkIHRvIHNldCB0aW1lIHN0YW1wcyB5ZXQgKGR1ZSB0byBvbGQgRE9TIHRpbWUgZm9ybWF0KSAqLworLyogQ2FuIGJlIHVzZWQgdG8gc2V0IGF0dHJpYnV0ZXMgKi8KKyNpZiAwICAvKiBQb3NzaWJseSBub3QgbmVlZGVkIC0gc2luY2UgaXQgdHVybnMgb3V0IHRoYXQgc3RyYW5nZWx5IE5UNCBoYXMgYSBidWcKKwkgIGhhbmRsaW5nIGl0IGFueXdheSBhbmQgTlQ0IHdhcyB3aGF0IHdlIHRob3VnaHQgaXQgd291bGQgYmUgbmVlZGVkIGZvcgorCSAgRG8gbm90IGRlbGV0ZSBpdCB1bnRpbCB3ZSBwcm92ZSB3aGV0aGVyIG5lZWRlZCBmb3IgV2luOXggdGhvdWdoICovCitpbnQKK0NJRlNTTUJTZXRBdHRyTGVnYWN5KGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sIGNoYXIgKmZpbGVOYW1lLAorCQlfX3UxNiBkb3NfYXR0cnMsIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSkKK3sKKwlTRVRBVFRSX1JFUSAqcFNNQiA9IE5VTEw7CisJU0VUQVRUUl9SU1AgKnBTTUJyID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCWludCBieXRlc19yZXR1cm5lZDsKKwlpbnQgbmFtZV9sZW47CisKKwljRllJKDEsICgiSW4gU2V0QXR0ckxlZ2FjeSIpKTsKKworU2V0QXR0ckxnY3lSZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fU0VUQVRUUiwgOCwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChwU01CLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCW5hbWVfbGVuID0KKwkJCWNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+ZmlsZU5hbWUsIGZpbGVOYW1lLCAKKwkJCQlQQVRIX01BWCwgbmxzX2NvZGVwYWdlKTsKKwkJbmFtZV9sZW4rKzsgICAgIC8qIHRyYWlsaW5nIG51bGwgKi8KKwkJbmFtZV9sZW4gKj0gMjsKKwl9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiBCQiBpbXByb3ZlIHRoZSBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW5zIEJCICovCisJCW5hbWVfbGVuID0gc3RybmxlbihmaWxlTmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbisrOyAgICAgLyogdHJhaWxpbmcgbnVsbCAqLworCQlzdHJuY3B5KHBTTUItPmZpbGVOYW1lLCBmaWxlTmFtZSwgbmFtZV9sZW4pOworCX0KKwlwU01CLT5hdHRyID0gY3B1X3RvX2xlMTYoZG9zX2F0dHJzKTsKKwlwU01CLT5CdWZmZXJGb3JtYXQgPSAweDA0OworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBuYW1lX2xlbiArIDE7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYobmFtZV9sZW4gKyAxKTsKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJFcnJvciBpbiBMZWdhY3lTZXRBdHRyID0gJWQiLCByYykpOworCX0KKworCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisKKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJZ290byBTZXRBdHRyTGdjeVJldHJ5OworCisJcmV0dXJuIHJjOworfQorI2VuZGlmIC8qIHRlbXBvcmFyaWx5IHVubmVlZGVkIFNldEF0dHIgbGVnYWN5IGZ1bmN0aW9uICovCisKK2ludAorQ0lGU1NNQlVuaXhTZXRQZXJtcyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkgICAgY2hhciAqZmlsZU5hbWUsIF9fdTY0IG1vZGUsIF9fdTY0IHVpZCwgX191NjQgZ2lkLAorCQkgICAgZGV2X3QgZGV2aWNlLCBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisJVFJBTlNBQ1RJT04yX1NQSV9SRVEgKnBTTUIgPSBOVUxMOworCVRSQU5TQUNUSU9OMl9TUElfUlNQICpwU01CciA9IE5VTEw7CisJaW50IG5hbWVfbGVuOworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwlGSUxFX1VOSVhfQkFTSUNfSU5GTyAqZGF0YV9vZmZzZXQ7CisJX191MTYgcGFyYW1zLCBwYXJhbV9vZmZzZXQsIG9mZnNldCwgY291bnQsIGJ5dGVfY291bnQ7CisKKwljRllJKDEsICgiSW4gU2V0VUlEL0dJRC9Nb2RlIikpOworc2V0UGVybXNSZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChwU01CLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCW5hbWVfbGVuID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+RmlsZU5hbWUsIGZpbGVOYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJfSBlbHNlIHsJCS8qIEJCIGltcHJvdmUgdGhlIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgQkIgKi8KKwkJbmFtZV9sZW4gPSBzdHJubGVuKGZpbGVOYW1lLCBQQVRIX01BWCk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShwU01CLT5GaWxlTmFtZSwgZmlsZU5hbWUsIG5hbWVfbGVuKTsKKwl9CisKKwlwYXJhbXMgPSA2ICsgbmFtZV9sZW47CisJY291bnQgPSBzaXplb2YgKEZJTEVfVU5JWF9CQVNJQ19JTkZPKTsKKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KDIpOworCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTE2KDEwMDApOwkvKiBCQiBmaW5kIGV4YWN0IG1heCBTTUIgUERVIGZyb20gc2VzcyBzdHJ1Y3R1cmUgQkIgKi8KKwlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKKwlwU01CLT5SZXNlcnZlZCA9IDA7CisJcFNNQi0+RmxhZ3MgPSAwOworCXBTTUItPlRpbWVvdXQgPSAwOworCXBTTUItPlJlc2VydmVkMiA9IDA7CisJcGFyYW1fb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NwaV9yZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25MZXZlbCkgLSA0OworCW9mZnNldCA9IHBhcmFtX29mZnNldCArIHBhcmFtczsKKwlkYXRhX29mZnNldCA9CisJICAgIChGSUxFX1VOSVhfQkFTSUNfSU5GTyAqKSAoKGNoYXIgKikgJnBTTUItPmhkci5Qcm90b2NvbCArCisJCQkJICAgICAgb2Zmc2V0KTsKKwltZW1zZXQoZGF0YV9vZmZzZXQsIDAsIGNvdW50KTsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmc2V0KTsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihwYXJhbV9vZmZzZXQpOworCXBTTUItPlNldHVwQ291bnQgPSAxOworCXBTTUItPlJlc2VydmVkMyA9IDA7CisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KFRSQU5TMl9TRVRfUEFUSF9JTkZPUk1BVElPTik7CisJYnl0ZV9jb3VudCA9IDMgLyogcGFkICovICArIHBhcmFtcyArIGNvdW50OworCXBTTUItPlBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5EYXRhQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IHBTTUItPlBhcmFtZXRlckNvdW50OworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gcFNNQi0+RGF0YUNvdW50OworCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfU0VUX0ZJTEVfVU5JWF9CQVNJQyk7CisJcFNNQi0+UmVzZXJ2ZWQ0ID0gMDsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlkYXRhX29mZnNldC0+VWlkID0gY3B1X3RvX2xlNjQodWlkKTsKKwlkYXRhX29mZnNldC0+R2lkID0gY3B1X3RvX2xlNjQoZ2lkKTsKKwkvKiBiZXR0ZXIgdG8gbGVhdmUgZGV2aWNlIGFzIHplcm8gd2hlbiBpdCBpcyAgKi8KKwlkYXRhX29mZnNldC0+RGV2TWFqb3IgPSBjcHVfdG9fbGU2NChNQUpPUihkZXZpY2UpKTsKKwlkYXRhX29mZnNldC0+RGV2TWlub3IgPSBjcHVfdG9fbGU2NChNSU5PUihkZXZpY2UpKTsKKwlkYXRhX29mZnNldC0+UGVybWlzc2lvbnMgPSBjcHVfdG9fbGU2NChtb2RlKTsKKyAgICAKKwlpZihTX0lTUkVHKG1vZGUpKQorCQlkYXRhX29mZnNldC0+VHlwZSA9IGNwdV90b19sZTMyKFVOSVhfRklMRSk7CisJZWxzZSBpZihTX0lTRElSKG1vZGUpKQorCQlkYXRhX29mZnNldC0+VHlwZSA9IGNwdV90b19sZTMyKFVOSVhfRElSKTsKKwllbHNlIGlmKFNfSVNMTksobW9kZSkpCisJCWRhdGFfb2Zmc2V0LT5UeXBlID0gY3B1X3RvX2xlMzIoVU5JWF9TWU1MSU5LKTsKKwllbHNlIGlmKFNfSVNDSFIobW9kZSkpCisJCWRhdGFfb2Zmc2V0LT5UeXBlID0gY3B1X3RvX2xlMzIoVU5JWF9DSEFSREVWKTsKKwllbHNlIGlmKFNfSVNCTEsobW9kZSkpCisJCWRhdGFfb2Zmc2V0LT5UeXBlID0gY3B1X3RvX2xlMzIoVU5JWF9CTE9DS0RFVik7CisJZWxzZSBpZihTX0lTRklGTyhtb2RlKSkKKwkJZGF0YV9vZmZzZXQtPlR5cGUgPSBjcHVfdG9fbGUzMihVTklYX0ZJRk8pOworCWVsc2UgaWYoU19JU1NPQ0sobW9kZSkpCisJCWRhdGFfb2Zmc2V0LT5UeXBlID0gY3B1X3RvX2xlMzIoVU5JWF9TT0NLRVQpOworCisKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZXRQYXRoSW5mbyAocGVybXMpIHJldHVybmVkICVkIiwgcmMpKTsKKwl9CisKKwlpZiAocFNNQikKKwkJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJZ290byBzZXRQZXJtc1JldHJ5OworCXJldHVybiByYzsKK30KKworaW50IENJRlNTTUJOb3RpZnkoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwgCisJCQljb25zdCBpbnQgbm90aWZ5X3N1YmRpcnMsIGNvbnN0IF9fdTE2IG5ldGZpZCwKKwkJCV9fdTMyIGZpbHRlciwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCWludCByYyA9IDA7CisJc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb25fY2hhbmdlX25vdGlmeV9yZXEgKiBwU01CID0gTlVMTDsKKwlzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9jaGFuZ2Vfbm90aWZ5X3JzcCAqIHBTTUJyID0gTlVMTDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQ7CisKKwljRllJKDEsICgiSW4gQ0lGU1NNQk5vdGlmeSBmb3IgZmlsZSBoYW5kbGUgJWQiLChpbnQpbmV0ZmlkKSk7CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX05UX1RSQU5TQUNULCAyMywgdGNvbiwgKHZvaWQgKiopICZwU01CLAorICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSAmcFNNQnIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IDAgOworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsKKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTMyKDIpOworCS8qIEJCIGZpbmQgZXhhY3QgZGF0YSBjb3VudCBtYXggZnJvbSBzZXNzIHN0cnVjdHVyZSBCQiAqLworCXBTTUItPk1heERhdGFDb3VudCA9IDA7IC8qIHNhbWUgaW4gbGl0dGxlIGVuZGlhbiBvciBiZSAqLworCXBTTUItPk1heFNldHVwQ291bnQgPSA0OworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSAwOworCXBTTUItPkRhdGFDb3VudCA9IDA7CisJcFNNQi0+RGF0YU9mZnNldCA9IDA7CisJcFNNQi0+U2V0dXBDb3VudCA9IDQ7IC8qIHNpbmdsZSBieXRlIGRvZXMgbm90IG5lZWQgbGUgY29udmVyc2lvbiAqLworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihOVF9UUkFOU0FDVF9OT1RJRllfQ0hBTkdFKTsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IHBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQ7CisJaWYobm90aWZ5X3N1YmRpcnMpCisJCXBTTUItPldhdGNoVHJlZSA9IDE7IC8qIG9uZSBieXRlIC0gbm8gbGUgY29udmVyc2lvbiBuZWVkZWQgKi8KKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCXBTTUItPkNvbXBsZXRpb25GaWx0ZXIgPSBjcHVfdG9fbGUzMihmaWx0ZXIpOworCXBTTUItPkZpZCA9IG5ldGZpZDsgLyogZmlsZSBoYW5kbGUgYWx3YXlzIGxlICovCisJcFNNQi0+Qnl0ZUNvdW50ID0gMDsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIC0xKTsKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoIkVycm9yIGluIE5vdGlmeSA9ICVkIiwgcmMpKTsKKwl9CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKwlyZXR1cm4gcmM7CQorfQorI2lmZGVmIENPTkZJR19DSUZTX1hBVFRSCitzc2l6ZV90CitDSUZTU01CUUFsbEVBcyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkgY29uc3QgdW5zaWduZWQgY2hhciAqc2VhcmNoTmFtZSwKKwkJIGNoYXIgKiBFQURhdGEsIHNpemVfdCBidWZfc2l6ZSwKKwkJIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSkKK3sKKwkJLyogQkIgYXNzdW1lcyBvbmUgc2V0dXAgd29yZCAqLworCVRSQU5TQUNUSU9OMl9RUElfUkVRICpwU01CID0gTlVMTDsKKwlUUkFOU0FDVElPTjJfUVBJX1JTUCAqcFNNQnIgPSBOVUxMOworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkOworCWludCBuYW1lX2xlbjsKKwlzdHJ1Y3QgZmVhICogdGVtcF9mZWE7CisJY2hhciAqIHRlbXBfcHRyOworCV9fdTE2IHBhcmFtcywgYnl0ZV9jb3VudDsKKworCWNGWUkoMSwgKCJJbiBRdWVyeSBBbGwgRUFzIHBhdGggJXMiLCBzZWFyY2hOYW1lKSk7CitRQWxsRUFzUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbiA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIHBTTUItPkZpbGVOYW1lLCBzZWFyY2hOYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJfSBlbHNlIHsJLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQluYW1lX2xlbiA9IHN0cm5sZW4oc2VhcmNoTmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCXN0cm5jcHkocFNNQi0+RmlsZU5hbWUsIHNlYXJjaE5hbWUsIG5hbWVfbGVuKTsKKwl9CisKKwlwYXJhbXMgPSAyIC8qIGxldmVsICovICsgNCAvKiByZXNlcnZlZCAqLyArIG5hbWVfbGVuIC8qIGluY2x1ZGVzIE5VTCAqLyA7CisJcFNNQi0+VG90YWxEYXRhQ291bnQgPSAwOworCXBTTUItPk1heFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYoMik7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoNDAwMCk7CS8qIEJCIGZpbmQgZXhhY3QgbWF4IFNNQiBQRFUgZnJvbSBzZXNzIHN0cnVjdHVyZSBCQiAqLworCXBTTUItPk1heFNldHVwQ291bnQgPSAwOworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5GbGFncyA9IDA7CisJcFNNQi0+VGltZW91dCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQyID0gMDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXRvZigKKyAgICAgICAgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3FwaV9yZXEgLEluZm9ybWF0aW9uTGV2ZWwpIC0gNCk7CisJcFNNQi0+RGF0YUNvdW50ID0gMDsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gMDsKKwlwU01CLT5TZXR1cENvdW50ID0gMTsKKwlwU01CLT5SZXNlcnZlZDMgPSAwOworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihUUkFOUzJfUVVFUllfUEFUSF9JTkZPUk1BVElPTik7CisJYnl0ZV9jb3VudCA9IHBhcmFtcyArIDEgLyogcGFkICovIDsKKwlwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IHBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQ7CisJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9IGNwdV90b19sZTE2KFNNQl9JTkZPX1FVRVJZX0FMTF9FQVMpOworCXBTTUItPlJlc2VydmVkNCA9IDA7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVfY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoYnl0ZV9jb3VudCk7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZW5kIGVycm9yIGluIFF1ZXJ5QWxsRUFzID0gJWQiLCByYykpOworCX0gZWxzZSB7CQkvKiBkZWNvZGUgcmVzcG9uc2UgKi8KKwkJcmMgPSB2YWxpZGF0ZV90Migoc3RydWN0IHNtYl90Ml9yc3AgKilwU01Ccik7CisKKwkJLyogQkIgYWxzbyBjaGVjayBlbm91Z2ggdG90YWwgYnl0ZXMgcmV0dXJuZWQgKi8KKwkJLyogQkIgd2UgbmVlZCB0byBpbXByb3ZlIHRoZSB2YWxpZGl0eSBjaGVja2luZworCQlvZiB0aGVzZSB0cmFuczIgcmVzcG9uc2VzICovCisJCWlmIChyYyB8fCAocFNNQnItPkJ5dGVDb3VudCA8IDQpKSAKKwkJCXJjID0gLUVJTzsJLyogYmFkIHNtYiAqLworCSAgIC8qIGVsc2UgaWYgKHBGaW5kRGF0YSl7CisJCQltZW1jcHkoKGNoYXIgKikgcEZpbmREYXRhLAorCQkJICAgICAgIChjaGFyICopICZwU01Cci0+aGRyLlByb3RvY29sICsKKwkJCSAgICAgICBkYXRhX29mZnNldCwga2wpOworCQl9Ki8gZWxzZSB7CisJCQkvKiBjaGVjayB0aGF0IGxlbmd0aCBvZiBsaXN0IGlzIG5vdCBtb3JlIHRoYW4gYmNjICovCisJCQkvKiBjaGVjayB0aGF0IGVhY2ggZW50cnkgZG9lcyBub3QgZ28gYmV5b25kIGxlbmd0aAorCQkJICAgb2YgbGlzdCAqLworCQkJLyogY2hlY2sgdGhhdCBlYWNoIGVsZW1lbnQgb2YgZWFjaCBlbnRyeSBkb2VzIG5vdAorCQkJICAgZ28gYmV5b25kIGVuZCBvZiBsaXN0ICovCisJCQlfX3UxNiBkYXRhX29mZnNldCA9IGxlMTZfdG9fY3B1KHBTTUJyLT50Mi5EYXRhT2Zmc2V0KTsKKwkJCXN0cnVjdCBmZWFsaXN0ICogZWFfcmVzcG9uc2VfZGF0YTsKKwkJCXJjID0gMDsKKwkJCS8qIHZhbGlkYXRlX3RyYW5zMl9vZmZzZXRzKCkgKi8KKwkJCS8qIEJCIHRvIGNoZWNrIGlmKHN0YXJ0IG9mIHNtYiArIGRhdGFfb2Zmc2V0ID4gJmJjYysgYmNjKSovCisJCQllYV9yZXNwb25zZV9kYXRhID0gKHN0cnVjdCBmZWFsaXN0ICopCisJCQkJKCgoY2hhciAqKSAmcFNNQnItPmhkci5Qcm90b2NvbCkgKworCQkJCWRhdGFfb2Zmc2V0KTsKKwkJCW5hbWVfbGVuID0gbGUzMl90b19jcHUoZWFfcmVzcG9uc2VfZGF0YS0+bGlzdF9sZW4pOworCQkJY0ZZSSgxLCgiZWEgbGVuZ3RoICVkIiwgbmFtZV9sZW4pKTsKKwkJCWlmKG5hbWVfbGVuIDw9IDgpIHsKKwkJCS8qIHJldHVybmVkIEVBIHNpemUgemVyb2VkIGF0IHRvcCBvZiBmdW5jdGlvbiAqLworCQkJCWNGWUkoMSwoImVtcHR5IEVBIGxpc3QgcmV0dXJuZWQgZnJvbSBzZXJ2ZXIiKSk7CisJCQl9IGVsc2UgeworCQkJCS8qIGFjY291bnQgZm9yIGVhIGxpc3QgbGVuICovCisJCQkJbmFtZV9sZW4gLT0gNDsKKwkJCQl0ZW1wX2ZlYSA9IGVhX3Jlc3BvbnNlX2RhdGEtPmxpc3Q7CisJCQkJdGVtcF9wdHIgPSAoY2hhciAqKXRlbXBfZmVhOworCQkJCXdoaWxlKG5hbWVfbGVuID4gMCkgeworCQkJCQlfX3UxNiB2YWx1ZV9sZW47CisJCQkJCW5hbWVfbGVuIC09IDQ7CisJCQkJCXRlbXBfcHRyICs9IDQ7CisJCQkJCXJjICs9IHRlbXBfZmVhLT5uYW1lX2xlbjsKKwkJCQkvKiBhY2NvdW50IGZvciBwcmVmaXggdXNlci4gYW5kIHRyYWlsaW5nIG51bGwgKi8KKwkJCQkJcmMgPSByYyArIDUgKyAxOyAKKwkJCQkJaWYocmM8KGludClidWZfc2l6ZSkgeworCQkJCQkJbWVtY3B5KEVBRGF0YSwidXNlci4iLDUpOworCQkJCQkJRUFEYXRhKz01OworCQkJCQkJbWVtY3B5KEVBRGF0YSx0ZW1wX3B0cix0ZW1wX2ZlYS0+bmFtZV9sZW4pOworCQkJCQkJRUFEYXRhKz10ZW1wX2ZlYS0+bmFtZV9sZW47CisJCQkJCQkvKiBudWxsIHRlcm1pbmF0ZSBuYW1lICovCisJCQkJCQkqRUFEYXRhID0gMDsKKwkJCQkJCUVBRGF0YSA9IEVBRGF0YSArIDE7CisJCQkJCX0gZWxzZSBpZihidWZfc2l6ZSA9PSAwKSB7CisJCQkJCQkvKiBza2lwIGNvcHkgLSBjYWxjIHNpemUgb25seSAqLworCQkJCQl9IGVsc2UgeworCQkJCQkJLyogc3RvcCBiZWZvcmUgb3ZlcnJ1biBidWZmZXIgKi8KKwkJCQkJCXJjID0gLUVSQU5HRTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCW5hbWVfbGVuIC09IHRlbXBfZmVhLT5uYW1lX2xlbjsKKwkJCQkJdGVtcF9wdHIgKz0gdGVtcF9mZWEtPm5hbWVfbGVuOworCQkJCQkvKiBhY2NvdW50IGZvciB0cmFpbGluZyBudWxsICovCisJCQkJCW5hbWVfbGVuLS07CisJCQkJCXRlbXBfcHRyKys7CisJCQkJCXZhbHVlX2xlbiA9IGxlMTZfdG9fY3B1KHRlbXBfZmVhLT52YWx1ZV9sZW4pOworCQkJCQluYW1lX2xlbiAtPSB2YWx1ZV9sZW47CisJCQkJCXRlbXBfcHRyICs9IHZhbHVlX2xlbjsKKwkJCQkJLyogQkIgY2hlY2sgdGhhdCB0ZW1wX3B0ciBpcyBzdGlsbCB3aXRoaW4gc21iIEJCKi8KKwkJCQkvKiBubyB0cmFpbGluZyBudWxsIHRvIGFjY291bnQgZm9yIGluIHZhbHVlIGxlbiAqLworCQkJCQkvKiBnbyBvbiB0byBuZXh0IEVBICovCisJCQkJCXRlbXBfZmVhID0gKHN0cnVjdCBmZWEgKil0ZW1wX3B0cjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKHBTTUIpCisJCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gUUFsbEVBc1JldHJ5OworCisJcmV0dXJuIChzc2l6ZV90KXJjOworfQorCitzc2l6ZV90IENJRlNTTUJRdWVyeUVBKGNvbnN0IGludCB4aWQsc3RydWN0IGNpZnNUY29uSW5mbyAqIHRjb24sCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzZWFyY2hOYW1lLGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBlYV9uYW1lLAorCQl1bnNpZ25lZCBjaGFyICogZWFfdmFsdWUsIHNpemVfdCBidWZfc2l6ZSwgCisJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSkKK3sKKwlUUkFOU0FDVElPTjJfUVBJX1JFUSAqcFNNQiA9IE5VTEw7CisJVFJBTlNBQ1RJT04yX1FQSV9SU1AgKnBTTUJyID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCWludCBieXRlc19yZXR1cm5lZDsKKwlpbnQgbmFtZV9sZW47CisJc3RydWN0IGZlYSAqIHRlbXBfZmVhOworCWNoYXIgKiB0ZW1wX3B0cjsKKwlfX3UxNiBwYXJhbXMsIGJ5dGVfY291bnQ7CisKKwljRllJKDEsICgiSW4gUXVlcnkgRUEgcGF0aCAlcyIsIHNlYXJjaE5hbWUpKTsKK1FFQVJldHJ5OgorCXJjID0gc21iX2luaXQoU01CX0NPTV9UUkFOU0FDVElPTjIsIDE1LCB0Y29uLCAodm9pZCAqKikgJnBTTUIsCisJCSAgICAgICh2b2lkICoqKSAmcFNNQnIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKHBTTUItPmhkci5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJbmFtZV9sZW4gPQorCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBwU01CLT5GaWxlTmFtZSwgc2VhcmNoTmFtZSwgUEFUSF9NQVgKKwkJCQkgIC8qIGZpbmQgZGVmaW5lIGZvciB0aGlzIG1heHBhdGhjb21wb25lbnQgKi8KKwkJCQkgICwgbmxzX2NvZGVwYWdlKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQluYW1lX2xlbiAqPSAyOworCX0gZWxzZSB7CS8qIEJCIGltcHJvdmUgdGhlIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgQkIgKi8KKwkJbmFtZV9sZW4gPSBzdHJubGVuKHNlYXJjaE5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQlzdHJuY3B5KHBTTUItPkZpbGVOYW1lLCBzZWFyY2hOYW1lLCBuYW1lX2xlbik7CisJfQorCisJcGFyYW1zID0gMiAvKiBsZXZlbCAqLyArIDQgLyogcmVzZXJ2ZWQgKi8gKyBuYW1lX2xlbiAvKiBpbmNsdWRlcyBOVUwgKi8gOworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsKKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KDIpOworCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTE2KDQwMDApOwkvKiBCQiBmaW5kIGV4YWN0IG1heCBTTUIgUERVIGZyb20gc2VzcyBzdHJ1Y3R1cmUgQkIgKi8KKwlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKKwlwU01CLT5SZXNlcnZlZCA9IDA7CisJcFNNQi0+RmxhZ3MgPSAwOworCXBTTUItPlRpbWVvdXQgPSAwOworCXBTTUItPlJlc2VydmVkMiA9IDA7CisJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmc2V0b2YoCisgICAgICAgIHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9xcGlfcmVxICxJbmZvcm1hdGlvbkxldmVsKSAtIDQpOworCXBTTUItPkRhdGFDb3VudCA9IDA7CisJcFNNQi0+RGF0YU9mZnNldCA9IDA7CisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CisJcFNNQi0+UmVzZXJ2ZWQzID0gMDsKKwlwU01CLT5TdWJDb21tYW5kID0gY3B1X3RvX2xlMTYoVFJBTlMyX1FVRVJZX1BBVEhfSU5GT1JNQVRJT04pOworCWJ5dGVfY291bnQgPSBwYXJhbXMgKyAxIC8qIHBhZCAqLyA7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50OworCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfSU5GT19RVUVSWV9BTExfRUFTKTsKKwlwU01CLT5SZXNlcnZlZDQgPSAwOworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBieXRlX2NvdW50OworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGJ5dGVfY291bnQpOworCisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRllJKDEsICgiU2VuZCBlcnJvciBpbiBRdWVyeSBFQSA9ICVkIiwgcmMpKTsKKwl9IGVsc2UgewkJLyogZGVjb2RlIHJlc3BvbnNlICovCisJCXJjID0gdmFsaWRhdGVfdDIoKHN0cnVjdCBzbWJfdDJfcnNwICopcFNNQnIpOworCisJCS8qIEJCIGFsc28gY2hlY2sgZW5vdWdoIHRvdGFsIGJ5dGVzIHJldHVybmVkICovCisJCS8qIEJCIHdlIG5lZWQgdG8gaW1wcm92ZSB0aGUgdmFsaWRpdHkgY2hlY2tpbmcKKwkJb2YgdGhlc2UgdHJhbnMyIHJlc3BvbnNlcyAqLworCQlpZiAocmMgfHwgKHBTTUJyLT5CeXRlQ291bnQgPCA0KSkgCisJCQlyYyA9IC1FSU87CS8qIGJhZCBzbWIgKi8KKwkgICAvKiBlbHNlIGlmIChwRmluZERhdGEpeworCQkJbWVtY3B5KChjaGFyICopIHBGaW5kRGF0YSwKKwkJCSAgICAgICAoY2hhciAqKSAmcFNNQnItPmhkci5Qcm90b2NvbCArCisJCQkgICAgICAgZGF0YV9vZmZzZXQsIGtsKTsKKwkJfSovIGVsc2UgeworCQkJLyogY2hlY2sgdGhhdCBsZW5ndGggb2YgbGlzdCBpcyBub3QgbW9yZSB0aGFuIGJjYyAqLworCQkJLyogY2hlY2sgdGhhdCBlYWNoIGVudHJ5IGRvZXMgbm90IGdvIGJleW9uZCBsZW5ndGgKKwkJCSAgIG9mIGxpc3QgKi8KKwkJCS8qIGNoZWNrIHRoYXQgZWFjaCBlbGVtZW50IG9mIGVhY2ggZW50cnkgZG9lcyBub3QKKwkJCSAgIGdvIGJleW9uZCBlbmQgb2YgbGlzdCAqLworCQkJX191MTYgZGF0YV9vZmZzZXQgPSBsZTE2X3RvX2NwdShwU01Cci0+dDIuRGF0YU9mZnNldCk7CisJCQlzdHJ1Y3QgZmVhbGlzdCAqIGVhX3Jlc3BvbnNlX2RhdGE7CisJCQlyYyA9IC1FTk9EQVRBOworCQkJLyogdmFsaWRhdGVfdHJhbnMyX29mZnNldHMoKSAqLworCQkJLyogQkIgdG8gY2hlY2sgaWYoc3RhcnQgb2Ygc21iICsgZGF0YV9vZmZzZXQgPiAmYmNjKyBiY2MpKi8KKwkJCWVhX3Jlc3BvbnNlX2RhdGEgPSAoc3RydWN0IGZlYWxpc3QgKikKKwkJCQkoKChjaGFyICopICZwU01Cci0+aGRyLlByb3RvY29sKSArCisJCQkJZGF0YV9vZmZzZXQpOworCQkJbmFtZV9sZW4gPSBsZTMyX3RvX2NwdShlYV9yZXNwb25zZV9kYXRhLT5saXN0X2xlbik7CisJCQljRllJKDEsKCJlYSBsZW5ndGggJWQiLCBuYW1lX2xlbikpOworCQkJaWYobmFtZV9sZW4gPD0gOCkgeworCQkJLyogcmV0dXJuZWQgRUEgc2l6ZSB6ZXJvZWQgYXQgdG9wIG9mIGZ1bmN0aW9uICovCisJCQkJY0ZZSSgxLCgiZW1wdHkgRUEgbGlzdCByZXR1cm5lZCBmcm9tIHNlcnZlciIpKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogYWNjb3VudCBmb3IgZWEgbGlzdCBsZW4gKi8KKwkJCQluYW1lX2xlbiAtPSA0OworCQkJCXRlbXBfZmVhID0gZWFfcmVzcG9uc2VfZGF0YS0+bGlzdDsKKwkJCQl0ZW1wX3B0ciA9IChjaGFyICopdGVtcF9mZWE7CisJCQkJLyogbG9vcCB0aHJvdWdoIGNoZWNraW5nIGlmIHdlIGhhdmUgYSBtYXRjaGluZworCQkJCW5hbWUgYW5kIHRoZW4gcmV0dXJuIHRoZSBhc3NvY2lhdGVkIHZhbHVlICovCisJCQkJd2hpbGUobmFtZV9sZW4gPiAwKSB7CisJCQkJCV9fdTE2IHZhbHVlX2xlbjsKKwkJCQkJbmFtZV9sZW4gLT0gNDsKKwkJCQkJdGVtcF9wdHIgKz0gNDsKKwkJCQkJdmFsdWVfbGVuID0gbGUxNl90b19jcHUodGVtcF9mZWEtPnZhbHVlX2xlbik7CisJCQkJLyogQkIgdmFsaWRhdGUgdGhhdCB2YWx1ZV9sZW4gZmFsbHMgd2l0aGluIFNNQiwgCisJCQkJZXZlbiB0aG91Z2ggbWF4aW11bSBmb3IgbmFtZV9sZW4gaXMgMjU1ICovIAorCQkJCQlpZihtZW1jbXAodGVtcF9mZWEtPm5hbWUsZWFfbmFtZSwKKwkJCQkJCSAgdGVtcF9mZWEtPm5hbWVfbGVuKSA9PSAwKSB7CisJCQkJCQkvKiBmb3VuZCBhIG1hdGNoICovCisJCQkJCQlyYyA9IHZhbHVlX2xlbjsKKwkJCQkvKiBhY2NvdW50IGZvciBwcmVmaXggdXNlci4gYW5kIHRyYWlsaW5nIG51bGwgKi8KKwkJCQkJCWlmKHJjPD0oaW50KWJ1Zl9zaXplKSB7CisJCQkJCQkJbWVtY3B5KGVhX3ZhbHVlLAorCQkJCQkJCQl0ZW1wX2ZlYS0+bmFtZSt0ZW1wX2ZlYS0+bmFtZV9sZW4rMSwKKwkJCQkJCQkJcmMpOworCQkJCQkJCS8qIGVhIHZhbHVlcywgdW5saWtlIGVhIG5hbWVzLAorCQkJCQkJCWFyZSBub3QgbnVsbCB0ZXJtaW5hdGVkICovCisJCQkJCQl9IGVsc2UgaWYoYnVmX3NpemUgPT0gMCkgeworCQkJCQkJLyogc2tpcCBjb3B5IC0gY2FsYyBzaXplIG9ubHkgKi8KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLyogc3RvcCBiZWZvcmUgb3ZlcnJ1biBidWZmZXIgKi8KKwkJCQkJCQlyYyA9IC1FUkFOR0U7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQluYW1lX2xlbiAtPSB0ZW1wX2ZlYS0+bmFtZV9sZW47CisJCQkJCXRlbXBfcHRyICs9IHRlbXBfZmVhLT5uYW1lX2xlbjsKKwkJCQkJLyogYWNjb3VudCBmb3IgdHJhaWxpbmcgbnVsbCAqLworCQkJCQluYW1lX2xlbi0tOworCQkJCQl0ZW1wX3B0cisrOworCQkJCQluYW1lX2xlbiAtPSB2YWx1ZV9sZW47CisJCQkJCXRlbXBfcHRyICs9IHZhbHVlX2xlbjsKKwkJCQkvKiBubyB0cmFpbGluZyBudWxsIHRvIGFjY291bnQgZm9yIGluIHZhbHVlIGxlbiAqLworCQkJCQkvKiBnbyBvbiB0byBuZXh0IEVBICovCisJCQkJCXRlbXBfZmVhID0gKHN0cnVjdCBmZWEgKil0ZW1wX3B0cjsKKwkJCQl9CisJCQl9IAorCQl9CisJfQorCWlmIChwU01CKQorCQljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIFFFQVJldHJ5OworCisJcmV0dXJuIChzc2l6ZV90KXJjOworfQorCitpbnQKK0NJRlNTTUJTZXRFQShjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLCBjb25zdCBjaGFyICpmaWxlTmFtZSwKKwkJY29uc3QgY2hhciAqIGVhX25hbWUsIGNvbnN0IHZvaWQgKiBlYV92YWx1ZSwgCisJCWNvbnN0IF9fdTE2IGVhX3ZhbHVlX2xlbiwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCXN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9zcGlfcmVxICpwU01CID0gTlVMTDsKKwlzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc3BpX3JzcCAqcFNNQnIgPSBOVUxMOworCXN0cnVjdCBmZWFsaXN0ICpwYXJtX2RhdGE7CisJaW50IG5hbWVfbGVuOworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwlfX3UxNiBwYXJhbXMsIHBhcmFtX29mZnNldCwgYnl0ZV9jb3VudCwgb2Zmc2V0LCBjb3VudDsKKworCWNGWUkoMSwgKCJJbiBTZXRFQSIpKTsKK1NldEVBUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbiA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIHBTTUItPkZpbGVOYW1lLCBmaWxlTmFtZSwgUEFUSF9NQVgKKwkJCQkgIC8qIGZpbmQgZGVmaW5lIGZvciB0aGlzIG1heHBhdGhjb21wb25lbnQgKi8KKwkJCQkgICwgbmxzX2NvZGVwYWdlKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQluYW1lX2xlbiAqPSAyOworCX0gZWxzZSB7CQkvKiBCQiBpbXByb3ZlIHRoZSBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW5zIEJCICovCisJCW5hbWVfbGVuID0gc3RybmxlbihmaWxlTmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCXN0cm5jcHkocFNNQi0+RmlsZU5hbWUsIGZpbGVOYW1lLCBuYW1lX2xlbik7CisJfQorCisJcGFyYW1zID0gNiArIG5hbWVfbGVuOworCisJLyogZG9uZSBjYWxjdWxhdGluZyBwYXJtcyB1c2luZyBuYW1lX2xlbiBvZiBmaWxlIG5hbWUsCisJbm93IHVzZSBuYW1lX2xlbiB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mIGVhIG5hbWUKKwl3ZSBhcmUgZ29pbmcgdG8gY3JlYXRlIGluIHRoZSBpbm9kZSB4YXR0cnMgKi8KKwlpZihlYV9uYW1lID09IE5VTEwpCisJCW5hbWVfbGVuID0gMDsKKwllbHNlCisJCW5hbWVfbGVuID0gc3RybmxlbihlYV9uYW1lLDI1NSk7CisKKwljb3VudCA9IHNpemVvZigqcGFybV9kYXRhKSArIGVhX3ZhbHVlX2xlbiArIG5hbWVfbGVuICsgMTsKKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KDIpOworCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTE2KDEwMDApOwkvKiBCQiBmaW5kIG1heCBTTUIgc2l6ZSBmcm9tIHNlc3MgKi8KKwlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKKwlwU01CLT5SZXNlcnZlZCA9IDA7CisJcFNNQi0+RmxhZ3MgPSAwOworCXBTTUItPlRpbWVvdXQgPSAwOworCXBTTUItPlJlc2VydmVkMiA9IDA7CisJcGFyYW1fb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NwaV9yZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25MZXZlbCkgLSA0OworCW9mZnNldCA9IHBhcmFtX29mZnNldCArIHBhcmFtczsKKwlwU01CLT5JbmZvcm1hdGlvbkxldmVsID0KKwkJY3B1X3RvX2xlMTYoU01CX1NFVF9GSUxFX0VBKTsKKworCXBhcm1fZGF0YSA9CisJCShzdHJ1Y3QgZmVhbGlzdCAqKSAoKChjaGFyICopICZwU01CLT5oZHIuUHJvdG9jb2wpICsKKwkJCQkgICAgICAgb2Zmc2V0KTsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihwYXJhbV9vZmZzZXQpOworCXBTTUItPkRhdGFPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXQpOworCXBTTUItPlNldHVwQ291bnQgPSAxOworCXBTTUItPlJlc2VydmVkMyA9IDA7CisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KFRSQU5TMl9TRVRfUEFUSF9JTkZPUk1BVElPTik7CisJYnl0ZV9jb3VudCA9IDMgLyogcGFkICovICArIHBhcmFtcyArIGNvdW50OworCXBTTUItPkRhdGFDb3VudCA9IGNwdV90b19sZTE2KGNvdW50KTsKKwlwYXJtX2RhdGEtPmxpc3RfbGVuID0gY3B1X3RvX2xlMzIoY291bnQpOworCXBhcm1fZGF0YS0+bGlzdFswXS5FQV9mbGFncyA9IDA7CisJLyogd2UgY2hlY2tlZCBhYm92ZSB0aGF0IG5hbWUgbGVuIGlzIGxlc3MgdGhhbiAyNTUgKi8KKwlwYXJtX2RhdGEtPmxpc3RbMF0ubmFtZV9sZW4gPSAoX191OCluYW1lX2xlbjs7CisJLyogRUEgbmFtZXMgYXJlIGFsd2F5cyBBU0NJSSAqLworCWlmKGVhX25hbWUpCisJCXN0cm5jcHkocGFybV9kYXRhLT5saXN0WzBdLm5hbWUsZWFfbmFtZSxuYW1lX2xlbik7CisJcGFybV9kYXRhLT5saXN0WzBdLm5hbWVbbmFtZV9sZW5dID0gMDsKKwlwYXJtX2RhdGEtPmxpc3RbMF0udmFsdWVfbGVuID0gY3B1X3RvX2xlMTYoZWFfdmFsdWVfbGVuKTsKKwkvKiBjYWxsZXIgZW5zdXJlcyB0aGF0IGVhX3ZhbHVlX2xlbiBpcyBsZXNzIHRoYW4gNjRLIGJ1dAorCXdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgaXQgZml0cyB3aXRoaW4gdGhlIHNtYiAqLworCisJLypCQiBhZGQgbGVuZ3RoIGNoZWNrIHRoYXQgaXQgd291bGQgZml0IGluIG5lZ290aWF0ZWQgU01CIGJ1ZmZlciBzaXplIEJCICovCisJLyogaWYoZWFfdmFsdWVfbGVuID4gYnVmZmVyX3NpemUgLSA1MTIgKGVub3VnaCBmb3IgaGVhZGVyKSkgKi8KKwlpZihlYV92YWx1ZV9sZW4pCisJCW1lbWNweShwYXJtX2RhdGEtPmxpc3RbMF0ubmFtZStuYW1lX2xlbisxLGVhX3ZhbHVlLGVhX3ZhbHVlX2xlbik7CisKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IHBTTUItPkRhdGFDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IHBTTUItPlBhcmFtZXRlckNvdW50OworCXBTTUItPlJlc2VydmVkNCA9IDA7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVfY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoYnl0ZV9jb3VudCk7CisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRllJKDEsICgiU2V0UGF0aEluZm8gKEVBKSByZXR1cm5lZCAlZCIsIHJjKSk7CisJfQorCisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIFNldEVBUmV0cnk7CisKKwlyZXR1cm4gcmM7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jb25uZWN0LmMgYi9mcy9jaWZzL2Nvbm5lY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDQ3MGI5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9jb25uZWN0LmMKQEAgLTAsMCArMSwzMDY0IEBACisvKgorICogICBmcy9jaWZzL2Nvbm5lY3QuYworICoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMiwyMDA0CisgKiAgIEF1dGhvcihzKTogU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EgCisgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSAiY2lmc3BkdS5oIgorI2luY2x1ZGUgImNpZnNnbG9iLmgiCisjaW5jbHVkZSAiY2lmc3Byb3RvLmgiCisjaW5jbHVkZSAiY2lmc191bmljb2RlLmgiCisjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgorI2luY2x1ZGUgImNpZnNfZnNfc2IuaCIKKyNpbmNsdWRlICJudGxtc3NwLmgiCisjaW5jbHVkZSAibnRlcnIuaCIKKyNpbmNsdWRlICJyZmMxMDAycGR1LmgiCisKKyNkZWZpbmUgQ0lGU19QT1JUIDQ0NQorI2RlZmluZSBSRkMxMDAxX1BPUlQgMTM5CisKK2V4dGVybiB2b2lkIFNNQmVuY3J5cHQodW5zaWduZWQgY2hhciAqcGFzc3dkLCB1bnNpZ25lZCBjaGFyICpjOCwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnAyNCk7CitleHRlcm4gdm9pZCBTTUJOVGVuY3J5cHQodW5zaWduZWQgY2hhciAqcGFzc3dkLCB1bnNpZ25lZCBjaGFyICpjOCwKKwkJCSB1bnNpZ25lZCBjaGFyICpwMjQpOworCitleHRlcm4gbWVtcG9vbF90ICpjaWZzX3JlcV9wb29scDsKKworc3RydWN0IHNtYl92b2wgeworCWNoYXIgKnVzZXJuYW1lOworCWNoYXIgKnBhc3N3b3JkOworCWNoYXIgKmRvbWFpbm5hbWU7CisJY2hhciAqVU5DOworCWNoYXIgKlVOQ2lwOworCWNoYXIgKmluNl9hZGRyOyAgLyogaXB2NiBhZGRyZXNzIGFzIGh1bWFuIHJlYWRhYmxlIGZvcm0gb2YgaW42X2FkZHIgKi8KKwljaGFyICppb2NoYXJzZXQ7ICAvKiBsb2NhbCBjb2RlIHBhZ2UgZm9yIG1hcHBpbmcgdG8gYW5kIGZyb20gVW5pY29kZSAqLworCWNoYXIgc291cmNlX3JmYzEwMDFfbmFtZVsxNl07IC8qIG5ldGJpb3MgbmFtZSBvZiBjbGllbnQgKi8KKwl1aWRfdCBsaW51eF91aWQ7CisJZ2lkX3QgbGludXhfZ2lkOworCW1vZGVfdCBmaWxlX21vZGU7CisJbW9kZV90IGRpcl9tb2RlOworCXVuc2lnbmVkIHJ3OjE7CisJdW5zaWduZWQgcmV0cnk6MTsKKwl1bnNpZ25lZCBpbnRyOjE7CisJdW5zaWduZWQgc2V0dWlkczoxOworCXVuc2lnbmVkIG5vcGVybToxOworCXVuc2lnbmVkIG5vX3BzeF9hY2w6MTsgLyogc2V0IGlmIHBvc2l4IGFjbCBzdXBwb3J0IHNob3VsZCBiZSBkaXNhYmxlZCAqLworCXVuc2lnbmVkIG5vX3hhdHRyOjE7ICAgLyogc2V0IGlmIHhhdHRyIChFQSkgc3VwcG9ydCBzaG91bGQgYmUgZGlzYWJsZWQqLworCXVuc2lnbmVkIHNlcnZlcl9pbm86MTsgLyogdXNlIGlub2RlIG51bWJlcnMgZnJvbSBzZXJ2ZXIgaWUgVW5pcXVlSWQgKi8KKwl1bnNpZ25lZCBkaXJlY3RfaW86MTsKKwl1bnNpZ25lZCBpbnQgcnNpemU7CisJdW5zaWduZWQgaW50IHdzaXplOworCXVuc2lnbmVkIGludCBzb2Nrb3B0OworCXVuc2lnbmVkIHNob3J0IGludCBwb3J0OworfTsKKworc3RhdGljIGludCBpcHY0X2Nvbm5lY3Qoc3RydWN0IHNvY2thZGRyX2luICpwc2luX3NlcnZlciwgCisJCQlzdHJ1Y3Qgc29ja2V0ICoqY3NvY2tldCwKKwkJCWNoYXIgKiBuZXRiX25hbWUpOworc3RhdGljIGludCBpcHY2X2Nvbm5lY3Qoc3RydWN0IHNvY2thZGRyX2luNiAqcHNpbl9zZXJ2ZXIsIAorCQkJc3RydWN0IHNvY2tldCAqKmNzb2NrZXQpOworCisKKwkvKiAKKwkgKiBjaWZzIHRjcCBzZXNzaW9uIHJlY29ubmVjdGlvbgorCSAqIAorCSAqIG1hcmsgdGNwIHNlc3Npb24gYXMgcmVjb25uZWN0aW5nIHNvIHRlbXBvcmFyaWx5IGxvY2tlZAorCSAqIG1hcmsgYWxsIHNtYiBzZXNzaW9ucyBhcyByZWNvbm5lY3RpbmcgZm9yIHRjcCBzZXNzaW9uCisJICogcmVjb25uZWN0IHRjcCBzZXNzaW9uCisJICogd2FrZSB1cCB3YWl0ZXJzIG9uIHJlY29ubmVjdGlvbj8gLSAobm90IG5lZWRlZCBjdXJyZW50bHkpCisJICovCisKK2ludAorY2lmc19yZWNvbm5lY3Qoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCXN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb247CisJc3RydWN0IG1pZF9xX2VudHJ5ICogbWlkX2VudHJ5OworCQorCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCWlmKHNlcnZlci0+dGNwU3RhdHVzID09IENpZnNFeGl0aW5nKSB7CisJCS8qIHRoZSBkZW11eCB0aHJlYWQgd2lsbCBleGl0IG5vcm1hbGx5IAorCQluZXh0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcCAqLworCQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCQlyZXR1cm4gcmM7CisJfSBlbHNlCisJCXNlcnZlci0+dGNwU3RhdHVzID0gQ2lmc05lZWRSZWNvbm5lY3Q7CisJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwlzZXJ2ZXItPm1heEJ1ZiA9IDA7CisKKwljRllJKDEsICgiUmVjb25uZWN0aW5nIHRjcCBzZXNzaW9uICIpKTsKKworCS8qIGJlZm9yZSByZWNvbm5lY3RpbmcgdGhlIHRjcCBzZXNzaW9uLCBtYXJrIHRoZSBzbWIgc2Vzc2lvbiAodWlkKQorCQlhbmQgdGhlIHRpZCBiYWQgc28gdGhleSBhcmUgbm90IHVzZWQgdW50aWwgcmVjb25uZWN0ZWQgKi8KKwlyZWFkX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCWxpc3RfZm9yX2VhY2godG1wLCAmR2xvYmFsU01CU2Vzc2lvbkxpc3QpIHsKKwkJc2VzID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBjaWZzU2VzSW5mbywgY2lmc1Nlc3Npb25MaXN0KTsKKwkJaWYgKHNlcy0+c2VydmVyKSB7CisJCQlpZiAoc2VzLT5zZXJ2ZXIgPT0gc2VydmVyKSB7CisJCQkJc2VzLT5zdGF0dXMgPSBDaWZzTmVlZFJlY29ubmVjdDsKKwkJCQlzZXMtPmlwY190aWQgPSAwOworCQkJfQorCQl9CisJCS8qIGVsc2UgdGNwIGFuZCBzbWIgc2Vzc2lvbnMgbmVlZCByZWNvbm5lY3Rpb24gKi8KKwl9CisJbGlzdF9mb3JfZWFjaCh0bXAsICZHbG9iYWxUcmVlQ29ubmVjdGlvbkxpc3QpIHsKKwkJdGNvbiA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvLCBjaWZzQ29ubmVjdGlvbkxpc3QpOworCQlpZigodGNvbikgJiYgKHRjb24tPnNlcykgJiYgKHRjb24tPnNlcy0+c2VydmVyID09IHNlcnZlcikpIHsKKwkJCXRjb24tPnRpZFN0YXR1cyA9IENpZnNOZWVkUmVjb25uZWN0OworCQl9CisJfQorCXJlYWRfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwkvKiBkbyBub3Qgd2FudCB0byBiZSBzZW5kaW5nIGRhdGEgb24gYSBzb2NrZXQgd2UgYXJlIGZyZWVpbmcgKi8KKwlkb3duKCZzZXJ2ZXItPnRjcFNlbSk7IAorCWlmKHNlcnZlci0+c3NvY2tldCkgeworCQljRllJKDEsKCJTdGF0ZTogMHgleCBGbGFnczogMHglbHgiLCBzZXJ2ZXItPnNzb2NrZXQtPnN0YXRlLAorCQkJc2VydmVyLT5zc29ja2V0LT5mbGFncykpOworCQlzZXJ2ZXItPnNzb2NrZXQtPm9wcy0+c2h1dGRvd24oc2VydmVyLT5zc29ja2V0LFNFTkRfU0hVVERPV04pOworCQljRllJKDEsKCJQb3N0IHNodXRkb3duIHN0YXRlOiAweCV4IEZsYWdzOiAweCVseCIsIHNlcnZlci0+c3NvY2tldC0+c3RhdGUsCisJCQlzZXJ2ZXItPnNzb2NrZXQtPmZsYWdzKSk7CisJCXNvY2tfcmVsZWFzZShzZXJ2ZXItPnNzb2NrZXQpOworCQlzZXJ2ZXItPnNzb2NrZXQgPSBOVUxMOworCX0KKworCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCWxpc3RfZm9yX2VhY2godG1wLCAmc2VydmVyLT5wZW5kaW5nX21pZF9xKSB7CisJCW1pZF9lbnRyeSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QKKwkJCQkJbWlkX3FfZW50cnksCisJCQkJCXFoZWFkKTsKKwkJaWYobWlkX2VudHJ5KSB7CisJCQlpZihtaWRfZW50cnktPm1pZFN0YXRlID09IE1JRF9SRVFVRVNUX1NVQk1JVFRFRCkgeworCQkJCS8qIE1hcmsgb3RoZXIgaW50cmFuc2l0IHJlcXVlc3RzIGFzIG5lZWRpbmcgcmV0cnkgc28gCisJCQkJICB3ZSBkbyBub3QgaW1tZWRpYXRlbHkgbWFyayB0aGUgc2Vzc2lvbiBiYWQgYWdhaW4gCisJCQkJICAoaWUgYWZ0ZXIgd2UgcmVjb25uZWN0IGJlbG93KSBhcyB0aGV5IHRpbWVvdXQgdG9vICovCisJCQkJbWlkX2VudHJ5LT5taWRTdGF0ZSA9IE1JRF9SRVRSWV9ORUVERUQ7CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwl1cCgmc2VydmVyLT50Y3BTZW0pOyAKKworCXdoaWxlICgoc2VydmVyLT50Y3BTdGF0dXMgIT0gQ2lmc0V4aXRpbmcpICYmIChzZXJ2ZXItPnRjcFN0YXR1cyAhPSBDaWZzR29vZCkpCisJeworCQlpZihzZXJ2ZXItPnByb3RvY29sVHlwZSA9PSBJUFY2KSB7CisJCQlyYyA9IGlwdjZfY29ubmVjdCgmc2VydmVyLT5hZGRyLnNvY2tBZGRyNiwmc2VydmVyLT5zc29ja2V0KTsKKwkJfSBlbHNlIHsKKwkJCXJjID0gaXB2NF9jb25uZWN0KCZzZXJ2ZXItPmFkZHIuc29ja0FkZHIsIAorCQkJCQkmc2VydmVyLT5zc29ja2V0LAorCQkJCQlzZXJ2ZXItPndvcmtzdGF0aW9uX1JGQzEwMDFfbmFtZSk7CisJCX0KKwkJaWYocmMpIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KDMgKiBIWik7CisJCX0gZWxzZSB7CisJCQlhdG9taWNfaW5jKCZ0Y3BTZXNSZWNvbm5lY3RDb3VudCk7CisJCQlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJCWlmKHNlcnZlci0+dGNwU3RhdHVzICE9IENpZnNFeGl0aW5nKQorCQkJCXNlcnZlci0+dGNwU3RhdHVzID0gQ2lmc0dvb2Q7CisJCQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCS8qCQlhdG9taWNfc2V0KCZzZXJ2ZXItPmluRmxpZ2h0LDApOyovCisJCQl3YWtlX3VwKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOworCQl9CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorY2lmc19kZW11bHRpcGxleF90aHJlYWQoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKQoreworCWludCBsZW5ndGg7CisJdW5zaWduZWQgaW50IHBkdV9sZW5ndGgsIHRvdGFsX3JlYWQ7CisJc3RydWN0IHNtYl9oZHIgKnNtYl9idWZmZXIgPSBOVUxMOworCXN0cnVjdCBtc2doZHIgc21iX21zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3Y7CisJc3RydWN0IHNvY2tldCAqY3NvY2tldCA9IHNlcnZlci0+c3NvY2tldDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IGNpZnNTZXNJbmZvICpzZXM7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrX3RvX3dha2UgPSBOVUxMOworCXN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkX2VudHJ5OworCWNoYXIgKnRlbXA7CisKKwlkYWVtb25pemUoImNpZnNkIik7CisJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX01FTUFMTE9DOworCXNlcnZlci0+dHNrID0gY3VycmVudDsJLyogc2F2ZSBwcm9jZXNzIGluZm8gdG8gd2FrZSBhdCBzaHV0ZG93biAqLworCWNGWUkoMSwgKCJEZW11bHRpcGxleCBQSUQ6ICVkIiwgY3VycmVudC0+cGlkKSk7CisJd3JpdGVfbG9jaygmR2xvYmFsU01CU2VzbG9jayk7IAorCWF0b21pY19pbmMoJnRjcFNlc0FsbG9jQ291bnQpOworCWxlbmd0aCA9IHRjcFNlc0FsbG9jQ291bnQuY291bnRlcjsKKwl3cml0ZV91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCWlmKGxlbmd0aCAgPiAxKSB7CisJCW1lbXBvb2xfcmVzaXplKGNpZnNfcmVxX3Bvb2xwLAorCQkJbGVuZ3RoICsgY2lmc19taW5fcmN2LAorCQkJR0ZQX0tFUk5FTCk7CisJfQorCisJd2hpbGUgKHNlcnZlci0+dGNwU3RhdHVzICE9IENpZnNFeGl0aW5nKSB7CisJCWlmIChzbWJfYnVmZmVyID09IE5VTEwpCisJCQlzbWJfYnVmZmVyID0gY2lmc19idWZfZ2V0KCk7CisJCWVsc2UKKwkJCW1lbXNldChzbWJfYnVmZmVyLCAwLCBzaXplb2YgKHN0cnVjdCBzbWJfaGRyKSk7CisKKwkJaWYgKHNtYl9idWZmZXIgPT0gTlVMTCkgeworCQkJY0VSUk9SKDEsKCJDYW4gbm90IGdldCBtZW1vcnkgZm9yIFNNQiByZXNwb25zZSIpKTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KEhaICogMyk7IC8qIGdpdmUgc3lzdGVtIHRpbWUgdG8gZnJlZSBtZW1vcnkgKi8KKwkJCWNvbnRpbnVlOworCQl9CisJCWlvdi5pb3ZfYmFzZSA9IHNtYl9idWZmZXI7CisJCWlvdi5pb3ZfbGVuID0gNDsKKwkJc21iX21zZy5tc2dfY29udHJvbCA9IE5VTEw7CisJCXNtYl9tc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCQlsZW5ndGggPQorCQkgICAga2VybmVsX3JlY3Ztc2coY3NvY2tldCwgJnNtYl9tc2csCisJCQkJICZpb3YsIDEsIDQsIDAgLyogQkIgc2VlIHNvY2tldC5oIGZsYWdzICovKTsKKworCQlpZihzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzRXhpdGluZykgeworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoc2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc05lZWRSZWNvbm5lY3QpIHsKKwkJCWNGWUkoMSwoIlJlY29ubmVjdGluZyBhZnRlciBzZXJ2ZXIgc3RvcHBlZCByZXNwb25kaW5nIikpOworCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKKwkJCWNGWUkoMSwoImNhbGwgdG8gcmVjb25uZWN0IGRvbmUiKSk7CisJCQljc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoKGxlbmd0aCA9PSAtRVJFU1RBUlRTWVMpIHx8IChsZW5ndGggPT0gLUVBR0FJTikpIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KDEpOyAvKiBtaW5pbXVtIHNsZWVwIHRvIHByZXZlbnQgbG9vcGluZworCQkJCWFsbG93aW5nIHNvY2tldCB0byBjbGVhciBhbmQgYXBwIHRocmVhZHMgdG8gc2V0CisJCQkJdGNwU3RhdHVzIENpZnNOZWVkUmVjb25uZWN0IGlmIHNlcnZlciBodW5nICovCisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChsZW5ndGggPD0gMCkgeworCQkJaWYoc2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc05ldykgeworCQkJCWNGWUkoMSwoInRjcCBzZXNzaW9uIGFiZW5kZWQgcHJlbWF0dXJlbHkgKGFmdGVyIFNNQm5lZ3Byb3QpIikpOworCQkJCS8qIHNvbWUgc2VydmVycyBraWxsIHRjcCBzZXNzaW9uIHJhdGhlciB0aGFuIHJldHVybmluZworCQkJCQlzbWIgbmVncHJvdCBlcnJvciBpbiB3aGljaCBjYXNlIHJlY29ubmVjdGluZyBoZXJlIGlzCisJCQkJCW5vdCBnb2luZyB0byBoZWxwIC0gcmV0dXJuIGVycm9yIHRvIG1vdW50ICovCisJCQkJYnJlYWs7CisJCQl9CisJCQlpZihsZW5ndGggPT0gLUVJTlRSKSB7IAorCQkJCWNGWUkoMSwoImNpZnNkIHRocmVhZCBraWxsZWQiKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljRllJKDEsKCJSZWNvbm5lY3RpbmcgYWZ0ZXIgdW5leHBlY3RlZCBwZWVrIGVycm9yICVkIixsZW5ndGgpKTsKKwkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7CisJCQljc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OworCQkJd2FrZV91cCgmc2VydmVyLT5yZXNwb25zZV9xKTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKGxlbmd0aCA+IDMpIHsKKwkJCXBkdV9sZW5ndGggPSBudG9obChzbWJfYnVmZmVyLT5zbWJfYnVmX2xlbmd0aCk7CisJCS8qIE9ubHkgcmVhZCBwZHVfbGVuZ3RoIGFmdGVyIGJlbG93IGNoZWNrcyBmb3IgdG9vIHNob3J0IChkdWUKKwkJICAgdG8gZS5nLiBpbnQgb3ZlcmZsb3cpIGFuZCB0b28gbG9uZyBpZSBiZXlvbmQgZW5kIG9mIGJ1ZiAqLworCQkJY0ZZSSgxLCgicmZjMTAwMiBsZW5ndGgoYmlnIGVuZGlhbikweCV4KSIsIHBkdV9sZW5ndGgrNCkpOworCisJCQl0ZW1wID0gKGNoYXIgKikgc21iX2J1ZmZlcjsKKwkJCWlmICh0ZW1wWzBdID09IChjaGFyKSBSRkMxMDAyX1NFU1NJT05fS0VFUF9BTElWRSkgeworCQkJCWNGWUkoMCwoIlJlY2VpdmVkIDQgYnl0ZSBrZWVwIGFsaXZlIHBhY2tldCIpKTsKKwkJCX0gZWxzZSBpZiAodGVtcFswXSA9PSAoY2hhcikgUkZDMTAwMl9QT1NJVElWRV9TRVNTSU9OX1JFU1BPTlNFKSB7CisJCQkJCWNGWUkoMSwoIkdvb2QgUkZDIDEwMDIgc2Vzc2lvbiByc3AiKSk7CisJCQl9IGVsc2UgaWYgKHRlbXBbMF0gPT0gKGNoYXIpUkZDMTAwMl9ORUdBVElWRV9TRVNTSU9OX1JFU1BPTlNFKSB7CisJCQkJLyogd2UgZ2V0IHRoaXMgZnJvbSBXaW5kb3dzIDk4IGluc3RlYWQgb2YgZXJyb3Igb24gU01CIG5lZ3Byb3QgcmVzcG9uc2UgKi8KKwkJCQljRllJKDEsKCJOZWdhdGl2ZSBSRkMgMTAwMiBTZXNzaW9uIFJlc3BvbnNlIEVycm9yIDB4JXgpIix0ZW1wWzRdKSk7CisJCQkJaWYoc2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc05ldykgeworCQkJCQkvKiBpZiBuYWNrIG9uIG5lZ3Byb3QgKHJhdGhlciB0aGFuIAorCQkJCQlyZXQgb2Ygc21iIG5lZ3Byb3QgZXJyb3IpIHJlY29ubmVjdGluZworCQkJCQlub3QgZ29pbmcgdG8gaGVscCwgcmV0IGVycm9yIHRvIG1vdW50ICovCisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIGdpdmUgc2VydmVyIGEgc2Vjb25kIHRvCisJCQkJCWNsZWFuIHVwIGJlZm9yZSByZWNvbm5lY3QgYXR0ZW1wdCAqLworCQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJCQlzY2hlZHVsZV90aW1lb3V0KEhaKTsKKwkJCQkJLyogYWx3YXlzIHRyeSA0NDUgZmlyc3Qgb24gcmVjb25uZWN0CisJCQkJCXNpbmNlIHdlIGdldCBOQUNLIG9uIHNvbWUgaWYgd2UgZXZlcgorCQkJCQljb25uZWN0ZWQgdG8gcG9ydCAxMzkgKHRoZSBOQUNLIGlzIAorCQkJCQlzaW5jZSB3ZSBkbyBub3QgYmVnaW4gd2l0aCBSRkMxMDAxCisJCQkJCXNlc3Npb24gaW5pdGlhbGl6ZSBmcmFtZSkgKi8KKwkJCQkJc2VydmVyLT5hZGRyLnNvY2tBZGRyLnNpbl9wb3J0ID0gaHRvbnMoQ0lGU19QT1JUKTsKKwkJCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKKwkJCQkJY3NvY2tldCA9IHNlcnZlci0+c3NvY2tldDsKKwkJCQkJd2FrZV91cCgmc2VydmVyLT5yZXNwb25zZV9xKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfSBlbHNlIGlmICh0ZW1wWzBdICE9IChjaGFyKSAwKSB7CisJCQkJY0VSUk9SKDEsKCJVbmtub3duIFJGQyAxMDAyIGZyYW1lIikpOworCQkJCWNpZnNfZHVtcF9tZW0oIiBSZWNlaXZlZCBEYXRhOiAiLCB0ZW1wLCBsZW5ndGgpOworCQkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7CisJCQkJY3NvY2tldCA9IHNlcnZlci0+c3NvY2tldDsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYoKHBkdV9sZW5ndGggPiBDSUZTTWF4QnVmU2l6ZSArIE1BWF9DSUZTX0hEUl9TSVpFIC0gNCkKKwkJCQkgICAgfHwgKHBkdV9sZW5ndGggPCBzaXplb2YgKHN0cnVjdCBzbWJfaGRyKSAtIDEgLSA0KSkgeworCQkJCQljRVJST1IoMSwKKwkJCQkJICAgICgiSW52YWxpZCBzaXplIFNNQiBsZW5ndGggJWQgYW5kIHBkdV9sZW5ndGggJWQiLAorCQkJCQkJbGVuZ3RoLCBwZHVfbGVuZ3RoKzQpKTsKKwkJCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKKwkJCQkJY3NvY2tldCA9IHNlcnZlci0+c3NvY2tldDsKKwkJCQkJd2FrZV91cCgmc2VydmVyLT5yZXNwb25zZV9xKTsKKwkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIHsgLyogbGVuZ3RoIG9rICovCisJCQkJCWxlbmd0aCA9IDA7CisJCQkJCWlvdi5pb3ZfYmFzZSA9IDQgKyAoY2hhciAqKXNtYl9idWZmZXI7CisJCQkJCWlvdi5pb3ZfbGVuID0gcGR1X2xlbmd0aDsKKwkJCQkJZm9yICh0b3RhbF9yZWFkID0gMDsgCisJCQkJCSAgICAgdG90YWxfcmVhZCA8IHBkdV9sZW5ndGg7CisJCQkJCSAgICAgdG90YWxfcmVhZCArPSBsZW5ndGgpIHsKKwkJCQkJCWxlbmd0aCA9IGtlcm5lbF9yZWN2bXNnKGNzb2NrZXQsICZzbWJfbXNnLCAKKwkJCQkJCQkmaW92LCAxLAorCQkJCQkJCXBkdV9sZW5ndGggLSB0b3RhbF9yZWFkLCAwKTsKKwkJCQkJCWlmIChsZW5ndGggPT0gMCkgeworCQkJCQkJCWNFUlJPUigxLAorCQkJCQkJCSAgICAgICAoIlplcm8gbGVuZ3RoIHJlY2VpdmUgd2hlbiBleHBlY3RpbmcgJWQgIiwKKwkJCQkJCQkJcGR1X2xlbmd0aCAtIHRvdGFsX3JlYWQpKTsKKwkJCQkJCQljaWZzX3JlY29ubmVjdChzZXJ2ZXIpOworCQkJCQkJCWNzb2NrZXQgPSBzZXJ2ZXItPnNzb2NrZXQ7CisJCQkJCQkJd2FrZV91cCgmc2VydmVyLT5yZXNwb25zZV9xKTsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlsZW5ndGggKz0gNDsgLyogYWNjb3VudCBmb3IgcmZjMTAwMiBoZHIgKi8KKwkJCQl9CisKKwkJCQlkdW1wX3NtYihzbWJfYnVmZmVyLCBsZW5ndGgpOworCQkJCWlmIChjaGVja1NNQgorCQkJCSAgICAoc21iX2J1ZmZlciwgc21iX2J1ZmZlci0+TWlkLCB0b3RhbF9yZWFkKzQpKSB7CisJCQkJCWNFUlJPUigxLCAoIkJhZCBTTUIgUmVjZWl2ZWQgIikpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQl0YXNrX3RvX3dha2UgPSBOVUxMOworCQkJCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCQkJCWxpc3RfZm9yX2VhY2godG1wLCAmc2VydmVyLT5wZW5kaW5nX21pZF9xKSB7CisJCQkJCW1pZF9lbnRyeSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QKKwkJCQkJCQkgICAgICAgbWlkX3FfZW50cnksCisJCQkJCQkJICAgICAgIHFoZWFkKTsKKworCQkJCQlpZiAoKG1pZF9lbnRyeS0+bWlkID09IHNtYl9idWZmZXItPk1pZCkgJiYgKG1pZF9lbnRyeS0+bWlkU3RhdGUgPT0gTUlEX1JFUVVFU1RfU1VCTUlUVEVEKSkgeworCQkJCQkJY0ZZSSgxLAorCQkJCQkJICAgICAoIiBNaWQgMHgleCBtYXRjaGVkIC0gd2FraW5nIHVwICIsbWlkX2VudHJ5LT5taWQpKTsKKwkJCQkJCXRhc2tfdG9fd2FrZSA9IG1pZF9lbnRyeS0+dHNrOworCQkJCQkJbWlkX2VudHJ5LT5yZXNwX2J1ZiA9CisJCQkJCQkgICAgc21iX2J1ZmZlcjsKKwkJCQkJCW1pZF9lbnRyeS0+bWlkU3RhdGUgPQorCQkJCQkJICAgIE1JRF9SRVNQT05TRV9SRUNFSVZFRDsKKwkJCQkJfQorCQkJCX0KKwkJCQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCQkJCWlmICh0YXNrX3RvX3dha2UpIHsKKwkJCQkJc21iX2J1ZmZlciA9IE5VTEw7CS8qIHdpbGwgYmUgZnJlZWQgYnkgdXNlcnMgdGhyZWFkIGFmdGVyIGhlIGlzIGRvbmUgKi8KKwkJCQkJd2FrZV91cF9wcm9jZXNzKHRhc2tfdG9fd2FrZSk7CisJCQkJfSBlbHNlIGlmIChpc192YWxpZF9vcGxvY2tfYnJlYWsoc21iX2J1ZmZlcikgPT0gRkFMU0UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCQljRVJST1IoMSwgKCJObyB0YXNrIHRvIHdha2UsIHVua25vd24gZnJhbWUgcmN2ZCEiKSk7CisJCQkJCWNpZnNfZHVtcF9tZW0oIlJlY2VpdmVkIERhdGEgaXM6ICIsdGVtcCxzaXplb2Yoc3RydWN0IHNtYl9oZHIpKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQljRllJKDEsCisJCQkgICAgKCJGcmFtZSBsZXNzIHRoYW4gZm91ciBieXRlcyByZWNlaXZlZCAgJWQgYnl0ZXMgbG9uZy4iLAorCQkJICAgICAgbGVuZ3RoKSk7CisJCQljaWZzX3JlY29ubmVjdChzZXJ2ZXIpOworCQkJY3NvY2tldCA9IHNlcnZlci0+c3NvY2tldDsKKwkJCXdha2VfdXAoJnNlcnZlci0+cmVzcG9uc2VfcSk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwlzZXJ2ZXItPnRjcFN0YXR1cyA9IENpZnNFeGl0aW5nOworCXNlcnZlci0+dHNrID0gTlVMTDsKKwlhdG9taWNfc2V0KCZzZXJ2ZXItPmluRmxpZ2h0LCAwKTsKKwlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCS8qIEFsdGhvdWdoIHRoZXJlIHNob3VsZCBub3QgYmUgYW55IHJlcXVlc3RzIGJsb2NrZWQgb24gCisJdGhpcyBxdWV1ZSBpdCBjYW4gbm90IGh1cnQgdG8gYmUgcGFyYW5vaWQgYW5kIHRyeSB0byB3YWtlIHVwIHJlcXVlc3RzCisJdGhhdCBtYXkgaGF2ZW4gYmVlbiBibG9ja2VkIHdoZW4gbW9yZSB0aGFuIDUwIGF0IHRpbWUgd2VyZSBvbiB0aGUgd2lyZSAKKwl0byB0aGUgc2FtZSBzZXJ2ZXIgLSB0aGV5IG5vdyB3aWxsIHNlZSB0aGUgc2Vzc2lvbiBpcyBpbiBleGl0IHN0YXRlCisJYW5kIGdldCBvdXQgb2YgU2VuZFJlY2VpdmUuICAqLworCXdha2VfdXBfYWxsKCZzZXJ2ZXItPnJlcXVlc3RfcSk7CisJLyogZ2l2ZSB0aG9zZSByZXF1ZXN0cyB0aW1lIHRvIGV4aXQgKi8KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoSFovOCk7CisKKwlpZihzZXJ2ZXItPnNzb2NrZXQpIHsKKwkJc29ja19yZWxlYXNlKGNzb2NrZXQpOworCQlzZXJ2ZXItPnNzb2NrZXQgPSBOVUxMOworCX0KKwlpZiAoc21iX2J1ZmZlcikgLyogYnVmZmVyIHVzdWFsbHkgZnJlZWQgaW4gZnJlZV9taWQgLSBuZWVkIHRvIGZyZWUgaXQgb24gZXJyb3Igb3IgZXhpdCAqLworCQljaWZzX2J1Zl9yZWxlYXNlKHNtYl9idWZmZXIpOworCisJcmVhZF9sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmc2VydmVyLT5wZW5kaW5nX21pZF9xKSkgeworCQkvKiBsb29wIHRocm91Z2ggc2VydmVyIHNlc3Npb24gc3RydWN0dXJlcyBhdHRhY2hlZCB0byB0aGlzIGFuZCBtYXJrIHRoZW0gZGVhZCAqLworCQlsaXN0X2Zvcl9lYWNoKHRtcCwgJkdsb2JhbFNNQlNlc3Npb25MaXN0KSB7CisJCQlzZXMgPQorCQkJICAgIGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2lmc1Nlc0luZm8sCisJCQkJICAgICAgIGNpZnNTZXNzaW9uTGlzdCk7CisJCQlpZiAoc2VzLT5zZXJ2ZXIgPT0gc2VydmVyKSB7CisJCQkJc2VzLT5zdGF0dXMgPSBDaWZzRXhpdGluZzsKKwkJCQlzZXMtPnNlcnZlciA9IE5VTEw7CisJCQl9CisJCX0KKwkJcmVhZF91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCX0gZWxzZSB7CisJCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCQlsaXN0X2Zvcl9lYWNoKHRtcCwgJnNlcnZlci0+cGVuZGluZ19taWRfcSkgeworCQltaWRfZW50cnkgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IG1pZF9xX2VudHJ5LCBxaGVhZCk7CisJCQlpZiAobWlkX2VudHJ5LT5taWRTdGF0ZSA9PSBNSURfUkVRVUVTVF9TVUJNSVRURUQpIHsKKwkJCQljRllJKDEsCisJCQkJCSAoIiBDbGVhcmluZyBNaWQgMHgleCAtIHdha2luZyB1cCAiLG1pZF9lbnRyeS0+bWlkKSk7CisJCQkJdGFza190b193YWtlID0gbWlkX2VudHJ5LT50c2s7CisJCQkJaWYodGFza190b193YWtlKSB7CisJCQkJCXdha2VfdXBfcHJvY2Vzcyh0YXNrX3RvX3dha2UpOworCQkJCX0KKwkJCX0KKwkJfQorCQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCQlyZWFkX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCS8qIDEvOHRoIG9mIHNlYyBpcyBtb3JlIHRoYW4gZW5vdWdoIHRpbWUgZm9yIHRoZW0gdG8gZXhpdCAqLworCQlzY2hlZHVsZV90aW1lb3V0KEhaLzgpOyAKKwl9CisKKwlpZiAobGlzdF9lbXB0eSgmc2VydmVyLT5wZW5kaW5nX21pZF9xKSkgeworCQkvKiBtcHggdGhyZWFkcyBoYXZlIG5vdCBleGl0ZWQgeWV0IGdpdmUgdGhlbSAKKwkJYXQgbGVhc3QgdGhlIHNtYiBzZW5kIHRpbWVvdXQgdGltZSBmb3IgbG9uZyBvcHMgKi8KKwkJY0ZZSSgxLCAoIldhaXQgZm9yIGV4aXQgZnJvbSBkZW11bHRpcGxleCB0aHJlYWQiKSk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoNDYgKiBIWik7CQorCQkvKiBpZiB0aHJlYWRzIHN0aWxsIGhhdmUgbm90IGV4aXRlZCB0aGV5IGFyZSBwcm9iYWJseSBuZXZlcgorCQljb21pbmcgaG9tZSBub3QgbXVjaCBlbHNlIHdlIGNhbiBkbyBidXQgZnJlZSB0aGUgbWVtb3J5ICovCisJfQorCWtmcmVlKHNlcnZlcik7CisKKwl3cml0ZV9sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlhdG9taWNfZGVjKCZ0Y3BTZXNBbGxvY0NvdW50KTsKKwlsZW5ndGggPSB0Y3BTZXNBbGxvY0NvdW50LmNvdW50ZXI7CisJd3JpdGVfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlpZihsZW5ndGggID4gMCkgeworCQltZW1wb29sX3Jlc2l6ZShjaWZzX3JlcV9wb29scCwKKwkJCWxlbmd0aCArIGNpZnNfbWluX3JjdiwKKwkJCUdGUF9LRVJORUwpOworCX0KKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dChIWi80KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgKiAKK2NpZnNfa2NhbGxvYyhzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IF9fbm9jYXN0IHR5cGUpCit7CisJdm9pZCAqYWRkcjsKKwlhZGRyID0ga21hbGxvYyhzaXplLCB0eXBlKTsKKwlpZiAoYWRkcikKKwkJbWVtc2V0KGFkZHIsIDAsIHNpemUpOworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgaW50CitjaWZzX3BhcnNlX21vdW50X29wdGlvbnMoY2hhciAqb3B0aW9ucywgY29uc3QgY2hhciAqZGV2bmFtZSxzdHJ1Y3Qgc21iX3ZvbCAqdm9sKQoreworCWNoYXIgKnZhbHVlOworCWNoYXIgKmRhdGE7CisJdW5zaWduZWQgaW50ICB0ZW1wX2xlbiwgaSwgajsKKwljaGFyIHNlcGFyYXRvclsyXTsKKworCXNlcGFyYXRvclswXSA9ICcsJzsKKwlzZXBhcmF0b3JbMV0gPSAwOyAKKworCW1lbXNldCh2b2wtPnNvdXJjZV9yZmMxMDAxX25hbWUsMHgyMCwxNSk7CisJZm9yKGk9MDtpIDwgc3RybmxlbihzeXN0ZW1fdXRzbmFtZS5ub2RlbmFtZSwxNSk7aSsrKSB7CisJCS8qIGRvZXMgbm90IGhhdmUgdG8gYmUgYSBwZXJmZWN0IG1hcHBpbmcgc2luY2UgdGhlIGZpZWxkIGlzCisJCWluZm9ybWF0aW9uYWwsIG9ubHkgdXNlZCBmb3Igc2VydmVycyB0aGF0IGRvIG5vdCBzdXBwb3J0CisJCXBvcnQgNDQ1IGFuZCBpdCBjYW4gYmUgb3ZlcnJpZGRlbiBhdCBtb3VudCB0aW1lICovCisJCXZvbC0+c291cmNlX3JmYzEwMDFfbmFtZVtpXSA9IHRvdXBwZXIoc3lzdGVtX3V0c25hbWUubm9kZW5hbWVbaV0pOworCX0KKwl2b2wtPnNvdXJjZV9yZmMxMDAxX25hbWVbMTVdID0gMDsKKworCXZvbC0+bGludXhfdWlkID0gY3VycmVudC0+dWlkOwkvKiBjdXJyZW50LT5ldWlkIGluc3RlYWQ/ICovCisJdm9sLT5saW51eF9naWQgPSBjdXJyZW50LT5naWQ7CisJdm9sLT5kaXJfbW9kZSA9IFNfSVJXWFVHTzsKKwkvKiAyNzY3IHBlcm1zIGluZGljYXRlIG1hbmRhdG9yeSBsb2NraW5nIHN1cHBvcnQgKi8KKwl2b2wtPmZpbGVfbW9kZSA9IFNfSUFMTFVHTyAmIH4oU19JU1VJRCB8IFNfSVhHUlApOworCisJLyogdm9sLT5yZXRyeSBkZWZhdWx0IGlzIDAgKGkuZS4gInNvZnQiIGxpbWl0ZWQgcmV0cnkgbm90IGhhcmQgcmV0cnkpICovCisJdm9sLT5ydyA9IFRSVUU7CisKKwlpZiAoIW9wdGlvbnMpCisJCXJldHVybiAxOworCisJaWYoc3RybmNtcChvcHRpb25zLCJzZXA9Iiw0KSA9PSAwKSB7CisJCWlmKG9wdGlvbnNbNF0gIT0gMCkgeworCQkJc2VwYXJhdG9yWzBdID0gb3B0aW9uc1s0XTsKKwkJCW9wdGlvbnMgKz0gNTsKKwkJfSBlbHNlIHsKKwkJCWNGWUkoMSwoIk51bGwgc2VwYXJhdG9yIG5vdCBhbGxvd2VkIikpOworCQl9CisJfQorCQkKKwl3aGlsZSAoKGRhdGEgPSBzdHJzZXAoJm9wdGlvbnMsIHNlcGFyYXRvcikpICE9IE5VTEwpIHsKKwkJaWYgKCEqZGF0YSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKHZhbHVlID0gc3RyY2hyKGRhdGEsICc9JykpICE9IE5VTEwpCisJCQkqdmFsdWUrKyA9ICdcMCc7CisKKwkJaWYgKHN0cm5pY21wKGRhdGEsICJ1c2VyX3hhdHRyIiwxMCkgPT0gMCkgey8qcGFyc2UgYmVmb3JlIHVzZXIqLworCQkJdm9sLT5ub194YXR0ciA9IDA7CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgIm5vdXNlcl94YXR0ciIsMTIpID09IDApIHsKKwkJCXZvbC0+bm9feGF0dHIgPSAxOworCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJ1c2VyIiwgNCkgPT0gMCkgeworCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICAiQ0lGUzogaW52YWxpZCBvciBtaXNzaW5nIHVzZXJuYW1lXG4iKTsKKwkJCQlyZXR1cm4gMTsJLyogbmVlZHNfYXJnOyAqLworCQkJfQorCQkJaWYgKHN0cm5sZW4odmFsdWUsIDIwMCkgPCAyMDApIHsKKwkJCQl2b2wtPnVzZXJuYW1lID0gdmFsdWU7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNJRlM6IHVzZXJuYW1lIHRvbyBsb25nXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAicGFzcyIsIDQpID09IDApIHsKKwkJCWlmICghdmFsdWUpIHsKKwkJCQl2b2wtPnBhc3N3b3JkID0gTlVMTDsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZih2YWx1ZVswXSA9PSAwKSB7CisJCQkJLyogY2hlY2sgaWYgc3RyaW5nIGJlZ2lucyB3aXRoIGRvdWJsZSBjb21tYQorCQkJCSAgIHNpbmNlIHRoYXQgd291bGQgbWVhbiB0aGUgcGFzc3dvcmQgcmVhbGx5CisJCQkJICAgZG9lcyBzdGFydCB3aXRoIGEgY29tbWEsIGFuZCB3b3VsZCBub3QKKwkJCQkgICBpbmRpY2F0ZSBhbiBlbXB0eSBzdHJpbmcgKi8KKwkJCQlpZih2YWx1ZVsxXSAhPSBzZXBhcmF0b3JbMF0pIHsKKwkJCQkJdm9sLT5wYXNzd29yZCA9IE5VTEw7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCXRlbXBfbGVuID0gc3RybGVuKHZhbHVlKTsKKwkJCS8qIHJlbW92ZWQgcGFzc3dvcmQgbGVuZ3RoIGNoZWNrLCBOVExNIHBhc3N3b3JkcworCQkJCWNhbiBiZSBhcmJpdHJhcmlseSBsb25nICovCisKKwkJCS8qIGlmIGNvbW1hIGluIHBhc3N3b3JkLCB0aGUgc3RyaW5nIHdpbGwgYmUgCisJCQlwcmVtYXR1cmVseSBudWxsIHRlcm1pbmF0ZWQuICBDb21tYXMgaW4gcGFzc3dvcmQgYXJlCisJCQlzcGVjaWZpZWQgYWNyb3NzIHRoZSBjaWZzIG1vdW50IGludGVyZmFjZSBieSBhIGRvdWJsZQorCQkJY29tbWEgaWUgLCwgYW5kIGEgY29tbWEgdXNlZCBhcyBpbiBvdGhlciBjYXNlcyBpZSAnLCcKKwkJCWFzIGEgcGFyYW1ldGVyIGRlbGltaXRlci9zZXBhcmF0b3IgaXMgc2luZ2xlIGFuZCBkdWUKKwkJCXRvIHRoZSBzdHJzZXAgYWJvdmUgaXMgdGVtcG9yYXJpbHkgemVyb2VkLiAqLworCisJCQkvKiBOQjogcGFzc3dvcmQgbGVnYWxseSBjYW4gaGF2ZSBtdWx0aXBsZSBjb21tYXMgYW5kCisJCQl0aGUgb25seSBpbGxlZ2FsIGNoYXJhY3RlciBpbiBhIHBhc3N3b3JkIGlzIG51bGwgKi8KKworCQkJaWYgKCh2YWx1ZVt0ZW1wX2xlbl0gPT0gMCkgJiYgKHZhbHVlW3RlbXBfbGVuKzFdID09IHNlcGFyYXRvclswXSkpIHsKKwkJCQkvKiByZWluc2VydCBjb21tYSAqLworCQkJCXZhbHVlW3RlbXBfbGVuXSA9IHNlcGFyYXRvclswXTsKKwkJCQl0ZW1wX2xlbis9MjsgIC8qIG1vdmUgYWZ0ZXIgdGhlIHNlY29uZCBjb21tYSAqLworCQkJCXdoaWxlKHZhbHVlW3RlbXBfbGVuXSAhPSAwKSAgeworCQkJCQlpZiAodmFsdWVbdGVtcF9sZW5dID09IHNlcGFyYXRvclswXSkgeworCQkJCQkJaWYgKHZhbHVlW3RlbXBfbGVuKzFdID09IHNlcGFyYXRvclswXSkgeworCQkJCQkJCXRlbXBfbGVuKys7IC8qIHNraXAgc2Vjb25kIGNvbW1hICovCisJCQkJCQl9IGVsc2UgeyAKKwkJCQkJCS8qIHNpbmdsZSBjb21tYSBpbmRpY2F0aW5nIHN0YXJ0CisJCQkJCQkJIG9mIG5leHQgcGFybSAqLworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXRlbXBfbGVuKys7CisJCQkJfQorCQkJCWlmKHZhbHVlW3RlbXBfbGVuXSA9PSAwKSB7CisJCQkJCW9wdGlvbnMgPSBOVUxMOworCQkJCX0gZWxzZSB7CisJCQkJCXZhbHVlW3RlbXBfbGVuXSA9IDA7CisJCQkJCS8qIHBvaW50IG9wdGlvbiB0byBzdGFydCBvZiBuZXh0IHBhcm0gKi8KKwkJCQkJb3B0aW9ucyA9IHZhbHVlICsgdGVtcF9sZW4gKyAxOworCQkJCX0KKwkJCQkvKiBnbyBmcm9tIHZhbHVlIHRvIHZhbHVlICsgdGVtcF9sZW4gY29uZGVuc2luZyAKKwkJCQlkb3VibGUgY29tbWFzIHRvIHNpbmdsZXMuIE5vdGUgdGhhdCB0aGlzIGVuZHMgdXAKKwkJCQlhbGxvY2F0aW5nIGEgZmV3IGJ5dGVzIHRvbyBtYW55LCB3aGljaCBpcyBvayAqLworCQkJCXZvbC0+cGFzc3dvcmQgPSBjaWZzX2tjYWxsb2ModGVtcF9sZW4sIEdGUF9LRVJORUwpOworCQkJCWZvcihpPTAsaj0wO2k8dGVtcF9sZW47aSsrLGorKykgeworCQkJCQl2b2wtPnBhc3N3b3JkW2pdID0gdmFsdWVbaV07CisJCQkJCWlmKHZhbHVlW2ldID09IHNlcGFyYXRvclswXSAmJiB2YWx1ZVtpKzFdID09IHNlcGFyYXRvclswXSkgeworCQkJCQkJLyogc2tpcCBzZWNvbmQgY29tbWEgKi8KKwkJCQkJCWkrKzsKKwkJCQkJfQorCQkJCX0KKwkJCQl2b2wtPnBhc3N3b3JkW2pdID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJdm9sLT5wYXNzd29yZCA9IGNpZnNfa2NhbGxvYyh0ZW1wX2xlbiArIDEsIEdGUF9LRVJORUwpOworCQkJCXN0cmNweSh2b2wtPnBhc3N3b3JkLCB2YWx1ZSk7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgImlwIiwgMikgPT0gMCkgeworCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7CisJCQkJdm9sLT5VTkNpcCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKHN0cm5sZW4odmFsdWUsIDM1KSA8IDM1KSB7CisJCQkJdm9sLT5VTkNpcCA9IHZhbHVlOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDSUZTOiBpcCBhZGRyZXNzIHRvbyBsb25nXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfSBlbHNlIGlmICgoc3RybmljbXAoZGF0YSwgInVuYyIsIDMpID09IDApCisJCQkgICB8fCAoc3RybmljbXAoZGF0YSwgInRhcmdldCIsIDYpID09IDApCisJCQkgICB8fCAoc3RybmljbXAoZGF0YSwgInBhdGgiLCA0KSA9PSAwKSkgeworCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICAiQ0lGUzogaW52YWxpZCBwYXRoIHRvIG5ldHdvcmsgcmVzb3VyY2VcbiIpOworCQkJCXJldHVybiAxOwkvKiBuZWVkc19hcmc7ICovCisJCQl9CisJCQlpZiAoKHRlbXBfbGVuID0gc3Rybmxlbih2YWx1ZSwgMzAwKSkgPCAzMDApIHsKKwkJCQl2b2wtPlVOQyA9IGttYWxsb2ModGVtcF9sZW4rMSxHRlBfS0VSTkVMKTsKKwkJCQlpZih2b2wtPlVOQyA9PSBOVUxMKQorCQkJCQlyZXR1cm4gMTsKKwkJCQlzdHJjcHkodm9sLT5VTkMsdmFsdWUpOworCQkJCWlmIChzdHJuY21wKHZvbC0+VU5DLCAiLy8iLCAyKSA9PSAwKSB7CisJCQkJCXZvbC0+VU5DWzBdID0gJ1xcJzsKKwkJCQkJdm9sLT5VTkNbMV0gPSAnXFwnOworCQkJCX0gZWxzZSBpZiAoc3RybmNtcCh2b2wtPlVOQywgIlxcXFwiLCAyKSAhPSAwKSB7CSAgICAgICAgICAgICAgICAgICAKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkgICAgICAgIkNJRlM6IFVOQyBQYXRoIGRvZXMgbm90IGJlZ2luIHdpdGggLy8gb3IgXFxcXCBcbiIpOworCQkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNJRlM6IFVOQyBuYW1lIHRvbyBsb25nXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfSBlbHNlIGlmICgoc3RybmljbXAoZGF0YSwgImRvbWFpbiIsIDMpID09IDApCisJCQkgICB8fCAoc3RybmljbXAoZGF0YSwgIndvcmtncm91cCIsIDUpID09IDApKSB7CisJCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDSUZTOiBpbnZhbGlkIGRvbWFpbiBuYW1lXG4iKTsKKwkJCQlyZXR1cm4gMTsJLyogbmVlZHNfYXJnOyAqLworCQkJfQorCQkJLyogQkIgYXJlIHRoZXJlIGNhc2VzIGluIHdoaWNoIGEgY29tbWEgY2FuIGJlIHZhbGlkIGluCisJCQlhIGRvbWFpbiBuYW1lIGFuZCBuZWVkIHNwZWNpYWwgaGFuZGxpbmc/ICovCisJCQlpZiAoc3Rybmxlbih2YWx1ZSwgNjUpIDwgNjUpIHsKKwkJCQl2b2wtPmRvbWFpbm5hbWUgPSB2YWx1ZTsKKwkJCQljRllJKDEsICgiRG9tYWluIG5hbWUgc2V0IikpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDSUZTOiBkb21haW4gbmFtZSB0b28gbG9uZ1xuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgImlvY2hhcnNldCIsIDkpID09IDApIHsKKwkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNJRlM6IGludmFsaWQgaW9jaGFyc2V0IHNwZWNpZmllZFxuIik7CisJCQkJcmV0dXJuIDE7CS8qIG5lZWRzX2FyZzsgKi8KKwkJCX0KKwkJCWlmIChzdHJubGVuKHZhbHVlLCA2NSkgPCA2NSkgeworCQkJCWlmKHN0cm5pY21wKHZhbHVlLCJkZWZhdWx0Iiw3KSkKKwkJCQkJdm9sLT5pb2NoYXJzZXQgPSB2YWx1ZTsKKwkJCQkvKiBpZiBpb2NoYXJzZXQgbm90IHNldCBsb2FkX25sc19kZWZhdWx0IHVzZWQgYnkgY2FsbGVyICovCisJCQkJY0ZZSSgxLCAoImlvY2hhcnNldCBzZXQgdG8gJXMiLHZhbHVlKSk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNJRlM6IGlvY2hhcnNldCBuYW1lIHRvbyBsb25nLlxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgInVpZCIsIDMpID09IDApIHsKKwkJCWlmICh2YWx1ZSAmJiAqdmFsdWUpIHsKKwkJCQl2b2wtPmxpbnV4X3VpZCA9CisJCQkJCXNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmdmFsdWUsIDApOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJnaWQiLCAzKSA9PSAwKSB7CisJCQlpZiAodmFsdWUgJiYgKnZhbHVlKSB7CisJCQkJdm9sLT5saW51eF9naWQgPQorCQkJCQlzaW1wbGVfc3RydG91bCh2YWx1ZSwgJnZhbHVlLCAwKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAiZmlsZV9tb2RlIiwgNCkgPT0gMCkgeworCQkJaWYgKHZhbHVlICYmICp2YWx1ZSkgeworCQkJCXZvbC0+ZmlsZV9tb2RlID0KKwkJCQkJc2ltcGxlX3N0cnRvdWwodmFsdWUsICZ2YWx1ZSwgMCk7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgImRpcl9tb2RlIiwgNCkgPT0gMCkgeworCQkJaWYgKHZhbHVlICYmICp2YWx1ZSkgeworCQkJCXZvbC0+ZGlyX21vZGUgPQorCQkJCQlzaW1wbGVfc3RydG91bCh2YWx1ZSwgJnZhbHVlLCAwKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAiZGlybW9kZSIsIDQpID09IDApIHsKKwkJCWlmICh2YWx1ZSAmJiAqdmFsdWUpIHsKKwkJCQl2b2wtPmRpcl9tb2RlID0KKwkJCQkJc2ltcGxlX3N0cnRvdWwodmFsdWUsICZ2YWx1ZSwgMCk7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgInBvcnQiLCA0KSA9PSAwKSB7CisJCQlpZiAodmFsdWUgJiYgKnZhbHVlKSB7CisJCQkJdm9sLT5wb3J0ID0KKwkJCQkJc2ltcGxlX3N0cnRvdWwodmFsdWUsICZ2YWx1ZSwgMCk7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgInJzaXplIiwgNSkgPT0gMCkgeworCQkJaWYgKHZhbHVlICYmICp2YWx1ZSkgeworCQkJCXZvbC0+cnNpemUgPQorCQkJCQlzaW1wbGVfc3RydG91bCh2YWx1ZSwgJnZhbHVlLCAwKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAid3NpemUiLCA1KSA9PSAwKSB7CisJCQlpZiAodmFsdWUgJiYgKnZhbHVlKSB7CisJCQkJdm9sLT53c2l6ZSA9CisJCQkJCXNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmdmFsdWUsIDApOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJzb2Nrb3B0IiwgNSkgPT0gMCkgeworCQkJaWYgKHZhbHVlICYmICp2YWx1ZSkgeworCQkJCXZvbC0+c29ja29wdCA9CisJCQkJCXNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmdmFsdWUsIDApOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJuZXRiaW9zbmFtZSIsIDQpID09IDApIHsKKwkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSB8fCAoKnZhbHVlID09ICcgJykpIHsKKwkJCQljRllJKDEsKCJpbnZhbGlkIChlbXB0eSkgbmV0Ymlvc25hbWUgc3BlY2lmaWVkIikpOworCQkJfSBlbHNlIHsKKwkJCQltZW1zZXQodm9sLT5zb3VyY2VfcmZjMTAwMV9uYW1lLDB4MjAsMTUpOworCQkJCWZvcihpPTA7aTwxNTtpKyspIHsKKwkJCQkvKiBCQiBhcmUgdGhlcmUgY2FzZXMgaW4gd2hpY2ggYSBjb21tYSBjYW4gYmUgCisJCQkJdmFsaWQgaW4gdGhpcyB3b3Jrc3RhdGlvbiBuZXRiaW9zIG5hbWUgKGFuZCBuZWVkCisJCQkJc3BlY2lhbCBoYW5kbGluZyk/ICovCisKKwkJCQkvKiBXZSBkbyBub3QgdXBwZXJjYXNlIG5ldGJpb3NuYW1lIGZvciB1c2VyICovCisJCQkJCWlmICh2YWx1ZVtpXT09MCkKKwkJCQkJCWJyZWFrOworCQkJCQllbHNlIAorCQkJCQkJdm9sLT5zb3VyY2VfcmZjMTAwMV9uYW1lW2ldID0gdmFsdWVbaV07CisJCQkJfQorCQkJCS8qIFRoZSBzdHJpbmcgaGFzIDE2dGggYnl0ZSB6ZXJvIHN0aWxsIGZyb20KKwkJCQlzZXQgYXQgdG9wIG9mIHRoZSBmdW5jdGlvbiAgKi8KKwkJCQlpZigoaT09MTUpICYmICh2YWx1ZVtpXSAhPSAwKSkKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ0lGUzogbmV0Ymlvc25hbWUgbG9uZ2VyIHRoYW4gMTUgYW5kIHdhcyB0cnVuY2F0ZWQuXG4iKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAiY3JlZGVudGlhbHMiLCA0KSA9PSAwKSB7CisJCQkvKiBpZ25vcmUgKi8KKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAidmVyc2lvbiIsIDMpID09IDApIHsKKwkJCS8qIGlnbm9yZSAqLworCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJndWVzdCIsNSkgPT0gMCkgeworCQkJLyogaWdub3JlICovCisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgInJ3IiwgMikgPT0gMCkgeworCQkJdm9sLT5ydyA9IFRSVUU7CisJCX0gZWxzZSBpZiAoKHN0cm5pY21wKGRhdGEsICJzdWlkIiwgNCkgPT0gMCkgfHwKKwkJCQkgICAoc3RybmljbXAoZGF0YSwgIm5vc3VpZCIsIDYpID09IDApIHx8CisJCQkJICAgKHN0cm5pY21wKGRhdGEsICJleGVjIiwgNCkgPT0gMCkgfHwKKwkJCQkgICAoc3RybmljbXAoZGF0YSwgIm5vZXhlYyIsIDYpID09IDApIHx8CisJCQkJICAgKHN0cm5pY21wKGRhdGEsICJub2RldiIsIDUpID09IDApIHx8CisJCQkJICAgKHN0cm5pY21wKGRhdGEsICJub2F1dG8iLCA2KSA9PSAwKSB8fAorCQkJCSAgIChzdHJuaWNtcChkYXRhLCAiZGV2IiwgMykgPT0gMCkpIHsKKwkJCS8qICBUaGUgbW91bnQgdG9vbCBvciBtb3VudC5jaWZzIGhlbHBlciAoaWYgcHJlc2VudCkKKwkJCQl1c2VzIHRoZXNlIG9wdHMgdG8gc2V0IGZsYWdzLCBhbmQgdGhlIGZsYWdzIGFyZSByZWFkCisJCQkJYnkgdGhlIGtlcm5lbCB2ZnMgbGF5ZXIgYmVmb3JlIHdlIGdldCBoZXJlIChpZQorCQkJCWJlZm9yZSByZWFkIHN1cGVyKSBzbyB0aGVyZSBpcyBubyBwb2ludCB0cnlpbmcgdG8KKwkJCQlwYXJzZSB0aGVzZSBvcHRpb25zIGFnYWluIGFuZCBzZXQgYW55dGhpbmcgYW5kIGl0CisJCQkJaXMgb2sgdG8ganVzdCBpZ25vcmUgdGhlbSAqLworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgInJvIiwgMikgPT0gMCkgeworCQkJdm9sLT5ydyA9IEZBTFNFOworCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJoYXJkIiwgNCkgPT0gMCkgeworCQkJdm9sLT5yZXRyeSA9IDE7CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgInNvZnQiLCA0KSA9PSAwKSB7CisJCQl2b2wtPnJldHJ5ID0gMDsKKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAicGVybSIsIDQpID09IDApIHsKKwkJCXZvbC0+bm9wZXJtID0gMDsKKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAibm9wZXJtIiwgNikgPT0gMCkgeworCQkJdm9sLT5ub3Blcm0gPSAxOworCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJzZXR1aWRzIiwgNykgPT0gMCkgeworCQkJdm9sLT5zZXR1aWRzID0gMTsKKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAibm9zZXR1aWRzIiwgOSkgPT0gMCkgeworCQkJdm9sLT5zZXR1aWRzID0gMDsKKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAibm9oYXJkIiwgNikgPT0gMCkgeworCQkJdm9sLT5yZXRyeSA9IDA7CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgIm5vc29mdCIsIDYpID09IDApIHsKKwkJCXZvbC0+cmV0cnkgPSAxOworCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJub2ludHIiLCA2KSA9PSAwKSB7CisJCQl2b2wtPmludHIgPSAwOworCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJpbnRyIiwgNCkgPT0gMCkgeworCQkJdm9sLT5pbnRyID0gMTsKKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAic2VydmVyaW5vIiw3KSA9PSAwKSB7CisJCQl2b2wtPnNlcnZlcl9pbm8gPSAxOworCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJub3NlcnZlcmlubyIsOSkgPT0gMCkgeworCQkJdm9sLT5zZXJ2ZXJfaW5vID0gMDsKKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAiYWNsIiwzKSA9PSAwKSB7CisJCQl2b2wtPm5vX3BzeF9hY2wgPSAwOworCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJub2FjbCIsNSkgPT0gMCkgeworCQkJdm9sLT5ub19wc3hfYWNsID0gMTsKKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAiZGlyZWN0Iiw2KSA9PSAwKSB7CisJCQl2b2wtPmRpcmVjdF9pbyA9IDE7CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgImZvcmNlZGlyZWN0aW8iLDEzKSA9PSAwKSB7CisJCQl2b2wtPmRpcmVjdF9pbyA9IDE7CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgImluNl9hZGRyIiw4KSA9PSAwKSB7CisJCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKKwkJCQl2b2wtPmluNl9hZGRyID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoc3Rybmxlbih2YWx1ZSwgNDkpID09IDQ4KSB7CisJCQkJdm9sLT5pbjZfYWRkciA9IHZhbHVlOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDSUZTOiBpcCB2NiBhZGRyZXNzIG5vdCA0OCBjaGFyYWN0ZXJzIGxvbmdcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJub2FjIiwgNCkgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ0lGUzogTW91bnQgb3B0aW9uIG5vYWMgbm90IHN1cHBvcnRlZC4gSW5zdGVhZCBzZXQgL3Byb2MvZnMvY2lmcy9Mb29rdXBDYWNoZUVuYWJsZWQgdG8gMFxuIik7CisJCX0gZWxzZQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ0lGUzogVW5rbm93biBtb3VudCBvcHRpb24gJXNcbiIsZGF0YSk7CisJfQorCWlmICh2b2wtPlVOQyA9PSBOVUxMKSB7CisJCWlmKGRldm5hbWUgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ0lGUzogTWlzc2luZyBVTkMgbmFtZSBmb3IgbW91bnQgdGFyZ2V0XG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmICgodGVtcF9sZW4gPSBzdHJubGVuKGRldm5hbWUsIDMwMCkpIDwgMzAwKSB7CisJCQl2b2wtPlVOQyA9IGttYWxsb2ModGVtcF9sZW4rMSxHRlBfS0VSTkVMKTsKKwkJCWlmKHZvbC0+VU5DID09IE5VTEwpCisJCQkJcmV0dXJuIDE7CisJCQlzdHJjcHkodm9sLT5VTkMsZGV2bmFtZSk7CisJCQlpZiAoc3RybmNtcCh2b2wtPlVOQywgIi8vIiwgMikgPT0gMCkgeworCQkJCXZvbC0+VU5DWzBdID0gJ1xcJzsKKwkJCQl2b2wtPlVOQ1sxXSA9ICdcXCc7CisJCQl9IGVsc2UgaWYgKHN0cm5jbXAodm9sLT5VTkMsICJcXFxcIiwgMikgIT0gMCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNJRlM6IFVOQyBQYXRoIGRvZXMgbm90IGJlZ2luIHdpdGggLy8gb3IgXFxcXCBcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ0lGUzogVU5DIG5hbWUgdG9vIGxvbmdcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJaWYodm9sLT5VTkNpcCA9PSBOVUxMKQorCQl2b2wtPlVOQ2lwID0gJnZvbC0+VU5DWzJdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2lmc1Nlc0luZm8gKgorY2lmc19maW5kX3RjcF9zZXNzaW9uKHN0cnVjdCBpbl9hZGRyICogdGFyZ2V0X2lwX2FkZHIsIAorCQlzdHJ1Y3QgaW42X2FkZHIgKnRhcmdldF9pcDZfYWRkciwKKwkJIGNoYXIgKnVzZXJOYW1lLCBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICoqcHNydlRjcCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IGNpZnNTZXNJbmZvICpzZXM7CisJKnBzcnZUY3AgPSBOVUxMOworCXJlYWRfbG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJkdsb2JhbFNNQlNlc3Npb25MaXN0KSB7CisJCXNlcyA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2lmc1Nlc0luZm8sIGNpZnNTZXNzaW9uTGlzdCk7CisJCWlmIChzZXMtPnNlcnZlcikgeworCQkJaWYoKHRhcmdldF9pcF9hZGRyICYmIAorCQkJCShzZXMtPnNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fYWRkci5zX2FkZHIKKwkJCQkgID09IHRhcmdldF9pcF9hZGRyLT5zX2FkZHIpKSB8fCAodGFyZ2V0X2lwNl9hZGRyCisJCQkJJiYgbWVtY21wKCZzZXMtPnNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9hZGRyLAorCQkJCQl0YXJnZXRfaXA2X2FkZHIsc2l6ZW9mKCp0YXJnZXRfaXA2X2FkZHIpKSkpeworCQkJCS8qIEJCIGxvY2sgc2VydmVyIGFuZCB0Y3Agc2Vzc2lvbiBhbmQgaW5jcmVtZW50IHVzZSBjb3VudCBoZXJlPz8gKi8KKwkJCQkqcHNydlRjcCA9IHNlcy0+c2VydmVyOwkvKiBmb3VuZCBhIG1hdGNoIG9uIHRoZSBUQ1Agc2Vzc2lvbiAqLworCQkJCS8qIEJCIGNoZWNrIGlmIHJlY29ubmVjdGlvbiBuZWVkZWQgKi8KKwkJCQlpZiAoc3RybmNtcAorCQkJCSAgICAoc2VzLT51c2VyTmFtZSwgdXNlck5hbWUsCisJCQkJICAgICBNQVhfVVNFUk5BTUVfU0laRSkgPT0gMCl7CisJCQkJCXJlYWRfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwkJCQkJcmV0dXJuIHNlczsJLyogZm91bmQgZXhhY3QgbWF0Y2ggb24gYm90aCB0Y3AgYW5kIFNNQiBzZXNzaW9ucyAqLworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBlbHNlIHRjcCBhbmQgc21iIHNlc3Npb25zIG5lZWQgcmVjb25uZWN0aW9uICovCisJfQorCXJlYWRfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBjaWZzVGNvbkluZm8gKgorZmluZF91bmMoX19iZTMyIG5ld190YXJnZXRfaXBfYWRkciwgY2hhciAqdW5jTmFtZSwgY2hhciAqdXNlck5hbWUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb247CisKKwlyZWFkX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCWxpc3RfZm9yX2VhY2godG1wLCAmR2xvYmFsVHJlZUNvbm5lY3Rpb25MaXN0KSB7CisJCWNGWUkoMSwgKCJOZXh0IHRjb24gLSAiKSk7CisJCXRjb24gPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNpZnNUY29uSW5mbywgY2lmc0Nvbm5lY3Rpb25MaXN0KTsKKwkJaWYgKHRjb24tPnNlcykgeworCQkJaWYgKHRjb24tPnNlcy0+c2VydmVyKSB7CisJCQkJY0ZZSSgxLAorCQkJCSAgICAgKCIgb2xkIGlwIGFkZHI6ICV4ID09IG5ldyBpcCAleCA/IiwKKwkJCQkgICAgICB0Y29uLT5zZXMtPnNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fYWRkci4KKwkJCQkgICAgICBzX2FkZHIsIG5ld190YXJnZXRfaXBfYWRkcikpOworCQkJCWlmICh0Y29uLT5zZXMtPnNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fYWRkci4KKwkJCQkgICAgc19hZGRyID09IG5ld190YXJnZXRfaXBfYWRkcikgeworCS8qIEJCIGxvY2sgdGNvbiBhbmQgc2VydmVyIGFuZCB0Y3Agc2Vzc2lvbiBhbmQgaW5jcmVtZW50IHVzZSBjb3VudCBoZXJlPyAqLworCQkJCQkvKiBmb3VuZCBhIG1hdGNoIG9uIHRoZSBUQ1Agc2Vzc2lvbiAqLworCQkJCQkvKiBCQiBjaGVjayBpZiByZWNvbm5lY3Rpb24gbmVlZGVkICovCisJCQkJCWNGWUkoMSwoIk1hdGNoZWQgaXAsIG9sZCBVTkM6ICVzID09IG5ldzogJXMgPyIsCisJCQkJCSAgICAgIHRjb24tPnRyZWVOYW1lLCB1bmNOYW1lKSk7CisJCQkJCWlmIChzdHJuY21wCisJCQkJCSAgICAodGNvbi0+dHJlZU5hbWUsIHVuY05hbWUsCisJCQkJCSAgICAgTUFYX1RSRUVfU0laRSkgPT0gMCkgeworCQkJCQkJY0ZZSSgxLAorCQkJCQkJICAgICAoIk1hdGNoZWQgVU5DLCBvbGQgdXNlcjogJXMgPT0gbmV3OiAlcyA/IiwKKwkJCQkJCSAgICAgIHRjb24tPnRyZWVOYW1lLCB1bmNOYW1lKSk7CisJCQkJCQlpZiAoc3RybmNtcAorCQkJCQkJICAgICh0Y29uLT5zZXMtPnVzZXJOYW1lLAorCQkJCQkJICAgICB1c2VyTmFtZSwKKwkJCQkJCSAgICAgTUFYX1VTRVJOQU1FX1NJWkUpID09IDApIHsKKwkJCQkJCQlyZWFkX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJCQkJCQkJcmV0dXJuIHRjb247LyogYWxzbyBtYXRjaGVkIHVzZXIgKHNtYiBzZXNzaW9uKSovCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmVhZF91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCXJldHVybiBOVUxMOworfQorCitpbnQKK2Nvbm5lY3RfdG9fZGZzX3BhdGgoaW50IHhpZCwgc3RydWN0IGNpZnNTZXNJbmZvICpwU2VzSW5mbywKKwkJICAgIGNvbnN0IGNoYXIgKm9sZF9wYXRoLCBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisJdW5zaWduZWQgY2hhciAqcmVmZXJyYWxzID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgbnVtX3JlZmVycmFsczsKKwlpbnQgcmMgPSAwOworCisJcmMgPSBnZXRfZGZzX3BhdGgoeGlkLCBwU2VzSW5mbyxvbGRfcGF0aCwgbmxzX2NvZGVwYWdlLCAKKwkJCSZudW1fcmVmZXJyYWxzLCAmcmVmZXJyYWxzKTsKKworCS8qIEJCIEFkZCBpbiBjb2RlIHRvOiBpZiB2YWxpZCByZWZybCwgaWYgbm90IGlwIGFkZHJlc3MgY29udGFjdAorCQl0aGUgaGVscGVyIHRoYXQgcmVzb2x2ZXMgdGNwIG5hbWVzLCBtb3VudCB0byBpdCwgdHJ5IHRvIAorCQl0Y29uIHRvIGl0IHVubW91bnQgaXQgaWYgZmFpbCAqLworCisJaWYocmVmZXJyYWxzKQorCQlrZnJlZShyZWZlcnJhbHMpOworCisJcmV0dXJuIHJjOworfQorCitpbnQKK2dldF9kZnNfcGF0aChpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Nlc0luZm8gKnBTZXNJbmZvLAorCQkJY29uc3QgY2hhciAqb2xkX3BhdGgsIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSwgCisJCQl1bnNpZ25lZCBpbnQgKnBudW1fcmVmZXJyYWxzLCB1bnNpZ25lZCBjaGFyICoqIHByZWZlcnJhbHMpCit7CisJY2hhciAqdGVtcF91bmM7CisJaW50IHJjID0gMDsKKworCSpwbnVtX3JlZmVycmFscyA9IDA7CisKKwlpZiAocFNlc0luZm8tPmlwY190aWQgPT0gMCkgeworCQl0ZW1wX3VuYyA9IGttYWxsb2MoMiAvKiBmb3Igc2xhc2hlcyAqLyArCisJCQlzdHJubGVuKHBTZXNJbmZvLT5zZXJ2ZXJOYW1lLFNFUlZFUl9OQU1FX0xFTl9XSVRIX05VTEwgKiAyKQorCQkJCSArIDEgKyA0IC8qIHNsYXNoIElQQyQgKi8gICsgMiwKKwkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKHRlbXBfdW5jID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJdGVtcF91bmNbMF0gPSAnXFwnOworCQl0ZW1wX3VuY1sxXSA9ICdcXCc7CisJCXN0cmNweSh0ZW1wX3VuYyArIDIsIHBTZXNJbmZvLT5zZXJ2ZXJOYW1lKTsKKwkJc3RyY3B5KHRlbXBfdW5jICsgMiArIHN0cmxlbihwU2VzSW5mby0+c2VydmVyTmFtZSksICJcXElQQyQiKTsKKwkJcmMgPSBDSUZTVENvbih4aWQsIHBTZXNJbmZvLCB0ZW1wX3VuYywgTlVMTCwgbmxzX2NvZGVwYWdlKTsKKwkJY0ZZSSgxLAorCQkgICAgICgiQ0lGUyBUY29uIHJjID0gJWQgaXBjX3RpZCA9ICVkIiwgcmMscFNlc0luZm8tPmlwY190aWQpKTsKKwkJa2ZyZWUodGVtcF91bmMpOworCX0KKwlpZiAocmMgPT0gMCkKKwkJcmMgPSBDSUZTR2V0REZTUmVmZXIoeGlkLCBwU2VzSW5mbywgb2xkX3BhdGgsIHByZWZlcnJhbHMsCisJCQkJICAgICBwbnVtX3JlZmVycmFscywgbmxzX2NvZGVwYWdlKTsKKworCXJldHVybiByYzsKK30KKworLyogU2VlIFJGQzEwMDEgc2VjdGlvbiAxNCBvbiByZXByZXNlbnRhdGlvbiBvZiBOZXRiaW9zIG5hbWVzICovCitzdGF0aWMgdm9pZCByZmMxMDAybWFuZ2xlKGNoYXIgKiB0YXJnZXQsY2hhciAqIHNvdXJjZSwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwl1bnNpZ25lZCBpbnQgaSxqOworCisJZm9yKGk9MCxqPTA7aTwobGVuZ3RoKTtpKyspIHsKKwkJLyogbWFzayBhIG5pYmJsZSBhdCBhIHRpbWUgYW5kIGVuY29kZSAqLworCQl0YXJnZXRbal0gPSAnQScgKyAoMHgwRiAmIChzb3VyY2VbaV0gPj4gNCkpOworCQl0YXJnZXRbaisxXSA9ICdBJyArICgweDBGICYgc291cmNlW2ldKTsKKwkJais9MjsKKwl9CisKK30KKworCitzdGF0aWMgaW50CitpcHY0X2Nvbm5lY3Qoc3RydWN0IHNvY2thZGRyX2luICpwc2luX3NlcnZlciwgc3RydWN0IHNvY2tldCAqKmNzb2NrZXQsIAorCQkJIGNoYXIgKiBuZXRiaW9zX25hbWUpCit7CisJaW50IHJjID0gMDsKKwlpbnQgY29ubmVjdGVkID0gMDsKKwlfX2JlMTYgb3JpZ19wb3J0ID0gMDsKKworCWlmKCpjc29ja2V0ID09IE5VTEwpIHsKKwkJcmMgPSBzb2NrX2NyZWF0ZV9rZXJuKFBGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgY3NvY2tldCk7CisJCWlmIChyYyA8IDApIHsKKwkJCWNFUlJPUigxLCAoIkVycm9yICVkIGNyZWF0aW5nIHNvY2tldCIscmMpKTsKKwkJCSpjc29ja2V0ID0gTlVMTDsKKwkJCXJldHVybiByYzsKKwkJfSBlbHNlIHsKKwkJLyogQkIgb3RoZXIgc29ja2V0IG9wdGlvbnMgdG8gc2V0IEtFRVBBTElWRSwgTk9ERUxBWT8gKi8KKwkJCWNGWUkoMSwoIlNvY2tldCBjcmVhdGVkIikpOworCQkJKCpjc29ja2V0KS0+c2stPnNrX2FsbG9jYXRpb24gPSBHRlBfTk9GUzsgCisJCX0KKwl9CisKKwlwc2luX3NlcnZlci0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJaWYocHNpbl9zZXJ2ZXItPnNpbl9wb3J0KSB7IC8qIHVzZXIgb3ZlcnJvZGUgZGVmYXVsdCBwb3J0ICovCisJCXJjID0gKCpjc29ja2V0KS0+b3BzLT5jb25uZWN0KCpjc29ja2V0LAorCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikgcHNpbl9zZXJ2ZXIsCisJCQkJc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaW4pLDApOworCQlpZiAocmMgPj0gMCkKKwkJCWNvbm5lY3RlZCA9IDE7CisJfSAKKworCWlmKCFjb25uZWN0ZWQpIHsKKwkJLyogc2F2ZSBvcmlnaW5hbCBwb3J0IHNvIHdlIGNhbiByZXRyeSB1c2VyIHNwZWNpZmllZCBwb3J0ICAKKwkJCWxhdGVyIGlmIGZhbGwgYmFjayBwb3J0cyBmYWlsIHRoaXMgdGltZSAgKi8KKwkJb3JpZ19wb3J0ID0gcHNpbl9zZXJ2ZXItPnNpbl9wb3J0OworCisJCS8qIGRvIG5vdCByZXRyeSBvbiB0aGUgc2FtZSBwb3J0IHdlIGp1c3QgZmFpbGVkIG9uICovCisJCWlmKHBzaW5fc2VydmVyLT5zaW5fcG9ydCAhPSBodG9ucyhDSUZTX1BPUlQpKSB7CisJCQlwc2luX3NlcnZlci0+c2luX3BvcnQgPSBodG9ucyhDSUZTX1BPUlQpOworCisJCQlyYyA9ICgqY3NvY2tldCktPm9wcy0+Y29ubmVjdCgqY3NvY2tldCwKKwkJCQkJKHN0cnVjdCBzb2NrYWRkciAqKSBwc2luX3NlcnZlciwKKwkJCQkJc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaW4pLDApOworCQkJaWYgKHJjID49IDApCisJCQkJY29ubmVjdGVkID0gMTsKKwkJfQorCX0KKwlpZiAoIWNvbm5lY3RlZCkgeworCQlwc2luX3NlcnZlci0+c2luX3BvcnQgPSBodG9ucyhSRkMxMDAxX1BPUlQpOworCQlyYyA9ICgqY3NvY2tldCktPm9wcy0+Y29ubmVjdCgqY3NvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKQorCQkJCQkgICAgICBwc2luX3NlcnZlciwgc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaW4pLDApOworCQlpZiAocmMgPj0gMCkgCisJCQljb25uZWN0ZWQgPSAxOworCX0KKworCS8qIGdpdmUgdXAgaGVyZSAtIHVubGVzcyB3ZSB3YW50IHRvIHJldHJ5IG9uIGRpZmZlcmVudAorCQlwcm90b2NvbCBmYW1pbGllcyBzb21lIGRheSAqLworCWlmICghY29ubmVjdGVkKSB7CisJCWlmKG9yaWdfcG9ydCkKKwkJCXBzaW5fc2VydmVyLT5zaW5fcG9ydCA9IG9yaWdfcG9ydDsKKwkJY0ZZSSgxLCgiRXJyb3IgJWQgY29ubmVjdGluZyB0byBzZXJ2ZXIgdmlhIGlwdjQiLHJjKSk7CisJCXNvY2tfcmVsZWFzZSgqY3NvY2tldCk7CisJCSpjc29ja2V0ID0gTlVMTDsKKwkJcmV0dXJuIHJjOworCX0KKwkvKiBFdmVudHVhbGx5IGNoZWNrIGZvciBvdGhlciBzb2NrZXQgb3B0aW9ucyB0byBjaGFuZ2UgZnJvbSAKKwkJdGhlIGRlZmF1bHQuIHNvY2tfc2V0c29ja29wdCBub3QgdXNlZCBiZWNhdXNlIGl0IGV4cGVjdHMgCisJCXVzZXIgc3BhY2UgYnVmZmVyICovCisJKCpjc29ja2V0KS0+c2stPnNrX3JjdnRpbWVvID0gNyAqIEhaOworCisJLyogc2VuZCBSRkMxMDAxIHNlc3Npbml0ICovCisKKwlpZihwc2luX3NlcnZlci0+c2luX3BvcnQgPT0gaHRvbnMoUkZDMTAwMV9QT1JUKSkgeworCQkvKiBzb21lIHNlcnZlcnMgcmVxdWlyZSBSRkMxMDAxIHNlc3Npbml0IGJlZm9yZSBzZW5kaW5nCisJCW5lZ3Byb3QgLSBCQiBjaGVjayByZWNvbm5lY3Rpb24gaW4gY2FzZSB3aGVyZSBzZWNvbmQgCisJCXNlc3Npbml0IGlzIHNlbnQgYnV0IG5vIHNlY29uZCBuZWdwcm90ICovCisJCXN0cnVjdCByZmMxMDAyX3Nlc3Npb25fcGFja2V0ICogc2VzX2luaXRfYnVmOworCQlzdHJ1Y3Qgc21iX2hkciAqIHNtYl9idWY7CisJCXNlc19pbml0X2J1ZiA9IGNpZnNfa2NhbGxvYyhzaXplb2Yoc3RydWN0IHJmYzEwMDJfc2Vzc2lvbl9wYWNrZXQpLCBHRlBfS0VSTkVMKTsKKwkJaWYoc2VzX2luaXRfYnVmKSB7CisJCQlzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuY2FsbGVkX2xlbiA9IDMyOworCQkJcmZjMTAwMm1hbmdsZShzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuY2FsbGVkX25hbWUsCisJCQkJREVGQVVMVF9DSUZTX0NBTExFRF9OQU1FLDE2KTsKKwkJCXNlc19pbml0X2J1Zi0+dHJhaWxlci5zZXNzaW9uX3JlcS5jYWxsaW5nX2xlbiA9IDMyOworCQkJLyogY2FsbGluZyBuYW1lIGVuZHMgaW4gbnVsbCAoYnl0ZSAxNikgZnJvbSBvbGQgc21iCisJCQljb252ZW50aW9uLiAqLworCQkJaWYobmV0Ymlvc19uYW1lICYmIChuZXRiaW9zX25hbWVbMF0gIT0wKSkgeworCQkJCXJmYzEwMDJtYW5nbGUoc2VzX2luaXRfYnVmLT50cmFpbGVyLnNlc3Npb25fcmVxLmNhbGxpbmdfbmFtZSwKKwkJCQkJbmV0Ymlvc19uYW1lLDE2KTsKKwkJCX0gZWxzZSB7CisJCQkJcmZjMTAwMm1hbmdsZShzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuY2FsbGluZ19uYW1lLAorCQkJCQkiTElOVVhfQ0lGU19DTE5UIiwxNik7CisJCQl9CisJCQlzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuc2NvcGUxID0gMDsKKwkJCXNlc19pbml0X2J1Zi0+dHJhaWxlci5zZXNzaW9uX3JlcS5zY29wZTIgPSAwOworCQkJc21iX2J1ZiA9IChzdHJ1Y3Qgc21iX2hkciAqKXNlc19pbml0X2J1ZjsKKwkJCS8qIHNpemVvZiBSRkMxMDAyX1NFU1NJT05fUkVRVUVTVCB3aXRoIG5vIHNjb3BlICovCisJCQlzbWJfYnVmLT5zbWJfYnVmX2xlbmd0aCA9IDB4ODEwMDAwNDQ7CisJCQlyYyA9IHNtYl9zZW5kKCpjc29ja2V0LCBzbWJfYnVmLCAweDQ0LAorCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKilwc2luX3NlcnZlcik7CisJCQlrZnJlZShzZXNfaW5pdF9idWYpOworCQl9CisJCS8qIGVsc2UgdGhlIG5lZ3Byb3QgbWF5IHN0aWxsIHdvcmsgd2l0aG91dCB0aGlzIAorCQlldmVuIHRob3VnaCBtYWxsb2MgZmFpbGVkICovCisJCQorCX0KKwkJCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitpcHY2X2Nvbm5lY3Qoc3RydWN0IHNvY2thZGRyX2luNiAqcHNpbl9zZXJ2ZXIsIHN0cnVjdCBzb2NrZXQgKipjc29ja2V0KQoreworCWludCByYyA9IDA7CisJaW50IGNvbm5lY3RlZCA9IDA7CisJX19iZTE2IG9yaWdfcG9ydCA9IDA7CisKKwlpZigqY3NvY2tldCA9PSBOVUxMKSB7CisJCXJjID0gc29ja19jcmVhdGVfa2VybihQRl9JTkVUNiwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQLCBjc29ja2V0KTsKKwkJaWYgKHJjIDwgMCkgeworCQkJY0VSUk9SKDEsICgiRXJyb3IgJWQgY3JlYXRpbmcgaXB2NiBzb2NrZXQiLHJjKSk7CisJCQkqY3NvY2tldCA9IE5VTEw7CisJCQlyZXR1cm4gcmM7CisJCX0gZWxzZSB7CisJCS8qIEJCIG90aGVyIHNvY2tldCBvcHRpb25zIHRvIHNldCBLRUVQQUxJVkUsIE5PREVMQVk/ICovCisJCQkgY0ZZSSgxLCgiaXB2NiBTb2NrZXQgY3JlYXRlZCIpKTsKKwkJCSgqY3NvY2tldCktPnNrLT5za19hbGxvY2F0aW9uID0gR0ZQX05PRlM7CisJCX0KKwl9CisKKwlwc2luX3NlcnZlci0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKworCWlmKHBzaW5fc2VydmVyLT5zaW42X3BvcnQpIHsgLyogdXNlciBvdmVycm9kZSBkZWZhdWx0IHBvcnQgKi8KKwkJcmMgPSAoKmNzb2NrZXQpLT5vcHMtPmNvbm5lY3QoKmNzb2NrZXQsCisJCQkJKHN0cnVjdCBzb2NrYWRkciAqKSBwc2luX3NlcnZlciwKKwkJCQlzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9pbjYpLDApOworCQlpZiAocmMgPj0gMCkKKwkJCWNvbm5lY3RlZCA9IDE7CisJfSAKKworCWlmKCFjb25uZWN0ZWQpIHsKKwkJLyogc2F2ZSBvcmlnaW5hbCBwb3J0IHNvIHdlIGNhbiByZXRyeSB1c2VyIHNwZWNpZmllZCBwb3J0ICAKKwkJCWxhdGVyIGlmIGZhbGwgYmFjayBwb3J0cyBmYWlsIHRoaXMgdGltZSAgKi8KKworCQlvcmlnX3BvcnQgPSBwc2luX3NlcnZlci0+c2luNl9wb3J0OworCQkvKiBkbyBub3QgcmV0cnkgb24gdGhlIHNhbWUgcG9ydCB3ZSBqdXN0IGZhaWxlZCBvbiAqLworCQlpZihwc2luX3NlcnZlci0+c2luNl9wb3J0ICE9IGh0b25zKENJRlNfUE9SVCkpIHsKKwkJCXBzaW5fc2VydmVyLT5zaW42X3BvcnQgPSBodG9ucyhDSUZTX1BPUlQpOworCisJCQlyYyA9ICgqY3NvY2tldCktPm9wcy0+Y29ubmVjdCgqY3NvY2tldCwKKwkJCQkJKHN0cnVjdCBzb2NrYWRkciAqKSBwc2luX3NlcnZlciwKKwkJCQkJc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaW42KSwwKTsKKwkJCWlmIChyYyA+PSAwKQorCQkJCWNvbm5lY3RlZCA9IDE7CisJCX0KKwl9CisJaWYgKCFjb25uZWN0ZWQpIHsKKwkJcHNpbl9zZXJ2ZXItPnNpbjZfcG9ydCA9IGh0b25zKFJGQzEwMDFfUE9SVCk7CisJCXJjID0gKCpjc29ja2V0KS0+b3BzLT5jb25uZWN0KCpjc29ja2V0LCAoc3RydWN0IHNvY2thZGRyICopCisJCQkJCSBwc2luX3NlcnZlciwgc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaW42KSwwKTsKKwkJaWYgKHJjID49IDApIAorCQkJY29ubmVjdGVkID0gMTsKKwl9CisKKwkvKiBnaXZlIHVwIGhlcmUgLSB1bmxlc3Mgd2Ugd2FudCB0byByZXRyeSBvbiBkaWZmZXJlbnQKKwkJcHJvdG9jb2wgZmFtaWxpZXMgc29tZSBkYXkgKi8KKwlpZiAoIWNvbm5lY3RlZCkgeworCQlpZihvcmlnX3BvcnQpCisJCQlwc2luX3NlcnZlci0+c2luNl9wb3J0ID0gb3JpZ19wb3J0OworCQljRllJKDEsKCJFcnJvciAlZCBjb25uZWN0aW5nIHRvIHNlcnZlciB2aWEgaXB2NiIscmMpKTsKKwkJc29ja19yZWxlYXNlKCpjc29ja2V0KTsKKwkJKmNzb2NrZXQgPSBOVUxMOworCQlyZXR1cm4gcmM7CisJfQorCS8qIEV2ZW50dWFsbHkgY2hlY2sgZm9yIG90aGVyIHNvY2tldCBvcHRpb25zIHRvIGNoYW5nZSBmcm9tIAorCQl0aGUgZGVmYXVsdC4gc29ja19zZXRzb2Nrb3B0IG5vdCB1c2VkIGJlY2F1c2UgaXQgZXhwZWN0cyAKKwkJdXNlciBzcGFjZSBidWZmZXIgKi8KKwkoKmNzb2NrZXQpLT5zay0+c2tfcmN2dGltZW8gPSA3ICogSFo7CisJCQorCXJldHVybiByYzsKK30KKworaW50CitjaWZzX21vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IsCisJICAgY2hhciAqbW91bnRfZGF0YSwgY29uc3QgY2hhciAqZGV2bmFtZSkKK3sKKwlpbnQgcmMgPSAwOworCWludCB4aWQ7CisJaW50IGFkZHJlc3NfdHlwZSA9IEFGX0lORVQ7CisJc3RydWN0IHNvY2tldCAqY3NvY2tldCA9IE5VTEw7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbl9zZXJ2ZXI7CisJc3RydWN0IHNvY2thZGRyX2luNiBzaW5fc2VydmVyNjsKKwlzdHJ1Y3Qgc21iX3ZvbCB2b2x1bWVfaW5mbzsKKwlzdHJ1Y3QgY2lmc1Nlc0luZm8gKnBTZXNJbmZvID0gTlVMTDsKKwlzdHJ1Y3QgY2lmc1Nlc0luZm8gKmV4aXN0aW5nQ2lmc1NlcyA9IE5VTEw7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiA9IE5VTEw7CisJc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc3J2VGNwID0gTlVMTDsKKworCXhpZCA9IEdldFhpZCgpOworCisvKiBjRllJKDEsICgiRW50ZXJpbmcgY2lmc19tb3VudC4gWGlkOiAlZCB3aXRoOiAlcyIsIHhpZCwgbW91bnRfZGF0YSkpOyAqLworCQorCW1lbXNldCgmdm9sdW1lX2luZm8sMCxzaXplb2Yoc3RydWN0IHNtYl92b2wpKTsKKwlpZiAoY2lmc19wYXJzZV9tb3VudF9vcHRpb25zKG1vdW50X2RhdGEsIGRldm5hbWUsICZ2b2x1bWVfaW5mbykpIHsKKwkJaWYodm9sdW1lX2luZm8uVU5DKQorCQkJa2ZyZWUodm9sdW1lX2luZm8uVU5DKTsKKwkJaWYodm9sdW1lX2luZm8ucGFzc3dvcmQpCisJCQlrZnJlZSh2b2x1bWVfaW5mby5wYXNzd29yZCk7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHZvbHVtZV9pbmZvLnVzZXJuYW1lKSB7CisJCS8qIEJCIGZpeG1lIHBhcnNlIGZvciBkb21haW4gbmFtZSBoZXJlICovCisJCWNGWUkoMSwgKCJVc2VybmFtZTogJXMgIiwgdm9sdW1lX2luZm8udXNlcm5hbWUpKTsKKworCX0gZWxzZSB7CisJCWNpZnNlcnJvcigiTm8gdXNlcm5hbWUgc3BlY2lmaWVkICIpOworICAgICAgICAvKiBJbiB1c2Vyc3BhY2UgbW91bnQgaGVscGVyIHdlIGNhbiBnZXQgdXNlciBuYW1lIGZyb20gYWx0ZXJuYXRlCisgICAgICAgICAgIGxvY2F0aW9ucyBzdWNoIGFzIGVudiB2YXJpYWJsZXMgYW5kIGZpbGVzIG9uIGRpc2sgKi8KKwkJaWYodm9sdW1lX2luZm8uVU5DKQorCQkJa2ZyZWUodm9sdW1lX2luZm8uVU5DKTsKKwkJaWYodm9sdW1lX2luZm8ucGFzc3dvcmQpCisJCQlrZnJlZSh2b2x1bWVfaW5mby5wYXNzd29yZCk7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHZvbHVtZV9pbmZvLlVOQ2lwICYmIHZvbHVtZV9pbmZvLlVOQykgeworCQlyYyA9IGNpZnNfaW5ldF9wdG9uKEFGX0lORVQsIHZvbHVtZV9pbmZvLlVOQ2lwLCZzaW5fc2VydmVyLnNpbl9hZGRyLnNfYWRkcik7CisKKwkJaWYocmMgPD0gMCkgeworCQkJLyogbm90IGlwdjQgYWRkcmVzcywgdHJ5IGlwdjYgKi8KKwkJCXJjID0gY2lmc19pbmV0X3B0b24oQUZfSU5FVDYsdm9sdW1lX2luZm8uVU5DaXAsJnNpbl9zZXJ2ZXI2LnNpbjZfYWRkci5pbjZfdSk7IAorCQkJaWYocmMgPiAwKQorCQkJCWFkZHJlc3NfdHlwZSA9IEFGX0lORVQ2OworCQl9IGVsc2UgeworCQkJYWRkcmVzc190eXBlID0gQUZfSU5FVDsKKwkJfQorICAgICAgIAorCQlpZihyYyA8PSAwKSB7CisJCQkvKiB3ZSBmYWlsZWQgdHJhbnNsYXRpbmcgYWRkcmVzcyAqLworCQkJaWYodm9sdW1lX2luZm8uVU5DKQorCQkJCWtmcmVlKHZvbHVtZV9pbmZvLlVOQyk7CisJCQlpZih2b2x1bWVfaW5mby5wYXNzd29yZCkKKwkJCQlrZnJlZSh2b2x1bWVfaW5mby5wYXNzd29yZCk7CisJCQlGcmVlWGlkKHhpZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWNGWUkoMSwgKCJVTkM6ICVzIGlwOiAlcyIsIHZvbHVtZV9pbmZvLlVOQywgdm9sdW1lX2luZm8uVU5DaXApKTsKKwkJLyogc3VjY2VzcyAqLworCQlyYyA9IDA7CisJfSBlbHNlIGlmICh2b2x1bWVfaW5mby5VTkNpcCl7CisJCS8qIEJCIHVzaW5nIGlwIGFkZHIgYXMgc2VydmVyIG5hbWUgY29ubmVjdCB0byB0aGUgREZTIHJvb3QgYmVsb3cgKi8KKwkJY0VSUk9SKDEsKCJDb25uZWN0aW5nIHRvIERGUyByb290IG5vdCBpbXBsZW1lbnRlZCB5ZXQiKSk7CisJCWlmKHZvbHVtZV9pbmZvLlVOQykKKwkJCWtmcmVlKHZvbHVtZV9pbmZvLlVOQyk7CisJCWlmKHZvbHVtZV9pbmZvLnBhc3N3b3JkKQorCQkJa2ZyZWUodm9sdW1lX2luZm8ucGFzc3dvcmQpOworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSAvKiB3aGljaCBzZXJ2ZXJzIERGUyByb290IHdvdWxkIHdlIGNvbmVjdCB0byAqLyB7CisJCWNFUlJPUigxLAorCQkgICAgICAgKCJDSUZTIG1vdW50IGVycm9yOiBObyBVTkMgcGF0aCAoZS5nLiAtbyB1bmM9Ly8xOTIuMTY4LjEuMTAwL3B1YmxpYykgc3BlY2lmaWVkICAiKSk7CisJCWlmKHZvbHVtZV9pbmZvLlVOQykKKwkJCWtmcmVlKHZvbHVtZV9pbmZvLlVOQyk7CisJCWlmKHZvbHVtZV9pbmZvLnBhc3N3b3JkKQorCQkJa2ZyZWUodm9sdW1lX2luZm8ucGFzc3dvcmQpOworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHRoaXMgaXMgbmVlZGVkIGZvciBBU0NJSSBjcCB0byBVbmljb2RlIGNvbnZlcnRzICovCisJaWYodm9sdW1lX2luZm8uaW9jaGFyc2V0ID09IE5VTEwpIHsKKwkJY2lmc19zYi0+bG9jYWxfbmxzID0gbG9hZF9ubHNfZGVmYXVsdCgpOworCS8qIGxvYWRfbmxzX2RlZmF1bHQgY2FuIG5vdCByZXR1cm4gbnVsbCAqLworCX0gZWxzZSB7CisJCWNpZnNfc2ItPmxvY2FsX25scyA9IGxvYWRfbmxzKHZvbHVtZV9pbmZvLmlvY2hhcnNldCk7CisJCWlmKGNpZnNfc2ItPmxvY2FsX25scyA9PSBOVUxMKSB7CisJCQljRVJST1IoMSwoIkNJRlMgbW91bnQgZXJyb3I6IGlvY2hhcnNldCAlcyBub3QgZm91bmQiLHZvbHVtZV9pbmZvLmlvY2hhcnNldCkpOworCQkJaWYodm9sdW1lX2luZm8uVU5DKQorCQkJCWtmcmVlKHZvbHVtZV9pbmZvLlVOQyk7CisJCQlpZih2b2x1bWVfaW5mby5wYXNzd29yZCkKKwkJCQlrZnJlZSh2b2x1bWVfaW5mby5wYXNzd29yZCk7CisJCQlGcmVlWGlkKHhpZCk7CisJCQlyZXR1cm4gLUVMSUJBQ0M7CisJCX0KKwl9CisKKwlpZihhZGRyZXNzX3R5cGUgPT0gQUZfSU5FVCkKKwkJZXhpc3RpbmdDaWZzU2VzID0gY2lmc19maW5kX3RjcF9zZXNzaW9uKCZzaW5fc2VydmVyLnNpbl9hZGRyLAorCQkJTlVMTCAvKiBubyBpcHY2IGFkZHIgKi8sCisJCQl2b2x1bWVfaW5mby51c2VybmFtZSwgJnNydlRjcCk7CisJZWxzZSBpZihhZGRyZXNzX3R5cGUgPT0gQUZfSU5FVDYpCisJCWV4aXN0aW5nQ2lmc1NlcyA9IGNpZnNfZmluZF90Y3Bfc2Vzc2lvbihOVUxMIC8qIG5vIGlwdjQgYWRkciAqLywKKwkJCSZzaW5fc2VydmVyNi5zaW42X2FkZHIsCisJCQl2b2x1bWVfaW5mby51c2VybmFtZSwgJnNydlRjcCk7CisJZWxzZSB7CisJCWlmKHZvbHVtZV9pbmZvLlVOQykKKwkJCWtmcmVlKHZvbHVtZV9pbmZvLlVOQyk7CisJCWlmKHZvbHVtZV9pbmZvLnBhc3N3b3JkKQorCQkJa2ZyZWUodm9sdW1lX2luZm8ucGFzc3dvcmQpOworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCisJaWYgKHNydlRjcCkgeworCQljRllJKDEsICgiRXhpc3RpbmcgdGNwIHNlc3Npb24gd2l0aCBzZXJ2ZXIgZm91bmQgIikpOyAgICAgICAgICAgICAgICAKKwl9IGVsc2UgewkvKiBjcmVhdGUgc29ja2V0ICovCisJCWlmKHZvbHVtZV9pbmZvLnBvcnQpCisJCQlzaW5fc2VydmVyLnNpbl9wb3J0ID0gaHRvbnModm9sdW1lX2luZm8ucG9ydCk7CisJCWVsc2UKKwkJCXNpbl9zZXJ2ZXIuc2luX3BvcnQgPSAwOworCQlyYyA9IGlwdjRfY29ubmVjdCgmc2luX3NlcnZlciwmY3NvY2tldCx2b2x1bWVfaW5mby5zb3VyY2VfcmZjMTAwMV9uYW1lKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJY0VSUk9SKDEsCisJCQkgICAgICAgKCJFcnJvciBjb25uZWN0aW5nIHRvIElQdjQgc29ja2V0LiBBYm9ydGluZyBvcGVyYXRpb24iKSk7CisJCQlpZihjc29ja2V0ICE9IE5VTEwpCisJCQkJc29ja19yZWxlYXNlKGNzb2NrZXQpOworCQkJaWYodm9sdW1lX2luZm8uVU5DKQorCQkJCWtmcmVlKHZvbHVtZV9pbmZvLlVOQyk7CisJCQlpZih2b2x1bWVfaW5mby5wYXNzd29yZCkKKwkJCQlrZnJlZSh2b2x1bWVfaW5mby5wYXNzd29yZCk7CisJCQlGcmVlWGlkKHhpZCk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQlzcnZUY3AgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyksIEdGUF9LRVJORUwpOworCQlpZiAoc3J2VGNwID09IE5VTEwpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCXNvY2tfcmVsZWFzZShjc29ja2V0KTsKKwkJCWlmKHZvbHVtZV9pbmZvLlVOQykKKwkJCQlrZnJlZSh2b2x1bWVfaW5mby5VTkMpOworCQkJaWYodm9sdW1lX2luZm8ucGFzc3dvcmQpCisJCQkJa2ZyZWUodm9sdW1lX2luZm8ucGFzc3dvcmQpOworCQkJRnJlZVhpZCh4aWQpOworCQkJcmV0dXJuIHJjOworCQl9IGVsc2UgeworCQkJbWVtc2V0KHNydlRjcCwgMCwgc2l6ZW9mIChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvKSk7CisJCQltZW1jcHkoJnNydlRjcC0+YWRkci5zb2NrQWRkciwgJnNpbl9zZXJ2ZXIsIHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2luKSk7CisJCQlhdG9taWNfc2V0KCZzcnZUY3AtPmluRmxpZ2h0LDApOworCQkJLyogQkIgQWRkIGNvZGUgZm9yIGlwdjYgY2FzZSB0b28gKi8KKwkJCXNydlRjcC0+c3NvY2tldCA9IGNzb2NrZXQ7CisJCQlzcnZUY3AtPnByb3RvY29sVHlwZSA9IElQVjQ7CisJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzcnZUY3AtPnJlc3BvbnNlX3EpOworCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmc3J2VGNwLT5yZXF1ZXN0X3EpOworCQkJSU5JVF9MSVNUX0hFQUQoJnNydlRjcC0+cGVuZGluZ19taWRfcSk7CisJCQkvKiBhdCB0aGlzIHBvaW50IHdlIGFyZSB0aGUgb25seSBvbmVzIHdpdGggdGhlIHBvaW50ZXIKKwkJCXRvIHRoZSBzdHJ1Y3Qgc2luY2UgdGhlIGtlcm5lbCB0aHJlYWQgbm90IGNyZWF0ZWQgeWV0CisJCQlzbyBubyBuZWVkIHRvIHNwaW5sb2NrIHRoaXMgaW5pdCBvZiB0Y3BTdGF0dXMgKi8KKwkJCXNydlRjcC0+dGNwU3RhdHVzID0gQ2lmc05ldzsKKwkJCWluaXRfTVVURVgoJnNydlRjcC0+dGNwU2VtKTsKKwkJCXJjID0gKGludClrZXJuZWxfdGhyZWFkKCh2b2lkICopKHZvaWQgKiljaWZzX2RlbXVsdGlwbGV4X3RocmVhZCwgc3J2VGNwLAorCQkJCSAgICAgIENMT05FX0ZTIHwgQ0xPTkVfRklMRVMgfCBDTE9ORV9WTSk7CisJCQlpZihyYyA8IDApIHsKKwkJCQlyYyA9IC1FTk9NRU07CisJCQkJc29ja19yZWxlYXNlKGNzb2NrZXQpOworCQkJCWlmKHZvbHVtZV9pbmZvLlVOQykKKwkJCQkJa2ZyZWUodm9sdW1lX2luZm8uVU5DKTsKKwkJCQlpZih2b2x1bWVfaW5mby5wYXNzd29yZCkKKwkJCQkJa2ZyZWUodm9sdW1lX2luZm8ucGFzc3dvcmQpOworCQkJCUZyZWVYaWQoeGlkKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9IGVsc2UKKwkJCQlyYyA9IDA7CisJCQltZW1jcHkoc3J2VGNwLT53b3Jrc3RhdGlvbl9SRkMxMDAxX25hbWUsIHZvbHVtZV9pbmZvLnNvdXJjZV9yZmMxMDAxX25hbWUsMTYpOworCQl9CisJfQorCisJaWYgKGV4aXN0aW5nQ2lmc1NlcykgeworCQlwU2VzSW5mbyA9IGV4aXN0aW5nQ2lmc1NlczsKKwkJY0ZZSSgxLCAoIkV4aXN0aW5nIHNtYiBzZXNzIGZvdW5kICIpKTsKKwkJaWYodm9sdW1lX2luZm8ucGFzc3dvcmQpCisJCQlrZnJlZSh2b2x1bWVfaW5mby5wYXNzd29yZCk7CisJCS8qIHZvbHVtZV9pbmZvLlVOQyBmcmVlZCBhdCBlbmQgb2YgZnVuY3Rpb24gKi8KKwl9IGVsc2UgaWYgKCFyYykgeworCQljRllJKDEsICgiRXhpc3Rpbmcgc21iIHNlc3Mgbm90IGZvdW5kICIpKTsKKwkJcFNlc0luZm8gPSBzZXNJbmZvQWxsb2MoKTsKKwkJaWYgKHBTZXNJbmZvID09IE5VTEwpCisJCQlyYyA9IC1FTk9NRU07CisJCWVsc2UgeworCQkJcFNlc0luZm8tPnNlcnZlciA9IHNydlRjcDsKKwkJCXNwcmludGYocFNlc0luZm8tPnNlcnZlck5hbWUsICIldS4ldS4ldS4ldSIsCisJCQkJTklQUVVBRChzaW5fc2VydmVyLnNpbl9hZGRyLnNfYWRkcikpOworCQl9CisKKwkJaWYgKCFyYyl7CisJCQkvKiB2b2x1bWVfaW5mby5wYXNzd29yZCBmcmVlZCBhdCB1bm1vdW50ICovICAgCisJCQlpZiAodm9sdW1lX2luZm8ucGFzc3dvcmQpCisJCQkJcFNlc0luZm8tPnBhc3N3b3JkID0gdm9sdW1lX2luZm8ucGFzc3dvcmQ7CisJCQlpZiAodm9sdW1lX2luZm8udXNlcm5hbWUpCisJCQkJc3RybmNweShwU2VzSW5mby0+dXNlck5hbWUsCisJCQkJCXZvbHVtZV9pbmZvLnVzZXJuYW1lLE1BWF9VU0VSTkFNRV9TSVpFKTsKKwkJCWlmICh2b2x1bWVfaW5mby5kb21haW5uYW1lKQorCQkJCXN0cm5jcHkocFNlc0luZm8tPmRvbWFpbk5hbWUsCisJCQkJCXZvbHVtZV9pbmZvLmRvbWFpbm5hbWUsTUFYX1VTRVJOQU1FX1NJWkUpOworCQkJcFNlc0luZm8tPmxpbnV4X3VpZCA9IHZvbHVtZV9pbmZvLmxpbnV4X3VpZDsKKwkJCWRvd24oJnBTZXNJbmZvLT5zZXNTZW0pOworCQkJcmMgPSBjaWZzX3NldHVwX3Nlc3Npb24oeGlkLHBTZXNJbmZvLCBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQkJdXAoJnBTZXNJbmZvLT5zZXNTZW0pOworCQkJaWYoIXJjKQorCQkJCWF0b21pY19pbmMoJnNydlRjcC0+c29ja2V0VXNlQ291bnQpOworCQl9IGVsc2UKKwkJCWlmKHZvbHVtZV9pbmZvLnBhc3N3b3JkKQorCQkJCWtmcmVlKHZvbHVtZV9pbmZvLnBhc3N3b3JkKTsKKwl9CisgICAgCisJLyogc2VhcmNoIGZvciBleGlzdGluZyB0Y29uIHRvIHRoaXMgc2VydmVyIHNoYXJlICovCisJaWYgKCFyYykgeworCQlpZigodm9sdW1lX2luZm8ucnNpemUpICYmICh2b2x1bWVfaW5mby5yc2l6ZSA8PSBDSUZTTWF4QnVmU2l6ZSkpCisJCQljaWZzX3NiLT5yc2l6ZSA9IHZvbHVtZV9pbmZvLnJzaXplOworCQllbHNlCisJCQljaWZzX3NiLT5yc2l6ZSA9IHNydlRjcC0+bWF4QnVmIC0gTUFYX0NJRlNfSERSX1NJWkU7IC8qIGRlZmF1bHQgKi8KKwkJaWYoKHZvbHVtZV9pbmZvLndzaXplKSAmJiAodm9sdW1lX2luZm8ud3NpemUgPD0gQ0lGU01heEJ1ZlNpemUpKQorCQkJY2lmc19zYi0+d3NpemUgPSB2b2x1bWVfaW5mby53c2l6ZTsKKwkJZWxzZQorCQkJY2lmc19zYi0+d3NpemUgPSBDSUZTTWF4QnVmU2l6ZTsgLyogZGVmYXVsdCAqLworCQlpZihjaWZzX3NiLT5yc2l6ZSA8IFBBR0VfQ0FDSEVfU0laRSkgeworCQkJY2lmc19zYi0+cnNpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJCQljRVJST1IoMSwoIkF0dGVtcHQgdG8gc2V0IHJlYWRzaXplIGZvciBtb3VudCB0byBsZXNzIHRoYW4gb25lIHBhZ2UgKDQwOTYpIikpOworCQl9CisJCWNpZnNfc2ItPm1udF91aWQgPSB2b2x1bWVfaW5mby5saW51eF91aWQ7CisJCWNpZnNfc2ItPm1udF9naWQgPSB2b2x1bWVfaW5mby5saW51eF9naWQ7CisJCWNpZnNfc2ItPm1udF9maWxlX21vZGUgPSB2b2x1bWVfaW5mby5maWxlX21vZGU7CisJCWNpZnNfc2ItPm1udF9kaXJfbW9kZSA9IHZvbHVtZV9pbmZvLmRpcl9tb2RlOworCQljRllJKDEsKCJmaWxlIG1vZGU6IDB4JXggIGRpciBtb2RlOiAweCV4IixjaWZzX3NiLT5tbnRfZmlsZV9tb2RlLGNpZnNfc2ItPm1udF9kaXJfbW9kZSkpOworCisJCWlmKHZvbHVtZV9pbmZvLm5vcGVybSkKKwkJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzIHw9IENJRlNfTU9VTlRfTk9fUEVSTTsKKwkJaWYodm9sdW1lX2luZm8uc2V0dWlkcykKKwkJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzIHw9IENJRlNfTU9VTlRfU0VUX1VJRDsKKwkJaWYodm9sdW1lX2luZm8uc2VydmVyX2lubykKKwkJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzIHw9IENJRlNfTU9VTlRfU0VSVkVSX0lOVU07CisJCWlmKHZvbHVtZV9pbmZvLm5vX3hhdHRyKQorCQkJY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgfD0gQ0lGU19NT1VOVF9OT19YQVRUUjsKKwkJaWYodm9sdW1lX2luZm8uZGlyZWN0X2lvKSB7CisJCQljRVJST1IoMSwoIm1vdW50aW5nIHNoYXJlIHVzaW5nIGRpcmVjdCBpL28iKSk7CisJCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyB8PSBDSUZTX01PVU5UX0RJUkVDVF9JTzsKKwkJfQorCisJCXRjb24gPQorCQkgICAgZmluZF91bmMoc2luX3NlcnZlci5zaW5fYWRkci5zX2FkZHIsIHZvbHVtZV9pbmZvLlVOQywKKwkJCSAgICAgdm9sdW1lX2luZm8udXNlcm5hbWUpOworCQlpZiAodGNvbikgeworCQkJY0ZZSSgxLCAoIkZvdW5kIG1hdGNoIG9uIFVOQyBwYXRoICIpKTsKKwkJCS8qIHdlIGNhbiBoYXZlIG9ubHkgb25lIHJldHJ5IHZhbHVlIGZvciBhIGNvbm5lY3Rpb24KKwkJCSAgIHRvIGEgc2hhcmUgc28gZm9yIHJlc291cmNlcyBtb3VudGVkIG1vcmUgdGhhbiBvbmNlCisJCQkgICB0byB0aGUgc2FtZSBzZXJ2ZXIgc2hhcmUgdGhlIGxhc3QgdmFsdWUgcGFzc2VkIGluIAorCQkJICAgZm9yIHRoZSByZXRyeSBmbGFnIGlzIHVzZWQgKi8KKwkJCXRjb24tPnJldHJ5ID0gdm9sdW1lX2luZm8ucmV0cnk7CisJCX0gZWxzZSB7CisJCQl0Y29uID0gdGNvbkluZm9BbGxvYygpOworCQkJaWYgKHRjb24gPT0gTlVMTCkKKwkJCQlyYyA9IC1FTk9NRU07CisJCQllbHNlIHsKKwkJCQkvKiBjaGVjayBmb3IgbnVsbCBzaGFyZSBuYW1lIGllIGNvbm5lY3QgdG8gZGZzIHJvb3QgKi8KKworCQkJCS8qIEJCIGNoZWNrIGlmIHRoaXMgd29ya3MgZm9yIGV4YWN0bHkgbGVuZ3RoIHRocmVlIHN0cmluZ3MgKi8KKwkJCQlpZiAoKHN0cmNocih2b2x1bWVfaW5mby5VTkMgKyAzLCAnXFwnKSA9PSBOVUxMKQorCQkJCSAgICAmJiAoc3RyY2hyKHZvbHVtZV9pbmZvLlVOQyArIDMsICcvJykgPT0KKwkJCQkJTlVMTCkpIHsKKwkJCQkJcmMgPSBjb25uZWN0X3RvX2Rmc19wYXRoKHhpZCwKKwkJCQkJCQkJIHBTZXNJbmZvLAorCQkJCQkJCQkgIiIsCisJCQkJCQkJCSBjaWZzX3NiLT4KKwkJCQkJCQkJIGxvY2FsX25scyk7CisJCQkJCWlmKHZvbHVtZV9pbmZvLlVOQykKKwkJCQkJCWtmcmVlKHZvbHVtZV9pbmZvLlVOQyk7CisJCQkJCUZyZWVYaWQoeGlkKTsKKwkJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmMgPSBDSUZTVENvbih4aWQsIHBTZXNJbmZvLCAKKwkJCQkJCXZvbHVtZV9pbmZvLlVOQywKKwkJCQkJCXRjb24sIGNpZnNfc2ItPmxvY2FsX25scyk7CisJCQkJCWNGWUkoMSwgKCJDSUZTIFRjb24gcmMgPSAlZCIsIHJjKSk7CisJCQkJfQorCQkJCWlmICghcmMpIHsKKwkJCQkJYXRvbWljX2luYygmcFNlc0luZm8tPmluVXNlKTsKKwkJCQkJdGNvbi0+cmV0cnkgPSB2b2x1bWVfaW5mby5yZXRyeTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYocFNlc0luZm8pIHsKKwkJaWYgKHBTZXNJbmZvLT5jYXBhYmlsaXRpZXMgJiBDQVBfTEFSR0VfRklMRVMpIHsKKwkJCXNiLT5zX21heGJ5dGVzID0gKHU2NCkgMSA8PCA2MzsKKwkJfSBlbHNlCisJCQlzYi0+c19tYXhieXRlcyA9ICh1NjQpIDEgPDwgMzE7CS8qIDIgR0IgKi8KKwl9CisKKwlzYi0+c190aW1lX2dyYW4gPSAxMDA7CisKKy8qIG9uIGVycm9yIGZyZWUgc2VzaW5mbyBhbmQgdGNvbiBzdHJ1Y3QgaWYgbmVlZGVkICovCisJaWYgKHJjKSB7CisJCS8qIGlmIHNlc3Npb24gc2V0dXAgZmFpbGVkLCB1c2UgY291bnQgaXMgemVybyBidXQKKwkJd2Ugc3RpbGwgbmVlZCB0byBmcmVlIGNpZnNkIHRocmVhZCAqLworCQlpZihhdG9taWNfcmVhZCgmc3J2VGNwLT5zb2NrZXRVc2VDb3VudCkgPT0gMCkgeworCQkJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJCQlzcnZUY3AtPnRjcFN0YXR1cyA9IENpZnNFeGl0aW5nOworCQkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJCWlmKHNydlRjcC0+dHNrKQorCQkJCXNlbmRfc2lnKFNJR0tJTEwsc3J2VGNwLT50c2ssMSk7CisJCX0KKwkJIC8qIElmIGZpbmRfdW5jIHN1Y2NlZWRlZCB0aGVuIHJjID09IDAgc28gd2UgY2FuIG5vdCBlbmQgKi8KKwkJaWYgKHRjb24pICAvKiB1cCBhY2NpZGVudGx5IGZyZWVpbmcgc29tZW9uZSBlbHNlcyB0Y29uIHN0cnVjdCAqLworCQkJdGNvbkluZm9GcmVlKHRjb24pOworCQlpZiAoZXhpc3RpbmdDaWZzU2VzID09IE5VTEwpIHsKKwkJCWlmIChwU2VzSW5mbykgeworCQkJCWlmICgocFNlc0luZm8tPnNlcnZlcikgJiYgCisJCQkJICAgIChwU2VzSW5mby0+c3RhdHVzID09IENpZnNHb29kKSkgeworCQkJCQlpbnQgdGVtcF9yYzsKKwkJCQkJdGVtcF9yYyA9IENJRlNTTUJMb2dvZmYoeGlkLCBwU2VzSW5mbyk7CisJCQkJCS8qIGlmIHRoZSBzb2NrZXRVc2VDb3VudCBpcyBub3cgemVybyAqLworCQkJCQlpZigodGVtcF9yYyA9PSAtRVNIVVRET1dOKSAmJgorCQkJCQkgICAocFNlc0luZm8tPnNlcnZlci0+dHNrKSkKKwkJCQkJCXNlbmRfc2lnKFNJR0tJTEwscFNlc0luZm8tPnNlcnZlci0+dHNrLDEpOworCQkJCX0gZWxzZQorCQkJCQljRllJKDEsICgiTm8gc2Vzc2lvbiBvciBiYWQgdGNvbiIpKTsKKwkJCQlzZXNJbmZvRnJlZShwU2VzSW5mbyk7CisJCQkJLyogcFNlc0luZm8gPSBOVUxMOyAqLworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJYXRvbWljX2luYygmdGNvbi0+dXNlQ291bnQpOworCQljaWZzX3NiLT50Y29uID0gdGNvbjsKKwkJdGNvbi0+c2VzID0gcFNlc0luZm87CisKKwkJLyogZG8gbm90IGNhcmUgaWYgZm9sbG93aW5nIHR3byBjYWxscyBzdWNjZWVkIC0gaW5mb3JtYXRpb25hbCBvbmx5ICovCisJCUNJRlNTTUJRRlNEZXZpY2VJbmZvKHhpZCwgdGNvbiwgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwkJQ0lGU1NNQlFGU0F0dHJpYnV0ZUluZm8oeGlkLCB0Y29uLCBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQlpZiAodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkgeworCQkJaWYoIUNJRlNTTUJRRlNVbml4SW5mbyh4aWQsIHRjb24sIGNpZnNfc2ItPmxvY2FsX25scykpIHsKKwkJCQlpZighdm9sdW1lX2luZm8ubm9fcHN4X2FjbCkgeworCQkJCQlpZihDSUZTX1VOSVhfUE9TSVhfQUNMX0NBUCAmIAorCQkJCQkgICBsZTY0X3RvX2NwdSh0Y29uLT5mc1VuaXhJbmZvLkNhcGFiaWxpdHkpKQorCQkJCQkJY0ZZSSgxLCgic2VydmVyIG5lZ290aWF0ZWQgcG9zaXggYWNsIHN1cHBvcnQiKSk7CisJCQkJCQlzYi0+c19mbGFncyB8PSBNU19QT1NJWEFDTDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKiB2b2x1bWVfaW5mby5wYXNzd29yZCBpcyBmcmVlZCBhYm92ZSB3aGVuIGV4aXN0aW5nIHNlc3Npb24gZm91bmQKKwkoaW4gd2hpY2ggY2FzZSBpdCBpcyBub3QgbmVlZGVkIGFueW1vcmUpIGJ1dCB3aGVuIG5ldyBzZXNpb24gaXMgY3JlYXRlZAorCXRoZSBwYXNzd29yZCBwdHIgaXMgcHV0IGluIHRoZSBuZXcgc2Vzc2lvbiBzdHJ1Y3R1cmUgKGluIHdoaWNoIGNhc2UgdGhlCisJcGFzc3dvcmQgd2lsbCBiZSBmcmVlZCBhdCB1bm1vdW50IHRpbWUpICovCisJaWYodm9sdW1lX2luZm8uVU5DKQorCQlrZnJlZSh2b2x1bWVfaW5mby5VTkMpOworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK0NJRlNTZXNzU2V0dXAodW5zaWduZWQgaW50IHhpZCwgc3RydWN0IGNpZnNTZXNJbmZvICpzZXMsCisJICAgICAgY2hhciBzZXNzaW9uX2tleVtDSUZTX1NFU1NJT05fS0VZX1NJWkVdLAorCSAgICAgIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSkKK3sKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlcjsKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlcl9yZXNwb25zZTsKKwlTRVNTSU9OX1NFVFVQX0FORFggKnBTTUI7CisJU0VTU0lPTl9TRVRVUF9BTkRYICpwU01CcjsKKwljaGFyICpiY2NfcHRyOworCWNoYXIgKnVzZXI7CisJY2hhciAqZG9tYWluOworCWludCByYyA9IDA7CisJaW50IHJlbWFpbmluZ193b3JkcyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwlpbnQgbGVuOworCV9fdTMyIGNhcGFiaWxpdGllczsKKwlfX3UxNiBjb3VudDsKKworCWNGWUkoMSwgKCJJbiBzZXNzc2V0dXAgIikpOworCWlmKHNlcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl1c2VyID0gc2VzLT51c2VyTmFtZTsKKwlkb21haW4gPSBzZXMtPmRvbWFpbk5hbWU7CisJc21iX2J1ZmZlciA9IGNpZnNfYnVmX2dldCgpOworCWlmIChzbWJfYnVmZmVyID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNtYl9idWZmZXJfcmVzcG9uc2UgPSBzbWJfYnVmZmVyOworCXBTTUJyID0gcFNNQiA9IChTRVNTSU9OX1NFVFVQX0FORFggKikgc21iX2J1ZmZlcjsKKworCS8qIHNlbmQgU01Cc2Vzc2lvblNldHVwIGhlcmUgKi8KKwloZWFkZXJfYXNzZW1ibGUoc21iX2J1ZmZlciwgU01CX0NPTV9TRVNTSU9OX1NFVFVQX0FORFgsCisJCQlOVUxMIC8qIG5vIHRDb24gZXhpc3RzIHlldCAqLyAsIDEzIC8qIHdjdCAqLyApOworCisJcFNNQi0+cmVxX25vX3NlY2V4dC5BbmRYQ29tbWFuZCA9IDB4RkY7CisJcFNNQi0+cmVxX25vX3NlY2V4dC5NYXhCdWZmZXJTaXplID0gY3B1X3RvX2xlMTYoc2VzLT5zZXJ2ZXItPm1heEJ1Zik7CisJcFNNQi0+cmVxX25vX3NlY2V4dC5NYXhNcHhDb3VudCA9IGNwdV90b19sZTE2KHNlcy0+c2VydmVyLT5tYXhSZXEpOworCisJaWYoc2VzLT5zZXJ2ZXItPnNlY01vZGUgJiAoU0VDTU9ERV9TSUdOX1JFUVVJUkVEIHwgU0VDTU9ERV9TSUdOX0VOQUJMRUQpKQorCQlzbWJfYnVmZmVyLT5GbGFnczIgfD0gU01CRkxHMl9TRUNVUklUWV9TSUdOQVRVUkU7CisKKwljYXBhYmlsaXRpZXMgPSBDQVBfTEFSR0VfRklMRVMgfCBDQVBfTlRfU01CUyB8IENBUF9MRVZFTF9JSV9PUExPQ0tTIHwKKwkJQ0FQX0xBUkdFX1dSSVRFX1ggfCBDQVBfTEFSR0VfUkVBRF9YOworCWlmIChzZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklDT0RFKSB7CisJCXNtYl9idWZmZXItPkZsYWdzMiB8PSBTTUJGTEcyX1VOSUNPREU7CisJCWNhcGFiaWxpdGllcyB8PSBDQVBfVU5JQ09ERTsKKwl9CisJaWYgKHNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1NUQVRVUzMyKSB7CisJCXNtYl9idWZmZXItPkZsYWdzMiB8PSBTTUJGTEcyX0VSUl9TVEFUVVM7CisJCWNhcGFiaWxpdGllcyB8PSBDQVBfU1RBVFVTMzI7CisJfQorCWlmIChzZXMtPmNhcGFiaWxpdGllcyAmIENBUF9ERlMpIHsKKwkJc21iX2J1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfREZTOworCQljYXBhYmlsaXRpZXMgfD0gQ0FQX0RGUzsKKwl9CisJcFNNQi0+cmVxX25vX3NlY2V4dC5DYXBhYmlsaXRpZXMgPSBjcHVfdG9fbGUzMihjYXBhYmlsaXRpZXMpOworCisJcFNNQi0+cmVxX25vX3NlY2V4dC5DYXNlSW5zZW5zaXRpdmVQYXNzd29yZExlbmd0aCA9IAorCQljcHVfdG9fbGUxNihDSUZTX1NFU1NJT05fS0VZX1NJWkUpOworCisJcFNNQi0+cmVxX25vX3NlY2V4dC5DYXNlU2Vuc2l0aXZlUGFzc3dvcmRMZW5ndGggPQorCSAgICBjcHVfdG9fbGUxNihDSUZTX1NFU1NJT05fS0VZX1NJWkUpOworCWJjY19wdHIgPSBwQnl0ZUFyZWEoc21iX2J1ZmZlcik7CisJbWVtY3B5KGJjY19wdHIsIChjaGFyICopIHNlc3Npb25fa2V5LCBDSUZTX1NFU1NJT05fS0VZX1NJWkUpOworCWJjY19wdHIgKz0gQ0lGU19TRVNTSU9OX0tFWV9TSVpFOworCW1lbWNweShiY2NfcHRyLCAoY2hhciAqKSBzZXNzaW9uX2tleSwgQ0lGU19TRVNTSU9OX0tFWV9TSVpFKTsKKwliY2NfcHRyICs9IENJRlNfU0VTU0lPTl9LRVlfU0laRTsKKworCWlmIChzZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklDT0RFKSB7CisJCWlmICgobG9uZykgYmNjX3B0ciAlIDIpIHsgLyogbXVzdCBiZSB3b3JkIGFsaWduZWQgZm9yIFVuaWNvZGUgKi8KKwkJCSpiY2NfcHRyID0gMDsKKwkJCWJjY19wdHIrKzsKKwkJfQorCQlpZih1c2VyID09IE5VTEwpCisJCQlieXRlc19yZXR1cm5lZCA9IDA7IC8qIHNraWxsIG51bGwgdXNlciAqLworCSAgICAgICAgZWxzZQorCQkJYnl0ZXNfcmV0dXJuZWQgPQorCQkJICAgICAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIGJjY19wdHIsIHVzZXIsIDEwMCwKKwkJCQkJbmxzX2NvZGVwYWdlKTsKKwkJLyogY29udmVydCBudW1iZXIgb2YgMTYgYml0IHdvcmRzIHRvIGJ5dGVzICovCisJCWJjY19wdHIgKz0gMiAqIGJ5dGVzX3JldHVybmVkOworCQliY2NfcHRyICs9IDI7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJaWYgKGRvbWFpbiA9PSBOVUxMKQorCQkJYnl0ZXNfcmV0dXJuZWQgPQorCQkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwKKwkJCQkJICAiQ0lGU19MSU5VWF9ET00iLCAzMiwgbmxzX2NvZGVwYWdlKTsKKwkJZWxzZQorCQkJYnl0ZXNfcmV0dXJuZWQgPQorCQkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwgZG9tYWluLCA2NCwKKwkJCQkJICBubHNfY29kZXBhZ2UpOworCQliY2NfcHRyICs9IDIgKiBieXRlc19yZXR1cm5lZDsKKwkJYmNjX3B0ciArPSAyOworCQlieXRlc19yZXR1cm5lZCA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIGJjY19wdHIsICJMaW51eCB2ZXJzaW9uICIsCisJCQkJICAzMiwgbmxzX2NvZGVwYWdlKTsKKwkJYmNjX3B0ciArPSAyICogYnl0ZXNfcmV0dXJuZWQ7CisJCWJ5dGVzX3JldHVybmVkID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwgc3lzdGVtX3V0c25hbWUucmVsZWFzZSwKKwkJCQkgIDMyLCBubHNfY29kZXBhZ2UpOworCQliY2NfcHRyICs9IDIgKiBieXRlc19yZXR1cm5lZDsKKwkJYmNjX3B0ciArPSAyOworCQlieXRlc19yZXR1cm5lZCA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIGJjY19wdHIsIENJRlNfTkVUV09SS19PUFNZUywKKwkJCQkgIDY0LCBubHNfY29kZXBhZ2UpOworCQliY2NfcHRyICs9IDIgKiBieXRlc19yZXR1cm5lZDsKKwkJYmNjX3B0ciArPSAyOworCX0gZWxzZSB7CisJCWlmKHVzZXIgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAKKwkJICAgIHN0cm5jcHkoYmNjX3B0ciwgdXNlciwgMjAwKTsKKwkJICAgIGJjY19wdHIgKz0gc3Rybmxlbih1c2VyLCAyMDApOworCQl9CisJCSpiY2NfcHRyID0gMDsKKwkJYmNjX3B0cisrOworCQlpZiAoZG9tYWluID09IE5VTEwpIHsKKwkJCXN0cmNweShiY2NfcHRyLCAiQ0lGU19MSU5VWF9ET00iKTsKKwkJCWJjY19wdHIgKz0gc3RybGVuKCJDSUZTX0xJTlVYX0RPTSIpICsgMTsKKwkJfSBlbHNlIHsKKwkJCXN0cm5jcHkoYmNjX3B0ciwgZG9tYWluLCA2NCk7CisJCQliY2NfcHRyICs9IHN0cm5sZW4oZG9tYWluLCA2NCk7CisJCQkqYmNjX3B0ciA9IDA7CisJCQliY2NfcHRyKys7CisJCX0KKwkJc3RyY3B5KGJjY19wdHIsICJMaW51eCB2ZXJzaW9uICIpOworCQliY2NfcHRyICs9IHN0cmxlbigiTGludXggdmVyc2lvbiAiKTsKKwkJc3RyY3B5KGJjY19wdHIsIHN5c3RlbV91dHNuYW1lLnJlbGVhc2UpOworCQliY2NfcHRyICs9IHN0cmxlbihzeXN0ZW1fdXRzbmFtZS5yZWxlYXNlKSArIDE7CisJCXN0cmNweShiY2NfcHRyLCBDSUZTX05FVFdPUktfT1BTWVMpOworCQliY2NfcHRyICs9IHN0cmxlbihDSUZTX05FVFdPUktfT1BTWVMpICsgMTsKKwl9CisJY291bnQgPSAobG9uZykgYmNjX3B0ciAtIChsb25nKSBwQnl0ZUFyZWEoc21iX2J1ZmZlcik7CisJc21iX2J1ZmZlci0+c21iX2J1Zl9sZW5ndGggKz0gY291bnQ7CisJcFNNQi0+cmVxX25vX3NlY2V4dC5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgc2VzLCBzbWJfYnVmZmVyLCBzbWJfYnVmZmVyX3Jlc3BvbnNlLAorCQkJICZieXRlc19yZXR1cm5lZCwgMSk7CisJaWYgKHJjKSB7CisvKiByYyA9IG1hcF9zbWJfdG9fbGludXhfZXJyb3Ioc21iX2J1ZmZlcl9yZXNwb25zZSk7IG5vdyBkb25lIGluIFNlbmRSZWNlaXZlICovCisJfSBlbHNlIGlmICgoc21iX2J1ZmZlcl9yZXNwb25zZS0+V29yZENvdW50ID09IDMpCisJCSAgIHx8IChzbWJfYnVmZmVyX3Jlc3BvbnNlLT5Xb3JkQ291bnQgPT0gNCkpIHsKKwkJX191MTYgYWN0aW9uID0gbGUxNl90b19jcHUocFNNQnItPnJlc3AuQWN0aW9uKTsKKwkJX191MTYgYmxvYl9sZW4gPSBsZTE2X3RvX2NwdShwU01Cci0+cmVzcC5TZWN1cml0eUJsb2JMZW5ndGgpOworCQlpZiAoYWN0aW9uICYgR1VFU1RfTE9HSU4pCisJCQljRllJKDEsICgiIEd1ZXN0IGxvZ2luIikpOwkvKiBkbyB3ZSB3YW50IHRvIG1hcmsgU2VzSW5mbyBzdHJ1Y3QgPyAqLworCQlzZXMtPlN1aWQgPSBzbWJfYnVmZmVyX3Jlc3BvbnNlLT5VaWQ7CS8qIFVJRCBsZWZ0IGluIHdpcmUgZm9ybWF0IChsZSkgKi8KKwkJY0ZZSSgxLCAoIlVJRCA9ICVkICIsIHNlcy0+U3VpZCkpOworICAgICAgICAgLyogcmVzcG9uc2UgY2FuIGhhdmUgZWl0aGVyIDMgb3IgNCB3b3JkIGNvdW50IC0gU2FtYmEgc2VuZHMgMyAqLworCQliY2NfcHRyID0gcEJ5dGVBcmVhKHNtYl9idWZmZXJfcmVzcG9uc2UpOwkKKwkJaWYgKChwU01Cci0+cmVzcC5oZHIuV29yZENvdW50ID09IDMpCisJCSAgICB8fCAoKHBTTUJyLT5yZXNwLmhkci5Xb3JkQ291bnQgPT0gNCkKKwkJCSYmIChibG9iX2xlbiA8IHBTTUJyLT5yZXNwLkJ5dGVDb3VudCkpKSB7CisJCQlpZiAocFNNQnItPnJlc3AuaGRyLldvcmRDb3VudCA9PSA0KQorCQkJCWJjY19wdHIgKz0gYmxvYl9sZW47CisKKwkJCWlmIChzbWJfYnVmZmVyLT5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJCQlpZiAoKGxvbmcpIChiY2NfcHRyKSAlIDIpIHsKKwkJCQkJcmVtYWluaW5nX3dvcmRzID0KKwkJCQkJICAgIChCQ0Moc21iX2J1ZmZlcl9yZXNwb25zZSkgLSAxKSAvMjsKKwkJCQkJYmNjX3B0cisrOwkvKiBVbmljb2RlIHN0cmluZ3MgbXVzdCBiZSB3b3JkIGFsaWduZWQgKi8KKwkJCQl9IGVsc2UgeworCQkJCQlyZW1haW5pbmdfd29yZHMgPQorCQkJCQkJQkNDKHNtYl9idWZmZXJfcmVzcG9uc2UpIC8gMjsKKwkJCQl9CisJCQkJbGVuID0KKwkJCQkgICAgVW5pU3Rybmxlbigod2NoYXJfdCAqKSBiY2NfcHRyLAorCQkJCQkgICAgICAgcmVtYWluaW5nX3dvcmRzIC0gMSk7CisvKiBXZSBsb29rIGZvciBvYnZpb3VzIG1lc3NlZCB1cCBiY2Mgb3Igc3RyaW5ncyBpbiByZXNwb25zZSBzbyB3ZSBkbyBub3QgZ28gb2ZmCisgICB0aGUgZW5kIHNpbmNlIChhdCBsZWFzdCkgV0lOMksgYW5kIFdpbmRvd3MgWFAgaGF2ZSBhIG1ham9yIGJ1ZyBpbiBub3QgbnVsbAorICAgdGVybWluYXRpbmcgbGFzdCBVbmljb2RlIHN0cmluZyBpbiByZXNwb25zZSAgKi8KKwkJCQlzZXMtPnNlcnZlck9TID0gY2lmc19rY2FsbG9jKDIgKiAobGVuICsgMSksIEdGUF9LRVJORUwpOworCQkJCWNpZnNfc3RyZnJvbVVDU19sZShzZXMtPnNlcnZlck9TLAorCQkJCQkgICAod2NoYXJfdCAqKWJjY19wdHIsIGxlbixubHNfY29kZXBhZ2UpOworCQkJCWJjY19wdHIgKz0gMiAqIChsZW4gKyAxKTsKKwkJCQlyZW1haW5pbmdfd29yZHMgLT0gbGVuICsgMTsKKwkJCQlzZXMtPnNlcnZlck9TWzIgKiBsZW5dID0gMDsKKwkJCQlzZXMtPnNlcnZlck9TWzEgKyAoMiAqIGxlbildID0gMDsKKwkJCQlpZiAocmVtYWluaW5nX3dvcmRzID4gMCkgeworCQkJCQlsZW4gPSBVbmlTdHJubGVuKCh3Y2hhcl90ICopYmNjX3B0ciwKKwkJCQkJCQkgcmVtYWluaW5nX3dvcmRzLTEpOworCQkJCQlzZXMtPnNlcnZlck5PUyA9Y2lmc19rY2FsbG9jKDIgKiAobGVuICsgMSksR0ZQX0tFUk5FTCk7CisJCQkJCWNpZnNfc3RyZnJvbVVDU19sZShzZXMtPnNlcnZlck5PUywKKwkJCQkJCQkgICAod2NoYXJfdCAqKWJjY19wdHIsbGVuLG5sc19jb2RlcGFnZSk7CisJCQkJCWJjY19wdHIgKz0gMiAqIChsZW4gKyAxKTsKKwkJCQkJc2VzLT5zZXJ2ZXJOT1NbMiAqIGxlbl0gPSAwOworCQkJCQlzZXMtPnNlcnZlck5PU1sxICsgKDIgKiBsZW4pXSA9IDA7CisJCQkJCWlmKHN0cm5jbXAoc2VzLT5zZXJ2ZXJOT1MsCisJCQkJCQkiTlQgTEFOIE1hbmFnZXIgNCIsMTYpID09IDApIHsKKwkJCQkJCWNGWUkoMSwoIk5UNCBzZXJ2ZXIiKSk7CisJCQkJCQlzZXMtPmZsYWdzIHw9IENJRlNfU0VTX05UNDsKKwkJCQkJfQorCQkJCQlyZW1haW5pbmdfd29yZHMgLT0gbGVuICsgMTsKKwkJCQkJaWYgKHJlbWFpbmluZ193b3JkcyA+IDApIHsKKwkJCQkJCWxlbiA9IFVuaVN0cm5sZW4oKHdjaGFyX3QgKikgYmNjX3B0ciwgcmVtYWluaW5nX3dvcmRzKTsJCisgICAgICAgICAgLyogbGFzdCBzdHJpbmcgaXMgbm90IGFsd2F5cyBudWxsIHRlcm1pbmF0ZWQgKGZvciBlLmcuIGZvciBXaW5kb3dzIFhQICYgMjAwMCkgKi8KKwkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0KKwkJCQkJCSAgICBjaWZzX2tjYWxsb2MoMioobGVuKzEpLEdGUF9LRVJORUwpOworCQkJCQkJY2lmc19zdHJmcm9tVUNTX2xlKHNlcy0+c2VydmVyRG9tYWluLAorCQkJCQkJICAgICAod2NoYXJfdCAqKWJjY19wdHIsbGVuLG5sc19jb2RlcGFnZSk7CisJCQkJCQliY2NfcHRyICs9IDIgKiAobGVuICsgMSk7CisJCQkJCQlzZXMtPnNlcnZlckRvbWFpblsyKmxlbl0gPSAwOworCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW5bMSsoMipsZW4pXSA9IDA7CisJCQkJCX0gLyogZWxzZSBubyBtb3JlIHJvb20gc28gY3JlYXRlIGR1bW15IGRvbWFpbiBzdHJpbmcgKi8KKwkJCQkJZWxzZQorCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPQorCQkJCQkJICAgIGNpZnNfa2NhbGxvYygyLAorCQkJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJCQl9IGVsc2UgewkvKiBubyByb29tIHNvIGNyZWF0ZSBkdW1teSBkb21haW4gYW5kIE5PUyBzdHJpbmcgKi8KKwkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPQorCQkJCQkgICAgY2lmc19rY2FsbG9jKDIsIEdGUF9LRVJORUwpOworCQkJCQlzZXMtPnNlcnZlck5PUyA9CisJCQkJCSAgICBjaWZzX2tjYWxsb2MoMiwgR0ZQX0tFUk5FTCk7CisJCQkJfQorCQkJfSBlbHNlIHsJLyogQVNDSUkgKi8KKwkJCQlsZW4gPSBzdHJubGVuKGJjY19wdHIsIDEwMjQpOworCQkJCWlmICgoKGxvbmcpIGJjY19wdHIgKyBsZW4pIC0gKGxvbmcpCisJCQkJICAgIHBCeXRlQXJlYShzbWJfYnVmZmVyX3Jlc3BvbnNlKQorCQkJCQkgICAgPD0gQkNDKHNtYl9idWZmZXJfcmVzcG9uc2UpKSB7CisJCQkJCXNlcy0+c2VydmVyT1MgPSBjaWZzX2tjYWxsb2MobGVuICsgMSxHRlBfS0VSTkVMKTsKKwkJCQkJc3RybmNweShzZXMtPnNlcnZlck9TLGJjY19wdHIsIGxlbik7CisKKwkJCQkJYmNjX3B0ciArPSBsZW47CisJCQkJCWJjY19wdHJbMF0gPSAwOwkvKiBudWxsIHRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCisJCQkJCWJjY19wdHIrKzsKKworCQkJCQlsZW4gPSBzdHJubGVuKGJjY19wdHIsIDEwMjQpOworCQkJCQlzZXMtPnNlcnZlck5PUyA9IGNpZnNfa2NhbGxvYyhsZW4gKyAxLEdGUF9LRVJORUwpOworCQkJCQlzdHJuY3B5KHNlcy0+c2VydmVyTk9TLCBiY2NfcHRyLCBsZW4pOworCQkJCQliY2NfcHRyICs9IGxlbjsKKwkJCQkJYmNjX3B0clswXSA9IDA7CisJCQkJCWJjY19wdHIrKzsKKworCQkJCQlsZW4gPSBzdHJubGVuKGJjY19wdHIsIDEwMjQpOworCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9IGNpZnNfa2NhbGxvYyhsZW4gKyAxLEdGUF9LRVJORUwpOworCQkJCQlzdHJuY3B5KHNlcy0+c2VydmVyRG9tYWluLCBiY2NfcHRyLCBsZW4pOworCQkJCQliY2NfcHRyICs9IGxlbjsKKwkJCQkJYmNjX3B0clswXSA9IDA7CisJCQkJCWJjY19wdHIrKzsKKwkJCQl9IGVsc2UKKwkJCQkJY0ZZSSgxLAorCQkJCQkgICAgICgiVmFyaWFibGUgZmllbGQgb2YgbGVuZ3RoICVkIGV4dGVuZHMgYmV5b25kIGVuZCBvZiBzbWIgIiwKKwkJCQkJICAgICAgbGVuKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQljRVJST1IoMSwKKwkJCSAgICAgICAoIiBTZWN1cml0eSBCbG9iIExlbmd0aCBleHRlbmRzIGJleW9uZCBlbmQgb2YgU01CIikpOworCQl9CisJfSBlbHNlIHsKKwkJY0VSUk9SKDEsCisJCSAgICAgICAoIiBJbnZhbGlkIFdvcmQgY291bnQgJWQ6ICIsCisJCQlzbWJfYnVmZmVyX3Jlc3BvbnNlLT5Xb3JkQ291bnQpKTsKKwkJcmMgPSAtRUlPOworCX0KKwkKKwlpZiAoc21iX2J1ZmZlcikKKwkJY2lmc19idWZfcmVsZWFzZShzbWJfYnVmZmVyKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorQ0lGU1NwbmVnb1Nlc3NTZXR1cCh1bnNpZ25lZCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Nlc0luZm8gKnNlcywKKwkJY2hhciAqU2VjdXJpdHlCbG9iLGludCBTZWN1cml0eUJsb2JMZW5ndGgsCisJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSkKK3sKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlcjsKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlcl9yZXNwb25zZTsKKwlTRVNTSU9OX1NFVFVQX0FORFggKnBTTUI7CisJU0VTU0lPTl9TRVRVUF9BTkRYICpwU01CcjsKKwljaGFyICpiY2NfcHRyOworCWNoYXIgKnVzZXI7CisJY2hhciAqZG9tYWluOworCWludCByYyA9IDA7CisJaW50IHJlbWFpbmluZ193b3JkcyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwlpbnQgbGVuOworCV9fdTMyIGNhcGFiaWxpdGllczsKKwlfX3UxNiBjb3VudDsKKworCWNGWUkoMSwgKCJJbiBzcG5lZ28gc2Vzc3NldHVwICIpKTsKKwlpZihzZXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdXNlciA9IHNlcy0+dXNlck5hbWU7CisJZG9tYWluID0gc2VzLT5kb21haW5OYW1lOworCisJc21iX2J1ZmZlciA9IGNpZnNfYnVmX2dldCgpOworCWlmIChzbWJfYnVmZmVyID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNtYl9idWZmZXJfcmVzcG9uc2UgPSBzbWJfYnVmZmVyOworCXBTTUJyID0gcFNNQiA9IChTRVNTSU9OX1NFVFVQX0FORFggKikgc21iX2J1ZmZlcjsKKworCS8qIHNlbmQgU01Cc2Vzc2lvblNldHVwIGhlcmUgKi8KKwloZWFkZXJfYXNzZW1ibGUoc21iX2J1ZmZlciwgU01CX0NPTV9TRVNTSU9OX1NFVFVQX0FORFgsCisJCQlOVUxMIC8qIG5vIHRDb24gZXhpc3RzIHlldCAqLyAsIDEyIC8qIHdjdCAqLyApOworCXBTTUItPnJlcS5oZHIuRmxhZ3MyIHw9IFNNQkZMRzJfRVhUX1NFQzsKKwlwU01CLT5yZXEuQW5kWENvbW1hbmQgPSAweEZGOworCXBTTUItPnJlcS5NYXhCdWZmZXJTaXplID0gY3B1X3RvX2xlMTYoc2VzLT5zZXJ2ZXItPm1heEJ1Zik7CisJcFNNQi0+cmVxLk1heE1weENvdW50ID0gY3B1X3RvX2xlMTYoc2VzLT5zZXJ2ZXItPm1heFJlcSk7CisKKwlpZihzZXMtPnNlcnZlci0+c2VjTW9kZSAmIChTRUNNT0RFX1NJR05fUkVRVUlSRUQgfCBTRUNNT0RFX1NJR05fRU5BQkxFRCkpCisJCXNtYl9idWZmZXItPkZsYWdzMiB8PSBTTUJGTEcyX1NFQ1VSSVRZX1NJR05BVFVSRTsKKworCWNhcGFiaWxpdGllcyA9IENBUF9MQVJHRV9GSUxFUyB8IENBUF9OVF9TTUJTIHwgQ0FQX0xFVkVMX0lJX09QTE9DS1MgfAorCSAgICBDQVBfRVhURU5ERURfU0VDVVJJVFk7CisJaWYgKHNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSUNPREUpIHsKKwkJc21iX2J1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfVU5JQ09ERTsKKwkJY2FwYWJpbGl0aWVzIHw9IENBUF9VTklDT0RFOworCX0KKwlpZiAoc2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfU1RBVFVTMzIpIHsKKwkJc21iX2J1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfRVJSX1NUQVRVUzsKKwkJY2FwYWJpbGl0aWVzIHw9IENBUF9TVEFUVVMzMjsKKwl9CisJaWYgKHNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX0RGUykgeworCQlzbWJfYnVmZmVyLT5GbGFnczIgfD0gU01CRkxHMl9ERlM7CisJCWNhcGFiaWxpdGllcyB8PSBDQVBfREZTOworCX0KKwlwU01CLT5yZXEuQ2FwYWJpbGl0aWVzID0gY3B1X3RvX2xlMzIoY2FwYWJpbGl0aWVzKTsKKworCXBTTUItPnJlcS5TZWN1cml0eUJsb2JMZW5ndGggPSBjcHVfdG9fbGUxNihTZWN1cml0eUJsb2JMZW5ndGgpOworCWJjY19wdHIgPSBwQnl0ZUFyZWEoc21iX2J1ZmZlcik7CisJbWVtY3B5KGJjY19wdHIsIFNlY3VyaXR5QmxvYiwgU2VjdXJpdHlCbG9iTGVuZ3RoKTsKKwliY2NfcHRyICs9IFNlY3VyaXR5QmxvYkxlbmd0aDsKKworCWlmIChzZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklDT0RFKSB7CisJCWlmICgobG9uZykgYmNjX3B0ciAlIDIpIHsJLyogbXVzdCBiZSB3b3JkIGFsaWduZWQgZm9yIFVuaWNvZGUgc3RyaW5ncyAqLworCQkJKmJjY19wdHIgPSAwOworCQkJYmNjX3B0cisrOworCQl9CisJCWJ5dGVzX3JldHVybmVkID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwgdXNlciwgMTAwLCBubHNfY29kZXBhZ2UpOworCQliY2NfcHRyICs9IDIgKiBieXRlc19yZXR1cm5lZDsJLyogY29udmVydCBudW0gb2YgMTYgYml0IHdvcmRzIHRvIGJ5dGVzICovCisJCWJjY19wdHIgKz0gMjsJLyogdHJhaWxpbmcgbnVsbCAqLworCQlpZiAoZG9tYWluID09IE5VTEwpCisJCQlieXRlc19yZXR1cm5lZCA9CisJCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBiY2NfcHRyLAorCQkJCQkgICJDSUZTX0xJTlVYX0RPTSIsIDMyLCBubHNfY29kZXBhZ2UpOworCQllbHNlCisJCQlieXRlc19yZXR1cm5lZCA9CisJCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBiY2NfcHRyLCBkb21haW4sIDY0LAorCQkJCQkgIG5sc19jb2RlcGFnZSk7CisJCWJjY19wdHIgKz0gMiAqIGJ5dGVzX3JldHVybmVkOworCQliY2NfcHRyICs9IDI7CisJCWJ5dGVzX3JldHVybmVkID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwgIkxpbnV4IHZlcnNpb24gIiwKKwkJCQkgIDMyLCBubHNfY29kZXBhZ2UpOworCQliY2NfcHRyICs9IDIgKiBieXRlc19yZXR1cm5lZDsKKwkJYnl0ZXNfcmV0dXJuZWQgPQorCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBiY2NfcHRyLCBzeXN0ZW1fdXRzbmFtZS5yZWxlYXNlLCAzMiwKKwkJCQkgIG5sc19jb2RlcGFnZSk7CisJCWJjY19wdHIgKz0gMiAqIGJ5dGVzX3JldHVybmVkOworCQliY2NfcHRyICs9IDI7CisJCWJ5dGVzX3JldHVybmVkID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwgQ0lGU19ORVRXT1JLX09QU1lTLAorCQkJCSAgNjQsIG5sc19jb2RlcGFnZSk7CisJCWJjY19wdHIgKz0gMiAqIGJ5dGVzX3JldHVybmVkOworCQliY2NfcHRyICs9IDI7CisJfSBlbHNlIHsKKwkJc3RybmNweShiY2NfcHRyLCB1c2VyLCAyMDApOworCQliY2NfcHRyICs9IHN0cm5sZW4odXNlciwgMjAwKTsKKwkJKmJjY19wdHIgPSAwOworCQliY2NfcHRyKys7CisJCWlmIChkb21haW4gPT0gTlVMTCkgeworCQkJc3RyY3B5KGJjY19wdHIsICJDSUZTX0xJTlVYX0RPTSIpOworCQkJYmNjX3B0ciArPSBzdHJsZW4oIkNJRlNfTElOVVhfRE9NIikgKyAxOworCQl9IGVsc2UgeworCQkJc3RybmNweShiY2NfcHRyLCBkb21haW4sIDY0KTsKKwkJCWJjY19wdHIgKz0gc3Rybmxlbihkb21haW4sIDY0KTsKKwkJCSpiY2NfcHRyID0gMDsKKwkJCWJjY19wdHIrKzsKKwkJfQorCQlzdHJjcHkoYmNjX3B0ciwgIkxpbnV4IHZlcnNpb24gIik7CisJCWJjY19wdHIgKz0gc3RybGVuKCJMaW51eCB2ZXJzaW9uICIpOworCQlzdHJjcHkoYmNjX3B0ciwgc3lzdGVtX3V0c25hbWUucmVsZWFzZSk7CisJCWJjY19wdHIgKz0gc3RybGVuKHN5c3RlbV91dHNuYW1lLnJlbGVhc2UpICsgMTsKKwkJc3RyY3B5KGJjY19wdHIsIENJRlNfTkVUV09SS19PUFNZUyk7CisJCWJjY19wdHIgKz0gc3RybGVuKENJRlNfTkVUV09SS19PUFNZUykgKyAxOworCX0KKwljb3VudCA9IChsb25nKSBiY2NfcHRyIC0gKGxvbmcpIHBCeXRlQXJlYShzbWJfYnVmZmVyKTsKKwlzbWJfYnVmZmVyLT5zbWJfYnVmX2xlbmd0aCArPSBjb3VudDsKKwlwU01CLT5yZXEuQnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoY291bnQpOworCisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHNlcywgc21iX2J1ZmZlciwgc21iX2J1ZmZlcl9yZXNwb25zZSwKKwkJCSAmYnl0ZXNfcmV0dXJuZWQsIDEpOworCWlmIChyYykgeworLyogICAgcmMgPSBtYXBfc21iX3RvX2xpbnV4X2Vycm9yKHNtYl9idWZmZXJfcmVzcG9uc2UpOyAgKi8vKiBkb25lIGluIFNlbmRSZWNlaXZlIG5vdyAqLworCX0gZWxzZSBpZiAoKHNtYl9idWZmZXJfcmVzcG9uc2UtPldvcmRDb3VudCA9PSAzKQorCQkgICB8fCAoc21iX2J1ZmZlcl9yZXNwb25zZS0+V29yZENvdW50ID09IDQpKSB7CisJCV9fdTE2IGFjdGlvbiA9IGxlMTZfdG9fY3B1KHBTTUJyLT5yZXNwLkFjdGlvbik7CisJCV9fdTE2IGJsb2JfbGVuID0KKwkJICAgIGxlMTZfdG9fY3B1KHBTTUJyLT5yZXNwLlNlY3VyaXR5QmxvYkxlbmd0aCk7CisJCWlmIChhY3Rpb24gJiBHVUVTVF9MT0dJTikKKwkJCWNGWUkoMSwgKCIgR3Vlc3QgbG9naW4iKSk7CS8qIEJCIGRvIHdlIHdhbnQgdG8gc2V0IGFueXRoaW5nIGluIFNlc0luZm8gc3RydWN0ID8gKi8KKwkJaWYgKHNlcykgeworCQkJc2VzLT5TdWlkID0gc21iX2J1ZmZlcl9yZXNwb25zZS0+VWlkOwkvKiBVSUQgbGVmdCBpbiB3aXJlIGZvcm1hdCAobGUpICovCisJCQljRllJKDEsICgiVUlEID0gJWQgIiwgc2VzLT5TdWlkKSk7CisJCQliY2NfcHRyID0gcEJ5dGVBcmVhKHNtYl9idWZmZXJfcmVzcG9uc2UpOwkvKiByZXNwb25zZSBjYW4gaGF2ZSBlaXRoZXIgMyBvciA0IHdvcmQgY291bnQgLSBTYW1iYSBzZW5kcyAzICovCisKKwkJCS8qIEJCIEZpeCBiZWxvdyB0byBtYWtlIGVuZGlhbiBuZXV0cmFsICEhICovCisKKwkJCWlmICgocFNNQnItPnJlc3AuaGRyLldvcmRDb3VudCA9PSAzKQorCQkJICAgIHx8ICgocFNNQnItPnJlc3AuaGRyLldvcmRDb3VudCA9PSA0KQorCQkJCSYmIChibG9iX2xlbiA8CisJCQkJICAgIHBTTUJyLT5yZXNwLkJ5dGVDb3VudCkpKSB7CisJCQkJaWYgKHBTTUJyLT5yZXNwLmhkci5Xb3JkQ291bnQgPT0gNCkgeworCQkJCQliY2NfcHRyICs9CisJCQkJCSAgICBibG9iX2xlbjsKKwkJCQkJY0ZZSSgxLAorCQkJCQkgICAgICgiU2VjdXJpdHkgQmxvYiBMZW5ndGggJWQgIiwKKwkJCQkJICAgICAgYmxvYl9sZW4pKTsKKwkJCQl9CisKKwkJCQlpZiAoc21iX2J1ZmZlci0+RmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCQkJCWlmICgobG9uZykgKGJjY19wdHIpICUgMikgeworCQkJCQkJcmVtYWluaW5nX3dvcmRzID0KKwkJCQkJCSAgICAoQkNDKHNtYl9idWZmZXJfcmVzcG9uc2UpCisJCQkJCQkgICAgIC0gMSkgLyAyOworCQkJCQkJYmNjX3B0cisrOwkvKiBVbmljb2RlIHN0cmluZ3MgbXVzdCBiZSB3b3JkIGFsaWduZWQgKi8KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJlbWFpbmluZ193b3JkcyA9CisJCQkJCQkgICAgQkNDCisJCQkJCQkgICAgKHNtYl9idWZmZXJfcmVzcG9uc2UpIC8gMjsKKwkJCQkJfQorCQkJCQlsZW4gPQorCQkJCQkgICAgVW5pU3Rybmxlbigod2NoYXJfdCAqKSBiY2NfcHRyLAorCQkJCQkJICAgICAgIHJlbWFpbmluZ193b3JkcyAtIDEpOworLyogV2UgbG9vayBmb3Igb2J2aW91cyBtZXNzZWQgdXAgYmNjIG9yIHN0cmluZ3MgaW4gcmVzcG9uc2Ugc28gd2UgZG8gbm90IGdvIG9mZgorICAgdGhlIGVuZCBzaW5jZSAoYXQgbGVhc3QpIFdJTjJLIGFuZCBXaW5kb3dzIFhQIGhhdmUgYSBtYWpvciBidWcgaW4gbm90IG51bGwKKyAgIHRlcm1pbmF0aW5nIGxhc3QgVW5pY29kZSBzdHJpbmcgaW4gcmVzcG9uc2UgICovCisJCQkJCXNlcy0+c2VydmVyT1MgPQorCQkJCQkgICAgY2lmc19rY2FsbG9jKDIgKiAobGVuICsgMSksIEdGUF9LRVJORUwpOworCQkJCQljaWZzX3N0cmZyb21VQ1NfbGUoc2VzLT5zZXJ2ZXJPUywKKwkJCQkJCQkgICAod2NoYXJfdCAqKQorCQkJCQkJCSAgIGJjY19wdHIsIGxlbiwKKwkJCQkJCQkgICBubHNfY29kZXBhZ2UpOworCQkJCQliY2NfcHRyICs9IDIgKiAobGVuICsgMSk7CisJCQkJCXJlbWFpbmluZ193b3JkcyAtPSBsZW4gKyAxOworCQkJCQlzZXMtPnNlcnZlck9TWzIgKiBsZW5dID0gMDsKKwkJCQkJc2VzLT5zZXJ2ZXJPU1sxICsgKDIgKiBsZW4pXSA9IDA7CisJCQkJCWlmIChyZW1haW5pbmdfd29yZHMgPiAwKSB7CisJCQkJCQlsZW4gPSBVbmlTdHJubGVuKCh3Y2hhcl90ICopYmNjX3B0ciwKKwkJCQkJCQkJIHJlbWFpbmluZ193b3JkcworCQkJCQkJCQkgLSAxKTsKKwkJCQkJCXNlcy0+c2VydmVyTk9TID0KKwkJCQkJCSAgICBjaWZzX2tjYWxsb2MoMiAqIChsZW4gKyAxKSwKKwkJCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCQkJCQljaWZzX3N0cmZyb21VQ1NfbGUoc2VzLT5zZXJ2ZXJOT1MsCisJCQkJCQkJCSAgICh3Y2hhcl90ICopYmNjX3B0ciwKKwkJCQkJCQkJICAgbGVuLAorCQkJCQkJCQkgICBubHNfY29kZXBhZ2UpOworCQkJCQkJYmNjX3B0ciArPSAyICogKGxlbiArIDEpOworCQkJCQkJc2VzLT5zZXJ2ZXJOT1NbMiAqIGxlbl0gPSAwOworCQkJCQkJc2VzLT5zZXJ2ZXJOT1NbMSArICgyICogbGVuKV0gPSAwOworCQkJCQkJcmVtYWluaW5nX3dvcmRzIC09IGxlbiArIDE7CisJCQkJCQlpZiAocmVtYWluaW5nX3dvcmRzID4gMCkgeworCQkJCQkJCWxlbiA9IFVuaVN0cm5sZW4oKHdjaGFyX3QgKikgYmNjX3B0ciwgcmVtYWluaW5nX3dvcmRzKTsJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGFzdCBzdHJpbmcgaXMgbm90IGFsd2F5cyBudWxsIHRlcm1pbmF0ZWQgKGZvciBlLmcuIGZvciBXaW5kb3dzIFhQICYgMjAwMCkgKi8KKwkJCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9IGNpZnNfa2NhbGxvYygyKihsZW4rMSksR0ZQX0tFUk5FTCk7CisJCQkJCQkJY2lmc19zdHJmcm9tVUNTX2xlKHNlcy0+c2VydmVyRG9tYWluLAorCQkJCQkJCSAgICAgKHdjaGFyX3QgKiliY2NfcHRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwKKwkJCQkJCQkgICAgIG5sc19jb2RlcGFnZSk7CisJCQkJCQkJYmNjX3B0ciArPSAyKihsZW4rMSk7CisJCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW5bMipsZW5dID0gMDsKKwkJCQkJCQlzZXMtPnNlcnZlckRvbWFpblsxKygyKmxlbildID0gMDsKKwkJCQkJCX0gLyogZWxzZSBubyBtb3JlIHJvb20gc28gY3JlYXRlIGR1bW15IGRvbWFpbiBzdHJpbmcgKi8KKwkJCQkJCWVsc2UKKwkJCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9CisJCQkJCQkJICAgIGNpZnNfa2NhbGxvYygyLEdGUF9LRVJORUwpOworCQkJCQl9IGVsc2UgewkvKiBubyByb29tIHNvIGNyZWF0ZSBkdW1teSBkb21haW4gYW5kIE5PUyBzdHJpbmcgKi8KKwkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0gY2lmc19rY2FsbG9jKDIsIEdGUF9LRVJORUwpOworCQkJCQkJc2VzLT5zZXJ2ZXJOT1MgPSBjaWZzX2tjYWxsb2MoMiwgR0ZQX0tFUk5FTCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgewkvKiBBU0NJSSAqLworCisJCQkJCWxlbiA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7CisJCQkJCWlmICgoKGxvbmcpIGJjY19wdHIgKyBsZW4pIC0gKGxvbmcpCisJCQkJCSAgICBwQnl0ZUFyZWEoc21iX2J1ZmZlcl9yZXNwb25zZSkKKwkJCQkJICAgIDw9IEJDQyhzbWJfYnVmZmVyX3Jlc3BvbnNlKSkgeworCQkJCQkJc2VzLT5zZXJ2ZXJPUyA9IGNpZnNfa2NhbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJCQkJCXN0cm5jcHkoc2VzLT5zZXJ2ZXJPUywgYmNjX3B0ciwgbGVuKTsKKworCQkJCQkJYmNjX3B0ciArPSBsZW47CisJCQkJCQliY2NfcHRyWzBdID0gMDsJLyogbnVsbCB0ZXJtaW5hdGUgdGhlIHN0cmluZyAqLworCQkJCQkJYmNjX3B0cisrOworCisJCQkJCQlsZW4gPSBzdHJubGVuKGJjY19wdHIsIDEwMjQpOworCQkJCQkJc2VzLT5zZXJ2ZXJOT1MgPSBjaWZzX2tjYWxsb2MobGVuICsgMSxHRlBfS0VSTkVMKTsKKwkJCQkJCXN0cm5jcHkoc2VzLT5zZXJ2ZXJOT1MsIGJjY19wdHIsIGxlbik7CisJCQkJCQliY2NfcHRyICs9IGxlbjsKKwkJCQkJCWJjY19wdHJbMF0gPSAwOworCQkJCQkJYmNjX3B0cisrOworCisJCQkJCQlsZW4gPSBzdHJubGVuKGJjY19wdHIsIDEwMjQpOworCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPSBjaWZzX2tjYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCQkJCQlzdHJuY3B5KHNlcy0+c2VydmVyRG9tYWluLCBiY2NfcHRyLCBsZW4pOworCQkJCQkJYmNjX3B0ciArPSBsZW47CisJCQkJCQliY2NfcHRyWzBdID0gMDsKKwkJCQkJCWJjY19wdHIrKzsKKwkJCQkJfSBlbHNlCisJCQkJCQljRllJKDEsCisJCQkJCQkgICAgICgiVmFyaWFibGUgZmllbGQgb2YgbGVuZ3RoICVkIGV4dGVuZHMgYmV5b25kIGVuZCBvZiBzbWIgIiwKKwkJCQkJCSAgICAgIGxlbikpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY0VSUk9SKDEsCisJCQkJICAgICAgICgiIFNlY3VyaXR5IEJsb2IgTGVuZ3RoIGV4dGVuZHMgYmV5b25kIGVuZCBvZiBTTUIiKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQljRVJST1IoMSwgKCJObyBzZXNzaW9uIHN0cnVjdHVyZSBwYXNzZWQgaW4uIikpOworCQl9CisJfSBlbHNlIHsKKwkJY0VSUk9SKDEsCisJCSAgICAgICAoIiBJbnZhbGlkIFdvcmQgY291bnQgJWQ6ICIsCisJCQlzbWJfYnVmZmVyX3Jlc3BvbnNlLT5Xb3JkQ291bnQpKTsKKwkJcmMgPSAtRUlPOworCX0KKworCWlmIChzbWJfYnVmZmVyKQorCQljaWZzX2J1Zl9yZWxlYXNlKHNtYl9idWZmZXIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitDSUZTTlRMTVNTUE5lZ290aWF0ZVNlc3NTZXR1cCh1bnNpZ25lZCBpbnQgeGlkLAorCQkJICAgICAgc3RydWN0IGNpZnNTZXNJbmZvICpzZXMsIGludCAqIHBOVExNdjJfZmxhZywKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSkKK3sKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlcjsKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlcl9yZXNwb25zZTsKKwlTRVNTSU9OX1NFVFVQX0FORFggKnBTTUI7CisJU0VTU0lPTl9TRVRVUF9BTkRYICpwU01CcjsKKwljaGFyICpiY2NfcHRyOworCWNoYXIgKmRvbWFpbjsKKwlpbnQgcmMgPSAwOworCWludCByZW1haW5pbmdfd29yZHMgPSAwOworCWludCBieXRlc19yZXR1cm5lZCA9IDA7CisJaW50IGxlbjsKKwlpbnQgU2VjdXJpdHlCbG9iTGVuZ3RoID0gc2l6ZW9mIChORUdPVElBVEVfTUVTU0FHRSk7CisJUE5FR09USUFURV9NRVNTQUdFIFNlY3VyaXR5QmxvYjsKKwlQQ0hBTExFTkdFX01FU1NBR0UgU2VjdXJpdHlCbG9iMjsKKwlfX3UzMiBuZWdvdGlhdGVfZmxhZ3MsIGNhcGFiaWxpdGllczsKKwlfX3UxNiBjb3VudDsKKworCWNGWUkoMSwgKCJJbiBOVExNU1NQIHNlc3NzZXR1cCAobmVnb3RpYXRlKSAiKSk7CisJaWYoc2VzID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCWRvbWFpbiA9IHNlcy0+ZG9tYWluTmFtZTsKKwkqcE5UTE12Ml9mbGFnID0gRkFMU0U7CisJc21iX2J1ZmZlciA9IGNpZnNfYnVmX2dldCgpOworCWlmIChzbWJfYnVmZmVyID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNtYl9idWZmZXJfcmVzcG9uc2UgPSBzbWJfYnVmZmVyOworCXBTTUIgPSAoU0VTU0lPTl9TRVRVUF9BTkRYICopIHNtYl9idWZmZXI7CisJcFNNQnIgPSAoU0VTU0lPTl9TRVRVUF9BTkRYICopIHNtYl9idWZmZXJfcmVzcG9uc2U7CisKKwkvKiBzZW5kIFNNQnNlc3Npb25TZXR1cCBoZXJlICovCisJaGVhZGVyX2Fzc2VtYmxlKHNtYl9idWZmZXIsIFNNQl9DT01fU0VTU0lPTl9TRVRVUF9BTkRYLAorCQkJTlVMTCAvKiBubyB0Q29uIGV4aXN0cyB5ZXQgKi8gLCAxMiAvKiB3Y3QgKi8gKTsKKwlwU01CLT5yZXEuaGRyLkZsYWdzMiB8PSBTTUJGTEcyX0VYVF9TRUM7CisJcFNNQi0+cmVxLmhkci5GbGFncyB8PSAoU01CRkxHX0NBU0VMRVNTIHwgU01CRkxHX0NBTk9OSUNBTF9QQVRIX0ZPUk1BVCk7CisKKwlwU01CLT5yZXEuQW5kWENvbW1hbmQgPSAweEZGOworCXBTTUItPnJlcS5NYXhCdWZmZXJTaXplID0gY3B1X3RvX2xlMTYoc2VzLT5zZXJ2ZXItPm1heEJ1Zik7CisJcFNNQi0+cmVxLk1heE1weENvdW50ID0gY3B1X3RvX2xlMTYoc2VzLT5zZXJ2ZXItPm1heFJlcSk7CisKKwlpZihzZXMtPnNlcnZlci0+c2VjTW9kZSAmIChTRUNNT0RFX1NJR05fUkVRVUlSRUQgfCBTRUNNT0RFX1NJR05fRU5BQkxFRCkpCisJCXNtYl9idWZmZXItPkZsYWdzMiB8PSBTTUJGTEcyX1NFQ1VSSVRZX1NJR05BVFVSRTsKKworCWNhcGFiaWxpdGllcyA9IENBUF9MQVJHRV9GSUxFUyB8IENBUF9OVF9TTUJTIHwgQ0FQX0xFVkVMX0lJX09QTE9DS1MgfAorCSAgICBDQVBfRVhURU5ERURfU0VDVVJJVFk7CisJaWYgKHNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSUNPREUpIHsKKwkJc21iX2J1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfVU5JQ09ERTsKKwkJY2FwYWJpbGl0aWVzIHw9IENBUF9VTklDT0RFOworCX0KKwlpZiAoc2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfU1RBVFVTMzIpIHsKKwkJc21iX2J1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfRVJSX1NUQVRVUzsKKwkJY2FwYWJpbGl0aWVzIHw9IENBUF9TVEFUVVMzMjsKKwl9CisJaWYgKHNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX0RGUykgeworCQlzbWJfYnVmZmVyLT5GbGFnczIgfD0gU01CRkxHMl9ERlM7CisJCWNhcGFiaWxpdGllcyB8PSBDQVBfREZTOworCX0KKwlwU01CLT5yZXEuQ2FwYWJpbGl0aWVzID0gY3B1X3RvX2xlMzIoY2FwYWJpbGl0aWVzKTsKKworCWJjY19wdHIgPSAoY2hhciAqKSAmcFNNQi0+cmVxLlNlY3VyaXR5QmxvYjsKKwlTZWN1cml0eUJsb2IgPSAoUE5FR09USUFURV9NRVNTQUdFKSBiY2NfcHRyOworCXN0cm5jcHkoU2VjdXJpdHlCbG9iLT5TaWduYXR1cmUsIE5UTE1TU1BfU0lHTkFUVVJFLCA4KTsKKwlTZWN1cml0eUJsb2ItPk1lc3NhZ2VUeXBlID0gTnRMbU5lZ290aWF0ZTsKKwluZWdvdGlhdGVfZmxhZ3MgPQorCSAgICBOVExNU1NQX05FR09USUFURV9VTklDT0RFIHwgTlRMTVNTUF9ORUdPVElBVEVfT0VNIHwKKwkgICAgTlRMTVNTUF9SRVFVRVNUX1RBUkdFVCB8IE5UTE1TU1BfTkVHT1RJQVRFX05UTE0gfCAweDgwMDAwMDAwIHwKKwkgICAgLyogTlRMTVNTUF9ORUdPVElBVEVfQUxXQVlTX1NJR04gfCAqLyBOVExNU1NQX05FR09USUFURV8xMjg7CisJaWYoc2lnbl9DSUZTX1BEVXMpCisJCW5lZ290aWF0ZV9mbGFncyB8PSBOVExNU1NQX05FR09USUFURV9TSUdOOworCWlmKG50bG12Ml9zdXBwb3J0KQorCQluZWdvdGlhdGVfZmxhZ3MgfD0gTlRMTVNTUF9ORUdPVElBVEVfTlRMTVYyOworCS8qIHNldHVwIHBvaW50ZXJzIHRvIGRvbWFpbiBuYW1lIGFuZCB3b3Jrc3RhdGlvbiBuYW1lICovCisJYmNjX3B0ciArPSBTZWN1cml0eUJsb2JMZW5ndGg7CisKKwlTZWN1cml0eUJsb2ItPldvcmtzdGF0aW9uTmFtZS5CdWZmZXIgPSAwOworCVNlY3VyaXR5QmxvYi0+V29ya3N0YXRpb25OYW1lLkxlbmd0aCA9IDA7CisJU2VjdXJpdHlCbG9iLT5Xb3Jrc3RhdGlvbk5hbWUuTWF4aW11bUxlbmd0aCA9IDA7CisKKwlpZiAoZG9tYWluID09IE5VTEwpIHsKKwkJU2VjdXJpdHlCbG9iLT5Eb21haW5OYW1lLkJ1ZmZlciA9IDA7CisJCVNlY3VyaXR5QmxvYi0+RG9tYWluTmFtZS5MZW5ndGggPSAwOworCQlTZWN1cml0eUJsb2ItPkRvbWFpbk5hbWUuTWF4aW11bUxlbmd0aCA9IDA7CisJfSBlbHNlIHsKKwkJX191MTYgbGVuOworCQluZWdvdGlhdGVfZmxhZ3MgfD0gTlRMTVNTUF9ORUdPVElBVEVfRE9NQUlOX1NVUFBMSUVEOworCQlzdHJuY3B5KGJjY19wdHIsIGRvbWFpbiwgNjMpOworCQlsZW4gPSBzdHJubGVuKGRvbWFpbiwgNjQpOworCQlTZWN1cml0eUJsb2ItPkRvbWFpbk5hbWUuTWF4aW11bUxlbmd0aCA9CisJCSAgICBjcHVfdG9fbGUxNihsZW4pOworCQlTZWN1cml0eUJsb2ItPkRvbWFpbk5hbWUuQnVmZmVyID0KKwkJICAgIGNwdV90b19sZTMyKChsb25nKSAmU2VjdXJpdHlCbG9iLT4KKwkJCQlEb21haW5TdHJpbmcgLQorCQkJCShsb25nKSAmU2VjdXJpdHlCbG9iLT5TaWduYXR1cmUpOworCQliY2NfcHRyICs9IGxlbjsKKwkJU2VjdXJpdHlCbG9iTGVuZ3RoICs9IGxlbjsKKwkJU2VjdXJpdHlCbG9iLT5Eb21haW5OYW1lLkxlbmd0aCA9CisJCSAgICBjcHVfdG9fbGUxNihsZW4pOworCX0KKwlpZiAoc2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JQ09ERSkgeworCQlpZiAoKGxvbmcpIGJjY19wdHIgJSAyKSB7CisJCQkqYmNjX3B0ciA9IDA7CisJCQliY2NfcHRyKys7CisJCX0KKworCQlieXRlc19yZXR1cm5lZCA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIGJjY19wdHIsICJMaW51eCB2ZXJzaW9uICIsCisJCQkJICAzMiwgbmxzX2NvZGVwYWdlKTsKKwkJYmNjX3B0ciArPSAyICogYnl0ZXNfcmV0dXJuZWQ7CisJCWJ5dGVzX3JldHVybmVkID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwgc3lzdGVtX3V0c25hbWUucmVsZWFzZSwgMzIsCisJCQkJICBubHNfY29kZXBhZ2UpOworCQliY2NfcHRyICs9IDIgKiBieXRlc19yZXR1cm5lZDsKKwkJYmNjX3B0ciArPSAyOwkvKiBudWxsIHRlcm1pbmF0ZSBMaW51eCB2ZXJzaW9uICovCisJCWJ5dGVzX3JldHVybmVkID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwgQ0lGU19ORVRXT1JLX09QU1lTLAorCQkJCSAgNjQsIG5sc19jb2RlcGFnZSk7CisJCWJjY19wdHIgKz0gMiAqIGJ5dGVzX3JldHVybmVkOworCQkqKGJjY19wdHIgKyAxKSA9IDA7CisJCSooYmNjX3B0ciArIDIpID0gMDsKKwkJYmNjX3B0ciArPSAyOwkvKiBudWxsIHRlcm1pbmF0ZSBuZXR3b3JrIG9wc3lzIHN0cmluZyAqLworCQkqKGJjY19wdHIgKyAxKSA9IDA7CisJCSooYmNjX3B0ciArIDIpID0gMDsKKwkJYmNjX3B0ciArPSAyOwkvKiBudWxsIGRvbWFpbiAqLworCX0gZWxzZSB7CQkvKiBBU0NJSSAqLworCQlzdHJjcHkoYmNjX3B0ciwgIkxpbnV4IHZlcnNpb24gIik7CisJCWJjY19wdHIgKz0gc3RybGVuKCJMaW51eCB2ZXJzaW9uICIpOworCQlzdHJjcHkoYmNjX3B0ciwgc3lzdGVtX3V0c25hbWUucmVsZWFzZSk7CisJCWJjY19wdHIgKz0gc3RybGVuKHN5c3RlbV91dHNuYW1lLnJlbGVhc2UpICsgMTsKKwkJc3RyY3B5KGJjY19wdHIsIENJRlNfTkVUV09SS19PUFNZUyk7CisJCWJjY19wdHIgKz0gc3RybGVuKENJRlNfTkVUV09SS19PUFNZUykgKyAxOworCQliY2NfcHRyKys7CS8qIGVtcHR5IGRvbWFpbiBmaWVsZCAqLworCQkqYmNjX3B0ciA9IDA7CisJfQorCVNlY3VyaXR5QmxvYi0+TmVnb3RpYXRlRmxhZ3MgPSBjcHVfdG9fbGUzMihuZWdvdGlhdGVfZmxhZ3MpOworCXBTTUItPnJlcS5TZWN1cml0eUJsb2JMZW5ndGggPSBjcHVfdG9fbGUxNihTZWN1cml0eUJsb2JMZW5ndGgpOworCWNvdW50ID0gKGxvbmcpIGJjY19wdHIgLSAobG9uZykgcEJ5dGVBcmVhKHNtYl9idWZmZXIpOworCXNtYl9idWZmZXItPnNtYl9idWZfbGVuZ3RoICs9IGNvdW50OworCXBTTUItPnJlcS5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgc2VzLCBzbWJfYnVmZmVyLCBzbWJfYnVmZmVyX3Jlc3BvbnNlLAorCQkJICZieXRlc19yZXR1cm5lZCwgMSk7CisKKwlpZiAoc21iX2J1ZmZlcl9yZXNwb25zZS0+U3RhdHVzLkNpZnNFcnJvciA9PQorCSAgICBjcHVfdG9fbGUzMihOVF9TVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVEKSkKKwkJcmMgPSAwOworCisJaWYgKHJjKSB7CisvKiAgICByYyA9IG1hcF9zbWJfdG9fbGludXhfZXJyb3Ioc21iX2J1ZmZlcl9yZXNwb25zZSk7ICAqLy8qIGRvbmUgaW4gU2VuZFJlY2VpdmUgbm93ICovCisJfSBlbHNlIGlmICgoc21iX2J1ZmZlcl9yZXNwb25zZS0+V29yZENvdW50ID09IDMpCisJCSAgIHx8IChzbWJfYnVmZmVyX3Jlc3BvbnNlLT5Xb3JkQ291bnQgPT0gNCkpIHsKKwkJX191MTYgYWN0aW9uID0gbGUxNl90b19jcHUocFNNQnItPnJlc3AuQWN0aW9uKTsKKwkJX191MTYgYmxvYl9sZW4gPSBsZTE2X3RvX2NwdShwU01Cci0+cmVzcC5TZWN1cml0eUJsb2JMZW5ndGgpOworCisJCWlmIChhY3Rpb24gJiBHVUVTVF9MT0dJTikKKwkJCWNGWUkoMSwgKCIgR3Vlc3QgbG9naW4iKSk7CQorICAgICAgICAvKiBEbyB3ZSB3YW50IHRvIHNldCBhbnl0aGluZyBpbiBTZXNJbmZvIHN0cnVjdCB3aGVuIGd1ZXN0IGxvZ2luPyAqLworCisJCWJjY19wdHIgPSBwQnl0ZUFyZWEoc21iX2J1ZmZlcl9yZXNwb25zZSk7CQorICAgICAgICAvKiByZXNwb25zZSBjYW4gaGF2ZSBlaXRoZXIgMyBvciA0IHdvcmQgY291bnQgLSBTYW1iYSBzZW5kcyAzICovCisKKwkJU2VjdXJpdHlCbG9iMiA9IChQQ0hBTExFTkdFX01FU1NBR0UpIGJjY19wdHI7CisJCWlmIChTZWN1cml0eUJsb2IyLT5NZXNzYWdlVHlwZSAhPSBOdExtQ2hhbGxlbmdlKSB7CisJCQljRllJKDEsCisJCQkgICAgICgiVW5leHBlY3RlZCBOVExNU1NQIG1lc3NhZ2UgdHlwZSByZWNlaXZlZCAlZCIsCisJCQkgICAgICBTZWN1cml0eUJsb2IyLT5NZXNzYWdlVHlwZSkpOworCQl9IGVsc2UgaWYgKHNlcykgeworCQkJc2VzLT5TdWlkID0gc21iX2J1ZmZlcl9yZXNwb25zZS0+VWlkOyAvKiBVSUQgbGVmdCBpbiBsZSBmb3JtYXQgKi8gCisJCQljRllJKDEsICgiVUlEID0gJWQgIiwgc2VzLT5TdWlkKSk7CisJCQlpZiAoKHBTTUJyLT5yZXNwLmhkci5Xb3JkQ291bnQgPT0gMykKKwkJCSAgICB8fCAoKHBTTUJyLT5yZXNwLmhkci5Xb3JkQ291bnQgPT0gNCkKKwkJCQkmJiAoYmxvYl9sZW4gPAorCQkJCSAgICBwU01Cci0+cmVzcC5CeXRlQ291bnQpKSkgeworCisJCQkJaWYgKHBTTUJyLT5yZXNwLmhkci5Xb3JkQ291bnQgPT0gNCkgeworCQkJCQliY2NfcHRyICs9IGJsb2JfbGVuOworCQkJCQljRllJKDEsCisJCQkJCSAgICAgKCJTZWN1cml0eSBCbG9iIExlbmd0aCAlZCAiLAorCQkJCQkgICAgICBibG9iX2xlbikpOworCQkJCX0KKworCQkJCWNGWUkoMSwgKCJOVExNU1NQIENoYWxsZW5nZSByY3ZkICIpKTsKKworCQkJCW1lbWNweShzZXMtPnNlcnZlci0+Y3J5cHRLZXksCisJCQkJICAgICAgIFNlY3VyaXR5QmxvYjItPkNoYWxsZW5nZSwKKwkJCQkgICAgICAgQ0lGU19DUllQVE9fS0VZX1NJWkUpOworCQkJCWlmKFNlY3VyaXR5QmxvYjItPk5lZ290aWF0ZUZsYWdzICYgY3B1X3RvX2xlMzIoTlRMTVNTUF9ORUdPVElBVEVfTlRMTVYyKSkKKwkJCQkJKnBOVExNdjJfZmxhZyA9IFRSVUU7CisKKwkJCQlpZigoU2VjdXJpdHlCbG9iMi0+TmVnb3RpYXRlRmxhZ3MgJiAKKwkJCQkJY3B1X3RvX2xlMzIoTlRMTVNTUF9ORUdPVElBVEVfQUxXQVlTX1NJR04pKSAKKwkJCQkJfHwgKHNpZ25fQ0lGU19QRFVzID4gMSkpCisJCQkJCQlzZXMtPnNlcnZlci0+c2VjTW9kZSB8PSAKKwkJCQkJCQlTRUNNT0RFX1NJR05fUkVRVUlSRUQ7CQorCQkJCWlmICgoU2VjdXJpdHlCbG9iMi0+TmVnb3RpYXRlRmxhZ3MgJiAKKwkJCQkJY3B1X3RvX2xlMzIoTlRMTVNTUF9ORUdPVElBVEVfU0lHTikpICYmIChzaWduX0NJRlNfUERVcykpCisJCQkJCQlzZXMtPnNlcnZlci0+c2VjTW9kZSB8PSAKKwkJCQkJCQlTRUNNT0RFX1NJR05fRU5BQkxFRDsKKworCQkJCWlmIChzbWJfYnVmZmVyLT5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJCQkJaWYgKChsb25nKSAoYmNjX3B0cikgJSAyKSB7CisJCQkJCQlyZW1haW5pbmdfd29yZHMgPQorCQkJCQkJICAgIChCQ0Moc21iX2J1ZmZlcl9yZXNwb25zZSkKKwkJCQkJCSAgICAgLSAxKSAvIDI7CisJCQkJCQliY2NfcHRyKys7CS8qIFVuaWNvZGUgc3RyaW5ncyBtdXN0IGJlIHdvcmQgYWxpZ25lZCAqLworCQkJCQl9IGVsc2UgeworCQkJCQkJcmVtYWluaW5nX3dvcmRzID0KKwkJCQkJCSAgICBCQ0MKKwkJCQkJCSAgICAoc21iX2J1ZmZlcl9yZXNwb25zZSkgLyAyOworCQkJCQl9CisJCQkJCWxlbiA9CisJCQkJCSAgICBVbmlTdHJubGVuKCh3Y2hhcl90ICopIGJjY19wdHIsCisJCQkJCQkgICAgICAgcmVtYWluaW5nX3dvcmRzIC0gMSk7CisvKiBXZSBsb29rIGZvciBvYnZpb3VzIG1lc3NlZCB1cCBiY2Mgb3Igc3RyaW5ncyBpbiByZXNwb25zZSBzbyB3ZSBkbyBub3QgZ28gb2ZmCisgICB0aGUgZW5kIHNpbmNlIChhdCBsZWFzdCkgV0lOMksgYW5kIFdpbmRvd3MgWFAgaGF2ZSBhIG1ham9yIGJ1ZyBpbiBub3QgbnVsbAorICAgdGVybWluYXRpbmcgbGFzdCBVbmljb2RlIHN0cmluZyBpbiByZXNwb25zZSAgKi8KKwkJCQkJc2VzLT5zZXJ2ZXJPUyA9CisJCQkJCSAgICBjaWZzX2tjYWxsb2MoMiAqIChsZW4gKyAxKSwgR0ZQX0tFUk5FTCk7CisJCQkJCWNpZnNfc3RyZnJvbVVDU19sZShzZXMtPnNlcnZlck9TLAorCQkJCQkJCSAgICh3Y2hhcl90ICopCisJCQkJCQkJICAgYmNjX3B0ciwgbGVuLAorCQkJCQkJCSAgIG5sc19jb2RlcGFnZSk7CisJCQkJCWJjY19wdHIgKz0gMiAqIChsZW4gKyAxKTsKKwkJCQkJcmVtYWluaW5nX3dvcmRzIC09IGxlbiArIDE7CisJCQkJCXNlcy0+c2VydmVyT1NbMiAqIGxlbl0gPSAwOworCQkJCQlzZXMtPnNlcnZlck9TWzEgKyAoMiAqIGxlbildID0gMDsKKwkJCQkJaWYgKHJlbWFpbmluZ193b3JkcyA+IDApIHsKKwkJCQkJCWxlbiA9IFVuaVN0cm5sZW4oKHdjaGFyX3QgKikKKwkJCQkJCQkJIGJjY19wdHIsCisJCQkJCQkJCSByZW1haW5pbmdfd29yZHMKKwkJCQkJCQkJIC0gMSk7CisJCQkJCQlzZXMtPnNlcnZlck5PUyA9CisJCQkJCQkgICAgY2lmc19rY2FsbG9jKDIgKiAobGVuICsgMSksCisJCQkJCQkJICAgIEdGUF9LRVJORUwpOworCQkJCQkJY2lmc19zdHJmcm9tVUNTX2xlKHNlcy0+CisJCQkJCQkJCSAgIHNlcnZlck5PUywKKwkJCQkJCQkJICAgKHdjaGFyX3QgKikKKwkJCQkJCQkJICAgYmNjX3B0ciwKKwkJCQkJCQkJICAgbGVuLAorCQkJCQkJCQkgICBubHNfY29kZXBhZ2UpOworCQkJCQkJYmNjX3B0ciArPSAyICogKGxlbiArIDEpOworCQkJCQkJc2VzLT5zZXJ2ZXJOT1NbMiAqIGxlbl0gPSAwOworCQkJCQkJc2VzLT5zZXJ2ZXJOT1NbMSArCisJCQkJCQkJICAgICAgICgyICogbGVuKV0gPSAwOworCQkJCQkJcmVtYWluaW5nX3dvcmRzIC09IGxlbiArIDE7CisJCQkJCQlpZiAocmVtYWluaW5nX3dvcmRzID4gMCkgeworCQkJCQkJCWxlbiA9IFVuaVN0cm5sZW4oKHdjaGFyX3QgKikgYmNjX3B0ciwgcmVtYWluaW5nX3dvcmRzKTsJCisgICAgICAgICAgIC8qIGxhc3Qgc3RyaW5nIGlzIG5vdCBhbHdheXMgbnVsbCB0ZXJtaW5hdGVkIChmb3IgZS5nLiBmb3IgV2luZG93cyBYUCAmIDIwMDApICovCisJCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPQorCQkJCQkJCSAgICBjaWZzX2tjYWxsb2MoMiAqCisJCQkJCQkJCSAgICAobGVuICsKKwkJCQkJCQkJICAgICAxKSwKKwkJCQkJCQkJICAgIEdGUF9LRVJORUwpOworCQkJCQkJCWNpZnNfc3RyZnJvbVVDU19sZQorCQkJCQkJCSAgICAoc2VzLT4KKwkJCQkJCQkgICAgIHNlcnZlckRvbWFpbiwKKwkJCQkJCQkgICAgICh3Y2hhcl90ICopCisJCQkJCQkJICAgICBiY2NfcHRyLCBsZW4sCisJCQkJCQkJICAgICBubHNfY29kZXBhZ2UpOworCQkJCQkJCWJjY19wdHIgKz0KKwkJCQkJCQkgICAgMiAqIChsZW4gKyAxKTsKKwkJCQkJCQlzZXMtPgorCQkJCQkJCSAgICBzZXJ2ZXJEb21haW5bMgorCQkJCQkJCQkJICogbGVuXQorCQkJCQkJCSAgICA9IDA7CisJCQkJCQkJc2VzLT4KKwkJCQkJCQkgICAgc2VydmVyRG9tYWluWzEKKwkJCQkJCQkJCSArCisJCQkJCQkJCQkgKDIKKwkJCQkJCQkJCSAgKgorCQkJCQkJCQkJICBsZW4pXQorCQkJCQkJCSAgICA9IDA7CisJCQkJCQl9IC8qIGVsc2Ugbm8gbW9yZSByb29tIHNvIGNyZWF0ZSBkdW1teSBkb21haW4gc3RyaW5nICovCisJCQkJCQllbHNlCisJCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPQorCQkJCQkJCSAgICBjaWZzX2tjYWxsb2MoMiwKKwkJCQkJCQkJICAgIEdGUF9LRVJORUwpOworCQkJCQl9IGVsc2UgewkvKiBubyByb29tIHNvIGNyZWF0ZSBkdW1teSBkb21haW4gYW5kIE5PUyBzdHJpbmcgKi8KKwkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0KKwkJCQkJCSAgICBjaWZzX2tjYWxsb2MoMiwgR0ZQX0tFUk5FTCk7CisJCQkJCQlzZXMtPnNlcnZlck5PUyA9CisJCQkJCQkgICAgY2lmc19rY2FsbG9jKDIsIEdGUF9LRVJORUwpOworCQkJCQl9CisJCQkJfSBlbHNlIHsJLyogQVNDSUkgKi8KKwkJCQkJbGVuID0gc3RybmxlbihiY2NfcHRyLCAxMDI0KTsKKwkJCQkJaWYgKCgobG9uZykgYmNjX3B0ciArIGxlbikgLSAobG9uZykKKwkJCQkJICAgIHBCeXRlQXJlYShzbWJfYnVmZmVyX3Jlc3BvbnNlKQorCQkJCQkgICAgPD0gQkNDKHNtYl9idWZmZXJfcmVzcG9uc2UpKSB7CisJCQkJCQlzZXMtPnNlcnZlck9TID0KKwkJCQkJCSAgICBjaWZzX2tjYWxsb2MobGVuICsgMSwKKwkJCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCQkJCQlzdHJuY3B5KHNlcy0+c2VydmVyT1MsCisJCQkJCQkJYmNjX3B0ciwgbGVuKTsKKworCQkJCQkJYmNjX3B0ciArPSBsZW47CisJCQkJCQliY2NfcHRyWzBdID0gMDsJLyogbnVsbCB0ZXJtaW5hdGUgc3RyaW5nICovCisJCQkJCQliY2NfcHRyKys7CisKKwkJCQkJCWxlbiA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7CisJCQkJCQlzZXMtPnNlcnZlck5PUyA9CisJCQkJCQkgICAgY2lmc19rY2FsbG9jKGxlbiArIDEsCisJCQkJCQkJICAgIEdGUF9LRVJORUwpOworCQkJCQkJc3RybmNweShzZXMtPnNlcnZlck5PUywgYmNjX3B0ciwgbGVuKTsKKwkJCQkJCWJjY19wdHIgKz0gbGVuOworCQkJCQkJYmNjX3B0clswXSA9IDA7CisJCQkJCQliY2NfcHRyKys7CisKKwkJCQkJCWxlbiA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7CisJCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9CisJCQkJCQkgICAgY2lmc19rY2FsbG9jKGxlbiArIDEsCisJCQkJCQkJICAgIEdGUF9LRVJORUwpOworCQkJCQkJc3RybmNweShzZXMtPnNlcnZlckRvbWFpbiwgYmNjX3B0ciwgbGVuKTsJCisJCQkJCQliY2NfcHRyICs9IGxlbjsKKwkJCQkJCWJjY19wdHJbMF0gPSAwOworCQkJCQkJYmNjX3B0cisrOworCQkJCQl9IGVsc2UKKwkJCQkJCWNGWUkoMSwKKwkJCQkJCSAgICAgKCJWYXJpYWJsZSBmaWVsZCBvZiBsZW5ndGggJWQgZXh0ZW5kcyBiZXlvbmQgZW5kIG9mIHNtYiAiLAorCQkJCQkJICAgICAgbGVuKSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljRVJST1IoMSwKKwkJCQkgICAgICAgKCIgU2VjdXJpdHkgQmxvYiBMZW5ndGggZXh0ZW5kcyBiZXlvbmQgZW5kIG9mIFNNQiIpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNFUlJPUigxLCAoIk5vIHNlc3Npb24gc3RydWN0dXJlIHBhc3NlZCBpbi4iKSk7CisJCX0KKwl9IGVsc2UgeworCQljRVJST1IoMSwKKwkJICAgICAgICgiIEludmFsaWQgV29yZCBjb3VudCAlZDogIiwKKwkJCXNtYl9idWZmZXJfcmVzcG9uc2UtPldvcmRDb3VudCkpOworCQlyYyA9IC1FSU87CisJfQorCisJaWYgKHNtYl9idWZmZXIpCisJCWNpZnNfYnVmX3JlbGVhc2Uoc21iX2J1ZmZlcik7CisKKwlyZXR1cm4gcmM7Cit9CitzdGF0aWMgaW50CitDSUZTTlRMTVNTUEF1dGhTZXNzU2V0dXAodW5zaWduZWQgaW50IHhpZCwgc3RydWN0IGNpZnNTZXNJbmZvICpzZXMsCisJCWNoYXIgKm50bG1fc2Vzc2lvbl9rZXksIGludCBudGxtdjJfZmxhZywKKwkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCXN0cnVjdCBzbWJfaGRyICpzbWJfYnVmZmVyOworCXN0cnVjdCBzbWJfaGRyICpzbWJfYnVmZmVyX3Jlc3BvbnNlOworCVNFU1NJT05fU0VUVVBfQU5EWCAqcFNNQjsKKwlTRVNTSU9OX1NFVFVQX0FORFggKnBTTUJyOworCWNoYXIgKmJjY19wdHI7CisJY2hhciAqdXNlcjsKKwljaGFyICpkb21haW47CisJaW50IHJjID0gMDsKKwlpbnQgcmVtYWluaW5nX3dvcmRzID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQgPSAwOworCWludCBsZW47CisJaW50IFNlY3VyaXR5QmxvYkxlbmd0aCA9IHNpemVvZiAoQVVUSEVOVElDQVRFX01FU1NBR0UpOworCVBBVVRIRU5USUNBVEVfTUVTU0FHRSBTZWN1cml0eUJsb2I7CisJX191MzIgbmVnb3RpYXRlX2ZsYWdzLCBjYXBhYmlsaXRpZXM7CisJX191MTYgY291bnQ7CisKKwljRllJKDEsICgiSW4gTlRMTVNTUFNlc3NTZXR1cCAoQXV0aGVudGljYXRlKSIpKTsKKwlpZihzZXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdXNlciA9IHNlcy0+dXNlck5hbWU7CisJZG9tYWluID0gc2VzLT5kb21haW5OYW1lOworCXNtYl9idWZmZXIgPSBjaWZzX2J1Zl9nZXQoKTsKKwlpZiAoc21iX2J1ZmZlciA9PSBOVUxMKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzbWJfYnVmZmVyX3Jlc3BvbnNlID0gc21iX2J1ZmZlcjsKKwlwU01CID0gKFNFU1NJT05fU0VUVVBfQU5EWCAqKSBzbWJfYnVmZmVyOworCXBTTUJyID0gKFNFU1NJT05fU0VUVVBfQU5EWCAqKSBzbWJfYnVmZmVyX3Jlc3BvbnNlOworCisJLyogc2VuZCBTTUJzZXNzaW9uU2V0dXAgaGVyZSAqLworCWhlYWRlcl9hc3NlbWJsZShzbWJfYnVmZmVyLCBTTUJfQ09NX1NFU1NJT05fU0VUVVBfQU5EWCwKKwkJCU5VTEwgLyogbm8gdENvbiBleGlzdHMgeWV0ICovICwgMTIgLyogd2N0ICovICk7CisJcFNNQi0+cmVxLmhkci5GbGFncyB8PSAoU01CRkxHX0NBU0VMRVNTIHwgU01CRkxHX0NBTk9OSUNBTF9QQVRIX0ZPUk1BVCk7CisJcFNNQi0+cmVxLmhkci5GbGFnczIgfD0gU01CRkxHMl9FWFRfU0VDOworCXBTTUItPnJlcS5BbmRYQ29tbWFuZCA9IDB4RkY7CisJcFNNQi0+cmVxLk1heEJ1ZmZlclNpemUgPSBjcHVfdG9fbGUxNihzZXMtPnNlcnZlci0+bWF4QnVmKTsKKwlwU01CLT5yZXEuTWF4TXB4Q291bnQgPSBjcHVfdG9fbGUxNihzZXMtPnNlcnZlci0+bWF4UmVxKTsKKworCXBTTUItPnJlcS5oZHIuVWlkID0gc2VzLT5TdWlkOworCisJaWYoc2VzLT5zZXJ2ZXItPnNlY01vZGUgJiAoU0VDTU9ERV9TSUdOX1JFUVVJUkVEIHwgU0VDTU9ERV9TSUdOX0VOQUJMRUQpKQorCQlzbWJfYnVmZmVyLT5GbGFnczIgfD0gU01CRkxHMl9TRUNVUklUWV9TSUdOQVRVUkU7CisKKwljYXBhYmlsaXRpZXMgPSBDQVBfTEFSR0VfRklMRVMgfCBDQVBfTlRfU01CUyB8IENBUF9MRVZFTF9JSV9PUExPQ0tTIHwKKwkgICAgQ0FQX0VYVEVOREVEX1NFQ1VSSVRZOworCWlmIChzZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklDT0RFKSB7CisJCXNtYl9idWZmZXItPkZsYWdzMiB8PSBTTUJGTEcyX1VOSUNPREU7CisJCWNhcGFiaWxpdGllcyB8PSBDQVBfVU5JQ09ERTsKKwl9CisJaWYgKHNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1NUQVRVUzMyKSB7CisJCXNtYl9idWZmZXItPkZsYWdzMiB8PSBTTUJGTEcyX0VSUl9TVEFUVVM7CisJCWNhcGFiaWxpdGllcyB8PSBDQVBfU1RBVFVTMzI7CisJfQorCWlmIChzZXMtPmNhcGFiaWxpdGllcyAmIENBUF9ERlMpIHsKKwkJc21iX2J1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfREZTOworCQljYXBhYmlsaXRpZXMgfD0gQ0FQX0RGUzsKKwl9CisJcFNNQi0+cmVxLkNhcGFiaWxpdGllcyA9IGNwdV90b19sZTMyKGNhcGFiaWxpdGllcyk7CisKKwliY2NfcHRyID0gKGNoYXIgKikgJnBTTUItPnJlcS5TZWN1cml0eUJsb2I7CisJU2VjdXJpdHlCbG9iID0gKFBBVVRIRU5USUNBVEVfTUVTU0FHRSkgYmNjX3B0cjsKKwlzdHJuY3B5KFNlY3VyaXR5QmxvYi0+U2lnbmF0dXJlLCBOVExNU1NQX1NJR05BVFVSRSwgOCk7CisJU2VjdXJpdHlCbG9iLT5NZXNzYWdlVHlwZSA9IE50TG1BdXRoZW50aWNhdGU7CisJYmNjX3B0ciArPSBTZWN1cml0eUJsb2JMZW5ndGg7CisJbmVnb3RpYXRlX2ZsYWdzID0gCisJICAgIE5UTE1TU1BfTkVHT1RJQVRFX1VOSUNPREUgfCBOVExNU1NQX1JFUVVFU1RfVEFSR0VUIHwKKwkgICAgTlRMTVNTUF9ORUdPVElBVEVfTlRMTSB8IE5UTE1TU1BfTkVHT1RJQVRFX1RBUkdFVF9JTkZPIHwKKwkgICAgMHg4MDAwMDAwMCB8IE5UTE1TU1BfTkVHT1RJQVRFXzEyODsKKwlpZihzaWduX0NJRlNfUERVcykKKwkJbmVnb3RpYXRlX2ZsYWdzIHw9IC8qIE5UTE1TU1BfTkVHT1RJQVRFX0FMV0FZU19TSUdOIHwqLyBOVExNU1NQX05FR09USUFURV9TSUdOOworCWlmKG50bG12Ml9mbGFnKQorCQluZWdvdGlhdGVfZmxhZ3MgfD0gTlRMTVNTUF9ORUdPVElBVEVfTlRMTVYyOworCisvKiBzZXR1cCBwb2ludGVycyB0byBkb21haW4gbmFtZSBhbmQgd29ya3N0YXRpb24gbmFtZSAqLworCisJU2VjdXJpdHlCbG9iLT5Xb3Jrc3RhdGlvbk5hbWUuQnVmZmVyID0gMDsKKwlTZWN1cml0eUJsb2ItPldvcmtzdGF0aW9uTmFtZS5MZW5ndGggPSAwOworCVNlY3VyaXR5QmxvYi0+V29ya3N0YXRpb25OYW1lLk1heGltdW1MZW5ndGggPSAwOworCVNlY3VyaXR5QmxvYi0+U2Vzc2lvbktleS5MZW5ndGggPSAwOworCVNlY3VyaXR5QmxvYi0+U2Vzc2lvbktleS5NYXhpbXVtTGVuZ3RoID0gMDsKKwlTZWN1cml0eUJsb2ItPlNlc3Npb25LZXkuQnVmZmVyID0gMDsKKworCVNlY3VyaXR5QmxvYi0+TG1DaGFsbGVuZ2VSZXNwb25zZS5MZW5ndGggPSAwOworCVNlY3VyaXR5QmxvYi0+TG1DaGFsbGVuZ2VSZXNwb25zZS5NYXhpbXVtTGVuZ3RoID0gMDsKKwlTZWN1cml0eUJsb2ItPkxtQ2hhbGxlbmdlUmVzcG9uc2UuQnVmZmVyID0gMDsKKworCVNlY3VyaXR5QmxvYi0+TnRDaGFsbGVuZ2VSZXNwb25zZS5MZW5ndGggPQorCSAgICBjcHVfdG9fbGUxNihDSUZTX1NFU1NJT05fS0VZX1NJWkUpOworCVNlY3VyaXR5QmxvYi0+TnRDaGFsbGVuZ2VSZXNwb25zZS5NYXhpbXVtTGVuZ3RoID0KKwkgICAgY3B1X3RvX2xlMTYoQ0lGU19TRVNTSU9OX0tFWV9TSVpFKTsKKwltZW1jcHkoYmNjX3B0ciwgbnRsbV9zZXNzaW9uX2tleSwgQ0lGU19TRVNTSU9OX0tFWV9TSVpFKTsKKwlTZWN1cml0eUJsb2ItPk50Q2hhbGxlbmdlUmVzcG9uc2UuQnVmZmVyID0KKwkgICAgY3B1X3RvX2xlMzIoU2VjdXJpdHlCbG9iTGVuZ3RoKTsKKwlTZWN1cml0eUJsb2JMZW5ndGggKz0gQ0lGU19TRVNTSU9OX0tFWV9TSVpFOworCWJjY19wdHIgKz0gQ0lGU19TRVNTSU9OX0tFWV9TSVpFOworCisJaWYgKHNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSUNPREUpIHsKKwkJaWYgKGRvbWFpbiA9PSBOVUxMKSB7CisJCQlTZWN1cml0eUJsb2ItPkRvbWFpbk5hbWUuQnVmZmVyID0gMDsKKwkJCVNlY3VyaXR5QmxvYi0+RG9tYWluTmFtZS5MZW5ndGggPSAwOworCQkJU2VjdXJpdHlCbG9iLT5Eb21haW5OYW1lLk1heGltdW1MZW5ndGggPSAwOworCQl9IGVsc2UgeworCQkJX191MTYgbGVuID0KKwkJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIGJjY19wdHIsIGRvbWFpbiwgNjQsCisJCQkJCSAgbmxzX2NvZGVwYWdlKTsKKwkJCWxlbiAqPSAyOworCQkJU2VjdXJpdHlCbG9iLT5Eb21haW5OYW1lLk1heGltdW1MZW5ndGggPQorCQkJICAgIGNwdV90b19sZTE2KGxlbik7CisJCQlTZWN1cml0eUJsb2ItPkRvbWFpbk5hbWUuQnVmZmVyID0KKwkJCSAgICBjcHVfdG9fbGUzMihTZWN1cml0eUJsb2JMZW5ndGgpOworCQkJYmNjX3B0ciArPSBsZW47CisJCQlTZWN1cml0eUJsb2JMZW5ndGggKz0gbGVuOworCQkJU2VjdXJpdHlCbG9iLT5Eb21haW5OYW1lLkxlbmd0aCA9CisJCQkgICAgY3B1X3RvX2xlMTYobGVuKTsKKwkJfQorCQlpZiAodXNlciA9PSBOVUxMKSB7CisJCQlTZWN1cml0eUJsb2ItPlVzZXJOYW1lLkJ1ZmZlciA9IDA7CisJCQlTZWN1cml0eUJsb2ItPlVzZXJOYW1lLkxlbmd0aCA9IDA7CisJCQlTZWN1cml0eUJsb2ItPlVzZXJOYW1lLk1heGltdW1MZW5ndGggPSAwOworCQl9IGVsc2UgeworCQkJX191MTYgbGVuID0KKwkJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIGJjY19wdHIsIHVzZXIsIDY0LAorCQkJCQkgIG5sc19jb2RlcGFnZSk7CisJCQlsZW4gKj0gMjsKKwkJCVNlY3VyaXR5QmxvYi0+VXNlck5hbWUuTWF4aW11bUxlbmd0aCA9CisJCQkgICAgY3B1X3RvX2xlMTYobGVuKTsKKwkJCVNlY3VyaXR5QmxvYi0+VXNlck5hbWUuQnVmZmVyID0KKwkJCSAgICBjcHVfdG9fbGUzMihTZWN1cml0eUJsb2JMZW5ndGgpOworCQkJYmNjX3B0ciArPSBsZW47CisJCQlTZWN1cml0eUJsb2JMZW5ndGggKz0gbGVuOworCQkJU2VjdXJpdHlCbG9iLT5Vc2VyTmFtZS5MZW5ndGggPQorCQkJICAgIGNwdV90b19sZTE2KGxlbik7CisJCX0KKworCQkvKiBTZWN1cml0eUJsb2ItPldvcmtzdGF0aW9uTmFtZS5MZW5ndGggPSBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIGJjY19wdHIsICJBTUFDSElORSIsNjQsIG5sc19jb2RlcGFnZSk7CisJCSAgIFNlY3VyaXR5QmxvYi0+V29ya3N0YXRpb25OYW1lLkxlbmd0aCAqPSAyOworCQkgICBTZWN1cml0eUJsb2ItPldvcmtzdGF0aW9uTmFtZS5NYXhpbXVtTGVuZ3RoID0gY3B1X3RvX2xlMTYoU2VjdXJpdHlCbG9iLT5Xb3Jrc3RhdGlvbk5hbWUuTGVuZ3RoKTsKKwkJICAgU2VjdXJpdHlCbG9iLT5Xb3Jrc3RhdGlvbk5hbWUuQnVmZmVyID0gY3B1X3RvX2xlMzIoU2VjdXJpdHlCbG9iTGVuZ3RoKTsKKwkJICAgYmNjX3B0ciArPSBTZWN1cml0eUJsb2ItPldvcmtzdGF0aW9uTmFtZS5MZW5ndGg7CisJCSAgIFNlY3VyaXR5QmxvYkxlbmd0aCArPSBTZWN1cml0eUJsb2ItPldvcmtzdGF0aW9uTmFtZS5MZW5ndGg7CisJCSAgIFNlY3VyaXR5QmxvYi0+V29ya3N0YXRpb25OYW1lLkxlbmd0aCA9IGNwdV90b19sZTE2KFNlY3VyaXR5QmxvYi0+V29ya3N0YXRpb25OYW1lLkxlbmd0aCk7ICAqLworCisJCWlmICgobG9uZykgYmNjX3B0ciAlIDIpIHsKKwkJCSpiY2NfcHRyID0gMDsKKwkJCWJjY19wdHIrKzsKKwkJfQorCQlieXRlc19yZXR1cm5lZCA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIGJjY19wdHIsICJMaW51eCB2ZXJzaW9uICIsCisJCQkJICAzMiwgbmxzX2NvZGVwYWdlKTsKKwkJYmNjX3B0ciArPSAyICogYnl0ZXNfcmV0dXJuZWQ7CisJCWJ5dGVzX3JldHVybmVkID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwgc3lzdGVtX3V0c25hbWUucmVsZWFzZSwgMzIsCisJCQkJICBubHNfY29kZXBhZ2UpOworCQliY2NfcHRyICs9IDIgKiBieXRlc19yZXR1cm5lZDsKKwkJYmNjX3B0ciArPSAyOwkvKiBudWxsIHRlcm0gdmVyc2lvbiBzdHJpbmcgKi8KKwkJYnl0ZXNfcmV0dXJuZWQgPQorCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBiY2NfcHRyLCBDSUZTX05FVFdPUktfT1BTWVMsCisJCQkJICA2NCwgbmxzX2NvZGVwYWdlKTsKKwkJYmNjX3B0ciArPSAyICogYnl0ZXNfcmV0dXJuZWQ7CisJCSooYmNjX3B0ciArIDEpID0gMDsKKwkJKihiY2NfcHRyICsgMikgPSAwOworCQliY2NfcHRyICs9IDI7CS8qIG51bGwgdGVybWluYXRlIG5ldHdvcmsgb3BzeXMgc3RyaW5nICovCisJCSooYmNjX3B0ciArIDEpID0gMDsKKwkJKihiY2NfcHRyICsgMikgPSAwOworCQliY2NfcHRyICs9IDI7CS8qIG51bGwgZG9tYWluICovCisJfSBlbHNlIHsJCS8qIEFTQ0lJICovCisJCWlmIChkb21haW4gPT0gTlVMTCkgeworCQkJU2VjdXJpdHlCbG9iLT5Eb21haW5OYW1lLkJ1ZmZlciA9IDA7CisJCQlTZWN1cml0eUJsb2ItPkRvbWFpbk5hbWUuTGVuZ3RoID0gMDsKKwkJCVNlY3VyaXR5QmxvYi0+RG9tYWluTmFtZS5NYXhpbXVtTGVuZ3RoID0gMDsKKwkJfSBlbHNlIHsKKwkJCV9fdTE2IGxlbjsKKwkJCW5lZ290aWF0ZV9mbGFncyB8PSBOVExNU1NQX05FR09USUFURV9ET01BSU5fU1VQUExJRUQ7CisJCQlzdHJuY3B5KGJjY19wdHIsIGRvbWFpbiwgNjMpOworCQkJbGVuID0gc3Rybmxlbihkb21haW4sIDY0KTsKKwkJCVNlY3VyaXR5QmxvYi0+RG9tYWluTmFtZS5NYXhpbXVtTGVuZ3RoID0KKwkJCSAgICBjcHVfdG9fbGUxNihsZW4pOworCQkJU2VjdXJpdHlCbG9iLT5Eb21haW5OYW1lLkJ1ZmZlciA9CisJCQkgICAgY3B1X3RvX2xlMzIoU2VjdXJpdHlCbG9iTGVuZ3RoKTsKKwkJCWJjY19wdHIgKz0gbGVuOworCQkJU2VjdXJpdHlCbG9iTGVuZ3RoICs9IGxlbjsKKwkJCVNlY3VyaXR5QmxvYi0+RG9tYWluTmFtZS5MZW5ndGggPSBjcHVfdG9fbGUxNihsZW4pOworCQl9CisJCWlmICh1c2VyID09IE5VTEwpIHsKKwkJCVNlY3VyaXR5QmxvYi0+VXNlck5hbWUuQnVmZmVyID0gMDsKKwkJCVNlY3VyaXR5QmxvYi0+VXNlck5hbWUuTGVuZ3RoID0gMDsKKwkJCVNlY3VyaXR5QmxvYi0+VXNlck5hbWUuTWF4aW11bUxlbmd0aCA9IDA7CisJCX0gZWxzZSB7CisJCQlfX3UxNiBsZW47CisJCQlzdHJuY3B5KGJjY19wdHIsIHVzZXIsIDYzKTsKKwkJCWxlbiA9IHN0cm5sZW4odXNlciwgNjQpOworCQkJU2VjdXJpdHlCbG9iLT5Vc2VyTmFtZS5NYXhpbXVtTGVuZ3RoID0KKwkJCSAgICBjcHVfdG9fbGUxNihsZW4pOworCQkJU2VjdXJpdHlCbG9iLT5Vc2VyTmFtZS5CdWZmZXIgPQorCQkJICAgIGNwdV90b19sZTMyKFNlY3VyaXR5QmxvYkxlbmd0aCk7CisJCQliY2NfcHRyICs9IGxlbjsKKwkJCVNlY3VyaXR5QmxvYkxlbmd0aCArPSBsZW47CisJCQlTZWN1cml0eUJsb2ItPlVzZXJOYW1lLkxlbmd0aCA9IGNwdV90b19sZTE2KGxlbik7CisJCX0KKwkJLyogQkIgZmlsbCBpbiBvdXIgd29ya3N0YXRpb24gbmFtZSBpZiBrbm93biBCQiAqLworCisJCXN0cmNweShiY2NfcHRyLCAiTGludXggdmVyc2lvbiAiKTsKKwkJYmNjX3B0ciArPSBzdHJsZW4oIkxpbnV4IHZlcnNpb24gIik7CisJCXN0cmNweShiY2NfcHRyLCBzeXN0ZW1fdXRzbmFtZS5yZWxlYXNlKTsKKwkJYmNjX3B0ciArPSBzdHJsZW4oc3lzdGVtX3V0c25hbWUucmVsZWFzZSkgKyAxOworCQlzdHJjcHkoYmNjX3B0ciwgQ0lGU19ORVRXT1JLX09QU1lTKTsKKwkJYmNjX3B0ciArPSBzdHJsZW4oQ0lGU19ORVRXT1JLX09QU1lTKSArIDE7CisJCWJjY19wdHIrKzsJLyogbnVsbCBkb21haW4gKi8KKwkJKmJjY19wdHIgPSAwOworCX0KKwlTZWN1cml0eUJsb2ItPk5lZ290aWF0ZUZsYWdzID0gY3B1X3RvX2xlMzIobmVnb3RpYXRlX2ZsYWdzKTsKKwlwU01CLT5yZXEuU2VjdXJpdHlCbG9iTGVuZ3RoID0gY3B1X3RvX2xlMTYoU2VjdXJpdHlCbG9iTGVuZ3RoKTsKKwljb3VudCA9IChsb25nKSBiY2NfcHRyIC0gKGxvbmcpIHBCeXRlQXJlYShzbWJfYnVmZmVyKTsKKwlzbWJfYnVmZmVyLT5zbWJfYnVmX2xlbmd0aCArPSBjb3VudDsKKwlwU01CLT5yZXEuQnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoY291bnQpOworCisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHNlcywgc21iX2J1ZmZlciwgc21iX2J1ZmZlcl9yZXNwb25zZSwKKwkJCSAmYnl0ZXNfcmV0dXJuZWQsIDEpOworCWlmIChyYykgeworLyogICAgcmMgPSBtYXBfc21iX3RvX2xpbnV4X2Vycm9yKHNtYl9idWZmZXJfcmVzcG9uc2UpOyAgKi8vKiBkb25lIGluIFNlbmRSZWNlaXZlIG5vdyAqLworCX0gZWxzZSBpZiAoKHNtYl9idWZmZXJfcmVzcG9uc2UtPldvcmRDb3VudCA9PSAzKQorCQkgICB8fCAoc21iX2J1ZmZlcl9yZXNwb25zZS0+V29yZENvdW50ID09IDQpKSB7CisJCV9fdTE2IGFjdGlvbiA9IGxlMTZfdG9fY3B1KHBTTUJyLT5yZXNwLkFjdGlvbik7CisJCV9fdTE2IGJsb2JfbGVuID0KKwkJICAgIGxlMTZfdG9fY3B1KHBTTUJyLT5yZXNwLlNlY3VyaXR5QmxvYkxlbmd0aCk7CisJCWlmIChhY3Rpb24gJiBHVUVTVF9MT0dJTikKKwkJCWNGWUkoMSwgKCIgR3Vlc3QgbG9naW4iKSk7CS8qIEJCIGRvIHdlIHdhbnQgdG8gc2V0IGFueXRoaW5nIGluIFNlc0luZm8gc3RydWN0ID8gKi8KKy8qICAgICAgICBpZihTZWN1cml0eUJsb2IyLT5NZXNzYWdlVHlwZSAhPSBOdExtPz8peyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgY0ZZSSgiVW5leHBlY3RlZCBtZXNzYWdlIHR5cGUgb24gYXV0aCByZXNwb25zZSBpcyAlZCAiKSk7IAorICAgICAgICB9ICovCisJCWlmIChzZXMpIHsKKwkJCWNGWUkoMSwKKwkJCSAgICAgKCJEb2VzIFVJRCBvbiBjaGFsbGVuZ2UgJWQgbWF0Y2ggYXV0aCByZXNwb25zZSBVSUQgJWQgIiwKKwkJCSAgICAgIHNlcy0+U3VpZCwgc21iX2J1ZmZlcl9yZXNwb25zZS0+VWlkKSk7CisJCQlzZXMtPlN1aWQgPSBzbWJfYnVmZmVyX3Jlc3BvbnNlLT5VaWQ7IC8qIFVJRCBsZWZ0IGluIHdpcmUgZm9ybWF0ICovCisJCQliY2NfcHRyID0gcEJ5dGVBcmVhKHNtYl9idWZmZXJfcmVzcG9uc2UpOwkKKyAgICAgICAgICAgIC8qIHJlc3BvbnNlIGNhbiBoYXZlIGVpdGhlciAzIG9yIDQgd29yZCBjb3VudCAtIFNhbWJhIHNlbmRzIDMgKi8KKwkJCWlmICgocFNNQnItPnJlc3AuaGRyLldvcmRDb3VudCA9PSAzKQorCQkJICAgIHx8ICgocFNNQnItPnJlc3AuaGRyLldvcmRDb3VudCA9PSA0KQorCQkJCSYmIChibG9iX2xlbiA8CisJCQkJICAgIHBTTUJyLT5yZXNwLkJ5dGVDb3VudCkpKSB7CisJCQkJaWYgKHBTTUJyLT5yZXNwLmhkci5Xb3JkQ291bnQgPT0gNCkgeworCQkJCQliY2NfcHRyICs9CisJCQkJCSAgICBibG9iX2xlbjsKKwkJCQkJY0ZZSSgxLAorCQkJCQkgICAgICgiU2VjdXJpdHkgQmxvYiBMZW5ndGggJWQgIiwKKwkJCQkJICAgICAgYmxvYl9sZW4pKTsKKwkJCQl9CisKKwkJCQljRllJKDEsCisJCQkJICAgICAoIk5UTE1TU1AgcmVzcG9uc2UgdG8gQXV0aGVudGljYXRlICIpKTsKKworCQkJCWlmIChzbWJfYnVmZmVyLT5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJCQkJaWYgKChsb25nKSAoYmNjX3B0cikgJSAyKSB7CisJCQkJCQlyZW1haW5pbmdfd29yZHMgPQorCQkJCQkJICAgIChCQ0Moc21iX2J1ZmZlcl9yZXNwb25zZSkKKwkJCQkJCSAgICAgLSAxKSAvIDI7CisJCQkJCQliY2NfcHRyKys7CS8qIFVuaWNvZGUgc3RyaW5ncyBtdXN0IGJlIHdvcmQgYWxpZ25lZCAqLworCQkJCQl9IGVsc2UgeworCQkJCQkJcmVtYWluaW5nX3dvcmRzID0gQkNDKHNtYl9idWZmZXJfcmVzcG9uc2UpIC8gMjsKKwkJCQkJfQorCQkJCQlsZW4gPQorCQkJCQkgICAgVW5pU3Rybmxlbigod2NoYXJfdCAqKSBiY2NfcHRyLHJlbWFpbmluZ193b3JkcyAtIDEpOworLyogV2UgbG9vayBmb3Igb2J2aW91cyBtZXNzZWQgdXAgYmNjIG9yIHN0cmluZ3MgaW4gcmVzcG9uc2Ugc28gd2UgZG8gbm90IGdvIG9mZgorICB0aGUgZW5kIHNpbmNlIChhdCBsZWFzdCkgV0lOMksgYW5kIFdpbmRvd3MgWFAgaGF2ZSBhIG1ham9yIGJ1ZyBpbiBub3QgbnVsbAorICB0ZXJtaW5hdGluZyBsYXN0IFVuaWNvZGUgc3RyaW5nIGluIHJlc3BvbnNlICAqLworCQkJCQlzZXMtPnNlcnZlck9TID0KKwkJCQkJICAgIGNpZnNfa2NhbGxvYygyICogKGxlbiArIDEpLCBHRlBfS0VSTkVMKTsKKwkJCQkJY2lmc19zdHJmcm9tVUNTX2xlKHNlcy0+c2VydmVyT1MsCisJCQkJCQkJICAgKHdjaGFyX3QgKikKKwkJCQkJCQkgICBiY2NfcHRyLCBsZW4sCisJCQkJCQkJICAgbmxzX2NvZGVwYWdlKTsKKwkJCQkJYmNjX3B0ciArPSAyICogKGxlbiArIDEpOworCQkJCQlyZW1haW5pbmdfd29yZHMgLT0gbGVuICsgMTsKKwkJCQkJc2VzLT5zZXJ2ZXJPU1syICogbGVuXSA9IDA7CisJCQkJCXNlcy0+c2VydmVyT1NbMSArICgyICogbGVuKV0gPSAwOworCQkJCQlpZiAocmVtYWluaW5nX3dvcmRzID4gMCkgeworCQkJCQkJbGVuID0gVW5pU3Rybmxlbigod2NoYXJfdCAqKQorCQkJCQkJCQkgYmNjX3B0ciwKKwkJCQkJCQkJIHJlbWFpbmluZ193b3JkcworCQkJCQkJCQkgLSAxKTsKKwkJCQkJCXNlcy0+c2VydmVyTk9TID0KKwkJCQkJCSAgICBjaWZzX2tjYWxsb2MoMiAqIChsZW4gKyAxKSwKKwkJCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCQkJCQljaWZzX3N0cmZyb21VQ1NfbGUoc2VzLT4KKwkJCQkJCQkJICAgc2VydmVyTk9TLAorCQkJCQkJCQkgICAod2NoYXJfdCAqKQorCQkJCQkJCQkgICBiY2NfcHRyLAorCQkJCQkJCQkgICBsZW4sCisJCQkJCQkJCSAgIG5sc19jb2RlcGFnZSk7CisJCQkJCQliY2NfcHRyICs9IDIgKiAobGVuICsgMSk7CisJCQkJCQlzZXMtPnNlcnZlck5PU1syICogbGVuXSA9IDA7CisJCQkJCQlzZXMtPnNlcnZlck5PU1sxKygyKmxlbildID0gMDsKKwkJCQkJCXJlbWFpbmluZ193b3JkcyAtPSBsZW4gKyAxOworCQkJCQkJaWYgKHJlbWFpbmluZ193b3JkcyA+IDApIHsKKwkJCQkJCQlsZW4gPSBVbmlTdHJubGVuKCh3Y2hhcl90ICopIGJjY19wdHIsIHJlbWFpbmluZ193b3Jkcyk7CQorICAgICAvKiBsYXN0IHN0cmluZyBub3QgYWx3YXlzIG51bGwgdGVybWluYXRlZCAoZS5nLiBmb3IgV2luZG93cyBYUCAmIDIwMDApICovCisJCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPQorCQkJCQkJCSAgICBjaWZzX2tjYWxsb2MoMiAqCisJCQkJCQkJCSAgICAobGVuICsKKwkJCQkJCQkJICAgICAxKSwKKwkJCQkJCQkJICAgIEdGUF9LRVJORUwpOworCQkJCQkJCWNpZnNfc3RyZnJvbVVDU19sZQorCQkJCQkJCSAgICAoc2VzLT4KKwkJCQkJCQkgICAgIHNlcnZlckRvbWFpbiwKKwkJCQkJCQkgICAgICh3Y2hhcl90ICopCisJCQkJCQkJICAgICBiY2NfcHRyLCBsZW4sCisJCQkJCQkJICAgICBubHNfY29kZXBhZ2UpOworCQkJCQkJCWJjY19wdHIgKz0KKwkJCQkJCQkgICAgMiAqIChsZW4gKyAxKTsKKwkJCQkJCQlzZXMtPgorCQkJCQkJCSAgICBzZXJ2ZXJEb21haW5bMgorCQkJCQkJCQkJICogbGVuXQorCQkJCQkJCSAgICA9IDA7CisJCQkJCQkJc2VzLT4KKwkJCQkJCQkgICAgc2VydmVyRG9tYWluWzEKKwkJCQkJCQkJCSArCisJCQkJCQkJCQkgKDIKKwkJCQkJCQkJCSAgKgorCQkJCQkJCQkJICBsZW4pXQorCQkJCQkJCSAgICA9IDA7CisJCQkJCQl9IC8qIGVsc2Ugbm8gbW9yZSByb29tIHNvIGNyZWF0ZSBkdW1teSBkb21haW4gc3RyaW5nICovCisJCQkJCQllbHNlCisJCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPSBjaWZzX2tjYWxsb2MoMixHRlBfS0VSTkVMKTsKKwkJCQkJfSBlbHNlIHsgIC8qIG5vIHJvb20gc28gY3JlYXRlIGR1bW15IGRvbWFpbiBhbmQgTk9TIHN0cmluZyAqLworCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPSBjaWZzX2tjYWxsb2MoMiwgR0ZQX0tFUk5FTCk7CisJCQkJCQlzZXMtPnNlcnZlck5PUyA9IGNpZnNfa2NhbGxvYygyLCBHRlBfS0VSTkVMKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CS8qIEFTQ0lJICovCisJCQkJCWxlbiA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7CisJCQkJCWlmICgoKGxvbmcpIGJjY19wdHIgKyBsZW4pIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgcEJ5dGVBcmVhKHNtYl9idWZmZXJfcmVzcG9uc2UpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IEJDQyhzbWJfYnVmZmVyX3Jlc3BvbnNlKSkgeworCQkJCQkJc2VzLT5zZXJ2ZXJPUyA9IGNpZnNfa2NhbGxvYyhsZW4gKyAxLEdGUF9LRVJORUwpOworCQkJCQkJc3RybmNweShzZXMtPnNlcnZlck9TLGJjY19wdHIsIGxlbik7CisKKwkJCQkJCWJjY19wdHIgKz0gbGVuOworCQkJCQkJYmNjX3B0clswXSA9IDA7CS8qIG51bGwgdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKwkJCQkJCWJjY19wdHIrKzsKKworCQkJCQkJbGVuID0gc3RybmxlbihiY2NfcHRyLCAxMDI0KTsKKwkJCQkJCXNlcy0+c2VydmVyTk9TID0gY2lmc19rY2FsbG9jKGxlbisxLEdGUF9LRVJORUwpOworCQkJCQkJc3RybmNweShzZXMtPnNlcnZlck5PUywgYmNjX3B0ciwgbGVuKTsJCisJCQkJCQliY2NfcHRyICs9IGxlbjsKKwkJCQkJCWJjY19wdHJbMF0gPSAwOworCQkJCQkJYmNjX3B0cisrOworCisJCQkJCQlsZW4gPSBzdHJubGVuKGJjY19wdHIsIDEwMjQpOworCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPSBjaWZzX2tjYWxsb2MobGVuKzEsR0ZQX0tFUk5FTCk7CisJCQkJCQlzdHJuY3B5KHNlcy0+c2VydmVyRG9tYWluLCBiY2NfcHRyLCBsZW4pOworCQkJCQkJYmNjX3B0ciArPSBsZW47CisJCQkJCQliY2NfcHRyWzBdID0gMDsKKwkJCQkJCWJjY19wdHIrKzsKKwkJCQkJfSBlbHNlCisJCQkJCQljRllJKDEsCisJCQkJCQkgICAgICgiVmFyaWFibGUgZmllbGQgb2YgbGVuZ3RoICVkIGV4dGVuZHMgYmV5b25kIGVuZCBvZiBzbWIgIiwKKwkJCQkJCSAgICAgIGxlbikpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY0VSUk9SKDEsCisJCQkJICAgICAgICgiIFNlY3VyaXR5IEJsb2IgTGVuZ3RoIGV4dGVuZHMgYmV5b25kIGVuZCBvZiBTTUIiKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQljRVJST1IoMSwgKCJObyBzZXNzaW9uIHN0cnVjdHVyZSBwYXNzZWQgaW4uIikpOworCQl9CisJfSBlbHNlIHsKKwkJY0VSUk9SKDEsCisJCSAgICAgICAoIiBJbnZhbGlkIFdvcmQgY291bnQgJWQ6ICIsCisJCQlzbWJfYnVmZmVyX3Jlc3BvbnNlLT5Xb3JkQ291bnQpKTsKKwkJcmMgPSAtRUlPOworCX0KKworCWlmIChzbWJfYnVmZmVyKQorCQljaWZzX2J1Zl9yZWxlYXNlKHNtYl9idWZmZXIpOworCisJcmV0dXJuIHJjOworfQorCitpbnQKK0NJRlNUQ29uKHVuc2lnbmVkIGludCB4aWQsIHN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzLAorCSBjb25zdCBjaGFyICp0cmVlLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCSBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisJc3RydWN0IHNtYl9oZHIgKnNtYl9idWZmZXI7CisJc3RydWN0IHNtYl9oZHIgKnNtYl9idWZmZXJfcmVzcG9uc2U7CisJVENPTlhfUkVRICpwU01COworCVRDT05YX1JTUCAqcFNNQnI7CisJdW5zaWduZWQgY2hhciAqYmNjX3B0cjsKKwlpbnQgcmMgPSAwOworCWludCBsZW5ndGg7CisJX191MTYgY291bnQ7CisKKwlpZiAoc2VzID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJc21iX2J1ZmZlciA9IGNpZnNfYnVmX2dldCgpOworCWlmIChzbWJfYnVmZmVyID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNtYl9idWZmZXJfcmVzcG9uc2UgPSBzbWJfYnVmZmVyOworCisJaGVhZGVyX2Fzc2VtYmxlKHNtYl9idWZmZXIsIFNNQl9DT01fVFJFRV9DT05ORUNUX0FORFgsCisJCQlOVUxMIC8qbm8gdGlkICovICwgNCAvKndjdCAqLyApOworCXNtYl9idWZmZXItPlVpZCA9IHNlcy0+U3VpZDsKKwlwU01CID0gKFRDT05YX1JFUSAqKSBzbWJfYnVmZmVyOworCXBTTUJyID0gKFRDT05YX1JTUCAqKSBzbWJfYnVmZmVyX3Jlc3BvbnNlOworCisJcFNNQi0+QW5kWENvbW1hbmQgPSAweEZGOworCXBTTUItPkZsYWdzID0gY3B1X3RvX2xlMTYoVENPTl9FWFRFTkRFRF9TRUNJTkZPKTsKKwlwU01CLT5QYXNzd29yZExlbmd0aCA9IGNwdV90b19sZTE2KDEpOwkvKiBtaW5pbXVtICovCisJYmNjX3B0ciA9ICZwU01CLT5QYXNzd29yZFswXTsKKwliY2NfcHRyKys7CQkvKiBza2lwIHBhc3N3b3JkICovCisKKwlpZihzZXMtPnNlcnZlci0+c2VjTW9kZSAmIChTRUNNT0RFX1NJR05fUkVRVUlSRUQgfCBTRUNNT0RFX1NJR05fRU5BQkxFRCkpCisJCXNtYl9idWZmZXItPkZsYWdzMiB8PSBTTUJGTEcyX1NFQ1VSSVRZX1NJR05BVFVSRTsKKworCWlmIChzZXMtPmNhcGFiaWxpdGllcyAmIENBUF9TVEFUVVMzMikgeworCQlzbWJfYnVmZmVyLT5GbGFnczIgfD0gU01CRkxHMl9FUlJfU1RBVFVTOworCX0KKwlpZiAoc2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfREZTKSB7CisJCXNtYl9idWZmZXItPkZsYWdzMiB8PSBTTUJGTEcyX0RGUzsKKwl9CisJaWYgKHNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSUNPREUpIHsKKwkJc21iX2J1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfVU5JQ09ERTsKKwkJbGVuZ3RoID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwgdHJlZSwgMTAwLCBubHNfY29kZXBhZ2UpOworCQliY2NfcHRyICs9IDIgKiBsZW5ndGg7CS8qIGNvbnZlcnQgbnVtIG9mIDE2IGJpdCB3b3JkcyB0byBieXRlcyAqLworCQliY2NfcHRyICs9IDI7CS8qIHNraXAgdHJhaWxpbmcgbnVsbCAqLworCX0gZWxzZSB7CQkvKiBBU0NJSSAqLworCisJCXN0cmNweShiY2NfcHRyLCB0cmVlKTsKKwkJYmNjX3B0ciArPSBzdHJsZW4odHJlZSkgKyAxOworCX0KKwlzdHJjcHkoYmNjX3B0ciwgIj8/Pz8/Iik7CisJYmNjX3B0ciArPSBzdHJsZW4oIj8/Pz8/Iik7CisJYmNjX3B0ciArPSAxOworCWNvdW50ID0gYmNjX3B0ciAtICZwU01CLT5QYXNzd29yZFswXTsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoY291bnQpOworCisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHNlcywgc21iX2J1ZmZlciwgc21iX2J1ZmZlcl9yZXNwb25zZSwgJmxlbmd0aCwgMCk7CisKKwkvKiBpZiAocmMpIHJjID0gbWFwX3NtYl90b19saW51eF9lcnJvcihzbWJfYnVmZmVyX3Jlc3BvbnNlKTsgKi8KKwkvKiBhYm92ZSBub3cgZG9uZSBpbiBTZW5kUmVjZWl2ZSAqLworCWlmICgocmMgPT0gMCkgJiYgKHRjb24gIT0gTlVMTCkpIHsKKwkJdGNvbi0+dGlkU3RhdHVzID0gQ2lmc0dvb2Q7CisJCXRjb24tPnRpZCA9IHNtYl9idWZmZXJfcmVzcG9uc2UtPlRpZDsKKwkJYmNjX3B0ciA9IHBCeXRlQXJlYShzbWJfYnVmZmVyX3Jlc3BvbnNlKTsKKwkJbGVuZ3RoID0gc3RybmxlbihiY2NfcHRyLCBCQ0Moc21iX2J1ZmZlcl9yZXNwb25zZSkgLSAyKTsKKyAgICAgICAgLyogc2tpcCBzZXJ2aWNlIGZpZWxkIChOQjogdGhpcyBmaWVsZCBpcyBhbHdheXMgQVNDSUkpICovCisJCWJjY19wdHIgKz0gbGVuZ3RoICsgMTsJCisJCXN0cm5jcHkodGNvbi0+dHJlZU5hbWUsIHRyZWUsIE1BWF9UUkVFX1NJWkUpOworCQlpZiAoc21iX2J1ZmZlci0+RmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCQlsZW5ndGggPSBVbmlTdHJubGVuKCh3Y2hhcl90ICopIGJjY19wdHIsIDUxMik7CisJCQlpZiAoKGJjY19wdHIgKyAoMiAqIGxlbmd0aCkpIC0KKwkJCSAgICAgcEJ5dGVBcmVhKHNtYl9idWZmZXJfcmVzcG9uc2UpIDw9CisJCQkgICAgQkNDKHNtYl9idWZmZXJfcmVzcG9uc2UpKSB7CisJCQkJaWYodGNvbi0+bmF0aXZlRmlsZVN5c3RlbSkKKwkJCQkJa2ZyZWUodGNvbi0+bmF0aXZlRmlsZVN5c3RlbSk7CisJCQkJdGNvbi0+bmF0aXZlRmlsZVN5c3RlbSA9CisJCQkJICAgIGNpZnNfa2NhbGxvYyhsZW5ndGggKyAyLCBHRlBfS0VSTkVMKTsKKwkJCQljaWZzX3N0cmZyb21VQ1NfbGUodGNvbi0+bmF0aXZlRmlsZVN5c3RlbSwKKwkJCQkJCSAgICh3Y2hhcl90ICopIGJjY19wdHIsCisJCQkJCQkgICBsZW5ndGgsIG5sc19jb2RlcGFnZSk7CisJCQkJYmNjX3B0ciArPSAyICogbGVuZ3RoOworCQkJCWJjY19wdHJbMF0gPSAwOwkvKiBudWxsIHRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCisJCQkJYmNjX3B0clsxXSA9IDA7CisJCQkJYmNjX3B0ciArPSAyOworCQkJfQorCQkJLyogZWxzZSBkbyBub3QgYm90aGVyIGNvcHlpbmcgdGhlc2UgaW5mb3JtYXRpb25hbCBmaWVsZHMgKi8KKwkJfSBlbHNlIHsKKwkJCWxlbmd0aCA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7CisJCQlpZiAoKGJjY19wdHIgKyBsZW5ndGgpIC0KKwkJCSAgICBwQnl0ZUFyZWEoc21iX2J1ZmZlcl9yZXNwb25zZSkgPD0KKwkJCSAgICBCQ0Moc21iX2J1ZmZlcl9yZXNwb25zZSkpIHsKKwkJCQlpZih0Y29uLT5uYXRpdmVGaWxlU3lzdGVtKQorCQkJCQlrZnJlZSh0Y29uLT5uYXRpdmVGaWxlU3lzdGVtKTsKKwkJCQl0Y29uLT5uYXRpdmVGaWxlU3lzdGVtID0KKwkJCQkgICAgY2lmc19rY2FsbG9jKGxlbmd0aCArIDEsIEdGUF9LRVJORUwpOworCQkJCXN0cm5jcHkodGNvbi0+bmF0aXZlRmlsZVN5c3RlbSwgYmNjX3B0ciwKKwkJCQkJbGVuZ3RoKTsKKwkJCX0KKwkJCS8qIGVsc2UgZG8gbm90IGJvdGhlciBjb3B5aW5nIHRoZXNlIGluZm9ybWF0aW9uYWwgZmllbGRzICovCisJCX0KKwkJdGNvbi0+RmxhZ3MgPSBsZTE2X3RvX2NwdShwU01Cci0+T3B0aW9uYWxTdXBwb3J0KTsKKwkJY0ZZSSgxLCAoIlRjb24gZmxhZ3M6IDB4JXggIiwgdGNvbi0+RmxhZ3MpKTsKKwl9IGVsc2UgaWYgKChyYyA9PSAwKSAmJiB0Y29uID09IE5VTEwpIHsKKyAgICAgICAgLyogYWxsIHdlIG5lZWQgdG8gc2F2ZSBmb3IgSVBDJCBjb25uZWN0aW9uICovCisJCXNlcy0+aXBjX3RpZCA9IHNtYl9idWZmZXJfcmVzcG9uc2UtPlRpZDsKKwl9CisKKwlpZiAoc21iX2J1ZmZlcikKKwkJY2lmc19idWZfcmVsZWFzZShzbWJfYnVmZmVyKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorY2lmc191bW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYikKK3sKKwlpbnQgcmMgPSAwOworCWludCB4aWQ7CisJc3RydWN0IGNpZnNTZXNJbmZvICpzZXMgPSBOVUxMOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqY2lmc2RfdGFzazsKKworCXhpZCA9IEdldFhpZCgpOworCisJaWYgKGNpZnNfc2ItPnRjb24pIHsKKwkJc2VzID0gY2lmc19zYi0+dGNvbi0+c2VzOyAvKiBzYXZlIHB0ciB0byBzZXMgYmVmb3JlIGRlbGV0ZSB0Y29uISovCisJCXJjID0gQ0lGU1NNQlREaXMoeGlkLCBjaWZzX3NiLT50Y29uKTsKKwkJaWYgKHJjID09IC1FQlVTWSkgeworCQkJRnJlZVhpZCh4aWQpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJdGNvbkluZm9GcmVlKGNpZnNfc2ItPnRjb24pOworCQlpZiAoKHNlcykgJiYgKHNlcy0+c2VydmVyKSkgeworCQkJLyogc2F2ZSBvZmYgdGFzayBzbyB3ZSBkbyBub3QgcmVmZXIgdG8gc2VzIGxhdGVyICovCisJCQljaWZzZF90YXNrID0gc2VzLT5zZXJ2ZXItPnRzazsKKwkJCWNGWUkoMSwgKCJBYm91dCB0byBkbyBTTUJMb2dvZmYgIikpOworCQkJcmMgPSBDSUZTU01CTG9nb2ZmKHhpZCwgc2VzKTsKKwkJCWlmIChyYyA9PSAtRUJVU1kpIHsKKwkJCQlGcmVlWGlkKHhpZCk7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgaWYgKHJjID09IC1FU0hVVERPV04pIHsKKwkJCQljRllJKDEsKCJXYWtpbmcgdXAgc29ja2V0IGJ5IHNlbmRpbmcgaXQgc2lnbmFsIikpOworCQkJCWlmKGNpZnNkX3Rhc2spCisJCQkJCXNlbmRfc2lnKFNJR0tJTEwsY2lmc2RfdGFzaywxKTsKKwkJCQlyYyA9IDA7CisJCQl9IC8qIGVsc2UgLSB3ZSBoYXZlIGFuIHNtYiBzZXNzaW9uCisJCQkJbGVmdCBvbiB0aGlzIHNvY2tldCBkbyBub3Qga2lsbCBjaWZzZCAqLworCQl9IGVsc2UKKwkJCWNGWUkoMSwgKCJObyBzZXNzaW9uIG9yIGJhZCB0Y29uIikpOworCX0KKwkKKwljaWZzX3NiLT50Y29uID0gTlVMTDsKKwlpZiAoc2VzKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoSFogLyAyKTsKKwl9CisJaWYgKHNlcykKKwkJc2VzSW5mb0ZyZWUoc2VzKTsKKworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7CQkvKiBCQiBjaGVjayBpZiB3ZSBzaG91bGQgYWx3YXlzIHJldHVybiB6ZXJvIGhlcmUgKi8KK30gCisKK2ludCBjaWZzX3NldHVwX3Nlc3Npb24odW5zaWduZWQgaW50IHhpZCwgc3RydWN0IGNpZnNTZXNJbmZvICpwU2VzSW5mbywKKwkJCQkJICAgc3RydWN0IG5sc190YWJsZSAqIG5sc19pbmZvKQoreworCWludCByYyA9IDA7CisJY2hhciBudGxtX3Nlc3Npb25fa2V5W0NJRlNfU0VTU0lPTl9LRVlfU0laRV07CisJaW50IG50bG12Ml9mbGFnID0gRkFMU0U7CisKKwkvKiB3aGF0IGlmIHNlcnZlciBjaGFuZ2VzIGl0cyBidWZmZXIgc2l6ZSBhZnRlciBkcm9wcGluZyB0aGUgc2Vzc2lvbj8gKi8KKwlpZihwU2VzSW5mby0+c2VydmVyLT5tYXhCdWYgPT0gMCkgLyogbm8gbmVlZCB0byBzZW5kIG9uIHJlY29ubmVjdCAqLyB7CisJCXJjID0gQ0lGU1NNQk5lZ290aWF0ZSh4aWQsIHBTZXNJbmZvKTsKKwkJaWYocmMgPT0gLUVBR0FJTikgLyogcmV0cnkgb25seSBvbmNlIG9uIDFzdCB0aW1lIGNvbm5lY3Rpb24gKi8geworCQkJcmMgPSBDSUZTU01CTmVnb3RpYXRlKHhpZCwgcFNlc0luZm8pOworCQkJaWYocmMgPT0gLUVBR0FJTikgCisJCQkJcmMgPSAtRUhPU1RET1dOOworCQl9CisJCWlmKHJjID09IDApIHsKKwkJCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCQkJaWYocFNlc0luZm8tPnNlcnZlci0+dGNwU3RhdHVzICE9IENpZnNFeGl0aW5nKQorCQkJCXBTZXNJbmZvLT5zZXJ2ZXItPnRjcFN0YXR1cyA9IENpZnNHb29kOworCQkJZWxzZQorCQkJCXJjID0gLUVIT1NURE9XTjsKKwkJCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisKKwkJfQorCX0KKwlpZiAoIXJjKSB7CisJCXBTZXNJbmZvLT5jYXBhYmlsaXRpZXMgPSBwU2VzSW5mby0+c2VydmVyLT5jYXBhYmlsaXRpZXM7CisJCWlmKGxpbnV4RXh0RW5hYmxlZCA9PSAwKQorCQkJcFNlc0luZm8tPmNhcGFiaWxpdGllcyAmPSAofkNBUF9VTklYKTsKKwkJcFNlc0luZm8tPnNlcXVlbmNlX251bWJlciA9IDA7CisJCWNGWUkoMSwoIlNlY3VyaXR5IE1vZGU6IDB4JXggQ2FwYWJpbGl0aWVzOiAweCV4IFRpbWUgWm9uZTogJWQiLAorCQkJcFNlc0luZm8tPnNlcnZlci0+c2VjTW9kZSwKKwkJCXBTZXNJbmZvLT5zZXJ2ZXItPmNhcGFiaWxpdGllcywKKwkJCXBTZXNJbmZvLT5zZXJ2ZXItPnRpbWVab25lKSk7CisJCWlmIChleHRlbmRlZF9zZWN1cml0eQorCQkJCSYmIChwU2VzSW5mby0+Y2FwYWJpbGl0aWVzICYgQ0FQX0VYVEVOREVEX1NFQ1VSSVRZKQorCQkJCSYmIChwU2VzSW5mby0+c2VydmVyLT5zZWNUeXBlID09IE5UTE1TU1ApKSB7CisJCQljRllJKDEsICgiTmV3IHN0eWxlIHNlc3NzZXR1cCAiKSk7CisJCQlyYyA9IENJRlNTcG5lZ29TZXNzU2V0dXAoeGlkLCBwU2VzSW5mbywKKwkJCQlOVUxMIC8qIHNlY3VyaXR5IGJsb2IgKi8sIAorCQkJCTAgLyogYmxvYiBsZW5ndGggKi8sCisJCQkJbmxzX2luZm8pOworCQl9IGVsc2UgaWYgKGV4dGVuZGVkX3NlY3VyaXR5CisJCQkgICAmJiAocFNlc0luZm8tPmNhcGFiaWxpdGllcyAmIENBUF9FWFRFTkRFRF9TRUNVUklUWSkKKwkJCSAgICYmIChwU2VzSW5mby0+c2VydmVyLT5zZWNUeXBlID09IFJhd05UTE1TU1ApKSB7CisJCQljRllJKDEsICgiTlRMTVNTUCBzZXNzc2V0dXAgIikpOworCQkJcmMgPSBDSUZTTlRMTVNTUE5lZ290aWF0ZVNlc3NTZXR1cCh4aWQsCisJCQkJCQlwU2VzSW5mbywKKwkJCQkJCSZudGxtdjJfZmxhZywKKwkJCQkJCW5sc19pbmZvKTsKKwkJCWlmICghcmMpIHsKKwkJCQlpZihudGxtdjJfZmxhZykgeworCQkJCQljaGFyICogdjJfcmVzcG9uc2U7CisJCQkJCWNGWUkoMSwoIkNhbiB1c2UgbW9yZSBzZWN1cmUgTlRMTSB2ZXJzaW9uIDIgcGFzc3dvcmQgaGFzaCIpKTsKKwkJCQkJaWYoQ2FsY05UTE12Ml9wYXJ0aWFsX21hY19rZXkocFNlc0luZm8sIAorCQkJCQkJbmxzX2luZm8pKSB7CisJCQkJCQlyYyA9IC1FTk9NRU07CisJCQkJCQlnb3RvIHNzX2Vycl9leGl0OworCQkJCQl9IGVsc2UKKwkJCQkJCXYyX3Jlc3BvbnNlID0ga21hbGxvYygxNiArIDY0IC8qIGJsb2IgKi8sIEdGUF9LRVJORUwpOworCQkJCQlpZih2Ml9yZXNwb25zZSkgeworCQkJCQkJQ2FsY05UTE12Ml9yZXNwb25zZShwU2VzSW5mbyx2Ml9yZXNwb25zZSk7CisvKgkJCQkJCWNpZnNfY2FsY3VsYXRlX250bG12Ml9tYWNfa2V5KHBTZXNJbmZvLT5tYWNfc2lnbmluZ19rZXksIHJlc3BvbnNlLCBudGxtX3Nlc3Npb25fa2V5LCAqLworCQkJCQkJa2ZyZWUodjJfcmVzcG9uc2UpOworCQkJCQkvKiBCQiBQdXQgZHVtbXkgc2lnIGluIFNlc3NTZXR1cCBQRFU/ICovCisJCQkJCX0gZWxzZSB7CisJCQkJCQlyYyA9IC1FTk9NRU07CisJCQkJCQlnb3RvIHNzX2Vycl9leGl0OworCQkJCQl9CisKKwkJCQl9IGVsc2UgeworCQkJCQlTTUJOVGVuY3J5cHQocFNlc0luZm8tPnBhc3N3b3JkLAorCQkJCQkJcFNlc0luZm8tPnNlcnZlci0+Y3J5cHRLZXksCisJCQkJCQludGxtX3Nlc3Npb25fa2V5KTsKKworCQkJCQljaWZzX2NhbGN1bGF0ZV9tYWNfa2V5KHBTZXNJbmZvLT5tYWNfc2lnbmluZ19rZXksCisJCQkJCQludGxtX3Nlc3Npb25fa2V5LAorCQkJCQkJcFNlc0luZm8tPnBhc3N3b3JkKTsKKwkJCQl9CisJCQkvKiBmb3IgYmV0dGVyIHNlY3VyaXR5IHRoZSB3ZWFrZXIgbGFubWFuIGhhc2ggbm90IHNlbnQKKwkJCSAgIGluIEF1dGhTZXNzU2V0dXAgc28gd2Ugbm8gbG9uZ2VyIGNhbGN1bGF0ZSBpdCAqLworCisJCQkJcmMgPSBDSUZTTlRMTVNTUEF1dGhTZXNzU2V0dXAoeGlkLAorCQkJCQlwU2VzSW5mbywKKwkJCQkJbnRsbV9zZXNzaW9uX2tleSwKKwkJCQkJbnRsbXYyX2ZsYWcsCisJCQkJCW5sc19pbmZvKTsKKwkJCX0KKwkJfSBlbHNlIHsgLyogb2xkIHN0eWxlIE5UTE0gMC4xMiBzZXNzaW9uIHNldHVwICovCisJCQlTTUJOVGVuY3J5cHQocFNlc0luZm8tPnBhc3N3b3JkLAorCQkJCXBTZXNJbmZvLT5zZXJ2ZXItPmNyeXB0S2V5LAorCQkJCW50bG1fc2Vzc2lvbl9rZXkpOworCisJCQljaWZzX2NhbGN1bGF0ZV9tYWNfa2V5KHBTZXNJbmZvLT5tYWNfc2lnbmluZ19rZXksIAorCQkJCW50bG1fc2Vzc2lvbl9rZXksIHBTZXNJbmZvLT5wYXNzd29yZCk7CisJCQlyYyA9IENJRlNTZXNzU2V0dXAoeGlkLCBwU2VzSW5mbywKKwkJCQludGxtX3Nlc3Npb25fa2V5LCBubHNfaW5mbyk7CisJCX0KKwkJaWYgKHJjKSB7CisJCQljRVJST1IoMSwoIlNlbmQgZXJyb3IgaW4gU2Vzc1NldHVwID0gJWQiLHJjKSk7CisJCX0gZWxzZSB7CisJCQljRllJKDEsKCJDSUZTIFNlc3Npb24gRXN0YWJsaXNoZWQgc3VjY2Vzc2Z1bGx5IikpOworCQkJcFNlc0luZm8tPnN0YXR1cyA9IENpZnNHb29kOworCQl9CisJfQorc3NfZXJyX2V4aXQ6CisJcmV0dXJuIHJjOworfQorCmRpZmYgLS1naXQgYS9mcy9jaWZzL2Rpci5jIGIvZnMvY2lmcy9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTRlMTg2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9kaXIuYwpAQCAtMCwwICsxLDUyMyBAQAorLyoKKyAqICAgZnMvY2lmcy9kaXIuYworICoKKyAqICAgdmZzIG9wZXJhdGlvbnMgdGhhdCBkZWFsIHdpdGggZGVudHJpZXMKKyAqIAorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgIENvcnAuLCAyMDAyLDIwMDMKKyAqICAgQXV0aG9yKHMpOiBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSAiY2lmc2ZzLmgiCisjaW5jbHVkZSAiY2lmc3BkdS5oIgorI2luY2x1ZGUgImNpZnNnbG9iLmgiCisjaW5jbHVkZSAiY2lmc3Byb3RvLmgiCisjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgorI2luY2x1ZGUgImNpZnNfZnNfc2IuaCIKKwordm9pZAorcmVuZXdfcGFyZW50YWxfdGltZXN0YW1wcyhzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSkKK3sKKwkvKiBCQiBjaGVjayBpZiB0aGVyZSBpcyBhIHdheSB0byBnZXQgdGhlIGtlcm5lbCB0byBkbyB0aGlzIG9yIGlmIHdlIHJlYWxseSBuZWVkIHRoaXMgKi8KKwlkbyB7CisJCWRpcmVudHJ5LT5kX3RpbWUgPSBqaWZmaWVzOworCQlkaXJlbnRyeSA9IGRpcmVudHJ5LT5kX3BhcmVudDsKKwl9IHdoaWxlICghSVNfUk9PVChkaXJlbnRyeSkpOwkKK30KKworLyogTm90ZTogY2FsbGVyIG11c3QgZnJlZSByZXR1cm4gYnVmZmVyICovCitjaGFyICoKK2J1aWxkX3BhdGhfZnJvbV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGlyZW50cnkpCit7CisJc3RydWN0IGRlbnRyeSAqdGVtcDsKKwlpbnQgbmFtZWxlbiA9IDA7CisJY2hhciAqZnVsbF9wYXRoOworCisJaWYoZGlyZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7ICAvKiBub3QgbXVjaCB3ZSBjYW4gZG8gaWYgZGVudHJ5IGlzIGZyZWVkIGFuZAorCQl3ZSBuZWVkIHRvIHJlb3BlbiB0aGUgZmlsZSBhZnRlciBpdCB3YXMgY2xvc2VkIGltcGxpY2l0bHkKKwkJd2hlbiB0aGUgc2VydmVyIGNyYXNoZWQgKi8KKworY2lmc19icF9yZW5hbWVfcmV0cnk6CisJZm9yICh0ZW1wID0gZGlyZW50cnk7ICFJU19ST09UKHRlbXApOykgeworCQluYW1lbGVuICs9ICgxICsgdGVtcC0+ZF9uYW1lLmxlbik7CisJCXRlbXAgPSB0ZW1wLT5kX3BhcmVudDsKKwkJaWYodGVtcCA9PSBOVUxMKSB7CisJCQljRVJST1IoMSwoImNvcnJ1cHQgZGVudHJ5IikpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlmdWxsX3BhdGggPSBrbWFsbG9jKG5hbWVsZW4rMSwgR0ZQX0tFUk5FTCk7CisJaWYoZnVsbF9wYXRoID09IE5VTEwpCisJCXJldHVybiBmdWxsX3BhdGg7CisJZnVsbF9wYXRoW25hbWVsZW5dID0gMDsJLyogdHJhaWxpbmcgbnVsbCAqLworCisJZm9yICh0ZW1wID0gZGlyZW50cnk7ICFJU19ST09UKHRlbXApOykgeworCQluYW1lbGVuIC09IDEgKyB0ZW1wLT5kX25hbWUubGVuOworCQlpZiAobmFtZWxlbiA8IDApIHsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJZnVsbF9wYXRoW25hbWVsZW5dID0gJ1xcJzsKKwkJCXN0cm5jcHkoZnVsbF9wYXRoICsgbmFtZWxlbiArIDEsIHRlbXAtPmRfbmFtZS5uYW1lLAorCQkJCXRlbXAtPmRfbmFtZS5sZW4pOworCQkJY0ZZSSgwLCAoIiBuYW1lOiAlcyAiLCBmdWxsX3BhdGggKyBuYW1lbGVuKSk7CisJCX0KKwkJdGVtcCA9IHRlbXAtPmRfcGFyZW50OworCQlpZih0ZW1wID09IE5VTEwpIHsKKwkJCWNFUlJPUigxLCgiY29ycnVwdCBkZW50cnkiKSk7CisJCQlrZnJlZShmdWxsX3BhdGgpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJaWYgKG5hbWVsZW4gIT0gMCkgeworCQljRVJST1IoMSwKKwkJICAgICAgICgiV2UgZGlkIG5vdCBlbmQgcGF0aCBsb29rdXAgd2hlcmUgd2UgZXhwZWN0ZWQgbmFtZWxlbiBpcyAlZCIsCisJCQluYW1lbGVuKSk7CisJCS8qIHByZXN1bWFibHkgdGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHdlIHdlcmUgcmFjaW5nIHdpdGggYSByZW5hbWUgCisJCW9mIG9uZSBvZiB0aGUgcGFyZW50IGRpcmVjdG9yaWVzICAod2UgY2FuIG5vdCBsb2NrIHRoZSBkZW50cmllcworCQlhYm92ZSB1cyB0byBwcmV2ZW50IHRoaXMsIGJ1dCByZXRyeWluZyBzaG91bGQgYmUgaGFybWxlc3MpICovCisJCWtmcmVlKGZ1bGxfcGF0aCk7CisJCW5hbWVsZW4gPSAwOworCQlnb3RvIGNpZnNfYnBfcmVuYW1lX3JldHJ5OworCX0KKworCXJldHVybiBmdWxsX3BhdGg7Cit9CisKKy8qIE5vdGU6IGNhbGxlciBtdXN0IGZyZWUgcmV0dXJuIGJ1ZmZlciAqLworY2hhciAqCitidWlsZF93aWxkY2FyZF9wYXRoX2Zyb21fZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRpcmVudHJ5KQoreworCXN0cnVjdCBkZW50cnkgKnRlbXA7CisJaW50IG5hbWVsZW4gPSAwOworCWNoYXIgKmZ1bGxfcGF0aDsKKworCWlmKGRpcmVudHJ5ID09IE5VTEwpCisJCXJldHVybiBOVUxMOyAgLyogbm90IG11Y2ggd2UgY2FuIGRvIGlmIGRlbnRyeSBpcyBmcmVlZCBhbmQKKwkJd2UgbmVlZCB0byByZW9wZW4gdGhlIGZpbGUgYWZ0ZXIgaXQgd2FzIGNsb3NlZCBpbXBsaWNpdGx5CisJCXdoZW4gdGhlIHNlcnZlciBjcmFzaGVkICovCisKK2NpZnNfYndwX3JlbmFtZV9yZXRyeToKKwlmb3IgKHRlbXAgPSBkaXJlbnRyeTsgIUlTX1JPT1QodGVtcCk7KSB7CisJCW5hbWVsZW4gKz0gKDEgKyB0ZW1wLT5kX25hbWUubGVuKTsKKwkJdGVtcCA9IHRlbXAtPmRfcGFyZW50OworCQlpZih0ZW1wID09IE5VTEwpIHsKKwkJCWNFUlJPUigxLCgiY29ycnVwdCBkZW50cnkiKSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCWZ1bGxfcGF0aCA9IGttYWxsb2MobmFtZWxlbiszLCBHRlBfS0VSTkVMKTsKKwlpZihmdWxsX3BhdGggPT0gTlVMTCkKKwkJcmV0dXJuIGZ1bGxfcGF0aDsKKworCWZ1bGxfcGF0aFtuYW1lbGVuXSA9ICdcXCc7CisJZnVsbF9wYXRoW25hbWVsZW4rMV0gPSAnKic7CisJZnVsbF9wYXRoW25hbWVsZW4rMl0gPSAwOyAgLyogdHJhaWxpbmcgbnVsbCAqLworCisJZm9yICh0ZW1wID0gZGlyZW50cnk7ICFJU19ST09UKHRlbXApOykgeworCQluYW1lbGVuIC09IDEgKyB0ZW1wLT5kX25hbWUubGVuOworCQlpZiAobmFtZWxlbiA8IDApIHsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJZnVsbF9wYXRoW25hbWVsZW5dID0gJ1xcJzsKKwkJCXN0cm5jcHkoZnVsbF9wYXRoICsgbmFtZWxlbiArIDEsIHRlbXAtPmRfbmFtZS5uYW1lLAorCQkJCXRlbXAtPmRfbmFtZS5sZW4pOworCQkJY0ZZSSgwLCAoIiBuYW1lOiAlcyAiLCBmdWxsX3BhdGggKyBuYW1lbGVuKSk7CisJCX0KKwkJdGVtcCA9IHRlbXAtPmRfcGFyZW50OworCQlpZih0ZW1wID09IE5VTEwpIHsKKwkJCWNFUlJPUigxLCgiY29ycnVwdCBkZW50cnkiKSk7CisJCQlrZnJlZShmdWxsX3BhdGgpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJaWYgKG5hbWVsZW4gIT0gMCkgeworCQljRVJST1IoMSwKKwkJICAgICAgICgiV2UgZGlkIG5vdCBlbmQgcGF0aCBsb29rdXAgd2hlcmUgd2UgZXhwZWN0ZWQgbmFtZWxlbiBpcyAlZCIsCisJCQluYW1lbGVuKSk7CisJCS8qIHByZXN1bWFibHkgdGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHdlIHdlcmUgcmFjaW5nIHdpdGggYSByZW5hbWUgCisJCW9mIG9uZSBvZiB0aGUgcGFyZW50IGRpcmVjdG9yaWVzICAod2UgY2FuIG5vdCBsb2NrIHRoZSBkZW50cmllcworCQlhYm92ZSB1cyB0byBwcmV2ZW50IHRoaXMsIGJ1dCByZXRyeWluZyBzaG91bGQgYmUgaGFybWxlc3MpICovCisJCWtmcmVlKGZ1bGxfcGF0aCk7CisJCW5hbWVsZW4gPSAwOworCQlnb3RvIGNpZnNfYndwX3JlbmFtZV9yZXRyeTsKKwl9CisKKwlyZXR1cm4gZnVsbF9wYXRoOworfQorCisvKiBJbm9kZSBvcGVyYXRpb25zIGluIHNpbWlsYXIgb3JkZXIgdG8gaG93IHRoZXkgYXBwZWFyIGluIHRoZSBMaW51eCBmaWxlIGZzLmggKi8KKworaW50CitjaWZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSwgaW50IG1vZGUsCisJCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWludCByYyA9IC1FTk9FTlQ7CisJaW50IHhpZDsKKwlpbnQgb3Bsb2NrID0gMDsKKwlpbnQgZGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEU7CisJX191MTYgZmlsZUhhbmRsZTsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uOworCWNoYXIgKmZ1bGxfcGF0aCA9IE5VTEw7CisJRklMRV9BTExfSU5GTyAqIGJ1ZiA9IE5VTEw7CisJc3RydWN0IGlub2RlICpuZXdpbm9kZSA9IE5VTEw7CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqIHBDaWZzRmlsZSA9IE5VTEw7CisJc3RydWN0IGNpZnNJbm9kZUluZm8gKiBwQ2lmc0lub2RlOworCWludCBkaXNwb3NpdGlvbiA9IEZJTEVfT1ZFUldSSVRFX0lGOworCWludCB3cml0ZV9vbmx5ID0gRkFMU0U7CisKKwl4aWQgPSBHZXRYaWQoKTsKKworCWNpZnNfc2IgPSBDSUZTX1NCKGlub2RlLT5pX3NiKTsKKwlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisKKwlkb3duKCZkaXJlbnRyeS0+ZF9zYi0+c192ZnNfcmVuYW1lX3NlbSk7CisJZnVsbF9wYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShkaXJlbnRyeSk7CisJdXAoJmRpcmVudHJ5LT5kX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlpZihmdWxsX3BhdGggPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmKG5kKSB7CisJCWlmICgobmQtPmludGVudC5vcGVuLmZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSkKKwkJCWRlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1JFQUQ7CisJCWVsc2UgaWYgKChuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fV1JPTkxZKSB7CisJCQlkZXNpcmVkQWNjZXNzID0gR0VORVJJQ19XUklURTsKKwkJCXdyaXRlX29ubHkgPSBUUlVFOworCQl9IGVsc2UgaWYgKChuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRXUikgeworCQkJLyogR0VORVJJQ19BTEwgaXMgdG9vIG11Y2ggcGVybWlzc2lvbiB0byByZXF1ZXN0ICovCisJCQkvKiBjYW4gY2F1c2UgdW5uZWNlc3NhcnkgYWNjZXNzIGRlbmllZCBvbiBjcmVhdGUgKi8KKwkJCS8qIGRlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX0FMTDsgKi8KKwkJCWRlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFOworCQl9CisKKwkJaWYoKG5kLT5pbnRlbnQub3Blbi5mbGFncyAmIChPX0NSRUFUIHwgT19FWENMKSkgPT0gKE9fQ1JFQVQgfCBPX0VYQ0wpKQorCQkJZGlzcG9zaXRpb24gPSBGSUxFX0NSRUFURTsKKwkJZWxzZSBpZigobmQtPmludGVudC5vcGVuLmZsYWdzICYgKE9fQ1JFQVQgfCBPX1RSVU5DKSkgPT0gKE9fQ1JFQVQgfCBPX1RSVU5DKSkKKwkJCWRpc3Bvc2l0aW9uID0gRklMRV9PVkVSV1JJVEVfSUY7CisJCWVsc2UgaWYoKG5kLT5pbnRlbnQub3Blbi5mbGFncyAmIE9fQ1JFQVQpID09IE9fQ1JFQVQpCisJCQlkaXNwb3NpdGlvbiA9IEZJTEVfT1BFTl9JRjsKKwkJZWxzZSB7CisJCQljRllJKDEsKCJDcmVhdGUgZmxhZyBub3Qgc2V0IGluIGNyZWF0ZSBmdW5jdGlvbiIpKTsKKwkJfQorCX0KKworCS8qIEJCIGFkZCBwcm9jZXNzaW5nIHRvIHNldCBlcXVpdmFsZW50IG9mIG1vZGUgLSBlLmcuIHZpYSBDcmVhdGVYIHdpdGggQUNMcyAqLworCWlmIChvcGxvY2tFbmFibGVkKQorCQlvcGxvY2sgPSBSRVFfT1BMT0NLOworCisJYnVmID0ga21hbGxvYyhzaXplb2YoRklMRV9BTExfSU5GTyksR0ZQX0tFUk5FTCk7CisJaWYoYnVmID09IE5VTEwpIHsKKwkJa2ZyZWUoZnVsbF9wYXRoKTsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyYyA9IENJRlNTTUJPcGVuKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgZGlzcG9zaXRpb24sCisJCQkgZGVzaXJlZEFjY2VzcywgQ1JFQVRFX05PVF9ESVIsCisJCQkgJmZpbGVIYW5kbGUsICZvcGxvY2ssIGJ1ZiwgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoImNpZnNfY3JlYXRlIHJldHVybmVkIDB4JXggIiwgcmMpKTsKKwl9IGVsc2UgeworCQkvKiBJZiBPcGVuIHJlcG9ydGVkIHRoYXQgd2UgYWN0dWFsbHkgY3JlYXRlZCBhIGZpbGUKKwkJdGhlbiB3ZSBub3cgaGF2ZSB0byBzZXQgdGhlIG1vZGUgaWYgcG9zc2libGUgKi8KKwkJaWYgKChjaWZzX3NiLT50Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklYKSAmJgorCQkJKG9wbG9jayAmIENJRlNfQ1JFQVRFX0FDVElPTikpCisJCQlpZihjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfU0VUX1VJRCkgeworCQkJCUNJRlNTTUJVbml4U2V0UGVybXMoeGlkLCBwVGNvbiwgZnVsbF9wYXRoLCBtb2RlLAorCQkJCQkoX191NjQpY3VycmVudC0+ZXVpZCwKKwkJCQkJKF9fdTY0KWN1cnJlbnQtPmVnaWQsCisJCQkJCTAgLyogZGV2ICovLAorCQkJCQljaWZzX3NiLT5sb2NhbF9ubHMpOworCQkJfSBlbHNlIHsKKwkJCQlDSUZTU01CVW5peFNldFBlcm1zKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgbW9kZSwKKwkJCQkJKF9fdTY0KS0xLAorCQkJCQkoX191NjQpLTEsCisJCQkJCTAgLyogZGV2ICovLAorCQkJCQljaWZzX3NiLT5sb2NhbF9ubHMpOworCQkJfQorCQllbHNlIHsKKwkJCS8qIEJCIGltcGxlbWVudCB2aWEgV2luZG93cyBzZWN1cml0eSBkZXNjcmlwdG9ycyAqLworCQkJLyogZWcgQ0lGU1NNQldpblNldFBlcm1zKHhpZCxwVGNvbixmdWxsX3BhdGgsbW9kZSwtMSwtMSxsb2NhbF9ubHMpOyovCisJCQkvKiBjb3VsZCBzZXQgci9vIGRvcyBhdHRyaWJ1dGUgaWYgbW9kZSAmIDAyMjIgPT0gMCAqLworCQl9CisKKwkvKiBCQiBzZXJ2ZXIgbWlnaHQgbWFzayBtb2RlIHNvIHdlIGhhdmUgdG8gcXVlcnkgZm9yIFVuaXggY2FzZSovCisJCWlmIChwVGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKKwkJCXJjID0gY2lmc19nZXRfaW5vZGVfaW5mb191bml4KCZuZXdpbm9kZSwgZnVsbF9wYXRoLAorCQkJCQkJIGlub2RlLT5pX3NiLHhpZCk7CisJCWVsc2UgeworCQkJcmMgPSBjaWZzX2dldF9pbm9kZV9pbmZvKCZuZXdpbm9kZSwgZnVsbF9wYXRoLAorCQkJCQkJIGJ1ZiwgaW5vZGUtPmlfc2IseGlkKTsKKwkJCWlmKG5ld2lub2RlKQorCQkJCW5ld2lub2RlLT5pX21vZGUgPSBtb2RlOworCQl9CisKKwkJaWYgKHJjICE9IDApIHsKKwkJCWNGWUkoMSwoIkNyZWF0ZSB3b3JrZWQgYnV0IGdldF9pbm9kZV9pbmZvIGZhaWxlZCB3aXRoIHJjID0gJWQiLAorCQkJICAgICAgcmMpKTsKKwkJfSBlbHNlIHsKKwkJCWRpcmVudHJ5LT5kX29wID0gJmNpZnNfZGVudHJ5X29wczsKKwkJCWRfaW5zdGFudGlhdGUoZGlyZW50cnksIG5ld2lub2RlKTsKKwkJfQorCQlpZigobmQtPmZsYWdzICYgTE9PS1VQX09QRU4pID09IEZBTFNFKSB7CisJCQkvKiBta25vZCBjYXNlIC0gZG8gbm90IGxlYXZlIGZpbGUgb3BlbiAqLworCQkJQ0lGU1NNQkNsb3NlKHhpZCwgcFRjb24sIGZpbGVIYW5kbGUpOworCQl9IGVsc2UgaWYobmV3aW5vZGUpIHsKKwkJCXBDaWZzRmlsZSA9IChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopCisJCQkgICBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGNpZnNGaWxlSW5mbyksIEdGUF9LRVJORUwpOworCQkKKwkJCWlmIChwQ2lmc0ZpbGUpIHsKKwkJCQltZW1zZXQoKGNoYXIgKilwQ2lmc0ZpbGUsIDAsCisJCQkJICAgICAgIHNpemVvZiAoc3RydWN0IGNpZnNGaWxlSW5mbykpOworCQkJCXBDaWZzRmlsZS0+bmV0ZmlkID0gZmlsZUhhbmRsZTsKKwkJCQlwQ2lmc0ZpbGUtPnBpZCA9IGN1cnJlbnQtPnRnaWQ7CisJCQkJcENpZnNGaWxlLT5wSW5vZGUgPSBuZXdpbm9kZTsKKwkJCQlwQ2lmc0ZpbGUtPmludmFsaWRIYW5kbGUgPSBGQUxTRTsKKwkJCQlwQ2lmc0ZpbGUtPmNsb3NlUGVuZCAgICAgPSBGQUxTRTsKKwkJCQlpbml0X01VVEVYKCZwQ2lmc0ZpbGUtPmZoX3NlbSk7CisJCQkJLyogcHV0IHRoZSBmb2xsb3dpbmcgaW4gYXQgb3BlbiBub3cgKi8KKwkJCQkvKiBwQ2lmc0ZpbGUtPnBmaWxlID0gZmlsZTsgKi8gCisJCQkJd3JpdGVfbG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJCQkJbGlzdF9hZGQoJnBDaWZzRmlsZS0+dGxpc3QsJnBUY29uLT5vcGVuRmlsZUxpc3QpOworCQkJCXBDaWZzSW5vZGUgPSBDSUZTX0kobmV3aW5vZGUpOworCQkJCWlmKHBDaWZzSW5vZGUpIHsKKwkJCQkvKiBpZiByZWFkYWJsZSBmaWxlIGluc3RhbmNlIHB1dCBmaXJzdCBpbiBsaXN0Ki8KKwkJCQkJaWYgKHdyaXRlX29ubHkgPT0gVFJVRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlsaXN0X2FkZF90YWlsKCZwQ2lmc0ZpbGUtPmZsaXN0LAorCQkJCQkJCSZwQ2lmc0lub2RlLT5vcGVuRmlsZUxpc3QpOworCQkJCQl9IGVsc2UgeworCQkJCQkJbGlzdF9hZGQoJnBDaWZzRmlsZS0+Zmxpc3QsCisJCQkJCQkJJnBDaWZzSW5vZGUtPm9wZW5GaWxlTGlzdCk7CisJCQkJCX0KKwkJCQkJaWYoKG9wbG9jayAmIDB4RikgPT0gT1BMT0NLX0VYQ0xVU0lWRSkgeworCQkJCQkJcENpZnNJbm9kZS0+Y2xpZW50Q2FuQ2FjaGVBbGwgPSBUUlVFOworCQkJCQkJcENpZnNJbm9kZS0+Y2xpZW50Q2FuQ2FjaGVSZWFkID0gVFJVRTsKKwkJCQkJCWNGWUkoMSwoIkV4Y2x1c2l2ZSBPcGxvY2sgZ3JhbnRlZCBvbiBpbm9kZSAlcCIsCisJCQkJCQkJbmV3aW5vZGUpKTsKKwkJCQkJfSBlbHNlIGlmKChvcGxvY2sgJiAweEYpID09IE9QTE9DS19SRUFEKQorCQkJCQkJcENpZnNJbm9kZS0+Y2xpZW50Q2FuQ2FjaGVSZWFkID0gVFJVRTsKKwkJCQl9CisJCQkJd3JpdGVfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwkJCX0KKwkJfQorCX0gCisKKwlpZiAoYnVmKQorCSAgICBrZnJlZShidWYpOworCWlmIChmdWxsX3BhdGgpCisJICAgIGtmcmVlKGZ1bGxfcGF0aCk7CisJRnJlZVhpZCh4aWQpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgY2lmc19ta25vZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSwgaW50IG1vZGUsIGRldl90IGRldmljZV9udW1iZXIpIAoreworCWludCByYyA9IC1FUEVSTTsKKwlpbnQgeGlkOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJY2hhciAqZnVsbF9wYXRoID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKiBuZXdpbm9kZSA9IE5VTEw7CisKKwlpZiAoIW9sZF92YWxpZF9kZXYoZGV2aWNlX251bWJlcikpCisJCXJldHVybiAtRUlOVkFMOworCisJeGlkID0gR2V0WGlkKCk7CisKKwljaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworCisJZG93bigmZGlyZW50cnktPmRfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCWZ1bGxfcGF0aCA9IGJ1aWxkX3BhdGhfZnJvbV9kZW50cnkoZGlyZW50cnkpOworCXVwKCZkaXJlbnRyeS0+ZF9zYi0+c192ZnNfcmVuYW1lX3NlbSk7CisJaWYoZnVsbF9wYXRoID09IE5VTEwpCisJCXJjID0gLUVOT01FTTsKKwkKKwlpZiAoZnVsbF9wYXRoICYmIChwVGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkpIHsKKwkJaWYoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1NFVF9VSUQpIHsKKwkJCXJjID0gQ0lGU1NNQlVuaXhTZXRQZXJtcyh4aWQsIHBUY29uLCBmdWxsX3BhdGgsCisJCQkJbW9kZSwoX191NjQpY3VycmVudC0+ZXVpZCwoX191NjQpY3VycmVudC0+ZWdpZCwKKwkJCQlkZXZpY2VfbnVtYmVyLCBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQl9IGVsc2UgeworCQkJcmMgPSBDSUZTU01CVW5peFNldFBlcm1zKHhpZCwgcFRjb24sCisJCQkJZnVsbF9wYXRoLCBtb2RlLCAoX191NjQpLTEsIChfX3U2NCktMSwKKwkJCQlkZXZpY2VfbnVtYmVyLCBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQl9CisKKwkJaWYoIXJjKSB7CisJCQlyYyA9IGNpZnNfZ2V0X2lub2RlX2luZm9fdW5peCgmbmV3aW5vZGUsIGZ1bGxfcGF0aCwKKwkJCQkJCWlub2RlLT5pX3NiLHhpZCk7CisJCQlkaXJlbnRyeS0+ZF9vcCA9ICZjaWZzX2RlbnRyeV9vcHM7CisJCQlpZihyYyA9PSAwKQorCQkJCWRfaW5zdGFudGlhdGUoZGlyZW50cnksIG5ld2lub2RlKTsKKwkJfQorCX0KKworCWlmIChmdWxsX3BhdGgpCisJCWtmcmVlKGZ1bGxfcGF0aCk7CisJRnJlZVhpZCh4aWQpOworCisJcmV0dXJuIHJjOworfQorCisKK3N0cnVjdCBkZW50cnkgKgorY2lmc19sb29rdXAoc3RydWN0IGlub2RlICpwYXJlbnRfZGlyX2lub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IHhpZDsKKwlpbnQgcmMgPSAwOyAvKiB0byBnZXQgYXJvdW5kIHNwdXJpb3VzIGdjYyB3YXJuaW5nLCBzZXQgdG8gemVybyBoZXJlICovCisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwlzdHJ1Y3QgaW5vZGUgKm5ld0lub2RlID0gTlVMTDsKKwljaGFyICpmdWxsX3BhdGggPSBOVUxMOworCisJeGlkID0gR2V0WGlkKCk7CisKKwljRllJKDEsCisJICAgICAoIiBwYXJlbnQgaW5vZGUgPSAweCVwIG5hbWUgaXM6ICVzIGFuZCBkZW50cnkgPSAweCVwIiwKKwkgICAgICBwYXJlbnRfZGlyX2lub2RlLCBkaXJlbnRyeS0+ZF9uYW1lLm5hbWUsIGRpcmVudHJ5KSk7CisKKwkvKiBCQiBBZGQgY2hlY2sgb2YgaW5jb21pbmcgZGF0YSAtIGUuZy4gZnJhbWUgbm90IGxvbmdlciB0aGFuIG1heGltdW0gU01CIC0gbGV0IHNlcnZlciBjaGVjayB0aGUgbmFtZWxlbiBCQiAqLworCisJLyogY2hlY2sgd2hldGhlciBwYXRoIGV4aXN0cyAqLworCisJY2lmc19zYiA9IENJRlNfU0IocGFyZW50X2Rpcl9pbm9kZS0+aV9zYik7CisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworCisJLyogY2FuIG5vdCBncmFiIHRoZSByZW5hbWUgc2VtIGhlcmUgc2luY2UgaXQgd291bGQKKwlkZWFkbG9jayBpbiB0aGUgY2FzZXMgKGJlZ2lubmluZyBvZiBzeXNfcmVuYW1lIGl0c2VsZikKKwlpbiB3aGljaCB3ZSBhbHJlYWR5IGhhdmUgdGhlIHNiIHJlbmFtZSBzZW0gKi8KKwlmdWxsX3BhdGggPSBidWlsZF9wYXRoX2Zyb21fZGVudHJ5KGRpcmVudHJ5KTsKKwlpZihmdWxsX3BhdGggPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCWlmIChkaXJlbnRyeS0+ZF9pbm9kZSAhPSBOVUxMKSB7CisJCWNGWUkoMSwgKCIgbm9uLU5VTEwgaW5vZGUgaW4gbG9va3VwIikpOworCX0gZWxzZSB7CisJCWNGWUkoMSwgKCIgTlVMTCBpbm9kZSBpbiBsb29rdXAiKSk7CisJfQorCWNGWUkoMSwKKwkgICAgICgiIEZ1bGwgcGF0aDogJXMgaW5vZGUgPSAweCVwIiwgZnVsbF9wYXRoLCBkaXJlbnRyeS0+ZF9pbm9kZSkpOworCisJaWYgKHBUY29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklYKQorCQlyYyA9IGNpZnNfZ2V0X2lub2RlX2luZm9fdW5peCgmbmV3SW5vZGUsIGZ1bGxfcGF0aCwKKwkJCQkJICAgICAgcGFyZW50X2Rpcl9pbm9kZS0+aV9zYix4aWQpOworCWVsc2UKKwkJcmMgPSBjaWZzX2dldF9pbm9kZV9pbmZvKCZuZXdJbm9kZSwgZnVsbF9wYXRoLCBOVUxMLAorCQkJCQkgcGFyZW50X2Rpcl9pbm9kZS0+aV9zYix4aWQpOworCisJaWYgKChyYyA9PSAwKSAmJiAobmV3SW5vZGUgIT0gTlVMTCkpIHsKKwkJZGlyZW50cnktPmRfb3AgPSAmY2lmc19kZW50cnlfb3BzOworCQlkX2FkZChkaXJlbnRyeSwgbmV3SW5vZGUpOworCisJCS8qIHNpbmNlIHBhdGhzIGFyZSBub3QgbG9va2VkIHVwIGJ5IGNvbXBvbmVudCAtIHRoZSBwYXJlbnQgZGlyZWN0b3JpZXMgYXJlIHByZXN1bWVkIHRvIGJlIGdvb2QgaGVyZSAqLworCQlyZW5ld19wYXJlbnRhbF90aW1lc3RhbXBzKGRpcmVudHJ5KTsKKworCX0gZWxzZSBpZiAocmMgPT0gLUVOT0VOVCkgeworCQlyYyA9IDA7CisJCWRfYWRkKGRpcmVudHJ5LCBOVUxMKTsKKwl9IGVsc2UgeworCQljRVJST1IoMSwoIkVycm9yIDB4JXggb3Igb24gY2lmc19nZXRfaW5vZGVfaW5mbyBpbiBsb29rdXAiLHJjKSk7CisJCS8qIEJCIHNwZWNpYWwgY2FzZSBjaGVjayBmb3IgQWNjZXNzIERlbmllZCAtIHdhdGNoIHNlY3VyaXR5IAorCQlleHBvc3VyZSBvZiByZXR1cm5pbmcgZGlyIGluZm8gaW1wbGljaXRseSB2aWEgZGlmZmVyZW50IHJjIAorCQlpZiBmaWxlIGV4aXN0cyBvciBub3QgYnV0IG5vIGFjY2VzcyBCQiAqLworCX0KKworCWlmIChmdWxsX3BhdGgpCisJCWtmcmVlKGZ1bGxfcGF0aCk7CisJRnJlZVhpZCh4aWQpOworCXJldHVybiBFUlJfUFRSKHJjKTsKK30KKworaW50CitjaWZzX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQorewkJCQkvKiBOQjogY3VycmVudGx5IHVudXNlZCBzaW5jZSBzZWFyY2hlcyBhcmUgb3BlbmVkIGluIHJlYWRkaXIgKi8KKwlpbnQgcmMgPSAwOworCWludCB4aWQ7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwljaGFyICpmdWxsX3BhdGggPSBOVUxMOworCisJeGlkID0gR2V0WGlkKCk7CisKKwljaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworCisJaWYoZmlsZS0+Zl9kZW50cnkpIHsKKwkJZG93bigmZmlsZS0+Zl9kZW50cnktPmRfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCQlmdWxsX3BhdGggPSBidWlsZF93aWxkY2FyZF9wYXRoX2Zyb21fZGVudHJ5KGZpbGUtPmZfZGVudHJ5KTsKKwkJdXAoJmZpbGUtPmZfZGVudHJ5LT5kX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwl9IGVsc2UgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWNGWUkoMSwgKCJpbm9kZSA9IDB4JXAgYW5kIGZ1bGwgcGF0aCBpcyAlcyIsIGlub2RlLCBmdWxsX3BhdGgpKTsKKworCWlmIChmdWxsX3BhdGgpCisJCWtmcmVlKGZ1bGxfcGF0aCk7CisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorY2lmc19kX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqZGlyZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWludCBpc1ZhbGlkID0gMTsKKworLyoJbG9ja19rZXJuZWwoKTsgKi8vKiBzdXJlbHkgd2UgZG8gbm90IHdhbnQgdG8gbG9jayB0aGUga2VybmVsIGZvciBhIHdob2xlIG5ldHdvcmsgcm91bmQgdHJpcCB3aGljaCBjb3VsZCB0YWtlIHNlY29uZHMgKi8KKworCWlmIChkaXJlbnRyeS0+ZF9pbm9kZSkgeworCQlpZiAoY2lmc19yZXZhbGlkYXRlKGRpcmVudHJ5KSkgeworCQkJLyogdW5sb2NrX2tlcm5lbCgpOyAqLworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQljRllJKDEsCisJCSAgICAgKCJJbiBjaWZzX2RfcmV2YWxpZGF0ZSB3aXRoIG5vIGlub2RlIGJ1dCBuYW1lID0gJXMgYW5kIGRlbnRyeSAweCVwIiwKKwkJICAgICAgZGlyZW50cnktPmRfbmFtZS5uYW1lLCBkaXJlbnRyeSkpOworCX0KKworLyogICAgdW5sb2NrX2tlcm5lbCgpOyAqLworCisJcmV0dXJuIGlzVmFsaWQ7Cit9CisKKy8qIHN0YXRpYyBpbnQgY2lmc19kX2RlbGV0ZShzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSkKK3sKKwlpbnQgcmMgPSAwOworCisJY0ZZSSgxLCAoIkluIGNpZnMgZF9kZWxldGUsIG5hbWUgPSAlcyIsIGRpcmVudHJ5LT5kX25hbWUubmFtZSkpOworCisJcmV0dXJuIHJjOworfSAgICAgKi8KKworc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGNpZnNfZGVudHJ5X29wcyA9IHsKKwkuZF9yZXZhbGlkYXRlID0gY2lmc19kX3JldmFsaWRhdGUsCisvKiBkX2RlbGV0ZTogICAgICAgY2lmc19kX2RlbGV0ZSwgICAgICAgKi8vKiBub3QgbmVlZGVkIGV4Y2VwdCBmb3IgZGVidWdnaW5nICovCisJLyogbm8gbmVlZCBmb3IgZF9oYXNoLCBkX2NvbXBhcmUsIGRfcmVsZWFzZSwgZF9pcHV0IC4uLiB5ZXQuIEJCIGNvbmZpcm0gdGhpcyBCQiAqLworfTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZmNudGwuYyBiL2ZzL2NpZnMvZmNudGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDI0YzQwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9mY250bC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogICBmcy9jaWZzL2ZjbnRsLmMKKyAqCisgKiAgIHZmcyBvcGVyYXRpb25zIHRoYXQgZGVhbCB3aXRoIHRoZSBmaWxlIGNvbnRyb2wgQVBJCisgKiAKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMywyMDA0CisgKiAgIEF1dGhvcihzKTogU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSAiY2lmc2dsb2IuaCIKKyNpbmNsdWRlICJjaWZzcHJvdG8uaCIKKyNpbmNsdWRlICJjaWZzX3VuaWNvZGUuaCIKKyNpbmNsdWRlICJjaWZzX2RlYnVnLmgiCisjaW5jbHVkZSAiY2lmc2ZzLmgiCisKK3N0YXRpYyBfX3UzMiBjb252ZXJ0X3RvX2NpZnNfbm90aWZ5X2ZsYWdzKHVuc2lnbmVkIGxvbmcgZmNudGxfbm90aWZ5X2ZsYWdzKQoreworCV9fdTMyIGNpZnNfbnRmeV9mbGFncyA9IDA7CisKKwkvKiBObyB3YXkgb24gTGludXggVkZTIHRvIGFzayB0byBtb25pdG9yIHhhdHRyCisJY2hhbmdlcyAoYW5kIG5vIHN0cmVhbSBzdXBwb3J0IGVpdGhlciAqLworCWlmKGZjbnRsX25vdGlmeV9mbGFncyAmIEROX0FDQ0VTUykgeworCQljaWZzX250ZnlfZmxhZ3MgfD0gRklMRV9OT1RJRllfQ0hBTkdFX0xBU1RfQUNDRVNTOworCX0KKwlpZihmY250bF9ub3RpZnlfZmxhZ3MgJiBETl9NT0RJRlkpIHsKKwkJLyogV2hhdCBkb2VzIHRoaXMgbWVhbiBvbiBkaXJlY3Rvcmllcz8gKi8KKwkJY2lmc19udGZ5X2ZsYWdzIHw9IEZJTEVfTk9USUZZX0NIQU5HRV9MQVNUX1dSSVRFIHwKKwkJCUZJTEVfTk9USUZZX0NIQU5HRV9TSVpFOworCX0KKwlpZihmY250bF9ub3RpZnlfZmxhZ3MgJiBETl9DUkVBVEUpIHsKKwkJY2lmc19udGZ5X2ZsYWdzIHw9IEZJTEVfTk9USUZZX0NIQU5HRV9DUkVBVElPTiB8IAorCQkJRklMRV9OT1RJRllfQ0hBTkdFX0xBU1RfV1JJVEU7CisJfQorCWlmKGZjbnRsX25vdGlmeV9mbGFncyAmIEROX0RFTEVURSkgeworCQljaWZzX250ZnlfZmxhZ3MgfD0gRklMRV9OT1RJRllfQ0hBTkdFX0xBU1RfV1JJVEU7CisJfQorCWlmKGZjbnRsX25vdGlmeV9mbGFncyAmIEROX1JFTkFNRSkgeworCQkvKiBCQiByZXZpZXcgdGhpcyAtIGNoZWNraW5nIHZhcmlvdXMgc2VydmVyIGJlaGF2aW9ycyAqLworCQljaWZzX250ZnlfZmxhZ3MgfD0gRklMRV9OT1RJRllfQ0hBTkdFX0RJUl9OQU1FIHwgCisJCQlGSUxFX05PVElGWV9DSEFOR0VfRklMRV9OQU1FOworCX0KKwlpZihmY250bF9ub3RpZnlfZmxhZ3MgJiBETl9BVFRSSUIpIHsKKwkJY2lmc19udGZ5X2ZsYWdzIHw9IEZJTEVfTk9USUZZX0NIQU5HRV9TRUNVUklUWSB8IAorCQkJRklMRV9OT1RJRllfQ0hBTkdFX0FUVFJJQlVURVM7CisJfQorLyoJaWYoZmNudGxfbm90aWZ5X2ZsYWdzICYgRE5fTVVMVElTSE9UKSB7CisJCWNpZnNfbnRmeV9mbGFncyB8PSA7CisJfSAqLyAvKiBCQiBmaXhtZSAtIG5vdCBzdXJlIGhvdyB0byBoYW5kbGUgdGhpcyB3aXRoIENJRlMgeWV0ICovCisKKworCXJldHVybiBjaWZzX250ZnlfZmxhZ3M7Cit9CisKK2ludCBjaWZzX2Rpcl9ub3RpZnkoc3RydWN0IGZpbGUgKiBmaWxlLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgeGlkOworCWludCByYyA9IC1FSU5WQUw7CisJaW50IG9wbG9jayA9IEZBTFNFOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJY2hhciAqZnVsbF9wYXRoID0gTlVMTDsKKwlfX3UzMiBmaWx0ZXIgPSBGSUxFX05PVElGWV9DSEFOR0VfTkFNRSB8IEZJTEVfTk9USUZZX0NIQU5HRV9BVFRSSUJVVEVTOworCV9fdTE2IG5ldGZpZDsKKworCXhpZCA9IEdldFhpZCgpOworCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfZGVudHJ5LT5kX3NiKTsKKwlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisKKwlkb3duKCZmaWxlLT5mX2RlbnRyeS0+ZF9zYi0+c192ZnNfcmVuYW1lX3NlbSk7CisJZnVsbF9wYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShmaWxlLT5mX2RlbnRyeSk7CisJdXAoJmZpbGUtPmZfZGVudHJ5LT5kX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKworCWlmKGZ1bGxfcGF0aCA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKKwl9IGVsc2UgeworCQljRVJST1IoMSwoImNpZnMgZGlyIG5vdGlmeSBvbiBmaWxlICVzIHdpdGggYXJnIDB4JWx4IixmdWxsX3BhdGgsYXJnKSk7IC8qIEJCIHJlbW92ZW1lIEJCICovCisJCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCBwVGNvbiwgZnVsbF9wYXRoLCBGSUxFX09QRU4sIAorCQkJR0VORVJJQ19SRUFEIHwgU1lOQ0hST05JWkUsIDAgLyogY3JlYXRlIG9wdGlvbnMgKi8sCisJCQkmbmV0ZmlkLCAmb3Bsb2NrLE5VTEwsIGNpZnNfc2ItPmxvY2FsX25scyk7CisJCS8qIEJCIGZpeG1lIC0gYWRkIHRoaXMgaGFuZGxlIHRvIGEgbm90aWZ5IGhhbmRsZSBsaXN0ICovCisJCWlmKHJjKSB7CisJCQljRVJST1IoMSwoIkNvdWxkIG5vdCBvcGVuIGRpcmVjdG9yeSBmb3Igbm90aWZ5IikpOyAgLyogQkIgcmVtb3ZlIEJCICovCisJCX0gZWxzZSB7CisJCQlmaWx0ZXIgPSBjb252ZXJ0X3RvX2NpZnNfbm90aWZ5X2ZsYWdzKGFyZyk7CisJCQlpZihmaWx0ZXIgIT0gMCkgeworCQkJCXJjID0gQ0lGU1NNQk5vdGlmeSh4aWQsIHBUY29uLCAwIC8qIG5vIHN1YmRpcnMgKi8sIG5ldGZpZCwgCisJCQkJCWZpbHRlciwgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwkJCX0gZWxzZSB7CisJCQkJcmMgPSAtRUlOVkFMOworCQkJfQorCQkJLyogQkIgYWRkIGNvZGUgdG8gY2xvc2UgZmlsZSBldmVudHVhbGx5IChhdCB1bm1vdW50CisJCQlpdCB3b3VsZCBjbG9zZSBhdXRvbWF0aWNhbGx5IGJ1dCBtYXkgYmUgYSB3YXkKKwkJCXRvIGRvIGl0IGVhc2lseSB3aGVuIGlub2RlIGZyZWVkIG9yIHdoZW4KKwkJCW5vdGlmeSBpbmZvIGlzIGNsZWFyZWQvY2hhbmdlZCAqLworICAgICAgICAgICAgY0VSUk9SKDEsKCJub3RpZnkgcmMgJWQiLHJjKSk7CisJCX0KKwl9CisJCisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZmlsZS5jIGIvZnMvY2lmcy9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhYjdjZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NpZnMvZmlsZS5jCkBAIC0wLDAgKzEsMTY3NSBAQAorLyoKKyAqICAgZnMvY2lmcy9maWxlLmMKKyAqCisgKiAgIHZmcyBvcGVyYXRpb25zIHRoYXQgZGVhbCB3aXRoIGZpbGVzCisgKiAKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMiwyMDAzCisgKiAgIEF1dGhvcihzKTogU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2V2ZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorI2luY2x1ZGUgImNpZnNmcy5oIgorI2luY2x1ZGUgImNpZnNwZHUuaCIKKyNpbmNsdWRlICJjaWZzZ2xvYi5oIgorI2luY2x1ZGUgImNpZnNwcm90by5oIgorI2luY2x1ZGUgImNpZnNfdW5pY29kZS5oIgorI2luY2x1ZGUgImNpZnNfZGVidWcuaCIKKyNpbmNsdWRlICJjaWZzX2ZzX3NiLmgiCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNpZnNGaWxlSW5mbyAqY2lmc19pbml0X3ByaXZhdGUoCisJc3RydWN0IGNpZnNGaWxlSW5mbyAqcHJpdmF0ZV9kYXRhLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCXN0cnVjdCBmaWxlICpmaWxlLCBfX3UxNiBuZXRmaWQpCit7CisJbWVtc2V0KHByaXZhdGVfZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBjaWZzRmlsZUluZm8pKTsKKwlwcml2YXRlX2RhdGEtPm5ldGZpZCA9IG5ldGZpZDsKKwlwcml2YXRlX2RhdGEtPnBpZCA9IGN1cnJlbnQtPnRnaWQ7CQorCWluaXRfTVVURVgoJnByaXZhdGVfZGF0YS0+Zmhfc2VtKTsKKwlwcml2YXRlX2RhdGEtPnBmaWxlID0gZmlsZTsgLyogbmVlZGVkIGZvciB3cml0ZXBhZ2UgKi8KKwlwcml2YXRlX2RhdGEtPnBJbm9kZSA9IGlub2RlOworCXByaXZhdGVfZGF0YS0+aW52YWxpZEhhbmRsZSA9IEZBTFNFOworCXByaXZhdGVfZGF0YS0+Y2xvc2VQZW5kID0gRkFMU0U7CisKKwlyZXR1cm4gcHJpdmF0ZV9kYXRhOworfQorCitzdGF0aWMgaW5saW5lIGludCBjaWZzX2NvbnZlcnRfZmxhZ3ModW5zaWduZWQgaW50IGZsYWdzKQoreworCWlmICgoZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRPTkxZKQorCQlyZXR1cm4gR0VORVJJQ19SRUFEOworCWVsc2UgaWYgKChmbGFncyAmIE9fQUNDTU9ERSkgPT0gT19XUk9OTFkpCisJCXJldHVybiBHRU5FUklDX1dSSVRFOworCWVsc2UgaWYgKChmbGFncyAmIE9fQUNDTU9ERSkgPT0gT19SRFdSKSB7CisJCS8qIEdFTkVSSUNfQUxMIGlzIHRvbyBtdWNoIHBlcm1pc3Npb24gdG8gcmVxdWVzdAorCQkgICBjYW4gY2F1c2UgdW5uZWNlc3NhcnkgYWNjZXNzIGRlbmllZCBvbiBjcmVhdGUgKi8KKwkJLyogcmV0dXJuIEdFTkVSSUNfQUxMOyAqLworCQlyZXR1cm4gKEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEUpOworCX0KKworCXJldHVybiAweDIwMTk3OworfQorCitzdGF0aWMgaW5saW5lIGludCBjaWZzX2dldF9kaXNwb3NpdGlvbih1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaWYgKChmbGFncyAmIChPX0NSRUFUIHwgT19FWENMKSkgPT0gKE9fQ1JFQVQgfCBPX0VYQ0wpKQorCQlyZXR1cm4gRklMRV9DUkVBVEU7CisJZWxzZSBpZiAoKGZsYWdzICYgKE9fQ1JFQVQgfCBPX1RSVU5DKSkgPT0gKE9fQ1JFQVQgfCBPX1RSVU5DKSkKKwkJcmV0dXJuIEZJTEVfT1ZFUldSSVRFX0lGOworCWVsc2UgaWYgKChmbGFncyAmIE9fQ1JFQVQpID09IE9fQ1JFQVQpCisJCXJldHVybiBGSUxFX09QRU5fSUY7CisJZWxzZQorCQlyZXR1cm4gRklMRV9PUEVOOworfQorCisvKiBhbGwgYXJndW1lbnRzIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjaGVja2VkIGZvciB2YWxpZGl0eSBpbiBjYWxsZXIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNpZnNfb3Blbl9pbm9kZV9oZWxwZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJc3RydWN0IGNpZnNJbm9kZUluZm8gKnBDaWZzSW5vZGUsIHN0cnVjdCBjaWZzRmlsZUluZm8gKnBDaWZzRmlsZSwKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbiwgaW50ICpvcGxvY2ssIEZJTEVfQUxMX0lORk8gKmJ1ZiwKKwljaGFyICpmdWxsX3BhdGgsIGludCB4aWQpCit7CisJc3RydWN0IHRpbWVzcGVjIHRlbXA7CisJaW50IHJjOworCisJLyogd2FudCBoYW5kbGVzIHdlIGNhbiB1c2UgdG8gcmVhZCB3aXRoIGZpcnN0CisJICAgaW4gdGhlIGxpc3Qgc28gd2UgZG8gbm90IGhhdmUgdG8gd2FsayB0aGUKKwkgICBsaXN0IHRvIHNlYXJjaCBmb3Igb25lIGluIHByZXBhcmVfd3JpdGUgKi8KKwlpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fV1JPTkxZKSB7CisJCWxpc3RfYWRkX3RhaWwoJnBDaWZzRmlsZS0+Zmxpc3QsIAorCQkJICAgICAgJnBDaWZzSW5vZGUtPm9wZW5GaWxlTGlzdCk7CisJfSBlbHNlIHsKKwkJbGlzdF9hZGQoJnBDaWZzRmlsZS0+Zmxpc3QsCisJCQkgJnBDaWZzSW5vZGUtPm9wZW5GaWxlTGlzdCk7CisJfQorCXdyaXRlX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJd3JpdGVfdW5sb2NrKCZmaWxlLT5mX293bmVyLmxvY2spOworCWlmIChwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQpIHsKKwkJLyogd2UgaGF2ZSB0aGUgaW5vZGUgb3BlbiBzb21ld2hlcmUgZWxzZQorCQkgICBubyBuZWVkIHRvIGRpc2NhcmQgY2FjaGUgZGF0YSAqLworCQlnb3RvIGNsaWVudF9jYW5fY2FjaGU7CisJfQorCisJLyogQkIgbmVlZCBzYW1lIGNoZWNrIGluIGNpZnNfY3JlYXRlIHRvbz8gKi8KKwkvKiBpZiBub3Qgb3Bsb2NrZWQsIGludmFsaWRhdGUgaW5vZGUgcGFnZXMgaWYgbXRpbWUgb3IgZmlsZQorCSAgIHNpemUgY2hhbmdlZCAqLworCXRlbXAgPSBjaWZzX05UdGltZVRvVW5peChsZTY0X3RvX2NwdShidWYtPkxhc3RXcml0ZVRpbWUpKTsKKwlpZiAodGltZXNwZWNfZXF1YWwoJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX210aW1lLCAmdGVtcCkgJiYgCisJCQkgICAoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2l6ZSA9PSAKKwkJCSAgICAobG9mZl90KWxlNjRfdG9fY3B1KGJ1Zi0+RW5kT2ZGaWxlKSkpIHsKKwkJY0ZZSSgxLCAoImlub2RlIHVuY2hhbmdlZCBvbiBzZXJ2ZXIiKSk7CisJfSBlbHNlIHsKKwkJaWYgKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcpIHsKKwkJLyogQkIgbm8gbmVlZCB0byBsb2NrIGlub2RlIHVudGlsIGFmdGVyIGludmFsaWRhdGUKKwkJICAgc2luY2UgbmFtZWkgY29kZSBzaG91bGQgYWxyZWFkeSBoYXZlIGl0IGxvY2tlZD8gKi8KKwkJCWZpbGVtYXBfZmRhdGF3cml0ZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nKTsKKwkJCWZpbGVtYXBfZmRhdGF3YWl0KGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcpOworCQl9CisJCWNGWUkoMSwgKCJpbnZhbGlkYXRpbmcgcmVtb3RlIGlub2RlIHNpbmNlIG9wZW4gZGV0ZWN0ZWQgaXQgIgorCQkJICJjaGFuZ2VkIikpOworCQlpbnZhbGlkYXRlX3JlbW90ZV9pbm9kZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJfQorCitjbGllbnRfY2FuX2NhY2hlOgorCWlmIChwVGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKKwkJcmMgPSBjaWZzX2dldF9pbm9kZV9pbmZvX3VuaXgoJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAorCQkJZnVsbF9wYXRoLCBpbm9kZS0+aV9zYiwgeGlkKTsKKwllbHNlCisJCXJjID0gY2lmc19nZXRfaW5vZGVfaW5mbygmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsCisJCQlmdWxsX3BhdGgsIGJ1ZiwgaW5vZGUtPmlfc2IsIHhpZCk7CisKKwlpZiAoKCpvcGxvY2sgJiAweEYpID09IE9QTE9DS19FWENMVVNJVkUpIHsKKwkJcENpZnNJbm9kZS0+Y2xpZW50Q2FuQ2FjaGVBbGwgPSBUUlVFOworCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQgPSBUUlVFOworCQljRllJKDEsICgiRXhjbHVzaXZlIE9wbG9jayBncmFudGVkIG9uIGlub2RlICVwIiwKKwkJCSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkpOworCX0gZWxzZSBpZiAoKCpvcGxvY2sgJiAweEYpID09IE9QTE9DS19SRUFEKQorCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQgPSBUUlVFOworCisJcmV0dXJuIHJjOworfQorCitpbnQgY2lmc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCByYyA9IC1FQUNDRVM7CisJaW50IHhpZCwgb3Bsb2NrOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqcENpZnNGaWxlOworCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpwQ2lmc0lub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwljaGFyICpmdWxsX3BhdGggPSBOVUxMOworCWludCBkZXNpcmVkQWNjZXNzOworCWludCBkaXNwb3NpdGlvbjsKKwlfX3UxNiBuZXRmaWQ7CisJRklMRV9BTExfSU5GTyAqYnVmID0gTlVMTDsKKworCXhpZCA9IEdldFhpZCgpOworCisJY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCWlmIChmaWxlLT5mX2ZsYWdzICYgT19DUkVBVCkgeworCQkvKiBzZWFyY2ggaW5vZGUgZm9yIHRoaXMgZmlsZSBhbmQgZmlsbCBpbiBmaWxlLT5wcml2YXRlX2RhdGEgKi8KKwkJcENpZnNJbm9kZSA9IENJRlNfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJCXJlYWRfbG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJCWxpc3RfZm9yX2VhY2godG1wLCAmcENpZnNJbm9kZS0+b3BlbkZpbGVMaXN0KSB7CisJCQlwQ2lmc0ZpbGUgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNpZnNGaWxlSW5mbywKKwkJCQkJICAgICAgIGZsaXN0KTsKKwkJCWlmICgocENpZnNGaWxlLT5wZmlsZSA9PSBOVUxMKSAmJgorCQkJICAgIChwQ2lmc0ZpbGUtPnBpZCA9PSBjdXJyZW50LT50Z2lkKSkgeworCQkJCS8qIG1vZGUgc2V0IGluIGNpZnNfY3JlYXRlICovCisKKwkJCQkvKiBuZWVkZWQgZm9yIHdyaXRlcGFnZSAqLworCQkJCXBDaWZzRmlsZS0+cGZpbGUgPSBmaWxlOworCQkJCQorCQkJCWZpbGUtPnByaXZhdGVfZGF0YSA9IHBDaWZzRmlsZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZWFkX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgIT0gTlVMTCkgeworCQkJcmMgPSAwOworCQkJRnJlZVhpZCh4aWQpOworCQkJcmV0dXJuIHJjOworCQl9IGVsc2UgeworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0VYQ0wpCisJCQkJY0VSUk9SKDEsICgiY291bGQgbm90IGZpbmQgZmlsZSBpbnN0YW5jZSBmb3IgIgorCQkJCQkgICAibmV3IGZpbGUgJXAgIiwgZmlsZSkpOworCQl9CisJfQorCisJZG93bigmaW5vZGUtPmlfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCWZ1bGxfcGF0aCA9IGJ1aWxkX3BhdGhfZnJvbV9kZW50cnkoZmlsZS0+Zl9kZW50cnkpOworCXVwKCZpbm9kZS0+aV9zYi0+c192ZnNfcmVuYW1lX3NlbSk7CisJaWYgKGZ1bGxfcGF0aCA9PSBOVUxMKSB7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY0ZZSSgxLCAoIiBpbm9kZSA9IDB4JXAgZmlsZSBmbGFncyBhcmUgMHgleCBmb3IgJXMiLAorCQkgaW5vZGUsIGZpbGUtPmZfZmxhZ3MsIGZ1bGxfcGF0aCkpOworCWRlc2lyZWRBY2Nlc3MgPSBjaWZzX2NvbnZlcnRfZmxhZ3MoZmlsZS0+Zl9mbGFncyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBvcGVuIGZsYWcgbWFwcGluZyB0YWJsZToKKyAqICAKKyAqCVBPU0lYIEZsYWcgICAgICAgICAgICBDSUZTIERpc3Bvc2l0aW9uCisgKgktLS0tLS0tLS0tICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLSAKKyAqCU9fQ1JFQVQgICAgICAgICAgICAgICBGSUxFX09QRU5fSUYKKyAqCU9fQ1JFQVQgfCBPX0VYQ0wgICAgICBGSUxFX0NSRUFURQorICoJT19DUkVBVCB8IE9fVFJVTkMgICAgIEZJTEVfT1ZFUldSSVRFX0lGCisgKglPX1RSVU5DICAgICAgICAgICAgICAgRklMRV9PVkVSV1JJVEUKKyAqCW5vbmUgb2YgdGhlIGFib3ZlICAgICBGSUxFX09QRU4KKyAqCisgKglOb3RlIHRoYXQgdGhlcmUgaXMgbm90IGEgZGlyZWN0IG1hdGNoIGJldHdlZW4gZGlzcG9zaXRpb24KKyAqCUZJTEVfU1VQRVJTRURFIChpZSBjcmVhdGUgd2hldGhlciBvciBub3QgZmlsZSBleGlzdHMgYWx0aG91Z2ggCisgKglPX0NSRUFUIHwgT19UUlVOQyBpcyBzaW1pbGFyIGJ1dCB0cnVuY2F0ZXMgdGhlIGV4aXN0aW5nCisgKglmaWxlIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbmV3IGZpbGUgYXMgRklMRV9TVVBFUlNFREUgZG9lcworICoJKHdoaWNoIHVzZXMgdGhlIGF0dHJpYnV0ZXMgLyBtZXRhZGF0YSBwYXNzZWQgaW4gb24gb3BlbiBjYWxsKQorICo/CisgKj8gIE9fU1lOQyBpcyBhIHJlYXNvbmFibGUgbWF0Y2ggdG8gQ0lGUyB3cml0ZXRocm91Z2ggZmxhZyAgCisgKj8gIGFuZCB0aGUgcmVhZCB3cml0ZSBmbGFncyBtYXRjaCByZWFzb25hYmx5LiAgT19MQVJHRUZJTEUKKyAqPyAgaXMgaXJyZWxldmFudCBiZWNhdXNlIGxhcmdlZmlsZSBzdXBwb3J0IGlzIGFsd2F5cyB1c2VkCisgKj8gIGJ5IHRoaXMgY2xpZW50LiBGbGFncyBPX0FQUEVORCwgT19ESVJFQ1QsIE9fRElSRUNUT1JZLAorICoJIE9fRkFTWU5DLCBPX05PRk9MTE9XLCBPX05PTkJMT0NLIG5lZWQgZnVydGhlciBpbnZlc3RpZ2F0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJZGlzcG9zaXRpb24gPSBjaWZzX2dldF9kaXNwb3NpdGlvbihmaWxlLT5mX2ZsYWdzKTsKKworCWlmIChvcGxvY2tFbmFibGVkKQorCQlvcGxvY2sgPSBSRVFfT1BMT0NLOworCWVsc2UKKwkJb3Bsb2NrID0gRkFMU0U7CisKKwkvKiBCQiBwYXNzIE9fU1lOQyBmbGFnIHRocm91Z2ggb24gZmlsZSBhdHRyaWJ1dGVzIC4uIEJCICovCisKKwkvKiBBbHNvIHJlZnJlc2ggaW5vZGUgYnkgcGFzc2luZyBpbiBmaWxlX2luZm8gYnVmIHJldHVybmVkIGJ5IFNNQk9wZW4KKwkgICBhbmQgY2FsbGluZyBnZXRfaW5vZGVfaW5mbyB3aXRoIHJldHVybmVkIGJ1ZiAoYXQgbGVhc3QgaGVscHMKKwkgICBub24tVW5peCBzZXJ2ZXIgY2FzZSkgKi8KKworCS8qIEJCIHdlIGNhbiBub3QgZG8gdGhpcyBpZiB0aGlzIGlzIHRoZSBzZWNvbmQgb3BlbiBvZiBhIGZpbGUgCisJICAgYW5kIHRoZSBmaXJzdCBoYW5kbGUgaGFzIHdyaXRlYmVoaW5kIGRhdGEsIHdlIG1pZ2h0IGJlIAorCSAgIGFibGUgdG8gc2ltcGx5IGRvIGEgZmlsZW1hcF9mZGF0YXdyaXRlL2ZpbGVtYXBfZmRhdGF3YWl0IGZpcnN0ICovCisJYnVmID0ga21hbGxvYyhzaXplb2YoRklMRV9BTExfSU5GTyksIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCBwVGNvbiwgZnVsbF9wYXRoLCBkaXNwb3NpdGlvbiwgZGVzaXJlZEFjY2VzcywKKwkJCSBDUkVBVEVfTk9UX0RJUiwgJm5ldGZpZCwgJm9wbG9jaywgYnVmLAorCQkJIGNpZnNfc2ItPmxvY2FsX25scyk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJjaWZzX29wZW4gcmV0dXJuZWQgMHgleCAiLCByYykpOworCQlnb3RvIG91dDsKKwl9CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0KKwkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGNpZnNGaWxlSW5mbyksIEdGUF9LRVJORUwpOworCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlwQ2lmc0ZpbGUgPSBjaWZzX2luaXRfcHJpdmF0ZShmaWxlLT5wcml2YXRlX2RhdGEsIGlub2RlLCBmaWxlLCBuZXRmaWQpOworCXdyaXRlX2xvY2soJmZpbGUtPmZfb3duZXIubG9jayk7CisJd3JpdGVfbG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJbGlzdF9hZGQoJnBDaWZzRmlsZS0+dGxpc3QsICZwVGNvbi0+b3BlbkZpbGVMaXN0KTsKKworCXBDaWZzSW5vZGUgPSBDSUZTX0koZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWlmIChwQ2lmc0lub2RlKSB7CisJCXJjID0gY2lmc19vcGVuX2lub2RlX2hlbHBlcihpbm9kZSwgZmlsZSwgcENpZnNJbm9kZSwKKwkJCQkJICAgIHBDaWZzRmlsZSwgcFRjb24sCisJCQkJCSAgICAmb3Bsb2NrLCBidWYsIGZ1bGxfcGF0aCwgeGlkKTsKKwl9IGVsc2UgeworCQl3cml0ZV91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCQl3cml0ZV91bmxvY2soJmZpbGUtPmZfb3duZXIubG9jayk7CisJfQorCisJaWYgKG9wbG9jayAmIENJRlNfQ1JFQVRFX0FDVElPTikgeyAgICAgICAgICAgCisJCS8qIHRpbWUgdG8gc2V0IG1vZGUgd2hpY2ggd2UgY2FuIG5vdCBzZXQgZWFybGllciBkdWUgdG8KKwkJICAgcHJvYmxlbXMgY3JlYXRpbmcgbmV3IHJlYWQtb25seSBmaWxlcyAqLworCQlpZiAoY2lmc19zYi0+dGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkgeworCQkJQ0lGU1NNQlVuaXhTZXRQZXJtcyh4aWQsIHBUY29uLCBmdWxsX3BhdGgsCisJCQkJCSAgICBpbm9kZS0+aV9tb2RlLAorCQkJCQkgICAgKF9fdTY0KS0xLCAoX191NjQpLTEsIDAgLyogZGV2ICovLAorCQkJCQkgICAgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEJCIGltcGxlbWVudCB2aWEgV2luZG93cyBzZWN1cml0eSBkZXNjcmlwdG9ycyBlZworCQkJICAgQ0lGU1NNQldpblNldFBlcm1zKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgbW9kZSwKKwkJCQkJICAgICAgLTEsIC0xLCBsb2NhbF9ubHMpOworCQkJICAgaW4gdGhlIG1lYW50aW1lIGNvdWxkIHNldCByL28gZG9zIGF0dHJpYnV0ZSB3aGVuCisJCQkgICBwZXJtcyBhcmUgZWc6IG1vZGUgJiAwMjIyID09IDAgKi8KKwkJfQorCX0KKworb3V0OgorCWtmcmVlKGJ1Zik7CisJa2ZyZWUoZnVsbF9wYXRoKTsKKwlGcmVlWGlkKHhpZCk7CisJcmV0dXJuIHJjOworfQorCisvKiBUcnkgdG8gcmVhcXVpcmUgYnl0ZSByYW5nZSBsb2NrcyB0aGF0IHdlcmUgcmVsZWFzZWQgd2hlbiBzZXNzaW9uICovCisvKiB0byBzZXJ2ZXIgd2FzIGxvc3QgKi8KK3N0YXRpYyBpbnQgY2lmc19yZWxvY2tfZmlsZShzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpjaWZzRmlsZSkKK3sKKwlpbnQgcmMgPSAwOworCisvKiBCQiBsaXN0IGFsbCBsb2NrcyBvcGVuIG9uIHRoaXMgZmlsZSBhbmQgcmVsb2NrICovCisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgY2lmc19yZW9wZW5fZmlsZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgCisJaW50IGNhbl9mbHVzaCkKK3sKKwlpbnQgcmMgPSAtRUFDQ0VTOworCWludCB4aWQsIG9wbG9jazsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uOworCXN0cnVjdCBjaWZzRmlsZUluZm8gKnBDaWZzRmlsZTsKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqcENpZnNJbm9kZTsKKwljaGFyICpmdWxsX3BhdGggPSBOVUxMOworCWludCBkZXNpcmVkQWNjZXNzOworCWludCBkaXNwb3NpdGlvbiA9IEZJTEVfT1BFTjsKKwlfX3UxNiBuZXRmaWQ7CisKKwlpZiAoaW5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FQkFERjsKKwlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhKSB7CisJCXBDaWZzRmlsZSA9IChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCX0gZWxzZQorCQlyZXR1cm4gLUVCQURGOworCisJeGlkID0gR2V0WGlkKCk7CisJZG93bigmcENpZnNGaWxlLT5maF9zZW0pOworCWlmIChwQ2lmc0ZpbGUtPmludmFsaWRIYW5kbGUgPT0gRkFMU0UpIHsKKwkJdXAoJnBDaWZzRmlsZS0+Zmhfc2VtKTsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZmlsZS0+Zl9kZW50cnkgPT0gTlVMTCkgeworCQl1cCgmcENpZnNGaWxlLT5maF9zZW0pOworCQljRllJKDEsICgiZmFpbGVkIGZpbGUgcmVvcGVuLCBubyB2YWxpZCBuYW1lIGlmIGRlbnRyeSBmcmVlZCIpKTsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVCQURGOworCX0KKwljaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworLyogY2FuIG5vdCBncmFiIHJlbmFtZSBzZW0gaGVyZSBiZWNhdXNlIHZhcmlvdXMgb3BzLCBpbmNsdWRpbmcKKyAgIHRob3NlIHRoYXQgYWxyZWFkeSBoYXZlIHRoZSByZW5hbWUgc2VtIGNhbiBlbmQgdXAgY2F1c2luZyB3cml0ZXBhZ2UKKyAgIHRvIGdldCBjYWxsZWQgYW5kIGlmIHRoZSBzZXJ2ZXIgd2FzIGRvd24gdGhhdCBtZWFucyB3ZSBlbmQgdXAgaGVyZSwKKyAgIGFuZCB3ZSBjYW4gbmV2ZXIgdGVsbCBpZiB0aGUgY2FsbGVyIGFscmVhZHkgaGFzIHRoZSByZW5hbWVfc2VtICovCisJZnVsbF9wYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShmaWxlLT5mX2RlbnRyeSk7CisJaWYgKGZ1bGxfcGF0aCA9PSBOVUxMKSB7CisJCXVwKCZwQ2lmc0ZpbGUtPmZoX3NlbSk7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY0ZZSSgxLCAoIiBpbm9kZSA9IDB4JXAgZmlsZSBmbGFncyBhcmUgMHgleCBmb3IgJXMiLAorCQkgaW5vZGUsIGZpbGUtPmZfZmxhZ3MsZnVsbF9wYXRoKSk7CisJZGVzaXJlZEFjY2VzcyA9IGNpZnNfY29udmVydF9mbGFncyhmaWxlLT5mX2ZsYWdzKTsKKworCWlmIChvcGxvY2tFbmFibGVkKQorCQlvcGxvY2sgPSBSRVFfT1BMT0NLOworCWVsc2UKKwkJb3Bsb2NrID0gRkFMU0U7CisKKwkvKiBDYW4gbm90IHJlZnJlc2ggaW5vZGUgYnkgcGFzc2luZyBpbiBmaWxlX2luZm8gYnVmIHRvIGJlIHJldHVybmVkCisJICAgYnkgU01CT3BlbiBhbmQgdGhlbiBjYWxsaW5nIGdldF9pbm9kZV9pbmZvIHdpdGggcmV0dXJuZWQgYnVmIAorCSAgIHNpbmNlIGZpbGUgbWlnaHQgaGF2ZSB3cml0ZSBiZWhpbmQgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIGZsdXNoZWQgCisJICAgYW5kIHNlcnZlciB2ZXJzaW9uIG9mIGZpbGUgc2l6ZSBjYW4gYmUgc3RhbGUuIElmIHdlIGtuZXcgZm9yIHN1cmUKKwkgICB0aGF0IGlub2RlIHdhcyBub3QgZGlydHkgbG9jYWxseSB3ZSBjb3VsZCBkbyB0aGlzICovCisKKy8qCWJ1ZiA9IGttYWxsb2Moc2l6ZW9mKEZJTEVfQUxMX0lORk8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmID09IDApIHsKKwkJdXAoJnBDaWZzRmlsZS0+Zmhfc2VtKTsKKwkJa2ZyZWUoZnVsbF9wYXRoKTsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9ICovCisJcmMgPSBDSUZTU01CT3Blbih4aWQsIHBUY29uLCBmdWxsX3BhdGgsIGRpc3Bvc2l0aW9uLCBkZXNpcmVkQWNjZXNzLAorCQkJIENSRUFURV9OT1RfRElSLCAmbmV0ZmlkLCAmb3Bsb2NrLCBOVUxMLAorCQkJIGNpZnNfc2ItPmxvY2FsX25scyk7CisJaWYgKHJjKSB7CisJCXVwKCZwQ2lmc0ZpbGUtPmZoX3NlbSk7CisJCWNGWUkoMSwgKCJjaWZzX29wZW4gcmV0dXJuZWQgMHgleCAiLCByYykpOworCQljRllJKDEsICgib3Bsb2NrOiAlZCAiLCBvcGxvY2spKTsKKwl9IGVsc2UgeworCQlwQ2lmc0ZpbGUtPm5ldGZpZCA9IG5ldGZpZDsKKwkJcENpZnNGaWxlLT5pbnZhbGlkSGFuZGxlID0gRkFMU0U7CisJCXVwKCZwQ2lmc0ZpbGUtPmZoX3NlbSk7CisJCXBDaWZzSW5vZGUgPSBDSUZTX0koaW5vZGUpOworCQlpZiAocENpZnNJbm9kZSkgeworCQkJaWYgKGNhbl9mbHVzaCkgeworCQkJCWZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0+aV9tYXBwaW5nKTsKKwkJCQlmaWxlbWFwX2ZkYXRhd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKKwkJCS8qIHRlbXBvcmFyaWx5IGRpc2FibGUgY2FjaGluZyB3aGlsZSB3ZQorCQkJICAgZ28gdG8gc2VydmVyIHRvIGdldCBpbm9kZSBpbmZvICovCisJCQkJcENpZnNJbm9kZS0+Y2xpZW50Q2FuQ2FjaGVBbGwgPSBGQUxTRTsKKwkJCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQgPSBGQUxTRTsKKwkJCQlpZiAocFRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSVgpCisJCQkJCXJjID0gY2lmc19nZXRfaW5vZGVfaW5mb191bml4KCZpbm9kZSwKKwkJCQkJCWZ1bGxfcGF0aCwgaW5vZGUtPmlfc2IsIHhpZCk7CisJCQkJZWxzZQorCQkJCQlyYyA9IGNpZnNfZ2V0X2lub2RlX2luZm8oJmlub2RlLAorCQkJCQkJZnVsbF9wYXRoLCBOVUxMLCBpbm9kZS0+aV9zYiwKKwkJCQkJCXhpZCk7CisJCQl9IC8qIGVsc2Ugd2UgYXJlIHdyaXRpbmcgb3V0IGRhdGEgdG8gc2VydmVyIGFscmVhZHkKKwkJCSAgICAgYW5kIGNvdWxkIGRlYWRsb2NrIGlmIHdlIHRyaWVkIHRvIGZsdXNoIGRhdGEsIGFuZAorCQkJICAgICBzaW5jZSB3ZSBkbyBub3Qga25vdyBpZiB3ZSBoYXZlIGRhdGEgdGhhdCB3b3VsZAorCQkJICAgICBpbnZhbGlkYXRlIHRoZSBjdXJyZW50IGVuZCBvZiBmaWxlIG9uIHRoZSBzZXJ2ZXIKKwkJCSAgICAgd2UgY2FuIG5vdCBnbyB0byB0aGUgc2VydmVyIHRvIGdldCB0aGUgbmV3IGlub2QKKwkJCSAgICAgaW5mbyAqLworCQkJaWYgKChvcGxvY2sgJiAweEYpID09IE9QTE9DS19FWENMVVNJVkUpIHsKKwkJCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZUFsbCA9IFRSVUU7CisJCQkJcENpZnNJbm9kZS0+Y2xpZW50Q2FuQ2FjaGVSZWFkID0gVFJVRTsKKwkJCQljRllJKDEsICgiRXhjbHVzaXZlIE9wbG9jayBncmFudGVkIG9uIGlub2RlICVwIiwKKwkJCQkJIGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSk7CisJCQl9IGVsc2UgaWYgKChvcGxvY2sgJiAweEYpID09IE9QTE9DS19SRUFEKSB7CisJCQkJcENpZnNJbm9kZS0+Y2xpZW50Q2FuQ2FjaGVSZWFkID0gVFJVRTsKKwkJCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZUFsbCA9IEZBTFNFOworCQkJfSBlbHNlIHsKKwkJCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQgPSBGQUxTRTsKKwkJCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZUFsbCA9IEZBTFNFOworCQkJfQorCQkJY2lmc19yZWxvY2tfZmlsZShwQ2lmc0ZpbGUpOworCQl9CisJfQorCisJa2ZyZWUoZnVsbF9wYXRoKTsKKwlGcmVlWGlkKHhpZCk7CisJcmV0dXJuIHJjOworfQorCitpbnQgY2lmc19jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmMgPSAwOworCWludCB4aWQ7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpwU01CRmlsZSA9CisJCShzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJeGlkID0gR2V0WGlkKCk7CisKKwljaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworCWlmIChwU01CRmlsZSkgeworCQlwU01CRmlsZS0+Y2xvc2VQZW5kID0gVFJVRTsKKwkJd3JpdGVfbG9jaygmZmlsZS0+Zl9vd25lci5sb2NrKTsKKwkJaWYgKHBUY29uKSB7CisJCQkvKiBubyBzZW5zZSByZWNvbm5lY3RpbmcgdG8gY2xvc2UgYSBmaWxlIHRoYXQgaXMKKwkJCSAgIGFscmVhZHkgY2xvc2VkICovCisJCQlpZiAocFRjb24tPnRpZFN0YXR1cyAhPSBDaWZzTmVlZFJlY29ubmVjdCkgeworCQkJCXdyaXRlX3VubG9jaygmZmlsZS0+Zl9vd25lci5sb2NrKTsKKwkJCQlyYyA9IENJRlNTTUJDbG9zZSh4aWQsIHBUY29uLAorCQkJCQkJICBwU01CRmlsZS0+bmV0ZmlkKTsKKwkJCQl3cml0ZV9sb2NrKCZmaWxlLT5mX293bmVyLmxvY2spOworCQkJfQorCQl9CisJCWxpc3RfZGVsKCZwU01CRmlsZS0+Zmxpc3QpOworCQlsaXN0X2RlbCgmcFNNQkZpbGUtPnRsaXN0KTsKKwkJd3JpdGVfdW5sb2NrKCZmaWxlLT5mX293bmVyLmxvY2spOworCQlrZnJlZShwU01CRmlsZS0+c2VhcmNoX3Jlc3VtZV9uYW1lKTsKKwkJa2ZyZWUoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwl9IGVsc2UKKwkJcmMgPSAtRUJBREY7CisKKwlpZiAobGlzdF9lbXB0eSgmKENJRlNfSShpbm9kZSktPm9wZW5GaWxlTGlzdCkpKSB7CisJCWNGWUkoMSwgKCJjbG9zaW5nIGxhc3Qgb3BlbiBpbnN0YW5jZSBmb3IgaW5vZGUgJXAiLCBpbm9kZSkpOworCQkvKiBpZiB0aGUgZmlsZSBpcyBub3Qgb3BlbiB3ZSBkbyBub3Qga25vdyBpZiB3ZSBjYW4gY2FjaGUgaW5mbworCQkgICBvbiB0aGlzIGlub2RlLCBtdWNoIGxlc3Mgd3JpdGUgYmVoaW5kIGFuZCByZWFkIGFoZWFkICovCisJCUNJRlNfSShpbm9kZSktPmNsaWVudENhbkNhY2hlUmVhZCA9IEZBTFNFOworCQlDSUZTX0koaW5vZGUpLT5jbGllbnRDYW5DYWNoZUFsbCAgPSBGQUxTRTsKKwl9CisJaWYgKChyYyA9PTApICYmIENJRlNfSShpbm9kZSktPndyaXRlX2JlaGluZF9yYykKKwkJcmMgPSBDSUZTX0koaW5vZGUpLT53cml0ZV9iZWhpbmRfcmM7CisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworaW50IGNpZnNfY2xvc2VkaXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJjID0gMDsKKwlpbnQgeGlkOworCXN0cnVjdCBjaWZzRmlsZUluZm8gKnBDRmlsZVN0cnVjdCA9CisJICAgIChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgKnB0bXA7CisKKwljRllJKDEsICgiQ2xvc2VkaXIgaW5vZGUgPSAweCVwIHdpdGggIiwgaW5vZGUpKTsKKworCXhpZCA9IEdldFhpZCgpOworCisJaWYgKHBDRmlsZVN0cnVjdCkgeworCQlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwkJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCisJCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCQljRllJKDEsICgiRnJlZWluZyBwcml2YXRlIGRhdGEgaW4gY2xvc2UgZGlyIikpOworCQlpZiAocENGaWxlU3RydWN0LT5zcmNoX2luZi5lbmRPZlNlYXJjaCA9PSBGQUxTRSkgeworCQkJcENGaWxlU3RydWN0LT5pbnZhbGlkSGFuZGxlID0gVFJVRTsKKwkJCXJjID0gQ0lGU0ZpbmRDbG9zZSh4aWQsIHBUY29uLCBwQ0ZpbGVTdHJ1Y3QtPm5ldGZpZCk7CisJCQljRllJKDEsICgiQ2xvc2luZyB1bmNvbXBsZXRlZCByZWFkZGlyIHdpdGggcmMgJWQiLAorCQkJCSByYykpOworCQkJLyogbm90IG11Y2ggd2UgY2FuIGRvIGlmIGl0IGZhaWxzIGFueXdheSwgaWdub3JlIHJjICovCisJCQlyYyA9IDA7CisJCX0KKwkJcHRtcCA9IHBDRmlsZVN0cnVjdC0+c3JjaF9pbmYubnR3cmtfYnVmX3N0YXJ0OworCQlpZiAocHRtcCkgeworICAgLyogQkIgcmVtb3ZlbWUgQkIgKi8JY0ZZSSgxLCAoImZyZWVpbmcgc21iIGJ1ZiBpbiBzcmNoIHN0cnVjdCBpbiBjbG9zZWRpciIpKTsKKwkJCXBDRmlsZVN0cnVjdC0+c3JjaF9pbmYubnR3cmtfYnVmX3N0YXJ0ID0gTlVMTDsKKwkJCWNpZnNfYnVmX3JlbGVhc2UocHRtcCk7CisJCX0KKwkJcHRtcCA9IHBDRmlsZVN0cnVjdC0+c2VhcmNoX3Jlc3VtZV9uYW1lOworCQlpZiAocHRtcCkgeworICAgLyogQkIgcmVtb3ZlbWUgQkIgKi8JY0ZZSSgxLCAoImZyZWVpbmcgcmVzdW1lIG5hbWUgaW4gY2xvc2VkaXIiKSk7CisJCQlwQ0ZpbGVTdHJ1Y3QtPnNlYXJjaF9yZXN1bWVfbmFtZSA9IE5VTEw7CisJCQlrZnJlZShwdG1wKTsKKwkJfQorCQlrZnJlZShmaWxlLT5wcml2YXRlX2RhdGEpOworCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCX0KKwkvKiBCQiBjYW4gd2UgbG9jayB0aGUgZmlsZXN0cnVjdCB3aGlsZSB0aGlzIGlzIGdvaW5nIG9uPyAqLworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBjaWZzX2xvY2soc3RydWN0IGZpbGUgKmZpbGUsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKnBmTG9jaykKK3sKKwlpbnQgcmMsIHhpZDsKKwlfX3UzMiBsb2NrVHlwZSA9IExPQ0tJTkdfQU5EWF9MQVJHRV9GSUxFUzsKKwlfX3UzMiBudW1Mb2NrID0gMDsKKwlfX3UzMiBudW1VbmxvY2sgPSAwOworCV9fdTY0IGxlbmd0aDsKKwlpbnQgd2FpdF9mbGFnID0gRkFMU0U7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKworCWxlbmd0aCA9IDEgKyBwZkxvY2stPmZsX2VuZCAtIHBmTG9jay0+Zmxfc3RhcnQ7CisJcmMgPSAtRUFDQ0VTOworCXhpZCA9IEdldFhpZCgpOworCisJY0ZZSSgxLCAoIkxvY2sgcGFybTogMHgleCBmbG9ja2ZsYWdzOiAiCisJCSAiMHgleCBmbG9ja3R5cGU6IDB4JXggc3RhcnQ6ICVsbGQgZW5kOiAlbGxkIiwKKwkgICAgICAgIGNtZCwgcGZMb2NrLT5mbF9mbGFncywgcGZMb2NrLT5mbF90eXBlLCBwZkxvY2stPmZsX3N0YXJ0LAorCSAgICAgICAgcGZMb2NrLT5mbF9lbmQpKTsKKworCWlmIChwZkxvY2stPmZsX2ZsYWdzICYgRkxfUE9TSVgpCisJCWNGWUkoMSwgKCJQb3NpeCAiKSk7CisJaWYgKHBmTG9jay0+ZmxfZmxhZ3MgJiBGTF9GTE9DSykKKwkJY0ZZSSgxLCAoIkZsb2NrICIpKTsKKwlpZiAocGZMb2NrLT5mbF9mbGFncyAmIEZMX1NMRUVQKSB7CisJCWNGWUkoMSwgKCJCbG9ja2luZyBsb2NrICIpKTsKKwkJd2FpdF9mbGFnID0gVFJVRTsKKwl9CisJaWYgKHBmTG9jay0+ZmxfZmxhZ3MgJiBGTF9BQ0NFU1MpCisJCWNGWUkoMSwgKCJQcm9jZXNzIHN1c3BlbmRlZCBieSBtYW5kYXRvcnkgbG9ja2luZyAtICIKKwkJCSAibm90IGltcGxlbWVudGVkIHlldCAiKSk7CisJaWYgKHBmTG9jay0+ZmxfZmxhZ3MgJiBGTF9MRUFTRSkKKwkJY0ZZSSgxLCAoIkxlYXNlIG9uIGZpbGUgLSBub3QgaW1wbGVtZW50ZWQgeWV0IikpOworCWlmIChwZkxvY2stPmZsX2ZsYWdzICYgCisJICAgICh+KEZMX1BPU0lYIHwgRkxfRkxPQ0sgfCBGTF9TTEVFUCB8IEZMX0FDQ0VTUyB8IEZMX0xFQVNFKSkpCisJCWNGWUkoMSwgKCJVbmtub3duIGxvY2sgZmxhZ3MgMHgleCIsIHBmTG9jay0+ZmxfZmxhZ3MpKTsKKworCWlmIChwZkxvY2stPmZsX3R5cGUgPT0gRl9XUkxDSykgeworCQljRllJKDEsICgiRl9XUkxDSyAiKSk7CisJCW51bUxvY2sgPSAxOworCX0gZWxzZSBpZiAocGZMb2NrLT5mbF90eXBlID09IEZfVU5MQ0spIHsKKwkJY0ZZSSgxLCAoIkZfVU5MQ0sgIikpOworCQludW1VbmxvY2sgPSAxOworCX0gZWxzZSBpZiAocGZMb2NrLT5mbF90eXBlID09IEZfUkRMQ0spIHsKKwkJY0ZZSSgxLCAoIkZfUkRMQ0sgIikpOworCQlsb2NrVHlwZSB8PSBMT0NLSU5HX0FORFhfU0hBUkVEX0xPQ0s7CisJCW51bUxvY2sgPSAxOworCX0gZWxzZSBpZiAocGZMb2NrLT5mbF90eXBlID09IEZfRVhMQ0spIHsKKwkJY0ZZSSgxLCAoIkZfRVhMQ0sgIikpOworCQludW1Mb2NrID0gMTsKKwl9IGVsc2UgaWYgKHBmTG9jay0+ZmxfdHlwZSA9PSBGX1NITENLKSB7CisJCWNGWUkoMSwgKCJGX1NITENLICIpKTsKKwkJbG9ja1R5cGUgfD0gTE9DS0lOR19BTkRYX1NIQVJFRF9MT0NLOworCQludW1Mb2NrID0gMTsKKwl9IGVsc2UKKwkJY0ZZSSgxLCAoIlVua25vd24gdHlwZSBvZiBsb2NrICIpKTsKKworCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfZGVudHJ5LT5kX3NiKTsKKwlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisKKwlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhID09IE5VTEwpIHsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVCQURGOworCX0KKworCWlmIChJU19HRVRMSyhjbWQpKSB7CisJCXJjID0gQ0lGU1NNQkxvY2soeGlkLCBwVGNvbiwKKwkJCQkgKChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZS0+CisJCQkJICBwcml2YXRlX2RhdGEpLT5uZXRmaWQsCisJCQkJIGxlbmd0aCwKKwkJCQkgcGZMb2NrLT5mbF9zdGFydCwgMCwgMSwgbG9ja1R5cGUsCisJCQkJIDAgLyogd2FpdCBmbGFnICovICk7CisJCWlmIChyYyA9PSAwKSB7CisJCQlyYyA9IENJRlNTTUJMb2NrKHhpZCwgcFRjb24sCisJCQkJCSAoKHN0cnVjdCBjaWZzRmlsZUluZm8gKikgZmlsZS0+CisJCQkJCSAgcHJpdmF0ZV9kYXRhKS0+bmV0ZmlkLAorCQkJCQkgbGVuZ3RoLAorCQkJCQkgcGZMb2NrLT5mbF9zdGFydCwgMSAvKiBudW1VbmxvY2sgKi8gLAorCQkJCQkgMCAvKiBudW1Mb2NrICovICwgbG9ja1R5cGUsCisJCQkJCSAwIC8qIHdhaXQgZmxhZyAqLyApOworCQkJcGZMb2NrLT5mbF90eXBlID0gRl9VTkxDSzsKKwkJCWlmIChyYyAhPSAwKQorCQkJCWNFUlJPUigxLCAoIkVycm9yIHVubG9ja2luZyBwcmV2aW91c2x5IGxvY2tlZCAiCisJCQkJCSAgICJyYW5nZSAlZCBkdXJpbmcgdGVzdCBvZiBsb2NrICIsCisJCQkJCSAgIHJjKSk7CisJCQlyYyA9IDA7CisKKwkJfSBlbHNlIHsKKwkJCS8qIGlmIHJjID09IEVSUl9TSEFSSU5HX1ZJT0xBVElPTiA/ICovCisJCQlyYyA9IDA7CS8qIGRvIG5vdCBjaGFuZ2UgbG9jayB0eXBlIHRvIHVubG9jaworCQkJCSAgIHNpbmNlIHJhbmdlIGluIHVzZSAqLworCQl9CisKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBDSUZTU01CTG9jayh4aWQsIHBUY29uLAorCQkJICgoc3RydWN0IGNpZnNGaWxlSW5mbyAqKSBmaWxlLT5wcml2YXRlX2RhdGEpLT4KKwkJCSBuZXRmaWQsIGxlbmd0aCwKKwkJCSBwZkxvY2stPmZsX3N0YXJ0LCBudW1VbmxvY2ssIG51bUxvY2ssIGxvY2tUeXBlLAorCQkJIHdhaXRfZmxhZyk7CisJaWYgKHJjID09IDAgJiYgKHBmTG9jay0+ZmxfZmxhZ3MgJiBGTF9QT1NJWCkpCisJCXBvc2l4X2xvY2tfZmlsZV93YWl0KGZpbGUsIHBmTG9jayk7CisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworc3NpemVfdCBjaWZzX3VzZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp3cml0ZV9kYXRhLAorCXNpemVfdCB3cml0ZV9zaXplLCBsb2ZmX3QgKnBvZmZzZXQpCit7CisJaW50IHJjID0gMDsKKwl1bnNpZ25lZCBpbnQgYnl0ZXNfd3JpdHRlbiA9IDA7CisJdW5zaWduZWQgaW50IHRvdGFsX3dyaXR0ZW47CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwlpbnQgeGlkLCBsb25nX29wOworCXN0cnVjdCBjaWZzRmlsZUluZm8gKm9wZW5fZmlsZTsKKworCWlmIChmaWxlLT5mX2RlbnRyeSA9PSBOVUxMKQorCQlyZXR1cm4gLUVCQURGOworCisJY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCWlmIChjaWZzX3NiID09IE5VTEwpCisJCXJldHVybiAtRUJBREY7CisKKwlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisKKwkvKiBjRllJKDEsCisJICAgKCIgd3JpdGUgJWQgYnl0ZXMgdG8gb2Zmc2V0ICVsbGQgb2YgJXMiLCB3cml0ZV9zaXplLAorCSAgICpwb2Zmc2V0LCBmaWxlLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUpKTsgKi8KKworCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FQkFERjsKKwllbHNlCisJCW9wZW5fZmlsZSA9IChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwkKKwl4aWQgPSBHZXRYaWQoKTsKKwlpZiAoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUgPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRUJBREY7CisJfQorCisJaWYgKCpwb2Zmc2V0ID4gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2l6ZSkKKwkJbG9uZ19vcCA9IDI7IC8qIHdyaXRlcyBwYXN0IGVuZCBvZiBmaWxlIGNhbiB0YWtlIGEgbG9uZyB0aW1lICovCisJZWxzZQorCQlsb25nX29wID0gMTsKKworCWZvciAodG90YWxfd3JpdHRlbiA9IDA7IHdyaXRlX3NpemUgPiB0b3RhbF93cml0dGVuOworCSAgICAgdG90YWxfd3JpdHRlbiArPSBieXRlc193cml0dGVuKSB7CisJCXJjID0gLUVBR0FJTjsKKwkJd2hpbGUgKHJjID09IC1FQUdBSU4pIHsKKwkJCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkgeworCQkJCS8qIGZpbGUgaGFzIGJlZW4gY2xvc2VkIG9uIHVzICovCisJCQkJRnJlZVhpZCh4aWQpOworCQkJLyogaWYgd2UgaGF2ZSBnb3R0ZW4gaGVyZSB3ZSBoYXZlIHdyaXR0ZW4gc29tZSBkYXRhCisJCQkgICBhbmQgYmxvY2tlZCwgYW5kIHRoZSBmaWxlIGhhcyBiZWVuIGZyZWVkIG9uIHVzIHdoaWxlCisJCQkgICB3ZSBibG9ja2VkIHNvIHJldHVybiB3aGF0IHdlIG1hbmFnZWQgdG8gd3JpdGUgKi8KKwkJCQlyZXR1cm4gdG90YWxfd3JpdHRlbjsKKwkJCX0gCisJCQlpZiAob3Blbl9maWxlLT5jbG9zZVBlbmQpIHsKKwkJCQlGcmVlWGlkKHhpZCk7CisJCQkJaWYgKHRvdGFsX3dyaXR0ZW4pCisJCQkJCXJldHVybiB0b3RhbF93cml0dGVuOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIC1FQkFERjsKKwkJCX0KKwkJCWlmIChvcGVuX2ZpbGUtPmludmFsaWRIYW5kbGUpIHsKKwkJCQlpZiAoKGZpbGUtPmZfZGVudHJ5ID09IE5VTEwpIHx8CisJCQkJICAgIChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSA9PSBOVUxMKSkgeworCQkJCQlGcmVlWGlkKHhpZCk7CisJCQkJCXJldHVybiB0b3RhbF93cml0dGVuOworCQkJCX0KKwkJCQkvKiB3ZSBjb3VsZCBkZWFkbG9jayBpZiB3ZSBjYWxsZWQKKwkJCQkgICBmaWxlbWFwX2ZkYXRhd2FpdCBmcm9tIGhlcmUgc28gdGVsbAorCQkJCSAgIHJlb3Blbl9maWxlIG5vdCB0byBmbHVzaCBkYXRhIHRvIHNlcnZlcgorCQkJCSAgIG5vdyAqLworCQkJCXJjID0gY2lmc19yZW9wZW5fZmlsZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwKKwkJCQkJZmlsZSwgRkFMU0UpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJcmMgPSBDSUZTU01CV3JpdGUoeGlkLCBwVGNvbiwKKwkJCQlvcGVuX2ZpbGUtPm5ldGZpZCwKKwkJCQltaW5fdChjb25zdCBpbnQsIGNpZnNfc2ItPndzaXplLAorCQkJCSAgICAgIHdyaXRlX3NpemUgLSB0b3RhbF93cml0dGVuKSwKKwkJCQkqcG9mZnNldCwgJmJ5dGVzX3dyaXR0ZW4sCisJCQkJTlVMTCwgd3JpdGVfZGF0YSArIHRvdGFsX3dyaXR0ZW4sIGxvbmdfb3ApOworCQl9CisJCWlmIChyYyB8fCAoYnl0ZXNfd3JpdHRlbiA9PSAwKSkgeworCQkJaWYgKHRvdGFsX3dyaXR0ZW4pCisJCQkJYnJlYWs7CisJCQllbHNlIHsKKwkJCQlGcmVlWGlkKHhpZCk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9IGVsc2UKKwkJCSpwb2Zmc2V0ICs9IGJ5dGVzX3dyaXR0ZW47CisJCWxvbmdfb3AgPSBGQUxTRTsgLyogc3Vic2VxdWVudCB3cml0ZXMgZmFzdCAtCisJCQkJICAgIDE1IHNlY29uZHMgaXMgcGxlbnR5ICovCisJfQorCisjaWZkZWYgQ09ORklHX0NJRlNfU1RBVFMKKwlpZiAodG90YWxfd3JpdHRlbiA+IDApIHsKKwkJYXRvbWljX2luYygmcFRjb24tPm51bV93cml0ZXMpOworCQlzcGluX2xvY2soJnBUY29uLT5zdGF0X2xvY2spOworCQlwVGNvbi0+Ynl0ZXNfd3JpdHRlbiArPSB0b3RhbF93cml0dGVuOworCQlzcGluX3VubG9jaygmcFRjb24tPnN0YXRfbG9jayk7CisJfQorI2VuZGlmCQkKKworCS8qIHNpbmNlIHRoZSB3cml0ZSBtYXkgaGF2ZSBibG9ja2VkIGNoZWNrIHRoZXNlIHBvaW50ZXJzIGFnYWluICovCisJaWYgKGZpbGUtPmZfZGVudHJ5KSB7CisJCWlmIChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkgeworCQkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCQkJaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9CisJCQkJY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKwkJCWlmICh0b3RhbF93cml0dGVuID4gMCkgeworCQkJCWlmICgqcG9mZnNldCA+IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NpemUpCisJCQkJCWlfc2l6ZV93cml0ZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwKKwkJCQkJKnBvZmZzZXQpOworCQkJfQorCQkJbWFya19pbm9kZV9kaXJ0eV9zeW5jKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwkJfQorCX0KKwlGcmVlWGlkKHhpZCk7CisJcmV0dXJuIHRvdGFsX3dyaXR0ZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNpZnNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKndyaXRlX2RhdGEsCisJc2l6ZV90IHdyaXRlX3NpemUsIGxvZmZfdCAqcG9mZnNldCkKK3sKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGludCBieXRlc193cml0dGVuID0gMDsKKwl1bnNpZ25lZCBpbnQgdG90YWxfd3JpdHRlbjsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uOworCWludCB4aWQsIGxvbmdfb3A7CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqb3Blbl9maWxlOworCisJaWYgKGZpbGUtPmZfZGVudHJ5ID09IE5VTEwpCisJCXJldHVybiAtRUJBREY7CisKKwljaWZzX3NiID0gQ0lGU19TQihmaWxlLT5mX2RlbnRyeS0+ZF9zYik7CisJaWYgKGNpZnNfc2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FQkFERjsKKworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCS8qIGNGWUkoMSwKKwkgICAoIiB3cml0ZSAlZCBieXRlcyB0byBvZmZzZXQgJWxsZCBvZiAlcyIsIHdyaXRlX3NpemUsCisJICAgKnBvZmZzZXQsIGZpbGUtPmZfZGVudHJ5LT5kX25hbWUubmFtZSkpOyAqLworCisJaWYgKGZpbGUtPnByaXZhdGVfZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVCQURGOworCWVsc2UKKwkJb3Blbl9maWxlID0gKHN0cnVjdCBjaWZzRmlsZUluZm8gKilmaWxlLT5wcml2YXRlX2RhdGE7CisJCisJeGlkID0gR2V0WGlkKCk7CisJaWYgKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlID09IE5VTEwpIHsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVCQURGOworCX0KKworCWlmICgqcG9mZnNldCA+IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NpemUpCisJCWxvbmdfb3AgPSAyOyAvKiB3cml0ZXMgcGFzdCBlbmQgb2YgZmlsZSBjYW4gdGFrZSBhIGxvbmcgdGltZSAqLworCWVsc2UKKwkJbG9uZ19vcCA9IDE7CisKKwlmb3IgKHRvdGFsX3dyaXR0ZW4gPSAwOyB3cml0ZV9zaXplID4gdG90YWxfd3JpdHRlbjsKKwkgICAgIHRvdGFsX3dyaXR0ZW4gKz0gYnl0ZXNfd3JpdHRlbikgeworCQlyYyA9IC1FQUdBSU47CisJCXdoaWxlIChyYyA9PSAtRUFHQUlOKSB7CisJCQlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhID09IE5VTEwpIHsKKwkJCQkvKiBmaWxlIGhhcyBiZWVuIGNsb3NlZCBvbiB1cyAqLworCQkJCUZyZWVYaWQoeGlkKTsKKwkJCS8qIGlmIHdlIGhhdmUgZ290dGVuIGhlcmUgd2UgaGF2ZSB3cml0dGVuIHNvbWUgZGF0YQorCQkJICAgYW5kIGJsb2NrZWQsIGFuZCB0aGUgZmlsZSBoYXMgYmVlbiBmcmVlZCBvbiB1cworCQkJICAgd2hpbGUgd2UgYmxvY2tlZCBzbyByZXR1cm4gd2hhdCB3ZSBtYW5hZ2VkIHRvIAorCQkJICAgd3JpdGUgKi8KKwkJCQlyZXR1cm4gdG90YWxfd3JpdHRlbjsKKwkJCX0gCisJCQlpZiAob3Blbl9maWxlLT5jbG9zZVBlbmQpIHsKKwkJCQlGcmVlWGlkKHhpZCk7CisJCQkJaWYgKHRvdGFsX3dyaXR0ZW4pCisJCQkJCXJldHVybiB0b3RhbF93cml0dGVuOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIC1FQkFERjsKKwkJCX0KKwkJCWlmIChvcGVuX2ZpbGUtPmludmFsaWRIYW5kbGUpIHsKKwkJCQlpZiAoKGZpbGUtPmZfZGVudHJ5ID09IE5VTEwpIHx8CisJCQkJICAgKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlID09IE5VTEwpKSB7CisJCQkJCUZyZWVYaWQoeGlkKTsKKwkJCQkJcmV0dXJuIHRvdGFsX3dyaXR0ZW47CisJCQkJfQorCQkJCS8qIHdlIGNvdWxkIGRlYWRsb2NrIGlmIHdlIGNhbGxlZAorCQkJCSAgIGZpbGVtYXBfZmRhdGF3YWl0IGZyb20gaGVyZSBzbyB0ZWxsCisJCQkJICAgcmVvcGVuX2ZpbGUgbm90IHRvIGZsdXNoIGRhdGEgdG8gCisJCQkJICAgc2VydmVyIG5vdyAqLworCQkJCXJjID0gY2lmc19yZW9wZW5fZmlsZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwKKwkJCQkJZmlsZSwgRkFMU0UpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJcmMgPSBDSUZTU01CV3JpdGUoeGlkLCBwVGNvbiwKKwkJCQkgb3Blbl9maWxlLT5uZXRmaWQsCisJCQkJIG1pbl90KGNvbnN0IGludCwgY2lmc19zYi0+d3NpemUsIAorCQkJCSAgICAgICB3cml0ZV9zaXplIC0gdG90YWxfd3JpdHRlbiksCisJCQkJICpwb2Zmc2V0LCAmYnl0ZXNfd3JpdHRlbiwKKwkJCQkgd3JpdGVfZGF0YSArIHRvdGFsX3dyaXR0ZW4sIE5VTEwsIGxvbmdfb3ApOworCQl9CisJCWlmIChyYyB8fCAoYnl0ZXNfd3JpdHRlbiA9PSAwKSkgeworCQkJaWYgKHRvdGFsX3dyaXR0ZW4pCisJCQkJYnJlYWs7CisJCQllbHNlIHsKKwkJCQlGcmVlWGlkKHhpZCk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9IGVsc2UKKwkJCSpwb2Zmc2V0ICs9IGJ5dGVzX3dyaXR0ZW47CisJCWxvbmdfb3AgPSBGQUxTRTsgLyogc3Vic2VxdWVudCB3cml0ZXMgZmFzdCAtIAorCQkJCSAgICAxNSBzZWNvbmRzIGlzIHBsZW50eSAqLworCX0KKworI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTCisJaWYgKHRvdGFsX3dyaXR0ZW4gPiAwKSB7CisJCWF0b21pY19pbmMoJnBUY29uLT5udW1fd3JpdGVzKTsKKwkJc3Bpbl9sb2NrKCZwVGNvbi0+c3RhdF9sb2NrKTsKKwkJcFRjb24tPmJ5dGVzX3dyaXR0ZW4gKz0gdG90YWxfd3JpdHRlbjsKKwkJc3Bpbl91bmxvY2soJnBUY29uLT5zdGF0X2xvY2spOworCX0KKyNlbmRpZgkJCisKKwkvKiBzaW5jZSB0aGUgd3JpdGUgbWF5IGhhdmUgYmxvY2tlZCBjaGVjayB0aGVzZSBwb2ludGVycyBhZ2FpbiAqLworCWlmIChmaWxlLT5mX2RlbnRyeSkgeworCQlpZiAoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpIHsKKwkJCWZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2N0aW1lID0gCisJCQlmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKKwkJCWlmICh0b3RhbF93cml0dGVuID4gMCkgeworCQkJCWlmICgqcG9mZnNldCA+IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NpemUpCisJCQkJCWlfc2l6ZV93cml0ZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgCisJCQkJCQkgICAgICpwb2Zmc2V0KTsKKwkJCX0KKwkJCW1hcmtfaW5vZGVfZGlydHlfc3luYyhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJCX0KKwl9CisJRnJlZVhpZCh4aWQpOworCXJldHVybiB0b3RhbF93cml0dGVuOworfQorCitzdGF0aWMgaW50IGNpZnNfcGFydGlhbHBhZ2V3cml0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOworCWxvZmZfdCBvZmZzZXQgPSAobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJY2hhciAqd3JpdGVfZGF0YTsKKwlpbnQgcmMgPSAtRUZBVUxUOworCWludCBieXRlc193cml0dGVuID0gMDsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNJbm9kZTsKKwlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpvcGVuX2ZpbGUgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAxOworCisJaWYgKCFtYXBwaW5nIHx8ICFtYXBwaW5nLT5ob3N0KQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwljaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworCisJb2Zmc2V0ICs9IChsb2ZmX3QpZnJvbTsKKwl3cml0ZV9kYXRhID0ga21hcChwYWdlKTsKKwl3cml0ZV9kYXRhICs9IGZyb207CisKKwlpZiAoKHRvID4gUEFHRV9DQUNIRV9TSVpFKSB8fCAoZnJvbSA+IHRvKSkgeworCQlrdW5tYXAocGFnZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHJhY2luZyB3aXRoIHRydW5jYXRlPyAqLworCWlmIChvZmZzZXQgPiBtYXBwaW5nLT5ob3N0LT5pX3NpemUpIHsKKwkJa3VubWFwKHBhZ2UpOworCQlyZXR1cm4gMDsgLyogZG9uJ3QgY2FyZSAqLworCX0KKworCS8qIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBub3QgZXh0ZW5kaW5nIHRoZSBmaWxlICovCisJaWYgKG1hcHBpbmctPmhvc3QtPmlfc2l6ZSAtIG9mZnNldCA8IChsb2ZmX3QpdG8pCisJCXRvID0gKHVuc2lnbmVkKShtYXBwaW5nLT5ob3N0LT5pX3NpemUgLSBvZmZzZXQpOyAKKworCWNpZnNJbm9kZSA9IENJRlNfSShtYXBwaW5nLT5ob3N0KTsKKwlyZWFkX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOyAKKwkvKiBCQiB3ZSBzaG91bGQgc3RhcnQgYXQgdGhlIGVuZCAqLworCWxpc3RfZm9yX2VhY2hfc2FmZSh0bXAsIHRtcDEsICZjaWZzSW5vZGUtPm9wZW5GaWxlTGlzdCkgeyAgICAgICAgICAgIAorCQlvcGVuX2ZpbGUgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNpZnNGaWxlSW5mbywgZmxpc3QpOworCQlpZiAob3Blbl9maWxlLT5jbG9zZVBlbmQpCisJCQljb250aW51ZTsKKwkJLyogV2UgY2hlY2sgaWYgZmlsZSBpcyBvcGVuIGZvciB3cml0aW5nIGZpcnN0ICovCisJCWlmICgob3Blbl9maWxlLT5wZmlsZSkgJiYgCisJCSAgICgob3Blbl9maWxlLT5wZmlsZS0+Zl9mbGFncyAmIE9fUkRXUikgfHwgCisJCQkob3Blbl9maWxlLT5wZmlsZS0+Zl9mbGFncyAmIE9fV1JPTkxZKSkpIHsKKwkJCXJlYWRfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwkJCWJ5dGVzX3dyaXR0ZW4gPSBjaWZzX3dyaXRlKG9wZW5fZmlsZS0+cGZpbGUsCisJCQkJCQl3cml0ZV9kYXRhLCB0by1mcm9tLAorCQkJCQkJJm9mZnNldCk7CisJCQlyZWFkX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCQkvKiBEb2VzIG1tIG9yIHZmcyBhbHJlYWR5IHNldCB0aW1lcz8gKi8KKwkJCWlub2RlLT5pX2F0aW1lID0gCisJCQlpbm9kZS0+aV9tdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CisJCQlpZiAoKGJ5dGVzX3dyaXR0ZW4gPiAwKSAmJiAob2Zmc2V0KSkgeworCQkJCXJjID0gMDsKKwkJCX0gZWxzZSBpZiAoYnl0ZXNfd3JpdHRlbiA8IDApIHsKKwkJCQlpZiAocmMgPT0gLUVCQURGKSB7CisJCQkJLyogaGF2ZSBzZWVuIGEgY2FzZSBpbiB3aGljaCBrZXJuZWwgc2VlbWVkIHRvCisJCQkJICAgaGF2ZSBjbG9zZWQvZnJlZWQgYSBmaWxlIGV2ZW4gd2l0aCB3cml0ZXMKKwkJCQkgICBhY3RpdmUgc28gd2UgbWlnaHQgYXMgd2VsbCBzZWUgaWYgdGhlcmUgYXJlCisJCQkJICAgb3RoZXIgZmlsZSBzdHJ1Y3RzIHRvIHRyeSBmb3IgdGhlIHNhbWUKKwkJCQkgICBpbm9kZSBiZWZvcmUgZ2l2aW5nIHVwICovCisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZQorCQkJCQlyYyA9IGJ5dGVzX3dyaXR0ZW47CisJCQl9CisJCQlicmVhazsgIC8qIG5vdyB0aGF0IHdlIGZvdW5kIGEgdmFsaWQgZmlsZSBoYW5kbGUgYW5kCisJCQkJICAgdHJpZWQgdG8gd3JpdGUgdG8gaXQgd2UgYXJlIGRvbmUsIG5vIHNlbnNlCisJCQkJICAgY29udGludWluZyB0byBsb29wIGxvb2tpbmcgZm9yIGFub3RoZXIgKi8KKwkJfQorCQlpZiAodG1wLT5uZXh0ID09IE5VTEwpIHsKKwkJCWNGWUkoMSwgKCJGaWxlIGluc3RhbmNlICVwIHJlbW92ZWQiLCB0bXApKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJlYWRfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlpZiAob3Blbl9maWxlID09IE5VTEwpIHsKKwkJY0ZZSSgxLCAoIk5vIHdyaXRlYWJsZSBmaWxlaGFuZGxlcyBmb3IgaW5vZGUiKSk7CisJCXJjID0gLUVJTzsKKwl9CisKKwlrdW5tYXAocGFnZSk7CisJcmV0dXJuIHJjOworfQorCisjaWYgMAorc3RhdGljIGludCBjaWZzX3dyaXRlcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJaW50IHJjID0gLUVGQVVMVDsKKwlpbnQgeGlkOworCisJeGlkID0gR2V0WGlkKCk7CisKKwkvKiBGaW5kIGNvbnRpZ3VvdXMgcGFnZXMgdGhlbiBpdGVyYXRlIHRocm91Z2ggcmVwZWF0aW5nCisJICAgY2FsbCAxNksgd3JpdGUgdGhlbiBTZXRwYWdldXB0b2RhdGUgb3IgaWYgTEFSR0VfV1JJVEVfWAorCSAgIHN1cHBvcnQgdGhlbiBzZW5kIGxhcmdlciB3cml0ZXMgdmlhIGtldmVjIHNvIGFzIHRvIGVsaW1pbmF0ZQorCSAgIGEgbWVtY3B5ICovCisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGNpZnNfd3JpdGVwYWdlKHN0cnVjdCBwYWdlKiBwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlpbnQgcmMgPSAtRUZBVUxUOworCWludCB4aWQ7CisKKwl4aWQgPSBHZXRYaWQoKTsKKy8qIEJCIGFkZCBjaGVjayBmb3Igd2JjIGZsYWdzICovCisJcGFnZV9jYWNoZV9nZXQocGFnZSk7CisgICAgICAgIGlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCWNGWUkoMSwgKCJwcHcgLSBwYWdlIG5vdCB1cCB0byBkYXRlIikpOworCX0KKwkKKwlyYyA9IGNpZnNfcGFydGlhbHBhZ2V3cml0ZShwYWdlLCAwLCBQQUdFX0NBQ0hFX1NJWkUpOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsgLyogQkIgYWRkIGNoZWNrIGZvciBlcnJvciBhbmQgQ2xlYXJ1cHRvZGF0ZT8gKi8KKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CQorCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgY2lmc19jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCXVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgdG8pCit7CisJaW50IHhpZDsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCWxvZmZfdCBwb3NpdGlvbiA9ICgobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgdG87CisJY2hhciAqcGFnZV9kYXRhOworCisJeGlkID0gR2V0WGlkKCk7CisJY0ZZSSgxLCAoImNvbW1pdCB3cml0ZSBmb3IgcGFnZSAlcCB1cCB0byBwb3NpdGlvbiAlbGxkIGZvciAlZCIsIAorCQkgcGFnZSwgcG9zaXRpb24sIHRvKSk7CisJaWYgKHBvc2l0aW9uID4gaW5vZGUtPmlfc2l6ZSkgeworCQlpX3NpemVfd3JpdGUoaW5vZGUsIHBvc2l0aW9uKTsKKwkJLyogaWYgKGZpbGUtPnByaXZhdGVfZGF0YSA9PSBOVUxMKSB7CisJCQlyYyA9IC1FQkFERjsKKwkJfSBlbHNlIHsKKwkJCW9wZW5fZmlsZSA9IChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCQkJY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOworCQkJcmMgPSAtRUFHQUlOOworCQkJd2hpbGUgKHJjID09IC1FQUdBSU4pIHsKKwkJCQlpZiAoKG9wZW5fZmlsZS0+aW52YWxpZEhhbmRsZSkgJiYgCisJCQkJICAgICghb3Blbl9maWxlLT5jbG9zZVBlbmQpKSB7CisJCQkJCXJjID0gY2lmc19yZW9wZW5fZmlsZSgKKwkJCQkJCWZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlKTsKKwkJCQkJaWYgKHJjICE9IDApCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKCFvcGVuX2ZpbGUtPmNsb3NlUGVuZCkgeworCQkJCQlyYyA9IENJRlNTTUJTZXRGaWxlU2l6ZSh4aWQsCisJCQkJCQljaWZzX3NiLT50Y29uLCBwb3NpdGlvbiwKKwkJCQkJCW9wZW5fZmlsZS0+bmV0ZmlkLAorCQkJCQkJb3Blbl9maWxlLT5waWQsIEZBTFNFKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyYyA9IC1FQkFERjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJY0ZZSSgxLCAoIiBTZXRFT0YgKGNvbW1pdCB3cml0ZSkgcmMgPSAlZCIsIHJjKSk7CisJCX0gKi8KKwl9CisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJcG9zaXRpb24gPSAgKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyBvZmZzZXQ7CisJCS8qIGNhbiBub3QgcmVseSBvbiAob3IgbGV0KSB3cml0ZXBhZ2Ugd3JpdGUgdGhpcyBkYXRhICovCisJCWlmICh0byA8IG9mZnNldCkgeworCQkJY0ZZSSgxLCAoIklsbGVnYWwgb2Zmc2V0cywgY2FuIG5vdCBjb3B5IGZyb20gJWQgdG8gJWQiLAorCQkJCW9mZnNldCwgdG8pKTsKKwkJCUZyZWVYaWQoeGlkKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQkvKiB0aGlzIGlzIHByb2JhYmx5IGJldHRlciB0aGFuIGRpcmVjdGx5IGNhbGxpbmcKKwkJICAgcGFydGlhbHBhZ2Vfd3JpdGUgc2luY2UgaW4gdGhpcyBmdW5jdGlvbiB0aGUgZmlsZSBoYW5kbGUgaXMKKwkJICAga25vd24gd2hpY2ggd2UgbWlnaHQgYXMgd2VsbAlsZXZlcmFnZSAqLworCQkvKiBCQiBjaGVjayBpZiBhbnl0aGluZyBlbHNlIG1pc3Npbmcgb3V0IG9mIHBwdworCQkgICBzdWNoIGFzIHVwZGF0aW5nIGxhc3Qgd3JpdGUgdGltZSAqLworCQlwYWdlX2RhdGEgPSBrbWFwKHBhZ2UpOworCQlyYyA9IGNpZnNfd3JpdGUoZmlsZSwgcGFnZV9kYXRhICsgb2Zmc2V0LCB0by1vZmZzZXQsCisJCQkJJnBvc2l0aW9uKTsKKwkJaWYgKHJjID4gMCkKKwkJCXJjID0gMDsKKwkJLyogZWxzZSBpZiAocmMgPCAwKSBzaG91bGQgd2Ugc2V0IHdyaXRlYmVoaW5kIHJjPyAqLworCQlrdW5tYXAocGFnZSk7CisJfSBlbHNlIHsJCisJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCX0KKworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBjaWZzX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBkYXRhc3luYykKK3sKKwlpbnQgeGlkOworCWludCByYyA9IDA7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCisJeGlkID0gR2V0WGlkKCk7CisKKwljRllJKDEsICgiU3luYyBmaWxlIC0gbmFtZTogJXMgZGF0YXN5bmM6IDB4JXggIiwgCisJCWRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRhdGFzeW5jKSk7CisJCisJcmMgPSBmaWxlbWFwX2ZkYXRhd3JpdGUoaW5vZGUtPmlfbWFwcGluZyk7CisJaWYgKHJjID09IDApCisJCUNJRlNfSShpbm9kZSktPndyaXRlX2JlaGluZF9yYyA9IDA7CisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworLyogc3RhdGljIGludCBjaWZzX3N5bmNfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSBwYWdlLT5pbmRleDsKKwl1bnNpZ25lZCBpbnQgcnBhZ2VzID0gMDsKKwlpbnQgcmMgPSAwOworCisJY0ZZSSgxLCAoInN5bmMgcGFnZSAlcCIscGFnZSkpOworCW1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOworCWlmICghbWFwcGluZykKKwkJcmV0dXJuIDA7CisJaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCWlmICghaW5vZGUpCisJCXJldHVybiAwOyAqLworCisvKglmaWxsIGluIHJwYWdlcyB0aGVuIAorCXJlc3VsdCA9IGNpZnNfcGFnZWluX2lub2RlKGlub2RlLCBpbmRleCwgcnBhZ2VzKTsgKi8gLyogQkIgZmluaXNoICovCisKKy8qCWNGWUkoMSwgKCJycGFnZXMgaXMgJWQgZm9yIHN5bmMgcGFnZSBvZiBJbmRleCAlbGQgIiwgcnBhZ2VzLCBpbmRleCkpOworCisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCXJldHVybiAwOworfSAqLworCisvKgorICogQXMgZmlsZSBjbG9zZXMsIGZsdXNoIGFsbCBjYWNoZWQgd3JpdGUgZGF0YSBmb3IgdGhpcyBpbm9kZSBjaGVja2luZworICogZm9yIHdyaXRlIGJlaGluZCBlcnJvcnMuCisgKi8KK2ludCBjaWZzX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW50IHJjID0gMDsKKworCS8qIFJhdGhlciB0aGFuIGRvIHRoZSBzdGVwcyBtYW51YWxseToKKwkgICBsb2NrIHRoZSBpbm9kZSBmb3Igd3JpdGluZworCSAgIGxvb3AgdGhyb3VnaCBwYWdlcyBsb29raW5nIGZvciB3cml0ZSBiZWhpbmQgZGF0YSAoZGlydHkgcGFnZXMpCisJICAgY29hbGVzY2UgaW50byBjb250aWd1b3VzIDE2SyAob3Igc21hbGxlcikgY2h1bmtzIHRvIHdyaXRlIHRvIHNlcnZlcgorCSAgIHNlbmQgdG8gc2VydmVyIChwcmVmZXIgaW4gcGFyYWxsZWwpCisJICAgZGVhbCB3aXRoIHdyaXRlYmVoaW5kIGVycm9ycworCSAgIHVubG9jayBpbm9kZSBmb3Igd3JpdGluZworCSAgIGZpbGVtYXBmZGF0YXdyaXRlIGFwcGVhcnMgZWFzaWVyIGZvciB0aGUgdGltZSBiZWluZyAqLworCisJcmMgPSBmaWxlbWFwX2ZkYXRhd3JpdGUoaW5vZGUtPmlfbWFwcGluZyk7CisJaWYgKCFyYykgLyogcmVzZXQgd2IgcmMgaWYgd2Ugd2VyZSBhYmxlIHRvIHdyaXRlIG91dCBkaXJ0eSBwYWdlcyAqLworCQlDSUZTX0koaW5vZGUpLT53cml0ZV9iZWhpbmRfcmMgPSAwOworCQkKKwljRllJKDEsICgiRmx1c2ggaW5vZGUgJXAgZmlsZSAlcCByYyAlZCIsaW5vZGUsZmlsZSxyYykpOworCisJcmV0dXJuIHJjOworfQorCitzc2l6ZV90IGNpZnNfdXNlcl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqcmVhZF9kYXRhLAorCXNpemVfdCByZWFkX3NpemUsIGxvZmZfdCAqcG9mZnNldCkKK3sKKwlpbnQgcmMgPSAtRUFDQ0VTOworCXVuc2lnbmVkIGludCBieXRlc19yZWFkID0gMDsKKwl1bnNpZ25lZCBpbnQgdG90YWxfcmVhZCA9IDA7CisJdW5zaWduZWQgaW50IGN1cnJlbnRfcmVhZF9zaXplOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJaW50IHhpZDsKKwlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpvcGVuX2ZpbGU7CisJY2hhciAqc21iX3JlYWRfZGF0YTsKKwljaGFyIF9fdXNlciAqY3VycmVudF9vZmZzZXQ7CisJc3RydWN0IHNtYl9jb21fcmVhZF9yc3AgKnBTTUJyOworCisJeGlkID0gR2V0WGlkKCk7CisJY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRUJBREY7CisJfQorCW9wZW5fZmlsZSA9IChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1dST05MWSkgeworCQljRllJKDEsICgiYXR0ZW1wdGluZyByZWFkIG9uIHdyaXRlIG9ubHkgZmlsZSBpbnN0YW5jZSIpKTsKKwl9CisJZm9yICh0b3RhbF9yZWFkID0gMCwgY3VycmVudF9vZmZzZXQgPSByZWFkX2RhdGE7CisJICAgICByZWFkX3NpemUgPiB0b3RhbF9yZWFkOworCSAgICAgdG90YWxfcmVhZCArPSBieXRlc19yZWFkLCBjdXJyZW50X29mZnNldCArPSBieXRlc19yZWFkKSB7CisJCWN1cnJlbnRfcmVhZF9zaXplID0gbWluX3QoY29uc3QgaW50LCByZWFkX3NpemUgLSB0b3RhbF9yZWFkLCAKKwkJCQkJICBjaWZzX3NiLT5yc2l6ZSk7CisJCXJjID0gLUVBR0FJTjsKKwkJc21iX3JlYWRfZGF0YSA9IE5VTEw7CisJCXdoaWxlIChyYyA9PSAtRUFHQUlOKSB7CisJCQlpZiAoKG9wZW5fZmlsZS0+aW52YWxpZEhhbmRsZSkgJiYgCisJCQkgICAgKCFvcGVuX2ZpbGUtPmNsb3NlUGVuZCkpIHsKKwkJCQlyYyA9IGNpZnNfcmVvcGVuX2ZpbGUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsCisJCQkJCWZpbGUsIFRSVUUpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJcmMgPSBDSUZTU01CUmVhZCh4aWQsIHBUY29uLAorCQkJCSBvcGVuX2ZpbGUtPm5ldGZpZCwKKwkJCQkgY3VycmVudF9yZWFkX3NpemUsICpwb2Zmc2V0LAorCQkJCSAmYnl0ZXNfcmVhZCwgJnNtYl9yZWFkX2RhdGEpOworCisJCQlwU01CciA9IChzdHJ1Y3Qgc21iX2NvbV9yZWFkX3JzcCAqKXNtYl9yZWFkX2RhdGE7CisJCQlpZiAoY29weV90b191c2VyKGN1cnJlbnRfb2Zmc2V0LCAKKwkJCQkJIHNtYl9yZWFkX2RhdGEgKyA0IC8qIFJGQzEwMDEgaGRyICovCisJCQkJCSArIGxlMTZfdG9fY3B1KHBTTUJyLT5EYXRhT2Zmc2V0KSwgCisJCQkJCSBieXRlc19yZWFkKSkgeworCQkJCXJjID0gLUVGQVVMVDsKKwkJCQlGcmVlWGlkKHhpZCk7CisJCQkJcmV0dXJuIHJjOworICAgICAgICAgICAgfQorCQkJaWYgKHNtYl9yZWFkX2RhdGEpIHsKKwkJCQljaWZzX2J1Zl9yZWxlYXNlKHNtYl9yZWFkX2RhdGEpOworCQkJCXNtYl9yZWFkX2RhdGEgPSBOVUxMOworCQkJfQorCQl9CisJCWlmIChyYyB8fCAoYnl0ZXNfcmVhZCA9PSAwKSkgeworCQkJaWYgKHRvdGFsX3JlYWQpIHsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJRnJlZVhpZCh4aWQpOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJfSBlbHNlIHsKKyNpZmRlZiBDT05GSUdfQ0lGU19TVEFUUworCQkJYXRvbWljX2luYygmcFRjb24tPm51bV9yZWFkcyk7CisJCQlzcGluX2xvY2soJnBUY29uLT5zdGF0X2xvY2spOworCQkJcFRjb24tPmJ5dGVzX3JlYWQgKz0gdG90YWxfcmVhZDsKKwkJCXNwaW5fdW5sb2NrKCZwVGNvbi0+c3RhdF9sb2NrKTsKKyNlbmRpZgorCQkJKnBvZmZzZXQgKz0gYnl0ZXNfcmVhZDsKKwkJfQorCX0KKwlGcmVlWGlkKHhpZCk7CisJcmV0dXJuIHRvdGFsX3JlYWQ7Cit9CisKKworc3RhdGljIHNzaXplX3QgY2lmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpyZWFkX2RhdGEsIHNpemVfdCByZWFkX3NpemUsCisJbG9mZl90ICpwb2Zmc2V0KQoreworCWludCByYyA9IC1FQUNDRVM7CisJdW5zaWduZWQgaW50IGJ5dGVzX3JlYWQgPSAwOworCXVuc2lnbmVkIGludCB0b3RhbF9yZWFkOworCXVuc2lnbmVkIGludCBjdXJyZW50X3JlYWRfc2l6ZTsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uOworCWludCB4aWQ7CisJY2hhciAqY3VycmVudF9vZmZzZXQ7CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqb3Blbl9maWxlOworCisJeGlkID0gR2V0WGlkKCk7CisJY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRUJBREY7CisJfQorCW9wZW5fZmlsZSA9IChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1dST05MWSkKKwkJY0ZZSSgxLCAoImF0dGVtcHRpbmcgcmVhZCBvbiB3cml0ZSBvbmx5IGZpbGUgaW5zdGFuY2UiKSk7CisKKwlmb3IgKHRvdGFsX3JlYWQgPSAwLCBjdXJyZW50X29mZnNldCA9IHJlYWRfZGF0YTsgCisJICAgICByZWFkX3NpemUgPiB0b3RhbF9yZWFkOworCSAgICAgdG90YWxfcmVhZCArPSBieXRlc19yZWFkLCBjdXJyZW50X29mZnNldCArPSBieXRlc19yZWFkKSB7CisJCWN1cnJlbnRfcmVhZF9zaXplID0gbWluX3QoY29uc3QgaW50LCByZWFkX3NpemUgLSB0b3RhbF9yZWFkLAorCQkJCQkgIGNpZnNfc2ItPnJzaXplKTsKKwkJcmMgPSAtRUFHQUlOOworCQl3aGlsZSAocmMgPT0gLUVBR0FJTikgeworCQkJaWYgKChvcGVuX2ZpbGUtPmludmFsaWRIYW5kbGUpICYmIAorCQkJICAgICghb3Blbl9maWxlLT5jbG9zZVBlbmQpKSB7CisJCQkJcmMgPSBjaWZzX3Jlb3Blbl9maWxlKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAorCQkJCQlmaWxlLCBUUlVFKTsKKwkJCQlpZiAocmMgIT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCXJjID0gQ0lGU1NNQlJlYWQoeGlkLCBwVGNvbiwKKwkJCQkgb3Blbl9maWxlLT5uZXRmaWQsCisJCQkJIGN1cnJlbnRfcmVhZF9zaXplLCAqcG9mZnNldCwKKwkJCQkgJmJ5dGVzX3JlYWQsICZjdXJyZW50X29mZnNldCk7CisJCX0KKwkJaWYgKHJjIHx8IChieXRlc19yZWFkID09IDApKSB7CisJCQlpZiAodG90YWxfcmVhZCkgeworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlGcmVlWGlkKHhpZCk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9IGVsc2UgeworI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTCisJCQlhdG9taWNfaW5jKCZwVGNvbi0+bnVtX3JlYWRzKTsKKwkJCXNwaW5fbG9jaygmcFRjb24tPnN0YXRfbG9jayk7CisJCQlwVGNvbi0+Ynl0ZXNfcmVhZCArPSB0b3RhbF9yZWFkOworCQkJc3Bpbl91bmxvY2soJnBUY29uLT5zdGF0X2xvY2spOworI2VuZGlmCisJCQkqcG9mZnNldCArPSBieXRlc19yZWFkOworCQl9CisJfQorCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gdG90YWxfcmVhZDsKK30KKworaW50IGNpZnNfZmlsZV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlpbnQgcmMsIHhpZDsKKworCXhpZCA9IEdldFhpZCgpOworCXJjID0gY2lmc19yZXZhbGlkYXRlKGRlbnRyeSk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJWYWxpZGF0aW9uIHByaW9yIHRvIG1tYXAgZmFpbGVkLCBlcnJvcj0lZCIsIHJjKSk7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIHJjOworCX0KKwlyYyA9IGdlbmVyaWNfZmlsZV9tbWFwKGZpbGUsIHZtYSk7CisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgdm9pZCBjaWZzX2NvcHlfY2FjaGVfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIAorCXN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzLCBpbnQgYnl0ZXNfcmVhZCwgY2hhciAqZGF0YSwKKwlzdHJ1Y3QgcGFnZXZlYyAqcGxydV9wdmVjKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCWNoYXIgKnRhcmdldDsKKworCXdoaWxlIChieXRlc19yZWFkID4gMCkgeworCQlpZiAobGlzdF9lbXB0eShwYWdlcykpCisJCQlicmVhazsKKworCQlwYWdlID0gbGlzdF9lbnRyeShwYWdlcy0+cHJldiwgc3RydWN0IHBhZ2UsIGxydSk7CisJCWxpc3RfZGVsKCZwYWdlLT5scnUpOworCisJCWlmIChhZGRfdG9fcGFnZV9jYWNoZShwYWdlLCBtYXBwaW5nLCBwYWdlLT5pbmRleCwKKwkJCQkgICAgICBHRlBfS0VSTkVMKSkgeworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJY0ZZSSgxLCAoIkFkZCBwYWdlIGNhY2hlIGZhaWxlZCIpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdGFyZ2V0ID0ga21hcF9hdG9taWMocGFnZSxLTV9VU0VSMCk7CisKKwkJaWYgKFBBR0VfQ0FDSEVfU0laRSA+IGJ5dGVzX3JlYWQpIHsKKwkJCW1lbWNweSh0YXJnZXQsIGRhdGEsIGJ5dGVzX3JlYWQpOworCQkJLyogemVybyB0aGUgdGFpbCBlbmQgb2YgdGhpcyBwYXJ0aWFsIHBhZ2UgKi8KKwkJCW1lbXNldCh0YXJnZXQgKyBieXRlc19yZWFkLCAwLCAKKwkJCSAgICAgICBQQUdFX0NBQ0hFX1NJWkUgLSBieXRlc19yZWFkKTsKKwkJCWJ5dGVzX3JlYWQgPSAwOworCQl9IGVsc2UgeworCQkJbWVtY3B5KHRhcmdldCwgZGF0YSwgUEFHRV9DQUNIRV9TSVpFKTsKKwkJCWJ5dGVzX3JlYWQgLT0gUEFHRV9DQUNIRV9TSVpFOworCQl9CisJCWt1bm1hcF9hdG9taWModGFyZ2V0LCBLTV9VU0VSMCk7CisKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCWlmICghcGFnZXZlY19hZGQocGxydV9wdmVjLCBwYWdlKSkKKwkJCV9fcGFnZXZlY19scnVfYWRkKHBscnVfcHZlYyk7CisJCWRhdGEgKz0gUEFHRV9DQUNIRV9TSVpFOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgY2lmc19yZWFkcGFnZXMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCXN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VfbGlzdCwgdW5zaWduZWQgbnVtX3BhZ2VzKQoreworCWludCByYyA9IC1FQUNDRVM7CisJaW50IHhpZDsKKwlsb2ZmX3Qgb2Zmc2V0OworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJaW50IGJ5dGVzX3JlYWQgPSAwOworCXVuc2lnbmVkIGludCByZWFkX3NpemUsaTsKKwljaGFyICpzbWJfcmVhZF9kYXRhID0gTlVMTDsKKwlzdHJ1Y3Qgc21iX2NvbV9yZWFkX3JzcCAqcFNNQnI7CisJc3RydWN0IHBhZ2V2ZWMgbHJ1X3B2ZWM7CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqb3Blbl9maWxlOworCisJeGlkID0gR2V0WGlkKCk7CisJaWYgKGZpbGUtPnByaXZhdGVfZGF0YSA9PSBOVUxMKSB7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FQkFERjsKKwl9CisJb3Blbl9maWxlID0gKHN0cnVjdCBjaWZzRmlsZUluZm8gKilmaWxlLT5wcml2YXRlX2RhdGE7CisJY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCXBhZ2V2ZWNfaW5pdCgmbHJ1X3B2ZWMsIDApOworCisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgKSB7CisJCXVuc2lnbmVkIGNvbnRpZ19wYWdlczsKKwkJc3RydWN0IHBhZ2UgKnRtcF9wYWdlOworCQl1bnNpZ25lZCBsb25nIGV4cGVjdGVkX2luZGV4OworCisJCWlmIChsaXN0X2VtcHR5KHBhZ2VfbGlzdCkpCisJCQlicmVhazsKKworCQlwYWdlID0gbGlzdF9lbnRyeShwYWdlX2xpc3QtPnByZXYsIHN0cnVjdCBwYWdlLCBscnUpOworCQlvZmZzZXQgPSAobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisKKwkJLyogY291bnQgYWRqYWNlbnQgcGFnZXMgdGhhdCB3ZSB3aWxsIHJlYWQgaW50byAqLworCQljb250aWdfcGFnZXMgPSAwOworCQlleHBlY3RlZF9pbmRleCA9IAorCQkJbGlzdF9lbnRyeShwYWdlX2xpc3QtPnByZXYsIHN0cnVjdCBwYWdlLCBscnUpLT5pbmRleDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHRtcF9wYWdlLHBhZ2VfbGlzdCxscnUpIHsKKwkJCWlmICh0bXBfcGFnZS0+aW5kZXggPT0gZXhwZWN0ZWRfaW5kZXgpIHsKKwkJCQljb250aWdfcGFnZXMrKzsKKwkJCQlleHBlY3RlZF9pbmRleCsrOworCQkJfSBlbHNlCisJCQkJYnJlYWs7IAorCQl9CisJCWlmIChjb250aWdfcGFnZXMgKyBpID4gIG51bV9wYWdlcykKKwkJCWNvbnRpZ19wYWdlcyA9IG51bV9wYWdlcyAtIGk7CisKKwkJLyogZm9yIHJlYWRzIG92ZXIgYSBjZXJ0YWluIHNpemUgY291bGQgaW5pdGlhdGUgYXN5bmMKKwkJICAgcmVhZCBhaGVhZCAqLworCisJCXJlYWRfc2l6ZSA9IGNvbnRpZ19wYWdlcyAqIFBBR0VfQ0FDSEVfU0laRTsKKwkJLyogUmVhZCBzaXplIG5lZWRzIHRvIGJlIGluIG11bHRpcGxlcyBvZiBvbmUgcGFnZSAqLworCQlyZWFkX3NpemUgPSBtaW5fdChjb25zdCB1bnNpZ25lZCBpbnQsIHJlYWRfc2l6ZSwKKwkJCQkgIGNpZnNfc2ItPnJzaXplICYgUEFHRV9DQUNIRV9NQVNLKTsKKworCQlyYyA9IC1FQUdBSU47CisJCXdoaWxlIChyYyA9PSAtRUFHQUlOKSB7CisJCQlpZiAoKG9wZW5fZmlsZS0+aW52YWxpZEhhbmRsZSkgJiYgCisJCQkgICAgKCFvcGVuX2ZpbGUtPmNsb3NlUGVuZCkpIHsKKwkJCQlyYyA9IGNpZnNfcmVvcGVuX2ZpbGUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsCisJCQkJCWZpbGUsIFRSVUUpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJcmMgPSBDSUZTU01CUmVhZCh4aWQsIHBUY29uLAorCQkJCW9wZW5fZmlsZS0+bmV0ZmlkLAorCQkJCXJlYWRfc2l6ZSwgb2Zmc2V0LAorCQkJCSZieXRlc19yZWFkLCAmc21iX3JlYWRfZGF0YSk7CisJCQkvKiBCQiBuZWVkIHRvIGNoZWNrIHJldHVybiBjb2RlIGhlcmUgKi8KKwkJCWlmIChyYz09IC1FQUdBSU4pIHsKKwkJCQlpZiAoc21iX3JlYWRfZGF0YSkgeworCQkJCQljaWZzX2J1Zl9yZWxlYXNlKHNtYl9yZWFkX2RhdGEpOworCQkJCQlzbWJfcmVhZF9kYXRhID0gTlVMTDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKChyYyA8IDApIHx8IChzbWJfcmVhZF9kYXRhID09IE5VTEwpKSB7CisJCQljRllJKDEsICgiUmVhZCBlcnJvciBpbiByZWFkcGFnZXM6ICVkIiwgcmMpKTsKKwkJCS8qIGNsZWFuIHVwIHJlbWFpbmcgcGFnZXMgb2ZmIGxpc3QgKi8KKwkJCXdoaWxlICghbGlzdF9lbXB0eShwYWdlX2xpc3QpICYmIChpIDwgbnVtX3BhZ2VzKSkgeworCQkJCXBhZ2UgPSBsaXN0X2VudHJ5KHBhZ2VfbGlzdC0+cHJldiwgc3RydWN0IHBhZ2UsCisJCQkJCQkgIGxydSk7CisJCQkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJfQorCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoYnl0ZXNfcmVhZCA+IDApIHsKKwkJCXBTTUJyID0gKHN0cnVjdCBzbWJfY29tX3JlYWRfcnNwICopc21iX3JlYWRfZGF0YTsKKwkJCWNpZnNfY29weV9jYWNoZV9wYWdlcyhtYXBwaW5nLCBwYWdlX2xpc3QsIGJ5dGVzX3JlYWQsCisJCQkJc21iX3JlYWRfZGF0YSArIDQgLyogUkZDMTAwMSBoZHIgKi8gKworCQkJCWxlMTZfdG9fY3B1KHBTTUJyLT5EYXRhT2Zmc2V0KSwgJmxydV9wdmVjKTsKKworCQkJaSArPSAgYnl0ZXNfcmVhZCA+PiBQQUdFX0NBQ0hFX1NISUZUOworI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTCisJCQlhdG9taWNfaW5jKCZwVGNvbi0+bnVtX3JlYWRzKTsKKwkJCXNwaW5fbG9jaygmcFRjb24tPnN0YXRfbG9jayk7CisJCQlwVGNvbi0+Ynl0ZXNfcmVhZCArPSBieXRlc19yZWFkOworCQkJc3Bpbl91bmxvY2soJnBUY29uLT5zdGF0X2xvY2spOworI2VuZGlmCisJCQlpZiAoKGludCkoYnl0ZXNfcmVhZCAmIFBBR0VfQ0FDSEVfTUFTSykgIT0gYnl0ZXNfcmVhZCkgeworCQkJCWkrKzsgLyogYWNjb3VudCBmb3IgcGFydGlhbCBwYWdlICovCisKKwkJCQkvKiBzZXJ2ZXIgY29weSBvZiBmaWxlIGNhbiBoYXZlIHNtYWxsZXIgc2l6ZSAKKwkJCQkgICB0aGFuIGNsaWVudCAqLworCQkJCS8qIEJCIGRvIHdlIG5lZWQgdG8gdmVyaWZ5IHRoaXMgY29tbW9uIGNhc2UgPyAKKwkJCQkgICB0aGlzIGNhc2UgaXMgb2sgLSBpZiB3ZSBhcmUgYXQgc2VydmVyIEVPRiAKKwkJCQkgICB3ZSB3aWxsIGhpdCBpdCBvbiBuZXh0IHJlYWQgKi8KKworCQkJLyogd2hpbGUgKCFsaXN0X2VtcHR5KHBhZ2VfbGlzdCkgJiYgKGkgPCBudW1fcGFnZXMpKSB7CisJCQkJCXBhZ2UgPSBsaXN0X2VudHJ5KHBhZ2VfbGlzdC0+cHJldiwgCisJCQkJCQkJICBzdHJ1Y3QgcGFnZSwgbGlzdCk7CisJCQkJCWxpc3RfZGVsKCZwYWdlLT5saXN0KTsKKwkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCX0KKwkJCQlicmVhazsgKi8KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNGWUkoMSwgKCJObyBieXRlcyByZWFkICglZCkgYXQgb2Zmc2V0ICVsbGQgLiAiCisJCQkJICJDbGVhbmluZyByZW1haW5pbmcgcGFnZXMgZnJvbSByZWFkYWhlYWQgbGlzdCIsCisJCQkJIGJ5dGVzX3JlYWQsIG9mZnNldCkpOworCQkJLyogQkIgdHVybiBvZmYgY2FjaGluZyBhbmQgZG8gbmV3IGxvb2t1cCBvbiAKKwkJCSAgIGZpbGUgc2l6ZSBhdCBzZXJ2ZXI/ICovCisJCQl3aGlsZSAoIWxpc3RfZW1wdHkocGFnZV9saXN0KSAmJiAoaSA8IG51bV9wYWdlcykpIHsKKwkJCQlwYWdlID0gbGlzdF9lbnRyeShwYWdlX2xpc3QtPnByZXYsIHN0cnVjdCBwYWdlLAorCQkJCQkJICBscnUpOworCQkJCWxpc3RfZGVsKCZwYWdlLT5scnUpOworCisJCQkJLyogQkIgcmVtb3ZlbWUgLSByZXBsYWNlIHdpdGggemVybyBvZiBwYWdlPyAqLworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWlmIChzbWJfcmVhZF9kYXRhKSB7CisJCQljaWZzX2J1Zl9yZWxlYXNlKHNtYl9yZWFkX2RhdGEpOworCQkJc21iX3JlYWRfZGF0YSA9IE5VTEw7CisJCX0KKwkJYnl0ZXNfcmVhZCA9IDA7CisJfQorCisJcGFnZXZlY19scnVfYWRkKCZscnVfcHZlYyk7CisKKy8qIG5lZWQgdG8gZnJlZSBzbWJfcmVhZF9kYXRhIGJ1ZiBiZWZvcmUgZXhpdCAqLworCWlmIChzbWJfcmVhZF9kYXRhKSB7CisJCWNpZnNfYnVmX3JlbGVhc2Uoc21iX3JlYWRfZGF0YSk7CisJCXNtYl9yZWFkX2RhdGEgPSBOVUxMOworCX0gCisKKwlGcmVlWGlkKHhpZCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGNpZnNfcmVhZHBhZ2Vfd29ya2VyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwlsb2ZmX3QgKnBvZmZzZXQpCit7CisJY2hhciAqcmVhZF9kYXRhOworCWludCByYzsKKworCXBhZ2VfY2FjaGVfZ2V0KHBhZ2UpOworCXJlYWRfZGF0YSA9IGttYXAocGFnZSk7CisJLyogZm9yIHJlYWRzIG92ZXIgYSBjZXJ0YWluIHNpemUgY291bGQgaW5pdGlhdGUgYXN5bmMgcmVhZCBhaGVhZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJcmMgPSBjaWZzX3JlYWQoZmlsZSwgcmVhZF9kYXRhLCBQQUdFX0NBQ0hFX1NJWkUsIHBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJaWYgKHJjIDwgMCkKKwkJZ290byBpb19lcnJvcjsKKwllbHNlCisJCWNGWUkoMSwgKCJCeXRlcyByZWFkICVkICIscmMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCWZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2F0aW1lID0KKwkJY3VycmVudF9mc190aW1lKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCWlmIChQQUdFX0NBQ0hFX1NJWkUgPiByYykKKwkJbWVtc2V0KHJlYWRfZGF0YSArIHJjLCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSByYyk7CisKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJcmMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitpb19lcnJvcjoKKyAgICAgICAga3VubWFwKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgY2lmc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJbG9mZl90IG9mZnNldCA9IChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKwlpbnQgcmMgPSAtRUFDQ0VTOworCWludCB4aWQ7CisKKwl4aWQgPSBHZXRYaWQoKTsKKworCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRUJBREY7CisJfQorCisJY0ZZSSgxLCAoInJlYWRwYWdlICVwIGF0IG9mZnNldCAlZCAweCV4XG4iLCAKKwkJIHBhZ2UsIChpbnQpb2Zmc2V0LCAoaW50KW9mZnNldCkpOworCisJcmMgPSBjaWZzX3JlYWRwYWdlX3dvcmtlcihmaWxlLCBwYWdlLCAmb2Zmc2V0KTsKKworCXVubG9ja19wYWdlKHBhZ2UpOworCisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworLyogV2UgZG8gbm90IHdhbnQgdG8gdXBkYXRlIHRoZSBmaWxlIHNpemUgZnJvbSBzZXJ2ZXIgZm9yIGlub2RlcworICAgb3BlbiBmb3Igd3JpdGUgLSB0byBhdm9pZCByYWNlcyB3aXRoIHdyaXRlcGFnZSBleHRlbmRpbmcKKyAgIHRoZSBmaWxlIC0gaW4gdGhlIGZ1dHVyZSB3ZSBjb3VsZCBjb25zaWRlciBhbGxvd2luZworICAgcmVmcmVzaGluZyB0aGUgaW5vZGUgb25seSBvbiBpbmNyZWFzZXMgaW4gdGhlIGZpbGUgc2l6ZSAKKyAgIGJ1dCB0aGlzIGlzIHRyaWNreSB0byBkbyB3aXRob3V0IHJhY2luZyB3aXRoIHdyaXRlYmVoaW5kCisgICBwYWdlIGNhY2hpbmcgaW4gdGhlIGN1cnJlbnQgTGludXgga2VybmVsIGRlc2lnbiAqLworaW50IGlzX3NpemVfc2FmZV90b19jaGFuZ2Uoc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNJbm9kZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wMTsKKwlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpvcGVuX2ZpbGUgPSBOVUxMOworCWludCByYyA9IFRSVUU7CisKKwlpZiAoY2lmc0lub2RlID09IE5VTEwpCisJCXJldHVybiByYzsKKworCXJlYWRfbG9jaygmR2xvYmFsU01CU2VzbG9jayk7IAorCWxpc3RfZm9yX2VhY2hfc2FmZSh0bXAsIHRtcDEsICZjaWZzSW5vZGUtPm9wZW5GaWxlTGlzdCkgeyAgICAgICAgICAgIAorCQlvcGVuX2ZpbGUgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNpZnNGaWxlSW5mbywgZmxpc3QpOworCQlpZiAob3Blbl9maWxlID09IE5VTEwpCisJCQlicmVhazsKKwkJaWYgKG9wZW5fZmlsZS0+Y2xvc2VQZW5kKQorCQkJY29udGludWU7CisJLyogV2UgY2hlY2sgaWYgZmlsZSBpcyBvcGVuIGZvciB3cml0aW5nLCAgIAorCSAgIEJCIHdlIGNvdWxkIHN1cHBsZW1lbnQgdGhpcyB3aXRoIGEgY2hlY2sgdG8gc2VlIGlmIGZpbGUgc2l6ZQorCSAgIGNoYW5nZXMgaGF2ZSBiZWVuIGZsdXNoZWQgdG8gc2VydmVyIC0gaWUgaW5vZGUgbWV0YWRhdGEgZGlydHkgKi8KKwkJaWYgKChvcGVuX2ZpbGUtPnBmaWxlKSAmJiAKKwkJICAgICgob3Blbl9maWxlLT5wZmlsZS0+Zl9mbGFncyAmIE9fUkRXUikgfHwgCisJCSAgICAob3Blbl9maWxlLT5wZmlsZS0+Zl9mbGFncyAmIE9fV1JPTkxZKSkpIHsKKwkJCXJjID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQorCQlpZiAodG1wLT5uZXh0ID09IE5VTEwpIHsKKwkJCWNGWUkoMSwgKCJGaWxlIGluc3RhbmNlICVwIHJlbW92ZWQiLCB0bXApKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJlYWRfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGludCBjaWZzX3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCXVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCWludCByYyA9IDA7CisgICAgICAgIGxvZmZfdCBvZmZzZXQgPSAobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJY0ZZSSgxLCAoInByZXBhcmUgd3JpdGUgZm9yIHBhZ2UgJXAgZnJvbSAlZCB0byAlZCIscGFnZSxmcm9tLHRvKSk7CisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkvKglpZiAodG8gLSBmcm9tICE9IFBBR0VfQ0FDSEVfU0laRSkgeworCQkJdm9pZCAqa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCQltZW1zZXQoa2FkZHIsIDAsIGZyb20pOworCQkJbWVtc2V0KGthZGRyICsgdG8sIDAsIFBBR0VfQ0FDSEVfU0laRSAtIHRvKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQl9ICovCisJCS8qIElmIHdlIGFyZSB3cml0aW5nIGEgZnVsbCBwYWdlIGl0IHdpbGwgYmUgdXAgdG8gZGF0ZSwKKwkJICAgbm8gbmVlZCB0byByZWFkIGZyb20gdGhlIHNlcnZlciAqLworCQlpZiAoKHRvID09IFBBR0VfQ0FDSEVfU0laRSkgJiYgKGZyb20gPT0gMCkpCisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisKKwkJLyogbWlnaHQgYXMgd2VsbCByZWFkIGEgcGFnZSwgaXQgaXMgZmFzdCBlbm91Z2ggKi8KKwkJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSAhPSBPX1dST05MWSkgeworCQkJcmMgPSBjaWZzX3JlYWRwYWdlX3dvcmtlcihmaWxlLCBwYWdlLCAmb2Zmc2V0KTsKKwkJfSBlbHNlIHsKKwkJLyogc2hvdWxkIHdlIHRyeSB1c2luZyBhbm90aGVyIGZpbGUgaGFuZGxlIGlmIHRoZXJlIGlzIG9uZSAtCisJCSAgIGhvdyB3b3VsZCB3ZSBsb2NrIGl0IHRvIHByZXZlbnQgY2xvc2Ugb2YgdGhhdCBoYW5kbGUKKwkJICAgcmFjaW5nIHdpdGggdGhpcyByZWFkPworCQkgICBJbiBhbnkgY2FzZSB0aGlzIHdpbGwgYmUgd3JpdHRlbiBvdXQgYnkgY29tbWl0X3dyaXRlICovCisJCX0KKwl9CisKKwkvKiBCQiBzaG91bGQgd2UgcGFzcyBhbnkgZXJyb3JzIGJhY2s/IAorCSAgIGUuZy4gaWYgd2UgZG8gbm90IGhhdmUgcmVhZCBhY2Nlc3MgdG8gdGhlIGZpbGUgKi8KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBjaWZzX2FkZHJfb3BzID0geworCS5yZWFkcGFnZSA9IGNpZnNfcmVhZHBhZ2UsCisJLnJlYWRwYWdlcyA9IGNpZnNfcmVhZHBhZ2VzLAorCS53cml0ZXBhZ2UgPSBjaWZzX3dyaXRlcGFnZSwKKwkucHJlcGFyZV93cml0ZSA9IGNpZnNfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlID0gY2lmc19jb21taXRfd3JpdGUsCisJLnNldF9wYWdlX2RpcnR5ID0gX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMsCisJLyogLnN5bmNfcGFnZSA9IGNpZnNfc3luY19wYWdlLCAqLworCS8qIC5kaXJlY3RfSU8gPSAqLworfTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvaW5vZGUuYyBiL2ZzL2NpZnMvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzNiMGFhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9pbm9kZS5jCkBAIC0wLDAgKzEsMTA5NiBAQAorLyoKKyAqICAgZnMvY2lmcy9pbm9kZS5jCisgKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgIENvcnAuLCAyMDAyLDIwMDUKKyAqICAgQXV0aG9yKHMpOiBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisjaW5jbHVkZSAiY2lmc2ZzLmgiCisjaW5jbHVkZSAiY2lmc3BkdS5oIgorI2luY2x1ZGUgImNpZnNnbG9iLmgiCisjaW5jbHVkZSAiY2lmc3Byb3RvLmgiCisjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgorI2luY2x1ZGUgImNpZnNfZnNfc2IuaCIKKworaW50IGNpZnNfZ2V0X2lub2RlX2luZm9fdW5peChzdHJ1Y3QgaW5vZGUgKipwaW5vZGUsCisJY29uc3QgdW5zaWduZWQgY2hhciAqc2VhcmNoX3BhdGgsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB4aWQpCit7CisJaW50IHJjID0gMDsKKwlGSUxFX1VOSVhfQkFTSUNfSU5GTyBmaW5kRGF0YTsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKKwljaGFyICp0bXBfcGF0aDsKKworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKwljRllJKDEsICgiIEdldHRpbmcgaW5mbyBvbiAlcyAiLCBzZWFyY2hfcGF0aCkpOworCS8qIGNvdWxkIGhhdmUgZG9uZSBhIGZpbmQgZmlyc3QgaW5zdGVhZCBidXQgdGhpcyByZXR1cm5zIG1vcmUgaW5mbyAqLworCXJjID0gQ0lGU1NNQlVuaXhRUGF0aEluZm8oeGlkLCBwVGNvbiwgc2VhcmNoX3BhdGgsICZmaW5kRGF0YSwKKwkJCQkgIGNpZnNfc2ItPmxvY2FsX25scyk7CisvKglkdW1wX21lbSgiXG5Vbml4UVBhdGhJbmZvIHJldHVybiBkYXRhIiwgJmZpbmREYXRhLAorCQkgc2l6ZW9mKGZpbmREYXRhKSk7ICovCisJaWYgKHJjKSB7CisJCWlmIChyYyA9PSAtRVJFTU9URSkgeworCQkJdG1wX3BhdGggPQorCQkJICAgIGttYWxsb2Moc3RybmxlbihwVGNvbi0+dHJlZU5hbWUsCisJCQkJCSAgICBNQVhfVFJFRV9TSVpFICsgMSkgKworCQkJCSAgICBzdHJubGVuKHNlYXJjaF9wYXRoLCBNQVhfUEFUSENPTkYpICsgMSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCQlpZiAodG1wX3BhdGggPT0gTlVMTCkgeworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorICAgICAgICAJCS8qIGhhdmUgdG8gc2tpcCBmaXJzdCBvZiB0aGUgZG91YmxlIGJhY2tzbGFzaCBvZgorCQkJICAgVU5DIG5hbWUgKi8KKwkJCXN0cm5jcHkodG1wX3BhdGgsIHBUY29uLT50cmVlTmFtZSwgTUFYX1RSRUVfU0laRSk7CisJCQlzdHJuY2F0KHRtcF9wYXRoLCBzZWFyY2hfcGF0aCwgTUFYX1BBVEhDT05GKTsKKwkJCXJjID0gY29ubmVjdF90b19kZnNfcGF0aCh4aWQsIHBUY29uLT5zZXMsCisJCQkJCQkgLyogdHJlZW5hbWUgKyAqLyB0bXBfcGF0aCwKKwkJCQkJCSBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQkJa2ZyZWUodG1wX3BhdGgpOworCisJCQkvKiBCQiBmaXggdXAgaW5vZGUgZXRjLiAqLworCQl9IGVsc2UgaWYgKHJjKSB7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lmc0luZm87CisJCV9fdTMyIHR5cGUgPSBsZTMyX3RvX2NwdShmaW5kRGF0YS5UeXBlKTsKKwkJX191NjQgbnVtX29mX2J5dGVzID0gbGU2NF90b19jcHUoZmluZERhdGEuTnVtT2ZCeXRlcyk7CisJCV9fdTY0IGVuZF9vZl9maWxlID0gbGU2NF90b19jcHUoZmluZERhdGEuRW5kT2ZGaWxlKTsKKworCQkvKiBnZXQgbmV3IGlub2RlICovCisJCWlmICgqcGlub2RlID09IE5VTEwpIHsKKwkJCSpwaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCQkJaWYoKnBpbm9kZSA9PSBOVUxMKSAKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCS8qIElzIGFuIGlfaW5vIG9mIHplcm8gbGVnYWw/ICovCisJCQkvKiBBcmUgdGhlcmUgc2FuaXR5IGNoZWNrcyB3ZSBjYW4gdXNlIHRvIGVuc3VyZSB0aGF0CisJCQkgICB0aGUgc2VydmVyIGlzIHJlYWxseSBmaWxsaW5nIGluIHRoYXQgZmllbGQ/ICovCisJCQlpZihjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfU0VSVkVSX0lOVU0pIHsKKwkJCQkoKnBpbm9kZSktPmlfaW5vID0KKwkJCQkJKHVuc2lnbmVkIGxvbmcpZmluZERhdGEuVW5pcXVlSWQ7CisJCQl9IC8qIG5vdGUgaW5vIGluY3JlbWVudGVkIHRvIHVuaXF1ZSBudW0gaW4gbmV3X2lub2RlICovCisJCQlpbnNlcnRfaW5vZGVfaGFzaCgqcGlub2RlKTsKKwkJfQorCisJCWlub2RlID0gKnBpbm9kZTsKKwkJY2lmc0luZm8gPSBDSUZTX0koaW5vZGUpOworCisJCWNGWUkoMSwgKCIgT2xkIHRpbWUgJWxkICIsIGNpZnNJbmZvLT50aW1lKSk7CisJCWNpZnNJbmZvLT50aW1lID0gamlmZmllczsKKwkJY0ZZSSgxLCAoIiBOZXcgdGltZSAlbGQgIiwgY2lmc0luZm8tPnRpbWUpKTsKKwkJLyogdGhpcyBpcyBvayB0byBzZXQgb24gZXZlcnkgaW5vZGUgcmV2YWxpZGF0ZSAqLworCQlhdG9taWNfc2V0KCZjaWZzSW5mby0+aW5Vc2UsMSk7CisKKwkJaW5vZGUtPmlfYXRpbWUgPQorCQkgICAgY2lmc19OVHRpbWVUb1VuaXgobGU2NF90b19jcHUoZmluZERhdGEuTGFzdEFjY2Vzc1RpbWUpKTsKKwkJaW5vZGUtPmlfbXRpbWUgPQorCQkgICAgY2lmc19OVHRpbWVUb1VuaXgobGU2NF90b19jcHUKKwkJCQkoZmluZERhdGEuTGFzdE1vZGlmaWNhdGlvblRpbWUpKTsKKwkJaW5vZGUtPmlfY3RpbWUgPQorCQkgICAgY2lmc19OVHRpbWVUb1VuaXgobGU2NF90b19jcHUoZmluZERhdGEuTGFzdFN0YXR1c0NoYW5nZSkpOworCQlpbm9kZS0+aV9tb2RlID0gbGU2NF90b19jcHUoZmluZERhdGEuUGVybWlzc2lvbnMpOworCQlpZiAodHlwZSA9PSBVTklYX0ZJTEUpIHsKKwkJCWlub2RlLT5pX21vZGUgfD0gU19JRlJFRzsKKwkJfSBlbHNlIGlmICh0eXBlID09IFVOSVhfU1lNTElOSykgeworCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGTE5LOworCQl9IGVsc2UgaWYgKHR5cGUgPT0gVU5JWF9ESVIpIHsKKwkJCWlub2RlLT5pX21vZGUgfD0gU19JRkRJUjsKKwkJfSBlbHNlIGlmICh0eXBlID09IFVOSVhfQ0hBUkRFVikgeworCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGQ0hSOworCQkJaW5vZGUtPmlfcmRldiA9IE1LREVWKGxlNjRfdG9fY3B1KGZpbmREYXRhLkRldk1ham9yKSwKKwkJCQlsZTY0X3RvX2NwdShmaW5kRGF0YS5EZXZNaW5vcikgJiBNSU5PUk1BU0spOworCQl9IGVsc2UgaWYgKHR5cGUgPT0gVU5JWF9CTE9DS0RFVikgeworCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGQkxLOworCQkJaW5vZGUtPmlfcmRldiA9IE1LREVWKGxlNjRfdG9fY3B1KGZpbmREYXRhLkRldk1ham9yKSwKKwkJCQlsZTY0X3RvX2NwdShmaW5kRGF0YS5EZXZNaW5vcikgJiBNSU5PUk1BU0spOworCQl9IGVsc2UgaWYgKHR5cGUgPT0gVU5JWF9GSUZPKSB7CisJCQlpbm9kZS0+aV9tb2RlIHw9IFNfSUZJRk87CisJCX0gZWxzZSBpZiAodHlwZSA9PSBVTklYX1NPQ0tFVCkgeworCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGU09DSzsKKwkJfQorCQlpbm9kZS0+aV91aWQgPSBsZTY0X3RvX2NwdShmaW5kRGF0YS5VaWQpOworCQlpbm9kZS0+aV9naWQgPSBsZTY0X3RvX2NwdShmaW5kRGF0YS5HaWQpOworCQlpbm9kZS0+aV9ubGluayA9IGxlNjRfdG9fY3B1KGZpbmREYXRhLk5saW5rcyk7CisKKwkJaWYoaXNfc2l6ZV9zYWZlX3RvX2NoYW5nZShjaWZzSW5mbykpIHsKKwkJLyogY2FuIG5vdCBzYWZlbHkgY2hhbmdlIHRoZSBmaWxlIHNpemUgaGVyZSBpZiB0aGUKKwkJICAgY2xpZW50IGlzIHdyaXRpbmcgdG8gaXQgZHVlIHRvIHBvdGVudGlhbCByYWNlcyAqLworCisJCQlpX3NpemVfd3JpdGUoaW5vZGUsIGVuZF9vZl9maWxlKTsKKworCQkvKiBibGtzaXplIG5lZWRzIHRvIGJlIG11bHRpcGxlIG9mIHR3by4gU28gc2FmZXIgdG8gZGVmYXVsdCB0bworCQlibGtzaXplIGFuZCBibGtiaXRzIHNldCBpbiBzdXBlcmJsb2NrIHNvIDIqKmJsa2JpdHMgYW5kIGJsa3NpemUKKwkJd2lsbCBtYXRjaCByYXRoZXIgdGhhbiBzZXR0aW5nIHRvOgorCQkocFRjb24tPnNlcy0+c2VydmVyLT5tYXhCdWYgLSBNQVhfQ0lGU19IRFJfU0laRSkgJiAweEZGRkZGRTAwOyovCisKKwkJLyogVGhpcyBzZWVtcyBpbmNyZWRpYmx5IHN0dXBpZCBidXQgaXQgdHVybnMgb3V0IHRoYXQgaV9ibG9ja3MKKwkJICAgaXMgbm90IHJlbGF0ZWQgdG8gKGlfc2l6ZSAvIGlfYmxrc2l6ZSksIGluc3RlYWQgNTEyIGJ5dGUgc2l6ZQorCQkgICBpcyByZXF1aXJlZCBmb3IgY2FsY3VsYXRpbmcgbnVtIGJsb2NrcyAqLworCisJCS8qIDUxMiBieXRlcyAoMioqOSkgaXMgdGhlIGZha2UgYmxvY2tzaXplIHRoYXQgbXVzdCBiZSB1c2VkICovCisJCS8qIGZvciB0aGlzIGNhbGN1bGF0aW9uICovCisJCQlpbm9kZS0+aV9ibG9ja3MgPSAoNTEyIC0gMSArIG51bV9vZl9ieXRlcykgPj4gOTsKKwkJfQorCisJCWlmIChudW1fb2ZfYnl0ZXMgPCBlbmRfb2ZfZmlsZSkKKwkJCWNGWUkoMSwgKCJhbGxvY2F0aW9uIHNpemUgbGVzcyB0aGFuIGVuZCBvZiBmaWxlICIpKTsKKwkJY0ZZSSgxLAorCQkgICAgICgiU2l6ZSAlbGQgYW5kIGJsb2NrcyAlbGQiLAorCQkgICAgICAodW5zaWduZWQgbG9uZykgaW5vZGUtPmlfc2l6ZSwgaW5vZGUtPmlfYmxvY2tzKSk7CisJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCQljRllJKDEsICgiIEZpbGUgaW5vZGUgIikpOworCQkJaW5vZGUtPmlfb3AgPSAmY2lmc19maWxlX2lub2RlX29wczsKKwkJCWlmKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9ESVJFQ1RfSU8pCisJCQkJaW5vZGUtPmlfZm9wID0gJmNpZnNfZmlsZV9kaXJlY3Rfb3BzOworCQkJZWxzZQorCQkJCWlub2RlLT5pX2ZvcCA9ICZjaWZzX2ZpbGVfb3BzOworCQkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZjaWZzX2FkZHJfb3BzOworCQl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWNGWUkoMSwgKCIgRGlyZWN0b3J5IGlub2RlIikpOworCQkJaW5vZGUtPmlfb3AgPSAmY2lmc19kaXJfaW5vZGVfb3BzOworCQkJaW5vZGUtPmlfZm9wID0gJmNpZnNfZGlyX29wczsKKwkJfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCQljRllJKDEsICgiIFN5bWJvbGljIExpbmsgaW5vZGUgIikpOworCQkJaW5vZGUtPmlfb3AgPSAmY2lmc19zeW1saW5rX2lub2RlX29wczsKKwkJLyogdG1wX2lub2RlLT5pX2ZvcCA9ICovIC8qIGRvIG5vdCBuZWVkIHRvIHNldCB0byBhbnl0aGluZyAqLworCQl9IGVsc2UgeworCQkJY0ZZSSgxLCAoIiBJbml0IHNwZWNpYWwgaW5vZGUgIikpOworCQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLAorCQkJCQkgICBpbm9kZS0+aV9yZGV2KTsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKK2ludCBjaWZzX2dldF9pbm9kZV9pbmZvKHN0cnVjdCBpbm9kZSAqKnBpbm9kZSwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzZWFyY2hfcGF0aCwgRklMRV9BTExfSU5GTyAqcGZpbmREYXRhLAorCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB4aWQpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKKwljaGFyICp0bXBfcGF0aDsKKwljaGFyICpidWYgPSBOVUxMOworCisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworCWNGWUkoMSwoIkdldHRpbmcgaW5mbyBvbiAlcyAiLCBzZWFyY2hfcGF0aCkpOworCisJaWYoKHBmaW5kRGF0YSA9PSBOVUxMKSAmJiAoKnBpbm9kZSAhPSBOVUxMKSkgeworCQlpZihDSUZTX0koKnBpbm9kZSktPmNsaWVudENhbkNhY2hlUmVhZCkgeworCQkJY0ZZSSgxLCgiTm8gbmVlZCB0byByZXZhbGlkYXRlIGNhY2hlZCBpbm9kZSBzaXplcyIpKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCS8qIGlmIGZpbGUgaW5mbyBub3QgcGFzc2VkIGluIHRoZW4gZ2V0IGl0IGZyb20gc2VydmVyICovCisJaWYocGZpbmREYXRhID09IE5VTEwpIHsKKwkJYnVmID0ga21hbGxvYyhzaXplb2YoRklMRV9BTExfSU5GTyksIEdGUF9LRVJORUwpOworCQlpZihidWYgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlwZmluZERhdGEgPSAoRklMRV9BTExfSU5GTyAqKWJ1ZjsKKwkJLyogY291bGQgZG8gZmluZCBmaXJzdCBpbnN0ZWFkIGJ1dCB0aGlzIHJldHVybnMgbW9yZSBpbmZvICovCisJCXJjID0gQ0lGU1NNQlFQYXRoSW5mbyh4aWQsIHBUY29uLCBzZWFyY2hfcGF0aCwgcGZpbmREYXRhLAorCQkJICAgICAgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwl9CisJLyogZHVtcF9tZW0oIlxuUVBhdGhJbmZvIHJldHVybiBkYXRhIiwmZmluZERhdGEsIHNpemVvZihmaW5kRGF0YSkpOyAqLworCWlmIChyYykgeworCQlpZiAocmMgPT0gLUVSRU1PVEUpIHsKKwkJCXRtcF9wYXRoID0KKwkJCSAgICBrbWFsbG9jKHN0cm5sZW4KKwkJCQkgICAgKHBUY29uLT50cmVlTmFtZSwKKwkJCQkgICAgIE1BWF9UUkVFX1NJWkUgKyAxKSArCisJCQkJICAgIHN0cm5sZW4oc2VhcmNoX3BhdGgsIE1BWF9QQVRIQ09ORikgKyAxLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJCWlmICh0bXBfcGF0aCA9PSBOVUxMKSB7CisJCQkJa2ZyZWUoYnVmKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKworCQkJc3RybmNweSh0bXBfcGF0aCwgcFRjb24tPnRyZWVOYW1lLCBNQVhfVFJFRV9TSVpFKTsKKwkJCXN0cm5jYXQodG1wX3BhdGgsIHNlYXJjaF9wYXRoLCBNQVhfUEFUSENPTkYpOworCQkJcmMgPSBjb25uZWN0X3RvX2Rmc19wYXRoKHhpZCwgcFRjb24tPnNlcywKKwkJCQkJCSAvKiB0cmVlbmFtZSArICovIHRtcF9wYXRoLAorCQkJCQkJIGNpZnNfc2ItPmxvY2FsX25scyk7CisJCQlrZnJlZSh0bXBfcGF0aCk7CisJCQkvKiBCQiBmaXggdXAgaW5vZGUgZXRjLiAqLworCQl9IGVsc2UgaWYgKHJjKSB7CisJCQlrZnJlZShidWYpOworCQkJcmV0dXJuIHJjOworCQl9CisJfSBlbHNlIHsKKwkJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNJbmZvOworCQlfX3UzMiBhdHRyID0gbGUzMl90b19jcHUocGZpbmREYXRhLT5BdHRyaWJ1dGVzKTsKKworCQkvKiBnZXQgbmV3IGlub2RlICovCisJCWlmICgqcGlub2RlID09IE5VTEwpIHsKKwkJCSpwaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCQkJaWYgKCpwaW5vZGUgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCS8qIElzIGFuIGlfaW5vIG9mIHplcm8gbGVnYWw/IENhbiB3ZSB1c2UgdGhhdCB0byBjaGVjaworCQkJICAgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyByZXR1cm5pbmcgaW5vZGUgbnVtYmVycz8gIEFyZQorCQkJICAgdGhlcmUgb3RoZXIgc2FuaXR5IGNoZWNrcyB3ZSBjYW4gdXNlIHRvIGVuc3VyZSB0aGF0CisJCQkgICB0aGUgc2VydmVyIGlzIHJlYWxseSBmaWxsaW5nIGluIHRoYXQgZmllbGQ/ICovCisKKwkJCS8qIFdlIGNhbiBub3QgdXNlIHRoZSBJbmRleE51bWJlciBmaWVsZCBieSBkZWZhdWx0IGZyb20KKwkJCSAgIFdpbmRvd3Mgb3IgU2FtYmEgKGluIEFMTF9JTkZPIGJ1ZikgYnV0IHdlIGNhbiByZXF1ZXN0CisJCQkgICBpdCBleHBsaWNpdGx5LiAgSXQgbWF5IG5vdCBiZSB1bmlxdWUgcHJlc3VtYWJseSBpZgorCQkJICAgdGhlIHNlcnZlciBoYXMgbXVsdGlwbGUgZGV2aWNlcyBtb3VudGVkIHVuZGVyIG9uZQorCQkJICAgc2hhcmUgKi8KKworCQkJLyogVGhlcmUgbWF5IGJlIGhpZ2hlciBpbmZvIGxldmVscyB0aGF0IHdvcmsgYnV0IGFyZQorCQkJICAgdGhlcmUgV2luZG93cyBzZXJ2ZXIgb3IgbmV0d29yayBhcHBsaWFuY2VzIGZvciB3aGljaAorCQkJICAgSW5kZXhOdW1iZXIgZmllbGQgaXMgbm90IGd1YXJhbnRlZWQgdW5pcXVlPyAqLworCisjaWZkZWYgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMCQkKKwkJCWlmKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9TRVJWRVJfSU5VTSl7CisJCQkJaW50IHJjMSA9IDA7CisJCQkJX191NjQgaW5vZGVfbnVtOworCisJCQkJcmMxID0gQ0lGU0dldFNydklub2RlTnVtYmVyKHhpZCwgcFRjb24sIAorCQkJCQlzZWFyY2hfcGF0aCwgJmlub2RlX251bSwgCisJCQkJCWNpZnNfc2ItPmxvY2FsX25scyk7CisJCQkJaWYocmMxKSB7CisJCQkJCWNGWUkoMSwoIkdldFNydklub2RlTnVtIHJjICVkIiwgcmMxKSk7CisJCQkJCS8qIEJCIEVPUE5PU1VQUCBkaXNhYmxlIFNFUlZFUl9JTlVNPyAqLworCQkJCX0gZWxzZSAvKiBkbyB3ZSBuZWVkIGNhc3Qgb3IgaGFzaCB0byBpbm8/ICovCisJCQkJCSgqcGlub2RlKS0+aV9pbm8gPSBpbm9kZV9udW07CisJCQl9IC8qIGVsc2UgaW5vIGluY3JlbWVudGVkIHRvIHVuaXF1ZSBudW0gaW4gbmV3X2lub2RlKi8KKyNlbmRpZiAvKiBDSUZTX0VYUEVSSU1FTlRBTCAqLworCQkJaW5zZXJ0X2lub2RlX2hhc2goKnBpbm9kZSk7CisJCX0KKwkJaW5vZGUgPSAqcGlub2RlOworCQljaWZzSW5mbyA9IENJRlNfSShpbm9kZSk7CisJCWNpZnNJbmZvLT5jaWZzQXR0cnMgPSBhdHRyOworCQljRllJKDEsICgiIE9sZCB0aW1lICVsZCAiLCBjaWZzSW5mby0+dGltZSkpOworCQljaWZzSW5mby0+dGltZSA9IGppZmZpZXM7CisJCWNGWUkoMSwgKCIgTmV3IHRpbWUgJWxkICIsIGNpZnNJbmZvLT50aW1lKSk7CisKKwkJLyogYmxrc2l6ZSBuZWVkcyB0byBiZSBtdWx0aXBsZSBvZiB0d28uIFNvIHNhZmVyIHRvIGRlZmF1bHQgdG8KKwkJYmxrc2l6ZSBhbmQgYmxrYml0cyBzZXQgaW4gc3VwZXJibG9jayBzbyAyKipibGtiaXRzIGFuZCBibGtzaXplCisJCXdpbGwgbWF0Y2ggcmF0aGVyIHRoYW4gc2V0dGluZyB0bzoKKwkJKHBUY29uLT5zZXMtPnNlcnZlci0+bWF4QnVmIC0gTUFYX0NJRlNfSERSX1NJWkUpICYgMHhGRkZGRkUwMDsqLworCisJCS8qIExpbnV4IGNhbiBub3Qgc3RvcmUgZmlsZSBjcmVhdGlvbiB0aW1lIHVuZm9ydHVuYXRlbHkgc28gd2UgaWdub3JlIGl0ICovCisJCWlub2RlLT5pX2F0aW1lID0KKwkJICAgIGNpZnNfTlR0aW1lVG9Vbml4KGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+TGFzdEFjY2Vzc1RpbWUpKTsKKwkJaW5vZGUtPmlfbXRpbWUgPQorCQkgICAgY2lmc19OVHRpbWVUb1VuaXgobGU2NF90b19jcHUocGZpbmREYXRhLT5MYXN0V3JpdGVUaW1lKSk7CisJCWlub2RlLT5pX2N0aW1lID0KKwkJICAgIGNpZnNfTlR0aW1lVG9Vbml4KGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+Q2hhbmdlVGltZSkpOworCQljRllJKDAsICgiIEF0dHJpYnV0ZXMgY2FtZSBpbiBhcyAweCV4ICIsIGF0dHIpKTsKKworCQkvKiBzZXQgZGVmYXVsdCBtb2RlLiB3aWxsIG92ZXJyaWRlIGZvciBkaXJzIGJlbG93ICovCisJCWlmIChhdG9taWNfcmVhZCgmY2lmc0luZm8tPmluVXNlKSA9PSAwKQorCQkJLyogbmV3IGlub2RlLCBjYW4gc2FmZWx5IHNldCB0aGVzZSBmaWVsZHMgKi8KKwkJCWlub2RlLT5pX21vZGUgPSBjaWZzX3NiLT5tbnRfZmlsZV9tb2RlOworCisvKgkJaWYgKGF0dHIgJiBBVFRSX1JFUEFSU0UpICAqLworCQkvKiBXZSBubyBsb25nZXIgaGFuZGxlIHRoZXNlIGFzIHN5bWxpbmtzIGJlY2F1c2Ugd2UgY291bGQgbm90CisJCSAgIGZvbGxvdyB0aGVtIGR1ZSB0byB0aGUgYWJzb2x1dGUgcGF0aCB3aXRoIGRyaXZlIGxldHRlciAqLworCQlpZiAoYXR0ciAmIEFUVFJfRElSRUNUT1JZKSB7CisJCS8qIG92ZXJyaWRlIGRlZmF1bHQgcGVybXMgc2luY2Ugd2UgZG8gbm90IGRvIGJ5dGUgcmFuZ2UgbG9ja2luZworCQkgICBvbiBkaXJzICovCisJCQlpbm9kZS0+aV9tb2RlID0gY2lmc19zYi0+bW50X2Rpcl9tb2RlOworCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGRElSOworCQl9IGVsc2UgeworCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGUkVHOworCQkJLyogdHJlYXQgdGhlIGRvcyBhdHRyaWJ1dGUgb2YgcmVhZC1vbmx5IGFzIHJlYWQtb25seQorCQkJICAgbW9kZSBlLmcuIDU1NSAqLworCQkJaWYgKGNpZnNJbmZvLT5jaWZzQXR0cnMgJiBBVFRSX1JFQURPTkxZKQorCQkJCWlub2RlLT5pX21vZGUgJj0gfihTX0lXVUdPKTsKKwkJLyogQkIgYWRkIGNvZGUgaGVyZSAtCisJCSAgIHZhbGlkYXRlIGlmIGRldmljZSBvciB3ZWlyZCBzaGFyZSBvciBkZXZpY2UgdHlwZT8gKi8KKwkJfQorCQlpZiAoaXNfc2l6ZV9zYWZlX3RvX2NoYW5nZShjaWZzSW5mbykpIHsKKwkJCS8qIGNhbiBub3Qgc2FmZWx5IGNoYW5nZSB0aGUgZmlsZSBzaXplIGhlcmUgaWYgdGhlCisJCQkgICBjbGllbnQgaXMgd3JpdGluZyB0byBpdCBkdWUgdG8gcG90ZW50aWFsIHJhY2VzICovCisJCQlpX3NpemVfd3JpdGUoaW5vZGUsbGU2NF90b19jcHUocGZpbmREYXRhLT5FbmRPZkZpbGUpKTsKKworCQkJLyogNTEyIGJ5dGVzICgyKio5KSBpcyB0aGUgZmFrZSBibG9ja3NpemUgdGhhdCBtdXN0IGJlCisJCQkgICB1c2VkIGZvciB0aGlzIGNhbGN1bGF0aW9uICovCisJCQlpbm9kZS0+aV9ibG9ja3MgPSAoNTEyIC0gMSArIGxlNjRfdG9fY3B1KAorCQkJCQkgICBwZmluZERhdGEtPkFsbG9jYXRpb25TaXplKSkgPj4gOTsKKwkJfQorCisJCWlub2RlLT5pX25saW5rID0gbGUzMl90b19jcHUocGZpbmREYXRhLT5OdW1iZXJPZkxpbmtzKTsKKworCQkvKiBCQiBmaWxsIGluIHVpZCBhbmQgZ2lkIGhlcmU/IHdpdGggaGVscCBmcm9tIHdpbmJpbmQ/IAorCQkgICBvciByZXRyaWV2ZSBmcm9tIE5URlMgc3RyZWFtIGV4dGVuZGVkIGF0dHJpYnV0ZSAqLworCQlpZiAoYXRvbWljX3JlYWQoJmNpZnNJbmZvLT5pblVzZSkgPT0gMCkgeworCQkJaW5vZGUtPmlfdWlkID0gY2lmc19zYi0+bW50X3VpZDsKKwkJCWlub2RlLT5pX2dpZCA9IGNpZnNfc2ItPm1udF9naWQ7CisJCQkvKiBzZXQgc28gd2UgZG8gbm90IGtlZXAgcmVmcmVzaGluZyB0aGVzZSBmaWVsZHMgd2l0aAorCQkJICAgYmFkIGRhdGEgYWZ0ZXIgdXNlciBoYXMgY2hhbmdlZCB0aGVtIGluIG1lbW9yeSAqLworCQkJYXRvbWljX3NldCgmY2lmc0luZm8tPmluVXNlLDEpOworCQl9CisKKwkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWNGWUkoMSwgKCIgRmlsZSBpbm9kZSAiKSk7CisJCQlpbm9kZS0+aV9vcCA9ICZjaWZzX2ZpbGVfaW5vZGVfb3BzOworCQkJaWYoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX0RJUkVDVF9JTykKKwkJCQlpbm9kZS0+aV9mb3AgPSAmY2lmc19maWxlX2RpcmVjdF9vcHM7CisJCQllbHNlCisJCQkJaW5vZGUtPmlfZm9wID0gJmNpZnNfZmlsZV9vcHM7CisJCQlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJmNpZnNfYWRkcl9vcHM7CisJCX0gZWxzZSBpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQkJY0ZZSSgxLCAoIiBEaXJlY3RvcnkgaW5vZGUgIikpOworCQkJaW5vZGUtPmlfb3AgPSAmY2lmc19kaXJfaW5vZGVfb3BzOworCQkJaW5vZGUtPmlfZm9wID0gJmNpZnNfZGlyX29wczsKKwkJfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCQljRllJKDEsICgiIFN5bWJvbGljIExpbmsgaW5vZGUgIikpOworCQkJaW5vZGUtPmlfb3AgPSAmY2lmc19zeW1saW5rX2lub2RlX29wczsKKwkJfSBlbHNlIHsKKwkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwKKwkJCQkJICAgaW5vZGUtPmlfcmRldik7CisJCX0KKwl9CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGdldHMgcm9vdCBpbm9kZSAqLwordm9pZCBjaWZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbnQgeGlkOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisKKwljaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisJeGlkID0gR2V0WGlkKCk7CisJaWYgKGNpZnNfc2ItPnRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSVgpCisJCWNpZnNfZ2V0X2lub2RlX2luZm9fdW5peCgmaW5vZGUsICIiLCBpbm9kZS0+aV9zYix4aWQpOworCWVsc2UKKwkJY2lmc19nZXRfaW5vZGVfaW5mbygmaW5vZGUsICIiLCBOVUxMLCBpbm9kZS0+aV9zYix4aWQpOworCS8qIGNhbiBub3QgY2FsbCBtYWNybyBGcmVlWGlkIGhlcmUgc2luY2UgaW4gYSB2b2lkIGZ1bmMgKi8KKwlfRnJlZVhpZCh4aWQpOworfQorCitpbnQgY2lmc191bmxpbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGlyZW50cnkpCit7CisJaW50IHJjID0gMDsKKwlpbnQgeGlkOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJY2hhciAqZnVsbF9wYXRoID0gTlVMTDsKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lmc0lub2RlOworCUZJTEVfQkFTSUNfSU5GTyAqcGluZm9fYnVmOworCisJY0ZZSSgxLCAoIiBjaWZzX3VubGluaywgaW5vZGUgPSAweCVwIHdpdGggIiwgaW5vZGUpKTsKKworCXhpZCA9IEdldFhpZCgpOworCisJY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCS8qIFVubGluayBjYW4gYmUgY2FsbGVkIGZyb20gcmVuYW1lIHNvIHdlIGNhbiBub3QgZ3JhYiB0aGUgc2VtIGhlcmUKKwkgICBzaW5jZSB3ZSBkZWFkbG9jayBvdGhlcndpc2UgKi8KKy8qCWRvd24oJmRpcmVudHJ5LT5kX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsqLworCWZ1bGxfcGF0aCA9IGJ1aWxkX3BhdGhfZnJvbV9kZW50cnkoZGlyZW50cnkpOworLyoJdXAoJmRpcmVudHJ5LT5kX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsqLworCWlmIChmdWxsX3BhdGggPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyYyA9IENJRlNTTUJEZWxGaWxlKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgY2lmc19zYi0+bG9jYWxfbmxzKTsKKworCWlmICghcmMpIHsKKwkJZGlyZW50cnktPmRfaW5vZGUtPmlfbmxpbmstLTsKKwl9IGVsc2UgaWYgKHJjID09IC1FTk9FTlQpIHsKKwkJZF9kcm9wKGRpcmVudHJ5KTsKKwl9IGVsc2UgaWYgKHJjID09IC1FVFhUQlNZKSB7CisJCWludCBvcGxvY2sgPSBGQUxTRTsKKwkJX191MTYgbmV0ZmlkOworCisJCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCBwVGNvbiwgZnVsbF9wYXRoLCBGSUxFX09QRU4sIERFTEVURSwKKwkJCQkgQ1JFQVRFX05PVF9ESVIgfCBDUkVBVEVfREVMRVRFX09OX0NMT1NFLAorCQkJCSAmbmV0ZmlkLCAmb3Bsb2NrLCBOVUxMLCBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQlpZiAocmM9PTApIHsKKwkJCUNJRlNTTUJSZW5hbWVPcGVuRmlsZSh4aWQsIHBUY29uLCBuZXRmaWQsIE5VTEwsCisJCQkJCSAgICAgIGNpZnNfc2ItPmxvY2FsX25scyk7CisJCQlDSUZTU01CQ2xvc2UoeGlkLCBwVGNvbiwgbmV0ZmlkKTsKKwkJCWRpcmVudHJ5LT5kX2lub2RlLT5pX25saW5rLS07CisJCX0KKwl9IGVsc2UgaWYgKHJjID09IC1FQUNDRVMpIHsKKwkJLyogdHJ5IG9ubHkgaWYgci9vIGF0dHJpYnV0ZSBzZXQgaW4gbG9jYWwgbG9va3VwIGRhdGE/ICovCisJCXBpbmZvX2J1ZiA9IGttYWxsb2Moc2l6ZW9mKEZJTEVfQkFTSUNfSU5GTyksIEdGUF9LRVJORUwpOworCQlpZiAocGluZm9fYnVmKSB7CisJCQltZW1zZXQocGluZm9fYnVmLCAwLCBzaXplb2YoRklMRV9CQVNJQ19JTkZPKSk7CisJCQkvKiBBVFRSUyBzZXQgdG8gbm9ybWFsIGNsZWFycyByL28gYml0ICovCisJCQlwaW5mb19idWYtPkF0dHJpYnV0ZXMgPSBjcHVfdG9fbGUzMihBVFRSX05PUk1BTCk7CisJCQlpZiAoIShwVGNvbi0+c2VzLT5mbGFncyAmIENJRlNfU0VTX05UNCkpCisJCQkJcmMgPSBDSUZTU01CU2V0VGltZXMoeGlkLCBwVGNvbiwgZnVsbF9wYXRoLAorCQkJCQkJICAgICBwaW5mb19idWYsCisJCQkJCQkgICAgIGNpZnNfc2ItPmxvY2FsX25scyk7CisJCQllbHNlCisJCQkJcmMgPSAtRU9QTk9UU1VQUDsKKworCQkJaWYgKHJjID09IC1FT1BOT1RTVVBQKSB7CisJCQkJaW50IG9wbG9jayA9IEZBTFNFOworCQkJCV9fdTE2IG5ldGZpZDsKKwkJCS8qCXJjID0gQ0lGU1NNQlNldEF0dHJMZWdhY3koeGlkLCBwVGNvbiwKKwkJCQkJCQkgIGZ1bGxfcGF0aCwKKwkJCQkJCQkgIChfX3UxNilBVFRSX05PUk1BTCwKKwkJCQkJCQkgIGNpZnNfc2ItPmxvY2FsX25scyk7IAorCQkJICAgRm9yIHNvbWUgc3RyYW5nZSByZWFzb24gaXQgc2VlbXMgdGhhdCBOVDQgZWF0cyB0aGUKKwkJCSAgIG9sZCBzZXRhdHRyIGNhbGwgd2l0aG91dCBhY3R1YWxseSBzZXR0aW5nIHRoZQorCQkJICAgYXR0cmlidXRlcyBzbyBvbiB0byB0aGUgdGhpcmQgYXR0ZW1wdGVkIHdvcmthcm91bmQKKwkJCSAgICovCisKKwkJCS8qIEJCIGNvdWxkIHNjYW4gdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBpdCBvcGVuCisJCQkgICBhbmQgcGFzcyBpbiBwaWQgb2Ygb3BlbmVyIHRvIGZ1bmN0aW9uICovCisJCQkJcmMgPSBDSUZTU01CT3Blbih4aWQsIHBUY29uLCBmdWxsX3BhdGgsCisJCQkJCQkgRklMRV9PUEVOLCBTWU5DSFJPTklaRSB8CisJCQkJCQkgRklMRV9XUklURV9BVFRSSUJVVEVTLCAwLAorCQkJCQkJICZuZXRmaWQsICZvcGxvY2ssIE5VTEwsCisJCQkJCQkgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwkJCQlpZiAocmM9PTApIHsKKwkJCQkJcmMgPSBDSUZTU01CU2V0RmlsZVRpbWVzKHhpZCwgcFRjb24sCisJCQkJCQkJCSBwaW5mb19idWYsCisJCQkJCQkJCSBuZXRmaWQpOworCQkJCQlDSUZTU01CQ2xvc2UoeGlkLCBwVGNvbiwgbmV0ZmlkKTsKKwkJCQl9CisJCQl9CisJCQlrZnJlZShwaW5mb19idWYpOworCQl9CisJCWlmIChyYz09MCkgeworCQkJcmMgPSBDSUZTU01CRGVsRmlsZSh4aWQsIHBUY29uLCBmdWxsX3BhdGgsCisJCQkJCSAgICBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQkJaWYgKCFyYykgeworCQkJCWRpcmVudHJ5LT5kX2lub2RlLT5pX25saW5rLS07CisJCQl9IGVsc2UgaWYgKHJjID09IC1FVFhUQlNZKSB7CisJCQkJaW50IG9wbG9jayA9IEZBTFNFOworCQkJCV9fdTE2IG5ldGZpZDsKKworCQkJCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCBwVGNvbiwgZnVsbF9wYXRoLAorCQkJCQkJIEZJTEVfT1BFTiwgREVMRVRFLAorCQkJCQkJIENSRUFURV9OT1RfRElSIHwKKwkJCQkJCSBDUkVBVEVfREVMRVRFX09OX0NMT1NFLAorCQkJCQkJICZuZXRmaWQsICZvcGxvY2ssIE5VTEwsCisJCQkJCQkgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwkJCQlpZiAocmM9PTApIHsKKwkJCQkJQ0lGU1NNQlJlbmFtZU9wZW5GaWxlKHhpZCwgcFRjb24sCisJCQkJCQluZXRmaWQsIE5VTEwsCisJCQkJCQljaWZzX3NiLT5sb2NhbF9ubHMpOworCQkJCQlDSUZTU01CQ2xvc2UoeGlkLCBwVGNvbiwgbmV0ZmlkKTsKKwkJICAgICAgICAgICAgICAgICAgICAgICAgZGlyZW50cnktPmRfaW5vZGUtPmlfbmxpbmstLTsKKwkJCQl9CisJCQkvKiBCQiBpZiByYyA9IC1FVFhUQlVTWSBnb3RvIHRoZSByZW5hbWUgbG9naWMgQkIgKi8KKwkJCX0KKwkJfQorCX0KKwljaWZzSW5vZGUgPSBDSUZTX0koZGlyZW50cnktPmRfaW5vZGUpOworCWNpZnNJbm9kZS0+dGltZSA9IDA7CS8qIHdpbGwgZm9yY2UgcmV2YWxpZGF0ZSB0byBnZXQgaW5mbyB3aGVuCisJCQkJICAgbmVlZGVkICovCisJZGlyZW50cnktPmRfaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0KKwkJY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKwljaWZzSW5vZGUgPSBDSUZTX0koaW5vZGUpOworCWNpZnNJbm9kZS0+dGltZSA9IDA7CS8qIGZvcmNlIHJldmFsaWRhdGUgb2YgZGlyIGFzIHdlbGwgKi8KKworCWtmcmVlKGZ1bGxfcGF0aCk7CisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworaW50IGNpZnNfbWtkaXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGlyZW50cnksIGludCBtb2RlKQoreworCWludCByYyA9IDA7CisJaW50IHhpZDsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uOworCWNoYXIgKmZ1bGxfcGF0aCA9IE5VTEw7CisJc3RydWN0IGlub2RlICpuZXdpbm9kZSA9IE5VTEw7CisKKwljRllJKDEsICgiSW4gY2lmc19ta2RpciwgbW9kZSA9IDB4JXggaW5vZGUgPSAweCVwICIsIG1vZGUsIGlub2RlKSk7CisKKwl4aWQgPSBHZXRYaWQoKTsKKworCWNpZnNfc2IgPSBDSUZTX1NCKGlub2RlLT5pX3NiKTsKKwlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisKKwlkb3duKCZpbm9kZS0+aV9zYi0+c192ZnNfcmVuYW1lX3NlbSk7CisJZnVsbF9wYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShkaXJlbnRyeSk7CisJdXAoJmlub2RlLT5pX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlpZiAoZnVsbF9wYXRoID09IE5VTEwpIHsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogQkIgYWRkIHNldHRpbmcgdGhlIGVxdWl2YWxlbnQgb2YgbW9kZSB2aWEgQ3JlYXRlWCB3L0FDTHMgKi8KKwlyYyA9IENJRlNTTUJNa0Rpcih4aWQsIHBUY29uLCBmdWxsX3BhdGgsIGNpZnNfc2ItPmxvY2FsX25scyk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJjaWZzX21rZGlyIHJldHVybmVkIDB4JXggIiwgcmMpKTsKKwkJZF9kcm9wKGRpcmVudHJ5KTsKKwl9IGVsc2UgeworCQlpbm9kZS0+aV9ubGluaysrOworCQlpZiAocFRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSVgpCisJCQlyYyA9IGNpZnNfZ2V0X2lub2RlX2luZm9fdW5peCgmbmV3aW5vZGUsIGZ1bGxfcGF0aCwKKwkJCQkJCSAgICAgIGlub2RlLT5pX3NiLHhpZCk7CisJCWVsc2UKKwkJCXJjID0gY2lmc19nZXRfaW5vZGVfaW5mbygmbmV3aW5vZGUsIGZ1bGxfcGF0aCwgTlVMTCwKKwkJCQkJCSBpbm9kZS0+aV9zYix4aWQpOworCisJCWRpcmVudHJ5LT5kX29wID0gJmNpZnNfZGVudHJ5X29wczsKKwkJZF9pbnN0YW50aWF0ZShkaXJlbnRyeSwgbmV3aW5vZGUpOworCQlpZiAoZGlyZW50cnktPmRfaW5vZGUpCisJCQlkaXJlbnRyeS0+ZF9pbm9kZS0+aV9ubGluayA9IDI7CisJCWlmIChjaWZzX3NiLT50Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklYKQorCQkJaWYoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1NFVF9VSUQpIHsKKwkJCQlDSUZTU01CVW5peFNldFBlcm1zKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwKKwkJCQkJCSAgICBtb2RlLAorCQkJCQkJICAgIChfX3U2NCljdXJyZW50LT5ldWlkLAorCQkJCQkJICAgIChfX3U2NCljdXJyZW50LT5lZ2lkLAorCQkJCQkJICAgIDAgLyogZGV2X3QgKi8sCisJCQkJCQkgICAgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwkJCX0gZWxzZSB7CisJCQkJQ0lGU1NNQlVuaXhTZXRQZXJtcyh4aWQsIHBUY29uLCBmdWxsX3BhdGgsCisJCQkJCQkgICAgbW9kZSwgKF9fdTY0KS0xLAorCQkJCQkJICAgIChfX3U2NCktMSwgMCAvKiBkZXZfdCAqLywKKwkJCQkJCSAgICBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQkJfQorCQllbHNlIHsKKwkJCS8qIEJCIHRvIGJlIGltcGxlbWVudGVkIHZpYSBXaW5kb3dzIHNlY3J0eSBkZXNjcmlwdG9ycworCQkJICAgZWcgQ0lGU1NNQldpblNldFBlcm1zKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgbW9kZSwKKwkJCQkJCSAtMSwgLTEsIGxvY2FsX25scyk7ICovCisJCX0KKwl9CisJa2ZyZWUoZnVsbF9wYXRoKTsKKwlGcmVlWGlkKHhpZCk7CisJcmV0dXJuIHJjOworfQorCitpbnQgY2lmc19ybWRpcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSkKK3sKKwlpbnQgcmMgPSAwOworCWludCB4aWQ7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwljaGFyICpmdWxsX3BhdGggPSBOVUxMOworCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzSW5vZGU7CisKKwljRllJKDEsICgiIGNpZnNfcm1kaXIsIGlub2RlID0gMHglcCB3aXRoICIsIGlub2RlKSk7CisKKwl4aWQgPSBHZXRYaWQoKTsKKworCWNpZnNfc2IgPSBDSUZTX1NCKGlub2RlLT5pX3NiKTsKKwlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisKKwlkb3duKCZpbm9kZS0+aV9zYi0+c192ZnNfcmVuYW1lX3NlbSk7CisJZnVsbF9wYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShkaXJlbnRyeSk7CisJdXAoJmlub2RlLT5pX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlpZiAoZnVsbF9wYXRoID09IE5VTEwpIHsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyYyA9IENJRlNTTUJSbURpcih4aWQsIHBUY29uLCBmdWxsX3BhdGgsIGNpZnNfc2ItPmxvY2FsX25scyk7CisKKwlpZiAoIXJjKSB7CisJCWlub2RlLT5pX25saW5rLS07CisJCWlfc2l6ZV93cml0ZShkaXJlbnRyeS0+ZF9pbm9kZSwwKTsKKwkJZGlyZW50cnktPmRfaW5vZGUtPmlfbmxpbmsgPSAwOworCX0KKworCWNpZnNJbm9kZSA9IENJRlNfSShkaXJlbnRyeS0+ZF9pbm9kZSk7CisJY2lmc0lub2RlLT50aW1lID0gMDsJLyogZm9yY2UgcmV2YWxpZGF0ZSB0byBnbyBnZXQgaW5mbyB3aGVuCisJCQkJICAgbmVlZGVkICovCisJZGlyZW50cnktPmRfaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0KKwkJY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKworCWtmcmVlKGZ1bGxfcGF0aCk7CisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworaW50IGNpZnNfcmVuYW1lKHN0cnVjdCBpbm9kZSAqc291cmNlX2lub2RlLCBzdHJ1Y3QgZGVudHJ5ICpzb3VyY2VfZGlyZW50cnksCisJc3RydWN0IGlub2RlICp0YXJnZXRfaW5vZGUsIHN0cnVjdCBkZW50cnkgKnRhcmdldF9kaXJlbnRyeSkKK3sKKwljaGFyICpmcm9tTmFtZTsKKwljaGFyICp0b05hbWU7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYl9zb3VyY2U7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYl90YXJnZXQ7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJaW50IHhpZDsKKwlpbnQgcmMgPSAwOworCisJeGlkID0gR2V0WGlkKCk7CisKKwljaWZzX3NiX3RhcmdldCA9IENJRlNfU0IodGFyZ2V0X2lub2RlLT5pX3NiKTsKKwljaWZzX3NiX3NvdXJjZSA9IENJRlNfU0Ioc291cmNlX2lub2RlLT5pX3NiKTsKKwlwVGNvbiA9IGNpZnNfc2Jfc291cmNlLT50Y29uOworCisJaWYgKHBUY29uICE9IGNpZnNfc2JfdGFyZ2V0LT50Y29uKSB7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FWERFVjsJLyogQkIgYWN0dWFsbHkgY291bGQgYmUgYWxsb3dlZCBpZiBzYW1lIHNlcnZlciwKKwkJCQkgICBidXQgZGlmZmVyZW50IHNoYXJlLgorCQkJCSAgIE1pZ2h0IGV2ZW50dWFsbHkgYWRkIHN1cHBvcnQgZm9yIHRoaXMgKi8KKwl9CisKKwkvKiB3ZSBhbHJlYWR5ICBoYXZlIHRoZSByZW5hbWUgc2VtIHNvIHdlIGRvIG5vdCBuZWVkIHRvIGdyYWIgaXQgYWdhaW4KKwkgICBoZXJlIHRvIHByb3RlY3QgdGhlIHBhdGggaW50ZWdyaXR5ICovCisJZnJvbU5hbWUgPSBidWlsZF9wYXRoX2Zyb21fZGVudHJ5KHNvdXJjZV9kaXJlbnRyeSk7CisJdG9OYW1lID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeSh0YXJnZXRfZGlyZW50cnkpOworCWlmICgoZnJvbU5hbWUgPT0gTlVMTCkgfHwgKHRvTmFtZSA9PSBOVUxMKSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gY2lmc19yZW5hbWVfZXhpdDsKKwl9CisKKwlyYyA9IENJRlNTTUJSZW5hbWUoeGlkLCBwVGNvbiwgZnJvbU5hbWUsIHRvTmFtZSwKKwkJCSAgIGNpZnNfc2Jfc291cmNlLT5sb2NhbF9ubHMpOworCWlmIChyYyA9PSAtRUVYSVNUKSB7CisJCS8qIGNoZWNrIGlmIHRoZXkgYXJlIHRoZSBzYW1lIGZpbGUgYmVjYXVzZSByZW5hbWUgb2YgaGFyZGxpbmtlZAorCQkgICBmaWxlcyBpcyBhIG5vb3AgKi8KKwkJRklMRV9VTklYX0JBU0lDX0lORk8gKmluZm9fYnVmX3NvdXJjZTsKKwkJRklMRV9VTklYX0JBU0lDX0lORk8gKmluZm9fYnVmX3RhcmdldDsKKworCQlpbmZvX2J1Zl9zb3VyY2UgPQorCQkJa21hbGxvYygyICogc2l6ZW9mKEZJTEVfVU5JWF9CQVNJQ19JTkZPKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChpbmZvX2J1Zl9zb3VyY2UgIT0gTlVMTCkgeworCQkJaW5mb19idWZfdGFyZ2V0ID0gaW5mb19idWZfc291cmNlICsgMTsKKwkJCXJjID0gQ0lGU1NNQlVuaXhRUGF0aEluZm8oeGlkLCBwVGNvbiwgZnJvbU5hbWUsCisJCQkJaW5mb19idWZfc291cmNlLCBjaWZzX3NiX3NvdXJjZS0+bG9jYWxfbmxzKTsKKwkJCWlmIChyYyA9PSAwKSB7CisJCQkJcmMgPSBDSUZTU01CVW5peFFQYXRoSW5mbyh4aWQsIHBUY29uLCB0b05hbWUsCisJCQkJCQlpbmZvX2J1Zl90YXJnZXQsCisJCQkJCQljaWZzX3NiX3RhcmdldC0+bG9jYWxfbmxzKTsKKwkJCX0KKwkJCWlmICgocmMgPT0gMCkgJiYKKwkJCSAgICAoaW5mb19idWZfc291cmNlLT5VbmlxdWVJZCA9PQorCQkJICAgICBpbmZvX2J1Zl90YXJnZXQtPlVuaXF1ZUlkKSkgeworCQkJLyogZG8gbm90IHJlbmFtZSBzaW5jZSB0aGUgZmlsZXMgYXJlIGhhcmRsaW5rZWQgd2hpY2gKKwkJCSAgIGlzIGEgbm9vcCAqLworCQkJfSBlbHNlIHsKKwkJCS8qIHdlIGVpdGhlciBjYW4gbm90IHRlbGwgdGhlIGZpbGVzIGFyZSBoYXJkbGlua2VkCisJCQkgICAoYXMgd2l0aCBXaW5kb3dzIHNlcnZlcnMpIG9yIGZpbGVzIGFyZSBub3QKKwkJCSAgIGhhcmRsaW5rZWQgc28gZGVsZXRlIHRoZSB0YXJnZXQgbWFudWFsbHkgYmVmb3JlCisJCQkgICByZW5hbWluZyB0byBmb2xsb3cgUE9TSVggcmF0aGVyIHRoYW4gV2luZG93cworCQkJICAgc2VtYW50aWNzICovCisJCQkJY2lmc191bmxpbmsodGFyZ2V0X2lub2RlLCB0YXJnZXRfZGlyZW50cnkpOworCQkJCXJjID0gQ0lGU1NNQlJlbmFtZSh4aWQsIHBUY29uLCBmcm9tTmFtZSwKKwkJCQkJCSAgIHRvTmFtZSwKKwkJCQkJCSAgIGNpZnNfc2Jfc291cmNlLT5sb2NhbF9ubHMpOworCQkJfQorCQkJa2ZyZWUoaW5mb19idWZfc291cmNlKTsKKwkJfSAvKiBpZiB3ZSBjYW4gbm90IGdldCBtZW1vcnkganVzdCBsZWF2ZSByYyBhcyBFRVhJU1QgKi8KKwl9CisKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoInJlbmFtZSByYyAlZCIsIHJjKSk7CisJfQorCisJaWYgKChyYyA9PSAtRUlPKSB8fCAocmMgPT0gLUVFWElTVCkpIHsKKwkJaW50IG9wbG9jayA9IEZBTFNFOworCQlfX3UxNiBuZXRmaWQ7CisKKwkJLyogQkIgRklYTUUgSXMgR2VuZXJpYyBSZWFkIGNvcnJlY3QgZm9yIHJlbmFtZT8gKi8KKwkJLyogaWYgcmVuYW1pbmcgZGlyZWN0b3J5IC0gd2Ugc2hvdWxkIG5vdCBzYXkgQ1JFQVRFX05PVF9ESVIsCisJCSAgIG5lZWQgdG8gdGVzdCByZW5hbWluZyBvcGVuIGRpcmVjdG9yeSwgYWxzbyBHRU5FUklDX1JFQUQKKwkJICAgbWlnaHQgbm90IHJpZ2h0IGJlIHJpZ2h0IGFjY2VzcyB0byByZXF1ZXN0ICovCisJCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCBwVGNvbiwgZnJvbU5hbWUsIEZJTEVfT1BFTiwgR0VORVJJQ19SRUFELAorCQkJCSBDUkVBVEVfTk9UX0RJUiwgJm5ldGZpZCwgJm9wbG9jaywgTlVMTCwKKwkJCQkgY2lmc19zYl9zb3VyY2UtPmxvY2FsX25scyk7CisJCWlmIChyYz09MCkgeworCQkJQ0lGU1NNQlJlbmFtZU9wZW5GaWxlKHhpZCwgcFRjb24sIG5ldGZpZCwgdG9OYW1lLAorCQkJCQkgICAgICBjaWZzX3NiX3NvdXJjZS0+bG9jYWxfbmxzKTsKKwkJCUNJRlNTTUJDbG9zZSh4aWQsIHBUY29uLCBuZXRmaWQpOworCQl9CisJfQorCitjaWZzX3JlbmFtZV9leGl0OgorCWtmcmVlKGZyb21OYW1lKTsKKwlrZnJlZSh0b05hbWUpOworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBjaWZzX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqZGlyZW50cnkpCit7CisJaW50IHhpZDsKKwlpbnQgcmMgPSAwOworCWNoYXIgKmZ1bGxfcGF0aDsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOworCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzSW5vZGU7CisJbG9mZl90IGxvY2FsX3NpemU7CisJc3RydWN0IHRpbWVzcGVjIGxvY2FsX210aW1lOworCWludCBpbnZhbGlkYXRlX2lub2RlID0gRkFMU0U7CisKKwlpZiAoZGlyZW50cnktPmRfaW5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwljaWZzSW5vZGUgPSBDSUZTX0koZGlyZW50cnktPmRfaW5vZGUpOworCisJaWYgKGNpZnNJbm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCS8qIG5vIHNlbnNlIHJldmFsaWRhdGluZyBpbm9kZSBpbmZvIG9uIGZpbGUgdGhhdCBubyBvbmUgY2FuIHdyaXRlICovCisJaWYgKENJRlNfSShkaXJlbnRyeS0+ZF9pbm9kZSktPmNsaWVudENhbkNhY2hlUmVhZCkKKwkJcmV0dXJuIHJjOworCisJeGlkID0gR2V0WGlkKCk7CisKKwljaWZzX3NiID0gQ0lGU19TQihkaXJlbnRyeS0+ZF9zYik7CisKKwkvKiBjYW4gbm90IHNhZmVseSBncmFiIHRoZSByZW5hbWUgc2VtIGhlcmUgaWYgcmVuYW1lIGNhbGxzIHJldmFsaWRhdGUKKwkgICBzaW5jZSB0aGF0IHdvdWxkIGRlYWRsb2NrICovCisJZnVsbF9wYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShkaXJlbnRyeSk7CisJaWYgKGZ1bGxfcGF0aCA9PSBOVUxMKSB7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNGWUkoMSwgKCJSZXZhbGlkYXRlOiAlcyBpbm9kZSAweCVwIGNvdW50ICVkIGRlbnRyeTogMHglcCBkX3RpbWUgJWxkICIKKwkJICJqaWZmaWVzICVsZCIsIGZ1bGxfcGF0aCwgZGlyZW50cnktPmRfaW5vZGUsCisJCSBkaXJlbnRyeS0+ZF9pbm9kZS0+aV9jb3VudC5jb3VudGVyLCBkaXJlbnRyeSwKKwkJIGRpcmVudHJ5LT5kX3RpbWUsIGppZmZpZXMpKTsKKworCWlmIChjaWZzSW5vZGUtPnRpbWUgPT0gMCkgeworCQkvKiB3YXMgc2V0IHRvIHplcm8gcHJldmlvdXNseSB0byBmb3JjZSByZXZhbGlkYXRlICovCisJfSBlbHNlIGlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBjaWZzSW5vZGUtPnRpbWUgKyBIWikgJiYKKwkJICAgbG9va3VwQ2FjaGVFbmFibGVkKSB7CisJCWlmICgoU19JU1JFRyhkaXJlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSA9PSAwKSB8fAorCQkgICAgKGRpcmVudHJ5LT5kX2lub2RlLT5pX25saW5rID09IDEpKSB7CisJCQlrZnJlZShmdWxsX3BhdGgpOworCQkJRnJlZVhpZCh4aWQpOworCQkJcmV0dXJuIHJjOworCQl9IGVsc2UgeworCQkJY0ZZSSgxLCAoIkhhdmUgdG8gcmV2YWxpZGF0ZSBmaWxlIGR1ZSB0byBoYXJkbGlua3MiKSk7CisJCX0KKwl9CisKKwkvKiBzYXZlIG10aW1lIGFuZCBzaXplICovCisJbG9jYWxfbXRpbWUgPSBkaXJlbnRyeS0+ZF9pbm9kZS0+aV9tdGltZTsKKwlsb2NhbF9zaXplID0gZGlyZW50cnktPmRfaW5vZGUtPmlfc2l6ZTsKKworCWlmIChjaWZzX3NiLT50Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklYKSB7CisJCXJjID0gY2lmc19nZXRfaW5vZGVfaW5mb191bml4KCZkaXJlbnRyeS0+ZF9pbm9kZSwgZnVsbF9wYXRoLAorCQkJCQkgICAgICBkaXJlbnRyeS0+ZF9zYix4aWQpOworCQlpZiAocmMpIHsKKwkJCWNGWUkoMSwgKCJlcnJvciBvbiBnZXR0aW5nIHJldmFsaWRhdGUgaW5mbyAlZCIsIHJjKSk7CisvKgkJCWlmIChyYyAhPSAtRU5PRU5UKQorCQkJCXJjID0gMDsgKi8JLyogQkIgc2hvdWxkIHdlIGNhY2hlIGluZm8gb24KKwkJCQkJCSAgIGNlcnRhaW4gZXJyb3JzPyAqLworCQl9CisJfSBlbHNlIHsKKwkJcmMgPSBjaWZzX2dldF9pbm9kZV9pbmZvKCZkaXJlbnRyeS0+ZF9pbm9kZSwgZnVsbF9wYXRoLCBOVUxMLAorCQkJCQkgZGlyZW50cnktPmRfc2IseGlkKTsKKwkJaWYgKHJjKSB7CisJCQljRllJKDEsICgiZXJyb3Igb24gZ2V0dGluZyByZXZhbGlkYXRlIGluZm8gJWQiLCByYykpOworLyoJCQlpZiAocmMgIT0gLUVOT0VOVCkKKwkJCQlyYyA9IDA7ICovCS8qIEJCIHNob3VsZCB3ZSBjYWNoZSBpbmZvIG9uCisJCQkJCQkgICBjZXJ0YWluIGVycm9ycz8gKi8KKwkJfQorCX0KKwkvKiBzaG91bGQgd2UgcmVtYXAgY2VydGFpbiBlcnJvcnMsIGFjY2VzcyBkZW5pZWQ/LCB0byB6ZXJvICovCisKKwkvKiBpZiBub3Qgb3Bsb2NrZWQsIHdlIGludmFsaWRhdGUgaW5vZGUgcGFnZXMgaWYgbXRpbWUgb3IgZmlsZSBzaXplCisJICAgaGFkIGNoYW5nZWQgb24gc2VydmVyICovCisKKwlpZiAodGltZXNwZWNfZXF1YWwoJmxvY2FsX210aW1lLCZkaXJlbnRyeS0+ZF9pbm9kZS0+aV9tdGltZSkgJiYgCisJICAgIChsb2NhbF9zaXplID09IGRpcmVudHJ5LT5kX2lub2RlLT5pX3NpemUpKSB7CisJCWNGWUkoMSwgKCJjaWZzX3JldmFsaWRhdGUgLSBpbm9kZSB1bmNoYW5nZWQiKSk7CisJfSBlbHNlIHsKKwkJLyogZmlsZSBtYXkgaGF2ZSBjaGFuZ2VkIG9uIHNlcnZlciAqLworCQlpZiAoY2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQpIHsKKwkJCS8qIG5vIG5lZWQgdG8gaW52YWxpZGF0ZSBpbm9kZSBwYWdlcyBzaW5jZSB3ZSB3ZXJlIHRoZQorCQkJICAgb25seSBvbmVzIHdobyBjb3VsZCBoYXZlIG1vZGlmaWVkIHRoZSBmaWxlIGFuZCB0aGUKKwkJCSAgIHNlcnZlciBjb3B5IGlzIHN0YWxlciB0aGFuIG91cnMgKi8KKwkJfSBlbHNlIHsKKwkJCWludmFsaWRhdGVfaW5vZGUgPSBUUlVFOworCQl9CisJfQorCisJLyogY2FuIG5vdCBncmFiIHRoaXMgc2VtIHNpbmNlIGtlcm5lbCBmaWxlc3lzIGxvY2tpbmcgZG9jdW1lbnRhdGlvbgorCSAgIGluZGljYXRlcyBpX3NlbSBtYXkgYmUgdGFrZW4gYnkgdGhlIGtlcm5lbCBvbiBsb29rdXAgYW5kIHJlbmFtZQorCSAgIHdoaWNoIGNvdWxkIGRlYWRsb2NrIGlmIHdlIGdyYWIgdGhlIGlfc2VtIGhlcmUgYXMgd2VsbCAqLworLyoJZG93bigmZGlyZW50cnktPmRfaW5vZGUtPmlfc2VtKTsqLworCS8qIG5lZWQgdG8gd3JpdGUgb3V0IGRpcnR5IHBhZ2VzIGhlcmUgICovCisJaWYgKGRpcmVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcpIHsKKwkJLyogZG8gd2UgbmVlZCB0byBsb2NrIGlub2RlIHVudGlsIGFmdGVyIGludmFsaWRhdGUgY29tcGxldGVzCisJCSAgIGJlbG93PyAqLworCQlmaWxlbWFwX2ZkYXRhd3JpdGUoZGlyZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZyk7CisJfQorCWlmIChpbnZhbGlkYXRlX2lub2RlKSB7CisJCWlmIChkaXJlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nKQorCQkJZmlsZW1hcF9mZGF0YXdhaXQoZGlyZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZyk7CisJCS8qIG1heSBldmVudHVhbGx5IGhhdmUgdG8gZG8gdGhpcyBmb3Igb3BlbiBmaWxlcyB0b28gKi8KKwkJaWYgKGxpc3RfZW1wdHkoJihjaWZzSW5vZGUtPm9wZW5GaWxlTGlzdCkpKSB7CisJCQkvKiBIYXMgY2hhbmdlZCBvbiBzZXJ2ZXIgLSBmbHVzaCByZWFkIGFoZWFkIHBhZ2VzICovCisJCQljRllJKDEsICgiSW52YWxpZGF0aW5nIHJlYWQgYWhlYWQgZGF0YSBvbiAiCisJCQkJICJjbG9zZWQgZmlsZSIpKTsKKwkJCWludmFsaWRhdGVfcmVtb3RlX2lub2RlKGRpcmVudHJ5LT5kX2lub2RlKTsKKwkJfQorCX0KKy8qCXVwKCZkaXJlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOyAqLworCQorCWtmcmVlKGZ1bGxfcGF0aCk7CisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworaW50IGNpZnNfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCXN0cnVjdCBrc3RhdCAqc3RhdCkKK3sKKwlpbnQgZXJyID0gY2lmc19yZXZhbGlkYXRlKGRlbnRyeSk7CisJaWYgKCFlcnIpCisJCWdlbmVyaWNfZmlsbGF0dHIoZGVudHJ5LT5kX2lub2RlLCBzdGF0KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGNpZnNfdHJ1bmNhdGVfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IGZyb20pCit7CisJcGdvZmZfdCBpbmRleCA9IGZyb20gPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBvZmZzZXQgPSBmcm9tICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCXN0cnVjdCBwYWdlICpwYWdlOworCWNoYXIgKmthZGRyOworCWludCByYyA9IDA7CisKKwlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4KTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJbWVtc2V0KGthZGRyICsgb2Zmc2V0LCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQpOworCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJcmV0dXJuIHJjOworfQorCitpbnQgY2lmc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRpcmVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHJzKQoreworCWludCB4aWQ7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwljaGFyICpmdWxsX3BhdGggPSBOVUxMOworCWludCByYyA9IC1FQUNDRVM7CisJaW50IGZvdW5kID0gRkFMU0U7CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqb3Blbl9maWxlID0gTlVMTDsKKwlGSUxFX0JBU0lDX0lORk8gdGltZV9idWY7CisJaW50IHNldF90aW1lID0gRkFMU0U7CisJX191NjQgbW9kZSA9IDB4RkZGRkZGRkZGRkZGRkZGRlVMTDsKKwlfX3U2NCB1aWQgPSAweEZGRkZGRkZGRkZGRkZGRkZVTEw7CisJX191NjQgZ2lkID0gMHhGRkZGRkZGRkZGRkZGRkZGVUxMOworCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzSW5vZGU7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCisJeGlkID0gR2V0WGlkKCk7CisKKwljRllJKDEsICgiIEluIGNpZnNfc2V0YXR0ciwgbmFtZSA9ICVzIGF0dHJzLT5pYXZhbGlkIDB4JXggIiwKKwkJIGRpcmVudHJ5LT5kX25hbWUubmFtZSwgYXR0cnMtPmlhX3ZhbGlkKSk7CisJY2lmc19zYiA9IENJRlNfU0IoZGlyZW50cnktPmRfaW5vZGUtPmlfc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCWRvd24oJmRpcmVudHJ5LT5kX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlmdWxsX3BhdGggPSBidWlsZF9wYXRoX2Zyb21fZGVudHJ5KGRpcmVudHJ5KTsKKwl1cCgmZGlyZW50cnktPmRfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCWlmIChmdWxsX3BhdGggPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljaWZzSW5vZGUgPSBDSUZTX0koZGlyZW50cnktPmRfaW5vZGUpOworCisJLyogQkIgY2hlY2sgaWYgd2UgbmVlZCB0byByZWZyZXNoIGlub2RlIGZyb20gc2VydmVyIG5vdyA/IEJCICovCisKKwkvKiBuZWVkIHRvIGZsdXNoIGRhdGEgYmVmb3JlIGNoYW5naW5nIGZpbGUgc2l6ZSBvbiBzZXJ2ZXIgKi8KKwlmaWxlbWFwX2ZkYXRhd3JpdGUoZGlyZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZyk7CisJZmlsZW1hcF9mZGF0YXdhaXQoZGlyZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZyk7CisKKwlpZiAoYXR0cnMtPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CisJCXJlYWRfbG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJCS8qIFRvIGF2b2lkIHNwdXJpb3VzIG9wbG9jayBicmVha3MgZnJvbSBzZXJ2ZXIsIGluIHRoZSBjYXNlIG9mCisJCSAgIGlub2RlcyB0aGF0IHdlIGFscmVhZHkgaGF2ZSBvcGVuLCBhdm9pZCBkb2luZyBwYXRoIGJhc2VkCisJCSAgIHNldHRpbmcgb2YgZmlsZSBzaXplIGlmIHdlIGNhbiBkbyBpdCBieSBoYW5kbGUuCisJCSAgIFRoaXMga2VlcHMgb3VyIGNhY2hpbmcgdG9rZW4gKG9wbG9jaykgYW5kIGF2b2lkcyB0aW1lb3V0cworCQkgICB3aGVuIHRoZSBsb2NhbCBvcGxvY2sgYnJlYWsgdGFrZXMgbG9uZ2VyIHRvIGZsdXNoCisJCSAgIHdyaXRlYmVoaW5kIGRhdGEgdGhhbiB0aGUgU01CIHRpbWVvdXQgZm9yIHRoZSBTZXRQYXRoSW5mbworCQkgICByZXF1ZXN0IHdvdWxkIGFsbG93ICovCisJCWxpc3RfZm9yX2VhY2godG1wLCAmY2lmc0lub2RlLT5vcGVuRmlsZUxpc3QpIHsKKwkJCW9wZW5fZmlsZSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2lmc0ZpbGVJbmZvLAorCQkJCQkgICAgICAgZmxpc3QpOworCQkJLyogV2UgY2hlY2sgaWYgZmlsZSBpcyBvcGVuIGZvciB3cml0aW5nIGZpcnN0ICovCisJCQlpZiAoKG9wZW5fZmlsZS0+cGZpbGUpICYmCisJCQkgICAgKChvcGVuX2ZpbGUtPnBmaWxlLT5mX2ZsYWdzICYgT19SRFdSKSB8fAorCQkJICAgIChvcGVuX2ZpbGUtPnBmaWxlLT5mX2ZsYWdzICYgT19XUk9OTFkpKSkgeworCQkJCWlmIChvcGVuX2ZpbGUtPmludmFsaWRIYW5kbGUgPT0gRkFMU0UpIHsKKwkJCQkJLyogd2UgZm91bmQgYSB2YWxpZCwgd3JpdGVhYmxlIG5ldHdvcmsKKwkJCQkJICAgZmlsZSBoYW5kbGUgdG8gdXNlIHRvIHRyeSB0byBzZXQgdGhlCisJCQkJCSAgIGZpbGUgc2l6ZSAqLworCQkJCQlfX3UxNiBuZmlkID0gb3Blbl9maWxlLT5uZXRmaWQ7CisJCQkJCV9fdTMyIG5waWQgPSBvcGVuX2ZpbGUtPnBpZDsKKwkJCQkJcmVhZF91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCQkJCQlmb3VuZCA9IFRSVUU7CisJCQkJCXJjID0gQ0lGU1NNQlNldEZpbGVTaXplKHhpZCwgcFRjb24sCisJCQkJCQlhdHRycy0+aWFfc2l6ZSwgbmZpZCwgbnBpZCwKKwkJCQkJCUZBTFNFKTsKKwkJCQkJY0ZZSSgxLCAoIlNldEZpbGVTaXplIGJ5IGhhbmRsZSAiCisJCQkJCQkgIihzZXRhdHRycykgcmMgPSAlZCIsIHJjKSk7CisJCQkJCS8qIERvIG5vdCBuZWVkIHJlb3BlbiBhbmQgcmV0cnkgb24KKwkJCQkJICAgRUFHQUlOIHNpbmNlIHdlIHdpbGwgcmV0cnkgYnkKKwkJCQkJICAgcGF0aG5hbWUgYmVsb3cgKi8KKworCQkJCQkvKiBub3cgdGhhdCB3ZSBmb3VuZCBvbmUgdmFsaWQgZmlsZQorCQkJCQkgICBoYW5kbGUgbm8gc2Vuc2UgY29udGludWluZyB0byBsb29wCisJCQkJCSAgIHRyeWluZyBvdGhlcnMsIHNvIGJyZWFrIGhlcmUgKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChmb3VuZCA9PSBGQUxTRSkKKwkJCXJlYWRfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKworCQlpZiAocmMgIT0gMCkgeworCQkJLyogU2V0IGZpbGUgc2l6ZSBieSBwYXRobmFtZSByYXRoZXIgdGhhbiBieSBoYW5kbGUKKwkJCSAgIGVpdGhlciBiZWNhdXNlIG5vIHZhbGlkLCB3cml0ZWFibGUgZmlsZSBoYW5kbGUgZm9yCisJCQkgICBpdCB3YXMgZm91bmQgb3IgYmVjYXVzZSB0aGVyZSB3YXMgYW4gZXJyb3Igc2V0dGluZworCQkJICAgaXQgYnkgaGFuZGxlICovCisJCQlyYyA9IENJRlNTTUJTZXRFT0YoeGlkLCBwVGNvbiwgZnVsbF9wYXRoLAorCQkJCQkgICBhdHRycy0+aWFfc2l6ZSwgRkFMU0UsCisJCQkJCSAgIGNpZnNfc2ItPmxvY2FsX25scyk7CisJCQljRllJKDEsICgiIFNldEVPRiBieSBwYXRoIChzZXRhdHRycykgcmMgPSAlZCIsIHJjKSk7CisJCX0KKworCQkvKiBTZXJ2ZXIgaXMgb2sgc2V0dGluZyBhbGxvY2F0aW9uIHNpemUgaW1wbGljaXRseSAtIG5vIG5lZWQKKwkJICAgdG8gY2FsbDoKKwkJQ0lGU1NNQlNldEVPRih4aWQsIHBUY29uLCBmdWxsX3BhdGgsIGF0dHJzLT5pYV9zaXplLCBUUlVFLAorCQkJIGNpZnNfc2ItPmxvY2FsX25scyk7CisJCSAgICovCisKKwkJaWYgKHJjID09IDApIHsKKwkJCXJjID0gdm10cnVuY2F0ZShkaXJlbnRyeS0+ZF9pbm9kZSwgYXR0cnMtPmlhX3NpemUpOworCQkJY2lmc190cnVuY2F0ZV9wYWdlKGRpcmVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcsCisJCQkJCSAgIGRpcmVudHJ5LT5kX2lub2RlLT5pX3NpemUpOworCQl9CisJfQorCWlmIChhdHRycy0+aWFfdmFsaWQgJiBBVFRSX1VJRCkgeworCQljRllJKDEsICgiIENJRlMgLSBVSUQgY2hhbmdlZCB0byAlZCIsIGF0dHJzLT5pYV91aWQpKTsKKwkJdWlkID0gYXR0cnMtPmlhX3VpZDsKKwkJLyogZW50cnktPnVpZCA9IGNwdV90b19sZTE2KGF0dHItPmlhX3VpZCk7ICovCisJfQorCWlmIChhdHRycy0+aWFfdmFsaWQgJiBBVFRSX0dJRCkgeworCQljRllJKDEsICgiIENJRlMgLSBHSUQgY2hhbmdlZCB0byAlZCIsIGF0dHJzLT5pYV9naWQpKTsKKwkJZ2lkID0gYXR0cnMtPmlhX2dpZDsKKwkJLyogZW50cnktPmdpZCA9IGNwdV90b19sZTE2KGF0dHItPmlhX2dpZCk7ICovCisJfQorCisJdGltZV9idWYuQXR0cmlidXRlcyA9IDA7CisJaWYgKGF0dHJzLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgeworCQljRllJKDEsICgiIENJRlMgLSBNb2RlIGNoYW5nZWQgdG8gMHgleCIsIGF0dHJzLT5pYV9tb2RlKSk7CisJCW1vZGUgPSBhdHRycy0+aWFfbW9kZTsKKwkJLyogZW50cnktPm1vZGUgPSBjcHVfdG9fbGUxNihhdHRyLT5pYV9tb2RlKTsgKi8KKwl9CisKKwlpZiAoKGNpZnNfc2ItPnRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSVgpCisJICAgICYmIChhdHRycy0+aWFfdmFsaWQgJiAoQVRUUl9NT0RFIHwgQVRUUl9HSUQgfCBBVFRSX1VJRCkpKQorCQlyYyA9IENJRlNTTUJVbml4U2V0UGVybXMoeGlkLCBwVGNvbiwgZnVsbF9wYXRoLCBtb2RlLCB1aWQsIGdpZCwKKwkJCQkJIDAgLyogZGV2X3QgKi8sIGNpZnNfc2ItPmxvY2FsX25scyk7CisJZWxzZSBpZiAoYXR0cnMtPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CisJCWlmICgobW9kZSAmIFNfSVdVR08pID09IDApIC8qIG5vdCB3cml0ZWFibGUgKi8geworCQkJaWYgKChjaWZzSW5vZGUtPmNpZnNBdHRycyAmIEFUVFJfUkVBRE9OTFkpID09IDApCisJCQkJdGltZV9idWYuQXR0cmlidXRlcyA9CisJCQkJCWNwdV90b19sZTMyKGNpZnNJbm9kZS0+Y2lmc0F0dHJzIHwKKwkJCQkJCSAgICBBVFRSX1JFQURPTkxZKTsKKwkJfSBlbHNlIGlmICgobW9kZSAmIFNfSVdVR08pID09IFNfSVdVR08pIHsKKwkJCWlmIChjaWZzSW5vZGUtPmNpZnNBdHRycyAmIEFUVFJfUkVBRE9OTFkpCisJCQkJdGltZV9idWYuQXR0cmlidXRlcyA9CisJCQkJCWNwdV90b19sZTMyKGNpZnNJbm9kZS0+Y2lmc0F0dHJzICYKKwkJCQkJCSAgICAofkFUVFJfUkVBRE9OTFkpKTsKKwkJfQorCQkvKiBCQiB0byBiZSBpbXBsZW1lbnRlZCAtCisJCSAgIHZpYSBXaW5kb3dzIHNlY3VyaXR5IGRlc2NyaXB0b3JzIG9yIHN0cmVhbXMgKi8KKwkJLyogQ0lGU1NNQldpblNldFBlcm1zKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgbW9kZSwgdWlkLCBnaWQsCisJCQkJICAgICAgY2lmc19zYi0+bG9jYWxfbmxzKTsgKi8KKwl9CisKKwlpZiAoYXR0cnMtPmlhX3ZhbGlkICYgQVRUUl9BVElNRSkgeworCQlzZXRfdGltZSA9IFRSVUU7CisJCXRpbWVfYnVmLkxhc3RBY2Nlc3NUaW1lID0KKwkJICAgIGNwdV90b19sZTY0KGNpZnNfVW5peFRpbWVUb05UKGF0dHJzLT5pYV9hdGltZSkpOworCX0gZWxzZQorCQl0aW1lX2J1Zi5MYXN0QWNjZXNzVGltZSA9IDA7CisKKwlpZiAoYXR0cnMtPmlhX3ZhbGlkICYgQVRUUl9NVElNRSkgeworCQlzZXRfdGltZSA9IFRSVUU7CisJCXRpbWVfYnVmLkxhc3RXcml0ZVRpbWUgPQorCQkgICAgY3B1X3RvX2xlNjQoY2lmc19Vbml4VGltZVRvTlQoYXR0cnMtPmlhX210aW1lKSk7CisJfSBlbHNlCisJCXRpbWVfYnVmLkxhc3RXcml0ZVRpbWUgPSAwOworCisJaWYgKGF0dHJzLT5pYV92YWxpZCAmIEFUVFJfQ1RJTUUpIHsKKwkJc2V0X3RpbWUgPSBUUlVFOworCQljRllJKDEsICgiIENJRlMgLSBDVElNRSBjaGFuZ2VkICIpKTsgLyogQkIgcHJvYmFibHkgbm8gbmVlZCAqLworCQl0aW1lX2J1Zi5DaGFuZ2VUaW1lID0KKwkJICAgIGNwdV90b19sZTY0KGNpZnNfVW5peFRpbWVUb05UKGF0dHJzLT5pYV9jdGltZSkpOworCX0gZWxzZQorCQl0aW1lX2J1Zi5DaGFuZ2VUaW1lID0gMDsKKworCWlmIChzZXRfdGltZSB8fCB0aW1lX2J1Zi5BdHRyaWJ1dGVzKSB7CisJCS8qIEJCIHdoYXQgaWYgc2V0dGluZyBvbmUgYXR0cmlidXRlIGZhaWxzIChzdWNoIGFzIHNpemUpIGJ1dAorCQkgICB0aW1lIHNldHRpbmcgd29ya3M/ICovCisJCXRpbWVfYnVmLkNyZWF0aW9uVGltZSA9IDA7CS8qIGRvIG5vdCBjaGFuZ2UgKi8KKwkJLyogSW4gdGhlIGZ1dHVyZSB3ZSBzaG91bGQgZXhwZXJpbWVudCAtIHRyeSBzZXR0aW5nIHRpbWVzdGFtcHMKKwkJICAgdmlhIEhhbmRsZSAoU2V0RmlsZUluZm8pIGluc3RlYWQgb2YgYnkgcGF0aCAqLworCQlpZiAoIShwVGNvbi0+c2VzLT5mbGFncyAmIENJRlNfU0VTX05UNCkpCisJCQlyYyA9IENJRlNTTUJTZXRUaW1lcyh4aWQsIHBUY29uLCBmdWxsX3BhdGgsICZ0aW1lX2J1ZiwKKwkJCQkJICAgICBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQllbHNlCisJCQlyYyA9IC1FT1BOT1RTVVBQOworCisJCWlmIChyYyA9PSAtRU9QTk9UU1VQUCkgeworCQkJaW50IG9wbG9jayA9IEZBTFNFOworCQkJX191MTYgbmV0ZmlkOworCisJCQljRllJKDEsICgiY2FsbGluZyBTZXRGaWxlSW5mbyBzaW5jZSBTZXRQYXRoSW5mbyBmb3IgIgorCQkJCSAidGltZXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHNlcnZlciIpKTsKKwkJCS8qIEJCIHdlIGNvdWxkIHNjYW4gdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBpdCBvcGVuCisJCQkgICBhbmQgcGFzcyBpbiBwaWQgb2Ygb3BlbmVyIHRvIGZ1bmN0aW9uICovCisJCQlyYyA9IENJRlNTTUJPcGVuKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgRklMRV9PUEVOLAorCQkJCQkgU1lOQ0hST05JWkUgfCBGSUxFX1dSSVRFX0FUVFJJQlVURVMsCisJCQkJCSBDUkVBVEVfTk9UX0RJUiwgJm5ldGZpZCwgJm9wbG9jaywKKwkJCQkJIE5VTEwsIGNpZnNfc2ItPmxvY2FsX25scyk7CisJCQlpZiAocmM9PTApIHsKKwkJCQlyYyA9IENJRlNTTUJTZXRGaWxlVGltZXMoeGlkLCBwVGNvbiwgJnRpbWVfYnVmLAorCQkJCQkJCSBuZXRmaWQpOworCQkJCUNJRlNTTUJDbG9zZSh4aWQsIHBUY29uLCBuZXRmaWQpOworCQkJfSBlbHNlIHsKKwkJCS8qIEJCIEZvciBldmVuIG9sZGVyIHNlcnZlcnMgd2UgY291bGQgY29udmVydCB0aW1lX2J1ZgorCQkJICAgaW50byBvbGQgRE9TIHN0eWxlIHdoaWNoIHVzZXMgdHdvIHNlY29uZAorCQkJICAgZ3JhbnVsYXJpdHkgKi8KKworCQkJLyogcmMgPSBDSUZTU01CU2V0VGltZXNMZWdhY3koeGlkLCBwVGNvbiwgZnVsbF9wYXRoLAorICAgICAgICAJICAgICAgICAJCSZ0aW1lX2J1ZiwgY2lmc19zYi0+bG9jYWxfbmxzKTsgKi8KKwkJCX0KKwkJfQorCX0KKworCS8qIGRvIG5vdCBuZWVkIGxvY2FsIGNoZWNrIHRvIGlub2RlX2NoZWNrX29rIHNpbmNlIHRoZSBzZXJ2ZXIgZG9lcworCSAgIHRoYXQgKi8KKwlpZiAoIXJjKQorCQlyYyA9IGlub2RlX3NldGF0dHIoZGlyZW50cnktPmRfaW5vZGUsIGF0dHJzKTsKKwlrZnJlZShmdWxsX3BhdGgpOworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgY2lmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwljRllJKDEsICgiSW4gY2lmc19kZWxldGVfaW5vZGUsIGlub2RlID0gMHglcCAiLCBpbm9kZSkpOworCS8qIG1heSBoYXZlIHRvIGFkZCBiYWNrIGluIGlmIGFuZCB3aGVuIHNhZmUgZGlzdHJpYnV0ZWQgY2FjaGluZyBvZgorCSAgIGRpcmVjdG9yaWVzIGFkZGVkIGUuZy4gdmlhIEZpbmROb3RpZnkgKi8KK30KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvaW9jdGwuYyBiL2ZzL2NpZnMvaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGI4ZTIwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9pb2N0bC5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiAgIGZzL2NpZnMvaW9jdGwuYworICoKKyAqICAgdmZzIG9wZXJhdGlvbnMgdGhhdCBkZWFsIHdpdGggaW8gY29udHJvbAorICoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwNQorICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDJfZnMuaD4KKyNpbmNsdWRlICJjaWZzcGR1LmgiCisjaW5jbHVkZSAiY2lmc2dsb2IuaCIKKyNpbmNsdWRlICJjaWZzcHJvdG8uaCIKKyNpbmNsdWRlICJjaWZzX2RlYnVnLmgiCisKK2ludCBjaWZzX2lvY3RsIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlcCwgCisJCXVuc2lnbmVkIGludCBjb21tYW5kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmMgPSAtRU5PVFRZOyAvKiBzdHJhbmdlIGVycm9yIC0gYnV0IHRoZSBwcmVjZWRlbnQgKi8KKyNpZmRlZiBDT05GSUdfQ0lGU19QT1NJWAorCWNGWUkoMSwoImlvY3RsIGZpbGUgJXAgIGNtZCAldSAgYXJnICVsdSIsZmlsZXAsY29tbWFuZCxhcmcpKTsKKwlzd2l0Y2goY29tbWFuZCkgeworCQljYXNlIEVYVDJfSU9DX0dFVEZMQUdTOgorCQkJY0ZZSSgxLCgiZ2V0IGZsYWdzIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKSk7CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCWNhc2UgRVhUMl9JT0NfU0VURkxBR1M6CisJCQljRllJKDEsKCJzZXQgZmxhZ3Mgbm90IGltcGxlbWVudGVkIHlldCIpKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJZGVmYXVsdDoKKwkJCWNGWUkoMSwoInVuc3VwcG9ydGVkIGlvY3RsIikpOworCQkJcmV0dXJuIHJjOworCX0KKyNlbmRpZiAvKiBDT05GSUdfQ0lGU19QT1NJWCAqLworCXJldHVybiByYzsKK30gCmRpZmYgLS1naXQgYS9mcy9jaWZzL2xpbmsuYyBiL2ZzL2NpZnMvbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NTU4MTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL2xpbmsuYwpAQCAtMCwwICsxLDMyOCBAQAorLyoKKyAqICAgZnMvY2lmcy9saW5rLmMKKyAqCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDIsMjAwMworICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgImNpZnNmcy5oIgorI2luY2x1ZGUgImNpZnNwZHUuaCIKKyNpbmNsdWRlICJjaWZzZ2xvYi5oIgorI2luY2x1ZGUgImNpZnNwcm90by5oIgorI2luY2x1ZGUgImNpZnNfZGVidWcuaCIKKyNpbmNsdWRlICJjaWZzX2ZzX3NiLmgiCisKK2ludAorY2lmc19oYXJkbGluayhzdHJ1Y3QgZGVudHJ5ICpvbGRfZmlsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkgICAgICBzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSkKK3sKKwlpbnQgcmMgPSAtRUFDQ0VTOworCWludCB4aWQ7CisJY2hhciAqZnJvbU5hbWUgPSBOVUxMOworCWNoYXIgKnRvTmFtZSA9IE5VTEw7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYl90YXJnZXQ7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNJbm9kZTsKKworCXhpZCA9IEdldFhpZCgpOworCisJY2lmc19zYl90YXJnZXQgPSBDSUZTX1NCKGlub2RlLT5pX3NiKTsKKwlwVGNvbiA9IGNpZnNfc2JfdGFyZ2V0LT50Y29uOworCisvKiBObyBuZWVkIHRvIGNoZWNrIGZvciBjcm9zcyBkZXZpY2UgbGlua3Mgc2luY2Ugc2VydmVyIHdpbGwgZG8gdGhhdAorICAgQkIgbm90ZSBERlMgY2FzZSBpbiBmdXR1cmUgdGhvdWdoICh3aGVuIHdlIG1heSBoYXZlIHRvIGNoZWNrKSAqLworCisJZG93bigmaW5vZGUtPmlfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCWZyb21OYW1lID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShvbGRfZmlsZSk7CisJdG9OYW1lID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShkaXJlbnRyeSk7CisJdXAoJmlub2RlLT5pX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlpZigoZnJvbU5hbWUgPT0gTlVMTCkgfHwgKHRvTmFtZSA9PSBOVUxMKSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gY2lmc19obF9leGl0OworCX0KKworCWlmIChjaWZzX3NiX3RhcmdldC0+dGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKKwkJcmMgPSBDSUZTVW5peENyZWF0ZUhhcmRMaW5rKHhpZCwgcFRjb24sIGZyb21OYW1lLCB0b05hbWUsCisJCQkJCSAgICBjaWZzX3NiX3RhcmdldC0+bG9jYWxfbmxzKTsKKwllbHNlIHsKKwkJcmMgPSBDSUZTQ3JlYXRlSGFyZExpbmsoeGlkLCBwVGNvbiwgZnJvbU5hbWUsIHRvTmFtZSwKKwkJCQkJY2lmc19zYl90YXJnZXQtPmxvY2FsX25scyk7CisJCWlmKHJjID09IC1FSU8pCisJCQlyYyA9IC1FT1BOT1RTVVBQOyAgCisJfQorCisvKiBpZiAoIXJjKSAgICAgKi8KKwl7CisJCS8qICAgcmVuZXdfcGFyZW50YWxfdGltZXN0YW1wcyhvbGRfZmlsZSk7CisJCSAgIGlub2RlLT5pX25saW5rKys7CisJCSAgIG1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkgICBkX2luc3RhbnRpYXRlKGRpcmVudHJ5LCBpbm9kZSk7ICovCisJCS8qIEJCIGFkZCBjYWxsIHRvIGVpdGhlciBtYXJrIGlub2RlIGRpcnR5IG9yIHJlZnJlc2ggaXRzIGRhdGEgYW5kIHRpbWVzdGFtcCB0byBjdXJyZW50IHRpbWUgKi8KKwl9CisJZF9kcm9wKGRpcmVudHJ5KTsJLyogZm9yY2UgbmV3IGxvb2t1cCBmcm9tIHNlcnZlciAqLworCWNpZnNJbm9kZSA9IENJRlNfSShvbGRfZmlsZS0+ZF9pbm9kZSk7CisJY2lmc0lub2RlLT50aW1lID0gMDsJLyogd2lsbCBmb3JjZSByZXZhbGlkYXRlIHRvIGdvIGdldCBpbmZvIHdoZW4gbmVlZGVkICovCisKK2NpZnNfaGxfZXhpdDoKKwlpZiAoZnJvbU5hbWUpCisJCWtmcmVlKGZyb21OYW1lKTsKKwlpZiAodG9OYW1lKQorCQlrZnJlZSh0b05hbWUpOworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorY2lmc19mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRpcmVudHJ5LT5kX2lub2RlOworCWludCByYyA9IC1FQUNDRVM7CisJaW50IHhpZDsKKwljaGFyICpmdWxsX3BhdGggPSBOVUxMOworCWNoYXIgKiB0YXJnZXRfcGF0aCA9IEVSUl9QVFIoLUVOT01FTSk7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKworCXhpZCA9IEdldFhpZCgpOworCisJZG93bigmZGlyZW50cnktPmRfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCWZ1bGxfcGF0aCA9IGJ1aWxkX3BhdGhfZnJvbV9kZW50cnkoZGlyZW50cnkpOworCXVwKCZkaXJlbnRyeS0+ZF9zYi0+c192ZnNfcmVuYW1lX3NlbSk7CisKKwlpZiAoIWZ1bGxfcGF0aCkKKwkJZ290byBvdXRfbm9fZnJlZTsKKworCWNGWUkoMSwgKCJGdWxsIHBhdGg6ICVzIGlub2RlID0gMHglcCIsIGZ1bGxfcGF0aCwgaW5vZGUpKTsKKwljaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworCXRhcmdldF9wYXRoID0ga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0YXJnZXRfcGF0aCkgeworCQl0YXJnZXRfcGF0aCA9IEVSUl9QVFIoLUVOT01FTSk7CisJCWdvdG8gb3V0OworCX0KKworLyogQkIgYWRkIHJlYWQgcmVwYXJzZSBwb2ludCBzeW1saW5rIGNvZGUgYW5kIFVuaXggZXh0ZW5zaW9ucyBzeW1saW5rIGNvZGUgaGVyZSBCQiAqLworCWlmIChwVGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKKwkJcmMgPSBDSUZTU01CVW5peFF1ZXJ5U3ltTGluayh4aWQsIHBUY29uLCBmdWxsX3BhdGgsCisJCQkJCSAgICAgdGFyZ2V0X3BhdGgsCisJCQkJCSAgICAgUEFUSF9NQVgtMSwKKwkJCQkJICAgICBjaWZzX3NiLT5sb2NhbF9ubHMpOworCWVsc2UgeworCQkvKiByYyA9IENJRlNTTUJRdWVyeVJlcGFyc2VMaW5rSW5mbyAqLworCQkvKiBCQiBBZGQgY29kZSB0byBRdWVyeSBSZXBhcnNlUG9pbnQgaW5mbyAqLworCQkvKiBCQiBBZGQgTUFDIHN0eWxlIHhzeW1saW5rIGNoZWNrIGhlcmUgaWYgZW5hYmxlZCAqLworCX0KKworCWlmIChyYyA9PSAwKSB7CisKKy8qIEJCIEFkZCBzcGVjaWFsIGNhc2UgY2hlY2sgZm9yIFNhbWJhIERGUyBzeW1saW5rcyAqLworCisJCXRhcmdldF9wYXRoW1BBVEhfTUFYLTFdID0gMDsKKwl9IGVsc2UgeworCQlrZnJlZSh0YXJnZXRfcGF0aCk7CisJCXRhcmdldF9wYXRoID0gRVJSX1BUUihyYyk7CisJfQorCitvdXQ6CisJa2ZyZWUoZnVsbF9wYXRoKTsKK291dF9ub19mcmVlOgorCUZyZWVYaWQoeGlkKTsKKwluZF9zZXRfbGluayhuZCwgdGFyZ2V0X3BhdGgpOworCXJldHVybiAwOworfQorCitpbnQKK2NpZnNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSwgY29uc3QgY2hhciAqc3ltbmFtZSkKK3sKKwlpbnQgcmMgPSAtRU9QTk9UU1VQUDsKKwlpbnQgeGlkOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJY2hhciAqZnVsbF9wYXRoID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKm5ld2lub2RlID0gTlVMTDsKKworCXhpZCA9IEdldFhpZCgpOworCisJY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCWRvd24oJmlub2RlLT5pX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlmdWxsX3BhdGggPSBidWlsZF9wYXRoX2Zyb21fZGVudHJ5KGRpcmVudHJ5KTsKKwl1cCgmaW5vZGUtPmlfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCisJaWYoZnVsbF9wYXRoID09IE5VTEwpIHsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljRllJKDEsICgiRnVsbCBwYXRoOiAlcyAiLCBmdWxsX3BhdGgpKTsKKwljRllJKDEsICgic3ltbmFtZSBpcyAlcyIsIHN5bW5hbWUpKTsKKworCS8qIEJCIHdoYXQgaWYgREZTIGFuZCB0aGlzIHZvbHVtZSBpcyBvbiBkaWZmZXJlbnQgc2hhcmU/IEJCICovCisJaWYgKGNpZnNfc2ItPnRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSVgpCisJCXJjID0gQ0lGU1VuaXhDcmVhdGVTeW1MaW5rKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgc3ltbmFtZSwKKwkJCQkJICAgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwkvKiBlbHNlCisJICAgcmMgPSBDSUZTQ3JlYXRlUmVwYXJzZVN5bUxpbmsoeGlkLCBwVGNvbiwgZnJvbU5hbWUsIHRvTmFtZSxjaWZzX3NiX3RhcmdldC0+bG9jYWxfbmxzKTsgKi8KKworCWlmIChyYyA9PSAwKSB7CisJCWlmIChwVGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKKwkJCXJjID0gY2lmc19nZXRfaW5vZGVfaW5mb191bml4KCZuZXdpbm9kZSwgZnVsbF9wYXRoLAorCQkJCQkJICAgICAgaW5vZGUtPmlfc2IseGlkKTsKKwkJZWxzZQorCQkJcmMgPSBjaWZzX2dldF9pbm9kZV9pbmZvKCZuZXdpbm9kZSwgZnVsbF9wYXRoLCBOVUxMLAorCQkJCQkJIGlub2RlLT5pX3NiLHhpZCk7CisKKwkJaWYgKHJjICE9IDApIHsKKwkJCWNGWUkoMSwKKwkJCSAgICAgKCJDcmVhdGUgc3ltbGluayB3b3JrZWQgYnV0IGdldF9pbm9kZV9pbmZvIGZhaWxlZCB3aXRoIHJjID0gJWQgIiwKKwkJCSAgICAgIHJjKSk7CisJCX0gZWxzZSB7CisJCQlkaXJlbnRyeS0+ZF9vcCA9ICZjaWZzX2RlbnRyeV9vcHM7CisJCQlkX2luc3RhbnRpYXRlKGRpcmVudHJ5LCBuZXdpbm9kZSk7CisJCX0KKwl9CisKKwlpZiAoZnVsbF9wYXRoKQorCQlrZnJlZShmdWxsX3BhdGgpOworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorY2lmc19yZWFkbGluayhzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSwgY2hhciBfX3VzZXIgKnBCdWZmZXIsIGludCBidWZsZW4pCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRpcmVudHJ5LT5kX2lub2RlOworCWludCByYyA9IC1FQUNDRVM7CisJaW50IHhpZDsKKwlpbnQgb3Bsb2NrID0gRkFMU0U7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwljaGFyICpmdWxsX3BhdGggPSBOVUxMOworCWNoYXIgKnRtcF9wYXRoID0gIE5VTEw7CisJY2hhciAqIHRtcGJ1ZmZlcjsKKwl1bnNpZ25lZCBjaGFyICogcmVmZXJyYWxzID0gTlVMTDsKKwlpbnQgbnVtX3JlZmVycmFscyA9IDA7CisJaW50IGxlbjsKKwlfX3UxNiBmaWQ7CisKKwl4aWQgPSBHZXRYaWQoKTsKKwljaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworCisvKiBCQiB3b3VsZCBpdCBiZSBzYWZlIGFnYWluc3QgZGVhZGxvY2sgdG8gZ3JhYiB0aGlzIHNlbSAKKyAgICAgIGV2ZW4gdGhvdWdoIHJlbmFtZSBpdHNlbGYgZ3JhYnMgdGhlIHNlbSBhbmQgY2FsbHMgbG9va3VwPyAqLworLyogICAgICAgZG93bigmaW5vZGUtPmlfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOyovCisJZnVsbF9wYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShkaXJlbnRyeSk7CisvKiAgICAgICB1cCgmaW5vZGUtPmlfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOyovCisKKwlpZihmdWxsX3BhdGggPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNGWUkoMSwKKwkgICAgICgiRnVsbCBwYXRoOiAlcyBpbm9kZSA9IDB4JXAgcEJ1ZmZlciA9IDB4JXAgYnVmbGVuID0gJWQiLAorCSAgICAgIGZ1bGxfcGF0aCwgaW5vZGUsIHBCdWZmZXIsIGJ1ZmxlbikpOworCWlmKGJ1ZmxlbiA+IFBBVEhfTUFYKQorCQlsZW4gPSBQQVRIX01BWDsKKwllbHNlCisJCWxlbiA9IGJ1ZmxlbjsKKwl0bXBidWZmZXIgPSBrbWFsbG9jKGxlbixHRlBfS0VSTkVMKTsgICAKKwlpZih0bXBidWZmZXIgPT0gTlVMTCkgeworCQlpZiAoZnVsbF9wYXRoKQorCQkJa2ZyZWUoZnVsbF9wYXRoKTsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKy8qIEJCIGFkZCByZWFkIHJlcGFyc2UgcG9pbnQgc3ltbGluayBjb2RlIGFuZCBVbml4IGV4dGVuc2lvbnMgc3ltbGluayBjb2RlIGhlcmUgQkIgKi8KKwlpZiAoY2lmc19zYi0+dGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKKwkJcmMgPSBDSUZTU01CVW5peFF1ZXJ5U3ltTGluayh4aWQsIHBUY29uLCBmdWxsX3BhdGgsCisJCQkJdG1wYnVmZmVyLAorCQkJCWxlbiAtIDEsCisJCQkJY2lmc19zYi0+bG9jYWxfbmxzKTsKKwllbHNlIHsKKwkJcmMgPSBDSUZTU01CT3Blbih4aWQsIHBUY29uLCBmdWxsX3BhdGgsIEZJTEVfT1BFTiwgR0VORVJJQ19SRUFELAorCQkJCU9QRU5fUkVQQVJTRV9QT0lOVCwmZmlkLCAmb3Bsb2NrLCBOVUxMLCBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQlpZighcmMpIHsKKwkJCXJjID0gQ0lGU1NNQlF1ZXJ5UmVwYXJzZUxpbmtJbmZvKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwKKwkJCQl0bXBidWZmZXIsCisJCQkJbGVuIC0gMSwgCisJCQkJZmlkLAorCQkJCWNpZnNfc2ItPmxvY2FsX25scyk7CisJCQlpZihDSUZTU01CQ2xvc2UoeGlkLCBwVGNvbiwgZmlkKSkgeworCQkJCWNGWUkoMSwoIkVycm9yIGNsb3NpbmcganVuY3Rpb24gcG9pbnQgKG9wZW4gZm9yIGlvY3RsKSIpKTsKKwkJCX0KKwkJCWlmKHJjID09IC1FSU8pIHsKKwkJCQkvKiBRdWVyeSBpZiBERlMgSnVuY3Rpb24gKi8KKwkJCQl0bXBfcGF0aCA9CisJCQkJCWttYWxsb2MoTUFYX1RSRUVfU0laRSArIE1BWF9QQVRIQ09ORiArIDEsCisJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCQlpZiAodG1wX3BhdGgpIHsKKwkJCQkJc3RybmNweSh0bXBfcGF0aCwgcFRjb24tPnRyZWVOYW1lLCBNQVhfVFJFRV9TSVpFKTsKKwkJCQkJc3RybmNhdCh0bXBfcGF0aCwgZnVsbF9wYXRoLCBNQVhfUEFUSENPTkYpOworCQkJCQlyYyA9IGdldF9kZnNfcGF0aCh4aWQsIHBUY29uLT5zZXMsIHRtcF9wYXRoLAorCQkJCQkJY2lmc19zYi0+bG9jYWxfbmxzLCAmbnVtX3JlZmVycmFscywgJnJlZmVycmFscyk7CisJCQkJCWNGWUkoMSwoIkdldCBERlMgZm9yICVzIHJjID0gJWQgIix0bXBfcGF0aCwgcmMpKTsKKwkJCQkJaWYoKG51bV9yZWZlcnJhbHMgPT0gMCkgJiYgKHJjID09IDApKQorCQkJCQkJcmMgPSAtRUFDQ0VTOworCQkJCQllbHNlIHsKKwkJCQkJCWNGWUkoMSwoIm51bSByZWZlcnJhbDogJWQiLG51bV9yZWZlcnJhbHMpKTsKKwkJCQkJCWlmKHJlZmVycmFscykgeworCQkJCQkJCWNGWUkoMSwoInJlZmVycmFsIHN0cmluZzogJXMgIixyZWZlcnJhbHMpKTsKKwkJCQkJCQlzdHJuY3B5KHRtcGJ1ZmZlciwgcmVmZXJyYWxzLCBsZW4tMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmKHJlZmVycmFscykKKwkJCQkJCWtmcmVlKHJlZmVycmFscyk7CisJCQkJCWtmcmVlKHRtcF9wYXRoKTsKK30KKwkJCQkvKiBCQiBhZGQgY29kZSBsaWtlIGVsc2UgZGVjb2RlIHJlZmVycmFscyB0aGVuIG1lbWNweSB0bworCQkJCSAgdG1wYnVmZmVyIGFuZCBmcmVlIHJlZmVycmFscyBzdHJpbmcgYXJyYXkgQkIgKi8KKwkJCX0KKwkJfQorCX0KKwkvKiBCQiBBbnl0aGluZyBlbHNlIHRvIGRvIHRvIGhhbmRsZSByZWN1cnNpdmUgbGlua3M/ICovCisJLyogQkIgU2hvdWxkIHdlIGJlIHVzaW5nIHBhZ2Ugb3BzIGhlcmU/ICovCisKKwkvKiBCQiBudWxsIHRlcm1pbmF0ZSByZXR1cm5lZCBzdHJpbmcgaW4gcEJ1ZmZlcj8gQkIgKi8KKwlpZiAocmMgPT0gMCkgeworCQlyYyA9IHZmc19yZWFkbGluayhkaXJlbnRyeSwgcEJ1ZmZlciwgbGVuLCB0bXBidWZmZXIpOworCQljRllJKDEsCisJCSAgICAgKCJ2ZnNfcmVhZGxpbmsgY2FsbGVkIGZyb20gY2lmc19yZWFkbGluayByZXR1cm5lZCAlZCIsCisJCSAgICAgIHJjKSk7CisJfQorCisJaWYgKHRtcGJ1ZmZlcikgeworCQlrZnJlZSh0bXBidWZmZXIpOworCX0KKwlpZiAoZnVsbF9wYXRoKSB7CisJCWtmcmVlKGZ1bGxfcGF0aCk7CisJfQorCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgY2lmc19wdXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJY2hhciAqcCA9IG5kX2dldF9saW5rKG5kKTsKKwlpZiAoIUlTX0VSUihwKSkKKwkJa2ZyZWUocCk7Cit9CmRpZmYgLS1naXQgYS9mcy9jaWZzL21kNC5jIGIvZnMvY2lmcy9tZDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmQ2MmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9tZDQuYwpAQCAtMCwwICsxLDIwNSBAQAorLyogCisgICBVbml4IFNNQi9OZXRiaW9zIGltcGxlbWVudGF0aW9uLgorICAgVmVyc2lvbiAxLjkuCisgICBhIGltcGxlbWVudGF0aW9uIG9mIE1ENCBkZXNpZ25lZCBmb3IgdXNlIGluIHRoZSBTTUIgYXV0aGVudGljYXRpb24gcHJvdG9jb2wKKyAgIENvcHlyaWdodCAoQykgQW5kcmV3IFRyaWRnZWxsIDE5OTctMTk5OC4KKyAgIE1vZGlmaWVkIGJ5IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKSAyMDAyLTIwMDMKKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgIAorICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlICJjaWZzZW5jcnlwdC5oIgorCisvKiBOT1RFOiBUaGlzIGNvZGUgbWFrZXMgbm8gYXR0ZW1wdCB0byBiZSBmYXN0ISAqLworCitzdGF0aWMgX191MzIKK0YoX191MzIgWCwgX191MzIgWSwgX191MzIgWikKK3sKKwlyZXR1cm4gKFggJiBZKSB8ICgoflgpICYgWik7Cit9CisKK3N0YXRpYyBfX3UzMgorRyhfX3UzMiBYLCBfX3UzMiBZLCBfX3UzMiBaKQoreworCXJldHVybiAoWCAmIFkpIHwgKFggJiBaKSB8IChZICYgWik7Cit9CisKK3N0YXRpYyBfX3UzMgorSChfX3UzMiBYLCBfX3UzMiBZLCBfX3UzMiBaKQoreworCXJldHVybiBYIF4gWSBeIFo7Cit9CisKK3N0YXRpYyBfX3UzMgorbHNoaWZ0KF9fdTMyIHgsIGludCBzKQoreworCXggJj0gMHhGRkZGRkZGRjsKKwlyZXR1cm4gKCh4IDw8IHMpICYgMHhGRkZGRkZGRikgfCAoeCA+PiAoMzIgLSBzKSk7Cit9CisKKyNkZWZpbmUgUk9VTkQxKGEsYixjLGQsayxzKSAoKmEpID0gbHNoaWZ0KCgqYSkgKyBGKCpiLCpjLCpkKSArIFhba10sIHMpCisjZGVmaW5lIFJPVU5EMihhLGIsYyxkLGsscykgKCphKSA9IGxzaGlmdCgoKmEpICsgRygqYiwqYywqZCkgKyBYW2tdICsgKF9fdTMyKTB4NUE4Mjc5OTkscykKKyNkZWZpbmUgUk9VTkQzKGEsYixjLGQsayxzKSAoKmEpID0gbHNoaWZ0KCgqYSkgKyBIKCpiLCpjLCpkKSArIFhba10gKyAoX191MzIpMHg2RUQ5RUJBMSxzKQorCisvKiB0aGlzIGFwcGxpZXMgbWQ0IHRvIDY0IGJ5dGUgY2h1bmtzICovCitzdGF0aWMgdm9pZAorbWRmb3VyNjQoX191MzIgKiBNLCBfX3UzMiAqIEEsIF9fdTMyICpCLCBfX3UzMiAqIEMsIF9fdTMyICpEKQoreworCWludCBqOworCV9fdTMyIEFBLCBCQiwgQ0MsIEREOworCV9fdTMyIFhbMTZdOworCisKKwlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKwkJWFtqXSA9IE1bal07CisKKwlBQSA9ICpBOworCUJCID0gKkI7CisJQ0MgPSAqQzsKKwlERCA9ICpEOworCisJUk9VTkQxKEEsIEIsIEMsIEQsIDAsIDMpOworCVJPVU5EMShELCBBLCBCLCBDLCAxLCA3KTsKKwlST1VORDEoQywgRCwgQSwgQiwgMiwgMTEpOworCVJPVU5EMShCLCBDLCBELCBBLCAzLCAxOSk7CisJUk9VTkQxKEEsIEIsIEMsIEQsIDQsIDMpOworCVJPVU5EMShELCBBLCBCLCBDLCA1LCA3KTsKKwlST1VORDEoQywgRCwgQSwgQiwgNiwgMTEpOworCVJPVU5EMShCLCBDLCBELCBBLCA3LCAxOSk7CisJUk9VTkQxKEEsIEIsIEMsIEQsIDgsIDMpOworCVJPVU5EMShELCBBLCBCLCBDLCA5LCA3KTsKKwlST1VORDEoQywgRCwgQSwgQiwgMTAsIDExKTsKKwlST1VORDEoQiwgQywgRCwgQSwgMTEsIDE5KTsKKwlST1VORDEoQSwgQiwgQywgRCwgMTIsIDMpOworCVJPVU5EMShELCBBLCBCLCBDLCAxMywgNyk7CisJUk9VTkQxKEMsIEQsIEEsIEIsIDE0LCAxMSk7CisJUk9VTkQxKEIsIEMsIEQsIEEsIDE1LCAxOSk7CisKKwlST1VORDIoQSwgQiwgQywgRCwgMCwgMyk7CisJUk9VTkQyKEQsIEEsIEIsIEMsIDQsIDUpOworCVJPVU5EMihDLCBELCBBLCBCLCA4LCA5KTsKKwlST1VORDIoQiwgQywgRCwgQSwgMTIsIDEzKTsKKwlST1VORDIoQSwgQiwgQywgRCwgMSwgMyk7CisJUk9VTkQyKEQsIEEsIEIsIEMsIDUsIDUpOworCVJPVU5EMihDLCBELCBBLCBCLCA5LCA5KTsKKwlST1VORDIoQiwgQywgRCwgQSwgMTMsIDEzKTsKKwlST1VORDIoQSwgQiwgQywgRCwgMiwgMyk7CisJUk9VTkQyKEQsIEEsIEIsIEMsIDYsIDUpOworCVJPVU5EMihDLCBELCBBLCBCLCAxMCwgOSk7CisJUk9VTkQyKEIsIEMsIEQsIEEsIDE0LCAxMyk7CisJUk9VTkQyKEEsIEIsIEMsIEQsIDMsIDMpOworCVJPVU5EMihELCBBLCBCLCBDLCA3LCA1KTsKKwlST1VORDIoQywgRCwgQSwgQiwgMTEsIDkpOworCVJPVU5EMihCLCBDLCBELCBBLCAxNSwgMTMpOworCisJUk9VTkQzKEEsIEIsIEMsIEQsIDAsIDMpOworCVJPVU5EMyhELCBBLCBCLCBDLCA4LCA5KTsKKwlST1VORDMoQywgRCwgQSwgQiwgNCwgMTEpOworCVJPVU5EMyhCLCBDLCBELCBBLCAxMiwgMTUpOworCVJPVU5EMyhBLCBCLCBDLCBELCAyLCAzKTsKKwlST1VORDMoRCwgQSwgQiwgQywgMTAsIDkpOworCVJPVU5EMyhDLCBELCBBLCBCLCA2LCAxMSk7CisJUk9VTkQzKEIsIEMsIEQsIEEsIDE0LCAxNSk7CisJUk9VTkQzKEEsIEIsIEMsIEQsIDEsIDMpOworCVJPVU5EMyhELCBBLCBCLCBDLCA5LCA5KTsKKwlST1VORDMoQywgRCwgQSwgQiwgNSwgMTEpOworCVJPVU5EMyhCLCBDLCBELCBBLCAxMywgMTUpOworCVJPVU5EMyhBLCBCLCBDLCBELCAzLCAzKTsKKwlST1VORDMoRCwgQSwgQiwgQywgMTEsIDkpOworCVJPVU5EMyhDLCBELCBBLCBCLCA3LCAxMSk7CisJUk9VTkQzKEIsIEMsIEQsIEEsIDE1LCAxNSk7CisKKwkqQSArPSBBQTsKKwkqQiArPSBCQjsKKwkqQyArPSBDQzsKKwkqRCArPSBERDsKKworCSpBICY9IDB4RkZGRkZGRkY7CisJKkIgJj0gMHhGRkZGRkZGRjsKKwkqQyAmPSAweEZGRkZGRkZGOworCSpEICY9IDB4RkZGRkZGRkY7CisKKwlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKwkJWFtqXSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5NjQoX191MzIgKiBNLCB1bnNpZ25lZCBjaGFyICppbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlNW2ldID0gKGluW2kgKiA0ICsgM10gPDwgMjQpIHwgKGluW2kgKiA0ICsgMl0gPDwgMTYpIHwKKwkJICAgIChpbltpICogNCArIDFdIDw8IDgpIHwgKGluW2kgKiA0ICsgMF0gPDwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5NCh1bnNpZ25lZCBjaGFyICpvdXQsIF9fdTMyIHgpCit7CisJb3V0WzBdID0geCAmIDB4RkY7CisJb3V0WzFdID0gKHggPj4gOCkgJiAweEZGOworCW91dFsyXSA9ICh4ID4+IDE2KSAmIDB4RkY7CisJb3V0WzNdID0gKHggPj4gMjQpICYgMHhGRjsKK30KKworLyogcHJvZHVjZSBhIG1kNCBtZXNzYWdlIGRpZ2VzdCBmcm9tIGRhdGEgb2YgbGVuZ3RoIG4gYnl0ZXMgKi8KK3ZvaWQKK21kZm91cih1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgbikKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxMjhdOworCV9fdTMyIE1bMTZdOworCV9fdTMyIGIgPSBuICogODsKKwlpbnQgaTsKKwlfX3UzMiBBID0gMHg2NzQ1MjMwMTsKKwlfX3UzMiBCID0gMHhlZmNkYWI4OTsKKwlfX3UzMiBDID0gMHg5OGJhZGNmZTsKKwlfX3UzMiBEID0gMHgxMDMyNTQ3NjsKKworCXdoaWxlIChuID4gNjQpIHsKKwkJY29weTY0KE0sIGluKTsKKwkJbWRmb3VyNjQoTSwmQSwmQiwgJkMsICZEKTsKKwkJaW4gKz0gNjQ7CisJCW4gLT0gNjQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorCQlidWZbaV0gPSAwOworCW1lbWNweShidWYsIGluLCBuKTsKKwlidWZbbl0gPSAweDgwOworCisJaWYgKG4gPD0gNTUpIHsKKwkJY29weTQoYnVmICsgNTYsIGIpOworCQljb3B5NjQoTSwgYnVmKTsKKwkJbWRmb3VyNjQoTSwgJkEsICZCLCAmQywgJkQpOworCX0gZWxzZSB7CisJCWNvcHk0KGJ1ZiArIDEyMCwgYik7CisJCWNvcHk2NChNLCBidWYpOworCQltZGZvdXI2NChNLCAmQSwgJkIsICZDLCAmRCk7CisJCWNvcHk2NChNLCBidWYgKyA2NCk7CisJCW1kZm91cjY0KE0sICZBLCAmQiwgJkMsICZEKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisJCWJ1ZltpXSA9IDA7CisJY29weTY0KE0sIGJ1Zik7CisKKwljb3B5NChvdXQsIEEpOworCWNvcHk0KG91dCArIDQsIEIpOworCWNvcHk0KG91dCArIDgsIEMpOworCWNvcHk0KG91dCArIDEyLCBEKTsKKworCUEgPSBCID0gQyA9IEQgPSAwOworfQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9tZDUuYyBiL2ZzL2NpZnMvbWQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FhMjM0OQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NpZnMvbWQ1LmMKQEAgLTAsMCArMSwzNjMgQEAKKy8qCisgKiBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgTUQ1IG1lc3NhZ2UtZGlnZXN0IGFsZ29yaXRobS4KKyAqIFRoZSBhbGdvcml0aG0gaXMgZHVlIHRvIFJvbiBSaXZlc3QuICBUaGlzIGNvZGUgd2FzCisgKiB3cml0dGVuIGJ5IENvbGluIFBsdW1iIGluIDE5OTMsIG5vIGNvcHlyaWdodCBpcyBjbGFpbWVkLgorICogVGhpcyBjb2RlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluOyBkbyB3aXRoIGl0IHdoYXQgeW91IHdpc2guCisgKgorICogRXF1aXZhbGVudCBjb2RlIGlzIGF2YWlsYWJsZSBmcm9tIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuCisgKiBUaGlzIGNvZGUgaGFzIGJlZW4gdGVzdGVkIGFnYWluc3QgdGhhdCwgYW5kIGlzIGVxdWl2YWxlbnQsCisgKiBleGNlcHQgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBpbmNsdWRlIHR3byBwYWdlcyBvZiBsZWdhbGVzZQorICogd2l0aCBldmVyeSBjb3B5LgorICoKKyAqIFRvIGNvbXB1dGUgdGhlIG1lc3NhZ2UgZGlnZXN0IG9mIGEgY2h1bmsgb2YgYnl0ZXMsIGRlY2xhcmUgYW4KKyAqIE1ENUNvbnRleHQgc3RydWN0dXJlLCBwYXNzIGl0IHRvIE1ENUluaXQsIGNhbGwgTUQ1VXBkYXRlIGFzCisgKiBuZWVkZWQgb24gYnVmZmVycyBmdWxsIG9mIGJ5dGVzLCBhbmQgdGhlbiBjYWxsIE1ENUZpbmFsLCB3aGljaAorICogd2lsbCBmaWxsIGEgc3VwcGxpZWQgMTYtYnl0ZSBhcnJheSB3aXRoIHRoZSBkaWdlc3QuCisgKi8KKworLyogVGhpcyBjb2RlIHNsaWdodGx5IG1vZGlmaWVkIHRvIGZpdCBpbnRvIFNhbWJhIGJ5IAorICAgYWJhcnRsZXRAc2FtYmEub3JnIEp1biAyMDAxIAorICAgYW5kIHRvIGZpdCB0aGUgY2lmcyB2ZnMgYnkgCisgICBTdGV2ZSBGcmVuY2ggc2ZyZW5jaEB1cy5pYm0uY29tICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlICJtZDUuaCIKKworc3RhdGljIHZvaWQgTUQ1VHJhbnNmb3JtKF9fdTMyIGJ1Zls0XSwgX191MzIgY29uc3QgaW5bMTZdKTsKKworLyoKKyAqIE5vdGU6IHRoaXMgY29kZSBpcyBoYXJtbGVzcyBvbiBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLgorICovCitzdGF0aWMgdm9pZAorYnl0ZVJldmVyc2UodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25ncykKK3sKKwlfX3UzMiB0OworCWRvIHsKKwkJdCA9IChfX3UzMikgKCh1bnNpZ25lZCkgYnVmWzNdIDw8IDggfCBidWZbMl0pIDw8IDE2IHwKKwkJICAgICgodW5zaWduZWQpIGJ1ZlsxXSA8PCA4IHwgYnVmWzBdKTsKKwkJKihfX3UzMiAqKSBidWYgPSB0OworCQlidWYgKz0gNDsKKwl9IHdoaWxlICgtLWxvbmdzKTsKK30KKworLyoKKyAqIFN0YXJ0IE1ENSBhY2N1bXVsYXRpb24uICBTZXQgYml0IGNvdW50IHRvIDAgYW5kIGJ1ZmZlciB0byBteXN0ZXJpb3VzCisgKiBpbml0aWFsaXphdGlvbiBjb25zdGFudHMuCisgKi8KK3ZvaWQKK01ENUluaXQoc3RydWN0IE1ENUNvbnRleHQgKmN0eCkKK3sKKwljdHgtPmJ1ZlswXSA9IDB4Njc0NTIzMDE7CisJY3R4LT5idWZbMV0gPSAweGVmY2RhYjg5OworCWN0eC0+YnVmWzJdID0gMHg5OGJhZGNmZTsKKwljdHgtPmJ1ZlszXSA9IDB4MTAzMjU0NzY7CisKKwljdHgtPmJpdHNbMF0gPSAwOworCWN0eC0+Yml0c1sxXSA9IDA7Cit9CisKKy8qCisgKiBVcGRhdGUgY29udGV4dCB0byByZWZsZWN0IHRoZSBjb25jYXRlbmF0aW9uIG9mIGFub3RoZXIgYnVmZmVyIGZ1bGwKKyAqIG9mIGJ5dGVzLgorICovCit2b2lkCitNRDVVcGRhdGUoc3RydWN0IE1ENUNvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciBjb25zdCAqYnVmLCB1bnNpZ25lZCBsZW4pCit7CisJcmVnaXN0ZXIgX191MzIgdDsKKworCS8qIFVwZGF0ZSBiaXRjb3VudCAqLworCisJdCA9IGN0eC0+Yml0c1swXTsKKwlpZiAoKGN0eC0+Yml0c1swXSA9IHQgKyAoKF9fdTMyKSBsZW4gPDwgMykpIDwgdCkKKwkJY3R4LT5iaXRzWzFdKys7CS8qIENhcnJ5IGZyb20gbG93IHRvIGhpZ2ggKi8KKwljdHgtPmJpdHNbMV0gKz0gbGVuID4+IDI5OworCisJdCA9ICh0ID4+IDMpICYgMHgzZjsJLyogQnl0ZXMgYWxyZWFkeSBpbiBzaHNJbmZvLT5kYXRhICovCisKKwkvKiBIYW5kbGUgYW55IGxlYWRpbmcgb2RkLXNpemVkIGNodW5rcyAqLworCisJaWYgKHQpIHsKKwkJdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopIGN0eC0+aW4gKyB0OworCisJCXQgPSA2NCAtIHQ7CisJCWlmIChsZW4gPCB0KSB7CisJCQltZW1tb3ZlKHAsIGJ1ZiwgbGVuKTsKKwkJCXJldHVybjsKKwkJfQorCQltZW1tb3ZlKHAsIGJ1ZiwgdCk7CisJCWJ5dGVSZXZlcnNlKGN0eC0+aW4sIDE2KTsKKwkJTUQ1VHJhbnNmb3JtKGN0eC0+YnVmLCAoX191MzIgKikgY3R4LT5pbik7CisJCWJ1ZiArPSB0OworCQlsZW4gLT0gdDsKKwl9CisJLyogUHJvY2VzcyBkYXRhIGluIDY0LWJ5dGUgY2h1bmtzICovCisKKwl3aGlsZSAobGVuID49IDY0KSB7CisJCW1lbW1vdmUoY3R4LT5pbiwgYnVmLCA2NCk7CisJCWJ5dGVSZXZlcnNlKGN0eC0+aW4sIDE2KTsKKwkJTUQ1VHJhbnNmb3JtKGN0eC0+YnVmLCAoX191MzIgKikgY3R4LT5pbik7CisJCWJ1ZiArPSA2NDsKKwkJbGVuIC09IDY0OworCX0KKworCS8qIEhhbmRsZSBhbnkgcmVtYWluaW5nIGJ5dGVzIG9mIGRhdGEuICovCisKKwltZW1tb3ZlKGN0eC0+aW4sIGJ1ZiwgbGVuKTsKK30KKworLyoKKyAqIEZpbmFsIHdyYXB1cCAtIHBhZCB0byA2NC1ieXRlIGJvdW5kYXJ5IHdpdGggdGhlIGJpdCBwYXR0ZXJuIAorICogMSAwKiAoNjQtYml0IGNvdW50IG9mIGJpdHMgcHJvY2Vzc2VkLCBNU0ItZmlyc3QpCisgKi8KK3ZvaWQKK01ENUZpbmFsKHVuc2lnbmVkIGNoYXIgZGlnZXN0WzE2XSwgc3RydWN0IE1ENUNvbnRleHQgKmN0eCkKK3sKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJdW5zaWduZWQgY2hhciAqcDsKKworCS8qIENvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIG1vZCA2NCAqLworCWNvdW50ID0gKGN0eC0+Yml0c1swXSA+PiAzKSAmIDB4M0Y7CisKKwkvKiBTZXQgdGhlIGZpcnN0IGNoYXIgb2YgcGFkZGluZyB0byAweDgwLiAgVGhpcyBpcyBzYWZlIHNpbmNlIHRoZXJlIGlzCisJICAgYWx3YXlzIGF0IGxlYXN0IG9uZSBieXRlIGZyZWUgKi8KKwlwID0gY3R4LT5pbiArIGNvdW50OworCSpwKysgPSAweDgwOworCisJLyogQnl0ZXMgb2YgcGFkZGluZyBuZWVkZWQgdG8gbWFrZSA2NCBieXRlcyAqLworCWNvdW50ID0gNjQgLSAxIC0gY291bnQ7CisKKwkvKiBQYWQgb3V0IHRvIDU2IG1vZCA2NCAqLworCWlmIChjb3VudCA8IDgpIHsKKwkJLyogVHdvIGxvdHMgb2YgcGFkZGluZzogIFBhZCB0aGUgZmlyc3QgYmxvY2sgdG8gNjQgYnl0ZXMgKi8KKwkJbWVtc2V0KHAsIDAsIGNvdW50KTsKKwkJYnl0ZVJldmVyc2UoY3R4LT5pbiwgMTYpOworCQlNRDVUcmFuc2Zvcm0oY3R4LT5idWYsIChfX3UzMiAqKSBjdHgtPmluKTsKKworCQkvKiBOb3cgZmlsbCB0aGUgbmV4dCBibG9jayB3aXRoIDU2IGJ5dGVzICovCisJCW1lbXNldChjdHgtPmluLCAwLCA1Nik7CisJfSBlbHNlIHsKKwkJLyogUGFkIGJsb2NrIHRvIDU2IGJ5dGVzICovCisJCW1lbXNldChwLCAwLCBjb3VudCAtIDgpOworCX0KKwlieXRlUmV2ZXJzZShjdHgtPmluLCAxNCk7CisKKwkvKiBBcHBlbmQgbGVuZ3RoIGluIGJpdHMgYW5kIHRyYW5zZm9ybSAqLworCSgoX191MzIgKikgY3R4LT5pbilbMTRdID0gY3R4LT5iaXRzWzBdOworCSgoX191MzIgKikgY3R4LT5pbilbMTVdID0gY3R4LT5iaXRzWzFdOworCisJTUQ1VHJhbnNmb3JtKGN0eC0+YnVmLCAoX191MzIgKikgY3R4LT5pbik7CisJYnl0ZVJldmVyc2UoKHVuc2lnbmVkIGNoYXIgKikgY3R4LT5idWYsIDQpOworCW1lbW1vdmUoZGlnZXN0LCBjdHgtPmJ1ZiwgMTYpOworCW1lbXNldChjdHgsIDAsIHNpemVvZigqY3R4KSk7CS8qIEluIGNhc2UgaXQncyBzZW5zaXRpdmUgKi8KK30KKworLyogVGhlIGZvdXIgY29yZSBmdW5jdGlvbnMgLSBGMSBpcyBvcHRpbWl6ZWQgc29tZXdoYXQgKi8KKworLyogI2RlZmluZSBGMSh4LCB5LCB6KSAoeCAmIHkgfCB+eCAmIHopICovCisjZGVmaW5lIEYxKHgsIHksIHopICh6IF4gKHggJiAoeSBeIHopKSkKKyNkZWZpbmUgRjIoeCwgeSwgeikgRjEoeiwgeCwgeSkKKyNkZWZpbmUgRjMoeCwgeSwgeikgKHggXiB5IF4geikKKyNkZWZpbmUgRjQoeCwgeSwgeikgKHkgXiAoeCB8IH56KSkKKworLyogVGhpcyBpcyB0aGUgY2VudHJhbCBzdGVwIGluIHRoZSBNRDUgYWxnb3JpdGhtLiAqLworI2RlZmluZSBNRDVTVEVQKGYsIHcsIHgsIHksIHosIGRhdGEsIHMpIFwKKwkoIHcgKz0gZih4LCB5LCB6KSArIGRhdGEsICB3ID0gdzw8cyB8IHc+PigzMi1zKSwgIHcgKz0geCApCisKKy8qCisgKiBUaGUgY29yZSBvZiB0aGUgTUQ1IGFsZ29yaXRobSwgdGhpcyBhbHRlcnMgYW4gZXhpc3RpbmcgTUQ1IGhhc2ggdG8KKyAqIHJlZmxlY3QgdGhlIGFkZGl0aW9uIG9mIDE2IGxvbmd3b3JkcyBvZiBuZXcgZGF0YS4gIE1ENVVwZGF0ZSBibG9ja3MKKyAqIHRoZSBkYXRhIGFuZCBjb252ZXJ0cyBieXRlcyBpbnRvIGxvbmd3b3JkcyBmb3IgdGhpcyByb3V0aW5lLgorICovCitzdGF0aWMgdm9pZAorTUQ1VHJhbnNmb3JtKF9fdTMyIGJ1Zls0XSwgX191MzIgY29uc3QgaW5bMTZdKQoreworCXJlZ2lzdGVyIF9fdTMyIGEsIGIsIGMsIGQ7CisKKwlhID0gYnVmWzBdOworCWIgPSBidWZbMV07CisJYyA9IGJ1ZlsyXTsKKwlkID0gYnVmWzNdOworCisJTUQ1U1RFUChGMSwgYSwgYiwgYywgZCwgaW5bMF0gKyAweGQ3NmFhNDc4LCA3KTsKKwlNRDVTVEVQKEYxLCBkLCBhLCBiLCBjLCBpblsxXSArIDB4ZThjN2I3NTYsIDEyKTsKKwlNRDVTVEVQKEYxLCBjLCBkLCBhLCBiLCBpblsyXSArIDB4MjQyMDcwZGIsIDE3KTsKKwlNRDVTVEVQKEYxLCBiLCBjLCBkLCBhLCBpblszXSArIDB4YzFiZGNlZWUsIDIyKTsKKwlNRDVTVEVQKEYxLCBhLCBiLCBjLCBkLCBpbls0XSArIDB4ZjU3YzBmYWYsIDcpOworCU1ENVNURVAoRjEsIGQsIGEsIGIsIGMsIGluWzVdICsgMHg0Nzg3YzYyYSwgMTIpOworCU1ENVNURVAoRjEsIGMsIGQsIGEsIGIsIGluWzZdICsgMHhhODMwNDYxMywgMTcpOworCU1ENVNURVAoRjEsIGIsIGMsIGQsIGEsIGluWzddICsgMHhmZDQ2OTUwMSwgMjIpOworCU1ENVNURVAoRjEsIGEsIGIsIGMsIGQsIGluWzhdICsgMHg2OTgwOThkOCwgNyk7CisJTUQ1U1RFUChGMSwgZCwgYSwgYiwgYywgaW5bOV0gKyAweDhiNDRmN2FmLCAxMik7CisJTUQ1U1RFUChGMSwgYywgZCwgYSwgYiwgaW5bMTBdICsgMHhmZmZmNWJiMSwgMTcpOworCU1ENVNURVAoRjEsIGIsIGMsIGQsIGEsIGluWzExXSArIDB4ODk1Y2Q3YmUsIDIyKTsKKwlNRDVTVEVQKEYxLCBhLCBiLCBjLCBkLCBpblsxMl0gKyAweDZiOTAxMTIyLCA3KTsKKwlNRDVTVEVQKEYxLCBkLCBhLCBiLCBjLCBpblsxM10gKyAweGZkOTg3MTkzLCAxMik7CisJTUQ1U1RFUChGMSwgYywgZCwgYSwgYiwgaW5bMTRdICsgMHhhNjc5NDM4ZSwgMTcpOworCU1ENVNURVAoRjEsIGIsIGMsIGQsIGEsIGluWzE1XSArIDB4NDliNDA4MjEsIDIyKTsKKworCU1ENVNURVAoRjIsIGEsIGIsIGMsIGQsIGluWzFdICsgMHhmNjFlMjU2MiwgNSk7CisJTUQ1U1RFUChGMiwgZCwgYSwgYiwgYywgaW5bNl0gKyAweGMwNDBiMzQwLCA5KTsKKwlNRDVTVEVQKEYyLCBjLCBkLCBhLCBiLCBpblsxMV0gKyAweDI2NWU1YTUxLCAxNCk7CisJTUQ1U1RFUChGMiwgYiwgYywgZCwgYSwgaW5bMF0gKyAweGU5YjZjN2FhLCAyMCk7CisJTUQ1U1RFUChGMiwgYSwgYiwgYywgZCwgaW5bNV0gKyAweGQ2MmYxMDVkLCA1KTsKKwlNRDVTVEVQKEYyLCBkLCBhLCBiLCBjLCBpblsxMF0gKyAweDAyNDQxNDUzLCA5KTsKKwlNRDVTVEVQKEYyLCBjLCBkLCBhLCBiLCBpblsxNV0gKyAweGQ4YTFlNjgxLCAxNCk7CisJTUQ1U1RFUChGMiwgYiwgYywgZCwgYSwgaW5bNF0gKyAweGU3ZDNmYmM4LCAyMCk7CisJTUQ1U1RFUChGMiwgYSwgYiwgYywgZCwgaW5bOV0gKyAweDIxZTFjZGU2LCA1KTsKKwlNRDVTVEVQKEYyLCBkLCBhLCBiLCBjLCBpblsxNF0gKyAweGMzMzcwN2Q2LCA5KTsKKwlNRDVTVEVQKEYyLCBjLCBkLCBhLCBiLCBpblszXSArIDB4ZjRkNTBkODcsIDE0KTsKKwlNRDVTVEVQKEYyLCBiLCBjLCBkLCBhLCBpbls4XSArIDB4NDU1YTE0ZWQsIDIwKTsKKwlNRDVTVEVQKEYyLCBhLCBiLCBjLCBkLCBpblsxM10gKyAweGE5ZTNlOTA1LCA1KTsKKwlNRDVTVEVQKEYyLCBkLCBhLCBiLCBjLCBpblsyXSArIDB4ZmNlZmEzZjgsIDkpOworCU1ENVNURVAoRjIsIGMsIGQsIGEsIGIsIGluWzddICsgMHg2NzZmMDJkOSwgMTQpOworCU1ENVNURVAoRjIsIGIsIGMsIGQsIGEsIGluWzEyXSArIDB4OGQyYTRjOGEsIDIwKTsKKworCU1ENVNURVAoRjMsIGEsIGIsIGMsIGQsIGluWzVdICsgMHhmZmZhMzk0MiwgNCk7CisJTUQ1U1RFUChGMywgZCwgYSwgYiwgYywgaW5bOF0gKyAweDg3NzFmNjgxLCAxMSk7CisJTUQ1U1RFUChGMywgYywgZCwgYSwgYiwgaW5bMTFdICsgMHg2ZDlkNjEyMiwgMTYpOworCU1ENVNURVAoRjMsIGIsIGMsIGQsIGEsIGluWzE0XSArIDB4ZmRlNTM4MGMsIDIzKTsKKwlNRDVTVEVQKEYzLCBhLCBiLCBjLCBkLCBpblsxXSArIDB4YTRiZWVhNDQsIDQpOworCU1ENVNURVAoRjMsIGQsIGEsIGIsIGMsIGluWzRdICsgMHg0YmRlY2ZhOSwgMTEpOworCU1ENVNURVAoRjMsIGMsIGQsIGEsIGIsIGluWzddICsgMHhmNmJiNGI2MCwgMTYpOworCU1ENVNURVAoRjMsIGIsIGMsIGQsIGEsIGluWzEwXSArIDB4YmViZmJjNzAsIDIzKTsKKwlNRDVTVEVQKEYzLCBhLCBiLCBjLCBkLCBpblsxM10gKyAweDI4OWI3ZWM2LCA0KTsKKwlNRDVTVEVQKEYzLCBkLCBhLCBiLCBjLCBpblswXSArIDB4ZWFhMTI3ZmEsIDExKTsKKwlNRDVTVEVQKEYzLCBjLCBkLCBhLCBiLCBpblszXSArIDB4ZDRlZjMwODUsIDE2KTsKKwlNRDVTVEVQKEYzLCBiLCBjLCBkLCBhLCBpbls2XSArIDB4MDQ4ODFkMDUsIDIzKTsKKwlNRDVTVEVQKEYzLCBhLCBiLCBjLCBkLCBpbls5XSArIDB4ZDlkNGQwMzksIDQpOworCU1ENVNURVAoRjMsIGQsIGEsIGIsIGMsIGluWzEyXSArIDB4ZTZkYjk5ZTUsIDExKTsKKwlNRDVTVEVQKEYzLCBjLCBkLCBhLCBiLCBpblsxNV0gKyAweDFmYTI3Y2Y4LCAxNik7CisJTUQ1U1RFUChGMywgYiwgYywgZCwgYSwgaW5bMl0gKyAweGM0YWM1NjY1LCAyMyk7CisKKwlNRDVTVEVQKEY0LCBhLCBiLCBjLCBkLCBpblswXSArIDB4ZjQyOTIyNDQsIDYpOworCU1ENVNURVAoRjQsIGQsIGEsIGIsIGMsIGluWzddICsgMHg0MzJhZmY5NywgMTApOworCU1ENVNURVAoRjQsIGMsIGQsIGEsIGIsIGluWzE0XSArIDB4YWI5NDIzYTcsIDE1KTsKKwlNRDVTVEVQKEY0LCBiLCBjLCBkLCBhLCBpbls1XSArIDB4ZmM5M2EwMzksIDIxKTsKKwlNRDVTVEVQKEY0LCBhLCBiLCBjLCBkLCBpblsxMl0gKyAweDY1NWI1OWMzLCA2KTsKKwlNRDVTVEVQKEY0LCBkLCBhLCBiLCBjLCBpblszXSArIDB4OGYwY2NjOTIsIDEwKTsKKwlNRDVTVEVQKEY0LCBjLCBkLCBhLCBiLCBpblsxMF0gKyAweGZmZWZmNDdkLCAxNSk7CisJTUQ1U1RFUChGNCwgYiwgYywgZCwgYSwgaW5bMV0gKyAweDg1ODQ1ZGQxLCAyMSk7CisJTUQ1U1RFUChGNCwgYSwgYiwgYywgZCwgaW5bOF0gKyAweDZmYTg3ZTRmLCA2KTsKKwlNRDVTVEVQKEY0LCBkLCBhLCBiLCBjLCBpblsxNV0gKyAweGZlMmNlNmUwLCAxMCk7CisJTUQ1U1RFUChGNCwgYywgZCwgYSwgYiwgaW5bNl0gKyAweGEzMDE0MzE0LCAxNSk7CisJTUQ1U1RFUChGNCwgYiwgYywgZCwgYSwgaW5bMTNdICsgMHg0ZTA4MTFhMSwgMjEpOworCU1ENVNURVAoRjQsIGEsIGIsIGMsIGQsIGluWzRdICsgMHhmNzUzN2U4MiwgNik7CisJTUQ1U1RFUChGNCwgZCwgYSwgYiwgYywgaW5bMTFdICsgMHhiZDNhZjIzNSwgMTApOworCU1ENVNURVAoRjQsIGMsIGQsIGEsIGIsIGluWzJdICsgMHgyYWQ3ZDJiYiwgMTUpOworCU1ENVNURVAoRjQsIGIsIGMsIGQsIGEsIGluWzldICsgMHhlYjg2ZDM5MSwgMjEpOworCisJYnVmWzBdICs9IGE7CisJYnVmWzFdICs9IGI7CisJYnVmWzJdICs9IGM7CisJYnVmWzNdICs9IGQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIHRoZSByZmMgMjEwNCB2ZXJzaW9uIG9mIGhtYWNfbWQ1IGluaXRpYWxpc2F0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitobWFjX21kNV9pbml0X3JmYzIxMDQodW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5X2xlbiwKKwkJICAgICAgc3RydWN0IEhNQUNNRDVDb250ZXh0ICpjdHgpCit7CisJaW50IGk7CisKKwkvKiBpZiBrZXkgaXMgbG9uZ2VyIHRoYW4gNjQgYnl0ZXMgcmVzZXQgaXQgdG8ga2V5PU1ENShrZXkpICovCisJaWYgKGtleV9sZW4gPiA2NCkgeworCQl1bnNpZ25lZCBjaGFyIHRrWzE2XTsKKwkJc3RydWN0IE1ENUNvbnRleHQgdGN0eDsKKworCQlNRDVJbml0KCZ0Y3R4KTsKKwkJTUQ1VXBkYXRlKCZ0Y3R4LCBrZXksIGtleV9sZW4pOworCQlNRDVGaW5hbCh0aywgJnRjdHgpOworCisJCWtleSA9IHRrOworCQlrZXlfbGVuID0gMTY7CisJfQorCisJLyogc3RhcnQgb3V0IGJ5IHN0b3Jpbmcga2V5IGluIHBhZHMgKi8KKwltZW1zZXQoY3R4LT5rX2lwYWQsIDAsIHNpemVvZiAoY3R4LT5rX2lwYWQpKTsKKwltZW1zZXQoY3R4LT5rX29wYWQsIDAsIHNpemVvZiAoY3R4LT5rX29wYWQpKTsKKwltZW1jcHkoY3R4LT5rX2lwYWQsIGtleSwga2V5X2xlbik7CisJbWVtY3B5KGN0eC0+a19vcGFkLCBrZXksIGtleV9sZW4pOworCisJLyogWE9SIGtleSB3aXRoIGlwYWQgYW5kIG9wYWQgdmFsdWVzICovCisJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKwkJY3R4LT5rX2lwYWRbaV0gXj0gMHgzNjsKKwkJY3R4LT5rX29wYWRbaV0gXj0gMHg1YzsKKwl9CisKKwlNRDVJbml0KCZjdHgtPmN0eCk7CisJTUQ1VXBkYXRlKCZjdHgtPmN0eCwgY3R4LT5rX2lwYWQsIDY0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgdGhlIG1pY3Jvc29mdCB2ZXJzaW9uIG9mIGhtYWNfbWQ1IGluaXRpYWxpc2F0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitobWFjX21kNV9pbml0X2xpbUtfdG9fNjQoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5X2xlbiwKKwkJCSBzdHJ1Y3QgSE1BQ01ENUNvbnRleHQgKmN0eCkKK3sKKwlpbnQgaTsKKworCS8qIGlmIGtleSBpcyBsb25nZXIgdGhhbiA2NCBieXRlcyB0cnVuY2F0ZSBpdCAqLworCWlmIChrZXlfbGVuID4gNjQpIHsKKwkJa2V5X2xlbiA9IDY0OworCX0KKworCS8qIHN0YXJ0IG91dCBieSBzdG9yaW5nIGtleSBpbiBwYWRzICovCisJbWVtc2V0KGN0eC0+a19pcGFkLCAwLCBzaXplb2YgKGN0eC0+a19pcGFkKSk7CisJbWVtc2V0KGN0eC0+a19vcGFkLCAwLCBzaXplb2YgKGN0eC0+a19vcGFkKSk7CisJbWVtY3B5KGN0eC0+a19pcGFkLCBrZXksIGtleV9sZW4pOworCW1lbWNweShjdHgtPmtfb3BhZCwga2V5LCBrZXlfbGVuKTsKKworCS8qIFhPUiBrZXkgd2l0aCBpcGFkIGFuZCBvcGFkIHZhbHVlcyAqLworCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCWN0eC0+a19pcGFkW2ldIF49IDB4MzY7CisJCWN0eC0+a19vcGFkW2ldIF49IDB4NWM7CisJfQorCisJTUQ1SW5pdCgmY3R4LT5jdHgpOworCU1ENVVwZGF0ZSgmY3R4LT5jdHgsIGN0eC0+a19pcGFkLCA2NCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIHVwZGF0ZSBobWFjX21kNSAiaW5uZXIiIGJ1ZmZlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitobWFjX21kNV91cGRhdGUoY29uc3QgdW5zaWduZWQgY2hhciAqdGV4dCwgaW50IHRleHRfbGVuLAorCQlzdHJ1Y3QgSE1BQ01ENUNvbnRleHQgKmN0eCkKK3sKKwlNRDVVcGRhdGUoJmN0eC0+Y3R4LCB0ZXh0LCB0ZXh0X2xlbik7CS8qIHRoZW4gdGV4dCBvZiBkYXRhZ3JhbSAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBmaW5pc2ggb2ZmIGhtYWNfbWQ1ICJpbm5lciIgYnVmZmVyIGFuZCBnZW5lcmF0ZSBvdXRlciBvbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2htYWNfbWQ1X2ZpbmFsKHVuc2lnbmVkIGNoYXIgKmRpZ2VzdCwgc3RydWN0IEhNQUNNRDVDb250ZXh0ICpjdHgpCit7CisJc3RydWN0IE1ENUNvbnRleHQgY3R4X287CisKKwlNRDVGaW5hbChkaWdlc3QsICZjdHgtPmN0eCk7CisKKwlNRDVJbml0KCZjdHhfbyk7CisJTUQ1VXBkYXRlKCZjdHhfbywgY3R4LT5rX29wYWQsIDY0KTsKKwlNRDVVcGRhdGUoJmN0eF9vLCBkaWdlc3QsIDE2KTsKKwlNRDVGaW5hbChkaWdlc3QsICZjdHhfbyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIHNpbmdsZSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgYW4gSE1BQyBNRDUgZGlnZXN0IGZyb20gZGF0YS4KKyB1c2UgdGhlIG1pY3Jvc29mdCBobWFjbWQ1IGluaXQgbWV0aG9kIGJlY2F1c2UgdGhlIGtleSBpcyAxNiBieXRlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2htYWNfbWQ1KHVuc2lnbmVkIGNoYXIga2V5WzE2XSwgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGRhdGFfbGVuLAorCSB1bnNpZ25lZCBjaGFyICpkaWdlc3QpCit7CisJc3RydWN0IEhNQUNNRDVDb250ZXh0IGN0eDsKKwlobWFjX21kNV9pbml0X2xpbUtfdG9fNjQoa2V5LCAxNiwgJmN0eCk7CisJaWYgKGRhdGFfbGVuICE9IDApIHsKKwkJaG1hY19tZDVfdXBkYXRlKGRhdGEsIGRhdGFfbGVuLCAmY3R4KTsKKwl9CisJaG1hY19tZDVfZmluYWwoZGlnZXN0LCAmY3R4KTsKK30KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvbWQ1LmggYi9mcy9jaWZzL21kNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZTFjNTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL21kNS5oCkBAIC0wLDAgKzEsMzggQEAKKyNpZm5kZWYgTUQ1X0gKKyNkZWZpbmUgTUQ1X0gKKyNpZm5kZWYgSEVBREVSX01ENV9ICisvKiBUcnkgdG8gYXZvaWQgY2xhc2hlcyB3aXRoIE9wZW5TU0wgKi8KKyNkZWZpbmUgSEVBREVSX01ENV9ICisjZW5kaWYKKworc3RydWN0IE1ENUNvbnRleHQgeworCV9fdTMyIGJ1Zls0XTsKKwlfX3UzMiBiaXRzWzJdOworCXVuc2lnbmVkIGNoYXIgaW5bNjRdOworfTsKKyNlbmRpZgkJCQkvKiAhTUQ1X0ggKi8KKworI2lmbmRlZiBfSE1BQ19NRDVfSAorc3RydWN0IEhNQUNNRDVDb250ZXh0IHsKKwlzdHJ1Y3QgTUQ1Q29udGV4dCBjdHg7CisJdW5zaWduZWQgY2hhciBrX2lwYWRbNjVdOworCXVuc2lnbmVkIGNoYXIga19vcGFkWzY1XTsKK307CisjZW5kaWYJCQkJLyogX0hNQUNfTUQ1X0ggKi8KKwordm9pZCBNRDVJbml0KHN0cnVjdCBNRDVDb250ZXh0ICpjb250ZXh0KTsKK3ZvaWQgTUQ1VXBkYXRlKHN0cnVjdCBNRDVDb250ZXh0ICpjb250ZXh0LCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpidWYsCisJCQl1bnNpZ25lZCBsZW4pOwordm9pZCBNRDVGaW5hbCh1bnNpZ25lZCBjaGFyIGRpZ2VzdFsxNl0sIHN0cnVjdCBNRDVDb250ZXh0ICpjb250ZXh0KTsKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBjb21lIGZyb20gbGliL2htYWNtZDUuYyAgKi8KKwordm9pZCBobWFjX21kNV9pbml0X3JmYzIxMDQodW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5X2xlbiwKKwkJCXN0cnVjdCBITUFDTUQ1Q29udGV4dCAqY3R4KTsKK3ZvaWQgaG1hY19tZDVfaW5pdF9saW1LX3RvXzY0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleV9sZW4sCisJCQlzdHJ1Y3QgSE1BQ01ENUNvbnRleHQgKmN0eCk7Cit2b2lkIGhtYWNfbWQ1X3VwZGF0ZShjb25zdCB1bnNpZ25lZCBjaGFyICp0ZXh0LCBpbnQgdGV4dF9sZW4sCisJCQlzdHJ1Y3QgSE1BQ01ENUNvbnRleHQgKmN0eCk7Cit2b2lkIGhtYWNfbWQ1X2ZpbmFsKHVuc2lnbmVkIGNoYXIgKmRpZ2VzdCwgc3RydWN0IEhNQUNNRDVDb250ZXh0ICpjdHgpOwordm9pZCBobWFjX21kNSh1bnNpZ25lZCBjaGFyIGtleVsxNl0sIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBkYXRhX2xlbiwKKwkJCXVuc2lnbmVkIGNoYXIgKmRpZ2VzdCk7CmRpZmYgLS1naXQgYS9mcy9jaWZzL21pc2MuYyBiL2ZzL2NpZnMvbWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMzhkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL21pc2MuYwpAQCAtMCwwICsxLDUxNiBAQAorLyoKKyAqICAgZnMvY2lmcy9taXNjLmMKKyAqCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDIsMjAwNAorICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIAorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+CisjaW5jbHVkZSAiY2lmc3BkdS5oIgorI2luY2x1ZGUgImNpZnNnbG9iLmgiCisjaW5jbHVkZSAiY2lmc3Byb3RvLmgiCisjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgorI2luY2x1ZGUgInNtYmVyci5oIgorI2luY2x1ZGUgIm50ZXJyLmgiCisKK2V4dGVybiBtZW1wb29sX3QgKmNpZnNfc21fcmVxX3Bvb2xwOworZXh0ZXJuIG1lbXBvb2xfdCAqY2lmc19yZXFfcG9vbHA7CitleHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICogb3Bsb2NrVGhyZWFkOworCitzdGF0aWMgX191MTYgR2xvYmFsTWlkOwkJLyogbXVsdGlwbGV4IGlkIC0gcm90YXRpbmcgY291bnRlciAqLworCisvKiBUaGUgeGlkIHNlcnZlcyBhcyBhIHVzZWZ1bCBpZGVudGlmaWVyIGZvciBlYWNoIGluY29taW5nIHZmcyByZXF1ZXN0LCAKKyAgIGluIGEgc2ltaWxhciB3YXkgdG8gdGhlIG1pZCB3aGljaCBpcyB1c2VmdWwgdG8gdHJhY2sgZWFjaCBzZW50IHNtYiwgCisgICBhbmQgQ3VycmVudFhpZCBjYW4gYWxzbyBwcm92aWRlIGEgcnVubmluZyBjb3VudGVyIChhbHRob3VnaCBpdCAKKyAgIHdpbGwgZXZlbnR1YWxseSB3cmFwIHBhc3QgemVybykgb2YgdGhlIHRvdGFsIHZmcyBvcGVyYXRpb25zIGhhbmRsZWQgCisgICBzaW5jZSB0aGUgY2lmcyBmcyB3YXMgbW91bnRlZCAqLworCit1bnNpZ25lZCBpbnQKK19HZXRYaWQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgeGlkOworCisJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJR2xvYmFsVG90YWxBY3RpdmVYaWQrKzsKKwlpZiAoR2xvYmFsVG90YWxBY3RpdmVYaWQgPiBHbG9iYWxNYXhBY3RpdmVYaWQpCisJCUdsb2JhbE1heEFjdGl2ZVhpZCA9IEdsb2JhbFRvdGFsQWN0aXZlWGlkOwkvKiBrZWVwIGhpZ2ggd2F0ZXIgbWFyayBmb3IgbnVtYmVyIG9mIHNpbXVsdGFuZW91cyB2ZnMgb3BzIGluIG91ciBmaWxlc3lzdGVtICovCisJeGlkID0gR2xvYmFsQ3VycmVudFhpZCsrOworCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJcmV0dXJuIHhpZDsKK30KKwordm9pZAorX0ZyZWVYaWQodW5zaWduZWQgaW50IHhpZCkKK3sKKwlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkvKiBpZihHbG9iYWxUb3RhbEFjdGl2ZVhpZCA9PSAwKQorCQlCVUcoKTsgKi8KKwlHbG9iYWxUb3RhbEFjdGl2ZVhpZC0tOworCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7Cit9CisKK3N0cnVjdCBjaWZzU2VzSW5mbyAqCitzZXNJbmZvQWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgY2lmc1Nlc0luZm8gKnJldF9idWY7CisKKwlyZXRfYnVmID0KKwkgICAgKHN0cnVjdCBjaWZzU2VzSW5mbyAqKSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGNpZnNTZXNJbmZvKSwKKwkJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKHJldF9idWYpIHsKKwkJbWVtc2V0KHJldF9idWYsIDAsIHNpemVvZiAoc3RydWN0IGNpZnNTZXNJbmZvKSk7CisJCXdyaXRlX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCQlhdG9taWNfaW5jKCZzZXNJbmZvQWxsb2NDb3VudCk7CisJCXJldF9idWYtPnN0YXR1cyA9IENpZnNOZXc7CisJCWxpc3RfYWRkKCZyZXRfYnVmLT5jaWZzU2Vzc2lvbkxpc3QsICZHbG9iYWxTTUJTZXNzaW9uTGlzdCk7CisJCWluaXRfTVVURVgoJnJldF9idWYtPnNlc1NlbSk7CisJCXdyaXRlX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJfQorCXJldHVybiByZXRfYnVmOworfQorCit2b2lkCitzZXNJbmZvRnJlZShzdHJ1Y3QgY2lmc1Nlc0luZm8gKmJ1Zl90b19mcmVlKQoreworCWlmIChidWZfdG9fZnJlZSA9PSBOVUxMKSB7CisJCWNGWUkoMSwgKCJOdWxsIGJ1ZmZlciBwYXNzZWQgdG8gc2VzSW5mb0ZyZWUiKSk7CisJCXJldHVybjsKKwl9CisKKwl3cml0ZV9sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlhdG9taWNfZGVjKCZzZXNJbmZvQWxsb2NDb3VudCk7CisJbGlzdF9kZWwoJmJ1Zl90b19mcmVlLT5jaWZzU2Vzc2lvbkxpc3QpOworCXdyaXRlX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJaWYgKGJ1Zl90b19mcmVlLT5zZXJ2ZXJPUykKKwkJa2ZyZWUoYnVmX3RvX2ZyZWUtPnNlcnZlck9TKTsKKwlpZiAoYnVmX3RvX2ZyZWUtPnNlcnZlckRvbWFpbikKKwkJa2ZyZWUoYnVmX3RvX2ZyZWUtPnNlcnZlckRvbWFpbik7CisJaWYgKGJ1Zl90b19mcmVlLT5zZXJ2ZXJOT1MpCisJCWtmcmVlKGJ1Zl90b19mcmVlLT5zZXJ2ZXJOT1MpOworCWlmIChidWZfdG9fZnJlZS0+cGFzc3dvcmQpCisJCWtmcmVlKGJ1Zl90b19mcmVlLT5wYXNzd29yZCk7CisJa2ZyZWUoYnVmX3RvX2ZyZWUpOworfQorCitzdHJ1Y3QgY2lmc1Rjb25JbmZvICoKK3Rjb25JbmZvQWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpyZXRfYnVmOworCXJldF9idWYgPQorCSAgICAoc3RydWN0IGNpZnNUY29uSW5mbyAqKSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGNpZnNUY29uSW5mbyksCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAocmV0X2J1ZikgeworCQltZW1zZXQocmV0X2J1ZiwgMCwgc2l6ZW9mIChzdHJ1Y3QgY2lmc1Rjb25JbmZvKSk7CisJCXdyaXRlX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCQlhdG9taWNfaW5jKCZ0Y29uSW5mb0FsbG9jQ291bnQpOworCQlsaXN0X2FkZCgmcmV0X2J1Zi0+Y2lmc0Nvbm5lY3Rpb25MaXN0LAorCQkJICZHbG9iYWxUcmVlQ29ubmVjdGlvbkxpc3QpOworCQlyZXRfYnVmLT50aWRTdGF0dXMgPSBDaWZzTmV3OworCQlJTklUX0xJU1RfSEVBRCgmcmV0X2J1Zi0+b3BlbkZpbGVMaXN0KTsKKwkJaW5pdF9NVVRFWCgmcmV0X2J1Zi0+dGNvblNlbSk7CisjaWZkZWYgQ09ORklHX0NJRlNfU1RBVFMKKwkJc3Bpbl9sb2NrX2luaXQoJnJldF9idWYtPnN0YXRfbG9jayk7CisjZW5kaWYKKwkJd3JpdGVfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwl9CisJcmV0dXJuIHJldF9idWY7Cit9CisKK3ZvaWQKK3Rjb25JbmZvRnJlZShzdHJ1Y3QgY2lmc1Rjb25JbmZvICpidWZfdG9fZnJlZSkKK3sKKwlpZiAoYnVmX3RvX2ZyZWUgPT0gTlVMTCkgeworCQljRllJKDEsICgiTnVsbCBidWZmZXIgcGFzc2VkIHRvIHRjb25JbmZvRnJlZSIpKTsKKwkJcmV0dXJuOworCX0KKwl3cml0ZV9sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlhdG9taWNfZGVjKCZ0Y29uSW5mb0FsbG9jQ291bnQpOworCWxpc3RfZGVsKCZidWZfdG9fZnJlZS0+Y2lmc0Nvbm5lY3Rpb25MaXN0KTsKKwl3cml0ZV91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCWlmIChidWZfdG9fZnJlZS0+bmF0aXZlRmlsZVN5c3RlbSkKKwkJa2ZyZWUoYnVmX3RvX2ZyZWUtPm5hdGl2ZUZpbGVTeXN0ZW0pOworCWtmcmVlKGJ1Zl90b19mcmVlKTsKK30KKworc3RydWN0IHNtYl9oZHIgKgorY2lmc19idWZfZ2V0KHZvaWQpCit7CisJc3RydWN0IHNtYl9oZHIgKnJldF9idWYgPSBOVUxMOworCisvKiBXZSBjb3VsZCB1c2UgbmVnb3RpYXRlZCBzaXplIGluc3RlYWQgb2YgbWF4X21zZ3NpemUgLSAKKyAgIGJ1dCBpdCBtYXkgYmUgbW9yZSBlZmZpY2llbnQgdG8gYWx3YXlzIGFsbG9jIHNhbWUgc2l6ZSAKKyAgIGFsYmVpdCBzbGlnaHRseSBsYXJnZXIgdGhhbiBuZWNlc3NhcnkgYW5kIG1heGJ1ZmZlcnNpemUgCisgICBkZWZhdWx0cyB0byB0aGlzIGFuZCBjYW4gbm90IGJlIGJpZ2dlciAqLworCXJldF9idWYgPQorCSAgICAoc3RydWN0IHNtYl9oZHIgKikgbWVtcG9vbF9hbGxvYyhjaWZzX3JlcV9wb29scCwgU0xBQl9LRVJORUwgfCBTTEFCX05PRlMpOworCisJLyogY2xlYXIgdGhlIGZpcnN0IGZldyBoZWFkZXIgYnl0ZXMgKi8KKwkvKiBmb3IgbW9zdCBwYXRocywgbW9yZSBpcyBjbGVhcmVkIGluIGhlYWRlcl9hc3NlbWJsZSAqLworCWlmIChyZXRfYnVmKSB7CisJCW1lbXNldChyZXRfYnVmLCAwLCBzaXplb2Yoc3RydWN0IHNtYl9oZHIpICsgMyk7CisJCWF0b21pY19pbmMoJmJ1ZkFsbG9jQ291bnQpOworCX0KKworCXJldHVybiByZXRfYnVmOworfQorCit2b2lkCitjaWZzX2J1Zl9yZWxlYXNlKHZvaWQgKmJ1Zl90b19mcmVlKQoreworCisJaWYgKGJ1Zl90b19mcmVlID09IE5VTEwpIHsKKwkJLyogY0ZZSSgxLCAoIk51bGwgYnVmZmVyIHBhc3NlZCB0byBjaWZzX2J1Zl9yZWxlYXNlIikpOyovCisJCXJldHVybjsKKwl9CisJbWVtcG9vbF9mcmVlKGJ1Zl90b19mcmVlLGNpZnNfcmVxX3Bvb2xwKTsKKworCWF0b21pY19kZWMoJmJ1ZkFsbG9jQ291bnQpOworCXJldHVybjsKK30KKworc3RydWN0IHNtYl9oZHIgKgorY2lmc19zbWFsbF9idWZfZ2V0KHZvaWQpCit7CisJc3RydWN0IHNtYl9oZHIgKnJldF9idWYgPSBOVUxMOworCisvKiBXZSBjb3VsZCB1c2UgbmVnb3RpYXRlZCBzaXplIGluc3RlYWQgb2YgbWF4X21zZ3NpemUgLSAKKyAgIGJ1dCBpdCBtYXkgYmUgbW9yZSBlZmZpY2llbnQgdG8gYWx3YXlzIGFsbG9jIHNhbWUgc2l6ZSAKKyAgIGFsYmVpdCBzbGlnaHRseSBsYXJnZXIgdGhhbiBuZWNlc3NhcnkgYW5kIG1heGJ1ZmZlcnNpemUgCisgICBkZWZhdWx0cyB0byB0aGlzIGFuZCBjYW4gbm90IGJlIGJpZ2dlciAqLworCXJldF9idWYgPQorCSAgICAoc3RydWN0IHNtYl9oZHIgKikgbWVtcG9vbF9hbGxvYyhjaWZzX3NtX3JlcV9wb29scCwgU0xBQl9LRVJORUwgfCBTTEFCX05PRlMpOworCWlmIChyZXRfYnVmKSB7CisJLyogTm8gbmVlZCB0byBjbGVhciBtZW1vcnkgaGVyZSwgY2xlYXJlZCBpbiBoZWFkZXIgYXNzZW1ibGUgKi8KKwkvKgltZW1zZXQocmV0X2J1ZiwgMCwgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSArIDI3KTsqLworCQlhdG9taWNfaW5jKCZzbUJ1ZkFsbG9jQ291bnQpOworCX0KKwlyZXR1cm4gcmV0X2J1ZjsKK30KKwordm9pZAorY2lmc19zbWFsbF9idWZfcmVsZWFzZSh2b2lkICpidWZfdG9fZnJlZSkKK3sKKworCWlmIChidWZfdG9fZnJlZSA9PSBOVUxMKSB7CisJCWNGWUkoMSwgKCJOdWxsIGJ1ZmZlciBwYXNzZWQgdG8gY2lmc19zbWFsbF9idWZfcmVsZWFzZSIpKTsKKwkJcmV0dXJuOworCX0KKwltZW1wb29sX2ZyZWUoYnVmX3RvX2ZyZWUsY2lmc19zbV9yZXFfcG9vbHApOworCisJYXRvbWljX2RlYygmc21CdWZBbGxvY0NvdW50KTsKKwlyZXR1cm47Cit9CisKK3ZvaWQKK2hlYWRlcl9hc3NlbWJsZShzdHJ1Y3Qgc21iX2hkciAqYnVmZmVyLCBjaGFyIHNtYl9jb21tYW5kIC8qIGNvbW1hbmQgKi8gLAorCQljb25zdCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0cmVlQ29uLCBpbnQgd29yZF9jb3VudAorCQkvKiBsZW5ndGggb2YgZml4ZWQgc2VjdGlvbiAod29yZCBjb3VudCkgaW4gdHdvIGJ5dGUgdW5pdHMgICovKQoreworCXN0cnVjdCBsaXN0X2hlYWQqIHRlbXBfaXRlbTsKKwlzdHJ1Y3QgY2lmc1Nlc0luZm8gKiBzZXM7CisJY2hhciAqdGVtcCA9IChjaGFyICopIGJ1ZmZlcjsKKworCW1lbXNldCh0ZW1wLDAsTUFYX0NJRlNfSERSX1NJWkUpOworCisJYnVmZmVyLT5zbWJfYnVmX2xlbmd0aCA9CisJICAgICgyICogd29yZF9jb3VudCkgKyBzaXplb2YgKHN0cnVjdCBzbWJfaGRyKSAtCisJICAgIDQgLyogIFJGQyAxMDAxIGxlbmd0aCBmaWVsZCBkb2VzIG5vdCBjb3VudCAqLyAgKworCSAgICAyIC8qIGZvciBiY2MgZmllbGQgaXRzZWxmICovIDsKKwkvKiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgb25seSBuZXR3b3JrIGZpZWxkIHRoYXQgaGFzIHRvIGJlIGNvbnZlcnRlZCB0byBiaWcgZW5kaWFuIGFuZCBpdCBpcyBkb25lIGp1c3QgYmVmb3JlIHdlIHNlbmQgaXQgKi8KKworCWJ1ZmZlci0+UHJvdG9jb2xbMF0gPSAweEZGOworCWJ1ZmZlci0+UHJvdG9jb2xbMV0gPSAnUyc7CisJYnVmZmVyLT5Qcm90b2NvbFsyXSA9ICdNJzsKKwlidWZmZXItPlByb3RvY29sWzNdID0gJ0InOworCWJ1ZmZlci0+Q29tbWFuZCA9IHNtYl9jb21tYW5kOworCWJ1ZmZlci0+RmxhZ3MgPSAweDAwOwkvKiBjYXNlIHNlbnNpdGl2ZSAqLworCWJ1ZmZlci0+RmxhZ3MyID0gU01CRkxHMl9LTk9XU19MT05HX05BTUVTOworCWJ1ZmZlci0+UGlkID0gY3B1X3RvX2xlMTYoKF9fdTE2KWN1cnJlbnQtPnRnaWQpOworCWJ1ZmZlci0+UGlkSGlnaCA9IGNwdV90b19sZTE2KChfX3UxNikoY3VycmVudC0+dGdpZCA+PiAxNikpOworCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCUdsb2JhbE1pZCsrOworCWJ1ZmZlci0+TWlkID0gR2xvYmFsTWlkOworCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJaWYgKHRyZWVDb24pIHsKKwkJYnVmZmVyLT5UaWQgPSB0cmVlQ29uLT50aWQ7CisJCWlmICh0cmVlQ29uLT5zZXMpIHsKKwkJCWlmICh0cmVlQ29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklDT0RFKQorCQkJCWJ1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfVU5JQ09ERTsKKwkJCWlmICh0cmVlQ29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9TVEFUVVMzMikgeworCQkJCWJ1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfRVJSX1NUQVRVUzsKKwkJCX0KKworCQkJYnVmZmVyLT5VaWQgPSB0cmVlQ29uLT5zZXMtPlN1aWQ7CS8qIGFsd2F5cyBpbiBMRSBmb3JtYXQgKi8KKwkJCWlmKG11bHRpdXNlcl9tb3VudCAhPSAwKSB7CisJCS8qIEZvciB0aGUgbXVsdGl1c2VyIGNhc2UsIHRoZXJlIGFyZSBmZXcgb2J2aW91cyB0ZWNobmljYWxseSAgKi8KKwkJLyogcG9zc2libGUgbWVjaGFuaXNtcyB0byBtYXRjaCB0aGUgbG9jYWwgbGludXggdXNlciAodWlkKSAgICAqLworCQkvKiB0byBhIHZhbGlkIHJlbW90ZSBzbWIgdXNlciAoc21iX3VpZCk6CQkgICAgICAqLworCQkvKiAJMSkgUXVlcnkgV2luYmluZCAob3Igb3RoZXIgbG9jYWwgcGFtL25zcyBkYWVtb24gICAgICAgKi8KKwkJLyogCSAgZm9yIHVzZXJpZC9wYXNzd29yZC9sb2dvbl9kb21haW4gb3IgY3JlZGVudGlhbCAgICAgICovCisJCS8qICAgICAgMikgUXVlcnkgV2luYmluZCBmb3IgdWlkIHRvIHNpZCB0byB1c2VybmFtZSBtYXBwaW5nICAgKi8KKwkJLyogCSAgIGFuZCBzZWUgaWYgd2UgaGF2ZSBhIG1hdGNoaW5nIHBhc3N3b3JkIGZvciBleGlzdGluZyovCisJCS8qICAgICAgICAgc2Vzc2lvbiBmb3IgdGhhdCB1c2VyIHBlcmhhcyBnZXR0aW5nIHBhc3N3b3JkIGJ5ICAgKi8KKwkJLyogICAgICAgICBhZGRpbmcgYSBuZXcgcGFtX2NpZnMgbW9kdWxlIHRoYXQgc3RvcmVzIHBhc3N3b3JkcyAqLworCQkvKiAgICAgICAgIHNvIHRoYXQgdGhlIGNpZnMgdmZzIGNhbiBnZXQgYXQgdGhhdCBmb3IgYWxsIGxvZ2dlZCovCisJCS8qCSAgIG9uIHVzZXJzCQkJCQkgICAgICAqLworCQkvKgkzKSAoV2hpY2ggaXMgdGhlIG1lY2hhbmlzbSB3ZSBoYXZlIGNob3NlbikJICAgICAgKi8KKwkJLyoJICAgU2VhcmNoIHRocm91Z2ggc2Vzc2lvbnMgdG8gdGhlIHNhbWUgc2VydmVyIGZvciBhICAgKi8KKwkJLyoJICAgYSBtYXRjaCBvbiB0aGUgdWlkIHRoYXQgd2FzIHBhc3NlZCBpbiBvbiBtb3VudCAgICAgKi8KKwkJLyogICAgICAgICB3aXRoIHRoZSBjdXJyZW50IHByb2Nlc3NlcyB1aWQgKG9yIGV1aWQ/KSBhbmQgdXNlICAqLworCQkvKiAJICAgdGhhdCBzbWIgdWlkLiAgIElmIG5vIGV4aXN0aW5nIHNtYiBzZXNzaW9uIGZvciAgICAgKi8KKwkJLyogCSAgIHRoYXQgdWlkIGZvdW5kLCB1c2UgdGhlIGRlZmF1bHQgc21iIHNlc3Npb24gaWUgICAgICovCisJCS8qICAgICAgICAgdGhlIHNtYiBzZXNzaW9uIGZvciB0aGUgdm9sdW1lIG1vdW50ZWQgd2hpY2ggaXMgICAgKi8KKwkJLyogCSAgIHRoZSBzYW1lIGFzIHdvdWxkIGJlIHVzZWQgaWYgdGhlIG11bHRpdXNlciBtb3VudCAgICovCisJCS8qIAkgICBmbGFnIHdlcmUgZGlzYWJsZWQuICAqLworCisJCS8qICBCQiBBZGQgc3VwcG9ydCBmb3IgZXN0YWJsaXNoaW5nIG5ldyB0Q29uIGFuZCBTTUIgU2Vzc2lvbiAgKi8KKwkJLyogICAgICB3aXRoIHVzZXJpZC9wYXNzd29yZCBwYWlycyBmb3VuZCBvbiB0aGUgc21iIHNlc3Npb24gICAqLyAKKwkJLyoJZm9yIG90aGVyIHRhcmdldCB0Y3AvaXAgYWRkcmVzc2VzIAkJQkIgICAgKi8KKwkJCQlpZihjdXJyZW50LT51aWQgIT0gdHJlZUNvbi0+c2VzLT5saW51eF91aWQpIHsKKwkJCQkJY0ZZSSgxLCgiTXVsdGl1c2VyIG1vZGUgYW5kIFVJRCBkaWQgbm90IG1hdGNoIHRjb24gdWlkICIpKTsKKwkJCQkJcmVhZF9sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwkJCQkJbGlzdF9mb3JfZWFjaCh0ZW1wX2l0ZW0sICZHbG9iYWxTTUJTZXNzaW9uTGlzdCkgeworCQkJCQkJc2VzID0gbGlzdF9lbnRyeSh0ZW1wX2l0ZW0sIHN0cnVjdCBjaWZzU2VzSW5mbywgY2lmc1Nlc3Npb25MaXN0KTsKKwkJCQkJCWlmKHNlcy0+bGludXhfdWlkID09IGN1cnJlbnQtPnVpZCkgeworCQkJCQkJCWlmKHNlcy0+c2VydmVyID09IHRyZWVDb24tPnNlcy0+c2VydmVyKSB7CisJCQkJCQkJCWNGWUkoMSwoImZvdW5kIG1hdGNoaW5nIHVpZCBzdWJzdGl0dXRlIHJpZ2h0IHNtYl91aWQiKSk7ICAKKwkJCQkJCQkJYnVmZmVyLT5VaWQgPSBzZXMtPlN1aWQ7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCS8qIEJCIGV2ZW50dWFsbHkgY2FsbCBjaWZzX3NldHVwX3Nlc3Npb24gaGVyZSAqLworCQkJCQkJCQljRllJKDEsKCJsb2NhbCBVSUQgZm91bmQgYnV0IHNtYiBzZXNzIHdpdGggdGhpcyBzZXJ2ZXIgZG9lcyBub3QgZXhpc3QiKSk7ICAKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJcmVhZF91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAodHJlZUNvbi0+RmxhZ3MgJiBTTUJfU0hBUkVfSVNfSU5fREZTKQorCQkJYnVmZmVyLT5GbGFnczIgfD0gU01CRkxHMl9ERlM7CisJCWlmKCh0cmVlQ29uLT5zZXMpICYmICh0cmVlQ29uLT5zZXMtPnNlcnZlcikpCisJCQlpZih0cmVlQ29uLT5zZXMtPnNlcnZlci0+c2VjTW9kZSAmIAorCQkJICAoU0VDTU9ERV9TSUdOX1JFUVVJUkVEIHwgU0VDTU9ERV9TSUdOX0VOQUJMRUQpKQorCQkJCWJ1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfU0VDVVJJVFlfU0lHTkFUVVJFOworCX0KKworLyogIGVuZGlhbiBjb252ZXJzaW9uIG9mIGZsYWdzIGlzIG5vdyBkb25lIGp1c3QgYmVmb3JlIHNlbmRpbmcgKi8KKwlidWZmZXItPldvcmRDb3VudCA9IChjaGFyKSB3b3JkX2NvdW50OworCXJldHVybjsKK30KKworaW50CitjaGVja1NNQmhkcihzdHJ1Y3Qgc21iX2hkciAqc21iLCBfX3UxNiBtaWQpCit7CisJLyogTWFrZSBzdXJlIHRoYXQgdGhpcyByZWFsbHkgaXMgYW4gU01CLCB0aGF0IGl0IGlzIGEgcmVzcG9uc2UsIAorCSAgIGFuZCB0aGF0IHRoZSBtZXNzYWdlIGlkcyBtYXRjaCAqLworCWlmICgoKihfX2xlMzIgKikgc21iLT5Qcm90b2NvbCA9PSBjcHVfdG9fbGUzMigweDQyNGQ1M2ZmKSkgJiYgCisJCShtaWQgPT0gc21iLT5NaWQpKSB7ICAgIAorCQlpZihzbWItPkZsYWdzICYgU01CRkxHX1JFU1BPTlNFKQorCQkJcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAKKwkJZWxzZSB7ICAgICAgICAKKwkJLyogb25seSBvbmUgdmFsaWQgY2FzZSB3aGVyZSBzZXJ2ZXIgc2VuZHMgdXMgcmVxdWVzdCAqLworCQkJaWYoc21iLT5Db21tYW5kID09IFNNQl9DT01fTE9DS0lOR19BTkRYKQorCQkJCXJldHVybiAwOworCQkJZWxzZQorCQkJCWNFUlJPUigxLCAoIlJjdmQgUmVxdWVzdCBub3QgcmVzcG9uc2UgIikpOyAgICAgICAgIAorCQl9CisJfSBlbHNlIHsgLyogYmFkIHNpZ25hdHVyZSBvciBtaWQgKi8KKwkJaWYgKCooX19sZTMyICopIHNtYi0+UHJvdG9jb2wgIT0gY3B1X3RvX2xlMzIoMHg0MjRkNTNmZikpCisJCQljRVJST1IoMSwKKwkJCSAgICAgICAoIkJhZCBwcm90b2NvbCBzdHJpbmcgc2lnbmF0dXJlIGhlYWRlciAleCAiLAorCQkJCSoodW5zaWduZWQgaW50ICopIHNtYi0+UHJvdG9jb2wpKTsKKwkJaWYgKG1pZCAhPSBzbWItPk1pZCkKKwkJCWNFUlJPUigxLCAoIk1pZHMgZG8gbm90IG1hdGNoIikpOworCX0KKwljRVJST1IoMSwgKCJiYWQgc21iIGRldGVjdGVkLiBUaGUgTWlkPSVkIiwgc21iLT5NaWQpKTsKKwlyZXR1cm4gMTsKK30KKworaW50CitjaGVja1NNQihzdHJ1Y3Qgc21iX2hkciAqc21iLCBfX3UxNiBtaWQsIGludCBsZW5ndGgpCit7CisJX191MzIgbGVuID0gYmUzMl90b19jcHUoc21iLT5zbWJfYnVmX2xlbmd0aCk7CisJY0ZZSSgwLAorCSAgICAgKCJFbnRlcmluZyBjaGVja1NNQiB3aXRoIExlbmd0aDogJXgsIHNtYl9idWZfbGVuZ3RoOiAleCAiLAorCSAgICAgIGxlbmd0aCwgbGVuKSk7CisJaWYgKCgodW5zaWduZWQgaW50KWxlbmd0aCA8IDIgKyBzaXplb2YgKHN0cnVjdCBzbWJfaGRyKSkgfHwKKwkgICAgKGxlbiA+IENJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUgLSA0KSkgeworCQlpZiAoKHVuc2lnbmVkIGludClsZW5ndGggPCAyICsgc2l6ZW9mIChzdHJ1Y3Qgc21iX2hkcikpIHsKKwkJCWlmICgoKHVuc2lnbmVkIGludClsZW5ndGggPj0gCisJCQkJc2l6ZW9mIChzdHJ1Y3Qgc21iX2hkcikgLSAxKQorCQkJICAgICYmIChzbWItPlN0YXR1cy5DaWZzRXJyb3IgIT0gMCkpIHsKKwkJCQlzbWItPldvcmRDb3VudCA9IDA7CisJCQkJcmV0dXJuIDA7CS8qIHNvbWUgZXJyb3IgY2FzZXMgZG8gbm90IHJldHVybiB3Y3QgYW5kIGJjYyAqLworCQkJfSBlbHNlIHsKKwkJCQljRVJST1IoMSwgKCJMZW5ndGggbGVzcyB0aGFuIHNtYiBoZWFkZXIgc2l6ZSIpKTsKKwkJCX0KKworCQl9CisJCWlmIChsZW4gPiBDSUZTTWF4QnVmU2l6ZSArIE1BWF9DSUZTX0hEUl9TSVpFIC0gNCkKKwkJCWNFUlJPUigxLAorCQkJICAgICAgICgic21iX2J1Zl9sZW5ndGggZ3JlYXRlciB0aGFuIE1heEJ1ZlNpemUiKSk7CisJCWNFUlJPUigxLAorCQkgICAgICAgKCJiYWQgc21iIGRldGVjdGVkLiBJbGxlZ2FsIGxlbmd0aC4gVGhlIG1pZD0lZCIsCisJCQlzbWItPk1pZCkpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoY2hlY2tTTUJoZHIoc21iLCBtaWQpKQorCQlyZXR1cm4gMTsKKworCWlmICgoNCArIGxlbiAhPSBzbWJDYWxjU2l6ZShzbWIpKQorCSAgICB8fCAoNCArIGxlbiAhPSAodW5zaWduZWQgaW50KWxlbmd0aCkpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJY0VSUk9SKDEsICgic21iQ2FsY1NpemUgJXggIiwgc21iQ2FsY1NpemUoc21iKSkpOworCQljRVJST1IoMSwKKwkJICAgICAgICgiYmFkIHNtYiBzaXplIGRldGVjdGVkLiBUaGUgTWlkPSVkIiwgc21iLT5NaWQpKTsKKwkJcmV0dXJuIDE7CisJfQorfQoraW50Citpc192YWxpZF9vcGxvY2tfYnJlYWsoc3RydWN0IHNtYl9oZHIgKmJ1ZikKK3sgICAgCisJc3RydWN0IHNtYl9jb21fbG9ja19yZXEgKiBwU01CID0gKHN0cnVjdCBzbWJfY29tX2xvY2tfcmVxICopYnVmOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAxOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb247CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqbmV0ZmlsZTsKKworCWNGWUkoMSwoIkNoZWNraW5nIGZvciBvcGxvY2sgYnJlYWsgb3IgZG5vdGlmeSByZXNwb25zZSIpKTsKKwlpZigocFNNQi0+aGRyLkNvbW1hbmQgPT0gU01CX0NPTV9OVF9UUkFOU0FDVCkgJiYKKwkgICAocFNNQi0+aGRyLkZsYWdzICYgU01CRkxHX1JFU1BPTlNFKSkgeworCQlzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9jaGFuZ2Vfbm90aWZ5X3JzcCAqIHBTTUJyID0KKwkJCShzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9jaGFuZ2Vfbm90aWZ5X3JzcCAqKWJ1ZjsKKwkJc3RydWN0IGZpbGVfbm90aWZ5X2luZm9ybWF0aW9uICogcG5vdGlmeTsKKwkJX191MzIgZGF0YV9vZmZzZXQgPSAwOworCQlpZihwU01Cci0+Qnl0ZUNvdW50ID4gc2l6ZW9mKHN0cnVjdCBmaWxlX25vdGlmeV9pbmZvcm1hdGlvbikpIHsKKwkJCWRhdGFfb2Zmc2V0ID0gbGUzMl90b19jcHUocFNNQnItPkRhdGFPZmZzZXQpOworCisJCQlwbm90aWZ5ID0gKHN0cnVjdCBmaWxlX25vdGlmeV9pbmZvcm1hdGlvbiAqKSgoY2hhciAqKSZwU01Cci0+aGRyLlByb3RvY29sCisJCQkJKyBkYXRhX29mZnNldCk7CisJCQljRllJKDEsKCJkbm90aWZ5IG9uICVzIHdpdGggYWN0aW9uOiAweCV4Iixwbm90aWZ5LT5GaWxlTmFtZSwKKwkJCQlwbm90aWZ5LT5BY3Rpb24pKTsgIC8qIEJCIHJlbW92ZW1lIEJCICovCisJICAgICAgICAgICAgIC8qICAgY2lmc19kdW1wX21lbSgiUmVjZWl2ZWQgbm90aWZ5IERhdGEgaXM6ICIsYnVmLHNpemVvZihzdHJ1Y3Qgc21iX2hkcikrNjApOyAqLworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwkJaWYocFNNQnItPmhkci5TdGF0dXMuQ2lmc0Vycm9yKSB7CisJCQljRllJKDEsKCJub3RpZnkgZXJyIDB4JWQiLHBTTUJyLT5oZHIuU3RhdHVzLkNpZnNFcnJvcikpOworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwkJcmV0dXJuIEZBTFNFOworCX0gIAorCWlmKHBTTUItPmhkci5Db21tYW5kICE9IFNNQl9DT01fTE9DS0lOR19BTkRYKQorCQlyZXR1cm4gRkFMU0U7CisJaWYocFNNQi0+aGRyLkZsYWdzICYgU01CRkxHX1JFU1BPTlNFKSB7CisJCS8qIG5vIHNlbnNlIGxvZ2dpbmcgZXJyb3Igb24gaW52YWxpZCBoYW5kbGUgb24gb3Bsb2NrCisJCSAgIGJyZWFrIC0gaGFybWxlc3MgcmFjZSBiZXR3ZWVuIGNsb3NlIHJlcXVlc3QgYW5kIG9wbG9jaworCQkgICBicmVhayByZXNwb25zZSBpcyBleHBlY3RlZCBmcm9tIHRpbWUgdG8gdGltZSB3cml0aW5nIG91dAorCQkgICBsYXJnZSBkaXJ0eSBmaWxlcyBjYWNoZWQgb24gdGhlIGNsaWVudCAqLworCQlpZiAoKE5UX1NUQVRVU19JTlZBTElEX0hBTkRMRSkgPT0gCisJCSAgIGxlMzJfdG9fY3B1KHBTTUItPmhkci5TdGF0dXMuQ2lmc0Vycm9yKSkgeyAKKwkJCWNGWUkoMSwoImludmFsaWQgaGFuZGxlIG9uIG9wbG9jayBicmVhayIpKTsKKwkJCXJldHVybiBUUlVFOworCQl9IGVsc2UgaWYgKEVSUmJhZGZpZCA9PSAKKwkJICAgbGUxNl90b19jcHUocFNNQi0+aGRyLlN0YXR1cy5Eb3NFcnJvci5FcnJvcikpIHsKKwkJCXJldHVybiBUUlVFOwkgIAorCQl9IGVsc2UgeworCQkJcmV0dXJuIEZBTFNFOyAvKiBvbiB2YWxpZCBvcGxvY2sgYnJrIHdlIGdldCAicmVxdWVzdCIgKi8KKwkJfQorCX0KKwlpZihwU01CLT5oZHIuV29yZENvdW50ICE9IDgpCisJCXJldHVybiBGQUxTRTsKKworCWNGWUkoMSwoIiBvcGxvY2sgdHlwZSAweCVkIGxldmVsIDB4JWQiLHBTTUItPkxvY2tUeXBlLHBTTUItPk9wbG9ja0xldmVsKSk7CisJaWYoIShwU01CLT5Mb2NrVHlwZSAmIExPQ0tJTkdfQU5EWF9PUExPQ0tfUkVMRUFTRSkpCisJCXJldHVybiBGQUxTRTsgICAgCisKKwkvKiBsb29rIHVwIHRjb24gYmFzZWQgb24gdGlkICYgdWlkICovCisJcmVhZF9sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJkdsb2JhbFRyZWVDb25uZWN0aW9uTGlzdCkgeworCQl0Y29uID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBjaWZzVGNvbkluZm8sIGNpZnNDb25uZWN0aW9uTGlzdCk7CisJCWlmICh0Y29uLT50aWQgPT0gYnVmLT5UaWQpIHsKKyNpZmRlZiBDT05GSUdfQ0lGU19TVEFUUworCQkJYXRvbWljX2luYygmdGNvbi0+bnVtX29wbG9ja19icmtzKTsKKyNlbmRpZgorCQkJbGlzdF9mb3JfZWFjaCh0bXAxLCZ0Y29uLT5vcGVuRmlsZUxpc3QpeworCQkJCW5ldGZpbGUgPSBsaXN0X2VudHJ5KHRtcDEsc3RydWN0IGNpZnNGaWxlSW5mbyx0bGlzdCk7CisJCQkJaWYocFNNQi0+RmlkID09IG5ldGZpbGUtPm5ldGZpZCkgeworCQkJCQlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqcENpZnNJbm9kZTsKKwkJCQkJcmVhZF91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCQkJCQljRllJKDEsKCJNYXRjaGluZyBmaWxlIGlkLCBwcm9jZXNzaW5nIG9wbG9jayBicmVhayIpKTsKKwkJCQkJcENpZnNJbm9kZSA9IAorCQkJCQkJQ0lGU19JKG5ldGZpbGUtPnBJbm9kZSk7CisJCQkJCXBDaWZzSW5vZGUtPmNsaWVudENhbkNhY2hlQWxsID0gRkFMU0U7CisJCQkJCWlmKHBTTUItPk9wbG9ja0xldmVsID09IDApCisJCQkJCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQgPSBGQUxTRTsKKwkJCQkJcENpZnNJbm9kZS0+b3Bsb2NrUGVuZGluZyA9IFRSVUU7CisJCQkJCUFsbG9jT3Bsb2NrUUVudHJ5KG5ldGZpbGUtPnBJbm9kZSwgbmV0ZmlsZS0+bmV0ZmlkLCB0Y29uKTsKKwkJCQkJY0ZZSSgxLCgiYWJvdXQgdG8gd2FrZSB1cCBvcGxvY2sgdGhkIikpOworCQkJCQl3YWtlX3VwX3Byb2Nlc3Mob3Bsb2NrVGhyZWFkKTsgICAgICAgICAgICAgICAKKwkJCQkJcmV0dXJuIFRSVUU7CisJCQkJfQorCQkJfQorCQkJcmVhZF91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCQkJY0ZZSSgxLCgiTm8gbWF0Y2hpbmcgZmlsZSBmb3Igb3Bsb2NrIGJyZWFrIG9uIGNvbm5lY3Rpb24iKSk7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJY0ZZSSgxLCgiQ2FuIG5vdCBwcm9jZXNzIG9wbG9jayBicmVhayBmb3Igbm9uLWV4aXN0ZW50IGNvbm5lY3Rpb24iKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK2R1bXBfc21iKHN0cnVjdCBzbWJfaGRyICpzbWJfYnVmLCBpbnQgc21iX2J1Zl9sZW5ndGgpCit7CisJaW50IGksIGo7CisJY2hhciBkZWJ1Z19saW5lWzE3XTsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7CisKKwlpZiAodHJhY2VTTUIgPT0gMCkKKwkJcmV0dXJuOworCisJYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikgc21iX2J1ZjsKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHNtYl9idWZfbGVuZ3RoOyBpKyssIGorKykgeworCQlpZiAoaSAlIDggPT0gMCkgewkvKiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGJlZ2lubmluZyBvZiBsaW5lICAqLworCQkJcHJpbnRrKEtFUk5fREVCVUcgInwgIik7CisJCQlqID0gMDsKKwkJfQorCQlwcmludGsoIiUwIzR4ICIsIGJ1ZmZlcltpXSk7CisJCWRlYnVnX2xpbmVbMiAqIGpdID0gJyAnOworCQlpZiAoaXNwcmludChidWZmZXJbaV0pKQorCQkJZGVidWdfbGluZVsxICsgKDIgKiBqKV0gPSBidWZmZXJbaV07CisJCWVsc2UKKwkJCWRlYnVnX2xpbmVbMSArICgyICogaildID0gJ18nOworCisJCWlmIChpICUgOCA9PSA3KSB7CS8qIHdlIGhhdmUgcmVhY2hlZCBlbmQgb2YgbGluZSwgdGltZSB0byBwcmludCBhc2NpaSAqLworCQkJZGVidWdfbGluZVsxNl0gPSAwOworCQkJcHJpbnRrKCIgfCAlc1xuIiwgZGVidWdfbGluZSk7CisJCX0KKwl9CisJZm9yICg7IGogPCA4OyBqKyspIHsKKwkJcHJpbnRrKCIgICAgICIpOworCQlkZWJ1Z19saW5lWzIgKiBqXSA9ICcgJzsKKwkJZGVidWdfbGluZVsxICsgKDIgKiBqKV0gPSAnICc7CisJfQorCXByaW50ayggIiB8ICVzXG4iLCBkZWJ1Z19saW5lKTsKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9mcy9jaWZzL25ldG1pc2MuYyBiL2ZzL2NpZnMvbmV0bWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMzRjODkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL25ldG1pc2MuYwpAQCAtMCwwICsxLDkwNCBAQAorLyoKKyAqICAgZnMvY2lmcy9uZXRtaXNjLmMKKyAqCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDIKKyAqICAgQXV0aG9yKHMpOiBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqIAorICogICBFcnJvciBtYXBwaW5nIHJvdXRpbmVzIGZyb20gU2FtYmEgbGlic21iL2Vycm9ybWFwLmMKKyAqICAgQ29weXJpZ2h0IChDKSBBbmRyZXcgVHJpZGdlbGwgMjAwMQorICoKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgImNpZnNmcy5oIgorI2luY2x1ZGUgImNpZnNwZHUuaCIKKyNpbmNsdWRlICJjaWZzZ2xvYi5oIgorI2luY2x1ZGUgImNpZnNwcm90by5oIgorI2luY2x1ZGUgInNtYmVyci5oIgorI2luY2x1ZGUgImNpZnNfZGVidWcuaCIKKyNpbmNsdWRlICJudGVyci5oIgorCitzdHJ1Y3Qgc21iX3RvX3Bvc2l4X2Vycm9yIHsKKwlfX3UxNiBzbWJfZXJyOworCWludCBwb3NpeF9jb2RlOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbWJfdG9fcG9zaXhfZXJyb3IgbWFwcGluZ190YWJsZV9FUlJET1NbXSA9IHsKKwl7RVJSYmFkZnVuYywgLUVJTlZBTH0sCisJe0VSUmJhZGZpbGUsIC1FTk9FTlR9LAorCXtFUlJiYWRwYXRoLCAtRU5PVERJUn0sCisJe0VSUm5vZmlkcywgLUVNRklMRX0sCisJe0VSUm5vYWNjZXNzLCAtRUFDQ0VTfSwKKwl7RVJSYmFkZmlkLCAtRUJBREZ9LAorCXtFUlJiYWRtY2IsIC1FSU99LAorCXtFUlJub21lbSwgLUVOT01FTX0sCisJe0VSUmJhZG1lbSwgLUVGQVVMVH0sCisJe0VSUmJhZGVudiwgLUVGQVVMVH0sCisJe0VSUmJhZGZvcm1hdCwgLUVJTlZBTH0sCisJe0VSUmJhZGFjY2VzcywgLUVBQ0NFU30sCisJe0VSUmJhZGRhdGEsIC1FSU99LAorCXtFUlJiYWRkcml2ZSwgLUVOWElPfSwKKwl7RVJScmVtY2QsIC1FQUNDRVN9LAorCXtFUlJkaWZmZGV2aWNlLCAtRVhERVZ9LAorCXtFUlJub2ZpbGVzLCAtRU5PRU5UfSwKKwl7RVJSYmFkc2hhcmUsIC1FVFhUQlNZfSwKKwl7RVJSbG9jaywgLUVBQ0NFU30sCisJe0VSUnVuc3VwLCAtRUlOVkFMfSwKKwl7RVJSbm9zdWNoc2hhcmUsLUVOWElPfSwKKwl7RVJSZmlsZXhpc3RzLCAtRUVYSVNUfSwKKwl7RVJSaW52cGFybSwgLUVJTlZBTH0sCisJe0VSUmRpc2tmdWxsLCAtRU5PU1BDfSwKKwl7RVJSaW52bmFtZSwgLUVOT0VOVH0sCisJe0VSUmludmxldmVsLC1FT1BOT1RTVVBQfSwKKwl7RVJSZGlybm90ZW1wdHksIC1FTk9URU1QVFl9LAorCXtFUlJub3Rsb2NrZWQsIC1FTk9MQ0t9LAorCXtFUlJhbHJlYWR5ZXhpc3RzLCAtRUVYSVNUfSwKKwl7RVJSbW9yZWRhdGEsIC1FT1ZFUkZMT1d9LAorCXtFUlJlYXNub3RzdXBwb3J0ZWQsLUVPUE5PVFNVUFB9LAorCXtFcnJRdW90YSwgLUVEUVVPVH0sCisJe0Vyck5vdEFMaW5rLCAtRU5PTElOS30sCisJe0VSUm5ldGxvZ29uTm90U3RhcnRlZCwtRU5PUFJPVE9PUFR9LAorCXswLCAwfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbWJfdG9fcG9zaXhfZXJyb3IgbWFwcGluZ190YWJsZV9FUlJTUlZbXSA9IHsKKwl7RVJSZXJyb3IsIC1FSU99LAorCXtFUlJiYWRwdywgLUVQRVJNfSwKKwl7RVJSYmFkdHlwZSwgLUVSRU1PVEV9LAorCXtFUlJhY2Nlc3MsIC1FQUNDRVN9LAorCXtFUlJpbnZ0aWQsIC1FTlhJT30sCisJe0VSUmludm5ldG5hbWUsIC1FTk9ERVZ9LAorCXtFUlJpbnZkZXZpY2UsIC1FTlhJT30sCisJe0VSUnFmdWxsLCAtRU5PU1BDfSwKKwl7RVJScXRvb2JpZywgLUVOT1NQQ30sCisJe0VSUnFlb2YsIC1FSU99LAorCXtFUlJpbnZwZmlkLCAtRUJBREZ9LAorCXtFUlJzbWJjbWQsIC1FQkFEUlFDfSwKKwl7RVJSc3J2ZXJyb3IsIC1FSU99LAorCXtFUlJiYWRCSUQsIC1FSU99LAorCXtFUlJmaWxlc3BlY3MsIC1FSU5WQUx9LAorCXtFUlJiYWRMaW5rLCAtRUlPfSwKKwl7RVJSYmFkcGVybWl0cywgLUVJTlZBTH0sCisJe0VSUmJhZFBJRCwgLUVTUkNIfSwKKwl7RVJSc2V0YXR0cm1vZGUsIC1FSU5WQUx9LAorCXtFUlJwYXVzZWQsIC1FSE9TVERPV059LAorCXtFUlJtc2dvZmYsIC1FSE9TVERPV059LAorCXtFUlJub3Jvb20sIC1FTk9TUEN9LAorCXtFUlJybXVucywgLUVVU0VSU30sCisJe0VSUnRpbWVvdXQsIC1FVElNRX0sCisJe0VSUm5vcmVzb3VyY2UsIC1FTk9CVUZTfSwKKwl7RVJSdG9vbWFueXVpZHMsIC1FVVNFUlN9LAorCXtFUlJiYWR1aWQsIC1FQUNDRVN9LAorCXtFUlJ1c2VtcHgsIC1FSU99LAorCXtFUlJ1c2VzdGQsIC1FSU99LAorCXtFUlJfTk9USUZZX0VOVU1fRElSLCAtRU5PQlVGU30sCisJe0VSUmFjY291bnRleHBpcmVkLCAtRUFDQ0VTfSwKKwl7RVJSYmFkY2xpZW50LCAtRUFDQ0VTfSwKKwl7RVJSYmFkTG9nb25UaW1lLCAtRUFDQ0VTfSwKKwl7RVJScGFzc3dvcmRFeHBpcmVkLCAtRUFDQ0VTfSwKKwl7RVJSbm9zdXBwb3J0LCAtRUlOVkFMfSwKKwl7MCwgMH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc21iX3RvX3Bvc2l4X2Vycm9yIG1hcHBpbmdfdGFibGVfRVJSSFJEW10gPSB7CisJezAsIDB9Cit9OworCisvKiBDb252ZXJ0IHN0cmluZyBjb250YWluaW5nIGRvdHRlZCBpcCBhZGRyZXNzIHRvIGJpbmFyeSBmb3JtICovCisvKiByZXR1cm5zIDAgaWYgaW52YWxpZCBhZGRyZXNzICovCisKKy8qIEJCIGFkZCBhZGRyZXNzIGZhbWlseSwgY2hhbmdlIHJjIHRvIHN0YXR1cyBmbGFnIGFuZCByZXR1cm4gdW5pb24gb3IgZm9yIGlwdjYgKi8KKy8qICB3aWxsIG5lZWQgcGFyZW50IHRvIGNhbGwgc29tZXRoaW5nIGxpa2UgaW5ldF9wdG9uIHRvIGNvbnZlcnQgaXB2NiBhZGRyZXNzICBCQiAqLworaW50CitjaWZzX2luZXRfcHRvbihpbnQgYWRkcmVzc19mYW1pbHksIGNoYXIgKmNwLHZvaWQgKmRzdCkKK3sKKwlzdHJ1Y3QgaW5fYWRkciBhZGRyZXNzOworCWludCB2YWx1ZTsKKwlpbnQgZGlnaXQ7CisJaW50IGk7CisJY2hhciB0ZW1wOworCWNoYXIgYnl0ZXNbNF07CisJY2hhciAqZW5kID0gYnl0ZXM7CisJc3RhdGljIGNvbnN0IGludCBhZGRyX2NsYXNzX21heFs0XSA9CisJICAgIHsgMHhmZmZmZmZmZiwgMHhmZmZmZmYsIDB4ZmZmZiwgMHhmZiB9OworCisJaWYoYWRkcmVzc19mYW1pbHkgIT0gQUZfSU5FVCkKKwkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWJ5dGVzW2ldID0gMDsKKwl9CisKKwl0ZW1wID0gKmNwOworCisJd2hpbGUgKFRSVUUpIHsKKwkJaWYgKCFpc2RpZ2l0KHRlbXApKQorCQkJcmV0dXJuIDA7CisKKwkJdmFsdWUgPSAwOworCQlkaWdpdCA9IDA7CisJCWZvciAoOzspIHsKKwkJCWlmIChpc2FzY2lpKHRlbXApICYmIGlzZGlnaXQodGVtcCkpIHsKKwkJCQl2YWx1ZSA9ICh2YWx1ZSAqIDEwKSArIHRlbXAgLSAnMCc7CisJCQkJdGVtcCA9ICorK2NwOworCQkJCWRpZ2l0ID0gMTsKKwkJCX0gZWxzZQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKHRlbXAgPT0gJy4nKSB7CisJCQlpZiAoKGVuZCA+IGJ5dGVzICsgMikgfHwgKHZhbHVlID4gMjU1KSkKKwkJCQlyZXR1cm4gMDsKKwkJCSplbmQrKyA9IHZhbHVlOworCQkJdGVtcCA9ICorK2NwOworCQl9IGVsc2UgaWYgKHRlbXAgPT0gJzonKSB7CisJCQljRllJKDEsKCJJUHY2IGFkZHJlc3NlcyBub3Qgc3VwcG9ydGVkIGZvciBDSUZTIG1vdW50cyB5ZXQiKSk7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCisJLyogY2hlY2sgZm9yIGxhc3QgY2hhcmFjdGVycyAqLworCWlmICh0ZW1wICE9ICdcMCcgJiYgKCFpc2FzY2lpKHRlbXApIHx8ICFpc3NwYWNlKHRlbXApKSkKKwkJaWYgKHRlbXAgIT0gJ1xcJykgeworCQkJaWYgKHRlbXAgIT0gJy8nKQorCQkJCXJldHVybiAwOworCQkJZWxzZQorCQkJCSgqY3AgPSAnXFwnKTsJLyogc3dpdGNoIHRoZSBzbGFzaCB0aGUgZXhwZWN0ZWQgd2F5ICovCisJCX0KKwlpZiAodmFsdWUgPiBhZGRyX2NsYXNzX21heFtlbmQgLSBieXRlc10pCisJCXJldHVybiAwOworCisJYWRkcmVzcy5zX2FkZHIgPSAqKChfX2JlMzIgKikgYnl0ZXMpIHwgaHRvbmwodmFsdWUpOworCSooKF9fYmUzMiAqKWRzdCkgPSBhZGRyZXNzLnNfYWRkcjsKKwlyZXR1cm4gMTsgLyogc3VjY2VzcyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2NvbnZlcnQgYSBOVCBzdGF0dXMgY29kZSB0byBhIGRvcyBjbGFzcy9jb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBOVCBzdGF0dXMgLT4gZG9zIGVycm9yIG1hcCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJX191OCBkb3NfY2xhc3M7CisJX191MTYgZG9zX2NvZGU7CisJX191MzIgbnRzdGF0dXM7Cit9IG50c3RhdHVzX3RvX2Rvc19tYXBbXSA9IHsKKwl7CisJRVJSRE9TLCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVU5TVUNDRVNTRlVMfSwgeworCUVSUkRPUywgRVJSYmFkZnVuYywgTlRfU1RBVFVTX05PVF9JTVBMRU1FTlRFRH0sIHsKKwlFUlJET1MsIDg3LCBOVF9TVEFUVVNfSU5WQUxJRF9JTkZPX0NMQVNTfSwgeworCUVSUkRPUywgMjQsIE5UX1NUQVRVU19JTkZPX0xFTkdUSF9NSVNNQVRDSH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BQ0NFU1NfVklPTEFUSU9OfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOX1BBR0VfRVJST1J9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUEFHRUZJTEVfUVVPVEF9LCB7CisJRVJSRE9TLCBFUlJiYWRmaWQsIE5UX1NUQVRVU19JTlZBTElEX0hBTkRMRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19CQURfSU5JVElBTF9TVEFDS30sIHsKKwlFUlJET1MsIDE5MywgTlRfU1RBVFVTX0JBRF9JTklUSUFMX1BDfSwgeworCUVSUkRPUywgODcsIE5UX1NUQVRVU19JTlZBTElEX0NJRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19USU1FUl9OT1RfQ0FOQ0VMRUR9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSfSwgeworCUVSUkRPUywgRVJSYmFkZmlsZSwgTlRfU1RBVFVTX05PX1NVQ0hfREVWSUNFfSwgeworCUVSUkRPUywgRVJSYmFkZmlsZSwgTlRfU1RBVFVTX05PX1NVQ0hfRklMRX0sIHsKKwlFUlJET1MsIEVSUmJhZGZ1bmMsIE5UX1NUQVRVU19JTlZBTElEX0RFVklDRV9SRVFVRVNUfSwgeworCUVSUkRPUywgMzgsIE5UX1NUQVRVU19FTkRfT0ZfRklMRX0sIHsKKwlFUlJET1MsIDM0LCBOVF9TVEFUVVNfV1JPTkdfVk9MVU1FfSwgeworCUVSUkRPUywgMjEsIE5UX1NUQVRVU19OT19NRURJQV9JTl9ERVZJQ0V9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVU5SRUNPR05JWkVEX01FRElBfSwgeworCUVSUkRPUywgMjcsIE5UX1NUQVRVU19OT05FWElTVEVOVF9TRUNUT1J9LAorLyoJeyBUaGlzIE5UIGVycm9yIGNvZGUgd2FzICdzcWFzaGVkJworCSBmcm9tIE5UX1NUQVRVU19NT1JFX1BST0NFU1NJTkdfUkVRVUlSRUQgdG8gTlRfU1RBVFVTX09LIAorCSBkdXJpbmcgdGhlIHNlc3Npb24gc2V0dXAgfSAqLworCXsKKwlFUlJET1MsIEVSUm5vbWVtLCBOVF9TVEFUVVNfTk9fTUVNT1JZfSwgeworCUVSUkRPUywgNDg3LCBOVF9TVEFUVVNfQ09ORkxJQ1RJTkdfQUREUkVTU0VTfSwgeworCUVSUkRPUywgNDg3LCBOVF9TVEFUVVNfTk9UX01BUFBFRF9WSUVXfSwgeworCUVSUkRPUywgODcsIE5UX1NUQVRVU19VTkFCTEVfVE9fRlJFRV9WTX0sIHsKKwlFUlJET1MsIDg3LCBOVF9TVEFUVVNfVU5BQkxFX1RPX0RFTEVURV9TRUNUSU9OfSwgeworCUVSUkRPUywgMjE0MiwgTlRfU1RBVFVTX0lOVkFMSURfU1lTVEVNX1NFUlZJQ0V9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSUxMRUdBTF9JTlNUUlVDVElPTn0sIHsKKwlFUlJET1MsIEVSUm5vYWNjZXNzLCBOVF9TVEFUVVNfSU5WQUxJRF9MT0NLX1NFUVVFTkNFfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19JTlZBTElEX1ZJRVdfU0laRX0sIHsKKwlFUlJET1MsIDE5MywgTlRfU1RBVFVTX0lOVkFMSURfRklMRV9GT1JfU0VDVElPTn0sIHsKKwlFUlJET1MsIEVSUm5vYWNjZXNzLCBOVF9TVEFUVVNfQUxSRUFEWV9DT01NSVRURUR9LAorLyoJeyBUaGlzIE5UIGVycm9yIGNvZGUgd2FzICdzcWFzaGVkJworCSBmcm9tIE5UX1NUQVRVU19BQ0NFU1NfREVOSUVEIHRvIE5UX1NUQVRVU19UUlVTVEVEX1JFTEFUSU9OU0hJUF9GQUlMVVJFIAorCSBkdXJpbmcgdGhlIHNlc3Npb24gc2V0dXAgfSAgICovCisJeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19BQ0NFU1NfREVOSUVEfSwgeworCUVSUkRPUywgMTExLCBOVF9TVEFUVVNfQlVGRkVSX1RPT19TTUFMTH0sIHsKKwlFUlJET1MsIEVSUmJhZGZpZCwgTlRfU1RBVFVTX09CSkVDVF9UWVBFX01JU01BVENIfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05PTkNPTlRJTlVBQkxFX0VYQ0VQVElPTn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlZBTElEX0RJU1BPU0lUSU9OfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1VOV0lORH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19CQURfU1RBQ0t9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9VTldJTkRfVEFSR0VUfSwgeworCUVSUkRPUywgMTU4LCBOVF9TVEFUVVNfTk9UX0xPQ0tFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19QQVJJVFlfRVJST1J9LCB7CisJRVJSRE9TLCA0ODcsIE5UX1NUQVRVU19VTkFCTEVfVE9fREVDT01NSVRfVk19LCB7CisJRVJSRE9TLCA0ODcsIE5UX1NUQVRVU19OT1RfQ09NTUlUVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfUE9SVF9BVFRSSUJVVEVTfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1BPUlRfTUVTU0FHRV9UT09fTE9OR30sIHsKKwlFUlJET1MsIDg3LCBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfTUlYfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfUVVPVEFfTE9XRVJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRElTS19DT1JSVVBUX0VSUk9SfSwgeworCUVSUkRPUywgRVJSYmFkZmlsZSwgTlRfU1RBVFVTX09CSkVDVF9OQU1FX0lOVkFMSUR9LCB7CS8qIG1hcHBpbmcgY2hhbmdlZCBzaW5jZSBzaGVsbCBkb2VzIGxvb2t1cCBvbiAqIGFuZCBleHBlY3RzIGZpbGUgbm90IGZvdW5kICovCisJRVJSRE9TLCBFUlJiYWRmaWxlLCBOVF9TVEFUVVNfT0JKRUNUX05BTUVfTk9UX0ZPVU5EfSwgeworCUVSUkRPUywgRVJSYWxyZWFkeWV4aXN0cywgTlRfU1RBVFVTX09CSkVDVF9OQU1FX0NPTExJU0lPTn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19IQU5ETEVfTk9UX1dBSVRBQkxFfSwgeworCUVSUkRPUywgRVJSYmFkZmlkLCBOVF9TVEFUVVNfUE9SVF9ESVNDT05ORUNURUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfREVWSUNFX0FMUkVBRFlfQVRUQUNIRUR9LCB7CisJRVJSRE9TLCAxNjEsIE5UX1NUQVRVU19PQkpFQ1RfUEFUSF9JTlZBTElEfSwgeworCUVSUkRPUywgRVJSYmFkcGF0aCwgTlRfU1RBVFVTX09CSkVDVF9QQVRIX05PVF9GT1VORH0sIHsKKwlFUlJET1MsIDE2MSwgTlRfU1RBVFVTX09CSkVDVF9QQVRIX1NZTlRBWF9CQUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfREFUQV9PVkVSUlVOfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0RBVEFfTEFURV9FUlJPUn0sIHsKKwlFUlJET1MsIDIzLCBOVF9TVEFUVVNfREFUQV9FUlJPUn0sIHsKKwlFUlJET1MsIDIzLCBOVF9TVEFUVVNfQ1JDX0VSUk9SfSwgeworCUVSUkRPUywgRVJSbm9tZW0sIE5UX1NUQVRVU19TRUNUSU9OX1RPT19CSUd9LCB7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgTlRfU1RBVFVTX1BPUlRfQ09OTkVDVElPTl9SRUZVU0VEfSwgeworCUVSUkRPUywgRVJSYmFkZmlkLCBOVF9TVEFUVVNfSU5WQUxJRF9QT1JUX0hBTkRMRX0sIHsKKwlFUlJET1MsIEVSUmJhZHNoYXJlLCBOVF9TVEFUVVNfU0hBUklOR19WSU9MQVRJT059LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUVVPVEFfRVhDRUVERUR9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFHRV9QUk9URUNUSU9OfSwgeworCUVSUkRPUywgMjg4LCBOVF9TVEFUVVNfTVVUQU5UX05PVF9PV05FRH0sIHsKKwlFUlJET1MsIDI5OCwgTlRfU1RBVFVTX1NFTUFQSE9SRV9MSU1JVF9FWENFRURFRH0sIHsKKwlFUlJET1MsIDg3LCBOVF9TVEFUVVNfUE9SVF9BTFJFQURZX1NFVH0sIHsKKwlFUlJET1MsIDg3LCBOVF9TVEFUVVNfU0VDVElPTl9OT1RfSU1BR0V9LCB7CisJRVJSRE9TLCAxNTYsIE5UX1NUQVRVU19TVVNQRU5EX0NPVU5UX0VYQ0VFREVEfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19USFJFQURfSVNfVEVSTUlOQVRJTkd9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0JBRF9XT1JLSU5HX1NFVF9MSU1JVH0sIHsKKwlFUlJET1MsIDg3LCBOVF9TVEFUVVNfSU5DT01QQVRJQkxFX0ZJTEVfTUFQfSwgeworCUVSUkRPUywgODcsIE5UX1NUQVRVU19TRUNUSU9OX1BST1RFQ1RJT059LCB7CisJRVJSRE9TLCBFUlJlYXNub3RzdXBwb3J0ZWQsIE5UX1NUQVRVU19FQVNfTk9UX1NVUFBPUlRFRH0sIHsKKwlFUlJET1MsIDI1NSwgTlRfU1RBVFVTX0VBX1RPT19MQVJHRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19OT05FWElTVEVOVF9FQV9FTlRSWX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19OT19FQVNfT05fRklMRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19FQV9DT1JSVVBUX0VSUk9SfSwgeworCUVSUkRPUywgRVJSbG9jaywgTlRfU1RBVFVTX0ZJTEVfTE9DS19DT05GTElDVH0sIHsKKwlFUlJET1MsIEVSUmxvY2ssIE5UX1NUQVRVU19MT0NLX05PVF9HUkFOVEVEfSwgeworCUVSUkRPUywgRVJSYmFkZmlsZSwgTlRfU1RBVFVTX0RFTEVURV9QRU5ESU5HfSwgeworCUVSUkRPUywgRVJSdW5zdXAsIE5UX1NUQVRVU19DVExfRklMRV9OT1RfU1VQUE9SVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1VOS05PV05fUkVWSVNJT059LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUkVWSVNJT05fTUlTTUFUQ0h9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9PV05FUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlZBTElEX1BSSU1BUllfR1JPVVB9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9fSU1QRVJTT05BVElPTl9UT0tFTn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19DQU5UX0RJU0FCTEVfTUFOREFUT1JZfSwgeworCUVSUkRPUywgMjIxNSwgTlRfU1RBVFVTX05PX0xPR09OX1NFUlZFUlN9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9fU1VDSF9MT0dPTl9TRVNTSU9OfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05PX1NVQ0hfUFJJVklMRUdFfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19QUklWSUxFR0VfTk9UX0hFTER9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9BQ0NPVU5UX05BTUV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVVNFUl9FWElTVFN9LAorLyoJeyBUaGlzIE5UIGVycm9yIGNvZGUgd2FzICdzcWFzaGVkJworCSBmcm9tIE5UX1NUQVRVU19OT19TVUNIX1VTRVIgdG8gTlRfU1RBVFVTX0xPR09OX0ZBSUxVUkUgCisJIGR1cmluZyB0aGUgc2Vzc2lvbiBzZXR1cCB9ICovCisJeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19OT19TVUNIX1VTRVJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfR1JPVVBfRVhJU1RTfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05PX1NVQ0hfR1JPVVB9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTUVNQkVSX0lOX0dST1VQfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX01FTUJFUl9OT1RfSU5fR1JPVVB9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTEFTVF9BRE1JTn0sCisvKgl7IFRoaXMgTlQgZXJyb3IgY29kZSB3YXMgJ3NxYXNoZWQnCisJIGZyb20gTlRfU1RBVFVTX1dST05HX1BBU1NXT1JEIHRvIE5UX1NUQVRVU19MT0dPTl9GQUlMVVJFIAorCSBkdXJpbmcgdGhlIHNlc3Npb24gc2V0dXAgfSAqLworCXsKKwlFUlJTUlYsIEVSUmJhZHB3LCBOVF9TVEFUVVNfV1JPTkdfUEFTU1dPUkR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSUxMX0ZPUk1FRF9QQVNTV09SRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19QQVNTV09SRF9SRVNUUklDVElPTn0sIHsKKwlFUlJET1MsIEVSUm5vYWNjZXNzLCBOVF9TVEFUVVNfTE9HT05fRkFJTFVSRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BQ0NPVU5UX1JFU1RSSUNUSU9OfSwgeworCUVSUlNSViwgMjI0MSwgTlRfU1RBVFVTX0lOVkFMSURfTE9HT05fSE9VUlN9LCB7CisJRVJSU1JWLCAyMjQwLCBOVF9TVEFUVVNfSU5WQUxJRF9XT1JLU1RBVElPTn0sIHsKKwlFUlJTUlYsIDIyNDIsIE5UX1NUQVRVU19QQVNTV09SRF9FWFBJUkVEfSwgeworCUVSUlNSViwgMjIzOSwgTlRfU1RBVFVTX0FDQ09VTlRfRElTQUJMRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9ORV9NQVBQRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVE9PX01BTllfTFVJRFNfUkVRVUVTVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0xVSURTX0VYSEFVU1RFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlZBTElEX1NVQl9BVVRIT1JJVFl9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9BQ0x9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9TSUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9TRUNVUklUWV9ERVNDUn0sIHsKKwlFUlJET1MsIDEyNywgTlRfU1RBVFVTX1BST0NFRFVSRV9OT1RfRk9VTkR9LCB7CisJRVJSRE9TLCAxOTMsIE5UX1NUQVRVU19JTlZBTElEX0lNQUdFX0ZPUk1BVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19OT19UT0tFTn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19CQURfSU5IRVJJVEFOQ0VfQUNMfSwgeworCUVSUkRPUywgMTU4LCBOVF9TVEFUVVNfUkFOR0VfTk9UX0xPQ0tFRH0sIHsKKwlFUlJET1MsIDExMiwgTlRfU1RBVFVTX0RJU0tfRlVMTH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19TRVJWRVJfRElTQUJMRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfU0VSVkVSX05PVF9ESVNBQkxFRH0sIHsKKwlFUlJET1MsIDY4LCBOVF9TVEFUVVNfVE9PX01BTllfR1VJRFNfUkVRVUVTVEVEfSwgeworCUVSUkRPUywgMjU5LCBOVF9TVEFUVVNfR1VJRFNfRVhIQVVTVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfSURfQVVUSE9SSVRZfSwgeworCUVSUkRPUywgMjU5LCBOVF9TVEFUVVNfQUdFTlRTX0VYSEFVU1RFRH0sIHsKKwlFUlJET1MsIDE1NCwgTlRfU1RBVFVTX0lOVkFMSURfVk9MVU1FX0xBQkVMfSwgeworCUVSUkRPUywgMTQsIE5UX1NUQVRVU19TRUNUSU9OX05PVF9FWFRFTkRFRH0sIHsKKwlFUlJET1MsIDQ4NywgTlRfU1RBVFVTX05PVF9NQVBQRURfREFUQX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19SRVNPVVJDRV9EQVRBX05PVF9GT1VORH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19SRVNPVVJDRV9UWVBFX05PVF9GT1VORH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19SRVNPVVJDRV9OQU1FX05PVF9GT1VORH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BUlJBWV9CT1VORFNfRVhDRUVERUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRkxPQVRfREVOT1JNQUxfT1BFUkFORH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GTE9BVF9ESVZJREVfQllfWkVST30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GTE9BVF9JTkVYQUNUX1JFU1VMVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GTE9BVF9JTlZBTElEX09QRVJBVElPTn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GTE9BVF9PVkVSRkxPV30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GTE9BVF9TVEFDS19DSEVDS30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GTE9BVF9VTkRFUkZMT1d9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5URUdFUl9ESVZJREVfQllfWkVST30sIHsKKwlFUlJET1MsIDUzNCwgTlRfU1RBVFVTX0lOVEVHRVJfT1ZFUkZMT1d9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUFJJVklMRUdFRF9JTlNUUlVDVElPTn0sIHsKKwlFUlJET1MsIEVSUm5vbWVtLCBOVF9TVEFUVVNfVE9PX01BTllfUEFHSU5HX0ZJTEVTfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0ZJTEVfSU5WQUxJRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BTExPVFRFRF9TUEFDRV9FWENFRURFRH0sCisvKgl7IFRoaXMgTlQgZXJyb3IgY29kZSB3YXMgJ3NxYXNoZWQnCisJIGZyb20gTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMgdG8gTlRfU1RBVFVTX0lOU1VGRl9TRVJWRVJfUkVTT1VSQ0VTIAorCSBkdXJpbmcgdGhlIHNlc3Npb24gc2V0dXAgfSAqLworCXsKKwlFUlJET1MsIEVSUm5vbWVtLCBOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX1JFU09VUkNFU30sIHsKKwlFUlJET1MsIEVSUmJhZHBhdGgsIE5UX1NUQVRVU19ERlNfRVhJVF9QQVRIX0ZPVU5EfSwgeworCUVSUkRPUywgMjMsIE5UX1NUQVRVU19ERVZJQ0VfREFUQV9FUlJPUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19ERVZJQ0VfTk9UX0NPTk5FQ1RFRH0sIHsKKwlFUlJET1MsIDIxLCBOVF9TVEFUVVNfREVWSUNFX1BPV0VSX0ZBSUxVUkV9LCB7CisJRVJSRE9TLCA0ODcsIE5UX1NUQVRVU19GUkVFX1ZNX05PVF9BVF9CQVNFfSwgeworCUVSUkRPUywgNDg3LCBOVF9TVEFUVVNfTUVNT1JZX05PVF9BTExPQ0FURUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfV09SS0lOR19TRVRfUVVPVEF9LCB7CisJRVJSRE9TLCAxOSwgTlRfU1RBVFVTX01FRElBX1dSSVRFX1BST1RFQ1RFRH0sIHsKKwlFUlJET1MsIDIxLCBOVF9TVEFUVVNfREVWSUNFX05PVF9SRUFEWX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlZBTElEX0dST1VQX0FUVFJJQlVURVN9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfQkFEX0lNUEVSU09OQVRJT05fTEVWRUx9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfQ0FOVF9PUEVOX0FOT05ZTU9VU30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19CQURfVkFMSURBVElPTl9DTEFTU30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19CQURfVE9LRU5fVFlQRX0sIHsKKwlFUlJET1MsIDg3LCBOVF9TVEFUVVNfQkFEX01BU1RFUl9CT09UX1JFQ09SRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlNUUlVDVElPTl9NSVNBTElHTk1FTlR9LCB7CisJRVJSRE9TLCBFUlJwaXBlYnVzeSwgTlRfU1RBVFVTX0lOU1RBTkNFX05PVF9BVkFJTEFCTEV9LCB7CisJRVJSRE9TLCBFUlJwaXBlYnVzeSwgTlRfU1RBVFVTX1BJUEVfTk9UX0FWQUlMQUJMRX0sIHsKKwlFUlJET1MsIEVSUmJhZHBpcGUsIE5UX1NUQVRVU19JTlZBTElEX1BJUEVfU1RBVEV9LCB7CisJRVJSRE9TLCBFUlJwaXBlYnVzeSwgTlRfU1RBVFVTX1BJUEVfQlVTWX0sIHsKKwlFUlJET1MsIEVSUmJhZGZ1bmMsIE5UX1NUQVRVU19JTExFR0FMX0ZVTkNUSU9OfSwgeworCUVSUkRPUywgRVJSbm90Y29ubmVjdGVkLCBOVF9TVEFUVVNfUElQRV9ESVNDT05ORUNURUR9LCB7CisJRVJSRE9TLCBFUlJwaXBlY2xvc2luZywgTlRfU1RBVFVTX1BJUEVfQ0xPU0lOR30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19QSVBFX0NPTk5FQ1RFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19QSVBFX0xJU1RFTklOR30sIHsKKwlFUlJET1MsIEVSUmJhZHBpcGUsIE5UX1NUQVRVU19JTlZBTElEX1JFQURfTU9ERX0sIHsKKwlFUlJET1MsIDEyMSwgTlRfU1RBVFVTX0lPX1RJTUVPVVR9LCB7CisJRVJSRE9TLCAzOCwgTlRfU1RBVFVTX0ZJTEVfRk9SQ0VEX0NMT1NFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19QUk9GSUxJTkdfTk9UX1NUQVJURUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUFJPRklMSU5HX05PVF9TVE9QUEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0NPVUxEX05PVF9JTlRFUlBSRVR9LCB7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgTlRfU1RBVFVTX0ZJTEVfSVNfQV9ESVJFQ1RPUll9LCB7CisJRVJSRE9TLCBFUlJ1bnN1cCwgTlRfU1RBVFVTX05PVF9TVVBQT1JURUR9LCB7CisJRVJSRE9TLCA1MSwgTlRfU1RBVFVTX1JFTU9URV9OT1RfTElTVEVOSU5HfSwgeworCUVSUkRPUywgNTIsIE5UX1NUQVRVU19EVVBMSUNBVEVfTkFNRX0sIHsKKwlFUlJET1MsIDUzLCBOVF9TVEFUVVNfQkFEX05FVFdPUktfUEFUSH0sIHsKKwlFUlJET1MsIDU0LCBOVF9TVEFUVVNfTkVUV09SS19CVVNZfSwgeworCUVSUkRPUywgNTUsIE5UX1NUQVRVU19ERVZJQ0VfRE9FU19OT1RfRVhJU1R9LCB7CisJRVJSRE9TLCA1NiwgTlRfU1RBVFVTX1RPT19NQU5ZX0NPTU1BTkRTfSwgeworCUVSUkRPUywgNTcsIE5UX1NUQVRVU19BREFQVEVSX0hBUkRXQVJFX0VSUk9SfSwgeworCUVSUkRPUywgNTgsIE5UX1NUQVRVU19JTlZBTElEX05FVFdPUktfUkVTUE9OU0V9LCB7CisJRVJSRE9TLCA1OSwgTlRfU1RBVFVTX1VORVhQRUNURURfTkVUV09SS19FUlJPUn0sIHsKKwlFUlJET1MsIDYwLCBOVF9TVEFUVVNfQkFEX1JFTU9URV9BREFQVEVSfSwgeworCUVSUkRPUywgNjEsIE5UX1NUQVRVU19QUklOVF9RVUVVRV9GVUxMfSwgeworCUVSUkRPUywgNjIsIE5UX1NUQVRVU19OT19TUE9PTF9TUEFDRX0sIHsKKwlFUlJET1MsIDYzLCBOVF9TVEFUVVNfUFJJTlRfQ0FOQ0VMTEVEfSwgeworCUVSUkRPUywgNjQsIE5UX1NUQVRVU19ORVRXT1JLX05BTUVfREVMRVRFRH0sIHsKKwlFUlJET1MsIDY1LCBOVF9TVEFUVVNfTkVUV09SS19BQ0NFU1NfREVOSUVEfSwgeworCUVSUkRPUywgNjYsIE5UX1NUQVRVU19CQURfREVWSUNFX1RZUEV9LCB7CisJRVJSRE9TLCBFUlJub3N1Y2hzaGFyZSwgTlRfU1RBVFVTX0JBRF9ORVRXT1JLX05BTUV9LCB7CisJRVJSRE9TLCA2OCwgTlRfU1RBVFVTX1RPT19NQU5ZX05BTUVTfSwgeworCUVSUkRPUywgNjksIE5UX1NUQVRVU19UT09fTUFOWV9TRVNTSU9OU30sIHsKKwlFUlJET1MsIDcwLCBOVF9TVEFUVVNfU0hBUklOR19QQVVTRUR9LCB7CisJRVJSRE9TLCA3MSwgTlRfU1RBVFVTX1JFUVVFU1RfTk9UX0FDQ0VQVEVEfSwgeworCUVSUkRPUywgNzIsIE5UX1NUQVRVU19SRURJUkVDVE9SX1BBVVNFRH0sIHsKKwlFUlJET1MsIDg4LCBOVF9TVEFUVVNfTkVUX1dSSVRFX0ZBVUxUfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1BST0ZJTElOR19BVF9MSU1JVH0sIHsKKwlFUlJET1MsIEVSUmRpZmZkZXZpY2UsIE5UX1NUQVRVU19OT1RfU0FNRV9ERVZJQ0V9LCB7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgTlRfU1RBVFVTX0ZJTEVfUkVOQU1FRH0sIHsKKwlFUlJET1MsIDI0MCwgTlRfU1RBVFVTX1ZJUlRVQUxfQ0lSQ1VJVF9DTE9TRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9fU0VDVVJJVFlfT05fT0JKRUNUfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0NBTlRfV0FJVH0sIHsKKwlFUlJET1MsIEVSUnBpcGVjbG9zaW5nLCBOVF9TVEFUVVNfUElQRV9FTVBUWX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19DQU5UX0FDQ0VTU19ET01BSU5fSU5GT30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19DQU5UX1RFUk1JTkFURV9TRUxGfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfU0VSVkVSX1NUQVRFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfRE9NQUlOX1NUQVRFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfRE9NQUlOX1JPTEV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9fU1VDSF9ET01BSU59LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRE9NQUlOX0VYSVNUU30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19ET01BSU5fTElNSVRfRVhDRUVERUR9LCB7CisJRVJSRE9TLCAzMDAsIE5UX1NUQVRVU19PUExPQ0tfTk9UX0dSQU5URUR9LCB7CisJRVJSRE9TLCAzMDEsIE5UX1NUQVRVU19JTlZBTElEX09QTE9DS19QUk9UT0NPTH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlRFUk5BTF9EQl9DT1JSVVBUSU9OfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVEVSTkFMX0VSUk9SfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0dFTkVSSUNfTk9UX01BUFBFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19CQURfREVTQ1JJUFRPUl9GT1JNQVR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9VU0VSX0JVRkZFUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19VTkVYUEVDVEVEX0lPX0VSUk9SfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1VORVhQRUNURURfTU1fQ1JFQVRFX0VSUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19VTkVYUEVDVEVEX01NX01BUF9FUlJPUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19VTkVYUEVDVEVEX01NX0VYVEVORF9FUlJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9UX0xPR09OX1BST0NFU1N9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTE9HT05fU0VTU0lPTl9FWElTVFN9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzF9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzJ9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzN9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzR9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzV9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzZ9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzd9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzh9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzl9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzEwfSwgeworCUVSUkRPUywgODcsIE5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl8xMX0sIHsKKwlFUlJET1MsIDg3LCBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMTJ9LCB7CisJRVJSRE9TLCBFUlJiYWRwYXRoLCBOVF9TVEFUVVNfUkVESVJFQ1RPUl9OT1RfU1RBUlRFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19SRURJUkVDVE9SX1NUQVJURUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfU1RBQ0tfT1ZFUkZMT1d9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9fU1VDSF9QQUNLQUdFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0JBRF9GVU5DVElPTl9UQUJMRX0sIHsKKwlFUlJET1MsIDIwMywgMHhjMDAwMDEwMH0sIHsKKwlFUlJET1MsIDE0NSwgTlRfU1RBVFVTX0RJUkVDVE9SWV9OT1RfRU1QVFl9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRklMRV9DT1JSVVBUX0VSUk9SfSwgeworCUVSUkRPUywgMjY3LCBOVF9TVEFUVVNfTk9UX0FfRElSRUNUT1JZfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0JBRF9MT0dPTl9TRVNTSU9OX1NUQVRFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0xPR09OX1NFU1NJT05fQ09MTElTSU9OfSwgeworCUVSUkRPUywgMjA2LCBOVF9TVEFUVVNfTkFNRV9UT09fTE9OR30sIHsKKwlFUlJET1MsIDI0MDEsIE5UX1NUQVRVU19GSUxFU19PUEVOfSwgeworCUVSUkRPUywgMjQwNCwgTlRfU1RBVFVTX0NPTk5FQ1RJT05fSU5fVVNFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX01FU1NBR0VfTk9UX0ZPVU5EfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19QUk9DRVNTX0lTX1RFUk1JTkFUSU5HfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfTE9HT05fVFlQRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19OT19HVUlEX1RSQU5TTEFUSU9OfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0NBTk5PVF9JTVBFUlNPTkFURX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTUFHRV9BTFJFQURZX0xPQURFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BQklPU19OT1RfUFJFU0VOVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BQklPU19MSURfTk9UX0VYSVNUfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0FCSU9TX0xJRF9BTFJFQURZX09XTkVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0FCSU9TX05PVF9MSURfT1dORVJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfQUJJT1NfSU5WQUxJRF9DT01NQU5EfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0FCSU9TX0lOVkFMSURfTElEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0FCSU9TX1NFTEVDVE9SX05PVF9BVkFJTEFCTEV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfQUJJT1NfSU5WQUxJRF9TRUxFQ1RPUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19OT19MRFR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9MRFRfU0laRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlZBTElEX0xEVF9PRkZTRVR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9MRFRfREVTQ1JJUFRPUn0sIHsKKwlFUlJET1MsIDE5MywgTlRfU1RBVFVTX0lOVkFMSURfSU1BR0VfTkVfRk9STUFUfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1JYQUNUX0lOVkFMSURfU1RBVEV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUlhBQ1RfQ09NTUlUX0ZBSUxVUkV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTUFQUEVEX0ZJTEVfU0laRV9aRVJPfSwgeworCUVSUkRPUywgRVJSbm9maWRzLCBOVF9TVEFUVVNfVE9PX01BTllfT1BFTkVEX0ZJTEVTfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0NBTkNFTExFRH0sIHsKKwlFUlJET1MsIEVSUm5vYWNjZXNzLCBOVF9TVEFUVVNfQ0FOTk9UX0RFTEVURX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlZBTElEX0NPTVBVVEVSX05BTUV9LCB7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgTlRfU1RBVFVTX0ZJTEVfREVMRVRFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19TUEVDSUFMX0FDQ09VTlR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfU1BFQ0lBTF9HUk9VUH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19TUEVDSUFMX1VTRVJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTUVNQkVSU19QUklNQVJZX0dST1VQfSwgeworCUVSUkRPUywgRVJSYmFkZmlkLCBOVF9TVEFUVVNfRklMRV9DTE9TRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVE9PX01BTllfVEhSRUFEU30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19USFJFQURfTk9UX0lOX1BST0NFU1N9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVE9LRU5fQUxSRUFEWV9JTl9VU0V9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUEFHRUZJTEVfUVVPVEFfRVhDRUVERUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfQ09NTUlUTUVOVF9MSU1JVH0sIHsKKwlFUlJET1MsIDE5MywgTlRfU1RBVFVTX0lOVkFMSURfSU1BR0VfTEVfRk9STUFUfSwgeworCUVSUkRPUywgMTkzLCBOVF9TVEFUVVNfSU5WQUxJRF9JTUFHRV9OT1RfTVp9LCB7CisJRVJSRE9TLCAxOTMsIE5UX1NUQVRVU19JTlZBTElEX0lNQUdFX1BST1RFQ1R9LCB7CisJRVJSRE9TLCAxOTMsIE5UX1NUQVRVU19JTlZBTElEX0lNQUdFX1dJTl8xNn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19MT0dPTl9TRVJWRVJfQ09ORkxJQ1R9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVElNRV9ESUZGRVJFTkNFX0FUX0RDfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1NZTkNIUk9OSVpBVElPTl9SRVFVSVJFRH0sIHsKKwlFUlJET1MsIDEyNiwgTlRfU1RBVFVTX0RMTF9OT1RfRk9VTkR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfT1BFTl9GQUlMRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU9fUFJJVklMRUdFX0ZBSUxFRH0sIHsKKwlFUlJET1MsIDE4MiwgTlRfU1RBVFVTX09SRElOQUxfTk9UX0ZPVU5EfSwgeworCUVSUkRPUywgMTI3LCBOVF9TVEFUVVNfRU5UUllQT0lOVF9OT1RfRk9VTkR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfQ09OVFJPTF9DX0VYSVR9LCB7CisJRVJSRE9TLCA2NCwgTlRfU1RBVFVTX0xPQ0FMX0RJU0NPTk5FQ1R9LCB7CisJRVJSRE9TLCA2NCwgTlRfU1RBVFVTX1JFTU9URV9ESVNDT05ORUNUfSwgeworCUVSUkRPUywgNTEsIE5UX1NUQVRVU19SRU1PVEVfUkVTT1VSQ0VTfSwgeworCUVSUkRPUywgNTksIE5UX1NUQVRVU19MSU5LX0ZBSUxFRH0sIHsKKwlFUlJET1MsIDU5LCBOVF9TVEFUVVNfTElOS19USU1FT1VUfSwgeworCUVSUkRPUywgNTksIE5UX1NUQVRVU19JTlZBTElEX0NPTk5FQ1RJT059LCB7CisJRVJSRE9TLCA1OSwgTlRfU1RBVFVTX0lOVkFMSURfQUREUkVTU30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19ETExfSU5JVF9GQUlMRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTUlTU0lOR19TWVNURU1GSUxFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1VOSEFORExFRF9FWENFUFRJT059LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfQVBQX0lOSVRfRkFJTFVSRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19QQUdFRklMRV9DUkVBVEVfRkFJTEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05PX1BBR0VGSUxFfSwgeworCUVSUkRPUywgMTI0LCBOVF9TVEFUVVNfSU5WQUxJRF9MRVZFTH0sIHsKKwlFUlJET1MsIDg2LCBOVF9TVEFUVVNfV1JPTkdfUEFTU1dPUkRfQ09SRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTExFR0FMX0ZMT0FUX0NPTlRFWFR9LCB7CisJRVJSRE9TLCAxMDksIE5UX1NUQVRVU19QSVBFX0JST0tFTn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19SRUdJU1RSWV9DT1JSVVBUfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1JFR0lTVFJZX0lPX0ZBSUxFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19OT19FVkVOVF9QQUlSfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1VOUkVDT0dOSVpFRF9WT0xVTUV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfU0VSSUFMX05PX0RFVklDRV9JTklURUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9fU1VDSF9BTElBU30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19NRU1CRVJfTk9UX0lOX0FMSUFTfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX01FTUJFUl9JTl9BTElBU30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BTElBU19FWElTVFN9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTE9HT05fTk9UX0dSQU5URUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVE9PX01BTllfU0VDUkVUU30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19TRUNSRVRfVE9PX0xPTkd9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5URVJOQUxfREJfRVJST1J9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRlVMTFNDUkVFTl9NT0RFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1RPT19NQU5ZX0NPTlRFWFRfSURTfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19MT0dPTl9UWVBFX05PVF9HUkFOVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05PVF9SRUdJU1RSWV9GSUxFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05UX0NST1NTX0VOQ1JZUFRJT05fUkVRVUlSRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRE9NQUlOX0NUUkxSX0NPTkZJR19FUlJPUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GVF9NSVNTSU5HX01FTUJFUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTExfRk9STUVEX1NFUlZJQ0VfRU5UUll9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSUxMRUdBTF9DSEFSQUNURVJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVU5NQVBQQUJMRV9DSEFSQUNURVJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVU5ERUZJTkVEX0NIQVJBQ1RFUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GTE9QUFlfVk9MVU1FfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0ZMT1BQWV9JRF9NQVJLX05PVF9GT1VORH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GTE9QUFlfV1JPTkdfQ1lMSU5ERVJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRkxPUFBZX1VOS05PV05fRVJST1J9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRkxPUFBZX0JBRF9SRUdJU1RFUlN9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRElTS19SRUNBTElCUkFURV9GQUlMRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRElTS19PUEVSQVRJT05fRkFJTEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0RJU0tfUkVTRVRfRkFJTEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1NIQVJFRF9JUlFfQlVTWX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GVF9PUlBIQU5JTkd9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCAweGMwMDAwMTZlfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgMHhjMDAwMDE2Zn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIDB4YzAwMDAxNzB9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCAweGMwMDAwMTcxfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1BBUlRJVElPTl9GQUlMVVJFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfQkxPQ0tfTEVOR1RIfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0RFVklDRV9OT1RfUEFSVElUSU9ORUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVU5BQkxFX1RPX0xPQ0tfTUVESUF9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVU5BQkxFX1RPX1VOTE9BRF9NRURJQX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19FT01fT1ZFUkZMT1d9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9fTUVESUF9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCAweGMwMDAwMTc5fSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05PX1NVQ0hfTUVNQkVSfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfTUVNQkVSfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0tFWV9ERUxFVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05PX0xPR19TUEFDRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19UT09fTUFOWV9TSURTfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0xNX0NST1NTX0VOQ1JZUFRJT05fUkVRVUlSRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfS0VZX0hBU19DSElMRFJFTn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19DSElMRF9NVVNUX0JFX1ZPTEFUSUxFfSwgeworCUVSUkRPUywgODcsIE5UX1NUQVRVU19ERVZJQ0VfQ09ORklHVVJBVElPTl9FUlJPUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19EUklWRVJfSU5URVJOQUxfRVJST1J9LCB7CisJRVJSRE9TLCAyMiwgTlRfU1RBVFVTX0lOVkFMSURfREVWSUNFX1NUQVRFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lPX0RFVklDRV9FUlJPUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19ERVZJQ0VfUFJPVE9DT0xfRVJST1J9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfQkFDS1VQX0NPTlRST0xMRVJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTE9HX0ZJTEVfRlVMTH0sIHsKKwlFUlJET1MsIDE5LCBOVF9TVEFUVVNfVE9PX0xBVEV9LCB7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgTlRfU1RBVFVTX05PX1RSVVNUX0xTQV9TRUNSRVR9LAorLyoJeyBUaGlzIE5UIGVycm9yIGNvZGUgd2FzICdzcWFzaGVkJworCSBmcm9tIE5UX1NUQVRVU19OT19UUlVTVF9TQU1fQUNDT1VOVCB0byBOVF9TVEFUVVNfVFJVU1RFRF9SRUxBVElPTlNISVBfRkFJTFVSRSAKKwkgZHVyaW5nIHRoZSBzZXNzaW9uIHNldHVwIH0gKi8KKwl7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgTlRfU1RBVFVTX05PX1RSVVNUX1NBTV9BQ0NPVU5UfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19UUlVTVEVEX0RPTUFJTl9GQUlMVVJFfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19UUlVTVEVEX1JFTEFUSU9OU0hJUF9GQUlMVVJFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0VWRU5UTE9HX0ZJTEVfQ09SUlVQVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19FVkVOVExPR19DQU5UX1NUQVJUfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19UUlVTVF9GQUlMVVJFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX01VVEFOVF9MSU1JVF9FWENFRURFRH0sIHsKKwlFUlJET1MsIEVSUm5ldGxvZ29uTm90U3RhcnRlZCwgTlRfU1RBVFVTX05FVExPR09OX05PVF9TVEFSVEVEfSwgeworCUVSUlNSViwgMjIzOSwgTlRfU1RBVFVTX0FDQ09VTlRfRVhQSVJFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19QT1NTSUJMRV9ERUFETE9DS30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19ORVRXT1JLX0NSRURFTlRJQUxfQ09ORkxJQ1R9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUkVNT1RFX1NFU1NJT05fTElNSVR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRVZFTlRMT0dfRklMRV9DSEFOR0VEfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19OT0xPR09OX0lOVEVSRE9NQUlOX1RSVVNUX0FDQ09VTlR9LCB7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgTlRfU1RBVFVTX05PTE9HT05fV09SS1NUQVRJT05fVFJVU1RfQUNDT1VOVH0sIHsKKwlFUlJET1MsIEVSUm5vYWNjZXNzLCBOVF9TVEFUVVNfTk9MT0dPTl9TRVJWRVJfVFJVU1RfQUNDT1VOVH0sCisvKgl7IFRoaXMgTlQgZXJyb3IgY29kZSB3YXMgJ3NxYXNoZWQnCisJIGZyb20gTlRfU1RBVFVTX0RPTUFJTl9UUlVTVF9JTkNPTlNJU1RFTlQgdG8gTlRfU1RBVFVTX0xPR09OX0ZBSUxVUkUgCisJIGR1cmluZyB0aGUgc2Vzc2lvbiBzZXR1cCB9ICAqLworCXsKKwlFUlJET1MsIEVSUm5vYWNjZXNzLCBOVF9TVEFUVVNfRE9NQUlOX1RSVVNUX0lOQ09OU0lTVEVOVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GU19EUklWRVJfUkVRVUlSRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9fVVNFUl9TRVNTSU9OX0tFWX0sIHsKKwlFUlJET1MsIDU5LCBOVF9TVEFUVVNfVVNFUl9TRVNTSU9OX0RFTEVURUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUkVTT1VSQ0VfTEFOR19OT1RfRk9VTkR9LCB7CisJRVJSRE9TLCBFUlJub21lbSwgTlRfU1RBVFVTX0lOU1VGRl9TRVJWRVJfUkVTT1VSQ0VTfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfQlVGRkVSX1NJWkV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9BRERSRVNTX0NPTVBPTkVOVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlZBTElEX0FERFJFU1NfV0lMRENBUkR9LCB7CisJRVJSRE9TLCA2OCwgTlRfU1RBVFVTX1RPT19NQU5ZX0FERFJFU1NFU30sIHsKKwlFUlJET1MsIDUyLCBOVF9TVEFUVVNfQUREUkVTU19BTFJFQURZX0VYSVNUU30sIHsKKwlFUlJET1MsIDY0LCBOVF9TVEFUVVNfQUREUkVTU19DTE9TRUR9LCB7CisJRVJSRE9TLCA2NCwgTlRfU1RBVFVTX0NPTk5FQ1RJT05fRElTQ09OTkVDVEVEfSwgeworCUVSUkRPUywgNjQsIE5UX1NUQVRVU19DT05ORUNUSU9OX1JFU0VUfSwgeworCUVSUkRPUywgNjgsIE5UX1NUQVRVU19UT09fTUFOWV9OT0RFU30sIHsKKwlFUlJET1MsIDU5LCBOVF9TVEFUVVNfVFJBTlNBQ1RJT05fQUJPUlRFRH0sIHsKKwlFUlJET1MsIDU5LCBOVF9TVEFUVVNfVFJBTlNBQ1RJT05fVElNRURfT1VUfSwgeworCUVSUkRPUywgNTksIE5UX1NUQVRVU19UUkFOU0FDVElPTl9OT19SRUxFQVNFfSwgeworCUVSUkRPUywgNTksIE5UX1NUQVRVU19UUkFOU0FDVElPTl9OT19NQVRDSH0sIHsKKwlFUlJET1MsIDU5LCBOVF9TVEFUVVNfVFJBTlNBQ1RJT05fUkVTUE9OREVEfSwgeworCUVSUkRPUywgNTksIE5UX1NUQVRVU19UUkFOU0FDVElPTl9JTlZBTElEX0lEfSwgeworCUVSUkRPUywgNTksIE5UX1NUQVRVU19UUkFOU0FDVElPTl9JTlZBTElEX1RZUEV9LCB7CisJRVJSRE9TLCBFUlJ1bnN1cCwgTlRfU1RBVFVTX05PVF9TRVJWRVJfU0VTU0lPTn0sIHsKKwlFUlJET1MsIEVSUnVuc3VwLCBOVF9TVEFUVVNfTk9UX0NMSUVOVF9TRVNTSU9OfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0NBTk5PVF9MT0FEX1JFR0lTVFJZX0ZJTEV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfREVCVUdfQVRUQUNIX0ZBSUxFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19TWVNURU1fUFJPQ0VTU19URVJNSU5BVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0RBVEFfTk9UX0FDQ0VQVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05PX0JST1dTRVJfU0VSVkVSU19GT1VORH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19WRE1fSEFSRF9FUlJPUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19EUklWRVJfQ0FOQ0VMX1RJTUVPVVR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUkVQTFlfTUVTU0FHRV9NSVNNQVRDSH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19NQVBQRURfQUxJR05NRU5UfSwgeworCUVSUkRPUywgMTkzLCBOVF9TVEFUVVNfSU1BR0VfQ0hFQ0tTVU1fTUlTTUFUQ0h9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTE9TVF9XUklURUJFSElORF9EQVRBfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0NMSUVOVF9TRVJWRVJfUEFSQU1FVEVSU19JTlZBTElEfSwgeworCUVSUlNSViwgMjI0MiwgTlRfU1RBVFVTX1BBU1NXT1JEX01VU1RfQ0hBTkdFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05PVF9GT1VORH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19OT1RfVElOWV9TVFJFQU19LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUkVDT1ZFUllfRkFJTFVSRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19TVEFDS19PVkVSRkxPV19SRUFEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0ZBSUxfQ0hFQ0t9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRFVQTElDQVRFX09CSkVDVElEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX09CSkVDVElEX0VYSVNUU30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19DT05WRVJUX1RPX0xBUkdFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1JFVFJZfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0ZPVU5EX09VVF9PRl9TQ09QRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BTExPQ0FURV9CVUNLRVR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUFJPUFNFVF9OT1RfRk9VTkR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTUFSU0hBTExfT1ZFUkZMT1d9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9WQVJJQU5UfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0RPTUFJTl9DT05UUk9MTEVSX05PVF9GT1VORH0sIHsKKwlFUlJET1MsIEVSUm5vYWNjZXNzLCBOVF9TVEFUVVNfQUNDT1VOVF9MT0NLRURfT1VUfSwgeworCUVSUkRPUywgRVJSYmFkZmlkLCBOVF9TVEFUVVNfSEFORExFX05PVF9DTE9TQUJMRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19DT05ORUNUSU9OX1JFRlVTRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfR1JBQ0VGVUxfRElTQ09OTkVDVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BRERSRVNTX0FMUkVBRFlfQVNTT0NJQVRFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BRERSRVNTX05PVF9BU1NPQ0lBVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0NPTk5FQ1RJT05fSU5WQUxJRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19DT05ORUNUSU9OX0FDVElWRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19ORVRXT1JLX1VOUkVBQ0hBQkxFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0hPU1RfVU5SRUFDSEFCTEV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUFJPVE9DT0xfVU5SRUFDSEFCTEV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUE9SVF9VTlJFQUNIQUJMRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19SRVFVRVNUX0FCT1JURUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfQ09OTkVDVElPTl9BQk9SVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0JBRF9DT01QUkVTU0lPTl9CVUZGRVJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVVNFUl9NQVBQRURfRklMRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BVURJVF9GQUlMRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVElNRVJfUkVTT0xVVElPTl9OT1RfU0VUfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0NPTk5FQ1RJT05fQ09VTlRfTElNSVR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTE9HSU5fVElNRV9SRVNUUklDVElPTn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19MT0dJTl9XS1NUQV9SRVNUUklDVElPTn0sIHsKKwlFUlJET1MsIDE5MywgTlRfU1RBVFVTX0lNQUdFX01QX1VQX01JU01BVENIfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgMHhjMDAwMDI0YX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIDB4YzAwMDAyNGJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCAweGMwMDAwMjRjfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgMHhjMDAwMDI0ZH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIDB4YzAwMDAyNGV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCAweGMwMDAwMjRmfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9MT0dPTl9JTkZPfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0JBRF9ETExfRU5UUllQT0lOVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19CQURfU0VSVklDRV9FTlRSWVBPSU5UfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0xQQ19SRVBMWV9MT1NUfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lQX0FERFJFU1NfQ09ORkxJQ1QxfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lQX0FERFJFU1NfQ09ORkxJQ1QyfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1JFR0lTVFJZX1FVT1RBX0xJTUlUfSwgeworCUVSUlNSViwgMywgTlRfU1RBVFVTX1BBVEhfTk9UX0NPVkVSRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9fQ0FMTEJBQ0tfQUNUSVZFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0xJQ0VOU0VfUVVPVEFfRVhDRUVERUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUFdEX1RPT19TSE9SVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19QV0RfVE9PX1JFQ0VOVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19QV0RfSElTVE9SWV9DT05GTElDVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIDB4YzAwMDAyNWR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUExVR1BMQVlfTk9fREVWSUNFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1VOU1VQUE9SVEVEX0NPTVBSRVNTSU9OfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfSFdfUFJPRklMRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlZBTElEX1BMVUdQTEFZX0RFVklDRV9QQVRIfSwgeworCUVSUkRPUywgMTgyLCBOVF9TVEFUVVNfRFJJVkVSX09SRElOQUxfTk9UX0ZPVU5EfSwgeworCUVSUkRPUywgMTI3LCBOVF9TVEFUVVNfRFJJVkVSX0VOVFJZUE9JTlRfTk9UX0ZPVU5EfSwgeworCUVSUkRPUywgMjg4LCBOVF9TVEFUVVNfUkVTT1VSQ0VfTk9UX09XTkVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1RPT19NQU5ZX0xJTktTfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1FVT1RBX0xJU1RfSU5DT05TSVNURU5UfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0ZJTEVfSVNfT0ZGTElORX0sIHsKKwlFUlJET1MsIDIxLCAweGMwMDAwMjZlfSwgeworCUVSUkRPUywgMTYxLCAweGMwMDAwMjgxfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIDB4YzAwMDAyOGF9LCB7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgMHhjMDAwMDI4Yn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIDB4YzAwMDAyOGN9LCB7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgMHhjMDAwMDI4ZH0sIHsKKwlFUlJET1MsIEVSUm5vYWNjZXNzLCAweGMwMDAwMjhlfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIDB4YzAwMDAyOGZ9LCB7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgMHhjMDAwMDI5MH0sIHsKKwlFUlJET1MsIEVSUmJhZGZ1bmMsIDB4YzAwMDAyOWN9LCB7CisJRVJSRE9TLCBFUlJpbnZsZXZlbCwgMHgwMDdjMDAwMX0sIH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFByaW50IGFuIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgc3RhdHVzIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitjaWZzX3ByaW50X3N0YXR1cyhfX3UzMiBzdGF0dXNfY29kZSkKK3sKKwlpbnQgaWR4ID0gMDsKKworCXdoaWxlIChudF9lcnJzW2lkeF0ubnRfZXJyc3RyICE9IE5VTEwpIHsKKwkJaWYgKCgobnRfZXJyc1tpZHhdLm50X2VycmNvZGUpICYgMHhGRkZGRkYpID09CisJCSAgICAoc3RhdHVzX2NvZGUgJiAweEZGRkZGRikpIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiU3RhdHVzIGNvZGUgcmV0dXJuZWQgMHglMDh4ICVzXG4iLAorCQkJCSAgIHN0YXR1c19jb2RlLG50X2VycnNbaWR4XS5udF9lcnJzdHIpOworCQl9CisJCWlkeCsrOworCX0KKwlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQKK250c3RhdHVzX3RvX2RvcyhfX3UzMiBudHN0YXR1cywgX191OCAqIGVjbGFzcywgX191MTYgKiBlY29kZSkKK3sKKwlpbnQgaTsKKwlpZiAobnRzdGF0dXMgPT0gMCkgeworCQkqZWNsYXNzID0gMDsKKwkJKmVjb2RlID0gMDsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGkgPSAwOyBudHN0YXR1c190b19kb3NfbWFwW2ldLm50c3RhdHVzOyBpKyspIHsKKwkJaWYgKG50c3RhdHVzID09IG50c3RhdHVzX3RvX2Rvc19tYXBbaV0ubnRzdGF0dXMpIHsKKwkJCSplY2xhc3MgPSBudHN0YXR1c190b19kb3NfbWFwW2ldLmRvc19jbGFzczsKKwkJCSplY29kZSA9IG50c3RhdHVzX3RvX2Rvc19tYXBbaV0uZG9zX2NvZGU7CisJCQlyZXR1cm47CisJCX0KKwl9CisJKmVjbGFzcyA9IEVSUkhSRDsKKwkqZWNvZGUgPSBFUlJnZW5lcmFsOworfQorCitpbnQKK21hcF9zbWJfdG9fbGludXhfZXJyb3Ioc3RydWN0IHNtYl9oZHIgKnNtYikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmMgPSAtRUlPOwkJLyogaWYgdHJhbnNwb3J0IGVycm9yIHNtYiBlcnJvciBtYXkgbm90IGJlIHNldCAqLworCV9fdTggc21iZXJyY2xhc3M7CisJX191MTYgc21iZXJyY29kZTsKKworCS8qIEJCIGlmIE5UIFN0YXR1cyBjb2RlcyAtIG1hcCBOVCBCQiAqLworCisJLyogb2xkIHN0eWxlIHNtYiBlcnJvciBjb2RlcyAqLworCWlmIChzbWItPlN0YXR1cy5DaWZzRXJyb3IgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc21iLT5GbGFnczIgJiBTTUJGTEcyX0VSUl9TVEFUVVMpIHsKKwkJLyogdHJhbnNsYXRlIHRoZSBuZXdlciBTVEFUVVMgY29kZXMgdG8gb2xkIHN0eWxlIGVycm9ycyBhbmQgdGhlbiB0byBQT1NJWCBlcnJvcnMgKi8KKwkJX191MzIgZXJyID0gbGUzMl90b19jcHUoc21iLT5TdGF0dXMuQ2lmc0Vycm9yKTsKKwkJaWYoY2lmc0ZZSSkKKwkJCWNpZnNfcHJpbnRfc3RhdHVzKGVycik7CisJCW50c3RhdHVzX3RvX2RvcyhlcnIsICZzbWJlcnJjbGFzcywgJnNtYmVycmNvZGUpOworCX0gZWxzZSB7CisJCXNtYmVycmNsYXNzID0gc21iLT5TdGF0dXMuRG9zRXJyb3IuRXJyb3JDbGFzczsKKwkJc21iZXJyY29kZSA9IGxlMTZfdG9fY3B1KHNtYi0+U3RhdHVzLkRvc0Vycm9yLkVycm9yKTsKKwl9CisKKwkvKiBvbGQgc3R5bGUgZXJyb3JzICovCisKKwkvKiBET1MgY2xhc3Mgc21iIGVycm9yIGNvZGVzIC0gbWFwIERPUyAqLworCWlmIChzbWJlcnJjbGFzcyA9PSBFUlJET1MpIHsJLyogb25lIGJ5dGUgZmllbGQgbm8gbmVlZCB0byBieXRlIHJldmVyc2UgKi8KKwkJZm9yIChpID0gMDsKKwkJICAgICBpIDwKKwkJICAgICBzaXplb2YgKG1hcHBpbmdfdGFibGVfRVJSRE9TKSAvCisJCSAgICAgc2l6ZW9mIChzdHJ1Y3Qgc21iX3RvX3Bvc2l4X2Vycm9yKTsgaSsrKSB7CisJCQlpZiAobWFwcGluZ190YWJsZV9FUlJET1NbaV0uc21iX2VyciA9PSAwKQorCQkJCWJyZWFrOworCQkJZWxzZSBpZiAobWFwcGluZ190YWJsZV9FUlJET1NbaV0uc21iX2VyciA9PSBzbWJlcnJjb2RlKSB7CisJCQkJcmMgPSBtYXBwaW5nX3RhYmxlX0VSUkRPU1tpXS5wb3NpeF9jb2RlOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZWxzZSB0cnkgdGhlIG5leHQgZXJyb3IgbWFwcGluZyBvbmUgdG8gc2VlIGlmIGl0IHdpbGwgbWF0Y2ggKi8KKwkJfQorCX0gZWxzZSBpZiAoc21iZXJyY2xhc3MgPT0gRVJSU1JWKSB7CS8qIHNlcnZlciBjbGFzcyBvZiBlcnJvciBjb2RlcyAqLworCQlmb3IgKGkgPSAwOworCQkgICAgIGkgPAorCQkgICAgIHNpemVvZiAobWFwcGluZ190YWJsZV9FUlJTUlYpIC8KKwkJICAgICBzaXplb2YgKHN0cnVjdCBzbWJfdG9fcG9zaXhfZXJyb3IpOyBpKyspIHsKKwkJCWlmIChtYXBwaW5nX3RhYmxlX0VSUlNSVltpXS5zbWJfZXJyID09IDApCisJCQkJYnJlYWs7CisJCQllbHNlIGlmIChtYXBwaW5nX3RhYmxlX0VSUlNSVltpXS5zbWJfZXJyID09IHNtYmVycmNvZGUpIHsKKwkJCQlyYyA9IG1hcHBpbmdfdGFibGVfRVJSU1JWW2ldLnBvc2l4X2NvZGU7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBlbHNlIHRyeSB0aGUgbmV4dCBlcnJvciBtYXBwaW5nIG9uZSB0byBzZWUgaWYgaXQgd2lsbCBtYXRjaCAqLworCQl9CisJfQorCS8qIGVsc2UgRVJSSFJEIGNsYXNzIGVycm9ycyBvciBqdW5rICAtIHJldHVybiBFSU8gKi8KKworCWNGWUkoMSwgKCIgISFNYXBwaW5nIHNtYiBlcnJvciBjb2RlICVkIHRvIFBPU0lYIGVyciAlZCAhISIsIHNtYmVycmNvZGUscmMpKTsKKworCS8qIGdlbmVyaWMgY29ycmVjdGl2ZSBhY3Rpb24gZS5nLiByZWNvbm5lY3QgU01CIHNlc3Npb24gb24gRVJSYmFkdWlkIGNvdWxkIGJlIGFkZGVkICovCisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIFNNQiBtZXNzYWdlIGJhc2VkIG9uIHRoZSBmaXhlZCBoZWFkZXIKKyAqIHBvcnRpb24sIHRoZSBudW1iZXIgb2Ygd29yZCBwYXJhbWV0ZXJzIGFuZCB0aGUgZGF0YSBwb3J0aW9uIG9mIHRoZSBtZXNzYWdlCisgKi8KK3Vuc2lnbmVkIGludAorc21iQ2FsY1NpemUoc3RydWN0IHNtYl9oZHIgKnB0cikKK3sKKwlyZXR1cm4gKHNpemVvZiAoc3RydWN0IHNtYl9oZHIpICsgKDIgKiBwdHItPldvcmRDb3VudCkgKworCQlCQ0MocHRyKSk7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHRha2VuIGZyb20gZnMvbnRmcy91dGlsLmMgKi8KKworI2RlZmluZSBOVEZTX1RJTUVfT0ZGU0VUICgodTY0KSgzNjkqMzY1ICsgODkpICogMjQgKiAzNjAwICogMTAwMDAwMDApCisKKyAgICAvKgorICAgICAqIENvbnZlcnQgdGhlIE5UIFVUQyAoYmFzZWQgMTYwMS0wMS0wMSwgaW4gaHVuZHJlZCBuYW5vc2Vjb25kIHVuaXRzKQorICAgICAqIGludG8gVW5peCBVVEMgKGJhc2VkIDE5NzAtMDEtMDEsIGluIHNlY29uZHMpLgorICAgICAqLworc3RydWN0IHRpbWVzcGVjCitjaWZzX05UdGltZVRvVW5peCh1NjQgbnR1dGMpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOyAKKwkvKiBCQiB3aGF0IGFib3V0IHRoZSB0aW1lem9uZT8gQkIgKi8KKworCS8qIFN1YnRyYWN0IHRoZSBOVEZTIHRpbWUgb2Zmc2V0LCB0aGVuIGNvbnZlcnQgdG8gMXMgaW50ZXJ2YWxzLiAqLworCXU2NCB0OworCisJdCA9IG50dXRjIC0gTlRGU19USU1FX09GRlNFVDsKKwl0cy50dl9uc2VjID0gZG9fZGl2KHQsIDEwMDAwMDAwKSAqIDEwMDsKKwl0cy50dl9zZWMgPSB0OyAKKwlyZXR1cm4gdHM7Cit9CisKKy8qIENvbnZlcnQgdGhlIFVuaXggVVRDIGludG8gTlQgVVRDLiAqLwordTY0CitjaWZzX1VuaXhUaW1lVG9OVChzdHJ1Y3QgdGltZXNwZWMgdCkKK3sKKwkvKiBDb252ZXJ0IHRvIDEwMG5zIGludGVydmFscyBhbmQgdGhlbiBhZGQgdGhlIE5URlMgdGltZSBvZmZzZXQuICovCisJcmV0dXJuICh1NjQpIHQudHZfc2VjICogMTAwMDAwMDAgKyB0LnR2X25zZWMvMTAwICsgTlRGU19USU1FX09GRlNFVDsKK30KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvbnRlcnIuYyBiL2ZzL2NpZnMvbnRlcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGE1MGNkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9udGVyci5jCkBAIC0wLDAgKzEsNjg3IEBACisvKiAKKyAqICBVbml4IFNNQi9OZXRiaW9zIGltcGxlbWVudGF0aW9uLgorICogIFZlcnNpb24gMS45LgorICogIFJQQyBQaXBlIGNsaWVudCAvIHNlcnZlciByb3V0aW5lcworICogIENvcHlyaWdodCAoQykgTHVrZSBLZW5uZXRoIENhc3NvbiBMZWlnaHRvbiAxOTk3LTIwMDEuCisgKiAgCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogIAorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKiBOVCBlcnJvciBjb2RlcyAtIHNlZSBudGVyci5oICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgIm50ZXJyLmgiCisKK2NvbnN0IHN0cnVjdCBudF9lcnJfY29kZV9zdHJ1Y3QgbnRfZXJyc1tdID0geworCXsiTlRfU1RBVFVTX09LIiwgTlRfU1RBVFVTX09LfSwKKwl7Ik5UX1NUQVRVU19VTlNVQ0NFU1NGVUwiLCBOVF9TVEFUVVNfVU5TVUNDRVNTRlVMfSwKKwl7Ik5UX1NUQVRVU19OT1RfSU1QTEVNRU5URUQiLCBOVF9TVEFUVVNfTk9UX0lNUExFTUVOVEVEfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0lORk9fQ0xBU1MiLCBOVF9TVEFUVVNfSU5WQUxJRF9JTkZPX0NMQVNTfSwKKwl7Ik5UX1NUQVRVU19JTkZPX0xFTkdUSF9NSVNNQVRDSCIsIE5UX1NUQVRVU19JTkZPX0xFTkdUSF9NSVNNQVRDSH0sCisJeyJOVF9TVEFUVVNfQUNDRVNTX1ZJT0xBVElPTiIsIE5UX1NUQVRVU19BQ0NFU1NfVklPTEFUSU9OfSwKKwl7IlNUQVRVU19CVUZGRVJfT1ZFUkZMT1ciLCBTVEFUVVNfQlVGRkVSX09WRVJGTE9XfSwKKwl7Ik5UX1NUQVRVU19JTl9QQUdFX0VSUk9SIiwgTlRfU1RBVFVTX0lOX1BBR0VfRVJST1J9LAorCXsiTlRfU1RBVFVTX1BBR0VGSUxFX1FVT1RBIiwgTlRfU1RBVFVTX1BBR0VGSUxFX1FVT1RBfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0hBTkRMRSIsIE5UX1NUQVRVU19JTlZBTElEX0hBTkRMRX0sCisJeyJOVF9TVEFUVVNfQkFEX0lOSVRJQUxfU1RBQ0siLCBOVF9TVEFUVVNfQkFEX0lOSVRJQUxfU1RBQ0t9LAorCXsiTlRfU1RBVFVTX0JBRF9JTklUSUFMX1BDIiwgTlRfU1RBVFVTX0JBRF9JTklUSUFMX1BDfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0NJRCIsIE5UX1NUQVRVU19JTlZBTElEX0NJRH0sCisJeyJOVF9TVEFUVVNfVElNRVJfTk9UX0NBTkNFTEVEIiwgTlRfU1RBVFVTX1RJTUVSX05PVF9DQU5DRUxFRH0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIiLCBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJ9LAorCXsiTlRfU1RBVFVTX05PX1NVQ0hfREVWSUNFIiwgTlRfU1RBVFVTX05PX1NVQ0hfREVWSUNFfSwKKwl7Ik5UX1NUQVRVU19OT19TVUNIX0ZJTEUiLCBOVF9TVEFUVVNfTk9fU1VDSF9GSUxFfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0RFVklDRV9SRVFVRVNUIiwKKwkgTlRfU1RBVFVTX0lOVkFMSURfREVWSUNFX1JFUVVFU1R9LAorCXsiTlRfU1RBVFVTX0VORF9PRl9GSUxFIiwgTlRfU1RBVFVTX0VORF9PRl9GSUxFfSwKKwl7Ik5UX1NUQVRVU19XUk9OR19WT0xVTUUiLCBOVF9TVEFUVVNfV1JPTkdfVk9MVU1FfSwKKwl7Ik5UX1NUQVRVU19OT19NRURJQV9JTl9ERVZJQ0UiLCBOVF9TVEFUVVNfTk9fTUVESUFfSU5fREVWSUNFfSwKKwl7Ik5UX1NUQVRVU19VTlJFQ09HTklaRURfTUVESUEiLCBOVF9TVEFUVVNfVU5SRUNPR05JWkVEX01FRElBfSwKKwl7Ik5UX1NUQVRVU19OT05FWElTVEVOVF9TRUNUT1IiLCBOVF9TVEFUVVNfTk9ORVhJU1RFTlRfU0VDVE9SfSwKKwl7Ik5UX1NUQVRVU19NT1JFX1BST0NFU1NJTkdfUkVRVUlSRUQiLAorCSBOVF9TVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVEfSwKKwl7Ik5UX1NUQVRVU19OT19NRU1PUlkiLCBOVF9TVEFUVVNfTk9fTUVNT1JZfSwKKwl7Ik5UX1NUQVRVU19DT05GTElDVElOR19BRERSRVNTRVMiLAorCSBOVF9TVEFUVVNfQ09ORkxJQ1RJTkdfQUREUkVTU0VTfSwKKwl7Ik5UX1NUQVRVU19OT1RfTUFQUEVEX1ZJRVciLCBOVF9TVEFUVVNfTk9UX01BUFBFRF9WSUVXfSwKKwl7Ik5UX1NUQVRVU19VTkFCTEVfVE9fRlJFRV9WTSIsIE5UX1NUQVRVU19VTkFCTEVfVE9fRlJFRV9WTX0sCisJeyJOVF9TVEFUVVNfVU5BQkxFX1RPX0RFTEVURV9TRUNUSU9OIiwKKwkgTlRfU1RBVFVTX1VOQUJMRV9UT19ERUxFVEVfU0VDVElPTn0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9TWVNURU1fU0VSVklDRSIsCisJIE5UX1NUQVRVU19JTlZBTElEX1NZU1RFTV9TRVJWSUNFfSwKKwl7Ik5UX1NUQVRVU19JTExFR0FMX0lOU1RSVUNUSU9OIiwgTlRfU1RBVFVTX0lMTEVHQUxfSU5TVFJVQ1RJT059LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfTE9DS19TRVFVRU5DRSIsCisJIE5UX1NUQVRVU19JTlZBTElEX0xPQ0tfU0VRVUVOQ0V9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfVklFV19TSVpFIiwgTlRfU1RBVFVTX0lOVkFMSURfVklFV19TSVpFfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0ZJTEVfRk9SX1NFQ1RJT04iLAorCSBOVF9TVEFUVVNfSU5WQUxJRF9GSUxFX0ZPUl9TRUNUSU9OfSwKKwl7Ik5UX1NUQVRVU19BTFJFQURZX0NPTU1JVFRFRCIsIE5UX1NUQVRVU19BTFJFQURZX0NPTU1JVFRFRH0sCisJeyJOVF9TVEFUVVNfQUNDRVNTX0RFTklFRCIsIE5UX1NUQVRVU19BQ0NFU1NfREVOSUVEfSwKKwl7Ik5UX1NUQVRVU19CVUZGRVJfVE9PX1NNQUxMIiwgTlRfU1RBVFVTX0JVRkZFUl9UT09fU01BTEx9LAorCXsiTlRfU1RBVFVTX09CSkVDVF9UWVBFX01JU01BVENIIiwgTlRfU1RBVFVTX09CSkVDVF9UWVBFX01JU01BVENIfSwKKwl7Ik5UX1NUQVRVU19OT05DT05USU5VQUJMRV9FWENFUFRJT04iLAorCSBOVF9TVEFUVVNfTk9OQ09OVElOVUFCTEVfRVhDRVBUSU9OfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0RJU1BPU0lUSU9OIiwgTlRfU1RBVFVTX0lOVkFMSURfRElTUE9TSVRJT059LAorCXsiTlRfU1RBVFVTX1VOV0lORCIsIE5UX1NUQVRVU19VTldJTkR9LAorCXsiTlRfU1RBVFVTX0JBRF9TVEFDSyIsIE5UX1NUQVRVU19CQURfU1RBQ0t9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfVU5XSU5EX1RBUkdFVCIsCisJIE5UX1NUQVRVU19JTlZBTElEX1VOV0lORF9UQVJHRVR9LAorCXsiTlRfU1RBVFVTX05PVF9MT0NLRUQiLCBOVF9TVEFUVVNfTk9UX0xPQ0tFRH0sCisJeyJOVF9TVEFUVVNfUEFSSVRZX0VSUk9SIiwgTlRfU1RBVFVTX1BBUklUWV9FUlJPUn0sCisJeyJOVF9TVEFUVVNfVU5BQkxFX1RPX0RFQ09NTUlUX1ZNIiwKKwkgTlRfU1RBVFVTX1VOQUJMRV9UT19ERUNPTU1JVF9WTX0sCisJeyJOVF9TVEFUVVNfTk9UX0NPTU1JVFRFRCIsIE5UX1NUQVRVU19OT1RfQ09NTUlUVEVEfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX1BPUlRfQVRUUklCVVRFUyIsCisJIE5UX1NUQVRVU19JTlZBTElEX1BPUlRfQVRUUklCVVRFU30sCisJeyJOVF9TVEFUVVNfUE9SVF9NRVNTQUdFX1RPT19MT05HIiwKKwkgTlRfU1RBVFVTX1BPUlRfTUVTU0FHRV9UT09fTE9OR30sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfTUlYIiwKKwkgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSX01JWH0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9RVU9UQV9MT1dFUiIsIE5UX1NUQVRVU19JTlZBTElEX1FVT1RBX0xPV0VSfSwKKwl7Ik5UX1NUQVRVU19ESVNLX0NPUlJVUFRfRVJST1IiLCBOVF9TVEFUVVNfRElTS19DT1JSVVBUX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19PQkpFQ1RfTkFNRV9JTlZBTElEIiwgTlRfU1RBVFVTX09CSkVDVF9OQU1FX0lOVkFMSUR9LAorCXsiTlRfU1RBVFVTX09CSkVDVF9OQU1FX05PVF9GT1VORCIsCisJIE5UX1NUQVRVU19PQkpFQ1RfTkFNRV9OT1RfRk9VTkR9LAorCXsiTlRfU1RBVFVTX09CSkVDVF9OQU1FX0NPTExJU0lPTiIsCisJIE5UX1NUQVRVU19PQkpFQ1RfTkFNRV9DT0xMSVNJT059LAorCXsiTlRfU1RBVFVTX0hBTkRMRV9OT1RfV0FJVEFCTEUiLCBOVF9TVEFUVVNfSEFORExFX05PVF9XQUlUQUJMRX0sCisJeyJOVF9TVEFUVVNfUE9SVF9ESVNDT05ORUNURUQiLCBOVF9TVEFUVVNfUE9SVF9ESVNDT05ORUNURUR9LAorCXsiTlRfU1RBVFVTX0RFVklDRV9BTFJFQURZX0FUVEFDSEVEIiwKKwkgTlRfU1RBVFVTX0RFVklDRV9BTFJFQURZX0FUVEFDSEVEfSwKKwl7Ik5UX1NUQVRVU19PQkpFQ1RfUEFUSF9JTlZBTElEIiwgTlRfU1RBVFVTX09CSkVDVF9QQVRIX0lOVkFMSUR9LAorCXsiTlRfU1RBVFVTX09CSkVDVF9QQVRIX05PVF9GT1VORCIsCisJIE5UX1NUQVRVU19PQkpFQ1RfUEFUSF9OT1RfRk9VTkR9LAorCXsiTlRfU1RBVFVTX09CSkVDVF9QQVRIX1NZTlRBWF9CQUQiLAorCSBOVF9TVEFUVVNfT0JKRUNUX1BBVEhfU1lOVEFYX0JBRH0sCisJeyJOVF9TVEFUVVNfREFUQV9PVkVSUlVOIiwgTlRfU1RBVFVTX0RBVEFfT1ZFUlJVTn0sCisJeyJOVF9TVEFUVVNfREFUQV9MQVRFX0VSUk9SIiwgTlRfU1RBVFVTX0RBVEFfTEFURV9FUlJPUn0sCisJeyJOVF9TVEFUVVNfREFUQV9FUlJPUiIsIE5UX1NUQVRVU19EQVRBX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19DUkNfRVJST1IiLCBOVF9TVEFUVVNfQ1JDX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19TRUNUSU9OX1RPT19CSUciLCBOVF9TVEFUVVNfU0VDVElPTl9UT09fQklHfSwKKwl7Ik5UX1NUQVRVU19QT1JUX0NPTk5FQ1RJT05fUkVGVVNFRCIsCisJIE5UX1NUQVRVU19QT1JUX0NPTk5FQ1RJT05fUkVGVVNFRH0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9QT1JUX0hBTkRMRSIsIE5UX1NUQVRVU19JTlZBTElEX1BPUlRfSEFORExFfSwKKwl7Ik5UX1NUQVRVU19TSEFSSU5HX1ZJT0xBVElPTiIsIE5UX1NUQVRVU19TSEFSSU5HX1ZJT0xBVElPTn0sCisJeyJOVF9TVEFUVVNfUVVPVEFfRVhDRUVERUQiLCBOVF9TVEFUVVNfUVVPVEFfRVhDRUVERUR9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfUEFHRV9QUk9URUNUSU9OIiwKKwkgTlRfU1RBVFVTX0lOVkFMSURfUEFHRV9QUk9URUNUSU9OfSwKKwl7Ik5UX1NUQVRVU19NVVRBTlRfTk9UX09XTkVEIiwgTlRfU1RBVFVTX01VVEFOVF9OT1RfT1dORUR9LAorCXsiTlRfU1RBVFVTX1NFTUFQSE9SRV9MSU1JVF9FWENFRURFRCIsCisJIE5UX1NUQVRVU19TRU1BUEhPUkVfTElNSVRfRVhDRUVERUR9LAorCXsiTlRfU1RBVFVTX1BPUlRfQUxSRUFEWV9TRVQiLCBOVF9TVEFUVVNfUE9SVF9BTFJFQURZX1NFVH0sCisJeyJOVF9TVEFUVVNfU0VDVElPTl9OT1RfSU1BR0UiLCBOVF9TVEFUVVNfU0VDVElPTl9OT1RfSU1BR0V9LAorCXsiTlRfU1RBVFVTX1NVU1BFTkRfQ09VTlRfRVhDRUVERUQiLAorCSBOVF9TVEFUVVNfU1VTUEVORF9DT1VOVF9FWENFRURFRH0sCisJeyJOVF9TVEFUVVNfVEhSRUFEX0lTX1RFUk1JTkFUSU5HIiwKKwkgTlRfU1RBVFVTX1RIUkVBRF9JU19URVJNSU5BVElOR30sCisJeyJOVF9TVEFUVVNfQkFEX1dPUktJTkdfU0VUX0xJTUlUIiwKKwkgTlRfU1RBVFVTX0JBRF9XT1JLSU5HX1NFVF9MSU1JVH0sCisJeyJOVF9TVEFUVVNfSU5DT01QQVRJQkxFX0ZJTEVfTUFQIiwKKwkgTlRfU1RBVFVTX0lOQ09NUEFUSUJMRV9GSUxFX01BUH0sCisJeyJOVF9TVEFUVVNfU0VDVElPTl9QUk9URUNUSU9OIiwgTlRfU1RBVFVTX1NFQ1RJT05fUFJPVEVDVElPTn0sCisJeyJOVF9TVEFUVVNfRUFTX05PVF9TVVBQT1JURUQiLCBOVF9TVEFUVVNfRUFTX05PVF9TVVBQT1JURUR9LAorCXsiTlRfU1RBVFVTX0VBX1RPT19MQVJHRSIsIE5UX1NUQVRVU19FQV9UT09fTEFSR0V9LAorCXsiTlRfU1RBVFVTX05PTkVYSVNURU5UX0VBX0VOVFJZIiwgTlRfU1RBVFVTX05PTkVYSVNURU5UX0VBX0VOVFJZfSwKKwl7Ik5UX1NUQVRVU19OT19FQVNfT05fRklMRSIsIE5UX1NUQVRVU19OT19FQVNfT05fRklMRX0sCisJeyJOVF9TVEFUVVNfRUFfQ09SUlVQVF9FUlJPUiIsIE5UX1NUQVRVU19FQV9DT1JSVVBUX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19GSUxFX0xPQ0tfQ09ORkxJQ1QiLCBOVF9TVEFUVVNfRklMRV9MT0NLX0NPTkZMSUNUfSwKKwl7Ik5UX1NUQVRVU19MT0NLX05PVF9HUkFOVEVEIiwgTlRfU1RBVFVTX0xPQ0tfTk9UX0dSQU5URUR9LAorCXsiTlRfU1RBVFVTX0RFTEVURV9QRU5ESU5HIiwgTlRfU1RBVFVTX0RFTEVURV9QRU5ESU5HfSwKKwl7Ik5UX1NUQVRVU19DVExfRklMRV9OT1RfU1VQUE9SVEVEIiwKKwkgTlRfU1RBVFVTX0NUTF9GSUxFX05PVF9TVVBQT1JURUR9LAorCXsiTlRfU1RBVFVTX1VOS05PV05fUkVWSVNJT04iLCBOVF9TVEFUVVNfVU5LTk9XTl9SRVZJU0lPTn0sCisJeyJOVF9TVEFUVVNfUkVWSVNJT05fTUlTTUFUQ0giLCBOVF9TVEFUVVNfUkVWSVNJT05fTUlTTUFUQ0h9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfT1dORVIiLCBOVF9TVEFUVVNfSU5WQUxJRF9PV05FUn0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9QUklNQVJZX0dST1VQIiwKKwkgTlRfU1RBVFVTX0lOVkFMSURfUFJJTUFSWV9HUk9VUH0sCisJeyJOVF9TVEFUVVNfTk9fSU1QRVJTT05BVElPTl9UT0tFTiIsCisJIE5UX1NUQVRVU19OT19JTVBFUlNPTkFUSU9OX1RPS0VOfSwKKwl7Ik5UX1NUQVRVU19DQU5UX0RJU0FCTEVfTUFOREFUT1JZIiwKKwkgTlRfU1RBVFVTX0NBTlRfRElTQUJMRV9NQU5EQVRPUll9LAorCXsiTlRfU1RBVFVTX05PX0xPR09OX1NFUlZFUlMiLCBOVF9TVEFUVVNfTk9fTE9HT05fU0VSVkVSU30sCisJeyJOVF9TVEFUVVNfTk9fU1VDSF9MT0dPTl9TRVNTSU9OIiwKKwkgTlRfU1RBVFVTX05PX1NVQ0hfTE9HT05fU0VTU0lPTn0sCisJeyJOVF9TVEFUVVNfTk9fU1VDSF9QUklWSUxFR0UiLCBOVF9TVEFUVVNfTk9fU1VDSF9QUklWSUxFR0V9LAorCXsiTlRfU1RBVFVTX1BSSVZJTEVHRV9OT1RfSEVMRCIsIE5UX1NUQVRVU19QUklWSUxFR0VfTk9UX0hFTER9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfQUNDT1VOVF9OQU1FIiwgTlRfU1RBVFVTX0lOVkFMSURfQUNDT1VOVF9OQU1FfSwKKwl7Ik5UX1NUQVRVU19VU0VSX0VYSVNUUyIsIE5UX1NUQVRVU19VU0VSX0VYSVNUU30sCisJeyJOVF9TVEFUVVNfTk9fU1VDSF9VU0VSIiwgTlRfU1RBVFVTX05PX1NVQ0hfVVNFUn0sCisJeyJOVF9TVEFUVVNfR1JPVVBfRVhJU1RTIiwgTlRfU1RBVFVTX0dST1VQX0VYSVNUU30sCisJeyJOVF9TVEFUVVNfTk9fU1VDSF9HUk9VUCIsIE5UX1NUQVRVU19OT19TVUNIX0dST1VQfSwKKwl7Ik5UX1NUQVRVU19NRU1CRVJfSU5fR1JPVVAiLCBOVF9TVEFUVVNfTUVNQkVSX0lOX0dST1VQfSwKKwl7Ik5UX1NUQVRVU19NRU1CRVJfTk9UX0lOX0dST1VQIiwgTlRfU1RBVFVTX01FTUJFUl9OT1RfSU5fR1JPVVB9LAorCXsiTlRfU1RBVFVTX0xBU1RfQURNSU4iLCBOVF9TVEFUVVNfTEFTVF9BRE1JTn0sCisJeyJOVF9TVEFUVVNfV1JPTkdfUEFTU1dPUkQiLCBOVF9TVEFUVVNfV1JPTkdfUEFTU1dPUkR9LAorCXsiTlRfU1RBVFVTX0lMTF9GT1JNRURfUEFTU1dPUkQiLCBOVF9TVEFUVVNfSUxMX0ZPUk1FRF9QQVNTV09SRH0sCisJeyJOVF9TVEFUVVNfUEFTU1dPUkRfUkVTVFJJQ1RJT04iLCBOVF9TVEFUVVNfUEFTU1dPUkRfUkVTVFJJQ1RJT059LAorCXsiTlRfU1RBVFVTX0xPR09OX0ZBSUxVUkUiLCBOVF9TVEFUVVNfTE9HT05fRkFJTFVSRX0sCisJeyJOVF9TVEFUVVNfQUNDT1VOVF9SRVNUUklDVElPTiIsIE5UX1NUQVRVU19BQ0NPVU5UX1JFU1RSSUNUSU9OfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0xPR09OX0hPVVJTIiwgTlRfU1RBVFVTX0lOVkFMSURfTE9HT05fSE9VUlN9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfV09SS1NUQVRJT04iLCBOVF9TVEFUVVNfSU5WQUxJRF9XT1JLU1RBVElPTn0sCisJeyJOVF9TVEFUVVNfUEFTU1dPUkRfRVhQSVJFRCIsIE5UX1NUQVRVU19QQVNTV09SRF9FWFBJUkVEfSwKKwl7Ik5UX1NUQVRVU19BQ0NPVU5UX0RJU0FCTEVEIiwgTlRfU1RBVFVTX0FDQ09VTlRfRElTQUJMRUR9LAorCXsiTlRfU1RBVFVTX05PTkVfTUFQUEVEIiwgTlRfU1RBVFVTX05PTkVfTUFQUEVEfSwKKwl7Ik5UX1NUQVRVU19UT09fTUFOWV9MVUlEU19SRVFVRVNURUQiLAorCSBOVF9TVEFUVVNfVE9PX01BTllfTFVJRFNfUkVRVUVTVEVEfSwKKwl7Ik5UX1NUQVRVU19MVUlEU19FWEhBVVNURUQiLCBOVF9TVEFUVVNfTFVJRFNfRVhIQVVTVEVEfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX1NVQl9BVVRIT1JJVFkiLAorCSBOVF9TVEFUVVNfSU5WQUxJRF9TVUJfQVVUSE9SSVRZfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0FDTCIsIE5UX1NUQVRVU19JTlZBTElEX0FDTH0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9TSUQiLCBOVF9TVEFUVVNfSU5WQUxJRF9TSUR9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfU0VDVVJJVFlfREVTQ1IiLAorCSBOVF9TVEFUVVNfSU5WQUxJRF9TRUNVUklUWV9ERVNDUn0sCisJeyJOVF9TVEFUVVNfUFJPQ0VEVVJFX05PVF9GT1VORCIsIE5UX1NUQVRVU19QUk9DRURVUkVfTk9UX0ZPVU5EfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0lNQUdFX0ZPUk1BVCIsIE5UX1NUQVRVU19JTlZBTElEX0lNQUdFX0ZPUk1BVH0sCisJeyJOVF9TVEFUVVNfTk9fVE9LRU4iLCBOVF9TVEFUVVNfTk9fVE9LRU59LAorCXsiTlRfU1RBVFVTX0JBRF9JTkhFUklUQU5DRV9BQ0wiLCBOVF9TVEFUVVNfQkFEX0lOSEVSSVRBTkNFX0FDTH0sCisJeyJOVF9TVEFUVVNfUkFOR0VfTk9UX0xPQ0tFRCIsIE5UX1NUQVRVU19SQU5HRV9OT1RfTE9DS0VEfSwKKwl7Ik5UX1NUQVRVU19ESVNLX0ZVTEwiLCBOVF9TVEFUVVNfRElTS19GVUxMfSwKKwl7Ik5UX1NUQVRVU19TRVJWRVJfRElTQUJMRUQiLCBOVF9TVEFUVVNfU0VSVkVSX0RJU0FCTEVEfSwKKwl7Ik5UX1NUQVRVU19TRVJWRVJfTk9UX0RJU0FCTEVEIiwgTlRfU1RBVFVTX1NFUlZFUl9OT1RfRElTQUJMRUR9LAorCXsiTlRfU1RBVFVTX1RPT19NQU5ZX0dVSURTX1JFUVVFU1RFRCIsCisJIE5UX1NUQVRVU19UT09fTUFOWV9HVUlEU19SRVFVRVNURUR9LAorCXsiTlRfU1RBVFVTX0dVSURTX0VYSEFVU1RFRCIsIE5UX1NUQVRVU19HVUlEU19FWEhBVVNURUR9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfSURfQVVUSE9SSVRZIiwgTlRfU1RBVFVTX0lOVkFMSURfSURfQVVUSE9SSVRZfSwKKwl7Ik5UX1NUQVRVU19BR0VOVFNfRVhIQVVTVEVEIiwgTlRfU1RBVFVTX0FHRU5UU19FWEhBVVNURUR9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfVk9MVU1FX0xBQkVMIiwgTlRfU1RBVFVTX0lOVkFMSURfVk9MVU1FX0xBQkVMfSwKKwl7Ik5UX1NUQVRVU19TRUNUSU9OX05PVF9FWFRFTkRFRCIsIE5UX1NUQVRVU19TRUNUSU9OX05PVF9FWFRFTkRFRH0sCisJeyJOVF9TVEFUVVNfTk9UX01BUFBFRF9EQVRBIiwgTlRfU1RBVFVTX05PVF9NQVBQRURfREFUQX0sCisJeyJOVF9TVEFUVVNfUkVTT1VSQ0VfREFUQV9OT1RfRk9VTkQiLAorCSBOVF9TVEFUVVNfUkVTT1VSQ0VfREFUQV9OT1RfRk9VTkR9LAorCXsiTlRfU1RBVFVTX1JFU09VUkNFX1RZUEVfTk9UX0ZPVU5EIiwKKwkgTlRfU1RBVFVTX1JFU09VUkNFX1RZUEVfTk9UX0ZPVU5EfSwKKwl7Ik5UX1NUQVRVU19SRVNPVVJDRV9OQU1FX05PVF9GT1VORCIsCisJIE5UX1NUQVRVU19SRVNPVVJDRV9OQU1FX05PVF9GT1VORH0sCisJeyJOVF9TVEFUVVNfQVJSQVlfQk9VTkRTX0VYQ0VFREVEIiwKKwkgTlRfU1RBVFVTX0FSUkFZX0JPVU5EU19FWENFRURFRH0sCisJeyJOVF9TVEFUVVNfRkxPQVRfREVOT1JNQUxfT1BFUkFORCIsCisJIE5UX1NUQVRVU19GTE9BVF9ERU5PUk1BTF9PUEVSQU5EfSwKKwl7Ik5UX1NUQVRVU19GTE9BVF9ESVZJREVfQllfWkVSTyIsIE5UX1NUQVRVU19GTE9BVF9ESVZJREVfQllfWkVST30sCisJeyJOVF9TVEFUVVNfRkxPQVRfSU5FWEFDVF9SRVNVTFQiLCBOVF9TVEFUVVNfRkxPQVRfSU5FWEFDVF9SRVNVTFR9LAorCXsiTlRfU1RBVFVTX0ZMT0FUX0lOVkFMSURfT1BFUkFUSU9OIiwKKwkgTlRfU1RBVFVTX0ZMT0FUX0lOVkFMSURfT1BFUkFUSU9OfSwKKwl7Ik5UX1NUQVRVU19GTE9BVF9PVkVSRkxPVyIsIE5UX1NUQVRVU19GTE9BVF9PVkVSRkxPV30sCisJeyJOVF9TVEFUVVNfRkxPQVRfU1RBQ0tfQ0hFQ0siLCBOVF9TVEFUVVNfRkxPQVRfU1RBQ0tfQ0hFQ0t9LAorCXsiTlRfU1RBVFVTX0ZMT0FUX1VOREVSRkxPVyIsIE5UX1NUQVRVU19GTE9BVF9VTkRFUkZMT1d9LAorCXsiTlRfU1RBVFVTX0lOVEVHRVJfRElWSURFX0JZX1pFUk8iLAorCSBOVF9TVEFUVVNfSU5URUdFUl9ESVZJREVfQllfWkVST30sCisJeyJOVF9TVEFUVVNfSU5URUdFUl9PVkVSRkxPVyIsIE5UX1NUQVRVU19JTlRFR0VSX09WRVJGTE9XfSwKKwl7Ik5UX1NUQVRVU19QUklWSUxFR0VEX0lOU1RSVUNUSU9OIiwKKwkgTlRfU1RBVFVTX1BSSVZJTEVHRURfSU5TVFJVQ1RJT059LAorCXsiTlRfU1RBVFVTX1RPT19NQU5ZX1BBR0lOR19GSUxFUyIsCisJIE5UX1NUQVRVU19UT09fTUFOWV9QQUdJTkdfRklMRVN9LAorCXsiTlRfU1RBVFVTX0ZJTEVfSU5WQUxJRCIsIE5UX1NUQVRVU19GSUxFX0lOVkFMSUR9LAorCXsiTlRfU1RBVFVTX0FMTE9UVEVEX1NQQUNFX0VYQ0VFREVEIiwKKwkgTlRfU1RBVFVTX0FMTE9UVEVEX1NQQUNFX0VYQ0VFREVEfSwKKwl7Ik5UX1NUQVRVU19JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTIiwKKwkgTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9SRVNPVVJDRVN9LAorCXsiTlRfU1RBVFVTX0RGU19FWElUX1BBVEhfRk9VTkQiLCBOVF9TVEFUVVNfREZTX0VYSVRfUEFUSF9GT1VORH0sCisJeyJOVF9TVEFUVVNfREVWSUNFX0RBVEFfRVJST1IiLCBOVF9TVEFUVVNfREVWSUNFX0RBVEFfRVJST1J9LAorCXsiTlRfU1RBVFVTX0RFVklDRV9OT1RfQ09OTkVDVEVEIiwgTlRfU1RBVFVTX0RFVklDRV9OT1RfQ09OTkVDVEVEfSwKKwl7Ik5UX1NUQVRVU19ERVZJQ0VfUE9XRVJfRkFJTFVSRSIsIE5UX1NUQVRVU19ERVZJQ0VfUE9XRVJfRkFJTFVSRX0sCisJeyJOVF9TVEFUVVNfRlJFRV9WTV9OT1RfQVRfQkFTRSIsIE5UX1NUQVRVU19GUkVFX1ZNX05PVF9BVF9CQVNFfSwKKwl7Ik5UX1NUQVRVU19NRU1PUllfTk9UX0FMTE9DQVRFRCIsIE5UX1NUQVRVU19NRU1PUllfTk9UX0FMTE9DQVRFRH0sCisJeyJOVF9TVEFUVVNfV09SS0lOR19TRVRfUVVPVEEiLCBOVF9TVEFUVVNfV09SS0lOR19TRVRfUVVPVEF9LAorCXsiTlRfU1RBVFVTX01FRElBX1dSSVRFX1BST1RFQ1RFRCIsCisJIE5UX1NUQVRVU19NRURJQV9XUklURV9QUk9URUNURUR9LAorCXsiTlRfU1RBVFVTX0RFVklDRV9OT1RfUkVBRFkiLCBOVF9TVEFUVVNfREVWSUNFX05PVF9SRUFEWX0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9HUk9VUF9BVFRSSUJVVEVTIiwKKwkgTlRfU1RBVFVTX0lOVkFMSURfR1JPVVBfQVRUUklCVVRFU30sCisJeyJOVF9TVEFUVVNfQkFEX0lNUEVSU09OQVRJT05fTEVWRUwiLAorCSBOVF9TVEFUVVNfQkFEX0lNUEVSU09OQVRJT05fTEVWRUx9LAorCXsiTlRfU1RBVFVTX0NBTlRfT1BFTl9BTk9OWU1PVVMiLCBOVF9TVEFUVVNfQ0FOVF9PUEVOX0FOT05ZTU9VU30sCisJeyJOVF9TVEFUVVNfQkFEX1ZBTElEQVRJT05fQ0xBU1MiLCBOVF9TVEFUVVNfQkFEX1ZBTElEQVRJT05fQ0xBU1N9LAorCXsiTlRfU1RBVFVTX0JBRF9UT0tFTl9UWVBFIiwgTlRfU1RBVFVTX0JBRF9UT0tFTl9UWVBFfSwKKwl7Ik5UX1NUQVRVU19CQURfTUFTVEVSX0JPT1RfUkVDT1JEIiwKKwkgTlRfU1RBVFVTX0JBRF9NQVNURVJfQk9PVF9SRUNPUkR9LAorCXsiTlRfU1RBVFVTX0lOU1RSVUNUSU9OX01JU0FMSUdOTUVOVCIsCisJIE5UX1NUQVRVU19JTlNUUlVDVElPTl9NSVNBTElHTk1FTlR9LAorCXsiTlRfU1RBVFVTX0lOU1RBTkNFX05PVF9BVkFJTEFCTEUiLAorCSBOVF9TVEFUVVNfSU5TVEFOQ0VfTk9UX0FWQUlMQUJMRX0sCisJeyJOVF9TVEFUVVNfUElQRV9OT1RfQVZBSUxBQkxFIiwgTlRfU1RBVFVTX1BJUEVfTk9UX0FWQUlMQUJMRX0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9QSVBFX1NUQVRFIiwgTlRfU1RBVFVTX0lOVkFMSURfUElQRV9TVEFURX0sCisJeyJOVF9TVEFUVVNfUElQRV9CVVNZIiwgTlRfU1RBVFVTX1BJUEVfQlVTWX0sCisJeyJOVF9TVEFUVVNfSUxMRUdBTF9GVU5DVElPTiIsIE5UX1NUQVRVU19JTExFR0FMX0ZVTkNUSU9OfSwKKwl7Ik5UX1NUQVRVU19QSVBFX0RJU0NPTk5FQ1RFRCIsIE5UX1NUQVRVU19QSVBFX0RJU0NPTk5FQ1RFRH0sCisJeyJOVF9TVEFUVVNfUElQRV9DTE9TSU5HIiwgTlRfU1RBVFVTX1BJUEVfQ0xPU0lOR30sCisJeyJOVF9TVEFUVVNfUElQRV9DT05ORUNURUQiLCBOVF9TVEFUVVNfUElQRV9DT05ORUNURUR9LAorCXsiTlRfU1RBVFVTX1BJUEVfTElTVEVOSU5HIiwgTlRfU1RBVFVTX1BJUEVfTElTVEVOSU5HfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX1JFQURfTU9ERSIsIE5UX1NUQVRVU19JTlZBTElEX1JFQURfTU9ERX0sCisJeyJOVF9TVEFUVVNfSU9fVElNRU9VVCIsIE5UX1NUQVRVU19JT19USU1FT1VUfSwKKwl7Ik5UX1NUQVRVU19GSUxFX0ZPUkNFRF9DTE9TRUQiLCBOVF9TVEFUVVNfRklMRV9GT1JDRURfQ0xPU0VEfSwKKwl7Ik5UX1NUQVRVU19QUk9GSUxJTkdfTk9UX1NUQVJURUQiLAorCSBOVF9TVEFUVVNfUFJPRklMSU5HX05PVF9TVEFSVEVEfSwKKwl7Ik5UX1NUQVRVU19QUk9GSUxJTkdfTk9UX1NUT1BQRUQiLAorCSBOVF9TVEFUVVNfUFJPRklMSU5HX05PVF9TVE9QUEVEfSwKKwl7Ik5UX1NUQVRVU19DT1VMRF9OT1RfSU5URVJQUkVUIiwgTlRfU1RBVFVTX0NPVUxEX05PVF9JTlRFUlBSRVR9LAorCXsiTlRfU1RBVFVTX0ZJTEVfSVNfQV9ESVJFQ1RPUlkiLCBOVF9TVEFUVVNfRklMRV9JU19BX0RJUkVDVE9SWX0sCisJeyJOVF9TVEFUVVNfTk9UX1NVUFBPUlRFRCIsIE5UX1NUQVRVU19OT1RfU1VQUE9SVEVEfSwKKwl7Ik5UX1NUQVRVU19SRU1PVEVfTk9UX0xJU1RFTklORyIsIE5UX1NUQVRVU19SRU1PVEVfTk9UX0xJU1RFTklOR30sCisJeyJOVF9TVEFUVVNfRFVQTElDQVRFX05BTUUiLCBOVF9TVEFUVVNfRFVQTElDQVRFX05BTUV9LAorCXsiTlRfU1RBVFVTX0JBRF9ORVRXT1JLX1BBVEgiLCBOVF9TVEFUVVNfQkFEX05FVFdPUktfUEFUSH0sCisJeyJOVF9TVEFUVVNfTkVUV09SS19CVVNZIiwgTlRfU1RBVFVTX05FVFdPUktfQlVTWX0sCisJeyJOVF9TVEFUVVNfREVWSUNFX0RPRVNfTk9UX0VYSVNUIiwKKwkgTlRfU1RBVFVTX0RFVklDRV9ET0VTX05PVF9FWElTVH0sCisJeyJOVF9TVEFUVVNfVE9PX01BTllfQ09NTUFORFMiLCBOVF9TVEFUVVNfVE9PX01BTllfQ09NTUFORFN9LAorCXsiTlRfU1RBVFVTX0FEQVBURVJfSEFSRFdBUkVfRVJST1IiLAorCSBOVF9TVEFUVVNfQURBUFRFUl9IQVJEV0FSRV9FUlJPUn0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9ORVRXT1JLX1JFU1BPTlNFIiwKKwkgTlRfU1RBVFVTX0lOVkFMSURfTkVUV09SS19SRVNQT05TRX0sCisJeyJOVF9TVEFUVVNfVU5FWFBFQ1RFRF9ORVRXT1JLX0VSUk9SIiwKKwkgTlRfU1RBVFVTX1VORVhQRUNURURfTkVUV09SS19FUlJPUn0sCisJeyJOVF9TVEFUVVNfQkFEX1JFTU9URV9BREFQVEVSIiwgTlRfU1RBVFVTX0JBRF9SRU1PVEVfQURBUFRFUn0sCisJeyJOVF9TVEFUVVNfUFJJTlRfUVVFVUVfRlVMTCIsIE5UX1NUQVRVU19QUklOVF9RVUVVRV9GVUxMfSwKKwl7Ik5UX1NUQVRVU19OT19TUE9PTF9TUEFDRSIsIE5UX1NUQVRVU19OT19TUE9PTF9TUEFDRX0sCisJeyJOVF9TVEFUVVNfUFJJTlRfQ0FOQ0VMTEVEIiwgTlRfU1RBVFVTX1BSSU5UX0NBTkNFTExFRH0sCisJeyJOVF9TVEFUVVNfTkVUV09SS19OQU1FX0RFTEVURUQiLCBOVF9TVEFUVVNfTkVUV09SS19OQU1FX0RFTEVURUR9LAorCXsiTlRfU1RBVFVTX05FVFdPUktfQUNDRVNTX0RFTklFRCIsCisJIE5UX1NUQVRVU19ORVRXT1JLX0FDQ0VTU19ERU5JRUR9LAorCXsiTlRfU1RBVFVTX0JBRF9ERVZJQ0VfVFlQRSIsIE5UX1NUQVRVU19CQURfREVWSUNFX1RZUEV9LAorCXsiTlRfU1RBVFVTX0JBRF9ORVRXT1JLX05BTUUiLCBOVF9TVEFUVVNfQkFEX05FVFdPUktfTkFNRX0sCisJeyJOVF9TVEFUVVNfVE9PX01BTllfTkFNRVMiLCBOVF9TVEFUVVNfVE9PX01BTllfTkFNRVN9LAorCXsiTlRfU1RBVFVTX1RPT19NQU5ZX1NFU1NJT05TIiwgTlRfU1RBVFVTX1RPT19NQU5ZX1NFU1NJT05TfSwKKwl7Ik5UX1NUQVRVU19TSEFSSU5HX1BBVVNFRCIsIE5UX1NUQVRVU19TSEFSSU5HX1BBVVNFRH0sCisJeyJOVF9TVEFUVVNfUkVRVUVTVF9OT1RfQUNDRVBURUQiLCBOVF9TVEFUVVNfUkVRVUVTVF9OT1RfQUNDRVBURUR9LAorCXsiTlRfU1RBVFVTX1JFRElSRUNUT1JfUEFVU0VEIiwgTlRfU1RBVFVTX1JFRElSRUNUT1JfUEFVU0VEfSwKKwl7Ik5UX1NUQVRVU19ORVRfV1JJVEVfRkFVTFQiLCBOVF9TVEFUVVNfTkVUX1dSSVRFX0ZBVUxUfSwKKwl7Ik5UX1NUQVRVU19QUk9GSUxJTkdfQVRfTElNSVQiLCBOVF9TVEFUVVNfUFJPRklMSU5HX0FUX0xJTUlUfSwKKwl7Ik5UX1NUQVRVU19OT1RfU0FNRV9ERVZJQ0UiLCBOVF9TVEFUVVNfTk9UX1NBTUVfREVWSUNFfSwKKwl7Ik5UX1NUQVRVU19GSUxFX1JFTkFNRUQiLCBOVF9TVEFUVVNfRklMRV9SRU5BTUVEfSwKKwl7Ik5UX1NUQVRVU19WSVJUVUFMX0NJUkNVSVRfQ0xPU0VEIiwKKwkgTlRfU1RBVFVTX1ZJUlRVQUxfQ0lSQ1VJVF9DTE9TRUR9LAorCXsiTlRfU1RBVFVTX05PX1NFQ1VSSVRZX09OX09CSkVDVCIsCisJIE5UX1NUQVRVU19OT19TRUNVUklUWV9PTl9PQkpFQ1R9LAorCXsiTlRfU1RBVFVTX0NBTlRfV0FJVCIsIE5UX1NUQVRVU19DQU5UX1dBSVR9LAorCXsiTlRfU1RBVFVTX1BJUEVfRU1QVFkiLCBOVF9TVEFUVVNfUElQRV9FTVBUWX0sCisJeyJOVF9TVEFUVVNfQ0FOVF9BQ0NFU1NfRE9NQUlOX0lORk8iLAorCSBOVF9TVEFUVVNfQ0FOVF9BQ0NFU1NfRE9NQUlOX0lORk99LAorCXsiTlRfU1RBVFVTX0NBTlRfVEVSTUlOQVRFX1NFTEYiLCBOVF9TVEFUVVNfQ0FOVF9URVJNSU5BVEVfU0VMRn0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9TRVJWRVJfU1RBVEUiLCBOVF9TVEFUVVNfSU5WQUxJRF9TRVJWRVJfU1RBVEV9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfRE9NQUlOX1NUQVRFIiwgTlRfU1RBVFVTX0lOVkFMSURfRE9NQUlOX1NUQVRFfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0RPTUFJTl9ST0xFIiwgTlRfU1RBVFVTX0lOVkFMSURfRE9NQUlOX1JPTEV9LAorCXsiTlRfU1RBVFVTX05PX1NVQ0hfRE9NQUlOIiwgTlRfU1RBVFVTX05PX1NVQ0hfRE9NQUlOfSwKKwl7Ik5UX1NUQVRVU19ET01BSU5fRVhJU1RTIiwgTlRfU1RBVFVTX0RPTUFJTl9FWElTVFN9LAorCXsiTlRfU1RBVFVTX0RPTUFJTl9MSU1JVF9FWENFRURFRCIsCisJIE5UX1NUQVRVU19ET01BSU5fTElNSVRfRVhDRUVERUR9LAorCXsiTlRfU1RBVFVTX09QTE9DS19OT1RfR1JBTlRFRCIsIE5UX1NUQVRVU19PUExPQ0tfTk9UX0dSQU5URUR9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfT1BMT0NLX1BST1RPQ09MIiwKKwkgTlRfU1RBVFVTX0lOVkFMSURfT1BMT0NLX1BST1RPQ09MfSwKKwl7Ik5UX1NUQVRVU19JTlRFUk5BTF9EQl9DT1JSVVBUSU9OIiwKKwkgTlRfU1RBVFVTX0lOVEVSTkFMX0RCX0NPUlJVUFRJT059LAorCXsiTlRfU1RBVFVTX0lOVEVSTkFMX0VSUk9SIiwgTlRfU1RBVFVTX0lOVEVSTkFMX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19HRU5FUklDX05PVF9NQVBQRUQiLCBOVF9TVEFUVVNfR0VORVJJQ19OT1RfTUFQUEVEfSwKKwl7Ik5UX1NUQVRVU19CQURfREVTQ1JJUFRPUl9GT1JNQVQiLAorCSBOVF9TVEFUVVNfQkFEX0RFU0NSSVBUT1JfRk9STUFUfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX1VTRVJfQlVGRkVSIiwgTlRfU1RBVFVTX0lOVkFMSURfVVNFUl9CVUZGRVJ9LAorCXsiTlRfU1RBVFVTX1VORVhQRUNURURfSU9fRVJST1IiLCBOVF9TVEFUVVNfVU5FWFBFQ1RFRF9JT19FUlJPUn0sCisJeyJOVF9TVEFUVVNfVU5FWFBFQ1RFRF9NTV9DUkVBVEVfRVJSIiwKKwkgTlRfU1RBVFVTX1VORVhQRUNURURfTU1fQ1JFQVRFX0VSUn0sCisJeyJOVF9TVEFUVVNfVU5FWFBFQ1RFRF9NTV9NQVBfRVJST1IiLAorCSBOVF9TVEFUVVNfVU5FWFBFQ1RFRF9NTV9NQVBfRVJST1J9LAorCXsiTlRfU1RBVFVTX1VORVhQRUNURURfTU1fRVhURU5EX0VSUiIsCisJIE5UX1NUQVRVU19VTkVYUEVDVEVEX01NX0VYVEVORF9FUlJ9LAorCXsiTlRfU1RBVFVTX05PVF9MT0dPTl9QUk9DRVNTIiwgTlRfU1RBVFVTX05PVF9MT0dPTl9QUk9DRVNTfSwKKwl7Ik5UX1NUQVRVU19MT0dPTl9TRVNTSU9OX0VYSVNUUyIsIE5UX1NUQVRVU19MT0dPTl9TRVNTSU9OX0VYSVNUU30sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMSIsIE5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl8xfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl8yIiwgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzJ9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzMiLCBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfM30sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfNCIsIE5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl80fSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl81IiwgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzV9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzYiLCBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfNn0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfNyIsIE5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl83fSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl84IiwgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzh9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzkiLCBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfOX0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMTAiLCBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMTB9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzExIiwgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzExfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl8xMiIsIE5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl8xMn0sCisJeyJOVF9TVEFUVVNfUkVESVJFQ1RPUl9OT1RfU1RBUlRFRCIsCisJIE5UX1NUQVRVU19SRURJUkVDVE9SX05PVF9TVEFSVEVEfSwKKwl7Ik5UX1NUQVRVU19SRURJUkVDVE9SX1NUQVJURUQiLCBOVF9TVEFUVVNfUkVESVJFQ1RPUl9TVEFSVEVEfSwKKwl7Ik5UX1NUQVRVU19TVEFDS19PVkVSRkxPVyIsIE5UX1NUQVRVU19TVEFDS19PVkVSRkxPV30sCisJeyJOVF9TVEFUVVNfTk9fU1VDSF9QQUNLQUdFIiwgTlRfU1RBVFVTX05PX1NVQ0hfUEFDS0FHRX0sCisJeyJOVF9TVEFUVVNfQkFEX0ZVTkNUSU9OX1RBQkxFIiwgTlRfU1RBVFVTX0JBRF9GVU5DVElPTl9UQUJMRX0sCisJeyJOVF9TVEFUVVNfRElSRUNUT1JZX05PVF9FTVBUWSIsIE5UX1NUQVRVU19ESVJFQ1RPUllfTk9UX0VNUFRZfSwKKwl7Ik5UX1NUQVRVU19GSUxFX0NPUlJVUFRfRVJST1IiLCBOVF9TVEFUVVNfRklMRV9DT1JSVVBUX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19OT1RfQV9ESVJFQ1RPUlkiLCBOVF9TVEFUVVNfTk9UX0FfRElSRUNUT1JZfSwKKwl7Ik5UX1NUQVRVU19CQURfTE9HT05fU0VTU0lPTl9TVEFURSIsCisJIE5UX1NUQVRVU19CQURfTE9HT05fU0VTU0lPTl9TVEFURX0sCisJeyJOVF9TVEFUVVNfTE9HT05fU0VTU0lPTl9DT0xMSVNJT04iLAorCSBOVF9TVEFUVVNfTE9HT05fU0VTU0lPTl9DT0xMSVNJT059LAorCXsiTlRfU1RBVFVTX05BTUVfVE9PX0xPTkciLCBOVF9TVEFUVVNfTkFNRV9UT09fTE9OR30sCisJeyJOVF9TVEFUVVNfRklMRVNfT1BFTiIsIE5UX1NUQVRVU19GSUxFU19PUEVOfSwKKwl7Ik5UX1NUQVRVU19DT05ORUNUSU9OX0lOX1VTRSIsIE5UX1NUQVRVU19DT05ORUNUSU9OX0lOX1VTRX0sCisJeyJOVF9TVEFUVVNfTUVTU0FHRV9OT1RfRk9VTkQiLCBOVF9TVEFUVVNfTUVTU0FHRV9OT1RfRk9VTkR9LAorCXsiTlRfU1RBVFVTX1BST0NFU1NfSVNfVEVSTUlOQVRJTkciLAorCSBOVF9TVEFUVVNfUFJPQ0VTU19JU19URVJNSU5BVElOR30sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9MT0dPTl9UWVBFIiwgTlRfU1RBVFVTX0lOVkFMSURfTE9HT05fVFlQRX0sCisJeyJOVF9TVEFUVVNfTk9fR1VJRF9UUkFOU0xBVElPTiIsIE5UX1NUQVRVU19OT19HVUlEX1RSQU5TTEFUSU9OfSwKKwl7Ik5UX1NUQVRVU19DQU5OT1RfSU1QRVJTT05BVEUiLCBOVF9TVEFUVVNfQ0FOTk9UX0lNUEVSU09OQVRFfSwKKwl7Ik5UX1NUQVRVU19JTUFHRV9BTFJFQURZX0xPQURFRCIsIE5UX1NUQVRVU19JTUFHRV9BTFJFQURZX0xPQURFRH0sCisJeyJOVF9TVEFUVVNfQUJJT1NfTk9UX1BSRVNFTlQiLCBOVF9TVEFUVVNfQUJJT1NfTk9UX1BSRVNFTlR9LAorCXsiTlRfU1RBVFVTX0FCSU9TX0xJRF9OT1RfRVhJU1QiLCBOVF9TVEFUVVNfQUJJT1NfTElEX05PVF9FWElTVH0sCisJeyJOVF9TVEFUVVNfQUJJT1NfTElEX0FMUkVBRFlfT1dORUQiLAorCSBOVF9TVEFUVVNfQUJJT1NfTElEX0FMUkVBRFlfT1dORUR9LAorCXsiTlRfU1RBVFVTX0FCSU9TX05PVF9MSURfT1dORVIiLCBOVF9TVEFUVVNfQUJJT1NfTk9UX0xJRF9PV05FUn0sCisJeyJOVF9TVEFUVVNfQUJJT1NfSU5WQUxJRF9DT01NQU5EIiwKKwkgTlRfU1RBVFVTX0FCSU9TX0lOVkFMSURfQ09NTUFORH0sCisJeyJOVF9TVEFUVVNfQUJJT1NfSU5WQUxJRF9MSUQiLCBOVF9TVEFUVVNfQUJJT1NfSU5WQUxJRF9MSUR9LAorCXsiTlRfU1RBVFVTX0FCSU9TX1NFTEVDVE9SX05PVF9BVkFJTEFCTEUiLAorCSBOVF9TVEFUVVNfQUJJT1NfU0VMRUNUT1JfTk9UX0FWQUlMQUJMRX0sCisJeyJOVF9TVEFUVVNfQUJJT1NfSU5WQUxJRF9TRUxFQ1RPUiIsCisJIE5UX1NUQVRVU19BQklPU19JTlZBTElEX1NFTEVDVE9SfSwKKwl7Ik5UX1NUQVRVU19OT19MRFQiLCBOVF9TVEFUVVNfTk9fTERUfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0xEVF9TSVpFIiwgTlRfU1RBVFVTX0lOVkFMSURfTERUX1NJWkV9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfTERUX09GRlNFVCIsIE5UX1NUQVRVU19JTlZBTElEX0xEVF9PRkZTRVR9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfTERUX0RFU0NSSVBUT1IiLAorCSBOVF9TVEFUVVNfSU5WQUxJRF9MRFRfREVTQ1JJUFRPUn0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9JTUFHRV9ORV9GT1JNQVQiLAorCSBOVF9TVEFUVVNfSU5WQUxJRF9JTUFHRV9ORV9GT1JNQVR9LAorCXsiTlRfU1RBVFVTX1JYQUNUX0lOVkFMSURfU1RBVEUiLCBOVF9TVEFUVVNfUlhBQ1RfSU5WQUxJRF9TVEFURX0sCisJeyJOVF9TVEFUVVNfUlhBQ1RfQ09NTUlUX0ZBSUxVUkUiLCBOVF9TVEFUVVNfUlhBQ1RfQ09NTUlUX0ZBSUxVUkV9LAorCXsiTlRfU1RBVFVTX01BUFBFRF9GSUxFX1NJWkVfWkVSTyIsCisJIE5UX1NUQVRVU19NQVBQRURfRklMRV9TSVpFX1pFUk99LAorCXsiTlRfU1RBVFVTX1RPT19NQU5ZX09QRU5FRF9GSUxFUyIsCisJIE5UX1NUQVRVU19UT09fTUFOWV9PUEVORURfRklMRVN9LAorCXsiTlRfU1RBVFVTX0NBTkNFTExFRCIsIE5UX1NUQVRVU19DQU5DRUxMRUR9LAorCXsiTlRfU1RBVFVTX0NBTk5PVF9ERUxFVEUiLCBOVF9TVEFUVVNfQ0FOTk9UX0RFTEVURX0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9DT01QVVRFUl9OQU1FIiwKKwkgTlRfU1RBVFVTX0lOVkFMSURfQ09NUFVURVJfTkFNRX0sCisJeyJOVF9TVEFUVVNfRklMRV9ERUxFVEVEIiwgTlRfU1RBVFVTX0ZJTEVfREVMRVRFRH0sCisJeyJOVF9TVEFUVVNfU1BFQ0lBTF9BQ0NPVU5UIiwgTlRfU1RBVFVTX1NQRUNJQUxfQUNDT1VOVH0sCisJeyJOVF9TVEFUVVNfU1BFQ0lBTF9HUk9VUCIsIE5UX1NUQVRVU19TUEVDSUFMX0dST1VQfSwKKwl7Ik5UX1NUQVRVU19TUEVDSUFMX1VTRVIiLCBOVF9TVEFUVVNfU1BFQ0lBTF9VU0VSfSwKKwl7Ik5UX1NUQVRVU19NRU1CRVJTX1BSSU1BUllfR1JPVVAiLAorCSBOVF9TVEFUVVNfTUVNQkVSU19QUklNQVJZX0dST1VQfSwKKwl7Ik5UX1NUQVRVU19GSUxFX0NMT1NFRCIsIE5UX1NUQVRVU19GSUxFX0NMT1NFRH0sCisJeyJOVF9TVEFUVVNfVE9PX01BTllfVEhSRUFEUyIsIE5UX1NUQVRVU19UT09fTUFOWV9USFJFQURTfSwKKwl7Ik5UX1NUQVRVU19USFJFQURfTk9UX0lOX1BST0NFU1MiLAorCSBOVF9TVEFUVVNfVEhSRUFEX05PVF9JTl9QUk9DRVNTfSwKKwl7Ik5UX1NUQVRVU19UT0tFTl9BTFJFQURZX0lOX1VTRSIsIE5UX1NUQVRVU19UT0tFTl9BTFJFQURZX0lOX1VTRX0sCisJeyJOVF9TVEFUVVNfUEFHRUZJTEVfUVVPVEFfRVhDRUVERUQiLAorCSBOVF9TVEFUVVNfUEFHRUZJTEVfUVVPVEFfRVhDRUVERUR9LAorCXsiTlRfU1RBVFVTX0NPTU1JVE1FTlRfTElNSVQiLCBOVF9TVEFUVVNfQ09NTUlUTUVOVF9MSU1JVH0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9JTUFHRV9MRV9GT1JNQVQiLAorCSBOVF9TVEFUVVNfSU5WQUxJRF9JTUFHRV9MRV9GT1JNQVR9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfSU1BR0VfTk9UX01aIiwgTlRfU1RBVFVTX0lOVkFMSURfSU1BR0VfTk9UX01afSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0lNQUdFX1BST1RFQ1QiLAorCSBOVF9TVEFUVVNfSU5WQUxJRF9JTUFHRV9QUk9URUNUfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0lNQUdFX1dJTl8xNiIsIE5UX1NUQVRVU19JTlZBTElEX0lNQUdFX1dJTl8xNn0sCisJeyJOVF9TVEFUVVNfTE9HT05fU0VSVkVSX0NPTkZMSUNUIiwKKwkgTlRfU1RBVFVTX0xPR09OX1NFUlZFUl9DT05GTElDVH0sCisJeyJOVF9TVEFUVVNfVElNRV9ESUZGRVJFTkNFX0FUX0RDIiwKKwkgTlRfU1RBVFVTX1RJTUVfRElGRkVSRU5DRV9BVF9EQ30sCisJeyJOVF9TVEFUVVNfU1lOQ0hST05JWkFUSU9OX1JFUVVJUkVEIiwKKwkgTlRfU1RBVFVTX1NZTkNIUk9OSVpBVElPTl9SRVFVSVJFRH0sCisJeyJOVF9TVEFUVVNfRExMX05PVF9GT1VORCIsIE5UX1NUQVRVU19ETExfTk9UX0ZPVU5EfSwKKwl7Ik5UX1NUQVRVU19PUEVOX0ZBSUxFRCIsIE5UX1NUQVRVU19PUEVOX0ZBSUxFRH0sCisJeyJOVF9TVEFUVVNfSU9fUFJJVklMRUdFX0ZBSUxFRCIsIE5UX1NUQVRVU19JT19QUklWSUxFR0VfRkFJTEVEfSwKKwl7Ik5UX1NUQVRVU19PUkRJTkFMX05PVF9GT1VORCIsIE5UX1NUQVRVU19PUkRJTkFMX05PVF9GT1VORH0sCisJeyJOVF9TVEFUVVNfRU5UUllQT0lOVF9OT1RfRk9VTkQiLCBOVF9TVEFUVVNfRU5UUllQT0lOVF9OT1RfRk9VTkR9LAorCXsiTlRfU1RBVFVTX0NPTlRST0xfQ19FWElUIiwgTlRfU1RBVFVTX0NPTlRST0xfQ19FWElUfSwKKwl7Ik5UX1NUQVRVU19MT0NBTF9ESVNDT05ORUNUIiwgTlRfU1RBVFVTX0xPQ0FMX0RJU0NPTk5FQ1R9LAorCXsiTlRfU1RBVFVTX1JFTU9URV9ESVNDT05ORUNUIiwgTlRfU1RBVFVTX1JFTU9URV9ESVNDT05ORUNUfSwKKwl7Ik5UX1NUQVRVU19SRU1PVEVfUkVTT1VSQ0VTIiwgTlRfU1RBVFVTX1JFTU9URV9SRVNPVVJDRVN9LAorCXsiTlRfU1RBVFVTX0xJTktfRkFJTEVEIiwgTlRfU1RBVFVTX0xJTktfRkFJTEVEfSwKKwl7Ik5UX1NUQVRVU19MSU5LX1RJTUVPVVQiLCBOVF9TVEFUVVNfTElOS19USU1FT1VUfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0NPTk5FQ1RJT04iLCBOVF9TVEFUVVNfSU5WQUxJRF9DT05ORUNUSU9OfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0FERFJFU1MiLCBOVF9TVEFUVVNfSU5WQUxJRF9BRERSRVNTfSwKKwl7Ik5UX1NUQVRVU19ETExfSU5JVF9GQUlMRUQiLCBOVF9TVEFUVVNfRExMX0lOSVRfRkFJTEVEfSwKKwl7Ik5UX1NUQVRVU19NSVNTSU5HX1NZU1RFTUZJTEUiLCBOVF9TVEFUVVNfTUlTU0lOR19TWVNURU1GSUxFfSwKKwl7Ik5UX1NUQVRVU19VTkhBTkRMRURfRVhDRVBUSU9OIiwgTlRfU1RBVFVTX1VOSEFORExFRF9FWENFUFRJT059LAorCXsiTlRfU1RBVFVTX0FQUF9JTklUX0ZBSUxVUkUiLCBOVF9TVEFUVVNfQVBQX0lOSVRfRkFJTFVSRX0sCisJeyJOVF9TVEFUVVNfUEFHRUZJTEVfQ1JFQVRFX0ZBSUxFRCIsCisJIE5UX1NUQVRVU19QQUdFRklMRV9DUkVBVEVfRkFJTEVEfSwKKwl7Ik5UX1NUQVRVU19OT19QQUdFRklMRSIsIE5UX1NUQVRVU19OT19QQUdFRklMRX0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9MRVZFTCIsIE5UX1NUQVRVU19JTlZBTElEX0xFVkVMfSwKKwl7Ik5UX1NUQVRVU19XUk9OR19QQVNTV09SRF9DT1JFIiwgTlRfU1RBVFVTX1dST05HX1BBU1NXT1JEX0NPUkV9LAorCXsiTlRfU1RBVFVTX0lMTEVHQUxfRkxPQVRfQ09OVEVYVCIsCisJIE5UX1NUQVRVU19JTExFR0FMX0ZMT0FUX0NPTlRFWFR9LAorCXsiTlRfU1RBVFVTX1BJUEVfQlJPS0VOIiwgTlRfU1RBVFVTX1BJUEVfQlJPS0VOfSwKKwl7Ik5UX1NUQVRVU19SRUdJU1RSWV9DT1JSVVBUIiwgTlRfU1RBVFVTX1JFR0lTVFJZX0NPUlJVUFR9LAorCXsiTlRfU1RBVFVTX1JFR0lTVFJZX0lPX0ZBSUxFRCIsIE5UX1NUQVRVU19SRUdJU1RSWV9JT19GQUlMRUR9LAorCXsiTlRfU1RBVFVTX05PX0VWRU5UX1BBSVIiLCBOVF9TVEFUVVNfTk9fRVZFTlRfUEFJUn0sCisJeyJOVF9TVEFUVVNfVU5SRUNPR05JWkVEX1ZPTFVNRSIsIE5UX1NUQVRVU19VTlJFQ09HTklaRURfVk9MVU1FfSwKKwl7Ik5UX1NUQVRVU19TRVJJQUxfTk9fREVWSUNFX0lOSVRFRCIsCisJIE5UX1NUQVRVU19TRVJJQUxfTk9fREVWSUNFX0lOSVRFRH0sCisJeyJOVF9TVEFUVVNfTk9fU1VDSF9BTElBUyIsIE5UX1NUQVRVU19OT19TVUNIX0FMSUFTfSwKKwl7Ik5UX1NUQVRVU19NRU1CRVJfTk9UX0lOX0FMSUFTIiwgTlRfU1RBVFVTX01FTUJFUl9OT1RfSU5fQUxJQVN9LAorCXsiTlRfU1RBVFVTX01FTUJFUl9JTl9BTElBUyIsIE5UX1NUQVRVU19NRU1CRVJfSU5fQUxJQVN9LAorCXsiTlRfU1RBVFVTX0FMSUFTX0VYSVNUUyIsIE5UX1NUQVRVU19BTElBU19FWElTVFN9LAorCXsiTlRfU1RBVFVTX0xPR09OX05PVF9HUkFOVEVEIiwgTlRfU1RBVFVTX0xPR09OX05PVF9HUkFOVEVEfSwKKwl7Ik5UX1NUQVRVU19UT09fTUFOWV9TRUNSRVRTIiwgTlRfU1RBVFVTX1RPT19NQU5ZX1NFQ1JFVFN9LAorCXsiTlRfU1RBVFVTX1NFQ1JFVF9UT09fTE9ORyIsIE5UX1NUQVRVU19TRUNSRVRfVE9PX0xPTkd9LAorCXsiTlRfU1RBVFVTX0lOVEVSTkFMX0RCX0VSUk9SIiwgTlRfU1RBVFVTX0lOVEVSTkFMX0RCX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19GVUxMU0NSRUVOX01PREUiLCBOVF9TVEFUVVNfRlVMTFNDUkVFTl9NT0RFfSwKKwl7Ik5UX1NUQVRVU19UT09fTUFOWV9DT05URVhUX0lEUyIsIE5UX1NUQVRVU19UT09fTUFOWV9DT05URVhUX0lEU30sCisJeyJOVF9TVEFUVVNfTE9HT05fVFlQRV9OT1RfR1JBTlRFRCIsCisJIE5UX1NUQVRVU19MT0dPTl9UWVBFX05PVF9HUkFOVEVEfSwKKwl7Ik5UX1NUQVRVU19OT1RfUkVHSVNUUllfRklMRSIsIE5UX1NUQVRVU19OT1RfUkVHSVNUUllfRklMRX0sCisJeyJOVF9TVEFUVVNfTlRfQ1JPU1NfRU5DUllQVElPTl9SRVFVSVJFRCIsCisJIE5UX1NUQVRVU19OVF9DUk9TU19FTkNSWVBUSU9OX1JFUVVJUkVEfSwKKwl7Ik5UX1NUQVRVU19ET01BSU5fQ1RSTFJfQ09ORklHX0VSUk9SIiwKKwkgTlRfU1RBVFVTX0RPTUFJTl9DVFJMUl9DT05GSUdfRVJST1J9LAorCXsiTlRfU1RBVFVTX0ZUX01JU1NJTkdfTUVNQkVSIiwgTlRfU1RBVFVTX0ZUX01JU1NJTkdfTUVNQkVSfSwKKwl7Ik5UX1NUQVRVU19JTExfRk9STUVEX1NFUlZJQ0VfRU5UUlkiLAorCSBOVF9TVEFUVVNfSUxMX0ZPUk1FRF9TRVJWSUNFX0VOVFJZfSwKKwl7Ik5UX1NUQVRVU19JTExFR0FMX0NIQVJBQ1RFUiIsIE5UX1NUQVRVU19JTExFR0FMX0NIQVJBQ1RFUn0sCisJeyJOVF9TVEFUVVNfVU5NQVBQQUJMRV9DSEFSQUNURVIiLCBOVF9TVEFUVVNfVU5NQVBQQUJMRV9DSEFSQUNURVJ9LAorCXsiTlRfU1RBVFVTX1VOREVGSU5FRF9DSEFSQUNURVIiLCBOVF9TVEFUVVNfVU5ERUZJTkVEX0NIQVJBQ1RFUn0sCisJeyJOVF9TVEFUVVNfRkxPUFBZX1ZPTFVNRSIsIE5UX1NUQVRVU19GTE9QUFlfVk9MVU1FfSwKKwl7Ik5UX1NUQVRVU19GTE9QUFlfSURfTUFSS19OT1RfRk9VTkQiLAorCSBOVF9TVEFUVVNfRkxPUFBZX0lEX01BUktfTk9UX0ZPVU5EfSwKKwl7Ik5UX1NUQVRVU19GTE9QUFlfV1JPTkdfQ1lMSU5ERVIiLAorCSBOVF9TVEFUVVNfRkxPUFBZX1dST05HX0NZTElOREVSfSwKKwl7Ik5UX1NUQVRVU19GTE9QUFlfVU5LTk9XTl9FUlJPUiIsIE5UX1NUQVRVU19GTE9QUFlfVU5LTk9XTl9FUlJPUn0sCisJeyJOVF9TVEFUVVNfRkxPUFBZX0JBRF9SRUdJU1RFUlMiLCBOVF9TVEFUVVNfRkxPUFBZX0JBRF9SRUdJU1RFUlN9LAorCXsiTlRfU1RBVFVTX0RJU0tfUkVDQUxJQlJBVEVfRkFJTEVEIiwKKwkgTlRfU1RBVFVTX0RJU0tfUkVDQUxJQlJBVEVfRkFJTEVEfSwKKwl7Ik5UX1NUQVRVU19ESVNLX09QRVJBVElPTl9GQUlMRUQiLAorCSBOVF9TVEFUVVNfRElTS19PUEVSQVRJT05fRkFJTEVEfSwKKwl7Ik5UX1NUQVRVU19ESVNLX1JFU0VUX0ZBSUxFRCIsIE5UX1NUQVRVU19ESVNLX1JFU0VUX0ZBSUxFRH0sCisJeyJOVF9TVEFUVVNfU0hBUkVEX0lSUV9CVVNZIiwgTlRfU1RBVFVTX1NIQVJFRF9JUlFfQlVTWX0sCisJeyJOVF9TVEFUVVNfRlRfT1JQSEFOSU5HIiwgTlRfU1RBVFVTX0ZUX09SUEhBTklOR30sCisJeyJOVF9TVEFUVVNfUEFSVElUSU9OX0ZBSUxVUkUiLCBOVF9TVEFUVVNfUEFSVElUSU9OX0ZBSUxVUkV9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfQkxPQ0tfTEVOR1RIIiwgTlRfU1RBVFVTX0lOVkFMSURfQkxPQ0tfTEVOR1RIfSwKKwl7Ik5UX1NUQVRVU19ERVZJQ0VfTk9UX1BBUlRJVElPTkVEIiwKKwkgTlRfU1RBVFVTX0RFVklDRV9OT1RfUEFSVElUSU9ORUR9LAorCXsiTlRfU1RBVFVTX1VOQUJMRV9UT19MT0NLX01FRElBIiwgTlRfU1RBVFVTX1VOQUJMRV9UT19MT0NLX01FRElBfSwKKwl7Ik5UX1NUQVRVU19VTkFCTEVfVE9fVU5MT0FEX01FRElBIiwKKwkgTlRfU1RBVFVTX1VOQUJMRV9UT19VTkxPQURfTUVESUF9LAorCXsiTlRfU1RBVFVTX0VPTV9PVkVSRkxPVyIsIE5UX1NUQVRVU19FT01fT1ZFUkZMT1d9LAorCXsiTlRfU1RBVFVTX05PX01FRElBIiwgTlRfU1RBVFVTX05PX01FRElBfSwKKwl7Ik5UX1NUQVRVU19OT19TVUNIX01FTUJFUiIsIE5UX1NUQVRVU19OT19TVUNIX01FTUJFUn0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9NRU1CRVIiLCBOVF9TVEFUVVNfSU5WQUxJRF9NRU1CRVJ9LAorCXsiTlRfU1RBVFVTX0tFWV9ERUxFVEVEIiwgTlRfU1RBVFVTX0tFWV9ERUxFVEVEfSwKKwl7Ik5UX1NUQVRVU19OT19MT0dfU1BBQ0UiLCBOVF9TVEFUVVNfTk9fTE9HX1NQQUNFfSwKKwl7Ik5UX1NUQVRVU19UT09fTUFOWV9TSURTIiwgTlRfU1RBVFVTX1RPT19NQU5ZX1NJRFN9LAorCXsiTlRfU1RBVFVTX0xNX0NST1NTX0VOQ1JZUFRJT05fUkVRVUlSRUQiLAorCSBOVF9TVEFUVVNfTE1fQ1JPU1NfRU5DUllQVElPTl9SRVFVSVJFRH0sCisJeyJOVF9TVEFUVVNfS0VZX0hBU19DSElMRFJFTiIsIE5UX1NUQVRVU19LRVlfSEFTX0NISUxEUkVOfSwKKwl7Ik5UX1NUQVRVU19DSElMRF9NVVNUX0JFX1ZPTEFUSUxFIiwKKwkgTlRfU1RBVFVTX0NISUxEX01VU1RfQkVfVk9MQVRJTEV9LAorCXsiTlRfU1RBVFVTX0RFVklDRV9DT05GSUdVUkFUSU9OX0VSUk9SIiwKKwkgTlRfU1RBVFVTX0RFVklDRV9DT05GSUdVUkFUSU9OX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19EUklWRVJfSU5URVJOQUxfRVJST1IiLAorCSBOVF9TVEFUVVNfRFJJVkVSX0lOVEVSTkFMX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0RFVklDRV9TVEFURSIsIE5UX1NUQVRVU19JTlZBTElEX0RFVklDRV9TVEFURX0sCisJeyJOVF9TVEFUVVNfSU9fREVWSUNFX0VSUk9SIiwgTlRfU1RBVFVTX0lPX0RFVklDRV9FUlJPUn0sCisJeyJOVF9TVEFUVVNfREVWSUNFX1BST1RPQ09MX0VSUk9SIiwKKwkgTlRfU1RBVFVTX0RFVklDRV9QUk9UT0NPTF9FUlJPUn0sCisJeyJOVF9TVEFUVVNfQkFDS1VQX0NPTlRST0xMRVIiLCBOVF9TVEFUVVNfQkFDS1VQX0NPTlRST0xMRVJ9LAorCXsiTlRfU1RBVFVTX0xPR19GSUxFX0ZVTEwiLCBOVF9TVEFUVVNfTE9HX0ZJTEVfRlVMTH0sCisJeyJOVF9TVEFUVVNfVE9PX0xBVEUiLCBOVF9TVEFUVVNfVE9PX0xBVEV9LAorCXsiTlRfU1RBVFVTX05PX1RSVVNUX0xTQV9TRUNSRVQiLCBOVF9TVEFUVVNfTk9fVFJVU1RfTFNBX1NFQ1JFVH0sCisJeyJOVF9TVEFUVVNfTk9fVFJVU1RfU0FNX0FDQ09VTlQiLCBOVF9TVEFUVVNfTk9fVFJVU1RfU0FNX0FDQ09VTlR9LAorCXsiTlRfU1RBVFVTX1RSVVNURURfRE9NQUlOX0ZBSUxVUkUiLAorCSBOVF9TVEFUVVNfVFJVU1RFRF9ET01BSU5fRkFJTFVSRX0sCisJeyJOVF9TVEFUVVNfVFJVU1RFRF9SRUxBVElPTlNISVBfRkFJTFVSRSIsCisJIE5UX1NUQVRVU19UUlVTVEVEX1JFTEFUSU9OU0hJUF9GQUlMVVJFfSwKKwl7Ik5UX1NUQVRVU19FVkVOVExPR19GSUxFX0NPUlJVUFQiLAorCSBOVF9TVEFUVVNfRVZFTlRMT0dfRklMRV9DT1JSVVBUfSwKKwl7Ik5UX1NUQVRVU19FVkVOVExPR19DQU5UX1NUQVJUIiwgTlRfU1RBVFVTX0VWRU5UTE9HX0NBTlRfU1RBUlR9LAorCXsiTlRfU1RBVFVTX1RSVVNUX0ZBSUxVUkUiLCBOVF9TVEFUVVNfVFJVU1RfRkFJTFVSRX0sCisJeyJOVF9TVEFUVVNfTVVUQU5UX0xJTUlUX0VYQ0VFREVEIiwKKwkgTlRfU1RBVFVTX01VVEFOVF9MSU1JVF9FWENFRURFRH0sCisJeyJOVF9TVEFUVVNfTkVUTE9HT05fTk9UX1NUQVJURUQiLCBOVF9TVEFUVVNfTkVUTE9HT05fTk9UX1NUQVJURUR9LAorCXsiTlRfU1RBVFVTX0FDQ09VTlRfRVhQSVJFRCIsIE5UX1NUQVRVU19BQ0NPVU5UX0VYUElSRUR9LAorCXsiTlRfU1RBVFVTX1BPU1NJQkxFX0RFQURMT0NLIiwgTlRfU1RBVFVTX1BPU1NJQkxFX0RFQURMT0NLfSwKKwl7Ik5UX1NUQVRVU19ORVRXT1JLX0NSRURFTlRJQUxfQ09ORkxJQ1QiLAorCSBOVF9TVEFUVVNfTkVUV09SS19DUkVERU5USUFMX0NPTkZMSUNUfSwKKwl7Ik5UX1NUQVRVU19SRU1PVEVfU0VTU0lPTl9MSU1JVCIsIE5UX1NUQVRVU19SRU1PVEVfU0VTU0lPTl9MSU1JVH0sCisJeyJOVF9TVEFUVVNfRVZFTlRMT0dfRklMRV9DSEFOR0VEIiwKKwkgTlRfU1RBVFVTX0VWRU5UTE9HX0ZJTEVfQ0hBTkdFRH0sCisJeyJOVF9TVEFUVVNfTk9MT0dPTl9JTlRFUkRPTUFJTl9UUlVTVF9BQ0NPVU5UIiwKKwkgTlRfU1RBVFVTX05PTE9HT05fSU5URVJET01BSU5fVFJVU1RfQUNDT1VOVH0sCisJeyJOVF9TVEFUVVNfTk9MT0dPTl9XT1JLU1RBVElPTl9UUlVTVF9BQ0NPVU5UIiwKKwkgTlRfU1RBVFVTX05PTE9HT05fV09SS1NUQVRJT05fVFJVU1RfQUNDT1VOVH0sCisJeyJOVF9TVEFUVVNfTk9MT0dPTl9TRVJWRVJfVFJVU1RfQUNDT1VOVCIsCisJIE5UX1NUQVRVU19OT0xPR09OX1NFUlZFUl9UUlVTVF9BQ0NPVU5UfSwKKwl7Ik5UX1NUQVRVU19ET01BSU5fVFJVU1RfSU5DT05TSVNURU5UIiwKKwkgTlRfU1RBVFVTX0RPTUFJTl9UUlVTVF9JTkNPTlNJU1RFTlR9LAorCXsiTlRfU1RBVFVTX0ZTX0RSSVZFUl9SRVFVSVJFRCIsIE5UX1NUQVRVU19GU19EUklWRVJfUkVRVUlSRUR9LAorCXsiTlRfU1RBVFVTX05PX1VTRVJfU0VTU0lPTl9LRVkiLCBOVF9TVEFUVVNfTk9fVVNFUl9TRVNTSU9OX0tFWX0sCisJeyJOVF9TVEFUVVNfVVNFUl9TRVNTSU9OX0RFTEVURUQiLCBOVF9TVEFUVVNfVVNFUl9TRVNTSU9OX0RFTEVURUR9LAorCXsiTlRfU1RBVFVTX1JFU09VUkNFX0xBTkdfTk9UX0ZPVU5EIiwKKwkgTlRfU1RBVFVTX1JFU09VUkNFX0xBTkdfTk9UX0ZPVU5EfSwKKwl7Ik5UX1NUQVRVU19JTlNVRkZfU0VSVkVSX1JFU09VUkNFUyIsCisJIE5UX1NUQVRVU19JTlNVRkZfU0VSVkVSX1JFU09VUkNFU30sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9CVUZGRVJfU0laRSIsIE5UX1NUQVRVU19JTlZBTElEX0JVRkZFUl9TSVpFfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0FERFJFU1NfQ09NUE9ORU5UIiwKKwkgTlRfU1RBVFVTX0lOVkFMSURfQUREUkVTU19DT01QT05FTlR9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfQUREUkVTU19XSUxEQ0FSRCIsCisJIE5UX1NUQVRVU19JTlZBTElEX0FERFJFU1NfV0lMRENBUkR9LAorCXsiTlRfU1RBVFVTX1RPT19NQU5ZX0FERFJFU1NFUyIsIE5UX1NUQVRVU19UT09fTUFOWV9BRERSRVNTRVN9LAorCXsiTlRfU1RBVFVTX0FERFJFU1NfQUxSRUFEWV9FWElTVFMiLAorCSBOVF9TVEFUVVNfQUREUkVTU19BTFJFQURZX0VYSVNUU30sCisJeyJOVF9TVEFUVVNfQUREUkVTU19DTE9TRUQiLCBOVF9TVEFUVVNfQUREUkVTU19DTE9TRUR9LAorCXsiTlRfU1RBVFVTX0NPTk5FQ1RJT05fRElTQ09OTkVDVEVEIiwKKwkgTlRfU1RBVFVTX0NPTk5FQ1RJT05fRElTQ09OTkVDVEVEfSwKKwl7Ik5UX1NUQVRVU19DT05ORUNUSU9OX1JFU0VUIiwgTlRfU1RBVFVTX0NPTk5FQ1RJT05fUkVTRVR9LAorCXsiTlRfU1RBVFVTX1RPT19NQU5ZX05PREVTIiwgTlRfU1RBVFVTX1RPT19NQU5ZX05PREVTfSwKKwl7Ik5UX1NUQVRVU19UUkFOU0FDVElPTl9BQk9SVEVEIiwgTlRfU1RBVFVTX1RSQU5TQUNUSU9OX0FCT1JURUR9LAorCXsiTlRfU1RBVFVTX1RSQU5TQUNUSU9OX1RJTUVEX09VVCIsCisJIE5UX1NUQVRVU19UUkFOU0FDVElPTl9USU1FRF9PVVR9LAorCXsiTlRfU1RBVFVTX1RSQU5TQUNUSU9OX05PX1JFTEVBU0UiLAorCSBOVF9TVEFUVVNfVFJBTlNBQ1RJT05fTk9fUkVMRUFTRX0sCisJeyJOVF9TVEFUVVNfVFJBTlNBQ1RJT05fTk9fTUFUQ0giLCBOVF9TVEFUVVNfVFJBTlNBQ1RJT05fTk9fTUFUQ0h9LAorCXsiTlRfU1RBVFVTX1RSQU5TQUNUSU9OX1JFU1BPTkRFRCIsCisJIE5UX1NUQVRVU19UUkFOU0FDVElPTl9SRVNQT05ERUR9LAorCXsiTlRfU1RBVFVTX1RSQU5TQUNUSU9OX0lOVkFMSURfSUQiLAorCSBOVF9TVEFUVVNfVFJBTlNBQ1RJT05fSU5WQUxJRF9JRH0sCisJeyJOVF9TVEFUVVNfVFJBTlNBQ1RJT05fSU5WQUxJRF9UWVBFIiwKKwkgTlRfU1RBVFVTX1RSQU5TQUNUSU9OX0lOVkFMSURfVFlQRX0sCisJeyJOVF9TVEFUVVNfTk9UX1NFUlZFUl9TRVNTSU9OIiwgTlRfU1RBVFVTX05PVF9TRVJWRVJfU0VTU0lPTn0sCisJeyJOVF9TVEFUVVNfTk9UX0NMSUVOVF9TRVNTSU9OIiwgTlRfU1RBVFVTX05PVF9DTElFTlRfU0VTU0lPTn0sCisJeyJOVF9TVEFUVVNfQ0FOTk9UX0xPQURfUkVHSVNUUllfRklMRSIsCisJIE5UX1NUQVRVU19DQU5OT1RfTE9BRF9SRUdJU1RSWV9GSUxFfSwKKwl7Ik5UX1NUQVRVU19ERUJVR19BVFRBQ0hfRkFJTEVEIiwgTlRfU1RBVFVTX0RFQlVHX0FUVEFDSF9GQUlMRUR9LAorCXsiTlRfU1RBVFVTX1NZU1RFTV9QUk9DRVNTX1RFUk1JTkFURUQiLAorCSBOVF9TVEFUVVNfU1lTVEVNX1BST0NFU1NfVEVSTUlOQVRFRH0sCisJeyJOVF9TVEFUVVNfREFUQV9OT1RfQUNDRVBURUQiLCBOVF9TVEFUVVNfREFUQV9OT1RfQUNDRVBURUR9LAorCXsiTlRfU1RBVFVTX05PX0JST1dTRVJfU0VSVkVSU19GT1VORCIsCisJIE5UX1NUQVRVU19OT19CUk9XU0VSX1NFUlZFUlNfRk9VTkR9LAorCXsiTlRfU1RBVFVTX1ZETV9IQVJEX0VSUk9SIiwgTlRfU1RBVFVTX1ZETV9IQVJEX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19EUklWRVJfQ0FOQ0VMX1RJTUVPVVQiLAorCSBOVF9TVEFUVVNfRFJJVkVSX0NBTkNFTF9USU1FT1VUfSwKKwl7Ik5UX1NUQVRVU19SRVBMWV9NRVNTQUdFX01JU01BVENIIiwKKwkgTlRfU1RBVFVTX1JFUExZX01FU1NBR0VfTUlTTUFUQ0h9LAorCXsiTlRfU1RBVFVTX01BUFBFRF9BTElHTk1FTlQiLCBOVF9TVEFUVVNfTUFQUEVEX0FMSUdOTUVOVH0sCisJeyJOVF9TVEFUVVNfSU1BR0VfQ0hFQ0tTVU1fTUlTTUFUQ0giLAorCSBOVF9TVEFUVVNfSU1BR0VfQ0hFQ0tTVU1fTUlTTUFUQ0h9LAorCXsiTlRfU1RBVFVTX0xPU1RfV1JJVEVCRUhJTkRfREFUQSIsCisJIE5UX1NUQVRVU19MT1NUX1dSSVRFQkVISU5EX0RBVEF9LAorCXsiTlRfU1RBVFVTX0NMSUVOVF9TRVJWRVJfUEFSQU1FVEVSU19JTlZBTElEIiwKKwkgTlRfU1RBVFVTX0NMSUVOVF9TRVJWRVJfUEFSQU1FVEVSU19JTlZBTElEfSwKKwl7Ik5UX1NUQVRVU19QQVNTV09SRF9NVVNUX0NIQU5HRSIsIE5UX1NUQVRVU19QQVNTV09SRF9NVVNUX0NIQU5HRX0sCisJeyJOVF9TVEFUVVNfTk9UX0ZPVU5EIiwgTlRfU1RBVFVTX05PVF9GT1VORH0sCisJeyJOVF9TVEFUVVNfTk9UX1RJTllfU1RSRUFNIiwgTlRfU1RBVFVTX05PVF9USU5ZX1NUUkVBTX0sCisJeyJOVF9TVEFUVVNfUkVDT1ZFUllfRkFJTFVSRSIsIE5UX1NUQVRVU19SRUNPVkVSWV9GQUlMVVJFfSwKKwl7Ik5UX1NUQVRVU19TVEFDS19PVkVSRkxPV19SRUFEIiwgTlRfU1RBVFVTX1NUQUNLX09WRVJGTE9XX1JFQUR9LAorCXsiTlRfU1RBVFVTX0ZBSUxfQ0hFQ0siLCBOVF9TVEFUVVNfRkFJTF9DSEVDS30sCisJeyJOVF9TVEFUVVNfRFVQTElDQVRFX09CSkVDVElEIiwgTlRfU1RBVFVTX0RVUExJQ0FURV9PQkpFQ1RJRH0sCisJeyJOVF9TVEFUVVNfT0JKRUNUSURfRVhJU1RTIiwgTlRfU1RBVFVTX09CSkVDVElEX0VYSVNUU30sCisJeyJOVF9TVEFUVVNfQ09OVkVSVF9UT19MQVJHRSIsIE5UX1NUQVRVU19DT05WRVJUX1RPX0xBUkdFfSwKKwl7Ik5UX1NUQVRVU19SRVRSWSIsIE5UX1NUQVRVU19SRVRSWX0sCisJeyJOVF9TVEFUVVNfRk9VTkRfT1VUX09GX1NDT1BFIiwgTlRfU1RBVFVTX0ZPVU5EX09VVF9PRl9TQ09QRX0sCisJeyJOVF9TVEFUVVNfQUxMT0NBVEVfQlVDS0VUIiwgTlRfU1RBVFVTX0FMTE9DQVRFX0JVQ0tFVH0sCisJeyJOVF9TVEFUVVNfUFJPUFNFVF9OT1RfRk9VTkQiLCBOVF9TVEFUVVNfUFJPUFNFVF9OT1RfRk9VTkR9LAorCXsiTlRfU1RBVFVTX01BUlNIQUxMX09WRVJGTE9XIiwgTlRfU1RBVFVTX01BUlNIQUxMX09WRVJGTE9XfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX1ZBUklBTlQiLCBOVF9TVEFUVVNfSU5WQUxJRF9WQVJJQU5UfSwKKwl7Ik5UX1NUQVRVU19ET01BSU5fQ09OVFJPTExFUl9OT1RfRk9VTkQiLAorCSBOVF9TVEFUVVNfRE9NQUlOX0NPTlRST0xMRVJfTk9UX0ZPVU5EfSwKKwl7Ik5UX1NUQVRVU19BQ0NPVU5UX0xPQ0tFRF9PVVQiLCBOVF9TVEFUVVNfQUNDT1VOVF9MT0NLRURfT1VUfSwKKwl7Ik5UX1NUQVRVU19IQU5ETEVfTk9UX0NMT1NBQkxFIiwgTlRfU1RBVFVTX0hBTkRMRV9OT1RfQ0xPU0FCTEV9LAorCXsiTlRfU1RBVFVTX0NPTk5FQ1RJT05fUkVGVVNFRCIsIE5UX1NUQVRVU19DT05ORUNUSU9OX1JFRlVTRUR9LAorCXsiTlRfU1RBVFVTX0dSQUNFRlVMX0RJU0NPTk5FQ1QiLCBOVF9TVEFUVVNfR1JBQ0VGVUxfRElTQ09OTkVDVH0sCisJeyJOVF9TVEFUVVNfQUREUkVTU19BTFJFQURZX0FTU09DSUFURUQiLAorCSBOVF9TVEFUVVNfQUREUkVTU19BTFJFQURZX0FTU09DSUFURUR9LAorCXsiTlRfU1RBVFVTX0FERFJFU1NfTk9UX0FTU09DSUFURUQiLAorCSBOVF9TVEFUVVNfQUREUkVTU19OT1RfQVNTT0NJQVRFRH0sCisJeyJOVF9TVEFUVVNfQ09OTkVDVElPTl9JTlZBTElEIiwgTlRfU1RBVFVTX0NPTk5FQ1RJT05fSU5WQUxJRH0sCisJeyJOVF9TVEFUVVNfQ09OTkVDVElPTl9BQ1RJVkUiLCBOVF9TVEFUVVNfQ09OTkVDVElPTl9BQ1RJVkV9LAorCXsiTlRfU1RBVFVTX05FVFdPUktfVU5SRUFDSEFCTEUiLCBOVF9TVEFUVVNfTkVUV09SS19VTlJFQUNIQUJMRX0sCisJeyJOVF9TVEFUVVNfSE9TVF9VTlJFQUNIQUJMRSIsIE5UX1NUQVRVU19IT1NUX1VOUkVBQ0hBQkxFfSwKKwl7Ik5UX1NUQVRVU19QUk9UT0NPTF9VTlJFQUNIQUJMRSIsIE5UX1NUQVRVU19QUk9UT0NPTF9VTlJFQUNIQUJMRX0sCisJeyJOVF9TVEFUVVNfUE9SVF9VTlJFQUNIQUJMRSIsIE5UX1NUQVRVU19QT1JUX1VOUkVBQ0hBQkxFfSwKKwl7Ik5UX1NUQVRVU19SRVFVRVNUX0FCT1JURUQiLCBOVF9TVEFUVVNfUkVRVUVTVF9BQk9SVEVEfSwKKwl7Ik5UX1NUQVRVU19DT05ORUNUSU9OX0FCT1JURUQiLCBOVF9TVEFUVVNfQ09OTkVDVElPTl9BQk9SVEVEfSwKKwl7Ik5UX1NUQVRVU19CQURfQ09NUFJFU1NJT05fQlVGRkVSIiwKKwkgTlRfU1RBVFVTX0JBRF9DT01QUkVTU0lPTl9CVUZGRVJ9LAorCXsiTlRfU1RBVFVTX1VTRVJfTUFQUEVEX0ZJTEUiLCBOVF9TVEFUVVNfVVNFUl9NQVBQRURfRklMRX0sCisJeyJOVF9TVEFUVVNfQVVESVRfRkFJTEVEIiwgTlRfU1RBVFVTX0FVRElUX0ZBSUxFRH0sCisJeyJOVF9TVEFUVVNfVElNRVJfUkVTT0xVVElPTl9OT1RfU0VUIiwKKwkgTlRfU1RBVFVTX1RJTUVSX1JFU09MVVRJT05fTk9UX1NFVH0sCisJeyJOVF9TVEFUVVNfQ09OTkVDVElPTl9DT1VOVF9MSU1JVCIsCisJIE5UX1NUQVRVU19DT05ORUNUSU9OX0NPVU5UX0xJTUlUfSwKKwl7Ik5UX1NUQVRVU19MT0dJTl9USU1FX1JFU1RSSUNUSU9OIiwKKwkgTlRfU1RBVFVTX0xPR0lOX1RJTUVfUkVTVFJJQ1RJT059LAorCXsiTlRfU1RBVFVTX0xPR0lOX1dLU1RBX1JFU1RSSUNUSU9OIiwKKwkgTlRfU1RBVFVTX0xPR0lOX1dLU1RBX1JFU1RSSUNUSU9OfSwKKwl7Ik5UX1NUQVRVU19JTUFHRV9NUF9VUF9NSVNNQVRDSCIsIE5UX1NUQVRVU19JTUFHRV9NUF9VUF9NSVNNQVRDSH0sCisJeyJOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0xPR09OX0lORk8iLAorCSBOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0xPR09OX0lORk99LAorCXsiTlRfU1RBVFVTX0JBRF9ETExfRU5UUllQT0lOVCIsIE5UX1NUQVRVU19CQURfRExMX0VOVFJZUE9JTlR9LAorCXsiTlRfU1RBVFVTX0JBRF9TRVJWSUNFX0VOVFJZUE9JTlQiLAorCSBOVF9TVEFUVVNfQkFEX1NFUlZJQ0VfRU5UUllQT0lOVH0sCisJeyJOVF9TVEFUVVNfTFBDX1JFUExZX0xPU1QiLCBOVF9TVEFUVVNfTFBDX1JFUExZX0xPU1R9LAorCXsiTlRfU1RBVFVTX0lQX0FERFJFU1NfQ09ORkxJQ1QxIiwgTlRfU1RBVFVTX0lQX0FERFJFU1NfQ09ORkxJQ1QxfSwKKwl7Ik5UX1NUQVRVU19JUF9BRERSRVNTX0NPTkZMSUNUMiIsIE5UX1NUQVRVU19JUF9BRERSRVNTX0NPTkZMSUNUMn0sCisJeyJOVF9TVEFUVVNfUkVHSVNUUllfUVVPVEFfTElNSVQiLCBOVF9TVEFUVVNfUkVHSVNUUllfUVVPVEFfTElNSVR9LAorCXsiTlRfU1RBVFVTX1BBVEhfTk9UX0NPVkVSRUQiLCBOVF9TVEFUVVNfUEFUSF9OT1RfQ09WRVJFRH0sCisJeyJOVF9TVEFUVVNfTk9fQ0FMTEJBQ0tfQUNUSVZFIiwgTlRfU1RBVFVTX05PX0NBTExCQUNLX0FDVElWRX0sCisJeyJOVF9TVEFUVVNfTElDRU5TRV9RVU9UQV9FWENFRURFRCIsCisJIE5UX1NUQVRVU19MSUNFTlNFX1FVT1RBX0VYQ0VFREVEfSwKKwl7Ik5UX1NUQVRVU19QV0RfVE9PX1NIT1JUIiwgTlRfU1RBVFVTX1BXRF9UT09fU0hPUlR9LAorCXsiTlRfU1RBVFVTX1BXRF9UT09fUkVDRU5UIiwgTlRfU1RBVFVTX1BXRF9UT09fUkVDRU5UfSwKKwl7Ik5UX1NUQVRVU19QV0RfSElTVE9SWV9DT05GTElDVCIsIE5UX1NUQVRVU19QV0RfSElTVE9SWV9DT05GTElDVH0sCisJeyJOVF9TVEFUVVNfUExVR1BMQVlfTk9fREVWSUNFIiwgTlRfU1RBVFVTX1BMVUdQTEFZX05PX0RFVklDRX0sCisJeyJOVF9TVEFUVVNfVU5TVVBQT1JURURfQ09NUFJFU1NJT04iLAorCSBOVF9TVEFUVVNfVU5TVVBQT1JURURfQ09NUFJFU1NJT059LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfSFdfUFJPRklMRSIsIE5UX1NUQVRVU19JTlZBTElEX0hXX1BST0ZJTEV9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfUExVR1BMQVlfREVWSUNFX1BBVEgiLAorCSBOVF9TVEFUVVNfSU5WQUxJRF9QTFVHUExBWV9ERVZJQ0VfUEFUSH0sCisJeyJOVF9TVEFUVVNfRFJJVkVSX09SRElOQUxfTk9UX0ZPVU5EIiwKKwkgTlRfU1RBVFVTX0RSSVZFUl9PUkRJTkFMX05PVF9GT1VORH0sCisJeyJOVF9TVEFUVVNfRFJJVkVSX0VOVFJZUE9JTlRfTk9UX0ZPVU5EIiwKKwkgTlRfU1RBVFVTX0RSSVZFUl9FTlRSWVBPSU5UX05PVF9GT1VORH0sCisJeyJOVF9TVEFUVVNfUkVTT1VSQ0VfTk9UX09XTkVEIiwgTlRfU1RBVFVTX1JFU09VUkNFX05PVF9PV05FRH0sCisJeyJOVF9TVEFUVVNfVE9PX01BTllfTElOS1MiLCBOVF9TVEFUVVNfVE9PX01BTllfTElOS1N9LAorCXsiTlRfU1RBVFVTX1FVT1RBX0xJU1RfSU5DT05TSVNURU5UIiwKKwkgTlRfU1RBVFVTX1FVT1RBX0xJU1RfSU5DT05TSVNURU5UfSwKKwl7Ik5UX1NUQVRVU19GSUxFX0lTX09GRkxJTkUiLCBOVF9TVEFUVVNfRklMRV9JU19PRkZMSU5FfSwKKwl7Ik5UX1NUQVRVU19OT19NT1JFX0VOVFJJRVMiLCBOVF9TVEFUVVNfTk9fTU9SRV9FTlRSSUVTfSwKKwl7IlNUQVRVU19NT1JFX0VOVFJJRVMiLCBTVEFUVVNfTU9SRV9FTlRSSUVTfSwKKwl7IlNUQVRVU19TT01FX1VOTUFQUEVEIiwgU1RBVFVTX1NPTUVfVU5NQVBQRUR9LAorCXtOVUxMLCAwfQorfTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvbnRlcnIuaCBiL2ZzL2NpZnMvbnRlcnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmZiMDZjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9udGVyci5oCkBAIC0wLDAgKzEsNTU2IEBACisvKiAKKyAgIFVuaXggU01CL05ldGJpb3MgaW1wbGVtZW50YXRpb24uCisgICBWZXJzaW9uIDEuOS4KKyAgIE5UIGVycm9yIGNvZGUgY29uc3RhbnRzCisgICBDb3B5cmlnaHQgKEMpIEFuZHJldyBUcmlkZ2VsbCAgICAgICAgICAgICAgMTk5Mi0yMDAwCisgICBDb3B5cmlnaHQgKEMpIEpvaG4gSCBUZXJwc3RyYSAgICAgICAgICAgICAgMTk5Ni0yMDAwCisgICBDb3B5cmlnaHQgKEMpIEx1a2UgS2VubmV0aCBDYXNzb24gTGVpZ2h0b24gMTk5Ni0yMDAwCisgICBDb3B5cmlnaHQgKEMpIFBhdWwgQXNodG9uICAgICAgICAgICAgICAgICAgMTk5OC0yMDAwCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisKKworI2lmbmRlZiBfTlRFUlJfSAorI2RlZmluZSBfTlRFUlJfSAorCitzdHJ1Y3QgbnRfZXJyX2NvZGVfc3RydWN0IHsKKwljaGFyICpudF9lcnJzdHI7CisJX191MzIgbnRfZXJyY29kZTsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbnRfZXJyX2NvZGVfc3RydWN0IG50X2VycnNbXTsKKworLyogV2luMzIgU3RhdHVzIGNvZGVzLiAqLworCisjZGVmaW5lIFNUQVRVU19CVUZGRVJfT1ZFUkZMT1cgICAgICAgICAgICAweDgwMDAwMDA1CisjZGVmaW5lIFNUQVRVU19NT1JFX0VOVFJJRVMgICAgICAgICAgICAgICAweDAxMDUKKyNkZWZpbmUgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIJCSAgMHgwMDU3CisjZGVmaW5lIEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIJICAweDAwN2EKKyNkZWZpbmUgU1RBVFVTXzE4MDQJICAgICAgICAgICAgICAgICAgMHgwNzBjCisjZGVmaW5lIFNUQVRVU19OT1RJRllfRU5VTV9ESVIgICAgICAgICAgICAweDAxMGMKKworLyogV2luMzIgRXJyb3IgY29kZXMgZXh0cmFjdGVkIHVzaW5nIGEgbG9vcCBpbiBzbWJjbGllbnQgdGhlbiBwcmludGluZyBhCisgICBuZXRtb24gc25pZmYgdG8gYSBmaWxlLiAqLworCisjZGVmaW5lIE5UX1NUQVRVU19PSyAweDAwMDAKKyNkZWZpbmUgU1RBVFVTX1NPTUVfVU5NQVBQRUQgICAgICAgMHgwMTA3CisjZGVmaW5lIFNUQVRVU19CVUZGRVJfT1ZFUkZMT1cgICAgIDB4ODAwMDAwMDUKKyNkZWZpbmUgTlRfU1RBVFVTX05PX01PUkVfRU5UUklFUyAgMHg4MDAwMDAxYQorI2RlZmluZSBOVF9TVEFUVVNfVU5TVUNDRVNTRlVMIDB4QzAwMDAwMDAgfCAweDAwMDEKKyNkZWZpbmUgTlRfU1RBVFVTX05PVF9JTVBMRU1FTlRFRCAweEMwMDAwMDAwIHwgMHgwMDAyCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0lORk9fQ0xBU1MgMHhDMDAwMDAwMCB8IDB4MDAwMworI2RlZmluZSBOVF9TVEFUVVNfSU5GT19MRU5HVEhfTUlTTUFUQ0ggMHhDMDAwMDAwMCB8IDB4MDAwNAorI2RlZmluZSBOVF9TVEFUVVNfQUNDRVNTX1ZJT0xBVElPTiAweEMwMDAwMDAwIHwgMHgwMDA1CisjZGVmaW5lIE5UX1NUQVRVU19JTl9QQUdFX0VSUk9SIDB4QzAwMDAwMDAgfCAweDAwMDYKKyNkZWZpbmUgTlRfU1RBVFVTX1BBR0VGSUxFX1FVT1RBIDB4QzAwMDAwMDAgfCAweDAwMDcKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfSEFORExFIDB4QzAwMDAwMDAgfCAweDAwMDgKKyNkZWZpbmUgTlRfU1RBVFVTX0JBRF9JTklUSUFMX1NUQUNLIDB4QzAwMDAwMDAgfCAweDAwMDkKKyNkZWZpbmUgTlRfU1RBVFVTX0JBRF9JTklUSUFMX1BDIDB4QzAwMDAwMDAgfCAweDAwMGEKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfQ0lEIDB4QzAwMDAwMDAgfCAweDAwMGIKKyNkZWZpbmUgTlRfU1RBVFVTX1RJTUVSX05PVF9DQU5DRUxFRCAweEMwMDAwMDAwIHwgMHgwMDBjCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUiAweEMwMDAwMDAwIHwgMHgwMDBkCisjZGVmaW5lIE5UX1NUQVRVU19OT19TVUNIX0RFVklDRSAweEMwMDAwMDAwIHwgMHgwMDBlCisjZGVmaW5lIE5UX1NUQVRVU19OT19TVUNIX0ZJTEUgMHhDMDAwMDAwMCB8IDB4MDAwZgorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9ERVZJQ0VfUkVRVUVTVCAweEMwMDAwMDAwIHwgMHgwMDEwCisjZGVmaW5lIE5UX1NUQVRVU19FTkRfT0ZfRklMRSAweEMwMDAwMDAwIHwgMHgwMDExCisjZGVmaW5lIE5UX1NUQVRVU19XUk9OR19WT0xVTUUgMHhDMDAwMDAwMCB8IDB4MDAxMgorI2RlZmluZSBOVF9TVEFUVVNfTk9fTUVESUFfSU5fREVWSUNFIDB4QzAwMDAwMDAgfCAweDAwMTMKKyNkZWZpbmUgTlRfU1RBVFVTX1VOUkVDT0dOSVpFRF9NRURJQSAweEMwMDAwMDAwIHwgMHgwMDE0CisjZGVmaW5lIE5UX1NUQVRVU19OT05FWElTVEVOVF9TRUNUT1IgMHhDMDAwMDAwMCB8IDB4MDAxNQorI2RlZmluZSBOVF9TVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVEIDB4QzAwMDAwMDAgfCAweDAwMTYKKyNkZWZpbmUgTlRfU1RBVFVTX05PX01FTU9SWSAweEMwMDAwMDAwIHwgMHgwMDE3CisjZGVmaW5lIE5UX1NUQVRVU19DT05GTElDVElOR19BRERSRVNTRVMgMHhDMDAwMDAwMCB8IDB4MDAxOAorI2RlZmluZSBOVF9TVEFUVVNfTk9UX01BUFBFRF9WSUVXIDB4QzAwMDAwMDAgfCAweDAwMTkKKyNkZWZpbmUgTlRfU1RBVFVTX1VOQUJMRV9UT19GUkVFX1ZNIDB4ODAwMDAwMDAgfCAweDAwMWEKKyNkZWZpbmUgTlRfU1RBVFVTX1VOQUJMRV9UT19ERUxFVEVfU0VDVElPTiAweEMwMDAwMDAwIHwgMHgwMDFiCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1NZU1RFTV9TRVJWSUNFIDB4QzAwMDAwMDAgfCAweDAwMWMKKyNkZWZpbmUgTlRfU1RBVFVTX0lMTEVHQUxfSU5TVFJVQ1RJT04gMHhDMDAwMDAwMCB8IDB4MDAxZAorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9MT0NLX1NFUVVFTkNFIDB4QzAwMDAwMDAgfCAweDAwMWUKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfVklFV19TSVpFIDB4QzAwMDAwMDAgfCAweDAwMWYKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfRklMRV9GT1JfU0VDVElPTiAweEMwMDAwMDAwIHwgMHgwMDIwCisjZGVmaW5lIE5UX1NUQVRVU19BTFJFQURZX0NPTU1JVFRFRCAweEMwMDAwMDAwIHwgMHgwMDIxCisjZGVmaW5lIE5UX1NUQVRVU19BQ0NFU1NfREVOSUVEIDB4QzAwMDAwMDAgfCAweDAwMjIKKyNkZWZpbmUgTlRfU1RBVFVTX0JVRkZFUl9UT09fU01BTEwgMHhDMDAwMDAwMCB8IDB4MDAyMworI2RlZmluZSBOVF9TVEFUVVNfT0JKRUNUX1RZUEVfTUlTTUFUQ0ggMHhDMDAwMDAwMCB8IDB4MDAyNAorI2RlZmluZSBOVF9TVEFUVVNfTk9OQ09OVElOVUFCTEVfRVhDRVBUSU9OIDB4QzAwMDAwMDAgfCAweDAwMjUKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfRElTUE9TSVRJT04gMHhDMDAwMDAwMCB8IDB4MDAyNgorI2RlZmluZSBOVF9TVEFUVVNfVU5XSU5EIDB4QzAwMDAwMDAgfCAweDAwMjcKKyNkZWZpbmUgTlRfU1RBVFVTX0JBRF9TVEFDSyAweEMwMDAwMDAwIHwgMHgwMDI4CisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1VOV0lORF9UQVJHRVQgMHhDMDAwMDAwMCB8IDB4MDAyOQorI2RlZmluZSBOVF9TVEFUVVNfTk9UX0xPQ0tFRCAweEMwMDAwMDAwIHwgMHgwMDJhCisjZGVmaW5lIE5UX1NUQVRVU19QQVJJVFlfRVJST1IgMHhDMDAwMDAwMCB8IDB4MDAyYgorI2RlZmluZSBOVF9TVEFUVVNfVU5BQkxFX1RPX0RFQ09NTUlUX1ZNIDB4QzAwMDAwMDAgfCAweDAwMmMKKyNkZWZpbmUgTlRfU1RBVFVTX05PVF9DT01NSVRURUQgMHhDMDAwMDAwMCB8IDB4MDAyZAorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QT1JUX0FUVFJJQlVURVMgMHhDMDAwMDAwMCB8IDB4MDAyZQorI2RlZmluZSBOVF9TVEFUVVNfUE9SVF9NRVNTQUdFX1RPT19MT05HIDB4QzAwMDAwMDAgfCAweDAwMmYKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSX01JWCAweEMwMDAwMDAwIHwgMHgwMDMwCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1FVT1RBX0xPV0VSIDB4QzAwMDAwMDAgfCAweDAwMzEKKyNkZWZpbmUgTlRfU1RBVFVTX0RJU0tfQ09SUlVQVF9FUlJPUiAweEMwMDAwMDAwIHwgMHgwMDMyCisjZGVmaW5lIE5UX1NUQVRVU19PQkpFQ1RfTkFNRV9JTlZBTElEIDB4QzAwMDAwMDAgfCAweDAwMzMKKyNkZWZpbmUgTlRfU1RBVFVTX09CSkVDVF9OQU1FX05PVF9GT1VORCAweEMwMDAwMDAwIHwgMHgwMDM0CisjZGVmaW5lIE5UX1NUQVRVU19PQkpFQ1RfTkFNRV9DT0xMSVNJT04gMHhDMDAwMDAwMCB8IDB4MDAzNQorI2RlZmluZSBOVF9TVEFUVVNfSEFORExFX05PVF9XQUlUQUJMRSAweEMwMDAwMDAwIHwgMHgwMDM2CisjZGVmaW5lIE5UX1NUQVRVU19QT1JUX0RJU0NPTk5FQ1RFRCAweEMwMDAwMDAwIHwgMHgwMDM3CisjZGVmaW5lIE5UX1NUQVRVU19ERVZJQ0VfQUxSRUFEWV9BVFRBQ0hFRCAweEMwMDAwMDAwIHwgMHgwMDM4CisjZGVmaW5lIE5UX1NUQVRVU19PQkpFQ1RfUEFUSF9JTlZBTElEIDB4QzAwMDAwMDAgfCAweDAwMzkKKyNkZWZpbmUgTlRfU1RBVFVTX09CSkVDVF9QQVRIX05PVF9GT1VORCAweEMwMDAwMDAwIHwgMHgwMDNhCisjZGVmaW5lIE5UX1NUQVRVU19PQkpFQ1RfUEFUSF9TWU5UQVhfQkFEIDB4QzAwMDAwMDAgfCAweDAwM2IKKyNkZWZpbmUgTlRfU1RBVFVTX0RBVEFfT1ZFUlJVTiAweEMwMDAwMDAwIHwgMHgwMDNjCisjZGVmaW5lIE5UX1NUQVRVU19EQVRBX0xBVEVfRVJST1IgMHhDMDAwMDAwMCB8IDB4MDAzZAorI2RlZmluZSBOVF9TVEFUVVNfREFUQV9FUlJPUiAweEMwMDAwMDAwIHwgMHgwMDNlCisjZGVmaW5lIE5UX1NUQVRVU19DUkNfRVJST1IgMHhDMDAwMDAwMCB8IDB4MDAzZgorI2RlZmluZSBOVF9TVEFUVVNfU0VDVElPTl9UT09fQklHIDB4QzAwMDAwMDAgfCAweDAwNDAKKyNkZWZpbmUgTlRfU1RBVFVTX1BPUlRfQ09OTkVDVElPTl9SRUZVU0VEIDB4QzAwMDAwMDAgfCAweDAwNDEKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfUE9SVF9IQU5ETEUgMHhDMDAwMDAwMCB8IDB4MDA0MgorI2RlZmluZSBOVF9TVEFUVVNfU0hBUklOR19WSU9MQVRJT04gMHhDMDAwMDAwMCB8IDB4MDA0MworI2RlZmluZSBOVF9TVEFUVVNfUVVPVEFfRVhDRUVERUQgMHhDMDAwMDAwMCB8IDB4MDA0NAorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QQUdFX1BST1RFQ1RJT04gMHhDMDAwMDAwMCB8IDB4MDA0NQorI2RlZmluZSBOVF9TVEFUVVNfTVVUQU5UX05PVF9PV05FRCAweEMwMDAwMDAwIHwgMHgwMDQ2CisjZGVmaW5lIE5UX1NUQVRVU19TRU1BUEhPUkVfTElNSVRfRVhDRUVERUQgMHhDMDAwMDAwMCB8IDB4MDA0NworI2RlZmluZSBOVF9TVEFUVVNfUE9SVF9BTFJFQURZX1NFVCAweEMwMDAwMDAwIHwgMHgwMDQ4CisjZGVmaW5lIE5UX1NUQVRVU19TRUNUSU9OX05PVF9JTUFHRSAweEMwMDAwMDAwIHwgMHgwMDQ5CisjZGVmaW5lIE5UX1NUQVRVU19TVVNQRU5EX0NPVU5UX0VYQ0VFREVEIDB4QzAwMDAwMDAgfCAweDAwNGEKKyNkZWZpbmUgTlRfU1RBVFVTX1RIUkVBRF9JU19URVJNSU5BVElORyAweEMwMDAwMDAwIHwgMHgwMDRiCisjZGVmaW5lIE5UX1NUQVRVU19CQURfV09SS0lOR19TRVRfTElNSVQgMHhDMDAwMDAwMCB8IDB4MDA0YworI2RlZmluZSBOVF9TVEFUVVNfSU5DT01QQVRJQkxFX0ZJTEVfTUFQIDB4QzAwMDAwMDAgfCAweDAwNGQKKyNkZWZpbmUgTlRfU1RBVFVTX1NFQ1RJT05fUFJPVEVDVElPTiAweEMwMDAwMDAwIHwgMHgwMDRlCisjZGVmaW5lIE5UX1NUQVRVU19FQVNfTk9UX1NVUFBPUlRFRCAweEMwMDAwMDAwIHwgMHgwMDRmCisjZGVmaW5lIE5UX1NUQVRVU19FQV9UT09fTEFSR0UgMHhDMDAwMDAwMCB8IDB4MDA1MAorI2RlZmluZSBOVF9TVEFUVVNfTk9ORVhJU1RFTlRfRUFfRU5UUlkgMHhDMDAwMDAwMCB8IDB4MDA1MQorI2RlZmluZSBOVF9TVEFUVVNfTk9fRUFTX09OX0ZJTEUgMHhDMDAwMDAwMCB8IDB4MDA1MgorI2RlZmluZSBOVF9TVEFUVVNfRUFfQ09SUlVQVF9FUlJPUiAweEMwMDAwMDAwIHwgMHgwMDUzCisjZGVmaW5lIE5UX1NUQVRVU19GSUxFX0xPQ0tfQ09ORkxJQ1QgMHhDMDAwMDAwMCB8IDB4MDA1NAorI2RlZmluZSBOVF9TVEFUVVNfTE9DS19OT1RfR1JBTlRFRCAweEMwMDAwMDAwIHwgMHgwMDU1CisjZGVmaW5lIE5UX1NUQVRVU19ERUxFVEVfUEVORElORyAweEMwMDAwMDAwIHwgMHgwMDU2CisjZGVmaW5lIE5UX1NUQVRVU19DVExfRklMRV9OT1RfU1VQUE9SVEVEIDB4QzAwMDAwMDAgfCAweDAwNTcKKyNkZWZpbmUgTlRfU1RBVFVTX1VOS05PV05fUkVWSVNJT04gMHhDMDAwMDAwMCB8IDB4MDA1OAorI2RlZmluZSBOVF9TVEFUVVNfUkVWSVNJT05fTUlTTUFUQ0ggMHhDMDAwMDAwMCB8IDB4MDA1OQorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9PV05FUiAweEMwMDAwMDAwIHwgMHgwMDVhCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1BSSU1BUllfR1JPVVAgMHhDMDAwMDAwMCB8IDB4MDA1YgorI2RlZmluZSBOVF9TVEFUVVNfTk9fSU1QRVJTT05BVElPTl9UT0tFTiAweEMwMDAwMDAwIHwgMHgwMDVjCisjZGVmaW5lIE5UX1NUQVRVU19DQU5UX0RJU0FCTEVfTUFOREFUT1JZIDB4QzAwMDAwMDAgfCAweDAwNWQKKyNkZWZpbmUgTlRfU1RBVFVTX05PX0xPR09OX1NFUlZFUlMgMHhDMDAwMDAwMCB8IDB4MDA1ZQorI2RlZmluZSBOVF9TVEFUVVNfTk9fU1VDSF9MT0dPTl9TRVNTSU9OIDB4QzAwMDAwMDAgfCAweDAwNWYKKyNkZWZpbmUgTlRfU1RBVFVTX05PX1NVQ0hfUFJJVklMRUdFIDB4QzAwMDAwMDAgfCAweDAwNjAKKyNkZWZpbmUgTlRfU1RBVFVTX1BSSVZJTEVHRV9OT1RfSEVMRCAweEMwMDAwMDAwIHwgMHgwMDYxCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0FDQ09VTlRfTkFNRSAweEMwMDAwMDAwIHwgMHgwMDYyCisjZGVmaW5lIE5UX1NUQVRVU19VU0VSX0VYSVNUUyAweEMwMDAwMDAwIHwgMHgwMDYzCisjZGVmaW5lIE5UX1NUQVRVU19OT19TVUNIX1VTRVIgMHhDMDAwMDAwMCB8IDB4MDA2NAorI2RlZmluZSBOVF9TVEFUVVNfR1JPVVBfRVhJU1RTIDB4QzAwMDAwMDAgfCAweDAwNjUKKyNkZWZpbmUgTlRfU1RBVFVTX05PX1NVQ0hfR1JPVVAgMHhDMDAwMDAwMCB8IDB4MDA2NgorI2RlZmluZSBOVF9TVEFUVVNfTUVNQkVSX0lOX0dST1VQIDB4QzAwMDAwMDAgfCAweDAwNjcKKyNkZWZpbmUgTlRfU1RBVFVTX01FTUJFUl9OT1RfSU5fR1JPVVAgMHhDMDAwMDAwMCB8IDB4MDA2OAorI2RlZmluZSBOVF9TVEFUVVNfTEFTVF9BRE1JTiAweEMwMDAwMDAwIHwgMHgwMDY5CisjZGVmaW5lIE5UX1NUQVRVU19XUk9OR19QQVNTV09SRCAweEMwMDAwMDAwIHwgMHgwMDZhCisjZGVmaW5lIE5UX1NUQVRVU19JTExfRk9STUVEX1BBU1NXT1JEIDB4QzAwMDAwMDAgfCAweDAwNmIKKyNkZWZpbmUgTlRfU1RBVFVTX1BBU1NXT1JEX1JFU1RSSUNUSU9OIDB4QzAwMDAwMDAgfCAweDAwNmMKKyNkZWZpbmUgTlRfU1RBVFVTX0xPR09OX0ZBSUxVUkUgMHhDMDAwMDAwMCB8IDB4MDA2ZAorI2RlZmluZSBOVF9TVEFUVVNfQUNDT1VOVF9SRVNUUklDVElPTiAweEMwMDAwMDAwIHwgMHgwMDZlCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0xPR09OX0hPVVJTIDB4QzAwMDAwMDAgfCAweDAwNmYKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfV09SS1NUQVRJT04gMHhDMDAwMDAwMCB8IDB4MDA3MAorI2RlZmluZSBOVF9TVEFUVVNfUEFTU1dPUkRfRVhQSVJFRCAweEMwMDAwMDAwIHwgMHgwMDcxCisjZGVmaW5lIE5UX1NUQVRVU19BQ0NPVU5UX0RJU0FCTEVEIDB4QzAwMDAwMDAgfCAweDAwNzIKKyNkZWZpbmUgTlRfU1RBVFVTX05PTkVfTUFQUEVEIDB4QzAwMDAwMDAgfCAweDAwNzMKKyNkZWZpbmUgTlRfU1RBVFVTX1RPT19NQU5ZX0xVSURTX1JFUVVFU1RFRCAweEMwMDAwMDAwIHwgMHgwMDc0CisjZGVmaW5lIE5UX1NUQVRVU19MVUlEU19FWEhBVVNURUQgMHhDMDAwMDAwMCB8IDB4MDA3NQorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9TVUJfQVVUSE9SSVRZIDB4QzAwMDAwMDAgfCAweDAwNzYKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfQUNMIDB4QzAwMDAwMDAgfCAweDAwNzcKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfU0lEIDB4QzAwMDAwMDAgfCAweDAwNzgKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfU0VDVVJJVFlfREVTQ1IgMHhDMDAwMDAwMCB8IDB4MDA3OQorI2RlZmluZSBOVF9TVEFUVVNfUFJPQ0VEVVJFX05PVF9GT1VORCAweEMwMDAwMDAwIHwgMHgwMDdhCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0lNQUdFX0ZPUk1BVCAweEMwMDAwMDAwIHwgMHgwMDdiCisjZGVmaW5lIE5UX1NUQVRVU19OT19UT0tFTiAweEMwMDAwMDAwIHwgMHgwMDdjCisjZGVmaW5lIE5UX1NUQVRVU19CQURfSU5IRVJJVEFOQ0VfQUNMIDB4QzAwMDAwMDAgfCAweDAwN2QKKyNkZWZpbmUgTlRfU1RBVFVTX1JBTkdFX05PVF9MT0NLRUQgMHhDMDAwMDAwMCB8IDB4MDA3ZQorI2RlZmluZSBOVF9TVEFUVVNfRElTS19GVUxMIDB4QzAwMDAwMDAgfCAweDAwN2YKKyNkZWZpbmUgTlRfU1RBVFVTX1NFUlZFUl9ESVNBQkxFRCAweEMwMDAwMDAwIHwgMHgwMDgwCisjZGVmaW5lIE5UX1NUQVRVU19TRVJWRVJfTk9UX0RJU0FCTEVEIDB4QzAwMDAwMDAgfCAweDAwODEKKyNkZWZpbmUgTlRfU1RBVFVTX1RPT19NQU5ZX0dVSURTX1JFUVVFU1RFRCAweEMwMDAwMDAwIHwgMHgwMDgyCisjZGVmaW5lIE5UX1NUQVRVU19HVUlEU19FWEhBVVNURUQgMHhDMDAwMDAwMCB8IDB4MDA4MworI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9JRF9BVVRIT1JJVFkgMHhDMDAwMDAwMCB8IDB4MDA4NAorI2RlZmluZSBOVF9TVEFUVVNfQUdFTlRTX0VYSEFVU1RFRCAweEMwMDAwMDAwIHwgMHgwMDg1CisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1ZPTFVNRV9MQUJFTCAweEMwMDAwMDAwIHwgMHgwMDg2CisjZGVmaW5lIE5UX1NUQVRVU19TRUNUSU9OX05PVF9FWFRFTkRFRCAweEMwMDAwMDAwIHwgMHgwMDg3CisjZGVmaW5lIE5UX1NUQVRVU19OT1RfTUFQUEVEX0RBVEEgMHhDMDAwMDAwMCB8IDB4MDA4OAorI2RlZmluZSBOVF9TVEFUVVNfUkVTT1VSQ0VfREFUQV9OT1RfRk9VTkQgMHhDMDAwMDAwMCB8IDB4MDA4OQorI2RlZmluZSBOVF9TVEFUVVNfUkVTT1VSQ0VfVFlQRV9OT1RfRk9VTkQgMHhDMDAwMDAwMCB8IDB4MDA4YQorI2RlZmluZSBOVF9TVEFUVVNfUkVTT1VSQ0VfTkFNRV9OT1RfRk9VTkQgMHhDMDAwMDAwMCB8IDB4MDA4YgorI2RlZmluZSBOVF9TVEFUVVNfQVJSQVlfQk9VTkRTX0VYQ0VFREVEIDB4QzAwMDAwMDAgfCAweDAwOGMKKyNkZWZpbmUgTlRfU1RBVFVTX0ZMT0FUX0RFTk9STUFMX09QRVJBTkQgMHhDMDAwMDAwMCB8IDB4MDA4ZAorI2RlZmluZSBOVF9TVEFUVVNfRkxPQVRfRElWSURFX0JZX1pFUk8gMHhDMDAwMDAwMCB8IDB4MDA4ZQorI2RlZmluZSBOVF9TVEFUVVNfRkxPQVRfSU5FWEFDVF9SRVNVTFQgMHhDMDAwMDAwMCB8IDB4MDA4ZgorI2RlZmluZSBOVF9TVEFUVVNfRkxPQVRfSU5WQUxJRF9PUEVSQVRJT04gMHhDMDAwMDAwMCB8IDB4MDA5MAorI2RlZmluZSBOVF9TVEFUVVNfRkxPQVRfT1ZFUkZMT1cgMHhDMDAwMDAwMCB8IDB4MDA5MQorI2RlZmluZSBOVF9TVEFUVVNfRkxPQVRfU1RBQ0tfQ0hFQ0sgMHhDMDAwMDAwMCB8IDB4MDA5MgorI2RlZmluZSBOVF9TVEFUVVNfRkxPQVRfVU5ERVJGTE9XIDB4QzAwMDAwMDAgfCAweDAwOTMKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVEVHRVJfRElWSURFX0JZX1pFUk8gMHhDMDAwMDAwMCB8IDB4MDA5NAorI2RlZmluZSBOVF9TVEFUVVNfSU5URUdFUl9PVkVSRkxPVyAweEMwMDAwMDAwIHwgMHgwMDk1CisjZGVmaW5lIE5UX1NUQVRVU19QUklWSUxFR0VEX0lOU1RSVUNUSU9OIDB4QzAwMDAwMDAgfCAweDAwOTYKKyNkZWZpbmUgTlRfU1RBVFVTX1RPT19NQU5ZX1BBR0lOR19GSUxFUyAweEMwMDAwMDAwIHwgMHgwMDk3CisjZGVmaW5lIE5UX1NUQVRVU19GSUxFX0lOVkFMSUQgMHhDMDAwMDAwMCB8IDB4MDA5OAorI2RlZmluZSBOVF9TVEFUVVNfQUxMT1RURURfU1BBQ0VfRVhDRUVERUQgMHhDMDAwMDAwMCB8IDB4MDA5OQorI2RlZmluZSBOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX1JFU09VUkNFUyAweEMwMDAwMDAwIHwgMHgwMDlhCisjZGVmaW5lIE5UX1NUQVRVU19ERlNfRVhJVF9QQVRIX0ZPVU5EIDB4QzAwMDAwMDAgfCAweDAwOWIKKyNkZWZpbmUgTlRfU1RBVFVTX0RFVklDRV9EQVRBX0VSUk9SIDB4QzAwMDAwMDAgfCAweDAwOWMKKyNkZWZpbmUgTlRfU1RBVFVTX0RFVklDRV9OT1RfQ09OTkVDVEVEIDB4QzAwMDAwMDAgfCAweDAwOWQKKyNkZWZpbmUgTlRfU1RBVFVTX0RFVklDRV9QT1dFUl9GQUlMVVJFIDB4QzAwMDAwMDAgfCAweDAwOWUKKyNkZWZpbmUgTlRfU1RBVFVTX0ZSRUVfVk1fTk9UX0FUX0JBU0UgMHhDMDAwMDAwMCB8IDB4MDA5ZgorI2RlZmluZSBOVF9TVEFUVVNfTUVNT1JZX05PVF9BTExPQ0FURUQgMHhDMDAwMDAwMCB8IDB4MDBhMAorI2RlZmluZSBOVF9TVEFUVVNfV09SS0lOR19TRVRfUVVPVEEgMHhDMDAwMDAwMCB8IDB4MDBhMQorI2RlZmluZSBOVF9TVEFUVVNfTUVESUFfV1JJVEVfUFJPVEVDVEVEIDB4QzAwMDAwMDAgfCAweDAwYTIKKyNkZWZpbmUgTlRfU1RBVFVTX0RFVklDRV9OT1RfUkVBRFkgMHhDMDAwMDAwMCB8IDB4MDBhMworI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9HUk9VUF9BVFRSSUJVVEVTIDB4QzAwMDAwMDAgfCAweDAwYTQKKyNkZWZpbmUgTlRfU1RBVFVTX0JBRF9JTVBFUlNPTkFUSU9OX0xFVkVMIDB4QzAwMDAwMDAgfCAweDAwYTUKKyNkZWZpbmUgTlRfU1RBVFVTX0NBTlRfT1BFTl9BTk9OWU1PVVMgMHhDMDAwMDAwMCB8IDB4MDBhNgorI2RlZmluZSBOVF9TVEFUVVNfQkFEX1ZBTElEQVRJT05fQ0xBU1MgMHhDMDAwMDAwMCB8IDB4MDBhNworI2RlZmluZSBOVF9TVEFUVVNfQkFEX1RPS0VOX1RZUEUgMHhDMDAwMDAwMCB8IDB4MDBhOAorI2RlZmluZSBOVF9TVEFUVVNfQkFEX01BU1RFUl9CT09UX1JFQ09SRCAweEMwMDAwMDAwIHwgMHgwMGE5CisjZGVmaW5lIE5UX1NUQVRVU19JTlNUUlVDVElPTl9NSVNBTElHTk1FTlQgMHhDMDAwMDAwMCB8IDB4MDBhYQorI2RlZmluZSBOVF9TVEFUVVNfSU5TVEFOQ0VfTk9UX0FWQUlMQUJMRSAweEMwMDAwMDAwIHwgMHgwMGFiCisjZGVmaW5lIE5UX1NUQVRVU19QSVBFX05PVF9BVkFJTEFCTEUgMHhDMDAwMDAwMCB8IDB4MDBhYworI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QSVBFX1NUQVRFIDB4QzAwMDAwMDAgfCAweDAwYWQKKyNkZWZpbmUgTlRfU1RBVFVTX1BJUEVfQlVTWSAweEMwMDAwMDAwIHwgMHgwMGFlCisjZGVmaW5lIE5UX1NUQVRVU19JTExFR0FMX0ZVTkNUSU9OIDB4QzAwMDAwMDAgfCAweDAwYWYKKyNkZWZpbmUgTlRfU1RBVFVTX1BJUEVfRElTQ09OTkVDVEVEIDB4QzAwMDAwMDAgfCAweDAwYjAKKyNkZWZpbmUgTlRfU1RBVFVTX1BJUEVfQ0xPU0lORyAweEMwMDAwMDAwIHwgMHgwMGIxCisjZGVmaW5lIE5UX1NUQVRVU19QSVBFX0NPTk5FQ1RFRCAweEMwMDAwMDAwIHwgMHgwMGIyCisjZGVmaW5lIE5UX1NUQVRVU19QSVBFX0xJU1RFTklORyAweEMwMDAwMDAwIHwgMHgwMGIzCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1JFQURfTU9ERSAweEMwMDAwMDAwIHwgMHgwMGI0CisjZGVmaW5lIE5UX1NUQVRVU19JT19USU1FT1VUIDB4QzAwMDAwMDAgfCAweDAwYjUKKyNkZWZpbmUgTlRfU1RBVFVTX0ZJTEVfRk9SQ0VEX0NMT1NFRCAweEMwMDAwMDAwIHwgMHgwMGI2CisjZGVmaW5lIE5UX1NUQVRVU19QUk9GSUxJTkdfTk9UX1NUQVJURUQgMHhDMDAwMDAwMCB8IDB4MDBiNworI2RlZmluZSBOVF9TVEFUVVNfUFJPRklMSU5HX05PVF9TVE9QUEVEIDB4QzAwMDAwMDAgfCAweDAwYjgKKyNkZWZpbmUgTlRfU1RBVFVTX0NPVUxEX05PVF9JTlRFUlBSRVQgMHhDMDAwMDAwMCB8IDB4MDBiOQorI2RlZmluZSBOVF9TVEFUVVNfRklMRV9JU19BX0RJUkVDVE9SWSAweEMwMDAwMDAwIHwgMHgwMGJhCisjZGVmaW5lIE5UX1NUQVRVU19OT1RfU1VQUE9SVEVEIDB4QzAwMDAwMDAgfCAweDAwYmIKKyNkZWZpbmUgTlRfU1RBVFVTX1JFTU9URV9OT1RfTElTVEVOSU5HIDB4QzAwMDAwMDAgfCAweDAwYmMKKyNkZWZpbmUgTlRfU1RBVFVTX0RVUExJQ0FURV9OQU1FIDB4QzAwMDAwMDAgfCAweDAwYmQKKyNkZWZpbmUgTlRfU1RBVFVTX0JBRF9ORVRXT1JLX1BBVEggMHhDMDAwMDAwMCB8IDB4MDBiZQorI2RlZmluZSBOVF9TVEFUVVNfTkVUV09SS19CVVNZIDB4QzAwMDAwMDAgfCAweDAwYmYKKyNkZWZpbmUgTlRfU1RBVFVTX0RFVklDRV9ET0VTX05PVF9FWElTVCAweEMwMDAwMDAwIHwgMHgwMGMwCisjZGVmaW5lIE5UX1NUQVRVU19UT09fTUFOWV9DT01NQU5EUyAweEMwMDAwMDAwIHwgMHgwMGMxCisjZGVmaW5lIE5UX1NUQVRVU19BREFQVEVSX0hBUkRXQVJFX0VSUk9SIDB4QzAwMDAwMDAgfCAweDAwYzIKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfTkVUV09SS19SRVNQT05TRSAweEMwMDAwMDAwIHwgMHgwMGMzCisjZGVmaW5lIE5UX1NUQVRVU19VTkVYUEVDVEVEX05FVFdPUktfRVJST1IgMHhDMDAwMDAwMCB8IDB4MDBjNAorI2RlZmluZSBOVF9TVEFUVVNfQkFEX1JFTU9URV9BREFQVEVSIDB4QzAwMDAwMDAgfCAweDAwYzUKKyNkZWZpbmUgTlRfU1RBVFVTX1BSSU5UX1FVRVVFX0ZVTEwgMHhDMDAwMDAwMCB8IDB4MDBjNgorI2RlZmluZSBOVF9TVEFUVVNfTk9fU1BPT0xfU1BBQ0UgMHhDMDAwMDAwMCB8IDB4MDBjNworI2RlZmluZSBOVF9TVEFUVVNfUFJJTlRfQ0FOQ0VMTEVEIDB4QzAwMDAwMDAgfCAweDAwYzgKKyNkZWZpbmUgTlRfU1RBVFVTX05FVFdPUktfTkFNRV9ERUxFVEVEIDB4QzAwMDAwMDAgfCAweDAwYzkKKyNkZWZpbmUgTlRfU1RBVFVTX05FVFdPUktfQUNDRVNTX0RFTklFRCAweEMwMDAwMDAwIHwgMHgwMGNhCisjZGVmaW5lIE5UX1NUQVRVU19CQURfREVWSUNFX1RZUEUgMHhDMDAwMDAwMCB8IDB4MDBjYgorI2RlZmluZSBOVF9TVEFUVVNfQkFEX05FVFdPUktfTkFNRSAweEMwMDAwMDAwIHwgMHgwMGNjCisjZGVmaW5lIE5UX1NUQVRVU19UT09fTUFOWV9OQU1FUyAweEMwMDAwMDAwIHwgMHgwMGNkCisjZGVmaW5lIE5UX1NUQVRVU19UT09fTUFOWV9TRVNTSU9OUyAweEMwMDAwMDAwIHwgMHgwMGNlCisjZGVmaW5lIE5UX1NUQVRVU19TSEFSSU5HX1BBVVNFRCAweEMwMDAwMDAwIHwgMHgwMGNmCisjZGVmaW5lIE5UX1NUQVRVU19SRVFVRVNUX05PVF9BQ0NFUFRFRCAweEMwMDAwMDAwIHwgMHgwMGQwCisjZGVmaW5lIE5UX1NUQVRVU19SRURJUkVDVE9SX1BBVVNFRCAweEMwMDAwMDAwIHwgMHgwMGQxCisjZGVmaW5lIE5UX1NUQVRVU19ORVRfV1JJVEVfRkFVTFQgMHhDMDAwMDAwMCB8IDB4MDBkMgorI2RlZmluZSBOVF9TVEFUVVNfUFJPRklMSU5HX0FUX0xJTUlUIDB4QzAwMDAwMDAgfCAweDAwZDMKKyNkZWZpbmUgTlRfU1RBVFVTX05PVF9TQU1FX0RFVklDRSAweEMwMDAwMDAwIHwgMHgwMGQ0CisjZGVmaW5lIE5UX1NUQVRVU19GSUxFX1JFTkFNRUQgMHhDMDAwMDAwMCB8IDB4MDBkNQorI2RlZmluZSBOVF9TVEFUVVNfVklSVFVBTF9DSVJDVUlUX0NMT1NFRCAweEMwMDAwMDAwIHwgMHgwMGQ2CisjZGVmaW5lIE5UX1NUQVRVU19OT19TRUNVUklUWV9PTl9PQkpFQ1QgMHhDMDAwMDAwMCB8IDB4MDBkNworI2RlZmluZSBOVF9TVEFUVVNfQ0FOVF9XQUlUIDB4QzAwMDAwMDAgfCAweDAwZDgKKyNkZWZpbmUgTlRfU1RBVFVTX1BJUEVfRU1QVFkgMHhDMDAwMDAwMCB8IDB4MDBkOQorI2RlZmluZSBOVF9TVEFUVVNfQ0FOVF9BQ0NFU1NfRE9NQUlOX0lORk8gMHhDMDAwMDAwMCB8IDB4MDBkYQorI2RlZmluZSBOVF9TVEFUVVNfQ0FOVF9URVJNSU5BVEVfU0VMRiAweEMwMDAwMDAwIHwgMHgwMGRiCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1NFUlZFUl9TVEFURSAweEMwMDAwMDAwIHwgMHgwMGRjCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0RPTUFJTl9TVEFURSAweEMwMDAwMDAwIHwgMHgwMGRkCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0RPTUFJTl9ST0xFIDB4QzAwMDAwMDAgfCAweDAwZGUKKyNkZWZpbmUgTlRfU1RBVFVTX05PX1NVQ0hfRE9NQUlOIDB4QzAwMDAwMDAgfCAweDAwZGYKKyNkZWZpbmUgTlRfU1RBVFVTX0RPTUFJTl9FWElTVFMgMHhDMDAwMDAwMCB8IDB4MDBlMAorI2RlZmluZSBOVF9TVEFUVVNfRE9NQUlOX0xJTUlUX0VYQ0VFREVEIDB4QzAwMDAwMDAgfCAweDAwZTEKKyNkZWZpbmUgTlRfU1RBVFVTX09QTE9DS19OT1RfR1JBTlRFRCAweEMwMDAwMDAwIHwgMHgwMGUyCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX09QTE9DS19QUk9UT0NPTCAweEMwMDAwMDAwIHwgMHgwMGUzCisjZGVmaW5lIE5UX1NUQVRVU19JTlRFUk5BTF9EQl9DT1JSVVBUSU9OIDB4QzAwMDAwMDAgfCAweDAwZTQKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVEVSTkFMX0VSUk9SIDB4QzAwMDAwMDAgfCAweDAwZTUKKyNkZWZpbmUgTlRfU1RBVFVTX0dFTkVSSUNfTk9UX01BUFBFRCAweEMwMDAwMDAwIHwgMHgwMGU2CisjZGVmaW5lIE5UX1NUQVRVU19CQURfREVTQ1JJUFRPUl9GT1JNQVQgMHhDMDAwMDAwMCB8IDB4MDBlNworI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9VU0VSX0JVRkZFUiAweEMwMDAwMDAwIHwgMHgwMGU4CisjZGVmaW5lIE5UX1NUQVRVU19VTkVYUEVDVEVEX0lPX0VSUk9SIDB4QzAwMDAwMDAgfCAweDAwZTkKKyNkZWZpbmUgTlRfU1RBVFVTX1VORVhQRUNURURfTU1fQ1JFQVRFX0VSUiAweEMwMDAwMDAwIHwgMHgwMGVhCisjZGVmaW5lIE5UX1NUQVRVU19VTkVYUEVDVEVEX01NX01BUF9FUlJPUiAweEMwMDAwMDAwIHwgMHgwMGViCisjZGVmaW5lIE5UX1NUQVRVU19VTkVYUEVDVEVEX01NX0VYVEVORF9FUlIgMHhDMDAwMDAwMCB8IDB4MDBlYworI2RlZmluZSBOVF9TVEFUVVNfTk9UX0xPR09OX1BST0NFU1MgMHhDMDAwMDAwMCB8IDB4MDBlZAorI2RlZmluZSBOVF9TVEFUVVNfTE9HT05fU0VTU0lPTl9FWElTVFMgMHhDMDAwMDAwMCB8IDB4MDBlZQorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMSAweEMwMDAwMDAwIHwgMHgwMGVmCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl8yIDB4QzAwMDAwMDAgfCAweDAwZjAKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzMgMHhDMDAwMDAwMCB8IDB4MDBmMQorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfNCAweEMwMDAwMDAwIHwgMHgwMGYyCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl81IDB4QzAwMDAwMDAgfCAweDAwZjMKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzYgMHhDMDAwMDAwMCB8IDB4MDBmNAorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfNyAweEMwMDAwMDAwIHwgMHgwMGY1CisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl84IDB4QzAwMDAwMDAgfCAweDAwZjYKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzkgMHhDMDAwMDAwMCB8IDB4MDBmNworI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMTAgMHhDMDAwMDAwMCB8IDB4MDBmOAorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMTEgMHhDMDAwMDAwMCB8IDB4MDBmOQorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMTIgMHhDMDAwMDAwMCB8IDB4MDBmYQorI2RlZmluZSBOVF9TVEFUVVNfUkVESVJFQ1RPUl9OT1RfU1RBUlRFRCAweEMwMDAwMDAwIHwgMHgwMGZiCisjZGVmaW5lIE5UX1NUQVRVU19SRURJUkVDVE9SX1NUQVJURUQgMHhDMDAwMDAwMCB8IDB4MDBmYworI2RlZmluZSBOVF9TVEFUVVNfU1RBQ0tfT1ZFUkZMT1cgMHhDMDAwMDAwMCB8IDB4MDBmZAorI2RlZmluZSBOVF9TVEFUVVNfTk9fU1VDSF9QQUNLQUdFIDB4QzAwMDAwMDAgfCAweDAwZmUKKyNkZWZpbmUgTlRfU1RBVFVTX0JBRF9GVU5DVElPTl9UQUJMRSAweEMwMDAwMDAwIHwgMHgwMGZmCisjZGVmaW5lIE5UX1NUQVRVU19ESVJFQ1RPUllfTk9UX0VNUFRZIDB4QzAwMDAwMDAgfCAweDAxMDEKKyNkZWZpbmUgTlRfU1RBVFVTX0ZJTEVfQ09SUlVQVF9FUlJPUiAweEMwMDAwMDAwIHwgMHgwMTAyCisjZGVmaW5lIE5UX1NUQVRVU19OT1RfQV9ESVJFQ1RPUlkgMHhDMDAwMDAwMCB8IDB4MDEwMworI2RlZmluZSBOVF9TVEFUVVNfQkFEX0xPR09OX1NFU1NJT05fU1RBVEUgMHhDMDAwMDAwMCB8IDB4MDEwNAorI2RlZmluZSBOVF9TVEFUVVNfTE9HT05fU0VTU0lPTl9DT0xMSVNJT04gMHhDMDAwMDAwMCB8IDB4MDEwNQorI2RlZmluZSBOVF9TVEFUVVNfTkFNRV9UT09fTE9ORyAweEMwMDAwMDAwIHwgMHgwMTA2CisjZGVmaW5lIE5UX1NUQVRVU19GSUxFU19PUEVOIDB4QzAwMDAwMDAgfCAweDAxMDcKKyNkZWZpbmUgTlRfU1RBVFVTX0NPTk5FQ1RJT05fSU5fVVNFIDB4QzAwMDAwMDAgfCAweDAxMDgKKyNkZWZpbmUgTlRfU1RBVFVTX01FU1NBR0VfTk9UX0ZPVU5EIDB4QzAwMDAwMDAgfCAweDAxMDkKKyNkZWZpbmUgTlRfU1RBVFVTX1BST0NFU1NfSVNfVEVSTUlOQVRJTkcgMHhDMDAwMDAwMCB8IDB4MDEwYQorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9MT0dPTl9UWVBFIDB4QzAwMDAwMDAgfCAweDAxMGIKKyNkZWZpbmUgTlRfU1RBVFVTX05PX0dVSURfVFJBTlNMQVRJT04gMHhDMDAwMDAwMCB8IDB4MDEwYworI2RlZmluZSBOVF9TVEFUVVNfQ0FOTk9UX0lNUEVSU09OQVRFIDB4QzAwMDAwMDAgfCAweDAxMGQKKyNkZWZpbmUgTlRfU1RBVFVTX0lNQUdFX0FMUkVBRFlfTE9BREVEIDB4QzAwMDAwMDAgfCAweDAxMGUKKyNkZWZpbmUgTlRfU1RBVFVTX0FCSU9TX05PVF9QUkVTRU5UIDB4QzAwMDAwMDAgfCAweDAxMGYKKyNkZWZpbmUgTlRfU1RBVFVTX0FCSU9TX0xJRF9OT1RfRVhJU1QgMHhDMDAwMDAwMCB8IDB4MDExMAorI2RlZmluZSBOVF9TVEFUVVNfQUJJT1NfTElEX0FMUkVBRFlfT1dORUQgMHhDMDAwMDAwMCB8IDB4MDExMQorI2RlZmluZSBOVF9TVEFUVVNfQUJJT1NfTk9UX0xJRF9PV05FUiAweEMwMDAwMDAwIHwgMHgwMTEyCisjZGVmaW5lIE5UX1NUQVRVU19BQklPU19JTlZBTElEX0NPTU1BTkQgMHhDMDAwMDAwMCB8IDB4MDExMworI2RlZmluZSBOVF9TVEFUVVNfQUJJT1NfSU5WQUxJRF9MSUQgMHhDMDAwMDAwMCB8IDB4MDExNAorI2RlZmluZSBOVF9TVEFUVVNfQUJJT1NfU0VMRUNUT1JfTk9UX0FWQUlMQUJMRSAweEMwMDAwMDAwIHwgMHgwMTE1CisjZGVmaW5lIE5UX1NUQVRVU19BQklPU19JTlZBTElEX1NFTEVDVE9SIDB4QzAwMDAwMDAgfCAweDAxMTYKKyNkZWZpbmUgTlRfU1RBVFVTX05PX0xEVCAweEMwMDAwMDAwIHwgMHgwMTE3CisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0xEVF9TSVpFIDB4QzAwMDAwMDAgfCAweDAxMTgKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfTERUX09GRlNFVCAweEMwMDAwMDAwIHwgMHgwMTE5CisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0xEVF9ERVNDUklQVE9SIDB4QzAwMDAwMDAgfCAweDAxMWEKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfSU1BR0VfTkVfRk9STUFUIDB4QzAwMDAwMDAgfCAweDAxMWIKKyNkZWZpbmUgTlRfU1RBVFVTX1JYQUNUX0lOVkFMSURfU1RBVEUgMHhDMDAwMDAwMCB8IDB4MDExYworI2RlZmluZSBOVF9TVEFUVVNfUlhBQ1RfQ09NTUlUX0ZBSUxVUkUgMHhDMDAwMDAwMCB8IDB4MDExZAorI2RlZmluZSBOVF9TVEFUVVNfTUFQUEVEX0ZJTEVfU0laRV9aRVJPIDB4QzAwMDAwMDAgfCAweDAxMWUKKyNkZWZpbmUgTlRfU1RBVFVTX1RPT19NQU5ZX09QRU5FRF9GSUxFUyAweEMwMDAwMDAwIHwgMHgwMTFmCisjZGVmaW5lIE5UX1NUQVRVU19DQU5DRUxMRUQgMHhDMDAwMDAwMCB8IDB4MDEyMAorI2RlZmluZSBOVF9TVEFUVVNfQ0FOTk9UX0RFTEVURSAweEMwMDAwMDAwIHwgMHgwMTIxCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0NPTVBVVEVSX05BTUUgMHhDMDAwMDAwMCB8IDB4MDEyMgorI2RlZmluZSBOVF9TVEFUVVNfRklMRV9ERUxFVEVEIDB4QzAwMDAwMDAgfCAweDAxMjMKKyNkZWZpbmUgTlRfU1RBVFVTX1NQRUNJQUxfQUNDT1VOVCAweEMwMDAwMDAwIHwgMHgwMTI0CisjZGVmaW5lIE5UX1NUQVRVU19TUEVDSUFMX0dST1VQIDB4QzAwMDAwMDAgfCAweDAxMjUKKyNkZWZpbmUgTlRfU1RBVFVTX1NQRUNJQUxfVVNFUiAweEMwMDAwMDAwIHwgMHgwMTI2CisjZGVmaW5lIE5UX1NUQVRVU19NRU1CRVJTX1BSSU1BUllfR1JPVVAgMHhDMDAwMDAwMCB8IDB4MDEyNworI2RlZmluZSBOVF9TVEFUVVNfRklMRV9DTE9TRUQgMHhDMDAwMDAwMCB8IDB4MDEyOAorI2RlZmluZSBOVF9TVEFUVVNfVE9PX01BTllfVEhSRUFEUyAweEMwMDAwMDAwIHwgMHgwMTI5CisjZGVmaW5lIE5UX1NUQVRVU19USFJFQURfTk9UX0lOX1BST0NFU1MgMHhDMDAwMDAwMCB8IDB4MDEyYQorI2RlZmluZSBOVF9TVEFUVVNfVE9LRU5fQUxSRUFEWV9JTl9VU0UgMHhDMDAwMDAwMCB8IDB4MDEyYgorI2RlZmluZSBOVF9TVEFUVVNfUEFHRUZJTEVfUVVPVEFfRVhDRUVERUQgMHhDMDAwMDAwMCB8IDB4MDEyYworI2RlZmluZSBOVF9TVEFUVVNfQ09NTUlUTUVOVF9MSU1JVCAweEMwMDAwMDAwIHwgMHgwMTJkCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0lNQUdFX0xFX0ZPUk1BVCAweEMwMDAwMDAwIHwgMHgwMTJlCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0lNQUdFX05PVF9NWiAweEMwMDAwMDAwIHwgMHgwMTJmCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0lNQUdFX1BST1RFQ1QgMHhDMDAwMDAwMCB8IDB4MDEzMAorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9JTUFHRV9XSU5fMTYgMHhDMDAwMDAwMCB8IDB4MDEzMQorI2RlZmluZSBOVF9TVEFUVVNfTE9HT05fU0VSVkVSX0NPTkZMSUNUIDB4QzAwMDAwMDAgfCAweDAxMzIKKyNkZWZpbmUgTlRfU1RBVFVTX1RJTUVfRElGRkVSRU5DRV9BVF9EQyAweEMwMDAwMDAwIHwgMHgwMTMzCisjZGVmaW5lIE5UX1NUQVRVU19TWU5DSFJPTklaQVRJT05fUkVRVUlSRUQgMHhDMDAwMDAwMCB8IDB4MDEzNAorI2RlZmluZSBOVF9TVEFUVVNfRExMX05PVF9GT1VORCAweEMwMDAwMDAwIHwgMHgwMTM1CisjZGVmaW5lIE5UX1NUQVRVU19PUEVOX0ZBSUxFRCAweEMwMDAwMDAwIHwgMHgwMTM2CisjZGVmaW5lIE5UX1NUQVRVU19JT19QUklWSUxFR0VfRkFJTEVEIDB4QzAwMDAwMDAgfCAweDAxMzcKKyNkZWZpbmUgTlRfU1RBVFVTX09SRElOQUxfTk9UX0ZPVU5EIDB4QzAwMDAwMDAgfCAweDAxMzgKKyNkZWZpbmUgTlRfU1RBVFVTX0VOVFJZUE9JTlRfTk9UX0ZPVU5EIDB4QzAwMDAwMDAgfCAweDAxMzkKKyNkZWZpbmUgTlRfU1RBVFVTX0NPTlRST0xfQ19FWElUIDB4QzAwMDAwMDAgfCAweDAxM2EKKyNkZWZpbmUgTlRfU1RBVFVTX0xPQ0FMX0RJU0NPTk5FQ1QgMHhDMDAwMDAwMCB8IDB4MDEzYgorI2RlZmluZSBOVF9TVEFUVVNfUkVNT1RFX0RJU0NPTk5FQ1QgMHhDMDAwMDAwMCB8IDB4MDEzYworI2RlZmluZSBOVF9TVEFUVVNfUkVNT1RFX1JFU09VUkNFUyAweEMwMDAwMDAwIHwgMHgwMTNkCisjZGVmaW5lIE5UX1NUQVRVU19MSU5LX0ZBSUxFRCAweEMwMDAwMDAwIHwgMHgwMTNlCisjZGVmaW5lIE5UX1NUQVRVU19MSU5LX1RJTUVPVVQgMHhDMDAwMDAwMCB8IDB4MDEzZgorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9DT05ORUNUSU9OIDB4QzAwMDAwMDAgfCAweDAxNDAKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfQUREUkVTUyAweEMwMDAwMDAwIHwgMHgwMTQxCisjZGVmaW5lIE5UX1NUQVRVU19ETExfSU5JVF9GQUlMRUQgMHhDMDAwMDAwMCB8IDB4MDE0MgorI2RlZmluZSBOVF9TVEFUVVNfTUlTU0lOR19TWVNURU1GSUxFIDB4QzAwMDAwMDAgfCAweDAxNDMKKyNkZWZpbmUgTlRfU1RBVFVTX1VOSEFORExFRF9FWENFUFRJT04gMHhDMDAwMDAwMCB8IDB4MDE0NAorI2RlZmluZSBOVF9TVEFUVVNfQVBQX0lOSVRfRkFJTFVSRSAweEMwMDAwMDAwIHwgMHgwMTQ1CisjZGVmaW5lIE5UX1NUQVRVU19QQUdFRklMRV9DUkVBVEVfRkFJTEVEIDB4QzAwMDAwMDAgfCAweDAxNDYKKyNkZWZpbmUgTlRfU1RBVFVTX05PX1BBR0VGSUxFIDB4QzAwMDAwMDAgfCAweDAxNDcKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfTEVWRUwgMHhDMDAwMDAwMCB8IDB4MDE0OAorI2RlZmluZSBOVF9TVEFUVVNfV1JPTkdfUEFTU1dPUkRfQ09SRSAweEMwMDAwMDAwIHwgMHgwMTQ5CisjZGVmaW5lIE5UX1NUQVRVU19JTExFR0FMX0ZMT0FUX0NPTlRFWFQgMHhDMDAwMDAwMCB8IDB4MDE0YQorI2RlZmluZSBOVF9TVEFUVVNfUElQRV9CUk9LRU4gMHhDMDAwMDAwMCB8IDB4MDE0YgorI2RlZmluZSBOVF9TVEFUVVNfUkVHSVNUUllfQ09SUlVQVCAweEMwMDAwMDAwIHwgMHgwMTRjCisjZGVmaW5lIE5UX1NUQVRVU19SRUdJU1RSWV9JT19GQUlMRUQgMHhDMDAwMDAwMCB8IDB4MDE0ZAorI2RlZmluZSBOVF9TVEFUVVNfTk9fRVZFTlRfUEFJUiAweEMwMDAwMDAwIHwgMHgwMTRlCisjZGVmaW5lIE5UX1NUQVRVU19VTlJFQ09HTklaRURfVk9MVU1FIDB4QzAwMDAwMDAgfCAweDAxNGYKKyNkZWZpbmUgTlRfU1RBVFVTX1NFUklBTF9OT19ERVZJQ0VfSU5JVEVEIDB4QzAwMDAwMDAgfCAweDAxNTAKKyNkZWZpbmUgTlRfU1RBVFVTX05PX1NVQ0hfQUxJQVMgMHhDMDAwMDAwMCB8IDB4MDE1MQorI2RlZmluZSBOVF9TVEFUVVNfTUVNQkVSX05PVF9JTl9BTElBUyAweEMwMDAwMDAwIHwgMHgwMTUyCisjZGVmaW5lIE5UX1NUQVRVU19NRU1CRVJfSU5fQUxJQVMgMHhDMDAwMDAwMCB8IDB4MDE1MworI2RlZmluZSBOVF9TVEFUVVNfQUxJQVNfRVhJU1RTIDB4QzAwMDAwMDAgfCAweDAxNTQKKyNkZWZpbmUgTlRfU1RBVFVTX0xPR09OX05PVF9HUkFOVEVEIDB4QzAwMDAwMDAgfCAweDAxNTUKKyNkZWZpbmUgTlRfU1RBVFVTX1RPT19NQU5ZX1NFQ1JFVFMgMHhDMDAwMDAwMCB8IDB4MDE1NgorI2RlZmluZSBOVF9TVEFUVVNfU0VDUkVUX1RPT19MT05HIDB4QzAwMDAwMDAgfCAweDAxNTcKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVEVSTkFMX0RCX0VSUk9SIDB4QzAwMDAwMDAgfCAweDAxNTgKKyNkZWZpbmUgTlRfU1RBVFVTX0ZVTExTQ1JFRU5fTU9ERSAweEMwMDAwMDAwIHwgMHgwMTU5CisjZGVmaW5lIE5UX1NUQVRVU19UT09fTUFOWV9DT05URVhUX0lEUyAweEMwMDAwMDAwIHwgMHgwMTVhCisjZGVmaW5lIE5UX1NUQVRVU19MT0dPTl9UWVBFX05PVF9HUkFOVEVEIDB4QzAwMDAwMDAgfCAweDAxNWIKKyNkZWZpbmUgTlRfU1RBVFVTX05PVF9SRUdJU1RSWV9GSUxFIDB4QzAwMDAwMDAgfCAweDAxNWMKKyNkZWZpbmUgTlRfU1RBVFVTX05UX0NST1NTX0VOQ1JZUFRJT05fUkVRVUlSRUQgMHhDMDAwMDAwMCB8IDB4MDE1ZAorI2RlZmluZSBOVF9TVEFUVVNfRE9NQUlOX0NUUkxSX0NPTkZJR19FUlJPUiAweEMwMDAwMDAwIHwgMHgwMTVlCisjZGVmaW5lIE5UX1NUQVRVU19GVF9NSVNTSU5HX01FTUJFUiAweEMwMDAwMDAwIHwgMHgwMTVmCisjZGVmaW5lIE5UX1NUQVRVU19JTExfRk9STUVEX1NFUlZJQ0VfRU5UUlkgMHhDMDAwMDAwMCB8IDB4MDE2MAorI2RlZmluZSBOVF9TVEFUVVNfSUxMRUdBTF9DSEFSQUNURVIgMHhDMDAwMDAwMCB8IDB4MDE2MQorI2RlZmluZSBOVF9TVEFUVVNfVU5NQVBQQUJMRV9DSEFSQUNURVIgMHhDMDAwMDAwMCB8IDB4MDE2MgorI2RlZmluZSBOVF9TVEFUVVNfVU5ERUZJTkVEX0NIQVJBQ1RFUiAweEMwMDAwMDAwIHwgMHgwMTYzCisjZGVmaW5lIE5UX1NUQVRVU19GTE9QUFlfVk9MVU1FIDB4QzAwMDAwMDAgfCAweDAxNjQKKyNkZWZpbmUgTlRfU1RBVFVTX0ZMT1BQWV9JRF9NQVJLX05PVF9GT1VORCAweEMwMDAwMDAwIHwgMHgwMTY1CisjZGVmaW5lIE5UX1NUQVRVU19GTE9QUFlfV1JPTkdfQ1lMSU5ERVIgMHhDMDAwMDAwMCB8IDB4MDE2NgorI2RlZmluZSBOVF9TVEFUVVNfRkxPUFBZX1VOS05PV05fRVJST1IgMHhDMDAwMDAwMCB8IDB4MDE2NworI2RlZmluZSBOVF9TVEFUVVNfRkxPUFBZX0JBRF9SRUdJU1RFUlMgMHhDMDAwMDAwMCB8IDB4MDE2OAorI2RlZmluZSBOVF9TVEFUVVNfRElTS19SRUNBTElCUkFURV9GQUlMRUQgMHhDMDAwMDAwMCB8IDB4MDE2OQorI2RlZmluZSBOVF9TVEFUVVNfRElTS19PUEVSQVRJT05fRkFJTEVEIDB4QzAwMDAwMDAgfCAweDAxNmEKKyNkZWZpbmUgTlRfU1RBVFVTX0RJU0tfUkVTRVRfRkFJTEVEIDB4QzAwMDAwMDAgfCAweDAxNmIKKyNkZWZpbmUgTlRfU1RBVFVTX1NIQVJFRF9JUlFfQlVTWSAweEMwMDAwMDAwIHwgMHgwMTZjCisjZGVmaW5lIE5UX1NUQVRVU19GVF9PUlBIQU5JTkcgMHhDMDAwMDAwMCB8IDB4MDE2ZAorI2RlZmluZSBOVF9TVEFUVVNfUEFSVElUSU9OX0ZBSUxVUkUgMHhDMDAwMDAwMCB8IDB4MDE3MgorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9CTE9DS19MRU5HVEggMHhDMDAwMDAwMCB8IDB4MDE3MworI2RlZmluZSBOVF9TVEFUVVNfREVWSUNFX05PVF9QQVJUSVRJT05FRCAweEMwMDAwMDAwIHwgMHgwMTc0CisjZGVmaW5lIE5UX1NUQVRVU19VTkFCTEVfVE9fTE9DS19NRURJQSAweEMwMDAwMDAwIHwgMHgwMTc1CisjZGVmaW5lIE5UX1NUQVRVU19VTkFCTEVfVE9fVU5MT0FEX01FRElBIDB4QzAwMDAwMDAgfCAweDAxNzYKKyNkZWZpbmUgTlRfU1RBVFVTX0VPTV9PVkVSRkxPVyAweEMwMDAwMDAwIHwgMHgwMTc3CisjZGVmaW5lIE5UX1NUQVRVU19OT19NRURJQSAweEMwMDAwMDAwIHwgMHgwMTc4CisjZGVmaW5lIE5UX1NUQVRVU19OT19TVUNIX01FTUJFUiAweEMwMDAwMDAwIHwgMHgwMTdhCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX01FTUJFUiAweEMwMDAwMDAwIHwgMHgwMTdiCisjZGVmaW5lIE5UX1NUQVRVU19LRVlfREVMRVRFRCAweEMwMDAwMDAwIHwgMHgwMTdjCisjZGVmaW5lIE5UX1NUQVRVU19OT19MT0dfU1BBQ0UgMHhDMDAwMDAwMCB8IDB4MDE3ZAorI2RlZmluZSBOVF9TVEFUVVNfVE9PX01BTllfU0lEUyAweEMwMDAwMDAwIHwgMHgwMTdlCisjZGVmaW5lIE5UX1NUQVRVU19MTV9DUk9TU19FTkNSWVBUSU9OX1JFUVVJUkVEIDB4QzAwMDAwMDAgfCAweDAxN2YKKyNkZWZpbmUgTlRfU1RBVFVTX0tFWV9IQVNfQ0hJTERSRU4gMHhDMDAwMDAwMCB8IDB4MDE4MAorI2RlZmluZSBOVF9TVEFUVVNfQ0hJTERfTVVTVF9CRV9WT0xBVElMRSAweEMwMDAwMDAwIHwgMHgwMTgxCisjZGVmaW5lIE5UX1NUQVRVU19ERVZJQ0VfQ09ORklHVVJBVElPTl9FUlJPUiAweEMwMDAwMDAwIHwgMHgwMTgyCisjZGVmaW5lIE5UX1NUQVRVU19EUklWRVJfSU5URVJOQUxfRVJST1IgMHhDMDAwMDAwMCB8IDB4MDE4MworI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9ERVZJQ0VfU1RBVEUgMHhDMDAwMDAwMCB8IDB4MDE4NAorI2RlZmluZSBOVF9TVEFUVVNfSU9fREVWSUNFX0VSUk9SIDB4QzAwMDAwMDAgfCAweDAxODUKKyNkZWZpbmUgTlRfU1RBVFVTX0RFVklDRV9QUk9UT0NPTF9FUlJPUiAweEMwMDAwMDAwIHwgMHgwMTg2CisjZGVmaW5lIE5UX1NUQVRVU19CQUNLVVBfQ09OVFJPTExFUiAweEMwMDAwMDAwIHwgMHgwMTg3CisjZGVmaW5lIE5UX1NUQVRVU19MT0dfRklMRV9GVUxMIDB4QzAwMDAwMDAgfCAweDAxODgKKyNkZWZpbmUgTlRfU1RBVFVTX1RPT19MQVRFIDB4QzAwMDAwMDAgfCAweDAxODkKKyNkZWZpbmUgTlRfU1RBVFVTX05PX1RSVVNUX0xTQV9TRUNSRVQgMHhDMDAwMDAwMCB8IDB4MDE4YQorI2RlZmluZSBOVF9TVEFUVVNfTk9fVFJVU1RfU0FNX0FDQ09VTlQgMHhDMDAwMDAwMCB8IDB4MDE4YgorI2RlZmluZSBOVF9TVEFUVVNfVFJVU1RFRF9ET01BSU5fRkFJTFVSRSAweEMwMDAwMDAwIHwgMHgwMThjCisjZGVmaW5lIE5UX1NUQVRVU19UUlVTVEVEX1JFTEFUSU9OU0hJUF9GQUlMVVJFIDB4QzAwMDAwMDAgfCAweDAxOGQKKyNkZWZpbmUgTlRfU1RBVFVTX0VWRU5UTE9HX0ZJTEVfQ09SUlVQVCAweEMwMDAwMDAwIHwgMHgwMThlCisjZGVmaW5lIE5UX1NUQVRVU19FVkVOVExPR19DQU5UX1NUQVJUIDB4QzAwMDAwMDAgfCAweDAxOGYKKyNkZWZpbmUgTlRfU1RBVFVTX1RSVVNUX0ZBSUxVUkUgMHhDMDAwMDAwMCB8IDB4MDE5MAorI2RlZmluZSBOVF9TVEFUVVNfTVVUQU5UX0xJTUlUX0VYQ0VFREVEIDB4QzAwMDAwMDAgfCAweDAxOTEKKyNkZWZpbmUgTlRfU1RBVFVTX05FVExPR09OX05PVF9TVEFSVEVEIDB4QzAwMDAwMDAgfCAweDAxOTIKKyNkZWZpbmUgTlRfU1RBVFVTX0FDQ09VTlRfRVhQSVJFRCAweEMwMDAwMDAwIHwgMHgwMTkzCisjZGVmaW5lIE5UX1NUQVRVU19QT1NTSUJMRV9ERUFETE9DSyAweEMwMDAwMDAwIHwgMHgwMTk0CisjZGVmaW5lIE5UX1NUQVRVU19ORVRXT1JLX0NSRURFTlRJQUxfQ09ORkxJQ1QgMHhDMDAwMDAwMCB8IDB4MDE5NQorI2RlZmluZSBOVF9TVEFUVVNfUkVNT1RFX1NFU1NJT05fTElNSVQgMHhDMDAwMDAwMCB8IDB4MDE5NgorI2RlZmluZSBOVF9TVEFUVVNfRVZFTlRMT0dfRklMRV9DSEFOR0VEIDB4QzAwMDAwMDAgfCAweDAxOTcKKyNkZWZpbmUgTlRfU1RBVFVTX05PTE9HT05fSU5URVJET01BSU5fVFJVU1RfQUNDT1VOVCAweEMwMDAwMDAwIHwgMHgwMTk4CisjZGVmaW5lIE5UX1NUQVRVU19OT0xPR09OX1dPUktTVEFUSU9OX1RSVVNUX0FDQ09VTlQgMHhDMDAwMDAwMCB8IDB4MDE5OQorI2RlZmluZSBOVF9TVEFUVVNfTk9MT0dPTl9TRVJWRVJfVFJVU1RfQUNDT1VOVCAweEMwMDAwMDAwIHwgMHgwMTlhCisjZGVmaW5lIE5UX1NUQVRVU19ET01BSU5fVFJVU1RfSU5DT05TSVNURU5UIDB4QzAwMDAwMDAgfCAweDAxOWIKKyNkZWZpbmUgTlRfU1RBVFVTX0ZTX0RSSVZFUl9SRVFVSVJFRCAweEMwMDAwMDAwIHwgMHgwMTljCisjZGVmaW5lIE5UX1NUQVRVU19OT19VU0VSX1NFU1NJT05fS0VZIDB4QzAwMDAwMDAgfCAweDAyMDIKKyNkZWZpbmUgTlRfU1RBVFVTX1VTRVJfU0VTU0lPTl9ERUxFVEVEIDB4QzAwMDAwMDAgfCAweDAyMDMKKyNkZWZpbmUgTlRfU1RBVFVTX1JFU09VUkNFX0xBTkdfTk9UX0ZPVU5EIDB4QzAwMDAwMDAgfCAweDAyMDQKKyNkZWZpbmUgTlRfU1RBVFVTX0lOU1VGRl9TRVJWRVJfUkVTT1VSQ0VTIDB4QzAwMDAwMDAgfCAweDAyMDUKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfQlVGRkVSX1NJWkUgMHhDMDAwMDAwMCB8IDB4MDIwNgorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9BRERSRVNTX0NPTVBPTkVOVCAweEMwMDAwMDAwIHwgMHgwMjA3CisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0FERFJFU1NfV0lMRENBUkQgMHhDMDAwMDAwMCB8IDB4MDIwOAorI2RlZmluZSBOVF9TVEFUVVNfVE9PX01BTllfQUREUkVTU0VTIDB4QzAwMDAwMDAgfCAweDAyMDkKKyNkZWZpbmUgTlRfU1RBVFVTX0FERFJFU1NfQUxSRUFEWV9FWElTVFMgMHhDMDAwMDAwMCB8IDB4MDIwYQorI2RlZmluZSBOVF9TVEFUVVNfQUREUkVTU19DTE9TRUQgMHhDMDAwMDAwMCB8IDB4MDIwYgorI2RlZmluZSBOVF9TVEFUVVNfQ09OTkVDVElPTl9ESVNDT05ORUNURUQgMHhDMDAwMDAwMCB8IDB4MDIwYworI2RlZmluZSBOVF9TVEFUVVNfQ09OTkVDVElPTl9SRVNFVCAweEMwMDAwMDAwIHwgMHgwMjBkCisjZGVmaW5lIE5UX1NUQVRVU19UT09fTUFOWV9OT0RFUyAweEMwMDAwMDAwIHwgMHgwMjBlCisjZGVmaW5lIE5UX1NUQVRVU19UUkFOU0FDVElPTl9BQk9SVEVEIDB4QzAwMDAwMDAgfCAweDAyMGYKKyNkZWZpbmUgTlRfU1RBVFVTX1RSQU5TQUNUSU9OX1RJTUVEX09VVCAweEMwMDAwMDAwIHwgMHgwMjEwCisjZGVmaW5lIE5UX1NUQVRVU19UUkFOU0FDVElPTl9OT19SRUxFQVNFIDB4QzAwMDAwMDAgfCAweDAyMTEKKyNkZWZpbmUgTlRfU1RBVFVTX1RSQU5TQUNUSU9OX05PX01BVENIIDB4QzAwMDAwMDAgfCAweDAyMTIKKyNkZWZpbmUgTlRfU1RBVFVTX1RSQU5TQUNUSU9OX1JFU1BPTkRFRCAweEMwMDAwMDAwIHwgMHgwMjEzCisjZGVmaW5lIE5UX1NUQVRVU19UUkFOU0FDVElPTl9JTlZBTElEX0lEIDB4QzAwMDAwMDAgfCAweDAyMTQKKyNkZWZpbmUgTlRfU1RBVFVTX1RSQU5TQUNUSU9OX0lOVkFMSURfVFlQRSAweEMwMDAwMDAwIHwgMHgwMjE1CisjZGVmaW5lIE5UX1NUQVRVU19OT1RfU0VSVkVSX1NFU1NJT04gMHhDMDAwMDAwMCB8IDB4MDIxNgorI2RlZmluZSBOVF9TVEFUVVNfTk9UX0NMSUVOVF9TRVNTSU9OIDB4QzAwMDAwMDAgfCAweDAyMTcKKyNkZWZpbmUgTlRfU1RBVFVTX0NBTk5PVF9MT0FEX1JFR0lTVFJZX0ZJTEUgMHhDMDAwMDAwMCB8IDB4MDIxOAorI2RlZmluZSBOVF9TVEFUVVNfREVCVUdfQVRUQUNIX0ZBSUxFRCAweEMwMDAwMDAwIHwgMHgwMjE5CisjZGVmaW5lIE5UX1NUQVRVU19TWVNURU1fUFJPQ0VTU19URVJNSU5BVEVEIDB4QzAwMDAwMDAgfCAweDAyMWEKKyNkZWZpbmUgTlRfU1RBVFVTX0RBVEFfTk9UX0FDQ0VQVEVEIDB4QzAwMDAwMDAgfCAweDAyMWIKKyNkZWZpbmUgTlRfU1RBVFVTX05PX0JST1dTRVJfU0VSVkVSU19GT1VORCAweEMwMDAwMDAwIHwgMHgwMjFjCisjZGVmaW5lIE5UX1NUQVRVU19WRE1fSEFSRF9FUlJPUiAweEMwMDAwMDAwIHwgMHgwMjFkCisjZGVmaW5lIE5UX1NUQVRVU19EUklWRVJfQ0FOQ0VMX1RJTUVPVVQgMHhDMDAwMDAwMCB8IDB4MDIxZQorI2RlZmluZSBOVF9TVEFUVVNfUkVQTFlfTUVTU0FHRV9NSVNNQVRDSCAweEMwMDAwMDAwIHwgMHgwMjFmCisjZGVmaW5lIE5UX1NUQVRVU19NQVBQRURfQUxJR05NRU5UIDB4QzAwMDAwMDAgfCAweDAyMjAKKyNkZWZpbmUgTlRfU1RBVFVTX0lNQUdFX0NIRUNLU1VNX01JU01BVENIIDB4QzAwMDAwMDAgfCAweDAyMjEKKyNkZWZpbmUgTlRfU1RBVFVTX0xPU1RfV1JJVEVCRUhJTkRfREFUQSAweEMwMDAwMDAwIHwgMHgwMjIyCisjZGVmaW5lIE5UX1NUQVRVU19DTElFTlRfU0VSVkVSX1BBUkFNRVRFUlNfSU5WQUxJRCAweEMwMDAwMDAwIHwgMHgwMjIzCisjZGVmaW5lIE5UX1NUQVRVU19QQVNTV09SRF9NVVNUX0NIQU5HRSAweEMwMDAwMDAwIHwgMHgwMjI0CisjZGVmaW5lIE5UX1NUQVRVU19OT1RfRk9VTkQgMHhDMDAwMDAwMCB8IDB4MDIyNQorI2RlZmluZSBOVF9TVEFUVVNfTk9UX1RJTllfU1RSRUFNIDB4QzAwMDAwMDAgfCAweDAyMjYKKyNkZWZpbmUgTlRfU1RBVFVTX1JFQ09WRVJZX0ZBSUxVUkUgMHhDMDAwMDAwMCB8IDB4MDIyNworI2RlZmluZSBOVF9TVEFUVVNfU1RBQ0tfT1ZFUkZMT1dfUkVBRCAweEMwMDAwMDAwIHwgMHgwMjI4CisjZGVmaW5lIE5UX1NUQVRVU19GQUlMX0NIRUNLIDB4QzAwMDAwMDAgfCAweDAyMjkKKyNkZWZpbmUgTlRfU1RBVFVTX0RVUExJQ0FURV9PQkpFQ1RJRCAweEMwMDAwMDAwIHwgMHgwMjJhCisjZGVmaW5lIE5UX1NUQVRVU19PQkpFQ1RJRF9FWElTVFMgMHhDMDAwMDAwMCB8IDB4MDIyYgorI2RlZmluZSBOVF9TVEFUVVNfQ09OVkVSVF9UT19MQVJHRSAweEMwMDAwMDAwIHwgMHgwMjJjCisjZGVmaW5lIE5UX1NUQVRVU19SRVRSWSAweEMwMDAwMDAwIHwgMHgwMjJkCisjZGVmaW5lIE5UX1NUQVRVU19GT1VORF9PVVRfT0ZfU0NPUEUgMHhDMDAwMDAwMCB8IDB4MDIyZQorI2RlZmluZSBOVF9TVEFUVVNfQUxMT0NBVEVfQlVDS0VUIDB4QzAwMDAwMDAgfCAweDAyMmYKKyNkZWZpbmUgTlRfU1RBVFVTX1BST1BTRVRfTk9UX0ZPVU5EIDB4QzAwMDAwMDAgfCAweDAyMzAKKyNkZWZpbmUgTlRfU1RBVFVTX01BUlNIQUxMX09WRVJGTE9XIDB4QzAwMDAwMDAgfCAweDAyMzEKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfVkFSSUFOVCAweEMwMDAwMDAwIHwgMHgwMjMyCisjZGVmaW5lIE5UX1NUQVRVU19ET01BSU5fQ09OVFJPTExFUl9OT1RfRk9VTkQgMHhDMDAwMDAwMCB8IDB4MDIzMworI2RlZmluZSBOVF9TVEFUVVNfQUNDT1VOVF9MT0NLRURfT1VUIDB4QzAwMDAwMDAgfCAweDAyMzQKKyNkZWZpbmUgTlRfU1RBVFVTX0hBTkRMRV9OT1RfQ0xPU0FCTEUgMHhDMDAwMDAwMCB8IDB4MDIzNQorI2RlZmluZSBOVF9TVEFUVVNfQ09OTkVDVElPTl9SRUZVU0VEIDB4QzAwMDAwMDAgfCAweDAyMzYKKyNkZWZpbmUgTlRfU1RBVFVTX0dSQUNFRlVMX0RJU0NPTk5FQ1QgMHhDMDAwMDAwMCB8IDB4MDIzNworI2RlZmluZSBOVF9TVEFUVVNfQUREUkVTU19BTFJFQURZX0FTU09DSUFURUQgMHhDMDAwMDAwMCB8IDB4MDIzOAorI2RlZmluZSBOVF9TVEFUVVNfQUREUkVTU19OT1RfQVNTT0NJQVRFRCAweEMwMDAwMDAwIHwgMHgwMjM5CisjZGVmaW5lIE5UX1NUQVRVU19DT05ORUNUSU9OX0lOVkFMSUQgMHhDMDAwMDAwMCB8IDB4MDIzYQorI2RlZmluZSBOVF9TVEFUVVNfQ09OTkVDVElPTl9BQ1RJVkUgMHhDMDAwMDAwMCB8IDB4MDIzYgorI2RlZmluZSBOVF9TVEFUVVNfTkVUV09SS19VTlJFQUNIQUJMRSAweEMwMDAwMDAwIHwgMHgwMjNjCisjZGVmaW5lIE5UX1NUQVRVU19IT1NUX1VOUkVBQ0hBQkxFIDB4QzAwMDAwMDAgfCAweDAyM2QKKyNkZWZpbmUgTlRfU1RBVFVTX1BST1RPQ09MX1VOUkVBQ0hBQkxFIDB4QzAwMDAwMDAgfCAweDAyM2UKKyNkZWZpbmUgTlRfU1RBVFVTX1BPUlRfVU5SRUFDSEFCTEUgMHhDMDAwMDAwMCB8IDB4MDIzZgorI2RlZmluZSBOVF9TVEFUVVNfUkVRVUVTVF9BQk9SVEVEIDB4QzAwMDAwMDAgfCAweDAyNDAKKyNkZWZpbmUgTlRfU1RBVFVTX0NPTk5FQ1RJT05fQUJPUlRFRCAweEMwMDAwMDAwIHwgMHgwMjQxCisjZGVmaW5lIE5UX1NUQVRVU19CQURfQ09NUFJFU1NJT05fQlVGRkVSIDB4QzAwMDAwMDAgfCAweDAyNDIKKyNkZWZpbmUgTlRfU1RBVFVTX1VTRVJfTUFQUEVEX0ZJTEUgMHhDMDAwMDAwMCB8IDB4MDI0MworI2RlZmluZSBOVF9TVEFUVVNfQVVESVRfRkFJTEVEIDB4QzAwMDAwMDAgfCAweDAyNDQKKyNkZWZpbmUgTlRfU1RBVFVTX1RJTUVSX1JFU09MVVRJT05fTk9UX1NFVCAweEMwMDAwMDAwIHwgMHgwMjQ1CisjZGVmaW5lIE5UX1NUQVRVU19DT05ORUNUSU9OX0NPVU5UX0xJTUlUIDB4QzAwMDAwMDAgfCAweDAyNDYKKyNkZWZpbmUgTlRfU1RBVFVTX0xPR0lOX1RJTUVfUkVTVFJJQ1RJT04gMHhDMDAwMDAwMCB8IDB4MDI0NworI2RlZmluZSBOVF9TVEFUVVNfTE9HSU5fV0tTVEFfUkVTVFJJQ1RJT04gMHhDMDAwMDAwMCB8IDB4MDI0OAorI2RlZmluZSBOVF9TVEFUVVNfSU1BR0VfTVBfVVBfTUlTTUFUQ0ggMHhDMDAwMDAwMCB8IDB4MDI0OQorI2RlZmluZSBOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0xPR09OX0lORk8gMHhDMDAwMDAwMCB8IDB4MDI1MAorI2RlZmluZSBOVF9TVEFUVVNfQkFEX0RMTF9FTlRSWVBPSU5UIDB4QzAwMDAwMDAgfCAweDAyNTEKKyNkZWZpbmUgTlRfU1RBVFVTX0JBRF9TRVJWSUNFX0VOVFJZUE9JTlQgMHhDMDAwMDAwMCB8IDB4MDI1MgorI2RlZmluZSBOVF9TVEFUVVNfTFBDX1JFUExZX0xPU1QgMHhDMDAwMDAwMCB8IDB4MDI1MworI2RlZmluZSBOVF9TVEFUVVNfSVBfQUREUkVTU19DT05GTElDVDEgMHhDMDAwMDAwMCB8IDB4MDI1NAorI2RlZmluZSBOVF9TVEFUVVNfSVBfQUREUkVTU19DT05GTElDVDIgMHhDMDAwMDAwMCB8IDB4MDI1NQorI2RlZmluZSBOVF9TVEFUVVNfUkVHSVNUUllfUVVPVEFfTElNSVQgMHhDMDAwMDAwMCB8IDB4MDI1NgorI2RlZmluZSBOVF9TVEFUVVNfUEFUSF9OT1RfQ09WRVJFRCAweEMwMDAwMDAwIHwgMHgwMjU3CisjZGVmaW5lIE5UX1NUQVRVU19OT19DQUxMQkFDS19BQ1RJVkUgMHhDMDAwMDAwMCB8IDB4MDI1OAorI2RlZmluZSBOVF9TVEFUVVNfTElDRU5TRV9RVU9UQV9FWENFRURFRCAweEMwMDAwMDAwIHwgMHgwMjU5CisjZGVmaW5lIE5UX1NUQVRVU19QV0RfVE9PX1NIT1JUIDB4QzAwMDAwMDAgfCAweDAyNWEKKyNkZWZpbmUgTlRfU1RBVFVTX1BXRF9UT09fUkVDRU5UIDB4QzAwMDAwMDAgfCAweDAyNWIKKyNkZWZpbmUgTlRfU1RBVFVTX1BXRF9ISVNUT1JZX0NPTkZMSUNUIDB4QzAwMDAwMDAgfCAweDAyNWMKKyNkZWZpbmUgTlRfU1RBVFVTX1BMVUdQTEFZX05PX0RFVklDRSAweEMwMDAwMDAwIHwgMHgwMjVlCisjZGVmaW5lIE5UX1NUQVRVU19VTlNVUFBPUlRFRF9DT01QUkVTU0lPTiAweEMwMDAwMDAwIHwgMHgwMjVmCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0hXX1BST0ZJTEUgMHhDMDAwMDAwMCB8IDB4MDI2MAorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QTFVHUExBWV9ERVZJQ0VfUEFUSCAweEMwMDAwMDAwIHwgMHgwMjYxCisjZGVmaW5lIE5UX1NUQVRVU19EUklWRVJfT1JESU5BTF9OT1RfRk9VTkQgMHhDMDAwMDAwMCB8IDB4MDI2MgorI2RlZmluZSBOVF9TVEFUVVNfRFJJVkVSX0VOVFJZUE9JTlRfTk9UX0ZPVU5EIDB4QzAwMDAwMDAgfCAweDAyNjMKKyNkZWZpbmUgTlRfU1RBVFVTX1JFU09VUkNFX05PVF9PV05FRCAweEMwMDAwMDAwIHwgMHgwMjY0CisjZGVmaW5lIE5UX1NUQVRVU19UT09fTUFOWV9MSU5LUyAweEMwMDAwMDAwIHwgMHgwMjY1CisjZGVmaW5lIE5UX1NUQVRVU19RVU9UQV9MSVNUX0lOQ09OU0lTVEVOVCAweEMwMDAwMDAwIHwgMHgwMjY2CisjZGVmaW5lIE5UX1NUQVRVU19GSUxFX0lTX09GRkxJTkUgMHhDMDAwMDAwMCB8IDB4MDI2NworI2RlZmluZSBOVF9TVEFUVVNfTk9fU1VDSF9KT0IgMHhDMDAwMDAwMCB8IDB4RURFCS8qIHNjaGVkdWxlciAqLworCisjZW5kaWYJCQkJLyogX05URVJSX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvbnRsbXNzcC5oIGIvZnMvY2lmcy9udGxtc3NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhY2I0MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NpZnMvbnRsbXNzcC5oCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogICBmcy9jaWZzL250bG1zc3AuaAorICoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMgorICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIAorICovCisKKyNwcmFnbWEgcGFjaygxKQorCisjZGVmaW5lIE5UTE1TU1BfU0lHTkFUVVJFICJOVExNU1NQIgorLyogTWVzc2FnZSBUeXBlcyAqLworI2RlZmluZSBOdExtTmVnb3RpYXRlICAgICBjcHVfdG9fbGUzMigxKQorI2RlZmluZSBOdExtQ2hhbGxlbmdlICAgICBjcHVfdG9fbGUzMigyKQorI2RlZmluZSBOdExtQXV0aGVudGljYXRlICBjcHVfdG9fbGUzMigzKQorI2RlZmluZSBVbmtub3duTWVzc2FnZSAgICBjcHVfdG9fbGUzMig4KQorCisvKiBOZWdvdGlhdGUgRmxhZ3MgKi8KKyNkZWZpbmUgTlRMTVNTUF9ORUdPVElBVEVfVU5JQ09ERSAgICAgICAweDAxCS8vIFRleHQgc3RyaW5ncyBhcmUgaW4gdW5pY29kZQorI2RlZmluZSBOVExNU1NQX05FR09USUFURV9PRU0gICAgICAgICAgIDB4MDIJLy8gVGV4dCBzdHJpbmdzIGFyZSBpbiBPRU0KKyNkZWZpbmUgTlRMTVNTUF9SRVFVRVNUX1RBUkdFVCAgICAgICAgICAweDA0CS8vIFNlcnZlciByZXR1cm4gaXRzIGF1dGggcmVhbG0KKyNkZWZpbmUgTlRMTVNTUF9ORUdPVElBVEVfU0lHTiAgICAgICAgMHgwMDEwCS8vIFJlcXVlc3Qgc2lnbmF0dXJlIGNhcGFiaWxpdHkKKyNkZWZpbmUgTlRMTVNTUF9ORUdPVElBVEVfU0VBTCAgICAgICAgMHgwMDIwCS8vIFJlcXVlc3QgY29uZmlkZW50aWFsaXR5CisjZGVmaW5lIE5UTE1TU1BfTkVHT1RJQVRFX0RHUkFNICAgICAgIDB4MDA0MAorI2RlZmluZSBOVExNU1NQX05FR09USUFURV9MTV9LRVkgICAgICAweDAwODAgLy8gVXNlIExNIHNlc3Npb24ga2V5IGZvciBzaWduL3NlYWwKKyNkZWZpbmUgTlRMTVNTUF9ORUdPVElBVEVfTlRMTSAgICAgICAgMHgwMjAwCS8vIE5UTE0gYXV0aGVudGljYXRpb24KKyNkZWZpbmUgTlRMTVNTUF9ORUdPVElBVEVfRE9NQUlOX1NVUFBMSUVEIDB4MTAwMAorI2RlZmluZSBOVExNU1NQX05FR09USUFURV9XT1JLU1RBVElPTl9TVVBQTElFRCAweDIwMDAKKyNkZWZpbmUgTlRMTVNTUF9ORUdPVElBVEVfTE9DQUxfQ0FMTCAgMHg0MDAwCS8vIGNsaWVudC9zZXJ2ZXIgb24gc2FtZSBtYWNoaW5lCisjZGVmaW5lIE5UTE1TU1BfTkVHT1RJQVRFX0FMV0FZU19TSUdOIDB4ODAwMAkvLyBTaWduIGZvciBhbGwgc2VjdXJpdHkgbGV2ZWxzCisjZGVmaW5lIE5UTE1TU1BfVEFSR0VUX1RZUEVfRE9NQUlOICAgMHgxMDAwMAorI2RlZmluZSBOVExNU1NQX1RBUkdFVF9UWVBFX1NFUlZFUiAgIDB4MjAwMDAKKyNkZWZpbmUgTlRMTVNTUF9UQVJHRVRfVFlQRV9TSEFSRSAgICAweDQwMDAwCisjZGVmaW5lIE5UTE1TU1BfTkVHT1RJQVRFX05UTE1WMiAgICAgMHg4MDAwMAorI2RlZmluZSBOVExNU1NQX1JFUVVFU1RfSU5JVF9SRVNQICAgMHgxMDAwMDAKKyNkZWZpbmUgTlRMTVNTUF9SRVFVRVNUX0FDQ0VQVF9SRVNQIDB4MjAwMDAwCisjZGVmaW5lIE5UTE1TU1BfUkVRVUVTVF9OT1RfTlRfS0VZICAweDQwMDAwMAorI2RlZmluZSBOVExNU1NQX05FR09USUFURV9UQVJHRVRfSU5GTyAweDgwMDAwMAorI2RlZmluZSBOVExNU1NQX05FR09USUFURV8xMjggICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgTlRMTVNTUF9ORUdPVElBVEVfS0VZX1hDSCAweDQwMDAwMDAwCisjZGVmaW5lIE5UTE1TU1BfTkVHT1RJQVRFXzU2ICAgICAgMHg4MDAwMDAwMAorCisvKiBBbHRob3VnaCB0eXBlZGVmcyBhcmUgbm90IGNvbW1vbmx5IHVzZWQgZm9yIHN0cnVjdHVyZSBkZWZpbml0aW9ucyAqLworLyogaW4gdGhlIExpbnV4IGtlcm5lbCwgaW4gdGhpcyBwYXJ0aWN1bGFyIGNhc2UgdGhleSBhcmUgdXNlZnVsICAgICAgKi8KKy8qIHRvIG1vcmUgY2xvc2VseSBtYXRjaCB0aGUgc3RhbmRhcmRzIGRvY3VtZW50IGZvciBOVExNU1NQIGZyb20gICAgICovCisvKiBPcGVuR3JvdXAgYW5kIHRvIG1ha2UgdGhlIGNvZGUgbW9yZSBjbG9zZWx5IG1hdGNoIHRoZSBzdGFuZGFyZCBpbiAqLworLyogYXBwZWFyYW5jZSAqLworCit0eXBlZGVmIHN0cnVjdCBfU0VDVVJJVFlfQlVGRkVSIHsKKwlfX2xlMTYgTGVuZ3RoOworCV9fbGUxNiBNYXhpbXVtTGVuZ3RoOworCV9fbGUzMiBCdWZmZXI7CQkvKiBvZmZzZXQgdG8gYnVmZmVyICovCit9IFNFQ1VSSVRZX0JVRkZFUjsKKwordHlwZWRlZiBzdHJ1Y3QgX05FR09USUFURV9NRVNTQUdFIHsKKwlfX3U4IFNpZ25hdHVyZVtzaXplb2YgKE5UTE1TU1BfU0lHTkFUVVJFKV07CisJX19sZTMyIE1lc3NhZ2VUeXBlOyAgICAgLyogMSAqLworCV9fbGUzMiBOZWdvdGlhdGVGbGFnczsKKwlTRUNVUklUWV9CVUZGRVIgRG9tYWluTmFtZTsJLyogUkZDIDEwMDEgc3R5bGUgYW5kIEFTQ0lJICovCisJU0VDVVJJVFlfQlVGRkVSIFdvcmtzdGF0aW9uTmFtZTsJLyogUkZDIDEwMDEgYW5kIEFTQ0lJICovCisJY2hhciBEb21haW5TdHJpbmdbMF07CisJLyogZm9sbG93ZWQgYnkgV29ya3N0YXRpb25TdHJpbmcgKi8KK30gTkVHT1RJQVRFX01FU1NBR0UsICpQTkVHT1RJQVRFX01FU1NBR0U7CisKK3R5cGVkZWYgc3RydWN0IF9DSEFMTEVOR0VfTUVTU0FHRSB7CisJX191OCBTaWduYXR1cmVbc2l6ZW9mIChOVExNU1NQX1NJR05BVFVSRSldOworCV9fbGUzMiBNZXNzYWdlVHlwZTsgICAvKiAyICovCisJU0VDVVJJVFlfQlVGRkVSIFRhcmdldE5hbWU7CisJX19sZTMyIE5lZ290aWF0ZUZsYWdzOworCV9fdTggQ2hhbGxlbmdlW0NJRlNfQ1JZUFRPX0tFWV9TSVpFXTsKKwlfX3U4IFJlc2VydmVkWzhdOworCVNFQ1VSSVRZX0JVRkZFUiBUYXJnZXRJbmZvQXJyYXk7Cit9IENIQUxMRU5HRV9NRVNTQUdFLCAqUENIQUxMRU5HRV9NRVNTQUdFOworCit0eXBlZGVmIHN0cnVjdCBfQVVUSEVOVElDQVRFX01FU1NBR0UgeworCV9fdTggU2lnbmF0dXJlW3NpemVvZiAoTlRMTVNTUF9TSUdOQVRVUkUpXTsKKwlfX2xlMzIgTWVzc2FnZVR5cGU7ICAvKiAzICovCisJU0VDVVJJVFlfQlVGRkVSIExtQ2hhbGxlbmdlUmVzcG9uc2U7CisJU0VDVVJJVFlfQlVGRkVSIE50Q2hhbGxlbmdlUmVzcG9uc2U7CisJU0VDVVJJVFlfQlVGRkVSIERvbWFpbk5hbWU7CisJU0VDVVJJVFlfQlVGRkVSIFVzZXJOYW1lOworCVNFQ1VSSVRZX0JVRkZFUiBXb3Jrc3RhdGlvbk5hbWU7CisJU0VDVVJJVFlfQlVGRkVSIFNlc3Npb25LZXk7CisJX19sZTMyIE5lZ290aWF0ZUZsYWdzOworCWNoYXIgVXNlclN0cmluZ1swXTsKK30gQVVUSEVOVElDQVRFX01FU1NBR0UsICpQQVVUSEVOVElDQVRFX01FU1NBR0U7CisKKyNwcmFnbWEgcGFjaygpCQkJLyogcmVzdW1lIGRlZmF1bHQgc3RydWN0dXJlIHBhY2tpbmcgKi8KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvcmVhZGRpci5jIGIvZnMvY2lmcy9yZWFkZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhiZWEzOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NpZnMvcmVhZGRpci5jCkBAIC0wLDAgKzEsODY3IEBACisvKgorICogICBmcy9jaWZzL3JlYWRkaXIuYworICoKKyAqICAgRGlyZWN0b3J5IHNlYXJjaCBoYW5kbGluZworICogCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDQKKyAqICAgQXV0aG9yKHMpOiBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlICJjaWZzcGR1LmgiCisjaW5jbHVkZSAiY2lmc2dsb2IuaCIKKyNpbmNsdWRlICJjaWZzcHJvdG8uaCIKKyNpbmNsdWRlICJjaWZzX3VuaWNvZGUuaCIKKyNpbmNsdWRlICJjaWZzX2RlYnVnLmgiCisjaW5jbHVkZSAiY2lmc19mc19zYi5oIgorI2luY2x1ZGUgImNpZnNmcy5oIgorCisvKiBCQiBmaXhtZSAtIGFkZCBkZWJ1ZyB3cmFwcGVycyBhcm91bmQgdGhpcyBmdW5jdGlvbiB0byBkaXNhYmxlIGl0IGZpeG1lIEJCICovCisvKiBzdGF0aWMgdm9pZCBkdW1wX2NpZnNfZmlsZV9zdHJ1Y3Qoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmxhYmVsKQoreworCXN0cnVjdCBjaWZzRmlsZUluZm8gKiBjZjsKKworCWlmKGZpbGUpIHsKKwkJY2YgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCWlmKGNmID09IE5VTEwpIHsKKwkJCWNGWUkoMSwoImVtcHR5IGNpZnMgcHJpdmF0ZSBmaWxlIGRhdGEiKSk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYoY2YtPmludmFsaWRIYW5kbGUpIHsKKwkJCWNGWUkoMSwoImludmFsaWQgaGFuZGxlIikpOworCQl9CisJCWlmKGNmLT5zcmNoX2luZi5lbmRPZlNlYXJjaCkgeworCQkJY0ZZSSgxLCgiZW5kIG9mIHNlYXJjaCIpKTsKKwkJfQorCQlpZihjZi0+c3JjaF9pbmYuZW1wdHlEaXIpIHsKKwkJCWNGWUkoMSwoImVtcHR5IGRpciIpKTsKKwkJfQorCQkKKwl9Cit9ICovCisKKy8qIFJldHVybnMgb25lIGlmIG5ldyBpbm9kZSBjcmVhdGVkICh3aGljaCB0aGVyZWZvcmUgbmVlZHMgdG8gYmUgaGFzaGVkKSAqLworLyogTWlnaHQgY2hlY2sgaW4gdGhlIGZ1dHVyZSBpZiBpbm9kZSBudW1iZXIgY2hhbmdlZCBzbyB3ZSBjYW4gcmVoYXNoIGlub2RlICovCitzdGF0aWMgaW50IGNvbnN0cnVjdF9kZW50cnkoc3RydWN0IHFzdHIgKnFzdHJpbmcsIHN0cnVjdCBmaWxlICpmaWxlLAorCXN0cnVjdCBpbm9kZSAqKnB0bXBfaW5vZGUsIHN0cnVjdCBkZW50cnkgKipwbmV3X2RlbnRyeSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICp0bXBfZGVudHJ5OworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJaW50IHJjID0gMDsKKworCWNGWUkoMSwgKCJGb3IgJXMgIiwgcXN0cmluZy0+bmFtZSkpOworCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfZGVudHJ5LT5kX3NiKTsKKwlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisKKwlxc3RyaW5nLT5oYXNoID0gZnVsbF9uYW1lX2hhc2gocXN0cmluZy0+bmFtZSwgcXN0cmluZy0+bGVuKTsKKwl0bXBfZGVudHJ5ID0gZF9sb29rdXAoZmlsZS0+Zl9kZW50cnksIHFzdHJpbmcpOworCWlmICh0bXBfZGVudHJ5KSB7CisJCWNGWUkoMCwgKCIgZXhpc3RpbmcgZGVudHJ5IHdpdGggaW5vZGUgMHglcCIsIHRtcF9kZW50cnktPmRfaW5vZGUpKTsKKwkJKnB0bXBfaW5vZGUgPSB0bXBfZGVudHJ5LT5kX2lub2RlOworLyogQkIgb3ZlcndyaXRlIG9sZCBuYW1lPyBpLmUuIHRtcF9kZW50cnktPmRfbmFtZSBhbmQgdG1wX2RlbnRyeS0+ZF9uYW1lLmxlbj8/Ki8KKwkJaWYoKnB0bXBfaW5vZGUgPT0gTlVMTCkgeworCQkJKnB0bXBfaW5vZGUgPSBuZXdfaW5vZGUoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCQkJaWYoKnB0bXBfaW5vZGUgPT0gTlVMTCkKKwkJCQlyZXR1cm4gcmM7CisJCQlyYyA9IDE7CisJCQlkX2luc3RhbnRpYXRlKHRtcF9kZW50cnksICpwdG1wX2lub2RlKTsKKwkJfQorCX0gZWxzZSB7CisJCXRtcF9kZW50cnkgPSBkX2FsbG9jKGZpbGUtPmZfZGVudHJ5LCBxc3RyaW5nKTsKKwkJaWYodG1wX2RlbnRyeSA9PSBOVUxMKSB7CisJCQljRVJST1IoMSwoIkZhaWxlZCBhbGxvY2F0aW5nIGRlbnRyeSIpKTsKKwkJCSpwdG1wX2lub2RlID0gTlVMTDsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCSpwdG1wX2lub2RlID0gbmV3X2lub2RlKGZpbGUtPmZfZGVudHJ5LT5kX3NiKTsKKwkJdG1wX2RlbnRyeS0+ZF9vcCA9ICZjaWZzX2RlbnRyeV9vcHM7CisJCWlmKCpwdG1wX2lub2RlID09IE5VTEwpCisJCQlyZXR1cm4gcmM7CisJCXJjID0gMTsKKwkJZF9pbnN0YW50aWF0ZSh0bXBfZGVudHJ5LCAqcHRtcF9pbm9kZSk7CisJCWRfcmVoYXNoKHRtcF9kZW50cnkpOworCX0KKworCXRtcF9kZW50cnktPmRfdGltZSA9IGppZmZpZXM7CisJKnBuZXdfZGVudHJ5ID0gdG1wX2RlbnRyeTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfaW5faW5vZGUoc3RydWN0IGlub2RlICp0bXBfaW5vZGUsCisJRklMRV9ESVJFQ1RPUllfSU5GTyAqcGZpbmREYXRhLCBpbnQgKnBvYmplY3RfdHlwZSkKK3sKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lmc0luZm8gPSBDSUZTX0kodG1wX2lub2RlKTsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiID0gQ0lGU19TQih0bXBfaW5vZGUtPmlfc2IpOworCV9fdTMyIGF0dHIgPSBsZTMyX3RvX2NwdShwZmluZERhdGEtPkV4dEZpbGVBdHRyaWJ1dGVzKTsKKwlfX3U2NCBhbGxvY2F0aW9uX3NpemUgPSBsZTY0X3RvX2NwdShwZmluZERhdGEtPkFsbG9jYXRpb25TaXplKTsKKwlfX3U2NCBlbmRfb2ZfZmlsZSA9IGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+RW5kT2ZGaWxlKTsKKworCWNpZnNJbmZvLT5jaWZzQXR0cnMgPSBhdHRyOworCWNpZnNJbmZvLT50aW1lID0gamlmZmllczsKKworCS8qIExpbnV4IGNhbiBub3Qgc3RvcmUgZmlsZSBjcmVhdGlvbiB0aW1lIHVuZm9ydHVuYXRlbHkgc28gaWdub3JlIGl0ICovCisJdG1wX2lub2RlLT5pX2F0aW1lID0KKwkgICAgY2lmc19OVHRpbWVUb1VuaXgobGU2NF90b19jcHUocGZpbmREYXRhLT5MYXN0QWNjZXNzVGltZSkpOworCXRtcF9pbm9kZS0+aV9tdGltZSA9CisJICAgIGNpZnNfTlR0aW1lVG9Vbml4KGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+TGFzdFdyaXRlVGltZSkpOworCXRtcF9pbm9kZS0+aV9jdGltZSA9CisJICAgIGNpZnNfTlR0aW1lVG9Vbml4KGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+Q2hhbmdlVGltZSkpOworCS8qIHRyZWF0IGRvcyBhdHRyaWJ1dGUgb2YgcmVhZC1vbmx5IGFzIHJlYWQtb25seSBtb2RlIGJpdCBlLmcuIDU1NT8gKi8KKwkvKiAyNzY3IHBlcm1zIC0gaW5kaWNhdGUgbWFuZGF0b3J5IGxvY2tpbmcgKi8KKwkJLyogQkIgZmlsbCBpbiB1aWQgYW5kIGdpZCBoZXJlPyB3aXRoIGhlbHAgZnJvbSB3aW5iaW5kPyAKKwkJICAgb3IgcmV0cmlldmUgZnJvbSBOVEZTIHN0cmVhbSBleHRlbmRlZCBhdHRyaWJ1dGUgKi8KKwlpZiAoYXRvbWljX3JlYWQoJmNpZnNJbmZvLT5pblVzZSkgPT0gMCkgeworCQl0bXBfaW5vZGUtPmlfdWlkID0gY2lmc19zYi0+bW50X3VpZDsKKwkJdG1wX2lub2RlLT5pX2dpZCA9IGNpZnNfc2ItPm1udF9naWQ7CisJCS8qIHNldCBkZWZhdWx0IG1vZGUuIHdpbGwgb3ZlcnJpZGUgZm9yIGRpcnMgYmVsb3cgKi8KKwkJdG1wX2lub2RlLT5pX21vZGUgPSBjaWZzX3NiLT5tbnRfZmlsZV9tb2RlOworCX0KKworCWNGWUkoMCwoIkNJRlMgRkZJUlNUOiBBdHRyaWJ1dGVzIGNhbWUgaW4gYXMgMHgleCIsYXR0cikpOworCWlmIChhdHRyICYgQVRUUl9ESVJFQ1RPUlkpIHsKKwkJKnBvYmplY3RfdHlwZSA9IERUX0RJUjsKKwkJLyogb3ZlcnJpZGUgZGVmYXVsdCBwZXJtcyBzaW5jZSB3ZSBkbyBub3QgbG9jayBkaXJzICovCisJCWlmKGF0b21pY19yZWFkKCZjaWZzSW5mby0+aW5Vc2UpID09IDApIHsKKwkJCXRtcF9pbm9kZS0+aV9tb2RlID0gY2lmc19zYi0+bW50X2Rpcl9tb2RlOworCQl9CisJCXRtcF9pbm9kZS0+aV9tb2RlIHw9IFNfSUZESVI7CisvKiB3ZSBubyBsb25nZXIgbWFyayB0aGVzZSBiZWNhdXNlIHdlIGNvdWxkIG5vdCBmb2xsb3cgdGhlbSAqLworLyogICAgICAgIH0gZWxzZSBpZiAoYXR0ciAmIEFUVFJfUkVQQVJTRSkgeworICAgICAgICAgICAgICAgICpwb2JqZWN0X3R5cGUgPSBEVF9MTks7CisgICAgICAgICAgICAgICAgdG1wX2lub2RlLT5pX21vZGUgfD0gU19JRkxOSzsgKi8KKwl9IGVsc2UgeworCQkqcG9iamVjdF90eXBlID0gRFRfUkVHOworCQl0bXBfaW5vZGUtPmlfbW9kZSB8PSBTX0lGUkVHOworCQlpZiAoYXR0ciAmIEFUVFJfUkVBRE9OTFkpCisJCQl0bXBfaW5vZGUtPmlfbW9kZSAmPSB+KFNfSVdVR08pOworCX0gLyogY291bGQgYWRkIGNvZGUgaGVyZSAtIHRvIHZhbGlkYXRlIGlmIGRldmljZSBvciB3ZWlyZCBzaGFyZSB0eXBlPyAqLworCisJLyogY2FuIG5vdCBmaWxsIGluIG5saW5rIGhlcmUgYXMgaW4gcXBhdGhpbmZvIHZlcnNpb24gYW5kIFVueCBzZWFyY2ggKi8KKwlpZiAoYXRvbWljX3JlYWQoJmNpZnNJbmZvLT5pblVzZSkgPT0gMCkgeworCQlhdG9taWNfc2V0KCZjaWZzSW5mby0+aW5Vc2UsIDEpOworCX0KKworCWlmIChpc19zaXplX3NhZmVfdG9fY2hhbmdlKGNpZnNJbmZvKSkgeworCQkvKiBjYW4gbm90IHNhZmVseSBjaGFuZ2UgdGhlIGZpbGUgc2l6ZSBoZXJlIGlmIHRoZSAKKwkJY2xpZW50IGlzIHdyaXRpbmcgdG8gaXQgZHVlIHRvIHBvdGVudGlhbCByYWNlcyAqLworCQlpX3NpemVfd3JpdGUodG1wX2lub2RlLCBlbmRfb2ZfZmlsZSk7CisKKwkvKiA1MTIgYnl0ZXMgKDIqKjkpIGlzIHRoZSBmYWtlIGJsb2Nrc2l6ZSB0aGF0IG11c3QgYmUgdXNlZCAqLworCS8qIGZvciB0aGlzIGNhbGN1bGF0aW9uLCBldmVuIHRob3VnaCB0aGUgcmVwb3J0ZWQgYmxvY2tzaXplIGlzIGxhcmdlciAqLworCQl0bXBfaW5vZGUtPmlfYmxvY2tzID0gKDUxMiAtIDEgKyBhbGxvY2F0aW9uX3NpemUpID4+IDk7CisJfQorCisJaWYgKGFsbG9jYXRpb25fc2l6ZSA8IGVuZF9vZl9maWxlKQorCQljRllJKDEsICgiTWF5IGJlIHNwYXJzZSBmaWxlLCBhbGxvY2F0aW9uIGxlc3MgdGhhbiBmaWxlIHNpemUiKSk7CisJY0ZZSSgxLAorCSAgICAgKCJGaWxlIFNpemUgJWxkIGFuZCBibG9ja3MgJWxkIGFuZCBibG9ja3NpemUgJWxkIiwKKwkgICAgICAodW5zaWduZWQgbG9uZyl0bXBfaW5vZGUtPmlfc2l6ZSwgdG1wX2lub2RlLT5pX2Jsb2NrcywKKwkgICAgICB0bXBfaW5vZGUtPmlfYmxrc2l6ZSkpOworCWlmIChTX0lTUkVHKHRtcF9pbm9kZS0+aV9tb2RlKSkgeworCQljRllJKDEsICgiIEZpbGUgaW5vZGUgIikpOworCQl0bXBfaW5vZGUtPmlfb3AgPSAmY2lmc19maWxlX2lub2RlX29wczsKKwkJaWYoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX0RJUkVDVF9JTykKKwkJCXRtcF9pbm9kZS0+aV9mb3AgPSAmY2lmc19maWxlX2RpcmVjdF9vcHM7CisJCWVsc2UKKwkJCXRtcF9pbm9kZS0+aV9mb3AgPSAmY2lmc19maWxlX29wczsKKwkJdG1wX2lub2RlLT5pX2RhdGEuYV9vcHMgPSAmY2lmc19hZGRyX29wczsKKwl9IGVsc2UgaWYgKFNfSVNESVIodG1wX2lub2RlLT5pX21vZGUpKSB7CisJCWNGWUkoMSwgKCIgRGlyZWN0b3J5IGlub2RlIikpOworCQl0bXBfaW5vZGUtPmlfb3AgPSAmY2lmc19kaXJfaW5vZGVfb3BzOworCQl0bXBfaW5vZGUtPmlfZm9wID0gJmNpZnNfZGlyX29wczsKKwl9IGVsc2UgaWYgKFNfSVNMTksodG1wX2lub2RlLT5pX21vZGUpKSB7CisJCWNGWUkoMSwgKCIgU3ltYm9saWMgTGluayBpbm9kZSAiKSk7CisJCXRtcF9pbm9kZS0+aV9vcCA9ICZjaWZzX3N5bWxpbmtfaW5vZGVfb3BzOworCX0gZWxzZSB7CisJCWNGWUkoMSwgKCIgSW5pdCBzcGVjaWFsIGlub2RlICIpKTsKKwkJaW5pdF9zcGVjaWFsX2lub2RlKHRtcF9pbm9kZSwgdG1wX2lub2RlLT5pX21vZGUsCisJCQkJICAgdG1wX2lub2RlLT5pX3JkZXYpOworCX0KK30KKworc3RhdGljIHZvaWQgdW5peF9maWxsX2luX2lub2RlKHN0cnVjdCBpbm9kZSAqdG1wX2lub2RlLAorCUZJTEVfVU5JWF9JTkZPICpwZmluZERhdGEsIGludCAqcG9iamVjdF90eXBlKQoreworCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzSW5mbyA9IENJRlNfSSh0bXBfaW5vZGUpOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKHRtcF9pbm9kZS0+aV9zYik7CisKKwlfX3UzMiB0eXBlID0gbGUzMl90b19jcHUocGZpbmREYXRhLT5UeXBlKTsKKwlfX3U2NCBudW1fb2ZfYnl0ZXMgPSBsZTY0X3RvX2NwdShwZmluZERhdGEtPk51bU9mQnl0ZXMpOworCV9fdTY0IGVuZF9vZl9maWxlID0gbGU2NF90b19jcHUocGZpbmREYXRhLT5FbmRPZkZpbGUpOworCWNpZnNJbmZvLT50aW1lID0gamlmZmllczsKKwlhdG9taWNfaW5jKCZjaWZzSW5mby0+aW5Vc2UpOworCisJdG1wX2lub2RlLT5pX2F0aW1lID0KKwkgICAgY2lmc19OVHRpbWVUb1VuaXgobGU2NF90b19jcHUocGZpbmREYXRhLT5MYXN0QWNjZXNzVGltZSkpOworCXRtcF9pbm9kZS0+aV9tdGltZSA9CisJICAgIGNpZnNfTlR0aW1lVG9Vbml4KGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+TGFzdE1vZGlmaWNhdGlvblRpbWUpKTsKKwl0bXBfaW5vZGUtPmlfY3RpbWUgPQorCSAgICBjaWZzX05UdGltZVRvVW5peChsZTY0X3RvX2NwdShwZmluZERhdGEtPkxhc3RTdGF0dXNDaGFuZ2UpKTsKKworCXRtcF9pbm9kZS0+aV9tb2RlID0gbGU2NF90b19jcHUocGZpbmREYXRhLT5QZXJtaXNzaW9ucyk7CisJaWYgKHR5cGUgPT0gVU5JWF9GSUxFKSB7CisJCSpwb2JqZWN0X3R5cGUgPSBEVF9SRUc7CisJCXRtcF9pbm9kZS0+aV9tb2RlIHw9IFNfSUZSRUc7CisJfSBlbHNlIGlmICh0eXBlID09IFVOSVhfU1lNTElOSykgeworCQkqcG9iamVjdF90eXBlID0gRFRfTE5LOworCQl0bXBfaW5vZGUtPmlfbW9kZSB8PSBTX0lGTE5LOworCX0gZWxzZSBpZiAodHlwZSA9PSBVTklYX0RJUikgeworCQkqcG9iamVjdF90eXBlID0gRFRfRElSOworCQl0bXBfaW5vZGUtPmlfbW9kZSB8PSBTX0lGRElSOworCX0gZWxzZSBpZiAodHlwZSA9PSBVTklYX0NIQVJERVYpIHsKKwkJKnBvYmplY3RfdHlwZSA9IERUX0NIUjsKKwkJdG1wX2lub2RlLT5pX21vZGUgfD0gU19JRkNIUjsKKwkJdG1wX2lub2RlLT5pX3JkZXYgPSBNS0RFVihsZTY0X3RvX2NwdShwZmluZERhdGEtPkRldk1ham9yKSwKKwkJCQlsZTY0X3RvX2NwdShwZmluZERhdGEtPkRldk1pbm9yKSAmIE1JTk9STUFTSyk7CisJfSBlbHNlIGlmICh0eXBlID09IFVOSVhfQkxPQ0tERVYpIHsKKwkJKnBvYmplY3RfdHlwZSA9IERUX0JMSzsKKwkJdG1wX2lub2RlLT5pX21vZGUgfD0gU19JRkJMSzsKKwkJdG1wX2lub2RlLT5pX3JkZXYgPSBNS0RFVihsZTY0X3RvX2NwdShwZmluZERhdGEtPkRldk1ham9yKSwKKwkJCQlsZTY0X3RvX2NwdShwZmluZERhdGEtPkRldk1pbm9yKSAmIE1JTk9STUFTSyk7CisJfSBlbHNlIGlmICh0eXBlID09IFVOSVhfRklGTykgeworCQkqcG9iamVjdF90eXBlID0gRFRfRklGTzsKKwkJdG1wX2lub2RlLT5pX21vZGUgfD0gU19JRklGTzsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gVU5JWF9TT0NLRVQpIHsKKwkJKnBvYmplY3RfdHlwZSA9IERUX1NPQ0s7CisJCXRtcF9pbm9kZS0+aV9tb2RlIHw9IFNfSUZTT0NLOworCX0KKworCXRtcF9pbm9kZS0+aV91aWQgPSBsZTY0X3RvX2NwdShwZmluZERhdGEtPlVpZCk7CisJdG1wX2lub2RlLT5pX2dpZCA9IGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+R2lkKTsKKwl0bXBfaW5vZGUtPmlfbmxpbmsgPSBsZTY0X3RvX2NwdShwZmluZERhdGEtPk5saW5rcyk7CisKKwlpZiAoaXNfc2l6ZV9zYWZlX3RvX2NoYW5nZShjaWZzSW5mbykpIHsKKwkJLyogY2FuIG5vdCBzYWZlbHkgY2hhbmdlIHRoZSBmaWxlIHNpemUgaGVyZSBpZiB0aGUgCisJCWNsaWVudCBpcyB3cml0aW5nIHRvIGl0IGR1ZSB0byBwb3RlbnRpYWwgcmFjZXMgKi8KKwkJaV9zaXplX3dyaXRlKHRtcF9pbm9kZSxlbmRfb2ZfZmlsZSk7CisKKwkvKiA1MTIgYnl0ZXMgKDIqKjkpIGlzIHRoZSBmYWtlIGJsb2Nrc2l6ZSB0aGF0IG11c3QgYmUgdXNlZCAqLworCS8qIGZvciB0aGlzIGNhbGN1bGF0aW9uLCBub3QgdGhlIHJlYWwgYmxvY2tzaXplICovCisJCXRtcF9pbm9kZS0+aV9ibG9ja3MgPSAoNTEyIC0gMSArIG51bV9vZl9ieXRlcykgPj4gOTsKKwl9CisKKwlpZiAoU19JU1JFRyh0bXBfaW5vZGUtPmlfbW9kZSkpIHsKKwkJY0ZZSSgxLCAoIkZpbGUgaW5vZGUiKSk7CisJCXRtcF9pbm9kZS0+aV9vcCA9ICZjaWZzX2ZpbGVfaW5vZGVfb3BzOworCQlpZihjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfRElSRUNUX0lPKQorCQkJdG1wX2lub2RlLT5pX2ZvcCA9ICZjaWZzX2ZpbGVfZGlyZWN0X29wczsKKwkJZWxzZQorCQkJdG1wX2lub2RlLT5pX2ZvcCA9ICZjaWZzX2ZpbGVfb3BzOworCQl0bXBfaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZjaWZzX2FkZHJfb3BzOworCX0gZWxzZSBpZiAoU19JU0RJUih0bXBfaW5vZGUtPmlfbW9kZSkpIHsKKwkJY0ZZSSgxLCAoIkRpcmVjdG9yeSBpbm9kZSIpKTsKKwkJdG1wX2lub2RlLT5pX29wID0gJmNpZnNfZGlyX2lub2RlX29wczsKKwkJdG1wX2lub2RlLT5pX2ZvcCA9ICZjaWZzX2Rpcl9vcHM7CisJfSBlbHNlIGlmIChTX0lTTE5LKHRtcF9pbm9kZS0+aV9tb2RlKSkgeworCQljRllJKDEsICgiU3ltYm9saWMgTGluayBpbm9kZSIpKTsKKwkJdG1wX2lub2RlLT5pX29wID0gJmNpZnNfc3ltbGlua19pbm9kZV9vcHM7CisvKiB0bXBfaW5vZGUtPmlfZm9wID0gKi8vKiBkbyBub3QgbmVlZCB0byBzZXQgdG8gYW55dGhpbmcgKi8KKwl9IGVsc2UgeworCQljRllJKDEsICgiU3BlY2lhbCBpbm9kZSIpKTsgCisJCWluaXRfc3BlY2lhbF9pbm9kZSh0bXBfaW5vZGUsIHRtcF9pbm9kZS0+aV9tb2RlLAorCQkJCSAgIHRtcF9pbm9kZS0+aV9yZGV2KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaW5pdGlhdGVfY2lmc19zZWFyY2goY29uc3QgaW50IHhpZCwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJjID0gMDsKKwljaGFyICogZnVsbF9wYXRoOworCXN0cnVjdCBjaWZzRmlsZUluZm8gKiBjaWZzRmlsZTsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uOworCisJaWYoZmlsZS0+cHJpdmF0ZV9kYXRhID09IE5VTEwpIHsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gCisJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY2lmc0ZpbGVJbmZvKSxHRlBfS0VSTkVMKTsKKwl9CisKKwlpZihmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9IGVsc2UgeworCQltZW1zZXQoZmlsZS0+cHJpdmF0ZV9kYXRhLDAsc2l6ZW9mKHN0cnVjdCBjaWZzRmlsZUluZm8pKTsKKwl9CisJY2lmc0ZpbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2lmc0ZpbGUtPmludmFsaWRIYW5kbGUgPSBUUlVFOworCWNpZnNGaWxlLT5zcmNoX2luZi5lbmRPZlNlYXJjaCA9IEZBTFNFOworCisJaWYoZmlsZS0+Zl9kZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwljaWZzX3NiID0gQ0lGU19TQihmaWxlLT5mX2RlbnRyeS0+ZF9zYik7CisJaWYoY2lmc19zYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKwlpZihwVGNvbiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd24oJmZpbGUtPmZfZGVudHJ5LT5kX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlmdWxsX3BhdGggPSBidWlsZF93aWxkY2FyZF9wYXRoX2Zyb21fZGVudHJ5KGZpbGUtPmZfZGVudHJ5KTsKKwl1cCgmZmlsZS0+Zl9kZW50cnktPmRfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCisJaWYoZnVsbF9wYXRoID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY0ZZSSgxLCAoIkZ1bGwgcGF0aDogJXMgc3RhcnQgYXQ6ICVsbGQgIiwgZnVsbF9wYXRoLCBmaWxlLT5mX3BvcykpOworCisJLyogdGVzdCBmb3IgVW5peCBleHRlbnNpb25zICovCisJaWYgKHBUY29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklYKSB7CisJCWNpZnNGaWxlLT5zcmNoX2luZi5pbmZvX2xldmVsID0gU01CX0ZJTkRfRklMRV9VTklYOyAKKwl9IGVsc2UgaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9TRVJWRVJfSU5VTSkgeworCQljaWZzRmlsZS0+c3JjaF9pbmYuaW5mb19sZXZlbCA9IFNNQl9GSU5EX0ZJTEVfSURfRlVMTF9ESVJfSU5GTzsKKwl9IGVsc2UgLyogbm90IHNydmlub3MgLSBCQiBmaXhtZSBhZGQgY2hlY2sgZm9yIGJhY2tsZXZlbD8gKi8geworCQljaWZzRmlsZS0+c3JjaF9pbmYuaW5mb19sZXZlbCA9IFNNQl9GSU5EX0ZJTEVfRElSRUNUT1JZX0lORk87CisJfQorCisJcmMgPSBDSUZTRmluZEZpcnN0KHhpZCwgcFRjb24sZnVsbF9wYXRoLGNpZnNfc2ItPmxvY2FsX25scywgCisJCSZjaWZzRmlsZS0+bmV0ZmlkLCAmY2lmc0ZpbGUtPnNyY2hfaW5mKTsgCisJaWYocmMgPT0gMCkKKwkJY2lmc0ZpbGUtPmludmFsaWRIYW5kbGUgPSBGQUxTRTsKKwlrZnJlZShmdWxsX3BhdGgpOworCXJldHVybiByYzsKK30KKworLyogcmV0dXJuIGxlbmd0aCBvZiB1bmljb2RlIHN0cmluZyBpbiBieXRlcyAqLworc3RhdGljIGludCBjaWZzX3VuaWNvZGVfYnl0ZWxlbihjaGFyICpzdHIpCit7CisJaW50IGxlbjsKKwlfX2xlMTYgKiB1c3RyID0gKF9fbGUxNiAqKXN0cjsKKworCWZvcihsZW49MDtsZW4gPD0gUEFUSF9NQVg7bGVuKyspIHsKKwkJaWYodXN0cltsZW5dID09IDApCisJCQlyZXR1cm4gbGVuIDw8IDE7CisJfQorCWNGWUkoMSwoIlVuaWNvZGUgc3RyaW5nIGxvbmdlciB0aGFuIFBBVEhfTUFYIGZvdW5kIikpOworCXJldHVybiBsZW4gPDwgMTsKK30KKworc3RhdGljIGNoYXIgKm54dF9kaXJfZW50cnkoY2hhciAqb2xkX2VudHJ5LCBjaGFyICplbmRfb2Zfc21iKQoreworCWNoYXIgKiBuZXdfZW50cnk7CisJRklMRV9ESVJFQ1RPUllfSU5GTyAqIHBEaXJJbmZvID0gKEZJTEVfRElSRUNUT1JZX0lORk8gKilvbGRfZW50cnk7CisKKwluZXdfZW50cnkgPSBvbGRfZW50cnkgKyBsZTMyX3RvX2NwdShwRGlySW5mby0+TmV4dEVudHJ5T2Zmc2V0KTsKKwljRllJKDEsKCJuZXcgZW50cnkgJXAgb2xkIGVudHJ5ICVwIixuZXdfZW50cnksb2xkX2VudHJ5KSk7CisJLyogdmFsaWRhdGUgdGhhdCBuZXdfZW50cnkgaXMgbm90IHBhc3QgZW5kIG9mIFNNQiAqLworCWlmKG5ld19lbnRyeSA+PSBlbmRfb2Zfc21iKSB7CisJCWNGWUkoMSwoInNlYXJjaCBlbnRyeSAlcCBiZWdhbiBhZnRlciBlbmQgb2YgU01CICVwIG9sZCBlbnRyeSAlcCIsCisJCQluZXdfZW50cnksZW5kX29mX3NtYixvbGRfZW50cnkpKTsgCisJCXJldHVybiBOVUxMOworCX0gZWxzZQorCQlyZXR1cm4gbmV3X2VudHJ5OworCit9CisKKyNkZWZpbmUgVU5JQ09ERV9ET1QgY3B1X3RvX2xlMTYoMHgyZSkKKworLyogcmV0dXJuIDAgaWYgbm8gbWF0Y2ggYW5kIDEgZm9yIC4gKGN1cnJlbnQgZGlyZWN0b3J5KSBhbmQgMiBmb3IgLi4gKHBhcmVudCkgKi8KK3N0YXRpYyBpbnQgY2lmc19lbnRyeV9pc19kb3QoY2hhciAqY3VycmVudF9lbnRyeSwgc3RydWN0IGNpZnNGaWxlSW5mbyAqY2ZpbGUpCit7CisJaW50IHJjID0gMDsKKwljaGFyICogZmlsZW5hbWUgPSBOVUxMOworCWludCBsZW4gPSAwOyAKKworCWlmKGNmaWxlLT5zcmNoX2luZi5pbmZvX2xldmVsID09IDB4MjAyKSB7CisJCUZJTEVfVU5JWF9JTkZPICogcEZpbmREYXRhID0gKEZJTEVfVU5JWF9JTkZPICopY3VycmVudF9lbnRyeTsKKwkJZmlsZW5hbWUgPSAmcEZpbmREYXRhLT5GaWxlTmFtZVswXTsKKwkJaWYoY2ZpbGUtPnNyY2hfaW5mLnVuaWNvZGUpIHsKKwkJCWxlbiA9IGNpZnNfdW5pY29kZV9ieXRlbGVuKGZpbGVuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEJCIHNob3VsZCB3ZSBtYWtlIHRoaXMgc3RybmxlbiBvZiBQQVRIX01BWD8gKi8KKwkJCWxlbiA9IHN0cm5sZW4oZmlsZW5hbWUsIDUpOworCQl9CisJfSBlbHNlIGlmKGNmaWxlLT5zcmNoX2luZi5pbmZvX2xldmVsID09IDB4MTAxKSB7CisJCUZJTEVfRElSRUNUT1JZX0lORk8gKiBwRmluZERhdGEgPSAKKwkJCShGSUxFX0RJUkVDVE9SWV9JTkZPICopY3VycmVudF9lbnRyeTsKKwkJZmlsZW5hbWUgPSAmcEZpbmREYXRhLT5GaWxlTmFtZVswXTsKKwkJbGVuID0gbGUzMl90b19jcHUocEZpbmREYXRhLT5GaWxlTmFtZUxlbmd0aCk7CisJfSBlbHNlIGlmKGNmaWxlLT5zcmNoX2luZi5pbmZvX2xldmVsID09IDB4MTAyKSB7CisJCUZJTEVfRlVMTF9ESVJFQ1RPUllfSU5GTyAqIHBGaW5kRGF0YSA9IAorCQkJKEZJTEVfRlVMTF9ESVJFQ1RPUllfSU5GTyAqKWN1cnJlbnRfZW50cnk7CisJCWZpbGVuYW1lID0gJnBGaW5kRGF0YS0+RmlsZU5hbWVbMF07CisJCWxlbiA9IGxlMzJfdG9fY3B1KHBGaW5kRGF0YS0+RmlsZU5hbWVMZW5ndGgpOworCX0gZWxzZSBpZihjZmlsZS0+c3JjaF9pbmYuaW5mb19sZXZlbCA9PSAweDEwNSkgeworCQlTRUFSQ0hfSURfRlVMTF9ESVJfSU5GTyAqIHBGaW5kRGF0YSA9IAorCQkJKFNFQVJDSF9JRF9GVUxMX0RJUl9JTkZPICopY3VycmVudF9lbnRyeTsKKwkJZmlsZW5hbWUgPSAmcEZpbmREYXRhLT5GaWxlTmFtZVswXTsKKwkJbGVuID0gbGUzMl90b19jcHUocEZpbmREYXRhLT5GaWxlTmFtZUxlbmd0aCk7CisJfSBlbHNlIGlmKGNmaWxlLT5zcmNoX2luZi5pbmZvX2xldmVsID09IDB4MTA0KSB7CisJCUZJTEVfQk9USF9ESVJFQ1RPUllfSU5GTyAqIHBGaW5kRGF0YSA9IAorCQkJKEZJTEVfQk9USF9ESVJFQ1RPUllfSU5GTyAqKWN1cnJlbnRfZW50cnk7CisJCWZpbGVuYW1lID0gJnBGaW5kRGF0YS0+RmlsZU5hbWVbMF07CisJCWxlbiA9IGxlMzJfdG9fY3B1KHBGaW5kRGF0YS0+RmlsZU5hbWVMZW5ndGgpOworCX0gZWxzZSB7CisJCWNGWUkoMSwoIlVua25vd24gZmluZGZpcnN0IGxldmVsICVkIixjZmlsZS0+c3JjaF9pbmYuaW5mb19sZXZlbCkpOworCX0KKworCWlmKGZpbGVuYW1lKSB7CisJCWlmKGNmaWxlLT5zcmNoX2luZi51bmljb2RlKSB7CisJCQlfX2xlMTYgKnVmaWxlbmFtZSA9IChfX2xlMTYgKilmaWxlbmFtZTsKKwkJCWlmKGxlbiA9PSAyKSB7CisJCQkJLyogY2hlY2sgZm9yIC4gKi8KKwkJCQlpZih1ZmlsZW5hbWVbMF0gPT0gVU5JQ09ERV9ET1QpCisJCQkJCXJjID0gMTsKKwkJCX0gZWxzZSBpZihsZW4gPT0gNCkgeworCQkJCS8qIGNoZWNrIGZvciAuLiAqLworCQkJCWlmKCh1ZmlsZW5hbWVbMF0gPT0gVU5JQ09ERV9ET1QpCisJCQkJICAgJiYodWZpbGVuYW1lWzFdID09IFVOSUNPREVfRE9UKSkKKwkJCQkJcmMgPSAyOworCQkJfQorCQl9IGVsc2UgLyogQVNDSUkgKi8geworCQkJaWYobGVuID09IDEpIHsKKwkJCQlpZihmaWxlbmFtZVswXSA9PSAnLicpIAorCQkJCQlyYyA9IDE7CisJCQl9IGVsc2UgaWYobGVuID09IDIpIHsKKwkJCQlpZigoZmlsZW5hbWVbMF0gPT0gJy4nKSAmJiAoZmlsZW5hbWVbMV0gPT0gJy4nKSkgCisJCQkJCXJjID0gMjsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKworLyogZmluZCB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBpbiB0aGUgc2VhcmNoICovCisvKiBOb3RlIHRoYXQgdGhlIFNNQiBzZXJ2ZXIgcmV0dXJucyBzZWFyY2ggZW50cmllcyBmb3IgLiBhbmQgLi4gd2hpY2gKKyAgIGNvbXBsaWNhdGVzIGxvZ2ljIGhlcmUgaWYgd2UgY2hvb3NlIHRvIHBhcnNlIGZvciB0aGVtIGFuZCB3ZSBkbyBub3QKKyAgIGFzc3VtZSB0aGF0IHRoZXkgYXJlIGxvY2F0ZWQgaW4gdGhlIGZpbmRmaXJzdCByZXR1cm4gYnVmZmVyLiovCisvKiBXZSBzdGFydCBjb3VudGluZyBpbiB0aGUgYnVmZmVyIHdpdGggZW50cnkgMiBhbmQgaW5jcmVtZW50IGZvciBldmVyeQorICAgZW50cnkgKGRvIG5vdCBpbmNyZW1lbnQgZm9yIC4gb3IgLi4gZW50cnkpICovCitzdGF0aWMgaW50IGZpbmRfY2lmc19lbnRyeShjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbiwKKwlzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqKnBwQ3VycmVudEVudHJ5LCBpbnQgKm51bV90b19yZXQpIAoreworCWludCByYyA9IDA7CisJaW50IHBvc19pbl9idWYgPSAwOworCWxvZmZfdCBmaXJzdF9lbnRyeV9pbl9idWZmZXI7CisJbG9mZl90IGluZGV4X3RvX2ZpbmQgPSBmaWxlLT5mX3BvczsKKwlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICogY2lmc0ZpbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJLyogY2hlY2sgaWYgaW5kZXggaW4gdGhlIGJ1ZmZlciAqLworCQorCWlmKChjaWZzRmlsZSA9PSBOVUxMKSB8fCAocHBDdXJyZW50RW50cnkgPT0gTlVMTCkgfHwgKG51bV90b19yZXQgPT0gTlVMTCkpCisJCXJldHVybiAtRU5PRU5UOworCQorCSpwcEN1cnJlbnRFbnRyeSA9IE5VTEw7CisJZmlyc3RfZW50cnlfaW5fYnVmZmVyID0gCisJCWNpZnNGaWxlLT5zcmNoX2luZi5pbmRleF9vZl9sYXN0X2VudHJ5IC0gCisJCQljaWZzRmlsZS0+c3JjaF9pbmYuZW50cmllc19pbl9idWZmZXI7CisvKglkdW1wX2NpZnNfZmlsZV9zdHJ1Y3QoZmlsZSwgIkluIGZjZSAiKTsqLworCWlmKGluZGV4X3RvX2ZpbmQgPCBmaXJzdF9lbnRyeV9pbl9idWZmZXIpIHsKKwkJLyogY2xvc2UgYW5kIHJlc3RhcnQgc2VhcmNoICovCisJCWNGWUkoMSwoInNlYXJjaCBiYWNraW5nIHVwIC0gY2xvc2UgYW5kIHJlc3RhcnQgc2VhcmNoIikpOworCQljaWZzRmlsZS0+aW52YWxpZEhhbmRsZSA9IFRSVUU7CisJCUNJRlNGaW5kQ2xvc2UoeGlkLCBwVGNvbiwgY2lmc0ZpbGUtPm5ldGZpZCk7CisJCWtmcmVlKGNpZnNGaWxlLT5zZWFyY2hfcmVzdW1lX25hbWUpOworCQljaWZzRmlsZS0+c2VhcmNoX3Jlc3VtZV9uYW1lID0gTlVMTDsKKwkJaWYoY2lmc0ZpbGUtPnNyY2hfaW5mLm50d3JrX2J1Zl9zdGFydCkgeworCQkJY0ZZSSgxLCgiZnJlZWluZyBTTUIgZmYgY2FjaGUgYnVmIG9uIHNlYXJjaCByZXdpbmQiKSk7CisJCQljaWZzX2J1Zl9yZWxlYXNlKGNpZnNGaWxlLT5zcmNoX2luZi5udHdya19idWZfc3RhcnQpOworCQl9CisJCXJjID0gaW5pdGlhdGVfY2lmc19zZWFyY2goeGlkLGZpbGUpOworCQlpZihyYykgeworCQkJY0ZZSSgxLCgiZXJyb3IgJWQgcmVpbml0aWF0aW5nIGEgc2VhcmNoIG9uIHJld2luZCIscmMpKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCXdoaWxlKChpbmRleF90b19maW5kID49IGNpZnNGaWxlLT5zcmNoX2luZi5pbmRleF9vZl9sYXN0X2VudHJ5KSAmJiAKKwkgICAgICAocmMgPT0gMCkgJiYgKGNpZnNGaWxlLT5zcmNoX2luZi5lbmRPZlNlYXJjaCA9PSBGQUxTRSkpeworCSAJY0ZZSSgxLCgiY2FsbGluZyBmaW5kbmV4dDIiKSk7CisJCXJjID0gQ0lGU0ZpbmROZXh0KHhpZCxwVGNvbixjaWZzRmlsZS0+bmV0ZmlkLCAmY2lmc0ZpbGUtPnNyY2hfaW5mKTsKKwkJaWYocmMpCisJCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJaWYoaW5kZXhfdG9fZmluZCA8IGNpZnNGaWxlLT5zcmNoX2luZi5pbmRleF9vZl9sYXN0X2VudHJ5KSB7CisJCS8qIHdlIGZvdW5kIHRoZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgZW50cnkgKi8KKwkJLyogc2NhbiBhbmQgZmluZCBpdCAqLworCQlpbnQgaTsKKwkJY2hhciAqIGN1cnJlbnRfZW50cnk7CisJCWNoYXIgKiBlbmRfb2Zfc21iID0gY2lmc0ZpbGUtPnNyY2hfaW5mLm50d3JrX2J1Zl9zdGFydCArIAorCQkJc21iQ2FsY1NpemUoKHN0cnVjdCBzbWJfaGRyICopCisJCQkJY2lmc0ZpbGUtPnNyY2hfaW5mLm50d3JrX2J1Zl9zdGFydCk7CisvKglkdW1wX2NpZnNfZmlsZV9zdHJ1Y3QoZmlsZSwiZm91bmQgZW50cnkgaW4gZmNlICIpOyAqLworCQlmaXJzdF9lbnRyeV9pbl9idWZmZXIgPSBjaWZzRmlsZS0+c3JjaF9pbmYuaW5kZXhfb2ZfbGFzdF9lbnRyeQorCQkJCQktIGNpZnNGaWxlLT5zcmNoX2luZi5lbnRyaWVzX2luX2J1ZmZlcjsKKwkJcG9zX2luX2J1ZiA9IGluZGV4X3RvX2ZpbmQgLSBmaXJzdF9lbnRyeV9pbl9idWZmZXI7CisJCWNGWUkoMSwoImZvdW5kIGVudHJ5IC0gcG9zX2luX2J1ZiAlZCIscG9zX2luX2J1ZikpOyAKKwkJY3VycmVudF9lbnRyeSA9IGNpZnNGaWxlLT5zcmNoX2luZi5zcmNoX2VudHJpZXNfc3RhcnQ7CisJCWZvcihpPTA7KGk8KHBvc19pbl9idWYpKSAmJiAoY3VycmVudF9lbnRyeSAhPSBOVUxMKTtpKyspIHsKKwkJCS8qIGdvIGVudHJ5IHRvIG5leHQgZW50cnkgZmlndXJpbmcgb3V0IHdoaWNoIHdlIG5lZWQgdG8gc3RhcnQgd2l0aCAqLworCQkJLyogaWYoIC4gb3IgLi4pCisJCQkJc2tpcCAqLworCQkJcmMgPSBjaWZzX2VudHJ5X2lzX2RvdChjdXJyZW50X2VudHJ5LGNpZnNGaWxlKTsKKwkJCWlmKHJjID09IDEpIC8qIGlzIC4gb3IgLi4gc28gc2tpcCAqLyB7CisJCQkJY0ZZSSgxLCgiRW50cnkgaXMgLiIpKTsgLyogQkIgcmVtb3ZlbWUgQkIgKi8KKwkJCQkvKiBjb250aW51ZTsgKi8KKwkJCX0gZWxzZSBpZiAocmMgPT0gMiApIHsKKwkJCQljRllJKDEsKCJFbnRyeSBpcyAuLiIpKTsgLyogQkIgcmVtb3ZlbWUgQkIgKi8KKwkJCQkvKiBjb250aW51ZTsgKi8KKwkJCX0KKwkJCWN1cnJlbnRfZW50cnkgPSBueHRfZGlyX2VudHJ5KGN1cnJlbnRfZW50cnksZW5kX29mX3NtYik7CisJCX0KKwkJaWYoKGN1cnJlbnRfZW50cnkgPT0gTlVMTCkgJiYgKGkgPCBwb3NfaW5fYnVmKSkgeworCQkJLyogQkIgZml4bWUgLSBjaGVjayBpZiB3ZSBzaG91bGQgZmxhZyB0aGlzIGVycm9yICovCisJCQljRVJST1IoMSwoInJlYWNoZWQgZW5kIG9mIGJ1ZiBzZWFyY2hpbmcgZm9yIHBvcyBpbiBidWYiCisJCQkgICIgJWQgaW5kZXggdG8gZmluZCAlbGxkIHJjICVkIiwKKwkJCSAgcG9zX2luX2J1ZixpbmRleF90b19maW5kLHJjKSk7CisJCX0KKwkJcmMgPSAwOworCQkqcHBDdXJyZW50RW50cnkgPSBjdXJyZW50X2VudHJ5OworCX0gZWxzZSB7CisJCWNGWUkoMSwoImluZGV4IG5vdCBpbiBidWZmZXIgLSBjb3VsZCBub3QgZmluZG5leHQgaW50byBpdCIpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYocG9zX2luX2J1ZiA+PSBjaWZzRmlsZS0+c3JjaF9pbmYuZW50cmllc19pbl9idWZmZXIpIHsKKwkJY0ZZSSgxLCgiY2FuIG5vdCByZXR1cm4gZW50cmllcyB3aGVuIHBvc19pbl9idWYgYmV5b25kIGxhc3QgZW50cnkiKSk7CisJCSpudW1fdG9fcmV0ID0gMDsKKwl9IGVsc2UKKwkJKm51bV90b19yZXQgPSBjaWZzRmlsZS0+c3JjaF9pbmYuZW50cmllc19pbl9idWZmZXIgLSBwb3NfaW5fYnVmOworLyoJZHVtcF9jaWZzX2ZpbGVfc3RydWN0KGZpbGUsICJlbmQgZmNlICIpOyovCisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGlub2RlIG51bSwgaW5vZGUgdHlwZSBhbmQgZmlsZW5hbWUgcmV0dXJuZWQgKi8KK3N0YXRpYyBpbnQgY2lmc19nZXRfbmFtZV9mcm9tX3NlYXJjaF9idWYoc3RydWN0IHFzdHIgKnBxc3QsCisJY2hhciAqY3VycmVudF9lbnRyeSwgX191MTYgbGV2ZWwsIHVuc2lnbmVkIGludCB1bmljb2RlLAorCXN0cnVjdCBjaWZzX3NiX2luZm8gKiBjaWZzX3NiLCBpbm9fdCAqcGludW0pCit7CisJaW50IHJjID0gMDsKKwl1bnNpZ25lZCBpbnQgbGVuID0gMDsKKwljaGFyICogZmlsZW5hbWU7CisJc3RydWN0IG5sc190YWJsZSAqIG5sdCA9IGNpZnNfc2ItPmxvY2FsX25sczsKKworCSpwaW51bSA9IDA7CisKKwlpZihsZXZlbCA9PSBTTUJfRklORF9GSUxFX1VOSVgpIHsKKwkJRklMRV9VTklYX0lORk8gKiBwRmluZERhdGEgPSAoRklMRV9VTklYX0lORk8gKiljdXJyZW50X2VudHJ5OworCisJCWZpbGVuYW1lID0gJnBGaW5kRGF0YS0+RmlsZU5hbWVbMF07CisJCWlmKHVuaWNvZGUpIHsKKwkJCWxlbiA9IGNpZnNfdW5pY29kZV9ieXRlbGVuKGZpbGVuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEJCIHNob3VsZCB3ZSBtYWtlIHRoaXMgc3RybmxlbiBvZiBQQVRIX01BWD8gKi8KKwkJCWxlbiA9IHN0cm5sZW4oZmlsZW5hbWUsIFBBVEhfTUFYKTsKKwkJfQorCisJCS8qIEJCIGZpeG1lIC0gaGFzaCBsb3cgYW5kIGhpZ2ggMzIgYml0cyBpZiBub3QgNjQgYml0IGFyY2ggQkIgZml4bWUgKi8KKwkJaWYoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1NFUlZFUl9JTlVNKQorCQkJKnBpbnVtID0gcEZpbmREYXRhLT5VbmlxdWVJZDsKKwl9IGVsc2UgaWYobGV2ZWwgPT0gU01CX0ZJTkRfRklMRV9ESVJFQ1RPUllfSU5GTykgeworCQlGSUxFX0RJUkVDVE9SWV9JTkZPICogcEZpbmREYXRhID0gCisJCQkoRklMRV9ESVJFQ1RPUllfSU5GTyAqKWN1cnJlbnRfZW50cnk7CisJCWZpbGVuYW1lID0gJnBGaW5kRGF0YS0+RmlsZU5hbWVbMF07CisJCWxlbiA9IGxlMzJfdG9fY3B1KHBGaW5kRGF0YS0+RmlsZU5hbWVMZW5ndGgpOworCX0gZWxzZSBpZihsZXZlbCA9PSBTTUJfRklORF9GSUxFX0ZVTExfRElSRUNUT1JZX0lORk8pIHsKKwkJRklMRV9GVUxMX0RJUkVDVE9SWV9JTkZPICogcEZpbmREYXRhID0gCisJCQkoRklMRV9GVUxMX0RJUkVDVE9SWV9JTkZPICopY3VycmVudF9lbnRyeTsKKwkJZmlsZW5hbWUgPSAmcEZpbmREYXRhLT5GaWxlTmFtZVswXTsKKwkJbGVuID0gbGUzMl90b19jcHUocEZpbmREYXRhLT5GaWxlTmFtZUxlbmd0aCk7CisJfSBlbHNlIGlmKGxldmVsID09IFNNQl9GSU5EX0ZJTEVfSURfRlVMTF9ESVJfSU5GTykgeworCQlTRUFSQ0hfSURfRlVMTF9ESVJfSU5GTyAqIHBGaW5kRGF0YSA9IAorCQkJKFNFQVJDSF9JRF9GVUxMX0RJUl9JTkZPICopY3VycmVudF9lbnRyeTsKKwkJZmlsZW5hbWUgPSAmcEZpbmREYXRhLT5GaWxlTmFtZVswXTsKKwkJbGVuID0gbGUzMl90b19jcHUocEZpbmREYXRhLT5GaWxlTmFtZUxlbmd0aCk7CisJCSpwaW51bSA9IHBGaW5kRGF0YS0+VW5pcXVlSWQ7CisJfSBlbHNlIGlmKGxldmVsID09IFNNQl9GSU5EX0ZJTEVfQk9USF9ESVJFQ1RPUllfSU5GTykgeworCQlGSUxFX0JPVEhfRElSRUNUT1JZX0lORk8gKiBwRmluZERhdGEgPSAKKwkJCShGSUxFX0JPVEhfRElSRUNUT1JZX0lORk8gKiljdXJyZW50X2VudHJ5OworCQlmaWxlbmFtZSA9ICZwRmluZERhdGEtPkZpbGVOYW1lWzBdOworCQlsZW4gPSBsZTMyX3RvX2NwdShwRmluZERhdGEtPkZpbGVOYW1lTGVuZ3RoKTsKKwl9IGVsc2UgeworCQljRllJKDEsKCJVbmtub3duIGZpbmRmaXJzdCBsZXZlbCAlZCIsbGV2ZWwpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmKHVuaWNvZGUpIHsKKwkJLyogQkIgZml4bWUgLSB0ZXN0IHdpdGggbG9uZyBuYW1lcyAqLworCQkvKiBOb3RlIGNvbnZlcnRlZCBmaWxlbmFtZSBjYW4gYmUgbG9uZ2VyIHRoYW4gaW4gdW5pY29kZSAqLworCQlwcXN0LT5sZW4gPSBjaWZzX3N0cmZyb21VQ1NfbGUoKGNoYXIgKilwcXN0LT5uYW1lLCh3Y2hhcl90ICopZmlsZW5hbWUsbGVuLzIsbmx0KTsKKwl9IGVsc2UgeworCQlwcXN0LT5uYW1lID0gZmlsZW5hbWU7CisJCXBxc3QtPmxlbiA9IGxlbjsKKwl9CisJcHFzdC0+aGFzaCA9IGZ1bGxfbmFtZV9oYXNoKHBxc3QtPm5hbWUscHFzdC0+bGVuKTsKKy8qCWNGWUkoMSwoImZpbGxkaXIgb24gJXMiLHBxc3QtPm5hbWUpKTsgICovCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGNpZnNfZmlsbGRpcihjaGFyICpwZmluZEVudHJ5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwlmaWxsZGlyX3QgZmlsbGRpciwgdm9pZCAqZGlyZW50cnksIGNoYXIgKnNjcmF0Y2hfYnVmKQoreworCWludCByYyA9IDA7CisJc3RydWN0IHFzdHIgcXN0cmluZzsKKwlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICogcENpZnNGOworCXVuc2lnbmVkIG9ial90eXBlOworCWlub190ICBpbnVtOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKiBjaWZzX3NiOworCXN0cnVjdCBpbm9kZSAqdG1wX2lub2RlOworCXN0cnVjdCBkZW50cnkgKnRtcF9kZW50cnk7CisKKwkvKiBnZXQgZmlsZW5hbWUgYW5kIGxlbiBpbnRvIHFzdHJpbmcgKi8KKwkvKiBnZXQgZGVudHJ5ICovCisJLyogZGVjaWRlIHdoZXRoZXIgdG8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBpb25kZSAqLworCWlmKChkaXJlbnRyeSA9PSBOVUxMKSB8fCAoZmlsZSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwQ2lmc0YgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCisJaWYoKHNjcmF0Y2hfYnVmID09IE5VTEwpIHx8IChwZmluZEVudHJ5ID09IE5VTEwpIHx8IChwQ2lmc0YgPT0gTlVMTCkpCisJCXJldHVybiAtRU5PRU5UOworCisJaWYoZmlsZS0+Zl9kZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwljaWZzX3NiID0gQ0lGU19TQihmaWxlLT5mX2RlbnRyeS0+ZF9zYik7CisKKwlxc3RyaW5nLm5hbWUgPSBzY3JhdGNoX2J1ZjsKKwlyYyA9IGNpZnNfZ2V0X25hbWVfZnJvbV9zZWFyY2hfYnVmKCZxc3RyaW5nLHBmaW5kRW50cnksCisJCQlwQ2lmc0YtPnNyY2hfaW5mLmluZm9fbGV2ZWwsCisJCQlwQ2lmc0YtPnNyY2hfaW5mLnVuaWNvZGUsY2lmc19zYiwKKwkJCSZpbnVtIC8qIHJldHVybmVkICovKTsKKworCWlmKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IGNvbnN0cnVjdF9kZW50cnkoJnFzdHJpbmcsZmlsZSwmdG1wX2lub2RlLCAmdG1wX2RlbnRyeSk7CisJaWYoKHRtcF9pbm9kZSA9PSBOVUxMKSB8fCAodG1wX2RlbnRyeSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZihyYykgeworCQkvKiBpbm9kZSBjcmVhdGVkLCB3ZSBuZWVkIHRvIGhhc2ggaXQgd2l0aCByaWdodCBpbm9kZSBudW1iZXIgKi8KKwkJaWYoaW51bSAhPSAwKSB7CisJCQkvKiBCQiBmaXhtZSAtIGhhc2ggdGhlIDIgMzIgcXVhbnRpdGllcyBiaXRzIHRvZ2V0aGVyIGlmIG5lY2Vzc2FyeSBCQiAqLworCQkJdG1wX2lub2RlLT5pX2lubyA9IGludW07CisJCX0KKwkJaW5zZXJ0X2lub2RlX2hhc2godG1wX2lub2RlKTsKKwl9CisKKwlpZihwQ2lmc0YtPnNyY2hfaW5mLmluZm9fbGV2ZWwgPT0gU01CX0ZJTkRfRklMRV9VTklYKSB7CisJCXVuaXhfZmlsbF9pbl9pbm9kZSh0bXBfaW5vZGUsKEZJTEVfVU5JWF9JTkZPICopcGZpbmRFbnRyeSwmb2JqX3R5cGUpOworCX0gZWxzZSB7CisJCWZpbGxfaW5faW5vZGUodG1wX2lub2RlLChGSUxFX0RJUkVDVE9SWV9JTkZPICopcGZpbmRFbnRyeSwmb2JqX3R5cGUpOworCX0KKwkKKwlyYyA9IGZpbGxkaXIoZGlyZW50cnkscXN0cmluZy5uYW1lLHFzdHJpbmcubGVuLGZpbGUtPmZfcG9zLHRtcF9pbm9kZS0+aV9pbm8sb2JqX3R5cGUpOworCWlmKHJjKSB7CisJCWNGWUkoMSwoImZpbGxkaXIgcmMgPSAlZCIscmMpKTsKKwl9CisKKwlkcHV0KHRtcF9kZW50cnkpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjaWZzX3NhdmVfcmVzdW1lX2tleShjb25zdCBjaGFyICpjdXJyZW50X2VudHJ5LAorCXN0cnVjdCBjaWZzRmlsZUluZm8gKmNpZnNGaWxlKQoreworCWludCByYyA9IDA7CisJdW5zaWduZWQgaW50IGxlbiA9IDA7CisJX191MTYgbGV2ZWw7CisJY2hhciAqIGZpbGVuYW1lOworCisJaWYoKGNpZnNGaWxlID09IE5VTEwpIHx8IChjdXJyZW50X2VudHJ5ID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxldmVsID0gY2lmc0ZpbGUtPnNyY2hfaW5mLmluZm9fbGV2ZWw7CisKKwlpZihsZXZlbCA9PSBTTUJfRklORF9GSUxFX1VOSVgpIHsKKwkJRklMRV9VTklYX0lORk8gKiBwRmluZERhdGEgPSAoRklMRV9VTklYX0lORk8gKiljdXJyZW50X2VudHJ5OworCisJCWZpbGVuYW1lID0gJnBGaW5kRGF0YS0+RmlsZU5hbWVbMF07CisJCWlmKGNpZnNGaWxlLT5zcmNoX2luZi51bmljb2RlKSB7CisJCQlsZW4gPSBjaWZzX3VuaWNvZGVfYnl0ZWxlbihmaWxlbmFtZSk7CisJCX0gZWxzZSB7CisJCQkvKiBCQiBzaG91bGQgd2UgbWFrZSB0aGlzIHN0cm5sZW4gb2YgUEFUSF9NQVg/ICovCisJCQlsZW4gPSBzdHJubGVuKGZpbGVuYW1lLCBQQVRIX01BWCk7CisJCX0KKwkJY2lmc0ZpbGUtPnNyY2hfaW5mLnJlc3VtZV9rZXkgPSBwRmluZERhdGEtPlJlc3VtZUtleTsKKwl9IGVsc2UgaWYobGV2ZWwgPT0gU01CX0ZJTkRfRklMRV9ESVJFQ1RPUllfSU5GTykgeworCQlGSUxFX0RJUkVDVE9SWV9JTkZPICogcEZpbmREYXRhID0gCisJCQkoRklMRV9ESVJFQ1RPUllfSU5GTyAqKWN1cnJlbnRfZW50cnk7CisJCWZpbGVuYW1lID0gJnBGaW5kRGF0YS0+RmlsZU5hbWVbMF07CisJCWxlbiA9IGxlMzJfdG9fY3B1KHBGaW5kRGF0YS0+RmlsZU5hbWVMZW5ndGgpOworCQljaWZzRmlsZS0+c3JjaF9pbmYucmVzdW1lX2tleSA9IHBGaW5kRGF0YS0+RmlsZUluZGV4OworCX0gZWxzZSBpZihsZXZlbCA9PSBTTUJfRklORF9GSUxFX0ZVTExfRElSRUNUT1JZX0lORk8pIHsKKwkJRklMRV9GVUxMX0RJUkVDVE9SWV9JTkZPICogcEZpbmREYXRhID0gCisJCQkoRklMRV9GVUxMX0RJUkVDVE9SWV9JTkZPICopY3VycmVudF9lbnRyeTsKKwkJZmlsZW5hbWUgPSAmcEZpbmREYXRhLT5GaWxlTmFtZVswXTsKKwkJbGVuID0gbGUzMl90b19jcHUocEZpbmREYXRhLT5GaWxlTmFtZUxlbmd0aCk7CisJCWNpZnNGaWxlLT5zcmNoX2luZi5yZXN1bWVfa2V5ID0gcEZpbmREYXRhLT5GaWxlSW5kZXg7CisJfSBlbHNlIGlmKGxldmVsID09IFNNQl9GSU5EX0ZJTEVfSURfRlVMTF9ESVJfSU5GTykgeworCQlTRUFSQ0hfSURfRlVMTF9ESVJfSU5GTyAqIHBGaW5kRGF0YSA9IAorCQkJKFNFQVJDSF9JRF9GVUxMX0RJUl9JTkZPICopY3VycmVudF9lbnRyeTsKKwkJZmlsZW5hbWUgPSAmcEZpbmREYXRhLT5GaWxlTmFtZVswXTsKKwkJbGVuID0gbGUzMl90b19jcHUocEZpbmREYXRhLT5GaWxlTmFtZUxlbmd0aCk7CisJCWNpZnNGaWxlLT5zcmNoX2luZi5yZXN1bWVfa2V5ID0gcEZpbmREYXRhLT5GaWxlSW5kZXg7CisJfSBlbHNlIGlmKGxldmVsID09IFNNQl9GSU5EX0ZJTEVfQk9USF9ESVJFQ1RPUllfSU5GTykgeworCQlGSUxFX0JPVEhfRElSRUNUT1JZX0lORk8gKiBwRmluZERhdGEgPSAKKwkJCShGSUxFX0JPVEhfRElSRUNUT1JZX0lORk8gKiljdXJyZW50X2VudHJ5OworCQlmaWxlbmFtZSA9ICZwRmluZERhdGEtPkZpbGVOYW1lWzBdOworCQlsZW4gPSBsZTMyX3RvX2NwdShwRmluZERhdGEtPkZpbGVOYW1lTGVuZ3RoKTsKKwkJY2lmc0ZpbGUtPnNyY2hfaW5mLnJlc3VtZV9rZXkgPSBwRmluZERhdGEtPkZpbGVJbmRleDsKKwl9IGVsc2UgeworCQljRllJKDEsKCJVbmtub3duIGZpbmRmaXJzdCBsZXZlbCAlZCIsbGV2ZWwpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNpZnNGaWxlLT5zcmNoX2luZi5yZXN1bWVfbmFtZV9sZW4gPSBsZW47CisJY2lmc0ZpbGUtPnNyY2hfaW5mLnByZXN1bWVfbmFtZSA9IGZpbGVuYW1lOworCXJldHVybiByYzsKK30KKworaW50IGNpZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZGlyZW50cnksIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCWludCByYyA9IDA7CisJaW50IHhpZCxpOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqY2lmc0ZpbGUgPSBOVUxMOworCWNoYXIgKiBjdXJyZW50X2VudHJ5OworCWludCBudW1fdG9fZmlsbCA9IDA7CisJY2hhciAqIHRtcF9idWYgPSBOVUxMOworCWNoYXIgKiBlbmRfb2Zfc21iOworCisJeGlkID0gR2V0WGlkKCk7CisKKwlpZihmaWxlLT5mX2RlbnRyeSA9PSBOVUxMKSB7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorLyoJZHVtcF9jaWZzX2ZpbGVfc3RydWN0KGZpbGUsICJCZWdpbiByZGlyICIpOyAqLworCisJY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKwlpZihwVGNvbiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworLyoJY0ZZSSgxLCgicmVhZGRpcjIgcG9zOiAlbGxkIixmaWxlLT5mX3BvcykpOyAqLworCisJc3dpdGNoICgoaW50KSBmaWxlLT5mX3BvcykgeworCWNhc2UgMDoKKwkJLyppZiAoZmlsbGRpcihkaXJlbnRyeSwgIi4iLCAxLCBmaWxlLT5mX3BvcywKKwkJICAgICBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8sIERUX0RJUikgPCAwKSB7CisJCQljRVJST1IoMSwgKCJGaWxsZGlyIGZvciBjdXJyZW50IGRpciBmYWlsZWQgIikpOworCQkJcmMgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwkJZmlsZS0+Zl9wb3MrKzsgKi8KKwljYXNlIDE6CisJCS8qIGlmIChmaWxsZGlyKGRpcmVudHJ5LCAiLi4iLCAyLCBmaWxlLT5mX3BvcywKKwkJICAgICBmaWxlLT5mX2RlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfaW5vLCBEVF9ESVIpIDwgMCkgeworCQkJY0VSUk9SKDEsICgiRmlsbGRpciBmb3IgcGFyZW50IGRpciBmYWlsZWQgIikpOworCQkJcmMgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwkJZmlsZS0+Zl9wb3MrKzsgKi8KKwljYXNlIDI6CisJCS8qIDEpIElmIHNlYXJjaCBpcyBhY3RpdmUsIAorCQkJaXMgaW4gY3VycmVudCBzZWFyY2ggYnVmZmVyPyAKKwkJCWlmIGl0IGJlZm9yZSB0aGVuIHJlc3RhcnQgc2VhcmNoCisJCQlpZiBhZnRlciB0aGVuIGtlZXAgc2VhcmNoaW5nIHRpbGwgZmluZCBpdCAqLworCisJCWlmKGZpbGUtPnByaXZhdGVfZGF0YSA9PSBOVUxMKSB7CisJCQlyYyA9IGluaXRpYXRlX2NpZnNfc2VhcmNoKHhpZCxmaWxlKTsKKwkJCWNGWUkoMSwoImluaXRpYXRlIGNpZnMgc2VhcmNoIHJjICVkIixyYykpOworCQkJaWYocmMpIHsKKwkJCQlGcmVlWGlkKHhpZCk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9CisJZGVmYXVsdDoKKwkJaWYoZmlsZS0+cHJpdmF0ZV9kYXRhID09IE5VTEwpIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCUZyZWVYaWQoeGlkKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQljaWZzRmlsZSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkJaWYgKGNpZnNGaWxlLT5zcmNoX2luZi5lbmRPZlNlYXJjaCkgeworCQkJaWYoY2lmc0ZpbGUtPnNyY2hfaW5mLmVtcHR5RGlyKSB7CisJCQkJY0ZZSSgxLCAoIkVuZCBvZiBzZWFyY2gsIGVtcHR5IGRpciIpKTsKKwkJCQlyYyA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gLyogZWxzZSB7CisJCQljaWZzRmlsZS0+aW52YWxpZEhhbmRsZSA9IFRSVUU7CisJCQlDSUZTRmluZENsb3NlKHhpZCwgcFRjb24sIGNpZnNGaWxlLT5uZXRmaWQpOworCQl9IAorCQlrZnJlZShjaWZzRmlsZS0+c2VhcmNoX3Jlc3VtZV9uYW1lKTsKKwkJY2lmc0ZpbGUtPnNlYXJjaF9yZXN1bWVfbmFtZSA9IE5VTEw7ICovCisKKwkJLyogQkIgYWNjb3VudCBmb3IgLiBhbmQgLi4gaW4gZl9wb3MgYXMgc3BlY2lhbCBjYXNlICovCisJCS8qIGR1bXBfY2lmc19maWxlX3N0cnVjdChmaWxlLCAicmRpciBhZnRlciBkZWZhdWx0ICIpOyovCisKKwkJcmMgPSBmaW5kX2NpZnNfZW50cnkoeGlkLHBUY29uLCBmaWxlLAorCQkJCSZjdXJyZW50X2VudHJ5LCZudW1fdG9fZmlsbCk7CisJCWlmKHJjKSB7CisJCQljRllJKDEsKCJmY2UgZXJyb3IgJWQiLHJjKSk7IAorCQkJZ290byByZGRpcjJfZXhpdDsKKwkJfSBlbHNlIGlmIChjdXJyZW50X2VudHJ5ICE9IE5VTEwpIHsKKwkJCWNGWUkoMSwoImVudHJ5ICVsbGQgZm91bmQiLGZpbGUtPmZfcG9zKSk7CisJCX0gZWxzZSB7CisJCQljRllJKDEsKCJjb3VsZCBub3QgZmluZCBlbnRyeSIpKTsKKwkJCWdvdG8gcmRkaXIyX2V4aXQ7CisJCX0KKwkJY0ZZSSgxLCgibG9vcCB0aHJvdWdoICVkIHRpbWVzIGZpbGxpbmcgZGlyIGZvciBuZXQgYnVmICVwIiwKKwkJCW51bV90b19maWxsLGNpZnNGaWxlLT5zcmNoX2luZi5udHdya19idWZfc3RhcnQpKTsgCisJCWVuZF9vZl9zbWIgPSBjaWZzRmlsZS0+c3JjaF9pbmYubnR3cmtfYnVmX3N0YXJ0ICsKKwkJCXNtYkNhbGNTaXplKChzdHJ1Y3Qgc21iX2hkciAqKQorCQkJCSAgICBjaWZzRmlsZS0+c3JjaF9pbmYubnR3cmtfYnVmX3N0YXJ0KTsKKwkJdG1wX2J1ZiA9IGttYWxsb2MoTkFNRV9NQVgrMSxHRlBfS0VSTkVMKTsKKwkJZm9yKGk9MDsoaTxudW1fdG9fZmlsbCkgJiYgKHJjID09IDApO2krKykgeworCQkJaWYoY3VycmVudF9lbnRyeSA9PSBOVUxMKSB7CisJCQkJLyogZXZhbHVhdGUgd2hldGhlciB0aGlzIGNhc2UgaXMgYW4gZXJyb3IgKi8KKwkJCQljRVJST1IoMSwoInBhc3QgZW5kIG9mIFNNQiBudW0gdG8gZmlsbCAlZCBpICVkIiwKKwkJCQkJICBudW1fdG9fZmlsbCwgaSkpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBCQiBGSVhNRSAtIG5lZWQgdG8gZW5hYmxlIHRoZSBiZWxvdyBjb2RlIEJCICovCisKKwkJLyogaWYoKCEoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1NFUlZFUl9JTlVNKSkgfHwKKwkJCSAgIChjaWZzRmlsZS0+c3JjaF9pbmYuaW5mb19sZXZlbCAhPSAKKwkJCQkgICBzb21ldGhpbmcgdGhhdCBzdXBwb3J0cyBzZXJ2ZXIgaW5vZGVzKSkgeworCQkJCWNyZWF0ZSBkZW50cnkKKwkJCQljcmVhdGUgaW5vZGUKKwkJCQlmaWxsIGluIGlub2RlIG5ld19pbm9kZSAoZ2V0dGluZyBsb2NhbCBpX2lubykKKwkJCX0KKwkJCWFsc28gY3JlYXRlIGxvY2FsIGlub2RlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIChzbyB3ZSAKKwkJCWhhdmUgYSBjYWNoZSBvZiBpbm9kZSBtZXRhZGF0YSkgdW5sZXNzIHRoaXMgbmV3IG1vdW50IAorCQkJcGFybSBzYXlzIG90aGVyd2lzZSAqLworCisJCQlyYyA9IGNpZnNfZmlsbGRpcihjdXJyZW50X2VudHJ5LCBmaWxlLCAKKwkJCQkJZmlsbGRpciwgZGlyZW50cnksdG1wX2J1Zik7CisJCQlmaWxlLT5mX3BvcysrOworCQkJaWYoZmlsZS0+Zl9wb3MgPT0gY2lmc0ZpbGUtPnNyY2hfaW5mLmluZGV4X29mX2xhc3RfZW50cnkpIHsKKwkJCQljRllJKDEsKCJsYXN0IGVudHJ5IGluIGJ1ZiBhdCBwb3MgJWxsZCAlcyIsCisJCQkJCWZpbGUtPmZfcG9zLHRtcF9idWYpKTsgLyogQkIgcmVtb3ZlbWUgQkIgKi8KKwkJCQljaWZzX3NhdmVfcmVzdW1lX2tleShjdXJyZW50X2VudHJ5LGNpZnNGaWxlKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSAKKwkJCQljdXJyZW50X2VudHJ5ID0gbnh0X2Rpcl9lbnRyeShjdXJyZW50X2VudHJ5LGVuZF9vZl9zbWIpOworCQl9CisJCWtmcmVlKHRtcF9idWYpOworCQlicmVhazsKKwl9IC8qIGVuZCBzd2l0Y2ggKi8KKworcmRkaXIyX2V4aXQ6CisJLyogZHVtcF9jaWZzX2ZpbGVfc3RydWN0KGZpbGUsICJlbmQgcmRpciAiKTsgICovCisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvcmZjMTAwMnBkdS5oIGIvZnMvY2lmcy9yZmMxMDAycGR1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA2YzBlZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NpZnMvcmZjMTAwMnBkdS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiAgIGZzL2NpZnMvcmZjMTAwMnBkdS5oCisgKgorICogICBQcm90b2NvbCBEYXRhIFVuaXQgZGVmaW5pdGlvbnMgZm9yIFJGQyAxMDAxLzEwMDIgc3VwcG9ydAorICoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwNAorICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIAorICovCisKKyNwcmFnbWEgcGFjaygxKQorCisvKiBOQjogdW5saWtlIHNtYi9jaWZzIHBhY2tldHMsIHRoZSBSRkMxMDAyIHN0cnVjdHVyZXMgYXJlIGJpZyBlbmRpYW4gKi8KKworCS8qIFJGQyAxMDAyIHNlc3Npb24gcGFja2V0IHR5cGVzICovCisjZGVmaW5lIFJGQzEwMDJfU0VTU0lPTl9NRVNBU0FHRSAweDAwCisjZGVmaW5lIFJGQzEwMDJfU0VTU0lPTl9SRVFVRVNUICAweDgxCisjZGVmaW5lIFJGQzEwMDJfUE9TSVRJVkVfU0VTU0lPTl9SRVNQT05TRSAweDgyCisjZGVmaW5lIFJGQzEwMDJfTkVHQVRJVkVfU0VTU0lPTl9SRVNQT05TRSAweDgzCisjZGVmaW5lIFJGQzEwMDJfUkVUQVJHRVRfU0VTU0lPTl9SRVNQT05TRSAweDgzCisjZGVmaW5lIFJGQzEwMDJfU0VTU0lPTl9LRUVQX0FMSVZFIDB4ODUKKworCS8qIFJGQyAxMDAyIGZsYWdzIChvbmx5IG9uZSBkZWZpbmVkICovCisjZGVmaW5lIFJGQzEwMDJfTEVOR1RIX0VYVEVORCAweDgwIC8qIGhpZ2ggb3JkZXIgYml0IG9mIGxlbmd0aCAoaWUgKzY0SykgKi8KKworc3RydWN0IHJmYzEwMDJfc2Vzc2lvbl9wYWNrZXQgeworCV9fdTgJdHlwZTsKKwlfX3U4CWZsYWdzOworCV9fdTE2CWxlbmd0aDsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3U4IGNhbGxlZF9sZW47CisJCQlfX3U4IGNhbGxlZF9uYW1lWzMyXTsKKwkJCV9fdTggc2NvcGUxOyAvKiBudWxsICovCisJCQlfX3U4IGNhbGxpbmdfbGVuOworCQkJX191OCBjYWxsaW5nX25hbWVbMzJdOworCQkJX191OCBzY29wZTI7IC8qIG51bGwgKi8KKwkJfSBzZXNzaW9uX3JlcTsKKwkJc3RydWN0IHsKKwkJCV9fdTMyIHJldGFyZ2V0X2lwX2FkZHI7CisJCQlfX3UxNiBwb3J0OworCQl9IHJldGFyZ2V0X3Jlc3A7CisJCV9fdTggbmVnX3Nlc19yZXNwX2Vycm9yX2NvZGU7CisJCS8qIFBPU0lUSVZFX1NFU1NJT05fUkVTUE9OU0UgcGFja2V0IGRvZXMgbm90IGluY2x1ZGUgdHJhaWxlci4KKwkJU0VTU0lPTl9LRUVQX0FMSVZFIHBhY2tldCBhbHNvIGRvZXMgbm90IGluY2x1ZGUgYSB0cmFpbGVyLgorCQlUcmFpbGVyIGZvciB0aGUgU0VTU0lPTl9NRVNTQUdFIHBhY2tldCBpcyBTTUIvQ0lGUyBoZWFkZXIgKi8KKwl9IHRyYWlsZXI7Cit9OworCisvKiBOZWdhdGl2ZSBTZXNzaW9uIFJlc3BvbnNlIGVycm9yIGNvZGVzICovCisjZGVmaW5lIFJGQzEwMDJfTk9UX0xJU1RFTklOR19DQUxMRUQgIDB4ODAgLyogbm90IGxpc3RlbmluZyBvbiBjYWxsZWQgbmFtZSAqLworI2RlZmluZSBSRkMxMDAyX05PVF9MSVNURU5JTkdfQ0FMTElORyAweDgxIC8qIG5vdCBsaXN0ZW5pbmcgb24gY2FsbGluZyBuYW1lICovCisjZGVmaW5lIFJGQzEwMDJfTk9UX1BSRVNFTlQgICAgICAgICAgIDB4ODIgLyogY2FsbGVkIG5hbWUgbm90IHByZXNlbnQgKi8KKyNkZWZpbmUgUkZDMTAwMl9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0UgMHg4MworI2RlZmluZSBSRkMxMDAyX1VOU1BFQ0lGSUVEX0VSUk9SICAgICAweDhGCisKKy8qIFJGQyAxMDAyIERhdGFncmFtIHNlcnZpY2UgcGFja2V0cyBhcmUgbm90IGRlZmluZWQgaGVyZSBhcyB0aGV5CithcmUgbm90IG5lZWRlZCBmb3IgdGhlIG5ldHdvcmsgZmlsZXN5c3RlbSBjbGllbnQgdW5sZXNzIHdlIHBsYW4gb24KK2ltcGxlbWVudGluZyBicm9hZGNhc3QgcmVzb2x1dGlvbiBvZiB0aGUgc2VydmVyIGlwIGFkZHJlc3MgKGZyb20KK3NlcnZlciBuZXRiaW9zIG5hbWUpLiBDdXJyZW50bHkgc2VydmVyIG5hbWVzIGFyZSByZXNvbHZlZCBvbmx5IHZpYSBETlMKKyh0Y3AgbmFtZSkgb3IgaXAgYWRkcmVzcyBvciBhbiAvZXRjL2hvc3RzIGVxdWl2YWxlbnQgbWFwcGluZyB0byBpcCBhZGRyZXNzLiovCisKKyNkZWZpbmUgREVGQVVMVF9DSUZTX0NBTExFRF9OQU1FICAiKlNNQlNFUlZFUiAgICAgICIKKworI3ByYWdtYSBwYWNrKCkJCS8qIHJlc3VtZSBkZWZhdWx0IHN0cnVjdHVyZSBwYWNraW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9mcy9jaWZzL3NtYmRlcy5jIGIvZnMvY2lmcy9zbWJkZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmFhMDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9zbWJkZXMuYwpAQCAtMCwwICsxLDQxMiBAQAorLyogCisgICBVbml4IFNNQi9OZXRiaW9zIGltcGxlbWVudGF0aW9uLgorICAgVmVyc2lvbiAxLjkuCisKKyAgIGEgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBERVMgZGVzaWduZWQgZm9yIHVzZSBpbiB0aGUgCisgICBTTUIgYXV0aGVudGljYXRpb24gcHJvdG9jb2wKKworICAgQ29weXJpZ2h0IChDKSBBbmRyZXcgVHJpZGdlbGwgMTk5OAorICAgTW9kaWZpZWQgYnkgU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pIDIwMDIsMjAwNAorICAgCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAgCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyogTk9URVM6IAorCisgICBUaGlzIGNvZGUgbWFrZXMgbm8gYXR0ZW1wdCB0byBiZSBmYXN0ISBJbiBmYWN0LCBpdCBpcyBhIHZlcnkKKyAgIHNsb3cgaW1wbGVtZW50YXRpb24gCisKKyAgIFRoaXMgY29kZSBpcyBOT1QgYSBjb21wbGV0ZSBERVMgaW1wbGVtZW50YXRpb24uIEl0IGltcGxlbWVudHMgb25seQorICAgdGhlIG1pbmltdW0gbmVjZXNzYXJ5IGZvciBTTUIgYXV0aGVudGljYXRpb24sIGFzIHVzZWQgYnkgYWxsIFNNQgorICAgcHJvZHVjdHMgKGluY2x1ZGluZyBldmVyeSBjb3B5IG9mIE1pY3Jvc29mdCBXaW5kb3dzOTUgZXZlciBzb2xkKQorCisgICBJbiBwYXJ0aWN1bGFyLCBpdCBjYW4gb25seSBkbyBhIHVuY2hhaW5lZCBmb3J3YXJkIERFUyBwYXNzLiBUaGlzCisgICBtZWFucyBpdCBpcyBub3QgcG9zc2libGUgdG8gdXNlIHRoaXMgY29kZSBmb3IgZW5jcnlwdGlvbi9kZWNyeXB0aW9uCisgICBvZiBkYXRhLCBpbnN0ZWFkIGl0IGlzIG9ubHkgdXNlZnVsIGFzIGEgImhhc2giIGFsZ29yaXRobS4KKworICAgVGhlcmUgaXMgbm8gZW50cnkgcG9pbnQgaW50byB0aGlzIGNvZGUgdGhhdCBhbGxvd3Mgbm9ybWFsIERFUyBvcGVyYXRpb24uCisKKyAgIEkgYmVsaWV2ZSB0aGlzIG1lYW5zIHRoYXQgdGhpcyBjb2RlIGRvZXMgbm90IGNvbWUgdW5kZXIgSVRBUgorICAgcmVndWxhdGlvbnMgYnV0IHRoaXMgaXMgTk9UIGEgbGVnYWwgb3Bpbmlvbi4gSWYgeW91IGFyZSBjb25jZXJuZWQKKyAgIGFib3V0IHRoZSBhcHBsaWNhYmlsaXR5IG9mIElUQVIgcmVndWxhdGlvbnMgdG8gdGhpcyBjb2RlIHRoZW4geW91CisgICBzaG91bGQgY29uZmlybSBpdCBmb3IgeW91cnNlbGYgKGFuZCBtYXliZSBsZXQgbWUga25vdyBpZiB5b3UgY29tZQorICAgdXAgd2l0aCBhIGRpZmZlcmVudCBhbnN3ZXIgdG8gdGhlIG9uZSBhYm92ZSkKKyovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImNpZnNlbmNyeXB0LmgiCisjZGVmaW5lIHVjaGFyIHVuc2lnbmVkIGNoYXIKKworc3RhdGljIHVjaGFyIHBlcm0xWzU2XSA9IHsgNTcsIDQ5LCA0MSwgMzMsIDI1LCAxNywgOSwKKwkxLCA1OCwgNTAsIDQyLCAzNCwgMjYsIDE4LAorCTEwLCAyLCA1OSwgNTEsIDQzLCAzNSwgMjcsCisJMTksIDExLCAzLCA2MCwgNTIsIDQ0LCAzNiwKKwk2MywgNTUsIDQ3LCAzOSwgMzEsIDIzLCAxNSwKKwk3LCA2MiwgNTQsIDQ2LCAzOCwgMzAsIDIyLAorCTE0LCA2LCA2MSwgNTMsIDQ1LCAzNywgMjksCisJMjEsIDEzLCA1LCAyOCwgMjAsIDEyLCA0Cit9OworCitzdGF0aWMgdWNoYXIgcGVybTJbNDhdID0geyAxNCwgMTcsIDExLCAyNCwgMSwgNSwKKwkzLCAyOCwgMTUsIDYsIDIxLCAxMCwKKwkyMywgMTksIDEyLCA0LCAyNiwgOCwKKwkxNiwgNywgMjcsIDIwLCAxMywgMiwKKwk0MSwgNTIsIDMxLCAzNywgNDcsIDU1LAorCTMwLCA0MCwgNTEsIDQ1LCAzMywgNDgsCisJNDQsIDQ5LCAzOSwgNTYsIDM0LCA1MywKKwk0NiwgNDIsIDUwLCAzNiwgMjksIDMyCit9OworCitzdGF0aWMgdWNoYXIgcGVybTNbNjRdID0geyA1OCwgNTAsIDQyLCAzNCwgMjYsIDE4LCAxMCwgMiwKKwk2MCwgNTIsIDQ0LCAzNiwgMjgsIDIwLCAxMiwgNCwKKwk2MiwgNTQsIDQ2LCAzOCwgMzAsIDIyLCAxNCwgNiwKKwk2NCwgNTYsIDQ4LCA0MCwgMzIsIDI0LCAxNiwgOCwKKwk1NywgNDksIDQxLCAzMywgMjUsIDE3LCA5LCAxLAorCTU5LCA1MSwgNDMsIDM1LCAyNywgMTksIDExLCAzLAorCTYxLCA1MywgNDUsIDM3LCAyOSwgMjEsIDEzLCA1LAorCTYzLCA1NSwgNDcsIDM5LCAzMSwgMjMsIDE1LCA3Cit9OworCitzdGF0aWMgdWNoYXIgcGVybTRbNDhdID0geyAzMiwgMSwgMiwgMywgNCwgNSwKKwk0LCA1LCA2LCA3LCA4LCA5LAorCTgsIDksIDEwLCAxMSwgMTIsIDEzLAorCTEyLCAxMywgMTQsIDE1LCAxNiwgMTcsCisJMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwKKwkyMCwgMjEsIDIyLCAyMywgMjQsIDI1LAorCTI0LCAyNSwgMjYsIDI3LCAyOCwgMjksCisJMjgsIDI5LCAzMCwgMzEsIDMyLCAxCit9OworCitzdGF0aWMgdWNoYXIgcGVybTVbMzJdID0geyAxNiwgNywgMjAsIDIxLAorCTI5LCAxMiwgMjgsIDE3LAorCTEsIDE1LCAyMywgMjYsCisJNSwgMTgsIDMxLCAxMCwKKwkyLCA4LCAyNCwgMTQsCisJMzIsIDI3LCAzLCA5LAorCTE5LCAxMywgMzAsIDYsCisJMjIsIDExLCA0LCAyNQorfTsKKworc3RhdGljIHVjaGFyIHBlcm02WzY0XSA9IHsgNDAsIDgsIDQ4LCAxNiwgNTYsIDI0LCA2NCwgMzIsCisJMzksIDcsIDQ3LCAxNSwgNTUsIDIzLCA2MywgMzEsCisJMzgsIDYsIDQ2LCAxNCwgNTQsIDIyLCA2MiwgMzAsCisJMzcsIDUsIDQ1LCAxMywgNTMsIDIxLCA2MSwgMjksCisJMzYsIDQsIDQ0LCAxMiwgNTIsIDIwLCA2MCwgMjgsCisJMzUsIDMsIDQzLCAxMSwgNTEsIDE5LCA1OSwgMjcsCisJMzQsIDIsIDQyLCAxMCwgNTAsIDE4LCA1OCwgMjYsCisJMzMsIDEsIDQxLCA5LCA0OSwgMTcsIDU3LCAyNQorfTsKKworc3RhdGljIHVjaGFyIHNjWzE2XSA9IHsgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMSB9OworCitzdGF0aWMgdWNoYXIgc2JveFs4XVs0XVsxNl0gPSB7CisJe3sxNCwgNCwgMTMsIDEsIDIsIDE1LCAxMSwgOCwgMywgMTAsIDYsIDEyLCA1LCA5LCAwLCA3fSwKKwkgezAsIDE1LCA3LCA0LCAxNCwgMiwgMTMsIDEsIDEwLCA2LCAxMiwgMTEsIDksIDUsIDMsIDh9LAorCSB7NCwgMSwgMTQsIDgsIDEzLCA2LCAyLCAxMSwgMTUsIDEyLCA5LCA3LCAzLCAxMCwgNSwgMH0sCisJIHsxNSwgMTIsIDgsIDIsIDQsIDksIDEsIDcsIDUsIDExLCAzLCAxNCwgMTAsIDAsIDYsIDEzfX0sCisKKwl7ezE1LCAxLCA4LCAxNCwgNiwgMTEsIDMsIDQsIDksIDcsIDIsIDEzLCAxMiwgMCwgNSwgMTB9LAorCSB7MywgMTMsIDQsIDcsIDE1LCAyLCA4LCAxNCwgMTIsIDAsIDEsIDEwLCA2LCA5LCAxMSwgNX0sCisJIHswLCAxNCwgNywgMTEsIDEwLCA0LCAxMywgMSwgNSwgOCwgMTIsIDYsIDksIDMsIDIsIDE1fSwKKwkgezEzLCA4LCAxMCwgMSwgMywgMTUsIDQsIDIsIDExLCA2LCA3LCAxMiwgMCwgNSwgMTQsIDl9fSwKKworCXt7MTAsIDAsIDksIDE0LCA2LCAzLCAxNSwgNSwgMSwgMTMsIDEyLCA3LCAxMSwgNCwgMiwgOH0sCisJIHsxMywgNywgMCwgOSwgMywgNCwgNiwgMTAsIDIsIDgsIDUsIDE0LCAxMiwgMTEsIDE1LCAxfSwKKwkgezEzLCA2LCA0LCA5LCA4LCAxNSwgMywgMCwgMTEsIDEsIDIsIDEyLCA1LCAxMCwgMTQsIDd9LAorCSB7MSwgMTAsIDEzLCAwLCA2LCA5LCA4LCA3LCA0LCAxNSwgMTQsIDMsIDExLCA1LCAyLCAxMn19LAorCisJe3s3LCAxMywgMTQsIDMsIDAsIDYsIDksIDEwLCAxLCAyLCA4LCA1LCAxMSwgMTIsIDQsIDE1fSwKKwkgezEzLCA4LCAxMSwgNSwgNiwgMTUsIDAsIDMsIDQsIDcsIDIsIDEyLCAxLCAxMCwgMTQsIDl9LAorCSB7MTAsIDYsIDksIDAsIDEyLCAxMSwgNywgMTMsIDE1LCAxLCAzLCAxNCwgNSwgMiwgOCwgNH0sCisJIHszLCAxNSwgMCwgNiwgMTAsIDEsIDEzLCA4LCA5LCA0LCA1LCAxMSwgMTIsIDcsIDIsIDE0fX0sCisKKwl7ezIsIDEyLCA0LCAxLCA3LCAxMCwgMTEsIDYsIDgsIDUsIDMsIDE1LCAxMywgMCwgMTQsIDl9LAorCSB7MTQsIDExLCAyLCAxMiwgNCwgNywgMTMsIDEsIDUsIDAsIDE1LCAxMCwgMywgOSwgOCwgNn0sCisJIHs0LCAyLCAxLCAxMSwgMTAsIDEzLCA3LCA4LCAxNSwgOSwgMTIsIDUsIDYsIDMsIDAsIDE0fSwKKwkgezExLCA4LCAxMiwgNywgMSwgMTQsIDIsIDEzLCA2LCAxNSwgMCwgOSwgMTAsIDQsIDUsIDN9fSwKKworCXt7MTIsIDEsIDEwLCAxNSwgOSwgMiwgNiwgOCwgMCwgMTMsIDMsIDQsIDE0LCA3LCA1LCAxMX0sCisJIHsxMCwgMTUsIDQsIDIsIDcsIDEyLCA5LCA1LCA2LCAxLCAxMywgMTQsIDAsIDExLCAzLCA4fSwKKwkgezksIDE0LCAxNSwgNSwgMiwgOCwgMTIsIDMsIDcsIDAsIDQsIDEwLCAxLCAxMywgMTEsIDZ9LAorCSB7NCwgMywgMiwgMTIsIDksIDUsIDE1LCAxMCwgMTEsIDE0LCAxLCA3LCA2LCAwLCA4LCAxM319LAorCisJe3s0LCAxMSwgMiwgMTQsIDE1LCAwLCA4LCAxMywgMywgMTIsIDksIDcsIDUsIDEwLCA2LCAxfSwKKwkgezEzLCAwLCAxMSwgNywgNCwgOSwgMSwgMTAsIDE0LCAzLCA1LCAxMiwgMiwgMTUsIDgsIDZ9LAorCSB7MSwgNCwgMTEsIDEzLCAxMiwgMywgNywgMTQsIDEwLCAxNSwgNiwgOCwgMCwgNSwgOSwgMn0sCisJIHs2LCAxMSwgMTMsIDgsIDEsIDQsIDEwLCA3LCA5LCA1LCAwLCAxNSwgMTQsIDIsIDMsIDEyfX0sCisKKwl7ezEzLCAyLCA4LCA0LCA2LCAxNSwgMTEsIDEsIDEwLCA5LCAzLCAxNCwgNSwgMCwgMTIsIDd9LAorCSB7MSwgMTUsIDEzLCA4LCAxMCwgMywgNywgNCwgMTIsIDUsIDYsIDExLCAwLCAxNCwgOSwgMn0sCisJIHs3LCAxMSwgNCwgMSwgOSwgMTIsIDE0LCAyLCAwLCA2LCAxMCwgMTMsIDE1LCAzLCA1LCA4fSwKKwkgezIsIDEsIDE0LCA3LCA0LCAxMCwgOCwgMTMsIDE1LCAxMiwgOSwgMCwgMywgNSwgNiwgMTF9fQorfTsKKworc3RhdGljIHZvaWQKK3Blcm11dGUoY2hhciAqb3V0LCBjaGFyICppbiwgdWNoYXIgKiBwLCBpbnQgbikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQlvdXRbaV0gPSBpbltwW2ldIC0gMV07Cit9CisKK3N0YXRpYyB2b2lkCitsc2hpZnQoY2hhciAqZCwgaW50IGNvdW50LCBpbnQgbikKK3sKKwljaGFyIG91dFs2NF07CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJb3V0W2ldID0gZFsoaSArIGNvdW50KSAlIG5dOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCWRbaV0gPSBvdXRbaV07Cit9CisKK3N0YXRpYyB2b2lkCitjb25jYXQoY2hhciAqb3V0LCBjaGFyICppbjEsIGNoYXIgKmluMiwgaW50IGwxLCBpbnQgbDIpCit7CisJd2hpbGUgKGwxLS0pCisJCSpvdXQrKyA9ICppbjErKzsKKwl3aGlsZSAobDItLSkKKwkJKm91dCsrID0gKmluMisrOworfQorCitzdGF0aWMgdm9pZAoreG9yKGNoYXIgKm91dCwgY2hhciAqaW4xLCBjaGFyICppbjIsIGludCBuKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCW91dFtpXSA9IGluMVtpXSBeIGluMltpXTsKK30KKworc3RhdGljIHZvaWQKK2RvaGFzaChjaGFyICpvdXQsIGNoYXIgKmluLCBjaGFyICprZXksIGludCBmb3J3KQoreworCWludCBpLCBqLCBrOworCWNoYXIgKnBrMTsKKwljaGFyIGNbMjhdOworCWNoYXIgZFsyOF07CisJY2hhciAqY2Q7CisJY2hhciBraVsxNl1bNDhdOworCWNoYXIgKnBkMTsKKwljaGFyIGxbMzJdLCByWzMyXTsKKwljaGFyICpybDsKKworCS8qIEhhdmUgdG8gcmVkdWNlIHN0YWNrIHVzYWdlICovCisJcGsxID0ga21hbGxvYyg1Nis1Nis2NCs2NCxHRlBfS0VSTkVMKTsKKwlpZihwazEgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJY2QgPSBwazEgKyA1NjsKKwlwZDE9IGNkICArIDU2OworCXJsID0gcGQxICsgNjQ7CisKKwlwZXJtdXRlKHBrMSwga2V5LCBwZXJtMSwgNTYpOworCisJZm9yIChpID0gMDsgaSA8IDI4OyBpKyspCisJCWNbaV0gPSBwazFbaV07CisJZm9yIChpID0gMDsgaSA8IDI4OyBpKyspCisJCWRbaV0gPSBwazFbaSArIDI4XTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWxzaGlmdChjLCBzY1tpXSwgMjgpOworCQlsc2hpZnQoZCwgc2NbaV0sIDI4KTsKKworCQljb25jYXQoY2QsIGMsIGQsIDI4LCAyOCk7CisJCXBlcm11dGUoa2lbaV0sIGNkLCBwZXJtMiwgNDgpOworCX0KKworCXBlcm11dGUocGQxLCBpbiwgcGVybTMsIDY0KTsKKworCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB7CisJCWxbal0gPSBwZDFbal07CisJCXJbal0gPSBwZDFbaiArIDMyXTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQljaGFyICplcjsgIC8qIGVyWzQ4XSAgKi8KKwkJY2hhciAqZXJrOyAvKiBlcmtbNDhdICovCisJCWNoYXIgYls4XVs2XTsKKwkJY2hhciAqY2I7ICAvKiBjYlszMl0gICovCisJCWNoYXIgKnBjYjsgLyogcGNiWzMyXSAqLworCQljaGFyICpyMjsgIC8qIHIyWzMyXSAgKi8KKworCQllciA9IGttYWxsb2MoNDgrNDgrMzIrMzIrMzIsIEdGUF9LRVJORUwpOworCQlpZihlciA9PSBOVUxMKSB7CisJCQlrZnJlZShwazEpOworCQkJcmV0dXJuOworCQl9CisJCWVyayA9IGVyKzQ4OworCQljYiAgPSBlcmsrNDg7CisJCXBjYiA9IGNiKzMyOworCQlyMiAgPSBwY2IrMzI7CisKKwkJcGVybXV0ZShlciwgciwgcGVybTQsIDQ4KTsKKworCQl4b3IoZXJrLCBlciwga2lbZm9ydyA/IGkgOiAxNSAtIGldLCA0OCk7CisKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCWZvciAoayA9IDA7IGsgPCA2OyBrKyspCisJCQkJYltqXVtrXSA9IGVya1tqICogNiArIGtdOworCisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCWludCBtLCBuOworCQkJbSA9IChiW2pdWzBdIDw8IDEpIHwgYltqXVs1XTsKKworCQkJbiA9IChiW2pdWzFdIDw8IDMpIHwgKGJbal1bMl0gPDwgMikgfCAoYltqXVszXSA8PAorCQkJCQkJCSAgICAgICAxKSB8IGJbal1bNF07CisKKwkJCWZvciAoayA9IDA7IGsgPCA0OyBrKyspCisJCQkJYltqXVtrXSA9CisJCQkJICAgIChzYm94W2pdW21dW25dICYgKDEgPDwgKDMgLSBrKSkpID8gMSA6IDA7CisJCX0KKworCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJZm9yIChrID0gMDsgayA8IDQ7IGsrKykKKwkJCQljYltqICogNCArIGtdID0gYltqXVtrXTsKKwkJcGVybXV0ZShwY2IsIGNiLCBwZXJtNSwgMzIpOworCisJCXhvcihyMiwgbCwgcGNiLCAzMik7CisKKwkJZm9yIChqID0gMDsgaiA8IDMyOyBqKyspCisJCQlsW2pdID0gcltqXTsKKworCQlmb3IgKGogPSAwOyBqIDwgMzI7IGorKykKKwkJCXJbal0gPSByMltqXTsKKworCQlrZnJlZShlcik7CisJfQorCisJY29uY2F0KHJsLCByLCBsLCAzMiwgMzIpOworCisJcGVybXV0ZShvdXQsIHJsLCBwZXJtNiwgNjQpOworCWtmcmVlKHBrMSk7Cit9CisKK3N0YXRpYyB2b2lkCitzdHJfdG9fa2V5KHVuc2lnbmVkIGNoYXIgKnN0ciwgdW5zaWduZWQgY2hhciAqa2V5KQoreworCWludCBpOworCisJa2V5WzBdID0gc3RyWzBdID4+IDE7CisJa2V5WzFdID0gKChzdHJbMF0gJiAweDAxKSA8PCA2KSB8IChzdHJbMV0gPj4gMik7CisJa2V5WzJdID0gKChzdHJbMV0gJiAweDAzKSA8PCA1KSB8IChzdHJbMl0gPj4gMyk7CisJa2V5WzNdID0gKChzdHJbMl0gJiAweDA3KSA8PCA0KSB8IChzdHJbM10gPj4gNCk7CisJa2V5WzRdID0gKChzdHJbM10gJiAweDBGKSA8PCAzKSB8IChzdHJbNF0gPj4gNSk7CisJa2V5WzVdID0gKChzdHJbNF0gJiAweDFGKSA8PCAyKSB8IChzdHJbNV0gPj4gNik7CisJa2V5WzZdID0gKChzdHJbNV0gJiAweDNGKSA8PCAxKSB8IChzdHJbNl0gPj4gNyk7CisJa2V5WzddID0gc3RyWzZdICYgMHg3RjsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWtleVtpXSA9IChrZXlbaV0gPDwgMSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorc21iaGFzaCh1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICprZXksIGludCBmb3J3KQoreworCWludCBpOworCWNoYXIgKm91dGI7IC8qIG91dGJbNjRdICovCisJY2hhciAqaW5iOyAgLyogaW5iWzY0XSAgKi8KKwljaGFyICprZXliOyAvKiBrZXliWzY0XSAqLworCXVuc2lnbmVkIGNoYXIga2V5Mls4XTsKKworCW91dGIgPSBrbWFsbG9jKDY0ICogMyxHRlBfS0VSTkVMKTsKKwlpZihvdXRiID09IE5VTEwpCisJCXJldHVybjsKKworCWluYiAgPSBvdXRiICsgNjQ7CisJa2V5YiA9IGluYiArICA2NDsKKworCXN0cl90b19rZXkoa2V5LCBrZXkyKTsKKworCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCWluYltpXSA9IChpbltpIC8gOF0gJiAoMSA8PCAoNyAtIChpICUgOCkpKSkgPyAxIDogMDsKKwkJa2V5YltpXSA9IChrZXkyW2kgLyA4XSAmICgxIDw8ICg3IC0gKGkgJSA4KSkpKSA/IDEgOiAwOworCQlvdXRiW2ldID0gMDsKKwl9CisKKwlkb2hhc2gob3V0YiwgaW5iLCBrZXliLCBmb3J3KTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJb3V0W2ldID0gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCQlpZiAob3V0YltpXSkKKwkJCW91dFtpIC8gOF0gfD0gKDEgPDwgKDcgLSAoaSAlIDgpKSk7CisJfQorCWtmcmVlKG91dGIpOworfQorCit2b2lkCitFX1AxNih1bnNpZ25lZCBjaGFyICpwMTQsIHVuc2lnbmVkIGNoYXIgKnAxNikKK3sKKwl1bnNpZ25lZCBjaGFyIHNwOFs4XSA9CisJICAgIHsgMHg0YiwgMHg0NywgMHg1MywgMHgyMSwgMHg0MCwgMHgyMywgMHgyNCwgMHgyNSB9OworCXNtYmhhc2gocDE2LCBzcDgsIHAxNCwgMSk7CisJc21iaGFzaChwMTYgKyA4LCBzcDgsIHAxNCArIDcsIDEpOworfQorCit2b2lkCitFX1AyNCh1bnNpZ25lZCBjaGFyICpwMjEsIHVuc2lnbmVkIGNoYXIgKmM4LCB1bnNpZ25lZCBjaGFyICpwMjQpCit7CisJc21iaGFzaChwMjQsIGM4LCBwMjEsIDEpOworCXNtYmhhc2gocDI0ICsgOCwgYzgsIHAyMSArIDcsIDEpOworCXNtYmhhc2gocDI0ICsgMTYsIGM4LCBwMjEgKyAxNCwgMSk7Cit9CisKK3ZvaWQKK0RfUDE2KHVuc2lnbmVkIGNoYXIgKnAxNCwgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCkKK3sKKwlzbWJoYXNoKG91dCwgaW4sIHAxNCwgMCk7CisJc21iaGFzaChvdXQgKyA4LCBpbiArIDgsIHAxNCArIDcsIDApOworfQorCit2b2lkCitFX29sZF9wd19oYXNoKHVuc2lnbmVkIGNoYXIgKnAxNCwgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCkKK3sKKwlzbWJoYXNoKG91dCwgaW4sIHAxNCwgMSk7CisJc21iaGFzaChvdXQgKyA4LCBpbiArIDgsIHAxNCArIDcsIDEpOworfQorI2lmIDAKKy8qIHRoZXNlIHJvdXRpbmVzIGFyZSBjdXJyZW50bHkgdW5uZWVkZWQsIGJ1dCBtYXkgYmUKKwluZWVkZWQgbGF0ZXIgKi8KK3ZvaWQKK2NyZWRfaGFzaDEodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqa2V5KQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzhdOworCisJc21iaGFzaChidWYsIGluLCBrZXksIDEpOworCXNtYmhhc2gob3V0LCBidWYsIGtleSArIDksIDEpOworfQorCit2b2lkCitjcmVkX2hhc2gyKHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKmtleSkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBrZXkyWzhdOworCisJc21iaGFzaChidWYsIGluLCBrZXksIDEpOworCWtleTJbMF0gPSBrZXlbN107CisJc21iaGFzaChvdXQsIGJ1Ziwga2V5MiwgMSk7Cit9CisKK3ZvaWQKK2NyZWRfaGFzaDModW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQgZm9ydykKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBrZXkyWzhdOworCisJc21iaGFzaChvdXQsIGluLCBrZXksIGZvcncpOworCWtleTJbMF0gPSBrZXlbN107CisJc21iaGFzaChvdXQgKyA4LCBpbiArIDgsIGtleTIsIGZvcncpOworfQorI2VuZGlmIC8qIHVubmVlZGVkIHJvdXRpbmVzICovCmRpZmYgLS1naXQgYS9mcy9jaWZzL3NtYmVuY3J5cHQuYyBiL2ZzL2NpZnMvc21iZW5jcnlwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMDNiY2QKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL3NtYmVuY3J5cHQuYwpAQCAtMCwwICsxLDI4NSBAQAorLyogCisgICBVbml4IFNNQi9OZXRiaW9zIGltcGxlbWVudGF0aW9uLgorICAgVmVyc2lvbiAxLjkuCisgICBTTUIgcGFyYW1ldGVycyBhbmQgc2V0dXAKKyAgIENvcHlyaWdodCAoQykgQW5kcmV3IFRyaWRnZWxsIDE5OTItMjAwMAorICAgQ29weXJpZ2h0IChDKSBMdWtlIEtlbm5ldGggQ2Fzc29uIExlaWdodG9uIDE5OTYtMjAwMAorICAgTW9kaWZpZWQgYnkgSmVyZW15IEFsbGlzb24gMTk5NS4KKyAgIENvcHlyaWdodCAoQykgQW5kcmV3IEJhcnRsZXR0IDxhYmFydGxldEBzYW1iYS5vcmc+IDIwMDItMjAwMworICAgTW9kaWZpZWQgYnkgU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pIDIwMDItMjAwMworICAgCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAgCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSAiY2lmc191bmljb2RlLmgiCisjaW5jbHVkZSAiY2lmc3BkdS5oIgorI2luY2x1ZGUgIm1kNS5oIgorI2luY2x1ZGUgImNpZnNfZGVidWcuaCIKKyNpbmNsdWRlICJjaWZzZW5jcnlwdC5oIgorCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgMQorI2VuZGlmCisKKy8qIGZvbGxvd2luZyBjYW1lIGZyb20gdGhlIG90aGVyIGJ5dGVvcmRlci5oIHRvIGF2b2lkIGluY2x1ZGUgY29uZmxpY3RzICovCisjZGVmaW5lIENWQUwoYnVmLHBvcykgKCgodW5zaWduZWQgY2hhciAqKShidWYpKVtwb3NdKQorI2RlZmluZSBTU1ZBTFgoYnVmLHBvcyx2YWwpIChDVkFMKGJ1Zixwb3MpPSh2YWwpJjB4RkYsQ1ZBTChidWYscG9zKzEpPSh2YWwpPj44KQorI2RlZmluZSBTU1ZBTChidWYscG9zLHZhbCkgU1NWQUxYKChidWYpLChwb3MpLCgoX191MTYpKHZhbCkpKQorCisvKlRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgY29tZSBmcm9tICBsaWJzbWIvc21iZW5jcnlwdC5jICAqLworCit2b2lkIFNNQmVuY3J5cHQodW5zaWduZWQgY2hhciAqcGFzc3dkLCB1bnNpZ25lZCBjaGFyICpjOCwgdW5zaWduZWQgY2hhciAqcDI0KTsKK3ZvaWQgRV9tZDRoYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhc3N3ZCwgdW5zaWduZWQgY2hhciAqcDE2KTsKK3ZvaWQgbnRfbG1fb3dmX2dlbihjaGFyICpwd2QsIHVuc2lnbmVkIGNoYXIgbnRfcDE2WzE2XSwgdW5zaWduZWQgY2hhciBwMTZbMTZdKTsKK3N0YXRpYyB2b2lkIFNNQk9XRmVuY3J5cHQodW5zaWduZWQgY2hhciBwYXNzd2RbMTZdLCB1bnNpZ25lZCBjaGFyICpjOCwKKwkJICAgdW5zaWduZWQgY2hhciBwMjRbMjRdKTsKK3ZvaWQgTlRMTVNTUE9XRmVuY3J5cHQodW5zaWduZWQgY2hhciBwYXNzd2RbOF0sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpudGxtY2hhbHJlc3AsIHVuc2lnbmVkIGNoYXIgcDI0WzI0XSk7Cit2b2lkIFNNQk5UZW5jcnlwdCh1bnNpZ25lZCBjaGFyICpwYXNzd2QsIHVuc2lnbmVkIGNoYXIgKmM4LCB1bnNpZ25lZCBjaGFyICpwMjQpOworCisvKgorICAgVGhpcyBpbXBsZW1lbnRzIHRoZSBYL09wZW4gU01CIHBhc3N3b3JkIGVuY3J5cHRpb24KKyAgIEl0IHRha2VzIGEgcGFzc3dvcmQsIGEgOCBieXRlICJjcnlwdCBrZXkiIGFuZCBwdXRzIDI0IGJ5dGVzIG9mIAorICAgZW5jcnlwdGVkIHBhc3N3b3JkIGludG8gcDI0ICovCisvKiBOb3RlIHRoYXQgcGFzc3dvcmQgbXVzdCBiZSB1cHBlcmNhc2VkIGFuZCBudWxsIHRlcm1pbmF0ZWQgKi8KK3ZvaWQKK1NNQmVuY3J5cHQodW5zaWduZWQgY2hhciAqcGFzc3dkLCB1bnNpZ25lZCBjaGFyICpjOCwgdW5zaWduZWQgY2hhciAqcDI0KQoreworCXVuc2lnbmVkIGNoYXIgcDE0WzE1XSwgcDIxWzIxXTsKKworCW1lbXNldChwMjEsICdcMCcsIDIxKTsKKwltZW1zZXQocDE0LCAnXDAnLCAxNCk7CisJc3RybmNweSgoY2hhciAqKSBwMTQsIChjaGFyICopIHBhc3N3ZCwgMTQpOworCisvKglzdHJ1cHBlcigoY2hhciAqKXAxNCk7ICovLyogQkIgYXQgbGVhc3QgdXBwZXJjYXNlIHRoZSBlYXN5IHJhbmdlICovCisJRV9QMTYocDE0LCBwMjEpOworCisJU01CT1dGZW5jcnlwdChwMjEsIGM4LCBwMjQpOworCQorCW1lbXNldChwMTQsMCwxNSk7CisJbWVtc2V0KHAyMSwwLDIxKTsKK30KKworLyogUm91dGluZXMgZm9yIFdpbmRvd3MgTlQgTUQ0IEhhc2ggZnVuY3Rpb25zLiAqLworc3RhdGljIGludAorX215X3djc2xlbihfX3UxNiAqIHN0cikKK3sKKwlpbnQgbGVuID0gMDsKKwl3aGlsZSAoKnN0cisrICE9IDApCisJCWxlbisrOworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgc3RyaW5nIGludG8gYW4gTlQgVU5JQ09ERSBzdHJpbmcuCisgKiBOb3RlIHRoYXQgcmVnYXJkbGVzcyBvZiBwcm9jZXNzb3IgdHlwZSAKKyAqIHRoaXMgbXVzdCBiZSBpbiBpbnRlbCAobGl0dGxlLWVuZGlhbikKKyAqIGZvcm1hdC4KKyAqLworCitzdGF0aWMgaW50CitfbXlfbWJzdG93Y3MoX191MTYgKiBkc3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IGxlbikKK3sJCQkJLyogbm90IGEgdmVyeSBnb29kIGNvbnZlcnNpb24gcm91dGluZSAtIGNoYW5nZS9maXggKi8KKwlpbnQgaTsKKwlfX3UxNiB2YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJdmFsID0gKnNyYzsKKwkJU1NWQUwoZHN0LCAwLCB2YWwpOworCQlkc3QrKzsKKwkJc3JjKys7CisJCWlmICh2YWwgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gaTsKK30KKworLyogCisgKiBDcmVhdGVzIHRoZSBNRDQgSGFzaCBvZiB0aGUgdXNlcnMgcGFzc3dvcmQgaW4gTlQgVU5JQ09ERS4KKyAqLworCit2b2lkCitFX21kNGhhc2goY29uc3QgdW5zaWduZWQgY2hhciAqcGFzc3dkLCB1bnNpZ25lZCBjaGFyICpwMTYpCit7CisJaW50IGxlbjsKKwlfX3UxNiB3cHdkWzEyOV07CisKKwkvKiBQYXNzd29yZCBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gMTI4IGNoYXJhY3RlcnMgKi8KKwlpZihwYXNzd2QpIHsKKwkJbGVuID0gc3RybGVuKChjaGFyICopIHBhc3N3ZCk7CisJCWlmIChsZW4gPiAxMjgpIHsKKwkJCWxlbiA9IDEyODsKKwkJfQorCQkvKiBQYXNzd29yZCBtdXN0IGJlIGNvbnZlcnRlZCB0byBOVCB1bmljb2RlICovCisJCV9teV9tYnN0b3djcyh3cHdkLCBwYXNzd2QsIGxlbik7CisJfSBlbHNlCisJCWxlbiA9IDA7CisKKwl3cHdkW2xlbl0gPSAwOwkvKiBFbnN1cmUgc3RyaW5nIGlzIG51bGwgdGVybWluYXRlZCAqLworCS8qIENhbGN1bGF0ZSBsZW5ndGggaW4gYnl0ZXMgKi8KKwlsZW4gPSBfbXlfd2NzbGVuKHdwd2QpICogc2l6ZW9mIChfX3UxNik7CisKKwltZGZvdXIocDE2LCAodW5zaWduZWQgY2hhciAqKSB3cHdkLCBsZW4pOworCW1lbXNldCh3cHdkLDAsMTI5ICogMik7Cit9CisKKy8qIERvZXMgYm90aCB0aGUgTlQgYW5kIExNIG93ZnMgb2YgYSB1c2VyJ3MgcGFzc3dvcmQgKi8KK3ZvaWQKK250X2xtX293Zl9nZW4oY2hhciAqcHdkLCB1bnNpZ25lZCBjaGFyIG50X3AxNlsxNl0sIHVuc2lnbmVkIGNoYXIgcDE2WzE2XSkKK3sKKwljaGFyIHBhc3N3ZFs1MTRdOworCisJbWVtc2V0KHBhc3N3ZCwgJ1wwJywgNTE0KTsKKwlpZiAoc3RybGVuKHB3ZCkgPCA1MTMpCisJCXN0cmNweShwYXNzd2QsIHB3ZCk7CisJZWxzZQorCQltZW1jcHkocGFzc3dkLCBwd2QsIDUxMik7CisJLyogQ2FsY3VsYXRlIHRoZSBNRDQgaGFzaCAoTlQgY29tcGF0aWJsZSkgb2YgdGhlIHBhc3N3b3JkICovCisJbWVtc2V0KG50X3AxNiwgJ1wwJywgMTYpOworCUVfbWQ0aGFzaChwYXNzd2QsIG50X3AxNik7CisKKwkvKiBNYW5nbGUgdGhlIHBhc3N3b3JkcyBpbnRvIExhbm1hbiBmb3JtYXQgKi8KKwlwYXNzd2RbMTRdID0gJ1wwJzsKKy8qCXN0cnVwcGVyKHBhc3N3ZCk7ICovCisKKwkvKiBDYWxjdWxhdGUgdGhlIFNNQiAobGFubWFuKSBoYXNoIGZ1bmN0aW9ucyBvZiB0aGUgcGFzc3dvcmQgKi8KKworCW1lbXNldChwMTYsICdcMCcsIDE2KTsKKwlFX1AxNigodW5zaWduZWQgY2hhciAqKSBwYXNzd2QsICh1bnNpZ25lZCBjaGFyICopIHAxNik7CisKKwkvKiBjbGVhciBvdXQgbG9jYWwgY29weSBvZiB1c2VyJ3MgcGFzc3dvcmQgKGp1c3QgYmVpbmcgcGFyYW5vaWQpLiAqLworCW1lbXNldChwYXNzd2QsICdcMCcsIHNpemVvZiAocGFzc3dkKSk7Cit9CisKKy8qIERvZXMgdGhlIE5UTE12MiBvd2ZzIG9mIGEgdXNlcidzIHBhc3N3b3JkICovCisjaWYgMCAgLyogZnVuY3Rpb24gbm90IG5lZWRlZCB5ZXQgLSBidXQgd2lsbCBiZSBzb29uICovCitzdGF0aWMgdm9pZAorbnR2Ml9vd2ZfZ2VuKGNvbnN0IHVuc2lnbmVkIGNoYXIgb3dmWzE2XSwgY29uc3QgY2hhciAqdXNlcl9uLAorCQljb25zdCBjaGFyICpkb21haW5fbiwgdW5zaWduZWQgY2hhciBrcl9idWZbMTZdLAorCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisJd2NoYXJfdCAqIHVzZXJfdTsKKwl3Y2hhcl90ICogZG9tX3U7CisJaW50IHVzZXJfbCwgZG9tYWluX2w7CisJc3RydWN0IEhNQUNNRDVDb250ZXh0IGN0eDsKKworCS8qIG1pZ2h0IGFzIHdlbGwgZG8gb25lIGFsbG9jIHRvIGhvbGQgYm90aCAodXNlcl91IGFuZCBkb21fdSkgKi8KKwl1c2VyX3UgPSBrbWFsbG9jKDIwNDggKiBzaXplb2Yod2NoYXJfdCksR0ZQX0tFUk5FTCk7IAorCWlmKHVzZXJfdSA9PSBOVUxMKQorCQlyZXR1cm47CisJZG9tX3UgPSB1c2VyX3UgKyAxMDI0OworICAgIAorCS8qIHB1c2hfdWNzMihOVUxMLCB1c2VyX3UsIHVzZXJfbiwgKHVzZXJfbCsxKSoyLCBTVFJfVU5JQ09ERXxTVFJfTk9BTElHTnxTVFJfVEVSTUlOQVRFfFNUUl9VUFBFUik7CisJICAgcHVzaF91Y3MyKE5VTEwsIGRvbV91LCBkb21haW5fbiwgKGRvbWFpbl9sKzEpKjIsIFNUUl9VTklDT0RFfFNUUl9OT0FMSUdOfFNUUl9URVJNSU5BVEV8U1RSX1VQUEVSKTsgKi8KKworCS8qIEJCIHVzZXIgYW5kIGRvbWFpbiBtYXkgbmVlZCB0byBiZSB1cHBlcmNhc2VkICovCisJdXNlcl9sID0gY2lmc19zdHJ0b1VDUyh1c2VyX3UsIHVzZXJfbiwgNTExLCBubHNfY29kZXBhZ2UpOworCWRvbWFpbl9sID0gY2lmc19zdHJ0b1VDUyhkb21fdSwgZG9tYWluX24sIDUxMSwgbmxzX2NvZGVwYWdlKTsKKworCXVzZXJfbCsrOwkJLyogdHJhaWxpbmcgbnVsbCAqLworCWRvbWFpbl9sKys7CisKKwlobWFjX21kNV9pbml0X2xpbUtfdG9fNjQob3dmLCAxNiwgJmN0eCk7CisJaG1hY19tZDVfdXBkYXRlKChjb25zdCB1bnNpZ25lZCBjaGFyICopIHVzZXJfdSwgdXNlcl9sICogMiwgJmN0eCk7CisJaG1hY19tZDVfdXBkYXRlKChjb25zdCB1bnNpZ25lZCBjaGFyICopIGRvbV91LCBkb21haW5fbCAqIDIsICZjdHgpOworCWhtYWNfbWQ1X2ZpbmFsKGtyX2J1ZiwgJmN0eCk7CisKKwlrZnJlZSh1c2VyX3UpOworfQorI2VuZGlmIAorCisvKiBEb2VzIHRoZSBkZXMgZW5jcnlwdGlvbiBmcm9tIHRoZSBOVCBvciBMTSBNRDQgaGFzaC4gKi8KK3N0YXRpYyB2b2lkCitTTUJPV0ZlbmNyeXB0KHVuc2lnbmVkIGNoYXIgcGFzc3dkWzE2XSwgdW5zaWduZWQgY2hhciAqYzgsCisJICAgICAgdW5zaWduZWQgY2hhciBwMjRbMjRdKQoreworCXVuc2lnbmVkIGNoYXIgcDIxWzIxXTsKKworCW1lbXNldChwMjEsICdcMCcsIDIxKTsKKworCW1lbWNweShwMjEsIHBhc3N3ZCwgMTYpOworCUVfUDI0KHAyMSwgYzgsIHAyNCk7Cit9CisKKy8qIERvZXMgdGhlIGRlcyBlbmNyeXB0aW9uIGZyb20gdGhlIEZJUlNUIDggQllURVMgb2YgdGhlIE5UIG9yIExNIE1ENCBoYXNoLiAqLwordm9pZAorTlRMTVNTUE9XRmVuY3J5cHQodW5zaWduZWQgY2hhciBwYXNzd2RbOF0sCisJCSAgdW5zaWduZWQgY2hhciAqbnRsbWNoYWxyZXNwLCB1bnNpZ25lZCBjaGFyIHAyNFsyNF0pCit7CisJdW5zaWduZWQgY2hhciBwMjFbMjFdOworCisJbWVtc2V0KHAyMSwgJ1wwJywgMjEpOworCW1lbWNweShwMjEsIHBhc3N3ZCwgOCk7CisJbWVtc2V0KHAyMSArIDgsIDB4YmQsIDgpOworCisJRV9QMjQocDIxLCBudGxtY2hhbHJlc3AsIHAyNCk7Cit9CisKKy8qIERvZXMgdGhlIE5UIE1ENCBoYXNoIHRoZW4gZGVzIGVuY3J5cHRpb24uICovCisKK3ZvaWQKK1NNQk5UZW5jcnlwdCh1bnNpZ25lZCBjaGFyICpwYXNzd2QsIHVuc2lnbmVkIGNoYXIgKmM4LCB1bnNpZ25lZCBjaGFyICpwMjQpCit7CisJdW5zaWduZWQgY2hhciBwMjFbMjFdOworCisJbWVtc2V0KHAyMSwgJ1wwJywgMjEpOworCisJRV9tZDRoYXNoKHBhc3N3ZCwgcDIxKTsKKwlTTUJPV0ZlbmNyeXB0KHAyMSwgYzgsIHAyNCk7Cit9CisKKworLyogRG9lcyB0aGUgbWQ1IGVuY3J5cHRpb24gZnJvbSB0aGUgTlQgaGFzaCBmb3IgTlRMTXYyLiAqLworLyogVGhlc2Ugcm91dGluZXMgd2lsbCBiZSBuZWVkZWQgbGF0ZXIgKi8KKyNpZiAwCitzdGF0aWMgdm9pZAorU01CT1dGZW5jcnlwdF9udHYyKGNvbnN0IHVuc2lnbmVkIGNoYXIga3JbMTZdLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBkYXRhX2Jsb2IgKiBzcnZfY2hhbCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZGF0YV9ibG9iICogY2xpX2NoYWwsIHVuc2lnbmVkIGNoYXIgcmVzcF9idWZbMTZdKQoreworICAgICAgICBzdHJ1Y3QgSE1BQ01ENUNvbnRleHQgY3R4OworCisgICAgICAgIGhtYWNfbWQ1X2luaXRfbGltS190b182NChrciwgMTYsICZjdHgpOworICAgICAgICBobWFjX21kNV91cGRhdGUoc3J2X2NoYWwtPmRhdGEsIHNydl9jaGFsLT5sZW5ndGgsICZjdHgpOworICAgICAgICBobWFjX21kNV91cGRhdGUoY2xpX2NoYWwtPmRhdGEsIGNsaV9jaGFsLT5sZW5ndGgsICZjdHgpOworICAgICAgICBobWFjX21kNV9maW5hbChyZXNwX2J1ZiwgJmN0eCk7Cit9CisKK3N0YXRpYyB2b2lkCitTTUJzZXNza2V5Z2VuX250djIoY29uc3QgdW5zaWduZWQgY2hhciBrclsxNl0sCisJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm50X3Jlc3AsIF9fdTggc2Vzc19rZXlbMTZdKQoreworCXN0cnVjdCBITUFDTUQ1Q29udGV4dCBjdHg7CisKKwlobWFjX21kNV9pbml0X2xpbUtfdG9fNjQoa3IsIDE2LCAmY3R4KTsKKwlobWFjX21kNV91cGRhdGUobnRfcmVzcCwgMTYsICZjdHgpOworCWhtYWNfbWQ1X2ZpbmFsKCh1bnNpZ25lZCBjaGFyICopIHNlc3Nfa2V5LCAmY3R4KTsKK30KKworc3RhdGljIHZvaWQKK1NNQnNlc3NrZXlnZW5fbnR2MShjb25zdCB1bnNpZ25lZCBjaGFyIGtyWzE2XSwKKwkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqbnRfcmVzcCwgX191OCBzZXNzX2tleVsxNl0pCit7CisJbWRmb3VyKCh1bnNpZ25lZCBjaGFyICopIHNlc3Nfa2V5LCAodW5zaWduZWQgY2hhciAqKSBrciwgMTYpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9jaWZzL3NtYmVyci5oIGIvZnMvY2lmcy9zbWJlcnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjFmMTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9zbWJlcnIuaApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqICAgZnMvY2lmcy9zbWJlcnIuaAorICoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMiwyMDA0CisgKiAgIEF1dGhvcihzKTogU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pCisgKgorICogICBTZWUgRXJyb3IgQ29kZXMgc2VjdGlvbiBvZiB0aGUgU05JQSBDSUZTIFNwZWNpZmljYXRpb24gCisgKiAgIGZvciBtb3JlIGluZm9ybWF0aW9uIAorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIAorICovCisKKyNkZWZpbmUgU1VDQ0VTUyAwCQkvKiBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bC4gKi8KKyNkZWZpbmUgRVJSRE9TIDB4MDEJCS8qIEVycm9yIGlzIGZyb20gdGhlIGNvcmUgRE9TIG9wZXJhdGluZyBzeXN0ZW0gc2V0ICovCisjZGVmaW5lIEVSUlNSViAweDAyCQkvKiBFcnJvciBpcyBnZW5lcmF0ZWQgYnkgdGhlIGZpbGUgc2VydmVyIGRhZW1vbiAqLworI2RlZmluZSBFUlJIUkQgMHgwMwkJLyogRXJyb3IgaXMgYSBoYXJkd2FyZSBlcnJvci4gKi8KKyNkZWZpbmUgRVJSQ01EIDB4RkYJCS8qICBDb21tYW5kIHdhcyBub3QgaW4gdGhlICJTTUIiIGZvcm1hdC4gKi8KKworLyogVGhlIGZvbGxvd2luZyBlcnJvciBjb2RlcyBtYXkgYmUgZ2VuZXJhdGVkIHdpdGggdGhlIFNVQ0NFU1MgZXJyb3IgY2xhc3MuKi8KKworI2RlZmluZSBTVUNDRVNTIDAJCS8qIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsLiAqLworCisvKiBUaGUgZm9sbG93aW5nIGVycm9yIGNvZGVzIG1heSBiZSBnZW5lcmF0ZWQgd2l0aCB0aGUgRVJSRE9TIGVycm9yIGNsYXNzLiovCisKKyNkZWZpbmUgRVJSYmFkZnVuYyAxCQkvKiBJbnZhbGlkIGZ1bmN0aW9uLiBUaGUgc2VydmVyIGRpZCBub3QgcmVjb2duaXplIG9yIGNvdWxkIG5vdCBwZXJmb3JtIGEgc3lzdGVtIGNhbGwgZ2VuZXJhdGVkIGJ5IHRoZSBzZXJ2ZXIsIGUuZy4sIHNldCB0aGUgRElSRUNUT1JZIGF0dHJpYnV0ZSBvbiBhIGRhdGEgZmlsZSwgaW52YWxpZCBzZWVrIG1vZGUuICovCisjZGVmaW5lIEVSUmJhZGZpbGUgMgkJLypGaWxlIG5vdCBmb3VuZC4gVGhlIGxhc3QgY29tcG9uZW50IG9mIGEgZmlsZSdzIHBhdGhuYW1lIGNvdWxkIG5vdCBiZSBmb3VuZC4gKi8KKyNkZWZpbmUgRVJSYmFkcGF0aCAzCQkvKiBEaXJlY3RvcnkgaW52YWxpZC4gQSBkaXJlY3RvcnkgY29tcG9uZW50IGluIGEgcGF0aG5hbWUgY291bGQgbm90IGJlIGZvdW5kLiAqLworI2RlZmluZSBFUlJub2ZpZHMgNAkJLyogVG9vIG1hbnkgb3BlbiBmaWxlcy4gVGhlIHNlcnZlciBoYXMgbm8gZmlsZSBoYW5kbGVzIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgRVJSbm9hY2Nlc3MgNQkJLyogQWNjZXNzIGRlbmllZCwgdGhlIGNsaWVudCdzIGNvbnRleHQgZG9lcyBub3QgcGVybWl0IHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uIFRoaXMgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiBpbnZhbGlkIHJlbmFtZSBjb21tYW5kLCB3cml0ZSB0byBGaWQgb3BlbiBmb3IgcmVhZCBvbmx5LCByZWFkIG9uIEZpZCBvcGVuIGZvciB3cml0ZSBvbmx5LCBhdHRlbXB0IHRvIGRlbGV0ZSBhIG5vbi1lbXB0eSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgRVJSYmFkZmlkIDYJCS8qIEludmFsaWQgZmlsZSBoYW5kbGUuIFRoZSBmaWxlIGhhbmRsZSBzcGVjaWZpZWQgd2FzIG5vdCByZWNvZ25pemVkIGJ5IHRoZSBzZXJ2ZXIuICovCisjZGVmaW5lIEVSUmJhZG1jYiA3CQkvKiBNZW1vcnkgY29udHJvbCBibG9ja3MgZGVzdHJveWVkLiAqLworI2RlZmluZSBFUlJub21lbSA4CQkvKiBJbnN1ZmZpY2llbnQgc2VydmVyIG1lbW9yeSB0byBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uICovCisjZGVmaW5lIEVSUmJhZG1lbSA5CQkvKiBJbnZhbGlkIG1lbW9yeSBibG9jayBhZGRyZXNzLiAqLworI2RlZmluZSBFUlJiYWRlbnYgMTAJCS8qIEludmFsaWQgZW52aXJvbm1lbnQuICovCisjZGVmaW5lIEVSUmJhZGZvcm1hdCAxMQkJLyogSW52YWxpZCBmb3JtYXQuICovCisjZGVmaW5lIEVSUmJhZGFjY2VzcyAxMgkJLyogSW52YWxpZCBvcGVuIG1vZGUuICovCisjZGVmaW5lIEVSUmJhZGRhdGEgMTMJCS8qIEludmFsaWQgZGF0YSAoZ2VuZXJhdGVkIG9ubHkgYnkgSU9DVEwgY2FsbHMgd2l0aGluIHRoZSBzZXJ2ZXIpLiAqLworI2RlZmluZSBFUlJiYWRkcml2ZSAxNQkJLyogSW52YWxpZCBkcml2ZSBzcGVjaWZpZWQuICovCisjZGVmaW5lIEVSUnJlbWNkIDE2CQkvKiBBIERlbGV0ZSBEaXJlY3RvcnkgcmVxdWVzdCBhdHRlbXB0ZWQgdG8gcmVtb3ZlIHRoZSBzZXJ2ZXIncyBjdXJyZW50IGRpcmVjdG9yeS4gKi8KKyNkZWZpbmUgRVJSZGlmZmRldmljZSAxNwkvKiBOb3Qgc2FtZSBkZXZpY2UgKGUuZy4sIGEgY3Jvc3Mgdm9sdW1lIHJlbmFtZSB3YXMgYXR0ZW1wdGVkICovCisjZGVmaW5lIEVSUm5vZmlsZXMgMTgJCS8qIEEgRmlsZSBTZWFyY2ggY29tbWFuZCBjYW4gZmluZCBubyBtb3JlIGZpbGVzIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgY3JpdGVyaWEuICovCisjZGVmaW5lIEVSUmdlbmVyYWwgMzEKKyNkZWZpbmUgRVJSYmFkc2hhcmUgMzIJCS8qIFRoZSBzaGFyaW5nIG1vZGUgc3BlY2lmaWVkIGZvciBhbiBPcGVuIGNvbmZsaWN0cyB3aXRoIGV4aXN0aW5nIEZJRHMgb24gdGhlIGZpbGUuICovCisjZGVmaW5lIEVSUmxvY2sgMzMJCS8qIEEgTG9jayByZXF1ZXN0IGNvbmZsaWN0ZWQgd2l0aCBhbiBleGlzdGluZyBsb2NrIG9yIHNwZWNpZmllZCBhbiBpbnZhbGlkIG1vZGUsIG9yIGFuIFVubG9jayByZXF1ZXN0ZWQgYXR0ZW1wdGVkIHRvIHJlbW92ZSBhIGxvY2sgaGVsZCBieSBhbm90aGVyIHByb2Nlc3MuICovCisjZGVmaW5lIEVSUnVuc3VwICAgICA1MAorI2RlZmluZSBFUlJub3N1Y2hzaGFyZSA2NworI2RlZmluZSBFUlJmaWxleGlzdHMgODAJCS8qIFRoZSBmaWxlIG5hbWVkIGluIHRoZSByZXF1ZXN0IGFscmVhZHkgZXhpc3RzLiAqLworI2RlZmluZSBFUlJpbnZwYXJtICAgODcKKyNkZWZpbmUgRVJSZGlza2Z1bGwgIDExMgorI2RlZmluZSBFUlJpbnZuYW1lICAgMTIzCisjZGVmaW5lIEVSUmludmxldmVsICAxMjQKKyNkZWZpbmUgRVJSZGlybm90ZW1wdHkgMTQ1CisjZGVmaW5lIEVSUm5vdGxvY2tlZCAgIDE1OAorI2RlZmluZSBFUlJhbHJlYWR5ZXhpc3RzIDE4MworI2RlZmluZSBFUlJiYWRwaXBlIDIzMAorI2RlZmluZSBFUlJwaXBlYnVzeSAyMzEKKyNkZWZpbmUgRVJScGlwZWNsb3NpbmcgMjMyCisjZGVmaW5lIEVSUm5vdGNvbm5lY3RlZCAyMzMKKyNkZWZpbmUgRVJSbW9yZWRhdGEgICAgMjM0CisjZGVmaW5lIEVSUmVhc25vdHN1cHBvcnRlZCAyODIKKyNkZWZpbmUgRXJyUXVvdGEgMHgyMDAJCS8qIFRoZSBvcGVyYXRpb24gd291bGQgY2F1c2UgYSBxdW90YSBsaW1pdCB0byBiZSBleGNlZWRlZC4gKi8KKyNkZWZpbmUgRXJyTm90QUxpbmsgMHgyMDEJLyogQSBsaW5rIG9wZXJhdGlvbiB3YXMgcGVyZm9ybWVkIG9uIGEgcGF0aG5hbWUgdGhhdAorCQkJCSAgIHdhcyBub3QgYSBsaW5rLiAqLworCisvKiBGb2xsb3dpbmcgZXJyb3IgY29kZXMgbWF5IGJlIGdlbmVyYXRlZCB3aXRoIHRoZSBFUlJTUlYgZXJyb3IKK2NsYXNzLiovCisKKyNkZWZpbmUgRVJSZXJyb3IgMQkJLyogTm9uLXNwZWNpZmljIGVycm9yIGNvZGUuIEl0IGlzIHJldHVybmVkIHVuZGVyIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogcmVzb3VyY2Ugb3RoZXIgdGhhbiBkaXNrIHNwYWNlIGV4aGF1c3RlZCAoZS5nLiBUSURzKSwgZmlyc3QgU01CIGNvbW1hbmQgd2FzIG5vdCBuZWdvdGlhdGUsIG11bHRpcGxlIG5lZ290aWF0ZXMgYXR0ZW1wdGVkLCBhbmQgaW50ZXJuYWwgc2VydmVyIGVycm9yLiAqLworI2RlZmluZSBFUlJiYWRwdyAyCQkvKiBCYWQgcGFzc3dvcmQgLSBuYW1lL3Bhc3N3b3JkIHBhaXIgaW4gYSBUcmVlQ29ubmVjdCBvciBTZXNzaW9uIFNldHVwIGFyZSBpbnZhbGlkLiAqLworI2RlZmluZSBFUlJiYWR0eXBlIDMJCS8qIHVzZWQgZm9yIGluZGljYXRpbmcgREZTIHJlZmVycmFsIG5lZWRlZCAqLworI2RlZmluZSBFUlJhY2Nlc3MgNAkJLyogVGhlIGNsaWVudCBkb2VzIG5vdCBoYXZlIHRoZSBuZWNlc3NhcnkgYWNjZXNzIHJpZ2h0cyB3aXRoaW4gdGhlIHNwZWNpZmllZCBjb250ZXh0IGZvciByZXF1ZXN0ZWQgZnVuY3Rpb24uICovCisjZGVmaW5lIEVSUmludnRpZCA1CQkvKiBUaGUgVGlkIHNwZWNpZmllZCBpbiBhIGNvbW1hbmQgd2FzIGludmFsaWQuICovCisjZGVmaW5lIEVSUmludm5ldG5hbWUgNgkJLyogSW52YWxpZCBuZXR3b3JrIG5hbWUgaW4gdHJlZSBjb25uZWN0LiAqLworI2RlZmluZSBFUlJpbnZkZXZpY2UgNwkJLyogSW52YWxpZCBkZXZpY2UgLSBwcmludGVyIHJlcXVlc3QgbWFkZSB0byBub24tcHJpbnRlciBjb25uZWN0aW9uIG9yIG5vbi1wcmludGVyIHJlcXVlc3QgbWFkZSB0byBwcmludGVyIGNvbm5lY3Rpb24uICovCisjZGVmaW5lIEVSUnFmdWxsIDQ5CQkvKiBQcmludCBxdWV1ZSBmdWxsIChmaWxlcykgLS0gcmV0dXJuZWQgYnkgb3BlbiBwcmludCBmaWxlLiAqLworI2RlZmluZSBFUlJxdG9vYmlnIDUwCQkvKiBQcmludCBxdWV1ZSBmdWxsIC0tIG5vIHNwYWNlLiAqLworI2RlZmluZSBFUlJxZW9mICAgICAgICAgNTEJLyogRU9GIG9uIHByaW50IHF1ZXVlIGR1bXAgKi8KKyNkZWZpbmUgRVJSaW52cGZpZCAgICAgIDUyCS8qIEludmFsaWQgcHJpbnQgZmlsZSBGSUQuICovCisjZGVmaW5lIEVSUnNtYmNtZCAgICAgICA2NAkvKiBUaGUgc2VydmVyIGRpZCBub3QgcmVjb2duaXplIHRoZSBjb21tYW5kIHJlY2VpdmVkLiAqLworI2RlZmluZSBFUlJzcnZlcnJvciAgICAgNjUJLyogVGhlIHNlcnZlciBlbmNvdW50ZXJlZCBhbiBpbnRlcm5hbCBlcnJvciwgZS5nLiwgc3lzdGVtIGZpbGUgdW5hdmFpbGFibGUuICovCisjZGVmaW5lIEVSUmJhZEJJRCAgICAgICA2NgkvKiAob2Jzb2xldGUpICovCisjZGVmaW5lIEVSUmZpbGVzcGVjcyAgICA2NwkvKiBUaGUgRmlkIGFuZCBwYXRobmFtZSBwYXJhbWV0ZXJzIGNvbnRhaW5lZCBhbiBpbnZhbGlkIGNvbWJpbmF0aW9uIG9mIHZhbHVlcy4gKi8KKyNkZWZpbmUgRVJSYmFkTGluayAgICAgIDY4CS8qIChvYnNvbGV0ZSkgKi8KKyNkZWZpbmUgRVJSYmFkcGVybWl0cyAgIDY5CS8qIFRoZSBhY2Nlc3MgcGVybWlzc2lvbnMgc3BlY2lmaWVkIGZvciBhIGZpbGUgb3IgZGlyZWN0b3J5IGFyZSBub3QgYSB2YWxpZCBjb21iaW5hdGlvbi4gKi8KKyNkZWZpbmUgRVJSYmFkUElEICAgICAgIDcwCisjZGVmaW5lIEVSUnNldGF0dHJtb2RlICA3MQkvKiBhdHRyaWJ1dGUgKG1vZGUpIGlzIGludmFsaWQgKi8KKyNkZWZpbmUgRVJScGF1c2VkICAgICAgIDgxCS8qIFNlcnZlciBpcyBwYXVzZWQgKi8KKyNkZWZpbmUgRVJSbXNnb2ZmCTgyCS8qIHJlc2VydmVkIC0gbWVzc2FnaW5nIG9mZiAqLworI2RlZmluZSBFUlJub3Jvb20gICAgICAgODMJLyogcmVzZXJ2ZWQgLSBubyByb29tIGZvciBtZXNzYWdlICovCisjZGVmaW5lIEVSUnJtdW5zICAgICAgICA4NwkvKiByZXNlcnZlZCAtIHRvbyBtYW55IHJlbW90ZSBuYW1lcyAqLworI2RlZmluZSBFUlJ0aW1lb3V0ICAgICAgODgJLyogb3BlcmF0aW9uIHRpbWVkIG91dCAqLworI2RlZmluZSBFUlJub3Jlc291cmNlICAgODkJLyogTm8gcmVzb3VyY2VzIGF2YWlsYWJsZSBmb3IgcmVxdWVzdCAqLworI2RlZmluZSBFUlJ0b29tYW55dWlkcyAgOTAJLyogVG9vIG1hbnkgVUlEcyBhY3RpdmUgb24gdGhpcyBzZXNzaW9uICovCisjZGVmaW5lIEVSUmJhZHVpZCAgICAgICA5MQkvKiBUaGUgVUlEIGlzIG5vdCBrbm93biBhcyBhIHZhbGlkIHVzZXIgKi8KKyNkZWZpbmUgRVJSdXNlbXB4ICAgICAgMjUwCS8qIHRlbXBvcmFyaWx5IHVuYWJsZSB0byB1c2UgcmF3ICovCisjZGVmaW5lIEVSUnVzZXN0ZCAgICAgIDI1MQkvKiB0ZW1wb3JhcmlseSB1bmFibGUgdG8gdXNlIGVpdGhlciByYXcgb3IgbXB4ICovCisjZGVmaW5lIEVSUl9OT1RJRllfRU5VTV9ESVIgMTAyNAorI2RlZmluZSBFUlJhY2NvdW50ZXhwaXJlZCAyMjM5CisjZGVmaW5lIEVSUmJhZGNsaWVudCAgICAgIDIyNDAKKyNkZWZpbmUgRVJSYmFkTG9nb25UaW1lICAgMjI0MQorI2RlZmluZSBFUlJwYXNzd29yZEV4cGlyZWQgMjI0MgorI2RlZmluZSBFUlJuZXRsb2dvbk5vdFN0YXJ0ZWQgMjQ1NQorI2RlZmluZSBFUlJub3N1cHBvcnQgICAgICAgMHhGRkZGCmRpZmYgLS1naXQgYS9mcy9jaWZzL3RyYW5zcG9ydC5jIGIvZnMvY2lmcy90cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjEzZTUyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy90cmFuc3BvcnQuYwpAQCAtMCwwICsxLDYxOSBAQAorLyoKKyAqICAgZnMvY2lmcy90cmFuc3BvcnQuYworICoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMiwyMDA0CisgKiAgIEF1dGhvcihzKTogU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EgCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlICJjaWZzcGR1LmgiCisjaW5jbHVkZSAiY2lmc2dsb2IuaCIKKyNpbmNsdWRlICJjaWZzcHJvdG8uaCIKKyNpbmNsdWRlICJjaWZzX2RlYnVnLmgiCisgIAorZXh0ZXJuIG1lbXBvb2xfdCAqY2lmc19taWRfcG9vbHA7CitleHRlcm4ga21lbV9jYWNoZV90ICpjaWZzX29wbG9ja19jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgbWlkX3FfZW50cnkgKgorQWxsb2NNaWRRRW50cnkoc3RydWN0IHNtYl9oZHIgKnNtYl9idWZmZXIsIHN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzKQoreworCXN0cnVjdCBtaWRfcV9lbnRyeSAqdGVtcDsKKworCWlmIChzZXMgPT0gTlVMTCkgeworCQljRVJST1IoMSwgKCJOdWxsIHNlc3Npb24gcGFzc2VkIGluIHRvIEFsbG9jTWlkUUVudHJ5ICIpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChzZXMtPnNlcnZlciA9PSBOVUxMKSB7CisJCWNFUlJPUigxLCAoIk51bGwgVENQIHNlc3Npb24gaW4gQWxsb2NNaWRRRW50cnkiKSk7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwl0ZW1wID0gKHN0cnVjdCBtaWRfcV9lbnRyeSAqKSBtZW1wb29sX2FsbG9jKGNpZnNfbWlkX3Bvb2xwLFNMQUJfS0VSTkVMIHwgU0xBQl9OT0ZTKTsKKwlpZiAodGVtcCA9PSBOVUxMKQorCQlyZXR1cm4gdGVtcDsKKwllbHNlIHsKKwkJbWVtc2V0KHRlbXAsIDAsIHNpemVvZiAoc3RydWN0IG1pZF9xX2VudHJ5KSk7CisJCXRlbXAtPm1pZCA9IHNtYl9idWZmZXItPk1pZDsJLyogYWx3YXlzIExFICovCisJCXRlbXAtPnBpZCA9IGN1cnJlbnQtPnBpZDsKKwkJdGVtcC0+Y29tbWFuZCA9IHNtYl9idWZmZXItPkNvbW1hbmQ7CisJCWNGWUkoMSwgKCJGb3Igc21iX2NvbW1hbmQgJWQiLCB0ZW1wLT5jb21tYW5kKSk7CisJCWRvX2dldHRpbWVvZmRheSgmdGVtcC0+d2hlbl9zZW50KTsKKwkJdGVtcC0+c2VzID0gc2VzOworCQl0ZW1wLT50c2sgPSBjdXJyZW50OworCX0KKworCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCWxpc3RfYWRkX3RhaWwoJnRlbXAtPnFoZWFkLCAmc2VzLT5zZXJ2ZXItPnBlbmRpbmdfbWlkX3EpOworCWF0b21pY19pbmMoJm1pZENvdW50KTsKKwl0ZW1wLT5taWRTdGF0ZSA9IE1JRF9SRVFVRVNUX0FMTE9DQVRFRDsKKwlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCXJldHVybiB0ZW1wOworfQorCitzdGF0aWMgdm9pZAorRGVsZXRlTWlkUUVudHJ5KHN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkRW50cnkpCit7CisJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJbWlkRW50cnktPm1pZFN0YXRlID0gTUlEX0ZSRUU7CisJbGlzdF9kZWwoJm1pZEVudHJ5LT5xaGVhZCk7CisJYXRvbWljX2RlYygmbWlkQ291bnQpOworCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJY2lmc19idWZfcmVsZWFzZShtaWRFbnRyeS0+cmVzcF9idWYpOworCW1lbXBvb2xfZnJlZShtaWRFbnRyeSwgY2lmc19taWRfcG9vbHApOworfQorCitzdHJ1Y3Qgb3Bsb2NrX3FfZW50cnkgKgorQWxsb2NPcGxvY2tRRW50cnkoc3RydWN0IGlub2RlICogcGlub2RlLCBfX3UxNiBmaWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKiB0Y29uKQoreworCXN0cnVjdCBvcGxvY2tfcV9lbnRyeSAqdGVtcDsKKwlpZiAoKHBpbm9kZT09IE5VTEwpIHx8ICh0Y29uID09IE5VTEwpKSB7CisJCWNFUlJPUigxLCAoIk51bGwgcGFybXMgcGFzc2VkIHRvIEFsbG9jT3Bsb2NrUUVudHJ5IikpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJdGVtcCA9IChzdHJ1Y3Qgb3Bsb2NrX3FfZW50cnkgKikga21lbV9jYWNoZV9hbGxvYyhjaWZzX29wbG9ja19jYWNoZXAsCisJCQkJCQkgICAgICAgU0xBQl9LRVJORUwpOworCWlmICh0ZW1wID09IE5VTEwpCisJCXJldHVybiB0ZW1wOworCWVsc2UgeworCQl0ZW1wLT5waW5vZGUgPSBwaW5vZGU7CisJCXRlbXAtPnRjb24gPSB0Y29uOworCQl0ZW1wLT5uZXRmaWQgPSBmaWQ7CisJCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCQlsaXN0X2FkZF90YWlsKCZ0ZW1wLT5xaGVhZCwgJkdsb2JhbE9wbG9ja19RKTsKKwkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwl9CisJcmV0dXJuIHRlbXA7CisKK30KKwordm9pZCBEZWxldGVPcGxvY2tRRW50cnkoc3RydWN0IG9wbG9ja19xX2VudHJ5ICogb3Bsb2NrRW50cnkpCit7CisJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7IAorICAgIC8qIHNob3VsZCB3ZSBjaGVjayBpZiBsaXN0IGVtcHR5IGZpcnN0PyAqLworCWxpc3RfZGVsKCZvcGxvY2tFbnRyeS0+cWhlYWQpOworCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJa21lbV9jYWNoZV9mcmVlKGNpZnNfb3Bsb2NrX2NhY2hlcCwgb3Bsb2NrRW50cnkpOworfQorCitpbnQKK3NtYl9zZW5kKHN0cnVjdCBzb2NrZXQgKnNzb2NrZXQsIHN0cnVjdCBzbWJfaGRyICpzbWJfYnVmZmVyLAorCSB1bnNpZ25lZCBpbnQgc21iX2J1Zl9sZW5ndGgsIHN0cnVjdCBzb2NrYWRkciAqc2luKQoreworCWludCByYyA9IDA7CisJaW50IGkgPSAwOworCXN0cnVjdCBtc2doZHIgc21iX21zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3Y7CisJdW5zaWduZWQgbGVuID0gc21iX2J1Zl9sZW5ndGggKyA0OworCisJaWYoc3NvY2tldCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT1RTT0NLOyAvKiBCQiBldmVudHVhbGx5IGFkZCByZWNvbm5lY3QgY29kZSBoZXJlICovCisJaW92Lmlvdl9iYXNlID0gc21iX2J1ZmZlcjsKKwlpb3YuaW92X2xlbiA9IGxlbjsKKworCXNtYl9tc2cubXNnX25hbWUgPSBzaW47CisJc21iX21zZy5tc2dfbmFtZWxlbiA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyKTsKKwlzbWJfbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwlzbWJfbXNnLm1zZ19jb250cm9sbGVuID0gMDsKKwlzbWJfbXNnLm1zZ19mbGFncyA9IE1TR19ET05UV0FJVCArIE1TR19OT1NJR05BTDsgLyogQkIgYWRkIG1vcmUgZmxhZ3M/Ki8KKworCS8qIHNtYiBoZWFkZXIgaXMgY29udmVydGVkIGluIGhlYWRlcl9hc3NlbWJsZS4gYmNjIGFuZCByZXN0IG9mIFNNQiB3b3JkCisJICAgYXJlYSwgYW5kIGJ5dGUgYXJlYSBpZiBuZWNlc3NhcnksIGlzIGNvbnZlcnRlZCB0byBsaXR0bGVlbmRpYW4gaW4gCisJICAgY2lmc3NtYi5jIGFuZCBSRkMxMDAxIGxlbiBpcyBjb252ZXJ0ZWQgdG8gYmlnZW5kaWFuIGluIHNtYl9zZW5kIAorCSAgIEZsYWdzMiBpcyBjb252ZXJ0ZWQgaW4gU2VuZFJlY2VpdmUgKi8KKworCXNtYl9idWZmZXItPnNtYl9idWZfbGVuZ3RoID0gY3B1X3RvX2JlMzIoc21iX2J1ZmZlci0+c21iX2J1Zl9sZW5ndGgpOworCWNGWUkoMSwgKCJTZW5kaW5nIHNtYiBvZiBsZW5ndGggJWQgIiwgc21iX2J1Zl9sZW5ndGgpKTsKKwlkdW1wX3NtYihzbWJfYnVmZmVyLCBsZW4pOworCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJcmMgPSBrZXJuZWxfc2VuZG1zZyhzc29ja2V0LCAmc21iX21zZywgJmlvdiwgMSwgbGVuKTsKKwkJaWYgKChyYyA9PSAtRU5PU1BDKSB8fCAocmMgPT0gLUVBR0FJTikpIHsKKwkJCWkrKzsKKwkJCWlmKGkgPiA2MCkgeworCQkJCWNFUlJPUigxLAorCQkJCSAgICgic2VuZHMgb24gc29jayAlcCBzdHVjayBmb3IgMzAgc2Vjb25kcyIsCisJCQkJICAgIHNzb2NrZXQpKTsKKwkJCQlyYyA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQltc2xlZXAoNTAwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChyYyA8IDApIAorCQkJYnJlYWs7CisJCWlvdi5pb3ZfYmFzZSArPSByYzsKKwkJaW92Lmlvdl9sZW4gLT0gcmM7CisJCWxlbiAtPSByYzsKKwl9CisKKwlpZiAocmMgPCAwKSB7CisJCWNFUlJPUigxLCgiRXJyb3IgJWQgc2VuZGluZyBkYXRhIG9uIHNvY2tldCB0byBzZXJ2ZXIuIiwgcmMpKTsKKwl9IGVsc2UgeworCQlyYyA9IDA7CisJfQorCisJcmV0dXJuIHJjOworfQorCisjaWZkZWYgQ0lGU19FWFBFUklNRU5UQUwKKy8qIEJCIGZpbmlzaCBvZmYgdGhpcyBmdW5jdGlvbiwgYWRkaW5nIHN1cHBvcnQgZm9yIHdyaXRpbmcgc2V0IG9mIHBhZ2VzIGFzIGlvdmVjICovCisvKiBhbmQgYWxzbyBhZGRpbmcgc3VwcG9ydCBmb3Igb3BlcmF0aW9ucyB0aGF0IG5lZWQgdG8gcGFyc2UgdGhlIHJlc3BvbnNlIHNtYiAgICAqLworCitpbnQKK3NtYl9zZW5kdihzdHJ1Y3Qgc29ja2V0ICpzc29ja2V0LCBzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlciwKKwkgdW5zaWduZWQgaW50IHNtYl9idWZfbGVuZ3RoLCBzdHJ1Y3Qga3ZlYyAqIHdyaXRlX3ZlY3RvciAvKiBwYWdlIGxpc3QgKi8sIHN0cnVjdCBzb2NrYWRkciAqc2luKQoreworCWludCByYyA9IDA7CisJaW50IGkgPSAwOworCXN0cnVjdCBtc2doZHIgc21iX21zZzsKKwludW1iZXJfb2ZfcGFnZXMgKz0gMTsgLyogYWNjb3VudCBmb3IgU01CIGhlYWRlciAqLworCXN0cnVjdCBrdmVjICogcGlvdiAgPSBrbWFsbG9jKG51bWJlcl9vZl9wYWdlcyAqIHNpemVvZihzdHJ1Y3Qga3ZlYykpOworCWlmKGk9MDtpPG51bV9wYWdlcy0xO2krKworCXVuc2lnbmVkIGxlbiA9IHNtYl9idWZfbGVuZ3RoICsgNDsKKworCWlmKHNzb2NrZXQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9UU09DSzsgLyogQkIgZXZlbnR1YWxseSBhZGQgcmVjb25uZWN0IGNvZGUgaGVyZSAqLworCWlvdi5pb3ZfYmFzZSA9IHNtYl9idWZmZXI7CisJaW92Lmlvdl9sZW4gPSBsZW47CisKKwlzbWJfbXNnLm1zZ19uYW1lID0gc2luOworCXNtYl9tc2cubXNnX25hbWVsZW4gPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcik7CisJc21iX21zZy5tc2dfY29udHJvbCA9IE5VTEw7CisJc21iX21zZy5tc2dfY29udHJvbGxlbiA9IDA7CisJc21iX21zZy5tc2dfZmxhZ3MgPSBNU0dfRE9OVFdBSVQgKyBNU0dfTk9TSUdOQUw7IC8qIEJCIGFkZCBtb3JlIGZsYWdzPyovCisKKwkvKiBzbWIgaGVhZGVyIGlzIGNvbnZlcnRlZCBpbiBoZWFkZXJfYXNzZW1ibGUuIGJjYyBhbmQgcmVzdCBvZiBTTUIgd29yZAorCSAgIGFyZWEsIGFuZCBieXRlIGFyZWEgaWYgbmVjZXNzYXJ5LCBpcyBjb252ZXJ0ZWQgdG8gbGl0dGxlZW5kaWFuIGluIAorCSAgIGNpZnNzbWIuYyBhbmQgUkZDMTAwMSBsZW4gaXMgY29udmVydGVkIHRvIGJpZ2VuZGlhbiBpbiBzbWJfc2VuZCAKKwkgICBGbGFnczIgaXMgY29udmVydGVkIGluIFNlbmRSZWNlaXZlICovCisKKwlzbWJfYnVmZmVyLT5zbWJfYnVmX2xlbmd0aCA9IGNwdV90b19iZTMyKHNtYl9idWZmZXItPnNtYl9idWZfbGVuZ3RoKTsKKwljRllJKDEsICgiU2VuZGluZyBzbWIgb2YgbGVuZ3RoICVkICIsIHNtYl9idWZfbGVuZ3RoKSk7CisJZHVtcF9zbWIoc21iX2J1ZmZlciwgbGVuKTsKKworCXdoaWxlIChsZW4gPiAwKSB7CisJCXJjID0ga2VybmVsX3NlbmRtc2coc3NvY2tldCwgJnNtYl9tc2csICZpb3YsIG51bWJlcl9vZl9wYWdlcywgbGVuPyk7CisJCWlmICgocmMgPT0gLUVOT1NQQykgfHwgKHJjID09IC1FQUdBSU4pKSB7CisJCQlpKys7CisJCQlpZihpID4gNjApIHsKKwkJCQljRVJST1IoMSwKKwkJCQkgICAoInNlbmRzIG9uIHNvY2sgJXAgc3R1Y2sgZm9yIDMwIHNlY29uZHMiLAorCQkJCSAgICBzc29ja2V0KSk7CisJCQkJcmMgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJbXNsZWVwKDUwMCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocmMgPCAwKSAKKwkJCWJyZWFrOworCQlpb3YuaW92X2Jhc2UgKz0gcmM7CisJCWlvdi5pb3ZfbGVuIC09IHJjOworCQlsZW4gLT0gcmM7CisJfQorCisJaWYgKHJjIDwgMCkgeworCQljRVJST1IoMSwoIkVycm9yICVkIHNlbmRpbmcgZGF0YSBvbiBzb2NrZXQgdG8gc2VydmVyLiIsIHJjKSk7CisJfSBlbHNlIHsKKwkJcmMgPSAwOworCX0KKworCXJldHVybiByYzsKK30KKworCitpbnQKK0NJRlNTZW5kUmN2KGNvbnN0IHVuc2lnbmVkIGludCB4aWQsIHN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzLAorCSAgICBzdHJ1Y3Qgc21iX2hkciAqaW5fYnVmLCBzdHJ1Y3Qga3ZlYyAqIHdyaXRlX3ZlY3RvciAvKiBwYWdlIGxpc3QgKi8sIGludCAqcGJ5dGVzX3JldHVybmVkLCBjb25zdCBpbnQgbG9uZ19vcCkKK3sKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IDE1ICogSFo7CisJc3RydWN0IG1pZF9xX2VudHJ5ICptaWRRID0gTlVMTDsKKworCWlmIChzZXMgPT0gTlVMTCkgeworCQljRVJST1IoMSwoIk51bGwgc21iIHNlc3Npb24iKSk7CisJCXJldHVybiAtRUlPOworCX0KKwlpZihzZXMtPnNlcnZlciA9PSBOVUxMKSB7CisJCWNFUlJPUigxLCgiTnVsbCB0Y3Agc2Vzc2lvbiIpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmKHBieXRlc19yZXR1cm5lZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKwllbHNlCisJCSpwYnl0ZXNfcmV0dXJuZWQgPSAwOworCisgIAorCisJLyogRW5zdXJlIHRoYXQgd2UgZG8gbm90IHNlbmQgbW9yZSB0aGFuIDUwIG92ZXJsYXBwaW5nIHJlcXVlc3RzIAorCSAgIHRvIHRoZSBzYW1lIHNlcnZlci4gV2UgbWF5IG1ha2UgdGhpcyBjb25maWd1cmFibGUgbGF0ZXIgb3IKKwkgICB1c2Ugc2VzLT5tYXhSZXEgKi8KKwlpZihsb25nX29wID09IC0xKSB7CisJCS8qIG9wbG9jayBicmVha3MgbXVzdCBub3QgYmUgaGVsZCB1cCAqLworCQlhdG9taWNfaW5jKCZzZXMtPnNlcnZlci0+aW5GbGlnaHQpOworCX0gZWxzZSB7CisJCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOyAKKwkJd2hpbGUoMSkgeyAgICAgICAgCisJCQlpZihhdG9taWNfcmVhZCgmc2VzLT5zZXJ2ZXItPmluRmxpZ2h0KSA+PSBjaWZzX21heF9wZW5kaW5nKXsKKwkJCQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCQkJCXdhaXRfZXZlbnQoc2VzLT5zZXJ2ZXItPnJlcXVlc3RfcSwKKwkJCQkJYXRvbWljX3JlYWQoJnNlcy0+c2VydmVyLT5pbkZsaWdodCkKKwkJCQkJIDwgY2lmc19tYXhfcGVuZGluZyk7CisJCQkJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJCQl9IGVsc2UgeworCQkJCWlmKHNlcy0+c2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc0V4aXRpbmcpIHsKKwkJCQkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJCQkJcmV0dXJuIC1FTk9FTlQ7CisJCQkJfQorCisJCQkvKiBjYW4gbm90IGNvdW50IGxvY2tpbmcgY29tbWFuZHMgYWdhaW5zdCB0b3RhbCBzaW5jZQorCQkJICAgdGhleSBhcmUgYWxsb3dlZCB0byBibG9jayBvbiBzZXJ2ZXIgKi8KKwkJCQkJCisJCQkJaWYobG9uZ19vcCA8IDMpIHsKKwkJCQkvKiB1cGRhdGUgIyBvZiByZXF1ZXN0cyBvbiB0aGUgd2lyZSB0byBzZXJ2ZXIgKi8KKwkJCQkJYXRvbWljX2luYygmc2VzLT5zZXJ2ZXItPmluRmxpZ2h0KTsKKwkJCQl9CisJCQkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkvKiBtYWtlIHN1cmUgdGhhdCB3ZSBzaWduIGluIHRoZSBzYW1lIG9yZGVyIHRoYXQgd2Ugc2VuZCBvbiB0aGlzIHNvY2tldCAKKwkgICBhbmQgYXZvaWQgcmFjZXMgaW5zaWRlIHRjcCBzZW5kbXNnIGNvZGUgdGhhdCBjb3VsZCBjYXVzZSBjb3JydXB0aW9uCisJICAgb2Ygc21iIGRhdGEgKi8KKworCWRvd24oJnNlcy0+c2VydmVyLT50Y3BTZW0pOyAKKworCWlmIChzZXMtPnNlcnZlci0+dGNwU3RhdHVzID09IENpZnNFeGl0aW5nKSB7CisJCXJjID0gLUVOT0VOVDsKKwkJZ290byBjaWZzX291dF9sYWJlbDsKKwl9IGVsc2UgaWYgKHNlcy0+c2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc05lZWRSZWNvbm5lY3QpIHsKKwkJY0ZZSSgxLCgidGNwIHNlc3Npb24gZGVhZCAtIHJldHVybiB0byBjYWxsZXIgdG8gcmV0cnkiKSk7CisJCXJjID0gLUVBR0FJTjsKKwkJZ290byBjaWZzX291dF9sYWJlbDsKKwl9IGVsc2UgaWYgKHNlcy0+c3RhdHVzICE9IENpZnNHb29kKSB7CisJCS8qIGNoZWNrIGlmIFNNQiBzZXNzaW9uIGlzIGJhZCBiZWNhdXNlIHdlIGFyZSBzZXR0aW5nIGl0IHVwICovCisJCWlmKChpbl9idWYtPkNvbW1hbmQgIT0gU01CX0NPTV9TRVNTSU9OX1NFVFVQX0FORFgpICYmIAorCQkJKGluX2J1Zi0+Q29tbWFuZCAhPSBTTUJfQ09NX05FR09USUFURSkpIHsKKwkJCXJjID0gLUVBR0FJTjsKKwkJCWdvdG8gY2lmc19vdXRfbGFiZWw7CisJCX0gLyogZWxzZSBvayAtIHdlIGFyZSBzZXR0aW5nIHVwIHNlc3Npb24gKi8KKwl9CisJbWlkUSA9IEFsbG9jTWlkUUVudHJ5KGluX2J1Ziwgc2VzKTsKKwlpZiAobWlkUSA9PSBOVUxMKSB7CisJCXVwKCZzZXMtPnNlcnZlci0+dGNwU2VtKTsKKwkJLyogSWYgbm90IGxvY2sgcmVxLCB1cGRhdGUgIyBvZiByZXF1ZXN0cyBvbiB3aXJlIHRvIHNlcnZlciAqLworCQlpZihsb25nX29wIDwgMykgeworCQkJYXRvbWljX2RlYygmc2VzLT5zZXJ2ZXItPmluRmxpZ2h0KTsgCisJCQl3YWtlX3VwKCZzZXMtPnNlcnZlci0+cmVxdWVzdF9xKTsKKwkJfQorCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoaW5fYnVmLT5zbWJfYnVmX2xlbmd0aCA+IENJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUgLSA0KSB7CisJCXVwKCZzZXMtPnNlcnZlci0+dGNwU2VtKTsKKwkJY0VSUk9SKDEsCisJCSAgICAgICAoIklsbGVnYWwgbGVuZ3RoLCBncmVhdGVyIHRoYW4gbWF4aW11bSBmcmFtZSwgJWQgIiwKKwkJCWluX2J1Zi0+c21iX2J1Zl9sZW5ndGgpKTsKKwkJRGVsZXRlTWlkUUVudHJ5KG1pZFEpOworCQkvKiBJZiBub3QgbG9jayByZXEsIHVwZGF0ZSAjIG9mIHJlcXVlc3RzIG9uIHdpcmUgdG8gc2VydmVyICovCisJCWlmKGxvbmdfb3AgPCAzKSB7CisJCQlhdG9taWNfZGVjKCZzZXMtPnNlcnZlci0+aW5GbGlnaHQpOyAKKwkJCXdha2VfdXAoJnNlcy0+c2VydmVyLT5yZXF1ZXN0X3EpOworCQl9CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIEJCIGNhbiB3ZSBzaWduIGVmZmljaWVudGx5IGluIHRoaXMgcGF0aD8gKi8KKwlyYyA9IGNpZnNfc2lnbl9zbWIoaW5fYnVmLCBzZXMsICZtaWRRLT5zZXF1ZW5jZV9udW1iZXIpOworCisJbWlkUS0+bWlkU3RhdGUgPSBNSURfUkVRVUVTVF9TVUJNSVRURUQ7CisvKglyYyA9IHNtYl9zZW5kdihzZXMtPnNlcnZlci0+c3NvY2tldCwgaW5fYnVmLCBpbl9idWYtPnNtYl9idWZfbGVuZ3RoLCBwaW92ZWMsCisJCSAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJihzZXMtPnNlcnZlci0+YWRkci5zb2NrQWRkcikpOyovCisJaWYocmMgPCAwKSB7CisJCURlbGV0ZU1pZFFFbnRyeShtaWRRKTsKKwkJdXAoJnNlcy0+c2VydmVyLT50Y3BTZW0pOworCQkvKiBJZiBub3QgbG9jayByZXEsIHVwZGF0ZSAjIG9mIHJlcXVlc3RzIG9uIHdpcmUgdG8gc2VydmVyICovCisJCWlmKGxvbmdfb3AgPCAzKSB7CisJCQlhdG9taWNfZGVjKCZzZXMtPnNlcnZlci0+aW5GbGlnaHQpOyAKKwkJCXdha2VfdXAoJnNlcy0+c2VydmVyLT5yZXF1ZXN0X3EpOworCQl9CisJCXJldHVybiByYzsKKwl9IGVsc2UKKwkJdXAoJnNlcy0+c2VydmVyLT50Y3BTZW0pOworY2lmc19vdXRfbGFiZWw6CisJaWYobWlkUSkKKwkgICAgICAgIERlbGV0ZU1pZFFFbnRyeShtaWRRKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCWlmKGxvbmdfb3AgPCAzKSB7CisJCWF0b21pY19kZWMoJnNlcy0+c2VydmVyLT5pbkZsaWdodCk7CisJCXdha2VfdXAoJnNlcy0+c2VydmVyLT5yZXF1ZXN0X3EpOworCX0KKworCXJldHVybiByYzsKK30KKworCisjZW5kaWYgLyogQ0lGU19FWFBFUklNRU5UQUwgKi8KKworaW50CitTZW5kUmVjZWl2ZShjb25zdCB1bnNpZ25lZCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Nlc0luZm8gKnNlcywKKwkgICAgc3RydWN0IHNtYl9oZHIgKmluX2J1Ziwgc3RydWN0IHNtYl9oZHIgKm91dF9idWYsCisJICAgIGludCAqcGJ5dGVzX3JldHVybmVkLCBjb25zdCBpbnQgbG9uZ19vcCkKK3sKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGludCByZWNlaXZlX2xlbjsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJc3RydWN0IG1pZF9xX2VudHJ5ICptaWRROworCisJaWYgKHNlcyA9PSBOVUxMKSB7CisJCWNFUlJPUigxLCgiTnVsbCBzbWIgc2Vzc2lvbiIpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmKHNlcy0+c2VydmVyID09IE5VTEwpIHsKKwkJY0VSUk9SKDEsKCJOdWxsIHRjcCBzZXNzaW9uIikpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBFbnN1cmUgdGhhdCB3ZSBkbyBub3Qgc2VuZCBtb3JlIHRoYW4gNTAgb3ZlcmxhcHBpbmcgcmVxdWVzdHMgCisJICAgdG8gdGhlIHNhbWUgc2VydmVyLiBXZSBtYXkgbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZSBsYXRlciBvcgorCSAgIHVzZSBzZXMtPm1heFJlcSAqLworCWlmKGxvbmdfb3AgPT0gLTEpIHsKKwkJLyogb3Bsb2NrIGJyZWFrcyBtdXN0IG5vdCBiZSBoZWxkIHVwICovCisJCWF0b21pY19pbmMoJnNlcy0+c2VydmVyLT5pbkZsaWdodCk7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7IAorCQl3aGlsZSgxKSB7ICAgICAgICAKKwkJCWlmKGF0b21pY19yZWFkKCZzZXMtPnNlcnZlci0+aW5GbGlnaHQpID49IGNpZnNfbWF4X3BlbmRpbmcpeworCQkJCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJCQkJd2FpdF9ldmVudChzZXMtPnNlcnZlci0+cmVxdWVzdF9xLAorCQkJCQlhdG9taWNfcmVhZCgmc2VzLT5zZXJ2ZXItPmluRmxpZ2h0KQorCQkJCQkgPCBjaWZzX21heF9wZW5kaW5nKTsKKwkJCQlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYoc2VzLT5zZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzRXhpdGluZykgeworCQkJCQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCQkJCQlyZXR1cm4gLUVOT0VOVDsKKwkJCQl9CisKKwkJCS8qIGNhbiBub3QgY291bnQgbG9ja2luZyBjb21tYW5kcyBhZ2FpbnN0IHRvdGFsIHNpbmNlCisJCQkgICB0aGV5IGFyZSBhbGxvd2VkIHRvIGJsb2NrIG9uIHNlcnZlciAqLworCQkJCQkKKwkJCQlpZihsb25nX29wIDwgMykgeworCQkJCS8qIHVwZGF0ZSAjIG9mIHJlcXVlc3RzIG9uIHRoZSB3aXJlIHRvIHNlcnZlciAqLworCQkJCQlhdG9taWNfaW5jKCZzZXMtPnNlcnZlci0+aW5GbGlnaHQpOworCQkJCX0KKwkJCQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCS8qIG1ha2Ugc3VyZSB0aGF0IHdlIHNpZ24gaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB3ZSBzZW5kIG9uIHRoaXMgc29ja2V0IAorCSAgIGFuZCBhdm9pZCByYWNlcyBpbnNpZGUgdGNwIHNlbmRtc2cgY29kZSB0aGF0IGNvdWxkIGNhdXNlIGNvcnJ1cHRpb24KKwkgICBvZiBzbWIgZGF0YSAqLworCisJZG93bigmc2VzLT5zZXJ2ZXItPnRjcFNlbSk7IAorCisJaWYgKHNlcy0+c2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc0V4aXRpbmcpIHsKKwkJcmMgPSAtRU5PRU5UOworCQlnb3RvIG91dF91bmxvY2s7CisJfSBlbHNlIGlmIChzZXMtPnNlcnZlci0+dGNwU3RhdHVzID09IENpZnNOZWVkUmVjb25uZWN0KSB7CisJCWNGWUkoMSwoInRjcCBzZXNzaW9uIGRlYWQgLSByZXR1cm4gdG8gY2FsbGVyIHRvIHJldHJ5IikpOworCQlyYyA9IC1FQUdBSU47CisJCWdvdG8gb3V0X3VubG9jazsKKwl9IGVsc2UgaWYgKHNlcy0+c3RhdHVzICE9IENpZnNHb29kKSB7CisJCS8qIGNoZWNrIGlmIFNNQiBzZXNzaW9uIGlzIGJhZCBiZWNhdXNlIHdlIGFyZSBzZXR0aW5nIGl0IHVwICovCisJCWlmKChpbl9idWYtPkNvbW1hbmQgIT0gU01CX0NPTV9TRVNTSU9OX1NFVFVQX0FORFgpICYmIAorCQkJKGluX2J1Zi0+Q29tbWFuZCAhPSBTTUJfQ09NX05FR09USUFURSkpIHsKKwkJCXJjID0gLUVBR0FJTjsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfSAvKiBlbHNlIG9rIC0gd2UgYXJlIHNldHRpbmcgdXAgc2Vzc2lvbiAqLworCX0KKwltaWRRID0gQWxsb2NNaWRRRW50cnkoaW5fYnVmLCBzZXMpOworCWlmIChtaWRRID09IE5VTEwpIHsKKwkJdXAoJnNlcy0+c2VydmVyLT50Y3BTZW0pOworCQkvKiBJZiBub3QgbG9jayByZXEsIHVwZGF0ZSAjIG9mIHJlcXVlc3RzIG9uIHdpcmUgdG8gc2VydmVyICovCisJCWlmKGxvbmdfb3AgPCAzKSB7CisJCQlhdG9taWNfZGVjKCZzZXMtPnNlcnZlci0+aW5GbGlnaHQpOyAKKwkJCXdha2VfdXAoJnNlcy0+c2VydmVyLT5yZXF1ZXN0X3EpOworCQl9CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChpbl9idWYtPnNtYl9idWZfbGVuZ3RoID4gQ0lGU01heEJ1ZlNpemUgKyBNQVhfQ0lGU19IRFJfU0laRSAtIDQpIHsKKwkJdXAoJnNlcy0+c2VydmVyLT50Y3BTZW0pOworCQljRVJST1IoMSwKKwkJICAgICAgICgiSWxsZWdhbCBsZW5ndGgsIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIGZyYW1lLCAlZCAiLAorCQkJaW5fYnVmLT5zbWJfYnVmX2xlbmd0aCkpOworCQlEZWxldGVNaWRRRW50cnkobWlkUSk7CisJCS8qIElmIG5vdCBsb2NrIHJlcSwgdXBkYXRlICMgb2YgcmVxdWVzdHMgb24gd2lyZSB0byBzZXJ2ZXIgKi8KKwkJaWYobG9uZ19vcCA8IDMpIHsKKwkJCWF0b21pY19kZWMoJnNlcy0+c2VydmVyLT5pbkZsaWdodCk7IAorCQkJd2FrZV91cCgmc2VzLT5zZXJ2ZXItPnJlcXVlc3RfcSk7CisJCX0KKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmMgPSBjaWZzX3NpZ25fc21iKGluX2J1Ziwgc2VzLCAmbWlkUS0+c2VxdWVuY2VfbnVtYmVyKTsKKworCW1pZFEtPm1pZFN0YXRlID0gTUlEX1JFUVVFU1RfU1VCTUlUVEVEOworCXJjID0gc21iX3NlbmQoc2VzLT5zZXJ2ZXItPnNzb2NrZXQsIGluX2J1ZiwgaW5fYnVmLT5zbWJfYnVmX2xlbmd0aCwKKwkJICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmKHNlcy0+c2VydmVyLT5hZGRyLnNvY2tBZGRyKSk7CisJaWYocmMgPCAwKSB7CisJCURlbGV0ZU1pZFFFbnRyeShtaWRRKTsKKwkJdXAoJnNlcy0+c2VydmVyLT50Y3BTZW0pOworCQkvKiBJZiBub3QgbG9jayByZXEsIHVwZGF0ZSAjIG9mIHJlcXVlc3RzIG9uIHdpcmUgdG8gc2VydmVyICovCisJCWlmKGxvbmdfb3AgPCAzKSB7CisJCQlhdG9taWNfZGVjKCZzZXMtPnNlcnZlci0+aW5GbGlnaHQpOyAKKwkJCXdha2VfdXAoJnNlcy0+c2VydmVyLT5yZXF1ZXN0X3EpOworCQl9CisJCXJldHVybiByYzsKKwl9IGVsc2UKKwkJdXAoJnNlcy0+c2VydmVyLT50Y3BTZW0pOworCWlmIChsb25nX29wID09IC0xKQorCQlnb3RvIGNpZnNfbm9fcmVzcG9uc2VfZXhpdDsKKwllbHNlIGlmIChsb25nX29wID09IDIpIC8qIHdyaXRlcyBwYXN0IGVuZCBvZiBmaWxlIGNhbiB0YWtlIGxvb29vb25nIHRpbWUgKi8KKwkJdGltZW91dCA9IDMwMCAqIEhaOworCWVsc2UgaWYgKGxvbmdfb3AgPT0gMSkKKwkJdGltZW91dCA9IDQ1ICogSFo7IC8qIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gCisJCQlzZXJ2ZXJzIG9wbG9jayBicmVhayB0aW1lb3V0IChhYm91dCA0MyBzZWNvbmRzKSAqLworCWVsc2UgaWYgKGxvbmdfb3AgPiAyKSB7CisJCXRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwl9IGVsc2UKKwkJdGltZW91dCA9IDE1ICogSFo7CisJLyogd2FpdCBmb3IgMTUgc2Vjb25kcyBvciB1bnRpbCB3b2tlbiB1cCBkdWUgdG8gcmVzcG9uc2UgYXJyaXZpbmcgb3IgCisJICAgZHVlIHRvIGxhc3QgY29ubmVjdGlvbiB0byB0aGlzIHNlcnZlciBiZWluZyB1bm1vdW50ZWQgKi8KKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJLyogaWYgc2lnbmFsIHBlbmRpbmcgZG8gbm90IGhvbGQgdXAgdXNlciBmb3IgZnVsbCBzbWIgdGltZW91dAorCQlidXQgd2Ugc3RpbGwgZ2l2ZSByZXNwb25zZSBhIGNoYW5nZSB0byBjb21wbGV0ZSAqLworCQl0aW1lb3V0ID0gMiAqIEhaOworCX0gICAKKworCS8qIE5vIHVzZXIgaW50ZXJydXB0cyBpbiB3YWl0IC0gd3JlYWtzIGhhdm9jIHdpdGggcGVyZm9ybWFuY2UgKi8KKwlpZih0aW1lb3V0ICE9IE1BWF9TQ0hFRFVMRV9USU1FT1VUKSB7CisJCXRpbWVvdXQgKz0gamlmZmllczsKKwkJd2FpdF9ldmVudChzZXMtPnNlcnZlci0+cmVzcG9uc2VfcSwKKwkJCSghKG1pZFEtPm1pZFN0YXRlICYgTUlEX1JFUVVFU1RfU1VCTUlUVEVEKSkgfHwgCisJCQl0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpIHx8IAorCQkJKChzZXMtPnNlcnZlci0+dGNwU3RhdHVzICE9IENpZnNHb29kKSAmJgorCQkJIChzZXMtPnNlcnZlci0+dGNwU3RhdHVzICE9IENpZnNOZXcpKSk7CisJfSBlbHNlIHsKKwkJd2FpdF9ldmVudChzZXMtPnNlcnZlci0+cmVzcG9uc2VfcSwKKwkJCSghKG1pZFEtPm1pZFN0YXRlICYgTUlEX1JFUVVFU1RfU1VCTUlUVEVEKSkgfHwgCisJCQkoKHNlcy0+c2VydmVyLT50Y3BTdGF0dXMgIT0gQ2lmc0dvb2QpICYmCisJCQkgKHNlcy0+c2VydmVyLT50Y3BTdGF0dXMgIT0gQ2lmc05ldykpKTsKKwl9CisKKwlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwlpZiAobWlkUS0+cmVzcF9idWYpIHsKKwkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJcmVjZWl2ZV9sZW4gPSBiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKW1pZFEtPnJlc3BfYnVmKTsKKwl9IGVsc2UgeworCQljRVJST1IoMSwoIk5vIHJlc3BvbnNlIGJ1ZmZlciIpKTsKKwkJaWYobWlkUS0+bWlkU3RhdGUgPT0gTUlEX1JFUVVFU1RfU1VCTUlUVEVEKSB7CisJCQlpZihzZXMtPnNlcnZlci0+dGNwU3RhdHVzID09IENpZnNFeGl0aW5nKQorCQkJCXJjID0gLUVIT1NURE9XTjsKKwkJCWVsc2UgeworCQkJCXNlcy0+c2VydmVyLT50Y3BTdGF0dXMgPSBDaWZzTmVlZFJlY29ubmVjdDsKKwkJCQltaWRRLT5taWRTdGF0ZSA9IE1JRF9SRVRSWV9ORUVERUQ7CisJCQl9CisJCX0KKworCQlpZiAocmMgIT0gLUVIT1NURE9XTikgeworCQkJaWYobWlkUS0+bWlkU3RhdGUgPT0gTUlEX1JFVFJZX05FRURFRCkgeworCQkJCXJjID0gLUVBR0FJTjsKKwkJCQljRllJKDEsKCJtYXJraW5nIHJlcXVlc3QgZm9yIHJldHJ5IikpOworCQkJfSBlbHNlIHsKKwkJCQlyYyA9IC1FSU87CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJRGVsZXRlTWlkUUVudHJ5KG1pZFEpOworCQkvKiBJZiBub3QgbG9jayByZXEsIHVwZGF0ZSAjIG9mIHJlcXVlc3RzIG9uIHdpcmUgdG8gc2VydmVyICovCisJCWlmKGxvbmdfb3AgPCAzKSB7CisJCQlhdG9taWNfZGVjKCZzZXMtPnNlcnZlci0+aW5GbGlnaHQpOyAKKwkJCXdha2VfdXAoJnNlcy0+c2VydmVyLT5yZXF1ZXN0X3EpOworCQl9CisJCXJldHVybiByYzsKKwl9CisgIAorCWlmIChyZWNlaXZlX2xlbiA+IENJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUpIHsKKwkJY0VSUk9SKDEsCisJCSAgICAgICAoIkZyYW1lIHRvbyBsYXJnZSByZWNlaXZlZC4gIExlbmd0aDogJWQgIFhpZDogJWQiLAorCQkJcmVjZWl2ZV9sZW4sIHhpZCkpOworCQlyYyA9IC1FSU87CisJfSBlbHNlIHsJCS8qIHJjdmQgZnJhbWUgaXMgb2sgKi8KKworCQlpZiAobWlkUS0+cmVzcF9idWYgJiYgb3V0X2J1ZgorCQkgICAgJiYgKG1pZFEtPm1pZFN0YXRlID09IE1JRF9SRVNQT05TRV9SRUNFSVZFRCkpIHsKKwkJCW91dF9idWYtPnNtYl9idWZfbGVuZ3RoID0gcmVjZWl2ZV9sZW47CisJCQltZW1jcHkoKGNoYXIgKilvdXRfYnVmICsgNCwKKwkJCSAgICAgICAoY2hhciAqKW1pZFEtPnJlc3BfYnVmICsgNCwKKwkJCSAgICAgICByZWNlaXZlX2xlbik7CisKKwkJCWR1bXBfc21iKG91dF9idWYsIDkyKTsKKwkJCS8qIGNvbnZlcnQgdGhlIGxlbmd0aCBpbnRvIGEgbW9yZSB1c2FibGUgZm9ybSAqLworCQkJaWYoKHJlY2VpdmVfbGVuID4gMjQpICYmCisJCQkgICAoc2VzLT5zZXJ2ZXItPnNlY01vZGUgJiAoU0VDTU9ERV9TSUdOX1JFUVVJUkVEIHwgU0VDTU9ERV9TSUdOX0VOQUJMRUQpKSkgeworCQkJCXJjID0gY2lmc192ZXJpZnlfc2lnbmF0dXJlKG91dF9idWYsIHNlcy0+bWFjX3NpZ25pbmdfa2V5LG1pZFEtPnNlcXVlbmNlX251bWJlcik7IC8qIEJCIGZpeCBCQiAqLworCQkJCWlmKHJjKQorCQkJCQljRllJKDEsKCJVbmV4cGVjdGVkIHNpZ25hdHVyZSByZWNlaXZlZCBmcm9tIHNlcnZlciIpKTsKKwkJCX0KKworCQkJKnBieXRlc19yZXR1cm5lZCA9IG91dF9idWYtPnNtYl9idWZfbGVuZ3RoOworCisJCQkvKiBCQiBzcGVjaWFsIGNhc2UgcmVjb25uZWN0IHRpZCBhbmQgcmVjb25uZWN0IHVpZCBoZXJlPyAqLworCQkJcmMgPSBtYXBfc21iX3RvX2xpbnV4X2Vycm9yKG91dF9idWYpOworCisJCQkvKiBjb252ZXJ0IEJ5dGVDb3VudCBpZiBuZWNlc3NhcnkgKi8KKwkJCWlmIChyZWNlaXZlX2xlbiA+PQorCQkJICAgIHNpemVvZiAoc3RydWN0IHNtYl9oZHIpIC0KKwkJCSAgICA0IC8qIGRvIG5vdCBjb3VudCBSRkMxMDAxIGhlYWRlciAqLyAgKworCQkJICAgICgyICogb3V0X2J1Zi0+V29yZENvdW50KSArIDIgLyogYmNjICovICkKKwkJCQlCQ0Mob3V0X2J1ZikgPSBsZTE2X3RvX2NwdShCQ0Mob3V0X2J1ZikpOworCQl9IGVsc2UgeworCQkJcmMgPSAtRUlPOworCQkJY0ZZSSgxLCgiQmFkIE1JRCBzdGF0ZT8gIikpOworCQl9CisJfQorY2lmc19ub19yZXNwb25zZV9leGl0OgorCURlbGV0ZU1pZFFFbnRyeShtaWRRKTsKKworCWlmKGxvbmdfb3AgPCAzKSB7CisJCWF0b21pY19kZWMoJnNlcy0+c2VydmVyLT5pbkZsaWdodCk7IAorCQl3YWtlX3VwKCZzZXMtPnNlcnZlci0+cmVxdWVzdF9xKTsKKwl9CisKKwlyZXR1cm4gcmM7CisKK291dF91bmxvY2s6CisJdXAoJnNlcy0+c2VydmVyLT50Y3BTZW0pOworCS8qIElmIG5vdCBsb2NrIHJlcSwgdXBkYXRlICMgb2YgcmVxdWVzdHMgb24gd2lyZSB0byBzZXJ2ZXIgKi8KKwlpZihsb25nX29wIDwgMykgeworCQlhdG9taWNfZGVjKCZzZXMtPnNlcnZlci0+aW5GbGlnaHQpOyAKKwkJd2FrZV91cCgmc2VzLT5zZXJ2ZXItPnJlcXVlc3RfcSk7CisJfQorCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy94YXR0ci5jIGIvZnMvY2lmcy94YXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OWFmYTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL3hhdHRyLmMKQEAgLTAsMCArMSwzMzQgQEAKKy8qCisgKiAgIGZzL2NpZnMveGF0dHIuYworICoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMworICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsX3hhdHRyLmg+CisjaW5jbHVkZSAiY2lmc2ZzLmgiCisjaW5jbHVkZSAiY2lmc3BkdS5oIgorI2luY2x1ZGUgImNpZnNnbG9iLmgiCisjaW5jbHVkZSAiY2lmc3Byb3RvLmgiCisjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgorCisjZGVmaW5lIE1BWF9FQV9WQUxVRV9TSVpFIDY1NTM1CisjZGVmaW5lIENJRlNfWEFUVFJfRE9TX0FUVFJJQiAidXNlci5Eb3NBdHRyaWIiCisjZGVmaW5lIENJRlNfWEFUVFJfVVNFUl9QUkVGSVggInVzZXIuIgorI2RlZmluZSBDSUZTX1hBVFRSX1NZU1RFTV9QUkVGSVggInN5c3RlbS4iCisjZGVmaW5lIENJRlNfWEFUVFJfT1MyX1BSRUZJWCAib3MyLiIKKyNkZWZpbmUgQ0lGU19YQVRUUl9TRUNVUklUWV9QUkVGSVggIi5zZWN1cml0eSIKKyNkZWZpbmUgQ0lGU19YQVRUUl9UUlVTVEVEX1BSRUZJWCAidHJ1c3RlZC4iCisjZGVmaW5lIFhBVFRSX1RSVVNURURfUFJFRklYX0xFTiAgOAorI2RlZmluZSBYQVRUUl9TRUNVUklUWV9QUkVGSVhfTEVOIDkKKy8qIEJCIG5lZWQgdG8gYWRkIHNlcnZlciAoU2FtYmEgZS5nKSBzdXBwb3J0IGZvciBzZWN1cml0eSBhbmQgdHJ1c3RlZCBwcmVmaXggKi8KKyAgCisKKworaW50IGNpZnNfcmVtb3ZleGF0dHIoc3RydWN0IGRlbnRyeSAqIGRpcmVudHJ5LCBjb25zdCBjaGFyICogZWFfbmFtZSkKK3sKKwlpbnQgcmMgPSAtRU9QTk9UU1VQUDsKKyNpZmRlZiBDT05GSUdfQ0lGU19YQVRUUgorCWludCB4aWQ7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwljaGFyICogZnVsbF9wYXRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCWlmKGRpcmVudHJ5ID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCWlmKGRpcmVudHJ5LT5kX2lub2RlID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCXNiID0gZGlyZW50cnktPmRfaW5vZGUtPmlfc2I7CisJaWYoc2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisJeGlkID0gR2V0WGlkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJY2lmc19zYiA9IENJRlNfU0Ioc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlkb3duKCZzYi0+c192ZnNfcmVuYW1lX3NlbSk7CisJZnVsbF9wYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShkaXJlbnRyeSk7CisJdXAoJnNiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlpZihmdWxsX3BhdGggPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpZihlYV9uYW1lID09IE5VTEwpIHsKKwkJY0ZZSSgxLCgiTnVsbCB4YXR0ciBuYW1lcyBub3Qgc3VwcG9ydGVkIikpOworCX0gZWxzZSBpZihzdHJuY21wKGVhX25hbWUsQ0lGU19YQVRUUl9VU0VSX1BSRUZJWCw1KQorCQkmJiAoc3RybmNtcChlYV9uYW1lLENJRlNfWEFUVFJfT1MyX1BSRUZJWCw0KSkpIHsKKwkJY0ZZSSgxLCgiaWxsZWdhbCB4YXR0ciBuYW1lc3BhY2UgJXMgKG9ubHkgdXNlciBuYW1lc3BhY2Ugc3VwcG9ydGVkKSIsZWFfbmFtZSkpOworCQkvKiBCQiB3aGF0IGlmIG5vIG5hbWVzcGFjZSBwcmVmaXg/ICovCisJCS8qIFNob3VsZCB3ZSBqdXN0IHBhc3MgdGhlbSB0byBzZXJ2ZXIsIGV4Y2VwdCBmb3IKKwkJc3lzdGVtIGFuZCBwZXJoYXBzIHNlY3VyaXR5IHByZWZpeGVzPyAqLworCX0gZWxzZSB7CisJCWlmKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9OT19YQVRUUikKKwkJCWdvdG8gcmVtb3ZlX2VhX2V4aXQ7CisKKwkJZWFfbmFtZSs9NTsgLyogc2tpcCBwYXN0IHVzZXIuIHByZWZpeCAqLworCQlyYyA9IENJRlNTTUJTZXRFQSh4aWQscFRjb24sZnVsbF9wYXRoLGVhX25hbWUsTlVMTCwKKwkJCShfX3UxNikwLCBjaWZzX3NiLT5sb2NhbF9ubHMpOworCX0KK3JlbW92ZV9lYV9leGl0OgorCWlmIChmdWxsX3BhdGgpCisJCWtmcmVlKGZ1bGxfcGF0aCk7CisJRnJlZVhpZCh4aWQpOworI2VuZGlmCisJcmV0dXJuIHJjOworfQorCitpbnQgY2lmc19zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICogZGlyZW50cnksIGNvbnN0IGNoYXIgKiBlYV9uYW1lLAorICAgICAgICBjb25zdCB2b2lkICogZWFfdmFsdWUsIHNpemVfdCB2YWx1ZV9zaXplLCBpbnQgZmxhZ3MpCit7CisJaW50IHJjID0gLUVPUE5PVFNVUFA7CisjaWZkZWYgQ09ORklHX0NJRlNfWEFUVFIKKwlpbnQgeGlkOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJY2hhciAqIGZ1bGxfcGF0aDsKKworCWlmKGRpcmVudHJ5ID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCWlmKGRpcmVudHJ5LT5kX2lub2RlID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCXNiID0gZGlyZW50cnktPmRfaW5vZGUtPmlfc2I7CisJaWYoc2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisJeGlkID0gR2V0WGlkKCk7CisKKwljaWZzX3NiID0gQ0lGU19TQihzYik7CisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworCisJZG93bigmc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCWZ1bGxfcGF0aCA9IGJ1aWxkX3BhdGhfZnJvbV9kZW50cnkoZGlyZW50cnkpOworCXVwKCZzYi0+c192ZnNfcmVuYW1lX3NlbSk7CisJaWYoZnVsbF9wYXRoID09IE5VTEwpIHsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogcmV0dXJuIGRvcyBhdHRyaWJ1dGVzIGFzIHBzZXVkbyB4YXR0ciAqLworCS8qIHJldHVybiBhbHQgbmFtZSBpZiBhdmFpbGFibGUgYXMgcHNldWRvIGF0dHIgKi8KKworCS8qIGlmIHByb2MvZnMvY2lmcy9zdHJlYW1zdG94YXR0ciBpcyBzZXQgdGhlbgorCQlzZWFyY2ggc2VydmVyIGZvciBFQXMgb3Igc3RyZWFtcyB0byAKKwkJcmV0dXJucyBhcyB4YXR0cnMgKi8KKwlpZih2YWx1ZV9zaXplID4gTUFYX0VBX1ZBTFVFX1NJWkUpIHsKKwkJY0ZZSSgxLCgic2l6ZSBvZiBFQSB2YWx1ZSB0b28gbGFyZ2UiKSk7CisJCWlmKGZ1bGxfcGF0aCkKKwkJCWtmcmVlKGZ1bGxfcGF0aCk7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCWlmKGVhX25hbWUgPT0gTlVMTCkgeworCQljRllJKDEsKCJOdWxsIHhhdHRyIG5hbWVzIG5vdCBzdXBwb3J0ZWQiKSk7CisJfSBlbHNlIGlmKHN0cm5jbXAoZWFfbmFtZSxDSUZTX1hBVFRSX1VTRVJfUFJFRklYLDUpID09IDApIHsKKwkJaWYoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX05PX1hBVFRSKQorCQkJZ290byBzZXRfZWFfZXhpdDsKKwkJaWYoc3RybmNtcChlYV9uYW1lLENJRlNfWEFUVFJfRE9TX0FUVFJJQiwxNCkgPT0gMCkgeworCQkJY0ZZSSgxLCgiYXR0ZW1wdCB0byBzZXQgY2lmcyBpbm9kZSBtZXRhZGF0YSIpKTsKKwkJfQorCQllYV9uYW1lICs9IDU7IC8qIHNraXAgcGFzdCB1c2VyLiBwcmVmaXggKi8KKwkJcmMgPSBDSUZTU01CU2V0RUEoeGlkLHBUY29uLGZ1bGxfcGF0aCxlYV9uYW1lLGVhX3ZhbHVlLAorCQkJKF9fdTE2KXZhbHVlX3NpemUsIGNpZnNfc2ItPmxvY2FsX25scyk7CisJfSBlbHNlIGlmKHN0cm5jbXAoZWFfbmFtZSwgQ0lGU19YQVRUUl9PUzJfUFJFRklYLDQpID09IDApIHsKKwkJaWYoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX05PX1hBVFRSKQorCQkJZ290byBzZXRfZWFfZXhpdDsKKworCQllYV9uYW1lICs9IDQ7IC8qIHNraXAgcGFzdCBvczIuIHByZWZpeCAqLworCQlyYyA9IENJRlNTTUJTZXRFQSh4aWQscFRjb24sZnVsbF9wYXRoLGVhX25hbWUsZWFfdmFsdWUsCisJCQkoX191MTYpdmFsdWVfc2l6ZSwgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwl9IGVsc2UgeworCQlpbnQgdGVtcDsgCisJCXRlbXAgPSBzdHJuY21wKGVhX25hbWUsUE9TSVhfQUNMX1hBVFRSX0FDQ0VTUywKKwkJCXN0cmxlbihQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTKSk7CisJCWlmICh0ZW1wID09IDApIHsKKyNpZmRlZiBDT05GSUdfQ0lGU19QT1NJWAorCQkJcmMgPSBDSUZTU01CU2V0UG9zaXhBQ0woeGlkLCBwVGNvbixmdWxsX3BhdGgsZWFfdmFsdWUsCisJCQkJKGNvbnN0IGludCl2YWx1ZV9zaXplLCBBQ0xfVFlQRV9BQ0NFU1MsCisJCQkJY2lmc19zYi0+bG9jYWxfbmxzKTsKKwkJCWNGWUkoMSwoInNldCBQT1NJWCBBQ0wgcmMgJWQiLHJjKSk7CisjZWxzZQorCQkJY0ZZSSgxLCgic2V0IFBPU0lYIEFDTCBub3Qgc3VwcG9ydGVkIikpOworI2VuZGlmCisJCX0gZWxzZSBpZihzdHJuY21wKGVhX25hbWUsUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQsc3RybGVuKFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUKSkgPT0gMCkgeworI2lmZGVmIENPTkZJR19DSUZTX1BPU0lYCisJCQlyYyA9IENJRlNTTUJTZXRQb3NpeEFDTCh4aWQsIHBUY29uLGZ1bGxfcGF0aCxlYV92YWx1ZSwKKwkJCQkoY29uc3QgaW50KXZhbHVlX3NpemUsIEFDTF9UWVBFX0RFRkFVTFQsCisJCQkJY2lmc19zYi0+bG9jYWxfbmxzKTsKKwkJCWNGWUkoMSwoInNldCBQT1NJWCBkZWZhdWx0IEFDTCByYyAlZCIscmMpKTsKKyNlbHNlCisJCQljRllJKDEsKCJzZXQgZGVmYXVsdCBQT1NJWCBBQ0wgbm90IHN1cHBvcnRlZCIpKTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJY0ZZSSgxLCgiaWxsZWdhbCB4YXR0ciByZXF1ZXN0ICVzIChvbmx5IHVzZXIgbmFtZXNwYWNlIHN1cHBvcnRlZCkiLGVhX25hbWUpKTsKKwkJICAvKiBCQiB3aGF0IGlmIG5vIG5hbWVzcGFjZSBwcmVmaXg/ICovCisJCSAgLyogU2hvdWxkIHdlIGp1c3QgcGFzcyB0aGVtIHRvIHNlcnZlciwgZXhjZXB0IGZvciAKKwkJICBzeXN0ZW0gYW5kIHBlcmhhcHMgc2VjdXJpdHkgcHJlZml4ZXM/ICovCisJCX0KKwl9CisKK3NldF9lYV9leGl0OgorCWlmIChmdWxsX3BhdGgpCisJCWtmcmVlKGZ1bGxfcGF0aCk7CisJRnJlZVhpZCh4aWQpOworI2VuZGlmCisJcmV0dXJuIHJjOworfQorCitzc2l6ZV90IGNpZnNfZ2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqIGRpcmVudHJ5LCBjb25zdCBjaGFyICogZWFfbmFtZSwKKyAgICAgICAgIHZvaWQgKiBlYV92YWx1ZSwgc2l6ZV90IGJ1Zl9zaXplKQoreworCXNzaXplX3QgcmMgPSAtRU9QTk9UU1VQUDsKKyNpZmRlZiBDT05GSUdfQ0lGU19YQVRUUgorCWludCB4aWQ7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwljaGFyICogZnVsbF9wYXRoOworCisJaWYoZGlyZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisJaWYoZGlyZW50cnktPmRfaW5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisJc2IgPSBkaXJlbnRyeS0+ZF9pbm9kZS0+aV9zYjsKKwlpZihzYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKworCXhpZCA9IEdldFhpZCgpOworCisJY2lmc19zYiA9IENJRlNfU0Ioc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCWRvd24oJnNiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlmdWxsX3BhdGggPSBidWlsZF9wYXRoX2Zyb21fZGVudHJ5KGRpcmVudHJ5KTsKKwl1cCgmc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCWlmKGZ1bGxfcGF0aCA9PSBOVUxMKSB7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIHJldHVybiBkb3MgYXR0cmlidXRlcyBhcyBwc2V1ZG8geGF0dHIgKi8KKwkvKiByZXR1cm4gYWx0IG5hbWUgaWYgYXZhaWxhYmxlIGFzIHBzZXVkbyBhdHRyICovCisJaWYoZWFfbmFtZSA9PSBOVUxMKSB7CisJCWNGWUkoMSwoIk51bGwgeGF0dHIgbmFtZXMgbm90IHN1cHBvcnRlZCIpKTsKKwl9IGVsc2UgaWYoc3RybmNtcChlYV9uYW1lLENJRlNfWEFUVFJfVVNFUl9QUkVGSVgsNSkgPT0gMCkgeworCQlpZihjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTk9fWEFUVFIpCisJCQlnb3RvIGdldF9lYV9leGl0OworCisJCWlmKHN0cm5jbXAoZWFfbmFtZSxDSUZTX1hBVFRSX0RPU19BVFRSSUIsMTQpID09IDApIHsKKwkJCWNGWUkoMSwoImF0dGVtcHQgdG8gcXVlcnkgY2lmcyBpbm9kZSBtZXRhZGF0YSIpKTsKKwkJCS8qIHJldmFsaWRhdGUvZ2V0YXR0ciB0aGVuIHBvcHVsYXRlIGZyb20gaW5vZGUgKi8KKwkJfSAvKiBCQiBhZGQgZWxzZSB3aGVuIGFib3ZlIGlzIGltcGxlbWVudGVkICovCisJCWVhX25hbWUgKz0gNTsgLyogc2tpcCBwYXN0IHVzZXIuIHByZWZpeCAqLworCQlyYyA9IENJRlNTTUJRdWVyeUVBKHhpZCxwVGNvbixmdWxsX3BhdGgsZWFfbmFtZSxlYV92YWx1ZSwKKwkJCWJ1Zl9zaXplLCBjaWZzX3NiLT5sb2NhbF9ubHMpOworCX0gZWxzZSBpZihzdHJuY21wKGVhX25hbWUsIENJRlNfWEFUVFJfT1MyX1BSRUZJWCw0KSA9PSAwKSB7CisJCWlmKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9OT19YQVRUUikKKwkJCWdvdG8gZ2V0X2VhX2V4aXQ7CisKKwkJZWFfbmFtZSArPSA0OyAvKiBza2lwIHBhc3Qgb3MyLiBwcmVmaXggKi8KKwkJcmMgPSBDSUZTU01CUXVlcnlFQSh4aWQscFRjb24sZnVsbF9wYXRoLGVhX25hbWUsZWFfdmFsdWUsCisJCQlidWZfc2l6ZSwgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwl9IGVsc2UgaWYoc3RybmNtcChlYV9uYW1lLFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1Msc3RybGVuKFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpKSA9PSAwKSB7CisjaWZkZWYgQ09ORklHX0NJRlNfUE9TSVgKKwkJcmMgPSBDSUZTU01CR2V0UG9zaXhBQ0woeGlkLCBwVGNvbiwgZnVsbF9wYXRoLAorCQkJCWVhX3ZhbHVlLCBidWZfc2l6ZSwgQUNMX1RZUEVfQUNDRVNTLCAKKwkJCQljaWZzX3NiLT5sb2NhbF9ubHMpOworI2Vsc2UgCisJCWNGWUkoMSwoInF1ZXJ5IFBPU0lYIEFDTCBub3Qgc3VwcG9ydGVkIHlldCIpKTsKKyNlbmRpZiAvKiBDT05GSUdfQ0lGU19QT1NJWCAqLworCX0gZWxzZSBpZihzdHJuY21wKGVhX25hbWUsUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQsc3RybGVuKFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUKSkgPT0gMCkgeworI2lmZGVmIENPTkZJR19DSUZTX1BPU0lYCisJCXJjID0gQ0lGU1NNQkdldFBvc2l4QUNMKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwKKwkJCQllYV92YWx1ZSwgYnVmX3NpemUsIEFDTF9UWVBFX0RFRkFVTFQsIAorCQkJCWNpZnNfc2ItPmxvY2FsX25scyk7CisjZWxzZSAKKwkJY0ZZSSgxLCgicXVlcnkgUE9TSVggZGVmYXVsdCBBQ0wgbm90IHN1cHBvcnRlZCB5ZXQiKSk7CisjZW5kaWYKKwl9IGVsc2UgaWYoc3RybmNtcChlYV9uYW1lLAorCQkgIENJRlNfWEFUVFJfVFJVU1RFRF9QUkVGSVgsWEFUVFJfVFJVU1RFRF9QUkVGSVhfTEVOKSA9PSAwKSB7CisJCWNGWUkoMSwoIlRydXN0ZWQgeGF0dHIgbmFtZXNwYWNlIG5vdCBzdXBwb3J0ZWQgeWV0IikpOworCX0gZWxzZSBpZihzdHJuY21wKGVhX25hbWUsCisJCSAgQ0lGU19YQVRUUl9TRUNVUklUWV9QUkVGSVgsWEFUVFJfU0VDVVJJVFlfUFJFRklYX0xFTikgPT0gMCkgeworCQljRllJKDEsKCJTZWN1cml0eSB4YXR0ciBuYW1lc3BhY2Ugbm90IHN1cHBvcnRlZCB5ZXQiKSk7CisJfSBlbHNlIHsKKwkJY0ZZSSgxLCgiaWxsZWdhbCB4YXR0ciBuYW1lIHJlcXVlc3QgJXMgKG9ubHkgdXNlciBuYW1lc3BhY2Ugc3VwcG9ydGVkKSIsZWFfbmFtZSkpOworCX0KKworCS8qIFdlIGNvdWxkIGFkZCBhbiBhZGRpdGlvbmFsIGNoZWNrIGZvciBzdHJlYW1zIGllIAorCSAgICBpZiBwcm9jL2ZzL2NpZnMvc3RyZWFtc3RveGF0dHIgaXMgc2V0IHRoZW4KKwkJc2VhcmNoIHNlcnZlciBmb3IgRUFzIG9yIHN0cmVhbXMgdG8gCisJCXJldHVybnMgYXMgeGF0dHJzICovCisKKwlpZihyYyA9PSAtRUlOVkFMKQorCQlyYyA9IC1FT1BOT1RTVVBQOyAKKworZ2V0X2VhX2V4aXQ6CisJaWYgKGZ1bGxfcGF0aCkKKwkJa2ZyZWUoZnVsbF9wYXRoKTsKKwlGcmVlWGlkKHhpZCk7CisjZW5kaWYKKwlyZXR1cm4gcmM7Cit9CisKK3NzaXplX3QgY2lmc19saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqIGRpcmVudHJ5LCBjaGFyICogZGF0YSwgc2l6ZV90IGJ1Zl9zaXplKQoreworCXNzaXplX3QgcmMgPSAtRU9QTk9UU1VQUDsKKyNpZmRlZiBDT05GSUdfQ0lGU19YQVRUUgorCWludCB4aWQ7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwljaGFyICogZnVsbF9wYXRoOworCisJaWYoZGlyZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisJaWYoZGlyZW50cnktPmRfaW5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisJc2IgPSBkaXJlbnRyeS0+ZF9pbm9kZS0+aV9zYjsKKwlpZihzYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKwl4aWQgPSBHZXRYaWQoKTsKKworCWNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKKwlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisKKwlkb3duKCZzYi0+c192ZnNfcmVuYW1lX3NlbSk7CisJZnVsbF9wYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShkaXJlbnRyeSk7CisJdXAoJnNiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlpZihmdWxsX3BhdGggPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiByZXR1cm4gZG9zIGF0dHJpYnV0ZXMgYXMgcHNldWRvIHhhdHRyICovCisJLyogcmV0dXJuIGFsdCBuYW1lIGlmIGF2YWlsYWJsZSBhcyBwc2V1ZG8gYXR0ciAqLworCisJLyogaWYgcHJvYy9mcy9jaWZzL3N0cmVhbXN0b3hhdHRyIGlzIHNldCB0aGVuCisJCXNlYXJjaCBzZXJ2ZXIgZm9yIEVBcyBvciBzdHJlYW1zIHRvIAorCQlyZXR1cm5zIGFzIHhhdHRycyAqLworCXJjID0gQ0lGU1NNQlFBbGxFQXMoeGlkLHBUY29uLGZ1bGxfcGF0aCxkYXRhLGJ1Zl9zaXplLAorCQkJCWNpZnNfc2ItPmxvY2FsX25scyk7CisKKwlpZiAoZnVsbF9wYXRoKQorCQlrZnJlZShmdWxsX3BhdGgpOworCUZyZWVYaWQoeGlkKTsKKyNlbmRpZgorCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2ZzL2NvZGEvTWFrZWZpbGUgYi9mcy9jb2RhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMjJlNjEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jb2RhL01ha2VmaWxlCkBAIC0wLDAgKzEsMTIgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBDb2RhIGZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19DT0RBX0ZTKSArPSBjb2RhLm8KKworY29kYS1vYmpzIDo9IHBzZGV2Lm8gY2FjaGUubyBjbm9kZS5vIGlub2RlLm8gZGlyLm8gZmlsZS5vIHVwY2FsbC5vIFwKKwkgICAgIGNvZGFfbGludXgubyBzeW1saW5rLm8gcGlvY3RsLm8gc3lzY3RsLm8gCisKKyMgSWYgeW91IHdhbnQgZGVidWdnaW5nIG91dHB1dCwgcGxlYXNlIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUuCisKKyMgRVhUUkFfQ0ZMQUdTICs9IC1EREVCVUcgLURERUJVR19TTUJfTUFMTE9DPTEKZGlmZiAtLWdpdCBhL2ZzL2NvZGEvY2FjaGUuYyBiL2ZzL2NvZGEvY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDA3MmZkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY29kYS9jYWNoZS5jCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ2FjaGUgb3BlcmF0aW9ucyBmb3IgQ29kYS4KKyAqIEZvciBMaW51eCAyLjE6IChDKSAxOTk3IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgKiBGb3IgTGludXggMi4zOiAoQykgMjAwMCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQorICoKKyAqIENhcm5lZ2llIE1lbGxvbiBlbmNvdXJhZ2VzIHVzZXJzIG9mIHRoaXMgY29kZSB0byBjb250cmlidXRlIGltcHJvdmVtZW50cworICogdG8gdGhlIENvZGEgcHJvamVjdCBodHRwOi8vd3d3LmNvZGEuY3MuY211LmVkdS8gPGNvZGFAY3MuY211LmVkdT4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb2RhLmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9saW51eC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfcHNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2ZzX2kuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2NhY2hlLmg+CisKK3N0YXRpYyBhdG9taWNfdCBwZXJtaXNzaW9uX2Vwb2NoID0gQVRPTUlDX0lOSVQoMCk7CisKKy8qIHJlcGxhY2Ugb3IgZXh0ZW5kIGFuIGFjbCBjYWNoZSBoaXQgKi8KK3ZvaWQgY29kYV9jYWNoZV9lbnRlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKK3sKKwlzdHJ1Y3QgY29kYV9pbm9kZV9pbmZvICpjaWkgPSBJVE9DKGlub2RlKTsKKworCWNpaS0+Y19jYWNoZWRfZXBvY2ggPSBhdG9taWNfcmVhZCgmcGVybWlzc2lvbl9lcG9jaCk7CisJaWYgKGNpaS0+Y191aWQgIT0gY3VycmVudC0+ZnN1aWQpIHsKKyAgICAgICAgICAgICAgICBjaWktPmNfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisgICAgICAgICAgICAgICAgY2lpLT5jX2NhY2hlZF9wZXJtID0gbWFzazsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgY2lpLT5jX2NhY2hlZF9wZXJtIHw9IG1hc2s7Cit9CisKKy8qIHJlbW92ZSBjYWNoZWQgYWNsIGZyb20gYW4gaW5vZGUgKi8KK3ZvaWQgY29kYV9jYWNoZV9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBjb2RhX2lub2RlX2luZm8gKmNpaSA9IElUT0MoaW5vZGUpOworICAgICAgICBjaWktPmNfY2FjaGVkX3Blcm0gPSAwOworfQorCisvKiByZW1vdmUgYWxsIGFjbCBjYWNoZXMgKi8KK3ZvaWQgY29kYV9jYWNoZV9jbGVhcl9hbGwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKyAgICAgICAgc3RydWN0IGNvZGFfc2JfaW5mbyAqc2JpOworCisgICAgICAgIHNiaSA9IGNvZGFfc2JwKHNiKTsKKyAgICAgICAgaWYgKCFzYmkpIEJVRygpOworCisJYXRvbWljX2luYygmcGVybWlzc2lvbl9lcG9jaCk7Cit9CisKKworLyogY2hlY2sgaWYgdGhlIG1hc2sgaGFzIGJlZW4gbWF0Y2hlZCBhZ2FpbnN0IHRoZSBhY2wgYWxyZWFkeSAqLworaW50IGNvZGFfY2FjaGVfY2hlY2soc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spCit7CisJc3RydWN0IGNvZGFfaW5vZGVfaW5mbyAqY2lpID0gSVRPQyhpbm9kZSk7CisgICAgICAgIGludCBoaXQ7CisJCisgICAgICAgIGhpdCA9IChtYXNrICYgY2lpLT5jX2NhY2hlZF9wZXJtKSA9PSBtYXNrICYmCisJCWNpaS0+Y191aWQgPT0gY3VycmVudC0+ZnN1aWQgJiYKKwkJY2lpLT5jX2NhY2hlZF9lcG9jaCA9PSBhdG9taWNfcmVhZCgmcGVybWlzc2lvbl9lcG9jaCk7CisKKyAgICAgICAgcmV0dXJuIGhpdDsKK30KKworCisvKiBQdXJnaW5nIGRlbnRyaWVzIGFuZCBjaGlsZHJlbiAqLworLyogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBkcm9wIGRlbnRyaWVzIHdoaWNoIGFyZSBub3QKKyAgIGluIHVzZSBhbmQgZmxhZyBkZW50cmllcyB3aGljaCBhcmUgaW4gdXNlIHRvIGJlIAorICAgemFwcGVkIGxhdGVyLgorCisgICBUaGUgZmxhZ3MgYXJlIGRldGVjdGVkIGJ5OgorICAgLSBjb2RhX2RlbnRyeV9yZXZhbGlkYXRlIChmb3IgbG9va3VwcykgaWYgdGhlIGZsYWcgaXMgQ19QVVJHRQorICAgLSBjb2RhX2RlbnRyeV9kZWxldGU6IHRvIHJlbW92ZSBkZW50cnkgZnJvbSB0aGUgY2FjaGUgd2hlbiBkX2NvdW50CisgICAgIGZhbGxzIHRvIHplcm8KKyAgIC0gYW4gaW5vZGUgbWV0aG9kIGNvZGFfcmV2YWxpZGF0ZSAoZm9yIGF0dHJpYnV0ZXMpIGlmIHRoZSAKKyAgICAgZmxhZyBpcyBDX1ZBVFRSCisqLworCisvKiB0aGlzIHdvbid0IGRvIGFueSBoYXJtOiBqdXN0IGZsYWcgYWxsIGNoaWxkcmVuICovCitzdGF0aWMgdm9pZCBjb2RhX2ZsYWdfY2hpbGRyZW4oc3RydWN0IGRlbnRyeSAqcGFyZW50LCBpbnQgZmxhZykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjaGlsZDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZTsKKworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCWxpc3RfZm9yX2VhY2goY2hpbGQsICZwYXJlbnQtPmRfc3ViZGlycykKKwl7CisJCWRlID0gbGlzdF9lbnRyeShjaGlsZCwgc3RydWN0IGRlbnRyeSwgZF9jaGlsZCk7CisJCS8qIGRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIG5lZ2F0aXZlIGRlbnRyaWVzICovCisJCWlmICggISBkZS0+ZF9pbm9kZSApIAorCQkJY29udGludWU7CisJCWNvZGFfZmxhZ19pbm9kZShkZS0+ZF9pbm9kZSwgZmxhZyk7CisJfQorCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJcmV0dXJuOyAKK30KKwordm9pZCBjb2RhX2ZsYWdfaW5vZGVfY2hpbGRyZW4oc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZsYWcpCit7CisJc3RydWN0IGRlbnRyeSAqYWxpYXNfZGU7CisKKwlpZiAoICFpbm9kZSB8fCAhU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgCisJCXJldHVybjsgCisKKwlhbGlhc19kZSA9IGRfZmluZF9hbGlhcyhpbm9kZSk7CisJaWYgKCFhbGlhc19kZSkKKwkJcmV0dXJuOworCWNvZGFfZmxhZ19jaGlsZHJlbihhbGlhc19kZSwgZmxhZyk7CisJc2hyaW5rX2RjYWNoZV9wYXJlbnQoYWxpYXNfZGUpOworCWRwdXQoYWxpYXNfZGUpOworfQorCmRpZmYgLS1naXQgYS9mcy9jb2RhL2Nub2RlLmMgYi9mcy9jb2RhL2Nub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNhZWVmNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NvZGEvY25vZGUuYwpAQCAtMCwwICsxLDE3MiBAQAorLyogY25vZGUgcmVsYXRlZCByb3V0aW5lcyBmb3IgdGhlIGNvZGEga2VybmVsIGNvZGUKKyAgIChDKSAxOTk2IFBldGVyIEJyYWFtCisgICAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb2RhLmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9saW51eC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfZnNfaS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfcHNkZXYuaD4KKworc3RhdGljIGlubGluZSBpbnQgY29kYV9maWRlcShzdHJ1Y3QgQ29kYUZpZCAqZmlkMSwgc3RydWN0IENvZGFGaWQgKmZpZDIpCit7CisJcmV0dXJuIG1lbWNtcChmaWQxLCBmaWQyLCBzaXplb2YoKmZpZDEpKSA9PSAwOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgY29kYV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBwYWdlX2ZvbGxvd19saW5rX2xpZ2h0LAorCS5wdXRfbGluawk9IHBhZ2VfcHV0X2xpbmssCisJLnNldGF0dHIJPSBjb2RhX3NldGF0dHIsCit9OworCisvKiBjbm9kZS5jICovCitzdGF0aWMgdm9pZCBjb2RhX2ZpbGxfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGNvZGFfdmF0dHIgKmF0dHIpCit7CisgICAgICAgIGNvZGFfdmF0dHJfdG9faWF0dHIoaW5vZGUsIGF0dHIpOworCisgICAgICAgIGlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisgICAgICAgICAgICAgICAgaW5vZGUtPmlfb3AgPSAmY29kYV9maWxlX2lub2RlX29wZXJhdGlvbnM7CisgICAgICAgICAgICAgICAgaW5vZGUtPmlfZm9wID0gJmNvZGFfZmlsZV9vcGVyYXRpb25zOworICAgICAgICB9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKyAgICAgICAgICAgICAgICBpbm9kZS0+aV9vcCA9ICZjb2RhX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworICAgICAgICAgICAgICAgIGlub2RlLT5pX2ZvcCA9ICZjb2RhX2Rpcl9vcGVyYXRpb25zOworICAgICAgICB9IGVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmY29kYV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmY29kYV9zeW1saW5rX2FvcHM7CisJCWlub2RlLT5pX21hcHBpbmcgPSAmaW5vZGUtPmlfZGF0YTsKKwl9IGVsc2UKKyAgICAgICAgICAgICAgICBpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsIGh1Z2VfZGVjb2RlX2RldihhdHRyLT52YV9yZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgY29kYV90ZXN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IENvZGFGaWQgKmZpZCA9IChzdHJ1Y3QgQ29kYUZpZCAqKWRhdGE7CisJcmV0dXJuIGNvZGFfZmlkZXEoJihJVE9DKGlub2RlKS0+Y19maWQpLCBmaWQpOworfQorCitzdGF0aWMgaW50IGNvZGFfc2V0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IENvZGFGaWQgKmZpZCA9IChzdHJ1Y3QgQ29kYUZpZCAqKWRhdGE7CisJSVRPQyhpbm9kZSktPmNfZmlkID0gKmZpZDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb2RhX2ZhaWxfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gLTE7Cit9CisKK3N0cnVjdCBpbm9kZSAqIGNvZGFfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgc3RydWN0IENvZGFGaWQgKiBmaWQsCisJCQkgc3RydWN0IGNvZGFfdmF0dHIgKiBhdHRyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGNvZGFfaW5vZGVfaW5mbyAqY2lpOworCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGNvZGFfZjJpKGZpZCk7CisKKwlpbm9kZSA9IGlnZXQ1X2xvY2tlZChzYiwgaGFzaCwgY29kYV90ZXN0X2lub2RlLCBjb2RhX3NldF9pbm9kZSwgZmlkKTsKKworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJY2lpID0gSVRPQyhpbm9kZSk7CisJCS8qIHdlIHN0aWxsIG5lZWQgdG8gc2V0IGlfaW5vIGZvciB0aGluZ3MgbGlrZSBzdGF0KDIpICovCisJCWlub2RlLT5pX2lubyA9IGhhc2g7CisJCWNpaS0+Y19tYXBjb3VudCA9IDA7CisJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCX0KKworCS8qIGFsd2F5cyByZXBsYWNlIHRoZSBhdHRyaWJ1dGVzLCB0eXBlIG1pZ2h0IGhhdmUgY2hhbmdlZCAqLworCWNvZGFfZmlsbF9pbm9kZShpbm9kZSwgYXR0cik7CisJcmV0dXJuIGlub2RlOworfQorCisvKiB0aGlzIGlzIGVmZmVjdGl2ZWx5IGNvZGFfaWdldDoKKyAgIC0gZ2V0IGF0dHJpYnV0ZXMgKG1pZ2h0IGJlIGNhY2hlZCkKKyAgIC0gZ2V0IHRoZSBpbm9kZSBmb3IgdGhlIGZpZCB1c2luZyB2ZnMgaWdldAorICAgLSBsaW5rIHRoZSB0d28gdXAgaWYgdGhpcyBpcyBuZWVkZWQKKyAgIC0gZmlsbCBpbiB0aGUgYXR0cmlidXRlcworKi8KK2ludCBjb2RhX2Nub2RlX21ha2Uoc3RydWN0IGlub2RlICoqaW5vZGUsIHN0cnVjdCBDb2RhRmlkICpmaWQsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisgICAgICAgIHN0cnVjdCBjb2RhX3ZhdHRyIGF0dHI7CisgICAgICAgIGludCBlcnJvcjsKKyAgICAgICAgCisJLyogV2UgZ2V0IGlub2RlIG51bWJlcnMgZnJvbSBWZW51cyAtLSBzZWUgdmVudXMgc291cmNlICovCisJZXJyb3IgPSB2ZW51c19nZXRhdHRyKHNiLCBmaWQsICZhdHRyKTsKKwlpZiAoIGVycm9yICkgeworCSAgICAqaW5vZGUgPSBOVUxMOworCSAgICByZXR1cm4gZXJyb3I7CisJfSAKKworCSppbm9kZSA9IGNvZGFfaWdldChzYiwgZmlkLCAmYXR0cik7CisJaWYgKCBJU19FUlIoKmlub2RlKSApIHsKKwkJcHJpbnRrKCJjb2RhX2Nub2RlX21ha2U6IGNvZGFfaWdldCBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBQVFJfRVJSKCppbm9kZSk7CisgICAgICAgIH0KKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGNvZGFfcmVwbGFjZV9maWQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IENvZGFGaWQgKm9sZGZpZCwgCisJCSAgICAgIHN0cnVjdCBDb2RhRmlkICpuZXdmaWQpCit7CisJc3RydWN0IGNvZGFfaW5vZGVfaW5mbyAqY2lpOworCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGNvZGFfZjJpKG5ld2ZpZCk7CisJCisJY2lpID0gSVRPQyhpbm9kZSk7CisKKwlpZiAoIWNvZGFfZmlkZXEoJmNpaS0+Y19maWQsIG9sZGZpZCkpCisJCUJVRygpOworCisJLyogcmVwbGFjZSBmaWQgYW5kIHJlaGFzaCBpbm9kZSAqLworCS8qIFhYWCB3ZSBwcm9iYWJseSBuZWVkIHRvIGhvbGQgc29tZSBsb2NrIGhlcmUhICovCisJcmVtb3ZlX2lub2RlX2hhc2goaW5vZGUpOworCWNpaS0+Y19maWQgPSAqbmV3ZmlkOworCWlub2RlLT5pX2lubyA9IGhhc2g7CisJX19pbnNlcnRfaW5vZGVfaGFzaChpbm9kZSwgaGFzaCk7Cit9CisKKy8qIGNvbnZlcnQgYSBmaWQgdG8gYW4gaW5vZGUuICovCitzdHJ1Y3QgaW5vZGUgKmNvZGFfZmlkX3RvX2lub2RlKHN0cnVjdCBDb2RhRmlkICpmaWQsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpIAoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJdW5zaWduZWQgbG9uZyBoYXNoID0gY29kYV9mMmkoZmlkKTsKKworCWlmICggIXNiICkgeworCQlwcmludGsoImNvZGFfZmlkX3RvX2lub2RlOiBubyBzYiFcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpbm9kZSA9IGlnZXQ1X2xvY2tlZChzYiwgaGFzaCwgY29kYV90ZXN0X2lub2RlLCBjb2RhX2ZhaWxfaW5vZGUsIGZpZCk7CisJaWYgKCAhaW5vZGUgKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIHdlIHNob3VsZCBuZXZlciBzZWUgbmV3bHkgY3JlYXRlZCBpbm9kZXMgYmVjYXVzZSB3ZSBpbnRlbnRpb25hbGx5CisJICogZmFpbCBpbiB0aGUgaW5pdGlhbGl6YXRpb24gY2FsbGJhY2sgKi8KKwlCVUdfT04oaW5vZGUtPmlfc3RhdGUgJiBJX05FVyk7CisKKwlyZXR1cm4gaW5vZGU7Cit9CisKKy8qIHRoZSBDT05UUk9MIGlub2RlIGlzIG1hZGUgd2l0aG91dCBhc2tpbmcgYXR0cmlidXRlcyBmcm9tIFZlbnVzICovCitpbnQgY29kYV9jbm9kZV9tYWtlY3RsKHN0cnVjdCBpbm9kZSAqKmlub2RlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWludCBlcnJvciA9IC1FTk9NRU07CisKKwkqaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCWlmICgqaW5vZGUpIHsKKwkJKCppbm9kZSktPmlfaW5vID0gQ1RMX0lOTzsKKwkJKCppbm9kZSktPmlfb3AgPSAmY29kYV9pb2N0bF9pbm9kZV9vcGVyYXRpb25zOworCQkoKmlub2RlKS0+aV9mb3AgPSAmY29kYV9pb2N0bF9vcGVyYXRpb25zOworCQkoKmlub2RlKS0+aV9tb2RlID0gMDQ0NDsKKwkJZXJyb3IgPSAwOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvY29kYS9jb2RhX2xpbnV4LmMgYi9mcy9jb2RhL2NvZGFfbGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTk3MDgwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY29kYS9jb2RhX2xpbnV4LmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBJbm9kZSBvcGVyYXRpb25zIGZvciBDb2RhIGZpbGVzeXN0ZW0KKyAqIE9yaWdpbmFsIHZlcnNpb246IChDKSAxOTk2IFAuIEJyYWFtIGFuZCBNLiBDYWxsYWhhbgorICogUmV3cml0dGVuIGZvciBMaW51eCAyLjEuIChDKSAxOTk3IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgKiAKKyAqIENhcm5lZ2llIE1lbGxvbiBlbmNvdXJhZ2VzIHVzZXJzIHRvIGNvbnRyaWJ1dGUgaW1wcm92ZW1lbnRzIHRvCisgKiB0aGUgQ29kYSBwcm9qZWN0LiBDb250YWN0IFBldGVyIEJyYWFtIChjb2RhQGNzLmNtdS5lZHUpLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb2RhLmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9saW51eC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfcHNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2ZzX2kuaD4KKworLyogaW5pdGlhbGl6ZSB0aGUgZGVidWdnaW5nIHZhcmlhYmxlcyAqLworaW50IGNvZGFfZmFrZV9zdGF0ZnM7CisKKy8qIHByaW50IGEgZmlkICovCitjaGFyICogY29kYV9mMnMoc3RydWN0IENvZGFGaWQgKmYpCit7CisJc3RhdGljIGNoYXIgc1s2MF07CisjaWZkZWYgQ09ORklHX0NPREFfRlNfT0xEX0FQSQorIAlzcHJpbnRmKHMsICIoJTA4eC4lMDh4LiUwOHgpIiwgZi0+b3BhcXVlWzBdLCBmLT5vcGFxdWVbMV0sIGYtPm9wYXF1ZVsyXSk7CisjZWxzZQorIAlzcHJpbnRmKHMsICIoJTA4eC4lMDh4LiUwOHguJTA4eCkiLCBmLT5vcGFxdWVbMF0sIGYtPm9wYXF1ZVsxXSwgZi0+b3BhcXVlWzJdLCBmLT5vcGFxdWVbM10pOworI2VuZGlmCisJcmV0dXJuIHM7Cit9CisKKy8qIHJlY29nbml6ZSBzcGVjaWFsIC5DT05UUk9MIG5hbWUgKi8KK2ludCBjb2RhX2lzY29udHJvbChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuZ3RoKQoreworCXJldHVybiAoKENPREFfQ09OVFJPTExFTiA9PSBsZW5ndGgpICYmIAorICAgICAgICAgICAgICAgIChzdHJuY21wKG5hbWUsIENPREFfQ09OVFJPTCwgQ09EQV9DT05UUk9MTEVOKSA9PSAwKSk7Cit9CisKKy8qIHJlY29nbml6ZSAvY29kYSBpbm9kZSAqLworaW50IGNvZGFfaXNyb290KHN0cnVjdCBpbm9kZSAqaSkKK3sKKyAgICByZXR1cm4gKCBpLT5pX3NiLT5zX3Jvb3QtPmRfaW5vZGUgPT0gaSApOworfQorCit1bnNpZ25lZCBzaG9ydCBjb2RhX2ZsYWdzX3RvX2NmbGFncyh1bnNpZ25lZCBzaG9ydCBmbGFncykKK3sKKwl1bnNpZ25lZCBzaG9ydCBjb2RhX2ZsYWdzID0gMDsKKwkKKwlpZiAoKGZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSkKKwkJY29kYV9mbGFncyB8PSBDX09fUkVBRDsKKworCWlmICgoZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRXUikKKwkJY29kYV9mbGFncyB8PSBDX09fUkVBRCB8IENfT19XUklURTsKKworCWlmICgoZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fV1JPTkxZKQorCQljb2RhX2ZsYWdzIHw9IENfT19XUklURTsKKworCWlmIChmbGFncyAmIE9fVFJVTkMpCisJCWNvZGFfZmxhZ3MgfD0gQ19PX1RSVU5DOworCisJaWYgKGZsYWdzICYgT19DUkVBVCkKKwkJY29kYV9mbGFncyB8PSBDX09fQ1JFQVQ7CisKKwlpZiAoZmxhZ3MgJiBPX0VYQ0wpCisJCWNvZGFfZmxhZ3MgfD0gQ19PX0VYQ0w7CisKKwlyZXR1cm4gY29kYV9mbGFnczsKK30KKworCisvKiB1dGlsaXR5IGZ1bmN0aW9ucyBiZWxvdyAqLwordm9pZCBjb2RhX3ZhdHRyX3RvX2lhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBjb2RhX3ZhdHRyICphdHRyKQoreworICAgICAgICBpbnQgaW5vZGVfdHlwZTsKKyAgICAgICAgLyogaW5vZGUncyBpX2ZsYWdzLCBpX2lubyBhcmUgc2V0IGJ5IGlnZXQgCisgICAgICAgICAgIFhYWDogaXMgdGhpcyBhbGwgd2UgbmVlZCA/PworICAgICAgICAgICAqLworICAgICAgICBzd2l0Y2ggKGF0dHItPnZhX3R5cGUpIHsKKyAgICAgICAgY2FzZSBDX1ZOT046CisgICAgICAgICAgICAgICAgaW5vZGVfdHlwZSAgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENfVlJFRzoKKyAgICAgICAgICAgICAgICBpbm9kZV90eXBlID0gU19JRlJFRzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDX1ZESVI6CisgICAgICAgICAgICAgICAgaW5vZGVfdHlwZSA9IFNfSUZESVI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ19WTE5LOgorICAgICAgICAgICAgICAgIGlub2RlX3R5cGUgPSBTX0lGTE5LOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlub2RlX3R5cGUgPSAwOworICAgICAgICB9CisJaW5vZGUtPmlfbW9kZSB8PSBpbm9kZV90eXBlOworCisJaWYgKGF0dHItPnZhX21vZGUgIT0gKHVfc2hvcnQpIC0xKQorCSAgICAgICAgaW5vZGUtPmlfbW9kZSA9IGF0dHItPnZhX21vZGUgfCBpbm9kZV90eXBlOworICAgICAgICBpZiAoYXR0ci0+dmFfdWlkICE9IC0xKSAKKwkgICAgICAgIGlub2RlLT5pX3VpZCA9ICh1aWRfdCkgYXR0ci0+dmFfdWlkOworICAgICAgICBpZiAoYXR0ci0+dmFfZ2lkICE9IC0xKQorCSAgICAgICAgaW5vZGUtPmlfZ2lkID0gKGdpZF90KSBhdHRyLT52YV9naWQ7CisJaWYgKGF0dHItPnZhX25saW5rICE9IC0xKQorCSAgICAgICAgaW5vZGUtPmlfbmxpbmsgPSBhdHRyLT52YV9ubGluazsKKwlpZiAoYXR0ci0+dmFfc2l6ZSAhPSAtMSkKKwkgICAgICAgIGlub2RlLT5pX3NpemUgPSBhdHRyLT52YV9zaXplOworCWlmIChhdHRyLT52YV9ibG9ja3NpemUgIT0gLTEpCisJCWlub2RlLT5pX2Jsa3NpemUgPSBhdHRyLT52YV9ibG9ja3NpemU7CisJaWYgKGF0dHItPnZhX3NpemUgIT0gLTEpCisJCWlub2RlLT5pX2Jsb2NrcyA9IChhdHRyLT52YV9zaXplICsgNTExKSA+PiA5OworCWlmIChhdHRyLT52YV9hdGltZS50dl9zZWMgIT0gLTEpIAorCSAgICAgICAgaW5vZGUtPmlfYXRpbWUgPSBhdHRyLT52YV9hdGltZTsKKwlpZiAoYXR0ci0+dmFfbXRpbWUudHZfc2VjICE9IC0xKQorCSAgICAgICAgaW5vZGUtPmlfbXRpbWUgPSBhdHRyLT52YV9tdGltZTsKKyAgICAgICAgaWYgKGF0dHItPnZhX2N0aW1lLnR2X3NlYyAhPSAtMSkKKwkgICAgICAgIGlub2RlLT5pX2N0aW1lID0gYXR0ci0+dmFfY3RpbWU7Cit9CisKKworLyogCisgKiBCU0Qgc2V0cyBhdHRyaWJ1dGVzIHRoYXQgbmVlZCBub3QgYmUgbW9kaWZpZWQgdG8gLTEuIAorICogTGludXggdXNlcyB0aGUgdmFsaWQgZmllbGQgdG8gaW5kaWNhdGUgd2hhdCBzaG91bGQgYmUKKyAqIGxvb2tlZCBhdC4gIFRoZSBCU0QgdHlwZSBmaWVsZCBuZWVkcyB0byBiZSBkZWR1Y2VkIGZyb20gbGludXggCisgKiBtb2RlLgorICogU28gd2UgaGF2ZSB0byBkbyBzb21lIHRyYW5zbGF0aW9ucyBoZXJlLgorICovCisKK3ZvaWQgY29kYV9pYXR0cl90b192YXR0cihzdHJ1Y3QgaWF0dHIgKmlhdHRyLCBzdHJ1Y3QgY29kYV92YXR0ciAqdmF0dHIpCit7CisgICAgICAgIHVuc2lnbmVkIGludCB2YWxpZDsKKworICAgICAgICAvKiBjbGVhbiBvdXQgKi8gICAgICAgIAorICAgICAgICB2YXR0ci0+dmFfbW9kZSA9ICh1bW9kZV90KSAtMTsKKyAgICAgICAgdmF0dHItPnZhX3VpZCA9ICh2dWlkX3QpIC0xOyAKKyAgICAgICAgdmF0dHItPnZhX2dpZCA9ICh2Z2lkX3QpIC0xOworICAgICAgICB2YXR0ci0+dmFfc2l6ZSA9IChvZmZfdCkgLTE7CisJdmF0dHItPnZhX2F0aW1lLnR2X3NlYyA9ICh0aW1lX3QpIC0xOworCXZhdHRyLT52YV9hdGltZS50dl9uc2VjID0gICh0aW1lX3QpIC0xOworICAgICAgICB2YXR0ci0+dmFfbXRpbWUudHZfc2VjID0gKHRpbWVfdCkgLTE7CisgICAgICAgIHZhdHRyLT52YV9tdGltZS50dl9uc2VjID0gKHRpbWVfdCkgLTE7CisJdmF0dHItPnZhX2N0aW1lLnR2X3NlYyA9ICh0aW1lX3QpIC0xOworCXZhdHRyLT52YV9jdGltZS50dl9uc2VjID0gKHRpbWVfdCkgLTE7CisgICAgICAgIHZhdHRyLT52YV90eXBlID0gQ19WTk9OOworCXZhdHRyLT52YV9maWxlaWQgPSAtMTsKKwl2YXR0ci0+dmFfZ2VuID0gLTE7CisJdmF0dHItPnZhX2J5dGVzID0gLTE7CisJdmF0dHItPnZhX25saW5rID0gLTE7CisJdmF0dHItPnZhX2Jsb2Nrc2l6ZSA9IC0xOworCXZhdHRyLT52YV9yZGV2ID0gLTE7CisgICAgICAgIHZhdHRyLT52YV9mbGFncyA9IDA7CisKKyAgICAgICAgLyogZGV0ZXJtaW5lIHRoZSB0eXBlICovCisjaWYgMAorICAgICAgICBtb2RlID0gaWF0dHItPmlhX21vZGU7CisgICAgICAgICAgICAgICAgaWYgKCBTX0lTRElSKG1vZGUpICkgeworICAgICAgICAgICAgICAgIHZhdHRyLT52YV90eXBlID0gQ19WRElSOyAKKyAgICAgICAgfSBlbHNlIGlmICggU19JU1JFRyhtb2RlKSApIHsKKyAgICAgICAgICAgICAgICB2YXR0ci0+dmFfdHlwZSA9IENfVlJFRzsKKyAgICAgICAgfSBlbHNlIGlmICggU19JU0xOSyhtb2RlKSApIHsKKyAgICAgICAgICAgICAgICB2YXR0ci0+dmFfdHlwZSA9IENfVkxOSzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBkb24ndCBkbyBvdGhlcnMgKi8KKyAgICAgICAgICAgICAgICB2YXR0ci0+dmFfdHlwZSA9IENfVk5PTjsKKyAgICAgICAgfQorI2VuZGlmIAorCisgICAgICAgIC8qIHNldCB0aG9zZSB2YXR0cnMgdGhhdCBuZWVkIGNoYW5nZSAqLworICAgICAgICB2YWxpZCA9IGlhdHRyLT5pYV92YWxpZDsKKyAgICAgICAgaWYgKCB2YWxpZCAmIEFUVFJfTU9ERSApIHsKKyAgICAgICAgICAgICAgICB2YXR0ci0+dmFfbW9kZSA9IGlhdHRyLT5pYV9tb2RlOworCX0KKyAgICAgICAgaWYgKCB2YWxpZCAmIEFUVFJfVUlEICkgeworICAgICAgICAgICAgICAgIHZhdHRyLT52YV91aWQgPSAodnVpZF90KSBpYXR0ci0+aWFfdWlkOworCX0KKyAgICAgICAgaWYgKCB2YWxpZCAmIEFUVFJfR0lEICkgeworICAgICAgICAgICAgICAgIHZhdHRyLT52YV9naWQgPSAodmdpZF90KSBpYXR0ci0+aWFfZ2lkOworCX0KKyAgICAgICAgaWYgKCB2YWxpZCAmIEFUVFJfU0laRSApIHsKKyAgICAgICAgICAgICAgICB2YXR0ci0+dmFfc2l6ZSA9IGlhdHRyLT5pYV9zaXplOworCX0KKyAgICAgICAgaWYgKCB2YWxpZCAmIEFUVFJfQVRJTUUgKSB7CisgICAgICAgICAgICAgICAgdmF0dHItPnZhX2F0aW1lID0gaWF0dHItPmlhX2F0aW1lOworCX0KKyAgICAgICAgaWYgKCB2YWxpZCAmIEFUVFJfTVRJTUUgKSB7CisgICAgICAgICAgICAgICAgdmF0dHItPnZhX210aW1lID0gaWF0dHItPmlhX210aW1lOworCX0KKyAgICAgICAgaWYgKCB2YWxpZCAmIEFUVFJfQ1RJTUUgKSB7CisgICAgICAgICAgICAgICAgdmF0dHItPnZhX2N0aW1lID0gaWF0dHItPmlhX2N0aW1lOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZnMvY29kYS9kaXIuYyBiL2ZzL2NvZGEvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5MTc2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NvZGEvZGlyLmMKQEAgLTAsMCArMSw3MDQgQEAKKworLyoKKyAqIERpcmVjdG9yeSBvcGVyYXRpb25zIGZvciBDb2RhIGZpbGVzeXN0ZW0KKyAqIE9yaWdpbmFsIHZlcnNpb246IChDKSAxOTk2IFAuIEJyYWFtIGFuZCBNLiBDYWxsYWhhbgorICogUmV3cml0dGVuIGZvciBMaW51eCAyLjEuIChDKSAxOTk3IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgKiAKKyAqIENhcm5lZ2llIE1lbGxvbiBlbmNvdXJhZ2VzIHVzZXJzIHRvIGNvbnRyaWJ1dGUgaW1wcm92ZW1lbnRzIHRvCisgKiB0aGUgQ29kYSBwcm9qZWN0LiBDb250YWN0IFBldGVyIEJyYWFtIChjb2RhQGNzLmNtdS5lZHUpLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L2NvZGEuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2xpbnV4Lmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9wc2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfZnNfaS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX3Byb2MuaD4KKworLyogZGlyIGlub2RlLW9wcyAqLworc3RhdGljIGludCBjb2RhX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqbmV3LCBpbnQgbW9kZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpOworc3RhdGljIHN0cnVjdCBkZW50cnkgKmNvZGFfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICp0YXJnZXQsIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKK3N0YXRpYyBpbnQgY29kYV9saW5rKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqZGlyX2lub2RlLCAKKwkJICAgICBzdHJ1Y3QgZGVudHJ5ICplbnRyeSk7CitzdGF0aWMgaW50IGNvZGFfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyX2lub2RlLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSk7CitzdGF0aWMgaW50IGNvZGFfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpcl9pbm9kZSwgc3RydWN0IGRlbnRyeSAqZW50cnksCisJCQljb25zdCBjaGFyICpzeW1uYW1lKTsKK3N0YXRpYyBpbnQgY29kYV9ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpcl9pbm9kZSwgc3RydWN0IGRlbnRyeSAqZW50cnksIGludCBtb2RlKTsKK3N0YXRpYyBpbnQgY29kYV9ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpcl9pbm9kZSwgc3RydWN0IGRlbnRyeSAqZW50cnkpOworc3RhdGljIGludCBjb2RhX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9pbm9kZSwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwgCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbm9kZSAqbmV3X2lub2RlLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KTsKKworLyogZGlyIGZpbGUtb3BzICovCitzdGF0aWMgaW50IGNvZGFfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcik7CisKKy8qIGRlbnRyeSBvcHMgKi8KK3N0YXRpYyBpbnQgY29kYV9kZW50cnlfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpOworc3RhdGljIGludCBjb2RhX2RlbnRyeV9kZWxldGUoc3RydWN0IGRlbnRyeSAqKTsKKworLyogc3VwcG9ydCByb3V0aW5lcyAqLworc3RhdGljIGludCBjb2RhX3ZlbnVzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIGZpbGxkaXJfdCBmaWxsZGlyLAorCQkJICAgICAgdm9pZCAqZGlyZW50LCBzdHJ1Y3QgZGVudHJ5ICpkaXIpOworaW50IGNvZGFfZnN5bmMoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpOworCisvKiBzYW1lIGFzIGZzL2JhZF9pbm9kZS5jICovCitzdGF0aWMgaW50IGNvZGFfcmV0dXJuX0VJTyh2b2lkKQoreworCXJldHVybiAtRUlPOworfQorI2RlZmluZSBDT0RBX0VJT19FUlJPUiAoKHZvaWQgKikgKGNvZGFfcmV0dXJuX0VJTykpCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgY29kYV9kZW50cnlfb3BlcmF0aW9ucyA9Cit7CisJLmRfcmV2YWxpZGF0ZQk9IGNvZGFfZGVudHJ5X3JldmFsaWRhdGUsCisJLmRfZGVsZXRlCT0gY29kYV9kZW50cnlfZGVsZXRlLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgY29kYV9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9Cit7CisJLmNyZWF0ZQkJPSBjb2RhX2NyZWF0ZSwKKwkubG9va3VwCQk9IGNvZGFfbG9va3VwLAorCS5saW5rCQk9IGNvZGFfbGluaywKKwkudW5saW5rCQk9IGNvZGFfdW5saW5rLAorCS5zeW1saW5rCT0gY29kYV9zeW1saW5rLAorCS5ta2RpcgkJPSBjb2RhX21rZGlyLAorCS5ybWRpcgkJPSBjb2RhX3JtZGlyLAorCS5ta25vZAkJPSBDT0RBX0VJT19FUlJPUiwKKwkucmVuYW1lCQk9IGNvZGFfcmVuYW1lLAorCS5wZXJtaXNzaW9uCT0gY29kYV9wZXJtaXNzaW9uLAorCS5nZXRhdHRyCT0gY29kYV9nZXRhdHRyLAorCS5zZXRhdHRyCT0gY29kYV9zZXRhdHRyLAorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjb2RhX2Rpcl9vcGVyYXRpb25zID0geworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gY29kYV9yZWFkZGlyLAorCS5vcGVuCQk9IGNvZGFfb3BlbiwKKwkuZmx1c2gJCT0gY29kYV9mbHVzaCwKKwkucmVsZWFzZQk9IGNvZGFfcmVsZWFzZSwKKwkuZnN5bmMJCT0gY29kYV9mc3luYywKK307CisKKworLyogaW5vZGUgb3BlcmF0aW9ucyBmb3IgZGlyZWN0b3JpZXMgKi8KKy8qIGFjY2VzcyByb3V0aW5lczogbG9va3VwLCByZWFkbGluaywgcGVybWlzc2lvbiAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKmNvZGFfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICpyZXNfaW5vZGUgPSBOVUxMOworCXN0cnVjdCBDb2RhRmlkIHJlc2ZpZCA9IHsgeyAwLCB9IH07CisJaW50IGRyb3BtZSA9IDA7IC8qIHRvIGluZGljYXRlIGVudHJ5IHNob3VsZCBub3QgYmUgY2FjaGVkICovCisJaW50IHR5cGUgPSAwOworCWludCBlcnJvciA9IDA7CisJY29uc3QgY2hhciAqbmFtZSA9IGVudHJ5LT5kX25hbWUubmFtZTsKKwlzaXplX3QgbGVuZ3RoID0gZW50cnktPmRfbmFtZS5sZW47CisJCisJaWYgKCBsZW5ndGggPiBDT0RBX01BWE5BTUxFTiApIHsKKwkgICAgICAgIHByaW50aygibmFtZSB0b28gbG9uZzogbG9va3VwLCAlcyAoJSpzKVxuIiwgCisJCSAgICAgICBjb2RhX2kycyhkaXIpLCAoaW50KWxlbmd0aCwgbmFtZSk7CisJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCX0KKworCWxvY2tfa2VybmVsKCk7CisgICAgICAgIC8qIGNvbnRyb2wgb2JqZWN0LCBjcmVhdGUgaW5vZGUgb24gdGhlIGZseSAqLworICAgICAgICBpZiAoY29kYV9pc3Jvb3QoZGlyKSAmJiBjb2RhX2lzY29udHJvbChuYW1lLCBsZW5ndGgpKSB7CisJICAgICAgICBlcnJvciA9IGNvZGFfY25vZGVfbWFrZWN0bCgmcmVzX2lub2RlLCBkaXItPmlfc2IpOworCQlkcm9wbWUgPSAxOworICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisJZXJyb3IgPSB2ZW51c19sb29rdXAoZGlyLT5pX3NiLCBjb2RhX2kyZihkaXIpLCAKKwkJCSAgICAgKGNvbnN0IGNoYXIgKiluYW1lLCBsZW5ndGgsICZ0eXBlLCAmcmVzZmlkKTsKKworCXJlc19pbm9kZSA9IE5VTEw7CisJaWYgKCFlcnJvcikgeworCQlpZiAodHlwZSAmIENPREFfTk9DQUNIRSkgeworCQkJdHlwZSAmPSAofkNPREFfTk9DQUNIRSk7CisJCQlkcm9wbWUgPSAxOworCQl9CisKKwkgICAgCWVycm9yID0gY29kYV9jbm9kZV9tYWtlKCZyZXNfaW5vZGUsICZyZXNmaWQsIGRpci0+aV9zYik7CisJCWlmIChlcnJvcikgeworCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworCQl9CisJfSBlbHNlIGlmIChlcnJvciAhPSAtRU5PRU5UKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworCX0KKworZXhpdDoKKwllbnRyeS0+ZF90aW1lID0gMDsKKwllbnRyeS0+ZF9vcCA9ICZjb2RhX2RlbnRyeV9vcGVyYXRpb25zOworCWRfYWRkKGVudHJ5LCByZXNfaW5vZGUpOworCWlmICggZHJvcG1lICkgeworCQlkX2Ryb3AoZW50cnkpOworCQljb2RhX2ZsYWdfaW5vZGUocmVzX2lub2RlLCBDX1ZBVFRSKTsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKK30KKworCitpbnQgY29kYV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKyAgICAgICAgaW50IGVycm9yID0gMDsKKyAKKwlpZiAoIW1hc2spCisJCXJldHVybiAwOyAKKworCWxvY2tfa2VybmVsKCk7CisKKwljb2RhX3Zmc19zdGF0LnBlcm1pc3Npb24rKzsKKworCWlmIChjb2RhX2NhY2hlX2NoZWNrKGlub2RlLCBtYXNrKSkKKwkJZ290byBvdXQ7IAorCisgICAgICAgIGVycm9yID0gdmVudXNfYWNjZXNzKGlub2RlLT5pX3NiLCBjb2RhX2kyZihpbm9kZSksIG1hc2spOworICAgIAorCWlmICghZXJyb3IpCisJCWNvZGFfY2FjaGVfZW50ZXIoaW5vZGUsIG1hc2spOworCisgb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKworICAgICAgICByZXR1cm4gZXJyb3I7IAorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb2RhX2Rpcl9jaGFuZ2VkKHN0cnVjdCBpbm9kZSAqZGlyLCBpbnQgbGluaykKK3sKKyNpZmRlZiBSRVFVRVJZX1ZFTlVTX0ZPUl9NVElNRQorCS8qIGludmFsaWRhdGUgdGhlIGRpcmVjdG9yeSBjbm9kZSdzIGF0dHJpYnV0ZXMgc28gd2UgcmVmZXRjaCB0aGUKKwkgKiBhdHRyaWJ1dGVzIGZyb20gdmVudXMgbmV4dCB0aW1lIHRoZSBpbm9kZSBpcyByZWZlcmVuY2VkICovCisJY29kYV9mbGFnX2lub2RlKGRpciwgQ19WQVRUUik7CisjZWxzZQorCS8qIG9wdGltaXN0aWNhbGx5IHdlIGNhbiBhbHNvIGFjdCBhcyBpZiBvdXIgbm9zZSBibGVlZHMuIFRoZQorICAgICAgICAgKiBncmFudWxhcml0eSBvZiB0aGUgbXRpbWUgaXMgY29hcnNlIGFueXdheXMgc28gd2UgbWlnaHQgYWN0dWFsbHkgYmUKKyAgICAgICAgICogcmlnaHQgbW9zdCBvZiB0aGUgdGltZS4gTm90ZTogd2Ugb25seSBkbyB0aGlzIGZvciBkaXJlY3Rvcmllcy4gKi8KKwlkaXItPmlfbXRpbWUgPSBkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworI2VuZGlmCisJaWYgKGxpbmspCisJCWRpci0+aV9ubGluayArPSBsaW5rOworfQorCisvKiBjcmVhdGlvbiByb3V0aW5lczogY3JlYXRlLCBta25vZCwgbWtkaXIsIGxpbmssIHN5bWxpbmsgKi8KK3N0YXRpYyBpbnQgY29kYV9jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlLCBpbnQgbW9kZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisgICAgICAgIGludCBlcnJvcj0wOworCWNvbnN0IGNoYXIgKm5hbWU9ZGUtPmRfbmFtZS5uYW1lOworCWludCBsZW5ndGg9ZGUtPmRfbmFtZS5sZW47CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgQ29kYUZpZCBuZXdmaWQ7CisJc3RydWN0IGNvZGFfdmF0dHIgYXR0cnM7CisKKwlsb2NrX2tlcm5lbCgpOworCWNvZGFfdmZzX3N0YXQuY3JlYXRlKys7CisKKwlpZiAoY29kYV9pc3Jvb3QoZGlyKSAmJiBjb2RhX2lzY29udHJvbChuYW1lLCBsZW5ndGgpKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwllcnJvciA9IHZlbnVzX2NyZWF0ZShkaXItPmlfc2IsIGNvZGFfaTJmKGRpciksIG5hbWUsIGxlbmd0aCwgCisJCQkJMCwgbW9kZSwgJm5ld2ZpZCwgJmF0dHJzKTsKKworICAgICAgICBpZiAoIGVycm9yICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCWRfZHJvcChkZSk7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlpbm9kZSA9IGNvZGFfaWdldChkaXItPmlfc2IsICZuZXdmaWQsICZhdHRycyk7CisJaWYgKCBJU19FUlIoaW5vZGUpICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCWRfZHJvcChkZSk7CisJCXJldHVybiBQVFJfRVJSKGlub2RlKTsKKwl9CisKKwkvKiBpbnZhbGlkYXRlIHRoZSBkaXJlY3RvcnkgY25vZGUncyBhdHRyaWJ1dGVzICovCisJY29kYV9kaXJfY2hhbmdlZChkaXIsIDApOworCXVubG9ja19rZXJuZWwoKTsKKwlkX2luc3RhbnRpYXRlKGRlLCBpbm9kZSk7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvZGFfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBjb2RhX3ZhdHRyIGF0dHJzOworCWNvbnN0IGNoYXIgKm5hbWUgPSBkZS0+ZF9uYW1lLm5hbWU7CisJaW50IGxlbiA9IGRlLT5kX25hbWUubGVuOworCWludCBlcnJvcjsKKwlzdHJ1Y3QgQ29kYUZpZCBuZXdmaWQ7CisKKwlsb2NrX2tlcm5lbCgpOworCWNvZGFfdmZzX3N0YXQubWtkaXIrKzsKKworCWlmIChjb2RhX2lzcm9vdChkaXIpICYmIGNvZGFfaXNjb250cm9sKG5hbWUsIGxlbikpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWF0dHJzLnZhX21vZGUgPSBtb2RlOworCWVycm9yID0gdmVudXNfbWtkaXIoZGlyLT5pX3NiLCBjb2RhX2kyZihkaXIpLCAKKwkJCSAgICAgICBuYW1lLCBsZW4sICZuZXdmaWQsICZhdHRycyk7CisgICAgICAgIAorICAgICAgICBpZiAoIGVycm9yICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCWRfZHJvcChkZSk7CisJCXJldHVybiBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICAgCisJaW5vZGUgPSBjb2RhX2lnZXQoZGlyLT5pX3NiLCAmbmV3ZmlkLCAmYXR0cnMpOworCWlmICggSVNfRVJSKGlub2RlKSApIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlkX2Ryb3AoZGUpOworCQlyZXR1cm4gUFRSX0VSUihpbm9kZSk7CisJfQorCQorCS8qIGludmFsaWRhdGUgdGhlIGRpcmVjdG9yeSBjbm9kZSdzIGF0dHJpYnV0ZXMgKi8KKwljb2RhX2Rpcl9jaGFuZ2VkKGRpciwgMSk7CisJdW5sb2NrX2tlcm5lbCgpOworCWRfaW5zdGFudGlhdGUoZGUsIGlub2RlKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qIHRyeSB0byBtYWtlIGRlIGFuIGVudHJ5IGluIGRpcl9pbm9kZGUgbGlua2VkIHRvIHNvdXJjZV9kZSAqLyAKK3N0YXRpYyBpbnQgY29kYV9saW5rKHN0cnVjdCBkZW50cnkgKnNvdXJjZV9kZSwgc3RydWN0IGlub2RlICpkaXJfaW5vZGUsIAorCSAgc3RydWN0IGRlbnRyeSAqZGUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHNvdXJjZV9kZS0+ZF9pbm9kZTsKKyAgICAgICAgY29uc3QgY2hhciAqIG5hbWUgPSBkZS0+ZF9uYW1lLm5hbWU7CisJaW50IGxlbiA9IGRlLT5kX25hbWUubGVuOworCWludCBlcnJvcjsKKworCWxvY2tfa2VybmVsKCk7CisJY29kYV92ZnNfc3RhdC5saW5rKys7CisKKwlpZiAoY29kYV9pc3Jvb3QoZGlyX2lub2RlKSAmJiBjb2RhX2lzY29udHJvbChuYW1lLCBsZW4pKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwllcnJvciA9IHZlbnVzX2xpbmsoZGlyX2lub2RlLT5pX3NiLCBjb2RhX2kyZihpbm9kZSksCisJCQkgICBjb2RhX2kyZihkaXJfaW5vZGUpLCAoY29uc3QgY2hhciAqKW5hbWUsIGxlbik7CisKKwlpZiAoZXJyb3IpIHsgCisJCWRfZHJvcChkZSk7CisJCWdvdG8gb3V0OworCX0KKworCWNvZGFfZGlyX2NoYW5nZWQoZGlyX2lub2RlLCAwKTsKKwlhdG9taWNfaW5jKCZpbm9kZS0+aV9jb3VudCk7CisJZF9pbnN0YW50aWF0ZShkZSwgaW5vZGUpOworCWlub2RlLT5pX25saW5rKys7CisgICAgICAgIAorb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4oZXJyb3IpOworfQorCisKK3N0YXRpYyBpbnQgY29kYV9zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyX2lub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZSwKKwkJCWNvbnN0IGNoYXIgKnN5bW5hbWUpCit7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBkZS0+ZF9uYW1lLm5hbWU7CisJaW50IGxlbiA9IGRlLT5kX25hbWUubGVuOworCWludCBzeW1sZW47CisgICAgICAgIGludCBlcnJvcj0wOworICAgICAgICAKKwlsb2NrX2tlcm5lbCgpOworCWNvZGFfdmZzX3N0YXQuc3ltbGluaysrOworCisJaWYgKGNvZGFfaXNyb290KGRpcl9pbm9kZSkgJiYgY29kYV9pc2NvbnRyb2wobmFtZSwgbGVuKSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJc3ltbGVuID0gc3RybGVuKHN5bW5hbWUpOworCWlmICggc3ltbGVuID4gQ09EQV9NQVhQQVRITEVOICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5BTUVUT09MT05HOworCX0KKworCS8qCisJICogVGhpcyBlbnRyeSBpcyBub3cgbmVnYXRpdmUuIFNpbmNlIHdlIGRvIG5vdCBjcmVhdGUKKwkgKiBhbiBpbm9kZSBmb3IgdGhlIGVudHJ5IHdlIGhhdmUgdG8gZHJvcCBpdC4gCisJICovCisJZF9kcm9wKGRlKTsKKwllcnJvciA9IHZlbnVzX3N5bWxpbmsoZGlyX2lub2RlLT5pX3NiLCBjb2RhX2kyZihkaXJfaW5vZGUpLCBuYW1lLCBsZW4sIAorCQkJICAgICAgc3ltbmFtZSwgc3ltbGVuKTsKKworCS8qIG10aW1lIGlzIG5vIGdvb2QgYW55bW9yZSAqLworCWlmICggIWVycm9yICkKKwkJY29kYV9kaXJfY2hhbmdlZChkaXJfaW5vZGUsIDApOworCisJdW5sb2NrX2tlcm5lbCgpOworICAgICAgICByZXR1cm4gZXJyb3I7Cit9CisKKy8qIGRlc3RydWN0aW9uIHJvdXRpbmVzOiB1bmxpbmssIHJtZGlyICovCitpbnQgY29kYV91bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlKQoreworICAgICAgICBpbnQgZXJyb3I7CisJY29uc3QgY2hhciAqbmFtZSA9IGRlLT5kX25hbWUubmFtZTsKKwlpbnQgbGVuID0gZGUtPmRfbmFtZS5sZW47CisKKwlsb2NrX2tlcm5lbCgpOworCWNvZGFfdmZzX3N0YXQudW5saW5rKys7CisKKyAgICAgICAgZXJyb3IgPSB2ZW51c19yZW1vdmUoZGlyLT5pX3NiLCBjb2RhX2kyZihkaXIpLCBuYW1lLCBsZW4pOworICAgICAgICBpZiAoIGVycm9yICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisKKwljb2RhX2Rpcl9jaGFuZ2VkKGRpciwgMCk7CisJZGUtPmRfaW5vZGUtPmlfbmxpbmstLTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBjb2RhX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZSkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gZGUtPmRfbmFtZS5uYW1lOworCWludCBsZW4gPSBkZS0+ZF9uYW1lLmxlbjsKKyAgICAgICAgaW50IGVycm9yOworCisJbG9ja19rZXJuZWwoKTsKKwljb2RhX3Zmc19zdGF0LnJtZGlyKys7CisKKwlpZiAoIWRfdW5oYXNoZWQoZGUpKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJZXJyb3IgPSB2ZW51c19ybWRpcihkaXItPmlfc2IsIGNvZGFfaTJmKGRpciksIG5hbWUsIGxlbik7CisKKyAgICAgICAgaWYgKCBlcnJvciApIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorCisJY29kYV9kaXJfY2hhbmdlZChkaXIsIC0xKTsKKwlkZS0+ZF9pbm9kZS0+aV9ubGluay0tOworCWRfZGVsZXRlKGRlKTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qIHJlbmFtZSAqLworc3RhdGljIGludCBjb2RhX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIAorCQkgICAgICAgc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQoreworICAgICAgICBjb25zdCBjaGFyICpvbGRfbmFtZSA9IG9sZF9kZW50cnktPmRfbmFtZS5uYW1lOworICAgICAgICBjb25zdCBjaGFyICpuZXdfbmFtZSA9IG5ld19kZW50cnktPmRfbmFtZS5uYW1lOworCWludCBvbGRfbGVuZ3RoID0gb2xkX2RlbnRyeS0+ZF9uYW1lLmxlbjsKKwlpbnQgbmV3X2xlbmd0aCA9IG5ld19kZW50cnktPmRfbmFtZS5sZW47CisgICAgICAgIGludCBsaW5rX2FkanVzdCA9IDA7CisgICAgICAgIGludCBlcnJvcjsKKworCWxvY2tfa2VybmVsKCk7CisJY29kYV92ZnNfc3RhdC5yZW5hbWUrKzsKKworICAgICAgICBlcnJvciA9IHZlbnVzX3JlbmFtZShvbGRfZGlyLT5pX3NiLCBjb2RhX2kyZihvbGRfZGlyKSwgCisJCQkgICAgIGNvZGFfaTJmKG5ld19kaXIpLCBvbGRfbGVuZ3RoLCBuZXdfbGVuZ3RoLCAKKwkJCSAgICAgKGNvbnN0IGNoYXIgKikgb2xkX25hbWUsIChjb25zdCBjaGFyICopbmV3X25hbWUpOworCisgICAgICAgIGlmICggIWVycm9yICkgeworCQlpZiAoIG5ld19kZW50cnktPmRfaW5vZGUgKSB7CisJCQlpZiAoIFNfSVNESVIobmV3X2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSApCisgICAgICAgICAgICAgICAgICAgICAgICAJbGlua19hZGp1c3QgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RhX2Rpcl9jaGFuZ2VkKG9sZF9kaXIsIC1saW5rX2FkanVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RhX2Rpcl9jaGFuZ2VkKG5ld19kaXIsICBsaW5rX2FkanVzdCk7CisJCQljb2RhX2ZsYWdfaW5vZGUobmV3X2RlbnRyeS0+ZF9pbm9kZSwgQ19WQVRUUik7CisJCX0gZWxzZSB7CisJCQljb2RhX2ZsYWdfaW5vZGUob2xkX2RpciwgQ19WQVRUUik7CisJCQljb2RhX2ZsYWdfaW5vZGUobmV3X2RpciwgQ19WQVRUUik7CisgICAgICAgICAgICAgICAgfQorCX0KKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyogZmlsZSBvcGVyYXRpb25zIGZvciBkaXJlY3RvcmllcyAqLworaW50IGNvZGFfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqY29kYV9maWxlLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBkZW50cnkgKmNvZGFfZGVudHJ5ID0gY29kYV9maWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgY29kYV9maWxlX2luZm8gKmNmaTsKKwlzdHJ1Y3QgZmlsZSAqaG9zdF9maWxlOworCXN0cnVjdCBpbm9kZSAqaG9zdF9pbm9kZTsKKwlpbnQgcmV0OworCisJY2ZpID0gQ09EQV9GVE9DKGNvZGFfZmlsZSk7CisJQlVHX09OKCFjZmkgfHwgY2ZpLT5jZmlfbWFnaWMgIT0gQ09EQV9NQUdJQyk7CisJaG9zdF9maWxlID0gY2ZpLT5jZmlfY29udGFpbmVyOworCisJY29kYV92ZnNfc3RhdC5yZWFkZGlyKys7CisKKwlob3N0X2lub2RlID0gaG9zdF9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlkb3duKCZob3N0X2lub2RlLT5pX3NlbSk7CisJaG9zdF9maWxlLT5mX3BvcyA9IGNvZGFfZmlsZS0+Zl9wb3M7CisKKwlpZiAoIWhvc3RfZmlsZS0+Zl9vcC0+cmVhZGRpcikgeworCQkvKiBWZW51czogd2UgbXVzdCByZWFkIFZlbnVzIGRpcmVudHMgZnJvbSB0aGUgZmlsZSAqLworCQlyZXQgPSBjb2RhX3ZlbnVzX3JlYWRkaXIoaG9zdF9maWxlLCBmaWxsZGlyLCBkaXJlbnQsIGNvZGFfZGVudHJ5KTsKKwl9IGVsc2UgeworCQkvKiBwb3RlbWtpbiBjYXNlOiB3ZSB3ZXJlIGhhbmRlZCBhIGRpcmVjdG9yeSBpbm9kZS4gKi8KKwkJLyogWXVrLCB3ZSBjYW4ndCBjYWxsIHZmc19yZWFkZGlyIGJlY2F1c2Ugd2UgYXJlIGFscmVhZHkKKwkJICogaG9sZGluZyB0aGUgaW5vZGUgc2VtYXBob3JlLiAqLworCQlyZXQgPSAtRU5PVERJUjsKKwkJaWYgKCFob3N0X2ZpbGUtPmZfb3AgfHwgIWhvc3RfZmlsZS0+Zl9vcC0+cmVhZGRpcikKKwkJCWdvdG8gb3V0OworCisJCXJldCA9IC1FTk9FTlQ7CisJCWlmICghSVNfREVBRERJUihob3N0X2lub2RlKSkgeworCQkJcmV0ID0gaG9zdF9maWxlLT5mX29wLT5yZWFkZGlyKGhvc3RfZmlsZSwgZmlsbGRpciwgZGlyZW50KTsKKwkJCWZpbGVfYWNjZXNzZWQoaG9zdF9maWxlKTsKKwkJfQorCX0KK291dDoKKwljb2RhX2ZpbGUtPmZfcG9zID0gaG9zdF9maWxlLT5mX3BvczsKKwl1cCgmaG9zdF9pbm9kZS0+aV9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgQ0RUMkRUKHVuc2lnbmVkIGNoYXIgY2R0KQoreworCXVuc2lnbmVkIGludCBkdDsKKworCXN3aXRjaChjZHQpIHsKKwljYXNlIENEVF9VTktOT1dOOiBkdCA9IERUX1VOS05PV047IGJyZWFrOworCWNhc2UgQ0RUX0ZJRk86CSAgZHQgPSBEVF9GSUZPOyAgICBicmVhazsKKwljYXNlIENEVF9DSFI6CSAgZHQgPSBEVF9DSFI7ICAgICBicmVhazsKKwljYXNlIENEVF9ESVI6CSAgZHQgPSBEVF9ESVI7ICAgICBicmVhazsKKwljYXNlIENEVF9CTEs6CSAgZHQgPSBEVF9CTEs7ICAgICBicmVhazsKKwljYXNlIENEVF9SRUc6CSAgZHQgPSBEVF9SRUc7ICAgICBicmVhazsKKwljYXNlIENEVF9MTks6CSAgZHQgPSBEVF9MTks7ICAgICBicmVhazsKKwljYXNlIENEVF9TT0NLOgkgIGR0ID0gRFRfU09DSzsgICAgYnJlYWs7CisJY2FzZSBDRFRfV0hUOgkgIGR0ID0gRFRfV0hUOyAgICAgYnJlYWs7CisJZGVmYXVsdDoJICBkdCA9IERUX1VOS05PV047IGJyZWFrOworCX0KKwlyZXR1cm4gZHQ7Cit9CisKKy8qIHN1cHBvcnQgcm91dGluZXMgKi8KK3N0YXRpYyBpbnQgY29kYV92ZW51c19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCBmaWxsZGlyX3QgZmlsbGRpciwKKwkJCSAgICAgIHZvaWQgKmRpcmVudCwgc3RydWN0IGRlbnRyeSAqZGlyKQoreworCWludCByZXN1bHQgPSAwOyAvKiAjIG9mIGVudHJpZXMgcmV0dXJuZWQgKi8KKwlzdHJ1Y3QgdmVudXNfZGlyZW50ICp2ZGlyOworCXVuc2lnbmVkIGxvbmcgdmRpcl9zaXplID0KKwkgICAgKHVuc2lnbmVkIGxvbmcpKCYoKHN0cnVjdCB2ZW51c19kaXJlbnQgKikwKS0+ZF9uYW1lKTsKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKwlzdHJ1Y3QgcXN0ciBuYW1lOworCWlub190IGlubzsKKwlpbnQgcmV0LCBpOworCisJdmRpciA9IChzdHJ1Y3QgdmVudXNfZGlyZW50ICopa21hbGxvYyhzaXplb2YoKnZkaXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZkaXIpIHJldHVybiAtRU5PTUVNOworCisJaSA9IGZpbHAtPmZfcG9zOworCXN3aXRjaChpKSB7CisJY2FzZSAwOgorCQlyZXQgPSBmaWxsZGlyKGRpcmVudCwgIi4iLCAxLCAwLCBkaXItPmRfaW5vZGUtPmlfaW5vLCBEVF9ESVIpOworCQlpZiAocmV0IDwgMCkgYnJlYWs7CisJCXJlc3VsdCsrOworCQlmaWxwLT5mX3BvcysrOworCQkvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgMToKKwkJcmV0ID0gZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIDEsIGRpci0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfaW5vLCBEVF9ESVIpOworCQlpZiAocmV0IDwgMCkgYnJlYWs7CisJCXJlc3VsdCsrOworCQlmaWxwLT5mX3BvcysrOworCQkvKiBmYWxsdGhyb3VnaCAqLworCWRlZmF1bHQ6CisJd2hpbGUgKDEpIHsKKwkJLyogcmVhZCBlbnRyaWVzIGZyb20gdGhlIGRpcmVjdG9yeSBmaWxlICovCisJCXJldCA9IGtlcm5lbF9yZWFkKGZpbHAsIGZpbHAtPmZfcG9zIC0gMiwgKGNoYXIgKil2ZGlyLAorCQkJCSAgc2l6ZW9mKCp2ZGlyKSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoImNvZGFfdmVudXNfcmVhZGRpcjogcmVhZCBkaXIgZmFpbGVkICVkXG4iLCByZXQpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJldCA9PSAwKSBicmVhazsgLyogZW5kIG9mIGRpcmVjdG9yeSBmaWxlIHJlYWNoZWQgKi8KKworCQkvKiBjYXRjaCB0cnVuY2F0ZWQgcmVhZHMgKi8KKwkJaWYgKHJldCA8IHZkaXJfc2l6ZSB8fCByZXQgPCB2ZGlyX3NpemUgKyB2ZGlyLT5kX25hbWxlbikgeworCQkJcHJpbnRrKCJjb2RhX3ZlbnVzX3JlYWRkaXI6IHNob3J0IHJlYWQ6ICVsZFxuIiwKKwkJCSAgICAgICBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8pOworCQkJcmV0ID0gLUVCQURGOworCQkJYnJlYWs7CisJCX0KKwkJLyogdmFsaWRhdGUgd2hldGhlciB0aGUgZGlyZWN0b3J5IGZpbGUgYWN0dWFsbHkgbWFrZXMgc2Vuc2UgKi8KKwkJaWYgKHZkaXItPmRfcmVjbGVuIDwgdmRpcl9zaXplICsgdmRpci0+ZF9uYW1sZW4pIHsKKwkJCXByaW50aygiY29kYV92ZW51c19yZWFkZGlyOiBJbnZhbGlkIGRpcjogJWxkXG4iLAorCQkJICAgICAgIGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2lubyk7CisJCQlyZXQgPSAtRUJBREY7CisJCQlicmVhazsKKwkJfQorCisJCW5hbWUubGVuID0gdmRpci0+ZF9uYW1sZW47CisJCW5hbWUubmFtZSA9IHZkaXItPmRfbmFtZTsKKworCQkvKiBNYWtlIHN1cmUgd2Ugc2tpcCAnLicgYW5kICcuLicsIHdlIGFscmVhZHkgZ290IHRob3NlICovCisJCWlmIChuYW1lLm5hbWVbMF0gPT0gJy4nICYmIChuYW1lLmxlbiA9PSAxIHx8CisJCSAgICAodmRpci0+ZF9uYW1lWzFdID09ICcuJyAmJiBuYW1lLmxlbiA9PSAyKSkpCisJCQl2ZGlyLT5kX2ZpbGVubyA9IG5hbWUubGVuID0gMDsKKworCQkvKiBza2lwIG51bGwgZW50cmllcyAqLworCQlpZiAodmRpci0+ZF9maWxlbm8gJiYgbmFtZS5sZW4pIHsKKwkJCS8qIHRyeSB0byBsb29rIHVwIHRoaXMgZW50cnkgaW4gdGhlIGRjYWNoZSwgdGhhdCB3YXkKKwkJCSAqIHVzZXJzcGFjZSBkb2Vzbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYnJlYWtpbmcKKwkJCSAqIGdldGN3ZCBieSBoYXZpbmcgbWlzbWF0Y2hlZCBpbm9kZSBudW1iZXJzIGZvcgorCQkJICogaW50ZXJuYWwgdm9sdW1lIG1vdW50cG9pbnRzLiAqLworCQkJaW5vID0gZmluZF9pbm9kZV9udW1iZXIoZGlyLCAmbmFtZSk7CisJCQlpZiAoIWlubykgaW5vID0gdmRpci0+ZF9maWxlbm87CisKKwkJCXR5cGUgPSBDRFQyRFQodmRpci0+ZF90eXBlKTsKKwkJCXJldCA9IGZpbGxkaXIoZGlyZW50LCBuYW1lLm5hbWUsIG5hbWUubGVuLCBmaWxwLT5mX3BvcywKKwkJCQkgICAgICBpbm8sIHR5cGUpOyAKKwkJCS8qIGZhaWx1cmUgbWVhbnMgbm8gc3BhY2UgZm9yIGZpbGxpbmcgaW4gdGhpcyByb3VuZCAqLworCQkJaWYgKHJldCA8IDApIGJyZWFrOworCQkJcmVzdWx0Kys7CisJCX0KKwkJLyogd2UnbGwgYWx3YXlzIGhhdmUgcHJvZ3Jlc3MgYmVjYXVzZSBkX3JlY2xlbiBpcyB1bnNpZ25lZCBhbmQKKwkJICogd2UndmUgYWxyZWFkeSBlc3RhYmxpc2hlZCBpdCBpcyBub24temVyby4gKi8KKwkJZmlscC0+Zl9wb3MgKz0gdmRpci0+ZF9yZWNsZW47CisJfQorCX0gCisJa2ZyZWUodmRpcik7CisJcmV0dXJuIHJlc3VsdCA/IHJlc3VsdCA6IHJldDsKK30KKworLyogY2FsbGVkIHdoZW4gYSBjYWNoZSBsb29rdXAgc3VjY2VlZHMgKi8KK3N0YXRpYyBpbnQgY29kYV9kZW50cnlfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlLT5kX2lub2RlOworCXN0cnVjdCBjb2RhX2lub2RlX2luZm8gKmNpaTsKKworCWlmICghaW5vZGUpCisJCXJldHVybiAxOworCWxvY2tfa2VybmVsKCk7CisJaWYgKGNvZGFfaXNyb290KGlub2RlKSkKKwkJZ290byBvdXQ7CisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCisJCWdvdG8gYmFkOworCisJY2lpID0gSVRPQyhkZS0+ZF9pbm9kZSk7CisJaWYgKCEoY2lpLT5jX2ZsYWdzICYgKENfUFVSR0UgfCBDX0ZMVVNIKSkpCisJCWdvdG8gb3V0OworCisJc2hyaW5rX2RjYWNoZV9wYXJlbnQoZGUpOworCisJLyogcHJvcGFnYXRlIGZvciBhIGZsdXNoICovCisJaWYgKGNpaS0+Y19mbGFncyAmIENfRkxVU0gpIAorCQljb2RhX2ZsYWdfaW5vZGVfY2hpbGRyZW4oaW5vZGUsIENfRkxVU0gpOworCisJaWYgKGF0b21pY19yZWFkKCZkZS0+ZF9jb3VudCkgPiAxKQorCQkvKiBwcmV0ZW5kIGl0J3MgdmFsaWQsIGJ1dCBkb24ndCBjaGFuZ2UgdGhlIGZsYWdzICovCisJCWdvdG8gb3V0OworCisJLyogY2xlYXIgdGhlIGZsYWdzLiAqLworCWNpaS0+Y19mbGFncyAmPSB+KENfVkFUVFIgfCBDX1BVUkdFIHwgQ19GTFVTSCk7CisKK2JhZDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAxOworfQorCisvKgorICogVGhpcyBpcyB0aGUgY2FsbGJhY2sgZnJvbSBkcHV0KCkgd2hlbiBkX2NvdW50IGlzIGdvaW5nIHRvIDAuCisgKiBXZSB1c2UgdGhpcyB0byB1bmhhc2ggZGVudHJpZXMgd2l0aCBiYWQgaW5vZGVzLgorICovCitzdGF0aWMgaW50IGNvZGFfZGVudHJ5X2RlbGV0ZShzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5KQoreworCWludCBmbGFnczsKKworCWlmICghZGVudHJ5LT5kX2lub2RlKSAKKwkJcmV0dXJuIDA7CisKKwlmbGFncyA9IChJVE9DKGRlbnRyeS0+ZF9pbm9kZSktPmNfZmxhZ3MpICYgQ19QVVJHRTsKKwlpZiAoaXNfYmFkX2lub2RlKGRlbnRyeS0+ZF9pbm9kZSkgfHwgZmxhZ3MpIHsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisKKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2Ugd2FudCB0byBjaGVjayBpZiB0aGUgaW5vZGUgaGFzCisgKiBjaGFuZ2VkIG9uIHRoZSBzZXJ2ZXIuICBDb2RhIG1ha2VzIHRoaXMgZWFzeSBzaW5jZSB0aGUKKyAqIGNhY2hlIG1hbmFnZXIgVmVudXMgaXNzdWVzIGEgZG93bmNhbGwgdG8gdGhlIGtlcm5lbCB3aGVuIHRoaXMgCisgKiBoYXBwZW5zIAorICovCitpbnQgY29kYV9yZXZhbGlkYXRlX2lub2RlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgY29kYV92YXR0ciBhdHRyOworCWludCBlcnJvciA9IDA7CisJaW50IG9sZF9tb2RlOworCWlub190IG9sZF9pbm87CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgY29kYV9pbm9kZV9pbmZvICpjaWkgPSBJVE9DKGlub2RlKTsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKCAhY2lpLT5jX2ZsYWdzICkKKwkJZ290byBvazsKKworCWlmIChjaWktPmNfZmxhZ3MgJiAoQ19WQVRUUiB8IENfUFVSR0UgfCBDX0ZMVVNIKSkgeworCQllcnJvciA9IHZlbnVzX2dldGF0dHIoaW5vZGUtPmlfc2IsICYoY2lpLT5jX2ZpZCksICZhdHRyKTsKKwkJaWYgKCBlcnJvciApCisJCQlnb3RvIHJldHVybl9iYWQ7CisKKwkJLyogdGhpcyBpbm9kZSBtYXkgYmUgbG9zdCBpZjoKKwkJICAgLSBpdCdzIGlubyBjaGFuZ2VkIAorCQkgICAtIHR5cGUgY2hhbmdlcyBtdXN0IGJlIHBlcm1pdHRlZCBmb3IgcmVwYWlyIGFuZAorCQkgICBtaXNzaW5nIG1vdW50IHBvaW50cy4KKwkJKi8KKwkJb2xkX21vZGUgPSBpbm9kZS0+aV9tb2RlOworCQlvbGRfaW5vID0gaW5vZGUtPmlfaW5vOworCQljb2RhX3ZhdHRyX3RvX2lhdHRyKGlub2RlLCAmYXR0cik7CisKKwkJaWYgKChvbGRfbW9kZSAmIFNfSUZNVCkgIT0gKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpKSB7CisJCQlwcmludGsoIkNvZGE6IGlub2RlICVsZCwgZmlkICVzIGNoYW5nZWQgdHlwZSFcbiIsCisJCQkgICAgICAgaW5vZGUtPmlfaW5vLCBjb2RhX2YycygmKGNpaS0+Y19maWQpKSk7CisJCX0KKworCQkvKiB0aGUgZm9sbG93aW5nIGNhbiBoYXBwZW4gd2hlbiBhIGxvY2FsIGZpZCBpcyByZXBsYWNlZCAKKwkJICAgd2l0aCBhIGdsb2JhbCBvbmUsIGhlcmUgd2UgbG9zZSBhbmQgZGVjbGFyZSB0aGUgaW5vZGUgYmFkICovCisJCWlmIChpbm9kZS0+aV9pbm8gIT0gb2xkX2lubykKKwkJCWdvdG8gcmV0dXJuX2JhZDsKKwkJCisJCWNvZGFfZmxhZ19pbm9kZV9jaGlsZHJlbihpbm9kZSwgQ19GTFVTSCk7CisJCWNpaS0+Y19mbGFncyAmPSB+KENfVkFUVFIgfCBDX1BVUkdFIHwgQ19GTFVTSCk7CisJfQorCitvazoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7CisKK3JldHVybl9iYWQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAtRUlPOworfQpkaWZmIC0tZ2l0IGEvZnMvY29kYS9maWxlLmMgYi9mcy9jb2RhL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmJjMDIyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY29kYS9maWxlLmMKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiBGaWxlIG9wZXJhdGlvbnMgZm9yIENvZGEuCisgKiBPcmlnaW5hbCB2ZXJzaW9uOiAoQykgMTk5NiBQZXRlciBCcmFhbSAKKyAqIFJld3JpdHRlbiBmb3IgTGludXggMi4xOiAoQykgMTk5NyBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQorICoKKyAqIENhcm5lZ2llIE1lbGxvbiBlbmNvdXJhZ2VzIHVzZXJzIG9mIHRoaXMgY29kZSB0byBjb250cmlidXRlIGltcHJvdmVtZW50cworICogdG8gdGhlIENvZGEgcHJvamVjdC4gQ29udGFjdCBQZXRlciBCcmFhbSA8Y29kYUBjcy5jbXUuZWR1Pi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvY29kYS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfbGludXguaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2ZzX2kuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX3BzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9wcm9jLmg+CisKKy8qIGlmIENPREFfU1RPUkUgZmFpbHMgd2l0aCBFT1BOT1RTVVBQLCB2ZW51cyBjbGVhcmx5IGRvZXNuJ3Qgc3VwcG9ydAorICogQ09EQV9TVE9SRS9DT0RBX1JFTEVBU0UgYW5kIHdlIGZhbGwgYmFjayBvbiB1c2luZyB0aGUgQ09EQV9DTE9TRSB1cGNhbGwgKi8KK3N0YXRpYyBpbnQgdXNlX2NvZGFfY2xvc2U7CisKK3N0YXRpYyBzc2l6ZV90Citjb2RhX2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqY29kYV9maWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgY29kYV9maWxlX2luZm8gKmNmaTsKKwlzdHJ1Y3QgZmlsZSAqaG9zdF9maWxlOworCisJY2ZpID0gQ09EQV9GVE9DKGNvZGFfZmlsZSk7CisJQlVHX09OKCFjZmkgfHwgY2ZpLT5jZmlfbWFnaWMgIT0gQ09EQV9NQUdJQyk7CisJaG9zdF9maWxlID0gY2ZpLT5jZmlfY29udGFpbmVyOworCisJaWYgKCFob3N0X2ZpbGUtPmZfb3AgfHwgIWhvc3RfZmlsZS0+Zl9vcC0+cmVhZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gaG9zdF9maWxlLT5mX29wLT5yZWFkKGhvc3RfZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90Citjb2RhX2ZpbGVfc2VuZGZpbGUoc3RydWN0IGZpbGUgKmNvZGFfZmlsZSwgbG9mZl90ICpwcG9zLCBzaXplX3QgY291bnQsCisJCSAgIHJlYWRfYWN0b3JfdCBhY3Rvciwgdm9pZCAqdGFyZ2V0KQoreworCXN0cnVjdCBjb2RhX2ZpbGVfaW5mbyAqY2ZpOworCXN0cnVjdCBmaWxlICpob3N0X2ZpbGU7CisKKwljZmkgPSBDT0RBX0ZUT0MoY29kYV9maWxlKTsKKwlCVUdfT04oIWNmaSB8fCBjZmktPmNmaV9tYWdpYyAhPSBDT0RBX01BR0lDKTsKKwlob3N0X2ZpbGUgPSBjZmktPmNmaV9jb250YWluZXI7CisKKwlpZiAoIWhvc3RfZmlsZS0+Zl9vcCB8fCAhaG9zdF9maWxlLT5mX29wLT5zZW5kZmlsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gaG9zdF9maWxlLT5mX29wLT5zZW5kZmlsZShob3N0X2ZpbGUsIHBwb3MsIGNvdW50LCBhY3RvciwgdGFyZ2V0KTsKK30KKworc3RhdGljIHNzaXplX3QKK2NvZGFfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqY29kYV9maWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmhvc3RfaW5vZGUsICpjb2RhX2lub2RlID0gY29kYV9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgY29kYV9maWxlX2luZm8gKmNmaTsKKwlzdHJ1Y3QgZmlsZSAqaG9zdF9maWxlOworCXNzaXplX3QgcmV0OworCisJY2ZpID0gQ09EQV9GVE9DKGNvZGFfZmlsZSk7CisJQlVHX09OKCFjZmkgfHwgY2ZpLT5jZmlfbWFnaWMgIT0gQ09EQV9NQUdJQyk7CisJaG9zdF9maWxlID0gY2ZpLT5jZmlfY29udGFpbmVyOworCisJaWYgKCFob3N0X2ZpbGUtPmZfb3AgfHwgIWhvc3RfZmlsZS0+Zl9vcC0+d3JpdGUpCisJCXJldHVybiAtRUlOVkFMOworCisJaG9zdF9pbm9kZSA9IGhvc3RfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJZG93bigmY29kYV9pbm9kZS0+aV9zZW0pOworCisJcmV0ID0gaG9zdF9maWxlLT5mX29wLT53cml0ZShob3N0X2ZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOworCisJY29kYV9pbm9kZS0+aV9zaXplID0gaG9zdF9pbm9kZS0+aV9zaXplOworCWNvZGFfaW5vZGUtPmlfYmxvY2tzID0gKGNvZGFfaW5vZGUtPmlfc2l6ZSArIDUxMSkgPj4gOTsKKwljb2RhX2lub2RlLT5pX210aW1lID0gY29kYV9pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJdXAoJmNvZGFfaW5vZGUtPmlfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2NvZGFfZmlsZV9tbWFwKHN0cnVjdCBmaWxlICpjb2RhX2ZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBjb2RhX2ZpbGVfaW5mbyAqY2ZpOworCXN0cnVjdCBjb2RhX2lub2RlX2luZm8gKmNpaTsKKwlzdHJ1Y3QgZmlsZSAqaG9zdF9maWxlOworCXN0cnVjdCBpbm9kZSAqY29kYV9pbm9kZSwgKmhvc3RfaW5vZGU7CisKKwljZmkgPSBDT0RBX0ZUT0MoY29kYV9maWxlKTsKKwlCVUdfT04oIWNmaSB8fCBjZmktPmNmaV9tYWdpYyAhPSBDT0RBX01BR0lDKTsKKwlob3N0X2ZpbGUgPSBjZmktPmNmaV9jb250YWluZXI7CisKKwlpZiAoIWhvc3RfZmlsZS0+Zl9vcCB8fCAhaG9zdF9maWxlLT5mX29wLT5tbWFwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNvZGFfaW5vZGUgPSBjb2RhX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWhvc3RfaW5vZGUgPSBob3N0X2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWNvZGFfZmlsZS0+Zl9tYXBwaW5nID0gaG9zdF9maWxlLT5mX21hcHBpbmc7CisJaWYgKGNvZGFfaW5vZGUtPmlfbWFwcGluZyA9PSAmY29kYV9pbm9kZS0+aV9kYXRhKQorCQljb2RhX2lub2RlLT5pX21hcHBpbmcgPSBob3N0X2lub2RlLT5pX21hcHBpbmc7CisKKwkvKiBvbmx5IGFsbG93IGFkZGl0aW9uYWwgbW1hcHMgYXMgbG9uZyBhcyB1c2Vyc3BhY2UgaXNuJ3QgY2hhbmdpbmcKKwkgKiB0aGUgY29udGFpbmVyIGZpbGUgb24gdXMhICovCisJZWxzZSBpZiAoY29kYV9pbm9kZS0+aV9tYXBwaW5nICE9IGhvc3RfaW5vZGUtPmlfbWFwcGluZykKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIGtlZXAgdHJhY2sgb2YgaG93IG9mdGVuIHRoZSBjb2RhX2lub2RlL2hvc3RfZmlsZSBoYXMgYmVlbiBtbWFwcGVkICovCisJY2lpID0gSVRPQyhjb2RhX2lub2RlKTsKKwljaWktPmNfbWFwY291bnQrKzsKKwljZmktPmNmaV9tYXBjb3VudCsrOworCisJcmV0dXJuIGhvc3RfZmlsZS0+Zl9vcC0+bW1hcChob3N0X2ZpbGUsIHZtYSk7Cit9CisKK2ludCBjb2RhX29wZW4oc3RydWN0IGlub2RlICpjb2RhX2lub2RlLCBzdHJ1Y3QgZmlsZSAqY29kYV9maWxlKQoreworCXN0cnVjdCBmaWxlICpob3N0X2ZpbGUgPSBOVUxMOworCWludCBlcnJvcjsKKwl1bnNpZ25lZCBzaG9ydCBmbGFncyA9IGNvZGFfZmlsZS0+Zl9mbGFncyAmICh+T19FWENMKTsKKwl1bnNpZ25lZCBzaG9ydCBjb2RhX2ZsYWdzID0gY29kYV9mbGFnc190b19jZmxhZ3MoZmxhZ3MpOworCXN0cnVjdCBjb2RhX2ZpbGVfaW5mbyAqY2ZpOworCisJY29kYV92ZnNfc3RhdC5vcGVuKys7CisKKwljZmkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY29kYV9maWxlX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNmaSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWxvY2tfa2VybmVsKCk7CisKKwllcnJvciA9IHZlbnVzX29wZW4oY29kYV9pbm9kZS0+aV9zYiwgY29kYV9pMmYoY29kYV9pbm9kZSksIGNvZGFfZmxhZ3MsCisJCQkgICAmaG9zdF9maWxlKTsgCisJaWYgKGVycm9yIHx8ICFob3N0X2ZpbGUpIHsKKwkJa2ZyZWUoY2ZpKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJaG9zdF9maWxlLT5mX2ZsYWdzIHw9IGNvZGFfZmlsZS0+Zl9mbGFncyAmIChPX0FQUEVORCB8IE9fU1lOQyk7CisKKwljZmktPmNmaV9tYWdpYyA9IENPREFfTUFHSUM7CisJY2ZpLT5jZmlfbWFwY291bnQgPSAwOworCWNmaS0+Y2ZpX2NvbnRhaW5lciA9IGhvc3RfZmlsZTsKKworCUJVR19PTihjb2RhX2ZpbGUtPnByaXZhdGVfZGF0YSAhPSBOVUxMKTsKKwljb2RhX2ZpbGUtPnByaXZhdGVfZGF0YSA9IGNmaTsKKworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNvZGFfZmx1c2goc3RydWN0IGZpbGUgKmNvZGFfZmlsZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBmbGFncyA9IGNvZGFfZmlsZS0+Zl9mbGFncyAmIH5PX0VYQ0w7CisJdW5zaWduZWQgc2hvcnQgY29kYV9mbGFncyA9IGNvZGFfZmxhZ3NfdG9fY2ZsYWdzKGZsYWdzKTsKKwlzdHJ1Y3QgY29kYV9maWxlX2luZm8gKmNmaTsKKwlzdHJ1Y3QgaW5vZGUgKmNvZGFfaW5vZGU7CisJaW50IGVyciA9IDAsIGZjbnQ7CisKKwlsb2NrX2tlcm5lbCgpOworCisJY29kYV92ZnNfc3RhdC5mbHVzaCsrOworCisJLyogbGFzdCBjbG9zZSBzZW1hbnRpY3MgKi8KKwlmY250ID0gZmlsZV9jb3VudChjb2RhX2ZpbGUpOworCWlmIChmY250ID4gMSkKKwkJZ290byBvdXQ7CisKKwkvKiBObyBuZWVkIHRvIG1ha2UgYW4gdXBjYWxsIHdoZW4gd2UgaGF2ZSBub3QgbWFkZSBhbnkgbW9kaWZpY2F0aW9ucworCSAqIHRvIHRoZSBmaWxlICovCisJaWYgKChjb2RhX2ZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRPTkxZKQorCQlnb3RvIG91dDsKKworCWlmICh1c2VfY29kYV9jbG9zZSkKKwkJZ290byBvdXQ7CisKKwljZmkgPSBDT0RBX0ZUT0MoY29kYV9maWxlKTsKKwlCVUdfT04oIWNmaSB8fCBjZmktPmNmaV9tYWdpYyAhPSBDT0RBX01BR0lDKTsKKworCWNvZGFfaW5vZGUgPSBjb2RhX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCisJZXJyID0gdmVudXNfc3RvcmUoY29kYV9pbm9kZS0+aV9zYiwgY29kYV9pMmYoY29kYV9pbm9kZSksIGNvZGFfZmxhZ3MsCisJCQkgIGNvZGFfZmlsZS0+Zl91aWQpOworCisJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkgeworCQl1c2VfY29kYV9jbG9zZSA9IDE7CisJCWVyciA9IDA7CisJfQorCitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBjb2RhX3JlbGVhc2Uoc3RydWN0IGlub2RlICpjb2RhX2lub2RlLCBzdHJ1Y3QgZmlsZSAqY29kYV9maWxlKQoreworCXVuc2lnbmVkIHNob3J0IGZsYWdzID0gKGNvZGFfZmlsZS0+Zl9mbGFncykgJiAofk9fRVhDTCk7CisJdW5zaWduZWQgc2hvcnQgY29kYV9mbGFncyA9IGNvZGFfZmxhZ3NfdG9fY2ZsYWdzKGZsYWdzKTsKKwlzdHJ1Y3QgY29kYV9maWxlX2luZm8gKmNmaTsKKwlzdHJ1Y3QgY29kYV9pbm9kZV9pbmZvICpjaWk7CisJc3RydWN0IGlub2RlICpob3N0X2lub2RlOworCWludCBlcnIgPSAwOworCisJbG9ja19rZXJuZWwoKTsKKwljb2RhX3Zmc19zdGF0LnJlbGVhc2UrKzsKKyAKKwlpZiAoIXVzZV9jb2RhX2Nsb3NlKSB7CisJCWVyciA9IHZlbnVzX3JlbGVhc2UoY29kYV9pbm9kZS0+aV9zYiwgY29kYV9pMmYoY29kYV9pbm9kZSksCisJCQkJICAgIGNvZGFfZmxhZ3MpOworCQlpZiAoZXJyID09IC1FT1BOT1RTVVBQKSB7CisJCQl1c2VfY29kYV9jbG9zZSA9IDE7CisJCQllcnIgPSAwOworCQl9CisJfQorCisJY2ZpID0gQ09EQV9GVE9DKGNvZGFfZmlsZSk7CisJQlVHX09OKCFjZmkgfHwgY2ZpLT5jZmlfbWFnaWMgIT0gQ09EQV9NQUdJQyk7CisKKwlpZiAodXNlX2NvZGFfY2xvc2UpCisJCWVyciA9IHZlbnVzX2Nsb3NlKGNvZGFfaW5vZGUtPmlfc2IsIGNvZGFfaTJmKGNvZGFfaW5vZGUpLAorCQkJCSAgY29kYV9mbGFncywgY29kYV9maWxlLT5mX3VpZCk7CisKKwlob3N0X2lub2RlID0gY2ZpLT5jZmlfY29udGFpbmVyLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwljaWkgPSBJVE9DKGNvZGFfaW5vZGUpOworCisJLyogZGlkIHdlIG1tYXAgdGhpcyBmaWxlPyAqLworCWlmIChjb2RhX2lub2RlLT5pX21hcHBpbmcgPT0gJmhvc3RfaW5vZGUtPmlfZGF0YSkgeworCQljaWktPmNfbWFwY291bnQgLT0gY2ZpLT5jZmlfbWFwY291bnQ7CisJCWlmICghY2lpLT5jX21hcGNvdW50KQorCQkJY29kYV9pbm9kZS0+aV9tYXBwaW5nID0gJmNvZGFfaW5vZGUtPmlfZGF0YTsKKwl9CisKKwlmcHV0KGNmaS0+Y2ZpX2NvbnRhaW5lcik7CisJa2ZyZWUoY29kYV9maWxlLT5wcml2YXRlX2RhdGEpOworCWNvZGFfZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgY29kYV9mc3luYyhzdHJ1Y3QgZmlsZSAqY29kYV9maWxlLCBzdHJ1Y3QgZGVudHJ5ICpjb2RhX2RlbnRyeSwgaW50IGRhdGFzeW5jKQoreworCXN0cnVjdCBmaWxlICpob3N0X2ZpbGU7CisJc3RydWN0IGRlbnRyeSAqaG9zdF9kZW50cnk7CisJc3RydWN0IGlub2RlICpob3N0X2lub2RlLCAqY29kYV9pbm9kZSA9IGNvZGFfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBjb2RhX2ZpbGVfaW5mbyAqY2ZpOworCWludCBlcnIgPSAwOworCisJaWYgKCEoU19JU1JFRyhjb2RhX2lub2RlLT5pX21vZGUpIHx8IFNfSVNESVIoY29kYV9pbm9kZS0+aV9tb2RlKSB8fAorCSAgICAgIFNfSVNMTksoY29kYV9pbm9kZS0+aV9tb2RlKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJY2ZpID0gQ09EQV9GVE9DKGNvZGFfZmlsZSk7CisJQlVHX09OKCFjZmkgfHwgY2ZpLT5jZmlfbWFnaWMgIT0gQ09EQV9NQUdJQyk7CisJaG9zdF9maWxlID0gY2ZpLT5jZmlfY29udGFpbmVyOworCisJY29kYV92ZnNfc3RhdC5mc3luYysrOworCisJaWYgKGhvc3RfZmlsZS0+Zl9vcCAmJiBob3N0X2ZpbGUtPmZfb3AtPmZzeW5jKSB7CisJCWhvc3RfZGVudHJ5ID0gaG9zdF9maWxlLT5mX2RlbnRyeTsKKwkJaG9zdF9pbm9kZSA9IGhvc3RfZGVudHJ5LT5kX2lub2RlOworCQlkb3duKCZob3N0X2lub2RlLT5pX3NlbSk7CisJCWVyciA9IGhvc3RfZmlsZS0+Zl9vcC0+ZnN5bmMoaG9zdF9maWxlLCBob3N0X2RlbnRyeSwgZGF0YXN5bmMpOworCQl1cCgmaG9zdF9pbm9kZS0+aV9zZW0pOworCX0KKworCWlmICggIWVyciAmJiAhZGF0YXN5bmMgKSB7CisJCWxvY2tfa2VybmVsKCk7CisJCWVyciA9IHZlbnVzX2ZzeW5jKGNvZGFfaW5vZGUtPmlfc2IsIGNvZGFfaTJmKGNvZGFfaW5vZGUpKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgY29kYV9maWxlX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGNvZGFfZmlsZV9yZWFkLAorCS53cml0ZQkJPSBjb2RhX2ZpbGVfd3JpdGUsCisJLm1tYXAJCT0gY29kYV9maWxlX21tYXAsCisJLm9wZW4JCT0gY29kYV9vcGVuLAorCS5mbHVzaAkJPSBjb2RhX2ZsdXNoLAorCS5yZWxlYXNlCT0gY29kYV9yZWxlYXNlLAorCS5mc3luYwkJPSBjb2RhX2ZzeW5jLAorCS5zZW5kZmlsZQk9IGNvZGFfZmlsZV9zZW5kZmlsZSwKK307CisKZGlmZiAtLWdpdCBhL2ZzL2NvZGEvaW5vZGUuYyBiL2ZzL2NvZGEvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGE3M2ZiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY29kYS9pbm9kZS5jCkBAIC0wLDAgKzEsMzIxIEBACisvKgorICogU3VwZXIgYmxvY2svZmlsZXN5c3RlbSB3aWRlIG9wZXJhdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgUGV0ZXIgSi4gQnJhYW0gPGJyYWFtQG1hdGhzLm94LmFjLnVrPiBhbmQgCisgKiBNaWNoYWVsIENhbGxhaGFuIDxjYWxsYWhhbkBtYXRocy5veC5hYy51az4gCisgKiAKKyAqIFJld3JpdHRlbiBmb3IgTGludXggMi4xLiAgUGV0ZXIgQnJhYW0gPGJyYWFtQGNzLmNtdS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSA8bGludXgvY29kYS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfbGludXguaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX3BzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9mc19pLmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9jYWNoZS5oPgorCisvKiBWRlMgc3VwZXJfYmxvY2sgb3BzICovCitzdGF0aWMgdm9pZCBjb2RhX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK3N0YXRpYyB2b2lkIGNvZGFfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK3N0YXRpYyBpbnQgY29kYV9zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1Zik7CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKiBjb2RhX2lub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqY29kYV9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBjb2RhX2lub2RlX2luZm8gKmVpOworCWVpID0gKHN0cnVjdCBjb2RhX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKGNvZGFfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KCZlaS0+Y19maWQsIDAsIHNpemVvZihzdHJ1Y3QgQ29kYUZpZCkpOworCWVpLT5jX2ZsYWdzID0gMDsKKwllaS0+Y191aWQgPSAwOworCWVpLT5jX2NhY2hlZF9wZXJtID0gMDsKKwlyZXR1cm4gJmVpLT52ZnNfaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGNvZGFfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShjb2RhX2lub2RlX2NhY2hlcCwgSVRPQyhpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBjb2RhX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBjb2RhX2lub2RlX2luZm8gKikgZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikKKwkJaW5vZGVfaW5pdF9vbmNlKCZlaS0+dmZzX2lub2RlKTsKK30KKyAKK2ludCBjb2RhX2luaXRfaW5vZGVjYWNoZSh2b2lkKQoreworCWNvZGFfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImNvZGFfaW5vZGVfY2FjaGUiLAorCQkJCXNpemVvZihzdHJ1Y3QgY29kYV9pbm9kZV9pbmZvKSwKKwkJCQkwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQlpbml0X29uY2UsIE5VTEwpOworCWlmIChjb2RhX2lub2RlX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjb2RhX2Rlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQoreworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koY29kYV9pbm9kZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9JTkZPICJjb2RhX2lub2RlX2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7Cit9CisKK3N0YXRpYyBpbnQgY29kYV9yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJKmZsYWdzIHw9IE1TX05PRElSQVRJTUU7CisJcmV0dXJuIDA7Cit9CisKKy8qIGV4cG9ydGVkIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBjb2RhX3N1cGVyX29wZXJhdGlvbnMgPQoreworCS5hbGxvY19pbm9kZQk9IGNvZGFfYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSBjb2RhX2Rlc3Ryb3lfaW5vZGUsCisJLmNsZWFyX2lub2RlCT0gY29kYV9jbGVhcl9pbm9kZSwKKwkucHV0X3N1cGVyCT0gY29kYV9wdXRfc3VwZXIsCisJLnN0YXRmcwkJPSBjb2RhX3N0YXRmcywKKwkucmVtb3VudF9mcwk9IGNvZGFfcmVtb3VudCwKK307CisKK3N0YXRpYyBpbnQgZ2V0X2RldmljZV9pbmRleChzdHJ1Y3QgY29kYV9tb3VudF9kYXRhICpkYXRhKQoreworCXN0cnVjdCBmaWxlICpmaWxlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGlkeDsKKworCWlmKGRhdGEgPT0gTlVMTCkgeworCQlwcmludGsoImNvZGFfcmVhZF9zdXBlcjogQmFkIG1vdW50IGRhdGFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYoZGF0YS0+dmVyc2lvbiAhPSBDT0RBX01PVU5UX1ZFUlNJT04pIHsKKwkJcHJpbnRrKCJjb2RhX3JlYWRfc3VwZXI6IEJhZCBtb3VudCB2ZXJzaW9uXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZpbGUgPSBmZ2V0KGRhdGEtPmZkKTsKKwlpbm9kZSA9IE5VTEw7CisJaWYoZmlsZSkKKwkJaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwkKKwlpZighaW5vZGUgfHwgIVNfSVNDSFIoaW5vZGUtPmlfbW9kZSkgfHwKKwkgICBpbWFqb3IoaW5vZGUpICE9IENPREFfUFNERVZfTUFKT1IpIHsKKwkJaWYoZmlsZSkKKwkJCWZwdXQoZmlsZSk7CisKKwkJcHJpbnRrKCJjb2RhX3JlYWRfc3VwZXI6IEJhZCBmaWxlXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlkeCA9IGltaW5vcihpbm9kZSk7CisJZnB1dChmaWxlKTsKKworCWlmKGlkeCA8IDAgfHwgaWR4ID49IE1BWF9DT0RBREVWUykgeworCQlwcmludGsoImNvZGFfcmVhZF9zdXBlcjogQmFkIG1pbm9yIG51bWJlclxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gaWR4OworfQorCitzdGF0aWMgaW50IGNvZGFfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworICAgICAgICBzdHJ1Y3QgaW5vZGUgKnJvb3QgPSBOVUxMOyAKKwlzdHJ1Y3QgY29kYV9zYl9pbmZvICpzYmkgPSBOVUxMOworCXN0cnVjdCB2ZW51c19jb21tICp2YyA9IE5VTEw7CisJc3RydWN0IENvZGFGaWQgZmlkOworICAgICAgICBpbnQgZXJyb3I7CisJaW50IGlkeDsKKworCWlkeCA9IGdldF9kZXZpY2VfaW5kZXgoKHN0cnVjdCBjb2RhX21vdW50X2RhdGEgKikgZGF0YSk7CisKKwkvKiBJZ25vcmUgZXJyb3JzIGluIGRhdGEsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisJaWYoaWR4ID09IC0xKQorCQlpZHggPSAwOworCQorCXByaW50ayhLRVJOX0lORk8gImNvZGFfcmVhZF9zdXBlcjogZGV2aWNlIGluZGV4OiAlaVxuIiwgaWR4KTsKKworCXZjID0gJmNvZGFfY29tbXNbaWR4XTsKKwlpZiAoIXZjLT52Y19pbnVzZSkgeworCQlwcmludGsoImNvZGFfcmVhZF9zdXBlcjogTm8gcHNldWRvIGRldmljZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworICAgICAgICBpZiAoIHZjLT52Y19zYiApIHsKKwkJcHJpbnRrKCJjb2RhX3JlYWRfc3VwZXI6IERldmljZSBhbHJlYWR5IG1vdW50ZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb2RhX3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZighc2JpKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXZjLT52Y19zYiA9IHNiOworCisJc2JpLT5zYmlfdmNvbW0gPSB2YzsKKworICAgICAgICBzYi0+c19mc19pbmZvID0gc2JpOworCXNiLT5zX2ZsYWdzIHw9IE1TX05PRElSQVRJTUU7IC8qIHByb2JhYmx5IGV2ZW4gbm9hdGltZSAqLworICAgICAgICBzYi0+c19ibG9ja3NpemUgPSAxMDI0OwkvKiBYWFhYWCAgd2hhdCBkbyB3ZSBwdXQgaGVyZT8/ICovCisgICAgICAgIHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gMTA7CisgICAgICAgIHNiLT5zX21hZ2ljID0gQ09EQV9TVVBFUl9NQUdJQzsKKyAgICAgICAgc2ItPnNfb3AgPSAmY29kYV9zdXBlcl9vcGVyYXRpb25zOworCisJLyogZ2V0IHJvb3QgZmlkIGZyb20gVmVudXM6IHRoaXMgbmVlZHMgdGhlIHJvb3QgaW5vZGUgKi8KKwllcnJvciA9IHZlbnVzX3Jvb3RmaWQoc2IsICZmaWQpOworCWlmICggZXJyb3IgKSB7CisJICAgICAgICBwcmludGsoImNvZGFfcmVhZF9zdXBlcjogY29kYV9nZXRfcm9vdGZpZCBmYWlsZWQgd2l0aCAlZFxuIiwKKwkJICAgICAgIGVycm9yKTsKKwkJZ290byBlcnJvcjsKKwl9CisJcHJpbnRrKCJjb2RhX3JlYWRfc3VwZXI6IHJvb3RmaWQgaXMgJXNcbiIsIGNvZGFfZjJzKCZmaWQpKTsKKwkKKwkvKiBtYWtlIHJvb3QgaW5vZGUgKi8KKyAgICAgICAgZXJyb3IgPSBjb2RhX2Nub2RlX21ha2UoJnJvb3QsICZmaWQsIHNiKTsKKyAgICAgICAgaWYgKCBlcnJvciB8fCAhcm9vdCApIHsKKwkgICAgcHJpbnRrKCJGYWlsdXJlIG9mIGNvZGFfY25vZGVfbWFrZSBmb3Igcm9vdDogZXJyb3IgJWRcbiIsIGVycm9yKTsKKwkgICAgZ290byBlcnJvcjsKKwl9IAorCisJcHJpbnRrKCJjb2RhX3JlYWRfc3VwZXI6IHJvb3Rpbm9kZSBpcyAlbGQgZGV2ICVzXG4iLCAKKwkgICAgICAgcm9vdC0+aV9pbm8sIHJvb3QtPmlfc2ItPnNfaWQpOworCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CisJaWYgKCFzYi0+c19yb290KQorCQlnb3RvIGVycm9yOworICAgICAgICByZXR1cm4gMDsKKworIGVycm9yOgorCWlmIChzYmkpIHsKKwkJa2ZyZWUoc2JpKTsKKwkJaWYodmMpCisJCQl2Yy0+dmNfc2IgPSBOVUxMOwkJCisJfQorCWlmIChyb290KQorICAgICAgICAgICAgICAgIGlwdXQocm9vdCk7CisKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIGNvZGFfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisgICAgICAgIHN0cnVjdCBjb2RhX3NiX2luZm8gKnNiaTsKKworCXNiaSA9IGNvZGFfc2JwKHNiKTsKKwlzYmktPnNiaV92Y29tbS0+dmNfc2IgPSBOVUxMOworCisJcHJpbnRrKCJDb2RhOiBCeWUgYnllLlxuIik7CisJa2ZyZWUoc2JpKTsKK30KKworc3RhdGljIHZvaWQgY29kYV9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWNvZGFfY2FjaGVfY2xlYXJfaW5vZGUoaW5vZGUpOworfQorCitpbnQgY29kYV9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdCAqc3RhdCkKK3sKKwlpbnQgZXJyID0gY29kYV9yZXZhbGlkYXRlX2lub2RlKGRlbnRyeSk7CisJaWYgKCFlcnIpCisJCWdlbmVyaWNfZmlsbGF0dHIoZGVudHJ5LT5kX2lub2RlLCBzdGF0KTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgY29kYV9zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlLCBzdHJ1Y3QgaWF0dHIgKmlhdHRyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgY29kYV92YXR0ciB2YXR0cjsKKwlpbnQgZXJyb3I7CisKKwlsb2NrX2tlcm5lbCgpOworCQorCW1lbXNldCgmdmF0dHIsIDAsIHNpemVvZih2YXR0cikpOyAKKworCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwljb2RhX2lhdHRyX3RvX3ZhdHRyKGlhdHRyLCAmdmF0dHIpOworCXZhdHRyLnZhX3R5cGUgPSBDX1ZOT047IC8qIGNhbm5vdCBzZXQgdHlwZSAqLworCisJLyogVmVudXMgaXMgcmVzcG9uc2libGUgZm9yIHRydW5jYXRpbmcgdGhlIGNvbnRhaW5lci1maWxlISEhICovCisJZXJyb3IgPSB2ZW51c19zZXRhdHRyKGlub2RlLT5pX3NiLCBjb2RhX2kyZihpbm9kZSksICZ2YXR0cik7CisKKwlpZiAoICFlcnJvciApIHsKKwkgICAgICAgIGNvZGFfdmF0dHJfdG9faWF0dHIoaW5vZGUsICZ2YXR0cik7IAorCQljb2RhX2NhY2hlX2NsZWFyX2lub2RlKGlub2RlKTsKKwl9CisKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGNvZGFfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0geworCS5wZXJtaXNzaW9uCT0gY29kYV9wZXJtaXNzaW9uLAorCS5nZXRhdHRyCT0gY29kYV9nZXRhdHRyLAorCS5zZXRhdHRyCT0gY29kYV9zZXRhdHRyLAorfTsKKworc3RhdGljIGludCBjb2RhX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCWludCBlcnJvcjsKKwkKKwlsb2NrX2tlcm5lbCgpOworCisJZXJyb3IgPSB2ZW51c19zdGF0ZnMoc2IsIGJ1Zik7CisKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlpZiAoZXJyb3IpIHsKKwkJLyogZmFrZSBzb21ldGhpbmcgbGlrZSBBRlMgZG9lcyAqLworCQlidWYtPmZfYmxvY2tzID0gOTAwMDAwMDsKKwkJYnVmLT5mX2JmcmVlICA9IDkwMDAwMDA7CisJCWJ1Zi0+Zl9iYXZhaWwgPSA5MDAwMDAwOworCQlidWYtPmZfZmlsZXMgID0gOTAwMDAwMDsKKwkJYnVmLT5mX2ZmcmVlICA9IDkwMDAwMDA7CisJfQorCisJLyogYW5kIGZpbGwgaW4gdGhlIHJlc3QgKi8KKwlidWYtPmZfdHlwZSA9IENPREFfU1VQRVJfTUFHSUM7CisJYnVmLT5mX2JzaXplID0gMTAyNDsKKwlidWYtPmZfbmFtZWxlbiA9IENPREFfTUFYTkFNTEVOOworCisJcmV0dXJuIDA7IAorfQorCisvKiBpbml0X2NvZGE6IHVzZWQgYnkgZmlsZXN5c3RlbXMuYyB0byByZWdpc3RlciBjb2RhICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmNvZGFfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgZGF0YSwgY29kYV9maWxsX3N1cGVyKTsKK30KKworc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgY29kYV9mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiY29kYSIsCisJLmdldF9zYgkJPSBjb2RhX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYW5vbl9zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19CSU5BUllfTU9VTlREQVRBLAorfTsKKwpkaWZmIC0tZ2l0IGEvZnMvY29kYS9waW9jdGwuYyBiL2ZzL2NvZGEvcGlvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3NzE0OQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NvZGEvcGlvY3RsLmMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIFBpb2N0bCBvcGVyYXRpb25zIGZvciBDb2RhLgorICogT3JpZ2luYWwgdmVyc2lvbjogKEMpIDE5OTYgUGV0ZXIgQnJhYW0gCisgKiBSZXdyaXR0ZW4gZm9yIExpbnV4IDIuMTogKEMpIDE5OTcgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKKyAqCisgKiBDYXJuZWdpZSBNZWxsb24gZW5jb3VyYWdlcyB1c2VycyBvZiB0aGlzIGNvZGUgdG8gY29udHJpYnV0ZSBpbXByb3ZlbWVudHMKKyAqIHRvIHRoZSBDb2RhIHByb2plY3QuIENvbnRhY3QgUGV0ZXIgQnJhYW0gPGNvZGFAY3MuY211LmVkdT4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvY29kYS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfbGludXguaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2ZzX2kuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX3BzZGV2Lmg+CisKKy8qIHBpb2N0bCBvcHMgKi8KK3N0YXRpYyBpbnQgY29kYV9pb2N0bF9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLAorCQkJCSBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CitzdGF0aWMgaW50IGNvZGFfcGlvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsIAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIHVzZXJfZGF0YSk7CisKKy8qIGV4cG9ydGVkIGZyb20gdGhpcyBmaWxlICovCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBjb2RhX2lvY3RsX2lub2RlX29wZXJhdGlvbnMgPQoreworCS5wZXJtaXNzaW9uCT0gY29kYV9pb2N0bF9wZXJtaXNzaW9uLAorCS5zZXRhdHRyCT0gY29kYV9zZXRhdHRyLAorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjb2RhX2lvY3RsX29wZXJhdGlvbnMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pb2N0bAkJPSBjb2RhX3Bpb2N0bCwKK307CisKKy8qIHRoZSBjb2RhIHBpb2N0bCBpbm9kZSBvcHMgKi8KK3N0YXRpYyBpbnQgY29kYV9pb2N0bF9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLAorCQkJCSBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29kYV9waW9jdGwoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCwgCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgdXNlcl9kYXRhKQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisgICAgICAgIGludCBlcnJvcjsKKwlzdHJ1Y3QgUGlvY3RsRGF0YSBkYXRhOworICAgICAgICBzdHJ1Y3QgaW5vZGUgKnRhcmdldF9pbm9kZSA9IE5VTEw7CisgICAgICAgIHN0cnVjdCBjb2RhX2lub2RlX2luZm8gKmNucDsKKworICAgICAgICAvKiBnZXQgdGhlIFBpb2N0bCBkYXRhIGFyZ3VtZW50cyBmcm9tIHVzZXIgc3BhY2UgKi8KKyAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCAodm9pZCBfX3VzZXIgKil1c2VyX2RhdGEsIHNpemVvZihkYXRhKSkpIHsKKwkgICAgcmV0dXJuIC1FSU5WQUw7CisJfQorICAgICAgIAorICAgICAgICAvKiAKKyAgICAgICAgICogTG9vayB1cCB0aGUgcGF0aG5hbWUuIE5vdGUgdGhhdCB0aGUgcGF0aG5hbWUgaXMgaW4gCisgICAgICAgICAqIHVzZXIgbWVtb3J5LCBhbmQgbmFtZWkgdGFrZXMgY2FyZSBvZiB0aGlzCisgICAgICAgICAqLworICAgICAgICBpZiAoIGRhdGEuZm9sbG93ICkgeworICAgICAgICAgICAgICAgIGVycm9yID0gdXNlcl9wYXRoX3dhbGsoZGF0YS5wYXRoLCAmbmQpOworCX0gZWxzZSB7CisJICAgICAgICBlcnJvciA9IHVzZXJfcGF0aF93YWxrX2xpbmsoZGF0YS5wYXRoLCAmbmQpOworCX0KKwkJCisJaWYgKCBlcnJvciApIHsKKwkJcmV0dXJuIGVycm9yOworICAgICAgICB9IGVsc2UgeworCSAgICAgICAgdGFyZ2V0X2lub2RlID0gbmQuZGVudHJ5LT5kX2lub2RlOworCX0KKwkKKwkvKiByZXR1cm4gaWYgaXQgaXMgbm90IGEgQ29kYSBpbm9kZSAqLworCWlmICggdGFyZ2V0X2lub2RlLT5pX3NiICE9IGlub2RlLT5pX3NiICkgeworCQlwYXRoX3JlbGVhc2UoJm5kKTsKKwkgICAgICAgIHJldHVybiAgLUVJTlZBTDsKKwl9CisKKwkvKiBub3cgcHJvY2VlZCB0byBtYWtlIHRoZSB1cGNhbGwgKi8KKyAgICAgICAgY25wID0gSVRPQyh0YXJnZXRfaW5vZGUpOworCisJZXJyb3IgPSB2ZW51c19waW9jdGwoaW5vZGUtPmlfc2IsICYoY25wLT5jX2ZpZCksIGNtZCwgJmRhdGEpOworCisJcGF0aF9yZWxlYXNlKCZuZCk7CisgICAgICAgIHJldHVybiBlcnJvcjsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvY29kYS9wc2Rldi5jIGIvZnMvY29kYS9wc2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMDAxYTkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jb2RhL3BzZGV2LmMKQEAgLTAsMCArMSw0NjIgQEAKKy8qCisgKiAgICAgIAlBbiBpbXBsZW1lbnRhdGlvbiBvZiBhIGxvYWRhYmxlIGtlcm5lbCBtb2RlIGRyaXZlciBwcm92aWRpbmcKKyAqCQltdWx0aXBsZSBrZXJuZWwvdXNlciBzcGFjZSBiaWRpcmVjdGlvbmFsIGNvbW11bmljYXRpb25zIGxpbmtzLgorICoKKyAqIAkJQXV0aG9yOiAJQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICAgICAgICAgICAgIEFkYXB0ZWQgdG8gYmVjb21lIHRoZSBMaW51eCAyLjAgQ29kYSBwc2V1ZG8gZGV2aWNlCisgKiAgICAgICAgICAgICAgUGV0ZXIgIEJyYWFtICA8YnJhYW1AbWF0aHMub3guYWMudWs+IAorICogICAgICAgICAgICAgIE1pY2hhZWwgQ2FsbGFoYW4gPG1qY0BlbW15LnNtaXRoLmVkdT4gICAgICAgICAgIAorICoKKyAqICAgICAgICAgICAgICBDaGFuZ2VzIGZvciBMaW51eCAyLjEKKyAqICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTcgQ2FybmVnaWUtTWVsbG9uIFVuaXZlcnNpdHkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3BvbGwuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvY29kYS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfbGludXguaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2ZzX2kuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX3BzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9wcm9jLmg+CisKKyNkZWZpbmUgdXBjX2ZyZWUocikga2ZyZWUocikKKworLyogCisgKiBDb2RhIHN0dWZmCisgKi8KK2V4dGVybiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBjb2RhX2ZzX3R5cGU7CisKKy8qIHN0YXRpc3RpY3MgKi8KK2ludCAgICAgICAgICAgY29kYV9oYXJkOyAgICAgICAgIC8qIGFsbG93cyBzaWduYWxzIGR1cmluZyB1cGNhbGxzICovCit1bnNpZ25lZCBsb25nIGNvZGFfdGltZW91dCA9IDMwOyAvKiAuLiBzZWNzLCB0aGVuIHNpZ25hbHMgd2lsbCBkZXF1ZXVlICovCisKKworc3RydWN0IHZlbnVzX2NvbW0gY29kYV9jb21tc1tNQVhfQ09EQURFVlNdOworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKmNvZGFfcHNkZXZfY2xhc3M7CisKKy8qCisgKiBEZXZpY2Ugb3BlcmF0aW9ucworICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29kYV9wc2Rldl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICogd2FpdCkKK3sKKyAgICAgICAgc3RydWN0IHZlbnVzX2NvbW0gKnZjcCA9IChzdHJ1Y3QgdmVudXNfY29tbSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IG1hc2sgPSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKworCXBvbGxfd2FpdChmaWxlLCAmdmNwLT52Y193YWl0cSwgd2FpdCk7CisJaWYgKCFsaXN0X2VtcHR5KCZ2Y3AtPnZjX3BlbmRpbmcpKQorICAgICAgICAgICAgICAgIG1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IGNvZGFfcHNkZXZfaW9jdGwoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCwgCisJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgaW50IGRhdGE7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBDSU9DX0tFUk5FTF9WRVJTSU9OOgorCQlkYXRhID0gQ09EQV9LRVJORUxfVkVSU0lPTjsKKwkJcmV0dXJuIHB1dF91c2VyKGRhdGEsIChpbnQgX191c2VyICopIGFyZyk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglSZWNlaXZlIGEgbWVzc2FnZSB3cml0dGVuIGJ5IFZlbnVzIHRvIHRoZSBwc2RldgorICovCisgCitzdGF0aWMgc3NpemVfdCBjb2RhX3BzZGV2X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCAKKwkJCQlzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKm9mZikKK3sKKyAgICAgICAgc3RydWN0IHZlbnVzX2NvbW0gKnZjcCA9IChzdHJ1Y3QgdmVudXNfY29tbSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgIHN0cnVjdCB1cGNfcmVxICpyZXEgPSBOVUxMOworICAgICAgICBzdHJ1Y3QgdXBjX3JlcSAqdG1wOworCXN0cnVjdCBsaXN0X2hlYWQgKmxoOworCXN0cnVjdCBjb2RhX2luX2hkciBoZHI7CisJc3NpemVfdCByZXR2YWwgPSAwLCBjb3VudCA9IDA7CisJaW50IGVycm9yOworCisgICAgICAgIC8qIFBlZWsgYXQgdGhlIG9wY29kZSwgdW5pcXVlZmllciAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmaGRyLCBidWYsIDIgKiBzaXplb2YodV9sb25nKSkpCisJICAgICAgICByZXR1cm4gLUVGQVVMVDsKKworICAgICAgICBpZiAoRE9XTkNBTEwoaGRyLm9wY29kZSkpIHsKKwkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IE5VTEw7CisgICAgICAgICAgICAgICAgdW5pb24gb3V0cHV0QXJncyAqZGNidWY7CisJCWludCBzaXplID0gc2l6ZW9mKCpkY2J1Zik7CisKKwkJc2IgPSB2Y3AtPnZjX3NiOworCQlpZiAoICFzYiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gbmJ5dGVzOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisJCX0KKworCQlpZiAgKCBuYnl0ZXMgPCBzaXplb2Yoc3RydWN0IGNvZGFfb3V0X2hkcikgKSB7CisJCSAgICAgICAgcHJpbnRrKCJjb2RhX2Rvd25jYWxsIG9wYyAlZCB1bmlxICVkLCBub3QgZW5vdWdoIVxuIiwKKwkJCSAgICAgICBoZHIub3Bjb2RlLCBoZHIudW5pcXVlKTsKKwkJCWNvdW50ID0gbmJ5dGVzOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKCBuYnl0ZXMgPiBzaXplICkgeworCQkgICAgICAgIHByaW50aygiQ29kYTogZG93bmNhbGwgb3BjICVkLCB1bmlxICVkLCB0b28gbXVjaCEiLAorCQkJICAgICAgIGhkci5vcGNvZGUsIGhkci51bmlxdWUpOworCQkgICAgICAgIG5ieXRlcyA9IHNpemU7CisJCX0KKwkJQ09EQV9BTExPQyhkY2J1ZiwgdW5pb24gb3V0cHV0QXJncyAqLCBuYnl0ZXMpOworCQlpZiAoY29weV9mcm9tX3VzZXIoZGNidWYsIGJ1ZiwgbmJ5dGVzKSkgeworCQkJQ09EQV9GUkVFKGRjYnVmLCBuYnl0ZXMpOworCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogd2hhdCBkb3duY2FsbCBlcnJvcnMgZG9lcyBWZW51cyBoYW5kbGUgPyAqLworCQlsb2NrX2tlcm5lbCgpOworCQllcnJvciA9IGNvZGFfZG93bmNhbGwoaGRyLm9wY29kZSwgZGNidWYsIHNiKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCisJCUNPREFfRlJFRShkY2J1ZiwgbmJ5dGVzKTsKKwkJaWYgKGVycm9yKSB7CisJCSAgICAgICAgcHJpbnRrKCJwc2Rldl93cml0ZTogY29kYV9kb3duY2FsbCBlcnJvcjogJWRcbiIsIGVycm9yKTsKKwkJCXJldHZhbCA9IGVycm9yOworCQkJZ290byBvdXQ7CisJCX0KKwkJY291bnQgPSBuYnl0ZXM7CisJCWdvdG8gb3V0OworCX0KKyAgICAgICAgCisJLyogTG9vayBmb3IgdGhlIG1lc3NhZ2Ugb24gdGhlIHByb2Nlc3NpbmcgcXVldWUuICovCisJbG9ja19rZXJuZWwoKTsKKwlsaXN0X2Zvcl9lYWNoKGxoLCAmdmNwLT52Y19wcm9jZXNzaW5nKSB7CisJCXRtcCA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCB1cGNfcmVxICwgdWNfY2hhaW4pOworCQlpZiAodG1wLT51Y191bmlxdWUgPT0gaGRyLnVuaXF1ZSkgeworCQkJcmVxID0gdG1wOworCQkJbGlzdF9kZWwoJnJlcS0+dWNfY2hhaW4pOworCQkJYnJlYWs7CisJCX0KKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCisJaWYgKCFyZXEpIHsKKwkJcHJpbnRrKCJwc2Rldl93cml0ZTogbXNnICglZCwgJWQpIG5vdCBmb3VuZFxuIiwgCisJCQloZHIub3Bjb2RlLCBoZHIudW5pcXVlKTsKKwkJcmV0dmFsID0gLUVTUkNIOworCQlnb3RvIG91dDsKKwl9CisKKyAgICAgICAgLyogbW92ZSBkYXRhIGludG8gcmVzcG9uc2UgYnVmZmVyLiAqLworCWlmIChyZXEtPnVjX291dFNpemUgPCBuYnl0ZXMpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoInBzZGV2X3dyaXRlOiB0b28gbXVjaCBjbnQ6ICVkLCBjbnQ6ICVsZCwgb3BjOiAlZCwgdW5pcTogJWQuXG4iLAorCQkgICAgICAgcmVxLT51Y19vdXRTaXplLCAobG9uZyluYnl0ZXMsIGhkci5vcGNvZGUsIGhkci51bmlxdWUpOworCQluYnl0ZXMgPSByZXEtPnVjX291dFNpemU7IC8qIGRvbid0IGhhdmUgbW9yZSBzcGFjZSEgKi8KKwl9CisgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcihyZXEtPnVjX2RhdGEsIGJ1ZiwgbmJ5dGVzKSkgeworCQlyZXEtPnVjX2ZsYWdzIHw9IFJFUV9BQk9SVDsKKwkJd2FrZV91cCgmcmVxLT51Y19zbGVlcCk7CisJCXJldHZhbCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGFkanVzdCBvdXRzaXplLiBpcyB0aGlzIHVzZWZ1bCA/PyAqLworICAgICAgICByZXEtPnVjX291dFNpemUgPSBuYnl0ZXM7CQorICAgICAgICByZXEtPnVjX2ZsYWdzIHw9IFJFUV9XUklURTsKKwljb3VudCA9IG5ieXRlczsKKworCS8qIENvbnZlcnQgZmlsZWRlc2NyaXB0b3IgaW50byBhIGZpbGUgaGFuZGxlICovCisJaWYgKHJlcS0+dWNfb3Bjb2RlID09IENPREFfT1BFTl9CWV9GRCkgeworCQlzdHJ1Y3QgY29kYV9vcGVuX2J5X2ZkX291dCAqb3V0cCA9CisJCQkoc3RydWN0IGNvZGFfb3Blbl9ieV9mZF9vdXQgKilyZXEtPnVjX2RhdGE7CisJCW91dHAtPmZoID0gZmdldChvdXRwLT5mZCk7CisJfQorCisgICAgICAgIHdha2VfdXAoJnJlcS0+dWNfc2xlZXApOworb3V0OgorICAgICAgICByZXR1cm4oY291bnQgPyBjb3VudCA6IHJldHZhbCk7ICAKK30KKworLyoKKyAqCVJlYWQgYSBtZXNzYWdlIGZyb20gdGhlIGtlcm5lbCB0byBWZW51cworICovCisKK3N0YXRpYyBzc2l6ZV90IGNvZGFfcHNkZXZfcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLCAKKwkJCSAgICAgICBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKm9mZikKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKyAgICAgICAgc3RydWN0IHZlbnVzX2NvbW0gKnZjcCA9IChzdHJ1Y3QgdmVudXNfY29tbSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgIHN0cnVjdCB1cGNfcmVxICpyZXE7CisJc3NpemVfdCByZXR2YWwgPSAwLCBjb3VudCA9IDA7CisKKwlpZiAobmJ5dGVzID09IDApCisJCXJldHVybiAwOworCisJbG9ja19rZXJuZWwoKTsKKworCWFkZF93YWl0X3F1ZXVlKCZ2Y3AtPnZjX3dhaXRxLCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCXdoaWxlIChsaXN0X2VtcHR5KCZ2Y3AtPnZjX3BlbmRpbmcpKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJc2NoZWR1bGUoKTsKKwl9CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZ2Y3AtPnZjX3dhaXRxLCAmd2FpdCk7CisKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKworCXJlcSA9IGxpc3RfZW50cnkodmNwLT52Y19wZW5kaW5nLm5leHQsIHN0cnVjdCB1cGNfcmVxLHVjX2NoYWluKTsKKwlsaXN0X2RlbCgmcmVxLT51Y19jaGFpbik7CisKKwkvKiBNb3ZlIHRoZSBpbnB1dCBhcmdzIGludG8gdXNlcnNwYWNlICovCisJY291bnQgPSByZXEtPnVjX2luU2l6ZTsKKwlpZiAobmJ5dGVzIDwgcmVxLT51Y19pblNpemUpIHsKKyAgICAgICAgICAgICAgICBwcmludGsgKCJwc2Rldl9yZWFkOiBWZW51cyByZWFkICVsZCBieXRlcyBvZiAlZCBpbiBtZXNzYWdlXG4iLAorCQkJKGxvbmcpbmJ5dGVzLCByZXEtPnVjX2luU2l6ZSk7CisJCWNvdW50ID0gbmJ5dGVzOworICAgICAgICB9CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgcmVxLT51Y19kYXRhLCBjb3VudCkpCisJICAgICAgICByZXR2YWwgPSAtRUZBVUxUOworICAgICAgICAKKwkvKiBJZiByZXF1ZXN0IHdhcyBub3QgYSBzaWduYWwsIGVucXVldWUgYW5kIGRvbid0IGZyZWUgKi8KKwlpZiAoIShyZXEtPnVjX2ZsYWdzICYgUkVRX0FTWU5DKSkgeworCQlyZXEtPnVjX2ZsYWdzIHw9IFJFUV9SRUFEOworCQlsaXN0X2FkZCgmKHJlcS0+dWNfY2hhaW4pLCB2Y3AtPnZjX3Byb2Nlc3NpbmcucHJldik7CisJCWdvdG8gb3V0OworCX0KKworCUNPREFfRlJFRShyZXEtPnVjX2RhdGEsIHNpemVvZihzdHJ1Y3QgY29kYV9pbl9oZHIpKTsKKwl1cGNfZnJlZShyZXEpOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gKGNvdW50ID8gY291bnQgOiByZXR2YWwpOworfQorCitzdGF0aWMgaW50IGNvZGFfcHNkZXZfb3BlbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworICAgICAgICBzdHJ1Y3QgdmVudXNfY29tbSAqdmNwOworCWludCBpZHg7CisKKwlsb2NrX2tlcm5lbCgpOworCWlkeCA9IGltaW5vcihpbm9kZSk7CisJaWYoaWR4ID49IE1BWF9DT0RBREVWUykgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXZjcCA9ICZjb2RhX2NvbW1zW2lkeF07CisJaWYodmNwLT52Y19pbnVzZSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCQorCWlmICghdmNwLT52Y19pbnVzZSsrKSB7CisJCUlOSVRfTElTVF9IRUFEKCZ2Y3AtPnZjX3BlbmRpbmcpOworCQlJTklUX0xJU1RfSEVBRCgmdmNwLT52Y19wcm9jZXNzaW5nKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmdmNwLT52Y193YWl0cSk7CisJCXZjcC0+dmNfc2IgPSBOVUxMOworCQl2Y3AtPnZjX3NlcSA9IDA7CisJfQorCQorCWZpbGUtPnByaXZhdGVfZGF0YSA9IHZjcDsKKworCXVubG9ja19rZXJuZWwoKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBjb2RhX3BzZGV2X3JlbGVhc2Uoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKyAgICAgICAgc3RydWN0IHZlbnVzX2NvbW0gKnZjcCA9IChzdHJ1Y3QgdmVudXNfY29tbSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgIHN0cnVjdCB1cGNfcmVxICpyZXEsICp0bXA7CisKKwlsb2NrX2tlcm5lbCgpOworCWlmICggIXZjcC0+dmNfaW51c2UgKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcHJpbnRrKCJwc2Rldl9yZWxlYXNlOiBOb3Qgb3Blbi5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKC0tdmNwLT52Y19pbnVzZSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAwOworCX0KKyAgICAgICAgCisgICAgICAgIC8qIFdha2V1cCBjbGllbnRzIHNvIHRoZXkgY2FuIHJldHVybi4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCB0bXAsICZ2Y3AtPnZjX3BlbmRpbmcsIHVjX2NoYWluKSB7CisJCS8qIEFzeW5jIHJlcXVlc3RzIG5lZWQgdG8gYmUgZnJlZWQgaGVyZSAqLworCQlpZiAocmVxLT51Y19mbGFncyAmIFJFUV9BU1lOQykgeworCQkJQ09EQV9GUkVFKHJlcS0+dWNfZGF0YSwgc2l6ZW9mKHN0cnVjdCBjb2RhX2luX2hkcikpOworCQkJdXBjX2ZyZWUocmVxKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXJlcS0+dWNfZmxhZ3MgfD0gUkVRX0FCT1JUOworCQl3YWtlX3VwKCZyZXEtPnVjX3NsZWVwKTsKKyAgICAgICAgfQorICAgICAgICAKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcSwgJnZjcC0+dmNfcHJvY2Vzc2luZywgdWNfY2hhaW4pIHsKKwkJcmVxLT51Y19mbGFncyB8PSBSRVFfQUJPUlQ7CisJICAgICAgICB3YWtlX3VwKCZyZXEtPnVjX3NsZWVwKTsKKyAgICAgICAgfQorCisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNvZGFfcHNkZXZfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlYWQJCT0gY29kYV9wc2Rldl9yZWFkLAorCS53cml0ZQkJPSBjb2RhX3BzZGV2X3dyaXRlLAorCS5wb2xsCQk9IGNvZGFfcHNkZXZfcG9sbCwKKwkuaW9jdGwJCT0gY29kYV9wc2Rldl9pb2N0bCwKKwkub3BlbgkJPSBjb2RhX3BzZGV2X29wZW4sCisJLnJlbGVhc2UJPSBjb2RhX3BzZGV2X3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IGluaXRfY29kYV9wc2Rldih2b2lkKQoreworCWludCBpLCBlcnIgPSAwOworCWlmIChyZWdpc3Rlcl9jaHJkZXYoQ09EQV9QU0RFVl9NQUpPUiwgImNvZGEiLCAmY29kYV9wc2Rldl9mb3BzKSkgeworICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNvZGFfcHNkZXY6IHVuYWJsZSB0byBnZXQgbWFqb3IgJWRcbiIsIAorCQkgICAgIENPREFfUFNERVZfTUFKT1IpOworICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKKwl9CisJY29kYV9wc2Rldl9jbGFzcyA9IGNsYXNzX3NpbXBsZV9jcmVhdGUoVEhJU19NT0RVTEUsICJjb2RhIik7CisJaWYgKElTX0VSUihjb2RhX3BzZGV2X2NsYXNzKSkgeworCQllcnIgPSBQVFJfRVJSKGNvZGFfcHNkZXZfY2xhc3MpOworCQlnb3RvIG91dF9jaHJkZXY7CisJfQkJCisJZGV2ZnNfbWtfZGlyICgiY29kYSIpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ09EQURFVlM7IGkrKykgeworCQljbGFzc19zaW1wbGVfZGV2aWNlX2FkZChjb2RhX3BzZGV2X2NsYXNzLCBNS0RFVihDT0RBX1BTREVWX01BSk9SLGkpLCAKKwkJCQlOVUxMLCAiY2ZzJWQiLCBpKTsKKwkJZXJyID0gZGV2ZnNfbWtfY2RldihNS0RFVihDT0RBX1BTREVWX01BSk9SLCBpKSwKKwkJCQlTX0lGQ0hSfFNfSVJVU1J8U19JV1VTUiwgImNvZGEvJWQiLCBpKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2NsYXNzOworCX0KKwljb2RhX3N5c2N0bF9pbml0KCk7CisJZ290byBvdXQ7CisKK291dF9jbGFzczoKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPREFERVZTOyBpKyspIAorCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihDT0RBX1BTREVWX01BSk9SLCBpKSk7CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3koY29kYV9wc2Rldl9jbGFzcyk7CitvdXRfY2hyZGV2OgorCXVucmVnaXN0ZXJfY2hyZGV2KENPREFfUFNERVZfTUFKT1IsICJjb2RhIik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworCitNT0RVTEVfQVVUSE9SKCJQZXRlciBKLiBCcmFhbSA8YnJhYW1AY3MuY211LmVkdT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworZXh0ZXJuIGludCBjb2RhX2luaXRfaW5vZGVjYWNoZSh2b2lkKTsKK2V4dGVybiB2b2lkIGNvZGFfZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpOworc3RhdGljIGludCBfX2luaXQgaW5pdF9jb2RhKHZvaWQpCit7CisJaW50IHN0YXR1czsKKwlpbnQgaTsKKwlwcmludGsoS0VSTl9JTkZPICJDb2RhIEtlcm5lbC9WZW51cyBjb21tdW5pY2F0aW9ucywgIgorI2lmZGVmIENPTkZJR19DT0RBX0ZTX09MRF9BUEkKKwkgICAgICAgInY1LjMuMjAiCisjZWxzZQorCSAgICAgICAidjYuMC4wIgorI2VuZGlmCisJICAgICAgICIsIGNvZGFAY3MuY211LmVkdVxuIik7CisKKwlzdGF0dXMgPSBjb2RhX2luaXRfaW5vZGVjYWNoZSgpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0MjsKKwlzdGF0dXMgPSBpbml0X2NvZGFfcHNkZXYoKTsKKwlpZiAoIHN0YXR1cyApIHsKKwkJcHJpbnRrKCJQcm9ibGVtICglZCkgaW4gaW5pdF9jb2RhX3BzZGV2XG4iLCBzdGF0dXMpOworCQlnb3RvIG91dDE7CisJfQorCQorCXN0YXR1cyA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmNvZGFfZnNfdHlwZSk7CisJaWYgKHN0YXR1cykgeworCQlwcmludGsoImNvZGE6IGZhaWxlZCB0byByZWdpc3RlciBmaWxlc3lzdGVtIVxuIik7CisJCWdvdG8gb3V0OworCX0KKwlyZXR1cm4gMDsKK291dDoKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPREFERVZTOyBpKyspIHsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoQ09EQV9QU0RFVl9NQUpPUiwgaSkpOworCQlkZXZmc19yZW1vdmUoImNvZGEvJWQiLCBpKTsKKwl9CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3koY29kYV9wc2Rldl9jbGFzcyk7CisJZGV2ZnNfcmVtb3ZlKCJjb2RhIik7CisJdW5yZWdpc3Rlcl9jaHJkZXYoQ09EQV9QU0RFVl9NQUpPUiwgImNvZGEiKTsKKwljb2RhX3N5c2N0bF9jbGVhbigpOworb3V0MToKKwljb2RhX2Rlc3Ryb3lfaW5vZGVjYWNoZSgpOworb3V0MjoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9jb2RhKHZvaWQpCit7CisgICAgICAgIGludCBlcnIsIGk7CisKKwllcnIgPSB1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmNvZGFfZnNfdHlwZSk7CisgICAgICAgIGlmICggZXJyICE9IDAgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJjb2RhOiBmYWlsZWQgdG8gdW5yZWdpc3RlciBmaWxlc3lzdGVtXG4iKTsKKyAgICAgICAgfQorCWZvciAoaSA9IDA7IGkgPCBNQVhfQ09EQURFVlM7IGkrKykgeworCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihDT0RBX1BTREVWX01BSk9SLCBpKSk7CisJCWRldmZzX3JlbW92ZSgiY29kYS8lZCIsIGkpOworCX0KKwljbGFzc19zaW1wbGVfZGVzdHJveShjb2RhX3BzZGV2X2NsYXNzKTsKKwlkZXZmc19yZW1vdmUoImNvZGEiKTsKKwl1bnJlZ2lzdGVyX2NocmRldihDT0RBX1BTREVWX01BSk9SLCAiY29kYSIpOworCWNvZGFfc3lzY3RsX2NsZWFuKCk7CisJY29kYV9kZXN0cm95X2lub2RlY2FjaGUoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9jb2RhKTsKK21vZHVsZV9leGl0KGV4aXRfY29kYSk7CisKZGlmZiAtLWdpdCBhL2ZzL2NvZGEvc3ltbGluay5jIGIvZnMvY29kYS9zeW1saW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1ZTViYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NvZGEvc3ltbGluay5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBTeW1saW5rIGlub2RlIG9wZXJhdGlvbnMgZm9yIENvZGEgZmlsZXN5c3RlbQorICogT3JpZ2luYWwgdmVyc2lvbjogKEMpIDE5OTYgUC4gQnJhYW0gYW5kIE0uIENhbGxhaGFuCisgKiBSZXdyaXR0ZW4gZm9yIExpbnV4IDIuMS4gKEMpIDE5OTcgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKKyAqIAorICogQ2FybmVnaWUgTWVsbG9uIGVuY291cmFnZXMgdXNlcnMgdG8gY29udHJpYnV0ZSBpbXByb3ZlbWVudHMgdG8KKyAqIHRoZSBDb2RhIHByb2plY3QuIENvbnRhY3QgUGV0ZXIgQnJhYW0gKGNvZGFAY3MuY211LmVkdSkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb2RhLmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9saW51eC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfcHNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2ZzX2kuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX3Byb2MuaD4KKworc3RhdGljIGludCBjb2RhX3N5bWxpbmtfZmlsbGVyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlpbnQgZXJyb3I7CisJc3RydWN0IGNvZGFfaW5vZGVfaW5mbyAqY2lpOworCXVuc2lnbmVkIGludCBsZW4gPSBQQUdFX1NJWkU7CisJY2hhciAqcCA9IGttYXAocGFnZSk7CisKKwlsb2NrX2tlcm5lbCgpOworCWNpaSA9IElUT0MoaW5vZGUpOworCWNvZGFfdmZzX3N0YXQuZm9sbG93X2xpbmsrKzsKKworCWVycm9yID0gdmVudXNfcmVhZGxpbmsoaW5vZGUtPmlfc2IsICZjaWktPmNfZmlkLCBwLCAmbGVuKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWw7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlTZXRQYWdlRXJyb3IocGFnZSk7CisJa3VubWFwKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiBlcnJvcjsKK30KKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBjb2RhX3N5bWxpbmtfYW9wcyA9IHsKKwkucmVhZHBhZ2UJPSBjb2RhX3N5bWxpbmtfZmlsbGVyLAorfTsKZGlmZiAtLWdpdCBhL2ZzL2NvZGEvc3lzY3RsLmMgYi9mcy9jb2RhL3N5c2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYjEwNzUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jb2RhL3N5c2N0bC5jCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICogU3lzY3RsIG9wZXJhdGlvbnMgZm9yIENvZGEgZmlsZXN5c3RlbQorICogT3JpZ2luYWwgdmVyc2lvbjogKEMpIDE5OTYgUC4gQnJhYW0gYW5kIE0uIENhbGxhaGFuCisgKiBSZXdyaXR0ZW4gZm9yIExpbnV4IDIuMS4gKEMpIDE5OTcgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKKyAqIAorICogQ2FybmVnaWUgTWVsbG9uIGVuY291cmFnZXMgdXNlcnMgdG8gY29udHJpYnV0ZSBpbXByb3ZlbWVudHMgdG8KKyAqIHRoZSBDb2RhIHByb2plY3QuIENvbnRhY3QgUGV0ZXIgQnJhYW0gKGNvZGFAY3MuY211LmVkdSkuCisgKiAKKyAqIENPREEgb3BlcmF0aW9uIHN0YXRpc3RpY3MKKyAqIChjKSBNYXJjaCwgMTk5OCBaaGFueW9uZyBXYW4gPHpoYW55b25nLndhbkB5YWxlLmVkdT4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb2RhLmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9saW51eC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfZnNfaS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfcHNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9wcm9jLmg+CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqZnNfdGFibGVfaGVhZGVyOworCisjZGVmaW5lIEZTX0NPREEgICAgICAgICAxICAgICAgIC8qIENvZGEgZmlsZSBzeXN0ZW0gKi8KKworI2RlZmluZSBDT0RBX1RJTUVPVVQgICAgMyAgICAgICAvKiB0aW1lb3V0IG9uIHVwY2FsbHMgdG8gYmVjb21lIGludHJibGUgKi8KKyNkZWZpbmUgQ09EQV9IQVJEICAgICAgIDUgICAgICAgLyogbW91bnQgdHlwZSAiaGFyZCIgb3IgInNvZnQiICovCisjZGVmaW5lIENPREFfVkZTIAkgNiAgICAgICAvKiB2ZnMgc3RhdGlzdGljcyAqLworI2RlZmluZSBDT0RBX0NBQ0hFX0lOViAJIDkgICAgICAgLyogY2FjaGUgaW52YWxpZGF0aW9uIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgQ09EQV9GQUtFX1NUQVRGUyAxMAkgLyogZG9uJ3QgcXVlcnkgdmVudXMgZm9yIGFjdHVhbCBjYWNoZSB1c2FnZSAqLworCitzdHJ1Y3QgY29kYV92ZnNfc3RhdHMJCWNvZGFfdmZzX3N0YXQ7CitzdGF0aWMgc3RydWN0IGNvZGFfY2FjaGVfaW52X3N0YXRzCWNvZGFfY2FjaGVfaW52X3N0YXQ7CisKK3N0YXRpYyB2b2lkIHJlc2V0X2NvZGFfdmZzX3N0YXRzKCB2b2lkICkKK3sKKwltZW1zZXQoICZjb2RhX3Zmc19zdGF0LCAwLCBzaXplb2YoIGNvZGFfdmZzX3N0YXQgKSApOworfQorCitzdGF0aWMgdm9pZCByZXNldF9jb2RhX2NhY2hlX2ludl9zdGF0cyggdm9pZCApCit7CisJbWVtc2V0KCAmY29kYV9jYWNoZV9pbnZfc3RhdCwgMCwgc2l6ZW9mKCBjb2RhX2NhY2hlX2ludl9zdGF0ICkgKTsKK30KKworc3RhdGljIGludCBkb19yZXNldF9jb2RhX3Zmc19zdGF0cyggY3RsX3RhYmxlICogdGFibGUsIGludCB3cml0ZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkIF9fdXNlciAqIGJ1ZmZlciwKKwkJCQkgICAgc2l6ZV90ICogbGVucCwgbG9mZl90ICogcHBvcyApCit7CisJaWYgKCB3cml0ZSApIHsKKwkJcmVzZXRfY29kYV92ZnNfc3RhdHMoKTsKKworCQkqcHBvcyArPSAqbGVucDsKKwl9IGVsc2UgeworCQkqbGVucCA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG9fcmVzZXRfY29kYV9jYWNoZV9pbnZfc3RhdHMoIGN0bF90YWJsZSAqIHRhYmxlLCBpbnQgd3JpdGUsCisJCQkJCSAgc3RydWN0IGZpbGUgKiBmaWxwLAorCQkJCQkgIHZvaWQgX191c2VyICogYnVmZmVyLAorCQkJCQkgIHNpemVfdCAqIGxlbnAsIGxvZmZfdCAqIHBwb3MgKQoreworCWlmICggd3JpdGUgKSB7CisJCXJlc2V0X2NvZGFfY2FjaGVfaW52X3N0YXRzKCk7CisKKwkJKnBwb3MgKz0gKmxlbnA7CisJfSBlbHNlIHsKKwkJKmxlbnAgPSAwOworCX0KKyAgCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29kYV92ZnNfc3RhdHNfZ2V0X2luZm8oIGNoYXIgKiBidWZmZXIsIGNoYXIgKiogc3RhcnQsCisJCQkJICAgIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCkKK3sKKwlpbnQgbGVuPTA7CisJb2ZmX3QgYmVnaW47CisJc3RydWN0IGNvZGFfdmZzX3N0YXRzICogcHMgPSAmIGNvZGFfdmZzX3N0YXQ7CisgIAorICAvKiB0aGlzIHdvcmtzIGFzIGxvbmcgYXMgd2UgYXJlIGJlbG93IDEwMjQgY2hhcmFjdGVycyEgKi8KKwlsZW4gKz0gc3ByaW50ZiggYnVmZmVyLAorCQkJIkNvZGEgVkZTIHN0YXRpc3RpY3NcbiIKKwkJCSI9PT09PT09PT09PT09PT09PT09XG5cbiIKKwkJCSJGaWxlIE9wZXJhdGlvbnM6XG4iCisJCQkiXHRvcGVuXHRcdCU5ZFxuIgorCQkJIlx0Zmx1c2hcdFx0JTlkXG4iCisJCQkiXHRyZWxlYXNlXHRcdCU5ZFxuIgorCQkJIlx0ZnN5bmNcdFx0JTlkXG5cbiIKKwkJCSJEaXIgT3BlcmF0aW9uczpcbiIKKwkJCSJcdHJlYWRkaXJcdFx0JTlkXG5cbiIKKwkJCSJJbm9kZSBPcGVyYXRpb25zXG4iCisJCQkiXHRjcmVhdGVcdFx0JTlkXG4iCisJCQkiXHRsb29rdXBcdFx0JTlkXG4iCisJCQkiXHRsaW5rXHRcdCU5ZFxuIgorCQkJIlx0dW5saW5rXHRcdCU5ZFxuIgorCQkJIlx0c3ltbGlua1x0XHQlOWRcbiIKKwkJCSJcdG1rZGlyXHRcdCU5ZFxuIgorCQkJIlx0cm1kaXJcdFx0JTlkXG4iCisJCQkiXHRyZW5hbWVcdFx0JTlkXG4iCisJCQkiXHRwZXJtaXNzaW9uXHQlOWRcbiIsCisKKwkJCS8qIGZpbGUgb3BlcmF0aW9ucyAqLworCQkJcHMtPm9wZW4sCisJCQlwcy0+Zmx1c2gsCisJCQlwcy0+cmVsZWFzZSwKKwkJCXBzLT5mc3luYywKKworCQkJLyogZGlyIG9wZXJhdGlvbnMgKi8KKwkJCXBzLT5yZWFkZGlyLAorCQkgIAorCQkJLyogaW5vZGUgb3BlcmF0aW9ucyAqLworCQkJcHMtPmNyZWF0ZSwKKwkJCXBzLT5sb29rdXAsCisJCQlwcy0+bGluaywKKwkJCXBzLT51bmxpbmssCisJCQlwcy0+c3ltbGluaywKKwkJCXBzLT5ta2RpciwKKwkJCXBzLT5ybWRpciwKKwkJCXBzLT5yZW5hbWUsCisJCQlwcy0+cGVybWlzc2lvbik7IAorCisJYmVnaW4gPSBvZmZzZXQ7CisJKnN0YXJ0ID0gYnVmZmVyICsgYmVnaW47CisJbGVuIC09IGJlZ2luOworCisJaWYgKCBsZW4gPiBsZW5ndGggKQorCQlsZW4gPSBsZW5ndGg7CisJaWYgKCBsZW4gPCAwICkKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgY29kYV9jYWNoZV9pbnZfc3RhdHNfZ2V0X2luZm8oIGNoYXIgKiBidWZmZXIsIGNoYXIgKiogc3RhcnQsCisJCQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoKQoreworCWludCBsZW49MDsKKwlvZmZfdCBiZWdpbjsKKwlzdHJ1Y3QgY29kYV9jYWNoZV9pbnZfc3RhdHMgKiBwcyA9ICYgY29kYV9jYWNoZV9pbnZfc3RhdDsKKyAgCisJLyogdGhpcyB3b3JrcyBhcyBsb25nIGFzIHdlIGFyZSBiZWxvdyAxMDI0IGNoYXJhY3RlcnMhICovCisJbGVuICs9IHNwcmludGYoIGJ1ZmZlciwKKwkJCSJDb2RhIGNhY2hlIGludmFsaWRhdGlvbiBzdGF0aXN0aWNzXG4iCisJCQkiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4iCisJCQkiZmx1c2hcdFx0JTlkXG4iCisJCQkicHVyZ2UgdXNlclx0JTlkXG4iCisJCQkiemFwX2Rpclx0XHQlOWRcbiIKKwkJCSJ6YXBfZmlsZVx0JTlkXG4iCisJCQkiemFwX3Zub2RlXHQlOWRcbiIKKwkJCSJwdXJnZV9maWRcdCU5ZFxuIgorCQkJInJlcGxhY2VcdFx0JTlkXG4iLAorCQkJcHMtPmZsdXNoLAorCQkJcHMtPnB1cmdlX3VzZXIsCisJCQlwcy0+emFwX2RpciwKKwkJCXBzLT56YXBfZmlsZSwKKwkJCXBzLT56YXBfdm5vZGUsCisJCQlwcy0+cHVyZ2VfZmlkLAorCQkJcHMtPnJlcGxhY2UgKTsKKyAgCisJYmVnaW4gPSBvZmZzZXQ7CisJKnN0YXJ0ID0gYnVmZmVyICsgYmVnaW47CisJbGVuIC09IGJlZ2luOworCisJaWYgKCBsZW4gPiBsZW5ndGggKQorCQlsZW4gPSBsZW5ndGg7CisJaWYgKCBsZW4gPCAwICkKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBjdGxfdGFibGUgY29kYV90YWJsZVtdID0geworIAl7Q09EQV9USU1FT1VULCAidGltZW91dCIsICZjb2RhX3RpbWVvdXQsIHNpemVvZihpbnQpLCAwNjQ0LCBOVUxMLCAmcHJvY19kb2ludHZlY30sCisgCXtDT0RBX0hBUkQsICJoYXJkIiwgJmNvZGFfaGFyZCwgc2l6ZW9mKGludCksIDA2NDQsIE5VTEwsICZwcm9jX2RvaW50dmVjfSwKKyAJe0NPREFfVkZTLCAidmZzX3N0YXRzIiwgTlVMTCwgMCwgMDY0NCwgTlVMTCwgJmRvX3Jlc2V0X2NvZGFfdmZzX3N0YXRzfSwKKyAJe0NPREFfQ0FDSEVfSU5WLCAiY2FjaGVfaW52X3N0YXRzIiwgTlVMTCwgMCwgMDY0NCwgTlVMTCwgJmRvX3Jlc2V0X2NvZGFfY2FjaGVfaW52X3N0YXRzfSwKKyAJe0NPREFfRkFLRV9TVEFURlMsICJmYWtlX3N0YXRmcyIsICZjb2RhX2Zha2Vfc3RhdGZzLCBzaXplb2YoaW50KSwgMDYwMCwgTlVMTCwgJnByb2NfZG9pbnR2ZWN9LAorCXsgMCB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIGZzX3RhYmxlW10gPSB7CisgICAgICAge0ZTX0NPREEsICJjb2RhIiwgICAgTlVMTCwgMCwgMDU1NSwgY29kYV90YWJsZX0sCisgICAgICAgezB9Cit9OworCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCisvKgorIHRhcmdldCBkaXJlY3Rvcnkgc3RydWN0dXJlOgorICAgL3Byb2MvZnMgIChzZWUgbGludXgvZnMvcHJvYy9yb290LmMpCisgICAvcHJvYy9mcy9jb2RhCisgICAvcHJvYy9mcy9jb2RhL3t2ZnNfc3RhdHMsCisKKyovCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkqIHByb2NfZnNfY29kYTsKKworI2VuZGlmCisKKyNkZWZpbmUgY29kYV9wcm9jX2NyZWF0ZShuYW1lLGdldF9pbmZvKSBcCisJY3JlYXRlX3Byb2NfaW5mb19lbnRyeShuYW1lLCAwLCBwcm9jX2ZzX2NvZGEsIGdldF9pbmZvKQorCit2b2lkIGNvZGFfc3lzY3RsX2luaXQodm9pZCkKK3sKKwlyZXNldF9jb2RhX3Zmc19zdGF0cygpOworCXJlc2V0X2NvZGFfY2FjaGVfaW52X3N0YXRzKCk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXByb2NfZnNfY29kYSA9IHByb2NfbWtkaXIoImNvZGEiLCBwcm9jX3Jvb3RfZnMpOworCWlmIChwcm9jX2ZzX2NvZGEpIHsKKwkJcHJvY19mc19jb2RhLT5vd25lciA9IFRISVNfTU9EVUxFOworCQljb2RhX3Byb2NfY3JlYXRlKCJ2ZnNfc3RhdHMiLCBjb2RhX3Zmc19zdGF0c19nZXRfaW5mbyk7CisJCWNvZGFfcHJvY19jcmVhdGUoImNhY2hlX2ludl9zdGF0cyIsIGNvZGFfY2FjaGVfaW52X3N0YXRzX2dldF9pbmZvKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TWVNDVEwKKwlpZiAoICFmc190YWJsZV9oZWFkZXIgKQorCQlmc190YWJsZV9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUoZnNfdGFibGUsIDApOworI2VuZGlmIAorfQorCit2b2lkIGNvZGFfc3lzY3RsX2NsZWFuKHZvaWQpIAoreworCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCWlmICggZnNfdGFibGVfaGVhZGVyICkgeworCQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShmc190YWJsZV9oZWFkZXIpOworCQlmc190YWJsZV9oZWFkZXIgPSBOVUxMOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKyAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkoImNhY2hlX2ludl9zdGF0cyIsIHByb2NfZnNfY29kYSk7CisgICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KCJ2ZnNfc3RhdHMiLCBwcm9jX2ZzX2NvZGEpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJjb2RhIiwgcHJvY19yb290X2ZzKTsKKyNlbmRpZiAKK30KZGlmZiAtLWdpdCBhL2ZzL2NvZGEvdXBjYWxsLmMgYi9mcy9jb2RhL3VwY2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYWU5OTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jb2RhL3VwY2FsbC5jCkBAIC0wLDAgKzEsOTE0IEBACisvKgorICogTW9zdGx5IHBsYXRmb3JtIGluZGVwZW5kZW50IHVwY2FsbCBvcGVyYXRpb25zIHRvIFZlbnVzOgorICogIC0tIHVwY2FsbHMKKyAqICAtLSB1cGNhbGwgcm91dGluZXMKKyAqCisgKiBMaW51eCAyLjAgdmVyc2lvbgorICogQ29weXJpZ2h0IChDKSAxOTk2IFBldGVyIEouIEJyYWFtIDxicmFhbUBtYXRocy5veC5hYy51az4sIAorICogTWljaGFlbCBDYWxsYWhhbiA8Y2FsbGFoYW5AbWF0aHMub3guYWMudWs+IAorICogCisgKiBSZWRvbmUgZm9yIExpbnV4IDIuMQorICogQ29weXJpZ2h0IChDKSAxOTk3IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgKgorICogQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgZW5jb3VyYWdlcyB1c2VycyBvZiB0aGlzIGNvZGUgdG8gY29udHJpYnV0ZQorICogaW1wcm92ZW1lbnRzIHRvIHRoZSBDb2RhIHByb2plY3QuIENvbnRhY3QgUGV0ZXIgQnJhYW0gPGNvZGFAY3MuY211LmVkdT4uCisgKi8KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb2RhLmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9saW51eC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfcHNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2ZzX2kuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9wcm9jLmg+IAorCisjZGVmaW5lIHVwY19hbGxvYygpIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1cGNfcmVxKSwgR0ZQX0tFUk5FTCkKKyNkZWZpbmUgdXBjX2ZyZWUocikga2ZyZWUocikKKworc3RhdGljIGludCBjb2RhX3VwY2FsbChzdHJ1Y3QgY29kYV9zYl9pbmZvICptbnRpbmZvLCBpbnQgaW5TaXplLCBpbnQgKm91dFNpemUsIAorCQkgICAgICAgdW5pb24gaW5wdXRBcmdzICpidWZmZXIpOworCitzdGF0aWMgdm9pZCAqYWxsb2NfdXBjYWxsKGludCBvcGNvZGUsIGludCBzaXplKQoreworCXVuaW9uIGlucHV0QXJncyAqaW5wOworCisJQ09EQV9BTExPQyhpbnAsIHVuaW9uIGlucHV0QXJncyAqLCBzaXplKTsKKyAgICAgICAgaWYgKCFpbnApCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisgICAgICAgIGlucC0+aWgub3Bjb2RlID0gb3Bjb2RlOworCWlucC0+aWgucGlkID0gY3VycmVudC0+cGlkOworCWlucC0+aWgucGdpZCA9IHByb2Nlc3NfZ3JvdXAoY3VycmVudCk7CisjaWZkZWYgQ09ORklHX0NPREFfRlNfT0xEX0FQSQorCW1lbXNldCgmaW5wLT5paC5jcmVkLCAwLCBzaXplb2Yoc3RydWN0IGNvZGFfY3JlZCkpOworCWlucC0+aWguY3JlZC5jcl9mc3VpZCA9IGN1cnJlbnQtPmZzdWlkOworI2Vsc2UKKwlpbnAtPmloLnVpZCA9IGN1cnJlbnQtPmZzdWlkOworI2VuZGlmCisJcmV0dXJuICh2b2lkKilpbnA7Cit9CisKKyNkZWZpbmUgVVBBUkcob3ApXAorZG8ge1wKKwlpbnAgPSAodW5pb24gaW5wdXRBcmdzICopYWxsb2NfdXBjYWxsKG9wLCBpbnNpemUpOyBcCisgICAgICAgIGlmIChJU19FUlIoaW5wKSkgeyByZXR1cm4gUFRSX0VSUihpbnApOyB9XAorICAgICAgICBvdXRwID0gKHVuaW9uIG91dHB1dEFyZ3MgKikoaW5wKTsgXAorICAgICAgICBvdXRzaXplID0gaW5zaXplOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIElOU0laRSh0YWcpIHNpemVvZihzdHJ1Y3QgY29kYV8gIyMgdGFnICMjIF9pbikKKyNkZWZpbmUgT1VUU0laRSh0YWcpIHNpemVvZihzdHJ1Y3QgY29kYV8gIyMgdGFnICMjIF9vdXQpCisjZGVmaW5lIFNJWkUodGFnKSAgbWF4X3QodW5zaWduZWQgaW50LCBJTlNJWkUodGFnKSwgT1VUU0laRSh0YWcpKQorCisKKy8qIHRoZSB1cGNhbGxzICovCitpbnQgdmVudXNfcm9vdGZpZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqZmlkcCkKK3sKKyAgICAgICAgdW5pb24gaW5wdXRBcmdzICppbnA7CisgICAgICAgIHVuaW9uIG91dHB1dEFyZ3MgKm91dHA7CisgICAgICAgIGludCBpbnNpemUsIG91dHNpemUsIGVycm9yOworCisgICAgICAgIGluc2l6ZSA9IFNJWkUocm9vdCk7CisgICAgICAgIFVQQVJHKENPREFfUk9PVCk7CisKKwllcnJvciA9IGNvZGFfdXBjYWxsKGNvZGFfc2JwKHNiKSwgaW5zaXplLCAmb3V0c2l6ZSwgaW5wKTsKKwkKKwlpZiAoZXJyb3IpIHsKKwkgICAgICAgIHByaW50aygiY29kYV9nZXRfcm9vdGZpZDogZXJyb3IgJWRcbiIsIGVycm9yKTsKKwl9IGVsc2UgeworCQkqZmlkcCA9IG91dHAtPmNvZGFfcm9vdC5WRmlkOworCX0KKworCUNPREFfRlJFRShpbnAsIGluc2l6ZSk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgdmVudXNfZ2V0YXR0cihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqZmlkLCAKKwkJICAgICBzdHJ1Y3QgY29kYV92YXR0ciAqYXR0cikgCit7CisgICAgICAgIHVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOworICAgICAgICBpbnQgaW5zaXplLCBvdXRzaXplLCBlcnJvcjsKKworICAgICAgICBpbnNpemUgPSBTSVpFKGdldGF0dHIpOyAKKwlVUEFSRyhDT0RBX0dFVEFUVFIpOworICAgICAgICBpbnAtPmNvZGFfZ2V0YXR0ci5WRmlkID0gKmZpZDsKKworICAgICAgICBlcnJvciA9IGNvZGFfdXBjYWxsKGNvZGFfc2JwKHNiKSwgaW5zaXplLCAmb3V0c2l6ZSwgaW5wKTsKKwkKKwkqYXR0ciA9IG91dHAtPmNvZGFfZ2V0YXR0ci5hdHRyOworCisJQ09EQV9GUkVFKGlucCwgaW5zaXplKTsKKyAgICAgICAgcmV0dXJuIGVycm9yOworfQorCitpbnQgdmVudXNfc2V0YXR0cihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqZmlkLCAKKwkJICBzdHJ1Y3QgY29kYV92YXR0ciAqdmF0dHIpCit7CisgICAgICAgIHVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOworICAgICAgICBpbnQgaW5zaXplLCBvdXRzaXplLCBlcnJvcjsKKwkKKwlpbnNpemUgPSBTSVpFKHNldGF0dHIpOworCVVQQVJHKENPREFfU0VUQVRUUik7CisKKyAgICAgICAgaW5wLT5jb2RhX3NldGF0dHIuVkZpZCA9ICpmaWQ7CisJaW5wLT5jb2RhX3NldGF0dHIuYXR0ciA9ICp2YXR0cjsKKworICAgICAgICBlcnJvciA9IGNvZGFfdXBjYWxsKGNvZGFfc2JwKHNiKSwgaW5zaXplLCAmb3V0c2l6ZSwgaW5wKTsKKworICAgICAgICBDT0RBX0ZSRUUoaW5wLCBpbnNpemUpOworICAgICAgICByZXR1cm4gZXJyb3I7Cit9CisKK2ludCB2ZW51c19sb29rdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IENvZGFGaWQgKmZpZCwgCisJCSAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuZ3RoLCBpbnQgKiB0eXBlLCAKKwkJICAgIHN0cnVjdCBDb2RhRmlkICpyZXNmaWQpCit7CisgICAgICAgIHVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOworICAgICAgICBpbnQgaW5zaXplLCBvdXRzaXplLCBlcnJvcjsKKwlpbnQgb2Zmc2V0OworCisJb2Zmc2V0ID0gSU5TSVpFKGxvb2t1cCk7CisgICAgICAgIGluc2l6ZSA9IG1heF90KHVuc2lnbmVkIGludCwgb2Zmc2V0ICsgbGVuZ3RoICsxLCBPVVRTSVpFKGxvb2t1cCkpOworCVVQQVJHKENPREFfTE9PS1VQKTsKKworICAgICAgICBpbnAtPmNvZGFfbG9va3VwLlZGaWQgPSAqZmlkOworCWlucC0+Y29kYV9sb29rdXAubmFtZSA9IG9mZnNldDsKKwlpbnAtPmNvZGFfbG9va3VwLmZsYWdzID0gQ0xVX0NBU0VfU0VOU0lUSVZFOworICAgICAgICAvKiBzZW5kIFZlbnVzIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyAqLworICAgICAgICBtZW1jcHkoKGNoYXIgKikoaW5wKSArIG9mZnNldCwgbmFtZSwgbGVuZ3RoKTsKKyAgICAgICAgKigoY2hhciAqKWlucCArIG9mZnNldCArIGxlbmd0aCkgPSAnXDAnOworCisgICAgICAgIGVycm9yID0gY29kYV91cGNhbGwoY29kYV9zYnAoc2IpLCBpbnNpemUsICZvdXRzaXplLCBpbnApOworCisJKnJlc2ZpZCA9IG91dHAtPmNvZGFfbG9va3VwLlZGaWQ7CisJKnR5cGUgPSBvdXRwLT5jb2RhX2xvb2t1cC52dHlwZTsKKworCUNPREFfRlJFRShpbnAsIGluc2l6ZSk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgdmVudXNfc3RvcmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IENvZGFGaWQgKmZpZCwgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgIHZ1aWRfdCB1aWQpCit7CisgICAgICAgIHVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOworICAgICAgICBpbnQgaW5zaXplLCBvdXRzaXplLCBlcnJvcjsKKyNpZmRlZiBDT05GSUdfQ09EQV9GU19PTERfQVBJCisJc3RydWN0IGNvZGFfY3JlZCBjcmVkID0geyAwLCB9OworCWNyZWQuY3JfZnN1aWQgPSB1aWQ7CisjZW5kaWYKKwkKKwlpbnNpemUgPSBTSVpFKHN0b3JlKTsKKwlVUEFSRyhDT0RBX1NUT1JFKTsKKwkKKyNpZmRlZiBDT05GSUdfQ09EQV9GU19PTERfQVBJCisJbWVtY3B5KCYoaW5wLT5paC5jcmVkKSwgJmNyZWQsIHNpemVvZihjcmVkKSk7CisjZWxzZQorCWlucC0+aWgudWlkID0gdWlkOworI2VuZGlmCisJCisgICAgICAgIGlucC0+Y29kYV9zdG9yZS5WRmlkID0gKmZpZDsKKyAgICAgICAgaW5wLT5jb2RhX3N0b3JlLmZsYWdzID0gZmxhZ3M7CisKKyAgICAgICAgZXJyb3IgPSBjb2RhX3VwY2FsbChjb2RhX3NicChzYiksIGluc2l6ZSwgJm91dHNpemUsIGlucCk7CisKKwlDT0RBX0ZSRUUoaW5wLCBpbnNpemUpOworICAgICAgICByZXR1cm4gZXJyb3I7Cit9CisKK2ludCB2ZW51c19yZWxlYXNlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBDb2RhRmlkICpmaWQsIGludCBmbGFncykKK3sKKyAgICAgICAgdW5pb24gaW5wdXRBcmdzICppbnA7CisgICAgICAgIHVuaW9uIG91dHB1dEFyZ3MgKm91dHA7CisgICAgICAgIGludCBpbnNpemUsIG91dHNpemUsIGVycm9yOworCQorCWluc2l6ZSA9IFNJWkUocmVsZWFzZSk7CisJVVBBUkcoQ09EQV9SRUxFQVNFKTsKKwkKKwlpbnAtPmNvZGFfcmVsZWFzZS5WRmlkID0gKmZpZDsKKwlpbnAtPmNvZGFfcmVsZWFzZS5mbGFncyA9IGZsYWdzOworCisJZXJyb3IgPSBjb2RhX3VwY2FsbChjb2RhX3NicChzYiksIGluc2l6ZSwgJm91dHNpemUsIGlucCk7CisKKwlDT0RBX0ZSRUUoaW5wLCBpbnNpemUpOworCXJldHVybiBlcnJvcjsKK30KKworaW50IHZlbnVzX2Nsb3NlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBDb2RhRmlkICpmaWQsIGludCBmbGFncywKKyAgICAgICAgICAgICAgICB2dWlkX3QgdWlkKQoreworCXVuaW9uIGlucHV0QXJncyAqaW5wOworCXVuaW9uIG91dHB1dEFyZ3MgKm91dHA7CisJaW50IGluc2l6ZSwgb3V0c2l6ZSwgZXJyb3I7CisjaWZkZWYgQ09ORklHX0NPREFfRlNfT0xEX0FQSQorCXN0cnVjdCBjb2RhX2NyZWQgY3JlZCA9IHsgMCwgfTsKKwljcmVkLmNyX2ZzdWlkID0gdWlkOworI2VuZGlmCisJCisJaW5zaXplID0gU0laRShyZWxlYXNlKTsKKwlVUEFSRyhDT0RBX0NMT1NFKTsKKwkKKyNpZmRlZiBDT05GSUdfQ09EQV9GU19PTERfQVBJCisJbWVtY3B5KCYoaW5wLT5paC5jcmVkKSwgJmNyZWQsIHNpemVvZihjcmVkKSk7CisjZWxzZQorCWlucC0+aWgudWlkID0gdWlkOworI2VuZGlmCisJCisgICAgICAgIGlucC0+Y29kYV9jbG9zZS5WRmlkID0gKmZpZDsKKyAgICAgICAgaW5wLT5jb2RhX2Nsb3NlLmZsYWdzID0gZmxhZ3M7CisKKyAgICAgICAgZXJyb3IgPSBjb2RhX3VwY2FsbChjb2RhX3NicChzYiksIGluc2l6ZSwgJm91dHNpemUsIGlucCk7CisKKwlDT0RBX0ZSRUUoaW5wLCBpbnNpemUpOworICAgICAgICByZXR1cm4gZXJyb3I7Cit9CisKK2ludCB2ZW51c19vcGVuKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBDb2RhRmlkICpmaWQsCisJCSAgaW50IGZsYWdzLCBzdHJ1Y3QgZmlsZSAqKmZoKQoreworICAgICAgICB1bmlvbiBpbnB1dEFyZ3MgKmlucDsKKyAgICAgICAgdW5pb24gb3V0cHV0QXJncyAqb3V0cDsKKyAgICAgICAgaW50IGluc2l6ZSwgb3V0c2l6ZSwgZXJyb3I7CisgICAgICAgCisJaW5zaXplID0gU0laRShvcGVuX2J5X2ZkKTsKKwlVUEFSRyhDT0RBX09QRU5fQllfRkQpOworCisgICAgICAgIGlucC0+Y29kYV9vcGVuLlZGaWQgPSAqZmlkOworICAgICAgICBpbnAtPmNvZGFfb3Blbi5mbGFncyA9IGZsYWdzOworCisgICAgICAgIGVycm9yID0gY29kYV91cGNhbGwoY29kYV9zYnAoc2IpLCBpbnNpemUsICZvdXRzaXplLCBpbnApOworCisJKmZoID0gb3V0cC0+Y29kYV9vcGVuX2J5X2ZkLmZoOworCisJQ09EQV9GUkVFKGlucCwgaW5zaXplKTsKKwlyZXR1cm4gZXJyb3I7Cit9CQorCitpbnQgdmVudXNfbWtkaXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IENvZGFGaWQgKmRpcmZpZCwgCisJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW5ndGgsIAorCQkgICBzdHJ1Y3QgQ29kYUZpZCAqbmV3ZmlkLCBzdHJ1Y3QgY29kYV92YXR0ciAqYXR0cnMpCit7CisgICAgICAgIHVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOworICAgICAgICBpbnQgaW5zaXplLCBvdXRzaXplLCBlcnJvcjsKKyAgICAgICAgaW50IG9mZnNldDsKKworCW9mZnNldCA9IElOU0laRShta2Rpcik7CisJaW5zaXplID0gbWF4X3QodW5zaWduZWQgaW50LCBvZmZzZXQgKyBsZW5ndGggKyAxLCBPVVRTSVpFKG1rZGlyKSk7CisJVVBBUkcoQ09EQV9NS0RJUik7CisKKyAgICAgICAgaW5wLT5jb2RhX21rZGlyLlZGaWQgPSAqZGlyZmlkOworICAgICAgICBpbnAtPmNvZGFfbWtkaXIuYXR0ciA9ICphdHRyczsKKwlpbnAtPmNvZGFfbWtkaXIubmFtZSA9IG9mZnNldDsKKyAgICAgICAgLyogVmVudXMgbXVzdCBnZXQgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyAqLworICAgICAgICBtZW1jcHkoKGNoYXIgKikoaW5wKSArIG9mZnNldCwgbmFtZSwgbGVuZ3RoKTsKKyAgICAgICAgKigoY2hhciAqKWlucCArIG9mZnNldCArIGxlbmd0aCkgPSAnXDAnOworICAgICAgICAKKyAgICAgICAgZXJyb3IgPSBjb2RhX3VwY2FsbChjb2RhX3NicChzYiksIGluc2l6ZSwgJm91dHNpemUsIGlucCk7CisKKwkqYXR0cnMgPSBvdXRwLT5jb2RhX21rZGlyLmF0dHI7CisJKm5ld2ZpZCA9IG91dHAtPmNvZGFfbWtkaXIuVkZpZDsKKworCUNPREFfRlJFRShpbnAsIGluc2l6ZSk7CisJcmV0dXJuIGVycm9yOyAgICAgICAgCit9CisKKworaW50IHZlbnVzX3JlbmFtZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqb2xkX2ZpZCwgCisJCSBzdHJ1Y3QgQ29kYUZpZCAqbmV3X2ZpZCwgc2l6ZV90IG9sZF9sZW5ndGgsIAorCQkgc2l6ZV90IG5ld19sZW5ndGgsIGNvbnN0IGNoYXIgKm9sZF9uYW1lLCAKKwkJIGNvbnN0IGNoYXIgKm5ld19uYW1lKQoreworCXVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOworICAgICAgICBpbnQgaW5zaXplLCBvdXRzaXplLCBlcnJvcjsgCisJaW50IG9mZnNldCwgczsKKwkKKwlvZmZzZXQgPSBJTlNJWkUocmVuYW1lKTsKKwlpbnNpemUgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIG9mZnNldCArIG5ld19sZW5ndGggKyBvbGRfbGVuZ3RoICsgOCwKKwkJICAgICBPVVRTSVpFKHJlbmFtZSkpOyAKKyAJVVBBUkcoQ09EQV9SRU5BTUUpOworCisgICAgICAgIGlucC0+Y29kYV9yZW5hbWUuc291cmNlRmlkID0gKm9sZF9maWQ7CisgICAgICAgIGlucC0+Y29kYV9yZW5hbWUuZGVzdEZpZCA9ICAqbmV3X2ZpZDsKKyAgICAgICAgaW5wLT5jb2RhX3JlbmFtZS5zcmNuYW1lID0gb2Zmc2V0OworCisgICAgICAgIC8qIFZlbnVzIG11c3QgcmVjZWl2ZSBhbiBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nICovCisgICAgICAgIHMgPSAoIG9sZF9sZW5ndGggJiB+MHgzKSArNDsgLyogcm91bmQgdXAgdG8gd29yZCBib3VuZGFyeSAqLworICAgICAgICBtZW1jcHkoKGNoYXIgKikoaW5wKSArIG9mZnNldCwgb2xkX25hbWUsIG9sZF9sZW5ndGgpOworICAgICAgICAqKChjaGFyICopaW5wICsgb2Zmc2V0ICsgb2xkX2xlbmd0aCkgPSAnXDAnOworCisgICAgICAgIC8qIGFub3RoZXIgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBmb3IgVmVudXMgKi8KKyAgICAgICAgb2Zmc2V0ICs9IHM7CisgICAgICAgIGlucC0+Y29kYV9yZW5hbWUuZGVzdG5hbWUgPSBvZmZzZXQ7CisgICAgICAgIHMgPSAoIG5ld19sZW5ndGggJiB+MHgzKSArNDsgLyogcm91bmQgdXAgdG8gd29yZCBib3VuZGFyeSAqLworICAgICAgICBtZW1jcHkoKGNoYXIgKikoaW5wKSArIG9mZnNldCwgbmV3X25hbWUsIG5ld19sZW5ndGgpOworICAgICAgICAqKChjaGFyICopaW5wICsgb2Zmc2V0ICsgbmV3X2xlbmd0aCkgPSAnXDAnOworCisgICAgICAgIGVycm9yID0gY29kYV91cGNhbGwoY29kYV9zYnAoc2IpLCBpbnNpemUsICZvdXRzaXplLCBpbnApOworCisJQ09EQV9GUkVFKGlucCwgaW5zaXplKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludCB2ZW51c19jcmVhdGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IENvZGFGaWQgKmRpcmZpZCwgCisJCSBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuZ3RoLCBpbnQgZXhjbCwgaW50IG1vZGUsCisJCSBzdHJ1Y3QgQ29kYUZpZCAqbmV3ZmlkLCBzdHJ1Y3QgY29kYV92YXR0ciAqYXR0cnMpIAoreworICAgICAgICB1bmlvbiBpbnB1dEFyZ3MgKmlucDsKKyAgICAgICAgdW5pb24gb3V0cHV0QXJncyAqb3V0cDsKKyAgICAgICAgaW50IGluc2l6ZSwgb3V0c2l6ZSwgZXJyb3I7CisgICAgICAgIGludCBvZmZzZXQ7CisKKyAgICAgICAgb2Zmc2V0ID0gSU5TSVpFKGNyZWF0ZSk7CisJaW5zaXplID0gbWF4X3QodW5zaWduZWQgaW50LCBvZmZzZXQgKyBsZW5ndGggKyAxLCBPVVRTSVpFKGNyZWF0ZSkpOworCVVQQVJHKENPREFfQ1JFQVRFKTsKKworICAgICAgICBpbnAtPmNvZGFfY3JlYXRlLlZGaWQgPSAqZGlyZmlkOworICAgICAgICBpbnAtPmNvZGFfY3JlYXRlLmF0dHIudmFfbW9kZSA9IG1vZGU7CisJaW5wLT5jb2RhX2NyZWF0ZS5leGNsID0gZXhjbDsKKyAgICAgICAgaW5wLT5jb2RhX2NyZWF0ZS5tb2RlID0gbW9kZTsKKyAgICAgICAgaW5wLT5jb2RhX2NyZWF0ZS5uYW1lID0gb2Zmc2V0OworCisgICAgICAgIC8qIFZlbnVzIG11c3QgZ2V0IG51bGwgdGVybWluYXRlZCBzdHJpbmcgKi8KKyAgICAgICAgbWVtY3B5KChjaGFyICopKGlucCkgKyBvZmZzZXQsIG5hbWUsIGxlbmd0aCk7CisgICAgICAgICooKGNoYXIgKilpbnAgKyBvZmZzZXQgKyBsZW5ndGgpID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgZXJyb3IgPSBjb2RhX3VwY2FsbChjb2RhX3NicChzYiksIGluc2l6ZSwgJm91dHNpemUsIGlucCk7CisKKwkqYXR0cnMgPSBvdXRwLT5jb2RhX2NyZWF0ZS5hdHRyOworCSpuZXdmaWQgPSBvdXRwLT5jb2RhX2NyZWF0ZS5WRmlkOworCisJQ09EQV9GUkVFKGlucCwgaW5zaXplKTsKKwlyZXR1cm4gZXJyb3I7ICAgICAgICAKK30KKworaW50IHZlbnVzX3JtZGlyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBDb2RhRmlkICpkaXJmaWQsIAorCQkgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbmd0aCkKK3sKKyAgICAgICAgdW5pb24gaW5wdXRBcmdzICppbnA7CisgICAgICAgIHVuaW9uIG91dHB1dEFyZ3MgKm91dHA7CisgICAgICAgIGludCBpbnNpemUsIG91dHNpemUsIGVycm9yOworICAgICAgICBpbnQgb2Zmc2V0OworCisgICAgICAgIG9mZnNldCA9IElOU0laRShybWRpcik7CisJaW5zaXplID0gbWF4X3QodW5zaWduZWQgaW50LCBvZmZzZXQgKyBsZW5ndGggKyAxLCBPVVRTSVpFKHJtZGlyKSk7CisJVVBBUkcoQ09EQV9STURJUik7CisKKyAgICAgICAgaW5wLT5jb2RhX3JtZGlyLlZGaWQgPSAqZGlyZmlkOworICAgICAgICBpbnAtPmNvZGFfcm1kaXIubmFtZSA9IG9mZnNldDsKKyAgICAgICAgbWVtY3B5KChjaGFyICopKGlucCkgKyBvZmZzZXQsIG5hbWUsIGxlbmd0aCk7CisJKigoY2hhciAqKWlucCArIG9mZnNldCArIGxlbmd0aCkgPSAnXDAnOworICAgICAgICAKKyAgICAgICAgZXJyb3IgPSBjb2RhX3VwY2FsbChjb2RhX3NicChzYiksIGluc2l6ZSwgJm91dHNpemUsIGlucCk7CisKKwlDT0RBX0ZSRUUoaW5wLCBpbnNpemUpOworCXJldHVybiBlcnJvcjsKK30KKworaW50IHZlbnVzX3JlbW92ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqZGlyZmlkLCAKKwkJICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW5ndGgpCit7CisgICAgICAgIHVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOworICAgICAgICBpbnQgZXJyb3I9MCwgaW5zaXplLCBvdXRzaXplLCBvZmZzZXQ7CisKKyAgICAgICAgb2Zmc2V0ID0gSU5TSVpFKHJlbW92ZSk7CisJaW5zaXplID0gbWF4X3QodW5zaWduZWQgaW50LCBvZmZzZXQgKyBsZW5ndGggKyAxLCBPVVRTSVpFKHJlbW92ZSkpOworCVVQQVJHKENPREFfUkVNT1ZFKTsKKworICAgICAgICBpbnAtPmNvZGFfcmVtb3ZlLlZGaWQgPSAqZGlyZmlkOworICAgICAgICBpbnAtPmNvZGFfcmVtb3ZlLm5hbWUgPSBvZmZzZXQ7CisgICAgICAgIG1lbWNweSgoY2hhciAqKShpbnApICsgb2Zmc2V0LCBuYW1lLCBsZW5ndGgpOworCSooKGNoYXIgKilpbnAgKyBvZmZzZXQgKyBsZW5ndGgpID0gJ1wwJzsKKyAgICAgICAgCisgICAgICAgIGVycm9yID0gY29kYV91cGNhbGwoY29kYV9zYnAoc2IpLCBpbnNpemUsICZvdXRzaXplLCBpbnApOworCisJQ09EQV9GUkVFKGlucCwgaW5zaXplKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludCB2ZW51c19yZWFkbGluayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqZmlkLCAKKwkJICAgICAgY2hhciAqYnVmZmVyLCBpbnQgKmxlbmd0aCkKK3sgCisgICAgICAgIHVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOworICAgICAgICBpbnQgaW5zaXplLCBvdXRzaXplLCBlcnJvcjsKKyAgICAgICAgaW50IHJldGxlbjsKKyAgICAgICAgY2hhciAqcmVzdWx0OworICAgICAgICAKKwlpbnNpemUgPSBtYXhfdCh1bnNpZ25lZCBpbnQsCisJCSAgICAgSU5TSVpFKHJlYWRsaW5rKSwgT1VUU0laRShyZWFkbGluaykrICpsZW5ndGggKyAxKTsKKwlVUEFSRyhDT0RBX1JFQURMSU5LKTsKKworICAgICAgICBpbnAtPmNvZGFfcmVhZGxpbmsuVkZpZCA9ICpmaWQ7CisgICAgCisgICAgICAgIGVycm9yID0gIGNvZGFfdXBjYWxsKGNvZGFfc2JwKHNiKSwgaW5zaXplLCAmb3V0c2l6ZSwgaW5wKTsKKwkKKwlpZiAoISBlcnJvcikgeworICAgICAgICAgICAgICAgIHJldGxlbiA9IG91dHAtPmNvZGFfcmVhZGxpbmsuY291bnQ7CisJCWlmICggcmV0bGVuID4gKmxlbmd0aCApCisJCSAgICAgICAgcmV0bGVuID0gKmxlbmd0aDsKKwkJKmxlbmd0aCA9IHJldGxlbjsKKwkJcmVzdWx0ID0gIChjaGFyICopb3V0cCArIChsb25nKW91dHAtPmNvZGFfcmVhZGxpbmsuZGF0YTsKKwkJbWVtY3B5KGJ1ZmZlciwgcmVzdWx0LCByZXRsZW4pOworCQkqKGJ1ZmZlciArIHJldGxlbikgPSAnXDAnOworCX0KKyAgICAgICAgCisgICAgICAgIENPREFfRlJFRShpbnAsIGluc2l6ZSk7CisgICAgICAgIHJldHVybiBlcnJvcjsKK30KKworCisKK2ludCB2ZW51c19saW5rKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBDb2RhRmlkICpmaWQsIAorCQkgIHN0cnVjdCBDb2RhRmlkICpkaXJmaWQsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4gKQoreworICAgICAgICB1bmlvbiBpbnB1dEFyZ3MgKmlucDsKKyAgICAgICAgdW5pb24gb3V0cHV0QXJncyAqb3V0cDsKKyAgICAgICAgaW50IGluc2l6ZSwgb3V0c2l6ZSwgZXJyb3I7CisgICAgICAgIGludCBvZmZzZXQ7CisKKwlvZmZzZXQgPSBJTlNJWkUobGluayk7CisJaW5zaXplID0gbWF4X3QodW5zaWduZWQgaW50LCBvZmZzZXQgICsgbGVuICsgMSwgT1VUU0laRShsaW5rKSk7CisgICAgICAgIFVQQVJHKENPREFfTElOSyk7CisKKyAgICAgICAgaW5wLT5jb2RhX2xpbmsuc291cmNlRmlkID0gKmZpZDsKKyAgICAgICAgaW5wLT5jb2RhX2xpbmsuZGVzdEZpZCA9ICpkaXJmaWQ7CisgICAgICAgIGlucC0+Y29kYV9saW5rLnRuYW1lID0gb2Zmc2V0OworCisgICAgICAgIC8qIG1ha2Ugc3VyZSBzdHJpbmdzIGFyZSBudWxsIHRlcm1pbmF0ZWQgKi8KKyAgICAgICAgbWVtY3B5KChjaGFyICopKGlucCkgKyBvZmZzZXQsIG5hbWUsIGxlbik7CisgICAgICAgICooKGNoYXIgKilpbnAgKyBvZmZzZXQgKyBsZW4pID0gJ1wwJzsKKyAgICAgICAgCisgICAgICAgIGVycm9yID0gY29kYV91cGNhbGwoY29kYV9zYnAoc2IpLCBpbnNpemUsICZvdXRzaXplLCBpbnApOworCisJQ09EQV9GUkVFKGlucCwgaW5zaXplKTsKKyAgICAgICAgcmV0dXJuIGVycm9yOworfQorCitpbnQgdmVudXNfc3ltbGluayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqZmlkLAorCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sCisJCSAgICAgY29uc3QgY2hhciAqc3ltbmFtZSwgaW50IHN5bWxlbikKK3sKKyAgICAgICAgdW5pb24gaW5wdXRBcmdzICppbnA7CisgICAgICAgIHVuaW9uIG91dHB1dEFyZ3MgKm91dHA7CisgICAgICAgIGludCBpbnNpemUsIG91dHNpemUsIGVycm9yOworICAgICAgICBpbnQgb2Zmc2V0LCBzOworCisgICAgICAgIG9mZnNldCA9IElOU0laRShzeW1saW5rKTsKKwlpbnNpemUgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIG9mZnNldCArIGxlbiArIHN5bWxlbiArIDgsIE9VVFNJWkUoc3ltbGluaykpOworCVVQQVJHKENPREFfU1lNTElOSyk7CisgICAgICAgIAorICAgICAgICAvKiAgICAgICAgaW5wLT5jb2RhX3N5bWxpbmsuYXR0ciA9ICp0dmE7IFhYWFhYWCAqLyAKKyAgICAgICAgaW5wLT5jb2RhX3N5bWxpbmsuVkZpZCA9ICpmaWQ7CisKKwkvKiBSb3VuZCB1cCB0byB3b3JkIGJvdW5kYXJ5IGFuZCBudWxsIHRlcm1pbmF0ZSAqLworICAgICAgICBpbnAtPmNvZGFfc3ltbGluay5zcmNuYW1lID0gb2Zmc2V0OworICAgICAgICBzID0gKCBzeW1sZW4gICYgfjB4MyApICsgNDsgCisgICAgICAgIG1lbWNweSgoY2hhciAqKShpbnApICsgb2Zmc2V0LCBzeW1uYW1lLCBzeW1sZW4pOworICAgICAgICAqKChjaGFyICopaW5wICsgb2Zmc2V0ICsgc3ltbGVuKSA9ICdcMCc7CisgICAgICAgIAorCS8qIFJvdW5kIHVwIHRvIHdvcmQgYm91bmRhcnkgYW5kIG51bGwgdGVybWluYXRlICovCisgICAgICAgIG9mZnNldCArPSBzOworICAgICAgICBpbnAtPmNvZGFfc3ltbGluay50bmFtZSA9IG9mZnNldDsKKyAgICAgICAgcyA9IChsZW4gJiB+MHgzKSArIDQ7CisgICAgICAgIG1lbWNweSgoY2hhciAqKShpbnApICsgb2Zmc2V0LCBuYW1lLCBsZW4pOworICAgICAgICAqKChjaGFyICopaW5wICsgb2Zmc2V0ICsgbGVuKSA9ICdcMCc7CisKKwllcnJvciA9IGNvZGFfdXBjYWxsKGNvZGFfc2JwKHNiKSwgaW5zaXplLCAmb3V0c2l6ZSwgaW5wKTsKKworCUNPREFfRlJFRShpbnAsIGluc2l6ZSk7CisgICAgICAgIHJldHVybiBlcnJvcjsKK30KKworaW50IHZlbnVzX2ZzeW5jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBDb2RhRmlkICpmaWQpCit7CisgICAgICAgIHVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOyAKKwlpbnQgaW5zaXplLCBvdXRzaXplLCBlcnJvcjsKKwkKKwlpbnNpemU9U0laRShmc3luYyk7CisJVVBBUkcoQ09EQV9GU1lOQyk7CisKKyAgICAgICAgaW5wLT5jb2RhX2ZzeW5jLlZGaWQgPSAqZmlkOworICAgICAgICBlcnJvciA9IGNvZGFfdXBjYWxsKGNvZGFfc2JwKHNiKSwgc2l6ZW9mKHVuaW9uIGlucHV0QXJncyksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRzaXplLCBpbnApOworCisJQ09EQV9GUkVFKGlucCwgaW5zaXplKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludCB2ZW51c19hY2Nlc3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IENvZGFGaWQgKmZpZCwgaW50IG1hc2spCit7CisgICAgICAgIHVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOyAKKwlpbnQgaW5zaXplLCBvdXRzaXplLCBlcnJvcjsKKworCWluc2l6ZSA9IFNJWkUoYWNjZXNzKTsKKwlVUEFSRyhDT0RBX0FDQ0VTUyk7CisKKyAgICAgICAgaW5wLT5jb2RhX2FjY2Vzcy5WRmlkID0gKmZpZDsKKyAgICAgICAgaW5wLT5jb2RhX2FjY2Vzcy5mbGFncyA9IG1hc2s7CisKKwllcnJvciA9IGNvZGFfdXBjYWxsKGNvZGFfc2JwKHNiKSwgaW5zaXplLCAmb3V0c2l6ZSwgaW5wKTsKKworCUNPREFfRlJFRShpbnAsIGluc2l6ZSk7CisJcmV0dXJuIGVycm9yOworfQorCisKK2ludCB2ZW51c19waW9jdGwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IENvZGFGaWQgKmZpZCwKKwkJIHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBQaW9jdGxEYXRhICpkYXRhKQoreworICAgICAgICB1bmlvbiBpbnB1dEFyZ3MgKmlucDsKKyAgICAgICAgdW5pb24gb3V0cHV0QXJncyAqb3V0cDsgIAorCWludCBpbnNpemUsIG91dHNpemUsIGVycm9yOworCWludCBpb2NzaXplOworCisJaW5zaXplID0gVkNfTUFYTVNHU0laRTsKKwlVUEFSRyhDT0RBX0lPQ1RMKTsKKworICAgICAgICAvKiBidWlsZCBwYWNrZXQgZm9yIFZlbnVzICovCisgICAgICAgIGlmIChkYXRhLT52aS5pbl9zaXplID4gVkNfTUFYREFUQVNJWkUpIHsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGF0YS0+dmkub3V0X3NpemUgPiBWQ19NQVhEQVRBU0laRSkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKyAgICAgICAgaW5wLT5jb2RhX2lvY3RsLlZGaWQgPSAqZmlkOworICAgIAorICAgICAgICAvKiB0aGUgY21kIGZpZWxkIHdhcyBtdXRhdGVkIGJ5IGluY3JlYXNpbmcgaXRzIHNpemUgZmllbGQgdG8KKyAgICAgICAgICogcmVmbGVjdCB0aGUgcGF0aCBhbmQgZm9sbG93IGFyZ3MuIFdlIG5lZWQgdG8gc3VidHJhY3QgdGhhdAorICAgICAgICAgKiBvdXQgYmVmb3JlIHNlbmRpbmcgdGhlIGNvbW1hbmQgdG8gVmVudXMuICAqLworICAgICAgICBpbnAtPmNvZGFfaW9jdGwuY21kID0gKGNtZCAmIH4oUElPQ1BBUk1fTUFTSyA8PCAxNikpOwkKKyAgICAgICAgaW9jc2l6ZSA9ICgoY21kID4+IDE2KSAmIFBJT0NQQVJNX01BU0spIC0gc2l6ZW9mKGNoYXIgKikgLSBzaXplb2YoaW50KTsKKyAgICAgICAgaW5wLT5jb2RhX2lvY3RsLmNtZCB8PSAoaW9jc2l6ZSAmIFBJT0NQQVJNX01BU0spIDw8CTE2OwkKKyAgICAKKyAgICAgICAgLyogaW4tPmNvZGFfaW9jdGwucndmbGFnID0gZmxhZzsgKi8KKyAgICAgICAgaW5wLT5jb2RhX2lvY3RsLmxlbiA9IGRhdGEtPnZpLmluX3NpemU7CisgICAgICAgIGlucC0+Y29kYV9pb2N0bC5kYXRhID0gKGNoYXIgKikoSU5TSVpFKGlvY3RsKSk7CisgICAgIAorICAgICAgICAvKiBnZXQgdGhlIGRhdGEgb3V0IG9mIHVzZXIgc3BhY2UgKi8KKyAgICAgICAgaWYgKCBjb3B5X2Zyb21fdXNlcigoY2hhciopaW5wICsgKGxvbmcpaW5wLT5jb2RhX2lvY3RsLmRhdGEsCisJCQkgICAgZGF0YS0+dmkuaW4sIGRhdGEtPnZpLmluX3NpemUpICkgeworCQllcnJvciA9IC1FSU5WQUw7CisJICAgICAgICBnb3RvIGV4aXQ7CisJfQorCisgICAgICAgIGVycm9yID0gY29kYV91cGNhbGwoY29kYV9zYnAoc2IpLCBTSVpFKGlvY3RsKSArIGRhdGEtPnZpLmluX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHNpemUsIGlucCk7CisgICAgICAgIAorICAgICAgICBpZiAoZXJyb3IpIHsKKwkgICAgICAgIHByaW50aygiY29kYV9waW9jdGw6IFZlbnVzIHJldHVybnM6ICVkIGZvciAlc1xuIiwgCisJCSAgICAgICBlcnJvciwgY29kYV9mMnMoZmlkKSk7CisJCWdvdG8gZXhpdDsgCisJfQorCisJaWYgKG91dHNpemUgPCAobG9uZylvdXRwLT5jb2RhX2lvY3RsLmRhdGEgKyBvdXRwLT5jb2RhX2lvY3RsLmxlbikgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisgICAgICAgIAorCS8qIENvcHkgb3V0IHRoZSBPVVQgYnVmZmVyLiAqLworICAgICAgICBpZiAob3V0cC0+Y29kYV9pb2N0bC5sZW4gPiBkYXRhLT52aS5vdXRfc2l6ZSkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKyAgICAgICAgfQorCisJLyogQ29weSBvdXQgdGhlIE9VVCBidWZmZXIuICovCisJaWYgKGNvcHlfdG9fdXNlcihkYXRhLT52aS5vdXQsCisJCQkgKGNoYXIgKilvdXRwICsgKGxvbmcpb3V0cC0+Y29kYV9pb2N0bC5kYXRhLAorCQkJIG91dHAtPmNvZGFfaW9jdGwubGVuKSkgeworCQllcnJvciA9IC1FRkFVTFQ7CisJCWdvdG8gZXhpdDsKKwl9CisKKyBleGl0OgorCUNPREFfRlJFRShpbnAsIGluc2l6ZSk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgdmVudXNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpzZnMpIAoreyAKKyAgICAgICAgdW5pb24gaW5wdXRBcmdzICppbnA7CisgICAgICAgIHVuaW9uIG91dHB1dEFyZ3MgKm91dHA7CisgICAgICAgIGludCBpbnNpemUsIG91dHNpemUsIGVycm9yOworICAgICAgICAKKwlpbnNpemUgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIElOU0laRShzdGF0ZnMpLCBPVVRTSVpFKHN0YXRmcykpOworCVVQQVJHKENPREFfU1RBVEZTKTsKKworICAgICAgICBlcnJvciA9IGNvZGFfdXBjYWxsKGNvZGFfc2JwKHNiKSwgaW5zaXplLCAmb3V0c2l6ZSwgaW5wKTsKKwkKKyAgICAgICAgaWYgKCFlcnJvcikgeworCQlzZnMtPmZfYmxvY2tzID0gb3V0cC0+Y29kYV9zdGF0ZnMuc3RhdC5mX2Jsb2NrczsKKwkJc2ZzLT5mX2JmcmVlICA9IG91dHAtPmNvZGFfc3RhdGZzLnN0YXQuZl9iZnJlZTsKKwkJc2ZzLT5mX2JhdmFpbCA9IG91dHAtPmNvZGFfc3RhdGZzLnN0YXQuZl9iYXZhaWw7CisJCXNmcy0+Zl9maWxlcyAgPSBvdXRwLT5jb2RhX3N0YXRmcy5zdGF0LmZfZmlsZXM7CisJCXNmcy0+Zl9mZnJlZSAgPSBvdXRwLT5jb2RhX3N0YXRmcy5zdGF0LmZfZmZyZWU7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJjb2RhX3N0YXRmczogVmVudXMgcmV0dXJuczogJWRcbiIsIGVycm9yKTsKKwl9CisKKyAgICAgICAgQ09EQV9GUkVFKGlucCwgaW5zaXplKTsKKyAgICAgICAgcmV0dXJuIGVycm9yOworfQorCisvKgorICogY29kYV91cGNhbGwgYW5kIGNvZGFfZG93bmNhbGwgcm91dGluZXMuCisgKiAKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgY29kYV93YWl0Zm9yX3VwY2FsbChzdHJ1Y3QgdXBjX3JlcSAqdm1wLAorCQkJCSAgICAgICBzdHJ1Y3QgdmVudXNfY29tbSAqdmNvbW1wKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJdm1wLT51Y19wb3N0dGltZSA9IGppZmZpZXM7CisKKwlhZGRfd2FpdF9xdWV1ZSgmdm1wLT51Y19zbGVlcCwgJndhaXQpOworCWZvciAoOzspIHsKKwkJaWYgKCAhY29kYV9oYXJkICYmIHZtcC0+dWNfb3Bjb2RlICE9IENPREFfQ0xPU0UgKSAKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWVsc2UKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKworICAgICAgICAgICAgICAgIC8qIHZlbnVzIGRpZWQgKi8KKyAgICAgICAgICAgICAgICBpZiAoICF2Y29tbXAtPnZjX2ludXNlICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJCS8qIGdvdCBhIHJlcGx5ICovCisJCWlmICggdm1wLT51Y19mbGFncyAmICggUkVRX1dSSVRFIHwgUkVRX0FCT1JUICkgKQorCQkJYnJlYWs7CisKKwkJaWYgKCAhY29kYV9oYXJkICYmIHZtcC0+dWNfb3Bjb2RlICE9IENPREFfQ0xPU0UgJiYgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgKSB7CisJCQkvKiBpZiB0aGlzIHByb2Nlc3MgcmVhbGx5IHdhbnRzIHRvIGRpZSwgbGV0IGl0IGdvICovCisJCQlpZiAoIHNpZ2lzbWVtYmVyKCYoY3VycmVudC0+cGVuZGluZy5zaWduYWwpLCBTSUdLSUxMKSB8fAorCQkJICAgICBzaWdpc21lbWJlcigmKGN1cnJlbnQtPnBlbmRpbmcuc2lnbmFsKSwgU0lHSU5UKSApCisJCQkJYnJlYWs7CisJCQkvKiBzaWduYWwgaXMgcHJlc2VudDogYWZ0ZXIgdGltZW91dCBhbHdheXMgcmV0dXJuIAorCQkJICAgcmVhbGx5IHNtYXJ0IGlkZWEsIHByb2JhYmx5IHVzZWxlc3MgLi4uICovCisJCQlpZiAoIGppZmZpZXMgLSB2bXAtPnVjX3Bvc3R0aW1lID4gY29kYV90aW1lb3V0ICogSFogKQorCQkJCWJyZWFrOyAKKwkJfQorCQlzY2hlZHVsZSgpOworCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmdm1wLT51Y19zbGVlcCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwlyZXR1cm47Cit9CisKKworLyogCisgKiBjb2RhX3VwY2FsbCB3aWxsIHJldHVybiBhbiBlcnJvciBpbiB0aGUgY2FzZSBvZiAKKyAqIGZhaWxlZCBjb21tdW5pY2F0aW9uIHdpdGggVmVudXMgX29yXyB3aWxsIHBlZWsgYXQgVmVudXMKKyAqIHJlcGx5IGFuZCByZXR1cm4gVmVudXMnIGVycm9yLgorICoKKyAqIEFzIHZlbnVzIGhhcyAyIHR5cGVzIG9mIGVycm9ycywgbm9ybWFsIGVycm9ycyAocG9zaXRpdmUpIGFuZCBpbnRlcm5hbAorICogZXJyb3JzIChuZWdhdGl2ZSksIG5vcm1hbCBlcnJvcnMgYXJlIG5lZ2F0ZWQsIHdoaWxlIGludGVybmFsIGVycm9ycworICogYXJlIGFsbCBtYXBwZWQgdG8gLUVJTlRSLCB3aGlsZSBzaG93aW5nIGEgbmljZSB3YXJuaW5nIG1lc3NhZ2UuIChqaCkKKyAqIAorICovCitzdGF0aWMgaW50IGNvZGFfdXBjYWxsKHN0cnVjdCBjb2RhX3NiX2luZm8gKnNiaSwgCisJCWludCBpblNpemUsIGludCAqb3V0U2l6ZSwgCisJCXVuaW9uIGlucHV0QXJncyAqYnVmZmVyKSAKK3sKKwlzdHJ1Y3QgdmVudXNfY29tbSAqdmNvbW1wOworCXVuaW9uIG91dHB1dEFyZ3MgKm91dDsKKwlzdHJ1Y3QgdXBjX3JlcSAqcmVxOworCWludCBlcnJvciA9IDA7CisKKwl2Y29tbXAgPSBzYmktPnNiaV92Y29tbTsKKwlpZiAoICF2Y29tbXAtPnZjX2ludXNlICkgeworCQlwcmludGsoIk5vIHBzZXVkbyBkZXZpY2UgaW4gdXBjYWxsIGNvbW1zIGF0ICVwXG4iLCB2Y29tbXApOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5YSU87CisJfQorCisJLyogRm9ybWF0IHRoZSByZXF1ZXN0IG1lc3NhZ2UuICovCisJcmVxID0gdXBjX2FsbG9jKCk7CisJaWYgKCFyZXEpIHsKKwkJcHJpbnRrKCJGYWlsZWQgdG8gYWxsb2NhdGUgdXBjX3JlcSBzdHJ1Y3R1cmVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmVxLT51Y19kYXRhID0gKHZvaWQgKilidWZmZXI7CisJcmVxLT51Y19mbGFncyA9IDA7CisJcmVxLT51Y19pblNpemUgPSBpblNpemU7CisJcmVxLT51Y19vdXRTaXplID0gKm91dFNpemUgPyAqb3V0U2l6ZSA6IGluU2l6ZTsKKwlyZXEtPnVjX29wY29kZSA9ICgodW5pb24gaW5wdXRBcmdzICopYnVmZmVyKS0+aWgub3Bjb2RlOworCXJlcS0+dWNfdW5pcXVlID0gKyt2Y29tbXAtPnZjX3NlcTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZyZXEtPnVjX3NsZWVwKTsKKwkKKwkvKiBGaWxsIGluIHRoZSBjb21tb24gaW5wdXQgYXJncy4gKi8KKwkoKHVuaW9uIGlucHV0QXJncyAqKWJ1ZmZlciktPmloLnVuaXF1ZSA9IHJlcS0+dWNfdW5pcXVlOworCisJLyogQXBwZW5kIG1zZyB0byBwZW5kaW5nIHF1ZXVlIGFuZCBwb2tlIFZlbnVzLiAqLworCWxpc3RfYWRkKCYocmVxLT51Y19jaGFpbiksIHZjb21tcC0+dmNfcGVuZGluZy5wcmV2KTsKKyAgICAgICAgCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ2Y29tbXAtPnZjX3dhaXRxKTsKKwkvKiBXZSBjYW4gYmUgaW50ZXJydXB0ZWQgd2hpbGUgd2Ugd2FpdCBmb3IgVmVudXMgdG8gcHJvY2VzcworCSAqIG91ciByZXF1ZXN0LiAgSWYgdGhlIGludGVycnVwdCBvY2N1cnMgYmVmb3JlIFZlbnVzIGhhcyByZWFkCisJICogdGhlIHJlcXVlc3QsIHdlIGRlcXVldWUgYW5kIHJldHVybi4gSWYgaXQgb2NjdXJzIGFmdGVyIHRoZQorCSAqIHJlYWQgYnV0IGJlZm9yZSB0aGUgcmVwbHksIHdlIGRlcXVldWUsIHNlbmQgYSBzaWduYWwKKwkgKiBtZXNzYWdlLCBhbmQgcmV0dXJuLiBJZiBpdCBvY2N1cnMgYWZ0ZXIgdGhlIHJlcGx5IHdlIGlnbm9yZQorCSAqIGl0LiBJbiBubyBjYXNlIGRvIHdlIHdhbnQgdG8gcmVzdGFydCB0aGUgc3lzY2FsbC4gIElmIGl0CisJICogd2FzIGludGVycnVwdGVkIGJ5IGEgdmVudXMgc2h1dGRvd24gKHBzZGV2X2Nsb3NlKSwgcmV0dXJuCisJICogRU5PREVWLiAgKi8KKworCS8qIEdvIHRvIHNsZWVwLiAgV2FrZSB1cCBvbiBzaWduYWxzIG9ubHkgYWZ0ZXIgdGhlIHRpbWVvdXQuICovCisJY29kYV93YWl0Zm9yX3VwY2FsbChyZXEsIHZjb21tcCk7CisKKwlpZiAodmNvbW1wLT52Y19pbnVzZSkgeyAgICAgIC8qIGkuZS4gVmVudXMgaXMgc3RpbGwgYWxpdmUgKi8KKwkgICAgLyogT3Agd2VudCB0aHJvdWdoLCBpbnRlcnJ1cHQgb3Igbm90Li4uICovCisJICAgIGlmIChyZXEtPnVjX2ZsYWdzICYgUkVRX1dSSVRFKSB7CisJCW91dCA9ICh1bmlvbiBvdXRwdXRBcmdzICopcmVxLT51Y19kYXRhOworCQkvKiBoZXJlIHdlIG1hcCBwb3NpdGl2ZSBWZW51cyBlcnJvcnMgdG8ga2VybmVsIGVycm9ycyAqLworCQllcnJvciA9IC1vdXQtPm9oLnJlc3VsdDsKKwkJKm91dFNpemUgPSByZXEtPnVjX291dFNpemU7CisJCWdvdG8gZXhpdDsKKwkgICAgfQorCSAgICBpZiAoICEocmVxLT51Y19mbGFncyAmIFJFUV9SRUFEKSAmJiBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeyAKKwkJLyogSW50ZXJydXB0ZWQgYmVmb3JlIHZlbnVzIHJlYWQgaXQuICovCisJCWxpc3RfZGVsKCYocmVxLT51Y19jaGFpbikpOworCQkvKiBwZXJoYXBzIHRoZSBiZXN0IHdheSB0byBjb252aW5jZSB0aGUgYXBwIHRvCisJCSAgIGdpdmUgdXA/ICovCisJCWVycm9yID0gLUVJTlRSOworCQlnb3RvIGV4aXQ7CisJICAgIH0gCisJICAgIGlmICggKHJlcS0+dWNfZmxhZ3MgJiBSRVFfUkVBRCkgJiYgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgKSB7CisJCSAgICAvKiBpbnRlcnJ1cHRlZCBhZnRlciBWZW51cyBkaWQgaXRzIHJlYWQsIHNlbmQgc2lnbmFsICovCisJCSAgICB1bmlvbiBpbnB1dEFyZ3MgKnNpZ19pbnB1dEFyZ3M7CisJCSAgICBzdHJ1Y3QgdXBjX3JlcSAqc2lnX3JlcTsKKwkJICAgIAorCQkgICAgbGlzdF9kZWwoJihyZXEtPnVjX2NoYWluKSk7CisJCSAgICBlcnJvciA9IC1FTk9NRU07CisJCSAgICBzaWdfcmVxID0gdXBjX2FsbG9jKCk7CisJCSAgICBpZiAoIXNpZ19yZXEpIGdvdG8gZXhpdDsKKworCQkgICAgQ09EQV9BTExPQygoc2lnX3JlcS0+dWNfZGF0YSksIGNoYXIgKiwgc2l6ZW9mKHN0cnVjdCBjb2RhX2luX2hkcikpOworCQkgICAgaWYgKCFzaWdfcmVxLT51Y19kYXRhKSB7CisJCQl1cGNfZnJlZShzaWdfcmVxKTsKKwkJCWdvdG8gZXhpdDsKKwkJICAgIH0KKwkJICAgIAorCQkgICAgZXJyb3IgPSAtRUlOVFI7CisJCSAgICBzaWdfaW5wdXRBcmdzID0gKHVuaW9uIGlucHV0QXJncyAqKXNpZ19yZXEtPnVjX2RhdGE7CisJCSAgICBzaWdfaW5wdXRBcmdzLT5paC5vcGNvZGUgPSBDT0RBX1NJR05BTDsKKwkJICAgIHNpZ19pbnB1dEFyZ3MtPmloLnVuaXF1ZSA9IHJlcS0+dWNfdW5pcXVlOworCQkgICAgCisJCSAgICBzaWdfcmVxLT51Y19mbGFncyA9IFJFUV9BU1lOQzsKKwkJICAgIHNpZ19yZXEtPnVjX29wY29kZSA9IHNpZ19pbnB1dEFyZ3MtPmloLm9wY29kZTsKKwkJICAgIHNpZ19yZXEtPnVjX3VuaXF1ZSA9IHNpZ19pbnB1dEFyZ3MtPmloLnVuaXF1ZTsKKwkJICAgIHNpZ19yZXEtPnVjX2luU2l6ZSA9IHNpemVvZihzdHJ1Y3QgY29kYV9pbl9oZHIpOworCQkgICAgc2lnX3JlcS0+dWNfb3V0U2l6ZSA9IHNpemVvZihzdHJ1Y3QgY29kYV9pbl9oZHIpOworCQkgICAgCisJCSAgICAvKiBpbnNlcnQgYXQgaGVhZCBvZiBxdWV1ZSEgKi8KKwkJICAgIGxpc3RfYWRkKCYoc2lnX3JlcS0+dWNfY2hhaW4pLCAmdmNvbW1wLT52Y19wZW5kaW5nKTsKKwkJICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmdmNvbW1wLT52Y193YWl0cSk7CisJICAgIH0gZWxzZSB7CisJCSAgICBwcmludGsoIkNvZGE6IFN0cmFuZ2UgaW50ZXJydXB0aW9uLi5cbiIpOworCQkgICAgZXJyb3IgPSAtRUlOVFI7CisJICAgIH0KKwl9IGVsc2UgewkvKiBJZiB2ZW51cyBkaWVkIGkuZS4gIVZDX09QRU4odmNvbW1wKSAqLworCSAgICAgICAgcHJpbnRrKCJjb2RhX3VwY2FsbDogVmVudXMgZGVhZCBvbiAob3AsdW4pICglZC4lZCkgZmxhZ3MgJWRcbiIsCisJCSAgICAgICByZXEtPnVjX29wY29kZSwgcmVxLT51Y191bmlxdWUsIHJlcS0+dWNfZmxhZ3MpOworCQllcnJvciA9IC1FTk9ERVY7CisJfQorCisgZXhpdDoKKwl1cGNfZnJlZShyZXEpOworCXJldHVybiBlcnJvcjsKK30KKworLyogIAorICAgIFRoZSBzdGF0ZW1lbnRzIGJlbG93IGFyZSBwYXJ0IG9mIHRoZSBDb2RhIG9wcG9ydHVuaXN0aWMKKyAgICBwcm9ncmFtbWluZyAtLSB0YWtlbiBmcm9tIHRoZSBNYWNoL0JTRCBrZXJuZWwgY29kZSBmb3IgQ29kYS4gCisgICAgWW91IGRvbid0IGdldCBjb3JyZWN0IHNlbWFudGljcyBieSBzdGF0aW5nIHdoYXQgbmVlZHMgdG8gYmUKKyAgICBkb25lIHdpdGhvdXQgZ3VhcmFudGVlaW5nIHRoZSBpbnZhcmlhbnRzIG5lZWRlZCBmb3IgaXQgdG8gaGFwcGVuLgorICAgIFdoZW4gd2lsbCBiZSBoYXZlIHRpbWUgdG8gZmluZCBvdXQgd2hhdCBleGFjdGx5IGlzIGdvaW5nIG9uPyAgKHBqYikKKyovCisKKworLyogCisgKiBUaGVyZSBhcmUgNyBjYXNlcyB3aGVyZSBjYWNoZSBpbnZhbGlkYXRpb25zIG9jY3VyLiAgVGhlIHNlbWFudGljcworICogIG9mIGVhY2ggaXMgbGlzdGVkIGhlcmU6CisgKgorICogQ09EQV9GTFVTSCAgICAgLS0gZmx1c2ggYWxsIGVudHJpZXMgZnJvbSB0aGUgbmFtZSBjYWNoZSBhbmQgdGhlIGNub2RlIGNhY2hlLgorICogQ09EQV9QVVJHRVVTRVIgLS0gZmx1c2ggYWxsIGVudHJpZXMgZnJvbSB0aGUgbmFtZSBjYWNoZSBmb3IgYSBzcGVjaWZpYyB1c2VyCisgKiAgICAgICAgICAgICAgICAgIFRoaXMgY2FsbCBpcyBhIHJlc3VsdCBvZiB0b2tlbiBleHBpcmF0aW9uLgorICoKKyAqIFRoZSBuZXh0IGFyaXNlIGFzIHRoZSByZXN1bHQgb2YgY2FsbGJhY2tzIG9uIGEgZmlsZSBvciBkaXJlY3RvcnkuCisgKiBDT0RBX1pBUEZJTEUgICAtLSBmbHVzaCB0aGUgY2FjaGVkIGF0dHJpYnV0ZXMgZm9yIGEgZmlsZS4KKworICogQ09EQV9aQVBESVIgICAgLS0gZmx1c2ggdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBkaXIgYW5kCisgKiAgICAgICAgICAgICAgICAgIGZvcmNlIGEgbmV3IGxvb2t1cCBmb3IgYWxsIHRoZSBjaGlsZHJlbgorICAgICAgICAgICAgICAgICAgICBvZiB0aGlzIGRpci4KKworICoKKyAqIFRoZSBuZXh0IGlzIGEgcmVzdWx0IG9mIFZlbnVzIGRldGVjdGluZyBhbiBpbmNvbnNpc3RlbnQgZmlsZS4KKyAqIENPREFfUFVSR0VGSUQgIC0tIGZsdXNoIHRoZSBhdHRyaWJ1dGUgZm9yIHRoZSBmaWxlCisgKiAgICAgICAgICAgICAgICAgIHB1cmdlIGl0IGFuZCBpdHMgY2hpbGRyZW4gZnJvbSB0aGUgZGNhY2hlCisgKgorICogVGhlIGxhc3QgIGFsbG93cyBWZW51cyB0byByZXBsYWNlIGxvY2FsIGZpZHMgd2l0aCBnbG9iYWwgb25lcworICogZHVyaW5nIHJlaW50ZWdyYXRpb24uCisgKgorICogQ09EQV9SRVBMQUNFIC0tIHJlcGxhY2Ugb25lIENvZGFGaWQgd2l0aCBhbm90aGVyIHRocm91Z2hvdXQgdGhlIG5hbWUgY2FjaGUgKi8KKworaW50IGNvZGFfZG93bmNhbGwoaW50IG9wY29kZSwgdW5pb24gb3V0cHV0QXJncyAqIG91dCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwkvKiBIYW5kbGUgaW52YWxpZGF0aW9uIHJlcXVlc3RzLiAqLworICAgICAgICAgIGlmICggIXNiIHx8ICFzYi0+c19yb290IHx8ICFzYi0+c19yb290LT5kX2lub2RlKQorCQkgIHJldHVybiAwOyAKKworCSAgc3dpdGNoIChvcGNvZGUpIHsKKworCSAgY2FzZSBDT0RBX0ZMVVNIIDogeworCQkgICBjb2RhX2NhY2hlX2NsZWFyX2FsbChzYik7CisJCSAgIHNocmlua19kY2FjaGVfc2Ioc2IpOworCQkgICBjb2RhX2ZsYWdfaW5vZGUoc2ItPnNfcm9vdC0+ZF9pbm9kZSwgQ19GTFVTSCk7CisJCSAgIHJldHVybigwKTsKKwkgIH0KKworCSAgY2FzZSBDT0RBX1BVUkdFVVNFUiA6IHsKKwkJICAgY29kYV9jYWNoZV9jbGVhcl9hbGwoc2IpOworCQkgICByZXR1cm4oMCk7CisJICB9CisKKwkgIGNhc2UgQ09EQV9aQVBESVIgOiB7CisJICAgICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGU7CisJCSAgc3RydWN0IENvZGFGaWQgKmZpZCA9ICZvdXQtPmNvZGFfemFwZGlyLkNvZGFGaWQ7CisKKwkJICBpbm9kZSA9IGNvZGFfZmlkX3RvX2lub2RlKGZpZCwgc2IpOworCQkgIGlmIChpbm9kZSkgeworCQkJICBjb2RhX2ZsYWdfaW5vZGVfY2hpbGRyZW4oaW5vZGUsIENfUFVSR0UpOworCSAgICAgICAgICAgICAgICAgIGNvZGFfZmxhZ19pbm9kZShpbm9kZSwgQ19WQVRUUik7CisJCQkgIGlwdXQoaW5vZGUpOworCQkgIH0KKwkJICAKKwkJICByZXR1cm4oMCk7CisJICB9CisKKwkgIGNhc2UgQ09EQV9aQVBGSUxFIDogeworCSAgICAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlOworCQkgIHN0cnVjdCBDb2RhRmlkICpmaWQgPSAmb3V0LT5jb2RhX3phcGZpbGUuQ29kYUZpZDsKKwkJICBpbm9kZSA9IGNvZGFfZmlkX3RvX2lub2RlKGZpZCwgc2IpOworCQkgIGlmICggaW5vZGUgKSB7CisJICAgICAgICAgICAgICAgICAgY29kYV9mbGFnX2lub2RlKGlub2RlLCBDX1ZBVFRSKTsKKwkJCSAgaXB1dChpbm9kZSk7CisJCSAgfQorCQkgIHJldHVybiAwOworCSAgfQorCisJICBjYXNlIENPREFfUFVSR0VGSUQgOiB7CisJICAgICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGU7CisJCSAgc3RydWN0IENvZGFGaWQgKmZpZCA9ICZvdXQtPmNvZGFfcHVyZ2VmaWQuQ29kYUZpZDsKKwkJICBpbm9kZSA9IGNvZGFfZmlkX3RvX2lub2RlKGZpZCwgc2IpOworCQkgIGlmICggaW5vZGUgKSB7IAorCQkJY29kYV9mbGFnX2lub2RlX2NoaWxkcmVuKGlub2RlLCBDX1BVUkdFKTsKKworCQkJLyogY2F0Y2ggdGhlIGRlbnRyaWVzIGxhdGVyIGlmIHNvbWUgYXJlIHN0aWxsIGJ1c3kgKi8KKwkJCWNvZGFfZmxhZ19pbm9kZShpbm9kZSwgQ19QVVJHRSk7CisJCQlkX3BydW5lX2FsaWFzZXMoaW5vZGUpOworCisJCQlpcHV0KGlub2RlKTsKKwkJICB9CisJCSAgcmV0dXJuIDA7CisJICB9CisKKwkgIGNhc2UgQ09EQV9SRVBMQUNFIDogeworCSAgICAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlOworCQkgIHN0cnVjdCBDb2RhRmlkICpvbGRmaWQgPSAmb3V0LT5jb2RhX3JlcGxhY2UuT2xkRmlkOworCQkgIHN0cnVjdCBDb2RhRmlkICpuZXdmaWQgPSAmb3V0LT5jb2RhX3JlcGxhY2UuTmV3RmlkOworCQkgIGlub2RlID0gY29kYV9maWRfdG9faW5vZGUob2xkZmlkLCBzYik7CisJCSAgaWYgKCBpbm9kZSApIHsgCisJCQkgIGNvZGFfcmVwbGFjZV9maWQoaW5vZGUsIG9sZGZpZCwgbmV3ZmlkKTsKKwkJCSAgaXB1dChpbm9kZSk7CisJCSAgfQorCQkgIHJldHVybiAwOworCSAgfQorCSAgfQorCSAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdC5jIGIvZnMvY29tcGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxMmJkZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NvbXBhdC5jCkBAIC0wLDAgKzEsMTk1MCBAQAorLyoKKyAqICBsaW51eC9mcy9jb21wYXQuYworICoKKyAqICBLZXJuZWwgY29tcGF0aWJpbGlsdHkgcm91dGluZXMgZm9yIGUuZy4gMzIgYml0IHN5c2NhbGwgc3VwcG9ydAorICogIG9uIDY0IGJpdCBrZXJuZWxzLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgICAgICAgU3RlcGhlbiBSb3Rod2VsbCwgSUJNIENvcnBvcmF0aW9uCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgIEpha3ViIEplbGluZWsgIChqYWt1YkByZWRoYXQuY29tKQorICogIENvcHlyaWdodCAoQykgMTk5OCAgICAgICBFZGRpZSBDLiBEb3N0ICAoZWNkQHNreW5ldC5iZSkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiAgQW5kaSBLbGVlbiwgU3VTRSBMYWJzIAorICogIENvcHlyaWdodCAoQykgMjAwMyAgICAgICBQYXZlbCBNYWNoZWsgKHBhdmVsQHN1c2UuY3opCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgkvKiBmb3IgU0lPQ0RFVlBSSVZBVEUgKi8KKyNpbmNsdWRlIDxsaW51eC9zbWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbWJfbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uY3BfbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kaXJlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvaGlnaHVpZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisKKyNpbmNsdWRlIDxuZXQvc29jay5oPgkJLyogc2lvY2RldnByaXZhdGVfaW9jdGwgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorCisvKgorICogTm90IGFsbCBhcmNoaXRlY3R1cmVzIGhhdmUgc3lzX3V0aW1lLCBzbyBpbXBsZW1lbnQgdGhpcyBpbiB0ZXJtcworICogb2Ygc3lzX3V0aW1lcy4KKyAqLworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfdXRpbWUoY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBzdHJ1Y3QgY29tcGF0X3V0aW1idWYgX191c2VyICp0KQoreworCXN0cnVjdCB0aW1ldmFsIHR2WzJdOworCisJaWYgKHQpIHsKKwkJaWYgKGdldF91c2VyKHR2WzBdLnR2X3NlYywgJnQtPmFjdGltZSkgfHwKKwkJICAgIGdldF91c2VyKHR2WzFdLnR2X3NlYywgJnQtPm1vZHRpbWUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXR2WzBdLnR2X3VzZWMgPSAwOworCQl0dlsxXS50dl91c2VjID0gMDsKKwl9CisJcmV0dXJuIGRvX3V0aW1lcyhmaWxlbmFtZSwgdCA/IHR2IDogTlVMTCk7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3V0aW1lcyhjaGFyIF9fdXNlciAqZmlsZW5hbWUsIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKnQpCit7CisJc3RydWN0IHRpbWV2YWwgdHZbMl07CisKKwlpZiAodCkgeyAKKwkJaWYgKGdldF91c2VyKHR2WzBdLnR2X3NlYywgJnRbMF0udHZfc2VjKSB8fAorCQkgICAgZ2V0X3VzZXIodHZbMF0udHZfdXNlYywgJnRbMF0udHZfdXNlYykgfHwKKwkJICAgIGdldF91c2VyKHR2WzFdLnR2X3NlYywgJnRbMV0udHZfc2VjKSB8fAorCQkgICAgZ2V0X3VzZXIodHZbMV0udHZfdXNlYywgJnRbMV0udHZfdXNlYykpCisJCQlyZXR1cm4gLUVGQVVMVDsgCisJfSAKKwlyZXR1cm4gZG9fdXRpbWVzKGZpbGVuYW1lLCB0ID8gdHYgOiBOVUxMKTsKK30KKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbmV3c3RhdChjaGFyIF9fdXNlciAqIGZpbGVuYW1lLAorCQlzdHJ1Y3QgY29tcGF0X3N0YXQgX191c2VyICpzdGF0YnVmKQoreworCXN0cnVjdCBrc3RhdCBzdGF0OworCWludCBlcnJvciA9IHZmc19zdGF0KGZpbGVuYW1lLCAmc3RhdCk7CisKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IGNwX2NvbXBhdF9zdGF0KCZzdGF0LCBzdGF0YnVmKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX25ld2xzdGF0KGNoYXIgX191c2VyICogZmlsZW5hbWUsCisJCXN0cnVjdCBjb21wYXRfc3RhdCBfX3VzZXIgKnN0YXRidWYpCit7CisJc3RydWN0IGtzdGF0IHN0YXQ7CisJaW50IGVycm9yID0gdmZzX2xzdGF0KGZpbGVuYW1lLCAmc3RhdCk7CisKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IGNwX2NvbXBhdF9zdGF0KCZzdGF0LCBzdGF0YnVmKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX25ld2ZzdGF0KHVuc2lnbmVkIGludCBmZCwKKwkJc3RydWN0IGNvbXBhdF9zdGF0IF9fdXNlciAqIHN0YXRidWYpCit7CisJc3RydWN0IGtzdGF0IHN0YXQ7CisJaW50IGVycm9yID0gdmZzX2ZzdGF0KGZkLCAmc3RhdCk7CisKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IGNwX2NvbXBhdF9zdGF0KCZzdGF0LCBzdGF0YnVmKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgcHV0X2NvbXBhdF9zdGF0ZnMoc3RydWN0IGNvbXBhdF9zdGF0ZnMgX191c2VyICp1YnVmLCBzdHJ1Y3Qga3N0YXRmcyAqa2J1ZikKK3sKKwkKKwlpZiAoc2l6ZW9mIHVidWYtPmZfYmxvY2tzID09IDQpIHsKKwkJaWYgKChrYnVmLT5mX2Jsb2NrcyB8IGtidWYtPmZfYmZyZWUgfCBrYnVmLT5mX2JhdmFpbCkgJgorCQkgICAgMHhmZmZmZmZmZjAwMDAwMDAwVUxMKQorCQkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJCS8qIGZfZmlsZXMgYW5kIGZfZmZyZWUgbWF5IGJlIC0xOyBpdCdzIG9rYXkKKwkJICogdG8gc3R1ZmYgdGhhdCBpbnRvIDMyIGJpdHMgKi8KKwkJaWYgKGtidWYtPmZfZmlsZXMgIT0gMHhmZmZmZmZmZmZmZmZmZmZmVUxMCisJCSAmJiAoa2J1Zi0+Zl9maWxlcyAmIDB4ZmZmZmZmZmYwMDAwMDAwMFVMTCkpCisJCQlyZXR1cm4gLUVPVkVSRkxPVzsKKwkJaWYgKGtidWYtPmZfZmZyZWUgIT0gMHhmZmZmZmZmZmZmZmZmZmZmVUxMCisJCSAmJiAoa2J1Zi0+Zl9mZnJlZSAmIDB4ZmZmZmZmZmYwMDAwMDAwMFVMTCkpCisJCQlyZXR1cm4gLUVPVkVSRkxPVzsKKwl9CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1YnVmLCBzaXplb2YoKnVidWYpKSB8fAorCSAgICBfX3B1dF91c2VyKGtidWYtPmZfdHlwZSwgJnVidWYtPmZfdHlwZSkgfHwKKwkgICAgX19wdXRfdXNlcihrYnVmLT5mX2JzaXplLCAmdWJ1Zi0+Zl9ic2l6ZSkgfHwKKwkgICAgX19wdXRfdXNlcihrYnVmLT5mX2Jsb2NrcywgJnVidWYtPmZfYmxvY2tzKSB8fAorCSAgICBfX3B1dF91c2VyKGtidWYtPmZfYmZyZWUsICZ1YnVmLT5mX2JmcmVlKSB8fAorCSAgICBfX3B1dF91c2VyKGtidWYtPmZfYmF2YWlsLCAmdWJ1Zi0+Zl9iYXZhaWwpIHx8CisJICAgIF9fcHV0X3VzZXIoa2J1Zi0+Zl9maWxlcywgJnVidWYtPmZfZmlsZXMpIHx8CisJICAgIF9fcHV0X3VzZXIoa2J1Zi0+Zl9mZnJlZSwgJnVidWYtPmZfZmZyZWUpIHx8CisJICAgIF9fcHV0X3VzZXIoa2J1Zi0+Zl9uYW1lbGVuLCAmdWJ1Zi0+Zl9uYW1lbGVuKSB8fAorCSAgICBfX3B1dF91c2VyKGtidWYtPmZfZnNpZC52YWxbMF0sICZ1YnVmLT5mX2ZzaWQudmFsWzBdKSB8fAorCSAgICBfX3B1dF91c2VyKGtidWYtPmZfZnNpZC52YWxbMV0sICZ1YnVmLT5mX2ZzaWQudmFsWzFdKSB8fAorCSAgICBfX3B1dF91c2VyKGtidWYtPmZfZnJzaXplLCAmdWJ1Zi0+Zl9mcnNpemUpIHx8CisJICAgIF9fcHV0X3VzZXIoMCwgJnVidWYtPmZfc3BhcmVbMF0pIHx8IAorCSAgICBfX3B1dF91c2VyKDAsICZ1YnVmLT5mX3NwYXJlWzFdKSB8fCAKKwkgICAgX19wdXRfdXNlcigwLCAmdWJ1Zi0+Zl9zcGFyZVsyXSkgfHwgCisJICAgIF9fcHV0X3VzZXIoMCwgJnVidWYtPmZfc3BhcmVbM10pIHx8IAorCSAgICBfX3B1dF91c2VyKDAsICZ1YnVmLT5mX3NwYXJlWzRdKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHN0YXRmcyBjYWxscyBhcmUgY29waWVzIG9mIGNvZGUgZnJvbSBmcy9vcGVuLmMgYW5kCisgKiBzaG91bGQgYmUgY2hlY2tlZCBhZ2FpbnN0IHRob3NlIGZyb20gdGltZSB0byB0aW1lCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3N0YXRmcyhjb25zdCBjaGFyIF9fdXNlciAqcGF0aCwgc3RydWN0IGNvbXBhdF9zdGF0ZnMgX191c2VyICpidWYpCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHVzZXJfcGF0aF93YWxrKHBhdGgsICZuZCk7CisJaWYgKCFlcnJvcikgeworCQlzdHJ1Y3Qga3N0YXRmcyB0bXA7CisJCWVycm9yID0gdmZzX3N0YXRmcyhuZC5kZW50cnktPmRfaW5vZGUtPmlfc2IsICZ0bXApOworCQlpZiAoIWVycm9yICYmIHB1dF9jb21wYXRfc3RhdGZzKGJ1ZiwgJnRtcCkpCisJCQllcnJvciA9IC1FRkFVTFQ7CisJCXBhdGhfcmVsZWFzZSgmbmQpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2ZzdGF0ZnModW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgY29tcGF0X3N0YXRmcyBfX3VzZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZmlsZSAqIGZpbGU7CisJc3RydWN0IGtzdGF0ZnMgdG1wOworCWludCBlcnJvcjsKKworCWVycm9yID0gLUVCQURGOworCWZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gb3V0OworCWVycm9yID0gdmZzX3N0YXRmcyhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYiwgJnRtcCk7CisJaWYgKCFlcnJvciAmJiBwdXRfY29tcGF0X3N0YXRmcyhidWYsICZ0bXApKQorCQllcnJvciA9IC1FRkFVTFQ7CisJZnB1dChmaWxlKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgcHV0X2NvbXBhdF9zdGF0ZnM2NChzdHJ1Y3QgY29tcGF0X3N0YXRmczY0IF9fdXNlciAqdWJ1Ziwgc3RydWN0IGtzdGF0ZnMgKmtidWYpCit7CisJaWYgKHNpemVvZiB1YnVmLT5mX2Jsb2NrcyA9PSA0KSB7CisJCWlmICgoa2J1Zi0+Zl9ibG9ja3MgfCBrYnVmLT5mX2JmcmVlIHwga2J1Zi0+Zl9iYXZhaWwpICYKKwkJICAgIDB4ZmZmZmZmZmYwMDAwMDAwMFVMTCkKKwkJCXJldHVybiAtRU9WRVJGTE9XOworCQkvKiBmX2ZpbGVzIGFuZCBmX2ZmcmVlIG1heSBiZSAtMTsgaXQncyBva2F5CisJCSAqIHRvIHN0dWZmIHRoYXQgaW50byAzMiBiaXRzICovCisJCWlmIChrYnVmLT5mX2ZpbGVzICE9IDB4ZmZmZmZmZmZmZmZmZmZmZlVMTAorCQkgJiYgKGtidWYtPmZfZmlsZXMgJiAweGZmZmZmZmZmMDAwMDAwMDBVTEwpKQorCQkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJCWlmIChrYnVmLT5mX2ZmcmVlICE9IDB4ZmZmZmZmZmZmZmZmZmZmZlVMTAorCQkgJiYgKGtidWYtPmZfZmZyZWUgJiAweGZmZmZmZmZmMDAwMDAwMDBVTEwpKQorCQkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJfQorCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdWJ1Ziwgc2l6ZW9mKCp1YnVmKSkgfHwKKwkgICAgX19wdXRfdXNlcihrYnVmLT5mX3R5cGUsICZ1YnVmLT5mX3R5cGUpIHx8CisJICAgIF9fcHV0X3VzZXIoa2J1Zi0+Zl9ic2l6ZSwgJnVidWYtPmZfYnNpemUpIHx8CisJICAgIF9fcHV0X3VzZXIoa2J1Zi0+Zl9ibG9ja3MsICZ1YnVmLT5mX2Jsb2NrcykgfHwKKwkgICAgX19wdXRfdXNlcihrYnVmLT5mX2JmcmVlLCAmdWJ1Zi0+Zl9iZnJlZSkgfHwKKwkgICAgX19wdXRfdXNlcihrYnVmLT5mX2JhdmFpbCwgJnVidWYtPmZfYmF2YWlsKSB8fAorCSAgICBfX3B1dF91c2VyKGtidWYtPmZfZmlsZXMsICZ1YnVmLT5mX2ZpbGVzKSB8fAorCSAgICBfX3B1dF91c2VyKGtidWYtPmZfZmZyZWUsICZ1YnVmLT5mX2ZmcmVlKSB8fAorCSAgICBfX3B1dF91c2VyKGtidWYtPmZfbmFtZWxlbiwgJnVidWYtPmZfbmFtZWxlbikgfHwKKwkgICAgX19wdXRfdXNlcihrYnVmLT5mX2ZzaWQudmFsWzBdLCAmdWJ1Zi0+Zl9mc2lkLnZhbFswXSkgfHwKKwkgICAgX19wdXRfdXNlcihrYnVmLT5mX2ZzaWQudmFsWzFdLCAmdWJ1Zi0+Zl9mc2lkLnZhbFsxXSkgfHwKKwkgICAgX19wdXRfdXNlcihrYnVmLT5mX2Zyc2l6ZSwgJnVidWYtPmZfZnJzaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3N0YXRmczY0KGNvbnN0IGNoYXIgX191c2VyICpwYXRoLCBjb21wYXRfc2l6ZV90IHN6LCBzdHJ1Y3QgY29tcGF0X3N0YXRmczY0IF9fdXNlciAqYnVmKQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJaW50IGVycm9yOworCisJaWYgKHN6ICE9IHNpemVvZigqYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnJvciA9IHVzZXJfcGF0aF93YWxrKHBhdGgsICZuZCk7CisJaWYgKCFlcnJvcikgeworCQlzdHJ1Y3Qga3N0YXRmcyB0bXA7CisJCWVycm9yID0gdmZzX3N0YXRmcyhuZC5kZW50cnktPmRfaW5vZGUtPmlfc2IsICZ0bXApOworCQlpZiAoIWVycm9yICYmIHB1dF9jb21wYXRfc3RhdGZzNjQoYnVmLCAmdG1wKSkKKwkJCWVycm9yID0gLUVGQVVMVDsKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZnN0YXRmczY0KHVuc2lnbmVkIGludCBmZCwgY29tcGF0X3NpemVfdCBzeiwgc3RydWN0IGNvbXBhdF9zdGF0ZnM2NCBfX3VzZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZmlsZSAqIGZpbGU7CisJc3RydWN0IGtzdGF0ZnMgdG1wOworCWludCBlcnJvcjsKKworCWlmIChzeiAhPSBzaXplb2YoKmJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyb3IgPSAtRUJBREY7CisJZmlsZSA9IGZnZXQoZmQpOworCWlmICghZmlsZSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSB2ZnNfc3RhdGZzKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NiLCAmdG1wKTsKKwlpZiAoIWVycm9yICYmIHB1dF9jb21wYXRfc3RhdGZzNjQoYnVmLCAmdG1wKSkKKwkJZXJyb3IgPSAtRUZBVUxUOworCWZwdXQoZmlsZSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisvKiBpb2N0bDMyIHN0dWZmLCB1c2VkIGJ5IHNwYXJjNjQsIHBhcmlzYywgczM5MHgsIHBwYzY0LCB4ODZfNjQsIE1JUFMgKi8KKworI2RlZmluZSBJT0NUTF9IQVNIU0laRSAyNTYKK3N0YXRpYyBzdHJ1Y3QgaW9jdGxfdHJhbnMgKmlvY3RsMzJfaGFzaF90YWJsZVtJT0NUTF9IQVNIU0laRV07CitzdGF0aWMgREVDTEFSRV9SV1NFTShpb2N0bDMyX3NlbSk7CisKK2V4dGVybiBzdHJ1Y3QgaW9jdGxfdHJhbnMgaW9jdGxfc3RhcnRbXTsKK2V4dGVybiBpbnQgaW9jdGxfdGFibGVfc2l6ZTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGlvY3RsMzJfaGFzaCh1bnNpZ25lZCBsb25nIGNtZCkKK3sKKwlyZXR1cm4gKCgoY21kID4+IDYpIF4gKGNtZCA+PiA0KSBeIGNtZCkpICUgSU9DVExfSEFTSFNJWkU7Cit9CisKK3N0YXRpYyB2b2lkIGlvY3RsMzJfaW5zZXJ0X3RyYW5zbGF0aW9uKHN0cnVjdCBpb2N0bF90cmFucyAqdHJhbnMpCit7CisJdW5zaWduZWQgbG9uZyBoYXNoOworCXN0cnVjdCBpb2N0bF90cmFucyAqdDsKKworCWhhc2ggPSBpb2N0bDMyX2hhc2ggKHRyYW5zLT5jbWQpOworCWlmICghaW9jdGwzMl9oYXNoX3RhYmxlW2hhc2hdKQorCQlpb2N0bDMyX2hhc2hfdGFibGVbaGFzaF0gPSB0cmFuczsKKwllbHNlIHsKKwkJdCA9IGlvY3RsMzJfaGFzaF90YWJsZVtoYXNoXTsKKwkJd2hpbGUgKHQtPm5leHQpCisJCQl0ID0gdC0+bmV4dDsKKwkJdHJhbnMtPm5leHQgPSBOVUxMOworCQl0LT5uZXh0ID0gdHJhbnM7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3N5czMyX2lvY3RsKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW9jdGxfdGFibGVfc2l6ZTsgaSsrKSB7CisJCWlmIChpb2N0bF9zdGFydFtpXS5uZXh0ICE9IDApIHsgCisJCQlwcmludGsoImlvY3RsIHRyYW5zbGF0aW9uICVkIGJhZFxuIixpKTsgCisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpb2N0bDMyX2luc2VydF90cmFuc2xhdGlvbigmaW9jdGxfc3RhcnRbaV0pOworCX0KKwlyZXR1cm4gMDsKK30KKworX19pbml0Y2FsbChpbml0X3N5czMyX2lvY3RsKTsKKworaW50IHJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbih1bnNpZ25lZCBpbnQgY21kLAorCQkJCWlvY3RsX3RyYW5zX2hhbmRsZXJfdCBoYW5kbGVyKQoreworCXN0cnVjdCBpb2N0bF90cmFucyAqdDsKKwlzdHJ1Y3QgaW9jdGxfdHJhbnMgKm5ld190OworCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGlvY3RsMzJfaGFzaChjbWQpOworCisJbmV3X3QgPSBrbWFsbG9jKHNpemVvZigqbmV3X3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld190KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRvd25fd3JpdGUoJmlvY3RsMzJfc2VtKTsKKwlmb3IgKHQgPSBpb2N0bDMyX2hhc2hfdGFibGVbaGFzaF07IHQ7IHQgPSB0LT5uZXh0KSB7CisJCWlmICh0LT5jbWQgPT0gY21kKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlRyeWluZyB0byByZWdpc3RlciBkdXBsaWNhdGVkIGlvY3RsMzIgIgorCQkJCQkiaGFuZGxlciAleFxuIiwgY21kKTsKKwkJCXVwX3dyaXRlKCZpb2N0bDMyX3NlbSk7CisJCQlrZnJlZShuZXdfdCk7CisJCQlyZXR1cm4gLUVJTlZBTDsgCisJCX0KKwl9CisJbmV3X3QtPm5leHQgPSBOVUxMOworCW5ld190LT5jbWQgPSBjbWQ7CisJbmV3X3QtPmhhbmRsZXIgPSBoYW5kbGVyOworCWlvY3RsMzJfaW5zZXJ0X3RyYW5zbGF0aW9uKG5ld190KTsKKworCXVwX3dyaXRlKCZpb2N0bDMyX3NlbSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbik7CisKK3N0YXRpYyBpbmxpbmUgaW50IGJ1aWx0aW5faW9jdGwoc3RydWN0IGlvY3RsX3RyYW5zICp0KQoreyAKKwlyZXR1cm4gdCA+PSBpb2N0bF9zdGFydCAmJiB0IDwgKGlvY3RsX3N0YXJ0ICsgaW9jdGxfdGFibGVfc2l6ZSk7Cit9IAorCisvKiBQcm9ibGVtOiAKKyAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IHVucmVnaXN0ZXIgZHVwbGljYXRlIGlvY3RscywgYmVjYXVzZSB0aGV5IGFyZSBub3QKKyAgIHVuaXF1ZS4KKyAgIFdoZW4gdGhleSBoYXBwZW4gd2UgbmVlZCB0byBleHRlbmQgdGhlIHByb3RvdHlwZSB0byBwYXNzIHRoZSBoYW5kbGVyIHRvby4gKi8KKworaW50IHVucmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKHVuc2lnbmVkIGludCBjbWQpCit7CisJdW5zaWduZWQgbG9uZyBoYXNoID0gaW9jdGwzMl9oYXNoKGNtZCk7CisJc3RydWN0IGlvY3RsX3RyYW5zICp0LCAqdDE7CisKKwlkb3duX3dyaXRlKCZpb2N0bDMyX3NlbSk7CisKKwl0ID0gaW9jdGwzMl9oYXNoX3RhYmxlW2hhc2hdOworCWlmICghdCkgeyAKKwkJdXBfd3JpdGUoJmlvY3RsMzJfc2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSAKKworCWlmICh0LT5jbWQgPT0gY21kKSB7IAorCQlpZiAoYnVpbHRpbl9pb2N0bCh0KSkgeworCQkJcHJpbnRrKCIlcCB0cmllZCB0byB1bnJlZ2lzdGVyIGJ1aWx0aW4gaW9jdGwgJXhcbiIsCisJCQkgICAgICAgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApLCBjbWQpOworCQl9IGVsc2UgeyAKKwkJCWlvY3RsMzJfaGFzaF90YWJsZVtoYXNoXSA9IHQtPm5leHQ7CisJCQl1cF93cml0ZSgmaW9jdGwzMl9zZW0pOworCQkJa2ZyZWUodCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gCisJd2hpbGUgKHQtPm5leHQpIHsKKwkJdDEgPSB0LT5uZXh0OworCQlpZiAodDEtPmNtZCA9PSBjbWQpIHsgCisJCQlpZiAoYnVpbHRpbl9pb2N0bCh0MSkpIHsKKwkJCQlwcmludGsoIiVwIHRyaWVkIHRvIHVucmVnaXN0ZXIgYnVpbHRpbiAiCisJCQkJCSJpb2N0bCAleFxuIiwKKwkJCQkJX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApLCBjbWQpOworCQkJCWdvdG8gb3V0OworCQkJfSBlbHNlIHsgCisJCQkJdC0+bmV4dCA9IHQxLT5uZXh0OworCQkJCXVwX3dyaXRlKCZpb2N0bDMyX3NlbSk7CisJCQkJa2ZyZWUodDEpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCXQgPSB0MTsKKwl9CisJcHJpbnRrKEtFUk5fRVJSICJUcnlpbmcgdG8gZnJlZSB1bmtub3duIDMyYml0IGlvY3RsIGhhbmRsZXIgJXhcbiIsCisJCQkJY21kKTsKK291dDoKKwl1cF93cml0ZSgmaW9jdGwzMl9zZW0pOworCXJldHVybiAtRUlOVkFMOworfQorRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbik7IAorCitzdGF0aWMgdm9pZCBjb21wYXRfaW9jdGxfZXJyb3Ioc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBmZCwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJY2hhciBidWZbMTBdOworCWNoYXIgKmZuID0gIj8iOworCWNoYXIgKnBhdGg7CisKKwkvKiBmaW5kIHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UuICovCisJcGF0aCA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmIChwYXRoKSB7CisJCWZuID0gZF9wYXRoKGZpbHAtPmZfZGVudHJ5LCBmaWxwLT5mX3Zmc21udCwgcGF0aCwgUEFHRV9TSVpFKTsKKwkJaWYgKElTX0VSUihmbikpCisJCQlmbiA9ICI/IjsKKwl9CisKKwlzcHJpbnRmKGJ1ZiwiJyVjJyIsIChjbWQ+PjI0KSAmIDB4M2YpOworCWlmICghaXNwcmludChidWZbMV0pKQorCQlzcHJpbnRmKGJ1ZiwgIiUwMngiLCBidWZbMV0pOworCXByaW50aygiaW9jdGwzMiglczolZCk6IFVua25vd24gY21kIGZkKCVkKSAiCisJCQkiY21kKCUwOHgpeyVzfSBhcmcoJTA4eCkgb24gJXNcbiIsCisJCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsCisJCQkoaW50KWZkLCAodW5zaWduZWQgaW50KWNtZCwgYnVmLAorCQkJKHVuc2lnbmVkIGludClhcmcsIGZuKTsKKworCWlmIChwYXRoKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGF0aCk7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlscDsKKwlpbnQgZXJyb3IgPSAtRUJBREY7CisJc3RydWN0IGlvY3RsX3RyYW5zICp0OworCWludCBmcHV0X25lZWRlZDsKKworCWZpbHAgPSBmZ2V0X2xpZ2h0KGZkLCAmZnB1dF9uZWVkZWQpOworCWlmICghZmlscCkKKwkJZ290byBvdXQ7CisKKwkvKiBSRUQtUEVOIGhvdyBzaG91bGQgTFNNIG1vZHVsZSBrbm93IGl0J3MgaGFuZGxpbmcgMzJiaXQ/ICovCisJZXJyb3IgPSBzZWN1cml0eV9maWxlX2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2ZwdXQ7CisKKwkvKgorCSAqIFRvIGFsbG93IHRoZSBjb21wYXRfaW9jdGwgaGFuZGxlcnMgdG8gYmUgc2VsZiBjb250YWluZWQKKwkgKiB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBjb21tb24gaW9jdGxzIGhlcmUgZmlyc3QuCisJICogSnVzdCBoYW5kbGUgdGhlbSB3aXRoIHRoZSBzdGFuZGFyZCBoYW5kbGVycyBiZWxvdy4KKwkgKi8KKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRklPQ0xFWDoKKwljYXNlIEZJT05DTEVYOgorCWNhc2UgRklPTkJJTzoKKwljYXNlIEZJT0FTWU5DOgorCWNhc2UgRklPUVNJWkU6CisJCWJyZWFrOworCisJY2FzZSBGSUJNQVA6CisJY2FzZSBGSUdFVEJTWjoKKwljYXNlIEZJT05SRUFEOgorCQlpZiAoU19JU1JFRyhmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJCWJyZWFrOworCQkvKkZBTEwgVEhST1VHSCovCisKKwlkZWZhdWx0OgorCQlpZiAoZmlscC0+Zl9vcCAmJiBmaWxwLT5mX29wLT5jb21wYXRfaW9jdGwpIHsKKwkJCWVycm9yID0gZmlscC0+Zl9vcC0+Y29tcGF0X2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKKwkJCWlmIChlcnJvciAhPSAtRU5PSU9DVExDTUQpCisJCQkJZ290byBvdXRfZnB1dDsKKwkJfQorCisJCWlmICghZmlscC0+Zl9vcCB8fAorCQkgICAgKCFmaWxwLT5mX29wLT5pb2N0bCAmJiAhZmlscC0+Zl9vcC0+dW5sb2NrZWRfaW9jdGwpKQorCQkJZ290byBkb19pb2N0bDsKKwkJYnJlYWs7CisJfQorCisJLyogV2hlbiByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24gaXMgZmluYWxseSBnb25lIHJlbW92ZQorCSAgIHRoaXMgbG9jayEgLUFLICovCisJZG93bl9yZWFkKCZpb2N0bDMyX3NlbSk7CisJZm9yICh0ID0gaW9jdGwzMl9oYXNoX3RhYmxlW2lvY3RsMzJfaGFzaChjbWQpXTsgdDsgdCA9IHQtPm5leHQpIHsKKwkJaWYgKHQtPmNtZCA9PSBjbWQpCisJCQlnb3RvIGZvdW5kX2hhbmRsZXI7CisJfQorCXVwX3JlYWQoJmlvY3RsMzJfc2VtKTsKKworCWlmIChTX0lTU09DSyhmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSAmJgorCSAgICBjbWQgPj0gU0lPQ0RFVlBSSVZBVEUgJiYgY21kIDw9IChTSU9DREVWUFJJVkFURSArIDE1KSkgeworCQllcnJvciA9IHNpb2NkZXZwcml2YXRlX2lvY3RsKGZkLCBjbWQsIGFyZyk7CisJfSBlbHNlIHsKKwkJc3RhdGljIGludCBjb3VudDsKKworCQlpZiAoKytjb3VudCA8PSA1MCkKKwkJCWNvbXBhdF9pb2N0bF9lcnJvcihmaWxwLCBmZCwgY21kLCBhcmcpOworCQllcnJvciA9IC1FSU5WQUw7CisJfQorCisJZ290byBvdXRfZnB1dDsKKworIGZvdW5kX2hhbmRsZXI6CisJaWYgKHQtPmhhbmRsZXIpIHsKKwkJbG9ja19rZXJuZWwoKTsKKwkJZXJyb3IgPSB0LT5oYW5kbGVyKGZkLCBjbWQsIGFyZywgZmlscCk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJdXBfcmVhZCgmaW9jdGwzMl9zZW0pOworCQlnb3RvIG91dF9mcHV0OworCX0KKworCXVwX3JlYWQoJmlvY3RsMzJfc2VtKTsKKyBkb19pb2N0bDoKKwllcnJvciA9IHZmc19pb2N0bChmaWxwLCBmZCwgY21kLCBhcmcpOworIG91dF9mcHV0OgorCWZwdXRfbGlnaHQoZmlscCwgZnB1dF9uZWVkZWQpOworIG91dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2NvbXBhdF9mbG9jayhzdHJ1Y3QgZmxvY2sgKmtmbCwgc3RydWN0IGNvbXBhdF9mbG9jayBfX3VzZXIgKnVmbCkKK3sKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdWZsLCBzaXplb2YoKnVmbCkpIHx8CisJICAgIF9fZ2V0X3VzZXIoa2ZsLT5sX3R5cGUsICZ1ZmwtPmxfdHlwZSkgfHwKKwkgICAgX19nZXRfdXNlcihrZmwtPmxfd2hlbmNlLCAmdWZsLT5sX3doZW5jZSkgfHwKKwkgICAgX19nZXRfdXNlcihrZmwtPmxfc3RhcnQsICZ1ZmwtPmxfc3RhcnQpIHx8CisJICAgIF9fZ2V0X3VzZXIoa2ZsLT5sX2xlbiwgJnVmbC0+bF9sZW4pIHx8CisJICAgIF9fZ2V0X3VzZXIoa2ZsLT5sX3BpZCwgJnVmbC0+bF9waWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdXRfY29tcGF0X2Zsb2NrKHN0cnVjdCBmbG9jayAqa2ZsLCBzdHJ1Y3QgY29tcGF0X2Zsb2NrIF9fdXNlciAqdWZsKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdWZsLCBzaXplb2YoKnVmbCkpIHx8CisJICAgIF9fcHV0X3VzZXIoa2ZsLT5sX3R5cGUsICZ1ZmwtPmxfdHlwZSkgfHwKKwkgICAgX19wdXRfdXNlcihrZmwtPmxfd2hlbmNlLCAmdWZsLT5sX3doZW5jZSkgfHwKKwkgICAgX19wdXRfdXNlcihrZmwtPmxfc3RhcnQsICZ1ZmwtPmxfc3RhcnQpIHx8CisJICAgIF9fcHV0X3VzZXIoa2ZsLT5sX2xlbiwgJnVmbC0+bF9sZW4pIHx8CisJICAgIF9fcHV0X3VzZXIoa2ZsLT5sX3BpZCwgJnVmbC0+bF9waWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworI2lmbmRlZiBIQVZFX0FSQ0hfR0VUX0NPTVBBVF9GTE9DSzY0CitzdGF0aWMgaW50IGdldF9jb21wYXRfZmxvY2s2NChzdHJ1Y3QgZmxvY2sgKmtmbCwgc3RydWN0IGNvbXBhdF9mbG9jazY0IF9fdXNlciAqdWZsKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1ZmwsIHNpemVvZigqdWZsKSkgfHwKKwkgICAgX19nZXRfdXNlcihrZmwtPmxfdHlwZSwgJnVmbC0+bF90eXBlKSB8fAorCSAgICBfX2dldF91c2VyKGtmbC0+bF93aGVuY2UsICZ1ZmwtPmxfd2hlbmNlKSB8fAorCSAgICBfX2dldF91c2VyKGtmbC0+bF9zdGFydCwgJnVmbC0+bF9zdGFydCkgfHwKKwkgICAgX19nZXRfdXNlcihrZmwtPmxfbGVuLCAmdWZsLT5sX2xlbikgfHwKKwkgICAgX19nZXRfdXNlcihrZmwtPmxfcGlkLCAmdWZsLT5sX3BpZCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9BUkNIX1BVVF9DT01QQVRfRkxPQ0s2NAorc3RhdGljIGludCBwdXRfY29tcGF0X2Zsb2NrNjQoc3RydWN0IGZsb2NrICprZmwsIHN0cnVjdCBjb21wYXRfZmxvY2s2NCBfX3VzZXIgKnVmbCkKK3sKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVmbCwgc2l6ZW9mKCp1ZmwpKSB8fAorCSAgICBfX3B1dF91c2VyKGtmbC0+bF90eXBlLCAmdWZsLT5sX3R5cGUpIHx8CisJICAgIF9fcHV0X3VzZXIoa2ZsLT5sX3doZW5jZSwgJnVmbC0+bF93aGVuY2UpIHx8CisJICAgIF9fcHV0X3VzZXIoa2ZsLT5sX3N0YXJ0LCAmdWZsLT5sX3N0YXJ0KSB8fAorCSAgICBfX3B1dF91c2VyKGtmbC0+bF9sZW4sICZ1ZmwtPmxfbGVuKSB8fAorCSAgICBfX3B1dF91c2VyKGtmbC0+bF9waWQsICZ1ZmwtPmxfcGlkKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZmNudGw2NCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsCisJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisJc3RydWN0IGZsb2NrIGY7CisJbG9uZyByZXQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRl9HRVRMSzoKKwljYXNlIEZfU0VUTEs6CisJY2FzZSBGX1NFVExLVzoKKwkJcmV0ID0gZ2V0X2NvbXBhdF9mbG9jaygmZiwgY29tcGF0X3B0cihhcmcpKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJYnJlYWs7CisJCW9sZF9mcyA9IGdldF9mcygpOworCQlzZXRfZnMoS0VSTkVMX0RTKTsKKwkJcmV0ID0gc3lzX2ZjbnRsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKSZmKTsKKwkJc2V0X2ZzKG9sZF9mcyk7CisJCWlmIChjbWQgPT0gRl9HRVRMSyAmJiByZXQgPT0gMCkgeworCQkJaWYgKChmLmxfc3RhcnQgPj0gQ09NUEFUX09GRl9UX01BWCkgfHwKKwkJCSAgICAoKGYubF9zdGFydCArIGYubF9sZW4pID4gQ09NUEFUX09GRl9UX01BWCkpCisJCQkJcmV0ID0gLUVPVkVSRkxPVzsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlyZXQgPSBwdXRfY29tcGF0X2Zsb2NrKCZmLCBjb21wYXRfcHRyKGFyZykpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBGX0dFVExLNjQ6CisJY2FzZSBGX1NFVExLNjQ6CisJY2FzZSBGX1NFVExLVzY0OgorCQlyZXQgPSBnZXRfY29tcGF0X2Zsb2NrNjQoJmYsIGNvbXBhdF9wdHIoYXJnKSk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWJyZWFrOworCQlvbGRfZnMgPSBnZXRfZnMoKTsKKwkJc2V0X2ZzKEtFUk5FTF9EUyk7CisJCXJldCA9IHN5c19mY250bChmZCwgKGNtZCA9PSBGX0dFVExLNjQpID8gRl9HRVRMSyA6CisJCQkJKChjbWQgPT0gRl9TRVRMSzY0KSA/IEZfU0VUTEsgOiBGX1NFVExLVyksCisJCQkJKHVuc2lnbmVkIGxvbmcpJmYpOworCQlzZXRfZnMob2xkX2ZzKTsKKwkJaWYgKGNtZCA9PSBGX0dFVExLNjQgJiYgcmV0ID09IDApIHsKKwkJCWlmICgoZi5sX3N0YXJ0ID49IENPTVBBVF9MT0ZGX1RfTUFYKSB8fAorCQkJICAgICgoZi5sX3N0YXJ0ICsgZi5sX2xlbikgPiBDT01QQVRfTE9GRl9UX01BWCkpCisJCQkJcmV0ID0gLUVPVkVSRkxPVzsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlyZXQgPSBwdXRfY29tcGF0X2Zsb2NrNjQoJmYsIGNvbXBhdF9wdHIoYXJnKSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSBzeXNfZmNudGwoZmQsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2ZjbnRsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaWYgKChjbWQgPT0gRl9HRVRMSzY0KSB8fCAoY21kID09IEZfU0VUTEs2NCkgfHwgKGNtZCA9PSBGX1NFVExLVzY0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGNvbXBhdF9zeXNfZmNudGw2NChmZCwgY21kLCBhcmcpOworfQorCithc21saW5rYWdlIGxvbmcKK2NvbXBhdF9zeXNfaW9fc2V0dXAodW5zaWduZWQgbnJfcmVxcywgdTMyIF9fdXNlciAqY3R4MzJwKQoreworCWxvbmcgcmV0OworCWFpb19jb250ZXh0X3QgY3R4NjQ7CisKKwltbV9zZWdtZW50X3Qgb2xkZnMgPSBnZXRfZnMoKTsKKwlpZiAodW5saWtlbHkoZ2V0X3VzZXIoY3R4NjQsIGN0eDMycCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNldF9mcyhLRVJORUxfRFMpOworCS8qIFRoZSBfX3VzZXIgcG9pbnRlciBjYXN0IGlzIHZhbGlkIGJlY2F1c2Ugb2YgdGhlIHNldF9mcygpICovCisJcmV0ID0gc3lzX2lvX3NldHVwKG5yX3JlcXMsIChhaW9fY29udGV4dF90IF9fdXNlciAqKSAmY3R4NjQpOworCXNldF9mcyhvbGRmcyk7CisJLyogdHJ1bmNhdGluZyBpcyBvayBiZWNhdXNlIGl0J3MgYSB1c2VyIGFkZHJlc3MgKi8KKwlpZiAoIXJldCkKKwkJcmV0ID0gcHV0X3VzZXIoKHUzMikgY3R4NjQsIGN0eDMycCk7CisJcmV0dXJuIHJldDsKK30KKworYXNtbGlua2FnZSBsb25nCitjb21wYXRfc3lzX2lvX2dldGV2ZW50cyhhaW9fY29udGV4dF90IGN0eF9pZCwKKwkJCQkgdW5zaWduZWQgbG9uZyBtaW5fbnIsCisJCQkJIHVuc2lnbmVkIGxvbmcgbnIsCisJCQkJIHN0cnVjdCBpb19ldmVudCBfX3VzZXIgKmV2ZW50cywKKwkJCQkgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnRpbWVvdXQpCit7CisJbG9uZyByZXQ7CisJc3RydWN0IHRpbWVzcGVjIHQ7CisJc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqdXQgPSBOVUxMOworCisJcmV0ID0gLUVGQVVMVDsKKwlpZiAodW5saWtlbHkoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGV2ZW50cywgCisJCQkJbnIgKiBzaXplb2Yoc3RydWN0IGlvX2V2ZW50KSkpKQorCQlnb3RvIG91dDsKKwlpZiAodGltZW91dCkgeworCQlpZiAoZ2V0X2NvbXBhdF90aW1lc3BlYygmdCwgdGltZW91dCkpCisJCQlnb3RvIG91dDsKKworCQl1dCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqdXQpKTsKKwkJaWYgKGNvcHlfdG9fdXNlcih1dCwgJnQsIHNpemVvZih0KSkgKQorCQkJZ290byBvdXQ7CisJfSAKKwlyZXQgPSBzeXNfaW9fZ2V0ZXZlbnRzKGN0eF9pZCwgbWluX25yLCBuciwgZXZlbnRzLCB1dCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBsb25nCitjb3B5X2lvY2IobG9uZyBuciwgdTMyIF9fdXNlciAqcHRyMzIsIHN0cnVjdCBpb2NiIF9fdXNlciAqIF9fdXNlciAqcHRyNjQpCit7CisJY29tcGF0X3VwdHJfdCB1cHRyOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yOyArK2kpIHsKKwkJaWYgKGdldF91c2VyKHVwdHIsIHB0cjMyICsgaSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHB1dF91c2VyKGNvbXBhdF9wdHIodXB0ciksIHB0cjY0ICsgaSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUFYX0FJT19TVUJNSVRTIAkoUEFHRV9TSVpFL3NpemVvZihzdHJ1Y3QgaW9jYiAqKSkKKworYXNtbGlua2FnZSBsb25nCitjb21wYXRfc3lzX2lvX3N1Ym1pdChhaW9fY29udGV4dF90IGN0eF9pZCwgaW50IG5yLCB1MzIgX191c2VyICppb2NiKQoreworCXN0cnVjdCBpb2NiIF9fdXNlciAqIF9fdXNlciAqaW9jYjY0OyAKKwlsb25nIHJldDsKKworCWlmICh1bmxpa2VseShuciA8IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChuciA+IE1BWF9BSU9fU1VCTUlUUykKKwkJbnIgPSBNQVhfQUlPX1NVQk1JVFM7CisJCisJaW9jYjY0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2UobnIgKiBzaXplb2YoKmlvY2I2NCkpOworCXJldCA9IGNvcHlfaW9jYihuciwgaW9jYiwgaW9jYjY0KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gc3lzX2lvX3N1Ym1pdChjdHhfaWQsIG5yLCBpb2NiNjQpOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBjb21wYXRfbmNwX21vdW50X2RhdGEgeworCWNvbXBhdF9pbnRfdCB2ZXJzaW9uOworCWNvbXBhdF91aW50X3QgbmNwX2ZkOworCWNvbXBhdF91aWRfdCBtb3VudGVkX3VpZDsKKwljb21wYXRfcGlkX3Qgd2RvZ19waWQ7CisJdW5zaWduZWQgY2hhciBtb3VudGVkX3ZvbFtOQ1BfVk9MTkFNRV9MRU4gKyAxXTsKKwljb21wYXRfdWludF90IHRpbWVfb3V0OworCWNvbXBhdF91aW50X3QgcmV0cnlfY291bnQ7CisJY29tcGF0X3VpbnRfdCBmbGFnczsKKwljb21wYXRfdWlkX3QgdWlkOworCWNvbXBhdF9naWRfdCBnaWQ7CisJY29tcGF0X21vZGVfdCBmaWxlX21vZGU7CisJY29tcGF0X21vZGVfdCBkaXJfbW9kZTsKK307CisKK3N0cnVjdCBjb21wYXRfbmNwX21vdW50X2RhdGFfdjQgeworCWNvbXBhdF9pbnRfdCB2ZXJzaW9uOworCWNvbXBhdF91bG9uZ190IGZsYWdzOworCWNvbXBhdF91bG9uZ190IG1vdW50ZWRfdWlkOworCWNvbXBhdF9sb25nX3Qgd2RvZ19waWQ7CisJY29tcGF0X3VpbnRfdCBuY3BfZmQ7CisJY29tcGF0X3VpbnRfdCB0aW1lX291dDsKKwljb21wYXRfdWludF90IHJldHJ5X2NvdW50OworCWNvbXBhdF91bG9uZ190IHVpZDsKKwljb21wYXRfdWxvbmdfdCBnaWQ7CisJY29tcGF0X3Vsb25nX3QgZmlsZV9tb2RlOworCWNvbXBhdF91bG9uZ190IGRpcl9tb2RlOworfTsKKworc3RhdGljIHZvaWQgKmRvX25jcF9zdXBlcl9kYXRhX2NvbnYodm9pZCAqcmF3X2RhdGEpCit7CisJaW50IHZlcnNpb24gPSAqKHVuc2lnbmVkIGludCAqKXJhd19kYXRhOworCisJaWYgKHZlcnNpb24gPT0gMykgeworCQlzdHJ1Y3QgY29tcGF0X25jcF9tb3VudF9kYXRhICpjX24gPSByYXdfZGF0YTsKKwkJc3RydWN0IG5jcF9tb3VudF9kYXRhICpuID0gcmF3X2RhdGE7CisKKwkJbi0+ZGlyX21vZGUgPSBjX24tPmRpcl9tb2RlOworCQluLT5maWxlX21vZGUgPSBjX24tPmZpbGVfbW9kZTsKKwkJbi0+Z2lkID0gY19uLT5naWQ7CisJCW4tPnVpZCA9IGNfbi0+dWlkOworCQltZW1tb3ZlIChuLT5tb3VudGVkX3ZvbCwgY19uLT5tb3VudGVkX3ZvbCwgKHNpemVvZiAoY19uLT5tb3VudGVkX3ZvbCkgKyAzICogc2l6ZW9mICh1bnNpZ25lZCBpbnQpKSk7CisJCW4tPndkb2dfcGlkID0gY19uLT53ZG9nX3BpZDsKKwkJbi0+bW91bnRlZF91aWQgPSBjX24tPm1vdW50ZWRfdWlkOworCX0gZWxzZSBpZiAodmVyc2lvbiA9PSA0KSB7CisJCXN0cnVjdCBjb21wYXRfbmNwX21vdW50X2RhdGFfdjQgKmNfbiA9IHJhd19kYXRhOworCQlzdHJ1Y3QgbmNwX21vdW50X2RhdGFfdjQgKm4gPSByYXdfZGF0YTsKKworCQluLT5kaXJfbW9kZSA9IGNfbi0+ZGlyX21vZGU7CisJCW4tPmZpbGVfbW9kZSA9IGNfbi0+ZmlsZV9tb2RlOworCQluLT5naWQgPSBjX24tPmdpZDsKKwkJbi0+dWlkID0gY19uLT51aWQ7CisJCW4tPnJldHJ5X2NvdW50ID0gY19uLT5yZXRyeV9jb3VudDsKKwkJbi0+dGltZV9vdXQgPSBjX24tPnRpbWVfb3V0OworCQluLT5uY3BfZmQgPSBjX24tPm5jcF9mZDsKKwkJbi0+d2RvZ19waWQgPSBjX24tPndkb2dfcGlkOworCQluLT5tb3VudGVkX3VpZCA9IGNfbi0+bW91bnRlZF91aWQ7CisJCW4tPmZsYWdzID0gY19uLT5mbGFnczsKKwl9IGVsc2UgaWYgKHZlcnNpb24gIT0gNSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gcmF3X2RhdGE7Cit9CisKK3N0cnVjdCBjb21wYXRfc21iX21vdW50X2RhdGEgeworCWNvbXBhdF9pbnRfdCB2ZXJzaW9uOworCWNvbXBhdF91aWRfdCBtb3VudGVkX3VpZDsKKwljb21wYXRfdWlkX3QgdWlkOworCWNvbXBhdF9naWRfdCBnaWQ7CisJY29tcGF0X21vZGVfdCBmaWxlX21vZGU7CisJY29tcGF0X21vZGVfdCBkaXJfbW9kZTsKK307CisKK3N0YXRpYyB2b2lkICpkb19zbWJfc3VwZXJfZGF0YV9jb252KHZvaWQgKnJhd19kYXRhKQoreworCXN0cnVjdCBzbWJfbW91bnRfZGF0YSAqcyA9IHJhd19kYXRhOworCXN0cnVjdCBjb21wYXRfc21iX21vdW50X2RhdGEgKmNfcyA9IHJhd19kYXRhOworCisJaWYgKGNfcy0+dmVyc2lvbiAhPSBTTUJfTU9VTlRfT0xEVkVSU0lPTikKKwkJZ290byBvdXQ7CisJcy0+ZGlyX21vZGUgPSBjX3MtPmRpcl9tb2RlOworCXMtPmZpbGVfbW9kZSA9IGNfcy0+ZmlsZV9tb2RlOworCXMtPmdpZCA9IGNfcy0+Z2lkOworCXMtPnVpZCA9IGNfcy0+dWlkOworCXMtPm1vdW50ZWRfdWlkID0gY19zLT5tb3VudGVkX3VpZDsKKyBvdXQ6CisJcmV0dXJuIHJhd19kYXRhOworfQorCitleHRlcm4gaW50IGNvcHlfbW91bnRfb3B0aW9ucyAoY29uc3Qgdm9pZCBfX3VzZXIgKiwgdW5zaWduZWQgbG9uZyAqKTsKKworI2RlZmluZSBTTUJGU19OQU1FICAgICAgInNtYmZzIgorI2RlZmluZSBOQ1BGU19OQU1FICAgICAgIm5jcGZzIgorCithc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19tb3VudChjaGFyIF9fdXNlciAqIGRldl9uYW1lLCBjaGFyIF9fdXNlciAqIGRpcl9uYW1lLAorCQkJCSBjaGFyIF9fdXNlciAqIHR5cGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQkJIHZvaWQgX191c2VyICogZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIHR5cGVfcGFnZTsKKwl1bnNpZ25lZCBsb25nIGRhdGFfcGFnZTsKKwl1bnNpZ25lZCBsb25nIGRldl9wYWdlOworCWNoYXIgKmRpcl9wYWdlOworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjb3B5X21vdW50X29wdGlvbnMgKHR5cGUsICZ0eXBlX3BhZ2UpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIG91dDsKKworCWRpcl9wYWdlID0gZ2V0bmFtZShkaXJfbmFtZSk7CisJcmV0dmFsID0gUFRSX0VSUihkaXJfcGFnZSk7CisJaWYgKElTX0VSUihkaXJfcGFnZSkpCisJCWdvdG8gb3V0MTsKKworCXJldHZhbCA9IGNvcHlfbW91bnRfb3B0aW9ucyAoZGV2X25hbWUsICZkZXZfcGFnZSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0MjsKKworCXJldHZhbCA9IGNvcHlfbW91bnRfb3B0aW9ucyAoZGF0YSwgJmRhdGFfcGFnZSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0MzsKKworCXJldHZhbCA9IC1FSU5WQUw7CisKKwlpZiAodHlwZV9wYWdlKSB7CisJCWlmICghc3RyY21wKChjaGFyICopdHlwZV9wYWdlLCBTTUJGU19OQU1FKSkgeworCQkJZG9fc21iX3N1cGVyX2RhdGFfY29udigodm9pZCAqKWRhdGFfcGFnZSk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCgoY2hhciAqKXR5cGVfcGFnZSwgTkNQRlNfTkFNRSkpIHsKKwkJCWRvX25jcF9zdXBlcl9kYXRhX2NvbnYoKHZvaWQgKilkYXRhX3BhZ2UpOworCQl9CisJfQorCisJbG9ja19rZXJuZWwoKTsKKwlyZXR2YWwgPSBkb19tb3VudCgoY2hhciopZGV2X3BhZ2UsIGRpcl9wYWdlLCAoY2hhciopdHlwZV9wYWdlLAorCQkJZmxhZ3MsICh2b2lkKilkYXRhX3BhZ2UpOworCXVubG9ja19rZXJuZWwoKTsKKworCWZyZWVfcGFnZShkYXRhX3BhZ2UpOworIG91dDM6CisJZnJlZV9wYWdlKGRldl9wYWdlKTsKKyBvdXQyOgorCXB1dG5hbWUoZGlyX3BhZ2UpOworIG91dDE6CisJZnJlZV9wYWdlKHR5cGVfcGFnZSk7Cisgb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKKyNkZWZpbmUgTkFNRV9PRkZTRVQoZGUpICgoaW50KSAoKGRlKS0+ZF9uYW1lIC0gKGNoYXIgX191c2VyICopIChkZSkpKQorI2RlZmluZSBDT01QQVRfUk9VTkRfVVAoeCkgKCgoeCkrc2l6ZW9mKGNvbXBhdF9sb25nX3QpLTEpICYgXAorCQkJCX4oc2l6ZW9mKGNvbXBhdF9sb25nX3QpLTEpKQorCitzdHJ1Y3QgY29tcGF0X29sZF9saW51eF9kaXJlbnQgeworCWNvbXBhdF91bG9uZ190CWRfaW5vOworCWNvbXBhdF91bG9uZ190CWRfb2Zmc2V0OworCXVuc2lnbmVkIHNob3J0CWRfbmFtbGVuOworCWNoYXIJCWRfbmFtZVsxXTsKK307CisKK3N0cnVjdCBjb21wYXRfcmVhZGRpcl9jYWxsYmFjayB7CisJc3RydWN0IGNvbXBhdF9vbGRfbGludXhfZGlyZW50IF9fdXNlciAqZGlyZW50OworCWludCByZXN1bHQ7Cit9OworCitzdGF0aWMgaW50IGNvbXBhdF9maWxsb25lZGlyKHZvaWQgKl9fYnVmLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLAorCQkJbG9mZl90IG9mZnNldCwgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQoreworCXN0cnVjdCBjb21wYXRfcmVhZGRpcl9jYWxsYmFjayAqYnVmID0gX19idWY7CisJc3RydWN0IGNvbXBhdF9vbGRfbGludXhfZGlyZW50IF9fdXNlciAqZGlyZW50OworCisJaWYgKGJ1Zi0+cmVzdWx0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlidWYtPnJlc3VsdCsrOworCWRpcmVudCA9IGJ1Zi0+ZGlyZW50OworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZGlyZW50LAorCQkJKHVuc2lnbmVkIGxvbmcpKGRpcmVudC0+ZF9uYW1lICsgbmFtbGVuICsgMSkgLQorCQkJCSh1bnNpZ25lZCBsb25nKWRpcmVudCkpCisJCWdvdG8gZWZhdWx0OworCWlmICgJX19wdXRfdXNlcihpbm8sICZkaXJlbnQtPmRfaW5vKSB8fAorCQlfX3B1dF91c2VyKG9mZnNldCwgJmRpcmVudC0+ZF9vZmZzZXQpIHx8CisJCV9fcHV0X3VzZXIobmFtbGVuLCAmZGlyZW50LT5kX25hbWxlbikgfHwKKwkJX19jb3B5X3RvX3VzZXIoZGlyZW50LT5kX25hbWUsIG5hbWUsIG5hbWxlbikgfHwKKwkJX19wdXRfdXNlcigwLCBkaXJlbnQtPmRfbmFtZSArIG5hbWxlbikpCisJCWdvdG8gZWZhdWx0OworCXJldHVybiAwOworZWZhdWx0OgorCWJ1Zi0+cmVzdWx0ID0gLUVGQVVMVDsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfb2xkX3JlYWRkaXIodW5zaWduZWQgaW50IGZkLAorCXN0cnVjdCBjb21wYXRfb2xkX2xpbnV4X2RpcmVudCBfX3VzZXIgKmRpcmVudCwgdW5zaWduZWQgaW50IGNvdW50KQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzdHJ1Y3QgY29tcGF0X3JlYWRkaXJfY2FsbGJhY2sgYnVmOworCisJZXJyb3IgPSAtRUJBREY7CisJZmlsZSA9IGZnZXQoZmQpOworCWlmICghZmlsZSkKKwkJZ290byBvdXQ7CisKKwlidWYucmVzdWx0ID0gMDsKKwlidWYuZGlyZW50ID0gZGlyZW50OworCisJZXJyb3IgPSB2ZnNfcmVhZGRpcihmaWxlLCBjb21wYXRfZmlsbG9uZWRpciwgJmJ1Zik7CisJaWYgKGVycm9yID49IDApCisJCWVycm9yID0gYnVmLnJlc3VsdDsKKworCWZwdXQoZmlsZSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdHJ1Y3QgY29tcGF0X2xpbnV4X2RpcmVudCB7CisJY29tcGF0X3Vsb25nX3QJZF9pbm87CisJY29tcGF0X3Vsb25nX3QJZF9vZmY7CisJdW5zaWduZWQgc2hvcnQJZF9yZWNsZW47CisJY2hhcgkJZF9uYW1lWzFdOworfTsKKworc3RydWN0IGNvbXBhdF9nZXRkZW50c19jYWxsYmFjayB7CisJc3RydWN0IGNvbXBhdF9saW51eF9kaXJlbnQgX191c2VyICpjdXJyZW50X2RpcjsKKwlzdHJ1Y3QgY29tcGF0X2xpbnV4X2RpcmVudCBfX3VzZXIgKnByZXZpb3VzOworCWludCBjb3VudDsKKwlpbnQgZXJyb3I7Cit9OworCitzdGF0aWMgaW50IGNvbXBhdF9maWxsZGlyKHZvaWQgKl9fYnVmLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLAorCQlsb2ZmX3Qgb2Zmc2V0LCBpbm9fdCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCit7CisJc3RydWN0IGNvbXBhdF9saW51eF9kaXJlbnQgX191c2VyICogZGlyZW50OworCXN0cnVjdCBjb21wYXRfZ2V0ZGVudHNfY2FsbGJhY2sgKmJ1ZiA9IF9fYnVmOworCWludCByZWNsZW4gPSBDT01QQVRfUk9VTkRfVVAoTkFNRV9PRkZTRVQoZGlyZW50KSArIG5hbWxlbiArIDIpOworCisJYnVmLT5lcnJvciA9IC1FSU5WQUw7CS8qIG9ubHkgdXNlZCBpZiB3ZSBmYWlsLi4gKi8KKwlpZiAocmVjbGVuID4gYnVmLT5jb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGlyZW50ID0gYnVmLT5wcmV2aW91czsKKwlpZiAoZGlyZW50KSB7CisJCWlmIChfX3B1dF91c2VyKG9mZnNldCwgJmRpcmVudC0+ZF9vZmYpKQorCQkJZ290byBlZmF1bHQ7CisJfQorCWRpcmVudCA9IGJ1Zi0+Y3VycmVudF9kaXI7CisJaWYgKF9fcHV0X3VzZXIoaW5vLCAmZGlyZW50LT5kX2lubykpCisJCWdvdG8gZWZhdWx0OworCWlmIChfX3B1dF91c2VyKHJlY2xlbiwgJmRpcmVudC0+ZF9yZWNsZW4pKQorCQlnb3RvIGVmYXVsdDsKKwlpZiAoY29weV90b191c2VyKGRpcmVudC0+ZF9uYW1lLCBuYW1lLCBuYW1sZW4pKQorCQlnb3RvIGVmYXVsdDsKKwlpZiAoX19wdXRfdXNlcigwLCBkaXJlbnQtPmRfbmFtZSArIG5hbWxlbikpCisJCWdvdG8gZWZhdWx0OworCWlmIChfX3B1dF91c2VyKGRfdHlwZSwgKGNoYXIgIF9fdXNlciAqKSBkaXJlbnQgKyByZWNsZW4gLSAxKSkKKwkJZ290byBlZmF1bHQ7CisJYnVmLT5wcmV2aW91cyA9IGRpcmVudDsKKwlkaXJlbnQgPSAodm9pZCBfX3VzZXIgKilkaXJlbnQgKyByZWNsZW47CisJYnVmLT5jdXJyZW50X2RpciA9IGRpcmVudDsKKwlidWYtPmNvdW50IC09IHJlY2xlbjsKKwlyZXR1cm4gMDsKK2VmYXVsdDoKKwlidWYtPmVycm9yID0gLUVGQVVMVDsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZ2V0ZGVudHModW5zaWduZWQgaW50IGZkLAorCQlzdHJ1Y3QgY29tcGF0X2xpbnV4X2RpcmVudCBfX3VzZXIgKmRpcmVudCwgdW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCBmaWxlICogZmlsZTsKKwlzdHJ1Y3QgY29tcGF0X2xpbnV4X2RpcmVudCBfX3VzZXIgKiBsYXN0ZGlyZW50OworCXN0cnVjdCBjb21wYXRfZ2V0ZGVudHNfY2FsbGJhY2sgYnVmOworCWludCBlcnJvcjsKKworCWVycm9yID0gLUVGQVVMVDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRpcmVudCwgY291bnQpKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gLUVCQURGOworCWZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gb3V0OworCisJYnVmLmN1cnJlbnRfZGlyID0gZGlyZW50OworCWJ1Zi5wcmV2aW91cyA9IE5VTEw7CisJYnVmLmNvdW50ID0gY291bnQ7CisJYnVmLmVycm9yID0gMDsKKworCWVycm9yID0gdmZzX3JlYWRkaXIoZmlsZSwgY29tcGF0X2ZpbGxkaXIsICZidWYpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0X3B1dGY7CisJZXJyb3IgPSBidWYuZXJyb3I7CisJbGFzdGRpcmVudCA9IGJ1Zi5wcmV2aW91czsKKwlpZiAobGFzdGRpcmVudCkgeworCQlpZiAocHV0X3VzZXIoZmlsZS0+Zl9wb3MsICZsYXN0ZGlyZW50LT5kX29mZikpCisJCQllcnJvciA9IC1FRkFVTFQ7CisJCWVsc2UKKwkJCWVycm9yID0gY291bnQgLSBidWYuY291bnQ7CisJfQorCitvdXRfcHV0ZjoKKwlmcHV0KGZpbGUpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworI2lmbmRlZiBfX0FSQ0hfT01JVF9DT01QQVRfU1lTX0dFVERFTlRTNjQKKyNkZWZpbmUgQ09NUEFUX1JPVU5EX1VQNjQoeCkgKCgoeCkrc2l6ZW9mKHU2NCktMSkgJiB+KHNpemVvZih1NjQpLTEpKQorCitzdHJ1Y3QgY29tcGF0X2dldGRlbnRzX2NhbGxiYWNrNjQgeworCXN0cnVjdCBsaW51eF9kaXJlbnQ2NCBfX3VzZXIgKmN1cnJlbnRfZGlyOworCXN0cnVjdCBsaW51eF9kaXJlbnQ2NCBfX3VzZXIgKnByZXZpb3VzOworCWludCBjb3VudDsKKwlpbnQgZXJyb3I7Cit9OworCitzdGF0aWMgaW50IGNvbXBhdF9maWxsZGlyNjQodm9pZCAqIF9fYnVmLCBjb25zdCBjaGFyICogbmFtZSwgaW50IG5hbWxlbiwgbG9mZl90IG9mZnNldCwKKwkJICAgICBpbm9fdCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCit7CisJc3RydWN0IGxpbnV4X2RpcmVudDY0IF9fdXNlciAqZGlyZW50OworCXN0cnVjdCBjb21wYXRfZ2V0ZGVudHNfY2FsbGJhY2s2NCAqYnVmID0gX19idWY7CisJaW50IGpqID0gTkFNRV9PRkZTRVQoZGlyZW50KTsKKwlpbnQgcmVjbGVuID0gQ09NUEFUX1JPVU5EX1VQNjQoamogKyBuYW1sZW4gKyAxKTsKKwl1NjQgb2ZmOworCisJYnVmLT5lcnJvciA9IC1FSU5WQUw7CS8qIG9ubHkgdXNlZCBpZiB3ZSBmYWlsLi4gKi8KKwlpZiAocmVjbGVuID4gYnVmLT5jb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGlyZW50ID0gYnVmLT5wcmV2aW91czsKKworCWlmIChkaXJlbnQpIHsKKwkJaWYgKF9fcHV0X3VzZXJfdW5hbGlnbmVkKG9mZnNldCwgJmRpcmVudC0+ZF9vZmYpKQorCQkJZ290byBlZmF1bHQ7CisJfQorCWRpcmVudCA9IGJ1Zi0+Y3VycmVudF9kaXI7CisJaWYgKF9fcHV0X3VzZXJfdW5hbGlnbmVkKGlubywgJmRpcmVudC0+ZF9pbm8pKQorCQlnb3RvIGVmYXVsdDsKKwlvZmYgPSAwOworCWlmIChfX3B1dF91c2VyX3VuYWxpZ25lZChvZmYsICZkaXJlbnQtPmRfb2ZmKSkKKwkJZ290byBlZmF1bHQ7CisJaWYgKF9fcHV0X3VzZXIocmVjbGVuLCAmZGlyZW50LT5kX3JlY2xlbikpCisJCWdvdG8gZWZhdWx0OworCWlmIChfX3B1dF91c2VyKGRfdHlwZSwgJmRpcmVudC0+ZF90eXBlKSkKKwkJZ290byBlZmF1bHQ7CisJaWYgKGNvcHlfdG9fdXNlcihkaXJlbnQtPmRfbmFtZSwgbmFtZSwgbmFtbGVuKSkKKwkJZ290byBlZmF1bHQ7CisJaWYgKF9fcHV0X3VzZXIoMCwgZGlyZW50LT5kX25hbWUgKyBuYW1sZW4pKQorCQlnb3RvIGVmYXVsdDsKKwlidWYtPnByZXZpb3VzID0gZGlyZW50OworCWRpcmVudCA9ICh2b2lkIF9fdXNlciAqKWRpcmVudCArIHJlY2xlbjsKKwlidWYtPmN1cnJlbnRfZGlyID0gZGlyZW50OworCWJ1Zi0+Y291bnQgLT0gcmVjbGVuOworCXJldHVybiAwOworZWZhdWx0OgorCWJ1Zi0+ZXJyb3IgPSAtRUZBVUxUOworCXJldHVybiAtRUZBVUxUOworfQorCithc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19nZXRkZW50czY0KHVuc2lnbmVkIGludCBmZCwKKwkJc3RydWN0IGxpbnV4X2RpcmVudDY0IF9fdXNlciAqIGRpcmVudCwgdW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCBmaWxlICogZmlsZTsKKwlzdHJ1Y3QgbGludXhfZGlyZW50NjQgX191c2VyICogbGFzdGRpcmVudDsKKwlzdHJ1Y3QgY29tcGF0X2dldGRlbnRzX2NhbGxiYWNrNjQgYnVmOworCWludCBlcnJvcjsKKworCWVycm9yID0gLUVGQVVMVDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRpcmVudCwgY291bnQpKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gLUVCQURGOworCWZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gb3V0OworCisJYnVmLmN1cnJlbnRfZGlyID0gZGlyZW50OworCWJ1Zi5wcmV2aW91cyA9IE5VTEw7CisJYnVmLmNvdW50ID0gY291bnQ7CisJYnVmLmVycm9yID0gMDsKKworCWVycm9yID0gdmZzX3JlYWRkaXIoZmlsZSwgY29tcGF0X2ZpbGxkaXI2NCwgJmJ1Zik7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXRfcHV0ZjsKKwllcnJvciA9IGJ1Zi5lcnJvcjsKKwlsYXN0ZGlyZW50ID0gYnVmLnByZXZpb3VzOworCWlmIChsYXN0ZGlyZW50KSB7CisJCXR5cGVvZihsYXN0ZGlyZW50LT5kX29mZikgZF9vZmYgPSBmaWxlLT5mX3BvczsKKwkJX19wdXRfdXNlcl91bmFsaWduZWQoZF9vZmYsICZsYXN0ZGlyZW50LT5kX29mZik7CisJCWVycm9yID0gY291bnQgLSBidWYuY291bnQ7CisJfQorCitvdXRfcHV0ZjoKKwlmcHV0KGZpbGUpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKyNlbmRpZiAvKiAhIF9fQVJDSF9PTUlUX0NPTVBBVF9TWVNfR0VUREVOVFM2NCAqLworCitzdGF0aWMgc3NpemVfdCBjb21wYXRfZG9fcmVhZHZfd3JpdGV2KGludCB0eXBlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqdXZlY3RvciwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCAqcG9zKQoreworCXR5cGVkZWYgc3NpemVfdCAoKmlvX2ZuX3QpKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOworCXR5cGVkZWYgc3NpemVfdCAoKmlvdl9mbl90KShzdHJ1Y3QgZmlsZSAqLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKiwgdW5zaWduZWQgbG9uZywgbG9mZl90ICopOworCisJY29tcGF0X3NzaXplX3QgdG90X2xlbjsKKwlzdHJ1Y3QgaW92ZWMgaW92c3RhY2tbVUlPX0ZBU1RJT1ZdOworCXN0cnVjdCBpb3ZlYyAqaW92PWlvdnN0YWNrLCAqdmVjdG9yOworCXNzaXplX3QgcmV0OworCWludCBzZWc7CisJaW9fZm5fdCBmbjsKKwlpb3ZfZm5fdCBmbnY7CisKKwkvKgorCSAqIFN1UyBzYXlzICJUaGUgcmVhZHYoKSBmdW5jdGlvbiAqbWF5KiBmYWlsIGlmIHRoZSBpb3ZjbnQgYXJndW1lbnQKKwkgKiB3YXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDAsIG9yIGdyZWF0ZXIgdGhhbiB7SU9WX01BWH0uICBMaW51eCBoYXMKKwkgKiB0cmFkaXRpb25hbGx5IHJldHVybmVkIHplcm8gZm9yIHplcm8gc2VnbWVudHMsIHNvLi4uCisJICovCisJcmV0ID0gMDsKKwlpZiAobnJfc2VncyA9PSAwKQorCQlnb3RvIG91dDsKKworCS8qCisJICogRmlyc3QgZ2V0IHRoZSAic3RydWN0IGlvdmVjIiBmcm9tIHVzZXIgbWVtb3J5IGFuZAorCSAqIHZlcmlmeSBhbGwgdGhlIHBvaW50ZXJzCisJICovCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAoKG5yX3NlZ3MgPiBVSU9fTUFYSU9WKSB8fCAobnJfc2VncyA8PSAwKSkKKwkJZ290byBvdXQ7CisJaWYgKCFmaWxlLT5mX29wKQorCQlnb3RvIG91dDsKKwlpZiAobnJfc2VncyA+IFVJT19GQVNUSU9WKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWlvdiA9IGttYWxsb2MobnJfc2VncypzaXplb2Yoc3RydWN0IGlvdmVjKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaW92KQorCQkJZ290byBvdXQ7CisJfQorCXJldCA9IC1FRkFVTFQ7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHV2ZWN0b3IsIG5yX3NlZ3Mqc2l6ZW9mKCp1dmVjdG9yKSkpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBTaW5nbGUgdW5peCBzcGVjaWZpY2F0aW9uOgorCSAqIFdlIHNob3VsZCAtRUlOVkFMIGlmIGFuIGVsZW1lbnQgbGVuZ3RoIGlzIG5vdCA+PSAwIGFuZCBmaXR0aW5nIGFuCisJICogc3NpemVfdC4gIFRoZSB0b3RhbCBsZW5ndGggaXMgZml0dGluZyBhbiBzc2l6ZV90CisJICoKKwkgKiBCZSBjYXJlZnVsIGhlcmUgYmVjYXVzZSBpb3ZfbGVuIGlzIGEgc2l6ZV90IG5vdCBhbiBzc2l6ZV90CisJICovCisJdG90X2xlbiA9IDA7CisJdmVjdG9yID0gaW92OworCXJldCA9IC1FSU5WQUw7CisJZm9yIChzZWcgPSAwIDsgc2VnIDwgbnJfc2Vnczsgc2VnKyspIHsKKwkJY29tcGF0X3NzaXplX3QgdG1wID0gdG90X2xlbjsKKwkJY29tcGF0X3NzaXplX3QgbGVuOworCQljb21wYXRfdXB0cl90IGJ1ZjsKKworCQlpZiAoX19nZXRfdXNlcihsZW4sICZ1dmVjdG9yLT5pb3ZfbGVuKSB8fAorCQkgICAgX19nZXRfdXNlcihidWYsICZ1dmVjdG9yLT5pb3ZfYmFzZSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAobGVuIDwgMCkJLyogc2l6ZV90IG5vdCBmaXR0aW5nIGFuIGNvbXBhdF9zc2l6ZV90IC4uICovCisJCQlnb3RvIG91dDsKKwkJdG90X2xlbiArPSBsZW47CisJCWlmICh0b3RfbGVuIDwgdG1wKSAvKiBtYXRocyBvdmVyZmxvdyBvbiB0aGUgY29tcGF0X3NzaXplX3QgKi8KKwkJCWdvdG8gb3V0OworCQl2ZWN0b3ItPmlvdl9iYXNlID0gY29tcGF0X3B0cihidWYpOworCQl2ZWN0b3ItPmlvdl9sZW4gPSAoY29tcGF0X3NpemVfdCkgbGVuOworCQl1dmVjdG9yKys7CisJCXZlY3RvcisrOworCX0KKwlpZiAodG90X2xlbiA9PSAwKSB7CisJCXJldCA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHJ3X3ZlcmlmeV9hcmVhKHR5cGUsIGZpbGUsIHBvcywgdG90X2xlbik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlmbnYgPSBOVUxMOworCWlmICh0eXBlID09IFJFQUQpIHsKKwkJZm4gPSBmaWxlLT5mX29wLT5yZWFkOworCQlmbnYgPSBmaWxlLT5mX29wLT5yZWFkdjsKKwl9IGVsc2UgeworCQlmbiA9IChpb19mbl90KWZpbGUtPmZfb3AtPndyaXRlOworCQlmbnYgPSBmaWxlLT5mX29wLT53cml0ZXY7CisJfQorCWlmIChmbnYpIHsKKwkJcmV0ID0gZm52KGZpbGUsIGlvdiwgbnJfc2VncywgcG9zKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRG8gaXQgYnkgaGFuZCwgd2l0aCBmaWxlLW9wcyAqLworCXJldCA9IDA7CisJdmVjdG9yID0gaW92OworCXdoaWxlIChucl9zZWdzID4gMCkgeworCQl2b2lkIF9fdXNlciAqIGJhc2U7CisJCXNpemVfdCBsZW47CisJCXNzaXplX3QgbnI7CisKKwkJYmFzZSA9IHZlY3Rvci0+aW92X2Jhc2U7CisJCWxlbiA9IHZlY3Rvci0+aW92X2xlbjsKKwkJdmVjdG9yKys7CisJCW5yX3NlZ3MtLTsKKworCQluciA9IGZuKGZpbGUsIGJhc2UsIGxlbiwgcG9zKTsKKworCQlpZiAobnIgPCAwKSB7CisJCQlpZiAoIXJldCkgcmV0ID0gbnI7CisJCQlicmVhazsKKwkJfQorCQlyZXQgKz0gbnI7CisJCWlmIChuciAhPSBsZW4pCisJCQlicmVhazsKKwl9CitvdXQ6CisJaWYgKGlvdiAhPSBpb3ZzdGFjaykKKwkJa2ZyZWUoaW92KTsKKwlpZiAoKHJldCArICh0eXBlID09IFJFQUQpKSA+IDApCisJCWRub3RpZnlfcGFyZW50KGZpbGUtPmZfZGVudHJ5LAorCQkJCSh0eXBlID09IFJFQUQpID8gRE5fQUNDRVNTIDogRE5fTU9ESUZZKTsKKwlyZXR1cm4gcmV0OworfQorCithc21saW5rYWdlIHNzaXplX3QKK2NvbXBhdF9zeXNfcmVhZHYodW5zaWduZWQgbG9uZyBmZCwgY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKnZlYywgdW5zaWduZWQgbG9uZyB2bGVuKQoreworCXN0cnVjdCBmaWxlICpmaWxlOworCXNzaXplX3QgcmV0ID0gLUVCQURGOworCisJZmlsZSA9IGZnZXQoZmQpOworCWlmICghZmlsZSkKKwkJcmV0dXJuIC1FQkFERjsKKworCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FSU5WQUw7CisJaWYgKCFmaWxlLT5mX29wIHx8ICghZmlsZS0+Zl9vcC0+cmVhZHYgJiYgIWZpbGUtPmZfb3AtPnJlYWQpKQorCQlnb3RvIG91dDsKKworCXJldCA9IGNvbXBhdF9kb19yZWFkdl93cml0ZXYoUkVBRCwgZmlsZSwgdmVjLCB2bGVuLCAmZmlsZS0+Zl9wb3MpOworCitvdXQ6CisJZnB1dChmaWxlKTsKKwlyZXR1cm4gcmV0OworfQorCithc21saW5rYWdlIHNzaXplX3QKK2NvbXBhdF9zeXNfd3JpdGV2KHVuc2lnbmVkIGxvbmcgZmQsIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICp2ZWMsIHVuc2lnbmVkIGxvbmcgdmxlbikKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzc2l6ZV90IHJldCA9IC1FQkFERjsKKworCWZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbGUpCisJCXJldHVybiAtRUJBREY7CisJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FSU5WQUw7CisJaWYgKCFmaWxlLT5mX29wIHx8ICghZmlsZS0+Zl9vcC0+d3JpdGV2ICYmICFmaWxlLT5mX29wLT53cml0ZSkpCisJCWdvdG8gb3V0OworCisJcmV0ID0gY29tcGF0X2RvX3JlYWR2X3dyaXRldihXUklURSwgZmlsZSwgdmVjLCB2bGVuLCAmZmlsZS0+Zl9wb3MpOworCitvdXQ6CisJZnB1dChmaWxlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogY29tcGF0X2NvdW50KCkgY291bnRzIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzL2VudmVsb3Blcy4gSXQgaXMgYmFzaWNhbGx5CisgKiBhIGNvcHkgb2YgY291bnQoKSBmcm9tIGZzL2V4ZWMuYywgZXhjZXB0IHRoYXQgaXQgd29ya3Mgd2l0aCAzMiBiaXQgYXJndgorICogYW5kIGVudnAgcG9pbnRlcnMuCisgKi8KK3N0YXRpYyBpbnQgY29tcGF0X2NvdW50KGNvbXBhdF91cHRyX3QgX191c2VyICphcmd2LCBpbnQgbWF4KQoreworCWludCBpID0gMDsKKworCWlmIChhcmd2ICE9IE5VTEwpIHsKKwkJZm9yICg7OykgeworCQkJY29tcGF0X3VwdHJfdCBwOworCisJCQlpZiAoZ2V0X3VzZXIocCwgYXJndikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoIXApCisJCQkJYnJlYWs7CisJCQlhcmd2Kys7CisJCQlpZigrK2kgPiBtYXgpCisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJfQorCX0KKwlyZXR1cm4gaTsKK30KKworLyoKKyAqIGNvbXBhdF9jb3B5X3N0cmluZ3MoKSBpcyBiYXNpY2FsbHkgYSBjb3B5IG9mIGNvcHlfc3RyaW5ncygpIGZyb20gZnMvZXhlYy5jCisgKiBleGNlcHQgdGhhdCBpdCB3b3JrcyB3aXRoIDMyIGJpdCBhcmd2IGFuZCBlbnZwIHBvaW50ZXJzLgorICovCitzdGF0aWMgaW50IGNvbXBhdF9jb3B5X3N0cmluZ3MoaW50IGFyZ2MsIGNvbXBhdF91cHRyX3QgX191c2VyICphcmd2LAorCQkJCXN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCit7CisJc3RydWN0IHBhZ2UgKmttYXBwZWRfcGFnZSA9IE5VTEw7CisJY2hhciAqa2FkZHIgPSBOVUxMOworCWludCByZXQ7CisKKwl3aGlsZSAoYXJnYy0tID4gMCkgeworCQljb21wYXRfdXB0cl90IHN0cjsKKwkJaW50IGxlbjsKKwkJdW5zaWduZWQgbG9uZyBwb3M7CisKKwkJaWYgKGdldF91c2VyKHN0ciwgYXJndithcmdjKSB8fAorCQkJIShsZW4gPSBzdHJubGVuX3VzZXIoY29tcGF0X3B0cihzdHIpLCBicHJtLT5wKSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChicHJtLT5wIDwgbGVuKSAgeworCQkJcmV0ID0gLUUyQklHOworCQkJZ290byBvdXQ7CisJCX0KKworCQlicHJtLT5wIC09IGxlbjsKKwkJLyogWFhYOiBhZGQgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIG92ZXJmbG93IGNoZWNrIGhlcmUuICovCisJCXBvcyA9IGJwcm0tPnA7CisKKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCWludCBpLCBuZXcsIGVycjsKKwkJCWludCBvZmZzZXQsIGJ5dGVzX3RvX2NvcHk7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCQkJb2Zmc2V0ID0gcG9zICUgUEFHRV9TSVpFOworCQkJaSA9IHBvcy9QQUdFX1NJWkU7CisJCQlwYWdlID0gYnBybS0+cGFnZVtpXTsKKwkJCW5ldyA9IDA7CisJCQlpZiAoIXBhZ2UpIHsKKwkJCQlwYWdlID0gYWxsb2NfcGFnZShHRlBfSElHSFVTRVIpOworCQkJCWJwcm0tPnBhZ2VbaV0gPSBwYWdlOworCQkJCWlmICghcGFnZSkgeworCQkJCQlyZXQgPSAtRU5PTUVNOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJbmV3ID0gMTsKKwkJCX0KKworCQkJaWYgKHBhZ2UgIT0ga21hcHBlZF9wYWdlKSB7CisJCQkJaWYgKGttYXBwZWRfcGFnZSkKKwkJCQkJa3VubWFwKGttYXBwZWRfcGFnZSk7CisJCQkJa21hcHBlZF9wYWdlID0gcGFnZTsKKwkJCQlrYWRkciA9IGttYXAoa21hcHBlZF9wYWdlKTsKKwkJCX0KKwkJCWlmIChuZXcgJiYgb2Zmc2V0KQorCQkJCW1lbXNldChrYWRkciwgMCwgb2Zmc2V0KTsKKwkJCWJ5dGVzX3RvX2NvcHkgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7CisJCQlpZiAoYnl0ZXNfdG9fY29weSA+IGxlbikgeworCQkJCWJ5dGVzX3RvX2NvcHkgPSBsZW47CisJCQkJaWYgKG5ldykKKwkJCQkJbWVtc2V0KGthZGRyK29mZnNldCtsZW4sIDAsCisJCQkJCQlQQUdFX1NJWkUtb2Zmc2V0LWxlbik7CisJCQl9CisJCQllcnIgPSBjb3B5X2Zyb21fdXNlcihrYWRkcitvZmZzZXQsIGNvbXBhdF9wdHIoc3RyKSwKKwkJCQkJCWJ5dGVzX3RvX2NvcHkpOworCQkJaWYgKGVycikgeworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXBvcyArPSBieXRlc190b19jb3B5OworCQkJc3RyICs9IGJ5dGVzX3RvX2NvcHk7CisJCQlsZW4gLT0gYnl0ZXNfdG9fY29weTsKKwkJfQorCX0KKwlyZXQgPSAwOworb3V0OgorCWlmIChrbWFwcGVkX3BhZ2UpCisJCWt1bm1hcChrbWFwcGVkX3BhZ2UpOworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfTU1VCisKKyNkZWZpbmUgZnJlZV9hcmdfcGFnZXMoYnBybSkgZG8geyB9IHdoaWxlICgwKQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9hcmdfcGFnZXMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQVJHX1BBR0VTOyBpKyspIHsKKwkJaWYgKGJwcm0tPnBhZ2VbaV0pCisJCQlfX2ZyZWVfcGFnZShicHJtLT5wYWdlW2ldKTsKKwkJYnBybS0+cGFnZVtpXSA9IE5VTEw7CisJfQorfQorCisjZW5kaWYgLyogQ09ORklHX01NVSAqLworCisvKgorICogY29tcGF0X2RvX2V4ZWN2ZSgpIGlzIG1vc3RseSBhIGNvcHkgb2YgZG9fZXhlY3ZlKCksIHdpdGggdGhlIGV4Y2VwdGlvbgorICogdGhhdCBpdCBwcm9jZXNzZXMgMzIgYml0IGFyZ3YgYW5kIGVudnAgcG9pbnRlcnMuCisgKi8KK2ludCBjb21wYXRfZG9fZXhlY3ZlKGNoYXIgKiBmaWxlbmFtZSwKKwljb21wYXRfdXB0cl90IF9fdXNlciAqYXJndiwKKwljb21wYXRfdXB0cl90IF9fdXNlciAqZW52cCwKKwlzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybTsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlpbnQgcmV0dmFsOworCWludCBpOworCisJcmV0dmFsID0gLUVOT01FTTsKKwlicHJtID0ga21hbGxvYyhzaXplb2YoKmJwcm0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJwcm0pCisJCWdvdG8gb3V0X3JldDsKKwltZW1zZXQoYnBybSwgMCwgc2l6ZW9mKCpicHJtKSk7CisKKwlmaWxlID0gb3Blbl9leGVjKGZpbGVuYW1lKTsKKwlyZXR2YWwgPSBQVFJfRVJSKGZpbGUpOworCWlmIChJU19FUlIoZmlsZSkpCisJCWdvdG8gb3V0X2tmcmVlOworCisJc2NoZWRfZXhlYygpOworCisJYnBybS0+cCA9IFBBR0VfU0laRSpNQVhfQVJHX1BBR0VTLXNpemVvZih2b2lkICopOworCWJwcm0tPmZpbGUgPSBmaWxlOworCWJwcm0tPmZpbGVuYW1lID0gZmlsZW5hbWU7CisJYnBybS0+aW50ZXJwID0gZmlsZW5hbWU7CisJYnBybS0+bW0gPSBtbV9hbGxvYygpOworCXJldHZhbCA9IC1FTk9NRU07CisJaWYgKCFicHJtLT5tbSkKKwkJZ290byBvdXRfZmlsZTsKKworCXJldHZhbCA9IGluaXRfbmV3X2NvbnRleHQoY3VycmVudCwgYnBybS0+bW0pOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIG91dF9tbTsKKworCWJwcm0tPmFyZ2MgPSBjb21wYXRfY291bnQoYXJndiwgYnBybS0+cCAvIHNpemVvZihjb21wYXRfdXB0cl90KSk7CisJaWYgKChyZXR2YWwgPSBicHJtLT5hcmdjKSA8IDApCisJCWdvdG8gb3V0X21tOworCisJYnBybS0+ZW52YyA9IGNvbXBhdF9jb3VudChlbnZwLCBicHJtLT5wIC8gc2l6ZW9mKGNvbXBhdF91cHRyX3QpKTsKKwlpZiAoKHJldHZhbCA9IGJwcm0tPmVudmMpIDwgMCkKKwkJZ290byBvdXRfbW07CisKKwlyZXR2YWwgPSBzZWN1cml0eV9icHJtX2FsbG9jKGJwcm0pOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCisJcmV0dmFsID0gcHJlcGFyZV9iaW5wcm0oYnBybSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0dmFsID0gY29weV9zdHJpbmdzX2tlcm5lbCgxLCAmYnBybS0+ZmlsZW5hbWUsIGJwcm0pOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIG91dDsKKworCWJwcm0tPmV4ZWMgPSBicHJtLT5wOworCXJldHZhbCA9IGNvbXBhdF9jb3B5X3N0cmluZ3MoYnBybS0+ZW52YywgZW52cCwgYnBybSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0dmFsID0gY29tcGF0X2NvcHlfc3RyaW5ncyhicHJtLT5hcmdjLCBhcmd2LCBicHJtKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXR2YWwgPSBzZWFyY2hfYmluYXJ5X2hhbmRsZXIoYnBybSwgcmVncyk7CisJaWYgKHJldHZhbCA+PSAwKSB7CisJCWZyZWVfYXJnX3BhZ2VzKGJwcm0pOworCisJCS8qIGV4ZWN2ZSBzdWNjZXNzICovCisJCXNlY3VyaXR5X2Jwcm1fZnJlZShicHJtKTsKKwkJa2ZyZWUoYnBybSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCitvdXQ6CisJLyogU29tZXRoaW5nIHdlbnQgd3JvbmcsIHJldHVybiB0aGUgaW5vZGUgYW5kIGZyZWUgdGhlIGFyZ3VtZW50IHBhZ2VzKi8KKwlmb3IgKGkgPSAwIDsgaSA8IE1BWF9BUkdfUEFHRVMgOyBpKyspIHsKKwkJc3RydWN0IHBhZ2UgKiBwYWdlID0gYnBybS0+cGFnZVtpXTsKKwkJaWYgKHBhZ2UpCisJCQlfX2ZyZWVfcGFnZShwYWdlKTsKKwl9CisKKwlpZiAoYnBybS0+c2VjdXJpdHkpCisJCXNlY3VyaXR5X2Jwcm1fZnJlZShicHJtKTsKKworb3V0X21tOgorCWlmIChicHJtLT5tbSkKKwkJbW1kcm9wKGJwcm0tPm1tKTsKKworb3V0X2ZpbGU6CisJaWYgKGJwcm0tPmZpbGUpIHsKKwkJYWxsb3dfd3JpdGVfYWNjZXNzKGJwcm0tPmZpbGUpOworCQlmcHV0KGJwcm0tPmZpbGUpOworCX0KKworb3V0X2tmcmVlOgorCWtmcmVlKGJwcm0pOworCitvdXRfcmV0OgorCXJldHVybiByZXR2YWw7Cit9CisKKyNkZWZpbmUgX19DT01QQVRfTkZEQklUUyAgICAgICAoOCAqIHNpemVvZihjb21wYXRfdWxvbmdfdCkpCisKKyNkZWZpbmUgUk9VTkRfVVAoeCx5KSAoKCh4KSsoeSktMSkvKHkpKQorCisvKgorICogT29vLCBuYXN0eS4gIFdlIG5lZWQgaGVyZSB0byBmcm9iIDMyLWJpdCB1bnNpZ25lZCBsb25ncyB0bworICogNjQtYml0IHVuc2lnbmVkIGxvbmdzLgorICovCitzdGF0aWMgaW5saW5lCitpbnQgY29tcGF0X2dldF9mZF9zZXQodW5zaWduZWQgbG9uZyBuciwgY29tcGF0X3Vsb25nX3QgX191c2VyICp1ZmRzZXQsCisJCQl1bnNpZ25lZCBsb25nICpmZHNldCkKK3sKKwluciA9IFJPVU5EX1VQKG5yLCBfX0NPTVBBVF9ORkRCSVRTKTsKKwlpZiAodWZkc2V0KSB7CisJCXVuc2lnbmVkIGxvbmcgb2RkOworCisJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdWZkc2V0LCBucipzaXplb2YoY29tcGF0X3Vsb25nX3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCW9kZCA9IG5yICYgMVVMOworCQluciAmPSB+MVVMOworCQl3aGlsZSAobnIpIHsKKwkJCXVuc2lnbmVkIGxvbmcgaCwgbDsKKwkJCV9fZ2V0X3VzZXIobCwgdWZkc2V0KTsKKwkJCV9fZ2V0X3VzZXIoaCwgdWZkc2V0KzEpOworCQkJdWZkc2V0ICs9IDI7CisJCQkqZmRzZXQrKyA9IGggPDwgMzIgfCBsOworCQkJbnIgLT0gMjsKKwkJfQorCQlpZiAob2RkKQorCQkJX19nZXRfdXNlcigqZmRzZXQsIHVmZHNldCk7CisJfSBlbHNlIHsKKwkJLyogVHJpY2t5LCBtdXN0IGNsZWFyIGZ1bGwgdW5zaWduZWQgbG9uZyBpbiB0aGUKKwkJICoga2VybmVsIGZkc2V0IGF0IHRoZSBlbmQsIHRoaXMgbWFrZXMgc3VyZSB0aGF0CisJCSAqIGFjdHVhbGx5IGhhcHBlbnMuCisJCSAqLworCQltZW1zZXQoZmRzZXQsIDAsICgobnIgKyAxKSAmIH4xKSpzaXplb2YoY29tcGF0X3Vsb25nX3QpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgY29tcGF0X3NldF9mZF9zZXQodW5zaWduZWQgbG9uZyBuciwgY29tcGF0X3Vsb25nX3QgX191c2VyICp1ZmRzZXQsCisJCQl1bnNpZ25lZCBsb25nICpmZHNldCkKK3sKKwl1bnNpZ25lZCBsb25nIG9kZDsKKwluciA9IFJPVU5EX1VQKG5yLCBfX0NPTVBBVF9ORkRCSVRTKTsKKworCWlmICghdWZkc2V0KQorCQlyZXR1cm47CisKKwlvZGQgPSBuciAmIDFVTDsKKwluciAmPSB+MVVMOworCXdoaWxlIChucikgeworCQl1bnNpZ25lZCBsb25nIGgsIGw7CisJCWwgPSAqZmRzZXQrKzsKKwkJaCA9IGwgPj4gMzI7CisJCV9fcHV0X3VzZXIobCwgdWZkc2V0KTsKKwkJX19wdXRfdXNlcihoLCB1ZmRzZXQrMSk7CisJCXVmZHNldCArPSAyOworCQluciAtPSAyOworCX0KKwlpZiAob2RkKQorCQlfX3B1dF91c2VyKCpmZHNldCwgdWZkc2V0KTsKK30KKworCisvKgorICogVGhpcyBpcyBhIHZpcnR1YWwgY29weSBvZiBzeXNfc2VsZWN0IGZyb20gZnMvc2VsZWN0LmMgYW5kIHByb2JhYmx5CisgKiBzaG91bGQgYmUgY29tcGFyZWQgdG8gaXQgZnJvbSB0aW1lIHRvIHRpbWUKKyAqLworc3RhdGljIHZvaWQgKnNlbGVjdF9iaXRzX2FsbG9jKGludCBzaXplKQoreworCXJldHVybiBrbWFsbG9jKDYgKiBzaXplLCBHRlBfS0VSTkVMKTsKK30KKworc3RhdGljIHZvaWQgc2VsZWN0X2JpdHNfZnJlZSh2b2lkICpiaXRzLCBpbnQgc2l6ZSkKK3sKKwlrZnJlZShiaXRzKTsKK30KKworLyoKKyAqIFdlIGNhbiBhY3R1YWxseSByZXR1cm4gRVJFU1RBUlRTWVMgaW5zdGVhZCBvZiBFSU5UUiwgYnV0IEknZAorICogbGlrZSB0byBiZSBjZXJ0YWluIHRoaXMgbGVhZHMgdG8gbm8gcHJvYmxlbXMuIFNvIEkgcmV0dXJuCisgKiBFSU5UUiBqdXN0IGZvciBzYWZldHkuCisgKgorICogVXBkYXRlOiBFUkVTVEFSVFNZUyBicmVha3MgYXQgbGVhc3QgdGhlIHh2aWV3IGNsb2NrIGJpbmFyeSwgc28KKyAqIEknbSB0cnlpbmcgRVJFU1RBUlROT0hBTkQgd2hpY2ggcmVzdGFydCBvbmx5IHdoZW4geW91IHdhbnQgdG8uCisgKi8KKyNkZWZpbmUgTUFYX1NFTEVDVF9TRUNPTkRTIFwKKwkoKHVuc2lnbmVkIGxvbmcpIChNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKS0xKQorCithc21saW5rYWdlIGxvbmcKK2NvbXBhdF9zeXNfc2VsZWN0KGludCBuLCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKmlucCwgY29tcGF0X3Vsb25nX3QgX191c2VyICpvdXRwLAorCQljb21wYXRfdWxvbmdfdCBfX3VzZXIgKmV4cCwgc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqdHZwKQoreworCWZkX3NldF9iaXRzIGZkczsKKwljaGFyICpiaXRzOworCWxvbmcgdGltZW91dDsKKwlpbnQgc2l6ZSwgbWF4X2Zkc2V0LCByZXQgPSAtRUlOVkFMOworCisJdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCWlmICh0dnApIHsKKwkJdGltZV90IHNlYywgdXNlYzsKKworCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdHZwLCBzaXplb2YoKnR2cCkpCisJCSAgICB8fCBfX2dldF91c2VyKHNlYywgJnR2cC0+dHZfc2VjKQorCQkgICAgfHwgX19nZXRfdXNlcih1c2VjLCAmdHZwLT50dl91c2VjKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0X25vZmRzOworCQl9CisKKwkJaWYgKHNlYyA8IDAgfHwgdXNlYyA8IDApCisJCQlnb3RvIG91dF9ub2ZkczsKKworCQlpZiAoKHVuc2lnbmVkIGxvbmcpIHNlYyA8IE1BWF9TRUxFQ1RfU0VDT05EUykgeworCQkJdGltZW91dCA9IFJPVU5EX1VQKHVzZWMsIDEwMDAwMDAvSFopOworCQkJdGltZW91dCArPSBzZWMgKiAodW5zaWduZWQgbG9uZykgSFo7CisJCX0KKwl9CisKKwlpZiAobiA8IDApCisJCWdvdG8gb3V0X25vZmRzOworCisJLyogbWF4X2Zkc2V0IGNhbiBpbmNyZWFzZSwgc28gZ3JhYiBpdCBvbmNlIHRvIGF2b2lkIHJhY2UgKi8KKwltYXhfZmRzZXQgPSBjdXJyZW50LT5maWxlcy0+bWF4X2Zkc2V0OworCWlmIChuID4gbWF4X2Zkc2V0KQorCQluID0gbWF4X2Zkc2V0OworCisJLyoKKwkgKiBXZSBuZWVkIDYgYml0bWFwcyAoaW4vb3V0L2V4IGZvciBib3RoIGluY29taW5nIGFuZCBvdXRnb2luZyksCisJICogc2luY2Ugd2UgdXNlZCBmZHNldCB3ZSBuZWVkIHRvIGFsbG9jYXRlIG1lbW9yeSBpbiB1bml0cyBvZgorCSAqIGxvbmctd29yZHMuCisJICovCisJcmV0ID0gLUVOT01FTTsKKwlzaXplID0gRkRTX0JZVEVTKG4pOworCWJpdHMgPSBzZWxlY3RfYml0c19hbGxvYyhzaXplKTsKKwlpZiAoIWJpdHMpCisJCWdvdG8gb3V0X25vZmRzOworCWZkcy5pbiAgICAgID0gKHVuc2lnbmVkIGxvbmcgKikgIGJpdHM7CisJZmRzLm91dCAgICAgPSAodW5zaWduZWQgbG9uZyAqKSAoYml0cyArICAgc2l6ZSk7CisJZmRzLmV4ICAgICAgPSAodW5zaWduZWQgbG9uZyAqKSAoYml0cyArIDIqc2l6ZSk7CisJZmRzLnJlc19pbiAgPSAodW5zaWduZWQgbG9uZyAqKSAoYml0cyArIDMqc2l6ZSk7CisJZmRzLnJlc19vdXQgPSAodW5zaWduZWQgbG9uZyAqKSAoYml0cyArIDQqc2l6ZSk7CisJZmRzLnJlc19leCAgPSAodW5zaWduZWQgbG9uZyAqKSAoYml0cyArIDUqc2l6ZSk7CisKKwlpZiAoKHJldCA9IGNvbXBhdF9nZXRfZmRfc2V0KG4sIGlucCwgZmRzLmluKSkgfHwKKwkgICAgKHJldCA9IGNvbXBhdF9nZXRfZmRfc2V0KG4sIG91dHAsIGZkcy5vdXQpKSB8fAorCSAgICAocmV0ID0gY29tcGF0X2dldF9mZF9zZXQobiwgZXhwLCBmZHMuZXgpKSkKKwkJZ290byBvdXQ7CisJemVyb19mZF9zZXQobiwgZmRzLnJlc19pbik7CisJemVyb19mZF9zZXQobiwgZmRzLnJlc19vdXQpOworCXplcm9fZmRfc2V0KG4sIGZkcy5yZXNfZXgpOworCisJcmV0ID0gZG9fc2VsZWN0KG4sICZmZHMsICZ0aW1lb3V0KTsKKworCWlmICh0dnAgJiYgIShjdXJyZW50LT5wZXJzb25hbGl0eSAmIFNUSUNLWV9USU1FT1VUUykpIHsKKwkJdGltZV90IHNlYyA9IDAsIHVzZWMgPSAwOworCQlpZiAodGltZW91dCkgeworCQkJc2VjID0gdGltZW91dCAvIEhaOworCQkJdXNlYyA9IHRpbWVvdXQgJSBIWjsKKwkJCXVzZWMgKj0gKDEwMDAwMDAvSFopOworCQl9CisJCWlmIChwdXRfdXNlcihzZWMsICZ0dnAtPnR2X3NlYykgfHwKKwkJICAgIHB1dF91c2VyKHVzZWMsICZ0dnAtPnR2X3VzZWMpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwl9CisKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJaWYgKCFyZXQpIHsKKwkJcmV0ID0gLUVSRVNUQVJUTk9IQU5EOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlnb3RvIG91dDsKKwkJcmV0ID0gMDsKKwl9CisKKwljb21wYXRfc2V0X2ZkX3NldChuLCBpbnAsIGZkcy5yZXNfaW4pOworCWNvbXBhdF9zZXRfZmRfc2V0KG4sIG91dHAsIGZkcy5yZXNfb3V0KTsKKwljb21wYXRfc2V0X2ZkX3NldChuLCBleHAsIGZkcy5yZXNfZXgpOworCitvdXQ6CisJc2VsZWN0X2JpdHNfZnJlZShiaXRzLCBzaXplKTsKK291dF9ub2ZkczoKKwlyZXR1cm4gcmV0OworfQorCisjaWYgZGVmaW5lZChDT05GSUdfTkZTRCkgfHwgZGVmaW5lZChDT05GSUdfTkZTRF9NT0RVTEUpCisvKiBTdHVmZiBmb3IgTkZTIHNlcnZlciBzeXNjYWxscy4uLiAqLworc3RydWN0IGNvbXBhdF9uZnNjdGxfc3ZjIHsKKwl1MTYJCQlzdmMzMl9wb3J0OworCXMzMgkJCXN2YzMyX250aHJlYWRzOworfTsKKworc3RydWN0IGNvbXBhdF9uZnNjdGxfY2xpZW50IHsKKwlzOAkJCWNsMzJfaWRlbnRbTkZTQ0xOVF9JRE1BWCsxXTsKKwlzMzIJCQljbDMyX25hZGRyOworCXN0cnVjdCBpbl9hZGRyCQljbDMyX2FkZHJsaXN0W05GU0NMTlRfQUREUk1BWF07CisJczMyCQkJY2wzMl9maGtleXR5cGU7CisJczMyCQkJY2wzMl9maGtleWxlbjsKKwl1OAkJCWNsMzJfZmhrZXlbTkZTQ0xOVF9LRVlNQVhdOworfTsKKworc3RydWN0IGNvbXBhdF9uZnNjdGxfZXhwb3J0IHsKKwljaGFyCQlleDMyX2NsaWVudFtORlNDTE5UX0lETUFYKzFdOworCWNoYXIJCWV4MzJfcGF0aFtORlNfTUFYUEFUSExFTisxXTsKKwljb21wYXRfZGV2X3QJZXgzMl9kZXY7CisJY29tcGF0X2lub190CWV4MzJfaW5vOworCWNvbXBhdF9pbnRfdAlleDMyX2ZsYWdzOworCWNvbXBhdF91aWRfdAlleDMyX2Fub25fdWlkOworCWNvbXBhdF9naWRfdAlleDMyX2Fub25fZ2lkOworfTsKKworc3RydWN0IGNvbXBhdF9uZnNjdGxfZmRwYXJtIHsKKwlzdHJ1Y3Qgc29ja2FkZHIJCWdkMzJfYWRkcjsKKwlzOAkJCWdkMzJfcGF0aFtORlNfTUFYUEFUSExFTisxXTsKKwljb21wYXRfaW50X3QJCWdkMzJfdmVyc2lvbjsKK307CisKK3N0cnVjdCBjb21wYXRfbmZzY3RsX2ZzcGFybSB7CisJc3RydWN0IHNvY2thZGRyCQlnZDMyX2FkZHI7CisJczgJCQlnZDMyX3BhdGhbTkZTX01BWFBBVEhMRU4rMV07CisJY29tcGF0X2ludF90CQlnZDMyX21heGxlbjsKK307CisKK3N0cnVjdCBjb21wYXRfbmZzY3RsX2FyZyB7CisJY29tcGF0X2ludF90CQljYTMyX3ZlcnNpb247CS8qIHNhZmVndWFyZCAqLworCXVuaW9uIHsKKwkJc3RydWN0IGNvbXBhdF9uZnNjdGxfc3ZjCXUzMl9zdmM7CisJCXN0cnVjdCBjb21wYXRfbmZzY3RsX2NsaWVudAl1MzJfY2xpZW50OworCQlzdHJ1Y3QgY29tcGF0X25mc2N0bF9leHBvcnQJdTMyX2V4cG9ydDsKKwkJc3RydWN0IGNvbXBhdF9uZnNjdGxfZmRwYXJtCXUzMl9nZXRmZDsKKwkJc3RydWN0IGNvbXBhdF9uZnNjdGxfZnNwYXJtCXUzMl9nZXRmczsKKwl9IHU7CisjZGVmaW5lIGNhMzJfc3ZjCXUudTMyX3N2YworI2RlZmluZSBjYTMyX2NsaWVudAl1LnUzMl9jbGllbnQKKyNkZWZpbmUgY2EzMl9leHBvcnQJdS51MzJfZXhwb3J0CisjZGVmaW5lIGNhMzJfZ2V0ZmQJdS51MzJfZ2V0ZmQKKyNkZWZpbmUgY2EzMl9nZXRmcwl1LnUzMl9nZXRmcworfTsKKwordW5pb24gY29tcGF0X25mc2N0bF9yZXMgeworCV9fdTgJCQljcjMyX2dldGZoW05GU19GSFNJWkVdOworCXN0cnVjdCBrbmZzZF9maAkJY3IzMl9nZXRmczsKK307CisKK3N0YXRpYyBpbnQgY29tcGF0X25mc19zdmNfdHJhbnMoc3RydWN0IG5mc2N0bF9hcmcgKmthcmcsIHN0cnVjdCBjb21wYXRfbmZzY3RsX2FyZyBfX3VzZXIgKmFyZykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gYWNjZXNzX29rKFZFUklGWV9SRUFELCAmYXJnLT5jYTMyX3N2Yywgc2l6ZW9mKGFyZy0+Y2EzMl9zdmMpKTsKKwllcnIgfD0gZ2V0X3VzZXIoa2FyZy0+Y2FfdmVyc2lvbiwgJmFyZy0+Y2EzMl92ZXJzaW9uKTsKKwllcnIgfD0gX19nZXRfdXNlcihrYXJnLT5jYV9zdmMuc3ZjX3BvcnQsICZhcmctPmNhMzJfc3ZjLnN2YzMyX3BvcnQpOworCWVyciB8PSBfX2dldF91c2VyKGthcmctPmNhX3N2Yy5zdmNfbnRocmVhZHMsICZhcmctPmNhMzJfc3ZjLnN2YzMyX250aHJlYWRzKTsKKwlyZXR1cm4gKGVycikgPyAtRUZBVUxUIDogMDsKK30KKworc3RhdGljIGludCBjb21wYXRfbmZzX2NsbnRfdHJhbnMoc3RydWN0IG5mc2N0bF9hcmcgKmthcmcsIHN0cnVjdCBjb21wYXRfbmZzY3RsX2FyZyBfX3VzZXIgKmFyZykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gYWNjZXNzX29rKFZFUklGWV9SRUFELCAmYXJnLT5jYTMyX2NsaWVudCwgc2l6ZW9mKGFyZy0+Y2EzMl9jbGllbnQpKTsKKwllcnIgfD0gZ2V0X3VzZXIoa2FyZy0+Y2FfdmVyc2lvbiwgJmFyZy0+Y2EzMl92ZXJzaW9uKTsKKwllcnIgfD0gX19jb3B5X2Zyb21fdXNlcigma2FyZy0+Y2FfY2xpZW50LmNsX2lkZW50WzBdLAorCQkJICAmYXJnLT5jYTMyX2NsaWVudC5jbDMyX2lkZW50WzBdLAorCQkJICBORlNDTE5UX0lETUFYKTsKKwllcnIgfD0gX19nZXRfdXNlcihrYXJnLT5jYV9jbGllbnQuY2xfbmFkZHIsICZhcmctPmNhMzJfY2xpZW50LmNsMzJfbmFkZHIpOworCWVyciB8PSBfX2NvcHlfZnJvbV91c2VyKCZrYXJnLT5jYV9jbGllbnQuY2xfYWRkcmxpc3RbMF0sCisJCQkgICZhcmctPmNhMzJfY2xpZW50LmNsMzJfYWRkcmxpc3RbMF0sCisJCQkgIChzaXplb2Yoc3RydWN0IGluX2FkZHIpICogTkZTQ0xOVF9BRERSTUFYKSk7CisJZXJyIHw9IF9fZ2V0X3VzZXIoa2FyZy0+Y2FfY2xpZW50LmNsX2Zoa2V5dHlwZSwKKwkJICAgICAgJmFyZy0+Y2EzMl9jbGllbnQuY2wzMl9maGtleXR5cGUpOworCWVyciB8PSBfX2dldF91c2VyKGthcmctPmNhX2NsaWVudC5jbF9maGtleWxlbiwKKwkJICAgICAgJmFyZy0+Y2EzMl9jbGllbnQuY2wzMl9maGtleWxlbik7CisJZXJyIHw9IF9fY29weV9mcm9tX3VzZXIoJmthcmctPmNhX2NsaWVudC5jbF9maGtleVswXSwKKwkJCSAgJmFyZy0+Y2EzMl9jbGllbnQuY2wzMl9maGtleVswXSwKKwkJCSAgTkZTQ0xOVF9LRVlNQVgpOworCisJcmV0dXJuIChlcnIpID8gLUVGQVVMVCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgY29tcGF0X25mc19leHBfdHJhbnMoc3RydWN0IG5mc2N0bF9hcmcgKmthcmcsIHN0cnVjdCBjb21wYXRfbmZzY3RsX2FyZyBfX3VzZXIgKmFyZykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gYWNjZXNzX29rKFZFUklGWV9SRUFELCAmYXJnLT5jYTMyX2V4cG9ydCwgc2l6ZW9mKGFyZy0+Y2EzMl9leHBvcnQpKTsKKwllcnIgfD0gZ2V0X3VzZXIoa2FyZy0+Y2FfdmVyc2lvbiwgJmFyZy0+Y2EzMl92ZXJzaW9uKTsKKwllcnIgfD0gX19jb3B5X2Zyb21fdXNlcigma2FyZy0+Y2FfZXhwb3J0LmV4X2NsaWVudFswXSwKKwkJCSAgJmFyZy0+Y2EzMl9leHBvcnQuZXgzMl9jbGllbnRbMF0sCisJCQkgIE5GU0NMTlRfSURNQVgpOworCWVyciB8PSBfX2NvcHlfZnJvbV91c2VyKCZrYXJnLT5jYV9leHBvcnQuZXhfcGF0aFswXSwKKwkJCSAgJmFyZy0+Y2EzMl9leHBvcnQuZXgzMl9wYXRoWzBdLAorCQkJICBORlNfTUFYUEFUSExFTik7CisJZXJyIHw9IF9fZ2V0X3VzZXIoa2FyZy0+Y2FfZXhwb3J0LmV4X2RldiwKKwkJICAgICAgJmFyZy0+Y2EzMl9leHBvcnQuZXgzMl9kZXYpOworCWVyciB8PSBfX2dldF91c2VyKGthcmctPmNhX2V4cG9ydC5leF9pbm8sCisJCSAgICAgICZhcmctPmNhMzJfZXhwb3J0LmV4MzJfaW5vKTsKKwllcnIgfD0gX19nZXRfdXNlcihrYXJnLT5jYV9leHBvcnQuZXhfZmxhZ3MsCisJCSAgICAgICZhcmctPmNhMzJfZXhwb3J0LmV4MzJfZmxhZ3MpOworCWVyciB8PSBfX2dldF91c2VyKGthcmctPmNhX2V4cG9ydC5leF9hbm9uX3VpZCwKKwkJICAgICAgJmFyZy0+Y2EzMl9leHBvcnQuZXgzMl9hbm9uX3VpZCk7CisJZXJyIHw9IF9fZ2V0X3VzZXIoa2FyZy0+Y2FfZXhwb3J0LmV4X2Fub25fZ2lkLAorCQkgICAgICAmYXJnLT5jYTMyX2V4cG9ydC5leDMyX2Fub25fZ2lkKTsKKwlTRVRfVUlEKGthcmctPmNhX2V4cG9ydC5leF9hbm9uX3VpZCwga2FyZy0+Y2FfZXhwb3J0LmV4X2Fub25fdWlkKTsKKwlTRVRfR0lEKGthcmctPmNhX2V4cG9ydC5leF9hbm9uX2dpZCwga2FyZy0+Y2FfZXhwb3J0LmV4X2Fub25fZ2lkKTsKKworCXJldHVybiAoZXJyKSA/IC1FRkFVTFQgOiAwOworfQorCitzdGF0aWMgaW50IGNvbXBhdF9uZnNfZ2V0ZmRfdHJhbnMoc3RydWN0IG5mc2N0bF9hcmcgKmthcmcsIHN0cnVjdCBjb21wYXRfbmZzY3RsX2FyZyBfX3VzZXIgKmFyZykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gYWNjZXNzX29rKFZFUklGWV9SRUFELCAmYXJnLT5jYTMyX2dldGZkLCBzaXplb2YoYXJnLT5jYTMyX2dldGZkKSk7CisJZXJyIHw9IGdldF91c2VyKGthcmctPmNhX3ZlcnNpb24sICZhcmctPmNhMzJfdmVyc2lvbik7CisJZXJyIHw9IF9fY29weV9mcm9tX3VzZXIoJmthcmctPmNhX2dldGZkLmdkX2FkZHIsCisJCQkgICZhcmctPmNhMzJfZ2V0ZmQuZ2QzMl9hZGRyLAorCQkJICAoc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpKTsKKwllcnIgfD0gX19jb3B5X2Zyb21fdXNlcigma2FyZy0+Y2FfZ2V0ZmQuZ2RfcGF0aCwKKwkJCSAgJmFyZy0+Y2EzMl9nZXRmZC5nZDMyX3BhdGgsCisJCQkgIChORlNfTUFYUEFUSExFTisxKSk7CisJZXJyIHw9IF9fZ2V0X3VzZXIoa2FyZy0+Y2FfZ2V0ZmQuZ2RfdmVyc2lvbiwKKwkJICAgICAgJmFyZy0+Y2EzMl9nZXRmZC5nZDMyX3ZlcnNpb24pOworCisJcmV0dXJuIChlcnIpID8gLUVGQVVMVCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgY29tcGF0X25mc19nZXRmc190cmFucyhzdHJ1Y3QgbmZzY3RsX2FyZyAqa2FyZywgc3RydWN0IGNvbXBhdF9uZnNjdGxfYXJnIF9fdXNlciAqYXJnKQoreworCWludCBlcnI7CisKKwllcnIgPSBhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICZhcmctPmNhMzJfZ2V0ZnMsIHNpemVvZihhcmctPmNhMzJfZ2V0ZnMpKTsKKwllcnIgfD0gZ2V0X3VzZXIoa2FyZy0+Y2FfdmVyc2lvbiwgJmFyZy0+Y2EzMl92ZXJzaW9uKTsKKwllcnIgfD0gX19jb3B5X2Zyb21fdXNlcigma2FyZy0+Y2FfZ2V0ZnMuZ2RfYWRkciwKKwkJCSAgJmFyZy0+Y2EzMl9nZXRmcy5nZDMyX2FkZHIsCisJCQkgIChzaXplb2Yoc3RydWN0IHNvY2thZGRyKSkpOworCWVyciB8PSBfX2NvcHlfZnJvbV91c2VyKCZrYXJnLT5jYV9nZXRmcy5nZF9wYXRoLAorCQkJICAmYXJnLT5jYTMyX2dldGZzLmdkMzJfcGF0aCwKKwkJCSAgKE5GU19NQVhQQVRITEVOKzEpKTsKKwllcnIgfD0gX19nZXRfdXNlcihrYXJnLT5jYV9nZXRmcy5nZF9tYXhsZW4sCisJCSAgICAgICZhcmctPmNhMzJfZ2V0ZnMuZ2QzMl9tYXhsZW4pOworCisJcmV0dXJuIChlcnIpID8gLUVGQVVMVCA6IDA7Cit9CisKKy8qIFRoaXMgcmVhbGx5IGRvZXNuJ3QgbmVlZCB0cmFuc2xhdGlvbnMsIHdlIGFyZSBvbmx5IHBhc3NpbmcKKyAqIGJhY2sgYSB1bmlvbiB3aGljaCBjb250YWlucyBvcGFxdWUgbmZzIGZpbGUgaGFuZGxlIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQgY29tcGF0X25mc19nZXRmaF9yZXNfdHJhbnModW5pb24gbmZzY3RsX3JlcyAqa3JlcywgdW5pb24gY29tcGF0X25mc2N0bF9yZXMgX191c2VyICpyZXMpCit7CisJaW50IGVycjsKKworCWVyciA9IGNvcHlfdG9fdXNlcihyZXMsIGtyZXMsIHNpemVvZigqcmVzKSk7CisKKwlyZXR1cm4gKGVycikgPyAtRUZBVUxUIDogMDsKK30KKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbmZzc2VydmN0bChpbnQgY21kLCBzdHJ1Y3QgY29tcGF0X25mc2N0bF9hcmcgX191c2VyICphcmcsCisJCQkJCXVuaW9uIGNvbXBhdF9uZnNjdGxfcmVzIF9fdXNlciAqcmVzKQoreworCXN0cnVjdCBuZnNjdGxfYXJnICprYXJnOworCXVuaW9uIG5mc2N0bF9yZXMgKmtyZXM7CisJbW1fc2VnbWVudF90IG9sZGZzOworCWludCBlcnI7CisKKwlrYXJnID0ga21hbGxvYyhzaXplb2YoKmthcmcpLCBHRlBfVVNFUik7CisJa3JlcyA9IGttYWxsb2Moc2l6ZW9mKCprcmVzKSwgR0ZQX1VTRVIpOworCWlmKCFrYXJnIHx8ICFrcmVzKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBORlNDVExfU1ZDOgorCQllcnIgPSBjb21wYXRfbmZzX3N2Y190cmFucyhrYXJnLCBhcmcpOworCQlicmVhazsKKworCWNhc2UgTkZTQ1RMX0FERENMSUVOVDoKKwkJZXJyID0gY29tcGF0X25mc19jbG50X3RyYW5zKGthcmcsIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBORlNDVExfREVMQ0xJRU5UOgorCQllcnIgPSBjb21wYXRfbmZzX2NsbnRfdHJhbnMoa2FyZywgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIE5GU0NUTF9FWFBPUlQ6CisJY2FzZSBORlNDVExfVU5FWFBPUlQ6CisJCWVyciA9IGNvbXBhdF9uZnNfZXhwX3RyYW5zKGthcmcsIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBORlNDVExfR0VURkQ6CisJCWVyciA9IGNvbXBhdF9uZnNfZ2V0ZmRfdHJhbnMoa2FyZywgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIE5GU0NUTF9HRVRGUzoKKwkJZXJyID0gY29tcGF0X25mc19nZXRmc190cmFucyhrYXJnLCBhcmcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlvbGRmcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCS8qIFRoZSBfX3VzZXIgcG9pbnRlciBjYXN0cyBhcmUgdmFsaWQgYmVjYXVzZSBvZiB0aGUgc2V0X2ZzKCkgKi8KKwllcnIgPSBzeXNfbmZzc2VydmN0bChjbWQsICh2b2lkIF9fdXNlciAqKSBrYXJnLCAodm9pZCBfX3VzZXIgKikga3Jlcyk7CisJc2V0X2ZzKG9sZGZzKTsKKworCWlmIChlcnIpCisJCWdvdG8gZG9uZTsKKworCWlmKChjbWQgPT0gTkZTQ1RMX0dFVEZEKSB8fAorCSAgIChjbWQgPT0gTkZTQ1RMX0dFVEZTKSkKKwkJZXJyID0gY29tcGF0X25mc19nZXRmaF9yZXNfdHJhbnMoa3JlcywgcmVzKTsKKworZG9uZToKKwlrZnJlZShrYXJnKTsKKwlrZnJlZShrcmVzKTsKKwlyZXR1cm4gZXJyOworfQorI2Vsc2UgLyogIU5GU0QgKi8KK2xvbmcgYXNtbGlua2FnZSBjb21wYXRfc3lzX25mc3NlcnZjdGwoaW50IGNtZCwgdm9pZCAqbm90dXNlZCwgdm9pZCAqbm90dXNlZDIpCit7CisJcmV0dXJuIHN5c19uaV9zeXNjYWxsKCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdF9pb2N0bC5jIGIvZnMvY29tcGF0X2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1ZTYxMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NvbXBhdF9pb2N0bC5jCkBAIC0wLDAgKzEsMzA4MiBAQAorLyoKKyAqIGlvY3RsMzIuYzogQ29udmVyc2lvbiBiZXR3ZWVuIDMyYml0IGFuZCA2NGJpdCBuYXRpdmUgaW9jdGxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwICBKYWt1YiBKZWxpbmVrICAoamFrdWJAcmVkaGF0LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMTk5OCAgRWRkaWUgQy4gRG9zdCAgKGVjZEBza3luZXQuYmUpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiAgQW5kaSBLbGVlbiwgU3VTRSBMYWJzIAorICogQ29weXJpZ2h0IChDKSAyMDAzICAgICAgIFBhdmVsIE1hY2hlayAocGF2ZWxAc3VzZS5jeikKKyAqCisgKiBUaGVzZSByb3V0aW5lcyBtYWludGFpbiBhcmd1bWVudCBzaXplIGNvbnZlcnNpb24gYmV0d2VlbiAzMmJpdCBhbmQgNjRiaXQKKyAqIGlvY3Rscy4KKyAqLworCisjaWZkZWYgSU5DTFVERVMKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9icmlkZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9yYWlkL21kLmg+CisjaW5jbHVkZSA8bGludXgva2QuaD4KKyNpbmNsdWRlIDxsaW51eC9kaXJlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjZfcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvdnQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcF9kZWZzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcHBwLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcHBwb3guaD4KKyNpbmNsdWRlIDxsaW51eC9tdGlvLmg+CisjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KKyNpbmNsdWRlIDxsaW51eC9sb29wLmg+CisjaW5jbHVkZSA8bGludXgvYXV0b19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2F1dG9fZnM0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQyX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbWJfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtwZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZXZhdG9yLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl90dW4uaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L25jcF9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0YWxrLmg+CisKKyNpbmNsdWRlIDxuZXQvc29jay5oPiAgICAgICAgICAvKiBzaW9jZGV2cHJpdmF0ZV9pb2N0bCAqLworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2kuaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL3JmY29tbS5oPgorCisjaW5jbHVkZSA8bGludXgvY2FwaS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisvKiBVZ2x5IGhhY2suICovCisjdW5kZWYgX19LRVJORUxfXworI2luY2x1ZGUgPHNjc2kvc2NzaV9pb2N0bC5oPgorI2RlZmluZSBfX0tFUk5FTF9fCisjaW5jbHVkZSA8c2NzaS9zZy5oPgorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYm9uZGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvZG0taW9jdGwuaD4KKworI2luY2x1ZGUgPGFzbS9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9scC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwZGV2Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9hdG0uaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1jbGlwLmg+CisjaW5jbHVkZSA8bGludXgvYXRtZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYXRtaW9jLmg+CisjaW5jbHVkZSA8bGludXgvYXRtbGVjLmg+CisjaW5jbHVkZSA8bGludXgvYXRtbXBjLmg+CisjaW5jbHVkZSA8bGludXgvYXRtc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvYXRtX3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvYXRtX3N1bmkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91c2JkZXZpY2VfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uYmQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tc2Rvc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdGNkdmQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2hpZGRldi5oPgorCisjdW5kZWYgSU5DTFVERVMKKyNlbmRpZgorCisjaWZkZWYgQ09ERQorCisvKiBBaWVlLiBTb21lb25lIGRvZXMgbm90IGZpbmQgYSBkaWZmZXJlbmNlIGJldHdlZW4gaW50IGFuZCBsb25nICovCisjZGVmaW5lIEVYVDJfSU9DMzJfR0VURkxBR1MgICAgICAgICAgICAgICBfSU9SKCdmJywgMSwgaW50KQorI2RlZmluZSBFWFQyX0lPQzMyX1NFVEZMQUdTICAgICAgICAgICAgICAgX0lPVygnZicsIDIsIGludCkKKyNkZWZpbmUgRVhUMl9JT0MzMl9HRVRWRVJTSU9OICAgICAgICAgICAgIF9JT1IoJ3YnLCAxLCBpbnQpCisjZGVmaW5lIEVYVDJfSU9DMzJfU0VUVkVSU0lPTiAgICAgICAgICAgICBfSU9XKCd2JywgMiwgaW50KQorCitzdGF0aWMgaW50IHdfbG9uZyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgdmFsOworCQorCXNldF9mcyAoS0VSTkVMX0RTKTsKKwllcnIgPSBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpJnZhbCk7CisJc2V0X2ZzIChvbGRfZnMpOworCWlmICghZXJyICYmIHB1dF91c2VyKHZhbCwgKHUzMiBfX3VzZXIgKiljb21wYXRfcHRyKGFyZykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gZXJyOworfQorIAorc3RhdGljIGludCByd19sb25nKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCXUzMiBfX3VzZXIgKmFyZ3B0ciA9IGNvbXBhdF9wdHIoYXJnKTsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgdmFsOworCQorCWlmKGdldF91c2VyKHZhbCwgYXJncHRyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc2V0X2ZzIChLRVJORUxfRFMpOworCWVyciA9IHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZykmdmFsKTsKKwlzZXRfZnMgKG9sZF9mcyk7CisJaWYgKCFlcnIgJiYgcHV0X3VzZXIodmFsLCBhcmdwdHIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRvX2V4dDJfaW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwkvKiBUaGVzZSBhcmUganVzdCBtaXNuYW1lZCwgdGhleSBhY3R1YWxseSBnZXQvcHV0IGZyb20vdG8gdXNlciBhbiBpbnQgKi8KKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRVhUMl9JT0MzMl9HRVRGTEFHUzogY21kID0gRVhUMl9JT0NfR0VURkxBR1M7IGJyZWFrOworCWNhc2UgRVhUMl9JT0MzMl9TRVRGTEFHUzogY21kID0gRVhUMl9JT0NfU0VURkxBR1M7IGJyZWFrOworCWNhc2UgRVhUMl9JT0MzMl9HRVRWRVJTSU9OOiBjbWQgPSBFWFQyX0lPQ19HRVRWRVJTSU9OOyBicmVhazsKKwljYXNlIEVYVDJfSU9DMzJfU0VUVkVSU0lPTjogY21kID0gRVhUMl9JT0NfU0VUVkVSU0lPTjsgYnJlYWs7CisJfQorCXJldHVybiBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpY29tcGF0X3B0cihhcmcpKTsKK30KKworc3RydWN0IHZpZGVvX3R1bmVyMzIgeworCWNvbXBhdF9pbnRfdCB0dW5lcjsKKwljaGFyIG5hbWVbMzJdOworCWNvbXBhdF91bG9uZ190IHJhbmdlbG93LCByYW5nZWhpZ2g7CisJdTMyIGZsYWdzOwkvKiBJdCBpcyByZWFsbHkgdTMyIGluIHZpZGVvZGV2LmggKi8KKwl1MTYgbW9kZSwgc2lnbmFsOworfTsKKworc3RhdGljIGludCBnZXRfdmlkZW9fdHVuZXIzMihzdHJ1Y3QgdmlkZW9fdHVuZXIgKmtwLCBzdHJ1Y3QgdmlkZW9fdHVuZXIzMiBfX3VzZXIgKnVwKQoreworCWludCBpOworCisJaWYoZ2V0X3VzZXIoa3AtPnR1bmVyLCAmdXAtPnR1bmVyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZm9yKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJX19nZXRfdXNlcihrcC0+bmFtZVtpXSwgJnVwLT5uYW1lW2ldKTsKKwlfX2dldF91c2VyKGtwLT5yYW5nZWxvdywgJnVwLT5yYW5nZWxvdyk7CisJX19nZXRfdXNlcihrcC0+cmFuZ2VoaWdoLCAmdXAtPnJhbmdlaGlnaCk7CisJX19nZXRfdXNlcihrcC0+ZmxhZ3MsICZ1cC0+ZmxhZ3MpOworCV9fZ2V0X3VzZXIoa3AtPm1vZGUsICZ1cC0+bW9kZSk7CisJX19nZXRfdXNlcihrcC0+c2lnbmFsLCAmdXAtPnNpZ25hbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHV0X3ZpZGVvX3R1bmVyMzIoc3RydWN0IHZpZGVvX3R1bmVyICprcCwgc3RydWN0IHZpZGVvX3R1bmVyMzIgX191c2VyICp1cCkKK3sKKwlpbnQgaTsKKworCWlmKHB1dF91c2VyKGtwLT50dW5lciwgJnVwLT50dW5lcikpCisJCXJldHVybiAtRUZBVUxUOworCWZvcihpID0gMDsgaSA8IDMyOyBpKyspCisJCV9fcHV0X3VzZXIoa3AtPm5hbWVbaV0sICZ1cC0+bmFtZVtpXSk7CisJX19wdXRfdXNlcihrcC0+cmFuZ2Vsb3csICZ1cC0+cmFuZ2Vsb3cpOworCV9fcHV0X3VzZXIoa3AtPnJhbmdlaGlnaCwgJnVwLT5yYW5nZWhpZ2gpOworCV9fcHV0X3VzZXIoa3AtPmZsYWdzLCAmdXAtPmZsYWdzKTsKKwlfX3B1dF91c2VyKGtwLT5tb2RlLCAmdXAtPm1vZGUpOworCV9fcHV0X3VzZXIoa3AtPnNpZ25hbCwgJnVwLT5zaWduYWwpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgdmlkZW9fYnVmZmVyMzIgeworCWNvbXBhdF9jYWRkcl90IGJhc2U7CisJY29tcGF0X2ludF90IGhlaWdodCwgd2lkdGgsIGRlcHRoLCBieXRlc3BlcmxpbmU7Cit9OworCitzdGF0aWMgaW50IGdldF92aWRlb19idWZmZXIzMihzdHJ1Y3QgdmlkZW9fYnVmZmVyICprcCwgc3RydWN0IHZpZGVvX2J1ZmZlcjMyIF9fdXNlciAqdXApCit7CisJdTMyIHRtcDsKKworCWlmIChnZXRfdXNlcih0bXAsICZ1cC0+YmFzZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogVGhpcyBpcyBhY3R1YWxseSBhIHBoeXNpY2FsIGFkZHJlc3Mgc3RvcmVkCisJICogYXMgYSB2b2lkIHBvaW50ZXIuCisJICovCisJa3AtPmJhc2UgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKSB0bXA7CisKKwlfX2dldF91c2VyKGtwLT5oZWlnaHQsICZ1cC0+aGVpZ2h0KTsKKwlfX2dldF91c2VyKGtwLT53aWR0aCwgJnVwLT53aWR0aCk7CisJX19nZXRfdXNlcihrcC0+ZGVwdGgsICZ1cC0+ZGVwdGgpOworCV9fZ2V0X3VzZXIoa3AtPmJ5dGVzcGVybGluZSwgJnVwLT5ieXRlc3BlcmxpbmUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB1dF92aWRlb19idWZmZXIzMihzdHJ1Y3QgdmlkZW9fYnVmZmVyICprcCwgc3RydWN0IHZpZGVvX2J1ZmZlcjMyIF9fdXNlciAqdXApCit7CisJdTMyIHRtcCA9ICh1MzIpKCh1bnNpZ25lZCBsb25nKWtwLT5iYXNlKTsKKworCWlmKHB1dF91c2VyKHRtcCwgJnVwLT5iYXNlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJX19wdXRfdXNlcihrcC0+aGVpZ2h0LCAmdXAtPmhlaWdodCk7CisJX19wdXRfdXNlcihrcC0+d2lkdGgsICZ1cC0+d2lkdGgpOworCV9fcHV0X3VzZXIoa3AtPmRlcHRoLCAmdXAtPmRlcHRoKTsKKwlfX3B1dF91c2VyKGtwLT5ieXRlc3BlcmxpbmUsICZ1cC0+Ynl0ZXNwZXJsaW5lKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHZpZGVvX2NsaXAzMiB7CisJczMyIHgsIHksIHdpZHRoLCBoZWlnaHQ7CS8qIEl0cyByZWFsbHkgczMyIGluIHZpZGVvZGV2LmggKi8KKwljb21wYXRfY2FkZHJfdCBuZXh0OworfTsKKworc3RydWN0IHZpZGVvX3dpbmRvdzMyIHsKKwl1MzIgeCwgeSwgd2lkdGgsIGhlaWdodCwgY2hyb21ha2V5LCBmbGFnczsKKwljb21wYXRfY2FkZHJfdCBjbGlwczsKKwljb21wYXRfaW50X3QgY2xpcGNvdW50OworfTsKKworLyogWW91IGdldCBiYWNrIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBjbGlwcy4uLiAqLworc3RhdGljIGludCBwdXRfdmlkZW9fd2luZG93MzIoc3RydWN0IHZpZGVvX3dpbmRvdyAqa3AsIHN0cnVjdCB2aWRlb193aW5kb3czMiBfX3VzZXIgKnVwKQoreworCWlmKHB1dF91c2VyKGtwLT54LCAmdXAtPngpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlfX3B1dF91c2VyKGtwLT55LCAmdXAtPnkpOworCV9fcHV0X3VzZXIoa3AtPndpZHRoLCAmdXAtPndpZHRoKTsKKwlfX3B1dF91c2VyKGtwLT5oZWlnaHQsICZ1cC0+aGVpZ2h0KTsKKwlfX3B1dF91c2VyKGtwLT5jaHJvbWFrZXksICZ1cC0+Y2hyb21ha2V5KTsKKwlfX3B1dF91c2VyKGtwLT5mbGFncywgJnVwLT5mbGFncyk7CisJX19wdXRfdXNlcihrcC0+Y2xpcGNvdW50LCAmdXAtPmNsaXBjb3VudCk7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgVklESU9DR1RVTkVSMzIJCV9JT1dSKCd2Jyw0LCBzdHJ1Y3QgdmlkZW9fdHVuZXIzMikKKyNkZWZpbmUgVklESU9DU1RVTkVSMzIJCV9JT1coJ3YnLDUsIHN0cnVjdCB2aWRlb190dW5lcjMyKQorI2RlZmluZSBWSURJT0NHV0lOMzIJCV9JT1IoJ3YnLDksIHN0cnVjdCB2aWRlb193aW5kb3czMikKKyNkZWZpbmUgVklESU9DU1dJTjMyCQlfSU9XKCd2JywxMCwgc3RydWN0IHZpZGVvX3dpbmRvdzMyKQorI2RlZmluZSBWSURJT0NHRkJVRjMyCQlfSU9SKCd2JywxMSwgc3RydWN0IHZpZGVvX2J1ZmZlcjMyKQorI2RlZmluZSBWSURJT0NTRkJVRjMyCQlfSU9XKCd2JywxMiwgc3RydWN0IHZpZGVvX2J1ZmZlcjMyKQorI2RlZmluZSBWSURJT0NHRlJFUTMyCQlfSU9SKCd2JywxNCwgdTMyKQorI2RlZmluZSBWSURJT0NTRlJFUTMyCQlfSU9XKCd2JywxNSwgdTMyKQorCitlbnVtIHsKKwlNYXhDbGlwcyA9ICh+MFUtc2l6ZW9mKHN0cnVjdCB2aWRlb193aW5kb3cpKS9zaXplb2Yoc3RydWN0IHZpZGVvX2NsaXApCit9OworCitzdGF0aWMgaW50IGRvX3NldF93aW5kb3codW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdmlkZW9fd2luZG93MzIgX191c2VyICp1cCA9IGNvbXBhdF9wdHIoYXJnKTsKKwlzdHJ1Y3QgdmlkZW9fd2luZG93IF9fdXNlciAqdnc7CisJc3RydWN0IHZpZGVvX2NsaXAgX191c2VyICpwOworCWludCBuY2xpcHM7CisJdTMyIG47CisKKwlpZiAoZ2V0X3VzZXIobmNsaXBzLCAmdXAtPmNsaXBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogUGVjdWxpYXIgaW50ZXJmYWNlLi4uICovCisJaWYgKG5jbGlwcyA8IDApCisJCW5jbGlwcyA9IFZJREVPX0NMSVBNQVBfU0laRTsKKworCWlmIChuY2xpcHMgPiBNYXhDbGlwcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl2dyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihzdHJ1Y3QgdmlkZW9fd2luZG93KSArCisJCQkJICAgIG5jbGlwcyAqIHNpemVvZihzdHJ1Y3QgdmlkZW9fY2xpcCkpOworCisJcCA9IG5jbGlwcyA/IChzdHJ1Y3QgdmlkZW9fY2xpcCBfX3VzZXIgKikodncgKyAxKSA6IE5VTEw7CisKKwlpZiAoZ2V0X3VzZXIobiwgJnVwLT54KSB8fCBwdXRfdXNlcihuLCAmdnctPngpIHx8CisJICAgIGdldF91c2VyKG4sICZ1cC0+eSkgfHwgcHV0X3VzZXIobiwgJnZ3LT55KSB8fAorCSAgICBnZXRfdXNlcihuLCAmdXAtPndpZHRoKSB8fCBwdXRfdXNlcihuLCAmdnctPndpZHRoKSB8fAorCSAgICBnZXRfdXNlcihuLCAmdXAtPmhlaWdodCkgfHwgcHV0X3VzZXIobiwgJnZ3LT5oZWlnaHQpIHx8CisJICAgIGdldF91c2VyKG4sICZ1cC0+Y2hyb21ha2V5KSB8fCBwdXRfdXNlcihuLCAmdnctPmNocm9tYWtleSkgfHwKKwkgICAgZ2V0X3VzZXIobiwgJnVwLT5mbGFncykgfHwgcHV0X3VzZXIobiwgJnZ3LT5mbGFncykgfHwKKwkgICAgZ2V0X3VzZXIobiwgJnVwLT5jbGlwY291bnQpIHx8IHB1dF91c2VyKG4sICZ2dy0+Y2xpcGNvdW50KSB8fAorCSAgICBnZXRfdXNlcihuLCAmdXAtPmNsaXBzKSB8fCBwdXRfdXNlcihwLCAmdnctPmNsaXBzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAobmNsaXBzKSB7CisJCXN0cnVjdCB2aWRlb19jbGlwMzIgX191c2VyICp1ID0gY29tcGF0X3B0cihuKTsKKwkJaW50IGk7CisJCWlmICghdSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlmb3IgKGkgPSAwOyBpIDwgbmNsaXBzOyBpKyssIHUrKywgcCsrKSB7CisJCQlzMzIgdjsKKwkJCWlmIChnZXRfdXNlcih2LCAmdS0+eCkgfHwKKwkJCSAgICBwdXRfdXNlcih2LCAmcC0+eCkgfHwKKwkJCSAgICBnZXRfdXNlcih2LCAmdS0+eSkgfHwKKwkJCSAgICBwdXRfdXNlcih2LCAmcC0+eSkgfHwKKwkJCSAgICBnZXRfdXNlcih2LCAmdS0+d2lkdGgpIHx8CisJCQkgICAgcHV0X3VzZXIodiwgJnAtPndpZHRoKSB8fAorCQkJICAgIGdldF91c2VyKHYsICZ1LT5oZWlnaHQpIHx8CisJCQkgICAgcHV0X3VzZXIodiwgJnAtPmhlaWdodCkgfHwKKwkJCSAgICBwdXRfdXNlcihOVUxMLCAmcC0+bmV4dCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisKKwlyZXR1cm4gc3lzX2lvY3RsKGZkLCBWSURJT0NTV0lOLCAodW5zaWduZWQgbG9uZylwKTsKK30KKworc3RhdGljIGludCBkb192aWRlb19pb2N0bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuaW9uIHsKKwkJc3RydWN0IHZpZGVvX3R1bmVyIHZ0OworCQlzdHJ1Y3QgdmlkZW9fYnVmZmVyIHZiOworCQlzdHJ1Y3QgdmlkZW9fd2luZG93IHZ3OworCQl1bnNpZ25lZCBsb25nIHZ4OworCX0ga2FyZzsKKwltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7CisJdm9pZCBfX3VzZXIgKnVwID0gY29tcGF0X3B0cihhcmcpOworCWludCBlcnIgPSAwOworCisJLyogRmlyc3QsIGNvbnZlcnQgdGhlIGNvbW1hbmQuICovCisJc3dpdGNoKGNtZCkgeworCWNhc2UgVklESU9DR1RVTkVSMzI6IGNtZCA9IFZJRElPQ0dUVU5FUjsgYnJlYWs7CisJY2FzZSBWSURJT0NTVFVORVIzMjogY21kID0gVklESU9DU1RVTkVSOyBicmVhazsKKwljYXNlIFZJRElPQ0dXSU4zMjogY21kID0gVklESU9DR1dJTjsgYnJlYWs7CisJY2FzZSBWSURJT0NHRkJVRjMyOiBjbWQgPSBWSURJT0NHRkJVRjsgYnJlYWs7CisJY2FzZSBWSURJT0NTRkJVRjMyOiBjbWQgPSBWSURJT0NTRkJVRjsgYnJlYWs7CisJY2FzZSBWSURJT0NHRlJFUTMyOiBjbWQgPSBWSURJT0NHRlJFUTsgYnJlYWs7CisJY2FzZSBWSURJT0NTRlJFUTMyOiBjbWQgPSBWSURJT0NTRlJFUTsgYnJlYWs7CisJfTsKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFZJRElPQ1NUVU5FUjoKKwljYXNlIFZJRElPQ0dUVU5FUjoKKwkJZXJyID0gZ2V0X3ZpZGVvX3R1bmVyMzIoJmthcmcudnQsIHVwKTsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ1NGQlVGOgorCQllcnIgPSBnZXRfdmlkZW9fYnVmZmVyMzIoJmthcmcudmIsIHVwKTsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ1NGUkVROgorCQllcnIgPSBnZXRfdXNlcihrYXJnLnZ4LCAodTMyIF9fdXNlciAqKXVwKTsKKwkJYnJlYWs7CisJfTsKKwlpZihlcnIpCisJCWdvdG8gb3V0OworCisJc2V0X2ZzKEtFUk5FTF9EUyk7CisJZXJyID0gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKSZrYXJnKTsKKwlzZXRfZnMob2xkX2ZzKTsKKworCWlmKGVyciA9PSAwKSB7CisJCXN3aXRjaChjbWQpIHsKKwkJY2FzZSBWSURJT0NHVFVORVI6CisJCQllcnIgPSBwdXRfdmlkZW9fdHVuZXIzMigma2FyZy52dCwgdXApOworCQkJYnJlYWs7CisKKwkJY2FzZSBWSURJT0NHV0lOOgorCQkJZXJyID0gcHV0X3ZpZGVvX3dpbmRvdzMyKCZrYXJnLnZ3LCB1cCk7CisJCQlicmVhazsKKworCQljYXNlIFZJRElPQ0dGQlVGOgorCQkJZXJyID0gcHV0X3ZpZGVvX2J1ZmZlcjMyKCZrYXJnLnZiLCB1cCk7CisJCQlicmVhazsKKworCQljYXNlIFZJRElPQ0dGUkVROgorCQkJZXJyID0gcHV0X3VzZXIoKCh1MzIpa2FyZy52eCksICh1MzIgX191c2VyICopdXApOworCQkJYnJlYWs7CisJCX07CisJfQorb3V0OgorCXJldHVybiBlcnI7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUCitzdGF0aWMgaW50IGRvX3Npb2Nnc3RhbXAodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICp1cCA9IGNvbXBhdF9wdHIoYXJnKTsKKwlzdHJ1Y3QgdGltZXZhbCBrdHY7CisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCWludCBlcnI7CisKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwllcnIgPSBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpJmt0dik7CisJc2V0X2ZzKG9sZF9mcyk7CisJaWYoIWVycikgeworCQllcnIgPSBwdXRfdXNlcihrdHYudHZfc2VjLCAmdXAtPnR2X3NlYyk7CisJCWVyciB8PSBfX3B1dF91c2VyKGt0di50dl91c2VjLCAmdXAtPnR2X3VzZWMpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgaWZtYXAzMiB7CisJY29tcGF0X3Vsb25nX3QgbWVtX3N0YXJ0OworCWNvbXBhdF91bG9uZ190IG1lbV9lbmQ7CisJdW5zaWduZWQgc2hvcnQgYmFzZV9hZGRyOworCXVuc2lnbmVkIGNoYXIgaXJxOworCXVuc2lnbmVkIGNoYXIgZG1hOworCXVuc2lnbmVkIGNoYXIgcG9ydDsKK307CisKK3N0cnVjdCBpZnJlcTMyIHsKKyNkZWZpbmUgSUZIV0FERFJMRU4gICAgIDYKKyNkZWZpbmUgSUZOQU1TSVogICAgICAgIDE2CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgICAgICBjaGFyICAgIGlmcm5fbmFtZVtJRk5BTVNJWl07ICAgICAgICAgICAgLyogaWYgbmFtZSwgZS5nLiAiZW4wIiAqLworICAgICAgICB9IGlmcl9pZnJuOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICAgICAgc3RydWN0ICBzb2NrYWRkciBpZnJ1X2FkZHI7CisgICAgICAgICAgICAgICAgc3RydWN0ICBzb2NrYWRkciBpZnJ1X2RzdGFkZHI7CisgICAgICAgICAgICAgICAgc3RydWN0ICBzb2NrYWRkciBpZnJ1X2Jyb2FkYWRkcjsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgIHNvY2thZGRyIGlmcnVfbmV0bWFzazsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgIHNvY2thZGRyIGlmcnVfaHdhZGRyOworICAgICAgICAgICAgICAgIHNob3J0ICAgaWZydV9mbGFnczsKKyAgICAgICAgICAgICAgICBjb21wYXRfaW50X3QgICAgIGlmcnVfaXZhbHVlOworICAgICAgICAgICAgICAgIGNvbXBhdF9pbnRfdCAgICAgaWZydV9tdHU7CisgICAgICAgICAgICAgICAgc3RydWN0ICBpZm1hcDMyIGlmcnVfbWFwOworICAgICAgICAgICAgICAgIGNoYXIgICAgaWZydV9zbGF2ZVtJRk5BTVNJWl07ICAgLyogSnVzdCBmaXRzIHRoZSBzaXplICovCisJCWNoYXIJaWZydV9uZXduYW1lW0lGTkFNU0laXTsKKyAgICAgICAgICAgICAgICBjb21wYXRfY2FkZHJfdCBpZnJ1X2RhdGE7CisJICAgIC8qIFhYWFg/IGlmcnVfc2V0dGluZ3Mgc2hvdWxkIGJlIGhlcmUgKi8KKyAgICAgICAgfSBpZnJfaWZydTsKK307CisKK3N0cnVjdCBpZmNvbmYzMiB7CisgICAgICAgIGNvbXBhdF9pbnRfdAlpZmNfbGVuOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgYnVmZmVyICAgICAgICovCisgICAgICAgIGNvbXBhdF9jYWRkcl90ICBpZmNidWY7Cit9OworCitzdGF0aWMgaW50IGRldl9pZm5hbWUzMih1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGlmcmVxMzIgaWZyMzI7CisJaW50IGVycjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmaWZyMzIsIGNvbXBhdF9wdHIoYXJnKSwgc2l6ZW9mKGlmcjMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZGV2ID0gZGV2X2dldF9ieV9pbmRleChpZnIzMi5pZnJfaWZpbmRleCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJc3RybGNweShpZnIzMi5pZnJfbmFtZSwgZGV2LT5uYW1lLCBzaXplb2YoaWZyMzIuaWZyX25hbWUpKTsKKwlkZXZfcHV0KGRldik7CisJCisJZXJyID0gY29weV90b191c2VyKGNvbXBhdF9wdHIoYXJnKSwgJmlmcjMyLCBzaXplb2YoaWZyMzIpKTsKKwlyZXR1cm4gKGVyciA/IC1FRkFVTFQgOiAwKTsKK30KKworc3RhdGljIGludCBkZXZfaWZjb25mKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGlmY29uZjMyIGlmYzMyOworCXN0cnVjdCBpZmNvbmYgaWZjOworCXN0cnVjdCBpZmNvbmYgX191c2VyICp1aWZjOworCXN0cnVjdCBpZnJlcTMyIF9fdXNlciAqaWZyMzI7CisJc3RydWN0IGlmcmVxIF9fdXNlciAqaWZyOworCXVuc2lnbmVkIGludCBpLCBqOworCWludCBlcnI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmlmYzMyLCBjb21wYXRfcHRyKGFyZyksIHNpemVvZihzdHJ1Y3QgaWZjb25mMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoaWZjMzIuaWZjYnVmID09IDApIHsKKwkJaWZjMzIuaWZjX2xlbiA9IDA7CisJCWlmYy5pZmNfbGVuID0gMDsKKwkJaWZjLmlmY19yZXEgPSBOVUxMOworCQl1aWZjID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHN0cnVjdCBpZmNvbmYpKTsKKwl9IGVsc2UgeworCQlzaXplX3QgbGVuID0oKGlmYzMyLmlmY19sZW4gLyBzaXplb2YgKHN0cnVjdCBpZnJlcTMyKSkgKyAxKSAqCisJCQlzaXplb2YgKHN0cnVjdCBpZnJlcSk7CisJCXVpZmMgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2Yoc3RydWN0IGlmY29uZikgKyBsZW4pOworCQlpZmMuaWZjX2xlbiA9IGxlbjsKKwkJaWZyID0gaWZjLmlmY19yZXEgPSAodm9pZCBfX3VzZXIgKikodWlmYyArIDEpOworCQlpZnIzMiA9IGNvbXBhdF9wdHIoaWZjMzIuaWZjYnVmKTsKKwkJZm9yIChpID0gMDsgaSA8IGlmYzMyLmlmY19sZW47IGkgKz0gc2l6ZW9mIChzdHJ1Y3QgaWZyZXEzMikpIHsKKwkJCWlmIChjb3B5X2luX3VzZXIoaWZyLCBpZnIzMiwgc2l6ZW9mKHN0cnVjdCBpZnJlcTMyKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZnIrKzsKKwkJCWlmcjMyKys7IAorCQl9CisJfQorCWlmIChjb3B5X3RvX3VzZXIodWlmYywgJmlmYywgc2l6ZW9mKHN0cnVjdCBpZmNvbmYpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBzeXNfaW9jdGwgKGZkLCBTSU9DR0lGQ09ORiwgKHVuc2lnbmVkIGxvbmcpdWlmYyk7CQorCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmlmYywgdWlmYywgc2l6ZW9mKHN0cnVjdCBpZmNvbmYpKSkgCisJCXJldHVybiAtRUZBVUxUOworCisJaWZyID0gaWZjLmlmY19yZXE7CisJaWZyMzIgPSBjb21wYXRfcHRyKGlmYzMyLmlmY2J1Zik7CisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBpZmMzMi5pZmNfbGVuICYmIGogPCBpZmMuaWZjX2xlbjsKKwkgICAgIGkgKz0gc2l6ZW9mIChzdHJ1Y3QgaWZyZXEzMiksIGogKz0gc2l6ZW9mIChzdHJ1Y3QgaWZyZXEpKSB7CisJCWlmIChjb3B5X2luX3VzZXIoaWZyMzIsIGlmciwgc2l6ZW9mIChzdHJ1Y3QgaWZyZXEzMikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmcjMyKys7CisJCWlmcisrOworCX0KKworCWlmIChpZmMzMi5pZmNidWYgPT0gMCkgeworCQkvKiBUcmFuc2xhdGUgZnJvbSA2NC1iaXQgc3RydWN0dXJlIG11bHRpcGxlIHRvCisJCSAqIGEgMzItYml0IG9uZS4KKwkJICovCisJCWkgPSBpZmMuaWZjX2xlbjsKKwkJaSA9ICgoaSAvIHNpemVvZihzdHJ1Y3QgaWZyZXEpKSAqIHNpemVvZihzdHJ1Y3QgaWZyZXEzMikpOworCQlpZmMzMi5pZmNfbGVuID0gaTsKKwl9IGVsc2UgeworCQlpZiAoaSA8PSBpZmMzMi5pZmNfbGVuKQorCQkJaWZjMzIuaWZjX2xlbiA9IGk7CisJCWVsc2UKKwkJCWlmYzMyLmlmY19sZW4gPSBpIC0gc2l6ZW9mIChzdHJ1Y3QgaWZyZXEzMik7CisJfQorCWlmIChjb3B5X3RvX3VzZXIoY29tcGF0X3B0cihhcmcpLCAmaWZjMzIsIHNpemVvZihzdHJ1Y3QgaWZjb25mMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBldGh0b29sX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGlmcmVxIF9fdXNlciAqaWZyOworCXN0cnVjdCBpZnJlcTMyIF9fdXNlciAqaWZyMzI7CisJdTMyIGRhdGE7CisJdm9pZCBfX3VzZXIgKmRhdGFwOworCQorCWlmciA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqaWZyKSk7CisJaWZyMzIgPSBjb21wYXRfcHRyKGFyZyk7CisKKwlpZiAoY29weV9pbl91c2VyKCZpZnItPmlmcl9uYW1lLCAmaWZyMzItPmlmcl9uYW1lLCBJRk5BTVNJWikpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGdldF91c2VyKGRhdGEsICZpZnIzMi0+aWZyX2lmcnUuaWZydV9kYXRhKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkYXRhcCA9IGNvbXBhdF9wdHIoZGF0YSk7CisJaWYgKHB1dF91c2VyKGRhdGFwLCAmaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpIGlmcik7Cit9CisKK3N0YXRpYyBpbnQgYm9uZF9pb2N0bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpZnJlcSBraWZyOworCXN0cnVjdCBpZnJlcSBfX3VzZXIgKnVpZnI7CisJc3RydWN0IGlmcmVxMzIgX191c2VyICppZnIzMiA9IGNvbXBhdF9wdHIoYXJnKTsKKwltbV9zZWdtZW50X3Qgb2xkX2ZzOworCWludCBlcnI7CisJdTMyIGRhdGE7CisJdm9pZCBfX3VzZXIgKmRhdGFwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NCT05ERU5TTEFWRToKKwljYXNlIFNJT0NCT05EUkVMRUFTRToKKwljYXNlIFNJT0NCT05EU0VUSFdBRERSOgorCWNhc2UgU0lPQ0JPTkRDSEFOR0VBQ1RJVkU6CisJCWlmIChjb3B5X2Zyb21fdXNlcigma2lmciwgaWZyMzIsIHNpemVvZihzdHJ1Y3QgaWZyZXEzMikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJb2xkX2ZzID0gZ2V0X2ZzKCk7CisJCXNldF9mcyAoS0VSTkVMX0RTKTsKKwkJZXJyID0gc3lzX2lvY3RsIChmZCwgY21kLCAodW5zaWduZWQgbG9uZykma2lmcik7CisJCXNldF9mcyAob2xkX2ZzKTsKKworCQlyZXR1cm4gZXJyOworCWNhc2UgU0lPQ0JPTkRTTEFWRUlORk9RVUVSWToKKwljYXNlIFNJT0NCT05ESU5GT1FVRVJZOgorCQl1aWZyID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCp1aWZyKSk7CisJCWlmIChjb3B5X2luX3VzZXIoJnVpZnItPmlmcl9uYW1lLCAmaWZyMzItPmlmcl9uYW1lLCBJRk5BTVNJWikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoZ2V0X3VzZXIoZGF0YSwgJmlmcjMyLT5pZnJfaWZydS5pZnJ1X2RhdGEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJZGF0YXAgPSBjb21wYXRfcHRyKGRhdGEpOworCQlpZiAocHV0X3VzZXIoZGF0YXAsICZ1aWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIHN5c19pb2N0bCAoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpdWlmcik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfTsKK30KKworaW50IHNpb2NkZXZwcml2YXRlX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGlmcmVxIF9fdXNlciAqdV9pZnJlcTY0OworCXN0cnVjdCBpZnJlcTMyIF9fdXNlciAqdV9pZnJlcTMyID0gY29tcGF0X3B0cihhcmcpOworCWNoYXIgdG1wX2J1ZltJRk5BTVNJWl07CisJdm9pZCBfX3VzZXIgKmRhdGE2NDsKKwl1MzIgZGF0YTMyOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXBfYnVmWzBdLCAmKHVfaWZyZXEzMi0+aWZyX2lmcm4uaWZybl9uYW1lWzBdKSwKKwkJCSAgIElGTkFNU0laKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKF9fZ2V0X3VzZXIoZGF0YTMyLCAmdV9pZnJlcTMyLT5pZnJfaWZydS5pZnJ1X2RhdGEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlkYXRhNjQgPSBjb21wYXRfcHRyKGRhdGEzMik7CisKKwl1X2lmcmVxNjQgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnVfaWZyZXE2NCkpOworCisJLyogRG9uJ3QgY2hlY2sgdGhlc2UgdXNlciBhY2Nlc3NlcywganVzdCBsZXQgdGhhdCBnZXQgdHJhcHBlZAorCSAqIGluIHRoZSBpb2N0bCBoYW5kbGVyIGluc3RlYWQuCisJICovCisJaWYgKGNvcHlfdG9fdXNlcigmdV9pZnJlcTY0LT5pZnJfaWZybi5pZnJuX25hbWVbMF0sICZ0bXBfYnVmWzBdLAorCQkJIElGTkFNU0laKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKF9fcHV0X3VzZXIoZGF0YTY0LCAmdV9pZnJlcTY0LT5pZnJfaWZydS5pZnJ1X2RhdGEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpIHVfaWZyZXE2NCk7Cit9CisKK3N0YXRpYyBpbnQgZGV2X2lmc2lvYyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJc3RydWN0IGlmcmVxMzIgX191c2VyICp1aWZyMzI7CisJc3RydWN0IGlmbWFwMzIgX191c2VyICp1aWZtYXAzMjsKKwltbV9zZWdtZW50X3Qgb2xkX2ZzOworCWludCBlcnI7CisJCisJdWlmcjMyID0gY29tcGF0X3B0cihhcmcpOworCXVpZm1hcDMyID0gJnVpZnIzMi0+aWZyX2lmcnUuaWZydV9tYXA7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NTSUZNQVA6CisJCWVyciA9IGNvcHlfZnJvbV91c2VyKCZpZnIsIHVpZnIzMiwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOworCQllcnIgfD0gX19nZXRfdXNlcihpZnIuaWZyX21hcC5tZW1fc3RhcnQsICZ1aWZtYXAzMi0+bWVtX3N0YXJ0KTsKKwkJZXJyIHw9IF9fZ2V0X3VzZXIoaWZyLmlmcl9tYXAubWVtX2VuZCwgJnVpZm1hcDMyLT5tZW1fZW5kKTsKKwkJZXJyIHw9IF9fZ2V0X3VzZXIoaWZyLmlmcl9tYXAuYmFzZV9hZGRyLCAmdWlmbWFwMzItPmJhc2VfYWRkcik7CisJCWVyciB8PSBfX2dldF91c2VyKGlmci5pZnJfbWFwLmlycSwgJnVpZm1hcDMyLT5pcnEpOworCQllcnIgfD0gX19nZXRfdXNlcihpZnIuaWZyX21hcC5kbWEsICZ1aWZtYXAzMi0+ZG1hKTsKKwkJZXJyIHw9IF9fZ2V0X3VzZXIoaWZyLmlmcl9tYXAucG9ydCwgJnVpZm1hcDMyLT5wb3J0KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmlmciwgdWlmcjMyLCBzaXplb2YoKnVpZnIzMikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCX0KKwlvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMgKEtFUk5FTF9EUyk7CisJZXJyID0gc3lzX2lvY3RsIChmZCwgY21kLCAodW5zaWduZWQgbG9uZykmaWZyKTsKKwlzZXRfZnMgKG9sZF9mcyk7CisJaWYgKCFlcnIpIHsKKwkJc3dpdGNoIChjbWQpIHsKKwkJLyogVFVOU0VUSUZGIGlzIGRlZmluZWQgYXMgX0lPVywgaXQgc2hvdWxkIGJlIF9JT1JXCisJCSAqIGFzIHRoZSBkYXRhIGlzIGNvcGllZCBiYWNrIHRvIHVzZXIgc3BhY2UsIGJ1dCB0aGF0CisJCSAqIGNhbm5vdCBiZSBmaXhlZCB3aXRob3V0IGJyZWFraW5nIGFsbCBleGlzdGluZyBhcHBzLgorCQkgKi8KKwkJY2FzZSBUVU5TRVRJRkY6CisJCWNhc2UgU0lPQ0dJRkZMQUdTOgorCQljYXNlIFNJT0NHSUZNRVRSSUM6CisJCWNhc2UgU0lPQ0dJRk1UVToKKwkJY2FzZSBTSU9DR0lGTUVNOgorCQljYXNlIFNJT0NHSUZIV0FERFI6CisJCWNhc2UgU0lPQ0dJRklOREVYOgorCQljYXNlIFNJT0NHSUZBRERSOgorCQljYXNlIFNJT0NHSUZCUkRBRERSOgorCQljYXNlIFNJT0NHSUZEU1RBRERSOgorCQljYXNlIFNJT0NHSUZORVRNQVNLOgorCQljYXNlIFNJT0NHSUZUWFFMRU46CisJCQlpZiAoY29weV90b191c2VyKHVpZnIzMiwgJmlmciwgc2l6ZW9mKCp1aWZyMzIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NHSUZNQVA6CisJCQllcnIgPSBjb3B5X3RvX3VzZXIodWlmcjMyLCAmaWZyLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisJCQllcnIgfD0gX19wdXRfdXNlcihpZnIuaWZyX21hcC5tZW1fc3RhcnQsICZ1aWZtYXAzMi0+bWVtX3N0YXJ0KTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGlmci5pZnJfbWFwLm1lbV9lbmQsICZ1aWZtYXAzMi0+bWVtX2VuZCk7CisJCQllcnIgfD0gX19wdXRfdXNlcihpZnIuaWZyX21hcC5iYXNlX2FkZHIsICZ1aWZtYXAzMi0+YmFzZV9hZGRyKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGlmci5pZnJfbWFwLmlycSwgJnVpZm1hcDMyLT5pcnEpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoaWZyLmlmcl9tYXAuZG1hLCAmdWlmbWFwMzItPmRtYSk7CisJCQllcnIgfD0gX19wdXRfdXNlcihpZnIuaWZyX21hcC5wb3J0LCAmdWlmbWFwMzItPnBvcnQpOworCQkJaWYgKGVycikKKwkJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IHJ0ZW50cnkzMiB7CisgICAgICAgIHUzMiAgIAkJcnRfcGFkMTsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyIHJ0X2RzdDsgICAgICAgICAvKiB0YXJnZXQgYWRkcmVzcyAgICAgICAgICAgICAgICovCisgICAgICAgIHN0cnVjdCBzb2NrYWRkciBydF9nYXRld2F5OyAgICAgLyogZ2F0ZXdheSBhZGRyIChSVEZfR0FURVdBWSkgICAqLworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgcnRfZ2VubWFzazsgICAgIC8qIHRhcmdldCBuZXR3b3JrIG1hc2sgKElQKSAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgIHJ0X2ZsYWdzOworICAgICAgICBzaG9ydCAgICAgICAgICAgcnRfcGFkMjsKKyAgICAgICAgdTMyICAgCQlydF9wYWQzOworICAgICAgICB1bnNpZ25lZCBjaGFyICAgcnRfdG9zOworICAgICAgICB1bnNpZ25lZCBjaGFyICAgcnRfY2xhc3M7CisgICAgICAgIHNob3J0ICAgICAgICAgICBydF9wYWQ0OworICAgICAgICBzaG9ydCAgICAgICAgICAgcnRfbWV0cmljOyAgICAgIC8qICsxIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSEgKi8KKyAgICAgICAgLyogY2hhciAqICovIHUzMiBydF9kZXY7ICAgICAgICAvKiBmb3JjaW5nIHRoZSBkZXZpY2UgYXQgYWRkICAgICovCisgICAgICAgIHUzMiAgIAkJcnRfbXR1OyAgICAgICAgIC8qIHBlciByb3V0ZSBNVFUvV2luZG93ICAgICAgICAgKi8KKyAgICAgICAgdTMyICAgCQlydF93aW5kb3c7ICAgICAgLyogV2luZG93IGNsYW1waW5nICAgICAgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCAgcnRfaXJ0dDsgICAgICAgIC8qIEluaXRpYWwgUlRUICAgICAgICAgICAgICAgICAgKi8KKworfTsKKworc3RydWN0IGluNl9ydG1zZzMyIHsKKwlzdHJ1Y3QgaW42X2FkZHIJCXJ0bXNnX2RzdDsKKwlzdHJ1Y3QgaW42X2FkZHIJCXJ0bXNnX3NyYzsKKwlzdHJ1Y3QgaW42X2FkZHIJCXJ0bXNnX2dhdGV3YXk7CisJdTMyCQkJcnRtc2dfdHlwZTsKKwl1MTYJCQlydG1zZ19kc3RfbGVuOworCXUxNgkJCXJ0bXNnX3NyY19sZW47CisJdTMyCQkJcnRtc2dfbWV0cmljOworCXUzMgkJCXJ0bXNnX2luZm87CisJdTMyCQkJcnRtc2dfZmxhZ3M7CisJczMyCQkJcnRtc2dfaWZpbmRleDsKK307CisKK3N0YXRpYyBpbnQgcm91dGluZ19pb2N0bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQ7CisJdm9pZCAqciA9IE5VTEw7CisJc3RydWN0IGluNl9ydG1zZyByNjsKKwlzdHJ1Y3QgcnRlbnRyeSByNDsKKwljaGFyIGRldm5hbWVbMTZdOworCXUzMiBydGRldjsKKwltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7CisJCisJc3RydWN0IHNvY2tldCAqbXlzb2NrID0gc29ja2ZkX2xvb2t1cChmZCwgJnJldCk7CisKKwlpZiAobXlzb2NrICYmIG15c29jay0+c2sgJiYgbXlzb2NrLT5zay0+c2tfZmFtaWx5ID09IEFGX0lORVQ2KSB7IC8qIGlwdjYgKi8KKwkJc3RydWN0IGluNl9ydG1zZzMyIF9fdXNlciAqdXI2ID0gY29tcGF0X3B0cihhcmcpOworCQlyZXQgPSBjb3B5X2Zyb21fdXNlciAoJnI2LnJ0bXNnX2RzdCwgJih1cjYtPnJ0bXNnX2RzdCksCisJCQkzICogc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQlyZXQgfD0gX19nZXRfdXNlciAocjYucnRtc2dfdHlwZSwgJih1cjYtPnJ0bXNnX3R5cGUpKTsKKwkJcmV0IHw9IF9fZ2V0X3VzZXIgKHI2LnJ0bXNnX2RzdF9sZW4sICYodXI2LT5ydG1zZ19kc3RfbGVuKSk7CisJCXJldCB8PSBfX2dldF91c2VyIChyNi5ydG1zZ19zcmNfbGVuLCAmKHVyNi0+cnRtc2dfc3JjX2xlbikpOworCQlyZXQgfD0gX19nZXRfdXNlciAocjYucnRtc2dfbWV0cmljLCAmKHVyNi0+cnRtc2dfbWV0cmljKSk7CisJCXJldCB8PSBfX2dldF91c2VyIChyNi5ydG1zZ19pbmZvLCAmKHVyNi0+cnRtc2dfaW5mbykpOworCQlyZXQgfD0gX19nZXRfdXNlciAocjYucnRtc2dfZmxhZ3MsICYodXI2LT5ydG1zZ19mbGFncykpOworCQlyZXQgfD0gX19nZXRfdXNlciAocjYucnRtc2dfaWZpbmRleCwgJih1cjYtPnJ0bXNnX2lmaW5kZXgpKTsKKwkJCisJCXIgPSAodm9pZCAqKSAmcjY7CisJfSBlbHNlIHsgLyogaXB2NCAqLworCQlzdHJ1Y3QgcnRlbnRyeTMyIF9fdXNlciAqdXI0ID0gY29tcGF0X3B0cihhcmcpOworCQlyZXQgPSBjb3B5X2Zyb21fdXNlciAoJnI0LnJ0X2RzdCwgJih1cjQtPnJ0X2RzdCksCisJCQkJCTMgKiBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7CisJCXJldCB8PSBfX2dldF91c2VyIChyNC5ydF9mbGFncywgJih1cjQtPnJ0X2ZsYWdzKSk7CisJCXJldCB8PSBfX2dldF91c2VyIChyNC5ydF9tZXRyaWMsICYodXI0LT5ydF9tZXRyaWMpKTsKKwkJcmV0IHw9IF9fZ2V0X3VzZXIgKHI0LnJ0X210dSwgJih1cjQtPnJ0X210dSkpOworCQlyZXQgfD0gX19nZXRfdXNlciAocjQucnRfd2luZG93LCAmKHVyNC0+cnRfd2luZG93KSk7CisJCXJldCB8PSBfX2dldF91c2VyIChyNC5ydF9pcnR0LCAmKHVyNC0+cnRfaXJ0dCkpOworCQlyZXQgfD0gX19nZXRfdXNlciAocnRkZXYsICYodXI0LT5ydF9kZXYpKTsKKwkJaWYgKHJ0ZGV2KSB7CisJCQlyZXQgfD0gY29weV9mcm9tX3VzZXIgKGRldm5hbWUsIGNvbXBhdF9wdHIocnRkZXYpLCAxNSk7CisJCQlyNC5ydF9kZXYgPSBkZXZuYW1lOyBkZXZuYW1lWzE1XSA9IDA7CisJCX0gZWxzZQorCQkJcjQucnRfZGV2ID0gTlVMTDsKKworCQlyID0gKHZvaWQgKikgJnI0OworCX0KKworCWlmIChyZXQpCisJCXJldHVybiAtRUZBVUxUOworCisJc2V0X2ZzIChLRVJORUxfRFMpOworCXJldCA9IHN5c19pb2N0bCAoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpIHIpOworCXNldF9mcyAob2xkX2ZzKTsKKworCWlmIChteXNvY2spCisJCXNvY2tmZF9wdXQobXlzb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworc3RydWN0IGhkX2dlb21ldHJ5MzIgeworCXVuc2lnbmVkIGNoYXIgaGVhZHM7CisJdW5zaWduZWQgY2hhciBzZWN0b3JzOworCXVuc2lnbmVkIHNob3J0IGN5bGluZGVyczsKKwl1MzIgc3RhcnQ7Cit9OworICAgICAgICAgICAgICAgICAgICAgICAgCitzdGF0aWMgaW50IGhkaW9fZ2V0Z2VvKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCXN0cnVjdCBoZF9nZW9tZXRyeSBnZW87CisJc3RydWN0IGhkX2dlb21ldHJ5MzIgX191c2VyICp1Z2VvOworCWludCBlcnI7CisJCisJc2V0X2ZzIChLRVJORUxfRFMpOworCWVyciA9IHN5c19pb2N0bChmZCwgSERJT19HRVRHRU8sICh1bnNpZ25lZCBsb25nKSZnZW8pOworCXNldF9mcyAob2xkX2ZzKTsKKwl1Z2VvID0gY29tcGF0X3B0cihhcmcpOworCWlmICghZXJyKSB7CisJCWVyciA9IGNvcHlfdG9fdXNlciAodWdlbywgJmdlbywgNCk7CisJCWVyciB8PSBfX3B1dF91c2VyIChnZW8uc3RhcnQsICZ1Z2VvLT5zdGFydCk7CisJfQorCXJldHVybiBlcnIgPyAtRUZBVUxUIDogMDsKK30KKworc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvMzIgeworCWNoYXIJCQlpZFsxNl07CisgICAgICAgIGNvbXBhdF9jYWRkcl90CXNtZW1fc3RhcnQ7CisJdTMyCQkJc21lbV9sZW47CisJdTMyCQkJdHlwZTsKKwl1MzIJCQl0eXBlX2F1eDsKKwl1MzIJCQl2aXN1YWw7CisJdTE2CQkJeHBhbnN0ZXA7CisJdTE2CQkJeXBhbnN0ZXA7CisJdTE2CQkJeXdyYXBzdGVwOworCXUzMgkJCWxpbmVfbGVuZ3RoOworICAgICAgICBjb21wYXRfY2FkZHJfdAltbWlvX3N0YXJ0OworCXUzMgkJCW1taW9fbGVuOworCXUzMgkJCWFjY2VsOworCXUxNgkJCXJlc2VydmVkWzNdOworfTsKKworc3RydWN0IGZiX2NtYXAzMiB7CisJdTMyCQkJc3RhcnQ7CisJdTMyCQkJbGVuOworCWNvbXBhdF9jYWRkcl90CXJlZDsKKwljb21wYXRfY2FkZHJfdAlncmVlbjsKKwljb21wYXRfY2FkZHJfdAlibHVlOworCWNvbXBhdF9jYWRkcl90CXRyYW5zcDsKK307CisKK3N0YXRpYyBpbnQgZmJfZ2V0cHV0X2NtYXAodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZmJfY21hcF91c2VyIF9fdXNlciAqY21hcDsKKwlzdHJ1Y3QgZmJfY21hcDMyIF9fdXNlciAqY21hcDMyOworCV9fdTMyIGRhdGE7CisJaW50IGVycjsKKworCWNtYXAgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmNtYXApKTsKKwljbWFwMzIgPSBjb21wYXRfcHRyKGFyZyk7CisKKwlpZiAoY29weV9pbl91c2VyKCZjbWFwLT5zdGFydCwgJmNtYXAzMi0+c3RhcnQsIDIgKiBzaXplb2YoX191MzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZ2V0X3VzZXIoZGF0YSwgJmNtYXAzMi0+cmVkKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKGRhdGEpLCAmY21hcC0+cmVkKSB8fAorCSAgICBnZXRfdXNlcihkYXRhLCAmY21hcDMyLT5ncmVlbikgfHwKKwkgICAgcHV0X3VzZXIoY29tcGF0X3B0cihkYXRhKSwgJmNtYXAtPmdyZWVuKSB8fAorCSAgICBnZXRfdXNlcihkYXRhLCAmY21hcDMyLT5ibHVlKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKGRhdGEpLCAmY21hcC0+Ymx1ZSkgfHwKKwkgICAgZ2V0X3VzZXIoZGF0YSwgJmNtYXAzMi0+dHJhbnNwKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKGRhdGEpLCAmY21hcC0+dHJhbnNwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpIGNtYXApOworCisJaWYgKCFlcnIpIHsKKwkJaWYgKGNvcHlfaW5fdXNlcigmY21hcDMyLT5zdGFydCwKKwkJCQkgJmNtYXAtPnN0YXJ0LAorCQkJCSAyICogc2l6ZW9mKF9fdTMyKSkpCisJCQllcnIgPSAtRUZBVUxUOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRvX2ZzY3JlZW5pbmZvX3RvX3VzZXIoc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXgsCisJCQkJICBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8zMiBfX3VzZXIgKmZpeDMyKQoreworCV9fdTMyIGRhdGE7CisJaW50IGVycjsKKworCWVyciA9IGNvcHlfdG9fdXNlcigmZml4MzItPmlkLCAmZml4LT5pZCwgc2l6ZW9mKGZpeDMyLT5pZCkpOworCisJZGF0YSA9IChfX3UzMikgKHVuc2lnbmVkIGxvbmcpIGZpeC0+c21lbV9zdGFydDsKKwllcnIgfD0gcHV0X3VzZXIoZGF0YSwgJmZpeDMyLT5zbWVtX3N0YXJ0KTsKKworCWVyciB8PSBwdXRfdXNlcihmaXgtPnNtZW1fbGVuLCAmZml4MzItPnNtZW1fbGVuKTsKKwllcnIgfD0gcHV0X3VzZXIoZml4LT50eXBlLCAmZml4MzItPnR5cGUpOworCWVyciB8PSBwdXRfdXNlcihmaXgtPnR5cGVfYXV4LCAmZml4MzItPnR5cGVfYXV4KTsKKwllcnIgfD0gcHV0X3VzZXIoZml4LT52aXN1YWwsICZmaXgzMi0+dmlzdWFsKTsKKwllcnIgfD0gcHV0X3VzZXIoZml4LT54cGFuc3RlcCwgJmZpeDMyLT54cGFuc3RlcCk7CisJZXJyIHw9IHB1dF91c2VyKGZpeC0+eXBhbnN0ZXAsICZmaXgzMi0+eXBhbnN0ZXApOworCWVyciB8PSBwdXRfdXNlcihmaXgtPnl3cmFwc3RlcCwgJmZpeDMyLT55d3JhcHN0ZXApOworCWVyciB8PSBwdXRfdXNlcihmaXgtPmxpbmVfbGVuZ3RoLCAmZml4MzItPmxpbmVfbGVuZ3RoKTsKKworCWRhdGEgPSAoX191MzIpICh1bnNpZ25lZCBsb25nKSBmaXgtPm1taW9fc3RhcnQ7CisJZXJyIHw9IHB1dF91c2VyKGRhdGEsICZmaXgzMi0+bW1pb19zdGFydCk7CisKKwllcnIgfD0gcHV0X3VzZXIoZml4LT5tbWlvX2xlbiwgJmZpeDMyLT5tbWlvX2xlbik7CisJZXJyIHw9IHB1dF91c2VyKGZpeC0+YWNjZWwsICZmaXgzMi0+YWNjZWwpOworCWVyciB8PSBjb3B5X3RvX3VzZXIoZml4MzItPnJlc2VydmVkLCBmaXgtPnJlc2VydmVkLAorCQkJICAgIHNpemVvZihmaXgtPnJlc2VydmVkKSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGZiX2dldF9mc2NyZWVuaW5mbyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGZpeDsKKwlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8zMiBfX3VzZXIgKmZpeDMyOworCWludCBlcnI7CisKKwlmaXgzMiA9IGNvbXBhdF9wdHIoYXJnKTsKKworCW9sZF9mcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCWVyciA9IHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZykgJmZpeCk7CisJc2V0X2ZzKG9sZF9mcyk7CisKKwlpZiAoIWVycikKKwkJZXJyID0gZG9fZnNjcmVlbmluZm9fdG9fdXNlcigmZml4LCBmaXgzMik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGZiX2lvY3RsX3RyYW5zKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVycjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBGQklPR0VUX0ZTQ1JFRU5JTkZPOgorCQllcnIgPSBmYl9nZXRfZnNjcmVlbmluZm8oZmQsY21kLCBhcmcpOworCQlicmVhazsKKworICAJY2FzZSBGQklPR0VUQ01BUDoKKwljYXNlIEZCSU9QVVRDTUFQOgorCQllcnIgPSBmYl9nZXRwdXRfY21hcChmZCwgY21kLCBhcmcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRvIHsKKwkJCXN0YXRpYyBpbnQgY291bnQ7CisJCQlpZiAoKytjb3VudCA8PSAyMCkKKwkJCQlwcmludGsoIiVzOiBVbmtub3duIGZiIGlvY3RsIGNtZCBmZCglZCkgIgorCQkJCSAgICAgICAiY21kKCUwOHgpIGFyZyglMDhseClcbiIsCisJCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZmQsIGNtZCwgYXJnKTsKKwkJfSB3aGlsZSgwKTsKKwkJZXJyID0gLUVOT1NZUzsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaGRpb19pb2N0bF90cmFucyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwl1bnNpZ25lZCBsb25nIGt2YWw7CisJdW5zaWduZWQgaW50IF9fdXNlciAqdXZwOworCWludCBlcnJvcjsKKworCXNldF9mcyhLRVJORUxfRFMpOworCWVycm9yID0gc3lzX2lvY3RsKGZkLCBjbWQsIChsb25nKSZrdmFsKTsKKwlzZXRfZnMob2xkX2ZzKTsKKworCWlmKGVycm9yID09IDApIHsKKwkJdXZwID0gY29tcGF0X3B0cihhcmcpOworCQlpZihwdXRfdXNlcihrdmFsLCB1dnApKQorCQkJZXJyb3IgPSAtRUZBVUxUOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKwordHlwZWRlZiBzdHJ1Y3Qgc2dfaW9faGRyMzIgeworCWNvbXBhdF9pbnRfdCBpbnRlcmZhY2VfaWQ7CS8qIFtpXSAnUycgZm9yIFNDU0kgZ2VuZXJpYyAocmVxdWlyZWQpICovCisJY29tcGF0X2ludF90IGR4ZmVyX2RpcmVjdGlvbjsJLyogW2ldIGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uICAqLworCXVuc2lnbmVkIGNoYXIgY21kX2xlbjsJCS8qIFtpXSBTQ1NJIGNvbW1hbmQgbGVuZ3RoICggPD0gMTYgYnl0ZXMpICovCisJdW5zaWduZWQgY2hhciBteF9zYl9sZW47CQkvKiBbaV0gbWF4IGxlbmd0aCB0byB3cml0ZSB0byBzYnAgKi8KKwl1bnNpZ25lZCBzaG9ydCBpb3ZlY19jb3VudDsJLyogW2ldIDAgaW1wbGllcyBubyBzY2F0dGVyIGdhdGhlciAqLworCWNvbXBhdF91aW50X3QgZHhmZXJfbGVuOwkJLyogW2ldIGJ5dGUgY291bnQgb2YgZGF0YSB0cmFuc2ZlciAqLworCWNvbXBhdF91aW50X3QgZHhmZXJwOwkJLyogW2ldLCBbKmlvXSBwb2ludHMgdG8gZGF0YSB0cmFuc2ZlciBtZW1vcnkKKwkJCQkJICAgICAgb3Igc2NhdHRlciBnYXRoZXIgbGlzdCAqLworCWNvbXBhdF91cHRyX3QgY21kcDsJCS8qIFtpXSwgWyppXSBwb2ludHMgdG8gY29tbWFuZCB0byBwZXJmb3JtICovCisJY29tcGF0X3VwdHJfdCBzYnA7CQkvKiBbaV0sIFsqb10gcG9pbnRzIHRvIHNlbnNlX2J1ZmZlciBtZW1vcnkgKi8KKwljb21wYXRfdWludF90IHRpbWVvdXQ7CQkvKiBbaV0gTUFYX1VJTlQtPm5vIHRpbWVvdXQgKHVuaXQ6IG1pbGxpc2VjKSAqLworCWNvbXBhdF91aW50X3QgZmxhZ3M7CQkvKiBbaV0gMCAtPiBkZWZhdWx0LCBzZWUgU0dfRkxBRy4uLiAqLworCWNvbXBhdF9pbnRfdCBwYWNrX2lkOwkJLyogW2ktPm9dIHVudXNlZCBpbnRlcm5hbGx5IChub3JtYWxseSkgKi8KKwljb21wYXRfdXB0cl90IHVzcl9wdHI7CQkvKiBbaS0+b10gdW51c2VkIGludGVybmFsbHkgKi8KKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsJCS8qIFtvXSBzY3NpIHN0YXR1cyAqLworCXVuc2lnbmVkIGNoYXIgbWFza2VkX3N0YXR1czsJLyogW29dIHNoaWZ0ZWQsIG1hc2tlZCBzY3NpIHN0YXR1cyAqLworCXVuc2lnbmVkIGNoYXIgbXNnX3N0YXR1czsJCS8qIFtvXSBtZXNzYWdpbmcgbGV2ZWwgZGF0YSAob3B0aW9uYWwpICovCisJdW5zaWduZWQgY2hhciBzYl9sZW5fd3I7CQkvKiBbb10gYnl0ZSBjb3VudCBhY3R1YWxseSB3cml0dGVuIHRvIHNicCAqLworCXVuc2lnbmVkIHNob3J0IGhvc3Rfc3RhdHVzOwkvKiBbb10gZXJyb3JzIGZyb20gaG9zdCBhZGFwdGVyICovCisJdW5zaWduZWQgc2hvcnQgZHJpdmVyX3N0YXR1czsJLyogW29dIGVycm9ycyBmcm9tIHNvZnR3YXJlIGRyaXZlciAqLworCWNvbXBhdF9pbnRfdCByZXNpZDsJCS8qIFtvXSBkeGZlcl9sZW4gLSBhY3R1YWxfdHJhbnNmZXJyZWQgKi8KKwljb21wYXRfdWludF90IGR1cmF0aW9uOwkJLyogW29dIHRpbWUgdGFrZW4gYnkgY21kICh1bml0OiBtaWxsaXNlYykgKi8KKwljb21wYXRfdWludF90IGluZm87CQkvKiBbb10gYXV4aWxpYXJ5IGluZm9ybWF0aW9uICovCit9IHNnX2lvX2hkcjMyX3Q7ICAvKiA2NCBieXRlcyBsb25nIChvbiBzcGFyYzMyKSAqLworCit0eXBlZGVmIHN0cnVjdCBzZ19pb3ZlYzMyIHsKKwljb21wYXRfdWludF90IGlvdl9iYXNlOworCWNvbXBhdF91aW50X3QgaW92X2xlbjsKK30gc2dfaW92ZWMzMl90OworCitzdGF0aWMgaW50IHNnX2J1aWxkX2lvdmVjKHNnX2lvX2hkcl90IF9fdXNlciAqc2dpbywgdm9pZCBfX3VzZXIgKmR4ZmVycCwgdTE2IGlvdmVjX2NvdW50KQoreworCXNnX2lvdmVjX3QgX191c2VyICppb3YgPSAoc2dfaW92ZWNfdCBfX3VzZXIgKikgKHNnaW8gKyAxKTsKKwlzZ19pb3ZlYzMyX3QgX191c2VyICppb3YzMiA9IGR4ZmVycDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBpb3ZlY19jb3VudDsgaSsrKSB7CisJCXUzMiBiYXNlLCBsZW47CisKKwkJaWYgKGdldF91c2VyKGJhc2UsICZpb3YzMltpXS5pb3ZfYmFzZSkgfHwKKwkJICAgIGdldF91c2VyKGxlbiwgJmlvdjMyW2ldLmlvdl9sZW4pIHx8CisJCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKGJhc2UpLCAmaW92W2ldLmlvdl9iYXNlKSB8fAorCQkgICAgcHV0X3VzZXIobGVuLCAmaW92W2ldLmlvdl9sZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKHB1dF91c2VyKGlvdiwgJnNnaW8tPmR4ZmVycCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNnX2lvY3RsX3RyYW5zKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc2dfaW9faGRyX3QgX191c2VyICpzZ2lvOworCXNnX2lvX2hkcjMyX3QgX191c2VyICpzZ2lvMzI7CisJdTE2IGlvdmVjX2NvdW50OworCXUzMiBkYXRhOworCXZvaWQgX191c2VyICpkeGZlcnA7CisJaW50IGVycjsKKworCXNnaW8zMiA9IGNvbXBhdF9wdHIoYXJnKTsKKwlpZiAoZ2V0X3VzZXIoaW92ZWNfY291bnQsICZzZ2lvMzItPmlvdmVjX2NvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl7CisJCXZvaWQgX191c2VyICp0b3AgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZSgwKTsKKwkJdm9pZCBfX3VzZXIgKm5ldyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihzZ19pb19oZHJfdCkgKworCQkJCSAgICAgICAoaW92ZWNfY291bnQgKiBzaXplb2Yoc2dfaW92ZWNfdCkpKTsKKwkJaWYgKG5ldyA+IHRvcCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXNnaW8gPSBuZXc7CisJfQorCisJLyogT2ssIG5vdyBjb25zdHJ1Y3QuICAqLworCWlmIChjb3B5X2luX3VzZXIoJnNnaW8tPmludGVyZmFjZV9pZCwgJnNnaW8zMi0+aW50ZXJmYWNlX2lkLAorCQkJICgyICogc2l6ZW9mKGludCkpICsKKwkJCSAoMiAqIHNpemVvZih1bnNpZ25lZCBjaGFyKSkgKworCQkJICgxICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkgKworCQkJICgxICogc2l6ZW9mKHVuc2lnbmVkIGludCkpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZ2V0X3VzZXIoZGF0YSwgJnNnaW8zMi0+ZHhmZXJwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZHhmZXJwID0gY29tcGF0X3B0cihkYXRhKTsKKwlpZiAoaW92ZWNfY291bnQpIHsKKwkJaWYgKHNnX2J1aWxkX2lvdmVjKHNnaW8sIGR4ZmVycCwgaW92ZWNfY291bnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfSBlbHNlIHsKKwkJaWYgKHB1dF91c2VyKGR4ZmVycCwgJnNnaW8tPmR4ZmVycCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwl7CisJCXVuc2lnbmVkIGNoYXIgX191c2VyICpjbWRwOworCQl1bnNpZ25lZCBjaGFyIF9fdXNlciAqc2JwOworCisJCWlmIChnZXRfdXNlcihkYXRhLCAmc2dpbzMyLT5jbWRwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQljbWRwID0gY29tcGF0X3B0cihkYXRhKTsKKworCQlpZiAoZ2V0X3VzZXIoZGF0YSwgJnNnaW8zMi0+c2JwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzYnAgPSBjb21wYXRfcHRyKGRhdGEpOworCisJCWlmIChwdXRfdXNlcihjbWRwLCAmc2dpby0+Y21kcCkgfHwKKwkJICAgIHB1dF91c2VyKHNicCwgJnNnaW8tPnNicCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoY29weV9pbl91c2VyKCZzZ2lvLT50aW1lb3V0LCAmc2dpbzMyLT50aW1lb3V0LAorCQkJIDMgKiBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGdldF91c2VyKGRhdGEsICZzZ2lvMzItPnVzcl9wdHIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAocHV0X3VzZXIoY29tcGF0X3B0cihkYXRhKSwgJnNnaW8tPnVzcl9wdHIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X2luX3VzZXIoJnNnaW8tPnN0YXR1cywgJnNnaW8zMi0+c3RhdHVzLAorCQkJICg0ICogc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKSArCisJCQkgKDIgKiBzaXplb2YodW5zaWduZWQgKHNob3J0KSkpICsKKwkJCSAoMyAqIHNpemVvZihpbnQpKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyID0gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKSBzZ2lvKTsKKworCWlmIChlcnIgPj0gMCkgeworCQl2b2lkIF9fdXNlciAqZGF0YXA7CisKKwkJaWYgKGNvcHlfaW5fdXNlcigmc2dpbzMyLT5wYWNrX2lkLCAmc2dpby0+cGFja19pZCwKKwkJCQkgc2l6ZW9mKGludCkpIHx8CisJCSAgICBnZXRfdXNlcihkYXRhcCwgJnNnaW8tPnVzcl9wdHIpIHx8CisJCSAgICBwdXRfdXNlcigodTMyKSh1bnNpZ25lZCBsb25nKWRhdGFwLAorCQkJICAgICAmc2dpbzMyLT51c3JfcHRyKSB8fAorCQkgICAgY29weV9pbl91c2VyKCZzZ2lvMzItPnN0YXR1cywgJnNnaW8tPnN0YXR1cywKKwkJCQkgKDQgKiBzaXplb2YodW5zaWduZWQgY2hhcikpICsKKwkJCQkgKDIgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKSArCisJCQkJICgzICogc2l6ZW9mKGludCkpKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IHNvY2tfZnByb2czMiB7CisJdW5zaWduZWQgc2hvcnQJbGVuOworCWNvbXBhdF9jYWRkcl90CWZpbHRlcjsKK307CisKKyNkZWZpbmUgUFBQSU9DU1BBU1MzMglfSU9XKCd0JywgNzEsIHN0cnVjdCBzb2NrX2Zwcm9nMzIpCisjZGVmaW5lIFBQUElPQ1NBQ1RJVkUzMglfSU9XKCd0JywgNzAsIHN0cnVjdCBzb2NrX2Zwcm9nMzIpCisKK3N0YXRpYyBpbnQgcHBwX3NvY2tfZnByb2dfaW9jdGxfdHJhbnModW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29ja19mcHJvZzMyIF9fdXNlciAqdV9mcHJvZzMyID0gY29tcGF0X3B0cihhcmcpOworCXN0cnVjdCBzb2NrX2Zwcm9nIF9fdXNlciAqdV9mcHJvZzY0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHN0cnVjdCBzb2NrX2Zwcm9nKSk7CisJdm9pZCBfX3VzZXIgKmZwdHI2NDsKKwl1MzIgZnB0cjMyOworCXUxNiBmbGVuOworCisJaWYgKGdldF91c2VyKGZsZW4sICZ1X2Zwcm9nMzItPmxlbikgfHwKKwkgICAgZ2V0X3VzZXIoZnB0cjMyLCAmdV9mcHJvZzMyLT5maWx0ZXIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWZwdHI2NCA9IGNvbXBhdF9wdHIoZnB0cjMyKTsKKworCWlmIChwdXRfdXNlcihmbGVuLCAmdV9mcHJvZzY0LT5sZW4pIHx8CisJICAgIHB1dF91c2VyKGZwdHI2NCwgJnVfZnByb2c2NC0+ZmlsdGVyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY21kID09IFBQUElPQ1NQQVNTMzIpCisJCWNtZCA9IFBQUElPQ1NQQVNTOworCWVsc2UKKwkJY21kID0gUFBQSU9DU0FDVElWRTsKKworCXJldHVybiBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpIHVfZnByb2c2NCk7Cit9CisKK3N0cnVjdCBwcHBfb3B0aW9uX2RhdGEzMiB7CisJY29tcGF0X2NhZGRyX3QJcHRyOworCXUzMgkJCWxlbmd0aDsKKwljb21wYXRfaW50X3QJCXRyYW5zbWl0OworfTsKKyNkZWZpbmUgUFBQSU9DU0NPTVBSRVNTMzIJX0lPVygndCcsIDc3LCBzdHJ1Y3QgcHBwX29wdGlvbl9kYXRhMzIpCisKK3N0cnVjdCBwcHBfaWRsZTMyIHsKKwljb21wYXRfdGltZV90IHhtaXRfaWRsZTsKKwljb21wYXRfdGltZV90IHJlY3ZfaWRsZTsKK307CisjZGVmaW5lIFBQUElPQ0dJRExFMzIJCV9JT1IoJ3QnLCA2Mywgc3RydWN0IHBwcF9pZGxlMzIpCisKK3N0YXRpYyBpbnQgcHBwX2dpZGxlKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHBwcF9pZGxlIF9fdXNlciAqaWRsZTsKKwlzdHJ1Y3QgcHBwX2lkbGUzMiBfX3VzZXIgKmlkbGUzMjsKKwlfX2tlcm5lbF90aW1lX3QgeG1pdCwgcmVjdjsKKwlpbnQgZXJyOworCisJaWRsZSA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqaWRsZSkpOworCWlkbGUzMiA9IGNvbXBhdF9wdHIoYXJnKTsKKworCWVyciA9IHN5c19pb2N0bChmZCwgUFBQSU9DR0lETEUsICh1bnNpZ25lZCBsb25nKSBpZGxlKTsKKworCWlmICghZXJyKSB7CisJCWlmIChnZXRfdXNlcih4bWl0LCAmaWRsZS0+eG1pdF9pZGxlKSB8fAorCQkgICAgZ2V0X3VzZXIocmVjdiwgJmlkbGUtPnJlY3ZfaWRsZSkgfHwKKwkJICAgIHB1dF91c2VyKHhtaXQsICZpZGxlMzItPnhtaXRfaWRsZSkgfHwKKwkJICAgIHB1dF91c2VyKHJlY3YsICZpZGxlMzItPnJlY3ZfaWRsZSkpCisJCQllcnIgPSAtRUZBVUxUOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHBwcF9zY29tcHJlc3ModW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcHBwX29wdGlvbl9kYXRhIF9fdXNlciAqb2RhdGE7CisJc3RydWN0IHBwcF9vcHRpb25fZGF0YTMyIF9fdXNlciAqb2RhdGEzMjsKKwlfX3UzMiBkYXRhOworCXZvaWQgX191c2VyICpkYXRhcDsKKworCW9kYXRhID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpvZGF0YSkpOworCW9kYXRhMzIgPSBjb21wYXRfcHRyKGFyZyk7CisKKwlpZiAoZ2V0X3VzZXIoZGF0YSwgJm9kYXRhMzItPnB0cikpCisJCXJldHVybiAtRUZBVUxUOworCisJZGF0YXAgPSBjb21wYXRfcHRyKGRhdGEpOworCWlmIChwdXRfdXNlcihkYXRhcCwgJm9kYXRhLT5wdHIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X2luX3VzZXIoJm9kYXRhLT5sZW5ndGgsICZvZGF0YTMyLT5sZW5ndGgsCisJCQkgc2l6ZW9mKF9fdTMyKSArIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gc3lzX2lvY3RsKGZkLCBQUFBJT0NTQ09NUFJFU1MsICh1bnNpZ25lZCBsb25nKSBvZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgcHBwX2lvY3RsX3RyYW5zKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVycjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBQUFBJT0NHSURMRTMyOgorCQllcnIgPSBwcHBfZ2lkbGUoZmQsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ1NDT01QUkVTUzMyOgorCQllcnIgPSBwcHBfc2NvbXByZXNzKGZkLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZG8geworCQkJc3RhdGljIGludCBjb3VudDsKKwkJCWlmICgrK2NvdW50IDw9IDIwKQorCQkJCXByaW50aygicHBwX2lvY3RsOiBVbmtub3duIGNtZCBmZCglZCkgIgorCQkJCSAgICAgICAiY21kKCUwOHgpIGFyZyglMDh4KVxuIiwKKwkJCQkgICAgICAgKGludClmZCwgKHVuc2lnbmVkIGludCljbWQsICh1bnNpZ25lZCBpbnQpYXJnKTsKKwkJfSB3aGlsZSgwKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RydWN0IG10Z2V0MzIgeworCWNvbXBhdF9sb25nX3QJbXRfdHlwZTsKKwljb21wYXRfbG9uZ190CW10X3Jlc2lkOworCWNvbXBhdF9sb25nX3QJbXRfZHNyZWc7CisJY29tcGF0X2xvbmdfdAltdF9nc3RhdDsKKwljb21wYXRfbG9uZ190CW10X2VycmVnOworCWNvbXBhdF9kYWRkcl90CW10X2ZpbGVubzsKKwljb21wYXRfZGFkZHJfdAltdF9ibGtubzsKK307CisjZGVmaW5lIE1USU9DR0VUMzIJX0lPUignbScsIDIsIHN0cnVjdCBtdGdldDMyKQorCitzdHJ1Y3QgbXRwb3MzMiB7CisJY29tcGF0X2xvbmdfdAltdF9ibGtubzsKK307CisjZGVmaW5lIE1USU9DUE9TMzIJX0lPUignbScsIDMsIHN0cnVjdCBtdHBvczMyKQorCitzdGF0aWMgaW50IG10X2lvY3RsX3RyYW5zKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCXN0cnVjdCBtdGdldCBnZXQ7CisJc3RydWN0IG10Z2V0MzIgX191c2VyICp1bWdldDMyOworCXN0cnVjdCBtdHBvcyBwb3M7CisJc3RydWN0IG10cG9zMzIgX191c2VyICp1cG9zMzI7CisJdW5zaWduZWQgbG9uZyBrY21kOworCXZvaWQgKmthcmc7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBNVElPQ1BPUzMyOgorCQlrY21kID0gTVRJT0NQT1M7CisJCWthcmcgPSAmcG9zOworCQlicmVhazsKKwljYXNlIE1USU9DR0VUMzI6CisJCWtjbWQgPSBNVElPQ0dFVDsKKwkJa2FyZyA9ICZnZXQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRvIHsKKwkJCXN0YXRpYyBpbnQgY291bnQ7CisJCQlpZiAoKytjb3VudCA8PSAyMCkKKwkJCQlwcmludGsoIm10X2lvY3RsOiBVbmtub3duIGNtZCBmZCglZCkgIgorCQkJCSAgICAgICAiY21kKCUwOHgpIGFyZyglMDh4KVxuIiwKKwkJCQkgICAgICAgKGludClmZCwgKHVuc2lnbmVkIGludCljbWQsICh1bnNpZ25lZCBpbnQpYXJnKTsKKwkJfSB3aGlsZSgwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXNldF9mcyAoS0VSTkVMX0RTKTsKKwllcnIgPSBzeXNfaW9jdGwgKGZkLCBrY21kLCAodW5zaWduZWQgbG9uZylrYXJnKTsKKwlzZXRfZnMgKG9sZF9mcyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTVRJT0NQT1MzMjoKKwkJdXBvczMyID0gY29tcGF0X3B0cihhcmcpOworCQllcnIgPSBfX3B1dF91c2VyKHBvcy5tdF9ibGtubywgJnVwb3MzMi0+bXRfYmxrbm8pOworCQlicmVhazsKKwljYXNlIE1USU9DR0VUMzI6CisJCXVtZ2V0MzIgPSBjb21wYXRfcHRyKGFyZyk7CisJCWVyciA9IF9fcHV0X3VzZXIoZ2V0Lm10X3R5cGUsICZ1bWdldDMyLT5tdF90eXBlKTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIoZ2V0Lm10X3Jlc2lkLCAmdW1nZXQzMi0+bXRfcmVzaWQpOworCQllcnIgfD0gX19wdXRfdXNlcihnZXQubXRfZHNyZWcsICZ1bWdldDMyLT5tdF9kc3JlZyk7CisJCWVyciB8PSBfX3B1dF91c2VyKGdldC5tdF9nc3RhdCwgJnVtZ2V0MzItPm10X2dzdGF0KTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIoZ2V0Lm10X2VycmVnLCAmdW1nZXQzMi0+bXRfZXJyZWcpOworCQllcnIgfD0gX19wdXRfdXNlcihnZXQubXRfZmlsZW5vLCAmdW1nZXQzMi0+bXRfZmlsZW5vKTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIoZ2V0Lm10X2Jsa25vLCAmdW1nZXQzMi0+bXRfYmxrbm8pOworCQlicmVhazsKKwl9CisJcmV0dXJuIGVyciA/IC1FRkFVTFQ6IDA7Cit9CisKK3N0cnVjdCBjZHJvbV9yZWFkX2F1ZGlvMzIgeworCXVuaW9uIGNkcm9tX2FkZHIJYWRkcjsKKwl1OAkJCWFkZHJfZm9ybWF0OworCWNvbXBhdF9pbnRfdAkJbmZyYW1lczsKKwljb21wYXRfY2FkZHJfdAkJYnVmOworfTsKKworc3RydWN0IGNkcm9tX2dlbmVyaWNfY29tbWFuZDMyIHsKKwl1bnNpZ25lZCBjaGFyCWNtZFtDRFJPTV9QQUNLRVRfU0laRV07CisJY29tcGF0X2NhZGRyX3QJYnVmZmVyOworCWNvbXBhdF91aW50X3QJYnVmbGVuOworCWNvbXBhdF9pbnRfdAlzdGF0OworCWNvbXBhdF9jYWRkcl90CXNlbnNlOworCXVuc2lnbmVkIGNoYXIJZGF0YV9kaXJlY3Rpb247CisJY29tcGF0X2ludF90CXF1aWV0OworCWNvbXBhdF9pbnRfdAl0aW1lb3V0OworCWNvbXBhdF9jYWRkcl90CXJlc2VydmVkWzFdOworfTsKKyAgCitzdGF0aWMgaW50IGNkcm9tX2RvX3JlYWRfYXVkaW8odW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY2Ryb21fcmVhZF9hdWRpbyBfX3VzZXIgKmNkcmVhZF9hdWRpbzsKKwlzdHJ1Y3QgY2Ryb21fcmVhZF9hdWRpbzMyIF9fdXNlciAqY2RyZWFkX2F1ZGlvMzI7CisJX191MzIgZGF0YTsKKwl2b2lkIF9fdXNlciAqZGF0YXA7CisKKwljZHJlYWRfYXVkaW8gPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmNkcmVhZF9hdWRpbykpOworCWNkcmVhZF9hdWRpbzMyID0gY29tcGF0X3B0cihhcmcpOworCisJaWYgKGNvcHlfaW5fdXNlcigmY2RyZWFkX2F1ZGlvLT5hZGRyLAorCQkJICZjZHJlYWRfYXVkaW8zMi0+YWRkciwKKwkJCSAoc2l6ZW9mKCpjZHJlYWRfYXVkaW8zMikgLQorCQkJICBzaXplb2YoY29tcGF0X2NhZGRyX3QpKSkpCisJIAlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChnZXRfdXNlcihkYXRhLCAmY2RyZWFkX2F1ZGlvMzItPmJ1ZikpCisJCXJldHVybiAtRUZBVUxUOworCWRhdGFwID0gY29tcGF0X3B0cihkYXRhKTsKKwlpZiAocHV0X3VzZXIoZGF0YXAsICZjZHJlYWRfYXVkaW8tPmJ1ZikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZykgY2RyZWFkX2F1ZGlvKTsKK30KKworc3RhdGljIGludCBjZHJvbV9kb19nZW5lcmljX2NvbW1hbmQodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY2Ryb21fZ2VuZXJpY19jb21tYW5kIF9fdXNlciAqY2djOworCXN0cnVjdCBjZHJvbV9nZW5lcmljX2NvbW1hbmQzMiBfX3VzZXIgKmNnYzMyOworCXUzMiBkYXRhOworCXVuc2lnbmVkIGNoYXIgZGlyOworCWludCBpdG1wOworCisJY2djID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpjZ2MpKTsKKwljZ2MzMiA9IGNvbXBhdF9wdHIoYXJnKTsKKworCWlmIChjb3B5X2luX3VzZXIoJmNnYy0+Y21kLCAmY2djMzItPmNtZCwgc2l6ZW9mKGNnYy0+Y21kKSkgfHwKKwkgICAgZ2V0X3VzZXIoZGF0YSwgJmNnYzMyLT5idWZmZXIpIHx8CisJICAgIHB1dF91c2VyKGNvbXBhdF9wdHIoZGF0YSksICZjZ2MtPmJ1ZmZlcikgfHwKKwkgICAgY29weV9pbl91c2VyKCZjZ2MtPmJ1ZmxlbiwgJmNnYzMyLT5idWZsZW4sCisJCQkgKHNpemVvZih1bnNpZ25lZCBpbnQpICsgc2l6ZW9mKGludCkpKSB8fAorCSAgICBnZXRfdXNlcihkYXRhLCAmY2djMzItPnNlbnNlKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKGRhdGEpLCAmY2djLT5zZW5zZSkgfHwKKwkgICAgZ2V0X3VzZXIoZGlyLCAmY2djMzItPmRhdGFfZGlyZWN0aW9uKSB8fAorCSAgICBwdXRfdXNlcihkaXIsICZjZ2MtPmRhdGFfZGlyZWN0aW9uKSB8fAorCSAgICBnZXRfdXNlcihpdG1wLCAmY2djMzItPnF1aWV0KSB8fAorCSAgICBwdXRfdXNlcihpdG1wLCAmY2djLT5xdWlldCkgfHwKKwkgICAgZ2V0X3VzZXIoaXRtcCwgJmNnYzMyLT50aW1lb3V0KSB8fAorCSAgICBwdXRfdXNlcihpdG1wLCAmY2djLT50aW1lb3V0KSB8fAorCSAgICBnZXRfdXNlcihkYXRhLCAmY2djMzItPnJlc2VydmVkWzBdKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKGRhdGEpLCAmY2djLT5yZXNlcnZlZFswXSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZykgY2djKTsKK30KKworc3RhdGljIGludCBjZHJvbV9pb2N0bF90cmFucyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBlcnI7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBDRFJPTVJFQURBVURJTzoKKwkJZXJyID0gY2Ryb21fZG9fcmVhZF9hdWRpbyhmZCwgY21kLCBhcmcpOworCQlicmVhazsKKworCWNhc2UgQ0RST01fU0VORF9QQUNLRVQ6CisJCWVyciA9IGNkcm9tX2RvX2dlbmVyaWNfY29tbWFuZChmZCwgY21kLCBhcmcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRvIHsKKwkJCXN0YXRpYyBpbnQgY291bnQ7CisJCQlpZiAoKytjb3VudCA8PSAyMCkKKwkJCQlwcmludGsoImNkcm9tX2lvY3RsOiBVbmtub3duIGNtZCBmZCglZCkgIgorCQkJCSAgICAgICAiY21kKCUwOHgpIGFyZyglMDh4KVxuIiwKKwkJCQkgICAgICAgKGludClmZCwgKHVuc2lnbmVkIGludCljbWQsICh1bnNpZ25lZCBpbnQpYXJnKTsKKwkJfSB3aGlsZSgwKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBsb29wX2luZm8zMiB7CisJY29tcGF0X2ludF90CWxvX251bWJlcjsgICAgICAvKiBpb2N0bCByL28gKi8KKwljb21wYXRfZGV2X3QJbG9fZGV2aWNlOyAgICAgIC8qIGlvY3RsIHIvbyAqLworCWNvbXBhdF91bG9uZ190CWxvX2lub2RlOyAgICAgICAvKiBpb2N0bCByL28gKi8KKwljb21wYXRfZGV2X3QJbG9fcmRldmljZTsgICAgIC8qIGlvY3RsIHIvbyAqLworCWNvbXBhdF9pbnRfdAlsb19vZmZzZXQ7CisJY29tcGF0X2ludF90CWxvX2VuY3J5cHRfdHlwZTsKKwljb21wYXRfaW50X3QJbG9fZW5jcnlwdF9rZXlfc2l6ZTsgICAgLyogaW9jdGwgdy9vICovCisJY29tcGF0X2ludF90CWxvX2ZsYWdzOyAgICAgICAvKiBpb2N0bCByL28gKi8KKwljaGFyCQlsb19uYW1lW0xPX05BTUVfU0laRV07CisJdW5zaWduZWQgY2hhcglsb19lbmNyeXB0X2tleVtMT19LRVlfU0laRV07IC8qIGlvY3RsIHcvbyAqLworCWNvbXBhdF91bG9uZ190CWxvX2luaXRbMl07CisJY2hhcgkJcmVzZXJ2ZWRbNF07Cit9OworCitzdGF0aWMgaW50IGxvb3Bfc3RhdHVzKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCXN0cnVjdCBsb29wX2luZm8gbDsKKwlzdHJ1Y3QgbG9vcF9pbmZvMzIgX191c2VyICp1bDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCXVsID0gY29tcGF0X3B0cihhcmcpOworCXN3aXRjaChjbWQpIHsKKwljYXNlIExPT1BfU0VUX1NUQVRVUzoKKwkJZXJyID0gZ2V0X3VzZXIobC5sb19udW1iZXIsICZ1bC0+bG9fbnVtYmVyKTsKKwkJZXJyIHw9IF9fZ2V0X3VzZXIobC5sb19kZXZpY2UsICZ1bC0+bG9fZGV2aWNlKTsKKwkJZXJyIHw9IF9fZ2V0X3VzZXIobC5sb19pbm9kZSwgJnVsLT5sb19pbm9kZSk7CisJCWVyciB8PSBfX2dldF91c2VyKGwubG9fcmRldmljZSwgJnVsLT5sb19yZGV2aWNlKTsKKwkJZXJyIHw9IF9fY29weV9mcm9tX3VzZXIoJmwubG9fb2Zmc2V0LCAmdWwtPmxvX29mZnNldCwKKwkJICAgICAgICA4ICsgKHVuc2lnbmVkIGxvbmcpbC5sb19pbml0IC0gKHVuc2lnbmVkIGxvbmcpJmwubG9fb2Zmc2V0KTsKKwkJaWYgKGVycikgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJfSBlbHNlIHsKKwkJCXNldF9mcyAoS0VSTkVMX0RTKTsKKwkJCWVyciA9IHN5c19pb2N0bCAoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpJmwpOworCQkJc2V0X2ZzIChvbGRfZnMpOworCQl9CisJCWJyZWFrOworCWNhc2UgTE9PUF9HRVRfU1RBVFVTOgorCQlzZXRfZnMgKEtFUk5FTF9EUyk7CisJCWVyciA9IHN5c19pb2N0bCAoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpJmwpOworCQlzZXRfZnMgKG9sZF9mcyk7CisJCWlmICghZXJyKSB7CisJCQllcnIgPSBwdXRfdXNlcihsLmxvX251bWJlciwgJnVsLT5sb19udW1iZXIpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIobC5sb19kZXZpY2UsICZ1bC0+bG9fZGV2aWNlKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGwubG9faW5vZGUsICZ1bC0+bG9faW5vZGUpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIobC5sb19yZGV2aWNlLCAmdWwtPmxvX3JkZXZpY2UpOworCQkJZXJyIHw9IF9fY29weV90b191c2VyKCZ1bC0+bG9fb2Zmc2V0LCAmbC5sb19vZmZzZXQsCisJCQkJKHVuc2lnbmVkIGxvbmcpbC5sb19pbml0IC0gKHVuc2lnbmVkIGxvbmcpJmwubG9fb2Zmc2V0KTsKKwkJCWlmIChlcnIpCisJCQkJZXJyID0gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OiB7CisJCXN0YXRpYyBpbnQgY291bnQ7CisJCWlmICgrK2NvdW50IDw9IDIwKQorCQkJcHJpbnRrKCIlczogVW5rbm93biBsb29wIGlvY3RsIGNtZCwgZmQoJWQpICIKKwkJCSAgICAgICAiY21kKCUwOHgpIGFyZyglMDhseClcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBmZCwgY21kLCBhcmcpOworCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKworZXh0ZXJuIGludCB0dHlfaW9jdGwoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCisjaWZkZWYgQ09ORklHX1ZUCisKK3N0YXRpYyBpbnQgdnRfY2hlY2soc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJCisJaWYgKGZpbGUtPmZfb3AtPmlvY3RsICE9IHR0eV9pb2N0bCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJICAgICAgICAgICAgICAgIAorCXR0eSA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAodHR5X3BhcmFub2lhX2NoZWNrKHR0eSwgaW5vZGUsICJ0dHlfaW9jdGwiKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJaWYgKHR0eS0+ZHJpdmVyLT5pb2N0bCAhPSB2dF9pb2N0bCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJCisJLyoKKwkgKiBUbyBoYXZlIHBlcm1pc3Npb25zIHRvIGRvIG1vc3Qgb2YgdGhlIHZ0IGlvY3Rscywgd2UgZWl0aGVyIGhhdmUKKwkgKiB0byBiZSB0aGUgb3duZXIgb2YgdGhlIHR0eSwgb3Igc3VwZXItdXNlci4KKwkgKi8KKwlpZiAoY3VycmVudC0+c2lnbmFsLT50dHkgPT0gdHR5IHx8IGNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAxOworCXJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30KKworc3RydWN0IGNvbnNvbGVmb250ZGVzYzMyIHsKKwl1bnNpZ25lZCBzaG9ydCBjaGFyY291bnQ7ICAgICAgIC8qIGNoYXJhY3RlcnMgaW4gZm9udCAoMjU2IG9yIDUxMikgKi8KKwl1bnNpZ25lZCBzaG9ydCBjaGFyaGVpZ2h0OyAgICAgIC8qIHNjYW4gbGluZXMgcGVyIGNoYXJhY3RlciAoMS0zMikgKi8KKwljb21wYXRfY2FkZHJfdCBjaGFyZGF0YTsJLyogZm9udCBkYXRhIGluIGV4cGFuZGVkIGZvcm0gKi8KK307CisKK3N0YXRpYyBpbnQgZG9fZm9udHhfaW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGNvbnNvbGVmb250ZGVzYzMyIF9fdXNlciAqdXNlcl9jZmQgPSBjb21wYXRfcHRyKGFyZyk7CisJc3RydWN0IGNvbnNvbGVfZm9udF9vcCBvcDsKKwljb21wYXRfY2FkZHJfdCBkYXRhOworCWludCBpLCBwZXJtOworCisJcGVybSA9IHZ0X2NoZWNrKGZpbGUpOworCWlmIChwZXJtIDwgMCkgcmV0dXJuIHBlcm07CisJCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFBJT19GT05UWDoKKwkJaWYgKCFwZXJtKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJb3Aub3AgPSBLRF9GT05UX09QX1NFVDsKKwkJb3AuZmxhZ3MgPSAwOworCQlvcC53aWR0aCA9IDg7CisJCWlmIChnZXRfdXNlcihvcC5oZWlnaHQsICZ1c2VyX2NmZC0+Y2hhcmhlaWdodCkgfHwKKwkJICAgIGdldF91c2VyKG9wLmNoYXJjb3VudCwgJnVzZXJfY2ZkLT5jaGFyY291bnQpIHx8CisJCSAgICBnZXRfdXNlcihkYXRhLCAmdXNlcl9jZmQtPmNoYXJkYXRhKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlvcC5kYXRhID0gY29tcGF0X3B0cihkYXRhKTsKKwkJcmV0dXJuIGNvbl9mb250X29wKHZjX2NvbnNbZmdfY29uc29sZV0uZCwgJm9wKTsKKwljYXNlIEdJT19GT05UWDoKKwkJb3Aub3AgPSBLRF9GT05UX09QX0dFVDsKKwkJb3AuZmxhZ3MgPSAwOworCQlvcC53aWR0aCA9IDg7CisJCWlmIChnZXRfdXNlcihvcC5oZWlnaHQsICZ1c2VyX2NmZC0+Y2hhcmhlaWdodCkgfHwKKwkJICAgIGdldF91c2VyKG9wLmNoYXJjb3VudCwgJnVzZXJfY2ZkLT5jaGFyY291bnQpIHx8CisJCSAgICBnZXRfdXNlcihkYXRhLCAmdXNlcl9jZmQtPmNoYXJkYXRhKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoIWRhdGEpCisJCQlyZXR1cm4gMDsKKwkJb3AuZGF0YSA9IGNvbXBhdF9wdHIoZGF0YSk7CisJCWkgPSBjb25fZm9udF9vcCh2Y19jb25zW2ZnX2NvbnNvbGVdLmQsICZvcCk7CisJCWlmIChpKQorCQkJcmV0dXJuIGk7CisJCWlmIChwdXRfdXNlcihvcC5oZWlnaHQsICZ1c2VyX2NmZC0+Y2hhcmhlaWdodCkgfHwKKwkJICAgIHB1dF91c2VyKG9wLmNoYXJjb3VudCwgJnVzZXJfY2ZkLT5jaGFyY291bnQpIHx8CisJCSAgICBwdXRfdXNlcigoY29tcGF0X2NhZGRyX3QpKHVuc2lnbmVkIGxvbmcpb3AuZGF0YSwKKwkJCQkmdXNlcl9jZmQtPmNoYXJkYXRhKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0cnVjdCBjb25zb2xlX2ZvbnRfb3AzMiB7CisJY29tcGF0X3VpbnRfdCBvcDsgICAgICAgIC8qIG9wZXJhdGlvbiBjb2RlIEtEX0ZPTlRfT1BfKiAqLworCWNvbXBhdF91aW50X3QgZmxhZ3M7ICAgICAvKiBLRF9GT05UX0ZMQUdfKiAqLworCWNvbXBhdF91aW50X3Qgd2lkdGgsIGhlaWdodDsgICAgIC8qIGZvbnQgc2l6ZSAqLworCWNvbXBhdF91aW50X3QgY2hhcmNvdW50OworCWNvbXBhdF9jYWRkcl90IGRhdGE7ICAgIC8qIGZvbnQgZGF0YSB3aXRoIGhlaWdodCBmaXhlZCB0byAzMiAqLworfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3N0YXRpYyBpbnQgZG9fa2Rmb250b3BfaW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGNvbnNvbGVfZm9udF9vcCBvcDsKKwlzdHJ1Y3QgY29uc29sZV9mb250X29wMzIgX191c2VyICpmb250b3AgPSBjb21wYXRfcHRyKGFyZyk7CisJaW50IHBlcm0gPSB2dF9jaGVjayhmaWxlKSwgaTsKKwlzdHJ1Y3QgdmNfZGF0YSAqdmM7CisJCisJaWYgKHBlcm0gPCAwKSByZXR1cm4gcGVybTsKKwkKKwlpZiAoY29weV9mcm9tX3VzZXIoJm9wLCBmb250b3AsIHNpemVvZihzdHJ1Y3QgY29uc29sZV9mb250X29wMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKCFwZXJtICYmIG9wLm9wICE9IEtEX0ZPTlRfT1BfR0VUKQorCQlyZXR1cm4gLUVQRVJNOworCW9wLmRhdGEgPSBjb21wYXRfcHRyKCgoc3RydWN0IGNvbnNvbGVfZm9udF9vcDMyICopJm9wKS0+ZGF0YSk7CisJb3AuZmxhZ3MgfD0gS0RfRk9OVF9GTEFHX09MRDsKKwl2YyA9ICgoc3RydWN0IHR0eV9zdHJ1Y3QgKilmaWxlLT5wcml2YXRlX2RhdGEpLT5kcml2ZXJfZGF0YTsKKwlpID0gY29uX2ZvbnRfb3AodmMsICZvcCk7CisJaWYgKGkpCisJCXJldHVybiBpOworCSgoc3RydWN0IGNvbnNvbGVfZm9udF9vcDMyICopJm9wKS0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKW9wLmRhdGE7CisJaWYgKGNvcHlfdG9fdXNlcihmb250b3AsICZvcCwgc2l6ZW9mKHN0cnVjdCBjb25zb2xlX2ZvbnRfb3AzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHVuaW1hcGRlc2MzMiB7CisJdW5zaWduZWQgc2hvcnQgZW50cnlfY3Q7CisJY29tcGF0X2NhZGRyX3QgZW50cmllczsKK307CisKK3N0YXRpYyBpbnQgZG9fdW5pbWFwX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB1bmltYXBkZXNjMzIgdG1wOworCXN0cnVjdCB1bmltYXBkZXNjMzIgX191c2VyICp1c2VyX3VkID0gY29tcGF0X3B0cihhcmcpOworCWludCBwZXJtID0gdnRfY2hlY2soZmlsZSk7CisJCisJaWYgKHBlcm0gPCAwKSByZXR1cm4gcGVybTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgdXNlcl91ZCwgc2l6ZW9mIHRtcCkpCisJCXJldHVybiAtRUZBVUxUOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBQSU9fVU5JTUFQOgorCQlpZiAoIXBlcm0pIHJldHVybiAtRVBFUk07CisJCXJldHVybiBjb25fc2V0X3VuaW1hcCh2Y19jb25zW2ZnX2NvbnNvbGVdLmQsIHRtcC5lbnRyeV9jdCwgY29tcGF0X3B0cih0bXAuZW50cmllcykpOworCWNhc2UgR0lPX1VOSU1BUDoKKwkJcmV0dXJuIGNvbl9nZXRfdW5pbWFwKHZjX2NvbnNbZmdfY29uc29sZV0uZCwgdG1wLmVudHJ5X2N0LCAmKHVzZXJfdWQtPmVudHJ5X2N0KSwgY29tcGF0X3B0cih0bXAuZW50cmllcykpOworCX0KKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19WVCAqLworCitzdGF0aWMgaW50IGRvX3NtYl9nZXRtb3VudHVpZCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwlfX2tlcm5lbF91aWRfdCBrdWlkOworCWludCBlcnI7CisKKwljbWQgPSBTTUJfSU9DX0dFVE1PVU5UVUlEOworCisJc2V0X2ZzKEtFUk5FTF9EUyk7CisJZXJyID0gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKSZrdWlkKTsKKwlzZXRfZnMob2xkX2ZzKTsKKworCWlmIChlcnIgPj0gMCkKKwkJZXJyID0gcHV0X3VzZXIoa3VpZCwgKGNvbXBhdF91aWRfdCBfX3VzZXIgKiljb21wYXRfcHRyKGFyZykpOworCisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IGF0bWlmX3Npb2MzMiB7CisgICAgICAgIGNvbXBhdF9pbnRfdAludW1iZXI7CisgICAgICAgIGNvbXBhdF9pbnRfdAlsZW5ndGg7CisgICAgICAgIGNvbXBhdF9jYWRkcl90CWFyZzsKK307CisKK3N0cnVjdCBhdG1faW9idWYzMiB7CisJY29tcGF0X2ludF90CWxlbmd0aDsKKwljb21wYXRfY2FkZHJfdAlidWZmZXI7Cit9OworCisjZGVmaW5lIEFUTV9HRVRMSU5LUkFURTMyIF9JT1coJ2EnLCBBVE1JT0NfSVRGKzEsIHN0cnVjdCBhdG1pZl9zaW9jMzIpCisjZGVmaW5lIEFUTV9HRVROQU1FUzMyICAgIF9JT1coJ2EnLCBBVE1JT0NfSVRGKzMsIHN0cnVjdCBhdG1faW9idWYzMikKKyNkZWZpbmUgQVRNX0dFVFRZUEUzMiAgICAgX0lPVygnYScsIEFUTUlPQ19JVEYrNCwgc3RydWN0IGF0bWlmX3Npb2MzMikKKyNkZWZpbmUgQVRNX0dFVEVTSTMyCSAgX0lPVygnYScsIEFUTUlPQ19JVEYrNSwgc3RydWN0IGF0bWlmX3Npb2MzMikKKyNkZWZpbmUgQVRNX0dFVEFERFIzMgkgIF9JT1coJ2EnLCBBVE1JT0NfSVRGKzYsIHN0cnVjdCBhdG1pZl9zaW9jMzIpCisjZGVmaW5lIEFUTV9SU1RBRERSMzIJICBfSU9XKCdhJywgQVRNSU9DX0lURis3LCBzdHJ1Y3QgYXRtaWZfc2lvYzMyKQorI2RlZmluZSBBVE1fQUREQUREUjMyCSAgX0lPVygnYScsIEFUTUlPQ19JVEYrOCwgc3RydWN0IGF0bWlmX3Npb2MzMikKKyNkZWZpbmUgQVRNX0RFTEFERFIzMgkgIF9JT1coJ2EnLCBBVE1JT0NfSVRGKzksIHN0cnVjdCBhdG1pZl9zaW9jMzIpCisjZGVmaW5lIEFUTV9HRVRDSVJBTkdFMzIgIF9JT1coJ2EnLCBBVE1JT0NfSVRGKzEwLCBzdHJ1Y3QgYXRtaWZfc2lvYzMyKQorI2RlZmluZSBBVE1fU0VUQ0lSQU5HRTMyICBfSU9XKCdhJywgQVRNSU9DX0lURisxMSwgc3RydWN0IGF0bWlmX3Npb2MzMikKKyNkZWZpbmUgQVRNX1NFVEVTSTMyICAgICAgX0lPVygnYScsIEFUTUlPQ19JVEYrMTIsIHN0cnVjdCBhdG1pZl9zaW9jMzIpCisjZGVmaW5lIEFUTV9TRVRFU0lGMzIgICAgIF9JT1coJ2EnLCBBVE1JT0NfSVRGKzEzLCBzdHJ1Y3QgYXRtaWZfc2lvYzMyKQorI2RlZmluZSBBVE1fR0VUU1RBVDMyICAgICBfSU9XKCdhJywgQVRNSU9DX1NBUkNPTSswLCBzdHJ1Y3QgYXRtaWZfc2lvYzMyKQorI2RlZmluZSBBVE1fR0VUU1RBVFozMiAgICBfSU9XKCdhJywgQVRNSU9DX1NBUkNPTSsxLCBzdHJ1Y3QgYXRtaWZfc2lvYzMyKQorI2RlZmluZSBBVE1fR0VUTE9PUDMyCSAgX0lPVygnYScsIEFUTUlPQ19TQVJDT00rMiwgc3RydWN0IGF0bWlmX3Npb2MzMikKKyNkZWZpbmUgQVRNX1NFVExPT1AzMgkgIF9JT1coJ2EnLCBBVE1JT0NfU0FSQ09NKzMsIHN0cnVjdCBhdG1pZl9zaW9jMzIpCisjZGVmaW5lIEFUTV9RVUVSWUxPT1AzMgkgIF9JT1coJ2EnLCBBVE1JT0NfU0FSQ09NKzQsIHN0cnVjdCBhdG1pZl9zaW9jMzIpCisKK3N0YXRpYyBzdHJ1Y3QgeworICAgICAgICB1bnNpZ25lZCBpbnQgY21kMzI7CisgICAgICAgIHVuc2lnbmVkIGludCBjbWQ7Cit9IGF0bV9pb2N0bF9tYXBbXSA9IHsKKyAgICAgICAgeyBBVE1fR0VUTElOS1JBVEUzMiwgQVRNX0dFVExJTktSQVRFIH0sCisJeyBBVE1fR0VUTkFNRVMzMiwgICAgQVRNX0dFVE5BTUVTIH0sCisgICAgICAgIHsgQVRNX0dFVFRZUEUzMiwgICAgIEFUTV9HRVRUWVBFIH0sCisgICAgICAgIHsgQVRNX0dFVEVTSTMyLCAgICAgIEFUTV9HRVRFU0kgfSwKKyAgICAgICAgeyBBVE1fR0VUQUREUjMyLCAgICAgQVRNX0dFVEFERFIgfSwKKyAgICAgICAgeyBBVE1fUlNUQUREUjMyLCAgICAgQVRNX1JTVEFERFIgfSwKKyAgICAgICAgeyBBVE1fQUREQUREUjMyLCAgICAgQVRNX0FEREFERFIgfSwKKyAgICAgICAgeyBBVE1fREVMQUREUjMyLCAgICAgQVRNX0RFTEFERFIgfSwKKyAgICAgICAgeyBBVE1fR0VUQ0lSQU5HRTMyLCAgQVRNX0dFVENJUkFOR0UgfSwKKwl7IEFUTV9TRVRDSVJBTkdFMzIsICBBVE1fU0VUQ0lSQU5HRSB9LAorCXsgQVRNX1NFVEVTSTMyLCAgICAgIEFUTV9TRVRFU0kgfSwKKwl7IEFUTV9TRVRFU0lGMzIsICAgICBBVE1fU0VURVNJRiB9LAorCXsgQVRNX0dFVFNUQVQzMiwgICAgIEFUTV9HRVRTVEFUIH0sCisJeyBBVE1fR0VUU1RBVFozMiwgICAgQVRNX0dFVFNUQVRaIH0sCisJeyBBVE1fR0VUTE9PUDMyLCAgICAgQVRNX0dFVExPT1AgfSwKKwl7IEFUTV9TRVRMT09QMzIsICAgICBBVE1fU0VUTE9PUCB9LAorCXsgQVRNX1FVRVJZTE9PUDMyLCAgIEFUTV9RVUVSWUxPT1AgfQorfTsKKworI2RlZmluZSBOUl9BVE1fSU9DVEwgKHNpemVvZihhdG1faW9jdGxfbWFwKS9zaXplb2YoYXRtX2lvY3RsX21hcFswXSkpCisKKworc3RhdGljIGludCBkb19hdG1faW9idWYodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYXRtX2lvYnVmICAgX191c2VyICppb2J1ZjsKKwlzdHJ1Y3QgYXRtX2lvYnVmMzIgX191c2VyICppb2J1ZjMyOworCXUzMiBkYXRhOworCXZvaWQgX191c2VyICpkYXRhcDsKKwlpbnQgbGVuLCBlcnI7CisKKwlpb2J1ZiA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqaW9idWYpKTsKKwlpb2J1ZjMyID0gY29tcGF0X3B0cihhcmcpOworCisJaWYgKGdldF91c2VyKGxlbiwgJmlvYnVmMzItPmxlbmd0aCkgfHwKKwkgICAgZ2V0X3VzZXIoZGF0YSwgJmlvYnVmMzItPmJ1ZmZlcikpCisJCXJldHVybiAtRUZBVUxUOworCWRhdGFwID0gY29tcGF0X3B0cihkYXRhKTsKKwlpZiAocHV0X3VzZXIobGVuLCAmaW9idWYtPmxlbmd0aCkgfHwKKwkgICAgcHV0X3VzZXIoZGF0YXAsICZpb2J1Zi0+YnVmZmVyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpaW9idWYpOworCisJaWYgKCFlcnIpIHsKKwkJaWYgKGNvcHlfaW5fdXNlcigmaW9idWYzMi0+bGVuZ3RoLCAmaW9idWYtPmxlbmd0aCwKKwkJCQkgc2l6ZW9mKGludCkpKQorCQkJZXJyID0gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRvX2F0bWlmX3Npb2ModW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICAgICAgc3RydWN0IGF0bWlmX3Npb2MgICBfX3VzZXIgKnNpb2M7CisJc3RydWN0IGF0bWlmX3Npb2MzMiBfX3VzZXIgKnNpb2MzMjsKKwl1MzIgZGF0YTsKKwl2b2lkIF9fdXNlciAqZGF0YXA7CisJaW50IGVycjsKKyAgICAgICAgCisJc2lvYyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqc2lvYykpOworCXNpb2MzMiA9IGNvbXBhdF9wdHIoYXJnKTsKKworCWlmIChjb3B5X2luX3VzZXIoJnNpb2MtPm51bWJlciwgJnNpb2MzMi0+bnVtYmVyLCAyICogc2l6ZW9mKGludCkpIHx8CisJICAgIGdldF91c2VyKGRhdGEsICZzaW9jMzItPmFyZykpCisJCXJldHVybiAtRUZBVUxUOworCWRhdGFwID0gY29tcGF0X3B0cihkYXRhKTsKKwlpZiAocHV0X3VzZXIoZGF0YXAsICZzaW9jLT5hcmcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZykgc2lvYyk7CisKKwlpZiAoIWVycikgeworCQlpZiAoY29weV9pbl91c2VyKCZzaW9jMzItPmxlbmd0aCwgJnNpb2MtPmxlbmd0aCwKKwkJCQkgc2l6ZW9mKGludCkpKQorCQkJZXJyID0gLUVGQVVMVDsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkb19hdG1faW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kMzIsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgICAgICBpbnQgaTsKKyAgICAgICAgdW5zaWduZWQgaW50IGNtZCA9IDA7CisgICAgICAgIAorCXN3aXRjaCAoY21kMzIpIHsKKwljYXNlIFNPTkVUX0dFVFNUQVQ6CisJY2FzZSBTT05FVF9HRVRTVEFUWjoKKwljYXNlIFNPTkVUX0dFVERJQUc6CisJY2FzZSBTT05FVF9TRVRESUFHOgorCWNhc2UgU09ORVRfQ0xSRElBRzoKKwljYXNlIFNPTkVUX1NFVEZSQU1JTkc6CisJY2FzZSBTT05FVF9HRVRGUkFNSU5HOgorCWNhc2UgU09ORVRfR0VURlJTRU5TRToKKwkJcmV0dXJuIGRvX2F0bWlmX3Npb2MoZmQsIGNtZDMyLCBhcmcpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBOUl9BVE1fSU9DVEw7IGkrKykgeworCQlpZiAoY21kMzIgPT0gYXRtX2lvY3RsX21hcFtpXS5jbWQzMikgeworCQkJY21kID0gYXRtX2lvY3RsX21hcFtpXS5jbWQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSBOUl9BVE1fSU9DVEwpCisJICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgCisgICAgICAgIHN3aXRjaCAoY21kKSB7CisJY2FzZSBBVE1fR0VUTkFNRVM6CisJCXJldHVybiBkb19hdG1faW9idWYoZmQsIGNtZCwgYXJnKTsKKwkgICAgCisJY2FzZSBBVE1fR0VUTElOS1JBVEU6CisgICAgICAgIGNhc2UgQVRNX0dFVFRZUEU6CisgICAgICAgIGNhc2UgQVRNX0dFVEVTSToKKyAgICAgICAgY2FzZSBBVE1fR0VUQUREUjoKKyAgICAgICAgY2FzZSBBVE1fUlNUQUREUjoKKyAgICAgICAgY2FzZSBBVE1fQUREQUREUjoKKyAgICAgICAgY2FzZSBBVE1fREVMQUREUjoKKyAgICAgICAgY2FzZSBBVE1fR0VUQ0lSQU5HRToKKwljYXNlIEFUTV9TRVRDSVJBTkdFOgorCWNhc2UgQVRNX1NFVEVTSToKKwljYXNlIEFUTV9TRVRFU0lGOgorCWNhc2UgQVRNX0dFVFNUQVQ6CisJY2FzZSBBVE1fR0VUU1RBVFo6CisJY2FzZSBBVE1fR0VUTE9PUDoKKwljYXNlIEFUTV9TRVRMT09QOgorCWNhc2UgQVRNX1FVRVJZTE9PUDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZG9fYXRtaWZfc2lvYyhmZCwgY21kLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV91c2VkX18gaW50IAorcmV0X2VpbnZhbCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGJyb2tlbl9ibGtnZXRzaXplKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJLyogVGhlIG1rc3dhcCBiaW5hcnkgaGFyZCBjb2RlcyBpdCB0byBJbnRlbCB2YWx1ZSA6LSgoKCAqLworCXJldHVybiB3X2xvbmcoZmQsIEJMS0dFVFNJWkUsIGFyZyk7Cit9CisKK3N0cnVjdCBibGtwZ19pb2N0bF9hcmczMiB7CisJY29tcGF0X2ludF90IG9wOworCWNvbXBhdF9pbnRfdCBmbGFnczsKKwljb21wYXRfaW50X3QgZGF0YWxlbjsKKwljb21wYXRfY2FkZHJfdCBkYXRhOworfTsKKworc3RhdGljIGludCBibGtwZ19pb2N0bF90cmFucyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBibGtwZ19pb2N0bF9hcmczMiBfX3VzZXIgKnVhMzIgPSBjb21wYXRfcHRyKGFyZyk7CisJc3RydWN0IGJsa3BnX2lvY3RsX2FyZyBfX3VzZXIgKmEgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmEpKTsKKwljb21wYXRfY2FkZHJfdCB1ZGF0YTsKKwljb21wYXRfaW50X3QgbjsKKwlpbnQgZXJyOworCQorCWVyciA9IGdldF91c2VyKG4sICZ1YTMyLT5vcCk7CisJZXJyIHw9IHB1dF91c2VyKG4sICZhLT5vcCk7CisJZXJyIHw9IGdldF91c2VyKG4sICZ1YTMyLT5mbGFncyk7CisJZXJyIHw9IHB1dF91c2VyKG4sICZhLT5mbGFncyk7CisJZXJyIHw9IGdldF91c2VyKG4sICZ1YTMyLT5kYXRhbGVuKTsKKwllcnIgfD0gcHV0X3VzZXIobiwgJmEtPmRhdGFsZW4pOworCWVyciB8PSBnZXRfdXNlcih1ZGF0YSwgJnVhMzItPmRhdGEpOworCWVyciB8PSBwdXRfdXNlcihjb21wYXRfcHRyKHVkYXRhKSwgJmEtPmRhdGEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKWEpOworfQorCitzdGF0aWMgaW50IGlvY19zZXR0aW1lb3V0KHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIHJ3X2xvbmcoZmQsIEFVVE9GU19JT0NfU0VUVElNRU9VVCwgYXJnKTsKK30KKworLyogRml4IHNpemVvZihzaXplb2YoKSkgYnJlYWthZ2UgKi8KKyNkZWZpbmUgQkxLQlNaR0VUXzMyICAgX0lPUigweDEyLDExMixpbnQpCisjZGVmaW5lIEJMS0JTWlNFVF8zMiAgIF9JT1coMHgxMiwxMTMsaW50KQorI2RlZmluZSBCTEtHRVRTSVpFNjRfMzIgICAgICAgIF9JT1IoMHgxMiwxMTQsaW50KQorCitzdGF0aWMgaW50IGRvX2Jsa2JzemdldCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgICAgIHJldHVybiBzeXNfaW9jdGwoZmQsIEJMS0JTWkdFVCwgKHVuc2lnbmVkIGxvbmcpY29tcGF0X3B0cihhcmcpKTsKK30KKworc3RhdGljIGludCBkb19ibGtic3pzZXQodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICAgICByZXR1cm4gc3lzX2lvY3RsKGZkLCBCTEtCU1pTRVQsICh1bnNpZ25lZCBsb25nKWNvbXBhdF9wdHIoYXJnKSk7Cit9CisKK3N0YXRpYyBpbnQgZG9fYmxrZ2V0c2l6ZTY0KHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAgICAgcmV0dXJuIHN5c19pb2N0bChmZCwgQkxLR0VUU0laRTY0LCAodW5zaWduZWQgbG9uZyljb21wYXRfcHRyKGFyZykpOworfQorCisvKiBCbHVldG9vdGggaW9jdGxzICovCisjZGVmaW5lIEhDSVVBUlRTRVRQUk9UTwlfSU9XKCdVJywgMjAwLCBpbnQpCisjZGVmaW5lIEhDSVVBUlRHRVRQUk9UTwlfSU9SKCdVJywgMjAxLCBpbnQpCisKKyNkZWZpbmUgQk5FUENPTk5BREQJX0lPVygnQicsIDIwMCwgaW50KQorI2RlZmluZSBCTkVQQ09OTkRFTAlfSU9XKCdCJywgMjAxLCBpbnQpCisjZGVmaW5lIEJORVBHRVRDT05OTElTVAlfSU9SKCdCJywgMjEwLCBpbnQpCisjZGVmaW5lIEJORVBHRVRDT05OSU5GTwlfSU9SKCdCJywgMjExLCBpbnQpCisKKyNkZWZpbmUgQ01UUENPTk5BREQJX0lPVygnQycsIDIwMCwgaW50KQorI2RlZmluZSBDTVRQQ09OTkRFTAlfSU9XKCdDJywgMjAxLCBpbnQpCisjZGVmaW5lIENNVFBHRVRDT05OTElTVAlfSU9SKCdDJywgMjEwLCBpbnQpCisjZGVmaW5lIENNVFBHRVRDT05OSU5GTwlfSU9SKCdDJywgMjExLCBpbnQpCisKKyNkZWZpbmUgSElEUENPTk5BREQJX0lPVygnSCcsIDIwMCwgaW50KQorI2RlZmluZSBISURQQ09OTkRFTAlfSU9XKCdIJywgMjAxLCBpbnQpCisjZGVmaW5lIEhJRFBHRVRDT05OTElTVAlfSU9SKCdIJywgMjEwLCBpbnQpCisjZGVmaW5lIEhJRFBHRVRDT05OSU5GTwlfSU9SKCdIJywgMjExLCBpbnQpCisKK3N0cnVjdCBmbG9wcHlfc3RydWN0MzIgeworCWNvbXBhdF91aW50X3QJc2l6ZTsKKwljb21wYXRfdWludF90CXNlY3Q7CisJY29tcGF0X3VpbnRfdAloZWFkOworCWNvbXBhdF91aW50X3QJdHJhY2s7CisJY29tcGF0X3VpbnRfdAlzdHJldGNoOworCXVuc2lnbmVkIGNoYXIJZ2FwOworCXVuc2lnbmVkIGNoYXIJcmF0ZTsKKwl1bnNpZ25lZCBjaGFyCXNwZWMxOworCXVuc2lnbmVkIGNoYXIJZm10X2dhcDsKKwljb25zdCBjb21wYXRfY2FkZHJfdCBuYW1lOworfTsKKworc3RydWN0IGZsb3BweV9kcml2ZV9wYXJhbXMzMiB7CisJY2hhcgkJY21vczsKKwljb21wYXRfdWxvbmdfdAltYXhfZHRyOworCWNvbXBhdF91bG9uZ190CWhsdDsKKwljb21wYXRfdWxvbmdfdAlodXQ7CisJY29tcGF0X3Vsb25nX3QJc3J0OworCWNvbXBhdF91bG9uZ190CXNwaW51cDsKKwljb21wYXRfdWxvbmdfdAlzcGluZG93bjsKKwl1bnNpZ25lZCBjaGFyCXNwaW5kb3duX29mZnNldDsKKwl1bnNpZ25lZCBjaGFyCXNlbGVjdF9kZWxheTsKKwl1bnNpZ25lZCBjaGFyCXJwczsKKwl1bnNpZ25lZCBjaGFyCXRyYWNrczsKKwljb21wYXRfdWxvbmdfdAl0aW1lb3V0OworCXVuc2lnbmVkIGNoYXIJaW50ZXJsZWF2ZV9zZWN0OworCXN0cnVjdCBmbG9wcHlfbWF4X2Vycm9ycyBtYXhfZXJyb3JzOworCWNoYXIJCWZsYWdzOworCWNoYXIJCXJlYWRfdHJhY2s7CisJc2hvcnQJCWF1dG9kZXRlY3RbOF07CisJY29tcGF0X2ludF90CWNoZWNrZnJlcTsKKwljb21wYXRfaW50X3QJbmF0aXZlX2Zvcm1hdDsKK307CisKK3N0cnVjdCBmbG9wcHlfZHJpdmVfc3RydWN0MzIgeworCXNpZ25lZCBjaGFyCWZsYWdzOworCWNvbXBhdF91bG9uZ190CXNwaW51cF9kYXRlOworCWNvbXBhdF91bG9uZ190CXNlbGVjdF9kYXRlOworCWNvbXBhdF91bG9uZ190CWZpcnN0X3JlYWRfZGF0ZTsKKwlzaG9ydAkJcHJvYmVkX2Zvcm1hdDsKKwlzaG9ydAkJdHJhY2s7CisJc2hvcnQJCW1heGJsb2NrOworCXNob3J0CQltYXh0cmFjazsKKwljb21wYXRfaW50X3QJZ2VuZXJhdGlvbjsKKwljb21wYXRfaW50X3QJa2VlcF9kYXRhOworCWNvbXBhdF9pbnRfdAlmZF9yZWY7CisJY29tcGF0X2ludF90CWZkX2RldmljZTsKKwljb21wYXRfaW50X3QJbGFzdF9jaGVja2VkOworCWNvbXBhdF9jYWRkcl90IGRtYWJ1ZjsKKwljb21wYXRfaW50X3QJYnVmYmxvY2tzOworfTsKKworc3RydWN0IGZsb3BweV9mZGNfc3RhdGUzMiB7CisJY29tcGF0X2ludF90CXNwZWMxOworCWNvbXBhdF9pbnRfdAlzcGVjMjsKKwljb21wYXRfaW50X3QJZHRyOworCXVuc2lnbmVkIGNoYXIJdmVyc2lvbjsKKwl1bnNpZ25lZCBjaGFyCWRvcjsKKwljb21wYXRfdWxvbmdfdAlhZGRyZXNzOworCXVuc2lnbmVkIGludAlyYXdjbWQ6MjsKKwl1bnNpZ25lZCBpbnQJcmVzZXQ6MTsKKwl1bnNpZ25lZCBpbnQJbmVlZF9jb25maWd1cmU6MTsKKwl1bnNpZ25lZCBpbnQJcGVycF9tb2RlOjI7CisJdW5zaWduZWQgaW50CWhhc19maWZvOjE7CisJdW5zaWduZWQgaW50CWRyaXZlcl92ZXJzaW9uOworCXVuc2lnbmVkIGNoYXIJdHJhY2tbNF07Cit9OworCitzdHJ1Y3QgZmxvcHB5X3dyaXRlX2Vycm9yczMyIHsKKwl1bnNpZ25lZCBpbnQJd3JpdGVfZXJyb3JzOworCWNvbXBhdF91bG9uZ190CWZpcnN0X2Vycm9yX3NlY3RvcjsKKwljb21wYXRfaW50X3QJZmlyc3RfZXJyb3JfZ2VuZXJhdGlvbjsKKwljb21wYXRfdWxvbmdfdAlsYXN0X2Vycm9yX3NlY3RvcjsKKwljb21wYXRfaW50X3QJbGFzdF9lcnJvcl9nZW5lcmF0aW9uOworCWNvbXBhdF91aW50X3QJYmFkbmVzczsKK307CisKKyNkZWZpbmUgRkRTRVRQUk0zMiBfSU9XKDIsIDB4NDIsIHN0cnVjdCBmbG9wcHlfc3RydWN0MzIpCisjZGVmaW5lIEZEREVGUFJNMzIgX0lPVygyLCAweDQzLCBzdHJ1Y3QgZmxvcHB5X3N0cnVjdDMyKQorI2RlZmluZSBGREdFVFBSTTMyIF9JT1IoMiwgMHgwNCwgc3RydWN0IGZsb3BweV9zdHJ1Y3QzMikKKyNkZWZpbmUgRkRTRVREUlZQUk0zMiBfSU9XKDIsIDB4OTAsIHN0cnVjdCBmbG9wcHlfZHJpdmVfcGFyYW1zMzIpCisjZGVmaW5lIEZER0VURFJWUFJNMzIgX0lPUigyLCAweDExLCBzdHJ1Y3QgZmxvcHB5X2RyaXZlX3BhcmFtczMyKQorI2RlZmluZSBGREdFVERSVlNUQVQzMiBfSU9SKDIsIDB4MTIsIHN0cnVjdCBmbG9wcHlfZHJpdmVfc3RydWN0MzIpCisjZGVmaW5lIEZEUE9MTERSVlNUQVQzMiBfSU9SKDIsIDB4MTMsIHN0cnVjdCBmbG9wcHlfZHJpdmVfc3RydWN0MzIpCisjZGVmaW5lIEZER0VURkRDU1RBVDMyIF9JT1IoMiwgMHgxNSwgc3RydWN0IGZsb3BweV9mZGNfc3RhdGUzMikKKyNkZWZpbmUgRkRXRVJST1JHRVQzMiAgX0lPUigyLCAweDE3LCBzdHJ1Y3QgZmxvcHB5X3dyaXRlX2Vycm9yczMyKQorCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQJY21kMzI7CisJdW5zaWduZWQgaW50CWNtZDsKK30gZmRfaW9jdGxfdHJhbnNfdGFibGVbXSA9IHsKKwl7IEZEU0VUUFJNMzIsIEZEU0VUUFJNIH0sCisJeyBGRERFRlBSTTMyLCBGRERFRlBSTSB9LAorCXsgRkRHRVRQUk0zMiwgRkRHRVRQUk0gfSwKKwl7IEZEU0VURFJWUFJNMzIsIEZEU0VURFJWUFJNIH0sCisJeyBGREdFVERSVlBSTTMyLCBGREdFVERSVlBSTSB9LAorCXsgRkRHRVREUlZTVEFUMzIsIEZER0VURFJWU1RBVCB9LAorCXsgRkRQT0xMRFJWU1RBVDMyLCBGRFBPTExEUlZTVEFUIH0sCisJeyBGREdFVEZEQ1NUQVQzMiwgRkRHRVRGRENTVEFUIH0sCisJeyBGRFdFUlJPUkdFVDMyLCBGRFdFUlJPUkdFVCB9Cit9OworCisjZGVmaW5lIE5SX0ZEX0lPQ1RMX1RSQU5TIChzaXplb2YoZmRfaW9jdGxfdHJhbnNfdGFibGUpL3NpemVvZihmZF9pb2N0bF90cmFuc190YWJsZVswXSkpCisKK3N0YXRpYyBpbnQgZmRfaW9jdGxfdHJhbnModW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7CisJdm9pZCAqa2FyZyA9IE5VTEw7CisJdW5zaWduZWQgaW50IGtjbWQgPSAwOworCWludCBpLCBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfRkRfSU9DVExfVFJBTlM7IGkrKykKKwkJaWYgKGNtZCA9PSBmZF9pb2N0bF90cmFuc190YWJsZVtpXS5jbWQzMikgeworCQkJa2NtZCA9IGZkX2lvY3RsX3RyYW5zX3RhYmxlW2ldLmNtZDsKKwkJCWJyZWFrOworCQl9CisJaWYgKCFrY21kKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgRkRTRVRQUk0zMjoKKwkJY2FzZSBGRERFRlBSTTMyOgorCQljYXNlIEZER0VUUFJNMzI6CisJCXsKKwkJCWNvbXBhdF91cHRyX3QgbmFtZTsKKwkJCXN0cnVjdCBmbG9wcHlfc3RydWN0MzIgX191c2VyICp1ZjsKKwkJCXN0cnVjdCBmbG9wcHlfc3RydWN0ICpmOworCisJCQl1ZiA9IGNvbXBhdF9wdHIoYXJnKTsKKwkJCWYgPSBrYXJnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZsb3BweV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKKwkJCWlmICgha2FyZykKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWlmIChjbWQgPT0gRkRHRVRQUk0zMikKKwkJCQlicmVhazsKKwkJCWVyciA9IF9fZ2V0X3VzZXIoZi0+c2l6ZSwgJnVmLT5zaXplKTsKKwkJCWVyciB8PSBfX2dldF91c2VyKGYtPnNlY3QsICZ1Zi0+c2VjdCk7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT5oZWFkLCAmdWYtPmhlYWQpOworCQkJZXJyIHw9IF9fZ2V0X3VzZXIoZi0+dHJhY2ssICZ1Zi0+dHJhY2spOworCQkJZXJyIHw9IF9fZ2V0X3VzZXIoZi0+c3RyZXRjaCwgJnVmLT5zdHJldGNoKTsKKwkJCWVyciB8PSBfX2dldF91c2VyKGYtPmdhcCwgJnVmLT5nYXApOworCQkJZXJyIHw9IF9fZ2V0X3VzZXIoZi0+cmF0ZSwgJnVmLT5yYXRlKTsKKwkJCWVyciB8PSBfX2dldF91c2VyKGYtPnNwZWMxLCAmdWYtPnNwZWMxKTsKKwkJCWVyciB8PSBfX2dldF91c2VyKGYtPmZtdF9nYXAsICZ1Zi0+Zm10X2dhcCk7CisJCQllcnIgfD0gX19nZXRfdXNlcihuYW1lLCAmdWYtPm5hbWUpOworCQkJZi0+bmFtZSA9IGNvbXBhdF9wdHIobmFtZSk7CisJCQlpZiAoZXJyKSB7CisJCQkJZXJyID0gLUVGQVVMVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRkRTRVREUlZQUk0zMjoKKwkJY2FzZSBGREdFVERSVlBSTTMyOgorCQl7CisJCQlzdHJ1Y3QgZmxvcHB5X2RyaXZlX3BhcmFtczMyIF9fdXNlciAqdWY7CisJCQlzdHJ1Y3QgZmxvcHB5X2RyaXZlX3BhcmFtcyAqZjsKKworCQkJdWYgPSBjb21wYXRfcHRyKGFyZyk7CisJCQlmID0ga2FyZyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmbG9wcHlfZHJpdmVfcGFyYW1zKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWthcmcpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlpZiAoY21kID09IEZER0VURFJWUFJNMzIpCisJCQkJYnJlYWs7CisJCQllcnIgPSBfX2dldF91c2VyKGYtPmNtb3MsICZ1Zi0+Y21vcyk7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT5tYXhfZHRyLCAmdWYtPm1heF9kdHIpOworCQkJZXJyIHw9IF9fZ2V0X3VzZXIoZi0+aGx0LCAmdWYtPmhsdCk7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT5odXQsICZ1Zi0+aHV0KTsKKwkJCWVyciB8PSBfX2dldF91c2VyKGYtPnNydCwgJnVmLT5zcnQpOworCQkJZXJyIHw9IF9fZ2V0X3VzZXIoZi0+c3BpbnVwLCAmdWYtPnNwaW51cCk7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT5zcGluZG93biwgJnVmLT5zcGluZG93bik7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT5zcGluZG93bl9vZmZzZXQsICZ1Zi0+c3BpbmRvd25fb2Zmc2V0KTsKKwkJCWVyciB8PSBfX2dldF91c2VyKGYtPnNlbGVjdF9kZWxheSwgJnVmLT5zZWxlY3RfZGVsYXkpOworCQkJZXJyIHw9IF9fZ2V0X3VzZXIoZi0+cnBzLCAmdWYtPnJwcyk7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT50cmFja3MsICZ1Zi0+dHJhY2tzKTsKKwkJCWVyciB8PSBfX2dldF91c2VyKGYtPnRpbWVvdXQsICZ1Zi0+dGltZW91dCk7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT5pbnRlcmxlYXZlX3NlY3QsICZ1Zi0+aW50ZXJsZWF2ZV9zZWN0KTsKKwkJCWVyciB8PSBfX2NvcHlfZnJvbV91c2VyKCZmLT5tYXhfZXJyb3JzLCAmdWYtPm1heF9lcnJvcnMsIHNpemVvZihmLT5tYXhfZXJyb3JzKSk7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT5mbGFncywgJnVmLT5mbGFncyk7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT5yZWFkX3RyYWNrLCAmdWYtPnJlYWRfdHJhY2spOworCQkJZXJyIHw9IF9fY29weV9mcm9tX3VzZXIoZi0+YXV0b2RldGVjdCwgdWYtPmF1dG9kZXRlY3QsIHNpemVvZihmLT5hdXRvZGV0ZWN0KSk7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT5jaGVja2ZyZXEsICZ1Zi0+Y2hlY2tmcmVxKTsKKwkJCWVyciB8PSBfX2dldF91c2VyKGYtPm5hdGl2ZV9mb3JtYXQsICZ1Zi0+bmF0aXZlX2Zvcm1hdCk7CisJCQlpZiAoZXJyKSB7CisJCQkJZXJyID0gLUVGQVVMVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRkRHRVREUlZTVEFUMzI6CisJCWNhc2UgRkRQT0xMRFJWU1RBVDMyOgorCQkJa2FyZyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmbG9wcHlfZHJpdmVfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWthcmcpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlicmVhazsKKwkJY2FzZSBGREdFVEZEQ1NUQVQzMjoKKwkJCWthcmcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZmxvcHB5X2ZkY19zdGF0ZSksIEdGUF9LRVJORUwpOworCQkJaWYgKCFrYXJnKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJYnJlYWs7CisJCWNhc2UgRkRXRVJST1JHRVQzMjoKKwkJCWthcmcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZmxvcHB5X3dyaXRlX2Vycm9ycyksIEdGUF9LRVJORUwpOworCQkJaWYgKCFrYXJnKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc2V0X2ZzIChLRVJORUxfRFMpOworCWVyciA9IHN5c19pb2N0bCAoZmQsIGtjbWQsICh1bnNpZ25lZCBsb25nKWthcmcpOworCXNldF9mcyAob2xkX2ZzKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIEZER0VUUFJNMzI6CisJCXsKKwkJCXN0cnVjdCBmbG9wcHlfc3RydWN0ICpmID0ga2FyZzsKKwkJCXN0cnVjdCBmbG9wcHlfc3RydWN0MzIgX191c2VyICp1ZiA9IGNvbXBhdF9wdHIoYXJnKTsKKworCQkJZXJyID0gX19wdXRfdXNlcihmLT5zaXplLCAmdWYtPnNpemUpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+c2VjdCwgJnVmLT5zZWN0KTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPmhlYWQsICZ1Zi0+aGVhZCk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT50cmFjaywgJnVmLT50cmFjayk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5zdHJldGNoLCAmdWYtPnN0cmV0Y2gpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+Z2FwLCAmdWYtPmdhcCk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5yYXRlLCAmdWYtPnJhdGUpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+c3BlYzEsICZ1Zi0+c3BlYzEpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+Zm10X2dhcCwgJnVmLT5mbXRfZ2FwKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKCh1NjQpZi0+bmFtZSwgKGNvbXBhdF9jYWRkcl90IF9fdXNlciAqKSZ1Zi0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIEZER0VURFJWUFJNMzI6CisJCXsKKwkJCXN0cnVjdCBmbG9wcHlfZHJpdmVfcGFyYW1zMzIgX191c2VyICp1ZjsKKwkJCXN0cnVjdCBmbG9wcHlfZHJpdmVfcGFyYW1zICpmID0ga2FyZzsKKworCQkJdWYgPSBjb21wYXRfcHRyKGFyZyk7CisJCQllcnIgPSBfX3B1dF91c2VyKGYtPmNtb3MsICZ1Zi0+Y21vcyk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5tYXhfZHRyLCAmdWYtPm1heF9kdHIpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+aGx0LCAmdWYtPmhsdCk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5odXQsICZ1Zi0+aHV0KTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPnNydCwgJnVmLT5zcnQpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+c3BpbnVwLCAmdWYtPnNwaW51cCk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5zcGluZG93biwgJnVmLT5zcGluZG93bik7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5zcGluZG93bl9vZmZzZXQsICZ1Zi0+c3BpbmRvd25fb2Zmc2V0KTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPnNlbGVjdF9kZWxheSwgJnVmLT5zZWxlY3RfZGVsYXkpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+cnBzLCAmdWYtPnJwcyk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT50cmFja3MsICZ1Zi0+dHJhY2tzKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPnRpbWVvdXQsICZ1Zi0+dGltZW91dCk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5pbnRlcmxlYXZlX3NlY3QsICZ1Zi0+aW50ZXJsZWF2ZV9zZWN0KTsKKwkJCWVyciB8PSBfX2NvcHlfdG9fdXNlcigmdWYtPm1heF9lcnJvcnMsICZmLT5tYXhfZXJyb3JzLCBzaXplb2YoZi0+bWF4X2Vycm9ycykpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+ZmxhZ3MsICZ1Zi0+ZmxhZ3MpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+cmVhZF90cmFjaywgJnVmLT5yZWFkX3RyYWNrKTsKKwkJCWVyciB8PSBfX2NvcHlfdG9fdXNlcih1Zi0+YXV0b2RldGVjdCwgZi0+YXV0b2RldGVjdCwgc2l6ZW9mKGYtPmF1dG9kZXRlY3QpKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPmNoZWNrZnJlcSwgJnVmLT5jaGVja2ZyZXEpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+bmF0aXZlX2Zvcm1hdCwgJnVmLT5uYXRpdmVfZm9ybWF0KTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRkRHRVREUlZTVEFUMzI6CisJCWNhc2UgRkRQT0xMRFJWU1RBVDMyOgorCQl7CisJCQlzdHJ1Y3QgZmxvcHB5X2RyaXZlX3N0cnVjdDMyIF9fdXNlciAqdWY7CisJCQlzdHJ1Y3QgZmxvcHB5X2RyaXZlX3N0cnVjdCAqZiA9IGthcmc7CisKKwkJCXVmID0gY29tcGF0X3B0cihhcmcpOworCQkJZXJyID0gX19wdXRfdXNlcihmLT5mbGFncywgJnVmLT5mbGFncyk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5zcGludXBfZGF0ZSwgJnVmLT5zcGludXBfZGF0ZSk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5zZWxlY3RfZGF0ZSwgJnVmLT5zZWxlY3RfZGF0ZSk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5maXJzdF9yZWFkX2RhdGUsICZ1Zi0+Zmlyc3RfcmVhZF9kYXRlKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPnByb2JlZF9mb3JtYXQsICZ1Zi0+cHJvYmVkX2Zvcm1hdCk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT50cmFjaywgJnVmLT50cmFjayk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5tYXhibG9jaywgJnVmLT5tYXhibG9jayk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5tYXh0cmFjaywgJnVmLT5tYXh0cmFjayk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5nZW5lcmF0aW9uLCAmdWYtPmdlbmVyYXRpb24pOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+a2VlcF9kYXRhLCAmdWYtPmtlZXBfZGF0YSk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5mZF9yZWYsICZ1Zi0+ZmRfcmVmKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPmZkX2RldmljZSwgJnVmLT5mZF9kZXZpY2UpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+bGFzdF9jaGVja2VkLCAmdWYtPmxhc3RfY2hlY2tlZCk7CisJCQllcnIgfD0gX19wdXRfdXNlcigodTY0KWYtPmRtYWJ1ZiwgJnVmLT5kbWFidWYpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoKHU2NClmLT5idWZibG9ja3MsICZ1Zi0+YnVmYmxvY2tzKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRkRHRVRGRENTVEFUMzI6CisJCXsKKwkJCXN0cnVjdCBmbG9wcHlfZmRjX3N0YXRlMzIgX191c2VyICp1ZjsKKwkJCXN0cnVjdCBmbG9wcHlfZmRjX3N0YXRlICpmID0ga2FyZzsKKworCQkJdWYgPSBjb21wYXRfcHRyKGFyZyk7CisJCQllcnIgPSBfX3B1dF91c2VyKGYtPnNwZWMxLCAmdWYtPnNwZWMxKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPnNwZWMyLCAmdWYtPnNwZWMyKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPmR0ciwgJnVmLT5kdHIpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+dmVyc2lvbiwgJnVmLT52ZXJzaW9uKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPmRvciwgJnVmLT5kb3IpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+YWRkcmVzcywgJnVmLT5hZGRyZXNzKTsKKwkJCWVyciB8PSBfX2NvcHlfdG9fdXNlcigoY2hhciBfX3VzZXIgKikmdWYtPmFkZHJlc3MgKyBzaXplb2YodWYtPmFkZHJlc3MpLAorCQkJCQkgICAoY2hhciAqKSZmLT5hZGRyZXNzICsgc2l6ZW9mKGYtPmFkZHJlc3MpLCBzaXplb2YoaW50KSk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5kcml2ZXJfdmVyc2lvbiwgJnVmLT5kcml2ZXJfdmVyc2lvbik7CisJCQllcnIgfD0gX19jb3B5X3RvX3VzZXIodWYtPnRyYWNrLCBmLT50cmFjaywgc2l6ZW9mKGYtPnRyYWNrKSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIEZEV0VSUk9SR0VUMzI6CisJCXsKKwkJCXN0cnVjdCBmbG9wcHlfd3JpdGVfZXJyb3JzMzIgX191c2VyICp1ZjsKKwkJCXN0cnVjdCBmbG9wcHlfd3JpdGVfZXJyb3JzICpmID0ga2FyZzsKKworCQkJdWYgPSBjb21wYXRfcHRyKGFyZyk7CisJCQllcnIgPSBfX3B1dF91c2VyKGYtPndyaXRlX2Vycm9ycywgJnVmLT53cml0ZV9lcnJvcnMpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+Zmlyc3RfZXJyb3Jfc2VjdG9yLCAmdWYtPmZpcnN0X2Vycm9yX3NlY3Rvcik7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5maXJzdF9lcnJvcl9nZW5lcmF0aW9uLCAmdWYtPmZpcnN0X2Vycm9yX2dlbmVyYXRpb24pOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+bGFzdF9lcnJvcl9zZWN0b3IsICZ1Zi0+bGFzdF9lcnJvcl9zZWN0b3IpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+bGFzdF9lcnJvcl9nZW5lcmF0aW9uLCAmdWYtPmxhc3RfZXJyb3JfZ2VuZXJhdGlvbik7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5iYWRuZXNzLCAmdWYtPmJhZG5lc3MpOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKwlpZiAoZXJyKQorCQllcnIgPSAtRUZBVUxUOworCitvdXQ6CWlmIChrYXJnKSBrZnJlZShrYXJnKTsKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgbXRkX29vYl9idWYzMiB7CisJdV9pbnQzMl90IHN0YXJ0OworCXVfaW50MzJfdCBsZW5ndGg7CisJY29tcGF0X2NhZGRyX3QgcHRyOwkvKiB1bnNpZ25lZCBjaGFyKiAqLworfTsKKworI2RlZmluZSBNRU1XUklURU9PQjMyIAlfSU9XUignTScsMyxzdHJ1Y3QgbXRkX29vYl9idWYzMikKKyNkZWZpbmUgTUVNUkVBRE9PQjMyIAlfSU9XUignTScsNCxzdHJ1Y3QgbXRkX29vYl9idWYzMikKKworc3RhdGljIGludCBtdGRfcndfb29iKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG10ZF9vb2JfYnVmIF9fdXNlciAqYnVmID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpidWYpKTsKKwlzdHJ1Y3QgbXRkX29vYl9idWYzMiBfX3VzZXIgKmJ1ZjMyID0gY29tcGF0X3B0cihhcmcpOworCXUzMiBkYXRhOworCWNoYXIgX191c2VyICpkYXRhcDsKKwl1bnNpZ25lZCBpbnQgcmVhbF9jbWQ7CisJaW50IGVycjsKKworCXJlYWxfY21kID0gKGNtZCA9PSBNRU1SRUFET09CMzIpID8KKwkJTUVNUkVBRE9PQiA6IE1FTVdSSVRFT09COworCisJaWYgKGNvcHlfaW5fdXNlcigmYnVmLT5zdGFydCwgJmJ1ZjMyLT5zdGFydCwKKwkJCSAyICogc2l6ZW9mKHUzMikpIHx8CisJICAgIGdldF91c2VyKGRhdGEsICZidWYzMi0+cHRyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZGF0YXAgPSBjb21wYXRfcHRyKGRhdGEpOworCWlmIChwdXRfdXNlcihkYXRhcCwgJmJ1Zi0+cHRyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBzeXNfaW9jdGwoZmQsIHJlYWxfY21kLCAodW5zaWduZWQgbG9uZykgYnVmKTsKKworCWlmICghZXJyKSB7CisJCWlmIChjb3B5X2luX3VzZXIoJmJ1ZjMyLT5zdGFydCwgJmJ1Zi0+c3RhcnQsCisJCQkJIDIgKiBzaXplb2YodTMyKSkpCisJCQllcnIgPSAtRUZBVUxUOworCX0KKworCXJldHVybiBlcnI7Cit9CQorCisjZGVmaW5lCVZGQVRfSU9DVExfUkVBRERJUl9CT1RIMzIJX0lPUigncicsIDEsIHN0cnVjdCBjb21wYXRfZGlyZW50WzJdKQorI2RlZmluZQlWRkFUX0lPQ1RMX1JFQURESVJfU0hPUlQzMglfSU9SKCdyJywgMiwgc3RydWN0IGNvbXBhdF9kaXJlbnRbMl0pCisKK3N0YXRpYyBsb25nCitwdXRfZGlyZW50MzIgKHN0cnVjdCBkaXJlbnQgKmQsIHN0cnVjdCBjb21wYXRfZGlyZW50IF9fdXNlciAqZDMyKQoreworICAgICAgICBpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGQzMiwgc2l6ZW9mKHN0cnVjdCBjb21wYXRfZGlyZW50KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgICAgX19wdXRfdXNlcihkLT5kX2lubywgJmQzMi0+ZF9pbm8pOworICAgICAgICBfX3B1dF91c2VyKGQtPmRfb2ZmLCAmZDMyLT5kX29mZik7CisgICAgICAgIF9fcHV0X3VzZXIoZC0+ZF9yZWNsZW4sICZkMzItPmRfcmVjbGVuKTsKKyAgICAgICAgaWYgKF9fY29weV90b191c2VyKGQzMi0+ZF9uYW1lLCBkLT5kX25hbWUsIGQtPmRfcmVjbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmZhdF9pb2N0bDMyKHVuc2lnbmVkIGZkLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBjb21wYXRfZGlyZW50IF9fdXNlciAqcCA9IGNvbXBhdF9wdHIoYXJnKTsKKwlpbnQgcmV0OworCW1tX3NlZ21lbnRfdCBvbGRmcyA9IGdldF9mcygpOworCXN0cnVjdCBkaXJlbnQgZFsyXTsKKworCXN3aXRjaChjbWQpCisJeworICAgICAgICAJY2FzZSBWRkFUX0lPQ1RMX1JFQURESVJfQk9USDMyOgorICAgICAgICAgICAgICAgIAljbWQgPSBWRkFUX0lPQ1RMX1JFQURESVJfQk9USDsKKyAgICAgICAgICAgICAgICAJYnJlYWs7CisgICAgICAgIAljYXNlIFZGQVRfSU9DVExfUkVBRERJUl9TSE9SVDMyOgorICAgICAgICAgICAgICAgIAljbWQgPSBWRkFUX0lPQ1RMX1JFQURESVJfU0hPUlQ7CisgICAgICAgICAgICAgICAgCWJyZWFrOworCX0KKworCXNldF9mcyhLRVJORUxfRFMpOworCXJldCA9IHN5c19pb2N0bChmZCxjbWQsKHVuc2lnbmVkIGxvbmcpJmQpOworCXNldF9mcyhvbGRmcyk7CisJaWYgKHJldCA+PSAwKSB7CisJCXJldCB8PSBwdXRfZGlyZW50MzIoJmRbMF0sIHApOworCQlyZXQgfD0gcHV0X2RpcmVudDMyKCZkWzFdLCBwICsgMSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgUkVJU0VSRlNfSU9DX1VOUEFDSzMyICAgICAgICAgICAgICAgX0lPVygweENELDEsaW50KQorCitzdGF0aWMgaW50IHJlaXNlcmZzX2lvY3RsMzIodW5zaWduZWQgZmQsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBwdHIpCit7CisgICAgICAgIGlmIChjbWQgPT0gUkVJU0VSRlNfSU9DX1VOUEFDSzMyKQorICAgICAgICAgICAgICAgIGNtZCA9IFJFSVNFUkZTX0lPQ19VTlBBQ0s7CisKKyAgICAgICAgcmV0dXJuIHN5c19pb2N0bChmZCxjbWQscHRyKTsKK30KKworc3RydWN0IHJhdzMyX2NvbmZpZ19yZXF1ZXN0Cit7CisgICAgICAgIGNvbXBhdF9pbnRfdCAgICByYXdfbWlub3I7CisgICAgICAgIF9fdTY0ICAgYmxvY2tfbWFqb3I7CisgICAgICAgIF9fdTY0ICAgYmxvY2tfbWlub3I7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdGF0aWMgaW50IGdldF9yYXczMl9yZXF1ZXN0KHN0cnVjdCByYXdfY29uZmlnX3JlcXVlc3QgKnJlcSwgc3RydWN0IHJhdzMyX2NvbmZpZ19yZXF1ZXN0IF9fdXNlciAqdXNlcl9yZXEpCit7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVzZXJfcmVxLCBzaXplb2Yoc3RydWN0IHJhdzMyX2NvbmZpZ19yZXF1ZXN0KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgICAgcmV0ID0gX19nZXRfdXNlcihyZXEtPnJhd19taW5vciwgJnVzZXJfcmVxLT5yYXdfbWlub3IpOworICAgICAgICByZXQgfD0gX19nZXRfdXNlcihyZXEtPmJsb2NrX21ham9yLCAmdXNlcl9yZXEtPmJsb2NrX21ham9yKTsKKyAgICAgICAgcmV0IHw9IF9fZ2V0X3VzZXIocmVxLT5ibG9ja19taW5vciwgJnVzZXJfcmVxLT5ibG9ja19taW5vcik7CisKKyAgICAgICAgcmV0dXJuIHJldCA/IC1FRkFVTFQgOiAwOworfQorCitzdGF0aWMgaW50IHNldF9yYXczMl9yZXF1ZXN0KHN0cnVjdCByYXdfY29uZmlnX3JlcXVlc3QgKnJlcSwgc3RydWN0IHJhdzMyX2NvbmZpZ19yZXF1ZXN0IF9fdXNlciAqdXNlcl9yZXEpCit7CisJaW50IHJldDsKKworICAgICAgICBpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVzZXJfcmVxLCBzaXplb2Yoc3RydWN0IHJhdzMyX2NvbmZpZ19yZXF1ZXN0KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgICAgcmV0ID0gX19wdXRfdXNlcihyZXEtPnJhd19taW5vciwgJnVzZXJfcmVxLT5yYXdfbWlub3IpOworICAgICAgICByZXQgfD0gX19wdXRfdXNlcihyZXEtPmJsb2NrX21ham9yLCAmdXNlcl9yZXEtPmJsb2NrX21ham9yKTsKKyAgICAgICAgcmV0IHw9IF9fcHV0X3VzZXIocmVxLT5ibG9ja19taW5vciwgJnVzZXJfcmVxLT5ibG9ja19taW5vcik7CisKKyAgICAgICAgcmV0dXJuIHJldCA/IC1FRkFVTFQgOiAwOworfQorCitzdGF0aWMgaW50IHJhd19pb2N0bCh1bnNpZ25lZCBmZCwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICBzd2l0Y2ggKGNtZCkgeworICAgICAgICBjYXNlIFJBV19TRVRCSU5EOgorICAgICAgICBjYXNlIFJBV19HRVRCSU5EOiB7CisgICAgICAgICAgICAgICAgc3RydWN0IHJhd19jb25maWdfcmVxdWVzdCByZXE7CisgICAgICAgICAgICAgICAgc3RydWN0IHJhdzMyX2NvbmZpZ19yZXF1ZXN0IF9fdXNlciAqdXNlcl9yZXEgPSBjb21wYXRfcHRyKGFyZyk7CisgICAgICAgICAgICAgICAgbW1fc2VnbWVudF90IG9sZGZzID0gZ2V0X2ZzKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGdldF9yYXczMl9yZXF1ZXN0KCZyZXEsIHVzZXJfcmVxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICAgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisgICAgICAgICAgICAgICAgcmV0ID0gc3lzX2lvY3RsKGZkLGNtZCwodW5zaWduZWQgbG9uZykmcmVxKTsKKyAgICAgICAgICAgICAgICBzZXRfZnMob2xkZnMpOworCisgICAgICAgICAgICAgICAgaWYgKCghcmV0KSAmJiAoY21kID09IFJBV19HRVRCSU5EKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2V0X3JhdzMyX3JlcXVlc3QoJnJlcSwgdXNlcl9yZXEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldCA9IHN5c19pb2N0bChmZCwgY21kLCBhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBzZXJpYWxfc3RydWN0MzIgeworICAgICAgICBjb21wYXRfaW50X3QgICAgdHlwZTsKKyAgICAgICAgY29tcGF0X2ludF90ICAgIGxpbmU7CisgICAgICAgIGNvbXBhdF91aW50X3QgICBwb3J0OworICAgICAgICBjb21wYXRfaW50X3QgICAgaXJxOworICAgICAgICBjb21wYXRfaW50X3QgICAgZmxhZ3M7CisgICAgICAgIGNvbXBhdF9pbnRfdCAgICB4bWl0X2ZpZm9fc2l6ZTsKKyAgICAgICAgY29tcGF0X2ludF90ICAgIGN1c3RvbV9kaXZpc29yOworICAgICAgICBjb21wYXRfaW50X3QgICAgYmF1ZF9iYXNlOworICAgICAgICB1bnNpZ25lZCBzaG9ydCAgY2xvc2VfZGVsYXk7CisgICAgICAgIGNoYXIgICAgaW9fdHlwZTsKKyAgICAgICAgY2hhciAgICByZXNlcnZlZF9jaGFyWzFdOworICAgICAgICBjb21wYXRfaW50X3QgICAgaHViNjsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgIGNsb3Npbmdfd2FpdDsgLyogdGltZSB0byB3YWl0IGJlZm9yZSBjbG9zaW5nICovCisgICAgICAgIHVuc2lnbmVkIHNob3J0ICBjbG9zaW5nX3dhaXQyOyAvKiBubyBsb25nZXIgdXNlZC4uLiAqLworICAgICAgICBjb21wYXRfdWludF90ICAgaW9tZW1fYmFzZTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgIGlvbWVtX3JlZ19zaGlmdDsKKyAgICAgICAgdW5zaWduZWQgaW50ICAgIHBvcnRfaGlnaDsKKyAgICAgLyogY29tcGF0X3Vsb25nX3QgIGlvbWFwX2Jhc2UgRklYTUUgKi8KKyAgICAgICAgY29tcGF0X2ludF90ICAgIHJlc2VydmVkWzFdOworfTsKKworc3RhdGljIGludCBzZXJpYWxfc3RydWN0X2lvY3RsKHVuc2lnbmVkIGZkLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgICAgICB0eXBlZGVmIHN0cnVjdCBzZXJpYWxfc3RydWN0IFNTOworICAgICAgICB0eXBlZGVmIHN0cnVjdCBzZXJpYWxfc3RydWN0MzIgU1MzMjsKKyAgICAgICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QzMiBfX3VzZXIgKnNzMzIgPSBjb21wYXRfcHRyKGFyZyk7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IHNzOworICAgICAgICBtbV9zZWdtZW50X3Qgb2xkc2VnID0gZ2V0X2ZzKCk7CisgICAgICAgIF9fdTMyIHVkYXRhOworCisgICAgICAgIGlmIChjbWQgPT0gVElPQ1NTRVJJQUwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgc3MzMiwgc2l6ZW9mKFNTMzIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgICAgIGlmIChfX2NvcHlfZnJvbV91c2VyKCZzcywgc3MzMiwgb2Zmc2V0b2YoU1MzMiwgaW9tZW1fYmFzZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgX19nZXRfdXNlcih1ZGF0YSwgJnNzMzItPmlvbWVtX2Jhc2UpOworICAgICAgICAgICAgICAgIHNzLmlvbWVtX2Jhc2UgPSBjb21wYXRfcHRyKHVkYXRhKTsKKyAgICAgICAgICAgICAgICBfX2dldF91c2VyKHNzLmlvbWVtX3JlZ19zaGlmdCwgJnNzMzItPmlvbWVtX3JlZ19zaGlmdCk7CisgICAgICAgICAgICAgICAgX19nZXRfdXNlcihzcy5wb3J0X2hpZ2gsICZzczMyLT5wb3J0X2hpZ2gpOworICAgICAgICAgICAgICAgIHNzLmlvbWFwX2Jhc2UgPSAwVUw7CisgICAgICAgIH0KKyAgICAgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisgICAgICAgICAgICAgICAgZXJyID0gc3lzX2lvY3RsKGZkLGNtZCwodW5zaWduZWQgbG9uZykoJnNzKSk7CisgICAgICAgIHNldF9mcyhvbGRzZWcpOworICAgICAgICBpZiAoY21kID09IFRJT0NHU0VSSUFMICYmIGVyciA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBzczMyLCBzaXplb2YoU1MzMikpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgaWYgKF9fY29weV90b191c2VyKHNzMzIsJnNzLG9mZnNldG9mKFNTMzIsaW9tZW1fYmFzZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgX19wdXRfdXNlcigodW5zaWduZWQgbG9uZylzcy5pb21lbV9iYXNlICA+PiAzMiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmZmZmZiA6ICh1bnNpZ25lZCkodW5zaWduZWQgbG9uZylzcy5pb21lbV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzczMyLT5pb21lbV9iYXNlKTsKKyAgICAgICAgICAgICAgICBfX3B1dF91c2VyKHNzLmlvbWVtX3JlZ19zaGlmdCwgJnNzMzItPmlvbWVtX3JlZ19zaGlmdCk7CisgICAgICAgICAgICAgICAgX19wdXRfdXNlcihzcy5wb3J0X2hpZ2gsICZzczMyLT5wb3J0X2hpZ2gpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKK30KKworc3RydWN0IHVzYmRldmZzX2N0cmx0cmFuc2ZlcjMyIHsKKyAgICAgICAgdTggYlJlcXVlc3RUeXBlOworICAgICAgICB1OCBiUmVxdWVzdDsKKyAgICAgICAgdTE2IHdWYWx1ZTsKKyAgICAgICAgdTE2IHdJbmRleDsKKyAgICAgICAgdTE2IHdMZW5ndGg7CisgICAgICAgIHUzMiB0aW1lb3V0OyAgLyogaW4gbWlsbGlzZWNvbmRzICovCisgICAgICAgIGNvbXBhdF9jYWRkcl90IGRhdGE7Cit9OworCisjZGVmaW5lIFVTQkRFVkZTX0NPTlRST0wzMiAgICAgICAgICAgX0lPV1IoJ1UnLCAwLCBzdHJ1Y3QgdXNiZGV2ZnNfY3RybHRyYW5zZmVyMzIpCisKK3N0YXRpYyBpbnQgZG9fdXNiZGV2ZnNfY29udHJvbCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgICAgICBzdHJ1Y3QgdXNiZGV2ZnNfY3RybHRyYW5zZmVyMzIgX191c2VyICpwMzIgPSBjb21wYXRfcHRyKGFyZyk7CisgICAgICAgIHN0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIgX191c2VyICpwOworICAgICAgICBfX3UzMiB1ZGF0YTsKKyAgICAgICAgcCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcCkpOworICAgICAgICBpZiAoY29weV9pbl91c2VyKHAsIHAzMiwgKHNpemVvZigqcDMyKSAtIHNpemVvZihjb21wYXRfY2FkZHJfdCkpKSB8fAorICAgICAgICAgICAgZ2V0X3VzZXIodWRhdGEsICZwMzItPmRhdGEpIHx8CisJICAgIHB1dF91c2VyKGNvbXBhdF9wdHIodWRhdGEpLCAmcC0+ZGF0YSkpCisJCXJldHVybiAtRUZBVUxUOworICAgICAgICByZXR1cm4gc3lzX2lvY3RsKGZkLCBVU0JERVZGU19DT05UUk9MLCAodW5zaWduZWQgbG9uZylwKTsKK30KKworCitzdHJ1Y3QgdXNiZGV2ZnNfYnVsa3RyYW5zZmVyMzIgeworICAgICAgICBjb21wYXRfdWludF90IGVwOworICAgICAgICBjb21wYXRfdWludF90IGxlbjsKKyAgICAgICAgY29tcGF0X3VpbnRfdCB0aW1lb3V0OyAvKiBpbiBtaWxsaXNlY29uZHMgKi8KKyAgICAgICAgY29tcGF0X2NhZGRyX3QgZGF0YTsKK307CisKKyNkZWZpbmUgVVNCREVWRlNfQlVMSzMyICAgICAgICAgICAgICBfSU9XUignVScsIDIsIHN0cnVjdCB1c2JkZXZmc19idWxrdHJhbnNmZXIzMikKKworc3RhdGljIGludCBkb191c2JkZXZmc19idWxrKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAgICAgIHN0cnVjdCB1c2JkZXZmc19idWxrdHJhbnNmZXIzMiBfX3VzZXIgKnAzMiA9IGNvbXBhdF9wdHIoYXJnKTsKKyAgICAgICAgc3RydWN0IHVzYmRldmZzX2J1bGt0cmFuc2ZlciBfX3VzZXIgKnA7CisgICAgICAgIGNvbXBhdF91aW50X3QgbjsKKyAgICAgICAgY29tcGF0X2NhZGRyX3QgYWRkcjsKKworICAgICAgICBwID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpwKSk7CisKKyAgICAgICAgaWYgKGdldF91c2VyKG4sICZwMzItPmVwKSB8fCBwdXRfdXNlcihuLCAmcC0+ZXApIHx8CisgICAgICAgICAgICBnZXRfdXNlcihuLCAmcDMyLT5sZW4pIHx8IHB1dF91c2VyKG4sICZwLT5sZW4pIHx8CisgICAgICAgICAgICBnZXRfdXNlcihuLCAmcDMyLT50aW1lb3V0KSB8fCBwdXRfdXNlcihuLCAmcC0+dGltZW91dCkgfHwKKyAgICAgICAgICAgIGdldF91c2VyKGFkZHIsICZwMzItPmRhdGEpIHx8IHB1dF91c2VyKGNvbXBhdF9wdHIoYWRkciksICZwLT5kYXRhKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKworICAgICAgICByZXR1cm4gc3lzX2lvY3RsKGZkLCBVU0JERVZGU19CVUxLLCAodW5zaWduZWQgbG9uZylwKTsKK30KKworCisvKgorICogIFVTQkRFVkZTX1NVQk1JVFVSQiwgVVNCREVWRlNfUkVBUFVSQiBhbmQgVVNCREVWRlNfUkVBUFVSQk5ERUxBWQorICogIGFyZSBoYW5kbGVkIGluIHVzYmRldmZzIGNvcmUuCQkJLUNocmlzdG9waGVyIExpCisgKi8KKworc3RydWN0IHVzYmRldmZzX2Rpc2Nvbm5lY3RzaWduYWwzMiB7CisgICAgICAgIGNvbXBhdF9pbnRfdCBzaWducjsKKyAgICAgICAgY29tcGF0X2NhZGRyX3QgY29udGV4dDsKK307CisKKyNkZWZpbmUgVVNCREVWRlNfRElTQ1NJR05BTDMyICAgICAgX0lPUignVScsIDE0LCBzdHJ1Y3QgdXNiZGV2ZnNfZGlzY29ubmVjdHNpZ25hbDMyKQorCitzdGF0aWMgaW50IGRvX3VzYmRldmZzX2Rpc2NzaWduYWwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICAgICAgc3RydWN0IHVzYmRldmZzX2Rpc2Nvbm5lY3RzaWduYWwga2RpczsKKyAgICAgICAgc3RydWN0IHVzYmRldmZzX2Rpc2Nvbm5lY3RzaWduYWwzMiBfX3VzZXIgKnVkaXM7CisgICAgICAgIG1tX3NlZ21lbnRfdCBvbGRfZnM7CisgICAgICAgIHUzMiB1Y3R4OworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIHVkaXMgPSBjb21wYXRfcHRyKGFyZyk7CisKKyAgICAgICAgaWYgKGdldF91c2VyKGtkaXMuc2lnbnIsICZ1ZGlzLT5zaWducikgfHwKKyAgICAgICAgICAgIF9fZ2V0X3VzZXIodWN0eCwgJnVkaXMtPmNvbnRleHQpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworCisgICAgICAgIGtkaXMuY29udGV4dCA9IGNvbXBhdF9wdHIodWN0eCk7CisKKyAgICAgICAgb2xkX2ZzID0gZ2V0X2ZzKCk7CisgICAgICAgIHNldF9mcyhLRVJORUxfRFMpOworICAgICAgICBlcnIgPSBzeXNfaW9jdGwoZmQsIFVTQkRFVkZTX0RJU0NTSUdOQUwsICh1bnNpZ25lZCBsb25nKSAma2Rpcyk7CisgICAgICAgIHNldF9mcyhvbGRfZnMpOworCisgICAgICAgIHJldHVybiBlcnI7Cit9CisKKy8qCisgKiBJMkMgbGF5ZXIgaW9jdGxzCisgKi8KKworc3RydWN0IGkyY19tc2czMiB7CisJdTE2IGFkZHI7CisJdTE2IGZsYWdzOworCXUxNiBsZW47CisJY29tcGF0X2NhZGRyX3QgYnVmOworfTsKKworc3RydWN0IGkyY19yZHdyX2lvY3RsX2RhdGEzMiB7CisJY29tcGF0X2NhZGRyX3QgbXNnczsgLyogc3RydWN0IGkyY19tc2cgX191c2VyICptc2dzICovCisJdTMyIG5tc2dzOworfTsKKworc3RydWN0IGkyY19zbWJ1c19pb2N0bF9kYXRhMzIgeworCXU4IHJlYWRfd3JpdGU7CisJdTggY29tbWFuZDsKKwl1MzIgc2l6ZTsKKwljb21wYXRfY2FkZHJfdCBkYXRhOyAvKiB1bmlvbiBpMmNfc21idXNfZGF0YSAqZGF0YSAqLworfTsKKworc3RydWN0IGkyY19yZHdyX2FsaWduZWQgeworCXN0cnVjdCBpMmNfcmR3cl9pb2N0bF9kYXRhIGNtZDsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzWzBdOworfTsKKworc3RhdGljIGludCBkb19pMmNfcmR3cl9pb2N0bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpMmNfcmR3cl9pb2N0bF9kYXRhMzIJX191c2VyICp1ZGF0YSA9IGNvbXBhdF9wdHIoYXJnKTsKKwlzdHJ1Y3QgaTJjX3Jkd3JfYWxpZ25lZAkJX191c2VyICp0ZGF0YTsKKwlzdHJ1Y3QgaTJjX21zZwkJCV9fdXNlciAqdG1zZ3M7CisJc3RydWN0IGkyY19tc2czMgkJX191c2VyICp1bXNnczsKKwljb21wYXRfY2FkZHJfdAkJCWRhdGFwOworCWludAkJCQlubXNncywgaTsKKworCWlmIChnZXRfdXNlcihubXNncywgJnVkYXRhLT5ubXNncykpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChubXNncyA+IEkyQ19SRFJXX0lPQ1RMX01BWF9NU0dTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChnZXRfdXNlcihkYXRhcCwgJnVkYXRhLT5tc2dzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJdW1zZ3MgPSBjb21wYXRfcHRyKGRhdGFwKTsKKworCXRkYXRhID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCp0ZGF0YSkgKworCQkJCSAgICAgIG5tc2dzICogc2l6ZW9mKHN0cnVjdCBpMmNfbXNnKSk7CisJdG1zZ3MgPSAmdGRhdGEtPm1zZ3NbMF07CisKKwlpZiAocHV0X3VzZXIobm1zZ3MsICZ0ZGF0YS0+Y21kLm5tc2dzKSB8fAorCSAgICBwdXRfdXNlcih0bXNncywgJnRkYXRhLT5jbWQubXNncykpCisJCXJldHVybiAtRUZBVUxUOworCisJZm9yIChpID0gMDsgaSA8IG5tc2dzOyBpKyspIHsKKwkJaWYgKGNvcHlfaW5fdXNlcigmdG1zZ3NbaV0uYWRkciwgJnVtc2dzW2ldLmFkZHIsIDMqc2l6ZW9mKHUxNikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChnZXRfdXNlcihkYXRhcCwgJnVtc2dzW2ldLmJ1ZikgfHwKKwkJICAgIHB1dF91c2VyKGNvbXBhdF9wdHIoZGF0YXApLCAmdG1zZ3NbaV0uYnVmKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKXRkYXRhKTsKK30KKworc3RhdGljIGludCBkb19pMmNfc21idXNfaW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaTJjX3NtYnVzX2lvY3RsX2RhdGEJX191c2VyICp0ZGF0YTsKKwlzdHJ1Y3QgaTJjX3NtYnVzX2lvY3RsX2RhdGEzMglfX3VzZXIgKnVkYXRhOworCWNvbXBhdF9jYWRkcl90CQkJZGF0YXA7CisKKwl0ZGF0YSA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqdGRhdGEpKTsKKwlpZiAodGRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0ZGF0YSwgc2l6ZW9mKCp0ZGF0YSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXVkYXRhID0gY29tcGF0X3B0cihhcmcpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1ZGF0YSwgc2l6ZW9mKCp1ZGF0YSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChfX2NvcHlfaW5fdXNlcigmdGRhdGEtPnJlYWRfd3JpdGUsICZ1ZGF0YS0+cmVhZF93cml0ZSwgMiAqIHNpemVvZih1OCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoX19jb3B5X2luX3VzZXIoJnRkYXRhLT5zaXplLCAmdWRhdGEtPnNpemUsIDIgKiBzaXplb2YodTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChfX2dldF91c2VyKGRhdGFwLCAmdWRhdGEtPmRhdGEpIHx8CisJICAgIF9fcHV0X3VzZXIoY29tcGF0X3B0cihkYXRhcCksICZ0ZGF0YS0+ZGF0YSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZyl0ZGF0YSk7Cit9CisKK3N0cnVjdCBjb21wYXRfaXdfcG9pbnQgeworCWNvbXBhdF9jYWRkcl90IHBvaW50ZXI7CisJX191MTYgbGVuZ3RoOworCV9fdTE2IGZsYWdzOworfTsKKworc3RhdGljIGludCBkb193aXJlbGVzc19pb2N0bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpd3JlcSBfX3VzZXIgKml3cjsKKwlzdHJ1Y3QgaXdyZXEgX191c2VyICppd3JfdTsKKwlzdHJ1Y3QgaXdfcG9pbnQgX191c2VyICppd3A7CisJc3RydWN0IGNvbXBhdF9pd19wb2ludCBfX3VzZXIgKml3cF91OworCWNvbXBhdF9jYWRkcl90IHBvaW50ZXI7CisJX191MTYgbGVuZ3RoLCBmbGFnczsKKworCWl3cl91ID0gY29tcGF0X3B0cihhcmcpOworCWl3cF91ID0gKHN0cnVjdCBjb21wYXRfaXdfcG9pbnQgX191c2VyICopICZpd3JfdS0+dS5kYXRhOworCWl3ciA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqaXdyKSk7CisJaWYgKGl3ciA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWl3cCA9ICZpd3ItPnUuZGF0YTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgaXdyLCBzaXplb2YoKml3cikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChfX2NvcHlfaW5fdXNlcigmaXdyLT5pZnJfaWZybi5pZnJuX25hbWVbMF0sCisJCQkgICAmaXdyX3UtPmlmcl9pZnJuLmlmcm5fbmFtZVswXSwKKwkJCSAgIHNpemVvZihpd3ItPmlmcl9pZnJuLmlmcm5fbmFtZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChfX2dldF91c2VyKHBvaW50ZXIsICZpd3BfdS0+cG9pbnRlcikgfHwKKwkgICAgX19nZXRfdXNlcihsZW5ndGgsICZpd3BfdS0+bGVuZ3RoKSB8fAorCSAgICBfX2dldF91c2VyKGZsYWdzLCAmaXdwX3UtPmZsYWdzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoX19wdXRfdXNlcihjb21wYXRfcHRyKHBvaW50ZXIpLCAmaXdwLT5wb2ludGVyKSB8fAorCSAgICBfX3B1dF91c2VyKGxlbmd0aCwgJml3cC0+bGVuZ3RoKSB8fAorCSAgICBfX3B1dF91c2VyKGZsYWdzLCAmaXdwLT5mbGFncykpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZykgaXdyKTsKK30KKworLyogU2luY2Ugb2xkIHN0eWxlIGJyaWRnZSBpb2N0bCdzIGVuZHVwIHVzaW5nIFNJT0NERVZQUklWQVRFCisgKiBmb3Igc29tZSBvcGVyYXRpb25zOyB0aGlzIGZvcmNlcyB1c2Ugb2YgdGhlIG5ld2VyIGJyaWRnZS11dGlscyB0aGF0CisgKiB1c2UgY29tcGF0aWFibGUgaW9jdGxzCisgKi8KK3N0YXRpYyBpbnQgb2xkX2JyaWRnZV9pb2N0bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXUzMiB0bXA7CisKKwlpZiAoZ2V0X3VzZXIodG1wLCAodTMyIF9fdXNlciAqKSBhcmcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAodG1wID09IEJSQ1RMX0dFVF9WRVJTSU9OKQorCQlyZXR1cm4gQlJDVExfVkVSU0lPTiArIDE7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19OQ1BfRlMpIHx8IGRlZmluZWQoQ09ORklHX05DUF9GU19NT0RVTEUpCitzdHJ1Y3QgbmNwX2lvY3RsX3JlcXVlc3RfMzIgeworCXUzMiBmdW5jdGlvbjsKKwl1MzIgc2l6ZTsKKwljb21wYXRfY2FkZHJfdCBkYXRhOworfTsKKworc3RydWN0IG5jcF9mc19pbmZvX3YyXzMyIHsKKwlzMzIgdmVyc2lvbjsKKwl1MzIgbW91bnRlZF91aWQ7CisJdTMyIGNvbm5lY3Rpb247CisJdTMyIGJ1ZmZlcl9zaXplOworCisJdTMyIHZvbHVtZV9udW1iZXI7CisJdTMyIGRpcmVjdG9yeV9pZDsKKworCXUzMiBkdW1teTE7CisJdTMyIGR1bW15MjsKKwl1MzIgZHVtbXkzOworfTsKKworc3RydWN0IG5jcF9vYmplY3RuYW1lX2lvY3RsXzMyCit7CisJczMyCQlhdXRoX3R5cGU7CisJdTMyCQlvYmplY3RfbmFtZV9sZW47CisJY29tcGF0X2NhZGRyX3QJb2JqZWN0X25hbWU7CS8qIGFuIHVzZXJzcGFjZSBkYXRhLCBpbiBtb3N0IGNhc2VzIHVzZXIgbmFtZSAqLworfTsKKworc3RydWN0IG5jcF9wcml2YXRlZGF0YV9pb2N0bF8zMgoreworCXUzMgkJbGVuOworCWNvbXBhdF9jYWRkcl90CWRhdGE7CQkvKiB+MTAwMCBmb3IgTkRTICovCit9OworCisjZGVmaW5lCU5DUF9JT0NfTkNQUkVRVUVTVF8zMgkJX0lPUignbicsIDEsIHN0cnVjdCBuY3BfaW9jdGxfcmVxdWVzdF8zMikKKyNkZWZpbmUgTkNQX0lPQ19HRVRNT1VOVFVJRDJfMzIJCV9JT1coJ24nLCAyLCB1MzIpCisjZGVmaW5lIE5DUF9JT0NfR0VUX0ZTX0lORk9fVjJfMzIJX0lPV1IoJ24nLCA0LCBzdHJ1Y3QgbmNwX2ZzX2luZm9fdjJfMzIpCisjZGVmaW5lIE5DUF9JT0NfR0VUT0JKRUNUTkFNRV8zMglfSU9XUignbicsIDksIHN0cnVjdCBuY3Bfb2JqZWN0bmFtZV9pb2N0bF8zMikKKyNkZWZpbmUgTkNQX0lPQ19TRVRPQkpFQ1ROQU1FXzMyCV9JT1IoJ24nLCA5LCBzdHJ1Y3QgbmNwX29iamVjdG5hbWVfaW9jdGxfMzIpCisjZGVmaW5lIE5DUF9JT0NfR0VUUFJJVkFURURBVEFfMzIJX0lPV1IoJ24nLCAxMCwgc3RydWN0IG5jcF9wcml2YXRlZGF0YV9pb2N0bF8zMikKKyNkZWZpbmUgTkNQX0lPQ19TRVRQUklWQVRFREFUQV8zMglfSU9SKCduJywgMTAsIHN0cnVjdCBuY3BfcHJpdmF0ZWRhdGFfaW9jdGxfMzIpCisKK3N0YXRpYyBpbnQgZG9fbmNwX25jcHJlcXVlc3QodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbmNwX2lvY3RsX3JlcXVlc3RfMzIgbjMyOworCXN0cnVjdCBuY3BfaW9jdGxfcmVxdWVzdCBfX3VzZXIgKnAgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnApKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbjMyLCBjb21wYXRfcHRyKGFyZyksIHNpemVvZihuMzIpKSB8fAorCSAgICBwdXRfdXNlcihuMzIuZnVuY3Rpb24sICZwLT5mdW5jdGlvbikgfHwKKwkgICAgcHV0X3VzZXIobjMyLnNpemUsICZwLT5zaXplKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKG4zMi5kYXRhKSwgJnAtPmRhdGEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBzeXNfaW9jdGwoZmQsIE5DUF9JT0NfTkNQUkVRVUVTVCwgKHVuc2lnbmVkIGxvbmcpcCk7Cit9CisKK3N0YXRpYyBpbnQgZG9fbmNwX2dldG1vdW50dWlkMih1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwlfX2tlcm5lbF91aWRfdCBrdWlkOworCWludCBlcnI7CisKKwljbWQgPSBOQ1BfSU9DX0dFVE1PVU5UVUlEMjsKKworCXNldF9mcyhLRVJORUxfRFMpOworCWVyciA9IHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZykma3VpZCk7CisJc2V0X2ZzKG9sZF9mcyk7CisKKwlpZiAoIWVycikKKwkJZXJyID0gcHV0X3VzZXIoa3VpZCwKKwkJCSAgICAgICAodW5zaWduZWQgaW50IF9fdXNlciAqKSBjb21wYXRfcHRyKGFyZykpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkb19uY3BfZ2V0ZnNpbmZvMih1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwlzdHJ1Y3QgbmNwX2ZzX2luZm9fdjJfMzIgbjMyOworCXN0cnVjdCBuY3BfZnNfaW5mb192MiBuOworCWludCBlcnI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm4zMiwgY29tcGF0X3B0cihhcmcpLCBzaXplb2YobjMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChuMzIudmVyc2lvbiAhPSBOQ1BfR0VUX0ZTX0lORk9fVkVSU0lPTl9WMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbi52ZXJzaW9uID0gTkNQX0dFVF9GU19JTkZPX1ZFUlNJT05fVjI7CisKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwllcnIgPSBzeXNfaW9jdGwoZmQsIE5DUF9JT0NfR0VUX0ZTX0lORk9fVjIsICh1bnNpZ25lZCBsb25nKSZuKTsKKwlzZXRfZnMob2xkX2ZzKTsKKworCWlmICghZXJyKSB7CisJCW4zMi52ZXJzaW9uID0gbi52ZXJzaW9uOworCQluMzIubW91bnRlZF91aWQgPSBuLm1vdW50ZWRfdWlkOworCQluMzIuY29ubmVjdGlvbiA9IG4uY29ubmVjdGlvbjsKKwkJbjMyLmJ1ZmZlcl9zaXplID0gbi5idWZmZXJfc2l6ZTsKKwkJbjMyLnZvbHVtZV9udW1iZXIgPSBuLnZvbHVtZV9udW1iZXI7CisJCW4zMi5kaXJlY3RvcnlfaWQgPSBuLmRpcmVjdG9yeV9pZDsKKwkJbjMyLmR1bW15MSA9IG4uZHVtbXkxOworCQluMzIuZHVtbXkyID0gbi5kdW1teTI7CisJCW4zMi5kdW1teTMgPSBuLmR1bW15MzsKKwkJZXJyID0gY29weV90b191c2VyKGNvbXBhdF9wdHIoYXJnKSwgJm4zMiwgc2l6ZW9mKG4zMikpID8gLUVGQVVMVCA6IDA7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZG9fbmNwX2dldG9iamVjdG5hbWUodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbmNwX29iamVjdG5hbWVfaW9jdGxfMzIgbjMyLCBfX3VzZXIgKnAzMiA9IGNvbXBhdF9wdHIoYXJnKTsKKwlzdHJ1Y3QgbmNwX29iamVjdG5hbWVfaW9jdGwgX191c2VyICpwID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpwKSk7CisJczMyIGF1dGhfdHlwZTsKKwl1MzIgbmFtZV9sZW47CisJaW50IGVycjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbjMyLCBwMzIsIHNpemVvZihuMzIpKSB8fAorCSAgICBwdXRfdXNlcihuMzIub2JqZWN0X25hbWVfbGVuLCAmcC0+b2JqZWN0X25hbWVfbGVuKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKG4zMi5vYmplY3RfbmFtZSksICZwLT5vYmplY3RfbmFtZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyID0gc3lzX2lvY3RsKGZkLCBOQ1BfSU9DX0dFVE9CSkVDVE5BTUUsICh1bnNpZ25lZCBsb25nKXApOworICAgICAgICBpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGdldF91c2VyKGF1dGhfdHlwZSwgJnAtPmF1dGhfdHlwZSkgfHwKKwkgICAgcHV0X3VzZXIoYXV0aF90eXBlLCAmcDMyLT5hdXRoX3R5cGUpIHx8CisJICAgIGdldF91c2VyKG5hbWVfbGVuLCAmcC0+b2JqZWN0X25hbWVfbGVuKSB8fAorCSAgICBwdXRfdXNlcihuYW1lX2xlbiwgJnAzMi0+b2JqZWN0X25hbWVfbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19uY3Bfc2V0b2JqZWN0bmFtZSh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBuY3Bfb2JqZWN0bmFtZV9pb2N0bF8zMiBuMzIsIF9fdXNlciAqcDMyID0gY29tcGF0X3B0cihhcmcpOworCXN0cnVjdCBuY3Bfb2JqZWN0bmFtZV9pb2N0bCBfX3VzZXIgKnAgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnApKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbjMyLCBwMzIsIHNpemVvZihuMzIpKSB8fAorCSAgICBwdXRfdXNlcihuMzIuYXV0aF90eXBlLCAmcC0+YXV0aF90eXBlKSB8fAorCSAgICBwdXRfdXNlcihuMzIub2JqZWN0X25hbWVfbGVuLCAmcC0+b2JqZWN0X25hbWVfbGVuKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKG4zMi5vYmplY3RfbmFtZSksICZwLT5vYmplY3RfbmFtZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHN5c19pb2N0bChmZCwgTkNQX0lPQ19TRVRPQkpFQ1ROQU1FLCAodW5zaWduZWQgbG9uZylwKTsKK30KKworc3RhdGljIGludCBkb19uY3BfZ2V0cHJpdmF0ZWRhdGEodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbmNwX3ByaXZhdGVkYXRhX2lvY3RsXzMyIG4zMiwgX191c2VyICpwMzIgPSBjb21wYXRfcHRyKGFyZyk7CisJc3RydWN0IG5jcF9wcml2YXRlZGF0YV9pb2N0bCBfX3VzZXIgKnAgPQorCQljb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnApKTsKKwl1MzIgbGVuOworCWludCBlcnI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm4zMiwgcDMyLCBzaXplb2YobjMyKSkgfHwKKwkgICAgcHV0X3VzZXIobjMyLmxlbiwgJnAtPmxlbikgfHwKKwkgICAgcHV0X3VzZXIoY29tcGF0X3B0cihuMzIuZGF0YSksICZwLT5kYXRhKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBzeXNfaW9jdGwoZmQsIE5DUF9JT0NfR0VUUFJJVkFURURBVEEsICh1bnNpZ25lZCBsb25nKXApOworICAgICAgICBpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGdldF91c2VyKGxlbiwgJnAtPmxlbikgfHwKKwkgICAgcHV0X3VzZXIobGVuLCAmcDMyLT5sZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX25jcF9zZXRwcml2YXRlZGF0YSh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBuY3BfcHJpdmF0ZWRhdGFfaW9jdGxfMzIgbjMyOworCXN0cnVjdCBuY3BfcHJpdmF0ZWRhdGFfaW9jdGxfMzIgX191c2VyICpwMzIgPSBjb21wYXRfcHRyKGFyZyk7CisJc3RydWN0IG5jcF9wcml2YXRlZGF0YV9pb2N0bCBfX3VzZXIgKnAgPQorCQljb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnApKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbjMyLCBwMzIsIHNpemVvZihuMzIpKSB8fAorCSAgICBwdXRfdXNlcihuMzIubGVuLCAmcC0+bGVuKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKG4zMi5kYXRhKSwgJnAtPmRhdGEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBzeXNfaW9jdGwoZmQsIE5DUF9JT0NfU0VUUFJJVkFURURBVEEsICh1bnNpZ25lZCBsb25nKXApOworfQorI2VuZGlmCisKKyN1bmRlZiBDT0RFCisjZW5kaWYKKworI2lmZGVmIERFQ0xBUkVTCitIQU5ETEVfSU9DVEwoTUVNUkVBRE9PQjMyLCBtdGRfcndfb29iKQorSEFORExFX0lPQ1RMKE1FTVdSSVRFT09CMzIsIG10ZF9yd19vb2IpCisjaWZkZWYgQ09ORklHX05FVAorSEFORExFX0lPQ1RMKFNJT0NHSUZOQU1FLCBkZXZfaWZuYW1lMzIpCitIQU5ETEVfSU9DVEwoU0lPQ0dJRkNPTkYsIGRldl9pZmNvbmYpCitIQU5ETEVfSU9DVEwoU0lPQ0dJRkZMQUdTLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NTSUZGTEFHUywgZGV2X2lmc2lvYykKK0hBTkRMRV9JT0NUTChTSU9DR0lGTUVUUklDLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NTSUZNRVRSSUMsIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ0dJRk1UVSwgZGV2X2lmc2lvYykKK0hBTkRMRV9JT0NUTChTSU9DU0lGTVRVLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NHSUZNRU0sIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ1NJRk1FTSwgZGV2X2lmc2lvYykKK0hBTkRMRV9JT0NUTChTSU9DR0lGSFdBRERSLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NTSUZIV0FERFIsIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ0FERE1VTFRJLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NERUxNVUxUSSwgZGV2X2lmc2lvYykKK0hBTkRMRV9JT0NUTChTSU9DR0lGSU5ERVgsIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ0dJRk1BUCwgZGV2X2lmc2lvYykKK0hBTkRMRV9JT0NUTChTSU9DU0lGTUFQLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NHSUZBRERSLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NTSUZBRERSLCBkZXZfaWZzaW9jKQorCisvKiBpb2N0bHMgdXNlZCBieSBhcHBsZXRhbGsgZGRwLmMgKi8KK0hBTkRMRV9JT0NUTChTSU9DQVRBTEtESUZBRERSLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NESUZBRERSLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NTQVJQLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NEQVJQLCBkZXZfaWZzaW9jKQorCitIQU5ETEVfSU9DVEwoU0lPQ0dJRkJSREFERFIsIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ1NJRkJSREFERFIsIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ0dJRkRTVEFERFIsIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ1NJRkRTVEFERFIsIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ0dJRk5FVE1BU0ssIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ1NJRk5FVE1BU0ssIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ1NJRlBGTEFHUywgZGV2X2lmc2lvYykKK0hBTkRMRV9JT0NUTChTSU9DR0lGUEZMQUdTLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NHSUZUWFFMRU4sIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ1NJRlRYUUxFTiwgZGV2X2lmc2lvYykKK0hBTkRMRV9JT0NUTChUVU5TRVRJRkYsIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ0VUSFRPT0wsIGV0aHRvb2xfaW9jdGwpCitIQU5ETEVfSU9DVEwoU0lPQ0JPTkRFTlNMQVZFLCBib25kX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NCT05EUkVMRUFTRSwgYm9uZF9pb2N0bCkKK0hBTkRMRV9JT0NUTChTSU9DQk9ORFNFVEhXQUREUiwgYm9uZF9pb2N0bCkKK0hBTkRMRV9JT0NUTChTSU9DQk9ORFNMQVZFSU5GT1FVRVJZLCBib25kX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NCT05ESU5GT1FVRVJZLCBib25kX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NCT05EQ0hBTkdFQUNUSVZFLCBib25kX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NBRERSVCwgcm91dGluZ19pb2N0bCkKK0hBTkRMRV9JT0NUTChTSU9DREVMUlQsIHJvdXRpbmdfaW9jdGwpCitIQU5ETEVfSU9DVEwoU0lPQ0JSQURESUYsIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ0JSREVMSUYsIGRldl9pZnNpb2MpCisvKiBOb3RlIFNJT0NSVE1TRyBpcyBubyBsb25nZXIsIHNvIHRoaXMgaXMgc2FmZSBhbmQgKiB0aGUgdXNlciB3b3VsZCBoYXZlIHNlZW4ganVzdCBhbiAtRUlOVkFMIGFueXdheXMuICovCitIQU5ETEVfSU9DVEwoU0lPQ1JUTVNHLCByZXRfZWludmFsKQorSEFORExFX0lPQ1RMKFNJT0NHU1RBTVAsIGRvX3Npb2Nnc3RhbXApCisjZW5kaWYKK0hBTkRMRV9JT0NUTChIRElPX0dFVEdFTywgaGRpb19nZXRnZW8pCitIQU5ETEVfSU9DVEwoQkxLUkFHRVQsIHdfbG9uZykKK0hBTkRMRV9JT0NUTChCTEtHRVRTSVpFLCB3X2xvbmcpCitIQU5ETEVfSU9DVEwoMHgxMjYwLCBicm9rZW5fYmxrZ2V0c2l6ZSkKK0hBTkRMRV9JT0NUTChCTEtGUkFHRVQsIHdfbG9uZykKK0hBTkRMRV9JT0NUTChCTEtTRUNUR0VULCB3X2xvbmcpCitIQU5ETEVfSU9DVEwoRkJJT0dFVF9GU0NSRUVOSU5GTywgZmJfaW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoQkxLUEcsIGJsa3BnX2lvY3RsX3RyYW5zKQorSEFORExFX0lPQ1RMKEZCSU9HRVRDTUFQLCBmYl9pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChGQklPUFVUQ01BUCwgZmJfaW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoSERJT19HRVRfS0VFUFNFVFRJTkdTLCBoZGlvX2lvY3RsX3RyYW5zKQorSEFORExFX0lPQ1RMKEhESU9fR0VUX1VOTUFTS0lOVFIsIGhkaW9faW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoSERJT19HRVRfRE1BLCBoZGlvX2lvY3RsX3RyYW5zKQorSEFORExFX0lPQ1RMKEhESU9fR0VUXzMyQklULCBoZGlvX2lvY3RsX3RyYW5zKQorSEFORExFX0lPQ1RMKEhESU9fR0VUX01VTFRDT1VOVCwgaGRpb19pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChIRElPX0dFVF9OT1dFUlIsIGhkaW9faW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoSERJT19HRVRfTklDRSwgaGRpb19pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChGRFNFVFBSTTMyLCBmZF9pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChGRERFRlBSTTMyLCBmZF9pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChGREdFVFBSTTMyLCBmZF9pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChGRFNFVERSVlBSTTMyLCBmZF9pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChGREdFVERSVlBSTTMyLCBmZF9pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChGREdFVERSVlNUQVQzMiwgZmRfaW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoRkRQT0xMRFJWU1RBVDMyLCBmZF9pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChGREdFVEZEQ1NUQVQzMiwgZmRfaW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoRkRXRVJST1JHRVQzMiwgZmRfaW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoU0dfSU8sc2dfaW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoUFBQSU9DR0lETEUzMiwgcHBwX2lvY3RsX3RyYW5zKQorSEFORExFX0lPQ1RMKFBQUElPQ1NDT01QUkVTUzMyLCBwcHBfaW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoUFBQSU9DU1BBU1MzMiwgcHBwX3NvY2tfZnByb2dfaW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoUFBQSU9DU0FDVElWRTMyLCBwcHBfc29ja19mcHJvZ19pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChNVElPQ0dFVDMyLCBtdF9pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChNVElPQ1BPUzMyLCBtdF9pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChDRFJPTVJFQURBVURJTywgY2Ryb21faW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoQ0RST01fU0VORF9QQUNLRVQsIGNkcm9tX2lvY3RsX3RyYW5zKQorSEFORExFX0lPQ1RMKExPT1BfU0VUX1NUQVRVUywgbG9vcF9zdGF0dXMpCitIQU5ETEVfSU9DVEwoTE9PUF9HRVRfU1RBVFVTLCBsb29wX3N0YXR1cykKKyNkZWZpbmUgQVVUT0ZTX0lPQ19TRVRUSU1FT1VUMzIgX0lPV1IoMHg5MywweDY0LHVuc2lnbmVkIGludCkKK0hBTkRMRV9JT0NUTChBVVRPRlNfSU9DX1NFVFRJTUVPVVQzMiwgaW9jX3NldHRpbWVvdXQpCisjaWZkZWYgQ09ORklHX1ZUCitIQU5ETEVfSU9DVEwoUElPX0ZPTlRYLCBkb19mb250eF9pb2N0bCkKK0hBTkRMRV9JT0NUTChHSU9fRk9OVFgsIGRvX2ZvbnR4X2lvY3RsKQorSEFORExFX0lPQ1RMKFBJT19VTklNQVAsIGRvX3VuaW1hcF9pb2N0bCkKK0hBTkRMRV9JT0NUTChHSU9fVU5JTUFQLCBkb191bmltYXBfaW9jdGwpCitIQU5ETEVfSU9DVEwoS0RGT05UT1AsIGRvX2tkZm9udG9wX2lvY3RsKQorI2VuZGlmCitIQU5ETEVfSU9DVEwoRVhUMl9JT0MzMl9HRVRGTEFHUywgZG9fZXh0Ml9pb2N0bCkKK0hBTkRMRV9JT0NUTChFWFQyX0lPQzMyX1NFVEZMQUdTLCBkb19leHQyX2lvY3RsKQorSEFORExFX0lPQ1RMKEVYVDJfSU9DMzJfR0VUVkVSU0lPTiwgZG9fZXh0Ml9pb2N0bCkKK0hBTkRMRV9JT0NUTChFWFQyX0lPQzMyX1NFVFZFUlNJT04sIGRvX2V4dDJfaW9jdGwpCitIQU5ETEVfSU9DVEwoVklESU9DR1RVTkVSMzIsIGRvX3ZpZGVvX2lvY3RsKQorSEFORExFX0lPQ1RMKFZJRElPQ1NUVU5FUjMyLCBkb192aWRlb19pb2N0bCkKK0hBTkRMRV9JT0NUTChWSURJT0NHV0lOMzIsIGRvX3ZpZGVvX2lvY3RsKQorSEFORExFX0lPQ1RMKFZJRElPQ1NXSU4zMiwgZG9fc2V0X3dpbmRvdykKK0hBTkRMRV9JT0NUTChWSURJT0NHRkJVRjMyLCBkb192aWRlb19pb2N0bCkKK0hBTkRMRV9JT0NUTChWSURJT0NTRkJVRjMyLCBkb192aWRlb19pb2N0bCkKK0hBTkRMRV9JT0NUTChWSURJT0NHRlJFUTMyLCBkb192aWRlb19pb2N0bCkKK0hBTkRMRV9JT0NUTChWSURJT0NTRlJFUTMyLCBkb192aWRlb19pb2N0bCkKKy8qIE9uZSBTTUIgaW9jdGwgbmVlZHMgdHJhbnNsYXRpb25zLiAqLworI2RlZmluZSBTTUJfSU9DX0dFVE1PVU5UVUlEXzMyIF9JT1IoJ3UnLCAxLCBjb21wYXRfdWlkX3QpCitIQU5ETEVfSU9DVEwoU01CX0lPQ19HRVRNT1VOVFVJRF8zMiwgZG9fc21iX2dldG1vdW50dWlkKQorSEFORExFX0lPQ1RMKEFUTV9HRVRMSU5LUkFURTMyLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoQVRNX0dFVE5BTUVTMzIsIGRvX2F0bV9pb2N0bCkKK0hBTkRMRV9JT0NUTChBVE1fR0VUVFlQRTMyLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoQVRNX0dFVEVTSTMyLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoQVRNX0dFVEFERFIzMiwgZG9fYXRtX2lvY3RsKQorSEFORExFX0lPQ1RMKEFUTV9SU1RBRERSMzIsIGRvX2F0bV9pb2N0bCkKK0hBTkRMRV9JT0NUTChBVE1fQUREQUREUjMyLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoQVRNX0RFTEFERFIzMiwgZG9fYXRtX2lvY3RsKQorSEFORExFX0lPQ1RMKEFUTV9HRVRDSVJBTkdFMzIsIGRvX2F0bV9pb2N0bCkKK0hBTkRMRV9JT0NUTChBVE1fU0VUQ0lSQU5HRTMyLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoQVRNX1NFVEVTSTMyLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoQVRNX1NFVEVTSUYzMiwgZG9fYXRtX2lvY3RsKQorSEFORExFX0lPQ1RMKEFUTV9HRVRTVEFUMzIsIGRvX2F0bV9pb2N0bCkKK0hBTkRMRV9JT0NUTChBVE1fR0VUU1RBVFozMiwgZG9fYXRtX2lvY3RsKQorSEFORExFX0lPQ1RMKEFUTV9HRVRMT09QMzIsIGRvX2F0bV9pb2N0bCkKK0hBTkRMRV9JT0NUTChBVE1fU0VUTE9PUDMyLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoQVRNX1FVRVJZTE9PUDMyLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoU09ORVRfR0VUU1RBVCwgZG9fYXRtX2lvY3RsKQorSEFORExFX0lPQ1RMKFNPTkVUX0dFVFNUQVRaLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoU09ORVRfR0VURElBRywgZG9fYXRtX2lvY3RsKQorSEFORExFX0lPQ1RMKFNPTkVUX1NFVERJQUcsIGRvX2F0bV9pb2N0bCkKK0hBTkRMRV9JT0NUTChTT05FVF9DTFJESUFHLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoU09ORVRfU0VURlJBTUlORywgZG9fYXRtX2lvY3RsKQorSEFORExFX0lPQ1RMKFNPTkVUX0dFVEZSQU1JTkcsIGRvX2F0bV9pb2N0bCkKK0hBTkRMRV9JT0NUTChTT05FVF9HRVRGUlNFTlNFLCBkb19hdG1faW9jdGwpCisvKiBibG9jayBzdHVmZiAqLworSEFORExFX0lPQ1RMKEJMS0JTWkdFVF8zMiwgZG9fYmxrYnN6Z2V0KQorSEFORExFX0lPQ1RMKEJMS0JTWlNFVF8zMiwgZG9fYmxrYnN6c2V0KQorSEFORExFX0lPQ1RMKEJMS0dFVFNJWkU2NF8zMiwgZG9fYmxrZ2V0c2l6ZTY0KQorLyogdmZhdCAqLworSEFORExFX0lPQ1RMKFZGQVRfSU9DVExfUkVBRERJUl9CT1RIMzIsIHZmYXRfaW9jdGwzMikKK0hBTkRMRV9JT0NUTChWRkFUX0lPQ1RMX1JFQURESVJfU0hPUlQzMiwgdmZhdF9pb2N0bDMyKQorSEFORExFX0lPQ1RMKFJFSVNFUkZTX0lPQ19VTlBBQ0szMiwgcmVpc2VyZnNfaW9jdGwzMikKKy8qIFJhdyBkZXZpY2VzICovCitIQU5ETEVfSU9DVEwoUkFXX1NFVEJJTkQsIHJhd19pb2N0bCkKK0hBTkRMRV9JT0NUTChSQVdfR0VUQklORCwgcmF3X2lvY3RsKQorLyogU2VyaWFsICovCitIQU5ETEVfSU9DVEwoVElPQ0dTRVJJQUwsIHNlcmlhbF9zdHJ1Y3RfaW9jdGwpCitIQU5ETEVfSU9DVEwoVElPQ1NTRVJJQUwsIHNlcmlhbF9zdHJ1Y3RfaW9jdGwpCisvKiBVc2JkZXZmcyAqLworSEFORExFX0lPQ1RMKFVTQkRFVkZTX0NPTlRST0wzMiwgZG9fdXNiZGV2ZnNfY29udHJvbCkKK0hBTkRMRV9JT0NUTChVU0JERVZGU19CVUxLMzIsIGRvX3VzYmRldmZzX2J1bGspCitIQU5ETEVfSU9DVEwoVVNCREVWRlNfRElTQ1NJR05BTDMyLCBkb191c2JkZXZmc19kaXNjc2lnbmFsKQorLyogaTJjICovCitIQU5ETEVfSU9DVEwoSTJDX0ZVTkNTLCB3X2xvbmcpCitIQU5ETEVfSU9DVEwoSTJDX1JEV1IsIGRvX2kyY19yZHdyX2lvY3RsKQorSEFORExFX0lPQ1RMKEkyQ19TTUJVUywgZG9faTJjX3NtYnVzX2lvY3RsKQorLyogd2lyZWxlc3MgKi8KK0hBTkRMRV9JT0NUTChTSU9DR0lXUkFOR0UsIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NTSVdTUFksIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NHSVdTUFksIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NTSVdUSFJTUFksIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NHSVdUSFJTUFksIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NHSVdBUExJU1QsIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NHSVdTQ0FOLCBkb193aXJlbGVzc19pb2N0bCkKK0hBTkRMRV9JT0NUTChTSU9DU0lXRVNTSUQsIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NHSVdFU1NJRCwgZG9fd2lyZWxlc3NfaW9jdGwpCitIQU5ETEVfSU9DVEwoU0lPQ1NJV05JQ0tOLCBkb193aXJlbGVzc19pb2N0bCkKK0hBTkRMRV9JT0NUTChTSU9DR0lXTklDS04sIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NTSVdFTkNPREUsIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NHSVdFTkNPREUsIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NTSUZCUiwgb2xkX2JyaWRnZV9pb2N0bCkKK0hBTkRMRV9JT0NUTChTSU9DR0lGQlIsIG9sZF9icmlkZ2VfaW9jdGwpCisKKyNpZiBkZWZpbmVkKENPTkZJR19OQ1BfRlMpIHx8IGRlZmluZWQoQ09ORklHX05DUF9GU19NT0RVTEUpCitIQU5ETEVfSU9DVEwoTkNQX0lPQ19OQ1BSRVFVRVNUXzMyLCBkb19uY3BfbmNwcmVxdWVzdCkKK0hBTkRMRV9JT0NUTChOQ1BfSU9DX0dFVE1PVU5UVUlEMl8zMiwgZG9fbmNwX2dldG1vdW50dWlkMikKK0hBTkRMRV9JT0NUTChOQ1BfSU9DX0dFVF9GU19JTkZPX1YyXzMyLCBkb19uY3BfZ2V0ZnNpbmZvMikKK0hBTkRMRV9JT0NUTChOQ1BfSU9DX0dFVE9CSkVDVE5BTUVfMzIsIGRvX25jcF9nZXRvYmplY3RuYW1lKQorSEFORExFX0lPQ1RMKE5DUF9JT0NfU0VUT0JKRUNUTkFNRV8zMiwgZG9fbmNwX3NldG9iamVjdG5hbWUpCitIQU5ETEVfSU9DVEwoTkNQX0lPQ19HRVRQUklWQVRFREFUQV8zMiwgZG9fbmNwX2dldHByaXZhdGVkYXRhKQorSEFORExFX0lPQ1RMKE5DUF9JT0NfU0VUUFJJVkFURURBVEFfMzIsIGRvX25jcF9zZXRwcml2YXRlZGF0YSkKKyNlbmRpZgorCisjdW5kZWYgREVDTEFSRVMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvY3JhbWZzL01ha2VmaWxlIGIvZnMvY3JhbWZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZWJiNDYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jcmFtZnMvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggY3JhbWZzIHJvdXRpbmVzLgorIworCitvYmotJChDT05GSUdfQ1JBTUZTKSArPSBjcmFtZnMubworCitjcmFtZnMtb2JqcyA6PSBpbm9kZS5vIHVuY29tcHJlc3MubwpkaWZmIC0tZ2l0IGEvZnMvY3JhbWZzL1JFQURNRSBiL2ZzL2NyYW1mcy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ1ZDFjMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NyYW1mcy9SRUFETUUKQEAgLTAsMCArMSwxNjggQEAKK05vdGVzIG9uIEZpbGVzeXN0ZW0gTGF5b3V0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGVzZSBub3RlcyBkZXNjcmliZSB3aGF0IG1rY3JhbWZzIGdlbmVyYXRlcy4gIEtlcm5lbCByZXF1aXJlbWVudHMgYXJlCithIGJpdCBsb29zZXIsIGUuZy4gaXQgZG9lc24ndCBjYXJlIGlmIHRoZSA8ZmlsZV9kYXRhPiBpdGVtcyBhcmUKK3N3YXBwZWQgYXJvdW5kICh0aG91Z2ggaXQgZG9lcyBjYXJlIHRoYXQgZGlyZWN0b3J5IGVudHJpZXMgKGlub2RlcykgaW4KK2EgZ2l2ZW4gZGlyZWN0b3J5IGFyZSBjb250aWd1b3VzLCBhcyB0aGlzIGlzIHVzZWQgYnkgcmVhZGRpcikuCisKK0FsbCBkYXRhIGlzIGN1cnJlbnRseSBpbiBob3N0LWVuZGlhbiBmb3JtYXQ7IG5laXRoZXIgbWtjcmFtZnMgbm9yIHRoZQora2VybmVsIGV2ZXIgZG8gc3dhYmJpbmcuICAoU2VlIHNlY3Rpb24gYEJsb2NrIFNpemUnIGJlbG93LikKKworPGZpbGVzeXN0ZW0+OgorCTxzdXBlcmJsb2NrPgorCTxkaXJlY3Rvcnlfc3RydWN0dXJlPgorCTxkYXRhPgorCis8c3VwZXJibG9jaz46IHN0cnVjdCBjcmFtZnNfc3VwZXIgKHNlZSBjcmFtZnNfZnMuaCkuCisKKzxkaXJlY3Rvcnlfc3RydWN0dXJlPjoKKwlGb3IgZWFjaCBmaWxlOgorCQlzdHJ1Y3QgY3JhbWZzX2lub2RlIChzZWUgY3JhbWZzX2ZzLmgpLgorCQlGaWxlbmFtZS4gIE5vdCBnZW5lcmFsbHkgbnVsbC10ZXJtaW5hdGVkLCBidXQgaXQgaXMKKwkJIG51bGwtcGFkZGVkIHRvIGEgbXVsdGlwbGUgb2YgNCBieXRlcy4KKworVGhlIG9yZGVyIG9mIGlub2RlIHRyYXZlcnNhbCBpcyBkZXNjcmliZWQgYXMgIndpZHRoLWZpcnN0IiAobm90IHRvIGJlCitjb25mdXNlZCB3aXRoIGJyZWFkdGgtZmlyc3QpOyBpLmUuIGxpa2UgZGVwdGgtZmlyc3QgYnV0IGxpc3RpbmcgYWxsIG9mCithIGRpcmVjdG9yeSdzIGVudHJpZXMgYmVmb3JlIHJlY3Vyc2luZyBkb3duIGl0cyBzdWJkaXJlY3RvcmllczogdGhlCitzYW1lIG9yZGVyIGFzIGBscyAtQVVSJyAoYnV0IHdpdGhvdXQgdGhlIC9eXC4uKjokLyBkaXJlY3RvcnkgaGVhZGVyCitsaW5lcyk7IHB1dCBhbm90aGVyIHdheSwgdGhlIHNhbWUgb3JkZXIgYXMgYGZpbmQgLXR5cGUgZCAtZXhlYworbHMgLUFVMSB7fSBcOycuCisKK0JlZ2lubmluZyBpbiAyLjQuNywgZGlyZWN0b3J5IGVudHJpZXMgYXJlIHNvcnRlZC4gIFRoaXMgb3B0aW1pemF0aW9uCithbGxvd3MgY3JhbWZzX2xvb2t1cCB0byByZXR1cm4gbW9yZSBxdWlja2x5IHdoZW4gYSBmaWxlbmFtZSBkb2VzIG5vdAorZXhpc3QsIHNwZWVkcyB1cCB1c2VyLXNwYWNlIGRpcmVjdG9yeSBzb3J0cywgZXRjLgorCis8ZGF0YT46CisJT25lIDxmaWxlX2RhdGE+IGZvciBlYWNoIGZpbGUgdGhhdCdzIGVpdGhlciBhIHN5bWxpbmsgb3IgYQorCSByZWd1bGFyIGZpbGUgb2Ygbm9uLXplcm8gc3Rfc2l6ZS4KKworPGZpbGVfZGF0YT46CisJbmJsb2NrcyAqIDxibG9ja19wb2ludGVyPgorCSAod2hlcmUgbmJsb2NrcyA9IChzdF9zaXplIC0gMSkgLyBibGtzaXplICsgMSkKKwluYmxvY2tzICogPGJsb2NrPgorCXBhZGRpbmcgdG8gbXVsdGlwbGUgb2YgNCBieXRlcworCitUaGUgaSd0aCA8YmxvY2tfcG9pbnRlcj4gZm9yIGEgZmlsZSBzdG9yZXMgdGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZQorKmVuZCogb2YgdGhlIGkndGggPGJsb2NrPiAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBieXRlLCB3aGljaCBpcyB0aGUKK3NhbWUgYXMgdGhlIHN0YXJ0IG9mIHRoZSAoaSsxKSd0aCA8YmxvY2s+IGlmIHRoZXJlIGlzIG9uZSkuICBUaGUgZmlyc3QKKzxibG9jaz4gaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgbGFzdCA8YmxvY2tfcG9pbnRlcj4gZm9yIHRoZSBmaWxlLgorPGJsb2NrX3BvaW50ZXI+cyBhcmUgZWFjaCAzMiBiaXRzIGxvbmcuCisKK1RoZSBvcmRlciBvZiA8ZmlsZV9kYXRhPidzIGlzIGEgZGVwdGgtZmlyc3QgZGVzY2VudCBvZiB0aGUgZGlyZWN0b3J5Cit0cmVlLCBpLmUuIHRoZSBzYW1lIG9yZGVyIGFzIGBmaW5kIC1zaXplICswIFwoIC10eXBlIGYgLW8gLXR5cGUgbCBcKQorLXByaW50Jy4KKworCis8YmxvY2s+OiBUaGUgaSd0aCA8YmxvY2s+IGlzIHRoZSBvdXRwdXQgb2YgemxpYidzIGNvbXByZXNzIGZ1bmN0aW9uCithcHBsaWVkIHRvIHRoZSBpJ3RoIGJsa3NpemUtc2l6ZWQgY2h1bmsgb2YgdGhlIGlucHV0IGRhdGEuCisoRm9yIHRoZSBsYXN0IDxibG9jaz4gb2YgdGhlIGZpbGUsIHRoZSBpbnB1dCBtYXkgb2YgY291cnNlIGJlIHNtYWxsZXIuKQorRWFjaCA8YmxvY2s+IG1heSBiZSBhIGRpZmZlcmVudCBzaXplLiAgKFNlZSA8YmxvY2tfcG9pbnRlcj4gYWJvdmUuKQorPGJsb2NrPnMgYXJlIG1lcmVseSBieXRlLWFsaWduZWQsIG5vdCBnZW5lcmFsbHkgdTMyLWFsaWduZWQuCisKKworSG9sZXMKKy0tLS0tCisKK1RoaXMga2VybmVsIHN1cHBvcnRzIGNyYW1mcyBob2xlcyAoaS5lLiBbZWZmaWNpZW50IHJlcHJlc2VudGF0aW9uIG9mXQorYmxvY2tzIGluIHVuY29tcHJlc3NlZCBkYXRhIGNvbnNpc3RpbmcgZW50aXJlbHkgb2YgTlVMIGJ5dGVzKSwgYnV0IGJ5CitkZWZhdWx0IG1rY3JhbWZzIGRvZXNuJ3QgdGVzdCBmb3IgJiBjcmVhdGUgaG9sZXMsIHNpbmNlIGNyYW1mcyBpbgora2VybmVscyB1cCB0byBhdCBsZWFzdCAyLjMuMzkgZGlkbid0IHN1cHBvcnQgaG9sZXMuICBSdW4gbWtjcmFtZnMKK3dpdGggLXogaWYgeW91IHdhbnQgaXQgdG8gY3JlYXRlIGZpbGVzIHRoYXQgY2FuIGhhdmUgaG9sZXMgaW4gdGhlbS4KKworCitUb29scworLS0tLS0KKworVGhlIGNyYW1mcyB1c2VyLXNwYWNlIHRvb2xzLCBpbmNsdWRpbmcgbWtjcmFtZnMgYW5kIGNyYW1mc2NrLCBhcmUKK2xvY2F0ZWQgYXQgPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvY3JhbWZzLz4uCisKKworRnV0dXJlIERldmVsb3BtZW50Cis9PT09PT09PT09PT09PT09PT0KKworQmxvY2sgU2l6ZQorLS0tLS0tLS0tLQorCisoQmxvY2sgc2l6ZSBpbiBjcmFtZnMgcmVmZXJzIHRvIHRoZSBzaXplIG9mIGlucHV0IGRhdGEgdGhhdCBpcworY29tcHJlc3NlZCBhdCBhIHRpbWUuICBJdCdzIGludGVuZGVkIHRvIGJlIHNvbWV3aGVyZSBhcm91bmQKK1BBR0VfQ0FDSEVfU0laRSBmb3IgY3JhbWZzX3JlYWRwYWdlJ3MgY29udmVuaWVuY2UuKQorCitUaGUgc3VwZXJibG9jayBvdWdodCB0byBpbmRpY2F0ZSB0aGUgYmxvY2sgc2l6ZSB0aGF0IHRoZSBmcyB3YXMKK3dyaXR0ZW4gZm9yLCBzaW5jZSBjb21tZW50cyBpbiA8bGludXgvcGFnZW1hcC5oPiBpbmRpY2F0ZSB0aGF0CitQQUdFX0NBQ0hFX1NJWkUgbWF5IGdyb3cgaW4gZnV0dXJlIChpZiBJIGludGVycHJldCB0aGUgY29tbWVudAorY29ycmVjdGx5KS4KKworQ3VycmVudGx5LCBta2NyYW1mcyAjZGVmaW5lJ3MgUEFHRV9DQUNIRV9TSVpFIGFzIDQwOTYgYW5kIHVzZXMgdGhhdAorZm9yIGJsa3NpemUsIHdoZXJlYXMgTGludXgtMi4zLjM5IHVzZXMgaXRzIFBBR0VfQ0FDSEVfU0laRSwgd2hpY2ggaW4KK3R1cm4gaXMgZGVmaW5lZCBhcyBQQUdFX1NJWkUgKHdoaWNoIGNhbiBiZSBhcyBsYXJnZSBhcyAzMktCIG9uIGFybSkuCitUaGlzIGRpc2NyZXBhbmN5IGlzIGEgYnVnLCB0aG91Z2ggaXQncyBub3QgY2xlYXIgd2hpY2ggc2hvdWxkIGJlCitjaGFuZ2VkLgorCitPbmUgb3B0aW9uIGlzIHRvIGNoYW5nZSBta2NyYW1mcyB0byB0YWtlIGl0cyBQQUdFX0NBQ0hFX1NJWkUgZnJvbQorPGFzbS9wYWdlLmg+LiAgUGVyc29uYWxseSBJIGRvbid0IGxpa2UgdGhpcyBvcHRpb24sIGJ1dCBpdCBkb2VzCityZXF1aXJlIHRoZSBsZWFzdCBhbW91bnQgb2YgY2hhbmdlOiBqdXN0IGNoYW5nZSBgI2RlZmluZQorUEFHRV9DQUNIRV9TSVpFICg0MDk2KScgdG8gYCNpbmNsdWRlIDxhc20vcGFnZS5oPicuICBUaGUgZGlzYWR2YW50YWdlCitpcyB0aGF0IHRoZSBnZW5lcmF0ZWQgY3JhbWZzIGNhbm5vdCBhbHdheXMgYmUgc2hhcmVkIGJldHdlZW4gZGlmZmVyZW50CitrZXJuZWxzLCBub3QgZXZlbiBuZWNlc3NhcmlseSBrZXJuZWxzIG9mIHRoZSBzYW1lIGFyY2hpdGVjdHVyZSBpZgorUEFHRV9DQUNIRV9TSVpFIGlzIHN1YmplY3QgdG8gY2hhbmdlIGJldHdlZW4ga2VybmVsIHZlcnNpb25zCisoY3VycmVudGx5IHBvc3NpYmxlIHdpdGggYXJtIGFuZCBpYTY0KS4KKworVGhlIHJlbWFpbmluZyBvcHRpb25zIHRyeSB0byBtYWtlIGNyYW1mcyBtb3JlIHNoYXJhYmxlLgorCitPbmUgcGFydCBvZiB0aGF0IGlzIGFkZHJlc3NpbmcgZW5kaWFubmVzcy4gIFRoZSB0d28gb3B0aW9ucyBoZXJlIGFyZQorYGFsd2F5cyB1c2UgbGl0dGxlLWVuZGlhbicgKGxpa2UgZXh0MmZzKSBvciBgd3JpdGVyIGNob29zZXMKK2VuZGlhbm5lc3M7IGtlcm5lbCBhZGFwdHMgYXQgcnVudGltZScuICBMaXR0bGUtZW5kaWFuIHdpbnMgYmVjYXVzZSBvZgorY29kZSBzaW1wbGljaXR5IGFuZCBsaXR0bGUgQ1BVIG92ZXJoZWFkIGV2ZW4gb24gYmlnLWVuZGlhbiBtYWNoaW5lcy4KKworVGhlIGNvc3Qgb2Ygc3dhYmJpbmcgaXMgY2hhbmdpbmcgdGhlIGNvZGUgdG8gdXNlIHRoZSBsZTMyX3RvX2NwdQorZXRjLiBtYWNyb3MgYXMgdXNlZCBieSBleHQyZnMuICBXZSBkb24ndCBuZWVkIHRvIHN3YWIgdGhlIGNvbXByZXNzZWQKK2RhdGEsIG9ubHkgdGhlIHN1cGVyYmxvY2ssIGlub2RlcyBhbmQgYmxvY2sgcG9pbnRlcnMuCisKKworVGhlIG90aGVyIHBhcnQgb2YgbWFraW5nIGNyYW1mcyBtb3JlIHNoYXJhYmxlIGlzIGNob29zaW5nIGEgYmxvY2sKK3NpemUuICBUaGUgb3B0aW9ucyBhcmU6CisKKyAgMS4gQWx3YXlzIDQwOTYgYnl0ZXMuCisKKyAgMi4gV3JpdGVyIGNob29zZXMgYmxvY2tzaXplOyBrZXJuZWwgYWRhcHRzIGJ1dCByZWplY3RzIGJsb2Nrc2l6ZSA+CisgICAgIFBBR0VfQ0FDSEVfU0laRS4KKworICAzLiBXcml0ZXIgY2hvb3NlcyBibG9ja3NpemU7IGtlcm5lbCBhZGFwdHMgZXZlbiB0byBibG9ja3NpemUgPgorICAgICBQQUdFX0NBQ0hFX1NJWkUuCisKK0l0J3MgZWFzeSBlbm91Z2ggdG8gY2hhbmdlIHRoZSBrZXJuZWwgdG8gdXNlIGEgc21hbGxlciB2YWx1ZSB0aGFuCitQQUdFX0NBQ0hFX1NJWkU6IGp1c3QgbWFrZSBjcmFtZnNfcmVhZHBhZ2UgcmVhZCBtdWx0aXBsZSBibG9ja3MuCisKK1RoZSBjb3N0IG9mIG9wdGlvbiAxIGlzIHRoYXQga2VybmVscyB3aXRoIGEgbGFyZ2VyIFBBR0VfQ0FDSEVfU0laRQordmFsdWUgZG9uJ3QgZ2V0IGFzIGdvb2QgY29tcHJlc3Npb24gYXMgdGhleSBjYW4uCisKK1RoZSBjb3N0IG9mIG9wdGlvbiAyIHJlbGF0aXZlIHRvIG9wdGlvbiAxIGlzIHRoYXQgdGhlIGNvZGUgdXNlcwordmFyaWFibGVzIGluc3RlYWQgb2YgI2RlZmluZSdkIGNvbnN0YW50cy4gIFRoZSBnYWluIGlzIHRoYXQgcGVvcGxlCit3aXRoIGtlcm5lbHMgaGF2aW5nIGxhcmdlciBQQUdFX0NBQ0hFX1NJWkUgY2FuIG1ha2UgdXNlIG9mIHRoYXQgaWYKK3RoZXkgZG9uJ3QgbWluZCB0aGVpciBjcmFtZnMgYmVpbmcgaW5hY2Nlc3NpYmxlIHRvIGtlcm5lbHMgd2l0aAorc21hbGxlciBQQUdFX0NBQ0hFX1NJWkUgdmFsdWVzLgorCitPcHRpb24gMyBpcyBlYXN5IHRvIGltcGxlbWVudCBpZiB3ZSBkb24ndCBtaW5kIGJlaW5nIENQVS1pbmVmZmljaWVudDoKK2UuZy4gZ2V0IHJlYWRwYWdlIHRvIGRlY29tcHJlc3MgdG8gYSBidWZmZXIgb2Ygc2l6ZSBNQVhfQkxLU0laRSAod2hpY2gKK211c3QgYmUgbm8gbGFyZ2VyIHRoYW4gMzJLQikgYW5kIGRpc2NhcmQgd2hhdCBpdCBkb2Vzbid0IG5lZWQuCitHZXR0aW5nIHJlYWRwYWdlIHRvIHJlYWQgaW50byBhbGwgdGhlIGNvdmVyZWQgcGFnZXMgaXMgaGFyZGVyLgorCitUaGUgbWFpbiBhZHZhbnRhZ2Ugb2Ygb3B0aW9uIDMgb3ZlciAxLCAyLCBpcyBiZXR0ZXIgY29tcHJlc3Npb24uICBUaGUKK2Nvc3QgaXMgZ3JlYXRlciBjb21wbGV4aXR5LiAgUHJvYmFibHkgbm90IHdvcnRoIGl0LCBidXQgSSBob3BlIHNvbWVvbmUKK3dpbGwgZGlzYWdyZWUuICAoSWYgaXQgaXMgaW1wbGVtZW50ZWQsIHRoZW4gSSdsbCByZS11c2UgdGhhdCBjb2RlIGluCitlMmNvbXByLikKKworCitBbm90aGVyIGNvc3Qgb2YgMiBhbmQgMyBvdmVyIDEgaXMgbWFraW5nIG1rY3JhbWZzIHVzZSBhIGRpZmZlcmVudAorYmxvY2sgc2l6ZSwgYnV0IHRoYXQganVzdCBtZWFucyBhZGRpbmcgYW5kIHBhcnNpbmcgYSAtYiBvcHRpb24uCisKKworSW5vZGUgU2l6ZQorLS0tLS0tLS0tLQorCitHaXZlbiB0aGF0IGNyYW1mcyB3aWxsIHByb2JhYmx5IGJlIHVzZWQgZm9yIENEcyBldGMuIGFzIHdlbGwgYXMganVzdAorc2lsaWNvbiBST01zLCBpdCBtaWdodCBtYWtlIHNlbnNlIHRvIGV4cGFuZCB0aGUgaW5vZGUgYSBsaXR0bGUgZnJvbQoraXRzIGN1cnJlbnQgMTIgYnl0ZXMuICBJbm9kZXMgb3RoZXIgdGhhbiB0aGUgcm9vdCBpbm9kZSBhcmUgZm9sbG93ZWQKK2J5IGZpbGVuYW1lLCBzbyB0aGUgZXhwYW5zaW9uIGRvZXNuJ3QgZXZlbiBoYXZlIHRvIGJlIGEgbXVsdGlwbGUgb2YgNAorYnl0ZXMuCmRpZmYgLS1naXQgYS9mcy9jcmFtZnMvaW5vZGUuYyBiL2ZzL2NyYW1mcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMjg1ZWZhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY3JhbWZzL2lub2RlLmMKQEAgLTAsMCArMSw1MjUgQEAKKy8qCisgKiBDb21wcmVzc2VkIHJvbSBmaWxlc3lzdGVtIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGludXMgVG9ydmFsZHMuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgVkZTIGludGVyZmFjZXMgdG8gdGhlIGNvbXByZXNzZWQgcm9tIGZpbGVzeXN0ZW0uCisgKiBUaGUgYWN0dWFsIGNvbXByZXNzaW9uIGlzIGJhc2VkIG9uIHpsaWIsIHNlZSB0aGUgb3RoZXIgZmlsZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmFtZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY3JhbWZzX2ZzX3NiLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgY3JhbWZzX29wczsKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBjcmFtZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjcmFtZnNfZGlyZWN0b3J5X29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBjcmFtZnNfYW9wczsKKworc3RhdGljIERFQ0xBUkVfTVVURVgocmVhZF9tdXRleCk7CisKKworLyogVGhlc2UgdHdvIG1hY3JvcyBtYXkgY2hhbmdlIGluIGZ1dHVyZSwgdG8gcHJvdmlkZSBiZXR0ZXIgc3RfaW5vCisgICBzZW1hbnRpY3MuICovCisjZGVmaW5lIENSQU1JTk8oeCkJKCh4KS0+b2Zmc2V0Pyh4KS0+b2Zmc2V0PDwyOjEpCisjZGVmaW5lIE9GRlNFVCh4KQkoKHgpLT5pX2lubykKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqZ2V0X2NyYW1mc19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgY3JhbWZzX2lub2RlICogY3JhbWZzX2lub2RlKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gbmV3X2lub2RlKHNiKTsKKwlzdGF0aWMgc3RydWN0IHRpbWVzcGVjIHplcm90aW1lOworCisJaWYgKGlub2RlKSB7CisJCWlub2RlLT5pX21vZGUgPSBjcmFtZnNfaW5vZGUtPm1vZGU7CisJCWlub2RlLT5pX3VpZCA9IGNyYW1mc19pbm9kZS0+dWlkOworCQlpbm9kZS0+aV9zaXplID0gY3JhbWZzX2lub2RlLT5zaXplOworCQlpbm9kZS0+aV9ibG9ja3MgPSAoY3JhbWZzX2lub2RlLT5zaXplIC0gMSkgLyA1MTIgKyAxOworCQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCQlpbm9kZS0+aV9naWQgPSBjcmFtZnNfaW5vZGUtPmdpZDsKKwkJLyogU3RydWN0IGNvcHkgaW50ZW50aW9uYWwgKi8KKwkJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gemVyb3RpbWU7CisJCWlub2RlLT5pX2lubyA9IENSQU1JTk8oY3JhbWZzX2lub2RlKTsKKwkJLyogaW5vZGUtPmlfbmxpbmsgaXMgbGVmdCAxIC0gYXJndWFibHkgd3JvbmcgZm9yIGRpcmVjdG9yaWVzLAorCQkgICBidXQgaXQncyB0aGUgYmVzdCB3ZSBjYW4gZG8gd2l0aG91dCByZWFkaW5nIHRoZSBkaXJlY3RvcnkKKwkgICAgICAgICAgIGNvbnRlbnRzLiAgMSB5aWVsZHMgdGhlIHJpZ2h0IHJlc3VsdCBpbiBHTlUgZmluZCwgZXZlbgorCQkgICB3aXRob3V0IC1ub2xlYWYgb3B0aW9uLiAqLworCQlpbnNlcnRfaW5vZGVfaGFzaChpbm9kZSk7CisJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCQlpbm9kZS0+aV9mb3AgPSAmZ2VuZXJpY19yb19mb3BzOworCQkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZjcmFtZnNfYW9wczsKKwkJfSBlbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCQlpbm9kZS0+aV9vcCA9ICZjcmFtZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9mb3AgPSAmY3JhbWZzX2RpcmVjdG9yeV9vcGVyYXRpb25zOworCQl9IGVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWlub2RlLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZjcmFtZnNfYW9wczsKKwkJfSBlbHNlIHsKKwkJCWlub2RlLT5pX3NpemUgPSAwOworCQkJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwKKwkJCQlvbGRfZGVjb2RlX2RldihjcmFtZnNfaW5vZGUtPnNpemUpKTsKKwkJfQorCX0KKwlyZXR1cm4gaW5vZGU7Cit9CisKKy8qCisgKiBXZSBoYXZlIG91ciBvd24gYmxvY2sgY2FjaGU6IGRvbid0IGZpbGwgdXAgdGhlIGJ1ZmZlciBjYWNoZQorICogd2l0aCB0aGUgcm9tLWltYWdlLCBiZWNhdXNlIHRoZSB3YXkgdGhlIGZpbGVzeXN0ZW0gaXMgc2V0CisgKiB1cCB0aGUgYWNjZXNzZXMgc2hvdWxkIGJlIGZhaXJseSByZWd1bGFyIGFuZCBjYWNoZWQgaW4gdGhlCisgKiBwYWdlIGNhY2hlIGFuZCBkZW50cnkgdHJlZSBhbnl3YXkuLgorICoKKyAqIFRoaXMgYWxzbyBhY3RzIGFzIGEgd2F5IHRvIGd1YXJhbnRlZSBjb250aWd1b3VzIGFyZWFzIG9mIHVwIHRvCisgKiBCTEtTX1BFUl9CVUYqUEFHRV9DQUNIRV9TSVpFLCBzbyB0aGF0IHRoZSBjYWxsZXIgZG9lc24ndCBuZWVkIHRvCisgKiB3b3JyeSBhYm91dCBlbmQtb2YtYnVmZmVyIGlzc3VlcyBldmVuIHdoZW4gZGVjb21wcmVzc2luZyBhIGZ1bGwKKyAqIHBhZ2UgY2FjaGUuCisgKi8KKyNkZWZpbmUgUkVBRF9CVUZGRVJTICgyKQorLyogTkVYVF9CVUZGRVIoKTogTG9vcCBvdmVyIFswLi4oUkVBRF9CVUZGRVJTLTEpXS4gKi8KKyNkZWZpbmUgTkVYVF9CVUZGRVIoX2l4KSAoKF9peCkgXiAxKQorCisvKgorICogQkxLU19QRVJfQlVGX1NISUZUIHNob3VsZCBiZSBhdCBsZWFzdCAyIHRvIGFsbG93IGZvciAiY29tcHJlc3NlZCIKKyAqIGRhdGEgdGhhdCB0YWtlcyB1cCBtb3JlIHNwYWNlIHRoYW4gdGhlIG9yaWdpbmFsIGFuZCB3aXRoIHVubHVja3kKKyAqIGFsaWdubWVudC4KKyAqLworI2RlZmluZSBCTEtTX1BFUl9CVUZfU0hJRlQJKDIpCisjZGVmaW5lIEJMS1NfUEVSX0JVRgkJKDEgPDwgQkxLU19QRVJfQlVGX1NISUZUKQorI2RlZmluZSBCVUZGRVJfU0laRQkJKEJMS1NfUEVSX0JVRipQQUdFX0NBQ0hFX1NJWkUpCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJlYWRfYnVmZmVyc1tSRUFEX0JVRkZFUlNdW0JVRkZFUl9TSVpFXTsKK3N0YXRpYyB1bnNpZ25lZCBidWZmZXJfYmxvY2tucltSRUFEX0JVRkZFUlNdOworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqIGJ1ZmZlcl9kZXZbUkVBRF9CVUZGRVJTXTsKK3N0YXRpYyBpbnQgbmV4dF9idWZmZXI7CisKKy8qCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIGF0IGxlYXN0IExFTiBieXRlcyBvZgorICogZmlsZXN5c3RlbSBzdGFydGluZyBhdCBieXRlIG9mZnNldCBPRkZTRVQgaW50byB0aGUgZmlsZXN5c3RlbS4KKyAqLworc3RhdGljIHZvaWQgKmNyYW1mc19yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBzYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlc1tCTEtTX1BFUl9CVUZdOworCXVuc2lnbmVkIGksIGJsb2NrbnIsIGJ1ZmZlciwgdW5yZWFkOworCXVuc2lnbmVkIGxvbmcgZGV2c2l6ZTsKKwljaGFyICpkYXRhOworCisJaWYgKCFsZW4pCisJCXJldHVybiBOVUxMOworCWJsb2NrbnIgPSBvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlvZmZzZXQgJj0gUEFHRV9DQUNIRV9TSVpFIC0gMTsKKworCS8qIENoZWNrIGlmIGFuIGV4aXN0aW5nIGJ1ZmZlciBhbHJlYWR5IGhhcyB0aGUgZGF0YS4uICovCisJZm9yIChpID0gMDsgaSA8IFJFQURfQlVGRkVSUzsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBibGtfb2Zmc2V0OworCisJCWlmIChidWZmZXJfZGV2W2ldICE9IHNiKQorCQkJY29udGludWU7CisJCWlmIChibG9ja25yIDwgYnVmZmVyX2Jsb2NrbnJbaV0pCisJCQljb250aW51ZTsKKwkJYmxrX29mZnNldCA9IChibG9ja25yIC0gYnVmZmVyX2Jsb2NrbnJbaV0pIDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCWJsa19vZmZzZXQgKz0gb2Zmc2V0OworCQlpZiAoYmxrX29mZnNldCArIGxlbiA+IEJVRkZFUl9TSVpFKQorCQkJY29udGludWU7CisJCXJldHVybiByZWFkX2J1ZmZlcnNbaV0gKyBibGtfb2Zmc2V0OworCX0KKworCWRldnNpemUgPSBtYXBwaW5nLT5ob3N0LT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCS8qIE9rLCByZWFkIGluIEJMS1NfUEVSX0JVRiBwYWdlcyBjb21wbGV0ZWx5IGZpcnN0LiAqLworCXVucmVhZCA9IDA7CisJZm9yIChpID0gMDsgaSA8IEJMS1NfUEVSX0JVRjsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKworCQlpZiAoYmxvY2tuciArIGkgPCBkZXZzaXplKSB7CisJCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIGJsb2NrbnIgKyBpLAorCQkJCShmaWxsZXJfdCAqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwKKwkJCQlOVUxMKTsKKwkJCS8qIHN5bmNocm9ub3VzIGVycm9yPyAqLworCQkJaWYgKElTX0VSUihwYWdlKSkKKwkJCQlwYWdlID0gTlVMTDsKKwkJfQorCQlwYWdlc1tpXSA9IHBhZ2U7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEJMS1NfUEVSX0JVRjsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gcGFnZXNbaV07CisJCWlmIChwYWdlKSB7CisJCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCQkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCQkvKiBhc3luY2hyb25vdXMgZXJyb3IgKi8KKwkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQkJcGFnZXNbaV0gPSBOVUxMOworCQkJfQorCQl9CisJfQorCisJYnVmZmVyID0gbmV4dF9idWZmZXI7CisJbmV4dF9idWZmZXIgPSBORVhUX0JVRkZFUihidWZmZXIpOworCWJ1ZmZlcl9ibG9ja25yW2J1ZmZlcl0gPSBibG9ja25yOworCWJ1ZmZlcl9kZXZbYnVmZmVyXSA9IHNiOworCisJZGF0YSA9IHJlYWRfYnVmZmVyc1tidWZmZXJdOworCWZvciAoaSA9IDA7IGkgPCBCTEtTX1BFUl9CVUY7IGkrKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBhZ2VzW2ldOworCQlpZiAocGFnZSkgeworCQkJbWVtY3B5KGRhdGEsIGttYXAocGFnZSksIFBBR0VfQ0FDSEVfU0laRSk7CisJCQlrdW5tYXAocGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCX0gZWxzZQorCQkJbWVtc2V0KGRhdGEsIDAsIFBBR0VfQ0FDSEVfU0laRSk7CisJCWRhdGEgKz0gUEFHRV9DQUNIRV9TSVpFOworCX0KKwlyZXR1cm4gcmVhZF9idWZmZXJzW2J1ZmZlcl0gKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGNyYW1mc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlrZnJlZShzYi0+c19mc19pbmZvKTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKK30KKworc3RhdGljIGludCBjcmFtZnNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCSpmbGFncyB8PSBNU19SRE9OTFk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JhbWZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgY3JhbWZzX3N1cGVyIHN1cGVyOworCXVuc2lnbmVkIGxvbmcgcm9vdF9vZmZzZXQ7CisJc3RydWN0IGNyYW1mc19zYl9pbmZvICpzYmk7CisJc3RydWN0IGlub2RlICpyb290OworCisJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCisJc2JpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNyYW1mc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmkpCisJCXJldHVybiAtRU5PTUVNOworCXNiLT5zX2ZzX2luZm8gPSBzYmk7CisJbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKHN0cnVjdCBjcmFtZnNfc2JfaW5mbykpOworCisJLyogSW52YWxpZGF0ZSB0aGUgcmVhZCBidWZmZXJzIG9uIG1vdW50OiB0aGluayBkaXNrIGNoYW5nZS4uICovCisJZG93bigmcmVhZF9tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IFJFQURfQlVGRkVSUzsgaSsrKQorCQlidWZmZXJfYmxvY2tucltpXSA9IC0xOworCisJLyogUmVhZCB0aGUgZmlyc3QgYmxvY2sgYW5kIGdldCB0aGUgc3VwZXJibG9jayBmcm9tIGl0ICovCisJbWVtY3B5KCZzdXBlciwgY3JhbWZzX3JlYWQoc2IsIDAsIHNpemVvZihzdXBlcikpLCBzaXplb2Yoc3VwZXIpKTsKKwl1cCgmcmVhZF9tdXRleCk7CisKKwkvKiBEbyBzYW5pdHkgY2hlY2tzIG9uIHRoZSBzdXBlcmJsb2NrICovCisJaWYgKHN1cGVyLm1hZ2ljICE9IENSQU1GU19NQUdJQykgeworCQkvKiBjaGVjayBhdCA1MTIgYnl0ZSBvZmZzZXQgKi8KKwkJZG93bigmcmVhZF9tdXRleCk7CisJCW1lbWNweSgmc3VwZXIsIGNyYW1mc19yZWFkKHNiLCA1MTIsIHNpemVvZihzdXBlcikpLCBzaXplb2Yoc3VwZXIpKTsKKwkJdXAoJnJlYWRfbXV0ZXgpOworCQlpZiAoc3VwZXIubWFnaWMgIT0gQ1JBTUZTX01BR0lDKSB7CisJCQlpZiAoIXNpbGVudCkKKwkJCQlwcmludGsoS0VSTl9FUlIgImNyYW1mczogd3JvbmcgbWFnaWNcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBnZXQgZmVhdHVyZSBmbGFncyBmaXJzdCAqLworCWlmIChzdXBlci5mbGFncyAmIH5DUkFNRlNfU1VQUE9SVEVEX0ZMQUdTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3JhbWZzOiB1bnN1cHBvcnRlZCBmaWxlc3lzdGVtIGZlYXR1cmVzXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQ2hlY2sgdGhhdCB0aGUgcm9vdCBpbm9kZSBpcyBpbiBhIHNhbmUgc3RhdGUgKi8KKwlpZiAoIVNfSVNESVIoc3VwZXIucm9vdC5tb2RlKSkgeworCQlwcmludGsoS0VSTl9FUlIgImNyYW1mczogcm9vdCBpcyBub3QgYSBkaXJlY3RvcnlcbiIpOworCQlnb3RvIG91dDsKKwl9CisJcm9vdF9vZmZzZXQgPSBzdXBlci5yb290Lm9mZnNldCA8PCAyOworCWlmIChzdXBlci5mbGFncyAmIENSQU1GU19GTEFHX0ZTSURfVkVSU0lPTl8yKSB7CisJCXNiaS0+c2l6ZT1zdXBlci5zaXplOworCQlzYmktPmJsb2Nrcz1zdXBlci5mc2lkLmJsb2NrczsKKwkJc2JpLT5maWxlcz1zdXBlci5mc2lkLmZpbGVzOworCX0gZWxzZSB7CisJCXNiaS0+c2l6ZT0xPDwyODsKKwkJc2JpLT5ibG9ja3M9MDsKKwkJc2JpLT5maWxlcz0wOworCX0KKwlzYmktPm1hZ2ljPXN1cGVyLm1hZ2ljOworCXNiaS0+ZmxhZ3M9c3VwZXIuZmxhZ3M7CisJaWYgKHJvb3Rfb2Zmc2V0ID09IDApCisJCXByaW50ayhLRVJOX0lORk8gImNyYW1mczogZW1wdHkgZmlsZXN5c3RlbSIpOworCWVsc2UgaWYgKCEoc3VwZXIuZmxhZ3MgJiBDUkFNRlNfRkxBR19TSElGVEVEX1JPT1RfT0ZGU0VUKSAmJgorCQkgKChyb290X29mZnNldCAhPSBzaXplb2Yoc3RydWN0IGNyYW1mc19zdXBlcikpICYmCisJCSAgKHJvb3Rfb2Zmc2V0ICE9IDUxMiArIHNpemVvZihzdHJ1Y3QgY3JhbWZzX3N1cGVyKSkpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJjcmFtZnM6IGJhZCByb290IG9mZnNldCAlbHVcbiIsIHJvb3Rfb2Zmc2V0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogU2V0IGl0IGFsbCB1cC4uICovCisJc2ItPnNfb3AgPSAmY3JhbWZzX29wczsKKwlyb290ID0gZ2V0X2NyYW1mc19pbm9kZShzYiwgJnN1cGVyLnJvb3QpOworCWlmICghcm9vdCkKKwkJZ290byBvdXQ7CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKKwlpZiAoIXNiLT5zX3Jvb3QpIHsKKwkJaXB1dChyb290KTsKKwkJZ290byBvdXQ7CisJfQorCXJldHVybiAwOworb3V0OgorCWtmcmVlKHNiaSk7CisJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgY3JhbWZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCWJ1Zi0+Zl90eXBlID0gQ1JBTUZTX01BR0lDOworCWJ1Zi0+Zl9ic2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwlidWYtPmZfYmxvY2tzID0gQ1JBTUZTX1NCKHNiKS0+YmxvY2tzOworCWJ1Zi0+Zl9iZnJlZSA9IDA7CisJYnVmLT5mX2JhdmFpbCA9IDA7CisJYnVmLT5mX2ZpbGVzID0gQ1JBTUZTX1NCKHNiKS0+ZmlsZXM7CisJYnVmLT5mX2ZmcmVlID0gMDsKKwlidWYtPmZfbmFtZWxlbiA9IENSQU1GU19NQVhQQVRITEVOOworCXJldHVybiAwOworfQorCisvKgorICogUmVhZCBhIGNyYW1mcyBkaXJlY3RvcnkgZW50cnkuCisgKi8KK3N0YXRpYyBpbnQgY3JhbWZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwljaGFyICpidWY7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwlpbnQgY29waWVkOworCisJLyogT2Zmc2V0IHdpdGhpbiB0aGUgdGhpbmcuICovCisJb2Zmc2V0ID0gZmlscC0+Zl9wb3M7CisJaWYgKG9mZnNldCA+PSBpbm9kZS0+aV9zaXplKQorCQlyZXR1cm4gMDsKKwkvKiBEaXJlY3RvcnkgZW50cmllcyBhcmUgYWx3YXlzIDQtYnl0ZSBhbGlnbmVkICovCisJaWYgKG9mZnNldCAmIDMpCisJCXJldHVybiAtRUlOVkFMOworCisJYnVmID0ga21hbGxvYygyNTYsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvcGllZCA9IDA7CisJd2hpbGUgKG9mZnNldCA8IGlub2RlLT5pX3NpemUpIHsKKwkJc3RydWN0IGNyYW1mc19pbm9kZSAqZGU7CisJCXVuc2lnbmVkIGxvbmcgbmV4dG9mZnNldDsKKwkJY2hhciAqbmFtZTsKKwkJaW5vX3QgaW5vOworCQltb2RlX3QgbW9kZTsKKwkJaW50IG5hbWVsZW4sIGVycm9yOworCisJCWRvd24oJnJlYWRfbXV0ZXgpOworCQlkZSA9IGNyYW1mc19yZWFkKHNiLCBPRkZTRVQoaW5vZGUpICsgb2Zmc2V0LCBzaXplb2YoKmRlKSsyNTYpOworCQluYW1lID0gKGNoYXIgKikoZGUrMSk7CisKKwkJLyoKKwkJICogTmFtZWxlbmd0aHMgb24gZGlzayBhcmUgc2hpZnRlZCBieSB0d28KKwkJICogYW5kIHRoZSBuYW1lIHBhZGRlZCBvdXQgdG8gNC1ieXRlIGJvdW5kYXJpZXMKKwkJICogd2l0aCB6ZXJvZXMuCisJCSAqLworCQluYW1lbGVuID0gZGUtPm5hbWVsZW4gPDwgMjsKKwkJbWVtY3B5KGJ1ZiwgbmFtZSwgbmFtZWxlbik7CisJCWlubyA9IENSQU1JTk8oZGUpOworCQltb2RlID0gZGUtPm1vZGU7CisJCXVwKCZyZWFkX211dGV4KTsKKwkJbmV4dG9mZnNldCA9IG9mZnNldCArIHNpemVvZigqZGUpICsgbmFtZWxlbjsKKwkJZm9yICg7OykgeworCQkJaWYgKCFuYW1lbGVuKSB7CisJCQkJa2ZyZWUoYnVmKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCWlmIChidWZbbmFtZWxlbi0xXSkKKwkJCQlicmVhazsKKwkJCW5hbWVsZW4tLTsKKwkJfQorCQllcnJvciA9IGZpbGxkaXIoZGlyZW50LCBidWYsIG5hbWVsZW4sIG9mZnNldCwgaW5vLCBtb2RlID4+IDEyKTsKKwkJaWYgKGVycm9yKQorCQkJYnJlYWs7CisKKwkJb2Zmc2V0ID0gbmV4dG9mZnNldDsKKwkJZmlscC0+Zl9wb3MgPSBvZmZzZXQ7CisJCWNvcGllZCsrOworCX0KKwlrZnJlZShidWYpOworCXJldHVybiAwOworfQorCisvKgorICogTG9va3VwIGFuZCBmaWxsIGluIHRoZSBpbm9kZSBkYXRhLi4KKyAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKiBjcmFtZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwOworCWludCBzb3J0ZWQ7CisKKwlkb3duKCZyZWFkX211dGV4KTsKKwlzb3J0ZWQgPSBDUkFNRlNfU0IoZGlyLT5pX3NiKS0+ZmxhZ3MgJiBDUkFNRlNfRkxBR19TT1JURURfRElSUzsKKwl3aGlsZSAob2Zmc2V0IDwgZGlyLT5pX3NpemUpIHsKKwkJc3RydWN0IGNyYW1mc19pbm9kZSAqZGU7CisJCWNoYXIgKm5hbWU7CisJCWludCBuYW1lbGVuLCByZXR2YWw7CisKKwkJZGUgPSBjcmFtZnNfcmVhZChkaXItPmlfc2IsIE9GRlNFVChkaXIpICsgb2Zmc2V0LCBzaXplb2YoKmRlKSsyNTYpOworCQluYW1lID0gKGNoYXIgKikoZGUrMSk7CisKKwkJLyogVHJ5IHRvIHRha2UgYWR2YW50YWdlIG9mIHNvcnRlZCBkaXJlY3RvcmllcyAqLworCQlpZiAoc29ydGVkICYmIChkZW50cnktPmRfbmFtZS5uYW1lWzBdIDwgbmFtZVswXSkpCisJCQlicmVhazsKKworCQluYW1lbGVuID0gZGUtPm5hbWVsZW4gPDwgMjsKKwkJb2Zmc2V0ICs9IHNpemVvZigqZGUpICsgbmFtZWxlbjsKKworCQkvKiBRdWljayBjaGVjayB0aGF0IHRoZSBuYW1lIGlzIHJvdWdobHkgdGhlIHJpZ2h0IGxlbmd0aCAqLworCQlpZiAoKChkZW50cnktPmRfbmFtZS5sZW4gKyAzKSAmIH4zKSAhPSBuYW1lbGVuKQorCQkJY29udGludWU7CisKKwkJZm9yICg7OykgeworCQkJaWYgKCFuYW1lbGVuKSB7CisJCQkJdXAoJnJlYWRfbXV0ZXgpOworCQkJCXJldHVybiBFUlJfUFRSKC1FSU8pOworCQkJfQorCQkJaWYgKG5hbWVbbmFtZWxlbi0xXSkKKwkJCQlicmVhazsKKwkJCW5hbWVsZW4tLTsKKwkJfQorCQlpZiAobmFtZWxlbiAhPSBkZW50cnktPmRfbmFtZS5sZW4pCisJCQljb250aW51ZTsKKwkJcmV0dmFsID0gbWVtY21wKGRlbnRyeS0+ZF9uYW1lLm5hbWUsIG5hbWUsIG5hbWVsZW4pOworCQlpZiAocmV0dmFsID4gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXJldHZhbCkgeworCQkJc3RydWN0IGNyYW1mc19pbm9kZSBlbnRyeSA9ICpkZTsKKwkJCXVwKCZyZWFkX211dGV4KTsKKwkJCWRfYWRkKGRlbnRyeSwgZ2V0X2NyYW1mc19pbm9kZShkaXItPmlfc2IsICZlbnRyeSkpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJLyogZWxzZSAocmV0dmFsIDwgMCkgKi8KKwkJaWYgKHNvcnRlZCkKKwkJCWJyZWFrOworCX0KKwl1cCgmcmVhZF9tdXRleCk7CisJZF9hZGQoZGVudHJ5LCBOVUxMKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBjcmFtZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICogcGFnZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwl1MzIgbWF4YmxvY2ssIGJ5dGVzX2ZpbGxlZDsKKwl2b2lkICpwZ2RhdGE7CisKKwltYXhibG9jayA9IChpbm9kZS0+aV9zaXplICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlieXRlc19maWxsZWQgPSAwOworCWlmIChwYWdlLT5pbmRleCA8IG1heGJsb2NrKSB7CisJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwkJdTMyIGJsa3B0cl9vZmZzZXQgPSBPRkZTRVQoaW5vZGUpICsgcGFnZS0+aW5kZXgqNDsKKwkJdTMyIHN0YXJ0X29mZnNldCwgY29tcHJfbGVuOworCisJCXN0YXJ0X29mZnNldCA9IE9GRlNFVChpbm9kZSkgKyBtYXhibG9jayo0OworCQlkb3duKCZyZWFkX211dGV4KTsKKwkJaWYgKHBhZ2UtPmluZGV4KQorCQkJc3RhcnRfb2Zmc2V0ID0gKih1MzIgKikgY3JhbWZzX3JlYWQoc2IsIGJsa3B0cl9vZmZzZXQtNCwgNCk7CisJCWNvbXByX2xlbiA9ICgqKHUzMiAqKSBjcmFtZnNfcmVhZChzYiwgYmxrcHRyX29mZnNldCwgNCkgLSBzdGFydF9vZmZzZXQpOworCQl1cCgmcmVhZF9tdXRleCk7CisJCXBnZGF0YSA9IGttYXAocGFnZSk7CisJCWlmIChjb21wcl9sZW4gPT0gMCkKKwkJCTsgLyogaG9sZSAqLworCQllbHNlIHsKKwkJCWRvd24oJnJlYWRfbXV0ZXgpOworCQkJYnl0ZXNfZmlsbGVkID0gY3JhbWZzX3VuY29tcHJlc3NfYmxvY2socGdkYXRhLAorCQkJCSBQQUdFX0NBQ0hFX1NJWkUsCisJCQkJIGNyYW1mc19yZWFkKHNiLCBzdGFydF9vZmZzZXQsIGNvbXByX2xlbiksCisJCQkJIGNvbXByX2xlbik7CisJCQl1cCgmcmVhZF9tdXRleCk7CisJCX0KKwl9IGVsc2UKKwkJcGdkYXRhID0ga21hcChwYWdlKTsKKwltZW1zZXQocGdkYXRhICsgYnl0ZXNfZmlsbGVkLCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBieXRlc19maWxsZWQpOworCWt1bm1hcChwYWdlKTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGNyYW1mc19hb3BzID0geworCS5yZWFkcGFnZSA9IGNyYW1mc19yZWFkcGFnZQorfTsKKworLyoKKyAqIE91ciBvcGVyYXRpb25zOgorICovCisKKy8qCisgKiBBIGRpcmVjdG9yeSBjYW4gb25seSByZWFkZGlyCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNyYW1mc19kaXJlY3Rvcnlfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IGNyYW1mc19yZWFkZGlyLAorfTsKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGNyYW1mc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IGNyYW1mc19sb29rdXAsCit9OworCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgY3JhbWZzX29wcyA9IHsKKwkucHV0X3N1cGVyCT0gY3JhbWZzX3B1dF9zdXBlciwKKwkucmVtb3VudF9mcwk9IGNyYW1mc19yZW1vdW50LAorCS5zdGF0ZnMJCT0gY3JhbWZzX3N0YXRmcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmNyYW1mc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBjcmFtZnNfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBjcmFtZnNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImNyYW1mcyIsCisJLmdldF9zYgkJPSBjcmFtZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2NyYW1mc19mcyh2b2lkKQoreworCWNyYW1mc191bmNvbXByZXNzX2luaXQoKTsKKwlyZXR1cm4gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmY3JhbWZzX2ZzX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9jcmFtZnNfZnModm9pZCkKK3sKKwljcmFtZnNfdW5jb21wcmVzc19leGl0KCk7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZjcmFtZnNfZnNfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfY3JhbWZzX2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9jcmFtZnNfZnMpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9jcmFtZnMvdW5jb21wcmVzcy5jIGIvZnMvY3JhbWZzL3VuY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDM0MzY1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY3JhbWZzL3VuY29tcHJlc3MuYwpAQCAtMCwwICsxLDc3IEBACisvKgorICogdW5jb21wcmVzcy5jCisgKgorICogKEMpIENvcHlyaWdodCAxOTk5IExpbnVzIFRvcnZhbGRzCisgKgorICogY3JhbWZzIGludGVyZmFjZXMgdG8gdGhlIHVuY29tcHJlc3Npb24gbGlicmFyeS4gVGhlcmUncyByZWFsbHkganVzdAorICogdGhyZWUgZW50cnlwb2ludHM6CisgKgorICogIC0gY3JhbWZzX3VuY29tcHJlc3NfaW5pdCgpIC0gY2FsbGVkIHRvIGluaXRpYWxpemUgdGhlIHRoaW5nLgorICogIC0gY3JhbWZzX3VuY29tcHJlc3NfZXhpdCgpIC0gdGVsbCBtZSB3aGVuIHlvdSdyZSBkb25lCisgKiAgLSBjcmFtZnNfdW5jb21wcmVzc19ibG9jaygpIC0gdW5jb21wcmVzcyBhIGJsb2NrLgorICoKKyAqIE5PVEUgTk9URSBOT1RFISBUaGUgdW5jb21wcmVzc2lvbiBpcyBlbnRpcmVseSBzaW5nbGUtdGhyZWFkZWQuIFdlCisgKiBvbmx5IGhhdmUgb25lIHN0cmVhbSwgYW5kIHdlJ2xsIGluaXRpYWxpemUgaXQgb25seSBvbmNlIGV2ZW4gaWYgaXQKKyAqIHRoZW4gaXMgdXNlZCBieSBtdWx0aXBsZSBmaWxlc3lzdGVtcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvemxpYi5oPgorCitzdGF0aWMgel9zdHJlYW0gc3RyZWFtOworc3RhdGljIGludCBpbml0aWFsaXplZDsKKworLyogUmV0dXJucyBsZW5ndGggb2YgZGVjb21wcmVzc2VkIGRhdGEuICovCitpbnQgY3JhbWZzX3VuY29tcHJlc3NfYmxvY2sodm9pZCAqZHN0LCBpbnQgZHN0bGVuLCB2b2lkICpzcmMsIGludCBzcmNsZW4pCit7CisJaW50IGVycjsKKworCXN0cmVhbS5uZXh0X2luID0gc3JjOworCXN0cmVhbS5hdmFpbF9pbiA9IHNyY2xlbjsKKworCXN0cmVhbS5uZXh0X291dCA9IGRzdDsKKwlzdHJlYW0uYXZhaWxfb3V0ID0gZHN0bGVuOworCisJZXJyID0gemxpYl9pbmZsYXRlUmVzZXQoJnN0cmVhbSk7CisJaWYgKGVyciAhPSBaX09LKSB7CisJCXByaW50aygiemxpYl9pbmZsYXRlUmVzZXQgZXJyb3IgJWRcbiIsIGVycik7CisJCXpsaWJfaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKwkJemxpYl9pbmZsYXRlSW5pdCgmc3RyZWFtKTsKKwl9CisKKwllcnIgPSB6bGliX2luZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworCWlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKQorCQlnb3RvIGVycjsKKwlyZXR1cm4gc3RyZWFtLnRvdGFsX291dDsKKworZXJyOgorCXByaW50aygiRXJyb3IgJWQgd2hpbGUgZGVjb21wcmVzc2luZyFcbiIsIGVycik7CisJcHJpbnRrKCIlcCglZCktPiVwKCVkKVxuIiwgc3JjLCBzcmNsZW4sIGRzdCwgZHN0bGVuKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNyYW1mc191bmNvbXByZXNzX2luaXQodm9pZCkKK3sKKwlpZiAoIWluaXRpYWxpemVkKyspIHsKKwkJc3RyZWFtLndvcmtzcGFjZSA9IHZtYWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSk7CisJCWlmICggIXN0cmVhbS53b3Jrc3BhY2UgKSB7CisJCQlpbml0aWFsaXplZCA9IDA7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlzdHJlYW0ubmV4dF9pbiA9IE5VTEw7CisJCXN0cmVhbS5hdmFpbF9pbiA9IDA7CisJCXpsaWJfaW5mbGF0ZUluaXQoJnN0cmVhbSk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgY3JhbWZzX3VuY29tcHJlc3NfZXhpdCh2b2lkKQoreworCWlmICghLS1pbml0aWFsaXplZCkgeworCQl6bGliX2luZmxhdGVFbmQoJnN0cmVhbSk7CisJCXZmcmVlKHN0cmVhbS53b3Jrc3BhY2UpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2RjYWNoZS5jIGIvZnMvZGNhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk2YTRlMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2RjYWNoZS5jCkBAIC0wLDAgKzEsMTc2NCBAQAorLyoKKyAqIGZzL2RjYWNoZS5jCisgKgorICogQ29tcGxldGUgcmVpbXBsZW1lbnRhdGlvbgorICogKEMpIDE5OTcgVGhvbWFzIFNjaG9lYmVsLVRoZXVlciwKKyAqIHdpdGggaGVhdnkgY2hhbmdlcyBieSBMaW51cyBUb3J2YWxkcworICovCisKKy8qCisgKiBOb3RlcyBvbiB0aGUgYWxsb2NhdGlvbiBzdHJhdGVneToKKyAqCisgKiBUaGUgZGNhY2hlIGlzIGEgbWFzdGVyIG9mIHRoZSBpY2FjaGUgLSB3aGVuZXZlciBhIGRjYWNoZSBlbnRyeQorICogZXhpc3RzLCB0aGUgaW5vZGUgd2lsbCBhbHdheXMgZXhpc3QuICJpcHV0KCkiIGlzIGRvbmUgZWl0aGVyIHdoZW4KKyAqIHRoZSBkY2FjaGUgZW50cnkgaXMgZGVsZXRlZCBvciBnYXJiYWdlIGNvbGxlY3RlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKworLyogI2RlZmluZSBEQ0FDSEVfREVCVUcgMSAqLworCitpbnQgc3lzY3RsX3Zmc19jYWNoZV9wcmVzc3VyZSA9IDEwMDsKK0VYUE9SVF9TWU1CT0xfR1BMKHN5c2N0bF92ZnNfY2FjaGVfcHJlc3N1cmUpOworCisgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NQSU5MT0NLKGRjYWNoZV9sb2NrKTsKK3NlcWxvY2tfdCByZW5hbWVfbG9jayBfX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcCA9IFNFUUxPQ0tfVU5MT0NLRUQ7CisKK0VYUE9SVF9TWU1CT0woZGNhY2hlX2xvY2spOworCitzdGF0aWMga21lbV9jYWNoZV90ICpkZW50cnlfY2FjaGU7IAorCisjZGVmaW5lIEROQU1FX0lOTElORV9MRU4gKHNpemVvZihzdHJ1Y3QgZGVudHJ5KS1vZmZzZXRvZihzdHJ1Y3QgZGVudHJ5LGRfaW5hbWUpKQorCisvKgorICogVGhpcyBpcyB0aGUgc2luZ2xlIG1vc3QgY3JpdGljYWwgZGF0YSBzdHJ1Y3R1cmUgd2hlbiBpdCBjb21lcworICogdG8gdGhlIGRjYWNoZTogdGhlIGhhc2h0YWJsZSBmb3IgbG9va3Vwcy4gU29tZWJvZHkgc2hvdWxkIHRyeQorICogdG8gbWFrZSB0aGlzIGdvb2QgLSBJJ3ZlIGp1c3QgbWFkZSBpdCB3b3JrLgorICoKKyAqIFRoaXMgaGFzaC1mdW5jdGlvbiB0cmllcyB0byBhdm9pZCBsb3NpbmcgdG9vIG1hbnkgYml0cyBvZiBoYXNoCisgKiBpbmZvcm1hdGlvbiwgeWV0IGF2b2lkIHVzaW5nIGEgcHJpbWUgaGFzaC1zaXplIG9yIHNpbWlsYXIuCisgKi8KKyNkZWZpbmUgRF9IQVNIQklUUyAgICAgZF9oYXNoX3NoaWZ0CisjZGVmaW5lIERfSEFTSE1BU0sgICAgIGRfaGFzaF9tYXNrCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZF9oYXNoX21hc2s7CitzdGF0aWMgdW5zaWduZWQgaW50IGRfaGFzaF9zaGlmdDsKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCAqZGVudHJ5X2hhc2h0YWJsZTsKK3N0YXRpYyBMSVNUX0hFQUQoZGVudHJ5X3VudXNlZCk7CisKKy8qIFN0YXRpc3RpY3MgZ2F0aGVyaW5nLiAqLworc3RydWN0IGRlbnRyeV9zdGF0X3QgZGVudHJ5X3N0YXQgPSB7CisJLmFnZV9saW1pdCA9IDQ1LAorfTsKKworc3RhdGljIHZvaWQgZF9jYWxsYmFjayhzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgZGVudHJ5LCBkX3JjdSk7CisKKwlpZiAoZG5hbWVfZXh0ZXJuYWwoZGVudHJ5KSkKKwkJa2ZyZWUoZGVudHJ5LT5kX25hbWUubmFtZSk7CisJa21lbV9jYWNoZV9mcmVlKGRlbnRyeV9jYWNoZSwgZGVudHJ5KTsgCit9CisKKy8qCisgKiBubyBkY2FjaGVfbG9jaywgcGxlYXNlLiAgVGhlIGNhbGxlciBtdXN0IGRlY3JlbWVudCBkZW50cnlfc3RhdC5ucl9kZW50cnkKKyAqIGluc2lkZSBkY2FjaGVfbG9jay4KKyAqLworc3RhdGljIHZvaWQgZF9mcmVlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpZiAoZGVudHJ5LT5kX29wICYmIGRlbnRyeS0+ZF9vcC0+ZF9yZWxlYXNlKQorCQlkZW50cnktPmRfb3AtPmRfcmVsZWFzZShkZW50cnkpOworIAljYWxsX3JjdSgmZGVudHJ5LT5kX3JjdSwgZF9jYWxsYmFjayk7Cit9CisKKy8qCisgKiBSZWxlYXNlIHRoZSBkZW50cnkncyBpbm9kZSwgdXNpbmcgdGhlIGZpbGVzeXN0ZW0KKyAqIGRfaXB1dCgpIG9wZXJhdGlvbiBpZiBkZWZpbmVkLgorICogQ2FsbGVkIHdpdGggZGNhY2hlX2xvY2sgYW5kIHBlciBkZW50cnkgbG9jayBoZWxkLCBkcm9wcyBib3RoLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVudHJ5X2lwdXQoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWlmIChpbm9kZSkgeworCQlkZW50cnktPmRfaW5vZGUgPSBOVUxMOworCQlsaXN0X2RlbF9pbml0KCZkZW50cnktPmRfYWxpYXMpOworCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQlpZiAoZGVudHJ5LT5kX29wICYmIGRlbnRyeS0+ZF9vcC0+ZF9pcHV0KQorCQkJZGVudHJ5LT5kX29wLT5kX2lwdXQoZGVudHJ5LCBpbm9kZSk7CisJCWVsc2UKKwkJCWlwdXQoaW5vZGUpOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJfQorfQorCisvKiAKKyAqIFRoaXMgaXMgZHB1dAorICoKKyAqIFRoaXMgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCB3ZSBkbyBub3Qgd2FudCB0byBwdXQKKyAqIGRlbnRyaWVzIHRoYXQgYXJlIG5vIGxvbmdlciBvbiBhbnkgaGFzaCBjaGFpbiBvbiB0aGUgdW51c2VkCisgKiBsaXN0OiB3ZSdkIG11Y2ggcmF0aGVyIGp1c3QgZ2V0IHJpZCBvZiB0aGVtIGltbWVkaWF0ZWx5LgorICoKKyAqIEhvd2V2ZXIsIHRoYXQgaW1wbGllcyB0aGF0IHdlIGhhdmUgdG8gdHJhdmVyc2UgdGhlIGRlbnRyeQorICogdHJlZSB1cHdhcmRzIHRvIHRoZSBwYXJlbnRzIHdoaWNoIG1pZ2h0IF9hbHNvXyBub3cgYmUKKyAqIHNjaGVkdWxlZCBmb3IgZGVsZXRpb24gKGl0IG1heSBoYXZlIGJlZW4gb25seSB3YWl0aW5nIGZvcgorICogaXRzIGxhc3QgY2hpbGQgdG8gZ28gYXdheSkuCisgKgorICogVGhpcyB0YWlsIHJlY3Vyc2lvbiBpcyBkb25lIGJ5IGhhbmQgYXMgd2UgZG9uJ3Qgd2FudCB0byBkZXBlbmQKKyAqIG9uIHRoZSBjb21waWxlciB0byBhbHdheXMgZ2V0IHRoaXMgcmlnaHQgKGdjYyBnZW5lcmFsbHkgZG9lc24ndCkuCisgKiBSZWFsIHJlY3Vyc2lvbiB3b3VsZCBlYXQgdXAgb3VyIHN0YWNrIHNwYWNlLgorICovCisKKy8qCisgKiBkcHV0IC0gcmVsZWFzZSBhIGRlbnRyeQorICogQGRlbnRyeTogZGVudHJ5IHRvIHJlbGVhc2UgCisgKgorICogUmVsZWFzZSBhIGRlbnRyeS4gVGhpcyB3aWxsIGRyb3AgdGhlIHVzYWdlIGNvdW50IGFuZCBpZiBhcHByb3ByaWF0ZQorICogY2FsbCB0aGUgZGVudHJ5IHVubGluayBtZXRob2QgYXMgd2VsbCBhcyByZW1vdmluZyBpdCBmcm9tIHRoZSBxdWV1ZXMgYW5kCisgKiByZWxlYXNpbmcgaXRzIHJlc291cmNlcy4gSWYgdGhlIHBhcmVudCBkZW50cmllcyB3ZXJlIHNjaGVkdWxlZCBmb3IgcmVsZWFzZQorICogdGhleSB0b28gbWF5IG5vdyBnZXQgZGVsZXRlZC4KKyAqCisgKiBubyBkY2FjaGUgbG9jaywgcGxlYXNlLgorICovCisKK3ZvaWQgZHB1dChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaWYgKCFkZW50cnkpCisJCXJldHVybjsKKworcmVwZWF0OgorCWlmIChhdG9taWNfcmVhZCgmZGVudHJ5LT5kX2NvdW50KSA9PSAxKQorCQltaWdodF9zbGVlcCgpOworCWlmICghYXRvbWljX2RlY19hbmRfbG9jaygmZGVudHJ5LT5kX2NvdW50LCAmZGNhY2hlX2xvY2spKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlpZiAoYXRvbWljX3JlYWQoJmRlbnRyeS0+ZF9jb3VudCkpIHsKKwkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogQVY6IC0+ZF9kZWxldGUoKSBpcyBfTk9UXyBhbGxvd2VkIHRvIGJsb2NrIG5vdy4KKwkgKi8KKwlpZiAoZGVudHJ5LT5kX29wICYmIGRlbnRyeS0+ZF9vcC0+ZF9kZWxldGUpIHsKKwkJaWYgKGRlbnRyeS0+ZF9vcC0+ZF9kZWxldGUoZGVudHJ5KSkKKwkJCWdvdG8gdW5oYXNoX2l0OworCX0KKwkvKiBVbnJlYWNoYWJsZT8gR2V0IHJpZCBvZiBpdCAqLworIAlpZiAoZF91bmhhc2hlZChkZW50cnkpKQorCQlnb3RvIGtpbGxfaXQ7CisgIAlpZiAobGlzdF9lbXB0eSgmZGVudHJ5LT5kX2xydSkpIHsKKyAgCQlkZW50cnktPmRfZmxhZ3MgfD0gRENBQ0hFX1JFRkVSRU5DRUQ7CisgIAkJbGlzdF9hZGQoJmRlbnRyeS0+ZF9scnUsICZkZW50cnlfdW51c2VkKTsKKyAgCQlkZW50cnlfc3RhdC5ucl91bnVzZWQrKzsKKyAgCX0KKyAJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCXJldHVybjsKKwordW5oYXNoX2l0OgorCV9fZF9kcm9wKGRlbnRyeSk7CisKK2tpbGxfaXQ6IHsKKwkJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCisJCS8qIElmIGRlbnRyeSB3YXMgb24gZF9scnUgbGlzdAorCQkgKiBkZWxldGUgaXQgZnJvbSB0aGVyZQorCQkgKi8KKyAgCQlpZiAoIWxpc3RfZW1wdHkoJmRlbnRyeS0+ZF9scnUpKSB7CisgIAkJCWxpc3RfZGVsKCZkZW50cnktPmRfbHJ1KTsKKyAgCQkJZGVudHJ5X3N0YXQubnJfdW51c2VkLS07CisgIAkJfQorICAJCWxpc3RfZGVsKCZkZW50cnktPmRfY2hpbGQpOworCQlkZW50cnlfc3RhdC5ucl9kZW50cnktLTsJLyogRm9yIGRfZnJlZSwgYmVsb3cgKi8KKwkJLypkcm9wcyB0aGUgbG9ja3MsIGF0IHRoYXQgcG9pbnQgbm9ib2R5IGNhbiByZWFjaCB0aGlzIGRlbnRyeSAqLworCQlkZW50cnlfaXB1dChkZW50cnkpOworCQlwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OworCQlkX2ZyZWUoZGVudHJ5KTsKKwkJaWYgKGRlbnRyeSA9PSBwYXJlbnQpCisJCQlyZXR1cm47CisJCWRlbnRyeSA9IHBhcmVudDsKKwkJZ290byByZXBlYXQ7CisJfQorfQorCisvKioKKyAqIGRfaW52YWxpZGF0ZSAtIGludmFsaWRhdGUgYSBkZW50cnkKKyAqIEBkZW50cnk6IGRlbnRyeSB0byBpbnZhbGlkYXRlCisgKgorICogVHJ5IHRvIGludmFsaWRhdGUgdGhlIGRlbnRyeSBpZiBpdCB0dXJucyBvdXQgdG8gYmUKKyAqIHBvc3NpYmxlLiBJZiB0aGVyZSBhcmUgb3RoZXIgZGVudHJpZXMgdGhhdCBjYW4gYmUKKyAqIHJlYWNoZWQgdGhyb3VnaCB0aGlzIG9uZSB3ZSBjYW4ndCBkZWxldGUgaXQgYW5kIHdlCisgKiByZXR1cm4gLUVCVVNZLiBPbiBzdWNjZXNzIHdlIHJldHVybiAwLgorICoKKyAqIG5vIGRjYWNoZSBsb2NrLgorICovCisgCitpbnQgZF9pbnZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCit7CisJLyoKKwkgKiBJZiBpdCdzIGFscmVhZHkgYmVlbiBkcm9wcGVkLCByZXR1cm4gT0suCisJICovCisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJaWYgKGRfdW5oYXNoZWQoZGVudHJ5KSkgeworCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBDaGVjayB3aGV0aGVyIHRvIGRvIGEgcGFydGlhbCBzaHJpbmtfZGNhY2hlCisJICogdG8gZ2V0IHJpZCBvZiB1bnVzZWQgY2hpbGQgZW50cmllcy4KKwkgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmRlbnRyeS0+ZF9zdWJkaXJzKSkgeworCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQlzaHJpbmtfZGNhY2hlX3BhcmVudChkZW50cnkpOworCQlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwl9CisKKwkvKgorCSAqIFNvbWVib2R5IGVsc2Ugc3RpbGwgdXNpbmcgaXQ/CisJICoKKwkgKiBJZiBpdCdzIGEgZGlyZWN0b3J5LCB3ZSBjYW4ndCBkcm9wIGl0CisJICogZm9yIGZlYXIgb2Ygc29tZWJvZHkgcmUtcG9wdWxhdGluZyBpdAorCSAqIHdpdGggY2hpbGRyZW4gKGV2ZW4gdGhvdWdoIGRyb3BwaW5nIGl0CisJICogd291bGQgbWFrZSBpdCB1bnJlYWNoYWJsZSBmcm9tIHRoZSByb290LAorCSAqIHdlIG1pZ2h0IHN0aWxsIHBvcHVsYXRlIGl0IGlmIGl0IHdhcyBhCisJICogd29ya2luZyBkaXJlY3Rvcnkgb3Igc2ltaWxhcikuCisJICovCisJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJaWYgKGF0b21pY19yZWFkKCZkZW50cnktPmRfY291bnQpID4gMSkgeworCQlpZiAoZGVudHJ5LT5kX2lub2RlICYmIFNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKSB7CisJCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwlfX2RfZHJvcChkZW50cnkpOworCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBzaG91bGQgYmUgY2FsbGVkIF9vbmx5XyB3aXRoIGRjYWNoZV9sb2NrIGhlbGQgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGVudHJ5ICogX19kZ2V0X2xvY2tlZChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJYXRvbWljX2luYygmZGVudHJ5LT5kX2NvdW50KTsKKwlpZiAoIWxpc3RfZW1wdHkoJmRlbnRyeS0+ZF9scnUpKSB7CisJCWRlbnRyeV9zdGF0Lm5yX3VudXNlZC0tOworCQlsaXN0X2RlbF9pbml0KCZkZW50cnktPmRfbHJ1KTsKKwl9CisJcmV0dXJuIGRlbnRyeTsKK30KKworc3RydWN0IGRlbnRyeSAqIGRnZXRfbG9ja2VkKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlyZXR1cm4gX19kZ2V0X2xvY2tlZChkZW50cnkpOworfQorCisvKioKKyAqIGRfZmluZF9hbGlhcyAtIGdyYWIgYSBoYXNoZWQgYWxpYXMgb2YgaW5vZGUKKyAqIEBpbm9kZTogaW5vZGUgaW4gcXVlc3Rpb24KKyAqIEB3YW50X2Rpc2NvbjogIGZsYWcsIHVzZWQgYnkgZF9zcGxpY2VfYWxpYXMsIHRvIHJlcXVlc3QKKyAqICAgICAgICAgIHRoYXQgb25seSBhIERJU0NPTk5FQ1RFRCBhbGlhcyBiZSByZXR1cm5lZC4KKyAqCisgKiBJZiBpbm9kZSBoYXMgYSBoYXNoZWQgYWxpYXMsIG9yIGlzIGEgZGlyZWN0b3J5IGFuZCBoYXMgYW55IGFsaWFzLAorICogYWNxdWlyZSB0aGUgcmVmZXJlbmNlIHRvIGFsaWFzIGFuZCByZXR1cm4gaXQuIE90aGVyd2lzZSByZXR1cm4gTlVMTC4KKyAqIE5vdGljZSB0aGF0IGlmIGlub2RlIGlzIGEgZGlyZWN0b3J5IHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBhbGlhcyBhbmQKKyAqIGl0IGNhbiBiZSB1bmhhc2hlZCBvbmx5IGlmIGl0IGhhcyBubyBjaGlsZHJlbiwgb3IgaWYgaXQgaXMgdGhlIHJvb3QKKyAqIG9mIGEgZmlsZXN5c3RlbS4KKyAqCisgKiBJZiB0aGUgaW5vZGUgaGFzIGEgRENBQ0hFX0RJU0NPTk5FQ1RFRCBhbGlhcywgdGhlbiBwcmVmZXIKKyAqIGFueSBvdGhlciBoYXNoZWQgYWxpYXMgb3ZlciB0aGF0IG9uZSB1bmxlc3MgQHdhbnRfZGlzY29uIGlzIHNldCwKKyAqIGluIHdoaWNoIGNhc2Ugb25seSByZXR1cm4gYSBEQ0FDSEVfRElTQ09OTkVDVEVEIGFsaWFzLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICogX19kX2ZpbmRfYWxpYXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHdhbnRfZGlzY29uKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsICpuZXh0LCAqdG1wOworCXN0cnVjdCBkZW50cnkgKmFsaWFzLCAqZGlzY29uX2FsaWFzPU5VTEw7CisKKwloZWFkID0gJmlub2RlLT5pX2RlbnRyeTsKKwluZXh0ID0gaW5vZGUtPmlfZGVudHJ5Lm5leHQ7CisJd2hpbGUgKG5leHQgIT0gaGVhZCkgeworCQl0bXAgPSBuZXh0OworCQluZXh0ID0gdG1wLT5uZXh0OworCQlwcmVmZXRjaChuZXh0KTsKKwkJYWxpYXMgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGRlbnRyeSwgZF9hbGlhcyk7CisgCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCAhZF91bmhhc2hlZChhbGlhcykpIHsKKwkJCWlmIChhbGlhcy0+ZF9mbGFncyAmIERDQUNIRV9ESVNDT05ORUNURUQpCisJCQkJZGlzY29uX2FsaWFzID0gYWxpYXM7CisJCQllbHNlIGlmICghd2FudF9kaXNjb24pIHsKKwkJCQlfX2RnZXRfbG9ja2VkKGFsaWFzKTsKKwkJCQlyZXR1cm4gYWxpYXM7CisJCQl9CisJCX0KKwl9CisJaWYgKGRpc2Nvbl9hbGlhcykKKwkJX19kZ2V0X2xvY2tlZChkaXNjb25fYWxpYXMpOworCXJldHVybiBkaXNjb25fYWxpYXM7Cit9CisKK3N0cnVjdCBkZW50cnkgKiBkX2ZpbmRfYWxpYXMoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZTsKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwlkZSA9IF9fZF9maW5kX2FsaWFzKGlub2RlLCAwKTsKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCXJldHVybiBkZTsKK30KKworLyoKKyAqCVRyeSB0byBraWxsIGRlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlub2RlLgorICogV0FSTklORzogeW91IG11c3Qgb3duIGEgcmVmZXJlbmNlIHRvIGlub2RlLgorICovCit2b2lkIGRfcHJ1bmVfYWxpYXNlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKmhlYWQgPSAmaW5vZGUtPmlfZGVudHJ5OworcmVzdGFydDoKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwl0bXAgPSBoZWFkOworCXdoaWxlICgodG1wID0gdG1wLT5uZXh0KSAhPSBoZWFkKSB7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgZGVudHJ5LCBkX2FsaWFzKTsKKwkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCWlmICghYXRvbWljX3JlYWQoJmRlbnRyeS0+ZF9jb3VudCkpIHsKKwkJCV9fZGdldF9sb2NrZWQoZGVudHJ5KTsKKwkJCV9fZF9kcm9wKGRlbnRyeSk7CisJCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJCWRwdXQoZGVudHJ5KTsKKwkJCWdvdG8gcmVzdGFydDsKKwkJfQorCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworfQorCisvKgorICogVGhyb3cgYXdheSBhIGRlbnRyeSAtIGZyZWUgdGhlIGlub2RlLCBkcHV0IHRoZSBwYXJlbnQuCisgKiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIExSVSBsaXN0IGhhcyBhbHJlYWR5IGJlZW4KKyAqIHJlbW92ZWQuCisgKiBDYWxsZWQgd2l0aCBkY2FjaGVfbG9jaywgZHJvcHMgaXQgYW5kIHRoZW4gcmVnYWlucy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHBydW5lX29uZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICogcGFyZW50OworCisJX19kX2Ryb3AoZGVudHJ5KTsKKwlsaXN0X2RlbCgmZGVudHJ5LT5kX2NoaWxkKTsKKwlkZW50cnlfc3RhdC5ucl9kZW50cnktLTsJLyogRm9yIGRfZnJlZSwgYmVsb3cgKi8KKwlkZW50cnlfaXB1dChkZW50cnkpOworCXBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7CisJZF9mcmVlKGRlbnRyeSk7CisJaWYgKHBhcmVudCAhPSBkZW50cnkpCisJCWRwdXQocGFyZW50KTsKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKK30KKworLyoqCisgKiBwcnVuZV9kY2FjaGUgLSBzaHJpbmsgdGhlIGRjYWNoZQorICogQGNvdW50OiBudW1iZXIgb2YgZW50cmllcyB0byB0cnkgYW5kIGZyZWUKKyAqCisgKiBTaHJpbmsgdGhlIGRjYWNoZS4gVGhpcyBpcyBkb25lIHdoZW4gd2UgbmVlZAorICogbW9yZSBtZW1vcnksIG9yIHNpbXBseSB3aGVuIHdlIG5lZWQgdG8gdW5tb3VudAorICogc29tZXRoaW5nIChhdCB3aGljaCBwb2ludCB3ZSBuZWVkIHRvIHVudXNlCisgKiBhbGwgZGVudHJpZXMpLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbWF5IGZhaWwgdG8gZnJlZSBhbnkgcmVzb3VyY2VzIGlmCisgKiBhbGwgdGhlIGRlbnRyaWVzIGFyZSBpbiB1c2UuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHBydW5lX2RjYWNoZShpbnQgY291bnQpCit7CisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJZm9yICg7IGNvdW50IDsgY291bnQtLSkgeworCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKworCQljb25kX3Jlc2NoZWRfbG9jaygmZGNhY2hlX2xvY2spOworCisJCXRtcCA9IGRlbnRyeV91bnVzZWQucHJldjsKKwkJaWYgKHRtcCA9PSAmZGVudHJ5X3VudXNlZCkKKwkJCWJyZWFrOworCQlsaXN0X2RlbF9pbml0KHRtcCk7CisJCXByZWZldGNoKGRlbnRyeV91bnVzZWQucHJldik7CisgCQlkZW50cnlfc3RhdC5ucl91bnVzZWQtLTsKKwkJZGVudHJ5ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBkZW50cnksIGRfbHJ1KTsKKworIAkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCS8qCisJCSAqIFdlIGZvdW5kIGFuIGludXNlIGRlbnRyeSB3aGljaCB3YXMgbm90IHJlbW92ZWQgZnJvbQorCQkgKiBkZW50cnlfdW51c2VkIGJlY2F1c2Ugb2YgbGF6aW5lc3MgZHVyaW5nIGxvb2t1cC4gIERvIG5vdCBmcmVlCisJCSAqIGl0IC0ganVzdCBrZWVwIGl0IG9mZiB0aGUgZGVudHJ5X3VudXNlZCBsaXN0LgorCQkgKi8KKyAJCWlmIChhdG9taWNfcmVhZCgmZGVudHJ5LT5kX2NvdW50KSkgeworIAkJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBJZiB0aGUgZGVudHJ5IHdhcyByZWNlbnRseSByZWZlcmVuY2VkLCBkb24ndCBmcmVlIGl0LiAqLworCQlpZiAoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX1JFRkVSRU5DRUQpIHsKKwkJCWRlbnRyeS0+ZF9mbGFncyAmPSB+RENBQ0hFX1JFRkVSRU5DRUQ7CisgCQkJbGlzdF9hZGQoJmRlbnRyeS0+ZF9scnUsICZkZW50cnlfdW51c2VkKTsKKyAJCQlkZW50cnlfc3RhdC5ucl91bnVzZWQrKzsKKyAJCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQkJY29udGludWU7CisJCX0KKwkJcHJ1bmVfb25lX2RlbnRyeShkZW50cnkpOworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworfQorCisvKgorICogU2hyaW5rIHRoZSBkY2FjaGUgZm9yIHRoZSBzcGVjaWZpZWQgc3VwZXIgYmxvY2suCisgKiBUaGlzIGFsbG93cyB1cyB0byB1bm1vdW50IGEgZGV2aWNlIHdpdGhvdXQgZGlzdHVyYmluZworICogdGhlIGRjYWNoZSBmb3IgdGhlIG90aGVyIGRldmljZXMuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBtYWtlcyBqdXN0IHR3byB0cmF2ZXJzYWxzIG9mIHRoZQorICogdW51c2VkIGxpc3QuICBPbiB0aGUgZmlyc3QgcGFzcyB3ZSBtb3ZlIHRoZSBzZWxlY3RlZAorICogZGVudHJpZXMgdG8gdGhlIG1vc3QgcmVjZW50IGVuZCwgYW5kIG9uIHRoZSBzZWNvbmQKKyAqIHBhc3Mgd2UgZnJlZSB0aGVtLiAgVGhlIHNlY29uZCBwYXNzIG11c3QgcmVzdGFydCBhZnRlcgorICogZWFjaCBkcHV0KCksIGJ1dCBzaW5jZSB0aGUgdGFyZ2V0IGRlbnRyaWVzIGFyZSBhbGwgYXQKKyAqIHRoZSBlbmQsIGl0J3MgcmVhbGx5IGp1c3QgYSBzaW5nbGUgdHJhdmVyc2FsLgorICovCisKKy8qKgorICogc2hyaW5rX2RjYWNoZV9zYiAtIHNocmluayBkY2FjaGUgZm9yIGEgc3VwZXJibG9jaworICogQHNiOiBzdXBlcmJsb2NrCisgKgorICogU2hyaW5rIHRoZSBkY2FjaGUgZm9yIHRoZSBzcGVjaWZpZWQgc3VwZXIgYmxvY2suIFRoaXMKKyAqIGlzIHVzZWQgdG8gZnJlZSB0aGUgZGNhY2hlIGJlZm9yZSB1bm1vdW50aW5nIGEgZmlsZQorICogc3lzdGVtCisgKi8KKwordm9pZCBzaHJpbmtfZGNhY2hlX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKm5leHQ7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCisJLyoKKwkgKiBQYXNzIG9uZSAuLi4gbW92ZSB0aGUgZGVudHJpZXMgZm9yIHRoZSBzcGVjaWZpZWQKKwkgKiBzdXBlcmJsb2NrIHRvIHRoZSBtb3N0IHJlY2VudCBlbmQgb2YgdGhlIHVudXNlZCBsaXN0LgorCSAqLworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCW5leHQgPSBkZW50cnlfdW51c2VkLm5leHQ7CisJd2hpbGUgKG5leHQgIT0gJmRlbnRyeV91bnVzZWQpIHsKKwkJdG1wID0gbmV4dDsKKwkJbmV4dCA9IHRtcC0+bmV4dDsKKwkJZGVudHJ5ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBkZW50cnksIGRfbHJ1KTsKKwkJaWYgKGRlbnRyeS0+ZF9zYiAhPSBzYikKKwkJCWNvbnRpbnVlOworCQlsaXN0X2RlbCh0bXApOworCQlsaXN0X2FkZCh0bXAsICZkZW50cnlfdW51c2VkKTsKKwl9CisKKwkvKgorCSAqIFBhc3MgdHdvIC4uLiBmcmVlIHRoZSBkZW50cmllcyBmb3IgdGhpcyBzdXBlcmJsb2NrLgorCSAqLworcmVwZWF0OgorCW5leHQgPSBkZW50cnlfdW51c2VkLm5leHQ7CisJd2hpbGUgKG5leHQgIT0gJmRlbnRyeV91bnVzZWQpIHsKKwkJdG1wID0gbmV4dDsKKwkJbmV4dCA9IHRtcC0+bmV4dDsKKwkJZGVudHJ5ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBkZW50cnksIGRfbHJ1KTsKKwkJaWYgKGRlbnRyeS0+ZF9zYiAhPSBzYikKKwkJCWNvbnRpbnVlOworCQlkZW50cnlfc3RhdC5ucl91bnVzZWQtLTsKKwkJbGlzdF9kZWxfaW5pdCh0bXApOworCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJaWYgKGF0b21pY19yZWFkKCZkZW50cnktPmRfY291bnQpKSB7CisJCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQkJY29udGludWU7CisJCX0KKwkJcHJ1bmVfb25lX2RlbnRyeShkZW50cnkpOworCQlnb3RvIHJlcGVhdDsKKwl9CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKK30KKworLyoKKyAqIFNlYXJjaCBmb3IgYXQgbGVhc3QgMSBtb3VudCBwb2ludCBpbiB0aGUgZGVudHJ5J3Mgc3ViZGlycy4KKyAqIFdlIGRlc2NlbmQgdG8gdGhlIG5leHQgbGV2ZWwgd2hlbmV2ZXIgdGhlIGRfc3ViZGlycworICogbGlzdCBpcyBub24tZW1wdHkgYW5kIGNvbnRpbnVlIHNlYXJjaGluZy4KKyAqLworIAorLyoqCisgKiBoYXZlX3N1Ym1vdW50cyAtIGNoZWNrIGZvciBtb3VudHMgb3ZlciBhIGRlbnRyeQorICogQHBhcmVudDogZGVudHJ5IHRvIGNoZWNrLgorICoKKyAqIFJldHVybiB0cnVlIGlmIHRoZSBwYXJlbnQgb3IgaXRzIHN1YmRpcmVjdG9yaWVzIGNvbnRhaW4KKyAqIGEgbW91bnQgcG9pbnQKKyAqLworIAoraW50IGhhdmVfc3VibW91bnRzKHN0cnVjdCBkZW50cnkgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICp0aGlzX3BhcmVudCA9IHBhcmVudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0OworCisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJaWYgKGRfbW91bnRwb2ludChwYXJlbnQpKQorCQlnb3RvIHBvc2l0aXZlOworcmVwZWF0OgorCW5leHQgPSB0aGlzX3BhcmVudC0+ZF9zdWJkaXJzLm5leHQ7CityZXN1bWU6CisJd2hpbGUgKG5leHQgIT0gJnRoaXNfcGFyZW50LT5kX3N1YmRpcnMpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqdG1wID0gbmV4dDsKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBkZW50cnksIGRfY2hpbGQpOworCQluZXh0ID0gdG1wLT5uZXh0OworCQkvKiBIYXZlIHdlIGZvdW5kIGEgbW91bnQgcG9pbnQgPyAqLworCQlpZiAoZF9tb3VudHBvaW50KGRlbnRyeSkpCisJCQlnb3RvIHBvc2l0aXZlOworCQlpZiAoIWxpc3RfZW1wdHkoJmRlbnRyeS0+ZF9zdWJkaXJzKSkgeworCQkJdGhpc19wYXJlbnQgPSBkZW50cnk7CisJCQlnb3RvIHJlcGVhdDsKKwkJfQorCX0KKwkvKgorCSAqIEFsbCBkb25lIGF0IHRoaXMgbGV2ZWwgLi4uIGFzY2VuZCBhbmQgcmVzdW1lIHRoZSBzZWFyY2guCisJICovCisJaWYgKHRoaXNfcGFyZW50ICE9IHBhcmVudCkgeworCQluZXh0ID0gdGhpc19wYXJlbnQtPmRfY2hpbGQubmV4dDsgCisJCXRoaXNfcGFyZW50ID0gdGhpc19wYXJlbnQtPmRfcGFyZW50OworCQlnb3RvIHJlc3VtZTsKKwl9CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwlyZXR1cm4gMDsgLyogTm8gbW91bnQgcG9pbnRzIGZvdW5kIGluIHRyZWUgKi8KK3Bvc2l0aXZlOgorCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBTZWFyY2ggdGhlIGRlbnRyeSBjaGlsZCBsaXN0IGZvciB0aGUgc3BlY2lmaWVkIHBhcmVudCwKKyAqIGFuZCBtb3ZlIGFueSB1bnVzZWQgZGVudHJpZXMgdG8gdGhlIGVuZCBvZiB0aGUgdW51c2VkCisgKiBsaXN0IGZvciBwcnVuZV9kY2FjaGUoKS4gV2UgZGVzY2VuZCB0byB0aGUgbmV4dCBsZXZlbAorICogd2hlbmV2ZXIgdGhlIGRfc3ViZGlycyBsaXN0IGlzIG5vbi1lbXB0eSBhbmQgY29udGludWUKKyAqIHNlYXJjaGluZy4KKyAqCisgKiBJdCByZXR1cm5zIHplcm8gaWZmIHRoZXJlIGFyZSBubyB1bnVzZWQgY2hpbGRyZW4sCisgKiBvdGhlcndpc2UgIGl0IHJldHVybnMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBtb3ZlZCB0bworICogdGhlIGVuZCBvZiB0aGUgdW51c2VkIGxpc3QuIFRoaXMgbWF5IG5vdCBiZSB0aGUgdG90YWwKKyAqIG51bWJlciBvZiB1bnVzZWQgY2hpbGRyZW4sIGJlY2F1c2Ugc2VsZWN0X3BhcmVudCBjYW4KKyAqIGRyb3AgdGhlIGxvY2sgYW5kIHJldHVybiBlYXJseSBkdWUgdG8gbGF0ZW5jeQorICogY29uc3RyYWludHMuCisgKi8KK3N0YXRpYyBpbnQgc2VsZWN0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICogcGFyZW50KQoreworCXN0cnVjdCBkZW50cnkgKnRoaXNfcGFyZW50ID0gcGFyZW50OworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CisJaW50IGZvdW5kID0gMDsKKworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworcmVwZWF0OgorCW5leHQgPSB0aGlzX3BhcmVudC0+ZF9zdWJkaXJzLm5leHQ7CityZXN1bWU6CisJd2hpbGUgKG5leHQgIT0gJnRoaXNfcGFyZW50LT5kX3N1YmRpcnMpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqdG1wID0gbmV4dDsKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBkZW50cnksIGRfY2hpbGQpOworCQluZXh0ID0gdG1wLT5uZXh0OworCisJCWlmICghbGlzdF9lbXB0eSgmZGVudHJ5LT5kX2xydSkpIHsKKwkJCWRlbnRyeV9zdGF0Lm5yX3VudXNlZC0tOworCQkJbGlzdF9kZWxfaW5pdCgmZGVudHJ5LT5kX2xydSk7CisJCX0KKwkJLyogCisJCSAqIG1vdmUgb25seSB6ZXJvIHJlZiBjb3VudCBkZW50cmllcyB0byB0aGUgZW5kIAorCQkgKiBvZiB0aGUgdW51c2VkIGxpc3QgZm9yIHBydW5lX2RjYWNoZQorCQkgKi8KKwkJaWYgKCFhdG9taWNfcmVhZCgmZGVudHJ5LT5kX2NvdW50KSkgeworCQkJbGlzdF9hZGQoJmRlbnRyeS0+ZF9scnUsIGRlbnRyeV91bnVzZWQucHJldik7CisJCQlkZW50cnlfc3RhdC5ucl91bnVzZWQrKzsKKwkJCWZvdW5kKys7CisJCX0KKworCQkvKgorCQkgKiBXZSBjYW4gcmV0dXJuIHRvIHRoZSBjYWxsZXIgaWYgd2UgaGF2ZSBmb3VuZCBzb21lICh0aGlzCisJCSAqIGVuc3VyZXMgZm9yd2FyZCBwcm9ncmVzcykuIFdlJ2xsIGJlIGNvbWluZyBiYWNrIHRvIGZpbmQKKwkJICogdGhlIHJlc3QuCisJCSAqLworCQlpZiAoZm91bmQgJiYgbmVlZF9yZXNjaGVkKCkpCisJCQlnb3RvIG91dDsKKworCQkvKgorCQkgKiBEZXNjZW5kIGEgbGV2ZWwgaWYgdGhlIGRfc3ViZGlycyBsaXN0IGlzIG5vbi1lbXB0eS4KKwkJICovCisJCWlmICghbGlzdF9lbXB0eSgmZGVudHJ5LT5kX3N1YmRpcnMpKSB7CisJCQl0aGlzX3BhcmVudCA9IGRlbnRyeTsKKyNpZmRlZiBEQ0FDSEVfREVCVUcKK3ByaW50ayhLRVJOX0RFQlVHICJzZWxlY3RfcGFyZW50OiBkZXNjZW5kaW5nIHRvICVzLyVzLCBmb3VuZD0lZFxuIiwKK2RlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLCBmb3VuZCk7CisjZW5kaWYKKwkJCWdvdG8gcmVwZWF0OworCQl9CisJfQorCS8qCisJICogQWxsIGRvbmUgYXQgdGhpcyBsZXZlbCAuLi4gYXNjZW5kIGFuZCByZXN1bWUgdGhlIHNlYXJjaC4KKwkgKi8KKwlpZiAodGhpc19wYXJlbnQgIT0gcGFyZW50KSB7CisJCW5leHQgPSB0aGlzX3BhcmVudC0+ZF9jaGlsZC5uZXh0OyAKKwkJdGhpc19wYXJlbnQgPSB0aGlzX3BhcmVudC0+ZF9wYXJlbnQ7CisjaWZkZWYgRENBQ0hFX0RFQlVHCitwcmludGsoS0VSTl9ERUJVRyAic2VsZWN0X3BhcmVudDogYXNjZW5kaW5nIHRvICVzLyVzLCBmb3VuZD0lZFxuIiwKK3RoaXNfcGFyZW50LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIHRoaXNfcGFyZW50LT5kX25hbWUubmFtZSwgZm91bmQpOworI2VuZGlmCisJCWdvdG8gcmVzdW1lOworCX0KK291dDoKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCXJldHVybiBmb3VuZDsKK30KKworLyoqCisgKiBzaHJpbmtfZGNhY2hlX3BhcmVudCAtIHBydW5lIGRjYWNoZQorICogQHBhcmVudDogcGFyZW50IG9mIGVudHJpZXMgdG8gcHJ1bmUKKyAqCisgKiBQcnVuZSB0aGUgZGNhY2hlIHRvIHJlbW92ZSB1bnVzZWQgY2hpbGRyZW4gb2YgdGhlIHBhcmVudCBkZW50cnkuCisgKi8KKyAKK3ZvaWQgc2hyaW5rX2RjYWNoZV9wYXJlbnQoc3RydWN0IGRlbnRyeSAqIHBhcmVudCkKK3sKKwlpbnQgZm91bmQ7CisKKwl3aGlsZSAoKGZvdW5kID0gc2VsZWN0X3BhcmVudChwYXJlbnQpKSAhPSAwKQorCQlwcnVuZV9kY2FjaGUoZm91bmQpOworfQorCisvKioKKyAqIHNocmlua19kY2FjaGVfYW5vbiAtIGZ1cnRoZXIgcHJ1bmUgdGhlIGNhY2hlCisgKiBAaGVhZDogaGVhZCBvZiBkX2hhc2ggbGlzdCBvZiBkZW50cmllcyB0byBwcnVuZQorICoKKyAqIFBydW5lIHRoZSBkZW50cmllcyB0aGF0IGFyZSBhbm9ueW1vdXMKKyAqCisgKiBwYXJzaW5nIGRfaGFzaCBsaXN0IGRvZXMgbm90IGhsaXN0X2Zvcl9lYWNoX3JjdSgpIGFzIGl0CisgKiBkb25lIHVuZGVyIGRjYWNoZV9sb2NrLgorICoKKyAqLwordm9pZCBzaHJpbmtfZGNhY2hlX2Fub24oc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGhsaXN0X25vZGUgKmxwOworCWludCBmb3VuZDsKKwlkbyB7CisJCWZvdW5kID0gMDsKKwkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJCWhsaXN0X2Zvcl9lYWNoKGxwLCBoZWFkKSB7CisJCQlzdHJ1Y3QgZGVudHJ5ICp0aGlzID0gaGxpc3RfZW50cnkobHAsIHN0cnVjdCBkZW50cnksIGRfaGFzaCk7CisJCQlpZiAoIWxpc3RfZW1wdHkoJnRoaXMtPmRfbHJ1KSkgeworCQkJCWRlbnRyeV9zdGF0Lm5yX3VudXNlZC0tOworCQkJCWxpc3RfZGVsX2luaXQoJnRoaXMtPmRfbHJ1KTsKKwkJCX0KKworCQkJLyogCisJCQkgKiBtb3ZlIG9ubHkgemVybyByZWYgY291bnQgZGVudHJpZXMgdG8gdGhlIGVuZCAKKwkJCSAqIG9mIHRoZSB1bnVzZWQgbGlzdCBmb3IgcHJ1bmVfZGNhY2hlCisJCQkgKi8KKwkJCWlmICghYXRvbWljX3JlYWQoJnRoaXMtPmRfY291bnQpKSB7CisJCQkJbGlzdF9hZGRfdGFpbCgmdGhpcy0+ZF9scnUsICZkZW50cnlfdW51c2VkKTsKKwkJCQlkZW50cnlfc3RhdC5ucl91bnVzZWQrKzsKKwkJCQlmb3VuZCsrOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCXBydW5lX2RjYWNoZShmb3VuZCk7CisJfSB3aGlsZShmb3VuZCk7Cit9CisKKy8qCisgKiBTY2FuIGBucicgZGVudHJpZXMgYW5kIHJldHVybiB0aGUgbnVtYmVyIHdoaWNoIHJlbWFpbi4KKyAqCisgKiBXZSBuZWVkIHRvIGF2b2lkIHJlZW50ZXJpbmcgdGhlIGZpbGVzeXN0ZW0gaWYgdGhlIGNhbGxlciBpcyBwZXJmb3JtaW5nIGEKKyAqIEdGUF9OT0ZTIGFsbG9jYXRpb24gYXR0ZW1wdC4gIE9uZSBleGFtcGxlIGRlYWRsb2NrIGlzOgorICoKKyAqIGV4dDJfbmV3X2Jsb2NrLT5nZXRibGstPkdGUC0+c2hyaW5rX2RjYWNoZV9tZW1vcnktPnBydW5lX2RjYWNoZS0+CisgKiBwcnVuZV9vbmVfZGVudHJ5LT5kcHV0LT5kZW50cnlfaXB1dC0+aXB1dC0+aW5vZGUtPmlfc2ItPnNfb3AtPnB1dF9pbm9kZS0+CisgKiBleHQyX2Rpc2NhcmRfcHJlYWxsb2MtPmV4dDJfZnJlZV9ibG9ja3MtPmxvY2tfc3VwZXItPkRFQURMT0NLLgorICoKKyAqIEluIHRoaXMgY2FzZSB3ZSByZXR1cm4gLTEgdG8gdGVsbCB0aGUgY2FsbGVyIHRoYXQgd2UgYmFsZWQuCisgKi8KK3N0YXRpYyBpbnQgc2hyaW5rX2RjYWNoZV9tZW1vcnkoaW50IG5yLCB1bnNpZ25lZCBpbnQgZ2ZwX21hc2spCit7CisJaWYgKG5yKSB7CisJCWlmICghKGdmcF9tYXNrICYgX19HRlBfRlMpKQorCQkJcmV0dXJuIC0xOworCQlwcnVuZV9kY2FjaGUobnIpOworCX0KKwlyZXR1cm4gKGRlbnRyeV9zdGF0Lm5yX3VudXNlZCAvIDEwMCkgKiBzeXNjdGxfdmZzX2NhY2hlX3ByZXNzdXJlOworfQorCisvKioKKyAqIGRfYWxsb2MJLQlhbGxvY2F0ZSBhIGRjYWNoZSBlbnRyeQorICogQHBhcmVudDogcGFyZW50IG9mIGVudHJ5IHRvIGFsbG9jYXRlCisgKiBAbmFtZTogcXN0ciBvZiB0aGUgbmFtZQorICoKKyAqIEFsbG9jYXRlcyBhIGRlbnRyeS4gSXQgcmV0dXJucyAlTlVMTCBpZiB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgbWVtb3J5CisgKiBhdmFpbGFibGUuIE9uIGEgc3VjY2VzcyB0aGUgZGVudHJ5IGlzIHJldHVybmVkLiBUaGUgbmFtZSBwYXNzZWQgaW4gaXMKKyAqIGNvcGllZCBhbmQgdGhlIGNvcHkgcGFzc2VkIGluIG1heSBiZSByZXVzZWQgYWZ0ZXIgdGhpcyBjYWxsLgorICovCisgCitzdHJ1Y3QgZGVudHJ5ICpkX2FsbG9jKHN0cnVjdCBkZW50cnkgKiBwYXJlbnQsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwljaGFyICpkbmFtZTsKKworCWRlbnRyeSA9IGttZW1fY2FjaGVfYWxsb2MoZGVudHJ5X2NhY2hlLCBHRlBfS0VSTkVMKTsgCisJaWYgKCFkZW50cnkpCisJCXJldHVybiBOVUxMOworCisJaWYgKG5hbWUtPmxlbiA+IEROQU1FX0lOTElORV9MRU4tMSkgeworCQlkbmFtZSA9IGttYWxsb2MobmFtZS0+bGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZG5hbWUpIHsKKwkJCWttZW1fY2FjaGVfZnJlZShkZW50cnlfY2FjaGUsIGRlbnRyeSk7IAorCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IGVsc2UgIHsKKwkJZG5hbWUgPSBkZW50cnktPmRfaW5hbWU7CisJfQkKKwlkZW50cnktPmRfbmFtZS5uYW1lID0gZG5hbWU7CisKKwlkZW50cnktPmRfbmFtZS5sZW4gPSBuYW1lLT5sZW47CisJZGVudHJ5LT5kX25hbWUuaGFzaCA9IG5hbWUtPmhhc2g7CisJbWVtY3B5KGRuYW1lLCBuYW1lLT5uYW1lLCBuYW1lLT5sZW4pOworCWRuYW1lW25hbWUtPmxlbl0gPSAwOworCisJYXRvbWljX3NldCgmZGVudHJ5LT5kX2NvdW50LCAxKTsKKwlkZW50cnktPmRfZmxhZ3MgPSBEQ0FDSEVfVU5IQVNIRUQ7CisJc3Bpbl9sb2NrX2luaXQoJmRlbnRyeS0+ZF9sb2NrKTsKKwlkZW50cnktPmRfaW5vZGUgPSBOVUxMOworCWRlbnRyeS0+ZF9wYXJlbnQgPSBOVUxMOworCWRlbnRyeS0+ZF9zYiA9IE5VTEw7CisJZGVudHJ5LT5kX29wID0gTlVMTDsKKwlkZW50cnktPmRfZnNkYXRhID0gTlVMTDsKKwlkZW50cnktPmRfbW91bnRlZCA9IDA7CisJZGVudHJ5LT5kX2Nvb2tpZSA9IE5VTEw7CisJSU5JVF9ITElTVF9OT0RFKCZkZW50cnktPmRfaGFzaCk7CisJSU5JVF9MSVNUX0hFQUQoJmRlbnRyeS0+ZF9scnUpOworCUlOSVRfTElTVF9IRUFEKCZkZW50cnktPmRfc3ViZGlycyk7CisJSU5JVF9MSVNUX0hFQUQoJmRlbnRyeS0+ZF9hbGlhcyk7CisKKwlpZiAocGFyZW50KSB7CisJCWRlbnRyeS0+ZF9wYXJlbnQgPSBkZ2V0KHBhcmVudCk7CisJCWRlbnRyeS0+ZF9zYiA9IHBhcmVudC0+ZF9zYjsKKwl9IGVsc2UgeworCQlJTklUX0xJU1RfSEVBRCgmZGVudHJ5LT5kX2NoaWxkKTsKKwl9CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwlpZiAocGFyZW50KQorCQlsaXN0X2FkZCgmZGVudHJ5LT5kX2NoaWxkLCAmcGFyZW50LT5kX3N1YmRpcnMpOworCWRlbnRyeV9zdGF0Lm5yX2RlbnRyeSsrOworCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisKKwlyZXR1cm4gZGVudHJ5OworfQorCitzdHJ1Y3QgZGVudHJ5ICpkX2FsbG9jX25hbWUoc3RydWN0IGRlbnRyeSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBxc3RyIHE7CisKKwlxLm5hbWUgPSBuYW1lOworCXEubGVuID0gc3RybGVuKG5hbWUpOworCXEuaGFzaCA9IGZ1bGxfbmFtZV9oYXNoKHEubmFtZSwgcS5sZW4pOworCXJldHVybiBkX2FsbG9jKHBhcmVudCwgJnEpOworfQorCisvKioKKyAqIGRfaW5zdGFudGlhdGUgLSBmaWxsIGluIGlub2RlIGluZm9ybWF0aW9uIGZvciBhIGRlbnRyeQorICogQGVudHJ5OiBkZW50cnkgdG8gY29tcGxldGUKKyAqIEBpbm9kZTogaW5vZGUgdG8gYXR0YWNoIHRvIHRoaXMgZGVudHJ5CisgKgorICogRmlsbCBpbiBpbm9kZSBpbmZvcm1hdGlvbiBpbiB0aGUgZW50cnkuCisgKgorICogVGhpcyB0dXJucyBuZWdhdGl2ZSBkZW50cmllcyBpbnRvIHByb2R1Y3RpdmUgZnVsbCBtZW1iZXJzCisgKiBvZiBzb2NpZXR5LgorICoKKyAqIE5PVEUhIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBpbm9kZSBjb3VudCBoYXMgYmVlbiBpbmNyZW1lbnRlZAorICogKG9yIG90aGVyd2lzZSBzZXQpIGJ5IHRoZSBjYWxsZXIgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBub3cKKyAqIGluIHVzZSBieSB0aGUgZGNhY2hlLgorICovCisgCit2b2lkIGRfaW5zdGFudGlhdGUoc3RydWN0IGRlbnRyeSAqZW50cnksIHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCWlmICghbGlzdF9lbXB0eSgmZW50cnktPmRfYWxpYXMpKSBCVUcoKTsKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwlpZiAoaW5vZGUpCisJCWxpc3RfYWRkKCZlbnRyeS0+ZF9hbGlhcywgJmlub2RlLT5pX2RlbnRyeSk7CisJZW50cnktPmRfaW5vZGUgPSBpbm9kZTsKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCXNlY3VyaXR5X2RfaW5zdGFudGlhdGUoZW50cnksIGlub2RlKTsKK30KKworLyoqCisgKiBkX2luc3RhbnRpYXRlX3VuaXF1ZSAtIGluc3RhbnRpYXRlIGEgbm9uLWFsaWFzZWQgZGVudHJ5CisgKiBAZW50cnk6IGRlbnRyeSB0byBpbnN0YW50aWF0ZQorICogQGlub2RlOiBpbm9kZSB0byBhdHRhY2ggdG8gdGhpcyBkZW50cnkKKyAqCisgKiBGaWxsIGluIGlub2RlIGluZm9ybWF0aW9uIGluIHRoZSBlbnRyeS4gT24gc3VjY2VzcywgaXQgcmV0dXJucyBOVUxMLgorICogSWYgYW4gdW5oYXNoZWQgYWxpYXMgb2YgImVudHJ5IiBhbHJlYWR5IGV4aXN0cywgdGhlbiB3ZSByZXR1cm4gdGhlCisgKiBhbGlhc2VkIGRlbnRyeSBpbnN0ZWFkLgorICoKKyAqIE5vdGUgdGhhdCBpbiBvcmRlciB0byBhdm9pZCBjb25mbGljdHMgd2l0aCByZW5hbWUoKSBldGMsIHRoZSBjYWxsZXIKKyAqIGhhZCBiZXR0ZXIgYmUgaG9sZGluZyB0aGUgcGFyZW50IGRpcmVjdG9yeSBzZW1hcGhvcmUuCisgKi8KK3N0cnVjdCBkZW50cnkgKmRfaW5zdGFudGlhdGVfdW5pcXVlKHN0cnVjdCBkZW50cnkgKmVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBkZW50cnkgKmFsaWFzOworCWludCBsZW4gPSBlbnRyeS0+ZF9uYW1lLmxlbjsKKwljb25zdCBjaGFyICpuYW1lID0gZW50cnktPmRfbmFtZS5uYW1lOworCXVuc2lnbmVkIGludCBoYXNoID0gZW50cnktPmRfbmFtZS5oYXNoOworCisJQlVHX09OKCFsaXN0X2VtcHR5KCZlbnRyeS0+ZF9hbGlhcykpOworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCWlmICghaW5vZGUpCisJCWdvdG8gZG9fbmVnYXRpdmU7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShhbGlhcywgJmlub2RlLT5pX2RlbnRyeSwgZF9hbGlhcykgeworCQlzdHJ1Y3QgcXN0ciAqcXN0ciA9ICZhbGlhcy0+ZF9uYW1lOworCisJCWlmIChxc3RyLT5oYXNoICE9IGhhc2gpCisJCQljb250aW51ZTsKKwkJaWYgKGFsaWFzLT5kX3BhcmVudCAhPSBlbnRyeS0+ZF9wYXJlbnQpCisJCQljb250aW51ZTsKKwkJaWYgKHFzdHItPmxlbiAhPSBsZW4pCisJCQljb250aW51ZTsKKwkJaWYgKG1lbWNtcChxc3RyLT5uYW1lLCBuYW1lLCBsZW4pKQorCQkJY29udGludWU7CisJCWRnZXRfbG9ja2VkKGFsaWFzKTsKKwkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJQlVHX09OKCFkX3VuaGFzaGVkKGFsaWFzKSk7CisJCXJldHVybiBhbGlhczsKKwl9CisJbGlzdF9hZGQoJmVudHJ5LT5kX2FsaWFzLCAmaW5vZGUtPmlfZGVudHJ5KTsKK2RvX25lZ2F0aXZlOgorCWVudHJ5LT5kX2lub2RlID0gaW5vZGU7CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwlzZWN1cml0eV9kX2luc3RhbnRpYXRlKGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGRfaW5zdGFudGlhdGVfdW5pcXVlKTsKKworLyoqCisgKiBkX2FsbG9jX3Jvb3QgLSBhbGxvY2F0ZSByb290IGRlbnRyeQorICogQHJvb3RfaW5vZGU6IGlub2RlIHRvIGFsbG9jYXRlIHRoZSByb290IGZvcgorICoKKyAqIEFsbG9jYXRlIGEgcm9vdCAoIi8iKSBkZW50cnkgZm9yIHRoZSBpbm9kZSBnaXZlbi4gVGhlIGlub2RlIGlzCisgKiBpbnN0YW50aWF0ZWQgYW5kIHJldHVybmVkLiAlTlVMTCBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyBpbnN1ZmZpY2llbnQKKyAqIG1lbW9yeSBvciB0aGUgaW5vZGUgcGFzc2VkIGlzICVOVUxMLgorICovCisgCitzdHJ1Y3QgZGVudHJ5ICogZF9hbGxvY19yb290KHN0cnVjdCBpbm9kZSAqIHJvb3RfaW5vZGUpCit7CisJc3RydWN0IGRlbnRyeSAqcmVzID0gTlVMTDsKKworCWlmIChyb290X2lub2RlKSB7CisJCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcXN0ciBuYW1lID0geyAubmFtZSA9ICIvIiwgLmxlbiA9IDEgfTsKKworCQlyZXMgPSBkX2FsbG9jKE5VTEwsICZuYW1lKTsKKwkJaWYgKHJlcykgeworCQkJcmVzLT5kX3NiID0gcm9vdF9pbm9kZS0+aV9zYjsKKwkJCXJlcy0+ZF9wYXJlbnQgPSByZXM7CisJCQlkX2luc3RhbnRpYXRlKHJlcywgcm9vdF9pbm9kZSk7CisJCX0KKwl9CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaGxpc3RfaGVhZCAqZF9oYXNoKHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCQkJdW5zaWduZWQgbG9uZyBoYXNoKQoreworCWhhc2ggKz0gKCh1bnNpZ25lZCBsb25nKSBwYXJlbnQgXiBHT0xERU5fUkFUSU9fUFJJTUUpIC8gTDFfQ0FDSEVfQllURVM7CisJaGFzaCA9IGhhc2ggXiAoKGhhc2ggXiBHT0xERU5fUkFUSU9fUFJJTUUpID4+IERfSEFTSEJJVFMpOworCXJldHVybiBkZW50cnlfaGFzaHRhYmxlICsgKGhhc2ggJiBEX0hBU0hNQVNLKTsKK30KKworLyoqCisgKiBkX2FsbG9jX2Fub24gLSBhbGxvY2F0ZSBhbiBhbm9ueW1vdXMgZGVudHJ5CisgKiBAaW5vZGU6IGlub2RlIHRvIGFsbG9jYXRlIHRoZSBkZW50cnkgZm9yCisgKgorICogVGhpcyBpcyBzaW1pbGFyIHRvIGRfYWxsb2Nfcm9vdC4gIEl0IGlzIHVzZWQgYnkgZmlsZXN5c3RlbXMgd2hlbgorICogY3JlYXRpbmcgYSBkZW50cnkgZm9yIGEgZ2l2ZW4gaW5vZGUsIG9mdGVuIGluIHRoZSBwcm9jZXNzIG9mIAorICogbWFwcGluZyBhIGZpbGVoYW5kbGUgdG8gYSBkZW50cnkuICBUaGUgcmV0dXJuZWQgZGVudHJ5IG1heSBiZQorICogYW5vbnltb3VzLCBvciBtYXkgaGF2ZSBhIGZ1bGwgbmFtZSAoaWYgdGhlIGlub2RlIHdhcyBhbHJlYWR5CisgKiBpbiB0aGUgY2FjaGUpLiAgVGhlIGZpbGUgc3lzdGVtIG1heSBuZWVkIHRvIG1ha2UgZnVydGhlcgorICogZWZmb3J0cyB0byBjb25uZWN0IHRoaXMgZGVudHJ5IGludG8gdGhlIGRjYWNoZSBwcm9wZXJseS4KKyAqCisgKiBXaGVuIGNhbGxlZCBvbiBhIGRpcmVjdG9yeSBpbm9kZSwgd2UgbXVzdCBlbnN1cmUgdGhhdAorICogdGhlIGlub2RlIG9ubHkgZXZlciBoYXMgb25lIGRlbnRyeS4gIElmIGEgZGVudHJ5IGlzCisgKiBmb3VuZCwgdGhhdCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFsbG9jYXRpbmcgYSBuZXcgb25lLgorICoKKyAqIE9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBpbm9kZSBoYXMgYmVlbiB0cmFuc2ZlcnJlZAorICogdG8gdGhlIGRlbnRyeS4gIElmICVOVUxMIGlzIHJldHVybmVkIChpbmRpY2F0aW5nIGttYWxsb2MgZmFpbHVyZSksCisgKiB0aGUgcmVmZXJlbmNlIG9uIHRoZSBpbm9kZSBoYXMgbm90IGJlZW4gcmVsZWFzZWQuCisgKi8KKworc3RydWN0IGRlbnRyeSAqIGRfYWxsb2NfYW5vbihzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcXN0ciBhbm9uc3RyaW5nID0geyAubmFtZSA9ICIiIH07CisJc3RydWN0IGRlbnRyeSAqdG1wOworCXN0cnVjdCBkZW50cnkgKnJlczsKKworCWlmICgocmVzID0gZF9maW5kX2FsaWFzKGlub2RlKSkpIHsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiByZXM7CisJfQorCisJdG1wID0gZF9hbGxvYyhOVUxMLCAmYW5vbnN0cmluZyk7CisJaWYgKCF0bXApCisJCXJldHVybiBOVUxMOworCisJdG1wLT5kX3BhcmVudCA9IHRtcDsgLyogbWFrZSBzdXJlIGRwdXQgZG9lc24ndCBjcm9hayAqLworCQorCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCXJlcyA9IF9fZF9maW5kX2FsaWFzKGlub2RlLCAwKTsKKwlpZiAoIXJlcykgeworCQkvKiBhdHRhY2ggYSBkaXNjb25uZWN0ZWQgZGVudHJ5ICovCisJCXJlcyA9IHRtcDsKKwkJdG1wID0gTlVMTDsKKwkJc3Bpbl9sb2NrKCZyZXMtPmRfbG9jayk7CisJCXJlcy0+ZF9zYiA9IGlub2RlLT5pX3NiOworCQlyZXMtPmRfcGFyZW50ID0gcmVzOworCQlyZXMtPmRfaW5vZGUgPSBpbm9kZTsKKwkJcmVzLT5kX2ZsYWdzIHw9IERDQUNIRV9ESVNDT05ORUNURUQ7CisJCXJlcy0+ZF9mbGFncyAmPSB+RENBQ0hFX1VOSEFTSEVEOworCQlsaXN0X2FkZCgmcmVzLT5kX2FsaWFzLCAmaW5vZGUtPmlfZGVudHJ5KTsKKwkJaGxpc3RfYWRkX2hlYWQoJnJlcy0+ZF9oYXNoLCAmaW5vZGUtPmlfc2ItPnNfYW5vbik7CisJCXNwaW5fdW5sb2NrKCZyZXMtPmRfbG9jayk7CisKKwkJaW5vZGUgPSBOVUxMOyAvKiBkb24ndCBkcm9wIHJlZmVyZW5jZSAqLworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCisJaWYgKGlub2RlKQorCQlpcHV0KGlub2RlKTsKKwlpZiAodG1wKQorCQlkcHV0KHRtcCk7CisJcmV0dXJuIHJlczsKK30KKworCisvKioKKyAqIGRfc3BsaWNlX2FsaWFzIC0gc3BsaWNlIGEgZGlzY29ubmVjdGVkIGRlbnRyeSBpbnRvIHRoZSB0cmVlIGlmIG9uZSBleGlzdHMKKyAqIEBpbm9kZTogIHRoZSBpbm9kZSB3aGljaCBtYXkgaGF2ZSBhIGRpc2Nvbm5lY3RlZCBkZW50cnkKKyAqIEBkZW50cnk6IGEgbmVnYXRpdmUgZGVudHJ5IHdoaWNoIHdlIHdhbnQgdG8gcG9pbnQgdG8gdGhlIGlub2RlLgorICoKKyAqIElmIGlub2RlIGlzIGEgZGlyZWN0b3J5IGFuZCBoYXMgYSAnZGlzY29ubmVjdGVkJyBkZW50cnkgKGkuZS4gSVNfUk9PVCBhbmQKKyAqIERDQUNIRV9ESVNDT05ORUNURUQpLCB0aGVuIGRfbW92ZSB0aGF0IGluIHBsYWNlIG9mIHRoZSBnaXZlbiBkZW50cnkKKyAqIGFuZCByZXR1cm4gaXQsIGVsc2Ugc2ltcGx5IGRfYWRkIHRoZSBpbm9kZSB0byB0aGUgZGVudHJ5IGFuZCByZXR1cm4gTlVMTC4KKyAqCisgKiBUaGlzIGlzIG5lZWRlZCBpbiB0aGUgbG9va3VwIHJvdXRpbmUgb2YgYW55IGZpbGVzeXN0ZW0gdGhhdCBpcyBleHBvcnRhYmxlCisgKiAodmlhIGtuZnNkKSBzbyB0aGF0IHdlIGNhbiBidWlsZCBkY2FjaGUgcGF0aHMgdG8gZGlyZWN0b3JpZXMgZWZmZWN0aXZlbHkuCisgKgorICogSWYgYSBkZW50cnkgd2FzIGZvdW5kIGFuZCBtb3ZlZCwgdGhlbiBpdCBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSBOVUxMCisgKiBpcyByZXR1cm5lZC4gIFRoaXMgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIG9mIC0+bG9va3VwLgorICoKKyAqLworc3RydWN0IGRlbnRyeSAqZF9zcGxpY2VfYWxpYXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBkZW50cnkgKm5ldyA9IE5VTEw7CisKKwlpZiAoaW5vZGUpIHsKKwkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJCW5ldyA9IF9fZF9maW5kX2FsaWFzKGlub2RlLCAxKTsKKwkJaWYgKG5ldykgeworCQkJQlVHX09OKCEobmV3LT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCkpOworCQkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJCXNlY3VyaXR5X2RfaW5zdGFudGlhdGUobmV3LCBpbm9kZSk7CisJCQlkX3JlaGFzaChkZW50cnkpOworCQkJZF9tb3ZlKG5ldywgZGVudHJ5KTsKKwkJCWlwdXQoaW5vZGUpOworCQl9IGVsc2UgeworCQkJLyogZF9pbnN0YW50aWF0ZSB0YWtlcyBkY2FjaGVfbG9jaywgc28gd2UgZG8gaXQgYnkgaGFuZCAqLworCQkJbGlzdF9hZGQoJmRlbnRyeS0+ZF9hbGlhcywgJmlub2RlLT5pX2RlbnRyeSk7CisJCQlkZW50cnktPmRfaW5vZGUgPSBpbm9kZTsKKwkJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCQlzZWN1cml0eV9kX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCQkJZF9yZWhhc2goZGVudHJ5KTsKKwkJfQorCX0gZWxzZQorCQlkX2FkZChkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gbmV3OworfQorCisKKy8qKgorICogZF9sb29rdXAgLSBzZWFyY2ggZm9yIGEgZGVudHJ5CisgKiBAcGFyZW50OiBwYXJlbnQgZGVudHJ5CisgKiBAbmFtZTogcXN0ciBvZiBuYW1lIHdlIHdpc2ggdG8gZmluZAorICoKKyAqIFNlYXJjaGVzIHRoZSBjaGlsZHJlbiBvZiB0aGUgcGFyZW50IGRlbnRyeSBmb3IgdGhlIG5hbWUgaW4gcXVlc3Rpb24uIElmCisgKiB0aGUgZGVudHJ5IGlzIGZvdW5kIGl0cyByZWZlcmVuY2UgY291bnQgaXMgaW5jcmVtZW50ZWQgYW5kIHRoZSBkZW50cnkKKyAqIGlzIHJldHVybmVkLiBUaGUgY2FsbGVyIG11c3QgdXNlIGRfcHV0IHRvIGZyZWUgdGhlIGVudHJ5IHdoZW4gaXQgaGFzCisgKiBmaW5pc2hlZCB1c2luZyBpdC4gJU5VTEwgaXMgcmV0dXJuZWQgb24gZmFpbHVyZS4KKyAqCisgKiBfX2RfbG9va3VwIGlzIGRjYWNoZV9sb2NrIGZyZWUuIFRoZSBoYXNoIGxpc3QgaXMgcHJvdGVjdGVkIHVzaW5nIFJDVS4KKyAqIE1lbW9yeSBiYXJyaWVycyBhcmUgdXNlZCB3aGlsZSB1cGRhdGluZyBhbmQgZG9pbmcgbG9ja2xlc3MgdHJhdmVyc2FsLiAKKyAqIFRvIGF2b2lkIHJhY2VzIHdpdGggZF9tb3ZlIHdoaWxlIHJlbmFtZSBpcyBoYXBwZW5pbmcsIGRfbG9jayBpcyB1c2VkLgorICoKKyAqIE92ZXJmbG93cyBpbiBtZW1jbXAoKSwgd2hpbGUgZF9tb3ZlLCBhcmUgYXZvaWRlZCBieSBrZWVwaW5nIHRoZSBsZW5ndGgKKyAqIGFuZCBuYW1lIHBvaW50ZXIgaW4gb25lIHN0cnVjdHVyZSBwb2ludGVkIGJ5IGRfcXN0ci4KKyAqCisgKiByY3VfcmVhZF9sb2NrKCkgYW5kIHJjdV9yZWFkX3VubG9jaygpIGFyZSB1c2VkIHRvIGRpc2FibGUgcHJlZW1wdGlvbiB3aGlsZQorICogbG9va3VwIGlzIGdvaW5nIG9uLgorICoKKyAqIGRlbnRyeV91bnVzZWQgbGlzdCBpcyBub3QgdXBkYXRlZCBldmVuIGlmIGxvb2t1cCBmaW5kcyB0aGUgcmVxdWlyZWQgZGVudHJ5CisgKiBpbiB0aGVyZS4gSXQgaXMgdXBkYXRlZCBpbiBwbGFjZXMgc3VjaCBhcyBwcnVuZV9kY2FjaGUsIHNocmlua19kY2FjaGVfc2IsCisgKiBzZWxlY3RfcGFyZW50IGFuZCBfX2RnZXRfbG9ja2VkLiBUaGlzIGxhemluZXNzIHNhdmVzIGxvb2t1cCBmcm9tIGRjYWNoZV9sb2NrCisgKiBhY3F1aXNpdGlvbi4KKyAqCisgKiBkX2xvb2t1cCgpIGlzIHByb3RlY3RlZCBhZ2FpbnN0IHRoZSBjb25jdXJyZW50IHJlbmFtZXMgaW4gc29tZSB1bnJlbGF0ZWQKKyAqIGRpcmVjdG9yeSB1c2luZyB0aGUgc2VxbG9ja3RfdCByZW5hbWVfbG9jay4KKyAqLworCitzdHJ1Y3QgZGVudHJ5ICogZF9sb29rdXAoc3RydWN0IGRlbnRyeSAqIHBhcmVudCwgc3RydWN0IHFzdHIgKiBuYW1lKQoreworCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgc2VxOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBzZXEgPSByZWFkX3NlcWJlZ2luKCZyZW5hbWVfbG9jayk7CisgICAgICAgICAgICAgICAgZGVudHJ5ID0gX19kX2xvb2t1cChwYXJlbnQsIG5hbWUpOworICAgICAgICAgICAgICAgIGlmIChkZW50cnkpCisJCQlicmVhazsKKwl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZyZW5hbWVfbG9jaywgc2VxKSk7CisJcmV0dXJuIGRlbnRyeTsKK30KKworc3RydWN0IGRlbnRyeSAqIF9fZF9sb29rdXAoc3RydWN0IGRlbnRyeSAqIHBhcmVudCwgc3RydWN0IHFzdHIgKiBuYW1lKQoreworCXVuc2lnbmVkIGludCBsZW4gPSBuYW1lLT5sZW47CisJdW5zaWduZWQgaW50IGhhc2ggPSBuYW1lLT5oYXNoOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0ciA9IG5hbWUtPm5hbWU7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSBkX2hhc2gocGFyZW50LGhhc2gpOworCXN0cnVjdCBkZW50cnkgKmZvdW5kID0gTlVMTDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwkKKwlobGlzdF9mb3JfZWFjaF9yY3Uobm9kZSwgaGVhZCkgeworCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7IAorCQlzdHJ1Y3QgcXN0ciAqcXN0cjsKKworCQlkZW50cnkgPSBobGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgZGVudHJ5LCBkX2hhc2gpOworCisJCWlmIChkZW50cnktPmRfbmFtZS5oYXNoICE9IGhhc2gpCisJCQljb250aW51ZTsKKwkJaWYgKGRlbnRyeS0+ZF9wYXJlbnQgIT0gcGFyZW50KQorCQkJY29udGludWU7CisKKwkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisKKwkJLyoKKwkJICogUmVjaGVjayB0aGUgZGVudHJ5IGFmdGVyIHRha2luZyB0aGUgbG9jayAtIGRfbW92ZSBtYXkgaGF2ZQorCQkgKiBjaGFuZ2VkIHRoaW5ncy4gIERvbid0IGJvdGhlciBjaGVja2luZyB0aGUgaGFzaCBiZWNhdXNlIHdlJ3JlCisJCSAqIGFib3V0IHRvIGNvbXBhcmUgdGhlIHdob2xlIG5hbWUgYW55d2F5LgorCQkgKi8KKwkJaWYgKGRlbnRyeS0+ZF9wYXJlbnQgIT0gcGFyZW50KQorCQkJZ290byBuZXh0OworCisJCS8qCisJCSAqIEl0IGlzIHNhZmUgdG8gY29tcGFyZSBuYW1lcyBzaW5jZSBkX21vdmUoKSBjYW5ub3QKKwkJICogY2hhbmdlIHRoZSBxc3RyIChwcm90ZWN0ZWQgYnkgZF9sb2NrKS4KKwkJICovCisJCXFzdHIgPSAmZGVudHJ5LT5kX25hbWU7CisJCWlmIChwYXJlbnQtPmRfb3AgJiYgcGFyZW50LT5kX29wLT5kX2NvbXBhcmUpIHsKKwkJCWlmIChwYXJlbnQtPmRfb3AtPmRfY29tcGFyZShwYXJlbnQsIHFzdHIsIG5hbWUpKQorCQkJCWdvdG8gbmV4dDsKKwkJfSBlbHNlIHsKKwkJCWlmIChxc3RyLT5sZW4gIT0gbGVuKQorCQkJCWdvdG8gbmV4dDsKKwkJCWlmIChtZW1jbXAocXN0ci0+bmFtZSwgc3RyLCBsZW4pKQorCQkJCWdvdG8gbmV4dDsKKwkJfQorCisJCWlmICghZF91bmhhc2hlZChkZW50cnkpKSB7CisJCQlhdG9taWNfaW5jKCZkZW50cnktPmRfY291bnQpOworCQkJZm91bmQgPSBkZW50cnk7CisJCX0KKwkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJYnJlYWs7CituZXh0OgorCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworIAl9CisgCXJjdV9yZWFkX3VubG9jaygpOworCisgCXJldHVybiBmb3VuZDsKK30KKworLyoqCisgKiBkX3ZhbGlkYXRlIC0gdmVyaWZ5IGRlbnRyeSBwcm92aWRlZCBmcm9tIGluc2VjdXJlIHNvdXJjZQorICogQGRlbnRyeTogVGhlIGRlbnRyeSBhbGxlZ2VkIHRvIGJlIHZhbGlkIGNoaWxkIG9mIEBkcGFyZW50CisgKiBAZHBhcmVudDogVGhlIHBhcmVudCBkZW50cnkgKGtub3duIHRvIGJlIHZhbGlkKQorICogQGhhc2g6IEhhc2ggb2YgdGhlIGRlbnRyeQorICogQGxlbjogTGVuZ3RoIG9mIHRoZSBuYW1lCisgKgorICogQW4gaW5zZWN1cmUgc291cmNlIGhhcyBzZW50IHVzIGEgZGVudHJ5LCBoZXJlIHdlIHZlcmlmeSBpdCBhbmQgZGdldCgpIGl0LgorICogVGhpcyBpcyB1c2VkIGJ5IG5jcGZzIGluIGl0cyByZWFkZGlyIGltcGxlbWVudGF0aW9uLgorICogWmVybyBpcyByZXR1cm5lZCBpbiB0aGUgZGVudHJ5IGlzIGludmFsaWQuCisgKi8KKyAKK2ludCBkX3ZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGRlbnRyeSAqZHBhcmVudCkKK3sKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqYmFzZTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbGhwOworCisJLyogQ2hlY2sgd2hldGhlciB0aGUgcHRyIG1pZ2h0IGJlIHZhbGlkIGF0IGFsbC4uICovCisJaWYgKCFrbWVtX3B0cl92YWxpZGF0ZShkZW50cnlfY2FjaGUsIGRlbnRyeSkpCisJCWdvdG8gb3V0OworCisJaWYgKGRlbnRyeS0+ZF9wYXJlbnQgIT0gZHBhcmVudCkKKwkJZ290byBvdXQ7CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwliYXNlID0gZF9oYXNoKGRwYXJlbnQsIGRlbnRyeS0+ZF9uYW1lLmhhc2gpOworCWhsaXN0X2Zvcl9lYWNoKGxocCxiYXNlKSB7IAorCQkvKiBobGlzdF9mb3JfZWFjaF9yY3UoKSBub3QgcmVxdWlyZWQgZm9yIGRfaGFzaCBsaXN0CisJCSAqIGFzIGl0IGlzIHBhcnNlZCB1bmRlciBkY2FjaGVfbG9jaworCQkgKi8KKwkJaWYgKGRlbnRyeSA9PSBobGlzdF9lbnRyeShsaHAsIHN0cnVjdCBkZW50cnksIGRfaGFzaCkpIHsKKwkJCV9fZGdldF9sb2NrZWQoZGVudHJ5KTsKKwkJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworb3V0OgorCXJldHVybiAwOworfQorCisvKgorICogV2hlbiBhIGZpbGUgaXMgZGVsZXRlZCwgd2UgaGF2ZSB0d28gb3B0aW9uczoKKyAqIC0gdHVybiB0aGlzIGRlbnRyeSBpbnRvIGEgbmVnYXRpdmUgZGVudHJ5CisgKiAtIHVuaGFzaCB0aGlzIGRlbnRyeSBhbmQgZnJlZSBpdC4KKyAqCisgKiBVc3VhbGx5LCB3ZSB3YW50IHRvIGp1c3QgdHVybiB0aGlzIGludG8KKyAqIGEgbmVnYXRpdmUgZGVudHJ5LCBidXQgaWYgYW55Ym9keSBlbHNlIGlzCisgKiBjdXJyZW50bHkgdXNpbmcgdGhlIGRlbnRyeSBvciB0aGUgaW5vZGUKKyAqIHdlIGNhbid0IGRvIHRoYXQgYW5kIHdlIGZhbGwgYmFjayBvbiByZW1vdmluZworICogaXQgZnJvbSB0aGUgaGFzaCBxdWV1ZXMgYW5kIHdhaXRpbmcgZm9yCisgKiBpdCB0byBiZSBkZWxldGVkIGxhdGVyIHdoZW4gaXQgaGFzIG5vIHVzZXJzCisgKi8KKyAKKy8qKgorICogZF9kZWxldGUgLSBkZWxldGUgYSBkZW50cnkKKyAqIEBkZW50cnk6IFRoZSBkZW50cnkgdG8gZGVsZXRlCisgKgorICogVHVybiB0aGUgZGVudHJ5IGludG8gYSBuZWdhdGl2ZSBkZW50cnkgaWYgcG9zc2libGUsIG90aGVyd2lzZQorICogcmVtb3ZlIGl0IGZyb20gdGhlIGhhc2ggcXVldWVzIHNvIGl0IGNhbiBiZSBkZWxldGVkIGxhdGVyCisgKi8KKyAKK3ZvaWQgZF9kZWxldGUoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKK3sKKwkvKgorCSAqIEFyZSB3ZSB0aGUgb25seSB1c2VyPworCSAqLworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCWlmIChhdG9taWNfcmVhZCgmZGVudHJ5LT5kX2NvdW50KSA9PSAxKSB7CisJCWRlbnRyeV9pcHV0KGRlbnRyeSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWRfdW5oYXNoZWQoZGVudHJ5KSkKKwkJX19kX2Ryb3AoZGVudHJ5KTsKKworCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgX19kX3JlaGFzaChzdHJ1Y3QgZGVudHJ5ICogZW50cnksIHN0cnVjdCBobGlzdF9oZWFkICpsaXN0KQoreworCisgCWVudHJ5LT5kX2ZsYWdzICY9IH5EQ0FDSEVfVU5IQVNIRUQ7CisgCWhsaXN0X2FkZF9oZWFkX3JjdSgmZW50cnktPmRfaGFzaCwgbGlzdCk7Cit9CisKKy8qKgorICogZF9yZWhhc2gJLSBhZGQgYW4gZW50cnkgYmFjayB0byB0aGUgaGFzaAorICogQGVudHJ5OiBkZW50cnkgdG8gYWRkIHRvIHRoZSBoYXNoCisgKgorICogQWRkcyBhIGRlbnRyeSB0byB0aGUgaGFzaCBhY2NvcmRpbmcgdG8gaXRzIG5hbWUuCisgKi8KKyAKK3ZvaWQgZF9yZWhhc2goc3RydWN0IGRlbnRyeSAqIGVudHJ5KQoreworCXN0cnVjdCBobGlzdF9oZWFkICpsaXN0ID0gZF9oYXNoKGVudHJ5LT5kX3BhcmVudCwgZW50cnktPmRfbmFtZS5oYXNoKTsKKworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCXNwaW5fbG9jaygmZW50cnktPmRfbG9jayk7CisJX19kX3JlaGFzaChlbnRyeSwgbGlzdCk7CisJc3Bpbl91bmxvY2soJmVudHJ5LT5kX2xvY2spOworCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7Cit9CisKKyNkZWZpbmUgZG9fc3dpdGNoKHgseSkgZG8geyBcCisJX190eXBlb2ZfXyAoeCkgX190bXAgPSB4OyBcCisJeCA9IHk7IHkgPSBfX3RtcDsgfSB3aGlsZSAoMCkKKworLyoKKyAqIFdoZW4gc3dpdGNoaW5nIG5hbWVzLCB0aGUgYWN0dWFsIHN0cmluZyBkb2Vzbid0IHN0cmljdGx5IGhhdmUgdG8KKyAqIGJlIHByZXNlcnZlZCBpbiB0aGUgdGFyZ2V0IC0gYmVjYXVzZSB3ZSdyZSBkcm9wcGluZyB0aGUgdGFyZ2V0CisgKiBhbnl3YXkuIEFzIHN1Y2gsIHdlIGNhbiBqdXN0IGRvIGEgc2ltcGxlIG1lbWNweSgpIHRvIGNvcHkgb3ZlcgorICogdGhlIG5ldyBuYW1lIGJlZm9yZSB3ZSBzd2l0Y2guCisgKgorICogTm90ZSB0aGF0IHdlIGhhdmUgdG8gYmUgYSBsb3QgbW9yZSBjYXJlZnVsIGFib3V0IGdldHRpbmcgdGhlIGhhc2gKKyAqIHN3aXRjaGVkIC0gd2UgaGF2ZSB0byBzd2l0Y2ggdGhlIGhhc2ggdmFsdWUgcHJvcGVybHkgZXZlbiBpZiBpdAorICogdGhlbiBubyBsb25nZXIgbWF0Y2hlcyB0aGUgYWN0dWFsIChjb3JydXB0ZWQpIHN0cmluZyBvZiB0aGUgdGFyZ2V0LgorICogVGhlIGhhc2ggdmFsdWUgaGFzIHRvIG1hdGNoIHRoZSBoYXNoIHF1ZXVlIHRoYXQgdGhlIGRlbnRyeSBpcyBvbi4uCisgKi8KK3N0YXRpYyB2b2lkIHN3aXRjaF9uYW1lcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBkZW50cnkgKnRhcmdldCkKK3sKKwlpZiAoZG5hbWVfZXh0ZXJuYWwodGFyZ2V0KSkgeworCQlpZiAoZG5hbWVfZXh0ZXJuYWwoZGVudHJ5KSkgeworCQkJLyoKKwkJCSAqIEJvdGggZXh0ZXJuYWw6IHN3YXAgdGhlIHBvaW50ZXJzCisJCQkgKi8KKwkJCWRvX3N3aXRjaCh0YXJnZXQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBkZW50cnk6aW50ZXJuYWwsIHRhcmdldDpleHRlcm5hbC4gIFN0ZWFsIHRhcmdldCdzCisJCQkgKiBzdG9yYWdlIGFuZCBtYWtlIHRhcmdldCBpbnRlcm5hbC4KKwkJCSAqLworCQkJZGVudHJ5LT5kX25hbWUubmFtZSA9IHRhcmdldC0+ZF9uYW1lLm5hbWU7CisJCQl0YXJnZXQtPmRfbmFtZS5uYW1lID0gdGFyZ2V0LT5kX2luYW1lOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGRuYW1lX2V4dGVybmFsKGRlbnRyeSkpIHsKKwkJCS8qCisJCQkgKiBkZW50cnk6ZXh0ZXJuYWwsIHRhcmdldDppbnRlcm5hbC4gIEdpdmUgZGVudHJ5J3MKKwkJCSAqIHN0b3JhZ2UgdG8gdGFyZ2V0IGFuZCBtYWtlIGRlbnRyeSBpbnRlcm5hbAorCQkJICovCisJCQltZW1jcHkoZGVudHJ5LT5kX2luYW1lLCB0YXJnZXQtPmRfbmFtZS5uYW1lLAorCQkJCQl0YXJnZXQtPmRfbmFtZS5sZW4gKyAxKTsKKwkJCXRhcmdldC0+ZF9uYW1lLm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCQkJZGVudHJ5LT5kX25hbWUubmFtZSA9IGRlbnRyeS0+ZF9pbmFtZTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBCb3RoIGFyZSBpbnRlcm5hbC4gIEp1c3QgY29weSB0YXJnZXQgdG8gZGVudHJ5CisJCQkgKi8KKwkJCW1lbWNweShkZW50cnktPmRfaW5hbWUsIHRhcmdldC0+ZF9uYW1lLm5hbWUsCisJCQkJCXRhcmdldC0+ZF9uYW1lLmxlbiArIDEpOworCQl9CisJfQorfQorCisvKgorICogV2UgY2FubmliYWxpemUgInRhcmdldCIgd2hlbiBtb3ZpbmcgZGVudHJ5IG9uIHRvcCBvZiBpdCwKKyAqIGJlY2F1c2UgaXQncyBnb2luZyB0byBiZSB0aHJvd24gYXdheSBhbnl3YXkuIFdlIGNvdWxkIGJlIG1vcmUKKyAqIHBvbGl0ZSBhYm91dCBpdCwgdGhvdWdoLgorICoKKyAqIFRoaXMgZm9yY2VmdWwgcmVtb3ZhbCB3aWxsIHJlc3VsdCBpbiB1Z2x5IC9wcm9jIG91dHB1dCBpZgorICogc29tZWJvZHkgaG9sZHMgYSBmaWxlIG9wZW4gdGhhdCBnb3QgZGVsZXRlZCBkdWUgdG8gYSByZW5hbWUuCisgKiBXZSBjb3VsZCBiZSBuaWNlciBhYm91dCB0aGUgZGVsZXRlZCBmaWxlLCBhbmQgbGV0IGl0IHNob3cKKyAqIHVwIHVuZGVyIHRoZSBuYW1lIGl0IGdvdCBkZWxldGVkIHJhdGhlciB0aGFuIHRoZSBuYW1lIHRoYXQKKyAqIGRlbGV0ZWQgaXQuCisgKi8KKyAKKy8qKgorICogZF9tb3ZlIC0gbW92ZSBhIGRlbnRyeQorICogQGRlbnRyeTogZW50cnkgdG8gbW92ZQorICogQHRhcmdldDogbmV3IGRlbnRyeQorICoKKyAqIFVwZGF0ZSB0aGUgZGNhY2hlIHRvIHJlZmxlY3QgdGhlIG1vdmUgb2YgYSBmaWxlIG5hbWUuIE5lZ2F0aXZlCisgKiBkY2FjaGUgZW50cmllcyBzaG91bGQgbm90IGJlIG1vdmVkIGluIHRoaXMgd2F5LgorICovCisKK3ZvaWQgZF9tb3ZlKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBkZW50cnkgKiB0YXJnZXQpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmxpc3Q7CisKKwlpZiAoIWRlbnRyeS0+ZF9pbm9kZSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVkZTOiBtb3ZpbmcgbmVnYXRpdmUgZGNhY2hlIGVudHJ5XG4iKTsKKworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCXdyaXRlX3NlcWxvY2soJnJlbmFtZV9sb2NrKTsKKwkvKgorCSAqIFhYWFg6IGRvIHdlIHJlYWxseSBuZWVkIHRvIHRha2UgdGFyZ2V0LT5kX2xvY2s/CisJICovCisJaWYgKHRhcmdldCA8IGRlbnRyeSkgeworCQlzcGluX2xvY2soJnRhcmdldC0+ZF9sb2NrKTsKKwkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCXNwaW5fbG9jaygmdGFyZ2V0LT5kX2xvY2spOworCX0KKworCS8qIE1vdmUgdGhlIGRlbnRyeSB0byB0aGUgdGFyZ2V0IGhhc2ggcXVldWUsIGlmIG9uIGRpZmZlcmVudCBidWNrZXQgKi8KKwlpZiAoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX1VOSEFTSEVEKQorCQlnb3RvIGFscmVhZHlfdW5oYXNoZWQ7CisKKwlobGlzdF9kZWxfcmN1KCZkZW50cnktPmRfaGFzaCk7CisKK2FscmVhZHlfdW5oYXNoZWQ6CisJbGlzdCA9IGRfaGFzaCh0YXJnZXQtPmRfcGFyZW50LCB0YXJnZXQtPmRfbmFtZS5oYXNoKTsKKwlfX2RfcmVoYXNoKGRlbnRyeSwgbGlzdCk7CisKKwkvKiBVbmhhc2ggdGhlIHRhcmdldDogZHB1dCgpIHdpbGwgdGhlbiBnZXQgcmlkIG9mIGl0ICovCisJX19kX2Ryb3AodGFyZ2V0KTsKKworCWxpc3RfZGVsKCZkZW50cnktPmRfY2hpbGQpOworCWxpc3RfZGVsKCZ0YXJnZXQtPmRfY2hpbGQpOworCisJLyogU3dpdGNoIHRoZSBuYW1lcy4uICovCisJc3dpdGNoX25hbWVzKGRlbnRyeSwgdGFyZ2V0KTsKKwlkb19zd2l0Y2goZGVudHJ5LT5kX25hbWUubGVuLCB0YXJnZXQtPmRfbmFtZS5sZW4pOworCWRvX3N3aXRjaChkZW50cnktPmRfbmFtZS5oYXNoLCB0YXJnZXQtPmRfbmFtZS5oYXNoKTsKKworCS8qIC4uLiBhbmQgc3dpdGNoIHRoZSBwYXJlbnRzICovCisJaWYgKElTX1JPT1QoZGVudHJ5KSkgeworCQlkZW50cnktPmRfcGFyZW50ID0gdGFyZ2V0LT5kX3BhcmVudDsKKwkJdGFyZ2V0LT5kX3BhcmVudCA9IHRhcmdldDsKKwkJSU5JVF9MSVNUX0hFQUQoJnRhcmdldC0+ZF9jaGlsZCk7CisJfSBlbHNlIHsKKwkJZG9fc3dpdGNoKGRlbnRyeS0+ZF9wYXJlbnQsIHRhcmdldC0+ZF9wYXJlbnQpOworCisJCS8qIEFuZCBhZGQgdGhlbSBiYWNrIHRvIHRoZSAobmV3KSBwYXJlbnQgbGlzdHMgKi8KKwkJbGlzdF9hZGQoJnRhcmdldC0+ZF9jaGlsZCwgJnRhcmdldC0+ZF9wYXJlbnQtPmRfc3ViZGlycyk7CisJfQorCisJbGlzdF9hZGQoJmRlbnRyeS0+ZF9jaGlsZCwgJmRlbnRyeS0+ZF9wYXJlbnQtPmRfc3ViZGlycyk7CisJc3Bpbl91bmxvY2soJnRhcmdldC0+ZF9sb2NrKTsKKwlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCXdyaXRlX3NlcXVubG9jaygmcmVuYW1lX2xvY2spOworCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7Cit9CisKKy8qKgorICogZF9wYXRoIC0gcmV0dXJuIHRoZSBwYXRoIG9mIGEgZGVudHJ5CisgKiBAZGVudHJ5OiBkZW50cnkgdG8gcmVwb3J0CisgKiBAdmZzbW50OiB2ZnNtbnQgdG8gd2hpY2ggdGhlIGRlbnRyeSBiZWxvbmdzCisgKiBAcm9vdDogcm9vdCBkZW50cnkKKyAqIEByb290bW50OiB2ZnNtbnQgdG8gd2hpY2ggdGhlIHJvb3QgZGVudHJ5IGJlbG9uZ3MKKyAqIEBidWZmZXI6IGJ1ZmZlciB0byByZXR1cm4gdmFsdWUgaW4KKyAqIEBidWZsZW46IGJ1ZmZlciBsZW5ndGgKKyAqCisgKiBDb252ZXJ0IGEgZGVudHJ5IGludG8gYW4gQVNDSUkgcGF0aCBuYW1lLiBJZiB0aGUgZW50cnkgaGFzIGJlZW4gZGVsZXRlZAorICogdGhlIHN0cmluZyAiIChkZWxldGVkKSIgaXMgYXBwZW5kZWQuIE5vdGUgdGhhdCB0aGlzIGlzIGFtYmlndW91cy4KKyAqCisgKiBSZXR1cm5zIHRoZSBidWZmZXIgb3IgYW4gZXJyb3IgY29kZSBpZiB0aGUgcGF0aCB3YXMgdG9vIGxvbmcuCisgKgorICogImJ1ZmxlbiIgc2hvdWxkIGJlIHBvc2l0aXZlLiBDYWxsZXIgaG9sZHMgdGhlIGRjYWNoZV9sb2NrLgorICovCitzdGF0aWMgY2hhciAqIF9fZF9wYXRoKCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCB2ZnNtb3VudCAqdmZzbW50LAorCQkJc3RydWN0IGRlbnRyeSAqcm9vdCwgc3RydWN0IHZmc21vdW50ICpyb290bW50LAorCQkJY2hhciAqYnVmZmVyLCBpbnQgYnVmbGVuKQoreworCWNoYXIgKiBlbmQgPSBidWZmZXIrYnVmbGVuOworCWNoYXIgKiByZXR2YWw7CisJaW50IG5hbWVsZW47CisKKwkqLS1lbmQgPSAnXDAnOworCWJ1Zmxlbi0tOworCWlmICghSVNfUk9PVChkZW50cnkpICYmIGRfdW5oYXNoZWQoZGVudHJ5KSkgeworCQlidWZsZW4gLT0gMTA7CisJCWVuZCAtPSAxMDsKKwkJaWYgKGJ1ZmxlbiA8IDApCisJCQlnb3RvIEVsb25nOworCQltZW1jcHkoZW5kLCAiIChkZWxldGVkKSIsIDEwKTsKKwl9CisKKwlpZiAoYnVmbGVuIDwgMSkKKwkJZ290byBFbG9uZzsKKwkvKiBHZXQgJy8nIHJpZ2h0ICovCisJcmV0dmFsID0gZW5kLTE7CisJKnJldHZhbCA9ICcvJzsKKworCWZvciAoOzspIHsKKwkJc3RydWN0IGRlbnRyeSAqIHBhcmVudDsKKworCQlpZiAoZGVudHJ5ID09IHJvb3QgJiYgdmZzbW50ID09IHJvb3RtbnQpCisJCQlicmVhazsKKwkJaWYgKGRlbnRyeSA9PSB2ZnNtbnQtPm1udF9yb290IHx8IElTX1JPT1QoZGVudHJ5KSkgeworCQkJLyogR2xvYmFsIHJvb3Q/ICovCisJCQlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOworCQkJaWYgKHZmc21udC0+bW50X3BhcmVudCA9PSB2ZnNtbnQpIHsKKwkJCQlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CisJCQkJZ290byBnbG9iYWxfcm9vdDsKKwkJCX0KKwkJCWRlbnRyeSA9IHZmc21udC0+bW50X21vdW50cG9pbnQ7CisJCQl2ZnNtbnQgPSB2ZnNtbnQtPm1udF9wYXJlbnQ7CisJCQlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CisJCQljb250aW51ZTsKKwkJfQorCQlwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OworCQlwcmVmZXRjaChwYXJlbnQpOworCQluYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCQlidWZsZW4gLT0gbmFtZWxlbiArIDE7CisJCWlmIChidWZsZW4gPCAwKQorCQkJZ290byBFbG9uZzsKKwkJZW5kIC09IG5hbWVsZW47CisJCW1lbWNweShlbmQsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIG5hbWVsZW4pOworCQkqLS1lbmQgPSAnLyc7CisJCXJldHZhbCA9IGVuZDsKKwkJZGVudHJ5ID0gcGFyZW50OworCX0KKworCXJldHVybiByZXR2YWw7CisKK2dsb2JhbF9yb290OgorCW5hbWVsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJYnVmbGVuIC09IG5hbWVsZW47CisJaWYgKGJ1ZmxlbiA8IDApCisJCWdvdG8gRWxvbmc7CisJcmV0dmFsIC09IG5hbWVsZW4tMTsJLyogaGl0IHRoZSBzbGFzaCAqLworCW1lbWNweShyZXR2YWwsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIG5hbWVsZW4pOworCXJldHVybiByZXR2YWw7CitFbG9uZzoKKwlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKK30KKworLyogd3JpdGUgZnVsbCBwYXRobmFtZSBpbnRvIGJ1ZmZlciBhbmQgcmV0dXJuIHN0YXJ0IG9mIHBhdGhuYW1lICovCitjaGFyICogZF9wYXRoKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHZmc21vdW50ICp2ZnNtbnQsCisJCQkJY2hhciAqYnVmLCBpbnQgYnVmbGVuKQoreworCWNoYXIgKnJlczsKKwlzdHJ1Y3QgdmZzbW91bnQgKnJvb3RtbnQ7CisJc3RydWN0IGRlbnRyeSAqcm9vdDsKKworCXJlYWRfbG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCXJvb3RtbnQgPSBtbnRnZXQoY3VycmVudC0+ZnMtPnJvb3RtbnQpOworCXJvb3QgPSBkZ2V0KGN1cnJlbnQtPmZzLT5yb290KTsKKwlyZWFkX3VubG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCXJlcyA9IF9fZF9wYXRoKGRlbnRyeSwgdmZzbW50LCByb290LCByb290bW50LCBidWYsIGJ1Zmxlbik7CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwlkcHV0KHJvb3QpOworCW1udHB1dChyb290bW50KTsKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogTk9URSEgVGhlIHVzZXItbGV2ZWwgbGlicmFyeSB2ZXJzaW9uIHJldHVybnMgYQorICogY2hhcmFjdGVyIHBvaW50ZXIuIFRoZSBrZXJuZWwgc3lzdGVtIGNhbGwganVzdAorICogcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgZmlsbGVkICh3aGljaAorICogaW5jbHVkZXMgdGhlIGVuZGluZyAnXDAnIGNoYXJhY3RlciksIG9yIGEgbmVnYXRpdmUKKyAqIGVycm9yIHZhbHVlLiBTbyBsaWJjIHdvdWxkIGRvIHNvbWV0aGluZyBsaWtlCisgKgorICoJY2hhciAqZ2V0Y3dkKGNoYXIgKiBidWYsIHNpemVfdCBzaXplKQorICoJeworICoJCWludCByZXR2YWw7CisgKgorICoJCXJldHZhbCA9IHN5c19nZXRjd2QoYnVmLCBzaXplKTsKKyAqCQlpZiAocmV0dmFsID49IDApCisgKgkJCXJldHVybiBidWY7CisgKgkJZXJybm8gPSAtcmV0dmFsOworICoJCXJldHVybiBOVUxMOworICoJfQorICovCithc21saW5rYWdlIGxvbmcgc3lzX2dldGN3ZChjaGFyIF9fdXNlciAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IGVycm9yOworCXN0cnVjdCB2ZnNtb3VudCAqcHdkbW50LCAqcm9vdG1udDsKKwlzdHJ1Y3QgZGVudHJ5ICpwd2QsICpyb290OworCWNoYXIgKnBhZ2UgPSAoY2hhciAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX1VTRVIpOworCisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlYWRfbG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCXB3ZG1udCA9IG1udGdldChjdXJyZW50LT5mcy0+cHdkbW50KTsKKwlwd2QgPSBkZ2V0KGN1cnJlbnQtPmZzLT5wd2QpOworCXJvb3RtbnQgPSBtbnRnZXQoY3VycmVudC0+ZnMtPnJvb3RtbnQpOworCXJvb3QgPSBkZ2V0KGN1cnJlbnQtPmZzLT5yb290KTsKKwlyZWFkX3VubG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCisJZXJyb3IgPSAtRU5PRU5UOworCS8qIEhhcyB0aGUgY3VycmVudCBkaXJlY3RvcnkgaGFzIGJlZW4gdW5saW5rZWQ/ICovCisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJaWYgKHB3ZC0+ZF9wYXJlbnQgPT0gcHdkIHx8ICFkX3VuaGFzaGVkKHB3ZCkpIHsKKwkJdW5zaWduZWQgbG9uZyBsZW47CisJCWNoYXIgKiBjd2Q7CisKKwkJY3dkID0gX19kX3BhdGgocHdkLCBwd2RtbnQsIHJvb3QsIHJvb3RtbnQsIHBhZ2UsIFBBR0VfU0laRSk7CisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisKKwkJZXJyb3IgPSBQVFJfRVJSKGN3ZCk7CisJCWlmIChJU19FUlIoY3dkKSkKKwkJCWdvdG8gb3V0OworCisJCWVycm9yID0gLUVSQU5HRTsKKwkJbGVuID0gUEFHRV9TSVpFICsgcGFnZSAtIGN3ZDsKKwkJaWYgKGxlbiA8PSBzaXplKSB7CisJCQllcnJvciA9IGxlbjsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBjd2QsIGxlbikpCisJCQkJZXJyb3IgPSAtRUZBVUxUOworCQl9CisJfSBlbHNlCisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisKK291dDoKKwlkcHV0KHB3ZCk7CisJbW50cHV0KHB3ZG1udCk7CisJZHB1dChyb290KTsKKwltbnRwdXQocm9vdG1udCk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBUZXN0IHdoZXRoZXIgbmV3X2RlbnRyeSBpcyBhIHN1YmRpcmVjdG9yeSBvZiBvbGRfZGVudHJ5LgorICoKKyAqIFRyaXZpYWxseSBpbXBsZW1lbnRlZCB1c2luZyB0aGUgZGNhY2hlIHN0cnVjdHVyZQorICovCisKKy8qKgorICogaXNfc3ViZGlyIC0gaXMgbmV3IGRlbnRyeSBhIHN1YmRpcmVjdG9yeSBvZiBvbGRfZGVudHJ5CisgKiBAbmV3X2RlbnRyeTogbmV3IGRlbnRyeQorICogQG9sZF9kZW50cnk6IG9sZCBkZW50cnkKKyAqCisgKiBSZXR1cm5zIDEgaWYgbmV3X2RlbnRyeSBpcyBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgcGFyZW50IChhdCBhbnkgZGVwdGgpLgorICogUmV0dXJucyAwIG90aGVyd2lzZS4KKyAqIENhbGxlciBtdXN0IGVuc3VyZSB0aGF0ICJuZXdfZGVudHJ5IiBpcyBwaW5uZWQgYmVmb3JlIGNhbGxpbmcgaXNfc3ViZGlyKCkKKyAqLworICAKK2ludCBpc19zdWJkaXIoc3RydWN0IGRlbnRyeSAqIG5ld19kZW50cnksIHN0cnVjdCBkZW50cnkgKiBvbGRfZGVudHJ5KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRlbnRyeSAqIHNhdmVkID0gbmV3X2RlbnRyeTsKKwl1bnNpZ25lZCBsb25nIHNlcTsKKworCS8qIG5lZWQgcmN1X3JlYWRsb2NrIHRvIHByb3RlY3QgYWdhaW5zdCB0aGUgZF9wYXJlbnQgdHJhc2hpbmcgZHVlIHRvCisJICogZF9tb3ZlCisJICovCisJcmN1X3JlYWRfbG9jaygpOworICAgICAgICBkbyB7CisJCS8qIGZvciByZXN0YXJ0aW5nIGlubmVyIGxvb3AgaW4gY2FzZSBvZiBzZXEgcmV0cnkgKi8KKwkJbmV3X2RlbnRyeSA9IHNhdmVkOworCQlyZXN1bHQgPSAwOworCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZyZW5hbWVfbG9jayk7CisJCWZvciAoOzspIHsKKwkJCWlmIChuZXdfZGVudHJ5ICE9IG9sZF9kZW50cnkpIHsKKwkJCQlzdHJ1Y3QgZGVudHJ5ICogcGFyZW50ID0gbmV3X2RlbnRyeS0+ZF9wYXJlbnQ7CisJCQkJaWYgKHBhcmVudCA9PSBuZXdfZGVudHJ5KQorCQkJCQlicmVhazsKKwkJCQluZXdfZGVudHJ5ID0gcGFyZW50OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcmVzdWx0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmcmVuYW1lX2xvY2ssIHNlcSkpOworCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBkX2dlbm9jaWRlKHN0cnVjdCBkZW50cnkgKnJvb3QpCit7CisJc3RydWN0IGRlbnRyeSAqdGhpc19wYXJlbnQgPSByb290OworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKK3JlcGVhdDoKKwluZXh0ID0gdGhpc19wYXJlbnQtPmRfc3ViZGlycy5uZXh0OworcmVzdW1lOgorCXdoaWxlIChuZXh0ICE9ICZ0aGlzX3BhcmVudC0+ZF9zdWJkaXJzKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCA9IG5leHQ7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKwkJbmV4dCA9IHRtcC0+bmV4dDsKKwkJaWYgKGRfdW5oYXNoZWQoZGVudHJ5KXx8IWRlbnRyeS0+ZF9pbm9kZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWxpc3RfZW1wdHkoJmRlbnRyeS0+ZF9zdWJkaXJzKSkgeworCQkJdGhpc19wYXJlbnQgPSBkZW50cnk7CisJCQlnb3RvIHJlcGVhdDsKKwkJfQorCQlhdG9taWNfZGVjKCZkZW50cnktPmRfY291bnQpOworCX0KKwlpZiAodGhpc19wYXJlbnQgIT0gcm9vdCkgeworCQluZXh0ID0gdGhpc19wYXJlbnQtPmRfY2hpbGQubmV4dDsgCisJCWF0b21pY19kZWMoJnRoaXNfcGFyZW50LT5kX2NvdW50KTsKKwkJdGhpc19wYXJlbnQgPSB0aGlzX3BhcmVudC0+ZF9wYXJlbnQ7CisJCWdvdG8gcmVzdW1lOworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworfQorCisvKioKKyAqIGZpbmRfaW5vZGVfbnVtYmVyIC0gY2hlY2sgZm9yIGRlbnRyeSB3aXRoIG5hbWUKKyAqIEBkaXI6IGRpcmVjdG9yeSB0byBjaGVjaworICogQG5hbWU6IE5hbWUgdG8gZmluZC4KKyAqCisgKiBDaGVjayB3aGV0aGVyIGEgZGVudHJ5IGFscmVhZHkgZXhpc3RzIGZvciB0aGUgZ2l2ZW4gbmFtZSwKKyAqIGFuZCByZXR1cm4gdGhlIGlub2RlIG51bWJlciBpZiBpdCBoYXMgYW4gaW5vZGUuIE90aGVyd2lzZQorICogMCBpcyByZXR1cm5lZC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBwb3N0LXByb2Nlc3MgZGlyZWN0b3J5IGxpc3RpbmdzIGZvcgorICogZmlsZXN5c3RlbXMgdXNpbmcgc3ludGhldGljIGlub2RlIG51bWJlcnMsIGFuZCBpcyBuZWNlc3NhcnkKKyAqIHRvIGtlZXAgZ2V0Y3dkKCkgd29ya2luZy4KKyAqLworIAoraW5vX3QgZmluZF9pbm9kZV9udW1iZXIoc3RydWN0IGRlbnRyeSAqZGlyLCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5OworCWlub190IGlubyA9IDA7CisKKwkvKgorCSAqIENoZWNrIGZvciBhIGZzLXNwZWNpZmljIGhhc2ggZnVuY3Rpb24uIE5vdGUgdGhhdCB3ZSBtdXN0CisJICogY2FsY3VsYXRlIHRoZSBzdGFuZGFyZCBoYXNoIGZpcnN0LCBhcyB0aGUgZF9vcC0+ZF9oYXNoKCkKKwkgKiByb3V0aW5lIG1heSBjaG9vc2UgdG8gbGVhdmUgdGhlIGhhc2ggdmFsdWUgdW5jaGFuZ2VkLgorCSAqLworCW5hbWUtPmhhc2ggPSBmdWxsX25hbWVfaGFzaChuYW1lLT5uYW1lLCBuYW1lLT5sZW4pOworCWlmIChkaXItPmRfb3AgJiYgZGlyLT5kX29wLT5kX2hhc2gpCisJeworCQlpZiAoZGlyLT5kX29wLT5kX2hhc2goZGlyLCBuYW1lKSAhPSAwKQorCQkJZ290byBvdXQ7CisJfQorCisJZGVudHJ5ID0gZF9sb29rdXAoZGlyLCBuYW1lKTsKKwlpZiAoZGVudHJ5KQorCXsKKwkJaWYgKGRlbnRyeS0+ZF9pbm9kZSkKKwkJCWlubyA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9pbm87CisJCWRwdXQoZGVudHJ5KTsKKwl9CitvdXQ6CisJcmV0dXJuIGlubzsKK30KKworc3RhdGljIF9faW5pdGRhdGEgdW5zaWduZWQgbG9uZyBkaGFzaF9lbnRyaWVzOworc3RhdGljIGludCBfX2luaXQgc2V0X2RoYXNoX2VudHJpZXMoY2hhciAqc3RyKQoreworCWlmICghc3RyKQorCQlyZXR1cm4gMDsKKwlkaGFzaF9lbnRyaWVzID0gc2ltcGxlX3N0cnRvdWwoc3RyLCAmc3RyLCAwKTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImRoYXNoX2VudHJpZXM9Iiwgc2V0X2RoYXNoX2VudHJpZXMpOworCitzdGF0aWMgdm9pZCBfX2luaXQgZGNhY2hlX2luaXRfZWFybHkodm9pZCkKK3sKKwlpbnQgbG9vcDsKKworCS8qIElmIGhhc2hlcyBhcmUgZGlzdHJpYnV0ZWQgYWNyb3NzIE5VTUEgbm9kZXMsIGRlZmVyCisJICogaGFzaCBhbGxvY2F0aW9uIHVudGlsIHZtYWxsb2Mgc3BhY2UgaXMgYXZhaWxhYmxlLgorCSAqLworCWlmIChoYXNoZGlzdCkKKwkJcmV0dXJuOworCisJZGVudHJ5X2hhc2h0YWJsZSA9CisJCWFsbG9jX2xhcmdlX3N5c3RlbV9oYXNoKCJEZW50cnkgY2FjaGUiLAorCQkJCQlzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpLAorCQkJCQlkaGFzaF9lbnRyaWVzLAorCQkJCQkxMywKKwkJCQkJSEFTSF9FQVJMWSwKKwkJCQkJJmRfaGFzaF9zaGlmdCwKKwkJCQkJJmRfaGFzaF9tYXNrLAorCQkJCQkwKTsKKworCWZvciAobG9vcCA9IDA7IGxvb3AgPCAoMSA8PCBkX2hhc2hfc2hpZnQpOyBsb29wKyspCisJCUlOSVRfSExJU1RfSEVBRCgmZGVudHJ5X2hhc2h0YWJsZVtsb29wXSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkY2FjaGVfaW5pdCh1bnNpZ25lZCBsb25nIG1lbXBhZ2VzKQoreworCWludCBsb29wOworCisJLyogCisJICogQSBjb25zdHJ1Y3RvciBjb3VsZCBiZSBhZGRlZCBmb3Igc3RhYmxlIHN0YXRlIGxpa2UgdGhlIGxpc3RzLAorCSAqIGJ1dCBpdCBpcyBwcm9iYWJseSBub3Qgd29ydGggaXQgYmVjYXVzZSBvZiB0aGUgY2FjaGUgbmF0dXJlCisJICogb2YgdGhlIGRjYWNoZS4gCisJICovCisJZGVudHJ5X2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImRlbnRyeV9jYWNoZSIsCisJCQkJCSBzaXplb2Yoc3RydWN0IGRlbnRyeSksCisJCQkJCSAwLAorCQkJCQkgU0xBQl9SRUNMQUlNX0FDQ09VTlR8U0xBQl9QQU5JQywKKwkJCQkJIE5VTEwsIE5VTEwpOworCQorCXNldF9zaHJpbmtlcihERUZBVUxUX1NFRUtTLCBzaHJpbmtfZGNhY2hlX21lbW9yeSk7CisKKwkvKiBIYXNoIG1heSBoYXZlIGJlZW4gc2V0IHVwIGluIGRjYWNoZV9pbml0X2Vhcmx5ICovCisJaWYgKCFoYXNoZGlzdCkKKwkJcmV0dXJuOworCisJZGVudHJ5X2hhc2h0YWJsZSA9CisJCWFsbG9jX2xhcmdlX3N5c3RlbV9oYXNoKCJEZW50cnkgY2FjaGUiLAorCQkJCQlzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpLAorCQkJCQlkaGFzaF9lbnRyaWVzLAorCQkJCQkxMywKKwkJCQkJMCwKKwkJCQkJJmRfaGFzaF9zaGlmdCwKKwkJCQkJJmRfaGFzaF9tYXNrLAorCQkJCQkwKTsKKworCWZvciAobG9vcCA9IDA7IGxvb3AgPCAoMSA8PCBkX2hhc2hfc2hpZnQpOyBsb29wKyspCisJCUlOSVRfSExJU1RfSEVBRCgmZGVudHJ5X2hhc2h0YWJsZVtsb29wXSk7Cit9CisKKy8qIFNMQUIgY2FjaGUgZm9yIF9fZ2V0bmFtZSgpIGNvbnN1bWVycyAqLwora21lbV9jYWNoZV90ICpuYW1lc19jYWNoZXA7CisKKy8qIFNMQUIgY2FjaGUgZm9yIGZpbGUgc3RydWN0dXJlcyAqLwora21lbV9jYWNoZV90ICpmaWxwX2NhY2hlcDsKKworRVhQT1JUX1NZTUJPTChkX2dlbm9jaWRlKTsKKworZXh0ZXJuIHZvaWQgYmRldl9jYWNoZV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgY2hyZGV2X2luaXQodm9pZCk7CisKK3ZvaWQgX19pbml0IHZmc19jYWNoZXNfaW5pdF9lYXJseSh2b2lkKQoreworCWRjYWNoZV9pbml0X2Vhcmx5KCk7CisJaW5vZGVfaW5pdF9lYXJseSgpOworfQorCit2b2lkIF9faW5pdCB2ZnNfY2FjaGVzX2luaXQodW5zaWduZWQgbG9uZyBtZW1wYWdlcykKK3sKKwl1bnNpZ25lZCBsb25nIHJlc2VydmU7CisKKwkvKiBCYXNlIGhhc2ggc2l6ZXMgb24gYXZhaWxhYmxlIG1lbW9yeSwgd2l0aCBhIHJlc2VydmUgZXF1YWwgdG8KKyAgICAgICAgICAgMTUwJSBvZiBjdXJyZW50IGtlcm5lbCBzaXplICovCisKKwlyZXNlcnZlID0gbWluKChtZW1wYWdlcyAtIG5yX2ZyZWVfcGFnZXMoKSkgKiAzLzIsIG1lbXBhZ2VzIC0gMSk7CisJbWVtcGFnZXMgLT0gcmVzZXJ2ZTsKKworCW5hbWVzX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJuYW1lc19jYWNoZSIsIFBBVEhfTUFYLCAwLAorCQkJU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfUEFOSUMsIE5VTEwsIE5VTEwpOworCisJZmlscF9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZmlscCIsIHNpemVvZihzdHJ1Y3QgZmlsZSksIDAsCisJCQlTTEFCX0hXQ0FDSEVfQUxJR058U0xBQl9QQU5JQywgZmlscF9jdG9yLCBmaWxwX2R0b3IpOworCisJZGNhY2hlX2luaXQobWVtcGFnZXMpOworCWlub2RlX2luaXQobWVtcGFnZXMpOworCWZpbGVzX2luaXQobWVtcGFnZXMpOworCW1udF9pbml0KG1lbXBhZ2VzKTsKKwliZGV2X2NhY2hlX2luaXQoKTsKKwljaHJkZXZfaW5pdCgpOworfQorCitFWFBPUlRfU1lNQk9MKGRfYWxsb2MpOworRVhQT1JUX1NZTUJPTChkX2FsbG9jX2Fub24pOworRVhQT1JUX1NZTUJPTChkX2FsbG9jX3Jvb3QpOworRVhQT1JUX1NZTUJPTChkX2RlbGV0ZSk7CitFWFBPUlRfU1lNQk9MKGRfZmluZF9hbGlhcyk7CitFWFBPUlRfU1lNQk9MKGRfaW5zdGFudGlhdGUpOworRVhQT1JUX1NZTUJPTChkX2ludmFsaWRhdGUpOworRVhQT1JUX1NZTUJPTChkX2xvb2t1cCk7CitFWFBPUlRfU1lNQk9MKGRfbW92ZSk7CitFWFBPUlRfU1lNQk9MKGRfcGF0aCk7CitFWFBPUlRfU1lNQk9MKGRfcHJ1bmVfYWxpYXNlcyk7CitFWFBPUlRfU1lNQk9MKGRfcmVoYXNoKTsKK0VYUE9SVF9TWU1CT0woZF9zcGxpY2VfYWxpYXMpOworRVhQT1JUX1NZTUJPTChkX3ZhbGlkYXRlKTsKK0VYUE9SVF9TWU1CT0woZGdldF9sb2NrZWQpOworRVhQT1JUX1NZTUJPTChkcHV0KTsKK0VYUE9SVF9TWU1CT0woZmluZF9pbm9kZV9udW1iZXIpOworRVhQT1JUX1NZTUJPTChoYXZlX3N1Ym1vdW50cyk7CitFWFBPUlRfU1lNQk9MKG5hbWVzX2NhY2hlcCk7CitFWFBPUlRfU1lNQk9MKHNocmlua19kY2FjaGVfcGFyZW50KTsKK0VYUE9SVF9TWU1CT0woc2hyaW5rX2RjYWNoZV9zYik7CmRpZmYgLS1naXQgYS9mcy9kY29va2llcy5jIGIvZnMvZGNvb2tpZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODFhYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZGNvb2tpZXMuYwpAQCAtMCwwICsxLDMzMCBAQAorLyoKKyAqIGRjb29raWVzLmMKKyAqCisgKiBDb3B5cmlnaHQgMjAwMiBKb2huIExldm9uIDxsZXZvbkBtb3ZlbWVudGFyaWFuLm9yZz4KKyAqCisgKiBQZXJzaXN0ZW50IGNvb2tpZS1wYXRoIG1hcHBpbmdzLiBUaGVzZSBhcmUgdXNlZCBieQorICogcHJvZmlsZXJzIHRvIGNvbnZlcnQgYSBwZXItdGFzayBFSVAgdmFsdWUgaW50byBzb21ldGhpbmcKKyAqIG5vbi10cmFuc2l0b3J5IHRoYXQgY2FuIGJlIHByb2Nlc3NlZCBhdCBhIGxhdGVyIGRhdGUuCisgKiBUaGlzIGlzIGRvbmUgYnkgbG9ja2luZyB0aGUgZGVudHJ5L3Zmc21udCBwYWlyIGluIHRoZQorICoga2VybmVsIHVudGlsIHJlbGVhc2VkIGJ5IHRoZSB0YXNrcyBuZWVkaW5nIHRoZSBwZXJzaXN0ZW50CisgKiBvYmplY3RzLiBUaGUgdGFnIGlzIHNpbXBseSBhbiB1bnNpZ25lZCBsb25nIHRoYXQgcmVmZXJzCisgKiB0byB0aGUgcGFpciBhbmQgY2FuIGJlIGxvb2tlZCB1cCBmcm9tIHVzZXJzcGFjZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Rjb29raWVzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogVGhlIGRjb29raWVzIGFyZSBhbGxvY2F0ZWQgZnJvbSBhIGttZW1fY2FjaGUgYW5kCisgKiBoYXNoZWQgb250byBhIHNtYWxsIG51bWJlciBvZiBsaXN0cy4gTm9uZSBvZiB0aGUKKyAqIGNvZGUgaGVyZSBpcyBwYXJ0aWN1bGFybHkgcGVyZm9ybWFuY2UgY3JpdGljYWwKKyAqLworc3RydWN0IGRjb29raWVfc3RydWN0IHsKKwlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5OworCXN0cnVjdCB2ZnNtb3VudCAqIHZmc21udDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhhc2hfbGlzdDsKK307CisKK3N0YXRpYyBMSVNUX0hFQUQoZGNvb2tpZV91c2Vycyk7CitzdGF0aWMgREVDTEFSRV9NVVRFWChkY29va2llX3NlbSk7CitzdGF0aWMga21lbV9jYWNoZV90ICogZGNvb2tpZV9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICogZGNvb2tpZV9oYXNodGFibGU7CitzdGF0aWMgc2l6ZV90IGhhc2hfc2l6ZTsKKworc3RhdGljIGlubGluZSBpbnQgaXNfbGl2ZSh2b2lkKQoreworCXJldHVybiAhKGxpc3RfZW1wdHkoJmRjb29raWVfdXNlcnMpKTsKK30KKworCisvKiBUaGUgZGVudHJ5IGlzIGxvY2tlZCwgaXRzIGFkZHJlc3Mgd2lsbCBkbyBmb3IgdGhlIGNvb2tpZSAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGRjb29raWVfdmFsdWUoc3RydWN0IGRjb29raWVfc3RydWN0ICogZGNzKQoreworCXJldHVybiAodW5zaWduZWQgbG9uZylkY3MtPmRlbnRyeTsKK30KKworCitzdGF0aWMgc2l6ZV90IGRjb29raWVfaGFzaCh1bnNpZ25lZCBsb25nIGRjb29raWUpCit7CisJcmV0dXJuIChkY29va2llID4+IEwxX0NBQ0hFX1NISUZUKSAmIChoYXNoX3NpemUgLSAxKTsKK30KKworCitzdGF0aWMgc3RydWN0IGRjb29raWVfc3RydWN0ICogZmluZF9kY29va2llKHVuc2lnbmVkIGxvbmcgZGNvb2tpZSkKK3sKKwlzdHJ1Y3QgZGNvb2tpZV9zdHJ1Y3QgKmZvdW5kID0gTlVMTDsKKwlzdHJ1Y3QgZGNvb2tpZV9zdHJ1Y3QgKiBkY3M7CisJc3RydWN0IGxpc3RfaGVhZCAqIHBvczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICogbGlzdDsKKworCWxpc3QgPSBkY29va2llX2hhc2h0YWJsZSArIGRjb29raWVfaGFzaChkY29va2llKTsKKworCWxpc3RfZm9yX2VhY2gocG9zLCBsaXN0KSB7CisJCWRjcyA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgZGNvb2tpZV9zdHJ1Y3QsIGhhc2hfbGlzdCk7CisJCWlmIChkY29va2llX3ZhbHVlKGRjcykgPT0gZGNvb2tpZSkgeworCQkJZm91bmQgPSBkY3M7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBmb3VuZDsKK30KKworCitzdGF0aWMgdm9pZCBoYXNoX2Rjb29raWUoc3RydWN0IGRjb29raWVfc3RydWN0ICogZGNzKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKiBsaXN0ID0gZGNvb2tpZV9oYXNodGFibGUgKyBkY29va2llX2hhc2goZGNvb2tpZV92YWx1ZShkY3MpKTsKKwlsaXN0X2FkZCgmZGNzLT5oYXNoX2xpc3QsIGxpc3QpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZGNvb2tpZV9zdHJ1Y3QgKiBhbGxvY19kY29va2llKHN0cnVjdCBkZW50cnkgKiBkZW50cnksCisJc3RydWN0IHZmc21vdW50ICogdmZzbW50KQoreworCXN0cnVjdCBkY29va2llX3N0cnVjdCAqIGRjcyA9IGttZW1fY2FjaGVfYWxsb2MoZGNvb2tpZV9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkY3MpCisJCXJldHVybiBOVUxMOworCisJYXRvbWljX2luYygmZGVudHJ5LT5kX2NvdW50KTsKKwlhdG9taWNfaW5jKCZ2ZnNtbnQtPm1udF9jb3VudCk7CisJZGVudHJ5LT5kX2Nvb2tpZSA9IGRjczsKKworCWRjcy0+ZGVudHJ5ID0gZGVudHJ5OworCWRjcy0+dmZzbW50ID0gdmZzbW50OworCWhhc2hfZGNvb2tpZShkY3MpOworCisJcmV0dXJuIGRjczsKK30KKworCisvKiBUaGlzIGlzIHRoZSBtYWluIGtlcm5lbC1zaWRlIHJvdXRpbmUgdGhhdCByZXRyaWV2ZXMgdGhlIGNvb2tpZQorICogdmFsdWUgZm9yIGEgZGVudHJ5L3Zmc21udCBwYWlyLgorICovCitpbnQgZ2V0X2Rjb29raWUoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IHZmc21vdW50ICogdmZzbW50LAorCXVuc2lnbmVkIGxvbmcgKiBjb29raWUpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGRjb29raWVfc3RydWN0ICogZGNzOworCisJZG93bigmZGNvb2tpZV9zZW0pOworCisJaWYgKCFpc19saXZlKCkpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJZGNzID0gZGVudHJ5LT5kX2Nvb2tpZTsKKworCWlmICghZGNzKQorCQlkY3MgPSBhbGxvY19kY29va2llKGRlbnRyeSwgdmZzbW50KTsKKworCWlmICghZGNzKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCSpjb29raWUgPSBkY29va2llX3ZhbHVlKGRjcyk7CisKK291dDoKKwl1cCgmZGNvb2tpZV9zZW0pOworCXJldHVybiBlcnI7Cit9CisKKworLyogQW5kIGhlcmUgaXMgd2hlcmUgdGhlIHVzZXJzcGFjZSBwcm9jZXNzIGNhbiBsb29rIHVwIHRoZSBjb29raWUgdmFsdWUKKyAqIHRvIHJldHJpZXZlIHRoZSBwYXRoLgorICovCithc21saW5rYWdlIGxvbmcgc3lzX2xvb2t1cF9kY29va2llKHU2NCBjb29raWU2NCwgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBjb29raWUgPSAodW5zaWduZWQgbG9uZyljb29raWU2NDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKwljaGFyICoga2J1ZjsKKwljaGFyICogcGF0aDsKKwlzaXplX3QgcGF0aGxlbjsKKwlzdHJ1Y3QgZGNvb2tpZV9zdHJ1Y3QgKiBkY3M7CisKKwkvKiB3ZSBjb3VsZCBsZWFrIHBhdGggaW5mb3JtYXRpb24gdG8gdXNlcnMKKwkgKiB3aXRob3V0IGRpciByZWFkIHBlcm1pc3Npb24gd2l0aG91dCB0aGlzCisJICovCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJZG93bigmZGNvb2tpZV9zZW0pOworCisJaWYgKCFpc19saXZlKCkpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCEoZGNzID0gZmluZF9kY29va2llKGNvb2tpZSkpKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FTk9NRU07CisJa2J1ZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtidWYpCisJCWdvdG8gb3V0OworCisJLyogRklYTUU6IChkZWxldGVkKSA/ICovCisJcGF0aCA9IGRfcGF0aChkY3MtPmRlbnRyeSwgZGNzLT52ZnNtbnQsIGtidWYsIFBBR0VfU0laRSk7CisKKwlpZiAoSVNfRVJSKHBhdGgpKSB7CisJCWVyciA9IFBUUl9FUlIocGF0aCk7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJZXJyID0gLUVSQU5HRTsKKyAKKwlwYXRobGVuID0ga2J1ZiArIFBBR0VfU0laRSAtIHBhdGg7CisJaWYgKHBhdGhsZW4gPD0gbGVuKSB7CisJCWVyciA9IHBhdGhsZW47CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBwYXRoLCBwYXRobGVuKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisJfQorCitvdXRfZnJlZToKKwlrZnJlZShrYnVmKTsKK291dDoKKwl1cCgmZGNvb2tpZV9zZW0pOworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCBkY29va2llX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICogZDsKKwl1bnNpZ25lZCBpbnQgaSwgaGFzaF9iaXRzOworCWludCBlcnIgPSAtRU5PTUVNOworCisJZGNvb2tpZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJkY29va2llX2NhY2hlIiwKKwkJc2l6ZW9mKHN0cnVjdCBkY29va2llX3N0cnVjdCksCisJCTAsIDAsIE5VTEwsIE5VTEwpOworCisJaWYgKCFkY29va2llX2NhY2hlKQorCQlnb3RvIG91dDsKKworCWRjb29raWVfaGFzaHRhYmxlID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghZGNvb2tpZV9oYXNodGFibGUpCisJCWdvdG8gb3V0X2ttZW07CisKKwllcnIgPSAwOworCisJLyoKKwkgKiBGaW5kIHRoZSBwb3dlci1vZi10d28gbGlzdC1oZWFkcyB0aGF0IGNhbiBmaXQgaW50byB0aGUgYWxsb2NhdGlvbi4uCisJICogV2UgZG9uJ3QgZ3VhcmFudGVlIHRoYXQgInNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSIgaXMgbmVjZXNzYXJpbHkKKwkgKiBhIHBvd2VyLW9mLXR3by4KKwkgKi8KKwloYXNoX3NpemUgPSBQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCk7CisJaGFzaF9iaXRzID0gMDsKKwlkbyB7CisJCWhhc2hfYml0cysrOworCX0gd2hpbGUgKChoYXNoX3NpemUgPj4gaGFzaF9iaXRzKSAhPSAwKTsKKwloYXNoX2JpdHMtLTsKKworCS8qCisJICogUmUtY2FsY3VsYXRlIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGVudHJpZXMgYW5kIHRoZSBtYXNrCisJICogZnJvbSB0aGUgbnVtYmVyIG9mIGJpdHMgd2UgY2FuIGZpdC4KKwkgKi8KKwloYXNoX3NpemUgPSAxVUwgPDwgaGFzaF9iaXRzOworCisJLyogQW5kIGluaXRpYWxpemUgdGhlIG5ld2x5IGFsbG9jYXRlZCBhcnJheSAqLworCWQgPSBkY29va2llX2hhc2h0YWJsZTsKKwlpID0gaGFzaF9zaXplOworCWRvIHsKKwkJSU5JVF9MSVNUX0hFQUQoZCk7CisJCWQrKzsKKwkJaS0tOworCX0gd2hpbGUgKGkpOworCitvdXQ6CisJcmV0dXJuIGVycjsKK291dF9rbWVtOgorCWttZW1fY2FjaGVfZGVzdHJveShkY29va2llX2NhY2hlKTsKKwlnb3RvIG91dDsKK30KKworCitzdGF0aWMgdm9pZCBmcmVlX2Rjb29raWUoc3RydWN0IGRjb29raWVfc3RydWN0ICogZGNzKQoreworCWRjcy0+ZGVudHJ5LT5kX2Nvb2tpZSA9IE5VTEw7CisJZHB1dChkY3MtPmRlbnRyeSk7CisJbW50cHV0KGRjcy0+dmZzbW50KTsKKwlrbWVtX2NhY2hlX2ZyZWUoZGNvb2tpZV9jYWNoZSwgZGNzKTsKK30KKworCitzdGF0aWMgdm9pZCBkY29va2llX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICogbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICogcG9zOworCXN0cnVjdCBsaXN0X2hlYWQgKiBwb3MyOworCXN0cnVjdCBkY29va2llX3N0cnVjdCAqIGRjczsKKwlzaXplX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBoYXNoX3NpemU7ICsraSkgeworCQlsaXN0ID0gZGNvb2tpZV9oYXNodGFibGUgKyBpOworCQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBwb3MyLCBsaXN0KSB7CisJCQlkY3MgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGRjb29raWVfc3RydWN0LCBoYXNoX2xpc3QpOworCQkJbGlzdF9kZWwoJmRjcy0+aGFzaF9saXN0KTsKKwkJCWZyZWVfZGNvb2tpZShkY3MpOworCQl9CisJfQorCisJa2ZyZWUoZGNvb2tpZV9oYXNodGFibGUpOworCWttZW1fY2FjaGVfZGVzdHJveShkY29va2llX2NhY2hlKTsKK30KKworCitzdHJ1Y3QgZGNvb2tpZV91c2VyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5leHQ7Cit9OworIAorc3RydWN0IGRjb29raWVfdXNlciAqIGRjb29raWVfcmVnaXN0ZXIodm9pZCkKK3sKKwlzdHJ1Y3QgZGNvb2tpZV91c2VyICogdXNlcjsKKworCWRvd24oJmRjb29raWVfc2VtKTsKKworCXVzZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGNvb2tpZV91c2VyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1c2VyKQorCQlnb3RvIG91dDsKKworCWlmICghaXNfbGl2ZSgpICYmIGRjb29raWVfaW5pdCgpKQorCQlnb3RvIG91dF9mcmVlOworCisJbGlzdF9hZGQoJnVzZXItPm5leHQsICZkY29va2llX3VzZXJzKTsKKworb3V0OgorCXVwKCZkY29va2llX3NlbSk7CisJcmV0dXJuIHVzZXI7CitvdXRfZnJlZToKKwlrZnJlZSh1c2VyKTsKKwl1c2VyID0gTlVMTDsKKwlnb3RvIG91dDsKK30KKworCit2b2lkIGRjb29raWVfdW5yZWdpc3RlcihzdHJ1Y3QgZGNvb2tpZV91c2VyICogdXNlcikKK3sKKwlkb3duKCZkY29va2llX3NlbSk7CisKKwlsaXN0X2RlbCgmdXNlci0+bmV4dCk7CisJa2ZyZWUodXNlcik7CisKKwlpZiAoIWlzX2xpdmUoKSkKKwkJZGNvb2tpZV9leGl0KCk7CisKKwl1cCgmZGNvb2tpZV9zZW0pOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChkY29va2llX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGRjb29raWVfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MX0dQTChnZXRfZGNvb2tpZSk7CmRpZmYgLS1naXQgYS9mcy9kZWJ1Z2ZzL01ha2VmaWxlIGIvZnMvZGVidWdmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDBjNDU2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZGVidWdmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDQgQEAKK2RlYnVnZnMtb2Jqcwk6PSBpbm9kZS5vIGZpbGUubworCitvYmotJChDT05GSUdfREVCVUdfRlMpCSs9IGRlYnVnZnMubworCmRpZmYgLS1naXQgYS9mcy9kZWJ1Z2ZzL2ZpbGUuYyBiL2ZzL2RlYnVnZnMvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ODU1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9kZWJ1Z2ZzL2ZpbGUuYwpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqICBmaWxlLmMgLSBwYXJ0IG9mIGRlYnVnZnMsIGEgdGlueSBsaXR0bGUgZGVidWcgZmlsZSBzeXN0ZW0KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IElCTSBJbmMuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICoJMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgZGVidWdmcyBpcyBmb3IgcGVvcGxlIHRvIHVzZSBpbnN0ZWFkIG9mIC9wcm9jIG9yIC9zeXMuCisgKiAgU2VlIERvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisKK3N0YXRpYyBzc2l6ZV90IGRlZmF1bHRfcmVhZF9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgZGVmYXVsdF93cml0ZV9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBkZWZhdWx0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGlub2RlLT51LmdlbmVyaWNfaXApCisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT51LmdlbmVyaWNfaXA7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z2ZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZCA9CQlkZWZhdWx0X3JlYWRfZmlsZSwKKwkud3JpdGUgPQlkZWZhdWx0X3dyaXRlX2ZpbGUsCisJLm9wZW4gPQkJZGVmYXVsdF9vcGVuLAorfTsKKworI2RlZmluZSBzaW1wbGVfdHlwZSh0eXBlLCBmb3JtYXQsIHRlbXB0eXBlLCBzdHJ0b2xmbikJCQkJXAorc3RhdGljIHNzaXplX3QgcmVhZF9maWxlXyMjdHlwZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAlcCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCQkJXAorewkJCQkJCQkJCQlcCisJY2hhciBidWZbMzJdOwkJCQkJCQkJXAorCXR5cGUgKnZhbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsJCQkJCQlcCisJCQkJCQkJCQkJXAorCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCAiXG4iLCAqdmFsKTsJCQkJXAorCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1Ziwgc3RybGVuKGJ1ZikpO1wKK30JCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgd3JpdGVfZmlsZV8jI3R5cGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZixcCisJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQkJCVwKK3sJCQkJCQkJCQkJXAorCWNoYXIgKmVuZHA7CQkJCQkJCQlcCisJY2hhciBidWZbMzJdOwkJCQkJCQkJXAorCWludCBidWZfc2l6ZTsJCQkJCQkJCVwKKwl0eXBlICp2YWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CQkJCQkJXAorCXRlbXB0eXBlIHRtcDsJCQkJCQkJCVwKKwkJCQkJCQkJCQlcCisJbWVtc2V0KGJ1ZiwgMHgwMCwgc2l6ZW9mKGJ1ZikpOwkJCQkJCVwKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgKHNpemVvZihidWYpLTEpKTsJCQkJCVwKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQkJCQlcCisJCXJldHVybiAtRUZBVUxUOwkJCQkJCQlcCisJCQkJCQkJCQkJXAorCXRtcCA9IHN0cnRvbGZuKGJ1ZiwgJmVuZHAsIDApOwkJCQkJCVwKKwlpZiAoKGVuZHAgPT0gYnVmKSB8fCAoKHR5cGUpdG1wICE9IHRtcCkpCQkJCVwKKwkJcmV0dXJuIC1FSU5WQUw7CQkJCQkJCVwKKwkqdmFsID0gdG1wOwkJCQkJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJCVwKK30JCQkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc18jI3R5cGUgPSB7CQkJCQlcCisJLnJlYWQgPQkJcmVhZF9maWxlXyMjdHlwZSwJCQkJCVwKKwkud3JpdGUgPQl3cml0ZV9maWxlXyMjdHlwZSwJCQkJCVwKKwkub3BlbiA9CQlkZWZhdWx0X29wZW4sCQkJCQkJXAorfTsKK3NpbXBsZV90eXBlKHU4LCAiJWMiLCB1bnNpZ25lZCBsb25nLCBzaW1wbGVfc3RydG91bCk7CitzaW1wbGVfdHlwZSh1MTYsICIlaGkiLCB1bnNpZ25lZCBsb25nLCBzaW1wbGVfc3RydG91bCk7CitzaW1wbGVfdHlwZSh1MzIsICIlaSIsIHVuc2lnbmVkIGxvbmcsIHNpbXBsZV9zdHJ0b3VsKTsKKworLyoqCisgKiBkZWJ1Z2ZzX2NyZWF0ZV91OCAtIGNyZWF0ZSBhIGZpbGUgaW4gdGhlIGRlYnVnZnMgZmlsZXN5c3RlbSB0aGF0IGlzIHVzZWQgdG8gcmVhZCBhbmQgd3JpdGUgYSB1bnNpZ25lZCA4IGJpdCB2YWx1ZS4KKyAqCisgKiBAbmFtZTogYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlLgorICogQG1vZGU6IHRoZSBwZXJtaXNzaW9uIHRoYXQgdGhlIGZpbGUgc2hvdWxkIGhhdmUKKyAqIEBwYXJlbnQ6IGEgcG9pbnRlciB0byB0aGUgcGFyZW50IGRlbnRyeSBmb3IgdGhpcyBmaWxlLiAgVGhpcyBzaG91bGQgYmUgYQorICogICAgICAgICAgZGlyZWN0b3J5IGRlbnRyeSBpZiBzZXQuICBJZiB0aGlzIHBhcmFtYXRlciBpcyBOVUxMLCB0aGVuIHRoZQorICogICAgICAgICAgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIGRlYnVnZnMgZmlsZXN5c3RlbS4KKyAqIEB2YWx1ZTogYSBwb2ludGVyIHRvIHRoZSB2YXJpYWJsZSB0aGF0IHRoZSBmaWxlIHNob3VsZCByZWFkIHRvIGFuZCB3cml0ZQorICogICAgICAgICBmcm9tLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGZpbGUgaW4gZGVidWdmcyB3aXRoIHRoZSBnaXZlbiBuYW1lIHRoYXQKKyAqIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgQHZhbHVlLiAgSWYgdGhlIEBtb2RlIHZhcmlhYmxlIGlzIHNvCisgKiBzZXQsIGl0IGNhbiBiZSByZWFkIGZyb20sIGFuZCB3cml0dGVuIHRvLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBwb2ludGVyIHRvIGEgZGVudHJ5IGlmIGl0IHN1Y2NlZWRzLiAgVGhpcworICogcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byB0aGUgZGVidWdmc19yZW1vdmUoKSBmdW5jdGlvbiB3aGVuIHRoZSBmaWxlIGlzCisgKiB0byBiZSByZW1vdmVkIChubyBhdXRvbWF0aWMgY2xlYW51cCBoYXBwZW5zIGlmIHlvdXIgbW9kdWxlIGlzIHVubG9hZGVkLAorICogeW91IGFyZSByZXNwb25zaWJsZSBoZXJlLikgIElmIGFuIGVycm9yIG9jY3VycywgTlVMTCB3aWxsIGJlIHJldHVybmVkLgorICoKKyAqIElmIGRlYnVnZnMgaXMgbm90IGVuYWJsZWQgaW4gdGhlIGtlcm5lbCwgdGhlIHZhbHVlIC1FTk9ERVYgd2lsbCBiZQorICogcmV0dXJuZWQuICBJdCBpcyBub3Qgd2lzZSB0byBjaGVjayBmb3IgdGhpcyB2YWx1ZSwgYnV0IHJhdGhlciwgY2hlY2sgZm9yCisgKiBOVUxMIG9yICFOVUxMIGluc3RlYWQgYXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciAjaWZkZWYgaW4gdGhlIGNhbGxpbmcKKyAqIGNvZGUuCisgKi8KK3N0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX3U4KGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAorCQkJCSBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHU4ICp2YWx1ZSkKK3sKKwlyZXR1cm4gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBtb2RlLCBwYXJlbnQsIHZhbHVlLCAmZm9wc191OCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZWJ1Z2ZzX2NyZWF0ZV91OCk7CisKKy8qKgorICogZGVidWdmc19jcmVhdGVfdTE2IC0gY3JlYXRlIGEgZmlsZSBpbiB0aGUgZGVidWdmcyBmaWxlc3lzdGVtIHRoYXQgaXMgdXNlZCB0byByZWFkIGFuZCB3cml0ZSBhIHVuc2lnbmVkIDggYml0IHZhbHVlLgorICoKKyAqIEBuYW1lOiBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjcmVhdGUuCisgKiBAbW9kZTogdGhlIHBlcm1pc3Npb24gdGhhdCB0aGUgZmlsZSBzaG91bGQgaGF2ZQorICogQHBhcmVudDogYSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgZGVudHJ5IGZvciB0aGlzIGZpbGUuICBUaGlzIHNob3VsZCBiZSBhCisgKiAgICAgICAgICBkaXJlY3RvcnkgZGVudHJ5IGlmIHNldC4gIElmIHRoaXMgcGFyYW1hdGVyIGlzIE5VTEwsIHRoZW4gdGhlCisgKiAgICAgICAgICBmaWxlIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgcm9vdCBvZiB0aGUgZGVidWdmcyBmaWxlc3lzdGVtLgorICogQHZhbHVlOiBhIHBvaW50ZXIgdG8gdGhlIHZhcmlhYmxlIHRoYXQgdGhlIGZpbGUgc2hvdWxkIHJlYWQgdG8gYW5kIHdyaXRlCisgKiAgICAgICAgIGZyb20uCisgKgorICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgZmlsZSBpbiBkZWJ1Z2ZzIHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdAorICogY29udGFpbnMgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBAdmFsdWUuICBJZiB0aGUgQG1vZGUgdmFyaWFibGUgaXMgc28KKyAqIHNldCwgaXQgY2FuIGJlIHJlYWQgZnJvbSwgYW5kIHdyaXR0ZW4gdG8uCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHBvaW50ZXIgdG8gYSBkZW50cnkgaWYgaXQgc3VjY2VlZHMuICBUaGlzCisgKiBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBkZWJ1Z2ZzX3JlbW92ZSgpIGZ1bmN0aW9uIHdoZW4gdGhlIGZpbGUgaXMKKyAqIHRvIGJlIHJlbW92ZWQgKG5vIGF1dG9tYXRpYyBjbGVhbnVwIGhhcHBlbnMgaWYgeW91ciBtb2R1bGUgaXMgdW5sb2FkZWQsCisgKiB5b3UgYXJlIHJlc3BvbnNpYmxlIGhlcmUuKSAgSWYgYW4gZXJyb3Igb2NjdXJzLCBOVUxMIHdpbGwgYmUgcmV0dXJuZWQuCisgKgorICogSWYgZGVidWdmcyBpcyBub3QgZW5hYmxlZCBpbiB0aGUga2VybmVsLCB0aGUgdmFsdWUgLUVOT0RFViB3aWxsIGJlCisgKiByZXR1cm5lZC4gIEl0IGlzIG5vdCB3aXNlIHRvIGNoZWNrIGZvciB0aGlzIHZhbHVlLCBidXQgcmF0aGVyLCBjaGVjayBmb3IKKyAqIE5VTEwgb3IgIU5VTEwgaW5zdGVhZCBhcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yICNpZmRlZiBpbiB0aGUgY2FsbGluZworICogY29kZS4KKyAqLworc3RydWN0IGRlbnRyeSAqZGVidWdmc19jcmVhdGVfdTE2KGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAorCQkJCSAgc3RydWN0IGRlbnRyeSAqcGFyZW50LCB1MTYgKnZhbHVlKQoreworCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgdmFsdWUsICZmb3BzX3UxNik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZWJ1Z2ZzX2NyZWF0ZV91MTYpOworCisvKioKKyAqIGRlYnVnZnNfY3JlYXRlX3UzMiAtIGNyZWF0ZSBhIGZpbGUgaW4gdGhlIGRlYnVnZnMgZmlsZXN5c3RlbSB0aGF0IGlzIHVzZWQgdG8gcmVhZCBhbmQgd3JpdGUgYSB1bnNpZ25lZCA4IGJpdCB2YWx1ZS4KKyAqCisgKiBAbmFtZTogYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlLgorICogQG1vZGU6IHRoZSBwZXJtaXNzaW9uIHRoYXQgdGhlIGZpbGUgc2hvdWxkIGhhdmUKKyAqIEBwYXJlbnQ6IGEgcG9pbnRlciB0byB0aGUgcGFyZW50IGRlbnRyeSBmb3IgdGhpcyBmaWxlLiAgVGhpcyBzaG91bGQgYmUgYQorICogICAgICAgICAgZGlyZWN0b3J5IGRlbnRyeSBpZiBzZXQuICBJZiB0aGlzIHBhcmFtYXRlciBpcyBOVUxMLCB0aGVuIHRoZQorICogICAgICAgICAgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIGRlYnVnZnMgZmlsZXN5c3RlbS4KKyAqIEB2YWx1ZTogYSBwb2ludGVyIHRvIHRoZSB2YXJpYWJsZSB0aGF0IHRoZSBmaWxlIHNob3VsZCByZWFkIHRvIGFuZCB3cml0ZQorICogICAgICAgICBmcm9tLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGZpbGUgaW4gZGVidWdmcyB3aXRoIHRoZSBnaXZlbiBuYW1lIHRoYXQKKyAqIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgQHZhbHVlLiAgSWYgdGhlIEBtb2RlIHZhcmlhYmxlIGlzIHNvCisgKiBzZXQsIGl0IGNhbiBiZSByZWFkIGZyb20sIGFuZCB3cml0dGVuIHRvLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBwb2ludGVyIHRvIGEgZGVudHJ5IGlmIGl0IHN1Y2NlZWRzLiAgVGhpcworICogcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byB0aGUgZGVidWdmc19yZW1vdmUoKSBmdW5jdGlvbiB3aGVuIHRoZSBmaWxlIGlzCisgKiB0byBiZSByZW1vdmVkIChubyBhdXRvbWF0aWMgY2xlYW51cCBoYXBwZW5zIGlmIHlvdXIgbW9kdWxlIGlzIHVubG9hZGVkLAorICogeW91IGFyZSByZXNwb25zaWJsZSBoZXJlLikgIElmIGFuIGVycm9yIG9jY3VycywgTlVMTCB3aWxsIGJlIHJldHVybmVkLgorICoKKyAqIElmIGRlYnVnZnMgaXMgbm90IGVuYWJsZWQgaW4gdGhlIGtlcm5lbCwgdGhlIHZhbHVlIC1FTk9ERVYgd2lsbCBiZQorICogcmV0dXJuZWQuICBJdCBpcyBub3Qgd2lzZSB0byBjaGVjayBmb3IgdGhpcyB2YWx1ZSwgYnV0IHJhdGhlciwgY2hlY2sgZm9yCisgKiBOVUxMIG9yICFOVUxMIGluc3RlYWQgYXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciAjaWZkZWYgaW4gdGhlIGNhbGxpbmcKKyAqIGNvZGUuCisgKi8KK3N0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX3UzMihjb25zdCBjaGFyICpuYW1lLCBtb2RlX3QgbW9kZSwKKwkJCQkgc3RydWN0IGRlbnRyeSAqcGFyZW50LCB1MzIgKnZhbHVlKQoreworCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgdmFsdWUsICZmb3BzX3UzMik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZWJ1Z2ZzX2NyZWF0ZV91MzIpOworCitzdGF0aWMgc3NpemVfdCByZWFkX2ZpbGVfYm9vbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZbM107CisJdTMyICp2YWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCisJaWYgKCp2YWwpCisJCWJ1ZlswXSA9ICdZJzsKKwllbHNlCisJCWJ1ZlswXSA9ICdOJzsKKwlidWZbMV0gPSAnXG4nOworCWJ1ZlsyXSA9IDB4MDA7CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCAyKTsKK30KKworc3RhdGljIHNzaXplX3Qgd3JpdGVfZmlsZV9ib29sKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZbMzJdOworCWludCBidWZfc2l6ZTsKKwl1MzIgKnZhbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWJ1Zl9zaXplID0gbWluKGNvdW50LCAoc2l6ZW9mKGJ1ZiktMSkpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3dpdGNoIChidWZbMF0pIHsKKwljYXNlICd5JzoKKwljYXNlICdZJzoKKwljYXNlICcxJzoKKwkJKnZhbCA9IDE7CisJCWJyZWFrOworCWNhc2UgJ24nOgorCWNhc2UgJ04nOgorCWNhc2UgJzAnOgorCQkqdmFsID0gMDsKKwkJYnJlYWs7CisJfQorCQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19ib29sID0geworCS5yZWFkID0JCXJlYWRfZmlsZV9ib29sLAorCS53cml0ZSA9CXdyaXRlX2ZpbGVfYm9vbCwKKwkub3BlbiA9CQlkZWZhdWx0X29wZW4sCit9OworCisvKioKKyAqIGRlYnVnZnNfY3JlYXRlX2Jvb2wgLSBjcmVhdGUgYSBmaWxlIGluIHRoZSBkZWJ1Z2ZzIGZpbGVzeXN0ZW0gdGhhdCBpcyB1c2VkIHRvIHJlYWQgYW5kIHdyaXRlIGEgYm9vbGVhbiB2YWx1ZS4KKyAqCisgKiBAbmFtZTogYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlLgorICogQG1vZGU6IHRoZSBwZXJtaXNzaW9uIHRoYXQgdGhlIGZpbGUgc2hvdWxkIGhhdmUKKyAqIEBwYXJlbnQ6IGEgcG9pbnRlciB0byB0aGUgcGFyZW50IGRlbnRyeSBmb3IgdGhpcyBmaWxlLiAgVGhpcyBzaG91bGQgYmUgYQorICogICAgICAgICAgZGlyZWN0b3J5IGRlbnRyeSBpZiBzZXQuICBJZiB0aGlzIHBhcmFtYXRlciBpcyBOVUxMLCB0aGVuIHRoZQorICogICAgICAgICAgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIGRlYnVnZnMgZmlsZXN5c3RlbS4KKyAqIEB2YWx1ZTogYSBwb2ludGVyIHRvIHRoZSB2YXJpYWJsZSB0aGF0IHRoZSBmaWxlIHNob3VsZCByZWFkIHRvIGFuZCB3cml0ZQorICogICAgICAgICBmcm9tLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGZpbGUgaW4gZGVidWdmcyB3aXRoIHRoZSBnaXZlbiBuYW1lIHRoYXQKKyAqIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgQHZhbHVlLiAgSWYgdGhlIEBtb2RlIHZhcmlhYmxlIGlzIHNvCisgKiBzZXQsIGl0IGNhbiBiZSByZWFkIGZyb20sIGFuZCB3cml0dGVuIHRvLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBwb2ludGVyIHRvIGEgZGVudHJ5IGlmIGl0IHN1Y2NlZWRzLiAgVGhpcworICogcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byB0aGUgZGVidWdmc19yZW1vdmUoKSBmdW5jdGlvbiB3aGVuIHRoZSBmaWxlIGlzCisgKiB0byBiZSByZW1vdmVkIChubyBhdXRvbWF0aWMgY2xlYW51cCBoYXBwZW5zIGlmIHlvdXIgbW9kdWxlIGlzIHVubG9hZGVkLAorICogeW91IGFyZSByZXNwb25zaWJsZSBoZXJlLikgIElmIGFuIGVycm9yIG9jY3VycywgTlVMTCB3aWxsIGJlIHJldHVybmVkLgorICoKKyAqIElmIGRlYnVnZnMgaXMgbm90IGVuYWJsZWQgaW4gdGhlIGtlcm5lbCwgdGhlIHZhbHVlIC1FTk9ERVYgd2lsbCBiZQorICogcmV0dXJuZWQuICBJdCBpcyBub3Qgd2lzZSB0byBjaGVjayBmb3IgdGhpcyB2YWx1ZSwgYnV0IHJhdGhlciwgY2hlY2sgZm9yCisgKiBOVUxMIG9yICFOVUxMIGluc3RlYWQgYXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciAjaWZkZWYgaW4gdGhlIGNhbGxpbmcKKyAqIGNvZGUuCisgKi8KK3N0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX2Jvb2woY29uc3QgY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsCisJCQkJICAgc3RydWN0IGRlbnRyeSAqcGFyZW50LCB1MzIgKnZhbHVlKQoreworCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgdmFsdWUsICZmb3BzX2Jvb2wpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGVidWdmc19jcmVhdGVfYm9vbCk7CisKZGlmZiAtLWdpdCBhL2ZzL2RlYnVnZnMvaW5vZGUuYyBiL2ZzL2RlYnVnZnMvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTI5Nzg2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZGVidWdmcy9pbm9kZS5jCkBAIC0wLDAgKzEsMzI4IEBACisvKgorICogIGZpbGUuYyAtIHBhcnQgb2YgZGVidWdmcywgYSB0aW55IGxpdHRsZSBkZWJ1ZyBmaWxlIHN5c3RlbQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgSUJNIEluYy4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKgkyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBkZWJ1Z2ZzIGlzIGZvciBwZW9wbGUgdG8gdXNlIGluc3RlYWQgb2YgL3Byb2Mgb3IgL3N5cy4KKyAqICBTZWUgRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworLyogdW5jb21tZW50IHRvIGdldCBkZWJ1ZyBtZXNzYWdlcyBmcm9tIHRoZSBkZWJ1ZyBmaWxlc3lzdGVtLCBhaCB0aGUgaXJvbnkuICovCisvKiAjZGVmaW5lIERFQlVHICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKworI2RlZmluZSBERUJVR0ZTX01BR0lDCTB4NjQ2MjY3MjAKKworLyogZGVjbGFyZWQgb3ZlciBpbiBmaWxlLmMgKi8KK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnZnNfZmlsZV9vcGVyYXRpb25zOworCitzdGF0aWMgc3RydWN0IHZmc21vdW50ICpkZWJ1Z2ZzX21vdW50Oworc3RhdGljIGludCBkZWJ1Z2ZzX21vdW50X2NvdW50OworCitzdGF0aWMgc3RydWN0IGlub2RlICpkZWJ1Z2ZzX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW9kZSwgZGV2X3QgZGV2KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCisJaWYgKGlub2RlKSB7CisJCWlub2RlLT5pX21vZGUgPSBtb2RlOworCQlpbm9kZS0+aV91aWQgPSAwOworCQlpbm9kZS0+aV9naWQgPSAwOworCQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCQlpbm9kZS0+aV9ibG9ja3MgPSAwOworCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgeworCQlkZWZhdWx0OgorCQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBtb2RlLCBkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgU19JRlJFRzoKKwkJCWlub2RlLT5pX2ZvcCA9ICZkZWJ1Z2ZzX2ZpbGVfb3BlcmF0aW9uczsKKwkJCWJyZWFrOworCQljYXNlIFNfSUZESVI6CisJCQlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOworCisJCQkvKiBkaXJlY3RvcnkgaW5vZGVzIHN0YXJ0IG9mZiB3aXRoIGlfbmxpbmsgPT0gMiAoZm9yICIuIiBlbnRyeSkgKi8KKwkJCWlub2RlLT5pX25saW5rKys7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gaW5vZGU7IAorfQorCisvKiBTTVAtc2FmZSAqLworc3RhdGljIGludCBkZWJ1Z2ZzX21rbm9kKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgaW50IG1vZGUsIGRldl90IGRldikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVidWdmc19nZXRfaW5vZGUoZGlyLT5pX3NiLCBtb2RlLCBkZXYpOworCWludCBlcnJvciA9IC1FUEVSTTsKKworCWlmIChkZW50cnktPmRfaW5vZGUpCisJCXJldHVybiAtRUVYSVNUOworCisJaWYgKGlub2RlKSB7CisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJCWRnZXQoZGVudHJ5KTsKKwkJZXJyb3IgPSAwOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgZGVidWdmc19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKK3sKKwlpbnQgcmVzOworCisJbW9kZSA9IChtb2RlICYgKFNfSVJXWFVHTyB8IFNfSVNWVFgpKSB8IFNfSUZESVI7CisJcmVzID0gZGVidWdmc19ta25vZChkaXIsIGRlbnRyeSwgbW9kZSwgMCk7CisJaWYgKCFyZXMpCisJCWRpci0+aV9ubGluaysrOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgZGVidWdmc19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJbW9kZSA9IChtb2RlICYgU19JQUxMVUdPKSB8IFNfSUZSRUc7CisJcmV0dXJuIGRlYnVnZnNfbWtub2QoZGlyLCBkZW50cnksIG1vZGUsIDApOworfQorCitzdGF0aWMgaW5saW5lIGludCBkZWJ1Z2ZzX3Bvc2l0aXZlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlyZXR1cm4gZGVudHJ5LT5kX2lub2RlICYmICFkX3VuaGFzaGVkKGRlbnRyeSk7Cit9CisKK3N0YXRpYyBpbnQgZGVidWdfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0YXRpYyBzdHJ1Y3QgdHJlZV9kZXNjciBkZWJ1Z19maWxlc1tdID0ge3siIn19OworCisJcmV0dXJuIHNpbXBsZV9maWxsX3N1cGVyKHNiLCBERUJVR0ZTX01BR0lDLCBkZWJ1Z19maWxlcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICogZ2V0X2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUpCit7ICAgICAgICAgICAgICAgCisJc3RydWN0IHFzdHIgcXN0cjsKKworCXFzdHIubmFtZSA9IG5hbWU7CisJcXN0ci5sZW4gPSBzdHJsZW4obmFtZSk7CisJcXN0ci5oYXNoID0gZnVsbF9uYW1lX2hhc2gobmFtZSxxc3RyLmxlbik7CisJcmV0dXJuIGxvb2t1cF9oYXNoKCZxc3RyLHBhcmVudCk7Cit9ICAgICAgICAgICAgICAgCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmRlYnVnX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwkJCQkgICAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJCXZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIGRlYnVnX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZGVidWdfZnNfdHlwZSA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQkiZGVidWdmcyIsCisJLmdldF9zYiA9CWRlYnVnX2dldF9zYiwKKwkua2lsbF9zYiA9CWtpbGxfbGl0dGVyX3N1cGVyLAorfTsKKworc3RhdGljIGludCBkZWJ1Z2ZzX2NyZWF0ZV9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAorCQkJCSAgc3RydWN0IGRlbnRyeSAqcGFyZW50LAorCQkJCSAgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCisJLyogSWYgdGhlIHBhcmVudCBpcyBub3Qgc3BlY2lmaWVkLCB3ZSBjcmVhdGUgaXQgaW4gdGhlIHJvb3QuCisJICogV2UgbmVlZCB0aGUgcm9vdCBkZW50cnkgdG8gZG8gdGhpcywgd2hpY2ggaXMgaW4gdGhlIHN1cGVyIAorCSAqIGJsb2NrLiBBIHBvaW50ZXIgdG8gdGhhdCBpcyBpbiB0aGUgc3RydWN0IHZmc21vdW50IHRoYXQgd2UKKwkgKiBoYXZlIGFyb3VuZC4KKwkgKi8KKwlpZiAoIXBhcmVudCApIHsKKwkJaWYgKGRlYnVnZnNfbW91bnQgJiYgZGVidWdmc19tb3VudC0+bW50X3NiKSB7CisJCQlwYXJlbnQgPSBkZWJ1Z2ZzX21vdW50LT5tbnRfc2ItPnNfcm9vdDsKKwkJfQorCX0KKwlpZiAoIXBhcmVudCkgeworCQlwcl9kZWJ1ZygiZGVidWdmczogQWghIGNhbiBub3QgZmluZCBhIHBhcmVudCFcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkqZGVudHJ5ID0gTlVMTDsKKwlkb3duKCZwYXJlbnQtPmRfaW5vZGUtPmlfc2VtKTsKKwkqZGVudHJ5ID0gZ2V0X2RlbnRyeSAocGFyZW50LCBuYW1lKTsKKwlpZiAoIUlTX0VSUihkZW50cnkpKSB7CisJCWlmICgobW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUikKKwkJCWVycm9yID0gZGVidWdmc19ta2RpcihwYXJlbnQtPmRfaW5vZGUsICpkZW50cnksIG1vZGUpOworCQllbHNlIAorCQkJZXJyb3IgPSBkZWJ1Z2ZzX2NyZWF0ZShwYXJlbnQtPmRfaW5vZGUsICpkZW50cnksIG1vZGUpOworCX0gZWxzZQorCQllcnJvciA9IFBUUl9FUlIoZGVudHJ5KTsKKwl1cCgmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogZGVidWdmc19jcmVhdGVfZmlsZSAtIGNyZWF0ZSBhIGZpbGUgaW4gdGhlIGRlYnVnZnMgZmlsZXN5c3RlbQorICoKKyAqIEBuYW1lOiBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjcmVhdGUuCisgKiBAbW9kZTogdGhlIHBlcm1pc3Npb24gdGhhdCB0aGUgZmlsZSBzaG91bGQgaGF2ZQorICogQHBhcmVudDogYSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgZGVudHJ5IGZvciB0aGlzIGZpbGUuICBUaGlzIHNob3VsZCBiZSBhCisgKiAgICAgICAgICBkaXJlY3RvcnkgZGVudHJ5IGlmIHNldC4gIElmIHRoaXMgcGFyYW1hdGVyIGlzIE5VTEwsIHRoZW4gdGhlCisgKiAgICAgICAgICBmaWxlIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgcm9vdCBvZiB0aGUgZGVidWdmcyBmaWxlc3lzdGVtLgorICogQGRhdGE6IGEgcG9pbnRlciB0byBzb21ldGhpbmcgdGhhdCB0aGUgY2FsbGVyIHdpbGwgd2FudCB0byBnZXQgdG8gbGF0ZXIKKyAqICAgICAgICBvbi4gIFRoZSBpbm9kZS51LmdlbmVyaWNfaXAgcG9pbnRlciB3aWxsIHBvaW50IHRvIHRoaXMgdmFsdWUgb24KKyAqICAgICAgICB0aGUgb3BlbigpIGNhbGwuCisgKiBAZm9wczogYSBwb2ludGVyIHRvIGEgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0aGF0IHNob3VsZCBiZSB1c2VkIGZvcgorICogICAgICAgIHRoaXMgZmlsZS4KKyAqCisgKiBUaGlzIGlzIHRoZSBiYXNpYyAiY3JlYXRlIGEgZmlsZSIgZnVuY3Rpb24gZm9yIGRlYnVnZnMuICBJdCBhbGxvd3MgZm9yIGEKKyAqIHdpZGUgcmFuZ2Ugb2YgZmxleGliaWxpdHkgaW4gY3JlYXRlaW5nIGEgZmlsZSwgb3IgYSBkaXJlY3RvcnkgKGlmIHlvdQorICogd2FudCB0byBjcmVhdGUgYSBkaXJlY3RvcnksIHRoZSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoKSBmdW5jdGlvbiBpcworICogcmVjb21tZW5kZWQgdG8gYmUgdXNlZCBpbnN0ZWFkLikKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgcG9pbnRlciB0byBhIGRlbnRyeSBpZiBpdCBzdWNjZWVkcy4gIFRoaXMKKyAqIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gdGhlIGRlYnVnZnNfcmVtb3ZlKCkgZnVuY3Rpb24gd2hlbiB0aGUgZmlsZSBpcworICogdG8gYmUgcmVtb3ZlZCAobm8gYXV0b21hdGljIGNsZWFudXAgaGFwcGVucyBpZiB5b3VyIG1vZHVsZSBpcyB1bmxvYWRlZCwKKyAqIHlvdSBhcmUgcmVzcG9uc2libGUgaGVyZS4pICBJZiBhbiBlcnJvciBvY2N1cnMsIE5VTEwgd2lsbCBiZSByZXR1cm5lZC4KKyAqCisgKiBJZiBkZWJ1Z2ZzIGlzIG5vdCBlbmFibGVkIGluIHRoZSBrZXJuZWwsIHRoZSB2YWx1ZSAtRU5PREVWIHdpbGwgYmUKKyAqIHJldHVybmVkLiAgSXQgaXMgbm90IHdpc2UgdG8gY2hlY2sgZm9yIHRoaXMgdmFsdWUsIGJ1dCByYXRoZXIsIGNoZWNrIGZvcgorICogTlVMTCBvciAhTlVMTCBpbnN0ZWFkIGFzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3IgI2lmZGVmIGluIHRoZSBjYWxsaW5nCisgKiBjb2RlLgorICovCitzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAorCQkJCSAgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgdm9pZCAqZGF0YSwKKwkJCQkgICBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IE5VTEw7CisJaW50IGVycm9yOworCisJcHJfZGVidWcoImRlYnVnZnM6IGNyZWF0aW5nIGZpbGUgJyVzJ1xuIixuYW1lKTsKKworCWVycm9yID0gc2ltcGxlX3Bpbl9mcygiZGVidWdmcyIsICZkZWJ1Z2ZzX21vdW50LCAmZGVidWdmc19tb3VudF9jb3VudCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGV4aXQ7CisKKwllcnJvciA9IGRlYnVnZnNfY3JlYXRlX2J5X25hbWUobmFtZSwgbW9kZSwgcGFyZW50LCAmZGVudHJ5KTsKKwlpZiAoZXJyb3IpIHsKKwkJZGVudHJ5ID0gTlVMTDsKKwkJZ290byBleGl0OworCX0KKworCWlmIChkZW50cnktPmRfaW5vZGUpIHsKKwkJaWYgKGRhdGEpCisJCQlkZW50cnktPmRfaW5vZGUtPnUuZ2VuZXJpY19pcCA9IGRhdGE7CisJCWlmIChmb3BzKQorCQkJZGVudHJ5LT5kX2lub2RlLT5pX2ZvcCA9IGZvcHM7CisJfQorZXhpdDoKKwlyZXR1cm4gZGVudHJ5OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGVidWdmc19jcmVhdGVfZmlsZSk7CisKKy8qKgorICogZGVidWdmc19jcmVhdGVfZGlyIC0gY3JlYXRlIGEgZGlyZWN0b3J5IGluIHRoZSBkZWJ1Z2ZzIGZpbGVzeXN0ZW0KKyAqCisgKiBAbmFtZTogYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0bworICogICAgICAgIGNyZWF0ZS4KKyAqIEBwYXJlbnQ6IGEgcG9pbnRlciB0byB0aGUgcGFyZW50IGRlbnRyeSBmb3IgdGhpcyBmaWxlLiAgVGhpcyBzaG91bGQgYmUgYQorICogICAgICAgICAgZGlyZWN0b3J5IGRlbnRyeSBpZiBzZXQuICBJZiB0aGlzIHBhcmFtYXRlciBpcyBOVUxMLCB0aGVuIHRoZQorICogICAgICAgICAgZGlyZWN0b3J5IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgcm9vdCBvZiB0aGUgZGVidWdmcyBmaWxlc3lzdGVtLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGRpcmVjdG9yeSBpbiBkZWJ1Z2ZzIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHBvaW50ZXIgdG8gYSBkZW50cnkgaWYgaXQgc3VjY2VlZHMuICBUaGlzCisgKiBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBkZWJ1Z2ZzX3JlbW92ZSgpIGZ1bmN0aW9uIHdoZW4gdGhlIGZpbGUgaXMKKyAqIHRvIGJlIHJlbW92ZWQgKG5vIGF1dG9tYXRpYyBjbGVhbnVwIGhhcHBlbnMgaWYgeW91ciBtb2R1bGUgaXMgdW5sb2FkZWQsCisgKiB5b3UgYXJlIHJlc3BvbnNpYmxlIGhlcmUuKSAgSWYgYW4gZXJyb3Igb2NjdXJzLCBOVUxMIHdpbGwgYmUgcmV0dXJuZWQuCisgKgorICogSWYgZGVidWdmcyBpcyBub3QgZW5hYmxlZCBpbiB0aGUga2VybmVsLCB0aGUgdmFsdWUgLUVOT0RFViB3aWxsIGJlCisgKiByZXR1cm5lZC4gIEl0IGlzIG5vdCB3aXNlIHRvIGNoZWNrIGZvciB0aGlzIHZhbHVlLCBidXQgcmF0aGVyLCBjaGVjayBmb3IKKyAqIE5VTEwgb3IgIU5VTEwgaW5zdGVhZCBhcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yICNpZmRlZiBpbiB0aGUgY2FsbGluZworICogY29kZS4KKyAqLworc3RydWN0IGRlbnRyeSAqZGVidWdmc19jcmVhdGVfZGlyKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKnBhcmVudCkKK3sKKwlyZXR1cm4gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCAKKwkJCQkgICBTX0lGRElSIHwgU19JUldYVSB8IFNfSVJVR08gfCBTX0lYVUdPLAorCQkJCSAgIHBhcmVudCwgTlVMTCwgTlVMTCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZWJ1Z2ZzX2NyZWF0ZV9kaXIpOworCisvKioKKyAqIGRlYnVnZnNfcmVtb3ZlIC0gcmVtb3ZlcyBhIGZpbGUgb3IgZGlyZWN0b3J5IGZyb20gdGhlIGRlYnVnZnMgZmlsZXN5c3RlbQorICoKKyAqIEBkZW50cnk6IGEgcG9pbnRlciB0byBhIHRoZSBkZW50cnkgb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGJlCisgKiAgICAgICAgICByZW1vdmVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBhIGZpbGUgb3IgZGlyZWN0b3J5IGluIGRlYnVnZnMgdGhhdCB3YXMgcHJldmlvdXNseQorICogY3JlYXRlZCB3aXRoIGEgY2FsbCB0byBhbm90aGVyIGRlYnVnZnMgZnVuY3Rpb24gKGxpa2UKKyAqIGRlYnVmc19jcmVhdGVfZmlsZSgpIG9yIHZhcmlhbnRzIHRoZXJlb2YuKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgdG8gYmUgY2FsbGVkIGluIG9yZGVyIGZvciB0aGUgZmlsZSB0byBiZQorICogcmVtb3ZlZCwgbm8gYXV0b21hdGljIGNsZWFudXAgb2YgZmlsZXMgd2lsbCBoYXBwZW4gd2hlbiBhIG1vZHVsZSBpcworICogcmVtb3ZlZCwgeW91IGFyZSByZXNwb25zaWJsZSBoZXJlLgorICovCit2b2lkIGRlYnVnZnNfcmVtb3ZlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CisJCisJaWYgKCFkZW50cnkpCisJCXJldHVybjsKKworCXBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7CisJaWYgKCFwYXJlbnQgfHwgIXBhcmVudC0+ZF9pbm9kZSkKKwkJcmV0dXJuOworCisJZG93bigmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisJaWYgKGRlYnVnZnNfcG9zaXRpdmUoZGVudHJ5KSkgeworCQlpZiAoZGVudHJ5LT5kX2lub2RlKSB7CisJCQlpZiAoU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisJCQkJc2ltcGxlX3JtZGlyKHBhcmVudC0+ZF9pbm9kZSwgZGVudHJ5KTsKKwkJCWVsc2UKKwkJCQlzaW1wbGVfdW5saW5rKHBhcmVudC0+ZF9pbm9kZSwgZGVudHJ5KTsKKwkJZHB1dChkZW50cnkpOworCQl9CisJfQorCXVwKCZwYXJlbnQtPmRfaW5vZGUtPmlfc2VtKTsKKwlzaW1wbGVfcmVsZWFzZV9mcygmZGVidWdmc19tb3VudCwgJmRlYnVnZnNfbW91bnRfY291bnQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGVidWdmc19yZW1vdmUpOworCitzdGF0aWMgZGVjbF9zdWJzeXMoZGVidWcsIE5VTEwsIE5VTEwpOworCitzdGF0aWMgaW50IF9faW5pdCBkZWJ1Z2ZzX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJa3NldF9zZXRfa3NldF9zKCZkZWJ1Z19zdWJzeXMsIGtlcm5lbF9zdWJzeXMpOworCXJldHZhbCA9IHN1YnN5c3RlbV9yZWdpc3RlcigmZGVidWdfc3Vic3lzKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dmFsID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmZGVidWdfZnNfdHlwZSk7CisJaWYgKHJldHZhbCkKKwkJc3Vic3lzdGVtX3VucmVnaXN0ZXIoJmRlYnVnX3N1YnN5cyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRlYnVnZnNfZXhpdCh2b2lkKQoreworCXNpbXBsZV9yZWxlYXNlX2ZzKCZkZWJ1Z2ZzX21vdW50LCAmZGVidWdmc19tb3VudF9jb3VudCk7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZkZWJ1Z19mc190eXBlKTsKKwlzdWJzeXN0ZW1fdW5yZWdpc3RlcigmZGVidWdfc3Vic3lzKTsKK30KKworY29yZV9pbml0Y2FsbChkZWJ1Z2ZzX2luaXQpOworbW9kdWxlX2V4aXQoZGVidWdmc19leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZnMvZGV2ZnMvTWFrZWZpbGUgYi9mcy9kZXZmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGQ4ZDEyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZGV2ZnMvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggZGV2ZnMtZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX0RFVkZTX0ZTKSArPSBkZXZmcy5vCisKK2RldmZzLW9ianMgOj0gYmFzZS5vIHV0aWwubworCmRpZmYgLS1naXQgYS9mcy9kZXZmcy9iYXNlLmMgYi9mcy9kZXZmcy9iYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjZmUxZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2RldmZzL2Jhc2UuYwpAQCAtMCwwICsxLDI4MzggQEAKKy8qICBkZXZmcyAoRGV2aWNlIEZpbGVTeXN0ZW0pIGRyaXZlci4KKworICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAyICBSaWNoYXJkIEdvb2NoCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICAgIFJpY2hhcmQgR29vY2ggbWF5IGJlIHJlYWNoZWQgYnkgZW1haWwgYXQgIHJnb29jaEBhdG5mLmNzaXJvLmF1CisgICAgVGhlIHBvc3RhbCBhZGRyZXNzIGlzOgorICAgICAgUmljaGFyZCBHb29jaCwgYy9vIEFUTkYsIFAuIE8uIEJveCA3NiwgRXBwaW5nLCBOLlMuVy4sIDIxMjEsIEF1c3RyYWxpYS4KKworICAgIENoYW5nZUxvZworCisgICAgMTk5ODAxMTAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIE9yaWdpbmFsIHZlcnNpb24uCisgIHYwLjEKKyAgICAxOTk4MDExMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgQ3JlYXRlZCBwZXItZnMgaW5vZGUgdGFibGUgcmF0aGVyIHRoYW4gdXNpbmcgaW5vZGUtPnUuZ2VuZXJpY19pcAorICB2MC4yCisgICAgMTk5ODAxMTEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIENyZWF0ZWQgLmVwb2NoIGlub2RlIHdoaWNoIGhhcyBhIGN0aW1lIG9mIDAuCisJICAgICAgIEZpeGVkIGxvc3Mgb2YgbmFtZWQgcGlwZXMgd2hlbiBkZW50cmllcyBsb3N0LgorCSAgICAgICBGaXhlZCBsb3NzIG9mIGlub2RlIGRhdGEgd2hlbiBkZXZmc19yZWdpc3RlcigpIGZvbGxvd3MgbWtub2QoKS4KKyAgdjAuMworICAgIDE5OTgwMTExICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBGaXggZm9yIHdoZW4gY29tcGlsaW5nIHdpdGggQ09ORklHX0tFUk5FTEQuCisgICAgMTk5ODAxMTIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIEZpeCBmb3IgcmVhZGRpcigpIHdoaWNoIHNvbWV0aW1lcyBkaWRuJ3Qgc2hvdyBlbnRyaWVzLgorCSAgICAgICBBZGRlZCA8PHRvbGVyYW50Pj4gb3B0aW9uIHRvIDxkZXZmc19yZWdpc3Rlcj4uCisgIHYwLjQKKyAgICAxOTk4MDExMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgQ3JlYXRlZCA8ZGV2ZnNfZmlsbF9maWxlPiBmdW5jdGlvbi4KKyAgdjAuNQorICAgIDE5OTgwMTE1ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBBZGRlZCBzdWJkaXJlY3Rvcnkgc3VwcG9ydC4gTWFqb3IgcmVzdHJ1Y3R1cmluZy4KKyAgICAxOTk4MDExNiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgRml4ZWQgPGZpbmRfYnlfZGV2PiB0byBub3Qgc2VhcmNoIG1ham9yPTAsbWlub3I9MC4KKwkgICAgICAgQWRkZWQgc3ltbGluayBzdXBwb3J0LgorICB2MC42CisgICAgMTk5ODAxMjAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIENyZWF0ZWQgPGRldmZzX21rX2Rpcj4gZnVuY3Rpb24gYW5kIHN1cHBvcnQgZGlyZWN0b3J5IHVucmVnaXN0ZXIKKyAgICAxOTk4MDEyMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgQXV0by1vd25lcnNoaXAgdXNlcyByZWFsIHVpZC9naWQgcmF0aGVyIHRoYW4gZWZmZWN0aXZlIHVpZC9naWQuCisgIHYwLjcKKyAgICAxOTk4MDEyMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgU3VwcG9ydGVkIGNyZWF0aW9uIG9mIHNvY2tldHMuCisgIHYwLjgKKyAgICAxOTk4MDEyMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgQWRkZWQgREVWRlNfRkxfSElERV9VTlJFRyBmbGFnLgorCSAgICAgICBJbnRlcmZhY2UgY2hhbmdlIHRvIDxkZXZmc19ta19zeW1saW5rPi4KKyAgICAgICAgICAgICAgIENyZWF0ZWQgPGRldmZzX3N5bWxpbms+IHRvIHN1cHBvcnQgc3ltbGluaygyKS4KKyAgdjAuOQorICAgIDE5OTgwMTIzICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBBZGRlZCBjaGVjayB0byA8ZGV2ZnNfZmlsbF9maWxlPiB0byBjaGVjayBpbm9kZSBpcyBpbiBkZXZmcy4KKwkgICAgICAgQWRkZWQgb3B0aW9uYWwgdHJhdmVyc2FsIG9mIHN5bWxpbmtzLgorICB2MC4xMAorICAgIDE5OTgwMTI0ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBDcmVhdGVkIDxkZXZmc19nZXRfZmxhZ3M+IGFuZCA8ZGV2ZnNfc2V0X2ZsYWdzPi4KKyAgdjAuMTEKKyAgICAxOTk4MDEyNSAgIEMuIFNjb3R0IEFuYW5pYW4gPGNhbmFuaWFuQGFsdW1uaS5wcmluY2V0b24uZWR1PgorICAgICAgICAgICAgICAgQ3JlYXRlZCA8ZGV2ZnNfZmluZF9oYW5kbGU+LgorICAgIDE5OTgwMTI1ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBBbGxvdyByZW1vdmFsIG9mIHN5bWxpbmtzLgorICB2MC4xMgorICAgIDE5OTgwMTI1ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBDcmVhdGVkIDxkZXZmc19zZXRfc3ltbGlua19kZXN0aW5hdGlvbj4uCisgICAgMTk5ODAxMjYgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIE1vdmVkIERFVkZTX1NVUEVSX01BR0lDIGludG8gaGVhZGVyIGZpbGUuCisJICAgICAgIEFkZGVkIERFVkZTX0ZMX0hJREUgZmxhZy4KKwkgICAgICAgQ3JlYXRlZCA8ZGV2ZnNfZ2V0X21hal9taW4+LgorCSAgICAgICBDcmVhdGVkIDxkZXZmc19nZXRfaGFuZGxlX2Zyb21faW5vZGU+LgorCSAgICAgICBGaXhlZCBtaW5vciBidWcgaW4gPGZpbmRfYnlfZGV2Pi4KKyAgICAxOTk4MDEyNyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBDaGFuZ2VkIGludGVyZmFjZSB0byA8ZmluZF9ieV9kZXY+LCA8ZmluZF9lbnRyeT4sCisJICAgICAgIDxkZXZmc191bnJlZ2lzdGVyPiwgPGRldmZzX2ZpbGxfZmlsZT4gYW5kIDxkZXZmc19maW5kX2hhbmRsZT4uCisJICAgICAgIEZpeGVkIGlub2RlIHRpbWVzIHdoZW4gc3ltbGluayBjcmVhdGVkIHdpdGggc3ltbGluaygyKS4KKyAgdjAuMTMKKyAgICAxOTk4MDEyOSAgIEMuIFNjb3R0IEFuYW5pYW4gPGNhbmFuaWFuQGFsdW1uaS5wcmluY2V0b24uZWR1PgorICAgICAgICAgICAgICAgRXhwb3J0ZWQgPGRldmZzX3NldF9zeW1saW5rX2Rlc3RpbmF0aW9uPiwgPGRldmZzX2dldF9tYWpfbWluPgorCSAgICAgICBhbmQgPGRldmZzX2dldF9oYW5kbGVfZnJvbV9pbm9kZT4uCisgICAgMTk5ODAxMjkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ3JlYXRlZCA8ZGV2ZnNfdW5saW5rPiB0byBzdXBwb3J0IHVubGluaygyKS4KKyAgdjAuMTQKKyAgICAxOTk4MDEyOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCBrZXJuZWxkIHN1cHBvcnQgZm9yIGVudHJpZXMgaW4gZGV2ZnMgc3ViZGlyZWN0b3JpZXMuCisgICAgMTk5ODAxMzAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQnVnZml4ZXMgaW4gPGNhbGxfa2VybmVsZD4uCisgIHYwLjE1CisgICAgMTk5ODAyMDcgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ2FsbCBrZXJuZWxkIHdoZW4gbG9va2luZyB1cCB1bnJlZ2lzdGVyZWQgZW50cmllcy4KKyAgdjAuMTYKKyAgICAxOTk4MDMyNiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBNb2RpZmllZCBpbnRlcmZhY2UgdG8gPGRldmZzX2ZpbmRfaGFuZGxlPiBmb3Igc3ltbGluayB0cmF2ZXJzYWwuCisgIHYwLjE3CisgICAgMTk5ODAzMzEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRml4ZWQgcGVyc2lzdGVuY2UgYnVnIHdpdGggZGV2aWNlIG51bWJlcnMgZm9yIG1hbnVhbGx5IGNyZWF0ZWQKKwkgICAgICAgZGV2aWNlIGZpbGVzLgorCSAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggcmVjcmVhdGluZyBzeW1saW5rcyB3aXRoIGRpZmZlcmVudCBjb250ZW50LgorICB2MC4xOAorICAgIDE5OTgwNDAxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIENoYW5nZWQgdG8gQ09ORklHX0tNT0QuCisJICAgICAgIEhpZGUgZW50cmllcyB3aGljaCBhcmUgbWFudWFsbHkgdW5saW5rZWQuCisJICAgICAgIEFsd2F5cyBpbnZhbGlkYXRlIGRldmZzIGRlbnRyeSBjYWNoZSB3aGVuIHJlZ2lzdGVyaW5nIGVudHJpZXMuCisJICAgICAgIENyZWF0ZWQgPGRldmZzX3JtZGlyPiB0byBzdXBwb3J0IHJtZGlyKDIpLgorCSAgICAgICBFbnN1cmUgZGlyZWN0b3JpZXMgY3JlYXRlZCBieSA8ZGV2ZnNfbWtfZGlyPiBhcmUgdmlzaWJsZS4KKyAgdjAuMTkKKyAgICAxOTk4MDQwMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBJbnZhbGlkYXRlIGRldmZzIGRlbnRyeSBjYWNoZSB3aGVuIG1ha2luZyBkaXJlY3Rvcmllcy4KKwkgICAgICAgSW52YWxpZGF0ZSBkZXZmcyBkZW50cnkgY2FjaGUgd2hlbiByZW1vdmluZyBlbnRyaWVzLgorCSAgICAgICBGaXhlZCBwZXJzaXN0ZW5jZSBidWcgd2l0aCBmaWZvcy4KKyAgdjAuMjAKKyAgICAxOTk4MDQyMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBQcmludCBwcm9jZXNzIGNvbW1hbmQgd2hlbiBkZWJ1Z2dpbmcga2VybmVsZC9rbW9kLgorCSAgICAgICBBZGRlZCBkZWJ1Z2dpbmcgZm9yIHJlZ2lzdGVyL3VucmVnaXN0ZXIvY2hhbmdlIG9wZXJhdGlvbnMuCisgICAgMTk5ODA0MjIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQWRkZWQgImRldmZzPSIgYm9vdCBvcHRpb25zLgorICB2MC4yMQorICAgIDE5OTgwNDI2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIE5vIGxvbmdlciBsb2NrL3VubG9jayBzdXBlcmJsb2NrIGluIDxkZXZmc19wdXRfc3VwZXI+LgorCSAgICAgICBEcm9wIG5lZ2F0aXZlIGRlbnRyaWVzIHdoZW4gdGhleSBhcmUgcmVsZWFzZWQuCisJICAgICAgIE1hbmFnZSBkY2FjaGUgbW9yZSBlZmZpY2llbnRseS4KKyAgdjAuMjIKKyAgICAxOTk4MDQyNyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBBZGRlZCBERVZGU19GTF9BVVRPX0RFVk5VTSBmbGFnLgorICB2MC4yMworICAgIDE5OTgwNDMwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIE5vIGxvbmdlciBzZXQgdW5uZWNlc3NhcnkgbWV0aG9kcy4KKyAgdjAuMjQKKyAgICAxOTk4MDUwNCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBBZGRlZCBQSUQgZGlzcGxheSB0byA8Y2FsbF9rZXJuZWxkPiBkZWJ1Z2dpbmcgbWVzc2FnZS4KKwkgICAgICAgQWRkZWQgImFmdGVyIiBkZWJ1Z2dpbmcgbWVzc2FnZSB0byA8Y2FsbF9rZXJuZWxkPi4KKyAgICAxOTk4MDUxOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBBZGRlZCAiZGlyZWFkIiBhbmQgImRpd3JpdGUiIGJvb3Qgb3B0aW9ucy4KKyAgICAxOTk4MDUyMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCBwZXJzaXN0ZW5jZSBwcm9ibGVtIHdpdGggcGVybWlzc2lvbnMuCisgIHYwLjI1CisgICAgMTk5ODA2MDIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgU3VwcG9ydCBsZWdhY3kgZGV2aWNlIG5vZGVzLgorCSAgICAgICBGaXhlZCBidWcgd2hlcmUgcmVjcmVhdGVkIGlub2RlcyB3ZXJlIGhpZGRlbi4KKyAgdjAuMjYKKyAgICAxOTk4MDYwMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBJbXByb3ZlZCBkZWJ1Z2dpbmcgaW4gPGdldF92ZnNfaW5vZGU+LgorICAgIDE5OTgwNjA3ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIE5vIGxvbmdlciBmcmVlIG9sZCBkZW50cmllcyBpbiA8ZGV2ZnNfbWtfZGlyPi4KKwkgICAgICAgRnJlZSBhbGwgZGVudHJpZXMgZm9yIGEgZ2l2ZW4gZW50cnkgd2hlbiBkZWxldGluZyBpbm9kZXMuCisgIHYwLjI3CisgICAgMTk5ODA2MjcgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgTGltaXQgYXV0by1kZXZpY2UgbnVtYmVyaW5nIHRvIG1ham9ycyAxMjggdG8gMjM5LgorICB2MC4yOAorICAgIDE5OTgwNjI5ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIGlub2RlIHRpbWVzIHBlcnNpc3RlbmNlIHByb2JsZW0uCisgIHYwLjI5CisgICAgMTk5ODA3MDQgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRml4ZWQgc3BlbGxpbmcgaW4gPGRldmZzX3JlYWRsaW5rPiBkZWJ1Zy4KKwkgICAgICAgRml4ZWQgYnVnIGluIDxkZXZmc19zZXR1cD4gcGFyc2luZyAiZGlsb29rdXAiLgorICB2MC4zMAorICAgIDE5OTgwNzA1ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIGRldmZzIGlub2RlIGxlYWsgd2hlbiBtYW51YWxseSByZWNyZWF0aW5nIGlub2Rlcy4KKwkgICAgICAgRml4ZWQgcGVybWlzc2lvbiBwZXJzaXN0ZW5jZSBwcm9ibGVtIHdoZW4gcmVjcmVhdGluZyBpbm9kZXMuCisgIHYwLjMxCisgICAgMTk5ODA3MjcgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUmVtb3ZlZCBoYXJtbGVzcyAidW51c2VkIHZhcmlhYmxlIiBjb21waWxlciB3YXJuaW5nLgorCSAgICAgICBGaXhlZCBtb2RlcyBmb3IgbWFudWFsbHkgcmVjcmVhdGVkIGRldmljZSBub2Rlcy4KKyAgdjAuMzIKKyAgICAxOTk4MDcyOCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBBZGRlZCBOVUxMIGRldmZzIGlub2RlIHdhcm5pbmcgaW4gPGRldmZzX3JlYWRfaW5vZGU+LgorCSAgICAgICBGb3JjZSBhbGwgaW5vZGUgbmxpbmsgdmFsdWVzIHRvIDEuCisgIHYwLjMzCisgICAgMTk5ODA3MzAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQWRkZWQgImRpbWtub2QiIGJvb3Qgb3B0aW9uLgorCSAgICAgICBTZXQgaW5vZGUgbmxpbmsgdG8gMCB3aGVuIGZyZWVpbmcgZGVudHJpZXMuCisJICAgICAgIEZpeGVkIG1vZGVzIGZvciBtYW51YWxseSByZWNyZWF0ZWQgc3ltbGlua3MuCisgIHYwLjM0CisgICAgMTk5ODA4MDIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRml4ZWQgYnVncyBpbiByZWNyZWF0ZWQgZGlyZWN0b3JpZXMgYW5kIHN5bWxpbmtzLgorICB2MC4zNQorICAgIDE5OTgwODA2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIGJ1Z3MgaW4gcmVjcmVhdGVkIGRldmljZSBub2Rlcy4KKyAgICAxOTk4MDgwNyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCBidWcgaW4gY3VycmVudGx5IHVudXNlZCA8ZGV2ZnNfZ2V0X2hhbmRsZV9mcm9tX2lub2RlPi4KKwkgICAgICAgRGVmaW5lZCBuZXcgPGRldmZzX2hhbmRsZV90PiB0eXBlLgorCSAgICAgICBJbXByb3ZlZCBkZWJ1Z2dpbmcgd2hlbiBnZXR0aW5nIGVudHJpZXMuCisJICAgICAgIEZpeGVkIGJ1ZyB3aGVyZSBkaXJlY3RvcmllcyBjb3VsZCBiZSBlbXB0aWVkLgorICB2MC4zNgorICAgIDE5OTgwODA5ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJlcGxhY2VkIGR1bW15IC5lcG9jaCBpbm9kZSB3aXRoIC5kZXZmc2QgY2hhcmFjdGVyIGRldmljZS4KKyAgICAxOTk4MDgxMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBJbXBsZW1lbnRlZCBkZXZmc2QgcHJvdG9jb2wgcmV2aXNpb24gMC4KKyAgdjAuMzcKKyAgICAxOTk4MDgxOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBBZGRlZCBzb290aGluZyBtZXNzYWdlIHRvIHdhcm5pbmcgaW4gPGRldmZzX2RfaXB1dD4uCisgIHYwLjM4CisgICAgMTk5ODA4MjkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgVXNlIEdDQyBleHRlbnNpb25zIGZvciBzdHJ1Y3R1cmUgaW5pdGlhbGlzYXRpb25zLgorCSAgICAgICBJbXBsZW1lbnRlZCBhc3luYyBvcGVuIG5vdGlmaWNhdGlvbi4KKwkgICAgICAgSW5jcmVtZW50ZWQgZGV2ZnNkIHByb3RvY29sIHJldmlzaW9uIHRvIDEuCisgIHYwLjM5CisgICAgMTk5ODA5MDggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgTW92ZWQgYXN5bmMgb3BlbiBub3RpZmljYXRpb24gdG8gZW5kIG9mIDxkZXZmc19vcGVuPi4KKyAgdjAuNDAKKyAgICAxOTk4MDkxMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBQcmVwZW5kZWQgIi9kZXYvIiB0byBtb2R1bGUgbG9hZCByZXF1ZXN0LgorCSAgICAgICBSZW5hbWVkIDxjYWxsX2tlcm5lbGQ+IHRvIDxjYWxsX2ttb2Q+LgorICB2MC40MQorICAgIDE5OTgwOTEwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIHR5cG8gIkFZU05DIiAtPiAiQVNZTkMiLgorICB2MC40MgorICAgIDE5OTgwOTEwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkZGVkIG9wZW4gZmxhZyBmb3IgZmlsZXMuCisgIHYwLjQzCisgICAgMTk5ODA5MjcgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgU2V0IGlfYmxvY2tzPTAgYW5kIGlfYmxrc2l6ZT0xMDI0IGluIDxkZXZmc19yZWFkX2lub2RlPi4KKyAgdjAuNDQKKyAgICAxOTk4MTAwNSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBBZGRlZCB0ZXN0IGZvciBlbXB0eSA8PG5hbWU+PiBpbiA8ZGV2ZnNfZmluZF9oYW5kbGU+LgorCSAgICAgICBSZW5hbWVkIDxnZW5lcmF0ZV9wYXRoPiB0byA8ZGV2ZnNfZ2VuZXJhdGVfcGF0aD4gYW5kIHB1Ymxpc2hlZC4KKyAgdjAuNDUKKyAgICAxOTk4MTAwNiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBDcmVhdGVkIDxkZXZmc19nZXRfZm9wcz4uCisgIHYwLjQ2CisgICAgMTk5ODEwMDcgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgTGltaXQgYXV0by1kZXZpY2UgbnVtYmVyaW5nIHRvIG1ham9ycyAxNDQgdG8gMjM5LgorICB2MC40NworICAgIDE5OTgxMDEwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFVwZGF0ZWQgPGRldmZzX2ZvbGxvd19saW5rPiBmb3IgVkZTIGNoYW5nZSBpbiAyLjEuMTI1LgorICB2MC40OAorICAgIDE5OTgxMDIyICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIENyZWF0ZWQgREVWRlNfIEZMX0NPTVBBVCBmbGFnLgorICB2MC40OQorICAgIDE5OTgxMDIzICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIENyZWF0ZWQgIm5vY29tcGF0IiBib290IG9wdGlvbi4KKyAgdjAuNTAKKyAgICAxOTk4MTAyNSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBSZXBsYWNlZCAibW91bnQiIGJvb3Qgb3B0aW9uIHdpdGggIm5vbW91bnQiLgorICB2MC41MQorICAgIDE5OTgxMTEwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIENyZWF0ZWQgIm9ubHkiIGJvb3Qgb3B0aW9uLgorICB2MC41MgorICAgIDE5OTgxMTEyICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkZGVkIERFVkZTX0ZMX1JFTU9WQUJMRSBmbGFnLgorICB2MC41MworICAgIDE5OTgxMTE0ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIE9ubHkgY2FsbCA8c2Nhbl9kaXJfZm9yX3JlbW92YWJsZT4gb24gZmlyc3QgY2FsbCB0bworCSAgICAgICA8ZGV2ZnNfcmVhZGRpcj4uCisgIHYwLjU0CisgICAgMTk5ODEyMDUgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgVXBkYXRlZCA8ZGV2ZnNfcm1kaXI+IGZvciBWRlMgY2hhbmdlIGluIDIuMS4xMzEuCisgIHYwLjU1CisgICAgMTk5ODEyMTggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ3JlYXRlZCA8ZGV2ZnNfbWtfY29tcGF0Pi4KKyAgICAxOTk4MTIyMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBDaGVjayBmb3IgcGFydGl0aW9ucyBvbiByZW1vdmFibGUgbWVkaWEgaW4gPGRldmZzX2xvb2t1cD4uCisgIHYwLjU2CisgICAgMTk5OTAxMTggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgcmVnaXN0ZXJpbmcgcmVndWxhciBmaWxlcy4KKwkgICAgICAgQ3JlYXRlZCA8ZGV2ZnNfc2V0X2ZpbGVfc2l6ZT4uCisJICAgICAgIFVwZGF0ZSBkZXZmcyBpbm9kZXMgZnJvbSBlbnRyaWVzIGlmIG5vdCBjaGFuZ2VkIHRocm91Z2ggRlMuCisgIHYwLjU3CisgICAgMTk5OTAxMjQgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRml4ZWQgPGRldmZzX2ZpbGxfZmlsZT4gdG8gb25seSBpbml0aWFsaXNlIHRlbXBvcmFyeSBpbm9kZXMuCisJICAgICAgIFRyYXAgZm9yIE5VTEwgZm9wcyBpbiA8ZGV2ZnNfcmVnaXN0ZXI+LgorCSAgICAgICBSZXR1cm4gLUVOT0RFViBpbiA8ZGV2ZnNfZmlsbF9maWxlPiBmb3Igbm9uLWRyaXZlciBpbm9kZXMuCisgIHYwLjU4CisgICAgMTk5OTAxMjYgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgU3dpdGNoZWQgZnJvbSBQQVRIX01BWCB0byBERVZGU19QQVRITEVOLgorICB2MC41OQorICAgIDE5OTkwMTI3ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIENyZWF0ZWQgIm5vdHR5Y29tcGF0IiBib290IG9wdGlvbi4KKyAgdjAuNjAKKyAgICAxOTk5MDMxOCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCA8ZGV2ZnNkX3JlYWQ+IHRvIG5vdCBvdmVycnVuIGV2ZW50IGJ1ZmZlci4KKyAgdjAuNjEKKyAgICAxOTk5MDMyOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBDcmVhdGVkIDxkZXZmc19hdXRvX3VucmVnaXN0ZXI+LgorICB2MC42MgorICAgIDE5OTkwMzMwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIERvbid0IHJldHVybiB1bnJlZ2lzdHJlZCBlbnRyaWVzIGluIDxkZXZmc19maW5kX2hhbmRsZT4uCisJICAgICAgIFBhbmljIGluIDxkZXZmc191bnJlZ2lzdGVyPiBpZiBlbnRyeSB1bnJlZ2lzdGVyZWQuCisgICAgMTk5OTA0MDEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRG9uJ3QgcGFuaWMgaW4gPGRldmZzX2F1dG9fdW5yZWdpc3Rlcj4gZm9yIGR1cGxpY2F0ZXMuCisgIHYwLjYzCisgICAgMTk5OTA0MDIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRG9uJ3QgdW5yZWdpc3RlciBhbHJlYWR5IHVucmVnaXN0ZXJlZCBlbnRyaWVzIGluIDx1bnJlZ2lzdGVyPi4KKyAgdjAuNjQKKyAgICAxOTk5MDUxMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBEaXNhYmxlIHdhcm5pbmcgbWVzc2FnZXMgd2hlbiB1bmFibGUgdG8gcmVhZCBwYXJ0aXRpb24gdGFibGUgZm9yCisJICAgICAgIHJlbW92YWJsZSBtZWRpYS4KKyAgdjAuNjUKKyAgICAxOTk5MDUxMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBVcGRhdGVkIDxkZXZmc19sb29rdXA+IGZvciBWRlMgY2hhbmdlIGluIDIuMy4xLXByZTEuCisJICAgICAgIENyZWF0ZWQgIm9vcHMtb24tcGFuaWMiIGJvb3Qgb3B0aW9uLgorCSAgICAgICBJbXByb3ZlZCBkZWJ1Z2dpbmcgaW4gPGRldmZzX3JlZ2lzdGVyPiBhbmQgPGRldmZzX3VucmVnaXN0ZXI+LgorICB2MC42NgorICAgIDE5OTkwNTE5ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkZGVkIGRvY3VtZW50YXRpb24gZm9yIHNvbWUgZnVuY3Rpb25zLgorICAgIDE5OTkwNTI1ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJlbW92ZWQgIm9vcHMtb24tcGFuaWMiIGJvb3Qgb3B0aW9uOiBub3cgYWx3YXlzIE9vcHMuCisgIHYwLjY3CisgICAgMTk5OTA1MzEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgSW1wcm92ZWQgZGVidWdnaW5nIGluIDxkZXZmc19yZWdpc3Rlcj4uCisgIHYwLjY4CisgICAgMTk5OTA2MDQgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQWRkZWQgImRpdW5saW5rIiBhbmQgIm5va21vZCIgYm9vdCBvcHRpb25zLgorCSAgICAgICBSZW1vdmVkIHN1cGVyZmx1b3VzIHdhcm5pbmcgbWVzc2FnZSBpbiA8ZGV2ZnNfZF9pcHV0Pi4KKyAgdjAuNjkKKyAgICAxOTk5MDYxMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBUb29rIGFjY291bnQgb2YgY2hhbmdlIHRvIDxkX2FsbG9jX3Jvb3Q+LgorICB2MC43MAorICAgIDE5OTkwNjE0ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIENyZWF0ZWQgc2VwYXJhdGUgZXZlbnQgcXVldWUgZm9yIGVhY2ggbW91bnRlZCBkZXZmcy4KKwkgICAgICAgUmVtb3ZlZCA8ZGV2ZnNfaW52YWxpZGF0ZV9kY2FjaGU+LgorCSAgICAgICBDcmVhdGVkIG5ldyBpb2N0bCgpcy4KKwkgICAgICAgSW5jcmVtZW50ZWQgZGV2ZnNkIHByb3RvY29sIHJldmlzaW9uIHRvIDMuCisJICAgICAgIEZpeGVkIGJ1ZyB3aGVuIHJlLWNyZWF0aW5nIGRpcmVjdG9yaWVzOiBjb250ZW50cyB3ZXJlIGxvc3QuCisJICAgICAgIEJsb2NrIGFjY2VzcyB0byBpbm9kZXMgdW50aWwgZGV2ZnNkIHVwZGF0ZXMgcGVybWlzc2lvbnMuCisgICAgMTk5OTA2MTUgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgU3VwcG9ydCAyLjIueCBrZXJuZWxzLgorICB2MC43MQorICAgIDE5OTkwNjIzICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFN3aXRjaGVkIHRvIHNlbmRpbmcgcHJvY2VzcyB1aWQvZ2lkIHRvIGRldmZzZC4KKwkgICAgICAgUmVuYW1lZCA8Y2FsbF9rbW9kPiB0byA8dHJ5X21vZGxvYWQ+LgorCSAgICAgICBBZGRlZCBERVZGU0RfTk9USUZZX0xPT0tVUCBldmVudC4KKyAgICAxOTk5MDYyNCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBBZGRlZCBERVZGU0RfTk9USUZZX0NIQU5HRSBldmVudC4KKwkgICAgICAgSW5jcmVtZW50ZWQgZGV2ZnNkIHByb3RvY29sIHJldmlzaW9uIHRvIDQuCisgIHYwLjcyCisgICAgMTk5OTA3MTMgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUmV0dXJuIEVJU0RJUiByYXRoZXIgdGhhbiBFSU5WQUwgZm9yIHJlYWQoMikgb24gZGlyZWN0b3JpZXMuCisgIHYwLjczCisgICAgMTk5OTA4MDkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ2hhbmdlZCA8ZGV2ZnNfc2V0dXA+IHRvIG5ldyBfX2luaXQgc2NoZW1lLgorICB2MC43NAorICAgIDE5OTkwOTAxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIENoYW5nZWQgcmVtYWluaW5nIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyB0byBuZXcgX19pbml0IHNjaGVtZS4KKyAgdjAuNzUKKyAgICAxOTk5MTAxMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBDcmVhdGVkIDxkZXZmc19nZXRfaW5mbz4sIDxkZXZmc19zZXRfaW5mbz4sCisJICAgICAgIDxkZXZmc19nZXRfZmlyc3RfY2hpbGQ+IGFuZCA8ZGV2ZnNfZ2V0X25leHRfc2libGluZz4uCisJICAgICAgIEFkZGVkIDw8ZGlyPj4gcGFyYW1ldGVyIHRvIDxkZXZmc19yZWdpc3Rlcj4sIDxkZXZmc19ta19jb21wYXQ+LAorCSAgICAgICA8ZGV2ZnNfbWtfZGlyPiBhbmQgPGRldmZzX2ZpbmRfaGFuZGxlPi4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICB2MC43NgorICAgIDE5OTkxMDE3ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFsbG93IG11bHRpcGxlIHVucmVnaXN0cmF0aW9ucy4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICB2MC43NworICAgIDE5OTkxMDI2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkZGVkIG1ham9yIGFuZCBtaW5vciBudW1iZXIgdG8gZGV2ZnNkIHByb3RvY29sLgorCSAgICAgICBJbmNyZW1lbnRlZCBkZXZmc2QgcHJvdG9jb2wgcmV2aXNpb24gdG8gNS4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICB2MC43OAorICAgIDE5OTkxMDMwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFN1cHBvcnQgaW5mbyBwb2ludGVyIGZvciBhbGwgZGV2ZnMgZW50cnkgdHlwZXMuCisJICAgICAgIEFkZGVkIDw8aW5mbz4+IHBhcmFtZXRlciB0byA8ZGV2ZnNfbWtfZGlyPiBhbmQKKwkgICAgICAgPGRldmZzX21rX3N5bWxpbms+LgorCSAgICAgICBXb3JrIHNwb25zb3JlZCBieSBTR0kuCisgIHYwLjc5CisgICAgMTk5OTEwMzEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgU3VwcG9ydCAiLi4vIiB3aGVuIHNlYXJjaGluZyBkZXZmcyBuYW1lc3BhY2UuCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuODAKKyAgICAxOTk5MTEwMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBDcmVhdGVkIDxkZXZmc19nZXRfdW5yZWdpc3Rlcl9zbGF2ZT4uCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuODEKKyAgICAxOTk5MTEwMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBFeHBvcnRlZCA8ZGV2ZnNfZ2V0X3BhcmVudD4uCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuODIKKyAgICAxOTk5MTEwNCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgUmVtb3ZlZCB1bnVzZWQgPGRldmZzX3NldF9zeW1saW5rX2Rlc3RpbmF0aW9uPi4KKyAgICAxOTk5MTEwNSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgRG8gbm90IGhpZGUgZW50cmllcyBmcm9tIGRldmZzZCBvciBjaGlsZHJlbi4KKwkgICAgICAgUmVtb3ZlZCBERVZGU18gRkxfVFRZX0NPTVBBVCBmbGFnLgorCSAgICAgICBSZW1vdmVkICJub3R0eWNvbXBhdCIgYm9vdCBvcHRpb24uCisJICAgICAgIFJlbW92ZWQgPGRldmZzX21rX2NvbXBhdD4uCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuODMKKyAgICAxOTk5MTEwNyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBBZGRlZCBERVZGU19GTF9XQUlUIGZsYWcuCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuODQKKyAgICAxOTk5MTEwNyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBTdXBwb3J0IG5ldyAiZGlzYyIgbmFtaW5nIHNjaGVtZSBpbiA8Z2V0X3JlbW92YWJsZV9wYXJ0aXRpb24+LgorCSAgICAgICBBbGxvdyBOVUxMIGZvcHMgaW4gPGRldmZzX3JlZ2lzdGVyPi4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICB2MC44NQorICAgIDE5OTkxMTEwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZhbGwgYmFjayB0byBtYWpvciB0YWJsZSBpZiBOVUxMIGZvcHMgZ2l2ZW4gdG8gPGRldmZzX3JlZ2lzdGVyPi4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICB2MC44NgorICAgIDE5OTkxMjA0ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFN1cHBvcnQgZmlmb3Mgd2hlbiB1bnJlZ2lzdGVyaW5nLgorCSAgICAgICBXb3JrIHNwb25zb3JlZCBieSBTR0kuCisgIHYwLjg3CisgICAgMTk5OTEyMDkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUmVtb3ZlZCBvYnNvbGV0ZSBERVZGU18gRkxfQ09NUEFUIGFuZCBERVZGU18gRkxfVE9MRVJBTlQgZmxhZ3MuCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuODgKKyAgICAxOTk5MTIxNCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBSZW1vdmVkIGttb2Qgc3VwcG9ydC4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICB2MC44OQorICAgIDE5OTkxMjE2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEltcHJvdmVkIGRlYnVnZ2luZyBpbiA8Z2V0X3Zmc19pbm9kZT4uCisJICAgICAgIEVuc3VyZSBkZW50cmllcyBjcmVhdGVkIGJ5IGRldmZzZCB3aWxsIGJlIGNsZWFuZWQgdXAuCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuOTAKKyAgICAxOTk5MTIyMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBDcmVhdGVkIDxkZXZmc19nZXRfbmFtZT4uCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuOTEKKyAgICAyMDAwMDIwMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBQb3J0ZWQgdG8ga2VybmVsIDIuMy40Mi4KKwkgICAgICAgUmVtb3ZlZCA8ZGV2ZnNfZmlsbF9maWxlPi4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICB2MC45MgorICAgIDIwMDAwMzA2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkZGVkIERFVkZTXyBGTF9OT19QRVJTSVNURU5DRSBmbGFnLgorCSAgICAgICBSZW1vdmVkIHVubmVjZXNzYXJ5IGNhbGwgdG8gPHVwZGF0ZV9kZXZmc19pbm9kZV9mcm9tX2VudHJ5PiBpbgorCSAgICAgICA8ZGV2ZnNfcmVhZGRpcj4uCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuOTMKKyAgICAyMDAwMDQxMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBTZXQgaW5vZGUtPmlfc2l6ZSB0byBjb3JyZWN0IHNpemUgZm9yIHN5bWxpbmtzLgorICAgIDIwMDAwNDE0ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIE9ubHkgZ2l2ZSBsb29rdXAoKSBtZXRob2QgdG8gZGlyZWN0b3JpZXMgdG8gY29tcGx5IHdpdGggbmV3IFZGUworCSAgICAgICBhc3N1bXB0aW9ucy4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICAgIDIwMDAwNDE1ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJlbW92ZSB1bm5lY2Vzc2FyeSB0ZXN0cyBpbiBzeW1saW5rIG1ldGhvZHMuCisJICAgICAgIERvbid0IGtpbGwgZXhpc3RpbmcgYmxvY2sgb3BzIGluIDxkZXZmc19yZWFkX2lub2RlPi4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICB2MC45NAorICAgIDIwMDAwNDI0ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIERvbid0IGNyZWF0ZSBtaXNzaW5nIGRpcmVjdG9yaWVzIGluIDxkZXZmc19maW5kX2hhbmRsZT4uCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuOTUKKyAgICAyMDAwMDQzMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBBZGRlZCBDT05GSUdfREVWRlNfTU9VTlQuCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuOTYKKyAgICAyMDAwMDYwOCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBEaXNhYmxlZCBtdWx0aS1tb3VudCBjYXBhYmlsaXR5ICh1c2UgVkZTIGJpbmRpbmdzIGluc3RlYWQpLgorCSAgICAgICBXb3JrIHNwb25zb3JlZCBieSBTR0kuCisgIHYwLjk3CisgICAgMjAwMDA2MTAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgU3dpdGNoZWQgdG8gRlNfU0lOR0xFIHRvIGRpc2FibGUgbXVsdGktbW91bnRzLgorICAgIDIwMDAwNjEyICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJlbW92ZWQgbW9kdWxlIHN1cHBvcnQuCisJICAgICAgIFJlbW92ZWQgbXVsdGktbW91bnQgY29kZS4KKwkgICAgICAgUmVtb3ZlZCBjb21wYXRpYmlsaXR5IG1hY3JvczogVkZTIGhhcyBjaGFuZ2VkIHRvbyBtdWNoLgorCSAgICAgICBXb3JrIHNwb25zb3JlZCBieSBTR0kuCisgIHYwLjk4CisgICAgMjAwMDA2MTQgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgTWVyZ2VkIGRldmZzIGlub2RlIGludG8gZGV2ZnMgZW50cnkuCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuOTkKKyAgICAyMDAwMDYxOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBSZW1vdmVkIGRlYWQgY29kZSBpbiA8ZGV2ZnNfcmVnaXN0ZXI+IHdoaWNoIHVzZWQgdG8gY2FsbAorCSAgICAgICA8ZnJlZV9kZW50cmllcz4uCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuMTAwCisgICAgMjAwMDA2MjEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ2hhbmdlZCBpbnRlcmZhY2UgdG8gPGRldmZzX3JlZ2lzdGVyPi4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICB2MC4xMDEKKyAgICAyMDAwMDYyMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBTaW1wbGlmaWVkIGludGVyZmFjZSB0byA8ZGV2ZnNfbWtfc3ltbGluaz4gYW5kIDxkZXZmc19ta19kaXI+LgorCSAgICAgICBTaW1wbGlmaWVkIGludGVyZmFjZSB0byA8ZGV2ZnNfZmluZF9oYW5kbGU+LgorCSAgICAgICBXb3JrIHNwb25zb3JlZCBieSBTR0kuCisgIHYwLjEwMgorICAgIDIwMDEwNTE5ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEVuc3VyZSA8ZGV2ZnNfZ2VuZXJhdGVfcGF0aD4gdGVybWluYXRlcyBzdHJpbmcgZm9yIHJvb3QgZW50cnkuCisJICAgICAgIEV4cG9ydGVkIDxkZXZmc19nZXRfbmFtZT4gdG8gbW9kdWxlcy4KKyAgICAyMDAxMDUyMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBNYWtlIDxkZXZmc19ta19zeW1saW5rPiBzZW5kIGV2ZW50cyB0byBkZXZmc2QuCisJICAgICAgIENsZWFuZWQgdXAgb3B0aW9uIHByb2Nlc3NpbmcgaW4gPGRldmZzX3NldHVwPi4KKyAgICAyMDAxMDUyMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCBidWdzIGluIGhhbmRsaW5nIHN5bWxpbmtzOiBjb3VsZCBsZWFrIG9yIGNhdXNlIE9vcHMuCisgICAgMjAwMTA1MjIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ2xlYW5lZCB1cCBkaXJlY3RvcnkgaGFuZGxpbmcgYnkgc2VwYXJhdGluZyBmb3BzLgorICB2MC4xMDMKKyAgICAyMDAxMDYwMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCBoYW5kbGluZyBvZiBpbnZlcnRlZCBvcHRpb25zIGluIDxkZXZmc19zZXR1cD4uCisgIHYwLjEwNAorICAgIDIwMDEwNjA0ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkanVzdGVkIDx0cnlfbW9kbG9hZD4gdG8gYWNjb3VudCBmb3IgPGRldmZzX2dlbmVyYXRlX3BhdGg+IGZpeC4KKyAgdjAuMTA1CisgICAgMjAwMTA2MTcgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQW5zd2VyZWQgcXVlc3Rpb24gcG9zZWQgYnkgQWwgVmlybyBhbmQgcmVtb3ZlZCBoaXMgY29tbWVudHMuCisJICAgICAgIE1vdmVkIHNldHRpbmcgb2YgcmVnaXN0ZXJlZCBmbGFnIGFmdGVyIG90aGVyIGZpZWxkcyBhcmUgY2hhbmdlZC4KKwkgICAgICAgRml4ZWQgcmFjZSBiZXR3ZWVuIDxkZXZmc2RfY2xvc2U+IGFuZCA8ZGV2ZnNkX25vdGlmeV9vbmU+LgorCSAgICAgICBHbG9iYWwgVkZTIGNoYW5nZXMgYWRkZWQgYm9ndXMgQktMIHRvIDxkZXZmc2RfY2xvc2U+OiByZW1vdmVkLgorCSAgICAgICBXaWRlbmVkIGxvY2tpbmcgaW4gPGRldmZzX3JlYWRsaW5rPiBhbmQgPGRldmZzX2ZvbGxvd19saW5rPi4KKwkgICAgICAgUmVwbGFjZWQgPGRldmZzZF9yZWFkPiBzdGFjayB1c2FnZSB3aXRoIDxkZXZmc2RfaW9jdGw+IGttYWxsb2MuCisJICAgICAgIFNpbXBsaWZpZWQgbG9ja2luZyBpbiA8ZGV2ZnNkX2lvY3RsPiBhbmQgZml4ZWQgbWVtb3J5IGxlYWsuCisgIHYwLjEwNgorICAgIDIwMDEwNzA5ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJlbW92ZWQgYnJva2VuIGRldm51bSBhbGxvY2F0aW9uIGFuZCB1c2UgPGRldmZzX2FsbG9jX2Rldm51bT4uCisJICAgICAgIEZpeGVkIG9sZCBkZXZudW0gbGVhayBieSBjYWxsaW5nIG5ldyA8ZGV2ZnNfZGVhbGxvY19kZXZudW0+LgorICB2MC4xMDcKKyAgICAyMDAxMDcxMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCBidWcgaW4gPGRldmZzX3NldHVwPiB3aGljaCBjb3VsZCBoYW5nIGJvb3QgcHJvY2Vzcy4KKyAgdjAuMTA4CisgICAgMjAwMTA3MzAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQWRkZWQgREVWRlNEX05PVElGWV9ERUxFVEUgZXZlbnQuCisgICAgMjAwMTA4MDEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUmVtb3ZlZCAjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4uCisgIHYwLjEwOQorICAgIDIwMDEwODA3ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIGlub2RlIHRhYmxlIHJhY2VzIGJ5IHJlbW92aW5nIGl0IGFuZCB1c2luZworCSAgICAgICBpbm9kZS0+dS5nZW5lcmljX2lwIGluc3RlYWQuCisJICAgICAgIE1vdmVkIDxkZXZmc19yZWFkX2lub2RlPiBpbnRvIDxnZXRfdmZzX2lub2RlPi4KKwkgICAgICAgTW92ZWQgPGRldmZzX3dyaXRlX2lub2RlPiBpbnRvIDxkZXZmc19ub3RpZnlfY2hhbmdlPi4KKyAgdjAuMTEwCisgICAgMjAwMTA4MDggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRml4ZWQgcmFjZSBpbiA8ZGV2ZnNfZG9fc3ltbGluaz4gZm9yIHVuaS1wcm9jZXNzb3IuCisgIHYwLjExMQorICAgIDIwMDEwODE4ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJlbW92ZWQgcmVtbmFudCBvZiBtdWx0aS1tb3VudCBzdXBwb3J0IGluIDxkZXZmc19ta25vZD4uCisgICAgICAgICAgICAgICBSZW1vdmVkIHVudXNlZCBERVZGU19GTF9TSE9XX1VOUkVHIGZsYWcuCisgIHYwLjExMgorICAgIDIwMDEwODIwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJlbW92ZWQgbmxpbmsgZmllbGQgZnJvbSBzdHJ1Y3QgZGV2ZnNfaW5vZGUuCisgIHYwLjExMworICAgIDIwMDEwODIzICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJlcGxhY2VkIEJLTCB3aXRoIGdsb2JhbCByd3NlbSB0byBwcm90ZWN0IHN5bWxpbmsgZGF0YSAocXVpY2sKKwkgICAgICAgYW5kIGRpcnR5IGhhY2spLgorICB2MC4xMTQKKyAgICAyMDAxMDgyNyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBSZXBsYWNlZCBnbG9iYWwgcndzZW0gZm9yIHN5bWxpbmsgd2l0aCBwZXItbGluayByZWZjb3VudC4KKyAgdjAuMTE1CisgICAgMjAwMTA5MTkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgU2V0IGlub2RlLT5pX21hcHBpbmctPmFfb3BzIGZvciBibG9jayBub2RlcyBpbiA8Z2V0X3Zmc19pbm9kZT4uCisgIHYwLjExNgorICAgIDIwMDExMDA4ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIG92ZXJydW4gaW4gPGRldmZzX2xpbms+IGJ5IHJlbW92aW5nIGZ1bmN0aW9uIChub3QgbmVlZGVkKS4KKyAgICAyMDAxMTAwOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCBidWZmZXIgdW5kZXJydW4gaW4gPHRyeV9tb2Rsb2FkPi4KKyAgICAyMDAxMTAyOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCByYWNlIGluIDxkZXZmc2RfaW9jdGw+IHdoZW4gc2V0dGluZyBldmVudCBtYXNrLgorICAgIDIwMDExMTE0ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpcnN0IHJlbGVhc2Ugb2YgbmV3IGxvY2tpbmcgY29kZS4KKyAgdjEuMAorICAgIDIwMDExMTE3ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIERpc2NhcmQgdGVtcG9yYXJ5IGJ1ZmZlciwgbm93IHVzZSAiJXMiIGZvciBkZW50cnkgbmFtZXMuCisgICAgMjAwMTExMTggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRG9uJ3QgZ2VuZXJhdGUgcGF0aCBpbiA8dHJ5X21vZGxvYWQ+OiB1c2UgZmFrZSBlbnRyeSBpbnN0ZWFkLgorCSAgICAgICBVc2UgImV4aXN0aW5nIiBkaXJlY3RvcnkgaW4gPF9kZXZmc19tYWtlX3BhcmVudF9mb3JfbGVhZj4uCisgICAgMjAwMTExMjIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgVXNlIHNsYWIgY2FjaGUgcmF0aGVyIHRoYW4gZml4ZWQgYnVmZmVyIGZvciBkZXZmc2QgZXZlbnRzLgorICB2MS4xCisgICAgMjAwMTExMjUgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgU2VuZCBERVZGU0RfTk9USUZZX1JFR0lTVEVSRUQgZXZlbnRzIGluIDxkZXZmc19ta19kaXI+LgorICAgIDIwMDExMTI3ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIGxvY2tpbmcgYnVnIGluIDxkZXZmc19kX3JldmFsaWRhdGVfd2FpdD4gZHVlIHRvIHR5cG8uCisJICAgICAgIERvIG5vdCBzZW5kIENSRUFURSwgQ0hBTkdFLCBBU1lOQ19PUEVOIG9yIERFTEVURSBldmVudHMgZnJvbQorCSAgICAgICBkZXZmc2Qgb3IgY2hpbGRyZW4uCisgIHYxLjIKKyAgICAyMDAxMTIwMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCBidWcgaW4gPGRldmZzZF9yZWFkPjogd2FzIGRlcmVmZXJlbmNpbmcgZnJlZWQgcG9pbnRlci4KKyAgdjEuMworICAgIDIwMDExMjAzICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIGJ1ZyBpbiA8ZGV2ZnNkX2Nsb3NlPjogd2FzIGRlcmVmZXJlbmNpbmcgZnJlZWQgcG9pbnRlci4KKwkgICAgICAgQWRkZWQgcHJvY2VzcyBncm91cCBjaGVjayBmb3IgZGV2ZnNkIHByaXZpbGVnZXMuCisgIHYxLjQKKyAgICAyMDAxMTIwNCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBVc2UgU0xBQl9BVE9NSUMgaW4gPGRldmZzZF9ub3RpZnlfZGU+IGZyb20gPGRldmZzX2RfZGVsZXRlPi4KKyAgdjEuNQorICAgIDIwMDExMjExICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJldHVybiBvbGQgZW50cnkgaW4gPGRldmZzX21rX2Rpcj4gZm9yIDIuNC54IGtlcm5lbHMuCisgICAgMjAwMTEyMTIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgSW5jcmVtZW50IHJlZmNvdW50IG9uIG1vZHVsZSBpbiA8Y2hlY2tfZGlzY19jaGFuZ2VkPi4KKyAgICAyMDAxMTIxNSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBDcmVhdGVkIDxkZXZmc19nZXRfaGFuZGxlPiBhbmQgZXhwb3J0ZWQgPGRldmZzX3B1dD4uCisJICAgICAgIEluY3JlbWVudCByZWZjb3VudCBvbiBtb2R1bGUgaW4gPGRldmZzX2dldF9vcHM+LgorCSAgICAgICBDcmVhdGVkIDxkZXZmc19wdXRfb3BzPi4KKyAgdjEuNgorICAgIDIwMDExMjE2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkZGVkIHBvaXNvbmluZyB0byA8ZGV2ZnNfcHV0Pi4KKwkgICAgICAgSW1wcm92ZWQgZGVidWdnaW5nIG1lc3NhZ2VzLgorICB2MS43CisgICAgMjAwMTEyMjEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ29ycmVjdGVkIChtYWRlIHVzZWZ1bCkgZGVidWdnaW5nIG1lc3NhZ2UgaW4gPHVucmVnaXN0ZXI+LgorCSAgICAgICBNb3ZlZCA8a21lbV9jYWNoZV9jcmVhdGU+IGluIDxtb3VudF9kZXZmc19mcz4gdG8gPGluaXRfZGV2ZnNfZnM+CisgICAgMjAwMTEyMjQgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQWRkZWQgbWFnaWMgbnVtYmVyIHRvIGd1YXJkIGFnYWluc3Qgc2NyaWJibGluZyBkcml2ZXJzLgorICAgIDIwMDExMjI2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIE9ubHkgcmV0dXJuIG9sZCBlbnRyeSBpbiA8ZGV2ZnNfbWtfZGlyPiBpZiBhIGRpcmVjdG9yeS4KKwkgICAgICAgRGVmaW5lZCBtYWNyb3MgZm9yIGVycm9yIGFuZCBkZWJ1ZyBtZXNzYWdlcy4KKyAgdjEuOAorICAgIDIwMDIwMTEzICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIChyYXJlLCBvbGQpIHJhY2UgaW4gPGRldmZzX2xvb2t1cD4uCisgIHYxLjkKKyAgICAyMDAyMDEyMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCBkZWFkbG9jayBidWcgaW4gPGRldmZzX2RfcmV2YWxpZGF0ZV93YWl0Pi4KKwkgICAgICAgVGFnIFZGUyBkZWxldGFibGUgaW4gPGRldmZzX21rX3N5bWxpbms+IGlmIGhhbmRsZSBpZ25vcmVkLgorICB2MS4xMAorICAgIDIwMDIwMTI5ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkZGVkIEtFUk5fKiB0byByZW1haW5pbmcgbWVzc2FnZXMuCisJICAgICAgIENsZWFuZWQgdXAgZGVjbGFyYXRpb24gb2YgPHN0YXRfcmVhZD4uCisgIHYxLjExCisgICAgMjAwMjAyMTkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ2hhbmdlZCA8ZGV2ZnNfcm1kaXI+IHRvIGFsbG93IGxhdGVyIGFkZGl0aW9ucyBpZiBub3QgeWV0IGVtcHR5LgorICB2MS4xMgorICAgIDIwMDIwNDA2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJlbW92ZWQgc2lsZW50bHkgaW50cm9kdWNlZCBjYWxscyB0byBsb2NrX2tlcm5lbCgpIGFuZAorCSAgICAgICB1bmxvY2tfa2VybmVsKCkgZHVlIHRvIHJlY2VudCBWRlMgbG9ja2luZyBjaGFuZ2VzLiBCS0wgaXNuJ3QKKwkgICAgICAgcmVxdWlyZWQgaW4gZGV2ZnMuCisgIHYxLjEzCisgICAgMjAwMjA0MjggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUmVtb3ZlZCAyLjQueCBjb21wYXRpYmlsaXR5IGNvZGUuCisgIHYxLjE0CisgICAgMjAwMjA1MTAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQWRkZWQgQktMIHRvIDxkZXZmc19vcGVuPiBiZWNhdXNlIGRyaXZlcnMgc3RpbGwgbmVlZCBpdC4KKyAgdjEuMTUKKyAgICAyMDAyMDUxMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBQcm90ZWN0ZWQgPHNjYW5fZGlyX2Zvcl9yZW1vdmFibGU+IGFuZCA8Z2V0X3JlbW92YWJsZV9wYXJ0aXRpb24+CisJICAgICAgIGZyb20gY2hhbmdpbmcgZGlyZWN0b3J5IGNvbnRlbnRzLgorICB2MS4xNgorICAgIDIwMDIwNTE0ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIE1pbm9yIGNsZWFudXAgb2YgPHNjYW5fZGlyX2Zvcl9yZW1vdmFibGU+LgorICB2MS4xNworICAgIDIwMDIwNzIxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFN3aXRjaGVkIHRvIElTTyBDIHN0cnVjdHVyZSBmaWVsZCBpbml0aWFsaXNlcnMuCisJICAgICAgIFN3aXRjaCB0byBzZXRfY3VycmVudF9zdGF0ZSgpIGFuZCBtb3ZlIGJlZm9yZSBhZGRfd2FpdF9xdWV1ZSgpLgorICAgIDIwMDIwNzIyICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIGRldmZzIGVudHJ5IGxlYWsgaW4gPGRldmZzX3JlYWRkaXI+IHdoZW4gKnJlYWRkaXIgZmFpbHMuCisgIHYxLjE4CisgICAgMjAwMjA3MjUgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ3JlYXRlZCA8ZGV2ZnNfZmluZF9hbmRfdW5yZWdpc3Rlcj4uCisgIHYxLjE5CisgICAgMjAwMjA3MjggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUmVtb3ZlZCBkZXByZWNhdGVkIDxkZXZmc19maW5kX2hhbmRsZT4uCisgIHYxLjIwCisgICAgMjAwMjA4MjAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRml4ZWQgbW9kdWxlIHVubG9hZCByYWNlIGluIDxkZXZmc19vcGVuPi4KKyAgdjEuMjEKKyAgICAyMDAyMTAxMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBSZW1vdmVkIERFVkZTXyBGTF9BVVRPX09XTkVSLgorCSAgICAgICBTd2l0Y2hlZCBsaW5nZXJpbmcgc3RydWN0dXJlIGZpZWxkIGluaXRpYWxpc2VyIHRvIElTTyBDLgorCSAgICAgICBBZGRlZCBsb2NraW5nIHdoZW4gdXBkYXRpbmcgRkNCIGZsYWdzLgorICB2MS4yMgorKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisjZGVmaW5lIERFVkZTX1ZFUlNJT04gICAgICAgICAgICAiMjAwNC0wMS0zMSIKKworI2RlZmluZSBERVZGU19OQU1FICJkZXZmcyIKKworI2RlZmluZSBGSVJTVF9JTk9ERSAxCisKKyNkZWZpbmUgU1RSSU5HX0xFTkdUSCAyNTYKKyNkZWZpbmUgRkFLRV9CTE9DS19TSVpFIDEwMjQKKyNkZWZpbmUgUE9JU09OX1BUUiAoICoodm9pZCAqKikgcG9pc29uX2FycmF5ICkKKyNkZWZpbmUgTUFHSUNfVkFMVUUgMHgzMjdkYjgyMworCisjaWZuZGVmIFRSVUUKKyMgIGRlZmluZSBUUlVFIDEKKyMgIGRlZmluZSBGQUxTRSAwCisjZW5kaWYKKworI2RlZmluZSBNT0RFX0RJUiAoU19JRkRJUiB8IFNfSVdVU1IgfCBTX0lSVUdPIHwgU19JWFVHTykKKworI2RlZmluZSBERUJVR19OT05FICAgICAgICAgMHgwMDAwMDAwCisjZGVmaW5lIERFQlVHX01PRFVMRV9MT0FEICAweDAwMDAwMDEKKyNkZWZpbmUgREVCVUdfUkVHSVNURVIgICAgIDB4MDAwMDAwMgorI2RlZmluZSBERUJVR19VTlJFR0lTVEVSICAgMHgwMDAwMDA0CisjZGVmaW5lIERFQlVHX0ZSRUUgICAgICAgICAweDAwMDAwMDgKKyNkZWZpbmUgREVCVUdfU0VUX0ZMQUdTICAgIDB4MDAwMDAxMAorI2RlZmluZSBERUJVR19TX1JFQUQgICAgICAgMHgwMDAwMTAwCS8qICBCcmVhayAgKi8KKyNkZWZpbmUgREVCVUdfSV9MT09LVVAgICAgIDB4MDAwMTAwMAkvKiAgQnJlYWsgICovCisjZGVmaW5lIERFQlVHX0lfQ1JFQVRFICAgICAweDAwMDIwMDAKKyNkZWZpbmUgREVCVUdfSV9HRVQgICAgICAgIDB4MDAwNDAwMAorI2RlZmluZSBERUJVR19JX0NIQU5HRSAgICAgMHgwMDA4MDAwCisjZGVmaW5lIERFQlVHX0lfVU5MSU5LICAgICAweDAwMTAwMDAKKyNkZWZpbmUgREVCVUdfSV9STElOSyAgICAgIDB4MDAyMDAwMAorI2RlZmluZSBERUJVR19JX0ZMSU5LICAgICAgMHgwMDQwMDAwCisjZGVmaW5lIERFQlVHX0lfTUtOT0QgICAgICAweDAwODAwMDAKKyNkZWZpbmUgREVCVUdfRl9SRUFERElSICAgIDB4MDEwMDAwMAkvKiAgQnJlYWsgICovCisjZGVmaW5lIERFQlVHX0RfREVMRVRFICAgICAweDEwMDAwMDAJLyogIEJyZWFrICAqLworI2RlZmluZSBERUJVR19EX1JFTEVBU0UgICAgMHgyMDAwMDAwCisjZGVmaW5lIERFQlVHX0RfSVBVVCAgICAgICAweDQwMDAwMDAKKyNkZWZpbmUgREVCVUdfQUxMICAgICAgICAgIDB4ZmZmZmZmZgorI2RlZmluZSBERUJVR19ESVNBQkxFRCAgICAgREVCVUdfTk9ORQorCisjZGVmaW5lIE9QVElPTl9OT05FICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgT1BUSU9OX01PVU5UICAgICAgICAgICAgMHgwMQorCisjZGVmaW5lIFBSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKyAgIHtwcmludGsgKEtFUk5fRVJSICIlcyIgZm9ybWF0LCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKTt9CisKKyNkZWZpbmUgT09QUyhmb3JtYXQsIGFyZ3MuLi4pIFwKKyAgIHtwcmludGsgKEtFUk5fQ1JJVCAiJXMiIGZvcm1hdCwgX19GVU5DVElPTl9fICwgIyMgYXJncyk7IFwKKyAgICBwcmludGsgKCJGb3JjaW5nIE9vcHNcbiIpOyBcCisgICAgQlVHKCk7fQorCisjaWZkZWYgQ09ORklHX0RFVkZTX0RFQlVHCisjICBkZWZpbmUgVkVSSUZZX0VOVFJZKGRlKSBcCisgICB7aWYgKChkZSkgJiYgKGRlKS0+bWFnaWNfbnVtYmVyICE9IE1BR0lDX1ZBTFVFKSBcCisgICAgICAgIE9PUFMgKCIoJXApOiBiYWQgbWFnaWMgdmFsdWU6ICV4XG4iLCAoZGUpLCAoZGUpLT5tYWdpY19udW1iZXIpO30KKyMgIGRlZmluZSBXUklURV9FTlRSWV9NQUdJQyhkZSxtYWdpYykgKGRlKS0+bWFnaWNfbnVtYmVyID0gKG1hZ2ljKQorIyAgZGVmaW5lIERQUklOVEsoZmxhZywgZm9ybWF0LCBhcmdzLi4uKSBcCisgICB7aWYgKGRldmZzX2RlYnVnICYgZmxhZykgXAorCXByaW50ayAoS0VSTl9JTkZPICIlcyIgZm9ybWF0LCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKTt9CisjZWxzZQorIyAgZGVmaW5lIFZFUklGWV9FTlRSWShkZSkKKyMgIGRlZmluZSBXUklURV9FTlRSWV9NQUdJQyhkZSxtYWdpYykKKyMgIGRlZmluZSBEUFJJTlRLKGZsYWcsIGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBkZXZmc19lbnRyeSAqZGV2ZnNfaGFuZGxlX3Q7CisKK3N0cnVjdCBkaXJlY3RvcnlfdHlwZSB7CisJcndsb2NrX3QgbG9jazsJCS8qICBMb2NrIGZvciBzZWFyY2hpbmcoUikvdXBkYXRpbmcoVykgICAqLworCXN0cnVjdCBkZXZmc19lbnRyeSAqZmlyc3Q7CisJc3RydWN0IGRldmZzX2VudHJ5ICpsYXN0OworCXVuc2lnbmVkIGNoYXIgbm9fbW9yZV9hZGRpdGlvbnM6MTsKK307CisKK3N0cnVjdCBzeW1saW5rX3R5cGUgeworCXVuc2lnbmVkIGludCBsZW5ndGg7CS8qICBOb3QgaW5jbHVkaW5nIHRoZSBOVUxMLXRlcm1pbWF0b3IgICAgICAgKi8KKwljaGFyICpsaW5rbmFtZTsJCS8qICBUaGlzIGlzIE5VTEwtdGVybWluYXRlZCAgICAgICAgICAgICAgICAgKi8KK307CisKK3N0cnVjdCBkZXZmc19pbm9kZSB7CQkvKiAgVGhpcyBzdHJ1Y3R1cmUgaXMgZm9yICJwZXJzaXN0ZW50IiBpbm9kZSBzdG9yYWdlICAqLworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlzdHJ1Y3QgdGltZXNwZWMgYXRpbWU7CisJc3RydWN0IHRpbWVzcGVjIG10aW1lOworCXN0cnVjdCB0aW1lc3BlYyBjdGltZTsKKwl1bnNpZ25lZCBpbnQgaW5vOwkvKiAgSW5vZGUgbnVtYmVyIGFzIHNlZW4gaW4gdGhlIFZGUyAgICAgICAgICovCisJdWlkX3QgdWlkOworCWdpZF90IGdpZDsKK307CisKK3N0cnVjdCBkZXZmc19lbnRyeSB7CisjaWZkZWYgQ09ORklHX0RFVkZTX0RFQlVHCisJdW5zaWduZWQgaW50IG1hZ2ljX251bWJlcjsKKyNlbmRpZgorCXZvaWQgKmluZm87CisJYXRvbWljX3QgcmVmY291bnQ7CS8qICBXaGVuIHRoaXMgZHJvcHMgdG8gemVybywgaXQncyB1bnVzZWQgICAgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBkaXJlY3RvcnlfdHlwZSBkaXI7CisJCWRldl90IGRldjsKKwkJc3RydWN0IHN5bWxpbmtfdHlwZSBzeW1saW5rOworCQljb25zdCBjaGFyICpuYW1lOwkvKiAgT25seSB1c2VkIGZvciAobW9kZSA9PSAwKSAgICAgICAgICAgICAgICovCisJfSB1OworCXN0cnVjdCBkZXZmc19lbnRyeSAqcHJldjsJLyogIFByZXZpb3VzIGVudHJ5IGluIHRoZSBwYXJlbnQgZGlyZWN0b3J5ICAqLworCXN0cnVjdCBkZXZmc19lbnRyeSAqbmV4dDsJLyogIE5leHQgZW50cnkgaW4gdGhlIHBhcmVudCBkaXJlY3RvcnkgICAgICAqLworCXN0cnVjdCBkZXZmc19lbnRyeSAqcGFyZW50OwkvKiAgVGhlIHBhcmVudCBkaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgICovCisJc3RydWN0IGRldmZzX2lub2RlIGlub2RlOworCXVtb2RlX3QgbW9kZTsKKwl1bnNpZ25lZCBzaG9ydCBuYW1lbGVuOwkvKiAgSSB0aGluayA2NGsrIGZpbGVuYW1lcyBhcmUgYSB3YXkgb2ZmLi4uICovCisJdW5zaWduZWQgY2hhciB2ZnM6MTsJLyogIFdoZXRoZXIgdGhlIFZGUyBtYXkgZGVsZXRlIHRoZSBlbnRyeSAgICovCisJY2hhciBuYW1lWzFdOwkJLyogIFRoaXMgaXMganVzdCBhIGR1bW15OiB0aGUgYWxsb2NhdGVkIGFycmF5CisJCQkJICAgaXMgYmlnZ2VyLiBUaGlzIGlzIE5VTEwtdGVybWluYXRlZCAgICAgICovCit9OworCisvKiAgVGhlIHJvb3Qgb2YgdGhlIGRldmljZSB0cmVlICAqLworc3RhdGljIHN0cnVjdCBkZXZmc19lbnRyeSAqcm9vdF9lbnRyeTsKKworc3RydWN0IGRldmZzZF9idWZfZW50cnkgeworCXN0cnVjdCBkZXZmc19lbnRyeSAqZGU7CS8qICBUaGUgbmFtZSBpcyBnZW5lcmF0ZWQgd2l0aCB0aGlzICAgICAgICAgKi8KKwl1bnNpZ25lZCBzaG9ydCB0eXBlOwkvKiAgVGhlIHR5cGUgb2YgZXZlbnQgICAgICAgICAgICAgICAgICAgICAgICovCisJdW1vZGVfdCBtb2RlOworCXVpZF90IHVpZDsKKwlnaWRfdCBnaWQ7CisJc3RydWN0IGRldmZzZF9idWZfZW50cnkgKm5leHQ7Cit9OworCitzdHJ1Y3QgZnNfaW5mbyB7CQkvKiAgVGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIHRoZSBtb3VudGVkIGRldmZzICAqLworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3BpbmxvY2tfdCBkZXZmc2RfYnVmZmVyX2xvY2s7CS8qICBMb2NrIHdoZW4gaW5zZXJ0aW5nL2RlbGV0aW5nIGV2ZW50cyAgKi8KKwlzdHJ1Y3QgZGV2ZnNkX2J1Zl9lbnRyeSAqZGV2ZnNkX2ZpcnN0X2V2ZW50OworCXN0cnVjdCBkZXZmc2RfYnVmX2VudHJ5ICpkZXZmc2RfbGFzdF9ldmVudDsKKwl2b2xhdGlsZSBpbnQgZGV2ZnNkX3NsZWVwaW5nOworCXZvbGF0aWxlIHN0cnVjdCB0YXNrX3N0cnVjdCAqZGV2ZnNkX3Rhc2s7CisJdm9sYXRpbGUgcGlkX3QgZGV2ZnNkX3BncnA7CisJdm9sYXRpbGUgc3RydWN0IGZpbGUgKmRldmZzZF9maWxlOworCXN0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCAqZGV2ZnNkX2luZm87CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBkZXZmc2RfZXZlbnRfbWFzazsKKwlhdG9taWNfdCBkZXZmc2Rfb3ZlcnJ1bl9jb3VudDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBkZXZmc2Rfd2FpdF9xdWV1ZTsJLyogIFdha2UgZGV2ZnNkIG9uIGlucHV0ICAgICAgICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgcmV2YWxpZGF0ZV93YWl0X3F1ZXVlOwkvKiAgV2FrZSB3aGVuIGRldmZzZCBzbGVlcHMgICAgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgZnNfaW5mbyBmc19pbmZvID0gey5kZXZmc2RfYnVmZmVyX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQgfTsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmRldmZzZF9idWZfY2FjaGU7CisjaWZkZWYgQ09ORklHX0RFVkZTX0RFQlVHCitzdGF0aWMgdW5zaWduZWQgaW50IGRldmZzX2RlYnVnX2luaXQgX19pbml0ZGF0YSA9IERFQlVHX05PTkU7CitzdGF0aWMgdW5zaWduZWQgaW50IGRldmZzX2RlYnVnID0gREVCVUdfTk9ORTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3RhdF9sb2NrKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhdF9udW1fZW50cmllczsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhdF9udW1fYnl0ZXM7CisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBvaXNvbl9hcnJheVs4XSA9CisgICAgeyAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhIH07CisKKyNpZmRlZiBDT05GSUdfREVWRlNfTU9VTlQKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYm9vdF9vcHRpb25zID0gT1BUSU9OX01PVU5UOworI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYm9vdF9vcHRpb25zID0gT1BUSU9OX05PTkU7CisjZW5kaWYKKworLyogIEZvcndhcmQgZnVuY3Rpb24gZGVjbGFyYXRpb25zICAqLworc3RhdGljIGRldmZzX2hhbmRsZV90IF9kZXZmc193YWxrX3BhdGgoc3RydWN0IGRldmZzX2VudHJ5ICpkaXIsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAorCQkJCSAgICAgICBpbnQgdHJhdmVyc2Vfc3ltbGluayk7CitzdGF0aWMgc3NpemVfdCBkZXZmc2RfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwKKwkJCSAgIGxvZmZfdCAqIHBwb3MpOworc3RhdGljIGludCBkZXZmc2RfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IGRldmZzZF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CisjaWZkZWYgQ09ORklHX0RFVkZTX0RFQlVHCitzdGF0aWMgc3NpemVfdCBzdGF0X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sCisJCQkgbG9mZl90ICogcHBvcyk7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzdGF0X2ZvcHMgPSB7CisJLm9wZW4gPSBub25zZWVrYWJsZV9vcGVuLAorCS5yZWFkID0gc3RhdF9yZWFkLAorfTsKKyNlbmRpZgorCisvKiAgRGV2ZnMgZGFlbW9uIGZpbGUgb3BlcmF0aW9ucyAgKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRldmZzZF9mb3BzID0geworCS5vcGVuID0gbm9uc2Vla2FibGVfb3BlbiwKKwkucmVhZCA9IGRldmZzZF9yZWFkLAorCS5pb2N0bCA9IGRldmZzZF9pb2N0bCwKKwkucmVsZWFzZSA9IGRldmZzZF9jbG9zZSwKK307CisKKy8qICBTdXBwb3J0IGZ1bmN0aW9ucyBmb2xsb3cgICovCisKKy8qKgorICoJZGV2ZnNfZ2V0IC0gR2V0IGEgcmVmZXJlbmNlIHRvIGEgZGV2ZnMgZW50cnkuCisgKglAZGU6ICBUaGUgZGV2ZnMgZW50cnkuCisgKi8KKworc3RhdGljIHN0cnVjdCBkZXZmc19lbnRyeSAqZGV2ZnNfZ2V0KHN0cnVjdCBkZXZmc19lbnRyeSAqZGUpCit7CisJVkVSSUZZX0VOVFJZKGRlKTsKKwlpZiAoZGUpCisJCWF0b21pY19pbmMoJmRlLT5yZWZjb3VudCk7CisJcmV0dXJuIGRlOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIGRldmZzX2dldCAgKi8KKworLyoqCisgKglkZXZmc19wdXQgLSBQdXQgKHJlbGVhc2UpIGEgcmVmZXJlbmNlIHRvIGEgZGV2ZnMgZW50cnkuCisgKglAZGU6ICBUaGUgaGFuZGxlIHRvIHRoZSBkZXZmcyBlbnRyeS4KKyAqLworCitzdGF0aWMgdm9pZCBkZXZmc19wdXQoZGV2ZnNfaGFuZGxlX3QgZGUpCit7CisJaWYgKCFkZSkKKwkJcmV0dXJuOworCVZFUklGWV9FTlRSWShkZSk7CisJaWYgKGRlLT5pbmZvID09IFBPSVNPTl9QVFIpCisJCU9PUFMoIiglcCk6IHBvaXNvbmVkIHBvaW50ZXJcbiIsIGRlKTsKKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmRlLT5yZWZjb3VudCkpCisJCXJldHVybjsKKwlpZiAoZGUgPT0gcm9vdF9lbnRyeSkKKwkJT09QUygiKCVwKTogcm9vdCBlbnRyeSBiZWluZyBmcmVlZFxuIiwgZGUpOworCURQUklOVEsoREVCVUdfRlJFRSwgIiglcyk6IGRlOiAlcCwgcGFyZW50OiAlcCBcIiVzXCJcbiIsCisJCWRlLT5uYW1lLCBkZSwgZGUtPnBhcmVudCwKKwkJZGUtPnBhcmVudCA/IGRlLT5wYXJlbnQtPm5hbWUgOiAibm8gcGFyZW50Iik7CisJaWYgKFNfSVNMTksoZGUtPm1vZGUpKQorCQlrZnJlZShkZS0+dS5zeW1saW5rLmxpbmtuYW1lKTsKKwlXUklURV9FTlRSWV9NQUdJQyhkZSwgMCk7CisjaWZkZWYgQ09ORklHX0RFVkZTX0RFQlVHCisJc3Bpbl9sb2NrKCZzdGF0X2xvY2spOworCS0tc3RhdF9udW1fZW50cmllczsKKwlzdGF0X251bV9ieXRlcyAtPSBzaXplb2YgKmRlICsgZGUtPm5hbWVsZW47CisJaWYgKFNfSVNMTksoZGUtPm1vZGUpKQorCQlzdGF0X251bV9ieXRlcyAtPSBkZS0+dS5zeW1saW5rLmxlbmd0aCArIDE7CisJc3Bpbl91bmxvY2soJnN0YXRfbG9jayk7CisjZW5kaWYKKwlkZS0+aW5mbyA9IFBPSVNPTl9QVFI7CisJa2ZyZWUoZGUpOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIGRldmZzX3B1dCAgKi8KKworLyoqCisgKglfZGV2ZnNfc2VhcmNoX2RpciAtIFNlYXJjaCBmb3IgYSBkZXZmcyBlbnRyeSBpbiBhIGRpcmVjdG9yeS4KKyAqCUBkaXI6ICBUaGUgZGlyZWN0b3J5IHRvIHNlYXJjaC4KKyAqCUBuYW1lOiAgVGhlIG5hbWUgb2YgdGhlIGVudHJ5IHRvIHNlYXJjaCBmb3IuCisgKglAbmFtZWxlbjogIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBAbmFtZS4KKyAqCisgKiAgU2VhcmNoIGZvciBhIGRldmZzIGVudHJ5IGluIGEgZGlyZWN0b3J5IGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZW50cnkKKyAqICAgb24gc3VjY2VzcywgZWxzZSAlTlVMTC4gVGhlIGRpcmVjdG9yeSBtdXN0IGJlIGxvY2tlZCBhbHJlYWR5LgorICogICBBbiBpbXBsaWNpdCBkZXZmc19nZXQoKSBpcyBwZXJmb3JtZWQgb24gdGhlIHJldHVybmVkIGVudHJ5LgorICovCisKK3N0YXRpYyBzdHJ1Y3QgZGV2ZnNfZW50cnkgKl9kZXZmc19zZWFyY2hfZGlyKHN0cnVjdCBkZXZmc19lbnRyeSAqZGlyLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IG5hbWVsZW4pCit7CisJc3RydWN0IGRldmZzX2VudHJ5ICpjdXJyOworCisJaWYgKCFTX0lTRElSKGRpci0+bW9kZSkpIHsKKwkJUFJJTlRLKCIoJXMpOiBub3QgYSBkaXJlY3RvcnlcbiIsIGRpci0+bmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlmb3IgKGN1cnIgPSBkaXItPnUuZGlyLmZpcnN0OyBjdXJyICE9IE5VTEw7IGN1cnIgPSBjdXJyLT5uZXh0KSB7CisJCWlmIChjdXJyLT5uYW1lbGVuICE9IG5hbWVsZW4pCisJCQljb250aW51ZTsKKwkJaWYgKG1lbWNtcChjdXJyLT5uYW1lLCBuYW1lLCBuYW1lbGVuKSA9PSAwKQorCQkJYnJlYWs7CisJCS8qICBOb3QgZm91bmQ6IHRyeSB0aGUgbmV4dCBvbmUgICovCisJfQorCXJldHVybiBkZXZmc19nZXQoY3Vycik7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gX2RldmZzX3NlYXJjaF9kaXIgICovCisKKy8qKgorICoJX2RldmZzX2FsbG9jX2VudHJ5IC0gQWxsb2NhdGUgYSBkZXZmcyBlbnRyeS4KKyAqCUBuYW1lOiAgICAgdGhlIG5hbWUgb2YgdGhlIGVudHJ5CisgKglAbmFtZWxlbjogIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBAbmFtZQorICogICAgICBAbW9kZTogICAgIHRoZSBtb2RlIGZvciB0aGUgZW50cnkKKyAqCisgKiAgQWxsb2NhdGUgYSBkZXZmcyBlbnRyeSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGVudHJ5IG9uIHN1Y2Nlc3MsIGVsc2UKKyAqICAgJU5VTEwuCisgKi8KKworc3RhdGljIHN0cnVjdCBkZXZmc19lbnRyeSAqX2RldmZzX2FsbG9jX2VudHJ5KGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCBuYW1lbGVuLAorCQkJCQkgICAgICB1bW9kZV90IG1vZGUpCit7CisJc3RydWN0IGRldmZzX2VudHJ5ICpuZXc7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5vZGVfY291bnRlciA9IEZJUlNUX0lOT0RFOworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY291bnRlcl9sb2NrKTsKKworCWlmIChuYW1lICYmIChuYW1lbGVuIDwgMSkpCisJCW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJaWYgKChuZXcgPSBrbWFsbG9jKHNpemVvZiAqbmV3ICsgbmFtZWxlbiwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCW1lbXNldChuZXcsIDAsIHNpemVvZiAqbmV3ICsgbmFtZWxlbik7CS8qICBXaWxsIHNldCAnXDAnIG9uIG5hbWUgICovCisJbmV3LT5tb2RlID0gbW9kZTsKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJcndsb2NrX2luaXQoJm5ldy0+dS5kaXIubG9jayk7CisJYXRvbWljX3NldCgmbmV3LT5yZWZjb3VudCwgMSk7CisJc3Bpbl9sb2NrKCZjb3VudGVyX2xvY2spOworCW5ldy0+aW5vZGUuaW5vID0gaW5vZGVfY291bnRlcisrOworCXNwaW5fdW5sb2NrKCZjb3VudGVyX2xvY2spOworCWlmIChuYW1lKQorCQltZW1jcHkobmV3LT5uYW1lLCBuYW1lLCBuYW1lbGVuKTsKKwluZXctPm5hbWVsZW4gPSBuYW1lbGVuOworCVdSSVRFX0VOVFJZX01BR0lDKG5ldywgTUFHSUNfVkFMVUUpOworI2lmZGVmIENPTkZJR19ERVZGU19ERUJVRworCXNwaW5fbG9jaygmc3RhdF9sb2NrKTsKKwkrK3N0YXRfbnVtX2VudHJpZXM7CisJc3RhdF9udW1fYnl0ZXMgKz0gc2l6ZW9mICpuZXcgKyBuYW1lbGVuOworCXNwaW5fdW5sb2NrKCZzdGF0X2xvY2spOworI2VuZGlmCisJcmV0dXJuIG5ldzsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBfZGV2ZnNfYWxsb2NfZW50cnkgICovCisKKy8qKgorICoJX2RldmZzX2FwcGVuZF9lbnRyeSAtIEFwcGVuZCBhIGRldmZzIGVudHJ5IHRvIGEgZGlyZWN0b3J5J3MgY2hpbGQgbGlzdC4KKyAqCUBkaXI6ICBUaGUgZGlyZWN0b3J5IHRvIGFkZCB0by4KKyAqCUBkZTogIFRoZSBkZXZmcyBlbnRyeSB0byBhcHBlbmQuCisgKglAb2xkX2RlOiBJZiBhbiBleGlzdGluZyBlbnRyeSBleGlzdHMsIGl0IHdpbGwgYmUgd3JpdHRlbiBoZXJlLiBUaGlzIG1heQorICoJCSBiZSAlTlVMTC4gQW4gaW1wbGljaXQgZGV2ZnNfZ2V0KCkgaXMgcGVyZm9ybWVkIG9uIHRoaXMgZW50cnkuCisgKgorICogIEFwcGVuZCBhIGRldmZzIGVudHJ5IHRvIGEgZGlyZWN0b3J5J3MgbGlzdCBvZiBjaGlsZHJlbiwgY2hlY2tpbmcgZmlyc3QgdG8KKyAqICAgc2VlIGlmIGFuIGVudHJ5IG9mIHRoZSBzYW1lIG5hbWUgZXhpc3RzLiBUaGUgZGlyZWN0b3J5IHdpbGwgYmUgbG9ja2VkLgorICogICBUaGUgdmFsdWUgMCBpcyByZXR1cm5lZCBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqICAgT24gZmFpbHVyZSwgYW4gaW1wbGljaXQgZGV2ZnNfcHV0KCkgaXMgcGVyZm9ybWVkIG9uICVkZS4KKyAqLworCitzdGF0aWMgaW50IF9kZXZmc19hcHBlbmRfZW50cnkoZGV2ZnNfaGFuZGxlX3QgZGlyLCBkZXZmc19oYW5kbGVfdCBkZSwKKwkJCSAgICAgICBkZXZmc19oYW5kbGVfdCAqIG9sZF9kZSkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKG9sZF9kZSkKKwkJKm9sZF9kZSA9IE5VTEw7CisJaWYgKCFTX0lTRElSKGRpci0+bW9kZSkpIHsKKwkJUFJJTlRLKCIoJXMpOiBkaXI6IFwiJXNcIiBpcyBub3QgYSBkaXJlY3RvcnlcbiIsIGRlLT5uYW1lLAorCQkgICAgICAgZGlyLT5uYW1lKTsKKwkJZGV2ZnNfcHV0KGRlKTsKKwkJcmV0dXJuIC1FTk9URElSOworCX0KKwl3cml0ZV9sb2NrKCZkaXItPnUuZGlyLmxvY2spOworCWlmIChkaXItPnUuZGlyLm5vX21vcmVfYWRkaXRpb25zKQorCQlyZXR2YWwgPSAtRU5PRU5UOworCWVsc2UgeworCQlzdHJ1Y3QgZGV2ZnNfZW50cnkgKm9sZDsKKworCQlvbGQgPSBfZGV2ZnNfc2VhcmNoX2RpcihkaXIsIGRlLT5uYW1lLCBkZS0+bmFtZWxlbik7CisJCWlmIChvbGRfZGUpCisJCQkqb2xkX2RlID0gb2xkOworCQllbHNlCisJCQlkZXZmc19wdXQob2xkKTsKKwkJaWYgKG9sZCA9PSBOVUxMKSB7CisJCQlkZS0+cGFyZW50ID0gZGlyOworCQkJZGUtPnByZXYgPSBkaXItPnUuZGlyLmxhc3Q7CisJCQkvKiAgQXBwZW5kIHRvIHRoZSBkaXJlY3RvcnkncyBsaXN0IG9mIGNoaWxkcmVuICAqLworCQkJaWYgKGRpci0+dS5kaXIuZmlyc3QgPT0gTlVMTCkKKwkJCQlkaXItPnUuZGlyLmZpcnN0ID0gZGU7CisJCQllbHNlCisJCQkJZGlyLT51LmRpci5sYXN0LT5uZXh0ID0gZGU7CisJCQlkaXItPnUuZGlyLmxhc3QgPSBkZTsKKwkJCXJldHZhbCA9IDA7CisJCX0gZWxzZQorCQkJcmV0dmFsID0gLUVFWElTVDsKKwl9CisJd3JpdGVfdW5sb2NrKCZkaXItPnUuZGlyLmxvY2spOworCWlmIChyZXR2YWwpCisJCWRldmZzX3B1dChkZSk7CisJcmV0dXJuIHJldHZhbDsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBfZGV2ZnNfYXBwZW5kX2VudHJ5ICAqLworCisvKioKKyAqCV9kZXZmc19nZXRfcm9vdF9lbnRyeSAtIEdldCB0aGUgcm9vdCBkZXZmcyBlbnRyeS4KKyAqCisgKglSZXR1cm5zIHRoZSByb290IGRldmZzIGVudHJ5IG9uIHN1Y2Nlc3MsIGVsc2UgJU5VTEwuCisgKgorICoJVE9ETyBpdCBtdXN0IGJlIGNhbGxlZCBhc3luY2hyb25vdXNseSBkdWUgdG8gdGhlIGZhY3QKKyAqCXRoYXQgZGV2ZnMgaXMgaW5pdGlhbGl6ZWQgcmVsYXRpdmVseSBsYXRlLiBQcm9wZXIgd2F5CisgKglpcyB0byByZW1vdmUgbW9kdWxlX2luaXQgZnJvbSBpbml0X2RldmZzX2ZzIGFuZCBtYW51YWxseQorICoJY2FsbCBpdCBlYXJseSBlbm91Z2ggZHVyaW5nIHN5c3RlbSBpbml0CisgKi8KKworc3RhdGljIHN0cnVjdCBkZXZmc19lbnRyeSAqX2RldmZzX2dldF9yb290X2VudHJ5KHZvaWQpCit7CisJc3RydWN0IGRldmZzX2VudHJ5ICpuZXc7CisJc3RhdGljIERFRklORV9TUElOTE9DSyhyb290X2xvY2spOworCisJaWYgKHJvb3RfZW50cnkpCisJCXJldHVybiByb290X2VudHJ5OworCisJbmV3ID0gX2RldmZzX2FsbG9jX2VudHJ5KE5VTEwsIDAsIE1PREVfRElSKTsKKwlpZiAobmV3ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrKCZyb290X2xvY2spOworCWlmIChyb290X2VudHJ5KSB7CisJCXNwaW5fdW5sb2NrKCZyb290X2xvY2spOworCQlkZXZmc19wdXQobmV3KTsKKwkJcmV0dXJuIHJvb3RfZW50cnk7CisJfQorCXJvb3RfZW50cnkgPSBuZXc7CisJc3Bpbl91bmxvY2soJnJvb3RfbG9jayk7CisKKwlyZXR1cm4gcm9vdF9lbnRyeTsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBfZGV2ZnNfZ2V0X3Jvb3RfZW50cnkgICovCisKKy8qKgorICoJX2RldmZzX2Rlc2NlbmQgLSBEZXNjZW5kIGRvd24gYSB0cmVlIHVzaW5nIHRoZSBuZXh0IGNvbXBvbmVudCBuYW1lLgorICoJQGRpcjogIFRoZSBkaXJlY3RvcnkgdG8gc2VhcmNoLgorICoJQG5hbWU6ICBUaGUgY29tcG9uZW50IG5hbWUgdG8gc2VhcmNoIGZvci4KKyAqCUBuYW1lbGVuOiAgVGhlIGxlbmd0aCBvZiAlbmFtZS4KKyAqCUBuZXh0X3BvczogIFRoZSBwb3NpdGlvbiBvZiB0aGUgbmV4dCAnLycgb3IgJ1wwJyBpcyB3cml0dGVuIGhlcmUuCisgKgorICogIERlc2NlbmQgaW50byBhIGRpcmVjdG9yeSwgc2VhcmNoaW5nIGZvciBhIGNvbXBvbmVudC4gVGhpcyBmdW5jdGlvbiBmb3JtcworICogICB0aGUgY29yZSBvZiBhIHRyZWUtd2Fsa2luZyBhbGdvcml0aG0uIFRoZSBkaXJlY3Rvcnkgd2lsbCBiZSBsb2NrZWQuCisgKiAgIFRoZSBkZXZmcyBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb21wb25lbnQgaXMgcmV0dXJuZWQuIElmIHRoZXJlIGlzCisgKiAgIG5vIG1hdGNoaW5nIGVudHJ5LCAlTlVMTCBpcyByZXR1cm5lZC4KKyAqICAgQW4gaW1wbGljaXQgZGV2ZnNfZ2V0KCkgaXMgcGVyZm9ybWVkIG9uIHRoZSByZXR1cm5lZCBlbnRyeS4KKyAqLworCitzdGF0aWMgc3RydWN0IGRldmZzX2VudHJ5ICpfZGV2ZnNfZGVzY2VuZChzdHJ1Y3QgZGV2ZnNfZW50cnkgKmRpciwKKwkJCQkJICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJCQkJICBpbnQgKm5leHRfcG9zKQoreworCWNvbnN0IGNoYXIgKnN0b3AsICpwdHI7CisJc3RydWN0IGRldmZzX2VudHJ5ICplbnRyeTsKKworCWlmICgobmFtZWxlbiA+PSAzKSAmJiAoc3RybmNtcChuYW1lLCAiLi4vIiwgMykgPT0gMCkpIHsJLyogIFNwZWNpYWwtY2FzZSBnb2luZyB0byBwYXJlbnQgZGlyZWN0b3J5ICAqLworCQkqbmV4dF9wb3MgPSAzOworCQlyZXR1cm4gZGV2ZnNfZ2V0KGRpci0+cGFyZW50KTsKKwl9CisJc3RvcCA9IG5hbWUgKyBuYW1lbGVuOworCS8qICBTZWFyY2ggZm9yIGEgcG9zc2libGUgJy8nICAqLworCWZvciAocHRyID0gbmFtZTsgKHB0ciA8IHN0b3ApICYmICgqcHRyICE9ICcvJyk7ICsrcHRyKSA7CisJKm5leHRfcG9zID0gcHRyIC0gbmFtZTsKKwlyZWFkX2xvY2soJmRpci0+dS5kaXIubG9jayk7CisJZW50cnkgPSBfZGV2ZnNfc2VhcmNoX2RpcihkaXIsIG5hbWUsICpuZXh0X3Bvcyk7CisJcmVhZF91bmxvY2soJmRpci0+dS5kaXIubG9jayk7CisJcmV0dXJuIGVudHJ5OworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIF9kZXZmc19kZXNjZW5kICAqLworCitzdGF0aWMgZGV2ZnNfaGFuZGxlX3QgX2RldmZzX21ha2VfcGFyZW50X2Zvcl9sZWFmKHN0cnVjdCBkZXZmc19lbnRyeSAqZGlyLAorCQkJCQkJICBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkJICBpbnQgbmFtZWxlbiwgaW50ICpsZWFmX3BvcykKK3sKKwlpbnQgbmV4dF9wb3MgPSAwOworCisJaWYgKGRpciA9PSBOVUxMKQorCQlkaXIgPSBfZGV2ZnNfZ2V0X3Jvb3RfZW50cnkoKTsKKwlpZiAoZGlyID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWRldmZzX2dldChkaXIpOworCS8qICBTZWFyY2ggZm9yIHBvc3NpYmxlIHRyYWlsaW5nIGNvbXBvbmVudCBhbmQgaWdub3JlIGl0ICAqLworCWZvciAoLS1uYW1lbGVuOyAobmFtZWxlbiA+IDApICYmIChuYW1lW25hbWVsZW5dICE9ICcvJyk7IC0tbmFtZWxlbikgOworCSpsZWFmX3BvcyA9IChuYW1lW25hbWVsZW5dID09ICcvJykgPyAobmFtZWxlbiArIDEpIDogMDsKKwlmb3IgKDsgbmFtZWxlbiA+IDA7IG5hbWUgKz0gbmV4dF9wb3MsIG5hbWVsZW4gLT0gbmV4dF9wb3MpIHsKKwkJc3RydWN0IGRldmZzX2VudHJ5ICpkZSwgKm9sZCA9IE5VTEw7CisKKwkJaWYgKChkZSA9CisJCSAgICAgX2RldmZzX2Rlc2NlbmQoZGlyLCBuYW1lLCBuYW1lbGVuLCAmbmV4dF9wb3MpKSA9PSBOVUxMKSB7CisJCQlkZSA9IF9kZXZmc19hbGxvY19lbnRyeShuYW1lLCBuZXh0X3BvcywgTU9ERV9ESVIpOworCQkJZGV2ZnNfZ2V0KGRlKTsKKwkJCWlmICghZGUgfHwgX2RldmZzX2FwcGVuZF9lbnRyeShkaXIsIGRlLCAmb2xkKSkgeworCQkJCWRldmZzX3B1dChkZSk7CisJCQkJaWYgKCFvbGQgfHwgIVNfSVNESVIob2xkLT5tb2RlKSkgeworCQkJCQlkZXZmc19wdXQob2xkKTsKKwkJCQkJZGV2ZnNfcHV0KGRpcik7CisJCQkJCXJldHVybiBOVUxMOworCQkJCX0KKwkJCQlkZSA9IG9sZDsJLyogIFVzZSB0aGUgZXhpc3RpbmcgZGlyZWN0b3J5ICAqLworCQkJfQorCQl9CisJCWlmIChkZSA9PSBkaXItPnBhcmVudCkgeworCQkJZGV2ZnNfcHV0KGRpcik7CisJCQlkZXZmc19wdXQoZGUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZGV2ZnNfcHV0KGRpcik7CisJCWRpciA9IGRlOworCQlpZiAobmFtZVtuZXh0X3Bvc10gPT0gJy8nKQorCQkJKytuZXh0X3BvczsKKwl9CisJcmV0dXJuIGRpcjsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBfZGV2ZnNfbWFrZV9wYXJlbnRfZm9yX2xlYWYgICovCisKK3N0YXRpYyBkZXZmc19oYW5kbGVfdCBfZGV2ZnNfcHJlcGFyZV9sZWFmKGRldmZzX2hhbmRsZV90ICogZGlyLAorCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsIHVtb2RlX3QgbW9kZSkKK3sKKwlpbnQgbmFtZWxlbiwgbGVhZl9wb3M7CisJc3RydWN0IGRldmZzX2VudHJ5ICpkZTsKKworCW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJaWYgKCgqZGlyID0gX2RldmZzX21ha2VfcGFyZW50X2Zvcl9sZWFmKCpkaXIsIG5hbWUsIG5hbWVsZW4sCisJCQkJCQkmbGVhZl9wb3MpKSA9PSBOVUxMKSB7CisJCVBSSU5USygiKCVzKTogY291bGQgbm90IGNyZWF0ZSBwYXJlbnQgcGF0aFxuIiwgbmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoKGRlID0gX2RldmZzX2FsbG9jX2VudHJ5KG5hbWUgKyBsZWFmX3BvcywgbmFtZWxlbiAtIGxlYWZfcG9zLCBtb2RlKSkKKwkgICAgPT0gTlVMTCkgeworCQlQUklOVEsoIiglcyk6IGNvdWxkIG5vdCBhbGxvY2F0ZSBlbnRyeVxuIiwgbmFtZSk7CisJCWRldmZzX3B1dCgqZGlyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBkZTsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBfZGV2ZnNfcHJlcGFyZV9sZWFmICAqLworCitzdGF0aWMgZGV2ZnNfaGFuZGxlX3QgX2RldmZzX3dhbGtfcGF0aChzdHJ1Y3QgZGV2ZnNfZW50cnkgKmRpciwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCisJCQkJICAgICAgIGludCB0cmF2ZXJzZV9zeW1saW5rKQoreworCWludCBuZXh0X3BvcyA9IDA7CisKKwlpZiAoZGlyID09IE5VTEwpCisJCWRpciA9IF9kZXZmc19nZXRfcm9vdF9lbnRyeSgpOworCWlmIChkaXIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJZGV2ZnNfZ2V0KGRpcik7CisJZm9yICg7IG5hbWVsZW4gPiAwOyBuYW1lICs9IG5leHRfcG9zLCBuYW1lbGVuIC09IG5leHRfcG9zKSB7CisJCXN0cnVjdCBkZXZmc19lbnRyeSAqZGUsICpsaW5rOworCisJCWlmICghU19JU0RJUihkaXItPm1vZGUpKSB7CisJCQlkZXZmc19wdXQoZGlyKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJaWYgKChkZSA9CisJCSAgICAgX2RldmZzX2Rlc2NlbmQoZGlyLCBuYW1lLCBuYW1lbGVuLCAmbmV4dF9wb3MpKSA9PSBOVUxMKSB7CisJCQlkZXZmc19wdXQoZGlyKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChTX0lTTE5LKGRlLT5tb2RlKSAmJiB0cmF2ZXJzZV9zeW1saW5rKSB7CS8qICBOZWVkIHRvIGZvbGxvdyB0aGUgbGluazogdGhpcyBpcyBhIHN0YWNrIGNob21wZXIgICovCisJCQkvKiBGSVhNRSB3aGF0IGlmIGl0IHB1dHMgb3V0c2lkZSBvZiBtb3VudGVkIHRyZWU/ICovCisJCQlsaW5rID0gX2RldmZzX3dhbGtfcGF0aChkaXIsIGRlLT51LnN5bWxpbmsubGlua25hbWUsCisJCQkJCQlkZS0+dS5zeW1saW5rLmxlbmd0aCwgVFJVRSk7CisJCQlkZXZmc19wdXQoZGUpOworCQkJaWYgKCFsaW5rKSB7CisJCQkJZGV2ZnNfcHV0KGRpcik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlkZSA9IGxpbms7CisJCX0KKwkJZGV2ZnNfcHV0KGRpcik7CisJCWRpciA9IGRlOworCQlpZiAobmFtZVtuZXh0X3Bvc10gPT0gJy8nKQorCQkJKytuZXh0X3BvczsKKwl9CisJcmV0dXJuIGRpcjsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBfZGV2ZnNfd2Fsa19wYXRoICAqLworCisvKioKKyAqCV9kZXZmc19maW5kX2VudHJ5IC0gRmluZCBhIGRldmZzIGVudHJ5LgorICoJQGRpcjogVGhlIGhhbmRsZSB0byB0aGUgcGFyZW50IGRldmZzIGRpcmVjdG9yeSBlbnRyeS4gSWYgdGhpcyBpcyAlTlVMTCB0aGUKKyAqCQluYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBkZXZmcy4KKyAqCUBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgZW50cnkuIFRoaXMgbWF5IGJlICVOVUxMLgorICoJQHRyYXZlcnNlX3N5bWxpbms6IElmICVUUlVFIHRoZW4gc3ltYm9saWMgbGlua3MgYXJlIHRyYXZlcnNlZC4KKyAqCisgKglSZXR1cm5zIHRoZSBkZXZmc19lbnRyeSBwb2ludGVyIG9uIHN1Y2Nlc3MsIGVsc2UgJU5VTEwuIEFuIGltcGxpY2l0CisgKglkZXZmc19nZXQoKSBpcyBwZXJmb3JtZWQuCisgKi8KKworc3RhdGljIHN0cnVjdCBkZXZmc19lbnRyeSAqX2RldmZzX2ZpbmRfZW50cnkoZGV2ZnNfaGFuZGxlX3QgZGlyLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICAgaW50IHRyYXZlcnNlX3N5bWxpbmspCit7CisJdW5zaWduZWQgaW50IG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisKKwlpZiAobmFtZVswXSA9PSAnLycpIHsKKwkJLyogIFNraXAgbGVhZGluZyBwYXRobmFtZSBjb21wb25lbnQgICovCisJCWlmIChuYW1lbGVuIDwgMikgeworCQkJUFJJTlRLKCIoJXMpOiB0b28gc2hvcnRcbiIsIG5hbWUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZm9yICgrK25hbWUsIC0tbmFtZWxlbjsgKCpuYW1lICE9ICcvJykgJiYgKG5hbWVsZW4gPiAwKTsKKwkJICAgICArK25hbWUsIC0tbmFtZWxlbikgOworCQlpZiAobmFtZWxlbiA8IDIpIHsKKwkJCVBSSU5USygiKCVzKTogdG9vIHNob3J0XG4iLCBuYW1lKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCSsrbmFtZTsKKwkJLS1uYW1lbGVuOworCX0KKwlyZXR1cm4gX2RldmZzX3dhbGtfcGF0aChkaXIsIG5hbWUsIG5hbWVsZW4sIHRyYXZlcnNlX3N5bWxpbmspOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIF9kZXZmc19maW5kX2VudHJ5ICAqLworCitzdGF0aWMgc3RydWN0IGRldmZzX2VudHJ5ICpnZXRfZGV2ZnNfZW50cnlfZnJvbV92ZnNfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoaW5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJVkVSSUZZX0VOVFJZKChzdHJ1Y3QgZGV2ZnNfZW50cnkgKilpbm9kZS0+dS5nZW5lcmljX2lwKTsKKwlyZXR1cm4gaW5vZGUtPnUuZ2VuZXJpY19pcDsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBnZXRfZGV2ZnNfZW50cnlfZnJvbV92ZnNfaW5vZGUgICovCisKKy8qKgorICoJZnJlZV9kZW50cnkgLSBGcmVlIHRoZSBkZW50cnkgZm9yIGEgZGV2aWNlIGVudHJ5IGFuZCBpbnZhbGlkYXRlIGlub2RlLgorICoJQGRlOiBUaGUgZW50cnkuCisgKgorICoJVGhpcyBtdXN0IG9ubHkgYmUgY2FsbGVkIGFmdGVyIHRoZSBlbnRyeSBoYXMgYmVlbiB1bmhvb2tlZCBmcm9tIGl0cworICoJIHBhcmVudCBkaXJlY3RvcnkuCisgKi8KKworc3RhdGljIHZvaWQgZnJlZV9kZW50cnkoc3RydWN0IGRldmZzX2VudHJ5ICpkZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBkZS0+aW5vZGUuZGVudHJ5OworCisJaWYgKCFkZW50cnkpCisJCXJldHVybjsKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwlkZ2V0X2xvY2tlZChkZW50cnkpOworCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJLyogIEZvcmNlZnVsbHkgcmVtb3ZlIHRoZSBpbm9kZSAgKi8KKwlpZiAoZGVudHJ5LT5kX2lub2RlICE9IE5VTEwpCisJCWRlbnRyeS0+ZF9pbm9kZS0+aV9ubGluayA9IDA7CisJZF9kcm9wKGRlbnRyeSk7CisJZHB1dChkZW50cnkpOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIGZyZWVfZGVudHJ5ICAqLworCisvKioKKyAqCWlzX2RldmZzZF9vcl9jaGlsZCAtIFRlc3QgaWYgdGhlIGN1cnJlbnQgcHJvY2VzcyBpcyBkZXZmc2Qgb3Igb25lIG9mIGl0cyBjaGlsZHJlbi4KKyAqCUBmc19pbmZvOiBUaGUgZmlsZXN5c3RlbSBpbmZvcm1hdGlvbi4KKyAqCisgKglSZXR1cm5zICVUUlVFIGlmIGRldmZzZCBvciBjaGlsZCwgZWxzZSAlRkFMU0UuCisgKi8KKworc3RhdGljIGludCBpc19kZXZmc2Rfb3JfY2hpbGQoc3RydWN0IGZzX2luZm8gKmZzX2luZm8pCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwID0gY3VycmVudDsKKworCWlmIChwID09IGZzX2luZm8tPmRldmZzZF90YXNrKQorCQlyZXR1cm4gKFRSVUUpOworCWlmIChwcm9jZXNzX2dyb3VwKHApID09IGZzX2luZm8tPmRldmZzZF9wZ3JwKQorCQlyZXR1cm4gKFRSVUUpOworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJZm9yICg7IHAgIT0gJmluaXRfdGFzazsgcCA9IHAtPnJlYWxfcGFyZW50KSB7CisJCWlmIChwID09IGZzX2luZm8tPmRldmZzZF90YXNrKSB7CisJCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJCQlyZXR1cm4gKFRSVUUpOworCQl9CisJfQorCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlyZXR1cm4gKEZBTFNFKTsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBpc19kZXZmc2Rfb3JfY2hpbGQgICovCisKKy8qKgorICoJZGV2ZnNkX3F1ZXVlX2VtcHR5IC0gVGVzdCBpZiBkZXZmc2QgaGFzIHdvcmsgcGVuZGluZyBpbiBpdHMgZXZlbnQgcXVldWUuCisgKglAZnNfaW5mbzogVGhlIGZpbGVzeXN0ZW0gaW5mb3JtYXRpb24uCisgKgorICoJUmV0dXJucyAlVFJVRSBpZiB0aGUgcXVldWUgaXMgZW1wdHksIGVsc2UgJUZBTFNFLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGRldmZzZF9xdWV1ZV9lbXB0eShzdHJ1Y3QgZnNfaW5mbyAqZnNfaW5mbykKK3sKKwlyZXR1cm4gKGZzX2luZm8tPmRldmZzZF9sYXN0X2V2ZW50KSA/IEZBTFNFIDogVFJVRTsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc2RfcXVldWVfZW1wdHkgICovCisKKy8qKgorICoJd2FpdF9mb3JfZGV2ZnNkX2ZpbmlzaGVkIC0gV2FpdCBmb3IgZGV2ZnNkIHRvIGZpbmlzaCBwcm9jZXNzaW5nIGl0cyBldmVudCBxdWV1ZS4KKyAqCUBmc19pbmZvOiBUaGUgZmlsZXN5c3RlbSBpbmZvcm1hdGlvbi4KKyAqCisgKglSZXR1cm5zICVUUlVFIGlmIG5vIG1vcmUgd2FpdGluZyB3aWxsIGJlIHJlcXVpcmVkLCBlbHNlICVGQUxTRS4KKyAqLworCitzdGF0aWMgaW50IHdhaXRfZm9yX2RldmZzZF9maW5pc2hlZChzdHJ1Y3QgZnNfaW5mbyAqZnNfaW5mbykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCWlmIChmc19pbmZvLT5kZXZmc2RfdGFzayA9PSBOVUxMKQorCQlyZXR1cm4gKFRSVUUpOworCWlmIChkZXZmc2RfcXVldWVfZW1wdHkoZnNfaW5mbykgJiYgZnNfaW5mby0+ZGV2ZnNkX3NsZWVwaW5nKQorCQlyZXR1cm4gVFJVRTsKKwlpZiAoaXNfZGV2ZnNkX29yX2NoaWxkKGZzX2luZm8pKQorCQlyZXR1cm4gKEZBTFNFKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJYWRkX3dhaXRfcXVldWUoJmZzX2luZm8tPnJldmFsaWRhdGVfd2FpdF9xdWV1ZSwgJndhaXQpOworCWlmICghZGV2ZnNkX3F1ZXVlX2VtcHR5KGZzX2luZm8pIHx8ICFmc19pbmZvLT5kZXZmc2Rfc2xlZXBpbmcpCisJCWlmIChmc19pbmZvLT5kZXZmc2RfdGFzaykKKwkJCXNjaGVkdWxlKCk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmZzX2luZm8tPnJldmFsaWRhdGVfd2FpdF9xdWV1ZSwgJndhaXQpOworCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm4gKFRSVUUpOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIHdhaXRfZm9yX2RldmZzZF9maW5pc2hlZCAgKi8KKworLyoqCisgKglkZXZmc2Rfbm90aWZ5X2RlIC0gTm90aWZ5IHRoZSBkZXZmc2QgZGFlbW9uIG9mIGEgY2hhbmdlLgorICoJQGRlOiBUaGUgZGV2ZnMgZW50cnkgdGhhdCBoYXMgY2hhbmdlZC4gVGhpcyBhbmQgYWxsIHBhcmVudCBlbnRyaWVzIHdpbGwKKyAqICAgICAgICAgICAgaGF2ZSB0aGVpciByZWZlcmVuY2UgY291bnRzIGluY3JlbWVudGVkIGlmIHRoZSBldmVudCB3YXMgcXVldWVkLgorICoJQHR5cGU6IFRoZSB0eXBlIG9mIGNoYW5nZS4KKyAqCUBtb2RlOiBUaGUgbW9kZSBvZiB0aGUgZW50cnkuCisgKglAdWlkOiBUaGUgdXNlciBJRC4KKyAqCUBnaWQ6IFRoZSBncm91cCBJRC4KKyAqCUBmc19pbmZvOiBUaGUgZmlsZXN5c3RlbSBpbmZvLgorICoKKyAqCVJldHVybnMgJVRSVUUgaWYgYW4gZXZlbnQgd2FzIHF1ZXVlZCBhbmQgZGV2ZnNkIHdva2VuIHVwLCBlbHNlICVGQUxTRS4KKyAqLworCitzdGF0aWMgaW50IGRldmZzZF9ub3RpZnlfZGUoc3RydWN0IGRldmZzX2VudHJ5ICpkZSwKKwkJCSAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLCB1bW9kZV90IG1vZGUsCisJCQkgICAgdWlkX3QgdWlkLCBnaWRfdCBnaWQsIHN0cnVjdCBmc19pbmZvICpmc19pbmZvKQoreworCXN0cnVjdCBkZXZmc2RfYnVmX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgZGV2ZnNfZW50cnkgKmN1cnI7CisKKwlpZiAoIShmc19pbmZvLT5kZXZmc2RfZXZlbnRfbWFzayAmICgxIDw8IHR5cGUpKSkKKwkJcmV0dXJuIChGQUxTRSk7CisJaWYgKChlbnRyeSA9IGttZW1fY2FjaGVfYWxsb2MoZGV2ZnNkX2J1Zl9jYWNoZSwgU0xBQl9LRVJORUwpKSA9PSBOVUxMKSB7CisJCWF0b21pY19pbmMoJmZzX2luZm8tPmRldmZzZF9vdmVycnVuX2NvdW50KTsKKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCWZvciAoY3VyciA9IGRlOyBjdXJyICE9IE5VTEw7IGN1cnIgPSBjdXJyLT5wYXJlbnQpCisJCWRldmZzX2dldChjdXJyKTsKKwllbnRyeS0+ZGUgPSBkZTsKKwllbnRyeS0+dHlwZSA9IHR5cGU7CisJZW50cnktPm1vZGUgPSBtb2RlOworCWVudHJ5LT51aWQgPSB1aWQ7CisJZW50cnktPmdpZCA9IGdpZDsKKwllbnRyeS0+bmV4dCA9IE5VTEw7CisJc3Bpbl9sb2NrKCZmc19pbmZvLT5kZXZmc2RfYnVmZmVyX2xvY2spOworCWlmICghZnNfaW5mby0+ZGV2ZnNkX2ZpcnN0X2V2ZW50KQorCQlmc19pbmZvLT5kZXZmc2RfZmlyc3RfZXZlbnQgPSBlbnRyeTsKKwlpZiAoZnNfaW5mby0+ZGV2ZnNkX2xhc3RfZXZlbnQpCisJCWZzX2luZm8tPmRldmZzZF9sYXN0X2V2ZW50LT5uZXh0ID0gZW50cnk7CisJZnNfaW5mby0+ZGV2ZnNkX2xhc3RfZXZlbnQgPSBlbnRyeTsKKwlzcGluX3VubG9jaygmZnNfaW5mby0+ZGV2ZnNkX2J1ZmZlcl9sb2NrKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmZzX2luZm8tPmRldmZzZF93YWl0X3F1ZXVlKTsKKwlyZXR1cm4gKFRSVUUpOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIGRldmZzZF9ub3RpZnlfZGUgICovCisKKy8qKgorICoJZGV2ZnNkX25vdGlmeSAtIE5vdGlmeSB0aGUgZGV2ZnNkIGRhZW1vbiBvZiBhIGNoYW5nZS4KKyAqCUBkZTogVGhlIGRldmZzIGVudHJ5IHRoYXQgaGFzIGNoYW5nZWQuCisgKglAdHlwZTogVGhlIHR5cGUgb2YgY2hhbmdlIGV2ZW50LgorICoJQHdhaXQ6IElmIFRSVUUsIHRoZSBmdW5jdGlvbiB3YWl0cyBmb3IgdGhlIGRhZW1vbiB0byBmaW5pc2ggcHJvY2Vzc2luZworICoJCXRoZSBldmVudC4KKyAqLworCitzdGF0aWMgdm9pZCBkZXZmc2Rfbm90aWZ5KHN0cnVjdCBkZXZmc19lbnRyeSAqZGUsIHVuc2lnbmVkIHNob3J0IHR5cGUpCit7CisJZGV2ZnNkX25vdGlmeV9kZShkZSwgdHlwZSwgZGUtPm1vZGUsIGN1cnJlbnQtPmV1aWQsCisJCQkgY3VycmVudC0+ZWdpZCwgJmZzX2luZm8pOworfQorCitzdGF0aWMgaW50IGRldmZzX21rX2RldihkZXZfdCBkZXYsIHVtb2RlX3QgbW9kZSwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCit7CisJc3RydWN0IGRldmZzX2VudHJ5ICpkaXIgPSBOVUxMLCAqZGU7CisJY2hhciBidWZbNjRdOworCWludCBlcnJvciwgbjsKKworCW4gPSB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcmdzKTsKKwlpZiAobiA+PSBzaXplb2YoYnVmKSB8fCAhYnVmWzBdKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpbnZhbGlkIGZvcm1hdCBzdHJpbmcgJXNcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIGZtdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRlID0gX2RldmZzX3ByZXBhcmVfbGVhZigmZGlyLCBidWYsIG1vZGUpOworCWlmICghZGUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvdWxkIG5vdCBwcmVwYXJlIGxlYWYgZm9yICVzXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBidWYpOworCQlyZXR1cm4gLUVOT01FTTsJLyogY291bGQgYmUgbW9yZSBhY2N1cmF0ZS4uLiAqLworCX0KKworCWRlLT51LmRldiA9IGRldjsKKworCWVycm9yID0gX2RldmZzX2FwcGVuZF9lbnRyeShkaXIsIGRlLCBOVUxMKTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvdWxkIG5vdCBhcHBlbmQgdG8gcGFyZW50IGZvciAlc1xuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgYnVmKTsKKwkJZ290byBvdXQ7CisJfQorCisJZGV2ZnNkX25vdGlmeShkZSwgREVWRlNEX05PVElGWV9SRUdJU1RFUkVEKTsKKyAgICAgIG91dDoKKwlkZXZmc19wdXQoZGlyKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludCBkZXZmc19ta19iZGV2KGRldl90IGRldiwgdW1vZGVfdCBtb2RlLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwlpZiAoIVNfSVNCTEsobW9kZSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludmFsaWRlIG1vZGUgKCV1KSBmb3IgJXNcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIG1vZGUsIGZtdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcmV0dXJuIGRldmZzX21rX2RldihkZXYsIG1vZGUsIGZtdCwgYXJncyk7Cit9CisKK0VYUE9SVF9TWU1CT0woZGV2ZnNfbWtfYmRldik7CisKK2ludCBkZXZmc19ta19jZGV2KGRldl90IGRldiwgdW1vZGVfdCBtb2RlLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwlpZiAoIVNfSVNDSFIobW9kZSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludmFsaWRlIG1vZGUgKCV1KSBmb3IgJXNcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIG1vZGUsIGZtdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcmV0dXJuIGRldmZzX21rX2RldihkZXYsIG1vZGUsIGZtdCwgYXJncyk7Cit9CisKK0VYUE9SVF9TWU1CT0woZGV2ZnNfbWtfY2Rldik7CisKKy8qKgorICoJX2RldmZzX3VuaG9vayAtIFVuaG9vayBhIGRldmljZSBlbnRyeSBmcm9tIGl0cyBwYXJlbnRzIGxpc3QKKyAqCUBkZTogVGhlIGVudHJ5IHRvIHVuaG9vay4KKyAqCisgKglSZXR1cm5zICVUUlVFIGlmIHRoZSBlbnRyeSB3YXMgdW5ob29rZWQsIGVsc2UgJUZBTFNFIGlmIGl0IHdhcworICoJCXByZXZpb3VzbHkgdW5ob29rZWQuCisgKglUaGUgY2FsbGVyIG11c3QgaGF2ZSBhIHdyaXRlIGxvY2sgb24gdGhlIHBhcmVudCBkaXJlY3RvcnkuCisgKi8KKworc3RhdGljIGludCBfZGV2ZnNfdW5ob29rKHN0cnVjdCBkZXZmc19lbnRyeSAqZGUpCit7CisJc3RydWN0IGRldmZzX2VudHJ5ICpwYXJlbnQ7CisKKwlpZiAoIWRlIHx8IChkZS0+cHJldiA9PSBkZSkpCisJCXJldHVybiBGQUxTRTsKKwlwYXJlbnQgPSBkZS0+cGFyZW50OworCWlmIChkZS0+cHJldiA9PSBOVUxMKQorCQlwYXJlbnQtPnUuZGlyLmZpcnN0ID0gZGUtPm5leHQ7CisJZWxzZQorCQlkZS0+cHJldi0+bmV4dCA9IGRlLT5uZXh0OworCWlmIChkZS0+bmV4dCA9PSBOVUxMKQorCQlwYXJlbnQtPnUuZGlyLmxhc3QgPSBkZS0+cHJldjsKKwllbHNlCisJCWRlLT5uZXh0LT5wcmV2ID0gZGUtPnByZXY7CisJZGUtPnByZXYgPSBkZTsJCS8qICBJbmRpY2F0ZSB3ZSdyZSB1bmhvb2tlZCAgICAgICAgICAgICAgICAgICAgICAqLworCWRlLT5uZXh0ID0gTlVMTDsJLyogIEZvcmNlIGVhcmx5IHRlcm1pbmF0aW9uIGZvciA8ZGV2ZnNfcmVhZGRpcj4gICovCisJcmV0dXJuIFRSVUU7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gX2RldmZzX3VuaG9vayAgKi8KKworLyoqCisgKglfZGV2ZnNfdW5yZWdpc3RlciAtIFVucmVnaXN0ZXIgYSBkZXZpY2UgZW50cnkgZnJvbSBpdHMgcGFyZW50LgorICoJQGRpcjogVGhlIHBhcmVudCBkaXJlY3RvcnkuCisgKglAZGU6IFRoZSBlbnRyeSB0byB1bnJlZ2lzdGVyLgorICoKKyAqCVRoZSBjYWxsZXIgbXVzdCBoYXZlIGEgd3JpdGUgbG9jayBvbiB0aGUgcGFyZW50IGRpcmVjdG9yeSwgd2hpY2ggaXMKKyAqCXVubG9ja2VkIGJ5IHRoaXMgZnVuY3Rpb24uCisgKi8KKworc3RhdGljIHZvaWQgX2RldmZzX3VucmVnaXN0ZXIoc3RydWN0IGRldmZzX2VudHJ5ICpkaXIsIHN0cnVjdCBkZXZmc19lbnRyeSAqZGUpCit7CisJaW50IHVuaG9va2VkID0gX2RldmZzX3VuaG9vayhkZSk7CisKKwl3cml0ZV91bmxvY2soJmRpci0+dS5kaXIubG9jayk7CisJaWYgKCF1bmhvb2tlZCkKKwkJcmV0dXJuOworCWRldmZzX2dldChkaXIpOworCWRldmZzZF9ub3RpZnkoZGUsIERFVkZTRF9OT1RJRllfVU5SRUdJU1RFUkVEKTsKKwlmcmVlX2RlbnRyeShkZSk7CisJZGV2ZnNfcHV0KGRpcik7CisJaWYgKCFTX0lTRElSKGRlLT5tb2RlKSkKKwkJcmV0dXJuOworCXdoaWxlIChUUlVFKSB7CQkvKiAgUmVjdXJzaXZlbHkgdW5yZWdpc3RlcjogdGhpcyBpcyBhIHN0YWNrIGNob21wZXIgICovCisJCXN0cnVjdCBkZXZmc19lbnRyeSAqY2hpbGQ7CisKKwkJd3JpdGVfbG9jaygmZGUtPnUuZGlyLmxvY2spOworCQlkZS0+dS5kaXIubm9fbW9yZV9hZGRpdGlvbnMgPSBUUlVFOworCQljaGlsZCA9IGRlLT51LmRpci5maXJzdDsKKwkJVkVSSUZZX0VOVFJZKGNoaWxkKTsKKwkJX2RldmZzX3VucmVnaXN0ZXIoZGUsIGNoaWxkKTsKKwkJaWYgKCFjaGlsZCkKKwkJCWJyZWFrOworCQlEUFJJTlRLKERFQlVHX1VOUkVHSVNURVIsICIoJXMpOiBjaGlsZDogJXAgIHJlZmNvdW50OiAlZFxuIiwKKwkJCWNoaWxkLT5uYW1lLCBjaGlsZCwgYXRvbWljX3JlYWQoJmNoaWxkLT5yZWZjb3VudCkpOworCQlkZXZmc19wdXQoY2hpbGQpOworCX0KK30JCQkJLyogIEVuZCBGdW5jdGlvbiBfZGV2ZnNfdW5yZWdpc3RlciAgKi8KKworc3RhdGljIGludCBkZXZmc19kb19zeW1saW5rKGRldmZzX2hhbmRsZV90IGRpciwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICBjb25zdCBjaGFyICpsaW5rLCBkZXZmc19oYW5kbGVfdCAqIGhhbmRsZSkKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBsaW5rbGVuZ3RoOworCWNoYXIgKm5ld2xpbms7CisJc3RydWN0IGRldmZzX2VudHJ5ICpkZTsKKworCWlmIChoYW5kbGUgIT0gTlVMTCkKKwkJKmhhbmRsZSA9IE5VTEw7CisJaWYgKG5hbWUgPT0gTlVMTCkgeworCQlQUklOVEsoIigpOiBOVUxMIG5hbWUgcG9pbnRlclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobGluayA9PSBOVUxMKSB7CisJCVBSSU5USygiKCVzKTogTlVMTCBsaW5rIHBvaW50ZXJcbiIsIG5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbGlua2xlbmd0aCA9IHN0cmxlbihsaW5rKTsKKwlpZiAoKG5ld2xpbmsgPSBrbWFsbG9jKGxpbmtsZW5ndGggKyAxLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtY3B5KG5ld2xpbmssIGxpbmssIGxpbmtsZW5ndGgpOworCW5ld2xpbmtbbGlua2xlbmd0aF0gPSAnXDAnOworCWlmICgoZGUgPSBfZGV2ZnNfcHJlcGFyZV9sZWFmKCZkaXIsIG5hbWUsIFNfSUZMTksgfCBTX0lSVUdPIHwgU19JWFVHTykpCisJICAgID09IE5VTEwpIHsKKwkJUFJJTlRLKCIoJXMpOiBjb3VsZCBub3QgcHJlcGFyZSBsZWFmXG4iLCBuYW1lKTsKKwkJa2ZyZWUobmV3bGluayk7CisJCXJldHVybiAtRU5PVERJUjsKKwl9CisJZGUtPmluZm8gPSBOVUxMOworCWRlLT51LnN5bWxpbmsubGlua25hbWUgPSBuZXdsaW5rOworCWRlLT51LnN5bWxpbmsubGVuZ3RoID0gbGlua2xlbmd0aDsKKwlpZiAoKGVyciA9IF9kZXZmc19hcHBlbmRfZW50cnkoZGlyLCBkZSwgTlVMTCkpICE9IDApIHsKKwkJUFJJTlRLKCIoJXMpOiBjb3VsZCBub3QgYXBwZW5kIHRvIHBhcmVudCwgZXJyOiAlZFxuIiwgbmFtZSwKKwkJICAgICAgIGVycik7CisJCWRldmZzX3B1dChkaXIpOworCQlyZXR1cm4gZXJyOworCX0KKwlkZXZmc19wdXQoZGlyKTsKKyNpZmRlZiBDT05GSUdfREVWRlNfREVCVUcKKwlzcGluX2xvY2soJnN0YXRfbG9jayk7CisJc3RhdF9udW1fYnl0ZXMgKz0gbGlua2xlbmd0aCArIDE7CisJc3Bpbl91bmxvY2soJnN0YXRfbG9jayk7CisjZW5kaWYKKwlpZiAoaGFuZGxlICE9IE5VTEwpCisJCSpoYW5kbGUgPSBkZTsKKwlyZXR1cm4gMDsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc19kb19zeW1saW5rICAqLworCisvKioKKyAqCWRldmZzX21rX3N5bWxpbmsgQ3JlYXRlIGEgc3ltYm9saWMgbGluayBpbiB0aGUgZGV2ZnMgbmFtZXNwYWNlLgorICoJQGZyb206IFRoZSBuYW1lIG9mIHRoZSBlbnRyeS4KKyAqCUB0bzogTmFtZSBvZiB0aGUgZGVzdGluYXRpb24KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuCisgKi8KKworaW50IGRldmZzX21rX3N5bWxpbmsoY29uc3QgY2hhciAqZnJvbSwgY29uc3QgY2hhciAqdG8pCit7CisJZGV2ZnNfaGFuZGxlX3QgZGU7CisJaW50IGVycjsKKworCWVyciA9IGRldmZzX2RvX3N5bWxpbmsoTlVMTCwgZnJvbSwgdG8sICZkZSk7CisJaWYgKCFlcnIpIHsKKwkJZGUtPnZmcyA9IFRSVUU7CisJCWRldmZzZF9ub3RpZnkoZGUsIERFVkZTRF9OT1RJRllfUkVHSVNURVJFRCk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKglkZXZmc19ta19kaXIgLSBDcmVhdGUgYSBkaXJlY3RvcnkgaW4gdGhlIGRldmZzIG5hbWVzcGFjZS4KKyAqCQluZXcgbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgZGV2ZnMuCisgKglAZm10OiBUaGUgbmFtZSBvZiB0aGUgZW50cnkuCisgKgorICoJVXNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgb3B0aW9uYWwuIFRoZSBkZXZmc19yZWdpc3RlcigpIGZ1bmN0aW9uCisgKgl3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGludGVybWVkaWF0ZSBkaXJlY3RvcmllcyBhcyBuZWVkZWQuIFRoaXMgZnVuY3Rpb24KKyAqCWlzIHByb3ZpZGVkIGZvciBlZmZpY2llbmN5IHJlYXNvbnMsIGFzIGl0IHByb3ZpZGVzIGEgaGFuZGxlIHRvIGEgZGlyZWN0b3J5LgorICoJT24gZmFpbHVyZSAlTlVMTCBpcyByZXR1cm5lZC4KKyAqLworCitpbnQgZGV2ZnNfbWtfZGlyKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXN0cnVjdCBkZXZmc19lbnRyeSAqZGlyID0gTlVMTCwgKmRlID0gTlVMTCwgKm9sZDsKKwljaGFyIGJ1Zls2NF07CisJdmFfbGlzdCBhcmdzOworCWludCBlcnJvciwgbjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJbiA9IHZzbnByaW50ZihidWYsIDY0LCBmbXQsIGFyZ3MpOworCWlmIChuID49IDY0IHx8ICFidWZbMF0pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludmFsaWQgYXJndW1lbnQuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGUgPSBfZGV2ZnNfcHJlcGFyZV9sZWFmKCZkaXIsIGJ1ZiwgTU9ERV9ESVIpOworCWlmICghZGUpIHsKKwkJUFJJTlRLKCIoJXMpOiBjb3VsZCBub3QgcHJlcGFyZSBsZWFmXG4iLCBidWYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllcnJvciA9IF9kZXZmc19hcHBlbmRfZW50cnkoZGlyLCBkZSwgJm9sZCk7CisJaWYgKGVycm9yID09IC1FRVhJU1QgJiYgU19JU0RJUihvbGQtPm1vZGUpKSB7CisJCS8qCisJCSAqIGRldmZzX21rX2RpcigpIG9mIGFuIGFscmVhZHktZXhpc3RpbmcgZGlyZWN0b3J5IHdpbGwKKwkJICogcmV0dXJuIHN1Y2Nlc3MuCisJCSAqLworCQllcnJvciA9IDA7CisJCWdvdG8gb3V0X3B1dDsKKwl9IGVsc2UgaWYgKGVycm9yKSB7CisJCVBSSU5USygiKCVzKTogY291bGQgbm90IGFwcGVuZCB0byBkaXI6ICVwIFwiJXNcIlxuIiwKKwkJICAgICAgIGJ1ZiwgZGlyLCBkaXItPm5hbWUpOworCQlkZXZmc19wdXQob2xkKTsKKwkJZ290byBvdXRfcHV0OworCX0KKworCWRldmZzZF9ub3RpZnkoZGUsIERFVkZTRF9OT1RJRllfUkVHSVNURVJFRCk7CisKKyAgICAgIG91dF9wdXQ6CisJZGV2ZnNfcHV0KGRpcik7CisJcmV0dXJuIGVycm9yOworfQorCit2b2lkIGRldmZzX3JlbW92ZShjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwljaGFyIGJ1Zls2NF07CisJdmFfbGlzdCBhcmdzOworCWludCBuOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwluID0gdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXJncyk7CisJaWYgKG4gPCBzaXplb2YoYnVmKSAmJiBidWZbMF0pIHsKKwkJZGV2ZnNfaGFuZGxlX3QgZGUgPSBfZGV2ZnNfZmluZF9lbnRyeShOVUxMLCBidWYsIDApOworCisJCWlmICghZGUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzIG5vdCBmb3VuZCwgY2Fubm90IHJlbW92ZVxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGJ1Zik7CisJCQlkdW1wX3N0YWNrKCk7CisJCQlyZXR1cm47CisJCX0KKworCQl3cml0ZV9sb2NrKCZkZS0+cGFyZW50LT51LmRpci5sb2NrKTsKKwkJX2RldmZzX3VucmVnaXN0ZXIoZGUtPnBhcmVudCwgZGUpOworCQlkZXZmc19wdXQoZGUpOworCQlkZXZmc19wdXQoZGUpOworCX0KK30KKworLyoqCisgKglkZXZmc19nZW5lcmF0ZV9wYXRoIC0gR2VuZXJhdGUgYSBwYXRobmFtZSBmb3IgYW4gZW50cnksIHJlbGF0aXZlIHRvIHRoZSBkZXZmcyByb290LgorICoJQGRlOiBUaGUgZGV2ZnMgZW50cnkuCisgKglAcGF0aDogVGhlIGJ1ZmZlciB0byB3cml0ZSB0aGUgcGF0aG5hbWUgdG8uIFRoZSBwYXRobmFtZSBhbmQgJ1wwJworICoJCXRlcm1pbmF0b3Igd2lsbCBiZSB3cml0dGVuIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKyAqCUBidWZsZW46IFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlci4KKyAqCisgKglSZXR1cm5zIHRoZSBvZmZzZXQgaW4gdGhlIGJ1ZmZlciB3aGVyZSB0aGUgcGF0aG5hbWUgc3RhcnRzIG9uIHN1Y2Nlc3MsCisgKgllbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworCitzdGF0aWMgaW50IGRldmZzX2dlbmVyYXRlX3BhdGgoZGV2ZnNfaGFuZGxlX3QgZGUsIGNoYXIgKnBhdGgsIGludCBidWZsZW4pCit7CisJaW50IHBvczsKKyNkZWZpbmUgTkFNRU9GKGRlKSAoIChkZSktPm1vZGUgPyAoZGUpLT5uYW1lIDogKGRlKS0+dS5uYW1lICkKKworCWlmIChkZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlWRVJJRllfRU5UUlkoZGUpOworCWlmIChkZS0+bmFtZWxlbiA+PSBidWZsZW4pCisJCXJldHVybiAtRU5BTUVUT09MT05HOwkvKiAgTXVzdCBiZSBmaXJzdCAgICAgICAqLworCXBhdGhbYnVmbGVuIC0gMV0gPSAnXDAnOworCWlmIChkZS0+cGFyZW50ID09IE5VTEwpCisJCXJldHVybiBidWZsZW4gLSAxOwkvKiAgRG9uJ3QgcHJlcGVuZCByb290ICAqLworCXBvcyA9IGJ1ZmxlbiAtIGRlLT5uYW1lbGVuIC0gMTsKKwltZW1jcHkocGF0aCArIHBvcywgTkFNRU9GKGRlKSwgZGUtPm5hbWVsZW4pOworCWZvciAoZGUgPSBkZS0+cGFyZW50OyBkZS0+cGFyZW50ICE9IE5VTEw7IGRlID0gZGUtPnBhcmVudCkgeworCQlpZiAocG9zIC0gZGUtPm5hbWVsZW4gLSAxIDwgMCkKKwkJCXJldHVybiAtRU5BTUVUT09MT05HOworCQlwYXRoWy0tcG9zXSA9ICcvJzsKKwkJcG9zIC09IGRlLT5uYW1lbGVuOworCQltZW1jcHkocGF0aCArIHBvcywgTkFNRU9GKGRlKSwgZGUtPm5hbWVsZW4pOworCX0KKwlyZXR1cm4gcG9zOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIGRldmZzX2dlbmVyYXRlX3BhdGggICovCisKKy8qKgorICoJZGV2ZnNfc2V0dXAgLSBQcm9jZXNzIGtlcm5lbCBib290IG9wdGlvbnMuCisgKglAc3RyOiBUaGUgYm9vdCBvcHRpb25zIGFmdGVyIHRoZSAiZGV2ZnM9Ii4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBkZXZmc19zZXR1cChjaGFyICpzdHIpCit7CisJc3RhdGljIHN0cnVjdCB7CisJCWNoYXIgKm5hbWU7CisJCXVuc2lnbmVkIGludCBtYXNrOworCQl1bnNpZ25lZCBpbnQgKm9wdDsKKwl9IGRldmZzX29wdGlvbnNfdGFiW10gX19pbml0ZGF0YSA9IHsKKyNpZmRlZiBDT05GSUdfREVWRlNfREVCVUcKKwkJeworCQkiZGFsbCIsIERFQlVHX0FMTCwgJmRldmZzX2RlYnVnX2luaXR9LCB7CisJCSJkbW9kIiwgREVCVUdfTU9EVUxFX0xPQUQsICZkZXZmc19kZWJ1Z19pbml0fSwgeworCQkiZHJlZyIsIERFQlVHX1JFR0lTVEVSLCAmZGV2ZnNfZGVidWdfaW5pdH0sIHsKKwkJImR1bnJlZyIsIERFQlVHX1VOUkVHSVNURVIsICZkZXZmc19kZWJ1Z19pbml0fSwgeworCQkiZGZyZWUiLCBERUJVR19GUkVFLCAmZGV2ZnNfZGVidWdfaW5pdH0sIHsKKwkJImRpZ2V0IiwgREVCVUdfSV9HRVQsICZkZXZmc19kZWJ1Z19pbml0fSwgeworCQkiZGNoYW5nZSIsIERFQlVHX1NFVF9GTEFHUywgJmRldmZzX2RlYnVnX2luaXR9LCB7CisJCSJkc3JlYWQiLCBERUJVR19TX1JFQUQsICZkZXZmc19kZWJ1Z19pbml0fSwgeworCQkiZGljaGFuZ2UiLCBERUJVR19JX0NIQU5HRSwgJmRldmZzX2RlYnVnX2luaXR9LCB7CisJCSJkaW1rbm9kIiwgREVCVUdfSV9NS05PRCwgJmRldmZzX2RlYnVnX2luaXR9LCB7CisJCSJkaWxvb2t1cCIsIERFQlVHX0lfTE9PS1VQLCAmZGV2ZnNfZGVidWdfaW5pdH0sIHsKKwkJImRpdW5saW5rIiwgREVCVUdfSV9VTkxJTkssICZkZXZmc19kZWJ1Z19pbml0fSwKKyNlbmRpZgkJCQkvKiAgQ09ORklHX0RFVkZTX0RFQlVHICAqLworCQl7CisJCSJtb3VudCIsIE9QVElPTl9NT1VOVCwgJmJvb3Rfb3B0aW9uc30sIHsKKwkJTlVMTCwgMCwgTlVMTH0KKwl9OworCisJd2hpbGUgKCgqc3RyICE9ICdcMCcpICYmICFpc3NwYWNlKCpzdHIpKSB7CisJCWludCBpLCBmb3VuZCA9IDAsIGludmVydCA9IDA7CisKKwkJaWYgKHN0cm5jbXAoc3RyLCAibm8iLCAyKSA9PSAwKSB7CisJCQlpbnZlcnQgPSAxOworCQkJc3RyICs9IDI7CisJCX0KKwkJZm9yIChpID0gMDsgZGV2ZnNfb3B0aW9uc190YWJbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKKwkJCWludCBsZW4gPSBzdHJsZW4oZGV2ZnNfb3B0aW9uc190YWJbaV0ubmFtZSk7CisKKwkJCWlmIChzdHJuY21wKHN0ciwgZGV2ZnNfb3B0aW9uc190YWJbaV0ubmFtZSwgbGVuKSA9PSAwKSB7CisJCQkJaWYgKGludmVydCkKKwkJCQkJKmRldmZzX29wdGlvbnNfdGFiW2ldLm9wdCAmPQorCQkJCQkgICAgfmRldmZzX29wdGlvbnNfdGFiW2ldLm1hc2s7CisJCQkJZWxzZQorCQkJCQkqZGV2ZnNfb3B0aW9uc190YWJbaV0ub3B0IHw9CisJCQkJCSAgICBkZXZmc19vcHRpb25zX3RhYltpXS5tYXNrOworCQkJCXN0ciArPSBsZW47CisJCQkJZm91bmQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghZm91bmQpCisJCQlyZXR1cm4gMDsJLyogIE5vIG1hdGNoICAgICAgICAgKi8KKwkJaWYgKCpzdHIgIT0gJywnKQorCQkJcmV0dXJuIDA7CS8qICBObyBtb3JlIG9wdGlvbnMgICovCisJCSsrc3RyOworCX0KKwlyZXR1cm4gMTsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc19zZXR1cCAgKi8KKworX19zZXR1cCgiZGV2ZnM9IiwgZGV2ZnNfc2V0dXApOworCitFWFBPUlRfU1lNQk9MKGRldmZzX21rX2Rpcik7CitFWFBPUlRfU1lNQk9MKGRldmZzX3JlbW92ZSk7CisKKy8qKgorICoJdHJ5X21vZGxvYWQgLSBOb3RpZnkgZGV2ZnNkIG9mIGFuIGlub2RlIGxvb2t1cCBieSBhIG5vbi1kZXZmc2QgcHJvY2Vzcy4KKyAqCUBwYXJlbnQ6IFRoZSBwYXJlbnQgZGV2ZnMgZW50cnkuCisgKglAZnNfaW5mbzogVGhlIGZpbGVzeXN0ZW0gaW5mby4KKyAqCUBuYW1lOiBUaGUgZGV2aWNlIG5hbWUuCisgKglAbmFtZWxlbjogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIEBuYW1lLgorICoJQGJ1ZjogQSB3b3JraW5nIGFyZWEgdGhhdCB3aWxsIGJlIHVzZWQuIFRoaXMgbXVzdCBub3QgZ28gb3V0IG9mIHNjb3BlCisgKiAgICAgICAgICAgIHVudGlsIGRldmZzZCBpcyBpZGxlIGFnYWluLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIChldmVudCB3YXMgcXVldWVkKSwgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KKworc3RhdGljIGludCB0cnlfbW9kbG9hZChzdHJ1Y3QgZGV2ZnNfZW50cnkgKnBhcmVudCwgc3RydWN0IGZzX2luZm8gKmZzX2luZm8sCisJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBuYW1lbGVuLAorCQkgICAgICAgc3RydWN0IGRldmZzX2VudHJ5ICpidWYpCit7CisJaWYgKCEoZnNfaW5mby0+ZGV2ZnNkX2V2ZW50X21hc2sgJiAoMSA8PCBERVZGU0RfTk9USUZZX0xPT0tVUCkpKQorCQlyZXR1cm4gLUVOT0VOVDsKKwlpZiAoaXNfZGV2ZnNkX29yX2NoaWxkKGZzX2luZm8pKQorCQlyZXR1cm4gLUVOT0VOVDsKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YgKmJ1Zik7CisJYXRvbWljX3NldCgmYnVmLT5yZWZjb3VudCwgMSk7CisJYnVmLT5wYXJlbnQgPSBwYXJlbnQ7CisJYnVmLT5uYW1lbGVuID0gbmFtZWxlbjsKKwlidWYtPnUubmFtZSA9IG5hbWU7CisJV1JJVEVfRU5UUllfTUFHSUMoYnVmLCBNQUdJQ19WQUxVRSk7CisJaWYgKCFkZXZmc2Rfbm90aWZ5X2RlKGJ1ZiwgREVWRlNEX05PVElGWV9MT09LVVAsIDAsCisJCQkgICAgICBjdXJyZW50LT5ldWlkLCBjdXJyZW50LT5lZ2lkLCBmc19pbmZvKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJLyogIFBvc3NpYmxlIHN1Y2Nlc3M6IGV2ZW50IGhhcyBiZWVuIHF1ZXVlZCAgKi8KKwlyZXR1cm4gMDsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiB0cnlfbW9kbG9hZCAgKi8KKworLyogIFN1cGVyYmxvY2sgb3BlcmF0aW9ucyBmb2xsb3cgICovCisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBkZXZmc19pb3BzOworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGRldmZzX2Rpcl9pb3BzOworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGV2ZnNfZm9wczsKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRldmZzX2Rpcl9mb3BzOworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGRldmZzX3N5bWxpbmtfaW9wczsKKworc3RhdGljIGludCBkZXZmc19ub3RpZnlfY2hhbmdlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICppYXR0cikKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBkZXZmc19lbnRyeSAqZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnNfaW5mbyAqZnNfaW5mbyA9IGlub2RlLT5pX3NiLT5zX2ZzX2luZm87CisKKwlkZSA9IGdldF9kZXZmc19lbnRyeV9mcm9tX3Zmc19pbm9kZShpbm9kZSk7CisJaWYgKGRlID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCXJldHZhbCA9IGlub2RlX2NoYW5nZV9vayhpbm9kZSwgaWF0dHIpOworCWlmIChyZXR2YWwgIT0gMCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR2YWwgPSBpbm9kZV9zZXRhdHRyKGlub2RlLCBpYXR0cik7CisJaWYgKHJldHZhbCAhPSAwKQorCQlyZXR1cm4gcmV0dmFsOworCURQUklOVEsoREVCVUdfSV9DSEFOR0UsICIoJWQpOiBWRlMgaW5vZGU6ICVwICBkZXZmc19lbnRyeTogJXBcbiIsCisJCShpbnQpaW5vZGUtPmlfaW5vLCBpbm9kZSwgZGUpOworCURQUklOVEsoREVCVUdfSV9DSEFOR0UsICIoKTogICBtb2RlOiAwJW8gIHVpZDogJWQgIGdpZDogJWRcbiIsCisJCShpbnQpaW5vZGUtPmlfbW9kZSwgKGludClpbm9kZS0+aV91aWQsIChpbnQpaW5vZGUtPmlfZ2lkKTsKKwkvKiAgSW5vZGUgaXMgbm90IG9uIGhhc2ggY2hhaW5zLCB0aHVzIG11c3Qgc2F2ZSBwZXJtaXNzaW9ucyBoZXJlIHJhdGhlcgorCSAgIHRoYW4gaW4gYSB3cml0ZV9pbm9kZSgpIG1ldGhvZCAgKi8KKwlkZS0+bW9kZSA9IGlub2RlLT5pX21vZGU7CisJZGUtPmlub2RlLnVpZCA9IGlub2RlLT5pX3VpZDsKKwlkZS0+aW5vZGUuZ2lkID0gaW5vZGUtPmlfZ2lkOworCWRlLT5pbm9kZS5hdGltZSA9IGlub2RlLT5pX2F0aW1lOworCWRlLT5pbm9kZS5tdGltZSA9IGlub2RlLT5pX210aW1lOworCWRlLT5pbm9kZS5jdGltZSA9IGlub2RlLT5pX2N0aW1lOworCWlmICgoaWF0dHItPmlhX3ZhbGlkICYgKEFUVFJfTU9ERSB8IEFUVFJfVUlEIHwgQVRUUl9HSUQpKSAmJgorCSAgICAhaXNfZGV2ZnNkX29yX2NoaWxkKGZzX2luZm8pKQorCQlkZXZmc2Rfbm90aWZ5X2RlKGRlLCBERVZGU0RfTk9USUZZX0NIQU5HRSwgaW5vZGUtPmlfbW9kZSwKKwkJCQkgaW5vZGUtPmlfdWlkLCBpbm9kZS0+aV9naWQsIGZzX2luZm8pOworCXJldHVybiAwOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIGRldmZzX25vdGlmeV9jaGFuZ2UgICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBkZXZmc19zb3BzID0geworCS5kcm9wX2lub2RlID0gZ2VuZXJpY19kZWxldGVfaW5vZGUsCisJLnN0YXRmcyA9IHNpbXBsZV9zdGF0ZnMsCit9OworCisvKioKKyAqCV9kZXZmc19nZXRfdmZzX2lub2RlIC0gR2V0IGEgVkZTIGlub2RlLgorICoJQHNiOiBUaGUgc3VwZXIgYmxvY2suCisgKglAZGU6IFRoZSBkZXZmcyBpbm9kZS4KKyAqCUBkZW50cnk6IFRoZSBkZW50cnkgdG8gcmVnaXN0ZXIgd2l0aCB0aGUgZGV2ZnMgaW5vZGUuCisgKgorICoJUmV0dXJucyB0aGUgaW5vZGUgb24gc3VjY2VzcywgZWxzZSAlTlVMTC4gQW4gaW1wbGljaXQgZGV2ZnNfZ2V0KCkgaXMKKyAqICAgICAgIHBlcmZvcm1lZCBpZiB0aGUgaW5vZGUgaXMgY3JlYXRlZC4KKyAqLworCitzdGF0aWMgc3RydWN0IGlub2RlICpfZGV2ZnNfZ2V0X3Zmc19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCQkgIHN0cnVjdCBkZXZmc19lbnRyeSAqZGUsCisJCQkJCSAgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlpZiAoZGUtPnByZXYgPT0gZGUpCisJCXJldHVybiBOVUxMOwkvKiAgUXVpY2sgY2hlY2sgdG8gc2VlIGlmIHVuaG9va2VkICAqLworCWlmICgoaW5vZGUgPSBuZXdfaW5vZGUoc2IpKSA9PSBOVUxMKSB7CisJCVBSSU5USygiKCVzKTogbmV3X2lub2RlKCkgZmFpbGVkLCBkZTogJXBcbiIsIGRlLT5uYW1lLCBkZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoZGUtPnBhcmVudCkgeworCQlyZWFkX2xvY2soJmRlLT5wYXJlbnQtPnUuZGlyLmxvY2spOworCQlpZiAoZGUtPnByZXYgIT0gZGUpCisJCQlkZS0+aW5vZGUuZGVudHJ5ID0gZGVudHJ5OwkvKiAgICAgIE5vdCB1bmhvb2tlZCAgKi8KKwkJcmVhZF91bmxvY2soJmRlLT5wYXJlbnQtPnUuZGlyLmxvY2spOworCX0gZWxzZQorCQlkZS0+aW5vZGUuZGVudHJ5ID0gZGVudHJ5OwkvKiAgUm9vdDogbm8gbG9ja2luZyBuZWVkZWQgICovCisJaWYgKGRlLT5pbm9kZS5kZW50cnkgIT0gZGVudHJ5KSB7CS8qICBNdXN0IGhhdmUgYmVlbiB1bmhvb2tlZCAgKi8KKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvKiBGSVhNRSB3aGVyZSBpcyBkZXZmc19wdXQ/ICovCisJaW5vZGUtPnUuZ2VuZXJpY19pcCA9IGRldmZzX2dldChkZSk7CisJaW5vZGUtPmlfaW5vID0gZGUtPmlub2RlLmlubzsKKwlEUFJJTlRLKERFQlVHX0lfR0VULCAiKCVkKTogVkZTIGlub2RlOiAlcCAgZGV2ZnNfZW50cnk6ICVwXG4iLAorCQkoaW50KWlub2RlLT5pX2lubywgaW5vZGUsIGRlKTsKKwlpbm9kZS0+aV9ibG9ja3MgPSAwOworCWlub2RlLT5pX2Jsa3NpemUgPSBGQUtFX0JMT0NLX1NJWkU7CisJaW5vZGUtPmlfb3AgPSAmZGV2ZnNfaW9wczsKKwlpbm9kZS0+aV9tb2RlID0gZGUtPm1vZGU7CisJaWYgKFNfSVNESVIoZGUtPm1vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJmRldmZzX2Rpcl9pb3BzOworCQlpbm9kZS0+aV9mb3AgPSAmZGV2ZnNfZGlyX2ZvcHM7CisJfSBlbHNlIGlmIChTX0lTTE5LKGRlLT5tb2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZkZXZmc19zeW1saW5rX2lvcHM7CisJCWlub2RlLT5pX3NpemUgPSBkZS0+dS5zeW1saW5rLmxlbmd0aDsKKwl9IGVsc2UgaWYgKFNfSVNDSFIoZGUtPm1vZGUpIHx8IFNfSVNCTEsoZGUtPm1vZGUpKSB7CisJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgZGUtPm1vZGUsIGRlLT51LmRldik7CisJfSBlbHNlIGlmIChTX0lTRklGTyhkZS0+bW9kZSkgfHwgU19JU1NPQ0soZGUtPm1vZGUpKSB7CisJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgZGUtPm1vZGUsIDApOworCX0gZWxzZSB7CisJCVBSSU5USygiKCVzKTogdW5rbm93biBtb2RlICVvIGRlOiAlcFxuIiwKKwkJICAgICAgIGRlLT5uYW1lLCBkZS0+bW9kZSwgZGUpOworCQlpcHV0KGlub2RlKTsKKwkJZGV2ZnNfcHV0KGRlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaW5vZGUtPmlfdWlkID0gZGUtPmlub2RlLnVpZDsKKwlpbm9kZS0+aV9naWQgPSBkZS0+aW5vZGUuZ2lkOworCWlub2RlLT5pX2F0aW1lID0gZGUtPmlub2RlLmF0aW1lOworCWlub2RlLT5pX210aW1lID0gZGUtPmlub2RlLm10aW1lOworCWlub2RlLT5pX2N0aW1lID0gZGUtPmlub2RlLmN0aW1lOworCURQUklOVEsoREVCVUdfSV9HRVQsICIoKTogICBtb2RlOiAwJW8gIHVpZDogJWQgIGdpZDogJWRcbiIsCisJCShpbnQpaW5vZGUtPmlfbW9kZSwgKGludClpbm9kZS0+aV91aWQsIChpbnQpaW5vZGUtPmlfZ2lkKTsKKwlyZXR1cm4gaW5vZGU7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gX2RldmZzX2dldF92ZnNfaW5vZGUgICovCisKKy8qICBGaWxlIG9wZXJhdGlvbnMgZm9yIGRldmljZSBlbnRyaWVzIGZvbGxvdyAgKi8KKworc3RhdGljIGludCBkZXZmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCWludCBlcnIsIGNvdW50OworCWludCBzdG9yZWQgPSAwOworCXN0cnVjdCBmc19pbmZvICpmc19pbmZvOworCXN0cnVjdCBkZXZmc19lbnRyeSAqcGFyZW50LCAqZGUsICpuZXh0ID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisKKwlmc19pbmZvID0gaW5vZGUtPmlfc2ItPnNfZnNfaW5mbzsKKwlwYXJlbnQgPSBnZXRfZGV2ZnNfZW50cnlfZnJvbV92ZnNfaW5vZGUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWlmICgobG9uZylmaWxlLT5mX3BvcyA8IDApCisJCXJldHVybiAtRUlOVkFMOworCURQUklOVEsoREVCVUdfRl9SRUFERElSLCAiKCVzKTogZnNfaW5mbzogJXAgIHBvczogJWxkXG4iLAorCQlwYXJlbnQtPm5hbWUsIGZzX2luZm8sIChsb25nKWZpbGUtPmZfcG9zKTsKKwlzd2l0Y2ggKChsb25nKWZpbGUtPmZfcG9zKSB7CisJY2FzZSAwOgorCQllcnIgPSAoKmZpbGxkaXIpIChkaXJlbnQsICIuLiIsIDIsIGZpbGUtPmZfcG9zLAorCQkJCSAgcGFyZW50X2lubyhmaWxlLT5mX2RlbnRyeSksIERUX0RJUik7CisJCWlmIChlcnIgPT0gLUVJTlZBTCkKKwkJCWJyZWFrOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWZpbGUtPmZfcG9zKys7CisJCSsrc3RvcmVkOworCQkvKiAgRmFsbCB0aHJvdWdoICAqLworCWNhc2UgMToKKwkJZXJyID0KKwkJICAgICgqZmlsbGRpcikgKGRpcmVudCwgIi4iLCAxLCBmaWxlLT5mX3BvcywgaW5vZGUtPmlfaW5vLAorCQkJCURUX0RJUik7CisJCWlmIChlcnIgPT0gLUVJTlZBTCkKKwkJCWJyZWFrOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWZpbGUtPmZfcG9zKys7CisJCSsrc3RvcmVkOworCQkvKiAgRmFsbCB0aHJvdWdoICAqLworCWRlZmF1bHQ6CisJCS8qICBTa2lwIGVudHJpZXMgICovCisJCWNvdW50ID0gZmlsZS0+Zl9wb3MgLSAyOworCQlyZWFkX2xvY2soJnBhcmVudC0+dS5kaXIubG9jayk7CisJCWZvciAoZGUgPSBwYXJlbnQtPnUuZGlyLmZpcnN0OyBkZSAmJiAoY291bnQgPiAwKTsgZGUgPSBkZS0+bmV4dCkKKwkJCS0tY291bnQ7CisJCWRldmZzX2dldChkZSk7CisJCXJlYWRfdW5sb2NrKCZwYXJlbnQtPnUuZGlyLmxvY2spOworCQkvKiAgTm93IGFkZCBhbGwgcmVtYWluaW5nIGVudHJpZXMgICovCisJCXdoaWxlIChkZSkgeworCQkJZXJyID0gKCpmaWxsZGlyKSAoZGlyZW50LCBkZS0+bmFtZSwgZGUtPm5hbWVsZW4sCisJCQkJCSAgZmlsZS0+Zl9wb3MsIGRlLT5pbm9kZS5pbm8sCisJCQkJCSAgZGUtPm1vZGUgPj4gMTIpOworCQkJaWYgKGVyciA8IDApCisJCQkJZGV2ZnNfcHV0KGRlKTsKKwkJCWVsc2UgeworCQkJCWZpbGUtPmZfcG9zKys7CisJCQkJKytzdG9yZWQ7CisJCQl9CisJCQlpZiAoZXJyID09IC1FSU5WQUwpCisJCQkJYnJlYWs7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJcmVhZF9sb2NrKCZwYXJlbnQtPnUuZGlyLmxvY2spOworCQkJbmV4dCA9IGRldmZzX2dldChkZS0+bmV4dCk7CisJCQlyZWFkX3VubG9jaygmcGFyZW50LT51LmRpci5sb2NrKTsKKwkJCWRldmZzX3B1dChkZSk7CisJCQlkZSA9IG5leHQ7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiBzdG9yZWQ7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gZGV2ZnNfcmVhZGRpciAgKi8KKworLyogT3BlbiBkZXZmcyBzcGVjaWZpYyBzcGVjaWFsIGZpbGVzICovCitzdGF0aWMgaW50IGRldmZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGVycjsKKwlpbnQgbWlub3IgPSBNSU5PUihpbm9kZS0+aV9yZGV2KTsKKwlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpvbGRfZm9wcywgKm5ld19mb3BzOworCisJc3dpdGNoIChtaW5vcikgeworCWNhc2UgMDoJCS8qIC9kZXYvLmRldmZzZCAqLworCQluZXdfZm9wcyA9IGZvcHNfZ2V0KCZkZXZmc2RfZm9wcyk7CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19ERVZGU19ERUJVRworCWNhc2UgMToJCS8qIC9kZXYvLnN0YXQgKi8KKwkJbmV3X2ZvcHMgPSBmb3BzX2dldCgmc3RhdF9mb3BzKTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAobmV3X2ZvcHMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJb2xkX2ZvcHMgPSBmaWxlLT5mX29wOworCWZpbGUtPmZfb3AgPSBuZXdfZm9wczsKKwllcnIgPSBuZXdfZm9wcy0+b3BlbiA/IG5ld19mb3BzLT5vcGVuKGlub2RlLCBmaWxlKSA6IDA7CisJaWYgKGVycikgeworCQlmaWxlLT5mX29wID0gb2xkX2ZvcHM7CisJCWZvcHNfcHV0KG5ld19mb3BzKTsKKwl9IGVsc2UKKwkJZm9wc19wdXQob2xkX2ZvcHMpOworCXJldHVybiBlcnI7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gZGV2ZnNfb3BlbiAgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGV2ZnNfZm9wcyA9IHsKKwkub3BlbiA9IGRldmZzX29wZW4sCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZXZmc19kaXJfZm9wcyA9IHsKKwkucmVhZCA9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIgPSBkZXZmc19yZWFkZGlyLAorfTsKKworLyogIERlbnRyeSBvcGVyYXRpb25zIGZvciBkZXZpY2UgZW50cmllcyBmb2xsb3cgICovCisKKy8qKgorICoJZGV2ZnNfZF9yZWxlYXNlIC0gQ2FsbGJhY2sgZm9yIHdoZW4gYSBkZW50cnkgaXMgZnJlZWQuCisgKglAZGVudHJ5OiBUaGUgZGVudHJ5LgorICovCisKK3N0YXRpYyB2b2lkIGRldmZzX2RfcmVsZWFzZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJRFBSSU5USyhERUJVR19EX1JFTEVBU0UsICIoJXApOiBpbm9kZTogJXBcbiIsIGRlbnRyeSwgZGVudHJ5LT5kX2lub2RlKTsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc19kX3JlbGVhc2UgICovCisKKy8qKgorICoJZGV2ZnNfZF9pcHV0IC0gQ2FsbGJhY2sgZm9yIHdoZW4gYSBkZW50cnkgbG9zZXMgaXRzIGlub2RlLgorICoJQGRlbnRyeTogVGhlIGRlbnRyeS4KKyAqCUBpbm9kZToJVGhlIGlub2RlLgorICovCisKK3N0YXRpYyB2b2lkIGRldmZzX2RfaXB1dChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGRldmZzX2VudHJ5ICpkZTsKKworCWRlID0gZ2V0X2RldmZzX2VudHJ5X2Zyb21fdmZzX2lub2RlKGlub2RlKTsKKwlEUFJJTlRLKERFQlVHX0RfSVBVVCwKKwkJIiglcyk6IGRlbnRyeTogJXAgaW5vZGU6ICVwIGRlOiAlcCBkZS0+ZGVudHJ5OiAlcFxuIiwgZGUtPm5hbWUsCisJCWRlbnRyeSwgaW5vZGUsIGRlLCBkZS0+aW5vZGUuZGVudHJ5KTsKKwlpZiAoZGUtPmlub2RlLmRlbnRyeSAmJiAoZGUtPmlub2RlLmRlbnRyeSAhPSBkZW50cnkpKQorCQlPT1BTKCIoJXMpOiBkZTogJXAgZGVudHJ5OiAlcCBkZS0+ZGVudHJ5OiAlcFxuIiwKKwkJICAgICBkZS0+bmFtZSwgZGUsIGRlbnRyeSwgZGUtPmlub2RlLmRlbnRyeSk7CisJZGUtPmlub2RlLmRlbnRyeSA9IE5VTEw7CisJaXB1dChpbm9kZSk7CisJZGV2ZnNfcHV0KGRlKTsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc19kX2lwdXQgICovCisKK3N0YXRpYyBpbnQgZGV2ZnNfZF9kZWxldGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKKworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBkZXZmc19kb3BzID0geworCS5kX2RlbGV0ZSA9IGRldmZzX2RfZGVsZXRlLAorCS5kX3JlbGVhc2UgPSBkZXZmc19kX3JlbGVhc2UsCisJLmRfaXB1dCA9IGRldmZzX2RfaXB1dCwKK307CisKK3N0YXRpYyBpbnQgZGV2ZnNfZF9yZXZhbGlkYXRlX3dhaXQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICopOworCitzdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGRldmZzX3dhaXRfZG9wcyA9IHsKKwkuZF9kZWxldGUgPSBkZXZmc19kX2RlbGV0ZSwKKwkuZF9yZWxlYXNlID0gZGV2ZnNfZF9yZWxlYXNlLAorCS5kX2lwdXQgPSBkZXZmc19kX2lwdXQsCisJLmRfcmV2YWxpZGF0ZSA9IGRldmZzX2RfcmV2YWxpZGF0ZV93YWl0LAorfTsKKworLyoqCisgKglkZXZmc19kX2RlbGV0ZSAtIENhbGxiYWNrIGZvciB3aGVuIGFsbCBmaWxlcyBmb3IgYSBkZW50cnkgYXJlIGNsb3NlZC4KKyAqCUBkZW50cnk6IFRoZSBkZW50cnkuCisgKi8KKworc3RhdGljIGludCBkZXZmc19kX2RlbGV0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWlmIChkZW50cnktPmRfb3AgPT0gJmRldmZzX3dhaXRfZG9wcykKKwkJZGVudHJ5LT5kX29wID0gJmRldmZzX2RvcHM7CisJLyogIFVuaGFzaCBkZW50cnkgaWYgbmVnYXRpdmUgKGhhcyBubyBpbm9kZSkgICovCisJaWYgKGlub2RlID09IE5VTEwpIHsKKwkJRFBSSU5USyhERUJVR19EX0RFTEVURSwgIiglcCk6IGRyb3BwaW5nIG5lZ2F0aXZlIGRlbnRyeVxuIiwKKwkJCWRlbnRyeSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc19kX2RlbGV0ZSAgKi8KKworc3RydWN0IGRldmZzX2xvb2t1cF9zdHJ1Y3QgeworCWRldmZzX2hhbmRsZV90IGRlOworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7Cit9OworCisvKiBYWFg6IHRoaXMgZG9lc24ndCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2UgZ290IGEgbmVnYXRpdmUgZGVudHJ5CisgICAgICAgIGJ1dCBhIGRldmZzIGVudHJ5IGhhcyBiZWVuIHJlZ2lzdGVyZWQgaW4gdGhlIG1lYW53aGlsZSAqLworc3RhdGljIGludCBkZXZmc19kX3JldmFsaWRhdGVfd2FpdChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnNfaW5mbyAqZnNfaW5mbyA9IGRpci0+aV9zYi0+c19mc19pbmZvOworCWRldmZzX2hhbmRsZV90IHBhcmVudCA9IGdldF9kZXZmc19lbnRyeV9mcm9tX3Zmc19pbm9kZShkaXIpOworCXN0cnVjdCBkZXZmc19sb29rdXBfc3RydWN0ICpsb29rdXBfaW5mbyA9IGRlbnRyeS0+ZF9mc2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJaW50IG5lZWRfbG9jazsKKworCS8qCisJICogRklYTUUgSEFDSworCSAqCisJICogbWFrZSBzdXJlIHRoYXQKKwkgKiAgIGRfaW5zdGFudGlhdGUgYWx3YXlzIHJ1bnMgdW5kZXIgbG9jaworCSAqICAgd2UgcmVsZWFzZSBpX3NlbSBsb2NrIGJlZm9yZSBnb2luZyB0byBzbGVlcAorCSAqCisJICogdW5mb3J0dW5hdGVseSBzb21ldGltZXMgZF9yZXZhbGlkYXRlIGlzIGNhbGxlZCB3aXRoCisJICogYW5kIHNvbWV0aW1lcyB3aXRob3V0IGlfc2VtIGxvY2sgaGVsZC4gVGhlIGZvbGxvd2luZyBjaGVja3MKKwkgKiBhdHRlbXB0IHRvIGRlZHVjZSB3aGVuIHdlIG5lZWQgdG8gYWRkIChhbmQgZHJvcCByZXNwLikgbG9jaworCSAqIGhlcmUuIFRoaXMgcmVsaWVzIG9uIGN1cnJlbnQgKDIuNi4yKSBjYWxsaW5nIGNvdmVudGlvbnM6CisJICoKKwkgKiAgIGxvb2t1cF9oYXNoIGlzIGFsd2F5cyBydW4gdW5kZXIgaV9zZW0gYW5kIGlzIHBhc3NpbmcgTlVMTAorCSAqICAgYXMgbmQKKwkgKgorCSAqICAgb3BlbiguLi4sT19DUkVBVEUsLi4uKSBjYWxscyBfbG9va3VwX2hhc2ggdW5kZXIgaV9zZW0KKwkgKiAgIGFuZCBzZXRzIGZsYWdzIHRvIExPT0tVUF9PUEVOfExPT0tVUF9DUkVBVEUKKwkgKgorCSAqICAgYWxsIG90aGVyIGludm9jYXRpb25zIG9mIC0+ZF9yZXZhbGlkYXRlIHNlZW0gdG8gaGFwcGVuCisJICogICBvdXRzaWRlIG9mIGlfc2VtCisJICovCisJbmVlZF9sb2NrID0gbmQgJiYKKwkgICAgKCEobmQtPmZsYWdzICYgTE9PS1VQX0NSRUFURSkgfHwgKG5kLT5mbGFncyAmIExPT0tVUF9QQVJFTlQpKTsKKworCWlmIChuZWVkX2xvY2spCisJCWRvd24oJmRpci0+aV9zZW0pOworCisJaWYgKGlzX2RldmZzZF9vcl9jaGlsZChmc19pbmZvKSkgeworCQlkZXZmc19oYW5kbGVfdCBkZSA9IGxvb2t1cF9pbmZvLT5kZTsKKwkJc3RydWN0IGlub2RlICppbm9kZTsKKworCQlEUFJJTlRLKERFQlVHX0lfTE9PS1VQLAorCQkJIiglcyk6IGRlbnRyeTogJXAgaW5vZGU6ICVwIGRlOiAlcCBieTogXCIlc1wiXG4iLAorCQkJZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LCBkZW50cnktPmRfaW5vZGUsIGRlLAorCQkJY3VycmVudC0+Y29tbSk7CisJCWlmIChkZW50cnktPmRfaW5vZGUpCisJCQlnb3RvIG91dDsKKwkJaWYgKGRlID09IE5VTEwpIHsKKwkJCXJlYWRfbG9jaygmcGFyZW50LT51LmRpci5sb2NrKTsKKwkJCWRlID0gX2RldmZzX3NlYXJjaF9kaXIocGFyZW50LCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCQkgICAgICAgZGVudHJ5LT5kX25hbWUubGVuKTsKKwkJCXJlYWRfdW5sb2NrKCZwYXJlbnQtPnUuZGlyLmxvY2spOworCQkJaWYgKGRlID09IE5VTEwpCisJCQkJZ290byBvdXQ7CisJCQlsb29rdXBfaW5mby0+ZGUgPSBkZTsKKwkJfQorCQkvKiAgQ3JlYXRlIGFuIGlub2RlLCBub3cgdGhhdCB0aGUgZHJpdmVyIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSAgKi8KKwkJaW5vZGUgPSBfZGV2ZnNfZ2V0X3Zmc19pbm9kZShkaXItPmlfc2IsIGRlLCBkZW50cnkpOworCQlpZiAoIWlub2RlKQorCQkJZ290byBvdXQ7CisJCURQUklOVEsoREVCVUdfSV9MT09LVVAsCisJCQkiKCVzKTogbmV3IFZGUyBpbm9kZSgldSk6ICVwIGRlOiAlcCBieTogXCIlc1wiXG4iLAorCQkJZGUtPm5hbWUsIGRlLT5pbm9kZS5pbm8sIGlub2RlLCBkZSwgY3VycmVudC0+Y29tbSk7CisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAobG9va3VwX2luZm8gPT0gTlVMTCkKKwkJZ290byBvdXQ7CS8qICBFYXJseSB0ZXJtaW5hdGlvbiAgKi8KKwlyZWFkX2xvY2soJnBhcmVudC0+dS5kaXIubG9jayk7CisJaWYgKGRlbnRyeS0+ZF9mc2RhdGEpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlhZGRfd2FpdF9xdWV1ZSgmbG9va3VwX2luZm8tPndhaXRfcXVldWUsICZ3YWl0KTsKKwkJcmVhZF91bmxvY2soJnBhcmVudC0+dS5kaXIubG9jayk7CisJCS8qIGF0IHRoaXMgcG9pbnQgaXQgaXMgYWx3YXlzIChob3BlZnVsbHkpIGxvY2tlZCAqLworCQl1cCgmZGlyLT5pX3NlbSk7CisJCXNjaGVkdWxlKCk7CisJCWRvd24oJmRpci0+aV9zZW0pOworCQkvKgorCQkgKiBUaGlzIGRvZXMgbm90IG5lZWQgbm9yIHNob3VsZCByZW1vdmUgd2FpdCBmcm9tIHdhaXRfcXVldWUuCisJCSAqIFdhaXQgcXVldWUgaGVhZCBpcyBuZXZlciByZXVzZWQgLSBub3RoaW5nIGlzIGV2ZXIgYWRkZWQgdG8gaXQKKwkJICogYWZ0ZXIgYWxsIHdhaXRlcnMgaGF2ZSBiZWVuIHdha2VkIHVwIGFuZCBoZWFkIGl0c2VsZiBkaXNhcHBlYXJzCisJCSAqIHZlcnkgc29vbiBhZnRlciBpdC4gTW9yZW92ZXIgaXQgaXMgbG9jYWwgdmFyaWFibGUgb24gc3RhY2sgdGhhdAorCQkgKiBpcyBsaWtlbHkgdG8gaGF2ZSBhbHJlYWR5IGRpc2FwcGVhcmVkIHNvIGFueSByZWZlcmVuY2UgdG8gaXQKKwkJICogYXQgdGhpcyBwb2ludCBpcyBidWdneS4KKwkJICovCisKKwl9IGVsc2UKKwkJcmVhZF91bmxvY2soJnBhcmVudC0+dS5kaXIubG9jayk7CisKKyAgICAgIG91dDoKKwlpZiAobmVlZF9sb2NrKQorCQl1cCgmZGlyLT5pX3NlbSk7CisJcmV0dXJuIDE7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gZGV2ZnNfZF9yZXZhbGlkYXRlX3dhaXQgICovCisKKy8qICBJbm9kZSBvcGVyYXRpb25zIGZvciBkZXZpY2UgZW50cmllcyBmb2xsb3cgICovCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZXZmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgZGV2ZnNfZW50cnkgdG1wOwkvKiAgTXVzdCBzdGF5IGluIHNjb3BlIHVudGlsIGRldmZzZCBpZGxlIGFnYWluICAqLworCXN0cnVjdCBkZXZmc19sb29rdXBfc3RydWN0IGxvb2t1cF9pbmZvOworCXN0cnVjdCBmc19pbmZvICpmc19pbmZvID0gZGlyLT5pX3NiLT5zX2ZzX2luZm87CisJc3RydWN0IGRldmZzX2VudHJ5ICpwYXJlbnQsICpkZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBkZW50cnkgKnJldHZhbCA9IE5VTEw7CisKKwkvKiAgU2V0IHVwIHRoZSBkZW50cnkgb3BlcmF0aW9ucyBiZWZvcmUgYW55dGhpbmcgZWxzZSwgdG8gZW5zdXJlIGNsZWFuaW5nCisJICAgdXAgb24gYW55IGVycm9yICAqLworCWRlbnRyeS0+ZF9vcCA9ICZkZXZmc19kb3BzOworCS8qICBGaXJzdCB0cnkgdG8gZ2V0IHRoZSBkZXZmcyBlbnRyeSBmb3IgdGhpcyBkaXJlY3RvcnkgICovCisJcGFyZW50ID0gZ2V0X2RldmZzX2VudHJ5X2Zyb21fdmZzX2lub2RlKGRpcik7CisJRFBSSU5USyhERUJVR19JX0xPT0tVUCwgIiglcyk6IGRlbnRyeTogJXAgcGFyZW50OiAlcCBieTogXCIlc1wiXG4iLAorCQlkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnksIHBhcmVudCwgY3VycmVudC0+Y29tbSk7CisJaWYgKHBhcmVudCA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwlyZWFkX2xvY2soJnBhcmVudC0+dS5kaXIubG9jayk7CisJZGUgPSBfZGV2ZnNfc2VhcmNoX2RpcihwYXJlbnQsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbik7CisJcmVhZF91bmxvY2soJnBhcmVudC0+dS5kaXIubG9jayk7CisJbG9va3VwX2luZm8uZGUgPSBkZTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZsb29rdXBfaW5mby53YWl0X3F1ZXVlKTsKKwlkZW50cnktPmRfZnNkYXRhID0gJmxvb2t1cF9pbmZvOworCWlmIChkZSA9PSBOVUxMKSB7CS8qICBUcnkgd2l0aCBkZXZmc2QuIEZvciBhbnkga2luZCBvZiBmYWlsdXJlLCBsZWF2ZSBhIG5lZ2F0aXZlIGRlbnRyeQorCQkJCSAgIHNvIHNvbWVvbmUgZWxzZSBjYW4gZGVhbCB3aXRoIGl0IChpbiB0aGUgY2FzZSB3aGVyZSB0aGUgc3lzYWRtaW4KKwkJCQkgICBkb2VzIGEgbWtub2QoKSkuIEl0J3MgaW1wb3J0YW50IHRvIGRvIHRoaXMgYmVmb3JlIGhhc2hpbmcgdGhlCisJCQkJICAgZGVudHJ5LCBzbyB0aGF0IHRoZSBkZXZmc2QgcXVldWUgaXMgZmlsbGVkIGJlZm9yZSByZXZhbGlkYXRlcworCQkJCSAgIGNhbiBzdGFydCAgKi8KKwkJaWYgKHRyeV9tb2Rsb2FkKHBhcmVudCwgZnNfaW5mbywgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCAmdG1wKSA8IDApIHsJLyogIExvb2t1cCBldmVudCB3YXMgbm90IHF1ZXVlZCB0byBkZXZmc2QgICovCisJCQlkX2FkZChkZW50cnksIE5VTEwpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJZGVudHJ5LT5kX29wID0gJmRldmZzX3dhaXRfZG9wczsKKwlkX2FkZChkZW50cnksIE5VTEwpOwkvKiAgT3BlbiB0aGUgZmxvb2RnYXRlcyAgKi8KKwkvKiAgVW5sb2NrIGRpcmVjdG9yeSBzZW1hcGhvcmUsIHdoaWNoIHdpbGwgcmVsZWFzZSBhbnkgd2FpdGVycy4gVGhleQorCSAgIHdpbGwgZ2V0IHRoZSBoYXNoZWQgZGVudHJ5LCBhbmQgbWF5IGJlIGZvcmNlZCB0byB3YWl0IGZvcgorCSAgIHJldmFsaWRhdGlvbiAgKi8KKwl1cCgmZGlyLT5pX3NlbSk7CisJd2FpdF9mb3JfZGV2ZnNkX2ZpbmlzaGVkKGZzX2luZm8pOwkvKiAgSWYgSSdtIG5vdCBkZXZmc2QsIG11c3Qgd2FpdCAgKi8KKwlkb3duKCZkaXItPmlfc2VtKTsJLyogIEdyYWIgaXQgYWdhaW4gYmVjYXVzZSB0aGVtJ3MgdGhlIHJ1bGVzICAqLworCWRlID0gbG9va3VwX2luZm8uZGU7CisJLyogIElmIHNvbWVvbmUgZWxzZSBoYXMgYmVlbiBzbyBraW5kIGFzIHRvIG1ha2UgdGhlIGlub2RlLCB3ZSBnbyBob21lCisJICAgZWFybHkgICovCisJaWYgKGRlbnRyeS0+ZF9pbm9kZSkKKwkJZ290byBvdXQ7CisJaWYgKGRlID09IE5VTEwpIHsKKwkJcmVhZF9sb2NrKCZwYXJlbnQtPnUuZGlyLmxvY2spOworCQlkZSA9IF9kZXZmc19zZWFyY2hfZGlyKHBhcmVudCwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkgICAgICAgZGVudHJ5LT5kX25hbWUubGVuKTsKKwkJcmVhZF91bmxvY2soJnBhcmVudC0+dS5kaXIubG9jayk7CisJCWlmIChkZSA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCS8qICBPSywgdGhlcmUncyBhbiBlbnRyeSBub3csIGJ1dCBubyBWRlMgaW5vZGUgeWV0ICAqLworCX0KKwkvKiAgQ3JlYXRlIGFuIGlub2RlLCBub3cgdGhhdCB0aGUgZHJpdmVyIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSAgKi8KKwlpbm9kZSA9IF9kZXZmc19nZXRfdmZzX2lub2RlKGRpci0+aV9zYiwgZGUsIGRlbnRyeSk7CisJaWYgKCFpbm9kZSkgeworCQlyZXR2YWwgPSBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIG91dDsKKwl9CisJRFBSSU5USyhERUJVR19JX0xPT0tVUCwKKwkJIiglcyk6IG5ldyBWRlMgaW5vZGUoJXUpOiAlcCBkZTogJXAgYnk6IFwiJXNcIlxuIiwgZGUtPm5hbWUsCisJCWRlLT5pbm9kZS5pbm8sIGlub2RlLCBkZSwgY3VycmVudC0+Y29tbSk7CisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKyAgICAgIG91dDoKKwl3cml0ZV9sb2NrKCZwYXJlbnQtPnUuZGlyLmxvY2spOworCWRlbnRyeS0+ZF9vcCA9ICZkZXZmc19kb3BzOworCWRlbnRyeS0+ZF9mc2RhdGEgPSBOVUxMOworCXdha2VfdXAoJmxvb2t1cF9pbmZvLndhaXRfcXVldWUpOworCXdyaXRlX3VubG9jaygmcGFyZW50LT51LmRpci5sb2NrKTsKKwlkZXZmc19wdXQoZGUpOworCXJldHVybiByZXR2YWw7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gZGV2ZnNfbG9va3VwICAqLworCitzdGF0aWMgaW50IGRldmZzX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWludCB1bmhvb2tlZDsKKwlzdHJ1Y3QgZGV2ZnNfZW50cnkgKmRlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGZzX2luZm8gKmZzX2luZm8gPSBkaXItPmlfc2ItPnNfZnNfaW5mbzsKKworCWRlID0gZ2V0X2RldmZzX2VudHJ5X2Zyb21fdmZzX2lub2RlKGlub2RlKTsKKwlEUFJJTlRLKERFQlVHX0lfVU5MSU5LLCAiKCVzKTogZGU6ICVwXG4iLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZSk7CisJaWYgKGRlID09IE5VTEwpCisJCXJldHVybiAtRU5PRU5UOworCWlmICghZGUtPnZmcykKKwkJcmV0dXJuIC1FUEVSTTsKKwl3cml0ZV9sb2NrKCZkZS0+cGFyZW50LT51LmRpci5sb2NrKTsKKwl1bmhvb2tlZCA9IF9kZXZmc191bmhvb2soZGUpOworCXdyaXRlX3VubG9jaygmZGUtPnBhcmVudC0+dS5kaXIubG9jayk7CisJaWYgKCF1bmhvb2tlZCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKCFpc19kZXZmc2Rfb3JfY2hpbGQoZnNfaW5mbykpCisJCWRldmZzZF9ub3RpZnlfZGUoZGUsIERFVkZTRF9OT1RJRllfREVMRVRFLCBpbm9kZS0+aV9tb2RlLAorCQkJCSBpbm9kZS0+aV91aWQsIGlub2RlLT5pX2dpZCwgZnNfaW5mbyk7CisJZnJlZV9kZW50cnkoZGUpOworCWRldmZzX3B1dChkZSk7CisJcmV0dXJuIDA7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gZGV2ZnNfdW5saW5rICAqLworCitzdGF0aWMgaW50IGRldmZzX3N5bWxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCSBjb25zdCBjaGFyICpzeW1uYW1lKQoreworCWludCBlcnI7CisJc3RydWN0IGZzX2luZm8gKmZzX2luZm8gPSBkaXItPmlfc2ItPnNfZnNfaW5mbzsKKwlzdHJ1Y3QgZGV2ZnNfZW50cnkgKnBhcmVudCwgKmRlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwkvKiAgRmlyc3QgdHJ5IHRvIGdldCB0aGUgZGV2ZnMgZW50cnkgZm9yIHRoaXMgZGlyZWN0b3J5ICAqLworCXBhcmVudCA9IGdldF9kZXZmc19lbnRyeV9mcm9tX3Zmc19pbm9kZShkaXIpOworCWlmIChwYXJlbnQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJZXJyID0gZGV2ZnNfZG9fc3ltbGluayhwYXJlbnQsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIHN5bW5hbWUsICZkZSk7CisJRFBSSU5USyhERUJVR19ESVNBQkxFRCwgIiglcyk6IGVycmNvZGUgZnJvbSA8ZGV2ZnNfZG9fc3ltbGluaz46ICVkXG4iLAorCQlkZW50cnktPmRfbmFtZS5uYW1lLCBlcnIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWRlLT52ZnMgPSBUUlVFOworCWRlLT5pbm9kZS51aWQgPSBjdXJyZW50LT5ldWlkOworCWRlLT5pbm9kZS5naWQgPSBjdXJyZW50LT5lZ2lkOworCWRlLT5pbm9kZS5hdGltZSA9IENVUlJFTlRfVElNRTsKKwlkZS0+aW5vZGUubXRpbWUgPSBDVVJSRU5UX1RJTUU7CisJZGUtPmlub2RlLmN0aW1lID0gQ1VSUkVOVF9USU1FOworCWlmICgoaW5vZGUgPSBfZGV2ZnNfZ2V0X3Zmc19pbm9kZShkaXItPmlfc2IsIGRlLCBkZW50cnkpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlEUFJJTlRLKERFQlVHX0RJU0FCTEVELCAiKCVzKTogbmV3IFZGUyBpbm9kZSgldSk6ICVwICBkZW50cnk6ICVwXG4iLAorCQlkZW50cnktPmRfbmFtZS5uYW1lLCBkZS0+aW5vZGUuaW5vLCBpbm9kZSwgZGVudHJ5KTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCWlmICghaXNfZGV2ZnNkX29yX2NoaWxkKGZzX2luZm8pKQorCQlkZXZmc2Rfbm90aWZ5X2RlKGRlLCBERVZGU0RfTk9USUZZX0NSRUFURSwgaW5vZGUtPmlfbW9kZSwKKwkJCQkgaW5vZGUtPmlfdWlkLCBpbm9kZS0+aV9naWQsIGZzX2luZm8pOworCXJldHVybiAwOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIGRldmZzX3N5bWxpbmsgICovCisKK3N0YXRpYyBpbnQgZGV2ZnNfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZnNfaW5mbyAqZnNfaW5mbyA9IGRpci0+aV9zYi0+c19mc19pbmZvOworCXN0cnVjdCBkZXZmc19lbnRyeSAqcGFyZW50LCAqZGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCW1vZGUgPSAobW9kZSAmIH5TX0lGTVQpIHwgU19JRkRJUjsJLyogIFZGUyBkb2Vzbid0IHBhc3MgU19JRk1UIHBhcnQgICovCisJcGFyZW50ID0gZ2V0X2RldmZzX2VudHJ5X2Zyb21fdmZzX2lub2RlKGRpcik7CisJaWYgKHBhcmVudCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsKKwlkZSA9IF9kZXZmc19hbGxvY19lbnRyeShkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sIG1vZGUpOworCWlmICghZGUpCisJCXJldHVybiAtRU5PTUVNOworCWRlLT52ZnMgPSBUUlVFOworCWlmICgoZXJyID0gX2RldmZzX2FwcGVuZF9lbnRyeShwYXJlbnQsIGRlLCBOVUxMKSkgIT0gMCkKKwkJcmV0dXJuIGVycjsKKwlkZS0+aW5vZGUudWlkID0gY3VycmVudC0+ZXVpZDsKKwlkZS0+aW5vZGUuZ2lkID0gY3VycmVudC0+ZWdpZDsKKwlkZS0+aW5vZGUuYXRpbWUgPSBDVVJSRU5UX1RJTUU7CisJZGUtPmlub2RlLm10aW1lID0gQ1VSUkVOVF9USU1FOworCWRlLT5pbm9kZS5jdGltZSA9IENVUlJFTlRfVElNRTsKKwlpZiAoKGlub2RlID0gX2RldmZzX2dldF92ZnNfaW5vZGUoZGlyLT5pX3NiLCBkZSwgZGVudHJ5KSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJRFBSSU5USyhERUJVR19ESVNBQkxFRCwgIiglcyk6IG5ldyBWRlMgaW5vZGUoJXUpOiAlcCAgZGVudHJ5OiAlcFxuIiwKKwkJZGVudHJ5LT5kX25hbWUubmFtZSwgZGUtPmlub2RlLmlubywgaW5vZGUsIGRlbnRyeSk7CisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwlpZiAoIWlzX2RldmZzZF9vcl9jaGlsZChmc19pbmZvKSkKKwkJZGV2ZnNkX25vdGlmeV9kZShkZSwgREVWRlNEX05PVElGWV9DUkVBVEUsIGlub2RlLT5pX21vZGUsCisJCQkJIGlub2RlLT5pX3VpZCwgaW5vZGUtPmlfZ2lkLCBmc19pbmZvKTsKKwlyZXR1cm4gMDsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc19ta2RpciAgKi8KKworc3RhdGljIGludCBkZXZmc19ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBkZXZmc19lbnRyeSAqZGU7CisJc3RydWN0IGZzX2luZm8gKmZzX2luZm8gPSBkaXItPmlfc2ItPnNfZnNfaW5mbzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJaWYgKGRpci0+aV9zYi0+c19mc19pbmZvICE9IGlub2RlLT5pX3NiLT5zX2ZzX2luZm8pCisJCXJldHVybiAtRUlOVkFMOworCWRlID0gZ2V0X2RldmZzX2VudHJ5X2Zyb21fdmZzX2lub2RlKGlub2RlKTsKKwlpZiAoZGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKCFTX0lTRElSKGRlLT5tb2RlKSkKKwkJcmV0dXJuIC1FTk9URElSOworCWlmICghZGUtPnZmcykKKwkJcmV0dXJuIC1FUEVSTTsKKwkvKiAgRmlyc3QgZW5zdXJlIHRoZSBkaXJlY3RvcnkgaXMgZW1wdHkgYW5kIHdpbGwgc3RheSB0aGF0IHdheSAgKi8KKwl3cml0ZV9sb2NrKCZkZS0+dS5kaXIubG9jayk7CisJaWYgKGRlLT51LmRpci5maXJzdCkKKwkJZXJyID0gLUVOT1RFTVBUWTsKKwllbHNlCisJCWRlLT51LmRpci5ub19tb3JlX2FkZGl0aW9ucyA9IFRSVUU7CisJd3JpdGVfdW5sb2NrKCZkZS0+dS5kaXIubG9jayk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwkvKiAgTm93IHVuaG9vayB0aGUgZGlyZWN0b3J5IGZyb20gaXRzIHBhcmVudCAgKi8KKwl3cml0ZV9sb2NrKCZkZS0+cGFyZW50LT51LmRpci5sb2NrKTsKKwlpZiAoIV9kZXZmc191bmhvb2soZGUpKQorCQllcnIgPSAtRU5PRU5UOworCXdyaXRlX3VubG9jaygmZGUtPnBhcmVudC0+dS5kaXIubG9jayk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlpZiAoIWlzX2RldmZzZF9vcl9jaGlsZChmc19pbmZvKSkKKwkJZGV2ZnNkX25vdGlmeV9kZShkZSwgREVWRlNEX05PVElGWV9ERUxFVEUsIGlub2RlLT5pX21vZGUsCisJCQkJIGlub2RlLT5pX3VpZCwgaW5vZGUtPmlfZ2lkLCBmc19pbmZvKTsKKwlmcmVlX2RlbnRyeShkZSk7CisJZGV2ZnNfcHV0KGRlKTsKKwlyZXR1cm4gMDsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc19ybWRpciAgKi8KKworc3RhdGljIGludCBkZXZmc19ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJICAgICAgIGRldl90IHJkZXYpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZnNfaW5mbyAqZnNfaW5mbyA9IGRpci0+aV9zYi0+c19mc19pbmZvOworCXN0cnVjdCBkZXZmc19lbnRyeSAqcGFyZW50LCAqZGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCURQUklOVEsoREVCVUdfSV9NS05PRCwgIiglcyk6IG1vZGU6IDAlbyAgZGV2OiAldToldVxuIiwKKwkJZGVudHJ5LT5kX25hbWUubmFtZSwgbW9kZSwgTUFKT1IocmRldiksIE1JTk9SKHJkZXYpKTsKKwlwYXJlbnQgPSBnZXRfZGV2ZnNfZW50cnlfZnJvbV92ZnNfaW5vZGUoZGlyKTsKKwlpZiAocGFyZW50ID09IE5VTEwpCisJCXJldHVybiAtRU5PRU5UOworCWRlID0gX2RldmZzX2FsbG9jX2VudHJ5KGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgbW9kZSk7CisJaWYgKCFkZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZGUtPnZmcyA9IFRSVUU7CisJaWYgKFNfSVNDSFIobW9kZSkgfHwgU19JU0JMSyhtb2RlKSkKKwkJZGUtPnUuZGV2ID0gcmRldjsKKwlpZiAoKGVyciA9IF9kZXZmc19hcHBlbmRfZW50cnkocGFyZW50LCBkZSwgTlVMTCkpICE9IDApCisJCXJldHVybiBlcnI7CisJZGUtPmlub2RlLnVpZCA9IGN1cnJlbnQtPmV1aWQ7CisJZGUtPmlub2RlLmdpZCA9IGN1cnJlbnQtPmVnaWQ7CisJZGUtPmlub2RlLmF0aW1lID0gQ1VSUkVOVF9USU1FOworCWRlLT5pbm9kZS5tdGltZSA9IENVUlJFTlRfVElNRTsKKwlkZS0+aW5vZGUuY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJaWYgKChpbm9kZSA9IF9kZXZmc19nZXRfdmZzX2lub2RlKGRpci0+aV9zYiwgZGUsIGRlbnRyeSkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCURQUklOVEsoREVCVUdfSV9NS05PRCwgIjogICBuZXcgVkZTIGlub2RlKCV1KTogJXAgIGRlbnRyeTogJXBcbiIsCisJCWRlLT5pbm9kZS5pbm8sIGlub2RlLCBkZW50cnkpOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJaWYgKCFpc19kZXZmc2Rfb3JfY2hpbGQoZnNfaW5mbykpCisJCWRldmZzZF9ub3RpZnlfZGUoZGUsIERFVkZTRF9OT1RJRllfQ1JFQVRFLCBpbm9kZS0+aV9tb2RlLAorCQkJCSBpbm9kZS0+aV91aWQsIGlub2RlLT5pX2dpZCwgZnNfaW5mbyk7CisJcmV0dXJuIDA7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gZGV2ZnNfbWtub2QgICovCisKK3N0YXRpYyBpbnQgZGV2ZnNfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgZGV2ZnNfZW50cnkgKnAgPSBnZXRfZGV2ZnNfZW50cnlfZnJvbV92ZnNfaW5vZGUoZGVudHJ5LT5kX2lub2RlKTsKKwluZF9zZXRfbGluayhuZCwgcCA/IHAtPnUuc3ltbGluay5saW5rbmFtZSA6IEVSUl9QVFIoLUVOT0RFVikpOworCXJldHVybiAwOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIGRldmZzX2ZvbGxvd19saW5rICAqLworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZGV2ZnNfaW9wcyA9IHsKKwkuc2V0YXR0ciA9IGRldmZzX25vdGlmeV9jaGFuZ2UsCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZGV2ZnNfZGlyX2lvcHMgPSB7CisJLmxvb2t1cCA9IGRldmZzX2xvb2t1cCwKKwkudW5saW5rID0gZGV2ZnNfdW5saW5rLAorCS5zeW1saW5rID0gZGV2ZnNfc3ltbGluaywKKwkubWtkaXIgPSBkZXZmc19ta2RpciwKKwkucm1kaXIgPSBkZXZmc19ybWRpciwKKwkubWtub2QgPSBkZXZmc19ta25vZCwKKwkuc2V0YXR0ciA9IGRldmZzX25vdGlmeV9jaGFuZ2UsCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZGV2ZnNfc3ltbGlua19pb3BzID0geworCS5yZWFkbGluayA9IGdlbmVyaWNfcmVhZGxpbmssCisJLmZvbGxvd19saW5rID0gZGV2ZnNfZm9sbG93X2xpbmssCisJLnNldGF0dHIgPSBkZXZmc19ub3RpZnlfY2hhbmdlLAorfTsKKworc3RhdGljIGludCBkZXZmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IGlub2RlICpyb290X2lub2RlID0gTlVMTDsKKworCWlmIChfZGV2ZnNfZ2V0X3Jvb3RfZW50cnkoKSA9PSBOVUxMKQorCQlnb3RvIG91dF9ub19yb290OworCWF0b21pY19zZXQoJmZzX2luZm8uZGV2ZnNkX292ZXJydW5fY291bnQsIDApOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZzX2luZm8uZGV2ZnNkX3dhaXRfcXVldWUpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZzX2luZm8ucmV2YWxpZGF0ZV93YWl0X3F1ZXVlKTsKKwlmc19pbmZvLnNiID0gc2I7CisJc2ItPnNfZnNfaW5mbyA9ICZmc19pbmZvOworCXNiLT5zX2Jsb2Nrc2l6ZSA9IDEwMjQ7CisJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSAxMDsKKwlzYi0+c19tYWdpYyA9IERFVkZTX1NVUEVSX01BR0lDOworCXNiLT5zX29wID0gJmRldmZzX3NvcHM7CisJc2ItPnNfdGltZV9ncmFuID0gMTsKKwlpZiAoKHJvb3RfaW5vZGUgPSBfZGV2ZnNfZ2V0X3Zmc19pbm9kZShzYiwgcm9vdF9lbnRyeSwgTlVMTCkpID09IE5VTEwpCisJCWdvdG8gb3V0X25vX3Jvb3Q7CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKKwlpZiAoIXNiLT5zX3Jvb3QpCisJCWdvdG8gb3V0X25vX3Jvb3Q7CisJRFBSSU5USyhERUJVR19TX1JFQUQsICIoKTogbWFkZSBkZXZmcyBwdHI6ICVwXG4iLCBzYi0+c19mc19pbmZvKTsKKwlyZXR1cm4gMDsKKworICAgICAgb3V0X25vX3Jvb3Q6CisJUFJJTlRLKCIoKTogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKKwlpZiAocm9vdF9pbm9kZSkKKwkJaXB1dChyb290X2lub2RlKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc19maWxsX3N1cGVyICAqLworCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpkZXZmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkJCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJCXZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIGRldmZzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZGV2ZnNfZnNfdHlwZSA9IHsKKwkubmFtZSA9IERFVkZTX05BTUUsCisJLmdldF9zYiA9IGRldmZzX2dldF9zYiwKKwkua2lsbF9zYiA9IGtpbGxfYW5vbl9zdXBlciwKK307CisKKy8qICBGaWxlIG9wZXJhdGlvbnMgZm9yIGRldmZzZCBmb2xsb3cgICovCisKK3N0YXRpYyBzc2l6ZV90IGRldmZzZF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLAorCQkJICAgbG9mZl90ICogcHBvcykKK3sKKwlpbnQgZG9uZSA9IEZBTFNFOworCWludCBpdmFsOworCWxvZmZfdCBwb3MsIGRldm5hbWVfb2Zmc2V0LCB0bGVuLCBycG9zOworCWRldmZzX2hhbmRsZV90IGRlOworCXN0cnVjdCBkZXZmc2RfYnVmX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgZnNfaW5mbyAqZnNfaW5mbyA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX2ZzX2luZm87CisJc3RydWN0IGRldmZzZF9ub3RpZnlfc3RydWN0ICppbmZvID0gZnNfaW5mby0+ZGV2ZnNkX2luZm87CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwkvKiAgVmVyaWZ5IHRoZSB0YXNrIGhhcyBncmFiYmVkIHRoZSBxdWV1ZSAgKi8KKwlpZiAoZnNfaW5mby0+ZGV2ZnNkX3Rhc2sgIT0gY3VycmVudCkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpbmZvLT5tYWpvciA9IDA7CisJaW5mby0+bWlub3IgPSAwOworCS8qICBCbG9jayBmb3IgYSBuZXcgZW50cnkgICovCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZSgmZnNfaW5mby0+ZGV2ZnNkX3dhaXRfcXVldWUsICZ3YWl0KTsKKwl3aGlsZSAoZGV2ZnNkX3F1ZXVlX2VtcHR5KGZzX2luZm8pKSB7CisJCWZzX2luZm8tPmRldmZzZF9zbGVlcGluZyA9IFRSVUU7CisJCXdha2VfdXAoJmZzX2luZm8tPnJldmFsaWRhdGVfd2FpdF9xdWV1ZSk7CisJCXNjaGVkdWxlKCk7CisJCWZzX2luZm8tPmRldmZzZF9zbGVlcGluZyA9IEZBTFNFOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKCZmc19pbmZvLT5kZXZmc2Rfd2FpdF9xdWV1ZSwgJndhaXQpOworCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJcmV0dXJuIC1FSU5UUjsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZnNfaW5mby0+ZGV2ZnNkX3dhaXRfcXVldWUsICZ3YWl0KTsKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJLyogIE5vdyBwbGF5IHdpdGggdGhlIGRhdGEgICovCisJaXZhbCA9IGF0b21pY19yZWFkKCZmc19pbmZvLT5kZXZmc2Rfb3ZlcnJ1bl9jb3VudCk7CisJaW5mby0+b3ZlcnJ1bl9jb3VudCA9IGl2YWw7CisJZW50cnkgPSBmc19pbmZvLT5kZXZmc2RfZmlyc3RfZXZlbnQ7CisJaW5mby0+dHlwZSA9IGVudHJ5LT50eXBlOworCWluZm8tPm1vZGUgPSBlbnRyeS0+bW9kZTsKKwlpbmZvLT51aWQgPSBlbnRyeS0+dWlkOworCWluZm8tPmdpZCA9IGVudHJ5LT5naWQ7CisJZGUgPSBlbnRyeS0+ZGU7CisJaWYgKFNfSVNDSFIoZGUtPm1vZGUpIHx8IFNfSVNCTEsoZGUtPm1vZGUpKSB7CisJCWluZm8tPm1ham9yID0gTUFKT1IoZGUtPnUuZGV2KTsKKwkJaW5mby0+bWlub3IgPSBNSU5PUihkZS0+dS5kZXYpOworCX0KKwlwb3MgPSBkZXZmc19nZW5lcmF0ZV9wYXRoKGRlLCBpbmZvLT5kZXZuYW1lLCBERVZGU19QQVRITEVOKTsKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIHBvczsKKwlpbmZvLT5uYW1lbGVuID0gREVWRlNfUEFUSExFTiAtIHBvcyAtIDE7CisJaWYgKGluZm8tPm1vZGUgPT0gMCkKKwkJaW5mby0+bW9kZSA9IGRlLT5tb2RlOworCWRldm5hbWVfb2Zmc2V0ID0gaW5mby0+ZGV2bmFtZSAtIChjaGFyICopaW5mbzsKKwlycG9zID0gKnBwb3M7CisJaWYgKHJwb3MgPCBkZXZuYW1lX29mZnNldCkgeworCQkvKiAgQ29weSBwYXJ0cyBvZiB0aGUgaGVhZGVyICAqLworCQl0bGVuID0gZGV2bmFtZV9vZmZzZXQgLSBycG9zOworCQlpZiAodGxlbiA+IGxlbikKKwkJCXRsZW4gPSBsZW47CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAoY2hhciAqKWluZm8gKyBycG9zLCB0bGVuKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcnBvcyArPSB0bGVuOworCQlidWYgKz0gdGxlbjsKKwkJbGVuIC09IHRsZW47CisJfQorCWlmICgocnBvcyA+PSBkZXZuYW1lX29mZnNldCkgJiYgKGxlbiA+IDApKSB7CisJCS8qICBDb3B5IHRoZSBuYW1lICAqLworCQl0bGVuID0gaW5mby0+bmFtZWxlbiArIDE7CisJCWlmICh0bGVuID4gbGVuKQorCQkJdGxlbiA9IGxlbjsKKwkJZWxzZQorCQkJZG9uZSA9IFRSVUU7CisJCWlmIChjb3B5X3RvX3VzZXIKKwkJICAgIChidWYsIGluZm8tPmRldm5hbWUgKyBwb3MgKyBycG9zIC0gZGV2bmFtZV9vZmZzZXQsIHRsZW4pKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlycG9zICs9IHRsZW47CisJfQorCXRsZW4gPSBycG9zIC0gKnBwb3M7CisJaWYgKGRvbmUpIHsKKwkJZGV2ZnNfaGFuZGxlX3QgcGFyZW50OworCisJCXNwaW5fbG9jaygmZnNfaW5mby0+ZGV2ZnNkX2J1ZmZlcl9sb2NrKTsKKwkJZnNfaW5mby0+ZGV2ZnNkX2ZpcnN0X2V2ZW50ID0gZW50cnktPm5leHQ7CisJCWlmIChlbnRyeS0+bmV4dCA9PSBOVUxMKQorCQkJZnNfaW5mby0+ZGV2ZnNkX2xhc3RfZXZlbnQgPSBOVUxMOworCQlzcGluX3VubG9jaygmZnNfaW5mby0+ZGV2ZnNkX2J1ZmZlcl9sb2NrKTsKKwkJZm9yICg7IGRlICE9IE5VTEw7IGRlID0gcGFyZW50KSB7CisJCQlwYXJlbnQgPSBkZS0+cGFyZW50OworCQkJZGV2ZnNfcHV0KGRlKTsKKwkJfQorCQlrbWVtX2NhY2hlX2ZyZWUoZGV2ZnNkX2J1Zl9jYWNoZSwgZW50cnkpOworCQlpZiAoaXZhbCA+IDApCisJCQlhdG9taWNfc3ViKGl2YWwsICZmc19pbmZvLT5kZXZmc2Rfb3ZlcnJ1bl9jb3VudCk7CisJCSpwcG9zID0gMDsKKwl9IGVsc2UKKwkJKnBwb3MgPSBycG9zOworCXJldHVybiB0bGVuOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIGRldmZzZF9yZWFkICAqLworCitzdGF0aWMgaW50IGRldmZzZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBpdmFsOworCXN0cnVjdCBmc19pbmZvICpmc19pbmZvID0gaW5vZGUtPmlfc2ItPnNfZnNfaW5mbzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBERVZGU0RJT0NfR0VUX1BST1RPX1JFVjoKKwkJaXZhbCA9IERFVkZTRF9QUk9UT0NPTF9SRVZJU0lPTl9LRVJORUw7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaXZhbCwgc2l6ZW9mIGl2YWwpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgREVWRlNESU9DX1NFVF9FVkVOVF9NQVNLOgorCQkvKiAgRW5zdXJlIG9ubHkgb25lIHJlYWRlciBoYXMgYWNjZXNzIHRvIHRoZSBxdWV1ZS4gVGhpcyBzY2hlbWUgd2lsbAorCQkgICB3b3JrIGV2ZW4gaWYgdGhlIGdsb2JhbCBrZXJuZWwgbG9jayB3ZXJlIHRvIGJlIHJlbW92ZWQsIGJlY2F1c2UgaXQKKwkJICAgZG9lc24ndCBtYXR0ZXIgd2hvIGdldHMgaW4gZmlyc3QsIGFzIGxvbmcgYXMgb25seSBvbmUgZ2V0cyBpdCAgKi8KKwkJaWYgKGZzX2luZm8tPmRldmZzZF90YXNrID09IE5VTEwpIHsKKwkJCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CisKKwkJCWlmICghc3Bpbl90cnlsb2NrKCZsb2NrKSkKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJaWYgKGZzX2luZm8tPmRldmZzZF90YXNrICE9IE5VTEwpIHsJLyogIFdlIGxvc3QgdGhlIHJhY2UuLi4gICovCisJCQkJc3Bpbl91bmxvY2soJmxvY2spOworCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCQlmc19pbmZvLT5kZXZmc2RfdGFzayA9IGN1cnJlbnQ7CisJCQlzcGluX3VubG9jaygmbG9jayk7CisJCQlmc19pbmZvLT5kZXZmc2RfcGdycCA9CisJCQkgICAgKHByb2Nlc3NfZ3JvdXAoY3VycmVudCkgPT0KKwkJCSAgICAgY3VycmVudC0+cGlkKSA/IHByb2Nlc3NfZ3JvdXAoY3VycmVudCkgOiAwOworCQkJZnNfaW5mby0+ZGV2ZnNkX2ZpbGUgPSBmaWxlOworCQkJZnNfaW5mby0+ZGV2ZnNkX2luZm8gPQorCQkJICAgIGttYWxsb2Moc2l6ZW9mICpmc19pbmZvLT5kZXZmc2RfaW5mbywgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWZzX2luZm8tPmRldmZzZF9pbmZvKSB7CisJCQkJZGV2ZnNkX2Nsb3NlKGlub2RlLCBmaWxlKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJfSBlbHNlIGlmIChmc19pbmZvLT5kZXZmc2RfdGFzayAhPSBjdXJyZW50KQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJZnNfaW5mby0+ZGV2ZnNkX2V2ZW50X21hc2sgPSBhcmc7CS8qICBMZXQgdGhlIG1hc3NlcyBjb21lIGZvcnRoICAqLworCQlicmVhazsKKwljYXNlIERFVkZTRElPQ19SRUxFQVNFX0VWRU5UX1FVRVVFOgorCQlpZiAoZnNfaW5mby0+ZGV2ZnNkX2ZpbGUgIT0gZmlsZSkKKwkJCXJldHVybiAtRVBFUk07CisJCXJldHVybiBkZXZmc2RfY2xvc2UoaW5vZGUsIGZpbGUpOworCQkvKmJyZWFrOyAqLworI2lmZGVmIENPTkZJR19ERVZGU19ERUJVRworCWNhc2UgREVWRlNESU9DX1NFVF9ERUJVR19NQVNLOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJml2YWwsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mIGl2YWwpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWRldmZzX2RlYnVnID0gaXZhbDsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc2RfaW9jdGwgICovCisKK3N0YXRpYyBpbnQgZGV2ZnNkX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBkZXZmc2RfYnVmX2VudHJ5ICplbnRyeSwgKm5leHQ7CisJc3RydWN0IGZzX2luZm8gKmZzX2luZm8gPSBpbm9kZS0+aV9zYi0+c19mc19pbmZvOworCisJaWYgKGZzX2luZm8tPmRldmZzZF9maWxlICE9IGZpbGUpCisJCXJldHVybiAwOworCWZzX2luZm8tPmRldmZzZF9ldmVudF9tYXNrID0gMDsKKwlmc19pbmZvLT5kZXZmc2RfZmlsZSA9IE5VTEw7CisJc3Bpbl9sb2NrKCZmc19pbmZvLT5kZXZmc2RfYnVmZmVyX2xvY2spOworCWVudHJ5ID0gZnNfaW5mby0+ZGV2ZnNkX2ZpcnN0X2V2ZW50OworCWZzX2luZm8tPmRldmZzZF9maXJzdF9ldmVudCA9IE5VTEw7CisJZnNfaW5mby0+ZGV2ZnNkX2xhc3RfZXZlbnQgPSBOVUxMOworCWlmIChmc19pbmZvLT5kZXZmc2RfaW5mbykgeworCQlrZnJlZShmc19pbmZvLT5kZXZmc2RfaW5mbyk7CisJCWZzX2luZm8tPmRldmZzZF9pbmZvID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2soJmZzX2luZm8tPmRldmZzZF9idWZmZXJfbG9jayk7CisJZnNfaW5mby0+ZGV2ZnNkX3BncnAgPSAwOworCWZzX2luZm8tPmRldmZzZF90YXNrID0gTlVMTDsKKwl3YWtlX3VwKCZmc19pbmZvLT5yZXZhbGlkYXRlX3dhaXRfcXVldWUpOworCWZvciAoOyBlbnRyeTsgZW50cnkgPSBuZXh0KSB7CisJCW5leHQgPSBlbnRyeS0+bmV4dDsKKwkJa21lbV9jYWNoZV9mcmVlKGRldmZzZF9idWZfY2FjaGUsIGVudHJ5KTsKKwl9CisJcmV0dXJuIDA7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gZGV2ZnNkX2Nsb3NlICAqLworCisjaWZkZWYgQ09ORklHX0RFVkZTX0RFQlVHCitzdGF0aWMgc3NpemVfdCBzdGF0X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sCisJCQkgbG9mZl90ICogcHBvcykKK3sKKwlzc2l6ZV90IG51bTsKKwljaGFyIHR4dFs4MF07CisKKwludW0gPSBzcHJpbnRmKHR4dCwgIk51bWJlciBvZiBlbnRyaWVzOiAldSAgbnVtYmVyIG9mIGJ5dGVzOiAldVxuIiwKKwkJICAgICAgc3RhdF9udW1fZW50cmllcywgc3RhdF9udW1fYnl0ZXMpICsgMTsKKwlpZiAoKnBwb3MgPj0gbnVtKQorCQlyZXR1cm4gMDsKKwlpZiAoKnBwb3MgKyBsZW4gPiBudW0pCisJCWxlbiA9IG51bSAtICpwcG9zOworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCB0eHQgKyAqcHBvcywgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJKnBwb3MgKz0gbGVuOworCXJldHVybiBsZW47Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gc3RhdF9yZWFkICAqLworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZGV2ZnNfZnModm9pZCkKK3sKKwlpbnQgZXJyOworCWludCBtYWpvcjsKKwlzdHJ1Y3QgZGV2ZnNfZW50cnkgKmRldmZzZDsKKyNpZmRlZiBDT05GSUdfREVWRlNfREVCVUcKKwlzdHJ1Y3QgZGV2ZnNfZW50cnkgKnN0YXQ7CisjZW5kaWYKKworCWlmIChfZGV2ZnNfZ2V0X3Jvb3RfZW50cnkoKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBSaWNoYXJkIEdvb2NoIChyZ29vY2hAYXRuZi5jc2lyby5hdSlcbiIsCisJICAgICAgIERFVkZTX05BTUUsIERFVkZTX1ZFUlNJT04pOworCWRldmZzZF9idWZfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZGV2ZnNkX2V2ZW50IiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IGRldmZzZF9idWZfZW50cnkpLAorCQkJCQkgICAgIDAsIDAsIE5VTEwsIE5VTEwpOworCWlmICghZGV2ZnNkX2J1Zl9jYWNoZSkKKwkJT09QUygiKCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBldmVudCBzbGFiXG4iKTsKKyNpZmRlZiBDT05GSUdfREVWRlNfREVCVUcKKwlkZXZmc19kZWJ1ZyA9IGRldmZzX2RlYnVnX2luaXQ7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGRldmZzX2RlYnVnOiAweCUweFxuIiwgREVWRlNfTkFNRSwgZGV2ZnNfZGVidWcpOworI2VuZGlmCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGJvb3Rfb3B0aW9uczogMHglMHhcbiIsIERFVkZTX05BTUUsIGJvb3Rfb3B0aW9ucyk7CisKKwkvKiByZWdpc3RlciBzcGVjaWFsIGRldmljZSBmb3IgZGV2ZnNkIGNvbW11bmljYXRpb24gKi8KKwltYWpvciA9IHJlZ2lzdGVyX2NocmRldigwLCAiZGV2ZnMiLCAmZGV2ZnNfZm9wcyk7CisJaWYgKG1ham9yIDwgMCkKKwkJcmV0dXJuIG1ham9yOworCisJLyogIEFuZCBjcmVhdGUgdGhlIGVudHJ5IGZvciAiLmRldmZzZCIgICovCisJZGV2ZnNkID0gX2RldmZzX2FsbG9jX2VudHJ5KCIuZGV2ZnNkIiwgMCwgU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSKTsKKwlpZiAoZGV2ZnNkID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWRldmZzZC0+dS5kZXYgPSBNS0RFVihtYWpvciwgMCk7CisJX2RldmZzX2FwcGVuZF9lbnRyeShyb290X2VudHJ5LCBkZXZmc2QsIE5VTEwpOworCisjaWZkZWYgQ09ORklHX0RFVkZTX0RFQlVHCisJc3RhdCA9IF9kZXZmc19hbGxvY19lbnRyeSgiLnN0YXQiLCAwLCBTX0lGQ0hSIHwgU19JUlVHTyk7CisJaWYgKHN0YXQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJc3RhdC0+dS5kZXYgPSBNS0RFVihtYWpvciwgMSk7CisJX2RldmZzX2FwcGVuZF9lbnRyeShyb290X2VudHJ5LCBzdGF0LCBOVUxMKTsKKyNlbmRpZgorCisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmZGV2ZnNfZnNfdHlwZSk7CisJcmV0dXJuIGVycjsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBpbml0X2RldmZzX2ZzICAqLworCit2b2lkIF9faW5pdCBtb3VudF9kZXZmc19mcyh2b2lkKQoreworCWludCBlcnI7CisKKwlpZiAoIShib290X29wdGlvbnMgJiBPUFRJT05fTU9VTlQpKQorCQlyZXR1cm47CisJZXJyID0gZG9fbW91bnQoIm5vbmUiLCAiL2RldiIsICJkZXZmcyIsIDAsIE5VTEwpOworCWlmIChlcnIgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiTW91bnRlZCBkZXZmcyBvbiAvZGV2XG4iKTsKKwllbHNlCisJCVBSSU5USygiKCk6IHVuYWJsZSB0byBtb3VudCBkZXZmcywgZXJyOiAlZFxuIiwgZXJyKTsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBtb3VudF9kZXZmc19mcyAgKi8KKworbW9kdWxlX2luaXQoaW5pdF9kZXZmc19mcykKZGlmZiAtLWdpdCBhL2ZzL2RldmZzL3V0aWwuYyBiL2ZzL2RldmZzL3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjA2ZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZGV2ZnMvdXRpbC5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qICBkZXZmcyAoRGV2aWNlIEZpbGVTeXN0ZW0pIHV0aWxpdGllcy4KKworICAgIENvcHlyaWdodCAoQykgMTk5OS0yMDAyICBSaWNoYXJkIEdvb2NoCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICAgIFJpY2hhcmQgR29vY2ggbWF5IGJlIHJlYWNoZWQgYnkgZW1haWwgYXQgIHJnb29jaEBhdG5mLmNzaXJvLmF1CisgICAgVGhlIHBvc3RhbCBhZGRyZXNzIGlzOgorICAgICAgUmljaGFyZCBHb29jaCwgYy9vIEFUTkYsIFAuIE8uIEJveCA3NiwgRXBwaW5nLCBOLlMuVy4sIDIxMjEsIEF1c3RyYWxpYS4KKworICAgIENoYW5nZUxvZworCisgICAgMTk5OTEwMzEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIENyZWF0ZWQuCisgICAgMTk5OTExMDMgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIENyZWF0ZWQgPF9kZXZmc19jb252ZXJ0X25hbWU+IGFuZCBzdXBwb3J0ZWQgU0NTSSBhbmQgSURFIENELVJPTXMKKyAgICAyMDAwMDIwMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgQ2hhbmdlZCBvcGVyYXRpb25zIHBvaW50ZXIgdHlwZSB0byB2b2lkICouCisgICAgMjAwMDA2MjEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIENoYW5nZWQgaW50ZXJmYWNlIHRvIDxkZXZmc19yZWdpc3Rlcl9zZXJpZXM+LgorICAgIDIwMDAwNjIyICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBUb29rIGFjY291bnQgb2YgaW50ZXJmYWNlIGNoYW5nZSB0byA8ZGV2ZnNfbWtfc3ltbGluaz4uCisgICAgICAgICAgICAgICBUb29rIGFjY291bnQgb2YgaW50ZXJmYWNlIGNoYW5nZSB0byA8ZGV2ZnNfbWtfZGlyPi4KKyAgICAyMDAxMDUxOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiBjbGVhbnVwLgorICAgIDIwMDEwNzA5ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBDcmVhdGVkIDxkZXZmc18qYWxsb2NfbWFqb3I+IGFuZCA8ZGV2ZnNfKmFsbG9jX2Rldm51bT4uCisgICAgMjAwMTA3MTAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIENyZWF0ZWQgPGRldmZzXyphbGxvY191bmlxdWVfbnVtYmVyPi4KKyAgICAyMDAxMDczMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiB0eXBvIGZpeC4KKyAgICAyMDAxMDgwNiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgTWFkZSA8YmxvY2tfc2VtYXBob3JlPiBhbmQgPGNoYXJfc2VtYXBob3JlPiBwcml2YXRlLgorICAgIDIwMDEwODEzICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBGaXhlZCBidWcgaW4gPGRldmZzX2FsbG9jX3VuaXF1ZV9udW1iZXI+OiBsaW1pdGVkIHRvIDEyOCBudW1iZXJzCisgICAgMjAwMTA4MTggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIFVwZGF0ZWQgbWFqb3IgbWFza3MgdXAgdG8gTGludXMnICJubyBuZXcgbWFqb3JzIiBwcm9jbGFtYXRpb24uCisJICAgICAgIEJsb2NrOiB3ZXJlIDEyNiBub3cgMTIyIGZyZWUsIGNoYXI6IHdlcmUgMjYgbm93IDE5IGZyZWUuCisgICAgMjAwMjAzMjQgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIEZpeGVkIGJ1ZyBpbiA8ZGV2ZnNfYWxsb2NfdW5pcXVlX251bWJlcj46IHdhcyBjbGVhcmluZyBiZXlvbmQKKwkgICAgICAgYml0ZmllbGQuCisgICAgMjAwMjAzMjYgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIEZpeGVkIGJpdGZpZWxkIGRhdGEgdHlwZSBmb3IgPGRldmZzXyphbGxvY19kZXZudW0+LgorICAgICAgICAgICAgICAgTWFkZSBtYWpvciBiaXRmaWVsZCB0eXBlIGFuZCBpbml0aWFsaXNlciA2NCBiaXQgc2FmZS4KKyAgICAyMDAyMDQxMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgRml4ZWQgc2hpZnQgd2FybmluZyBvbiA2NCBiaXQgbWFjaGluZXMuCisgICAgMjAwMjA0MjggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIENvcGllZCBhbmQgdXNlZCBtYWNybyBmb3IgZXJyb3IgbWVzc2FnZXMgZnJvbSBmcy9kZXZmcy9iYXNlLmMgCisgICAgMjAwMjEwMTMgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIERvY3VtZW50YXRpb24gZml4LgorICAgIDIwMDMwMTAxICAgQWRhbSBKLiBSaWNodGVyIDxhZGFtQHlnZ2RyYXNpbC5jb20+CisgICAgICAgICAgICAgICBFbGltaW5hdGUgREVWRlNfU1BFQ0lBTF97Q0hSLEJMS30uICBVc2UgbW9kZV90IGluc3RlYWQuCisgICAgMjAwMzAxMDYgICBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGluZnJhZGVhZC5vcmc+CisgICAgICAgICAgICAgICBSZXdyaXRlIGRldmZzX3ssZGV9YWxsb2NfZGV2bnVtIHRvIGxvb2sgbGlrZSBDIGNvZGUuCisqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKK2ludCBkZXZmc19yZWdpc3Rlcl90YXBlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhciB0bmFtZVszMl0sIGRlc3RbNjRdOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgdGFwZV9jb3VudGVyOworCXVuc2lnbmVkIGludCBuID0gdGFwZV9jb3VudGVyKys7CisKKwlzcHJpbnRmKGRlc3QsICIuLi8lcyIsIG5hbWUpOworCXNwcmludGYodG5hbWUsICJ0YXBlcy90YXBlJXUiLCBuKTsKKwlkZXZmc19ta19zeW1saW5rKHRuYW1lLCBkZXN0KTsKKworCXJldHVybiBuOworfQorCitFWFBPUlRfU1lNQk9MKGRldmZzX3JlZ2lzdGVyX3RhcGUpOworCit2b2lkIGRldmZzX3VucmVnaXN0ZXJfdGFwZShpbnQgbnVtKQoreworCWlmIChudW0gPj0gMCkKKwkJZGV2ZnNfcmVtb3ZlKCJ0YXBlcy90YXBlJXUiLCBudW0pOworfQorCitFWFBPUlRfU1lNQk9MKGRldmZzX3VucmVnaXN0ZXJfdGFwZSk7CmRpZmYgLS1naXQgYS9mcy9kZXZwdHMvTWFrZWZpbGUgYi9mcy9kZXZwdHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgwMGRmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2RldnB0cy9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCAvZGV2L3B0cyB2aXJ0dWFsIGZpbGVzeXN0ZW0uCisjCisKK29iai0kKENPTkZJR19VTklYOThfUFRZUykJCSs9IGRldnB0cy5vCisKK2RldnB0cy0kKENPTkZJR19VTklYOThfUFRZUykJCTo9IGlub2RlLm8KK2RldnB0cy0kKENPTkZJR19ERVZQVFNfRlNfU0VDVVJJVFkpCSs9IHhhdHRyX3NlY3VyaXR5Lm8KZGlmZiAtLWdpdCBhL2ZzL2RldnB0cy9pbm9kZS5jIGIvZnMvZGV2cHRzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3MWM4ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2RldnB0cy9pbm9kZS5jCkBAIC0wLDAgKzEsMjQyIEBACisvKiAtKi0gbGludXgtYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiBsaW51eC9mcy9kZXZwdHMvaW5vZGUuYworICoKKyAqICBDb3B5cmlnaHQgMTk5OC0yMDA0IEguIFBldGVyIEFudmluIC0tIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZwdHNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgorCisjZGVmaW5lIERFVlBUU19TVVBFUl9NQUdJQyAweDFjZDEKKworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGRldnB0c194YXR0cl9zZWN1cml0eV9oYW5kbGVyOworCitzdGF0aWMgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmRldnB0c194YXR0cl9oYW5kbGVyc1tdID0geworI2lmZGVmIENPTkZJR19ERVZQVFNfRlNfU0VDVVJJVFkKKwkmZGV2cHRzX3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIsCisjZW5kaWYKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZGV2cHRzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKyNpZmRlZiBDT05GSUdfREVWUFRTX0ZTX1hBVFRSCisJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAorCS5saXN0eGF0dHIJPSBnZW5lcmljX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHZmc21vdW50ICpkZXZwdHNfbW50Oworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRldnB0c19yb290OworCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgc2V0dWlkOworCWludCBzZXRnaWQ7CisJdWlkX3QgICB1aWQ7CisJZ2lkX3QgICBnaWQ7CisJdW1vZGVfdCBtb2RlOworfSBjb25maWcgPSB7Lm1vZGUgPSAwNjAwfTsKKworc3RhdGljIGludCBkZXZwdHNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCWludCBzZXR1aWQgPSAwOworCWludCBzZXRnaWQgPSAwOworCXVpZF90IHVpZCA9IDA7CisJZ2lkX3QgZ2lkID0gMDsKKwl1bW9kZV90IG1vZGUgPSAwNjAwOworCWNoYXIgKnRoaXNfY2hhcjsKKworCXRoaXNfY2hhciA9IE5VTEw7CisJd2hpbGUgKCh0aGlzX2NoYXIgPSBzdHJzZXAoJmRhdGEsICIsIikpICE9IE5VTEwpIHsKKwkJaW50IG47CisJCWNoYXIgZHVtbXk7CisJCWlmICghKnRoaXNfY2hhcikKKwkJCWNvbnRpbnVlOworCQlpZiAoc3NjYW5mKHRoaXNfY2hhciwgInVpZD0laSVjIiwgJm4sICZkdW1teSkgPT0gMSkgeworCQkJc2V0dWlkID0gMTsKKwkJCXVpZCA9IG47CisJCX0gZWxzZSBpZiAoc3NjYW5mKHRoaXNfY2hhciwgImdpZD0laSVjIiwgJm4sICZkdW1teSkgPT0gMSkgeworCQkJc2V0Z2lkID0gMTsKKwkJCWdpZCA9IG47CisJCX0gZWxzZSBpZiAoc3NjYW5mKHRoaXNfY2hhciwgIm1vZGU9JW8lYyIsICZuLCAmZHVtbXkpID09IDEpCisJCQltb2RlID0gbiAmIH5TX0lGTVQ7CisJCWVsc2UgeworCQkJcHJpbnRrKCJkZXZwdHM6IGNhbGxlZCB3aXRoIGJvZ3VzIG9wdGlvbnNcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJY29uZmlnLnNldHVpZCAgPSBzZXR1aWQ7CisJY29uZmlnLnNldGdpZCAgPSBzZXRnaWQ7CisJY29uZmlnLnVpZCAgICAgPSB1aWQ7CisJY29uZmlnLmdpZCAgICAgPSBnaWQ7CisJY29uZmlnLm1vZGUgICAgPSBtb2RlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBkZXZwdHNfc29wcyA9IHsKKwkuc3RhdGZzCQk9IHNpbXBsZV9zdGF0ZnMsCisJLnJlbW91bnRfZnMJPSBkZXZwdHNfcmVtb3VudCwKK307CisKK3N0YXRpYyBpbnQKK2RldnB0c19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKworCXMtPnNfYmxvY2tzaXplID0gMTAyNDsKKwlzLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gMTA7CisJcy0+c19tYWdpYyA9IERFVlBUU19TVVBFUl9NQUdJQzsKKwlzLT5zX29wID0gJmRldnB0c19zb3BzOworCXMtPnNfeGF0dHIgPSBkZXZwdHNfeGF0dHJfaGFuZGxlcnM7CisJcy0+c190aW1lX2dyYW4gPSAxOworCisJaW5vZGUgPSBuZXdfaW5vZGUocyk7CisJaWYgKCFpbm9kZSkKKwkJZ290byBmYWlsOworCWlub2RlLT5pX2lubyA9IDE7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCWlub2RlLT5pX2Jsb2NrcyA9IDA7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IDEwMjQ7CisJaW5vZGUtPmlfdWlkID0gaW5vZGUtPmlfZ2lkID0gMDsKKwlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPIHwgU19JV1VTUjsKKwlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9ubGluayA9IDI7CisKKwlkZXZwdHNfcm9vdCA9IHMtPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChpbm9kZSk7CisJaWYgKHMtPnNfcm9vdCkKKwkJcmV0dXJuIDA7CisJCisJcHJpbnRrKCJkZXZwdHM6IGdldCByb290IGRlbnRyeSBmYWlsZWRcbiIpOworCWlwdXQoaW5vZGUpOworZmFpbDoKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqZGV2cHRzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBkZXZwdHNfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBkZXZwdHNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImRldnB0cyIsCisJLmdldF9zYgkJPSBkZXZwdHNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9hbm9uX3N1cGVyLAorfTsKKworLyoKKyAqIFRoZSBub3JtYWwgbmFtaW5nIGNvbnZlbnRpb24gaXMgc2ltcGx5IC9kZXYvcHRzLzxudW1iZXI+OyB0aGlzIGNvbmZvcm1zCisgKiB0byB0aGUgU3lzdGVtIFYgbmFtaW5nIGNvbnZlbnRpb24KKyAqLworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZ2V0X25vZGUoaW50IG51bSkKK3sKKwljaGFyIHNbMTJdOworCXN0cnVjdCBkZW50cnkgKnJvb3QgPSBkZXZwdHNfcm9vdDsKKwlkb3duKCZyb290LT5kX2lub2RlLT5pX3NlbSk7CisJcmV0dXJuIGxvb2t1cF9vbmVfbGVuKHMsIHJvb3QsIHNwcmludGYocywgIiVkIiwgbnVtKSk7Cit9CisKK2ludCBkZXZwdHNfcHR5X25ldyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWludCBudW1iZXIgPSB0dHktPmluZGV4OworCXN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIgPSB0dHktPmRyaXZlcjsKKwlkZXZfdCBkZXZpY2UgPSBNS0RFVihkcml2ZXItPm1ham9yLCBkcml2ZXItPm1pbm9yX3N0YXJ0K251bWJlcik7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBuZXdfaW5vZGUoZGV2cHRzX21udC0+bW50X3NiKTsKKworCS8qIFdlJ3JlIHN1cHBvc2VkIHRvIGJlIGdpdmVuIHRoZSBzbGF2ZSBlbmQgb2YgYSBwdHkgKi8KKwlCVUdfT04oZHJpdmVyLT50eXBlICE9IFRUWV9EUklWRVJfVFlQRV9QVFkpOworCUJVR19PTihkcml2ZXItPnN1YnR5cGUgIT0gUFRZX1RZUEVfU0xBVkUpOworCisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbm9kZS0+aV9pbm8gPSBudW1iZXIrMjsKKwlpbm9kZS0+aV9ibGtzaXplID0gMTAyNDsKKwlpbm9kZS0+aV91aWQgPSBjb25maWcuc2V0dWlkID8gY29uZmlnLnVpZCA6IGN1cnJlbnQtPmZzdWlkOworCWlub2RlLT5pX2dpZCA9IGNvbmZpZy5zZXRnaWQgPyBjb25maWcuZ2lkIDogY3VycmVudC0+ZnNnaWQ7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgU19JRkNIUnxjb25maWcubW9kZSwgZGV2aWNlKTsKKwlpbm9kZS0+aV9vcCA9ICZkZXZwdHNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT51LmdlbmVyaWNfaXAgPSB0dHk7CisKKwlkZW50cnkgPSBnZXRfbm9kZShudW1iZXIpOworCWlmICghSVNfRVJSKGRlbnRyeSkgJiYgIWRlbnRyeS0+ZF9pbm9kZSkKKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKworCXVwKCZkZXZwdHNfcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB0dHlfc3RydWN0ICpkZXZwdHNfZ2V0X3R0eShpbnQgbnVtYmVyKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGdldF9ub2RlKG51bWJlcik7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKworCXR0eSA9IE5VTEw7CisJaWYgKCFJU19FUlIoZGVudHJ5KSkgeworCQlpZiAoZGVudHJ5LT5kX2lub2RlKQorCQkJdHR5ID0gZGVudHJ5LT5kX2lub2RlLT51LmdlbmVyaWNfaXA7CisJCWRwdXQoZGVudHJ5KTsKKwl9CisKKwl1cCgmZGV2cHRzX3Jvb3QtPmRfaW5vZGUtPmlfc2VtKTsKKworCXJldHVybiB0dHk7Cit9CisKK3ZvaWQgZGV2cHRzX3B0eV9raWxsKGludCBudW1iZXIpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZ2V0X25vZGUobnVtYmVyKTsKKworCWlmICghSVNfRVJSKGRlbnRyeSkpIHsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwkJaWYgKGlub2RlKSB7CisJCQlpbm9kZS0+aV9ubGluay0tOworCQkJZF9kZWxldGUoZGVudHJ5KTsKKwkJCWRwdXQoZGVudHJ5KTsKKwkJfQorCQlkcHV0KGRlbnRyeSk7CisJfQorCXVwKCZkZXZwdHNfcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2RldnB0c19mcyh2b2lkKQoreworCWludCBlcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZkZXZwdHNfZnNfdHlwZSk7CisJaWYgKCFlcnIpIHsKKwkJZGV2cHRzX21udCA9IGtlcm5fbW91bnQoJmRldnB0c19mc190eXBlKTsKKwkJaWYgKElTX0VSUihkZXZwdHNfbW50KSkKKwkJCWVyciA9IFBUUl9FUlIoZGV2cHRzX21udCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2RldnB0c19mcyh2b2lkKQoreworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmZGV2cHRzX2ZzX3R5cGUpOworCW1udHB1dChkZXZwdHNfbW50KTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9kZXZwdHNfZnMpCittb2R1bGVfZXhpdChleGl0X2RldnB0c19mcykKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL2RldnB0cy94YXR0cl9zZWN1cml0eS5jIGIvZnMvZGV2cHRzL3hhdHRyX3NlY3VyaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY0Y2I1YwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2RldnB0cy94YXR0cl9zZWN1cml0eS5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBTZWN1cml0eSB4YXR0ciBzdXBwb3J0IGZvciBkZXZwdHMuCisgKgorICogQXV0aG9yOiBTdGVwaGVuIFNtYWxsZXkgPHNkc0BlcG9jaC5uY3NjLm1pbD4KKyAqIENvcHlyaWdodCAoYykgMjAwNCBSZWQgSGF0LCBJbmMuLCBKYW1lcyBNb3JyaXMgPGptb3JyaXNAcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CisKK3N0YXRpYyBzaXplX3QKK2RldnB0c194YXR0cl9zZWN1cml0eV9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmxpc3QsIHNpemVfdCBsaXN0X2xlbiwKKwkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbikKK3sKKwlyZXR1cm4gc2VjdXJpdHlfaW5vZGVfbGlzdHNlY3VyaXR5KGlub2RlLCBsaXN0LCBsaXN0X2xlbik7Cit9CisKK3N0YXRpYyBpbnQKK2RldnB0c194YXR0cl9zZWN1cml0eV9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gc2VjdXJpdHlfaW5vZGVfZ2V0c2VjdXJpdHkoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK2RldnB0c194YXR0cl9zZWN1cml0eV9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHNlY3VyaXR5X2lub2RlX3NldHNlY3VyaXR5KGlub2RlLCBuYW1lLCB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworfQorCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciBkZXZwdHNfeGF0dHJfc2VjdXJpdHlfaGFuZGxlciA9IHsKKwkucHJlZml4CT0gWEFUVFJfU0VDVVJJVFlfUFJFRklYLAorCS5saXN0CT0gZGV2cHRzX3hhdHRyX3NlY3VyaXR5X2xpc3QsCisJLmdldAk9IGRldnB0c194YXR0cl9zZWN1cml0eV9nZXQsCisJLnNldAk9IGRldnB0c194YXR0cl9zZWN1cml0eV9zZXQsCit9OwpkaWZmIC0tZ2l0IGEvZnMvZGlyZWN0LWlvLmMgYi9mcy9kaXJlY3QtaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTY3NGEwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZGlyZWN0LWlvLmMKQEAgLTAsMCArMSwxMjU4IEBACisvKgorICogZnMvZGlyZWN0LWlvLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIExpbnVzIFRvcnZhbGRzLgorICoKKyAqIE9fRElSRUNUCisgKgorICogMDRKdWwyMDAyCWFrcG1AemlwLmNvbS5hdQorICoJCUluaXRpYWwgdmVyc2lvbgorICogMTFTZXAyMDAyCWphbmV0aW5jQHVzLmlibS5jb20KKyAqIAkJYWRkZWQgcmVhZHYvd3JpdGV2IHN1cHBvcnQuCisgKiAyOU9jdDIwMDIJYWtwbUB6aXAuY29tLmF1CisgKgkJcmV3cm90ZSBiaW9fYWRkX3BhZ2UoKSBzdXBwb3J0LgorICogMzBPY3QyMDAyCXBiYWRhcmlAdXMuaWJtLmNvbQorICoJCWFkZGVkIHN1cHBvcnQgZm9yIG5vbi1hbGlnbmVkIElPLgorICogMDZOb3YyMDAyCXBiYWRhcmlAdXMuaWJtLmNvbQorICoJCWFkZGVkIGFzeW5jaHJvbm91cyBJTyBzdXBwb3J0LgorICogMjFKdWwyMDAzCW5hdGhhbnNAc2dpLmNvbQorICoJCWFkZGVkIElPIGNvbXBsZXRpb24gbm90aWZpZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisvKgorICogSG93IG1hbnkgdXNlciBwYWdlcyB0byBtYXAgaW4gb25lIGNhbGwgdG8gZ2V0X3VzZXJfcGFnZXMoKS4gIFRoaXMgZGV0ZXJtaW5lcworICogdGhlIHNpemUgb2YgYSBzdHJ1Y3R1cmUgb24gdGhlIHN0YWNrLgorICovCisjZGVmaW5lIERJT19QQUdFUwk2NAorCisvKgorICogVGhpcyBjb2RlIGdlbmVyYWxseSB3b3JrcyBpbiB1bml0cyBvZiAiZGlvX2Jsb2NrcyIuICBBIGRpb19ibG9jayBpcworICogc29tZXdoZXJlIGJldHdlZW4gdGhlIGhhcmQgc2VjdG9yIHNpemUgYW5kIHRoZSBmaWxlc3lzdGVtIGJsb2NrIHNpemUuICBpdAorICogaXMgZGV0ZXJtaW5lZCBvbiBhIHBlci1pbnZvY2F0aW9uIGJhc2lzLiAgIFdoZW4gdGFsa2luZyB0byB0aGUgZmlsZXN5c3RlbQorICogd2UgbmVlZCB0byBjb252ZXJ0IGRpb19ibG9ja3MgdG8gZnNfYmxvY2tzIGJ5IHNjYWxpbmcgdGhlIGRpb19ibG9jayBxdWFudGl0eQorICogZG93biBieSBkaW8tPmJsa2ZhY3Rvci4gIFNpbWlsYXJseSwgZnMtYmxvY2tzaXplIHF1YW50aXRpZXMgYXJlIGNvbnZlcnRlZAorICogdG8gYmlvX2Jsb2NrIHF1YW50aXRpZXMgYnkgc2hpZnRpbmcgbGVmdCBieSBibGtmYWN0b3IuCisgKgorICogSWYgYmxrZmFjdG9yIGlzIHplcm8gdGhlbiB0aGUgdXNlcidzIHJlcXVlc3Qgd2FzIGFsaWduZWQgdG8gdGhlIGZpbGVzeXN0ZW0ncworICogYmxvY2tzaXplLgorICoKKyAqIGxvY2tfdHlwZSBpcyBESU9fTE9DS0lORyBmb3IgcmVndWxhciBmaWxlcyBvbiBkaXJlY3QtSU8tbmFpdmUgZmlsZXN5c3RlbXMuCisgKiBUaGlzIGRldGVybWluZXMgd2hldGhlciB3ZSBuZWVkIHRvIGRvIHRoZSBmYW5jeSBsb2NraW5nIHdoaWNoIHByZXZlbnRzCisgKiBkaXJlY3QtSU8gZnJvbSBiZWluZyBhYmxlIHRvIHJlYWQgdW5pbml0aWFsaXNlZCBkaXNrIGJsb2Nrcy4gIElmIGl0cyB6ZXJvCisgKiAoYmxvY2tkZXYpIHRoaXMgbG9ja2luZyBpcyBub3QgZG9uZSwgYW5kIGlmIGl0IGlzIERJT19PV05fTE9DS0lORyBpX3NlbSBpcworICogbm90IGhlbGQgZm9yIHRoZSBlbnRpcmUgZGlyZWN0IHdyaXRlICh0YWtlbiBicmllZmx5LCBpbml0aWFsbHksIGR1cmluZyBhCisgKiBkaXJlY3QgcmVhZCB0aG91Z2gsIGJ1dCBpdHMgbmV2ZXIgaGVsZCBmb3IgdGhlIGR1cmF0aW9uIG9mIGEgZGlyZWN0LUlPKS4KKyAqLworCitzdHJ1Y3QgZGlvIHsKKwkvKiBCSU8gc3VibWlzc2lvbiBzdGF0ZSAqLworCXN0cnVjdCBiaW8gKmJpbzsJCS8qIGJpbyB1bmRlciBhc3NlbWJseSAqLworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHJ3OworCWludCBsb2NrX3R5cGU7CQkJLyogZG9lc24ndCBjaGFuZ2UgKi8KKwl1bnNpZ25lZCBibGtiaXRzOwkJLyogZG9lc24ndCBjaGFuZ2UgKi8KKwl1bnNpZ25lZCBibGtmYWN0b3I7CQkvKiBXaGVuIHdlJ3JlIHVzaW5nIGFuIGFsaWdubWVudCB3aGljaAorCQkJCQkgICBpcyBmaW5lciB0aGFuIHRoZSBmaWxlc3lzdGVtJ3Mgc29mdAorCQkJCQkgICBibG9ja3NpemUsIHRoaXMgc3BlY2lmaWVzIGhvdyBtdWNoCisJCQkJCSAgIGZpbmVyLiAgYmxrZmFjdG9yPTIgbWVhbnMgMS80LWJsb2NrCisJCQkJCSAgIGFsaWdubWVudC4gIERvZXMgbm90IGNoYW5nZSAqLworCXVuc2lnbmVkIHN0YXJ0X3plcm9fZG9uZTsJLyogZmxhZzogc3ViLWJsb2Nrc2l6ZSB6ZXJvaW5nIGhhcworCQkJCQkgICBiZWVuIHBlcmZvcm1lZCBhdCB0aGUgc3RhcnQgb2YgYQorCQkJCQkgICB3cml0ZSAqLworCWludCBwYWdlc19pbl9pbzsJCS8qIGFwcHJveGltYXRlIHRvdGFsIElPIHBhZ2VzICovCisJc2l6ZV90CXNpemU7CQkJLyogdG90YWwgcmVxdWVzdCBzaXplIChkb2Vzbid0IGNoYW5nZSkqLworCXNlY3Rvcl90IGJsb2NrX2luX2ZpbGU7CQkvKiBDdXJyZW50IG9mZnNldCBpbnRvIHRoZSB1bmRlcmx5aW5nCisJCQkJCSAgIGZpbGUgaW4gZGlvX2Jsb2NrIHVuaXRzLiAqLworCXVuc2lnbmVkIGJsb2Nrc19hdmFpbGFibGU7CS8qIEF0IGJsb2NrX2luX2ZpbGUuICBjaGFuZ2VzICovCisJc2VjdG9yX3QgZmluYWxfYmxvY2tfaW5fcmVxdWVzdDsvKiBkb2Vzbid0IGNoYW5nZSAqLworCXVuc2lnbmVkIGZpcnN0X2Jsb2NrX2luX3BhZ2U7CS8qIGRvZXNuJ3QgY2hhbmdlLCBVc2VkIG9ubHkgb25jZSAqLworCWludCBib3VuZGFyeTsJCQkvKiBwcmV2IGJsb2NrIGlzIGF0IGEgYm91bmRhcnkgKi8KKwlpbnQgcmVhcF9jb3VudGVyOwkJLyogcmF0ZSBsaW1pdCByZWFwaW5nICovCisJZ2V0X2Jsb2Nrc190ICpnZXRfYmxvY2tzOwkvKiBibG9jayBtYXBwaW5nIGZ1bmN0aW9uICovCisJZGlvX2lvZG9uZV90ICplbmRfaW87CQkvKiBJTyBjb21wbGV0aW9uIGZ1bmN0aW9uICovCisJc2VjdG9yX3QgZmluYWxfYmxvY2tfaW5fYmlvOwkvKiBjdXJyZW50IGZpbmFsIGJsb2NrIGluIGJpbyArIDEgKi8KKwlzZWN0b3JfdCBuZXh0X2Jsb2NrX2Zvcl9pbzsJLyogbmV4dCBibG9jayB0byBiZSBwdXQgdW5kZXIgSU8sCisJCQkJCSAgIGluIGRpb19ibG9ja3MgdW5pdHMgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgbWFwX2JoOwkvKiBsYXN0IGdldF9ibG9ja3MoKSByZXN1bHQgKi8KKworCS8qCisJICogRGVmZXJyZWQgYWRkaXRpb24gb2YgYSBwYWdlIHRvIHRoZSBkaW8uICBUaGVzZSB2YXJpYWJsZXMgYXJlCisJICogcHJpdmF0ZSB0byBkaW9fc2VuZF9jdXJfcGFnZSgpLCBzdWJtaXRfcGFnZV9zZWN0aW9uKCkgYW5kCisJICogZGlvX2Jpb19hZGRfcGFnZSgpLgorCSAqLworCXN0cnVjdCBwYWdlICpjdXJfcGFnZTsJCS8qIFRoZSBwYWdlICovCisJdW5zaWduZWQgY3VyX3BhZ2Vfb2Zmc2V0OwkvKiBPZmZzZXQgaW50byBpdCwgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBjdXJfcGFnZV9sZW47CQkvKiBOciBvZiBieXRlcyBhdCBjdXJfcGFnZV9vZmZzZXQgKi8KKwlzZWN0b3JfdCBjdXJfcGFnZV9ibG9jazsJLyogV2hlcmUgaXQgc3RhcnRzICovCisKKwkvKgorCSAqIFBhZ2UgZmV0Y2hpbmcgc3RhdGUuIFRoZXNlIHZhcmlhYmxlcyBiZWxvbmcgdG8gZGlvX3JlZmlsbF9wYWdlcygpLgorCSAqLworCWludCBjdXJyX3BhZ2U7CQkJLyogY2hhbmdlcyAqLworCWludCB0b3RhbF9wYWdlczsJCS8qIGRvZXNuJ3QgY2hhbmdlICovCisJdW5zaWduZWQgbG9uZyBjdXJyX3VzZXJfYWRkcmVzczsvKiBjaGFuZ2VzICovCisKKwkvKgorCSAqIFBhZ2UgcXVldWUuICBUaGVzZSB2YXJpYWJsZXMgYmVsb25nIHRvIGRpb19yZWZpbGxfcGFnZXMoKSBhbmQKKwkgKiBkaW9fZ2V0X3BhZ2UoKS4KKwkgKi8KKwlzdHJ1Y3QgcGFnZSAqcGFnZXNbRElPX1BBR0VTXTsJLyogcGFnZSBidWZmZXIgKi8KKwl1bnNpZ25lZCBoZWFkOwkJCS8qIG5leHQgcGFnZSB0byBwcm9jZXNzICovCisJdW5zaWduZWQgdGFpbDsJCQkvKiBsYXN0IHZhbGlkIHBhZ2UgKyAxICovCisJaW50IHBhZ2VfZXJyb3JzOwkJLyogZXJybm8gZnJvbSBnZXRfdXNlcl9wYWdlcygpICovCisKKwkvKiBCSU8gY29tcGxldGlvbiBzdGF0ZSAqLworCXNwaW5sb2NrX3QgYmlvX2xvY2s7CQkvKiBwcm90ZWN0cyBCSU8gZmllbGRzIGJlbG93ICovCisJaW50IGJpb19jb3VudDsJCQkvKiBuciBiaW9zIHRvIGJlIGNvbXBsZXRlZCAqLworCWludCBiaW9zX2luX2ZsaWdodDsJCS8qIG5yIGJpb3MgaW4gZmxpZ2h0ICovCisJc3RydWN0IGJpbyAqYmlvX2xpc3Q7CQkvKiBzaW5nbHkgbGlua2VkIHZpYSBiaV9wcml2YXRlICovCisJc3RydWN0IHRhc2tfc3RydWN0ICp3YWl0ZXI7CS8qIHdhaXRpbmcgdGFzayAoTlVMTCBpZiBub25lKSAqLworCisJLyogQUlPIHJlbGF0ZWQgc3R1ZmYgKi8KKwlzdHJ1Y3Qga2lvY2IgKmlvY2I7CQkvKiBraW9jYiAqLworCWludCBpc19hc3luYzsJCQkvKiBpcyBJTyBhc3luYyA/ICovCisJc3NpemVfdCByZXN1bHQ7ICAgICAgICAgICAgICAgICAvKiBJTyByZXN1bHQgKi8KK307CisKKy8qCisgKiBIb3cgbWFueSBwYWdlcyBhcmUgaW4gdGhlIHF1ZXVlPworICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGRpb19wYWdlc19wcmVzZW50KHN0cnVjdCBkaW8gKmRpbykKK3sKKwlyZXR1cm4gZGlvLT50YWlsIC0gZGlvLT5oZWFkOworfQorCisvKgorICogR28gZ3JhYiBhbmQgcGluIHNvbWUgdXNlcnNwYWNlIHBhZ2VzLiAgIFR5cGljYWxseSB3ZSdsbCBnZXQgNjQgYXQgYSB0aW1lLgorICovCitzdGF0aWMgaW50IGRpb19yZWZpbGxfcGFnZXMoc3RydWN0IGRpbyAqZGlvKQoreworCWludCByZXQ7CisJaW50IG5yX3BhZ2VzOworCisJbnJfcGFnZXMgPSBtaW4oZGlvLT50b3RhbF9wYWdlcyAtIGRpby0+Y3Vycl9wYWdlLCBESU9fUEFHRVMpOworCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlyZXQgPSBnZXRfdXNlcl9wYWdlcygKKwkJY3VycmVudCwJCQkvKiBUYXNrIGZvciBmYXVsdCBhY291bnRpbmcgKi8KKwkJY3VycmVudC0+bW0sCQkJLyogd2hvc2UgcGFnZXM/ICovCisJCWRpby0+Y3Vycl91c2VyX2FkZHJlc3MsCQkvKiBXaGVyZSBmcm9tPyAqLworCQlucl9wYWdlcywJCQkvKiBIb3cgbWFueSBwYWdlcz8gKi8KKwkJZGlvLT5ydyA9PSBSRUFELAkJLyogV3JpdGUgdG8gbWVtb3J5PyAqLworCQkwLAkJCQkvKiBmb3JjZSAoPykgKi8KKwkJJmRpby0+cGFnZXNbMF0sCisJCU5VTEwpOwkJCQkvKiB2bWFzICovCisJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworCWlmIChyZXQgPCAwICYmIGRpby0+YmxvY2tzX2F2YWlsYWJsZSAmJiAoZGlvLT5ydyA9PSBXUklURSkpIHsKKwkJLyoKKwkJICogQSBtZW1vcnkgZmF1bHQsIGJ1dCB0aGUgZmlsZXN5c3RlbSBoYXMgc29tZSBvdXRzdGFuZGluZworCQkgKiBtYXBwZWQgYmxvY2tzLiAgV2UgbmVlZCB0byB1c2UgdGhvc2UgYmxvY2tzIHVwIHRvIGF2b2lkCisJCSAqIGxlYWtpbmcgc3RhbGUgZGF0YSBpbiB0aGUgZmlsZS4KKwkJICovCisJCWlmIChkaW8tPnBhZ2VfZXJyb3JzID09IDApCisJCQlkaW8tPnBhZ2VfZXJyb3JzID0gcmV0OworCQlkaW8tPnBhZ2VzWzBdID0gWkVST19QQUdFKGRpby0+Y3Vycl91c2VyX2FkZHJlc3MpOworCQlkaW8tPmhlYWQgPSAwOworCQlkaW8tPnRhaWwgPSAxOworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocmV0ID49IDApIHsKKwkJZGlvLT5jdXJyX3VzZXJfYWRkcmVzcyArPSByZXQgKiBQQUdFX1NJWkU7CisJCWRpby0+Y3Vycl9wYWdlICs9IHJldDsKKwkJZGlvLT5oZWFkID0gMDsKKwkJZGlvLT50YWlsID0gcmV0OworCQlyZXQgPSAwOworCX0KK291dDoKKwlyZXR1cm4gcmV0OwkKK30KKworLyoKKyAqIEdldCBhbm90aGVyIHVzZXJzcGFjZSBwYWdlLiAgUmV0dXJucyBhbiBFUlJfUFRSIG9uIGVycm9yLiAgUGFnZXMgYXJlCisgKiBidWZmZXJlZCBpbnNpZGUgdGhlIGRpbyBzbyB0aGF0IHdlIGNhbiBjYWxsIGdldF91c2VyX3BhZ2VzKCkgYWdhaW5zdCBhCisgKiBkZWNlbnQgbnVtYmVyIG9mIHBhZ2VzLCBsZXNzIGZyZXF1ZW50bHkuICBUbyBwcm92aWRlIG5pY2VyIHVzZSBvZiB0aGUKKyAqIEwxIGNhY2hlLgorICovCitzdGF0aWMgc3RydWN0IHBhZ2UgKmRpb19nZXRfcGFnZShzdHJ1Y3QgZGlvICpkaW8pCit7CisJaWYgKGRpb19wYWdlc19wcmVzZW50KGRpbykgPT0gMCkgeworCQlpbnQgcmV0OworCisJCXJldCA9IGRpb19yZWZpbGxfcGFnZXMoZGlvKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiBFUlJfUFRSKHJldCk7CisJCUJVR19PTihkaW9fcGFnZXNfcHJlc2VudChkaW8pID09IDApOworCX0KKwlyZXR1cm4gZGlvLT5wYWdlc1tkaW8tPmhlYWQrK107Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiBhbGwgRElPIEJJTyBJL08gaGFzIGJlZW4gY29tcGxldGVkIC0gbGV0IHRoZSBmaWxlc3lzdGVtCisgKiBrbm93LCBpZiBpdCByZWdpc3RlcmVkIGFuIGludGVyZXN0IGVhcmxpZXIgdmlhIGdldF9ibG9ja3MuICBQYXNzIHRoZQorICogcHJpdmF0ZSBmaWVsZCBvZiB0aGUgbWFwIGJ1ZmZlcl9oZWFkIHNvIHRoYXQgZmlsZXN5c3RlbXMgY2FuIHVzZSBpdAorICogdG8gaG9sZCBhZGRpdGlvbmFsIHN0YXRlIGJldHdlZW4gZ2V0X2Jsb2NrcyBjYWxscyBhbmQgZGlvX2NvbXBsZXRlLgorICovCitzdGF0aWMgdm9pZCBkaW9fY29tcGxldGUoc3RydWN0IGRpbyAqZGlvLCBsb2ZmX3Qgb2Zmc2V0LCBzc2l6ZV90IGJ5dGVzKQoreworCWlmIChkaW8tPmVuZF9pbyAmJiBkaW8tPnJlc3VsdCkKKwkJZGlvLT5lbmRfaW8oZGlvLT5pbm9kZSwgb2Zmc2V0LCBieXRlcywgZGlvLT5tYXBfYmguYl9wcml2YXRlKTsKKwlpZiAoZGlvLT5sb2NrX3R5cGUgPT0gRElPX0xPQ0tJTkcpCisJCXVwX3JlYWQoJmRpby0+aW5vZGUtPmlfYWxsb2Nfc2VtKTsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIGEgQklPIGhhcyBiZWVuIHByb2Nlc3NlZC4gIElmIHRoZSBjb3VudCBnb2VzIHRvIHplcm8gdGhlbiBJTyBpcworICogY29tcGxldGUgYW5kIHdlIGNhbiBzaWduYWwgdGhpcyB0byB0aGUgQUlPIGxheWVyLgorICovCitzdGF0aWMgdm9pZCBmaW5pc2hlZF9vbmVfYmlvKHN0cnVjdCBkaW8gKmRpbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwlpZiAoZGlvLT5iaW9fY291bnQgPT0gMSkgeworCQlpZiAoZGlvLT5pc19hc3luYykgeworCQkJLyoKKwkJCSAqIExhc3QgcmVmZXJlbmNlIHRvIHRoZSBkaW8gaXMgZ29pbmcgYXdheS4KKwkJCSAqIERyb3Agc3BpbmxvY2sgYW5kIGNvbXBsZXRlIHRoZSBESU8uCisJCQkgKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwkJCWRpb19jb21wbGV0ZShkaW8sIGRpby0+YmxvY2tfaW5fZmlsZSA8PCBkaW8tPmJsa2JpdHMsCisJCQkJCWRpby0+cmVzdWx0KTsKKwkJCS8qIENvbXBsZXRlIEFJTyBsYXRlciBpZiBmYWxsaW5nIGJhY2sgdG8gYnVmZmVyZWQgaS9vICovCisJCQlpZiAoZGlvLT5yZXN1bHQgPT0gZGlvLT5zaXplIHx8CisJCQkJKChkaW8tPnJ3ID09IFJFQUQpICYmIGRpby0+cmVzdWx0KSkgeworCQkJCWFpb19jb21wbGV0ZShkaW8tPmlvY2IsIGRpby0+cmVzdWx0LCAwKTsKKwkJCQlrZnJlZShkaW8pOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBGYWxsaW5nIGJhY2sgdG8gYnVmZmVyZWQKKwkJCQkgKi8KKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGlvLT5iaW9fbG9jaywgZmxhZ3MpOworCQkJCWRpby0+YmlvX2NvdW50LS07CisJCQkJaWYgKGRpby0+d2FpdGVyKQorCQkJCQl3YWtlX3VwX3Byb2Nlc3MoZGlvLT53YWl0ZXIpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisJZGlvLT5iaW9fY291bnQtLTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgZGlvX2Jpb19jb21wbGV0ZShzdHJ1Y3QgZGlvICpkaW8sIHN0cnVjdCBiaW8gKmJpbyk7CisvKgorICogQXN5bmNocm9ub3VzIElPIGNhbGxiYWNrLiAKKyAqLworc3RhdGljIGludCBkaW9fYmlvX2VuZF9haW8oc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBpbnQgYnl0ZXNfZG9uZSwgaW50IGVycm9yKQoreworCXN0cnVjdCBkaW8gKmRpbyA9IGJpby0+YmlfcHJpdmF0ZTsKKworCWlmIChiaW8tPmJpX3NpemUpCisJCXJldHVybiAxOworCisJLyogY2xlYW51cCB0aGUgYmlvICovCisJZGlvX2Jpb19jb21wbGV0ZShkaW8sIGJpbyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgQklPIGNvbXBsZXRpb24gaGFuZGxlciBzaW1wbHkgcXVldWVzIHRoZSBCSU8gdXAgZm9yIHRoZSBwcm9jZXNzLWNvbnRleHQKKyAqIGhhbmRsZXIuCisgKgorICogRHVyaW5nIEkvTyBiaV9wcml2YXRlIHBvaW50cyBhdCB0aGUgZGlvLiAgQWZ0ZXIgSS9PLCBiaV9wcml2YXRlIGlzIHVzZWQgdG8KKyAqIGltcGxlbWVudCBhIHNpbmdseS1saW5rZWQgbGlzdCBvZiBjb21wbGV0ZWQgQklPcywgYXQgZGlvLT5iaW9fbGlzdC4KKyAqLworc3RhdGljIGludCBkaW9fYmlvX2VuZF9pbyhzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGludCBieXRlc19kb25lLCBpbnQgZXJyb3IpCit7CisJc3RydWN0IGRpbyAqZGlvID0gYmlvLT5iaV9wcml2YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoYmlvLT5iaV9zaXplKQorCQlyZXR1cm4gMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7CisJYmlvLT5iaV9wcml2YXRlID0gZGlvLT5iaW9fbGlzdDsKKwlkaW8tPmJpb19saXN0ID0gYmlvOworCWRpby0+Ymlvc19pbl9mbGlnaHQtLTsKKwlpZiAoZGlvLT53YWl0ZXIgJiYgZGlvLT5iaW9zX2luX2ZsaWdodCA9PSAwKQorCQl3YWtlX3VwX3Byb2Nlc3MoZGlvLT53YWl0ZXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZGlvX2Jpb19hbGxvYyhzdHJ1Y3QgZGlvICpkaW8sIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCXNlY3Rvcl90IGZpcnN0X3NlY3RvciwgaW50IG5yX3ZlY3MpCit7CisJc3RydWN0IGJpbyAqYmlvOworCisJYmlvID0gYmlvX2FsbG9jKEdGUF9LRVJORUwsIG5yX3ZlY3MpOworCWlmIChiaW8gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwliaW8tPmJpX2JkZXYgPSBiZGV2OworCWJpby0+Ymlfc2VjdG9yID0gZmlyc3Rfc2VjdG9yOworCWlmIChkaW8tPmlzX2FzeW5jKQorCQliaW8tPmJpX2VuZF9pbyA9IGRpb19iaW9fZW5kX2FpbzsKKwllbHNlCisJCWJpby0+YmlfZW5kX2lvID0gZGlvX2Jpb19lbmRfaW87CisKKwlkaW8tPmJpbyA9IGJpbzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluIHRoZSBBSU8gcmVhZCBjYXNlIHdlIHNwZWN1bGF0aXZlbHkgZGlydHkgdGhlIHBhZ2VzIGJlZm9yZSBzdGFydGluZyBJTy4KKyAqIER1cmluZyBJTyBjb21wbGV0aW9uLCBhbnkgb2YgdGhlc2UgcGFnZXMgd2hpY2ggaGFwcGVuIHRvIGhhdmUgYmVlbiB3cml0dGVuCisgKiBiYWNrIHdpbGwgYmUgcmVkaXJ0aWVkIGJ5IGJpb19jaGVja19wYWdlc19kaXJ0eSgpLgorICovCitzdGF0aWMgdm9pZCBkaW9fYmlvX3N1Ym1pdChzdHJ1Y3QgZGlvICpkaW8pCit7CisJc3RydWN0IGJpbyAqYmlvID0gZGlvLT5iaW87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWJpby0+YmlfcHJpdmF0ZSA9IGRpbzsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGlvLT5iaW9fbG9jaywgZmxhZ3MpOworCWRpby0+YmlvX2NvdW50Kys7CisJZGlvLT5iaW9zX2luX2ZsaWdodCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwlpZiAoZGlvLT5pc19hc3luYyAmJiBkaW8tPnJ3ID09IFJFQUQpCisJCWJpb19zZXRfcGFnZXNfZGlydHkoYmlvKTsKKwlzdWJtaXRfYmlvKGRpby0+cncsIGJpbyk7CisKKwlkaW8tPmJpbyA9IE5VTEw7CisJZGlvLT5ib3VuZGFyeSA9IDA7Cit9CisKKy8qCisgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgaW4gY2FzZSBvZiBhIGZhaWx1cmUKKyAqLworc3RhdGljIHZvaWQgZGlvX2NsZWFudXAoc3RydWN0IGRpbyAqZGlvKQoreworCXdoaWxlIChkaW9fcGFnZXNfcHJlc2VudChkaW8pKQorCQlwYWdlX2NhY2hlX3JlbGVhc2UoZGlvX2dldF9wYWdlKGRpbykpOworfQorCisvKgorICogV2FpdCBmb3IgdGhlIG5leHQgQklPIHRvIGNvbXBsZXRlLiAgUmVtb3ZlIGl0IGFuZCByZXR1cm4gaXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmlvICpkaW9fYXdhaXRfb25lKHN0cnVjdCBkaW8gKmRpbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBiaW8gKmJpbzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7CisJd2hpbGUgKGRpby0+YmlvX2xpc3QgPT0gTlVMTCkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCWlmIChkaW8tPmJpb19saXN0ID09IE5VTEwpIHsKKwkJCWRpby0+d2FpdGVyID0gY3VycmVudDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwkJCWJsa19ydW5fYWRkcmVzc19zcGFjZShkaW8tPmlub2RlLT5pX21hcHBpbmcpOworCQkJaW9fc2NoZWR1bGUoKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7CisJCQlkaW8tPndhaXRlciA9IE5VTEw7CisJCX0KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwl9CisJYmlvID0gZGlvLT5iaW9fbGlzdDsKKwlkaW8tPmJpb19saXN0ID0gYmlvLT5iaV9wcml2YXRlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gYmlvOworfQorCisvKgorICogUHJvY2VzcyBvbmUgY29tcGxldGVkIEJJTy4gIE5vIGxvY2tzIGFyZSBoZWxkLgorICovCitzdGF0aWMgaW50IGRpb19iaW9fY29tcGxldGUoc3RydWN0IGRpbyAqZGlvLCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJY29uc3QgaW50IHVwdG9kYXRlID0gdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYzsKKwlpbnQgcGFnZV9ubzsKKworCWlmICghdXB0b2RhdGUpCisJCWRpby0+cmVzdWx0ID0gLUVJTzsKKworCWlmIChkaW8tPmlzX2FzeW5jICYmIGRpby0+cncgPT0gUkVBRCkgeworCQliaW9fY2hlY2tfcGFnZXNfZGlydHkoYmlvKTsJLyogdHJhbnNmZXJzIG93bmVyc2hpcCAqLworCX0gZWxzZSB7CisJCWZvciAocGFnZV9ubyA9IDA7IHBhZ2Vfbm8gPCBiaW8tPmJpX3ZjbnQ7IHBhZ2Vfbm8rKykgeworCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBidmVjW3BhZ2Vfbm9dLmJ2X3BhZ2U7CisKKwkJCWlmIChkaW8tPnJ3ID09IFJFQUQgJiYgIVBhZ2VDb21wb3VuZChwYWdlKSkKKwkJCQlzZXRfcGFnZV9kaXJ0eV9sb2NrKHBhZ2UpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQl9CisJCWJpb19wdXQoYmlvKTsKKwl9CisJZmluaXNoZWRfb25lX2JpbyhkaW8pOworCXJldHVybiB1cHRvZGF0ZSA/IDAgOiAtRUlPOworfQorCisvKgorICogV2FpdCBvbiBhbmQgcHJvY2VzcyBhbGwgaW4tZmxpZ2h0IEJJT3MuCisgKi8KK3N0YXRpYyBpbnQgZGlvX2F3YWl0X2NvbXBsZXRpb24oc3RydWN0IGRpbyAqZGlvKQoreworCWludCByZXQgPSAwOworCisJaWYgKGRpby0+YmlvKQorCQlkaW9fYmlvX3N1Ym1pdChkaW8pOworCisJLyoKKwkgKiBUaGUgYmlvX2xvY2sgaXMgbm90IGhlbGQgZm9yIHRoZSByZWFkIG9mIGJpb19jb3VudC4KKwkgKiBUaGlzIGlzIG9rIHNpbmNlIGl0IGlzIHRoZSBkaW9fYmlvX2NvbXBsZXRlKCkgdGhhdCBjaGFuZ2VzCisJICogYmlvX2NvdW50LgorCSAqLworCXdoaWxlIChkaW8tPmJpb19jb3VudCkgeworCQlzdHJ1Y3QgYmlvICpiaW8gPSBkaW9fYXdhaXRfb25lKGRpbyk7CisJCWludCByZXQyOworCisJCXJldDIgPSBkaW9fYmlvX2NvbXBsZXRlKGRpbywgYmlvKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcmV0ID0gcmV0MjsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEEgcmVhbGx5IGxhcmdlIE9fRElSRUNUIHJlYWQgb3Igd3JpdGUgY2FuIGdlbmVyYXRlIGEgbG90IG9mIEJJT3MuICBTbworICogdG8ga2VlcCB0aGUgbWVtb3J5IGNvbnN1bXB0aW9uIHNhbmUgd2UgcGVyaW9kaWNhbGx5IHJlYXAgYW55IGNvbXBsZXRlZCBCSU9zCisgKiBkdXJpbmcgdGhlIEJJTyBnZW5lcmF0aW9uIHBoYXNlLgorICoKKyAqIFRoaXMgYWxzbyBoZWxwcyB0byBsaW1pdCB0aGUgcGVhayBhbW91bnQgb2YgcGlubmVkIHVzZXJzcGFjZSBtZW1vcnkuCisgKi8KK3N0YXRpYyBpbnQgZGlvX2Jpb19yZWFwKHN0cnVjdCBkaW8gKmRpbykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkaW8tPnJlYXBfY291bnRlcisrID49IDY0KSB7CisJCXdoaWxlIChkaW8tPmJpb19saXN0KSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJc3RydWN0IGJpbyAqYmlvOworCQkJaW50IHJldDI7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7CisJCQliaW8gPSBkaW8tPmJpb19saXN0OworCQkJZGlvLT5iaW9fbGlzdCA9IGJpby0+YmlfcHJpdmF0ZTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwkJCXJldDIgPSBkaW9fYmlvX2NvbXBsZXRlKGRpbywgYmlvKTsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlyZXQgPSByZXQyOworCQl9CisJCWRpby0+cmVhcF9jb3VudGVyID0gMDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIENhbGwgaW50byB0aGUgZnMgdG8gbWFwIHNvbWUgbW9yZSBkaXNrIGJsb2Nrcy4gIFdlIHJlY29yZCB0aGUgY3VycmVudCBudW1iZXIKKyAqIG9mIGF2YWlsYWJsZSBibG9ja3MgYXQgZGlvLT5ibG9ja3NfYXZhaWxhYmxlLiAgVGhlc2UgYXJlIGluIHVuaXRzIG9mIHRoZQorICogZnMgYmxvY2tzaXplLCAoMSA8PCBpbm9kZS0+aV9ibGtiaXRzKS4KKyAqCisgKiBUaGUgZnMgaXMgYWxsb3dlZCB0byBtYXAgbG90cyBvZiBibG9ja3MgYXQgb25jZS4gIElmIGl0IHdhbnRzIHRvIGRvIHRoYXQsCisgKiBpdCB1c2VzIHRoZSBwYXNzZWQgaW5vZGUtcmVsYXRpdmUgYmxvY2sgbnVtYmVyIGFzIHRoZSBmaWxlIG9mZnNldCwgYXMgdXN1YWwuCisgKgorICogZ2V0X2Jsb2NrcygpIGlzIHBhc3NlZCB0aGUgbnVtYmVyIG9mIGlfYmxrYml0cy1zaXplZCBibG9ja3Mgd2hpY2ggZGlyZWN0X2lvCisgKiBoYXMgcmVtYWluaW5nIHRvIGRvLiAgVGhlIGZzIHNob3VsZCBub3QgbWFwIG1vcmUgdGhhbiB0aGlzIG51bWJlciBvZiBibG9ja3MuCisgKgorICogSWYgdGhlIGZzIGhhcyBtYXBwZWQgYSBsb3Qgb2YgYmxvY2tzLCBpdCBzaG91bGQgcG9wdWxhdGUgYmgtPmJfc2l6ZSB0bworICogaW5kaWNhdGUgaG93IG11Y2ggY29udGlndW91cyBkaXNrIHNwYWNlIGhhcyBiZWVuIG1hZGUgYXZhaWxhYmxlIGF0CisgKiBiaC0+Yl9ibG9ja25yLgorICoKKyAqIElmICphbnkqIG9mIHRoZSBtYXBwZWQgYmxvY2tzIGFyZSBuZXcsIHRoZW4gdGhlIGZzIG11c3Qgc2V0IGJ1ZmZlcl9uZXcoKS4KKyAqIFRoaXMgaXNuJ3QgdmVyeSBlZmZpY2llbnQuLi4KKyAqCisgKiBJbiB0aGUgY2FzZSBvZiBmaWxlc3lzdGVtIGhvbGVzOiB0aGUgZnMgbWF5IHJldHVybiBhbiBhcmJpdHJhcmlseS1sYXJnZQorICogaG9sZSBieSByZXR1cm5pbmcgYW4gYXBwcm9wcmlhdGUgdmFsdWUgaW4gYl9zaXplIGFuZCBieSBjbGVhcmluZworICogYnVmZmVyX21hcHBlZCgpLiAgSG93ZXZlciB0aGUgZGlyZWN0LWlvIGNvZGUgd2lsbCBvbmx5IHByb2Nlc3MgaG9sZXMgb25lCisgKiBibG9jayBhdCBhIHRpbWUgLSBpdCB3aWxsIHJlcGVhdGVkbHkgY2FsbCBnZXRfYmxvY2tzKCkgYXMgaXQgd2Fsa3MgdGhlIGhvbGUuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X21vcmVfYmxvY2tzKHN0cnVjdCBkaW8gKmRpbykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBidWZmZXJfaGVhZCAqbWFwX2JoID0gJmRpby0+bWFwX2JoOworCXNlY3Rvcl90IGZzX3N0YXJ0YmxrOwkvKiBJbnRvIGZpbGUsIGluIGZpbGVzeXN0ZW0tc2l6ZWQgYmxvY2tzICovCisJdW5zaWduZWQgbG9uZyBmc19jb3VudDsJLyogTnVtYmVyIG9mIGZpbGVzeXN0ZW0tc2l6ZWQgYmxvY2tzICovCisJdW5zaWduZWQgbG9uZyBkaW9fY291bnQ7LyogTnVtYmVyIG9mIGRpb19ibG9jay1zaXplZCBibG9ja3MgKi8KKwl1bnNpZ25lZCBsb25nIGJsa21hc2s7CisJaW50IGNyZWF0ZTsKKworCS8qCisJICogSWYgdGhlcmUgd2FzIGEgbWVtb3J5IGVycm9yIGFuZCB3ZSd2ZSBvdmVyd3JpdHRlbiBhbGwgdGhlCisJICogbWFwcGVkIGJsb2NrcyB0aGVuIHdlIGNhbiBub3cgcmV0dXJuIHRoYXQgbWVtb3J5IGVycm9yCisJICovCisJcmV0ID0gZGlvLT5wYWdlX2Vycm9yczsKKwlpZiAocmV0ID09IDApIHsKKwkJbWFwX2JoLT5iX3N0YXRlID0gMDsKKwkJbWFwX2JoLT5iX3NpemUgPSAwOworCQlCVUdfT04oZGlvLT5ibG9ja19pbl9maWxlID49IGRpby0+ZmluYWxfYmxvY2tfaW5fcmVxdWVzdCk7CisJCWZzX3N0YXJ0YmxrID0gZGlvLT5ibG9ja19pbl9maWxlID4+IGRpby0+YmxrZmFjdG9yOworCQlkaW9fY291bnQgPSBkaW8tPmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QgLSBkaW8tPmJsb2NrX2luX2ZpbGU7CisJCWZzX2NvdW50ID0gZGlvX2NvdW50ID4+IGRpby0+YmxrZmFjdG9yOworCQlibGttYXNrID0gKDEgPDwgZGlvLT5ibGtmYWN0b3IpIC0gMTsKKwkJaWYgKGRpb19jb3VudCAmIGJsa21hc2spCQorCQkJZnNfY291bnQrKzsKKworCQljcmVhdGUgPSBkaW8tPnJ3ID09IFdSSVRFOworCQlpZiAoZGlvLT5sb2NrX3R5cGUgPT0gRElPX0xPQ0tJTkcpIHsKKwkJCWlmIChkaW8tPmJsb2NrX2luX2ZpbGUgPCAoaV9zaXplX3JlYWQoZGlvLT5pbm9kZSkgPj4KKwkJCQkJCQlkaW8tPmJsa2JpdHMpKQorCQkJCWNyZWF0ZSA9IDA7CisJCX0gZWxzZSBpZiAoZGlvLT5sb2NrX3R5cGUgPT0gRElPX05PX0xPQ0tJTkcpIHsKKwkJCWNyZWF0ZSA9IDA7CisJCX0KKwkJLyoKKwkJICogRm9yIHdyaXRlcyBpbnNpZGUgaV9zaXplIHdlIGZvcmJpZCBibG9jayBjcmVhdGlvbnM6IG9ubHkKKwkJICogb3ZlcndyaXRlcyBhcmUgcGVybWl0dGVkLiAgV2UgZmFsbCBiYWNrIHRvIGJ1ZmZlcmVkIHdyaXRlcworCQkgKiBhdCBhIGhpZ2hlciBsZXZlbCBmb3IgaW5zaWRlLWlfc2l6ZSBibG9jay1pbnN0YW50aWF0aW5nCisJCSAqIHdyaXRlcy4KKwkJICovCisJCXJldCA9ICgqZGlvLT5nZXRfYmxvY2tzKShkaW8tPmlub2RlLCBmc19zdGFydGJsaywgZnNfY291bnQsCisJCQkJCQltYXBfYmgsIGNyZWF0ZSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGVyZSBpcyBubyBiaW8uICBNYWtlIG9uZSBub3cuCisgKi8KK3N0YXRpYyBpbnQgZGlvX25ld19iaW8oc3RydWN0IGRpbyAqZGlvLCBzZWN0b3JfdCBzdGFydF9zZWN0b3IpCit7CisJc2VjdG9yX3Qgc2VjdG9yOworCWludCByZXQsIG5yX3BhZ2VzOworCisJcmV0ID0gZGlvX2Jpb19yZWFwKGRpbyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisJc2VjdG9yID0gc3RhcnRfc2VjdG9yIDw8IChkaW8tPmJsa2JpdHMgLSA5KTsKKwlucl9wYWdlcyA9IG1pbihkaW8tPnBhZ2VzX2luX2lvLCBiaW9fZ2V0X25yX3ZlY3MoZGlvLT5tYXBfYmguYl9iZGV2KSk7CisJQlVHX09OKG5yX3BhZ2VzIDw9IDApOworCXJldCA9IGRpb19iaW9fYWxsb2MoZGlvLCBkaW8tPm1hcF9iaC5iX2JkZXYsIHNlY3RvciwgbnJfcGFnZXMpOworCWRpby0+Ym91bmRhcnkgPSAwOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBBdHRlbXB0IHRvIHB1dCB0aGUgY3VycmVudCBjaHVuayBvZiAnY3VyX3BhZ2UnIGludG8gdGhlIGN1cnJlbnQgQklPLiAgSWYKKyAqIHRoYXQgd2FzIHN1Y2Nlc3NmdWwgdGhlbiB1cGRhdGUgZmluYWxfYmxvY2tfaW5fYmlvIGFuZCB0YWtlIGEgcmVmIGFnYWluc3QKKyAqIHRoZSBqdXN0LWFkZGVkIHBhZ2UuCisgKgorICogUmV0dXJuIHplcm8gb24gc3VjY2Vzcy4gIE5vbi16ZXJvIG1lYW5zIHRoZSBjYWxsZXIgbmVlZHMgdG8gc3RhcnQgYSBuZXcgQklPLgorICovCitzdGF0aWMgaW50IGRpb19iaW9fYWRkX3BhZ2Uoc3RydWN0IGRpbyAqZGlvKQoreworCWludCByZXQ7CisKKwlyZXQgPSBiaW9fYWRkX3BhZ2UoZGlvLT5iaW8sIGRpby0+Y3VyX3BhZ2UsCisJCQlkaW8tPmN1cl9wYWdlX2xlbiwgZGlvLT5jdXJfcGFnZV9vZmZzZXQpOworCWlmIChyZXQgPT0gZGlvLT5jdXJfcGFnZV9sZW4pIHsKKwkJLyoKKwkJICogRGVjcmVtZW50IGNvdW50IG9ubHksIGlmIHdlIGFyZSBkb25lIHdpdGggdGhpcyBwYWdlCisJCSAqLworCQlpZiAoKGRpby0+Y3VyX3BhZ2VfbGVuICsgZGlvLT5jdXJfcGFnZV9vZmZzZXQpID09IFBBR0VfU0laRSkKKwkJCWRpby0+cGFnZXNfaW5faW8tLTsKKwkJcGFnZV9jYWNoZV9nZXQoZGlvLT5jdXJfcGFnZSk7CisJCWRpby0+ZmluYWxfYmxvY2tfaW5fYmlvID0gZGlvLT5jdXJfcGFnZV9ibG9jayArCisJCQkoZGlvLT5jdXJfcGFnZV9sZW4gPj4gZGlvLT5ibGtiaXRzKTsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlyZXQgPSAxOworCX0KKwlyZXR1cm4gcmV0OworfQorCQkKKy8qCisgKiBQdXQgY3VyX3BhZ2UgdW5kZXIgSU8uICBUaGUgc2VjdGlvbiBvZiBjdXJfcGFnZSB3aGljaCBpcyBkZXNjcmliZWQgYnkKKyAqIGN1cl9wYWdlX29mZnNldCxjdXJfcGFnZV9sZW4gaXMgcHV0IGludG8gYSBCSU8uICBUaGUgc2VjdGlvbiBvZiBjdXJfcGFnZQorICogc3RhcnRzIG9uLWRpc2sgYXQgY3VyX3BhZ2VfYmxvY2suCisgKgorICogV2UgdGFrZSBhIHJlZiBhZ2FpbnN0IHRoZSBwYWdlIGhlcmUgKG9uIGJlaGFsZiBvZiBpdHMgcHJlc2VuY2UgaW4gdGhlIGJpbykuCisgKgorICogVGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZW1vdmluZyBjdXJfcGFnZSBmcm9tIHRoZQorICogZGlvLCBhbmQgZm9yIGRyb3BwaW5nIHRoZSByZWZjb3VudCB3aGljaCBjYW1lIGZyb20gdGhhdCBwcmVzZW5jZS4KKyAqLworc3RhdGljIGludCBkaW9fc2VuZF9jdXJfcGFnZShzdHJ1Y3QgZGlvICpkaW8pCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZGlvLT5iaW8pIHsKKwkJLyoKKwkJICogU2VlIHdoZXRoZXIgdGhpcyBuZXcgcmVxdWVzdCBpcyBjb250aWd1b3VzIHdpdGggdGhlIG9sZAorCQkgKi8KKwkJaWYgKGRpby0+ZmluYWxfYmxvY2tfaW5fYmlvICE9IGRpby0+Y3VyX3BhZ2VfYmxvY2spCisJCQlkaW9fYmlvX3N1Ym1pdChkaW8pOworCQkvKgorCQkgKiBTdWJtaXQgbm93IGlmIHRoZSB1bmRlcmx5aW5nIGZzIGlzIGFib3V0IHRvIHBlcmZvcm0gYQorCQkgKiBtZXRhZGF0YSByZWFkCisJCSAqLworCQlpZiAoZGlvLT5ib3VuZGFyeSkKKwkJCWRpb19iaW9fc3VibWl0KGRpbyk7CisJfQorCisJaWYgKGRpby0+YmlvID09IE5VTEwpIHsKKwkJcmV0ID0gZGlvX25ld19iaW8oZGlvLCBkaW8tPmN1cl9wYWdlX2Jsb2NrKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCWlmIChkaW9fYmlvX2FkZF9wYWdlKGRpbykgIT0gMCkgeworCQlkaW9fYmlvX3N1Ym1pdChkaW8pOworCQlyZXQgPSBkaW9fbmV3X2JpbyhkaW8sIGRpby0+Y3VyX3BhZ2VfYmxvY2spOworCQlpZiAocmV0ID09IDApIHsKKwkJCXJldCA9IGRpb19iaW9fYWRkX3BhZ2UoZGlvKTsKKwkJCUJVR19PTihyZXQgIT0gMCk7CisJCX0KKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEFuIGF1dG9ub21vdXMgZnVuY3Rpb24gdG8gcHV0IGEgY2h1bmsgb2YgYSBwYWdlIHVuZGVyIGRlZmVycmVkIElPLgorICoKKyAqIFRoZSBjYWxsZXIgZG9lc24ndCBhY3R1YWxseSBrbm93IChvciBjYXJlKSB3aGV0aGVyIHRoaXMgcGllY2Ugb2YgcGFnZSBpcyBpbgorICogYSBCSU8sIG9yIGlzIHVuZGVyIElPIG9yIHdoYXRldmVyLiAgV2UganVzdCB0YWtlIGNhcmUgb2YgYWxsIHBvc3NpYmxlIAorICogc2l0dWF0aW9ucyBoZXJlLiAgVGhlIHNlcGFyYXRpb24gYmV0d2VlbiB0aGUgbG9naWMgb2YgZG9fZGlyZWN0X0lPKCkgYW5kCisgKiB0aGF0IG9mIHN1Ym1pdF9wYWdlX3NlY3Rpb24oKSBpcyBpbXBvcnRhbnQgZm9yIGNsYXJpdHkuICBQbGVhc2UgZG9uJ3QgYnJlYWsuCisgKgorICogVGhlIGNodW5rIG9mIHBhZ2Ugc3RhcnRzIG9uLWRpc2sgYXQgYmxvY2tuci4KKyAqCisgKiBXZSBwZXJmb3JtIGRlZmVycmVkIElPLCBieSByZWNvcmRpbmcgdGhlIGxhc3Qtc3VibWl0dGVkIHBhZ2UgaW5zaWRlIG91cgorICogcHJpdmF0ZSBwYXJ0IG9mIHRoZSBkaW8gc3RydWN0dXJlLiAgSWYgcG9zc2libGUsIHdlIGp1c3QgZXhwYW5kIHRoZSBJTworICogYWNyb3NzIHRoYXQgcGFnZSBoZXJlLgorICoKKyAqIElmIHRoYXQgZG9lc24ndCB3b3JrIG91dCB0aGVuIHdlIHB1dCB0aGUgb2xkIHBhZ2UgaW50byB0aGUgYmlvIGFuZCBhZGQgdGhpcworICogcGFnZSB0byB0aGUgZGlvIGluc3RlYWQuCisgKi8KK3N0YXRpYyBpbnQKK3N1Ym1pdF9wYWdlX3NlY3Rpb24oc3RydWN0IGRpbyAqZGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW4sIHNlY3Rvcl90IGJsb2NrbnIpCit7CisJaW50IHJldCA9IDA7CisKKwkvKgorCSAqIENhbiB3ZSBqdXN0IGdyb3cgdGhlIGN1cnJlbnQgcGFnZSdzIHByZXNlbmNlIGluIHRoZSBkaW8/CisJICovCisJaWYgKAkoZGlvLT5jdXJfcGFnZSA9PSBwYWdlKSAmJgorCQkoZGlvLT5jdXJfcGFnZV9vZmZzZXQgKyBkaW8tPmN1cl9wYWdlX2xlbiA9PSBvZmZzZXQpICYmCisJCShkaW8tPmN1cl9wYWdlX2Jsb2NrICsKKwkJCShkaW8tPmN1cl9wYWdlX2xlbiA+PiBkaW8tPmJsa2JpdHMpID09IGJsb2NrbnIpKSB7CisJCWRpby0+Y3VyX3BhZ2VfbGVuICs9IGxlbjsKKworCQkvKgorCQkgKiBJZiBkaW8tPmJvdW5kYXJ5IHRoZW4gd2Ugd2FudCB0byBzY2hlZHVsZSB0aGUgSU8gbm93IHRvCisJCSAqIGF2b2lkIG1ldGFkYXRhIHNlZWtzLgorCQkgKi8KKwkJaWYgKGRpby0+Ym91bmRhcnkpIHsKKwkJCXJldCA9IGRpb19zZW5kX2N1cl9wYWdlKGRpbyk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UoZGlvLT5jdXJfcGFnZSk7CisJCQlkaW8tPmN1cl9wYWdlID0gTlVMTDsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIElmIHRoZXJlJ3MgYSBkZWZlcnJlZCBwYWdlIGFscmVhZHkgdGhlcmUgdGhlbiBzZW5kIGl0LgorCSAqLworCWlmIChkaW8tPmN1cl9wYWdlKSB7CisJCXJldCA9IGRpb19zZW5kX2N1cl9wYWdlKGRpbyk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShkaW8tPmN1cl9wYWdlKTsKKwkJZGlvLT5jdXJfcGFnZSA9IE5VTEw7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisKKwlwYWdlX2NhY2hlX2dldChwYWdlKTsJCS8qIEl0IGlzIGluIGRpbyAqLworCWRpby0+Y3VyX3BhZ2UgPSBwYWdlOworCWRpby0+Y3VyX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0OworCWRpby0+Y3VyX3BhZ2VfbGVuID0gbGVuOworCWRpby0+Y3VyX3BhZ2VfYmxvY2sgPSBibG9ja25yOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDbGVhbiBhbnkgZGlydHkgYnVmZmVycyBpbiB0aGUgYmxvY2tkZXYgbWFwcGluZyB3aGljaCBhbGlhcyBuZXdseS1jcmVhdGVkCisgKiBmaWxlIGJsb2Nrcy4gIE9ubHkgY2FsbGVkIGZvciBTX0lTUkVHIGZpbGVzIC0gYmxvY2tkZXZzIGRvIG5vdCBzZXQKKyAqIGJ1ZmZlcl9uZXcKKyAqLworc3RhdGljIHZvaWQgY2xlYW5fYmxvY2tkZXZfYWxpYXNlcyhzdHJ1Y3QgZGlvICpkaW8pCit7CisJdW5zaWduZWQgaTsKKwl1bnNpZ25lZCBuYmxvY2tzOworCisJbmJsb2NrcyA9IGRpby0+bWFwX2JoLmJfc2l6ZSA+PiBkaW8tPmlub2RlLT5pX2Jsa2JpdHM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmJsb2NrczsgaSsrKSB7CisJCXVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEoZGlvLT5tYXBfYmguYl9iZGV2LAorCQkJCQlkaW8tPm1hcF9iaC5iX2Jsb2NrbnIgKyBpKTsKKwl9Cit9CisKKy8qCisgKiBJZiB3ZSBhcmUgbm90IHdyaXRpbmcgdGhlIGVudGlyZSBibG9jayBhbmQgZ2V0X2Jsb2NrKCkgYWxsb2NhdGVkCisgKiB0aGUgYmxvY2sgZm9yIHVzLCB3ZSBuZWVkIHRvIGZpbGwtaW4gdGhlIHVudXNlZCBwb3J0aW9uIG9mIHRoZQorICogYmxvY2sgd2l0aCB6ZXJvcy4gVGhpcyBoYXBwZW5zIG9ubHkgaWYgdXNlci1idWZmZXIsIGZpbGVvZmZzZXQgb3IKKyAqIGlvIGxlbmd0aCBpcyBub3QgZmlsZXN5c3RlbSBibG9jay1zaXplIG11bHRpcGxlLgorICoKKyAqIGBlbmQnIGlzIHplcm8gaWYgd2UncmUgZG9pbmcgdGhlIHN0YXJ0IG9mIHRoZSBJTywgMSBhdCB0aGUgZW5kIG9mIHRoZQorICogSU8uCisgKi8KK3N0YXRpYyB2b2lkIGRpb196ZXJvX2Jsb2NrKHN0cnVjdCBkaW8gKmRpbywgaW50IGVuZCkKK3sKKwl1bnNpZ25lZCBkaW9fYmxvY2tzX3Blcl9mc19ibG9jazsKKwl1bnNpZ25lZCB0aGlzX2NodW5rX2Jsb2NrczsJLyogSW4gZGlvX2Jsb2NrcyAqLworCXVuc2lnbmVkIHRoaXNfY2h1bmtfYnl0ZXM7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlkaW8tPnN0YXJ0X3plcm9fZG9uZSA9IDE7CisJaWYgKCFkaW8tPmJsa2ZhY3RvciB8fCAhYnVmZmVyX25ldygmZGlvLT5tYXBfYmgpKQorCQlyZXR1cm47CisKKwlkaW9fYmxvY2tzX3Blcl9mc19ibG9jayA9IDEgPDwgZGlvLT5ibGtmYWN0b3I7CisJdGhpc19jaHVua19ibG9ja3MgPSBkaW8tPmJsb2NrX2luX2ZpbGUgJiAoZGlvX2Jsb2Nrc19wZXJfZnNfYmxvY2sgLSAxKTsKKworCWlmICghdGhpc19jaHVua19ibG9ja3MpCisJCXJldHVybjsKKworCS8qCisJICogV2UgbmVlZCB0byB6ZXJvIG91dCBwYXJ0IG9mIGFuIGZzIGJsb2NrLiAgSXQgaXMgZWl0aGVyIGF0IHRoZQorCSAqIGJlZ2lubmluZyBvciB0aGUgZW5kIG9mIHRoZSBmcyBibG9jay4KKwkgKi8KKwlpZiAoZW5kKSAKKwkJdGhpc19jaHVua19ibG9ja3MgPSBkaW9fYmxvY2tzX3Blcl9mc19ibG9jayAtIHRoaXNfY2h1bmtfYmxvY2tzOworCisJdGhpc19jaHVua19ieXRlcyA9IHRoaXNfY2h1bmtfYmxvY2tzIDw8IGRpby0+YmxrYml0czsKKworCXBhZ2UgPSBaRVJPX1BBR0UoZGlvLT5jdXJyX3VzZXJfYWRkcmVzcyk7CisJaWYgKHN1Ym1pdF9wYWdlX3NlY3Rpb24oZGlvLCBwYWdlLCAwLCB0aGlzX2NodW5rX2J5dGVzLCAKKwkJCQlkaW8tPm5leHRfYmxvY2tfZm9yX2lvKSkKKwkJcmV0dXJuOworCisJZGlvLT5uZXh0X2Jsb2NrX2Zvcl9pbyArPSB0aGlzX2NodW5rX2Jsb2NrczsKK30KKworLyoKKyAqIFdhbGsgdGhlIHVzZXIgcGFnZXMsIGFuZCB0aGUgZmlsZSwgbWFwcGluZyBibG9ja3MgdG8gZGlzayBhbmQgZ2VuZXJhdGluZworICogYSBzZXF1ZW5jZSBvZiAocGFnZSxvZmZzZXQsbGVuLGJsb2NrKSBtYXBwaW5ncy4gIFRoZXNlIG1hcHBpbmdzIGFyZSBpbmplY3RlZAorICogaW50byBzdWJtaXRfcGFnZV9zZWN0aW9uKCksIHdoaWNoIHRha2VzIGNhcmUgb2YgdGhlIG5leHQgc3RhZ2Ugb2Ygc3VibWlzc2lvbgorICoKKyAqIERpcmVjdCBJTyBhZ2FpbnN0IGEgYmxvY2tkZXYgaXMgZGlmZmVyZW50IGZyb20gYSBmaWxlLiAgQmVjYXVzZSB3ZSBjYW4KKyAqIGhhcHBpbHkgcGVyZm9ybSBwYWdlLXNpemVkIGJ1dCA1MTItYnl0ZSBhbGlnbmVkIElPcy4gIEl0IGlzIGltcG9ydGFudCB0aGF0CisgKiBibG9ja2RldiBJTyBiZSBhYmxlIHRvIGhhdmUgZmluZSBhbGlnbm1lbnQgYW5kIGxhcmdlIHNpemVzLgorICoKKyAqIFNvIHdoYXQgd2UgZG8gaXMgdG8gcGVybWl0IHRoZSAtPmdldF9ibG9ja3MgZnVuY3Rpb24gdG8gcG9wdWxhdGUgYmguYl9zaXplCisgKiB3aXRoIHRoZSBzaXplIG9mIElPIHdoaWNoIGlzIHBlcm1pdHRlZCBhdCB0aGlzIG9mZnNldCBhbmQgdGhpcyBpX2Jsa2JpdHMuCisgKgorICogRm9yIGJlc3QgcmVzdWx0cywgdGhlIGJsb2NrZGV2IHNob3VsZCBiZSBzZXQgdXAgd2l0aCA1MTItYnl0ZSBpX2Jsa2JpdHMgYW5kCisgKiBpdCBzaG91bGQgc2V0IGJfc2l6ZSB0byBQQUdFX1NJWkUgb3IgbW9yZSBpbnNpZGUgZ2V0X2Jsb2NrcygpLiAgVGhpcyBnaXZlcworICogZmluZSBhbGlnbm1lbnQgYnV0IHN0aWxsIGFsbG93cyB0aGlzIGZ1bmN0aW9uIHRvIHdvcmsgaW4gUEFHRV9TSVpFIHVuaXRzLgorICovCitzdGF0aWMgaW50IGRvX2RpcmVjdF9JTyhzdHJ1Y3QgZGlvICpkaW8pCit7CisJY29uc3QgdW5zaWduZWQgYmxrYml0cyA9IGRpby0+YmxrYml0czsKKwljb25zdCB1bnNpZ25lZCBibG9ja3NfcGVyX3BhZ2UgPSBQQUdFX1NJWkUgPj4gYmxrYml0czsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBibG9ja19pbl9wYWdlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqbWFwX2JoID0gJmRpby0+bWFwX2JoOworCWludCByZXQgPSAwOworCisJLyogVGhlIEkvTyBjYW4gc3RhcnQgYXQgYW55IGJsb2NrIG9mZnNldCB3aXRoaW4gdGhlIGZpcnN0IHBhZ2UgKi8KKwlibG9ja19pbl9wYWdlID0gZGlvLT5maXJzdF9ibG9ja19pbl9wYWdlOworCisJd2hpbGUgKGRpby0+YmxvY2tfaW5fZmlsZSA8IGRpby0+ZmluYWxfYmxvY2tfaW5fcmVxdWVzdCkgeworCQlwYWdlID0gZGlvX2dldF9wYWdlKGRpbyk7CisJCWlmIChJU19FUlIocGFnZSkpIHsKKwkJCXJldCA9IFBUUl9FUlIocGFnZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXdoaWxlIChibG9ja19pbl9wYWdlIDwgYmxvY2tzX3Blcl9wYWdlKSB7CisJCQl1bnNpZ25lZCBvZmZzZXRfaW5fcGFnZSA9IGJsb2NrX2luX3BhZ2UgPDwgYmxrYml0czsKKwkJCXVuc2lnbmVkIHRoaXNfY2h1bmtfYnl0ZXM7CS8qICMgb2YgYnl0ZXMgbWFwcGVkICovCisJCQl1bnNpZ25lZCB0aGlzX2NodW5rX2Jsb2NrczsJLyogIyBvZiBibG9ja3MgKi8KKwkJCXVuc2lnbmVkIHU7CisKKwkJCWlmIChkaW8tPmJsb2Nrc19hdmFpbGFibGUgPT0gMCkgeworCQkJCS8qCisJCQkJICogTmVlZCB0byBnbyBhbmQgbWFwIHNvbWUgbW9yZSBkaXNrCisJCQkJICovCisJCQkJdW5zaWduZWQgbG9uZyBibGttYXNrOworCQkJCXVuc2lnbmVkIGxvbmcgZGlvX3JlbWFpbmRlcjsKKworCQkJCXJldCA9IGdldF9tb3JlX2Jsb2NrcyhkaW8pOworCQkJCWlmIChyZXQpIHsKKwkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJaWYgKCFidWZmZXJfbWFwcGVkKG1hcF9iaCkpCisJCQkJCWdvdG8gZG9faG9sZXM7CisKKwkJCQlkaW8tPmJsb2Nrc19hdmFpbGFibGUgPQorCQkJCQkJbWFwX2JoLT5iX3NpemUgPj4gZGlvLT5ibGtiaXRzOworCQkJCWRpby0+bmV4dF9ibG9ja19mb3JfaW8gPQorCQkJCQltYXBfYmgtPmJfYmxvY2tuciA8PCBkaW8tPmJsa2ZhY3RvcjsKKwkJCQlpZiAoYnVmZmVyX25ldyhtYXBfYmgpKQorCQkJCQljbGVhbl9ibG9ja2Rldl9hbGlhc2VzKGRpbyk7CisKKwkJCQlpZiAoIWRpby0+YmxrZmFjdG9yKQorCQkJCQlnb3RvIGRvX2hvbGVzOworCisJCQkJYmxrbWFzayA9ICgxIDw8IGRpby0+YmxrZmFjdG9yKSAtIDE7CisJCQkJZGlvX3JlbWFpbmRlciA9IChkaW8tPmJsb2NrX2luX2ZpbGUgJiBibGttYXNrKTsKKworCQkJCS8qCisJCQkJICogSWYgd2UgYXJlIGF0IHRoZSBzdGFydCBvZiBJTyBhbmQgdGhhdCBJTworCQkJCSAqIHN0YXJ0cyBwYXJ0d2F5IGludG8gYSBmcy1ibG9jaywKKwkJCQkgKiBkaW9fcmVtYWluZGVyIHdpbGwgYmUgbm9uLXplcm8uICBJZiB0aGUgSU8KKwkJCQkgKiBpcyBhIHJlYWQgdGhlbiB3ZSBjYW4gc2ltcGx5IGFkdmFuY2UgdGhlIElPCisJCQkJICogY3Vyc29yIHRvIHRoZSBmaXJzdCBibG9jayB3aGljaCBpcyB0byBiZQorCQkJCSAqIHJlYWQuICBCdXQgaWYgdGhlIElPIGlzIGEgd3JpdGUgYW5kIHRoZQorCQkJCSAqIGJsb2NrIHdhcyBuZXdseSBhbGxvY2F0ZWQgd2UgY2Fubm90IGRvIHRoYXQ7CisJCQkJICogdGhlIHN0YXJ0IG9mIHRoZSBmcyBibG9jayBtdXN0IGJlIHplcm9lZCBvdXQKKwkJCQkgKiBvbi1kaXNrCisJCQkJICovCisJCQkJaWYgKCFidWZmZXJfbmV3KG1hcF9iaCkpCisJCQkJCWRpby0+bmV4dF9ibG9ja19mb3JfaW8gKz0gZGlvX3JlbWFpbmRlcjsKKwkJCQlkaW8tPmJsb2Nrc19hdmFpbGFibGUgLT0gZGlvX3JlbWFpbmRlcjsKKwkJCX0KK2RvX2hvbGVzOgorCQkJLyogSGFuZGxlIGhvbGVzICovCisJCQlpZiAoIWJ1ZmZlcl9tYXBwZWQobWFwX2JoKSkgeworCQkJCWNoYXIgKmthZGRyOworCisJCQkJLyogQUtQTTogZWFyZ2gsIC1FTk9UQkxLIGlzIGEgaGFjayAqLworCQkJCWlmIChkaW8tPnJ3ID09IFdSSVRFKSB7CisJCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCQkJcmV0dXJuIC1FTk9UQkxLOworCQkJCX0KKworCQkJCWlmIChkaW8tPmJsb2NrX2luX2ZpbGUgPj0KKwkJCQkJaV9zaXplX3JlYWQoZGlvLT5pbm9kZSk+PmJsa2JpdHMpIHsKKwkJCQkJLyogV2UgaGl0IGVvZiAqLworCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJCQltZW1zZXQoa2FkZHIgKyAoYmxvY2tfaW5fcGFnZSA8PCBibGtiaXRzKSwKKwkJCQkJCTAsIDEgPDwgYmxrYml0cyk7CisJCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQkJCWRpby0+YmxvY2tfaW5fZmlsZSsrOworCQkJCWJsb2NrX2luX3BhZ2UrKzsKKwkJCQlnb3RvIG5leHRfYmxvY2s7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiB3ZSdyZSBwZXJmb3JtaW5nIElPIHdoaWNoIGhhcyBhbiBhbGlnbm1lbnQgd2hpY2gKKwkJCSAqIGlzIGZpbmVyIHRoYW4gdGhlIHVuZGVybHlpbmcgZnMsIGdvIGNoZWNrIHRvIHNlZSBpZgorCQkJICogd2UgbXVzdCB6ZXJvIG91dCB0aGUgc3RhcnQgb2YgdGhpcyBibG9jay4KKwkJCSAqLworCQkJaWYgKHVubGlrZWx5KGRpby0+YmxrZmFjdG9yICYmICFkaW8tPnN0YXJ0X3plcm9fZG9uZSkpCisJCQkJZGlvX3plcm9fYmxvY2soZGlvLCAwKTsKKworCQkJLyoKKwkJCSAqIFdvcmsgb3V0LCBpbiB0aGlzX2NodW5rX2Jsb2NrcywgaG93IG11Y2ggZGlzayB3ZQorCQkJICogY2FuIGFkZCB0byB0aGlzIHBhZ2UKKwkJCSAqLworCQkJdGhpc19jaHVua19ibG9ja3MgPSBkaW8tPmJsb2Nrc19hdmFpbGFibGU7CisJCQl1ID0gKFBBR0VfU0laRSAtIG9mZnNldF9pbl9wYWdlKSA+PiBibGtiaXRzOworCQkJaWYgKHRoaXNfY2h1bmtfYmxvY2tzID4gdSkKKwkJCQl0aGlzX2NodW5rX2Jsb2NrcyA9IHU7CisJCQl1ID0gZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0IC0gZGlvLT5ibG9ja19pbl9maWxlOworCQkJaWYgKHRoaXNfY2h1bmtfYmxvY2tzID4gdSkKKwkJCQl0aGlzX2NodW5rX2Jsb2NrcyA9IHU7CisJCQl0aGlzX2NodW5rX2J5dGVzID0gdGhpc19jaHVua19ibG9ja3MgPDwgYmxrYml0czsKKwkJCUJVR19PTih0aGlzX2NodW5rX2J5dGVzID09IDApOworCisJCQlkaW8tPmJvdW5kYXJ5ID0gYnVmZmVyX2JvdW5kYXJ5KG1hcF9iaCk7CisJCQlyZXQgPSBzdWJtaXRfcGFnZV9zZWN0aW9uKGRpbywgcGFnZSwgb2Zmc2V0X2luX3BhZ2UsCisJCQkJdGhpc19jaHVua19ieXRlcywgZGlvLT5uZXh0X2Jsb2NrX2Zvcl9pbyk7CisJCQlpZiAocmV0KSB7CisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJZGlvLT5uZXh0X2Jsb2NrX2Zvcl9pbyArPSB0aGlzX2NodW5rX2Jsb2NrczsKKworCQkJZGlvLT5ibG9ja19pbl9maWxlICs9IHRoaXNfY2h1bmtfYmxvY2tzOworCQkJYmxvY2tfaW5fcGFnZSArPSB0aGlzX2NodW5rX2Jsb2NrczsKKwkJCWRpby0+YmxvY2tzX2F2YWlsYWJsZSAtPSB0aGlzX2NodW5rX2Jsb2NrczsKK25leHRfYmxvY2s6CisJCQlpZiAoZGlvLT5ibG9ja19pbl9maWxlID4gZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0KQorCQkJCUJVRygpOworCQkJaWYgKGRpby0+YmxvY2tfaW5fZmlsZSA9PSBkaW8tPmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QpCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBEcm9wIHRoZSByZWYgd2hpY2ggd2FzIHRha2VuIGluIGdldF91c2VyX3BhZ2VzKCkgKi8KKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQlibG9ja19pbl9wYWdlID0gMDsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlbGVhc2VzIGJvdGggaV9zZW0gYW5kIGlfYWxsb2Nfc2VtCisgKi8KK3N0YXRpYyBzc2l6ZV90CitkaXJlY3RfaW9fd29ya2VyKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCAKKwljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzLCAKKwl1bnNpZ25lZCBibGtiaXRzLCBnZXRfYmxvY2tzX3QgZ2V0X2Jsb2NrcywgZGlvX2lvZG9uZV90IGVuZF9pbywKKwlzdHJ1Y3QgZGlvICpkaW8pCit7CisJdW5zaWduZWQgbG9uZyB1c2VyX2FkZHI7IAorCWludCBzZWc7CisJc3NpemVfdCByZXQgPSAwOworCXNzaXplX3QgcmV0MjsKKwlzaXplX3QgYnl0ZXM7CisKKwlkaW8tPmJpbyA9IE5VTEw7CisJZGlvLT5pbm9kZSA9IGlub2RlOworCWRpby0+cncgPSBydzsKKwlkaW8tPmJsa2JpdHMgPSBibGtiaXRzOworCWRpby0+YmxrZmFjdG9yID0gaW5vZGUtPmlfYmxrYml0cyAtIGJsa2JpdHM7CisJZGlvLT5zdGFydF96ZXJvX2RvbmUgPSAwOworCWRpby0+c2l6ZSA9IDA7CisJZGlvLT5ibG9ja19pbl9maWxlID0gb2Zmc2V0ID4+IGJsa2JpdHM7CisJZGlvLT5ibG9ja3NfYXZhaWxhYmxlID0gMDsKKwlkaW8tPmN1cl9wYWdlID0gTlVMTDsKKworCWRpby0+Ym91bmRhcnkgPSAwOworCWRpby0+cmVhcF9jb3VudGVyID0gMDsKKwlkaW8tPmdldF9ibG9ja3MgPSBnZXRfYmxvY2tzOworCWRpby0+ZW5kX2lvID0gZW5kX2lvOworCWRpby0+bWFwX2JoLmJfcHJpdmF0ZSA9IE5VTEw7CisJZGlvLT5maW5hbF9ibG9ja19pbl9iaW8gPSAtMTsKKwlkaW8tPm5leHRfYmxvY2tfZm9yX2lvID0gLTE7CisKKwlkaW8tPnBhZ2VfZXJyb3JzID0gMDsKKwlkaW8tPnJlc3VsdCA9IDA7CisJZGlvLT5pb2NiID0gaW9jYjsKKworCS8qCisJICogQklPIGNvbXBsZXRpb24gc3RhdGUuCisJICoKKwkgKiAtPmJpb19jb3VudCBzdGFydHMgb3V0IGF0IG9uZSwgYW5kIHdlIGRlY3JlbWVudCBpdCB0byB6ZXJvIGFmdGVyIGFsbAorCSAqIEJJT3MgYXJlIHN1Ym1pdHRlZC4gIFRoaXMgdG8gYXZvaWQgdGhlIHNpdHVhdGlvbiB3aGVyZSBhIHJlYWxseSBmYXN0CisJICogKG9yIHN5bmNocm9ub3VzKSBkZXZpY2UgY291bGQgdGFrZSB0aGUgY291bnQgdG8gemVybyB3aGlsZSB3ZSdyZQorCSAqIHN0aWxsIHN1Ym1pdHRpbmcgQklPcy4KKwkgKi8KKwlkaW8tPmJpb19jb3VudCA9IDE7CisJZGlvLT5iaW9zX2luX2ZsaWdodCA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJmRpby0+YmlvX2xvY2spOworCWRpby0+YmlvX2xpc3QgPSBOVUxMOworCWRpby0+d2FpdGVyID0gTlVMTDsKKworCS8qCisJICogSW4gY2FzZSBvZiBub24tYWxpZ25lZCBidWZmZXJzLCB3ZSBtYXkgbmVlZCAyIG1vcmUKKwkgKiBwYWdlcyBzaW5jZSB3ZSBuZWVkIHRvIHplcm8gb3V0IGZpcnN0IGFuZCBsYXN0IGJsb2NrLgorCSAqLworCWlmICh1bmxpa2VseShkaW8tPmJsa2ZhY3RvcikpCisJCWRpby0+cGFnZXNfaW5faW8gPSAyOworCWVsc2UKKwkJZGlvLT5wYWdlc19pbl9pbyA9IDA7CisKKwlmb3IgKHNlZyA9IDA7IHNlZyA8IG5yX3NlZ3M7IHNlZysrKSB7CisJCXVzZXJfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvdltzZWddLmlvdl9iYXNlOworCQlkaW8tPnBhZ2VzX2luX2lvICs9CisJCQkoKHVzZXJfYWRkcitpb3Zbc2VnXS5pb3ZfbGVuICtQQUdFX1NJWkUtMSkvUEFHRV9TSVpFCisJCQkJLSB1c2VyX2FkZHIvUEFHRV9TSVpFKTsKKwl9CisKKwlmb3IgKHNlZyA9IDA7IHNlZyA8IG5yX3NlZ3M7IHNlZysrKSB7CisJCXVzZXJfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvdltzZWddLmlvdl9iYXNlOworCQlkaW8tPnNpemUgKz0gYnl0ZXMgPSBpb3Zbc2VnXS5pb3ZfbGVuOworCisJCS8qIEluZGV4IGludG8gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGZpcnN0IGJsb2NrICovCisJCWRpby0+Zmlyc3RfYmxvY2tfaW5fcGFnZSA9ICh1c2VyX2FkZHIgJiB+UEFHRV9NQVNLKSA+PiBibGtiaXRzOworCQlkaW8tPmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QgPSBkaW8tPmJsb2NrX2luX2ZpbGUgKworCQkJCQkJKGJ5dGVzID4+IGJsa2JpdHMpOworCQkvKiBQYWdlIGZldGNoaW5nIHN0YXRlICovCisJCWRpby0+aGVhZCA9IDA7CisJCWRpby0+dGFpbCA9IDA7CisJCWRpby0+Y3Vycl9wYWdlID0gMDsKKworCQlkaW8tPnRvdGFsX3BhZ2VzID0gMDsKKwkJaWYgKHVzZXJfYWRkciAmIChQQUdFX1NJWkUtMSkpIHsKKwkJCWRpby0+dG90YWxfcGFnZXMrKzsKKwkJCWJ5dGVzIC09IFBBR0VfU0laRSAtICh1c2VyX2FkZHIgJiAoUEFHRV9TSVpFIC0gMSkpOworCQl9CisJCWRpby0+dG90YWxfcGFnZXMgKz0gKGJ5dGVzICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CisJCWRpby0+Y3Vycl91c2VyX2FkZHJlc3MgPSB1c2VyX2FkZHI7CisJCisJCXJldCA9IGRvX2RpcmVjdF9JTyhkaW8pOworCisJCWRpby0+cmVzdWx0ICs9IGlvdltzZWddLmlvdl9sZW4gLQorCQkJKChkaW8tPmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QgLSBkaW8tPmJsb2NrX2luX2ZpbGUpIDw8CisJCQkJCWJsa2JpdHMpOworCisJCWlmIChyZXQpIHsKKwkJCWRpb19jbGVhbnVwKGRpbyk7CisJCQlicmVhazsKKwkJfQorCX0gLyogZW5kIGlvdmVjIGxvb3AgKi8KKworCWlmIChyZXQgPT0gLUVOT1RCTEsgJiYgcncgPT0gV1JJVEUpIHsKKwkJLyoKKwkJICogVGhlIHJlbWFpbmluZyBwYXJ0IG9mIHRoZSByZXF1ZXN0IHdpbGwgYmUKKwkJICogYmUgaGFuZGxlZCBieSBidWZmZXJlZCBJL08gd2hlbiB3ZSByZXR1cm4KKwkJICovCisJCXJldCA9IDA7CisJfQorCS8qCisJICogVGhlcmUgbWF5IGJlIHNvbWUgdW53cml0dGVuIGRpc2sgYXQgdGhlIGVuZCBvZiBhIHBhcnQtd3JpdHRlbgorCSAqIGZzLWJsb2NrLXNpemVkIGJsb2NrLiAgR28gemVybyB0aGF0IG5vdy4KKwkgKi8KKwlkaW9femVyb19ibG9jayhkaW8sIDEpOworCisJaWYgKGRpby0+Y3VyX3BhZ2UpIHsKKwkJcmV0MiA9IGRpb19zZW5kX2N1cl9wYWdlKGRpbyk7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IHJldDI7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShkaW8tPmN1cl9wYWdlKTsKKwkJZGlvLT5jdXJfcGFnZSA9IE5VTEw7CisJfQorCWlmIChkaW8tPmJpbykKKwkJZGlvX2Jpb19zdWJtaXQoZGlvKTsKKworCS8qCisJICogSXQgaXMgcG9zc2libGUgdGhhdCwgd2UgcmV0dXJuIHNob3J0IElPIGR1ZSB0byBlbmQgb2YgZmlsZS4KKwkgKiBJbiB0aGF0IGNhc2UsIHdlIG5lZWQgdG8gcmVsZWFzZSBhbGwgdGhlIHBhZ2VzIHdlIGdvdCBob2xkIG9uLgorCSAqLworCWRpb19jbGVhbnVwKGRpbyk7CisKKwkvKgorCSAqIEFsbCBibG9jayBsb29rdXBzIGhhdmUgYmVlbiBwZXJmb3JtZWQuIEZvciBSRUFEIHJlcXVlc3RzCisJICogd2UgY2FuIGxldCBpX3NlbSBnbyBub3cgdGhhdCBpdHMgYWNoaWV2ZWQgaXRzIHB1cnBvc2UKKwkgKiBvZiBwcm90ZWN0aW5nIHVzIGZyb20gbG9va2luZyB1cCB1bmluaXRpYWxpemVkIGJsb2Nrcy4KKwkgKi8KKwlpZiAoKHJ3ID09IFJFQUQpICYmIChkaW8tPmxvY2tfdHlwZSA9PSBESU9fTE9DS0lORykpCisJCXVwKCZkaW8tPmlub2RlLT5pX3NlbSk7CisKKwkvKgorCSAqIE9LLCBhbGwgQklPcyBhcmUgc3VibWl0dGVkLCBzbyB3ZSBjYW4gZGVjcmVtZW50IGJpb19jb3VudCB0byB0cnVseQorCSAqIHJlZmxlY3QgdGhlIG51bWJlciBvZiB0by1iZS1wcm9jZXNzZWQgQklPcy4KKwkgKi8KKwlpZiAoZGlvLT5pc19hc3luYykgeworCQlpbnQgc2hvdWxkX3dhaXQgPSAwOworCisJCWlmIChkaW8tPnJlc3VsdCA8IGRpby0+c2l6ZSAmJiBydyA9PSBXUklURSkgeworCQkJZGlvLT53YWl0ZXIgPSBjdXJyZW50OworCQkJc2hvdWxkX3dhaXQgPSAxOworCQl9CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IGRpby0+cmVzdWx0OworCQlmaW5pc2hlZF9vbmVfYmlvKGRpbyk7CQkvKiBUaGlzIGNhbiBmcmVlIHRoZSBkaW8gKi8KKwkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKGlub2RlLT5pX21hcHBpbmcpOworCQlpZiAoc2hvdWxkX3dhaXQpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkvKgorCQkJICogV2FpdCBmb3IgYWxyZWFkeSBpc3N1ZWQgSS9PIHRvIGRyYWluIG91dCBhbmQKKwkJCSAqIHJlbGVhc2UgaXRzIHJlZmVyZW5jZXMgdG8gdXNlci1zcGFjZSBwYWdlcworCQkJICogYmVmb3JlIHJldHVybmluZyB0byBmYWxsYmFjayBvbiBidWZmZXJlZCBJL08KKwkJCSAqLworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGlvLT5iaW9fbG9jaywgZmxhZ3MpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJd2hpbGUgKGRpby0+YmlvX2NvdW50KSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGlvLT5iaW9fbG9jaywgZmxhZ3MpOworCQkJCWlvX3NjaGVkdWxlKCk7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJa2ZyZWUoZGlvKTsKKwkJfQorCX0gZWxzZSB7CisJCXNzaXplX3QgdHJhbnNmZXJyZWQgPSAwOworCisJCWZpbmlzaGVkX29uZV9iaW8oZGlvKTsKKwkJcmV0MiA9IGRpb19hd2FpdF9jb21wbGV0aW9uKGRpbyk7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IHJldDI7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IGRpby0+cGFnZV9lcnJvcnM7CisJCWlmIChkaW8tPnJlc3VsdCkgeworCQkJbG9mZl90IGlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKworCQkJdHJhbnNmZXJyZWQgPSBkaW8tPnJlc3VsdDsKKwkJCS8qCisJCQkgKiBBZGp1c3QgdGhlIHJldHVybiB2YWx1ZSBpZiB0aGUgcmVhZCBjcm9zc2VkIGEKKwkJCSAqIG5vbi1ibG9jay1hbGlnbmVkIEVPRi4KKwkJCSAqLworCQkJaWYgKHJ3ID09IFJFQUQgJiYgKG9mZnNldCArIHRyYW5zZmVycmVkID4gaV9zaXplKSkKKwkJCQl0cmFuc2ZlcnJlZCA9IGlfc2l6ZSAtIG9mZnNldDsKKwkJfQorCQlkaW9fY29tcGxldGUoZGlvLCBvZmZzZXQsIHRyYW5zZmVycmVkKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcmV0ID0gdHJhbnNmZXJyZWQ7CisKKwkJLyogV2UgY291bGQgaGF2ZSBhbHNvIGNvbWUgaGVyZSBvbiBhbiBBSU8gZmlsZSBleHRlbmQgKi8KKwkJaWYgKCFpc19zeW5jX2tpb2NiKGlvY2IpICYmIHJ3ID09IFdSSVRFICYmCisJCSAgICByZXQgPj0gMCAmJiBkaW8tPnJlc3VsdCA9PSBkaW8tPnNpemUpCisJCQkvKgorCQkJICogRm9yIEFJTyB3cml0ZXMgd2hlcmUgd2UgaGF2ZSBjb21wbGV0ZWQgdGhlCisJCQkgKiBpL28sIHdlIGhhdmUgdG8gbWFyayB0aGUgdGhlIGFpbyBjb21wbGV0ZS4KKwkJCSAqLworCQkJYWlvX2NvbXBsZXRlKGlvY2IsIHJldCwgMCk7CisJCWtmcmVlKGRpbyk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGlzIGlzIGEgbGlicmFyeSBmdW5jdGlvbiBmb3IgdXNlIGJ5IGZpbGVzeXN0ZW0gZHJpdmVycy4KKyAqIFRoZSBsb2NraW5nIHJ1bGVzIGFyZSBnb3Zlcm5lZCBieSB0aGUgZGlvX2xvY2tfdHlwZSBwYXJhbWV0ZXIuCisgKgorICogRElPX05PX0xPQ0tJTkcgKG5vIGxvY2tpbmcsIGZvciByYXcgYmxvY2sgZGV2aWNlIGFjY2VzcykKKyAqIEZvciB3cml0ZXMsIGlfc2VtIGlzIG5vdCBoZWxkIG9uIGVudHJ5OyBpdCBpcyBuZXZlciB0YWtlbi4KKyAqCisgKiBESU9fTE9DS0lORyAoc2ltcGxlIGxvY2tpbmcgZm9yIHJlZ3VsYXIgZmlsZXMpCisgKiBGb3Igd3JpdGVzIHdlIGFyZSBjYWxsZWQgdW5kZXIgaV9zZW0gYW5kIHJldHVybiB3aXRoIGlfc2VtIGhlbGQsIGV2ZW4gdGhvdWdoCisgKiBpdCBpcyBpbnRlcm5hbGx5IGRyb3BwZWQuCisgKiBGb3IgcmVhZHMsIGlfc2VtIGlzIG5vdCBoZWxkIG9uIGVudHJ5LCBidXQgaXQgaXMgdGFrZW4gYW5kIGRyb3BwZWQgYmVmb3JlCisgKiByZXR1cm5pbmcuCisgKgorICogRElPX09XTl9MT0NLSU5HIChmaWxlc3lzdGVtIHByb3ZpZGVzIHN5bmNocm9uaXNhdGlvbiBhbmQgaGFuZGxpbmcgb2YKKyAqCXVuaW5pdGlhbGlzZWQgZGF0YSwgYWxsb3dpbmcgcGFyYWxsZWwgZGlyZWN0IHJlYWRlcnMgYW5kIHdyaXRlcnMpCisgKiBGb3Igd3JpdGVzIHdlIGFyZSBjYWxsZWQgd2l0aG91dCBpX3NlbSwgcmV0dXJuIHdpdGhvdXQgaXQsIG5ldmVyIHRvdWNoIGl0LgorICogRm9yIHJlYWRzLCBpX3NlbSBpcyBoZWxkIG9uIGVudHJ5IGFuZCB3aWxsIGJlIHJlbGVhc2VkIGJlZm9yZSByZXR1cm5pbmcuCisgKgorICogQWRkaXRpb25hbCBpX2FsbG9jX3NlbSBsb2NraW5nIHJlcXVpcmVtZW50cyBkZXNjcmliZWQgaW5saW5lIGJlbG93LgorICovCitzc2l6ZV90CitfX2Jsb2NrZGV2X2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlub2RlICppbm9kZSwKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwgCisJdW5zaWduZWQgbG9uZyBucl9zZWdzLCBnZXRfYmxvY2tzX3QgZ2V0X2Jsb2NrcywgZGlvX2lvZG9uZV90IGVuZF9pbywKKwlpbnQgZGlvX2xvY2tfdHlwZSkKK3sKKwlpbnQgc2VnOworCXNpemVfdCBzaXplOworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl1bnNpZ25lZCBibGtiaXRzID0gaW5vZGUtPmlfYmxrYml0czsKKwl1bnNpZ25lZCBiZGV2X2Jsa2JpdHMgPSAwOworCXVuc2lnbmVkIGJsb2Nrc2l6ZV9tYXNrID0gKDEgPDwgYmxrYml0cykgLSAxOworCXNzaXplX3QgcmV0dmFsID0gLUVJTlZBTDsKKwlsb2ZmX3QgZW5kID0gb2Zmc2V0OworCXN0cnVjdCBkaW8gKmRpbzsKKwlpbnQgcmVhZGVyX3dpdGhfaXNlbSA9IChydyA9PSBSRUFEICYmIGRpb19sb2NrX3R5cGUgPT0gRElPX09XTl9MT0NLSU5HKTsKKworCWlmIChydyAmIFdSSVRFKQorCQljdXJyZW50LT5mbGFncyB8PSBQRl9TWU5DV1JJVEU7CisKKwlpZiAoYmRldikKKwkJYmRldl9ibGtiaXRzID0gYmxrc2l6ZV9iaXRzKGJkZXZfaGFyZHNlY3Rfc2l6ZShiZGV2KSk7CisKKwlpZiAob2Zmc2V0ICYgYmxvY2tzaXplX21hc2spIHsKKwkJaWYgKGJkZXYpCisJCQkgYmxrYml0cyA9IGJkZXZfYmxrYml0czsKKwkJYmxvY2tzaXplX21hc2sgPSAoMSA8PCBibGtiaXRzKSAtIDE7CisJCWlmIChvZmZzZXQgJiBibG9ja3NpemVfbWFzaykKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIENoZWNrIHRoZSBtZW1vcnkgYWxpZ25tZW50LiAgQmxvY2tzIGNhbm5vdCBzdHJhZGRsZSBwYWdlcyAqLworCWZvciAoc2VnID0gMDsgc2VnIDwgbnJfc2Vnczsgc2VnKyspIHsKKwkJYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvdltzZWddLmlvdl9iYXNlOworCQlzaXplID0gaW92W3NlZ10uaW92X2xlbjsKKwkJZW5kICs9IHNpemU7CisJCWlmICgoYWRkciAmIGJsb2Nrc2l6ZV9tYXNrKSB8fCAoc2l6ZSAmIGJsb2Nrc2l6ZV9tYXNrKSkgIHsKKwkJCWlmIChiZGV2KQorCQkJCSBibGtiaXRzID0gYmRldl9ibGtiaXRzOworCQkJYmxvY2tzaXplX21hc2sgPSAoMSA8PCBibGtiaXRzKSAtIDE7CisJCQlpZiAoKGFkZHIgJiBibG9ja3NpemVfbWFzaykgfHwgKHNpemUgJiBibG9ja3NpemVfbWFzaykpICAKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWRpbyA9IGttYWxsb2Moc2l6ZW9mKCpkaW8pLCBHRlBfS0VSTkVMKTsKKwlyZXR2YWwgPSAtRU5PTUVNOworCWlmICghZGlvKQorCQlnb3RvIG91dDsKKworCS8qCisJICogRm9yIGJsb2NrIGRldmljZSBhY2Nlc3MgRElPX05PX0xPQ0tJTkcgaXMgdXNlZCwKKwkgKgluZWl0aGVyIHJlYWRlcnMgbm9yIHdyaXRlcnMgZG8gYW55IGxvY2tpbmcgYXQgYWxsCisJICogRm9yIHJlZ3VsYXIgZmlsZXMgdXNpbmcgRElPX0xPQ0tJTkcsCisJICoJcmVhZGVycyBuZWVkIHRvIGdyYWIgaV9zZW0gYW5kIGlfYWxsb2Nfc2VtCisJICoJd3JpdGVycyBuZWVkIHRvIGdyYWIgaV9hbGxvY19zZW0gb25seSAoaV9zZW0gaXMgYWxyZWFkeSBoZWxkKQorCSAqIEZvciByZWd1bGFyIGZpbGVzIHVzaW5nIERJT19PV05fTE9DS0lORywKKwkgKgluZWl0aGVyIHJlYWRlcnMgbm9yIHdyaXRlcnMgdGFrZSBhbnkgbG9ja3MgaGVyZQorCSAqCShpX3NlbSBpcyBhbHJlYWR5IGhlbGQgYW5kIHJlbGVhc2UgZm9yIHdyaXRlcnMgaGVyZSkKKwkgKi8KKwlkaW8tPmxvY2tfdHlwZSA9IGRpb19sb2NrX3R5cGU7CisJaWYgKGRpb19sb2NrX3R5cGUgIT0gRElPX05PX0xPQ0tJTkcpIHsKKwkJLyogd2F0Y2ggb3V0IGZvciBhIDAgbGVuIGlvIGZyb20gYSB0cmlja3N5IGZzICovCisJCWlmIChydyA9PSBSRUFEICYmIGVuZCA+IG9mZnNldCkgeworCQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisKKwkJCW1hcHBpbmcgPSBpb2NiLT5raV9maWxwLT5mX21hcHBpbmc7CisJCQlpZiAoZGlvX2xvY2tfdHlwZSAhPSBESU9fT1dOX0xPQ0tJTkcpIHsKKwkJCQlkb3duKCZpbm9kZS0+aV9zZW0pOworCQkJCXJlYWRlcl93aXRoX2lzZW0gPSAxOworCQkJfQorCisJCQlyZXR2YWwgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKG1hcHBpbmcsIG9mZnNldCwKKwkJCQkJCQkgICAgICBlbmQgLSAxKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlrZnJlZShkaW8pOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlpZiAoZGlvX2xvY2tfdHlwZSA9PSBESU9fT1dOX0xPQ0tJTkcpIHsKKwkJCQl1cCgmaW5vZGUtPmlfc2VtKTsKKwkJCQlyZWFkZXJfd2l0aF9pc2VtID0gMDsKKwkJCX0KKwkJfQorCisJCWlmIChkaW9fbG9ja190eXBlID09IERJT19MT0NLSU5HKQorCQkJZG93bl9yZWFkKCZpbm9kZS0+aV9hbGxvY19zZW0pOworCX0KKworCS8qCisJICogRm9yIGZpbGUgZXh0ZW5kaW5nIHdyaXRlcyB1cGRhdGluZyBpX3NpemUgYmVmb3JlIGRhdGEKKwkgKiB3cml0ZW91dHMgY29tcGxldGUgY2FuIGV4cG9zZSB1bmluaXRpYWxpemVkIGJsb2Nrcy4gU28KKwkgKiBldmVuIGZvciBBSU8sIHdlIG5lZWQgdG8gd2FpdCBmb3IgaS9vIHRvIGNvbXBsZXRlIGJlZm9yZQorCSAqIHJldHVybmluZyBpbiB0aGlzIGNhc2UuCisJICovCisJZGlvLT5pc19hc3luYyA9ICFpc19zeW5jX2tpb2NiKGlvY2IpICYmICEoKHJ3ID09IFdSSVRFKSAmJgorCQkoZW5kID4gaV9zaXplX3JlYWQoaW5vZGUpKSk7CisKKwlyZXR2YWwgPSBkaXJlY3RfaW9fd29ya2VyKHJ3LCBpb2NiLCBpbm9kZSwgaW92LCBvZmZzZXQsCisJCQkJbnJfc2VncywgYmxrYml0cywgZ2V0X2Jsb2NrcywgZW5kX2lvLCBkaW8pOworCisJaWYgKHJ3ID09IFJFQUQgJiYgZGlvX2xvY2tfdHlwZSA9PSBESU9fTE9DS0lORykKKwkJcmVhZGVyX3dpdGhfaXNlbSA9IDA7CisKK291dDoKKwlpZiAocmVhZGVyX3dpdGhfaXNlbSkKKwkJdXAoJmlub2RlLT5pX3NlbSk7CisJaWYgKHJ3ICYgV1JJVEUpCisJCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9TWU5DV1JJVEU7CisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0woX19ibG9ja2Rldl9kaXJlY3RfSU8pOwpkaWZmIC0tZ2l0IGEvZnMvZG5vdGlmeS5jIGIvZnMvZG5vdGlmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYjU0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9kbm90aWZ5LmMKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBEaXJlY3Rvcnkgbm90aWZpY2F0aW9ucyBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEsMjAwMiBTdGVwaGVuIFJvdGh3ZWxsCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Rub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKK2ludCBkaXJfbm90aWZ5X2VuYWJsZSA9IDE7CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmRuX2NhY2hlOworCitzdGF0aWMgdm9pZCByZWRvX2lub2RlX21hc2soc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIG5ld19tYXNrOworCXN0cnVjdCBkbm90aWZ5X3N0cnVjdCAqZG47CisKKwluZXdfbWFzayA9IDA7CisJZm9yIChkbiA9IGlub2RlLT5pX2Rub3RpZnk7IGRuICE9IE5VTEw7IGRuID0gZG4tPmRuX25leHQpCisJCW5ld19tYXNrIHw9IGRuLT5kbl9tYXNrICYgfkROX01VTFRJU0hPVDsKKwlpbm9kZS0+aV9kbm90aWZ5X21hc2sgPSBuZXdfbWFzazsKK30KKwordm9pZCBkbm90aWZ5X2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKQoreworCXN0cnVjdCBkbm90aWZ5X3N0cnVjdCAqZG47CisJc3RydWN0IGRub3RpZnlfc3RydWN0ICoqcHJldjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybjsKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXByZXYgPSAmaW5vZGUtPmlfZG5vdGlmeTsKKwl3aGlsZSAoKGRuID0gKnByZXYpICE9IE5VTEwpIHsKKwkJaWYgKChkbi0+ZG5fb3duZXIgPT0gaWQpICYmIChkbi0+ZG5fZmlscCA9PSBmaWxwKSkgeworCQkJKnByZXYgPSBkbi0+ZG5fbmV4dDsKKwkJCXJlZG9faW5vZGVfbWFzayhpbm9kZSk7CisJCQlrbWVtX2NhY2hlX2ZyZWUoZG5fY2FjaGUsIGRuKTsKKwkJCWJyZWFrOworCQl9CisJCXByZXYgPSAmZG4tPmRuX25leHQ7CisJfQorCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKK30KKworaW50IGZjbnRsX2Rpcm5vdGlmeShpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZG5vdGlmeV9zdHJ1Y3QgKmRuOworCXN0cnVjdCBkbm90aWZ5X3N0cnVjdCAqb2RuOworCXN0cnVjdCBkbm90aWZ5X3N0cnVjdCAqKnByZXY7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlmbF9vd25lcl90IGlkID0gY3VycmVudC0+ZmlsZXM7CisJaW50IGVycm9yID0gMDsKKworCWlmICgoYXJnICYgfkROX01VTFRJU0hPVCkgPT0gMCkgeworCQlkbm90aWZ5X2ZsdXNoKGZpbHAsIGlkKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghZGlyX25vdGlmeV9lbmFibGUpCisJCXJldHVybiAtRUlOVkFMOworCWlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gLUVOT1RESVI7CisJZG4gPSBrbWVtX2NhY2hlX2FsbG9jKGRuX2NhY2hlLCBTTEFCX0tFUk5FTCk7CisJaWYgKGRuID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJcHJldiA9ICZpbm9kZS0+aV9kbm90aWZ5OworCXdoaWxlICgob2RuID0gKnByZXYpICE9IE5VTEwpIHsKKwkJaWYgKChvZG4tPmRuX293bmVyID09IGlkKSAmJiAob2RuLT5kbl9maWxwID09IGZpbHApKSB7CisJCQlvZG4tPmRuX2ZkID0gZmQ7CisJCQlvZG4tPmRuX21hc2sgfD0gYXJnOworCQkJaW5vZGUtPmlfZG5vdGlmeV9tYXNrIHw9IGFyZyAmIH5ETl9NVUxUSVNIT1Q7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCXByZXYgPSAmb2RuLT5kbl9uZXh0OworCX0KKworCWVycm9yID0gZl9zZXRvd24oZmlscCwgY3VycmVudC0+cGlkLCAwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlkbi0+ZG5fbWFzayA9IGFyZzsKKwlkbi0+ZG5fZmQgPSBmZDsKKwlkbi0+ZG5fZmlscCA9IGZpbHA7CisJZG4tPmRuX293bmVyID0gaWQ7CisJaW5vZGUtPmlfZG5vdGlmeV9tYXNrIHw9IGFyZyAmIH5ETl9NVUxUSVNIT1Q7CisJZG4tPmRuX25leHQgPSBpbm9kZS0+aV9kbm90aWZ5OworCWlub2RlLT5pX2Rub3RpZnkgPSBkbjsKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisKKwlpZiAoZmlscC0+Zl9vcCAmJiBmaWxwLT5mX29wLT5kaXJfbm90aWZ5KQorCQlyZXR1cm4gZmlscC0+Zl9vcC0+ZGlyX25vdGlmeShmaWxwLCBhcmcpOworCXJldHVybiAwOworCitvdXRfZnJlZToKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJa21lbV9jYWNoZV9mcmVlKGRuX2NhY2hlLCBkbik7CisJcmV0dXJuIGVycm9yOworfQorCit2b2lkIF9faW5vZGVfZGlyX25vdGlmeShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGV2ZW50KQoreworCXN0cnVjdCBkbm90aWZ5X3N0cnVjdCAqCWRuOworCXN0cnVjdCBkbm90aWZ5X3N0cnVjdCAqKnByZXY7CisJc3RydWN0IGZvd25fc3RydWN0ICoJZm93bjsKKwlpbnQJCQljaGFuZ2VkID0gMDsKKworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJcHJldiA9ICZpbm9kZS0+aV9kbm90aWZ5OworCXdoaWxlICgoZG4gPSAqcHJldikgIT0gTlVMTCkgeworCQlpZiAoKGRuLT5kbl9tYXNrICYgZXZlbnQpID09IDApIHsKKwkJCXByZXYgPSAmZG4tPmRuX25leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQlmb3duID0gJmRuLT5kbl9maWxwLT5mX293bmVyOworCQlzZW5kX3NpZ2lvKGZvd24sIGRuLT5kbl9mZCwgUE9MTF9NU0cpOworCQlpZiAoZG4tPmRuX21hc2sgJiBETl9NVUxUSVNIT1QpCisJCQlwcmV2ID0gJmRuLT5kbl9uZXh0OworCQllbHNlIHsKKwkJCSpwcmV2ID0gZG4tPmRuX25leHQ7CisJCQljaGFuZ2VkID0gMTsKKwkJCWttZW1fY2FjaGVfZnJlZShkbl9jYWNoZSwgZG4pOworCQl9CisJfQorCWlmIChjaGFuZ2VkKQorCQlyZWRvX2lub2RlX21hc2soaW5vZGUpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKK30KKworRVhQT1JUX1NZTUJPTChfX2lub2RlX2Rpcl9ub3RpZnkpOworCisvKgorICogVGhpcyBpcyBob3BlbGVzc2x5IHdyb25nLCBidXQgdW5maXhhYmxlIHdpdGhvdXQgQVBJIGNoYW5nZXMuICBBdAorICogbGVhc3QgaXQgZG9lc24ndCBvb3BzIHRoZSBrZXJuZWwuLi4KKyAqCisgKiBUbyBzYWZlbHkgYWNjZXNzIC0+ZF9wYXJlbnQgd2UgbmVlZCB0byBrZWVwIGRfbW92ZSBhd2F5IGZyb20gaXQuICBVc2UgdGhlCisgKiBkZW50cnkncyBkX2xvY2sgZm9yIHRoaXMuCisgKi8KK3ZvaWQgZG5vdGlmeV9wYXJlbnQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCB1bnNpZ25lZCBsb25nIGV2ZW50KQoreworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKworCWlmICghZGlyX25vdGlmeV9lbmFibGUpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCXBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7CisJaWYgKHBhcmVudC0+ZF9pbm9kZS0+aV9kbm90aWZ5X21hc2sgJiBldmVudCkgeworCQlkZ2V0KHBhcmVudCk7CisJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCV9faW5vZGVfZGlyX25vdGlmeShwYXJlbnQtPmRfaW5vZGUsIGV2ZW50KTsKKwkJZHB1dChwYXJlbnQpOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoZG5vdGlmeV9wYXJlbnQpOworCitzdGF0aWMgaW50IF9faW5pdCBkbm90aWZ5X2luaXQodm9pZCkKK3sKKwlkbl9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJkbm90aWZ5X2NhY2hlIiwKKwkJc2l6ZW9mKHN0cnVjdCBkbm90aWZ5X3N0cnVjdCksIDAsIFNMQUJfUEFOSUMsIE5VTEwsIE5VTEwpOworCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChkbm90aWZ5X2luaXQpCmRpZmYgLS1naXQgYS9mcy9kcXVvdC5jIGIvZnMvZHF1b3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTA0OGUwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZHF1b3QuYwpAQCAtMCwwICsxLDE4NTAgQEAKKy8qCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGlza3F1b3RhIHN5c3RlbSBmb3IgdGhlIExJTlVYIG9wZXJhdGluZyBzeXN0ZW0uIFFVT1RBCisgKiBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgQlNEIHN5c3RlbSBjYWxsIGludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YKKyAqIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBnZW5lcmljIHJvdXRpbmVzCisgKiBjYWxsZWQgYnkgdGhlIGRpZmZlcmVudCBmaWxlc3lzdGVtcyBvbiBhbGxvY2F0aW9uIG9mIGFuIGlub2RlIG9yIGJsb2NrLgorICogVGhlc2Ugcm91dGluZXMgdGFrZSBjYXJlIG9mIHRoZSBhZG1pbmlzdHJhdGlvbiBuZWVkZWQgdG8gaGF2ZSBhIGNvbnNpc3RlbnQKKyAqIGRpc2txdW90YSB0cmFja2luZyBzeXN0ZW0uIFRoZSBpZGVhcyBvZiBib3RoIHVzZXIgYW5kIGdyb3VwIHF1b3RhcyBhcmUgYmFzZWQKKyAqIG9uIHRoZSBNZWxib3VybmUgcXVvdGEgc3lzdGVtIGFzIHVzZWQgb24gQlNEIGRlcml2ZWQgc3lzdGVtcy4gVGhlIGludGVybmFsCisgKiBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBvbmUgb2YgdGhlIHNldmVyYWwgdmFyaWFudHMgb2YgdGhlIExJTlVYCisgKiBpbm9kZS1zdWJzeXN0ZW0gd2l0aCBhZGRlZCBjb21wbGV4aXR5IG9mIHRoZSBkaXNrcXVvdGEgc3lzdGVtLgorICogCisgKiBWZXJzaW9uOiAkSWQ6IGRxdW90LmMsdiA2LjMgMTk5Ni8xMS8xNyAxODozNTozNCBtdncgRXhwIG12dyAkCisgKiAKKyAqIEF1dGhvcjoJTWFyY28gdmFuIFdpZXJpbmdlbiA8bXZ3QHBsYW5ldHMuZWxtLm5ldD4KKyAqCisgKiBGaXhlczogICBEbWl0cnkgR29yb2RjaGFuaW4gPHBnbWRzZ0BpYmkuY29tPiwgMTEgRmViIDk2CisgKgorICoJCVJldmlzZWQgbGlzdCBtYW5hZ2VtZW50IHRvIGF2b2lkIHJhY2VzCisgKgkJLS0gQmlsbCBIYXdlcywgPHdoYXdlc0BzdGFyLm5ldD4sIDkvOTgKKyAqCisgKgkJRml4ZWQgcmFjZXMgaW4gZHF1b3RfdHJhbnNmZXIoKSwgZHFnZXQoKSBhbmQgZHF1b3RfYWxsb2NfLi4uKCkuCisgKgkJQXMgdGhlIGNvbnNlcXVlbmNlIHRoZSBsb2NraW5nIHdhcyBtb3ZlZCBmcm9tIGRxdW90X2RlY3JfLi4uKCksCisgKgkJZHF1b3RfaW5jcl8uLi4oKSB0byBjYWxsaW5nIGZ1bmN0aW9ucy4KKyAqCQlpbnZhbGlkYXRlX2RxdW90cygpIG5vdyB3cml0ZXMgbW9kaWZpZWQgZHF1b3RzLgorICoJCVNlcmlhbGl6ZWQgcXVvdGFfb2ZmKCkgYW5kIHF1b3RhX29uKCkgZm9yIG1vdW50IHBvaW50LgorICoJCUZpeGVkIGEgZmV3IGJ1Z3MgaW4gZ3Jvd19kcXVvdHMoKS4KKyAqCQlGaXhlZCBkZWFkbG9jayBpbiB3cml0ZV9kcXVvdCgpIC0gd2Ugbm8gbG9uZ2VyIGFjY291bnQgcXVvdGFzIG9uCisgKgkJcXVvdGEgZmlsZXMKKyAqCQlyZW1vdmVfZHF1b3RfcmVmKCkgbW92ZWQgdG8gaW5vZGUuYyAtIGl0IG5vdyB0cmF2ZXJzZXMgdGhyb3VnaCBpbm9kZXMKKyAqCQlhZGRfZHF1b3RfcmVmKCkgcmVzdGFydHMgYWZ0ZXIgYmxvY2tpbmcKKyAqCQlBZGRlZCBjaGVjayBmb3IgYm9ndXMgdWlkIGFuZCBmaXhlZCBjaGVjayBmb3IgZ3JvdXAgaW4gcXVvdGFjdGwuCisgKgkJSmFuIEthcmEsIDxqYWNrQHN1c2UuY3o+LCBzcG9uc29yZWQgYnkgU3VTRSBDUiwgMTAtMTEvOTkKKyAqCisgKgkJVXNlZCBzdHJ1Y3QgbGlzdF9oZWFkIGluc3RlYWQgb2Ygb3duIGxpc3Qgc3RydWN0CisgKgkJSW52YWxpZGF0aW9uIG9mIHJlZmVyZW5jZWQgZHF1b3RzIGlzIG5vIGxvbmdlciBwb3NzaWJsZQorICoJCUltcHJvdmVkIGZyZWVfZHF1b3RzIGxpc3QgbWFuYWdlbWVudAorICoJCVF1b3RhIGFuZCBpX2Jsb2NrcyBhcmUgbm93IHVwZGF0ZWQgaW4gb25lIHBsYWNlIHRvIGF2b2lkIHJhY2VzCisgKgkJV2FybmluZ3MgYXJlIG5vdyBkZWxheWVkIHNvIHdlIHdvbid0IGJsb2NrIGluIGNyaXRpY2FsIHNlY3Rpb24KKyAqCQlXcml0ZSB1cGRhdGVkIG5vdCB0byByZXF1aXJlIGRxdW90IGxvY2sKKyAqCQlKYW4gS2FyYSwgPGphY2tAc3VzZS5jej4sIDkvMjAwMAorICoKKyAqCQlBZGRlZCBkeW5hbWljIHF1b3RhIHN0cnVjdHVyZSBhbGxvY2F0aW9uCisgKgkJSmFuIEthcmEgPGphY2tAc3VzZS5jej4gMTIvMjAwMAorICoKKyAqCQlSZXdyaXR0ZW4gcXVvdGEgaW50ZXJmYWNlLiBJbXBsZW1lbnRlZCBuZXcgcXVvdGEgZm9ybWF0IGFuZAorICoJCWZvcm1hdHMgcmVnaXN0ZXJpbmcuCisgKgkJSmFuIEthcmEsIDxqYWNrQHN1c2UuY3o+LCAyMDAxLDIwMDIKKyAqCisgKgkJTmV3IFNNUCBsb2NraW5nLgorICoJCUphbiBLYXJhLCA8amFja0BzdXNlLmN6PiwgMTAvMjAwMgorICoKKyAqCQlBZGRlZCBqb3VybmFsbGVkIHF1b3RhIHN1cHBvcnQsIGZpeCBsb2NrIGludmVyc2lvbiBwcm9ibGVtcworICoJCUphbiBLYXJhLCA8amFja0BzdXNlLmN6PiwgMjAwMywyMDA0CisgKgorICogKEMpIENvcHlyaWdodCAxOTk0IC0gMTk5NyBNYXJjbyB2YW4gV2llcmluZ2VuIAorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgX19EUVVPVF9QQVJBTk9JQQorCisvKgorICogVGhlcmUgYXJlIHR3byBxdW90YSBTTVAgbG9ja3MuIGRxX2xpc3RfbG9jayBwcm90ZWN0cyBhbGwgbGlzdHMgd2l0aCBxdW90YXMKKyAqIGFuZCBxdW90YSBmb3JtYXRzIGFuZCBhbHNvIGRxc3RhdHMgc3RydWN0dXJlIGNvbnRhaW5pbmcgc3RhdGlzdGljcyBhYm91dCB0aGUKKyAqIGxpc3RzLiBkcV9kYXRhX2xvY2sgcHJvdGVjdHMgZGF0YSBmcm9tIGRxX2RxYiBhbmQgYWxzbyBtZW1fZHFpbmZvIHN0cnVjdHVyZXMKKyAqIGFuZCBhbHNvIGd1YXJkcyBjb25zaXN0ZW5jeSBvZiBkcXVvdC0+ZHFfZHFiIHdpdGggaW5vZGUtPmlfYmxvY2tzLCBpX2J5dGVzLgorICogaV9ibG9ja3MgYW5kIGlfYnl0ZXMgdXBkYXRlcyBpdHNlbGYgYXJlIGd1YXJkZWQgYnkgaV9sb2NrIGFjcXVpcmVkIGRpcmVjdGx5CisgKiBpbiBpbm9kZV9hZGRfYnl0ZXMoKSBhbmQgaW5vZGVfc3ViX2J5dGVzKCkuCisgKgorICogVGhlIHNwaW5sb2NrIG9yZGVyaW5nIGlzIGhlbmNlOiBkcV9kYXRhX2xvY2sgPiBkcV9saXN0X2xvY2sgPiBpX2xvY2sKKyAqCisgKiBOb3RlIHRoYXQgc29tZSB0aGluZ3MgKGVnLiBzYiBwb2ludGVyLCB0eXBlLCBpZCkgZG9lc24ndCBjaGFuZ2UgZHVyaW5nCisgKiB0aGUgbGlmZSBvZiB0aGUgZHF1b3Qgc3RydWN0dXJlIGFuZCBzbyBuZWVkbid0IHRvIGJlIHByb3RlY3RlZCBieSBhIGxvY2sKKyAqCisgKiBBbnkgb3BlcmF0aW9uIHdvcmtpbmcgb24gZHF1b3RzIHZpYSBpbm9kZSBwb2ludGVycyBtdXN0IGhvbGQgZHFwdHJfc2VtLiAgSWYKKyAqIG9wZXJhdGlvbiBpcyBqdXN0IHJlYWRpbmcgcG9pbnRlcnMgZnJvbSBpbm9kZSAob3Igbm90IHVzaW5nIHRoZW0gYXQgYWxsKSB0aGUKKyAqIHJlYWQgbG9jayBpcyBlbm91Z2guIElmIHBvaW50ZXJzIGFyZSBhbHRlcmVkIGZ1bmN0aW9uIG11c3QgaG9sZCB3cml0ZSBsb2NrCisgKiAodGhlc2UgbG9ja2luZyBydWxlcyBhbHNvIGFwcGx5IGZvciBTX05PUVVPVEEgZmxhZyBpbiB0aGUgaW5vZGUgLSBub3RlIHRoYXQKKyAqIGZvciBhbHRlcmluZyB0aGUgZmxhZyBpX3NlbSBpcyBhbHNvIG5lZWRlZCkuICBJZiBvcGVyYXRpb24gaXMgaG9sZGluZworICogcmVmZXJlbmNlIHRvIGRxdW90IGluIG90aGVyIHdheSAoZS5nLiBxdW90YWN0bCBvcHMpIGl0IG11c3QgYmUgZ3VhcmRlZCBieQorICogZHFvbm9mZl9zZW0uCisgKiBUaGlzIGxvY2tpbmcgYXNzdXJlcyB0aGF0OgorICogICBhKSB1cGRhdGUvYWNjZXNzIHRvIGRxdW90IHBvaW50ZXJzIGluIGlub2RlIGlzIHNlcmlhbGl6ZWQKKyAqICAgYikgZXZlcnlvbmUgaXMgZ3VhcmRlZCBhZ2FpbnN0IGludmFsaWRhdGVfZHF1b3RzKCkKKyAqCisgKiBFYWNoIGRxdW90IGhhcyBpdHMgZHFfbG9jayBzZW1hcGhvcmUuIExvY2tlZCBkcXVvdHMgbWlnaHQgbm90IGJlIHJlZmVyZW5jZWQKKyAqIGZyb20gaW5vZGVzIChkcXVvdF9hbGxvY19zcGFjZSgpIGFuZCBzdWNoIGRvbid0IGNoZWNrIHRoZSBkcV9sb2NrKS4KKyAqIEN1cnJlbnRseSBkcXVvdCBpcyBsb2NrZWQgb25seSB3aGVuIGl0IGlzIGJlaW5nIHJlYWQgdG8gbWVtb3J5IChvciBzcGFjZSBmb3IKKyAqIGl0IGlzIGJlaW5nIGFsbG9jYXRlZCkgb24gdGhlIGZpcnN0IGRxZ2V0KCkgYW5kIHdoZW4gaXQgaXMgYmVpbmcgcmVsZWFzZWQgb24KKyAqIHRoZSBsYXN0IGRxcHV0KCkuIFRoZSBhbGxvY2F0aW9uIGFuZCByZWxlYXNlIG9wYXJhdGlvbnMgYXJlIHNlcmlhbGl6ZWQgYnkKKyAqIHRoZSBkcV9sb2NrIGFuZCBieSBjaGVja2luZyB0aGUgdXNlIGNvdW50IGluIGRxdW90X3JlbGVhc2UoKS4gIFdyaXRlCisgKiBvcGVyYXRpb25zIG9uIGRxdW90cyBkb24ndCBob2xkIGRxX2xvY2sgYXMgdGhleSBjb3B5IGRhdGEgdW5kZXIgZHFfZGF0YV9sb2NrCisgKiBzcGlubG9jayB0byBpbnRlcm5hbCBidWZmZXJzIGJlZm9yZSB3cml0aW5nLgorICoKKyAqIExvY2sgb3JkZXJpbmcgKGluY2x1ZGluZyByZWxhdGVkIFZGUyBsb2NrcykgaXMgdGhlIGZvbGxvd2luZzoKKyAqICAgaV9zZW0gPiBkcW9ub2ZmX3NlbSA+IGlwcnVuZV9zZW0gPiBqb3VybmFsX2xvY2sgPiBkcXB0cl9zZW0gPgorICogICA+IGRxdW90LT5kcV9sb2NrID4gZHFpb19zZW0KKyAqIGlfc2VtIG9uIHF1b3RhIGZpbGVzIGlzIHNwZWNpYWwgKGl0J3MgYmVsb3cgZHFpb19zZW0pCisgKi8KKworc3RhdGljIERFRklORV9TUElOTE9DSyhkcV9saXN0X2xvY2spOworREVGSU5FX1NQSU5MT0NLKGRxX2RhdGFfbG9jayk7CisKK3N0YXRpYyBjaGFyICpxdW90YXR5cGVzW10gPSBJTklUUUZOQU1FUzsKK3N0YXRpYyBzdHJ1Y3QgcXVvdGFfZm9ybWF0X3R5cGUgKnF1b3RhX2Zvcm1hdHM7CS8qIExpc3Qgb2YgcmVnaXN0ZXJlZCBmb3JtYXRzICovCitzdGF0aWMgc3RydWN0IHF1b3RhX21vZHVsZV9uYW1lIG1vZHVsZV9uYW1lc1tdID0gSU5JVF9RVU9UQV9NT0RVTEVfTkFNRVM7CisKKy8qIFNMQUIgY2FjaGUgZm9yIGRxdW90IHN0cnVjdHVyZXMgKi8KK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmRxdW90X2NhY2hlcDsKKworaW50IHJlZ2lzdGVyX3F1b3RhX2Zvcm1hdChzdHJ1Y3QgcXVvdGFfZm9ybWF0X3R5cGUgKmZtdCkKK3sKKwlzcGluX2xvY2soJmRxX2xpc3RfbG9jayk7CisJZm10LT5xZl9uZXh0ID0gcXVvdGFfZm9ybWF0czsKKwlxdW90YV9mb3JtYXRzID0gZm10OworCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOworCXJldHVybiAwOworfQorCit2b2lkIHVucmVnaXN0ZXJfcXVvdGFfZm9ybWF0KHN0cnVjdCBxdW90YV9mb3JtYXRfdHlwZSAqZm10KQoreworCXN0cnVjdCBxdW90YV9mb3JtYXRfdHlwZSAqKmFjdHFmOworCisJc3Bpbl9sb2NrKCZkcV9saXN0X2xvY2spOworCWZvciAoYWN0cWYgPSAmcXVvdGFfZm9ybWF0czsgKmFjdHFmICYmICphY3RxZiAhPSBmbXQ7IGFjdHFmID0gJigqYWN0cWYpLT5xZl9uZXh0KTsKKwlpZiAoKmFjdHFmKQorCQkqYWN0cWYgPSAoKmFjdHFmKS0+cWZfbmV4dDsKKwlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBxdW90YV9mb3JtYXRfdHlwZSAqZmluZF9xdW90YV9mb3JtYXQoaW50IGlkKQoreworCXN0cnVjdCBxdW90YV9mb3JtYXRfdHlwZSAqYWN0cWY7CisKKwlzcGluX2xvY2soJmRxX2xpc3RfbG9jayk7CisJZm9yIChhY3RxZiA9IHF1b3RhX2Zvcm1hdHM7IGFjdHFmICYmIGFjdHFmLT5xZl9mbXRfaWQgIT0gaWQ7IGFjdHFmID0gYWN0cWYtPnFmX25leHQpOworCWlmICghYWN0cWYgfHwgIXRyeV9tb2R1bGVfZ2V0KGFjdHFmLT5xZl9vd25lcikpIHsKKwkJaW50IHFtOworCisJCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOworCQkKKwkJZm9yIChxbSA9IDA7IG1vZHVsZV9uYW1lc1txbV0ucW1fZm10X2lkICYmIG1vZHVsZV9uYW1lc1txbV0ucW1fZm10X2lkICE9IGlkOyBxbSsrKTsKKwkJaWYgKCFtb2R1bGVfbmFtZXNbcW1dLnFtX2ZtdF9pZCB8fCByZXF1ZXN0X21vZHVsZShtb2R1bGVfbmFtZXNbcW1dLnFtX21vZF9uYW1lKSkKKwkJCXJldHVybiBOVUxMOworCisJCXNwaW5fbG9jaygmZHFfbGlzdF9sb2NrKTsKKwkJZm9yIChhY3RxZiA9IHF1b3RhX2Zvcm1hdHM7IGFjdHFmICYmIGFjdHFmLT5xZl9mbXRfaWQgIT0gaWQ7IGFjdHFmID0gYWN0cWYtPnFmX25leHQpOworCQlpZiAoYWN0cWYgJiYgIXRyeV9tb2R1bGVfZ2V0KGFjdHFmLT5xZl9vd25lcikpCisJCQlhY3RxZiA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOworCXJldHVybiBhY3RxZjsKK30KKworc3RhdGljIHZvaWQgcHV0X3F1b3RhX2Zvcm1hdChzdHJ1Y3QgcXVvdGFfZm9ybWF0X3R5cGUgKmZtdCkKK3sKKwltb2R1bGVfcHV0KGZtdC0+cWZfb3duZXIpOworfQorCisvKgorICogRHF1b3QgTGlzdCBNYW5hZ2VtZW50OgorICogVGhlIHF1b3RhIGNvZGUgdXNlcyB0aHJlZSBsaXN0cyBmb3IgZHF1b3QgbWFuYWdlbWVudDogdGhlIGludXNlX2xpc3QsCisgKiBmcmVlX2RxdW90cywgYW5kIGRxdW90X2hhc2hbXSBhcnJheS4gQSBzaW5nbGUgZHF1b3Qgc3RydWN0dXJlIG1heSBiZQorICogb24gYWxsIHRocmVlIGxpc3RzLCBkZXBlbmRpbmcgb24gaXRzIGN1cnJlbnQgc3RhdGUuCisgKgorICogQWxsIGRxdW90cyBhcmUgcGxhY2VkIHRvIHRoZSBlbmQgb2YgaW51c2VfbGlzdCB3aGVuIGZpcnN0IGNyZWF0ZWQsIGFuZCB0aGlzCisgKiBsaXN0IGlzIHVzZWQgZm9yIGludmFsaWRhdGUgb3BlcmF0aW9uLCB3aGljaCBtdXN0IGxvb2sgYXQgZXZlcnkgZHF1b3QuCisgKgorICogVW51c2VkIGRxdW90cyAoZHFfY291bnQgPT0gMCkgYXJlIGFkZGVkIHRvIHRoZSBmcmVlX2RxdW90cyBsaXN0IHdoZW4gZnJlZWQsCisgKiBhbmQgdGhpcyBsaXN0IGlzIHNlYXJjaGVkIHdoZW5ldmVyIHdlIG5lZWQgYW4gYXZhaWxhYmxlIGRxdW90LiAgRHF1b3RzIGFyZQorICogcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IGFzIHNvb24gYXMgdGhleSBhcmUgdXNlZCBhZ2FpbiwgYW5kCisgKiBkcXN0YXRzLmZyZWVfZHF1b3RzIGdpdmVzIHRoZSBudW1iZXIgb2YgZHF1b3RzIG9uIHRoZSBsaXN0LiBXaGVuCisgKiBkcXVvdCBpcyBpbnZhbGlkYXRlZCBpdCdzIGNvbXBsZXRlbHkgcmVsZWFzZWQgZnJvbSBtZW1vcnkuCisgKgorICogRHF1b3RzIHdpdGggYSBzcGVjaWZpYyBpZGVudGl0eSAoZGV2aWNlLCB0eXBlIGFuZCBpZCkgYXJlIHBsYWNlZCBvbgorICogb25lIG9mIHRoZSBkcXVvdF9oYXNoW10gaGFzaCBjaGFpbnMuIFRoZSBwcm92aWRlcyBhbiBlZmZpY2llbnQgc2VhcmNoCisgKiBtZWNoYW5pc20gdG8gbG9jYXRlIGEgc3BlY2lmaWMgZHF1b3QuCisgKi8KKworc3RhdGljIExJU1RfSEVBRChpbnVzZV9saXN0KTsKK3N0YXRpYyBMSVNUX0hFQUQoZnJlZV9kcXVvdHMpOworc3RhdGljIHVuc2lnbmVkIGludCBkcV9oYXNoX2JpdHMsIGRxX2hhc2hfbWFzazsKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCAqZHF1b3RfaGFzaDsKKworc3RydWN0IGRxc3RhdHMgZHFzdGF0czsKKworc3RhdGljIHZvaWQgZHFwdXQoc3RydWN0IGRxdW90ICpkcXVvdCk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitoYXNoZm4oY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGlkLCBpbnQgdHlwZSkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCXRtcCA9ICgoKHVuc2lnbmVkIGxvbmcpc2I+PkwxX0NBQ0hFX1NISUZUKSBeIGlkKSAqIChNQVhRVU9UQVMgLSB0eXBlKTsKKwlyZXR1cm4gKHRtcCArICh0bXAgPj4gZHFfaGFzaF9iaXRzKSkgJiBkcV9oYXNoX21hc2s7Cit9CisKKy8qCisgKiBGb2xsb3dpbmcgbGlzdCBmdW5jdGlvbnMgZXhwZWN0IGRxX2xpc3RfbG9jayB0byBiZSBoZWxkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnNlcnRfZHF1b3RfaGFzaChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gZHF1b3RfaGFzaCArIGhhc2hmbihkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV9pZCwgZHF1b3QtPmRxX3R5cGUpOworCWhsaXN0X2FkZF9oZWFkKCZkcXVvdC0+ZHFfaGFzaCwgaGVhZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfZHF1b3RfaGFzaChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWhsaXN0X2RlbF9pbml0KCZkcXVvdC0+ZHFfaGFzaCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRxdW90ICpmaW5kX2RxdW90KHVuc2lnbmVkIGludCBoYXNoZW50LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgaWQsIGludCB0eXBlKQoreworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBkcXVvdCAqZHF1b3Q7CisKKwlobGlzdF9mb3JfZWFjaCAobm9kZSwgZHF1b3RfaGFzaCtoYXNoZW50KSB7CisJCWRxdW90ID0gaGxpc3RfZW50cnkobm9kZSwgc3RydWN0IGRxdW90LCBkcV9oYXNoKTsKKwkJaWYgKGRxdW90LT5kcV9zYiA9PSBzYiAmJiBkcXVvdC0+ZHFfaWQgPT0gaWQgJiYgZHF1b3QtPmRxX3R5cGUgPT0gdHlwZSkKKwkJCXJldHVybiBkcXVvdDsKKwl9CisJcmV0dXJuIE5PRFFVT1Q7Cit9CisKKy8qIEFkZCBhIGRxdW90IHRvIHRoZSB0YWlsIG9mIHRoZSBmcmVlIGxpc3QgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfZHF1b3RfbGFzdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWxpc3RfYWRkKCZkcXVvdC0+ZHFfZnJlZSwgZnJlZV9kcXVvdHMucHJldik7CisJZHFzdGF0cy5mcmVlX2RxdW90cysrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVtb3ZlX2ZyZWVfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpZiAobGlzdF9lbXB0eSgmZHF1b3QtPmRxX2ZyZWUpKQorCQlyZXR1cm47CisJbGlzdF9kZWxfaW5pdCgmZHF1b3QtPmRxX2ZyZWUpOworCWRxc3RhdHMuZnJlZV9kcXVvdHMtLTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9pbnVzZShzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCS8qIFdlIGFkZCB0byB0aGUgYmFjayBvZiBpbnVzZSBsaXN0IHNvIHdlIGRvbid0IGhhdmUgdG8gcmVzdGFydAorCSAqIHdoZW4gdHJhdmVyc2luZyB0aGlzIGxpc3QgYW5kIHdlIGJsb2NrICovCisJbGlzdF9hZGQoJmRxdW90LT5kcV9pbnVzZSwgaW51c2VfbGlzdC5wcmV2KTsKKwlkcXN0YXRzLmFsbG9jYXRlZF9kcXVvdHMrKzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlbW92ZV9pbnVzZShzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWRxc3RhdHMuYWxsb2NhdGVkX2RxdW90cy0tOworCWxpc3RfZGVsKCZkcXVvdC0+ZHFfaW51c2UpOworfQorLyoKKyAqIEVuZCBvZiBsaXN0IGZ1bmN0aW9ucyBuZWVkaW5nIGRxX2xpc3RfbG9jaworICovCisKK3N0YXRpYyB2b2lkIHdhaXRfb25fZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlkb3duKCZkcXVvdC0+ZHFfbG9jayk7CisJdXAoJmRxdW90LT5kcV9sb2NrKTsKK30KKworI2RlZmluZSBtYXJrX2RxdW90X2RpcnR5KGRxdW90KSAoKGRxdW90KS0+ZHFfc2ItPmRxX29wLT5tYXJrX2RpcnR5KGRxdW90KSkKKworaW50IGRxdW90X21hcmtfZHF1b3RfZGlydHkoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlzcGluX2xvY2soJmRxX2xpc3RfbG9jayk7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KERRX01PRF9CLCAmZHF1b3QtPmRxX2ZsYWdzKSkKKwkJbGlzdF9hZGQoJmRxdW90LT5kcV9kaXJ0eSwgJnNiX2Rxb3B0KGRxdW90LT5kcV9zYiktPgorCQkJCWluZm9bZHF1b3QtPmRxX3R5cGVdLmRxaV9kaXJ0eV9saXN0KTsKKwlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBuZWVkcyBkcV9saXN0X2xvY2sgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNsZWFyX2RxdW90X2RpcnR5KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoRFFfTU9EX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKQorCQlyZXR1cm4gMDsKKwlsaXN0X2RlbF9pbml0KCZkcXVvdC0+ZHFfZGlydHkpOworCXJldHVybiAxOworfQorCit2b2lkIG1hcmtfaW5mb19kaXJ0eShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlzZXRfYml0KERRRl9JTkZPX0RJUlRZX0IsICZzYl9kcW9wdChzYiktPmluZm9bdHlwZV0uZHFpX2ZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0wobWFya19pbmZvX2RpcnR5KTsKKworLyoKKyAqCVJlYWQgZHF1b3QgZnJvbSBkaXNrIGFuZCBhbGxvYyBzcGFjZSBmb3IgaXQKKyAqLworCitpbnQgZHF1b3RfYWNxdWlyZShzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWludCByZXQgPSAwLCByZXQyID0gMDsKKwlzdHJ1Y3QgcXVvdGFfaW5mbyAqZHFvcHQgPSBzYl9kcW9wdChkcXVvdC0+ZHFfc2IpOworCisJZG93bigmZHF1b3QtPmRxX2xvY2spOworCWRvd24oJmRxb3B0LT5kcWlvX3NlbSk7CisJaWYgKCF0ZXN0X2JpdChEUV9SRUFEX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKQorCQlyZXQgPSBkcW9wdC0+b3BzW2RxdW90LT5kcV90eXBlXS0+cmVhZF9kcWJsayhkcXVvdCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X2lvbG9jazsKKwlzZXRfYml0KERRX1JFQURfQiwgJmRxdW90LT5kcV9mbGFncyk7CisJLyogSW5zdGFudGlhdGUgZHF1b3QgaWYgbmVlZGVkICovCisJaWYgKCF0ZXN0X2JpdChEUV9BQ1RJVkVfQiwgJmRxdW90LT5kcV9mbGFncykgJiYgIWRxdW90LT5kcV9vZmYpIHsKKwkJcmV0ID0gZHFvcHQtPm9wc1tkcXVvdC0+ZHFfdHlwZV0tPmNvbW1pdF9kcWJsayhkcXVvdCk7CisJCS8qIFdyaXRlIHRoZSBpbmZvIGlmIG5lZWRlZCAqLworCQlpZiAoaW5mb19kaXJ0eSgmZHFvcHQtPmluZm9bZHF1b3QtPmRxX3R5cGVdKSkKKwkJCXJldDIgPSBkcW9wdC0+b3BzW2RxdW90LT5kcV90eXBlXS0+d3JpdGVfZmlsZV9pbmZvKGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0X2lvbG9jazsKKwkJaWYgKHJldDIgPCAwKSB7CisJCQlyZXQgPSByZXQyOworCQkJZ290byBvdXRfaW9sb2NrOworCQl9CisJfQorCXNldF9iaXQoRFFfQUNUSVZFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpOworb3V0X2lvbG9jazoKKwl1cCgmZHFvcHQtPmRxaW9fc2VtKTsKKwl1cCgmZHF1b3QtPmRxX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKglXcml0ZSBkcXVvdCB0byBkaXNrCisgKi8KK2ludCBkcXVvdF9jb21taXQoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpbnQgcmV0ID0gMCwgcmV0MiA9IDA7CisJc3RydWN0IHF1b3RhX2luZm8gKmRxb3B0ID0gc2JfZHFvcHQoZHF1b3QtPmRxX3NiKTsKKworCWRvd24oJmRxb3B0LT5kcWlvX3NlbSk7CisJc3Bpbl9sb2NrKCZkcV9saXN0X2xvY2spOworCWlmICghY2xlYXJfZHF1b3RfZGlydHkoZHF1b3QpKSB7CisJCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOworCQlnb3RvIG91dF9zZW07CisJfQorCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOworCS8qIEluYWN0aXZlIGRxdW90IGNhbiBiZSBvbmx5IGlmIHRoZXJlIHdhcyBlcnJvciBkdXJpbmcgcmVhZC9pbml0CisJICogPT4gd2UgaGF2ZSBiZXR0ZXIgbm90IHdyaXRpbmcgaXQgKi8KKwlpZiAodGVzdF9iaXQoRFFfQUNUSVZFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKSB7CisJCXJldCA9IGRxb3B0LT5vcHNbZHF1b3QtPmRxX3R5cGVdLT5jb21taXRfZHFibGsoZHF1b3QpOworCQlpZiAoaW5mb19kaXJ0eSgmZHFvcHQtPmluZm9bZHF1b3QtPmRxX3R5cGVdKSkKKwkJCXJldDIgPSBkcW9wdC0+b3BzW2RxdW90LT5kcV90eXBlXS0+d3JpdGVfZmlsZV9pbmZvKGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUpOworCQlpZiAocmV0ID49IDApCisJCQlyZXQgPSByZXQyOworCX0KK291dF9zZW06CisJdXAoJmRxb3B0LT5kcWlvX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqCVJlbGVhc2UgZHF1b3QKKyAqLworaW50IGRxdW90X3JlbGVhc2Uoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpbnQgcmV0ID0gMCwgcmV0MiA9IDA7CisJc3RydWN0IHF1b3RhX2luZm8gKmRxb3B0ID0gc2JfZHFvcHQoZHF1b3QtPmRxX3NiKTsKKworCWRvd24oJmRxdW90LT5kcV9sb2NrKTsKKwkvKiBDaGVjayB3aGV0aGVyIHdlIGFyZSBub3QgcmFjaW5nIHdpdGggc29tZSBvdGhlciBkcWdldCgpICovCisJaWYgKGF0b21pY19yZWFkKCZkcXVvdC0+ZHFfY291bnQpID4gMSkKKwkJZ290byBvdXRfZHFsb2NrOworCWRvd24oJmRxb3B0LT5kcWlvX3NlbSk7CisJaWYgKGRxb3B0LT5vcHNbZHF1b3QtPmRxX3R5cGVdLT5yZWxlYXNlX2RxYmxrKSB7CisJCXJldCA9IGRxb3B0LT5vcHNbZHF1b3QtPmRxX3R5cGVdLT5yZWxlYXNlX2RxYmxrKGRxdW90KTsKKwkJLyogV3JpdGUgdGhlIGluZm8gKi8KKwkJaWYgKGluZm9fZGlydHkoJmRxb3B0LT5pbmZvW2RxdW90LT5kcV90eXBlXSkpCisJCQlyZXQyID0gZHFvcHQtPm9wc1tkcXVvdC0+ZHFfdHlwZV0tPndyaXRlX2ZpbGVfaW5mbyhkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlKTsKKwkJaWYgKHJldCA+PSAwKQorCQkJcmV0ID0gcmV0MjsKKwl9CisJY2xlYXJfYml0KERRX0FDVElWRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwl1cCgmZHFvcHQtPmRxaW9fc2VtKTsKK291dF9kcWxvY2s6CisJdXAoJmRxdW90LT5kcV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBJbnZhbGlkYXRlIGFsbCBkcXVvdHMgb24gdGhlIGxpc3QuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlcgorICogcXVvdGEgaXMgZGlzYWJsZWQgYW5kIHBvaW50ZXJzIGZyb20gaW5vZGVzIHJlbW92ZWQgc28gdGhlcmUgY2Fubm90IGJlIG5ldworICogcXVvdGEgdXNlcnMuIEFsc28gYmVjYXVzZSB3ZSBob2xkIGRxb25vZmZfc2VtIHRoZXJlIGNhbiBiZSBubyBxdW90YSB1c2VycworICogZm9yIHRoaXMgc2IrdHlwZSBhdCBhbGwuICovCitzdGF0aWMgdm9pZCBpbnZhbGlkYXRlX2RxdW90cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgZHF1b3QgKmRxdW90OworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CisKKwlzcGluX2xvY2soJmRxX2xpc3RfbG9jayk7CisJZm9yIChoZWFkID0gaW51c2VfbGlzdC5uZXh0OyBoZWFkICE9ICZpbnVzZV9saXN0OykgeworCQlkcXVvdCA9IGxpc3RfZW50cnkoaGVhZCwgc3RydWN0IGRxdW90LCBkcV9pbnVzZSk7CisJCWhlYWQgPSBoZWFkLT5uZXh0OworCQlpZiAoZHF1b3QtPmRxX3NiICE9IHNiKQorCQkJY29udGludWU7CisJCWlmIChkcXVvdC0+ZHFfdHlwZSAhPSB0eXBlKQorCQkJY29udGludWU7CisjaWZkZWYgX19EUVVPVF9QQVJBTk9JQQorCQlpZiAoYXRvbWljX3JlYWQoJmRxdW90LT5kcV9jb3VudCkpCisJCQlCVUcoKTsKKyNlbmRpZgorCQkvKiBRdW90YSBub3cgaGFzIG5vIHVzZXJzIGFuZCBpdCBoYXMgYmVlbiB3cml0dGVuIG9uIGxhc3QgZHFwdXQoKSAqLworCQlyZW1vdmVfZHF1b3RfaGFzaChkcXVvdCk7CisJCXJlbW92ZV9mcmVlX2RxdW90KGRxdW90KTsKKwkJcmVtb3ZlX2ludXNlKGRxdW90KTsKKwkJa21lbV9jYWNoZV9mcmVlKGRxdW90X2NhY2hlcCwgZHF1b3QpOworCX0KKwlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKK30KKworaW50IHZmc19xdW90YV9zeW5jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmRpcnR5OworCXN0cnVjdCBkcXVvdCAqZHF1b3Q7CisJc3RydWN0IHF1b3RhX2luZm8gKmRxb3B0ID0gc2JfZHFvcHQoc2IpOworCWludCBjbnQ7CisKKwlkb3duKCZkcW9wdC0+ZHFvbm9mZl9zZW0pOworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgeworCQlpZiAodHlwZSAhPSAtMSAmJiBjbnQgIT0gdHlwZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXNiX2hhc19xdW90YV9lbmFibGVkKHNiLCBjbnQpKQorCQkJY29udGludWU7CisJCXNwaW5fbG9jaygmZHFfbGlzdF9sb2NrKTsKKwkJZGlydHkgPSAmZHFvcHQtPmluZm9bY250XS5kcWlfZGlydHlfbGlzdDsKKwkJd2hpbGUgKCFsaXN0X2VtcHR5KGRpcnR5KSkgeworCQkJZHF1b3QgPSBsaXN0X2VudHJ5KGRpcnR5LT5uZXh0LCBzdHJ1Y3QgZHF1b3QsIGRxX2RpcnR5KTsKKwkJCS8qIERpcnR5IGFuZCBpbmFjdGl2ZSBjYW4gYmUgb25seSBiYWQgZHF1b3QuLi4gKi8KKwkJCWlmICghdGVzdF9iaXQoRFFfQUNUSVZFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKSB7CisJCQkJY2xlYXJfZHF1b3RfZGlydHkoZHF1b3QpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogTm93IHdlIGhhdmUgYWN0aXZlIGRxdW90IGZyb20gd2hpY2ggc29tZW9uZSBpcworIAkJCSAqIGhvbGRpbmcgcmVmZXJlbmNlIHNvIHdlIGNhbiBzYWZlbHkganVzdCBpbmNyZWFzZQorCQkJICogdXNlIGNvdW50ICovCisJCQlhdG9taWNfaW5jKCZkcXVvdC0+ZHFfY291bnQpOworCQkJZHFzdGF0cy5sb29rdXBzKys7CisJCQlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKKwkJCXNiLT5kcV9vcC0+d3JpdGVfZHF1b3QoZHF1b3QpOworCQkJZHFwdXQoZHF1b3QpOworCQkJc3Bpbl9sb2NrKCZkcV9saXN0X2xvY2spOworCQl9CisJCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOworCX0KKworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykKKwkJaWYgKChjbnQgPT0gdHlwZSB8fCB0eXBlID09IC0xKSAmJiBzYl9oYXNfcXVvdGFfZW5hYmxlZChzYiwgY250KQorCQkJJiYgaW5mb19kaXJ0eSgmZHFvcHQtPmluZm9bY250XSkpCisJCQlzYi0+ZHFfb3AtPndyaXRlX2luZm8oc2IsIGNudCk7CisJc3Bpbl9sb2NrKCZkcV9saXN0X2xvY2spOworCWRxc3RhdHMuc3luY3MrKzsKKwlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKKwl1cCgmZHFvcHQtPmRxb25vZmZfc2VtKTsKKworCXJldHVybiAwOworfQorCisvKiBGcmVlIHVudXNlZCBkcXVvdHMgZnJvbSBjYWNoZSAqLworc3RhdGljIHZvaWQgcHJ1bmVfZHFjYWNoZShpbnQgY291bnQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgZHF1b3QgKmRxdW90OworCisJaGVhZCA9IGZyZWVfZHF1b3RzLnByZXY7CisJd2hpbGUgKGhlYWQgIT0gJmZyZWVfZHF1b3RzICYmIGNvdW50KSB7CisJCWRxdW90ID0gbGlzdF9lbnRyeShoZWFkLCBzdHJ1Y3QgZHF1b3QsIGRxX2ZyZWUpOworCQlyZW1vdmVfZHF1b3RfaGFzaChkcXVvdCk7CisJCXJlbW92ZV9mcmVlX2RxdW90KGRxdW90KTsKKwkJcmVtb3ZlX2ludXNlKGRxdW90KTsKKwkJa21lbV9jYWNoZV9mcmVlKGRxdW90X2NhY2hlcCwgZHF1b3QpOworCQljb3VudC0tOworCQloZWFkID0gZnJlZV9kcXVvdHMucHJldjsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGtzd2FwZCB3aGVuIHdlIHRoaW5rIHdlIG5lZWQgc29tZQorICogbW9yZSBtZW1vcnkKKyAqLworCitzdGF0aWMgaW50IHNocmlua19kcWNhY2hlX21lbW9yeShpbnQgbnIsIHVuc2lnbmVkIGludCBnZnBfbWFzaykKK3sKKwlpZiAobnIpIHsKKwkJc3Bpbl9sb2NrKCZkcV9saXN0X2xvY2spOworCQlwcnVuZV9kcWNhY2hlKG5yKTsKKwkJc3Bpbl91bmxvY2soJmRxX2xpc3RfbG9jayk7CisJfQorCXJldHVybiAoZHFzdGF0cy5mcmVlX2RxdW90cyAvIDEwMCkgKiBzeXNjdGxfdmZzX2NhY2hlX3ByZXNzdXJlOworfQorCisvKgorICogUHV0IHJlZmVyZW5jZSB0byBkcXVvdAorICogTk9URTogSWYgeW91IGNoYW5nZSB0aGlzIGZ1bmN0aW9uIHBsZWFzZSBjaGVjayB3aGV0aGVyIGRxcHV0X2Jsb2NrcygpIHdvcmtzIHJpZ2h0Li4uCisgKiBNVVNUIGJlIGNhbGxlZCB3aXRoIGVpdGhlciBkcXB0cl9zZW0gb3IgZHFvbm9mZl9zZW0gaGVsZAorICovCitzdGF0aWMgdm9pZCBkcXB1dChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWlmICghZHF1b3QpCisJCXJldHVybjsKKyNpZmRlZiBfX0RRVU9UX1BBUkFOT0lBCisJaWYgKCFhdG9taWNfcmVhZCgmZHF1b3QtPmRxX2NvdW50KSkgeworCQlwcmludGsoIlZGUzogZHFwdXQ6IHRyeWluZyB0byBmcmVlIGZyZWUgZHF1b3RcbiIpOworCQlwcmludGsoIlZGUzogZGV2aWNlICVzLCBkcXVvdCBvZiAlcyAlZFxuIiwKKwkJCWRxdW90LT5kcV9zYi0+c19pZCwKKwkJCXF1b3RhdHlwZXNbZHF1b3QtPmRxX3R5cGVdLAorCQkJZHF1b3QtPmRxX2lkKTsKKwkJQlVHKCk7CisJfQorI2VuZGlmCisJCisJc3Bpbl9sb2NrKCZkcV9saXN0X2xvY2spOworCWRxc3RhdHMuZHJvcHMrKzsKKwlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKK3dlX3NsZXB0OgorCXNwaW5fbG9jaygmZHFfbGlzdF9sb2NrKTsKKwlpZiAoYXRvbWljX3JlYWQoJmRxdW90LT5kcV9jb3VudCkgPiAxKSB7CisJCS8qIFdlIGhhdmUgbW9yZSB0aGFuIG9uZSB1c2VyLi4uIG5vdGhpbmcgdG8gZG8gKi8KKwkJYXRvbWljX2RlYygmZHF1b3QtPmRxX2NvdW50KTsKKwkJc3Bpbl91bmxvY2soJmRxX2xpc3RfbG9jayk7CisJCXJldHVybjsKKwl9CisJLyogTmVlZCB0byByZWxlYXNlIGRxdW90PyAqLworCWlmICh0ZXN0X2JpdChEUV9BQ1RJVkVfQiwgJmRxdW90LT5kcV9mbGFncykgJiYgZHF1b3RfZGlydHkoZHF1b3QpKSB7CisJCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOworCQkvKiBDb21taXQgZHF1b3QgYmVmb3JlIHJlbGVhc2luZyAqLworCQlkcXVvdC0+ZHFfc2ItPmRxX29wLT53cml0ZV9kcXVvdChkcXVvdCk7CisJCWdvdG8gd2Vfc2xlcHQ7CisJfQorCS8qIENsZWFyIGZsYWcgaW4gY2FzZSBkcXVvdCB3YXMgaW5hY3RpdmUgKHNvbWV0aGluZyBiYWQgaGFwcGVuZWQpICovCisJY2xlYXJfZHF1b3RfZGlydHkoZHF1b3QpOworCWlmICh0ZXN0X2JpdChEUV9BQ1RJVkVfQiwgJmRxdW90LT5kcV9mbGFncykpIHsKKwkJc3Bpbl91bmxvY2soJmRxX2xpc3RfbG9jayk7CisJCWRxdW90LT5kcV9zYi0+ZHFfb3AtPnJlbGVhc2VfZHF1b3QoZHF1b3QpOworCQlnb3RvIHdlX3NsZXB0OworCX0KKwlhdG9taWNfZGVjKCZkcXVvdC0+ZHFfY291bnQpOworI2lmZGVmIF9fRFFVT1RfUEFSQU5PSUEKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmRxdW90LT5kcV9mcmVlKSkKKwkJQlVHKCk7CisjZW5kaWYKKwlwdXRfZHF1b3RfbGFzdChkcXVvdCk7CisJc3Bpbl91bmxvY2soJmRxX2xpc3RfbG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHF1b3QgKmdldF9lbXB0eV9kcXVvdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgZHF1b3QgKmRxdW90OworCisJZHF1b3QgPSBrbWVtX2NhY2hlX2FsbG9jKGRxdW90X2NhY2hlcCwgU0xBQl9OT0ZTKTsKKwlpZighZHF1b3QpCisJCXJldHVybiBOT0RRVU9UOworCisJbWVtc2V0KChjYWRkcl90KWRxdW90LCAwLCBzaXplb2Yoc3RydWN0IGRxdW90KSk7CisJc2VtYV9pbml0KCZkcXVvdC0+ZHFfbG9jaywgMSk7CisJSU5JVF9MSVNUX0hFQUQoJmRxdW90LT5kcV9mcmVlKTsKKwlJTklUX0xJU1RfSEVBRCgmZHF1b3QtPmRxX2ludXNlKTsKKwlJTklUX0hMSVNUX05PREUoJmRxdW90LT5kcV9oYXNoKTsKKwlJTklUX0xJU1RfSEVBRCgmZHF1b3QtPmRxX2RpcnR5KTsKKwlkcXVvdC0+ZHFfc2IgPSBzYjsKKwlkcXVvdC0+ZHFfdHlwZSA9IHR5cGU7CisJYXRvbWljX3NldCgmZHF1b3QtPmRxX2NvdW50LCAxKTsKKworCXJldHVybiBkcXVvdDsKK30KKworLyoKKyAqIEdldCByZWZlcmVuY2UgdG8gZHF1b3QKKyAqIE1VU1QgYmUgY2FsbGVkIHdpdGggZWl0aGVyIGRxcHRyX3NlbSBvciBkcW9ub2ZmX3NlbSBoZWxkCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZHF1b3QgKmRxZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBpZCwgaW50IHR5cGUpCit7CisJdW5zaWduZWQgaW50IGhhc2hlbnQgPSBoYXNoZm4oc2IsIGlkLCB0eXBlKTsKKwlzdHJ1Y3QgZHF1b3QgKmRxdW90LCAqZW1wdHkgPSBOT0RRVU9UOworCisgICAgICAgIGlmICghc2JfaGFzX3F1b3RhX2VuYWJsZWQoc2IsIHR5cGUpKQorCQlyZXR1cm4gTk9EUVVPVDsKK3dlX3NsZXB0OgorCXNwaW5fbG9jaygmZHFfbGlzdF9sb2NrKTsKKwlpZiAoKGRxdW90ID0gZmluZF9kcXVvdChoYXNoZW50LCBzYiwgaWQsIHR5cGUpKSA9PSBOT0RRVU9UKSB7CisJCWlmIChlbXB0eSA9PSBOT0RRVU9UKSB7CisJCQlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKKwkJCWlmICgoZW1wdHkgPSBnZXRfZW1wdHlfZHF1b3Qoc2IsIHR5cGUpKSA9PSBOT0RRVU9UKQorCQkJCXNjaGVkdWxlKCk7CS8qIFRyeSB0byB3YWl0IGZvciBhIG1vbWVudC4uLiAqLworCQkJZ290byB3ZV9zbGVwdDsKKwkJfQorCQlkcXVvdCA9IGVtcHR5OworCQlkcXVvdC0+ZHFfaWQgPSBpZDsKKwkJLyogYWxsIGRxdW90cyBnbyBvbiB0aGUgaW51c2VfbGlzdCAqLworCQlwdXRfaW51c2UoZHF1b3QpOworCQkvKiBoYXNoIGl0IGZpcnN0IHNvIGl0IGNhbiBiZSBmb3VuZCAqLworCQlpbnNlcnRfZHF1b3RfaGFzaChkcXVvdCk7CisJCWRxc3RhdHMubG9va3VwcysrOworCQlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKKwl9IGVsc2UgeworCQlpZiAoIWF0b21pY19yZWFkKCZkcXVvdC0+ZHFfY291bnQpKQorCQkJcmVtb3ZlX2ZyZWVfZHF1b3QoZHF1b3QpOworCQlhdG9taWNfaW5jKCZkcXVvdC0+ZHFfY291bnQpOworCQlkcXN0YXRzLmNhY2hlX2hpdHMrKzsKKwkJZHFzdGF0cy5sb29rdXBzKys7CisJCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOworCQlpZiAoZW1wdHkpCisJCQlrbWVtX2NhY2hlX2ZyZWUoZHF1b3RfY2FjaGVwLCBlbXB0eSk7CisJfQorCS8qIFdhaXQgZm9yIGRxX2xvY2sgLSBhZnRlciB0aGlzIHdlIGtub3cgdGhhdCBlaXRoZXIgZHF1b3RfcmVsZWFzZSgpIGlzIGFscmVhZHkKKwkgKiBmaW5pc2hlZCBvciBpdCB3aWxsIGJlIGNhbmNlbGVkIGR1ZSB0byBkcV9jb3VudCA+IDEgdGVzdCAqLworCXdhaXRfb25fZHF1b3QoZHF1b3QpOworCS8qIFJlYWQgdGhlIGRxdW90IGFuZCBpbnN0YW50aWF0ZSBpdCAoZXZlcnl0aGluZyBkb25lIG9ubHkgaWYgbmVlZGVkKSAqLworCWlmICghdGVzdF9iaXQoRFFfQUNUSVZFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpICYmIHNiLT5kcV9vcC0+YWNxdWlyZV9kcXVvdChkcXVvdCkgPCAwKSB7CisJCWRxcHV0KGRxdW90KTsKKwkJcmV0dXJuIE5PRFFVT1Q7CisJfQorI2lmZGVmIF9fRFFVT1RfUEFSQU5PSUEKKwlpZiAoIWRxdW90LT5kcV9zYikJLyogSGFzIHNvbWVib2R5IGludmFsaWRhdGVkIGVudHJ5IHVuZGVyIHVzPyAqLworCQlCVUcoKTsKKyNlbmRpZgorCisJcmV0dXJuIGRxdW90OworfQorCitzdGF0aWMgaW50IGRxaW5pdF9uZWVkZWQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCit7CisJaW50IGNudDsKKworCWlmIChJU19OT1FVT1RBKGlub2RlKSkKKwkJcmV0dXJuIDA7CisJaWYgKHR5cGUgIT0gLTEpCisJCXJldHVybiBpbm9kZS0+aV9kcXVvdFt0eXBlXSA9PSBOT0RRVU9UOworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykKKwkJaWYgKGlub2RlLT5pX2RxdW90W2NudF0gPT0gTk9EUVVPVCkKKwkJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKiBUaGlzIHJvdXRpbmUgaXMgZ3VhcmRlZCBieSBkcW9ub2ZmX3NlbSBzZW1hcGhvcmUgKi8KK3N0YXRpYyB2b2lkIGFkZF9kcXVvdF9yZWYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworcmVzdGFydDoKKwlmaWxlX2xpc3RfbG9jaygpOworCWxpc3RfZm9yX2VhY2gocCwgJnNiLT5zX2ZpbGVzKSB7CisJCXN0cnVjdCBmaWxlICpmaWxwID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgZmlsZSwgZl9saXN0KTsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCQlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgZHFpbml0X25lZWRlZChpbm9kZSwgdHlwZSkpIHsKKwkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGRnZXQoZmlscC0+Zl9kZW50cnkpOworCQkJZmlsZV9saXN0X3VubG9jaygpOworCQkJc2ItPmRxX29wLT5pbml0aWFsaXplKGlub2RlLCB0eXBlKTsKKwkJCWRwdXQoZGVudHJ5KTsKKwkJCS8qIEFzIHdlIG1heSBoYXZlIGJsb2NrZWQgd2UgaGFkIGJldHRlciByZXN0YXJ0Li4uICovCisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKwl9CisJZmlsZV9saXN0X3VubG9jaygpOworfQorCisvKiBSZXR1cm4gMCBpZiBkcXB1dCgpIHdvbid0IGJsb2NrIChub3RlIHRoYXQgMSBkb2Vzbid0IG5lY2Vzc2FyaWx5IG1lYW4gYmxvY2tpbmcpICovCitzdGF0aWMgaW5saW5lIGludCBkcXB1dF9ibG9ja3Moc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpZiAoYXRvbWljX3JlYWQoJmRxdW90LT5kcV9jb3VudCkgPD0gMSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJlbW92ZSByZWZlcmVuY2VzIHRvIGRxdW90cyBmcm9tIGlub2RlIC0gYWRkIGRxdW90IHRvIGxpc3QgZm9yIGZyZWVpbmcgaWYgbmVlZGVkICovCisvKiBXZSBjYW4ndCByYWNlIHdpdGggYW55Ym9keSBiZWNhdXNlIHdlIGhvbGQgZHFwdHJfc2VtIGZvciB3cml0aW5nLi4uICovCitpbnQgcmVtb3ZlX2lub2RlX2RxdW90X3JlZihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwgc3RydWN0IGxpc3RfaGVhZCAqdG9mcmVlX2hlYWQpCit7CisJc3RydWN0IGRxdW90ICpkcXVvdCA9IGlub2RlLT5pX2RxdW90W3R5cGVdOworCisJaW5vZGUtPmlfZHF1b3RbdHlwZV0gPSBOT0RRVU9UOworCWlmIChkcXVvdCAhPSBOT0RRVU9UKSB7CisJCWlmIChkcXB1dF9ibG9ja3MoZHF1b3QpKSB7CisjaWZkZWYgX19EUVVPVF9QQVJBTk9JQQorCQkJaWYgKGF0b21pY19yZWFkKCZkcXVvdC0+ZHFfY291bnQpICE9IDEpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVkZTOiBBZGRpbmcgZHF1b3Qgd2l0aCBkcV9jb3VudCAlZCB0byBkaXNwb3NlIGxpc3QuXG4iLCBhdG9taWNfcmVhZCgmZHF1b3QtPmRxX2NvdW50KSk7CisjZW5kaWYKKwkJCXNwaW5fbG9jaygmZHFfbGlzdF9sb2NrKTsKKwkJCWxpc3RfYWRkKCZkcXVvdC0+ZHFfZnJlZSwgdG9mcmVlX2hlYWQpOwkvKiBBcyBkcXVvdCBtdXN0IGhhdmUgY3VycmVudGx5IHVzZXJzIGl0IGNhbid0IGJlIG9uIHRoZSBmcmVlIGxpc3QuLi4gKi8KKwkJCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZWxzZQorCQkJZHFwdXQoZHF1b3QpOyAgIC8qIFdlIGhhdmUgZ3VhcmFudGVlZCB3ZSB3b24ndCBibG9jayAqLworCX0KKwlyZXR1cm4gMDsKK30KKworLyogRnJlZSBsaXN0IG9mIGRxdW90cyAtIGNhbGxlZCBmcm9tIGlub2RlLmMgKi8KKy8qIGRxdW90cyBhcmUgcmVtb3ZlZCBmcm9tIGlub2Rlcywgbm8gbmV3IHJlZmVyZW5jZXMgY2FuIGJlIGdvdCBzbyB3ZSBhcmUgdGhlIG9ubHkgb25lcyBob2xkaW5nIHJlZmVyZW5jZSAqLworc3RhdGljIHZvaWQgcHV0X2RxdW90X2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqdG9mcmVlX2hlYWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqYWN0X2hlYWQ7CisJc3RydWN0IGRxdW90ICpkcXVvdDsKKworCWFjdF9oZWFkID0gdG9mcmVlX2hlYWQtPm5leHQ7CisJLyogU28gbm93IHdlIGhhdmUgZHF1b3RzIG9uIHRoZSBsaXN0Li4uIEp1c3QgZnJlZSB0aGVtICovCisJd2hpbGUgKGFjdF9oZWFkICE9IHRvZnJlZV9oZWFkKSB7CisJCWRxdW90ID0gbGlzdF9lbnRyeShhY3RfaGVhZCwgc3RydWN0IGRxdW90LCBkcV9mcmVlKTsKKwkJYWN0X2hlYWQgPSBhY3RfaGVhZC0+bmV4dDsKKwkJbGlzdF9kZWxfaW5pdCgmZHF1b3QtPmRxX2ZyZWUpOwkvKiBSZW1vdmUgZHF1b3QgZnJvbSB0aGUgbGlzdCBzbyB3ZSB3b24ndCBoYXZlIHByb2JsZW1zLi4uICovCisJCWRxcHV0KGRxdW90KTsKKwl9Cit9CisKKy8qIEdhdGhlciBhbGwgcmVmZXJlbmNlcyBmcm9tIGlub2RlcyBhbmQgZHJvcCB0aGVtICovCitzdGF0aWMgdm9pZCBkcm9wX2RxdW90X3JlZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlMSVNUX0hFQUQodG9mcmVlX2hlYWQpOworCisJLyogV2UgbmVlZCB0byBiZSBndWFyZGVkIGFnYWluc3QgcHJ1bmVfaWNhY2hlIHRvIHJlYWNoIGFsbCB0aGUKKwkgKiBpbm9kZXMgLSBvdGhlcndpc2Ugc29tZSBjYW4gYmUgb24gdGhlIGxvY2FsIGxpc3Qgb2YgcHJ1bmVfaWNhY2hlICovCisJZG93bigmaXBydW5lX3NlbSk7CisJZG93bl93cml0ZSgmc2JfZHFvcHQoc2IpLT5kcXB0cl9zZW0pOworCXJlbW92ZV9kcXVvdF9yZWYoc2IsIHR5cGUsICZ0b2ZyZWVfaGVhZCk7CisJdXBfd3JpdGUoJnNiX2Rxb3B0KHNiKS0+ZHFwdHJfc2VtKTsKKwl1cCgmaXBydW5lX3NlbSk7CisJcHV0X2RxdW90X2xpc3QoJnRvZnJlZV9oZWFkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRxdW90X2luY3JfaW5vZGVzKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHVuc2lnbmVkIGxvbmcgbnVtYmVyKQoreworCWRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlcyArPSBudW1iZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcXVvdF9pbmNyX3NwYWNlKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHFzaXplX3QgbnVtYmVyKQoreworCWRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlICs9IG51bWJlcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRxdW90X2RlY3JfaW5vZGVzKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHVuc2lnbmVkIGxvbmcgbnVtYmVyKQoreworCWlmIChkcXVvdC0+ZHFfZHFiLmRxYl9jdXJpbm9kZXMgPiBudW1iZXIpCisJCWRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlcyAtPSBudW1iZXI7CisJZWxzZQorCQlkcXVvdC0+ZHFfZHFiLmRxYl9jdXJpbm9kZXMgPSAwOworCWlmIChkcXVvdC0+ZHFfZHFiLmRxYl9jdXJpbm9kZXMgPD0gZHF1b3QtPmRxX2RxYi5kcWJfaXNvZnRsaW1pdCkKKwkJZHF1b3QtPmRxX2RxYi5kcWJfaXRpbWUgPSAodGltZV90KSAwOworCWNsZWFyX2JpdChEUV9JTk9ERVNfQiwgJmRxdW90LT5kcV9mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcXVvdF9kZWNyX3NwYWNlKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHFzaXplX3QgbnVtYmVyKQoreworCWlmIChkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSA+IG51bWJlcikKKwkJZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgLT0gbnVtYmVyOworCWVsc2UKKwkJZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgPSAwOworCWlmICh0b3FiKGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlKSA8PSBkcXVvdC0+ZHFfZHFiLmRxYl9ic29mdGxpbWl0KQorCQlkcXVvdC0+ZHFfZHFiLmRxYl9idGltZSA9ICh0aW1lX3QpIDA7CisJY2xlYXJfYml0KERRX0JMS1NfQiwgJmRxdW90LT5kcV9mbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgZmxhZ19wcmludF93YXJuaW5ncyA9IDE7CisKK3N0YXRpYyBpbmxpbmUgaW50IG5lZWRfcHJpbnRfd2FybmluZyhzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWlmICghZmxhZ19wcmludF93YXJuaW5ncykKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGRxdW90LT5kcV90eXBlKSB7CisJCWNhc2UgVVNSUVVPVEE6CisJCQlyZXR1cm4gY3VycmVudC0+ZnN1aWQgPT0gZHF1b3QtPmRxX2lkOworCQljYXNlIEdSUFFVT1RBOgorCQkJcmV0dXJuIGluX2dyb3VwX3AoZHF1b3QtPmRxX2lkKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFZhbHVlcyBvZiB3YXJuaW5ncyAqLworI2RlZmluZSBOT1dBUk4gMAorI2RlZmluZSBJSEFSRFdBUk4gMQorI2RlZmluZSBJU09GVExPTkdXQVJOIDIKKyNkZWZpbmUgSVNPRlRXQVJOIDMKKyNkZWZpbmUgQkhBUkRXQVJOIDQKKyNkZWZpbmUgQlNPRlRMT05HV0FSTiA1CisjZGVmaW5lIEJTT0ZUV0FSTiA2CisKKy8qIFByaW50IHdhcm5pbmcgdG8gdXNlciB3aGljaCBleGNlZWRlZCBxdW90YSAqLworc3RhdGljIHZvaWQgcHJpbnRfd2FybmluZyhzdHJ1Y3QgZHF1b3QgKmRxdW90LCBjb25zdCBjaGFyIHdhcm50eXBlKQoreworCWNoYXIgKm1zZyA9IE5VTEw7CisJaW50IGZsYWcgPSAod2FybnR5cGUgPT0gQkhBUkRXQVJOIHx8IHdhcm50eXBlID09IEJTT0ZUTE9OR1dBUk4pID8gRFFfQkxLU19CIDoKKwkgICgod2FybnR5cGUgPT0gSUhBUkRXQVJOIHx8IHdhcm50eXBlID09IElTT0ZUTE9OR1dBUk4pID8gRFFfSU5PREVTX0IgOiAwKTsKKworCWlmICghbmVlZF9wcmludF93YXJuaW5nKGRxdW90KSB8fCAoZmxhZyAmJiB0ZXN0X2FuZF9zZXRfYml0KGZsYWcsICZkcXVvdC0+ZHFfZmxhZ3MpKSkKKwkJcmV0dXJuOworCisJdHR5X3dyaXRlX21lc3NhZ2UoY3VycmVudC0+c2lnbmFsLT50dHksIGRxdW90LT5kcV9zYi0+c19pZCk7CisJaWYgKHdhcm50eXBlID09IElTT0ZUV0FSTiB8fCB3YXJudHlwZSA9PSBCU09GVFdBUk4pCisJCXR0eV93cml0ZV9tZXNzYWdlKGN1cnJlbnQtPnNpZ25hbC0+dHR5LCAiOiB3YXJuaW5nLCAiKTsKKwllbHNlCisJCXR0eV93cml0ZV9tZXNzYWdlKGN1cnJlbnQtPnNpZ25hbC0+dHR5LCAiOiB3cml0ZSBmYWlsZWQsICIpOworCXR0eV93cml0ZV9tZXNzYWdlKGN1cnJlbnQtPnNpZ25hbC0+dHR5LCBxdW90YXR5cGVzW2RxdW90LT5kcV90eXBlXSk7CisJc3dpdGNoICh3YXJudHlwZSkgeworCQljYXNlIElIQVJEV0FSTjoKKwkJCW1zZyA9ICIgZmlsZSBsaW1pdCByZWFjaGVkLlxyXG4iOworCQkJYnJlYWs7CisJCWNhc2UgSVNPRlRMT05HV0FSTjoKKwkJCW1zZyA9ICIgZmlsZSBxdW90YSBleGNlZWRlZCB0b28gbG9uZy5cclxuIjsKKwkJCWJyZWFrOworCQljYXNlIElTT0ZUV0FSTjoKKwkJCW1zZyA9ICIgZmlsZSBxdW90YSBleGNlZWRlZC5cclxuIjsKKwkJCWJyZWFrOworCQljYXNlIEJIQVJEV0FSTjoKKwkJCW1zZyA9ICIgYmxvY2sgbGltaXQgcmVhY2hlZC5cclxuIjsKKwkJCWJyZWFrOworCQljYXNlIEJTT0ZUTE9OR1dBUk46CisJCQltc2cgPSAiIGJsb2NrIHF1b3RhIGV4Y2VlZGVkIHRvbyBsb25nLlxyXG4iOworCQkJYnJlYWs7CisJCWNhc2UgQlNPRlRXQVJOOgorCQkJbXNnID0gIiBibG9jayBxdW90YSBleGNlZWRlZC5cclxuIjsKKwkJCWJyZWFrOworCX0KKwl0dHlfd3JpdGVfbWVzc2FnZShjdXJyZW50LT5zaWduYWwtPnR0eSwgbXNnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3dhcm5pbmdzKHN0cnVjdCBkcXVvdCAqKmRxdW90cywgY2hhciAqd2FybnR5cGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspCisJCWlmIChkcXVvdHNbaV0gIT0gTk9EUVVPVCAmJiB3YXJudHlwZVtpXSAhPSBOT1dBUk4pCisJCQlwcmludF93YXJuaW5nKGRxdW90c1tpXSwgd2FybnR5cGVbaV0pOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgaWdub3JlX2hhcmRsaW1pdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gJnNiX2Rxb3B0KGRxdW90LT5kcV9zYiktPmluZm9bZHF1b3QtPmRxX3R5cGVdOworCisJcmV0dXJuIGNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkgJiYKKwkgICAgKGluZm8tPmRxaV9mb3JtYXQtPnFmX2ZtdF9pZCAhPSBRRk1UX1ZGU19PTEQgfHwgIShpbmZvLT5kcWlfZmxhZ3MgJiBWMV9EUUZfUlNRVUFTSCkpOworfQorCisvKiBuZWVkcyBkcV9kYXRhX2xvY2sgKi8KK3N0YXRpYyBpbnQgY2hlY2tfaWRxKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHVsb25nIGlub2RlcywgY2hhciAqd2FybnR5cGUpCit7CisJKndhcm50eXBlID0gTk9XQVJOOworCWlmIChpbm9kZXMgPD0gMCB8fCB0ZXN0X2JpdChEUV9GQUtFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKQorCQlyZXR1cm4gUVVPVEFfT0s7CisKKwlpZiAoZHF1b3QtPmRxX2RxYi5kcWJfaWhhcmRsaW1pdCAmJgorCSAgIChkcXVvdC0+ZHFfZHFiLmRxYl9jdXJpbm9kZXMgKyBpbm9kZXMpID4gZHF1b3QtPmRxX2RxYi5kcWJfaWhhcmRsaW1pdCAmJgorICAgICAgICAgICAgIWlnbm9yZV9oYXJkbGltaXQoZHF1b3QpKSB7CisJCSp3YXJudHlwZSA9IElIQVJEV0FSTjsKKwkJcmV0dXJuIE5PX1FVT1RBOworCX0KKworCWlmIChkcXVvdC0+ZHFfZHFiLmRxYl9pc29mdGxpbWl0ICYmCisJICAgKGRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlcyArIGlub2RlcykgPiBkcXVvdC0+ZHFfZHFiLmRxYl9pc29mdGxpbWl0ICYmCisJICAgIGRxdW90LT5kcV9kcWIuZHFiX2l0aW1lICYmIGdldF9zZWNvbmRzKCkgPj0gZHF1b3QtPmRxX2RxYi5kcWJfaXRpbWUgJiYKKyAgICAgICAgICAgICFpZ25vcmVfaGFyZGxpbWl0KGRxdW90KSkgeworCQkqd2FybnR5cGUgPSBJU09GVExPTkdXQVJOOworCQlyZXR1cm4gTk9fUVVPVEE7CisJfQorCisJaWYgKGRxdW90LT5kcV9kcWIuZHFiX2lzb2Z0bGltaXQgJiYKKwkgICAoZHF1b3QtPmRxX2RxYi5kcWJfY3VyaW5vZGVzICsgaW5vZGVzKSA+IGRxdW90LT5kcV9kcWIuZHFiX2lzb2Z0bGltaXQgJiYKKwkgICAgZHF1b3QtPmRxX2RxYi5kcWJfaXRpbWUgPT0gMCkgeworCQkqd2FybnR5cGUgPSBJU09GVFdBUk47CisJCWRxdW90LT5kcV9kcWIuZHFiX2l0aW1lID0gZ2V0X3NlY29uZHMoKSArIHNiX2Rxb3B0KGRxdW90LT5kcV9zYiktPmluZm9bZHF1b3QtPmRxX3R5cGVdLmRxaV9pZ3JhY2U7CisJfQorCisJcmV0dXJuIFFVT1RBX09LOworfQorCisvKiBuZWVkcyBkcV9kYXRhX2xvY2sgKi8KK3N0YXRpYyBpbnQgY2hlY2tfYmRxKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHFzaXplX3Qgc3BhY2UsIGludCBwcmVhbGxvYywgY2hhciAqd2FybnR5cGUpCit7CisJKndhcm50eXBlID0gMDsKKwlpZiAoc3BhY2UgPD0gMCB8fCB0ZXN0X2JpdChEUV9GQUtFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKQorCQlyZXR1cm4gUVVPVEFfT0s7CisKKwlpZiAoZHF1b3QtPmRxX2RxYi5kcWJfYmhhcmRsaW1pdCAmJgorCSAgIHRvcWIoZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgKyBzcGFjZSkgPiBkcXVvdC0+ZHFfZHFiLmRxYl9iaGFyZGxpbWl0ICYmCisgICAgICAgICAgICAhaWdub3JlX2hhcmRsaW1pdChkcXVvdCkpIHsKKwkJaWYgKCFwcmVhbGxvYykKKwkJCSp3YXJudHlwZSA9IEJIQVJEV0FSTjsKKwkJcmV0dXJuIE5PX1FVT1RBOworCX0KKworCWlmIChkcXVvdC0+ZHFfZHFiLmRxYl9ic29mdGxpbWl0ICYmCisJICAgdG9xYihkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSArIHNwYWNlKSA+IGRxdW90LT5kcV9kcWIuZHFiX2Jzb2Z0bGltaXQgJiYKKwkgICAgZHF1b3QtPmRxX2RxYi5kcWJfYnRpbWUgJiYgZ2V0X3NlY29uZHMoKSA+PSBkcXVvdC0+ZHFfZHFiLmRxYl9idGltZSAmJgorICAgICAgICAgICAgIWlnbm9yZV9oYXJkbGltaXQoZHF1b3QpKSB7CisJCWlmICghcHJlYWxsb2MpCisJCQkqd2FybnR5cGUgPSBCU09GVExPTkdXQVJOOworCQlyZXR1cm4gTk9fUVVPVEE7CisJfQorCisJaWYgKGRxdW90LT5kcV9kcWIuZHFiX2Jzb2Z0bGltaXQgJiYKKwkgICB0b3FiKGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlICsgc3BhY2UpID4gZHF1b3QtPmRxX2RxYi5kcWJfYnNvZnRsaW1pdCAmJgorCSAgICBkcXVvdC0+ZHFfZHFiLmRxYl9idGltZSA9PSAwKSB7CisJCWlmICghcHJlYWxsb2MpIHsKKwkJCSp3YXJudHlwZSA9IEJTT0ZUV0FSTjsKKwkJCWRxdW90LT5kcV9kcWIuZHFiX2J0aW1lID0gZ2V0X3NlY29uZHMoKSArIHNiX2Rxb3B0KGRxdW90LT5kcV9zYiktPmluZm9bZHF1b3QtPmRxX3R5cGVdLmRxaV9iZ3JhY2U7CisJCX0KKwkJZWxzZQorCQkJLyoKKwkJCSAqIFdlIGRvbid0IGFsbG93IHByZWFsbG9jYXRpb24gdG8gZXhjZWVkIHNvZnRsaW1pdCBzbyBleGNlZWRpbmcgd2lsbAorCQkJICogYmUgYWx3YXlzIHByaW50ZWQKKwkJCSAqLworCQkJcmV0dXJuIE5PX1FVT1RBOworCX0KKworCXJldHVybiBRVU9UQV9PSzsKK30KKworLyoKKyAqCUluaXRpYWxpemUgcXVvdGEgcG9pbnRlcnMgaW4gaW5vZGUKKyAqCVRyYW5zYWN0aW9uIG11c3QgYmUgc3RhcnRlZCBhdCBlbnRyeQorICovCitpbnQgZHF1b3RfaW5pdGlhbGl6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKK3sKKwl1bnNpZ25lZCBpbnQgaWQgPSAwOworCWludCBjbnQsIHJldCA9IDA7CisKKwkvKiBGaXJzdCB0ZXN0IGJlZm9yZSBhY3F1aXJpbmcgc2VtYXBob3JlIC0gc29sdmVzIGRlYWRsb2NrcyB3aGVuIHdlCisgICAgICAgICAqIHJlLWVudGVyIHRoZSBxdW90YSBjb2RlIGFuZCBhcmUgYWxyZWFkeSBob2xkaW5nIHRoZSBzZW1hcGhvcmUgKi8KKwlpZiAoSVNfTk9RVU9UQShpbm9kZSkpCisJCXJldHVybiAwOworCWRvd25fd3JpdGUoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKKwkvKiBIYXZpbmcgZHFwdHJfc2VtIHdlIGtub3cgTk9RVU9UQSBmbGFncyBjYW4ndCBiZSBhbHRlcmVkLi4uICovCisJaWYgKElTX05PUVVPVEEoaW5vZGUpKQorCQlnb3RvIG91dF9lcnI7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKSB7CisJCWlmICh0eXBlICE9IC0xICYmIGNudCAhPSB0eXBlKQorCQkJY29udGludWU7CisJCWlmIChpbm9kZS0+aV9kcXVvdFtjbnRdID09IE5PRFFVT1QpIHsKKwkJCXN3aXRjaCAoY250KSB7CisJCQkJY2FzZSBVU1JRVU9UQToKKwkJCQkJaWQgPSBpbm9kZS0+aV91aWQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgR1JQUVVPVEE6CisJCQkJCWlkID0gaW5vZGUtPmlfZ2lkOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWlub2RlLT5pX2RxdW90W2NudF0gPSBkcWdldChpbm9kZS0+aV9zYiwgaWQsIGNudCk7CisJCX0KKwl9CitvdXRfZXJyOgorCXVwX3dyaXRlKCZzYl9kcW9wdChpbm9kZS0+aV9zYiktPmRxcHRyX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIAlSZWxlYXNlIGFsbCBxdW90YXMgcmVmZXJlbmNlZCBieSBpbm9kZQorICoJVHJhbnNhY3Rpb24gbXVzdCBiZSBzdGFydGVkIGF0IGFuIGVudHJ5CisgKi8KK2ludCBkcXVvdF9kcm9wKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGNudDsKKworCWRvd25fd3JpdGUoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspIHsKKwkJaWYgKGlub2RlLT5pX2RxdW90W2NudF0gIT0gTk9EUVVPVCkgeworCQkJZHFwdXQoaW5vZGUtPmlfZHF1b3RbY250XSk7CisJCQlpbm9kZS0+aV9kcXVvdFtjbnRdID0gTk9EUVVPVDsKKwkJfQorCX0KKwl1cF93cml0ZSgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOworCXJldHVybiAwOworfQorCisvKgorICogRm9sbG93aW5nIGZvdXIgZnVuY3Rpb25zIHVwZGF0ZSBpX2Jsb2NrcytpX2J5dGVzIGZpZWxkcyBhbmQKKyAqIHF1b3RhIGluZm9ybWF0aW9uICh0b2dldGhlciB3aXRoIGFwcHJvcHJpYXRlIGNoZWNrcykKKyAqIE5PVEU6IFdlIGFic29sdXRlbHkgcmVseSBvbiB0aGUgZmFjdCB0aGF0IGNhbGxlciBkaXJ0aWVzCisgKiB0aGUgaW5vZGUgKHVzdWFsbHkgbWFjcm9zIGluIHF1b3Rhb3BzLmggY2FyZSBhYm91dCB0aGlzKSBhbmQKKyAqIGhvbGRzIGEgaGFuZGxlIGZvciB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBzbyB0aGF0IGRxdW90IHdyaXRlIGFuZAorICogaW5vZGUgd3JpdGUgZ28gaW50byB0aGUgc2FtZSB0cmFuc2FjdGlvbi4KKyAqLworCisvKgorICogVGhpcyBvcGVyYXRpb24gY2FuIGJsb2NrLCBidXQgb25seSBhZnRlciBldmVyeXRoaW5nIGlzIHVwZGF0ZWQKKyAqLworaW50IGRxdW90X2FsbG9jX3NwYWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHFzaXplX3QgbnVtYmVyLCBpbnQgd2FybikKK3sKKwlpbnQgY250LCByZXQgPSBOT19RVU9UQTsKKwljaGFyIHdhcm50eXBlW01BWFFVT1RBU107CisKKwkvKiBGaXJzdCB0ZXN0IGJlZm9yZSBhY3F1aXJpbmcgc2VtYXBob3JlIC0gc29sdmVzIGRlYWRsb2NrcyB3aGVuIHdlCisgICAgICAgICAqIHJlLWVudGVyIHRoZSBxdW90YSBjb2RlIGFuZCBhcmUgYWxyZWFkeSBob2xkaW5nIHRoZSBzZW1hcGhvcmUgKi8KKwlpZiAoSVNfTk9RVU9UQShpbm9kZSkpIHsKK291dF9hZGQ6CisJCWlub2RlX2FkZF9ieXRlcyhpbm9kZSwgbnVtYmVyKTsKKwkJcmV0dXJuIFFVT1RBX09LOworCX0KKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspCisJCXdhcm50eXBlW2NudF0gPSBOT1dBUk47CisKKwlkb3duX3JlYWQoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKKwlpZiAoSVNfTk9RVU9UQShpbm9kZSkpIHsJLyogTm93IHdlIGNhbiBkbyByZWxpYWJsZSB0ZXN0Li4uICovCisJCXVwX3JlYWQoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKKwkJZ290byBvdXRfYWRkOworCX0KKwlzcGluX2xvY2soJmRxX2RhdGFfbG9jayk7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKSB7CisJCWlmIChpbm9kZS0+aV9kcXVvdFtjbnRdID09IE5PRFFVT1QpCisJCQljb250aW51ZTsKKwkJaWYgKGNoZWNrX2JkcShpbm9kZS0+aV9kcXVvdFtjbnRdLCBudW1iZXIsIHdhcm4sIHdhcm50eXBlK2NudCkgPT0gTk9fUVVPVEEpCisJCQlnb3RvIHdhcm5fcHV0X2FsbDsKKwl9CisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKSB7CisJCWlmIChpbm9kZS0+aV9kcXVvdFtjbnRdID09IE5PRFFVT1QpCisJCQljb250aW51ZTsKKwkJZHF1b3RfaW5jcl9zcGFjZShpbm9kZS0+aV9kcXVvdFtjbnRdLCBudW1iZXIpOworCX0KKwlpbm9kZV9hZGRfYnl0ZXMoaW5vZGUsIG51bWJlcik7CisJcmV0ID0gUVVPVEFfT0s7Cit3YXJuX3B1dF9hbGw6CisJc3Bpbl91bmxvY2soJmRxX2RhdGFfbG9jayk7CisJaWYgKHJldCA9PSBRVU9UQV9PSykKKwkJLyogRGlydGlmeSBhbGwgdGhlIGRxdW90cyAtIHRoaXMgY2FuIGJsb2NrIHdoZW4gam91cm5hbGxpbmcgKi8KKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKQorCQkJaWYgKGlub2RlLT5pX2RxdW90W2NudF0pCisJCQkJbWFya19kcXVvdF9kaXJ0eShpbm9kZS0+aV9kcXVvdFtjbnRdKTsKKwlmbHVzaF93YXJuaW5ncyhpbm9kZS0+aV9kcXVvdCwgd2FybnR5cGUpOworCXVwX3JlYWQoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyBvcGVyYXRpb24gY2FuIGJsb2NrLCBidXQgb25seSBhZnRlciBldmVyeXRoaW5nIGlzIHVwZGF0ZWQKKyAqLworaW50IGRxdW90X2FsbG9jX2lub2RlKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgbnVtYmVyKQoreworCWludCBjbnQsIHJldCA9IE5PX1FVT1RBOworCWNoYXIgd2FybnR5cGVbTUFYUVVPVEFTXTsKKworCS8qIEZpcnN0IHRlc3QgYmVmb3JlIGFjcXVpcmluZyBzZW1hcGhvcmUgLSBzb2x2ZXMgZGVhZGxvY2tzIHdoZW4gd2UKKyAgICAgICAgICogcmUtZW50ZXIgdGhlIHF1b3RhIGNvZGUgYW5kIGFyZSBhbHJlYWR5IGhvbGRpbmcgdGhlIHNlbWFwaG9yZSAqLworCWlmIChJU19OT1FVT1RBKGlub2RlKSkKKwkJcmV0dXJuIFFVT1RBX09LOworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykKKwkJd2FybnR5cGVbY250XSA9IE5PV0FSTjsKKwlkb3duX3JlYWQoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKKwlpZiAoSVNfTk9RVU9UQShpbm9kZSkpIHsKKwkJdXBfcmVhZCgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOworCQlyZXR1cm4gUVVPVEFfT0s7CisJfQorCXNwaW5fbG9jaygmZHFfZGF0YV9sb2NrKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspIHsKKwkJaWYgKGlub2RlLT5pX2RxdW90W2NudF0gPT0gTk9EUVVPVCkKKwkJCWNvbnRpbnVlOworCQlpZiAoY2hlY2tfaWRxKGlub2RlLT5pX2RxdW90W2NudF0sIG51bWJlciwgd2FybnR5cGUrY250KSA9PSBOT19RVU9UQSkKKwkJCWdvdG8gd2Fybl9wdXRfYWxsOworCX0KKworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgeworCQlpZiAoaW5vZGUtPmlfZHF1b3RbY250XSA9PSBOT0RRVU9UKQorCQkJY29udGludWU7CisJCWRxdW90X2luY3JfaW5vZGVzKGlub2RlLT5pX2RxdW90W2NudF0sIG51bWJlcik7CisJfQorCXJldCA9IFFVT1RBX09LOword2Fybl9wdXRfYWxsOgorCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOworCWlmIChyZXQgPT0gUVVPVEFfT0spCisJCS8qIERpcnRpZnkgYWxsIHRoZSBkcXVvdHMgLSB0aGlzIGNhbiBibG9jayB3aGVuIGpvdXJuYWxsaW5nICovCisJCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykKKwkJCWlmIChpbm9kZS0+aV9kcXVvdFtjbnRdKQorCQkJCW1hcmtfZHF1b3RfZGlydHkoaW5vZGUtPmlfZHF1b3RbY250XSk7CisJZmx1c2hfd2FybmluZ3MoKHN0cnVjdCBkcXVvdCAqKilpbm9kZS0+aV9kcXVvdCwgd2FybnR5cGUpOworCXVwX3JlYWQoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyBvcGVyYXRpb24gY2FuIGJsb2NrLCBidXQgb25seSBhZnRlciBldmVyeXRoaW5nIGlzIHVwZGF0ZWQKKyAqLworaW50IGRxdW90X2ZyZWVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgcXNpemVfdCBudW1iZXIpCit7CisJdW5zaWduZWQgaW50IGNudDsKKworCS8qIEZpcnN0IHRlc3QgYmVmb3JlIGFjcXVpcmluZyBzZW1hcGhvcmUgLSBzb2x2ZXMgZGVhZGxvY2tzIHdoZW4gd2UKKyAgICAgICAgICogcmUtZW50ZXIgdGhlIHF1b3RhIGNvZGUgYW5kIGFyZSBhbHJlYWR5IGhvbGRpbmcgdGhlIHNlbWFwaG9yZSAqLworCWlmIChJU19OT1FVT1RBKGlub2RlKSkgeworb3V0X3N1YjoKKwkJaW5vZGVfc3ViX2J5dGVzKGlub2RlLCBudW1iZXIpOworCQlyZXR1cm4gUVVPVEFfT0s7CisJfQorCWRvd25fcmVhZCgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOworCS8qIE5vdyByZWNoZWNrIHJlbGlhYmx5IHdoZW4gaG9sZGluZyBkcXB0cl9zZW0gKi8KKwlpZiAoSVNfTk9RVU9UQShpbm9kZSkpIHsKKwkJdXBfcmVhZCgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOworCQlnb3RvIG91dF9zdWI7CisJfQorCXNwaW5fbG9jaygmZHFfZGF0YV9sb2NrKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspIHsKKwkJaWYgKGlub2RlLT5pX2RxdW90W2NudF0gPT0gTk9EUVVPVCkKKwkJCWNvbnRpbnVlOworCQlkcXVvdF9kZWNyX3NwYWNlKGlub2RlLT5pX2RxdW90W2NudF0sIG51bWJlcik7CisJfQorCWlub2RlX3N1Yl9ieXRlcyhpbm9kZSwgbnVtYmVyKTsKKwlzcGluX3VubG9jaygmZHFfZGF0YV9sb2NrKTsKKwkvKiBEaXJ0aWZ5IGFsbCB0aGUgZHF1b3RzIC0gdGhpcyBjYW4gYmxvY2sgd2hlbiBqb3VybmFsbGluZyAqLworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykKKwkJaWYgKGlub2RlLT5pX2RxdW90W2NudF0pCisJCQltYXJrX2RxdW90X2RpcnR5KGlub2RlLT5pX2RxdW90W2NudF0pOworCXVwX3JlYWQoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKKwlyZXR1cm4gUVVPVEFfT0s7Cit9CisKKy8qCisgKiBUaGlzIG9wZXJhdGlvbiBjYW4gYmxvY2ssIGJ1dCBvbmx5IGFmdGVyIGV2ZXJ5dGhpbmcgaXMgdXBkYXRlZAorICovCitpbnQgZHF1b3RfZnJlZV9pbm9kZShjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIG51bWJlcikKK3sKKwl1bnNpZ25lZCBpbnQgY250OworCisJLyogRmlyc3QgdGVzdCBiZWZvcmUgYWNxdWlyaW5nIHNlbWFwaG9yZSAtIHNvbHZlcyBkZWFkbG9ja3Mgd2hlbiB3ZQorICAgICAgICAgKiByZS1lbnRlciB0aGUgcXVvdGEgY29kZSBhbmQgYXJlIGFscmVhZHkgaG9sZGluZyB0aGUgc2VtYXBob3JlICovCisJaWYgKElTX05PUVVPVEEoaW5vZGUpKQorCQlyZXR1cm4gUVVPVEFfT0s7CisJZG93bl9yZWFkKCZzYl9kcW9wdChpbm9kZS0+aV9zYiktPmRxcHRyX3NlbSk7CisJLyogTm93IHJlY2hlY2sgcmVsaWFibHkgd2hlbiBob2xkaW5nIGRxcHRyX3NlbSAqLworCWlmIChJU19OT1FVT1RBKGlub2RlKSkgeworCQl1cF9yZWFkKCZzYl9kcW9wdChpbm9kZS0+aV9zYiktPmRxcHRyX3NlbSk7CisJCXJldHVybiBRVU9UQV9PSzsKKwl9CisJc3Bpbl9sb2NrKCZkcV9kYXRhX2xvY2spOworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgeworCQlpZiAoaW5vZGUtPmlfZHF1b3RbY250XSA9PSBOT0RRVU9UKQorCQkJY29udGludWU7CisJCWRxdW90X2RlY3JfaW5vZGVzKGlub2RlLT5pX2RxdW90W2NudF0sIG51bWJlcik7CisJfQorCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOworCS8qIERpcnRpZnkgYWxsIHRoZSBkcXVvdHMgLSB0aGlzIGNhbiBibG9jayB3aGVuIGpvdXJuYWxsaW5nICovCisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKQorCQlpZiAoaW5vZGUtPmlfZHF1b3RbY250XSkKKwkJCW1hcmtfZHF1b3RfZGlydHkoaW5vZGUtPmlfZHF1b3RbY250XSk7CisJdXBfcmVhZCgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOworCXJldHVybiBRVU9UQV9PSzsKK30KKworLyoKKyAqIFRyYW5zZmVyIHRoZSBudW1iZXIgb2YgaW5vZGUgYW5kIGJsb2NrcyBmcm9tIG9uZSBkaXNrcXVvdGEgdG8gYW4gb3RoZXIuCisgKgorICogVGhpcyBvcGVyYXRpb24gY2FuIGJsb2NrLCBidXQgb25seSBhZnRlciBldmVyeXRoaW5nIGlzIHVwZGF0ZWQKKyAqIEEgdHJhbnNhY3Rpb24gbXVzdCBiZSBzdGFydGVkIHdoZW4gZW50ZXJpbmcgdGhpcyBmdW5jdGlvbi4KKyAqLworaW50IGRxdW90X3RyYW5zZmVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpYXR0ciAqaWF0dHIpCit7CisJcXNpemVfdCBzcGFjZTsKKwlzdHJ1Y3QgZHF1b3QgKnRyYW5zZmVyX2Zyb21bTUFYUVVPVEFTXTsKKwlzdHJ1Y3QgZHF1b3QgKnRyYW5zZmVyX3RvW01BWFFVT1RBU107CisJaW50IGNudCwgcmV0ID0gTk9fUVVPVEEsIGNodWlkID0gKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKSAmJiBpbm9kZS0+aV91aWQgIT0gaWF0dHItPmlhX3VpZCwKKwkgICAgY2hnaWQgPSAoaWF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpICYmIGlub2RlLT5pX2dpZCAhPSBpYXR0ci0+aWFfZ2lkOworCWNoYXIgd2FybnR5cGVbTUFYUVVPVEFTXTsKKworCS8qIEZpcnN0IHRlc3QgYmVmb3JlIGFjcXVpcmluZyBzZW1hcGhvcmUgLSBzb2x2ZXMgZGVhZGxvY2tzIHdoZW4gd2UKKyAgICAgICAgICogcmUtZW50ZXIgdGhlIHF1b3RhIGNvZGUgYW5kIGFyZSBhbHJlYWR5IGhvbGRpbmcgdGhlIHNlbWFwaG9yZSAqLworCWlmIChJU19OT1FVT1RBKGlub2RlKSkKKwkJcmV0dXJuIFFVT1RBX09LOworCS8qIENsZWFyIHRoZSBhcnJheXMgKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspIHsKKwkJdHJhbnNmZXJfdG9bY250XSA9IHRyYW5zZmVyX2Zyb21bY250XSA9IE5PRFFVT1Q7CisJCXdhcm50eXBlW2NudF0gPSBOT1dBUk47CisJfQorCWRvd25fd3JpdGUoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKKwkvKiBOb3cgcmVjaGVjayByZWxpYWJseSB3aGVuIGhvbGRpbmcgZHFwdHJfc2VtICovCisJaWYgKElTX05PUVVPVEEoaW5vZGUpKSB7CS8qIEZpbGUgd2l0aG91dCBxdW90YSBhY2NvdW50aW5nPyAqLworCQl1cF93cml0ZSgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOworCQlyZXR1cm4gUVVPVEFfT0s7CisJfQorCS8qIEZpcnN0IGJ1aWxkIHRoZSB0cmFuc2Zlcl90byBsaXN0IC0gaGVyZSB3ZSBjYW4gYmxvY2sgb24KKwkgKiByZWFkaW5nL2luc3RhbnRpYXRpbmcgb2YgZHF1b3RzLiAgV2Uga25vdyB0aGF0IHRoZSB0cmFuc2FjdGlvbiBmb3IKKwkgKiB1cyB3YXMgYWxyZWFkeSBzdGFydGVkIHNvIHdlIGRvbid0IHZpb2xhdGUgbG9jayByYW5raW5nIGhlcmUgKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspIHsKKwkJc3dpdGNoIChjbnQpIHsKKwkJCWNhc2UgVVNSUVVPVEE6CisJCQkJaWYgKCFjaHVpZCkKKwkJCQkJY29udGludWU7CisJCQkJdHJhbnNmZXJfdG9bY250XSA9IGRxZ2V0KGlub2RlLT5pX3NiLCBpYXR0ci0+aWFfdWlkLCBjbnQpOworCQkJCWJyZWFrOworCQkJY2FzZSBHUlBRVU9UQToKKwkJCQlpZiAoIWNoZ2lkKQorCQkJCQljb250aW51ZTsKKwkJCQl0cmFuc2Zlcl90b1tjbnRdID0gZHFnZXQoaW5vZGUtPmlfc2IsIGlhdHRyLT5pYV9naWQsIGNudCk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl9sb2NrKCZkcV9kYXRhX2xvY2spOworCXNwYWNlID0gaW5vZGVfZ2V0X2J5dGVzKGlub2RlKTsKKwkvKiBCdWlsZCB0aGUgdHJhbnNmZXJfZnJvbSBsaXN0IGFuZCBjaGVjayB0aGUgbGltaXRzICovCisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKSB7CisJCWlmICh0cmFuc2Zlcl90b1tjbnRdID09IE5PRFFVT1QpCisJCQljb250aW51ZTsKKwkJdHJhbnNmZXJfZnJvbVtjbnRdID0gaW5vZGUtPmlfZHF1b3RbY250XTsKKwkJaWYgKGNoZWNrX2lkcSh0cmFuc2Zlcl90b1tjbnRdLCAxLCB3YXJudHlwZStjbnQpID09IE5PX1FVT1RBIHx8CisJCSAgICBjaGVja19iZHEodHJhbnNmZXJfdG9bY250XSwgc3BhY2UsIDAsIHdhcm50eXBlK2NudCkgPT0gTk9fUVVPVEEpCisJCQlnb3RvIHdhcm5fcHV0X2FsbDsKKwl9CisKKwkvKgorCSAqIEZpbmFsbHkgcGVyZm9ybSB0aGUgbmVlZGVkIHRyYW5zZmVyIGZyb20gdHJhbnNmZXJfZnJvbSB0byB0cmFuc2Zlcl90bworCSAqLworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgeworCQkvKgorCQkgKiBTa2lwIGNoYW5nZXMgZm9yIHNhbWUgdWlkIG9yIGdpZCBvciBmb3IgdHVybmVkIG9mZiBxdW90YS10eXBlLgorCQkgKi8KKwkJaWYgKHRyYW5zZmVyX3RvW2NudF0gPT0gTk9EUVVPVCkKKwkJCWNvbnRpbnVlOworCisJCS8qIER1ZSB0byBJTyBlcnJvciB3ZSBtaWdodCBub3QgaGF2ZSB0cmFuc2Zlcl9mcm9tW10gc3RydWN0dXJlICovCisJCWlmICh0cmFuc2Zlcl9mcm9tW2NudF0pIHsKKwkJCWRxdW90X2RlY3JfaW5vZGVzKHRyYW5zZmVyX2Zyb21bY250XSwgMSk7CisJCQlkcXVvdF9kZWNyX3NwYWNlKHRyYW5zZmVyX2Zyb21bY250XSwgc3BhY2UpOworCQl9CisKKwkJZHF1b3RfaW5jcl9pbm9kZXModHJhbnNmZXJfdG9bY250XSwgMSk7CisJCWRxdW90X2luY3Jfc3BhY2UodHJhbnNmZXJfdG9bY250XSwgc3BhY2UpOworCisJCWlub2RlLT5pX2RxdW90W2NudF0gPSB0cmFuc2Zlcl90b1tjbnRdOworCX0KKwlyZXQgPSBRVU9UQV9PSzsKK3dhcm5fcHV0X2FsbDoKKwlzcGluX3VubG9jaygmZHFfZGF0YV9sb2NrKTsKKwkvKiBEaXJ0aWZ5IGFsbCB0aGUgZHF1b3RzIC0gdGhpcyBjYW4gYmxvY2sgd2hlbiBqb3VybmFsbGluZyAqLworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgeworCQlpZiAodHJhbnNmZXJfZnJvbVtjbnRdKQorCQkJbWFya19kcXVvdF9kaXJ0eSh0cmFuc2Zlcl9mcm9tW2NudF0pOworCQlpZiAodHJhbnNmZXJfdG9bY250XSkKKwkJCW1hcmtfZHF1b3RfZGlydHkodHJhbnNmZXJfdG9bY250XSk7CisJfQorCWZsdXNoX3dhcm5pbmdzKHRyYW5zZmVyX3RvLCB3YXJudHlwZSk7CisJCisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKSB7CisJCWlmIChyZXQgPT0gUVVPVEFfT0sgJiYgdHJhbnNmZXJfZnJvbVtjbnRdICE9IE5PRFFVT1QpCisJCQlkcXB1dCh0cmFuc2Zlcl9mcm9tW2NudF0pOworCQlpZiAocmV0ID09IE5PX1FVT1RBICYmIHRyYW5zZmVyX3RvW2NudF0gIT0gTk9EUVVPVCkKKwkJCWRxcHV0KHRyYW5zZmVyX3RvW2NudF0pOworCX0KKwl1cF93cml0ZSgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBXcml0ZSBpbmZvIG9mIHF1b3RhIGZpbGUgdG8gZGlzaworICovCitpbnQgZHF1b3RfY29tbWl0X2luZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcXVvdGFfaW5mbyAqZHFvcHQgPSBzYl9kcW9wdChzYik7CisKKwlkb3duKCZkcW9wdC0+ZHFpb19zZW0pOworCXJldCA9IGRxb3B0LT5vcHNbdHlwZV0tPndyaXRlX2ZpbGVfaW5mbyhzYiwgdHlwZSk7CisJdXAoJmRxb3B0LT5kcWlvX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIERlZmluaXRpb25zIG9mIGRpc2txdW90YSBvcGVyYXRpb25zLgorICovCitzdHJ1Y3QgZHF1b3Rfb3BlcmF0aW9ucyBkcXVvdF9vcGVyYXRpb25zID0geworCS5pbml0aWFsaXplCT0gZHF1b3RfaW5pdGlhbGl6ZSwKKwkuZHJvcAkJPSBkcXVvdF9kcm9wLAorCS5hbGxvY19zcGFjZQk9IGRxdW90X2FsbG9jX3NwYWNlLAorCS5hbGxvY19pbm9kZQk9IGRxdW90X2FsbG9jX2lub2RlLAorCS5mcmVlX3NwYWNlCT0gZHF1b3RfZnJlZV9zcGFjZSwKKwkuZnJlZV9pbm9kZQk9IGRxdW90X2ZyZWVfaW5vZGUsCisJLnRyYW5zZmVyCT0gZHF1b3RfdHJhbnNmZXIsCisJLndyaXRlX2RxdW90CT0gZHF1b3RfY29tbWl0LAorCS5hY3F1aXJlX2RxdW90CT0gZHF1b3RfYWNxdWlyZSwKKwkucmVsZWFzZV9kcXVvdAk9IGRxdW90X3JlbGVhc2UsCisJLm1hcmtfZGlydHkJPSBkcXVvdF9tYXJrX2RxdW90X2RpcnR5LAorCS53cml0ZV9pbmZvCT0gZHF1b3RfY29tbWl0X2luZm8KK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZW5hYmxlX2ZsYWdzKHN0cnVjdCBxdW90YV9pbmZvICpkcW9wdCwgaW50IHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgVVNSUVVPVEE6CisJCQlkcW9wdC0+ZmxhZ3MgfD0gRFFVT1RfVVNSX0VOQUJMRUQ7CisJCQlicmVhazsKKwkJY2FzZSBHUlBRVU9UQToKKwkJCWRxb3B0LT5mbGFncyB8PSBEUVVPVF9HUlBfRU5BQkxFRDsKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc2V0X2VuYWJsZV9mbGFncyhzdHJ1Y3QgcXVvdGFfaW5mbyAqZHFvcHQsIGludCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFVTUlFVT1RBOgorCQkJZHFvcHQtPmZsYWdzICY9IH5EUVVPVF9VU1JfRU5BQkxFRDsKKwkJCWJyZWFrOworCQljYXNlIEdSUFFVT1RBOgorCQkJZHFvcHQtPmZsYWdzICY9IH5EUVVPVF9HUlBfRU5BQkxFRDsKKwkJCWJyZWFrOworCX0KK30KKworLyoKKyAqIFR1cm4gcXVvdGEgb2ZmIG9uIGEgZGV2aWNlLiB0eXBlID09IC0xID09PiBxdW90YW9mZiBmb3IgYWxsIHR5cGVzICh1bW91bnQpCisgKi8KK2ludCB2ZnNfcXVvdGFfb2ZmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCWludCBjbnQ7CisJc3RydWN0IHF1b3RhX2luZm8gKmRxb3B0ID0gc2JfZHFvcHQoc2IpOworCXN0cnVjdCBpbm9kZSAqdG9wdXRpbm9kZVtNQVhRVU9UQVNdOworCXN0cnVjdCB2ZnNtb3VudCAqdG9wdXRtbnRbTUFYUVVPVEFTXTsKKworCS8qIFdlIG5lZWQgdG8gc2VyaWFsaXplIHF1b3RhX29mZigpIGZvciBkZXZpY2UgKi8KKwlkb3duKCZkcW9wdC0+ZHFvbm9mZl9zZW0pOworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgeworCQl0b3B1dGlub2RlW2NudF0gPSBOVUxMOworCQl0b3B1dG1udFtjbnRdID0gTlVMTDsKKwkJaWYgKHR5cGUgIT0gLTEgJiYgY250ICE9IHR5cGUpCisJCQljb250aW51ZTsKKwkJaWYgKCFzYl9oYXNfcXVvdGFfZW5hYmxlZChzYiwgY250KSkKKwkJCWNvbnRpbnVlOworCQlyZXNldF9lbmFibGVfZmxhZ3MoZHFvcHQsIGNudCk7CisKKwkJLyogTm90ZTogdGhlc2UgYXJlIGJsb2NraW5nIG9wZXJhdGlvbnMgKi8KKwkJZHJvcF9kcXVvdF9yZWYoc2IsIGNudCk7CisJCWludmFsaWRhdGVfZHF1b3RzKHNiLCBjbnQpOworCQkvKgorCQkgKiBOb3cgYWxsIGRxdW90cyBzaG91bGQgYmUgaW52YWxpZGF0ZWQsIGFsbCB3cml0ZXMgZG9uZSBzbyB3ZSBzaG91bGQgYmUgb25seQorCQkgKiB1c2VycyBvZiB0aGUgaW5mby4gTm8gbG9ja3MgbmVlZGVkLgorCQkgKi8KKwkJaWYgKGluZm9fZGlydHkoJmRxb3B0LT5pbmZvW2NudF0pKQorCQkJc2ItPmRxX29wLT53cml0ZV9pbmZvKHNiLCBjbnQpOworCQlpZiAoZHFvcHQtPm9wc1tjbnRdLT5mcmVlX2ZpbGVfaW5mbykKKwkJCWRxb3B0LT5vcHNbY250XS0+ZnJlZV9maWxlX2luZm8oc2IsIGNudCk7CisJCXB1dF9xdW90YV9mb3JtYXQoZHFvcHQtPmluZm9bY250XS5kcWlfZm9ybWF0KTsKKworCQl0b3B1dGlub2RlW2NudF0gPSBkcW9wdC0+ZmlsZXNbY250XTsKKwkJdG9wdXRtbnRbY250XSA9IGRxb3B0LT5tbnRbY250XTsKKwkJZHFvcHQtPmZpbGVzW2NudF0gPSBOVUxMOworCQlkcW9wdC0+bW50W2NudF0gPSBOVUxMOworCQlkcW9wdC0+aW5mb1tjbnRdLmRxaV9mbGFncyA9IDA7CisJCWRxb3B0LT5pbmZvW2NudF0uZHFpX2lncmFjZSA9IDA7CisJCWRxb3B0LT5pbmZvW2NudF0uZHFpX2JncmFjZSA9IDA7CisJCWRxb3B0LT5vcHNbY250XSA9IE5VTEw7CisJfQorCXVwKCZkcW9wdC0+ZHFvbm9mZl9zZW0pOworCS8qIFN5bmMgdGhlIHN1cGVyYmxvY2sgc28gdGhhdCBidWZmZXJzIHdpdGggcXVvdGEgZGF0YSBhcmUgd3JpdHRlbiB0bworCSAqIGRpc2sgKGFuZCBzbyB1c2Vyc3BhY2Ugc2VlcyBjb3JyZWN0IGRhdGEgYWZ0ZXJ3YXJkcykuCisJICogVGhlIHJlZmVyZW5jZSB0byB2ZnNtbnQgd2UgYXJlIHN0aWxsIGhvbGRpbmcgcHJvdGVjdHMgdXMgZnJvbQorCSAqIHVtb3VudCAod2UgZG9uJ3QgaGF2ZSBpdCBvbmx5IHdoZW4gcXVvdGFzIGFyZSB0dXJuZWQgb24vb2ZmIGZvcgorCSAqIGpvdXJuYWwgcmVwbGF5IGJ1dCBpbiB0aGF0IGNhc2Ugd2UgYXJlIGd1YXJkZWQgYnkgdGhlIGZzIGFueXdheSkuICovCisJaWYgKHNiLT5zX29wLT5zeW5jX2ZzKQorCQlzYi0+c19vcC0+c3luY19mcyhzYiwgMSk7CisJc3luY19ibG9ja2RldihzYi0+c19iZGV2KTsKKwkvKiBOb3cgdGhlIHF1b3RhIGZpbGVzIGFyZSBqdXN0IG9yZGluYXJ5IGZpbGVzIGFuZCB3ZSBjYW4gc2V0IHRoZQorCSAqIGlub2RlIGZsYWdzIGJhY2suIE1vcmVvdmVyIHdlIGRpc2NhcmQgdGhlIHBhZ2VjYWNoZSBzbyB0aGF0CisJICogdXNlcnNwYWNlIHNlZXMgdGhlIHdyaXRlcyB3ZSBkaWQgYnlwYXNzaW5nIHRoZSBwYWdlY2FjaGUuIFdlCisJICogbXVzdCBhbHNvIGRpc2NhcmQgdGhlIGJsb2NrZGV2IGJ1ZmZlcnMgc28gdGhhdCB3ZSBzZWUgdGhlCisJICogY2hhbmdlcyBkb25lIGJ5IHVzZXJzcGFjZSBvbiB0aGUgbmV4dCBxdW90YW9uKCkgKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspCisJCWlmICh0b3B1dGlub2RlW2NudF0pIHsKKwkJCWRvd24oJmRxb3B0LT5kcW9ub2ZmX3NlbSk7CisJCQkvKiBJZiBxdW90YSB3YXMgcmVlbmFibGVkIGluIHRoZSBtZWFudGltZSwgd2UgaGF2ZQorCQkJICogbm90aGluZyB0byBkbyAqLworCQkJaWYgKCFzYl9oYXNfcXVvdGFfZW5hYmxlZChzYiwgY250KSkgeworCQkJCWRvd24oJnRvcHV0aW5vZGVbY250XS0+aV9zZW0pOworCQkJCXRvcHV0aW5vZGVbY250XS0+aV9mbGFncyAmPSB+KFNfSU1NVVRBQkxFIHwKKwkJCQkgIFNfTk9BVElNRSB8IFNfTk9RVU9UQSk7CisJCQkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJnRvcHV0aW5vZGVbY250XS0+aV9kYXRhLCAwKTsKKwkJCQl1cCgmdG9wdXRpbm9kZVtjbnRdLT5pX3NlbSk7CisJCQkJbWFya19pbm9kZV9kaXJ0eSh0b3B1dGlub2RlW2NudF0pOworCQkJCWlwdXQodG9wdXRpbm9kZVtjbnRdKTsKKwkJCX0KKwkJCXVwKCZkcW9wdC0+ZHFvbm9mZl9zZW0pOworCQkJLyogV2UgZG9uJ3QgaG9sZCB0aGUgcmVmZXJlbmNlIHdoZW4gd2UgdHVybmVkIG9uIHF1b3RhcworCQkJICoganVzdCBmb3IgdGhlIGpvdXJuYWwgcmVwbGF5Li4uICovCisJCQlpZiAodG9wdXRtbnRbY250XSkKKwkJCQltbnRwdXQodG9wdXRtbnRbY250XSk7CisJCX0KKwlpZiAoc2ItPnNfYmRldikKKwkJaW52YWxpZGF0ZV9iZGV2KHNiLT5zX2JkZXYsIDApOworCXJldHVybiAwOworfQorCisvKgorICoJVHVybiBxdW90YXMgb24gb24gYSBkZXZpY2UKKyAqLworCisvKiBIZWxwZXIgZnVuY3Rpb24gd2hlbiB3ZSBhbHJlYWR5IGhhdmUgdGhlIGlub2RlICovCitzdGF0aWMgaW50IHZmc19xdW90YV9vbl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwgaW50IGZvcm1hdF9pZCkKK3sKKwlzdHJ1Y3QgcXVvdGFfZm9ybWF0X3R5cGUgKmZtdCA9IGZpbmRfcXVvdGFfZm9ybWF0KGZvcm1hdF9pZCk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBxdW90YV9pbmZvICpkcW9wdCA9IHNiX2Rxb3B0KHNiKTsKKwlpbnQgZXJyb3I7CisJaW50IG9sZGZsYWdzID0gLTE7CisKKwlpZiAoIWZtdCkKKwkJcmV0dXJuIC1FU1JDSDsKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJZXJyb3IgPSAtRUFDQ0VTOworCQlnb3RvIG91dF9mbXQ7CisJfQorCWlmIChJU19SRE9OTFkoaW5vZGUpKSB7CisJCWVycm9yID0gLUVST0ZTOworCQlnb3RvIG91dF9mbXQ7CisJfQorCWlmICghc2ItPnNfb3AtPnF1b3RhX3dyaXRlIHx8ICFzYi0+c19vcC0+cXVvdGFfcmVhZCkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2ZtdDsKKwl9CisKKwkvKiBBcyB3ZSBieXBhc3MgdGhlIHBhZ2VjYWNoZSB3ZSBtdXN0IG5vdyBmbHVzaCB0aGUgaW5vZGUgc28gdGhhdAorCSAqIHdlIHNlZSBhbGwgdGhlIGNoYW5nZXMgZnJvbSB1c2Vyc3BhY2UuLi4gKi8KKwl3cml0ZV9pbm9kZV9ub3coaW5vZGUsIDEpOworCS8qIEFuZCBub3cgZmx1c2ggdGhlIGJsb2NrIGNhY2hlIHNvIHRoYXQga2VybmVsIHNlZXMgdGhlIGNoYW5nZXMgKi8KKwlpbnZhbGlkYXRlX2JkZXYoc2ItPnNfYmRldiwgMCk7CisJZG93bigmaW5vZGUtPmlfc2VtKTsKKwlkb3duKCZkcW9wdC0+ZHFvbm9mZl9zZW0pOworCWlmIChzYl9oYXNfcXVvdGFfZW5hYmxlZChzYiwgdHlwZSkpIHsKKwkJZXJyb3IgPSAtRUJVU1k7CisJCWdvdG8gb3V0X2xvY2s7CisJfQorCS8qIFdlIGRvbid0IHdhbnQgcXVvdGEgYW5kIGF0aW1lIG9uIHF1b3RhIGZpbGVzIChkZWFkbG9ja3MgcG9zc2libGUpCisJICogQWxzbyBub2JvZHkgc2hvdWxkIHdyaXRlIHRvIHRoZSBmaWxlIC0gd2UgdXNlIHNwZWNpYWwgSU8gb3BlcmF0aW9ucworCSAqIHdoaWNoIGlnbm9yZSB0aGUgaW1tdXRhYmxlIGJpdC4gKi8KKwlkb3duX3dyaXRlKCZkcW9wdC0+ZHFwdHJfc2VtKTsKKwlvbGRmbGFncyA9IGlub2RlLT5pX2ZsYWdzICYgKFNfTk9BVElNRSB8IFNfSU1NVVRBQkxFIHwgU19OT1FVT1RBKTsKKwlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEEgfCBTX05PQVRJTUUgfCBTX0lNTVVUQUJMRTsKKwl1cF93cml0ZSgmZHFvcHQtPmRxcHRyX3NlbSk7CisKKwllcnJvciA9IC1FSU87CisJZHFvcHQtPmZpbGVzW3R5cGVdID0gaWdyYWIoaW5vZGUpOworCWlmICghZHFvcHQtPmZpbGVzW3R5cGVdKQorCQlnb3RvIG91dF9sb2NrOworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoIWZtdC0+cWZfb3BzLT5jaGVja19xdW90YV9maWxlKHNiLCB0eXBlKSkKKwkJZ290byBvdXRfZmlsZV9pbml0OworCisJZHFvcHQtPm9wc1t0eXBlXSA9IGZtdC0+cWZfb3BzOworCWRxb3B0LT5pbmZvW3R5cGVdLmRxaV9mb3JtYXQgPSBmbXQ7CisJSU5JVF9MSVNUX0hFQUQoJmRxb3B0LT5pbmZvW3R5cGVdLmRxaV9kaXJ0eV9saXN0KTsKKwlkb3duKCZkcW9wdC0+ZHFpb19zZW0pOworCWlmICgoZXJyb3IgPSBkcW9wdC0+b3BzW3R5cGVdLT5yZWFkX2ZpbGVfaW5mbyhzYiwgdHlwZSkpIDwgMCkgeworCQl1cCgmZHFvcHQtPmRxaW9fc2VtKTsKKwkJZ290byBvdXRfZmlsZV9pbml0OworCX0KKwl1cCgmZHFvcHQtPmRxaW9fc2VtKTsKKwl1cCgmaW5vZGUtPmlfc2VtKTsKKwlzZXRfZW5hYmxlX2ZsYWdzKGRxb3B0LCB0eXBlKTsKKworCWFkZF9kcXVvdF9yZWYoc2IsIHR5cGUpOworCXVwKCZkcW9wdC0+ZHFvbm9mZl9zZW0pOworCisJcmV0dXJuIDA7CisKK291dF9maWxlX2luaXQ6CisJZHFvcHQtPmZpbGVzW3R5cGVdID0gTlVMTDsKKwlpcHV0KGlub2RlKTsKK291dF9sb2NrOgorCXVwKCZkcW9wdC0+ZHFvbm9mZl9zZW0pOworCWlmIChvbGRmbGFncyAhPSAtMSkgeworCQlkb3duX3dyaXRlKCZkcW9wdC0+ZHFwdHJfc2VtKTsKKwkJLyogU2V0IHRoZSBmbGFncyBiYWNrIChpbiB0aGUgY2FzZSBvZiBhY2NpZGVudGFsIHF1b3Rhb24oKQorCQkgKiBvbiBhIHdyb25nIGZpbGUgd2UgZG9uJ3Qgd2FudCB0byBtZXNzIHVwIHRoZSBmbGFncykgKi8KKwkJaW5vZGUtPmlfZmxhZ3MgJj0gfihTX05PQVRJTUUgfCBTX05PUVVPVEEgfCBTX0lNTVVUQUJMRSk7CisJCWlub2RlLT5pX2ZsYWdzIHw9IG9sZGZsYWdzOworCQl1cF93cml0ZSgmZHFvcHQtPmRxcHRyX3NlbSk7CisJfQorCXVwKCZpbm9kZS0+aV9zZW0pOworb3V0X2ZtdDoKKwlwdXRfcXVvdGFfZm9ybWF0KGZtdCk7CisKKwlyZXR1cm4gZXJyb3I7IAorfQorCisvKiBBY3R1YWwgZnVuY3Rpb24gY2FsbGVkIGZyb20gcXVvdGFjdGwoKSAqLworaW50IHZmc19xdW90YV9vbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgaW50IGZvcm1hdF9pZCwgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCBlcnJvcjsKKworCWVycm9yID0gcGF0aF9sb29rdXAocGF0aCwgTE9PS1VQX0ZPTExPVywgJm5kKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisJZXJyb3IgPSBzZWN1cml0eV9xdW90YV9vbihuZC5kZW50cnkpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfcGF0aDsKKwkvKiBRdW90YSBmaWxlIG5vdCBvbiB0aGUgc2FtZSBmaWxlc3lzdGVtPyAqLworCWlmIChuZC5tbnQtPm1udF9zYiAhPSBzYikKKwkJZXJyb3IgPSAtRVhERVY7CisJZWxzZSB7CisJCWVycm9yID0gdmZzX3F1b3RhX29uX2lub2RlKG5kLmRlbnRyeS0+ZF9pbm9kZSwgdHlwZSwgZm9ybWF0X2lkKTsKKwkJaWYgKCFlcnJvcikKKwkJCXNiX2Rxb3B0KHNiKS0+bW50W3R5cGVdID0gbW50Z2V0KG5kLm1udCk7CisJfQorb3V0X3BhdGg6CisJcGF0aF9yZWxlYXNlKCZuZCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gZmlsZXN5c3RlbSBuZWVkcyB0byBpbml0aWFsaXplIHF1b3RhcworICogZHVyaW5nIG1vdW50IHRpbWUuCisgKi8KK2ludCB2ZnNfcXVvdGFfb25fbW91bnQoaW50IHR5cGUsIGludCBmb3JtYXRfaWQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHNlY3VyaXR5X3F1b3RhX29uKGRlbnRyeSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIHZmc19xdW90YV9vbl9pbm9kZShkZW50cnktPmRfaW5vZGUsIHR5cGUsIGZvcm1hdF9pZCk7Cit9CisKKy8qIEdlbmVyaWMgcm91dGluZSBmb3IgZ2V0dGluZyBjb21tb24gcGFydCBvZiBxdW90YSBzdHJ1Y3R1cmUgKi8KK3N0YXRpYyB2b2lkIGRvX2dldF9kcWJsayhzdHJ1Y3QgZHF1b3QgKmRxdW90LCBzdHJ1Y3QgaWZfZHFibGsgKmRpKQoreworCXN0cnVjdCBtZW1fZHFibGsgKmRtID0gJmRxdW90LT5kcV9kcWI7CisKKwlzcGluX2xvY2soJmRxX2RhdGFfbG9jayk7CisJZGktPmRxYl9iaGFyZGxpbWl0ID0gZG0tPmRxYl9iaGFyZGxpbWl0OworCWRpLT5kcWJfYnNvZnRsaW1pdCA9IGRtLT5kcWJfYnNvZnRsaW1pdDsKKwlkaS0+ZHFiX2N1cnNwYWNlID0gZG0tPmRxYl9jdXJzcGFjZTsKKwlkaS0+ZHFiX2loYXJkbGltaXQgPSBkbS0+ZHFiX2loYXJkbGltaXQ7CisJZGktPmRxYl9pc29mdGxpbWl0ID0gZG0tPmRxYl9pc29mdGxpbWl0OworCWRpLT5kcWJfY3VyaW5vZGVzID0gZG0tPmRxYl9jdXJpbm9kZXM7CisJZGktPmRxYl9idGltZSA9IGRtLT5kcWJfYnRpbWU7CisJZGktPmRxYl9pdGltZSA9IGRtLT5kcWJfaXRpbWU7CisJZGktPmRxYl92YWxpZCA9IFFJRl9BTEw7CisJc3Bpbl91bmxvY2soJmRxX2RhdGFfbG9jayk7Cit9CisKK2ludCB2ZnNfZ2V0X2RxYmxrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBxaWRfdCBpZCwgc3RydWN0IGlmX2RxYmxrICpkaSkKK3sKKwlzdHJ1Y3QgZHF1b3QgKmRxdW90OworCisJZG93bigmc2JfZHFvcHQoc2IpLT5kcW9ub2ZmX3NlbSk7CisJaWYgKCEoZHF1b3QgPSBkcWdldChzYiwgaWQsIHR5cGUpKSkgeworCQl1cCgmc2JfZHFvcHQoc2IpLT5kcW9ub2ZmX3NlbSk7CisJCXJldHVybiAtRVNSQ0g7CisJfQorCWRvX2dldF9kcWJsayhkcXVvdCwgZGkpOworCWRxcHV0KGRxdW90KTsKKwl1cCgmc2JfZHFvcHQoc2IpLT5kcW9ub2ZmX3NlbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEdlbmVyaWMgcm91dGluZSBmb3Igc2V0dGluZyBjb21tb24gcGFydCBvZiBxdW90YSBzdHJ1Y3R1cmUgKi8KK3N0YXRpYyB2b2lkIGRvX3NldF9kcWJsayhzdHJ1Y3QgZHF1b3QgKmRxdW90LCBzdHJ1Y3QgaWZfZHFibGsgKmRpKQoreworCXN0cnVjdCBtZW1fZHFibGsgKmRtID0gJmRxdW90LT5kcV9kcWI7CisJaW50IGNoZWNrX2JsaW0gPSAwLCBjaGVja19pbGltID0gMDsKKworCXNwaW5fbG9jaygmZHFfZGF0YV9sb2NrKTsKKwlpZiAoZGktPmRxYl92YWxpZCAmIFFJRl9TUEFDRSkgeworCQlkbS0+ZHFiX2N1cnNwYWNlID0gZGktPmRxYl9jdXJzcGFjZTsKKwkJY2hlY2tfYmxpbSA9IDE7CisJfQorCWlmIChkaS0+ZHFiX3ZhbGlkICYgUUlGX0JMSU1JVFMpIHsKKwkJZG0tPmRxYl9ic29mdGxpbWl0ID0gZGktPmRxYl9ic29mdGxpbWl0OworCQlkbS0+ZHFiX2JoYXJkbGltaXQgPSBkaS0+ZHFiX2JoYXJkbGltaXQ7CisJCWNoZWNrX2JsaW0gPSAxOworCX0KKwlpZiAoZGktPmRxYl92YWxpZCAmIFFJRl9JTk9ERVMpIHsKKwkJZG0tPmRxYl9jdXJpbm9kZXMgPSBkaS0+ZHFiX2N1cmlub2RlczsKKwkJY2hlY2tfaWxpbSA9IDE7CisJfQorCWlmIChkaS0+ZHFiX3ZhbGlkICYgUUlGX0lMSU1JVFMpIHsKKwkJZG0tPmRxYl9pc29mdGxpbWl0ID0gZGktPmRxYl9pc29mdGxpbWl0OworCQlkbS0+ZHFiX2loYXJkbGltaXQgPSBkaS0+ZHFiX2loYXJkbGltaXQ7CisJCWNoZWNrX2lsaW0gPSAxOworCX0KKwlpZiAoZGktPmRxYl92YWxpZCAmIFFJRl9CVElNRSkKKwkJZG0tPmRxYl9idGltZSA9IGRpLT5kcWJfYnRpbWU7CisJaWYgKGRpLT5kcWJfdmFsaWQgJiBRSUZfSVRJTUUpCisJCWRtLT5kcWJfaXRpbWUgPSBkaS0+ZHFiX2l0aW1lOworCisJaWYgKGNoZWNrX2JsaW0pIHsKKwkJaWYgKCFkbS0+ZHFiX2Jzb2Z0bGltaXQgfHwgdG9xYihkbS0+ZHFiX2N1cnNwYWNlKSA8IGRtLT5kcWJfYnNvZnRsaW1pdCkgeworCQkJZG0tPmRxYl9idGltZSA9IDA7CisJCQljbGVhcl9iaXQoRFFfQkxLU19CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwkJfQorCQllbHNlIGlmICghKGRpLT5kcWJfdmFsaWQgJiBRSUZfQlRJTUUpKQkvKiBTZXQgZ3JhY2Ugb25seSBpZiB1c2VyIGhhc24ndCBwcm92aWRlZCBoaXMgb3duLi4uICovCisJCQlkbS0+ZHFiX2J0aW1lID0gZ2V0X3NlY29uZHMoKSArIHNiX2Rxb3B0KGRxdW90LT5kcV9zYiktPmluZm9bZHF1b3QtPmRxX3R5cGVdLmRxaV9iZ3JhY2U7CisJfQorCWlmIChjaGVja19pbGltKSB7CisJCWlmICghZG0tPmRxYl9pc29mdGxpbWl0IHx8IGRtLT5kcWJfY3VyaW5vZGVzIDwgZG0tPmRxYl9pc29mdGxpbWl0KSB7CisJCQlkbS0+ZHFiX2l0aW1lID0gMDsKKwkJCWNsZWFyX2JpdChEUV9JTk9ERVNfQiwgJmRxdW90LT5kcV9mbGFncyk7CisJCX0KKwkJZWxzZSBpZiAoIShkaS0+ZHFiX3ZhbGlkICYgUUlGX0lUSU1FKSkJLyogU2V0IGdyYWNlIG9ubHkgaWYgdXNlciBoYXNuJ3QgcHJvdmlkZWQgaGlzIG93bi4uLiAqLworCQkJZG0tPmRxYl9pdGltZSA9IGdldF9zZWNvbmRzKCkgKyBzYl9kcW9wdChkcXVvdC0+ZHFfc2IpLT5pbmZvW2RxdW90LT5kcV90eXBlXS5kcWlfaWdyYWNlOworCX0KKwlpZiAoZG0tPmRxYl9iaGFyZGxpbWl0IHx8IGRtLT5kcWJfYnNvZnRsaW1pdCB8fCBkbS0+ZHFiX2loYXJkbGltaXQgfHwgZG0tPmRxYl9pc29mdGxpbWl0KQorCQljbGVhcl9iaXQoRFFfRkFLRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwllbHNlCisJCXNldF9iaXQoRFFfRkFLRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwlzcGluX3VubG9jaygmZHFfZGF0YV9sb2NrKTsKKwltYXJrX2RxdW90X2RpcnR5KGRxdW90KTsKK30KKworaW50IHZmc19zZXRfZHFibGsoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIHFpZF90IGlkLCBzdHJ1Y3QgaWZfZHFibGsgKmRpKQoreworCXN0cnVjdCBkcXVvdCAqZHF1b3Q7CisKKwlkb3duKCZzYl9kcW9wdChzYiktPmRxb25vZmZfc2VtKTsKKwlpZiAoIShkcXVvdCA9IGRxZ2V0KHNiLCBpZCwgdHlwZSkpKSB7CisJCXVwKCZzYl9kcW9wdChzYiktPmRxb25vZmZfc2VtKTsKKwkJcmV0dXJuIC1FU1JDSDsKKwl9CisJZG9fc2V0X2RxYmxrKGRxdW90LCBkaSk7CisJZHFwdXQoZHF1b3QpOworCXVwKCZzYl9kcW9wdChzYiktPmRxb25vZmZfc2VtKTsKKwlyZXR1cm4gMDsKK30KKworLyogR2VuZXJpYyByb3V0aW5lIGZvciBnZXR0aW5nIGNvbW1vbiBwYXJ0IG9mIHF1b3RhIGZpbGUgaW5mb3JtYXRpb24gKi8KK2ludCB2ZnNfZ2V0X2RxaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgc3RydWN0IGlmX2RxaW5mbyAqaWkpCit7CisJc3RydWN0IG1lbV9kcWluZm8gKm1pOworICAKKwlkb3duKCZzYl9kcW9wdChzYiktPmRxb25vZmZfc2VtKTsKKwlpZiAoIXNiX2hhc19xdW90YV9lbmFibGVkKHNiLCB0eXBlKSkgeworCQl1cCgmc2JfZHFvcHQoc2IpLT5kcW9ub2ZmX3NlbSk7CisJCXJldHVybiAtRVNSQ0g7CisJfQorCW1pID0gc2JfZHFvcHQoc2IpLT5pbmZvICsgdHlwZTsKKwlzcGluX2xvY2soJmRxX2RhdGFfbG9jayk7CisJaWktPmRxaV9iZ3JhY2UgPSBtaS0+ZHFpX2JncmFjZTsKKwlpaS0+ZHFpX2lncmFjZSA9IG1pLT5kcWlfaWdyYWNlOworCWlpLT5kcWlfZmxhZ3MgPSBtaS0+ZHFpX2ZsYWdzICYgRFFGX01BU0s7CisJaWktPmRxaV92YWxpZCA9IElJRl9BTEw7CisJc3Bpbl91bmxvY2soJmRxX2RhdGFfbG9jayk7CisJdXAoJnNiX2Rxb3B0KHNiKS0+ZHFvbm9mZl9zZW0pOworCXJldHVybiAwOworfQorCisvKiBHZW5lcmljIHJvdXRpbmUgZm9yIHNldHRpbmcgY29tbW9uIHBhcnQgb2YgcXVvdGEgZmlsZSBpbmZvcm1hdGlvbiAqLworaW50IHZmc19zZXRfZHFpbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBzdHJ1Y3QgaWZfZHFpbmZvICppaSkKK3sKKwlzdHJ1Y3QgbWVtX2RxaW5mbyAqbWk7CisKKwlkb3duKCZzYl9kcW9wdChzYiktPmRxb25vZmZfc2VtKTsKKwlpZiAoIXNiX2hhc19xdW90YV9lbmFibGVkKHNiLCB0eXBlKSkgeworCQl1cCgmc2JfZHFvcHQoc2IpLT5kcW9ub2ZmX3NlbSk7CisJCXJldHVybiAtRVNSQ0g7CisJfQorCW1pID0gc2JfZHFvcHQoc2IpLT5pbmZvICsgdHlwZTsKKwlzcGluX2xvY2soJmRxX2RhdGFfbG9jayk7CisJaWYgKGlpLT5kcWlfdmFsaWQgJiBJSUZfQkdSQUNFKQorCQltaS0+ZHFpX2JncmFjZSA9IGlpLT5kcWlfYmdyYWNlOworCWlmIChpaS0+ZHFpX3ZhbGlkICYgSUlGX0lHUkFDRSkKKwkJbWktPmRxaV9pZ3JhY2UgPSBpaS0+ZHFpX2lncmFjZTsKKwlpZiAoaWktPmRxaV92YWxpZCAmIElJRl9GTEFHUykKKwkJbWktPmRxaV9mbGFncyA9IChtaS0+ZHFpX2ZsYWdzICYgfkRRRl9NQVNLKSB8IChpaS0+ZHFpX2ZsYWdzICYgRFFGX01BU0spOworCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOworCW1hcmtfaW5mb19kaXJ0eShzYiwgdHlwZSk7CisJLyogRm9yY2Ugd3JpdGUgdG8gZGlzayAqLworCXNiLT5kcV9vcC0+d3JpdGVfaW5mbyhzYiwgdHlwZSk7CisJdXAoJnNiX2Rxb3B0KHNiKS0+ZHFvbm9mZl9zZW0pOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcXVvdGFjdGxfb3BzIHZmc19xdW90YWN0bF9vcHMgPSB7CisJLnF1b3RhX29uCT0gdmZzX3F1b3RhX29uLAorCS5xdW90YV9vZmYJPSB2ZnNfcXVvdGFfb2ZmLAorCS5xdW90YV9zeW5jCT0gdmZzX3F1b3RhX3N5bmMsCisJLmdldF9pbmZvCT0gdmZzX2dldF9kcWluZm8sCisJLnNldF9pbmZvCT0gdmZzX3NldF9kcWluZm8sCisJLmdldF9kcWJsawk9IHZmc19nZXRfZHFibGssCisJLnNldF9kcWJsawk9IHZmc19zZXRfZHFibGsKK307CisKK3N0YXRpYyBjdGxfdGFibGUgZnNfZHFzdGF0c190YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gRlNfRFFfTE9PS1VQUywKKwkJLnByb2NuYW1lCT0gImxvb2t1cHMiLAorCQkuZGF0YQkJPSAmZHFzdGF0cy5sb29rdXBzLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNDQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IEZTX0RRX0RST1BTLAorCQkucHJvY25hbWUJPSAiZHJvcHMiLAorCQkuZGF0YQkJPSAmZHFzdGF0cy5kcm9wcywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDQ0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBGU19EUV9SRUFEUywKKwkJLnByb2NuYW1lCT0gInJlYWRzIiwKKwkJLmRhdGEJCT0gJmRxc3RhdHMucmVhZHMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA0NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gRlNfRFFfV1JJVEVTLAorCQkucHJvY25hbWUJPSAid3JpdGVzIiwKKwkJLmRhdGEJCT0gJmRxc3RhdHMud3JpdGVzLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNDQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IEZTX0RRX0NBQ0hFX0hJVFMsCisJCS5wcm9jbmFtZQk9ICJjYWNoZV9oaXRzIiwKKwkJLmRhdGEJCT0gJmRxc3RhdHMuY2FjaGVfaGl0cywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDQ0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBGU19EUV9BTExPQ0FURUQsCisJCS5wcm9jbmFtZQk9ICJhbGxvY2F0ZWRfZHF1b3RzIiwKKwkJLmRhdGEJCT0gJmRxc3RhdHMuYWxsb2NhdGVkX2RxdW90cywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDQ0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBGU19EUV9GUkVFLAorCQkucHJvY25hbWUJPSAiZnJlZV9kcXVvdHMiLAorCQkuZGF0YQkJPSAmZHFzdGF0cy5mcmVlX2RxdW90cywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDQ0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBGU19EUV9TWU5DUywKKwkJLnByb2NuYW1lCT0gInN5bmNzIiwKKwkJLmRhdGEJCT0gJmRxc3RhdHMuc3luY3MsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA0NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gRlNfRFFfV0FSTklOR1MsCisJCS5wcm9jbmFtZQk9ICJ3YXJuaW5ncyIsCisJCS5kYXRhCQk9ICZmbGFnX3ByaW50X3dhcm5pbmdzLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfSwKK307CisKK3N0YXRpYyBjdGxfdGFibGUgZnNfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IEZTX0RRU1RBVFMsCisJCS5wcm9jbmFtZQk9ICJxdW90YSIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBmc19kcXN0YXRzX3RhYmxlLAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0sCit9OworCitzdGF0aWMgY3RsX3RhYmxlIHN5c190YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX0ZTLAorCQkucHJvY25hbWUJPSAiZnMiLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gZnNfdGFibGUsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRxdW90X2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIG5yX2hhc2gsIG9yZGVyOworCisJcHJpbnRrKEtFUk5fTk9USUNFICJWRlM6IERpc2sgcXVvdGFzICVzXG4iLCBfX0RRVU9UX1ZFUlNJT05fXyk7CisKKwlyZWdpc3Rlcl9zeXNjdGxfdGFibGUoc3lzX3RhYmxlLCAwKTsKKworCWRxdW90X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJkcXVvdCIsIAorCQkJc2l6ZW9mKHN0cnVjdCBkcXVvdCksIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDQsCisJCQlTTEFCX0hXQ0FDSEVfQUxJR058U0xBQl9SRUNMQUlNX0FDQ09VTlR8U0xBQl9QQU5JQywKKwkJCU5VTEwsIE5VTEwpOworCisJb3JkZXIgPSAwOworCWRxdW90X2hhc2ggPSAoc3RydWN0IGhsaXN0X2hlYWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9BVE9NSUMsIG9yZGVyKTsKKwlpZiAoIWRxdW90X2hhc2gpCisJCXBhbmljKCJDYW5ub3QgY3JlYXRlIGRxdW90IGhhc2ggdGFibGUiKTsKKworCS8qIEZpbmQgcG93ZXItb2YtdHdvIGhsaXN0X2hlYWRzIHdoaWNoIGNhbiBmaXQgaW50byBhbGxvY2F0aW9uICovCisJbnJfaGFzaCA9ICgxVUwgPDwgb3JkZXIpICogUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKTsKKwlkcV9oYXNoX2JpdHMgPSAwOworCWRvIHsKKwkJZHFfaGFzaF9iaXRzKys7CisJfSB3aGlsZSAobnJfaGFzaCA+PiBkcV9oYXNoX2JpdHMpOworCWRxX2hhc2hfYml0cy0tOworCisJbnJfaGFzaCA9IDFVTCA8PCBkcV9oYXNoX2JpdHM7CisJZHFfaGFzaF9tYXNrID0gbnJfaGFzaCAtIDE7CisJZm9yIChpID0gMDsgaSA8IG5yX2hhc2g7IGkrKykKKwkJSU5JVF9ITElTVF9IRUFEKGRxdW90X2hhc2ggKyBpKTsKKworCXByaW50aygiRHF1b3QtY2FjaGUgaGFzaCB0YWJsZSBlbnRyaWVzOiAlbGQgKG9yZGVyICVsZCwgJWxkIGJ5dGVzKVxuIiwKKwkJCW5yX2hhc2gsIG9yZGVyLCAoUEFHRV9TSVpFIDw8IG9yZGVyKSk7CisKKwlzZXRfc2hyaW5rZXIoREVGQVVMVF9TRUVLUywgc2hyaW5rX2RxY2FjaGVfbWVtb3J5KTsKKworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQoZHF1b3RfaW5pdCk7CisKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfcXVvdGFfZm9ybWF0KTsKK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9xdW90YV9mb3JtYXQpOworRVhQT1JUX1NZTUJPTChkcXN0YXRzKTsKK0VYUE9SVF9TWU1CT0woZHFfZGF0YV9sb2NrKTsKK0VYUE9SVF9TWU1CT0wodmZzX3F1b3RhX29uKTsKK0VYUE9SVF9TWU1CT0wodmZzX3F1b3RhX29uX21vdW50KTsKK0VYUE9SVF9TWU1CT0wodmZzX3F1b3RhX29mZik7CitFWFBPUlRfU1lNQk9MKHZmc19xdW90YV9zeW5jKTsKK0VYUE9SVF9TWU1CT0wodmZzX2dldF9kcWluZm8pOworRVhQT1JUX1NZTUJPTCh2ZnNfc2V0X2RxaW5mbyk7CitFWFBPUlRfU1lNQk9MKHZmc19nZXRfZHFibGspOworRVhQT1JUX1NZTUJPTCh2ZnNfc2V0X2RxYmxrKTsKK0VYUE9SVF9TWU1CT0woZHF1b3RfY29tbWl0KTsKK0VYUE9SVF9TWU1CT0woZHF1b3RfY29tbWl0X2luZm8pOworRVhQT1JUX1NZTUJPTChkcXVvdF9hY3F1aXJlKTsKK0VYUE9SVF9TWU1CT0woZHF1b3RfcmVsZWFzZSk7CitFWFBPUlRfU1lNQk9MKGRxdW90X21hcmtfZHF1b3RfZGlydHkpOworRVhQT1JUX1NZTUJPTChkcXVvdF9pbml0aWFsaXplKTsKK0VYUE9SVF9TWU1CT0woZHF1b3RfZHJvcCk7CitFWFBPUlRfU1lNQk9MKGRxdW90X2FsbG9jX3NwYWNlKTsKK0VYUE9SVF9TWU1CT0woZHF1b3RfYWxsb2NfaW5vZGUpOworRVhQT1JUX1NZTUJPTChkcXVvdF9mcmVlX3NwYWNlKTsKK0VYUE9SVF9TWU1CT0woZHF1b3RfZnJlZV9pbm9kZSk7CitFWFBPUlRfU1lNQk9MKGRxdW90X3RyYW5zZmVyKTsKZGlmZiAtLWdpdCBhL2ZzL2Vmcy9NYWtlZmlsZSBiL2ZzL2Vmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjM1NDNkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZWZzL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGVmcy1maWxlc3lzdGVtIHJvdXRpbmVzLgorIworCitvYmotJChDT05GSUdfRUZTX0ZTKSArPSBlZnMubworCitlZnMtb2JqcyA6PSBzdXBlci5vIGlub2RlLm8gbmFtZWkubyBkaXIubyBmaWxlLm8gc3ltbGluay5vCmRpZmYgLS1naXQgYS9mcy9lZnMvZGlyLmMgYi9mcy9lZnMvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3YzYxNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Vmcy9kaXIuYwpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIGRpci5jCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5IEFsIFNtaXRoCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZWZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworc3RhdGljIGludCBlZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCB2b2lkICosIGZpbGxkaXJfdCk7CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgZWZzX2Rpcl9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBlZnNfcmVhZGRpciwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGVmc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IGVmc19sb29rdXAsCit9OworCitzdGF0aWMgaW50IGVmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKSB7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwlzdHJ1Y3QgZWZzX2RpcgkJKmRpcmJsb2NrOworCXN0cnVjdCBlZnNfZGVudHJ5CSpkaXJzbG90OworCWVmc19pbm9fdAkJaW5vZGVudW07CisJZWZzX2Jsb2NrX3QJCWJsb2NrOworCWludAkJCXNsb3QsIG5hbWVsZW47CisJY2hhcgkJCSpuYW1lcHRyOworCisJaWYgKGlub2RlLT5pX3NpemUgJiAoRUZTX0RJUkJTSVpFLTEpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRlM6IFdBUk5JTkc6IHJlYWRkaXIoKTogZGlyZWN0b3J5IHNpemUgbm90IGEgbXVsdGlwbGUgb2YgRUZTX0RJUkJTSVpFXG4iKTsKKworCWxvY2tfa2VybmVsKCk7CisKKwkvKiB3b3JrIG91dCB3aGVyZSB0aGlzIGVudHJ5IGNhbiBiZSBmb3VuZCAqLworCWJsb2NrID0gZmlscC0+Zl9wb3MgPj4gRUZTX0RJUkJTSVpFX0JJVFM7CisKKwkvKiBlYWNoIGJsb2NrIGNvbnRhaW5zIGF0IG1vc3QgMjU2IHNsb3RzICovCisJc2xvdCAgPSBmaWxwLT5mX3BvcyAmIDB4ZmY7CisKKwkvKiBsb29rIGF0IGFsbCBibG9ja3MgKi8KKwl3aGlsZSAoYmxvY2sgPCBpbm9kZS0+aV9ibG9ja3MpIHsKKwkJLyogcmVhZCB0aGUgZGlyIGJsb2NrICovCisJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIGVmc19ibWFwKGlub2RlLCBibG9jaykpOworCisJCWlmICghYmgpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRUZTOiByZWFkZGlyKCk6IGZhaWxlZCB0byByZWFkIGRpciBibG9jayAlZFxuIiwgYmxvY2spOworCQkJYnJlYWs7CisJCX0KKworCQlkaXJibG9jayA9IChzdHJ1Y3QgZWZzX2RpciAqKSBiaC0+Yl9kYXRhOyAKKworCQlpZiAoYmUxNl90b19jcHUoZGlyYmxvY2stPm1hZ2ljKSAhPSBFRlNfRElSQkxLX01BR0lDKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkVGUzogcmVhZGRpcigpOiBpbnZhbGlkIGRpcmVjdG9yeSBibG9ja1xuIik7CisJCQlicmVsc2UoYmgpOworCQkJYnJlYWs7CisJCX0KKworCQl3aGlsZSAoc2xvdCA8IGRpcmJsb2NrLT5zbG90cykgeworCQkJaWYgKGRpcmJsb2NrLT5zcGFjZVtzbG90XSA9PSAwKSB7CisJCQkJc2xvdCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlkaXJzbG90ICA9IChzdHJ1Y3QgZWZzX2RlbnRyeSAqKSAoKChjaGFyICopIGJoLT5iX2RhdGEpICsgRUZTX1NMT1RBVChkaXJibG9jaywgc2xvdCkpOworCisJCQlpbm9kZW51bSA9IGJlMzJfdG9fY3B1KGRpcnNsb3QtPmlub2RlKTsKKwkJCW5hbWVsZW4gID0gZGlyc2xvdC0+bmFtZWxlbjsKKwkJCW5hbWVwdHIgID0gZGlyc2xvdC0+bmFtZTsKKworI2lmZGVmIERFQlVHCisJCQlwcmludGsoS0VSTl9ERUJVRyAiRUZTOiByZWFkZGlyKCk6IGJsb2NrICVkIHNsb3QgJWQvJWQ6IGlub2RlICV1LCBuYW1lIFwiJXNcIiwgbmFtZWxlbiAldVxuIiwgYmxvY2ssIHNsb3QsIGRpcmJsb2NrLT5zbG90cy0xLCBpbm9kZW51bSwgbmFtZXB0ciwgbmFtZWxlbik7CisjZW5kaWYKKwkJCWlmIChuYW1lbGVuID4gMCkgeworCQkJCS8qIGZvdW5kIHRoZSBuZXh0IGVudHJ5ICovCisJCQkJZmlscC0+Zl9wb3MgPSAoYmxvY2sgPDwgRUZTX0RJUkJTSVpFX0JJVFMpIHwgc2xvdDsKKworCQkJCS8qIGNvcHkgZmlsZW5hbWUgYW5kIGRhdGEgaW4gZGlyc2xvdCAqLworCQkJCWZpbGxkaXIoZGlyZW50LCBuYW1lcHRyLCBuYW1lbGVuLCBmaWxwLT5mX3BvcywgaW5vZGVudW0sIERUX1VOS05PV04pOworCisJCQkJLyogc2FuaXR5IGNoZWNrICovCisJCQkJaWYgKG5hbWVwdHIgLSAoY2hhciAqKSBkaXJibG9jayArIG5hbWVsZW4gPiBFRlNfRElSQlNJWkUpIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRUZTOiBkaXJlY3RvcnkgZW50cnkgJWQgZXhjZWVkcyBkaXJlY3RvcnkgYmxvY2tcbiIsIHNsb3QpOworCQkJCQlzbG90Kys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCS8qIHN0b3JlIHBvc2l0aW9uIG9mIG5leHQgc2xvdCAqLworCQkJCWlmICgrK3Nsb3QgPT0gZGlyYmxvY2stPnNsb3RzKSB7CisJCQkJCXNsb3QgPSAwOworCQkJCQlibG9jaysrOworCQkJCX0KKwkJCQlicmVsc2UoYmgpOworCQkJCWZpbHAtPmZfcG9zID0gKGJsb2NrIDw8IEVGU19ESVJCU0laRV9CSVRTKSB8IHNsb3Q7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlzbG90Kys7CisJCX0KKwkJYnJlbHNlKGJoKTsKKworCQlzbG90ID0gMDsKKwkJYmxvY2srKzsKKwl9CisKKwlmaWxwLT5mX3BvcyA9IChibG9jayA8PCBFRlNfRElSQlNJWkVfQklUUykgfCBzbG90Oworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvZWZzL2ZpbGUuYyBiL2ZzL2Vmcy9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiMjAxMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Vmcy9maWxlLmMKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIGZpbGUuYworICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBBbCBTbWl0aAorICoKKyAqIFBvcnRpb25zIGRlcml2ZWQgZnJvbSB3b3JrIChjKSAxOTk1LDE5OTYgQ2hyaXN0aWFuIFZvZ2VsZ3NhbmcuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZWZzX2ZzLmg+CisKK2ludCBlZnNfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKKwkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK3sKKwlpbnQgZXJyb3IgPSAtRVJPRlM7CisJbG9uZyBwaHlzOworCisJaWYgKGNyZWF0ZSkKKwkJcmV0dXJuIGVycm9yOworCWlmIChpYmxvY2sgPj0gaW5vZGUtPmlfYmxvY2tzKSB7CisjaWZkZWYgREVCVUcKKwkJLyoKKwkJICogaSBoYXZlIG5vIGlkZWEgd2h5IHRoaXMgaGFwcGVucyBhcyBvZnRlbiBhcyBpdCBkb2VzCisJCSAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRlM6IGJtYXAoKTogYmxvY2sgJWQgPj0gJWxkIChmaWxlc2l6ZSAlbGQpXG4iLAorCQkJYmxvY2ssCisJCQlpbm9kZS0+aV9ibG9ja3MsCisJCQlpbm9kZS0+aV9zaXplKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisJcGh5cyA9IGVmc19tYXBfYmxvY2soaW5vZGUsIGlibG9jayk7CisJaWYgKHBoeXMpCisJCW1hcF9iaChiaF9yZXN1bHQsIGlub2RlLT5pX3NiLCBwaHlzKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGVmc19ibWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGVmc19ibG9ja190IGJsb2NrKSB7CisKKwlpZiAoYmxvY2sgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVGUzogYm1hcCgpOiBibG9jayA8IDBcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBhcmUgd2UgYWJvdXQgdG8gcmVhZCBwYXN0IHRoZSBlbmQgb2YgYSBmaWxlID8gKi8KKwlpZiAoIShibG9jayA8IGlub2RlLT5pX2Jsb2NrcykpIHsKKyNpZmRlZiBERUJVRworCQkvKgorCQkgKiBpIGhhdmUgbm8gaWRlYSB3aHkgdGhpcyBoYXBwZW5zIGFzIG9mdGVuIGFzIGl0IGRvZXMKKwkJICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVGUzogYm1hcCgpOiBibG9jayAlZCA+PSAlbGQgKGZpbGVzaXplICVsZClcbiIsCisJCQlibG9jaywKKwkJCWlub2RlLT5pX2Jsb2NrcywKKwkJCWlub2RlLT5pX3NpemUpOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKworCXJldHVybiBlZnNfbWFwX2Jsb2NrKGlub2RlLCBibG9jayk7Cit9CmRpZmYgLS1naXQgYS9mcy9lZnMvaW5vZGUuYyBiL2ZzL2Vmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MDYwN2YKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9lZnMvaW5vZGUuYwpAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIGlub2RlLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgQWwgU21pdGgKKyAqCisgKiBQb3J0aW9ucyBkZXJpdmVkIGZyb20gd29yayAoYykgMTk5NSwxOTk2IENocmlzdGlhbiBWb2dlbGdzYW5nLAorICogICAgICAgICAgICAgIGFuZCBmcm9tIHdvcmsgKGMpIDE5OTggTWlrZSBTaGF2ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vmc19mc19zYi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworc3RhdGljIGludCBlZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLGVmc19nZXRfYmxvY2spOworfQorc3RhdGljIHNlY3Rvcl90IF9lZnNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2spCit7CisJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLGJsb2NrLGVmc19nZXRfYmxvY2spOworfQorc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZWZzX2FvcHMgPSB7CisJLnJlYWRwYWdlID0gZWZzX3JlYWRwYWdlLAorCS5zeW5jX3BhZ2UgPSBibG9ja19zeW5jX3BhZ2UsCisJLmJtYXAgPSBfZWZzX2JtYXAKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHRlbnRfY29weShlZnNfZXh0ZW50ICpzcmMsIGVmc19leHRlbnQgKmRzdCkgeworCS8qCisJICogdGhpcyBpcyBzbGlnaHRseSBldmlsLiBpdCBkb2Vzbid0IGp1c3QgY29weQorCSAqIGVmc19leHRlbnQgZnJvbSBzcmMgdG8gZHN0LCBpdCBhbHNvIG1hbmdsZXMKKwkgKiB0aGUgYml0cyBzbyB0aGF0IGRzdCBlbmRzIHVwIGluIGNwdSBieXRlLW9yZGVyLgorCSAqLworCisJZHN0LT5jb29rZWQuZXhfbWFnaWMgID0gICh1bnNpZ25lZCBpbnQpIHNyYy0+cmF3WzBdOworCWRzdC0+Y29va2VkLmV4X2JuICAgICA9ICgodW5zaWduZWQgaW50KSBzcmMtPnJhd1sxXSA8PCAxNikgfAorCQkJCSgodW5zaWduZWQgaW50KSBzcmMtPnJhd1syXSA8PCAgOCkgfAorCQkJCSgodW5zaWduZWQgaW50KSBzcmMtPnJhd1szXSA8PCAgMCk7CisJZHN0LT5jb29rZWQuZXhfbGVuZ3RoID0gICh1bnNpZ25lZCBpbnQpIHNyYy0+cmF3WzRdOworCWRzdC0+Y29va2VkLmV4X29mZnNldCA9ICgodW5zaWduZWQgaW50KSBzcmMtPnJhd1s1XSA8PCAxNikgfAorCQkJCSgodW5zaWduZWQgaW50KSBzcmMtPnJhd1s2XSA8PCAgOCkgfAorCQkJCSgodW5zaWduZWQgaW50KSBzcmMtPnJhd1s3XSA8PCAgMCk7CisJcmV0dXJuOworfQorCit2b2lkIGVmc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGksIGlub2RlX2luZGV4OworCWRldl90IGRldmljZTsKKwl1MzIgcmRldjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBlZnNfc2JfaW5mbyAgICAqc2IgPSBTVVBFUl9JTkZPKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgZWZzX2lub2RlX2luZm8gKmluID0gSU5PREVfSU5GTyhpbm9kZSk7CisJZWZzX2Jsb2NrX3QgYmxvY2ssIG9mZnNldDsKKwlzdHJ1Y3QgZWZzX2Rpbm9kZSAqZWZzX2lub2RlOworICAKKwkvKgorCSoqIEVGUyBsYXlvdXQ6CisJKioKKwkqKiB8ICAgY3lsaW5kZXIgZ3JvdXAgICAgfCAgIGN5bGluZGVyIGdyb3VwICAgIHwgICBjeWxpbmRlciBncm91cCAuLmV0YworCSoqIHxpbm9kZXN8ZGF0YSAgICAgICAgICB8aW5vZGVzfGRhdGEgICAgICAgICAgfGlub2Rlc3xkYXRhICAgICAgIC4uZXRjCisJKioKKwkqKiB3b3JrIG91dCB0aGUgaW5vZGUgYmxvY2sgaW5kZXgsIChjb25zaWRlcmluZyBpbml0aWFsbHkgdGhhdCB0aGUKKwkqKiBpbm9kZXMgYXJlIHN0b3JlZCBhcyBjb25zZWN1dGl2ZSBibG9ja3MpLiB0aGVuIHdvcmsgb3V0IHRoZSBibG9jaworCSoqIG51bWJlciBvZiB0aGF0IGlub2RlIGdpdmVuIHRoZSBhYm92ZSBsYXlvdXQsIGFuZCBmaW5hbGx5IHRoZQorCSoqIG9mZnNldCBvZiB0aGUgaW5vZGUgd2l0aGluIHRoYXQgYmxvY2suCisJKi8KKworCWlub2RlX2luZGV4ID0gaW5vZGUtPmlfaW5vIC8KKwkJKEVGU19CTE9DS1NJWkUgLyBzaXplb2Yoc3RydWN0IGVmc19kaW5vZGUpKTsKKworCWJsb2NrID0gc2ItPmZzX3N0YXJ0ICsgc2ItPmZpcnN0X2Jsb2NrICsgCisJCShzYi0+Z3JvdXBfc2l6ZSAqIChpbm9kZV9pbmRleCAvIHNiLT5pbm9kZV9ibG9ja3MpKSArCisJCShpbm9kZV9pbmRleCAlIHNiLT5pbm9kZV9ibG9ja3MpOworCisJb2Zmc2V0ID0gKGlub2RlLT5pX2lubyAlCisJCQkoRUZTX0JMT0NLU0laRSAvIHNpemVvZihzdHJ1Y3QgZWZzX2Rpbm9kZSkpKSAqCisJCXNpemVvZihzdHJ1Y3QgZWZzX2Rpbm9kZSk7CisKKwliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBibG9jayk7CisJaWYgKCFiaCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRlM6IGJyZWFkKCkgZmFpbGVkIGF0IGJsb2NrICVkXG4iLCBibG9jayk7CisJCWdvdG8gcmVhZF9pbm9kZV9lcnJvcjsKKwl9CisKKwllZnNfaW5vZGUgPSAoc3RydWN0IGVmc19kaW5vZGUgKikgKGJoLT5iX2RhdGEgKyBvZmZzZXQpOworICAgIAorCWlub2RlLT5pX21vZGUgID0gYmUxNl90b19jcHUoZWZzX2lub2RlLT5kaV9tb2RlKTsKKwlpbm9kZS0+aV9ubGluayA9IGJlMTZfdG9fY3B1KGVmc19pbm9kZS0+ZGlfbmxpbmspOworCWlub2RlLT5pX3VpZCAgID0gKHVpZF90KWJlMTZfdG9fY3B1KGVmc19pbm9kZS0+ZGlfdWlkKTsKKwlpbm9kZS0+aV9naWQgICA9IChnaWRfdCliZTE2X3RvX2NwdShlZnNfaW5vZGUtPmRpX2dpZCk7CisJaW5vZGUtPmlfc2l6ZSAgPSBiZTMyX3RvX2NwdShlZnNfaW5vZGUtPmRpX3NpemUpOworCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IGJlMzJfdG9fY3B1KGVmc19pbm9kZS0+ZGlfYXRpbWUpOworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGJlMzJfdG9fY3B1KGVmc19pbm9kZS0+ZGlfbXRpbWUpOworCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IGJlMzJfdG9fY3B1KGVmc19pbm9kZS0+ZGlfY3RpbWUpOworCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSBpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7CisKKwkvKiB0aGlzIGlzIHRoZSBudW1iZXIgb2YgYmxvY2tzIGluIHRoZSBmaWxlICovCisJaWYgKGlub2RlLT5pX3NpemUgPT0gMCkgeworCQlpbm9kZS0+aV9ibG9ja3MgPSAwOworCX0gZWxzZSB7CisJCWlub2RlLT5pX2Jsb2NrcyA9ICgoaW5vZGUtPmlfc2l6ZSAtIDEpID4+IEVGU19CTE9DS1NJWkVfQklUUykgKyAxOworCX0KKworCXJkZXYgPSBiZTE2X3RvX2NwdShlZnNfaW5vZGUtPmRpX3UuZGlfZGV2Lm9kZXYpOworCWlmIChyZGV2ID09IDB4ZmZmZikgeworCQlyZGV2ID0gYmUzMl90b19jcHUoZWZzX2lub2RlLT5kaV91LmRpX2Rldi5uZGV2KTsKKwkJaWYgKHN5c3ZfbWFqb3IocmRldikgPiAweGZmZikKKwkJCWRldmljZSA9IDA7CisJCWVsc2UKKwkJCWRldmljZSA9IE1LREVWKHN5c3ZfbWFqb3IocmRldiksIHN5c3ZfbWlub3IocmRldikpOworCX0gZWxzZQorCQlkZXZpY2UgPSBvbGRfZGVjb2RlX2RldihyZGV2KTsKKworCS8qIGdldCB0aGUgbnVtYmVyIG9mIGV4dGVudHMgZm9yIHRoaXMgb2JqZWN0ICovCisJaW4tPm51bWV4dGVudHMgPSBiZTE2X3RvX2NwdShlZnNfaW5vZGUtPmRpX251bWV4dGVudHMpOworCWluLT5sYXN0ZXh0ZW50ID0gMDsKKworCS8qIGNvcHkgdGhlIGV4dGVudHMgY29udGFpbmVkIHdpdGhpbiB0aGUgaW5vZGUgdG8gbWVtb3J5ICovCisJZm9yKGkgPSAwOyBpIDwgRUZTX0RJUkVDVEVYVEVOVFM7IGkrKykgeworCQlleHRlbnRfY29weSgmKGVmc19pbm9kZS0+ZGlfdS5kaV9leHRlbnRzW2ldKSwgJihpbi0+ZXh0ZW50c1tpXSkpOworCQlpZiAoaSA8IGluLT5udW1leHRlbnRzICYmIGluLT5leHRlbnRzW2ldLmNvb2tlZC5leF9tYWdpYyAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRlM6IGV4dGVudCAlZCBoYXMgYmFkIG1hZ2ljIG51bWJlciBpbiBpbm9kZSAlbHVcbiIsIGksIGlub2RlLT5pX2lubyk7CisJCQlicmVsc2UoYmgpOworCQkJZ290byByZWFkX2lub2RlX2Vycm9yOworCQl9CisJfQorCisJYnJlbHNlKGJoKTsKKyAgIAorI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgIkVGUzogcmVhZF9pbm9kZSgpOiBpbm9kZSAlbHUsIGV4dGVudHMgJWQsIG1vZGUgJW9cbiIsCisJCWlub2RlLT5pX2lubywgaW4tPm51bWV4dGVudHMsIGlub2RlLT5pX21vZGUpOworI2VuZGlmCisKKwlzd2l0Y2ggKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpIHsKKwkJY2FzZSBTX0lGRElSOiAKKwkJCWlub2RlLT5pX29wID0gJmVmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsgCisJCQlpbm9kZS0+aV9mb3AgPSAmZWZzX2Rpcl9vcGVyYXRpb25zOyAKKwkJCWJyZWFrOworCQljYXNlIFNfSUZSRUc6CisJCQlpbm9kZS0+aV9mb3AgPSAmZ2VuZXJpY19yb19mb3BzOworCQkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZlZnNfYW9wczsKKwkJCWJyZWFrOworCQljYXNlIFNfSUZMTks6CisJCQlpbm9kZS0+aV9vcCA9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmZWZzX3N5bWxpbmtfYW9wczsKKwkJCWJyZWFrOworCQljYXNlIFNfSUZDSFI6CisJCWNhc2UgU19JRkJMSzoKKwkJY2FzZSBTX0lGSUZPOgorCQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCBkZXZpY2UpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRlM6IHVuc3VwcG9ydGVkIGlub2RlIG1vZGUgJW9cbiIsIGlub2RlLT5pX21vZGUpOworCQkJZ290byByZWFkX2lub2RlX2Vycm9yOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuOworICAgICAgICAKK3JlYWRfaW5vZGVfZXJyb3I6CisJcHJpbnRrKEtFUk5fV0FSTklORyAiRUZTOiBmYWlsZWQgdG8gcmVhZCBpbm9kZSAlbHVcbiIsIGlub2RlLT5pX2lubyk7CisJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIGVmc19ibG9ja190CitlZnNfZXh0ZW50X2NoZWNrKGVmc19leHRlbnQgKnB0ciwgZWZzX2Jsb2NrX3QgYmxvY2ssIHN0cnVjdCBlZnNfc2JfaW5mbyAqc2IpIHsKKwllZnNfYmxvY2tfdCBzdGFydDsKKwllZnNfYmxvY2tfdCBsZW5ndGg7CisJZWZzX2Jsb2NrX3Qgb2Zmc2V0OworCisJLyoKKwkgKiBnaXZlbiBhbiBleHRlbnQgYW5kIGEgbG9naWNhbCBibG9jayB3aXRoaW4gYSBmaWxlLAorCSAqIGNhbiB0aGlzIGJsb2NrIGJlIGZvdW5kIHdpdGhpbiB0aGlzIGV4dGVudCA/CisJICovCisJc3RhcnQgID0gcHRyLT5jb29rZWQuZXhfYm47CisJbGVuZ3RoID0gcHRyLT5jb29rZWQuZXhfbGVuZ3RoOworCW9mZnNldCA9IHB0ci0+Y29va2VkLmV4X29mZnNldDsKKworCWlmICgoYmxvY2sgPj0gb2Zmc2V0KSAmJiAoYmxvY2sgPCBvZmZzZXQrbGVuZ3RoKSkgeworCQlyZXR1cm4oc2ItPmZzX3N0YXJ0ICsgc3RhcnQgKyBibG9jayAtIG9mZnNldCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorfQorCitlZnNfYmxvY2tfdCBlZnNfbWFwX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGVmc19ibG9ja190IGJsb2NrKSB7CisJc3RydWN0IGVmc19zYl9pbmZvICAgICpzYiA9IFNVUEVSX0lORk8oaW5vZGUtPmlfc2IpOworCXN0cnVjdCBlZnNfaW5vZGVfaW5mbyAqaW4gPSBJTk9ERV9JTkZPKGlub2RlKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgICAgKmJoID0gTlVMTDsKKworCWludCBjdXIsIGxhc3QsIGZpcnN0ID0gMTsKKwlpbnQgaWJhc2UsIGlvZmZzZXQsIGRpcmV4dCwgZGlyZXh0cywgaW5kZXh0LCBpbmRleHRzOworCWVmc19ibG9ja190IGlibG9jaywgcmVzdWx0ID0gMCwgbGFzdGJsb2NrID0gMDsKKwllZnNfZXh0ZW50IGV4dCwgKmV4dHM7CisKKwlsYXN0ID0gaW4tPmxhc3RleHRlbnQ7CisKKwlpZiAoaW4tPm51bWV4dGVudHMgPD0gRUZTX0RJUkVDVEVYVEVOVFMpIHsKKwkJLyogZmlyc3QgY2hlY2sgdGhlIGxhc3QgZXh0ZW50IHdlIHJldHVybmVkICovCisJCWlmICgocmVzdWx0ID0gZWZzX2V4dGVudF9jaGVjaygmaW4tPmV4dGVudHNbbGFzdF0sIGJsb2NrLCBzYikpKQorCQkJcmV0dXJuIHJlc3VsdDsKKyAgICAKKwkJLyogaWYgd2Ugb25seSBoYXZlIG9uZSBleHRlbnQgdGhlbiBub3RoaW5nIGNhbiBiZSBmb3VuZCAqLworCQlpZiAoaW4tPm51bWV4dGVudHMgPT0gMSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFRlM6IG1hcF9ibG9jaygpIGZhaWxlZCB0byBtYXAgKDEgZXh0ZW50KVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWRpcmV4dHMgPSBpbi0+bnVtZXh0ZW50czsKKworCQkvKgorCQkgKiBjaGVjayB0aGUgc3RvcmVkIGV4dGVudHMgaW4gdGhlIGlub2RlCisJCSAqIHN0YXJ0IHdpdGggbmV4dCBleHRlbnQgYW5kIGNoZWNrIGZvcndhcmRzCisJCSAqLworCQlmb3IoZGlyZXh0ID0gMTsgZGlyZXh0IDwgZGlyZXh0czsgZGlyZXh0KyspIHsKKwkJCWN1ciA9IChsYXN0ICsgZGlyZXh0KSAlIGluLT5udW1leHRlbnRzOworCQkJaWYgKChyZXN1bHQgPSBlZnNfZXh0ZW50X2NoZWNrKCZpbi0+ZXh0ZW50c1tjdXJdLCBibG9jaywgc2IpKSkgeworCQkJCWluLT5sYXN0ZXh0ZW50ID0gY3VyOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKworCQlwcmludGsoS0VSTl9FUlIgIkVGUzogbWFwX2Jsb2NrKCkgZmFpbGVkIHRvIG1hcCBibG9jayAldSAoZGlyKVxuIiwgYmxvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJFRlM6IG1hcF9ibG9jaygpOiBpbmRpcmVjdCBzZWFyY2ggZm9yIGxvZ2ljYWwgYmxvY2sgJXVcbiIsIGJsb2NrKTsKKyNlbmRpZgorCWRpcmV4dHMgPSBpbi0+ZXh0ZW50c1swXS5jb29rZWQuZXhfb2Zmc2V0OworCWluZGV4dHMgPSBpbi0+bnVtZXh0ZW50czsKKworCWZvcihpbmRleHQgPSAwOyBpbmRleHQgPCBpbmRleHRzOyBpbmRleHQrKykgeworCQljdXIgPSAobGFzdCArIGluZGV4dCkgJSBpbmRleHRzOworCisJCS8qCisJCSAqIHdvcmsgb3V0IHdoaWNoIGRpcmVjdCBleHRlbnQgY29udGFpbnMgYGN1cicuCisJCSAqCisJCSAqIGFsc28gY29tcHV0ZSBpYmFzZTogaS5lLiB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdAorCQkgKiBpbmRpcmVjdCBleHRlbnQgY29udGFpbmVkIHdpdGhpbiBkaXJlY3QgZXh0ZW50IGBjdXInLgorCQkgKgorCQkgKi8KKwkJaWJhc2UgPSAwOworCQlmb3IoZGlyZXh0ID0gMDsgY3VyIDwgaWJhc2UgJiYgZGlyZXh0IDwgZGlyZXh0czsgZGlyZXh0KyspIHsKKwkJCWliYXNlICs9IGluLT5leHRlbnRzW2RpcmV4dF0uY29va2VkLmV4X2xlbmd0aCAqCisJCQkJKEVGU19CTE9DS1NJWkUgLyBzaXplb2YoZWZzX2V4dGVudCkpOworCQl9CisKKwkJaWYgKGRpcmV4dCA9PSBkaXJleHRzKSB7CisJCQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCQlwcmludGsoS0VSTl9FUlIgIkVGUzogY291bGRuJ3QgZmluZCBkaXJlY3QgZXh0ZW50IGZvciBpbmRpcmVjdCBleHRlbnQgJWQgKGJsb2NrICV1KVxuIiwgY3VyLCBibG9jayk7CisJCQlpZiAoYmgpIGJyZWxzZShiaCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJLyogd29yayBvdXQgYmxvY2sgbnVtYmVyIGFuZCBvZmZzZXQgb2YgdGhpcyBpbmRpcmVjdCBleHRlbnQgKi8KKwkJaWJsb2NrID0gc2ItPmZzX3N0YXJ0ICsgaW4tPmV4dGVudHNbZGlyZXh0XS5jb29rZWQuZXhfYm4gKworCQkJKGN1ciAtIGliYXNlKSAvCisJCQkoRUZTX0JMT0NLU0laRSAvIHNpemVvZihlZnNfZXh0ZW50KSk7CisJCWlvZmZzZXQgPSAoY3VyIC0gaWJhc2UpICUKKwkJCShFRlNfQkxPQ0tTSVpFIC8gc2l6ZW9mKGVmc19leHRlbnQpKTsKKworCQlpZiAoZmlyc3QgfHwgbGFzdGJsb2NrICE9IGlibG9jaykgeworCQkJaWYgKGJoKSBicmVsc2UoYmgpOworCisJCQliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBpYmxvY2spOworCQkJaWYgKCFiaCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiRUZTOiBicmVhZCgpIGZhaWxlZCBhdCBibG9jayAlZFxuIiwgaWJsb2NrKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKyNpZmRlZiBERUJVRworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkVGUzogbWFwX2Jsb2NrKCk6IHJlYWQgaW5kaXJlY3QgZXh0ZW50IGJsb2NrICVkXG4iLCBpYmxvY2spOworI2VuZGlmCisJCQlmaXJzdCA9IDA7CisJCQlsYXN0YmxvY2sgPSBpYmxvY2s7CisJCX0KKworCQlleHRzID0gKGVmc19leHRlbnQgKikgYmgtPmJfZGF0YTsKKworCQlleHRlbnRfY29weSgmKGV4dHNbaW9mZnNldF0pLCAmZXh0KTsKKworCQlpZiAoZXh0LmNvb2tlZC5leF9tYWdpYyAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkVGUzogZXh0ZW50ICVkIGhhcyBiYWQgbWFnaWMgbnVtYmVyIGluIGJsb2NrICVkXG4iLCBjdXIsIGlibG9jayk7CisJCQlpZiAoYmgpIGJyZWxzZShiaCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICgocmVzdWx0ID0gZWZzX2V4dGVudF9jaGVjaygmZXh0LCBibG9jaywgc2IpKSkgeworCQkJaWYgKGJoKSBicmVsc2UoYmgpOworCQkJaW4tPmxhc3RleHRlbnQgPSBjdXI7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJfQorCWlmIChiaCkgYnJlbHNlKGJoKTsKKwlwcmludGsoS0VSTl9FUlIgIkVGUzogbWFwX2Jsb2NrKCkgZmFpbGVkIHRvIG1hcCBibG9jayAldSAoaW5kaXIpXG4iLCBibG9jayk7CisJcmV0dXJuIDA7Cit9ICAKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvZWZzL25hbWVpLmMgYi9mcy9lZnMvbmFtZWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDRhMjA3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZWZzL25hbWVpLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBuYW1laS5jCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5IEFsIFNtaXRoCisgKgorICogUG9ydGlvbnMgZGVyaXZlZCBmcm9tIHdvcmsgKGMpIDE5OTUsMTk5NiBDaHJpc3RpYW4gVm9nZWxnc2FuZy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCitzdGF0aWMgZWZzX2lub190IGVmc19maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pIHsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJaW50CQkJc2xvdCwgbmFtZWxlbjsKKwljaGFyCQkJKm5hbWVwdHI7CisJc3RydWN0IGVmc19kaXIJCSpkaXJibG9jazsKKwlzdHJ1Y3QgZWZzX2RlbnRyeQkqZGlyc2xvdDsKKwllZnNfaW5vX3QJCWlub2RlbnVtOworCWVmc19ibG9ja190CQlibG9jazsKKyAKKwlpZiAoaW5vZGUtPmlfc2l6ZSAmIChFRlNfRElSQlNJWkUtMSkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVGUzogV0FSTklORzogZmluZF9lbnRyeSgpOiBkaXJlY3Rvcnkgc2l6ZSBub3QgYSBtdWx0aXBsZSBvZiBFRlNfRElSQlNJWkVcbiIpOworCisJZm9yKGJsb2NrID0gMDsgYmxvY2sgPCBpbm9kZS0+aV9ibG9ja3M7IGJsb2NrKyspIHsKKworCQliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBlZnNfYm1hcChpbm9kZSwgYmxvY2spKTsKKwkJaWYgKCFiaCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFRlM6IGZpbmRfZW50cnkoKTogZmFpbGVkIHRvIHJlYWQgZGlyIGJsb2NrICVkXG4iLCBibG9jayk7CisJCQlyZXR1cm4gMDsKKwkJfQorICAgIAorCQlkaXJibG9jayA9IChzdHJ1Y3QgZWZzX2RpciAqKSBiaC0+Yl9kYXRhOworCisJCWlmIChiZTE2X3RvX2NwdShkaXJibG9jay0+bWFnaWMpICE9IEVGU19ESVJCTEtfTUFHSUMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRUZTOiBmaW5kX2VudHJ5KCk6IGludmFsaWQgZGlyZWN0b3J5IGJsb2NrXG4iKTsKKwkJCWJyZWxzZShiaCk7CisJCQlyZXR1cm4oMCk7CisJCX0KKworCQlmb3Ioc2xvdCA9IDA7IHNsb3QgPCBkaXJibG9jay0+c2xvdHM7IHNsb3QrKykgeworCQkJZGlyc2xvdCAgPSAoc3RydWN0IGVmc19kZW50cnkgKikgKCgoY2hhciAqKSBiaC0+Yl9kYXRhKSArIEVGU19TTE9UQVQoZGlyYmxvY2ssIHNsb3QpKTsKKworCQkJbmFtZWxlbiAgPSBkaXJzbG90LT5uYW1lbGVuOworCQkJbmFtZXB0ciAgPSBkaXJzbG90LT5uYW1lOworCisJCQlpZiAoKG5hbWVsZW4gPT0gbGVuKSAmJiAoIW1lbWNtcChuYW1lLCBuYW1lcHRyLCBsZW4pKSkgeworCQkJCWlub2RlbnVtID0gYmUzMl90b19jcHUoZGlyc2xvdC0+aW5vZGUpOworCQkJCWJyZWxzZShiaCk7CisJCQkJcmV0dXJuKGlub2RlbnVtKTsKKwkJCX0KKwkJfQorCQlicmVsc2UoYmgpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0cnVjdCBkZW50cnkgKmVmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpIHsKKwllZnNfaW5vX3QgaW5vZGVudW07CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBOVUxMOworCisJbG9ja19rZXJuZWwoKTsKKwlpbm9kZW51bSA9IGVmc19maW5kX2VudHJ5KGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuKTsKKwlpZiAoaW5vZGVudW0pIHsKKwkJaWYgKCEoaW5vZGUgPSBpZ2V0KGRpci0+aV9zYiwgaW5vZGVudW0pKSkgeworCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJCX0KKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBkZW50cnkgKmVmc19nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmNoaWxkKQoreworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWVmc19pbm9fdCBpbm87CisJaW50IGVycm9yOworCisJbG9ja19rZXJuZWwoKTsKKworCWVycm9yID0gLUVOT0VOVDsKKwlpbm8gPSBlZnNfZmluZF9lbnRyeShjaGlsZC0+ZF9pbm9kZSwgIi4uIiwgMik7CisJaWYgKCFpbm8pCisJCWdvdG8gZmFpbDsKKworCWVycm9yID0gLUVBQ0NFUzsKKwlpbm9kZSA9IGlnZXQoY2hpbGQtPmRfaW5vZGUtPmlfc2IsIGlubyk7CisJaWYgKCFpbm9kZSkKKwkJZ290byBmYWlsOworCisJZXJyb3IgPSAtRU5PTUVNOworCXBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisJaWYgKCFwYXJlbnQpCisJCWdvdG8gZmFpbF9pcHV0OworCisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBwYXJlbnQ7CisKKyBmYWlsX2lwdXQ6CisJaXB1dChpbm9kZSk7CisgZmFpbDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworfQpkaWZmIC0tZ2l0IGEvZnMvZWZzL3N1cGVyLmMgYi9mcy9lZnMvc3VwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGQ1ZWE5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZWZzL3N1cGVyLmMKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiBzdXBlci5jCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5IEFsIFNtaXRoCisgKgorICogUG9ydGlvbnMgZGVyaXZlZCBmcm9tIHdvcmsgKGMpIDE5OTUsMTk5NiBDaHJpc3RpYW4gVm9nZWxnc2FuZy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vmc192aC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vmc19mc19zYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorCitzdGF0aWMgaW50IGVmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKTsKK3N0YXRpYyBpbnQgZWZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB2b2lkICpkLCBpbnQgc2lsZW50KTsKKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqZWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGVmc19maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGVmc19mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiZWZzIiwKKwkuZ2V0X3NiCQk9IGVmc19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2Jsb2NrX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHRfdHlwZXMgc2dpX3B0X3R5cGVzW10gPSB7CisJezB4MDAsCQkiU0dJIHZoIn0sCisJezB4MDEsCQkiU0dJIHRya3JlcGwifSwKKwl7MHgwMiwJCSJTR0kgc2VjcmVwbCJ9LAorCXsweDAzLAkJIlNHSSByYXcifSwKKwl7MHgwNCwJCSJTR0kgYnNkIn0sCisJe1NHSV9TWVNWLAkiU0dJIHN5c3YifSwKKwl7MHgwNiwJCSJTR0kgdm9sIn0sCisJe1NHSV9FRlMsCSJTR0kgZWZzIn0sCisJezB4MDgsCQkiU0dJIGx2In0sCisJezB4MDksCQkiU0dJIHJsdiJ9LAorCXsweDBBLAkJIlNHSSB4ZnMifSwKKwl7MHgwQiwJCSJTR0kgeGZzbG9nIn0sCisJezB4MEMsCQkiU0dJIHhsdiJ9LAorCXsweDgyLAkJIkxpbnV4IHN3YXAifSwKKwl7MHg4MywJCSJMaW51eCBuYXRpdmUifSwKKwl7MCwJCU5VTEx9Cit9OworCisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKiBlZnNfaW5vZGVfY2FjaGVwOworCitzdGF0aWMgc3RydWN0IGlub2RlICplZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgZWZzX2lub2RlX2luZm8gKmVpOworCWVpID0gKHN0cnVjdCBlZnNfaW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2MoZWZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghZWkpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmZWktPnZmc19pbm9kZTsKK30KKworc3RhdGljIHZvaWQgZWZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUoZWZzX2lub2RlX2NhY2hlcCwgSU5PREVfSU5GTyhpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBlZnNfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IGVmc19pbm9kZV9pbmZvICopIGZvbzsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQorCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpCisJCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7Cit9CisgCitzdGF0aWMgaW50IGluaXRfaW5vZGVjYWNoZSh2b2lkKQoreworCWVmc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZWZzX2lub2RlX2NhY2hlIiwKKwkJCQlzaXplb2Yoc3RydWN0IGVmc19pbm9kZV9pbmZvKSwKKwkJCQkwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQlpbml0X29uY2UsIE5VTEwpOworCWlmIChlZnNfaW5vZGVfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKK3sKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGVmc19pbm9kZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9JTkZPICJlZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworc3RhdGljIHZvaWQgZWZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJa2ZyZWUocy0+c19mc19pbmZvKTsKKwlzLT5zX2ZzX2luZm8gPSBOVUxMOworfQorCitzdGF0aWMgaW50IGVmc19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJKmZsYWdzIHw9IE1TX1JET05MWTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGVmc19zdXBlcmJsb2NrX29wZXJhdGlvbnMgPSB7CisJLmFsbG9jX2lub2RlCT0gZWZzX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gZWZzX2Rlc3Ryb3lfaW5vZGUsCisJLnJlYWRfaW5vZGUJPSBlZnNfcmVhZF9pbm9kZSwKKwkucHV0X3N1cGVyCT0gZWZzX3B1dF9zdXBlciwKKwkuc3RhdGZzCQk9IGVmc19zdGF0ZnMsCisJLnJlbW91bnRfZnMJPSBlZnNfcmVtb3VudCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgZWZzX2V4cG9ydF9vcHMgPSB7CisJLmdldF9wYXJlbnQJPSBlZnNfZ2V0X3BhcmVudCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZWZzX2ZzKHZvaWQpIHsKKwlpbnQgZXJyOworCXByaW50aygiRUZTOiAiRUZTX1ZFUlNJT04iIC0gaHR0cDovL2Flc2NoaS5jaC5ldS5vcmcvZWZzL1xuIik7CisJZXJyID0gaW5pdF9pbm9kZWNhY2hlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmVmc19mc190eXBlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlyZXR1cm4gMDsKK291dDoKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKK291dDE6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfZWZzX2ZzKHZvaWQpIHsKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmVmc19mc190eXBlKTsKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9lZnNfZnMpCittb2R1bGVfZXhpdChleGl0X2Vmc19mcykKKworc3RhdGljIGVmc19ibG9ja190IGVmc192YWxpZGF0ZV92aChzdHJ1Y3Qgdm9sdW1lX2hlYWRlciAqdmgpIHsKKwlpbnQJCWk7CisJX19iZTMyCQljcywgKnVpOworCWludAkJY3N1bTsKKwllZnNfYmxvY2tfdAlzYmxvY2sgPSAwOyAvKiBzaHV0cyB1cCBnY2MgKi8KKwlzdHJ1Y3QgcHRfdHlwZXMJKnB0X2VudHJ5OworCWludAkJcHRfdHlwZSwgc2xpY2UgPSAtMTsKKworCWlmIChiZTMyX3RvX2NwdSh2aC0+dmhfbWFnaWMpICE9IFZITUFHSUMpIHsKKwkJLyoKKwkJICogYXNzdW1lIHRoYXQgd2UncmUgZGVhbGluZyB3aXRoIGEgcGFydGl0aW9uIGFuZCBhbGxvdworCQkgKiByZWFkX3N1cGVyKCkgdG8gdHJ5IGFuZCBkZXRlY3QgYSB2YWxpZCBzdXBlcmJsb2NrCisJCSAqIG9uIHRoZSBuZXh0IGJsb2NrLgorCQkgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJdWkgPSAoKF9fYmUzMiAqKSAodmggKyAxKSkgLSAxOworCWZvcihjc3VtID0gMDsgdWkgPj0gKChfX2JlMzIgKikgdmgpOykgeworCQljcyA9ICp1aS0tOworCQljc3VtICs9IGJlMzJfdG9fY3B1KGNzKTsKKwl9CisJaWYgKGNzdW0pIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRUZTOiBTR0kgZGlza2xhYmVsOiBjaGVja3N1bSBiYWQsIGxhYmVsIGNvcnJ1cHRlZFxuIik7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgIkVGUzogYmY6IFwiJTE2c1wiXG4iLCB2aC0+dmhfYm9vdGZpbGUpOworCisJZm9yKGkgPSAwOyBpIDwgTlZESVI7IGkrKykgeworCQlpbnQJajsKKwkJY2hhcgluYW1lW1ZETkFNRVNJWkUrMV07CisKKwkJZm9yKGogPSAwOyBqIDwgVkROQU1FU0laRTsgaisrKSB7CisJCQluYW1lW2pdID0gdmgtPnZoX3ZkW2ldLnZkX25hbWVbal07CisJCX0KKwkJbmFtZVtqXSA9IChjaGFyKSAwOworCisJCWlmIChuYW1lWzBdKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiRUZTOiB2aDogJThzIGJsb2NrOiAweCUwOHggc2l6ZTogMHglMDh4XG4iLAorCQkJCW5hbWUsCisJCQkJKGludCkgYmUzMl90b19jcHUodmgtPnZoX3ZkW2ldLnZkX2xibiksCisJCQkJKGludCkgYmUzMl90b19jcHUodmgtPnZoX3ZkW2ldLnZkX25ieXRlcykpOworCQl9CisJfQorI2VuZGlmCisKKwlmb3IoaSA9IDA7IGkgPCBOUEFSVEFCOyBpKyspIHsKKwkJcHRfdHlwZSA9IChpbnQpIGJlMzJfdG9fY3B1KHZoLT52aF9wdFtpXS5wdF90eXBlKTsKKwkJZm9yKHB0X2VudHJ5ID0gc2dpX3B0X3R5cGVzOyBwdF9lbnRyeS0+cHRfbmFtZTsgcHRfZW50cnkrKykgeworCQkJaWYgKHB0X3R5cGUgPT0gcHRfZW50cnktPnB0X3R5cGUpIGJyZWFrOworCQl9CisjaWZkZWYgREVCVUcKKwkJaWYgKGJlMzJfdG9fY3B1KHZoLT52aF9wdFtpXS5wdF9uYmxrcykpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJFRlM6IHB0ICUyZDogc3RhcnQ6ICUwOGQgc2l6ZTogJTA4ZCB0eXBlOiAweCUwMnggKCVzKVxuIiwKKwkJCQlpLAorCQkJCShpbnQpIGJlMzJfdG9fY3B1KHZoLT52aF9wdFtpXS5wdF9maXJzdGxibiksCisJCQkJKGludCkgYmUzMl90b19jcHUodmgtPnZoX3B0W2ldLnB0X25ibGtzKSwKKwkJCQlwdF90eXBlLAorCQkJCShwdF9lbnRyeS0+cHRfbmFtZSkgPyBwdF9lbnRyeS0+cHRfbmFtZSA6ICJ1bmtub3duIik7CisJCX0KKyNlbmRpZgorCQlpZiAoSVNfRUZTKHB0X3R5cGUpKSB7CisJCQlzYmxvY2sgPSBiZTMyX3RvX2NwdSh2aC0+dmhfcHRbaV0ucHRfZmlyc3RsYm4pOworCQkJc2xpY2UgPSBpOworCQl9CisJfQorCisJaWYgKHNsaWNlID09IC0xKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiRUZTOiBwYXJ0aXRpb24gdGFibGUgY29udGFpbmVkIG5vIEVGUyBwYXJ0aXRpb25zXG4iKTsKKyNpZmRlZiBERUJVRworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIkVGUzogdXNpbmcgc2xpY2UgJWQgKHR5cGUgJXMsIG9mZnNldCAweCV4KVxuIiwKKwkJCXNsaWNlLAorCQkJKHB0X2VudHJ5LT5wdF9uYW1lKSA/IHB0X2VudHJ5LT5wdF9uYW1lIDogInVua25vd24iLAorCQkJc2Jsb2NrKTsKKyNlbmRpZgorCX0KKwlyZXR1cm4oc2Jsb2NrKTsKK30KKworc3RhdGljIGludCBlZnNfdmFsaWRhdGVfc3VwZXIoc3RydWN0IGVmc19zYl9pbmZvICpzYiwgc3RydWN0IGVmc19zdXBlciAqc3VwZXIpIHsKKworCWlmICghSVNfRUZTX01BR0lDKGJlMzJfdG9fY3B1KHN1cGVyLT5mc19tYWdpYykpKSByZXR1cm4gLTE7CisKKwlzYi0+ZnNfbWFnaWMgICAgID0gYmUzMl90b19jcHUoc3VwZXItPmZzX21hZ2ljKTsKKwlzYi0+dG90YWxfYmxvY2tzID0gYmUzMl90b19jcHUoc3VwZXItPmZzX3NpemUpOworCXNiLT5maXJzdF9ibG9jayAgPSBiZTMyX3RvX2NwdShzdXBlci0+ZnNfZmlyc3RjZyk7CisJc2ItPmdyb3VwX3NpemUgICA9IGJlMzJfdG9fY3B1KHN1cGVyLT5mc19jZ2ZzaXplKTsKKwlzYi0+ZGF0YV9mcmVlICAgID0gYmUzMl90b19jcHUoc3VwZXItPmZzX3RmcmVlKTsKKwlzYi0+aW5vZGVfZnJlZSAgID0gYmUzMl90b19jcHUoc3VwZXItPmZzX3Rpbm9kZSk7CisJc2ItPmlub2RlX2Jsb2NrcyA9IGJlMTZfdG9fY3B1KHN1cGVyLT5mc19jZ2lzaXplKTsKKwlzYi0+dG90YWxfZ3JvdXBzID0gYmUxNl90b19jcHUoc3VwZXItPmZzX25jZyk7CisgICAgCisJcmV0dXJuIDA7ICAgIAorfQorCitzdGF0aWMgaW50IGVmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZCwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgZWZzX3NiX2luZm8gKnNiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGlub2RlICpyb290OworCisgCXNiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVmc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYikKKwkJcmV0dXJuIC1FTk9NRU07CisJcy0+c19mc19pbmZvID0gc2I7CisJbWVtc2V0KHNiLCAwLCBzaXplb2Yoc3RydWN0IGVmc19zYl9pbmZvKSk7CisgCisJcy0+c19tYWdpYwkJPSBFRlNfU1VQRVJfTUFHSUM7CisJaWYgKCFzYl9zZXRfYmxvY2tzaXplKHMsIEVGU19CTE9DS1NJWkUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRUZTOiBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCAlZCBieXRlIGJsb2Nrc1xuIiwKKwkJCUVGU19CTE9DS1NJWkUpOworCQlnb3RvIG91dF9ub19mc191bDsKKwl9CisgIAorCS8qIHJlYWQgdGhlIHZoICh2b2x1bWUgaGVhZGVyKSBibG9jayAqLworCWJoID0gc2JfYnJlYWQocywgMCk7CisKKwlpZiAoIWJoKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRUZTOiBjYW5ub3QgcmVhZCB2b2x1bWUgaGVhZGVyXG4iKTsKKwkJZ290byBvdXRfbm9fZnNfdWw7CisJfQorCisJLyoKKwkgKiBpZiB0aGlzIHJldHVybnMgemVybyB0aGVuIHdlIGRpZG4ndCBmaW5kIGFueSBwYXJ0aXRpb24gdGFibGUuCisJICogdGhpcyBpc24ndCAoeWV0KSBhbiBlcnJvciAtIGp1c3QgYXNzdW1lIGZvciB0aGUgbW9tZW50IHRoYXQKKwkgKiB0aGUgZGV2aWNlIGlzIHZhbGlkIGFuZCBnbyBvbiB0byBzZWFyY2ggZm9yIGEgc3VwZXJibG9jay4KKwkgKi8KKwlzYi0+ZnNfc3RhcnQgPSBlZnNfdmFsaWRhdGVfdmgoKHN0cnVjdCB2b2x1bWVfaGVhZGVyICopIGJoLT5iX2RhdGEpOworCWJyZWxzZShiaCk7CisKKwlpZiAoc2ItPmZzX3N0YXJ0ID09IC0xKSB7CisJCWdvdG8gb3V0X25vX2ZzX3VsOworCX0KKworCWJoID0gc2JfYnJlYWQocywgc2ItPmZzX3N0YXJ0ICsgRUZTX1NVUEVSKTsKKwlpZiAoIWJoKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRUZTOiBjYW5ub3QgcmVhZCBzdXBlcmJsb2NrXG4iKTsKKwkJZ290byBvdXRfbm9fZnNfdWw7CisJfQorCQkKKwlpZiAoZWZzX3ZhbGlkYXRlX3N1cGVyKHNiLCAoc3RydWN0IGVmc19zdXBlciAqKSBiaC0+Yl9kYXRhKSkgeworI2lmZGVmIERFQlVHCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVGUzogaW52YWxpZCBzdXBlcmJsb2NrIGF0IGJsb2NrICV1XG4iLCBzYi0+ZnNfc3RhcnQgKyBFRlNfU1VQRVIpOworI2VuZGlmCisJCWJyZWxzZShiaCk7CisJCWdvdG8gb3V0X25vX2ZzX3VsOworCX0KKwlicmVsc2UoYmgpOworCisJaWYgKCEocy0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKyNpZmRlZiBERUJVRworCQlwcmludGsoS0VSTl9JTkZPICJFRlM6IGZvcmNpbmcgcmVhZC1vbmx5IG1vZGVcbiIpOworI2VuZGlmCisJCXMtPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCX0KKwlzLT5zX29wICAgPSAmZWZzX3N1cGVyYmxvY2tfb3BlcmF0aW9uczsKKwlzLT5zX2V4cG9ydF9vcCA9ICZlZnNfZXhwb3J0X29wczsKKwlyb290ID0gaWdldChzLCBFRlNfUk9PVElOT0RFKTsKKwlzLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CisgCisJaWYgKCEocy0+c19yb290KSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVGUzogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKKwkJaXB1dChyb290KTsKKwkJZ290byBvdXRfbm9fZnM7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9ub19mc191bDoKK291dF9ub19mczoKKwlzLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNiKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBlZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IGtzdGF0ZnMgKmJ1ZikgeworCXN0cnVjdCBlZnNfc2JfaW5mbyAqc2IgPSBTVVBFUl9JTkZPKHMpOworCisJYnVmLT5mX3R5cGUgICAgPSBFRlNfU1VQRVJfTUFHSUM7CS8qIGVmcyBtYWdpYyBudW1iZXIgKi8KKwlidWYtPmZfYnNpemUgICA9IEVGU19CTE9DS1NJWkU7CQkvKiBibG9ja3NpemUgKi8KKwlidWYtPmZfYmxvY2tzICA9IHNiLT50b3RhbF9ncm91cHMgKgkvKiB0b3RhbCBkYXRhIGJsb2NrcyAqLworCQkJKHNiLT5ncm91cF9zaXplIC0gc2ItPmlub2RlX2Jsb2Nrcyk7CisJYnVmLT5mX2JmcmVlICAgPSBzYi0+ZGF0YV9mcmVlOwkJLyogZnJlZSBkYXRhIGJsb2NrcyAqLworCWJ1Zi0+Zl9iYXZhaWwgID0gc2ItPmRhdGFfZnJlZTsJCS8qIGZyZWUgYmxvY2tzIGZvciBub24tcm9vdCAqLworCWJ1Zi0+Zl9maWxlcyAgID0gc2ItPnRvdGFsX2dyb3VwcyAqCS8qIHRvdGFsIGlub2RlcyAqLworCQkJc2ItPmlub2RlX2Jsb2NrcyAqCisJCQkoRUZTX0JMT0NLU0laRSAvIHNpemVvZihzdHJ1Y3QgZWZzX2Rpbm9kZSkpOworCWJ1Zi0+Zl9mZnJlZSAgID0gc2ItPmlub2RlX2ZyZWU7CS8qIGZyZWUgaW5vZGVzICovCisJYnVmLT5mX2ZzaWQudmFsWzBdID0gKHNiLT5mc19tYWdpYyA+PiAxNikgJiAweGZmZmY7IC8qIGZzIElEICovCisJYnVmLT5mX2ZzaWQudmFsWzFdID0gIHNiLT5mc19tYWdpYyAgICAgICAgJiAweGZmZmY7IC8qIGZzIElEICovCisJYnVmLT5mX25hbWVsZW4gPSBFRlNfTUFYTkFNRUxFTjsJLyogbWF4IGZpbGVuYW1lIGxlbmd0aCAqLworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL2Vmcy9zeW1saW5rLmMgYi9mcy9lZnMvc3ltbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOWEzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9lZnMvc3ltbGluay5jCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBzeW1saW5rLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgQWwgU21pdGgKKyAqCisgKiBQb3J0aW9ucyBkZXJpdmVkIGZyb20gd29yayAoYykgMTk5NSwxOTk2IENocmlzdGlhbiBWb2dlbGdzYW5nLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCitzdGF0aWMgaW50IGVmc19zeW1saW5rX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwljaGFyICpsaW5rID0ga21hcChwYWdlKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJZWZzX2Jsb2NrX3Qgc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJaW50IGVycjsKKyAgCisJZXJyID0gLUVOQU1FVE9PTE9ORzsKKwlpZiAoc2l6ZSA+IDIgKiBFRlNfQkxPQ0tTSVpFKQorCQlnb3RvIGZhaWw7CisgIAorCWxvY2tfa2VybmVsKCk7CisJLyogcmVhZCBmaXJzdCA1MTIgYnl0ZXMgb2YgbGluayB0YXJnZXQgKi8KKwllcnIgPSAtRUlPOworCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIGVmc19ibWFwKGlub2RlLCAwKSk7CisJaWYgKCFiaCkKKwkJZ290byBmYWlsOworCW1lbWNweShsaW5rLCBiaC0+Yl9kYXRhLCAoc2l6ZSA+IEVGU19CTE9DS1NJWkUpID8gRUZTX0JMT0NLU0laRSA6IHNpemUpOworCWJyZWxzZShiaCk7CisJaWYgKHNpemUgPiBFRlNfQkxPQ0tTSVpFKSB7CisJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIGVmc19ibWFwKGlub2RlLCAxKSk7CisJCWlmICghYmgpCisJCQlnb3RvIGZhaWw7CisJCW1lbWNweShsaW5rICsgRUZTX0JMT0NLU0laRSwgYmgtPmJfZGF0YSwgc2l6ZSAtIEVGU19CTE9DS1NJWkUpOworCQlicmVsc2UoYmgpOworCX0KKwlsaW5rW3NpemVdID0gJ1wwJzsKKwl1bmxvY2tfa2VybmVsKCk7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKK2ZhaWw6CisJdW5sb2NrX2tlcm5lbCgpOworCVNldFBhZ2VFcnJvcihwYWdlKTsKKwlrdW5tYXAocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBlZnNfc3ltbGlua19hb3BzID0geworCS5yZWFkcGFnZQk9IGVmc19zeW1saW5rX3JlYWRwYWdlCit9OwpkaWZmIC0tZ2l0IGEvZnMvZXZlbnRwb2xsLmMgYi9mcy9ldmVudHBvbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWI5NjZjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXZlbnRwb2xsLmMKQEAgLTAsMCArMSwxNjM5IEBACisvKgorICogIGZzL2V2ZW50cG9sbC5jICggRWZmaWNlbnQgZXZlbnQgcG9sbGluZyBpbXBsZW1lbnRhdGlvbiApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLC4uLiwyMDAzCSBEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V2ZW50cG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21tYW4uaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisKKy8qCisgKiBMT0NLSU5HOgorICogVGhlcmUgYXJlIHRocmVlIGxldmVsIG9mIGxvY2tpbmcgcmVxdWlyZWQgYnkgZXBvbGwgOgorICoKKyAqIDEpIGVwc2VtIChzZW1hcGhvcmUpCisgKiAyKSBlcC0+c2VtIChyd19zZW1hcGhvcmUpCisgKiAzKSBlcC0+bG9jayAocndfbG9jaykKKyAqCisgKiBUaGUgYWNxdWlyZSBvcmRlciBpcyB0aGUgb25lIGxpc3RlZCBhYm92ZSwgZnJvbSAxIHRvIDMuCisgKiBXZSBuZWVkIGEgc3BpbmxvY2sgKGVwLT5sb2NrKSBiZWNhdXNlIHdlIG1hbmlwdWxhdGUgb2JqZWN0cworICogZnJvbSBpbnNpZGUgdGhlIHBvbGwgY2FsbGJhY2ssIHRoYXQgbWlnaHQgYmUgdHJpZ2dlcmVkIGZyb20KKyAqIGEgd2FrZV91cCgpIHRoYXQgaW4gdHVybiBtaWdodCBiZSBjYWxsZWQgZnJvbSBJUlEgY29udGV4dC4KKyAqIFNvIHdlIGNhbid0IHNsZWVwIGluc2lkZSB0aGUgcG9sbCBjYWxsYmFjayBhbmQgaGVuY2Ugd2UgbmVlZAorICogYSBzcGlubG9jay4gRHVyaW5nIHRoZSBldmVudCB0cmFuc2ZlciBsb29wIChmcm9tIGtlcm5lbCB0bworICogdXNlciBzcGFjZSkgd2UgY291bGQgZW5kIHVwIHNsZWVwaW5nIGR1ZSBhIGNvcHlfdG9fdXNlcigpLCBzbworICogd2UgbmVlZCBhIGxvY2sgdGhhdCB3aWxsIGFsbG93IHVzIHRvIHNsZWVwLiBUaGlzIGxvY2sgaXMgYQorICogcmVhZC13cml0ZSBzZW1hcGhvcmUgKGVwLT5zZW0pLiBJdCBpcyBhY3F1aXJlZCBvbiByZWFkIGR1cmluZworICogdGhlIGV2ZW50IHRyYW5zZmVyIGxvb3AgYW5kIGluIHdyaXRlIGR1cmluZyBlcG9sbF9jdGwoRVBPTExfQ1RMX0RFTCkKKyAqIGFuZCBkdXJpbmcgZXZlbnRwb2xsX3JlbGVhc2VfZmlsZSgpLiBUaGVuIHdlIGFsc28gbmVlZCBhIGdsb2JhbAorICogc2VtYXBob3JlIHRvIHNlcmlhbGl6ZSBldmVudHBvbGxfcmVsZWFzZV9maWxlKCkgYW5kIGVwX2ZyZWUoKS4KKyAqIFRoaXMgc2VtYXBob3JlIGlzIGFjcXVpcmVkIGJ5IGVwX2ZyZWUoKSBkdXJpbmcgdGhlIGVwb2xsIGZpbGUKKyAqIGNsZWFudXAgcGF0aCBhbmQgaXQgaXMgYWxzbyBhY3F1aXJlZCBieSBldmVudHBvbGxfcmVsZWFzZV9maWxlKCkKKyAqIGlmIGEgZmlsZSBoYXMgYmVlbiBwdXNoZWQgaW5zaWRlIGFuIGVwb2xsIHNldCBhbmQgaXQgaXMgdGhlbgorICogY2xvc2UoKWQgd2l0aG91dCBhIHByZXZpb3VzIGNhbGwgdG9lcG9sbF9jdGwoRVBPTExfQ1RMX0RFTCkuCisgKiBJdCBpcyBwb3NzaWJsZSB0byBkcm9wIHRoZSAiZXAtPnNlbSIgYW5kIHRvIHVzZSB0aGUgZ2xvYmFsCisgKiBzZW1hcGhvcmUgImVwc2VtIiAodG9nZXRoZXIgd2l0aCAiZXAtPmxvY2siKSB0byBoYXZlIGl0IHdvcmtpbmcsCisgKiBidXQgaGF2aW5nICJlcC0+c2VtIiB3aWxsIG1ha2UgdGhlIGludGVyZmFjZSBtb3JlIHNjYWxhYmxlLgorICogRXZlbnRzIHRoYXQgcmVxdWlyZSBob2xkaW5nICJlcHNlbSIgYXJlIHZlcnkgcmFyZSwgd2hpbGUgZm9yCisgKiBub3JtYWwgb3BlcmF0aW9ucyB0aGUgZXBvbGwgcHJpdmF0ZSAiZXAtPnNlbSIgd2lsbCBndWFyYW50ZWUKKyAqIGEgZ3JlYXRlciBzY2FsYWJpbGl0eS4KKyAqLworCisKKyNkZWZpbmUgRVZFTlRQT0xMRlNfTUFHSUMgMHgwMzExMTk2NSAvKiBNeSBiaXJ0aGRheSBzaG91bGQgd29yayBmb3IgdGhpcyA6KSAqLworCisjZGVmaW5lIERFQlVHX0VQT0xMIDAKKworI2lmIERFQlVHX0VQT0xMID4gMAorI2RlZmluZSBEUFJJTlRLKHgpIHByaW50ayB4CisjZGVmaW5lIEROUFJJTlRLKG4sIHgpIGRvIHsgaWYgKChuKSA8PSBERUJVR19FUE9MTCkgcHJpbnRrIHg7IH0gd2hpbGUgKDApCisjZWxzZSAvKiAjaWYgREVCVUdfRVBPTEwgPiAwICovCisjZGVmaW5lIERQUklOVEsoeCkgKHZvaWQpIDAKKyNkZWZpbmUgRE5QUklOVEsobiwgeCkgKHZvaWQpIDAKKyNlbmRpZiAvKiAjaWYgREVCVUdfRVBPTEwgPiAwICovCisKKyNkZWZpbmUgREVCVUdfRVBJIDAKKworI2lmIERFQlVHX0VQSSAhPSAwCisjZGVmaW5lIEVQSV9TTEFCX0RFQlVHIChTTEFCX0RFQlVHX0ZSRUUgfCBTTEFCX1JFRF9aT05FIC8qIHwgU0xBQl9QT0lTT04gKi8pCisjZWxzZSAvKiAjaWYgREVCVUdfRVBJICE9IDAgKi8KKyNkZWZpbmUgRVBJX1NMQUJfREVCVUcgMAorI2VuZGlmIC8qICNpZiBERUJVR19FUEkgIT0gMCAqLworCisvKiBFcG9sbCBwcml2YXRlIGJpdHMgaW5zaWRlIHRoZSBldmVudCBtYXNrICovCisjZGVmaW5lIEVQX1BSSVZBVEVfQklUUyAoRVBPTExPTkVTSE9UIHwgRVBPTExFVCkKKworLyogTWF4aW11bSBudW1iZXIgb2YgcG9sbCB3YWtlIHVwIG5lc3RzIHdlIGFyZSBhbGxvd2luZyAqLworI2RlZmluZSBFUF9NQVhfUE9MTFdBS0VfTkVTVFMgNAorCisvKiBNYWNybyB0byBhbGxvY2F0ZSBhICJzdHJ1Y3QgZXBpdGVtIiBmcm9tIHRoZSBzbGFiIGNhY2hlICovCisjZGVmaW5lIEVQSV9NRU1fQUxMT0MoKQkoc3RydWN0IGVwaXRlbSAqKSBrbWVtX2NhY2hlX2FsbG9jKGVwaV9jYWNoZSwgU0xBQl9LRVJORUwpCisKKy8qIE1hY3JvIHRvIGZyZWUgYSAic3RydWN0IGVwaXRlbSIgdG8gdGhlIHNsYWIgY2FjaGUgKi8KKyNkZWZpbmUgRVBJX01FTV9GUkVFKHApIGttZW1fY2FjaGVfZnJlZShlcGlfY2FjaGUsIHApCisKKy8qIE1hY3JvIHRvIGFsbG9jYXRlIGEgInN0cnVjdCBlcHBvbGxfZW50cnkiIGZyb20gdGhlIHNsYWIgY2FjaGUgKi8KKyNkZWZpbmUgUFdRX01FTV9BTExPQygpCShzdHJ1Y3QgZXBwb2xsX2VudHJ5ICopIGttZW1fY2FjaGVfYWxsb2MocHdxX2NhY2hlLCBTTEFCX0tFUk5FTCkKKworLyogTWFjcm8gdG8gZnJlZSBhICJzdHJ1Y3QgZXBwb2xsX2VudHJ5IiB0byB0aGUgc2xhYiBjYWNoZSAqLworI2RlZmluZSBQV1FfTUVNX0ZSRUUocCkga21lbV9jYWNoZV9mcmVlKHB3cV9jYWNoZSwgcCkKKworLyogRmFzdCB0ZXN0IHRvIHNlZSBpZiB0aGUgZmlsZSBpcyBhbiBldmVucG9sbCBmaWxlICovCisjZGVmaW5lIElTX0ZJTEVfRVBPTEwoZikgKChmKS0+Zl9vcCA9PSAmZXZlbnRwb2xsX2ZvcHMpCisKKy8qIFNldHVwIHRoZSBzdHJ1Y3R1cmUgdGhhdCBpcyB1c2VkIGFzIGtleSBmb3IgdGhlIHJiLXRyZWUgKi8KKyNkZWZpbmUgRVBfU0VUX0ZGRChwLCBmLCBkKSBkbyB7IChwKS0+ZmlsZSA9IChmKTsgKHApLT5mZCA9IChkKTsgfSB3aGlsZSAoMCkKKworLyogQ29tcGFyZSByYi10cmVlIGtleXMgKi8KKyNkZWZpbmUgRVBfQ01QX0ZGRChwMSwgcDIpICgocDEpLT5maWxlID4gKHAyKS0+ZmlsZSA/ICsxOiBcCisJCQkgICAgKChwMSktPmZpbGUgPCAocDIpLT5maWxlID8gLTE6IChwMSktPmZkIC0gKHAyKS0+ZmQpKQorCisvKiBTcGVjaWFsIGluaXRpYWxpemF0aW9uIGZvciB0aGUgcmItdHJlZSBub2RlIHRvIGRldGVjdCBsaW5rYWdlICovCisjZGVmaW5lIEVQX1JCX0lOSVROT0RFKG4pIChuKS0+cmJfcGFyZW50ID0gKG4pCisKKy8qIFJlbW92ZXMgYSBub2RlIGZyb20gdGhlIHJiLXRyZWUgYW5kIG1hcmtzIGl0IGZvciBhIGZhc3QgaXMtbGlua2VkIGNoZWNrICovCisjZGVmaW5lIEVQX1JCX0VSQVNFKG4sIHIpIGRvIHsgcmJfZXJhc2Uobiwgcik7IChuKS0+cmJfcGFyZW50ID0gKG4pOyB9IHdoaWxlICgwKQorCisvKiBGYXN0IGNoZWNrIHRvIHZlcmlmeSB0aGF0IHRoZSBpdGVtIGlzIGxpbmtlZCB0byB0aGUgbWFpbiByYi10cmVlICovCisjZGVmaW5lIEVQX1JCX0xJTktFRChuKSAoKG4pLT5yYl9wYXJlbnQgIT0gKG4pKQorCisvKgorICogUmVtb3ZlIHRoZSBpdGVtIGZyb20gdGhlIGxpc3QgYW5kIHBlcmZvcm0gaXRzIGluaXRpYWxpemF0aW9uLgorICogVGhpcyBpcyB1c2VmdWwgZm9yIHVzIGJlY2F1c2Ugd2UgY2FuIHRlc3QgaWYgdGhlIGl0ZW0gaXMgbGlua2VkCisgKiB1c2luZyAiRVBfSVNfTElOS0VEKHApIi4KKyAqLworI2RlZmluZSBFUF9MSVNUX0RFTChwKSBkbyB7IGxpc3RfZGVsKHApOyBJTklUX0xJU1RfSEVBRChwKTsgfSB3aGlsZSAoMCkKKworLyogVGVsbHMgdXMgaWYgdGhlIGl0ZW0gaXMgY3VycmVudGx5IGxpbmtlZCAqLworI2RlZmluZSBFUF9JU19MSU5LRUQocCkgKCFsaXN0X2VtcHR5KHApKQorCisvKiBHZXQgdGhlICJzdHJ1Y3QgZXBpdGVtIiBmcm9tIGEgd2FpdCBxdWV1ZSBwb2ludGVyICovCisjZGVmaW5lIEVQX0lURU1fRlJPTV9XQUlUKHApICgoc3RydWN0IGVwaXRlbSAqKSBjb250YWluZXJfb2YocCwgc3RydWN0IGVwcG9sbF9lbnRyeSwgd2FpdCktPmJhc2UpCisKKy8qIEdldCB0aGUgInN0cnVjdCBlcGl0ZW0iIGZyb20gYW4gZXBvbGwgcXVldWUgd3JhcHBlciAqLworI2RlZmluZSBFUF9JVEVNX0ZST01fRVBRVUVVRShwKSAoY29udGFpbmVyX29mKHAsIHN0cnVjdCBlcF9wcXVldWUsIHB0KS0+ZXBpKQorCisvKiBUZWxscyBpZiB0aGUgZXBvbGxfY3RsKDIpIG9wZXJhdGlvbiBuZWVkcyBhbiBldmVudCBjb3B5IGZyb20gdXNlcnNwYWNlICovCisjZGVmaW5lIEVQX09QX0hBU0hfRVZFTlQob3ApICgob3ApICE9IEVQT0xMX0NUTF9ERUwpCisKKworc3RydWN0IGVwb2xsX2ZpbGVmZCB7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJaW50IGZkOworfTsKKworLyoKKyAqIE5vZGUgdGhhdCBpcyBsaW5rZWQgaW50byB0aGUgIndha2VfdGFza19saXN0IiBtZW1iZXIgb2YgdGhlICJzdHJ1Y3QgcG9sbF9zYWZld2FrZSIuCisgKiBJdCBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb24gYWxsIHRhc2tzIHRoYXQgYXJlIGN1cnJlbnRseSBpbnNpZGUgdGhlIHdha2VfdXAoKSBjb2RlCisgKiB0byAxKSBzaG9ydC1jaXJjdWl0IHRoZSBvbmUgY29taW5nIGZyb20gdGhlIHNhbWUgdGFzayBhbmQgc2FtZSB3YWl0IHF1ZXVlIGhlYWQKKyAqICggbG9vcCApIDIpIGFsbG93IGEgbWF4aW11bSBudW1iZXIgb2YgZXBvbGwgZGVzY3JpcHRvcnMgaW5jbHVzaW9uIG5lc3RpbmcKKyAqIDMpIGxldCBnbyB0aGUgb25lcyBjb21pbmcgZnJvbSBvdGhlciB0YXNrcy4KKyAqLworc3RydWN0IHdha2VfdGFza19ub2RlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxsaW5rOworCXRhc2tfdCAqdGFzazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAqd3E7Cit9OworCisvKgorICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgc2FmZSBwb2xsIHdha2UgdXAgYXZvaWRpbmcgdG8gcmVlbnRlcgorICogdGhlIHBvbGwgY2FsbGJhY2sgZnJvbSBpbnNpZGUgd2FrZV91cCgpLgorICovCitzdHJ1Y3QgcG9sbF9zYWZld2FrZSB7CisJc3RydWN0IGxpc3RfaGVhZCB3YWtlX3Rhc2tfbGlzdDsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgc3RvcmVkIGluc2lkZSB0aGUgInByaXZhdGVfZGF0YSIgbWVtYmVyIG9mIHRoZSBmaWxlCisgKiBzdHJ1Y3R1cmUgYW5kIHJhcHJlc2VudCB0aGUgbWFpbiBkYXRhIHNydWN0dXJlIGZvciB0aGUgZXZlbnRwb2xsCisgKiBpbnRlcmZhY2UuCisgKi8KK3N0cnVjdCBldmVudHBvbGwgeworCS8qIFByb3RlY3QgdGhlIHRoaXMgc3RydWN0dXJlIGFjY2VzcyAqLworCXJ3bG9ja190IGxvY2s7CisKKwkvKgorCSAqIFRoaXMgc2VtYXBob3JlIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgZmlsZXMgYXJlIG5vdCByZW1vdmVkCisJICogd2hpbGUgZXBvbGwgaXMgdXNpbmcgdGhlbS4gVGhpcyBpcyByZWFkLWhlbGQgZHVyaW5nIHRoZSBldmVudAorCSAqIGNvbGxlY3Rpb24gbG9vcCBhbmQgaXQgaXMgd3JpdGUtaGVsZCBkdXJpbmcgdGhlIGZpbGUgY2xlYW51cAorCSAqIHBhdGgsIHRoZSBlcG9sbCBmaWxlIGV4aXQgY29kZSBhbmQgdGhlIGN0bCBvcGVyYXRpb25zLgorCSAqLworCXN0cnVjdCByd19zZW1hcGhvcmUgc2VtOworCisJLyogV2FpdCBxdWV1ZSB1c2VkIGJ5IHN5c19lcG9sbF93YWl0KCkgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cTsKKworCS8qIFdhaXQgcXVldWUgdXNlZCBieSBmaWxlLT5wb2xsKCkgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBwb2xsX3dhaXQ7CisKKwkvKiBMaXN0IG9mIHJlYWR5IGZpbGUgZGVzY3JpcHRvcnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHJkbGxpc3Q7CisKKwkvKiBSQi1UcmVlIHJvb3QgdXNlZCB0byBzdG9yZSBtb25pdG9yZWQgZmQgc3RydWN0cyAqLworCXN0cnVjdCByYl9yb290IHJicjsKK307CisKKy8qIFdhaXQgc3RydWN0dXJlIHVzZWQgYnkgdGhlIHBvbGwgaG9va3MgKi8KK3N0cnVjdCBlcHBvbGxfZW50cnkgeworCS8qIExpc3QgaGVhZGVyIHVzZWQgdG8gbGluayB0aGlzIHN0cnVjdHVyZSB0byB0aGUgInN0cnVjdCBlcGl0ZW0iICovCisJc3RydWN0IGxpc3RfaGVhZCBsbGluazsKKworCS8qIFRoZSAiYmFzZSIgcG9pbnRlciBpcyBzZXQgdG8gdGhlIGNvbnRhaW5lciAic3RydWN0IGVwaXRlbSIgKi8KKwl2b2lkICpiYXNlOworCisJLyoKKwkgKiBXYWl0IHF1ZXVlIGl0ZW0gdGhhdCB3aWxsIGJlIGxpbmtlZCB0byB0aGUgdGFyZ2V0IGZpbGUgd2FpdAorCSAqIHF1ZXVlIGhlYWQuCisJICovCisJd2FpdF9xdWV1ZV90IHdhaXQ7CisKKwkvKiBUaGUgd2FpdCBxdWV1ZSBoZWFkIHRoYXQgbGlua2VkIHRoZSAid2FpdCIgd2FpdCBxdWV1ZSBpdGVtICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgKndoZWFkOworfTsKKworLyoKKyAqIEVhY2ggZmlsZSBkZXNjcmlwdG9yIGFkZGVkIHRvIHRoZSBldmVudHBvbGwgaW50ZXJmYWNlIHdpbGwKKyAqIGhhdmUgYW4gZW50cnkgb2YgdGhpcyB0eXBlIGxpbmtlZCB0byB0aGUgaGFzaC4KKyAqLworc3RydWN0IGVwaXRlbSB7CisJLyogUkItVHJlZSBub2RlIHVzZWQgdG8gbGluayB0aGlzIHN0cnVjdHVyZSB0byB0aGUgZXZlbnRwb2xsIHJiLXRyZWUgKi8KKwlzdHJ1Y3QgcmJfbm9kZSByYm47CisKKwkvKiBMaXN0IGhlYWRlciB1c2VkIHRvIGxpbmsgdGhpcyBzdHJ1Y3R1cmUgdG8gdGhlIGV2ZW50cG9sbCByZWFkeSBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCByZGxsaW5rOworCisJLyogVGhlIGZpbGUgZGVzY3JpcHRvciBpbmZvcm1hdGlvbiB0aGlzIGl0ZW0gcmVmZXJzIHRvICovCisJc3RydWN0IGVwb2xsX2ZpbGVmZCBmZmQ7CisKKwkvKiBOdW1iZXIgb2YgYWN0aXZlIHdhaXQgcXVldWUgYXR0YWNoZWQgdG8gcG9sbCBvcGVyYXRpb25zICovCisJaW50IG53YWl0OworCisJLyogTGlzdCBjb250YWluaW5nIHBvbGwgd2FpdCBxdWV1ZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHB3cWxpc3Q7CisKKwkvKiBUaGUgImNvbnRhaW5lciIgb2YgdGhpcyBpdGVtICovCisJc3RydWN0IGV2ZW50cG9sbCAqZXA7CisKKwkvKiBUaGUgc3RydWN0dXJlIHRoYXQgZGVzY3JpYmUgdGhlIGludGVyZXN0ZWQgZXZlbnRzIGFuZCB0aGUgc291cmNlIGZkICovCisJc3RydWN0IGVwb2xsX2V2ZW50IGV2ZW50OworCisJLyoKKwkgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHVzYWdlIGNvdW50IG9mIHRoZSBzdHJ1Y3R1cmUuIFRoaXMgYXZvaWRzCisJICogdGhhdCB0aGUgc3RydWN0dXJlIHdpbGwgZGVzYXBwZWFyIGZyb20gdW5kZXJuZWF0aCBvdXIgcHJvY2Vzc2luZy4KKwkgKi8KKwlhdG9taWNfdCB1c2VjbnQ7CisKKwkvKiBMaXN0IGhlYWRlciB1c2VkIHRvIGxpbmsgdGhpcyBpdGVtIHRvIHRoZSAic3RydWN0IGZpbGUiIGl0ZW1zIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGZsbGluazsKKworCS8qIExpc3QgaGVhZGVyIHVzZWQgdG8gbGluayB0aGUgaXRlbSB0byB0aGUgdHJhbnNmZXIgbGlzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQgdHhsaW5rOworCisJLyoKKwkgKiBUaGlzIGlzIHVzZWQgZHVyaW5nIHRoZSBjb2xsZWN0aW9uL3RyYW5zZmVyIG9mIGV2ZW50cyB0byB1c2Vyc3BhY2UKKwkgKiB0byBwaW4gaXRlbXMgZW1wdHkgZXZlbnRzIHNldC4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgcmV2ZW50czsKK307CisKKy8qIFdyYXBwZXIgc3RydWN0IHVzZWQgYnkgcG9sbCBxdWV1ZWluZyAqLworc3RydWN0IGVwX3BxdWV1ZSB7CisJcG9sbF90YWJsZSBwdDsKKwlzdHJ1Y3QgZXBpdGVtICplcGk7Cit9OworCisKKworc3RhdGljIHZvaWQgZXBfcG9sbF9zYWZld2FrZV9pbml0KHN0cnVjdCBwb2xsX3NhZmV3YWtlICpwc3cpOworc3RhdGljIHZvaWQgZXBfcG9sbF9zYWZld2FrZShzdHJ1Y3QgcG9sbF9zYWZld2FrZSAqcHN3LCB3YWl0X3F1ZXVlX2hlYWRfdCAqd3EpOworc3RhdGljIGludCBlcF9nZXRmZChpbnQgKmVmZCwgc3RydWN0IGlub2RlICoqZWlub2RlLCBzdHJ1Y3QgZmlsZSAqKmVmaWxlKTsKK3N0YXRpYyBpbnQgZXBfZmlsZV9pbml0KHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyB2b2lkIGVwX2ZyZWUoc3RydWN0IGV2ZW50cG9sbCAqZXApOworc3RhdGljIHN0cnVjdCBlcGl0ZW0gKmVwX2ZpbmQoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZmQpOworc3RhdGljIHZvaWQgZXBfdXNlX2VwaXRlbShzdHJ1Y3QgZXBpdGVtICplcGkpOworc3RhdGljIHZvaWQgZXBfcmVsZWFzZV9lcGl0ZW0oc3RydWN0IGVwaXRlbSAqZXBpKTsKK3N0YXRpYyB2b2lkIGVwX3B0YWJsZV9xdWV1ZV9wcm9jKHN0cnVjdCBmaWxlICpmaWxlLCB3YWl0X3F1ZXVlX2hlYWRfdCAqd2hlYWQsCisJCQkJIHBvbGxfdGFibGUgKnB0KTsKK3N0YXRpYyB2b2lkIGVwX3JidHJlZV9pbnNlcnQoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBlcGl0ZW0gKmVwaSk7CitzdGF0aWMgaW50IGVwX2luc2VydChzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGVwb2xsX2V2ZW50ICpldmVudCwKKwkJICAgICBzdHJ1Y3QgZmlsZSAqdGZpbGUsIGludCBmZCk7CitzdGF0aWMgaW50IGVwX21vZGlmeShzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGVwaXRlbSAqZXBpLAorCQkgICAgIHN0cnVjdCBlcG9sbF9ldmVudCAqZXZlbnQpOworc3RhdGljIHZvaWQgZXBfdW5yZWdpc3Rlcl9wb2xsd2FpdChzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGVwaXRlbSAqZXBpKTsKK3N0YXRpYyBpbnQgZXBfdW5saW5rKHN0cnVjdCBldmVudHBvbGwgKmVwLCBzdHJ1Y3QgZXBpdGVtICplcGkpOworc3RhdGljIGludCBlcF9yZW1vdmUoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBlcGl0ZW0gKmVwaSk7CitzdGF0aWMgaW50IGVwX3BvbGxfY2FsbGJhY2sod2FpdF9xdWV1ZV90ICp3YWl0LCB1bnNpZ25lZCBtb2RlLCBpbnQgc3luYywgdm9pZCAqa2V5KTsKK3N0YXRpYyBpbnQgZXBfZXZlbnRwb2xsX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXBfZXZlbnRwb2xsX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpOworc3RhdGljIGludCBlcF9jb2xsZWN0X3JlYWR5X2l0ZW1zKHN0cnVjdCBldmVudHBvbGwgKmVwLAorCQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqdHhsaXN0LCBpbnQgbWF4ZXZlbnRzKTsKK3N0YXRpYyBpbnQgZXBfc2VuZF9ldmVudHMoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBsaXN0X2hlYWQgKnR4bGlzdCwKKwkJCSAgc3RydWN0IGVwb2xsX2V2ZW50IF9fdXNlciAqZXZlbnRzKTsKK3N0YXRpYyB2b2lkIGVwX3JlaW5qZWN0X2l0ZW1zKHN0cnVjdCBldmVudHBvbGwgKmVwLCBzdHJ1Y3QgbGlzdF9oZWFkICp0eGxpc3QpOworc3RhdGljIGludCBlcF9ldmVudHNfdHJhbnNmZXIoc3RydWN0IGV2ZW50cG9sbCAqZXAsCisJCQkgICAgICBzdHJ1Y3QgZXBvbGxfZXZlbnQgX191c2VyICpldmVudHMsCisJCQkgICAgICBpbnQgbWF4ZXZlbnRzKTsKK3N0YXRpYyBpbnQgZXBfcG9sbChzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGVwb2xsX2V2ZW50IF9fdXNlciAqZXZlbnRzLAorCQkgICBpbnQgbWF4ZXZlbnRzLCBsb25nIHRpbWVvdXQpOworc3RhdGljIGludCBldmVudHBvbGxmc19kZWxldGVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CitzdGF0aWMgc3RydWN0IGlub2RlICplcF9ldmVudHBvbGxfaW5vZGUodm9pZCk7CitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpldmVudHBvbGxmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkJCSAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJCSAgICAgIHZvaWQgKmRhdGEpOworCisvKgorICogVGhpcyBzZW1hcGhvcmUgaXMgdXNlZCB0byBzZXJpYWxpemUgZXBfZnJlZSgpIGFuZCBldmVudHBvbGxfcmVsZWFzZV9maWxlKCkuCisgKi8KK3N0cnVjdCBzZW1hcGhvcmUgZXBzZW07CisKKy8qIFNhZmUgd2FrZSB1cCBpbXBsZW1lbnRhdGlvbiAqLworc3RhdGljIHN0cnVjdCBwb2xsX3NhZmV3YWtlIHBzdzsKKworLyogU2xhYiBjYWNoZSB1c2VkIHRvIGFsbG9jYXRlICJzdHJ1Y3QgZXBpdGVtIiAqLworc3RhdGljIGttZW1fY2FjaGVfdCAqZXBpX2NhY2hlOworCisvKiBTbGFiIGNhY2hlIHVzZWQgdG8gYWxsb2NhdGUgInN0cnVjdCBlcHBvbGxfZW50cnkiICovCitzdGF0aWMga21lbV9jYWNoZV90ICpwd3FfY2FjaGU7CisKKy8qIFZpcnR1YWwgZnMgdXNlZCB0byBhbGxvY2F0ZSBpbm9kZXMgZm9yIGV2ZW50cG9sbCBmaWxlcyAqLworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqZXZlbnRwb2xsX21udDsKKworLyogRmlsZSBjYWxsYmFja3MgdGhhdCBpbXBsZW1lbnQgdGhlIGV2ZW50cG9sbCBmaWxlIGJlaGF2aW91ciAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXZlbnRwb2xsX2ZvcHMgPSB7CisJLnJlbGVhc2UJPSBlcF9ldmVudHBvbGxfY2xvc2UsCisJLnBvbGwJCT0gZXBfZXZlbnRwb2xsX3BvbGwKK307CisKKy8qCisgKiBUaGlzIGlzIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIHZpcnR1YWwgZmlsZSBzeXN0ZW0gZnJvbSB3aGVyZQorICogZXZlbnRwb2xsIGlub2RlcyBhcmUgYWxsb2NhdGVkLgorICovCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZXZlbnRwb2xsX2ZzX3R5cGUgPSB7CisJLm5hbWUJCT0gImV2ZW50cG9sbGZzIiwKKwkuZ2V0X3NiCQk9IGV2ZW50cG9sbGZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYW5vbl9zdXBlciwKK307CisKKy8qIFZlcnkgYmFzaWMgZGlyZWN0b3J5IGVudHJ5IG9wZXJhdGlvbnMgZm9yIHRoZSBldmVudHBvbGwgdmlydHVhbCBmaWxlIHN5c3RlbSAqLworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBldmVudHBvbGxmc19kZW50cnlfb3BlcmF0aW9ucyA9IHsKKwkuZF9kZWxldGUJPSBldmVudHBvbGxmc19kZWxldGVfZGVudHJ5LAorfTsKKworCisKKy8qIEluaXRpYWxpemUgdGhlIHBvbGwgc2FmZSB3YWtlIHVwIHN0cnVjdHVyZSAqLworc3RhdGljIHZvaWQgZXBfcG9sbF9zYWZld2FrZV9pbml0KHN0cnVjdCBwb2xsX3NhZmV3YWtlICpwc3cpCit7CisKKwlJTklUX0xJU1RfSEVBRCgmcHN3LT53YWtlX3Rhc2tfbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJnBzdy0+bG9jayk7Cit9CisKKworLyoKKyAqIFBlcmZvcm0gYSBzYWZlIHdha2UgdXAgb2YgdGhlIHBvbGwgd2FpdCBsaXN0LiBUaGUgcHJvYmxlbSBpcyB0aGF0CisgKiB3aXRoIHRoZSBuZXcgY2FsbGJhY2snZCB3YWtlIHVwIHN5c3RlbSwgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUKKyAqIHBvbGwgY2FsbGJhY2sgaXMgcmVlbnRlcmVkIGZyb20gaW5zaWRlIHRoZSBjYWxsIHRvIHdha2VfdXAoKSBkb25lCisgKiBvbiB0aGUgcG9sbCB3YWl0IHF1ZXVlIGhlYWQuIFRoZSBydWxlIGlzIHRoYXQgd2UgY2Fubm90IHJlZW50ZXIgdGhlCisgKiB3YWtlIHVwIGNvZGUgZnJvbSB0aGUgc2FtZSB0YXNrIG1vcmUgdGhhbiBFUF9NQVhfUE9MTFdBS0VfTkVTVFMgdGltZXMsCisgKiBhbmQgd2UgY2Fubm90IHJlZW50ZXIgdGhlIHNhbWUgd2FpdCBxdWV1ZSBoZWFkIGF0IGFsbC4gVGhpcyB3aWxsCisgKiBlbmFibGUgdG8gaGF2ZSBhIGhpZXJhcmNoeSBvZiBlcG9sbCBmaWxlIGRlc2NyaXB0b3Igb2Ygbm8gbW9yZSB0aGFuCisgKiBFUF9NQVhfUE9MTFdBS0VfTkVTVFMgZGVlcC4gV2UgbmVlZCB0aGUgaXJxIHZlcnNpb24gb2YgdGhlIHNwaW4gbG9jaworICogYmVjYXVzZSB0aGlzIG9uZSBnZXRzIGNhbGxlZCBieSB0aGUgcG9sbCBjYWxsYmFjaywgdGhhdCBpbiB0dXJuIGlzIGNhbGxlZAorICogZnJvbSBpbnNpZGUgYSB3YWtlX3VwKCksIHRoYXQgbWlnaHQgYmUgY2FsbGVkIGZyb20gaXJxIGNvbnRleHQuCisgKi8KK3N0YXRpYyB2b2lkIGVwX3BvbGxfc2FmZXdha2Uoc3RydWN0IHBvbGxfc2FmZXdha2UgKnBzdywgd2FpdF9xdWV1ZV9oZWFkX3QgKndxKQoreworCWludCB3YWtlX25lc3RzID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXRhc2tfdCAqdGhpc190YXNrID0gY3VycmVudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsc3RoZWFkID0gJnBzdy0+d2FrZV90YXNrX2xpc3QsICpsbms7CisJc3RydWN0IHdha2VfdGFza19ub2RlICp0bmN1cjsKKwlzdHJ1Y3Qgd2FrZV90YXNrX25vZGUgdG5vZGU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHN3LT5sb2NrLCBmbGFncyk7CisKKwkvKiBUcnkgdG8gc2VlIGlmIHRoZSBjdXJyZW50IHRhc2sgaXMgYWxyZWFkeSBpbnNpZGUgdGhpcyB3YWtldXAgY2FsbCAqLworCWxpc3RfZm9yX2VhY2gobG5rLCBsc3RoZWFkKSB7CisJCXRuY3VyID0gbGlzdF9lbnRyeShsbmssIHN0cnVjdCB3YWtlX3Rhc2tfbm9kZSwgbGxpbmspOworCisJCWlmICh0bmN1ci0+d3EgPT0gd3EgfHwKKwkJICAgICh0bmN1ci0+dGFzayA9PSB0aGlzX3Rhc2sgJiYgKyt3YWtlX25lc3RzID4gRVBfTUFYX1BPTExXQUtFX05FU1RTKSkgeworCQkJLyoKKwkJCSAqIE9wcyAuLi4gbG9vcCBkZXRlY3RlZCBvciBtYXhpbXVtIG5lc3QgbGV2ZWwgcmVhY2hlZC4KKwkJCSAqIFdlIGFib3J0IHRoaXMgd2FrZSBieSBicmVha2luZyB0aGUgY3ljbGUgaXRzZWxmLgorCQkJICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwc3ctPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIEFkZCB0aGUgY3VycmVudCB0YXNrIHRvIHRoZSBsaXN0ICovCisJdG5vZGUudGFzayA9IHRoaXNfdGFzazsKKwl0bm9kZS53cSA9IHdxOworCWxpc3RfYWRkKCZ0bm9kZS5sbGluaywgbHN0aGVhZCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwc3ctPmxvY2ssIGZsYWdzKTsKKworCS8qIERvIHJlYWxseSB3YWtlIHVwIG5vdyAqLworCXdha2VfdXAod3EpOworCisJLyogUmVtb3ZlIHRoZSBjdXJyZW50IHRhc2sgZnJvbSB0aGUgbGlzdCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwc3ctPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmdG5vZGUubGxpbmspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzdy0+bG9jaywgZmxhZ3MpOworfQorCisKKy8qIFVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZXBvbGwgYml0cyBpbnNpZGUgdGhlICJzdHJ1Y3QgZmlsZSIgKi8KK3ZvaWQgZXZlbnRwb2xsX2luaXRfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKworCUlOSVRfTElTVF9IRUFEKCZmaWxlLT5mX2VwX2xpbmtzKTsKKwlzcGluX2xvY2tfaW5pdCgmZmlsZS0+Zl9lcF9sb2NrKTsKK30KKworCisvKgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSBldmVudHBvbGxfcmVsZWFzZSgpIHRvIHVubGluayBmaWxlcyBmcm9tIHRoZSBldmVudHBvbGwKKyAqIGludGVyZmFjZS4gV2UgbmVlZCB0byBoYXZlIHRoaXMgZmFjaWxpdHkgdG8gY2xlYW51cCBjb3JyZWN0bHkgZmlsZXMgdGhhdCBhcmUKKyAqIGNsb3NlZCB3aXRob3V0IGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgZXZlbnRwb2xsIGludGVyZmFjZS4KKyAqLwordm9pZCBldmVudHBvbGxfcmVsZWFzZV9maWxlKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxzdGhlYWQgPSAmZmlsZS0+Zl9lcF9saW5rczsKKwlzdHJ1Y3QgZXZlbnRwb2xsICplcDsKKwlzdHJ1Y3QgZXBpdGVtICplcGk7CisKKwkvKgorCSAqIFdlIGRvbid0IHdhbnQgdG8gZ2V0ICJmaWxlLT5mX2VwX2xvY2siIGJlY2F1c2UgaXQgaXMgbm90CisJICogbmVjZXNzYXJ5LiBJdCBpcyBub3QgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UncmUgaW4gdGhlICJzdHJ1Y3QgZmlsZSIKKwkgKiBjbGVhbnVwIHBhdGgsIGFuZCB0aGlzIG1lYW5zIHRoYXQgbm9vbmUgaXMgdXNpbmcgdGhpcyBmaWxlIGFueW1vcmUuCisJICogVGhlIG9ubHkgaGl0IG1pZ2h0IGNvbWUgZnJvbSBlcF9mcmVlKCkgYnV0IGJ5IGhvbGRpbmcgdGhlIHNlbWFwaG9yZQorCSAqIHdpbGwgY29ycmVjdGx5IHNlcmlhbGl6ZSB0aGUgb3BlcmF0aW9uLiBXZSBkbyBuZWVkIHRvIGFjcXVpcmUKKwkgKiAiZXAtPnNlbSIgYWZ0ZXIgImVwc2VtIiBiZWNhdXNlIGVwX3JlbW92ZSgpIHJlcXVpcmVzIGl0IHdoZW4gY2FsbGVkCisJICogZnJvbSBhbnl3aGVyZSBidXQgZXBfZnJlZSgpLgorCSAqLworCWRvd24oJmVwc2VtKTsKKworCXdoaWxlICghbGlzdF9lbXB0eShsc3RoZWFkKSkgeworCQllcGkgPSBsaXN0X2VudHJ5KGxzdGhlYWQtPm5leHQsIHN0cnVjdCBlcGl0ZW0sIGZsbGluayk7CisKKwkJZXAgPSBlcGktPmVwOworCQlFUF9MSVNUX0RFTCgmZXBpLT5mbGxpbmspOworCQlkb3duX3dyaXRlKCZlcC0+c2VtKTsKKwkJZXBfcmVtb3ZlKGVwLCBlcGkpOworCQl1cF93cml0ZSgmZXAtPnNlbSk7CisJfQorCisJdXAoJmVwc2VtKTsKK30KKworCisvKgorICogSXQgb3BlbnMgYW4gZXZlbnRwb2xsIGZpbGUgZGVzY3JpcHRvciBieSBzdWdnZXN0aW5nIGEgc3RvcmFnZSBvZiAic2l6ZSIKKyAqIGZpbGUgZGVzY3JpcHRvcnMuIFRoZSBzaXplIHBhcmFtZXRlciBpcyBqdXN0IGFuIGhpbnQgYWJvdXQgaG93IHRvIHNpemUKKyAqIGRhdGEgc3RydWN0dXJlcy4gSXQgd29uJ3QgcHJldmVudCB0aGUgdXNlciB0byBzdG9yZSBtb3JlIHRoYW4gInNpemUiCisgKiBmaWxlIGRlc2NyaXB0b3JzIGluc2lkZSB0aGUgZXBvbGwgaW50ZXJmYWNlLiBJdCBpcyB0aGUga2VybmVsIHBhcnQgb2YKKyAqIHRoZSB1c2Vyc3BhY2UgZXBvbGxfY3JlYXRlKDIpLgorICovCithc21saW5rYWdlIGxvbmcgc3lzX2Vwb2xsX2NyZWF0ZShpbnQgc2l6ZSkKK3sKKwlpbnQgZXJyb3IsIGZkOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGZpbGUgKmZpbGU7CisKKwlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogc3lzX2Vwb2xsX2NyZWF0ZSglZClcbiIsCisJCSAgICAgY3VycmVudCwgc2l6ZSkpOworCisJLyogU2FuaXR5IGNoZWNrIG9uIHRoZSBzaXplIHBhcmFtZXRlciAqLworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoc2l6ZSA8PSAwKQorCQlnb3RvIGVleGl0XzE7CisKKwkvKgorCSAqIENyZWF0ZXMgYWxsIHRoZSBpdGVtcyBuZWVkZWQgdG8gc2V0dXAgYW4gZXZlbnRwb2xsIGZpbGUuIFRoYXQgaXMsCisJICogYSBmaWxlIHN0cnVjdHVyZSwgYW5kIGlub2RlIGFuZCBhIGZyZWUgZmlsZSBkZXNjcmlwdG9yLgorCSAqLworCWVycm9yID0gZXBfZ2V0ZmQoJmZkLCAmaW5vZGUsICZmaWxlKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZWV4aXRfMTsKKworCS8qIFNldHVwIHRoZSBmaWxlIGludGVybmFsIGRhdGEgc3RydWN0dXJlICggInN0cnVjdCBldmVudHBvbGwiICkgKi8KKwllcnJvciA9IGVwX2ZpbGVfaW5pdChmaWxlKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZWV4aXRfMjsKKworCisJRE5QUklOVEsoMywgKEtFUk5fSU5GTyAiWyVwXSBldmVudHBvbGw6IHN5c19lcG9sbF9jcmVhdGUoJWQpID0gJWRcbiIsCisJCSAgICAgY3VycmVudCwgc2l6ZSwgZmQpKTsKKworCXJldHVybiBmZDsKKworZWV4aXRfMjoKKwlzeXNfY2xvc2UoZmQpOworZWV4aXRfMToKKwlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogc3lzX2Vwb2xsX2NyZWF0ZSglZCkgPSAlZFxuIiwKKwkJICAgICBjdXJyZW50LCBzaXplLCBlcnJvcikpOworCXJldHVybiBlcnJvcjsKK30KKworCisvKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBjb250cm9sbGVyIGludGVyZmFjZSBmb3IKKyAqIHRoZSBldmVudHBvbGwgZmlsZSB0aGF0IGVuYWJsZXMgdGhlIGluc2VydGlvbi9yZW1vdmFsL2NoYW5nZSBvZgorICogZmlsZSBkZXNjcmlwdG9ycyBpbnNpZGUgdGhlIGludGVyZXN0IHNldC4gIEl0IHJlcHJlc2VudHMKKyAqIHRoZSBrZXJuZWwgcGFydCBvZiB0aGUgdXNlciBzcGFjZSBlcG9sbF9jdGwoMikuCisgKi8KK2FzbWxpbmthZ2UgbG9uZworc3lzX2Vwb2xsX2N0bChpbnQgZXBmZCwgaW50IG9wLCBpbnQgZmQsIHN0cnVjdCBlcG9sbF9ldmVudCBfX3VzZXIgKmV2ZW50KQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgZmlsZSAqZmlsZSwgKnRmaWxlOworCXN0cnVjdCBldmVudHBvbGwgKmVwOworCXN0cnVjdCBlcGl0ZW0gKmVwaTsKKwlzdHJ1Y3QgZXBvbGxfZXZlbnQgZXBkczsKKworCUROUFJJTlRLKDMsIChLRVJOX0lORk8gIlslcF0gZXZlbnRwb2xsOiBzeXNfZXBvbGxfY3RsKCVkLCAlZCwgJWQsICVwKVxuIiwKKwkJICAgICBjdXJyZW50LCBlcGZkLCBvcCwgZmQsIGV2ZW50KSk7CisKKwllcnJvciA9IC1FRkFVTFQ7CisJaWYgKEVQX09QX0hBU0hfRVZFTlQob3ApICYmCisJICAgIGNvcHlfZnJvbV91c2VyKCZlcGRzLCBldmVudCwgc2l6ZW9mKHN0cnVjdCBlcG9sbF9ldmVudCkpKQorCQlnb3RvIGVleGl0XzE7CisKKwkvKiBHZXQgdGhlICJzdHJ1Y3QgZmlsZSAqIiBmb3IgdGhlIGV2ZW50cG9sbCBmaWxlICovCisJZXJyb3IgPSAtRUJBREY7CisJZmlsZSA9IGZnZXQoZXBmZCk7CisJaWYgKCFmaWxlKQorCQlnb3RvIGVleGl0XzE7CisKKwkvKiBHZXQgdGhlICJzdHJ1Y3QgZmlsZSAqIiBmb3IgdGhlIHRhcmdldCBmaWxlICovCisJdGZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAoIXRmaWxlKQorCQlnb3RvIGVleGl0XzI7CisKKwkvKiBUaGUgdGFyZ2V0IGZpbGUgZGVzY3JpcHRvciBtdXN0IHN1cHBvcnQgcG9sbCAqLworCWVycm9yID0gLUVQRVJNOworCWlmICghdGZpbGUtPmZfb3AgfHwgIXRmaWxlLT5mX29wLT5wb2xsKQorCQlnb3RvIGVleGl0XzM7CisKKwkvKgorCSAqIFdlIGhhdmUgdG8gY2hlY2sgdGhhdCB0aGUgZmlsZSBzdHJ1Y3R1cmUgdW5kZXJuZWF0aCB0aGUgZmlsZSBkZXNjcmlwdG9yCisJICogdGhlIHVzZXIgcGFzc2VkIHRvIHVzIF9pc18gYW4gZXZlbnRwb2xsIGZpbGUuIEFuZCBhbHNvIHdlIGRvIG5vdCBwZXJtaXQKKwkgKiBhZGRpbmcgYW4gZXBvbGwgZmlsZSBkZXNjcmlwdG9yIGluc2lkZSBpdHNlbGYuCisJICovCisJZXJyb3IgPSAtRUlOVkFMOworCWlmIChmaWxlID09IHRmaWxlIHx8ICFJU19GSUxFX0VQT0xMKGZpbGUpKQorCQlnb3RvIGVleGl0XzM7CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgaXQgaXMgc2FmZSB0byBhc3N1bWUgdGhhdCB0aGUgInByaXZhdGVfZGF0YSIgY29udGFpbnMKKwkgKiBvdXIgb3duIGRhdGEgc3RydWN0dXJlLgorCSAqLworCWVwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJZG93bl93cml0ZSgmZXAtPnNlbSk7CisKKwkvKiBUcnkgdG8gbG9va3VwIHRoZSBmaWxlIGluc2lkZSBvdXIgaGFzaCB0YWJsZSAqLworCWVwaSA9IGVwX2ZpbmQoZXAsIHRmaWxlLCBmZCk7CisKKwllcnJvciA9IC1FSU5WQUw7CisJc3dpdGNoIChvcCkgeworCWNhc2UgRVBPTExfQ1RMX0FERDoKKwkJaWYgKCFlcGkpIHsKKwkJCWVwZHMuZXZlbnRzIHw9IFBPTExFUlIgfCBQT0xMSFVQOworCisJCQllcnJvciA9IGVwX2luc2VydChlcCwgJmVwZHMsIHRmaWxlLCBmZCk7CisJCX0gZWxzZQorCQkJZXJyb3IgPSAtRUVYSVNUOworCQlicmVhazsKKwljYXNlIEVQT0xMX0NUTF9ERUw6CisJCWlmIChlcGkpCisJCQllcnJvciA9IGVwX3JlbW92ZShlcCwgZXBpKTsKKwkJZWxzZQorCQkJZXJyb3IgPSAtRU5PRU5UOworCQlicmVhazsKKwljYXNlIEVQT0xMX0NUTF9NT0Q6CisJCWlmIChlcGkpIHsKKwkJCWVwZHMuZXZlbnRzIHw9IFBPTExFUlIgfCBQT0xMSFVQOworCQkJZXJyb3IgPSBlcF9tb2RpZnkoZXAsIGVwaSwgJmVwZHMpOworCQl9IGVsc2UKKwkJCWVycm9yID0gLUVOT0VOVDsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBUaGUgZnVuY3Rpb24gZXBfZmluZCgpIGluY3JlbWVudHMgdGhlIHVzYWdlIGNvdW50IG9mIHRoZSBzdHJ1Y3R1cmUKKwkgKiBzbywgaWYgdGhpcyBpcyBub3QgTlVMTCwgd2UgbmVlZCB0byByZWxlYXNlIGl0LgorCSAqLworCWlmIChlcGkpCisJCWVwX3JlbGVhc2VfZXBpdGVtKGVwaSk7CisKKwl1cF93cml0ZSgmZXAtPnNlbSk7CisKK2VleGl0XzM6CisJZnB1dCh0ZmlsZSk7CitlZXhpdF8yOgorCWZwdXQoZmlsZSk7CitlZXhpdF8xOgorCUROUFJJTlRLKDMsIChLRVJOX0lORk8gIlslcF0gZXZlbnRwb2xsOiBzeXNfZXBvbGxfY3RsKCVkLCAlZCwgJWQsICVwKSA9ICVkXG4iLAorCQkgICAgIGN1cnJlbnQsIGVwZmQsIG9wLCBmZCwgZXZlbnQsIGVycm9yKSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKyNkZWZpbmUgTUFYX0VWRU5UUyAoSU5UX01BWCAvIHNpemVvZihzdHJ1Y3QgZXBvbGxfZXZlbnQpKQorCisvKgorICogSW1wbGVtZW50IHRoZSBldmVudCB3YWl0IGludGVyZmFjZSBmb3IgdGhlIGV2ZW50cG9sbCBmaWxlLiBJdCBpcyB0aGUga2VybmVsCisgKiBwYXJ0IG9mIHRoZSB1c2VyIHNwYWNlIGVwb2xsX3dhaXQoMikuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfZXBvbGxfd2FpdChpbnQgZXBmZCwgc3RydWN0IGVwb2xsX2V2ZW50IF9fdXNlciAqZXZlbnRzLAorCQkJICAgICAgIGludCBtYXhldmVudHMsIGludCB0aW1lb3V0KQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzdHJ1Y3QgZXZlbnRwb2xsICplcDsKKworCUROUFJJTlRLKDMsIChLRVJOX0lORk8gIlslcF0gZXZlbnRwb2xsOiBzeXNfZXBvbGxfd2FpdCglZCwgJXAsICVkLCAlZClcbiIsCisJCSAgICAgY3VycmVudCwgZXBmZCwgZXZlbnRzLCBtYXhldmVudHMsIHRpbWVvdXQpKTsKKworCS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBldmVudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvICovCisJaWYgKG1heGV2ZW50cyA8PSAwIHx8IG1heGV2ZW50cyA+IE1BWF9FVkVOVFMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVmVyaWZ5IHRoYXQgdGhlIGFyZWEgcGFzc2VkIGJ5IHRoZSB1c2VyIGlzIHdyaXRlYWJsZSAqLworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZXZlbnRzLCBtYXhldmVudHMgKiBzaXplb2Yoc3RydWN0IGVwb2xsX2V2ZW50KSkpIHsKKwkJZXJyb3IgPSAtRUZBVUxUOworCQlnb3RvIGVleGl0XzE7CisJfQorCisJLyogR2V0IHRoZSAic3RydWN0IGZpbGUgKiIgZm9yIHRoZSBldmVudHBvbGwgZmlsZSAqLworCWVycm9yID0gLUVCQURGOworCWZpbGUgPSBmZ2V0KGVwZmQpOworCWlmICghZmlsZSkKKwkJZ290byBlZXhpdF8xOworCisJLyoKKwkgKiBXZSBoYXZlIHRvIGNoZWNrIHRoYXQgdGhlIGZpbGUgc3RydWN0dXJlIHVuZGVybmVhdGggdGhlIGZkCisJICogdGhlIHVzZXIgcGFzc2VkIHRvIHVzIF9pc18gYW4gZXZlbnRwb2xsIGZpbGUuCisJICovCisJZXJyb3IgPSAtRUlOVkFMOworCWlmICghSVNfRklMRV9FUE9MTChmaWxlKSkKKwkJZ290byBlZXhpdF8yOworCisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IGl0IGlzIHNhZmUgdG8gYXNzdW1lIHRoYXQgdGhlICJwcml2YXRlX2RhdGEiIGNvbnRhaW5zCisJICogb3VyIG93biBkYXRhIHN0cnVjdHVyZS4KKwkgKi8KKwllcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCS8qIFRpbWUgdG8gZmlzaCBmb3IgZXZlbnRzIC4uLiAqLworCWVycm9yID0gZXBfcG9sbChlcCwgZXZlbnRzLCBtYXhldmVudHMsIHRpbWVvdXQpOworCitlZXhpdF8yOgorCWZwdXQoZmlsZSk7CitlZXhpdF8xOgorCUROUFJJTlRLKDMsIChLRVJOX0lORk8gIlslcF0gZXZlbnRwb2xsOiBzeXNfZXBvbGxfd2FpdCglZCwgJXAsICVkLCAlZCkgPSAlZFxuIiwKKwkJICAgICBjdXJyZW50LCBlcGZkLCBldmVudHMsIG1heGV2ZW50cywgdGltZW91dCwgZXJyb3IpKTsKKworCXJldHVybiBlcnJvcjsKK30KKworCisvKgorICogQ3JlYXRlcyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIGJlIHVzZWQgYnkgdGhlIGVwb2xsIGludGVyZmFjZS4KKyAqLworc3RhdGljIGludCBlcF9nZXRmZChpbnQgKmVmZCwgc3RydWN0IGlub2RlICoqZWlub2RlLCBzdHJ1Y3QgZmlsZSAqKmVmaWxlKQoreworCXN0cnVjdCBxc3RyIHRoaXM7CisJY2hhciBuYW1lWzMyXTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlpbnQgZXJyb3IsIGZkOworCisJLyogR2V0IGFuIHJlYWR5IHRvIHVzZSBmaWxlICovCisJZXJyb3IgPSAtRU5GSUxFOworCWZpbGUgPSBnZXRfZW1wdHlfZmlscCgpOworCWlmICghZmlsZSkKKwkJZ290byBlZXhpdF8xOworCisJLyogQWxsb2NhdGVzIGFuIGlub2RlIGZyb20gdGhlIGV2ZW50cG9sbCBmaWxlIHN5c3RlbSAqLworCWlub2RlID0gZXBfZXZlbnRwb2xsX2lub2RlKCk7CisJZXJyb3IgPSBQVFJfRVJSKGlub2RlKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJZ290byBlZXhpdF8yOworCisJLyogQWxsb2NhdGVzIGEgZnJlZSBkZXNjcmlwdG9yIHRvIHBsdWcgdGhlIGZpbGUgb250byAqLworCWVycm9yID0gZ2V0X3VudXNlZF9mZCgpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gZWV4aXRfMzsKKwlmZCA9IGVycm9yOworCisJLyoKKwkgKiBMaW5rIHRoZSBpbm9kZSB0byBhIGRpcmVjdG9yeSBlbnRyeSBieSBjcmVhdGluZyBhIHVuaXF1ZSBuYW1lCisJICogdXNpbmcgdGhlIGlub2RlIG51bWJlci4KKwkgKi8KKwllcnJvciA9IC1FTk9NRU07CisJc3ByaW50ZihuYW1lLCAiWyVsdV0iLCBpbm9kZS0+aV9pbm8pOworCXRoaXMubmFtZSA9IG5hbWU7CisJdGhpcy5sZW4gPSBzdHJsZW4obmFtZSk7CisJdGhpcy5oYXNoID0gaW5vZGUtPmlfaW5vOworCWRlbnRyeSA9IGRfYWxsb2MoZXZlbnRwb2xsX21udC0+bW50X3NiLT5zX3Jvb3QsICZ0aGlzKTsKKwlpZiAoIWRlbnRyeSkKKwkJZ290byBlZXhpdF80OworCWRlbnRyeS0+ZF9vcCA9ICZldmVudHBvbGxmc19kZW50cnlfb3BlcmF0aW9uczsKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlmaWxlLT5mX3Zmc21udCA9IG1udGdldChldmVudHBvbGxfbW50KTsKKwlmaWxlLT5mX2RlbnRyeSA9IGRlbnRyeTsKKwlmaWxlLT5mX21hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCisJZmlsZS0+Zl9wb3MgPSAwOworCWZpbGUtPmZfZmxhZ3MgPSBPX1JET05MWTsKKwlmaWxlLT5mX29wID0gJmV2ZW50cG9sbF9mb3BzOworCWZpbGUtPmZfbW9kZSA9IEZNT0RFX1JFQUQ7CisJZmlsZS0+Zl92ZXJzaW9uID0gMDsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCisJLyogSW5zdGFsbCB0aGUgbmV3IHNldHVwIGZpbGUgaW50byB0aGUgYWxsb2NhdGVkIGZkLiAqLworCWZkX2luc3RhbGwoZmQsIGZpbGUpOworCisJKmVmZCA9IGZkOworCSplaW5vZGUgPSBpbm9kZTsKKwkqZWZpbGUgPSBmaWxlOworCXJldHVybiAwOworCitlZXhpdF80OgorCXB1dF91bnVzZWRfZmQoZmQpOworZWV4aXRfMzoKKwlpcHV0KGlub2RlKTsKK2VleGl0XzI6CisJcHV0X2ZpbHAoZmlsZSk7CitlZXhpdF8xOgorCXJldHVybiBlcnJvcjsKK30KKworCitzdGF0aWMgaW50IGVwX2ZpbGVfaW5pdChzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZXZlbnRwb2xsICplcDsKKworCWlmICghKGVwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGV2ZW50cG9sbCksIEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoZXAsIDAsIHNpemVvZigqZXApKTsKKwlyd2xvY2tfaW5pdCgmZXAtPmxvY2spOworCWluaXRfcndzZW0oJmVwLT5zZW0pOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVwLT53cSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZXAtPnBvbGxfd2FpdCk7CisJSU5JVF9MSVNUX0hFQUQoJmVwLT5yZGxsaXN0KTsKKwllcC0+cmJyID0gUkJfUk9PVDsKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGVwOworCisJRE5QUklOVEsoMywgKEtFUk5fSU5GTyAiWyVwXSBldmVudHBvbGw6IGVwX2ZpbGVfaW5pdCgpIGVwPSVwXG4iLAorCQkgICAgIGN1cnJlbnQsIGVwKSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgZXBfZnJlZShzdHJ1Y3QgZXZlbnRwb2xsICplcCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqcmJwOworCXN0cnVjdCBlcGl0ZW0gKmVwaTsKKworCS8qIFdlIG5lZWQgdG8gcmVsZWFzZSBhbGwgdGFza3Mgd2FpdGluZyBmb3IgdGhlc2UgZmlsZSAqLworCWlmICh3YWl0cXVldWVfYWN0aXZlKCZlcC0+cG9sbF93YWl0KSkKKwkJZXBfcG9sbF9zYWZld2FrZSgmcHN3LCAmZXAtPnBvbGxfd2FpdCk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gbG9jayB0aGlzIGJlY2F1c2Ugd2UgY291bGQgYmUgaGl0IGJ5CisJICogZXZlbnRwb2xsX3JlbGVhc2VfZmlsZSgpIHdoaWxlIHdlJ3JlIGZyZWVpbmcgdGhlICJzdHJ1Y3QgZXZlbnRwb2xsIi4KKwkgKiBXZSBkbyBub3QgbmVlZCB0byBob2xkICJlcC0+c2VtIiBoZXJlIGJlY2F1c2UgdGhlIGVwb2xsIGZpbGUKKwkgKiBpcyBvbiB0aGUgd2F5IHRvIGJlIHJlbW92ZWQgYW5kIG5vIG9uZSBoYXMgcmVmZXJlbmNlcyB0byBpdAorCSAqIGFueW1vcmUuIFRoZSBvbmx5IGhpdCBtaWdodCBjb21lIGZyb20gZXZlbnRwb2xsX3JlbGVhc2VfZmlsZSgpIGJ1dAorCSAqIGhvbGRpbmcgImVwc2VtIiBpcyBzdWZmaWNlbnQgaGVyZS4KKwkgKi8KKwlkb3duKCZlcHNlbSk7CisKKwkvKgorCSAqIFdhbGtzIHRocm91Z2ggdGhlIHdob2xlIHRyZWUgYnkgdW5yZWdpc3RlcmluZyBwb2xsIGNhbGxiYWNrcy4KKwkgKi8KKwlmb3IgKHJicCA9IHJiX2ZpcnN0KCZlcC0+cmJyKTsgcmJwOyByYnAgPSByYl9uZXh0KHJicCkpIHsKKwkJZXBpID0gcmJfZW50cnkocmJwLCBzdHJ1Y3QgZXBpdGVtLCByYm4pOworCisJCWVwX3VucmVnaXN0ZXJfcG9sbHdhaXQoZXAsIGVwaSk7CisJfQorCisJLyoKKwkgKiBXYWxrcyB0aHJvdWdoIHRoZSB3aG9sZSBoYXNoIGJ5IGZyZWVpbmcgZWFjaCAic3RydWN0IGVwaXRlbSIuIEF0IHRoaXMKKwkgKiBwb2ludCB3ZSBhcmUgc3VyZSBubyBwb2xsIGNhbGxiYWNrcyB3aWxsIGJlIGxpbmdlcmluZyBhcm91bmQsIGFuZCBhbHNvIGJ5CisJICogd3JpdGUtaG9sZGluZyAic2VtIiB3ZSBjYW4gYmUgc3VyZSB0aGF0IG5vIGZpbGUgY2xlYW51cCBjb2RlIHdpbGwgaGl0CisJICogdXMgZHVyaW5nIHRoaXMgb3BlcmF0aW9uLiBTbyB3ZSBjYW4gYXZvaWQgdGhlIGxvY2sgb24gImVwLT5sb2NrIi4KKwkgKi8KKwl3aGlsZSAoKHJicCA9IHJiX2ZpcnN0KCZlcC0+cmJyKSkgIT0gMCkgeworCQllcGkgPSByYl9lbnRyeShyYnAsIHN0cnVjdCBlcGl0ZW0sIHJibik7CisJCWVwX3JlbW92ZShlcCwgZXBpKTsKKwl9CisKKwl1cCgmZXBzZW0pOworfQorCisKKy8qCisgKiBTZWFyY2ggdGhlIGZpbGUgaW5zaWRlIHRoZSBldmVudHBvbGwgaGFzaC4gSXQgYWRkIHVzYWdlIGNvdW50IHRvCisgKiB0aGUgcmV0dXJuZWQgaXRlbSwgc28gdGhlIGNhbGxlciBtdXN0IGNhbGwgZXBfcmVsZWFzZV9lcGl0ZW0oKQorICogYWZ0ZXIgZmluaXNoZWQgdXNpbmcgdGhlICJzdHJ1Y3QgZXBpdGVtIi4KKyAqLworc3RhdGljIHN0cnVjdCBlcGl0ZW0gKmVwX2ZpbmQoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZmQpCit7CisJaW50IGtjbXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcmJfbm9kZSAqcmJwOworCXN0cnVjdCBlcGl0ZW0gKmVwaSwgKmVwaXIgPSBOVUxMOworCXN0cnVjdCBlcG9sbF9maWxlZmQgZmZkOworCisJRVBfU0VUX0ZGRCgmZmZkLCBmaWxlLCBmZCk7CisJcmVhZF9sb2NrX2lycXNhdmUoJmVwLT5sb2NrLCBmbGFncyk7CisJZm9yIChyYnAgPSBlcC0+cmJyLnJiX25vZGU7IHJicDsgKSB7CisJCWVwaSA9IHJiX2VudHJ5KHJicCwgc3RydWN0IGVwaXRlbSwgcmJuKTsKKwkJa2NtcCA9IEVQX0NNUF9GRkQoJmZmZCwgJmVwaS0+ZmZkKTsKKwkJaWYgKGtjbXAgPiAwKQorCQkJcmJwID0gcmJwLT5yYl9yaWdodDsKKwkJZWxzZSBpZiAoa2NtcCA8IDApCisJCQlyYnAgPSByYnAtPnJiX2xlZnQ7CisJCWVsc2UgeworCQkJZXBfdXNlX2VwaXRlbShlcGkpOworCQkJZXBpciA9IGVwaTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmVwLT5sb2NrLCBmbGFncyk7CisKKwlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogZXBfZmluZCglcCkgLT4gJXBcbiIsCisJCSAgICAgY3VycmVudCwgZmlsZSwgZXBpcikpOworCisJcmV0dXJuIGVwaXI7Cit9CisKKworLyoKKyAqIEluY3JlbWVudCB0aGUgdXNhZ2UgY291bnQgb2YgdGhlICJzdHJ1Y3QgZXBpdGVtIiBtYWtpbmcgaXQgc3VyZQorICogdGhhdCB0aGUgdXNlciB3aWxsIGhhdmUgYSB2YWxpZCBwb2ludGVyIHRvIHJlZmVyZW5jZS4KKyAqLworc3RhdGljIHZvaWQgZXBfdXNlX2VwaXRlbShzdHJ1Y3QgZXBpdGVtICplcGkpCit7CisKKwlhdG9taWNfaW5jKCZlcGktPnVzZWNudCk7Cit9CisKKworLyoKKyAqIERlY3JlbWVudCAoIHJlbGVhc2UgKSB0aGUgdXNhZ2UgY291bnQgYnkgc2lnbmFsaW5nIHRoYXQgdGhlIHVzZXIKKyAqIGhhcyBmaW5pc2hlZCB1c2luZyB0aGUgc3RydWN0dXJlLiBJdCBtaWdodCBsZWFkIHRvIGZyZWVpbmcgdGhlCisgKiBzdHJ1Y3R1cmUgaXRzZWxmIGlmIHRoZSBjb3VudCBnb2VzIHRvIHplcm8uCisgKi8KK3N0YXRpYyB2b2lkIGVwX3JlbGVhc2VfZXBpdGVtKHN0cnVjdCBlcGl0ZW0gKmVwaSkKK3sKKworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZlcGktPnVzZWNudCkpCisJCUVQSV9NRU1fRlJFRShlcGkpOworfQorCisKKy8qCisgKiBUaGlzIGlzIHRoZSBjYWxsYmFjayB0aGF0IGlzIHVzZWQgdG8gYWRkIG91ciB3YWl0IHF1ZXVlIHRvIHRoZQorICogdGFyZ2V0IGZpbGUgd2FrZXVwIGxpc3RzLgorICovCitzdGF0aWMgdm9pZCBlcF9wdGFibGVfcXVldWVfcHJvYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgd2FpdF9xdWV1ZV9oZWFkX3QgKndoZWFkLAorCQkJCSBwb2xsX3RhYmxlICpwdCkKK3sKKwlzdHJ1Y3QgZXBpdGVtICplcGkgPSBFUF9JVEVNX0ZST01fRVBRVUVVRShwdCk7CisJc3RydWN0IGVwcG9sbF9lbnRyeSAqcHdxOworCisJaWYgKGVwaS0+bndhaXQgPj0gMCAmJiAocHdxID0gUFdRX01FTV9BTExPQygpKSkgeworCQlpbml0X3dhaXRxdWV1ZV9mdW5jX2VudHJ5KCZwd3EtPndhaXQsIGVwX3BvbGxfY2FsbGJhY2spOworCQlwd3EtPndoZWFkID0gd2hlYWQ7CisJCXB3cS0+YmFzZSA9IGVwaTsKKwkJYWRkX3dhaXRfcXVldWUod2hlYWQsICZwd3EtPndhaXQpOworCQlsaXN0X2FkZF90YWlsKCZwd3EtPmxsaW5rLCAmZXBpLT5wd3FsaXN0KTsKKwkJZXBpLT5ud2FpdCsrOworCX0gZWxzZSB7CisJCS8qIFdlIGhhdmUgdG8gc2lnbmFsIHRoYXQgYW4gZXJyb3Igb2NjdXJyZWQgKi8KKwkJZXBpLT5ud2FpdCA9IC0xOworCX0KK30KKworCitzdGF0aWMgdm9pZCBlcF9yYnRyZWVfaW5zZXJ0KHN0cnVjdCBldmVudHBvbGwgKmVwLCBzdHJ1Y3QgZXBpdGVtICplcGkpCit7CisJaW50IGtjbXA7CisJc3RydWN0IHJiX25vZGUgKipwID0gJmVwLT5yYnIucmJfbm9kZSwgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IGVwaXRlbSAqZXBpYzsKKworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJZXBpYyA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGVwaXRlbSwgcmJuKTsKKwkJa2NtcCA9IEVQX0NNUF9GRkQoJmVwaS0+ZmZkLCAmZXBpYy0+ZmZkKTsKKwkJaWYgKGtjbXAgPiAwKQorCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCQllbHNlCisJCQlwID0gJnBhcmVudC0+cmJfbGVmdDsKKwl9CisJcmJfbGlua19ub2RlKCZlcGktPnJibiwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmVwaS0+cmJuLCAmZXAtPnJicik7Cit9CisKKworc3RhdGljIGludCBlcF9pbnNlcnQoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBlcG9sbF9ldmVudCAqZXZlbnQsCisJCSAgICAgc3RydWN0IGZpbGUgKnRmaWxlLCBpbnQgZmQpCit7CisJaW50IGVycm9yLCByZXZlbnRzLCBwd2FrZSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZXBpdGVtICplcGk7CisJc3RydWN0IGVwX3BxdWV1ZSBlcHE7CisKKwllcnJvciA9IC1FTk9NRU07CisJaWYgKCEoZXBpID0gRVBJX01FTV9BTExPQygpKSkKKwkJZ290byBlZXhpdF8xOworCisJLyogSXRlbSBpbml0aWFsaXphdGlvbiBmb2xsb3cgaGVyZSAuLi4gKi8KKwlFUF9SQl9JTklUTk9ERSgmZXBpLT5yYm4pOworCUlOSVRfTElTVF9IRUFEKCZlcGktPnJkbGxpbmspOworCUlOSVRfTElTVF9IRUFEKCZlcGktPmZsbGluayk7CisJSU5JVF9MSVNUX0hFQUQoJmVwaS0+dHhsaW5rKTsKKwlJTklUX0xJU1RfSEVBRCgmZXBpLT5wd3FsaXN0KTsKKwllcGktPmVwID0gZXA7CisJRVBfU0VUX0ZGRCgmZXBpLT5mZmQsIHRmaWxlLCBmZCk7CisJZXBpLT5ldmVudCA9ICpldmVudDsKKwlhdG9taWNfc2V0KCZlcGktPnVzZWNudCwgMSk7CisJZXBpLT5ud2FpdCA9IDA7CisKKwkvKiBJbml0aWFsaXplIHRoZSBwb2xsIHRhYmxlIHVzaW5nIHRoZSBxdWV1ZSBjYWxsYmFjayAqLworCWVwcS5lcGkgPSBlcGk7CisJaW5pdF9wb2xsX2Z1bmNwdHIoJmVwcS5wdCwgZXBfcHRhYmxlX3F1ZXVlX3Byb2MpOworCisJLyoKKwkgKiBBdHRhY2ggdGhlIGl0ZW0gdG8gdGhlIHBvbGwgaG9va3MgYW5kIGdldCBjdXJyZW50IGV2ZW50IGJpdHMuCisJICogV2UgY2FuIHNhZmVseSB1c2UgdGhlIGZpbGUqIGhlcmUgYmVjYXVzZSBpdHMgdXNhZ2UgY291bnQgaGFzCisJICogYmVlbiBpbmNyZWFzZWQgYnkgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uLgorCSAqLworCXJldmVudHMgPSB0ZmlsZS0+Zl9vcC0+cG9sbCh0ZmlsZSwgJmVwcS5wdCk7CisKKwkvKgorCSAqIFdlIGhhdmUgdG8gY2hlY2sgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIHRoZSBwb2xsIHdhaXQgcXVldWUKKwkgKiBpbnN0YWxsIHByb2Nlc3MuIE5hbWVseSBhbiBhbGxvY2F0aW9uIGZvciBhIHdhaXQgcXVldWUgZmFpbGVkIGR1ZQorCSAqIGhpZ2ggbWVtb3J5IHByZXNzdXJlLgorCSAqLworCWlmIChlcGktPm53YWl0IDwgMCkKKwkJZ290byBlZXhpdF8yOworCisJLyogQWRkIHRoZSBjdXJyZW50IGl0ZW0gdG8gdGhlIGxpc3Qgb2YgYWN0aXZlIGVwb2xsIGhvb2sgZm9yIHRoaXMgZmlsZSAqLworCXNwaW5fbG9jaygmdGZpbGUtPmZfZXBfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmZXBpLT5mbGxpbmssICZ0ZmlsZS0+Zl9lcF9saW5rcyk7CisJc3Bpbl91bmxvY2soJnRmaWxlLT5mX2VwX2xvY2spOworCisJLyogV2UgaGF2ZSB0byBkcm9wIHRoZSBuZXcgaXRlbSBpbnNpZGUgb3VyIGl0ZW0gbGlzdCB0byBrZWVwIHRyYWNrIG9mIGl0ICovCisJd3JpdGVfbG9ja19pcnFzYXZlKCZlcC0+bG9jaywgZmxhZ3MpOworCisJLyogQWRkIHRoZSBjdXJyZW50IGl0ZW0gdG8gdGhlIHJiLXRyZWUgKi8KKwllcF9yYnRyZWVfaW5zZXJ0KGVwLCBlcGkpOworCisJLyogSWYgdGhlIGZpbGUgaXMgYWxyZWFkeSAicmVhZHkiIHdlIGRyb3AgaXQgaW5zaWRlIHRoZSByZWFkeSBsaXN0ICovCisJaWYgKChyZXZlbnRzICYgZXZlbnQtPmV2ZW50cykgJiYgIUVQX0lTX0xJTktFRCgmZXBpLT5yZGxsaW5rKSkgeworCQlsaXN0X2FkZF90YWlsKCZlcGktPnJkbGxpbmssICZlcC0+cmRsbGlzdCk7CisKKwkJLyogTm90aWZ5IHdhaXRpbmcgdGFza3MgdGhhdCBldmVudHMgYXJlIGF2YWlsYWJsZSAqLworCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZXAtPndxKSkKKwkJCXdha2VfdXAoJmVwLT53cSk7CisJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZlcC0+cG9sbF93YWl0KSkKKwkJCXB3YWtlKys7CisJfQorCisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmVwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBXZSBoYXZlIHRvIGNhbGwgdGhpcyBvdXRzaWRlIHRoZSBsb2NrICovCisJaWYgKHB3YWtlKQorCQllcF9wb2xsX3NhZmV3YWtlKCZwc3csICZlcC0+cG9sbF93YWl0KTsKKworCUROUFJJTlRLKDMsIChLRVJOX0lORk8gIlslcF0gZXZlbnRwb2xsOiBlcF9pbnNlcnQoJXAsICVwLCAlZClcbiIsCisJCSAgICAgY3VycmVudCwgZXAsIHRmaWxlLCBmZCkpOworCisJcmV0dXJuIDA7CisKK2VleGl0XzI6CisJZXBfdW5yZWdpc3Rlcl9wb2xsd2FpdChlcCwgZXBpKTsKKworCS8qCisJICogV2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2UgYW4gZXZlbnQgY291bGQgaGF2ZSBiZWVuIGFycml2ZWQgb24gc29tZQorCSAqIGFsbG9jYXRlZCB3YWl0IHF1ZXVlLgorCSAqLworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmZXAtPmxvY2ssIGZsYWdzKTsKKwlpZiAoRVBfSVNfTElOS0VEKCZlcGktPnJkbGxpbmspKQorCQlFUF9MSVNUX0RFTCgmZXBpLT5yZGxsaW5rKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmZXAtPmxvY2ssIGZsYWdzKTsKKworCUVQSV9NRU1fRlJFRShlcGkpOworZWV4aXRfMToKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoKKyAqIE1vZGlmeSB0aGUgaW50ZXJlc3QgZXZlbnQgbWFzayBieSBkcm9wcGluZyBhbiBldmVudCBpZiB0aGUgbmV3IG1hc2sKKyAqIGhhcyBhIG1hdGNoIGluIHRoZSBjdXJyZW50IGZpbGUgc3RhdHVzLgorICovCitzdGF0aWMgaW50IGVwX21vZGlmeShzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGVwaXRlbSAqZXBpLCBzdHJ1Y3QgZXBvbGxfZXZlbnQgKmV2ZW50KQoreworCWludCBwd2FrZSA9IDA7CisJdW5zaWduZWQgaW50IHJldmVudHM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogU2V0IHRoZSBuZXcgZXZlbnQgaW50ZXJlc3QgbWFzayBiZWZvcmUgY2FsbGluZyBmX29wLT5wb2xsKCksIG90aGVyd2lzZQorCSAqIGEgcG90ZW50aWFsIHJhY2UgbWlnaHQgb2NjdXIuIEluIGZhY3QgaWYgd2UgZG8gdGhpcyBvcGVyYXRpb24gaW5zaWRlCisJICogdGhlIGxvY2ssIGFuIGV2ZW50IG1pZ2h0IGhhcHBlbiBiZXR3ZWVuIHRoZSBmX29wLT5wb2xsKCkgY2FsbCBhbmQgdGhlCisJICogbmV3IGV2ZW50IHNldCByZWdpc3RlcmluZy4KKwkgKi8KKwllcGktPmV2ZW50LmV2ZW50cyA9IGV2ZW50LT5ldmVudHM7CisKKwkvKgorCSAqIEdldCBjdXJyZW50IGV2ZW50IGJpdHMuIFdlIGNhbiBzYWZlbHkgdXNlIHRoZSBmaWxlKiBoZXJlIGJlY2F1c2UKKwkgKiBpdHMgdXNhZ2UgY291bnQgaGFzIGJlZW4gaW5jcmVhc2VkIGJ5IHRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbi4KKwkgKi8KKwlyZXZlbnRzID0gZXBpLT5mZmQuZmlsZS0+Zl9vcC0+cG9sbChlcGktPmZmZC5maWxlLCBOVUxMKTsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmZXAtPmxvY2ssIGZsYWdzKTsKKworCS8qIENvcHkgdGhlIGRhdGEgbWVtYmVyIGZyb20gaW5zaWRlIHRoZSBsb2NrICovCisJZXBpLT5ldmVudC5kYXRhID0gZXZlbnQtPmRhdGE7CisKKwkvKgorCSAqIElmIHRoZSBpdGVtIGlzIG5vdCBsaW5rZWQgdG8gdGhlIGhhc2ggaXQgbWVhbnMgdGhhdCBpdCdzIG9uIGl0cworCSAqIHdheSB0b3dhcmQgdGhlIHJlbW92YWwuIERvIG5vdGhpbmcgaW4gdGhpcyBjYXNlLgorCSAqLworCWlmIChFUF9SQl9MSU5LRUQoJmVwaS0+cmJuKSkgeworCQkvKgorCQkgKiBJZiB0aGUgaXRlbSBpcyAiaG90IiBhbmQgaXQgaXMgbm90IHJlZ2lzdGVyZWQgaW5zaWRlIHRoZSByZWFkeQorCQkgKiBsaXN0LCBwdXNoIGl0IGluc2lkZS4gSWYgdGhlIGl0ZW0gaXMgbm90ICJob3QiIGFuZCBpdCBpcyBjdXJyZW50bHkKKwkJICogcmVnaXN0ZXJlZCBpbnNpZGUgdGhlIHJlYWR5IGxpc3QsIHVubGluayBpdC4KKwkJICovCisJCWlmIChyZXZlbnRzICYgZXZlbnQtPmV2ZW50cykgeworCQkJaWYgKCFFUF9JU19MSU5LRUQoJmVwaS0+cmRsbGluaykpIHsKKwkJCQlsaXN0X2FkZF90YWlsKCZlcGktPnJkbGxpbmssICZlcC0+cmRsbGlzdCk7CisKKwkJCQkvKiBOb3RpZnkgd2FpdGluZyB0YXNrcyB0aGF0IGV2ZW50cyBhcmUgYXZhaWxhYmxlICovCisJCQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmVwLT53cSkpCisJCQkJCXdha2VfdXAoJmVwLT53cSk7CisJCQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmVwLT5wb2xsX3dhaXQpKQorCQkJCQlwd2FrZSsrOworCQkJfQorCQl9CisJfQorCisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmVwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBXZSBoYXZlIHRvIGNhbGwgdGhpcyBvdXRzaWRlIHRoZSBsb2NrICovCisJaWYgKHB3YWtlKQorCQllcF9wb2xsX3NhZmV3YWtlKCZwc3csICZlcC0+cG9sbF93YWl0KTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHVucmVnaXN0ZXIgcG9sbCBjYWxsYmFja3MgZnJvbSB0aGUgYXNzb2NpYXRlZCBmaWxlIGRlc2NyaXB0b3IuCisgKiBTaW5jZSB0aGlzIG11c3QgYmUgY2FsbGVkIHdpdGhvdXQgaG9sZGluZyAiZXAtPmxvY2siIHRoZSBhdG9taWMgZXhjaGFuZ2UgdHJpY2sKKyAqIHdpbGwgcHJvdGVjdCB1cyBmcm9tIG11bHRpcGxlIHVucmVnaXN0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIGVwX3VucmVnaXN0ZXJfcG9sbHdhaXQoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBlcGl0ZW0gKmVwaSkKK3sKKwlpbnQgbndhaXQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbHN0aGVhZCA9ICZlcGktPnB3cWxpc3Q7CisJc3RydWN0IGVwcG9sbF9lbnRyeSAqcHdxOworCisJLyogVGhpcyBpcyBjYWxsZWQgd2l0aG91dCBsb2Nrcywgc28gd2UgbmVlZCB0aGUgYXRvbWljIGV4Y2hhbmdlICovCisJbndhaXQgPSB4Y2hnKCZlcGktPm53YWl0LCAwKTsKKworCWlmIChud2FpdCkgeworCQl3aGlsZSAoIWxpc3RfZW1wdHkobHN0aGVhZCkpIHsKKwkJCXB3cSA9IGxpc3RfZW50cnkobHN0aGVhZC0+bmV4dCwgc3RydWN0IGVwcG9sbF9lbnRyeSwgbGxpbmspOworCisJCQlFUF9MSVNUX0RFTCgmcHdxLT5sbGluayk7CisJCQlyZW1vdmVfd2FpdF9xdWV1ZShwd3EtPndoZWFkLCAmcHdxLT53YWl0KTsKKwkJCVBXUV9NRU1fRlJFRShwd3EpOworCQl9CisJfQorfQorCisKKy8qCisgKiBVbmxpbmsgdGhlICJzdHJ1Y3QgZXBpdGVtIiBmcm9tIGFsbCBwbGFjZXMgaXQgbWlnaHQgaGF2ZSBiZWVuIGhvb2tlZCB1cC4KKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB3cml0ZSBJUlEgbG9jayBvbiAiZXAtPmxvY2siLgorICovCitzdGF0aWMgaW50IGVwX3VubGluayhzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGVwaXRlbSAqZXBpKQoreworCWludCBlcnJvcjsKKworCS8qCisJICogSXQgY2FuIGhhcHBlbiB0aGF0IHRoaXMgb25lIGlzIGNhbGxlZCBmb3IgYW4gaXRlbSBhbHJlYWR5IHVubGlua2VkLgorCSAqIFRoZSBjaGVjayBwcm90ZWN0IHVzIGZyb20gZG9pbmcgYSBkb3VibGUgdW5saW5rICggY3Jhc2ggKS4KKwkgKi8KKwllcnJvciA9IC1FTk9FTlQ7CisJaWYgKCFFUF9SQl9MSU5LRUQoJmVwaS0+cmJuKSkKKwkJZ290byBlZXhpdF8xOworCisJLyoKKwkgKiBDbGVhciB0aGUgZXZlbnQgbWFzayBmb3IgdGhlIHVubGlua2VkIGl0ZW0uIFRoaXMgd2lsbCBhdm9pZCBpdGVtCisJICogbm90aWZpY2F0aW9ucyB0byBiZSBzZW50IGFmdGVyIHRoZSB1bmxpbmsgb3BlcmF0aW9uIGZyb20gaW5zaWRlCisJICogdGhlIGtlcm5lbC0+dXNlcnNwYWNlIGV2ZW50IHRyYW5zZmVyIGxvb3AuCisJICovCisJZXBpLT5ldmVudC5ldmVudHMgPSAwOworCisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IGlzIHNhZmUgdG8gZG8gdGhlIGpvYiwgdW5saW5rIHRoZSBpdGVtIGZyb20gb3VyIHJiLXRyZWUuCisJICogVGhpcyBvcGVyYXRpb24gdG9naGV0ZXIgd2l0aCB0aGUgYWJvdmUgY2hlY2sgY2xvc2VzIHRoZSBkb29yIHRvCisJICogZG91YmxlIHVubGlua3MuCisJICovCisJRVBfUkJfRVJBU0UoJmVwaS0+cmJuLCAmZXAtPnJicik7CisKKwkvKgorCSAqIElmIHRoZSBpdGVtIHdlIGFyZSBnb2luZyB0byByZW1vdmUgaXMgaW5zaWRlIHRoZSByZWFkeSBmaWxlIGRlc2NyaXB0b3JzCisJICogd2Ugd2FudCB0byByZW1vdmUgaXQgZnJvbSB0aGlzIGxpc3QgdG8gYXZvaWQgc3RhbGUgZXZlbnRzLgorCSAqLworCWlmIChFUF9JU19MSU5LRUQoJmVwaS0+cmRsbGluaykpCisJCUVQX0xJU1RfREVMKCZlcGktPnJkbGxpbmspOworCisJZXJyb3IgPSAwOworZWV4aXRfMToKKworCUROUFJJTlRLKDMsIChLRVJOX0lORk8gIlslcF0gZXZlbnRwb2xsOiBlcF91bmxpbmsoJXAsICVwKSA9ICVkXG4iLAorCQkgICAgIGN1cnJlbnQsIGVwLCBlcGktPmZpbGUsIGVycm9yKSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoKKyAqIFJlbW92ZXMgYSAic3RydWN0IGVwaXRlbSIgZnJvbSB0aGUgZXZlbnRwb2xsIGhhc2ggYW5kIGRlYWxsb2NhdGVzCisgKiBhbGwgdGhlIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgorICovCitzdGF0aWMgaW50IGVwX3JlbW92ZShzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGVwaXRlbSAqZXBpKQoreworCWludCBlcnJvcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBmaWxlICpmaWxlID0gZXBpLT5mZmQuZmlsZTsKKworCS8qCisJICogUmVtb3ZlcyBwb2xsIHdhaXQgcXVldWUgaG9va3MuIFdlIF9oYXZlXyB0byBkbyB0aGlzIHdpdGhvdXQgaG9sZGluZworCSAqIHRoZSAiZXAtPmxvY2siIG90aGVyd2lzZSBhIGRlYWRsb2NrIG1pZ2h0IG9jY3VyLiBUaGlzIGJlY2F1c2Ugb2YgdGhlCisJICogc2VxdWVuY2Ugb2YgdGhlIGxvY2sgYWNxdWlzaXRpb24uIEhlcmUgd2UgZG8gImVwLT5sb2NrIiB0aGVuIHRoZSB3YWl0CisJICogcXVldWUgaGVhZCBsb2NrIHdoZW4gdW5yZWdpc3RlcmluZyB0aGUgd2FpdCBxdWV1ZS4gVGhlIHdha2V1cCBjYWxsYmFjaworCSAqIHdpbGwgcnVuIGJ5IGhvbGRpbmcgdGhlIHdhaXQgcXVldWUgaGVhZCBsb2NrIGFuZCB3aWxsIGNhbGwgb3VyIGNhbGxiYWNrCisJICogdGhhdCB3aWxsIHRyeSB0byBnZXQgImVwLT5sb2NrIi4KKwkgKi8KKwllcF91bnJlZ2lzdGVyX3BvbGx3YWl0KGVwLCBlcGkpOworCisJLyogUmVtb3ZlIHRoZSBjdXJyZW50IGl0ZW0gZnJvbSB0aGUgbGlzdCBvZiBlcG9sbCBob29rcyAqLworCXNwaW5fbG9jaygmZmlsZS0+Zl9lcF9sb2NrKTsKKwlpZiAoRVBfSVNfTElOS0VEKCZlcGktPmZsbGluaykpCisJCUVQX0xJU1RfREVMKCZlcGktPmZsbGluayk7CisJc3Bpbl91bmxvY2soJmZpbGUtPmZfZXBfbG9jayk7CisKKwkvKiBXZSBuZWVkIHRvIGFjcXVpcmUgdGhlIHdyaXRlIElSUSBsb2NrIGJlZm9yZSBjYWxsaW5nIGVwX3VubGluaygpICovCisJd3JpdGVfbG9ja19pcnFzYXZlKCZlcC0+bG9jaywgZmxhZ3MpOworCisJLyogUmVhbGx5IHVubGluayB0aGUgaXRlbSBmcm9tIHRoZSBoYXNoICovCisJZXJyb3IgPSBlcF91bmxpbmsoZXAsIGVwaSk7CisKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmZXAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChlcnJvcikKKwkJZ290byBlZXhpdF8xOworCisJLyogQXQgdGhpcyBwb2ludCBpdCBpcyBzYWZlIHRvIGZyZWUgdGhlIGV2ZW50cG9sbCBpdGVtICovCisJZXBfcmVsZWFzZV9lcGl0ZW0oZXBpKTsKKworCWVycm9yID0gMDsKK2VleGl0XzE6CisJRE5QUklOVEsoMywgKEtFUk5fSU5GTyAiWyVwXSBldmVudHBvbGw6IGVwX3JlbW92ZSglcCwgJXApID0gJWRcbiIsCisJCSAgICAgY3VycmVudCwgZXAsIGZpbGUsIGVycm9yKSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSB3YWl0IHF1ZXVlIHdha2V1cAorICogbWFjaGFuaXNtLiBJdCBpcyBjYWxsZWQgYnkgdGhlIHN0b3JlZCBmaWxlIGRlc2NyaXB0b3JzIHdoZW4gdGhleQorICogaGF2ZSBldmVudHMgdG8gcmVwb3J0LgorICovCitzdGF0aWMgaW50IGVwX3BvbGxfY2FsbGJhY2sod2FpdF9xdWV1ZV90ICp3YWl0LCB1bnNpZ25lZCBtb2RlLCBpbnQgc3luYywgdm9pZCAqa2V5KQoreworCWludCBwd2FrZSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZXBpdGVtICplcGkgPSBFUF9JVEVNX0ZST01fV0FJVCh3YWl0KTsKKwlzdHJ1Y3QgZXZlbnRwb2xsICplcCA9IGVwaS0+ZXA7CisKKwlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogcG9sbF9jYWxsYmFjayglcCkgZXBpPSVwIGVwPSVwXG4iLAorCQkgICAgIGN1cnJlbnQsIGVwaS0+ZmlsZSwgZXBpLCBlcCkpOworCisJd3JpdGVfbG9ja19pcnFzYXZlKCZlcC0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBJZiB0aGUgZXZlbnQgbWFzayBkb2VzIG5vdCBjb250YWluIGFueSBwb2xsKDIpIGV2ZW50LCB3ZSBjb25zaWRlciB0aGUKKwkgKiBkZXNjcmlwdG9yIHRvIGJlIGRpc2FibGVkLiBUaGlzIGNvbmRpdGlvbiBpcyBsaWtlbHkgdGhlIGVmZmVjdCBvZiB0aGUKKwkgKiBFUE9MTE9ORVNIT1QgYml0IHRoYXQgZGlzYWJsZXMgdGhlIGRlc2NyaXB0b3Igd2hlbiBhbiBldmVudCBpcyByZWNlaXZlZCwKKwkgKiB1bnRpbCB0aGUgbmV4dCBFUE9MTF9DVExfTU9EIHdpbGwgYmUgaXNzdWVkLgorCSAqLworCWlmICghKGVwaS0+ZXZlbnQuZXZlbnRzICYgfkVQX1BSSVZBVEVfQklUUykpCisJCWdvdG8gaXNfZGlzYWJsZWQ7CisKKwkvKiBJZiB0aGlzIGZpbGUgaXMgYWxyZWFkeSBpbiB0aGUgcmVhZHkgbGlzdCB3ZSBleGl0IHNvb24gKi8KKwlpZiAoRVBfSVNfTElOS0VEKCZlcGktPnJkbGxpbmspKQorCQlnb3RvIGlzX2xpbmtlZDsKKworCWxpc3RfYWRkX3RhaWwoJmVwaS0+cmRsbGluaywgJmVwLT5yZGxsaXN0KTsKKworaXNfbGlua2VkOgorCS8qCisJICogV2FrZSB1cCAoIGlmIGFjdGl2ZSApIGJvdGggdGhlIGV2ZW50cG9sbCB3YWl0IGxpc3QgYW5kIHRoZSAtPnBvbGwoKQorCSAqIHdhaXQgbGlzdC4KKwkgKi8KKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZXAtPndxKSkKKwkJd2FrZV91cCgmZXAtPndxKTsKKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZXAtPnBvbGxfd2FpdCkpCisJCXB3YWtlKys7CisKK2lzX2Rpc2FibGVkOgorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZlcC0+bG9jaywgZmxhZ3MpOworCisJLyogV2UgaGF2ZSB0byBjYWxsIHRoaXMgb3V0c2lkZSB0aGUgbG9jayAqLworCWlmIChwd2FrZSkKKwkJZXBfcG9sbF9zYWZld2FrZSgmcHN3LCAmZXAtPnBvbGxfd2FpdCk7CisKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGVwX2V2ZW50cG9sbF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZXZlbnRwb2xsICplcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmIChlcCkgeworCQllcF9mcmVlKGVwKTsKKwkJa2ZyZWUoZXApOworCX0KKworCUROUFJJTlRLKDMsIChLRVJOX0lORk8gIlslcF0gZXZlbnRwb2xsOiBjbG9zZSgpIGVwPSVwXG4iLCBjdXJyZW50LCBlcCkpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXBfZXZlbnRwb2xsX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJdW5zaWduZWQgaW50IHBvbGxmbGFncyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZXZlbnRwb2xsICplcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCS8qIEluc2VydCBpbnNpZGUgb3VyIHBvbGwgd2FpdCBxdWV1ZSAqLworCXBvbGxfd2FpdChmaWxlLCAmZXAtPnBvbGxfd2FpdCwgd2FpdCk7CisKKwkvKiBDaGVjayBvdXIgY29uZGl0aW9uICovCisJcmVhZF9sb2NrX2lycXNhdmUoJmVwLT5sb2NrLCBmbGFncyk7CisJaWYgKCFsaXN0X2VtcHR5KCZlcC0+cmRsbGlzdCkpCisJCXBvbGxmbGFncyA9IFBPTExJTiB8IFBPTExSRE5PUk07CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmZXAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBwb2xsZmxhZ3M7Cit9CisKKworLyoKKyAqIFNpbmNlIHdlIGhhdmUgdG8gcmVsZWFzZSB0aGUgbG9jayBkdXJpbmcgdGhlIF9fY29weV90b191c2VyKCkgb3BlcmF0aW9uIGFuZAorICogZHVyaW5nIHRoZSBmX29wLT5wb2xsKCkgY2FsbCwgd2UgdHJ5IHRvIGNvbGxlY3QgdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zCisgKiBieSByZWR1Y2luZyB0aGUgaXJxbG9jay9pcnF1bmxvY2sgc3dpdGNoaW5nIHJhdGUuCisgKi8KK3N0YXRpYyBpbnQgZXBfY29sbGVjdF9yZWFkeV9pdGVtcyhzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGxpc3RfaGVhZCAqdHhsaXN0LCBpbnQgbWF4ZXZlbnRzKQoreworCWludCBuZXBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqbHN0aGVhZCA9ICZlcC0+cmRsbGlzdCwgKmxuazsKKwlzdHJ1Y3QgZXBpdGVtICplcGk7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmVwLT5sb2NrLCBmbGFncyk7CisKKwlmb3IgKG5lcGkgPSAwLCBsbmsgPSBsc3RoZWFkLT5uZXh0OyBsbmsgIT0gbHN0aGVhZCAmJiBuZXBpIDwgbWF4ZXZlbnRzOykgeworCQllcGkgPSBsaXN0X2VudHJ5KGxuaywgc3RydWN0IGVwaXRlbSwgcmRsbGluayk7CisKKwkJbG5rID0gbG5rLT5uZXh0OworCisJCS8qIElmIHRoaXMgZmlsZSBpcyBhbHJlYWR5IGluIHRoZSByZWFkeSBsaXN0IHdlIGV4aXQgc29vbiAqLworCQlpZiAoIUVQX0lTX0xJTktFRCgmZXBpLT50eGxpbmspKSB7CisJCQkvKgorCQkJICogVGhpcyBpcyBpbml0aWFsaXplZCBpbiB0aGlzIHdheSBzbyB0aGF0IHRoZSBkZWZhdWx0CisJCQkgKiBiZWhhdmlvdXIgb2YgdGhlIHJlaW5qZWN0aW5nIGNvZGUgd2lsbCBiZSB0byBwdXNoIGJhY2sKKwkJCSAqIHRoZSBpdGVtIGluc2lkZSB0aGUgcmVhZHkgbGlzdC4KKwkJCSAqLworCQkJZXBpLT5yZXZlbnRzID0gZXBpLT5ldmVudC5ldmVudHM7CisKKwkJCS8qIExpbmsgdGhlIHJlYWR5IGl0ZW0gaW50byB0aGUgdHJhbnNmZXIgbGlzdCAqLworCQkJbGlzdF9hZGQoJmVwaS0+dHhsaW5rLCB0eGxpc3QpOworCQkJbmVwaSsrOworCisJCQkvKgorCQkJICogVW5saW5rIHRoZSBpdGVtIGZyb20gdGhlIHJlYWR5IGxpc3QuCisJCQkgKi8KKwkJCUVQX0xJU1RfREVMKCZlcGktPnJkbGxpbmspOworCQl9CisJfQorCisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmVwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gbmVwaTsKK30KKworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aG91dCBob2xkaW5nIHRoZSAiZXAtPmxvY2siIHNpbmNlIHRoZSBjYWxsIHRvCisgKiBfX2NvcHlfdG9fdXNlcigpIG1pZ2h0IHNsZWVwLCBhbmQgYWxzbyBmX29wLT5wb2xsKCkgbWlnaHQgcmVlbmFibGUgdGhlIElSUQorICogYmVjYXVzZSBvZiB0aGUgd2F5IHBvbGwoKSBpcyB0cmFkaXRpb25hbGx5IGltcGxlbWVudGVkIGluIExpbnV4LgorICovCitzdGF0aWMgaW50IGVwX3NlbmRfZXZlbnRzKHN0cnVjdCBldmVudHBvbGwgKmVwLCBzdHJ1Y3QgbGlzdF9oZWFkICp0eGxpc3QsCisJCQkgIHN0cnVjdCBlcG9sbF9ldmVudCBfX3VzZXIgKmV2ZW50cykKK3sKKwlpbnQgZXZlbnRjbnQgPSAwOworCXVuc2lnbmVkIGludCByZXZlbnRzOworCXN0cnVjdCBsaXN0X2hlYWQgKmxuazsKKwlzdHJ1Y3QgZXBpdGVtICplcGk7CisKKwkvKgorCSAqIFdlIGNhbiBsb29wIHdpdGhvdXQgbG9jayBiZWNhdXNlIHRoaXMgaXMgYSB0YXNrIHByaXZhdGUgbGlzdC4KKwkgKiBUaGUgdGVzdCBkb25lIGR1cmluZyB0aGUgY29sbGVjdGlvbiBsb29wIHdpbGwgZ3VhcmFudGVlIHVzIHRoYXQKKwkgKiBhbm90aGVyIHRhc2sgd2lsbCBub3QgdHJ5IHRvIGNvbGxlY3QgdGhpcyBmaWxlLiBBbHNvLCBpdGVtcworCSAqIGNhbm5vdCB2YW5pc2ggZHVyaW5nIHRoZSBsb29wIGJlY2F1c2Ugd2UgYXJlIGhvbGRpbmcgInNlbSIuCisJICovCisJbGlzdF9mb3JfZWFjaChsbmssIHR4bGlzdCkgeworCQllcGkgPSBsaXN0X2VudHJ5KGxuaywgc3RydWN0IGVwaXRlbSwgdHhsaW5rKTsKKworCQkvKgorCQkgKiBHZXQgdGhlIHJlYWR5IGZpbGUgZXZlbnQgc2V0LiBXZSBjYW4gc2FmZWx5IHVzZSB0aGUgZmlsZQorCQkgKiBiZWNhdXNlIHdlIGFyZSBob2xkaW5nIHRoZSAic2VtIiBpbiByZWFkIGFuZCB0aGlzIHdpbGwKKwkJICogZ3VhcmFudGVlIHRoYXQgYm90aCB0aGUgZmlsZSBhbmQgdGhlIGl0ZW0gd2lsbCBub3QgdmFuaXNoLgorCQkgKi8KKwkJcmV2ZW50cyA9IGVwaS0+ZmZkLmZpbGUtPmZfb3AtPnBvbGwoZXBpLT5mZmQuZmlsZSwgTlVMTCk7CisKKwkJLyoKKwkJICogU2V0IHRoZSByZXR1cm4gZXZlbnQgc2V0IGZvciB0aGUgY3VycmVudCBmaWxlIGRlc2NyaXB0b3IuCisJCSAqIE5vdGUgdGhhdCBvbmx5IHRoZSB0YXNrIHRhc2sgd2FzIHN1Y2Nlc3NmdWxseSBhYmxlIHRvIGxpbmsKKwkJICogdGhlIGl0ZW0gdG8gaXRzICJ0eGxpc3QiIHdpbGwgd3JpdGUgdGhpcyBmaWVsZC4KKwkJICovCisJCWVwaS0+cmV2ZW50cyA9IHJldmVudHMgJiBlcGktPmV2ZW50LmV2ZW50czsKKworCQlpZiAoZXBpLT5yZXZlbnRzKSB7CisJCQlpZiAoX19wdXRfdXNlcihlcGktPnJldmVudHMsCisJCQkJICAgICAgICZldmVudHNbZXZlbnRjbnRdLmV2ZW50cykgfHwKKwkJCSAgICBfX3B1dF91c2VyKGVwaS0+ZXZlbnQuZGF0YSwKKwkJCQkgICAgICAgJmV2ZW50c1tldmVudGNudF0uZGF0YSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoZXBpLT5ldmVudC5ldmVudHMgJiBFUE9MTE9ORVNIT1QpCisJCQkJZXBpLT5ldmVudC5ldmVudHMgJj0gRVBfUFJJVkFURV9CSVRTOworCQkJZXZlbnRjbnQrKzsKKwkJfQorCX0KKwlyZXR1cm4gZXZlbnRjbnQ7Cit9CisKKworLyoKKyAqIFdhbGsgdGhyb3VnaCB0aGUgdHJhbnNmZXIgbGlzdCB3ZSBjb2xsZWN0ZWQgd2l0aCBlcF9jb2xsZWN0X3JlYWR5X2l0ZW1zKCkKKyAqIGFuZCwgaWYgMSkgdGhlIGl0ZW0gaXMgc3RpbGwgImFsaXZlIiAyKSBpdHMgZXZlbnQgc2V0IGlzIG5vdCBlbXB0eSAzKSBpdCdzCisgKiBub3QgYWxyZWFkeSBsaW5rZWQsIGxpbmtzIGl0IHRvIHRoZSByZWFkeSBsaXN0LiBTYW1lIGFzIGFib3ZlLCB3ZSBhcmUgaG9sZGluZworICogInNlbSIgc28gaXRlbXMgY2Fubm90IHZhbmlzaCB1bmRlcm5lYXRoIG91ciBub3NlLgorICovCitzdGF0aWMgdm9pZCBlcF9yZWluamVjdF9pdGVtcyhzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGxpc3RfaGVhZCAqdHhsaXN0KQoreworCWludCByaWNudCA9IDAsIHB3YWtlID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBlcGl0ZW0gKmVwaTsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmZXAtPmxvY2ssIGZsYWdzKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSh0eGxpc3QpKSB7CisJCWVwaSA9IGxpc3RfZW50cnkodHhsaXN0LT5uZXh0LCBzdHJ1Y3QgZXBpdGVtLCB0eGxpbmspOworCisJCS8qIFVubGluayB0aGUgY3VycmVudCBpdGVtIGZyb20gdGhlIHRyYW5zZmVyIGxpc3QgKi8KKwkJRVBfTElTVF9ERUwoJmVwaS0+dHhsaW5rKTsKKworCQkvKgorCQkgKiBJZiB0aGUgaXRlbSBpcyBubyBtb3JlIGxpbmtlZCB0byB0aGUgaW50ZXJlc3Qgc2V0LCB3ZSBkb24ndAorCQkgKiBoYXZlIHRvIHB1c2ggaXQgaW5zaWRlIHRoZSByZWFkeSBsaXN0IGJlY2F1c2UgdGhlIGZvbGxvd2luZworCQkgKiBlcF9yZWxlYXNlX2VwaXRlbSgpIGlzIGdvaW5nIHRvIGRyb3AgaXQuIEFsc28sIGlmIHRoZSBjdXJyZW50CisJCSAqIGl0ZW0gaXMgc2V0IHRvIGhhdmUgYW4gRWRnZSBUcmlnZ2VyZWQgYmVoYXZpb3VyLCB3ZSBkb24ndCBoYXZlCisJCSAqIHRvIHB1c2ggaXQgYmFjayBlaXRoZXIuCisJCSAqLworCQlpZiAoRVBfUkJfTElOS0VEKCZlcGktPnJibikgJiYgIShlcGktPmV2ZW50LmV2ZW50cyAmIEVQT0xMRVQpICYmCisJCSAgICAoZXBpLT5yZXZlbnRzICYgZXBpLT5ldmVudC5ldmVudHMpICYmICFFUF9JU19MSU5LRUQoJmVwaS0+cmRsbGluaykpIHsKKwkJCWxpc3RfYWRkX3RhaWwoJmVwaS0+cmRsbGluaywgJmVwLT5yZGxsaXN0KTsKKwkJCXJpY250Kys7CisJCX0KKwl9CisKKwlpZiAocmljbnQpIHsKKwkJLyoKKwkJICogV2FrZSB1cCAoIGlmIGFjdGl2ZSApIGJvdGggdGhlIGV2ZW50cG9sbCB3YWl0IGxpc3QgYW5kIHRoZSAtPnBvbGwoKQorCQkgKiB3YWl0IGxpc3QuCisJCSAqLworCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZXAtPndxKSkKKwkJCXdha2VfdXAoJmVwLT53cSk7CisJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZlcC0+cG9sbF93YWl0KSkKKwkJCXB3YWtlKys7CisJfQorCisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmVwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBXZSBoYXZlIHRvIGNhbGwgdGhpcyBvdXRzaWRlIHRoZSBsb2NrICovCisJaWYgKHB3YWtlKQorCQllcF9wb2xsX3NhZmV3YWtlKCZwc3csICZlcC0+cG9sbF93YWl0KTsKK30KKworCisvKgorICogUGVyZm9ybSB0aGUgdHJhbnNmZXIgb2YgZXZlbnRzIHRvIHVzZXIgc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgZXBfZXZlbnRzX3RyYW5zZmVyKHN0cnVjdCBldmVudHBvbGwgKmVwLAorCQkJICAgICAgc3RydWN0IGVwb2xsX2V2ZW50IF9fdXNlciAqZXZlbnRzLCBpbnQgbWF4ZXZlbnRzKQoreworCWludCBldmVudGNudCA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCB0eGxpc3Q7CisKKwlJTklUX0xJU1RfSEVBRCgmdHhsaXN0KTsKKworCS8qCisJICogV2UgbmVlZCB0byBsb2NrIHRoaXMgYmVjYXVzZSB3ZSBjb3VsZCBiZSBoaXQgYnkKKwkgKiBldmVudHBvbGxfcmVsZWFzZV9maWxlKCkgYW5kIGVwb2xsX2N0bChFUE9MTF9DVExfREVMKS4KKwkgKi8KKwlkb3duX3JlYWQoJmVwLT5zZW0pOworCisJLyogQ29sbGVjdC9leHRyYWN0IHJlYWR5IGl0ZW1zICovCisJaWYgKGVwX2NvbGxlY3RfcmVhZHlfaXRlbXMoZXAsICZ0eGxpc3QsIG1heGV2ZW50cykgPiAwKSB7CisJCS8qIEJ1aWxkIHJlc3VsdCBzZXQgaW4gdXNlcnNwYWNlICovCisJCWV2ZW50Y250ID0gZXBfc2VuZF9ldmVudHMoZXAsICZ0eGxpc3QsIGV2ZW50cyk7CisKKwkJLyogUmVpbmplY3QgcmVhZHkgaXRlbXMgaW50byB0aGUgcmVhZHkgbGlzdCAqLworCQllcF9yZWluamVjdF9pdGVtcyhlcCwgJnR4bGlzdCk7CisJfQorCisJdXBfcmVhZCgmZXAtPnNlbSk7CisKKwlyZXR1cm4gZXZlbnRjbnQ7Cit9CisKKworc3RhdGljIGludCBlcF9wb2xsKHN0cnVjdCBldmVudHBvbGwgKmVwLCBzdHJ1Y3QgZXBvbGxfZXZlbnQgX191c2VyICpldmVudHMsCisJCSAgIGludCBtYXhldmVudHMsIGxvbmcgdGltZW91dCkKK3sKKwlpbnQgcmVzLCBlYXZhaWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb25nIGp0aW1lb3V0OworCXdhaXRfcXVldWVfdCB3YWl0OworCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHRpbWVvdXQgYnkgY2hlY2tpbmcgZm9yIHRoZSAiaW5maW5pdGUiIHZhbHVlICggLTEgKQorCSAqIGFuZCB0aGUgb3ZlcmZsb3cgY29uZGl0aW9uLiBUaGUgcGFzc2VkIHRpbWVvdXQgaXMgaW4gbWlsbGlzZWNvbmRzLAorCSAqIHRoYXQgd2h5ICh0ICogSFopIC8gMTAwMC4KKwkgKi8KKwlqdGltZW91dCA9IHRpbWVvdXQgPT0gLTEgfHwgdGltZW91dCA+IChNQVhfU0NIRURVTEVfVElNRU9VVCAtIDEwMDApIC8gSFogPworCQlNQVhfU0NIRURVTEVfVElNRU9VVDogKHRpbWVvdXQgKiBIWiArIDk5OSkgLyAxMDAwOworCityZXRyeToKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmVwLT5sb2NrLCBmbGFncyk7CisKKwlyZXMgPSAwOworCWlmIChsaXN0X2VtcHR5KCZlcC0+cmRsbGlzdCkpIHsKKwkJLyoKKwkJICogV2UgZG9uJ3QgaGF2ZSBhbnkgYXZhaWxhYmxlIGV2ZW50IHRvIHJldHVybiB0byB0aGUgY2FsbGVyLgorCQkgKiBXZSBuZWVkIHRvIHNsZWVwIGhlcmUsIGFuZCB3ZSB3aWxsIGJlIHdha2UgdXAgYnkKKwkJICogZXBfcG9sbF9jYWxsYmFjaygpIHdoZW4gZXZlbnRzIHdpbGwgYmVjb21lIGF2YWlsYWJsZS4KKwkJICovCisJCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKKwkJYWRkX3dhaXRfcXVldWUoJmVwLT53cSwgJndhaXQpOworCisJCWZvciAoOzspIHsKKwkJCS8qCisJCQkgKiBXZSBkb24ndCB3YW50IHRvIHNsZWVwIGlmIHRoZSBlcF9wb2xsX2NhbGxiYWNrKCkgc2VuZHMgdXMKKwkJCSAqIGEgd2FrZXVwIGluIGJldHdlZW4uIFRoYXQncyB3aHkgd2Ugc2V0IHRoZSB0YXNrIHN0YXRlCisJCQkgKiB0byBUQVNLX0lOVEVSUlVQVElCTEUgYmVmb3JlIGRvaW5nIHRoZSBjaGVja3MuCisJCQkgKi8KKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAoIWxpc3RfZW1wdHkoJmVwLT5yZGxsaXN0KSB8fCAhanRpbWVvdXQpCisJCQkJYnJlYWs7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZXMgPSAtRUlOVFI7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZlcC0+bG9jaywgZmxhZ3MpOworCQkJanRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KGp0aW1lb3V0KTsKKwkJCXdyaXRlX2xvY2tfaXJxc2F2ZSgmZXAtPmxvY2ssIGZsYWdzKTsKKwkJfQorCQlyZW1vdmVfd2FpdF9xdWV1ZSgmZXAtPndxLCAmd2FpdCk7CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwl9CisKKwkvKiBJcyBpdCB3b3J0aCB0byB0cnkgdG8gZGlnIGZvciBldmVudHMgPyAqLworCWVhdmFpbCA9ICFsaXN0X2VtcHR5KCZlcC0+cmRsbGlzdCk7CisKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmZXAtPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogVHJ5IHRvIHRyYW5zZmVyIGV2ZW50cyB0byB1c2VyIHNwYWNlLiBJbiBjYXNlIHdlIGdldCAwIGV2ZW50cyBhbmQKKwkgKiB0aGVyZSdzIHN0aWxsIHRpbWVvdXQgbGVmdCBvdmVyLCB3ZSBnbyB0cnlpbmcgYWdhaW4gaW4gc2VhcmNoIG9mCisJICogbW9yZSBsdWNrLgorCSAqLworCWlmICghcmVzICYmIGVhdmFpbCAmJgorCSAgICAhKHJlcyA9IGVwX2V2ZW50c190cmFuc2ZlcihlcCwgZXZlbnRzLCBtYXhldmVudHMpKSAmJiBqdGltZW91dCkKKwkJZ290byByZXRyeTsKKworCXJldHVybiByZXM7Cit9CisKKworc3RhdGljIGludCBldmVudHBvbGxmc19kZWxldGVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmVwX2V2ZW50cG9sbF9pbm9kZSh2b2lkKQoreworCWludCBlcnJvciA9IC1FTk9NRU07CisJc3RydWN0IGlub2RlICppbm9kZSA9IG5ld19pbm9kZShldmVudHBvbGxfbW50LT5tbnRfc2IpOworCisJaWYgKCFpbm9kZSkKKwkJZ290byBlZXhpdF8xOworCisJaW5vZGUtPmlfZm9wID0gJmV2ZW50cG9sbF9mb3BzOworCisJLyoKKwkgKiBNYXJrIHRoZSBpbm9kZSBkaXJ0eSBmcm9tIHRoZSB2ZXJ5IGJlZ2lubmluZywKKwkgKiB0aGF0IHdheSBpdCB3aWxsIG5ldmVyIGJlIG1vdmVkIHRvIHRoZSBkaXJ0eQorCSAqIGxpc3QgYmVjYXVzZSBtYXJrX2lub2RlX2RpcnR5KCkgd2lsbCB0aGluaworCSAqIHRoYXQgaXQgYWxyZWFkeSBfaXNfIG9uIHRoZSBkaXJ0eSBsaXN0LgorCSAqLworCWlub2RlLT5pX3N0YXRlID0gSV9ESVJUWTsKKwlpbm9kZS0+aV9tb2RlID0gU19JUlVTUiB8IFNfSVdVU1I7CisJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX1NJWkU7CisJcmV0dXJuIGlub2RlOworCitlZXhpdF8xOgorCXJldHVybiBFUlJfUFRSKGVycm9yKTsKK30KKworCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICoKK2V2ZW50cG9sbGZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAorCQkgICBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX3BzZXVkbyhmc190eXBlLCAiZXZlbnRwb2xsOiIsIE5VTEwsIEVWRU5UUE9MTEZTX01BR0lDKTsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBldmVudHBvbGxfaW5pdCh2b2lkKQoreworCWludCBlcnJvcjsKKworCWluaXRfTVVURVgoJmVwc2VtKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHN0cnVjdHVyZSB1c2VkIHRvIHBlcmZvcm0gc2FmZSBwb2xsIHdhaXQgaGVhZCB3YWtlIHVwcyAqLworCWVwX3BvbGxfc2FmZXdha2VfaW5pdCgmcHN3KTsKKworCS8qIEFsbG9jYXRlcyBzbGFiIGNhY2hlIHVzZWQgdG8gYWxsb2NhdGUgInN0cnVjdCBlcGl0ZW0iIGl0ZW1zICovCisJZXBpX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImV2ZW50cG9sbF9lcGkiLCBzaXplb2Yoc3RydWN0IGVwaXRlbSksCisJCQkwLCBTTEFCX0hXQ0FDSEVfQUxJR058RVBJX1NMQUJfREVCVUd8U0xBQl9QQU5JQywKKwkJCU5VTEwsIE5VTEwpOworCisJLyogQWxsb2NhdGVzIHNsYWIgY2FjaGUgdXNlZCB0byBhbGxvY2F0ZSAic3RydWN0IGVwcG9sbF9lbnRyeSIgKi8KKwlwd3FfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZXZlbnRwb2xsX3B3cSIsCisJCQlzaXplb2Yoc3RydWN0IGVwcG9sbF9lbnRyeSksIDAsCisJCQlFUElfU0xBQl9ERUJVR3xTTEFCX1BBTklDLCBOVUxMLCBOVUxMKTsKKworCS8qCisJICogUmVnaXN0ZXIgdGhlIHZpcnR1YWwgZmlsZSBzeXN0ZW0gdGhhdCB3aWxsIGJlIHRoZSBzb3VyY2Ugb2YgaW5vZGVzCisJICogZm9yIHRoZSBldmVudHBvbGwgZmlsZXMKKwkgKi8KKwllcnJvciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmV2ZW50cG9sbF9mc190eXBlKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXBhbmljOworCisJLyogTW91bnQgdGhlIGFib3ZlIGNvbW1lbnRlZCB2aXJ0dWFsIGZpbGUgc3lzdGVtICovCisJZXZlbnRwb2xsX21udCA9IGtlcm5fbW91bnQoJmV2ZW50cG9sbF9mc190eXBlKTsKKwllcnJvciA9IFBUUl9FUlIoZXZlbnRwb2xsX21udCk7CisJaWYgKElTX0VSUihldmVudHBvbGxfbW50KSkKKwkJZ290byBlcGFuaWM7CisKKwlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkLlxuIiwKKwkJCWN1cnJlbnQpKTsKKwlyZXR1cm4gMDsKKworZXBhbmljOgorCXBhbmljKCJldmVudHBvbGxfaW5pdCgpIGZhaWxlZFxuIik7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IGV2ZW50cG9sbF9leGl0KHZvaWQpCit7CisJLyogVW5kbyBhbGwgb3BlcmF0aW9ucyBkb25lIGluc2lkZSBldmVudHBvbGxfaW5pdCgpICovCisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZldmVudHBvbGxfZnNfdHlwZSk7CisJbW50cHV0KGV2ZW50cG9sbF9tbnQpOworCWttZW1fY2FjaGVfZGVzdHJveShwd3FfY2FjaGUpOworCWttZW1fY2FjaGVfZGVzdHJveShlcGlfY2FjaGUpOworfQorCittb2R1bGVfaW5pdChldmVudHBvbGxfaW5pdCk7Cittb2R1bGVfZXhpdChldmVudHBvbGxfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL2V4ZWMuYyBiL2ZzL2V4ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODM5NDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZXhlYy5jCkBAIC0wLDAgKzEsMTQ5OCBAQAorLyoKKyAqICBsaW51eC9mcy9leGVjLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKy8qCisgKiAjIS1jaGVja2luZyBpbXBsZW1lbnRlZCBieSB0eXRzby4KKyAqLworLyoKKyAqIERlbWFuZC1sb2FkaW5nIGltcGxlbWVudGVkIDAxLjEyLjkxIC0gbm8gbmVlZCB0byByZWFkIGFueXRoaW5nIGJ1dAorICogdGhlIGhlYWRlciBpbnRvIG1lbW9yeS4gVGhlIGlub2RlIG9mIHRoZSBleGVjdXRhYmxlIGlzIHB1dCBpbnRvCisgKiAiY3VycmVudC0+ZXhlY3V0YWJsZSIsIGFuZCBwYWdlIGZhdWx0cyBkbyB0aGUgYWN0dWFsIGxvYWRpbmcuIENsZWFuLgorICoKKyAqIE9uY2UgbW9yZSBJIGNhbiBwcm91ZGx5IHNheSB0aGF0IGxpbnV4IHN0b29kIHVwIHRvIGJlaW5nIGNoYW5nZWQ6IGl0CisgKiB3YXMgbGVzcyB0aGFuIDIgaG91cnMgd29yayB0byBnZXQgZGVtYW5kLWxvYWRpbmcgY29tcGxldGVseSBpbXBsZW1lbnRlZC4KKyAqCisgKiBEZW1hbmQgbG9hZGluZyBjaGFuZ2VkIEp1bHkgMTk5MyBieSBFcmljIFlvdW5nZGFsZS4gICBVc2UgbW1hcCBpbnN0ZWFkLAorICogY3VycmVudC0+ZXhlY3V0YWJsZSBpcyBvbmx5IHVzZWQgYnkgdGhlIHByb2Nmcy4gIFRoaXMgYWxsb3dzIGEgZGlzcGF0Y2gKKyAqIHRhYmxlIHRvIGNoZWNrIGZvciBzZXZlcmFsIGRpZmZlcmVudCB0eXBlcyAgb2YgYmluYXJ5IGZvcm1hdHMuICBXZSBrZWVwCisgKiB0cnlpbmcgdW50aWwgd2UgcmVjb2duaXplIHRoZSBmaWxlIG9yIHdlIHJ1biBvdXQgb2Ygc3VwcG9ydGVkIGJpbmFyeQorICogZm9ybWF0cy4gCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2tleS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvcm1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjY3QuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisKKyNpZmRlZiBDT05GSUdfS01PRAorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNlbmRpZgorCitpbnQgY29yZV91c2VzX3BpZDsKK2NoYXIgY29yZV9wYXR0ZXJuWzY1XSA9ICJjb3JlIjsKKy8qIFRoZSBtYXhpbWFsIGxlbmd0aCBvZiBjb3JlX3BhdHRlcm4gaXMgYWxzbyBzcGVjaWZpZWQgaW4gc3lzY3RsLmMgKi8KKworc3RhdGljIHN0cnVjdCBsaW51eF9iaW5mbXQgKmZvcm1hdHM7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhiaW5mbXRfbG9jayk7CisKK2ludCByZWdpc3Rlcl9iaW5mbXQoc3RydWN0IGxpbnV4X2JpbmZtdCAqIGZtdCkKK3sKKwlzdHJ1Y3QgbGludXhfYmluZm10ICoqIHRtcCA9ICZmb3JtYXRzOworCisJaWYgKCFmbXQpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChmbXQtPm5leHQpCisJCXJldHVybiAtRUJVU1k7CisJd3JpdGVfbG9jaygmYmluZm10X2xvY2spOworCXdoaWxlICgqdG1wKSB7CisJCWlmIChmbXQgPT0gKnRtcCkgeworCQkJd3JpdGVfdW5sb2NrKCZiaW5mbXRfbG9jayk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCXRtcCA9ICYoKnRtcCktPm5leHQ7CisJfQorCWZtdC0+bmV4dCA9IGZvcm1hdHM7CisJZm9ybWF0cyA9IGZtdDsKKwl3cml0ZV91bmxvY2soJmJpbmZtdF9sb2NrKTsKKwlyZXR1cm4gMDsJCit9CisKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfYmluZm10KTsKKworaW50IHVucmVnaXN0ZXJfYmluZm10KHN0cnVjdCBsaW51eF9iaW5mbXQgKiBmbXQpCit7CisJc3RydWN0IGxpbnV4X2JpbmZtdCAqKiB0bXAgPSAmZm9ybWF0czsKKworCXdyaXRlX2xvY2soJmJpbmZtdF9sb2NrKTsKKwl3aGlsZSAoKnRtcCkgeworCQlpZiAoZm10ID09ICp0bXApIHsKKwkJCSp0bXAgPSBmbXQtPm5leHQ7CisJCQl3cml0ZV91bmxvY2soJmJpbmZtdF9sb2NrKTsKKwkJCXJldHVybiAwOworCQl9CisJCXRtcCA9ICYoKnRtcCktPm5leHQ7CisJfQorCXdyaXRlX3VubG9jaygmYmluZm10X2xvY2spOworCXJldHVybiAtRUlOVkFMOworfQorCitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfYmluZm10KTsKKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9iaW5mbXQoc3RydWN0IGxpbnV4X2JpbmZtdCAqIGZtdCkKK3sKKwltb2R1bGVfcHV0KGZtdC0+bW9kdWxlKTsKK30KKworLyoKKyAqIE5vdGUgdGhhdCBhIHNoYXJlZCBsaWJyYXJ5IG11c3QgYmUgYm90aCByZWFkYWJsZSBhbmQgZXhlY3V0YWJsZSBkdWUgdG8KKyAqIHNlY3VyaXR5IHJlYXNvbnMuCisgKgorICogQWxzbyBub3RlIHRoYXQgd2UgdGFrZSB0aGUgYWRkcmVzcyB0byBsb2FkIGZyb20gZnJvbSB0aGUgZmlsZSBpdHNlbGYuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfdXNlbGliKGNvbnN0IGNoYXIgX191c2VyICogbGlicmFyeSkKK3sKKwlzdHJ1Y3QgZmlsZSAqIGZpbGU7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgZXJyb3I7CisKKwluZC5pbnRlbnQub3Blbi5mbGFncyA9IEZNT0RFX1JFQUQ7CisJZXJyb3IgPSBfX3VzZXJfd2FsayhsaWJyYXJ5LCBMT09LVVBfRk9MTE9XfExPT0tVUF9PUEVOLCAmbmQpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKCFTX0lTUkVHKG5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJZ290byBleGl0OworCisJZXJyb3IgPSBwZXJtaXNzaW9uKG5kLmRlbnRyeS0+ZF9pbm9kZSwgTUFZX1JFQUQgfCBNQVlfRVhFQywgJm5kKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXhpdDsKKworCWZpbGUgPSBkZW50cnlfb3BlbihuZC5kZW50cnksIG5kLm1udCwgT19SRE9OTFkpOworCWVycm9yID0gUFRSX0VSUihmaWxlKTsKKwlpZiAoSVNfRVJSKGZpbGUpKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gLUVOT0VYRUM7CisJaWYoZmlsZS0+Zl9vcCkgeworCQlzdHJ1Y3QgbGludXhfYmluZm10ICogZm10OworCisJCXJlYWRfbG9jaygmYmluZm10X2xvY2spOworCQlmb3IgKGZtdCA9IGZvcm1hdHMgOyBmbXQgOyBmbXQgPSBmbXQtPm5leHQpIHsKKwkJCWlmICghZm10LT5sb2FkX3NobGliKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCF0cnlfbW9kdWxlX2dldChmbXQtPm1vZHVsZSkpCisJCQkJY29udGludWU7CisJCQlyZWFkX3VubG9jaygmYmluZm10X2xvY2spOworCQkJZXJyb3IgPSBmbXQtPmxvYWRfc2hsaWIoZmlsZSk7CisJCQlyZWFkX2xvY2soJmJpbmZtdF9sb2NrKTsKKwkJCXB1dF9iaW5mbXQoZm10KTsKKwkJCWlmIChlcnJvciAhPSAtRU5PRVhFQykKKwkJCQlicmVhazsKKwkJfQorCQlyZWFkX3VubG9jaygmYmluZm10X2xvY2spOworCX0KKwlmcHV0KGZpbGUpOworb3V0OgorICAJcmV0dXJuIGVycm9yOworZXhpdDoKKwlwYXRoX3JlbGVhc2UoJm5kKTsKKwlnb3RvIG91dDsKK30KKworLyoKKyAqIGNvdW50KCkgY291bnRzIHRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpbiBhcnJheSBBUkdWLgorICovCitzdGF0aWMgaW50IGNvdW50KGNoYXIgX191c2VyICogX191c2VyICogYXJndiwgaW50IG1heCkKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAoYXJndiAhPSBOVUxMKSB7CisJCWZvciAoOzspIHsKKwkJCWNoYXIgX191c2VyICogcDsKKworCQkJaWYgKGdldF91c2VyKHAsIGFyZ3YpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKCFwKQorCQkJCWJyZWFrOworCQkJYXJndisrOworCQkJaWYoKytpID4gbWF4KQorCQkJCXJldHVybiAtRTJCSUc7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJfQorCX0KKwlyZXR1cm4gaTsKK30KKworLyoKKyAqICdjb3B5X3N0cmluZ3MoKScgY29waWVzIGFyZ3VtZW50L2Vudmlyb25tZW50IHN0cmluZ3MgZnJvbSB1c2VyCisgKiBtZW1vcnkgdG8gZnJlZSBwYWdlcyBpbiBrZXJuZWwgbWVtLiBUaGVzZSBhcmUgaW4gYSBmb3JtYXQgcmVhZHkKKyAqIHRvIGJlIHB1dCBkaXJlY3RseSBpbnRvIHRoZSB0b3Agb2YgbmV3IHVzZXIgbWVtb3J5LgorICovCitpbnQgY29weV9zdHJpbmdzKGludCBhcmdjLGNoYXIgX191c2VyICogX191c2VyICogYXJndiwgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKK3sKKwlzdHJ1Y3QgcGFnZSAqa21hcHBlZF9wYWdlID0gTlVMTDsKKwljaGFyICprYWRkciA9IE5VTEw7CisJaW50IHJldDsKKworCXdoaWxlIChhcmdjLS0gPiAwKSB7CisJCWNoYXIgX191c2VyICpzdHI7CisJCWludCBsZW47CisJCXVuc2lnbmVkIGxvbmcgcG9zOworCisJCWlmIChnZXRfdXNlcihzdHIsIGFyZ3YrYXJnYykgfHwKKwkJCQkhKGxlbiA9IHN0cm5sZW5fdXNlcihzdHIsIGJwcm0tPnApKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGJwcm0tPnAgPCBsZW4pICB7CisJCQlyZXQgPSAtRTJCSUc7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWJwcm0tPnAgLT0gbGVuOworCQkvKiBYWFg6IGFkZCBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgb3ZlcmZsb3cgY2hlY2sgaGVyZS4gKi8KKwkJcG9zID0gYnBybS0+cDsKKworCQl3aGlsZSAobGVuID4gMCkgeworCQkJaW50IGksIG5ldywgZXJyOworCQkJaW50IG9mZnNldCwgYnl0ZXNfdG9fY29weTsKKwkJCXN0cnVjdCBwYWdlICpwYWdlOworCisJCQlvZmZzZXQgPSBwb3MgJSBQQUdFX1NJWkU7CisJCQlpID0gcG9zL1BBR0VfU0laRTsKKwkJCXBhZ2UgPSBicHJtLT5wYWdlW2ldOworCQkJbmV3ID0gMDsKKwkJCWlmICghcGFnZSkgeworCQkJCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9ISUdIVVNFUik7CisJCQkJYnBybS0+cGFnZVtpXSA9IHBhZ2U7CisJCQkJaWYgKCFwYWdlKSB7CisJCQkJCXJldCA9IC1FTk9NRU07CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQluZXcgPSAxOworCQkJfQorCisJCQlpZiAocGFnZSAhPSBrbWFwcGVkX3BhZ2UpIHsKKwkJCQlpZiAoa21hcHBlZF9wYWdlKQorCQkJCQlrdW5tYXAoa21hcHBlZF9wYWdlKTsKKwkJCQlrbWFwcGVkX3BhZ2UgPSBwYWdlOworCQkJCWthZGRyID0ga21hcChrbWFwcGVkX3BhZ2UpOworCQkJfQorCQkJaWYgKG5ldyAmJiBvZmZzZXQpCisJCQkJbWVtc2V0KGthZGRyLCAwLCBvZmZzZXQpOworCQkJYnl0ZXNfdG9fY29weSA9IFBBR0VfU0laRSAtIG9mZnNldDsKKwkJCWlmIChieXRlc190b19jb3B5ID4gbGVuKSB7CisJCQkJYnl0ZXNfdG9fY29weSA9IGxlbjsKKwkJCQlpZiAobmV3KQorCQkJCQltZW1zZXQoa2FkZHIrb2Zmc2V0K2xlbiwgMCwKKwkJCQkJCVBBR0VfU0laRS1vZmZzZXQtbGVuKTsKKwkJCX0KKwkJCWVyciA9IGNvcHlfZnJvbV91c2VyKGthZGRyK29mZnNldCwgc3RyLCBieXRlc190b19jb3B5KTsKKwkJCWlmIChlcnIpIHsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlwb3MgKz0gYnl0ZXNfdG9fY29weTsKKwkJCXN0ciArPSBieXRlc190b19jb3B5OworCQkJbGVuIC09IGJ5dGVzX3RvX2NvcHk7CisJCX0KKwl9CisJcmV0ID0gMDsKK291dDoKKwlpZiAoa21hcHBlZF9wYWdlKQorCQlrdW5tYXAoa21hcHBlZF9wYWdlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTGlrZSBjb3B5X3N0cmluZ3MsIGJ1dCBnZXQgYXJndiBhbmQgaXRzIHZhbHVlcyBmcm9tIGtlcm5lbCBtZW1vcnkuCisgKi8KK2ludCBjb3B5X3N0cmluZ3Nfa2VybmVsKGludCBhcmdjLGNoYXIgKiogYXJndiwgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKK3sKKwlpbnQgcjsKKwltbV9zZWdtZW50X3Qgb2xkZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwlyID0gY29weV9zdHJpbmdzKGFyZ2MsIChjaGFyIF9fdXNlciAqIF9fdXNlciAqKWFyZ3YsIGJwcm0pOworCXNldF9mcyhvbGRmcyk7CisJcmV0dXJuIHI7Cit9CisKK0VYUE9SVF9TWU1CT0woY29weV9zdHJpbmdzX2tlcm5lbCk7CisKKyNpZmRlZiBDT05GSUdfTU1VCisvKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gbWFwIGluIGEgcGFnZSBpbnRvIGFuIGFkZHJlc3Mgc3BhY2U6IG5lZWRlZCBieQorICogZXhlY3ZlKCkgZm9yIHRoZSBpbml0aWFsIHN0YWNrIGFuZCBlbnZpcm9ubWVudCBwYWdlcy4KKyAqCisgKiB2bWEtPnZtX21tLT5tbWFwX3NlbSBpcyBoZWxkIGZvciB3cml0aW5nLgorICovCit2b2lkIGluc3RhbGxfYXJnX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLT52bV9tbTsKKwlwZ2RfdCAqIHBnZDsKKwlwdWRfdCAqIHB1ZDsKKwlwbWRfdCAqIHBtZDsKKwlwdGVfdCAqIHB0ZTsKKworCWlmICh1bmxpa2VseShhbm9uX3ZtYV9wcmVwYXJlKHZtYSkpKQorCQlnb3RvIG91dF9zaWc7CisKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyZXNzKTsKKworCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJcHVkID0gcHVkX2FsbG9jKG1tLCBwZ2QsIGFkZHJlc3MpOworCWlmICghcHVkKQorCQlnb3RvIG91dDsKKwlwbWQgPSBwbWRfYWxsb2MobW0sIHB1ZCwgYWRkcmVzcyk7CisJaWYgKCFwbWQpCisJCWdvdG8gb3V0OworCXB0ZSA9IHB0ZV9hbGxvY19tYXAobW0sIHBtZCwgYWRkcmVzcyk7CisJaWYgKCFwdGUpCisJCWdvdG8gb3V0OworCWlmICghcHRlX25vbmUoKnB0ZSkpIHsKKwkJcHRlX3VubWFwKHB0ZSk7CisJCWdvdG8gb3V0OworCX0KKwlpbmNfbW1fY291bnRlcihtbSwgcnNzKTsKKwlscnVfY2FjaGVfYWRkX2FjdGl2ZShwYWdlKTsKKwlzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdGUsIHB0ZV9ta2RpcnR5KHB0ZV9ta3dyaXRlKG1rX3B0ZSgKKwkJCQkJcGFnZSwgdm1hLT52bV9wYWdlX3Byb3QpKSkpOworCXBhZ2VfYWRkX2Fub25fcm1hcChwYWdlLCB2bWEsIGFkZHJlc3MpOworCXB0ZV91bm1hcChwdGUpOworCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKworCS8qIG5vIG5lZWQgZm9yIGZsdXNoX3RsYiAqLworCXJldHVybjsKK291dDoKKwlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CitvdXRfc2lnOgorCV9fZnJlZV9wYWdlKHBhZ2UpOworCWZvcmNlX3NpZyhTSUdLSUxMLCBjdXJyZW50KTsKK30KKworI2RlZmluZSBFWFRSQV9TVEFDS19WTV9QQUdFUwkyMAkvKiByYW5kb20gKi8KKworaW50IHNldHVwX2FyZ19wYWdlcyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLAorCQkgICAgdW5zaWduZWQgbG9uZyBzdGFja190b3AsCisJCSAgICBpbnQgZXhlY3V0YWJsZV9zdGFjaykKK3sKKwl1bnNpZ25lZCBsb25nIHN0YWNrX2Jhc2U7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICptcG50OworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisJaW50IGksIHJldDsKKwlsb25nIGFyZ19zaXplOworCisjaWZkZWYgQ09ORklHX1NUQUNLX0dST1dTVVAKKwkvKiBNb3ZlIHRoZSBhcmd1bWVudCBhbmQgZW52aXJvbm1lbnQgc3RyaW5ncyB0byB0aGUgYm90dG9tIG9mIHRoZQorCSAqIHN0YWNrIHNwYWNlLgorCSAqLworCWludCBvZmZzZXQsIGo7CisJY2hhciAqdG8sICpmcm9tOworCisJLyogU3RhcnQgYnkgc2hpZnRpbmcgYWxsIHRoZSBwYWdlcyBkb3duICovCisJaSA9IDA7CisJZm9yIChqID0gMDsgaiA8IE1BWF9BUkdfUEFHRVM7IGorKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGJwcm0tPnBhZ2Vbal07CisJCWlmICghcGFnZSkKKwkJCWNvbnRpbnVlOworCQlicHJtLT5wYWdlW2krK10gPSBwYWdlOworCX0KKworCS8qIE5vdyBtb3ZlIHRoZW0gd2l0aGluIHRoZWlyIHBhZ2VzICovCisJb2Zmc2V0ID0gYnBybS0+cCAlIFBBR0VfU0laRTsKKwl0byA9IGttYXAoYnBybS0+cGFnZVswXSk7CisJZm9yIChqID0gMTsgaiA8IGk7IGorKykgeworCQltZW1tb3ZlKHRvLCB0byArIG9mZnNldCwgUEFHRV9TSVpFIC0gb2Zmc2V0KTsKKwkJZnJvbSA9IGttYXAoYnBybS0+cGFnZVtqXSk7CisJCW1lbWNweSh0byArIFBBR0VfU0laRSAtIG9mZnNldCwgZnJvbSwgb2Zmc2V0KTsKKwkJa3VubWFwKGJwcm0tPnBhZ2VbaiAtIDFdKTsKKwkJdG8gPSBmcm9tOworCX0KKwltZW1tb3ZlKHRvLCB0byArIG9mZnNldCwgUEFHRV9TSVpFIC0gb2Zmc2V0KTsKKwlrdW5tYXAoYnBybS0+cGFnZVtqIC0gMV0pOworCisJLyogTGltaXQgc3RhY2sgc2l6ZSB0byAxR0IgKi8KKwlzdGFja19iYXNlID0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9TVEFDS10ucmxpbV9tYXg7CisJaWYgKHN0YWNrX2Jhc2UgPiAoMSA8PCAzMCkpCisJCXN0YWNrX2Jhc2UgPSAxIDw8IDMwOworCXN0YWNrX2Jhc2UgPSBQQUdFX0FMSUdOKHN0YWNrX3RvcCAtIHN0YWNrX2Jhc2UpOworCisJLyogQWRqdXN0IGJwcm0tPnAgdG8gcG9pbnQgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5ncy4gKi8KKwlicHJtLT5wID0gc3RhY2tfYmFzZSArIFBBR0VfU0laRSAqIGkgLSBvZmZzZXQ7CisKKwltbS0+YXJnX3N0YXJ0ID0gc3RhY2tfYmFzZTsKKwlhcmdfc2l6ZSA9IGkgPDwgUEFHRV9TSElGVDsKKworCS8qIHplcm8gcGFnZXMgdGhhdCB3ZXJlIGNvcGllZCBhYm92ZSAqLworCXdoaWxlIChpIDwgTUFYX0FSR19QQUdFUykKKwkJYnBybS0+cGFnZVtpKytdID0gTlVMTDsKKyNlbHNlCisJc3RhY2tfYmFzZSA9IGFyY2hfYWxpZ25fc3RhY2soc3RhY2tfdG9wIC0gTUFYX0FSR19QQUdFUypQQUdFX1NJWkUpOworCXN0YWNrX2Jhc2UgPSBQQUdFX0FMSUdOKHN0YWNrX2Jhc2UpOworCWJwcm0tPnAgKz0gc3RhY2tfYmFzZTsKKwltbS0+YXJnX3N0YXJ0ID0gYnBybS0+cDsKKwlhcmdfc2l6ZSA9IHN0YWNrX3RvcCAtIChQQUdFX01BU0sgJiAodW5zaWduZWQgbG9uZykgbW0tPmFyZ19zdGFydCk7CisjZW5kaWYKKworCWFyZ19zaXplICs9IEVYVFJBX1NUQUNLX1ZNX1BBR0VTICogUEFHRV9TSVpFOworCisJaWYgKGJwcm0tPmxvYWRlcikKKwkJYnBybS0+bG9hZGVyICs9IHN0YWNrX2Jhc2U7CisJYnBybS0+ZXhlYyArPSBzdGFja19iYXNlOworCisJbXBudCA9IGttZW1fY2FjaGVfYWxsb2Modm1fYXJlYV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIW1wbnQpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKHNlY3VyaXR5X3ZtX2Vub3VnaF9tZW1vcnkoYXJnX3NpemUgPj4gUEFHRV9TSElGVCkpIHsKKwkJa21lbV9jYWNoZV9mcmVlKHZtX2FyZWFfY2FjaGVwLCBtcG50KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KG1wbnQsIDAsIHNpemVvZigqbXBudCkpOworCisJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwl7CisJCW1wbnQtPnZtX21tID0gbW07CisjaWZkZWYgQ09ORklHX1NUQUNLX0dST1dTVVAKKwkJbXBudC0+dm1fc3RhcnQgPSBzdGFja19iYXNlOworCQltcG50LT52bV9lbmQgPSBzdGFja19iYXNlICsgYXJnX3NpemU7CisjZWxzZQorCQltcG50LT52bV9lbmQgPSBzdGFja190b3A7CisJCW1wbnQtPnZtX3N0YXJ0ID0gbXBudC0+dm1fZW5kIC0gYXJnX3NpemU7CisjZW5kaWYKKwkJLyogQWRqdXN0IHN0YWNrIGV4ZWN1dGUgcGVybWlzc2lvbnM7IGV4cGxpY2l0bHkgZW5hYmxlCisJCSAqIGZvciBFWFNUQUNLX0VOQUJMRV9YLCBkaXNhYmxlIGZvciBFWFNUQUNLX0RJU0FCTEVfWAorCQkgKiBhbmQgbGVhdmUgYWxvbmUgKGFyY2ggZGVmYXVsdCkgb3RoZXJ3aXNlLiAqLworCQlpZiAodW5saWtlbHkoZXhlY3V0YWJsZV9zdGFjayA9PSBFWFNUQUNLX0VOQUJMRV9YKSkKKwkJCW1wbnQtPnZtX2ZsYWdzID0gVk1fU1RBQ0tfRkxBR1MgfCAgVk1fRVhFQzsKKwkJZWxzZSBpZiAoZXhlY3V0YWJsZV9zdGFjayA9PSBFWFNUQUNLX0RJU0FCTEVfWCkKKwkJCW1wbnQtPnZtX2ZsYWdzID0gVk1fU1RBQ0tfRkxBR1MgJiB+Vk1fRVhFQzsKKwkJZWxzZQorCQkJbXBudC0+dm1fZmxhZ3MgPSBWTV9TVEFDS19GTEFHUzsKKwkJbXBudC0+dm1fZmxhZ3MgfD0gbW0tPmRlZl9mbGFnczsKKwkJbXBudC0+dm1fcGFnZV9wcm90ID0gcHJvdGVjdGlvbl9tYXBbbXBudC0+dm1fZmxhZ3MgJiAweDddOworCQlpZiAoKHJldCA9IGluc2VydF92bV9zdHJ1Y3QobW0sIG1wbnQpKSkgeworCQkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJCQlrbWVtX2NhY2hlX2ZyZWUodm1fYXJlYV9jYWNoZXAsIG1wbnQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQltbS0+c3RhY2tfdm0gPSBtbS0+dG90YWxfdm0gPSB2bWFfcGFnZXMobXBudCk7CisJfQorCisJZm9yIChpID0gMCA7IGkgPCBNQVhfQVJHX1BBR0VTIDsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gYnBybS0+cGFnZVtpXTsKKwkJaWYgKHBhZ2UpIHsKKwkJCWJwcm0tPnBhZ2VbaV0gPSBOVUxMOworCQkJaW5zdGFsbF9hcmdfcGFnZShtcG50LCBwYWdlLCBzdGFja19iYXNlKTsKKwkJfQorCQlzdGFja19iYXNlICs9IFBBR0VfU0laRTsKKwl9CisJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woc2V0dXBfYXJnX3BhZ2VzKTsKKworI2RlZmluZSBmcmVlX2FyZ19wYWdlcyhicHJtKSBkbyB7IH0gd2hpbGUgKDApCisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2FyZ19wYWdlcyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9BUkdfUEFHRVM7IGkrKykgeworCQlpZiAoYnBybS0+cGFnZVtpXSkKKwkJCV9fZnJlZV9wYWdlKGJwcm0tPnBhZ2VbaV0pOworCQlicHJtLT5wYWdlW2ldID0gTlVMTDsKKwl9Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfTU1VICovCisKK3N0cnVjdCBmaWxlICpvcGVuX2V4ZWMoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCBlcnI7CisJc3RydWN0IGZpbGUgKmZpbGU7CisKKwluZC5pbnRlbnQub3Blbi5mbGFncyA9IEZNT0RFX1JFQUQ7CisJZXJyID0gcGF0aF9sb29rdXAobmFtZSwgTE9PS1VQX0ZPTExPV3xMT09LVVBfT1BFTiwgJm5kKTsKKwlmaWxlID0gRVJSX1BUUihlcnIpOworCisJaWYgKCFlcnIpIHsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IG5kLmRlbnRyeS0+ZF9pbm9kZTsKKwkJZmlsZSA9IEVSUl9QVFIoLUVBQ0NFUyk7CisJCWlmICghKG5kLm1udC0+bW50X2ZsYWdzICYgTU5UX05PRVhFQykgJiYKKwkJICAgIFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWludCBlcnIgPSBwZXJtaXNzaW9uKGlub2RlLCBNQVlfRVhFQywgJm5kKTsKKwkJCWlmICghZXJyICYmICEoaW5vZGUtPmlfbW9kZSAmIDAxMTEpKQorCQkJCWVyciA9IC1FQUNDRVM7CisJCQlmaWxlID0gRVJSX1BUUihlcnIpOworCQkJaWYgKCFlcnIpIHsKKwkJCQlmaWxlID0gZGVudHJ5X29wZW4obmQuZGVudHJ5LCBuZC5tbnQsIE9fUkRPTkxZKTsKKwkJCQlpZiAoIUlTX0VSUihmaWxlKSkgeworCQkJCQllcnIgPSBkZW55X3dyaXRlX2FjY2VzcyhmaWxlKTsKKwkJCQkJaWYgKGVycikgeworCQkJCQkJZnB1dChmaWxlKTsKKwkJCQkJCWZpbGUgPSBFUlJfUFRSKGVycik7CisJCQkJCX0KKwkJCQl9CitvdXQ6CisJCQkJcmV0dXJuIGZpbGU7CisJCQl9CisJCX0KKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJfQorCWdvdG8gb3V0OworfQorCitFWFBPUlRfU1lNQk9MKG9wZW5fZXhlYyk7CisKK2ludCBrZXJuZWxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJY2hhciAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwltbV9zZWdtZW50X3Qgb2xkX2ZzOworCWxvZmZfdCBwb3MgPSBvZmZzZXQ7CisJaW50IHJlc3VsdDsKKworCW9sZF9mcyA9IGdldF9mcygpOworCXNldF9mcyhnZXRfZHMoKSk7CisJLyogVGhlIGNhc3QgdG8gYSB1c2VyIHBvaW50ZXIgaXMgdmFsaWQgZHVlIHRvIHRoZSBzZXRfZnMoKSAqLworCXJlc3VsdCA9IHZmc19yZWFkKGZpbGUsICh2b2lkIF9fdXNlciAqKWFkZHIsIGNvdW50LCAmcG9zKTsKKwlzZXRfZnMob2xkX2ZzKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitFWFBPUlRfU1lNQk9MKGtlcm5lbF9yZWFkKTsKKworc3RhdGljIGludCBleGVjX21tYXAoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisJc3RydWN0IG1tX3N0cnVjdCAqIG9sZF9tbSwgKmFjdGl2ZV9tbTsKKworCS8qIE5vdGlmeSBwYXJlbnQgdGhhdCB3ZSdyZSBubyBsb25nZXIgaW50ZXJlc3RlZCBpbiB0aGUgb2xkIFZNICovCisJdHNrID0gY3VycmVudDsKKwlvbGRfbW0gPSBjdXJyZW50LT5tbTsKKwltbV9yZWxlYXNlKHRzaywgb2xkX21tKTsKKworCWlmIChvbGRfbW0pIHsKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoYXQgaWYgdGhlcmUgaXMgYSBjb3JlIGR1bXAgaW4gcHJvZ3Jlc3MKKwkJICogZm9yIHRoZSBvbGQgbW0sIHdlIGdldCBvdXQgYW5kIGRpZSBpbnN0ZWFkIG9mIGdvaW5nCisJCSAqIHRocm91Z2ggd2l0aCB0aGUgZXhlYy4gIFdlIG11c3QgaG9sZCBtbWFwX3NlbSBhcm91bmQKKwkJICogY2hlY2tpbmcgY29yZV93YWl0ZXJzIGFuZCBjaGFuZ2luZyB0c2stPm1tLiAgVGhlCisJCSAqIGNvcmUtaW5kdWNpbmcgdGhyZWFkIHdpbGwgaW5jcmVtZW50IGNvcmVfd2FpdGVycyBmb3IKKwkJICogZWFjaCB0aHJlYWQgd2hvc2UgLT5tbSA9PSBvbGRfbW0uCisJCSAqLworCQlkb3duX3JlYWQoJm9sZF9tbS0+bW1hcF9zZW0pOworCQlpZiAodW5saWtlbHkob2xkX21tLT5jb3JlX3dhaXRlcnMpKSB7CisJCQl1cF9yZWFkKCZvbGRfbW0tPm1tYXBfc2VtKTsKKwkJCXJldHVybiAtRUlOVFI7CisJCX0KKwl9CisJdGFza19sb2NrKHRzayk7CisJYWN0aXZlX21tID0gdHNrLT5hY3RpdmVfbW07CisJdHNrLT5tbSA9IG1tOworCXRzay0+YWN0aXZlX21tID0gbW07CisJYWN0aXZhdGVfbW0oYWN0aXZlX21tLCBtbSk7CisJdGFza191bmxvY2sodHNrKTsKKwlhcmNoX3BpY2tfbW1hcF9sYXlvdXQobW0pOworCWlmIChvbGRfbW0pIHsKKwkJdXBfcmVhZCgmb2xkX21tLT5tbWFwX3NlbSk7CisJCWlmIChhY3RpdmVfbW0gIT0gb2xkX21tKSBCVUcoKTsKKwkJbW1wdXQob2xkX21tKTsKKwkJcmV0dXJuIDA7CisJfQorCW1tZHJvcChhY3RpdmVfbW0pOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoZSBjdXJyZW50IHByb2Nlc3MgaGFzIGl0cyBvd24gc2lnbmFsIHRhYmxlLAorICogc28gdGhhdCBmbHVzaF9zaWduYWxfaGFuZGxlcnMgY2FuIGxhdGVyIHJlc2V0IHRoZSBoYW5kbGVycyB3aXRob3V0CisgKiBkaXN0dXJiaW5nIG90aGVyIHByb2Nlc3Nlcy4gIChPdGhlciBwcm9jZXNzZXMgbWlnaHQgc2hhcmUgdGhlIHNpZ25hbAorICogdGFibGUgdmlhIHRoZSBDTE9ORV9TSUdIQU5EIG9wdGlvbiB0byBjbG9uZSgpLikKKyAqLworc3RhdGljIGlubGluZSBpbnQgZGVfdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWcgPSB0c2stPnNpZ25hbDsKKwlzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QgKm5ld3NpZ2hhbmQsICpvbGRzaWdoYW5kID0gdHNrLT5zaWdoYW5kOworCXNwaW5sb2NrX3QgKmxvY2sgPSAmb2xkc2lnaGFuZC0+c2lnbG9jazsKKwlpbnQgY291bnQ7CisKKwkvKgorCSAqIElmIHdlIGRvbid0IHNoYXJlIHNpZ2hhbmRsZXJzLCB0aGVuIHdlIGFyZW4ndCBzaGFyaW5nIGFueXRoaW5nCisJICogYW5kIHdlIGNhbiBqdXN0IHJlLXVzZSBpdCBhbGwuCisJICovCisJaWYgKGF0b21pY19yZWFkKCZvbGRzaWdoYW5kLT5jb3VudCkgPD0gMSkgeworCQlCVUdfT04oYXRvbWljX3JlYWQoJnNpZy0+Y291bnQpICE9IDEpOworCQlleGl0X2l0aW1lcnMoc2lnKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbmV3c2lnaGFuZCA9IGttZW1fY2FjaGVfYWxsb2Moc2lnaGFuZF9jYWNoZXAsIEdGUF9LRVJORUwpOworCWlmICghbmV3c2lnaGFuZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAodGhyZWFkX2dyb3VwX2VtcHR5KGN1cnJlbnQpKQorCQlnb3RvIG5vX3RocmVhZF9ncm91cDsKKworCS8qCisJICogS2lsbCBhbGwgb3RoZXIgdGhyZWFkcyBpbiB0aGUgdGhyZWFkIGdyb3VwLgorCSAqIFdlIG11c3QgaG9sZCB0YXNrbGlzdF9sb2NrIHRvIGNhbGwgemFwX290aGVyX3RocmVhZHMuCisJICovCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKGxvY2spOworCWlmIChzaWctPmZsYWdzICYgU0lHTkFMX0dST1VQX0VYSVQpIHsKKwkJLyoKKwkJICogQW5vdGhlciBncm91cCBhY3Rpb24gaW4gcHJvZ3Jlc3MsIGp1c3QKKwkJICogcmV0dXJuIHNvIHRoYXQgdGhlIHNpZ25hbCBpcyBwcm9jZXNzZWQuCisJCSAqLworCQlzcGluX3VubG9ja19pcnEobG9jayk7CisJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJa21lbV9jYWNoZV9mcmVlKHNpZ2hhbmRfY2FjaGVwLCBuZXdzaWdoYW5kKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCXphcF9vdGhlcl90aHJlYWRzKGN1cnJlbnQpOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKworCS8qCisJICogQWNjb3VudCBmb3IgdGhlIHRocmVhZCBncm91cCBsZWFkZXIgaGFuZ2luZyBhcm91bmQ6CisJICovCisJY291bnQgPSAyOworCWlmICh0aHJlYWRfZ3JvdXBfbGVhZGVyKGN1cnJlbnQpKQorCQljb3VudCA9IDE7CisJd2hpbGUgKGF0b21pY19yZWFkKCZzaWctPmNvdW50KSA+IGNvdW50KSB7CisJCXNpZy0+Z3JvdXBfZXhpdF90YXNrID0gY3VycmVudDsKKwkJc2lnLT5ub3RpZnlfY291bnQgPSBjb3VudDsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycShsb2NrKTsKKwkJc2NoZWR1bGUoKTsKKwkJc3Bpbl9sb2NrX2lycShsb2NrKTsKKwl9CisJc2lnLT5ncm91cF9leGl0X3Rhc2sgPSBOVUxMOworCXNpZy0+bm90aWZ5X2NvdW50ID0gMDsKKwlzcGluX3VubG9ja19pcnEobG9jayk7CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgYWxsIG90aGVyIHRocmVhZHMgaGF2ZSBleGl0ZWQsIGFsbCB3ZSBoYXZlIHRvCisJICogZG8gaXMgdG8gd2FpdCBmb3IgdGhlIHRocmVhZCBncm91cCBsZWFkZXIgdG8gYmVjb21lIGluYWN0aXZlLAorCSAqIGFuZCB0byBhc3N1bWUgaXRzIFBJRDoKKwkgKi8KKwlpZiAoIXRocmVhZF9ncm91cF9sZWFkZXIoY3VycmVudCkpIHsKKwkJc3RydWN0IHRhc2tfc3RydWN0ICpsZWFkZXIgPSBjdXJyZW50LT5ncm91cF9sZWFkZXIsICpwYXJlbnQ7CisJCXN0cnVjdCBkZW50cnkgKnByb2NfZGVudHJ5MSwgKnByb2NfZGVudHJ5MjsKKwkJdW5zaWduZWQgbG9uZyBleGl0X3N0YXRlLCBwdHJhY2U7CisKKwkJLyoKKwkJICogV2FpdCBmb3IgdGhlIHRocmVhZCBncm91cCBsZWFkZXIgdG8gYmUgYSB6b21iaWUuCisJCSAqIEl0IHNob3VsZCBhbHJlYWR5IGJlIHpvbWJpZSBhdCB0aGlzIHBvaW50LCBtb3N0CisJCSAqIG9mIHRoZSB0aW1lLgorCQkgKi8KKwkJd2hpbGUgKGxlYWRlci0+ZXhpdF9zdGF0ZSAhPSBFWElUX1pPTUJJRSkKKwkJCXlpZWxkKCk7CisKKwkJc3Bpbl9sb2NrKCZsZWFkZXItPnByb2NfbG9jayk7CisJCXNwaW5fbG9jaygmY3VycmVudC0+cHJvY19sb2NrKTsKKwkJcHJvY19kZW50cnkxID0gcHJvY19waWRfdW5oYXNoKGN1cnJlbnQpOworCQlwcm9jX2RlbnRyeTIgPSBwcm9jX3BpZF91bmhhc2gobGVhZGVyKTsKKwkJd3JpdGVfbG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOworCisJCWlmIChsZWFkZXItPnRnaWQgIT0gY3VycmVudC0+dGdpZCkKKwkJCUJVRygpOworCQlpZiAoY3VycmVudC0+cGlkID09IGN1cnJlbnQtPnRnaWQpCisJCQlCVUcoKTsKKwkJLyoKKwkJICogQW4gZXhlYygpIHN0YXJ0cyBhIG5ldyB0aHJlYWQgZ3JvdXAgd2l0aCB0aGUKKwkJICogVEdJRCBvZiB0aGUgcHJldmlvdXMgdGhyZWFkIGdyb3VwLiBSZWhhc2ggdGhlCisJCSAqIHR3byB0aHJlYWRzIHdpdGggYSBzd2l0Y2hlZCBQSUQsIGFuZCByZWxlYXNlCisJCSAqIHRoZSBmb3JtZXIgdGhyZWFkIGdyb3VwIGxlYWRlcjoKKwkJICovCisJCXB0cmFjZSA9IGxlYWRlci0+cHRyYWNlOworCQlwYXJlbnQgPSBsZWFkZXItPnBhcmVudDsKKwkJaWYgKHVubGlrZWx5KHB0cmFjZSkgJiYgdW5saWtlbHkocGFyZW50ID09IGN1cnJlbnQpKSB7CisJCQkvKgorCQkJICogSm9rZXIgd2FzIHB0cmFjaW5nIGhpcyBvd24gZ3JvdXAgbGVhZGVyLAorCQkJICogYW5kIG5vdyBoZSB3YW50cyB0byBiZSBoaXMgb3duIHBhcmVudCEKKwkJCSAqIFdlIGNhbid0IGhhdmUgdGhhdC4KKwkJCSAqLworCQkJcHRyYWNlID0gMDsKKwkJfQorCisJCXB0cmFjZV91bmxpbmsoY3VycmVudCk7CisJCXB0cmFjZV91bmxpbmsobGVhZGVyKTsKKwkJcmVtb3ZlX3BhcmVudChjdXJyZW50KTsKKwkJcmVtb3ZlX3BhcmVudChsZWFkZXIpOworCisJCXN3aXRjaF9leGVjX3BpZHMobGVhZGVyLCBjdXJyZW50KTsKKworCQljdXJyZW50LT5wYXJlbnQgPSBjdXJyZW50LT5yZWFsX3BhcmVudCA9IGxlYWRlci0+cmVhbF9wYXJlbnQ7CisJCWxlYWRlci0+cGFyZW50ID0gbGVhZGVyLT5yZWFsX3BhcmVudCA9IGNoaWxkX3JlYXBlcjsKKwkJY3VycmVudC0+Z3JvdXBfbGVhZGVyID0gY3VycmVudDsKKwkJbGVhZGVyLT5ncm91cF9sZWFkZXIgPSBsZWFkZXI7CisKKwkJYWRkX3BhcmVudChjdXJyZW50LCBjdXJyZW50LT5wYXJlbnQpOworCQlhZGRfcGFyZW50KGxlYWRlciwgbGVhZGVyLT5wYXJlbnQpOworCQlpZiAocHRyYWNlKSB7CisJCQljdXJyZW50LT5wdHJhY2UgPSBwdHJhY2U7CisJCQlfX3B0cmFjZV9saW5rKGN1cnJlbnQsIHBhcmVudCk7CisJCX0KKworCQlsaXN0X2RlbCgmY3VycmVudC0+dGFza3MpOworCQlsaXN0X2FkZF90YWlsKCZjdXJyZW50LT50YXNrcywgJmluaXRfdGFzay50YXNrcyk7CisJCWN1cnJlbnQtPmV4aXRfc2lnbmFsID0gU0lHQ0hMRDsKKwkJZXhpdF9zdGF0ZSA9IGxlYWRlci0+ZXhpdF9zdGF0ZTsKKworCQl3cml0ZV91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmxlYWRlci0+cHJvY19sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmN1cnJlbnQtPnByb2NfbG9jayk7CisJCXByb2NfcGlkX2ZsdXNoKHByb2NfZGVudHJ5MSk7CisJCXByb2NfcGlkX2ZsdXNoKHByb2NfZGVudHJ5Mik7CisKKwkJaWYgKGV4aXRfc3RhdGUgIT0gRVhJVF9aT01CSUUpCisJCQlCVUcoKTsKKwkJcmVsZWFzZV90YXNrKGxlYWRlcik7CisgICAgICAgIH0KKworCS8qCisJICogTm93IHRoZXJlIGFyZSByZWFsbHkgbm8gb3RoZXIgdGhyZWFkcyBhdCBhbGwsCisJICogc28gaXQncyBzYWZlIHRvIHN0b3AgdGVsbGluZyB0aGVtIHRvIGtpbGwgdGhlbXNlbHZlcy4KKwkgKi8KKwlzaWctPmZsYWdzID0gMDsKKworbm9fdGhyZWFkX2dyb3VwOgorCUJVR19PTihhdG9taWNfcmVhZCgmc2lnLT5jb3VudCkgIT0gMSk7CisJZXhpdF9pdGltZXJzKHNpZyk7CisKKwlpZiAoYXRvbWljX3JlYWQoJm9sZHNpZ2hhbmQtPmNvdW50KSA9PSAxKSB7CisJCS8qCisJCSAqIE5vdyB0aGF0IHdlIG51a2VkIHRoZSByZXN0IG9mIHRoZSB0aHJlYWQgZ3JvdXAsCisJCSAqIGl0IHR1cm5zIG91dCB3ZSBhcmUgbm90IHNoYXJpbmcgc2lnaGFuZCBhbnkgbW9yZSBlaXRoZXIuCisJCSAqIFNvIHdlIGNhbiBqdXN0IGtlZXAgaXQuCisJCSAqLworCQlrbWVtX2NhY2hlX2ZyZWUoc2lnaGFuZF9jYWNoZXAsIG5ld3NpZ2hhbmQpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIE1vdmUgb3VyIHN0YXRlIG92ZXIgdG8gbmV3c2lnaGFuZCBhbmQgc3dpdGNoIGl0IGluLgorCQkgKi8KKwkJc3Bpbl9sb2NrX2luaXQoJm5ld3NpZ2hhbmQtPnNpZ2xvY2spOworCQlhdG9taWNfc2V0KCZuZXdzaWdoYW5kLT5jb3VudCwgMSk7CisJCW1lbWNweShuZXdzaWdoYW5kLT5hY3Rpb24sIG9sZHNpZ2hhbmQtPmFjdGlvbiwKKwkJICAgICAgIHNpemVvZihuZXdzaWdoYW5kLT5hY3Rpb24pKTsKKworCQl3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CisJCXNwaW5fbG9jaygmb2xkc2lnaGFuZC0+c2lnbG9jayk7CisJCXNwaW5fbG9jaygmbmV3c2lnaGFuZC0+c2lnbG9jayk7CisKKwkJY3VycmVudC0+c2lnaGFuZCA9IG5ld3NpZ2hhbmQ7CisJCXJlY2FsY19zaWdwZW5kaW5nKCk7CisKKwkJc3Bpbl91bmxvY2soJm5ld3NpZ2hhbmQtPnNpZ2xvY2spOworCQlzcGluX3VubG9jaygmb2xkc2lnaGFuZC0+c2lnbG9jayk7CisJCXdyaXRlX3VubG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOworCisJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZvbGRzaWdoYW5kLT5jb3VudCkpCisJCQlrbWVtX2NhY2hlX2ZyZWUoc2lnaGFuZF9jYWNoZXAsIG9sZHNpZ2hhbmQpOworCX0KKworCWlmICghdGhyZWFkX2dyb3VwX2VtcHR5KGN1cnJlbnQpKQorCQlCVUcoKTsKKwlpZiAoIXRocmVhZF9ncm91cF9sZWFkZXIoY3VycmVudCkpCisJCUJVRygpOworCXJldHVybiAwOworfQorCQorLyoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBmbHVzaGVzIG91dCBhbGwgdHJhY2VzIG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyBleGVjdXRhYmxlCisgKiBzbyB0aGF0IGEgbmV3IG9uZSBjYW4gYmUgc3RhcnRlZAorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9vbGRfZmlsZXMoc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzKQoreworCWxvbmcgaiA9IC0xOworCisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlmb3IgKDs7KSB7CisJCXVuc2lnbmVkIGxvbmcgc2V0LCBpOworCisJCWorKzsKKwkJaSA9IGogKiBfX05GREJJVFM7CisJCWlmIChpID49IGZpbGVzLT5tYXhfZmRzIHx8IGkgPj0gZmlsZXMtPm1heF9mZHNldCkKKwkJCWJyZWFrOworCQlzZXQgPSBmaWxlcy0+Y2xvc2Vfb25fZXhlYy0+ZmRzX2JpdHNbal07CisJCWlmICghc2V0KQorCQkJY29udGludWU7CisJCWZpbGVzLT5jbG9zZV9vbl9leGVjLT5mZHNfYml0c1tqXSA9IDA7CisJCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJZm9yICggOyBzZXQgOyBpKyssc2V0ID4+PSAxKSB7CisJCQlpZiAoc2V0ICYgMSkgeworCQkJCXN5c19jbG9zZShpKTsKKwkJCX0KKwkJfQorCQlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCisJfQorCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKK30KKwordm9pZCBnZXRfdGFza19jb21tKGNoYXIgKmJ1Ziwgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJLyogYnVmIG11c3QgYmUgYXQgbGVhc3Qgc2l6ZW9mKHRzay0+Y29tbSkgaW4gc2l6ZSAqLworCXRhc2tfbG9jayh0c2spOworCXN0cm5jcHkoYnVmLCB0c2stPmNvbW0sIHNpemVvZih0c2stPmNvbW0pKTsKKwl0YXNrX3VubG9jayh0c2spOworfQorCit2b2lkIHNldF90YXNrX2NvbW0oc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGNoYXIgKmJ1ZikKK3sKKwl0YXNrX2xvY2sodHNrKTsKKwlzdHJsY3B5KHRzay0+Y29tbSwgYnVmLCBzaXplb2YodHNrLT5jb21tKSk7CisJdGFza191bmxvY2sodHNrKTsKK30KKworaW50IGZsdXNoX29sZF9leGVjKHN0cnVjdCBsaW51eF9iaW5wcm0gKiBicHJtKQoreworCWNoYXIgKiBuYW1lOworCWludCBpLCBjaCwgcmV0dmFsOworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzOworCWNoYXIgdGNvbW1bc2l6ZW9mKGN1cnJlbnQtPmNvbW0pXTsKKworCS8qCisJICogTWFrZSBzdXJlIHdlIGhhdmUgYSBwcml2YXRlIHNpZ25hbCB0YWJsZSBhbmQgdGhhdAorCSAqIHdlIGFyZSB1bmFzc29jaWF0ZWQgZnJvbSB0aGUgcHJldmlvdXMgdGhyZWFkIGdyb3VwLgorCSAqLworCXJldHZhbCA9IGRlX3RocmVhZChjdXJyZW50KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKworCS8qCisJICogTWFrZSBzdXJlIHdlIGhhdmUgcHJpdmF0ZSBmaWxlIGhhbmRsZXMuIEFzayB0aGUKKwkgKiBmb3JrIGhlbHBlciB0byBkbyB0aGUgd29yayBmb3IgdXMgYW5kIHRoZSBleGl0CisJICogaGVscGVyIHRvIGRvIHRoZSBjbGVhbnVwIG9mIHRoZSBvbGQgb25lLgorCSAqLworCWZpbGVzID0gY3VycmVudC0+ZmlsZXM7CQkvKiByZWZjb3VudGVkIHNvIHNhZmUgdG8gaG9sZCAqLworCXJldHZhbCA9IHVuc2hhcmVfZmlsZXMoKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKwkvKgorCSAqIFJlbGVhc2UgYWxsIG9mIHRoZSBvbGQgbW1hcCBzdHVmZgorCSAqLworCXJldHZhbCA9IGV4ZWNfbW1hcChicHJtLT5tbSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBtbWFwX2ZhaWxlZDsKKworCWJwcm0tPm1tID0gTlVMTDsJCS8qIFdlJ3JlIHVzaW5nIGl0IG5vdyAqLworCisJLyogVGhpcyBpcyB0aGUgcG9pbnQgb2Ygbm8gcmV0dXJuICovCisJc3RlYWxfbG9ja3MoZmlsZXMpOworCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOworCisJY3VycmVudC0+c2FzX3NzX3NwID0gY3VycmVudC0+c2FzX3NzX3NpemUgPSAwOworCisJaWYgKGN1cnJlbnQtPmV1aWQgPT0gY3VycmVudC0+dWlkICYmIGN1cnJlbnQtPmVnaWQgPT0gY3VycmVudC0+Z2lkKQorCQljdXJyZW50LT5tbS0+ZHVtcGFibGUgPSAxOworCW5hbWUgPSBicHJtLT5maWxlbmFtZTsKKwlmb3IgKGk9MDsgKGNoID0gKihuYW1lKyspKSAhPSAnXDAnOykgeworCQlpZiAoY2ggPT0gJy8nKQorCQkJaSA9IDA7CisJCWVsc2UKKwkJCWlmIChpIDwgKHNpemVvZih0Y29tbSkgLSAxKSkKKwkJCQl0Y29tbVtpKytdID0gY2g7CisJfQorCXRjb21tW2ldID0gJ1wwJzsKKwlzZXRfdGFza19jb21tKGN1cnJlbnQsIHRjb21tKTsKKworCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9SQU5ET01JWkU7CisJZmx1c2hfdGhyZWFkKCk7CisKKwlpZiAoYnBybS0+ZV91aWQgIT0gY3VycmVudC0+ZXVpZCB8fCBicHJtLT5lX2dpZCAhPSBjdXJyZW50LT5lZ2lkIHx8IAorCSAgICBwZXJtaXNzaW9uKGJwcm0tPmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLE1BWV9SRUFELCBOVUxMKSB8fAorCSAgICAoYnBybS0+aW50ZXJwX2ZsYWdzICYgQklOUFJNX0ZMQUdTX0VORk9SQ0VfTk9ORFVNUCkpIHsKKwkJc3VpZF9rZXlzKGN1cnJlbnQpOworCQljdXJyZW50LT5tbS0+ZHVtcGFibGUgPSAwOworCX0KKworCS8qIEFuIGV4ZWMgY2hhbmdlcyBvdXIgZG9tYWluLiBXZSBhcmUgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIHRocmVhZAorCSAgIGdyb3VwICovCisKKwljdXJyZW50LT5zZWxmX2V4ZWNfaWQrKzsKKwkJCQorCWZsdXNoX3NpZ25hbF9oYW5kbGVycyhjdXJyZW50LCAwKTsKKwlmbHVzaF9vbGRfZmlsZXMoY3VycmVudC0+ZmlsZXMpOworCisJcmV0dXJuIDA7CisKK21tYXBfZmFpbGVkOgorCXB1dF9maWxlc19zdHJ1Y3QoY3VycmVudC0+ZmlsZXMpOworCWN1cnJlbnQtPmZpbGVzID0gZmlsZXM7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworRVhQT1JUX1NZTUJPTChmbHVzaF9vbGRfZXhlYyk7CisKKy8qIAorICogRmlsbCB0aGUgYmlucHJtIHN0cnVjdHVyZSBmcm9tIHRoZSBpbm9kZS4gCisgKiBDaGVjayBwZXJtaXNzaW9ucywgdGhlbiByZWFkIHRoZSBmaXJzdCAxMjggKEJJTlBSTV9CVUZfU0laRSkgYnl0ZXMKKyAqLworaW50IHByZXBhcmVfYmlucHJtKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCit7CisJaW50IG1vZGU7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBicHJtLT5maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgcmV0dmFsOworCisJbW9kZSA9IGlub2RlLT5pX21vZGU7CisJLyoKKwkgKiBDaGVjayBleGVjdXRlIHBlcm1zIGFnYWluIC0gaWYgdGhlIGNhbGxlciBoYXMgQ0FQX0RBQ19PVkVSUklERSwKKwkgKiBnZW5lcmljX3Blcm1pc3Npb24gbGV0cyBhIG5vbi1leGVjdXRhYmxlIHRocm91Z2gKKwkgKi8KKwlpZiAoIShtb2RlICYgMDExMSkpCS8qIHdpdGggYXQgbGVhc3QgX29uZV8gZXhlY3V0ZSBiaXQgc2V0ICovCisJCXJldHVybiAtRUFDQ0VTOworCWlmIChicHJtLT5maWxlLT5mX29wID09IE5VTEwpCisJCXJldHVybiAtRUFDQ0VTOworCisJYnBybS0+ZV91aWQgPSBjdXJyZW50LT5ldWlkOworCWJwcm0tPmVfZ2lkID0gY3VycmVudC0+ZWdpZDsKKworCWlmKCEoYnBybS0+ZmlsZS0+Zl92ZnNtbnQtPm1udF9mbGFncyAmIE1OVF9OT1NVSUQpKSB7CisJCS8qIFNldC11aWQ/ICovCisJCWlmIChtb2RlICYgU19JU1VJRCkgeworCQkJY3VycmVudC0+cGVyc29uYWxpdHkgJj0gflBFUl9DTEVBUl9PTl9TRVRJRDsKKwkJCWJwcm0tPmVfdWlkID0gaW5vZGUtPmlfdWlkOworCQl9CisKKwkJLyogU2V0LWdpZD8gKi8KKwkJLyoKKwkJICogSWYgc2V0Z2lkIGlzIHNldCBidXQgbm8gZ3JvdXAgZXhlY3V0ZSBiaXQgdGhlbiB0aGlzCisJCSAqIGlzIGEgY2FuZGlkYXRlIGZvciBtYW5kYXRvcnkgbG9ja2luZywgbm90IGEgc2V0Z2lkCisJCSAqIGV4ZWN1dGFibGUuCisJCSAqLworCQlpZiAoKG1vZGUgJiAoU19JU0dJRCB8IFNfSVhHUlApKSA9PSAoU19JU0dJRCB8IFNfSVhHUlApKSB7CisJCQljdXJyZW50LT5wZXJzb25hbGl0eSAmPSB+UEVSX0NMRUFSX09OX1NFVElEOworCQkJYnBybS0+ZV9naWQgPSBpbm9kZS0+aV9naWQ7CisJCX0KKwl9CisKKwkvKiBmaWxsIGluIGJpbnBybSBzZWN1cml0eSBibG9iICovCisJcmV0dmFsID0gc2VjdXJpdHlfYnBybV9zZXQoYnBybSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCW1lbXNldChicHJtLT5idWYsMCxCSU5QUk1fQlVGX1NJWkUpOworCXJldHVybiBrZXJuZWxfcmVhZChicHJtLT5maWxlLDAsYnBybS0+YnVmLEJJTlBSTV9CVUZfU0laRSk7Cit9CisKK0VYUE9SVF9TWU1CT0wocHJlcGFyZV9iaW5wcm0pOworCitzdGF0aWMgaW5saW5lIGludCB1bnNhZmVfZXhlYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJaW50IHVuc2FmZSA9IDA7CisJaWYgKHAtPnB0cmFjZSAmIFBUX1BUUkFDRUQpIHsKKwkJaWYgKHAtPnB0cmFjZSAmIFBUX1BUUkFDRV9DQVApCisJCQl1bnNhZmUgfD0gTFNNX1VOU0FGRV9QVFJBQ0VfQ0FQOworCQllbHNlCisJCQl1bnNhZmUgfD0gTFNNX1VOU0FGRV9QVFJBQ0U7CisJfQorCWlmIChhdG9taWNfcmVhZCgmcC0+ZnMtPmNvdW50KSA+IDEgfHwKKwkgICAgYXRvbWljX3JlYWQoJnAtPmZpbGVzLT5jb3VudCkgPiAxIHx8CisJICAgIGF0b21pY19yZWFkKCZwLT5zaWdoYW5kLT5jb3VudCkgPiAxKQorCQl1bnNhZmUgfD0gTFNNX1VOU0FGRV9TSEFSRTsKKworCXJldHVybiB1bnNhZmU7Cit9CisKK3ZvaWQgY29tcHV0ZV9jcmVkcyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQoreworCWludCB1bnNhZmU7CisKKwlpZiAoYnBybS0+ZV91aWQgIT0gY3VycmVudC0+dWlkKQorCQlzdWlkX2tleXMoY3VycmVudCk7CisJZXhlY19rZXlzKGN1cnJlbnQpOworCisJdGFza19sb2NrKGN1cnJlbnQpOworCXVuc2FmZSA9IHVuc2FmZV9leGVjKGN1cnJlbnQpOworCXNlY3VyaXR5X2Jwcm1fYXBwbHlfY3JlZHMoYnBybSwgdW5zYWZlKTsKKwl0YXNrX3VubG9jayhjdXJyZW50KTsKKwlzZWN1cml0eV9icHJtX3Bvc3RfYXBwbHlfY3JlZHMoYnBybSk7Cit9CisKK0VYUE9SVF9TWU1CT0woY29tcHV0ZV9jcmVkcyk7CisKK3ZvaWQgcmVtb3ZlX2FyZ196ZXJvKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCit7CisJaWYgKGJwcm0tPmFyZ2MpIHsKKwkJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJCWNoYXIgKiBrYWRkcjsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkJb2Zmc2V0ID0gYnBybS0+cCAlIFBBR0VfU0laRTsKKwkJZ290byBpbnNpZGU7CisKKwkJd2hpbGUgKGJwcm0tPnArKywgKihrYWRkcitvZmZzZXQrKykpIHsKKwkJCWlmIChvZmZzZXQgIT0gUEFHRV9TSVpFKQorCQkJCWNvbnRpbnVlOworCQkJb2Zmc2V0ID0gMDsKKwkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKK2luc2lkZToKKwkJCXBhZ2UgPSBicHJtLT5wYWdlW2Jwcm0tPnAvUEFHRV9TSVpFXTsKKwkJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQl9CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJYnBybS0+YXJnYy0tOworCX0KK30KKworRVhQT1JUX1NZTUJPTChyZW1vdmVfYXJnX3plcm8pOworCisvKgorICogY3ljbGUgdGhlIGxpc3Qgb2YgYmluYXJ5IGZvcm1hdHMgaGFuZGxlciwgdW50aWwgb25lIHJlY29nbml6ZXMgdGhlIGltYWdlCisgKi8KK2ludCBzZWFyY2hfYmluYXJ5X2hhbmRsZXIoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSxzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgdHJ5LHJldHZhbDsKKwlzdHJ1Y3QgbGludXhfYmluZm10ICpmbXQ7CisjaWZkZWYgX19hbHBoYV9fCisJLyogaGFuZGxlIC9zYmluL2xvYWRlci4uICovCisJeworCSAgICBzdHJ1Y3QgZXhlYyAqIGVoID0gKHN0cnVjdCBleGVjICopIGJwcm0tPmJ1ZjsKKworCSAgICBpZiAoIWJwcm0tPmxvYWRlciAmJiBlaC0+ZmguZl9tYWdpYyA9PSAweDE4MyAmJgorCQkoZWgtPmZoLmZfZmxhZ3MgJiAweDMwMDApID09IDB4MzAwMCkKKwkgICAgeworCQlzdHJ1Y3QgZmlsZSAqIGZpbGU7CisJCXVuc2lnbmVkIGxvbmcgbG9hZGVyOworCisJCWFsbG93X3dyaXRlX2FjY2VzcyhicHJtLT5maWxlKTsKKwkJZnB1dChicHJtLT5maWxlKTsKKwkJYnBybS0+ZmlsZSA9IE5VTEw7CisKKwkgICAgICAgIGxvYWRlciA9IFBBR0VfU0laRSpNQVhfQVJHX1BBR0VTLXNpemVvZih2b2lkICopOworCisJCWZpbGUgPSBvcGVuX2V4ZWMoIi9zYmluL2xvYWRlciIpOworCQlyZXR2YWwgPSBQVFJfRVJSKGZpbGUpOworCQlpZiAoSVNfRVJSKGZpbGUpKQorCQkJcmV0dXJuIHJldHZhbDsKKworCQkvKiBSZW1lbWJlciBpZiB0aGUgYXBwbGljYXRpb24gaXMgVEFTTy4gICovCisJCWJwcm0tPnNoX2JhbmcgPSBlaC0+YWguZW50cnkgPCAweDEwMDAwMDAwMFVMOworCisJCWJwcm0tPmZpbGUgPSBmaWxlOworCQlicHJtLT5sb2FkZXIgPSBsb2FkZXI7CisJCXJldHZhbCA9IHByZXBhcmVfYmlucHJtKGJwcm0pOworCQlpZiAocmV0dmFsPDApCisJCQlyZXR1cm4gcmV0dmFsOworCQkvKiBzaG91bGQgY2FsbCBzZWFyY2hfYmluYXJ5X2hhbmRsZXIgcmVjdXJzaXZlbHkgaGVyZSwKKwkJICAgYnV0IGl0IGRvZXMgbm90IG1hdHRlciAqLworCSAgICB9CisJfQorI2VuZGlmCisJcmV0dmFsID0gc2VjdXJpdHlfYnBybV9jaGVjayhicHJtKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJLyoga2VybmVsIG1vZHVsZSBsb2FkZXIgZml4dXAgKi8KKwkvKiBzbyB3ZSBkb24ndCB0cnkgdG8gbG9hZCBydW4gbW9kcHJvYmUgaW4ga2VybmVsIHNwYWNlLiAqLworCXNldF9mcyhVU0VSX0RTKTsKKwlyZXR2YWwgPSAtRU5PRU5UOworCWZvciAodHJ5PTA7IHRyeTwyOyB0cnkrKykgeworCQlyZWFkX2xvY2soJmJpbmZtdF9sb2NrKTsKKwkJZm9yIChmbXQgPSBmb3JtYXRzIDsgZm10IDsgZm10ID0gZm10LT5uZXh0KSB7CisJCQlpbnQgKCpmbikoc3RydWN0IGxpbnV4X2JpbnBybSAqLCBzdHJ1Y3QgcHRfcmVncyAqKSA9IGZtdC0+bG9hZF9iaW5hcnk7CisJCQlpZiAoIWZuKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCF0cnlfbW9kdWxlX2dldChmbXQtPm1vZHVsZSkpCisJCQkJY29udGludWU7CisJCQlyZWFkX3VubG9jaygmYmluZm10X2xvY2spOworCQkJcmV0dmFsID0gZm4oYnBybSwgcmVncyk7CisJCQlpZiAocmV0dmFsID49IDApIHsKKwkJCQlwdXRfYmluZm10KGZtdCk7CisJCQkJYWxsb3dfd3JpdGVfYWNjZXNzKGJwcm0tPmZpbGUpOworCQkJCWlmIChicHJtLT5maWxlKQorCQkJCQlmcHV0KGJwcm0tPmZpbGUpOworCQkJCWJwcm0tPmZpbGUgPSBOVUxMOworCQkJCWN1cnJlbnQtPmRpZF9leGVjID0gMTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQorCQkJcmVhZF9sb2NrKCZiaW5mbXRfbG9jayk7CisJCQlwdXRfYmluZm10KGZtdCk7CisJCQlpZiAocmV0dmFsICE9IC1FTk9FWEVDIHx8IGJwcm0tPm1tID09IE5VTEwpCisJCQkJYnJlYWs7CisJCQlpZiAoIWJwcm0tPmZpbGUpIHsKKwkJCQlyZWFkX3VubG9jaygmYmluZm10X2xvY2spOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCX0KKwkJcmVhZF91bmxvY2soJmJpbmZtdF9sb2NrKTsKKwkJaWYgKHJldHZhbCAhPSAtRU5PRVhFQyB8fCBicHJtLT5tbSA9PSBOVUxMKSB7CisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfS01PRAorCQl9ZWxzZXsKKyNkZWZpbmUgcHJpbnRhYmxlKGMpICgoKGMpPT0nXHQnKSB8fCAoKGMpPT0nXG4nKSB8fCAoMHgyMDw9KGMpICYmIChjKTw9MHg3ZSkpCisJCQlpZiAocHJpbnRhYmxlKGJwcm0tPmJ1ZlswXSkgJiYKKwkJCSAgICBwcmludGFibGUoYnBybS0+YnVmWzFdKSAmJgorCQkJICAgIHByaW50YWJsZShicHJtLT5idWZbMl0pICYmCisJCQkgICAgcHJpbnRhYmxlKGJwcm0tPmJ1ZlszXSkpCisJCQkJYnJlYWs7IC8qIC1FTk9FWEVDICovCisJCQlyZXF1ZXN0X21vZHVsZSgiYmluZm10LSUwNHgiLCAqKHVuc2lnbmVkIHNob3J0ICopKCZicHJtLT5idWZbMl0pKTsKKyNlbmRpZgorCQl9CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK0VYUE9SVF9TWU1CT0woc2VhcmNoX2JpbmFyeV9oYW5kbGVyKTsKKworLyoKKyAqIHN5c19leGVjdmUoKSBleGVjdXRlcyBhIG5ldyBwcm9ncmFtLgorICovCitpbnQgZG9fZXhlY3ZlKGNoYXIgKiBmaWxlbmFtZSwKKwljaGFyIF9fdXNlciAqX191c2VyICphcmd2LAorCWNoYXIgX191c2VyICpfX3VzZXIgKmVudnAsCisJc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm07CisJc3RydWN0IGZpbGUgKmZpbGU7CisJaW50IHJldHZhbDsKKwlpbnQgaTsKKworCXJldHZhbCA9IC1FTk9NRU07CisJYnBybSA9IGttYWxsb2Moc2l6ZW9mKCpicHJtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFicHJtKQorCQlnb3RvIG91dF9yZXQ7CisJbWVtc2V0KGJwcm0sIDAsIHNpemVvZigqYnBybSkpOworCisJZmlsZSA9IG9wZW5fZXhlYyhmaWxlbmFtZSk7CisJcmV0dmFsID0gUFRSX0VSUihmaWxlKTsKKwlpZiAoSVNfRVJSKGZpbGUpKQorCQlnb3RvIG91dF9rZnJlZTsKKworCXNjaGVkX2V4ZWMoKTsKKworCWJwcm0tPnAgPSBQQUdFX1NJWkUqTUFYX0FSR19QQUdFUy1zaXplb2Yodm9pZCAqKTsKKworCWJwcm0tPmZpbGUgPSBmaWxlOworCWJwcm0tPmZpbGVuYW1lID0gZmlsZW5hbWU7CisJYnBybS0+aW50ZXJwID0gZmlsZW5hbWU7CisJYnBybS0+bW0gPSBtbV9hbGxvYygpOworCXJldHZhbCA9IC1FTk9NRU07CisJaWYgKCFicHJtLT5tbSkKKwkJZ290byBvdXRfZmlsZTsKKworCXJldHZhbCA9IGluaXRfbmV3X2NvbnRleHQoY3VycmVudCwgYnBybS0+bW0pOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIG91dF9tbTsKKworCWJwcm0tPmFyZ2MgPSBjb3VudChhcmd2LCBicHJtLT5wIC8gc2l6ZW9mKHZvaWQgKikpOworCWlmICgocmV0dmFsID0gYnBybS0+YXJnYykgPCAwKQorCQlnb3RvIG91dF9tbTsKKworCWJwcm0tPmVudmMgPSBjb3VudChlbnZwLCBicHJtLT5wIC8gc2l6ZW9mKHZvaWQgKikpOworCWlmICgocmV0dmFsID0gYnBybS0+ZW52YykgPCAwKQorCQlnb3RvIG91dF9tbTsKKworCXJldHZhbCA9IHNlY3VyaXR5X2Jwcm1fYWxsb2MoYnBybSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CisKKwlyZXR2YWwgPSBwcmVwYXJlX2JpbnBybShicHJtKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXR2YWwgPSBjb3B5X3N0cmluZ3Nfa2VybmVsKDEsICZicHJtLT5maWxlbmFtZSwgYnBybSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0OworCisJYnBybS0+ZXhlYyA9IGJwcm0tPnA7CisJcmV0dmFsID0gY29weV9zdHJpbmdzKGJwcm0tPmVudmMsIGVudnAsIGJwcm0pOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIG91dDsKKworCXJldHZhbCA9IGNvcHlfc3RyaW5ncyhicHJtLT5hcmdjLCBhcmd2LCBicHJtKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXR2YWwgPSBzZWFyY2hfYmluYXJ5X2hhbmRsZXIoYnBybSxyZWdzKTsKKwlpZiAocmV0dmFsID49IDApIHsKKwkJZnJlZV9hcmdfcGFnZXMoYnBybSk7CisKKwkJLyogZXhlY3ZlIHN1Y2Nlc3MgKi8KKwkJc2VjdXJpdHlfYnBybV9mcmVlKGJwcm0pOworCQlhY2N0X3VwZGF0ZV9pbnRlZ3JhbHMoY3VycmVudCk7CisJCXVwZGF0ZV9tZW1faGl3YXRlcihjdXJyZW50KTsKKwkJa2ZyZWUoYnBybSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCitvdXQ6CisJLyogU29tZXRoaW5nIHdlbnQgd3JvbmcsIHJldHVybiB0aGUgaW5vZGUgYW5kIGZyZWUgdGhlIGFyZ3VtZW50IHBhZ2VzKi8KKwlmb3IgKGkgPSAwIDsgaSA8IE1BWF9BUkdfUEFHRVMgOyBpKyspIHsKKwkJc3RydWN0IHBhZ2UgKiBwYWdlID0gYnBybS0+cGFnZVtpXTsKKwkJaWYgKHBhZ2UpCisJCQlfX2ZyZWVfcGFnZShwYWdlKTsKKwl9CisKKwlpZiAoYnBybS0+c2VjdXJpdHkpCisJCXNlY3VyaXR5X2Jwcm1fZnJlZShicHJtKTsKKworb3V0X21tOgorCWlmIChicHJtLT5tbSkKKwkJbW1kcm9wKGJwcm0tPm1tKTsKKworb3V0X2ZpbGU6CisJaWYgKGJwcm0tPmZpbGUpIHsKKwkJYWxsb3dfd3JpdGVfYWNjZXNzKGJwcm0tPmZpbGUpOworCQlmcHV0KGJwcm0tPmZpbGUpOworCX0KKworb3V0X2tmcmVlOgorCWtmcmVlKGJwcm0pOworCitvdXRfcmV0OgorCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBzZXRfYmluZm10KHN0cnVjdCBsaW51eF9iaW5mbXQgKm5ldykKK3sKKwlzdHJ1Y3QgbGludXhfYmluZm10ICpvbGQgPSBjdXJyZW50LT5iaW5mbXQ7CisKKwlpZiAobmV3KSB7CisJCWlmICghdHJ5X21vZHVsZV9nZXQobmV3LT5tb2R1bGUpKQorCQkJcmV0dXJuIC0xOworCX0KKwljdXJyZW50LT5iaW5mbXQgPSBuZXc7CisJaWYgKG9sZCkKKwkJbW9kdWxlX3B1dChvbGQtPm1vZHVsZSk7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woc2V0X2JpbmZtdCk7CisKKyNkZWZpbmUgQ09SRU5BTUVfTUFYX1NJWkUgNjQKKworLyogZm9ybWF0X2NvcmVuYW1lIHdpbGwgaW5zcGVjdCB0aGUgcGF0dGVybiBwYXJhbWV0ZXIsIGFuZCBvdXRwdXQgYQorICogbmFtZSBpbnRvIGNvcmVuYW1lLCB3aGljaCBtdXN0IGhhdmUgc3BhY2UgZm9yIGF0IGxlYXN0CisgKiBDT1JFTkFNRV9NQVhfU0laRSBieXRlcyBwbHVzIG9uZSBieXRlIGZvciB0aGUgemVybyB0ZXJtaW5hdG9yLgorICovCitzdGF0aWMgdm9pZCBmb3JtYXRfY29yZW5hbWUoY2hhciAqY29yZW5hbWUsIGNvbnN0IGNoYXIgKnBhdHRlcm4sIGxvbmcgc2lnbnIpCit7CisJY29uc3QgY2hhciAqcGF0X3B0ciA9IHBhdHRlcm47CisJY2hhciAqb3V0X3B0ciA9IGNvcmVuYW1lOworCWNoYXIgKmNvbnN0IG91dF9lbmQgPSBjb3JlbmFtZSArIENPUkVOQU1FX01BWF9TSVpFOworCWludCByYzsKKwlpbnQgcGlkX2luX3BhdHRlcm4gPSAwOworCisJLyogUmVwZWF0IGFzIGxvbmcgYXMgd2UgaGF2ZSBtb3JlIHBhdHRlcm4gdG8gcHJvY2VzcyBhbmQgbW9yZSBvdXRwdXQKKwkgICBzcGFjZSAqLworCXdoaWxlICgqcGF0X3B0cikgeworCQlpZiAoKnBhdF9wdHIgIT0gJyUnKSB7CisJCQlpZiAob3V0X3B0ciA9PSBvdXRfZW5kKQorCQkJCWdvdG8gb3V0OworCQkJKm91dF9wdHIrKyA9ICpwYXRfcHRyKys7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKCorK3BhdF9wdHIpIHsKKwkJCWNhc2UgMDoKKwkJCQlnb3RvIG91dDsKKwkJCS8qIERvdWJsZSBwZXJjZW50LCBvdXRwdXQgb25lIHBlcmNlbnQgKi8KKwkJCWNhc2UgJyUnOgorCQkJCWlmIChvdXRfcHRyID09IG91dF9lbmQpCisJCQkJCWdvdG8gb3V0OworCQkJCSpvdXRfcHRyKysgPSAnJSc7CisJCQkJYnJlYWs7CisJCQkvKiBwaWQgKi8KKwkJCWNhc2UgJ3AnOgorCQkJCXBpZF9pbl9wYXR0ZXJuID0gMTsKKwkJCQlyYyA9IHNucHJpbnRmKG91dF9wdHIsIG91dF9lbmQgLSBvdXRfcHRyLAorCQkJCQkgICAgICAiJWQiLCBjdXJyZW50LT50Z2lkKTsKKwkJCQlpZiAocmMgPiBvdXRfZW5kIC0gb3V0X3B0cikKKwkJCQkJZ290byBvdXQ7CisJCQkJb3V0X3B0ciArPSByYzsKKwkJCQlicmVhazsKKwkJCS8qIHVpZCAqLworCQkJY2FzZSAndSc6CisJCQkJcmMgPSBzbnByaW50ZihvdXRfcHRyLCBvdXRfZW5kIC0gb3V0X3B0ciwKKwkJCQkJICAgICAgIiVkIiwgY3VycmVudC0+dWlkKTsKKwkJCQlpZiAocmMgPiBvdXRfZW5kIC0gb3V0X3B0cikKKwkJCQkJZ290byBvdXQ7CisJCQkJb3V0X3B0ciArPSByYzsKKwkJCQlicmVhazsKKwkJCS8qIGdpZCAqLworCQkJY2FzZSAnZyc6CisJCQkJcmMgPSBzbnByaW50ZihvdXRfcHRyLCBvdXRfZW5kIC0gb3V0X3B0ciwKKwkJCQkJICAgICAgIiVkIiwgY3VycmVudC0+Z2lkKTsKKwkJCQlpZiAocmMgPiBvdXRfZW5kIC0gb3V0X3B0cikKKwkJCQkJZ290byBvdXQ7CisJCQkJb3V0X3B0ciArPSByYzsKKwkJCQlicmVhazsKKwkJCS8qIHNpZ25hbCB0aGF0IGNhdXNlZCB0aGUgY29yZWR1bXAgKi8KKwkJCWNhc2UgJ3MnOgorCQkJCXJjID0gc25wcmludGYob3V0X3B0ciwgb3V0X2VuZCAtIG91dF9wdHIsCisJCQkJCSAgICAgICIlbGQiLCBzaWducik7CisJCQkJaWYgKHJjID4gb3V0X2VuZCAtIG91dF9wdHIpCisJCQkJCWdvdG8gb3V0OworCQkJCW91dF9wdHIgKz0gcmM7CisJCQkJYnJlYWs7CisJCQkvKiBVTklYIHRpbWUgb2YgY29yZWR1bXAgKi8KKwkJCWNhc2UgJ3QnOiB7CisJCQkJc3RydWN0IHRpbWV2YWwgdHY7CisJCQkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJCQkJcmMgPSBzbnByaW50ZihvdXRfcHRyLCBvdXRfZW5kIC0gb3V0X3B0ciwKKwkJCQkJICAgICAgIiVsdSIsIHR2LnR2X3NlYyk7CisJCQkJaWYgKHJjID4gb3V0X2VuZCAtIG91dF9wdHIpCisJCQkJCWdvdG8gb3V0OworCQkJCW91dF9wdHIgKz0gcmM7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBob3N0bmFtZSAqLworCQkJY2FzZSAnaCc6CisJCQkJZG93bl9yZWFkKCZ1dHNfc2VtKTsKKwkJCQlyYyA9IHNucHJpbnRmKG91dF9wdHIsIG91dF9lbmQgLSBvdXRfcHRyLAorCQkJCQkgICAgICAiJXMiLCBzeXN0ZW1fdXRzbmFtZS5ub2RlbmFtZSk7CisJCQkJdXBfcmVhZCgmdXRzX3NlbSk7CisJCQkJaWYgKHJjID4gb3V0X2VuZCAtIG91dF9wdHIpCisJCQkJCWdvdG8gb3V0OworCQkJCW91dF9wdHIgKz0gcmM7CisJCQkJYnJlYWs7CisJCQkvKiBleGVjdXRhYmxlICovCisJCQljYXNlICdlJzoKKwkJCQlyYyA9IHNucHJpbnRmKG91dF9wdHIsIG91dF9lbmQgLSBvdXRfcHRyLAorCQkJCQkgICAgICAiJXMiLCBjdXJyZW50LT5jb21tKTsKKwkJCQlpZiAocmMgPiBvdXRfZW5kIC0gb3V0X3B0cikKKwkJCQkJZ290byBvdXQ7CisJCQkJb3V0X3B0ciArPSByYzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQkrK3BhdF9wdHI7CisJCX0KKwl9CisJLyogQmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGNvcmVfdXNlc19waWQ6CisJICoKKwkgKiBJZiBjb3JlX3BhdHRlcm4gZG9lcyBub3QgaW5jbHVkZSBhICVwIChhcyBpcyB0aGUgZGVmYXVsdCkKKwkgKiBhbmQgY29yZV91c2VzX3BpZCBpcyBzZXQsIHRoZW4gLiVwaWQgd2lsbCBiZSBhcHBlbmRlZCB0bworCSAqIHRoZSBmaWxlbmFtZSAqLworCWlmICghcGlkX2luX3BhdHRlcm4KKyAgICAgICAgICAgICYmIChjb3JlX3VzZXNfcGlkIHx8IGF0b21pY19yZWFkKCZjdXJyZW50LT5tbS0+bW1fdXNlcnMpICE9IDEpKSB7CisJCXJjID0gc25wcmludGYob3V0X3B0ciwgb3V0X2VuZCAtIG91dF9wdHIsCisJCQkgICAgICAiLiVkIiwgY3VycmVudC0+dGdpZCk7CisJCWlmIChyYyA+IG91dF9lbmQgLSBvdXRfcHRyKQorCQkJZ290byBvdXQ7CisJCW91dF9wdHIgKz0gcmM7CisJfQorICAgICAgb3V0OgorCSpvdXRfcHRyID0gMDsKK30KKworc3RhdGljIHZvaWQgemFwX3RocmVhZHMgKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqZywgKnA7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCXN0cnVjdCBjb21wbGV0aW9uICp2Zm9ya19kb25lID0gdHNrLT52Zm9ya19kb25lOworCWludCB0cmFjZWQgPSAwOworCisJLyoKKwkgKiBNYWtlIHN1cmUgbm9ib2R5IGlzIHdhaXRpbmcgZm9yIHVzIHRvIHJlbGVhc2UgdGhlIFZNLAorCSAqIG90aGVyd2lzZSB3ZSBjYW4gZGVhZGxvY2sgd2hlbiB3ZSB3YWl0IG9uIGVhY2ggb3RoZXIKKwkgKi8KKwlpZiAodmZvcmtfZG9uZSkgeworCQl0c2stPnZmb3JrX2RvbmUgPSBOVUxMOworCQljb21wbGV0ZSh2Zm9ya19kb25lKTsKKwl9CisKKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCWRvX2VhY2hfdGhyZWFkKGcscCkKKwkJaWYgKG1tID09IHAtPm1tICYmIHAgIT0gdHNrKSB7CisJCQlmb3JjZV9zaWdfc3BlY2lmaWMoU0lHS0lMTCwgcCk7CisJCQltbS0+Y29yZV93YWl0ZXJzKys7CisJCQlpZiAodW5saWtlbHkocC0+cHRyYWNlKSAmJgorCQkJICAgIHVubGlrZWx5KHAtPnBhcmVudC0+bW0gPT0gbW0pKQorCQkJCXRyYWNlZCA9IDE7CisJCX0KKwl3aGlsZV9lYWNoX3RocmVhZChnLHApOworCisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCisJaWYgKHVubGlrZWx5KHRyYWNlZCkpIHsKKwkJLyoKKwkJICogV2UgYXJlIHphcHBpbmcgYSB0aHJlYWQgYW5kIHRoZSB0aHJlYWQgaXQgcHRyYWNlcy4KKwkJICogSWYgdGhlIHRyYWNlZSB3ZW50IGludG8gYSBwdHJhY2Ugc3RvcCBmb3IgZXhpdCB0cmFjaW5nLAorCQkgKiB3ZSBjb3VsZCBkZWFkbG9jayBzaW5jZSB0aGUgdHJhY2VyIGlzIHdhaXRpbmcgZm9yIHRoaXMKKwkJICogY29yZWR1bXAgdG8gZmluaXNoLiAgRGV0YWNoIHRoZW0gc28gdGhleSBjYW4gYm90aCBkaWUuCisJCSAqLworCQl3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CisJCWRvX2VhY2hfdGhyZWFkKGcscCkgeworCQkJaWYgKG1tID09IHAtPm1tICYmIHAgIT0gdHNrICYmCisJCQkgICAgcC0+cHRyYWNlICYmIHAtPnBhcmVudC0+bW0gPT0gbW0pIHsKKwkJCQlfX3B0cmFjZV91bmxpbmsocCk7CisJCQl9CisJCX0gd2hpbGVfZWFjaF90aHJlYWQoZyxwKTsKKwkJd3JpdGVfdW5sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjb3JlZHVtcF93YWl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCURFQ0xBUkVfQ09NUExFVElPTihzdGFydHVwX2RvbmUpOworCisJbW0tPmNvcmVfd2FpdGVycysrOyAvKiBsZXQgb3RoZXIgdGhyZWFkcyBibG9jayAqLworCW1tLT5jb3JlX3N0YXJ0dXBfZG9uZSA9ICZzdGFydHVwX2RvbmU7CisKKwkvKiBnaXZlIG90aGVyIHRocmVhZHMgYSBjaGFuY2UgdG8gcnVuOiAqLworCXlpZWxkKCk7CisKKwl6YXBfdGhyZWFkcyhtbSk7CisJaWYgKC0tbW0tPmNvcmVfd2FpdGVycykgeworCQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmc3RhcnR1cF9kb25lKTsKKwl9IGVsc2UKKwkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJQlVHX09OKG1tLT5jb3JlX3dhaXRlcnMpOworfQorCitpbnQgZG9fY29yZWR1bXAobG9uZyBzaWduciwgaW50IGV4aXRfY29kZSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWNoYXIgY29yZW5hbWVbQ09SRU5BTUVfTUFYX1NJWkUgKyAxXTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXN0cnVjdCBsaW51eF9iaW5mbXQgKiBiaW5mbXQ7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGZpbGUgKiBmaWxlOworCWludCByZXR2YWwgPSAwOworCisJYmluZm10ID0gY3VycmVudC0+YmluZm10OworCWlmICghYmluZm10IHx8ICFiaW5mbXQtPmNvcmVfZHVtcCkKKwkJZ290byBmYWlsOworCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJaWYgKCFtbS0+ZHVtcGFibGUpIHsKKwkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJCWdvdG8gZmFpbDsKKwl9CisJbW0tPmR1bXBhYmxlID0gMDsKKwlpbml0X2NvbXBsZXRpb24oJm1tLT5jb3JlX2RvbmUpOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWN1cnJlbnQtPnNpZ25hbC0+ZmxhZ3MgPSBTSUdOQUxfR1JPVVBfRVhJVDsKKwljdXJyZW50LT5zaWduYWwtPmdyb3VwX2V4aXRfY29kZSA9IGV4aXRfY29kZTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWNvcmVkdW1wX3dhaXQobW0pOworCisJLyoKKwkgKiBDbGVhciBhbnkgZmFsc2UgaW5kaWNhdGlvbiBvZiBwZW5kaW5nIHNpZ25hbHMgdGhhdCBtaWdodAorCSAqIGJlIHNlZW4gYnkgdGhlIGZpbGVzeXN0ZW0gY29kZSBjYWxsZWQgdG8gd3JpdGUgdGhlIGNvcmUgZmlsZS4KKwkgKi8KKwljdXJyZW50LT5zaWduYWwtPmdyb3VwX3N0b3BfY291bnQgPSAwOworCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9TSUdQRU5ESU5HKTsKKworCWlmIChjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX0NPUkVdLnJsaW1fY3VyIDwgYmluZm10LT5taW5fY29yZWR1bXApCisJCWdvdG8gZmFpbF91bmxvY2s7CisKKwkvKgorCSAqIGxvY2tfa2VybmVsKCkgYmVjYXVzZSBmb3JtYXRfY29yZW5hbWUoKSBpcyBjb250cm9sbGVkIGJ5IHN5c2N0bCwgd2hpY2gKKwkgKiB1c2VzIGxvY2tfa2VybmVsKCkKKwkgKi8KKyAJbG9ja19rZXJuZWwoKTsKKwlmb3JtYXRfY29yZW5hbWUoY29yZW5hbWUsIGNvcmVfcGF0dGVybiwgc2lnbnIpOworCXVubG9ja19rZXJuZWwoKTsKKwlmaWxlID0gZmlscF9vcGVuKGNvcmVuYW1lLCBPX0NSRUFUIHwgMiB8IE9fTk9GT0xMT1cgfCBPX0xBUkdFRklMRSwgMDYwMCk7CisJaWYgKElTX0VSUihmaWxlKSkKKwkJZ290byBmYWlsX3VubG9jazsKKwlpbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWlmIChpbm9kZS0+aV9ubGluayA+IDEpCisJCWdvdG8gY2xvc2VfZmFpbDsJLyogbXVsdGlwbGUgbGlua3MgLSBkb24ndCBkdW1wICovCisJaWYgKGRfdW5oYXNoZWQoZmlsZS0+Zl9kZW50cnkpKQorCQlnb3RvIGNsb3NlX2ZhaWw7CisKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCWdvdG8gY2xvc2VfZmFpbDsKKwlpZiAoIWZpbGUtPmZfb3ApCisJCWdvdG8gY2xvc2VfZmFpbDsKKwlpZiAoIWZpbGUtPmZfb3AtPndyaXRlKQorCQlnb3RvIGNsb3NlX2ZhaWw7CisJaWYgKGRvX3RydW5jYXRlKGZpbGUtPmZfZGVudHJ5LCAwKSAhPSAwKQorCQlnb3RvIGNsb3NlX2ZhaWw7CisKKwlyZXR2YWwgPSBiaW5mbXQtPmNvcmVfZHVtcChzaWduciwgcmVncywgZmlsZSk7CisKKwlpZiAocmV0dmFsKQorCQljdXJyZW50LT5zaWduYWwtPmdyb3VwX2V4aXRfY29kZSB8PSAweDgwOworY2xvc2VfZmFpbDoKKwlmaWxwX2Nsb3NlKGZpbGUsIE5VTEwpOworZmFpbF91bmxvY2s6CisJY29tcGxldGVfYWxsKCZtbS0+Y29yZV9kb25lKTsKK2ZhaWw6CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2ZzL2V4cG9ydGZzL01ha2VmaWxlIGIvZnMvZXhwb3J0ZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdjNWQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4cG9ydGZzL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGZpbGVzeXN0ZW0gZXhwb3J0IHN1cHBvcnQgcm91dGluZXMuCisKK29iai0kKENPTkZJR19FWFBPUlRGUykgKz0gZXhwb3J0ZnMubworCitleHBvcnRmcy1vYmpzIDo9IGV4cGZzLm8KZGlmZiAtLWdpdCBhL2ZzL2V4cG9ydGZzL2V4cGZzLmMgYi9mcy9leHBvcnRmcy9leHBmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OWQ2MjUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHBvcnRmcy9leHBmcy5jCkBAIC0wLDAgKzEsNTQwIEBACisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisKK3N0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBleHBvcnRfb3BfZGVmYXVsdDsKKworI2RlZmluZQlDQUxMKG9wcyxmdW4pICgob3BzLT5mdW4pPyhvcHMtPmZ1bik6ZXhwb3J0X29wX2RlZmF1bHQuZnVuKQorCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmdzLi4uKSBkb3t9d2hpbGUoMCkKKworLyoqCisgKiBmaW5kX2V4cG9ydGVkX2RlbnRyeSAtIGhlbHBlciByb3V0aW5lIHRvIGltcGxlbWVudCBleHBvcnRfb3BlcmF0aW9ucy0+ZGVjb2RlX2ZoCisgKiBAc2I6CQlUaGUgJnN1cGVyX2Jsb2NrIGlkZW50aWZ5aW5nIHRoZSBmaWxlc3lzdGVtCisgKiBAb2JqOglBbiBvcGFxdWUgaWRlbnRpZmllciBvZiB0aGUgb2JqZWN0IHRvIGJlIGZvdW5kIC0gcGFzc2VkIHRvCisgKgkJZ2V0X2lub2RlCisgKiBAcGFyZW50OglBbiBvcHRpb25hbCBvcHFhdWUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50IG9mIHRoZSBvYmplY3QuCisgKiBAYWNjZXB0YWJsZToJQSBmdW5jdGlvbiB1c2VkIHRvIHRlc3QgcG9zc2libGUgJmRlbnRyaWVzIHRvIHNlZSBpZiB0aGV5IGFyZQorICoJCWFjY2VwdGFibGUKKyAqIEBjb250ZXh0OglBIHBhcmFtZXRlciB0byBAYWNjZXB0YWJsZSBzbyB0aGF0IGl0IGtub3dzIG9uIHdoYXQgYmFzaXMgdG8KKyAqCQlqdWRnZS4KKyAqCisgKiBmaW5kX2V4cG9ydGVkX2RlbnRyeSBpcyB0aGUgY2VudHJhbCBoZWxwZXIgcm91dGluZSB0byBlbmFibGUgZmlsZSBzeXN0ZW1zCisgKiB0byBwcm92aWRlIHRoZSBkZWNvZGVfZmgoKSBleHBvcnRfb3BlcmF0aW9uLiAgSXQncyBtYWluIHRhc2sgaXMgdG8gdGFrZQorICogYW4gJmlub2RlLCBmaW5kIG9yIGNyZWF0ZSBhbiBhcHByb3ByaWF0ZSAmZGVudHJ5IHN0cnVjdHVyZSwgYW5kIHBvc3NpYmx5CisgKiBzcGxpY2UgdGhpcyBpbnRvIHRoZSBkY2FjaGUgaW4gdGhlIGNvcnJlY3QgcGxhY2UuCisgKgorICogVGhlIGRlY29kZV9maCgpIG9wZXJhdGlvbiBwcm92aWRlZCBieSB0aGUgZmlsZXN5c3RlbSBzaG91bGQgY2FsbAorICogZmluZF9leHBvcnRlZF9kZW50cnkoKSB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgdGhhdCBpdCByZWNlaXZlZCBleGNlcHQKKyAqIHRoYXQgaW5zdGVhZCBvZiB0aGUgZmlsZSBoYW5kbGUgZnJhZ21lbnQsIHBvaW50ZXJzIHRvIG9wYXF1ZSBpZGVudGlmaWVycworICogZm9yIHRoZSBvYmplY3QgYW5kIG9wdGlvbmFsbHkgaXRzIHBhcmVudCBhcmUgcGFzc2VkLiAgVGhlIGRlZmF1bHQgZGVjb2RlX2ZoCisgKiByb3V0aW5lIHBhc3NlcyBvbmUgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGZpbGVoYW5kbGUgZnJhZ21lbnQsIGFuZAorICogb25lIDggYnl0ZXMgaW50byB0aGUgZnJhZ21lbnQuICBJdCBpcyBleHBlY3RlZCB0aGF0IG1vc3QgZmlsZXN5c3RlbXMgd2lsbAorICogdGFrZSB0aGlzIGFwcHJvYWNoLCB0aG91Z2ggdGhlIG9mZnNldCB0byB0aGUgcGFyZW50IGlkZW50aWZpZXIgbWF5IHdlbGwgYmUKKyAqIGRpZmZlcmVudC4KKyAqCisgKiBmaW5kX2V4cG9ydGVkX2RlbnRyeSgpIHdpbGwgY2FsbCBnZXRfZGVudHJ5IHRvIGdldCBhbiBkZW50cnkgcG9pbnRlciBmcm9tCisgKiB0aGUgZmlsZSBzeXN0ZW0uICBJZiBhbnkgJmRlbnRyeSBpbiB0aGUgZF9hbGlhcyBsaXN0IGlzIGFjY2VwdGFibGUsIGl0IHdpbGwKKyAqIGJlIHJldHVybmVkLiAgT3RoZXJ3aXNlIGZpbmRfZXhwb3J0ZWRfZGVudHJ5KCkgd2lsbCBhdHRlbXB0IHRvIHNwbGljZSBhIG5ldworICogJmRlbnRyeSBpbnRvIHRoZSBkY2FjaGUgdXNpbmcgZ2V0X25hbWUoKSBhbmQgZ2V0X3BhcmVudCgpIHRvIGZpbmQgdGhlCisgKiBhcHByb3ByaWF0ZSBwbGFjZS4KKyAqLworCitzdHJ1Y3QgZGVudHJ5ICoKK2ZpbmRfZXhwb3J0ZWRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKm9iaiwgdm9pZCAqcGFyZW50LAorCQkgICAgIGludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBkZW50cnkgKmRlKSwKKwkJICAgICB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBkZW50cnkgKnJlc3VsdCA9IE5VTEw7CisJc3RydWN0IGRlbnRyeSAqdGFyZ2V0X2RpcjsKKwlpbnQgZXJyOworCXN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyAqbm9wcyA9IHNiLT5zX2V4cG9ydF9vcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsZSwgKmhlYWQ7CisJc3RydWN0IGRlbnRyeSAqdG9wdXQgPSBOVUxMOworCWludCBub3Byb2dyZXNzOworCWNoYXIgbmJ1ZltOQU1FX01BWCsxXTsKKworCS8qCisJICogQXR0ZW1wdCB0byBmaW5kIHRoZSBpbm9kZS4KKwkgKi8KKwlyZXN1bHQgPSBDQUxMKHNiLT5zX2V4cG9ydF9vcCxnZXRfZGVudHJ5KShzYixvYmopOworCWVyciA9IC1FU1RBTEU7CisJaWYgKHJlc3VsdCA9PSBOVUxMKQorCQlnb3RvIGVycl9vdXQ7CisJaWYgKElTX0VSUihyZXN1bHQpKSB7CisJCWVyciA9IFBUUl9FUlIocmVzdWx0KTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlpZiAoU19JU0RJUihyZXN1bHQtPmRfaW5vZGUtPmlfbW9kZSkgJiYKKwkgICAgKHJlc3VsdC0+ZF9mbGFncyAmIERDQUNIRV9ESVNDT05ORUNURUQpKSB7CisJCS8qIGl0IGlzIGFuIHVuY29ubmVjdGVkIGRpcmVjdG9yeSwgd2UgbXVzdCBjb25uZWN0IGl0ICovCisJCTsKKwl9IGVsc2UgeworCQlpZiAoYWNjZXB0YWJsZShjb250ZXh0LCByZXN1bHQpKQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJaWYgKFNfSVNESVIocmVzdWx0LT5kX2lub2RlLT5pX21vZGUpKSB7CisJCQkvKiB0aGVyZSBpcyBubyBvdGhlciBkZW50cnksIHNvIGZhaWwgKi8KKwkJCWdvdG8gZXJyX3Jlc3VsdDsKKwkJfQorCQkvKiB0cnkgYW55IG90aGVyIGFsaWFzZXMgKi8KKwkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJCWhlYWQgPSAmcmVzdWx0LT5kX2lub2RlLT5pX2RlbnRyeTsKKwkJbGlzdF9mb3JfZWFjaChsZSwgaGVhZCkgeworCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gbGlzdF9lbnRyeShsZSwgc3RydWN0IGRlbnRyeSwgZF9hbGlhcyk7CisJCQlkZ2V0X2xvY2tlZChkZW50cnkpOworCQkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJCWlmICh0b3B1dCkKKwkJCQlkcHV0KHRvcHV0KTsKKwkJCXRvcHV0ID0gTlVMTDsKKwkJCWlmIChkZW50cnkgIT0gcmVzdWx0ICYmCisJCQkgICAgYWNjZXB0YWJsZShjb250ZXh0LCBkZW50cnkpKSB7CisJCQkJZHB1dChyZXN1bHQpOworCQkJCXJldHVybiBkZW50cnk7CisJCQl9CisJCQlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwkJCXRvcHV0ID0gZGVudHJ5OworCQl9CisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCWlmICh0b3B1dCkKKwkJCWRwdXQodG9wdXQpOworCX0JCQkKKworCS8qIEl0J3MgYSBkaXJlY3RvcnksIG9yIHdlIGFyZSByZXF1aXJlZCB0byBjb25maXJtIHRoZSBmaWxlJ3MKKwkgKiBsb2NhdGlvbiBpbiB0aGUgdHJlZSBiYXNlZCBvbiB0aGUgcGFyZW50IGluZm9ybWF0aW9uCisgCSAqLworCWRwcmludGsoImZpbmRfZXhwb3J0ZWRfZGVudHJ5OiBuZWVkIHRvIGxvb2sgaGFyZGVyIGZvciAlcy8lZFxuIixzYi0+c19pZCwqKGludCopb2JqKTsKKwlpZiAoU19JU0RJUihyZXN1bHQtPmRfaW5vZGUtPmlfbW9kZSkpCisJCXRhcmdldF9kaXIgPSBkZ2V0KHJlc3VsdCk7CisJZWxzZSB7CisJCWlmIChwYXJlbnQgPT0gTlVMTCkKKwkJCWdvdG8gZXJyX3Jlc3VsdDsKKworCQl0YXJnZXRfZGlyID0gQ0FMTChzYi0+c19leHBvcnRfb3AsZ2V0X2RlbnRyeSkoc2IscGFyZW50KTsKKwkJaWYgKElTX0VSUih0YXJnZXRfZGlyKSkKKwkJCWVyciA9IFBUUl9FUlIodGFyZ2V0X2Rpcik7CisJCWlmICh0YXJnZXRfZGlyID09IE5VTEwgfHwgSVNfRVJSKHRhcmdldF9kaXIpKQorCQkJZ290byBlcnJfcmVzdWx0OworCX0KKwkvKgorCSAqIE5vdyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRhcmdldF9kaXIgaXMgcHJvcGVybHkgY29ubmVjdGVkLgorCSAqIEl0IG1heSBhbHJlYWR5IGJlLCBhcyB0aGUgZmxhZyBpc24ndCBhbHdheXMgdXBkYXRlZCB3aGVuIGNvbm5lY3Rpb24KKwkgKiBoYXBwZW5zLgorCSAqIFNvLCB3ZSB3YWxrIHVwIHBhcmVudCBsaW5rcyB1bnRpbCB3ZSBmaW5kIGEgY29ubmVjdGVkIGRpcmVjdG9yeSwKKwkgKiBvciB3ZSBydW4gb3V0IG9mIGRpcmVjdG9yaWVzLiAgVGhlbiB3ZSBmaW5kIHRoZSBwYXJlbnQsIGZpbmQKKwkgKiB0aGUgbmFtZSBvZiB0aGUgY2hpbGQgaW4gdGhhdCBwYXJlbnQsIGFuZCBkbyBhIGxvb2t1cC4KKwkgKiBUaGlzIHNob3VsZCBjb25uZWN0IHRoZSBjaGlsZCBpbnRvIHRoZSBwYXJlbnQKKwkgKiBXZSB0aGVuIHJlcGVhdC4KKwkgKi8KKworCS8qIGl0IGlzIHBvc3NpYmxlIHRoYXQgYSBjb25mdXNlZCBmaWxlIHN5c3RlbSBtaWdodCBub3QgbGV0IHVzIGNvbXBsZXRlIAorCSAqIHRoZSBwYXRoIHRvIHRoZSByb290LiAgRm9yIGV4YW1wbGUsIGlmIGdldF9wYXJlbnQgcmV0dXJucyBhIGRpcmVjdG9yeQorCSAqIGluIHdoaWNoIHdlIGNhbm5vdCBmaW5kIGEgbmFtZSBmb3IgdGhlIGNoaWxkLiAgV2hpbGUgdGhpcyBpbXBsaWVzIGEKKwkgKiB2ZXJ5IHNpY2sgZmlsZXN5c3RlbSB3ZSBkb24ndCB3YW50IGl0IHRvIGNhdXNlIGtuZnNkIHRvIHNwaW4uICBIZW5jZQorCSAqIHRoZSBub3Byb2dyZXNzIGNvdW50ZXIuICBJZiB3ZSBnbyB0aHJvdWdoIHRoZSBsb29wIDEwIHRpbWVzICgyIGlzCisJICogcHJvYmFibHkgZW5vdWdoKSB3aXRob3V0IGdldHRpbmcgYW55d2hlcmUsIHdlIGp1c3QgZ2l2ZSB1cAorCSAqLworCW5vcHJvZ3Jlc3M9IDA7CisJd2hpbGUgKHRhcmdldF9kaXItPmRfZmxhZ3MgJiBEQ0FDSEVfRElTQ09OTkVDVEVEICYmIG5vcHJvZ3Jlc3MrKyA8IDEwKSB7CisJCXN0cnVjdCBkZW50cnkgKnBkID0gdGFyZ2V0X2RpcjsKKworCQlkZ2V0KHBkKTsKKwkJc3Bpbl9sb2NrKCZwZC0+ZF9sb2NrKTsKKwkJd2hpbGUgKCFJU19ST09UKHBkKSAmJgorCQkJCShwZC0+ZF9wYXJlbnQtPmRfZmxhZ3MmRENBQ0hFX0RJU0NPTk5FQ1RFRCkpIHsKKwkJCXN0cnVjdCBkZW50cnkgKnBhcmVudCA9IHBkLT5kX3BhcmVudDsKKworCQkJZGdldChwYXJlbnQpOworCQkJc3Bpbl91bmxvY2soJnBkLT5kX2xvY2spOworCQkJZHB1dChwZCk7CisJCQlwZCA9IHBhcmVudDsKKwkJCXNwaW5fbG9jaygmcGQtPmRfbG9jayk7CisJCX0KKwkJc3Bpbl91bmxvY2soJnBkLT5kX2xvY2spOworCisJCWlmICghSVNfUk9PVChwZCkpIHsKKwkJCS8qIG11c3QgaGF2ZSBmb3VuZCBhIGNvbm5lY3RlZCBwYXJlbnQgLSBncmVhdCAqLworCQkJc3Bpbl9sb2NrKCZwZC0+ZF9sb2NrKTsKKwkJCXBkLT5kX2ZsYWdzICY9IH5EQ0FDSEVfRElTQ09OTkVDVEVEOworCQkJc3Bpbl91bmxvY2soJnBkLT5kX2xvY2spOworCQkJbm9wcm9ncmVzcyA9IDA7CisJCX0gZWxzZSBpZiAocGQgPT0gc2ItPnNfcm9vdCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJleHBvcnQ6IEVlZWsgZmlsZXN5c3RlbSByb290IGlzIG5vdCBjb25uZWN0ZWQsIGltcG9zc2libGVcbiIpOworCQkJc3Bpbl9sb2NrKCZwZC0+ZF9sb2NrKTsKKwkJCXBkLT5kX2ZsYWdzICY9IH5EQ0FDSEVfRElTQ09OTkVDVEVEOworCQkJc3Bpbl91bmxvY2soJnBkLT5kX2xvY2spOworCQkJbm9wcm9ncmVzcyA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiB3ZSBoYXZlIGhpdCB0aGUgdG9wIG9mIGEgZGlzY29ubmVjdGVkIHBhdGguICBUcnkKKwkJCSAqIHRvIGZpbmQgcGFyZW50IGFuZCBjb25uZWN0CisJCQkgKiBub3RlOiByYWNpbmcgd2l0aCBzb21lIG90aGVyIHByb2Nlc3MgcmVuYW1pbmcgYQorCQkJICogZGlyZWN0b3J5IGlzbid0IG11Y2ggb2YgYSBwcm9ibGVtIGhlcmUuICBJZiBzb21lb25lCisJCQkgKiByZW5hbWVzIHRoZSBkaXJlY3RvcnksIGl0IHdpbGwgZW5kIHVwIHByb3Blcmx5CisJCQkgKiBjb25uZWN0ZWQsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudAorCQkJICovCisJCQlzdHJ1Y3QgZGVudHJ5ICpwcGQ7CisJCQlzdHJ1Y3QgZGVudHJ5ICpucGQ7CisKKwkJCWRvd24oJnBkLT5kX2lub2RlLT5pX3NlbSk7CisJCQlwcGQgPSBDQUxMKG5vcHMsZ2V0X3BhcmVudCkocGQpOworCQkJdXAoJnBkLT5kX2lub2RlLT5pX3NlbSk7CisKKwkJCWlmIChJU19FUlIocHBkKSkgeworCQkJCWVyciA9IFBUUl9FUlIocHBkKTsKKwkJCQlkcHJpbnRrKCJmaW5kX2V4cG9ydGVkX2RlbnRyeTogZ2V0X3BhcmVudCBvZiAlbGQgZmFpbGVkLCBlcnIgJWRcbiIsCisJCQkJCXBkLT5kX2lub2RlLT5pX2lubywgZXJyKTsKKwkJCQlkcHV0KHBkKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRwcmludGsoImZpbmRfZXhwb3J0ZWRfZGVudHJ5OiBmaW5kIG5hbWUgb2YgJWx1IGluICVsdVxuIiwgcGQtPmRfaW5vZGUtPmlfaW5vLCBwcGQtPmRfaW5vZGUtPmlfaW5vKTsKKwkJCWVyciA9IENBTEwobm9wcyxnZXRfbmFtZSkocHBkLCBuYnVmLCBwZCk7CisJCQlpZiAoZXJyKSB7CisJCQkJZHB1dChwcGQpOworCQkJCWRwdXQocGQpOworCQkJCWlmIChlcnIgPT0gLUVOT0VOVCkKKwkJCQkJLyogc29tZSByYWNlIGJldHdlZW4gZ2V0X3BhcmVudCBhbmQKKwkJCQkJICogZ2V0X25hbWU/ICBqdXN0IHRyeSBhZ2FpbgorCQkJCQkgKi8KKwkJCQkJY29udGludWU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkcHJpbnRrKCJmaW5kX2V4cG9ydGVkX2RlbnRyeTogZm91bmQgbmFtZTogJXNcbiIsIG5idWYpOworCQkJZG93bigmcHBkLT5kX2lub2RlLT5pX3NlbSk7CisJCQlucGQgPSBsb29rdXBfb25lX2xlbihuYnVmLCBwcGQsIHN0cmxlbihuYnVmKSk7CisJCQl1cCgmcHBkLT5kX2lub2RlLT5pX3NlbSk7CisJCQlpZiAoSVNfRVJSKG5wZCkpIHsKKwkJCQllcnIgPSBQVFJfRVJSKG5wZCk7CisJCQkJZHByaW50aygiZmluZF9leHBvcnRlZF9kZW50cnk6IGxvb2t1cCBmYWlsZWQ6ICVkXG4iLCBlcnIpOworCQkJCWRwdXQocHBkKTsKKwkJCQlkcHV0KHBkKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIHdlIGRpZG4ndCByZWFsbHkgd2FudCBucGQsIHdlIHJlYWxseSB3YW50ZWQKKwkJCSAqIGEgc2lkZS1lZmZlY3Qgb2YgdGhlIGxvb2t1cC4KKwkJCSAqIGhvcGVmdWxseSwgbnBkID09IHBkLCB0aG91Z2ggaXQgaXNuJ3QgcmVhbGx5CisJCQkgKiBhIHByb2JsZW0gaWYgaXQgaXNuJ3QKKwkJCSAqLworCQkJaWYgKG5wZCA9PSBwZCkKKwkJCQlub3Byb2dyZXNzID0gMDsKKwkJCWVsc2UKKwkJCQlwcmludGsoImZpbmRfZXhwb3J0ZWRfZGVudHJ5OiBucGQgIT0gcGRcbiIpOworCQkJZHB1dChucGQpOworCQkJZHB1dChwcGQpOworCQkJaWYgKElTX1JPT1QocGQpKSB7CisJCQkJLyogc29tZXRoaW5nIHdlbnQgd3JvbmcsIHdlIGhhdmUgdG8gZ2l2ZSB1cCAqLworCQkJCWRwdXQocGQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWRwdXQocGQpOworCX0KKworCWlmICh0YXJnZXRfZGlyLT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCkgeworCQkvKiBzb21ldGhpbmcgd2VudCB3cm9uZyAtIG9oLXdlbGwgKi8KKwkJaWYgKCFlcnIpCisJCQllcnIgPSAtRVNUQUxFOworCQlnb3RvIGVycl90YXJnZXQ7CisJfQorCS8qIGlmIHdlIHdlcmVuJ3QgYWZ0ZXIgYSBkaXJlY3RvcnksIGhhdmUgb25lIG1vcmUgc3RlcCB0byBnbyAqLworCWlmIChyZXN1bHQgIT0gdGFyZ2V0X2RpcikgeworCQlzdHJ1Y3QgZGVudHJ5ICpucmVzdWx0OworCQllcnIgPSBDQUxMKG5vcHMsZ2V0X25hbWUpKHRhcmdldF9kaXIsIG5idWYsIHJlc3VsdCk7CisJCWlmICghZXJyKSB7CisJCQlkb3duKCZ0YXJnZXRfZGlyLT5kX2lub2RlLT5pX3NlbSk7CisJCQlucmVzdWx0ID0gbG9va3VwX29uZV9sZW4obmJ1ZiwgdGFyZ2V0X2Rpciwgc3RybGVuKG5idWYpKTsKKwkJCXVwKCZ0YXJnZXRfZGlyLT5kX2lub2RlLT5pX3NlbSk7CisJCQlpZiAoIUlTX0VSUihucmVzdWx0KSkgeworCQkJCWlmIChucmVzdWx0LT5kX2lub2RlKSB7CisJCQkJCWRwdXQocmVzdWx0KTsKKwkJCQkJcmVzdWx0ID0gbnJlc3VsdDsKKwkJCQl9IGVsc2UKKwkJCQkJZHB1dChucmVzdWx0KTsKKwkJCX0KKwkJfQorCX0KKwlkcHV0KHRhcmdldF9kaXIpOworCS8qIG5vdyByZXN1bHQgaXMgcHJvcGVybHkgY29ubmVjdGVkLCBpdCBpcyBvdXIgYmVzdCBiZXQgKi8KKwlpZiAoYWNjZXB0YWJsZShjb250ZXh0LCByZXN1bHQpKQorCQlyZXR1cm4gcmVzdWx0OworCS8qIG9uZSBsYXN0IHRyeSBvZiB0aGUgYWxpYXNlcy4uICovCisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJdG9wdXQgPSBOVUxMOworCWhlYWQgPSAmcmVzdWx0LT5kX2lub2RlLT5pX2RlbnRyeTsKKwlsaXN0X2Zvcl9lYWNoKGxlLCBoZWFkKSB7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGxpc3RfZW50cnkobGUsIHN0cnVjdCBkZW50cnksIGRfYWxpYXMpOworCQlkZ2V0X2xvY2tlZChkZW50cnkpOworCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQlpZiAodG9wdXQpIGRwdXQodG9wdXQpOworCQlpZiAoZGVudHJ5ICE9IHJlc3VsdCAmJgorCQkgICAgYWNjZXB0YWJsZShjb250ZXh0LCBkZW50cnkpKSB7CisJCQlkcHV0KHJlc3VsdCk7CisJCQlyZXR1cm4gZGVudHJ5OworCQl9CisJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCQl0b3B1dCA9IGRlbnRyeTsKKwl9CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwlpZiAodG9wdXQpCisJCWRwdXQodG9wdXQpOworCisJLyogZHJhdCAtIEkganVzdCBjYW5ub3QgZmluZCBhbnl0aGluZyBhY2NlcHRhYmxlICovCisJZHB1dChyZXN1bHQpOworCS8qIEl0IG1pZ2h0IGJlIGp1c3RpZmlhYmxlIHRvIHJldHVybiBFU1RBTEUgaGVyZSwKKwkgKiBidXQgdGhlIGZpbGVoYW5kbGUgYXQtbGVhc3QgbG9va3MgcmVhc29uYWJsZSBnb29kCisJICogYW5kIGl0IGp1c3QgYmUgYSBwZXJtaXNzaW9uIHByb2JsZW0sIHNvIHJldHVybmluZworCSAqIC1FQUNDRVNTIGlzIHNhZmVyCisJICovCisJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisKKyBlcnJfdGFyZ2V0OgorCWRwdXQodGFyZ2V0X2Rpcik7CisgZXJyX3Jlc3VsdDoKKwlkcHV0KHJlc3VsdCk7CisgZXJyX291dDoKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCisKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmdldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpCit7CisJLyogZ2V0X3BhcmVudCBjYW5ub3QgYmUgc3VwcG9ydGVkIGdlbmVyaWNhbGx5LCB0aGUgbG9ja2luZworCSAqIGlzIHRvbyBpY2t5LgorCSAqIGluc3RlYWQsIHdlIGp1c3QgcmV0dXJuIEVBQ0NFUy4gIElmIHNlcnZlciByZWJvb3RzIG9yIGlub2RlcworCSAqIGdldCBmbHVzaGVkLCB5b3UgbG9zZQorCSAqLworCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworfQorCisKK3N0cnVjdCBnZXRkZW50c19jYWxsYmFjayB7CisJY2hhciAqbmFtZTsJCS8qIG5hbWUgdGhhdCB3YXMgZm91bmQuIEl0IGFscmVhZHkgcG9pbnRzIHRvIGEKKwkJCQkgICBidWZmZXIgTkFNRV9NQVgrMSBpcyBzaXplICovCisJdW5zaWduZWQgbG9uZyBpbm87CS8qIHRoZSBpbnVtIHdlIGFyZSBsb29raW5nIGZvciAqLworCWludCBmb3VuZDsJCS8qIGlub2RlIG1hdGNoZWQ/ICovCisJaW50IHNlcXVlbmNlOwkJLyogc2VxdWVuY2UgY291bnRlciAqLworfTsKKworLyoKKyAqIEEgcmF0aGVyIHN0cmFuZ2UgZmlsbGRpciBmdW5jdGlvbiB0byBjYXB0dXJlCisgKiB0aGUgbmFtZSBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIGlub2RlIG51bWJlci4KKyAqLworc3RhdGljIGludCBmaWxsZGlyX29uZSh2b2lkICogX19idWYsIGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbGVuLAorCQkJbG9mZl90IHBvcywgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQoreworCXN0cnVjdCBnZXRkZW50c19jYWxsYmFjayAqYnVmID0gX19idWY7CisJaW50IHJlc3VsdCA9IDA7CisKKwlidWYtPnNlcXVlbmNlKys7CisJaWYgKGJ1Zi0+aW5vID09IGlubykgeworCQltZW1jcHkoYnVmLT5uYW1lLCBuYW1lLCBsZW4pOworCQlidWYtPm5hbWVbbGVuXSA9ICdcMCc7CisJCWJ1Zi0+Zm91bmQgPSAxOworCQlyZXN1bHQgPSAtMTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBnZXRfbmFtZSAtIGRlZmF1bHQgZXhwb3J0X29wZXJhdGlvbnMtPmdldF9uYW1lIGZ1bmN0aW9uCisgKiBAZGVudHJ5OiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIGZpbmQgYSBuYW1lCisgKiBAbmFtZTogICBhIHBvaW50ZXIgdG8gYSAlTkFNRV9NQVgrMSBjaGFyIGJ1ZmZlciB0byBzdG9yZSB0aGUgbmFtZQorICogQGNoaWxkOiAgdGhlIGRlbnRyeSBmb3IgdGhlIGNoaWxkIGRpcmVjdG9yeS4KKyAqCisgKiBjYWxscyByZWFkZGlyIG9uIHRoZSBwYXJlbnQgdW50aWwgaXQgZmluZHMgYW4gZW50cnkgd2l0aAorICogdGhlIHNhbWUgaW5vZGUgbnVtYmVyIGFzIHRoZSBjaGlsZCwgYW5kIHJldHVybnMgdGhhdC4KKyAqLworc3RhdGljIGludCBnZXRfbmFtZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKm5hbWUsCisJCQlzdHJ1Y3QgZGVudHJ5ICpjaGlsZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyb3I7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJc3RydWN0IGdldGRlbnRzX2NhbGxiYWNrIGJ1ZmZlcjsKKworCWVycm9yID0gLUVOT1RESVI7CisJaWYgKCFkaXIgfHwgIVNfSVNESVIoZGlyLT5pX21vZGUpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKCFkaXItPmlfZm9wKQorCQlnb3RvIG91dDsKKwkvKgorCSAqIE9wZW4gdGhlIGRpcmVjdG9yeSAuLi4KKwkgKi8KKwlmaWxlID0gZGVudHJ5X29wZW4oZGdldChkZW50cnkpLCBOVUxMLCBPX1JET05MWSk7CisJZXJyb3IgPSBQVFJfRVJSKGZpbGUpOworCWlmIChJU19FUlIoZmlsZSkpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSAtRUlOVkFMOworCWlmICghZmlsZS0+Zl9vcC0+cmVhZGRpcikKKwkJZ290byBvdXRfY2xvc2U7CisKKwlidWZmZXIubmFtZSA9IG5hbWU7CisJYnVmZmVyLmlubyA9IGNoaWxkLT5kX2lub2RlLT5pX2lubzsKKwlidWZmZXIuZm91bmQgPSAwOworCWJ1ZmZlci5zZXF1ZW5jZSA9IDA7CisJd2hpbGUgKDEpIHsKKwkJaW50IG9sZF9zZXEgPSBidWZmZXIuc2VxdWVuY2U7CisKKwkJZXJyb3IgPSB2ZnNfcmVhZGRpcihmaWxlLCBmaWxsZGlyX29uZSwgJmJ1ZmZlcik7CisKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWJyZWFrOworCisJCWVycm9yID0gMDsKKwkJaWYgKGJ1ZmZlci5mb3VuZCkKKwkJCWJyZWFrOworCQllcnJvciA9IC1FTk9FTlQ7CisJCWlmIChvbGRfc2VxID09IGJ1ZmZlci5zZXF1ZW5jZSkKKwkJCWJyZWFrOworCX0KKworb3V0X2Nsb3NlOgorCWZwdXQoZmlsZSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpleHBvcnRfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIGlubywgX191MzIgZ2VuZXJhdGlvbikKK3sKKworCS8qIGlnZXQgaXNuJ3QgcmVhbGx5IHJpZ2h0IGlmIHRoZSBpbm9kZSBpcyBjdXJyZW50bHkgdW5hbGxvY2F0ZWQhIQorCSAqIFRoaXMgc2hvdWxkIHJlYWxseSBhbGwgYmUgZG9uZSBpbnNpZGUgZWFjaCBmaWxlc3lzdGVtCisJICoKKwkgKiBleHQyZnMnIHJlYWRfaW5vZGUgaGFzIGJlZW4gc3RyZW5ndGhlZCB0byByZXR1cm4gYSBiYWRfaW5vZGUgaWYKKwkgKiB0aGUgaW5vZGUgaGFkIGJlZW4gZGVsZXRlZC4KKwkgKgorCSAqIEN1cnJlbnRseSB3ZSBkb24ndCBrbm93IHRoZSBnZW5lcmF0aW9uIGZvciBwYXJlbnQgZGlyZWN0b3J5LCBzbworCSAqIGEgZ2VuZXJhdGlvbiBvZiAwIG1lYW5zICJhY2NlcHQgYW55IgorCSAqLworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqcmVzdWx0OworCWlmIChpbm8gPT0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7CisJaW5vZGUgPSBpZ2V0KHNiLCBpbm8pOworCWlmIChpbm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAoaXNfYmFkX2lub2RlKGlub2RlKQorCSAgICB8fCAoZ2VuZXJhdGlvbiAmJiBpbm9kZS0+aV9nZW5lcmF0aW9uICE9IGdlbmVyYXRpb24pCisJCSkgeworCQkvKiB3ZSBkaWRuJ3QgZmluZCB0aGUgcmlnaHQgaW5vZGUuLiAqLworCQlkcHJpbnRrKCJmaF92ZXJpZnk6IElub2RlICVsdSwgQmFkIGNvdW50OiAlZCAlZCBvciB2ZXJzaW9uICAldSAldVxuIiwKKwkJCWlub2RlLT5pX2lubywKKwkJCWlub2RlLT5pX25saW5rLCBhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpLAorCQkJaW5vZGUtPmlfZ2VuZXJhdGlvbiwKKwkJCWdlbmVyYXRpb24pOworCisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKKwl9CisJLyogbm93IHRvIGZpbmQgYSBkZW50cnkuCisJICogSWYgcG9zc2libGUsIGdldCBhIHdlbGwtY29ubmVjdGVkIG9uZQorCSAqLworCXJlc3VsdCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisJaWYgKCFyZXN1bHQpIHsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpnZXRfb2JqZWN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnZvYmpwKQoreworCV9fdTMyICpvYmpwID0gdm9ianA7CisJdW5zaWduZWQgbG9uZyBpbm8gPSBvYmpwWzBdOworCV9fdTMyIGdlbmVyYXRpb24gPSBvYmpwWzFdOworCisJcmV0dXJuIGV4cG9ydF9pZ2V0KHNiLCBpbm8sIGdlbmVyYXRpb24pOworfQorCisKKy8qKgorICogZXhwb3J0X2VuY29kZV9maCAtIGRlZmF1bHQgZXhwb3J0X29wZXJhdGlvbnMtPmVuY29kZV9maCBmdW5jdGlvbgorICogQGRlbnRyeTogIHRoZSBkZW50cnkgdG8gZW5jb2RlCisgKiBAZmg6ICAgICAgd2hlcmUgdG8gc3RvcmUgdGhlIGZpbGUgaGFuZGxlIGZyYWdtZW50CisgKiBAbWF4X2xlbjogbWF4aW11bSBsZW5ndGggdG8gc3RvcmUgdGhlcmUKKyAqIEBjb25uZWN0YWJsZTogd2hldGhlciB0byBzdG9yZSBwYXJlbnQgaW5mb3JtYXRpb24KKyAqCisgKiBUaGlzIGRlZmF1bHQgZW5jb2RlX2ZoIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgMzIgaW5vZGUgbnVtYmVyCisgKiBpcyBzdWl0YWJsZSBmb3IgbG9jYXRpbmcgYW4gaW5vZGUsIGFuZCB0aGF0IHRoZSBnZW5lcmF0aW9uIG51bWJlcgorICogY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhhdCBpdCBpcyBzdGlsbCB2YWxpZC4gIEl0IHBsYWNlcyB0aGVtIGluIHRoZQorICogZmlsZWhhbmRsZSBmcmFnbWVudCB3aGVyZSBleHBvcnRfZGVjb2RlX2ZoIGV4cGVjdHMgdG8gZmluZCB0aGVtLgorICovCitzdGF0aWMgaW50IGV4cG9ydF9lbmNvZGVfZmgoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBfX3UzMiAqZmgsIGludCAqbWF4X2xlbiwKKwkJICAgaW50IGNvbm5lY3RhYmxlKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBsZW4gPSAqbWF4X2xlbjsKKwlpbnQgdHlwZSA9IDE7CisJCisJaWYgKGxlbiA8IDIgfHwgKGNvbm5lY3RhYmxlICYmIGxlbiA8IDQpKQorCQlyZXR1cm4gMjU1OworCisJbGVuID0gMjsKKwlmaFswXSA9IGlub2RlLT5pX2lubzsKKwlmaFsxXSA9IGlub2RlLT5pX2dlbmVyYXRpb247CisJaWYgKGNvbm5lY3RhYmxlICYmICFTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCXN0cnVjdCBpbm9kZSAqcGFyZW50OworCisJCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCQlwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCQlmaFsyXSA9IHBhcmVudC0+aV9pbm87CisJCWZoWzNdID0gcGFyZW50LT5pX2dlbmVyYXRpb247CisJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCWxlbiA9IDQ7CisJCXR5cGUgPSAyOworCX0KKwkqbWF4X2xlbiA9IGxlbjsKKwlyZXR1cm4gdHlwZTsKK30KKworCisvKioKKyAqIGV4cG9ydF9kZWNvZGVfZmggLSBkZWZhdWx0IGV4cG9ydF9vcGVyYXRpb25zLT5kZWNvZGVfZmggZnVuY3Rpb24KKyAqIEBzYjogIFRoZSBzdXBlcmJsb2NrCisgKiBAZmg6ICBwb2ludGVyIHRvIHRoZSBmaWxlIGhhbmRsZSBmcmFnbWVudAorICogQGZoX2xlbjogbGVuZ3RoIG9mIGZpbGUgaGFuZGxlIGZyYWdtZW50CisgKiBAYWNjZXB0YWJsZTogZnVuY3Rpb24gZm9yIHRlc3RpbmcgYWNjZXB0YWJpbGl0eSBvZiBkZW50cnlzCisgKiBAY29udGV4dDogICBjb250ZXh0IGZvciBAYWNjZXB0YWJsZQorICoKKyAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgZGVjb2RlX2ZoKCkgZnVuY3Rpb24uCisgKiBhIGZpbGVpZF90eXBlIG9mIDEgaW5kaWNhdGVzIHRoYXQgdGhlIGZpbGVoYW5kbGVmcmFnbWVudAorICoganVzdCBjb250YWlucyBhbiBvYmplY3QgaWRlbnRpZmllciB1bmRlcnN0b29kIGJ5ICBnZXRfZGVudHJ5LgorICogYSBmaWxlaWRfdHlwZSBvZiAyIHNheXMgdGhhdCB0aGVyZSBpcyBhbHNvIGEgZGlyZWN0b3J5CisgKiBpZGVudGlmaWVyIDggYnl0ZXMgaW4gdG8gdGhlIGZpbGVoYW5kbGVmcmFnZW1lbnQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpleHBvcnRfZGVjb2RlX2ZoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIF9fdTMyICpmaCwgaW50IGZoX2xlbiwKKwkJCSAgICAgIGludCBmaWxlaWRfdHlwZSwKKwkJCSBpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCisJCQkgdm9pZCAqY29udGV4dCkKK3sKKwlfX3UzMiBwYXJlbnRbMl07CisJcGFyZW50WzBdID0gcGFyZW50WzFdID0gMDsKKwlpZiAoZmhfbGVuIDwgMiB8fCBmaWxlaWRfdHlwZSA+IDIpCisJCXJldHVybiBOVUxMOworCWlmIChmaWxlaWRfdHlwZSA9PSAyKSB7CisJCWlmIChmaF9sZW4gPiAyKSBwYXJlbnRbMF0gPSBmaFsyXTsKKwkJaWYgKGZoX2xlbiA+IDMpIHBhcmVudFsxXSA9IGZoWzNdOworCX0KKwlyZXR1cm4gZmluZF9leHBvcnRlZF9kZW50cnkoc2IsIGZoLCBwYXJlbnQsCisJCQkJICAgYWNjZXB0YWJsZSwgY29udGV4dCk7Cit9CisKK3N0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBleHBvcnRfb3BfZGVmYXVsdCA9IHsKKwkuZGVjb2RlX2ZoCT0gZXhwb3J0X2RlY29kZV9maCwKKwkuZW5jb2RlX2ZoCT0gZXhwb3J0X2VuY29kZV9maCwKKworCS5nZXRfbmFtZQk9IGdldF9uYW1lLAorCS5nZXRfcGFyZW50CT0gZ2V0X3BhcmVudCwKKwkuZ2V0X2RlbnRyeQk9IGdldF9vYmplY3QsCit9OworCitFWFBPUlRfU1lNQk9MKGV4cG9ydF9vcF9kZWZhdWx0KTsKK0VYUE9SVF9TWU1CT0woZmluZF9leHBvcnRlZF9kZW50cnkpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9leHQyL0NIQU5HRVMgYi9mcy9leHQyL0NIQU5HRVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE1YWFmMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDIvQ0hBTkdFUwpAQCAtMCwwICsxLDE1NyBAQAorQ2hhbmdlcyBmcm9tIHZlcnNpb24gMC41YSB0byB2ZXJzaW9uIDAuNWIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLSBOb3cgdGhhdCB3ZSBoYXZlIHN5c2N0bCgpLCB0aGUgaW1tdXRhYmxlIGZsYWcgY2Fubm90IGJlIGNoYW5nZWQgd2hlbgorCSAgdGhlIHN5c3RlbSBpcyBydW5uaW5nIGF0IHNlY3VyaXR5IGxldmVsID4gMC4KKwktIFNvbWUgY2xlYW51cHMgaW4gdGhlIGNvZGUuCisJLSBNb3JlIGNvbnNpc3RlbmN5IGNoZWNrcyBvbiBkaXJlY3Rvcmllcy4KKwktIFRoZSBleHQyLmRpZmYgcGF0Y2ggZnJvbSBUb20gTWF5IDxmdG9tQG5ldGNvbS5jb20+IGhhcyBiZWVuCisJICBpbnRlZ3JhdGVkLiAgVGhpcyBwYXRjaCByZXBsYWNlcyBleHBlbnNpdmUgIi8iIGFuZCAiJSIgd2l0aAorCSAgY2hlYXAgIj4+IiBhbmQgIiYiIHdoZXJlIHBvc3NpYmxlLgorCitDaGFuZ2VzIGZyb20gdmVyc2lvbiAwLjUgdG8gdmVyc2lvbiAwLjVhCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLSBaZXJvIHRoZSBwYXJ0aWFsIGJsb2NrIGZvbGxvd2luZyB0aGUgZW5kIG9mIHRoZSBmaWxlIHdoZW4gYSBmaWxlCisJICBpcyB0cnVuY2F0ZWQuCisJLSBEYXRlcyB1cGRhdGVkIGluIHRoZSBjb3B5cmlnaHQuCisJLSBNb3JlIGNoZWNrcyB3aGVuIHRoZSBmaWxlc3lzdGVtIGlzIG1vdW50ZWQ6IHRoZSBjb3VudCBvZiBibG9ja3MsCisJICBmcmFnbWVudHMsIGFuZCBpbm9kZXMgcGVyIGdyb3VwIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgYmxvY2sgc2l6ZS4KKwktIFRoZSBidWZmZXJzIHVzZWQgYnkgdGhlIGVycm9yIHJvdXRpbmVzIGFyZSBub3cgc3RhdGljIHZhcmlhYmxlcywgdG8KKwkgIGF2b2lkIHVzaW5nIHNwYWNlIG9uIHRoZSBrZXJuZWwgc3RhY2ssIGFzIHJlcXVlc3RlZCBieSBMaW51cy4KKwktIFNvbWUgY2xlYW51cHMgaW4gdGhlIGVycm9yIG1lc3NhZ2VzIChzb21lIHZlcnNpb25zIG9mIHN5c2xvZyBjb250YWluCisJICBhIGJ1ZyB3aGljaCB0cnVuY2F0ZXMgYW4gZXJyb3IgbWVzc2FnZSBpZiBpdCBjb250YWlucyAnXG4nKS4KKwktIENoZWNrIHRoYXQgbm8gZGF0YSBjYW4gYmUgd3JpdHRlbiB0byBhIGZpbGUgcGFzdCB0aGUgMkdCIGxpbWl0LgorCS0gVGhlIGZhbW91cyByZWFkZGlyKCkgYnVnIGhhcyBiZWVuIGZpeGVkIGJ5IFN0ZXBoZW4gVHdlZWRpZS4KKwktIEFkZGVkIGEgcmV2aXNpb24gbGV2ZWwgaW4gdGhlIHN1cGVyYmxvY2suCisJLSBGdWxsIHN1cHBvcnQgZm9yIE9fU1lOQyBmbGFnIG9mIHRoZSBvcGVuIHN5c3RlbSBjYWxsLgorCS0gTmV3IG1vdW50IG9wdGlvbnM6IGByZXN1aWQ9I3VpZCcgYW5kIGByZXNnaWQ9I2dpZCcuICBgcmVzdWlkJyBjYXVzZXMKKwkgIGV4dDJmcyB0byBjb25zaWRlciB1c2VyICN1aWQgbGlrZSByb290IGZvciB0aGUgcmVzZXJ2ZWQgYmxvY2tzLgorCSAgYHJlc2dpZCcgYWN0cyB0aGUgc2FtZSB3YXkgd2l0aCBncm91cCAjZ2lkLiAgTmV3IGZpZWxkcyBpbiB0aGUKKwkgIHN1cGVyYmxvY2sgY29udGFpbiBkZWZhdWx0IHZhbHVlcyBmb3IgcmVzdWlkIGFuZCByZXNnaWQgYW5kIGNhbgorCSAgYmUgbW9kaWZpZWQgYnkgdHVuZTJmcy4KKwkgIElkZWEgY29tZXMgZnJvbSBSZW5lIENvdWduZW5jIDxjb3VnbmVuY0ByZW51eC5mcm11Zy5mci5uZXQ+LgorCS0gTmV3IG1vdW50IG9wdGlvbnM6IGBic2RkZicgYW5kIGBtaW5peGRmJy4gIGBic2RkZicgY2F1c2VzIGV4dDJmcworCSAgdG8gcmVtb3ZlIHRoZSBibG9ja3MgdXNlZCBmb3IgRlMgc3RydWN0dXJlcyBmcm9tIHRoZSB0b3RhbCBibG9jaworCSAgY291bnQgaW4gc3RhdGZzLiAgV2l0aCBgbWluaXhkZicsIGV4dDJmcyBtaW1pY3MgTWluaXggYmVoYXZpb3IKKwkgIGluIHN0YXRmcyAoaS5lLiBpdCByZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgYmxvY2tzIG9uIHRoZQorCSAgcGFydGl0aW9uKS4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gbWFrZSBiZGUgaGFwcHkgOi0pCisJLSBOZXcgZmlsZSBhdHRyaWJ1dGVzOgorCSAgLSBJbW11dGFibGUgZmlsZXMgY2Fubm90IGJlIG1vZGlmaWVkLiAgRGF0YSBjYW5ub3QgYmUgd3JpdHRlbiB0bworCSAgICB0aGVzZSBmaWxlcy4gIFRoZXkgY2Fubm90IGJlIHJlbW92ZWQsIHJlbmFtZWQgYW5kIG5ldyBsaW5rcyBjYW5ub3QKKwkgICAgYmUgY3JlYXRlZC4gIEV2ZW4gcm9vdCBjYW5ub3QgbW9kaWZ5IHRoZSBmaWxlcy4gIEhlIGhhcyB0byByZW1vdmUKKwkgICAgdGhlIGltbXV0YWJsZSBhdHRyaWJ1dGUgZmlyc3QuCisJICAtIEFwcGVuZC1vbmx5IGZpbGVzOiBjYW4gb25seSBiZSB3cml0dGVuIGluIGFwcGVuZC1tb2RlIHdoZW4gd3JpdGluZy4KKwkgICAgVGhleSBjYW5ub3QgYmUgcmVtb3ZlZCwgcmVuYW1lZCBhbmQgbmV3IGxpbmtzIGNhbm5vdCBiZSBjcmVhdGVkLgorCSAgICBOb3RlOiBmaWxlcyBtYXkgb25seSBiZSBhZGRlZCB0byBhbiBhcHBlbmQtb25seSBkaXJlY3RvcnkuCisJICAtIE5vLWR1bXAgZmlsZXM6IHRoZSBhdHRyaWJ1dGUgaXMgbm90IHVzZWQgYnkgdGhlIGtlcm5lbC4gIE15IHBvcnQKKwkgICAgb2YgZHVtcCB1c2VzIGl0IHRvIGF2b2lkIGJhY2tpbmcgdXAgZmlsZXMgd2hpY2ggYXJlIG5vdCBpbXBvcnRhbnQuCisJLSBOZXcgY2hlY2sgaW4gZXh0Ml9jaGVja19kaXJfZW50cnk6IHRoZSBpbm9kZSBudW1iZXIgaXMgY2hlY2tlZC4KKwktIFN1cHBvcnQgZm9yIGJpZyBmaWxlIHN5c3RlbXM6IHRoZSBjb3B5IG9mIHRoZSBGUyBkZXNjcmlwdG9yIGlzIG5vdworCSAgZHluYW1pY2FsbHkgYWxsb2NhdGVkIChwcmV2aW91cyB2ZXJzaW9ucyB1c2VkIGEgZml4ZWQgc2l6ZSBhcnJheSkuCisJICBUaGlzIGFsbG93cyB0byBtb3VudCAyR0IrIEZTLgorCS0gUmVvcmdhbml6YXRpb24gb2YgdGhlIGV4dDJfaW5vZGUgc3RydWN0dXJlIHRvIGFsbG93IG90aGVyIG9wZXJhdGluZworCSAgc3lzdGVtcyB0byBjcmVhdGUgc3BlY2lmaWMgZmllbGRzIGlmIHRoZXkgdXNlIGV4dDJmcyBhcyB0aGVpciBuYXRpdmUKKwkgIGZpbGUgc3lzdGVtLiAgQ3VycmVudGx5LCBleHQyZnMgaXMgb25seSBpbXBsZW1lbnRlZCBpbiBMaW51eCBidXQKKwkgIHdpbGwgc29vbiBiZSBwYXJ0IG9mIEdudSBIdXJkIGFuZCBvZiBNYXNpeC4KKworQ2hhbmdlcyBmcm9tIHZlcnNpb24gMC40YiB0byB2ZXJzaW9uIDAuNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS0gTmV3IHN1cGVyYmxvY2sgZmllbGRzOiBzX2xhc3RjaGVjayBhbmQgc19jaGVja2ludGVydmFsIGFkZGVkCisJICBieSBVd2UgT2hzZSA8dXdlQHRpcmthLmd1bi5kZT4gdG8gaW1wbGVtZW50IHRpbWVkZXBlbmRlbnQgY2hlY2tzCisJICBvZiB0aGUgZmlsZSBzeXN0ZW0KKwktIFJlYWwgcmFuZG9tIG51bWJlcnMgZm9yIHNlY3VyZSBybSBhZGRlZCBieSBQaWVycmUgZGVsIFBlcnVnaWEKKwkgIDxkZWxwZXJ1Z0BnbGEuZWNvbGVkb2MuaWJwLmZyPgorCS0gVGhlIG1vdW50IHdhcm5pbmdzIHJlbGF0ZWQgdG8gdGhlIHN0YXRlIG9mIGEgZnMgYXJlIG5vdCBwcmludGVkCisJICBpZiB0aGUgZnMgaXMgbW91bnRlZCByZWFkLW9ubHksIGlkZWEgYnkgTmljayBIb2xsb3dheQorCSAgPGFsZmllQGRjcy53YXJ3aWNrLmFjLnVrPgorCitDaGFuZ2VzIGZyb20gdmVyc2lvbiAwLjRhIHRvIHZlcnNpb24gMC40YgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwktIENvcHlyaWdodHMgY2hhbmdlZCB0byBpbmNsdWRlIHRoZSBuYW1lIG9mIG15IGxhYm9yYXRvcnkuCisJLSBDbGVhbiB1cCBvZiBiYWxsb2MuYyBhbmQgaWFsbG9jLmMuCisJLSBNb3JlIGNvbnNpc3RlbmN5IGNoZWNrcy4KKwktIEJsb2NrIHByZWFsbG9jYXRpb24gYWRkZWQgYnkgU3RlcGhlbiBUd2VlZGllLgorCS0gRGlyZWN0IHJlYWRzIG9mIGRpcmVjdG9yaWVzIGRpc2FsbG93ZWQuCisJLSBSZWFkYWhlYWQgaW1wbGVtZW50ZWQgaW4gcmVhZGRpciBieSBTdGVwaGVuIFR3ZWVkaWUuCisJLSBCdWdzIGluIGJsb2NrIGFuZCBpbm9kZXMgYWxsb2NhdGlvbiBmaXhlZC4KKwktIFJlYWRhaGVhZCBpbXBsZW1lbnRlZCBpbiBleHQyX2ZpbmRfZW50cnkgYnkgQ2hpcCBTYWx6ZW5iZXJnLgorCS0gTmV3IG1vdW50IG9wdGlvbnM6CisJICBgY2hlY2s9bm9uZXxub3JtYWx8c3RyaWN0JworCSAgYGRlYnVnJworCSAgYGVycm9ycz1jb250aW51ZXxyZW1vdW50LXJvfHBhbmljJworCSAgYGdycGlkJywgYGJzZGdyb3VwcycKKwkgIGBub2NoZWNrJworCSAgYG5vZ3JwaWQnLCBgc3lzdmdyb3VwcycKKwktIHRydW5jYXRlKCkgbm93IHRyaWVzIHRvIGRlYWxsb2NhdGUgY29udGlndW91cyBibG9ja3MgaW4gYSBzaW5nbGUgY2FsbAorCSAgdG8gZXh0Ml9mcmVlX2Jsb2NrcygpLgorCS0gbG90cyBvZiBjb3NtZXRpYyBjaGFuZ2VzLgorCitDaGFuZ2VzIGZyb20gdmVyc2lvbiAwLjQgdG8gdmVyc2lvbiAwLjRhCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIC0gdGhlIGBzeW5jJyBvcHRpb24gc3VwcG9ydCBpcyBub3cgY29tcGxldGUuICBWZXJzaW9uIDAuNCB3YXMgbm90CisgICAgICAgICAgc3VwcG9ydGluZyBpdCB3aGVuIHRydW5jYXRpbmcgYSBmaWxlLiAgSSBoYXZlIHRlc3RlZCB0aGUgc3luY2hyb25vdXMKKyAgICAgICAgICB3cml0ZXMgYW5kIHRoZXkgd29yayBidXQgdGhleSBtYWtlIHRoZSBzeXN0ZW0gdmVyeSBzbG93IDotKCAgSSBoYXZlCisgICAgICAgICAgdG8gd29yayBhZ2FpbiBvbiB0aGlzIHRvIG1ha2UgaXQgZmFzdGVyLgorICAgICAgICAtIHdoZW4gZGV0ZWN0aW5nIGFuIGVycm9yIG9uIGEgbW91bnRlZCBmaWxlc3lzdGVtLCB2ZXJzaW9uIDAuNCB1c2VkCisgICAgICAgICAgdG8gdHJ5IHRvIHdyaXRlIGEgZmxhZyBpbiB0aGUgc3VwZXIgYmxvY2sgZXZlbiBpZiB0aGUgZmlsZXN5c3RlbSBoYWQKKyAgICAgICAgICBiZWVuIG1vdW50ZWQgcmVhZC1vbmx5LiAgVGhpcyBpcyBmaXhlZC4KKyAgICAgICAgLSB0aGUgYHNiPSMnIG9wdGlvbiBub3cgY2F1c2VzIHRoZSBrZXJuZWwgY29kZSB0byB1c2UgdGhlIGZpbGVzeXN0ZW0KKyAgICAgICAgICBkZXNjcmlwdG9ycyBsb2NhdGVkIGF0IGJsb2NrICMrMS4gIFZlcnNpb24gMC40IHVzZWQgdGhlIHN1cGVyYmxvY2sKKyAgICAgICAgICBiYWNrdXAgbG9jYXRlZCBhdCBibG9jayAjIGJ1dCB1c2VkIHRoZSBtYWluIGNvcHkgb2YgdGhlIGRlc2NyaXB0b3JzLgorICAgICAgICAtIGEgbmV3IGZpbGUgYXR0cmlidXRlIGBTJyBpcyBzdXBwb3J0ZWQuICBUaGlzIGF0dHJpYnV0ZSBjYXVzZXMKKyAgICAgICAgICBzeW5jaHJvbm91cyB3cml0ZXMgYnV0IGlzIGFwcGxpZWQgdG8gYSBmaWxlIG5vdCB0byB0aGUgZW50aXJlIGZpbGUKKyAgICAgICAgICBzeXN0ZW0gKHRoYW5rcyB0byBNaWNoYWVsIEtyYWVoZSA8a3JhZWhlQGJha3VuaW4ubm9ydGguZGU+IGZvcgorICAgICAgICAgIHN1Z2dlc3RpbmcgaXQpLgorICAgICAgICAtIHRoZSBkaXJlY3RvcnkgY2FjaGUgaXMgaW5oaWJpdGVkIGJ5IGRlZmF1bHQuICBUaGUgY2FjaGUgbWFuYWdlbWVudAorICAgICAgICAgIGNvZGUgc2VlbXMgdG8gYmUgYnVnZ3kgYW5kIEkgaGF2ZSB0byBsb29rIGF0IGl0IGNhcmVmdWxseSBiZWZvcmUKKyAgICAgICAgICB1c2luZyBpdCBhZ2Fpbi4KKyAgICAgICAgLSBkZWxldGluZyBhIGZpbGUgd2l0aCB0aGUgYHMnIGF0dHJpYnV0ZSAoc2VjdXJlIGRlbGV0aW9uKSBjYXVzZXMgaXRzCisgICAgICAgICAgYmxvY2tzIHRvIGJlIG92ZXJ3cml0dGVuIHdpdGggcmFuZG9tIHZhbHVlcyBub3Qgd2l0aCB6ZXJvcyAodGhhbmtzIHRvCisgICAgICAgICAgTWljaGFlbCBBLiBHcmlmZml0aCA8Z3JpZkBjcy51Y3IuZWR1PiBmb3Igc3VnZ2VzdGluZyBpdCkuCisgICAgICAgIC0gbG90cyBvZiBjb3NtZXRpYyBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLgorCitDaGFuZ2VzIGZyb20gdmVyc2lvbiAwLjMgdG8gdmVyc2lvbiAwLjQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAtIFRocmVlIG5ldyBtb3VudCBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6IGBjaGVjaycsIGBzeW5jJyBhbmQgYHNiPSMnLgorICAgICAgICAgIGBjaGVjaycgdGVsbHMgdGhlIGtlcm5lbCBjb2RlIHRvIG1ha2UgbW9yZSBjb25zaXN0ZW5jeSBjaGVja3MKKyAgICAgICAgICB3aGVuIHRoZSBmaWxlIHN5c3RlbSBpcyBtb3VudGVkLiAgQ3VycmVudGx5LCB0aGUga2VybmVsIGNvZGUgY2hlY2tzCisgICAgICAgICAgdGhhdCB0aGUgYmxvY2tzIGFuZCBpbm9kZXMgYml0bWFwcyBhcmUgY29uc2lzdGVudCB3aXRoIHRoZSBmcmVlCisgICAgICAgICAgYmxvY2tzIGFuZCBpbm9kZXMgY291bnRzLiAgTW9yZSBjaGVja3Mgd2lsbCBiZSBhZGRlZCBpbiBmdXR1cmUKKyAgICAgICAgICByZWxlYXNlcy4KKyAgICAgICAgICBgc3luYycgdGVsbHMgdGhlIGtlcm5lbCBjb2RlIHRvIHVzZSBzeW5jaHJvbm91cyB3cml0ZXMgd2hlbiB1cGRhdGluZworICAgICAgICAgIGFuIGlub2RlLCBhIGJpdG1hcCwgYSBkaXJlY3RvcnkgZW50cnkgb3IgYW4gaW5kaXJlY3QgYmxvY2suICBUaGlzCisgICAgICAgICAgY2FuIG1ha2UgdGhlIGZpbGUgc3lzdGVtIG11Y2ggc2xvd2VyIGJ1dCBjYW4gYmUgYSBiaWcgd2luIGZvciBmaWxlcworICAgICAgICAgIHJlY292ZXJ5IGluIGNhc2Ugb2YgYSBjcmFzaCAoYW5kIHdlIGNhbiBub3cgc2F5IHRvIHRoZSBCU0QgZm9sa3MKKyAgICAgICAgICB0aGF0IExpbnV4IGFsc28gc3VwcG9ydHMgc3luY2hyb25vdXMgdXBkYXRlcyA6LSkuCisgICAgICAgICAgYHNiPSMnIHRlbGxzIHRoZSBrZXJuZWwgY29kZSB0byB1c2UgYW4gYWx0ZXJuYXRlIHN1cGVyIGJsb2NrIGluc3RlYWQKKyAgICAgICAgICBvZiBpdHMgbWFzdGVyIGNvcHkuICBgIycgaXMgdGhlIG51bWJlciBvZiB0aGUgYmxvY2sgKGNvdW50ZWQgaW4KKyAgICAgICAgICAxMDI0IGJ5dGVzIGJsb2Nrcykgd2hpY2ggY29udGFpbnMgdGhlIGFsdGVybmF0ZSBzdXBlciBibG9jay4KKyAgICAgICAgICBBbiBleHQyIGZpbGUgc3lzdGVtIHR5cGljYWxseSBjb250YWlucyBiYWNrdXBzIG9mIHRoZSBzdXBlciBibG9jaworICAgICAgICAgIGF0IGJsb2NrcyA4MTkzLCAxNjM4NSwgYW5kIHNvIG9uLgorICAgICAgICAtIEkgaGF2ZSBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgdGhlIHZhbGlkIGZsYWcgdXNlZCBieSBlMmZzY2suICBpdAorICAgICAgICAgIG5vdyBjb250YWlucyB0aGUgc3RhdGUgb2YgdGhlIGZpbGUgc3lzdGVtLiAgSWYgdGhlIGtlcm5lbCBjb2RlCisgICAgICAgICAgZGV0ZWN0cyBhbiBpbmNvbnNpc3RlbmN5IHdoaWxlIHRoZSBmaWxlIHN5c3RlbSBpcyBtb3VudGVkLCBpdCBmbGFncworICAgICAgICAgIGl0IGFzIGVycm9uZW91cyBhbmQgZTJmc2NrIHdpbGwgZGV0ZWN0IHRoYXQgb24gbmV4dCBydW4uCisgICAgICAgIC0gVGhlIHN1cGVyIGJsb2NrIG5vdyBjb250YWlucyBhIG1vdW50IGNvdW50ZXIuICBUaGlzIGNvdW50ZXIgaXMKKyAgICAgICAgICBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgdGhlIGZpbGUgc3lzdGVtIGlzIG1vdW50ZWQgcmVhZC93cml0ZS4gICBXaGVuCisgICAgICAgICAgdGhpcyBjb3VudGVyIGJlY29tZXMgYmlnZ2VyIHRoYW4gYSBtYXhpbWFsIG1vdW50IGNvdW50cyAoYWxzbyBzdG9yZWQKKyAgICAgICAgICBpbiB0aGUgc3VwZXIgYmxvY2spLCBlMmZzY2sgY2hlY2tzIHRoZSBmaWxlIHN5c3RlbSwgZXZlbiBpZiBpdCBoYWQKKyAgICAgICAgICBiZWVuIHVubW91bnRlZCBjbGVhbmx5LCBhbmQgcmVzZXRzIHRoaXMgY291bnRlciB0byAwLgorICAgICAgICAtIEZpbGUgYXR0cmlidXRlcyBhcmUgbm93IHN1cHBvcnRlZC4gIE9uZSBjYW4gYXNzb2NpYXRlIGEgc2V0IG9mCisgICAgICAgICAgYXR0cmlidXRlcyB0byBhIGZpbGUuICBUaHJlZSBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkOgorICAgICAgICAgIGBjJzogdGhlIGZpbGUgaXMgbWFya2VkIGZvciBhdXRvbWF0aWMgY29tcHJlc3Npb24sCisgICAgICAgICAgYHMnOiB0aGUgZmlsZSBpcyBtYXJrZWQgZm9yIHNlY3VyZSBkZWxldGlvbjogd2hlbiB0aGUgZmlsZSBpcworICAgICAgICAgIGRlbGV0ZWQsIGl0cyBibG9ja3MgYXJlIHplcm9lZCBhbmQgd3JpdHRlbiBiYWNrIHRvIHRoZSBkaXNrLAorICAgICAgICAgIGB1JzogdGhlIGZpbGUgaXMgbWFya2VkIGZvciB1bmRlbGV0aW9uOiB3aGVuIHRoZSBmaWxlIGlzIGRlbGV0ZWQsCisgICAgICAgICAgaXRzIGNvbnRlbnRzIGFyZSBzYXZlZCB0byBhbGxvdyBhIGZ1dHVyZSB1bmRlbGV0aW9uLgorICAgICAgICAgIEN1cnJlbnRseSwgb25seSB0aGUgYHMnIGF0dHJpYnV0ZSBpcyBpbXBsZW1lbnRlZCBpbiB0aGUga2VybmVsCisgICAgICAgICAgY29kZS4gIFN1cHBvcnQgZm9yIHRoZSBvdGhlciBhdHRyaWJ1dGVzIHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUKKyAgICAgICAgICByZWxlYXNlLgorICAgICAgICAtIGEgZmV3IGJ1Z3MgcmVsYXRlZCB0byB0aW1lcyB1cGRhdGVzIGhhdmUgYmVlbiBmaXhlZCBieSBCcnVjZQorICAgICAgICAgIEV2YW5zIGFuZCBtZS4KKyAgICAgICAgLSBhIGJ1ZyByZWxhdGVkIHRvIHRoZSBsaW5rcyBjb3VudCBvZiBkZWxldGVkIGlub2RlcyBoYXMgYmVlbiBmaXhlZC4KKyAgICAgICAgICBQcmV2aW91cyB2ZXJzaW9ucyB1c2VkIHRvIGtlZXAgdGhlIGxpbmtzIGNvdW50IHNldCB0byAxIHdoZW4gYSBmaWxlCisgICAgICAgICAgd2FzIGRlbGV0ZWQuICBUaGUgbmV3IHZlcnNpb24gbm93IHNldHMgbGlua3NfY291bnQgdG8gMCB3aGVuIGRlbGV0aW5nCisgICAgICAgICAgdGhlIGxhc3QgbGluay4KKyAgICAgICAgLSBhIHJhY2UgY29uZGl0aW9uIHdoZW4gZGVhbGxvY2F0aW5nIGFuIGlub2RlIGhhcyBiZWVuIGZpeGVkIGJ5CisgICAgICAgICAgU3RlcGhlbiBUd2VlZGllLgorCmRpZmYgLS1naXQgYS9mcy9leHQyL01ha2VmaWxlIGIvZnMvZXh0Mi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTI0MGExCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0Mi9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggZXh0Mi1maWxlc3lzdGVtIHJvdXRpbmVzLgorIworCitvYmotJChDT05GSUdfRVhUMl9GUykgKz0gZXh0Mi5vCisKK2V4dDIteSA6PSBiYWxsb2MubyBiaXRtYXAubyBkaXIubyBmaWxlLm8gZnN5bmMubyBpYWxsb2MubyBpbm9kZS5vIFwKKwkgIGlvY3RsLm8gbmFtZWkubyBzdXBlci5vIHN5bWxpbmsubworCitleHQyLSQoQ09ORklHX0VYVDJfRlNfWEFUVFIpCSArPSB4YXR0ci5vIHhhdHRyX3VzZXIubyB4YXR0cl90cnVzdGVkLm8KK2V4dDItJChDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0wpICs9IGFjbC5vCitleHQyLSQoQ09ORklHX0VYVDJfRlNfU0VDVVJJVFkpCSArPSB4YXR0cl9zZWN1cml0eS5vCmRpZmYgLS1naXQgYS9mcy9leHQyL2FjbC5jIGIvZnMvZXh0Mi9hY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzY5ZWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0Mi9hY2wuYwpAQCAtMCwwICsxLDUxOCBAQAorLyoKKyAqIGxpbnV4L2ZzL2V4dDIvYWNsLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBBbmRyZWFzIEdydWVuYmFjaGVyLCA8YWdydWVuQHN1c2UuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgImV4dDIuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImFjbC5oIgorCisvKgorICogQ29udmVydCBmcm9tIGZpbGVzeXN0ZW0gdG8gaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uLgorICovCitzdGF0aWMgc3RydWN0IHBvc2l4X2FjbCAqCitleHQyX2FjbF9mcm9tX2Rpc2soY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplKQoreworCWNvbnN0IGNoYXIgKmVuZCA9IChjaGFyICopdmFsdWUgKyBzaXplOworCWludCBuLCBjb3VudDsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisKKwlpZiAoIXZhbHVlKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoc2l6ZSA8IHNpemVvZihleHQyX2FjbF9oZWFkZXIpKQorCQkgcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKCgoZXh0Ml9hY2xfaGVhZGVyICopdmFsdWUpLT5hX3ZlcnNpb24gIT0KKwkgICAgY3B1X3RvX2xlMzIoRVhUMl9BQ0xfVkVSU0lPTikpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCXZhbHVlID0gKGNoYXIgKil2YWx1ZSArIHNpemVvZihleHQyX2FjbF9oZWFkZXIpOworCWNvdW50ID0gZXh0Ml9hY2xfY291bnQoc2l6ZSk7CisJaWYgKGNvdW50IDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiBOVUxMOworCWFjbCA9IHBvc2l4X2FjbF9hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhY2wpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWZvciAobj0wOyBuIDwgY291bnQ7IG4rKykgeworCQlleHQyX2FjbF9lbnRyeSAqZW50cnkgPQorCQkJKGV4dDJfYWNsX2VudHJ5ICopdmFsdWU7CisJCWlmICgoY2hhciAqKXZhbHVlICsgc2l6ZW9mKGV4dDJfYWNsX2VudHJ5X3Nob3J0KSA+IGVuZCkKKwkJCWdvdG8gZmFpbDsKKwkJYWNsLT5hX2VudHJpZXNbbl0uZV90YWcgID0gbGUxNl90b19jcHUoZW50cnktPmVfdGFnKTsKKwkJYWNsLT5hX2VudHJpZXNbbl0uZV9wZXJtID0gbGUxNl90b19jcHUoZW50cnktPmVfcGVybSk7CisJCXN3aXRjaChhY2wtPmFfZW50cmllc1tuXS5lX3RhZykgeworCQkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCQljYXNlIEFDTF9HUk9VUF9PQko6CisJCQljYXNlIEFDTF9NQVNLOgorCQkJY2FzZSBBQ0xfT1RIRVI6CisJCQkJdmFsdWUgPSAoY2hhciAqKXZhbHVlICsKKwkJCQkJc2l6ZW9mKGV4dDJfYWNsX2VudHJ5X3Nob3J0KTsKKwkJCQlhY2wtPmFfZW50cmllc1tuXS5lX2lkID0gQUNMX1VOREVGSU5FRF9JRDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBQ0xfVVNFUjoKKwkJCWNhc2UgQUNMX0dST1VQOgorCQkJCXZhbHVlID0gKGNoYXIgKil2YWx1ZSArIHNpemVvZihleHQyX2FjbF9lbnRyeSk7CisJCQkJaWYgKChjaGFyICopdmFsdWUgPiBlbmQpCisJCQkJCWdvdG8gZmFpbDsKKwkJCQlhY2wtPmFfZW50cmllc1tuXS5lX2lkID0KKwkJCQkJbGUzMl90b19jcHUoZW50cnktPmVfaWQpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKwlpZiAodmFsdWUgIT0gZW5kKQorCQlnb3RvIGZhaWw7CisJcmV0dXJuIGFjbDsKKworZmFpbDoKKwlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworfQorCisvKgorICogQ29udmVydCBmcm9tIGluLW1lbW9yeSB0byBmaWxlc3lzdGVtIHJlcHJlc2VudGF0aW9uLgorICovCitzdGF0aWMgdm9pZCAqCitleHQyX2FjbF90b19kaXNrKGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgc2l6ZV90ICpzaXplKQoreworCWV4dDJfYWNsX2hlYWRlciAqZXh0X2FjbDsKKwljaGFyICplOworCXNpemVfdCBuOworCisJKnNpemUgPSBleHQyX2FjbF9zaXplKGFjbC0+YV9jb3VudCk7CisJZXh0X2FjbCA9IChleHQyX2FjbF9oZWFkZXIgKilrbWFsbG9jKHNpemVvZihleHQyX2FjbF9oZWFkZXIpICsKKwkJYWNsLT5hX2NvdW50ICogc2l6ZW9mKGV4dDJfYWNsX2VudHJ5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFleHRfYWNsKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlleHRfYWNsLT5hX3ZlcnNpb24gPSBjcHVfdG9fbGUzMihFWFQyX0FDTF9WRVJTSU9OKTsKKwllID0gKGNoYXIgKilleHRfYWNsICsgc2l6ZW9mKGV4dDJfYWNsX2hlYWRlcik7CisJZm9yIChuPTA7IG4gPCBhY2wtPmFfY291bnQ7IG4rKykgeworCQlleHQyX2FjbF9lbnRyeSAqZW50cnkgPSAoZXh0Ml9hY2xfZW50cnkgKillOworCQllbnRyeS0+ZV90YWcgID0gY3B1X3RvX2xlMTYoYWNsLT5hX2VudHJpZXNbbl0uZV90YWcpOworCQllbnRyeS0+ZV9wZXJtID0gY3B1X3RvX2xlMTYoYWNsLT5hX2VudHJpZXNbbl0uZV9wZXJtKTsKKwkJc3dpdGNoKGFjbC0+YV9lbnRyaWVzW25dLmVfdGFnKSB7CisJCQljYXNlIEFDTF9VU0VSOgorCQkJY2FzZSBBQ0xfR1JPVVA6CisJCQkJZW50cnktPmVfaWQgPQorCQkJCQljcHVfdG9fbGUzMihhY2wtPmFfZW50cmllc1tuXS5lX2lkKTsKKwkJCQllICs9IHNpemVvZihleHQyX2FjbF9lbnRyeSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNMX1VTRVJfT0JKOgorCQkJY2FzZSBBQ0xfR1JPVVBfT0JKOgorCQkJY2FzZSBBQ0xfTUFTSzoKKwkJCWNhc2UgQUNMX09USEVSOgorCQkJCWUgKz0gc2l6ZW9mKGV4dDJfYWNsX2VudHJ5X3Nob3J0KTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisJcmV0dXJuIChjaGFyICopZXh0X2FjbDsKKworZmFpbDoKKwlrZnJlZShleHRfYWNsKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcG9zaXhfYWNsICoKK2V4dDJfaWdldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBvc2l4X2FjbCAqKmlfYWNsKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IEVYVDJfQUNMX05PVF9DQUNIRUQ7CisKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCWlmICgqaV9hY2wgIT0gRVhUMl9BQ0xfTk9UX0NBQ0hFRCkKKwkJYWNsID0gcG9zaXhfYWNsX2R1cCgqaV9hY2wpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKworCXJldHVybiBhY2w7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZXh0Ml9pc2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcG9zaXhfYWNsICoqaV9hY2wsCisJCSAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCkKK3sKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCWlmICgqaV9hY2wgIT0gRVhUMl9BQ0xfTk9UX0NBQ0hFRCkKKwkJcG9zaXhfYWNsX3JlbGVhc2UoKmlfYWNsKTsKKwkqaV9hY2wgPSBwb3NpeF9hY2xfZHVwKGFjbCk7CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworfQorCisvKgorICogaW5vZGUtPmlfc2VtOiBkb24ndCBjYXJlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcG9zaXhfYWNsICoKK2V4dDJfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvICplaSA9IEVYVDJfSShpbm9kZSk7CisJaW50IG5hbWVfaW5kZXg7CisJY2hhciAqdmFsdWUgPSBOVUxMOworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwlpbnQgcmV0dmFsOworCisJaWYgKCF0ZXN0X29wdChpbm9kZS0+aV9zYiwgUE9TSVhfQUNMKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzd2l0Y2godHlwZSkgeworCQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKKwkJCWFjbCA9IGV4dDJfaWdldF9hY2woaW5vZGUsICZlaS0+aV9hY2wpOworCQkJaWYgKGFjbCAhPSBFWFQyX0FDTF9OT1RfQ0FDSEVEKQorCQkJCXJldHVybiBhY2w7CisJCQluYW1lX2luZGV4ID0gRVhUMl9YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfQUNDRVNTOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgorCQkJYWNsID0gZXh0Ml9pZ2V0X2FjbChpbm9kZSwgJmVpLT5pX2RlZmF1bHRfYWNsKTsKKwkJCWlmIChhY2wgIT0gRVhUMl9BQ0xfTk9UX0NBQ0hFRCkKKwkJCQlyZXR1cm4gYWNsOworCQkJbmFtZV9pbmRleCA9IEVYVDJfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0RFRkFVTFQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCXJldHZhbCA9IGV4dDJfeGF0dHJfZ2V0KGlub2RlLCBuYW1lX2luZGV4LCAiIiwgTlVMTCwgMCk7CisJaWYgKHJldHZhbCA+IDApIHsKKwkJdmFsdWUgPSBrbWFsbG9jKHJldHZhbCwgR0ZQX0tFUk5FTCk7CisJCWlmICghdmFsdWUpCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJcmV0dmFsID0gZXh0Ml94YXR0cl9nZXQoaW5vZGUsIG5hbWVfaW5kZXgsICIiLCB2YWx1ZSwgcmV0dmFsKTsKKwl9CisJaWYgKHJldHZhbCA+IDApCisJCWFjbCA9IGV4dDJfYWNsX2Zyb21fZGlzayh2YWx1ZSwgcmV0dmFsKTsKKwllbHNlIGlmIChyZXR2YWwgPT0gLUVOT0RBVEEgfHwgcmV0dmFsID09IC1FTk9TWVMpCisJCWFjbCA9IE5VTEw7CisJZWxzZQorCQlhY2wgPSBFUlJfUFRSKHJldHZhbCk7CisJaWYgKHZhbHVlKQorCQlrZnJlZSh2YWx1ZSk7CisKKwlpZiAoIUlTX0VSUihhY2wpKSB7CisJCXN3aXRjaCh0eXBlKSB7CisJCQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKKwkJCQlleHQyX2lzZXRfYWNsKGlub2RlLCAmZWktPmlfYWNsLCBhY2wpOworCQkJCWJyZWFrOworCisJCQljYXNlIEFDTF9UWVBFX0RFRkFVTFQ6CisJCQkJZXh0Ml9pc2V0X2FjbChpbm9kZSwgJmVpLT5pX2RlZmF1bHRfYWNsLCBhY2wpOworCQkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBhY2w7Cit9CisKKy8qCisgKiBpbm9kZS0+aV9zZW06IGRvd24KKyAqLworc3RhdGljIGludAorZXh0Ml9zZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wpCit7CisJc3RydWN0IGV4dDJfaW5vZGVfaW5mbyAqZWkgPSBFWFQyX0koaW5vZGUpOworCWludCBuYW1lX2luZGV4OworCXZvaWQgKnZhbHVlID0gTlVMTDsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFBPU0lYX0FDTCkpCisJCXJldHVybiAwOworCisJc3dpdGNoKHR5cGUpIHsKKwkJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6CisJCQluYW1lX2luZGV4ID0gRVhUMl9YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfQUNDRVNTOworCQkJaWYgKGFjbCkgeworCQkJCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKKwkJCQllcnJvciA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJm1vZGUpOworCQkJCWlmIChlcnJvciA8IDApCisJCQkJCXJldHVybiBlcnJvcjsKKwkJCQllbHNlIHsKKwkJCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCQkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkJCQlpZiAoZXJyb3IgPT0gMCkKKwkJCQkJCWFjbCA9IE5VTEw7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgorCQkJbmFtZV9pbmRleCA9IEVYVDJfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0RFRkFVTFQ7CisJCQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCQkJcmV0dXJuIGFjbCA/IC1FQUNDRVMgOiAwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKyAJaWYgKGFjbCkgeworCQl2YWx1ZSA9IGV4dDJfYWNsX3RvX2Rpc2soYWNsLCAmc2l6ZSk7CisJCWlmIChJU19FUlIodmFsdWUpKQorCQkJcmV0dXJuIChpbnQpUFRSX0VSUih2YWx1ZSk7CisJfQorCisJZXJyb3IgPSBleHQyX3hhdHRyX3NldChpbm9kZSwgbmFtZV9pbmRleCwgIiIsIHZhbHVlLCBzaXplLCAwKTsKKworCWlmICh2YWx1ZSkKKwkJa2ZyZWUodmFsdWUpOworCWlmICghZXJyb3IpIHsKKwkJc3dpdGNoKHR5cGUpIHsKKwkJCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgorCQkJCWV4dDJfaXNldF9hY2woaW5vZGUsICZlaS0+aV9hY2wsIGFjbCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKKwkJCQlleHQyX2lzZXRfYWNsKGlub2RlLCAmZWktPmlfZGVmYXVsdF9hY2wsIGFjbCk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50CitleHQyX2NoZWNrX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKK3sKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2wgPSBleHQyX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7CisKKwlpZiAoYWNsKSB7CisJCWludCBlcnJvciA9IHBvc2l4X2FjbF9wZXJtaXNzaW9uKGlub2RlLCBhY2wsIG1hc2spOworCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcmV0dXJuIC1FQUdBSU47Cit9CisKK2ludAorZXh0Ml9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBleHQyX2NoZWNrX2FjbCk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBBQ0xzIG9mIGEgbmV3IGlub2RlLiBDYWxsZWQgZnJvbSBleHQyX25ld19pbm9kZS4KKyAqCisgKiBkaXItPmlfc2VtOiBkb3duCisgKiBpbm9kZS0+aV9zZW06IHVwIChhY2Nlc3MgdG8gaW5vZGUgaXMgc3RpbGwgZXhjbHVzaXZlKQorICovCitpbnQKK2V4dDJfaW5pdF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCit7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0gTlVMTDsKKwlpbnQgZXJyb3IgPSAwOworCisJaWYgKCFTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWlmICh0ZXN0X29wdChkaXItPmlfc2IsIFBPU0lYX0FDTCkpIHsKKwkJCWFjbCA9IGV4dDJfZ2V0X2FjbChkaXIsIEFDTF9UWVBFX0RFRkFVTFQpOworCQkJaWYgKElTX0VSUihhY2wpKQorCQkJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJCX0KKwkJaWYgKCFhY2wpCisJCQlpbm9kZS0+aV9tb2RlICY9IH5jdXJyZW50LT5mcy0+dW1hc2s7CisJfQorCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgUE9TSVhfQUNMKSAmJiBhY2wpIHsKKyAgICAgICAgICAgICAgIHN0cnVjdCBwb3NpeF9hY2wgKmNsb25lOworCSAgICAgICBtb2RlX3QgbW9kZTsKKworCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQkJZXJyb3IgPSBleHQyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsIGFjbCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBjbGVhbnVwOworCQl9CisJCWNsb25lID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX0tFUk5FTCk7CisJCWVycm9yID0gLUVOT01FTTsKKwkJaWYgKCFjbG9uZSkKKwkJCWdvdG8gY2xlYW51cDsKKwkJbW9kZSA9IGlub2RlLT5pX21vZGU7CisJCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZV9tYXNxKGNsb25lLCAmbW9kZSk7CisJCWlmIChlcnJvciA+PSAwKSB7CisJCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwkJCWlmIChlcnJvciA+IDApIHsKKwkJCQkvKiBUaGlzIGlzIGFuIGV4dGVuZGVkIEFDTCAqLworCQkJCWVycm9yID0gZXh0Ml9zZXRfYWNsKGlub2RlLAorCQkJCQkJICAgICBBQ0xfVFlQRV9BQ0NFU1MsIGNsb25lKTsKKwkJCX0KKwkJfQorCQlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CisJfQorY2xlYW51cDoKKyAgICAgICBwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworICAgICAgIHJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIERvZXMgY2htb2QgZm9yIGFuIGlub2RlIHRoYXQgbWF5IGhhdmUgYW4gQWNjZXNzIENvbnRyb2wgTGlzdC4gVGhlCisgKiBpbm9kZS0+aV9tb2RlIGZpZWxkIG11c3QgYmUgdXBkYXRlZCB0byB0aGUgZGVzaXJlZCB2YWx1ZSBieSB0aGUgY2FsbGVyCisgKiBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyLgorICoKKyAqIFdlIGNoYW5nZSB0aGUgQUNMIHJhdGhlciB0aGFuIHN0b3Jpbmcgc29tZSBBQ0wgZW50cmllcyBpbiB0aGUgZmlsZQorICogbW9kZSBwZXJtaXNzaW9uIGJpdHMgKHdoaWNoIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50KSwgYmVjYXVzZSB0aGF0CisgKiB3b3VsZCBicmVhayBvbmNlIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgKGxpa2UgIEFDTF9BUFBFTkQsIEFDTF9ERUxFVEUKKyAqIGZvciBkaXJlY3RvcmllcykgYXJlIGFkZGVkLiBUaGVyZSBhcmUgbm8gbW9yZSBiaXRzIGF2YWlsYWJsZSBpbiB0aGUKKyAqIGZpbGUgbW9kZS4KKyAqCisgKiBpbm9kZS0+aV9zZW06IGRvd24KKyAqLworaW50CitleHQyX2FjbF9jaG1vZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgKmNsb25lOworICAgICAgICBpbnQgZXJyb3I7CisKKwlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBQT1NJWF9BQ0wpKQorCQlyZXR1cm4gMDsKKwlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWFjbCA9IGV4dDJfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKTsKKwlpZiAoSVNfRVJSKGFjbCkgfHwgIWFjbCkKKwkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKKwljbG9uZSA9IHBvc2l4X2FjbF9jbG9uZShhY2wsIEdGUF9LRVJORUwpOworCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJaWYgKCFjbG9uZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZXJyb3IgPSBwb3NpeF9hY2xfY2htb2RfbWFzcShjbG9uZSwgaW5vZGUtPmlfbW9kZSk7CisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBleHQyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgY2xvbmUpOworCXBvc2l4X2FjbF9yZWxlYXNlKGNsb25lKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBFeHRlbmRlZCBhdHRyaWJ1dCBoYW5kbGVycworICovCitzdGF0aWMgc2l6ZV90CitleHQyX3hhdHRyX2xpc3RfYWNsX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpsaXN0LCBzaXplX3QgbGlzdF9zaXplLAorCQkJICAgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQoreworCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKFhBVFRSX05BTUVfQUNMX0FDQ0VTUyk7CisKKwlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBQT1NJWF9BQ0wpKQorCQlyZXR1cm4gMDsKKwlpZiAobGlzdCAmJiBzaXplIDw9IGxpc3Rfc2l6ZSkKKwkJbWVtY3B5KGxpc3QsIFhBVFRSX05BTUVfQUNMX0FDQ0VTUywgc2l6ZSk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzaXplX3QKK2V4dDJfeGF0dHJfbGlzdF9hY2xfZGVmYXVsdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpsaXN0LCBzaXplX3QgbGlzdF9zaXplLAorCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbikKK3sKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihYQVRUUl9OQU1FX0FDTF9ERUZBVUxUKTsKKworCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFBPU0lYX0FDTCkpCisJCXJldHVybiAwOworCWlmIChsaXN0ICYmIHNpemUgPD0gbGlzdF9zaXplKQorCQltZW1jcHkobGlzdCwgWEFUVFJfTkFNRV9BQ0xfREVGQVVMVCwgc2l6ZSk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisJaW50IGVycm9yOworCisJaWYgKCF0ZXN0X29wdChpbm9kZS0+aV9zYiwgUE9TSVhfQUNMKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJYWNsID0gZXh0Ml9nZXRfYWNsKGlub2RlLCB0eXBlKTsKKwlpZiAoSVNfRVJSKGFjbCkpCisJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJaWYgKGFjbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RBVEE7CisJZXJyb3IgPSBwb3NpeF9hY2xfdG9feGF0dHIoYWNsLCBidWZmZXIsIHNpemUpOworCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfZ2V0X2FjbF9hY2Nlc3Moc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gZXh0Ml94YXR0cl9nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfZ2V0X2FjbF9kZWZhdWx0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBleHQyX3hhdHRyX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfc2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwgY29uc3Qgdm9pZCAqdmFsdWUsCisJCSAgIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBQT1NJWF9BQ0wpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKChjdXJyZW50LT5mc3VpZCAhPSBpbm9kZS0+aV91aWQpICYmICFjYXBhYmxlKENBUF9GT1dORVIpKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKHZhbHVlKSB7CisJCWFjbCA9IHBvc2l4X2FjbF9mcm9tX3hhdHRyKHZhbHVlLCBzaXplKTsKKwkJaWYgKElTX0VSUihhY2wpKQorCQkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKKwkJZWxzZSBpZiAoYWNsKSB7CisJCQllcnJvciA9IHBvc2l4X2FjbF92YWxpZChhY2wpOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gcmVsZWFzZV9hbmRfb3V0OworCQl9CisJfSBlbHNlCisJCWFjbCA9IE5VTEw7CisKKwllcnJvciA9IGV4dDJfc2V0X2FjbChpbm9kZSwgdHlwZSwgYWNsKTsKKworcmVsZWFzZV9hbmRfb3V0OgorCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50CitleHQyX3hhdHRyX3NldF9hY2xfYWNjZXNzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBleHQyX3hhdHRyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgdmFsdWUsIHNpemUpOworfQorCitzdGF0aWMgaW50CitleHQyX3hhdHRyX3NldF9hY2xfZGVmYXVsdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJaWYgKHN0cmNtcChuYW1lLCAiIikgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGV4dDJfeGF0dHJfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgdmFsdWUsIHNpemUpOworfQorCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciBleHQyX3hhdHRyX2FjbF9hY2Nlc3NfaGFuZGxlciA9IHsKKwkucHJlZml4CT0gWEFUVFJfTkFNRV9BQ0xfQUNDRVNTLAorCS5saXN0CT0gZXh0Ml94YXR0cl9saXN0X2FjbF9hY2Nlc3MsCisJLmdldAk9IGV4dDJfeGF0dHJfZ2V0X2FjbF9hY2Nlc3MsCisJLnNldAk9IGV4dDJfeGF0dHJfc2V0X2FjbF9hY2Nlc3MsCit9OworCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciBleHQyX3hhdHRyX2FjbF9kZWZhdWx0X2hhbmRsZXIgPSB7CisJLnByZWZpeAk9IFhBVFRSX05BTUVfQUNMX0RFRkFVTFQsCisJLmxpc3QJPSBleHQyX3hhdHRyX2xpc3RfYWNsX2RlZmF1bHQsCisJLmdldAk9IGV4dDJfeGF0dHJfZ2V0X2FjbF9kZWZhdWx0LAorCS5zZXQJPSBleHQyX3hhdHRyX3NldF9hY2xfZGVmYXVsdCwKK307CmRpZmYgLS1naXQgYS9mcy9leHQyL2FjbC5oIGIvZnMvZXh0Mi9hY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWQ5NmFlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0Mi9hY2wuaApAQCAtMCwwICsxLDgyIEBACisvKgorICBGaWxlOiBmcy9leHQyL2FjbC5oCisKKyAgKEMpIDIwMDEgQW5kcmVhcyBHcnVlbmJhY2hlciwgPGEuZ3J1ZW5iYWNoZXJAY29tcHV0ZXIub3JnPgorKi8KKworI2luY2x1ZGUgPGxpbnV4L3hhdHRyX2FjbC5oPgorCisjZGVmaW5lIEVYVDJfQUNMX1ZFUlNJT04JMHgwMDAxCisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlMTYJCWVfdGFnOworCV9fbGUxNgkJZV9wZXJtOworCV9fbGUzMgkJZV9pZDsKK30gZXh0Ml9hY2xfZW50cnk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlMTYJCWVfdGFnOworCV9fbGUxNgkJZV9wZXJtOworfSBleHQyX2FjbF9lbnRyeV9zaG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fbGUzMgkJYV92ZXJzaW9uOworfSBleHQyX2FjbF9oZWFkZXI7CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGV4dDJfYWNsX3NpemUoaW50IGNvdW50KQoreworCWlmIChjb3VudCA8PSA0KSB7CisJCXJldHVybiBzaXplb2YoZXh0Ml9hY2xfaGVhZGVyKSArCisJCSAgICAgICBjb3VudCAqIHNpemVvZihleHQyX2FjbF9lbnRyeV9zaG9ydCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHNpemVvZihleHQyX2FjbF9oZWFkZXIpICsKKwkJICAgICAgIDQgKiBzaXplb2YoZXh0Ml9hY2xfZW50cnlfc2hvcnQpICsKKwkJICAgICAgIChjb3VudCAtIDQpICogc2l6ZW9mKGV4dDJfYWNsX2VudHJ5KTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dDJfYWNsX2NvdW50KHNpemVfdCBzaXplKQoreworCXNzaXplX3QgczsKKwlzaXplIC09IHNpemVvZihleHQyX2FjbF9oZWFkZXIpOworCXMgPSBzaXplIC0gNCAqIHNpemVvZihleHQyX2FjbF9lbnRyeV9zaG9ydCk7CisJaWYgKHMgPCAwKSB7CisJCWlmIChzaXplICUgc2l6ZW9mKGV4dDJfYWNsX2VudHJ5X3Nob3J0KSkKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIHNpemUgLyBzaXplb2YoZXh0Ml9hY2xfZW50cnlfc2hvcnQpOworCX0gZWxzZSB7CisJCWlmIChzICUgc2l6ZW9mKGV4dDJfYWNsX2VudHJ5KSkKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIHMgLyBzaXplb2YoZXh0Ml9hY2xfZW50cnkpICsgNDsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0wKKworLyogVmFsdWUgZm9yIGlub2RlLT51LmV4dDJfaS5pX2FjbCBhbmQgaW5vZGUtPnUuZXh0Ml9pLmlfZGVmYXVsdF9hY2wKKyAgIGlmIHRoZSBBQ0wgaGFzIG5vdCBiZWVuIGNhY2hlZCAqLworI2RlZmluZSBFWFQyX0FDTF9OT1RfQ0FDSEVEICgodm9pZCAqKS0xKQorCisvKiBhY2wuYyAqLworZXh0ZXJuIGludCBleHQyX3Blcm1pc3Npb24gKHN0cnVjdCBpbm9kZSAqLCBpbnQsIHN0cnVjdCBuYW1laWRhdGEgKik7CitleHRlcm4gaW50IGV4dDJfYWNsX2NobW9kIChzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gaW50IGV4dDJfaW5pdF9hY2wgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CisKKyNlbHNlCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNkZWZpbmUgZXh0Ml9wZXJtaXNzaW9uIE5VTEwKKyNkZWZpbmUgZXh0Ml9nZXRfYWNsCU5VTEwKKyNkZWZpbmUgZXh0Ml9zZXRfYWNsCU5VTEwKKworc3RhdGljIGlubGluZSBpbnQKK2V4dDJfYWNsX2NobW9kIChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHQyX2luaXRfYWNsIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpcikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9mcy9leHQyL2JhbGxvYy5jIGIvZnMvZXh0Mi9iYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTkxYWJlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0Mi9iYWxsb2MuYwpAQCAtMCwwICsxLDY5OSBAQAorLyoKKyAqICBsaW51eC9mcy9leHQyL2JhbGxvYy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqICBFbmhhbmNlZCBibG9jayBhbGxvY2F0aW9uIGJ5IFN0ZXBoZW4gVHdlZWRpZSAoc2N0QHJlZGhhdC5jb20pLCAxOTkzCisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAiZXh0Mi5oIgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisvKgorICogYmFsbG9jLmMgY29udGFpbnMgdGhlIGJsb2NrcyBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gcm91dGluZXMKKyAqLworCisvKgorICogVGhlIGZyZWUgYmxvY2tzIGFyZSBtYW5hZ2VkIGJ5IGJpdG1hcHMuICBBIGZpbGUgc3lzdGVtIGNvbnRhaW5zIHNldmVyYWwKKyAqIGJsb2NrcyBncm91cHMuICBFYWNoIGdyb3VwIGNvbnRhaW5zIDEgYml0bWFwIGJsb2NrIGZvciBibG9ja3MsIDEgYml0bWFwCisgKiBibG9jayBmb3IgaW5vZGVzLCBOIGJsb2NrcyBmb3IgdGhlIGlub2RlIHRhYmxlIGFuZCBkYXRhIGJsb2Nrcy4KKyAqCisgKiBUaGUgZmlsZSBzeXN0ZW0gY29udGFpbnMgZ3JvdXAgZGVzY3JpcHRvcnMgd2hpY2ggYXJlIGxvY2F0ZWQgYWZ0ZXIgdGhlCisgKiBzdXBlciBibG9jay4gIEVhY2ggZGVzY3JpcHRvciBjb250YWlucyB0aGUgbnVtYmVyIG9mIHRoZSBiaXRtYXAgYmxvY2sgYW5kCisgKiB0aGUgZnJlZSBibG9ja3MgY291bnQgaW4gdGhlIGJsb2NrLiAgVGhlIGRlc2NyaXB0b3JzIGFyZSBsb2FkZWQgaW4gbWVtb3J5CisgKiB3aGVuIGEgZmlsZSBzeXN0ZW0gaXMgbW91bnRlZCAoc2VlIGV4dDJfcmVhZF9zdXBlcikuCisgKi8KKworCisjZGVmaW5lIGluX3JhbmdlKGIsIGZpcnN0LCBsZW4pCSgoYikgPj0gKGZpcnN0KSAmJiAoYikgPD0gKGZpcnN0KSArIChsZW4pIC0gMSkKKworc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqIGV4dDJfZ2V0X2dyb3VwX2Rlc2Moc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGJsb2NrX2dyb3VwLAorCQkJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKiBiaCkKK3sKKwl1bnNpZ25lZCBsb25nIGdyb3VwX2Rlc2M7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqIGRlc2M7CisJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQihzYik7CisKKwlpZiAoYmxvY2tfZ3JvdXAgPj0gc2JpLT5zX2dyb3Vwc19jb3VudCkgeworCQlleHQyX2Vycm9yIChzYiwgImV4dDJfZ2V0X2dyb3VwX2Rlc2MiLAorCQkJICAgICJibG9ja19ncm91cCA+PSBncm91cHNfY291bnQgLSAiCisJCQkgICAgImJsb2NrX2dyb3VwID0gJWQsIGdyb3Vwc19jb3VudCA9ICVsdSIsCisJCQkgICAgYmxvY2tfZ3JvdXAsIHNiaS0+c19ncm91cHNfY291bnQpOworCisJCXJldHVybiBOVUxMOworCX0KKworCWdyb3VwX2Rlc2MgPSBibG9ja19ncm91cCA+PiBFWFQyX0RFU0NfUEVSX0JMT0NLX0JJVFMoc2IpOworCW9mZnNldCA9IGJsb2NrX2dyb3VwICYgKEVYVDJfREVTQ19QRVJfQkxPQ0soc2IpIC0gMSk7CisJaWYgKCFzYmktPnNfZ3JvdXBfZGVzY1tncm91cF9kZXNjXSkgeworCQlleHQyX2Vycm9yIChzYiwgImV4dDJfZ2V0X2dyb3VwX2Rlc2MiLAorCQkJICAgICJHcm91cCBkZXNjcmlwdG9yIG5vdCBsb2FkZWQgLSAiCisJCQkgICAgImJsb2NrX2dyb3VwID0gJWQsIGdyb3VwX2Rlc2MgPSAlbHUsIGRlc2MgPSAlbHUiLAorCQkJICAgICBibG9ja19ncm91cCwgZ3JvdXBfZGVzYywgb2Zmc2V0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZGVzYyA9IChzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICopIHNiaS0+c19ncm91cF9kZXNjW2dyb3VwX2Rlc2NdLT5iX2RhdGE7CisJaWYgKGJoKQorCQkqYmggPSBzYmktPnNfZ3JvdXBfZGVzY1tncm91cF9kZXNjXTsKKwlyZXR1cm4gZGVzYyArIG9mZnNldDsKK30KKworLyoKKyAqIFJlYWQgdGhlIGJpdG1hcCBmb3IgYSBnaXZlbiBibG9ja19ncm91cCwgcmVhZGluZyBpbnRvIHRoZSBzcGVjaWZpZWQgCisgKiBzbG90IGluIHRoZSBzdXBlcmJsb2NrJ3MgYml0bWFwIGNhY2hlLgorICoKKyAqIFJldHVybiBidWZmZXJfaGVhZCBvbiBzdWNjZXNzIG9yIE5VTEwgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK3JlYWRfYmxvY2tfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBibG9ja19ncm91cCkKK3sKKwlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICogZGVzYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCA9IE5VTEw7CisJCisJZGVzYyA9IGV4dDJfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBibG9ja19ncm91cCwgTlVMTCk7CisJaWYgKCFkZXNjKQorCQlnb3RvIGVycm9yX291dDsKKwliaCA9IHNiX2JyZWFkKHNiLCBsZTMyX3RvX2NwdShkZXNjLT5iZ19ibG9ja19iaXRtYXApKTsKKwlpZiAoIWJoKQorCQlleHQyX2Vycm9yIChzYiwgInJlYWRfYmxvY2tfYml0bWFwIiwKKwkJCSAgICAiQ2Fubm90IHJlYWQgYmxvY2sgYml0bWFwIC0gIgorCQkJICAgICJibG9ja19ncm91cCA9ICVkLCBibG9ja19iaXRtYXAgPSAldSIsCisJCQkgICAgYmxvY2tfZ3JvdXAsIGxlMzJfdG9fY3B1KGRlc2MtPmJnX2Jsb2NrX2JpdG1hcCkpOworZXJyb3Jfb3V0OgorCXJldHVybiBiaDsKK30KKworLyoKKyAqIFNldCBzYi0+c19kaXJ0IGhlcmUgYmVjYXVzZSB0aGUgc3VwZXJibG9jayB3YXMgImxvZ2ljYWxseSIgYWx0ZXJlZC4gIFdlCisgKiBuZWVkIHRvIHJlY2FsY3VsYXRlIGl0cyBmcmVlIGJsb2NrcyBjb3VudCBhbmQgZmx1c2ggaXQgb3V0LgorICovCitzdGF0aWMgaW50IHJlc2VydmVfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmkgPSBFWFQyX1NCKHNiKTsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7CisJdW5zaWduZWQgZnJlZV9ibG9ja3M7CisJdW5zaWduZWQgcm9vdF9ibG9ja3M7CisKKwlmcmVlX2Jsb2NrcyA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOworCXJvb3RfYmxvY2tzID0gbGUzMl90b19jcHUoZXMtPnNfcl9ibG9ja3NfY291bnQpOworCisJaWYgKGZyZWVfYmxvY2tzIDwgY291bnQpCisJCWNvdW50ID0gZnJlZV9ibG9ja3M7CisKKwlpZiAoZnJlZV9ibG9ja3MgPCByb290X2Jsb2NrcyArIGNvdW50ICYmICFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpICYmCisJICAgIHNiaS0+c19yZXN1aWQgIT0gY3VycmVudC0+ZnN1aWQgJiYKKwkgICAgKHNiaS0+c19yZXNnaWQgPT0gMCB8fCAhaW5fZ3JvdXBfcCAoc2JpLT5zX3Jlc2dpZCkpKSB7CisJCS8qCisJCSAqIFdlIGFyZSB0b28gY2xvc2UgdG8gcmVzZXJ2ZSBhbmQgd2UgYXJlIG5vdCBwcml2aWxlZ2VkLgorCQkgKiBDYW4gd2UgYWxsb2NhdGUgYW55dGhpbmcgYXQgYWxsPworCQkgKi8KKwkJaWYgKGZyZWVfYmxvY2tzID4gcm9vdF9ibG9ja3MpCisJCQljb3VudCA9IGZyZWVfYmxvY2tzIC0gcm9vdF9ibG9ja3M7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKworCXBlcmNwdV9jb3VudGVyX21vZCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwgLWNvdW50KTsKKwlzYi0+c19kaXJ0ID0gMTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBjb3VudCkKK3sKKwlpZiAoY291bnQpIHsKKwkJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQihzYik7CisKKwkJcGVyY3B1X2NvdW50ZXJfbW9kKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyLCBjb3VudCk7CisJCXNiLT5zX2RpcnQgPSAxOworCX0KK30KKworc3RhdGljIGludCBncm91cF9yZXNlcnZlX2Jsb2NrcyhzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmksIGludCBncm91cF9ubywKKwlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICpkZXNjLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgY291bnQpCit7CisJdW5zaWduZWQgZnJlZV9ibG9ja3M7CisKKwlpZiAoIWRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwX25vKSk7CisJZnJlZV9ibG9ja3MgPSBsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisJaWYgKGZyZWVfYmxvY2tzIDwgY291bnQpCisJCWNvdW50ID0gZnJlZV9ibG9ja3M7CisJZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQgPSBjcHVfdG9fbGUxNihmcmVlX2Jsb2NrcyAtIGNvdW50KTsKKwlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwX25vKSk7CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHZvaWQgZ3JvdXBfcmVsZWFzZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGdyb3VwX25vLAorCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKmRlc2MsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBjb3VudCkKK3sKKwlpZiAoY291bnQpIHsKKwkJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQihzYik7CisJCXVuc2lnbmVkIGZyZWVfYmxvY2tzOworCisJCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwX25vKSk7CisJCWZyZWVfYmxvY2tzID0gbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpOworCQlkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCA9IGNwdV90b19sZTE2KGZyZWVfYmxvY2tzICsgY291bnQpOworCQlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwX25vKSk7CisJCXNiLT5zX2RpcnQgPSAxOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJfQorfQorCisvKiBGcmVlIGdpdmVuIGJsb2NrcywgdXBkYXRlIHF1b3RhIGFuZCBpX2Jsb2NrcyBmaWVsZCAqLwordm9pZCBleHQyX2ZyZWVfYmxvY2tzIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoMjsKKwl1bnNpZ25lZCBsb25nIGJsb2NrX2dyb3VwOworCXVuc2lnbmVkIGxvbmcgYml0OworCXVuc2lnbmVkIGxvbmcgaTsKKwl1bnNpZ25lZCBsb25nIG92ZXJmbG93OworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGV4dDJfc2JfaW5mbyAqIHNiaSA9IEVYVDJfU0Ioc2IpOworCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKiBkZXNjOworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICogZXMgPSBzYmktPnNfZXM7CisJdW5zaWduZWQgZnJlZWQgPSAwLCBncm91cF9mcmVlZDsKKworCWlmIChibG9jayA8IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spIHx8CisJICAgIGJsb2NrICsgY291bnQgPCBibG9jayB8fAorCSAgICBibG9jayArIGNvdW50ID4gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSkgeworCQlleHQyX2Vycm9yIChzYiwgImV4dDJfZnJlZV9ibG9ja3MiLAorCQkJICAgICJGcmVlaW5nIGJsb2NrcyBub3QgaW4gZGF0YXpvbmUgLSAiCisJCQkgICAgImJsb2NrID0gJWx1LCBjb3VudCA9ICVsdSIsIGJsb2NrLCBjb3VudCk7CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworCWV4dDJfZGVidWcgKCJmcmVlaW5nIGJsb2NrKHMpICVsdS0lbHVcbiIsIGJsb2NrLCBibG9jayArIGNvdW50IC0gMSk7CisKK2RvX21vcmU6CisJb3ZlcmZsb3cgPSAwOworCWJsb2NrX2dyb3VwID0gKGJsb2NrIC0gbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykpIC8KKwkJICAgICAgRVhUMl9CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwliaXQgPSAoYmxvY2sgLSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSkgJQorCQkgICAgICBFWFQyX0JMT0NLU19QRVJfR1JPVVAoc2IpOworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBmcmVlaW5nIGJsb2NrcyBhY3Jvc3MgYSBncm91cAorCSAqIGJvdW5kYXJ5LgorCSAqLworCWlmIChiaXQgKyBjb3VudCA+IEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzYikpIHsKKwkJb3ZlcmZsb3cgPSBiaXQgKyBjb3VudCAtIEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJCWNvdW50IC09IG92ZXJmbG93OworCX0KKwlicmVsc2UoYml0bWFwX2JoKTsKKwliaXRtYXBfYmggPSByZWFkX2Jsb2NrX2JpdG1hcChzYiwgYmxvY2tfZ3JvdXApOworCWlmICghYml0bWFwX2JoKQorCQlnb3RvIGVycm9yX3JldHVybjsKKworCWRlc2MgPSBleHQyX2dldF9ncm91cF9kZXNjIChzYiwgYmxvY2tfZ3JvdXAsICZiaDIpOworCWlmICghZGVzYykKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwlpZiAoaW5fcmFuZ2UgKGxlMzJfdG9fY3B1KGRlc2MtPmJnX2Jsb2NrX2JpdG1hcCksIGJsb2NrLCBjb3VudCkgfHwKKwkgICAgaW5fcmFuZ2UgKGxlMzJfdG9fY3B1KGRlc2MtPmJnX2lub2RlX2JpdG1hcCksIGJsb2NrLCBjb3VudCkgfHwKKwkgICAgaW5fcmFuZ2UgKGJsb2NrLCBsZTMyX3RvX2NwdShkZXNjLT5iZ19pbm9kZV90YWJsZSksCisJCSAgICAgIHNiaS0+c19pdGJfcGVyX2dyb3VwKSB8fAorCSAgICBpbl9yYW5nZSAoYmxvY2sgKyBjb3VudCAtIDEsIGxlMzJfdG9fY3B1KGRlc2MtPmJnX2lub2RlX3RhYmxlKSwKKwkJICAgICAgc2JpLT5zX2l0Yl9wZXJfZ3JvdXApKQorCQlleHQyX2Vycm9yIChzYiwgImV4dDJfZnJlZV9ibG9ja3MiLAorCQkJICAgICJGcmVlaW5nIGJsb2NrcyBpbiBzeXN0ZW0gem9uZXMgLSAiCisJCQkgICAgIkJsb2NrID0gJWx1LCBjb3VudCA9ICVsdSIsCisJCQkgICAgYmxvY2ssIGNvdW50KTsKKworCWZvciAoaSA9IDAsIGdyb3VwX2ZyZWVkID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaWYgKCFleHQyX2NsZWFyX2JpdF9hdG9taWMoc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCksCisJCQkJCQliaXQgKyBpLCBiaXRtYXBfYmgtPmJfZGF0YSkpIHsKKwkJCWV4dDJfZXJyb3Ioc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkiYml0IGFscmVhZHkgY2xlYXJlZCBmb3IgYmxvY2sgJWx1IiwgYmxvY2sgKyBpKTsKKwkJfSBlbHNlIHsKKwkJCWdyb3VwX2ZyZWVkKys7CisJCX0KKwl9CisKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaXRtYXBfYmgpOworCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKQorCQlzeW5jX2RpcnR5X2J1ZmZlcihiaXRtYXBfYmgpOworCisJZ3JvdXBfcmVsZWFzZV9ibG9ja3Moc2IsIGJsb2NrX2dyb3VwLCBkZXNjLCBiaDIsIGdyb3VwX2ZyZWVkKTsKKwlmcmVlZCArPSBncm91cF9mcmVlZDsKKworCWlmIChvdmVyZmxvdykgeworCQlibG9jayArPSBjb3VudDsKKwkJY291bnQgPSBvdmVyZmxvdzsKKwkJZ290byBkb19tb3JlOworCX0KK2Vycm9yX3JldHVybjoKKwlicmVsc2UoYml0bWFwX2JoKTsKKwlyZWxlYXNlX2Jsb2NrcyhzYiwgZnJlZWQpOworCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIGZyZWVkKTsKK30KKworc3RhdGljIGludCBncmFiX2Jsb2NrKHNwaW5sb2NrX3QgKmxvY2ssIGNoYXIgKm1hcCwgdW5zaWduZWQgc2l6ZSwgaW50IGdvYWwpCit7CisJaW50IGs7CisJY2hhciAqcCwgKnI7CisKKwlpZiAoIWV4dDJfdGVzdF9iaXQoZ29hbCwgbWFwKSkKKwkJZ290byBnb3RfaXQ7CisKK3JlcGVhdDoKKwlpZiAoZ29hbCkgeworCQkvKgorCQkgKiBUaGUgZ29hbCB3YXMgb2NjdXBpZWQ7IHNlYXJjaCBmb3J3YXJkIGZvciBhIGZyZWUgCisJCSAqIGJsb2NrIHdpdGhpbiB0aGUgbmV4dCBYWCBibG9ja3MuCisJCSAqCisJCSAqIGVuZF9nb2FsIGlzIG1vcmUgb3IgbGVzcyByYW5kb20sIGJ1dCBpdCBoYXMgdG8gYmUKKwkJICogbGVzcyB0aGFuIEVYVDJfQkxPQ0tTX1BFUl9HUk9VUC4gQWxpZ25pbmcgdXAgdG8gdGhlCisJCSAqIG5leHQgNjQtYml0IGJvdW5kYXJ5IGlzIHNpbXBsZS4uCisJCSAqLworCQlrID0gKGdvYWwgKyA2MykgJiB+NjM7CisJCWdvYWwgPSBleHQyX2ZpbmRfbmV4dF96ZXJvX2JpdChtYXAsIGssIGdvYWwpOworCQlpZiAoZ29hbCA8IGspCisJCQlnb3RvIGdvdF9pdDsKKwkJLyoKKwkJICogU2VhcmNoIGluIHRoZSByZW1haW5kZXIgb2YgdGhlIGN1cnJlbnQgZ3JvdXAuCisJCSAqLworCX0KKworCXAgPSBtYXAgKyAoZ29hbCA+PiAzKTsKKwlyID0gbWVtc2NhbihwLCAwLCAoc2l6ZSAtIGdvYWwgKyA3KSA+PiAzKTsKKwlrID0gKHIgLSBtYXApIDw8IDM7CisJaWYgKGsgPCBzaXplKSB7CisJCS8qIAorCQkgKiBXZSBoYXZlIHN1Y2NlZWRlZCBpbiBmaW5kaW5nIGEgZnJlZSBieXRlIGluIHRoZSBibG9jaworCQkgKiBiaXRtYXAuICBOb3cgc2VhcmNoIGJhY2t3YXJkcyB0byBmaW5kIHRoZSBzdGFydCBvZiB0aGlzCisJCSAqIGdyb3VwIG9mIGZyZWUgYmxvY2tzIC0gd29uJ3QgdGFrZSBtb3JlIHRoYW4gNyBpdGVyYXRpb25zLgorCQkgKi8KKwkJZm9yIChnb2FsID0gazsgZ29hbCAmJiAhZXh0Ml90ZXN0X2JpdCAoZ29hbCAtIDEsIG1hcCk7IGdvYWwtLSkKKwkJCTsKKwkJZ290byBnb3RfaXQ7CisJfQorCisJayA9IGV4dDJfZmluZF9uZXh0X3plcm9fYml0ICgodTMyICopbWFwLCBzaXplLCBnb2FsKTsKKwlpZiAoayA8IHNpemUpIHsKKwkJZ29hbCA9IGs7CisJCWdvdG8gZ290X2l0OworCX0KKwlyZXR1cm4gLTE7Citnb3RfaXQ6CisJaWYgKGV4dDJfc2V0X2JpdF9hdG9taWMobG9jaywgZ29hbCwgKHZvaWQgKikgbWFwKSkgCisJCWdvdG8gcmVwZWF0OwkKKwlyZXR1cm4gZ29hbDsKK30KKworLyoKKyAqIGV4dDJfbmV3X2Jsb2NrIHVzZXMgYSBnb2FsIGJsb2NrIHRvIGFzc2lzdCBhbGxvY2F0aW9uLiAgSWYgdGhlIGdvYWwgaXMKKyAqIGZyZWUsIG9yIHRoZXJlIGlzIGEgZnJlZSBibG9jayB3aXRoaW4gMzIgYmxvY2tzIG9mIHRoZSBnb2FsLCB0aGF0IGJsb2NrCisgKiBpcyBhbGxvY2F0ZWQuICBPdGhlcndpc2UgYSBmb3J3YXJkIHNlYXJjaCBpcyBtYWRlIGZvciBhIGZyZWUgYmxvY2s7IHdpdGhpbiAKKyAqIGVhY2ggYmxvY2sgZ3JvdXAgdGhlIHNlYXJjaCBmaXJzdCBsb29rcyBmb3IgYW4gZW50aXJlIGZyZWUgYnl0ZSBpbiB0aGUgYmxvY2sKKyAqIGJpdG1hcCwgYW5kIHRoZW4gZm9yIGFueSBmcmVlIGJpdCBpZiB0aGF0IGZhaWxzLgorICogVGhpcyBmdW5jdGlvbiBhbHNvIHVwZGF0ZXMgcXVvdGEgYW5kIGlfYmxvY2tzIGZpZWxkLgorICovCitpbnQgZXh0Ml9uZXdfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBnb2FsLAorCQkJdTMyICpwcmVhbGxvY19jb3VudCwgdTMyICpwcmVhbGxvY19ibG9jaywgaW50ICplcnIpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RwX2JoOwkvKiBiaDIgKi8KKwlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICpkZXNjOworCWludCBncm91cF9ubzsJCQkvKiBpICovCisJaW50IHJldF9ibG9jazsJCQkvKiBqICovCisJaW50IGdyb3VwX2lkeDsJCQkvKiBrICovCisJaW50IHRhcmdldF9ibG9jazsJCS8qIHRtcCAqLworCWludCBibG9jayA9IDA7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBleHQyX3NiX2luZm8gKnNiaSA9IEVYVDJfU0Ioc2IpOworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICplcyA9IHNiaS0+c19lczsKKwl1bnNpZ25lZCBncm91cF9zaXplID0gRVhUMl9CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwl1bnNpZ25lZCBwcmVhbGxvY19nb2FsID0gZXMtPnNfcHJlYWxsb2NfYmxvY2tzOworCXVuc2lnbmVkIGdyb3VwX2FsbG9jID0gMCwgZXNfYWxsb2MsIGRxX2FsbG9jOworCWludCBucl9zY2FubmVkX2dyb3VwczsKKworCWlmICghcHJlYWxsb2NfZ29hbC0tKQorCQlwcmVhbGxvY19nb2FsID0gRVhUMl9ERUZBVUxUX1BSRUFMTE9DX0JMT0NLUyAtIDE7CisJaWYgKCFwcmVhbGxvY19jb3VudCB8fCAqcHJlYWxsb2NfY291bnQpCisJCXByZWFsbG9jX2dvYWwgPSAwOworCisJaWYgKERRVU9UX0FMTE9DX0JMT0NLKGlub2RlLCAxKSkgeworCQkqZXJyID0gLUVEUVVPVDsKKwkJZ290byBvdXQ7CisJfQorCisJd2hpbGUgKHByZWFsbG9jX2dvYWwgJiYgRFFVT1RfUFJFQUxMT0NfQkxPQ0soaW5vZGUsIHByZWFsbG9jX2dvYWwpKQorCQlwcmVhbGxvY19nb2FsLS07CisKKwlkcV9hbGxvYyA9IHByZWFsbG9jX2dvYWwgKyAxOworCWVzX2FsbG9jID0gcmVzZXJ2ZV9ibG9ja3Moc2IsIGRxX2FsbG9jKTsKKwlpZiAoIWVzX2FsbG9jKSB7CisJCSplcnIgPSAtRU5PU1BDOworCQlnb3RvIG91dF9kcXVvdDsKKwl9CisKKwlleHQyX2RlYnVnICgiZ29hbD0lbHUuXG4iLCBnb2FsKTsKKworCWlmIChnb2FsIDwgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgfHwKKwkgICAgZ29hbCA+PSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpKQorCQlnb2FsID0gbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisJZ3JvdXBfbm8gPSAoZ29hbCAtIGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKSAvIGdyb3VwX3NpemU7CisJZGVzYyA9IGV4dDJfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBncm91cF9ubywgJmdkcF9iaCk7CisJaWYgKCFkZXNjKSB7CisJCS8qCisJCSAqIGdkcF9iaCBtYXkgc3RpbGwgYmUgdW5pbml0aWFsaXNlZC4gIEJ1dCBncm91cF9yZWxlYXNlX2Jsb2NrcworCQkgKiB3aWxsIG5vdCB0b3VjaCBpdCBiZWNhdXNlIGdyb3VwX2FsbG9jIGlzIHplcm8uCisJCSAqLworCQlnb3RvIGlvX2Vycm9yOworCX0KKworCWdyb3VwX2FsbG9jID0gZ3JvdXBfcmVzZXJ2ZV9ibG9ja3Moc2JpLCBncm91cF9ubywgZGVzYywKKwkJCQkJZ2RwX2JoLCBlc19hbGxvYyk7CisJaWYgKGdyb3VwX2FsbG9jKSB7CisJCXJldF9ibG9jayA9ICgoZ29hbCAtIGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKSAlCisJCQkJCWdyb3VwX3NpemUpOworCQlicmVsc2UoYml0bWFwX2JoKTsKKwkJYml0bWFwX2JoID0gcmVhZF9ibG9ja19iaXRtYXAoc2IsIGdyb3VwX25vKTsKKwkJaWYgKCFiaXRtYXBfYmgpCisJCQlnb3RvIGlvX2Vycm9yOworCQkKKwkJZXh0Ml9kZWJ1ZygiZ29hbCBpcyBhdCAlZDolZC5cbiIsIGdyb3VwX25vLCByZXRfYmxvY2spOworCisJCXJldF9ibG9jayA9IGdyYWJfYmxvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cF9ubyksCisJCQkJYml0bWFwX2JoLT5iX2RhdGEsIGdyb3VwX3NpemUsIHJldF9ibG9jayk7CisJCWlmIChyZXRfYmxvY2sgPj0gMCkKKwkJCWdvdG8gZ290X2Jsb2NrOworCQlncm91cF9yZWxlYXNlX2Jsb2NrcyhzYiwgZ3JvdXBfbm8sIGRlc2MsIGdkcF9iaCwgZ3JvdXBfYWxsb2MpOworCQlncm91cF9hbGxvYyA9IDA7CisJfQorCisJZXh0Ml9kZWJ1ZyAoIkJpdCBub3QgZm91bmQgaW4gYmxvY2sgZ3JvdXAgJWQuXG4iLCBncm91cF9ubyk7CisKKwkvKgorCSAqIE5vdyBzZWFyY2ggdGhlIHJlc3Qgb2YgdGhlIGdyb3Vwcy4gIFdlIGFzc3VtZSB0aGF0IAorCSAqIGkgYW5kIGRlc2MgY29ycmVjdGx5IHBvaW50IHRvIHRoZSBsYXN0IGdyb3VwIHZpc2l0ZWQuCisJICovCisJbnJfc2Nhbm5lZF9ncm91cHMgPSAwOworcmV0cnk6CisJZm9yIChncm91cF9pZHggPSAwOyAhZ3JvdXBfYWxsb2MgJiYKKwkJCWdyb3VwX2lkeCA8IHNiaS0+c19ncm91cHNfY291bnQ7IGdyb3VwX2lkeCsrKSB7CisJCWdyb3VwX25vKys7CisJCWlmIChncm91cF9ubyA+PSBzYmktPnNfZ3JvdXBzX2NvdW50KQorCQkJZ3JvdXBfbm8gPSAwOworCQlkZXNjID0gZXh0Ml9nZXRfZ3JvdXBfZGVzYyhzYiwgZ3JvdXBfbm8sICZnZHBfYmgpOworCQlpZiAoIWRlc2MpCisJCQlnb3RvIGlvX2Vycm9yOworCQlncm91cF9hbGxvYyA9IGdyb3VwX3Jlc2VydmVfYmxvY2tzKHNiaSwgZ3JvdXBfbm8sIGRlc2MsCisJCQkJCQlnZHBfYmgsIGVzX2FsbG9jKTsKKwl9CisJaWYgKCFncm91cF9hbGxvYykgeworCQkqZXJyID0gLUVOT1NQQzsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisJYnJlbHNlKGJpdG1hcF9iaCk7CisJYml0bWFwX2JoID0gcmVhZF9ibG9ja19iaXRtYXAoc2IsIGdyb3VwX25vKTsKKwlpZiAoIWJpdG1hcF9iaCkKKwkJZ290byBpb19lcnJvcjsKKworCXJldF9ibG9jayA9IGdyYWJfYmxvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cF9ubyksIGJpdG1hcF9iaC0+Yl9kYXRhLAorCQkJCWdyb3VwX3NpemUsIDApOworCWlmIChyZXRfYmxvY2sgPCAwKSB7CisJCS8qCisJCSAqIElmIGEgZnJlZSBibG9jayBjb3VudGVyIGlzIGNvcnJ1cHRlZCB3ZSBjYW4gbG9vcCBpbmlmaW50ZWx5LgorCQkgKiBEZXRlY3QgdGhhdCBoZXJlLgorCQkgKi8KKwkJbnJfc2Nhbm5lZF9ncm91cHMrKzsKKwkJaWYgKG5yX3NjYW5uZWRfZ3JvdXBzID4gMiAqIHNiaS0+c19ncm91cHNfY291bnQpIHsKKwkJCWV4dDJfZXJyb3Ioc2IsICJleHQyX25ld19ibG9jayIsCisJCQkJImNvcnJ1cHRlZCBmcmVlIGJsb2NrcyBjb3VudGVycyIpOworCQkJZ290byBpb19lcnJvcjsKKwkJfQorCQkvKgorCQkgKiBTb21lb25lIGVsc2UgZ3JhYmJlZCB0aGUgbGFzdCBmcmVlIGJsb2NrIGluIHRoaXMgYmxvY2tncm91cAorCQkgKiBiZWZvcmUgdXMuICBSZXRyeSB0aGUgc2Nhbi4KKwkJICovCisJCWdyb3VwX3JlbGVhc2VfYmxvY2tzKHNiLCBncm91cF9ubywgZGVzYywgZ2RwX2JoLCBncm91cF9hbGxvYyk7CisJCWdyb3VwX2FsbG9jID0gMDsKKwkJZ290byByZXRyeTsKKwl9CisKK2dvdF9ibG9jazoKKwlleHQyX2RlYnVnKCJ1c2luZyBibG9jayBncm91cCAlZCglZClcbiIsCisJCWdyb3VwX25vLCBkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisKKwl0YXJnZXRfYmxvY2sgPSByZXRfYmxvY2sgKyBncm91cF9ubyAqIGdyb3VwX3NpemUgKworCQkJbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisKKwlpZiAodGFyZ2V0X2Jsb2NrID09IGxlMzJfdG9fY3B1KGRlc2MtPmJnX2Jsb2NrX2JpdG1hcCkgfHwKKwkgICAgdGFyZ2V0X2Jsb2NrID09IGxlMzJfdG9fY3B1KGRlc2MtPmJnX2lub2RlX2JpdG1hcCkgfHwKKwkgICAgaW5fcmFuZ2UodGFyZ2V0X2Jsb2NrLCBsZTMyX3RvX2NwdShkZXNjLT5iZ19pbm9kZV90YWJsZSksCisJCSAgICAgIHNiaS0+c19pdGJfcGVyX2dyb3VwKSkKKwkJZXh0Ml9lcnJvciAoc2IsICJleHQyX25ld19ibG9jayIsCisJCQkgICAgIkFsbG9jYXRpbmcgYmxvY2sgaW4gc3lzdGVtIHpvbmUgLSAiCisJCQkgICAgImJsb2NrID0gJXUiLCB0YXJnZXRfYmxvY2spOworCisJaWYgKHRhcmdldF9ibG9jayA+PSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpKSB7CisJCWV4dDJfZXJyb3IgKHNiLCAiZXh0Ml9uZXdfYmxvY2siLAorCQkJICAgICJibG9jayglZCkgPj0gYmxvY2tzIGNvdW50KCVkKSAtICIKKwkJCSAgICAiYmxvY2tfZ3JvdXAgPSAlZCwgZXMgPT0gJXAgIiwgcmV0X2Jsb2NrLAorCQkJbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSwgZ3JvdXBfbm8sIGVzKTsKKwkJZ290byBpb19lcnJvcjsKKwl9CisJYmxvY2sgPSB0YXJnZXRfYmxvY2s7CisKKwkvKiBPSywgd2UgX2hhZF8gYWxsb2NhdGVkIHNvbWV0aGluZyAqLworCWV4dDJfZGVidWcoImZvdW5kIGJpdCAlZFxuIiwgcmV0X2Jsb2NrKTsKKworCWRxX2FsbG9jLS07CisJZXNfYWxsb2MtLTsKKwlncm91cF9hbGxvYy0tOworCisJLyoKKwkgKiBEbyBibG9jayBwcmVhbGxvY2F0aW9uIG5vdyBpZiByZXF1aXJlZC4KKwkgKi8KKwl3cml0ZV9sb2NrKCZFWFQyX0koaW5vZGUpLT5pX21ldGFfbG9jayk7CisJaWYgKGdyb3VwX2FsbG9jICYmICEqcHJlYWxsb2NfY291bnQpIHsKKwkJdW5zaWduZWQgbjsKKworCQlmb3IgKG4gPSAwOyBuIDwgZ3JvdXBfYWxsb2MgJiYgKytyZXRfYmxvY2sgPCBncm91cF9zaXplOyBuKyspIHsKKwkJCWlmIChleHQyX3NldF9iaXRfYXRvbWljKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXBfbm8pLAorCQkJCQkJcmV0X2Jsb2NrLAorCQkJCQkJKHZvaWQqKSBiaXRtYXBfYmgtPmJfZGF0YSkpCisgCQkJCWJyZWFrOworCQl9CisJCSpwcmVhbGxvY19ibG9jayA9IGJsb2NrICsgMTsKKwkJKnByZWFsbG9jX2NvdW50ID0gbjsKKwkJZXNfYWxsb2MgLT0gbjsKKwkJZHFfYWxsb2MgLT0gbjsKKwkJZ3JvdXBfYWxsb2MgLT0gbjsKKwl9CisJd3JpdGVfdW5sb2NrKCZFWFQyX0koaW5vZGUpLT5pX21ldGFfbG9jayk7CisKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaXRtYXBfYmgpOworCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKQorCQlzeW5jX2RpcnR5X2J1ZmZlcihiaXRtYXBfYmgpOworCisJZXh0Ml9kZWJ1ZyAoImFsbG9jYXRpbmcgYmxvY2sgJWQuICIsIGJsb2NrKTsKKworCSplcnIgPSAwOworb3V0X3JlbGVhc2U6CisJZ3JvdXBfcmVsZWFzZV9ibG9ja3Moc2IsIGdyb3VwX25vLCBkZXNjLCBnZHBfYmgsIGdyb3VwX2FsbG9jKTsKKwlyZWxlYXNlX2Jsb2NrcyhzYiwgZXNfYWxsb2MpOworb3V0X2RxdW90OgorCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIGRxX2FsbG9jKTsKK291dDoKKwlicmVsc2UoYml0bWFwX2JoKTsKKwlyZXR1cm4gYmxvY2s7CisKK2lvX2Vycm9yOgorCSplcnIgPSAtRUlPOworCWdvdG8gb3V0X3JlbGVhc2U7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZXh0Ml9jb3VudF9mcmVlX2Jsb2NrcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqIGRlc2M7CisJdW5zaWduZWQgbG9uZyBkZXNjX2NvdW50ID0gMDsKKwlpbnQgaTsKKyNpZmRlZiBFWFQyRlNfREVCVUcKKwl1bnNpZ25lZCBsb25nIGJpdG1hcF9jb3VudCwgeDsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXM7CisKKwlsb2NrX3N1cGVyIChzYik7CisJZXMgPSBFWFQyX1NCKHNiKS0+c19lczsKKwlkZXNjX2NvdW50ID0gMDsKKwliaXRtYXBfY291bnQgPSAwOworCWRlc2MgPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBFWFQyX1NCKHNiKS0+c19ncm91cHNfY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaDsKKwkJZGVzYyA9IGV4dDJfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBpLCBOVUxMKTsKKwkJaWYgKCFkZXNjKQorCQkJY29udGludWU7CisJCWRlc2NfY291bnQgKz0gbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpOworCQliaXRtYXBfYmggPSByZWFkX2Jsb2NrX2JpdG1hcChzYiwgaSk7CisJCWlmICghYml0bWFwX2JoKQorCQkJY29udGludWU7CisJCQorCQl4ID0gZXh0Ml9jb3VudF9mcmVlKGJpdG1hcF9iaCwgc2ItPnNfYmxvY2tzaXplKTsKKwkJcHJpbnRrICgiZ3JvdXAgJWQ6IHN0b3JlZCA9ICVkLCBjb3VudGVkID0gJWx1XG4iLAorCQkJaSwgbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpLCB4KTsKKwkJYml0bWFwX2NvdW50ICs9IHg7CisJCWJyZWxzZShiaXRtYXBfYmgpOworCX0KKwlwcmludGsoImV4dDJfY291bnRfZnJlZV9ibG9ja3M6IHN0b3JlZCA9ICVsdSwgY29tcHV0ZWQgPSAlbHUsICVsdVxuIiwKKwkJKGxvbmcpbGUzMl90b19jcHUoZXMtPnNfZnJlZV9ibG9ja3NfY291bnQpLAorCQlkZXNjX2NvdW50LCBiaXRtYXBfY291bnQpOworCXVubG9ja19zdXBlciAoc2IpOworCXJldHVybiBiaXRtYXBfY291bnQ7CisjZWxzZQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRVhUMl9TQihzYiktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBkZXNjID0gZXh0Ml9nZXRfZ3JvdXBfZGVzYyAoc2IsIGksIE5VTEwpOworICAgICAgICAgICAgICAgIGlmICghZGVzYykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGRlc2NfY291bnQgKz0gbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpOworCX0KKwlyZXR1cm4gZGVzY19jb3VudDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGludAorYmxvY2tfaW5fdXNlKHVuc2lnbmVkIGxvbmcgYmxvY2ssIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGNoYXIgKm1hcCkKK3sKKwlyZXR1cm4gZXh0Ml90ZXN0X2JpdCAoKGJsb2NrIC0KKwkJbGUzMl90b19jcHUoRVhUMl9TQihzYiktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykpICUKKwkJCSBFWFQyX0JMT0NLU19QRVJfR1JPVVAoc2IpLCBtYXApOworfQorCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X3Jvb3QoaW50IGEsIGludCBiKQoreworCWludCBudW0gPSBiOworCisJd2hpbGUgKGEgPiBudW0pCisJCW51bSAqPSBiOworCXJldHVybiBudW0gPT0gYTsKK30KKworc3RhdGljIGludCBleHQyX2dyb3VwX3NwYXJzZShpbnQgZ3JvdXApCit7CisJaWYgKGdyb3VwIDw9IDEpCisJCXJldHVybiAxOworCXJldHVybiAodGVzdF9yb290KGdyb3VwLCAzKSB8fCB0ZXN0X3Jvb3QoZ3JvdXAsIDUpIHx8CisJCXRlc3Rfcm9vdChncm91cCwgNykpOworfQorCisvKioKKyAqCWV4dDJfYmdfaGFzX3N1cGVyIC0gbnVtYmVyIG9mIGJsb2NrcyB1c2VkIGJ5IHRoZSBzdXBlcmJsb2NrIGluIGdyb3VwCisgKglAc2I6IHN1cGVyYmxvY2sgZm9yIGZpbGVzeXN0ZW0KKyAqCUBncm91cDogZ3JvdXAgbnVtYmVyIHRvIGNoZWNrCisgKgorICoJUmV0dXJuIHRoZSBudW1iZXIgb2YgYmxvY2tzIHVzZWQgYnkgdGhlIHN1cGVyYmxvY2sgKHByaW1hcnkgb3IgYmFja3VwKQorICoJaW4gdGhpcyBncm91cC4gIEN1cnJlbnRseSB0aGlzIHdpbGwgYmUgb25seSAwIG9yIDEuCisgKi8KK2ludCBleHQyX2JnX2hhc19zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZ3JvdXApCit7CisJaWYgKEVYVDJfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSKSYmCisJICAgICFleHQyX2dyb3VwX3NwYXJzZShncm91cCkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKioKKyAqCWV4dDJfYmdfbnVtX2dkYiAtIG51bWJlciBvZiBibG9ja3MgdXNlZCBieSB0aGUgZ3JvdXAgdGFibGUgaW4gZ3JvdXAKKyAqCUBzYjogc3VwZXJibG9jayBmb3IgZmlsZXN5c3RlbQorICoJQGdyb3VwOiBncm91cCBudW1iZXIgdG8gY2hlY2sKKyAqCisgKglSZXR1cm4gdGhlIG51bWJlciBvZiBibG9ja3MgdXNlZCBieSB0aGUgZ3JvdXAgZGVzY3JpcHRvciB0YWJsZQorICoJKHByaW1hcnkgb3IgYmFja3VwKSBpbiB0aGlzIGdyb3VwLiAgSW4gdGhlIGZ1dHVyZSB0aGVyZSBtYXkgYmUgYQorICoJZGlmZmVyZW50IG51bWJlciBvZiBkZXNjcmlwdG9yIGJsb2NrcyBpbiBlYWNoIGdyb3VwLgorICovCit1bnNpZ25lZCBsb25nIGV4dDJfYmdfbnVtX2dkYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZ3JvdXApCit7CisJaWYgKEVYVDJfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSKSYmCisJICAgICFleHQyX2dyb3VwX3NwYXJzZShncm91cCkpCisJCXJldHVybiAwOworCXJldHVybiBFWFQyX1NCKHNiKS0+c19nZGJfY291bnQ7Cit9CisKKyNpZmRlZiBDT05GSUdfRVhUMl9DSEVDSworLyogQ2FsbGVkIGF0IG1vdW50LXRpbWUsIHN1cGVyLWJsb2NrIGlzIGxvY2tlZCAqLwordm9pZCBleHQyX2NoZWNrX2Jsb2Nrc19iaXRtYXAgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqIGVzOworCXVuc2lnbmVkIGxvbmcgZGVzY19jb3VudCwgYml0bWFwX2NvdW50LCB4LCBqOworCXVuc2lnbmVkIGxvbmcgZGVzY19ibG9ja3M7CisJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqIGRlc2M7CisJaW50IGk7CisKKwllcyA9IEVYVDJfU0Ioc2IpLT5zX2VzOworCWRlc2NfY291bnQgPSAwOworCWJpdG1hcF9jb3VudCA9IDA7CisJZGVzYyA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IEVYVDJfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsgaSsrKSB7CisJCWRlc2MgPSBleHQyX2dldF9ncm91cF9kZXNjIChzYiwgaSwgTlVMTCk7CisJCWlmICghZGVzYykKKwkJCWNvbnRpbnVlOworCQlkZXNjX2NvdW50ICs9IGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KTsKKwkJYnJlbHNlKGJpdG1hcF9iaCk7CisJCWJpdG1hcF9iaCA9IHJlYWRfYmxvY2tfYml0bWFwKHNiLCBpKTsKKwkJaWYgKCFiaXRtYXBfYmgpCisJCQljb250aW51ZTsKKworCQlpZiAoZXh0Ml9iZ19oYXNfc3VwZXIoc2IsIGkpICYmCisJCQkJIWV4dDJfdGVzdF9iaXQoMCwgYml0bWFwX2JoLT5iX2RhdGEpKQorCQkJZXh0Ml9lcnJvcihzYiwgX19GVU5DVElPTl9fLAorCQkJCSAgICJTdXBlcmJsb2NrIGluIGdyb3VwICVkIGlzIG1hcmtlZCBmcmVlIiwgaSk7CisKKwkJZGVzY19ibG9ja3MgPSBleHQyX2JnX251bV9nZGIoc2IsIGkpOworCQlmb3IgKGogPSAwOyBqIDwgZGVzY19ibG9ja3M7IGorKykKKwkJCWlmICghZXh0Ml90ZXN0X2JpdChqICsgMSwgYml0bWFwX2JoLT5iX2RhdGEpKQorCQkJCWV4dDJfZXJyb3Ioc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkJICAgIkRlc2NyaXB0b3IgYmxvY2sgIyVsZCBpbiBncm91cCAiCisJCQkJCSAgICIlZCBpcyBtYXJrZWQgZnJlZSIsIGosIGkpOworCisJCWlmICghYmxvY2tfaW5fdXNlKGxlMzJfdG9fY3B1KGRlc2MtPmJnX2Jsb2NrX2JpdG1hcCksCisJCQkJCXNiLCBiaXRtYXBfYmgtPmJfZGF0YSkpCisJCQlleHQyX2Vycm9yKHNiLCAiZXh0Ml9jaGVja19ibG9ja3NfYml0bWFwIiwKKwkJCQkgICAgIkJsb2NrIGJpdG1hcCBmb3IgZ3JvdXAgJWQgaXMgbWFya2VkIGZyZWUiLAorCQkJCSAgICBpKTsKKworCQlpZiAoIWJsb2NrX2luX3VzZShsZTMyX3RvX2NwdShkZXNjLT5iZ19pbm9kZV9iaXRtYXApLAorCQkJCQlzYiwgYml0bWFwX2JoLT5iX2RhdGEpKQorCQkJZXh0Ml9lcnJvcihzYiwgImV4dDJfY2hlY2tfYmxvY2tzX2JpdG1hcCIsCisJCQkJICAgICJJbm9kZSBiaXRtYXAgZm9yIGdyb3VwICVkIGlzIG1hcmtlZCBmcmVlIiwKKwkJCQkgICAgaSk7CisKKwkJZm9yIChqID0gMDsgaiA8IEVYVDJfU0Ioc2IpLT5zX2l0Yl9wZXJfZ3JvdXA7IGorKykKKwkJCWlmICghYmxvY2tfaW5fdXNlKGxlMzJfdG9fY3B1KGRlc2MtPmJnX2lub2RlX3RhYmxlKSArIGosCisJCQkJCQlzYiwgYml0bWFwX2JoLT5iX2RhdGEpKQorCQkJCWV4dDJfZXJyb3IgKHNiLCAiZXh0Ml9jaGVja19ibG9ja3NfYml0bWFwIiwKKwkJCQkJICAgICJCbG9jayAjJWxkIG9mIHRoZSBpbm9kZSB0YWJsZSBpbiAiCisJCQkJCSAgICAiZ3JvdXAgJWQgaXMgbWFya2VkIGZyZWUiLCBqLCBpKTsKKworCQl4ID0gZXh0Ml9jb3VudF9mcmVlKGJpdG1hcF9iaCwgc2ItPnNfYmxvY2tzaXplKTsKKwkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSAhPSB4KQorCQkJZXh0Ml9lcnJvciAoc2IsICJleHQyX2NoZWNrX2Jsb2Nrc19iaXRtYXAiLAorCQkJCSAgICAiV3JvbmcgZnJlZSBibG9ja3MgY291bnQgZm9yIGdyb3VwICVkLCAiCisJCQkJICAgICJzdG9yZWQgPSAlZCwgY291bnRlZCA9ICVsdSIsIGksCisJCQkJICAgIGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSwgeCk7CisJCWJpdG1hcF9jb3VudCArPSB4OworCX0KKwlpZiAobGUzMl90b19jcHUoZXMtPnNfZnJlZV9ibG9ja3NfY291bnQpICE9IGJpdG1hcF9jb3VudCkKKwkJZXh0Ml9lcnJvciAoc2IsICJleHQyX2NoZWNrX2Jsb2Nrc19iaXRtYXAiLAorCQkJIldyb25nIGZyZWUgYmxvY2tzIGNvdW50IGluIHN1cGVyIGJsb2NrLCAiCisJCQkic3RvcmVkID0gJWx1LCBjb3VudGVkID0gJWx1IiwKKwkJCSh1bnNpZ25lZCBsb25nKWxlMzJfdG9fY3B1KGVzLT5zX2ZyZWVfYmxvY2tzX2NvdW50KSwKKwkJCWJpdG1hcF9jb3VudCk7CisJYnJlbHNlKGJpdG1hcF9iaCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvYml0bWFwLmMgYi9mcy9leHQyL2JpdG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMTQ1YjcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQyL2JpdG1hcC5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiAgbGludXgvZnMvZXh0Mi9iaXRtYXAuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworc3RhdGljIGludCBuaWJibGVtYXBbXSA9IHs0LCAzLCAzLCAyLCAzLCAyLCAyLCAxLCAzLCAyLCAyLCAxLCAyLCAxLCAxLCAwfTsKKwordW5zaWduZWQgbG9uZyBleHQyX2NvdW50X2ZyZWUgKHN0cnVjdCBidWZmZXJfaGVhZCAqIG1hcCwgdW5zaWduZWQgaW50IG51bWNoYXJzKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGxvbmcgc3VtID0gMDsKKwkKKwlpZiAoIW1hcCkgCisJCXJldHVybiAoMCk7CisJZm9yIChpID0gMDsgaSA8IG51bWNoYXJzOyBpKyspCisJCXN1bSArPSBuaWJibGVtYXBbbWFwLT5iX2RhdGFbaV0gJiAweGZdICsKKwkJCW5pYmJsZW1hcFsobWFwLT5iX2RhdGFbaV0gPj4gNCkgJiAweGZdOworCXJldHVybiAoc3VtKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2V4dDIvZGlyLmMgYi9mcy9leHQyL2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNWY1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQyL2Rpci5jCkBAIC0wLDAgKzEsNjczIEBACisvKgorICogIGxpbnV4L2ZzL2V4dDIvZGlyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvbWluaXgvZGlyLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBleHQyIGRpcmVjdG9yeSBoYW5kbGluZyBmdW5jdGlvbnMKKyAqCisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqCisgKiBBbGwgY29kZSB0aGF0IHdvcmtzIHdpdGggZGlyZWN0b3J5IGxheW91dCBoYWQgYmVlbiBzd2l0Y2hlZCB0byBwYWdlY2FjaGUKKyAqIGFuZCBtb3ZlZCBoZXJlLiBBVgorICovCisKKyNpbmNsdWRlICJleHQyLmgiCisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKK3R5cGVkZWYgc3RydWN0IGV4dDJfZGlyX2VudHJ5XzIgZXh0Ml9kaXJlbnQ7CisKKy8qCisgKiBleHQyIHVzZXMgYmxvY2stc2l6ZWQgY2h1bmtzLiBBcmd1YWJseSwgc2VjdG9yLXNpemVkIG9uZXMgd291bGQgYmUKKyAqIG1vcmUgcm9idXN0LCBidXQgd2UgaGF2ZSB3aGF0IHdlIGhhdmUKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBleHQyX2NodW5rX3NpemUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXh0Ml9wdXRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlrdW5tYXAocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZGlyX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIChpbm9kZS0+aV9zaXplK1BBR0VfQ0FDSEVfU0laRS0xKT4+UEFHRV9DQUNIRV9TSElGVDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgb2Zmc2V0IGludG8gcGFnZSBgcGFnZV9ucicgb2YgdGhlIGxhc3QgdmFsaWQKKyAqIGJ5dGUgaW4gdGhhdCBwYWdlLCBwbHVzIG9uZS4KKyAqLworc3RhdGljIHVuc2lnbmVkCitleHQyX2xhc3RfYnl0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIHBhZ2VfbnIpCit7CisJdW5zaWduZWQgbGFzdF9ieXRlID0gaW5vZGUtPmlfc2l6ZTsKKworCWxhc3RfYnl0ZSAtPSBwYWdlX25yIDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaWYgKGxhc3RfYnl0ZSA+IFBBR0VfQ0FDSEVfU0laRSkKKwkJbGFzdF9ieXRlID0gUEFHRV9DQUNIRV9TSVpFOworCXJldHVybiBsYXN0X2J5dGU7Cit9CisKK3N0YXRpYyBpbnQgZXh0Ml9jb21taXRfY2h1bmsoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlpbnQgZXJyID0gMDsKKwlkaXItPmlfdmVyc2lvbisrOworCXBhZ2UtPm1hcHBpbmctPmFfb3BzLT5jb21taXRfd3JpdGUoTlVMTCwgcGFnZSwgZnJvbSwgdG8pOworCWlmIChJU19ESVJTWU5DKGRpcikpCisJCWVyciA9IHdyaXRlX29uZV9wYWdlKHBhZ2UsIDEpOworCWVsc2UKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZXh0Ml9jaGVja19wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXVuc2lnbmVkIGNodW5rX3NpemUgPSBleHQyX2NodW5rX3NpemUoZGlyKTsKKwljaGFyICprYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwl1MzIgbWF4X2ludW1iZXIgPSBsZTMyX3RvX2NwdShFWFQyX1NCKHNiKS0+c19lcy0+c19pbm9kZXNfY291bnQpOworCXVuc2lnbmVkIG9mZnMsIHJlY19sZW47CisJdW5zaWduZWQgbGltaXQgPSBQQUdFX0NBQ0hFX1NJWkU7CisJZXh0Ml9kaXJlbnQgKnA7CisJY2hhciAqZXJyb3I7CisKKwlpZiAoKGRpci0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQpID09IHBhZ2UtPmluZGV4KSB7CisJCWxpbWl0ID0gZGlyLT5pX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLOworCQlpZiAobGltaXQgJiAoY2h1bmtfc2l6ZSAtIDEpKQorCQkJZ290byBFYmFkc2l6ZTsKKwkJaWYgKCFsaW1pdCkKKwkJCWdvdG8gb3V0OworCX0KKwlmb3IgKG9mZnMgPSAwOyBvZmZzIDw9IGxpbWl0IC0gRVhUMl9ESVJfUkVDX0xFTigxKTsgb2ZmcyArPSByZWNfbGVuKSB7CisJCXAgPSAoZXh0Ml9kaXJlbnQgKikoa2FkZHIgKyBvZmZzKTsKKwkJcmVjX2xlbiA9IGxlMTZfdG9fY3B1KHAtPnJlY19sZW4pOworCisJCWlmIChyZWNfbGVuIDwgRVhUMl9ESVJfUkVDX0xFTigxKSkKKwkJCWdvdG8gRXNob3J0OworCQlpZiAocmVjX2xlbiAmIDMpCisJCQlnb3RvIEVhbGlnbjsKKwkJaWYgKHJlY19sZW4gPCBFWFQyX0RJUl9SRUNfTEVOKHAtPm5hbWVfbGVuKSkKKwkJCWdvdG8gRW5hbWVsZW47CisJCWlmICgoKG9mZnMgKyByZWNfbGVuIC0gMSkgXiBvZmZzKSAmIH4oY2h1bmtfc2l6ZS0xKSkKKwkJCWdvdG8gRXNwYW47CisJCWlmIChsZTMyX3RvX2NwdShwLT5pbm9kZSkgPiBtYXhfaW51bWJlcikKKwkJCWdvdG8gRWludW1iZXI7CisJfQorCWlmIChvZmZzICE9IGxpbWl0KQorCQlnb3RvIEVlbmQ7CitvdXQ6CisJU2V0UGFnZUNoZWNrZWQocGFnZSk7CisJcmV0dXJuOworCisJLyogVG9vIGJhZCwgd2UgaGFkIGFuIGVycm9yICovCisKK0ViYWRzaXplOgorCWV4dDJfZXJyb3Ioc2IsICJleHQyX2NoZWNrX3BhZ2UiLAorCQkic2l6ZSBvZiBkaXJlY3RvcnkgIyVsdSBpcyBub3QgYSBtdWx0aXBsZSBvZiBjaHVuayBzaXplIiwKKwkJZGlyLT5pX2lubworCSk7CisJZ290byBmYWlsOworRXNob3J0OgorCWVycm9yID0gInJlY19sZW4gaXMgc21hbGxlciB0aGFuIG1pbmltYWwiOworCWdvdG8gYmFkX2VudHJ5OworRWFsaWduOgorCWVycm9yID0gInVuYWxpZ25lZCBkaXJlY3RvcnkgZW50cnkiOworCWdvdG8gYmFkX2VudHJ5OworRW5hbWVsZW46CisJZXJyb3IgPSAicmVjX2xlbiBpcyB0b28gc21hbGwgZm9yIG5hbWVfbGVuIjsKKwlnb3RvIGJhZF9lbnRyeTsKK0VzcGFuOgorCWVycm9yID0gImRpcmVjdG9yeSBlbnRyeSBhY3Jvc3MgYmxvY2tzIjsKKwlnb3RvIGJhZF9lbnRyeTsKK0VpbnVtYmVyOgorCWVycm9yID0gImlub2RlIG91dCBvZiBib3VuZHMiOworYmFkX2VudHJ5OgorCWV4dDJfZXJyb3IgKHNiLCAiZXh0Ml9jaGVja19wYWdlIiwgImJhZCBlbnRyeSBpbiBkaXJlY3RvcnkgIyVsdTogJXMgLSAiCisJCSJvZmZzZXQ9JWx1LCBpbm9kZT0lbHUsIHJlY19sZW49JWQsIG5hbWVfbGVuPSVkIiwKKwkJZGlyLT5pX2lubywgZXJyb3IsIChwYWdlLT5pbmRleDw8UEFHRV9DQUNIRV9TSElGVCkrb2ZmcywKKwkJKHVuc2lnbmVkIGxvbmcpIGxlMzJfdG9fY3B1KHAtPmlub2RlKSwKKwkJcmVjX2xlbiwgcC0+bmFtZV9sZW4pOworCWdvdG8gZmFpbDsKK0VlbmQ6CisJcCA9IChleHQyX2RpcmVudCAqKShrYWRkciArIG9mZnMpOworCWV4dDJfZXJyb3IgKHNiLCAiZXh0Ml9jaGVja19wYWdlIiwKKwkJImVudHJ5IGluIGRpcmVjdG9yeSAjJWx1IHNwYW5zIHRoZSBwYWdlIGJvdW5kYXJ5IgorCQkib2Zmc2V0PSVsdSwgaW5vZGU9JWx1IiwKKwkJZGlyLT5pX2lubywgKHBhZ2UtPmluZGV4PDxQQUdFX0NBQ0hFX1NISUZUKStvZmZzLAorCQkodW5zaWduZWQgbG9uZykgbGUzMl90b19jcHUocC0+aW5vZGUpKTsKK2ZhaWw6CisJU2V0UGFnZUNoZWNrZWQocGFnZSk7CisJU2V0UGFnZUVycm9yKHBhZ2UpOworfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKiBleHQyX2dldF9wYWdlKHN0cnVjdCBpbm9kZSAqZGlyLCB1bnNpZ25lZCBsb25nIG4pCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBkaXItPmlfbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBuLAorCQkJCShmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwlpZiAoIUlTX0VSUihwYWdlKSkgeworCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCQlrbWFwKHBhZ2UpOworCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJCWdvdG8gZmFpbDsKKwkJaWYgKCFQYWdlQ2hlY2tlZChwYWdlKSkKKwkJCWV4dDJfY2hlY2tfcGFnZShwYWdlKTsKKwkJaWYgKFBhZ2VFcnJvcihwYWdlKSkKKwkJCWdvdG8gZmFpbDsKKwl9CisJcmV0dXJuIHBhZ2U7CisKK2ZhaWw6CisJZXh0Ml9wdXRfcGFnZShwYWdlKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlPKTsKK30KKworLyoKKyAqIE5PVEUhIHVubGlrZSBzdHJuY21wLCBleHQyX21hdGNoIHJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4KKyAqCisgKiBsZW4gPD0gRVhUMl9OQU1FX0xFTiBhbmQgZGUgIT0gTlVMTCBhcmUgZ3VhcmFudGVlZCBieSBjYWxsZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGV4dDJfbWF0Y2ggKGludCBsZW4sIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lLAorCQkJCQlzdHJ1Y3QgZXh0Ml9kaXJfZW50cnlfMiAqIGRlKQoreworCWlmIChsZW4gIT0gZGUtPm5hbWVfbGVuKQorCQlyZXR1cm4gMDsKKwlpZiAoIWRlLT5pbm9kZSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuICFtZW1jbXAobmFtZSwgZGUtPm5hbWUsIGxlbik7Cit9CisKKy8qCisgKiBwIGlzIGF0IGxlYXN0IDYgYnl0ZXMgYmVmb3JlIHRoZSBlbmQgb2YgcGFnZQorICovCitzdGF0aWMgaW5saW5lIGV4dDJfZGlyZW50ICpleHQyX25leHRfZW50cnkoZXh0Ml9kaXJlbnQgKnApCit7CisJcmV0dXJuIChleHQyX2RpcmVudCAqKSgoY2hhciopcCArIGxlMTZfdG9fY3B1KHAtPnJlY19sZW4pKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCAKK2V4dDJfdmFsaWRhdGVfZW50cnkoY2hhciAqYmFzZSwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBtYXNrKQoreworCWV4dDJfZGlyZW50ICpkZSA9IChleHQyX2RpcmVudCopKGJhc2UgKyBvZmZzZXQpOworCWV4dDJfZGlyZW50ICpwID0gKGV4dDJfZGlyZW50KikoYmFzZSArIChvZmZzZXQmbWFzaykpOworCXdoaWxlICgoY2hhciopcCA8IChjaGFyKilkZSkgeworCQlpZiAocC0+cmVjX2xlbiA9PSAwKQorCQkJYnJlYWs7CisJCXAgPSBleHQyX25leHRfZW50cnkocCk7CisJfQorCXJldHVybiAoY2hhciAqKXAgLSBiYXNlOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBleHQyX2ZpbGV0eXBlX3RhYmxlW0VYVDJfRlRfTUFYXSA9IHsKKwlbRVhUMl9GVF9VTktOT1dOXQk9IERUX1VOS05PV04sCisJW0VYVDJfRlRfUkVHX0ZJTEVdCT0gRFRfUkVHLAorCVtFWFQyX0ZUX0RJUl0JCT0gRFRfRElSLAorCVtFWFQyX0ZUX0NIUkRFVl0JPSBEVF9DSFIsCisJW0VYVDJfRlRfQkxLREVWXQk9IERUX0JMSywKKwlbRVhUMl9GVF9GSUZPXQkJPSBEVF9GSUZPLAorCVtFWFQyX0ZUX1NPQ0tdCQk9IERUX1NPQ0ssCisJW0VYVDJfRlRfU1lNTElOS10JPSBEVF9MTkssCit9OworCisjZGVmaW5lIFNfU0hJRlQgMTIKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGV4dDJfdHlwZV9ieV9tb2RlW1NfSUZNVCA+PiBTX1NISUZUXSA9IHsKKwlbU19JRlJFRyA+PiBTX1NISUZUXQk9IEVYVDJfRlRfUkVHX0ZJTEUsCisJW1NfSUZESVIgPj4gU19TSElGVF0JPSBFWFQyX0ZUX0RJUiwKKwlbU19JRkNIUiA+PiBTX1NISUZUXQk9IEVYVDJfRlRfQ0hSREVWLAorCVtTX0lGQkxLID4+IFNfU0hJRlRdCT0gRVhUMl9GVF9CTEtERVYsCisJW1NfSUZJRk8gPj4gU19TSElGVF0JPSBFWFQyX0ZUX0ZJRk8sCisJW1NfSUZTT0NLID4+IFNfU0hJRlRdCT0gRVhUMl9GVF9TT0NLLAorCVtTX0lGTE5LID4+IFNfU0hJRlRdCT0gRVhUMl9GVF9TWU1MSU5LLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGV4dDJfc2V0X2RlX3R5cGUoZXh0Ml9kaXJlbnQgKmRlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKKwlpZiAoRVhUMl9IQVNfSU5DT01QQVRfRkVBVFVSRShpbm9kZS0+aV9zYiwgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFKSkKKwkJZGUtPmZpbGVfdHlwZSA9IGV4dDJfdHlwZV9ieV9tb2RlWyhtb2RlICYgU19JRk1UKT4+U19TSElGVF07CisJZWxzZQorCQlkZS0+ZmlsZV90eXBlID0gMDsKK30KKworc3RhdGljIGludAorZXh0Ml9yZWFkZGlyIChzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCWxvZmZfdCBwb3MgPSBmaWxwLT5mX3BvczsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXVuc2lnbmVkIGludCBvZmZzZXQgPSBwb3MgJiB+UEFHRV9DQUNIRV9NQVNLOworCXVuc2lnbmVkIGxvbmcgbiA9IHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzID0gZGlyX3BhZ2VzKGlub2RlKTsKKwl1bnNpZ25lZCBjaHVua19tYXNrID0gfihleHQyX2NodW5rX3NpemUoaW5vZGUpLTEpOworCXVuc2lnbmVkIGNoYXIgKnR5cGVzID0gTlVMTDsKKwlpbnQgbmVlZF9yZXZhbGlkYXRlID0gKGZpbHAtPmZfdmVyc2lvbiAhPSBpbm9kZS0+aV92ZXJzaW9uKTsKKwlpbnQgcmV0OworCisJaWYgKHBvcyA+IGlub2RlLT5pX3NpemUgLSBFWFQyX0RJUl9SRUNfTEVOKDEpKQorCQlnb3RvIHN1Y2Nlc3M7CisKKwlpZiAoRVhUMl9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFKSkKKwkJdHlwZXMgPSBleHQyX2ZpbGV0eXBlX3RhYmxlOworCisJZm9yICggOyBuIDwgbnBhZ2VzOyBuKyssIG9mZnNldCA9IDApIHsKKwkJY2hhciAqa2FkZHIsICpsaW1pdDsKKwkJZXh0Ml9kaXJlbnQgKmRlOworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGV4dDJfZ2V0X3BhZ2UoaW5vZGUsIG4pOworCisJCWlmIChJU19FUlIocGFnZSkpIHsKKwkJCWV4dDJfZXJyb3Ioc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAiYmFkIHBhZ2UgaW4gIyVsdSIsCisJCQkJICAgaW5vZGUtPmlfaW5vKTsKKwkJCWZpbHAtPmZfcG9zICs9IFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldDsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJa2FkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCWlmIChuZWVkX3JldmFsaWRhdGUpIHsKKwkJCW9mZnNldCA9IGV4dDJfdmFsaWRhdGVfZW50cnkoa2FkZHIsIG9mZnNldCwgY2h1bmtfbWFzayk7CisJCQluZWVkX3JldmFsaWRhdGUgPSAwOworCQl9CisJCWRlID0gKGV4dDJfZGlyZW50ICopKGthZGRyK29mZnNldCk7CisJCWxpbWl0ID0ga2FkZHIgKyBleHQyX2xhc3RfYnl0ZShpbm9kZSwgbikgLSBFWFQyX0RJUl9SRUNfTEVOKDEpOworCQlmb3IgKCA7KGNoYXIqKWRlIDw9IGxpbWl0OyBkZSA9IGV4dDJfbmV4dF9lbnRyeShkZSkpIHsKKwkJCWlmIChkZS0+cmVjX2xlbiA9PSAwKSB7CisJCQkJZXh0Ml9lcnJvcihzYiwgX19GVU5DVElPTl9fLAorCQkJCQkiemVyby1sZW5ndGggZGlyZWN0b3J5IGVudHJ5Iik7CisJCQkJcmV0ID0gLUVJTzsKKwkJCQlleHQyX3B1dF9wYWdlKHBhZ2UpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCWlmIChkZS0+aW5vZGUpIHsKKwkJCQlpbnQgb3ZlcjsKKwkJCQl1bnNpZ25lZCBjaGFyIGRfdHlwZSA9IERUX1VOS05PV047CisKKwkJCQlpZiAodHlwZXMgJiYgZGUtPmZpbGVfdHlwZSA8IEVYVDJfRlRfTUFYKQorCQkJCQlkX3R5cGUgPSB0eXBlc1tkZS0+ZmlsZV90eXBlXTsKKworCQkJCW9mZnNldCA9IChjaGFyICopZGUgLSBrYWRkcjsKKwkJCQlvdmVyID0gZmlsbGRpcihkaXJlbnQsIGRlLT5uYW1lLCBkZS0+bmFtZV9sZW4sCisJCQkJCQkobjw8UEFHRV9DQUNIRV9TSElGVCkgfCBvZmZzZXQsCisJCQkJCQlsZTMyX3RvX2NwdShkZS0+aW5vZGUpLCBkX3R5cGUpOworCQkJCWlmIChvdmVyKSB7CisJCQkJCWV4dDJfcHV0X3BhZ2UocGFnZSk7CisJCQkJCWdvdG8gc3VjY2VzczsKKwkJCQl9CisJCQl9CisJCQlmaWxwLT5mX3BvcyArPSBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbik7CisJCX0KKwkJZXh0Ml9wdXRfcGFnZShwYWdlKTsKKwl9CisKK3N1Y2Nlc3M6CisJcmV0ID0gMDsKK2RvbmU6CisJZmlscC0+Zl92ZXJzaW9uID0gaW5vZGUtPmlfdmVyc2lvbjsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICoJZXh0Ml9maW5kX2VudHJ5KCkKKyAqCisgKiBmaW5kcyBhbiBlbnRyeSBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB3aXRoIHRoZSB3YW50ZWQgbmFtZS4gSXQKKyAqIHJldHVybnMgdGhlIHBhZ2UgaW4gd2hpY2ggdGhlIGVudHJ5IHdhcyBmb3VuZCwgYW5kIHRoZSBlbnRyeSBpdHNlbGYKKyAqIChhcyBhIHBhcmFtZXRlciAtIHJlc19kaXIpLiBQYWdlIGlzIHJldHVybmVkIG1hcHBlZCBhbmQgdW5sb2NrZWQuCisgKiBFbnRyeSBpcyBndWFyYW50ZWVkIHRvIGJlIHZhbGlkLgorICovCitzdHJ1Y3QgZXh0Ml9kaXJfZW50cnlfMiAqIGV4dDJfZmluZF9lbnRyeSAoc3RydWN0IGlub2RlICogZGlyLAorCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcGFnZSAqKiByZXNfcGFnZSkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwlpbnQgbmFtZWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwl1bnNpZ25lZCByZWNsZW4gPSBFWFQyX0RJUl9SRUNfTEVOKG5hbWVsZW4pOworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIG47CisJdW5zaWduZWQgbG9uZyBucGFnZXMgPSBkaXJfcGFnZXMoZGlyKTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisJc3RydWN0IGV4dDJfaW5vZGVfaW5mbyAqZWkgPSBFWFQyX0koZGlyKTsKKwlleHQyX2RpcmVudCAqIGRlOworCisJaWYgKG5wYWdlcyA9PSAwKQorCQlnb3RvIG91dDsKKworCS8qIE9GRlNFVF9DQUNIRSAqLworCSpyZXNfcGFnZSA9IE5VTEw7CisKKwlzdGFydCA9IGVpLT5pX2Rpcl9zdGFydF9sb29rdXA7CisJaWYgKHN0YXJ0ID49IG5wYWdlcykKKwkJc3RhcnQgPSAwOworCW4gPSBzdGFydDsKKwlkbyB7CisJCWNoYXIgKmthZGRyOworCQlwYWdlID0gZXh0Ml9nZXRfcGFnZShkaXIsIG4pOworCQlpZiAoIUlTX0VSUihwYWdlKSkgeworCQkJa2FkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCQlkZSA9IChleHQyX2RpcmVudCAqKSBrYWRkcjsKKwkJCWthZGRyICs9IGV4dDJfbGFzdF9ieXRlKGRpciwgbikgLSByZWNsZW47CisJCQl3aGlsZSAoKGNoYXIgKikgZGUgPD0ga2FkZHIpIHsKKwkJCQlpZiAoZGUtPnJlY19sZW4gPT0gMCkgeworCQkJCQlleHQyX2Vycm9yKGRpci0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJCQkJInplcm8tbGVuZ3RoIGRpcmVjdG9yeSBlbnRyeSIpOworCQkJCQlleHQyX3B1dF9wYWdlKHBhZ2UpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJaWYgKGV4dDJfbWF0Y2ggKG5hbWVsZW4sIG5hbWUsIGRlKSkKKwkJCQkJZ290byBmb3VuZDsKKwkJCQlkZSA9IGV4dDJfbmV4dF9lbnRyeShkZSk7CisJCQl9CisJCQlleHQyX3B1dF9wYWdlKHBhZ2UpOworCQl9CisJCWlmICgrK24gPj0gbnBhZ2VzKQorCQkJbiA9IDA7CisJfSB3aGlsZSAobiAhPSBzdGFydCk7CitvdXQ6CisJcmV0dXJuIE5VTEw7CisKK2ZvdW5kOgorCSpyZXNfcGFnZSA9IHBhZ2U7CisJZWktPmlfZGlyX3N0YXJ0X2xvb2t1cCA9IG47CisJcmV0dXJuIGRlOworfQorCitzdHJ1Y3QgZXh0Ml9kaXJfZW50cnlfMiAqIGV4dDJfZG90ZG90IChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHBhZ2UgKipwKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gZXh0Ml9nZXRfcGFnZShkaXIsIDApOworCWV4dDJfZGlyZW50ICpkZSA9IE5VTEw7CisKKwlpZiAoIUlTX0VSUihwYWdlKSkgeworCQlkZSA9IGV4dDJfbmV4dF9lbnRyeSgoZXh0Ml9kaXJlbnQgKikgcGFnZV9hZGRyZXNzKHBhZ2UpKTsKKwkJKnAgPSBwYWdlOworCX0KKwlyZXR1cm4gZGU7Cit9CisKK2lub190IGV4dDJfaW5vZGVfYnlfbmFtZShzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbm9fdCByZXMgPSAwOworCXN0cnVjdCBleHQyX2Rpcl9lbnRyeV8yICogZGU7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCisJZGUgPSBleHQyX2ZpbmRfZW50cnkgKGRpciwgZGVudHJ5LCAmcGFnZSk7CisJaWYgKGRlKSB7CisJCXJlcyA9IGxlMzJfdG9fY3B1KGRlLT5pbm9kZSk7CisJCWt1bm1hcChwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KKwlyZXR1cm4gcmVzOworfQorCisvKiBSZWxlYXNlcyB0aGUgcGFnZSAqLwordm9pZCBleHQyX3NldF9saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnlfMiAqZGUsCisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1bnNpZ25lZCBmcm9tID0gKGNoYXIgKikgZGUgLSAoY2hhciAqKSBwYWdlX2FkZHJlc3MocGFnZSk7CisJdW5zaWduZWQgdG8gPSBmcm9tICsgbGUxNl90b19jcHUoZGUtPnJlY19sZW4pOworCWludCBlcnI7CisKKwlsb2NrX3BhZ2UocGFnZSk7CisJZXJyID0gcGFnZS0+bWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgcGFnZSwgZnJvbSwgdG8pOworCWlmIChlcnIpCisJCUJVRygpOworCWRlLT5pbm9kZSA9IGNwdV90b19sZTMyKGlub2RlLT5pX2lubyk7CisJZXh0Ml9zZXRfZGVfdHlwZSAoZGUsIGlub2RlKTsKKwllcnIgPSBleHQyX2NvbW1pdF9jaHVuayhwYWdlLCBmcm9tLCB0byk7CisJZXh0Ml9wdXRfcGFnZShwYWdlKTsKKwlkaXItPmlfbXRpbWUgPSBkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCUVYVDJfSShkaXIpLT5pX2ZsYWdzICY9IH5FWFQyX0JUUkVFX0ZMOworCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKK30KKworLyoKKyAqCVBhcmVudCBpcyBsb2NrZWQuCisgKi8KK2ludCBleHQyX2FkZF9saW5rIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCWNvbnN0IGNoYXIgKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludCBuYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXVuc2lnbmVkIGNodW5rX3NpemUgPSBleHQyX2NodW5rX3NpemUoZGlyKTsKKwl1bnNpZ25lZCByZWNsZW4gPSBFWFQyX0RJUl9SRUNfTEVOKG5hbWVsZW4pOworCXVuc2lnbmVkIHNob3J0IHJlY19sZW4sIG5hbWVfbGVuOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwlleHQyX2RpcmVudCAqIGRlOworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzID0gZGlyX3BhZ2VzKGRpcik7CisJdW5zaWduZWQgbG9uZyBuOworCWNoYXIgKmthZGRyOworCXVuc2lnbmVkIGZyb20sIHRvOworCWludCBlcnI7CisKKwkvKgorCSAqIFdlIHRha2UgY2FyZSBvZiBkaXJlY3RvcnkgZXhwYW5zaW9uIGluIHRoZSBzYW1lIGxvb3AuCisJICogVGhpcyBjb2RlIHBsYXlzIG91dHNpZGUgaV9zaXplLCBzbyBpdCBsb2NrcyB0aGUgcGFnZQorCSAqIHRvIHByb3RlY3QgdGhhdCByZWdpb24uCisJICovCisJZm9yIChuID0gMDsgbiA8PSBucGFnZXM7IG4rKykgeworCQljaGFyICpkaXJfZW5kOworCisJCXBhZ2UgPSBleHQyX2dldF9wYWdlKGRpciwgbik7CisJCWVyciA9IFBUUl9FUlIocGFnZSk7CisJCWlmIChJU19FUlIocGFnZSkpCisJCQlnb3RvIG91dDsKKwkJbG9ja19wYWdlKHBhZ2UpOworCQlrYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJZGlyX2VuZCA9IGthZGRyICsgZXh0Ml9sYXN0X2J5dGUoZGlyLCBuKTsKKwkJZGUgPSAoZXh0Ml9kaXJlbnQgKilrYWRkcjsKKwkJa2FkZHIgKz0gUEFHRV9DQUNIRV9TSVpFIC0gcmVjbGVuOworCQl3aGlsZSAoKGNoYXIgKilkZSA8PSBrYWRkcikgeworCQkJaWYgKChjaGFyICopZGUgPT0gZGlyX2VuZCkgeworCQkJCS8qIFdlIGhpdCBpX3NpemUgKi8KKwkJCQluYW1lX2xlbiA9IDA7CisJCQkJcmVjX2xlbiA9IGNodW5rX3NpemU7CisJCQkJZGUtPnJlY19sZW4gPSBjcHVfdG9fbGUxNihjaHVua19zaXplKTsKKwkJCQlkZS0+aW5vZGUgPSAwOworCQkJCWdvdG8gZ290X2l0OworCQkJfQorCQkJaWYgKGRlLT5yZWNfbGVuID09IDApIHsKKwkJCQlleHQyX2Vycm9yKGRpci0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJCQkiemVyby1sZW5ndGggZGlyZWN0b3J5IGVudHJ5Iik7CisJCQkJZXJyID0gLUVJTzsKKwkJCQlnb3RvIG91dF91bmxvY2s7CisJCQl9CisJCQllcnIgPSAtRUVYSVNUOworCQkJaWYgKGV4dDJfbWF0Y2ggKG5hbWVsZW4sIG5hbWUsIGRlKSkKKwkJCQlnb3RvIG91dF91bmxvY2s7CisJCQluYW1lX2xlbiA9IEVYVDJfRElSX1JFQ19MRU4oZGUtPm5hbWVfbGVuKTsKKwkJCXJlY19sZW4gPSBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbik7CisJCQlpZiAoIWRlLT5pbm9kZSAmJiByZWNfbGVuID49IHJlY2xlbikKKwkJCQlnb3RvIGdvdF9pdDsKKwkJCWlmIChyZWNfbGVuID49IG5hbWVfbGVuICsgcmVjbGVuKQorCQkJCWdvdG8gZ290X2l0OworCQkJZGUgPSAoZXh0Ml9kaXJlbnQgKikgKChjaGFyICopIGRlICsgcmVjX2xlbik7CisJCX0KKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCWV4dDJfcHV0X3BhZ2UocGFnZSk7CisJfQorCUJVRygpOworCXJldHVybiAtRUlOVkFMOworCitnb3RfaXQ6CisJZnJvbSA9IChjaGFyKilkZSAtIChjaGFyKilwYWdlX2FkZHJlc3MocGFnZSk7CisJdG8gPSBmcm9tICsgcmVjX2xlbjsKKwllcnIgPSBwYWdlLT5tYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCBmcm9tLCB0byk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5sb2NrOworCWlmIChkZS0+aW5vZGUpIHsKKwkJZXh0Ml9kaXJlbnQgKmRlMSA9IChleHQyX2RpcmVudCAqKSAoKGNoYXIgKikgZGUgKyBuYW1lX2xlbik7CisJCWRlMS0+cmVjX2xlbiA9IGNwdV90b19sZTE2KHJlY19sZW4gLSBuYW1lX2xlbik7CisJCWRlLT5yZWNfbGVuID0gY3B1X3RvX2xlMTYobmFtZV9sZW4pOworCQlkZSA9IGRlMTsKKwl9CisJZGUtPm5hbWVfbGVuID0gbmFtZWxlbjsKKwltZW1jcHkgKGRlLT5uYW1lLCBuYW1lLCBuYW1lbGVuKTsKKwlkZS0+aW5vZGUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9pbm8pOworCWV4dDJfc2V0X2RlX3R5cGUgKGRlLCBpbm9kZSk7CisJZXJyID0gZXh0Ml9jb21taXRfY2h1bmsocGFnZSwgZnJvbSwgdG8pOworCWRpci0+aV9tdGltZSA9IGRpci0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJRVhUMl9JKGRpciktPmlfZmxhZ3MgJj0gfkVYVDJfQlRSRUVfRkw7CisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCS8qIE9GRlNFVF9DQUNIRSAqLworb3V0X3B1dDoKKwlleHQyX3B1dF9wYWdlKHBhZ2UpOworb3V0OgorCXJldHVybiBlcnI7CitvdXRfdW5sb2NrOgorCXVubG9ja19wYWdlKHBhZ2UpOworCWdvdG8gb3V0X3B1dDsKK30KKworLyoKKyAqIGV4dDJfZGVsZXRlX2VudHJ5IGRlbGV0ZXMgYSBkaXJlY3RvcnkgZW50cnkgYnkgbWVyZ2luZyBpdCB3aXRoIHRoZQorICogcHJldmlvdXMgZW50cnkuIFBhZ2UgaXMgdXAtdG8tZGF0ZS4gUmVsZWFzZXMgdGhlIHBhZ2UuCisgKi8KK2ludCBleHQyX2RlbGV0ZV9lbnRyeSAoc3RydWN0IGV4dDJfZGlyX2VudHJ5XzIgKiBkaXIsIHN0cnVjdCBwYWdlICogcGFnZSApCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCWNoYXIgKmthZGRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCXVuc2lnbmVkIGZyb20gPSAoKGNoYXIqKWRpciAtIGthZGRyKSAmIH4oZXh0Ml9jaHVua19zaXplKGlub2RlKS0xKTsKKwl1bnNpZ25lZCB0byA9ICgoY2hhciopZGlyIC0ga2FkZHIpICsgbGUxNl90b19jcHUoZGlyLT5yZWNfbGVuKTsKKwlleHQyX2RpcmVudCAqIHBkZSA9IE5VTEw7CisJZXh0Ml9kaXJlbnQgKiBkZSA9IChleHQyX2RpcmVudCAqKSAoa2FkZHIgKyBmcm9tKTsKKwlpbnQgZXJyOworCisJd2hpbGUgKChjaGFyKilkZSA8IChjaGFyKilkaXIpIHsKKwkJaWYgKGRlLT5yZWNfbGVuID09IDApIHsKKwkJCWV4dDJfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkiemVyby1sZW5ndGggZGlyZWN0b3J5IGVudHJ5Iik7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwkJcGRlID0gZGU7CisJCWRlID0gZXh0Ml9uZXh0X2VudHJ5KGRlKTsKKwl9CisJaWYgKHBkZSkKKwkJZnJvbSA9IChjaGFyKilwZGUgLSAoY2hhciopcGFnZV9hZGRyZXNzKHBhZ2UpOworCWxvY2tfcGFnZShwYWdlKTsKKwllcnIgPSBtYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCBmcm9tLCB0byk7CisJaWYgKGVycikKKwkJQlVHKCk7CisJaWYgKHBkZSkKKwkJcGRlLT5yZWNfbGVuID0gY3B1X3RvX2xlMTYodG8tZnJvbSk7CisJZGlyLT5pbm9kZSA9IDA7CisJZXJyID0gZXh0Ml9jb21taXRfY2h1bmsocGFnZSwgZnJvbSwgdG8pOworCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCUVYVDJfSShpbm9kZSktPmlfZmxhZ3MgJj0gfkVYVDJfQlRSRUVfRkw7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CitvdXQ6CisJZXh0Ml9wdXRfcGFnZShwYWdlKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogU2V0IHRoZSBmaXJzdCBmcmFnbWVudCBvZiBkaXJlY3RvcnkuCisgKi8KK2ludCBleHQyX21ha2VfZW1wdHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpwYXJlbnQpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIDApOworCXVuc2lnbmVkIGNodW5rX3NpemUgPSBleHQyX2NodW5rX3NpemUoaW5vZGUpOworCXN0cnVjdCBleHQyX2Rpcl9lbnRyeV8yICogZGU7CisJaW50IGVycjsKKwl2b2lkICprYWRkcjsKKworCWlmICghcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZXJyID0gbWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgcGFnZSwgMCwgY2h1bmtfc2l6ZSk7CisJaWYgKGVycikgeworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJZ290byBmYWlsOworCX0KKwlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKyAgICAgICBtZW1zZXQoa2FkZHIsIDAsIGNodW5rX3NpemUpOworCWRlID0gKHN0cnVjdCBleHQyX2Rpcl9lbnRyeV8yICopa2FkZHI7CisJZGUtPm5hbWVfbGVuID0gMTsKKwlkZS0+cmVjX2xlbiA9IGNwdV90b19sZTE2KEVYVDJfRElSX1JFQ19MRU4oMSkpOworCW1lbWNweSAoZGUtPm5hbWUsICIuXDBcMCIsIDQpOworCWRlLT5pbm9kZSA9IGNwdV90b19sZTMyKGlub2RlLT5pX2lubyk7CisJZXh0Ml9zZXRfZGVfdHlwZSAoZGUsIGlub2RlKTsKKworCWRlID0gKHN0cnVjdCBleHQyX2Rpcl9lbnRyeV8yICopKGthZGRyICsgRVhUMl9ESVJfUkVDX0xFTigxKSk7CisJZGUtPm5hbWVfbGVuID0gMjsKKwlkZS0+cmVjX2xlbiA9IGNwdV90b19sZTE2KGNodW5rX3NpemUgLSBFWFQyX0RJUl9SRUNfTEVOKDEpKTsKKwlkZS0+aW5vZGUgPSBjcHVfdG9fbGUzMihwYXJlbnQtPmlfaW5vKTsKKwltZW1jcHkgKGRlLT5uYW1lLCAiLi5cMCIsIDQpOworCWV4dDJfc2V0X2RlX3R5cGUgKGRlLCBpbm9kZSk7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCWVyciA9IGV4dDJfY29tbWl0X2NodW5rKHBhZ2UsIDAsIGNodW5rX3NpemUpOworZmFpbDoKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIHJvdXRpbmUgdG8gY2hlY2sgdGhhdCB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBpcyBlbXB0eSAoZm9yIHJtZGlyKQorICovCitpbnQgZXh0Ml9lbXB0eV9kaXIgKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGksIG5wYWdlcyA9IGRpcl9wYWdlcyhpbm9kZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyspIHsKKwkJY2hhciAqa2FkZHI7CisJCWV4dDJfZGlyZW50ICogZGU7CisJCXBhZ2UgPSBleHQyX2dldF9wYWdlKGlub2RlLCBpKTsKKworCQlpZiAoSVNfRVJSKHBhZ2UpKQorCQkJY29udGludWU7CisKKwkJa2FkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCWRlID0gKGV4dDJfZGlyZW50ICopa2FkZHI7CisJCWthZGRyICs9IGV4dDJfbGFzdF9ieXRlKGlub2RlLCBpKSAtIEVYVDJfRElSX1JFQ19MRU4oMSk7CisKKwkJd2hpbGUgKChjaGFyICopZGUgPD0ga2FkZHIpIHsKKwkJCWlmIChkZS0+cmVjX2xlbiA9PSAwKSB7CisJCQkJZXh0Ml9lcnJvcihpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJCQkiemVyby1sZW5ndGggZGlyZWN0b3J5IGVudHJ5Iik7CisJCQkJcHJpbnRrKCJrYWRkcj0lcCwgZGU9JXBcbiIsIGthZGRyLCBkZSk7CisJCQkJZ290byBub3RfZW1wdHk7CisJCQl9CisJCQlpZiAoZGUtPmlub2RlICE9IDApIHsKKwkJCQkvKiBjaGVjayBmb3IgLiBhbmQgLi4gKi8KKwkJCQlpZiAoZGUtPm5hbWVbMF0gIT0gJy4nKQorCQkJCQlnb3RvIG5vdF9lbXB0eTsKKwkJCQlpZiAoZGUtPm5hbWVfbGVuID4gMikKKwkJCQkJZ290byBub3RfZW1wdHk7CisJCQkJaWYgKGRlLT5uYW1lX2xlbiA8IDIpIHsKKwkJCQkJaWYgKGRlLT5pbm9kZSAhPQorCQkJCQkgICAgY3B1X3RvX2xlMzIoaW5vZGUtPmlfaW5vKSkKKwkJCQkJCWdvdG8gbm90X2VtcHR5OworCQkJCX0gZWxzZSBpZiAoZGUtPm5hbWVbMV0gIT0gJy4nKQorCQkJCQlnb3RvIG5vdF9lbXB0eTsKKwkJCX0KKwkJCWRlID0gZXh0Ml9uZXh0X2VudHJ5KGRlKTsKKwkJfQorCQlleHQyX3B1dF9wYWdlKHBhZ2UpOworCX0KKwlyZXR1cm4gMTsKKworbm90X2VtcHR5OgorCWV4dDJfcHV0X3BhZ2UocGFnZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXh0Ml9kaXJfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IGV4dDJfcmVhZGRpciwKKwkuaW9jdGwJCT0gZXh0Ml9pb2N0bCwKKwkuZnN5bmMJCT0gZXh0Ml9zeW5jX2ZpbGUsCit9OwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9leHQyLmggYi9mcy9leHQyL2V4dDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjFhNDBlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0Mi9leHQyLmgKQEAgLTAsMCArMSwxNjAgQEAKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDJfZnMuaD4KKworLyoKKyAqIHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbSBpbm9kZSBkYXRhIGluIG1lbW9yeQorICovCitzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvIHsKKwlfX2xlMzIJaV9kYXRhWzE1XTsKKwlfX3UzMglpX2ZsYWdzOworCV9fdTMyCWlfZmFkZHI7CisJX191OAlpX2ZyYWdfbm87CisJX191OAlpX2ZyYWdfc2l6ZTsKKwlfX3UxNglpX3N0YXRlOworCV9fdTMyCWlfZmlsZV9hY2w7CisJX191MzIJaV9kaXJfYWNsOworCV9fdTMyCWlfZHRpbWU7CisKKwkvKgorCSAqIGlfYmxvY2tfZ3JvdXAgaXMgdGhlIG51bWJlciBvZiB0aGUgYmxvY2sgZ3JvdXAgd2hpY2ggY29udGFpbnMKKwkgKiB0aGlzIGZpbGUncyBpbm9kZS4gIENvbnN0YW50IGFjcm9zcyB0aGUgbGlmZXRpbWUgb2YgdGhlIGlub2RlLAorCSAqIGl0IGlzIHVlZCBmb3IgbWFraW5nIGJsb2NrIGFsbG9jYXRpb24gZGVjaXNpb25zIC0gd2UgdHJ5IHRvCisJICogcGxhY2UgYSBmaWxlJ3MgZGF0YSBibG9ja3MgbmVhciBpdHMgaW5vZGUgYmxvY2ssIGFuZCBuZXcgaW5vZGVzCisJICogbmVhciB0byB0aGVpciBwYXJlbnQgZGlyZWN0b3J5J3MgaW5vZGUuCisJICovCisJX191MzIJaV9ibG9ja19ncm91cDsKKworCS8qCisJICogaV9uZXh0X2FsbG9jX2Jsb2NrIGlzIHRoZSBsb2dpY2FsIChmaWxlLXJlbGF0aXZlKSBudW1iZXIgb2YgdGhlCisJICogbW9zdC1yZWNlbnRseS1hbGxvY2F0ZWQgYmxvY2sgaW4gdGhpcyBmaWxlLiAgWWVzLCBpdCBpcyBtaXNuYW1lZC4KKwkgKiBXZSB1c2UgdGhpcyBmb3IgZGV0ZWN0aW5nIGxpbmVhcmx5IGFzY2VuZGluZyBhbGxvY2F0aW9uIHJlcXVlc3RzLgorCSAqLworCV9fdTMyCWlfbmV4dF9hbGxvY19ibG9jazsKKworCS8qCisJICogaV9uZXh0X2FsbG9jX2dvYWwgaXMgdGhlICpwaHlzaWNhbCogY29tcGFuaW9uIHRvIGlfbmV4dF9hbGxvY19ibG9jay4KKwkgKiBpdCB0aGUgdGhlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBvZiB0aGUgYmxvY2sgd2hpY2ggd2FzIG1vc3QtcmVjZW50bHkKKwkgKiBhbGxvY2F0ZWQgdG8gdGhpcyBmaWxlLiAgVGhpcyBnaXZlIHVzIHRoZSBnb2FsICh0YXJnZXQpIGZvciB0aGUgbmV4dAorCSAqIGFsbG9jYXRpb24gd2hlbiB3ZSBkZXRlY3QgbGluZWFybHkgYXNjZW5kaW5nIHJlcXVlc3RzLgorCSAqLworCV9fdTMyCWlfbmV4dF9hbGxvY19nb2FsOworCV9fdTMyCWlfcHJlYWxsb2NfYmxvY2s7CisJX191MzIJaV9wcmVhbGxvY19jb3VudDsKKwlfX3UzMglpX2Rpcl9zdGFydF9sb29rdXA7CisjaWZkZWYgQ09ORklHX0VYVDJfRlNfWEFUVFIKKwkvKgorCSAqIEV4dGVuZGVkIGF0dHJpYnV0ZXMgY2FuIGJlIHJlYWQgaW5kZXBlbmRlbnRseSBvZiB0aGUgbWFpbiBmaWxlCisJICogZGF0YS4gVGFraW5nIGlfc2VtIGV2ZW4gd2hlbiByZWFkaW5nIHdvdWxkIGNhdXNlIGNvbnRlbnRpb24KKwkgKiBiZXR3ZWVuIHJlYWRlcnMgb2YgRUFzIGFuZCB3cml0ZXJzIG9mIHJlZ3VsYXIgZmlsZSBkYXRhLCBzbworCSAqIGluc3RlYWQgd2Ugc3luY2hyb25pemUgb24geGF0dHJfc2VtIHdoZW4gcmVhZGluZyBvciBjaGFuZ2luZworCSAqIEVBcy4KKwkgKi8KKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIHhhdHRyX3NlbTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTAorCXN0cnVjdCBwb3NpeF9hY2wJKmlfYWNsOworCXN0cnVjdCBwb3NpeF9hY2wJKmlfZGVmYXVsdF9hY2w7CisjZW5kaWYKKwlyd2xvY2tfdCBpX21ldGFfbG9jazsKKwlzdHJ1Y3QgaW5vZGUJdmZzX2lub2RlOworfTsKKworLyoKKyAqIElub2RlIGR5bmFtaWMgc3RhdGUgZmxhZ3MKKyAqLworI2RlZmluZSBFWFQyX1NUQVRFX05FVwkJCTB4MDAwMDAwMDEgLyogaW5vZGUgaXMgbmV3bHkgY3JlYXRlZCAqLworCisKKy8qCisgKiBGdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KKworLyoKKyAqIE9rLCB0aGVzZSBkZWNsYXJhdGlvbnMgYXJlIGFsc28gaW4gPGxpbnV4L2tlcm5lbC5oPiBidXQgbm9uZSBvZiB0aGUKKyAqIGV4dDIgc291cmNlIHByb2dyYW1zIG5lZWRzIHRvIGluY2x1ZGUgaXQgc28gdGhleSBhcmUgZHVwbGljYXRlZCBoZXJlLgorICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGV4dDJfaW5vZGVfaW5mbyAqRVhUMl9JKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihpbm9kZSwgc3RydWN0IGV4dDJfaW5vZGVfaW5mbywgdmZzX2lub2RlKTsKK30KKworLyogYmFsbG9jLmMgKi8KK2V4dGVybiBpbnQgZXh0Ml9iZ19oYXNfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGdyb3VwKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGV4dDJfYmdfbnVtX2dkYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZ3JvdXApOworZXh0ZXJuIGludCBleHQyX25ld19ibG9jayAoc3RydWN0IGlub2RlICosIHVuc2lnbmVkIGxvbmcsCisJCQkgICBfX3UzMiAqLCBfX3UzMiAqLCBpbnQgKik7CitleHRlcm4gdm9pZCBleHQyX2ZyZWVfYmxvY2tzIChzdHJ1Y3QgaW5vZGUgKiwgdW5zaWduZWQgbG9uZywKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXh0Ml9jb3VudF9mcmVlX2Jsb2NrcyAoc3RydWN0IHN1cGVyX2Jsb2NrICopOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXh0Ml9jb3VudF9kaXJzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitleHRlcm4gdm9pZCBleHQyX2NoZWNrX2Jsb2Nrc19iaXRtYXAgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2V4dGVybiBzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICogZXh0Ml9nZXRfZ3JvdXBfZGVzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCQkJCSAgICB1bnNpZ25lZCBpbnQgYmxvY2tfZ3JvdXAsCisJCQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqIGJoKTsKKworLyogZGlyLmMgKi8KK2V4dGVybiBpbnQgZXh0Ml9hZGRfbGluayAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gaW5vX3QgZXh0Ml9pbm9kZV9ieV9uYW1lKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICopOworZXh0ZXJuIGludCBleHQyX21ha2VfZW1wdHkoc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnlfMiAqIGV4dDJfZmluZF9lbnRyeSAoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgcGFnZSAqKik7CitleHRlcm4gaW50IGV4dDJfZGVsZXRlX2VudHJ5IChzdHJ1Y3QgZXh0Ml9kaXJfZW50cnlfMiAqLCBzdHJ1Y3QgcGFnZSAqKTsKK2V4dGVybiBpbnQgZXh0Ml9lbXB0eV9kaXIgKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnlfMiAqIGV4dDJfZG90ZG90IChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHBhZ2UgKiopOworZXh0ZXJuIHZvaWQgZXh0Ml9zZXRfbGluayhzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGV4dDJfZGlyX2VudHJ5XzIgKiwgc3RydWN0IHBhZ2UgKiwgc3RydWN0IGlub2RlICopOworCisvKiBmc3luYy5jICovCitleHRlcm4gaW50IGV4dDJfc3luY19maWxlIChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7CisKKy8qIGlhbGxvYy5jICovCitleHRlcm4gc3RydWN0IGlub2RlICogZXh0Ml9uZXdfaW5vZGUgKHN0cnVjdCBpbm9kZSAqLCBpbnQpOworZXh0ZXJuIHZvaWQgZXh0Ml9mcmVlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBleHQyX2NvdW50X2ZyZWVfaW5vZGVzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitleHRlcm4gdm9pZCBleHQyX2NoZWNrX2lub2Rlc19iaXRtYXAgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGV4dDJfY291bnRfZnJlZSAoc3RydWN0IGJ1ZmZlcl9oZWFkICosIHVuc2lnbmVkKTsKKworLyogaW5vZGUuYyAqLworZXh0ZXJuIHZvaWQgZXh0Ml9yZWFkX2lub2RlIChzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gaW50IGV4dDJfd3JpdGVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqLCBpbnQpOworZXh0ZXJuIHZvaWQgZXh0Ml9kZWxldGVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgZXh0Ml9zeW5jX2lub2RlIChzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gdm9pZCBleHQyX2Rpc2NhcmRfcHJlYWxsb2MgKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgZXh0Ml9nZXRfYmxvY2soc3RydWN0IGlub2RlICosIHNlY3Rvcl90LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50KTsKK2V4dGVybiB2b2lkIGV4dDJfdHJ1bmNhdGUgKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgZXh0Ml9zZXRhdHRyIChzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpYXR0ciAqKTsKK2V4dGVybiB2b2lkIGV4dDJfc2V0X2lub2RlX2ZsYWdzKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCisvKiBpb2N0bC5jICovCitleHRlcm4gaW50IGV4dDJfaW9jdGwgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nKTsKKworLyogc3VwZXIuYyAqLworZXh0ZXJuIHZvaWQgZXh0Ml9lcnJvciAoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOworZXh0ZXJuIHZvaWQgZXh0Ml93YXJuaW5nIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CitleHRlcm4gdm9pZCBleHQyX3VwZGF0ZV9keW5hbWljX3JldiAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitleHRlcm4gdm9pZCBleHQyX3dyaXRlX3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CisKKy8qCisgKiBJbm9kZXMgYW5kIGZpbGVzIG9wZXJhdGlvbnMKKyAqLworCisvKiBkaXIuYyAqLworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXh0Ml9kaXJfb3BlcmF0aW9uczsKKworLyogZmlsZS5jICovCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZXh0Ml9maWxlX2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQyX2ZpbGVfb3BlcmF0aW9uczsKKworLyogaW5vZGUuYyAqLworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZXh0Ml9hb3BzOworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZXh0Ml9ub2JoX2FvcHM7CisKKy8qIG5hbWVpLmMgKi8KK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQyX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDJfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zOworCisvKiBzeW1saW5rLmMgKi8KK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQyX2Zhc3Rfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDJfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9maWxlLmMgYi9mcy9leHQyL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWU4NjE0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0Mi9maWxlLmMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqICBsaW51eC9mcy9leHQyL2ZpbGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9mcy9taW5peC9maWxlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBleHQyIGZzIHJlZ3VsYXIgZmlsZSBoYW5kbGluZyBwcmltaXRpdmVzCisgKgorICogIDY0LWJpdCBmaWxlIHN1cHBvcnQgb24gNjQtYml0IHBsYXRmb3JtcyBieSBKYWt1YiBKZWxpbmVrCisgKiAJKGpqQHN1bnNpdGUubXMubWZmLmN1bmkuY3opCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlICJleHQyLmgiCisjaW5jbHVkZSAieGF0dHIuaCIKKyNpbmNsdWRlICJhY2wuaCIKKworLyoKKyAqIENhbGxlZCB3aGVuIGFuIGlub2RlIGlzIHJlbGVhc2VkLiBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQKKyAqIGZyb20gZXh0Ml9vcGVuX2ZpbGU6IG9wZW4gZ2V0cyBjYWxsZWQgYXQgZXZlcnkgb3BlbiwgYnV0IHJlbGVhc2UKKyAqIGdldHMgY2FsbGVkIG9ubHkgd2hlbiAvYWxsLyB0aGUgZmlsZXMgYXJlIGNsb3NlZC4KKyAqLworc3RhdGljIGludCBleHQyX3JlbGVhc2VfZmlsZSAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCWV4dDJfZGlzY2FyZF9wcmVhbGxvYyAoaW5vZGUpOworCXJldHVybiAwOworfQorCisvKgorICogV2UgaGF2ZSBtb3N0bHkgTlVMTCdzIGhlcmU6IHRoZSBjdXJyZW50IGRlZmF1bHRzIGFyZSBvayBmb3IKKyAqIHRoZSBleHQyIGZpbGVzeXN0ZW0uCisgKi8KK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXh0Ml9maWxlX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfZmlsZV9yZWFkLAorCS53cml0ZQkJPSBnZW5lcmljX2ZpbGVfd3JpdGUsCisJLmFpb19yZWFkCT0gZ2VuZXJpY19maWxlX2Fpb19yZWFkLAorCS5haW9fd3JpdGUJPSBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlLAorCS5pb2N0bAkJPSBleHQyX2lvY3RsLAorCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAorCS5vcGVuCQk9IGdlbmVyaWNfZmlsZV9vcGVuLAorCS5yZWxlYXNlCT0gZXh0Ml9yZWxlYXNlX2ZpbGUsCisJLmZzeW5jCQk9IGV4dDJfc3luY19maWxlLAorCS5yZWFkdgkJPSBnZW5lcmljX2ZpbGVfcmVhZHYsCisJLndyaXRldgkJPSBnZW5lcmljX2ZpbGVfd3JpdGV2LAorCS5zZW5kZmlsZQk9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDJfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0geworCS50cnVuY2F0ZQk9IGV4dDJfdHJ1bmNhdGUsCisjaWZkZWYgQ09ORklHX0VYVDJfRlNfWEFUVFIKKwkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0cgk9IGV4dDJfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCisjZW5kaWYKKwkuc2V0YXR0cgk9IGV4dDJfc2V0YXR0ciwKKwkucGVybWlzc2lvbgk9IGV4dDJfcGVybWlzc2lvbiwKK307CmRpZmYgLS1naXQgYS9mcy9leHQyL2ZzeW5jLmMgYi9mcy9leHQyL2ZzeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzljMmU1ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDIvZnN5bmMuYwpAQCAtMCwwICsxLDUxIEBACisvKgorICogIGxpbnV4L2ZzL2V4dDIvZnN5bmMuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTMgIFN0ZXBoZW4gVHdlZWRpZSAoc2N0QGRjcy5lZC5hYy51aykKKyAqICBmcm9tCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyICBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiAgICAgICAgICAgICAgICAgICAgICBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICogIGZyb20KKyAqICBsaW51eC9mcy9taW5peC90cnVuY2F0ZS5jICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICogCisgKiAgZXh0MmZzIGZzeW5jIHByaW1pdGl2ZQorICoKKyAqICBCaWctZW5kaWFuIHRvIGxpdHRsZS1lbmRpYW4gYnl0ZS1zd2FwcGluZy9iaXRtYXBzIGJ5CisgKiAgICAgICAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KSwgMTk5NQorICogCisgKiAgUmVtb3ZlZCB1bm5lY2Vzc2FyeSBjb2RlIGR1cGxpY2F0aW9uIGZvciBsaXR0bGUgZW5kaWFuIG1hY2hpbmVzCisgKiAgYW5kIGV4Y2Vzc2l2ZSBfX2lubGluZV9fcy4gCisgKiAgICAgICAgQW5kaSBLbGVlbiwgMTk5NworICoKKyAqIE1ham9yIHNpbXBsaWNhdGlvbnMgYW5kIGNsZWFudXAgLSB3ZSBvbmx5IG5lZWQgdG8gZG8gdGhlIG1ldGFkYXRhLCBiZWNhdXNlCisgKiB3ZSBjYW4gZGVwZW5kIG9uIGdlbmVyaWNfYmxvY2tfZmRhdGFzeW5jKCkgdG8gc3luYyB0aGUgZGF0YSBibG9ja3MuCisgKi8KKworI2luY2x1ZGUgImV4dDIuaCIKKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CQkvKiBmb3IgZnN5bmNfaW5vZGVfYnVmZmVycygpICovCisKKworLyoKKyAqCUZpbGUgbWF5IGJlIE5VTEwgd2hlbiB3ZSBhcmUgY2FsbGVkLiBQZXJoYXBzIHdlIHNob3VsZG4ndAorICoJZXZlbiBwYXNzIGZpbGUgdG8gZnN5bmMgPworICovCisKK2ludCBleHQyX3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyOworCWludCByZXQ7CisKKwlyZXQgPSBzeW5jX21hcHBpbmdfYnVmZmVycyhpbm9kZS0+aV9tYXBwaW5nKTsKKwlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFkpKQorCQlyZXR1cm4gcmV0OworCWlmIChkYXRhc3luYyAmJiAhKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWV9EQVRBU1lOQykpCisJCXJldHVybiByZXQ7CisKKwllcnIgPSBleHQyX3N5bmNfaW5vZGUoaW5vZGUpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gZXJyOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mcy9leHQyL2lhbGxvYy5jIGIvZnMvZXh0Mi9pYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2UwNTkxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0Mi9pYWxsb2MuYwpAQCAtMCwwICsxLDczNSBAQAorLyoKKyAqICBsaW51eC9mcy9leHQyL2lhbGxvYy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqICBCU0QgdWZzLWluc3BpcmVkIGlub2RlIGFuZCBkaXJlY3RvcnkgYWxsb2NhdGlvbiBieSAKKyAqICBTdGVwaGVuIFR3ZWVkaWUgKHNjdEBkY3MuZWQuYWMudWspLCAxOTkzCisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlICJleHQyLmgiCisjaW5jbHVkZSAieGF0dHIuaCIKKyNpbmNsdWRlICJhY2wuaCIKKworLyoKKyAqIGlhbGxvYy5jIGNvbnRhaW5zIHRoZSBpbm9kZXMgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIHJvdXRpbmVzCisgKi8KKworLyoKKyAqIFRoZSBmcmVlIGlub2RlcyBhcmUgbWFuYWdlZCBieSBiaXRtYXBzLiAgQSBmaWxlIHN5c3RlbSBjb250YWlucyBzZXZlcmFsCisgKiBibG9ja3MgZ3JvdXBzLiAgRWFjaCBncm91cCBjb250YWlucyAxIGJpdG1hcCBibG9jayBmb3IgYmxvY2tzLCAxIGJpdG1hcAorICogYmxvY2sgZm9yIGlub2RlcywgTiBibG9ja3MgZm9yIHRoZSBpbm9kZSB0YWJsZSBhbmQgZGF0YSBibG9ja3MuCisgKgorICogVGhlIGZpbGUgc3lzdGVtIGNvbnRhaW5zIGdyb3VwIGRlc2NyaXB0b3JzIHdoaWNoIGFyZSBsb2NhdGVkIGFmdGVyIHRoZQorICogc3VwZXIgYmxvY2suICBFYWNoIGRlc2NyaXB0b3IgY29udGFpbnMgdGhlIG51bWJlciBvZiB0aGUgYml0bWFwIGJsb2NrIGFuZAorICogdGhlIGZyZWUgYmxvY2tzIGNvdW50IGluIHRoZSBibG9jay4KKyAqLworCisKKy8qCisgKiBSZWFkIHRoZSBpbm9kZSBhbGxvY2F0aW9uIGJpdG1hcCBmb3IgYSBnaXZlbiBibG9ja19ncm91cCwgcmVhZGluZworICogaW50byB0aGUgc3BlY2lmaWVkIHNsb3QgaW4gdGhlIHN1cGVyYmxvY2sncyBiaXRtYXAgY2FjaGUuCisgKgorICogUmV0dXJuIGJ1ZmZlcl9oZWFkIG9mIGJpdG1hcCBvbiBzdWNjZXNzIG9yIE5VTEwuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorcmVhZF9pbm9kZV9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHVuc2lnbmVkIGxvbmcgYmxvY2tfZ3JvdXApCit7CisJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKworCWRlc2MgPSBleHQyX2dldF9ncm91cF9kZXNjKHNiLCBibG9ja19ncm91cCwgTlVMTCk7CisJaWYgKCFkZXNjKQorCQlnb3RvIGVycm9yX291dDsKKworCWJoID0gc2JfYnJlYWQoc2IsIGxlMzJfdG9fY3B1KGRlc2MtPmJnX2lub2RlX2JpdG1hcCkpOworCWlmICghYmgpCisJCWV4dDJfZXJyb3Ioc2IsICJyZWFkX2lub2RlX2JpdG1hcCIsCisJCQkgICAgIkNhbm5vdCByZWFkIGlub2RlIGJpdG1hcCAtICIKKwkJCSAgICAiYmxvY2tfZ3JvdXAgPSAlbHUsIGlub2RlX2JpdG1hcCA9ICV1IiwKKwkJCSAgICBibG9ja19ncm91cCwgbGUzMl90b19jcHUoZGVzYy0+YmdfaW5vZGVfYml0bWFwKSk7CitlcnJvcl9vdXQ6CisJcmV0dXJuIGJoOworfQorCitzdGF0aWMgdm9pZCBleHQyX3JlbGVhc2VfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGdyb3VwLCBpbnQgZGlyKQoreworCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKiBkZXNjOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwlkZXNjID0gZXh0Ml9nZXRfZ3JvdXBfZGVzYyhzYiwgZ3JvdXAsICZiaCk7CisJaWYgKCFkZXNjKSB7CisJCWV4dDJfZXJyb3Ioc2IsICJleHQyX3JlbGVhc2VfaW5vZGUiLAorCQkJImNhbid0IGdldCBkZXNjcmlwdG9yIGZvciBncm91cCAlZCIsIGdyb3VwKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhFWFQyX1NCKHNiKSwgZ3JvdXApKTsKKwlkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCA9CisJCWNwdV90b19sZTE2KGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSArIDEpOworCWlmIChkaXIpCisJCWRlc2MtPmJnX3VzZWRfZGlyc19jb3VudCA9CisJCQljcHVfdG9fbGUxNihsZTE2X3RvX2NwdShkZXNjLT5iZ191c2VkX2RpcnNfY291bnQpIC0gMSk7CisJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soRVhUMl9TQihzYiksIGdyb3VwKSk7CisJaWYgKGRpcikKKwkJcGVyY3B1X2NvdW50ZXJfZGVjKCZFWFQyX1NCKHNiKS0+c19kaXJzX2NvdW50ZXIpOworCXNiLT5zX2RpcnQgPSAxOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKK30KKworLyoKKyAqIE5PVEUhIFdoZW4gd2UgZ2V0IHRoZSBpbm9kZSwgd2UncmUgdGhlIG9ubHkgcGVvcGxlCisgKiB0aGF0IGhhdmUgYWNjZXNzIHRvIGl0LCBhbmQgYXMgc3VjaCB0aGVyZSBhcmUgbm8KKyAqIHJhY2UgY29uZGl0aW9ucyB3ZSBoYXZlIHRvIHdvcnJ5IGFib3V0LiBUaGUgaW5vZGUKKyAqIGlzIG5vdCBvbiB0aGUgaGFzaC1saXN0cywgYW5kIGl0IGNhbm5vdCBiZSByZWFjaGVkCisgKiB0aHJvdWdoIHRoZSBmaWxlc3lzdGVtIGJlY2F1c2UgdGhlIGRpcmVjdG9yeSBlbnRyeQorICogaGFzIGJlZW4gZGVsZXRlZCBlYXJsaWVyLgorICoKKyAqIEhPV0VWRVI6IHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgd2UgZ2V0IG5vIGFsaWFzZXMsCisgKiB3aGljaCBtZWFucyB0aGF0IHdlIGhhdmUgdG8gY2FsbCAiY2xlYXJfaW5vZGUoKSIKKyAqIF9iZWZvcmVfIHdlIG1hcmsgdGhlIGlub2RlIG5vdCBpbiB1c2UgaW4gdGhlIGlub2RlCisgKiBiaXRtYXBzLiBPdGhlcndpc2UgYSBuZXdseSBjcmVhdGVkIGZpbGUgbWlnaHQgdXNlCisgKiB0aGUgc2FtZSBpbm9kZSBudW1iZXIgKG5vdCBhY3R1YWxseSB0aGUgc2FtZSBwb2ludGVyCisgKiB0aG91Z2gpLCBhbmQgdGhlbiB3ZSdkIGhhdmUgdHdvIGlub2RlcyBzaGFyaW5nIHRoZQorICogc2FtZSBpbm9kZSBudW1iZXIgYW5kIHNwYWNlIG9uIHRoZSBoYXJkZGlzay4KKyAqLwordm9pZCBleHQyX2ZyZWVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gaW5vZGUtPmlfc2I7CisJaW50IGlzX2RpcmVjdG9yeTsKKwl1bnNpZ25lZCBsb25nIGlubzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBibG9ja19ncm91cDsKKwl1bnNpZ25lZCBsb25nIGJpdDsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqIGVzOworCisJaW5vID0gaW5vZGUtPmlfaW5vOworCWV4dDJfZGVidWcgKCJmcmVlaW5nIGlub2RlICVsdVxuIiwgaW5vKTsKKworCS8qCisJICogTm90ZTogd2UgbXVzdCBmcmVlIGFueSBxdW90YSBiZWZvcmUgbG9ja2luZyB0aGUgc3VwZXJibG9jaywKKwkgKiBhcyB3cml0aW5nIHRoZSBxdW90YSB0byBkaXNrIG1heSBuZWVkIHRoZSBsb2NrIGFzIHdlbGwuCisJICovCisJaWYgKCFpc19iYWRfaW5vZGUoaW5vZGUpKSB7CisJCS8qIFF1b3RhIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgaW4gaXB1dCgpICovCisJCWV4dDJfeGF0dHJfZGVsZXRlX2lub2RlKGlub2RlKTsKKwkgICAgCURRVU9UX0ZSRUVfSU5PREUoaW5vZGUpOworCQlEUVVPVF9EUk9QKGlub2RlKTsKKwl9CisKKwllcyA9IEVYVDJfU0Ioc2IpLT5zX2VzOworCWlzX2RpcmVjdG9yeSA9IFNfSVNESVIoaW5vZGUtPmlfbW9kZSk7CisKKwkvKiBEbyB0aGlzIEJFRk9SRSBtYXJraW5nIHRoZSBpbm9kZSBub3QgaW4gdXNlIG9yIHJldHVybmluZyBhbiBlcnJvciAqLworCWNsZWFyX2lub2RlIChpbm9kZSk7CisKKwlpZiAoaW5vIDwgRVhUMl9GSVJTVF9JTk8oc2IpIHx8CisJICAgIGlubyA+IGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19jb3VudCkpIHsKKwkJZXh0Ml9lcnJvciAoc2IsICJleHQyX2ZyZWVfaW5vZGUiLAorCQkJICAgICJyZXNlcnZlZCBvciBub25leGlzdGVudCBpbm9kZSAlbHUiLCBpbm8pOworCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisJYmxvY2tfZ3JvdXAgPSAoaW5vIC0gMSkgLyBFWFQyX0lOT0RFU19QRVJfR1JPVVAoc2IpOworCWJpdCA9IChpbm8gLSAxKSAlIEVYVDJfSU5PREVTX1BFUl9HUk9VUChzYik7CisJYnJlbHNlKGJpdG1hcF9iaCk7CisJYml0bWFwX2JoID0gcmVhZF9pbm9kZV9iaXRtYXAoc2IsIGJsb2NrX2dyb3VwKTsKKwlpZiAoIWJpdG1hcF9iaCkKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwkvKiBPaywgbm93IHdlIGNhbiBhY3R1YWxseSB1cGRhdGUgdGhlIGlub2RlIGJpdG1hcHMuLiAqLworCWlmICghZXh0Ml9jbGVhcl9iaXRfYXRvbWljKHNiX2JnbF9sb2NrKEVYVDJfU0Ioc2IpLCBibG9ja19ncm91cCksCisJCQkJYml0LCAodm9pZCAqKSBiaXRtYXBfYmgtPmJfZGF0YSkpCisJCWV4dDJfZXJyb3IgKHNiLCAiZXh0Ml9mcmVlX2lub2RlIiwKKwkJCSAgICAgICJiaXQgYWxyZWFkeSBjbGVhcmVkIGZvciBpbm9kZSAlbHUiLCBpbm8pOworCWVsc2UKKwkJZXh0Ml9yZWxlYXNlX2lub2RlKHNiLCBibG9ja19ncm91cCwgaXNfZGlyZWN0b3J5KTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaXRtYXBfYmgpOworCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKQorCQlzeW5jX2RpcnR5X2J1ZmZlcihiaXRtYXBfYmgpOworZXJyb3JfcmV0dXJuOgorCWJyZWxzZShiaXRtYXBfYmgpOworfQorCisvKgorICogV2UgcGVyZm9ybSBhc3luY2hyb25vdXMgcHJlcmVhZGluZyBvZiB0aGUgbmV3IGlub2RlJ3MgaW5vZGUgYmxvY2sgd2hlbgorICogd2UgY3JlYXRlIHRoZSBpbm9kZSwgaW4gdGhlIGV4cGVjdGF0aW9uIHRoYXQgdGhlIGlub2RlIHdpbGwgYmUgd3JpdHRlbgorICogYmFjayBzb29uLiAgVGhlcmUgYXJlIHR3byByZWFzb25zOgorICoKKyAqIC0gV2hlbiBjcmVhdGluZyBhIGxhcmdlIG51bWJlciBvZiBmaWxlcywgdGhlIGFzeW5jIHByZXJlYWRzIHdpbGwgYmUKKyAqICAgbmljZWx5IG1lcmdlZCBpbnRvIGxhcmdlIHJlYWRzCisgKiAtIFdoZW4gd3JpdGluZyBvdXQgYSBsYXJnZSBudW1iZXIgb2YgaW5vZGVzLCB3ZSBkb24ndCBuZWVkIHRvIGtlZXAgb24KKyAqICAgc3RhbGxpbmcgdGhlIHdyaXRlcyB3aGlsZSB3ZSByZWFkIHRoZSBpbm9kZSBibG9jay4KKyAqCisgKiBGSVhNRTogZXh0Ml9nZXRfZ3JvdXBfZGVzYygpIG5lZWRzIHRvIGJlIHNpbXBsaWZpZWQuCisgKi8KK3N0YXRpYyB2b2lkIGV4dDJfcHJlcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXVuc2lnbmVkIGxvbmcgYmxvY2tfZ3JvdXA7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBibG9jazsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKiBnZHA7CisJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaTsKKworCWJkaSA9IGlub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87CisJaWYgKGJkaV9yZWFkX2Nvbmdlc3RlZChiZGkpKQorCQlyZXR1cm47CisJaWYgKGJkaV93cml0ZV9jb25nZXN0ZWQoYmRpKSkKKwkJcmV0dXJuOworCisJYmxvY2tfZ3JvdXAgPSAoaW5vZGUtPmlfaW5vIC0gMSkgLyBFWFQyX0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpOworCWdkcCA9IGV4dDJfZ2V0X2dyb3VwX2Rlc2MoaW5vZGUtPmlfc2IsIGJsb2NrX2dyb3VwLCAmYmgpOworCWlmIChnZHAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBGaWd1cmUgb3V0IHRoZSBvZmZzZXQgd2l0aGluIHRoZSBibG9jayBncm91cCBpbm9kZSB0YWJsZQorCSAqLworCW9mZnNldCA9ICgoaW5vZGUtPmlfaW5vIC0gMSkgJSBFWFQyX0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpKSAqCisJCQkJRVhUMl9JTk9ERV9TSVpFKGlub2RlLT5pX3NiKTsKKwlibG9jayA9IGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpICsKKwkJCQkob2Zmc2V0ID4+IEVYVDJfQkxPQ0tfU0laRV9CSVRTKGlub2RlLT5pX3NiKSk7CisJc2JfYnJlYWRhaGVhZChpbm9kZS0+aV9zYiwgYmxvY2spOworfQorCisvKgorICogVGhlcmUgYXJlIHR3byBwb2xpY2llcyBmb3IgYWxsb2NhdGluZyBhbiBpbm9kZS4gIElmIHRoZSBuZXcgaW5vZGUgaXMKKyAqIGEgZGlyZWN0b3J5LCB0aGVuIGEgZm9yd2FyZCBzZWFyY2ggaXMgbWFkZSBmb3IgYSBibG9jayBncm91cCB3aXRoIGJvdGgKKyAqIGZyZWUgc3BhY2UgYW5kIGEgbG93IGRpcmVjdG9yeS10by1pbm9kZSByYXRpbzsgaWYgdGhhdCBmYWlscywgdGhlbiBvZgorICogdGhlIGdyb3VwcyB3aXRoIGFib3ZlLWF2ZXJhZ2UgZnJlZSBzcGFjZSwgdGhhdCBncm91cCB3aXRoIHRoZSBmZXdlc3QKKyAqIGRpcmVjdG9yaWVzIGFscmVhZHkgaXMgY2hvc2VuLgorICoKKyAqIEZvciBvdGhlciBpbm9kZXMsIHNlYXJjaCBmb3J3YXJkIGZyb20gdGhlIHBhcmVudCBkaXJlY3RvcnlcJ3MgYmxvY2sKKyAqIGdyb3VwIHRvIGZpbmQgYSBmcmVlIGlub2RlLgorICovCitzdGF0aWMgaW50IGZpbmRfZ3JvdXBfZGlyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBpbm9kZSAqcGFyZW50KQoreworCWludCBuZ3JvdXBzID0gRVhUMl9TQihzYiktPnNfZ3JvdXBzX2NvdW50OworCWludCBhdmVmcmVlaSA9IGV4dDJfY291bnRfZnJlZV9pbm9kZXMoc2IpIC8gbmdyb3VwczsKKwlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICpkZXNjLCAqYmVzdF9kZXNjID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqYmVzdF9iaCA9IE5VTEw7CisJaW50IGdyb3VwLCBiZXN0X2dyb3VwID0gLTE7CisKKwlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBuZ3JvdXBzOyBncm91cCsrKSB7CisJCWRlc2MgPSBleHQyX2dldF9ncm91cF9kZXNjIChzYiwgZ3JvdXAsICZiaCk7CisJCWlmICghZGVzYyB8fCAhZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpCisJCQljb250aW51ZTsKKwkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSA8IGF2ZWZyZWVpKQorCQkJY29udGludWU7CisJCWlmICghYmVzdF9kZXNjIHx8IAorCQkgICAgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSA+CisJCSAgICAgbGUxNl90b19jcHUoYmVzdF9kZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkpKSB7CisJCQliZXN0X2dyb3VwID0gZ3JvdXA7CisJCQliZXN0X2Rlc2MgPSBkZXNjOworCQkJYmVzdF9iaCA9IGJoOworCQl9CisJfQorCWlmICghYmVzdF9kZXNjKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gYmVzdF9ncm91cDsKK30KKworLyogCisgKiBPcmxvdidzIGFsbG9jYXRvciBmb3IgZGlyZWN0b3JpZXMuIAorICogCisgKiBXZSBhbHdheXMgdHJ5IHRvIHNwcmVhZCBmaXJzdC1sZXZlbCBkaXJlY3Rvcmllcy4KKyAqCisgKiBJZiB0aGVyZSBhcmUgYmxvY2tncm91cHMgd2l0aCBib3RoIGZyZWUgaW5vZGVzIGFuZCBmcmVlIGJsb2NrcyBjb3VudHMgCisgKiBub3Qgd29yc2UgdGhhbiBhdmVyYWdlIHdlIHJldHVybiBvbmUgd2l0aCBzbWFsbGVzdCBkaXJlY3RvcnkgY291bnQuIAorICogT3RoZXJ3aXNlIHdlIHNpbXBseSByZXR1cm4gYSByYW5kb20gZ3JvdXAuIAorICogCisgKiBGb3IgdGhlIHJlc3QgcnVsZXMgbG9vayBzbzogCisgKiAKKyAqIEl0J3MgT0sgdG8gcHV0IGRpcmVjdG9yeSBpbnRvIGEgZ3JvdXAgdW5sZXNzIAorICogaXQgaGFzIHRvbyBtYW55IGRpcmVjdG9yaWVzIGFscmVhZHkgKG1heF9kaXJzKSBvciAKKyAqIGl0IGhhcyB0b28gZmV3IGZyZWUgaW5vZGVzIGxlZnQgKG1pbl9pbm9kZXMpIG9yIAorICogaXQgaGFzIHRvbyBmZXcgZnJlZSBibG9ja3MgbGVmdCAobWluX2Jsb2Nrcykgb3IgCisgKiBpdCdzIGFscmVhZHkgcnVubmluZyB0b28gbGFyZ2UgZGVidCAobWF4X2RlYnQpLiAKKyAqIFBhcmVudCdzIGdyb3VwIGlzIHByZWZlcmVkLCBpZiBpdCBkb2Vzbid0IHNhdGlzZnkgdGhlc2UgCisgKiBjb25kaXRpb25zIHdlIHNlYXJjaCBjeWNsaWNhbGx5IHRocm91Z2ggdGhlIHJlc3QuIElmIG5vbmUgCisgKiBvZiB0aGUgZ3JvdXBzIGxvb2sgZ29vZCB3ZSBqdXN0IGxvb2sgZm9yIGEgZ3JvdXAgd2l0aCBtb3JlIAorICogZnJlZSBpbm9kZXMgdGhhbiBhdmVyYWdlIChzdGFydGluZyBhdCBwYXJlbnQncyBncm91cCkuIAorICogCisgKiBEZWJ0IGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSB3ZSBhbGxvY2F0ZSBhIGRpcmVjdG9yeSBhbmQgZGVjcmVtZW50ZWQgCisgKiB3aGVuIHdlIGFsbG9jYXRlIGFuIGlub2RlLCB3aXRoaW4gMC0tMjU1LiAKKyAqLyAKKworI2RlZmluZSBJTk9ERV9DT1NUIDY0CisjZGVmaW5lIEJMT0NLX0NPU1QgMjU2CisKK3N0YXRpYyBpbnQgZmluZF9ncm91cF9vcmxvdihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaW5vZGUgKnBhcmVudCkKK3sKKwlpbnQgcGFyZW50X2dyb3VwID0gRVhUMl9JKHBhcmVudCktPmlfYmxvY2tfZ3JvdXA7CisJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQihzYik7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKmVzID0gc2JpLT5zX2VzOworCWludCBuZ3JvdXBzID0gc2JpLT5zX2dyb3Vwc19jb3VudDsKKwlpbnQgaW5vZGVzX3Blcl9ncm91cCA9IEVYVDJfSU5PREVTX1BFUl9HUk9VUChzYik7CisJaW50IGZyZWVpOworCWludCBhdmVmcmVlaTsKKwlpbnQgZnJlZV9ibG9ja3M7CisJaW50IGF2ZWZyZWViOworCWludCBibG9ja3NfcGVyX2RpcjsKKwlpbnQgbmRpcnM7CisJaW50IG1heF9kZWJ0LCBtYXhfZGlycywgbWluX2Jsb2NrcywgbWluX2lub2RlczsKKwlpbnQgZ3JvdXAgPSAtMSwgaTsKKwlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICpkZXNjOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwlmcmVlaSA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoJnNiaS0+c19mcmVlaW5vZGVzX2NvdW50ZXIpOworCWF2ZWZyZWVpID0gZnJlZWkgLyBuZ3JvdXBzOworCWZyZWVfYmxvY2tzID0gcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CisJYXZlZnJlZWIgPSBmcmVlX2Jsb2NrcyAvIG5ncm91cHM7CisJbmRpcnMgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZGlyc19jb3VudGVyKTsKKworCWlmICgocGFyZW50ID09IHNiLT5zX3Jvb3QtPmRfaW5vZGUpIHx8CisJICAgIChFWFQyX0kocGFyZW50KS0+aV9mbGFncyAmIEVYVDJfVE9QRElSX0ZMKSkgeworCQlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICpiZXN0X2Rlc2MgPSBOVUxMOworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJlc3RfYmggPSBOVUxMOworCQlpbnQgYmVzdF9uZGlyID0gaW5vZGVzX3Blcl9ncm91cDsKKwkJaW50IGJlc3RfZ3JvdXAgPSAtMTsKKworCQlnZXRfcmFuZG9tX2J5dGVzKCZncm91cCwgc2l6ZW9mKGdyb3VwKSk7CisJCXBhcmVudF9ncm91cCA9ICh1bnNpZ25lZClncm91cCAlIG5ncm91cHM7CisJCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKKwkJCWdyb3VwID0gKHBhcmVudF9ncm91cCArIGkpICUgbmdyb3VwczsKKwkJCWRlc2MgPSBleHQyX2dldF9ncm91cF9kZXNjIChzYiwgZ3JvdXAsICZiaCk7CisJCQlpZiAoIWRlc2MgfHwgIWRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX3VzZWRfZGlyc19jb3VudCkgPj0gYmVzdF9uZGlyKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSA8IGF2ZWZyZWVpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSA8IGF2ZWZyZWViKQorCQkJCWNvbnRpbnVlOworCQkJYmVzdF9ncm91cCA9IGdyb3VwOworCQkJYmVzdF9uZGlyID0gbGUxNl90b19jcHUoZGVzYy0+YmdfdXNlZF9kaXJzX2NvdW50KTsKKwkJCWJlc3RfZGVzYyA9IGRlc2M7CisJCQliZXN0X2JoID0gYmg7CisJCX0KKwkJaWYgKGJlc3RfZ3JvdXAgPj0gMCkgeworCQkJZGVzYyA9IGJlc3RfZGVzYzsKKwkJCWJoID0gYmVzdF9iaDsKKwkJCWdyb3VwID0gYmVzdF9ncm91cDsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwkJZ290byBmYWxsYmFjazsKKwl9CisKKwlpZiAobmRpcnMgPT0gMCkKKwkJbmRpcnMgPSAxOwkvKiBwZXJjcHVfY291bnRlcnMgYXJlIGFwcHJveGltYXRlLi4uICovCisKKwlibG9ja3NfcGVyX2RpciA9IChsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpLWZyZWVfYmxvY2tzKSAvIG5kaXJzOworCisJbWF4X2RpcnMgPSBuZGlycyAvIG5ncm91cHMgKyBpbm9kZXNfcGVyX2dyb3VwIC8gMTY7CisJbWluX2lub2RlcyA9IGF2ZWZyZWVpIC0gaW5vZGVzX3Blcl9ncm91cCAvIDQ7CisJbWluX2Jsb2NrcyA9IGF2ZWZyZWViIC0gRVhUMl9CTE9DS1NfUEVSX0dST1VQKHNiKSAvIDQ7CisKKwltYXhfZGVidCA9IEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzYikgLyBtYXgoYmxvY2tzX3Blcl9kaXIsIEJMT0NLX0NPU1QpOworCWlmIChtYXhfZGVidCAqIElOT0RFX0NPU1QgPiBpbm9kZXNfcGVyX2dyb3VwKQorCQltYXhfZGVidCA9IGlub2Rlc19wZXJfZ3JvdXAgLyBJTk9ERV9DT1NUOworCWlmIChtYXhfZGVidCA+IDI1NSkKKwkJbWF4X2RlYnQgPSAyNTU7CisJaWYgKG1heF9kZWJ0ID09IDApCisJCW1heF9kZWJ0ID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKKwkJZ3JvdXAgPSAocGFyZW50X2dyb3VwICsgaSkgJSBuZ3JvdXBzOworCQlkZXNjID0gZXh0Ml9nZXRfZ3JvdXBfZGVzYyAoc2IsIGdyb3VwLCAmYmgpOworCQlpZiAoIWRlc2MgfHwgIWRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KQorCQkJY29udGludWU7CisJCWlmIChzYmktPnNfZGVidHNbZ3JvdXBdID49IG1heF9kZWJ0KQorCQkJY29udGludWU7CisJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ191c2VkX2RpcnNfY291bnQpID49IG1heF9kaXJzKQorCQkJY29udGludWU7CisJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgPCBtaW5faW5vZGVzKQorCQkJY29udGludWU7CisJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkgPCBtaW5fYmxvY2tzKQorCQkJY29udGludWU7CisJCWdvdG8gZm91bmQ7CisJfQorCitmYWxsYmFjazoKKwlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKSB7CisJCWdyb3VwID0gKHBhcmVudF9ncm91cCArIGkpICUgbmdyb3VwczsKKwkJZGVzYyA9IGV4dDJfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBncm91cCwgJmJoKTsKKwkJaWYgKCFkZXNjIHx8ICFkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkKKwkJCWNvbnRpbnVlOworCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpID49IGF2ZWZyZWVpKQorCQkJZ290byBmb3VuZDsKKwl9CisKKwlpZiAoYXZlZnJlZWkpIHsKKwkJLyoKKwkJICogVGhlIGZyZWUtaW5vZGVzIGNvdW50ZXIgaXMgYXBwcm94aW1hdGUsIGFuZCBmb3IgcmVhbGx5IHNtYWxsCisJCSAqIGZpbGVzeXN0ZW1zIHRoZSBhYm92ZSB0ZXN0IGNhbiBmYWlsIHRvIGZpbmQgYW55IGJsb2NrZ3JvdXBzCisJCSAqLworCQlhdmVmcmVlaSA9IDA7CisJCWdvdG8gZmFsbGJhY2s7CisJfQorCisJcmV0dXJuIC0xOworCitmb3VuZDoKKwlyZXR1cm4gZ3JvdXA7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9ncm91cF9vdGhlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaW5vZGUgKnBhcmVudCkKK3sKKwlpbnQgcGFyZW50X2dyb3VwID0gRVhUMl9JKHBhcmVudCktPmlfYmxvY2tfZ3JvdXA7CisJaW50IG5ncm91cHMgPSBFWFQyX1NCKHNiKS0+c19ncm91cHNfY291bnQ7CisJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBncm91cCwgaTsKKworCS8qCisJICogVHJ5IHRvIHBsYWNlIHRoZSBpbm9kZSBpbiBpdHMgcGFyZW50IGRpcmVjdG9yeQorCSAqLworCWdyb3VwID0gcGFyZW50X2dyb3VwOworCWRlc2MgPSBleHQyX2dldF9ncm91cF9kZXNjIChzYiwgZ3JvdXAsICZiaCk7CisJaWYgKGRlc2MgJiYgbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpICYmCisJCQlsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkpCisJCWdvdG8gZm91bmQ7CisKKwkvKgorCSAqIFdlJ3JlIGdvaW5nIHRvIHBsYWNlIHRoaXMgaW5vZGUgaW4gYSBkaWZmZXJlbnQgYmxvY2tncm91cCBmcm9tIGl0cworCSAqIHBhcmVudC4gIFdlIHdhbnQgdG8gY2F1c2UgZmlsZXMgaW4gYSBjb21tb24gZGlyZWN0b3J5IHRvIGFsbCBsYW5kIGluCisJICogdGhlIHNhbWUgYmxvY2tncm91cC4gIEJ1dCB3ZSB3YW50IGZpbGVzIHdoaWNoIGFyZSBpbiBhIGRpZmZlcmVudAorCSAqIGRpcmVjdG9yeSB3aGljaCBzaGFyZXMgYSBibG9ja2dyb3VwIHdpdGggb3VyIHBhcmVudCB0byBsYW5kIGluIGEKKwkgKiBkaWZmZXJlbnQgYmxvY2tncm91cC4KKwkgKgorCSAqIFNvIGFkZCBvdXIgZGlyZWN0b3J5J3MgaV9pbm8gaW50byB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHRoZSBoYXNoLgorCSAqLworCWdyb3VwID0gKGdyb3VwICsgcGFyZW50LT5pX2lubykgJSBuZ3JvdXBzOworCisJLyoKKwkgKiBVc2UgYSBxdWFkcmF0aWMgaGFzaCB0byBmaW5kIGEgZ3JvdXAgd2l0aCBhIGZyZWUgaW5vZGUgYW5kIHNvbWUKKwkgKiBmcmVlIGJsb2Nrcy4KKwkgKi8KKwlmb3IgKGkgPSAxOyBpIDwgbmdyb3VwczsgaSA8PD0gMSkgeworCQlncm91cCArPSBpOworCQlpZiAoZ3JvdXAgPj0gbmdyb3VwcykKKwkJCWdyb3VwIC09IG5ncm91cHM7CisJCWRlc2MgPSBleHQyX2dldF9ncm91cF9kZXNjIChzYiwgZ3JvdXAsICZiaCk7CisJCWlmIChkZXNjICYmIGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSAmJgorCQkJCWxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSkKKwkJCWdvdG8gZm91bmQ7CisJfQorCisJLyoKKwkgKiBUaGF0IGZhaWxlZDogdHJ5IGxpbmVhciBzZWFyY2ggZm9yIGEgZnJlZSBpbm9kZSwgZXZlbiBpZiB0aGF0IGdyb3VwCisJICogaGFzIG5vIGZyZWUgYmxvY2tzLgorCSAqLworCWdyb3VwID0gcGFyZW50X2dyb3VwOworCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKKwkJaWYgKCsrZ3JvdXAgPj0gbmdyb3VwcykKKwkJCWdyb3VwID0gMDsKKwkJZGVzYyA9IGV4dDJfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBncm91cCwgJmJoKTsKKwkJaWYgKGRlc2MgJiYgbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpKQorCQkJZ290byBmb3VuZDsKKwl9CisKKwlyZXR1cm4gLTE7CisKK2ZvdW5kOgorCXJldHVybiBncm91cDsKK30KKworc3RydWN0IGlub2RlICpleHQyX25ld19pbm9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgaW50IG1vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDI7CisJaW50IGdyb3VwLCBpOworCWlub190IGlubyA9IDA7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqZ2RwOworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICplczsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvICplaTsKKwlzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmk7CisJaW50IGVycjsKKworCXNiID0gZGlyLT5pX3NiOworCWlub2RlID0gbmV3X2lub2RlKHNiKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWVpID0gRVhUMl9JKGlub2RlKTsKKwlzYmkgPSBFWFQyX1NCKHNiKTsKKwllcyA9IHNiaS0+c19lczsKKwlpZiAoU19JU0RJUihtb2RlKSkgeworCQlpZiAodGVzdF9vcHQoc2IsIE9MREFMTE9DKSkKKwkJCWdyb3VwID0gZmluZF9ncm91cF9kaXIoc2IsIGRpcik7CisJCWVsc2UKKwkJCWdyb3VwID0gZmluZF9ncm91cF9vcmxvdihzYiwgZGlyKTsKKwl9IGVsc2UgCisJCWdyb3VwID0gZmluZF9ncm91cF9vdGhlcihzYiwgZGlyKTsKKworCWlmIChncm91cCA9PSAtMSkgeworCQllcnIgPSAtRU5PU1BDOworCQlnb3RvIGZhaWw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNiaS0+c19ncm91cHNfY291bnQ7IGkrKykgeworCQlnZHAgPSBleHQyX2dldF9ncm91cF9kZXNjKHNiLCBncm91cCwgJmJoMik7CisJCWJyZWxzZShiaXRtYXBfYmgpOworCQliaXRtYXBfYmggPSByZWFkX2lub2RlX2JpdG1hcChzYiwgZ3JvdXApOworCQlpZiAoIWJpdG1hcF9iaCkgeworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpbm8gPSAwOworCityZXBlYXRfaW5fdGhpc19ncm91cDoKKwkJaW5vID0gZXh0Ml9maW5kX25leHRfemVyb19iaXQoKHVuc2lnbmVkIGxvbmcgKiliaXRtYXBfYmgtPmJfZGF0YSwKKwkJCQkJICAgICAgRVhUMl9JTk9ERVNfUEVSX0dST1VQKHNiKSwgaW5vKTsKKwkJaWYgKGlubyA+PSBFWFQyX0lOT0RFU19QRVJfR1JPVVAoc2IpKSB7CisJCQkvKgorCQkJICogUmFyZSByYWNlOiBmaW5kX2dyb3VwX3h4KCkgZGVjaWRlZCB0aGF0IHRoZXJlIHdlcmUKKwkJCSAqIGZyZWUgaW5vZGVzIGluIHRoaXMgZ3JvdXAsIGJ1dCBieSB0aGUgdGltZSB3ZSB0cmllZAorCQkJICogdG8gYWxsb2NhdGUgb25lLCB0aGV5J3JlIGFsbCBnb25lLiAgVGhpcyBjYW4gYWxzbworCQkJICogb2NjdXIgYmVjYXVzZSB0aGUgY291bnRlcnMgd2hpY2ggZmluZF9ncm91cF9vcmxvdigpCisJCQkgKiB1c2VzIGFyZSBhcHByb3hpbWF0ZS4gIFNvIGp1c3QgZ28gYW5kIHNlYXJjaCB0aGUKKwkJCSAqIG5leHQgYmxvY2sgZ3JvdXAuCisJCQkgKi8KKwkJCWlmICgrK2dyb3VwID09IHNiaS0+c19ncm91cHNfY291bnQpCisJCQkJZ3JvdXAgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGV4dDJfc2V0X2JpdF9hdG9taWMoc2JfYmdsX2xvY2soc2JpLCBncm91cCksCisJCQkJCQlpbm8sIGJpdG1hcF9iaC0+Yl9kYXRhKSkgeworCQkJLyogd2UgbG9zdCB0aGlzIGlub2RlICovCisJCQlpZiAoKytpbm8gPj0gRVhUMl9JTk9ERVNfUEVSX0dST1VQKHNiKSkgeworCQkJCS8qIHRoaXMgZ3JvdXAgaXMgZXhoYXVzdGVkLCB0cnkgbmV4dCBncm91cCAqLworCQkJCWlmICgrK2dyb3VwID09IHNiaS0+c19ncm91cHNfY291bnQpCisJCQkJCWdyb3VwID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIHRyeSB0byBmaW5kIGZyZWUgaW5vZGUgaW4gdGhlIHNhbWUgZ3JvdXAgKi8KKwkJCWdvdG8gcmVwZWF0X2luX3RoaXNfZ3JvdXA7CisJCX0KKwkJZ290byBnb3Q7CisJfQorCisJLyoKKwkgKiBTY2FubmVkIGFsbCBibG9ja2dyb3Vwcy4KKwkgKi8KKwllcnIgPSAtRU5PU1BDOworCWdvdG8gZmFpbDsKK2dvdDoKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaXRtYXBfYmgpOworCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKQorCQlzeW5jX2RpcnR5X2J1ZmZlcihiaXRtYXBfYmgpOworCWJyZWxzZShiaXRtYXBfYmgpOworCisJaW5vICs9IGdyb3VwICogRVhUMl9JTk9ERVNfUEVSX0dST1VQKHNiKSArIDE7CisJaWYgKGlubyA8IEVYVDJfRklSU1RfSU5PKHNiKSB8fCBpbm8gPiBsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfY291bnQpKSB7CisJCWV4dDJfZXJyb3IgKHNiLCAiZXh0Ml9uZXdfaW5vZGUiLAorCQkJICAgICJyZXNlcnZlZCBpbm9kZSBvciBpbm9kZSA+IGlub2RlcyBjb3VudCAtICIKKwkJCSAgICAiYmxvY2tfZ3JvdXAgPSAlZCxpbm9kZT0lbHUiLCBncm91cCwKKwkJCSAgICAodW5zaWduZWQgbG9uZykgaW5vKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBmYWlsOworCX0KKworCXBlcmNwdV9jb3VudGVyX21vZCgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlciwgLTEpOworCWlmIChTX0lTRElSKG1vZGUpKQorCQlwZXJjcHVfY291bnRlcl9pbmMoJnNiaS0+c19kaXJzX2NvdW50ZXIpOworCisJc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKKwlnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50ID0KKyAgICAgICAgICAgICAgICBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSAtIDEpOworCWlmIChTX0lTRElSKG1vZGUpKSB7CisJCWlmIChzYmktPnNfZGVidHNbZ3JvdXBdIDwgMjU1KQorCQkJc2JpLT5zX2RlYnRzW2dyb3VwXSsrOworCQlnZHAtPmJnX3VzZWRfZGlyc19jb3VudCA9CisJCQljcHVfdG9fbGUxNihsZTE2X3RvX2NwdShnZHAtPmJnX3VzZWRfZGlyc19jb3VudCkgKyAxKTsKKwl9IGVsc2UgeworCQlpZiAoc2JpLT5zX2RlYnRzW2dyb3VwXSkKKwkJCXNiaS0+c19kZWJ0c1tncm91cF0tLTsKKwl9CisJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cCkpOworCisJc2ItPnNfZGlydCA9IDE7CisJbWFya19idWZmZXJfZGlydHkoYmgyKTsKKwlpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlpZiAodGVzdF9vcHQgKHNiLCBHUlBJRCkpCisJCWlub2RlLT5pX2dpZCA9IGRpci0+aV9naWQ7CisJZWxzZSBpZiAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKSB7CisJCWlub2RlLT5pX2dpZCA9IGRpci0+aV9naWQ7CisJCWlmIChTX0lTRElSKG1vZGUpKQorCQkJbW9kZSB8PSBTX0lTR0lEOworCX0gZWxzZQorCQlpbm9kZS0+aV9naWQgPSBjdXJyZW50LT5mc2dpZDsKKwlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKworCWlub2RlLT5pX2lubyA9IGlubzsKKwlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOwkvKiBUaGlzIGlzIHRoZSBvcHRpbWFsIElPIHNpemUgKGZvciBzdGF0KSwgbm90IHRoZSBmcyBibG9jayBzaXplICovCisJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCW1lbXNldChlaS0+aV9kYXRhLCAwLCBzaXplb2YoZWktPmlfZGF0YSkpOworCWVpLT5pX2ZsYWdzID0gRVhUMl9JKGRpciktPmlfZmxhZ3MgJiB+RVhUMl9CVFJFRV9GTDsKKwlpZiAoU19JU0xOSyhtb2RlKSkKKwkJZWktPmlfZmxhZ3MgJj0gfihFWFQyX0lNTVVUQUJMRV9GTHxFWFQyX0FQUEVORF9GTCk7CisJLyogZGlyc3luYyBpcyBvbmx5IGFwcGxpZWQgdG8gZGlyZWN0b3JpZXMgKi8KKwlpZiAoIVNfSVNESVIobW9kZSkpCisJCWVpLT5pX2ZsYWdzICY9IH5FWFQyX0RJUlNZTkNfRkw7CisJZWktPmlfZmFkZHIgPSAwOworCWVpLT5pX2ZyYWdfbm8gPSAwOworCWVpLT5pX2ZyYWdfc2l6ZSA9IDA7CisJZWktPmlfZmlsZV9hY2wgPSAwOworCWVpLT5pX2Rpcl9hY2wgPSAwOworCWVpLT5pX2R0aW1lID0gMDsKKwllaS0+aV9ibG9ja19ncm91cCA9IGdyb3VwOworCWVpLT5pX25leHRfYWxsb2NfYmxvY2sgPSAwOworCWVpLT5pX25leHRfYWxsb2NfZ29hbCA9IDA7CisJZWktPmlfcHJlYWxsb2NfYmxvY2sgPSAwOworCWVpLT5pX3ByZWFsbG9jX2NvdW50ID0gMDsKKwllaS0+aV9kaXJfc3RhcnRfbG9va3VwID0gMDsKKwllaS0+aV9zdGF0ZSA9IEVYVDJfU1RBVEVfTkVXOworCWV4dDJfc2V0X2lub2RlX2ZsYWdzKGlub2RlKTsKKwlzcGluX2xvY2soJnNiaS0+c19uZXh0X2dlbl9sb2NrKTsKKwlpbm9kZS0+aV9nZW5lcmF0aW9uID0gc2JpLT5zX25leHRfZ2VuZXJhdGlvbisrOworCXNwaW5fdW5sb2NrKCZzYmktPnNfbmV4dF9nZW5fbG9jayk7CisJaW5zZXJ0X2lub2RlX2hhc2goaW5vZGUpOworCisJaWYgKERRVU9UX0FMTE9DX0lOT0RFKGlub2RlKSkgeworCQlEUVVPVF9EUk9QKGlub2RlKTsKKwkJZXJyID0gLUVOT1NQQzsKKwkJZ290byBmYWlsMjsKKwl9CisJZXJyID0gZXh0Ml9pbml0X2FjbChpbm9kZSwgZGlyKTsKKwlpZiAoZXJyKSB7CisJCURRVU9UX0ZSRUVfSU5PREUoaW5vZGUpOworCQlnb3RvIGZhaWwyOworCX0KKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlleHQyX2RlYnVnKCJhbGxvY2F0aW5nIGlub2RlICVsdVxuIiwgaW5vZGUtPmlfaW5vKTsKKwlleHQyX3ByZXJlYWRfaW5vZGUoaW5vZGUpOworCXJldHVybiBpbm9kZTsKKworZmFpbDI6CisJaW5vZGUtPmlfZmxhZ3MgfD0gU19OT1FVT1RBOworCWlub2RlLT5pX25saW5rID0gMDsKKwlpcHV0KGlub2RlKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworCitmYWlsOgorCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwlpcHV0KGlub2RlKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCit1bnNpZ25lZCBsb25nIGV4dDJfY291bnRfZnJlZV9pbm9kZXMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQoreworCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKmRlc2M7CisJdW5zaWduZWQgbG9uZyBkZXNjX2NvdW50ID0gMDsKKwlpbnQgaTsJCisKKyNpZmRlZiBFWFQyRlNfREVCVUcKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXM7CisJdW5zaWduZWQgbG9uZyBiaXRtYXBfY291bnQgPSAwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKKworCWxvY2tfc3VwZXIgKHNiKTsKKwllcyA9IEVYVDJfU0Ioc2IpLT5zX2VzOworCWZvciAoaSA9IDA7IGkgPCBFWFQyX1NCKHNiKS0+c19ncm91cHNfY291bnQ7IGkrKykgeworCQl1bnNpZ25lZCB4OworCisJCWRlc2MgPSBleHQyX2dldF9ncm91cF9kZXNjIChzYiwgaSwgTlVMTCk7CisJCWlmICghZGVzYykKKwkJCWNvbnRpbnVlOworCQlkZXNjX2NvdW50ICs9IGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KTsKKwkJYnJlbHNlKGJpdG1hcF9iaCk7CisJCWJpdG1hcF9iaCA9IHJlYWRfaW5vZGVfYml0bWFwKHNiLCBpKTsKKwkJaWYgKCFiaXRtYXBfYmgpCisJCQljb250aW51ZTsKKworCQl4ID0gZXh0Ml9jb3VudF9mcmVlKGJpdG1hcF9iaCwgRVhUMl9JTk9ERVNfUEVSX0dST1VQKHNiKSAvIDgpOworCQlwcmludGsoImdyb3VwICVkOiBzdG9yZWQgPSAlZCwgY291bnRlZCA9ICV1XG4iLAorCQkJaSwgbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpLCB4KTsKKwkJYml0bWFwX2NvdW50ICs9IHg7CisJfQorCWJyZWxzZShiaXRtYXBfYmgpOworCXByaW50aygiZXh0Ml9jb3VudF9mcmVlX2lub2Rlczogc3RvcmVkID0gJWx1LCBjb21wdXRlZCA9ICVsdSwgJWx1XG4iLAorCQlwZXJjcHVfY291bnRlcl9yZWFkKCZFWFQyX1NCKHNiKS0+c19mcmVlaW5vZGVzX2NvdW50ZXIpLAorCQlkZXNjX2NvdW50LCBiaXRtYXBfY291bnQpOworCXVubG9ja19zdXBlcihzYik7CisJcmV0dXJuIGRlc2NfY291bnQ7CisjZWxzZQorCWZvciAoaSA9IDA7IGkgPCBFWFQyX1NCKHNiKS0+c19ncm91cHNfY291bnQ7IGkrKykgeworCQlkZXNjID0gZXh0Ml9nZXRfZ3JvdXBfZGVzYyAoc2IsIGksIE5VTEwpOworCQlpZiAoIWRlc2MpCisJCQljb250aW51ZTsKKwkJZGVzY19jb3VudCArPSBsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCk7CisJfQorCXJldHVybiBkZXNjX2NvdW50OworI2VuZGlmCit9CisKKy8qIENhbGxlZCBhdCBtb3VudC10aW1lLCBzdXBlci1ibG9jayBpcyBsb2NrZWQgKi8KK3Vuc2lnbmVkIGxvbmcgZXh0Ml9jb3VudF9kaXJzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKK3sKKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBFWFQyX1NCKHNiKS0+c19ncm91cHNfY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICpnZHAgPSBleHQyX2dldF9ncm91cF9kZXNjIChzYiwgaSwgTlVMTCk7CisJCWlmICghZ2RwKQorCQkJY29udGludWU7CisJCWNvdW50ICs9IGxlMTZfdG9fY3B1KGdkcC0+YmdfdXNlZF9kaXJzX2NvdW50KTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCisjaWZkZWYgQ09ORklHX0VYVDJfQ0hFQ0sKKy8qIENhbGxlZCBhdCBtb3VudC10aW1lLCBzdXBlci1ibG9jayBpcyBsb2NrZWQgKi8KK3ZvaWQgZXh0Ml9jaGVja19pbm9kZXNfYml0bWFwIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKK3sKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqIGVzID0gRVhUMl9TQihzYiktPnNfZXM7CisJdW5zaWduZWQgbG9uZyBkZXNjX2NvdW50ID0gMCwgYml0bWFwX2NvdW50ID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRVhUMl9TQihzYiktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqZGVzYzsKKwkJdW5zaWduZWQgeDsKKworCQlkZXNjID0gZXh0Ml9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CisJCWlmICghZGVzYykKKwkJCWNvbnRpbnVlOworCQlkZXNjX2NvdW50ICs9IGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KTsKKwkJYnJlbHNlKGJpdG1hcF9iaCk7CisJCWJpdG1hcF9iaCA9IHJlYWRfaW5vZGVfYml0bWFwKHNiLCBpKTsKKwkJaWYgKCFiaXRtYXBfYmgpCisJCQljb250aW51ZTsKKwkJCisJCXggPSBleHQyX2NvdW50X2ZyZWUoYml0bWFwX2JoLCBFWFQyX0lOT0RFU19QRVJfR1JPVVAoc2IpIC8gOCk7CisJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgIT0geCkKKwkJCWV4dDJfZXJyb3IgKHNiLCAiZXh0Ml9jaGVja19pbm9kZXNfYml0bWFwIiwKKwkJCQkgICAgIldyb25nIGZyZWUgaW5vZGVzIGNvdW50IGluIGdyb3VwICVkLCAiCisJCQkJICAgICJzdG9yZWQgPSAlZCwgY291bnRlZCA9ICVsdSIsIGksCisJCQkJICAgIGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSwgeCk7CisJCWJpdG1hcF9jb3VudCArPSB4OworCX0KKwlicmVsc2UoYml0bWFwX2JoKTsKKwlpZiAocGVyY3B1X2NvdW50ZXJfcmVhZCgmRVhUMl9TQihzYiktPnNfZnJlZWlub2Rlc19jb3VudGVyKSAhPQorCQkJCWJpdG1hcF9jb3VudCkKKwkJZXh0Ml9lcnJvcihzYiwgImV4dDJfY2hlY2tfaW5vZGVzX2JpdG1hcCIsCisJCQkgICAgIldyb25nIGZyZWUgaW5vZGVzIGNvdW50IGluIHN1cGVyIGJsb2NrLCAiCisJCQkgICAgInN0b3JlZCA9ICVsdSwgY291bnRlZCA9ICVsdSIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpbGUzMl90b19jcHUoZXMtPnNfZnJlZV9pbm9kZXNfY291bnQpLAorCQkJICAgIGJpdG1hcF9jb3VudCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvaW5vZGUuYyBiL2ZzL2V4dDIvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODkwYmUwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0Mi9pbm9kZS5jCkBAIC0wLDAgKzEsMTI3NiBAQAorLyoKKyAqICBsaW51eC9mcy9leHQyL2lub2RlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvbWluaXgvaW5vZGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIEdvYWwtZGlyZWN0ZWQgYmxvY2sgYWxsb2NhdGlvbiBieSBTdGVwaGVuIFR3ZWVkaWUKKyAqIAkoc2N0QGRjcy5lZC5hYy51ayksIDE5OTMsIDE5OTgKKyAqICBCaWctZW5kaWFuIHRvIGxpdHRsZS1lbmRpYW4gYnl0ZS1zd2FwcGluZy9iaXRtYXBzIGJ5CisgKiAgICAgICAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KSwgMTk5NQorICogIDY0LWJpdCBmaWxlIHN1cHBvcnQgb24gNjQtYml0IHBsYXRmb3JtcyBieSBKYWt1YiBKZWxpbmVrCisgKiAJKGpqQHN1bnNpdGUubXMubWZmLmN1bmkuY3opCisgKgorICogIEFzc29ydGVkIHJhY2UgZml4ZXMsIHJld3JpdGUgb2YgZXh0Ml9nZXRfYmxvY2soKSBieSBBbCBWaXJvLCAyMDAwCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CisjaW5jbHVkZSAiZXh0Mi5oIgorI2luY2x1ZGUgImFjbC5oIgorCitNT0RVTEVfQVVUSE9SKCJSZW15IENhcmQgYW5kIG90aGVycyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTZWNvbmQgRXh0ZW5kZWQgRmlsZXN5c3RlbSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IGV4dDJfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgZG9fc3luYyk7CisKKy8qCisgKiBUZXN0IHdoZXRoZXIgYW4gaW5vZGUgaXMgYSBmYXN0IHN5bWxpbmsuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGV4dDJfaW5vZGVfaXNfZmFzdF9zeW1saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGVhX2Jsb2NrcyA9IEVYVDJfSShpbm9kZSktPmlfZmlsZV9hY2wgPworCQkoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplID4+IDkpIDogMDsKKworCXJldHVybiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSAmJgorCQlpbm9kZS0+aV9ibG9ja3MgLSBlYV9ibG9ja3MgPT0gMCk7Cit9CisKKy8qCisgKiBDYWxsZWQgYXQgdGhlIGxhc3QgaXB1dCgpIGlmIGlfbmxpbmsgaXMgemVyby4KKyAqLwordm9pZCBleHQyX2RlbGV0ZV9pbm9kZSAoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCisJCWdvdG8gbm9fZGVsZXRlOworCUVYVDJfSShpbm9kZSktPmlfZHRpbWUJPSBnZXRfc2Vjb25kcygpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCWV4dDJfdXBkYXRlX2lub2RlKGlub2RlLCBpbm9kZV9uZWVkc19zeW5jKGlub2RlKSk7CisKKwlpbm9kZS0+aV9zaXplID0gMDsKKwlpZiAoaW5vZGUtPmlfYmxvY2tzKQorCQlleHQyX3RydW5jYXRlIChpbm9kZSk7CisJZXh0Ml9mcmVlX2lub2RlIChpbm9kZSk7CisKKwlyZXR1cm47Citub19kZWxldGU6CisJY2xlYXJfaW5vZGUoaW5vZGUpOwkvKiBXZSBtdXN0IGd1YXJhbnRlZSBjbGVhcmluZyBvZiBpbm9kZS4uLiAqLworfQorCit2b2lkIGV4dDJfZGlzY2FyZF9wcmVhbGxvYyAoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisjaWZkZWYgRVhUMl9QUkVBTExPQ0FURQorCXN0cnVjdCBleHQyX2lub2RlX2luZm8gKmVpID0gRVhUMl9JKGlub2RlKTsKKwl3cml0ZV9sb2NrKCZlaS0+aV9tZXRhX2xvY2spOworCWlmIChlaS0+aV9wcmVhbGxvY19jb3VudCkgeworCQl1bnNpZ25lZCBzaG9ydCB0b3RhbCA9IGVpLT5pX3ByZWFsbG9jX2NvdW50OworCQl1bnNpZ25lZCBsb25nIGJsb2NrID0gZWktPmlfcHJlYWxsb2NfYmxvY2s7CisJCWVpLT5pX3ByZWFsbG9jX2NvdW50ID0gMDsKKwkJZWktPmlfcHJlYWxsb2NfYmxvY2sgPSAwOworCQl3cml0ZV91bmxvY2soJmVpLT5pX21ldGFfbG9jayk7CisJCWV4dDJfZnJlZV9ibG9ja3MgKGlub2RlLCBibG9jaywgdG90YWwpOworCQlyZXR1cm47CisJfSBlbHNlCisJCXdyaXRlX3VubG9jaygmZWktPmlfbWV0YV9sb2NrKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGV4dDJfYWxsb2NfYmxvY2sgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCB1bnNpZ25lZCBsb25nIGdvYWwsIGludCAqZXJyKQoreworI2lmZGVmIEVYVDJGU19ERUJVRworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGFsbG9jX2hpdHMsIGFsbG9jX2F0dGVtcHRzOworI2VuZGlmCisJdW5zaWduZWQgbG9uZyByZXN1bHQ7CisKKworI2lmZGVmIEVYVDJfUFJFQUxMT0NBVEUKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvICplaSA9IEVYVDJfSShpbm9kZSk7CisJd3JpdGVfbG9jaygmZWktPmlfbWV0YV9sb2NrKTsKKwlpZiAoZWktPmlfcHJlYWxsb2NfY291bnQgJiYKKwkgICAgKGdvYWwgPT0gZWktPmlfcHJlYWxsb2NfYmxvY2sgfHwgZ29hbCArIDEgPT0gZWktPmlfcHJlYWxsb2NfYmxvY2spKQorCXsKKwkJcmVzdWx0ID0gZWktPmlfcHJlYWxsb2NfYmxvY2srKzsKKwkJZWktPmlfcHJlYWxsb2NfY291bnQtLTsKKwkJd3JpdGVfdW5sb2NrKCZlaS0+aV9tZXRhX2xvY2spOworCQlleHQyX2RlYnVnICgicHJlYWxsb2NhdGlvbiBoaXQgKCVsdS8lbHUpLlxuIiwKKwkJCSAgICArK2FsbG9jX2hpdHMsICsrYWxsb2NfYXR0ZW1wdHMpOworCX0gZWxzZSB7CisJCXdyaXRlX3VubG9jaygmZWktPmlfbWV0YV9sb2NrKTsKKwkJZXh0Ml9kaXNjYXJkX3ByZWFsbG9jIChpbm9kZSk7CisJCWV4dDJfZGVidWcgKCJwcmVhbGxvY2F0aW9uIG1pc3MgKCVsdS8lbHUpLlxuIiwKKwkJCSAgICBhbGxvY19oaXRzLCArK2FsbG9jX2F0dGVtcHRzKTsKKwkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCQlyZXN1bHQgPSBleHQyX25ld19ibG9jayAoaW5vZGUsIGdvYWwsIAorCQkJCSAmZWktPmlfcHJlYWxsb2NfY291bnQsCisJCQkJICZlaS0+aV9wcmVhbGxvY19ibG9jaywgZXJyKTsKKwkJZWxzZQorCQkJcmVzdWx0ID0gZXh0Ml9uZXdfYmxvY2soaW5vZGUsIGdvYWwsIE5VTEwsIE5VTEwsIGVycik7CisJfQorI2Vsc2UKKwlyZXN1bHQgPSBleHQyX25ld19ibG9jayAoaW5vZGUsIGdvYWwsIDAsIDAsIGVycik7CisjZW5kaWYKKwlyZXR1cm4gcmVzdWx0OworfQorCit0eXBlZGVmIHN0cnVjdCB7CisJX19sZTMyCSpwOworCV9fbGUzMglrZXk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKK30gSW5kaXJlY3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfY2hhaW4oSW5kaXJlY3QgKnAsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIF9fbGUzMiAqdikKK3sKKwlwLT5rZXkgPSAqKHAtPnAgPSB2KTsKKwlwLT5iaCA9IGJoOworfQorCitzdGF0aWMgaW5saW5lIGludCB2ZXJpZnlfY2hhaW4oSW5kaXJlY3QgKmZyb20sIEluZGlyZWN0ICp0bykKK3sKKwl3aGlsZSAoZnJvbSA8PSB0byAmJiBmcm9tLT5rZXkgPT0gKmZyb20tPnApCisJCWZyb20rKzsKKwlyZXR1cm4gKGZyb20gPiB0byk7Cit9CisKKy8qKgorICoJZXh0Ml9ibG9ja190b19wYXRoIC0gcGFyc2UgdGhlIGJsb2NrIG51bWJlciBpbnRvIGFycmF5IG9mIG9mZnNldHMKKyAqCUBpbm9kZTogaW5vZGUgaW4gcXVlc3Rpb24gKHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gaXRzIHN1cGVyYmxvY2spCisgKglAaV9ibG9jazogYmxvY2sgbnVtYmVyIHRvIGJlIHBhcnNlZAorICoJQG9mZnNldHM6IGFycmF5IHRvIHN0b3JlIHRoZSBvZmZzZXRzIGluCisgKiAgICAgIEBib3VuZGFyeTogc2V0IHRoaXMgbm9uLXplcm8gaWYgdGhlIHJlZmVycmVkLXRvIGJsb2NrIGlzIGxpa2VseSB0byBiZQorICogICAgICAgICAgICAgZm9sbG93ZWQgKG9uIGRpc2spIGJ5IGFuIGluZGlyZWN0IGJsb2NrLgorICoJVG8gc3RvcmUgdGhlIGxvY2F0aW9ucyBvZiBmaWxlJ3MgZGF0YSBleHQyIHVzZXMgYSBkYXRhIHN0cnVjdHVyZSBjb21tb24KKyAqCWZvciBVTklYIGZpbGVzeXN0ZW1zIC0gdHJlZSBvZiBwb2ludGVycyBhbmNob3JlZCBpbiB0aGUgaW5vZGUsIHdpdGgKKyAqCWRhdGEgYmxvY2tzIGF0IGxlYXZlcyBhbmQgaW5kaXJlY3QgYmxvY2tzIGluIGludGVybWVkaWF0ZSBub2Rlcy4KKyAqCVRoaXMgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgYmxvY2sgbnVtYmVyIGludG8gcGF0aCBpbiB0aGF0IHRyZWUgLQorICoJcmV0dXJuIHZhbHVlIGlzIHRoZSBwYXRoIGxlbmd0aCBhbmQgQG9mZnNldHNbbl0gaXMgdGhlIG9mZnNldCBvZgorICoJcG9pbnRlciB0byAobisxKXRoIG5vZGUgaW4gdGhlIG50aCBvbmUuIElmIEBibG9jayBpcyBvdXQgb2YgcmFuZ2UKKyAqCShuZWdhdGl2ZSBvciB0b28gbGFyZ2UpIHdhcm5pbmcgaXMgcHJpbnRlZCBhbmQgemVybyByZXR1cm5lZC4KKyAqCisgKglOb3RlOiBmdW5jdGlvbiBkb2Vzbid0IGZpbmQgbm9kZSBhZGRyZXNzZXMsIHNvIG5vIElPIGlzIG5lZWRlZC4gQWxsCisgKgl3ZSBuZWVkIHRvIGtub3cgaXMgdGhlIGNhcGFjaXR5IG9mIGluZGlyZWN0IGJsb2NrcyAodGFrZW4gZnJvbSB0aGUKKyAqCWlub2RlLT5pX3NiKS4KKyAqLworCisvKgorICogUG9ydGFiaWxpdHkgbm90ZTogdGhlIGxhc3QgY29tcGFyaXNvbiAoY2hlY2sgdGhhdCB3ZSBmaXQgaW50byB0cmlwbGUKKyAqIGluZGlyZWN0IGJsb2NrKSBpcyBzcGVsbGVkIGRpZmZlcmVudGx5LCBiZWNhdXNlIG90aGVyd2lzZSBvbiBhbgorICogYXJjaGl0ZWN0dXJlIHdpdGggMzItYml0IGxvbmdzIGFuZCA4S2IgcGFnZXMgd2UgbWlnaHQgZ2V0IGludG8gdHJvdWJsZQorICogaWYgb3VyIGZpbGVzeXN0ZW0gaGFkIDhLYiBibG9ja3MuIFdlIG1pZ2h0IHVzZSBsb25nIGxvbmcsIGJ1dCB0aGF0IHdvdWxkCisgKiBraWxsIHVzIG9uIHg4Ni4gT2gsIHdlbGwsIGF0IGxlYXN0IHRoZSBzaWduIHByb3BhZ2F0aW9uIGRvZXMgbm90IG1hdHRlciAtCisgKiBpX2Jsb2NrIHdvdWxkIGhhdmUgdG8gYmUgbmVnYXRpdmUgaW4gdGhlIHZlcnkgYmVnaW5uaW5nLCBzbyB3ZSB3b3VsZCBub3QKKyAqIGdldCB0aGVyZSBhdCBhbGwuCisgKi8KKworc3RhdGljIGludCBleHQyX2Jsb2NrX3RvX3BhdGgoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCWxvbmcgaV9ibG9jaywgaW50IG9mZnNldHNbNF0sIGludCAqYm91bmRhcnkpCit7CisJaW50IHB0cnMgPSBFWFQyX0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKTsKKwlpbnQgcHRyc19iaXRzID0gRVhUMl9BRERSX1BFUl9CTE9DS19CSVRTKGlub2RlLT5pX3NiKTsKKwljb25zdCBsb25nIGRpcmVjdF9ibG9ja3MgPSBFWFQyX05ESVJfQkxPQ0tTLAorCQlpbmRpcmVjdF9ibG9ja3MgPSBwdHJzLAorCQlkb3VibGVfYmxvY2tzID0gKDEgPDwgKHB0cnNfYml0cyAqIDIpKTsKKwlpbnQgbiA9IDA7CisJaW50IGZpbmFsID0gMDsKKworCWlmIChpX2Jsb2NrIDwgMCkgeworCQlleHQyX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiZXh0Ml9ibG9ja190b19wYXRoIiwgImJsb2NrIDwgMCIpOworCX0gZWxzZSBpZiAoaV9ibG9jayA8IGRpcmVjdF9ibG9ja3MpIHsKKwkJb2Zmc2V0c1tuKytdID0gaV9ibG9jazsKKwkJZmluYWwgPSBkaXJlY3RfYmxvY2tzOworCX0gZWxzZSBpZiAoIChpX2Jsb2NrIC09IGRpcmVjdF9ibG9ja3MpIDwgaW5kaXJlY3RfYmxvY2tzKSB7CisJCW9mZnNldHNbbisrXSA9IEVYVDJfSU5EX0JMT0NLOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrOworCQlmaW5hbCA9IHB0cnM7CisJfSBlbHNlIGlmICgoaV9ibG9jayAtPSBpbmRpcmVjdF9ibG9ja3MpIDwgZG91YmxlX2Jsb2NrcykgeworCQlvZmZzZXRzW24rK10gPSBFWFQyX0RJTkRfQkxPQ0s7CisJCW9mZnNldHNbbisrXSA9IGlfYmxvY2sgPj4gcHRyc19iaXRzOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKKwkJZmluYWwgPSBwdHJzOworCX0gZWxzZSBpZiAoKChpX2Jsb2NrIC09IGRvdWJsZV9ibG9ja3MpID4+IChwdHJzX2JpdHMgKiAyKSkgPCBwdHJzKSB7CisJCW9mZnNldHNbbisrXSA9IEVYVDJfVElORF9CTE9DSzsKKwkJb2Zmc2V0c1tuKytdID0gaV9ibG9jayA+PiAocHRyc19iaXRzICogMik7CisJCW9mZnNldHNbbisrXSA9IChpX2Jsb2NrID4+IHB0cnNfYml0cykgJiAocHRycyAtIDEpOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKKwkJZmluYWwgPSBwdHJzOworCX0gZWxzZSB7CisJCWV4dDJfd2FybmluZyAoaW5vZGUtPmlfc2IsICJleHQyX2Jsb2NrX3RvX3BhdGgiLCAiYmxvY2sgPiBiaWciKTsKKwl9CisJaWYgKGJvdW5kYXJ5KQorCQkqYm91bmRhcnkgPSAoaV9ibG9jayAmIChwdHJzIC0gMSkpID09IChmaW5hbCAtIDEpOworCXJldHVybiBuOworfQorCisvKioKKyAqCWV4dDJfZ2V0X2JyYW5jaCAtIHJlYWQgdGhlIGNoYWluIG9mIGluZGlyZWN0IGJsb2NrcyBsZWFkaW5nIHRvIGRhdGEKKyAqCUBpbm9kZTogaW5vZGUgaW4gcXVlc3Rpb24KKyAqCUBkZXB0aDogZGVwdGggb2YgdGhlIGNoYWluICgxIC0gZGlyZWN0IHBvaW50ZXIsIGV0Yy4pCisgKglAb2Zmc2V0czogb2Zmc2V0cyBvZiBwb2ludGVycyBpbiBpbm9kZS9pbmRpcmVjdCBibG9ja3MKKyAqCUBjaGFpbjogcGxhY2UgdG8gc3RvcmUgdGhlIHJlc3VsdAorICoJQGVycjogaGVyZSB3ZSBzdG9yZSB0aGUgZXJyb3IgdmFsdWUKKyAqCisgKglGdW5jdGlvbiBmaWxscyB0aGUgYXJyYXkgb2YgdHJpcGxlcyA8a2V5LCBwLCBiaD4gYW5kIHJldHVybnMgJU5VTEwKKyAqCWlmIGV2ZXJ5dGhpbmcgd2VudCBPSyBvciB0aGUgcG9pbnRlciB0byB0aGUgbGFzdCBmaWxsZWQgdHJpcGxlCisgKgkoaW5jb21wbGV0ZSBvbmUpIG90aGVyd2lzZS4gVXBvbiB0aGUgcmV0dXJuIGNoYWluW2ldLmtleSBjb250YWlucworICoJdGhlIG51bWJlciBvZiAoaSsxKS10aCBibG9jayBpbiB0aGUgY2hhaW4gKGFzIGl0IGlzIHN0b3JlZCBpbiBtZW1vcnksCisgKglpLmUuIGxpdHRsZS1lbmRpYW4gMzItYml0KSwgY2hhaW5baV0ucCBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGF0CisgKgludW1iZXIgKGl0IHBvaW50cyBpbnRvIHN0cnVjdCBpbm9kZSBmb3IgaT09MCBhbmQgaW50byB0aGUgYmgtPmJfZGF0YQorICoJZm9yIGk+MCkgYW5kIGNoYWluW2ldLmJoIHBvaW50cyB0byB0aGUgYnVmZmVyX2hlYWQgb2YgaS10aCBpbmRpcmVjdAorICoJYmxvY2sgZm9yIGk+MCBhbmQgTlVMTCBmb3IgaT09MC4gSW4gb3RoZXIgd29yZHMsIGl0IGhvbGRzIHRoZSBibG9jaworICoJbnVtYmVycyBvZiB0aGUgY2hhaW4sIGFkZHJlc3NlcyB0aGV5IHdlcmUgdGFrZW4gZnJvbSAoYW5kIHdoZXJlIHdlIGNhbgorICoJdmVyaWZ5IHRoYXQgY2hhaW4gZGlkIG5vdCBjaGFuZ2UpIGFuZCBidWZmZXJfaGVhZHMgaG9zdGluZyB0aGVzZQorICoJbnVtYmVycy4KKyAqCisgKglGdW5jdGlvbiBzdG9wcyB3aGVuIGl0IHN0dW1ibGVzIHVwb24gemVybyBwb2ludGVyIChhYnNlbnQgYmxvY2spCisgKgkJKHBvaW50ZXIgdG8gbGFzdCB0cmlwbGUgcmV0dXJuZWQsICpAZXJyID09IDApCisgKglvciB3aGVuIGl0IGdldHMgYW4gSU8gZXJyb3IgcmVhZGluZyBhbiBpbmRpcmVjdCBibG9jaworICoJCShkaXR0bywgKkBlcnIgPT0gLUVJTykKKyAqCW9yIHdoZW4gaXQgbm90aWNlcyB0aGF0IGNoYWluIGhhZCBiZWVuIGNoYW5nZWQgd2hpbGUgaXQgd2FzIHJlYWRpbmcKKyAqCQkoZGl0dG8sICpAZXJyID09IC1FQUdBSU4pCisgKglvciB3aGVuIGl0IHJlYWRzIGFsbCBAZGVwdGgtMSBpbmRpcmVjdCBibG9ja3Mgc3VjY2Vzc2Z1bGx5IGFuZCBmaW5kcworICoJdGhlIHdob2xlIGNoYWluLCBhbGwgd2F5IHRvIHRoZSBkYXRhIChyZXR1cm5zICVOVUxMLCAqZXJyID09IDApLgorICovCitzdGF0aWMgSW5kaXJlY3QgKmV4dDJfZ2V0X2JyYW5jaChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSBpbnQgZGVwdGgsCisJCQkJIGludCAqb2Zmc2V0cywKKwkJCQkgSW5kaXJlY3QgY2hhaW5bNF0sCisJCQkJIGludCAqZXJyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlJbmRpcmVjdCAqcCA9IGNoYWluOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkqZXJyID0gMDsKKwkvKiBpX2RhdGEgaXMgbm90IGdvaW5nIGF3YXksIG5vIGxvY2sgbmVlZGVkICovCisJYWRkX2NoYWluIChjaGFpbiwgTlVMTCwgRVhUMl9JKGlub2RlKS0+aV9kYXRhICsgKm9mZnNldHMpOworCWlmICghcC0+a2V5KQorCQlnb3RvIG5vX2Jsb2NrOworCXdoaWxlICgtLWRlcHRoKSB7CisJCWJoID0gc2JfYnJlYWQoc2IsIGxlMzJfdG9fY3B1KHAtPmtleSkpOworCQlpZiAoIWJoKQorCQkJZ290byBmYWlsdXJlOworCQlyZWFkX2xvY2soJkVYVDJfSShpbm9kZSktPmlfbWV0YV9sb2NrKTsKKwkJaWYgKCF2ZXJpZnlfY2hhaW4oY2hhaW4sIHApKQorCQkJZ290byBjaGFuZ2VkOworCQlhZGRfY2hhaW4oKytwLCBiaCwgKF9fbGUzMiopYmgtPmJfZGF0YSArICorK29mZnNldHMpOworCQlyZWFkX3VubG9jaygmRVhUMl9JKGlub2RlKS0+aV9tZXRhX2xvY2spOworCQlpZiAoIXAtPmtleSkKKwkJCWdvdG8gbm9fYmxvY2s7CisJfQorCXJldHVybiBOVUxMOworCitjaGFuZ2VkOgorCXJlYWRfdW5sb2NrKCZFWFQyX0koaW5vZGUpLT5pX21ldGFfbG9jayk7CisJYnJlbHNlKGJoKTsKKwkqZXJyID0gLUVBR0FJTjsKKwlnb3RvIG5vX2Jsb2NrOworZmFpbHVyZToKKwkqZXJyID0gLUVJTzsKK25vX2Jsb2NrOgorCXJldHVybiBwOworfQorCisvKioKKyAqCWV4dDJfZmluZF9uZWFyIC0gZmluZCBhIHBsYWNlIGZvciBhbGxvY2F0aW9uIHdpdGggc3VmZmljaWVudCBsb2NhbGl0eQorICoJQGlub2RlOiBvd25lcgorICoJQGluZDogZGVzY3JpcHRvciBvZiBpbmRpcmVjdCBibG9jay4KKyAqCisgKglUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHByZWZlcmVkIHBsYWNlIGZvciBibG9jayBhbGxvY2F0aW9uLgorICoJSXQgaXMgdXNlZCB3aGVuIGhldXJpc3RpYyBmb3Igc2VxdWVudGlhbCBhbGxvY2F0aW9uIGZhaWxzLgorICoJUnVsZXMgYXJlOgorICoJICArIGlmIHRoZXJlIGlzIGEgYmxvY2sgdG8gdGhlIGxlZnQgb2Ygb3VyIHBvc2l0aW9uIC0gYWxsb2NhdGUgbmVhciBpdC4KKyAqCSAgKyBpZiBwb2ludGVyIHdpbGwgbGl2ZSBpbiBpbmRpcmVjdCBibG9jayAtIGFsbG9jYXRlIG5lYXIgdGhhdCBibG9jay4KKyAqCSAgKyBpZiBwb2ludGVyIHdpbGwgbGl2ZSBpbiBpbm9kZSAtIGFsbG9jYXRlIGluIHRoZSBzYW1lIGN5bGluZGVyIGdyb3VwLgorICoKKyAqIEluIHRoZSBsYXR0ZXIgY2FzZSB3ZSBjb2xvdXIgdGhlIHN0YXJ0aW5nIGJsb2NrIGJ5IHRoZSBjYWxsZXJzIFBJRCB0bworICogcHJldmVudCBpdCBmcm9tIGNsYXNoaW5nIHdpdGggY29uY3VycmVudCBhbGxvY2F0aW9ucyBmb3IgYSBkaWZmZXJlbnQgaW5vZGUKKyAqIGluIHRoZSBzYW1lIGJsb2NrIGdyb3VwLiAgIFRoZSBQSUQgaXMgdXNlZCBoZXJlIHNvIHRoYXQgZnVuY3Rpb25hbGx5IHJlbGF0ZWQKKyAqIGZpbGVzIHdpbGwgYmUgY2xvc2UtYnkgb24tZGlzay4KKyAqCisgKglDYWxsZXIgbXVzdCBtYWtlIHN1cmUgdGhhdCBAaW5kIGlzIHZhbGlkIGFuZCB3aWxsIHN0YXkgdGhhdCB3YXkuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZXh0Ml9maW5kX25lYXIoc3RydWN0IGlub2RlICppbm9kZSwgSW5kaXJlY3QgKmluZCkKK3sKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvICplaSA9IEVYVDJfSShpbm9kZSk7CisJX19sZTMyICpzdGFydCA9IGluZC0+YmggPyAoX19sZTMyICopIGluZC0+YmgtPmJfZGF0YSA6IGVpLT5pX2RhdGE7CisJX19sZTMyICpwOworCXVuc2lnbmVkIGxvbmcgYmdfc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBjb2xvdXI7CisKKwkvKiBUcnkgdG8gZmluZCBwcmV2aW91cyBibG9jayAqLworCWZvciAocCA9IGluZC0+cCAtIDE7IHAgPj0gc3RhcnQ7IHAtLSkKKwkJaWYgKCpwKQorCQkJcmV0dXJuIGxlMzJfdG9fY3B1KCpwKTsKKworCS8qIE5vIHN1Y2ggdGhpbmcsIHNvIGxldCdzIHRyeSBsb2NhdGlvbiBvZiBpbmRpcmVjdCBibG9jayAqLworCWlmIChpbmQtPmJoKQorCQlyZXR1cm4gaW5kLT5iaC0+Yl9ibG9ja25yOworCisJLyoKKwkgKiBJdCBpcyBnb2luZyB0byBiZSByZWZlcmVkIGZyb20gaW5vZGUgaXRzZWxmPyBPSywganVzdCBwdXQgaXQgaW50bworCSAqIHRoZSBzYW1lIGN5bGluZGVyIGdyb3VwIHRoZW4uCisJICovCisJYmdfc3RhcnQgPSAoZWktPmlfYmxvY2tfZ3JvdXAgKiBFWFQyX0JMT0NLU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpKSArCisJCWxlMzJfdG9fY3B1KEVYVDJfU0IoaW5vZGUtPmlfc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOworCWNvbG91ciA9IChjdXJyZW50LT5waWQgJSAxNikgKgorCQkJKEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChpbm9kZS0+aV9zYikgLyAxNik7CisJcmV0dXJuIGJnX3N0YXJ0ICsgY29sb3VyOworfQorCisvKioKKyAqCWV4dDJfZmluZF9nb2FsIC0gZmluZCBhIHByZWZlcmVkIHBsYWNlIGZvciBhbGxvY2F0aW9uLgorICoJQGlub2RlOiBvd25lcgorICoJQGJsb2NrOiAgYmxvY2sgd2Ugd2FudAorICoJQGNoYWluOiAgY2hhaW4gb2YgaW5kaXJlY3QgYmxvY2tzCisgKglAcGFydGlhbDogcG9pbnRlciB0byB0aGUgbGFzdCB0cmlwbGUgd2l0aGluIGEgY2hhaW4KKyAqCUBnb2FsOglwbGFjZSB0byBzdG9yZSB0aGUgcmVzdWx0LgorICoKKyAqCU5vcm1hbGx5IHRoaXMgZnVuY3Rpb24gZmluZCB0aGUgcHJlZmVyZWQgcGxhY2UgZm9yIGJsb2NrIGFsbG9jYXRpb24sCisgKglzdG9yZXMgaXQgaW4gKkBnb2FsIGFuZCByZXR1cm5zIHplcm8uIElmIHRoZSBicmFuY2ggaGFkIGJlZW4gY2hhbmdlZAorICoJdW5kZXIgdXMgd2UgcmV0dXJuIC1FQUdBSU4uCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgZXh0Ml9maW5kX2dvYWwoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgbG9uZyBibG9jaywKKwkJCQkgSW5kaXJlY3QgY2hhaW5bNF0sCisJCQkJIEluZGlyZWN0ICpwYXJ0aWFsLAorCQkJCSB1bnNpZ25lZCBsb25nICpnb2FsKQoreworCXN0cnVjdCBleHQyX2lub2RlX2luZm8gKmVpID0gRVhUMl9JKGlub2RlKTsKKwl3cml0ZV9sb2NrKCZlaS0+aV9tZXRhX2xvY2spOworCWlmICgoYmxvY2sgPT0gZWktPmlfbmV4dF9hbGxvY19ibG9jayArIDEpICYmIGVpLT5pX25leHRfYWxsb2NfZ29hbCkgeworCQllaS0+aV9uZXh0X2FsbG9jX2Jsb2NrKys7CisJCWVpLT5pX25leHRfYWxsb2NfZ29hbCsrOworCX0gCisJaWYgKHZlcmlmeV9jaGFpbihjaGFpbiwgcGFydGlhbCkpIHsKKwkJLyoKKwkJICogdHJ5IHRoZSBoZXVyaXN0aWMgZm9yIHNlcXVlbnRpYWwgYWxsb2NhdGlvbiwKKwkJICogZmFpbGluZyB0aGF0IGF0IGxlYXN0IHRyeSB0byBnZXQgZGVjZW50IGxvY2FsaXR5LgorCQkgKi8KKwkJaWYgKGJsb2NrID09IGVpLT5pX25leHRfYWxsb2NfYmxvY2spCisJCQkqZ29hbCA9IGVpLT5pX25leHRfYWxsb2NfZ29hbDsKKwkJaWYgKCEqZ29hbCkKKwkJCSpnb2FsID0gZXh0Ml9maW5kX25lYXIoaW5vZGUsIHBhcnRpYWwpOworCQl3cml0ZV91bmxvY2soJmVpLT5pX21ldGFfbG9jayk7CisJCXJldHVybiAwOworCX0KKwl3cml0ZV91bmxvY2soJmVpLT5pX21ldGFfbG9jayk7CisJcmV0dXJuIC1FQUdBSU47Cit9CisKKy8qKgorICoJZXh0Ml9hbGxvY19icmFuY2ggLSBhbGxvY2F0ZSBhbmQgc2V0IHVwIGEgY2hhaW4gb2YgYmxvY2tzLgorICoJQGlub2RlOiBvd25lcgorICoJQG51bTogZGVwdGggb2YgdGhlIGNoYWluIChudW1iZXIgb2YgYmxvY2tzIHRvIGFsbG9jYXRlKQorICoJQG9mZnNldHM6IG9mZnNldHMgKGluIHRoZSBibG9ja3MpIHRvIHN0b3JlIHRoZSBwb2ludGVycyB0byBuZXh0LgorICoJQGJyYW5jaDogcGxhY2UgdG8gc3RvcmUgdGhlIGNoYWluIGluLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIEBudW0gYmxvY2tzLCB6ZXJvZXMgb3V0IGFsbCBidXQgdGhlIGxhc3Qgb25lLAorICoJbGlua3MgdGhlbSBpbnRvIGNoYWluIGFuZCAoaWYgd2UgYXJlIHN5bmNocm9ub3VzKSB3cml0ZXMgdGhlbSB0byBkaXNrLgorICoJSW4gb3RoZXIgd29yZHMsIGl0IHByZXBhcmVzIGEgYnJhbmNoIHRoYXQgY2FuIGJlIHNwbGljZWQgb250byB0aGUKKyAqCWlub2RlLiBJdCBzdG9yZXMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoYXQgY2hhaW4gaW4gdGhlIGJyYW5jaFtdLCBpbgorICoJdGhlIHNhbWUgZm9ybWF0IGFzIGV4dDJfZ2V0X2JyYW5jaCgpIHdvdWxkIGRvLiBXZSBhcmUgY2FsbGluZyBpdCBhZnRlcgorICoJd2UgaGFkIHJlYWQgdGhlIGV4aXN0aW5nIHBhcnQgb2YgY2hhaW4gYW5kIHBhcnRpYWwgcG9pbnRzIHRvIHRoZSBsYXN0CisgKgl0cmlwbGUgb2YgdGhhdCAob25lIHdpdGggemVybyAtPmtleSkuIFVwb24gdGhlIGV4aXQgd2UgaGF2ZSB0aGUgc2FtZQorICoJcGljdHVyZSBhcyBhZnRlciB0aGUgc3VjY2Vzc2Z1bCBleHQyX2dldF9ibG9jaygpLCBleGNwZXQgdGhhdCBpbiBvbmUKKyAqCXBsYWNlIGNoYWluIGlzIGRpc2Nvbm5lY3RlZCAtICpicmFuY2gtPnAgaXMgc3RpbGwgemVybyAod2UgZGlkIG5vdAorICoJc2V0IHRoZSBsYXN0IGxpbmspLCBidXQgYnJhbmNoLT5rZXkgY29udGFpbnMgdGhlIG51bWJlciB0aGF0IHNob3VsZAorICoJYmUgcGxhY2VkIGludG8gKmJyYW5jaC0+cCB0byBmaWxsIHRoYXQgZ2FwLgorICoKKyAqCUlmIGFsbG9jYXRpb24gZmFpbHMgd2UgZnJlZSBhbGwgYmxvY2tzIHdlJ3ZlIGFsbG9jYXRlZCAoYW5kIGZvcmdldAorICoJdGhlaXIgYnVmZmVyX2hlYWRzKSBhbmQgcmV0dXJuIHRoZSBlcnJvciB2YWx1ZSB0aGUgZnJvbSBmYWlsZWQKKyAqCWV4dDJfYWxsb2NfYmxvY2soKSAobm9ybWFsbHkgLUVOT1NQQykuIE90aGVyd2lzZSB3ZSBzZXQgdGhlIGNoYWluCisgKglhcyBkZXNjcmliZWQgYWJvdmUgYW5kIHJldHVybiAwLgorICovCisKK3N0YXRpYyBpbnQgZXh0Ml9hbGxvY19icmFuY2goc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgaW50IG51bSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBnb2FsLAorCQkJICAgICBpbnQgKm9mZnNldHMsCisJCQkgICAgIEluZGlyZWN0ICpicmFuY2gpCit7CisJaW50IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlpbnQgbiA9IDA7CisJaW50IGVycjsKKwlpbnQgaTsKKwlpbnQgcGFyZW50ID0gZXh0Ml9hbGxvY19ibG9jayhpbm9kZSwgZ29hbCwgJmVycik7CisKKwlicmFuY2hbMF0ua2V5ID0gY3B1X3RvX2xlMzIocGFyZW50KTsKKwlpZiAocGFyZW50KSBmb3IgKG4gPSAxOyBuIDwgbnVtOyBuKyspIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwkJLyogQWxsb2NhdGUgdGhlIG5leHQgYmxvY2sgKi8KKwkJaW50IG5yID0gZXh0Ml9hbGxvY19ibG9jayhpbm9kZSwgcGFyZW50LCAmZXJyKTsKKwkJaWYgKCFucikKKwkJCWJyZWFrOworCQlicmFuY2hbbl0ua2V5ID0gY3B1X3RvX2xlMzIobnIpOworCQkvKgorCQkgKiBHZXQgYnVmZmVyX2hlYWQgZm9yIHBhcmVudCBibG9jaywgemVybyBpdCBvdXQgYW5kIHNldCAKKwkJICogdGhlIHBvaW50ZXIgdG8gbmV3IG9uZSwgdGhlbiBzZW5kIHBhcmVudCB0byBkaXNrLgorCQkgKi8KKwkJYmggPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsIHBhcmVudCk7CisJCWxvY2tfYnVmZmVyKGJoKTsKKwkJbWVtc2V0KGJoLT5iX2RhdGEsIDAsIGJsb2Nrc2l6ZSk7CisJCWJyYW5jaFtuXS5iaCA9IGJoOworCQlicmFuY2hbbl0ucCA9IChfX2xlMzIgKikgYmgtPmJfZGF0YSArIG9mZnNldHNbbl07CisJCSpicmFuY2hbbl0ucCA9IGJyYW5jaFtuXS5rZXk7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJbWFya19idWZmZXJfZGlydHlfaW5vZGUoYmgsIGlub2RlKTsKKwkJLyogV2UgdXNlZCB0byBzeW5jIGJoIGhlcmUgaWYgSVNfU1lOQyhpbm9kZSkuCisJCSAqIEJ1dCB3ZSBub3cgcmVseSB1cG9uIGdlbmVyaWNfb3N5bmNfaW5vZGUoKQorCQkgKiBhbmQgYl9pbm9kZV9idWZmZXJzLiAgQnV0IG5vdCBmb3IgZGlyZWN0b3JpZXMuCisJCSAqLworCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiBJU19ESVJTWU5DKGlub2RlKSkKKwkJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwkJcGFyZW50ID0gbnI7CisJfQorCWlmIChuID09IG51bSkKKwkJcmV0dXJuIDA7CisKKwkvKiBBbGxvY2F0aW9uIGZhaWxlZCwgZnJlZSB3aGF0IHdlIGFscmVhZHkgYWxsb2NhdGVkICovCisJZm9yIChpID0gMTsgaSA8IG47IGkrKykKKwkJYmZvcmdldChicmFuY2hbaV0uYmgpOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCWV4dDJfZnJlZV9ibG9ja3MoaW5vZGUsIGxlMzJfdG9fY3B1KGJyYW5jaFtpXS5rZXkpLCAxKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqCWV4dDJfc3BsaWNlX2JyYW5jaCAtIHNwbGljZSB0aGUgYWxsb2NhdGVkIGJyYW5jaCBvbnRvIGlub2RlLgorICoJQGlub2RlOiBvd25lcgorICoJQGJsb2NrOiAobG9naWNhbCkgbnVtYmVyIG9mIGJsb2NrIHdlIGFyZSBhZGRpbmcKKyAqCUBjaGFpbjogY2hhaW4gb2YgaW5kaXJlY3QgYmxvY2tzICh3aXRoIGEgbWlzc2luZyBsaW5rIC0gc2VlCisgKgkJZXh0Ml9hbGxvY19icmFuY2gpCisgKglAd2hlcmU6IGxvY2F0aW9uIG9mIG1pc3NpbmcgbGluaworICoJQG51bTogICBudW1iZXIgb2YgYmxvY2tzIHdlIGFyZSBhZGRpbmcKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHZlcmlmaWVzIHRoYXQgY2hhaW4gKHVwIHRvIHRoZSBtaXNzaW5nIGxpbmspIGhhZCBub3QKKyAqCWNoYW5nZWQsIGZpbGxzIHRoZSBtaXNzaW5nIGxpbmsgYW5kIGRvZXMgYWxsIGhvdXNla2VlcGluZyBuZWVkZWQgaW4KKyAqCWlub2RlICgtPmlfYmxvY2tzLCBldGMuKS4gSW4gY2FzZSBvZiBzdWNjZXNzIHdlIGVuZCB1cCB3aXRoIHRoZSBmdWxsCisgKgljaGFpbiB0byBuZXcgYmxvY2sgYW5kIHJldHVybiAwLiBPdGhlcndpc2UgKD09IGNoYWluIGhhZCBiZWVuIGNoYW5nZWQpCisgKgl3ZSBmcmVlIHRoZSBuZXcgYmxvY2tzIChmb3JnZXR0aW5nIHRoZWlyIGJ1ZmZlcl9oZWFkcywgaW5kZWVkKSBhbmQKKyAqCXJldHVybiAtRUFHQUlOLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dDJfc3BsaWNlX2JyYW5jaChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgbG9uZyBibG9jaywKKwkJCQkgICAgIEluZGlyZWN0IGNoYWluWzRdLAorCQkJCSAgICAgSW5kaXJlY3QgKndoZXJlLAorCQkJCSAgICAgaW50IG51bSkKK3sKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvICplaSA9IEVYVDJfSShpbm9kZSk7CisJaW50IGk7CisKKwkvKiBWZXJpZnkgdGhhdCBwbGFjZSB3ZSBhcmUgc3BsaWNpbmcgdG8gaXMgc3RpbGwgdGhlcmUgYW5kIHZhY2FudCAqLworCisJd3JpdGVfbG9jaygmZWktPmlfbWV0YV9sb2NrKTsKKwlpZiAoIXZlcmlmeV9jaGFpbihjaGFpbiwgd2hlcmUtMSkgfHwgKndoZXJlLT5wKQorCQlnb3RvIGNoYW5nZWQ7CisKKwkvKiBUaGF0J3MgaXQgKi8KKworCSp3aGVyZS0+cCA9IHdoZXJlLT5rZXk7CisJZWktPmlfbmV4dF9hbGxvY19ibG9jayA9IGJsb2NrOworCWVpLT5pX25leHRfYWxsb2NfZ29hbCA9IGxlMzJfdG9fY3B1KHdoZXJlW251bS0xXS5rZXkpOworCisJd3JpdGVfdW5sb2NrKCZlaS0+aV9tZXRhX2xvY2spOworCisJLyogV2UgYXJlIGRvbmUgd2l0aCBhdG9taWMgc3R1ZmYsIG5vdyBkbyB0aGUgcmVzdCBvZiBob3VzZWtlZXBpbmcgKi8KKworCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKworCS8qIGhhZCB3ZSBzcGxpY2VkIGl0IG9udG8gaW5kaXJlY3QgYmxvY2s/ICovCisJaWYgKHdoZXJlLT5iaCkKKwkJbWFya19idWZmZXJfZGlydHlfaW5vZGUod2hlcmUtPmJoLCBpbm9kZSk7CisKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlyZXR1cm4gMDsKKworY2hhbmdlZDoKKwl3cml0ZV91bmxvY2soJmVpLT5pX21ldGFfbG9jayk7CisJZm9yIChpID0gMTsgaSA8IG51bTsgaSsrKQorCQliZm9yZ2V0KHdoZXJlW2ldLmJoKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJCWV4dDJfZnJlZV9ibG9ja3MoaW5vZGUsIGxlMzJfdG9fY3B1KHdoZXJlW2ldLmtleSksIDEpOworCXJldHVybiAtRUFHQUlOOworfQorCisvKgorICogQWxsb2NhdGlvbiBzdHJhdGVneSBpcyBzaW1wbGU6IGlmIHdlIGhhdmUgdG8gYWxsb2NhdGUgc29tZXRoaW5nLCB3ZSB3aWxsCisgKiBoYXZlIHRvIGdvIHRoZSB3aG9sZSB3YXkgdG8gbGVhZi4gU28gbGV0J3MgZG8gaXQgYmVmb3JlIGF0dGFjaGluZyBhbnl0aGluZworICogdG8gdHJlZSwgc2V0IGxpbmthZ2UgYmV0d2VlbiB0aGUgbmV3Ym9ybiBibG9ja3MsIHdyaXRlIHRoZW0gaWYgc3luYyBpcworICogcmVxdWlyZWQsIHJlY2hlY2sgdGhlIHBhdGgsIGZyZWUgYW5kIHJlcGVhdCBpZiBjaGVjayBmYWlscywgb3RoZXJ3aXNlCisgKiBzZXQgdGhlIGxhc3QgbWlzc2luZyBsaW5rICh0aGF0IHdpbGwgcHJvdGVjdCB1cyBmcm9tIGFueSB0cnVuY2F0ZS1nZW5lcmF0ZWQKKyAqIHJlbW92YWxzIC0gYWxsIGJsb2NrcyBvbiB0aGUgcGF0aCBhcmUgaW1tdW5lIG5vdykgYW5kIHBvc3NpYmx5IGZvcmNlIHRoZQorICogd3JpdGUgb24gdGhlIHBhcmVudCBibG9jay4KKyAqIFRoYXQgaGFzIGEgbmljZSBhZGRpdGlvbmFsIHByb3BlcnR5OiBubyBzcGVjaWFsIHJlY292ZXJ5IGZyb20gdGhlIGZhaWxlZAorICogYWxsb2NhdGlvbnMgaXMgbmVlZGVkIC0gd2Ugc2ltcGx5IHJlbGVhc2UgYmxvY2tzIGFuZCBkbyBub3QgdG91Y2ggYW55dGhpbmcKKyAqIHJlYWNoYWJsZSBmcm9tIGlub2RlLgorICovCisKK2ludCBleHQyX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQoreworCWludCBlcnIgPSAtRUlPOworCWludCBvZmZzZXRzWzRdOworCUluZGlyZWN0IGNoYWluWzRdOworCUluZGlyZWN0ICpwYXJ0aWFsOworCXVuc2lnbmVkIGxvbmcgZ29hbDsKKwlpbnQgbGVmdDsKKwlpbnQgYm91bmRhcnkgPSAwOworCWludCBkZXB0aCA9IGV4dDJfYmxvY2tfdG9fcGF0aChpbm9kZSwgaWJsb2NrLCBvZmZzZXRzLCAmYm91bmRhcnkpOworCisJaWYgKGRlcHRoID09IDApCisJCWdvdG8gb3V0OworCityZXJlYWQ6CisJcGFydGlhbCA9IGV4dDJfZ2V0X2JyYW5jaChpbm9kZSwgZGVwdGgsIG9mZnNldHMsIGNoYWluLCAmZXJyKTsKKworCS8qIFNpbXBsZXN0IGNhc2UgLSBibG9jayBmb3VuZCwgbm8gYWxsb2NhdGlvbiBuZWVkZWQgKi8KKwlpZiAoIXBhcnRpYWwpIHsKK2dvdF9pdDoKKwkJbWFwX2JoKGJoX3Jlc3VsdCwgaW5vZGUtPmlfc2IsIGxlMzJfdG9fY3B1KGNoYWluW2RlcHRoLTFdLmtleSkpOworCQlpZiAoYm91bmRhcnkpCisJCQlzZXRfYnVmZmVyX2JvdW5kYXJ5KGJoX3Jlc3VsdCk7CisJCS8qIENsZWFuIHVwIGFuZCBleGl0ICovCisJCXBhcnRpYWwgPSBjaGFpbitkZXB0aC0xOyAvKiB0aGUgd2hvbGUgY2hhaW4gKi8KKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIE5leHQgc2ltcGxlIGNhc2UgLSBwbGFpbiBsb29rdXAgb3IgZmFpbGVkIHJlYWQgb2YgaW5kaXJlY3QgYmxvY2sgKi8KKwlpZiAoIWNyZWF0ZSB8fCBlcnIgPT0gLUVJTykgeworY2xlYW51cDoKKwkJd2hpbGUgKHBhcnRpYWwgPiBjaGFpbikgeworCQkJYnJlbHNlKHBhcnRpYWwtPmJoKTsKKwkJCXBhcnRpYWwtLTsKKwkJfQorb3V0OgorCQlyZXR1cm4gZXJyOworCX0KKworCS8qCisJICogSW5kaXJlY3QgYmxvY2sgbWlnaHQgYmUgcmVtb3ZlZCBieSB0cnVuY2F0ZSB3aGlsZSB3ZSB3ZXJlCisJICogcmVhZGluZyBpdC4gSGFuZGxpbmcgb2YgdGhhdCBjYXNlIChmb3JnZXQgd2hhdCB3ZSd2ZSBnb3QgYW5kCisJICogcmVyZWFkKSBpcyB0YWtlbiBvdXQgb2YgdGhlIG1haW4gcGF0aC4KKwkgKi8KKwlpZiAoZXJyID09IC1FQUdBSU4pCisJCWdvdG8gY2hhbmdlZDsKKworCWdvYWwgPSAwOworCWlmIChleHQyX2ZpbmRfZ29hbChpbm9kZSwgaWJsb2NrLCBjaGFpbiwgcGFydGlhbCwgJmdvYWwpIDwgMCkKKwkJZ290byBjaGFuZ2VkOworCisJbGVmdCA9IChjaGFpbiArIGRlcHRoKSAtIHBhcnRpYWw7CisJZXJyID0gZXh0Ml9hbGxvY19icmFuY2goaW5vZGUsIGxlZnQsIGdvYWwsCisJCQkJCW9mZnNldHMrKHBhcnRpYWwtY2hhaW4pLCBwYXJ0aWFsKTsKKwlpZiAoZXJyKQorCQlnb3RvIGNsZWFudXA7CisKKwlpZiAoZXh0Ml9zcGxpY2VfYnJhbmNoKGlub2RlLCBpYmxvY2ssIGNoYWluLCBwYXJ0aWFsLCBsZWZ0KSA8IDApCisJCWdvdG8gY2hhbmdlZDsKKworCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJZ290byBnb3RfaXQ7CisKK2NoYW5nZWQ6CisJd2hpbGUgKHBhcnRpYWwgPiBjaGFpbikgeworCQlicmVsc2UocGFydGlhbC0+YmgpOworCQlwYXJ0aWFsLS07CisJfQorCWdvdG8gcmVyZWFkOworfQorCitzdGF0aWMgaW50IGV4dDJfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlyZXR1cm4gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIGV4dDJfZ2V0X2Jsb2NrLCB3YmMpOworfQorCitzdGF0aWMgaW50IGV4dDJfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBtcGFnZV9yZWFkcGFnZShwYWdlLCBleHQyX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfcmVhZHBhZ2VzKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJc3RydWN0IGxpc3RfaGVhZCAqcGFnZXMsIHVuc2lnbmVkIG5yX3BhZ2VzKQoreworCXJldHVybiBtcGFnZV9yZWFkcGFnZXMobWFwcGluZywgcGFnZXMsIG5yX3BhZ2VzLCBleHQyX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQl1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlyZXR1cm4gYmxvY2tfcHJlcGFyZV93cml0ZShwYWdlLGZyb20sdG8sZXh0Ml9nZXRfYmxvY2spOworfQorCitzdGF0aWMgaW50CitleHQyX25vYmhfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQl1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlyZXR1cm4gbm9iaF9wcmVwYXJlX3dyaXRlKHBhZ2UsZnJvbSx0byxleHQyX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgZXh0Ml9ub2JoX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXJldHVybiBub2JoX3dyaXRlcGFnZShwYWdlLCBleHQyX2dldF9ibG9jaywgd2JjKTsKK30KKworc3RhdGljIHNlY3Rvcl90IGV4dDJfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2spCit7CisJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLGJsb2NrLGV4dDJfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIGludAorZXh0Ml9nZXRfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywgdW5zaWduZWQgbG9uZyBtYXhfYmxvY2tzLAorCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJaW50IHJldDsKKworCXJldCA9IGV4dDJfZ2V0X2Jsb2NrKGlub2RlLCBpYmxvY2ssIGJoX3Jlc3VsdCwgY3JlYXRlKTsKKwlpZiAocmV0ID09IDApCisJCWJoX3Jlc3VsdC0+Yl9zaXplID0gKDEgPDwgaW5vZGUtPmlfYmxrYml0cyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK2V4dDJfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKKwkJCWxvZmZfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKworCXJldHVybiBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpbm9kZS0+aV9zYi0+c19iZGV2LCBpb3YsCisJCQkJb2Zmc2V0LCBucl9zZWdzLCBleHQyX2dldF9ibG9ja3MsIE5VTEwpOworfQorCitzdGF0aWMgaW50CitleHQyX3dyaXRlcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXJldHVybiBtcGFnZV93cml0ZXBhZ2VzKG1hcHBpbmcsIHdiYywgZXh0Ml9nZXRfYmxvY2spOworfQorCitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGV4dDJfYW9wcyA9IHsKKwkucmVhZHBhZ2UJCT0gZXh0Ml9yZWFkcGFnZSwKKwkucmVhZHBhZ2VzCQk9IGV4dDJfcmVhZHBhZ2VzLAorCS53cml0ZXBhZ2UJCT0gZXh0Ml93cml0ZXBhZ2UsCisJLnN5bmNfcGFnZQkJPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUJCT0gZXh0Ml9wcmVwYXJlX3dyaXRlLAorCS5jb21taXRfd3JpdGUJCT0gZ2VuZXJpY19jb21taXRfd3JpdGUsCisJLmJtYXAJCQk9IGV4dDJfYm1hcCwKKwkuZGlyZWN0X0lPCQk9IGV4dDJfZGlyZWN0X0lPLAorCS53cml0ZXBhZ2VzCQk9IGV4dDJfd3JpdGVwYWdlcywKK307CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZXh0Ml9ub2JoX2FvcHMgPSB7CisJLnJlYWRwYWdlCQk9IGV4dDJfcmVhZHBhZ2UsCisJLnJlYWRwYWdlcwkJPSBleHQyX3JlYWRwYWdlcywKKwkud3JpdGVwYWdlCQk9IGV4dDJfbm9iaF93cml0ZXBhZ2UsCisJLnN5bmNfcGFnZQkJPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUJCT0gZXh0Ml9ub2JoX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZQkJPSBub2JoX2NvbW1pdF93cml0ZSwKKwkuYm1hcAkJCT0gZXh0Ml9ibWFwLAorCS5kaXJlY3RfSU8JCT0gZXh0Ml9kaXJlY3RfSU8sCisJLndyaXRlcGFnZXMJCT0gZXh0Ml93cml0ZXBhZ2VzLAorfTsKKworLyoKKyAqIFByb2JhYmx5IGl0IHNob3VsZCBiZSBhIGxpYnJhcnkgZnVuY3Rpb24uLi4gc2VhcmNoIGZvciBmaXJzdCBub24temVybyB3b3JkCisgKiBvciBtZW1jbXAgd2l0aCB6ZXJvX3BhZ2UsIHdoYXRldmVyIGlzIGJldHRlciBmb3IgcGFydGljdWxhciBhcmNoaXRlY3R1cmUuCisgKiBMaW51cz8KKyAqLworc3RhdGljIGlubGluZSBpbnQgYWxsX3plcm9lcyhfX2xlMzIgKnAsIF9fbGUzMiAqcSkKK3sKKwl3aGlsZSAocCA8IHEpCisJCWlmICgqcCsrKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICoJZXh0Ml9maW5kX3NoYXJlZCAtIGZpbmQgdGhlIGluZGlyZWN0IGJsb2NrcyBmb3IgcGFydGlhbCB0cnVuY2F0aW9uLgorICoJQGlub2RlOgkgIGlub2RlIGluIHF1ZXN0aW9uCisgKglAZGVwdGg6CSAgZGVwdGggb2YgdGhlIGFmZmVjdGVkIGJyYW5jaAorICoJQG9mZnNldHM6IG9mZnNldHMgb2YgcG9pbnRlcnMgaW4gdGhhdCBicmFuY2ggKHNlZSBleHQyX2Jsb2NrX3RvX3BhdGgpCisgKglAY2hhaW46CSAgcGxhY2UgdG8gc3RvcmUgdGhlIHBvaW50ZXJzIHRvIHBhcnRpYWwgaW5kaXJlY3QgYmxvY2tzCisgKglAdG9wOgkgIHBsYWNlIHRvIHRoZSAoZGV0YWNoZWQpIHRvcCBvZiBicmFuY2gKKyAqCisgKglUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgZXh0Ml90cnVuY2F0ZSgpLgorICoKKyAqCVdoZW4gd2UgZG8gdHJ1bmNhdGUoKSB3ZSBtYXkgaGF2ZSB0byBjbGVhbiB0aGUgZW5kcyBvZiBzZXZlcmFsIGluZGlyZWN0CisgKglibG9ja3MgYnV0IGxlYXZlIHRoZSBibG9ja3MgdGhlbXNlbHZlcyBhbGl2ZS4gQmxvY2sgaXMgcGFydGlhbGx5CisgKgl0cnVuY2F0ZWQgaWYgc29tZSBkYXRhIGJlbG93IHRoZSBuZXcgaV9zaXplIGlzIHJlZmVyZWQgZnJvbSBpdCAoYW5kCisgKglpdCBpcyBvbiB0aGUgcGF0aCB0byB0aGUgZmlyc3QgY29tcGxldGVseSB0cnVuY2F0ZWQgZGF0YSBibG9jaywgaW5kZWVkKS4KKyAqCVdlIGhhdmUgdG8gZnJlZSB0aGUgdG9wIG9mIHRoYXQgcGF0aCBhbG9uZyB3aXRoIGV2ZXJ5dGhpbmcgdG8gdGhlIHJpZ2h0CisgKglvZiB0aGUgcGF0aC4gU2luY2Ugbm8gYWxsb2NhdGlvbiBwYXN0IHRoZSB0cnVuY2F0aW9uIHBvaW50IGlzIHBvc3NpYmxlCisgKgl1bnRpbCBleHQyX3RydW5jYXRlKCkgZmluaXNoZXMsIHdlIG1heSBzYWZlbHkgZG8gdGhlIGxhdHRlciwgYnV0IHRvcAorICoJb2YgYnJhbmNoIG1heSByZXF1aXJlIHNwZWNpYWwgYXR0ZW50aW9uIC0gcGFnZW91dCBiZWxvdyB0aGUgdHJ1bmNhdGlvbgorICoJcG9pbnQgbWlnaHQgdHJ5IHRvIHBvcHVsYXRlIGl0LgorICoKKyAqCVdlIGF0b21pY2FsbHkgZGV0YWNoIHRoZSB0b3Agb2YgYnJhbmNoIGZyb20gdGhlIHRyZWUsIHN0b3JlIHRoZSBibG9jaworICoJbnVtYmVyIG9mIGl0cyByb290IGluICpAdG9wLCBwb2ludGVycyB0byBidWZmZXJfaGVhZHMgb2YgcGFydGlhbGx5CisgKgl0cnVuY2F0ZWQgYmxvY2tzIC0gaW4gQGNoYWluW10uYmggYW5kIHBvaW50ZXJzIHRvIHRoZWlyIGxhc3QgZWxlbWVudHMKKyAqCXRoYXQgc2hvdWxkIG5vdCBiZSByZW1vdmVkIC0gaW4gQGNoYWluW10ucC4gUmV0dXJuIHZhbHVlIGlzIHRoZSBwb2ludGVyCisgKgl0byBsYXN0IGZpbGxlZCBlbGVtZW50IG9mIEBjaGFpbi4KKyAqCisgKglUaGUgd29yayBsZWZ0IHRvIGNhbGxlciB0byBkbyB0aGUgYWN0dWFsIGZyZWVpbmcgb2Ygc3VidHJlZXM6CisgKgkJYSkgZnJlZSB0aGUgc3VidHJlZSBzdGFydGluZyBmcm9tICpAdG9wCisgKgkJYikgZnJlZSB0aGUgc3VidHJlZXMgd2hvc2Ugcm9vdHMgYXJlIHN0b3JlZCBpbgorICoJCQkoQGNoYWluW2ldLnArMSAuLiBlbmQgb2YgQGNoYWluW2ldLmJoLT5iX2RhdGEpCisgKgkJYykgZnJlZSB0aGUgc3VidHJlZXMgZ3Jvd2luZyBmcm9tIHRoZSBpbm9kZSBwYXN0IHRoZSBAY2hhaW5bMF0ucAorICoJCQkobm8gcGFydGlhbGx5IHRydW5jYXRlZCBzdHVmZiB0aGVyZSkuCisgKi8KKworc3RhdGljIEluZGlyZWN0ICpleHQyX2ZpbmRfc2hhcmVkKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJaW50IGRlcHRoLAorCQkJCWludCBvZmZzZXRzWzRdLAorCQkJCUluZGlyZWN0IGNoYWluWzRdLAorCQkJCV9fbGUzMiAqdG9wKQoreworCUluZGlyZWN0ICpwYXJ0aWFsLCAqcDsKKwlpbnQgaywgZXJyOworCisJKnRvcCA9IDA7CisJZm9yIChrID0gZGVwdGg7IGsgPiAxICYmICFvZmZzZXRzW2stMV07IGstLSkKKwkJOworCXBhcnRpYWwgPSBleHQyX2dldF9icmFuY2goaW5vZGUsIGssIG9mZnNldHMsIGNoYWluLCAmZXJyKTsKKwlpZiAoIXBhcnRpYWwpCisJCXBhcnRpYWwgPSBjaGFpbiArIGstMTsKKwkvKgorCSAqIElmIHRoZSBicmFuY2ggYWNxdWlyZWQgY29udGludWF0aW9uIHNpbmNlIHdlJ3ZlIGxvb2tlZCBhdCBpdCAtCisJICogZmluZSwgaXQgc2hvdWxkIGFsbCBzdXJ2aXZlIGFuZCAobmV3KSB0b3AgZG9lc24ndCBiZWxvbmcgdG8gdXMuCisJICovCisJd3JpdGVfbG9jaygmRVhUMl9JKGlub2RlKS0+aV9tZXRhX2xvY2spOworCWlmICghcGFydGlhbC0+a2V5ICYmICpwYXJ0aWFsLT5wKSB7CisJCXdyaXRlX3VubG9jaygmRVhUMl9JKGlub2RlKS0+aV9tZXRhX2xvY2spOworCQlnb3RvIG5vX3RvcDsKKwl9CisJZm9yIChwPXBhcnRpYWw7IHA+Y2hhaW4gJiYgYWxsX3plcm9lcygoX19sZTMyKilwLT5iaC0+Yl9kYXRhLHAtPnApOyBwLS0pCisJCTsKKwkvKgorCSAqIE9LLCB3ZSd2ZSBmb3VuZCB0aGUgbGFzdCBibG9jayB0aGF0IG11c3Qgc3Vydml2ZS4gVGhlIHJlc3Qgb2Ygb3VyCisJICogYnJhbmNoIHNob3VsZCBiZSBkZXRhY2hlZCBiZWZvcmUgdW5sb2NraW5nLiBIb3dldmVyLCBpZiB0aGF0IHJlc3QKKwkgKiBvZiBicmFuY2ggaXMgYWxsIG91cnMgYW5kIGRvZXMgbm90IGdyb3cgaW1tZWRpYXRlbHkgZnJvbSB0aGUgaW5vZGUKKwkgKiBpdCdzIGVhc2llciB0byBjaGVhdCBhbmQganVzdCBkZWNyZW1lbnQgcGFydGlhbC0+cC4KKwkgKi8KKwlpZiAocCA9PSBjaGFpbiArIGsgLSAxICYmIHAgPiBjaGFpbikgeworCQlwLT5wLS07CisJfSBlbHNlIHsKKwkJKnRvcCA9ICpwLT5wOworCQkqcC0+cCA9IDA7CisJfQorCXdyaXRlX3VubG9jaygmRVhUMl9JKGlub2RlKS0+aV9tZXRhX2xvY2spOworCisJd2hpbGUocGFydGlhbCA+IHApCisJeworCQlicmVsc2UocGFydGlhbC0+YmgpOworCQlwYXJ0aWFsLS07CisJfQorbm9fdG9wOgorCXJldHVybiBwYXJ0aWFsOworfQorCisvKioKKyAqCWV4dDJfZnJlZV9kYXRhIC0gZnJlZSBhIGxpc3Qgb2YgZGF0YSBibG9ja3MKKyAqCUBpbm9kZToJaW5vZGUgd2UgYXJlIGRlYWxpbmcgd2l0aAorICoJQHA6CWFycmF5IG9mIGJsb2NrIG51bWJlcnMKKyAqCUBxOglwb2ludHMgaW1tZWRpYXRlbHkgcGFzdCB0aGUgZW5kIG9mIGFycmF5CisgKgorICoJV2UgYXJlIGZyZWVpbmcgYWxsIGJsb2NrcyByZWZlcmVkIGZyb20gdGhhdCBhcnJheSAobnVtYmVycyBhcmUKKyAqCXN0b3JlZCBhcyBsaXR0bGUtZW5kaWFuIDMyLWJpdCkgYW5kIHVwZGF0aW5nIEBpbm9kZS0+aV9ibG9ja3MKKyAqCWFwcHJvcHJpYXRlbHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQyX2ZyZWVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX2xlMzIgKnAsIF9fbGUzMiAqcSkKK3sKKwl1bnNpZ25lZCBsb25nIGJsb2NrX3RvX2ZyZWUgPSAwLCBjb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZyBucjsKKworCWZvciAoIDsgcCA8IHEgOyBwKyspIHsKKwkJbnIgPSBsZTMyX3RvX2NwdSgqcCk7CisJCWlmIChucikgeworCQkJKnAgPSAwOworCQkJLyogYWNjdW11bGF0ZSBibG9ja3MgdG8gZnJlZSBpZiB0aGV5J3JlIGNvbnRpZ3VvdXMgKi8KKwkJCWlmIChjb3VudCA9PSAwKQorCQkJCWdvdG8gZnJlZV90aGlzOworCQkJZWxzZSBpZiAoYmxvY2tfdG9fZnJlZSA9PSBuciAtIGNvdW50KQorCQkJCWNvdW50Kys7CisJCQllbHNlIHsKKwkJCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJCQlleHQyX2ZyZWVfYmxvY2tzIChpbm9kZSwgYmxvY2tfdG9fZnJlZSwgY291bnQpOworCQkJZnJlZV90aGlzOgorCQkJCWJsb2NrX3RvX2ZyZWUgPSBucjsKKwkJCQljb3VudCA9IDE7CisJCQl9CisJCX0KKwl9CisJaWYgKGNvdW50ID4gMCkgeworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJZXh0Ml9mcmVlX2Jsb2NrcyAoaW5vZGUsIGJsb2NrX3RvX2ZyZWUsIGNvdW50KTsKKwl9Cit9CisKKy8qKgorICoJZXh0Ml9mcmVlX2JyYW5jaGVzIC0gZnJlZSBhbiBhcnJheSBvZiBicmFuY2hlcworICoJQGlub2RlOglpbm9kZSB3ZSBhcmUgZGVhbGluZyB3aXRoCisgKglAcDoJYXJyYXkgb2YgYmxvY2sgbnVtYmVycworICoJQHE6CXBvaW50ZXIgaW1tZWRpYXRlbHkgcGFzdCB0aGUgZW5kIG9mIGFycmF5CisgKglAZGVwdGg6CWRlcHRoIG9mIHRoZSBicmFuY2hlcyB0byBmcmVlCisgKgorICoJV2UgYXJlIGZyZWVpbmcgYWxsIGJsb2NrcyByZWZlcmVkIGZyb20gdGhlc2UgYnJhbmNoZXMgKG51bWJlcnMgYXJlCisgKglzdG9yZWQgYXMgbGl0dGxlLWVuZGlhbiAzMi1iaXQpIGFuZCB1cGRhdGluZyBAaW5vZGUtPmlfYmxvY2tzCisgKglhcHByb3ByaWF0ZWx5LgorICovCitzdGF0aWMgdm9pZCBleHQyX2ZyZWVfYnJhbmNoZXMoc3RydWN0IGlub2RlICppbm9kZSwgX19sZTMyICpwLCBfX2xlMzIgKnEsIGludCBkZXB0aCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwl1bnNpZ25lZCBsb25nIG5yOworCisJaWYgKGRlcHRoLS0pIHsKKwkJaW50IGFkZHJfcGVyX2Jsb2NrID0gRVhUMl9BRERSX1BFUl9CTE9DSyhpbm9kZS0+aV9zYik7CisJCWZvciAoIDsgcCA8IHEgOyBwKyspIHsKKwkJCW5yID0gbGUzMl90b19jcHUoKnApOworCQkJaWYgKCFucikKKwkJCQljb250aW51ZTsKKwkJCSpwID0gMDsKKwkJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIG5yKTsKKwkJCS8qCisJCQkgKiBBIHJlYWQgZmFpbHVyZT8gUmVwb3J0IGVycm9yIGFuZCBjbGVhciBzbG90CisJCQkgKiAoc2hvdWxkIGJlIHJhcmUpLgorCQkJICovIAorCQkJaWYgKCFiaCkgeworCQkJCWV4dDJfZXJyb3IoaW5vZGUtPmlfc2IsICJleHQyX2ZyZWVfYnJhbmNoZXMiLAorCQkJCQkiUmVhZCBmYWlsdXJlLCBpbm9kZT0lbGQsIGJsb2NrPSVsZCIsCisJCQkJCWlub2RlLT5pX2lubywgbnIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZXh0Ml9mcmVlX2JyYW5jaGVzKGlub2RlLAorCQkJCQkgICAoX19sZTMyKiliaC0+Yl9kYXRhLAorCQkJCQkgICAoX19sZTMyKiliaC0+Yl9kYXRhICsgYWRkcl9wZXJfYmxvY2ssCisJCQkJCSAgIGRlcHRoKTsKKwkJCWJmb3JnZXQoYmgpOworCQkJZXh0Ml9mcmVlX2Jsb2Nrcyhpbm9kZSwgbnIsIDEpOworCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCX0KKwl9IGVsc2UKKwkJZXh0Ml9mcmVlX2RhdGEoaW5vZGUsIHAsIHEpOworfQorCit2b2lkIGV4dDJfdHJ1bmNhdGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCV9fbGUzMiAqaV9kYXRhID0gRVhUMl9JKGlub2RlKS0+aV9kYXRhOworCWludCBhZGRyX3Blcl9ibG9jayA9IEVYVDJfQUREUl9QRVJfQkxPQ0soaW5vZGUtPmlfc2IpOworCWludCBvZmZzZXRzWzRdOworCUluZGlyZWN0IGNoYWluWzRdOworCUluZGlyZWN0ICpwYXJ0aWFsOworCV9fbGUzMiBuciA9IDA7CisJaW50IG47CisJbG9uZyBpYmxvY2s7CisJdW5zaWduZWQgYmxvY2tzaXplOworCisJaWYgKCEoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8CisJICAgIFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpKQorCQlyZXR1cm47CisJaWYgKGV4dDJfaW5vZGVfaXNfZmFzdF9zeW1saW5rKGlub2RlKSkKKwkJcmV0dXJuOworCWlmIChJU19BUFBFTkQoaW5vZGUpIHx8IElTX0lNTVVUQUJMRShpbm9kZSkpCisJCXJldHVybjsKKworCWV4dDJfZGlzY2FyZF9wcmVhbGxvYyhpbm9kZSk7CisKKwlibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJaWJsb2NrID0gKGlub2RlLT5pX3NpemUgKyBibG9ja3NpemUtMSkKKwkJCQkJPj4gRVhUMl9CTE9DS19TSVpFX0JJVFMoaW5vZGUtPmlfc2IpOworCisJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBOT0JIKSkKKwkJbm9iaF90cnVuY2F0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGlub2RlLT5pX3NpemUpOworCWVsc2UKKwkJYmxvY2tfdHJ1bmNhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLAorCQkJCWlub2RlLT5pX3NpemUsIGV4dDJfZ2V0X2Jsb2NrKTsKKworCW4gPSBleHQyX2Jsb2NrX3RvX3BhdGgoaW5vZGUsIGlibG9jaywgb2Zmc2V0cywgTlVMTCk7CisJaWYgKG4gPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKG4gPT0gMSkgeworCQlleHQyX2ZyZWVfZGF0YShpbm9kZSwgaV9kYXRhK29mZnNldHNbMF0sCisJCQkJCWlfZGF0YSArIEVYVDJfTkRJUl9CTE9DS1MpOworCQlnb3RvIGRvX2luZGlyZWN0czsKKwl9CisKKwlwYXJ0aWFsID0gZXh0Ml9maW5kX3NoYXJlZChpbm9kZSwgbiwgb2Zmc2V0cywgY2hhaW4sICZucik7CisJLyogS2lsbCB0aGUgdG9wIG9mIHNoYXJlZCBicmFuY2ggKGFscmVhZHkgZGV0YWNoZWQpICovCisJaWYgKG5yKSB7CisJCWlmIChwYXJ0aWFsID09IGNoYWluKQorCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCWVsc2UKKwkJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKHBhcnRpYWwtPmJoLCBpbm9kZSk7CisJCWV4dDJfZnJlZV9icmFuY2hlcyhpbm9kZSwgJm5yLCAmbnIrMSwgKGNoYWluK24tMSkgLSBwYXJ0aWFsKTsKKwl9CisJLyogQ2xlYXIgdGhlIGVuZHMgb2YgaW5kaXJlY3QgYmxvY2tzIG9uIHRoZSBzaGFyZWQgYnJhbmNoICovCisJd2hpbGUgKHBhcnRpYWwgPiBjaGFpbikgeworCQlleHQyX2ZyZWVfYnJhbmNoZXMoaW5vZGUsCisJCQkJICAgcGFydGlhbC0+cCArIDEsCisJCQkJICAgKF9fbGUzMiopcGFydGlhbC0+YmgtPmJfZGF0YSthZGRyX3Blcl9ibG9jaywKKwkJCQkgICAoY2hhaW4rbi0xKSAtIHBhcnRpYWwpOworCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShwYXJ0aWFsLT5iaCwgaW5vZGUpOworCQlicmVsc2UgKHBhcnRpYWwtPmJoKTsKKwkJcGFydGlhbC0tOworCX0KK2RvX2luZGlyZWN0czoKKwkvKiBLaWxsIHRoZSByZW1haW5pbmcgKHdob2xlKSBzdWJ0cmVlcyAqLworCXN3aXRjaCAob2Zmc2V0c1swXSkgeworCQlkZWZhdWx0OgorCQkJbnIgPSBpX2RhdGFbRVhUMl9JTkRfQkxPQ0tdOworCQkJaWYgKG5yKSB7CisJCQkJaV9kYXRhW0VYVDJfSU5EX0JMT0NLXSA9IDA7CisJCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCQkJZXh0Ml9mcmVlX2JyYW5jaGVzKGlub2RlLCAmbnIsICZucisxLCAxKTsKKwkJCX0KKwkJY2FzZSBFWFQyX0lORF9CTE9DSzoKKwkJCW5yID0gaV9kYXRhW0VYVDJfRElORF9CTE9DS107CisJCQlpZiAobnIpIHsKKwkJCQlpX2RhdGFbRVhUMl9ESU5EX0JMT0NLXSA9IDA7CisJCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCQkJZXh0Ml9mcmVlX2JyYW5jaGVzKGlub2RlLCAmbnIsICZucisxLCAyKTsKKwkJCX0KKwkJY2FzZSBFWFQyX0RJTkRfQkxPQ0s6CisJCQluciA9IGlfZGF0YVtFWFQyX1RJTkRfQkxPQ0tdOworCQkJaWYgKG5yKSB7CisJCQkJaV9kYXRhW0VYVDJfVElORF9CTE9DS10gPSAwOworCQkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkJCWV4dDJfZnJlZV9icmFuY2hlcyhpbm9kZSwgJm5yLCAmbnIrMSwgMyk7CisJCQl9CisJCWNhc2UgRVhUMl9USU5EX0JMT0NLOgorCQkJOworCX0KKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpZiAoaW5vZGVfbmVlZHNfc3luYyhpbm9kZSkpIHsKKwkJc3luY19tYXBwaW5nX2J1ZmZlcnMoaW5vZGUtPmlfbWFwcGluZyk7CisJCWV4dDJfc3luY19pbm9kZSAoaW5vZGUpOworCX0gZWxzZSB7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBleHQyX2lub2RlICpleHQyX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbm9fdCBpbm8sCisJCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqKnApCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJdW5zaWduZWQgbG9uZyBibG9ja19ncm91cDsKKwl1bnNpZ25lZCBsb25nIGJsb2NrOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKiBnZHA7CisKKwkqcCA9IE5VTEw7CisJaWYgKChpbm8gIT0gRVhUMl9ST09UX0lOTyAmJiBpbm8gPCBFWFQyX0ZJUlNUX0lOTyhzYikpIHx8CisJICAgIGlubyA+IGxlMzJfdG9fY3B1KEVYVDJfU0Ioc2IpLT5zX2VzLT5zX2lub2Rlc19jb3VudCkpCisJCWdvdG8gRWludmFsOworCisJYmxvY2tfZ3JvdXAgPSAoaW5vIC0gMSkgLyBFWFQyX0lOT0RFU19QRVJfR1JPVVAoc2IpOworCWdkcCA9IGV4dDJfZ2V0X2dyb3VwX2Rlc2Moc2IsIGJsb2NrX2dyb3VwLCAmYmgpOworCWlmICghZ2RwKQorCQlnb3RvIEVnZHA7CisJLyoKKwkgKiBGaWd1cmUgb3V0IHRoZSBvZmZzZXQgd2l0aGluIHRoZSBibG9jayBncm91cCBpbm9kZSB0YWJsZQorCSAqLworCW9mZnNldCA9ICgoaW5vIC0gMSkgJSBFWFQyX0lOT0RFU19QRVJfR1JPVVAoc2IpKSAqIEVYVDJfSU5PREVfU0laRShzYik7CisJYmxvY2sgPSBsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX3RhYmxlKSArCisJCShvZmZzZXQgPj4gRVhUMl9CTE9DS19TSVpFX0JJVFMoc2IpKTsKKwlpZiAoIShiaCA9IHNiX2JyZWFkKHNiLCBibG9jaykpKQorCQlnb3RvIEVpbzsKKworCSpwID0gYmg7CisJb2Zmc2V0ICY9IChFWFQyX0JMT0NLX1NJWkUoc2IpIC0gMSk7CisJcmV0dXJuIChzdHJ1Y3QgZXh0Ml9pbm9kZSAqKSAoYmgtPmJfZGF0YSArIG9mZnNldCk7CisKK0VpbnZhbDoKKwlleHQyX2Vycm9yKHNiLCAiZXh0Ml9nZXRfaW5vZGUiLCAiYmFkIGlub2RlIG51bWJlcjogJWx1IiwKKwkJICAgKHVuc2lnbmVkIGxvbmcpIGlubyk7CisJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CitFaW86CisJZXh0Ml9lcnJvcihzYiwgImV4dDJfZ2V0X2lub2RlIiwKKwkJICAgInVuYWJsZSB0byByZWFkIGlub2RlIGJsb2NrIC0gaW5vZGU9JWx1LCBibG9jaz0lbHUiLAorCQkgICAodW5zaWduZWQgbG9uZykgaW5vLCBibG9jayk7CitFZ2RwOgorCXJldHVybiBFUlJfUFRSKC1FSU8pOworfQorCit2b2lkIGV4dDJfc2V0X2lub2RlX2ZsYWdzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJdW5zaWduZWQgaW50IGZsYWdzID0gRVhUMl9JKGlub2RlKS0+aV9mbGFnczsKKworCWlub2RlLT5pX2ZsYWdzICY9IH4oU19TWU5DfFNfQVBQRU5EfFNfSU1NVVRBQkxFfFNfTk9BVElNRXxTX0RJUlNZTkMpOworCWlmIChmbGFncyAmIEVYVDJfU1lOQ19GTCkKKwkJaW5vZGUtPmlfZmxhZ3MgfD0gU19TWU5DOworCWlmIChmbGFncyAmIEVYVDJfQVBQRU5EX0ZMKQorCQlpbm9kZS0+aV9mbGFncyB8PSBTX0FQUEVORDsKKwlpZiAoZmxhZ3MgJiBFWFQyX0lNTVVUQUJMRV9GTCkKKwkJaW5vZGUtPmlfZmxhZ3MgfD0gU19JTU1VVEFCTEU7CisJaWYgKGZsYWdzICYgRVhUMl9OT0FUSU1FX0ZMKQorCQlpbm9kZS0+aV9mbGFncyB8PSBTX05PQVRJTUU7CisJaWYgKGZsYWdzICYgRVhUMl9ESVJTWU5DX0ZMKQorCQlpbm9kZS0+aV9mbGFncyB8PSBTX0RJUlNZTkM7Cit9CisKK3ZvaWQgZXh0Ml9yZWFkX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvICplaSA9IEVYVDJfSShpbm9kZSk7CisJaW5vX3QgaW5vID0gaW5vZGUtPmlfaW5vOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBleHQyX2lub2RlICogcmF3X2lub2RlID0gZXh0Ml9nZXRfaW5vZGUoaW5vZGUtPmlfc2IsIGlubywgJmJoKTsKKwlpbnQgbjsKKworI2lmZGVmIENPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTAorCWVpLT5pX2FjbCA9IEVYVDJfQUNMX05PVF9DQUNIRUQ7CisJZWktPmlfZGVmYXVsdF9hY2wgPSBFWFQyX0FDTF9OT1RfQ0FDSEVEOworI2VuZGlmCisJaWYgKElTX0VSUihyYXdfaW5vZGUpKQorIAkJZ290byBiYWRfaW5vZGU7CisKKwlpbm9kZS0+aV9tb2RlID0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX21vZGUpOworCWlub2RlLT5pX3VpZCA9ICh1aWRfdClsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfdWlkX2xvdyk7CisJaW5vZGUtPmlfZ2lkID0gKGdpZF90KWxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV9naWRfbG93KTsKKwlpZiAoISh0ZXN0X29wdCAoaW5vZGUtPmlfc2IsIE5PX1VJRDMyKSkpIHsKKwkJaW5vZGUtPmlfdWlkIHw9IGxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV91aWRfaGlnaCkgPDwgMTY7CisJCWlub2RlLT5pX2dpZCB8PSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfZ2lkX2hpZ2gpIDw8IDE2OworCX0KKwlpbm9kZS0+aV9ubGluayA9IGxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV9saW5rc19jb3VudCk7CisJaW5vZGUtPmlfc2l6ZSA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9zaXplKTsKKwlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfYXRpbWUpOworCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9jdGltZSk7CisJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX210aW1lKTsKKwlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IGlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOworCWVpLT5pX2R0aW1lID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2R0aW1lKTsKKwkvKiBXZSBub3cgaGF2ZSBlbm91Z2ggZmllbGRzIHRvIGNoZWNrIGlmIHRoZSBpbm9kZSB3YXMgYWN0aXZlIG9yIG5vdC4KKwkgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIG5mc2QgbWlnaHQgdHJ5IHRvIGFjY2VzcyBkZWFkIGlub2RlcworCSAqIHRoZSB0ZXN0IGlzIHRoYXQgc2FtZSBvbmUgdGhhdCBlMmZzY2sgdXNlcworCSAqIE5laWxCcm93biAxOTk5b2N0MTUKKwkgKi8KKwlpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCAmJiAoaW5vZGUtPmlfbW9kZSA9PSAwIHx8IGVpLT5pX2R0aW1lKSkgeworCQkvKiB0aGlzIGlub2RlIGlzIGRlbGV0ZWQgKi8KKwkJYnJlbHNlIChiaCk7CisJCWdvdG8gYmFkX2lub2RlOworCX0KKwlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOwkvKiBUaGlzIGlzIHRoZSBvcHRpbWFsIElPIHNpemUgKGZvciBzdGF0KSwgbm90IHRoZSBmcyBibG9jayBzaXplICovCisJaW5vZGUtPmlfYmxvY2tzID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2Jsb2Nrcyk7CisJZWktPmlfZmxhZ3MgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfZmxhZ3MpOworCWVpLT5pX2ZhZGRyID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2ZhZGRyKTsKKwllaS0+aV9mcmFnX25vID0gcmF3X2lub2RlLT5pX2ZyYWc7CisJZWktPmlfZnJhZ19zaXplID0gcmF3X2lub2RlLT5pX2ZzaXplOworCWVpLT5pX2ZpbGVfYWNsID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2ZpbGVfYWNsKTsKKwllaS0+aV9kaXJfYWNsID0gMDsKKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKKwkJaW5vZGUtPmlfc2l6ZSB8PSAoKF9fdTY0KWxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9zaXplX2hpZ2gpKSA8PCAzMjsKKwllbHNlCisJCWVpLT5pX2Rpcl9hY2wgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfZGlyX2FjbCk7CisJZWktPmlfZHRpbWUgPSAwOworCWlub2RlLT5pX2dlbmVyYXRpb24gPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfZ2VuZXJhdGlvbik7CisJZWktPmlfc3RhdGUgPSAwOworCWVpLT5pX25leHRfYWxsb2NfYmxvY2sgPSAwOworCWVpLT5pX25leHRfYWxsb2NfZ29hbCA9IDA7CisJZWktPmlfcHJlYWxsb2NfY291bnQgPSAwOworCWVpLT5pX2Jsb2NrX2dyb3VwID0gKGlubyAtIDEpIC8gRVhUMl9JTk9ERVNfUEVSX0dST1VQKGlub2RlLT5pX3NiKTsKKwllaS0+aV9kaXJfc3RhcnRfbG9va3VwID0gMDsKKworCS8qCisJICogTk9URSEgVGhlIGluLW1lbW9yeSBpbm9kZSBpX2RhdGEgYXJyYXkgaXMgaW4gbGl0dGxlLWVuZGlhbiBvcmRlcgorCSAqIGV2ZW4gb24gYmlnLWVuZGlhbiBtYWNoaW5lczogd2UgZG8gTk9UIGJ5dGVzd2FwIHRoZSBibG9jayBudW1iZXJzIQorCSAqLworCWZvciAobiA9IDA7IG4gPCBFWFQyX05fQkxPQ0tTOyBuKyspCisJCWVpLT5pX2RhdGFbbl0gPSByYXdfaW5vZGUtPmlfYmxvY2tbbl07CisKKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZleHQyX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmV4dDJfZmlsZV9vcGVyYXRpb25zOworCQlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpKQorCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmZXh0Ml9ub2JoX2FvcHM7CisJCWVsc2UKKwkJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmV4dDJfYW9wczsKKwl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmZXh0Ml9kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmV4dDJfZGlyX29wZXJhdGlvbnM7CisJCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgTk9CSCkpCisJCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZleHQyX25vYmhfYW9wczsKKwkJZWxzZQorCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmZXh0Ml9hb3BzOworCX0gZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgeworCQlpZiAoZXh0Ml9pbm9kZV9pc19mYXN0X3N5bWxpbmsoaW5vZGUpKQorCQkJaW5vZGUtPmlfb3AgPSAmZXh0Ml9mYXN0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJZWxzZSB7CisJCQlpbm9kZS0+aV9vcCA9ICZleHQyX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgTk9CSCkpCisJCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmZXh0Ml9ub2JoX2FvcHM7CisJCQllbHNlCisJCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmZXh0Ml9hb3BzOworCQl9CisJfSBlbHNlIHsKKwkJaW5vZGUtPmlfb3AgPSAmZXh0Ml9zcGVjaWFsX2lub2RlX29wZXJhdGlvbnM7CisJCWlmIChyYXdfaW5vZGUtPmlfYmxvY2tbMF0pCisJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCisJCQkgICBvbGRfZGVjb2RlX2RldihsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfYmxvY2tbMF0pKSk7CisJCWVsc2UgCisJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCisJCQkgICBuZXdfZGVjb2RlX2RldihsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfYmxvY2tbMV0pKSk7CisJfQorCWJyZWxzZSAoYmgpOworCWV4dDJfc2V0X2lub2RlX2ZsYWdzKGlub2RlKTsKKwlyZXR1cm47CisJCitiYWRfaW5vZGU6CisJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCXJldHVybjsKK30KKworc3RhdGljIGludCBleHQyX3VwZGF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IGRvX3N5bmMpCit7CisJc3RydWN0IGV4dDJfaW5vZGVfaW5mbyAqZWkgPSBFWFQyX0koaW5vZGUpOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlpbm9fdCBpbm8gPSBpbm9kZS0+aV9pbm87CisJdWlkX3QgdWlkID0gaW5vZGUtPmlfdWlkOworCWdpZF90IGdpZCA9IGlub2RlLT5pX2dpZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAqIHJhd19pbm9kZSA9IGV4dDJfZ2V0X2lub2RlKHNiLCBpbm8sICZiaCk7CisJaW50IG47CisJaW50IGVyciA9IDA7CisKKwlpZiAoSVNfRVJSKHJhd19pbm9kZSkpCisgCQlyZXR1cm4gLUVJTzsKKworCS8qIEZvciBmaWVsZHMgbm90IG5vdCB0cmFja2luZyBpbiB0aGUgaW4tbWVtb3J5IGlub2RlLAorCSAqIGluaXRpYWxpc2UgdGhlbSB0byB6ZXJvIGZvciBuZXcgaW5vZGVzLiAqLworCWlmIChlaS0+aV9zdGF0ZSAmIEVYVDJfU1RBVEVfTkVXKQorCQltZW1zZXQocmF3X2lub2RlLCAwLCBFWFQyX1NCKHNiKS0+c19pbm9kZV9zaXplKTsKKworCXJhd19pbm9kZS0+aV9tb2RlID0gY3B1X3RvX2xlMTYoaW5vZGUtPmlfbW9kZSk7CisJaWYgKCEodGVzdF9vcHQoc2IsIE5PX1VJRDMyKSkpIHsKKwkJcmF3X2lub2RlLT5pX3VpZF9sb3cgPSBjcHVfdG9fbGUxNihsb3dfMTZfYml0cyh1aWQpKTsKKwkJcmF3X2lub2RlLT5pX2dpZF9sb3cgPSBjcHVfdG9fbGUxNihsb3dfMTZfYml0cyhnaWQpKTsKKy8qCisgKiBGaXggdXAgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG9sZCBrZXJuZWxzLiBPdGhlcndpc2UsIG9sZCBpbm9kZXMgZ2V0CisgKiByZS11c2VkIHdpdGggdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhlIHVpZC9naWQgaW50YWN0CisgKi8KKwkJaWYgKCFlaS0+aV9kdGltZSkgeworCQkJcmF3X2lub2RlLT5pX3VpZF9oaWdoID0gY3B1X3RvX2xlMTYoaGlnaF8xNl9iaXRzKHVpZCkpOworCQkJcmF3X2lub2RlLT5pX2dpZF9oaWdoID0gY3B1X3RvX2xlMTYoaGlnaF8xNl9iaXRzKGdpZCkpOworCQl9IGVsc2UgeworCQkJcmF3X2lub2RlLT5pX3VpZF9oaWdoID0gMDsKKwkJCXJhd19pbm9kZS0+aV9naWRfaGlnaCA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlyYXdfaW5vZGUtPmlfdWlkX2xvdyA9IGNwdV90b19sZTE2KGZzX2hpZ2gybG93dWlkKHVpZCkpOworCQlyYXdfaW5vZGUtPmlfZ2lkX2xvdyA9IGNwdV90b19sZTE2KGZzX2hpZ2gybG93Z2lkKGdpZCkpOworCQlyYXdfaW5vZGUtPmlfdWlkX2hpZ2ggPSAwOworCQlyYXdfaW5vZGUtPmlfZ2lkX2hpZ2ggPSAwOworCX0KKwlyYXdfaW5vZGUtPmlfbGlua3NfY291bnQgPSBjcHVfdG9fbGUxNihpbm9kZS0+aV9ubGluayk7CisJcmF3X2lub2RlLT5pX3NpemUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9zaXplKTsKKwlyYXdfaW5vZGUtPmlfYXRpbWUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9hdGltZS50dl9zZWMpOworCXJhd19pbm9kZS0+aV9jdGltZSA9IGNwdV90b19sZTMyKGlub2RlLT5pX2N0aW1lLnR2X3NlYyk7CisJcmF3X2lub2RlLT5pX210aW1lID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfbXRpbWUudHZfc2VjKTsKKworCXJhd19pbm9kZS0+aV9ibG9ja3MgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9ibG9ja3MpOworCXJhd19pbm9kZS0+aV9kdGltZSA9IGNwdV90b19sZTMyKGVpLT5pX2R0aW1lKTsKKwlyYXdfaW5vZGUtPmlfZmxhZ3MgPSBjcHVfdG9fbGUzMihlaS0+aV9mbGFncyk7CisJcmF3X2lub2RlLT5pX2ZhZGRyID0gY3B1X3RvX2xlMzIoZWktPmlfZmFkZHIpOworCXJhd19pbm9kZS0+aV9mcmFnID0gZWktPmlfZnJhZ19ubzsKKwlyYXdfaW5vZGUtPmlfZnNpemUgPSBlaS0+aV9mcmFnX3NpemU7CisJcmF3X2lub2RlLT5pX2ZpbGVfYWNsID0gY3B1X3RvX2xlMzIoZWktPmlfZmlsZV9hY2wpOworCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKKwkJcmF3X2lub2RlLT5pX2Rpcl9hY2wgPSBjcHVfdG9fbGUzMihlaS0+aV9kaXJfYWNsKTsKKwllbHNlIHsKKwkJcmF3X2lub2RlLT5pX3NpemVfaGlnaCA9IGNwdV90b19sZTMyKGlub2RlLT5pX3NpemUgPj4gMzIpOworCQlpZiAoaW5vZGUtPmlfc2l6ZSA+IDB4N2ZmZmZmZmZVTEwpIHsKKwkJCWlmICghRVhUMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCisJCQkJCUVYVDJfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRSkgfHwKKwkJCSAgICBFWFQyX1NCKHNiKS0+c19lcy0+c19yZXZfbGV2ZWwgPT0KKwkJCQkJY3B1X3RvX2xlMzIoRVhUMl9HT09EX09MRF9SRVYpKSB7CisJCQkgICAgICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgbGFyZ2UgZmlsZQorCQkJCSogY3JlYXRlZCwgYWRkIGEgZmxhZyB0byB0aGUgc3VwZXJibG9jay4KKwkJCQkqLworCQkJCWxvY2tfa2VybmVsKCk7CisJCQkJZXh0Ml91cGRhdGVfZHluYW1pY19yZXYoc2IpOworCQkJCUVYVDJfU0VUX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAorCQkJCQlFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEUpOworCQkJCXVubG9ja19rZXJuZWwoKTsKKwkJCQlleHQyX3dyaXRlX3N1cGVyKHNiKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlyYXdfaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGNwdV90b19sZTMyKGlub2RlLT5pX2dlbmVyYXRpb24pOworCWlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKG9sZF92YWxpZF9kZXYoaW5vZGUtPmlfcmRldikpIHsKKwkJCXJhd19pbm9kZS0+aV9ibG9ja1swXSA9CisJCQkJY3B1X3RvX2xlMzIob2xkX2VuY29kZV9kZXYoaW5vZGUtPmlfcmRldikpOworCQkJcmF3X2lub2RlLT5pX2Jsb2NrWzFdID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJhd19pbm9kZS0+aV9ibG9ja1swXSA9IDA7CisJCQlyYXdfaW5vZGUtPmlfYmxvY2tbMV0gPQorCQkJCWNwdV90b19sZTMyKG5ld19lbmNvZGVfZGV2KGlub2RlLT5pX3JkZXYpKTsKKwkJCXJhd19pbm9kZS0+aV9ibG9ja1syXSA9IDA7CisJCX0KKwl9IGVsc2UgZm9yIChuID0gMDsgbiA8IEVYVDJfTl9CTE9DS1M7IG4rKykKKwkJcmF3X2lub2RlLT5pX2Jsb2NrW25dID0gZWktPmlfZGF0YVtuXTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKGRvX3N5bmMpIHsKKwkJc3luY19kaXJ0eV9idWZmZXIoYmgpOworCQlpZiAoYnVmZmVyX3JlcShiaCkgJiYgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJCXByaW50ayAoIklPIGVycm9yIHN5bmNpbmcgZXh0MiBpbm9kZSBbJXM6JTA4bHhdXG4iLAorCQkJCXNiLT5zX2lkLCAodW5zaWduZWQgbG9uZykgaW5vKTsKKwkJCWVyciA9IC1FSU87CisJCX0KKwl9CisJZWktPmlfc3RhdGUgJj0gfkVYVDJfU1RBVEVfTkVXOworCWJyZWxzZSAoYmgpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBleHQyX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB3YWl0KQoreworCXJldHVybiBleHQyX3VwZGF0ZV9pbm9kZShpbm9kZSwgd2FpdCk7Cit9CisKK2ludCBleHQyX3N5bmNfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgd2JjID0geworCQkuc3luY19tb2RlID0gV0JfU1lOQ19BTEwsCisJCS5ucl90b193cml0ZSA9IDAsCS8qIHN5c19mc3luYyBkaWQgdGhpcyAqLworCX07CisJcmV0dXJuIHN5bmNfaW5vZGUoaW5vZGUsICZ3YmMpOworfQorCitpbnQgZXh0Ml9zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICppYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvcjsKKworCWVycm9yID0gaW5vZGVfY2hhbmdlX29rKGlub2RlLCBpYXR0cik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJaWYgKChpYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCAmJiBpYXR0ci0+aWFfdWlkICE9IGlub2RlLT5pX3VpZCkgfHwKKwkgICAgKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfR0lEICYmIGlhdHRyLT5pYV9naWQgIT0gaW5vZGUtPmlfZ2lkKSkgeworCQllcnJvciA9IERRVU9UX1RSQU5TRkVSKGlub2RlLCBpYXR0cikgPyAtRURRVU9UIDogMDsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCX0KKwllcnJvciA9IGlub2RlX3NldGF0dHIoaW5vZGUsIGlhdHRyKTsKKwlpZiAoIWVycm9yICYmIChpYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpKQorCQllcnJvciA9IGV4dDJfYWNsX2NobW9kKGlub2RlKTsKKwlyZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9mcy9leHQyL2lvY3RsLmMgYi9mcy9leHQyL2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5ZDg2NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDIvaW9jdGwuYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogbGludXgvZnMvZXh0Mi9pb2N0bC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICovCisKKyNpbmNsdWRlICJleHQyLmgiCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKK2ludCBleHQyX2lvY3RsIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvICplaSA9IEVYVDJfSShpbm9kZSk7CisJdW5zaWduZWQgaW50IGZsYWdzOworCisJZXh0Ml9kZWJ1ZyAoImNtZCA9ICV1LCBhcmcgPSAlbHVcbiIsIGNtZCwgYXJnKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBFWFQyX0lPQ19HRVRGTEFHUzoKKwkJZmxhZ3MgPSBlaS0+aV9mbGFncyAmIEVYVDJfRkxfVVNFUl9WSVNJQkxFOworCQlyZXR1cm4gcHV0X3VzZXIoZmxhZ3MsIChpbnQgX191c2VyICopIGFyZyk7CisJY2FzZSBFWFQyX0lPQ19TRVRGTEFHUzogeworCQl1bnNpZ25lZCBpbnQgb2xkZmxhZ3M7CisKKwkJaWYgKElTX1JET05MWShpbm9kZSkpCisJCQlyZXR1cm4gLUVST0ZTOworCisJCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWlmIChnZXRfdXNlcihmbGFncywgKGludCBfX3VzZXIgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCWZsYWdzICY9IH5FWFQyX0RJUlNZTkNfRkw7CisKKwkJb2xkZmxhZ3MgPSBlaS0+aV9mbGFnczsKKworCQkvKgorCQkgKiBUaGUgSU1NVVRBQkxFIGFuZCBBUFBFTkRfT05MWSBmbGFncyBjYW4gb25seSBiZSBjaGFuZ2VkIGJ5CisJCSAqIHRoZSByZWxldmFudCBjYXBhYmlsaXR5LgorCQkgKgorCQkgKiBUaGlzIHRlc3QgbG9va3MgbmljZXIuIFRoYW5rcyB0byBQYXVsaW5lIE1pZGRlbGluaworCQkgKi8KKwkJaWYgKChmbGFncyBeIG9sZGZsYWdzKSAmIChFWFQyX0FQUEVORF9GTCB8IEVYVDJfSU1NVVRBQkxFX0ZMKSkgeworCQkJaWYgKCFjYXBhYmxlKENBUF9MSU5VWF9JTU1VVEFCTEUpKQorCQkJCXJldHVybiAtRVBFUk07CisJCX0KKworCQlmbGFncyA9IGZsYWdzICYgRVhUMl9GTF9VU0VSX01PRElGSUFCTEU7CisJCWZsYWdzIHw9IG9sZGZsYWdzICYgfkVYVDJfRkxfVVNFUl9NT0RJRklBQkxFOworCQllaS0+aV9mbGFncyA9IGZsYWdzOworCisJCWV4dDJfc2V0X2lub2RlX2ZsYWdzKGlub2RlKTsKKwkJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgRVhUMl9JT0NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKGlub2RlLT5pX2dlbmVyYXRpb24sIChpbnQgX191c2VyICopIGFyZyk7CisJY2FzZSBFWFQyX0lPQ19TRVRWRVJTSU9OOgorCQlpZiAoKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCkgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoSVNfUkRPTkxZKGlub2RlKSkKKwkJCXJldHVybiAtRVJPRlM7CisJCWlmIChnZXRfdXNlcihpbm9kZS0+aV9nZW5lcmF0aW9uLCAoaW50IF9fdXNlciAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CQorCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKKwl9Cit9CmRpZmYgLS1naXQgYS9mcy9leHQyL25hbWVpLmMgYi9mcy9leHQyL25hbWVpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE3NmIzZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDIvbmFtZWkuYwpAQCAtMCwwICsxLDQxOCBAQAorLyoKKyAqIGxpbnV4L2ZzL2V4dDIvbmFtZWkuYworICoKKyAqIFJld3JpdGUgdG8gcGFnZWNhY2hlLiBBbG1vc3QgYWxsIGNvZGUgaGFkIGJlZW4gY2hhbmdlZCwgc28gYmxhbWUgbWUKKyAqIGlmIHRoZSB0aGluZ3MgZ28gd3JvbmcuIFBsZWFzZSwgc2VuZCBidWcgcmVwb3J0cyB0bworICogdmlyb0BwYXJjZWxmYXJjZS5saW51eC50aGVwbGFuZXQuY28udWsKKyAqCisgKiBTdHVmZiBoZXJlIGlzIGJhc2ljYWxseSBhIGdsdWUgYmV0d2VlbiB0aGUgVkZTIGFuZCBnZW5lcmljIFVOSVhpc2gKKyAqIGZpbGVzeXN0ZW0gdGhhdCBrZWVwcyBldmVyeXRoaW5nIGluIHBhZ2VjYWNoZS4gQWxsIGtub3dsZWRnZSBvZiB0aGUKKyAqIGRpcmVjdG9yeSBsYXlvdXQgaXMgaW4gZnMvZXh0Mi9kaXIuYyAtIGl0IHR1cm5lZCBvdXQgdG8gYmUgZWFzaWx5IHNlcGFyYXRhYmxlCisgKiBhbmQgaXQncyBlYXNpZXIgdG8gZGVidWcgdGhhdCB3YXkuIEluIHByaW5jaXBsZSB3ZSBtaWdodCB3YW50IHRvCisgKiBnZW5lcmFsaXplIHRoYXQgYSBiaXQgYW5kIHR1cm4gaXQgaW50byBhIGxpYnJhcnkuIE9yIG5vdC4KKyAqCisgKiBUaGUgb25seSBub24tc3RhdGljIG9iamVjdCBoZXJlIGlzIGV4dDJfZGlyX2lub2RlX29wZXJhdGlvbnMuCisgKgorICogVE9ETzogZ2V0IHJpZCBvZiBrbWFwKCkgdXNlLCBhZGQgcmVhZGFoZWFkLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9mcy9taW5peC9uYW1laS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqLworCisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgImV4dDIuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImFjbC5oIgorCisvKgorICogQ291cGxlIG9mIGhlbHBlciBmdW5jdGlvbnMgLSBtYWtlIHRoZSBjb2RlIHNsaWdodGx5IGNsZWFuZXIuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGV4dDJfaW5jX2NvdW50KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW5vZGUtPmlfbmxpbmsrKzsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV4dDJfZGVjX2NvdW50KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW5vZGUtPmlfbmxpbmstLTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZXh0Ml9hZGRfbm9uZGlyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbnQgZXJyID0gZXh0Ml9hZGRfbGluayhkZW50cnksIGlub2RlKTsKKwlpZiAoIWVycikgeworCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCQlyZXR1cm4gMDsKKwl9CisJZXh0Ml9kZWNfY291bnQoaW5vZGUpOworCWlwdXQoaW5vZGUpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBNZXRob2RzIHRoZW1zZWx2ZXMuCisgKi8KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmV4dDJfbG9va3VwKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlpbm9fdCBpbm87CisJCisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IEVYVDJfTkFNRV9MRU4pCisJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCisJaW5vID0gZXh0Ml9pbm9kZV9ieV9uYW1lKGRpciwgZGVudHJ5KTsKKwlpbm9kZSA9IE5VTEw7CisJaWYgKGlubykgeworCQlpbm9kZSA9IGlnZXQoZGlyLT5pX3NiLCBpbm8pOworCQlpZiAoIWlub2RlKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJfQorCWlmIChpbm9kZSkKKwkJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOworCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgZGVudHJ5ICpleHQyX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpCit7CisJdW5zaWduZWQgbG9uZyBpbm87CisJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGRlbnRyeSBkb3Rkb3Q7CisKKwlkb3Rkb3QuZF9uYW1lLm5hbWUgPSAiLi4iOworCWRvdGRvdC5kX25hbWUubGVuID0gMjsKKworCWlubyA9IGV4dDJfaW5vZGVfYnlfbmFtZShjaGlsZC0+ZF9pbm9kZSwgJmRvdGRvdCk7CisJaWYgKCFpbm8pCisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCWlub2RlID0gaWdldChjaGlsZC0+ZF9pbm9kZS0+aV9zYiwgaW5vKTsKKworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCXBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisJaWYgKCFwYXJlbnQpIHsKKwkJaXB1dChpbm9kZSk7CisJCXBhcmVudCA9IEVSUl9QVFIoLUVOT01FTSk7CisJfQorCXJldHVybiBwYXJlbnQ7Cit9IAorCisvKgorICogQnkgdGhlIHRpbWUgdGhpcyBpcyBjYWxsZWQsIHdlIGFscmVhZHkgaGF2ZSBjcmVhdGVkCisgKiB0aGUgZGlyZWN0b3J5IGNhY2hlIGVudHJ5IGZvciB0aGUgbmV3IGZpbGUsIGJ1dCBpdAorICogaXMgc28gZmFyIG5lZ2F0aXZlIC0gaXQgaGFzIG5vIGlub2RlLgorICoKKyAqIElmIHRoZSBjcmVhdGUgc3VjY2VlZHMsIHdlIGZpbGwgaW4gdGhlIGlub2RlIGluZm9ybWF0aW9uCisgKiB3aXRoIGRfaW5zdGFudGlhdGUoKS4gCisgKi8KK3N0YXRpYyBpbnQgZXh0Ml9jcmVhdGUgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgaW50IG1vZGUsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZXh0Ml9uZXdfaW5vZGUgKGRpciwgbW9kZSk7CisJaW50IGVyciA9IFBUUl9FUlIoaW5vZGUpOworCWlmICghSVNfRVJSKGlub2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZleHQyX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmV4dDJfZmlsZV9vcGVyYXRpb25zOworCQlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpKQorCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmZXh0Ml9ub2JoX2FvcHM7CisJCWVsc2UKKwkJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmV4dDJfYW9wczsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCWVyciA9IGV4dDJfYWRkX25vbmRpcihkZW50cnksIGlub2RlKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBleHQyX21rbm9kIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIGRldl90IHJkZXYpCit7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJaW50IGVycjsKKworCWlmICghbmV3X3ZhbGlkX2RldihyZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpbm9kZSA9IGV4dDJfbmV3X2lub2RlIChkaXIsIG1vZGUpOworCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCWlmICghSVNfRVJSKGlub2RlKSkgeworCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsIHJkZXYpOworI2lmZGVmIENPTkZJR19FWFQyX0ZTX1hBVFRSCisJCWlub2RlLT5pX29wID0gJmV4dDJfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zOworI2VuZGlmCisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQllcnIgPSBleHQyX2FkZF9ub25kaXIoZGVudHJ5LCBpbm9kZSk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZXh0Ml9zeW1saW5rIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksCisJY29uc3QgY2hhciAqIHN5bW5hbWUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2IgPSBkaXItPmlfc2I7CisJaW50IGVyciA9IC1FTkFNRVRPT0xPTkc7CisJdW5zaWduZWQgbCA9IHN0cmxlbihzeW1uYW1lKSsxOworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCisJaWYgKGwgPiBzYi0+c19ibG9ja3NpemUpCisJCWdvdG8gb3V0OworCisJaW5vZGUgPSBleHQyX25ld19pbm9kZSAoZGlyLCBTX0lGTE5LIHwgU19JUldYVUdPKTsKKwllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJZ290byBvdXQ7CisKKwlpZiAobCA+IHNpemVvZiAoRVhUMl9JKGlub2RlKS0+aV9kYXRhKSkgeworCQkvKiBzbG93IHN5bWxpbmsgKi8KKwkJaW5vZGUtPmlfb3AgPSAmZXh0Ml9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgTk9CSCkpCisJCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZleHQyX25vYmhfYW9wczsKKwkJZWxzZQorCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmZXh0Ml9hb3BzOworCQllcnIgPSBwYWdlX3N5bWxpbmsoaW5vZGUsIHN5bW5hbWUsIGwpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfZmFpbDsKKwl9IGVsc2UgeworCQkvKiBmYXN0IHN5bWxpbmsgKi8KKwkJaW5vZGUtPmlfb3AgPSAmZXh0Ml9mYXN0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJbWVtY3B5KChjaGFyKikoRVhUMl9JKGlub2RlKS0+aV9kYXRhKSxzeW1uYW1lLGwpOworCQlpbm9kZS0+aV9zaXplID0gbC0xOworCX0KKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKworCWVyciA9IGV4dDJfYWRkX25vbmRpcihkZW50cnksIGlub2RlKTsKK291dDoKKwlyZXR1cm4gZXJyOworCitvdXRfZmFpbDoKKwlleHQyX2RlY19jb3VudChpbm9kZSk7CisJaXB1dCAoaW5vZGUpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IGV4dDJfbGluayAoc3RydWN0IGRlbnRyeSAqIG9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqIGRpciwKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisKKwlpZiAoaW5vZGUtPmlfbmxpbmsgPj0gRVhUMl9MSU5LX01BWCkKKwkJcmV0dXJuIC1FTUxJTks7CisKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJZXh0Ml9pbmNfY291bnQoaW5vZGUpOworCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKKworCXJldHVybiBleHQyX2FkZF9ub25kaXIoZGVudHJ5LCBpbm9kZSk7Cit9CisKK3N0YXRpYyBpbnQgZXh0Ml9ta2RpcihzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGludCBtb2RlKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCWludCBlcnIgPSAtRU1MSU5LOworCisJaWYgKGRpci0+aV9ubGluayA+PSBFWFQyX0xJTktfTUFYKQorCQlnb3RvIG91dDsKKworCWV4dDJfaW5jX2NvdW50KGRpcik7CisKKwlpbm9kZSA9IGV4dDJfbmV3X2lub2RlIChkaXIsIFNfSUZESVIgfCBtb2RlKTsKKwllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJZ290byBvdXRfZGlyOworCisJaW5vZGUtPmlfb3AgPSAmZXh0Ml9kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9mb3AgPSAmZXh0Ml9kaXJfb3BlcmF0aW9uczsKKwlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpKQorCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZleHQyX25vYmhfYW9wczsKKwllbHNlCisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmV4dDJfYW9wczsKKworCWV4dDJfaW5jX2NvdW50KGlub2RlKTsKKworCWVyciA9IGV4dDJfbWFrZV9lbXB0eShpbm9kZSwgZGlyKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mYWlsOworCisJZXJyID0gZXh0Ml9hZGRfbGluayhkZW50cnksIGlub2RlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mYWlsOworCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKK291dDoKKwlyZXR1cm4gZXJyOworCitvdXRfZmFpbDoKKwlleHQyX2RlY19jb3VudChpbm9kZSk7CisJZXh0Ml9kZWNfY291bnQoaW5vZGUpOworCWlwdXQoaW5vZGUpOworb3V0X2RpcjoKKwlleHQyX2RlY19jb3VudChkaXIpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IGV4dDJfdW5saW5rKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBleHQyX2Rpcl9lbnRyeV8yICogZGU7CisJc3RydWN0IHBhZ2UgKiBwYWdlOworCWludCBlcnIgPSAtRU5PRU5UOworCisJZGUgPSBleHQyX2ZpbmRfZW50cnkgKGRpciwgZGVudHJ5LCAmcGFnZSk7CisJaWYgKCFkZSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBleHQyX2RlbGV0ZV9lbnRyeSAoZGUsIHBhZ2UpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWU7CisJZXh0Ml9kZWNfY291bnQoaW5vZGUpOworCWVyciA9IDA7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBleHQyX3JtZGlyIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyID0gLUVOT1RFTVBUWTsKKworCWlmIChleHQyX2VtcHR5X2Rpcihpbm9kZSkpIHsKKwkJZXJyID0gZXh0Ml91bmxpbmsoZGlyLCBkZW50cnkpOworCQlpZiAoIWVycikgeworCQkJaW5vZGUtPmlfc2l6ZSA9IDA7CisJCQlleHQyX2RlY19jb3VudChpbm9kZSk7CisJCQlleHQyX2RlY19jb3VudChkaXIpOworCQl9CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZXh0Ml9yZW5hbWUgKHN0cnVjdCBpbm9kZSAqIG9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKiBvbGRfZGVudHJ5LAorCXN0cnVjdCBpbm9kZSAqIG5ld19kaXIsCXN0cnVjdCBkZW50cnkgKiBuZXdfZGVudHJ5ICkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBvbGRfaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqIG5ld19pbm9kZSA9IG5ld19kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHBhZ2UgKiBkaXJfcGFnZSA9IE5VTEw7CisJc3RydWN0IGV4dDJfZGlyX2VudHJ5XzIgKiBkaXJfZGUgPSBOVUxMOworCXN0cnVjdCBwYWdlICogb2xkX3BhZ2U7CisJc3RydWN0IGV4dDJfZGlyX2VudHJ5XzIgKiBvbGRfZGU7CisJaW50IGVyciA9IC1FTk9FTlQ7CisKKwlvbGRfZGUgPSBleHQyX2ZpbmRfZW50cnkgKG9sZF9kaXIsIG9sZF9kZW50cnksICZvbGRfcGFnZSk7CisJaWYgKCFvbGRfZGUpCisJCWdvdG8gb3V0OworCisJaWYgKFNfSVNESVIob2xkX2lub2RlLT5pX21vZGUpKSB7CisJCWVyciA9IC1FSU87CisJCWRpcl9kZSA9IGV4dDJfZG90ZG90KG9sZF9pbm9kZSwgJmRpcl9wYWdlKTsKKwkJaWYgKCFkaXJfZGUpCisJCQlnb3RvIG91dF9vbGQ7CisJfQorCisJaWYgKG5ld19pbm9kZSkgeworCQlzdHJ1Y3QgcGFnZSAqbmV3X3BhZ2U7CisJCXN0cnVjdCBleHQyX2Rpcl9lbnRyeV8yICpuZXdfZGU7CisKKwkJZXJyID0gLUVOT1RFTVBUWTsKKwkJaWYgKGRpcl9kZSAmJiAhZXh0Ml9lbXB0eV9kaXIgKG5ld19pbm9kZSkpCisJCQlnb3RvIG91dF9kaXI7CisKKwkJZXJyID0gLUVOT0VOVDsKKwkJbmV3X2RlID0gZXh0Ml9maW5kX2VudHJ5IChuZXdfZGlyLCBuZXdfZGVudHJ5LCAmbmV3X3BhZ2UpOworCQlpZiAoIW5ld19kZSkKKwkJCWdvdG8gb3V0X2RpcjsKKwkJZXh0Ml9pbmNfY291bnQob2xkX2lub2RlKTsKKwkJZXh0Ml9zZXRfbGluayhuZXdfZGlyLCBuZXdfZGUsIG5ld19wYWdlLCBvbGRfaW5vZGUpOworCQluZXdfaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQlpZiAoZGlyX2RlKQorCQkJbmV3X2lub2RlLT5pX25saW5rLS07CisJCWV4dDJfZGVjX2NvdW50KG5ld19pbm9kZSk7CisJfSBlbHNlIHsKKwkJaWYgKGRpcl9kZSkgeworCQkJZXJyID0gLUVNTElOSzsKKwkJCWlmIChuZXdfZGlyLT5pX25saW5rID49IEVYVDJfTElOS19NQVgpCisJCQkJZ290byBvdXRfZGlyOworCQl9CisJCWV4dDJfaW5jX2NvdW50KG9sZF9pbm9kZSk7CisJCWVyciA9IGV4dDJfYWRkX2xpbmsobmV3X2RlbnRyeSwgb2xkX2lub2RlKTsKKwkJaWYgKGVycikgeworCQkJZXh0Ml9kZWNfY291bnQob2xkX2lub2RlKTsKKwkJCWdvdG8gb3V0X2RpcjsKKwkJfQorCQlpZiAoZGlyX2RlKQorCQkJZXh0Ml9pbmNfY291bnQobmV3X2Rpcik7CisJfQorCisJLyoKKwkgKiBMaWtlIG1vc3Qgb3RoZXIgVW5peCBzeXN0ZW1zLCBzZXQgdGhlIGN0aW1lIGZvciBpbm9kZXMgb24gYQorIAkgKiByZW5hbWUuCisJICogZXh0Ml9kZWNfY291bnQoKSB3aWxsIG1hcmsgdGhlIGlub2RlIGRpcnR5LgorCSAqLworCW9sZF9pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisKKwlleHQyX2RlbGV0ZV9lbnRyeSAob2xkX2RlLCBvbGRfcGFnZSk7CisJZXh0Ml9kZWNfY291bnQob2xkX2lub2RlKTsKKworCWlmIChkaXJfZGUpIHsKKwkJZXh0Ml9zZXRfbGluayhvbGRfaW5vZGUsIGRpcl9kZSwgZGlyX3BhZ2UsIG5ld19kaXIpOworCQlleHQyX2RlY19jb3VudChvbGRfZGlyKTsKKwl9CisJcmV0dXJuIDA7CisKKworb3V0X2RpcjoKKwlpZiAoZGlyX2RlKSB7CisJCWt1bm1hcChkaXJfcGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShkaXJfcGFnZSk7CisJfQorb3V0X29sZDoKKwlrdW5tYXAob2xkX3BhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShvbGRfcGFnZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZXh0Ml9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkuY3JlYXRlCQk9IGV4dDJfY3JlYXRlLAorCS5sb29rdXAJCT0gZXh0Ml9sb29rdXAsCisJLmxpbmsJCT0gZXh0Ml9saW5rLAorCS51bmxpbmsJCT0gZXh0Ml91bmxpbmssCisJLnN5bWxpbmsJPSBleHQyX3N5bWxpbmssCisJLm1rZGlyCQk9IGV4dDJfbWtkaXIsCisJLnJtZGlyCQk9IGV4dDJfcm1kaXIsCisJLm1rbm9kCQk9IGV4dDJfbWtub2QsCisJLnJlbmFtZQkJPSBleHQyX3JlbmFtZSwKKyNpZmRlZiBDT05GSUdfRVhUMl9GU19YQVRUUgorCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gZ2VuZXJpY19nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gZXh0Ml9saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKKyNlbmRpZgorCS5zZXRhdHRyCT0gZXh0Ml9zZXRhdHRyLAorCS5wZXJtaXNzaW9uCT0gZXh0Ml9wZXJtaXNzaW9uLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZXh0Ml9zcGVjaWFsX2lub2RlX29wZXJhdGlvbnMgPSB7CisjaWZkZWYgQ09ORklHX0VYVDJfRlNfWEFUVFIKKwkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0cgk9IGV4dDJfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCisjZW5kaWYKKwkuc2V0YXR0cgk9IGV4dDJfc2V0YXR0ciwKKwkucGVybWlzc2lvbgk9IGV4dDJfcGVybWlzc2lvbiwKK307CmRpZmYgLS1naXQgYS9mcy9leHQyL3N1cGVyLmMgYi9mcy9leHQyL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdjYTc3YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDIvc3VwZXIuYwpAQCAtMCwwICsxLDExNjEgQEAKKy8qCisgKiAgbGludXgvZnMvZXh0Mi9zdXBlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2ZzL21pbml4L2lub2RlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBCaWctZW5kaWFuIHRvIGxpdHRsZS1lbmRpYW4gYnl0ZS1zd2FwcGluZy9iaXRtYXBzIGJ5CisgKiAgICAgICAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KSwgMTk5NQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgImV4dDIuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImFjbC5oIgorCitzdGF0aWMgdm9pZCBleHQyX3N5bmNfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgICBzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXMpOworc3RhdGljIGludCBleHQyX3JlbW91bnQgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBpbnQgKiBmbGFncywgY2hhciAqIGRhdGEpOworc3RhdGljIGludCBleHQyX3N0YXRmcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHN0cnVjdCBrc3RhdGZzICogYnVmKTsKKwordm9pZCBleHQyX2Vycm9yIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3QgY2hhciAqIGZ1bmN0aW9uLAorCQkgY29uc3QgY2hhciAqIGZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmkgPSBFWFQyX1NCKHNiKTsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7CisKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJc2JpLT5zX21vdW50X3N0YXRlIHw9IEVYVDJfRVJST1JfRlM7CisJCWVzLT5zX3N0YXRlID0KKwkJCWNwdV90b19sZTE2KGxlMTZfdG9fY3B1KGVzLT5zX3N0YXRlKSB8IEVYVDJfRVJST1JfRlMpOworCQlleHQyX3N5bmNfc3VwZXIoc2IsIGVzKTsKKwl9CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXByaW50ayhLRVJOX0NSSVQgIkVYVDItZnMgZXJyb3IgKGRldmljZSAlcyk6ICVzOiAiLHNiLT5zX2lkLCBmdW5jdGlvbik7CisJdnByaW50ayhmbXQsIGFyZ3MpOworCXByaW50aygiXG4iKTsKKwl2YV9lbmQoYXJncyk7CisKKwlpZiAodGVzdF9vcHQoc2IsIEVSUk9SU19QQU5JQykpCisJCXBhbmljKCJFWFQyLWZzIHBhbmljIGZyb20gcHJldmlvdXMgZXJyb3JcbiIpOworCWlmICh0ZXN0X29wdChzYiwgRVJST1JTX1JPKSkgeworCQlwcmludGsoIlJlbW91bnRpbmcgZmlsZXN5c3RlbSByZWFkLW9ubHlcbiIpOworCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJfQorfQorCit2b2lkIGV4dDJfd2FybmluZyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGNvbnN0IGNoYXIgKiBmdW5jdGlvbiwKKwkJICAgY29uc3QgY2hhciAqIGZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUMi1mcyB3YXJuaW5nIChkZXZpY2UgJXMpOiAlczogIiwKKwkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uKTsKKwl2cHJpbnRrKGZtdCwgYXJncyk7CisJcHJpbnRrKCJcbiIpOworCXZhX2VuZChhcmdzKTsKK30KKwordm9pZCBleHQyX3VwZGF0ZV9keW5hbWljX3JldihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICplcyA9IEVYVDJfU0Ioc2IpLT5zX2VzOworCisJaWYgKGxlMzJfdG9fY3B1KGVzLT5zX3Jldl9sZXZlbCkgPiBFWFQyX0dPT0RfT0xEX1JFVikKKwkJcmV0dXJuOworCisJZXh0Ml93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCSAgICAgInVwZGF0aW5nIHRvIHJldiAlZCBiZWNhdXNlIG9mIG5ldyBmZWF0dXJlIGZsYWcsICIKKwkJICAgICAicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWQiLAorCQkgICAgIEVYVDJfRFlOQU1JQ19SRVYpOworCisJZXMtPnNfZmlyc3RfaW5vID0gY3B1X3RvX2xlMzIoRVhUMl9HT09EX09MRF9GSVJTVF9JTk8pOworCWVzLT5zX2lub2RlX3NpemUgPSBjcHVfdG9fbGUxNihFWFQyX0dPT0RfT0xEX0lOT0RFX1NJWkUpOworCWVzLT5zX3Jldl9sZXZlbCA9IGNwdV90b19sZTMyKEVYVDJfRFlOQU1JQ19SRVYpOworCS8qIGxlYXZlIGVzLT5zX2ZlYXR1cmVfKmNvbXBhdCBmbGFncyBhbG9uZSAqLworCS8qIGVzLT5zX3V1aWQgd2lsbCBiZSBzZXQgYnkgZTJmc2NrIGlmIGVtcHR5ICovCisKKwkvKgorCSAqIFRoZSByZXN0IG9mIHRoZSBzdXBlcmJsb2NrIGZpZWxkcyBzaG91bGQgYmUgemVybywgYW5kIGlmIG5vdCBpdAorCSAqIG1lYW5zIHRoZXkgYXJlIGxpa2VseSBhbHJlYWR5IGluIHVzZSwgc28gbGVhdmUgdGhlbSBhbG9uZS4gIFdlCisJICogY2FuIGxlYXZlIGl0IHVwIHRvIGUyZnNjayB0byBjbGVhbiB1cCBhbnkgaW5jb25zaXN0ZW5jaWVzIHRoZXJlLgorCSAqLworfQorCitzdGF0aWMgdm9pZCBleHQyX3B1dF9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJaW50IGRiX2NvdW50OworCWludCBpOworCXN0cnVjdCBleHQyX3NiX2luZm8gKnNiaSA9IEVYVDJfU0Ioc2IpOworCisJZXh0Ml94YXR0cl9wdXRfc3VwZXIoc2IpOworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7CisKKwkJZXMtPnNfc3RhdGUgPSBjcHVfdG9fbGUxNihzYmktPnNfbW91bnRfc3RhdGUpOworCQlleHQyX3N5bmNfc3VwZXIoc2IsIGVzKTsKKwl9CisJZGJfY291bnQgPSBzYmktPnNfZ2RiX2NvdW50OworCWZvciAoaSA9IDA7IGkgPCBkYl9jb3VudDsgaSsrKQorCQlpZiAoc2JpLT5zX2dyb3VwX2Rlc2NbaV0pCisJCQlicmVsc2UgKHNiaS0+c19ncm91cF9kZXNjW2ldKTsKKwlrZnJlZShzYmktPnNfZ3JvdXBfZGVzYyk7CisJa2ZyZWUoc2JpLT5zX2RlYnRzKTsKKwlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKKwlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKKwlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZGlyc19jb3VudGVyKTsKKwlicmVsc2UgKHNiaS0+c19zYmgpOworCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNiaSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKiBleHQyX2lub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqZXh0Ml9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBleHQyX2lub2RlX2luZm8gKmVpOworCWVpID0gKHN0cnVjdCBleHQyX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKGV4dDJfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisjaWZkZWYgQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMCisJZWktPmlfYWNsID0gRVhUMl9BQ0xfTk9UX0NBQ0hFRDsKKwllaS0+aV9kZWZhdWx0X2FjbCA9IEVYVDJfQUNMX05PVF9DQUNIRUQ7CisjZW5kaWYKKwllaS0+dmZzX2lub2RlLmlfdmVyc2lvbiA9IDE7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBleHQyX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUoZXh0Ml9pbm9kZV9jYWNoZXAsIEVYVDJfSShpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBleHQyX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBleHQyX2lub2RlX2luZm8gKikgZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikgeworCQlyd2xvY2tfaW5pdCgmZWktPmlfbWV0YV9sb2NrKTsKKyNpZmRlZiBDT05GSUdfRVhUMl9GU19YQVRUUgorCQlpbml0X3J3c2VtKCZlaS0+eGF0dHJfc2VtKTsKKyNlbmRpZgorCQlpbm9kZV9pbml0X29uY2UoJmVpLT52ZnNfaW5vZGUpOworCX0KK30KKyAKK3N0YXRpYyBpbnQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpCit7CisJZXh0Ml9pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZXh0Ml9pbm9kZV9jYWNoZSIsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlX2luZm8pLAorCQkJCQkgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKGV4dDJfaW5vZGVfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKK3sKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGV4dDJfaW5vZGVfY2FjaGVwKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZXh0Ml9pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQorCitzdGF0aWMgdm9pZCBleHQyX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisjaWZkZWYgQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMCisJc3RydWN0IGV4dDJfaW5vZGVfaW5mbyAqZWkgPSBFWFQyX0koaW5vZGUpOworCisJaWYgKGVpLT5pX2FjbCAmJiBlaS0+aV9hY2wgIT0gRVhUMl9BQ0xfTk9UX0NBQ0hFRCkgeworCQlwb3NpeF9hY2xfcmVsZWFzZShlaS0+aV9hY2wpOworCQllaS0+aV9hY2wgPSBFWFQyX0FDTF9OT1RfQ0FDSEVEOworCX0KKwlpZiAoZWktPmlfZGVmYXVsdF9hY2wgJiYgZWktPmlfZGVmYXVsdF9hY2wgIT0gRVhUMl9BQ0xfTk9UX0NBQ0hFRCkgeworCQlwb3NpeF9hY2xfcmVsZWFzZShlaS0+aV9kZWZhdWx0X2FjbCk7CisJCWVpLT5pX2RlZmF1bHRfYWNsID0gRVhUMl9BQ0xfTk9UX0NBQ0hFRDsKKwl9CisjZW5kaWYKKwlpZiAoIWlzX2JhZF9pbm9kZShpbm9kZSkpCisJCWV4dDJfZGlzY2FyZF9wcmVhbGxvYyhpbm9kZSk7Cit9CisKKworI2lmZGVmIENPTkZJR19RVU9UQQorc3RhdGljIHNzaXplX3QgZXh0Ml9xdW90YV9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBsb2ZmX3Qgb2ZmKTsKK3N0YXRpYyBzc2l6ZV90IGV4dDJfcXVvdGFfd3JpdGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sIGxvZmZfdCBvZmYpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBleHQyX3NvcHMgPSB7CisJLmFsbG9jX2lub2RlCT0gZXh0Ml9hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IGV4dDJfZGVzdHJveV9pbm9kZSwKKwkucmVhZF9pbm9kZQk9IGV4dDJfcmVhZF9pbm9kZSwKKwkud3JpdGVfaW5vZGUJPSBleHQyX3dyaXRlX2lub2RlLAorCS5kZWxldGVfaW5vZGUJPSBleHQyX2RlbGV0ZV9pbm9kZSwKKwkucHV0X3N1cGVyCT0gZXh0Ml9wdXRfc3VwZXIsCisJLndyaXRlX3N1cGVyCT0gZXh0Ml93cml0ZV9zdXBlciwKKwkuc3RhdGZzCQk9IGV4dDJfc3RhdGZzLAorCS5yZW1vdW50X2ZzCT0gZXh0Ml9yZW1vdW50LAorCS5jbGVhcl9pbm9kZQk9IGV4dDJfY2xlYXJfaW5vZGUsCisjaWZkZWYgQ09ORklHX1FVT1RBCisJLnF1b3RhX3JlYWQJPSBleHQyX3F1b3RhX3JlYWQsCisJLnF1b3RhX3dyaXRlCT0gZXh0Ml9xdW90YV93cml0ZSwKKyNlbmRpZgorfTsKKworLyogWWVzLCBtb3N0IG9mIHRoZXNlIGFyZSBsZWZ0IGFzIE5VTEwhIQorICogQSBOVUxMIHZhbHVlIGltcGxpZXMgdGhlIGRlZmF1bHQsIHdoaWNoIHdvcmtzIHdpdGggZXh0Mi1saWtlIGZpbGUKKyAqIHN5c3RlbXMsIGJ1dCBjYW4gYmUgaW1wcm92ZWQgdXBvbi4KKyAqIEN1cnJlbnRseSBvbmx5IGdldF9wYXJlbnQgaXMgcmVxdWlyZWQuCisgKi8KK3N0cnVjdCBkZW50cnkgKmV4dDJfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZCk7CitzdGF0aWMgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGV4dDJfZXhwb3J0X29wcyA9IHsKKwkuZ2V0X3BhcmVudCA9IGV4dDJfZ2V0X3BhcmVudCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9zYl9ibG9jayh2b2lkICoqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIAlzYl9ibG9jazsKKwljaGFyIAkJKm9wdGlvbnMgPSAoY2hhciAqKSAqZGF0YTsKKworCWlmICghb3B0aW9ucyB8fCBzdHJuY21wKG9wdGlvbnMsICJzYj0iLCAzKSAhPSAwKQorCQlyZXR1cm4gMTsJLyogRGVmYXVsdCBsb2NhdGlvbiAqLworCW9wdGlvbnMgKz0gMzsKKwlzYl9ibG9jayA9IHNpbXBsZV9zdHJ0b3VsKG9wdGlvbnMsICZvcHRpb25zLCAwKTsKKwlpZiAoKm9wdGlvbnMgJiYgKm9wdGlvbnMgIT0gJywnKSB7CisJCXByaW50aygiRVhUMi1mczogSW52YWxpZCBzYiBzcGVjaWZpY2F0aW9uOiAlc1xuIiwKKwkJICAgICAgIChjaGFyICopICpkYXRhKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICgqb3B0aW9ucyA9PSAnLCcpCisJCW9wdGlvbnMrKzsKKwkqZGF0YSA9ICh2b2lkICopIG9wdGlvbnM7CisJcmV0dXJuIHNiX2Jsb2NrOworfQorCitlbnVtIHsKKwlPcHRfYnNkX2RmLCBPcHRfbWluaXhfZGYsIE9wdF9ncnBpZCwgT3B0X25vZ3JwaWQsCisJT3B0X3Jlc2dpZCwgT3B0X3Jlc3VpZCwgT3B0X3NiLCBPcHRfZXJyX2NvbnQsIE9wdF9lcnJfcGFuaWMsIE9wdF9lcnJfcm8sCisJT3B0X25vdWlkMzIsIE9wdF9jaGVjaywgT3B0X25vY2hlY2ssIE9wdF9kZWJ1ZywgT3B0X29sZGFsbG9jLCBPcHRfb3Jsb3YsIE9wdF9ub2JoLAorCU9wdF91c2VyX3hhdHRyLCBPcHRfbm91c2VyX3hhdHRyLCBPcHRfYWNsLCBPcHRfbm9hY2wsCisJT3B0X2lnbm9yZSwgT3B0X2VyciwKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7T3B0X2JzZF9kZiwgImJzZGRmIn0sCisJe09wdF9taW5peF9kZiwgIm1pbml4ZGYifSwKKwl7T3B0X2dycGlkLCAiZ3JwaWQifSwKKwl7T3B0X2dycGlkLCAiYnNkZ3JvdXBzIn0sCisJe09wdF9ub2dycGlkLCAibm9ncnBpZCJ9LAorCXtPcHRfbm9ncnBpZCwgInN5c3Zncm91cHMifSwKKwl7T3B0X3Jlc2dpZCwgInJlc2dpZD0ldSJ9LAorCXtPcHRfcmVzdWlkLCAicmVzdWlkPSV1In0sCisJe09wdF9zYiwgInNiPSV1In0sCisJe09wdF9lcnJfY29udCwgImVycm9ycz1jb250aW51ZSJ9LAorCXtPcHRfZXJyX3BhbmljLCAiZXJyb3JzPXBhbmljIn0sCisJe09wdF9lcnJfcm8sICJlcnJvcnM9cmVtb3VudC1ybyJ9LAorCXtPcHRfbm91aWQzMiwgIm5vdWlkMzIifSwKKwl7T3B0X25vY2hlY2ssICJjaGVjaz1ub25lIn0sCisJe09wdF9ub2NoZWNrLCAibm9jaGVjayJ9LAorCXtPcHRfY2hlY2ssICJjaGVjayJ9LAorCXtPcHRfZGVidWcsICJkZWJ1ZyJ9LAorCXtPcHRfb2xkYWxsb2MsICJvbGRhbGxvYyJ9LAorCXtPcHRfb3Jsb3YsICJvcmxvdiJ9LAorCXtPcHRfbm9iaCwgIm5vYmgifSwKKwl7T3B0X3VzZXJfeGF0dHIsICJ1c2VyX3hhdHRyIn0sCisJe09wdF9ub3VzZXJfeGF0dHIsICJub3VzZXJfeGF0dHIifSwKKwl7T3B0X2FjbCwgImFjbCJ9LAorCXtPcHRfbm9hY2wsICJub2FjbCJ9LAorCXtPcHRfaWdub3JlLCAiZ3JwcXVvdGEifSwKKwl7T3B0X2lnbm9yZSwgIm5vcXVvdGEifSwKKwl7T3B0X2lnbm9yZSwgInF1b3RhIn0sCisJe09wdF9pZ25vcmUsICJ1c3JxdW90YSJ9LAorCXtPcHRfZXJyLCBOVUxMfQorfTsKKworc3RhdGljIGludCBwYXJzZV9vcHRpb25zIChjaGFyICogb3B0aW9ucywKKwkJCSAgc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpKQoreworCWNoYXIgKiBwOworCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKKwl1bnNpZ25lZCBsb25nIGtpbmQgPSBFWFQyX01PVU5UX0VSUk9SU19DT05UOworCWludCBvcHRpb247CisKKwlpZiAoIW9wdGlvbnMpCisJCXJldHVybiAxOworCisJd2hpbGUgKChwID0gc3Ryc2VwICgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpbnQgdG9rZW47CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJY2FzZSBPcHRfYnNkX2RmOgorCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBNSU5JWF9ERik7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbWluaXhfZGY6CisJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBNSU5JWF9ERik7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZ3JwaWQ6CisJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBHUlBJRCk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9ncnBpZDoKKwkJCWNsZWFyX29wdCAoc2JpLT5zX21vdW50X29wdCwgR1JQSUQpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3Jlc3VpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJc2JpLT5zX3Jlc3VpZCA9IG9wdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9yZXNnaWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXNiaS0+c19yZXNnaWQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfc2I6CisJCQkvKiBoYW5kbGVkIGJ5IGdldF9zYl9ibG9jaygpIGluc3RlYWQgb2YgaGVyZSAqLworCQkJLyogKnNiX2Jsb2NrID0gbWF0Y2hfaW50KCZhcmdzWzBdKTsgKi8KKwkJCWJyZWFrOworCQljYXNlIE9wdF9lcnJfcGFuaWM6CisJCQlraW5kID0gRVhUMl9NT1VOVF9FUlJPUlNfUEFOSUM7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZXJyX3JvOgorCQkJa2luZCA9IEVYVDJfTU9VTlRfRVJST1JTX1JPOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2Vycl9jb250OgorCQkJa2luZCA9IEVYVDJfTU9VTlRfRVJST1JTX0NPTlQ7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm91aWQzMjoKKwkJCXNldF9vcHQgKHNiaS0+c19tb3VudF9vcHQsIE5PX1VJRDMyKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9jaGVjazoKKyNpZmRlZiBDT05GSUdfRVhUMl9DSEVDSworCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgQ0hFQ0spOworI2Vsc2UKKwkJCXByaW50aygiRVhUMiBDaGVjayBvcHRpb24gbm90IHN1cHBvcnRlZFxuIik7CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub2NoZWNrOgorCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBDSEVDSyk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZGVidWc6CisJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBERUJVRyk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfb2xkYWxsb2M6CisJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBPTERBTExPQyk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfb3Jsb3Y6CisJCQljbGVhcl9vcHQgKHNiaS0+c19tb3VudF9vcHQsIE9MREFMTE9DKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub2JoOgorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgTk9CSCk7CisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfRVhUMl9GU19YQVRUUgorCQljYXNlIE9wdF91c2VyX3hhdHRyOgorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgWEFUVFJfVVNFUik7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm91c2VyX3hhdHRyOgorCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBYQVRUUl9VU0VSKTsKKwkJCWJyZWFrOworI2Vsc2UKKwkJY2FzZSBPcHRfdXNlcl94YXR0cjoKKwkJY2FzZSBPcHRfbm91c2VyX3hhdHRyOgorCQkJcHJpbnRrKCJFWFQyIChubyl1c2VyX3hhdHRyIG9wdGlvbnMgbm90IHN1cHBvcnRlZFxuIik7CisJCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTAorCQljYXNlIE9wdF9hY2w6CisJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFBPU0lYX0FDTCk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9hY2w6CisJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgUE9TSVhfQUNMKTsKKwkJCWJyZWFrOworI2Vsc2UKKwkJY2FzZSBPcHRfYWNsOgorCQljYXNlIE9wdF9ub2FjbDoKKwkJCXByaW50aygiRVhUMiAobm8pYWNsIG9wdGlvbnMgbm90IHN1cHBvcnRlZFxuIik7CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlIE9wdF9pZ25vcmU6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJfQorCXNiaS0+c19tb3VudF9vcHQgfD0ga2luZDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBleHQyX3NldHVwX3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCSAgICAgIHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICogZXMsCisJCQkgICAgICBpbnQgcmVhZF9vbmx5KQoreworCWludCByZXMgPSAwOworCXN0cnVjdCBleHQyX3NiX2luZm8gKnNiaSA9IEVYVDJfU0Ioc2IpOworCisJaWYgKGxlMzJfdG9fY3B1KGVzLT5zX3Jldl9sZXZlbCkgPiBFWFQyX01BWF9TVVBQX1JFVikgeworCQlwcmludGsgKCJFWFQyLWZzIHdhcm5pbmc6IHJldmlzaW9uIGxldmVsIHRvbyBoaWdoLCAiCisJCQkiZm9yY2luZyByZWFkLW9ubHkgbW9kZVxuIik7CisJCXJlcyA9IE1TX1JET05MWTsKKwl9CisJaWYgKHJlYWRfb25seSkKKwkJcmV0dXJuIHJlczsKKwlpZiAoIShzYmktPnNfbW91bnRfc3RhdGUgJiBFWFQyX1ZBTElEX0ZTKSkKKwkJcHJpbnRrICgiRVhUMi1mcyB3YXJuaW5nOiBtb3VudGluZyB1bmNoZWNrZWQgZnMsICIKKwkJCSJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZFxuIik7CisJZWxzZSBpZiAoKHNiaS0+c19tb3VudF9zdGF0ZSAmIEVYVDJfRVJST1JfRlMpKQorCQlwcmludGsgKCJFWFQyLWZzIHdhcm5pbmc6IG1vdW50aW5nIGZzIHdpdGggZXJyb3JzLCAiCisJCQkicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOworCWVsc2UgaWYgKChfX3MxNikgbGUxNl90b19jcHUoZXMtPnNfbWF4X21udF9jb3VudCkgPj0gMCAmJgorCQkgbGUxNl90b19jcHUoZXMtPnNfbW50X2NvdW50KSA+PQorCQkgKHVuc2lnbmVkIHNob3J0KSAoX19zMTYpIGxlMTZfdG9fY3B1KGVzLT5zX21heF9tbnRfY291bnQpKQorCQlwcmludGsgKCJFWFQyLWZzIHdhcm5pbmc6IG1heGltYWwgbW91bnQgY291bnQgcmVhY2hlZCwgIgorCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwllbHNlIGlmIChsZTMyX3RvX2NwdShlcy0+c19jaGVja2ludGVydmFsKSAmJgorCQkobGUzMl90b19jcHUoZXMtPnNfbGFzdGNoZWNrKSArIGxlMzJfdG9fY3B1KGVzLT5zX2NoZWNraW50ZXJ2YWwpIDw9IGdldF9zZWNvbmRzKCkpKQorCQlwcmludGsgKCJFWFQyLWZzIHdhcm5pbmc6IGNoZWNrdGltZSByZWFjaGVkLCAiCisJCQkicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOworCWlmICghbGUxNl90b19jcHUoZXMtPnNfbWF4X21udF9jb3VudCkpCisJCWVzLT5zX21heF9tbnRfY291bnQgPSBjcHVfdG9fbGUxNihFWFQyX0RGTF9NQVhfTU5UX0NPVU5UKTsKKwllcy0+c19tbnRfY291bnQ9Y3B1X3RvX2xlMTYobGUxNl90b19jcHUoZXMtPnNfbW50X2NvdW50KSArIDEpOworCWV4dDJfd3JpdGVfc3VwZXIoc2IpOworCWlmICh0ZXN0X29wdCAoc2IsIERFQlVHKSkKKwkJcHJpbnRrICgiW0VYVCBJSSBGUyAlcywgJXMsIGJzPSVsdSwgZnM9JWx1LCBnYz0lbHUsICIKKwkJCSJicGc9JWx1LCBpcGc9JWx1LCBtbz0lMDRseF1cbiIsCisJCQlFWFQyRlNfVkVSU0lPTiwgRVhUMkZTX0RBVEUsIHNiLT5zX2Jsb2Nrc2l6ZSwKKwkJCXNiaS0+c19mcmFnX3NpemUsCisJCQlzYmktPnNfZ3JvdXBzX2NvdW50LAorCQkJRVhUMl9CTE9DS1NfUEVSX0dST1VQKHNiKSwKKwkJCUVYVDJfSU5PREVTX1BFUl9HUk9VUChzYiksCisJCQlzYmktPnNfbW91bnRfb3B0KTsKKyNpZmRlZiBDT05GSUdfRVhUMl9DSEVDSworCWlmICh0ZXN0X29wdCAoc2IsIENIRUNLKSkgeworCQlleHQyX2NoZWNrX2Jsb2Nrc19iaXRtYXAgKHNiKTsKKwkJZXh0Ml9jaGVja19pbm9kZXNfYml0bWFwIChzYik7CisJfQorI2VuZGlmCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBleHQyX2NoZWNrX2Rlc2NyaXB0b3JzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKK3sKKwlpbnQgaTsKKwlpbnQgZGVzY19ibG9jayA9IDA7CisJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQihzYik7CisJdW5zaWduZWQgbG9uZyBibG9jayA9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKKwlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICogZ2RwID0gTlVMTDsKKworCWV4dDJfZGVidWcgKCJDaGVja2luZyBncm91cCBkZXNjcmlwdG9ycyIpOworCisJZm9yIChpID0gMDsgaSA8IHNiaS0+c19ncm91cHNfY291bnQ7IGkrKykKKwl7CisJCWlmICgoaSAlIEVYVDJfREVTQ19QRVJfQkxPQ0soc2IpKSA9PSAwKQorCQkJZ2RwID0gKHN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKikgc2JpLT5zX2dyb3VwX2Rlc2NbZGVzY19ibG9jaysrXS0+Yl9kYXRhOworCQlpZiAobGUzMl90b19jcHUoZ2RwLT5iZ19ibG9ja19iaXRtYXApIDwgYmxvY2sgfHwKKwkJICAgIGxlMzJfdG9fY3B1KGdkcC0+YmdfYmxvY2tfYml0bWFwKSA+PSBibG9jayArIEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzYikpCisJCXsKKwkJCWV4dDJfZXJyb3IgKHNiLCAiZXh0Ml9jaGVja19kZXNjcmlwdG9ycyIsCisJCQkJICAgICJCbG9jayBiaXRtYXAgZm9yIGdyb3VwICVkIgorCQkJCSAgICAiIG5vdCBpbiBncm91cCAoYmxvY2sgJWx1KSEiLAorCQkJCSAgICBpLCAodW5zaWduZWQgbG9uZykgbGUzMl90b19jcHUoZ2RwLT5iZ19ibG9ja19iaXRtYXApKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX2JpdG1hcCkgPCBibG9jayB8fAorCQkgICAgbGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV9iaXRtYXApID49IGJsb2NrICsgRVhUMl9CTE9DS1NfUEVSX0dST1VQKHNiKSkKKwkJeworCQkJZXh0Ml9lcnJvciAoc2IsICJleHQyX2NoZWNrX2Rlc2NyaXB0b3JzIiwKKwkJCQkgICAgIklub2RlIGJpdG1hcCBmb3IgZ3JvdXAgJWQiCisJCQkJICAgICIgbm90IGluIGdyb3VwIChibG9jayAlbHUpISIsCisJCQkJICAgIGksICh1bnNpZ25lZCBsb25nKSBsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX2JpdG1hcCkpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpIDwgYmxvY2sgfHwKKwkJICAgIGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXAgPj0KKwkJICAgIGJsb2NrICsgRVhUMl9CTE9DS1NfUEVSX0dST1VQKHNiKSkKKwkJeworCQkJZXh0Ml9lcnJvciAoc2IsICJleHQyX2NoZWNrX2Rlc2NyaXB0b3JzIiwKKwkJCQkgICAgIklub2RlIHRhYmxlIGZvciBncm91cCAlZCIKKwkJCQkgICAgIiBub3QgaW4gZ3JvdXAgKGJsb2NrICVsdSkhIiwKKwkJCQkgICAgaSwgKHVuc2lnbmVkIGxvbmcpIGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJsb2NrICs9IEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJCWdkcCsrOworCX0KKwlyZXR1cm4gMTsKK30KKworI2RlZmluZSBsb2cyKG4pIGZmeih+KG4pKQorIAorLyoKKyAqIE1heGltYWwgZmlsZSBzaXplLiAgVGhlcmUgaXMgYSBkaXJlY3QsIGFuZCB7LGRvdWJsZS0sdHJpcGxlLX1pbmRpcmVjdAorICogYmxvY2sgbGltaXQsIGFuZCBhbHNvIGEgbGltaXQgb2YgKDJeMzIgLSAxKSA1MTItYnl0ZSBzZWN0b3JzIGluIGlfYmxvY2tzLgorICogV2UgbmVlZCB0byBiZSAxIGZpbGVzeXN0ZW0gYmxvY2sgbGVzcyB0aGFuIHRoZSAyXjMyIHNlY3RvciBsaW1pdC4KKyAqLworc3RhdGljIGxvZmZfdCBleHQyX21heF9zaXplKGludCBiaXRzKQoreworCWxvZmZfdCByZXMgPSBFWFQyX05ESVJfQkxPQ0tTOworCS8qIFRoaXMgY29uc3RhbnQgaXMgY2FsY3VsYXRlZCB0byBiZSB0aGUgbGFyZ2VzdCBmaWxlIHNpemUgZm9yIGEKKwkgKiBkZW5zZSwgNGstYmxvY2tzaXplIGZpbGUgc3VjaCB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YKKwkgKiBzZWN0b3JzIGluIHRoZSBmaWxlLCBpbmNsdWRpbmcgZGF0YSBhbmQgYWxsIGluZGlyZWN0IGJsb2NrcywKKwkgKiBkb2VzIG5vdCBleGNlZWQgMl4zMi4gKi8KKwljb25zdCBsb2ZmX3QgdXBwZXJfbGltaXQgPSAweDFmZjdmZmZkMDAwTEw7CisKKwlyZXMgKz0gMUxMIDw8IChiaXRzLTIpOworCXJlcyArPSAxTEwgPDwgKDIqKGJpdHMtMikpOworCXJlcyArPSAxTEwgPDwgKDMqKGJpdHMtMikpOworCXJlcyA8PD0gYml0czsKKwlpZiAocmVzID4gdXBwZXJfbGltaXQpCisJCXJlcyA9IHVwcGVyX2xpbWl0OworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRlc2NyaXB0b3JfbG9jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgbG9naWNfc2JfYmxvY2ssCisJCQkJICAgIGludCBucikKK3sKKwlzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmkgPSBFWFQyX1NCKHNiKTsKKwl1bnNpZ25lZCBsb25nIGJnLCBmaXJzdF9kYXRhX2Jsb2NrLCBmaXJzdF9tZXRhX2JnOworCWludCBoYXNfc3VwZXIgPSAwOworCQorCWZpcnN0X2RhdGFfYmxvY2sgPSBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisJZmlyc3RfbWV0YV9iZyA9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19maXJzdF9tZXRhX2JnKTsKKworCWlmICghRVhUMl9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcpIHx8CisJICAgIG5yIDwgZmlyc3RfbWV0YV9iZykKKwkJcmV0dXJuIChsb2dpY19zYl9ibG9jayArIG5yICsgMSk7CisJYmcgPSBzYmktPnNfZGVzY19wZXJfYmxvY2sgKiBucjsKKwlpZiAoZXh0Ml9iZ19oYXNfc3VwZXIoc2IsIGJnKSkKKwkJaGFzX3N1cGVyID0gMTsKKwlyZXR1cm4gKGZpcnN0X2RhdGFfYmxvY2sgKyBoYXNfc3VwZXIgKyAoYmcgKiBzYmktPnNfYmxvY2tzX3Blcl9ncm91cCkpOworfQorCitzdGF0aWMgaW50IGV4dDJfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBleHQyX3NiX2luZm8gKiBzYmk7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKiBlczsKKwlzdHJ1Y3QgaW5vZGUgKnJvb3Q7CisJdW5zaWduZWQgbG9uZyBibG9jazsKKwl1bnNpZ25lZCBsb25nIHNiX2Jsb2NrID0gZ2V0X3NiX2Jsb2NrKCZkYXRhKTsKKwl1bnNpZ25lZCBsb25nIGxvZ2ljX3NiX2Jsb2NrOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGRlZl9tb3VudF9vcHRzOworCWludCBibG9ja3NpemUgPSBCTE9DS19TSVpFOworCWludCBkYl9jb3VudDsKKwlpbnQgaSwgajsKKwlfX2xlMzIgZmVhdHVyZXM7CisKKwlzYmkgPSBrbWFsbG9jKHNpemVvZigqc2JpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmkpCisJCXJldHVybiAtRU5PTUVNOworCXNiLT5zX2ZzX2luZm8gPSBzYmk7CisJbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKCpzYmkpKTsKKworCS8qCisJICogU2VlIHdoYXQgdGhlIGN1cnJlbnQgYmxvY2tzaXplIGZvciB0aGUgZGV2aWNlIGlzLCBhbmQKKwkgKiB1c2UgdGhhdCBhcyB0aGUgYmxvY2tzaXplLiAgT3RoZXJ3aXNlIChvciBpZiB0aGUgYmxvY2tzaXplCisJICogaXMgc21hbGxlciB0aGFuIHRoZSBkZWZhdWx0KSB1c2UgdGhlIGRlZmF1bHQuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGRldmljZXMgdGhhdCBoYXZlIGEgaGFyZHdhcmUKKwkgKiBzZWN0b3JzaXplIHRoYXQgaXMgbGFyZ2VyIHRoYW4gdGhlIGRlZmF1bHQuCisJICovCisJYmxvY2tzaXplID0gc2JfbWluX2Jsb2Nrc2l6ZShzYiwgQkxPQ0tfU0laRSk7CisJaWYgKCFibG9ja3NpemUpIHsKKwkJcHJpbnRrICgiRVhUMi1mczogdW5hYmxlIHRvIHNldCBibG9ja3NpemVcbiIpOworCQlnb3RvIGZhaWxlZF9zYmk7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgc3VwZXJibG9jayBkb2Vzbid0IHN0YXJ0IG9uIGEgaGFyZHdhcmUgc2VjdG9yIGJvdW5kYXJ5LAorCSAqIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0LiAgCisJICovCisJaWYgKGJsb2Nrc2l6ZSAhPSBCTE9DS19TSVpFKSB7CisJCWxvZ2ljX3NiX2Jsb2NrID0gKHNiX2Jsb2NrKkJMT0NLX1NJWkUpIC8gYmxvY2tzaXplOworCQlvZmZzZXQgPSAoc2JfYmxvY2sqQkxPQ0tfU0laRSkgJSBibG9ja3NpemU7CisJfSBlbHNlIHsKKwkJbG9naWNfc2JfYmxvY2sgPSBzYl9ibG9jazsKKwl9CisKKwlpZiAoIShiaCA9IHNiX2JyZWFkKHNiLCBsb2dpY19zYl9ibG9jaykpKSB7CisJCXByaW50ayAoIkVYVDItZnM6IHVuYWJsZSB0byByZWFkIHN1cGVyYmxvY2tcbiIpOworCQlnb3RvIGZhaWxlZF9zYmk7CisJfQorCS8qCisJICogTm90ZTogc19lcyBtdXN0IGJlIGluaXRpYWxpemVkIGFzIHNvb24gYXMgcG9zc2libGUgYmVjYXVzZQorCSAqICAgICAgIHNvbWUgZXh0MiBtYWNyby1pbnN0cnVjdGlvbnMgZGVwZW5kIG9uIGl0cyB2YWx1ZQorCSAqLworCWVzID0gKHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICopICgoKGNoYXIgKiliaC0+Yl9kYXRhKSArIG9mZnNldCk7CisJc2JpLT5zX2VzID0gZXM7CisJc2ItPnNfbWFnaWMgPSBsZTE2X3RvX2NwdShlcy0+c19tYWdpYyk7CisKKwlpZiAoc2ItPnNfbWFnaWMgIT0gRVhUMl9TVVBFUl9NQUdJQykKKwkJZ290byBjYW50ZmluZF9leHQyOworCisJLyogU2V0IGRlZmF1bHRzIGJlZm9yZSB3ZSBwYXJzZSB0aGUgbW91bnQgb3B0aW9ucyAqLworCWRlZl9tb3VudF9vcHRzID0gbGUzMl90b19jcHUoZXMtPnNfZGVmYXVsdF9tb3VudF9vcHRzKTsKKwlpZiAoZGVmX21vdW50X29wdHMgJiBFWFQyX0RFRk1fREVCVUcpCisJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgREVCVUcpOworCWlmIChkZWZfbW91bnRfb3B0cyAmIEVYVDJfREVGTV9CU0RHUk9VUFMpCisJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgR1JQSUQpOworCWlmIChkZWZfbW91bnRfb3B0cyAmIEVYVDJfREVGTV9VSUQxNikKKwkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBOT19VSUQzMik7CisJaWYgKGRlZl9tb3VudF9vcHRzICYgRVhUMl9ERUZNX1hBVFRSX1VTRVIpCisJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgWEFUVFJfVVNFUik7CisJaWYgKGRlZl9tb3VudF9vcHRzICYgRVhUMl9ERUZNX0FDTCkKKwkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBQT1NJWF9BQ0wpOworCQorCWlmIChsZTE2X3RvX2NwdShzYmktPnNfZXMtPnNfZXJyb3JzKSA9PSBFWFQyX0VSUk9SU19QQU5JQykKKwkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUEFOSUMpOworCWVsc2UgaWYgKGxlMTZfdG9fY3B1KHNiaS0+c19lcy0+c19lcnJvcnMpID09IEVYVDJfRVJST1JTX1JPKQorCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19STyk7CisKKwlzYmktPnNfcmVzdWlkID0gbGUxNl90b19jcHUoZXMtPnNfZGVmX3Jlc3VpZCk7CisJc2JpLT5zX3Jlc2dpZCA9IGxlMTZfdG9fY3B1KGVzLT5zX2RlZl9yZXNnaWQpOworCQorCWlmICghcGFyc2Vfb3B0aW9ucyAoKGNoYXIgKikgZGF0YSwgc2JpKSkKKwkJZ290byBmYWlsZWRfbW91bnQ7CisKKwlzYi0+c19mbGFncyA9IChzYi0+c19mbGFncyAmIH5NU19QT1NJWEFDTCkgfAorCQkoKEVYVDJfU0Ioc2IpLT5zX21vdW50X29wdCAmIEVYVDJfTU9VTlRfUE9TSVhfQUNMKSA/CisJCSBNU19QT1NJWEFDTCA6IDApOworCisJaWYgKGxlMzJfdG9fY3B1KGVzLT5zX3Jldl9sZXZlbCkgPT0gRVhUMl9HT09EX09MRF9SRVYgJiYKKwkgICAgKEVYVDJfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCB+MFUpIHx8CisJICAgICBFWFQyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgfjBVKSB8fAorCSAgICAgRVhUMl9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgfjBVKSkpCisJCXByaW50aygiRVhUMi1mcyB3YXJuaW5nOiBmZWF0dXJlIGZsYWdzIHNldCBvbiByZXYgMCBmcywgIgorCQkgICAgICAgInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwkvKgorCSAqIENoZWNrIGZlYXR1cmUgZmxhZ3MgcmVnYXJkbGVzcyBvZiB0aGUgcmV2aXNpb24gbGV2ZWwsIHNpbmNlIHdlCisJICogcHJldmlvdXNseSBkaWRuJ3QgY2hhbmdlIHRoZSByZXZpc2lvbiBsZXZlbCB3aGVuIHNldHRpbmcgdGhlIGZsYWdzLAorCSAqIHNvIHRoZXJlIGlzIGEgY2hhbmNlIGluY29tcGF0IGZsYWdzIGFyZSBzZXQgb24gYSByZXYgMCBmaWxlc3lzdGVtLgorCSAqLworCWZlYXR1cmVzID0gRVhUMl9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgfkVYVDJfRkVBVFVSRV9JTkNPTVBBVF9TVVBQKTsKKwlpZiAoZmVhdHVyZXMpIHsKKwkJcHJpbnRrKCJFWFQyLWZzOiAlczogY291bGRuJ3QgbW91bnQgYmVjYXVzZSBvZiAiCisJCSAgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsCisJCSAgICAgICBzYi0+c19pZCwgbGUzMl90b19jcHUoZmVhdHVyZXMpKTsKKwkJZ290byBmYWlsZWRfbW91bnQ7CisJfQorCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJgorCSAgICAoZmVhdHVyZXMgPSBFWFQyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgfkVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1VQUCkpKXsKKwkJcHJpbnRrKCJFWFQyLWZzOiAlczogY291bGRuJ3QgbW91bnQgUkRXUiBiZWNhdXNlIG9mICIKKwkJICAgICAgICJ1bnN1cHBvcnRlZCBvcHRpb25hbCBmZWF0dXJlcyAoJXgpLlxuIiwKKwkJICAgICAgIHNiLT5zX2lkLCBsZTMyX3RvX2NwdShmZWF0dXJlcykpOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisKKwlibG9ja3NpemUgPSBCTE9DS19TSVpFIDw8IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19sb2dfYmxvY2tfc2l6ZSk7CisKKwkvKiBJZiB0aGUgYmxvY2tzaXplIGRvZXNuJ3QgbWF0Y2gsIHJlLXJlYWQgdGhlIHRoaW5nLi4gKi8KKwlpZiAoc2ItPnNfYmxvY2tzaXplICE9IGJsb2Nrc2l6ZSkgeworCQlicmVsc2UoYmgpOworCisJCWlmICghc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgYmxvY2tzaXplKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQyLWZzOiBibG9ja3NpemUgdG9vIHNtYWxsIGZvciBkZXZpY2UuXG4iKTsKKwkJCWdvdG8gZmFpbGVkX3NiaTsKKwkJfQorCisJCWxvZ2ljX3NiX2Jsb2NrID0gKHNiX2Jsb2NrKkJMT0NLX1NJWkUpIC8gYmxvY2tzaXplOworCQlvZmZzZXQgPSAoc2JfYmxvY2sqQkxPQ0tfU0laRSkgJSBibG9ja3NpemU7CisJCWJoID0gc2JfYnJlYWQoc2IsIGxvZ2ljX3NiX2Jsb2NrKTsKKwkJaWYoIWJoKSB7CisJCQlwcmludGsoIkVYVDItZnM6IENvdWxkbid0IHJlYWQgc3VwZXJibG9jayBvbiAiCisJCQkgICAgICAgIjJuZCB0cnkuXG4iKTsKKwkJCWdvdG8gZmFpbGVkX3NiaTsKKwkJfQorCQllcyA9IChzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqKSAoKChjaGFyICopYmgtPmJfZGF0YSkgKyBvZmZzZXQpOworCQlzYmktPnNfZXMgPSBlczsKKwkJaWYgKGVzLT5zX21hZ2ljICE9IGNwdV90b19sZTE2KEVYVDJfU1VQRVJfTUFHSUMpKSB7CisJCQlwcmludGsgKCJFWFQyLWZzOiBNYWdpYyBtaXNtYXRjaCwgdmVyeSB3ZWlyZCAhXG4iKTsKKwkJCWdvdG8gZmFpbGVkX21vdW50OworCQl9CisJfQorCisJc2ItPnNfbWF4Ynl0ZXMgPSBleHQyX21heF9zaXplKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKworCWlmIChsZTMyX3RvX2NwdShlcy0+c19yZXZfbGV2ZWwpID09IEVYVDJfR09PRF9PTERfUkVWKSB7CisJCXNiaS0+c19pbm9kZV9zaXplID0gRVhUMl9HT09EX09MRF9JTk9ERV9TSVpFOworCQlzYmktPnNfZmlyc3RfaW5vID0gRVhUMl9HT09EX09MRF9GSVJTVF9JTk87CisJfSBlbHNlIHsKKwkJc2JpLT5zX2lub2RlX3NpemUgPSBsZTE2X3RvX2NwdShlcy0+c19pbm9kZV9zaXplKTsKKwkJc2JpLT5zX2ZpcnN0X2lubyA9IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2lubyk7CisJCWlmICgoc2JpLT5zX2lub2RlX3NpemUgPCBFWFQyX0dPT0RfT0xEX0lOT0RFX1NJWkUpIHx8CisJCSAgICAoc2JpLT5zX2lub2RlX3NpemUgJiAoc2JpLT5zX2lub2RlX3NpemUgLSAxKSkgfHwKKwkJICAgIChzYmktPnNfaW5vZGVfc2l6ZSA+IGJsb2Nrc2l6ZSkpIHsKKwkJCXByaW50ayAoIkVYVDItZnM6IHVuc3VwcG9ydGVkIGlub2RlIHNpemU6ICVkXG4iLAorCQkJCXNiaS0+c19pbm9kZV9zaXplKTsKKwkJCWdvdG8gZmFpbGVkX21vdW50OworCQl9CisJfQorCisJc2JpLT5zX2ZyYWdfc2l6ZSA9IEVYVDJfTUlOX0ZSQUdfU0laRSA8PAorCQkJCSAgIGxlMzJfdG9fY3B1KGVzLT5zX2xvZ19mcmFnX3NpemUpOworCWlmIChzYmktPnNfZnJhZ19zaXplID09IDApCisJCWdvdG8gY2FudGZpbmRfZXh0MjsKKwlzYmktPnNfZnJhZ3NfcGVyX2Jsb2NrID0gc2ItPnNfYmxvY2tzaXplIC8gc2JpLT5zX2ZyYWdfc2l6ZTsKKworCXNiaS0+c19ibG9ja3NfcGVyX2dyb3VwID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX3Blcl9ncm91cCk7CisJc2JpLT5zX2ZyYWdzX3Blcl9ncm91cCA9IGxlMzJfdG9fY3B1KGVzLT5zX2ZyYWdzX3Blcl9ncm91cCk7CisJc2JpLT5zX2lub2Rlc19wZXJfZ3JvdXAgPSBsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfcGVyX2dyb3VwKTsKKworCWlmIChFWFQyX0lOT0RFX1NJWkUoc2IpID09IDApCisJCWdvdG8gY2FudGZpbmRfZXh0MjsKKwlzYmktPnNfaW5vZGVzX3Blcl9ibG9jayA9IHNiLT5zX2Jsb2Nrc2l6ZSAvIEVYVDJfSU5PREVfU0laRShzYik7CisJaWYgKHNiaS0+c19pbm9kZXNfcGVyX2Jsb2NrID09IDApCisJCWdvdG8gY2FudGZpbmRfZXh0MjsKKwlzYmktPnNfaXRiX3Blcl9ncm91cCA9IHNiaS0+c19pbm9kZXNfcGVyX2dyb3VwIC8KKwkJCQkJc2JpLT5zX2lub2Rlc19wZXJfYmxvY2s7CisJc2JpLT5zX2Rlc2NfcGVyX2Jsb2NrID0gc2ItPnNfYmxvY2tzaXplIC8KKwkJCQkJc2l6ZW9mIChzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjKTsKKwlzYmktPnNfc2JoID0gYmg7CisJc2JpLT5zX21vdW50X3N0YXRlID0gbGUxNl90b19jcHUoZXMtPnNfc3RhdGUpOworCXNiaS0+c19hZGRyX3Blcl9ibG9ja19iaXRzID0KKwkJbG9nMiAoRVhUMl9BRERSX1BFUl9CTE9DSyhzYikpOworCXNiaS0+c19kZXNjX3Blcl9ibG9ja19iaXRzID0KKwkJbG9nMiAoRVhUMl9ERVNDX1BFUl9CTE9DSyhzYikpOworCisJaWYgKHNiLT5zX21hZ2ljICE9IEVYVDJfU1VQRVJfTUFHSUMpCisJCWdvdG8gY2FudGZpbmRfZXh0MjsKKworCWlmIChzYi0+c19ibG9ja3NpemUgIT0gYmgtPmJfc2l6ZSkgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50ayAoIlZGUzogVW5zdXBwb3J0ZWQgYmxvY2tzaXplIG9uIGRldiAiCisJCQkJIiVzLlxuIiwgc2ItPnNfaWQpOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisKKwlpZiAoc2ItPnNfYmxvY2tzaXplICE9IHNiaS0+c19mcmFnX3NpemUpIHsKKwkJcHJpbnRrICgiRVhUMi1mczogZnJhZ3NpemUgJWx1ICE9IGJsb2Nrc2l6ZSAlbHUgKG5vdCBzdXBwb3J0ZWQgeWV0KVxuIiwKKwkJCXNiaS0+c19mcmFnX3NpemUsIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJCWdvdG8gZmFpbGVkX21vdW50OworCX0KKworCWlmIChzYmktPnNfYmxvY2tzX3Blcl9ncm91cCA+IHNiLT5zX2Jsb2Nrc2l6ZSAqIDgpIHsKKwkJcHJpbnRrICgiRVhUMi1mczogI2Jsb2NrcyBwZXIgZ3JvdXAgdG9vIGJpZzogJWx1XG4iLAorCQkJc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXApOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisJaWYgKHNiaS0+c19mcmFnc19wZXJfZ3JvdXAgPiBzYi0+c19ibG9ja3NpemUgKiA4KSB7CisJCXByaW50ayAoIkVYVDItZnM6ICNmcmFnbWVudHMgcGVyIGdyb3VwIHRvbyBiaWc6ICVsdVxuIiwKKwkJCXNiaS0+c19mcmFnc19wZXJfZ3JvdXApOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisJaWYgKHNiaS0+c19pbm9kZXNfcGVyX2dyb3VwID4gc2ItPnNfYmxvY2tzaXplICogOCkgeworCQlwcmludGsgKCJFWFQyLWZzOiAjaW5vZGVzIHBlciBncm91cCB0b28gYmlnOiAlbHVcbiIsCisJCQlzYmktPnNfaW5vZGVzX3Blcl9ncm91cCk7CisJCWdvdG8gZmFpbGVkX21vdW50OworCX0KKworCWlmIChFWFQyX0JMT0NLU19QRVJfR1JPVVAoc2IpID09IDApCisJCWdvdG8gY2FudGZpbmRfZXh0MjsKKwlzYmktPnNfZ3JvdXBzX2NvdW50ID0gKGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkgLQorCQkJCSAgICAgICAgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgKworCQkJCSAgICAgICBFWFQyX0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gMSkgLworCQkJCSAgICAgICBFWFQyX0JMT0NLU19QRVJfR1JPVVAoc2IpOworCWRiX2NvdW50ID0gKHNiaS0+c19ncm91cHNfY291bnQgKyBFWFQyX0RFU0NfUEVSX0JMT0NLKHNiKSAtIDEpIC8KKwkJICAgRVhUMl9ERVNDX1BFUl9CTE9DSyhzYik7CisJc2JpLT5zX2dyb3VwX2Rlc2MgPSBrbWFsbG9jIChkYl9jb3VudCAqIHNpemVvZiAoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2JpLT5zX2dyb3VwX2Rlc2MgPT0gTlVMTCkgeworCQlwcmludGsgKCJFWFQyLWZzOiBub3QgZW5vdWdoIG1lbW9yeVxuIik7CisJCWdvdG8gZmFpbGVkX21vdW50OworCX0KKwlwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKKwlwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKKwlwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZGlyc19jb3VudGVyKTsKKwliZ2xfbG9ja19pbml0KCZzYmktPnNfYmxvY2tncm91cF9sb2NrKTsKKwlzYmktPnNfZGVidHMgPSBrbWFsbG9jKHNiaS0+c19ncm91cHNfY291bnQgKiBzaXplb2YoKnNiaS0+c19kZWJ0cyksCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmktPnNfZGVidHMpIHsKKwkJcHJpbnRrICgiRVhUMi1mczogbm90IGVub3VnaCBtZW1vcnlcbiIpOworCQlnb3RvIGZhaWxlZF9tb3VudF9ncm91cF9kZXNjOworCX0KKwltZW1zZXQoc2JpLT5zX2RlYnRzLCAwLCBzYmktPnNfZ3JvdXBzX2NvdW50ICogc2l6ZW9mKCpzYmktPnNfZGVidHMpKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGJfY291bnQ7IGkrKykgeworCQlibG9jayA9IGRlc2NyaXB0b3JfbG9jKHNiLCBsb2dpY19zYl9ibG9jaywgaSk7CisJCXNiaS0+c19ncm91cF9kZXNjW2ldID0gc2JfYnJlYWQoc2IsIGJsb2NrKTsKKwkJaWYgKCFzYmktPnNfZ3JvdXBfZGVzY1tpXSkgeworCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKKwkJCQlicmVsc2UgKHNiaS0+c19ncm91cF9kZXNjW2pdKTsKKwkJCXByaW50ayAoIkVYVDItZnM6IHVuYWJsZSB0byByZWFkIGdyb3VwIGRlc2NyaXB0b3JzXG4iKTsKKwkJCWdvdG8gZmFpbGVkX21vdW50X2dyb3VwX2Rlc2M7CisJCX0KKwl9CisJaWYgKCFleHQyX2NoZWNrX2Rlc2NyaXB0b3JzIChzYikpIHsKKwkJcHJpbnRrICgiRVhUMi1mczogZ3JvdXAgZGVzY3JpcHRvcnMgY29ycnVwdGVkIVxuIik7CisJCWRiX2NvdW50ID0gaTsKKwkJZ290byBmYWlsZWRfbW91bnQyOworCX0KKwlzYmktPnNfZ2RiX2NvdW50ID0gZGJfY291bnQ7CisJZ2V0X3JhbmRvbV9ieXRlcygmc2JpLT5zX25leHRfZ2VuZXJhdGlvbiwgc2l6ZW9mKHUzMikpOworCXNwaW5fbG9ja19pbml0KCZzYmktPnNfbmV4dF9nZW5fbG9jayk7CisJLyoKKwkgKiBzZXQgdXAgZW5vdWdoIHNvIHRoYXQgaXQgY2FuIHJlYWQgYW4gaW5vZGUKKwkgKi8KKwlzYi0+c19vcCA9ICZleHQyX3NvcHM7CisJc2ItPnNfZXhwb3J0X29wID0gJmV4dDJfZXhwb3J0X29wczsKKwlzYi0+c194YXR0ciA9IGV4dDJfeGF0dHJfaGFuZGxlcnM7CisJcm9vdCA9IGlnZXQoc2IsIEVYVDJfUk9PVF9JTk8pOworCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CisJaWYgKCFzYi0+c19yb290KSB7CisJCWlwdXQocm9vdCk7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUMi1mczogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsZWRfbW91bnQyOworCX0KKwlpZiAoIVNfSVNESVIocm9vdC0+aV9tb2RlKSB8fCAhcm9vdC0+aV9ibG9ja3MgfHwgIXJvb3QtPmlfc2l6ZSkgeworCQlkcHV0KHNiLT5zX3Jvb3QpOworCQlzYi0+c19yb290ID0gTlVMTDsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQyLWZzOiBjb3JydXB0IHJvb3QgaW5vZGUsIHJ1biBlMmZzY2tcbiIpOworCQlnb3RvIGZhaWxlZF9tb3VudDI7CisJfQorCWlmIChFWFQyX0hBU19DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpCisJCWV4dDJfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJIm1vdW50aW5nIGV4dDMgZmlsZXN5c3RlbSBhcyBleHQyXG4iKTsKKwlleHQyX3NldHVwX3N1cGVyIChzYiwgZXMsIHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKTsKKwlwZXJjcHVfY291bnRlcl9tb2QoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsCisJCQkJZXh0Ml9jb3VudF9mcmVlX2Jsb2NrcyhzYikpOworCXBlcmNwdV9jb3VudGVyX21vZCgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlciwKKwkJCQlleHQyX2NvdW50X2ZyZWVfaW5vZGVzKHNiKSk7CisJcGVyY3B1X2NvdW50ZXJfbW9kKCZzYmktPnNfZGlyc19jb3VudGVyLAorCQkJCWV4dDJfY291bnRfZGlycyhzYikpOworCXJldHVybiAwOworCitjYW50ZmluZF9leHQyOgorCWlmICghc2lsZW50KQorCQlwcmludGsoIlZGUzogQ2FuJ3QgZmluZCBhbiBleHQyIGZpbGVzeXN0ZW0gb24gZGV2ICVzLlxuIiwKKwkJICAgICAgIHNiLT5zX2lkKTsKKwlnb3RvIGZhaWxlZF9tb3VudDsKKworZmFpbGVkX21vdW50MjoKKwlmb3IgKGkgPSAwOyBpIDwgZGJfY291bnQ7IGkrKykKKwkJYnJlbHNlKHNiaS0+c19ncm91cF9kZXNjW2ldKTsKK2ZhaWxlZF9tb3VudF9ncm91cF9kZXNjOgorCWtmcmVlKHNiaS0+c19ncm91cF9kZXNjKTsKKwlrZnJlZShzYmktPnNfZGVidHMpOworZmFpbGVkX21vdW50OgorCWJyZWxzZShiaCk7CitmYWlsZWRfc2JpOgorCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNiaSk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIGV4dDJfY29tbWl0X3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCSAgICAgICBzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqIGVzKQoreworCWVzLT5zX3d0aW1lID0gY3B1X3RvX2xlMzIoZ2V0X3NlY29uZHMoKSk7CisJbWFya19idWZmZXJfZGlydHkoRVhUMl9TQihzYiktPnNfc2JoKTsKKwlzYi0+c19kaXJ0ID0gMDsKK30KKworc3RhdGljIHZvaWQgZXh0Ml9zeW5jX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICplcykKK3sKKwllcy0+c19mcmVlX2Jsb2Nrc19jb3VudCA9IGNwdV90b19sZTMyKGV4dDJfY291bnRfZnJlZV9ibG9ja3Moc2IpKTsKKwllcy0+c19mcmVlX2lub2Rlc19jb3VudCA9IGNwdV90b19sZTMyKGV4dDJfY291bnRfZnJlZV9pbm9kZXMoc2IpKTsKKwllcy0+c193dGltZSA9IGNwdV90b19sZTMyKGdldF9zZWNvbmRzKCkpOworCW1hcmtfYnVmZmVyX2RpcnR5KEVYVDJfU0Ioc2IpLT5zX3NiaCk7CisJc3luY19kaXJ0eV9idWZmZXIoRVhUMl9TQihzYiktPnNfc2JoKTsKKwlzYi0+c19kaXJ0ID0gMDsKK30KKworLyoKKyAqIEluIHRoZSBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW0sIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8KKyAqIHdyaXRlIHRoZSBzdXBlciBibG9jayBzaW5jZSB3ZSB1c2UgYSBtYXBwaW5nIG9mIHRoZQorICogZGlzayBzdXBlciBibG9jayBpbiBhIGJ1ZmZlci4KKyAqCisgKiBIb3dldmVyLCB0aGlzIGZ1bmN0aW9uIGlzIHN0aWxsIHVzZWQgdG8gc2V0IHRoZSBmcyB2YWxpZAorICogZmxhZ3MgdG8gMC4gIFdlIG5lZWQgdG8gc2V0IHRoaXMgZmxhZyB0byAwIHNpbmNlIHRoZSBmcworICogbWF5IGhhdmUgYmVlbiBjaGVja2VkIHdoaWxlIG1vdW50ZWQgYW5kIGUyZnNjayBtYXkgaGF2ZQorICogc2V0IHNfc3RhdGUgdG8gRVhUMl9WQUxJRF9GUyBhZnRlciBzb21lIGNvcnJlY3Rpb25zLgorICovCisKK3ZvaWQgZXh0Ml93cml0ZV9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKiBlczsKKwlsb2NrX2tlcm5lbCgpOworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQllcyA9IEVYVDJfU0Ioc2IpLT5zX2VzOworCisJCWlmIChsZTE2X3RvX2NwdShlcy0+c19zdGF0ZSkgJiBFWFQyX1ZBTElEX0ZTKSB7CisJCQlleHQyX2RlYnVnICgic2V0dGluZyB2YWxpZCB0byAwXG4iKTsKKwkJCWVzLT5zX3N0YXRlID0gY3B1X3RvX2xlMTYobGUxNl90b19jcHUoZXMtPnNfc3RhdGUpICYKKwkJCQkJCSAgfkVYVDJfVkFMSURfRlMpOworCQkJZXMtPnNfZnJlZV9ibG9ja3NfY291bnQgPSBjcHVfdG9fbGUzMihleHQyX2NvdW50X2ZyZWVfYmxvY2tzKHNiKSk7CisJCQllcy0+c19mcmVlX2lub2Rlc19jb3VudCA9IGNwdV90b19sZTMyKGV4dDJfY291bnRfZnJlZV9pbm9kZXMoc2IpKTsKKwkJCWVzLT5zX210aW1lID0gY3B1X3RvX2xlMzIoZ2V0X3NlY29uZHMoKSk7CisJCQlleHQyX3N5bmNfc3VwZXIoc2IsIGVzKTsKKwkJfSBlbHNlCisJCQlleHQyX2NvbW1pdF9zdXBlciAoc2IsIGVzKTsKKwl9CisJc2ItPnNfZGlydCA9IDA7CisJdW5sb2NrX2tlcm5lbCgpOworfQorCitzdGF0aWMgaW50IGV4dDJfcmVtb3VudCAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGludCAqIGZsYWdzLCBjaGFyICogZGF0YSkKK3sKKwlzdHJ1Y3QgZXh0Ml9zYl9pbmZvICogc2JpID0gRVhUMl9TQihzYik7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKiBlczsKKworCS8qCisJICogQWxsb3cgdGhlICJjaGVjayIgb3B0aW9uIHRvIGJlIHBhc3NlZCBhcyBhIHJlbW91bnQgb3B0aW9uLgorCSAqLworCWlmICghcGFyc2Vfb3B0aW9ucyAoZGF0YSwgc2JpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzYi0+c19mbGFncyA9IChzYi0+c19mbGFncyAmIH5NU19QT1NJWEFDTCkgfAorCQkoKHNiaS0+c19tb3VudF9vcHQgJiBFWFQyX01PVU5UX1BPU0lYX0FDTCkgPyBNU19QT1NJWEFDTCA6IDApOworCisJZXMgPSBzYmktPnNfZXM7CisJaWYgKCgqZmxhZ3MgJiBNU19SRE9OTFkpID09IChzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCisJCXJldHVybiAwOworCWlmICgqZmxhZ3MgJiBNU19SRE9OTFkpIHsKKwkJaWYgKGxlMTZfdG9fY3B1KGVzLT5zX3N0YXRlKSAmIEVYVDJfVkFMSURfRlMgfHwKKwkJICAgICEoc2JpLT5zX21vdW50X3N0YXRlICYgRVhUMl9WQUxJRF9GUykpCisJCQlyZXR1cm4gMDsKKwkJLyoKKwkJICogT0ssIHdlIGFyZSByZW1vdW50aW5nIGEgdmFsaWQgcncgcGFydGl0aW9uIHJkb25seSwgc28gc2V0CisJCSAqIHRoZSByZG9ubHkgZmxhZyBhbmQgdGhlbiBtYXJrIHRoZSBwYXJ0aXRpb24gYXMgdmFsaWQgYWdhaW4uCisJCSAqLworCQllcy0+c19zdGF0ZSA9IGNwdV90b19sZTE2KHNiaS0+c19tb3VudF9zdGF0ZSk7CisJCWVzLT5zX210aW1lID0gY3B1X3RvX2xlMzIoZ2V0X3NlY29uZHMoKSk7CisJfSBlbHNlIHsKKwkJX19sZTMyIHJldCA9IEVYVDJfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAorCQkJCQkgICAgICAgfkVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1VQUCk7CisJCWlmIChyZXQpIHsKKwkJCXByaW50aygiRVhUMi1mczogJXM6IGNvdWxkbid0IHJlbW91bnQgUkRXUiBiZWNhdXNlIG9mICIKKwkJCSAgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsCisJCQkgICAgICAgc2ItPnNfaWQsIGxlMzJfdG9fY3B1KHJldCkpOworCQkJcmV0dXJuIC1FUk9GUzsKKwkJfQorCQkvKgorCQkgKiBNb3VudGluZyBhIFJET05MWSBwYXJ0aXRpb24gcmVhZC13cml0ZSwgc28gcmVyZWFkIGFuZAorCQkgKiBzdG9yZSB0aGUgY3VycmVudCB2YWxpZCBmbGFnLiAgKEl0IG1heSBoYXZlIGJlZW4gY2hhbmdlZAorCQkgKiBieSBlMmZzY2sgc2luY2Ugd2Ugb3JpZ2luYWxseSBtb3VudGVkIHRoZSBwYXJ0aXRpb24uKQorCQkgKi8KKwkJc2JpLT5zX21vdW50X3N0YXRlID0gbGUxNl90b19jcHUoZXMtPnNfc3RhdGUpOworCQlpZiAoIWV4dDJfc2V0dXBfc3VwZXIgKHNiLCBlcywgMCkpCisJCQlzYi0+c19mbGFncyAmPSB+TVNfUkRPTkxZOworCX0KKwlleHQyX3N5bmNfc3VwZXIoc2IsIGVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleHQyX3N0YXRmcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHN0cnVjdCBrc3RhdGZzICogYnVmKQoreworCXN0cnVjdCBleHQyX3NiX2luZm8gKnNiaSA9IEVYVDJfU0Ioc2IpOworCXVuc2lnbmVkIGxvbmcgb3ZlcmhlYWQ7CisJaW50IGk7CisKKwlpZiAodGVzdF9vcHQgKHNiLCBNSU5JWF9ERikpCisJCW92ZXJoZWFkID0gMDsKKwllbHNlIHsKKwkJLyoKKwkJICogQ29tcHV0ZSB0aGUgb3ZlcmhlYWQgKEZTIHN0cnVjdHVyZXMpCisJCSAqLworCisJCS8qCisJCSAqIEFsbCBvZiB0aGUgYmxvY2tzIGJlZm9yZSBmaXJzdF9kYXRhX2Jsb2NrIGFyZQorCQkgKiBvdmVyaGVhZAorCQkgKi8KKwkJb3ZlcmhlYWQgPSBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisKKwkJLyoKKwkJICogQWRkIHRoZSBvdmVyaGVhZCBhdHRyaWJ1dGVkIHRvIHRoZSBzdXBlcmJsb2NrIGFuZAorCQkgKiBibG9jayBncm91cCBkZXNjcmlwdG9ycy4gIElmIHRoZSBzcGFyc2Ugc3VwZXJibG9ja3MKKwkJICogZmVhdHVyZSBpcyB0dXJuZWQgb24sIHRoZW4gbm90IGFsbCBncm91cHMgaGF2ZSB0aGlzLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IHNiaS0+c19ncm91cHNfY291bnQ7IGkrKykKKwkJCW92ZXJoZWFkICs9IGV4dDJfYmdfaGFzX3N1cGVyKHNiLCBpKSArCisJCQkJZXh0Ml9iZ19udW1fZ2RiKHNiLCBpKTsKKworCQkvKgorCQkgKiBFdmVyeSBibG9jayBncm91cCBoYXMgYW4gaW5vZGUgYml0bWFwLCBhIGJsb2NrCisJCSAqIGJpdG1hcCwgYW5kIGFuIGlub2RlIHRhYmxlLgorCQkgKi8KKwkJb3ZlcmhlYWQgKz0gKHNiaS0+c19ncm91cHNfY291bnQgKgorCQkJICAgICAoMiArIHNiaS0+c19pdGJfcGVyX2dyb3VwKSk7CisJfQorCisJYnVmLT5mX3R5cGUgPSBFWFQyX1NVUEVSX01BR0lDOworCWJ1Zi0+Zl9ic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwlidWYtPmZfYmxvY2tzID0gbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2Jsb2Nrc19jb3VudCkgLSBvdmVyaGVhZDsKKwlidWYtPmZfYmZyZWUgPSBleHQyX2NvdW50X2ZyZWVfYmxvY2tzKHNiKTsKKwlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlIC0gbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX3JfYmxvY2tzX2NvdW50KTsKKwlpZiAoYnVmLT5mX2JmcmVlIDwgbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX3JfYmxvY2tzX2NvdW50KSkKKwkJYnVmLT5mX2JhdmFpbCA9IDA7CisJYnVmLT5mX2ZpbGVzID0gbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2lub2Rlc19jb3VudCk7CisJYnVmLT5mX2ZmcmVlID0gZXh0Ml9jb3VudF9mcmVlX2lub2RlcyAoc2IpOworCWJ1Zi0+Zl9uYW1lbGVuID0gRVhUMl9OQU1FX0xFTjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqZXh0Ml9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBleHQyX2ZpbGxfc3VwZXIpOworfQorCisjaWZkZWYgQ09ORklHX1FVT1RBCisKKy8qIFJlYWQgZGF0YSBmcm9tIHF1b3RhZmlsZSAtIGF2b2lkIHBhZ2VjYWNoZSBhbmQgc3VjaCBiZWNhdXNlIHdlIGNhbm5vdCBhZmZvcmQKKyAqIGFjcXVpcmluZyB0aGUgbG9ja3MuLi4gQXMgcXVvdGEgZmlsZXMgYXJlIG5ldmVyIHRydW5jYXRlZCBhbmQgcXVvdGEgY29kZQorICogaXRzZWxmIHNlcmlhbGl6ZXMgdGhlIG9wZXJhdGlvbnMgKGFuZCBub29uZSBlbHNlIHNob3VsZCB0b3VjaCB0aGUgZmlsZXMpCisgKiB3ZSBkb24ndCBoYXZlIHRvIGJlIGFmcmFpZCBvZiByYWNlcyAqLworc3RhdGljIHNzaXplX3QgZXh0Ml9xdW90YV9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBjaGFyICpkYXRhLAorCQkJICAgICAgIHNpemVfdCBsZW4sIGxvZmZfdCBvZmYpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV07CisJc2VjdG9yX3QgYmxrID0gb2ZmID4+IEVYVDJfQkxPQ0tfU0laRV9CSVRTKHNiKTsKKwlpbnQgZXJyID0gMDsKKwlpbnQgb2Zmc2V0ID0gb2ZmICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOworCWludCB0b2NvcHk7CisJc2l6ZV90IHRvcmVhZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgdG1wX2JoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJbG9mZl90IGlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKworCWlmIChvZmYgPiBpX3NpemUpCisJCXJldHVybiAwOworCWlmIChvZmYrbGVuID4gaV9zaXplKQorCQlsZW4gPSBpX3NpemUtb2ZmOworCXRvcmVhZCA9IGxlbjsKKwl3aGlsZSAodG9yZWFkID4gMCkgeworCQl0b2NvcHkgPSBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgPCB0b3JlYWQgPworCQkJCXNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA6IHRvcmVhZDsKKworCQl0bXBfYmguYl9zdGF0ZSA9IDA7CisJCWVyciA9IGV4dDJfZ2V0X2Jsb2NrKGlub2RlLCBibGssICZ0bXBfYmgsIDApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKCFidWZmZXJfbWFwcGVkKCZ0bXBfYmgpKQkvKiBBIGhvbGU/ICovCisJCQltZW1zZXQoZGF0YSwgMCwgdG9jb3B5KTsKKwkJZWxzZSB7CisJCQliaCA9IHNiX2JyZWFkKHNiLCB0bXBfYmguYl9ibG9ja25yKTsKKwkJCWlmICghYmgpCisJCQkJcmV0dXJuIC1FSU87CisJCQltZW1jcHkoZGF0YSwgYmgtPmJfZGF0YStvZmZzZXQsIHRvY29weSk7CisJCQlicmVsc2UoYmgpOworCQl9CisJCW9mZnNldCA9IDA7CisJCXRvcmVhZCAtPSB0b2NvcHk7CisJCWRhdGEgKz0gdG9jb3B5OworCQlibGsrKzsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworLyogV3JpdGUgdG8gcXVvdGFmaWxlICovCitzdGF0aWMgc3NpemVfdCBleHQyX3F1b3RhX3dyaXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLAorCQkJCWNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sIGxvZmZfdCBvZmYpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV07CisJc2VjdG9yX3QgYmxrID0gb2ZmID4+IEVYVDJfQkxPQ0tfU0laRV9CSVRTKHNiKTsKKwlpbnQgZXJyID0gMDsKKwlpbnQgb2Zmc2V0ID0gb2ZmICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOworCWludCB0b2NvcHk7CisJc2l6ZV90IHRvd3JpdGUgPSBsZW47CisJc3RydWN0IGJ1ZmZlcl9oZWFkIHRtcF9iaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJZG93bigmaW5vZGUtPmlfc2VtKTsKKwl3aGlsZSAodG93cml0ZSA+IDApIHsKKwkJdG9jb3B5ID0gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDwgdG93cml0ZSA/CisJCQkJc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDogdG93cml0ZTsKKworCQl0bXBfYmguYl9zdGF0ZSA9IDA7CisJCWVyciA9IGV4dDJfZ2V0X2Jsb2NrKGlub2RlLCBibGssICZ0bXBfYmgsIDEpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCWlmIChvZmZzZXQgfHwgdG9jb3B5ICE9IEVYVDJfQkxPQ0tfU0laRShzYikpCisJCQliaCA9IHNiX2JyZWFkKHNiLCB0bXBfYmguYl9ibG9ja25yKTsKKwkJZWxzZQorCQkJYmggPSBzYl9nZXRibGsoc2IsIHRtcF9iaC5iX2Jsb2NrbnIpOworCQlpZiAoIWJoKSB7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1jcHkoYmgtPmJfZGF0YStvZmZzZXQsIGRhdGEsIHRvY29weSk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKGJoLT5iX3BhZ2UpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJYnJlbHNlKGJoKTsKKwkJb2Zmc2V0ID0gMDsKKwkJdG93cml0ZSAtPSB0b2NvcHk7CisJCWRhdGEgKz0gdG9jb3B5OworCQlibGsrKzsKKwl9CitvdXQ6CisJaWYgKGxlbiA9PSB0b3dyaXRlKQorCQlyZXR1cm4gZXJyOworCWlmIChpbm9kZS0+aV9zaXplIDwgb2ZmK2xlbi10b3dyaXRlKQorCQlpX3NpemVfd3JpdGUoaW5vZGUsIG9mZitsZW4tdG93cml0ZSk7CisJaW5vZGUtPmlfdmVyc2lvbisrOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJdXAoJmlub2RlLT5pX3NlbSk7CisJcmV0dXJuIGxlbiAtIHRvd3JpdGU7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZXh0Ml9mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiZXh0MiIsCisJLmdldF9zYgkJPSBleHQyX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9leHQyX2ZzKHZvaWQpCit7CisJaW50IGVyciA9IGluaXRfZXh0Ml94YXR0cigpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gaW5pdF9pbm9kZWNhY2hlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworICAgICAgICBlcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZleHQyX2ZzX3R5cGUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCXJldHVybiAwOworb3V0OgorCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworb3V0MToKKwlleGl0X2V4dDJfeGF0dHIoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9leHQyX2ZzKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZleHQyX2ZzX3R5cGUpOworCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworCWV4aXRfZXh0Ml94YXR0cigpOworfQorCittb2R1bGVfaW5pdChpbml0X2V4dDJfZnMpCittb2R1bGVfZXhpdChleGl0X2V4dDJfZnMpCmRpZmYgLS1naXQgYS9mcy9leHQyL3N5bWxpbmsuYyBiL2ZzL2V4dDIvc3ltbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmN2JhYzAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQyL3N5bWxpbmsuYwpAQCAtMCwwICsxLDUyIEBACisvKgorICogIGxpbnV4L2ZzL2V4dDIvc3ltbGluay5jCisgKgorICogT25seSBmYXN0IHN5bWxpbmtzIGxlZnQgaGVyZSAtIHRoZSByZXN0IGlzIGRvbmUgYnkgZ2VuZXJpYyBjb2RlLiBBViwgMTk5OQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9mcy9taW5peC9zeW1saW5rLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBleHQyIHN5bWxpbmsgaGFuZGxpbmcgY29kZQorICovCisKKyNpbmNsdWRlICJleHQyLmgiCisjaW5jbHVkZSAieGF0dHIuaCIKKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorCitzdGF0aWMgaW50IGV4dDJfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvICplaSA9IEVYVDJfSShkZW50cnktPmRfaW5vZGUpOworCW5kX3NldF9saW5rKG5kLCAoY2hhciAqKWVpLT5pX2RhdGEpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQyX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZGxpbmsJPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawk9IHBhZ2VfZm9sbG93X2xpbmtfbGlnaHQsCisJLnB1dF9saW5rCT0gcGFnZV9wdXRfbGluaywKKyNpZmRlZiBDT05GSUdfRVhUMl9GU19YQVRUUgorCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gZ2VuZXJpY19nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gZXh0Ml9saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKKyNlbmRpZgorfTsKKyAKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDJfZmFzdF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBleHQyX2ZvbGxvd19saW5rLAorI2lmZGVmIENPTkZJR19FWFQyX0ZTX1hBVFRSCisJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAorCS5saXN0eGF0dHIJPSBleHQyX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAorI2VuZGlmCit9OwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi94YXR0ci5jIGIvZnMvZXh0Mi94YXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OTgyYjUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQyL3hhdHRyLmMKQEAgLTAsMCArMSwxMDQzIEBACisvKgorICogbGludXgvZnMvZXh0Mi94YXR0ci5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgQW5kcmVhcyBHcnVlbmJhY2hlciA8YWdydWVuQHN1c2UuZGU+CisgKgorICogRml4IGJ5IEhhcnJpc29uIFhpbmcgPGhhcnJpc29uQG1vdW50YWludmlld2RhdGEuY29tPi4KKyAqIEV4dGVuZGVkIGF0dHJpYnV0ZXMgZm9yIHN5bWxpbmtzIGFuZCBzcGVjaWFsIGZpbGVzIGFkZGVkIHBlcgorICogIHN1Z2dlc3Rpb24gb2YgTHVrYSBSZW5rbyA8bHVrYS5yZW5rb0BoZXJtZXMuc2k+LgorICogeGF0dHIgY29uc29saWRhdGlvbiBDb3B5cmlnaHQgKGMpIDIwMDQgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQHJlZGhhdC5jb20+LAorICogIFJlZCBIYXQgSW5jLgorICoKKyAqLworCisvKgorICogRXh0ZW5kZWQgYXR0cmlidXRlcyBhcmUgc3RvcmVkIG9uIGRpc2sgYmxvY2tzIGFsbG9jYXRlZCBvdXRzaWRlIG9mCisgKiBhbnkgaW5vZGUuIFRoZSBpX2ZpbGVfYWNsIGZpZWxkIGlzIHRoZW4gbWFkZSB0byBwb2ludCB0byB0aGlzIGFsbG9jYXRlZAorICogYmxvY2suIElmIGFsbCBleHRlbmRlZCBhdHRyaWJ1dGVzIG9mIGFuIGlub2RlIGFyZSBpZGVudGljYWwsIHRoZXNlCisgKiBpbm9kZXMgbWF5IHNoYXJlIHRoZSBzYW1lIGV4dGVuZGVkIGF0dHJpYnV0ZSBibG9jay4gU3VjaCBzaXR1YXRpb25zCisgKiBhcmUgYXV0b21hdGljYWxseSBkZXRlY3RlZCBieSBrZWVwaW5nIGEgY2FjaGUgb2YgcmVjZW50IGF0dHJpYnV0ZSBibG9jaworICogbnVtYmVycyBhbmQgaGFzaGVzIG92ZXIgdGhlIGJsb2NrJ3MgY29udGVudHMgaW4gbWVtb3J5LgorICoKKyAqCisgKiBFeHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2sgbGF5b3V0OgorICoKKyAqICAgKy0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgfCBoZWFkZXIgICAgICAgICAgIHwKKyAqICAgfCBlbnRyeSAxICAgICAgICAgIHwgfAorICogICB8IGVudHJ5IDIgICAgICAgICAgfCB8IGdyb3dpbmcgZG93bndhcmRzCisgKiAgIHwgZW50cnkgMyAgICAgICAgICB8IHYKKyAqICAgfCBmb3VyIG51bGwgYnl0ZXMgIHwKKyAqICAgfCAuIC4gLiAgICAgICAgICAgIHwKKyAqICAgfCB2YWx1ZSAxICAgICAgICAgIHwgXgorICogICB8IHZhbHVlIDMgICAgICAgICAgfCB8IGdyb3dpbmcgdXB3YXJkcworICogICB8IHZhbHVlIDIgICAgICAgICAgfCB8CisgKiAgICstLS0tLS0tLS0tLS0tLS0tLS0rCisgKgorICogVGhlIGJsb2NrIGhlYWRlciBpcyBmb2xsb3dlZCBieSBtdWx0aXBsZSBlbnRyeSBkZXNjcmlwdG9ycy4gVGhlc2UgZW50cnkKKyAqIGRlc2NyaXB0b3JzIGFyZSB2YXJpYWJsZSBpbiBzaXplLCBhbmQgYWxsaWduZWQgdG8gRVhUMl9YQVRUUl9QQUQKKyAqIGJ5dGUgYm91bmRhcmllcy4gVGhlIGVudHJ5IGRlc2NyaXB0b3JzIGFyZSBzb3J0ZWQgYnkgYXR0cmlidXRlIG5hbWUsCisgKiBzbyB0aGF0IHR3byBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2tzIGNhbiBiZSBjb21wYXJlZCBlZmZpY2llbnRseS4KKyAqCisgKiBBdHRyaWJ1dGUgdmFsdWVzIGFyZSBhbGlnbmVkIHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrLCBzdG9yZWQgaW4KKyAqIG5vIHNwZWNpZmljIG9yZGVyLiBUaGV5IGFyZSBhbHNvIHBhZGRlZCB0byBFWFQyX1hBVFRSX1BBRCBieXRlCisgKiBib3VuZGFyaWVzLiBObyBhZGRpdGlvbmFsIGdhcHMgYXJlIGxlZnQgYmV0d2VlbiB0aGVtLgorICoKKyAqIExvY2tpbmcgc3RyYXRlZ3kKKyAqIC0tLS0tLS0tLS0tLS0tLS0KKyAqIEVYVDJfSShpbm9kZSktPmlfZmlsZV9hY2wgaXMgcHJvdGVjdGVkIGJ5IEVYVDJfSShpbm9kZSktPnhhdHRyX3NlbS4KKyAqIEVBIGJsb2NrcyBhcmUgb25seSBjaGFuZ2VkIGlmIHRoZXkgYXJlIGV4Y2x1c2l2ZSB0byBhbiBpbm9kZSwgc28KKyAqIGhvbGRpbmcgeGF0dHJfc2VtIGFsc28gbWVhbnMgdGhhdCBub3RoaW5nIGJ1dCB0aGUgRUEgYmxvY2sncyByZWZlcmVuY2UKKyAqIGNvdW50IHdpbGwgY2hhbmdlLiBNdWx0aXBsZSB3cml0ZXJzIHRvIGFuIEVBIGJsb2NrIGFyZSBzeW5jaHJvbml6ZWQKKyAqIGJ5IHRoZSBiaCBsb2NrLiBObyBtb3JlIHRoYW4gYSBzaW5nbGUgYmggbG9jayBpcyBoZWxkIGF0IGFueSB0aW1lCisgKiB0byBhdm9pZCBkZWFkbG9ja3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tYmNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgImV4dDIuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImFjbC5oIgorCisjZGVmaW5lIEhEUihiaCkgKChzdHJ1Y3QgZXh0Ml94YXR0cl9oZWFkZXIgKikoKGJoKS0+Yl9kYXRhKSkKKyNkZWZpbmUgRU5UUlkocHRyKSAoKHN0cnVjdCBleHQyX3hhdHRyX2VudHJ5ICopKHB0cikpCisjZGVmaW5lIEZJUlNUX0VOVFJZKGJoKSBFTlRSWShIRFIoYmgpKzEpCisjZGVmaW5lIElTX0xBU1RfRU5UUlkoZW50cnkpICgqKF9fdTMyICopKGVudHJ5KSA9PSAwKQorCisjaWZkZWYgRVhUMl9YQVRUUl9ERUJVRworIyBkZWZpbmUgZWFfaWRlYnVnKGlub2RlLCBmLi4uKSBkbyB7IFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgImlub2RlICVzOiVsZDogIiwgXAorCQkJaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7IFwKKwkJcHJpbnRrKGYpOyBcCisJCXByaW50aygiXG4iKTsgXAorCX0gd2hpbGUgKDApCisjIGRlZmluZSBlYV9iZGVidWcoYmgsIGYuLi4pIGRvIHsgXAorCQljaGFyIGJbQkRFVk5BTUVfU0laRV07IFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgImJsb2NrICVzOiVsdTogIiwgXAorCQkJYmRldm5hbWUoYmgtPmJfYmRldiwgYiksIFwKKwkJCSh1bnNpZ25lZCBsb25nKSBiaC0+Yl9ibG9ja25yKTsgXAorCQlwcmludGsoZik7IFwKKwkJcHJpbnRrKCJcbiIpOyBcCisJfSB3aGlsZSAoMCkKKyNlbHNlCisjIGRlZmluZSBlYV9pZGVidWcoZi4uLikKKyMgZGVmaW5lIGVhX2JkZWJ1ZyhmLi4uKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZXh0Ml94YXR0cl9zZXQyKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwKKwkJCSAgIHN0cnVjdCBleHQyX3hhdHRyX2hlYWRlciAqKTsKKworc3RhdGljIGludCBleHQyX3hhdHRyX2NhY2hlX2luc2VydChzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7CitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICpleHQyX3hhdHRyX2NhY2hlX2ZpbmQoc3RydWN0IGlub2RlICosCisJCQkJCQkgc3RydWN0IGV4dDJfeGF0dHJfaGVhZGVyICopOworc3RhdGljIHZvaWQgZXh0Ml94YXR0cl9yZWhhc2goc3RydWN0IGV4dDJfeGF0dHJfaGVhZGVyICosCisJCQkgICAgICBzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSAqKTsKKworc3RhdGljIHN0cnVjdCBtYl9jYWNoZSAqZXh0Ml94YXR0cl9jYWNoZTsKKworc3RhdGljIHN0cnVjdCB4YXR0cl9oYW5kbGVyICpleHQyX3hhdHRyX2hhbmRsZXJfbWFwW10gPSB7CisJW0VYVDJfWEFUVFJfSU5ERVhfVVNFUl0JCSAgICAgPSAmZXh0Ml94YXR0cl91c2VyX2hhbmRsZXIsCisjaWZkZWYgQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMCisJW0VYVDJfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0FDQ0VTU10gID0gJmV4dDJfeGF0dHJfYWNsX2FjY2Vzc19oYW5kbGVyLAorCVtFWFQyX1hBVFRSX0lOREVYX1BPU0lYX0FDTF9ERUZBVUxUXSA9ICZleHQyX3hhdHRyX2FjbF9kZWZhdWx0X2hhbmRsZXIsCisjZW5kaWYKKwlbRVhUMl9YQVRUUl9JTkRFWF9UUlVTVEVEXQkgICAgID0gJmV4dDJfeGF0dHJfdHJ1c3RlZF9oYW5kbGVyLAorI2lmZGVmIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZCisJW0VYVDJfWEFUVFJfSU5ERVhfU0VDVVJJVFldCSAgICAgPSAmZXh0Ml94YXR0cl9zZWN1cml0eV9oYW5kbGVyLAorI2VuZGlmCit9OworCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqZXh0Ml94YXR0cl9oYW5kbGVyc1tdID0geworCSZleHQyX3hhdHRyX3VzZXJfaGFuZGxlciwKKwkmZXh0Ml94YXR0cl90cnVzdGVkX2hhbmRsZXIsCisjaWZkZWYgQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMCisJJmV4dDJfeGF0dHJfYWNsX2FjY2Vzc19oYW5kbGVyLAorCSZleHQyX3hhdHRyX2FjbF9kZWZhdWx0X2hhbmRsZXIsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRVhUMl9GU19TRUNVUklUWQorCSZleHQyX3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIsCisjZW5kaWYKKwlOVUxMCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB4YXR0cl9oYW5kbGVyICoKK2V4dDJfeGF0dHJfaGFuZGxlcihpbnQgbmFtZV9pbmRleCkKK3sKKwlzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciA9IE5VTEw7CisKKwlpZiAobmFtZV9pbmRleCA+IDAgJiYgbmFtZV9pbmRleCA8IEFSUkFZX1NJWkUoZXh0Ml94YXR0cl9oYW5kbGVyX21hcCkpCisJCWhhbmRsZXIgPSBleHQyX3hhdHRyX2hhbmRsZXJfbWFwW25hbWVfaW5kZXhdOworCXJldHVybiBoYW5kbGVyOworfQorCisvKgorICogZXh0Ml94YXR0cl9nZXQoKQorICoKKyAqIENvcHkgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGludG8gdGhlIGJ1ZmZlcgorICogcHJvdmlkZWQsIG9yIGNvbXB1dGUgdGhlIGJ1ZmZlciBzaXplIHJlcXVpcmVkLgorICogQnVmZmVyIGlzIE5VTEwgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkLgorICoKKyAqIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb24gZmFpbHVyZSwgb3IgdGhlIG51bWJlciBvZiBieXRlcworICogdXNlZCAvIHJlcXVpcmVkIG9uIHN1Y2Nlc3MuCisgKi8KK2ludAorZXh0Ml94YXR0cl9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5hbWVfaW5kZXgsIGNvbnN0IGNoYXIgKm5hbWUsCisJICAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCXN0cnVjdCBleHQyX3hhdHRyX2VudHJ5ICplbnRyeTsKKwlzaXplX3QgbmFtZV9sZW4sIHNpemU7CisJY2hhciAqZW5kOworCWludCBlcnJvcjsKKworCWVhX2lkZWJ1Zyhpbm9kZSwgIm5hbWU9JWQuJXMsIGJ1ZmZlcj0lcCwgYnVmZmVyX3NpemU9JWxkIiwKKwkJICBuYW1lX2luZGV4LCBuYW1lLCBidWZmZXIsIChsb25nKWJ1ZmZlcl9zaXplKTsKKworCWlmIChuYW1lID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCWRvd25fcmVhZCgmRVhUMl9JKGlub2RlKS0+eGF0dHJfc2VtKTsKKwllcnJvciA9IC1FTk9EQVRBOworCWlmICghRVhUMl9JKGlub2RlKS0+aV9maWxlX2FjbCkKKwkJZ290byBjbGVhbnVwOworCWVhX2lkZWJ1Zyhpbm9kZSwgInJlYWRpbmcgYmxvY2sgJWQiLCBFWFQyX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKKwliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBFWFQyX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKKwllcnJvciA9IC1FSU87CisJaWYgKCFiaCkKKwkJZ290byBjbGVhbnVwOworCWVhX2JkZWJ1ZyhiaCwgImJfY291bnQ9JWQsIHJlZmNvdW50PSVkIiwKKwkJYXRvbWljX3JlYWQoJihiaC0+Yl9jb3VudCkpLCBsZTMyX3RvX2NwdShIRFIoYmgpLT5oX3JlZmNvdW50KSk7CisJZW5kID0gYmgtPmJfZGF0YSArIGJoLT5iX3NpemU7CisJaWYgKEhEUihiaCktPmhfbWFnaWMgIT0gY3B1X3RvX2xlMzIoRVhUMl9YQVRUUl9NQUdJQykgfHwKKwkgICAgSERSKGJoKS0+aF9ibG9ja3MgIT0gY3B1X3RvX2xlMzIoMSkpIHsKK2JhZF9ibG9jazoJZXh0Ml9lcnJvcihpbm9kZS0+aV9zYiwgImV4dDJfeGF0dHJfZ2V0IiwKKwkJCSJpbm9kZSAlbGQ6IGJhZCBibG9jayAlZCIsIGlub2RlLT5pX2lubywKKwkJCUVYVDJfSShpbm9kZSktPmlfZmlsZV9hY2wpOworCQllcnJvciA9IC1FSU87CisJCWdvdG8gY2xlYW51cDsKKwl9CisJLyogZmluZCBuYW1lZCBhdHRyaWJ1dGUgKi8KKwluYW1lX2xlbiA9IHN0cmxlbihuYW1lKTsKKworCWVycm9yID0gLUVSQU5HRTsKKwlpZiAobmFtZV9sZW4gPiAyNTUpCisJCWdvdG8gY2xlYW51cDsKKwllbnRyeSA9IEZJUlNUX0VOVFJZKGJoKTsKKwl3aGlsZSAoIUlTX0xBU1RfRU5UUlkoZW50cnkpKSB7CisJCXN0cnVjdCBleHQyX3hhdHRyX2VudHJ5ICpuZXh0ID0KKwkJCUVYVDJfWEFUVFJfTkVYVChlbnRyeSk7CisJCWlmICgoY2hhciAqKW5leHQgPj0gZW5kKQorCQkJZ290byBiYWRfYmxvY2s7CisJCWlmIChuYW1lX2luZGV4ID09IGVudHJ5LT5lX25hbWVfaW5kZXggJiYKKwkJICAgIG5hbWVfbGVuID09IGVudHJ5LT5lX25hbWVfbGVuICYmCisJCSAgICBtZW1jbXAobmFtZSwgZW50cnktPmVfbmFtZSwgbmFtZV9sZW4pID09IDApCisJCQlnb3RvIGZvdW5kOworCQllbnRyeSA9IG5leHQ7CisJfQorCS8qIENoZWNrIHRoZSByZW1haW5pbmcgbmFtZSBlbnRyaWVzICovCisJd2hpbGUgKCFJU19MQVNUX0VOVFJZKGVudHJ5KSkgeworCQlzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSAqbmV4dCA9CisJCQlFWFQyX1hBVFRSX05FWFQoZW50cnkpOworCQlpZiAoKGNoYXIgKiluZXh0ID49IGVuZCkKKwkJCWdvdG8gYmFkX2Jsb2NrOworCQllbnRyeSA9IG5leHQ7CisJfQorCWlmIChleHQyX3hhdHRyX2NhY2hlX2luc2VydChiaCkpCisJCWVhX2lkZWJ1Zyhpbm9kZSwgImNhY2hlIGluc2VydCBmYWlsZWQiKTsKKwllcnJvciA9IC1FTk9EQVRBOworCWdvdG8gY2xlYW51cDsKK2ZvdW5kOgorCS8qIGNoZWNrIHRoZSBidWZmZXIgc2l6ZSAqLworCWlmIChlbnRyeS0+ZV92YWx1ZV9ibG9jayAhPSAwKQorCQlnb3RvIGJhZF9ibG9jazsKKwlzaXplID0gbGUzMl90b19jcHUoZW50cnktPmVfdmFsdWVfc2l6ZSk7CisJaWYgKHNpemUgPiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgfHwKKwkgICAgbGUxNl90b19jcHUoZW50cnktPmVfdmFsdWVfb2ZmcykgKyBzaXplID4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKQorCQlnb3RvIGJhZF9ibG9jazsKKworCWlmIChleHQyX3hhdHRyX2NhY2hlX2luc2VydChiaCkpCisJCWVhX2lkZWJ1Zyhpbm9kZSwgImNhY2hlIGluc2VydCBmYWlsZWQiKTsKKwlpZiAoYnVmZmVyKSB7CisJCWVycm9yID0gLUVSQU5HRTsKKwkJaWYgKHNpemUgPiBidWZmZXJfc2l6ZSkKKwkJCWdvdG8gY2xlYW51cDsKKwkJLyogcmV0dXJuIHZhbHVlIG9mIGF0dHJpYnV0ZSAqLworCQltZW1jcHkoYnVmZmVyLCBiaC0+Yl9kYXRhICsgbGUxNl90b19jcHUoZW50cnktPmVfdmFsdWVfb2ZmcyksCisJCQlzaXplKTsKKwl9CisJZXJyb3IgPSBzaXplOworCitjbGVhbnVwOgorCWJyZWxzZShiaCk7CisJdXBfcmVhZCgmRVhUMl9JKGlub2RlKS0+eGF0dHJfc2VtKTsKKworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIGV4dDJfeGF0dHJfbGlzdCgpCisgKgorICogQ29weSBhIGxpc3Qgb2YgYXR0cmlidXRlIG5hbWVzIGludG8gdGhlIGJ1ZmZlcgorICogcHJvdmlkZWQsIG9yIGNvbXB1dGUgdGhlIGJ1ZmZlciBzaXplIHJlcXVpcmVkLgorICogQnVmZmVyIGlzIE5VTEwgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkLgorICoKKyAqIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb24gZmFpbHVyZSwgb3IgdGhlIG51bWJlciBvZiBieXRlcworICogdXNlZCAvIHJlcXVpcmVkIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSAqZW50cnk7CisJY2hhciAqZW5kOworCXNpemVfdCByZXN0ID0gYnVmZmVyX3NpemU7CisJaW50IGVycm9yOworCisJZWFfaWRlYnVnKGlub2RlLCAiYnVmZmVyPSVwLCBidWZmZXJfc2l6ZT0lbGQiLAorCQkgIGJ1ZmZlciwgKGxvbmcpYnVmZmVyX3NpemUpOworCisJZG93bl9yZWFkKCZFWFQyX0koaW5vZGUpLT54YXR0cl9zZW0pOworCWVycm9yID0gMDsKKwlpZiAoIUVYVDJfSShpbm9kZSktPmlfZmlsZV9hY2wpCisJCWdvdG8gY2xlYW51cDsKKwllYV9pZGVidWcoaW5vZGUsICJyZWFkaW5nIGJsb2NrICVkIiwgRVhUMl9JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgRVhUMl9JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJZXJyb3IgPSAtRUlPOworCWlmICghYmgpCisJCWdvdG8gY2xlYW51cDsKKwllYV9iZGVidWcoYmgsICJiX2NvdW50PSVkLCByZWZjb3VudD0lZCIsCisJCWF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSwgbGUzMl90b19jcHUoSERSKGJoKS0+aF9yZWZjb3VudCkpOworCWVuZCA9IGJoLT5iX2RhdGEgKyBiaC0+Yl9zaXplOworCWlmIChIRFIoYmgpLT5oX21hZ2ljICE9IGNwdV90b19sZTMyKEVYVDJfWEFUVFJfTUFHSUMpIHx8CisJICAgIEhEUihiaCktPmhfYmxvY2tzICE9IGNwdV90b19sZTMyKDEpKSB7CitiYWRfYmxvY2s6CWV4dDJfZXJyb3IoaW5vZGUtPmlfc2IsICJleHQyX3hhdHRyX2xpc3QiLAorCQkJImlub2RlICVsZDogYmFkIGJsb2NrICVkIiwgaW5vZGUtPmlfaW5vLAorCQkJRVhUMl9JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJCWVycm9yID0gLUVJTzsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIGNoZWNrIHRoZSBvbi1kaXNrIGRhdGEgc3RydWN0dXJlICovCisJZW50cnkgPSBGSVJTVF9FTlRSWShiaCk7CisJd2hpbGUgKCFJU19MQVNUX0VOVFJZKGVudHJ5KSkgeworCQlzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSAqbmV4dCA9IEVYVDJfWEFUVFJfTkVYVChlbnRyeSk7CisKKwkJaWYgKChjaGFyICopbmV4dCA+PSBlbmQpCisJCQlnb3RvIGJhZF9ibG9jazsKKwkJZW50cnkgPSBuZXh0OworCX0KKwlpZiAoZXh0Ml94YXR0cl9jYWNoZV9pbnNlcnQoYmgpKQorCQllYV9pZGVidWcoaW5vZGUsICJjYWNoZSBpbnNlcnQgZmFpbGVkIik7CisKKwkvKiBsaXN0IHRoZSBhdHRyaWJ1dGUgbmFtZXMgKi8KKwlmb3IgKGVudHJ5ID0gRklSU1RfRU5UUlkoYmgpOyAhSVNfTEFTVF9FTlRSWShlbnRyeSk7CisJICAgICBlbnRyeSA9IEVYVDJfWEFUVFJfTkVYVChlbnRyeSkpIHsKKwkJc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIgPQorCQkJZXh0Ml94YXR0cl9oYW5kbGVyKGVudHJ5LT5lX25hbWVfaW5kZXgpOworCisJCWlmIChoYW5kbGVyKSB7CisJCQlzaXplX3Qgc2l6ZSA9IGhhbmRsZXItPmxpc3QoaW5vZGUsIGJ1ZmZlciwgcmVzdCwKKwkJCQkJCSAgICBlbnRyeS0+ZV9uYW1lLAorCQkJCQkJICAgIGVudHJ5LT5lX25hbWVfbGVuKTsKKwkJCWlmIChidWZmZXIpIHsKKwkJCQlpZiAoc2l6ZSA+IHJlc3QpIHsKKwkJCQkJZXJyb3IgPSAtRVJBTkdFOworCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJfQorCQkJCWJ1ZmZlciArPSBzaXplOworCQkJfQorCQkJcmVzdCAtPSBzaXplOworCQl9CisJfQorCWVycm9yID0gYnVmZmVyX3NpemUgLSByZXN0OyAgLyogdG90YWwgc2l6ZSAqLworCitjbGVhbnVwOgorCWJyZWxzZShiaCk7CisJdXBfcmVhZCgmRVhUMl9JKGlub2RlKS0+eGF0dHJfc2VtKTsKKworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIElub2RlIG9wZXJhdGlvbiBsaXN0eGF0dHIoKQorICoKKyAqIGRlbnRyeS0+ZF9pbm9kZS0+aV9zZW06IGRvbid0IGNhcmUKKyAqLworc3NpemVfdAorZXh0Ml9saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCXJldHVybiBleHQyX3hhdHRyX2xpc3QoZGVudHJ5LT5kX2lub2RlLCBidWZmZXIsIHNpemUpOworfQorCisvKgorICogSWYgdGhlIEVYVDJfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIgZmVhdHVyZSBvZiB0aGlzIGZpbGUgc3lzdGVtIGlzCisgKiBub3Qgc2V0LCBzZXQgaXQuCisgKi8KK3N0YXRpYyB2b2lkIGV4dDJfeGF0dHJfdXBkYXRlX3N1cGVyX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaWYgKEVYVDJfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQyX0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSKSkKKwkJcmV0dXJuOworCisJbG9ja19zdXBlcihzYik7CisJRVhUMl9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9jb21wYXQgfD0KKwkJY3B1X3RvX2xlMzIoRVhUMl9GRUFUVVJFX0NPTVBBVF9FWFRfQVRUUik7CisJc2ItPnNfZGlydCA9IDE7CisJbWFya19idWZmZXJfZGlydHkoRVhUMl9TQihzYiktPnNfc2JoKTsKKwl1bmxvY2tfc3VwZXIoc2IpOworfQorCisvKgorICogZXh0Ml94YXR0cl9zZXQoKQorICoKKyAqIENyZWF0ZSwgcmVwbGFjZSBvciByZW1vdmUgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGZvciB0aGlzIGlub2RlLiBCdWZmZXIKKyAqIGlzIE5VTEwgdG8gcmVtb3ZlIGFuIGV4aXN0aW5nIGV4dGVuZGVkIGF0dHJpYnV0ZSwgYW5kIG5vbi1OVUxMIHRvCisgKiBlaXRoZXIgcmVwbGFjZSBhbiBleGlzdGluZyBleHRlbmRlZCBhdHRyaWJ1dGUsIG9yIGNyZWF0ZSBhIG5ldyBleHRlbmRlZAorICogYXR0cmlidXRlLiBUaGUgZmxhZ3MgWEFUVFJfUkVQTEFDRSBhbmQgWEFUVFJfQ1JFQVRFCisgKiBzcGVjaWZ5IHRoYXQgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIG11c3QgZXhpc3QgYW5kIG11c3Qgbm90IGV4aXN0CisgKiBwcmV2aW91cyB0byB0aGUgY2FsbCwgcmVzcGVjdGl2ZWx5LgorICoKKyAqIFJldHVybnMgMCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb24gZmFpbHVyZS4KKyAqLworaW50CitleHQyX3hhdHRyX3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbmFtZV9pbmRleCwgY29uc3QgY2hhciAqbmFtZSwKKwkgICAgICAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCB2YWx1ZV9sZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IGV4dDJfeGF0dHJfaGVhZGVyICpoZWFkZXIgPSBOVUxMOworCXN0cnVjdCBleHQyX3hhdHRyX2VudHJ5ICpoZXJlLCAqbGFzdDsKKwlzaXplX3QgbmFtZV9sZW4sIGZyZWUsIG1pbl9vZmZzID0gc2ItPnNfYmxvY2tzaXplOworCWludCBub3RfZm91bmQgPSAxLCBlcnJvcjsKKwljaGFyICplbmQ7CisJCisJLyoKKwkgKiBoZWFkZXIgLS0gUG9pbnRzIGVpdGhlciBpbnRvIGJoLCBvciB0byBhIHRlbXBvcmFyaWx5CisJICogICAgICAgICAgIGFsbG9jYXRlZCBidWZmZXIuCisJICogaGVyZSAtLSBUaGUgbmFtZWQgZW50cnkgZm91bmQsIG9yIHRoZSBwbGFjZSBmb3IgaW5zZXJ0aW5nLCB3aXRoaW4KKwkgKiAgICAgICAgIHRoZSBibG9jayBwb2ludGVkIHRvIGJ5IGhlYWRlci4KKwkgKiBsYXN0IC0tIFBvaW50cyByaWdodCBhZnRlciB0aGUgbGFzdCBuYW1lZCBlbnRyeSB3aXRoaW4gdGhlIGJsb2NrCisJICogICAgICAgICBwb2ludGVkIHRvIGJ5IGhlYWRlci4KKwkgKiBtaW5fb2ZmcyAtLSBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCB2YWx1ZSAodmFsdWVzIGFyZSBhbGlnbmVkCisJICogICAgICAgICAgICAgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBibG9jaykuCisJICogZW5kIC0tIFBvaW50cyByaWdodCBhZnRlciB0aGUgYmxvY2sgcG9pbnRlZCB0byBieSBoZWFkZXIuCisJICovCisJCisJZWFfaWRlYnVnKGlub2RlLCAibmFtZT0lZC4lcywgdmFsdWU9JXAsIHZhbHVlX2xlbj0lbGQiLAorCQkgIG5hbWVfaW5kZXgsIG5hbWUsIHZhbHVlLCAobG9uZyl2YWx1ZV9sZW4pOworCisJaWYgKElTX1JET05MWShpbm9kZSkpCisJCXJldHVybiAtRVJPRlM7CisJaWYgKElTX0lNTVVUQUJMRShpbm9kZSkgfHwgSVNfQVBQRU5EKGlub2RlKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAodmFsdWUgPT0gTlVMTCkKKwkJdmFsdWVfbGVuID0gMDsKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwluYW1lX2xlbiA9IHN0cmxlbihuYW1lKTsKKwlpZiAobmFtZV9sZW4gPiAyNTUgfHwgdmFsdWVfbGVuID4gc2ItPnNfYmxvY2tzaXplKQorCQlyZXR1cm4gLUVSQU5HRTsKKwlkb3duX3dyaXRlKCZFWFQyX0koaW5vZGUpLT54YXR0cl9zZW0pOworCWlmIChFWFQyX0koaW5vZGUpLT5pX2ZpbGVfYWNsKSB7CisJCS8qIFRoZSBpbm9kZSBhbHJlYWR5IGhhcyBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2suICovCisJCWJoID0gc2JfYnJlYWQoc2IsIEVYVDJfSShpbm9kZSktPmlfZmlsZV9hY2wpOworCQllcnJvciA9IC1FSU87CisJCWlmICghYmgpCisJCQlnb3RvIGNsZWFudXA7CisJCWVhX2JkZWJ1ZyhiaCwgImJfY291bnQ9JWQsIHJlZmNvdW50PSVkIiwKKwkJCWF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSwKKwkJCWxlMzJfdG9fY3B1KEhEUihiaCktPmhfcmVmY291bnQpKTsKKwkJaGVhZGVyID0gSERSKGJoKTsKKwkJZW5kID0gYmgtPmJfZGF0YSArIGJoLT5iX3NpemU7CisJCWlmIChoZWFkZXItPmhfbWFnaWMgIT0gY3B1X3RvX2xlMzIoRVhUMl9YQVRUUl9NQUdJQykgfHwKKwkJICAgIGhlYWRlci0+aF9ibG9ja3MgIT0gY3B1X3RvX2xlMzIoMSkpIHsKK2JhZF9ibG9jazoJCWV4dDJfZXJyb3Ioc2IsICJleHQyX3hhdHRyX3NldCIsCisJCQkJImlub2RlICVsZDogYmFkIGJsb2NrICVkIiwgaW5vZGUtPmlfaW5vLCAKKwkJCQkgICBFWFQyX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKKwkJCWVycm9yID0gLUVJTzsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQkvKiBGaW5kIHRoZSBuYW1lZCBhdHRyaWJ1dGUuICovCisJCWhlcmUgPSBGSVJTVF9FTlRSWShiaCk7CisJCXdoaWxlICghSVNfTEFTVF9FTlRSWShoZXJlKSkgeworCQkJc3RydWN0IGV4dDJfeGF0dHJfZW50cnkgKm5leHQgPSBFWFQyX1hBVFRSX05FWFQoaGVyZSk7CisJCQlpZiAoKGNoYXIgKiluZXh0ID49IGVuZCkKKwkJCQlnb3RvIGJhZF9ibG9jazsKKwkJCWlmICghaGVyZS0+ZV92YWx1ZV9ibG9jayAmJiBoZXJlLT5lX3ZhbHVlX3NpemUpIHsKKwkJCQlzaXplX3Qgb2ZmcyA9IGxlMTZfdG9fY3B1KGhlcmUtPmVfdmFsdWVfb2Zmcyk7CisJCQkJaWYgKG9mZnMgPCBtaW5fb2ZmcykKKwkJCQkJbWluX29mZnMgPSBvZmZzOworCQkJfQorCQkJbm90X2ZvdW5kID0gbmFtZV9pbmRleCAtIGhlcmUtPmVfbmFtZV9pbmRleDsKKwkJCWlmICghbm90X2ZvdW5kKQorCQkJCW5vdF9mb3VuZCA9IG5hbWVfbGVuIC0gaGVyZS0+ZV9uYW1lX2xlbjsKKwkJCWlmICghbm90X2ZvdW5kKQorCQkJCW5vdF9mb3VuZCA9IG1lbWNtcChuYW1lLCBoZXJlLT5lX25hbWUsbmFtZV9sZW4pOworCQkJaWYgKG5vdF9mb3VuZCA8PSAwKQorCQkJCWJyZWFrOworCQkJaGVyZSA9IG5leHQ7CisJCX0KKwkJbGFzdCA9IGhlcmU7CisJCS8qIFdlIHN0aWxsIG5lZWQgdG8gY29tcHV0ZSBtaW5fb2ZmcyBhbmQgbGFzdC4gKi8KKwkJd2hpbGUgKCFJU19MQVNUX0VOVFJZKGxhc3QpKSB7CisJCQlzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSAqbmV4dCA9IEVYVDJfWEFUVFJfTkVYVChsYXN0KTsKKwkJCWlmICgoY2hhciAqKW5leHQgPj0gZW5kKQorCQkJCWdvdG8gYmFkX2Jsb2NrOworCQkJaWYgKCFsYXN0LT5lX3ZhbHVlX2Jsb2NrICYmIGxhc3QtPmVfdmFsdWVfc2l6ZSkgeworCQkJCXNpemVfdCBvZmZzID0gbGUxNl90b19jcHUobGFzdC0+ZV92YWx1ZV9vZmZzKTsKKwkJCQlpZiAob2ZmcyA8IG1pbl9vZmZzKQorCQkJCQltaW5fb2ZmcyA9IG9mZnM7CisJCQl9CisJCQlsYXN0ID0gbmV4dDsKKwkJfQorCisJCS8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgbGVmdC4gKi8KKwkJZnJlZSA9IG1pbl9vZmZzIC0gKChjaGFyKilsYXN0IC0gKGNoYXIqKWhlYWRlcikgLSBzaXplb2YoX191MzIpOworCX0gZWxzZSB7CisJCS8qIFdlIHdpbGwgdXNlIGEgbmV3IGV4dGVuZGVkIGF0dHJpYnV0ZSBibG9jay4gKi8KKwkJZnJlZSA9IHNiLT5zX2Jsb2Nrc2l6ZSAtCisJCQlzaXplb2Yoc3RydWN0IGV4dDJfeGF0dHJfaGVhZGVyKSAtIHNpemVvZihfX3UzMik7CisJCWhlcmUgPSBsYXN0ID0gTlVMTDsgIC8qIGF2b2lkIGdjYyB1bmluaXRpYWxpemVkIHdhcm5pbmcuICovCisJfQorCisJaWYgKG5vdF9mb3VuZCkgeworCQkvKiBSZXF1ZXN0IHRvIHJlbW92ZSBhIG5vbmV4aXN0ZW50IGF0dHJpYnV0ZT8gKi8KKwkJZXJyb3IgPSAtRU5PREFUQTsKKwkJaWYgKGZsYWdzICYgWEFUVFJfUkVQTEFDRSkKKwkJCWdvdG8gY2xlYW51cDsKKwkJZXJyb3IgPSAwOworCQlpZiAodmFsdWUgPT0gTlVMTCkKKwkJCWdvdG8gY2xlYW51cDsKKwl9IGVsc2UgeworCQkvKiBSZXF1ZXN0IHRvIGNyZWF0ZSBhbiBleGlzdGluZyBhdHRyaWJ1dGU/ICovCisJCWVycm9yID0gLUVFWElTVDsKKwkJaWYgKGZsYWdzICYgWEFUVFJfQ1JFQVRFKQorCQkJZ290byBjbGVhbnVwOworCQlpZiAoIWhlcmUtPmVfdmFsdWVfYmxvY2sgJiYgaGVyZS0+ZV92YWx1ZV9zaXplKSB7CisJCQlzaXplX3Qgc2l6ZSA9IGxlMzJfdG9fY3B1KGhlcmUtPmVfdmFsdWVfc2l6ZSk7CisKKwkJCWlmIChsZTE2X3RvX2NwdShoZXJlLT5lX3ZhbHVlX29mZnMpICsgc2l6ZSA+IAorCQkJICAgIHNiLT5zX2Jsb2Nrc2l6ZSB8fCBzaXplID4gc2ItPnNfYmxvY2tzaXplKQorCQkJCWdvdG8gYmFkX2Jsb2NrOworCQkJZnJlZSArPSBFWFQyX1hBVFRSX1NJWkUoc2l6ZSk7CisJCX0KKwkJZnJlZSArPSBFWFQyX1hBVFRSX0xFTihuYW1lX2xlbik7CisJfQorCWVycm9yID0gLUVOT1NQQzsKKwlpZiAoZnJlZSA8IEVYVDJfWEFUVFJfTEVOKG5hbWVfbGVuKSArIEVYVDJfWEFUVFJfU0laRSh2YWx1ZV9sZW4pKQorCQlnb3RvIGNsZWFudXA7CisKKwkvKiBIZXJlIHdlIGtub3cgdGhhdCB3ZSBjYW4gc2V0IHRoZSBuZXcgYXR0cmlidXRlLiAqLworCisJaWYgKGhlYWRlcikgeworCQlzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlOworCisJCS8qIGFzc2VydChoZWFkZXIgPT0gSERSKGJoKSk7ICovCisJCWNlID0gbWJfY2FjaGVfZW50cnlfZ2V0KGV4dDJfeGF0dHJfY2FjaGUsIGJoLT5iX2JkZXYsCisJCQkJCWJoLT5iX2Jsb2NrbnIpOworCQlsb2NrX2J1ZmZlcihiaCk7CisJCWlmIChoZWFkZXItPmhfcmVmY291bnQgPT0gY3B1X3RvX2xlMzIoMSkpIHsKKwkJCWVhX2JkZWJ1ZyhiaCwgIm1vZGlmeWluZyBpbi1wbGFjZSIpOworCQkJaWYgKGNlKQorCQkJCW1iX2NhY2hlX2VudHJ5X2ZyZWUoY2UpOworCQkJLyoga2VlcCB0aGUgYnVmZmVyIGxvY2tlZCB3aGlsZSBtb2RpZnlpbmcgaXQuICovCisJCX0gZWxzZSB7CisJCQlpbnQgb2Zmc2V0OworCisJCQlpZiAoY2UpCisJCQkJbWJfY2FjaGVfZW50cnlfcmVsZWFzZShjZSk7CisJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJCWVhX2JkZWJ1ZyhiaCwgImNsb25pbmciKTsKKwkJCWhlYWRlciA9IGttYWxsb2MoYmgtPmJfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQllcnJvciA9IC1FTk9NRU07CisJCQlpZiAoaGVhZGVyID09IE5VTEwpCisJCQkJZ290byBjbGVhbnVwOworCQkJbWVtY3B5KGhlYWRlciwgSERSKGJoKSwgYmgtPmJfc2l6ZSk7CisJCQloZWFkZXItPmhfcmVmY291bnQgPSBjcHVfdG9fbGUzMigxKTsKKworCQkJb2Zmc2V0ID0gKGNoYXIgKiloZXJlIC0gYmgtPmJfZGF0YTsKKwkJCWhlcmUgPSBFTlRSWSgoY2hhciAqKWhlYWRlciArIG9mZnNldCk7CisJCQlvZmZzZXQgPSAoY2hhciAqKWxhc3QgLSBiaC0+Yl9kYXRhOworCQkJbGFzdCA9IEVOVFJZKChjaGFyICopaGVhZGVyICsgb2Zmc2V0KTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEFsbG9jYXRlIGEgYnVmZmVyIHdoZXJlIHdlIGNvbnN0cnVjdCB0aGUgbmV3IGJsb2NrLiAqLworCQloZWFkZXIgPSBrbWFsbG9jKHNiLT5zX2Jsb2Nrc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWVycm9yID0gLUVOT01FTTsKKwkJaWYgKGhlYWRlciA9PSBOVUxMKQorCQkJZ290byBjbGVhbnVwOworCQltZW1zZXQoaGVhZGVyLCAwLCBzYi0+c19ibG9ja3NpemUpOworCQllbmQgPSAoY2hhciAqKWhlYWRlciArIHNiLT5zX2Jsb2Nrc2l6ZTsKKwkJaGVhZGVyLT5oX21hZ2ljID0gY3B1X3RvX2xlMzIoRVhUMl9YQVRUUl9NQUdJQyk7CisJCWhlYWRlci0+aF9ibG9ja3MgPSBoZWFkZXItPmhfcmVmY291bnQgPSBjcHVfdG9fbGUzMigxKTsKKwkJbGFzdCA9IGhlcmUgPSBFTlRSWShoZWFkZXIrMSk7CisJfQorCisJLyogSWZmIHdlIGFyZSBtb2RpZnlpbmcgdGhlIGJsb2NrIGluLXBsYWNlLCBiaCBpcyBsb2NrZWQgaGVyZS4gKi8KKworCWlmIChub3RfZm91bmQpIHsKKwkJLyogSW5zZXJ0IHRoZSBuZXcgbmFtZS4gKi8KKwkJc2l6ZV90IHNpemUgPSBFWFQyX1hBVFRSX0xFTihuYW1lX2xlbik7CisJCXNpemVfdCByZXN0ID0gKGNoYXIgKilsYXN0IC0gKGNoYXIgKiloZXJlOworCQltZW1tb3ZlKChjaGFyICopaGVyZSArIHNpemUsIGhlcmUsIHJlc3QpOworCQltZW1zZXQoaGVyZSwgMCwgc2l6ZSk7CisJCWhlcmUtPmVfbmFtZV9pbmRleCA9IG5hbWVfaW5kZXg7CisJCWhlcmUtPmVfbmFtZV9sZW4gPSBuYW1lX2xlbjsKKwkJbWVtY3B5KGhlcmUtPmVfbmFtZSwgbmFtZSwgbmFtZV9sZW4pOworCX0gZWxzZSB7CisJCWlmICghaGVyZS0+ZV92YWx1ZV9ibG9jayAmJiBoZXJlLT5lX3ZhbHVlX3NpemUpIHsKKwkJCWNoYXIgKmZpcnN0X3ZhbCA9IChjaGFyICopaGVhZGVyICsgbWluX29mZnM7CisJCQlzaXplX3Qgb2ZmcyA9IGxlMTZfdG9fY3B1KGhlcmUtPmVfdmFsdWVfb2Zmcyk7CisJCQljaGFyICp2YWwgPSAoY2hhciAqKWhlYWRlciArIG9mZnM7CisJCQlzaXplX3Qgc2l6ZSA9IEVYVDJfWEFUVFJfU0laRSgKKwkJCQlsZTMyX3RvX2NwdShoZXJlLT5lX3ZhbHVlX3NpemUpKTsKKworCQkJaWYgKHNpemUgPT0gRVhUMl9YQVRUUl9TSVpFKHZhbHVlX2xlbikpIHsKKwkJCQkvKiBUaGUgb2xkIGFuZCB0aGUgbmV3IHZhbHVlIGhhdmUgdGhlIHNhbWUKKwkJCQkgICBzaXplLiBKdXN0IHJlcGxhY2UuICovCisJCQkJaGVyZS0+ZV92YWx1ZV9zaXplID0gY3B1X3RvX2xlMzIodmFsdWVfbGVuKTsKKwkJCQltZW1zZXQodmFsICsgc2l6ZSAtIEVYVDJfWEFUVFJfUEFELCAwLAorCQkJCSAgICAgICBFWFQyX1hBVFRSX1BBRCk7IC8qIENsZWFyIHBhZCBieXRlcy4gKi8KKwkJCQltZW1jcHkodmFsLCB2YWx1ZSwgdmFsdWVfbGVuKTsKKwkJCQlnb3RvIHNraXBfcmVwbGFjZTsKKwkJCX0KKworCQkJLyogUmVtb3ZlIHRoZSBvbGQgdmFsdWUuICovCisJCQltZW1tb3ZlKGZpcnN0X3ZhbCArIHNpemUsIGZpcnN0X3ZhbCwgdmFsIC0gZmlyc3RfdmFsKTsKKwkJCW1lbXNldChmaXJzdF92YWwsIDAsIHNpemUpOworCQkJaGVyZS0+ZV92YWx1ZV9vZmZzID0gMDsKKwkJCW1pbl9vZmZzICs9IHNpemU7CisKKwkJCS8qIEFkanVzdCBhbGwgdmFsdWUgb2Zmc2V0cy4gKi8KKwkJCWxhc3QgPSBFTlRSWShoZWFkZXIrMSk7CisJCQl3aGlsZSAoIUlTX0xBU1RfRU5UUlkobGFzdCkpIHsKKwkJCQlzaXplX3QgbyA9IGxlMTZfdG9fY3B1KGxhc3QtPmVfdmFsdWVfb2Zmcyk7CisJCQkJaWYgKCFsYXN0LT5lX3ZhbHVlX2Jsb2NrICYmIG8gPCBvZmZzKQorCQkJCQlsYXN0LT5lX3ZhbHVlX29mZnMgPQorCQkJCQkJY3B1X3RvX2xlMTYobyArIHNpemUpOworCQkJCWxhc3QgPSBFWFQyX1hBVFRSX05FWFQobGFzdCk7CisJCQl9CisJCX0KKwkJaWYgKHZhbHVlID09IE5VTEwpIHsKKwkJCS8qIFJlbW92ZSB0aGUgb2xkIG5hbWUuICovCisJCQlzaXplX3Qgc2l6ZSA9IEVYVDJfWEFUVFJfTEVOKG5hbWVfbGVuKTsKKwkJCWxhc3QgPSBFTlRSWSgoY2hhciAqKWxhc3QgLSBzaXplKTsKKwkJCW1lbW1vdmUoaGVyZSwgKGNoYXIqKWhlcmUgKyBzaXplLAorCQkJCShjaGFyKilsYXN0IC0gKGNoYXIqKWhlcmUpOworCQkJbWVtc2V0KGxhc3QsIDAsIHNpemUpOworCQl9CisJfQorCisJaWYgKHZhbHVlICE9IE5VTEwpIHsKKwkJLyogSW5zZXJ0IHRoZSBuZXcgdmFsdWUuICovCisJCWhlcmUtPmVfdmFsdWVfc2l6ZSA9IGNwdV90b19sZTMyKHZhbHVlX2xlbik7CisJCWlmICh2YWx1ZV9sZW4pIHsKKwkJCXNpemVfdCBzaXplID0gRVhUMl9YQVRUUl9TSVpFKHZhbHVlX2xlbik7CisJCQljaGFyICp2YWwgPSAoY2hhciAqKWhlYWRlciArIG1pbl9vZmZzIC0gc2l6ZTsKKwkJCWhlcmUtPmVfdmFsdWVfb2ZmcyA9CisJCQkJY3B1X3RvX2xlMTYoKGNoYXIgKil2YWwgLSAoY2hhciAqKWhlYWRlcik7CisJCQltZW1zZXQodmFsICsgc2l6ZSAtIEVYVDJfWEFUVFJfUEFELCAwLAorCQkJICAgICAgIEVYVDJfWEFUVFJfUEFEKTsgLyogQ2xlYXIgdGhlIHBhZCBieXRlcy4gKi8KKwkJCW1lbWNweSh2YWwsIHZhbHVlLCB2YWx1ZV9sZW4pOworCQl9CisJfQorCitza2lwX3JlcGxhY2U6CisJaWYgKElTX0xBU1RfRU5UUlkoRU5UUlkoaGVhZGVyKzEpKSkgeworCQkvKiBUaGlzIGJsb2NrIGlzIG5vdyBlbXB0eS4gKi8KKwkJaWYgKGJoICYmIGhlYWRlciA9PSBIRFIoYmgpKQorCQkJdW5sb2NrX2J1ZmZlcihiaCk7ICAvKiB3ZSB3ZXJlIG1vZGlmeWluZyBpbi1wbGFjZS4gKi8KKwkJZXJyb3IgPSBleHQyX3hhdHRyX3NldDIoaW5vZGUsIGJoLCBOVUxMKTsKKwl9IGVsc2UgeworCQlleHQyX3hhdHRyX3JlaGFzaChoZWFkZXIsIGhlcmUpOworCQlpZiAoYmggJiYgaGVhZGVyID09IEhEUihiaCkpCisJCQl1bmxvY2tfYnVmZmVyKGJoKTsgIC8qIHdlIHdlcmUgbW9kaWZ5aW5nIGluLXBsYWNlLiAqLworCQllcnJvciA9IGV4dDJfeGF0dHJfc2V0Mihpbm9kZSwgYmgsIGhlYWRlcik7CisJfQorCitjbGVhbnVwOgorCWJyZWxzZShiaCk7CisJaWYgKCEoYmggJiYgaGVhZGVyID09IEhEUihiaCkpKQorCQlrZnJlZShoZWFkZXIpOworCXVwX3dyaXRlKCZFWFQyX0koaW5vZGUpLT54YXR0cl9zZW0pOworCisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogU2Vjb25kIGhhbGYgb2YgZXh0Ml94YXR0cl9zZXQoKTogVXBkYXRlIHRoZSBmaWxlIHN5c3RlbS4KKyAqLworc3RhdGljIGludAorZXh0Ml94YXR0cl9zZXQyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqb2xkX2JoLAorCQlzdHJ1Y3QgZXh0Ml94YXR0cl9oZWFkZXIgKmhlYWRlcikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXdfYmggPSBOVUxMOworCWludCBlcnJvcjsKKworCWlmIChoZWFkZXIpIHsKKwkJbmV3X2JoID0gZXh0Ml94YXR0cl9jYWNoZV9maW5kKGlub2RlLCBoZWFkZXIpOworCQlpZiAobmV3X2JoKSB7CisJCQkvKiBXZSBmb3VuZCBhbiBpZGVudGljYWwgYmxvY2sgaW4gdGhlIGNhY2hlLiAqLworCQkJaWYgKG5ld19iaCA9PSBvbGRfYmgpIHsKKwkJCQllYV9iZGVidWcobmV3X2JoLCAia2VlcGluZyB0aGlzIGJsb2NrIik7CisJCQl9IGVsc2UgeworCQkJCS8qIFRoZSBvbGQgYmxvY2sgaXMgcmVsZWFzZWQgYWZ0ZXIgdXBkYXRpbmcKKwkJCQkgICB0aGUgaW5vZGUuICAqLworCQkJCWVhX2JkZWJ1ZyhuZXdfYmgsICJyZXVzaW5nIGJsb2NrIik7CisKKwkJCQllcnJvciA9IC1FRFFVT1Q7CisJCQkJaWYgKERRVU9UX0FMTE9DX0JMT0NLKGlub2RlLCAxKSkgeworCQkJCQl1bmxvY2tfYnVmZmVyKG5ld19iaCk7CisJCQkJCWdvdG8gY2xlYW51cDsKKwkJCQl9CisJCQkJSERSKG5ld19iaCktPmhfcmVmY291bnQgPSBjcHVfdG9fbGUzMigxICsKKwkJCQkJbGUzMl90b19jcHUoSERSKG5ld19iaCktPmhfcmVmY291bnQpKTsKKwkJCQllYV9iZGVidWcobmV3X2JoLCAicmVmY291bnQgbm93PSVkIiwKKwkJCQkJbGUzMl90b19jcHUoSERSKG5ld19iaCktPmhfcmVmY291bnQpKTsKKwkJCX0KKwkJCXVubG9ja19idWZmZXIobmV3X2JoKTsKKwkJfSBlbHNlIGlmIChvbGRfYmggJiYgaGVhZGVyID09IEhEUihvbGRfYmgpKSB7CisJCQkvKiBLZWVwIHRoaXMgYmxvY2suIE5vIG5lZWQgdG8gbG9jayB0aGUgYmxvY2sgYXMgd2UKKwkJCSAgIGRvbid0IG5lZWQgdG8gY2hhbmdlIHRoZSByZWZlcmVuY2UgY291bnQuICovCisJCQluZXdfYmggPSBvbGRfYmg7CisJCQlnZXRfYmgobmV3X2JoKTsKKwkJCWV4dDJfeGF0dHJfY2FjaGVfaW5zZXJ0KG5ld19iaCk7CisJCX0gZWxzZSB7CisJCQkvKiBXZSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrICovCisJCQlpbnQgZ29hbCA9IGxlMzJfdG9fY3B1KEVYVDJfU0Ioc2IpLT5zX2VzLT4KKwkJCQkJCSAgICAgICAgICAgc19maXJzdF9kYXRhX2Jsb2NrKSArCisJCQkJICAgRVhUMl9JKGlub2RlKS0+aV9ibG9ja19ncm91cCAqCisJCQkJICAgRVhUMl9CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwkJCWludCBibG9jayA9IGV4dDJfbmV3X2Jsb2NrKGlub2RlLCBnb2FsLAorCQkJCQkJICAgTlVMTCwgTlVMTCwgJmVycm9yKTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGNsZWFudXA7CisJCQllYV9pZGVidWcoaW5vZGUsICJjcmVhdGluZyBibG9jayAlZCIsIGJsb2NrKTsKKworCQkJbmV3X2JoID0gc2JfZ2V0YmxrKHNiLCBibG9jayk7CisJCQlpZiAoIW5ld19iaCkgeworCQkJCWV4dDJfZnJlZV9ibG9ja3MoaW5vZGUsIGJsb2NrLCAxKTsKKwkJCQllcnJvciA9IC1FSU87CisJCQkJZ290byBjbGVhbnVwOworCQkJfQorCQkJbG9ja19idWZmZXIobmV3X2JoKTsKKwkJCW1lbWNweShuZXdfYmgtPmJfZGF0YSwgaGVhZGVyLCBuZXdfYmgtPmJfc2l6ZSk7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKG5ld19iaCk7CisJCQl1bmxvY2tfYnVmZmVyKG5ld19iaCk7CisJCQlleHQyX3hhdHRyX2NhY2hlX2luc2VydChuZXdfYmgpOworCQkJCisJCQlleHQyX3hhdHRyX3VwZGF0ZV9zdXBlcl9ibG9jayhzYik7CisJCX0KKwkJbWFya19idWZmZXJfZGlydHkobmV3X2JoKTsKKwkJaWYgKElTX1NZTkMoaW5vZGUpKSB7CisJCQlzeW5jX2RpcnR5X2J1ZmZlcihuZXdfYmgpOworCQkJZXJyb3IgPSAtRUlPOworCQkJaWYgKGJ1ZmZlcl9yZXEobmV3X2JoKSAmJiAhYnVmZmVyX3VwdG9kYXRlKG5ld19iaCkpCisJCQkJZ290byBjbGVhbnVwOworCQl9CisJfQorCisJLyogVXBkYXRlIHRoZSBpbm9kZS4gKi8KKwlFWFQyX0koaW5vZGUpLT5pX2ZpbGVfYWNsID0gbmV3X2JoID8gbmV3X2JoLT5iX2Jsb2NrbnIgOiAwOworCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpZiAoSVNfU1lOQyhpbm9kZSkpIHsKKwkJZXJyb3IgPSBleHQyX3N5bmNfaW5vZGUgKGlub2RlKTsKKwkJLyogSW4gY2FzZSBzeW5jIGZhaWxlZCBkdWUgdG8gRU5PU1BDIHRoZSBpbm9kZSB3YXMgYWN0dWFsbHkKKwkJICogd3JpdHRlbiAob25seSBzb21lIGRpcnR5IGRhdGEgd2VyZSBub3QpIHNvIHdlIGp1c3QgcHJvY2VlZAorCQkgKiBhcyBpZiBub3RoaW5nIGhhcHBlbmVkIGFuZCBjbGVhbnVwIHRoZSB1bnVzZWQgYmxvY2sgKi8KKwkJaWYgKGVycm9yICYmIGVycm9yICE9IC1FTk9TUEMpIHsKKwkJCWlmIChuZXdfYmggJiYgbmV3X2JoICE9IG9sZF9iaCkKKwkJCQlEUVVPVF9GUkVFX0JMT0NLKGlub2RlLCAxKTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCX0gZWxzZQorCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKworCWVycm9yID0gMDsKKwlpZiAob2xkX2JoICYmIG9sZF9iaCAhPSBuZXdfYmgpIHsKKwkJc3RydWN0IG1iX2NhY2hlX2VudHJ5ICpjZTsKKworCQkvKgorCQkgKiBJZiB0aGVyZSB3YXMgYW4gb2xkIGJsb2NrIGFuZCB3ZSBhcmUgbm8gbG9uZ2VyIHVzaW5nIGl0LAorCQkgKiByZWxlYXNlIHRoZSBvbGQgYmxvY2suCisJCSAqLworCQljZSA9IG1iX2NhY2hlX2VudHJ5X2dldChleHQyX3hhdHRyX2NhY2hlLCBvbGRfYmgtPmJfYmRldiwKKwkJCQkJb2xkX2JoLT5iX2Jsb2NrbnIpOworCQlsb2NrX2J1ZmZlcihvbGRfYmgpOworCQlpZiAoSERSKG9sZF9iaCktPmhfcmVmY291bnQgPT0gY3B1X3RvX2xlMzIoMSkpIHsKKwkJCS8qIEZyZWUgdGhlIG9sZCBibG9jay4gKi8KKwkJCWlmIChjZSkKKwkJCQltYl9jYWNoZV9lbnRyeV9mcmVlKGNlKTsKKwkJCWVhX2JkZWJ1ZyhvbGRfYmgsICJmcmVlaW5nIik7CisJCQlleHQyX2ZyZWVfYmxvY2tzKGlub2RlLCBvbGRfYmgtPmJfYmxvY2tuciwgMSk7CisJCQkvKiBXZSBsZXQgb3VyIGNhbGxlciByZWxlYXNlIG9sZF9iaCwgc28gd2UKKwkJCSAqIG5lZWQgdG8gZHVwbGljYXRlIHRoZSBidWZmZXIgYmVmb3JlLiAqLworCQkJZ2V0X2JoKG9sZF9iaCk7CisJCQliZm9yZ2V0KG9sZF9iaCk7CisJCX0gZWxzZSB7CisJCQkvKiBEZWNyZW1lbnQgdGhlIHJlZmNvdW50IG9ubHkuICovCisJCQlIRFIob2xkX2JoKS0+aF9yZWZjb3VudCA9IGNwdV90b19sZTMyKAorCQkJCWxlMzJfdG9fY3B1KEhEUihvbGRfYmgpLT5oX3JlZmNvdW50KSAtIDEpOworCQkJaWYgKGNlKQorCQkJCW1iX2NhY2hlX2VudHJ5X3JlbGVhc2UoY2UpOworCQkJRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgMSk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShvbGRfYmgpOworCQkJZWFfYmRlYnVnKG9sZF9iaCwgInJlZmNvdW50IG5vdz0lZCIsCisJCQkJbGUzMl90b19jcHUoSERSKG9sZF9iaCktPmhfcmVmY291bnQpKTsKKwkJfQorCQl1bmxvY2tfYnVmZmVyKG9sZF9iaCk7CisJfQorCitjbGVhbnVwOgorCWJyZWxzZShuZXdfYmgpOworCisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogZXh0Ml94YXR0cl9kZWxldGVfaW5vZGUoKQorICoKKyAqIEZyZWUgZXh0ZW5kZWQgYXR0cmlidXRlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbm9kZS4gVGhpcworICogaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBhbiBpbm9kZSBpcyBmcmVlZC4KKyAqLwordm9pZAorZXh0Ml94YXR0cl9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlOworCisJZG93bl93cml0ZSgmRVhUMl9JKGlub2RlKS0+eGF0dHJfc2VtKTsKKwlpZiAoIUVYVDJfSShpbm9kZSktPmlfZmlsZV9hY2wpCisJCWdvdG8gY2xlYW51cDsKKwliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBFWFQyX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKKwlpZiAoIWJoKSB7CisJCWV4dDJfZXJyb3IoaW5vZGUtPmlfc2IsICJleHQyX3hhdHRyX2RlbGV0ZV9pbm9kZSIsCisJCQkiaW5vZGUgJWxkOiBibG9jayAlZCByZWFkIGVycm9yIiwgaW5vZGUtPmlfaW5vLAorCQkJRVhUMl9JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisJZWFfYmRlYnVnKGJoLCAiYl9jb3VudD0lZCIsIGF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSk7CisJaWYgKEhEUihiaCktPmhfbWFnaWMgIT0gY3B1X3RvX2xlMzIoRVhUMl9YQVRUUl9NQUdJQykgfHwKKwkgICAgSERSKGJoKS0+aF9ibG9ja3MgIT0gY3B1X3RvX2xlMzIoMSkpIHsKKwkJZXh0Ml9lcnJvcihpbm9kZS0+aV9zYiwgImV4dDJfeGF0dHJfZGVsZXRlX2lub2RlIiwKKwkJCSJpbm9kZSAlbGQ6IGJhZCBibG9jayAlZCIsIGlub2RlLT5pX2lubywKKwkJCUVYVDJfSShpbm9kZSktPmlfZmlsZV9hY2wpOworCQlnb3RvIGNsZWFudXA7CisJfQorCWNlID0gbWJfY2FjaGVfZW50cnlfZ2V0KGV4dDJfeGF0dHJfY2FjaGUsIGJoLT5iX2JkZXYsIGJoLT5iX2Jsb2NrbnIpOworCWxvY2tfYnVmZmVyKGJoKTsKKwlpZiAoSERSKGJoKS0+aF9yZWZjb3VudCA9PSBjcHVfdG9fbGUzMigxKSkgeworCQlpZiAoY2UpCisJCQltYl9jYWNoZV9lbnRyeV9mcmVlKGNlKTsKKwkJZXh0Ml9mcmVlX2Jsb2Nrcyhpbm9kZSwgRVhUMl9JKGlub2RlKS0+aV9maWxlX2FjbCwgMSk7CisJCWdldF9iaChiaCk7CisJCWJmb3JnZXQoYmgpOworCX0gZWxzZSB7CisJCUhEUihiaCktPmhfcmVmY291bnQgPSBjcHVfdG9fbGUzMigKKwkJCWxlMzJfdG9fY3B1KEhEUihiaCktPmhfcmVmY291bnQpIC0gMSk7CisJCWlmIChjZSkKKwkJCW1iX2NhY2hlX2VudHJ5X3JlbGVhc2UoY2UpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCWlmIChJU19TWU5DKGlub2RlKSkKKwkJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwkJRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgMSk7CisJfQorCWVhX2JkZWJ1ZyhiaCwgInJlZmNvdW50IG5vdz0lZCIsIGxlMzJfdG9fY3B1KEhEUihiaCktPmhfcmVmY291bnQpIC0gMSk7CisJdW5sb2NrX2J1ZmZlcihiaCk7CisJRVhUMl9JKGlub2RlKS0+aV9maWxlX2FjbCA9IDA7CisKK2NsZWFudXA6CisJYnJlbHNlKGJoKTsKKwl1cF93cml0ZSgmRVhUMl9JKGlub2RlKS0+eGF0dHJfc2VtKTsKK30KKworLyoKKyAqIGV4dDJfeGF0dHJfcHV0X3N1cGVyKCkKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgZmlsZSBzeXN0ZW0gaXMgdW5tb3VudGVkLgorICovCit2b2lkCitleHQyX3hhdHRyX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCW1iX2NhY2hlX3NocmluayhleHQyX3hhdHRyX2NhY2hlLCBzYi0+c19iZGV2KTsKK30KKworCisvKgorICogZXh0Ml94YXR0cl9jYWNoZV9pbnNlcnQoKQorICoKKyAqIENyZWF0ZSBhIG5ldyBlbnRyeSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGNhY2hlLCBhbmQgaW5zZXJ0CisgKiBpdCB1bmxlc3Mgc3VjaCBhbiBlbnRyeSBpcyBhbHJlYWR5IGluIHRoZSBjYWNoZS4KKyAqCisgKiBSZXR1cm5zIDAsIG9yIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfY2FjaGVfaW5zZXJ0KHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJX191MzIgaGFzaCA9IGxlMzJfdG9fY3B1KEhEUihiaCktPmhfaGFzaCk7CisJc3RydWN0IG1iX2NhY2hlX2VudHJ5ICpjZTsKKwlpbnQgZXJyb3I7CisKKwljZSA9IG1iX2NhY2hlX2VudHJ5X2FsbG9jKGV4dDJfeGF0dHJfY2FjaGUpOworCWlmICghY2UpCisJCXJldHVybiAtRU5PTUVNOworCWVycm9yID0gbWJfY2FjaGVfZW50cnlfaW5zZXJ0KGNlLCBiaC0+Yl9iZGV2LCBiaC0+Yl9ibG9ja25yLCAmaGFzaCk7CisJaWYgKGVycm9yKSB7CisJCW1iX2NhY2hlX2VudHJ5X2ZyZWUoY2UpOworCQlpZiAoZXJyb3IgPT0gLUVCVVNZKSB7CisJCQllYV9iZGVidWcoYmgsICJhbHJlYWR5IGluIGNhY2hlICglZCBjYWNoZSBlbnRyaWVzKSIsCisJCQkJYXRvbWljX3JlYWQoJmV4dDJfeGF0dHJfY2FjaGUtPmNfZW50cnlfY291bnQpKTsKKwkJCWVycm9yID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCWVhX2JkZWJ1ZyhiaCwgImluc2VydGluZyBbJXhdICglZCBjYWNoZSBlbnRyaWVzKSIsIChpbnQpaGFzaCwKKwkJCSAgYXRvbWljX3JlYWQoJmV4dDJfeGF0dHJfY2FjaGUtPmNfZW50cnlfY291bnQpKTsKKwkJbWJfY2FjaGVfZW50cnlfcmVsZWFzZShjZSk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIGV4dDJfeGF0dHJfY21wKCkKKyAqCisgKiBDb21wYXJlIHR3byBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2tzIGZvciBlcXVhbGl0eS4KKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlIGJsb2NrcyBhcmUgZXF1YWwsIDEgaWYgdGhleSBkaWZmZXIsIGFuZAorICogYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb24gZXJyb3JzLgorICovCitzdGF0aWMgaW50CitleHQyX3hhdHRyX2NtcChzdHJ1Y3QgZXh0Ml94YXR0cl9oZWFkZXIgKmhlYWRlcjEsCisJICAgICAgIHN0cnVjdCBleHQyX3hhdHRyX2hlYWRlciAqaGVhZGVyMikKK3sKKwlzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSAqZW50cnkxLCAqZW50cnkyOworCisJZW50cnkxID0gRU5UUlkoaGVhZGVyMSsxKTsKKwllbnRyeTIgPSBFTlRSWShoZWFkZXIyKzEpOworCXdoaWxlICghSVNfTEFTVF9FTlRSWShlbnRyeTEpKSB7CisJCWlmIChJU19MQVNUX0VOVFJZKGVudHJ5MikpCisJCQlyZXR1cm4gMTsKKwkJaWYgKGVudHJ5MS0+ZV9oYXNoICE9IGVudHJ5Mi0+ZV9oYXNoIHx8CisJCSAgICBlbnRyeTEtPmVfbmFtZV9pbmRleCAhPSBlbnRyeTItPmVfbmFtZV9pbmRleCB8fAorCQkgICAgZW50cnkxLT5lX25hbWVfbGVuICE9IGVudHJ5Mi0+ZV9uYW1lX2xlbiB8fAorCQkgICAgZW50cnkxLT5lX3ZhbHVlX3NpemUgIT0gZW50cnkyLT5lX3ZhbHVlX3NpemUgfHwKKwkJICAgIG1lbWNtcChlbnRyeTEtPmVfbmFtZSwgZW50cnkyLT5lX25hbWUsIGVudHJ5MS0+ZV9uYW1lX2xlbikpCisJCQlyZXR1cm4gMTsKKwkJaWYgKGVudHJ5MS0+ZV92YWx1ZV9ibG9jayAhPSAwIHx8IGVudHJ5Mi0+ZV92YWx1ZV9ibG9jayAhPSAwKQorCQkJcmV0dXJuIC1FSU87CisJCWlmIChtZW1jbXAoKGNoYXIgKiloZWFkZXIxICsgbGUxNl90b19jcHUoZW50cnkxLT5lX3ZhbHVlX29mZnMpLAorCQkJICAgKGNoYXIgKiloZWFkZXIyICsgbGUxNl90b19jcHUoZW50cnkyLT5lX3ZhbHVlX29mZnMpLAorCQkJICAgbGUzMl90b19jcHUoZW50cnkxLT5lX3ZhbHVlX3NpemUpKSkKKwkJCXJldHVybiAxOworCisJCWVudHJ5MSA9IEVYVDJfWEFUVFJfTkVYVChlbnRyeTEpOworCQllbnRyeTIgPSBFWFQyX1hBVFRSX05FWFQoZW50cnkyKTsKKwl9CisJaWYgKCFJU19MQVNUX0VOVFJZKGVudHJ5MikpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKgorICogZXh0Ml94YXR0cl9jYWNoZV9maW5kKCkKKyAqCisgKiBGaW5kIGFuIGlkZW50aWNhbCBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2suCisgKgorICogUmV0dXJucyBhIGxvY2tlZCBidWZmZXIgaGVhZCB0byB0aGUgYmxvY2sgZm91bmQsIG9yIE5VTEwgaWYgc3VjaAorICogYSBibG9jayB3YXMgbm90IGZvdW5kIG9yIGFuIGVycm9yIG9jY3VycmVkLgorICovCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK2V4dDJfeGF0dHJfY2FjaGVfZmluZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0Ml94YXR0cl9oZWFkZXIgKmhlYWRlcikKK3sKKwlfX3UzMiBoYXNoID0gbGUzMl90b19jcHUoaGVhZGVyLT5oX2hhc2gpOworCXN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqY2U7CisKKwlpZiAoIWhlYWRlci0+aF9oYXNoKQorCQlyZXR1cm4gTlVMTDsgIC8qIG5ldmVyIHNoYXJlICovCisJZWFfaWRlYnVnKGlub2RlLCAibG9va2luZyBmb3IgY2FjaGVkIGJsb2NrcyBbJXhdIiwgKGludCloYXNoKTsKK2FnYWluOgorCWNlID0gbWJfY2FjaGVfZW50cnlfZmluZF9maXJzdChleHQyX3hhdHRyX2NhY2hlLCAwLAorCQkJCSAgICAgICBpbm9kZS0+aV9zYi0+c19iZGV2LCBoYXNoKTsKKwl3aGlsZSAoY2UpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCQlpZiAoSVNfRVJSKGNlKSkgeworCQkJaWYgKFBUUl9FUlIoY2UpID09IC1FQUdBSU4pCisJCQkJZ290byBhZ2FpbjsKKwkJCWJyZWFrOworCQl9CisKKwkJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgY2UtPmVfYmxvY2spOworCQlpZiAoIWJoKSB7CisJCQlleHQyX2Vycm9yKGlub2RlLT5pX3NiLCAiZXh0Ml94YXR0cl9jYWNoZV9maW5kIiwKKwkJCQkiaW5vZGUgJWxkOiBibG9jayAlbGQgcmVhZCBlcnJvciIsCisJCQkJaW5vZGUtPmlfaW5vLCAodW5zaWduZWQgbG9uZykgY2UtPmVfYmxvY2spOworCQl9IGVsc2UgeworCQkJbG9ja19idWZmZXIoYmgpOworCQkJaWYgKGxlMzJfdG9fY3B1KEhEUihiaCktPmhfcmVmY291bnQpID4KKwkJCQkgICBFWFQyX1hBVFRSX1JFRkNPVU5UX01BWCkgeworCQkJCWVhX2lkZWJ1Zyhpbm9kZSwgImJsb2NrICVsZCByZWZjb3VudCAlZD4lZCIsCisJCQkJCSAgKHVuc2lnbmVkIGxvbmcpIGNlLT5lX2Jsb2NrLAorCQkJCQkgIGxlMzJfdG9fY3B1KEhEUihiaCktPmhfcmVmY291bnQpLAorCQkJCQkgIEVYVDJfWEFUVFJfUkVGQ09VTlRfTUFYKTsKKwkJCX0gZWxzZSBpZiAoIWV4dDJfeGF0dHJfY21wKGhlYWRlciwgSERSKGJoKSkpIHsKKwkJCQllYV9iZGVidWcoYmgsICJiX2NvdW50PSVkIiwKKwkJCQkJICBhdG9taWNfcmVhZCgmKGJoLT5iX2NvdW50KSkpOworCQkJCW1iX2NhY2hlX2VudHJ5X3JlbGVhc2UoY2UpOworCQkJCXJldHVybiBiaDsKKwkJCX0KKwkJCXVubG9ja19idWZmZXIoYmgpOworCQkJYnJlbHNlKGJoKTsKKwkJfQorCQljZSA9IG1iX2NhY2hlX2VudHJ5X2ZpbmRfbmV4dChjZSwgMCwgaW5vZGUtPmlfc2ItPnNfYmRldiwgaGFzaCk7CisJfQorCXJldHVybiBOVUxMOworfQorCisjZGVmaW5lIE5BTUVfSEFTSF9TSElGVCA1CisjZGVmaW5lIFZBTFVFX0hBU0hfU0hJRlQgMTYKKworLyoKKyAqIGV4dDJfeGF0dHJfaGFzaF9lbnRyeSgpCisgKgorICogQ29tcHV0ZSB0aGUgaGFzaCBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQyX3hhdHRyX2hhc2hfZW50cnkoc3RydWN0IGV4dDJfeGF0dHJfaGVhZGVyICpoZWFkZXIsCisJCQkJCSBzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSAqZW50cnkpCit7CisJX191MzIgaGFzaCA9IDA7CisJY2hhciAqbmFtZSA9IGVudHJ5LT5lX25hbWU7CisJaW50IG47CisKKwlmb3IgKG49MDsgbiA8IGVudHJ5LT5lX25hbWVfbGVuOyBuKyspIHsKKwkJaGFzaCA9IChoYXNoIDw8IE5BTUVfSEFTSF9TSElGVCkgXgorCQkgICAgICAgKGhhc2ggPj4gKDgqc2l6ZW9mKGhhc2gpIC0gTkFNRV9IQVNIX1NISUZUKSkgXgorCQkgICAgICAgKm5hbWUrKzsKKwl9CisKKwlpZiAoZW50cnktPmVfdmFsdWVfYmxvY2sgPT0gMCAmJiBlbnRyeS0+ZV92YWx1ZV9zaXplICE9IDApIHsKKwkJX19sZTMyICp2YWx1ZSA9IChfX2xlMzIgKikoKGNoYXIgKiloZWFkZXIgKworCQkJbGUxNl90b19jcHUoZW50cnktPmVfdmFsdWVfb2ZmcykpOworCQlmb3IgKG4gPSAobGUzMl90b19jcHUoZW50cnktPmVfdmFsdWVfc2l6ZSkgKworCQkgICAgIEVYVDJfWEFUVFJfUk9VTkQpID4+IEVYVDJfWEFUVFJfUEFEX0JJVFM7IG47IG4tLSkgeworCQkJaGFzaCA9IChoYXNoIDw8IFZBTFVFX0hBU0hfU0hJRlQpIF4KKwkJCSAgICAgICAoaGFzaCA+PiAoOCpzaXplb2YoaGFzaCkgLSBWQUxVRV9IQVNIX1NISUZUKSkgXgorCQkJICAgICAgIGxlMzJfdG9fY3B1KCp2YWx1ZSsrKTsKKwkJfQorCX0KKwllbnRyeS0+ZV9oYXNoID0gY3B1X3RvX2xlMzIoaGFzaCk7Cit9CisKKyN1bmRlZiBOQU1FX0hBU0hfU0hJRlQKKyN1bmRlZiBWQUxVRV9IQVNIX1NISUZUCisKKyNkZWZpbmUgQkxPQ0tfSEFTSF9TSElGVCAxNgorCisvKgorICogZXh0Ml94YXR0cl9yZWhhc2goKQorICoKKyAqIFJlLWNvbXB1dGUgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBoYXNoIHZhbHVlIGFmdGVyIGFuIGVudHJ5IGhhcyBjaGFuZ2VkLgorICovCitzdGF0aWMgdm9pZCBleHQyX3hhdHRyX3JlaGFzaChzdHJ1Y3QgZXh0Ml94YXR0cl9oZWFkZXIgKmhlYWRlciwKKwkJCSAgICAgIHN0cnVjdCBleHQyX3hhdHRyX2VudHJ5ICplbnRyeSkKK3sKKwlzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSAqaGVyZTsKKwlfX3UzMiBoYXNoID0gMDsKKwkKKwlleHQyX3hhdHRyX2hhc2hfZW50cnkoaGVhZGVyLCBlbnRyeSk7CisJaGVyZSA9IEVOVFJZKGhlYWRlcisxKTsKKwl3aGlsZSAoIUlTX0xBU1RfRU5UUlkoaGVyZSkpIHsKKwkJaWYgKCFoZXJlLT5lX2hhc2gpIHsKKwkJCS8qIEJsb2NrIGlzIG5vdCBzaGFyZWQgaWYgYW4gZW50cnkncyBoYXNoIHZhbHVlID09IDAgKi8KKwkJCWhhc2ggPSAwOworCQkJYnJlYWs7CisJCX0KKwkJaGFzaCA9IChoYXNoIDw8IEJMT0NLX0hBU0hfU0hJRlQpIF4KKwkJICAgICAgIChoYXNoID4+ICg4KnNpemVvZihoYXNoKSAtIEJMT0NLX0hBU0hfU0hJRlQpKSBeCisJCSAgICAgICBsZTMyX3RvX2NwdShoZXJlLT5lX2hhc2gpOworCQloZXJlID0gRVhUMl9YQVRUUl9ORVhUKGhlcmUpOworCX0KKwloZWFkZXItPmhfaGFzaCA9IGNwdV90b19sZTMyKGhhc2gpOworfQorCisjdW5kZWYgQkxPQ0tfSEFTSF9TSElGVAorCitpbnQgX19pbml0Citpbml0X2V4dDJfeGF0dHIodm9pZCkKK3sKKwlleHQyX3hhdHRyX2NhY2hlID0gbWJfY2FjaGVfY3JlYXRlKCJleHQyX3hhdHRyIiwgTlVMTCwKKwkJc2l6ZW9mKHN0cnVjdCBtYl9jYWNoZV9lbnRyeSkgKworCQlzaXplb2YoKChzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKikgMCktPmVfaW5kZXhlc1swXSksIDEsIDYpOworCWlmICghZXh0Ml94YXR0cl9jYWNoZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2V4aXRfZXh0Ml94YXR0cih2b2lkKQoreworCW1iX2NhY2hlX2Rlc3Ryb3koZXh0Ml94YXR0cl9jYWNoZSk7Cit9CmRpZmYgLS1naXQgYS9mcy9leHQyL3hhdHRyLmggYi9mcy9leHQyL3hhdHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzYmZkZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDIveGF0dHIuaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAgRmlsZTogbGludXgvZXh0Ml94YXR0ci5oCisKKyAgT24tZGlzayBmb3JtYXQgb2YgZXh0ZW5kZWQgYXR0cmlidXRlcyBmb3IgdGhlIGV4dDIgZmlsZXN5c3RlbS4KKworICAoQykgMjAwMSBBbmRyZWFzIEdydWVuYmFjaGVyLCA8YS5ncnVlbmJhY2hlckBjb21wdXRlci5vcmc+CisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CisKKy8qIE1hZ2ljIHZhbHVlIGluIGF0dHJpYnV0ZSBibG9ja3MgKi8KKyNkZWZpbmUgRVhUMl9YQVRUUl9NQUdJQwkJMHhFQTAyMDAwMAorCisvKiBNYXhpbXVtIG51bWJlciBvZiByZWZlcmVuY2VzIHRvIG9uZSBhdHRyaWJ1dGUgYmxvY2sgKi8KKyNkZWZpbmUgRVhUMl9YQVRUUl9SRUZDT1VOVF9NQVgJCTEwMjQKKworLyogTmFtZSBpbmRleGVzICovCisjZGVmaW5lIEVYVDJfWEFUVFJfSU5ERVhfVVNFUgkJCTEKKyNkZWZpbmUgRVhUMl9YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfQUNDRVNTCTIKKyNkZWZpbmUgRVhUMl9YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfREVGQVVMVAkzCisjZGVmaW5lIEVYVDJfWEFUVFJfSU5ERVhfVFJVU1RFRAkJNAorI2RlZmluZQlFWFQyX1hBVFRSX0lOREVYX0xVU1RSRQkJCTUKKyNkZWZpbmUgRVhUMl9YQVRUUl9JTkRFWF9TRUNVUklUWQkgICAgICAgIDYKKworc3RydWN0IGV4dDJfeGF0dHJfaGVhZGVyIHsKKwlfX2xlMzIJaF9tYWdpYzsJLyogbWFnaWMgbnVtYmVyIGZvciBpZGVudGlmaWNhdGlvbiAqLworCV9fbGUzMgloX3JlZmNvdW50OwkvKiByZWZlcmVuY2UgY291bnQgKi8KKwlfX2xlMzIJaF9ibG9ja3M7CS8qIG51bWJlciBvZiBkaXNrIGJsb2NrcyB1c2VkICovCisJX19sZTMyCWhfaGFzaDsJCS8qIGhhc2ggdmFsdWUgb2YgYWxsIGF0dHJpYnV0ZXMgKi8KKwlfX3UzMgloX3Jlc2VydmVkWzRdOwkvKiB6ZXJvIHJpZ2h0IG5vdyAqLworfTsKKworc3RydWN0IGV4dDJfeGF0dHJfZW50cnkgeworCV9fdTgJZV9uYW1lX2xlbjsJLyogbGVuZ3RoIG9mIG5hbWUgKi8KKwlfX3U4CWVfbmFtZV9pbmRleDsJLyogYXR0cmlidXRlIG5hbWUgaW5kZXggKi8KKwlfX2xlMTYJZV92YWx1ZV9vZmZzOwkvKiBvZmZzZXQgaW4gZGlzayBibG9jayBvZiB2YWx1ZSAqLworCV9fbGUzMgllX3ZhbHVlX2Jsb2NrOwkvKiBkaXNrIGJsb2NrIGF0dHJpYnV0ZSBpcyBzdG9yZWQgb24gKG4vaSkgKi8KKwlfX2xlMzIJZV92YWx1ZV9zaXplOwkvKiBzaXplIG9mIGF0dHJpYnV0ZSB2YWx1ZSAqLworCV9fbGUzMgllX2hhc2g7CQkvKiBoYXNoIHZhbHVlIG9mIG5hbWUgYW5kIHZhbHVlICovCisJY2hhcgllX25hbWVbMF07CS8qIGF0dHJpYnV0ZSBuYW1lICovCit9OworCisjZGVmaW5lIEVYVDJfWEFUVFJfUEFEX0JJVFMJCTIKKyNkZWZpbmUgRVhUMl9YQVRUUl9QQUQJCSgxPDxFWFQyX1hBVFRSX1BBRF9CSVRTKQorI2RlZmluZSBFWFQyX1hBVFRSX1JPVU5ECQkoRVhUMl9YQVRUUl9QQUQtMSkKKyNkZWZpbmUgRVhUMl9YQVRUUl9MRU4obmFtZV9sZW4pIFwKKwkoKChuYW1lX2xlbikgKyBFWFQyX1hBVFRSX1JPVU5EICsgXAorCXNpemVvZihzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSkpICYgfkVYVDJfWEFUVFJfUk9VTkQpCisjZGVmaW5lIEVYVDJfWEFUVFJfTkVYVChlbnRyeSkgXAorCSggKHN0cnVjdCBleHQyX3hhdHRyX2VudHJ5ICopKCBcCisJICAoY2hhciAqKShlbnRyeSkgKyBFWFQyX1hBVFRSX0xFTigoZW50cnkpLT5lX25hbWVfbGVuKSkgKQorI2RlZmluZSBFWFQyX1hBVFRSX1NJWkUoc2l6ZSkgXAorCSgoKHNpemUpICsgRVhUMl9YQVRUUl9ST1VORCkgJiB+RVhUMl9YQVRUUl9ST1VORCkKKworIyBpZmRlZiBDT05GSUdfRVhUMl9GU19YQVRUUgorCitleHRlcm4gc3RydWN0IHhhdHRyX2hhbmRsZXIgZXh0Ml94YXR0cl91c2VyX2hhbmRsZXI7CitleHRlcm4gc3RydWN0IHhhdHRyX2hhbmRsZXIgZXh0Ml94YXR0cl90cnVzdGVkX2hhbmRsZXI7CitleHRlcm4gc3RydWN0IHhhdHRyX2hhbmRsZXIgZXh0Ml94YXR0cl9hY2xfYWNjZXNzX2hhbmRsZXI7CitleHRlcm4gc3RydWN0IHhhdHRyX2hhbmRsZXIgZXh0Ml94YXR0cl9hY2xfZGVmYXVsdF9oYW5kbGVyOworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDJfeGF0dHJfc2VjdXJpdHlfaGFuZGxlcjsKKworZXh0ZXJuIHNzaXplX3QgZXh0Ml9saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqLCBjaGFyICosIHNpemVfdCk7CisKK2V4dGVybiBpbnQgZXh0Ml94YXR0cl9nZXQoc3RydWN0IGlub2RlICosIGludCwgY29uc3QgY2hhciAqLCB2b2lkICosIHNpemVfdCk7CitleHRlcm4gaW50IGV4dDJfeGF0dHJfc2V0KHN0cnVjdCBpbm9kZSAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7CisKK2V4dGVybiB2b2lkIGV4dDJfeGF0dHJfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiB2b2lkIGV4dDJfeGF0dHJfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKworZXh0ZXJuIGludCBpbml0X2V4dDJfeGF0dHIodm9pZCk7CitleHRlcm4gdm9pZCBleGl0X2V4dDJfeGF0dHIodm9pZCk7CisKK2V4dGVybiBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqZXh0Ml94YXR0cl9oYW5kbGVyc1tdOworCisjIGVsc2UgIC8qIENPTkZJR19FWFQyX0ZTX1hBVFRSICovCisKK3N0YXRpYyBpbmxpbmUgaW50CitleHQyX3hhdHRyX2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbmFtZV9pbmRleCwKKwkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitleHQyX3hhdHRyX3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbmFtZV9pbmRleCwgY29uc3QgY2hhciAqbmFtZSwKKwkgICAgICAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2V4dDJfeGF0dHJfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZXh0Ml94YXR0cl9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQKK2luaXRfZXh0Ml94YXR0cih2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2V4aXRfZXh0Ml94YXR0cih2b2lkKQoreworfQorCisjZGVmaW5lIGV4dDJfeGF0dHJfaGFuZGxlcnMgTlVMTAorCisjIGVuZGlmICAvKiBDT05GSUdfRVhUMl9GU19YQVRUUiAqLworCmRpZmYgLS1naXQgYS9mcy9leHQyL3hhdHRyX3NlY3VyaXR5LmMgYi9mcy9leHQyL3hhdHRyX3NlY3VyaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2YzU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDIveGF0dHJfc2VjdXJpdHkuYwpAQCAtMCwwICsxLDUzIEBACisvKgorICogbGludXgvZnMvZXh0Mi94YXR0cl9zZWN1cml0eS5jCisgKiBIYW5kbGVyIGZvciBzdG9yaW5nIHNlY3VyaXR5IGxhYmVscyBhcyBleHRlbmRlZCBhdHRyaWJ1dGVzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXh0Ml9mcy5oPgorI2luY2x1ZGUgInhhdHRyLmgiCisKK3N0YXRpYyBzaXplX3QKK2V4dDJfeGF0dHJfc2VjdXJpdHlfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpsaXN0LCBzaXplX3QgbGlzdF9zaXplLAorCQkJIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbikKK3sKKwljb25zdCBpbnQgcHJlZml4X2xlbiA9IHNpemVvZihYQVRUUl9TRUNVUklUWV9QUkVGSVgpLTE7CisJY29uc3Qgc2l6ZV90IHRvdGFsX2xlbiA9IHByZWZpeF9sZW4gKyBuYW1lX2xlbiArIDE7CisKKwlpZiAobGlzdCAmJiB0b3RhbF9sZW4gPD0gbGlzdF9zaXplKSB7CisJCW1lbWNweShsaXN0LCBYQVRUUl9TRUNVUklUWV9QUkVGSVgsIHByZWZpeF9sZW4pOworCQltZW1jcHkobGlzdCtwcmVmaXhfbGVuLCBuYW1lLCBuYW1lX2xlbik7CisJCWxpc3RbcHJlZml4X2xlbiArIG5hbWVfbGVuXSA9ICdcMCc7CisJfQorCXJldHVybiB0b3RhbF9sZW47Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfc2VjdXJpdHlfZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBleHQyX3hhdHRyX2dldChpbm9kZSwgRVhUMl9YQVRUUl9JTkRFWF9TRUNVUklUWSwgbmFtZSwKKwkJCSAgICAgIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfc2VjdXJpdHlfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gZXh0Ml94YXR0cl9zZXQoaW5vZGUsIEVYVDJfWEFUVFJfSU5ERVhfU0VDVVJJVFksIG5hbWUsCisJCQkgICAgICB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworfQorCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciBleHQyX3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIgPSB7CisJLnByZWZpeAk9IFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwKKwkubGlzdAk9IGV4dDJfeGF0dHJfc2VjdXJpdHlfbGlzdCwKKwkuZ2V0CT0gZXh0Ml94YXR0cl9zZWN1cml0eV9nZXQsCisJLnNldAk9IGV4dDJfeGF0dHJfc2VjdXJpdHlfc2V0LAorfTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIveGF0dHJfdHJ1c3RlZC5jIGIvZnMvZXh0Mi94YXR0cl90cnVzdGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJiMzBlZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDIveGF0dHJfdHJ1c3RlZC5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBsaW51eC9mcy9leHQyL3hhdHRyX3RydXN0ZWQuYworICogSGFuZGxlciBmb3IgdHJ1c3RlZCBleHRlbmRlZCBhdHRyaWJ1dGVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBieSBBbmRyZWFzIEdydWVuYmFjaGVyLCA8YS5ncnVlbmJhY2hlckBjb21wdXRlci5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9leHQyX2ZzLmg+CisjaW5jbHVkZSAieGF0dHIuaCIKKworI2RlZmluZSBYQVRUUl9UUlVTVEVEX1BSRUZJWCAidHJ1c3RlZC4iCisKK3N0YXRpYyBzaXplX3QKK2V4dDJfeGF0dHJfdHJ1c3RlZF9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmxpc3QsIHNpemVfdCBsaXN0X3NpemUsCisJCQljb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9sZW4pCit7CisJY29uc3QgaW50IHByZWZpeF9sZW4gPSBzaXplb2YoWEFUVFJfVFJVU1RFRF9QUkVGSVgpLTE7CisJY29uc3Qgc2l6ZV90IHRvdGFsX2xlbiA9IHByZWZpeF9sZW4gKyBuYW1lX2xlbiArIDE7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAwOworCisJaWYgKGxpc3QgJiYgdG90YWxfbGVuIDw9IGxpc3Rfc2l6ZSkgeworCQltZW1jcHkobGlzdCwgWEFUVFJfVFJVU1RFRF9QUkVGSVgsIHByZWZpeF9sZW4pOworCQltZW1jcHkobGlzdCtwcmVmaXhfbGVuLCBuYW1lLCBuYW1lX2xlbik7CisJCWxpc3RbcHJlZml4X2xlbiArIG5hbWVfbGVuXSA9ICdcMCc7CisJfQorCXJldHVybiB0b3RhbF9sZW47Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfdHJ1c3RlZF9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXJldHVybiBleHQyX3hhdHRyX2dldChpbm9kZSwgRVhUMl9YQVRUUl9JTkRFWF9UUlVTVEVELCBuYW1lLAorCQkJICAgICAgYnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIGludAorZXh0Ml94YXR0cl90cnVzdGVkX3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXJldHVybiBleHQyX3hhdHRyX3NldChpbm9kZSwgRVhUMl9YQVRUUl9JTkRFWF9UUlVTVEVELCBuYW1lLAorCQkJICAgICAgdmFsdWUsIHNpemUsIGZsYWdzKTsKK30KKworc3RydWN0IHhhdHRyX2hhbmRsZXIgZXh0Ml94YXR0cl90cnVzdGVkX2hhbmRsZXIgPSB7CisJLnByZWZpeAk9IFhBVFRSX1RSVVNURURfUFJFRklYLAorCS5saXN0CT0gZXh0Ml94YXR0cl90cnVzdGVkX2xpc3QsCisJLmdldAk9IGV4dDJfeGF0dHJfdHJ1c3RlZF9nZXQsCisJLnNldAk9IGV4dDJfeGF0dHJfdHJ1c3RlZF9zZXQsCit9OwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi94YXR0cl91c2VyLmMgYi9mcy9leHQyL3hhdHRyX3VzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzAzZWExCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0Mi94YXR0cl91c2VyLmMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIGxpbnV4L2ZzL2V4dDIveGF0dHJfdXNlci5jCisgKiBIYW5kbGVyIGZvciBleHRlbmRlZCB1c2VyIGF0dHJpYnV0ZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEFuZHJlYXMgR3J1ZW5iYWNoZXIsIDxhLmdydWVuYmFjaGVyQGNvbXB1dGVyLm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgImV4dDIuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgorCisjZGVmaW5lIFhBVFRSX1VTRVJfUFJFRklYICJ1c2VyLiIKKworc3RhdGljIHNpemVfdAorZXh0Ml94YXR0cl91c2VyX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqbGlzdCwgc2l6ZV90IGxpc3Rfc2l6ZSwKKwkJICAgICBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9sZW4pCit7CisJY29uc3Qgc2l6ZV90IHByZWZpeF9sZW4gPSBzaXplb2YoWEFUVFJfVVNFUl9QUkVGSVgpLTE7CisJY29uc3Qgc2l6ZV90IHRvdGFsX2xlbiA9IHByZWZpeF9sZW4gKyBuYW1lX2xlbiArIDE7CisKKwlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBYQVRUUl9VU0VSKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobGlzdCAmJiB0b3RhbF9sZW4gPD0gbGlzdF9zaXplKSB7CisJCW1lbWNweShsaXN0LCBYQVRUUl9VU0VSX1BSRUZJWCwgcHJlZml4X2xlbik7CisJCW1lbWNweShsaXN0K3ByZWZpeF9sZW4sIG5hbWUsIG5hbWVfbGVuKTsKKwkJbGlzdFtwcmVmaXhfbGVuICsgbmFtZV9sZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIHRvdGFsX2xlbjsKK30KKworc3RhdGljIGludAorZXh0Ml94YXR0cl91c2VyX2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBYQVRUUl9VU0VSKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWVycm9yID0gcGVybWlzc2lvbihpbm9kZSwgTUFZX1JFQUQsIE5VTEwpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJcmV0dXJuIGV4dDJfeGF0dHJfZ2V0KGlub2RlLCBFWFQyX1hBVFRSX0lOREVYX1VTRVIsIG5hbWUsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfdXNlcl9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWludCBlcnJvcjsKKworCWlmIChzdHJjbXAobmFtZSwgIiIpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFhBVFRSX1VTRVIpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKCAhU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJgorCSAgICAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgaW5vZGUtPmlfbW9kZSAmIFNfSVNWVFgpKQorCQlyZXR1cm4gLUVQRVJNOworCWVycm9yID0gcGVybWlzc2lvbihpbm9kZSwgTUFZX1dSSVRFLCBOVUxMKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXJldHVybiBleHQyX3hhdHRyX3NldChpbm9kZSwgRVhUMl9YQVRUUl9JTkRFWF9VU0VSLCBuYW1lLAorCQkJICAgICAgdmFsdWUsIHNpemUsIGZsYWdzKTsKK30KKworc3RydWN0IHhhdHRyX2hhbmRsZXIgZXh0Ml94YXR0cl91c2VyX2hhbmRsZXIgPSB7CisJLnByZWZpeAk9IFhBVFRSX1VTRVJfUFJFRklYLAorCS5saXN0CT0gZXh0Ml94YXR0cl91c2VyX2xpc3QsCisJLmdldAk9IGV4dDJfeGF0dHJfdXNlcl9nZXQsCisJLnNldAk9IGV4dDJfeGF0dHJfdXNlcl9zZXQsCit9OwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9NYWtlZmlsZSBiL2ZzL2V4dDMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0Y2Q0NAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDMvTWFrZWZpbGUKQEAgLTAsMCArMSwxMiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGV4dDMtZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX0VYVDNfRlMpICs9IGV4dDMubworCitleHQzLXkJOj0gYmFsbG9jLm8gYml0bWFwLm8gZGlyLm8gZmlsZS5vIGZzeW5jLm8gaWFsbG9jLm8gaW5vZGUubyBcCisJICAgaW9jdGwubyBuYW1laS5vIHN1cGVyLm8gc3ltbGluay5vIGhhc2gubyByZXNpemUubworCitleHQzLSQoQ09ORklHX0VYVDNfRlNfWEFUVFIpCSArPSB4YXR0ci5vIHhhdHRyX3VzZXIubyB4YXR0cl90cnVzdGVkLm8KK2V4dDMtJChDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wpICs9IGFjbC5vCitleHQzLSQoQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkpCSArPSB4YXR0cl9zZWN1cml0eS5vCmRpZmYgLS1naXQgYS9mcy9leHQzL2FjbC5jIGIvZnMvZXh0My9hY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjg1OTJjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0My9hY2wuYwpAQCAtMCwwICsxLDU0NyBAQAorLyoKKyAqIGxpbnV4L2ZzL2V4dDMvYWNsLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBBbmRyZWFzIEdydWVuYmFjaGVyLCA8YWdydWVuQHN1c2UuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDNfamJkLmg+CisjaW5jbHVkZSA8bGludXgvZXh0M19mcy5oPgorI2luY2x1ZGUgInhhdHRyLmgiCisjaW5jbHVkZSAiYWNsLmgiCisKKy8qCisgKiBDb252ZXJ0IGZyb20gZmlsZXN5c3RlbSB0byBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb24uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcG9zaXhfYWNsICoKK2V4dDNfYWNsX2Zyb21fZGlzayhjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUpCit7CisJY29uc3QgY2hhciAqZW5kID0gKGNoYXIgKil2YWx1ZSArIHNpemU7CisJaW50IG4sIGNvdW50OworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKworCWlmICghdmFsdWUpCisJCXJldHVybiBOVUxMOworCWlmIChzaXplIDwgc2l6ZW9mKGV4dDNfYWNsX2hlYWRlcikpCisJCSByZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlpZiAoKChleHQzX2FjbF9oZWFkZXIgKil2YWx1ZSktPmFfdmVyc2lvbiAhPQorCSAgICBjcHVfdG9fbGUzMihFWFQzX0FDTF9WRVJTSU9OKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJdmFsdWUgPSAoY2hhciAqKXZhbHVlICsgc2l6ZW9mKGV4dDNfYWNsX2hlYWRlcik7CisJY291bnQgPSBleHQzX2FjbF9jb3VudChzaXplKTsKKwlpZiAoY291bnQgPCAwKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJYWNsID0gcG9zaXhfYWNsX2FsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFjbCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJZm9yIChuPTA7IG4gPCBjb3VudDsgbisrKSB7CisJCWV4dDNfYWNsX2VudHJ5ICplbnRyeSA9CisJCQkoZXh0M19hY2xfZW50cnkgKil2YWx1ZTsKKwkJaWYgKChjaGFyICopdmFsdWUgKyBzaXplb2YoZXh0M19hY2xfZW50cnlfc2hvcnQpID4gZW5kKQorCQkJZ290byBmYWlsOworCQlhY2wtPmFfZW50cmllc1tuXS5lX3RhZyAgPSBsZTE2X3RvX2NwdShlbnRyeS0+ZV90YWcpOworCQlhY2wtPmFfZW50cmllc1tuXS5lX3Blcm0gPSBsZTE2X3RvX2NwdShlbnRyeS0+ZV9wZXJtKTsKKwkJc3dpdGNoKGFjbC0+YV9lbnRyaWVzW25dLmVfdGFnKSB7CisJCQljYXNlIEFDTF9VU0VSX09CSjoKKwkJCWNhc2UgQUNMX0dST1VQX09CSjoKKwkJCWNhc2UgQUNMX01BU0s6CisJCQljYXNlIEFDTF9PVEhFUjoKKwkJCQl2YWx1ZSA9IChjaGFyICopdmFsdWUgKworCQkJCQlzaXplb2YoZXh0M19hY2xfZW50cnlfc2hvcnQpOworCQkJCWFjbC0+YV9lbnRyaWVzW25dLmVfaWQgPSBBQ0xfVU5ERUZJTkVEX0lEOworCQkJCWJyZWFrOworCisJCQljYXNlIEFDTF9VU0VSOgorCQkJY2FzZSBBQ0xfR1JPVVA6CisJCQkJdmFsdWUgPSAoY2hhciAqKXZhbHVlICsgc2l6ZW9mKGV4dDNfYWNsX2VudHJ5KTsKKwkJCQlpZiAoKGNoYXIgKil2YWx1ZSA+IGVuZCkKKwkJCQkJZ290byBmYWlsOworCQkJCWFjbC0+YV9lbnRyaWVzW25dLmVfaWQgPQorCQkJCQlsZTMyX3RvX2NwdShlbnRyeS0+ZV9pZCk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBmYWlsOworCQl9CisJfQorCWlmICh2YWx1ZSAhPSBlbmQpCisJCWdvdG8gZmFpbDsKKwlyZXR1cm4gYWNsOworCitmYWlsOgorCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGZyb20gaW4tbWVtb3J5IHRvIGZpbGVzeXN0ZW0gcmVwcmVzZW50YXRpb24uCisgKi8KK3N0YXRpYyB2b2lkICoKK2V4dDNfYWNsX3RvX2Rpc2soY29uc3Qgc3RydWN0IHBvc2l4X2FjbCAqYWNsLCBzaXplX3QgKnNpemUpCit7CisJZXh0M19hY2xfaGVhZGVyICpleHRfYWNsOworCWNoYXIgKmU7CisJc2l6ZV90IG47CisKKwkqc2l6ZSA9IGV4dDNfYWNsX3NpemUoYWNsLT5hX2NvdW50KTsKKwlleHRfYWNsID0gKGV4dDNfYWNsX2hlYWRlciAqKWttYWxsb2Moc2l6ZW9mKGV4dDNfYWNsX2hlYWRlcikgKworCQlhY2wtPmFfY291bnQgKiBzaXplb2YoZXh0M19hY2xfZW50cnkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWV4dF9hY2wpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWV4dF9hY2wtPmFfdmVyc2lvbiA9IGNwdV90b19sZTMyKEVYVDNfQUNMX1ZFUlNJT04pOworCWUgPSAoY2hhciAqKWV4dF9hY2wgKyBzaXplb2YoZXh0M19hY2xfaGVhZGVyKTsKKwlmb3IgKG49MDsgbiA8IGFjbC0+YV9jb3VudDsgbisrKSB7CisJCWV4dDNfYWNsX2VudHJ5ICplbnRyeSA9IChleHQzX2FjbF9lbnRyeSAqKWU7CisJCWVudHJ5LT5lX3RhZyAgPSBjcHVfdG9fbGUxNihhY2wtPmFfZW50cmllc1tuXS5lX3RhZyk7CisJCWVudHJ5LT5lX3Blcm0gPSBjcHVfdG9fbGUxNihhY2wtPmFfZW50cmllc1tuXS5lX3Blcm0pOworCQlzd2l0Y2goYWNsLT5hX2VudHJpZXNbbl0uZV90YWcpIHsKKwkJCWNhc2UgQUNMX1VTRVI6CisJCQljYXNlIEFDTF9HUk9VUDoKKwkJCQllbnRyeS0+ZV9pZCA9CisJCQkJCWNwdV90b19sZTMyKGFjbC0+YV9lbnRyaWVzW25dLmVfaWQpOworCQkJCWUgKz0gc2l6ZW9mKGV4dDNfYWNsX2VudHJ5KTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCQljYXNlIEFDTF9HUk9VUF9PQko6CisJCQljYXNlIEFDTF9NQVNLOgorCQkJY2FzZSBBQ0xfT1RIRVI6CisJCQkJZSArPSBzaXplb2YoZXh0M19hY2xfZW50cnlfc2hvcnQpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKwlyZXR1cm4gKGNoYXIgKilleHRfYWNsOworCitmYWlsOgorCWtmcmVlKGV4dF9hY2wpOworCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwb3NpeF9hY2wgKgorZXh0M19pZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcG9zaXhfYWNsICoqaV9hY2wpCit7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0gRVhUM19BQ0xfTk9UX0NBQ0hFRDsKKworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJaWYgKCppX2FjbCAhPSBFWFQzX0FDTF9OT1RfQ0FDSEVEKQorCQlhY2wgPSBwb3NpeF9hY2xfZHVwKCppX2FjbCk7CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCisJcmV0dXJuIGFjbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitleHQzX2lzZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwb3NpeF9hY2wgKippX2FjbCwKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCkKK3sKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCWlmICgqaV9hY2wgIT0gRVhUM19BQ0xfTk9UX0NBQ0hFRCkKKwkJcG9zaXhfYWNsX3JlbGVhc2UoKmlfYWNsKTsKKwkqaV9hY2wgPSBwb3NpeF9hY2xfZHVwKGFjbCk7CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworfQorCisvKgorICogSW5vZGUgb3BlcmF0aW9uIGdldF9wb3NpeF9hY2woKS4KKyAqCisgKiBpbm9kZS0+aV9zZW06IGRvbid0IGNhcmUKKyAqLworc3RhdGljIHN0cnVjdCBwb3NpeF9hY2wgKgorZXh0M19nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQoreworCXN0cnVjdCBleHQzX2lub2RlX2luZm8gKmVpID0gRVhUM19JKGlub2RlKTsKKwlpbnQgbmFtZV9pbmRleDsKKwljaGFyICp2YWx1ZSA9IE5VTEw7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsOworCWludCByZXR2YWw7CisKKwlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBQT1NJWF9BQ0wpKQorCQlyZXR1cm4gTlVMTDsKKworCXN3aXRjaCh0eXBlKSB7CisJCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgorCQkJYWNsID0gZXh0M19pZ2V0X2FjbChpbm9kZSwgJmVpLT5pX2FjbCk7CisJCQlpZiAoYWNsICE9IEVYVDNfQUNMX05PVF9DQUNIRUQpCisJCQkJcmV0dXJuIGFjbDsKKwkJCW5hbWVfaW5kZXggPSBFWFQzX1hBVFRSX0lOREVYX1BPU0lYX0FDTF9BQ0NFU1M7CisJCQlicmVhazsKKworCQljYXNlIEFDTF9UWVBFX0RFRkFVTFQ6CisJCQlhY2wgPSBleHQzX2lnZXRfYWNsKGlub2RlLCAmZWktPmlfZGVmYXVsdF9hY2wpOworCQkJaWYgKGFjbCAhPSBFWFQzX0FDTF9OT1RfQ0FDSEVEKQorCQkJCXJldHVybiBhY2w7CisJCQluYW1lX2luZGV4ID0gRVhUM19YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfREVGQVVMVDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisJcmV0dmFsID0gZXh0M194YXR0cl9nZXQoaW5vZGUsIG5hbWVfaW5kZXgsICIiLCBOVUxMLCAwKTsKKwlpZiAocmV0dmFsID4gMCkgeworCQl2YWx1ZSA9IGttYWxsb2MocmV0dmFsLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCQlyZXR2YWwgPSBleHQzX3hhdHRyX2dldChpbm9kZSwgbmFtZV9pbmRleCwgIiIsIHZhbHVlLCByZXR2YWwpOworCX0KKwlpZiAocmV0dmFsID4gMCkKKwkJYWNsID0gZXh0M19hY2xfZnJvbV9kaXNrKHZhbHVlLCByZXR2YWwpOworCWVsc2UgaWYgKHJldHZhbCA9PSAtRU5PREFUQSB8fCByZXR2YWwgPT0gLUVOT1NZUykKKwkJYWNsID0gTlVMTDsKKwllbHNlCisJCWFjbCA9IEVSUl9QVFIocmV0dmFsKTsKKwlrZnJlZSh2YWx1ZSk7CisKKwlpZiAoIUlTX0VSUihhY2wpKSB7CisJCXN3aXRjaCh0eXBlKSB7CisJCQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKKwkJCQlleHQzX2lzZXRfYWNsKGlub2RlLCAmZWktPmlfYWNsLCBhY2wpOworCQkJCWJyZWFrOworCisJCQljYXNlIEFDTF9UWVBFX0RFRkFVTFQ6CisJCQkJZXh0M19pc2V0X2FjbChpbm9kZSwgJmVpLT5pX2RlZmF1bHRfYWNsLCBhY2wpOworCQkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBhY2w7Cit9CisKKy8qCisgKiBTZXQgdGhlIGFjY2VzcyBvciBkZWZhdWx0IEFDTCBvZiBhbiBpbm9kZS4KKyAqCisgKiBpbm9kZS0+aV9zZW06IGRvd24gdW5sZXNzIGNhbGxlZCBmcm9tIGV4dDNfbmV3X2lub2RlCisgKi8KK3N0YXRpYyBpbnQKK2V4dDNfc2V0X2FjbChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwKKwkgICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCkKK3sKKwlzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvICplaSA9IEVYVDNfSShpbm9kZSk7CisJaW50IG5hbWVfaW5kZXg7CisJdm9pZCAqdmFsdWUgPSBOVUxMOworCXNpemVfdCBzaXplOworCWludCBlcnJvcjsKKworCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlzd2l0Y2godHlwZSkgeworCQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKKwkJCW5hbWVfaW5kZXggPSBFWFQzX1hBVFRSX0lOREVYX1BPU0lYX0FDTF9BQ0NFU1M7CisJCQlpZiAoYWNsKSB7CisJCQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOworCQkJCWVycm9yID0gcG9zaXhfYWNsX2VxdWl2X21vZGUoYWNsLCAmbW9kZSk7CisJCQkJaWYgKGVycm9yIDwgMCkKKwkJCQkJcmV0dXJuIGVycm9yOworCQkJCWVsc2UgeworCQkJCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwkJCQkJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCQkJCQlpZiAoZXJyb3IgPT0gMCkKKwkJCQkJCWFjbCA9IE5VTEw7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgorCQkJbmFtZV9pbmRleCA9IEVYVDNfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0RFRkFVTFQ7CisJCQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCQkJcmV0dXJuIGFjbCA/IC1FQUNDRVMgOiAwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKyAJaWYgKGFjbCkgeworCQl2YWx1ZSA9IGV4dDNfYWNsX3RvX2Rpc2soYWNsLCAmc2l6ZSk7CisJCWlmIChJU19FUlIodmFsdWUpKQorCQkJcmV0dXJuIChpbnQpUFRSX0VSUih2YWx1ZSk7CisJfQorCisJZXJyb3IgPSBleHQzX3hhdHRyX3NldF9oYW5kbGUoaGFuZGxlLCBpbm9kZSwgbmFtZV9pbmRleCwgIiIsCisJCQkJICAgICAgdmFsdWUsIHNpemUsIDApOworCisJa2ZyZWUodmFsdWUpOworCWlmICghZXJyb3IpIHsKKwkJc3dpdGNoKHR5cGUpIHsKKwkJCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgorCQkJCWV4dDNfaXNldF9hY2woaW5vZGUsICZlaS0+aV9hY2wsIGFjbCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKKwkJCQlleHQzX2lzZXRfYWNsKGlub2RlLCAmZWktPmlfZGVmYXVsdF9hY2wsIGFjbCk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50CitleHQzX2NoZWNrX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKK3sKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2wgPSBleHQzX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7CisKKwlpZiAoYWNsKSB7CisJCWludCBlcnJvciA9IHBvc2l4X2FjbF9wZXJtaXNzaW9uKGlub2RlLCBhY2wsIG1hc2spOworCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcmV0dXJuIC1FQUdBSU47Cit9CisKK2ludAorZXh0M19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBleHQzX2NoZWNrX2FjbCk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBBQ0xzIG9mIGEgbmV3IGlub2RlLiBDYWxsZWQgZnJvbSBleHQzX25ld19pbm9kZS4KKyAqCisgKiBkaXItPmlfc2VtOiBkb3duCisgKiBpbm9kZS0+aV9zZW06IHVwIChhY2Nlc3MgdG8gaW5vZGUgaXMgc3RpbGwgZXhjbHVzaXZlKQorICovCitpbnQKK2V4dDNfaW5pdF9hY2woaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCit7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0gTlVMTDsKKwlpbnQgZXJyb3IgPSAwOworCisJaWYgKCFTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWlmICh0ZXN0X29wdChkaXItPmlfc2IsIFBPU0lYX0FDTCkpIHsKKwkJCWFjbCA9IGV4dDNfZ2V0X2FjbChkaXIsIEFDTF9UWVBFX0RFRkFVTFQpOworCQkJaWYgKElTX0VSUihhY2wpKQorCQkJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJCX0KKwkJaWYgKCFhY2wpCisJCQlpbm9kZS0+aV9tb2RlICY9IH5jdXJyZW50LT5mcy0+dW1hc2s7CisJfQorCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgUE9TSVhfQUNMKSAmJiBhY2wpIHsKKwkJc3RydWN0IHBvc2l4X2FjbCAqY2xvbmU7CisJCW1vZGVfdCBtb2RlOworCisJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCQllcnJvciA9IGV4dDNfc2V0X2FjbChoYW5kbGUsIGlub2RlLAorCQkJCQkgICAgIEFDTF9UWVBFX0RFRkFVTFQsIGFjbCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBjbGVhbnVwOworCQl9CisJCWNsb25lID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX0tFUk5FTCk7CisJCWVycm9yID0gLUVOT01FTTsKKwkJaWYgKCFjbG9uZSkKKwkJCWdvdG8gY2xlYW51cDsKKworCQltb2RlID0gaW5vZGUtPmlfbW9kZTsKKwkJZXJyb3IgPSBwb3NpeF9hY2xfY3JlYXRlX21hc3EoY2xvbmUsICZtb2RlKTsKKwkJaWYgKGVycm9yID49IDApIHsKKwkJCWlub2RlLT5pX21vZGUgPSBtb2RlOworCQkJaWYgKGVycm9yID4gMCkgeworCQkJCS8qIFRoaXMgaXMgYW4gZXh0ZW5kZWQgQUNMICovCisJCQkJZXJyb3IgPSBleHQzX3NldF9hY2woaGFuZGxlLCBpbm9kZSwKKwkJCQkJCSAgICAgQUNMX1RZUEVfQUNDRVNTLCBjbG9uZSk7CisJCQl9CisJCX0KKwkJcG9zaXhfYWNsX3JlbGVhc2UoY2xvbmUpOworCX0KK2NsZWFudXA6CisJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBEb2VzIGNobW9kIGZvciBhbiBpbm9kZSB0aGF0IG1heSBoYXZlIGFuIEFjY2VzcyBDb250cm9sIExpc3QuIFRoZQorICogaW5vZGUtPmlfbW9kZSBmaWVsZCBtdXN0IGJlIHVwZGF0ZWQgdG8gdGhlIGRlc2lyZWQgdmFsdWUgYnkgdGhlIGNhbGxlcgorICogYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIG51bWJlci4KKyAqCisgKiBXZSBjaGFuZ2UgdGhlIEFDTCByYXRoZXIgdGhhbiBzdG9yaW5nIHNvbWUgQUNMIGVudHJpZXMgaW4gdGhlIGZpbGUKKyAqIG1vZGUgcGVybWlzc2lvbiBiaXRzICh3aGljaCB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCksIGJlY2F1c2UgdGhhdAorICogd291bGQgYnJlYWsgb25jZSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIChsaWtlICBBQ0xfQVBQRU5ELCBBQ0xfREVMRVRFCisgKiBmb3IgZGlyZWN0b3JpZXMpIGFyZSBhZGRlZC4gVGhlcmUgYXJlIG5vIG1vcmUgYml0cyBhdmFpbGFibGUgaW4gdGhlCisgKiBmaWxlIG1vZGUuCisgKgorICogaW5vZGUtPmlfc2VtOiBkb3duCisgKi8KK2ludAorZXh0M19hY2xfY2htb2Qoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2wsICpjbG9uZTsKKyAgICAgICAgaW50IGVycm9yOworCisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBQT1NJWF9BQ0wpKQorCQlyZXR1cm4gMDsKKwlhY2wgPSBleHQzX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7CisJaWYgKElTX0VSUihhY2wpIHx8ICFhY2wpCisJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfS0VSTkVMKTsKKwlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCWlmICghY2xvbmUpCisJCXJldHVybiAtRU5PTUVNOworCWVycm9yID0gcG9zaXhfYWNsX2NobW9kX21hc3EoY2xvbmUsIGlub2RlLT5pX21vZGUpOworCWlmICghZXJyb3IpIHsKKwkJaGFuZGxlX3QgKmhhbmRsZTsKKwkJaW50IHJldHJpZXMgPSAwOworCisJcmV0cnk6CisJCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChpbm9kZSwgRVhUM19EQVRBX1RSQU5TX0JMT0NLUyk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJZXJyb3IgPSBQVFJfRVJSKGhhbmRsZSk7CisJCQlleHQzX3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyb3IpOworCQkJZ290byBvdXQ7CisJCX0KKwkJZXJyb3IgPSBleHQzX3NldF9hY2woaGFuZGxlLCBpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBjbG9uZSk7CisJCWV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJCWlmIChlcnJvciA9PSAtRU5PU1BDICYmCisJCSAgICBleHQzX3Nob3VsZF9yZXRyeV9hbGxvYyhpbm9kZS0+aV9zYiwgJnJldHJpZXMpKQorCQkJZ290byByZXRyeTsKKwl9CitvdXQ6CisJcG9zaXhfYWNsX3JlbGVhc2UoY2xvbmUpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEV4dGVuZGVkIGF0dHJpYnV0ZSBoYW5kbGVycworICovCitzdGF0aWMgc2l6ZV90CitleHQzX3hhdHRyX2xpc3RfYWNsX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpsaXN0LCBzaXplX3QgbGlzdF9sZW4sCisJCQkgICBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9sZW4pCit7CisJY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2YoWEFUVFJfTkFNRV9BQ0xfQUNDRVNTKTsKKworCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFBPU0lYX0FDTCkpCisJCXJldHVybiAwOworCWlmIChsaXN0ICYmIHNpemUgPD0gbGlzdF9sZW4pCisJCW1lbWNweShsaXN0LCBYQVRUUl9OQU1FX0FDTF9BQ0NFU1MsIHNpemUpOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc2l6ZV90CitleHQzX3hhdHRyX2xpc3RfYWNsX2RlZmF1bHQoc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqbGlzdCwgc2l6ZV90IGxpc3RfbGVuLAorCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbikKK3sKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihYQVRUUl9OQU1FX0FDTF9ERUZBVUxUKTsKKworCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFBPU0lYX0FDTCkpCisJCXJldHVybiAwOworCWlmIChsaXN0ICYmIHNpemUgPD0gbGlzdF9sZW4pCisJCW1lbWNweShsaXN0LCBYQVRUUl9OQU1FX0FDTF9ERUZBVUxULCBzaXplKTsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBQT1NJWF9BQ0wpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlhY2wgPSBleHQzX2dldF9hY2woaW5vZGUsIHR5cGUpOworCWlmIChJU19FUlIoYWNsKSkKKwkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKKwlpZiAoYWNsID09IE5VTEwpCisJCXJldHVybiAtRU5PREFUQTsKKwllcnJvciA9IHBvc2l4X2FjbF90b194YXR0cihhY2wsIGJ1ZmZlciwgc2l6ZSk7CisJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl9nZXRfYWNsX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBleHQzX3hhdHRyX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl9nZXRfYWNsX2RlZmF1bHQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJaWYgKHN0cmNtcChuYW1lLCAiIikgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGV4dDNfeGF0dHJfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgYnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl9zZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCBjb25zdCB2b2lkICp2YWx1ZSwKKwkJICAgc2l6ZV90IHNpemUpCit7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisJaW50IGVycm9yLCByZXRyaWVzID0gMDsKKworCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFBPU0lYX0FDTCkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCkgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAodmFsdWUpIHsKKwkJYWNsID0gcG9zaXhfYWNsX2Zyb21feGF0dHIodmFsdWUsIHNpemUpOworCQlpZiAoSVNfRVJSKGFjbCkpCisJCQlyZXR1cm4gUFRSX0VSUihhY2wpOworCQllbHNlIGlmIChhY2wpIHsKKwkJCWVycm9yID0gcG9zaXhfYWNsX3ZhbGlkKGFjbCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byByZWxlYXNlX2FuZF9vdXQ7CisJCX0KKwl9IGVsc2UKKwkJYWNsID0gTlVMTDsKKworcmV0cnk6CisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCBFWFQzX0RBVEFfVFJBTlNfQkxPQ0tTKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpCisJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CisJZXJyb3IgPSBleHQzX3NldF9hY2woaGFuZGxlLCBpbm9kZSwgdHlwZSwgYWNsKTsKKwlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmIChlcnJvciA9PSAtRU5PU1BDICYmIGV4dDNfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCisJCWdvdG8gcmV0cnk7CisKK3JlbGVhc2VfYW5kX291dDoKKwlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl9zZXRfYWNsX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gZXh0M194YXR0cl9zZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIHZhbHVlLCBzaXplKTsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl9zZXRfYWNsX2RlZmF1bHQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBleHQzX3hhdHRyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsIHZhbHVlLCBzaXplKTsKK30KKworc3RydWN0IHhhdHRyX2hhbmRsZXIgZXh0M194YXR0cl9hY2xfYWNjZXNzX2hhbmRsZXIgPSB7CisJLnByZWZpeAk9IFhBVFRSX05BTUVfQUNMX0FDQ0VTUywKKwkubGlzdAk9IGV4dDNfeGF0dHJfbGlzdF9hY2xfYWNjZXNzLAorCS5nZXQJPSBleHQzX3hhdHRyX2dldF9hY2xfYWNjZXNzLAorCS5zZXQJPSBleHQzX3hhdHRyX3NldF9hY2xfYWNjZXNzLAorfTsKKworc3RydWN0IHhhdHRyX2hhbmRsZXIgZXh0M194YXR0cl9hY2xfZGVmYXVsdF9oYW5kbGVyID0geworCS5wcmVmaXgJPSBYQVRUUl9OQU1FX0FDTF9ERUZBVUxULAorCS5saXN0CT0gZXh0M194YXR0cl9saXN0X2FjbF9kZWZhdWx0LAorCS5nZXQJPSBleHQzX3hhdHRyX2dldF9hY2xfZGVmYXVsdCwKKwkuc2V0CT0gZXh0M194YXR0cl9zZXRfYWNsX2RlZmF1bHQsCit9OwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9hY2wuaCBiL2ZzL2V4dDMvYWNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhZjBjMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDMvYWNsLmgKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAgRmlsZTogZnMvZXh0My9hY2wuaAorCisgIChDKSAyMDAxIEFuZHJlYXMgR3J1ZW5iYWNoZXIsIDxhLmdydWVuYmFjaGVyQGNvbXB1dGVyLm9yZz4KKyovCisKKyNpbmNsdWRlIDxsaW51eC94YXR0cl9hY2wuaD4KKworI2RlZmluZSBFWFQzX0FDTF9WRVJTSU9OCTB4MDAwMQorCit0eXBlZGVmIHN0cnVjdCB7CisJX19sZTE2CQllX3RhZzsKKwlfX2xlMTYJCWVfcGVybTsKKwlfX2xlMzIJCWVfaWQ7Cit9IGV4dDNfYWNsX2VudHJ5OworCit0eXBlZGVmIHN0cnVjdCB7CisJX19sZTE2CQllX3RhZzsKKwlfX2xlMTYJCWVfcGVybTsKK30gZXh0M19hY2xfZW50cnlfc2hvcnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlMzIJCWFfdmVyc2lvbjsKK30gZXh0M19hY2xfaGVhZGVyOworCitzdGF0aWMgaW5saW5lIHNpemVfdCBleHQzX2FjbF9zaXplKGludCBjb3VudCkKK3sKKwlpZiAoY291bnQgPD0gNCkgeworCQlyZXR1cm4gc2l6ZW9mKGV4dDNfYWNsX2hlYWRlcikgKworCQkgICAgICAgY291bnQgKiBzaXplb2YoZXh0M19hY2xfZW50cnlfc2hvcnQpOworCX0gZWxzZSB7CisJCXJldHVybiBzaXplb2YoZXh0M19hY2xfaGVhZGVyKSArCisJCSAgICAgICA0ICogc2l6ZW9mKGV4dDNfYWNsX2VudHJ5X3Nob3J0KSArCisJCSAgICAgICAoY291bnQgLSA0KSAqIHNpemVvZihleHQzX2FjbF9lbnRyeSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBleHQzX2FjbF9jb3VudChzaXplX3Qgc2l6ZSkKK3sKKwlzc2l6ZV90IHM7CisJc2l6ZSAtPSBzaXplb2YoZXh0M19hY2xfaGVhZGVyKTsKKwlzID0gc2l6ZSAtIDQgKiBzaXplb2YoZXh0M19hY2xfZW50cnlfc2hvcnQpOworCWlmIChzIDwgMCkgeworCQlpZiAoc2l6ZSAlIHNpemVvZihleHQzX2FjbF9lbnRyeV9zaG9ydCkpCisJCQlyZXR1cm4gLTE7CisJCXJldHVybiBzaXplIC8gc2l6ZW9mKGV4dDNfYWNsX2VudHJ5X3Nob3J0KTsKKwl9IGVsc2UgeworCQlpZiAocyAlIHNpemVvZihleHQzX2FjbF9lbnRyeSkpCisJCQlyZXR1cm4gLTE7CisJCXJldHVybiBzIC8gc2l6ZW9mKGV4dDNfYWNsX2VudHJ5KSArIDQ7CisJfQorfQorCisjaWZkZWYgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMCisKKy8qIFZhbHVlIGZvciBpbm9kZS0+dS5leHQzX2kuaV9hY2wgYW5kIGlub2RlLT51LmV4dDNfaS5pX2RlZmF1bHRfYWNsCisgICBpZiB0aGUgQUNMIGhhcyBub3QgYmVlbiBjYWNoZWQgKi8KKyNkZWZpbmUgRVhUM19BQ0xfTk9UX0NBQ0hFRCAoKHZvaWQgKiktMSkKKworLyogYWNsLmMgKi8KK2V4dGVybiBpbnQgZXh0M19wZXJtaXNzaW9uIChzdHJ1Y3QgaW5vZGUgKiwgaW50LCBzdHJ1Y3QgbmFtZWlkYXRhICopOworZXh0ZXJuIGludCBleHQzX2FjbF9jaG1vZCAoc3RydWN0IGlub2RlICopOworZXh0ZXJuIGludCBleHQzX2luaXRfYWNsIChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlub2RlICopOworCitleHRlcm4gaW50IGluaXRfZXh0M19hY2wodm9pZCk7CitleHRlcm4gdm9pZCBleGl0X2V4dDNfYWNsKHZvaWQpOworCisjZWxzZSAgLyogQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMICovCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNkZWZpbmUgZXh0M19wZXJtaXNzaW9uIE5VTEwKKworc3RhdGljIGlubGluZSBpbnQKK2V4dDNfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitleHQzX2luaXRfYWNsKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKQoreworCXJldHVybiAwOworfQorI2VuZGlmICAvKiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgKi8KKwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9iYWxsb2MuYyBiL2ZzL2V4dDMvYmFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkNjMyZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDMvYmFsbG9jLmMKQEAgLTAsMCArMSwxNjAwIEBACisvKgorICogIGxpbnV4L2ZzL2V4dDMvYmFsbG9jLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIEVuaGFuY2VkIGJsb2NrIGFsbG9jYXRpb24gYnkgU3RlcGhlbiBUd2VlZGllIChzY3RAcmVkaGF0LmNvbSksIDE5OTMKKyAqICBCaWctZW5kaWFuIHRvIGxpdHRsZS1lbmRpYW4gYnl0ZS1zd2FwcGluZy9iaXRtYXBzIGJ5CisgKiAgICAgICAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KSwgMTk5NQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXh0M19qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKy8qCisgKiBiYWxsb2MuYyBjb250YWlucyB0aGUgYmxvY2tzIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiByb3V0aW5lcworICovCisKKy8qCisgKiBUaGUgZnJlZSBibG9ja3MgYXJlIG1hbmFnZWQgYnkgYml0bWFwcy4gIEEgZmlsZSBzeXN0ZW0gY29udGFpbnMgc2V2ZXJhbAorICogYmxvY2tzIGdyb3Vwcy4gIEVhY2ggZ3JvdXAgY29udGFpbnMgMSBiaXRtYXAgYmxvY2sgZm9yIGJsb2NrcywgMSBiaXRtYXAKKyAqIGJsb2NrIGZvciBpbm9kZXMsIE4gYmxvY2tzIGZvciB0aGUgaW5vZGUgdGFibGUgYW5kIGRhdGEgYmxvY2tzLgorICoKKyAqIFRoZSBmaWxlIHN5c3RlbSBjb250YWlucyBncm91cCBkZXNjcmlwdG9ycyB3aGljaCBhcmUgbG9jYXRlZCBhZnRlciB0aGUKKyAqIHN1cGVyIGJsb2NrLiAgRWFjaCBkZXNjcmlwdG9yIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgdGhlIGJpdG1hcCBibG9jayBhbmQKKyAqIHRoZSBmcmVlIGJsb2NrcyBjb3VudCBpbiB0aGUgYmxvY2suICBUaGUgZGVzY3JpcHRvcnMgYXJlIGxvYWRlZCBpbiBtZW1vcnkKKyAqIHdoZW4gYSBmaWxlIHN5c3RlbSBpcyBtb3VudGVkIChzZWUgZXh0M19yZWFkX3N1cGVyKS4KKyAqLworCisKKyNkZWZpbmUgaW5fcmFuZ2UoYiwgZmlyc3QsIGxlbikJKChiKSA+PSAoZmlyc3QpICYmIChiKSA8PSAoZmlyc3QpICsgKGxlbikgLSAxKQorCitzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICogZXh0M19nZXRfZ3JvdXBfZGVzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgYmxvY2tfZ3JvdXAsCisJCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqIGJoKQoreworCXVuc2lnbmVkIGxvbmcgZ3JvdXBfZGVzYzsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICogZGVzYzsKKwlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkgPSBFWFQzX1NCKHNiKTsKKworCWlmIChibG9ja19ncm91cCA+PSBzYmktPnNfZ3JvdXBzX2NvdW50KSB7CisJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19nZXRfZ3JvdXBfZGVzYyIsCisJCQkgICAgImJsb2NrX2dyb3VwID49IGdyb3Vwc19jb3VudCAtICIKKwkJCSAgICAiYmxvY2tfZ3JvdXAgPSAlZCwgZ3JvdXBzX2NvdW50ID0gJWx1IiwKKwkJCSAgICBibG9ja19ncm91cCwgc2JpLT5zX2dyb3Vwc19jb3VudCk7CisKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNtcF9ybWIoKTsKKworCWdyb3VwX2Rlc2MgPSBibG9ja19ncm91cCA+PiBFWFQzX0RFU0NfUEVSX0JMT0NLX0JJVFMoc2IpOworCW9mZnNldCA9IGJsb2NrX2dyb3VwICYgKEVYVDNfREVTQ19QRVJfQkxPQ0soc2IpIC0gMSk7CisJaWYgKCFzYmktPnNfZ3JvdXBfZGVzY1tncm91cF9kZXNjXSkgeworCQlleHQzX2Vycm9yIChzYiwgImV4dDNfZ2V0X2dyb3VwX2Rlc2MiLAorCQkJICAgICJHcm91cCBkZXNjcmlwdG9yIG5vdCBsb2FkZWQgLSAiCisJCQkgICAgImJsb2NrX2dyb3VwID0gJWQsIGdyb3VwX2Rlc2MgPSAlbHUsIGRlc2MgPSAlbHUiLAorCQkJICAgICBibG9ja19ncm91cCwgZ3JvdXBfZGVzYywgb2Zmc2V0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZGVzYyA9IChzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICopIHNiaS0+c19ncm91cF9kZXNjW2dyb3VwX2Rlc2NdLT5iX2RhdGE7CisJaWYgKGJoKQorCQkqYmggPSBzYmktPnNfZ3JvdXBfZGVzY1tncm91cF9kZXNjXTsKKwlyZXR1cm4gZGVzYyArIG9mZnNldDsKK30KKworLyoKKyAqIFJlYWQgdGhlIGJpdG1hcCBmb3IgYSBnaXZlbiBibG9ja19ncm91cCwgcmVhZGluZyBpbnRvIHRoZSBzcGVjaWZpZWQgCisgKiBzbG90IGluIHRoZSBzdXBlcmJsb2NrJ3MgYml0bWFwIGNhY2hlLgorICoKKyAqIFJldHVybiBidWZmZXJfaGVhZCBvbiBzdWNjZXNzIG9yIE5VTEwgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK3JlYWRfYmxvY2tfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBibG9ja19ncm91cCkKK3sKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICogZGVzYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCA9IE5VTEw7CisKKwlkZXNjID0gZXh0M19nZXRfZ3JvdXBfZGVzYyAoc2IsIGJsb2NrX2dyb3VwLCBOVUxMKTsKKwlpZiAoIWRlc2MpCisJCWdvdG8gZXJyb3Jfb3V0OworCWJoID0gc2JfYnJlYWQoc2IsIGxlMzJfdG9fY3B1KGRlc2MtPmJnX2Jsb2NrX2JpdG1hcCkpOworCWlmICghYmgpCisJCWV4dDNfZXJyb3IgKHNiLCAicmVhZF9ibG9ja19iaXRtYXAiLAorCQkJICAgICJDYW5ub3QgcmVhZCBibG9jayBiaXRtYXAgLSAiCisJCQkgICAgImJsb2NrX2dyb3VwID0gJWQsIGJsb2NrX2JpdG1hcCA9ICV1IiwKKwkJCSAgICBibG9ja19ncm91cCwgbGUzMl90b19jcHUoZGVzYy0+YmdfYmxvY2tfYml0bWFwKSk7CitlcnJvcl9vdXQ6CisJcmV0dXJuIGJoOworfQorLyoKKyAqIFRoZSByZXNlcnZhdGlvbiB3aW5kb3cgc3RydWN0dXJlIG9wZXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPcGVyYXRpb25zIGluY2x1ZGU6CisgKiBkdW1wLCBmaW5kLCBhZGQsIHJlbW92ZSwgaXNfZW1wdHksIGZpbmRfbmV4dF9yZXNlcnZhYmxlX3dpbmRvdywgZXRjLgorICoKKyAqIFdlIHVzZSBzb3J0ZWQgZG91YmxlIGxpbmtlZCBsaXN0IGZvciB0aGUgcGVyLWZpbGVzeXN0ZW0gcmVzZXJ2YXRpb24KKyAqIHdpbmRvdyBsaXN0LiAobGlrZSBpbiB2bV9yZWdpb24pLgorICoKKyAqIEluaXRpYWxseSwgd2Uga2VlcCB0aG9zZSBzbWFsbCBvcGVyYXRpb25zIGluIHRoZSBhYnN0cmFjdCBmdW5jdGlvbnMsCisgKiBzbyBsYXRlciBpZiB3ZSBuZWVkIGEgYmV0dGVyIHNlYXJjaGluZyB0cmVlIHRoYW4gZG91YmxlIGxpbmtlZC1saXN0LAorICogd2UgY291bGQgZWFzaWx5IHN3aXRjaCB0byB0aGF0IHdpdGhvdXQgY2hhbmdpbmcgdG9vIG11Y2gKKyAqIGNvZGUuCisgKi8KKyNpZiAwCitzdGF0aWMgdm9pZCBfX3Jzdl93aW5kb3dfZHVtcChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgaW50IHZlcmJvc2UsCisJCQkgICAgICBjb25zdCBjaGFyICpmbikKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbjsKKwlzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlICpyc3YsICpwcmV2OworCWludCBiYWQ7CisKK3Jlc3RhcnQ6CisJbiA9IHJiX2ZpcnN0KHJvb3QpOworCWJhZCA9IDA7CisJcHJldiA9IE5VTEw7CisKKwlwcmludGsoIkJsb2NrIEFsbG9jYXRpb24gUmVzZXJ2YXRpb24gV2luZG93cyBNYXAgKCVzKTpcbiIsIGZuKTsKKwl3aGlsZSAobikgeworCQlyc3YgPSBsaXN0X2VudHJ5KG4sIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUsIHJzdl9ub2RlKTsKKwkJaWYgKHZlcmJvc2UpCisJCQlwcmludGsoInJlc2VydmF0aW9uIHdpbmRvdyAweCVwICIKKwkJCSAgICAgICAic3RhcnQ6ICAlZCwgZW5kOiAgJWRcbiIsCisJCQkgICAgICAgcnN2LCByc3YtPnJzdl9zdGFydCwgcnN2LT5yc3ZfZW5kKTsKKwkJaWYgKHJzdi0+cnN2X3N0YXJ0ICYmIHJzdi0+cnN2X3N0YXJ0ID49IHJzdi0+cnN2X2VuZCkgeworCQkJcHJpbnRrKCJCYWQgcmVzZXJ2YXRpb24gJXAgKHN0YXJ0ID49IGVuZClcbiIsCisJCQkgICAgICAgcnN2KTsKKwkJCWJhZCA9IDE7CisJCX0KKwkJaWYgKHByZXYgJiYgcHJldi0+cnN2X2VuZCA+PSByc3YtPnJzdl9zdGFydCkgeworCQkJcHJpbnRrKCJCYWQgcmVzZXJ2YXRpb24gJXAgKHByZXYtPmVuZCA+PSBzdGFydClcbiIsCisJCQkgICAgICAgcnN2KTsKKwkJCWJhZCA9IDE7CisJCX0KKwkJaWYgKGJhZCkgeworCQkJaWYgKCF2ZXJib3NlKSB7CisJCQkJcHJpbnRrKCJSZXN0YXJ0aW5nIHJlc2VydmF0aW9uIHdhbGsgaW4gdmVyYm9zZSBtb2RlXG4iKTsKKwkJCQl2ZXJib3NlID0gMTsKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQl9CisJCX0KKwkJbiA9IHJiX25leHQobik7CisJCXByZXYgPSByc3Y7CisJfQorCXByaW50aygiV2luZG93IG1hcCBjb21wbGV0ZS5cbiIpOworCWlmIChiYWQpCisJCUJVRygpOworfQorI2RlZmluZSByc3Zfd2luZG93X2R1bXAocm9vdCwgdmVyYm9zZSkgXAorCV9fcnN2X3dpbmRvd19kdW1wKChyb290KSwgKHZlcmJvc2UpLCBfX0ZVTkNUSU9OX18pCisjZWxzZQorI2RlZmluZSByc3Zfd2luZG93X2R1bXAocm9vdCwgdmVyYm9zZSkgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworc3RhdGljIGludAorZ29hbF9pbl9teV9yZXNlcnZhdGlvbihzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvdyAqcnN2LCBpbnQgZ29hbCwKKwkJCXVuc2lnbmVkIGludCBncm91cCwgc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJdW5zaWduZWQgbG9uZyBncm91cF9maXJzdF9ibG9jaywgZ3JvdXBfbGFzdF9ibG9jazsKKworCWdyb3VwX2ZpcnN0X2Jsb2NrID0gbGUzMl90b19jcHUoRVhUM19TQihzYiktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgKworCQkJCWdyb3VwICogRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwlncm91cF9sYXN0X2Jsb2NrID0gZ3JvdXBfZmlyc3RfYmxvY2sgKyBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gMTsKKworCWlmICgocnN2LT5fcnN2X3N0YXJ0ID4gZ3JvdXBfbGFzdF9ibG9jaykgfHwKKwkgICAgKHJzdi0+X3Jzdl9lbmQgPCBncm91cF9maXJzdF9ibG9jaykpCisJCXJldHVybiAwOworCWlmICgoZ29hbCA+PSAwKSAmJiAoKGdvYWwgKyBncm91cF9maXJzdF9ibG9jayA8IHJzdi0+X3Jzdl9zdGFydCkKKwkJfHwgKGdvYWwgKyBncm91cF9maXJzdF9ibG9jayA+IHJzdi0+X3Jzdl9lbmQpKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBGaW5kIHRoZSByZXNlcnZlZCB3aW5kb3cgd2hpY2ggaW5jbHVkZXMgdGhlIGdvYWwsIG9yIHRoZSBwcmV2aW91cyBvbmUKKyAqIGlmIHRoZSBnb2FsIGlzIG5vdCBpbiBhbnkgd2luZG93LgorICogUmV0dXJucyBOVUxMIGlmIHRoZXJlIGFyZSBubyB3aW5kb3dzIG9yIGlmIGFsbCB3aW5kb3dzIHN0YXJ0IGFmdGVyIHRoZSBnb2FsLgorICovCitzdGF0aWMgc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqCitzZWFyY2hfcmVzZXJ2ZV93aW5kb3coc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHVuc2lnbmVkIGxvbmcgZ29hbCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHJvb3QtPnJiX25vZGU7CisJc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqcnN2OworCisJaWYgKCFuKQorCQlyZXR1cm4gTlVMTDsKKworCWRvIHsKKwkJcnN2ID0gcmJfZW50cnkobiwgc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSwgcnN2X25vZGUpOworCisJCWlmIChnb2FsIDwgcnN2LT5yc3Zfc3RhcnQpCisJCQluID0gbi0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoZ29hbCA+IHJzdi0+cnN2X2VuZCkKKwkJCW4gPSBuLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcmV0dXJuIHJzdjsKKwl9IHdoaWxlIChuKTsKKwkvKgorCSAqIFdlJ3ZlIGZhbGxlbiBvZmYgdGhlIGVuZCBvZiB0aGUgdHJlZTogdGhlIGdvYWwgd2Fzbid0IGluc2lkZQorCSAqIGFueSBwYXJ0aWN1bGFyIG5vZGUuICBPSywgdGhlIHByZXZpb3VzIG5vZGUgbXVzdCBiZSB0byBvbmUKKwkgKiBzaWRlIG9mIHRoZSBpbnRlcnZhbCBjb250YWluaW5nIHRoZSBnb2FsLiAgSWYgaXQncyB0aGUgUkhTLAorCSAqIHdlIG5lZWQgdG8gYmFjayB1cCBvbmUuCisJICovCisJaWYgKHJzdi0+cnN2X3N0YXJ0ID4gZ29hbCkgeworCQluID0gcmJfcHJldigmcnN2LT5yc3Zfbm9kZSk7CisJCXJzdiA9IHJiX2VudHJ5KG4sIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUsIHJzdl9ub2RlKTsKKwl9CisJcmV0dXJuIHJzdjsKK30KKwordm9pZCBleHQzX3Jzdl93aW5kb3dfYWRkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCSAgICBzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlICpyc3YpCit7CisJc3RydWN0IHJiX3Jvb3QgKnJvb3QgPSAmRVhUM19TQihzYiktPnNfcnN2X3dpbmRvd19yb290OworCXN0cnVjdCByYl9ub2RlICpub2RlID0gJnJzdi0+cnN2X25vZGU7CisJdW5zaWduZWQgaW50IHN0YXJ0ID0gcnN2LT5yc3Zfc3RhcnQ7CisKKwlzdHJ1Y3QgcmJfbm9kZSAqKiBwID0gJnJvb3QtPnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKiBwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKnRoaXM7CisKKwl3aGlsZSAoKnApCisJeworCQlwYXJlbnQgPSAqcDsKKwkJdGhpcyA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSwgcnN2X25vZGUpOworCisJCWlmIChzdGFydCA8IHRoaXMtPnJzdl9zdGFydCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoc3RhcnQgPiB0aGlzLT5yc3ZfZW5kKQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJQlVHKCk7CisJfQorCisJcmJfbGlua19ub2RlKG5vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKG5vZGUsIHJvb3QpOworfQorCitzdGF0aWMgdm9pZCByc3Zfd2luZG93X3JlbW92ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICAgICAgc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqcnN2KQoreworCXJzdi0+cnN2X3N0YXJ0ID0gRVhUM19SRVNFUlZFX1dJTkRPV19OT1RfQUxMT0NBVEVEOworCXJzdi0+cnN2X2VuZCA9IEVYVDNfUkVTRVJWRV9XSU5ET1dfTk9UX0FMTE9DQVRFRDsKKwlyc3YtPnJzdl9hbGxvY19oaXQgPSAwOworCXJiX2VyYXNlKCZyc3YtPnJzdl9ub2RlLCAmRVhUM19TQihzYiktPnNfcnN2X3dpbmRvd19yb290KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcnN2X2lzX2VtcHR5KHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93ICpyc3YpCit7CisJLyogYSB2YWxpZCByZXNlcnZhdGlvbiBlbmQgYmxvY2sgY291bGQgbm90IGJlIDAgKi8KKwlyZXR1cm4gKHJzdi0+X3Jzdl9lbmQgPT0gRVhUM19SRVNFUlZFX1dJTkRPV19OT1RfQUxMT0NBVEVEKTsKK30KK3ZvaWQgZXh0M19pbml0X2Jsb2NrX2FsbG9jX2luZm8oc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvICplaSA9IEVYVDNfSShpbm9kZSk7CisJc3RydWN0IGV4dDNfYmxvY2tfYWxsb2NfaW5mbyAqYmxvY2tfaSA9IGVpLT5pX2Jsb2NrX2FsbG9jX2luZm87CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCisJYmxvY2tfaSA9IGttYWxsb2Moc2l6ZW9mKCpibG9ja19pKSwgR0ZQX05PRlMpOworCWlmIChibG9ja19pKSB7CisJCXN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKnJzdiA9ICZibG9ja19pLT5yc3Zfd2luZG93X25vZGU7CisKKwkJcnN2LT5yc3Zfc3RhcnQgPSBFWFQzX1JFU0VSVkVfV0lORE9XX05PVF9BTExPQ0FURUQ7CisJCXJzdi0+cnN2X2VuZCA9IEVYVDNfUkVTRVJWRV9XSU5ET1dfTk9UX0FMTE9DQVRFRDsKKworCSAJLyoKKwkJICogaWYgZmlsZXN5c3RlbSBpcyBtb3VudGVkIHdpdGggTk9SRVNFUlZBVElPTiwgdGhlIGdvYWwKKwkJICogcmVzZXJ2YXRpb24gd2luZG93IHNpemUgaXMgc2V0IHRvIHplcm8gdG8gaW5kaWNhdGUKKwkJICogYmxvY2sgcmVzZXJ2YXRpb24gaXMgb2ZmCisJCSAqLworCQlpZiAoIXRlc3Rfb3B0KHNiLCBSRVNFUlZBVElPTikpCisJCQlyc3YtPnJzdl9nb2FsX3NpemUgPSAwOworCQllbHNlCisJCQlyc3YtPnJzdl9nb2FsX3NpemUgPSBFWFQzX0RFRkFVTFRfUkVTRVJWRV9CTE9DS1M7CisJCXJzdi0+cnN2X2FsbG9jX2hpdCA9IDA7CisJCWJsb2NrX2ktPmxhc3RfYWxsb2NfbG9naWNhbF9ibG9jayA9IDA7CisJCWJsb2NrX2ktPmxhc3RfYWxsb2NfcGh5c2ljYWxfYmxvY2sgPSAwOworCX0KKwllaS0+aV9ibG9ja19hbGxvY19pbmZvID0gYmxvY2tfaTsKK30KKwordm9pZCBleHQzX2Rpc2NhcmRfcmVzZXJ2YXRpb24oc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvICplaSA9IEVYVDNfSShpbm9kZSk7CisJc3RydWN0IGV4dDNfYmxvY2tfYWxsb2NfaW5mbyAqYmxvY2tfaSA9IGVpLT5pX2Jsb2NrX2FsbG9jX2luZm87CisJc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqcnN2OworCXNwaW5sb2NrX3QgKnJzdl9sb2NrID0gJkVYVDNfU0IoaW5vZGUtPmlfc2IpLT5zX3Jzdl93aW5kb3dfbG9jazsKKworCWlmICghYmxvY2tfaSkKKwkJcmV0dXJuOworCisJcnN2ID0gJmJsb2NrX2ktPnJzdl93aW5kb3dfbm9kZTsKKwlpZiAoIXJzdl9pc19lbXB0eSgmcnN2LT5yc3Zfd2luZG93KSkgeworCQlzcGluX2xvY2socnN2X2xvY2spOworCQlpZiAoIXJzdl9pc19lbXB0eSgmcnN2LT5yc3Zfd2luZG93KSkKKwkJCXJzdl93aW5kb3dfcmVtb3ZlKGlub2RlLT5pX3NiLCByc3YpOworCQlzcGluX3VubG9jayhyc3ZfbG9jayk7CisJfQorfQorCisvKiBGcmVlIGdpdmVuIGJsb2NrcywgdXBkYXRlIHF1b3RhIGFuZCBpX2Jsb2NrcyBmaWVsZCAqLwordm9pZCBleHQzX2ZyZWVfYmxvY2tzX3NiKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgdW5zaWduZWQgbG9uZyBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCwKKwkJCSBpbnQgKnBkcXVvdF9mcmVlZF9ibG9ja3MpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RfYmg7CisJdW5zaWduZWQgbG9uZyBibG9ja19ncm91cDsKKwl1bnNpZ25lZCBsb25nIGJpdDsKKwl1bnNpZ25lZCBsb25nIGk7CisJdW5zaWduZWQgbG9uZyBvdmVyZmxvdzsKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICogZGVzYzsKKwlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzOworCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaTsKKwlpbnQgZXJyID0gMCwgcmV0OworCXVuc2lnbmVkIGdyb3VwX2ZyZWVkOworCisJKnBkcXVvdF9mcmVlZF9ibG9ja3MgPSAwOworCXNiaSA9IEVYVDNfU0Ioc2IpOworCWVzID0gc2JpLT5zX2VzOworCWlmIChibG9jayA8IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spIHx8CisJICAgIGJsb2NrICsgY291bnQgPCBibG9jayB8fAorCSAgICBibG9jayArIGNvdW50ID4gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSkgeworCQlleHQzX2Vycm9yIChzYiwgImV4dDNfZnJlZV9ibG9ja3MiLAorCQkJICAgICJGcmVlaW5nIGJsb2NrcyBub3QgaW4gZGF0YXpvbmUgLSAiCisJCQkgICAgImJsb2NrID0gJWx1LCBjb3VudCA9ICVsdSIsIGJsb2NrLCBjb3VudCk7CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworCWV4dDNfZGVidWcgKCJmcmVlaW5nIGJsb2NrKHMpICVsdS0lbHVcbiIsIGJsb2NrLCBibG9jayArIGNvdW50IC0gMSk7CisKK2RvX21vcmU6CisJb3ZlcmZsb3cgPSAwOworCWJsb2NrX2dyb3VwID0gKGJsb2NrIC0gbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykpIC8KKwkJICAgICAgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwliaXQgPSAoYmxvY2sgLSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSkgJQorCQkgICAgICBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpOworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBmcmVlaW5nIGJsb2NrcyBhY3Jvc3MgYSBncm91cAorCSAqIGJvdW5kYXJ5LgorCSAqLworCWlmIChiaXQgKyBjb3VudCA+IEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikpIHsKKwkJb3ZlcmZsb3cgPSBiaXQgKyBjb3VudCAtIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJCWNvdW50IC09IG92ZXJmbG93OworCX0KKwlicmVsc2UoYml0bWFwX2JoKTsKKwliaXRtYXBfYmggPSByZWFkX2Jsb2NrX2JpdG1hcChzYiwgYmxvY2tfZ3JvdXApOworCWlmICghYml0bWFwX2JoKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwlkZXNjID0gZXh0M19nZXRfZ3JvdXBfZGVzYyAoc2IsIGJsb2NrX2dyb3VwLCAmZ2RfYmgpOworCWlmICghZGVzYykKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwlpZiAoaW5fcmFuZ2UgKGxlMzJfdG9fY3B1KGRlc2MtPmJnX2Jsb2NrX2JpdG1hcCksIGJsb2NrLCBjb3VudCkgfHwKKwkgICAgaW5fcmFuZ2UgKGxlMzJfdG9fY3B1KGRlc2MtPmJnX2lub2RlX2JpdG1hcCksIGJsb2NrLCBjb3VudCkgfHwKKwkgICAgaW5fcmFuZ2UgKGJsb2NrLCBsZTMyX3RvX2NwdShkZXNjLT5iZ19pbm9kZV90YWJsZSksCisJCSAgICAgIHNiaS0+c19pdGJfcGVyX2dyb3VwKSB8fAorCSAgICBpbl9yYW5nZSAoYmxvY2sgKyBjb3VudCAtIDEsIGxlMzJfdG9fY3B1KGRlc2MtPmJnX2lub2RlX3RhYmxlKSwKKwkJICAgICAgc2JpLT5zX2l0Yl9wZXJfZ3JvdXApKQorCQlleHQzX2Vycm9yIChzYiwgImV4dDNfZnJlZV9ibG9ja3MiLAorCQkJICAgICJGcmVlaW5nIGJsb2NrcyBpbiBzeXN0ZW0gem9uZXMgLSAiCisJCQkgICAgIkJsb2NrID0gJWx1LCBjb3VudCA9ICVsdSIsCisJCQkgICAgYmxvY2ssIGNvdW50KTsKKworCS8qCisJICogV2UgYXJlIGFib3V0IHRvIHN0YXJ0IHJlbGVhc2luZyBibG9ja3MgaW4gdGhlIGJpdG1hcCwKKwkgKiBzbyB3ZSBuZWVkIHVuZG8gYWNjZXNzLgorCSAqLworCS8qIEBAQCBjaGVjayBlcnJvcnMgKi8KKwlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiZ2V0dGluZyB1bmRvIGFjY2VzcyIpOworCWVyciA9IGV4dDNfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoaGFuZGxlLCBiaXRtYXBfYmgpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJLyoKKwkgKiBXZSBhcmUgYWJvdXQgdG8gbW9kaWZ5IHNvbWUgbWV0YWRhdGEuICBDYWxsIHRoZSBqb3VybmFsIEFQSXMKKwkgKiB0byB1bnNoYXJlIC0+Yl9kYXRhIGlmIGEgY3VycmVudGx5LWNvbW1pdHRpbmcgdHJhbnNhY3Rpb24gaXMKKwkgKiB1c2luZyBpdAorCSAqLworCUJVRkZFUl9UUkFDRShnZF9iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGdkX2JoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yX3JldHVybjsKKworCWpiZF9sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7CisKKwlmb3IgKGkgPSAwLCBncm91cF9mcmVlZCA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCS8qCisJCSAqIEFuIEhKIHNwZWNpYWwuICBUaGlzIGlzIGV4cGVuc2l2ZS4uLgorCQkgKi8KKyNpZmRlZiBDT05GSUdfSkJEX0RFQlVHCisJCWpiZF91bmxvY2tfYmhfc3RhdGUoYml0bWFwX2JoKTsKKwkJeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpkZWJ1Z19iaDsKKwkJCWRlYnVnX2JoID0gc2JfZmluZF9nZXRfYmxvY2soc2IsIGJsb2NrICsgaSk7CisJCQlpZiAoZGVidWdfYmgpIHsKKwkJCQlCVUZGRVJfVFJBQ0UoZGVidWdfYmgsICJEZWxldGVkISIpOworCQkJCWlmICghYmgyamgoYml0bWFwX2JoKS0+Yl9jb21taXR0ZWRfZGF0YSkKKwkJCQkJQlVGRkVSX1RSQUNFKGRlYnVnX2JoLAorCQkJCQkJIk5vIGNvbW1pdGVkIGRhdGEgaW4gYml0bWFwIik7CisJCQkJQlVGRkVSX1RSQUNFMihkZWJ1Z19iaCwgYml0bWFwX2JoLCAiYml0bWFwIik7CisJCQkJX19icmVsc2UoZGVidWdfYmgpOworCQkJfQorCQl9CisJCWpiZF9sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7CisjZW5kaWYKKwkJaWYgKG5lZWRfcmVzY2hlZCgpKSB7CisJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJCWpiZF9sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7CisJCX0KKwkJLyogQEBAIFRoaXMgcHJldmVudHMgbmV3bHktYWxsb2NhdGVkIGRhdGEgZnJvbSBiZWluZworCQkgKiBmcmVlZCBhbmQgdGhlbiByZWFsbG9jYXRlZCB3aXRoaW4gdGhlIHNhbWUKKwkJICogdHJhbnNhY3Rpb24uIAorCQkgKiAKKwkJICogSWRlYWxseSB3ZSB3b3VsZCB3YW50IHRvIGFsbG93IHRoYXQgdG8gaGFwcGVuLCBidXQgdG8KKwkJICogZG8gc28gcmVxdWlyZXMgbWFraW5nIGpvdXJuYWxfZm9yZ2V0KCkgY2FwYWJsZSBvZgorCQkgKiByZXZva2luZyB0aGUgcXVldWVkIHdyaXRlIG9mIGEgZGF0YSBibG9jaywgd2hpY2gKKwkJICogaW1wbGllcyBibG9ja2luZyBvbiB0aGUgam91cm5hbCBsb2NrLiAgKmZvcmdldCgpCisJCSAqIGNhbm5vdCBibG9jayBkdWUgdG8gdHJ1bmNhdGUgcmFjZXMuCisJCSAqCisJCSAqIEV2ZW50dWFsbHkgd2UgY2FuIGZpeCB0aGlzIGJ5IG1ha2luZyBqb3VybmFsX2ZvcmdldCgpCisJCSAqIHJldHVybiBhIHN0YXR1cyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGl0IHdhcyBhYmxlCisJCSAqIHRvIHJldm9rZSB0aGUgYnVmZmVyLiAgT24gc3VjY2Vzc2Z1bCByZXZva2UsIGl0IGlzCisJCSAqIHNhZmUgbm90IHRvIHNldCB0aGUgYWxsb2NhdGlvbiBiaXQgaW4gdGhlIGNvbW1pdHRlZAorCQkgKiBiaXRtYXAsIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZXJlIGlzIG5vIG91dHN0YW5kaW5nCisJCSAqIGFjdGl2aXR5IG9uIHRoZSBidWZmZXIgYW55IG1vcmUgYW5kIHNvIGl0IGlzIHNhZmUgdG8KKwkJICogcmVhbGxvY2F0ZSBpdC4gIAorCQkgKi8KKwkJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgInNldCBpbiBiX2NvbW1pdHRlZF9kYXRhIik7CisJCUpfQVNTRVJUX0JIKGJpdG1hcF9iaCwKKwkJCQliaDJqaChiaXRtYXBfYmgpLT5iX2NvbW1pdHRlZF9kYXRhICE9IE5VTEwpOworCQlleHQzX3NldF9iaXRfYXRvbWljKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApLCBiaXQgKyBpLAorCQkJCWJoMmpoKGJpdG1hcF9iaCktPmJfY29tbWl0dGVkX2RhdGEpOworCisJCS8qCisJCSAqIFdlIGNsZWFyIHRoZSBiaXQgaW4gdGhlIGJpdG1hcCBhZnRlciBzZXR0aW5nIHRoZSBjb21taXR0ZWQKKwkJICogZGF0YSBiaXQsIGJlY2F1c2UgdGhpcyBpcyB0aGUgcmV2ZXJzZSBvcmRlciB0byB0aGF0IHdoaWNoCisJCSAqIHRoZSBhbGxvY2F0b3IgdXNlcy4KKwkJICovCisJCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJjbGVhciBiaXQiKTsKKwkJaWYgKCFleHQzX2NsZWFyX2JpdF9hdG9taWMoc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCksCisJCQkJCQliaXQgKyBpLCBiaXRtYXBfYmgtPmJfZGF0YSkpIHsKKwkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYml0bWFwX2JoKTsKKwkJCWV4dDNfZXJyb3Ioc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkiYml0IGFscmVhZHkgY2xlYXJlZCBmb3IgYmxvY2sgJWx1IiwgYmxvY2sgKyBpKTsKKwkJCWpiZF9sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7CisJCQlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiYml0IGFscmVhZHkgY2xlYXJlZCIpOworCQl9IGVsc2UgeworCQkJZ3JvdXBfZnJlZWQrKzsKKwkJfQorCX0KKwlqYmRfdW5sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7CisKKwlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCkpOworCWRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50ID0KKwkJY3B1X3RvX2xlMTYobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpICsKKwkJCWdyb3VwX2ZyZWVkKTsKKwlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSk7CisJcGVyY3B1X2NvdW50ZXJfbW9kKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyLCBjb3VudCk7CisKKwkvKiBXZSBkaXJ0aWVkIHRoZSBiaXRtYXAgYmxvY2sgKi8KKwlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiZGlydGllZCBiaXRtYXAgYmxvY2siKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaXRtYXBfYmgpOworCisJLyogQW5kIHRoZSBncm91cCBkZXNjcmlwdG9yIGJsb2NrICovCisJQlVGRkVSX1RSQUNFKGdkX2JoLCAiZGlydGllZCBncm91cCBkZXNjcmlwdG9yIGJsb2NrIik7CisJcmV0ID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZ2RfYmgpOworCWlmICghZXJyKSBlcnIgPSByZXQ7CisJKnBkcXVvdF9mcmVlZF9ibG9ja3MgKz0gZ3JvdXBfZnJlZWQ7CisKKwlpZiAob3ZlcmZsb3cgJiYgIWVycikgeworCQlibG9jayArPSBjb3VudDsKKwkJY291bnQgPSBvdmVyZmxvdzsKKwkJZ290byBkb19tb3JlOworCX0KKwlzYi0+c19kaXJ0ID0gMTsKK2Vycm9yX3JldHVybjoKKwlicmVsc2UoYml0bWFwX2JoKTsKKwlleHQzX3N0ZF9lcnJvcihzYiwgZXJyKTsKKwlyZXR1cm47Cit9CisKKy8qIEZyZWUgZ2l2ZW4gYmxvY2tzLCB1cGRhdGUgcXVvdGEgYW5kIGlfYmxvY2tzIGZpZWxkICovCit2b2lkIGV4dDNfZnJlZV9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCXVuc2lnbmVkIGxvbmcgYmxvY2ssIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJaW50IGRxdW90X2ZyZWVkX2Jsb2NrczsKKworCXNiID0gaW5vZGUtPmlfc2I7CisJaWYgKCFzYikgeworCQlwcmludGsgKCJleHQzX2ZyZWVfYmxvY2tzOiBub25leGlzdGVudCBkZXZpY2UiKTsKKwkJcmV0dXJuOworCX0KKwlleHQzX2ZyZWVfYmxvY2tzX3NiKGhhbmRsZSwgc2IsIGJsb2NrLCBjb3VudCwgJmRxdW90X2ZyZWVkX2Jsb2Nrcyk7CisJaWYgKGRxdW90X2ZyZWVkX2Jsb2NrcykKKwkJRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgZHF1b3RfZnJlZWRfYmxvY2tzKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBGb3IgZXh0MyBhbGxvY2F0aW9ucywgd2UgbXVzdCBub3QgcmV1c2UgYW55IGJsb2NrcyB3aGljaCBhcmUKKyAqIGFsbG9jYXRlZCBpbiB0aGUgYml0bWFwIGJ1ZmZlcidzICJsYXN0IGNvbW1pdHRlZCBkYXRhIiBjb3B5LiAgVGhpcworICogcHJldmVudHMgZGVsZXRlcyBmcm9tIGZyZWVpbmcgdXAgdGhlIHBhZ2UgZm9yIHJldXNlIHVudGlsIHdlIGhhdmUKKyAqIGNvbW1pdHRlZCB0aGUgZGVsZXRlIHRyYW5zYWN0aW9uLgorICoKKyAqIElmIHdlIGRpZG4ndCBkbyB0aGlzLCB0aGVuIGRlbGV0aW5nIHNvbWV0aGluZyBhbmQgcmVhbGxvY2F0aW5nIGl0IGFzCisgKiBkYXRhIHdvdWxkIGFsbG93IHRoZSBvbGQgYmxvY2sgdG8gYmUgb3ZlcndyaXR0ZW4gYmVmb3JlIHRoZQorICogdHJhbnNhY3Rpb24gY29tbWl0dGVkIChiZWNhdXNlIHdlIGZvcmNlIGRhdGEgdG8gZGlzayBiZWZvcmUgY29tbWl0KS4KKyAqIFRoaXMgd291bGQgbGVhZCB0byBjb3JydXB0aW9uIGlmIHdlIGNyYXNoZWQgYmV0d2VlbiBvdmVyd3JpdGluZyB0aGUKKyAqIGRhdGEgYW5kIGNvbW1pdHRpbmcgdGhlIGRlbGV0ZS4gCisgKgorICogQEBAIFdlIG1heSB3YW50IHRvIG1ha2UgdGhpcyBhbGxvY2F0aW9uIGJlaGF2aW91ciBjb25kaXRpb25hbCBvbgorICogZGF0YS13cml0ZXMgYXQgc29tZSBwb2ludCwgYW5kIGRpc2FibGUgaXQgZm9yIG1ldGFkYXRhIGFsbG9jYXRpb25zIG9yCisgKiBzeW5jLWRhdGEgaW5vZGVzLgorICovCitzdGF0aWMgaW50IGV4dDNfdGVzdF9hbGxvY2F0YWJsZShpbnQgbnIsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGJoMmpoKGJoKTsKKworCWlmIChleHQzX3Rlc3RfYml0KG5yLCBiaC0+Yl9kYXRhKSkKKwkJcmV0dXJuIDA7CisKKwlqYmRfbG9ja19iaF9zdGF0ZShiaCk7CisJaWYgKCFqaC0+Yl9jb21taXR0ZWRfZGF0YSkKKwkJcmV0ID0gMTsKKwllbHNlCisJCXJldCA9ICFleHQzX3Rlc3RfYml0KG5yLCBqaC0+Yl9jb21taXR0ZWRfZGF0YSk7CisJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorYml0bWFwX3NlYXJjaF9uZXh0X3VzYWJsZV9ibG9jayhpbnQgc3RhcnQsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJCWludCBtYXhibG9ja3MpCit7CisJaW50IG5leHQ7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqamggPSBiaDJqaChiaCk7CisKKwkvKgorCSAqIFRoZSBiaXRtYXAgc2VhcmNoIC0tLSBzZWFyY2ggZm9yd2FyZCBhbHRlcm5hdGVseSB0aHJvdWdoIHRoZSBhY3R1YWwKKwkgKiBiaXRtYXAgYW5kIHRoZSBsYXN0LWNvbW1pdHRlZCBjb3B5IHVudGlsIHdlIGZpbmQgYSBiaXQgZnJlZSBpbgorCSAqIGJvdGgKKwkgKi8KKwl3aGlsZSAoc3RhcnQgPCBtYXhibG9ja3MpIHsKKwkJbmV4dCA9IGV4dDNfZmluZF9uZXh0X3plcm9fYml0KGJoLT5iX2RhdGEsIG1heGJsb2Nrcywgc3RhcnQpOworCQlpZiAobmV4dCA+PSBtYXhibG9ja3MpCisJCQlyZXR1cm4gLTE7CisJCWlmIChleHQzX3Rlc3RfYWxsb2NhdGFibGUobmV4dCwgYmgpKQorCQkJcmV0dXJuIG5leHQ7CisJCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwkJaWYgKGpoLT5iX2NvbW1pdHRlZF9kYXRhKQorCQkJc3RhcnQgPSBleHQzX2ZpbmRfbmV4dF96ZXJvX2JpdChqaC0+Yl9jb21taXR0ZWRfZGF0YSwKKwkJCQkJCSAJbWF4YmxvY2tzLCBuZXh0KTsKKwkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJfQorCXJldHVybiAtMTsKK30KKworLyoKKyAqIEZpbmQgYW4gYWxsb2NhdGFibGUgYmxvY2sgaW4gYSBiaXRtYXAuICBXZSBob25vdXIgYm90aCB0aGUgYml0bWFwIGFuZAorICogaXRzIGxhc3QtY29tbWl0dGVkIGNvcHkgKGlmIHRoYXQgZXhpc3RzKSwgYW5kIHBlcmZvcm0gdGhlICJtb3N0CisgKiBhcHByb3ByaWF0ZSBhbGxvY2F0aW9uIiBhbGdvcml0aG0gb2YgbG9va2luZyBmb3IgYSBmcmVlIGJsb2NrIG5lYXIKKyAqIHRoZSBpbml0aWFsIGdvYWw7IHRoZW4gZm9yIGEgZnJlZSBieXRlIHNvbWV3aGVyZSBpbiB0aGUgYml0bWFwOyB0aGVuCisgKiBmb3IgYW55IGZyZWUgYml0IGluIHRoZSBiaXRtYXAuCisgKi8KK3N0YXRpYyBpbnQKK2ZpbmRfbmV4dF91c2FibGVfYmxvY2soaW50IHN0YXJ0LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgbWF4YmxvY2tzKQoreworCWludCBoZXJlLCBuZXh0OworCWNoYXIgKnAsICpyOworCisJaWYgKHN0YXJ0ID4gMCkgeworCQkvKgorCQkgKiBUaGUgZ29hbCB3YXMgb2NjdXBpZWQ7IHNlYXJjaCBmb3J3YXJkIGZvciBhIGZyZWUgCisJCSAqIGJsb2NrIHdpdGhpbiB0aGUgbmV4dCBYWCBibG9ja3MuCisJCSAqCisJCSAqIGVuZF9nb2FsIGlzIG1vcmUgb3IgbGVzcyByYW5kb20sIGJ1dCBpdCBoYXMgdG8gYmUKKwkJICogbGVzcyB0aGFuIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUC4gQWxpZ25pbmcgdXAgdG8gdGhlCisJCSAqIG5leHQgNjQtYml0IGJvdW5kYXJ5IGlzIHNpbXBsZS4uCisJCSAqLworCQlpbnQgZW5kX2dvYWwgPSAoc3RhcnQgKyA2MykgJiB+NjM7CisJCWlmIChlbmRfZ29hbCA+IG1heGJsb2NrcykKKwkJCWVuZF9nb2FsID0gbWF4YmxvY2tzOworCQloZXJlID0gZXh0M19maW5kX25leHRfemVyb19iaXQoYmgtPmJfZGF0YSwgZW5kX2dvYWwsIHN0YXJ0KTsKKwkJaWYgKGhlcmUgPCBlbmRfZ29hbCAmJiBleHQzX3Rlc3RfYWxsb2NhdGFibGUoaGVyZSwgYmgpKQorCQkJcmV0dXJuIGhlcmU7CisJCWV4dDNfZGVidWcoIkJpdCBub3QgZm91bmQgbmVhciBnb2FsXG4iKTsKKwl9CisKKwloZXJlID0gc3RhcnQ7CisJaWYgKGhlcmUgPCAwKQorCQloZXJlID0gMDsKKworCXAgPSAoKGNoYXIgKiliaC0+Yl9kYXRhKSArIChoZXJlID4+IDMpOworCXIgPSBtZW1zY2FuKHAsIDAsIChtYXhibG9ja3MgLSBoZXJlICsgNykgPj4gMyk7CisJbmV4dCA9IChyIC0gKChjaGFyICopYmgtPmJfZGF0YSkpIDw8IDM7CisKKwlpZiAobmV4dCA8IG1heGJsb2NrcyAmJiBuZXh0ID49IHN0YXJ0ICYmIGV4dDNfdGVzdF9hbGxvY2F0YWJsZShuZXh0LCBiaCkpCisJCXJldHVybiBuZXh0OworCisJLyoKKwkgKiBUaGUgYml0bWFwIHNlYXJjaCAtLS0gc2VhcmNoIGZvcndhcmQgYWx0ZXJuYXRlbHkgdGhyb3VnaCB0aGUgYWN0dWFsCisJICogYml0bWFwIGFuZCB0aGUgbGFzdC1jb21taXR0ZWQgY29weSB1bnRpbCB3ZSBmaW5kIGEgYml0IGZyZWUgaW4KKwkgKiBib3RoCisJICovCisJaGVyZSA9IGJpdG1hcF9zZWFyY2hfbmV4dF91c2FibGVfYmxvY2soaGVyZSwgYmgsIG1heGJsb2Nrcyk7CisJcmV0dXJuIGhlcmU7Cit9CisKKy8qCisgKiBXZSB0aGluayB3ZSBjYW4gYWxsb2NhdGUgdGhpcyBibG9jayBpbiB0aGlzIGJpdG1hcC4gIFRyeSB0byBzZXQgdGhlIGJpdC4KKyAqIElmIHRoYXQgc3VjY2VlZHMgdGhlbiBjaGVjayB0aGF0IG5vYm9keSBoYXMgYWxsb2NhdGVkIGFuZCB0aGVuIGZyZWVkIHRoZQorICogYmxvY2sgc2luY2Ugd2Ugc2F3IHRoYXQgaXMgd2FzIG5vdCBtYXJrZWQgaW4gYl9jb21taXR0ZWRfZGF0YS4gIElmIGl0IF93YXNfCisgKiBhbGxvY2F0ZWQgYW5kIGZyZWVkIHRoZW4gY2xlYXIgdGhlIGJpdCBpbiB0aGUgYml0bWFwIGFnYWluIGFuZCByZXR1cm4KKyAqIHplcm8gKGZhaWx1cmUpLgorICovCitzdGF0aWMgaW5saW5lIGludAorY2xhaW1fYmxvY2soc3BpbmxvY2tfdCAqbG9jaywgaW50IGJsb2NrLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoID0gYmgyamgoYmgpOworCWludCByZXQ7CisKKwlpZiAoZXh0M19zZXRfYml0X2F0b21pYyhsb2NrLCBibG9jaywgYmgtPmJfZGF0YSkpCisJCXJldHVybiAwOworCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwlpZiAoamgtPmJfY29tbWl0dGVkX2RhdGEgJiYgZXh0M190ZXN0X2JpdChibG9jayxqaC0+Yl9jb21taXR0ZWRfZGF0YSkpIHsKKwkJZXh0M19jbGVhcl9iaXRfYXRvbWljKGxvY2ssIGJsb2NrLCBiaC0+Yl9kYXRhKTsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlyZXQgPSAxOworCX0KKwlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogSWYgd2UgZmFpbGVkIHRvIGFsbG9jYXRlIHRoZSBkZXNpcmVkIGJsb2NrIHRoZW4gd2UgbWF5IGVuZCB1cCBjcm9zc2luZyB0byBhCisgKiBuZXcgYml0bWFwLiAgSW4gdGhhdCBjYXNlIHdlIG11c3QgcmVsZWFzZSB3cml0ZSBhY2Nlc3MgdG8gdGhlIG9sZCBvbmUgdmlhCisgKiBleHQzX2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoKSwgZWxzZSB3ZSdsbCBydW4gb3V0IG9mIGNyZWRpdHMuCisgKi8KK3N0YXRpYyBpbnQKK2V4dDNfdHJ5X3RvX2FsbG9jYXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGhhbmRsZV90ICpoYW5kbGUsIGludCBncm91cCwKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCwgaW50IGdvYWwsIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93ICpteV9yc3YpCit7CisJaW50IGdyb3VwX2ZpcnN0X2Jsb2NrLCBzdGFydCwgZW5kOworCisJLyogd2UgZG8gYWxsb2NhdGlvbiB3aXRoaW4gdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBpZiB3ZSBoYXZlIGEgd2luZG93ICovCisJaWYgKG15X3JzdikgeworCQlncm91cF9maXJzdF9ibG9jayA9CisJCQlsZTMyX3RvX2NwdShFWFQzX1NCKHNiKS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKSArCisJCQlncm91cCAqIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJCWlmIChteV9yc3YtPl9yc3Zfc3RhcnQgPj0gZ3JvdXBfZmlyc3RfYmxvY2spCisJCQlzdGFydCA9IG15X3Jzdi0+X3Jzdl9zdGFydCAtIGdyb3VwX2ZpcnN0X2Jsb2NrOworCQllbHNlCisJCQkvKiByZXNlcnZhdGlvbiB3aW5kb3cgY3Jvc3MgZ3JvdXAgYm91bmRhcnkgKi8KKwkJCXN0YXJ0ID0gMDsKKwkJZW5kID0gbXlfcnN2LT5fcnN2X2VuZCAtIGdyb3VwX2ZpcnN0X2Jsb2NrICsgMTsKKwkJaWYgKGVuZCA+IEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikpCisJCQkvKiByZXNlcnZhdGlvbiB3aW5kb3cgY3Jvc3NlcyBncm91cCBib3VuZGFyeSAqLworCQkJZW5kID0gRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwkJaWYgKChzdGFydCA8PSBnb2FsKSAmJiAoZ29hbCA8IGVuZCkpCisJCQlzdGFydCA9IGdvYWw7CisJCWVsc2UKKwkJCWdvYWwgPSAtMTsKKwl9IGVsc2UgeworCQlpZiAoZ29hbCA+IDApCisJCQlzdGFydCA9IGdvYWw7CisJCWVsc2UKKwkJCXN0YXJ0ID0gMDsKKwkJZW5kID0gRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwl9CisKKwlCVUdfT04oc3RhcnQgPiBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpKTsKKworcmVwZWF0OgorCWlmIChnb2FsIDwgMCB8fCAhZXh0M190ZXN0X2FsbG9jYXRhYmxlKGdvYWwsIGJpdG1hcF9iaCkpIHsKKwkJZ29hbCA9IGZpbmRfbmV4dF91c2FibGVfYmxvY2soc3RhcnQsIGJpdG1hcF9iaCwgZW5kKTsKKwkJaWYgKGdvYWwgPCAwKQorCQkJZ290byBmYWlsX2FjY2VzczsKKwkJaWYgKCFteV9yc3YpIHsKKwkJCWludCBpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgNyAmJiBnb2FsID4gc3RhcnQgJiYKKwkJCQkJZXh0M190ZXN0X2FsbG9jYXRhYmxlKGdvYWwgLSAxLAorCQkJCQkJCQliaXRtYXBfYmgpOworCQkJCQlpKyssIGdvYWwtLSkKKwkJCQk7CisJCX0KKwl9CisJc3RhcnQgPSBnb2FsOworCisJaWYgKCFjbGFpbV9ibG9jayhzYl9iZ2xfbG9jayhFWFQzX1NCKHNiKSwgZ3JvdXApLCBnb2FsLCBiaXRtYXBfYmgpKSB7CisJCS8qCisJCSAqIFRoZSBibG9jayB3YXMgYWxsb2NhdGVkIGJ5IGFub3RoZXIgdGhyZWFkLCBvciBpdCB3YXMKKwkJICogYWxsb2NhdGVkIGFuZCB0aGVuIGZyZWVkIGJ5IGFub3RoZXIgdGhyZWFkCisJCSAqLworCQlzdGFydCsrOworCQlnb2FsKys7CisJCWlmIChzdGFydCA+PSBlbmQpCisJCQlnb3RvIGZhaWxfYWNjZXNzOworCQlnb3RvIHJlcGVhdDsKKwl9CisJcmV0dXJuIGdvYWw7CitmYWlsX2FjY2VzczoKKwlyZXR1cm4gLTE7Cit9CisKKy8qKgorICogCWZpbmRfbmV4dF9yZXNlcnZhYmxlX3dpbmRvdygpOgorICoJCWZpbmQgYSByZXNlcnZhYmxlIHNwYWNlIHdpdGhpbiB0aGUgZ2l2ZW4gcmFuZ2UuCisgKgkJSXQgZG9lcyBub3QgYWxsb2NhdGUgdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBmb3Igbm93OgorICoJCWFsbG9jX25ld19yZXNlcnZhdGlvbigpIHdpbGwgZG8gdGhlIHdvcmsgbGF0ZXIuCisgKgorICogCUBzZWFyY2hfaGVhZDogdGhlIGhlYWQgb2YgdGhlIHNlYXJjaGluZyBsaXN0OworICoJCVRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBsaXN0IGhlYWQgb2YgdGhlIHdob2xlIGZpbGVzeXN0ZW0KKyAqCisgKgkJV2UgaGF2ZSBib3RoIGhlYWQgYW5kIHN0YXJ0X2Jsb2NrIHRvIGFzc2lzdCB0aGUgc2VhcmNoCisgKgkJZm9yIHRoZSByZXNlcnZhYmxlIHNwYWNlLiBUaGUgbGlzdCBzdGFydHMgZnJvbSBoZWFkLAorICoJCWJ1dCB3ZSB3aWxsIHNoaWZ0IHRvIHRoZSBwbGFjZSB3aGVyZSBzdGFydF9ibG9jayBpcywKKyAqCQl0aGVuIHN0YXJ0IGZyb20gdGhlcmUsIHdoZW4gbG9va2luZyBmb3IgYSByZXNlcnZhYmxlIHNwYWNlLgorICoKKyAqIAlAc2l6ZTogdGhlIHRhcmdldCBuZXcgcmVzZXJ2YXRpb24gd2luZG93IHNpemUKKyAqCisgKiAJQGdyb3VwX2ZpcnN0X2Jsb2NrOiB0aGUgZmlyc3QgYmxvY2sgd2UgY29uc2lkZXIgdG8gc3RhcnQKKyAqCQkJdGhlIHJlYWwgc2VhcmNoIGZyb20KKyAqCisgKiAJQGxhc3RfYmxvY2s6CisgKgkJdGhlIG1heGltdW0gYmxvY2sgbnVtYmVyIHRoYXQgb3VyIGdvYWwgcmVzZXJ2YWJsZSBzcGFjZQorICoJCWNvdWxkIHN0YXJ0IGZyb20uIFRoaXMgaXMgbm9ybWFsbHkgdGhlIGxhc3QgYmxvY2sgaW4gdGhpcworICoJCWdyb3VwLiBUaGUgc2VhcmNoIHdpbGwgZW5kIHdoZW4gd2UgZm91bmQgdGhlIHN0YXJ0IG9mIG5leHQKKyAqCQlwb3NzaWJsZSByZXNlcnZhYmxlIHNwYWNlIGlzIG91dCBvZiB0aGlzIGJvdW5kYXJ5LgorICoJCVRoaXMgY291bGQgaGFuZGxlIHRoZSBjcm9zcyBib3VuZGFyeSByZXNlcnZhdGlvbiB3aW5kb3cKKyAqCQlyZXF1ZXN0LgorICoKKyAqIAliYXNpY2FsbHkgd2Ugc2VhcmNoIGZyb20gdGhlIGdpdmVuIHJhbmdlLCByYXRoZXIgdGhhbiB0aGUgd2hvbGUKKyAqIAlyZXNlcnZhdGlvbiBkb3VibGUgbGlua2VkIGxpc3QsIChzdGFydF9ibG9jaywgbGFzdF9ibG9jaykKKyAqIAl0byBmaW5kIGEgZnJlZSByZWdpb24gdGhhdCBpcyBvZiBteSBzaXplIGFuZCBoYXMgbm90CisgKiAJYmVlbiByZXNlcnZlZC4KKyAqCisgKglvbiBzdWNjZWVkLCBpdCByZXR1cm5zIHRoZSByZXNlcnZhdGlvbiB3aW5kb3cgdG8gYmUgYXBwZW5kZWQgdG8uCisgKglmYWlsZWQsIHJldHVybiBOVUxMLgorICovCitzdGF0aWMgc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqZmluZF9uZXh0X3Jlc2VydmFibGVfd2luZG93KAorCQkJCXN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKnNlYXJjaF9oZWFkLAorCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50ICpzdGFydF9ibG9jaywKKwkJCQlpbnQgbGFzdF9ibG9jaykKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbmV4dDsKKwlzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlICpyc3YsICpwcmV2OworCWludCBjdXI7CisKKwkvKiBUT0RPOiBtYWtlIHRoZSBzdGFydCBvZiB0aGUgcmVzZXJ2YXRpb24gd2luZG93IGJ5dGUtYWxpZ25lZCAqLworCS8qIGN1ciA9ICpzdGFydF9ibG9jayAmIH43OyovCisJY3VyID0gKnN0YXJ0X2Jsb2NrOworCXJzdiA9IHNlYXJjaF9oZWFkOworCWlmICghcnN2KQorCQlyZXR1cm4gTlVMTDsKKworCXdoaWxlICgxKSB7CisJCWlmIChjdXIgPD0gcnN2LT5yc3ZfZW5kKQorCQkJY3VyID0gcnN2LT5yc3ZfZW5kICsgMTsKKworCQkvKiBUT0RPPworCQkgKiBpbiB0aGUgY2FzZSB3ZSBjb3VsZCBub3QgZmluZCBhIHJlc2VydmFibGUgc3BhY2UKKwkJICogdGhhdCBpcyB3aGF0IGlzIGV4cGVjdGVkLCBkdXJpbmcgdGhlIHJlLXNlYXJjaCwgd2UgY291bGQKKwkJICogcmVtZW1iZXIgd2hhdCdzIHRoZSBsYXJnZXN0IHJlc2VydmFibGUgc3BhY2Ugd2UgY291bGQgaGF2ZQorCQkgKiBhbmQgcmV0dXJuIHRoYXQgb25lLgorCQkgKgorCQkgKiBGb3Igbm93IGl0IHdpbGwgZmFpbCBpZiB3ZSBjb3VsZCBub3QgZmluZCB0aGUgcmVzZXJ2YWJsZQorCQkgKiBzcGFjZSB3aXRoIGV4cGVjdGVkLXNpemUgKG9yIG1vcmUpLi4uCisJCSAqLworCQlpZiAoY3VyID4gbGFzdF9ibG9jaykKKwkJCXJldHVybiBOVUxMOwkJLyogZmFpbCAqLworCisJCXByZXYgPSByc3Y7CisJCW5leHQgPSByYl9uZXh0KCZyc3YtPnJzdl9ub2RlKTsKKwkJcnN2ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlLCByc3Zfbm9kZSk7CisKKwkJLyoKKwkJICogUmVhY2hlZCB0aGUgbGFzdCByZXNlcnZhdGlvbiwgd2UgY2FuIGp1c3QgYXBwZW5kIHRvIHRoZQorCQkgKiBwcmV2aW91cyBvbmUuCisJCSAqLworCQlpZiAoIW5leHQpCisJCQlicmVhazsKKworCQlpZiAoY3VyICsgc2l6ZSA8PSByc3YtPnJzdl9zdGFydCkgeworCQkJLyoKKwkJCSAqIEZvdW5kIGEgcmVzZXJ2ZWFibGUgc3BhY2UgYmlnIGVub3VnaC4gIFdlIGNvdWxkCisJCQkgKiBoYXZlIGEgcmVzZXJ2YXRpb24gYWNyb3NzIHRoZSBncm91cCBib3VuZGFyeSBoZXJlCisJCSAJICovCisJCQlicmVhazsKKwkJfQorCX0KKwkvKgorCSAqIHdlIGNvbWUgaGVyZSBlaXRoZXIgOgorCSAqIHdoZW4gd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgd2hvbGUgbGlzdCwKKwkgKiBhbmQgdGhlcmUgaXMgZW1wdHkgcmVzZXJ2YWJsZSBzcGFjZSBhZnRlciBsYXN0IGVudHJ5IGluIHRoZSBsaXN0LgorCSAqIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorCSAqCisJICogb3Igd2UgZm91bmQgb25lIHJlc2VydmFibGUgc3BhY2UgaW4gdGhlIG1pZGRsZSBvZiB0aGUgbGlzdCwKKwkgKiByZXR1cm4gdGhlIHJlc2VydmF0aW9uIHdpbmRvdyB0aGF0IHdlIGNvdWxkIGFwcGVuZCB0by4KKwkgKiBzdWNjZWVkLgorCSAqLworCSpzdGFydF9ibG9jayA9IGN1cjsKKwlyZXR1cm4gcHJldjsKK30KKworLyoqCisgKiAJYWxsb2NfbmV3X3Jlc2VydmF0aW9uKCktLWFsbG9jYXRlIGEgbmV3IHJlc2VydmF0aW9uIHdpbmRvdworICoKKyAqCQlUbyBtYWtlIGEgbmV3IHJlc2VydmF0aW9uLCB3ZSBzZWFyY2ggcGFydCBvZiB0aGUgZmlsZXN5c3RlbQorICoJCXJlc2VydmF0aW9uIGxpc3QgKHRoZSBsaXN0IHRoYXQgaW5zaWRlIHRoZSBncm91cCkuIFdlIHRyeSB0bworICoJCWFsbG9jYXRlIGEgbmV3IHJlc2VydmF0aW9uIHdpbmRvdyBuZWFyIHRoZSBhbGxvY2F0aW9uIGdvYWwsCisgKgkJb3IgdGhlIGJlZ2lubmluZyBvZiB0aGUgZ3JvdXAsIGlmIHRoZXJlIGlzIG5vIGdvYWwuCisgKgorICoJCVdlIGZpcnN0IGZpbmQgYSByZXNlcnZhYmxlIHNwYWNlIGFmdGVyIHRoZSBnb2FsLCB0aGVuIGZyb20KKyAqCQl0aGVyZSwgd2UgY2hlY2sgdGhlIGJpdG1hcCBmb3IgdGhlIGZpcnN0IGZyZWUgYmxvY2sgYWZ0ZXIKKyAqCQlpdC4gSWYgdGhlcmUgaXMgbm8gZnJlZSBibG9jayB1bnRpbCB0aGUgZW5kIG9mIGdyb3VwLCB0aGVuIHRoZQorICoJCXdob2xlIGdyb3VwIGlzIGZ1bGwsIHdlIGZhaWxlZC4gT3RoZXJ3aXNlLCBjaGVjayBpZiB0aGUgZnJlZQorICoJCWJsb2NrIGlzIGluc2lkZSB0aGUgZXhwZWN0ZWQgcmVzZXJ2YWJsZSBzcGFjZSwgaWYgc28sIHdlCisgKgkJc3VjY2VlZC4KKyAqCQlJZiB0aGUgZmlyc3QgZnJlZSBibG9jayBpcyBvdXRzaWRlIHRoZSByZXNlcnZhYmxlIHNwYWNlLCB0aGVuCisgKgkJc3RhcnQgZnJvbSB0aGUgZmlyc3QgZnJlZSBibG9jaywgd2Ugc2VhcmNoIGZvciBuZXh0IGF2YWlsYWJsZQorICoJCXNwYWNlLCBhbmQgZ28gb24uCisgKgorICoJb24gc3VjY2VlZCwgYSBuZXcgcmVzZXJ2YXRpb24gd2lsbCBiZSBmb3VuZCBhbmQgaW5zZXJ0ZWQgaW50byB0aGUgbGlzdAorICoJSXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIGZyZWUgYmxvY2ssIGFuZCBpdCBkb2VzIG5vdCBvdmVybGFwIHdpdGggb3RoZXIKKyAqCXJlc2VydmF0aW9uIHdpbmRvd3MuCisgKgorICoJZmFpbGVkOiB3ZSBmYWlsZWQgdG8gZmluZCBhIHJlc2VydmF0aW9uIHdpbmRvdyBpbiB0aGlzIGdyb3VwCisgKgorICoJQHJzdjogdGhlIHJlc2VydmF0aW9uCisgKgorICoJQGdvYWw6IFRoZSBnb2FsIChncm91cC1yZWxhdGl2ZSkuICBJdCBpcyB3aGVyZSB0aGUgc2VhcmNoIGZvciBhCisgKgkJZnJlZSByZXNlcnZhYmxlIHNwYWNlIHNob3VsZCBzdGFydCBmcm9tLgorICoJCWlmIHdlIGhhdmUgYSBnb2FsKGdvYWwgPjAgKSwgdGhlbiBzdGFydCBmcm9tIHRoZXJlLAorICoJCW5vIGdvYWwoZ29hbCA9IC0xKSwgd2Ugc3RhcnQgZnJvbSB0aGUgZmlyc3QgYmxvY2sKKyAqCQlvZiB0aGUgZ3JvdXAuCisgKgorICoJQHNiOiB0aGUgc3VwZXIgYmxvY2sKKyAqCUBncm91cDogdGhlIGdyb3VwIHdlIGFyZSB0cnlpbmcgdG8gYWxsb2NhdGUgaW4KKyAqCUBiaXRtYXBfYmg6IHRoZSBibG9jayBncm91cCBibG9jayBiaXRtYXAKKyAqLworc3RhdGljIGludCBhbGxvY19uZXdfcmVzZXJ2YXRpb24oc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqbXlfcnN2LAorCQlpbnQgZ29hbCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJdW5zaWduZWQgaW50IGdyb3VwLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCkKK3sKKwlzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlICpzZWFyY2hfaGVhZDsKKwlpbnQgZ3JvdXBfZmlyc3RfYmxvY2ssIGdyb3VwX2VuZF9ibG9jaywgc3RhcnRfYmxvY2s7CisJaW50IGZpcnN0X2ZyZWVfYmxvY2s7CisJaW50IHJlc2VydmFibGVfc3BhY2Vfc3RhcnQ7CisJc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqcHJldl9yc3Y7CisJc3RydWN0IHJiX3Jvb3QgKmZzX3Jzdl9yb290ID0gJkVYVDNfU0Ioc2IpLT5zX3Jzdl93aW5kb3dfcm9vdDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlncm91cF9maXJzdF9ibG9jayA9IGxlMzJfdG9fY3B1KEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spICsKKwkJCQlncm91cCAqIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJZ3JvdXBfZW5kX2Jsb2NrID0gZ3JvdXBfZmlyc3RfYmxvY2sgKyBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gMTsKKworCWlmIChnb2FsIDwgMCkKKwkJc3RhcnRfYmxvY2sgPSBncm91cF9maXJzdF9ibG9jazsKKwllbHNlCisJCXN0YXJ0X2Jsb2NrID0gZ29hbCArIGdyb3VwX2ZpcnN0X2Jsb2NrOworCisJc2l6ZSA9IG15X3Jzdi0+cnN2X2dvYWxfc2l6ZTsKKwlpZiAoIXJzdl9pc19lbXB0eSgmbXlfcnN2LT5yc3Zfd2luZG93KSkgeworCQkvKgorCQkgKiBpZiB0aGUgb2xkIHJlc2VydmF0aW9uIGlzIGNyb3NzIGdyb3VwIGJvdW5kYXJ5CisJCSAqIGFuZCBpZiB0aGUgZ29hbCBpcyBpbnNpZGUgdGhlIG9sZCByZXNlcnZhdGlvbiB3aW5kb3csCisJCSAqIHdlIHdpbGwgY29tZSBoZXJlIHdoZW4gd2UganVzdCBmYWlsZWQgdG8gYWxsb2NhdGUgZnJvbQorCQkgKiB0aGUgZmlyc3QgcGFydCBvZiB0aGUgd2luZG93LiBXZSBzdGlsbCBoYXZlIGFub3RoZXIgcGFydAorCQkgKiB0aGF0IGJlbG9uZ3MgdG8gdGhlIG5leHQgZ3JvdXAuIEluIHRoaXMgY2FzZSwgdGhlcmUgaXMgbm8KKwkJICogcG9pbnQgdG8gZGlzY2FyZCBvdXIgd2luZG93IGFuZCB0cnkgdG8gYWxsb2NhdGUgYSBuZXcgb25lCisJCSAqIGluIHRoaXMgZ3JvdXAod2hpY2ggd2lsbCBmYWlsKS4gd2Ugc2hvdWxkCisJCSAqIGtlZXAgdGhlIHJlc2VydmF0aW9uIHdpbmRvdywganVzdCBzaW1wbHkgbW92ZSBvbi4KKwkJICoKKwkJICogTWF5YmUgd2UgY291bGQgc2hpZnQgdGhlIHN0YXJ0IGJsb2NrIG9mIHRoZSByZXNlcnZhdGlvbgorCQkgKiB3aW5kb3cgdG8gdGhlIGZpcnN0IGJsb2NrIG9mIG5leHQgZ3JvdXAuCisJCSAqLworCisJCWlmICgobXlfcnN2LT5yc3Zfc3RhcnQgPD0gZ3JvdXBfZW5kX2Jsb2NrKSAmJgorCQkJCShteV9yc3YtPnJzdl9lbmQgPiBncm91cF9lbmRfYmxvY2spICYmCisJCQkJKHN0YXJ0X2Jsb2NrID49IG15X3Jzdi0+cnN2X3N0YXJ0KSkKKwkJCXJldHVybiAtMTsKKworCQlpZiAoKG15X3Jzdi0+cnN2X2FsbG9jX2hpdCA+CisJCSAgICAgKG15X3Jzdi0+cnN2X2VuZCAtIG15X3Jzdi0+cnN2X3N0YXJ0ICsgMSkgLyAyKSkgeworCQkJLyoKKwkJCSAqIGlmIHdlIHByZXZpb3VzbHkgYWxsb2NhdGlvbiBoaXQgcmF0aW9uIGlzIGdyZWF0ZXIgdGhhbiBoYWxmCisJCQkgKiB3ZSBkb3VibGUgdGhlIHNpemUgb2YgcmVzZXJ2YXRpb24gd2luZG93IG5leHQgdGltZQorCQkJICogb3RoZXJ3aXNlIGtlZXAgdGhlIHNhbWUKKwkJCSAqLworCQkJc2l6ZSA9IHNpemUgKiAyOworCQkJaWYgKHNpemUgPiBFWFQzX01BWF9SRVNFUlZFX0JMT0NLUykKKwkJCQlzaXplID0gRVhUM19NQVhfUkVTRVJWRV9CTE9DS1M7CisJCQlteV9yc3YtPnJzdl9nb2FsX3NpemU9IHNpemU7CisJCX0KKwl9CisJLyoKKwkgKiBzaGlmdCB0aGUgc2VhcmNoIHN0YXJ0IHRvIHRoZSB3aW5kb3cgbmVhciB0aGUgZ29hbCBibG9jaworCSAqLworCXNlYXJjaF9oZWFkID0gc2VhcmNoX3Jlc2VydmVfd2luZG93KGZzX3Jzdl9yb290LCBzdGFydF9ibG9jayk7CisKKwkvKgorCSAqIGZpbmRfbmV4dF9yZXNlcnZhYmxlX3dpbmRvdygpIHNpbXBseSBmaW5kcyBhIHJlc2VydmFibGUgd2luZG93CisJICogaW5zaWRlIHRoZSBnaXZlbiByYW5nZShzdGFydF9ibG9jaywgZ3JvdXBfZW5kX2Jsb2NrKS4KKwkgKgorCSAqIFRvIG1ha2Ugc3VyZSB0aGUgcmVzZXJ2YXRpb24gd2luZG93IGhhcyBhIGZyZWUgYml0IGluc2lkZSBpdCwgd2UKKwkgKiBuZWVkIHRvIGNoZWNrIHRoZSBiaXRtYXAgYWZ0ZXIgd2UgZm91bmQgYSByZXNlcnZhYmxlIHdpbmRvdy4KKwkgKi8KK3JldHJ5OgorCXByZXZfcnN2ID0gZmluZF9uZXh0X3Jlc2VydmFibGVfd2luZG93KHNlYXJjaF9oZWFkLCBzaXplLAorCQkJCQkJJnN0YXJ0X2Jsb2NrLCBncm91cF9lbmRfYmxvY2spOworCWlmIChwcmV2X3JzdiA9PSBOVUxMKQorCQlnb3RvIGZhaWxlZDsKKwlyZXNlcnZhYmxlX3NwYWNlX3N0YXJ0ID0gc3RhcnRfYmxvY2s7CisJLyoKKwkgKiBPbiBzdWNjZXNzLCBmaW5kX25leHRfcmVzZXJ2YWJsZV93aW5kb3coKSByZXR1cm5zIHRoZQorCSAqIHJlc2VydmF0aW9uIHdpbmRvdyB3aGVyZSB0aGVyZSBpcyBhIHJlc2VydmFibGUgc3BhY2UgYWZ0ZXIgaXQuCisJICogQmVmb3JlIHdlIHJlc2VydmUgdGhpcyByZXNlcnZhYmxlIHNwYWNlLCB3ZSBuZWVkCisJICogdG8gbWFrZSBzdXJlIHRoZXJlIGlzIGF0IGxlYXN0IGEgZnJlZSBibG9jayBpbnNpZGUgdGhpcyByZWdpb24uCisJICoKKwkgKiBzZWFyY2hpbmcgdGhlIGZpcnN0IGZyZWUgYml0IG9uIHRoZSBibG9jayBiaXRtYXAgYW5kIGNvcHkgb2YKKwkgKiBsYXN0IGNvbW1pdHRlZCBiaXRtYXAgYWx0ZXJuYXRpdmVseSwgdW50aWwgd2UgZm91bmQgYSBhbGxvY2F0YWJsZQorCSAqIGJsb2NrLiBTZWFyY2ggc3RhcnQgZnJvbSB0aGUgc3RhcnQgYmxvY2sgb2YgdGhlIHJlc2VydmFibGUgc3BhY2UKKwkgKiB3ZSBqdXN0IGZvdW5kLgorCSAqLworCWZpcnN0X2ZyZWVfYmxvY2sgPSBiaXRtYXBfc2VhcmNoX25leHRfdXNhYmxlX2Jsb2NrKAorCQkJcmVzZXJ2YWJsZV9zcGFjZV9zdGFydCAtIGdyb3VwX2ZpcnN0X2Jsb2NrLAorCQkJYml0bWFwX2JoLCBncm91cF9lbmRfYmxvY2sgLSBncm91cF9maXJzdF9ibG9jayArIDEpOworCisJaWYgKGZpcnN0X2ZyZWVfYmxvY2sgPCAwKSB7CisJCS8qCisJCSAqIG5vIGZyZWUgYmxvY2sgbGVmdCBvbiB0aGUgYml0bWFwLCBubyBwb2ludAorCQkgKiB0byByZXNlcnZlIHRoZSBzcGFjZS4gcmV0dXJuIGZhaWxlZC4KKwkJICovCisJCWdvdG8gZmFpbGVkOworCX0KKwlzdGFydF9ibG9jayA9IGZpcnN0X2ZyZWVfYmxvY2sgKyBncm91cF9maXJzdF9ibG9jazsKKwkvKgorCSAqIGNoZWNrIGlmIHRoZSBmaXJzdCBmcmVlIGJsb2NrIGlzIHdpdGhpbiB0aGUKKwkgKiBmcmVlIHNwYWNlIHdlIGp1c3QgZm91bmQKKwkgKi8KKwlpZiAoKHN0YXJ0X2Jsb2NrID49IHJlc2VydmFibGVfc3BhY2Vfc3RhcnQpICYmCisJICAoc3RhcnRfYmxvY2sgPCByZXNlcnZhYmxlX3NwYWNlX3N0YXJ0ICsgc2l6ZSkpCisJCWdvdG8gZm91bmRfcnN2X3dpbmRvdzsKKwkvKgorCSAqIGlmIHRoZSBmaXJzdCBmcmVlIGJpdCB3ZSBmb3VuZCBpcyBvdXQgb2YgdGhlIHJlc2VydmFibGUgc3BhY2UKKwkgKiB0aGlzIG1lYW5zIHRoZXJlIGlzIG5vIGZyZWUgYmxvY2sgb24gdGhlIHJlc2VydmFibGUgc3BhY2UKKwkgKiB3ZSBzaG91bGQgY29udGludWUgc2VhcmNoIGZvciBuZXh0IHJlc2VydmFibGUgc3BhY2UsCisJICogc3RhcnQgZnJvbSB3aGVyZSB0aGUgZnJlZSBibG9jayBpcywKKwkgKiB3ZSBhbHNvIHNoaWZ0IHRoZSBsaXN0IGhlYWQgdG8gd2hlcmUgd2Ugc3RvcHBlZCBsYXN0IHRpbWUKKwkgKi8KKwlzZWFyY2hfaGVhZCA9IHByZXZfcnN2OworCWdvdG8gcmV0cnk7CisKK2ZvdW5kX3Jzdl93aW5kb3c6CisJLyoKKwkgKiBncmVhdCEgdGhlIHJlc2VydmFibGUgc3BhY2UgY29udGFpbnMgc29tZSBmcmVlIGJsb2Nrcy4KKwkgKiBpZiB0aGUgc2VhcmNoIHJldHVybnMgdGhhdCB3ZSBzaG91bGQgYWRkIHRoZSBuZXcKKwkgKiB3aW5kb3cganVzdCBuZXh0IHRvIHdoZXJlIHRoZSBvbGQgd2luZG93LCB3ZSBkb24ndAorIAkgKiBuZWVkIHRvIHJlbW92ZSB0aGUgb2xkIHdpbmRvdyBmaXJzdCB0aGVuIGFkZCBpdCB0byB0aGUKKwkgKiBzYW1lIHBsYWNlLCBqdXN0IHVwZGF0ZSB0aGUgbmV3IHN0YXJ0IGFuZCBuZXcgZW5kLgorCSAqLworCWlmIChteV9yc3YgIT0gcHJldl9yc3YpICB7CisJCWlmICghcnN2X2lzX2VtcHR5KCZteV9yc3YtPnJzdl93aW5kb3cpKQorCQkJcnN2X3dpbmRvd19yZW1vdmUoc2IsIG15X3Jzdik7CisJfQorCW15X3Jzdi0+cnN2X3N0YXJ0ID0gcmVzZXJ2YWJsZV9zcGFjZV9zdGFydDsKKwlteV9yc3YtPnJzdl9lbmQgPSBteV9yc3YtPnJzdl9zdGFydCArIHNpemUgLSAxOworCW15X3Jzdi0+cnN2X2FsbG9jX2hpdCA9IDA7CisJaWYgKG15X3JzdiAhPSBwcmV2X3JzdikgIHsKKwkJZXh0M19yc3Zfd2luZG93X2FkZChzYiwgbXlfcnN2KTsKKwl9CisJcmV0dXJuIDA7CQkvKiBzdWNjZWVkICovCitmYWlsZWQ6CisJLyoKKwkgKiBmYWlsZWQgdG8gZmluZCBhIG5ldyByZXNlcnZhdGlvbiB3aW5kb3cgaW4gdGhlIGN1cnJlbnQKKwkgKiBncm91cCwgcmVtb3ZlIHRoZSBjdXJyZW50KHN0YWxlKSByZXNlcnZhdGlvbiB3aW5kb3cKKwkgKiBpZiB0aGVyZSBpcyBhbnkKKwkgKi8KKwlpZiAoIXJzdl9pc19lbXB0eSgmbXlfcnN2LT5yc3Zfd2luZG93KSkKKwkJcnN2X3dpbmRvd19yZW1vdmUoc2IsIG15X3Jzdik7CisJcmV0dXJuIC0xOwkJLyogZmFpbGVkICovCit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBtYWluIGZ1bmN0aW9uIHVzZWQgdG8gYWxsb2NhdGUgYSBuZXcgYmxvY2sgYW5kIGl0cyByZXNlcnZhdGlvbgorICogd2luZG93LgorICoKKyAqIEVhY2ggdGltZSB3aGVuIGEgbmV3IGJsb2NrIGFsbG9jYXRpb24gaXMgbmVlZCwgZmlyc3QgdHJ5IHRvIGFsbG9jYXRlIGZyb20KKyAqIGl0cyBvd24gcmVzZXJ2YXRpb24uICBJZiBpdCBkb2VzIG5vdCBoYXZlIGEgcmVzZXJ2YXRpb24gd2luZG93LCBpbnN0ZWFkIG9mCisgKiBsb29raW5nIGZvciBhIGZyZWUgYml0IG9uIGJpdG1hcCBmaXJzdCwgdGhlbiBsb29rIHVwIHRoZSByZXNlcnZhdGlvbiBsaXN0IHRvCisgKiBzZWUgaWYgaXQgaXMgaW5zaWRlIHNvbWVib2R5IGVsc2UncyByZXNlcnZhdGlvbiB3aW5kb3csIHdlIHRyeSB0byBhbGxvY2F0ZSBhCisgKiByZXNlcnZhdGlvbiB3aW5kb3cgZm9yIGl0IHN0YXJ0aW5nIGZyb20gdGhlIGdvYWwgZmlyc3QuIFRoZW4gZG8gdGhlIGJsb2NrCisgKiBhbGxvY2F0aW9uIHdpdGhpbiB0aGUgcmVzZXJ2YXRpb24gd2luZG93LgorICoKKyAqIFRoaXMgd2lsbCBhdm9pZCBrZWVwaW5nIG9uIHNlYXJjaGluZyB0aGUgcmVzZXJ2YXRpb24gbGlzdCBhZ2FpbiBhbmQKKyAqIGFnYWluIHdoZW4gc29tZWJvZGF5IGlzIGxvb2tpbmcgZm9yIGEgZnJlZSBibG9jayAod2l0aG91dAorICogcmVzZXJ2YXRpb24pLCBhbmQgdGhlcmUgYXJlIGxvdHMgb2YgZnJlZSBibG9ja3MsIGJ1dCB0aGV5IGFyZSBhbGwKKyAqIGJlaW5nIHJlc2VydmVkLgorICoKKyAqIFdlIHVzZSBhIHNvcnRlZCBkb3VibGUgbGlua2VkIGxpc3QgZm9yIHRoZSBwZXItZmlsZXN5c3RlbSByZXNlcnZhdGlvbiBsaXN0LgorICogVGhlIGluc2VydCwgcmVtb3ZlIGFuZCBmaW5kIGEgZnJlZSBzcGFjZShub24tcmVzZXJ2ZWQpIG9wZXJhdGlvbnMgZm9yIHRoZQorICogc29ydGVkIGRvdWJsZSBsaW5rZWQgbGlzdCBzaG91bGQgYmUgZmFzdC4KKyAqCisgKi8KK3N0YXRpYyBpbnQKK2V4dDNfdHJ5X3RvX2FsbG9jYXRlX3dpdGhfcnN2KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGhhbmRsZV90ICpoYW5kbGUsCisJCQl1bnNpZ25lZCBpbnQgZ3JvdXAsIHN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoLAorCQkJaW50IGdvYWwsIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKiBteV9yc3YsCisJCQlpbnQgKmVycnApCit7CisJc3BpbmxvY2tfdCAqcnN2X2xvY2s7CisJdW5zaWduZWQgbG9uZyBncm91cF9maXJzdF9ibG9jazsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgZmF0YWw7CisKKwkqZXJycCA9IDA7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB3ZSB1c2UgdW5kbyBhY2Nlc3MgZm9yIHRoZSBiaXRtYXAsIGJlY2F1c2UgaXQgaXMgY3JpdGljYWwKKwkgKiB0aGF0IHdlIGRvIHRoZSBmcm96ZW5fZGF0YSBDT1cgb24gYml0bWFwIGJ1ZmZlcnMgaW4gYWxsIGNhc2VzIGV2ZW4KKwkgKiBpZiB0aGUgYnVmZmVyIGlzIGluIEJKX0ZvcmdldCBzdGF0ZSBpbiB0aGUgY29tbWl0dGluZyB0cmFuc2FjdGlvbi4KKwkgKi8KKwlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiZ2V0IHVuZG8gYWNjZXNzIGZvciBuZXcgYmxvY2siKTsKKwlmYXRhbCA9IGV4dDNfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoaGFuZGxlLCBiaXRtYXBfYmgpOworCWlmIChmYXRhbCkgeworCQkqZXJycCA9IGZhdGFsOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiB3ZSBkb24ndCBkZWFsIHdpdGggcmVzZXJ2YXRpb24gd2hlbgorCSAqIGZpbGVzeXN0ZW0gaXMgbW91bnRlZCB3aXRob3V0IHJlc2VydmF0aW9uCisJICogb3IgdGhlIGZpbGUgaXMgbm90IGEgcmVndWxhciBmaWxlCisJICogb3IgbGFzdCBhdHRlbXB0IHRvIGFsbG9jYXRlIGEgYmxvY2sgd2l0aCByZXNlcnZhdGlvbiB0dXJuZWQgb24gZmFpbGVkCisJICovCisJaWYgKG15X3JzdiA9PSBOVUxMICkgeworCQlyZXQgPSBleHQzX3RyeV90b19hbGxvY2F0ZShzYiwgaGFuZGxlLCBncm91cCwgYml0bWFwX2JoLCBnb2FsLCBOVUxMKTsKKwkJZ290byBvdXQ7CisJfQorCXJzdl9sb2NrID0gJkVYVDNfU0Ioc2IpLT5zX3Jzdl93aW5kb3dfbG9jazsKKwkvKgorCSAqIGdvYWwgaXMgYSBncm91cCByZWxhdGl2ZSBibG9jayBudW1iZXIgKGlmIHRoZXJlIGlzIGEgZ29hbCkKKwkgKiAwIDwgZ29hbCA8IEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikKKwkgKiBmaXJzdCBibG9jayBpcyBhIGZpbGVzeXN0ZW0gd2lkZSBibG9jayBudW1iZXIKKwkgKiBmaXJzdCBibG9jayBpcyB0aGUgYmxvY2sgbnVtYmVyIG9mIHRoZSBmaXJzdCBibG9jayBpbiB0aGlzIGdyb3VwCisJICovCisJZ3JvdXBfZmlyc3RfYmxvY2sgPSBsZTMyX3RvX2NwdShFWFQzX1NCKHNiKS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKSArCisJCQlncm91cCAqIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisKKwkvKgorCSAqIEJhc2ljYWxseSB3ZSB3aWxsIGFsbG9jYXRlIGEgbmV3IGJsb2NrIGZyb20gaW5vZGUncyByZXNlcnZhdGlvbgorCSAqIHdpbmRvdy4KKwkgKgorCSAqIFdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgcmVzZXJ2YXRpb24gd2luZG93LCBpZjoKKwkgKiBhKSBpbm9kZSBkb2VzIG5vdCBoYXZlIGEgcmVzZXJ2YXRpb24gd2luZG93OyBvcgorCSAqIGIpIGxhc3QgYXR0ZW1wdCB0byBhbGxvY2F0ZSBhIGJsb2NrIGZyb20gZXhpc3RpbmcgcmVzZXJ2YXRpb24KKwkgKiAgICBmYWlsZWQ7IG9yCisJICogYykgd2UgY29tZSBoZXJlIHdpdGggYSBnb2FsIGFuZCB3aXRoIGEgcmVzZXJ2YXRpb24gd2luZG93CisJICoKKwkgKiBXZSBkbyBub3QgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyByZXNlcnZhdGlvbiB3aW5kb3cgaWYgd2UgY29tZSBoZXJlCisJICogYXQgdGhlIGJlZ2lubmluZyB3aXRoIGEgZ29hbCBhbmQgdGhlIGdvYWwgaXMgaW5zaWRlIHRoZSB3aW5kb3csIG9yCisJICogd2UgZG9uJ3QgaGF2ZSBhIGdvYWwgYnV0IGFscmVhZHkgaGF2ZSBhIHJlc2VydmF0aW9uIHdpbmRvdy4KKwkgKiB0aGVuIHdlIGNvdWxkIGdvIHRvIGFsbG9jYXRlIGZyb20gdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBkaXJlY3RseS4KKwkgKi8KKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvdyByc3ZfY29weTsKKworCQlyc3ZfY29weS5fcnN2X3N0YXJ0ID0gbXlfcnN2LT5yc3Zfc3RhcnQ7CisJCXJzdl9jb3B5Ll9yc3ZfZW5kID0gbXlfcnN2LT5yc3ZfZW5kOworCisJCWlmIChyc3ZfaXNfZW1wdHkoJnJzdl9jb3B5KSB8fCAocmV0IDwgMCkgfHwKKwkJCSFnb2FsX2luX215X3Jlc2VydmF0aW9uKCZyc3ZfY29weSwgZ29hbCwgZ3JvdXAsIHNiKSkgeworCQkJc3Bpbl9sb2NrKHJzdl9sb2NrKTsKKwkJCXJldCA9IGFsbG9jX25ld19yZXNlcnZhdGlvbihteV9yc3YsIGdvYWwsIHNiLAorCQkJCQkJCWdyb3VwLCBiaXRtYXBfYmgpOworCQkJcnN2X2NvcHkuX3Jzdl9zdGFydCA9IG15X3Jzdi0+cnN2X3N0YXJ0OworCQkJcnN2X2NvcHkuX3Jzdl9lbmQgPSBteV9yc3YtPnJzdl9lbmQ7CisJCQlzcGluX3VubG9jayhyc3ZfbG9jayk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlicmVhazsJCQkvKiBmYWlsZWQgKi8KKworCQkJaWYgKCFnb2FsX2luX215X3Jlc2VydmF0aW9uKCZyc3ZfY29weSwgZ29hbCwgZ3JvdXAsIHNiKSkKKwkJCQlnb2FsID0gLTE7CisJCX0KKwkJaWYgKChyc3ZfY29weS5fcnN2X3N0YXJ0ID49IGdyb3VwX2ZpcnN0X2Jsb2NrICsgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSkKKwkJICAgIHx8IChyc3ZfY29weS5fcnN2X2VuZCA8IGdyb3VwX2ZpcnN0X2Jsb2NrKSkKKwkJCUJVRygpOworCQlyZXQgPSBleHQzX3RyeV90b19hbGxvY2F0ZShzYiwgaGFuZGxlLCBncm91cCwgYml0bWFwX2JoLCBnb2FsLAorCQkJCQkgICAmcnN2X2NvcHkpOworCQlpZiAocmV0ID49IDApIHsKKwkJCW15X3Jzdi0+cnN2X2FsbG9jX2hpdCsrOworCQkJYnJlYWs7CQkJCS8qIHN1Y2NlZWQgKi8KKwkJfQorCX0KK291dDoKKwlpZiAocmV0ID49IDApIHsKKwkJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImpvdXJuYWxfZGlydHlfbWV0YWRhdGEgZm9yICIKKwkJCQkJImJpdG1hcCBibG9jayIpOworCQlmYXRhbCA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJpdG1hcF9iaCk7CisJCWlmIChmYXRhbCkgeworCQkJKmVycnAgPSBmYXRhbDsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlyZXR1cm4gcmV0OworCX0KKworCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJqb3VybmFsX3JlbGVhc2VfYnVmZmVyIik7CisJZXh0M19qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZSwgYml0bWFwX2JoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGV4dDNfaGFzX2ZyZWVfYmxvY2tzKHN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSkKK3sKKwlpbnQgZnJlZV9ibG9ja3MsIHJvb3RfYmxvY2tzOworCisJZnJlZV9ibG9ja3MgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKKwlyb290X2Jsb2NrcyA9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19yX2Jsb2Nrc19jb3VudCk7CisJaWYgKGZyZWVfYmxvY2tzIDwgcm9vdF9ibG9ja3MgKyAxICYmICFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpICYmCisJCXNiaS0+c19yZXN1aWQgIT0gY3VycmVudC0+ZnN1aWQgJiYKKwkJKHNiaS0+c19yZXNnaWQgPT0gMCB8fCAhaW5fZ3JvdXBfcCAoc2JpLT5zX3Jlc2dpZCkpKSB7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIGV4dDNfc2hvdWxkX3JldHJ5X2FsbG9jKCkgaXMgY2FsbGVkIHdoZW4gRU5PU1BDIGlzIHJldHVybmVkLCBhbmQgaWYKKyAqIGl0IGlzIHByb2ZpdGFibGUgdG8gcmV0cnkgdGhlIG9wZXJhdGlvbiwgdGhpcyBmdW5jdGlvbiB3aWxsIHdhaXQKKyAqIGZvciB0aGUgY3VycmVudCBvciBjb21taXRpbmcgdHJhbnNhY3Rpb24gdG8gY29tcGxldGUsIGFuZCB0aGVuCisgKiByZXR1cm4gVFJVRS4KKyAqLworaW50IGV4dDNfc2hvdWxkX3JldHJ5X2FsbG9jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqcmV0cmllcykKK3sKKwlpZiAoIWV4dDNfaGFzX2ZyZWVfYmxvY2tzKEVYVDNfU0Ioc2IpKSB8fCAoKnJldHJpZXMpKysgPiAzKQorCQlyZXR1cm4gMDsKKworCWpiZF9kZWJ1ZygxLCAiJXM6IHJldHJ5aW5nIG9wZXJhdGlvbiBhZnRlciBFTk9TUENcbiIsIHNiLT5zX2lkKTsKKworCXJldHVybiBqb3VybmFsX2ZvcmNlX2NvbW1pdF9uZXN0ZWQoRVhUM19TQihzYiktPnNfam91cm5hbCk7Cit9CisKKy8qCisgKiBleHQzX25ld19ibG9jayB1c2VzIGEgZ29hbCBibG9jayB0byBhc3Npc3QgYWxsb2NhdGlvbi4gIElmIHRoZSBnb2FsIGlzCisgKiBmcmVlLCBvciB0aGVyZSBpcyBhIGZyZWUgYmxvY2sgd2l0aGluIDMyIGJsb2NrcyBvZiB0aGUgZ29hbCwgdGhhdCBibG9jaworICogaXMgYWxsb2NhdGVkLiAgT3RoZXJ3aXNlIGEgZm9yd2FyZCBzZWFyY2ggaXMgbWFkZSBmb3IgYSBmcmVlIGJsb2NrOyB3aXRoaW4gCisgKiBlYWNoIGJsb2NrIGdyb3VwIHRoZSBzZWFyY2ggZmlyc3QgbG9va3MgZm9yIGFuIGVudGlyZSBmcmVlIGJ5dGUgaW4gdGhlIGJsb2NrCisgKiBiaXRtYXAsIGFuZCB0aGVuIGZvciBhbnkgZnJlZSBiaXQgaWYgdGhhdCBmYWlscy4KKyAqIFRoaXMgZnVuY3Rpb24gYWxzbyB1cGRhdGVzIHF1b3RhIGFuZCBpX2Jsb2NrcyBmaWVsZC4KKyAqLworaW50IGV4dDNfbmV3X2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQl1bnNpZ25lZCBsb25nIGdvYWwsIGludCAqZXJycCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpnZHBfYmg7CisJaW50IGdyb3VwX25vOworCWludCBnb2FsX2dyb3VwOworCWludCByZXRfYmxvY2s7CisJaW50IGJnaTsJCQkvKiBibG9ja2dyb3VwIGl0ZXJhdGlvbiBpbmRleCAqLworCWludCB0YXJnZXRfYmxvY2s7CisJaW50IGZhdGFsID0gMCwgZXJyOworCWludCBwZXJmb3JtZWRfYWxsb2NhdGlvbiA9IDA7CisJaW50IGZyZWVfYmxvY2tzOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqZ2RwOworCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplczsKKwlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmk7CisJc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqbXlfcnN2ID0gTlVMTDsKKwlzdHJ1Y3QgZXh0M19ibG9ja19hbGxvY19pbmZvICpibG9ja19pOworCXVuc2lnbmVkIHNob3J0IHdpbmRvd3N6ID0gMDsKKyNpZmRlZiBFWFQzRlNfREVCVUcKKwlzdGF0aWMgaW50IGdvYWxfaGl0cywgZ29hbF9hdHRlbXB0czsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgbmdyb3VwczsKKworCSplcnJwID0gLUVOT1NQQzsKKwlzYiA9IGlub2RlLT5pX3NiOworCWlmICghc2IpIHsKKwkJcHJpbnRrKCJleHQzX25ld19ibG9jazogbm9uZXhpc3RlbnQgZGV2aWNlIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQ2hlY2sgcXVvdGEgZm9yIGFsbG9jYXRpb24gb2YgdGhpcyBibG9jay4KKwkgKi8KKwlpZiAoRFFVT1RfQUxMT0NfQkxPQ0soaW5vZGUsIDEpKSB7CisJCSplcnJwID0gLUVEUVVPVDsKKwkJcmV0dXJuIDA7CisJfQorCisJc2JpID0gRVhUM19TQihzYik7CisJZXMgPSBFWFQzX1NCKHNiKS0+c19lczsKKwlleHQzX2RlYnVnKCJnb2FsPSVsdS5cbiIsIGdvYWwpOworCS8qCisJICogQWxsb2NhdGUgYSBibG9jayBmcm9tIHJlc2VydmF0aW9uIG9ubHkgd2hlbgorCSAqIGZpbGVzeXN0ZW0gaXMgbW91bnRlZCB3aXRoIHJlc2VydmF0aW9uKGRlZmF1bHQsLW8gcmVzZXJ2YXRpb24pLCBhbmQKKwkgKiBpdCdzIGEgcmVndWxhciBmaWxlLCBhbmQKKwkgKiB0aGUgZGVzaXJlZCB3aW5kb3cgc2l6ZSBpcyBncmVhdGVyIHRoYW4gMCAoT25lIGNvdWxkIHVzZSBpb2N0bAorCSAqIGNvbW1hbmQgRVhUM19JT0NfU0VUUlNWU1ogdG8gc2V0IHRoZSB3aW5kb3cgc2l6ZSB0byAwIHRvIHR1cm4gb2ZmCisJICogcmVzZXJ2YXRpb24gb24gdGhhdCBwYXJ0aWN1bGFyIGZpbGUpCisJICovCisJYmxvY2tfaSA9IEVYVDNfSShpbm9kZSktPmlfYmxvY2tfYWxsb2NfaW5mbzsKKwlpZiAoYmxvY2tfaSAmJiAoKHdpbmRvd3N6ID0gYmxvY2tfaS0+cnN2X3dpbmRvd19ub2RlLnJzdl9nb2FsX3NpemUpID4gMCkpCisJCW15X3JzdiA9ICZibG9ja19pLT5yc3Zfd2luZG93X25vZGU7CisKKwlpZiAoIWV4dDNfaGFzX2ZyZWVfYmxvY2tzKHNiaSkpIHsKKwkJKmVycnAgPSAtRU5PU1BDOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIEZpcnN0LCB0ZXN0IHdoZXRoZXIgdGhlIGdvYWwgYmxvY2sgaXMgZnJlZS4KKwkgKi8KKwlpZiAoZ29hbCA8IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spIHx8CisJICAgIGdvYWwgPj0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSkKKwkJZ29hbCA9IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOworCWdyb3VwX25vID0gKGdvYWwgLSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSkgLworCQkJRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwlnZHAgPSBleHQzX2dldF9ncm91cF9kZXNjKHNiLCBncm91cF9ubywgJmdkcF9iaCk7CisJaWYgKCFnZHApCisJCWdvdG8gaW9fZXJyb3I7CisKKwlnb2FsX2dyb3VwID0gZ3JvdXBfbm87CityZXRyeToKKwlmcmVlX2Jsb2NrcyA9IGxlMTZfdG9fY3B1KGdkcC0+YmdfZnJlZV9ibG9ja3NfY291bnQpOworCS8qCisJICogaWYgdGhlcmUgaXMgbm90IGVub3VnaCBmcmVlIGJsb2NrcyB0byBtYWtlIGEgbmV3IHJlc2V2YXRpb24KKwkgKiB0dXJuIG9mZiByZXNlcnZhdGlvbiBmb3IgdGhpcyBhbGxvY2F0aW9uCisJICovCisJaWYgKG15X3JzdiAmJiAoZnJlZV9ibG9ja3MgPCB3aW5kb3dzeikKKwkJJiYgKHJzdl9pc19lbXB0eSgmbXlfcnN2LT5yc3Zfd2luZG93KSkpCisJCW15X3JzdiA9IE5VTEw7CisKKwlpZiAoZnJlZV9ibG9ja3MgPiAwKSB7CisJCXJldF9ibG9jayA9ICgoZ29hbCAtIGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKSAlCisJCQkJRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSk7CisJCWJpdG1hcF9iaCA9IHJlYWRfYmxvY2tfYml0bWFwKHNiLCBncm91cF9ubyk7CisJCWlmICghYml0bWFwX2JoKQorCQkJZ290byBpb19lcnJvcjsKKwkJcmV0X2Jsb2NrID0gZXh0M190cnlfdG9fYWxsb2NhdGVfd2l0aF9yc3Yoc2IsIGhhbmRsZSwgZ3JvdXBfbm8sCisJCQkJCWJpdG1hcF9iaCwgcmV0X2Jsb2NrLCBteV9yc3YsICZmYXRhbCk7CisJCWlmIChmYXRhbCkKKwkJCWdvdG8gb3V0OworCQlpZiAocmV0X2Jsb2NrID49IDApCisJCQlnb3RvIGFsbG9jYXRlZDsKKwl9CisKKwluZ3JvdXBzID0gRVhUM19TQihzYiktPnNfZ3JvdXBzX2NvdW50OworCXNtcF9ybWIoKTsKKworCS8qCisJICogTm93IHNlYXJjaCB0aGUgcmVzdCBvZiB0aGUgZ3JvdXBzLiAgV2UgYXNzdW1lIHRoYXQgCisJICogaSBhbmQgZ2RwIGNvcnJlY3RseSBwb2ludCB0byB0aGUgbGFzdCBncm91cCB2aXNpdGVkLgorCSAqLworCWZvciAoYmdpID0gMDsgYmdpIDwgbmdyb3VwczsgYmdpKyspIHsKKwkJZ3JvdXBfbm8rKzsKKwkJaWYgKGdyb3VwX25vID49IG5ncm91cHMpCisJCQlncm91cF9ubyA9IDA7CisJCWdkcCA9IGV4dDNfZ2V0X2dyb3VwX2Rlc2Moc2IsIGdyb3VwX25vLCAmZ2RwX2JoKTsKKwkJaWYgKCFnZHApIHsKKwkJCSplcnJwID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZyZWVfYmxvY2tzID0gbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisJCS8qCisJCSAqIHNraXAgdGhpcyBncm91cCBpZiB0aGUgbnVtYmVyIG9mCisJCSAqIGZyZWUgYmxvY2tzIGlzIGxlc3MgdGhhbiBoYWxmIG9mIHRoZSByZXNlcnZhdGlvbgorCQkgKiB3aW5kb3cgc2l6ZS4KKwkJICovCisJCWlmIChmcmVlX2Jsb2NrcyA8PSAod2luZG93c3ovMikpCisJCQljb250aW51ZTsKKworCQlicmVsc2UoYml0bWFwX2JoKTsKKwkJYml0bWFwX2JoID0gcmVhZF9ibG9ja19iaXRtYXAoc2IsIGdyb3VwX25vKTsKKwkJaWYgKCFiaXRtYXBfYmgpCisJCQlnb3RvIGlvX2Vycm9yOworCQlyZXRfYmxvY2sgPSBleHQzX3RyeV90b19hbGxvY2F0ZV93aXRoX3JzdihzYiwgaGFuZGxlLCBncm91cF9ubywKKwkJCQkJYml0bWFwX2JoLCAtMSwgbXlfcnN2LCAmZmF0YWwpOworCQlpZiAoZmF0YWwpCisJCQlnb3RvIG91dDsKKwkJaWYgKHJldF9ibG9jayA+PSAwKSAKKwkJCWdvdG8gYWxsb2NhdGVkOworCX0KKwkvKgorCSAqIFdlIG1heSBlbmQgdXAgYSBib2d1cyBlYWxpZXIgRU5PU1BDIGVycm9yIGR1ZSB0bworCSAqIGZpbGVzeXN0ZW0gaXMgImZ1bGwiIG9mIHJlc2VydmF0aW9ucywgYnV0CisJICogdGhlcmUgbWF5YmUgaW5kZWVkIGZyZWUgYmxvY2tzIGF2YWxpYWJsZSBvbiBkaXNrCisJICogSW4gdGhpcyBjYXNlLCB3ZSBqdXN0IGZvcmdldCBhYm91dCB0aGUgcmVzZXJ2YXRpb25zCisJICoganVzdCBkbyBibG9jayBhbGxvY2F0aW9uIGFzIHdpdGhvdXQgcmVzZXJ2YXRpb25zLgorCSAqLworCWlmIChteV9yc3YpIHsKKwkJbXlfcnN2ID0gTlVMTDsKKwkJZ3JvdXBfbm8gPSBnb2FsX2dyb3VwOworCQlnb3RvIHJldHJ5OworCX0KKwkvKiBObyBzcGFjZSBsZWZ0IG9uIHRoZSBkZXZpY2UgKi8KKwkqZXJycCA9IC1FTk9TUEM7CisJZ290byBvdXQ7CisKK2FsbG9jYXRlZDoKKworCWV4dDNfZGVidWcoInVzaW5nIGJsb2NrIGdyb3VwICVkKCVkKVxuIiwKKwkJCWdyb3VwX25vLCBnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KTsKKworCUJVRkZFUl9UUkFDRShnZHBfYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJZmF0YWwgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGdkcF9iaCk7CisJaWYgKGZhdGFsKQorCQlnb3RvIG91dDsKKworCXRhcmdldF9ibG9jayA9IHJldF9ibG9jayArIGdyb3VwX25vICogRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKQorCQkJCSsgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisKKwlpZiAodGFyZ2V0X2Jsb2NrID09IGxlMzJfdG9fY3B1KGdkcC0+YmdfYmxvY2tfYml0bWFwKSB8fAorCSAgICB0YXJnZXRfYmxvY2sgPT0gbGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV9iaXRtYXApIHx8CisJICAgIGluX3JhbmdlKHRhcmdldF9ibG9jaywgbGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV90YWJsZSksCisJCSAgICAgIEVYVDNfU0Ioc2IpLT5zX2l0Yl9wZXJfZ3JvdXApKQorCQlleHQzX2Vycm9yKHNiLCAiZXh0M19uZXdfYmxvY2siLAorCQkJICAgICJBbGxvY2F0aW5nIGJsb2NrIGluIHN5c3RlbSB6b25lIC0gIgorCQkJICAgICJibG9jayA9ICV1IiwgdGFyZ2V0X2Jsb2NrKTsKKworCXBlcmZvcm1lZF9hbGxvY2F0aW9uID0gMTsKKworI2lmZGVmIENPTkZJR19KQkRfREVCVUcKKwl7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqZGVidWdfYmg7CisKKwkJLyogUmVjb3JkIGJpdG1hcCBidWZmZXIgc3RhdGUgaW4gdGhlIG5ld2x5IGFsbG9jYXRlZCBibG9jayAqLworCQlkZWJ1Z19iaCA9IHNiX2ZpbmRfZ2V0X2Jsb2NrKHNiLCB0YXJnZXRfYmxvY2spOworCQlpZiAoZGVidWdfYmgpIHsKKwkJCUJVRkZFUl9UUkFDRShkZWJ1Z19iaCwgInN0YXRlIHdoZW4gYWxsb2NhdGVkIik7CisJCQlCVUZGRVJfVFJBQ0UyKGRlYnVnX2JoLCBiaXRtYXBfYmgsICJiaXRtYXAgc3RhdGUiKTsKKwkJCWJyZWxzZShkZWJ1Z19iaCk7CisJCX0KKwl9CisJamJkX2xvY2tfYmhfc3RhdGUoYml0bWFwX2JoKTsKKwlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cF9ubykpOworCWlmIChidWZmZXJfamJkKGJpdG1hcF9iaCkgJiYgYmgyamgoYml0bWFwX2JoKS0+Yl9jb21taXR0ZWRfZGF0YSkgeworCQlpZiAoZXh0M190ZXN0X2JpdChyZXRfYmxvY2ssCisJCQkJYmgyamgoYml0bWFwX2JoKS0+Yl9jb21taXR0ZWRfZGF0YSkpIHsKKwkJCXByaW50aygiJXM6IGJsb2NrIHdhcyB1bmV4cGVjdGVkbHkgc2V0IGluICIKKwkJCQkiYl9jb21taXR0ZWRfZGF0YVxuIiwgX19GVU5DVElPTl9fKTsKKwkJfQorCX0KKwlleHQzX2RlYnVnKCJmb3VuZCBiaXQgJWRcbiIsIHJldF9ibG9jayk7CisJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cF9ubykpOworCWpiZF91bmxvY2tfYmhfc3RhdGUoYml0bWFwX2JoKTsKKyNlbmRpZgorCisJLyogcmV0X2Jsb2NrIHdhcyBibG9ja2dyb3VwLXJlbGF0aXZlLiAgTm93IGl0IGJlY29tZXMgZnMtcmVsYXRpdmUgKi8KKwlyZXRfYmxvY2sgPSB0YXJnZXRfYmxvY2s7CisKKwlpZiAocmV0X2Jsb2NrID49IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkpIHsKKwkJZXh0M19lcnJvcihzYiwgImV4dDNfbmV3X2Jsb2NrIiwKKwkJCSAgICAiYmxvY2soJWQpID49IGJsb2NrcyBjb3VudCglZCkgLSAiCisJCQkgICAgImJsb2NrX2dyb3VwID0gJWQsIGVzID09ICVwICIsIHJldF9ibG9jaywKKwkJCWxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCksIGdyb3VwX25vLCBlcyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBhZGQgdGhlIG5ldyBidWZmZXIgdG8gYSBqb3VybmFsCisJICogbGlzdCBvZiBzb21lIGRlc2NyaXB0aW9uLiAgV2UgZG9uJ3Qga25vdyBpbiBhZHZhbmNlIHdoZXRoZXIKKwkgKiB0aGUgY2FsbGVyIHdhbnRzIHRvIHVzZSBpdCBhcyBtZXRhZGF0YSBvciBkYXRhLgorCSAqLworCWV4dDNfZGVidWcoImFsbG9jYXRpbmcgYmxvY2sgJWQuIEdvYWwgaGl0cyAlZCBvZiAlZC5cbiIsCisJCQlyZXRfYmxvY2ssIGdvYWxfaGl0cywgZ29hbF9hdHRlbXB0cyk7CisKKwlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cF9ubykpOworCWdkcC0+YmdfZnJlZV9ibG9ja3NfY291bnQgPQorCQkJY3B1X3RvX2xlMTYobGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkgLSAxKTsKKwlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwX25vKSk7CisJcGVyY3B1X2NvdW50ZXJfbW9kKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyLCAtMSk7CisKKwlCVUZGRVJfVFJBQ0UoZ2RwX2JoLCAiam91cm5hbF9kaXJ0eV9tZXRhZGF0YSBmb3IgZ3JvdXAgZGVzY3JpcHRvciIpOworCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGdkcF9iaCk7CisJaWYgKCFmYXRhbCkKKwkJZmF0YWwgPSBlcnI7CisKKwlzYi0+c19kaXJ0ID0gMTsKKwlpZiAoZmF0YWwpCisJCWdvdG8gb3V0OworCisJKmVycnAgPSAwOworCWJyZWxzZShiaXRtYXBfYmgpOworCXJldHVybiByZXRfYmxvY2s7CisKK2lvX2Vycm9yOgorCSplcnJwID0gLUVJTzsKK291dDoKKwlpZiAoZmF0YWwpIHsKKwkJKmVycnAgPSBmYXRhbDsKKwkJZXh0M19zdGRfZXJyb3Ioc2IsIGZhdGFsKTsKKwl9CisJLyoKKwkgKiBVbmRvIHRoZSBibG9jayBhbGxvY2F0aW9uCisJICovCisJaWYgKCFwZXJmb3JtZWRfYWxsb2NhdGlvbikKKwkJRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgMSk7CisJYnJlbHNlKGJpdG1hcF9iaCk7CisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZXh0M19jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXVuc2lnbmVkIGxvbmcgZGVzY19jb3VudDsKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICpnZHA7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBuZ3JvdXBzOworI2lmZGVmIEVYVDNGU19ERUJVRworCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplczsKKwl1bnNpZ25lZCBsb25nIGJpdG1hcF9jb3VudCwgeDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CisKKwlsb2NrX3N1cGVyKHNiKTsKKwllcyA9IEVYVDNfU0Ioc2IpLT5zX2VzOworCWRlc2NfY291bnQgPSAwOworCWJpdG1hcF9jb3VudCA9IDA7CisJZ2RwID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgRVhUM19TQihzYiktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKKwkJZ2RwID0gZXh0M19nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CisJCWlmICghZ2RwKQorCQkJY29udGludWU7CisJCWRlc2NfY291bnQgKz0gbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisJCWJyZWxzZShiaXRtYXBfYmgpOworCQliaXRtYXBfYmggPSByZWFkX2Jsb2NrX2JpdG1hcChzYiwgaSk7CisJCWlmIChiaXRtYXBfYmggPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCXggPSBleHQzX2NvdW50X2ZyZWUoYml0bWFwX2JoLCBzYi0+c19ibG9ja3NpemUpOworCQlwcmludGsoImdyb3VwICVkOiBzdG9yZWQgPSAlZCwgY291bnRlZCA9ICVsdVxuIiwKKwkJCWksIGxlMTZfdG9fY3B1KGdkcC0+YmdfZnJlZV9ibG9ja3NfY291bnQpLCB4KTsKKwkJYml0bWFwX2NvdW50ICs9IHg7CisJfQorCWJyZWxzZShiaXRtYXBfYmgpOworCXByaW50aygiZXh0M19jb3VudF9mcmVlX2Jsb2Nrczogc3RvcmVkID0gJXUsIGNvbXB1dGVkID0gJWx1LCAlbHVcbiIsCisJICAgICAgIGxlMzJfdG9fY3B1KGVzLT5zX2ZyZWVfYmxvY2tzX2NvdW50KSwgZGVzY19jb3VudCwgYml0bWFwX2NvdW50KTsKKwl1bmxvY2tfc3VwZXIoc2IpOworCXJldHVybiBiaXRtYXBfY291bnQ7CisjZWxzZQorCWRlc2NfY291bnQgPSAwOworCW5ncm91cHMgPSBFWFQzX1NCKHNiKS0+c19ncm91cHNfY291bnQ7CisJc21wX3JtYigpOworCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKKwkJZ2RwID0gZXh0M19nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CisJCWlmICghZ2RwKQorCQkJY29udGludWU7CisJCWRlc2NfY291bnQgKz0gbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisJfQorCisJcmV0dXJuIGRlc2NfY291bnQ7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBpbnQKK2Jsb2NrX2luX3VzZSh1bnNpZ25lZCBsb25nIGJsb2NrLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBjaGFyICptYXApCit7CisJcmV0dXJuIGV4dDNfdGVzdF9iaXQgKChibG9jayAtCisJCWxlMzJfdG9fY3B1KEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKSAlCisJCQkgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSwgbWFwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9yb290KGludCBhLCBpbnQgYikKK3sKKwlpbnQgbnVtID0gYjsKKworCXdoaWxlIChhID4gbnVtKQorCQludW0gKj0gYjsKKwlyZXR1cm4gbnVtID09IGE7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19ncm91cF9zcGFyc2UoaW50IGdyb3VwKQoreworCWlmIChncm91cCA8PSAxKQorCQlyZXR1cm4gMTsKKwlpZiAoIShncm91cCAmIDEpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKHRlc3Rfcm9vdChncm91cCwgNykgfHwgdGVzdF9yb290KGdyb3VwLCA1KSB8fAorCQl0ZXN0X3Jvb3QoZ3JvdXAsIDMpKTsKK30KKworLyoqCisgKglleHQzX2JnX2hhc19zdXBlciAtIG51bWJlciBvZiBibG9ja3MgdXNlZCBieSB0aGUgc3VwZXJibG9jayBpbiBncm91cAorICoJQHNiOiBzdXBlcmJsb2NrIGZvciBmaWxlc3lzdGVtCisgKglAZ3JvdXA6IGdyb3VwIG51bWJlciB0byBjaGVjaworICoKKyAqCVJldHVybiB0aGUgbnVtYmVyIG9mIGJsb2NrcyB1c2VkIGJ5IHRoZSBzdXBlcmJsb2NrIChwcmltYXJ5IG9yIGJhY2t1cCkKKyAqCWluIHRoaXMgZ3JvdXAuICBDdXJyZW50bHkgdGhpcyB3aWxsIGJlIG9ubHkgMCBvciAxLgorICovCitpbnQgZXh0M19iZ19oYXNfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGdyb3VwKQoreworCWlmIChFWFQzX0hBU19ST19DT01QQVRfRkVBVFVSRShzYixFWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUikmJgorCSAgICAhZXh0M19ncm91cF9zcGFyc2UoZ3JvdXApKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKglleHQzX2JnX251bV9nZGIgLSBudW1iZXIgb2YgYmxvY2tzIHVzZWQgYnkgdGhlIGdyb3VwIHRhYmxlIGluIGdyb3VwCisgKglAc2I6IHN1cGVyYmxvY2sgZm9yIGZpbGVzeXN0ZW0KKyAqCUBncm91cDogZ3JvdXAgbnVtYmVyIHRvIGNoZWNrCisgKgorICoJUmV0dXJuIHRoZSBudW1iZXIgb2YgYmxvY2tzIHVzZWQgYnkgdGhlIGdyb3VwIGRlc2NyaXB0b3IgdGFibGUKKyAqCShwcmltYXJ5IG9yIGJhY2t1cCkgaW4gdGhpcyBncm91cC4gIEluIHRoZSBmdXR1cmUgdGhlcmUgbWF5IGJlIGEKKyAqCWRpZmZlcmVudCBudW1iZXIgb2YgZGVzY3JpcHRvciBibG9ja3MgaW4gZWFjaCBncm91cC4KKyAqLwordW5zaWduZWQgbG9uZyBleHQzX2JnX251bV9nZGIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGdyb3VwKQoreworCWlmIChFWFQzX0hBU19ST19DT01QQVRfRkVBVFVSRShzYixFWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUikmJgorCSAgICAhZXh0M19ncm91cF9zcGFyc2UoZ3JvdXApKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gRVhUM19TQihzYiktPnNfZ2RiX2NvdW50OworfQorCisjaWZkZWYgQ09ORklHX0VYVDNfQ0hFQ0sKKy8qIENhbGxlZCBhdCBtb3VudC10aW1lLCBzdXBlci1ibG9jayBpcyBsb2NrZWQgKi8KK3ZvaWQgZXh0M19jaGVja19ibG9ja3NfYml0bWFwIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKK3sKKwlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXM7CisJdW5zaWduZWQgbG9uZyBkZXNjX2NvdW50LCBiaXRtYXBfY291bnQsIHgsIGo7CisJdW5zaWduZWQgbG9uZyBkZXNjX2Jsb2NrczsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CisJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqZ2RwOworCWludCBpOworCisJZXMgPSBFWFQzX1NCKHNiKS0+c19lczsKKwlkZXNjX2NvdW50ID0gMDsKKwliaXRtYXBfY291bnQgPSAwOworCWdkcCA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IEVYVDNfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsgaSsrKSB7CisJCWdkcCA9IGV4dDNfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBpLCBOVUxMKTsKKwkJaWYgKCFnZHApCisJCQljb250aW51ZTsKKwkJZGVzY19jb3VudCArPSBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KTsKKwkJYnJlbHNlKGJpdG1hcF9iaCk7CisJCWJpdG1hcF9iaCA9IHJlYWRfYmxvY2tfYml0bWFwKHNiLCBpKTsKKwkJaWYgKGJpdG1hcF9iaCA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJaWYgKGV4dDNfYmdfaGFzX3N1cGVyKHNiLCBpKSAmJgorCQkJCSFleHQzX3Rlc3RfYml0KDAsIGJpdG1hcF9iaC0+Yl9kYXRhKSkKKwkJCWV4dDNfZXJyb3Ioc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAiU3VwZXJibG9jayBpbiBncm91cCAlZCBpcyBtYXJrZWQgZnJlZSIsIGkpOworCisJCWRlc2NfYmxvY2tzID0gZXh0M19iZ19udW1fZ2RiKHNiLCBpKTsKKwkJZm9yIChqID0gMDsgaiA8IGRlc2NfYmxvY2tzOyBqKyspCisJCQlpZiAoIWV4dDNfdGVzdF9iaXQoaiArIDEsIGJpdG1hcF9iaC0+Yl9kYXRhKSkKKwkJCQlleHQzX2Vycm9yKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkJCSAgICJEZXNjcmlwdG9yIGJsb2NrICMlbGQgaW4gZ3JvdXAgIgorCQkJCQkgICAiJWQgaXMgbWFya2VkIGZyZWUiLCBqLCBpKTsKKworCQlpZiAoIWJsb2NrX2luX3VzZSAobGUzMl90b19jcHUoZ2RwLT5iZ19ibG9ja19iaXRtYXApLAorCQkJCQkJc2IsIGJpdG1hcF9iaC0+Yl9kYXRhKSkKKwkJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19jaGVja19ibG9ja3NfYml0bWFwIiwKKwkJCQkgICAgIkJsb2NrIGJpdG1hcCBmb3IgZ3JvdXAgJWQgaXMgbWFya2VkIGZyZWUiLAorCQkJCSAgICBpKTsKKworCQlpZiAoIWJsb2NrX2luX3VzZSAobGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV9iaXRtYXApLAorCQkJCQkJc2IsIGJpdG1hcF9iaC0+Yl9kYXRhKSkKKwkJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19jaGVja19ibG9ja3NfYml0bWFwIiwKKwkJCQkgICAgIklub2RlIGJpdG1hcCBmb3IgZ3JvdXAgJWQgaXMgbWFya2VkIGZyZWUiLAorCQkJCSAgICBpKTsKKworCQlmb3IgKGogPSAwOyBqIDwgRVhUM19TQihzYiktPnNfaXRiX3Blcl9ncm91cDsgaisrKQorCQkJaWYgKCFibG9ja19pbl91c2UgKGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpICsgaiwKKwkJCQkJCQlzYiwgYml0bWFwX2JoLT5iX2RhdGEpKQorCQkJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19jaGVja19ibG9ja3NfYml0bWFwIiwKKwkJCQkJICAgICJCbG9jayAjJWQgb2YgdGhlIGlub2RlIHRhYmxlIGluICIKKwkJCQkJICAgICJncm91cCAlZCBpcyBtYXJrZWQgZnJlZSIsIGosIGkpOworCisJCXggPSBleHQzX2NvdW50X2ZyZWUoYml0bWFwX2JoLCBzYi0+c19ibG9ja3NpemUpOworCQlpZiAobGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkgIT0geCkKKwkJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19jaGVja19ibG9ja3NfYml0bWFwIiwKKwkJCQkgICAgIldyb25nIGZyZWUgYmxvY2tzIGNvdW50IGZvciBncm91cCAlZCwgIgorCQkJCSAgICAic3RvcmVkID0gJWQsIGNvdW50ZWQgPSAlbHUiLCBpLAorCQkJCSAgICBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSwgeCk7CisJCWJpdG1hcF9jb3VudCArPSB4OworCX0KKwlicmVsc2UoYml0bWFwX2JoKTsKKwlpZiAobGUzMl90b19jcHUoZXMtPnNfZnJlZV9ibG9ja3NfY291bnQpICE9IGJpdG1hcF9jb3VudCkKKwkJZXh0M19lcnJvciAoc2IsICJleHQzX2NoZWNrX2Jsb2Nrc19iaXRtYXAiLAorCQkJIldyb25nIGZyZWUgYmxvY2tzIGNvdW50IGluIHN1cGVyIGJsb2NrLCAiCisJCQkic3RvcmVkID0gJWx1LCBjb3VudGVkID0gJWx1IiwKKwkJCSh1bnNpZ25lZCBsb25nKWxlMzJfdG9fY3B1KGVzLT5zX2ZyZWVfYmxvY2tzX2NvdW50KSwKKwkJCWJpdG1hcF9jb3VudCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvYml0bWFwLmMgYi9mcy9leHQzL2JpdG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDE5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQzL2JpdG1hcC5jCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiAgbGludXgvZnMvZXh0My9iaXRtYXAuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworCitzdGF0aWMgaW50IG5pYmJsZW1hcFtdID0gezQsIDMsIDMsIDIsIDMsIDIsIDIsIDEsIDMsIDIsIDIsIDEsIDIsIDEsIDEsIDB9OworCit1bnNpZ25lZCBsb25nIGV4dDNfY291bnRfZnJlZSAoc3RydWN0IGJ1ZmZlcl9oZWFkICogbWFwLCB1bnNpZ25lZCBpbnQgbnVtY2hhcnMpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgbG9uZyBzdW0gPSAwOworCisJaWYgKCFtYXApIAorCQlyZXR1cm4gKDApOworCWZvciAoaSA9IDA7IGkgPCBudW1jaGFyczsgaSsrKQorCQlzdW0gKz0gbmliYmxlbWFwW21hcC0+Yl9kYXRhW2ldICYgMHhmXSArCisJCQluaWJibGVtYXBbKG1hcC0+Yl9kYXRhW2ldID4+IDQpICYgMHhmXTsKKwlyZXR1cm4gKHN1bSk7Cit9CmRpZmYgLS1naXQgYS9mcy9leHQzL2Rpci5jIGIvZnMvZXh0My9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzI4NjdhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0My9kaXIuYwpAQCAtMCwwICsxLDUxOSBAQAorLyoKKyAqICBsaW51eC9mcy9leHQzL2Rpci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2ZzL21pbml4L2Rpci5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgZXh0MyBkaXJlY3RvcnkgaGFuZGxpbmcgZnVuY3Rpb25zCisgKgorICogIEJpZy1lbmRpYW4gdG8gbGl0dGxlLWVuZGlhbiBieXRlLXN3YXBwaW5nL2JpdG1hcHMgYnkKKyAqICAgICAgICBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpLCAxOTk1CisgKgorICogSGFzaCBUcmVlIERpcmVjdG9yeSBpbmRleGluZyAoYykgMjAwMSAgRGFuaWVsIFBoaWxsaXBzCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgorCitzdGF0aWMgdW5zaWduZWQgY2hhciBleHQzX2ZpbGV0eXBlX3RhYmxlW10gPSB7CisJRFRfVU5LTk9XTiwgRFRfUkVHLCBEVF9ESVIsIERUX0NIUiwgRFRfQkxLLCBEVF9GSUZPLCBEVF9TT0NLLCBEVF9MTksKK307CisKK3N0YXRpYyBpbnQgZXh0M19yZWFkZGlyKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKK3N0YXRpYyBpbnQgZXh0M19keF9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwKKwkJCSAgIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKTsKK3N0YXRpYyBpbnQgZXh0M19yZWxlYXNlX2RpciAoc3RydWN0IGlub2RlICogaW5vZGUsCisJCQkJc3RydWN0IGZpbGUgKiBmaWxwKTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQzX2Rpcl9vcGVyYXRpb25zID0geworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gZXh0M19yZWFkZGlyLAkJLyogd2UgdGFrZSBCS0wuIG5lZWRlZD8qLworCS5pb2N0bAkJPSBleHQzX2lvY3RsLAkJLyogQktMIGhlbGQgKi8KKwkuZnN5bmMJCT0gZXh0M19zeW5jX2ZpbGUsCS8qIEJLTCBoZWxkICovCisjaWZkZWYgQ09ORklHX0VYVDNfSU5ERVgKKwkucmVsZWFzZQk9IGV4dDNfcmVsZWFzZV9kaXIsCisjZW5kaWYKK307CisKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ2V0X2R0eXBlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBmaWxldHlwZSkKK3sKKwlpZiAoIUVYVDNfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRSkgfHwKKwkgICAgKGZpbGV0eXBlID49IEVYVDNfRlRfTUFYKSkKKwkJcmV0dXJuIERUX1VOS05PV047CisKKwlyZXR1cm4gKGV4dDNfZmlsZXR5cGVfdGFibGVbZmlsZXR5cGVdKTsKK30KKwkJCSAgICAgICAKKworaW50IGV4dDNfY2hlY2tfZGlyX2VudHJ5IChjb25zdCBjaGFyICogZnVuY3Rpb24sIHN0cnVjdCBpbm9kZSAqIGRpciwKKwkJCSAgc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKiBkZSwKKwkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsCisJCQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCWNvbnN0IGNoYXIgKiBlcnJvcl9tc2cgPSBOVUxMOworIAljb25zdCBpbnQgcmxlbiA9IGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKTsKKworCWlmIChybGVuIDwgRVhUM19ESVJfUkVDX0xFTigxKSkKKwkJZXJyb3JfbXNnID0gInJlY19sZW4gaXMgc21hbGxlciB0aGFuIG1pbmltYWwiOworCWVsc2UgaWYgKHJsZW4gJSA0ICE9IDApCisJCWVycm9yX21zZyA9ICJyZWNfbGVuICUgNCAhPSAwIjsKKwllbHNlIGlmIChybGVuIDwgRVhUM19ESVJfUkVDX0xFTihkZS0+bmFtZV9sZW4pKQorCQllcnJvcl9tc2cgPSAicmVjX2xlbiBpcyB0b28gc21hbGwgZm9yIG5hbWVfbGVuIjsKKwllbHNlIGlmICgoKGNoYXIgKikgZGUgLSBiaC0+Yl9kYXRhKSArIHJsZW4gPiBkaXItPmlfc2ItPnNfYmxvY2tzaXplKQorCQllcnJvcl9tc2cgPSAiZGlyZWN0b3J5IGVudHJ5IGFjcm9zcyBibG9ja3MiOworCWVsc2UgaWYgKGxlMzJfdG9fY3B1KGRlLT5pbm9kZSkgPgorCQkJbGUzMl90b19jcHUoRVhUM19TQihkaXItPmlfc2IpLT5zX2VzLT5zX2lub2Rlc19jb3VudCkpCisJCWVycm9yX21zZyA9ICJpbm9kZSBvdXQgb2YgYm91bmRzIjsKKworCWlmIChlcnJvcl9tc2cgIT0gTlVMTCkKKwkJZXh0M19lcnJvciAoZGlyLT5pX3NiLCBmdW5jdGlvbiwKKwkJCSJiYWQgZW50cnkgaW4gZGlyZWN0b3J5ICMlbHU6ICVzIC0gIgorCQkJIm9mZnNldD0lbHUsIGlub2RlPSVsdSwgcmVjX2xlbj0lZCwgbmFtZV9sZW49JWQiLAorCQkJZGlyLT5pX2lubywgZXJyb3JfbXNnLCBvZmZzZXQsCisJCQkodW5zaWduZWQgbG9uZykgbGUzMl90b19jcHUoZGUtPmlub2RlKSwKKwkJCXJsZW4sIGRlLT5uYW1lX2xlbik7CisJcmV0dXJuIGVycm9yX21zZyA9PSBOVUxMID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwKKwkJCSB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlpbnQgZXJyb3IgPSAwOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBibGs7CisJaW50IGksIG51bSwgc3RvcmVkOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCAqIHRtcCwgKiBiaGFbMTZdOworCXN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICogZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJaW50IGVycjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW50IHJldCA9IDA7CisKKwlzYiA9IGlub2RlLT5pX3NiOworCisjaWZkZWYgQ09ORklHX0VYVDNfSU5ERVgKKwlpZiAoRVhUM19IQVNfQ09NUEFUX0ZFQVRVUkUoaW5vZGUtPmlfc2IsCisJCQkJICAgIEVYVDNfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYKSAmJgorCSAgICAoKEVYVDNfSShpbm9kZSktPmlfZmxhZ3MgJiBFWFQzX0lOREVYX0ZMKSB8fAorCSAgICAgKChpbm9kZS0+aV9zaXplID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSA9PSAxKSkpIHsKKwkJZXJyID0gZXh0M19keF9yZWFkZGlyKGZpbHAsIGRpcmVudCwgZmlsbGRpcik7CisJCWlmIChlcnIgIT0gRVJSX0JBRF9EWF9ESVIpIHsKKwkJCXJldCA9IGVycjsKKwkJCWdvdG8gb3V0OworCQl9CisJCS8qCisJCSAqIFdlIGRvbid0IHNldCB0aGUgaW5vZGUgZGlydHkgZmxhZyBzaW5jZSBpdCdzIG5vdAorCQkgKiBjcml0aWNhbCB0aGF0IGl0IGdldCBmbHVzaGVkIGJhY2sgdG8gdGhlIGRpc2suCisJCSAqLworCQlFWFQzX0koZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpLT5pX2ZsYWdzICY9IH5FWFQzX0lOREVYX0ZMOworCX0KKyNlbmRpZgorCXN0b3JlZCA9IDA7CisJYmggPSBOVUxMOworCW9mZnNldCA9IGZpbHAtPmZfcG9zICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOworCisJd2hpbGUgKCFlcnJvciAmJiAhc3RvcmVkICYmIGZpbHAtPmZfcG9zIDwgaW5vZGUtPmlfc2l6ZSkgeworCQlibGsgPSAoZmlscC0+Zl9wb3MpID4+IEVYVDNfQkxPQ0tfU0laRV9CSVRTKHNiKTsKKwkJYmggPSBleHQzX2JyZWFkKE5VTEwsIGlub2RlLCBibGssIDAsICZlcnIpOworCQlpZiAoIWJoKSB7CisJCQlleHQzX2Vycm9yIChzYiwgImV4dDNfcmVhZGRpciIsCisJCQkJImRpcmVjdG9yeSAjJWx1IGNvbnRhaW5zIGEgaG9sZSBhdCBvZmZzZXQgJWx1IiwKKwkJCQlpbm9kZS0+aV9pbm8sICh1bnNpZ25lZCBsb25nKWZpbHAtPmZfcG9zKTsKKwkJCWZpbHAtPmZfcG9zICs9IHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogRG8gdGhlIHJlYWRhaGVhZAorCQkgKi8KKwkJaWYgKCFvZmZzZXQpIHsKKwkJCWZvciAoaSA9IDE2ID4+IChFWFQzX0JMT0NLX1NJWkVfQklUUyhzYikgLSA5KSwgbnVtID0gMDsKKwkJCSAgICAgaSA+IDA7IGktLSkgeworCQkJCXRtcCA9IGV4dDNfZ2V0YmxrIChOVUxMLCBpbm9kZSwgKytibGssIDAsICZlcnIpOworCQkJCWlmICh0bXAgJiYgIWJ1ZmZlcl91cHRvZGF0ZSh0bXApICYmCisJCQkJCQkhYnVmZmVyX2xvY2tlZCh0bXApKQorCQkJCQliaGFbbnVtKytdID0gdG1wOworCQkJCWVsc2UKKwkJCQkJYnJlbHNlICh0bXApOworCQkJfQorCQkJaWYgKG51bSkgeworCQkJCWxsX3J3X2Jsb2NrIChSRUFEQSwgbnVtLCBiaGEpOworCQkJCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJCQkJYnJlbHNlIChiaGFbaV0pOworCQkJfQorCQl9CisKK3JldmFsaWRhdGU6CisJCS8qIElmIHRoZSBkaXIgYmxvY2sgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0bworCQkgKiByZWFkZGlyKDIpLCB0aGVuIHdlIG1pZ2h0IGJlIHBvaW50aW5nIHRvIGFuIGludmFsaWQKKwkJICogZGlyZW50IHJpZ2h0IG5vdy4gIFNjYW4gZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrCisJCSAqIHRvIG1ha2Ugc3VyZS4gKi8KKwkJaWYgKGZpbHAtPmZfdmVyc2lvbiAhPSBpbm9kZS0+aV92ZXJzaW9uKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2ItPnNfYmxvY2tzaXplICYmIGkgPCBvZmZzZXQ7ICkgeworCQkJCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopIAorCQkJCQkoYmgtPmJfZGF0YSArIGkpOworCQkJCS8qIEl0J3MgdG9vIGV4cGVuc2l2ZSB0byBkbyBhIGZ1bGwKKwkJCQkgKiBkaXJlbnQgdGVzdCBlYWNoIHRpbWUgcm91bmQgdGhpcworCQkJCSAqIGxvb3AsIGJ1dCB3ZSBkbyBoYXZlIHRvIHRlc3QgYXQKKwkJCQkgKiBsZWFzdCB0aGF0IGl0IGlzIG5vbi16ZXJvLiAgQQorCQkJCSAqIGZhaWx1cmUgd2lsbCBiZSBkZXRlY3RlZCBpbiB0aGUKKwkJCQkgKiBkaXJlbnQgdGVzdCBiZWxvdy4gKi8KKwkJCQlpZiAobGUxNl90b19jcHUoZGUtPnJlY19sZW4pIDwKKwkJCQkJCUVYVDNfRElSX1JFQ19MRU4oMSkpCisJCQkJCWJyZWFrOworCQkJCWkgKz0gbGUxNl90b19jcHUoZGUtPnJlY19sZW4pOworCQkJfQorCQkJb2Zmc2V0ID0gaTsKKwkJCWZpbHAtPmZfcG9zID0gKGZpbHAtPmZfcG9zICYgfihzYi0+c19ibG9ja3NpemUgLSAxKSkKKwkJCQl8IG9mZnNldDsKKwkJCWZpbHAtPmZfdmVyc2lvbiA9IGlub2RlLT5pX3ZlcnNpb247CisJCX0KKworCQl3aGlsZSAoIWVycm9yICYmIGZpbHAtPmZfcG9zIDwgaW5vZGUtPmlfc2l6ZSAKKwkJICAgICAgICYmIG9mZnNldCA8IHNiLT5zX2Jsb2Nrc2l6ZSkgeworCQkJZGUgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikgKGJoLT5iX2RhdGEgKyBvZmZzZXQpOworCQkJaWYgKCFleHQzX2NoZWNrX2Rpcl9lbnRyeSAoImV4dDNfcmVhZGRpciIsIGlub2RlLCBkZSwKKwkJCQkJCSAgIGJoLCBvZmZzZXQpKSB7CisJCQkJLyogT24gZXJyb3IsIHNraXAgdGhlIGZfcG9zIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IGJsb2NrLiAqLworCQkJCWZpbHAtPmZfcG9zID0gKGZpbHAtPmZfcG9zIHwKKwkJCQkJCShzYi0+c19ibG9ja3NpemUgLSAxKSkgKyAxOworCQkJCWJyZWxzZSAoYmgpOworCQkJCXJldCA9IHN0b3JlZDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCW9mZnNldCArPSBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbik7CisJCQlpZiAobGUzMl90b19jcHUoZGUtPmlub2RlKSkgeworCQkJCS8qIFdlIG1pZ2h0IGJsb2NrIGluIHRoZSBuZXh0IHNlY3Rpb24KKwkJCQkgKiBpZiB0aGUgZGF0YSBkZXN0aW5hdGlvbiBpcworCQkJCSAqIGN1cnJlbnRseSBzd2FwcGVkIG91dC4gIFNvLCB1c2UgYQorCQkJCSAqIHZlcnNpb24gc3RhbXAgdG8gZGV0ZWN0IHdoZXRoZXIgb3IKKwkJCQkgKiBub3QgdGhlIGRpcmVjdG9yeSBoYXMgYmVlbiBtb2RpZmllZAorCQkJCSAqIGR1cmluZyB0aGUgY29weSBvcGVyYXRpb24uCisJCQkJICovCisJCQkJdW5zaWduZWQgbG9uZyB2ZXJzaW9uID0gZmlscC0+Zl92ZXJzaW9uOworCisJCQkJZXJyb3IgPSBmaWxsZGlyKGRpcmVudCwgZGUtPm5hbWUsCisJCQkJCQlkZS0+bmFtZV9sZW4sCisJCQkJCQlmaWxwLT5mX3BvcywKKwkJCQkJCWxlMzJfdG9fY3B1KGRlLT5pbm9kZSksCisJCQkJCQlnZXRfZHR5cGUoc2IsIGRlLT5maWxlX3R5cGUpKTsKKwkJCQlpZiAoZXJyb3IpCisJCQkJCWJyZWFrOworCQkJCWlmICh2ZXJzaW9uICE9IGZpbHAtPmZfdmVyc2lvbikKKwkJCQkJZ290byByZXZhbGlkYXRlOworCQkJCXN0b3JlZCArKzsKKwkJCX0KKwkJCWZpbHAtPmZfcG9zICs9IGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKTsKKwkJfQorCQlvZmZzZXQgPSAwOworCQlicmVsc2UgKGJoKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19FWFQzX0lOREVYCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGNvbnZlcnQgZnJvbSB0aGUgbWFqb3IvbWlub3IgaGFzaCB0byBhbiBmX3BvcworICogdmFsdWUuCisgKiAKKyAqIEN1cnJlbnRseSB3ZSBvbmx5IHVzZSBtYWpvciBoYXNoIG51bWVyLiAgVGhpcyBpcyB1bmZvcnR1bmF0ZSwgYnV0CisgKiBvbiAzMi1iaXQgbWFjaGluZXMsIHRoZSBzYW1lIFZGUyBpbnRlcmZhY2UgaXMgdXNlZCBmb3IgbHNlZWsgYW5kCisgKiBsbHNlZWssIHNvIGlmIHdlIHVzZSB0aGUgNjQgYml0IG9mZnNldCwgdGhlbiB0aGUgMzItYml0IHZlcnNpb25zIG9mCisgKiBsc2Vlay90ZWxsZGlyL3NlZWtkaXIgd2lsbCBibG93IG91dCBzcGVjdGFjdWxhcmx5LCBhbmQgZnJvbSB3aXRoaW4KKyAqIHRoZSBleHQyIGxvdy1sZXZlbCByb3V0aW5lLCB3ZSBkb24ndCBrbm93IGlmIHdlJ3JlIGJlaW5nIGNhbGxlZCBieQorICogYSA2NC1iaXQgdmVyc2lvbiBvZiB0aGUgc3lzdGVtIGNhbGwgb3IgdGhlIDMyLWJpdCB2ZXJzaW9uIG9mIHRoZQorICogc3lzdGVtIGNhbGwuICBXb3JzZSB5ZXQsIE5GU3YyIG9ubHkgYWxsb3dzIGZvciBhIDMyLWJpdCByZWFkZGlyCisgKiBjb29raWUuICBTaWdoLgorICovCisjZGVmaW5lIGhhc2gycG9zKG1ham9yLCBtaW5vcikJKG1ham9yID4+IDEpCisjZGVmaW5lIHBvczJtYWpfaGFzaChwb3MpCSgocG9zIDw8IDEpICYgMHhmZmZmZmZmZikKKyNkZWZpbmUgcG9zMm1pbl9oYXNoKHBvcykJKDApCisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBob2xkcyB0aGUgbm9kZXMgb2YgdGhlIHJlZC1ibGFjayB0cmVlIHVzZWQgdG8gc3RvcmUKKyAqIHRoZSBkaXJlY3RvcnkgZW50cnkgaW4gaGFzaCBvcmRlci4KKyAqLworc3RydWN0IGZuYW1lIHsKKwlfX3UzMgkJaGFzaDsKKwlfX3UzMgkJbWlub3JfaGFzaDsKKwlzdHJ1Y3QgcmJfbm9kZQlyYl9oYXNoOyAKKwlzdHJ1Y3QgZm5hbWUJKm5leHQ7CisJX191MzIJCWlub2RlOworCV9fdTgJCW5hbWVfbGVuOworCV9fdTgJCWZpbGVfdHlwZTsKKwljaGFyCQluYW1lWzBdOworfTsKKworLyoKKyAqIFRoaXMgZnVuY3RvaW4gaW1wbGVtZW50cyBhIG5vbi1yZWN1cnNpdmUgd2F5IG9mIGZyZWVpbmcgYWxsIG9mIHRoZQorICogbm9kZXMgaW4gdGhlIHJlZC1ibGFjayB0cmVlLgorICovCitzdGF0aWMgdm9pZCBmcmVlX3JiX3RyZWVfZm5hbWUoc3RydWN0IHJiX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IHJiX25vZGUJKm4gPSByb290LT5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlCSpwYXJlbnQ7CisJc3RydWN0IGZuYW1lCSpmbmFtZTsKKworCXdoaWxlIChuKSB7CisJCS8qIERvIHRoZSBub2RlJ3MgY2hpbGRyZW4gZmlyc3QgKi8KKwkJaWYgKChuKS0+cmJfbGVmdCkgeworCQkJbiA9IG4tPnJiX2xlZnQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobi0+cmJfcmlnaHQpIHsKKwkJCW4gPSBuLT5yYl9yaWdodDsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIFRoZSBub2RlIGhhcyBubyBjaGlsZHJlbjsgZnJlZSBpdCwgYW5kIHRoZW4gemVybworCQkgKiBvdXQgcGFyZW50J3MgbGluayB0byBpdC4gIEZpbmFsbHkgZ28gdG8gdGhlCisJCSAqIGJlZ2lubmluZyBvZiB0aGUgbG9vcCBhbmQgdHJ5IHRvIGZyZWUgdGhlIHBhcmVudAorCQkgKiBub2RlLgorCQkgKi8KKwkJcGFyZW50ID0gbi0+cmJfcGFyZW50OworCQlmbmFtZSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBmbmFtZSwgcmJfaGFzaCk7CisJCXdoaWxlIChmbmFtZSkgeworCQkJc3RydWN0IGZuYW1lICogb2xkID0gZm5hbWU7CisJCQlmbmFtZSA9IGZuYW1lLT5uZXh0OworCQkJa2ZyZWUgKG9sZCk7CisJCX0KKwkJaWYgKCFwYXJlbnQpCisJCQlyb290LT5yYl9ub2RlID0gTlVMTDsKKwkJZWxzZSBpZiAocGFyZW50LT5yYl9sZWZ0ID09IG4pCisJCQlwYXJlbnQtPnJiX2xlZnQgPSBOVUxMOworCQllbHNlIGlmIChwYXJlbnQtPnJiX3JpZ2h0ID09IG4pCisJCQlwYXJlbnQtPnJiX3JpZ2h0ID0gTlVMTDsKKwkJbiA9IHBhcmVudDsKKwl9CisJcm9vdC0+cmJfbm9kZSA9IE5VTEw7Cit9CisKKworc3RhdGljIHN0cnVjdCBkaXJfcHJpdmF0ZV9pbmZvICpjcmVhdGVfZGlyX2luZm8obG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgZGlyX3ByaXZhdGVfaW5mbyAqcDsKKworCXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGlyX3ByaXZhdGVfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghcCkKKwkJcmV0dXJuIE5VTEw7CisJcC0+cm9vdC5yYl9ub2RlID0gTlVMTDsKKwlwLT5jdXJyX25vZGUgPSBOVUxMOworCXAtPmV4dHJhX2ZuYW1lID0gTlVMTDsKKwlwLT5sYXN0X3BvcyA9IDA7CisJcC0+Y3Vycl9oYXNoID0gcG9zMm1hal9oYXNoKHBvcyk7CisJcC0+Y3Vycl9taW5vcl9oYXNoID0gcG9zMm1pbl9oYXNoKHBvcyk7CisJcC0+bmV4dF9oYXNoID0gMDsKKwlyZXR1cm4gcDsKK30KKwordm9pZCBleHQzX2h0cmVlX2ZyZWVfZGlyX2luZm8oc3RydWN0IGRpcl9wcml2YXRlX2luZm8gKnApCit7CisJZnJlZV9yYl90cmVlX2ZuYW1lKCZwLT5yb290KTsKKwlrZnJlZShwKTsKK30KKworLyoKKyAqIEdpdmVuIGEgZGlyZWN0b3J5IGVudHJ5LCBlbnRlciBpdCBpbnRvIHRoZSBmbmFtZSByYiB0cmVlLgorICovCitpbnQgZXh0M19odHJlZV9zdG9yZV9kaXJlbnQoc3RydWN0IGZpbGUgKmRpcl9maWxlLCBfX3UzMiBoYXNoLAorCQkJICAgICBfX3UzMiBtaW5vcl9oYXNoLAorCQkJICAgICBzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqZGlyZW50KQoreworCXN0cnVjdCByYl9ub2RlICoqcCwgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IGZuYW1lICogZm5hbWUsICpuZXdfZm47CisJc3RydWN0IGRpcl9wcml2YXRlX2luZm8gKmluZm87CisJaW50IGxlbjsKKworCWluZm8gPSAoc3RydWN0IGRpcl9wcml2YXRlX2luZm8gKikgZGlyX2ZpbGUtPnByaXZhdGVfZGF0YTsKKwlwID0gJmluZm8tPnJvb3QucmJfbm9kZTsKKworCS8qIENyZWF0ZSBhbmQgYWxsb2NhdGUgdGhlIGZuYW1lIHN0cnVjdHVyZSAqLworCWxlbiA9IHNpemVvZihzdHJ1Y3QgZm5hbWUpICsgZGlyZW50LT5uYW1lX2xlbiArIDE7CisJbmV3X2ZuID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmICghbmV3X2ZuKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQobmV3X2ZuLCAwLCBsZW4pOworCW5ld19mbi0+aGFzaCA9IGhhc2g7CisJbmV3X2ZuLT5taW5vcl9oYXNoID0gbWlub3JfaGFzaDsKKwluZXdfZm4tPmlub2RlID0gbGUzMl90b19jcHUoZGlyZW50LT5pbm9kZSk7CisJbmV3X2ZuLT5uYW1lX2xlbiA9IGRpcmVudC0+bmFtZV9sZW47CisJbmV3X2ZuLT5maWxlX3R5cGUgPSBkaXJlbnQtPmZpbGVfdHlwZTsKKwltZW1jcHkobmV3X2ZuLT5uYW1lLCBkaXJlbnQtPm5hbWUsIGRpcmVudC0+bmFtZV9sZW4pOworCW5ld19mbi0+bmFtZVtkaXJlbnQtPm5hbWVfbGVuXSA9IDA7CisKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCWZuYW1lID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgZm5hbWUsIHJiX2hhc2gpOworCisJCS8qCisJCSAqIElmIHRoZSBoYXNoIGFuZCBtaW5vciBoYXNoIG1hdGNoIHVwLCB0aGVuIHdlIHB1dAorCQkgKiB0aGVtIG9uIGEgbGlua2VkIGxpc3QuICBUaGlzIHJhcmVseSBoYXBwZW5zLi4uCisJCSAqLworCQlpZiAoKG5ld19mbi0+aGFzaCA9PSBmbmFtZS0+aGFzaCkgJiYKKwkJICAgIChuZXdfZm4tPm1pbm9yX2hhc2ggPT0gZm5hbWUtPm1pbm9yX2hhc2gpKSB7CisJCQluZXdfZm4tPm5leHQgPSBmbmFtZS0+bmV4dDsKKwkJCWZuYW1lLT5uZXh0ID0gbmV3X2ZuOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAobmV3X2ZuLT5oYXNoIDwgZm5hbWUtPmhhc2gpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKG5ld19mbi0+aGFzaCA+IGZuYW1lLT5oYXNoKQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZSBpZiAobmV3X2ZuLT5taW5vcl9oYXNoIDwgZm5hbWUtPm1pbm9yX2hhc2gpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UgLyogaWYgKG5ld19mbi0+bWlub3JfaGFzaCA+IGZuYW1lLT5taW5vcl9oYXNoKSAqLworCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwl9CisKKwlyYl9saW5rX25vZGUoJm5ld19mbi0+cmJfaGFzaCwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJm5ld19mbi0+cmJfaGFzaCwgJmluZm8tPnJvb3QpOworCXJldHVybiAwOworfQorCisKKworLyoKKyAqIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIGV4dDNfZHhfcmVhZGRpci4gIEl0IGNhbGxzIGZpbGxkaXIKKyAqIGZvciBhbGwgZW50cmVzIG9uIHRoZSBmbmFtZSBsaW5rZWQgbGlzdC4gIChOb3JtYWxseSB0aGVyZSBpcyBvbmx5CisgKiBvbmUgZW50cnkgb24gdGhlIGxpbmtlZCBsaXN0LCB1bmxlc3MgdGhlcmUgYXJlIDYyIGJpdCBoYXNoIGNvbGxpc2lvbnMuKQorICovCitzdGF0aWMgaW50IGNhbGxfZmlsbGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsCisJCQlmaWxsZGlyX3QgZmlsbGRpciwgc3RydWN0IGZuYW1lICpmbmFtZSkKK3sKKwlzdHJ1Y3QgZGlyX3ByaXZhdGVfaW5mbyAqaW5mbyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlsb2ZmX3QJY3Vycl9wb3M7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworCWludCBlcnJvcjsKKworCXNiID0gaW5vZGUtPmlfc2I7CisKKwlpZiAoIWZuYW1lKSB7CisJCXByaW50aygiY2FsbF9maWxsZGlyOiBjYWxsZWQgd2l0aCBudWxsIGZuYW1lPyE/XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWN1cnJfcG9zID0gaGFzaDJwb3MoZm5hbWUtPmhhc2gsIGZuYW1lLT5taW5vcl9oYXNoKTsKKwl3aGlsZSAoZm5hbWUpIHsKKwkJZXJyb3IgPSBmaWxsZGlyKGRpcmVudCwgZm5hbWUtPm5hbWUsCisJCQkJZm5hbWUtPm5hbWVfbGVuLCBjdXJyX3BvcywgCisJCQkJZm5hbWUtPmlub2RlLAorCQkJCWdldF9kdHlwZShzYiwgZm5hbWUtPmZpbGVfdHlwZSkpOworCQlpZiAoZXJyb3IpIHsKKwkJCWZpbHAtPmZfcG9zID0gY3Vycl9wb3M7CisJCQlpbmZvLT5leHRyYV9mbmFtZSA9IGZuYW1lLT5uZXh0OworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCWZuYW1lID0gZm5hbWUtPm5leHQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4dDNfZHhfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsCisJCQkgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGRpcl9wcml2YXRlX2luZm8gKmluZm8gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBmbmFtZSAqZm5hbWU7CisJaW50CXJldDsKKworCWlmICghaW5mbykgeworCQlpbmZvID0gY3JlYXRlX2Rpcl9pbmZvKGZpbHAtPmZfcG9zKTsKKwkJaWYgKCFpbmZvKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWZpbHAtPnByaXZhdGVfZGF0YSA9IGluZm87CisJfQorCisJaWYgKGZpbHAtPmZfcG9zID09IEVYVDNfSFRSRUVfRU9GKQorCQlyZXR1cm4gMDsJLyogRU9GICovCisKKwkvKiBTb21lIG9uZSBoYXMgbWVzc2VkIHdpdGggZl9wb3M7IHJlc2V0IHRoZSB3b3JsZCAqLworCWlmIChpbmZvLT5sYXN0X3BvcyAhPSBmaWxwLT5mX3BvcykgeworCQlmcmVlX3JiX3RyZWVfZm5hbWUoJmluZm8tPnJvb3QpOworCQlpbmZvLT5jdXJyX25vZGUgPSBOVUxMOworCQlpbmZvLT5leHRyYV9mbmFtZSA9IE5VTEw7CisJCWluZm8tPmN1cnJfaGFzaCA9IHBvczJtYWpfaGFzaChmaWxwLT5mX3Bvcyk7CisJCWluZm8tPmN1cnJfbWlub3JfaGFzaCA9IHBvczJtaW5faGFzaChmaWxwLT5mX3Bvcyk7CisJfQorCisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgYW55IGxlZnRvdmVyIG5hbWVzIG9uIHRoZSBoYXNoIGNvbGxpc2lvbgorCSAqIGNoYWluLCByZXR1cm4gdGhlbSBmaXJzdC4KKwkgKi8KKwlpZiAoaW5mby0+ZXh0cmFfZm5hbWUgJiYKKwkgICAgY2FsbF9maWxsZGlyKGZpbHAsIGRpcmVudCwgZmlsbGRpciwgaW5mby0+ZXh0cmFfZm5hbWUpKQorCQlnb3RvIGZpbmlzaGVkOworCisJaWYgKCFpbmZvLT5jdXJyX25vZGUpCisJCWluZm8tPmN1cnJfbm9kZSA9IHJiX2ZpcnN0KCZpbmZvLT5yb290KTsKKworCXdoaWxlICgxKSB7CisJCS8qCisJCSAqIEZpbGwgdGhlIHJidHJlZSBpZiB3ZSBoYXZlIG5vIG1vcmUgZW50cmllcywKKwkJICogb3IgdGhlIGlub2RlIGhhcyBjaGFuZ2VkIHNpbmNlIHdlIGxhc3QgcmVhZCBpbiB0aGUKKwkJICogY2FjaGVkIGVudHJpZXMuIAorCQkgKi8KKwkJaWYgKCghaW5mby0+Y3Vycl9ub2RlKSB8fAorCQkgICAgKGZpbHAtPmZfdmVyc2lvbiAhPSBpbm9kZS0+aV92ZXJzaW9uKSkgeworCQkJaW5mby0+Y3Vycl9ub2RlID0gTlVMTDsKKwkJCWZyZWVfcmJfdHJlZV9mbmFtZSgmaW5mby0+cm9vdCk7CisJCQlmaWxwLT5mX3ZlcnNpb24gPSBpbm9kZS0+aV92ZXJzaW9uOworCQkJcmV0ID0gZXh0M19odHJlZV9maWxsX3RyZWUoZmlscCwgaW5mby0+Y3Vycl9oYXNoLAorCQkJCQkJICAgaW5mby0+Y3Vycl9taW5vcl9oYXNoLAorCQkJCQkJICAgJmluZm8tPm5leHRfaGFzaCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJZmlscC0+Zl9wb3MgPSBFWFQzX0hUUkVFX0VPRjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWluZm8tPmN1cnJfbm9kZSA9IHJiX2ZpcnN0KCZpbmZvLT5yb290KTsKKwkJfQorCisJCWZuYW1lID0gcmJfZW50cnkoaW5mby0+Y3Vycl9ub2RlLCBzdHJ1Y3QgZm5hbWUsIHJiX2hhc2gpOworCQlpbmZvLT5jdXJyX2hhc2ggPSBmbmFtZS0+aGFzaDsKKwkJaW5mby0+Y3Vycl9taW5vcl9oYXNoID0gZm5hbWUtPm1pbm9yX2hhc2g7CisJCWlmIChjYWxsX2ZpbGxkaXIoZmlscCwgZGlyZW50LCBmaWxsZGlyLCBmbmFtZSkpCisJCQlicmVhazsKKworCQlpbmZvLT5jdXJyX25vZGUgPSByYl9uZXh0KGluZm8tPmN1cnJfbm9kZSk7CisJCWlmICghaW5mby0+Y3Vycl9ub2RlKSB7CisJCQlpZiAoaW5mby0+bmV4dF9oYXNoID09IH4wKSB7CisJCQkJZmlscC0+Zl9wb3MgPSBFWFQzX0hUUkVFX0VPRjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWluZm8tPmN1cnJfaGFzaCA9IGluZm8tPm5leHRfaGFzaDsKKwkJCWluZm8tPmN1cnJfbWlub3JfaGFzaCA9IDA7CisJCX0KKwl9CitmaW5pc2hlZDoKKwlpbmZvLT5sYXN0X3BvcyA9IGZpbHAtPmZfcG9zOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4dDNfcmVsZWFzZV9kaXIgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisgICAgICAgaWYgKGZpbHAtPnByaXZhdGVfZGF0YSkKKwkJZXh0M19odHJlZV9mcmVlX2Rpcl9pbmZvKGZpbHAtPnByaXZhdGVfZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9leHQzL2ZpbGUuYyBiL2ZzL2V4dDMvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZDhjZjAyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0My9maWxlLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiAgbGludXgvZnMvZXh0My9maWxlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvbWluaXgvZmlsZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgZXh0MyBmcyByZWd1bGFyIGZpbGUgaGFuZGxpbmcgcHJpbWl0aXZlcworICoKKyAqICA2NC1iaXQgZmlsZSBzdXBwb3J0IG9uIDY0LWJpdCBwbGF0Zm9ybXMgYnkgSmFrdWIgSmVsaW5laworICoJKGpqQHN1bnNpdGUubXMubWZmLmN1bmkuY3opCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2piZC5oPgorI2luY2x1ZGUgInhhdHRyLmgiCisjaW5jbHVkZSAiYWNsLmgiCisKKy8qCisgKiBDYWxsZWQgd2hlbiBhbiBpbm9kZSBpcyByZWxlYXNlZC4gTm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50CisgKiBmcm9tIGV4dDNfZmlsZV9vcGVuOiBvcGVuIGdldHMgY2FsbGVkIGF0IGV2ZXJ5IG9wZW4sIGJ1dCByZWxlYXNlCisgKiBnZXRzIGNhbGxlZCBvbmx5IHdoZW4gL2FsbC8gdGhlIGZpbGVzIGFyZSBjbG9zZWQuCisgKi8KK3N0YXRpYyBpbnQgZXh0M19yZWxlYXNlX2ZpbGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJLyogaWYgd2UgYXJlIHRoZSBsYXN0IHdyaXRlciBvbiB0aGUgaW5vZGUsIGRyb3AgdGhlIGJsb2NrIHJlc2VydmF0aW9uICovCisJaWYgKChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKKwkJCShhdG9taWNfcmVhZCgmaW5vZGUtPmlfd3JpdGVjb3VudCkgPT0gMSkpCisJCWV4dDNfZGlzY2FyZF9yZXNlcnZhdGlvbihpbm9kZSk7CisJaWYgKGlzX2R4KGlub2RlKSAmJiBmaWxwLT5wcml2YXRlX2RhdGEpCisJCWV4dDNfaHRyZWVfZnJlZV9kaXJfaW5mbyhmaWxwLT5wcml2YXRlX2RhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitleHQzX2ZpbGVfd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCBwb3MpCit7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzc2l6ZV90IHJldDsKKwlpbnQgZXJyOworCisJcmV0ID0gZ2VuZXJpY19maWxlX2Fpb193cml0ZShpb2NiLCBidWYsIGNvdW50LCBwb3MpOworCisJLyoKKwkgKiBTa2lwIGZsdXNoaW5nIGlmIHRoZXJlIHdhcyBhbiBlcnJvciwgb3IgaWYgbm90aGluZyB3YXMgd3JpdHRlbi4KKwkgKi8KKwlpZiAocmV0IDw9IDApCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIElmIHRoZSBpbm9kZSBpcyBJU19TWU5DLCBvciBpcyBPX1NZTkMgYW5kIHdlIGFyZSBkb2luZyBkYXRhCisJICogam91cm5hbGxpbmcgdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGZvcmNlIHRoZSB0cmFuc2FjdGlvbgorCSAqIHRvIGRpc2sgdG8ga2VlcCBhbGwgbWV0YWRhdGEgdXB0b2RhdGUgc3luY2hyb25vdXNseS4KKwkgKi8KKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykgeworCQkvKgorCQkgKiBJZiB3ZSBhcmUgbm9uLWRhdGEtam91cm5hbGVkLCB0aGVuIHRoZSBkaXJ0eSBkYXRhIGhhcworCQkgKiBhbHJlYWR5IGJlZW4gZmx1c2hlZCB0byBiYWNraW5nIHN0b3JlIGJ5IGdlbmVyaWNfb3N5bmNfaW5vZGUsCisJCSAqIGFuZCB0aGUgaW5vZGUgaGFzIGJlZW4gZmx1c2hlZCB0b28gaWYgdGhlcmUgaGF2ZSBiZWVuIGFueQorCQkgKiBtb2RpZmljYXRpb25zIG90aGVyIHRoYW4gbWVyZSB0aW1lc3RhbXAgdXBkYXRlcy4KKwkJICoKKwkJICogT3BlbiBxdWVzdGlvbiAtLS0gZG8gd2UgY2FyZSBhYm91dCBmbHVzaGluZyB0aW1lc3RhbXBzIHRvbworCQkgKiBpZiB0aGUgaW5vZGUgaXMgSVNfU1lOQz8KKwkJICovCisJCWlmICghZXh0M19zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkKKwkJCXJldHVybiByZXQ7CisKKwkJZ290byBmb3JjZV9jb21taXQ7CisJfQorCisJLyoKKwkgKiBTbyB3ZSBrbm93IHRoYXQgdGhlcmUgaGFzIGJlZW4gbm8gZm9yY2VkIGRhdGEgZmx1c2guICBJZiB0aGUgaW5vZGUKKwkgKiBpcyBtYXJrZWQgSVNfU1lOQywgd2UgbmVlZCB0byBmb3JjZSBvbmUgb3Vyc2VsdmVzLgorCSAqLworCWlmICghSVNfU1lOQyhpbm9kZSkpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIE9wZW4gcXVlc3Rpb24gIzIgLS0tIHNob3VsZCB3ZSBmb3JjZSBkYXRhIHRvIGRpc2sgaGVyZSB0b28/ICBJZiB3ZQorCSAqIGRvbid0LCB0aGUgb25seSBpbXBhY3QgaXMgdGhhdCBkYXRhPXdyaXRlYmFjayBmaWxlc3lzdGVtcyB3b24ndAorCSAqIGZsdXNoIGRhdGEgdG8gZGlzayBhdXRvbWF0aWNhbGx5IG9uIElTX1NZTkMsIG9ubHkgbWV0YWRhdGEgKGJ1dAorCSAqIGhpc3RvcmljYWxseSwgdGhhdCBpcyB3aGF0IGV4dDIgaGFzIGRvbmUuKQorCSAqLworCitmb3JjZV9jb21taXQ6CisJZXJyID0gZXh0M19mb3JjZV9jb21taXQoaW5vZGUtPmlfc2IpOworCWlmIChlcnIpIAorCQlyZXR1cm4gZXJyOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXh0M19maWxlX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKKwkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKKwkuYWlvX3JlYWQJPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCisJLmFpb193cml0ZQk9IGV4dDNfZmlsZV93cml0ZSwKKwkucmVhZHYJCT0gZ2VuZXJpY19maWxlX3JlYWR2LAorCS53cml0ZXYJCT0gZ2VuZXJpY19maWxlX3dyaXRldiwKKwkuaW9jdGwJCT0gZXh0M19pb2N0bCwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkub3BlbgkJPSBnZW5lcmljX2ZpbGVfb3BlbiwKKwkucmVsZWFzZQk9IGV4dDNfcmVsZWFzZV9maWxlLAorCS5mc3luYwkJPSBleHQzX3N5bmNfZmlsZSwKKwkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkudHJ1bmNhdGUJPSBleHQzX3RydW5jYXRlLAorCS5zZXRhdHRyCT0gZXh0M19zZXRhdHRyLAorI2lmZGVmIENPTkZJR19FWFQzX0ZTX1hBVFRSCisJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAorCS5saXN0eGF0dHIJPSBleHQzX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAorI2VuZGlmCisJLnBlcm1pc3Npb24JPSBleHQzX3Blcm1pc3Npb24sCit9OworCmRpZmYgLS1naXQgYS9mcy9leHQzL2ZzeW5jLmMgYi9mcy9leHQzL2ZzeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzODJhMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDMvZnN5bmMuYwpAQCAtMCwwICsxLDg4IEBACisvKgorICogIGxpbnV4L2ZzL2V4dDMvZnN5bmMuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTMgIFN0ZXBoZW4gVHdlZWRpZSAoc2N0QHJlZGhhdC5jb20pCisgKiAgZnJvbQorICogIENvcHlyaWdodCAoQykgMTk5MiAgUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogICAgICAgICAgICAgICAgICAgICAgTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqICBmcm9tCisgKiAgbGludXgvZnMvbWluaXgvdHJ1bmNhdGUuYyAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqIAorICogIGV4dDNmcyBmc3luYyBwcmltaXRpdmUKKyAqCisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqIAorICogIFJlbW92ZWQgdW5uZWNlc3NhcnkgY29kZSBkdXBsaWNhdGlvbiBmb3IgbGl0dGxlIGVuZGlhbiBtYWNoaW5lcworICogIGFuZCBleGNlc3NpdmUgX19pbmxpbmVfX3MuIAorICogICAgICAgIEFuZGkgS2xlZW4sIDE5OTcKKyAqCisgKiBNYWpvciBzaW1wbGljYXRpb25zIGFuZCBjbGVhbnVwIC0gd2Ugb25seSBuZWVkIHRvIGRvIHRoZSBtZXRhZGF0YSwgYmVjYXVzZQorICogd2UgY2FuIGRlcGVuZCBvbiBnZW5lcmljX2Jsb2NrX2ZkYXRhc3luYygpIHRvIHN5bmMgdGhlIGRhdGEgYmxvY2tzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2piZC5oPgorCisvKgorICogYWtwbTogQSBuZXcgZGVzaWduIGZvciBleHQzX3N5bmNfZmlsZSgpLgorICoKKyAqIFRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSBzeXNfZnN5bmMoKSwgc3lzX2ZkYXRhc3luYygpIGFuZCBzeXNfbXN5bmMoKS4KKyAqIFRoZXJlIGNhbm5vdCBiZSBhIHRyYW5zYWN0aW9uIG9wZW4gYnkgdGhpcyB0YXNrLgorICogQW5vdGhlciB0YXNrIGNvdWxkIGhhdmUgZGlydGllZCB0aGlzIGlub2RlLiAgSXRzIGRhdGEgY2FuIGJlIGluIGFueQorICogc3RhdGUgaW4gdGhlIGpvdXJuYWxsaW5nIHN5c3RlbS4KKyAqCisgKiBXaGF0IHdlIGRvIGlzIGp1c3Qga2ljayBvZmYgYSBjb21taXQgYW5kIHdhaXQgb24gaXQuICBUaGlzIHdpbGwgc25hcHNob3QgdGhlCisgKiBpbm9kZSB0byBkaXNrLgorICovCisKK2ludCBleHQzX3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IHJldCA9IDA7CisKKwlKX0FTU0VSVChleHQzX2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKSA9PSAwKTsKKworCS8qCisJICogZGF0YT13cml0ZWJhY2s6CisJICogIFRoZSBjYWxsZXIncyBmaWxlbWFwX2ZkYXRhd3JpdGUoKS93YWl0IHdpbGwgc3luYyB0aGUgZGF0YS4KKwkgKiAgc3luY19pbm9kZSgpIHdpbGwgc3luYyB0aGUgbWV0YWRhdGEKKwkgKgorCSAqIGRhdGE9b3JkZXJlZDoKKwkgKiAgVGhlIGNhbGxlcidzIGZpbGVtYXBfZmRhdGF3cml0ZSgpIHdpbGwgd3JpdGUgdGhlIGRhdGEgYW5kCisJICogIHN5bmNfaW5vZGUoKSB3aWxsIHdyaXRlIHRoZSBpbm9kZSBpZiBpdCBpcyBkaXJ0eS4gIFRoZW4gdGhlIGNhbGxlcidzCisJICogIGZpbGVtYXBfZmRhdGF3YWl0KCkgd2lsbCB3YWl0IG9uIHRoZSBwYWdlcy4KKwkgKgorCSAqIGRhdGE9am91cm5hbDoKKwkgKiAgZmlsZW1hcF9mZGF0YXdyaXRlIHdvbid0IGRvIGFueXRoaW5nICh0aGUgYnVmZmVycyBhcmUgY2xlYW4pLgorCSAqICBleHQzX2ZvcmNlX2NvbW1pdCB3aWxsIHdyaXRlIHRoZSBmaWxlIGRhdGEgaW50byB0aGUgam91cm5hbCBhbmQKKwkgKiAgd2lsbCB3YWl0IG9uIHRoYXQuCisJICogIGZpbGVtYXBfZmRhdGF3YWl0KCkgd2lsbCBlbmNvdW50ZXIgYSB0b24gb2YgbmV3bHktZGlydGllZCBwYWdlcworCSAqICAodGhleSB3ZXJlIGRpcnRpZWQgYnkgY29tbWl0KS4gIEJ1dCB0aGF0J3MgT0sgLSB0aGUgYmxvY2tzIGFyZQorCSAqICBzYWZlIGluLWpvdXJuYWwsIHdoaWNoIGlzIGFsbCBmc3luYygpIG5lZWRzIHRvIGVuc3VyZS4KKwkgKi8KKwlpZiAoZXh0M19zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkgeworCQlyZXQgPSBleHQzX2ZvcmNlX2NvbW1pdChpbm9kZS0+aV9zYik7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogVGhlIFZGUyBoYXMgd3JpdHRlbiB0aGUgZmlsZSBkYXRhLiAgSWYgdGhlIGlub2RlIGlzIHVuYWx0ZXJlZAorCSAqIHRoZW4gd2UgbmVlZCBub3Qgc3RhcnQgYSBjb21taXQuCisJICovCisJaWYgKGlub2RlLT5pX3N0YXRlICYgKElfRElSVFlfU1lOQ3xJX0RJUlRZX0RBVEFTWU5DKSkgeworCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgd2JjID0geworCQkJLnN5bmNfbW9kZSA9IFdCX1NZTkNfQUxMLAorCQkJLm5yX3RvX3dyaXRlID0gMCwgLyogc3lzX2ZzeW5jIGRpZCB0aGlzICovCisJCX07CisJCXJldCA9IHN5bmNfaW5vZGUoaW5vZGUsICZ3YmMpOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvZXh0My9oYXNoLmMgYi9mcy9leHQzL2hhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTJkMTIzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0My9oYXNoLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiAgbGludXgvZnMvZXh0My9oYXNoLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgVGhlb2RvcmUgVHMnbworICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMIHYyLgorICogCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXh0M19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0b2hhc2guaD4KKworI2RlZmluZSBERUxUQSAweDlFMzc3OUI5CisKK3N0YXRpYyB2b2lkIFRFQV90cmFuc2Zvcm0oX191MzIgYnVmWzRdLCBfX3UzMiBjb25zdCBpbltdKQoreworCV9fdTMyCXN1bSA9IDA7CisJX191MzIJYjAgPSBidWZbMF0sIGIxID0gYnVmWzFdOworCV9fdTMyCWEgPSBpblswXSwgYiA9IGluWzFdLCBjID0gaW5bMl0sIGQgPSBpblszXTsKKwlpbnQJbiA9IDE2OworCisJZG8geworCQlzdW0gKz0gREVMVEE7CisJCWIwICs9ICgoYjEgPDwgNCkrYSkgXiAoYjErc3VtKSBeICgoYjEgPj4gNSkrYik7CisJCWIxICs9ICgoYjAgPDwgNCkrYykgXiAoYjArc3VtKSBeICgoYjAgPj4gNSkrZCk7CisJfSB3aGlsZSgtLW4pOworCisJYnVmWzBdICs9IGIwOworCWJ1ZlsxXSArPSBiMTsKK30KKworCisvKiBUaGUgb2xkIGxlZ2FjeSBoYXNoICovCitzdGF0aWMgX191MzIgZHhfaGFja19oYXNoIChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQoreworCV9fdTMyIGhhc2gwID0gMHgxMmEzZmUyZCwgaGFzaDEgPSAweDM3YWJlOGY5OworCXdoaWxlIChsZW4tLSkgeworCQlfX3UzMiBoYXNoID0gaGFzaDEgKyAoaGFzaDAgXiAoKm5hbWUrKyAqIDcxNTIzNzMpKTsKKworCQlpZiAoaGFzaCAmIDB4ODAwMDAwMDApIGhhc2ggLT0gMHg3ZmZmZmZmZjsKKwkJaGFzaDEgPSBoYXNoMDsKKwkJaGFzaDAgPSBoYXNoOworCX0KKwlyZXR1cm4gKGhhc2gwIDw8IDEpOworfQorCitzdGF0aWMgdm9pZCBzdHIyaGFzaGJ1Zihjb25zdCBjaGFyICptc2csIGludCBsZW4sIF9fdTMyICpidWYsIGludCBudW0pCit7CisJX191MzIJcGFkLCB2YWw7CisJaW50CWk7CisKKwlwYWQgPSAoX191MzIpbGVuIHwgKChfX3UzMilsZW4gPDwgOCk7CisJcGFkIHw9IHBhZCA8PCAxNjsKKworCXZhbCA9IHBhZDsKKwlpZiAobGVuID4gbnVtKjQpCisJCWxlbiA9IG51bSAqIDQ7CisJZm9yIChpPTA7IGkgPCBsZW47IGkrKykgeworCQlpZiAoKGkgJSA0KSA9PSAwKQorCQkJdmFsID0gcGFkOworCQl2YWwgPSBtc2dbaV0gKyAodmFsIDw8IDgpOworCQlpZiAoKGkgJSA0KSA9PSAzKSB7CisJCQkqYnVmKysgPSB2YWw7CisJCQl2YWwgPSBwYWQ7CisJCQludW0tLTsKKwkJfQorCX0KKwlpZiAoLS1udW0gPj0gMCkKKwkJKmJ1ZisrID0gdmFsOworCXdoaWxlICgtLW51bSA+PSAwKQorCQkqYnVmKysgPSBwYWQ7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBoYXNoIG9mIGEgZmlsZW5hbWUuICBJZiBsZW4gaXMgMCBhbmQgbmFtZSBpcyBOVUxMLCB0aGVuCisgKiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHRlc3Qgd2hldGhlciBvciBub3QgYSBoYXNoIHZlcnNpb24gaXMKKyAqIHN1cHBvcnRlZC4KKyAqIAorICogVGhlIHNlZWQgaXMgYW4gNCBsb25nd29yZCAoMzIgYml0cykgInNlY3JldCIgd2hpY2ggY2FuIGJlIHVzZWQgdG8KKyAqIHVuaXF1aWZ5IGEgaGFzaC4gIElmIHRoZSBzZWVkIGlzIGFsbCB6ZXJvJ3MsIHRoZW4gc29tZSBkZWZhdWx0IHNlZWQKKyAqIG1heSBiZSB1c2VkLgorICogCisgKiBBIHBhcnRpY3VsYXIgaGFzaCB2ZXJzaW9uIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgc2VlZCBpcworICogcmVwcmVzZW50ZWQsIGFuZCB3aGV0aGVyIG9yIG5vdCB0aGUgcmV0dXJuZWQgaGFzaCBpcyAzMiBiaXRzIG9yIDY0CisgKiBiaXRzLiAgMzIgYml0IGhhc2hlcyB3aWxsIHJldHVybiAwIGZvciB0aGUgbWlub3IgaGFzaC4KKyAqLworaW50IGV4dDNmc19kaXJoYXNoKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sIHN0cnVjdCBkeF9oYXNoX2luZm8gKmhpbmZvKQoreworCV9fdTMyCWhhc2g7CisJX191MzIJbWlub3JfaGFzaCA9IDA7CisJY29uc3QgY2hhcgkqcDsKKwlpbnQJCWk7CisJX191MzIgCQlpbls4XSwgYnVmWzRdOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBzZWVkIGZvciB0aGUgaGFzaCBjaGVja3N1bSBmdW5jdGlvbnMgKi8KKwlidWZbMF0gPSAweDY3NDUyMzAxOworCWJ1ZlsxXSA9IDB4ZWZjZGFiODk7CisJYnVmWzJdID0gMHg5OGJhZGNmZTsKKwlidWZbM10gPSAweDEwMzI1NDc2OworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBzZWVkIGlzIGFsbCB6ZXJvJ3MgKi8KKwlpZiAoaGluZm8tPnNlZWQpIHsKKwkJZm9yIChpPTA7IGkgPCA0OyBpKyspIHsKKwkJCWlmIChoaW5mby0+c2VlZFtpXSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA8IDQpCisJCQltZW1jcHkoYnVmLCBoaW5mby0+c2VlZCwgc2l6ZW9mKGJ1ZikpOworCX0KKworCXN3aXRjaCAoaGluZm8tPmhhc2hfdmVyc2lvbikgeworCWNhc2UgRFhfSEFTSF9MRUdBQ1k6CisJCWhhc2ggPSBkeF9oYWNrX2hhc2gobmFtZSwgbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBEWF9IQVNIX0hBTEZfTUQ0OgorCQlwID0gbmFtZTsKKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCXN0cjJoYXNoYnVmKHAsIGxlbiwgaW4sIDgpOworCQkJaGFsZl9tZDRfdHJhbnNmb3JtKGJ1ZiwgaW4pOworCQkJbGVuIC09IDMyOworCQkJcCArPSAzMjsKKwkJfQorCQltaW5vcl9oYXNoID0gYnVmWzJdOworCQloYXNoID0gYnVmWzFdOworCQlicmVhazsKKwljYXNlIERYX0hBU0hfVEVBOgorCQlwID0gbmFtZTsKKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCXN0cjJoYXNoYnVmKHAsIGxlbiwgaW4sIDQpOworCQkJVEVBX3RyYW5zZm9ybShidWYsIGluKTsKKwkJCWxlbiAtPSAxNjsKKwkJCXAgKz0gMTY7CisJCX0KKwkJaGFzaCA9IGJ1ZlswXTsKKwkJbWlub3JfaGFzaCA9IGJ1ZlsxXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaGluZm8tPmhhc2ggPSAwOworCQlyZXR1cm4gLTE7CisJfQorCWhhc2ggPSBoYXNoICYgfjE7CisJaWYgKGhhc2ggPT0gKEVYVDNfSFRSRUVfRU9GIDw8IDEpKQorCQloYXNoID0gKEVYVDNfSFRSRUVfRU9GLTEpIDw8IDE7CisJaGluZm8tPmhhc2ggPSBoYXNoOworCWhpbmZvLT5taW5vcl9oYXNoID0gbWlub3JfaGFzaDsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2V4dDMvaWFsbG9jLmMgYi9mcy9leHQzL2lhbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNmYzZWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQzL2lhbGxvYy5jCkBAIC0wLDAgKzEsNzk0IEBACisvKgorICogIGxpbnV4L2ZzL2V4dDMvaWFsbG9jLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIEJTRCB1ZnMtaW5zcGlyZWQgaW5vZGUgYW5kIGRpcmVjdG9yeSBhbGxvY2F0aW9uIGJ5CisgKiAgU3RlcGhlbiBUd2VlZGllIChzY3RAcmVkaGF0LmNvbSksIDE5OTMKKyAqICBCaWctZW5kaWFuIHRvIGxpdHRsZS1lbmRpYW4gYnl0ZS1zd2FwcGluZy9iaXRtYXBzIGJ5CisgKiAgICAgICAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KSwgMTk5NQorICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXh0M19qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSAieGF0dHIuaCIKKyNpbmNsdWRlICJhY2wuaCIKKworLyoKKyAqIGlhbGxvYy5jIGNvbnRhaW5zIHRoZSBpbm9kZXMgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIHJvdXRpbmVzCisgKi8KKworLyoKKyAqIFRoZSBmcmVlIGlub2RlcyBhcmUgbWFuYWdlZCBieSBiaXRtYXBzLiAgQSBmaWxlIHN5c3RlbSBjb250YWlucyBzZXZlcmFsCisgKiBibG9ja3MgZ3JvdXBzLiAgRWFjaCBncm91cCBjb250YWlucyAxIGJpdG1hcCBibG9jayBmb3IgYmxvY2tzLCAxIGJpdG1hcAorICogYmxvY2sgZm9yIGlub2RlcywgTiBibG9ja3MgZm9yIHRoZSBpbm9kZSB0YWJsZSBhbmQgZGF0YSBibG9ja3MuCisgKgorICogVGhlIGZpbGUgc3lzdGVtIGNvbnRhaW5zIGdyb3VwIGRlc2NyaXB0b3JzIHdoaWNoIGFyZSBsb2NhdGVkIGFmdGVyIHRoZQorICogc3VwZXIgYmxvY2suICBFYWNoIGRlc2NyaXB0b3IgY29udGFpbnMgdGhlIG51bWJlciBvZiB0aGUgYml0bWFwIGJsb2NrIGFuZAorICogdGhlIGZyZWUgYmxvY2tzIGNvdW50IGluIHRoZSBibG9jay4KKyAqLworCisKKy8qCisgKiBSZWFkIHRoZSBpbm9kZSBhbGxvY2F0aW9uIGJpdG1hcCBmb3IgYSBnaXZlbiBibG9ja19ncm91cCwgcmVhZGluZworICogaW50byB0aGUgc3BlY2lmaWVkIHNsb3QgaW4gdGhlIHN1cGVyYmxvY2sncyBiaXRtYXAgY2FjaGUuCisgKgorICogUmV0dXJuIGJ1ZmZlcl9oZWFkIG9mIGJpdG1hcCBvbiBzdWNjZXNzIG9yIE5VTEwuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorcmVhZF9pbm9kZV9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHVuc2lnbmVkIGxvbmcgYmxvY2tfZ3JvdXApCit7CisJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKworCWRlc2MgPSBleHQzX2dldF9ncm91cF9kZXNjKHNiLCBibG9ja19ncm91cCwgTlVMTCk7CisJaWYgKCFkZXNjKQorCQlnb3RvIGVycm9yX291dDsKKworCWJoID0gc2JfYnJlYWQoc2IsIGxlMzJfdG9fY3B1KGRlc2MtPmJnX2lub2RlX2JpdG1hcCkpOworCWlmICghYmgpCisJCWV4dDNfZXJyb3Ioc2IsICJyZWFkX2lub2RlX2JpdG1hcCIsCisJCQkgICAgIkNhbm5vdCByZWFkIGlub2RlIGJpdG1hcCAtICIKKwkJCSAgICAiYmxvY2tfZ3JvdXAgPSAlbHUsIGlub2RlX2JpdG1hcCA9ICV1IiwKKwkJCSAgICBibG9ja19ncm91cCwgbGUzMl90b19jcHUoZGVzYy0+YmdfaW5vZGVfYml0bWFwKSk7CitlcnJvcl9vdXQ6CisJcmV0dXJuIGJoOworfQorCisvKgorICogTk9URSEgV2hlbiB3ZSBnZXQgdGhlIGlub2RlLCB3ZSdyZSB0aGUgb25seSBwZW9wbGUKKyAqIHRoYXQgaGF2ZSBhY2Nlc3MgdG8gaXQsIGFuZCBhcyBzdWNoIHRoZXJlIGFyZSBubworICogcmFjZSBjb25kaXRpb25zIHdlIGhhdmUgdG8gd29ycnkgYWJvdXQuIFRoZSBpbm9kZQorICogaXMgbm90IG9uIHRoZSBoYXNoLWxpc3RzLCBhbmQgaXQgY2Fubm90IGJlIHJlYWNoZWQKKyAqIHRocm91Z2ggdGhlIGZpbGVzeXN0ZW0gYmVjYXVzZSB0aGUgZGlyZWN0b3J5IGVudHJ5CisgKiBoYXMgYmVlbiBkZWxldGVkIGVhcmxpZXIuCisgKgorICogSE9XRVZFUjogd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB3ZSBnZXQgbm8gYWxpYXNlcywKKyAqIHdoaWNoIG1lYW5zIHRoYXQgd2UgaGF2ZSB0byBjYWxsICJjbGVhcl9pbm9kZSgpIgorICogX2JlZm9yZV8gd2UgbWFyayB0aGUgaW5vZGUgbm90IGluIHVzZSBpbiB0aGUgaW5vZGUKKyAqIGJpdG1hcHMuIE90aGVyd2lzZSBhIG5ld2x5IGNyZWF0ZWQgZmlsZSBtaWdodCB1c2UKKyAqIHRoZSBzYW1lIGlub2RlIG51bWJlciAobm90IGFjdHVhbGx5IHRoZSBzYW1lIHBvaW50ZXIKKyAqIHRob3VnaCksIGFuZCB0aGVuIHdlJ2QgaGF2ZSB0d28gaW5vZGVzIHNoYXJpbmcgdGhlCisgKiBzYW1lIGlub2RlIG51bWJlciBhbmQgc3BhY2Ugb24gdGhlIGhhcmRkaXNrLgorICovCit2b2lkIGV4dDNfZnJlZV9pbm9kZSAoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2IgPSBpbm9kZS0+aV9zYjsKKwlpbnQgaXNfZGlyZWN0b3J5OworCXVuc2lnbmVkIGxvbmcgaW5vOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMjsKKwl1bnNpZ25lZCBsb25nIGJsb2NrX2dyb3VwOworCXVuc2lnbmVkIGxvbmcgYml0OworCXN0cnVjdCBleHQzX2dyb3VwX2Rlc2MgKiBnZHA7CisJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlczsKKwlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmk7CisJaW50IGZhdGFsID0gMCwgZXJyOworCisJaWYgKGF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkgPiAxKSB7CisJCXByaW50ayAoImV4dDNfZnJlZV9pbm9kZTogaW5vZGUgaGFzIGNvdW50PSVkXG4iLAorCQkJCQlhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoaW5vZGUtPmlfbmxpbmspIHsKKwkJcHJpbnRrICgiZXh0M19mcmVlX2lub2RlOiBpbm9kZSBoYXMgbmxpbms9JWRcbiIsCisJCQlpbm9kZS0+aV9ubGluayk7CisJCXJldHVybjsKKwl9CisJaWYgKCFzYikgeworCQlwcmludGsoImV4dDNfZnJlZV9pbm9kZTogaW5vZGUgb24gbm9uZXhpc3RlbnQgZGV2aWNlXG4iKTsKKwkJcmV0dXJuOworCX0KKwlzYmkgPSBFWFQzX1NCKHNiKTsKKworCWlubyA9IGlub2RlLT5pX2lubzsKKwlleHQzX2RlYnVnICgiZnJlZWluZyBpbm9kZSAlbHVcbiIsIGlubyk7CisKKwkvKgorCSAqIE5vdGU6IHdlIG11c3QgZnJlZSBhbnkgcXVvdGEgYmVmb3JlIGxvY2tpbmcgdGhlIHN1cGVyYmxvY2ssCisJICogYXMgd3JpdGluZyB0aGUgcXVvdGEgdG8gZGlzayBtYXkgbmVlZCB0aGUgbG9jayBhcyB3ZWxsLgorCSAqLworCURRVU9UX0lOSVQoaW5vZGUpOworCWV4dDNfeGF0dHJfZGVsZXRlX2lub2RlKGhhbmRsZSwgaW5vZGUpOworCURRVU9UX0ZSRUVfSU5PREUoaW5vZGUpOworCURRVU9UX0RST1AoaW5vZGUpOworCisJaXNfZGlyZWN0b3J5ID0gU19JU0RJUihpbm9kZS0+aV9tb2RlKTsKKworCS8qIERvIHRoaXMgQkVGT1JFIG1hcmtpbmcgdGhlIGlub2RlIG5vdCBpbiB1c2Ugb3IgcmV0dXJuaW5nIGFuIGVycm9yICovCisJY2xlYXJfaW5vZGUgKGlub2RlKTsKKworCWVzID0gRVhUM19TQihzYiktPnNfZXM7CisJaWYgKGlubyA8IEVYVDNfRklSU1RfSU5PKHNiKSB8fCBpbm8gPiBsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfY291bnQpKSB7CisJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19mcmVlX2lub2RlIiwKKwkJCSAgICAicmVzZXJ2ZWQgb3Igbm9uZXhpc3RlbnQgaW5vZGUgJWx1IiwgaW5vKTsKKwkJZ290byBlcnJvcl9yZXR1cm47CisJfQorCWJsb2NrX2dyb3VwID0gKGlubyAtIDEpIC8gRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKTsKKwliaXQgPSAoaW5vIC0gMSkgJSBFWFQzX0lOT0RFU19QRVJfR1JPVVAoc2IpOworCWJpdG1hcF9iaCA9IHJlYWRfaW5vZGVfYml0bWFwKHNiLCBibG9ja19ncm91cCk7CisJaWYgKCFiaXRtYXBfYmgpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwlmYXRhbCA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYml0bWFwX2JoKTsKKwlpZiAoZmF0YWwpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJLyogT2ssIG5vdyB3ZSBjYW4gYWN0dWFsbHkgdXBkYXRlIHRoZSBpbm9kZSBiaXRtYXBzLi4gKi8KKwlpZiAoIWV4dDNfY2xlYXJfYml0X2F0b21pYyhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSwKKwkJCQkJYml0LCBiaXRtYXBfYmgtPmJfZGF0YSkpCisJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19mcmVlX2lub2RlIiwKKwkJCSAgICAgICJiaXQgYWxyZWFkeSBjbGVhcmVkIGZvciBpbm9kZSAlbHUiLCBpbm8pOworCWVsc2UgeworCQlnZHAgPSBleHQzX2dldF9ncm91cF9kZXNjIChzYiwgYmxvY2tfZ3JvdXAsICZiaDIpOworCisJCUJVRkZFUl9UUkFDRShiaDIsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCWZhdGFsID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaDIpOworCQlpZiAoZmF0YWwpIGdvdG8gZXJyb3JfcmV0dXJuOworCisJCWlmIChnZHApIHsKKwkJCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSk7CisJCQlnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50ID0gY3B1X3RvX2xlMTYoCisJCQkJbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgKyAxKTsKKwkJCWlmIChpc19kaXJlY3RvcnkpCisJCQkJZ2RwLT5iZ191c2VkX2RpcnNfY291bnQgPSBjcHVfdG9fbGUxNigKKwkJCQkgIGxlMTZfdG9fY3B1KGdkcC0+YmdfdXNlZF9kaXJzX2NvdW50KSAtIDEpOworCQkJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCkpOworCQkJcGVyY3B1X2NvdW50ZXJfaW5jKCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKKwkJCWlmIChpc19kaXJlY3RvcnkpCisJCQkJcGVyY3B1X2NvdW50ZXJfZGVjKCZzYmktPnNfZGlyc19jb3VudGVyKTsKKworCQl9CisJCUJVRkZFUl9UUkFDRShiaDIsICJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCQllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaDIpOworCQlpZiAoIWZhdGFsKSBmYXRhbCA9IGVycjsKKwl9CisJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImNhbGwgZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYml0bWFwX2JoKTsKKwlpZiAoIWZhdGFsKQorCQlmYXRhbCA9IGVycjsKKwlzYi0+c19kaXJ0ID0gMTsKK2Vycm9yX3JldHVybjoKKwlicmVsc2UoYml0bWFwX2JoKTsKKwlleHQzX3N0ZF9lcnJvcihzYiwgZmF0YWwpOworfQorCisvKgorICogVGhlcmUgYXJlIHR3byBwb2xpY2llcyBmb3IgYWxsb2NhdGluZyBhbiBpbm9kZS4gIElmIHRoZSBuZXcgaW5vZGUgaXMKKyAqIGEgZGlyZWN0b3J5LCB0aGVuIGEgZm9yd2FyZCBzZWFyY2ggaXMgbWFkZSBmb3IgYSBibG9jayBncm91cCB3aXRoIGJvdGgKKyAqIGZyZWUgc3BhY2UgYW5kIGEgbG93IGRpcmVjdG9yeS10by1pbm9kZSByYXRpbzsgaWYgdGhhdCBmYWlscywgdGhlbiBvZgorICogdGhlIGdyb3VwcyB3aXRoIGFib3ZlLWF2ZXJhZ2UgZnJlZSBzcGFjZSwgdGhhdCBncm91cCB3aXRoIHRoZSBmZXdlc3QKKyAqIGRpcmVjdG9yaWVzIGFscmVhZHkgaXMgY2hvc2VuLgorICoKKyAqIEZvciBvdGhlciBpbm9kZXMsIHNlYXJjaCBmb3J3YXJkIGZyb20gdGhlIHBhcmVudCBkaXJlY3RvcnlcJ3MgYmxvY2sKKyAqIGdyb3VwIHRvIGZpbmQgYSBmcmVlIGlub2RlLgorICovCitzdGF0aWMgaW50IGZpbmRfZ3JvdXBfZGlyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBpbm9kZSAqcGFyZW50KQoreworCWludCBuZ3JvdXBzID0gRVhUM19TQihzYiktPnNfZ3JvdXBzX2NvdW50OworCWludCBmcmVlaSwgYXZlZnJlZWk7CisJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqZGVzYywgKmJlc3RfZGVzYyA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgZ3JvdXAsIGJlc3RfZ3JvdXAgPSAtMTsKKworCWZyZWVpID0gcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZSgmRVhUM19TQihzYiktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKKwlhdmVmcmVlaSA9IGZyZWVpIC8gbmdyb3VwczsKKworCWZvciAoZ3JvdXAgPSAwOyBncm91cCA8IG5ncm91cHM7IGdyb3VwKyspIHsKKwkJZGVzYyA9IGV4dDNfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBncm91cCwgJmJoKTsKKwkJaWYgKCFkZXNjIHx8ICFkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkKKwkJCWNvbnRpbnVlOworCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpIDwgYXZlZnJlZWkpCisJCQljb250aW51ZTsKKwkJaWYgKCFiZXN0X2Rlc2MgfHwgCisJCSAgICAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpID4KKwkJICAgICBsZTE2X3RvX2NwdShiZXN0X2Rlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSkpIHsKKwkJCWJlc3RfZ3JvdXAgPSBncm91cDsKKwkJCWJlc3RfZGVzYyA9IGRlc2M7CisJCX0KKwl9CisJcmV0dXJuIGJlc3RfZ3JvdXA7Cit9CisKKy8qIAorICogT3Jsb3YncyBhbGxvY2F0b3IgZm9yIGRpcmVjdG9yaWVzLiAKKyAqIAorICogV2UgYWx3YXlzIHRyeSB0byBzcHJlYWQgZmlyc3QtbGV2ZWwgZGlyZWN0b3JpZXMuCisgKgorICogSWYgdGhlcmUgYXJlIGJsb2NrZ3JvdXBzIHdpdGggYm90aCBmcmVlIGlub2RlcyBhbmQgZnJlZSBibG9ja3MgY291bnRzIAorICogbm90IHdvcnNlIHRoYW4gYXZlcmFnZSB3ZSByZXR1cm4gb25lIHdpdGggc21hbGxlc3QgZGlyZWN0b3J5IGNvdW50LiAKKyAqIE90aGVyd2lzZSB3ZSBzaW1wbHkgcmV0dXJuIGEgcmFuZG9tIGdyb3VwLiAKKyAqIAorICogRm9yIHRoZSByZXN0IHJ1bGVzIGxvb2sgc286IAorICogCisgKiBJdCdzIE9LIHRvIHB1dCBkaXJlY3RvcnkgaW50byBhIGdyb3VwIHVubGVzcyAKKyAqIGl0IGhhcyB0b28gbWFueSBkaXJlY3RvcmllcyBhbHJlYWR5IChtYXhfZGlycykgb3IgCisgKiBpdCBoYXMgdG9vIGZldyBmcmVlIGlub2RlcyBsZWZ0IChtaW5faW5vZGVzKSBvciAKKyAqIGl0IGhhcyB0b28gZmV3IGZyZWUgYmxvY2tzIGxlZnQgKG1pbl9ibG9ja3MpIG9yIAorICogaXQncyBhbHJlYWR5IHJ1bm5pbmcgdG9vIGxhcmdlIGRlYnQgKG1heF9kZWJ0KS4gCisgKiBQYXJlbnQncyBncm91cCBpcyBwcmVmZXJlZCwgaWYgaXQgZG9lc24ndCBzYXRpc2Z5IHRoZXNlIAorICogY29uZGl0aW9ucyB3ZSBzZWFyY2ggY3ljbGljYWxseSB0aHJvdWdoIHRoZSByZXN0LiBJZiBub25lIAorICogb2YgdGhlIGdyb3VwcyBsb29rIGdvb2Qgd2UganVzdCBsb29rIGZvciBhIGdyb3VwIHdpdGggbW9yZSAKKyAqIGZyZWUgaW5vZGVzIHRoYW4gYXZlcmFnZSAoc3RhcnRpbmcgYXQgcGFyZW50J3MgZ3JvdXApLiAKKyAqIAorICogRGVidCBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgd2UgYWxsb2NhdGUgYSBkaXJlY3RvcnkgYW5kIGRlY3JlbWVudGVkIAorICogd2hlbiB3ZSBhbGxvY2F0ZSBhbiBpbm9kZSwgd2l0aGluIDAtLTI1NS4gCisgKi8gCisKKyNkZWZpbmUgSU5PREVfQ09TVCA2NAorI2RlZmluZSBCTE9DS19DT1NUIDI1NgorCitzdGF0aWMgaW50IGZpbmRfZ3JvdXBfb3Jsb3Yoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlICpwYXJlbnQpCit7CisJaW50IHBhcmVudF9ncm91cCA9IEVYVDNfSShwYXJlbnQpLT5pX2Jsb2NrX2dyb3VwOworCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSA9IEVYVDNfU0Ioc2IpOworCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcyA9IHNiaS0+c19lczsKKwlpbnQgbmdyb3VwcyA9IHNiaS0+c19ncm91cHNfY291bnQ7CisJaW50IGlub2Rlc19wZXJfZ3JvdXAgPSBFWFQzX0lOT0RFU19QRVJfR1JPVVAoc2IpOworCWludCBmcmVlaSwgYXZlZnJlZWk7CisJaW50IGZyZWViLCBhdmVmcmVlYjsKKwlpbnQgYmxvY2tzX3Blcl9kaXIsIG5kaXJzOworCWludCBtYXhfZGVidCwgbWF4X2RpcnMsIG1pbl9ibG9ja3MsIG1pbl9pbm9kZXM7CisJaW50IGdyb3VwID0gLTEsIGk7CisJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJZnJlZWkgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKKwlhdmVmcmVlaSA9IGZyZWVpIC8gbmdyb3VwczsKKwlmcmVlYiA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOworCWF2ZWZyZWViID0gZnJlZWIgLyBuZ3JvdXBzOworCW5kaXJzID0gcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZSgmc2JpLT5zX2RpcnNfY291bnRlcik7CisKKwlpZiAoKHBhcmVudCA9PSBzYi0+c19yb290LT5kX2lub2RlKSB8fAorCSAgICAoRVhUM19JKHBhcmVudCktPmlfZmxhZ3MgJiBFWFQzX1RPUERJUl9GTCkpIHsKKwkJaW50IGJlc3RfbmRpciA9IGlub2Rlc19wZXJfZ3JvdXA7CisJCWludCBiZXN0X2dyb3VwID0gLTE7CisKKwkJZ2V0X3JhbmRvbV9ieXRlcygmZ3JvdXAsIHNpemVvZihncm91cCkpOworCQlwYXJlbnRfZ3JvdXAgPSAodW5zaWduZWQpZ3JvdXAgJSBuZ3JvdXBzOworCQlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKSB7CisJCQlncm91cCA9IChwYXJlbnRfZ3JvdXAgKyBpKSAlIG5ncm91cHM7CisJCQlkZXNjID0gZXh0M19nZXRfZ3JvdXBfZGVzYyAoc2IsIGdyb3VwLCAmYmgpOworCQkJaWYgKCFkZXNjIHx8ICFkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ191c2VkX2RpcnNfY291bnQpID49IGJlc3RfbmRpcikKKwkJCQljb250aW51ZTsKKwkJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgPCBhdmVmcmVlaSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkgPCBhdmVmcmVlYikKKwkJCQljb250aW51ZTsKKwkJCWJlc3RfZ3JvdXAgPSBncm91cDsKKwkJCWJlc3RfbmRpciA9IGxlMTZfdG9fY3B1KGRlc2MtPmJnX3VzZWRfZGlyc19jb3VudCk7CisJCX0KKwkJaWYgKGJlc3RfZ3JvdXAgPj0gMCkKKwkJCXJldHVybiBiZXN0X2dyb3VwOworCQlnb3RvIGZhbGxiYWNrOworCX0KKworCWJsb2Nrc19wZXJfZGlyID0gKGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkgLSBmcmVlYikgLyBuZGlyczsKKworCW1heF9kaXJzID0gbmRpcnMgLyBuZ3JvdXBzICsgaW5vZGVzX3Blcl9ncm91cCAvIDE2OworCW1pbl9pbm9kZXMgPSBhdmVmcmVlaSAtIGlub2Rlc19wZXJfZ3JvdXAgLyA0OworCW1pbl9ibG9ja3MgPSBhdmVmcmVlYiAtIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikgLyA0OworCisJbWF4X2RlYnQgPSBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpIC8gbWF4KGJsb2Nrc19wZXJfZGlyLCBCTE9DS19DT1NUKTsKKwlpZiAobWF4X2RlYnQgKiBJTk9ERV9DT1NUID4gaW5vZGVzX3Blcl9ncm91cCkKKwkJbWF4X2RlYnQgPSBpbm9kZXNfcGVyX2dyb3VwIC8gSU5PREVfQ09TVDsKKwlpZiAobWF4X2RlYnQgPiAyNTUpCisJCW1heF9kZWJ0ID0gMjU1OworCWlmIChtYXhfZGVidCA9PSAwKQorCQltYXhfZGVidCA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKSB7CisJCWdyb3VwID0gKHBhcmVudF9ncm91cCArIGkpICUgbmdyb3VwczsKKwkJZGVzYyA9IGV4dDNfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBncm91cCwgJmJoKTsKKwkJaWYgKCFkZXNjIHx8ICFkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkKKwkJCWNvbnRpbnVlOworCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfdXNlZF9kaXJzX2NvdW50KSA+PSBtYXhfZGlycykKKwkJCWNvbnRpbnVlOworCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpIDwgbWluX2lub2RlcykKKwkJCWNvbnRpbnVlOworCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpIDwgbWluX2Jsb2NrcykKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gZ3JvdXA7CisJfQorCitmYWxsYmFjazoKKwlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKSB7CisJCWdyb3VwID0gKHBhcmVudF9ncm91cCArIGkpICUgbmdyb3VwczsKKwkJZGVzYyA9IGV4dDNfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBncm91cCwgJmJoKTsKKwkJaWYgKCFkZXNjIHx8ICFkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkKKwkJCWNvbnRpbnVlOworCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpID49IGF2ZWZyZWVpKQorCQkJcmV0dXJuIGdyb3VwOworCX0KKworCWlmIChhdmVmcmVlaSkgeworCQkvKgorCQkgKiBUaGUgZnJlZS1pbm9kZXMgY291bnRlciBpcyBhcHByb3hpbWF0ZSwgYW5kIGZvciByZWFsbHkgc21hbGwKKwkJICogZmlsZXN5c3RlbXMgdGhlIGFib3ZlIHRlc3QgY2FuIGZhaWwgdG8gZmluZCBhbnkgYmxvY2tncm91cHMKKwkJICovCisJCWF2ZWZyZWVpID0gMDsKKwkJZ290byBmYWxsYmFjazsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9ncm91cF9vdGhlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaW5vZGUgKnBhcmVudCkKK3sKKwlpbnQgcGFyZW50X2dyb3VwID0gRVhUM19JKHBhcmVudCktPmlfYmxvY2tfZ3JvdXA7CisJaW50IG5ncm91cHMgPSBFWFQzX1NCKHNiKS0+c19ncm91cHNfY291bnQ7CisJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBncm91cCwgaTsKKworCS8qCisJICogVHJ5IHRvIHBsYWNlIHRoZSBpbm9kZSBpbiBpdHMgcGFyZW50IGRpcmVjdG9yeQorCSAqLworCWdyb3VwID0gcGFyZW50X2dyb3VwOworCWRlc2MgPSBleHQzX2dldF9ncm91cF9kZXNjIChzYiwgZ3JvdXAsICZiaCk7CisJaWYgKGRlc2MgJiYgbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpICYmCisJCQlsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkpCisJCXJldHVybiBncm91cDsKKworCS8qCisJICogV2UncmUgZ29pbmcgdG8gcGxhY2UgdGhpcyBpbm9kZSBpbiBhIGRpZmZlcmVudCBibG9ja2dyb3VwIGZyb20gaXRzCisJICogcGFyZW50LiAgV2Ugd2FudCB0byBjYXVzZSBmaWxlcyBpbiBhIGNvbW1vbiBkaXJlY3RvcnkgdG8gYWxsIGxhbmQgaW4KKwkgKiB0aGUgc2FtZSBibG9ja2dyb3VwLiAgQnV0IHdlIHdhbnQgZmlsZXMgd2hpY2ggYXJlIGluIGEgZGlmZmVyZW50CisJICogZGlyZWN0b3J5IHdoaWNoIHNoYXJlcyBhIGJsb2NrZ3JvdXAgd2l0aCBvdXIgcGFyZW50IHRvIGxhbmQgaW4gYQorCSAqIGRpZmZlcmVudCBibG9ja2dyb3VwLgorCSAqCisJICogU28gYWRkIG91ciBkaXJlY3RvcnkncyBpX2lubyBpbnRvIHRoZSBzdGFydGluZyBwb2ludCBmb3IgdGhlIGhhc2guCisJICovCisJZ3JvdXAgPSAoZ3JvdXAgKyBwYXJlbnQtPmlfaW5vKSAlIG5ncm91cHM7CisKKwkvKgorCSAqIFVzZSBhIHF1YWRyYXRpYyBoYXNoIHRvIGZpbmQgYSBncm91cCB3aXRoIGEgZnJlZSBpbm9kZSBhbmQgc29tZSBmcmVlCisJICogYmxvY2tzLgorCSAqLworCWZvciAoaSA9IDE7IGkgPCBuZ3JvdXBzOyBpIDw8PSAxKSB7CisJCWdyb3VwICs9IGk7CisJCWlmIChncm91cCA+PSBuZ3JvdXBzKQorCQkJZ3JvdXAgLT0gbmdyb3VwczsKKwkJZGVzYyA9IGV4dDNfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBncm91cCwgJmJoKTsKKwkJaWYgKGRlc2MgJiYgbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpICYmCisJCQkJbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpKQorCQkJcmV0dXJuIGdyb3VwOworCX0KKworCS8qCisJICogVGhhdCBmYWlsZWQ6IHRyeSBsaW5lYXIgc2VhcmNoIGZvciBhIGZyZWUgaW5vZGUsIGV2ZW4gaWYgdGhhdCBncm91cAorCSAqIGhhcyBubyBmcmVlIGJsb2Nrcy4KKwkgKi8KKwlncm91cCA9IHBhcmVudF9ncm91cDsKKwlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKSB7CisJCWlmICgrK2dyb3VwID49IG5ncm91cHMpCisJCQlncm91cCA9IDA7CisJCWRlc2MgPSBleHQzX2dldF9ncm91cF9kZXNjIChzYiwgZ3JvdXAsICZiaCk7CisJCWlmIChkZXNjICYmIGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSkKKwkJCXJldHVybiBncm91cDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBUaGVyZSBhcmUgdHdvIHBvbGljaWVzIGZvciBhbGxvY2F0aW5nIGFuIGlub2RlLiAgSWYgdGhlIG5ldyBpbm9kZSBpcworICogYSBkaXJlY3RvcnksIHRoZW4gYSBmb3J3YXJkIHNlYXJjaCBpcyBtYWRlIGZvciBhIGJsb2NrIGdyb3VwIHdpdGggYm90aAorICogZnJlZSBzcGFjZSBhbmQgYSBsb3cgZGlyZWN0b3J5LXRvLWlub2RlIHJhdGlvOyBpZiB0aGF0IGZhaWxzLCB0aGVuIG9mCisgKiB0aGUgZ3JvdXBzIHdpdGggYWJvdmUtYXZlcmFnZSBmcmVlIHNwYWNlLCB0aGF0IGdyb3VwIHdpdGggdGhlIGZld2VzdAorICogZGlyZWN0b3JpZXMgYWxyZWFkeSBpcyBjaG9zZW4uCisgKgorICogRm9yIG90aGVyIGlub2Rlcywgc2VhcmNoIGZvcndhcmQgZnJvbSB0aGUgcGFyZW50IGRpcmVjdG9yeSdzIGJsb2NrCisgKiBncm91cCB0byBmaW5kIGEgZnJlZSBpbm9kZS4KKyAqLworc3RydWN0IGlub2RlICpleHQzX25ld19pbm9kZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKiBkaXIsIGludCBtb2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgyOworCWludCBncm91cDsKKwl1bnNpZ25lZCBsb25nIGlubyA9IDA7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqIGdkcCA9IE5VTEw7CisJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlczsKKwlzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvICplaTsKKwlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmk7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGlub2RlICpyZXQ7CisJaW50IGk7CisKKwkvKiBDYW5ub3QgY3JlYXRlIGZpbGVzIGluIGEgZGVsZXRlZCBkaXJlY3RvcnkgKi8KKwlpZiAoIWRpciB8fCAhZGlyLT5pX25saW5rKQorCQlyZXR1cm4gRVJSX1BUUigtRVBFUk0pOworCisJc2IgPSBkaXItPmlfc2I7CisJaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWVpID0gRVhUM19JKGlub2RlKTsKKworCXNiaSA9IEVYVDNfU0Ioc2IpOworCWVzID0gc2JpLT5zX2VzOworCWlmIChTX0lTRElSKG1vZGUpKSB7CisJCWlmICh0ZXN0X29wdCAoc2IsIE9MREFMTE9DKSkKKwkJCWdyb3VwID0gZmluZF9ncm91cF9kaXIoc2IsIGRpcik7CisJCWVsc2UKKwkJCWdyb3VwID0gZmluZF9ncm91cF9vcmxvdihzYiwgZGlyKTsKKwl9IGVsc2UgCisJCWdyb3VwID0gZmluZF9ncm91cF9vdGhlcihzYiwgZGlyKTsKKworCWVyciA9IC1FTk9TUEM7CisJaWYgKGdyb3VwID09IC0xKQorCQlnb3RvIG91dDsKKworCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKKwkJZXJyID0gLUVJTzsKKworCQlnZHAgPSBleHQzX2dldF9ncm91cF9kZXNjKHNiLCBncm91cCwgJmJoMik7CisJCWlmICghZ2RwKQorCQkJZ290byBmYWlsOworCisJCWJyZWxzZShiaXRtYXBfYmgpOworCQliaXRtYXBfYmggPSByZWFkX2lub2RlX2JpdG1hcChzYiwgZ3JvdXApOworCQlpZiAoIWJpdG1hcF9iaCkKKwkJCWdvdG8gZmFpbDsKKworCQlpbm8gPSAwOworCityZXBlYXRfaW5fdGhpc19ncm91cDoKKwkJaW5vID0gZXh0M19maW5kX25leHRfemVyb19iaXQoKHVuc2lnbmVkIGxvbmcgKikKKwkJCQliaXRtYXBfYmgtPmJfZGF0YSwgRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKSwgaW5vKTsKKwkJaWYgKGlubyA8IEVYVDNfSU5PREVTX1BFUl9HUk9VUChzYikpIHsKKworCQkJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJCWVyciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYml0bWFwX2JoKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBmYWlsOworCisJCQlpZiAoIWV4dDNfc2V0X2JpdF9hdG9taWMoc2JfYmdsX2xvY2soc2JpLCBncm91cCksCisJCQkJCQlpbm8sIGJpdG1hcF9iaC0+Yl9kYXRhKSkgeworCQkJCS8qIHdlIHdvbiBpdCAqLworCQkJCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsCisJCQkJCSJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCQkJCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCisJCQkJCQkJCWJpdG1hcF9iaCk7CisJCQkJaWYgKGVycikKKwkJCQkJZ290byBmYWlsOworCQkJCWdvdG8gZ290OworCQkJfQorCQkJLyogd2UgbG9zdCBpdCAqLworCQkJam91cm5hbF9yZWxlYXNlX2J1ZmZlcihoYW5kbGUsIGJpdG1hcF9iaCk7CisKKwkJCWlmICgrK2lubyA8IEVYVDNfSU5PREVTX1BFUl9HUk9VUChzYikpCisJCQkJZ290byByZXBlYXRfaW5fdGhpc19ncm91cDsKKwkJfQorCisJCS8qCisJCSAqIFRoaXMgY2FzZSBpcyBwb3NzaWJsZSBpbiBjb25jdXJyZW50IGVudmlyb25tZW50LiAgSXQgaXMgdmVyeQorCQkgKiByYXJlLiAgV2UgY2Fubm90IHJlcGVhdCB0aGUgZmluZF9ncm91cF94eHgoKSBjYWxsIGJlY2F1c2UKKwkJICogdGhhdCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIHNhbWUgYmxvY2tncm91cCwgYmVjYXVzZSB0aGUKKwkJICogZ3JvdXAgZGVzY3JpcHRvciBtZXRhZGF0YSBoYXMgbm90IHlldCBiZWVuIHVwZGF0ZWQuCisJCSAqIFNvIHdlIGp1c3QgZ28gb250byB0aGUgbmV4dCBibG9ja2dyb3VwLgorCQkgKi8KKwkJaWYgKCsrZ3JvdXAgPT0gc2JpLT5zX2dyb3Vwc19jb3VudCkKKwkJCWdyb3VwID0gMDsKKwl9CisJZXJyID0gLUVOT1NQQzsKKwlnb3RvIG91dDsKKworZ290OgorCWlubyArPSBncm91cCAqIEVYVDNfSU5PREVTX1BFUl9HUk9VUChzYikgKyAxOworCWlmIChpbm8gPCBFWFQzX0ZJUlNUX0lOTyhzYikgfHwgaW5vID4gbGUzMl90b19jcHUoZXMtPnNfaW5vZGVzX2NvdW50KSkgeworCQlleHQzX2Vycm9yIChzYiwgImV4dDNfbmV3X2lub2RlIiwKKwkJCSAgICAicmVzZXJ2ZWQgaW5vZGUgb3IgaW5vZGUgPiBpbm9kZXMgY291bnQgLSAiCisJCQkgICAgImJsb2NrX2dyb3VwID0gJWQsIGlub2RlPSVsdSIsIGdyb3VwLCBpbm8pOworCQllcnIgPSAtRUlPOworCQlnb3RvIGZhaWw7CisJfQorCisJQlVGRkVSX1RSQUNFKGJoMiwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoMik7CisJaWYgKGVycikgZ290byBmYWlsOworCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwKSk7CisJZ2RwLT5iZ19mcmVlX2lub2Rlc19jb3VudCA9CisJCWNwdV90b19sZTE2KGxlMTZfdG9fY3B1KGdkcC0+YmdfZnJlZV9pbm9kZXNfY291bnQpIC0gMSk7CisJaWYgKFNfSVNESVIobW9kZSkpIHsKKwkJZ2RwLT5iZ191c2VkX2RpcnNfY291bnQgPQorCQkJY3B1X3RvX2xlMTYobGUxNl90b19jcHUoZ2RwLT5iZ191c2VkX2RpcnNfY291bnQpICsgMSk7CisJfQorCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKKwlCVUZGRVJfVFJBQ0UoYmgyLCAiY2FsbCBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaDIpOworCWlmIChlcnIpIGdvdG8gZmFpbDsKKworCXBlcmNwdV9jb3VudGVyX2RlYygmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7CisJaWYgKFNfSVNESVIobW9kZSkpCisJCXBlcmNwdV9jb3VudGVyX2luYygmc2JpLT5zX2RpcnNfY291bnRlcik7CisJc2ItPnNfZGlydCA9IDE7CisKKwlpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlpZiAodGVzdF9vcHQgKHNiLCBHUlBJRCkpCisJCWlub2RlLT5pX2dpZCA9IGRpci0+aV9naWQ7CisJZWxzZSBpZiAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKSB7CisJCWlub2RlLT5pX2dpZCA9IGRpci0+aV9naWQ7CisJCWlmIChTX0lTRElSKG1vZGUpKQorCQkJbW9kZSB8PSBTX0lTR0lEOworCX0gZWxzZQorCQlpbm9kZS0+aV9naWQgPSBjdXJyZW50LT5mc2dpZDsKKwlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKworCWlub2RlLT5pX2lubyA9IGlubzsKKwkvKiBUaGlzIGlzIHRoZSBvcHRpbWFsIElPIHNpemUgKGZvciBzdGF0KSwgbm90IHRoZSBmcyBibG9jayBzaXplICovCisJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfU0laRTsKKwlpbm9kZS0+aV9ibG9ja3MgPSAwOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisKKwltZW1zZXQoZWktPmlfZGF0YSwgMCwgc2l6ZW9mKGVpLT5pX2RhdGEpKTsKKwllaS0+aV9kaXJfc3RhcnRfbG9va3VwID0gMDsKKwllaS0+aV9kaXNrc2l6ZSA9IDA7CisKKwllaS0+aV9mbGFncyA9IEVYVDNfSShkaXIpLT5pX2ZsYWdzICYgfkVYVDNfSU5ERVhfRkw7CisJaWYgKFNfSVNMTksobW9kZSkpCisJCWVpLT5pX2ZsYWdzICY9IH4oRVhUM19JTU1VVEFCTEVfRkx8RVhUM19BUFBFTkRfRkwpOworCS8qIGRpcnN5bmMgb25seSBhcHBsaWVzIHRvIGRpcmVjdG9yaWVzICovCisJaWYgKCFTX0lTRElSKG1vZGUpKQorCQllaS0+aV9mbGFncyAmPSB+RVhUM19ESVJTWU5DX0ZMOworI2lmZGVmIEVYVDNfRlJBR01FTlRTCisJZWktPmlfZmFkZHIgPSAwOworCWVpLT5pX2ZyYWdfbm8gPSAwOworCWVpLT5pX2ZyYWdfc2l6ZSA9IDA7CisjZW5kaWYKKwllaS0+aV9maWxlX2FjbCA9IDA7CisJZWktPmlfZGlyX2FjbCA9IDA7CisJZWktPmlfZHRpbWUgPSAwOworCWVpLT5pX2Jsb2NrX2FsbG9jX2luZm8gPSBOVUxMOworCWVpLT5pX2Jsb2NrX2dyb3VwID0gZ3JvdXA7CisKKwlleHQzX3NldF9pbm9kZV9mbGFncyhpbm9kZSk7CisJaWYgKElTX0RJUlNZTkMoaW5vZGUpKQorCQloYW5kbGUtPmhfc3luYyA9IDE7CisJaW5zZXJ0X2lub2RlX2hhc2goaW5vZGUpOworCXNwaW5fbG9jaygmc2JpLT5zX25leHRfZ2VuX2xvY2spOworCWlub2RlLT5pX2dlbmVyYXRpb24gPSBzYmktPnNfbmV4dF9nZW5lcmF0aW9uKys7CisJc3Bpbl91bmxvY2soJnNiaS0+c19uZXh0X2dlbl9sb2NrKTsKKworCWVpLT5pX3N0YXRlID0gRVhUM19TVEFURV9ORVc7CisJZWktPmlfZXh0cmFfaXNpemUgPQorCQkoRVhUM19JTk9ERV9TSVpFKGlub2RlLT5pX3NiKSA+IEVYVDNfR09PRF9PTERfSU5PREVfU0laRSkgPworCQlzaXplb2Yoc3RydWN0IGV4dDNfaW5vZGUpIC0gRVhUM19HT09EX09MRF9JTk9ERV9TSVpFIDogMDsKKworCXJldCA9IGlub2RlOworCWlmKERRVU9UX0FMTE9DX0lOT0RFKGlub2RlKSkgeworCQlEUVVPVF9EUk9QKGlub2RlKTsKKwkJZXJyID0gLUVEUVVPVDsKKwkJZ290byBmYWlsMjsKKwl9CisJZXJyID0gZXh0M19pbml0X2FjbChoYW5kbGUsIGlub2RlLCBkaXIpOworCWlmIChlcnIpIHsKKwkJRFFVT1RfRlJFRV9JTk9ERShpbm9kZSk7CisJCWdvdG8gZmFpbDI7CisgIAl9CisJZXJyID0gZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCWlmIChlcnIpIHsKKwkJZXh0M19zdGRfZXJyb3Ioc2IsIGVycik7CisJCURRVU9UX0ZSRUVfSU5PREUoaW5vZGUpOworCQlnb3RvIGZhaWwyOworCX0KKworCWV4dDNfZGVidWcoImFsbG9jYXRpbmcgaW5vZGUgJWx1XG4iLCBpbm9kZS0+aV9pbm8pOworCWdvdG8gcmVhbGx5X291dDsKK2ZhaWw6CisJZXh0M19zdGRfZXJyb3Ioc2IsIGVycik7CitvdXQ6CisJaXB1dChpbm9kZSk7CisJcmV0ID0gRVJSX1BUUihlcnIpOworcmVhbGx5X291dDoKKwlicmVsc2UoYml0bWFwX2JoKTsKKwlyZXR1cm4gcmV0OworCitmYWlsMjoKKwlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7CisJaW5vZGUtPmlfbmxpbmsgPSAwOworCWlwdXQoaW5vZGUpOworCWJyZWxzZShiaXRtYXBfYmgpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qIFZlcmlmeSB0aGF0IHdlIGFyZSBsb2FkaW5nIGEgdmFsaWQgb3JwaGFuIGZyb20gZGlzayAqLworc3RydWN0IGlub2RlICpleHQzX29ycGhhbl9nZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBpbm8pCit7CisJdW5zaWduZWQgbG9uZyBtYXhfaW5vID0gbGUzMl90b19jcHUoRVhUM19TQihzYiktPnNfZXMtPnNfaW5vZGVzX2NvdW50KTsKKwl1bnNpZ25lZCBsb25nIGJsb2NrX2dyb3VwOworCWludCBiaXQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCisJLyogRXJyb3IgY2FzZXMgLSBlMmZzY2sgaGFzIGFscmVhZHkgY2xlYW5lZCB1cCBmb3IgdXMgKi8KKwlpZiAoaW5vID4gbWF4X2lubykgeworCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgImJhZCBvcnBoYW4gaW5vICVsdSEgIGUyZnNjayB3YXMgcnVuP1xuIiwgaW5vKTsKKwkJZ290byBvdXQ7CisJfQorCisJYmxvY2tfZ3JvdXAgPSAoaW5vIC0gMSkgLyBFWFQzX0lOT0RFU19QRVJfR1JPVVAoc2IpOworCWJpdCA9IChpbm8gLSAxKSAlIEVYVDNfSU5PREVTX1BFUl9HUk9VUChzYik7CisJYml0bWFwX2JoID0gcmVhZF9pbm9kZV9iaXRtYXAoc2IsIGJsb2NrX2dyb3VwKTsKKwlpZiAoIWJpdG1hcF9iaCkgeworCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgImlub2RlIGJpdG1hcCBlcnJvciBmb3Igb3JwaGFuICVsdVxuIiwgaW5vKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogSGF2aW5nIHRoZSBpbm9kZSBiaXQgc2V0IHNob3VsZCBiZSBhIDEwMCUgaW5kaWNhdG9yIHRoYXQgdGhpcworCSAqIGlzIGEgdmFsaWQgb3JwaGFuIChubyBlMmZzY2sgcnVuIG9uIGZzKS4gIE9ycGhhbnMgYWxzbyBpbmNsdWRlCisJICogaW5vZGVzIHRoYXQgd2VyZSBiZWluZyB0cnVuY2F0ZWQsIHNvIHdlIGNhbid0IGNoZWNrIGlfbmxpbms9PTAuCisJICovCisJaWYgKCFleHQzX3Rlc3RfYml0KGJpdCwgYml0bWFwX2JoLT5iX2RhdGEpIHx8CisJCQkhKGlub2RlID0gaWdldChzYiwgaW5vKSkgfHwgaXNfYmFkX2lub2RlKGlub2RlKSB8fAorCQkJTkVYVF9PUlBIQU4oaW5vZGUpID4gbWF4X2lubykgeworCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgImJhZCBvcnBoYW4gaW5vZGUgJWx1ISAgZTJmc2NrIHdhcyBydW4/XG4iLCBpbm8pOworCQlwcmludGsoS0VSTl9OT1RJQ0UgImV4dDNfdGVzdF9iaXQoYml0PSVkLCBibG9jaz0lbGx1KSA9ICVkXG4iLAorCQkgICAgICAgYml0LCAodW5zaWduZWQgbG9uZyBsb25nKWJpdG1hcF9iaC0+Yl9ibG9ja25yLAorCQkgICAgICAgZXh0M190ZXN0X2JpdChiaXQsIGJpdG1hcF9iaC0+Yl9kYXRhKSk7CisJCXByaW50ayhLRVJOX05PVElDRSAiaW5vZGU9JXBcbiIsIGlub2RlKTsKKwkJaWYgKGlub2RlKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgImlzX2JhZF9pbm9kZShpbm9kZSk9JWRcbiIsCisJCQkgICAgICAgaXNfYmFkX2lub2RlKGlub2RlKSk7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5FWFRfT1JQSEFOKGlub2RlKT0ldVxuIiwKKwkJCSAgICAgICBORVhUX09SUEhBTihpbm9kZSkpOworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJtYXhfaW5vPSVsdVxuIiwgbWF4X2lubyk7CisJCX0KKwkJLyogQXZvaWQgZnJlZWluZyBibG9ja3MgaWYgd2UgZ290IGEgYmFkIGRlbGV0ZWQgaW5vZGUgKi8KKwkJaWYgKGlub2RlICYmIGlub2RlLT5pX25saW5rID09IDApCisJCQlpbm9kZS0+aV9ibG9ja3MgPSAwOworCQlpcHV0KGlub2RlKTsKKwkJaW5vZGUgPSBOVUxMOworCX0KK291dDoKKwlicmVsc2UoYml0bWFwX2JoKTsKKwlyZXR1cm4gaW5vZGU7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZXh0M19jb3VudF9mcmVlX2lub2RlcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJdW5zaWduZWQgbG9uZyBkZXNjX2NvdW50OworCXN0cnVjdCBleHQzX2dyb3VwX2Rlc2MgKmdkcDsKKwlpbnQgaTsKKyNpZmRlZiBFWFQzRlNfREVCVUcKKwlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXM7CisJdW5zaWduZWQgbG9uZyBiaXRtYXBfY291bnQsIHg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOworCisJbG9ja19zdXBlciAoc2IpOworCWVzID0gRVhUM19TQihzYiktPnNfZXM7CisJZGVzY19jb3VudCA9IDA7CisJYml0bWFwX2NvdW50ID0gMDsKKwlnZHAgPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBFWFQzX1NCKHNiKS0+c19ncm91cHNfY291bnQ7IGkrKykgeworCQlnZHAgPSBleHQzX2dldF9ncm91cF9kZXNjIChzYiwgaSwgTlVMTCk7CisJCWlmICghZ2RwKQorCQkJY29udGludWU7CisJCWRlc2NfY291bnQgKz0gbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2lub2Rlc19jb3VudCk7CisJCWJyZWxzZShiaXRtYXBfYmgpOworCQliaXRtYXBfYmggPSByZWFkX2lub2RlX2JpdG1hcChzYiwgaSk7CisJCWlmICghYml0bWFwX2JoKQorCQkJY29udGludWU7CisKKwkJeCA9IGV4dDNfY291bnRfZnJlZShiaXRtYXBfYmgsIEVYVDNfSU5PREVTX1BFUl9HUk9VUChzYikgLyA4KTsKKwkJcHJpbnRrKCJncm91cCAlZDogc3RvcmVkID0gJWQsIGNvdW50ZWQgPSAlbHVcbiIsCisJCQlpLCBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSwgeCk7CisJCWJpdG1hcF9jb3VudCArPSB4OworCX0KKwlicmVsc2UoYml0bWFwX2JoKTsKKwlwcmludGsoImV4dDNfY291bnRfZnJlZV9pbm9kZXM6IHN0b3JlZCA9ICV1LCBjb21wdXRlZCA9ICVsdSwgJWx1XG4iLAorCQlsZTMyX3RvX2NwdShlcy0+c19mcmVlX2lub2Rlc19jb3VudCksIGRlc2NfY291bnQsIGJpdG1hcF9jb3VudCk7CisJdW5sb2NrX3N1cGVyKHNiKTsKKwlyZXR1cm4gZGVzY19jb3VudDsKKyNlbHNlCisJZGVzY19jb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IEVYVDNfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsgaSsrKSB7CisJCWdkcCA9IGV4dDNfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBpLCBOVUxMKTsKKwkJaWYgKCFnZHApCisJCQljb250aW51ZTsKKwkJZGVzY19jb3VudCArPSBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KTsKKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCXJldHVybiBkZXNjX2NvdW50OworI2VuZGlmCit9CisKKy8qIENhbGxlZCBhdCBtb3VudC10aW1lLCBzdXBlci1ibG9jayBpcyBsb2NrZWQgKi8KK3Vuc2lnbmVkIGxvbmcgZXh0M19jb3VudF9kaXJzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKK3sKKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBFWFQzX1NCKHNiKS0+c19ncm91cHNfY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICpnZHAgPSBleHQzX2dldF9ncm91cF9kZXNjIChzYiwgaSwgTlVMTCk7CisJCWlmICghZ2RwKQorCQkJY29udGludWU7CisJCWNvdW50ICs9IGxlMTZfdG9fY3B1KGdkcC0+YmdfdXNlZF9kaXJzX2NvdW50KTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCisjaWZkZWYgQ09ORklHX0VYVDNfQ0hFQ0sKKy8qIENhbGxlZCBhdCBtb3VudC10aW1lLCBzdXBlci1ibG9jayBpcyBsb2NrZWQgKi8KK3ZvaWQgZXh0M19jaGVja19pbm9kZXNfYml0bWFwIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKK3sKKwlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzOworCXVuc2lnbmVkIGxvbmcgZGVzY19jb3VudCwgYml0bWFwX2NvdW50LCB4OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICogZ2RwOworCWludCBpOworCisJZXMgPSBFWFQzX1NCKHNiKS0+c19lczsKKwlkZXNjX2NvdW50ID0gMDsKKwliaXRtYXBfY291bnQgPSAwOworCWdkcCA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IEVYVDNfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsgaSsrKSB7CisJCWdkcCA9IGV4dDNfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBpLCBOVUxMKTsKKwkJaWYgKCFnZHApCisJCQljb250aW51ZTsKKwkJZGVzY19jb3VudCArPSBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KTsKKwkJYnJlbHNlKGJpdG1hcF9iaCk7CisJCWJpdG1hcF9iaCA9IHJlYWRfaW5vZGVfYml0bWFwKHNiLCBpKTsKKwkJaWYgKCFiaXRtYXBfYmgpCisJCQljb250aW51ZTsKKworCQl4ID0gZXh0M19jb3VudF9mcmVlKGJpdG1hcF9iaCwgRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKSAvIDgpOworCQlpZiAobGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgIT0geCkKKwkJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19jaGVja19pbm9kZXNfYml0bWFwIiwKKwkJCQkgICAgIldyb25nIGZyZWUgaW5vZGVzIGNvdW50IGluIGdyb3VwICVkLCAiCisJCQkJICAgICJzdG9yZWQgPSAlZCwgY291bnRlZCA9ICVsdSIsIGksCisJCQkJICAgIGxlMTZfdG9fY3B1KGdkcC0+YmdfZnJlZV9pbm9kZXNfY291bnQpLCB4KTsKKwkJYml0bWFwX2NvdW50ICs9IHg7CisJfQorCWJyZWxzZShiaXRtYXBfYmgpOworCWlmIChsZTMyX3RvX2NwdShlcy0+c19mcmVlX2lub2Rlc19jb3VudCkgIT0gYml0bWFwX2NvdW50KQorCQlleHQzX2Vycm9yIChzYiwgImV4dDNfY2hlY2tfaW5vZGVzX2JpdG1hcCIsCisJCQkgICAgIldyb25nIGZyZWUgaW5vZGVzIGNvdW50IGluIHN1cGVyIGJsb2NrLCAiCisJCQkgICAgInN0b3JlZCA9ICVsdSwgY291bnRlZCA9ICVsdSIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpbGUzMl90b19jcHUoZXMtPnNfZnJlZV9pbm9kZXNfY291bnQpLAorCQkJICAgIGJpdG1hcF9jb3VudCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvaW5vZGUuYyBiL2ZzL2V4dDMvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDBlYjI4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0My9pbm9kZS5jCkBAIC0wLDAgKzEsMzEzMiBAQAorLyoKKyAqICBsaW51eC9mcy9leHQzL2lub2RlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvbWluaXgvaW5vZGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIEdvYWwtZGlyZWN0ZWQgYmxvY2sgYWxsb2NhdGlvbiBieSBTdGVwaGVuIFR3ZWVkaWUKKyAqIAkoc2N0QHJlZGhhdC5jb20pLCAxOTkzLCAxOTk4CisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqICA2NC1iaXQgZmlsZSBzdXBwb3J0IG9uIDY0LWJpdCBwbGF0Zm9ybXMgYnkgSmFrdWIgSmVsaW5laworICogCShqakBzdW5zaXRlLm1zLm1mZi5jdW5pLmN6KQorICoKKyAqICBBc3NvcnRlZCByYWNlIGZpeGVzLCByZXdyaXRlIG9mIGV4dDNfZ2V0X2Jsb2NrKCkgYnkgQWwgVmlybywgMjAwMAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaHVpZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImFjbC5oIgorCitzdGF0aWMgaW50IGV4dDNfd3JpdGVwYWdlX3RyYW5zX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworLyoKKyAqIFRlc3Qgd2hldGhlciBhbiBpbm9kZSBpcyBhIGZhc3Qgc3ltbGluay4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZXh0M19pbm9kZV9pc19mYXN0X3N5bWxpbmsoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbnQgZWFfYmxvY2tzID0gRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCA/CisJCShpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgPj4gOSkgOiAwOworCisJcmV0dXJuIChTX0lTTE5LKGlub2RlLT5pX21vZGUpICYmCisJCWlub2RlLT5pX2Jsb2NrcyAtIGVhX2Jsb2NrcyA9PSAwKTsKK30KKworLyogVGhlIGV4dDMgZm9yZ2V0IGZ1bmN0aW9uIG11c3QgcGVyZm9ybSBhIHJldm9rZSBpZiB3ZSBhcmUgZnJlZWluZyBkYXRhCisgKiB3aGljaCBoYXMgYmVlbiBqb3VybmFsZWQuICBNZXRhZGF0YSAoZWcuIGluZGlyZWN0IGJsb2NrcykgbXVzdCBiZQorICogcmV2b2tlZCBpbiBhbGwgY2FzZXMuIAorICoKKyAqICJiaCIgbWF5IGJlIE5VTEw6IGEgbWV0YWRhdGEgYmxvY2sgbWF5IGhhdmUgYmVlbiBmcmVlZCBmcm9tIG1lbW9yeQorICogYnV0IHRoZXJlIG1heSBzdGlsbCBiZSBhIHJlY29yZCBvZiBpdCBpbiB0aGUgam91cm5hbCwgYW5kIHRoYXQgcmVjb3JkCisgKiBzdGlsbCBuZWVkcyB0byBiZSByZXZva2VkLgorICovCisKK2ludCBleHQzX2ZvcmdldChoYW5kbGVfdCAqaGFuZGxlLCBpbnQgaXNfbWV0YWRhdGEsCisJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkgICAgICAgaW50IGJsb2NrbnIpCit7CisJaW50IGVycjsKKworCW1pZ2h0X3NsZWVwKCk7CisKKwlCVUZGRVJfVFJBQ0UoYmgsICJlbnRlciIpOworCisJamJkX2RlYnVnKDQsICJmb3JnZXR0aW5nIGJoICVwOiBpc19tZXRhZGF0YSA9ICVkLCBtb2RlICVvLCAiCisJCSAgImRhdGEgbW9kZSAlbHhcbiIsCisJCSAgYmgsIGlzX21ldGFkYXRhLCBpbm9kZS0+aV9tb2RlLAorCQkgIHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBEQVRBX0ZMQUdTKSk7CisKKwkvKiBOZXZlciB1c2UgdGhlIHJldm9rZSBmdW5jdGlvbiBpZiB3ZSBhcmUgZG9pbmcgZnVsbCBkYXRhCisJICogam91cm5hbGluZzogdGhlcmUgaXMgbm8gbmVlZCB0bywgYW5kIGEgVjEgc3VwZXJibG9jayB3b24ndAorCSAqIHN1cHBvcnQgaXQuICBPdGhlcndpc2UsIG9ubHkgc2tpcCB0aGUgcmV2b2tlIG9uIHVuLWpvdXJuYWxlZAorCSAqIGRhdGEgYmxvY2tzLiAqLworCisJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBEQVRBX0ZMQUdTKSA9PSBFWFQzX01PVU5UX0pPVVJOQUxfREFUQSB8fAorCSAgICAoIWlzX21ldGFkYXRhICYmICFleHQzX3Nob3VsZF9qb3VybmFsX2RhdGEoaW5vZGUpKSkgeworCQlpZiAoYmgpIHsKKwkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgam91cm5hbF9mb3JnZXQiKTsKKwkJCXJldHVybiBleHQzX2pvdXJuYWxfZm9yZ2V0KGhhbmRsZSwgYmgpOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogZGF0YSE9am91cm5hbCAmJiAoaXNfbWV0YWRhdGEgfHwgc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpCisJICovCisJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQzX2pvdXJuYWxfcmV2b2tlIik7CisJZXJyID0gZXh0M19qb3VybmFsX3Jldm9rZShoYW5kbGUsIGJsb2NrbnIsIGJoKTsKKwlpZiAoZXJyKQorCQlleHQzX2Fib3J0KGlub2RlLT5pX3NiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAiZXJyb3IgJWQgd2hlbiBhdHRlbXB0aW5nIHJldm9rZSIsIGVycik7CisJQlVGRkVSX1RSQUNFKGJoLCAiZXhpdCIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBXb3JrIG91dCBob3cgbWFueSBibG9ja3Mgd2UgbmVlZCB0byBwcm9ncmVzcyB3aXRoIHRoZSBuZXh0IGNodW5rIG9mIGEKKyAqIHRydW5jYXRlIHRyYW5zYWN0aW9uLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJsb2Nrc19mb3JfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSkgCit7CisJdW5zaWduZWQgbG9uZyBuZWVkZWQ7CisKKwluZWVkZWQgPSBpbm9kZS0+aV9ibG9ja3MgPj4gKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSk7CisKKwkvKiBHaXZlIG91cnNlbHZlcyBqdXN0IGVub3VnaCByb29tIHRvIGNvcGUgd2l0aCBpbm9kZXMgaW4gd2hpY2gKKwkgKiBpX2Jsb2NrcyBpcyBjb3JydXB0OiB3ZSd2ZSBzZWVuIGRpc2sgY29ycnVwdGlvbnMgaW4gdGhlIHBhc3QKKwkgKiB3aGljaCByZXN1bHRlZCBpbiByYW5kb20gZGF0YSBpbiBhbiBpbm9kZSB3aGljaCBsb29rZWQgZW5vdWdoCisJICogbGlrZSBhIHJlZ3VsYXIgZmlsZSBmb3IgZXh0MyB0byB0cnkgdG8gZGVsZXRlIGl0LiAgVGhpbmdzCisJICogd2lsbCBnbyBhIGJpdCBjcmF6eSBpZiB0aGF0IGhhcHBlbnMsIGJ1dCBhdCBsZWFzdCB3ZSBzaG91bGQKKwkgKiB0cnkgbm90IHRvIHBhbmljIHRoZSB3aG9sZSBrZXJuZWwuICovCisJaWYgKG5lZWRlZCA8IDIpCisJCW5lZWRlZCA9IDI7CisKKwkvKiBCdXQgd2UgbmVlZCB0byBib3VuZCB0aGUgdHJhbnNhY3Rpb24gc28gd2UgZG9uJ3Qgb3ZlcmZsb3cgdGhlCisJICogam91cm5hbC4gKi8KKwlpZiAobmVlZGVkID4gRVhUM19NQVhfVFJBTlNfREFUQSkgCisJCW5lZWRlZCA9IEVYVDNfTUFYX1RSQU5TX0RBVEE7CisKKwlyZXR1cm4gRVhUM19EQVRBX1RSQU5TX0JMT0NLUyArIG5lZWRlZDsKK30KKworLyogCisgKiBUcnVuY2F0ZSB0cmFuc2FjdGlvbnMgY2FuIGJlIGNvbXBsZXggYW5kIGFic29sdXRlbHkgaHVnZS4gIFNvIHdlIG5lZWQgdG8KKyAqIGJlIGFibGUgdG8gcmVzdGFydCB0aGUgdHJhbnNhY3Rpb24gYXQgYSBjb252ZW50aWVudCBjaGVja3BvaW50IHRvIG1ha2UKKyAqIHN1cmUgd2UgZG9uJ3Qgb3ZlcmZsb3cgdGhlIGpvdXJuYWwuCisgKgorICogc3RhcnRfdHJhbnNhY3Rpb24gZ2V0cyB1cyBhIG5ldyBoYW5kbGUgZm9yIGEgdHJ1bmNhdGUgdHJhbnNhY3Rpb24sCisgKiBhbmQgZXh0ZW5kX3RyYW5zYWN0aW9uIHRyaWVzIHRvIGV4dGVuZCB0aGUgZXhpc3Rpbmcgb25lIGEgYml0LiAgSWYKKyAqIGV4dGVuZCBmYWlscywgd2UgbmVlZCB0byBwcm9wYWdhdGUgdGhlIGZhaWx1cmUgdXAgYW5kIHJlc3RhcnQgdGhlCisgKiB0cmFuc2FjdGlvbiBpbiB0aGUgdG9wLWxldmVsIHRydW5jYXRlIGxvb3AuIC0tc2N0IAorICovCisKK3N0YXRpYyBoYW5kbGVfdCAqc3RhcnRfdHJhbnNhY3Rpb24oc3RydWN0IGlub2RlICppbm9kZSkgCit7CisJaGFuZGxlX3QgKnJlc3VsdDsKKworCXJlc3VsdCA9IGV4dDNfam91cm5hbF9zdGFydChpbm9kZSwgYmxvY2tzX2Zvcl90cnVuY2F0ZShpbm9kZSkpOworCWlmICghSVNfRVJSKHJlc3VsdCkpCisJCXJldHVybiByZXN1bHQ7CisKKwlleHQzX3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgUFRSX0VSUihyZXN1bHQpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogVHJ5IHRvIGV4dGVuZCB0aGlzIHRyYW5zYWN0aW9uIGZvciB0aGUgcHVycG9zZXMgb2YgdHJ1bmNhdGlvbi4KKyAqCisgKiBSZXR1cm5zIDAgaWYgd2UgbWFuYWdlZCB0byBjcmVhdGUgbW9yZSByb29tLiAgSWYgd2UgY2FuJ3QgY3JlYXRlIG1vcmUKKyAqIHJvb20sIGFuZCB0aGUgdHJhbnNhY3Rpb24gbXVzdCBiZSByZXN0YXJ0ZWQgd2UgcmV0dXJuIDEuCisgKi8KK3N0YXRpYyBpbnQgdHJ5X3RvX2V4dGVuZF90cmFuc2FjdGlvbihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmIChoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPiBFWFQzX1JFU0VSVkVfVFJBTlNfQkxPQ0tTKQorCQlyZXR1cm4gMDsKKwlpZiAoIWV4dDNfam91cm5hbF9leHRlbmQoaGFuZGxlLCBibG9ja3NfZm9yX3RydW5jYXRlKGlub2RlKSkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKgorICogUmVzdGFydCB0aGUgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoICpoYW5kbGUuICBUaGlzIGRvZXMgYSBjb21taXQsCisgKiBzbyBiZWZvcmUgd2UgY2FsbCBoZXJlIGV2ZXJ5dGhpbmcgbXVzdCBiZSBjb25zaXN0ZW50bHkgZGlydGllZCBhZ2FpbnN0CisgKiB0aGlzIHRyYW5zYWN0aW9uLgorICovCitzdGF0aWMgaW50IGV4dDNfam91cm5hbF90ZXN0X3Jlc3RhcnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlqYmRfZGVidWcoMiwgInJlc3RhcnRpbmcgaGFuZGxlICVwXG4iLCBoYW5kbGUpOworCXJldHVybiBleHQzX2pvdXJuYWxfcmVzdGFydChoYW5kbGUsIGJsb2Nrc19mb3JfdHJ1bmNhdGUoaW5vZGUpKTsKK30KKworLyoKKyAqIENhbGxlZCBhdCB0aGUgbGFzdCBpcHV0KCkgaWYgaV9ubGluayBpcyB6ZXJvLgorICovCit2b2lkIGV4dDNfZGVsZXRlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwloYW5kbGVfdCAqaGFuZGxlOworCisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCisJCWdvdG8gbm9fZGVsZXRlOworCisJaGFuZGxlID0gc3RhcnRfdHJhbnNhY3Rpb24oaW5vZGUpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkvKiBJZiB3ZSdyZSBnb2luZyB0byBza2lwIHRoZSBub3JtYWwgY2xlYW51cCwgd2Ugc3RpbGwKKwkJICogbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgaW4tY29yZSBvcnBoYW4gbGlua2VkIGxpc3QKKwkJICogaXMgcHJvcGVybHkgY2xlYW5lZCB1cC4gKi8KKwkJZXh0M19vcnBoYW5fZGVsKE5VTEwsIGlub2RlKTsKKwkJZ290byBub19kZWxldGU7CisJfQorCisJaWYgKElTX1NZTkMoaW5vZGUpKQorCQloYW5kbGUtPmhfc3luYyA9IDE7CisJaW5vZGUtPmlfc2l6ZSA9IDA7CisJaWYgKGlub2RlLT5pX2Jsb2NrcykKKwkJZXh0M190cnVuY2F0ZShpbm9kZSk7CisJLyoKKwkgKiBLaWxsIG9mZiB0aGUgb3JwaGFuIHJlY29yZCB3aGljaCBleHQzX3RydW5jYXRlIGNyZWF0ZWQuCisJICogQUtQTTogSSB0aGluayB0aGlzIGNhbiBiZSBpbnNpZGUgdGhlIGFib3ZlIGBpZicuCisJICogTm90ZSB0aGF0IGV4dDNfb3JwaGFuX2RlbCgpIGhhcyB0byBiZSBhYmxlIHRvIGNvcGUgd2l0aCB0aGUKKwkgKiBkZWxldGlvbiBvZiBhIG5vbi1leGlzdGVudCBvcnBoYW4gLSB0aGlzIGlzIGJlY2F1c2Ugd2UgZG9uJ3QKKwkgKiBrbm93IGlmIGV4dDNfdHJ1bmNhdGUoKSBhY3R1YWxseSBjcmVhdGVkIGFuIG9ycGhhbiByZWNvcmQuCisJICogKFdlbGwsIHdlIGNvdWxkIGRvIHRoaXMgaWYgd2UgbmVlZCB0bywgYnV0IGhlY2sgLSBpdCB3b3JrcykKKwkgKi8KKwlleHQzX29ycGhhbl9kZWwoaGFuZGxlLCBpbm9kZSk7CisJRVhUM19JKGlub2RlKS0+aV9kdGltZQk9IGdldF9zZWNvbmRzKCk7CisKKwkvKiAKKwkgKiBPbmUgc3VidGxlIG9yZGVyaW5nIHJlcXVpcmVtZW50OiBpZiBhbnl0aGluZyBoYXMgZ29uZSB3cm9uZworCSAqICh0cmFuc2FjdGlvbiBhYm9ydCwgSU8gZXJyb3JzLCB3aGF0ZXZlciksIHRoZW4gd2UgY2FuIHN0aWxsCisJICogZG8gdGhlc2UgbmV4dCBzdGVwcyAodGhlIGZzIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gbWFya2VkIGFzCisJICogaGF2aW5nIGVycm9ycyksIGJ1dCB3ZSBjYW4ndCBmcmVlIHRoZSBpbm9kZSBpZiB0aGUgbWFya19kaXJ0eQorCSAqIGZhaWxzLiAgCisJICovCisJaWYgKGV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKSkKKwkJLyogSWYgdGhhdCBmYWlsZWQsIGp1c3QgZG8gdGhlIHJlcXVpcmVkIGluLWNvcmUgaW5vZGUgY2xlYXIuICovCisJCWNsZWFyX2lub2RlKGlub2RlKTsKKwllbHNlCisJCWV4dDNfZnJlZV9pbm9kZShoYW5kbGUsIGlub2RlKTsKKwlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCXJldHVybjsKK25vX2RlbGV0ZToKKwljbGVhcl9pbm9kZShpbm9kZSk7CS8qIFdlIG11c3QgZ3VhcmFudGVlIGNsZWFyaW5nIG9mIGlub2RlLi4uICovCit9CisKK3N0YXRpYyBpbnQgZXh0M19hbGxvY19ibG9jayAoaGFuZGxlX3QgKmhhbmRsZSwKKwkJCXN0cnVjdCBpbm9kZSAqIGlub2RlLCB1bnNpZ25lZCBsb25nIGdvYWwsIGludCAqZXJyKQoreworCXVuc2lnbmVkIGxvbmcgcmVzdWx0OworCisJcmVzdWx0ID0gZXh0M19uZXdfYmxvY2soaGFuZGxlLCBpbm9kZSwgZ29hbCwgZXJyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlMzIJKnA7CisJX19sZTMyCWtleTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworfSBJbmRpcmVjdDsKKworc3RhdGljIGlubGluZSB2b2lkIGFkZF9jaGFpbihJbmRpcmVjdCAqcCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgX19sZTMyICp2KQoreworCXAtPmtleSA9ICoocC0+cCA9IHYpOworCXAtPmJoID0gYmg7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHZlcmlmeV9jaGFpbihJbmRpcmVjdCAqZnJvbSwgSW5kaXJlY3QgKnRvKQoreworCXdoaWxlIChmcm9tIDw9IHRvICYmIGZyb20tPmtleSA9PSAqZnJvbS0+cCkKKwkJZnJvbSsrOworCXJldHVybiAoZnJvbSA+IHRvKTsKK30KKworLyoqCisgKglleHQzX2Jsb2NrX3RvX3BhdGggLSBwYXJzZSB0aGUgYmxvY2sgbnVtYmVyIGludG8gYXJyYXkgb2Ygb2Zmc2V0cworICoJQGlub2RlOiBpbm9kZSBpbiBxdWVzdGlvbiAod2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBpdHMgc3VwZXJibG9jaykKKyAqCUBpX2Jsb2NrOiBibG9jayBudW1iZXIgdG8gYmUgcGFyc2VkCisgKglAb2Zmc2V0czogYXJyYXkgdG8gc3RvcmUgdGhlIG9mZnNldHMgaW4KKyAqICAgICAgQGJvdW5kYXJ5OiBzZXQgdGhpcyBub24temVybyBpZiB0aGUgcmVmZXJyZWQtdG8gYmxvY2sgaXMgbGlrZWx5IHRvIGJlCisgKiAgICAgICAgICAgICBmb2xsb3dlZCAob24gZGlzaykgYnkgYW4gaW5kaXJlY3QgYmxvY2suCisgKgorICoJVG8gc3RvcmUgdGhlIGxvY2F0aW9ucyBvZiBmaWxlJ3MgZGF0YSBleHQzIHVzZXMgYSBkYXRhIHN0cnVjdHVyZSBjb21tb24KKyAqCWZvciBVTklYIGZpbGVzeXN0ZW1zIC0gdHJlZSBvZiBwb2ludGVycyBhbmNob3JlZCBpbiB0aGUgaW5vZGUsIHdpdGgKKyAqCWRhdGEgYmxvY2tzIGF0IGxlYXZlcyBhbmQgaW5kaXJlY3QgYmxvY2tzIGluIGludGVybWVkaWF0ZSBub2Rlcy4KKyAqCVRoaXMgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgYmxvY2sgbnVtYmVyIGludG8gcGF0aCBpbiB0aGF0IHRyZWUgLQorICoJcmV0dXJuIHZhbHVlIGlzIHRoZSBwYXRoIGxlbmd0aCBhbmQgQG9mZnNldHNbbl0gaXMgdGhlIG9mZnNldCBvZgorICoJcG9pbnRlciB0byAobisxKXRoIG5vZGUgaW4gdGhlIG50aCBvbmUuIElmIEBibG9jayBpcyBvdXQgb2YgcmFuZ2UKKyAqCShuZWdhdGl2ZSBvciB0b28gbGFyZ2UpIHdhcm5pbmcgaXMgcHJpbnRlZCBhbmQgemVybyByZXR1cm5lZC4KKyAqCisgKglOb3RlOiBmdW5jdGlvbiBkb2Vzbid0IGZpbmQgbm9kZSBhZGRyZXNzZXMsIHNvIG5vIElPIGlzIG5lZWRlZC4gQWxsCisgKgl3ZSBuZWVkIHRvIGtub3cgaXMgdGhlIGNhcGFjaXR5IG9mIGluZGlyZWN0IGJsb2NrcyAodGFrZW4gZnJvbSB0aGUKKyAqCWlub2RlLT5pX3NiKS4KKyAqLworCisvKgorICogUG9ydGFiaWxpdHkgbm90ZTogdGhlIGxhc3QgY29tcGFyaXNvbiAoY2hlY2sgdGhhdCB3ZSBmaXQgaW50byB0cmlwbGUKKyAqIGluZGlyZWN0IGJsb2NrKSBpcyBzcGVsbGVkIGRpZmZlcmVudGx5LCBiZWNhdXNlIG90aGVyd2lzZSBvbiBhbgorICogYXJjaGl0ZWN0dXJlIHdpdGggMzItYml0IGxvbmdzIGFuZCA4S2IgcGFnZXMgd2UgbWlnaHQgZ2V0IGludG8gdHJvdWJsZQorICogaWYgb3VyIGZpbGVzeXN0ZW0gaGFkIDhLYiBibG9ja3MuIFdlIG1pZ2h0IHVzZSBsb25nIGxvbmcsIGJ1dCB0aGF0IHdvdWxkCisgKiBraWxsIHVzIG9uIHg4Ni4gT2gsIHdlbGwsIGF0IGxlYXN0IHRoZSBzaWduIHByb3BhZ2F0aW9uIGRvZXMgbm90IG1hdHRlciAtCisgKiBpX2Jsb2NrIHdvdWxkIGhhdmUgdG8gYmUgbmVnYXRpdmUgaW4gdGhlIHZlcnkgYmVnaW5uaW5nLCBzbyB3ZSB3b3VsZCBub3QKKyAqIGdldCB0aGVyZSBhdCBhbGwuCisgKi8KKworc3RhdGljIGludCBleHQzX2Jsb2NrX3RvX3BhdGgoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCWxvbmcgaV9ibG9jaywgaW50IG9mZnNldHNbNF0sIGludCAqYm91bmRhcnkpCit7CisJaW50IHB0cnMgPSBFWFQzX0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKTsKKwlpbnQgcHRyc19iaXRzID0gRVhUM19BRERSX1BFUl9CTE9DS19CSVRTKGlub2RlLT5pX3NiKTsKKwljb25zdCBsb25nIGRpcmVjdF9ibG9ja3MgPSBFWFQzX05ESVJfQkxPQ0tTLAorCQlpbmRpcmVjdF9ibG9ja3MgPSBwdHJzLAorCQlkb3VibGVfYmxvY2tzID0gKDEgPDwgKHB0cnNfYml0cyAqIDIpKTsKKwlpbnQgbiA9IDA7CisJaW50IGZpbmFsID0gMDsKKworCWlmIChpX2Jsb2NrIDwgMCkgeworCQlleHQzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiZXh0M19ibG9ja190b19wYXRoIiwgImJsb2NrIDwgMCIpOworCX0gZWxzZSBpZiAoaV9ibG9jayA8IGRpcmVjdF9ibG9ja3MpIHsKKwkJb2Zmc2V0c1tuKytdID0gaV9ibG9jazsKKwkJZmluYWwgPSBkaXJlY3RfYmxvY2tzOworCX0gZWxzZSBpZiAoIChpX2Jsb2NrIC09IGRpcmVjdF9ibG9ja3MpIDwgaW5kaXJlY3RfYmxvY2tzKSB7CisJCW9mZnNldHNbbisrXSA9IEVYVDNfSU5EX0JMT0NLOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrOworCQlmaW5hbCA9IHB0cnM7CisJfSBlbHNlIGlmICgoaV9ibG9jayAtPSBpbmRpcmVjdF9ibG9ja3MpIDwgZG91YmxlX2Jsb2NrcykgeworCQlvZmZzZXRzW24rK10gPSBFWFQzX0RJTkRfQkxPQ0s7CisJCW9mZnNldHNbbisrXSA9IGlfYmxvY2sgPj4gcHRyc19iaXRzOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKKwkJZmluYWwgPSBwdHJzOworCX0gZWxzZSBpZiAoKChpX2Jsb2NrIC09IGRvdWJsZV9ibG9ja3MpID4+IChwdHJzX2JpdHMgKiAyKSkgPCBwdHJzKSB7CisJCW9mZnNldHNbbisrXSA9IEVYVDNfVElORF9CTE9DSzsKKwkJb2Zmc2V0c1tuKytdID0gaV9ibG9jayA+PiAocHRyc19iaXRzICogMik7CisJCW9mZnNldHNbbisrXSA9IChpX2Jsb2NrID4+IHB0cnNfYml0cykgJiAocHRycyAtIDEpOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKKwkJZmluYWwgPSBwdHJzOworCX0gZWxzZSB7CisJCWV4dDNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJleHQzX2Jsb2NrX3RvX3BhdGgiLCAiYmxvY2sgPiBiaWciKTsKKwl9CisJaWYgKGJvdW5kYXJ5KQorCQkqYm91bmRhcnkgPSAoaV9ibG9jayAmIChwdHJzIC0gMSkpID09IChmaW5hbCAtIDEpOworCXJldHVybiBuOworfQorCisvKioKKyAqCWV4dDNfZ2V0X2JyYW5jaCAtIHJlYWQgdGhlIGNoYWluIG9mIGluZGlyZWN0IGJsb2NrcyBsZWFkaW5nIHRvIGRhdGEKKyAqCUBpbm9kZTogaW5vZGUgaW4gcXVlc3Rpb24KKyAqCUBkZXB0aDogZGVwdGggb2YgdGhlIGNoYWluICgxIC0gZGlyZWN0IHBvaW50ZXIsIGV0Yy4pCisgKglAb2Zmc2V0czogb2Zmc2V0cyBvZiBwb2ludGVycyBpbiBpbm9kZS9pbmRpcmVjdCBibG9ja3MKKyAqCUBjaGFpbjogcGxhY2UgdG8gc3RvcmUgdGhlIHJlc3VsdAorICoJQGVycjogaGVyZSB3ZSBzdG9yZSB0aGUgZXJyb3IgdmFsdWUKKyAqCisgKglGdW5jdGlvbiBmaWxscyB0aGUgYXJyYXkgb2YgdHJpcGxlcyA8a2V5LCBwLCBiaD4gYW5kIHJldHVybnMgJU5VTEwKKyAqCWlmIGV2ZXJ5dGhpbmcgd2VudCBPSyBvciB0aGUgcG9pbnRlciB0byB0aGUgbGFzdCBmaWxsZWQgdHJpcGxlCisgKgkoaW5jb21wbGV0ZSBvbmUpIG90aGVyd2lzZS4gVXBvbiB0aGUgcmV0dXJuIGNoYWluW2ldLmtleSBjb250YWlucworICoJdGhlIG51bWJlciBvZiAoaSsxKS10aCBibG9jayBpbiB0aGUgY2hhaW4gKGFzIGl0IGlzIHN0b3JlZCBpbiBtZW1vcnksCisgKglpLmUuIGxpdHRsZS1lbmRpYW4gMzItYml0KSwgY2hhaW5baV0ucCBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGF0CisgKgludW1iZXIgKGl0IHBvaW50cyBpbnRvIHN0cnVjdCBpbm9kZSBmb3IgaT09MCBhbmQgaW50byB0aGUgYmgtPmJfZGF0YQorICoJZm9yIGk+MCkgYW5kIGNoYWluW2ldLmJoIHBvaW50cyB0byB0aGUgYnVmZmVyX2hlYWQgb2YgaS10aCBpbmRpcmVjdAorICoJYmxvY2sgZm9yIGk+MCBhbmQgTlVMTCBmb3IgaT09MC4gSW4gb3RoZXIgd29yZHMsIGl0IGhvbGRzIHRoZSBibG9jaworICoJbnVtYmVycyBvZiB0aGUgY2hhaW4sIGFkZHJlc3NlcyB0aGV5IHdlcmUgdGFrZW4gZnJvbSAoYW5kIHdoZXJlIHdlIGNhbgorICoJdmVyaWZ5IHRoYXQgY2hhaW4gZGlkIG5vdCBjaGFuZ2UpIGFuZCBidWZmZXJfaGVhZHMgaG9zdGluZyB0aGVzZQorICoJbnVtYmVycy4KKyAqCisgKglGdW5jdGlvbiBzdG9wcyB3aGVuIGl0IHN0dW1ibGVzIHVwb24gemVybyBwb2ludGVyIChhYnNlbnQgYmxvY2spCisgKgkJKHBvaW50ZXIgdG8gbGFzdCB0cmlwbGUgcmV0dXJuZWQsICpAZXJyID09IDApCisgKglvciB3aGVuIGl0IGdldHMgYW4gSU8gZXJyb3IgcmVhZGluZyBhbiBpbmRpcmVjdCBibG9jaworICoJCShkaXR0bywgKkBlcnIgPT0gLUVJTykKKyAqCW9yIHdoZW4gaXQgbm90aWNlcyB0aGF0IGNoYWluIGhhZCBiZWVuIGNoYW5nZWQgd2hpbGUgaXQgd2FzIHJlYWRpbmcKKyAqCQkoZGl0dG8sICpAZXJyID09IC1FQUdBSU4pCisgKglvciB3aGVuIGl0IHJlYWRzIGFsbCBAZGVwdGgtMSBpbmRpcmVjdCBibG9ja3Mgc3VjY2Vzc2Z1bGx5IGFuZCBmaW5kcworICoJdGhlIHdob2xlIGNoYWluLCBhbGwgd2F5IHRvIHRoZSBkYXRhIChyZXR1cm5zICVOVUxMLCAqZXJyID09IDApLgorICovCitzdGF0aWMgSW5kaXJlY3QgKmV4dDNfZ2V0X2JyYW5jaChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZGVwdGgsIGludCAqb2Zmc2V0cywKKwkJCQkgSW5kaXJlY3QgY2hhaW5bNF0sIGludCAqZXJyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlJbmRpcmVjdCAqcCA9IGNoYWluOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkqZXJyID0gMDsKKwkvKiBpX2RhdGEgaXMgbm90IGdvaW5nIGF3YXksIG5vIGxvY2sgbmVlZGVkICovCisJYWRkX2NoYWluIChjaGFpbiwgTlVMTCwgRVhUM19JKGlub2RlKS0+aV9kYXRhICsgKm9mZnNldHMpOworCWlmICghcC0+a2V5KQorCQlnb3RvIG5vX2Jsb2NrOworCXdoaWxlICgtLWRlcHRoKSB7CisJCWJoID0gc2JfYnJlYWQoc2IsIGxlMzJfdG9fY3B1KHAtPmtleSkpOworCQlpZiAoIWJoKQorCQkJZ290byBmYWlsdXJlOworCQkvKiBSZWFkZXI6IHBvaW50ZXJzICovCisJCWlmICghdmVyaWZ5X2NoYWluKGNoYWluLCBwKSkKKwkJCWdvdG8gY2hhbmdlZDsKKwkJYWRkX2NoYWluKCsrcCwgYmgsIChfX2xlMzIqKWJoLT5iX2RhdGEgKyAqKytvZmZzZXRzKTsKKwkJLyogUmVhZGVyOiBlbmQgKi8KKwkJaWYgKCFwLT5rZXkpCisJCQlnb3RvIG5vX2Jsb2NrOworCX0KKwlyZXR1cm4gTlVMTDsKKworY2hhbmdlZDoKKwlicmVsc2UoYmgpOworCSplcnIgPSAtRUFHQUlOOworCWdvdG8gbm9fYmxvY2s7CitmYWlsdXJlOgorCSplcnIgPSAtRUlPOworbm9fYmxvY2s6CisJcmV0dXJuIHA7Cit9CisKKy8qKgorICoJZXh0M19maW5kX25lYXIgLSBmaW5kIGEgcGxhY2UgZm9yIGFsbG9jYXRpb24gd2l0aCBzdWZmaWNpZW50IGxvY2FsaXR5CisgKglAaW5vZGU6IG93bmVyCisgKglAaW5kOiBkZXNjcmlwdG9yIG9mIGluZGlyZWN0IGJsb2NrLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcHJlZmVyZWQgcGxhY2UgZm9yIGJsb2NrIGFsbG9jYXRpb24uCisgKglJdCBpcyB1c2VkIHdoZW4gaGV1cmlzdGljIGZvciBzZXF1ZW50aWFsIGFsbG9jYXRpb24gZmFpbHMuCisgKglSdWxlcyBhcmU6CisgKgkgICsgaWYgdGhlcmUgaXMgYSBibG9jayB0byB0aGUgbGVmdCBvZiBvdXIgcG9zaXRpb24gLSBhbGxvY2F0ZSBuZWFyIGl0LgorICoJICArIGlmIHBvaW50ZXIgd2lsbCBsaXZlIGluIGluZGlyZWN0IGJsb2NrIC0gYWxsb2NhdGUgbmVhciB0aGF0IGJsb2NrLgorICoJICArIGlmIHBvaW50ZXIgd2lsbCBsaXZlIGluIGlub2RlIC0gYWxsb2NhdGUgaW4gdGhlIHNhbWUKKyAqCSAgICBjeWxpbmRlciBncm91cC4gCisgKgorICogSW4gdGhlIGxhdHRlciBjYXNlIHdlIGNvbG91ciB0aGUgc3RhcnRpbmcgYmxvY2sgYnkgdGhlIGNhbGxlcnMgUElEIHRvCisgKiBwcmV2ZW50IGl0IGZyb20gY2xhc2hpbmcgd2l0aCBjb25jdXJyZW50IGFsbG9jYXRpb25zIGZvciBhIGRpZmZlcmVudCBpbm9kZQorICogaW4gdGhlIHNhbWUgYmxvY2sgZ3JvdXAuICAgVGhlIFBJRCBpcyB1c2VkIGhlcmUgc28gdGhhdCBmdW5jdGlvbmFsbHkgcmVsYXRlZAorICogZmlsZXMgd2lsbCBiZSBjbG9zZS1ieSBvbi1kaXNrLgorICoKKyAqCUNhbGxlciBtdXN0IG1ha2Ugc3VyZSB0aGF0IEBpbmQgaXMgdmFsaWQgYW5kIHdpbGwgc3RheSB0aGF0IHdheS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBleHQzX2ZpbmRfbmVhcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBJbmRpcmVjdCAqaW5kKQoreworCXN0cnVjdCBleHQzX2lub2RlX2luZm8gKmVpID0gRVhUM19JKGlub2RlKTsKKwlfX2xlMzIgKnN0YXJ0ID0gaW5kLT5iaCA/IChfX2xlMzIqKSBpbmQtPmJoLT5iX2RhdGEgOiBlaS0+aV9kYXRhOworCV9fbGUzMiAqcDsKKwl1bnNpZ25lZCBsb25nIGJnX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgY29sb3VyOworCisJLyogVHJ5IHRvIGZpbmQgcHJldmlvdXMgYmxvY2sgKi8KKwlmb3IgKHAgPSBpbmQtPnAgLSAxOyBwID49IHN0YXJ0OyBwLS0pCisJCWlmICgqcCkKKwkJCXJldHVybiBsZTMyX3RvX2NwdSgqcCk7CisKKwkvKiBObyBzdWNoIHRoaW5nLCBzbyBsZXQncyB0cnkgbG9jYXRpb24gb2YgaW5kaXJlY3QgYmxvY2sgKi8KKwlpZiAoaW5kLT5iaCkKKwkJcmV0dXJuIGluZC0+YmgtPmJfYmxvY2tucjsKKworCS8qCisJICogSXQgaXMgZ29pbmcgdG8gYmUgcmVmZXJlZCBmcm9tIGlub2RlIGl0c2VsZj8gT0ssIGp1c3QgcHV0IGl0IGludG8KKwkgKiB0aGUgc2FtZSBjeWxpbmRlciBncm91cCB0aGVuLgorCSAqLworCWJnX3N0YXJ0ID0gKGVpLT5pX2Jsb2NrX2dyb3VwICogRVhUM19CTE9DS1NfUEVSX0dST1VQKGlub2RlLT5pX3NiKSkgKworCQlsZTMyX3RvX2NwdShFWFQzX1NCKGlub2RlLT5pX3NiKS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKKwljb2xvdXIgPSAoY3VycmVudC0+cGlkICUgMTYpICoKKwkJCShFWFQzX0JMT0NLU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpIC8gMTYpOworCXJldHVybiBiZ19zdGFydCArIGNvbG91cjsKK30KKworLyoqCisgKglleHQzX2ZpbmRfZ29hbCAtIGZpbmQgYSBwcmVmZXJlZCBwbGFjZSBmb3IgYWxsb2NhdGlvbi4KKyAqCUBpbm9kZTogb3duZXIKKyAqCUBibG9jazogIGJsb2NrIHdlIHdhbnQKKyAqCUBjaGFpbjogIGNoYWluIG9mIGluZGlyZWN0IGJsb2NrcworICoJQHBhcnRpYWw6IHBvaW50ZXIgdG8gdGhlIGxhc3QgdHJpcGxlIHdpdGhpbiBhIGNoYWluCisgKglAZ29hbDoJcGxhY2UgdG8gc3RvcmUgdGhlIHJlc3VsdC4KKyAqCisgKglOb3JtYWxseSB0aGlzIGZ1bmN0aW9uIGZpbmQgdGhlIHByZWZlcmVkIHBsYWNlIGZvciBibG9jayBhbGxvY2F0aW9uLAorICoJc3RvcmVzIGl0IGluICpAZ29hbCBhbmQgcmV0dXJucyB6ZXJvLiBJZiB0aGUgYnJhbmNoIGhhZCBiZWVuIGNoYW5nZWQKKyAqCXVuZGVyIHVzIHdlIHJldHVybiAtRUFHQUlOLgorICovCisKK3N0YXRpYyBpbnQgZXh0M19maW5kX2dvYWwoc3RydWN0IGlub2RlICppbm9kZSwgbG9uZyBibG9jaywgSW5kaXJlY3QgY2hhaW5bNF0sCisJCQkgIEluZGlyZWN0ICpwYXJ0aWFsLCB1bnNpZ25lZCBsb25nICpnb2FsKQoreworCXN0cnVjdCBleHQzX2Jsb2NrX2FsbG9jX2luZm8gKmJsb2NrX2kgPSAgRVhUM19JKGlub2RlKS0+aV9ibG9ja19hbGxvY19pbmZvOworCisJLyoKKwkgKiB0cnkgdGhlIGhldXJpc3RpYyBmb3Igc2VxdWVudGlhbCBhbGxvY2F0aW9uLAorCSAqIGZhaWxpbmcgdGhhdCBhdCBsZWFzdCB0cnkgdG8gZ2V0IGRlY2VudCBsb2NhbGl0eS4KKwkgKi8KKwlpZiAoYmxvY2tfaSAmJiAoYmxvY2sgPT0gYmxvY2tfaS0+bGFzdF9hbGxvY19sb2dpY2FsX2Jsb2NrICsgMSkKKwkJJiYgKGJsb2NrX2ktPmxhc3RfYWxsb2NfcGh5c2ljYWxfYmxvY2sgIT0gMCkpIHsKKwkJKmdvYWwgPSBibG9ja19pLT5sYXN0X2FsbG9jX3BoeXNpY2FsX2Jsb2NrICsgMTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHZlcmlmeV9jaGFpbihjaGFpbiwgcGFydGlhbCkpIHsKKwkJKmdvYWwgPSBleHQzX2ZpbmRfbmVhcihpbm9kZSwgcGFydGlhbCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVBR0FJTjsKK30KKworLyoqCisgKglleHQzX2FsbG9jX2JyYW5jaCAtIGFsbG9jYXRlIGFuZCBzZXQgdXAgYSBjaGFpbiBvZiBibG9ja3MuCisgKglAaW5vZGU6IG93bmVyCisgKglAbnVtOiBkZXB0aCBvZiB0aGUgY2hhaW4gKG51bWJlciBvZiBibG9ja3MgdG8gYWxsb2NhdGUpCisgKglAb2Zmc2V0czogb2Zmc2V0cyAoaW4gdGhlIGJsb2NrcykgdG8gc3RvcmUgdGhlIHBvaW50ZXJzIHRvIG5leHQuCisgKglAYnJhbmNoOiBwbGFjZSB0byBzdG9yZSB0aGUgY2hhaW4gaW4uCisgKgorICoJVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgQG51bSBibG9ja3MsIHplcm9lcyBvdXQgYWxsIGJ1dCB0aGUgbGFzdCBvbmUsCisgKglsaW5rcyB0aGVtIGludG8gY2hhaW4gYW5kIChpZiB3ZSBhcmUgc3luY2hyb25vdXMpIHdyaXRlcyB0aGVtIHRvIGRpc2suCisgKglJbiBvdGhlciB3b3JkcywgaXQgcHJlcGFyZXMgYSBicmFuY2ggdGhhdCBjYW4gYmUgc3BsaWNlZCBvbnRvIHRoZQorICoJaW5vZGUuIEl0IHN0b3JlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhhdCBjaGFpbiBpbiB0aGUgYnJhbmNoW10sIGluCisgKgl0aGUgc2FtZSBmb3JtYXQgYXMgZXh0M19nZXRfYnJhbmNoKCkgd291bGQgZG8uIFdlIGFyZSBjYWxsaW5nIGl0IGFmdGVyCisgKgl3ZSBoYWQgcmVhZCB0aGUgZXhpc3RpbmcgcGFydCBvZiBjaGFpbiBhbmQgcGFydGlhbCBwb2ludHMgdG8gdGhlIGxhc3QKKyAqCXRyaXBsZSBvZiB0aGF0IChvbmUgd2l0aCB6ZXJvIC0+a2V5KS4gVXBvbiB0aGUgZXhpdCB3ZSBoYXZlIHRoZSBzYW1lCisgKglwaWN0dXJlIGFzIGFmdGVyIHRoZSBzdWNjZXNzZnVsIGV4dDNfZ2V0X2Jsb2NrKCksIGV4Y3BldCB0aGF0IGluIG9uZQorICoJcGxhY2UgY2hhaW4gaXMgZGlzY29ubmVjdGVkIC0gKmJyYW5jaC0+cCBpcyBzdGlsbCB6ZXJvICh3ZSBkaWQgbm90CisgKglzZXQgdGhlIGxhc3QgbGluayksIGJ1dCBicmFuY2gtPmtleSBjb250YWlucyB0aGUgbnVtYmVyIHRoYXQgc2hvdWxkCisgKgliZSBwbGFjZWQgaW50byAqYnJhbmNoLT5wIHRvIGZpbGwgdGhhdCBnYXAuCisgKgorICoJSWYgYWxsb2NhdGlvbiBmYWlscyB3ZSBmcmVlIGFsbCBibG9ja3Mgd2UndmUgYWxsb2NhdGVkIChhbmQgZm9yZ2V0CisgKgl0aGVpciBidWZmZXJfaGVhZHMpIGFuZCByZXR1cm4gdGhlIGVycm9yIHZhbHVlIHRoZSBmcm9tIGZhaWxlZAorICoJZXh0M19hbGxvY19ibG9jaygpIChub3JtYWxseSAtRU5PU1BDKS4gT3RoZXJ3aXNlIHdlIHNldCB0aGUgY2hhaW4KKyAqCWFzIGRlc2NyaWJlZCBhYm92ZSBhbmQgcmV0dXJuIDAuCisgKi8KKworc3RhdGljIGludCBleHQzX2FsbG9jX2JyYW5jaChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICBpbnQgbnVtLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGdvYWwsCisJCQkgICAgIGludCAqb2Zmc2V0cywKKwkJCSAgICAgSW5kaXJlY3QgKmJyYW5jaCkKK3sKKwlpbnQgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCWludCBuID0gMCwga2V5cyA9IDA7CisJaW50IGVyciA9IDA7CisJaW50IGk7CisJaW50IHBhcmVudCA9IGV4dDNfYWxsb2NfYmxvY2soaGFuZGxlLCBpbm9kZSwgZ29hbCwgJmVycik7CisKKwlicmFuY2hbMF0ua2V5ID0gY3B1X3RvX2xlMzIocGFyZW50KTsKKwlpZiAocGFyZW50KSB7CisJCWZvciAobiA9IDE7IG4gPCBudW07IG4rKykgeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwkJCS8qIEFsbG9jYXRlIHRoZSBuZXh0IGJsb2NrICovCisJCQlpbnQgbnIgPSBleHQzX2FsbG9jX2Jsb2NrKGhhbmRsZSwgaW5vZGUsIHBhcmVudCwgJmVycik7CisJCQlpZiAoIW5yKQorCQkJCWJyZWFrOworCQkJYnJhbmNoW25dLmtleSA9IGNwdV90b19sZTMyKG5yKTsKKwkJCWtleXMgPSBuKzE7CisKKwkJCS8qCisJCQkgKiBHZXQgYnVmZmVyX2hlYWQgZm9yIHBhcmVudCBibG9jaywgemVybyBpdCBvdXQKKwkJCSAqIGFuZCBzZXQgdGhlIHBvaW50ZXIgdG8gbmV3IG9uZSwgdGhlbiBzZW5kCisJCQkgKiBwYXJlbnQgdG8gZGlzay4gIAorCQkJICovCisJCQliaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgcGFyZW50KTsKKwkJCWJyYW5jaFtuXS5iaCA9IGJoOworCQkJbG9ja19idWZmZXIoYmgpOworCQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBnZXRfY3JlYXRlX2FjY2VzcyIpOworCQkJZXJyID0gZXh0M19qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQkJaWYgKGVycikgeworCQkJCXVubG9ja19idWZmZXIoYmgpOworCQkJCWJyZWxzZShiaCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCW1lbXNldChiaC0+Yl9kYXRhLCAwLCBibG9ja3NpemUpOworCQkJYnJhbmNoW25dLnAgPSAoX19sZTMyKikgYmgtPmJfZGF0YSArIG9mZnNldHNbbl07CisJCQkqYnJhbmNoW25dLnAgPSBicmFuY2hbbl0ua2V5OworCQkJQlVGRkVSX1RSQUNFKGJoLCAibWFya2luZyB1cHRvZGF0ZSIpOworCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKworCQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKKwkJCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisKKwkJCXBhcmVudCA9IG5yOworCQl9CisJfQorCWlmIChuID09IG51bSkKKwkJcmV0dXJuIDA7CisKKwkvKiBBbGxvY2F0aW9uIGZhaWxlZCwgZnJlZSB3aGF0IHdlIGFscmVhZHkgYWxsb2NhdGVkICovCisJZm9yIChpID0gMTsgaSA8IGtleXM7IGkrKykgeworCQlCVUZGRVJfVFJBQ0UoYnJhbmNoW2ldLmJoLCAiY2FsbCBqb3VybmFsX2ZvcmdldCIpOworCQlleHQzX2pvdXJuYWxfZm9yZ2V0KGhhbmRsZSwgYnJhbmNoW2ldLmJoKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGtleXM7IGkrKykKKwkJZXh0M19mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBsZTMyX3RvX2NwdShicmFuY2hbaV0ua2V5KSwgMSk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKglleHQzX3NwbGljZV9icmFuY2ggLSBzcGxpY2UgdGhlIGFsbG9jYXRlZCBicmFuY2ggb250byBpbm9kZS4KKyAqCUBpbm9kZTogb3duZXIKKyAqCUBibG9jazogKGxvZ2ljYWwpIG51bWJlciBvZiBibG9jayB3ZSBhcmUgYWRkaW5nCisgKglAY2hhaW46IGNoYWluIG9mIGluZGlyZWN0IGJsb2NrcyAod2l0aCBhIG1pc3NpbmcgbGluayAtIHNlZQorICoJCWV4dDNfYWxsb2NfYnJhbmNoKQorICoJQHdoZXJlOiBsb2NhdGlvbiBvZiBtaXNzaW5nIGxpbmsKKyAqCUBudW06ICAgbnVtYmVyIG9mIGJsb2NrcyB3ZSBhcmUgYWRkaW5nCisgKgorICoJVGhpcyBmdW5jdGlvbiB2ZXJpZmllcyB0aGF0IGNoYWluICh1cCB0byB0aGUgbWlzc2luZyBsaW5rKSBoYWQgbm90CisgKgljaGFuZ2VkLCBmaWxscyB0aGUgbWlzc2luZyBsaW5rIGFuZCBkb2VzIGFsbCBob3VzZWtlZXBpbmcgbmVlZGVkIGluCisgKglpbm9kZSAoLT5pX2Jsb2NrcywgZXRjLikuIEluIGNhc2Ugb2Ygc3VjY2VzcyB3ZSBlbmQgdXAgd2l0aCB0aGUgZnVsbAorICoJY2hhaW4gdG8gbmV3IGJsb2NrIGFuZCByZXR1cm4gMC4gT3RoZXJ3aXNlICg9PSBjaGFpbiBoYWQgYmVlbiBjaGFuZ2VkKQorICoJd2UgZnJlZSB0aGUgbmV3IGJsb2NrcyAoZm9yZ2V0dGluZyB0aGVpciBidWZmZXJfaGVhZHMsIGluZGVlZCkgYW5kCisgKglyZXR1cm4gLUVBR0FJTi4KKyAqLworCitzdGF0aWMgaW50IGV4dDNfc3BsaWNlX2JyYW5jaChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb25nIGJsb2NrLAorCQkJICAgICAgSW5kaXJlY3QgY2hhaW5bNF0sIEluZGlyZWN0ICp3aGVyZSwgaW50IG51bSkKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgZXh0M19ibG9ja19hbGxvY19pbmZvICpibG9ja19pID0gRVhUM19JKGlub2RlKS0+aV9ibG9ja19hbGxvY19pbmZvOworCisJLyoKKwkgKiBJZiB3ZSdyZSBzcGxpY2luZyBpbnRvIGEgW3RkXWluZGlyZWN0IGJsb2NrIChhcyBvcHBvc2VkIHRvIHRoZQorCSAqIGlub2RlKSB0aGVuIHdlIG5lZWQgdG8gZ2V0IHdyaXRlIGFjY2VzcyB0byB0aGUgW3RkXWluZGlyZWN0IGJsb2NrCisJICogYmVmb3JlIHRoZSBzcGxpY2UuCisJICovCisJaWYgKHdoZXJlLT5iaCkgeworCQlCVUZGRVJfVFJBQ0Uod2hlcmUtPmJoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOworCQllcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIHdoZXJlLT5iaCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIFZlcmlmeSB0aGF0IHBsYWNlIHdlIGFyZSBzcGxpY2luZyB0byBpcyBzdGlsbCB0aGVyZSBhbmQgdmFjYW50ICovCisKKwlpZiAoIXZlcmlmeV9jaGFpbihjaGFpbiwgd2hlcmUtMSkgfHwgKndoZXJlLT5wKQorCQkvKiBXcml0ZXI6IGVuZCAqLworCQlnb3RvIGNoYW5nZWQ7CisKKwkvKiBUaGF0J3MgaXQgKi8KKworCSp3aGVyZS0+cCA9IHdoZXJlLT5rZXk7CisKKwkvKgorCSAqIHVwZGF0ZSB0aGUgbW9zdCByZWNlbnRseSBhbGxvY2F0ZWQgbG9naWNhbCAmIHBoeXNpY2FsIGJsb2NrCisJICogaW4gaV9ibG9ja19hbGxvY19pbmZvLCB0byBhc3Npc3QgZmluZCB0aGUgcHJvcGVyIGdvYWwgYmxvY2sgZm9yIG5leHQKKwkgKiBhbGxvY2F0aW9uCisJICovCisJaWYgKGJsb2NrX2kpIHsKKwkJYmxvY2tfaS0+bGFzdF9hbGxvY19sb2dpY2FsX2Jsb2NrID0gYmxvY2s7CisJCWJsb2NrX2ktPmxhc3RfYWxsb2NfcGh5c2ljYWxfYmxvY2sgPSBsZTMyX3RvX2NwdSh3aGVyZVtudW0tMV0ua2V5KTsKKwl9CisKKwkvKiBXZSBhcmUgZG9uZSB3aXRoIGF0b21pYyBzdHVmZiwgbm93IGRvIHRoZSByZXN0IG9mIGhvdXNla2VlcGluZyAqLworCisJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKworCS8qIGhhZCB3ZSBzcGxpY2VkIGl0IG9udG8gaW5kaXJlY3QgYmxvY2s/ICovCisJaWYgKHdoZXJlLT5iaCkgeworCQkvKgorCQkgKiBha3BtOiBJZiB3ZSBzcGxpY2VkIGl0IG9udG8gYW4gaW5kaXJlY3QgYmxvY2ssIHdlIGhhdmVuJ3QKKwkJICogYWx0ZXJlZCB0aGUgaW5vZGUuICBOb3RlIGhvd2V2ZXIgdGhhdCBpZiBpdCBpcyBiZWluZyBzcGxpY2VkCisJCSAqIG9udG8gYW4gaW5kaXJlY3QgYmxvY2sgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBmaWxlICh0aGUKKwkJICogZmlsZSBpcyBncm93aW5nKSB0aGVuIHdlICp3aWxsKiBhbHRlciB0aGUgaW5vZGUgdG8gcmVmbGVjdAorCQkgKiB0aGUgbmV3IGlfc2l6ZS4gIEJ1dCB0aGF0IGlzIG5vdCBkb25lIGhlcmUgLSBpdCBpcyBkb25lIGluCisJCSAqIGdlbmVyaWNfY29tbWl0X3dyaXRlLT5fX21hcmtfaW5vZGVfZGlydHktPmV4dDNfZGlydHlfaW5vZGUuCisJCSAqLworCQlqYmRfZGVidWcoNSwgInNwbGljaW5nIGluZGlyZWN0IG9ubHlcbiIpOworCQlCVUZGRVJfVFJBQ0Uod2hlcmUtPmJoLCAiY2FsbCBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKKwkJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgd2hlcmUtPmJoKTsKKwkJaWYgKGVycikgCisJCQlnb3RvIGVycl9vdXQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogT0ssIHdlIHNwbGljZWQgaXQgaW50byB0aGUgaW5vZGUgaXRzZWxmIG9uIGEgZGlyZWN0IGJsb2NrLgorCQkgKiBJbm9kZSB3YXMgZGlydGllZCBhYm92ZS4KKwkJICovCisJCWpiZF9kZWJ1Zyg1LCAic3BsaWNpbmcgZGlyZWN0XG4iKTsKKwl9CisJcmV0dXJuIGVycjsKKworY2hhbmdlZDoKKwkvKgorCSAqIEFLUE06IGlmIHdoZXJlW2ldLmJoIGlzbid0IHBhcnQgb2YgdGhlIGN1cnJlbnQgdXBkYXRpbmcKKwkgKiB0cmFuc2FjdGlvbiB0aGVuIHdlIGV4cGxvZGUgbmFzdGlseS4gIFRlc3QgdGhpcyBjb2RlIHBhdGguCisJICovCisJamJkX2RlYnVnKDEsICJ0aGUgY2hhaW4gY2hhbmdlZDogdHJ5IGFnYWluXG4iKTsKKwllcnIgPSAtRUFHQUlOOworCitlcnJfb3V0OgorCWZvciAoaSA9IDE7IGkgPCBudW07IGkrKykgeworCQlCVUZGRVJfVFJBQ0Uod2hlcmVbaV0uYmgsICJjYWxsIGpvdXJuYWxfZm9yZ2V0Iik7CisJCWV4dDNfam91cm5hbF9mb3JnZXQoaGFuZGxlLCB3aGVyZVtpXS5iaCk7CisJfQorCS8qIEZvciB0aGUgbm9ybWFsIGNvbGxpc2lvbiBjbGVhbnVwIGNhc2UsIHdlIGZyZWUgdXAgdGhlIGJsb2Nrcy4KKwkgKiBPbiBnZW51aW5lIGZpbGVzeXN0ZW0gZXJyb3JzIHdlIGRvbid0IGV2ZW4gdGhpbmsgYWJvdXQgZG9pbmcKKwkgKiB0aGF0LiAqLworCWlmIChlcnIgPT0gLUVBR0FJTikKKwkJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorCQkJZXh0M19mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCAKKwkJCQkJIGxlMzJfdG9fY3B1KHdoZXJlW2ldLmtleSksIDEpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBBbGxvY2F0aW9uIHN0cmF0ZWd5IGlzIHNpbXBsZTogaWYgd2UgaGF2ZSB0byBhbGxvY2F0ZSBzb21ldGhpbmcsIHdlIHdpbGwKKyAqIGhhdmUgdG8gZ28gdGhlIHdob2xlIHdheSB0byBsZWFmLiBTbyBsZXQncyBkbyBpdCBiZWZvcmUgYXR0YWNoaW5nIGFueXRoaW5nCisgKiB0byB0cmVlLCBzZXQgbGlua2FnZSBiZXR3ZWVuIHRoZSBuZXdib3JuIGJsb2Nrcywgd3JpdGUgdGhlbSBpZiBzeW5jIGlzCisgKiByZXF1aXJlZCwgcmVjaGVjayB0aGUgcGF0aCwgZnJlZSBhbmQgcmVwZWF0IGlmIGNoZWNrIGZhaWxzLCBvdGhlcndpc2UKKyAqIHNldCB0aGUgbGFzdCBtaXNzaW5nIGxpbmsgKHRoYXQgd2lsbCBwcm90ZWN0IHVzIGZyb20gYW55IHRydW5jYXRlLWdlbmVyYXRlZAorICogcmVtb3ZhbHMgLSBhbGwgYmxvY2tzIG9uIHRoZSBwYXRoIGFyZSBpbW11bmUgbm93KSBhbmQgcG9zc2libHkgZm9yY2UgdGhlCisgKiB3cml0ZSBvbiB0aGUgcGFyZW50IGJsb2NrLgorICogVGhhdCBoYXMgYSBuaWNlIGFkZGl0aW9uYWwgcHJvcGVydHk6IG5vIHNwZWNpYWwgcmVjb3ZlcnkgZnJvbSB0aGUgZmFpbGVkCisgKiBhbGxvY2F0aW9ucyBpcyBuZWVkZWQgLSB3ZSBzaW1wbHkgcmVsZWFzZSBibG9ja3MgYW5kIGRvIG5vdCB0b3VjaCBhbnl0aGluZworICogcmVhY2hhYmxlIGZyb20gaW5vZGUuCisgKgorICogYWtwbTogYGhhbmRsZScgY2FuIGJlIE5VTEwgaWYgY3JlYXRlID09IDAuCisgKgorICogVGhlIEJLTCBtYXkgbm90IGJlIGhlbGQgb24gZW50cnkgaGVyZS4gIEJlIHN1cmUgdG8gdGFrZSBpdCBlYXJseS4KKyAqLworCitzdGF0aWMgaW50CitleHQzX2dldF9ibG9ja19oYW5kbGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgaWJsb2NrLAorCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSwgaW50IGV4dGVuZF9kaXNrc2l6ZSkKK3sKKwlpbnQgZXJyID0gLUVJTzsKKwlpbnQgb2Zmc2V0c1s0XTsKKwlJbmRpcmVjdCBjaGFpbls0XTsKKwlJbmRpcmVjdCAqcGFydGlhbDsKKwl1bnNpZ25lZCBsb25nIGdvYWw7CisJaW50IGxlZnQ7CisJaW50IGJvdW5kYXJ5ID0gMDsKKwlpbnQgZGVwdGggPSBleHQzX2Jsb2NrX3RvX3BhdGgoaW5vZGUsIGlibG9jaywgb2Zmc2V0cywgJmJvdW5kYXJ5KTsKKwlzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvICplaSA9IEVYVDNfSShpbm9kZSk7CisKKwlKX0FTU0VSVChoYW5kbGUgIT0gTlVMTCB8fCBjcmVhdGUgPT0gMCk7CisKKwlpZiAoZGVwdGggPT0gMCkKKwkJZ290byBvdXQ7CisKK3JlcmVhZDoKKwlwYXJ0aWFsID0gZXh0M19nZXRfYnJhbmNoKGlub2RlLCBkZXB0aCwgb2Zmc2V0cywgY2hhaW4sICZlcnIpOworCisJLyogU2ltcGxlc3QgY2FzZSAtIGJsb2NrIGZvdW5kLCBubyBhbGxvY2F0aW9uIG5lZWRlZCAqLworCWlmICghcGFydGlhbCkgeworCQljbGVhcl9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7Citnb3RfaXQ6CisJCW1hcF9iaChiaF9yZXN1bHQsIGlub2RlLT5pX3NiLCBsZTMyX3RvX2NwdShjaGFpbltkZXB0aC0xXS5rZXkpKTsKKwkJaWYgKGJvdW5kYXJ5KQorCQkJc2V0X2J1ZmZlcl9ib3VuZGFyeShiaF9yZXN1bHQpOworCQkvKiBDbGVhbiB1cCBhbmQgZXhpdCAqLworCQlwYXJ0aWFsID0gY2hhaW4rZGVwdGgtMTsgLyogdGhlIHdob2xlIGNoYWluICovCisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBOZXh0IHNpbXBsZSBjYXNlIC0gcGxhaW4gbG9va3VwIG9yIGZhaWxlZCByZWFkIG9mIGluZGlyZWN0IGJsb2NrICovCisJaWYgKCFjcmVhdGUgfHwgZXJyID09IC1FSU8pIHsKK2NsZWFudXA6CisJCXdoaWxlIChwYXJ0aWFsID4gY2hhaW4pIHsKKwkJCUJVRkZFUl9UUkFDRShwYXJ0aWFsLT5iaCwgImNhbGwgYnJlbHNlIik7CisJCQlicmVsc2UocGFydGlhbC0+YmgpOworCQkJcGFydGlhbC0tOworCQl9CisJCUJVRkZFUl9UUkFDRShiaF9yZXN1bHQsICJyZXR1cm5lZCIpOworb3V0OgorCQlyZXR1cm4gZXJyOworCX0KKworCS8qCisJICogSW5kaXJlY3QgYmxvY2sgbWlnaHQgYmUgcmVtb3ZlZCBieSB0cnVuY2F0ZSB3aGlsZSB3ZSB3ZXJlCisJICogcmVhZGluZyBpdC4gSGFuZGxpbmcgb2YgdGhhdCBjYXNlIChmb3JnZXQgd2hhdCB3ZSd2ZSBnb3QgYW5kCisJICogcmVyZWFkKSBpcyB0YWtlbiBvdXQgb2YgdGhlIG1haW4gcGF0aC4KKwkgKi8KKwlpZiAoZXJyID09IC1FQUdBSU4pCisJCWdvdG8gY2hhbmdlZDsKKworCWdvYWwgPSAwOworCWRvd24oJmVpLT50cnVuY2F0ZV9zZW0pOworCisJLyogbGF6eSBpbml0aWFsaXplIHRoZSBibG9jayBhbGxvY2F0aW9uIGluZm8gaGVyZSBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiAoIWVpLT5pX2Jsb2NrX2FsbG9jX2luZm8pKSB7CisJCWV4dDNfaW5pdF9ibG9ja19hbGxvY19pbmZvKGlub2RlKTsKKwl9CisKKwlpZiAoZXh0M19maW5kX2dvYWwoaW5vZGUsIGlibG9jaywgY2hhaW4sIHBhcnRpYWwsICZnb2FsKSA8IDApIHsKKwkJdXAoJmVpLT50cnVuY2F0ZV9zZW0pOworCQlnb3RvIGNoYW5nZWQ7CisJfQorCisJbGVmdCA9IChjaGFpbiArIGRlcHRoKSAtIHBhcnRpYWw7CisKKwkvKgorCSAqIEJsb2NrIG91dCBleHQzX3RydW5jYXRlIHdoaWxlIHdlIGFsdGVyIHRoZSB0cmVlCisJICovCisJZXJyID0gZXh0M19hbGxvY19icmFuY2goaGFuZGxlLCBpbm9kZSwgbGVmdCwgZ29hbCwKKwkJCQkJb2Zmc2V0cysocGFydGlhbC1jaGFpbiksIHBhcnRpYWwpOworCisJLyogVGhlIGV4dDNfc3BsaWNlX2JyYW5jaCBjYWxsIHdpbGwgZnJlZSBhbmQgZm9yZ2V0IGFueSBidWZmZXJzCisJICogb24gdGhlIG5ldyBjaGFpbiBpZiB0aGVyZSBpcyBhIGZhaWx1cmUsIGJ1dCB0aGF0IHJpc2tzIHVzaW5nCisJICogdXAgdHJhbnNhY3Rpb24gY3JlZGl0cywgZXNwZWNpYWxseSBmb3IgYml0bWFwcyB3aGVyZSB0aGUKKwkgKiBjcmVkaXRzIGNhbm5vdCBiZSByZXR1cm5lZC4gIENhbiB3ZSBoYW5kbGUgdGhpcyBzb21laG93PyAgV2UKKwkgKiBtYXkgbmVlZCB0byByZXR1cm4gLUVBR0FJTiB1cHdhcmRzIGluIHRoZSB3b3JzdCBjYXNlLiAgLS1zY3QgKi8KKwlpZiAoIWVycikKKwkJZXJyID0gZXh0M19zcGxpY2VfYnJhbmNoKGhhbmRsZSwgaW5vZGUsIGlibG9jaywgY2hhaW4sCisJCQkJCSBwYXJ0aWFsLCBsZWZ0KTsKKwkvKiBpX2Rpc2tzaXplIGdyb3dpbmcgaXMgcHJvdGVjdGVkIGJ5IHRydW5jYXRlX3NlbQorCSAqIGRvbid0IGZvcmdldCB0byBwcm90ZWN0IGl0IGlmIHlvdSdyZSBhYm91dCB0byBpbXBsZW1lbnQKKwkgKiBjb25jdXJyZW50IGV4dDNfZ2V0X2Jsb2NrKCkgLWJ6enogKi8KKwlpZiAoIWVyciAmJiBleHRlbmRfZGlza3NpemUgJiYgaW5vZGUtPmlfc2l6ZSA+IGVpLT5pX2Rpc2tzaXplKQorCQllaS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJdXAoJmVpLT50cnVuY2F0ZV9zZW0pOworCWlmIChlcnIgPT0gLUVBR0FJTikKKwkJZ290byBjaGFuZ2VkOworCWlmIChlcnIpCisJCWdvdG8gY2xlYW51cDsKKworCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJZ290byBnb3RfaXQ7CisKK2NoYW5nZWQ6CisJd2hpbGUgKHBhcnRpYWwgPiBjaGFpbikgeworCQlqYmRfZGVidWcoMSwgImJ1ZmZlciBjaGFpbiBjaGFuZ2VkLCByZXRyeWluZ1xuIik7CisJCUJVRkZFUl9UUkFDRShwYXJ0aWFsLT5iaCwgImJyZWxzaW5nIik7CisJCWJyZWxzZShwYXJ0aWFsLT5iaCk7CisJCXBhcnRpYWwtLTsKKwl9CisJZ290byByZXJlYWQ7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19nZXRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgaWJsb2NrLAorCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CisJaW50IHJldDsKKworCWlmIChjcmVhdGUpIHsKKwkJaGFuZGxlID0gZXh0M19qb3VybmFsX2N1cnJlbnRfaGFuZGxlKCk7CisJCUpfQVNTRVJUKGhhbmRsZSAhPSAwKTsKKwl9CisJcmV0ID0gZXh0M19nZXRfYmxvY2tfaGFuZGxlKGhhbmRsZSwgaW5vZGUsIGlibG9jaywKKwkJCQliaF9yZXN1bHQsIGNyZWF0ZSwgMSk7CisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBESU9fQ1JFRElUUyAoRVhUM19SRVNFUlZFX1RSQU5TX0JMT0NLUyArIDMyKQorCitzdGF0aWMgaW50CitleHQzX2RpcmVjdF9pb19nZXRfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKKwkJdW5zaWduZWQgbG9uZyBtYXhfYmxvY2tzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKKwkJaW50IGNyZWF0ZSkKK3sKKwloYW5kbGVfdCAqaGFuZGxlID0gam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOworCWludCByZXQgPSAwOworCisJaWYgKCFoYW5kbGUpCisJCWdvdG8gZ2V0X2Jsb2NrOwkJLyogQSByZWFkICovCisKKwlpZiAoaGFuZGxlLT5oX3RyYW5zYWN0aW9uLT50X3N0YXRlID09IFRfTE9DS0VEKSB7CisJCS8qCisJCSAqIEh1Z2UgZGlyZWN0LWlvIHdyaXRlcyBjYW4gaG9sZCBvZmYgY29tbWl0cyBmb3IgbG9uZworCQkgKiBwZXJpb2RzIG9mIHRpbWUuICBMZXQgdGhpcyBjb21taXQgcnVuLgorCQkgKi8KKwkJZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwkJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCBESU9fQ1JFRElUUyk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJZ290byBnZXRfYmxvY2s7CisJfQorCisJaWYgKGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cyA8PSBFWFQzX1JFU0VSVkVfVFJBTlNfQkxPQ0tTKSB7CisJCS8qCisJCSAqIEdldHRpbmcgbG93IG9uIGJ1ZmZlciBjcmVkaXRzLi4uCisJCSAqLworCQlyZXQgPSBleHQzX2pvdXJuYWxfZXh0ZW5kKGhhbmRsZSwgRElPX0NSRURJVFMpOworCQlpZiAocmV0ID4gMCkgeworCQkJLyoKKwkJCSAqIENvdWxkbid0IGV4dGVuZCB0aGUgdHJhbnNhY3Rpb24uICBTdGFydCBhIG5ldyBvbmUuCisJCQkgKi8KKwkJCXJldCA9IGV4dDNfam91cm5hbF9yZXN0YXJ0KGhhbmRsZSwgRElPX0NSRURJVFMpOworCQl9CisJfQorCitnZXRfYmxvY2s6CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBleHQzX2dldF9ibG9ja19oYW5kbGUoaGFuZGxlLCBpbm9kZSwgaWJsb2NrLAorCQkJCQliaF9yZXN1bHQsIGNyZWF0ZSwgMCk7CisJYmhfcmVzdWx0LT5iX3NpemUgPSAoMSA8PCBpbm9kZS0+aV9ibGtiaXRzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGV4dDNfd3JpdGVwYWdlc19nZXRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgaWJsb2NrLAorCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IGNyZWF0ZSkKK3sKKwlyZXR1cm4gZXh0M19kaXJlY3RfaW9fZ2V0X2Jsb2Nrcyhpbm9kZSwgaWJsb2NrLCAxLCBiaCwgY3JlYXRlKTsKK30KKworLyoKKyAqIGBoYW5kbGUnIGNhbiBiZSBOVUxMIGlmIGNyZWF0ZSBpcyB6ZXJvCisgKi8KK3N0cnVjdCBidWZmZXJfaGVhZCAqZXh0M19nZXRibGsoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICogaW5vZGUsCisJCQkJbG9uZyBibG9jaywgaW50IGNyZWF0ZSwgaW50ICogZXJycCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgZHVtbXk7CisJaW50IGZhdGFsID0gMCwgZXJyOworCisJSl9BU1NFUlQoaGFuZGxlICE9IE5VTEwgfHwgY3JlYXRlID09IDApOworCisJZHVtbXkuYl9zdGF0ZSA9IDA7CisJZHVtbXkuYl9ibG9ja25yID0gLTEwMDA7CisJYnVmZmVyX3RyYWNlX2luaXQoJmR1bW15LmJfaGlzdG9yeSk7CisJKmVycnAgPSBleHQzX2dldF9ibG9ja19oYW5kbGUoaGFuZGxlLCBpbm9kZSwgYmxvY2ssICZkdW1teSwgY3JlYXRlLCAxKTsKKwlpZiAoISplcnJwICYmIGJ1ZmZlcl9tYXBwZWQoJmR1bW15KSkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQliaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgZHVtbXkuYl9ibG9ja25yKTsKKwkJaWYgKGJ1ZmZlcl9uZXcoJmR1bW15KSkgeworCQkJSl9BU1NFUlQoY3JlYXRlICE9IDApOworCQkJSl9BU1NFUlQoaGFuZGxlICE9IDApOworCisJCQkvKiBOb3cgdGhhdCB3ZSBkbyBub3QgYWx3YXlzIGpvdXJuYWwgZGF0YSwgd2UKKwkJCSAgIHNob3VsZCBrZWVwIGluIG1pbmQgd2hldGhlciB0aGlzIHNob3VsZAorCQkJICAgYWx3YXlzIGpvdXJuYWwgdGhlIG5ldyBidWZmZXIgYXMgbWV0YWRhdGEuCisJCQkgICBGb3Igbm93LCByZWd1bGFyIGZpbGUgd3JpdGVzIHVzZQorCQkJICAgZXh0M19nZXRfYmxvY2sgaW5zdGVhZCwgc28gaXQncyBub3QgYQorCQkJICAgcHJvYmxlbS4gKi8KKwkJCWxvY2tfYnVmZmVyKGJoKTsKKwkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZ2V0X2NyZWF0ZV9hY2Nlc3MiKTsKKwkJCWZhdGFsID0gZXh0M19qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQkJaWYgKCFmYXRhbCAmJiAhYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJCW1lbXNldChiaC0+Yl9kYXRhLCAwLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJfQorCQkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCQkJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCQkJaWYgKCFmYXRhbCkKKwkJCQlmYXRhbCA9IGVycjsKKwkJfSBlbHNlIHsKKwkJCUJVRkZFUl9UUkFDRShiaCwgIm5vdCBhIG5ldyBidWZmZXIiKTsKKwkJfQorCQlpZiAoZmF0YWwpIHsKKwkJCSplcnJwID0gZmF0YWw7CisJCQlicmVsc2UoYmgpOworCQkJYmggPSBOVUxMOworCQl9CisJCXJldHVybiBiaDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBidWZmZXJfaGVhZCAqZXh0M19icmVhZChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKKwkJCSAgICAgICBpbnQgYmxvY2ssIGludCBjcmVhdGUsIGludCAqZXJyKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCisJYmggPSBleHQzX2dldGJsayhoYW5kbGUsIGlub2RlLCBibG9jaywgY3JlYXRlLCBlcnIpOworCWlmICghYmgpCisJCXJldHVybiBiaDsKKwlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJcmV0dXJuIGJoOworCWxsX3J3X2Jsb2NrKFJFQUQsIDEsICZiaCk7CisJd2FpdF9vbl9idWZmZXIoYmgpOworCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKQorCQlyZXR1cm4gYmg7CisJcHV0X2JoKGJoKTsKKwkqZXJyID0gLUVJTzsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCB3YWxrX3BhZ2VfYnVmZmVycygJaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsCisJCQkJdW5zaWduZWQgZnJvbSwKKwkJCQl1bnNpZ25lZCB0bywKKwkJCQlpbnQgKnBhcnRpYWwsCisJCQkJaW50ICgqZm4pKAloYW5kbGVfdCAqaGFuZGxlLAorCQkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwl1bnNpZ25lZCBibG9ja19zdGFydCwgYmxvY2tfZW5kOworCXVuc2lnbmVkIGJsb2Nrc2l6ZSA9IGhlYWQtPmJfc2l6ZTsKKwlpbnQgZXJyLCByZXQgPSAwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV4dDsKKworCWZvciAoCWJoID0gaGVhZCwgYmxvY2tfc3RhcnQgPSAwOworCQlyZXQgPT0gMCAmJiAoYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQpOworCSAgICAJYmxvY2tfc3RhcnQgPSBibG9ja19lbmQsIGJoID0gbmV4dCkKKwl7CisJCW5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7CisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYmxvY2tzaXplOworCQlpZiAoYmxvY2tfZW5kIDw9IGZyb20gfHwgYmxvY2tfc3RhcnQgPj0gdG8pIHsKKwkJCWlmIChwYXJ0aWFsICYmICFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQkJCSpwYXJ0aWFsID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVyciA9ICgqZm4pKGhhbmRsZSwgYmgpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGVycjsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRvIHByZXNlcnZlIG9yZGVyaW5nLCBpdCBpcyBlc3NlbnRpYWwgdGhhdCB0aGUgaG9sZSBpbnN0YW50aWF0aW9uIGFuZAorICogdGhlIGRhdGEgd3JpdGUgYmUgZW5jYXBzdWxhdGVkIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLiAgV2UgY2Fubm90CisgKiBjbG9zZSBvZmYgYSB0cmFuc2FjdGlvbiBhbmQgc3RhcnQgYSBuZXcgb25lIGJldHdlZW4gdGhlIGV4dDNfZ2V0X2Jsb2NrKCkKKyAqIGFuZCB0aGUgY29tbWl0X3dyaXRlKCkuICBTbyBkb2luZyB0aGUgam91cm5hbF9zdGFydCBhdCB0aGUgc3RhcnQgb2YKKyAqIHByZXBhcmVfd3JpdGUoKSBpcyB0aGUgcmlnaHQgcGxhY2UuCisgKgorICogQWxzbywgdGhpcyBmdW5jdGlvbiBjYW4gbmVzdCBpbnNpZGUgZXh0M193cml0ZXBhZ2UoKSAtPgorICogYmxvY2tfd3JpdGVfZnVsbF9wYWdlKCkuIEluIHRoYXQgY2FzZSwgd2UgKmtub3cqIHRoYXQgZXh0M193cml0ZXBhZ2UoKQorICogaGFzIGdlbmVyYXRlZCBlbm91Z2ggYnVmZmVyIGNyZWRpdHMgdG8gZG8gdGhlIHdob2xlIHBhZ2UuICBTbyB3ZSB3b24ndAorICogYmxvY2sgb24gdGhlIGpvdXJuYWwgaW4gdGhhdCBjYXNlLCB3aGljaCBpcyBnb29kLCBiZWNhdXNlIHRoZSBjYWxsZXIgbWF5CisgKiBiZSBQRl9NRU1BTExPQy4KKyAqCisgKiBCeSBhY2NpZGVudCwgZXh0MyBjYW4gYmUgcmVlbnRlcmVkIHdoZW4gYSB0cmFuc2FjdGlvbiBpcyBvcGVuIHZpYQorICogcXVvdGEgZmlsZSB3cml0ZXMuICBJZiB3ZSB3ZXJlIHRvIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24gd2hpbGUgdGh1cworICogcmVlbnRlcmVkLCB0aGVyZSBjYW4gYmUgYSBkZWFkbG9jayAtIHdlIHdvdWxkIGJlIGhvbGRpbmcgYSBxdW90YQorICogbG9jaywgYW5kIHRoZSBjb21taXQgd291bGQgbmV2ZXIgY29tcGxldGUgaWYgYW5vdGhlciB0aHJlYWQgaGFkIGEKKyAqIHRyYW5zYWN0aW9uIG9wZW4gYW5kIHdhcyBibG9ja2luZyBvbiB0aGUgcXVvdGEgbG9jayAtIGEgcmFua2luZworICogdmlvbGF0aW9uLgorICoKKyAqIFNvIHdoYXQgd2UgZG8gaXMgdG8gcmVseSBvbiB0aGUgZmFjdCB0aGF0IGpvdXJuYWxfc3RvcC9qb3VybmFsX3N0YXJ0CisgKiB3aWxsIF9ub3RfIHJ1biBjb21taXQgdW5kZXIgdGhlc2UgY2lyY3Vtc3RhbmNlcyBiZWNhdXNlIGhhbmRsZS0+aF9yZWYKKyAqIGlzIGVsZXZhdGVkLiAgV2UnbGwgc3RpbGwgaGF2ZSBlbm91Z2ggY3JlZGl0cyBmb3IgdGhlIHRpbnkgcXVvdGFmaWxlCisgKiB3cml0ZS4gIAorICovCisKK3N0YXRpYyBpbnQgZG9fam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZV90ICpoYW5kbGUsIAorCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWlmICghYnVmZmVyX21hcHBlZChiaCkgfHwgYnVmZmVyX2ZyZWVkKGJoKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworfQorCitzdGF0aWMgaW50IGV4dDNfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICAgICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlpbnQgcmV0LCBuZWVkZWRfYmxvY2tzID0gZXh0M193cml0ZXBhZ2VfdHJhbnNfYmxvY2tzKGlub2RlKTsKKwloYW5kbGVfdCAqaGFuZGxlOworCWludCByZXRyaWVzID0gMDsKKworcmV0cnk6CisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCBuZWVkZWRfYmxvY2tzKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBOT0JIKSkKKwkJcmV0ID0gbm9iaF9wcmVwYXJlX3dyaXRlKHBhZ2UsIGZyb20sIHRvLCBleHQzX2dldF9ibG9jayk7CisJZWxzZQorCQlyZXQgPSBibG9ja19wcmVwYXJlX3dyaXRlKHBhZ2UsIGZyb20sIHRvLCBleHQzX2dldF9ibG9jayk7CisJaWYgKHJldCkKKwkJZ290byBwcmVwYXJlX3dyaXRlX2ZhaWxlZDsKKworCWlmIChleHQzX3Nob3VsZF9qb3VybmFsX2RhdGEoaW5vZGUpKSB7CisJCXJldCA9IHdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwgcGFnZV9idWZmZXJzKHBhZ2UpLAorCQkJCWZyb20sIHRvLCBOVUxMLCBkb19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MpOworCX0KK3ByZXBhcmVfd3JpdGVfZmFpbGVkOgorCWlmIChyZXQpCisJCWV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKHJldCA9PSAtRU5PU1BDICYmIGV4dDNfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCisJCWdvdG8gcmV0cnk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworaW50CitleHQzX2pvdXJuYWxfZGlydHlfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWludCBlcnIgPSBqb3VybmFsX2RpcnR5X2RhdGEoaGFuZGxlLCBiaCk7CisJaWYgKGVycikKKwkJZXh0M19qb3VybmFsX2Fib3J0X2hhbmRsZShfX0ZVTkNUSU9OX18sIF9fRlVOQ1RJT05fXywKKwkJCQkJCWJoLCBoYW5kbGUsZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBGb3IgY29tbWl0X3dyaXRlKCkgaW4gZGF0YT1qb3VybmFsIG1vZGUgKi8KK3N0YXRpYyBpbnQgY29tbWl0X3dyaXRlX2ZuKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSB8fCBidWZmZXJfZnJlZWQoYmgpKQorCQlyZXR1cm4gMDsKKwlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwlyZXR1cm4gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworfQorCisvKgorICogV2UgbmVlZCB0byBwaWNrIHVwIHRoZSBuZXcgaW5vZGUgc2l6ZSB3aGljaCBnZW5lcmljX2NvbW1pdF93cml0ZSBnYXZlIHVzCisgKiBgZmlsZScgY2FuIGJlIE5VTEwgLSBlZywgd2hlbiBjYWxsZWQgZnJvbSBwYWdlX3N5bWxpbmsoKS4KKyAqCisgKiBleHQzIG5ldmVyIHBsYWNlcyBidWZmZXJzIG9uIGlub2RlLT5pX21hcHBpbmctPnByaXZhdGVfbGlzdC4gIG1ldGFkYXRhCisgKiBidWZmZXJzIGFyZSBtYW5hZ2VkIGludGVybmFsbHkuCisgKi8KKworc3RhdGljIGludCBleHQzX29yZGVyZWRfY29tbWl0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSAgICAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJaGFuZGxlX3QgKmhhbmRsZSA9IGV4dDNfam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCWludCByZXQgPSAwLCByZXQyOworCisJcmV0ID0gd2Fsa19wYWdlX2J1ZmZlcnMoaGFuZGxlLCBwYWdlX2J1ZmZlcnMocGFnZSksCisJCWZyb20sIHRvLCBOVUxMLCBleHQzX2pvdXJuYWxfZGlydHlfZGF0YSk7CisKKwlpZiAocmV0ID09IDApIHsKKwkJLyoKKwkJICogZ2VuZXJpY19jb21taXRfd3JpdGUoKSB3aWxsIHJ1biBtYXJrX2lub2RlX2RpcnR5KCkgaWYgaV9zaXplCisJCSAqIGNoYW5nZXMuICBTbyBsZXQncyBwaWdneWJhY2sgdGhlIGlfZGlza3NpemUgbWFya19pbm9kZV9kaXJ0eQorCQkgKiBpbnRvIHRoYXQuCisJCSAqLworCQlsb2ZmX3QgbmV3X2lfc2l6ZTsKKworCQluZXdfaV9zaXplID0gKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyB0bzsKKwkJaWYgKG5ld19pX3NpemUgPiBFWFQzX0koaW5vZGUpLT5pX2Rpc2tzaXplKQorCQkJRVhUM19JKGlub2RlKS0+aV9kaXNrc2l6ZSA9IG5ld19pX3NpemU7CisJCXJldCA9IGdlbmVyaWNfY29tbWl0X3dyaXRlKGZpbGUsIHBhZ2UsIGZyb20sIHRvKTsKKwl9CisJcmV0MiA9IGV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJldDI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBleHQzX3dyaXRlYmFja19jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwloYW5kbGVfdCAqaGFuZGxlID0gZXh0M19qb3VybmFsX2N1cnJlbnRfaGFuZGxlKCk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJaW50IHJldCA9IDAsIHJldDI7CisJbG9mZl90IG5ld19pX3NpemU7CisKKwluZXdfaV9zaXplID0gKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyB0bzsKKwlpZiAobmV3X2lfc2l6ZSA+IEVYVDNfSShpbm9kZSktPmlfZGlza3NpemUpCisJCUVYVDNfSShpbm9kZSktPmlfZGlza3NpemUgPSBuZXdfaV9zaXplOworCisJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBOT0JIKSkKKwkJcmV0ID0gbm9iaF9jb21taXRfd3JpdGUoZmlsZSwgcGFnZSwgZnJvbSwgdG8pOworCWVsc2UKKwkJcmV0ID0gZ2VuZXJpY19jb21taXRfd3JpdGUoZmlsZSwgcGFnZSwgZnJvbSwgdG8pOworCisJcmV0MiA9IGV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJldDI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBleHQzX2pvdXJuYWxsZWRfY29tbWl0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCWhhbmRsZV90ICpoYW5kbGUgPSBleHQzX2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlpbnQgcmV0ID0gMCwgcmV0MjsKKwlpbnQgcGFydGlhbCA9IDA7CisJbG9mZl90IHBvczsKKworCS8qCisJICogSGVyZSB3ZSBkdXBsaWNhdGUgdGhlIGdlbmVyaWNfY29tbWl0X3dyaXRlKCkgZnVuY3Rpb25hbGl0eQorCSAqLworCXBvcyA9ICgobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgdG87CisKKwlyZXQgPSB3YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsIHBhZ2VfYnVmZmVycyhwYWdlKSwgZnJvbSwKKwkJCQl0bywgJnBhcnRpYWwsIGNvbW1pdF93cml0ZV9mbik7CisJaWYgKCFwYXJ0aWFsKQorCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJaWYgKHBvcyA+IGlub2RlLT5pX3NpemUpCisJCWlfc2l6ZV93cml0ZShpbm9kZSwgcG9zKTsKKwlFWFQzX0koaW5vZGUpLT5pX3N0YXRlIHw9IEVYVDNfU1RBVEVfSkRBVEE7CisJaWYgKGlub2RlLT5pX3NpemUgPiBFWFQzX0koaW5vZGUpLT5pX2Rpc2tzaXplKSB7CisJCUVYVDNfSShpbm9kZSktPmlfZGlza3NpemUgPSBpbm9kZS0+aV9zaXplOworCQlyZXQyID0gZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCQlpZiAoIXJldCkgCisJCQlyZXQgPSByZXQyOworCX0KKwlyZXQyID0gZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmV0MjsKKwlyZXR1cm4gcmV0OworfQorCisvKiAKKyAqIGJtYXAoKSBpcyBzcGVjaWFsLiAgSXQgZ2V0cyB1c2VkIGJ5IGFwcGxpY2F0aW9ucyBzdWNoIGFzIGxpbG8gYW5kIGJ5CisgKiB0aGUgc3dhcHBlciB0byBmaW5kIHRoZSBvbi1kaXNrIGJsb2NrIG9mIGEgc3BlY2lmaWMgcGllY2Ugb2YgZGF0YS4KKyAqCisgKiBOYXR1cmFsbHksIHRoaXMgaXMgZGFuZ2Vyb3VzIGlmIHRoZSBibG9jayBjb25jZXJuZWQgaXMgc3RpbGwgaW4gdGhlCisgKiBqb3VybmFsLiAgSWYgc29tZWJvZHkgbWFrZXMgYSBzd2FwZmlsZSBvbiBhbiBleHQzIGRhdGEtam91cm5hbGluZworICogZmlsZXN5c3RlbSBhbmQgZW5hYmxlcyBzd2FwLCB0aGVuIHRoZXkgbWF5IGdldCBhIG5hc3R5IHNob2NrIHdoZW4gdGhlCisgKiBkYXRhIGdldHRpbmcgc3dhcHBlZCB0byB0aGF0IHN3YXBmaWxlIHN1ZGRlbmx5IGdldHMgb3ZlcndyaXR0ZW4gYnkKKyAqIHRoZSBvcmlnaW5hbCB6ZXJvJ3Mgd3JpdHRlbiBvdXQgcHJldmlvdXNseSB0byB0aGUgam91cm5hbCBhbmQKKyAqIGF3YWl0aW5nIHdyaXRlYmFjayBpbiB0aGUga2VybmVsJ3MgYnVmZmVyIGNhY2hlLiAKKyAqCisgKiBTbywgaWYgd2Ugc2VlIGFueSBibWFwIGNhbGxzIGhlcmUgb24gYSBtb2RpZmllZCwgZGF0YS1qb3VybmFsZWQgZmlsZSwKKyAqIHRha2UgZXh0cmEgc3RlcHMgdG8gZmx1c2ggYW55IGJsb2NrcyB3aGljaCBtaWdodCBiZSBpbiB0aGUgY2FjaGUuIAorICovCitzdGF0aWMgc2VjdG9yX3QgZXh0M19ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jaykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKwlqb3VybmFsX3QgKmpvdXJuYWw7CisJaW50IGVycjsKKworCWlmIChFWFQzX0koaW5vZGUpLT5pX3N0YXRlICYgRVhUM19TVEFURV9KREFUQSkgeworCQkvKiAKKwkJICogVGhpcyBpcyBhIFJFQUxMWSBoZWF2eXdlaWdodCBhcHByb2FjaCwgYnV0IHRoZSB1c2Ugb2YKKwkJICogYm1hcCBvbiBkaXJ0eSBmaWxlcyBpcyBleHBlY3RlZCB0byBiZSBleHRyZW1lbHkgcmFyZToKKwkJICogb25seSBpZiB3ZSBydW4gbGlsbyBvciBzd2Fwb24gb24gYSBmcmVzaGx5IG1hZGUgZmlsZQorCQkgKiBkbyB3ZSBleHBlY3QgdGhpcyB0byBoYXBwZW4uIAorCQkgKgorCQkgKiAoYm1hcCByZXF1aXJlcyBDQVBfU1lTX1JBV0lPIHNvIHRoaXMgZG9lcyBub3QKKwkJICogcmVwcmVzZW50IGFuIHVucHJpdmlsZWdlZCB1c2VyIERPUyBhdHRhY2sgLS0tIHdlJ2QgYmUKKwkJICogaW4gdHJvdWJsZSBpZiBtb3J0YWwgdXNlcnMgY291bGQgdHJpZ2dlciB0aGlzIHBhdGggYXQKKwkJICogd2lsbC4pIAorCQkgKgorCQkgKiBOQi4gRVhUM19TVEFURV9KREFUQSBpcyBub3Qgc2V0IG9uIGZpbGVzIG90aGVyIHRoYW4KKwkJICogcmVndWxhciBmaWxlcy4gIElmIHNvbWVib2R5IHdhbnRzIHRvIGJtYXAgYSBkaXJlY3RvcnkKKwkJICogb3Igc3ltbGluayBhbmQgZ2V0cyBjb25mdXNlZCBiZWNhdXNlIHRoZSBidWZmZXIKKwkJICogaGFzbid0IHlldCBiZWVuIGZsdXNoZWQgdG8gZGlzaywgdGhleSBkZXNlcnZlCisJCSAqIGV2ZXJ5dGhpbmcgdGhleSBnZXQuCisJCSAqLworCisJCUVYVDNfSShpbm9kZSktPmlfc3RhdGUgJj0gfkVYVDNfU1RBVEVfSkRBVEE7CisJCWpvdXJuYWwgPSBFWFQzX0pPVVJOQUwoaW5vZGUpOworCQlqb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsKTsKKwkJZXJyID0gam91cm5hbF9mbHVzaChqb3VybmFsKTsKKwkJam91cm5hbF91bmxvY2tfdXBkYXRlcyhqb3VybmFsKTsKKworCQlpZiAoZXJyKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLGJsb2NrLGV4dDNfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIGludCBiZ2V0X29uZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWdldF9iaChiaCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnB1dF9vbmUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlwdXRfYmgoYmgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGpvdXJuYWxfZGlydHlfZGF0YV9mbihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWlmIChidWZmZXJfbWFwcGVkKGJoKSkKKwkJcmV0dXJuIGV4dDNfam91cm5hbF9kaXJ0eV9kYXRhKGhhbmRsZSwgYmgpOworCXJldHVybiAwOworfQorCisvKgorICogTm90ZSB0aGF0IHdlIGFsd2F5cyBzdGFydCBhIHRyYW5zYWN0aW9uIGV2ZW4gaWYgd2UncmUgbm90IGpvdXJuYWxsaW5nCisgKiBkYXRhLiAgVGhpcyBpcyB0byBwcmVzZXJ2ZSBvcmRlcmluZzogYW55IGhvbGUgaW5zdGFudGlhdGlvbiB3aXRoaW4KKyAqIF9fYmxvY2tfd3JpdGVfZnVsbF9wYWdlIC0+IGV4dDNfZ2V0X2Jsb2NrKCkgc2hvdWxkIGJlIGpvdXJuYWxsZWQKKyAqIGFsb25nIHdpdGggdGhlIGRhdGEgc28gd2UgZG9uJ3QgY3Jhc2ggYW5kIHRoZW4gZ2V0IG1ldGFkYXRhIHdoaWNoCisgKiByZWZlcnMgdG8gb2xkIGRhdGEuCisgKgorICogSW4gYWxsIGpvdXJuYWxsaW5nIG1vZGVzIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZSgpIHdpbGwgc3RhcnQgdGhlIEkvTy4KKyAqCisgKiBQcm9ibGVtOgorICoKKyAqCWV4dDNfd3JpdGVwYWdlKCkgLT4ga21hbGxvYygpIC0+IF9fYWxsb2NfcGFnZXMoKSAtPiBwYWdlX2xhdW5kZXIoKSAtPgorICoJCWV4dDNfd3JpdGVwYWdlKCkKKyAqCisgKiBTaW1pbGFyIGZvcjoKKyAqCisgKglleHQzX2ZpbGVfd3JpdGUoKSAtPiBnZW5lcmljX2ZpbGVfd3JpdGUoKSAtPiBfX2FsbG9jX3BhZ2VzKCkgLT4gLi4uCisgKgorICogU2FtZSBhcHBsaWVzIHRvIGV4dDNfZ2V0X2Jsb2NrKCkuICBXZSB3aWxsIGRlYWRsb2NrIG9uIHZhcmlvdXMgdGhpbmdzIGxpa2UKKyAqIGxvY2tfam91cm5hbCBhbmQgaV90cnVuY2F0ZV9zZW0uCisgKgorICogU2V0dGluZyBQRl9NRU1BTExPQyBoZXJlIGRvZXNuJ3Qgd29yayAtIHRvbyBtYW55IGludGVybmFsIG1lbW9yeQorICogYWxsb2NhdGlvbnMgZmFpbC4KKyAqCisgKiAxNk1heTAxOiBJZiB3ZSdyZSByZWVudGVyZWQgdGhlbiBqb3VybmFsX2N1cnJlbnRfaGFuZGxlKCkgd2lsbCBiZQorICoJICAgIG5vbi16ZXJvLiBXZSBzaW1wbHkgKnJldHVybiouCisgKgorICogMSBKdWx5IDIwMDE6IEBAQCBGSVhNRToKKyAqICAgSW4gam91cm5hbGxlZCBkYXRhIG1vZGUsIGEgZGF0YSBidWZmZXIgbWF5IGJlIG1ldGFkYXRhIGFnYWluc3QgdGhlCisgKiAgIGN1cnJlbnQgdHJhbnNhY3Rpb24uICBCdXQgdGhlIHNhbWUgZmlsZSBpcyBwYXJ0IG9mIGEgc2hhcmVkIG1hcHBpbmcKKyAqICAgYW5kIHNvbWVvbmUgZG9lcyBhIHdyaXRlcGFnZSgpIG9uIGl0LgorICoKKyAqICAgV2Ugd2lsbCBtb3ZlIHRoZSBidWZmZXIgb250byB0aGUgYXN5bmNfZGF0YSBsaXN0LCBidXQgKmFmdGVyKiBpdCBoYXMKKyAqICAgYmVlbiBkaXJ0aWVkLiBTbyB0aGVyZSdzIGEgc21hbGwgd2luZG93IHdoZXJlIHdlIGhhdmUgZGlydHkgZGF0YSBvbgorICogICBCSl9NZXRhZGF0YS4KKyAqCisgKiAgIE5vdGUgdGhhdCB0aGlzIG9ubHkgYXBwbGllcyB0byB0aGUgbGFzdCBwYXJ0aWFsIHBhZ2UgaW4gdGhlIGZpbGUuICBUaGUKKyAqICAgYml0IHdoaWNoIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZSgpIHVzZXMgcHJlcGFyZS9jb21taXQgZm9yLiAgKFRoYXQncworICogICBicm9rZW4gY29kZSBhbnl3YXk6IGl0J3Mgd3JvbmcgZm9yIG1zeW5jKCkpLgorICoKKyAqICAgSXQncyBhIHJhcmUgY2FzZTogYWZmZWN0cyB0aGUgZmluYWwgcGFydGlhbCBwYWdlLCBmb3Igam91cm5hbGxlZCBkYXRhCisgKiAgIHdoZXJlIHRoZSBmaWxlIGlzIHN1YmplY3QgdG8gYml0aCB3cml0ZSgpIGFuZCB3cml0ZXBhZ2UoKSBpbiB0aGUgc2FtZQorICogICB0cmFuc2N0aW9uLiAgVG8gZml4IGl0IHdlJ2xsIG5lZWQgYSBjdXN0b20gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKCkuCisgKiAgIFdlJ2xsIHByb2JhYmx5IG5lZWQgdGhhdCBhbnl3YXkgZm9yIGpvdXJuYWxsaW5nIHdyaXRlcGFnZSgpIG91dHB1dC4KKyAqCisgKiBXZSBkb24ndCBob25vdXIgc3luY2hyb25vdXMgbW91bnRzIGZvciB3cml0ZXBhZ2UoKS4gIFRoYXQgd291bGQgYmUKKyAqIGRpc2FzdHJvdXMuICBBbnkgd3JpdGUoKSBvciBtZXRhZGF0YSBvcGVyYXRpb24gd2lsbCBzeW5jIHRoZSBmcyBmb3IKKyAqIHVzLgorICoKKyAqIEFLUE0yOiBpZiBhbGwgdGhlIHBhZ2UncyBidWZmZXJzIGFyZSBtYXBwZWQgdG8gZGlzayBhbmQgIWRhdGE9am91cm5hbCwKKyAqIHdlIGRvbid0IG5lZWQgdG8gb3BlbiBhIHRyYW5zYWN0aW9uIGhlcmUuCisgKi8KK3N0YXRpYyBpbnQgZXh0M19vcmRlcmVkX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBidWZmZXJfaGVhZCAqcGFnZV9idWZzOworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOworCWludCByZXQgPSAwOworCWludCBlcnI7CisKKwlKX0FTU0VSVChQYWdlTG9ja2VkKHBhZ2UpKTsKKworCS8qCisJICogV2UgZ2l2ZSB1cCBoZXJlIGlmIHdlJ3JlIHJlZW50ZXJlZCwgYmVjYXVzZSBpdCBtaWdodCBiZSBmb3IgYQorCSAqIGRpZmZlcmVudCBmaWxlc3lzdGVtLgorCSAqLworCWlmIChleHQzX2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKSkKKwkJZ290byBvdXRfZmFpbDsKKworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChpbm9kZSwgZXh0M193cml0ZXBhZ2VfdHJhbnNfYmxvY2tzKGlub2RlKSk7CisKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQlnb3RvIG91dF9mYWlsOworCX0KKworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgeworCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUsCisJCQkJKDEgPDwgQkhfRGlydHkpfCgxIDw8IEJIX1VwdG9kYXRlKSk7CisJfQorCXBhZ2VfYnVmcyA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwl3YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsIHBhZ2VfYnVmcywgMCwKKwkJCVBBR0VfQ0FDSEVfU0laRSwgTlVMTCwgYmdldF9vbmUpOworCisJcmV0ID0gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIGV4dDNfZ2V0X2Jsb2NrLCB3YmMpOworCisJLyoKKwkgKiBUaGUgcGFnZSBjYW4gYmVjb21lIHVubG9ja2VkIGF0IGFueSBwb2ludCBub3csIGFuZAorCSAqIHRydW5jYXRlIGNhbiB0aGVuIGNvbWUgaW4gYW5kIGNoYW5nZSB0aGluZ3MuICBTbyB3ZQorCSAqIGNhbid0IHRvdWNoICpwYWdlIGZyb20gbm93IG9uLiAgQnV0ICpwYWdlX2J1ZnMgaXMKKwkgKiBzYWZlIGR1ZSB0byBlbGV2YXRlZCByZWZjb3VudC4KKwkgKi8KKworCS8qCisJICogQW5kIGF0dGFjaCB0aGVtIHRvIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgQnV0IG9ubHkgaWYgCisJICogYmxvY2tfd3JpdGVfZnVsbF9wYWdlKCkgc3VjY2VlZGVkLiAgT3RoZXJ3aXNlIHRoZXkgYXJlIHVubWFwcGVkLAorCSAqIGFuZCBnZW5lcmFsbHkganVuay4KKwkgKi8KKwlpZiAocmV0ID09IDApIHsKKwkJZXJyID0gd2Fsa19wYWdlX2J1ZmZlcnMoaGFuZGxlLCBwYWdlX2J1ZnMsIDAsIFBBR0VfQ0FDSEVfU0laRSwKKwkJCQkJTlVMTCwgam91cm5hbF9kaXJ0eV9kYXRhX2ZuKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBlcnI7CisJfQorCXdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwgcGFnZV9idWZzLCAwLAorCQkJUEFHRV9DQUNIRV9TSVpFLCBOVUxMLCBicHV0X29uZSk7CisJZXJyID0gZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gZXJyOworCXJldHVybiByZXQ7CisKK291dF9mYWlsOgorCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorZXh0M193cml0ZWJhY2tfd3JpdGVwYWdlX2hlbHBlcihzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlyZXR1cm4gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIGV4dDNfZ2V0X2Jsb2NrLCB3YmMpOworfQorCitzdGF0aWMgaW50CitleHQzX3dyaXRlYmFja193cml0ZXBhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOworCWludCBlcnIsIHJldCA9IDA7CisKKwlpZiAoIW1hcHBpbmdfdGFnZ2VkKG1hcHBpbmcsIFBBR0VDQUNIRV9UQUdfRElSVFkpKQorCQlyZXR1cm4gcmV0OworCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCBleHQzX3dyaXRlcGFnZV90cmFuc19ibG9ja3MoaW5vZGUpKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQlyZXR1cm4gcmV0OworCX0KKworICAgICAgICByZXQgPSBfX21wYWdlX3dyaXRlcGFnZXMobWFwcGluZywgd2JjLCBleHQzX3dyaXRlcGFnZXNfZ2V0X2Jsb2NrLAorCQkJCQlleHQzX3dyaXRlYmFja193cml0ZXBhZ2VfaGVscGVyKTsKKworCS8qCisJICogTmVlZCB0byByZWFxdWlyZSB0aGUgaGFuZGxlIHNpbmNlIGV4dDNfd3JpdGVwYWdlc19nZXRfYmxvY2soKQorCSAqIGNhbiByZXN0YXJ0IHRoZSBoYW5kbGUKKwkgKi8KKwloYW5kbGUgPSBqb3VybmFsX2N1cnJlbnRfaGFuZGxlKCk7CisKKwllcnIgPSBleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmICghcmV0KQorCQlyZXQgPSBlcnI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBleHQzX3dyaXRlYmFja193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CisJaW50IHJldCA9IDA7CisJaW50IGVycjsKKworCWlmIChleHQzX2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKSkKKwkJZ290byBvdXRfZmFpbDsKKworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChpbm9kZSwgZXh0M193cml0ZXBhZ2VfdHJhbnNfYmxvY2tzKGlub2RlKSk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJZ290byBvdXRfZmFpbDsKKwl9CisKKwlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpKQorCQlyZXQgPSBub2JoX3dyaXRlcGFnZShwYWdlLCBleHQzX2dldF9ibG9jaywgd2JjKTsKKwllbHNlCisJCXJldCA9IGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLCBleHQzX2dldF9ibG9jaywgd2JjKTsKKworCWVyciA9IGV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKKwlyZXR1cm4gcmV0OworCitvdXRfZmFpbDoKKwlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19qb3VybmFsbGVkX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgZXJyOworCisJaWYgKGV4dDNfam91cm5hbF9jdXJyZW50X2hhbmRsZSgpKQorCQlnb3RvIG5vX3dyaXRlOworCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCBleHQzX3dyaXRlcGFnZV90cmFuc19ibG9ja3MoaW5vZGUpKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQlnb3RvIG5vX3dyaXRlOworCX0KKworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSB8fCBQYWdlQ2hlY2tlZChwYWdlKSkgeworCQkvKgorCQkgKiBJdCdzIG1tYXBwZWQgcGFnZWNhY2hlLiAgQWRkIGJ1ZmZlcnMgYW5kIGpvdXJuYWwgaXQuICBUaGVyZQorCQkgKiBkb2Vzbid0IHNlZW0gbXVjaCBwb2ludCBpbiByZWRpcnR5aW5nIHRoZSBwYWdlIGhlcmUuCisJCSAqLworCQlDbGVhclBhZ2VDaGVja2VkKHBhZ2UpOworCQlyZXQgPSBibG9ja19wcmVwYXJlX3dyaXRlKHBhZ2UsIDAsIFBBR0VfQ0FDSEVfU0laRSwKKwkJCQkJZXh0M19nZXRfYmxvY2spOworCQlpZiAocmV0ICE9IDApCisJCQlnb3RvIG91dF91bmxvY2s7CisJCXJldCA9IHdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwgcGFnZV9idWZmZXJzKHBhZ2UpLCAwLAorCQkJUEFHRV9DQUNIRV9TSVpFLCBOVUxMLCBkb19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MpOworCisJCWVyciA9IHdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwgcGFnZV9idWZmZXJzKHBhZ2UpLCAwLAorCQkJCVBBR0VfQ0FDSEVfU0laRSwgTlVMTCwgY29tbWl0X3dyaXRlX2ZuKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcmV0ID0gZXJyOworCQlFWFQzX0koaW5vZGUpLT5pX3N0YXRlIHw9IEVYVDNfU1RBVEVfSkRBVEE7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEl0IG1heSBiZSBhIHBhZ2UgZnVsbCBvZiBjaGVja3BvaW50LW1vZGUgYnVmZmVycy4gIFdlIGRvbid0CisJCSAqIHJlYWxseSBrbm93IHVubGVzcyB3ZSBnbyBwb2tlIGFyb3VuZCBpbiB0aGUgYnVmZmVyX2hlYWRzLgorCQkgKiBCdXQgYmxvY2tfd3JpdGVfZnVsbF9wYWdlIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nLgorCQkgKi8KKwkJcmV0ID0gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIGV4dDNfZ2V0X2Jsb2NrLCB3YmMpOworCX0KKwllcnIgPSBleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmICghcmV0KQorCQlyZXQgPSBlcnI7CitvdXQ6CisJcmV0dXJuIHJldDsKKworbm9fd3JpdGU6CisJcmVkaXJ0eV9wYWdlX2Zvcl93cml0ZXBhZ2Uod2JjLCBwYWdlKTsKK291dF91bmxvY2s6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIG1wYWdlX3JlYWRwYWdlKHBhZ2UsIGV4dDNfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIGludAorZXh0M19yZWFkcGFnZXMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQlzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlcywgdW5zaWduZWQgbnJfcGFnZXMpCit7CisJcmV0dXJuIG1wYWdlX3JlYWRwYWdlcyhtYXBwaW5nLCBwYWdlcywgbnJfcGFnZXMsIGV4dDNfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIGludCBleHQzX2ludmFsaWRhdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlqb3VybmFsX3QgKmpvdXJuYWwgPSBFWFQzX0pPVVJOQUwocGFnZS0+bWFwcGluZy0+aG9zdCk7CisKKwkvKgorCSAqIElmIGl0J3MgYSBmdWxsIHRydW5jYXRlIHdlIGp1c3QgZm9yZ2V0IGFib3V0IHRoZSBwZW5kaW5nIGRpcnR5aW5nCisJICovCisJaWYgKG9mZnNldCA9PSAwKQorCQlDbGVhclBhZ2VDaGVja2VkKHBhZ2UpOworCisJcmV0dXJuIGpvdXJuYWxfaW52YWxpZGF0ZXBhZ2Uoam91cm5hbCwgcGFnZSwgb2Zmc2V0KTsKK30KKworc3RhdGljIGludCBleHQzX3JlbGVhc2VwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgd2FpdCkKK3sKKwlqb3VybmFsX3QgKmpvdXJuYWwgPSBFWFQzX0pPVVJOQUwocGFnZS0+bWFwcGluZy0+aG9zdCk7CisKKwlXQVJOX09OKFBhZ2VDaGVja2VkKHBhZ2UpKTsKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCXJldHVybiAwOworCXJldHVybiBqb3VybmFsX3RyeV90b19mcmVlX2J1ZmZlcnMoam91cm5hbCwgcGFnZSwgd2FpdCk7Cit9CisKKy8qCisgKiBJZiB0aGUgT19ESVJFQ1Qgd3JpdGUgd2lsbCBleHRlbmQgdGhlIGZpbGUgdGhlbiBhZGQgdGhpcyBpbm9kZSB0byB0aGUKKyAqIG9ycGhhbiBsaXN0LiAgU28gcmVjb3Zlcnkgd2lsbCB0cnVuY2F0ZSBpdCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzaXplCisgKiBpZiB0aGUgbWFjaGluZSBjcmFzaGVzIGR1cmluZyB0aGUgd3JpdGUuCisgKgorICogSWYgdGhlIE9fRElSRUNUIHdyaXRlIGlzIGludGFudGlhdGluZyBob2xlcyBpbnNpZGUgaV9zaXplIGFuZCB0aGUgbWFjaGluZQorICogY3Jhc2hlcyB0aGVuIHN0YWxlIGRpc2sgZGF0YSBfbWF5XyBiZSBleHBvc2VkIGluc2lkZSB0aGUgZmlsZS4KKyAqLworc3RhdGljIHNzaXplX3QgZXh0M19kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsCisJCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwKKwkJCXVuc2lnbmVkIGxvbmcgbnJfc2VncykKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvICplaSA9IEVYVDNfSShpbm9kZSk7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CisJc3NpemVfdCByZXQ7CisJaW50IG9ycGhhbiA9IDA7CisJc2l6ZV90IGNvdW50ID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOworCisJaWYgKHJ3ID09IFdSSVRFKSB7CisJCWxvZmZfdCBmaW5hbF9zaXplID0gb2Zmc2V0ICsgY291bnQ7CisKKwkJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCBESU9fQ1JFRElUUyk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGZpbmFsX3NpemUgPiBpbm9kZS0+aV9zaXplKSB7CisJCQlyZXQgPSBleHQzX29ycGhhbl9hZGQoaGFuZGxlLCBpbm9kZSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gb3V0X3N0b3A7CisJCQlvcnBoYW4gPSAxOworCQkJZWktPmlfZGlza3NpemUgPSBpbm9kZS0+aV9zaXplOworCQl9CisJfQorCisJcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaW5vZGUtPmlfc2ItPnNfYmRldiwgaW92LCAKKwkJCQkgb2Zmc2V0LCBucl9zZWdzLAorCQkJCSBleHQzX2RpcmVjdF9pb19nZXRfYmxvY2tzLCBOVUxMKTsKKworCS8qCisJICogUmVhY3F1aXJlIHRoZSBoYW5kbGU6IGV4dDNfZGlyZWN0X2lvX2dldF9ibG9jaygpIGNhbiByZXN0YXJ0IHRoZQorCSAqIHRyYW5zYWN0aW9uCisJICovCisJaGFuZGxlID0gam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOworCitvdXRfc3RvcDoKKwlpZiAoaGFuZGxlKSB7CisJCWludCBlcnI7CisKKwkJaWYgKG9ycGhhbiAmJiBpbm9kZS0+aV9ubGluaykKKwkJCWV4dDNfb3JwaGFuX2RlbChoYW5kbGUsIGlub2RlKTsKKwkJaWYgKG9ycGhhbiAmJiByZXQgPiAwKSB7CisJCQlsb2ZmX3QgZW5kID0gb2Zmc2V0ICsgcmV0OworCQkJaWYgKGVuZCA+IGlub2RlLT5pX3NpemUpIHsKKwkJCQllaS0+aV9kaXNrc2l6ZSA9IGVuZDsKKwkJCQlpX3NpemVfd3JpdGUoaW5vZGUsIGVuZCk7CisJCQkJLyoKKwkJCQkgKiBXZSdyZSBnb2luZyB0byByZXR1cm4gYSBwb3NpdGl2ZSBgcmV0JworCQkJCSAqIGhlcmUgZHVlIHRvIG5vbi16ZXJvLWxlbmd0aCBJL08sIHNvIHRoZXJlJ3MKKwkJCQkgKiBubyB3YXkgb2YgcmVwb3J0aW5nIGVycm9yIHJldHVybnMgZnJvbQorCQkJCSAqIGV4dDNfbWFya19pbm9kZV9kaXJ0eSgpIHRvIHVzZXJzcGFjZS4gIFNvCisJCQkJICogaWdub3JlIGl0LgorCQkJCSAqLworCQkJCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwkJCX0KKwkJfQorCQllcnIgPSBleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCQlpZiAocmV0ID09IDApCisJCQlyZXQgPSBlcnI7CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBQYWdlcyBjYW4gYmUgbWFya2VkIGRpcnR5IGNvbXBsZXRlbHkgYXN5bmNocm9ub3VzbHkgZnJvbSBleHQzJ3Mgam91cm5hbGxpbmcKKyAqIGFjdGl2aXR5LiAgQnkgZmlsZW1hcF9zeW5jX3B0ZSgpLCB0cnlfdG9fdW5tYXBfb25lKCksIGV0Yy4gIFdlIGNhbm5vdCBkbworICogbXVjaCBoZXJlIGJlY2F1c2UgLT5zZXRfcGFnZV9kaXJ0eSBpcyBjYWxsZWQgdW5kZXIgVkZTIGxvY2tzLiAgVGhlIHBhZ2UgaXMKKyAqIG5vdCBuZWNlc3NhcmlseSBsb2NrZWQuCisgKgorICogV2UgY2Fubm90IGp1c3QgZGlydHkgdGhlIHBhZ2UgYW5kIGxlYXZlIGF0dGFjaGVkIGJ1ZmZlcnMgY2xlYW4sIGJlY2F1c2UgdGhlCisgKiBidWZmZXJzJyBkaXJ0eSBzdGF0ZSBpcyAiZGVmaW5pdGl2ZSIuICBXZSBjYW5ub3QganVzdCBzZXQgdGhlIGJ1ZmZlcnMgZGlydHkKKyAqIG9yIGpiZGRpcnR5IGJlY2F1c2UgYWxsIHRoZSBqb3VybmFsbGluZyBjb2RlIHdpbGwgZXhwbG9kZS4KKyAqCisgKiBTbyB3aGF0IHdlIGRvIGlzIHRvIG1hcmsgdGhlIHBhZ2UgInBlbmRpbmcgZGlydHkiIGFuZCBuZXh0IHRpbWUgd3JpdGVwYWdlCisgKiBpcyBjYWxsZWQsIHByb3BhZ2F0ZSB0aGF0IGludG8gdGhlIGJ1ZmZlcnMgYXBwcm9wcmlhdGVseS4KKyAqLworc3RhdGljIGludCBleHQzX2pvdXJuYWxsZWRfc2V0X3BhZ2VfZGlydHkoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJU2V0UGFnZUNoZWNrZWQocGFnZSk7CisJcmV0dXJuIF9fc2V0X3BhZ2VfZGlydHlfbm9idWZmZXJzKHBhZ2UpOworfQorCitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBleHQzX29yZGVyZWRfYW9wcyA9IHsKKwkucmVhZHBhZ2UJPSBleHQzX3JlYWRwYWdlLAorCS5yZWFkcGFnZXMJPSBleHQzX3JlYWRwYWdlcywKKwkud3JpdGVwYWdlCT0gZXh0M19vcmRlcmVkX3dyaXRlcGFnZSwKKwkuc3luY19wYWdlCT0gYmxvY2tfc3luY19wYWdlLAorCS5wcmVwYXJlX3dyaXRlCT0gZXh0M19wcmVwYXJlX3dyaXRlLAorCS5jb21taXRfd3JpdGUJPSBleHQzX29yZGVyZWRfY29tbWl0X3dyaXRlLAorCS5ibWFwCQk9IGV4dDNfYm1hcCwKKwkuaW52YWxpZGF0ZXBhZ2UJPSBleHQzX2ludmFsaWRhdGVwYWdlLAorCS5yZWxlYXNlcGFnZQk9IGV4dDNfcmVsZWFzZXBhZ2UsCisJLmRpcmVjdF9JTwk9IGV4dDNfZGlyZWN0X0lPLAorfTsKKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZXh0M193cml0ZWJhY2tfYW9wcyA9IHsKKwkucmVhZHBhZ2UJPSBleHQzX3JlYWRwYWdlLAorCS5yZWFkcGFnZXMJPSBleHQzX3JlYWRwYWdlcywKKwkud3JpdGVwYWdlCT0gZXh0M193cml0ZWJhY2tfd3JpdGVwYWdlLAorCS53cml0ZXBhZ2VzCT0gZXh0M193cml0ZWJhY2tfd3JpdGVwYWdlcywKKwkuc3luY19wYWdlCT0gYmxvY2tfc3luY19wYWdlLAorCS5wcmVwYXJlX3dyaXRlCT0gZXh0M19wcmVwYXJlX3dyaXRlLAorCS5jb21taXRfd3JpdGUJPSBleHQzX3dyaXRlYmFja19jb21taXRfd3JpdGUsCisJLmJtYXAJCT0gZXh0M19ibWFwLAorCS5pbnZhbGlkYXRlcGFnZQk9IGV4dDNfaW52YWxpZGF0ZXBhZ2UsCisJLnJlbGVhc2VwYWdlCT0gZXh0M19yZWxlYXNlcGFnZSwKKwkuZGlyZWN0X0lPCT0gZXh0M19kaXJlY3RfSU8sCit9OworCitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBleHQzX2pvdXJuYWxsZWRfYW9wcyA9IHsKKwkucmVhZHBhZ2UJPSBleHQzX3JlYWRwYWdlLAorCS5yZWFkcGFnZXMJPSBleHQzX3JlYWRwYWdlcywKKwkud3JpdGVwYWdlCT0gZXh0M19qb3VybmFsbGVkX3dyaXRlcGFnZSwKKwkuc3luY19wYWdlCT0gYmxvY2tfc3luY19wYWdlLAorCS5wcmVwYXJlX3dyaXRlCT0gZXh0M19wcmVwYXJlX3dyaXRlLAorCS5jb21taXRfd3JpdGUJPSBleHQzX2pvdXJuYWxsZWRfY29tbWl0X3dyaXRlLAorCS5zZXRfcGFnZV9kaXJ0eQk9IGV4dDNfam91cm5hbGxlZF9zZXRfcGFnZV9kaXJ0eSwKKwkuYm1hcAkJPSBleHQzX2JtYXAsCisJLmludmFsaWRhdGVwYWdlCT0gZXh0M19pbnZhbGlkYXRlcGFnZSwKKwkucmVsZWFzZXBhZ2UJPSBleHQzX3JlbGVhc2VwYWdlLAorfTsKKwordm9pZCBleHQzX3NldF9hb3BzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKGV4dDNfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKQorCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZleHQzX29yZGVyZWRfYW9wczsKKwllbHNlIGlmIChleHQzX3Nob3VsZF93cml0ZWJhY2tfZGF0YShpbm9kZSkpCisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmV4dDNfd3JpdGViYWNrX2FvcHM7CisJZWxzZQorCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZleHQzX2pvdXJuYWxsZWRfYW9wczsKK30KKworLyoKKyAqIGV4dDNfYmxvY2tfdHJ1bmNhdGVfcGFnZSgpIHplcm9lcyBvdXQgYSBtYXBwaW5nIGZyb20gZmlsZSBvZmZzZXQgYGZyb20nCisgKiB1cCB0byB0aGUgZW5kIG9mIHRoZSBibG9jayB3aGljaCBjb3JyZXNwb25kcyB0byBgZnJvbScuCisgKiBUaGlzIHJlcXVpcmVkIGR1cmluZyB0cnVuY2F0ZS4gV2UgbmVlZCB0byBwaHlzaWNhbGx5IHplcm8gdGhlIHRhaWwgZW5kCisgKiBvZiB0aGF0IGJsb2NrIHNvIGl0IGRvZXNuJ3QgeWllbGQgb2xkIGRhdGEgaWYgdGhlIGZpbGUgaXMgbGF0ZXIgZ3Jvd24uCisgKi8KK3N0YXRpYyBpbnQgZXh0M19ibG9ja190cnVuY2F0ZV9wYWdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IGZyb20pCit7CisJdW5zaWduZWQgbG9uZyBpbmRleCA9IGZyb20gPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBvZmZzZXQgPSBmcm9tICYgKFBBR0VfQ0FDSEVfU0laRS0xKTsKKwl1bnNpZ25lZCBibG9ja3NpemUsIGlibG9jaywgbGVuZ3RoLCBwb3M7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgZXJyID0gMDsKKwl2b2lkICprYWRkcjsKKworCWJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlsZW5ndGggPSBibG9ja3NpemUgLSAob2Zmc2V0ICYgKGJsb2Nrc2l6ZSAtIDEpKTsKKwlpYmxvY2sgPSBpbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKworCS8qCisJICogRm9yICJub2JoIiBvcHRpb24sICB3ZSBjYW4gb25seSB3b3JrIGlmIHdlIGRvbid0IG5lZWQgdG8KKwkgKiByZWFkLWluIHRoZSBwYWdlIC0gb3RoZXJ3aXNlIHdlIGNyZWF0ZSBidWZmZXJzIHRvIGRvIHRoZSBJTy4KKwkgKi8KKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkgJiYgdGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpKSB7CisJCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQkJbWVtc2V0KGthZGRyICsgb2Zmc2V0LCAwLCBsZW5ndGgpOworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJCWdvdG8gdW5sb2NrOworCQl9CisJfQorCisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQorCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBibG9ja3NpemUsIDApOworCisJLyogRmluZCB0aGUgYnVmZmVyIHRoYXQgY29udGFpbnMgIm9mZnNldCIgKi8KKwliaCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlwb3MgPSBibG9ja3NpemU7CisJd2hpbGUgKG9mZnNldCA+PSBwb3MpIHsKKwkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJCWlibG9jaysrOworCQlwb3MgKz0gYmxvY2tzaXplOworCX0KKworCWVyciA9IDA7CisJaWYgKGJ1ZmZlcl9mcmVlZChiaCkpIHsKKwkJQlVGRkVSX1RSQUNFKGJoLCAiZnJlZWQ6IHNraXAiKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkgeworCQlCVUZGRVJfVFJBQ0UoYmgsICJ1bm1hcHBlZCIpOworCQlleHQzX2dldF9ibG9jayhpbm9kZSwgaWJsb2NrLCBiaCwgMCk7CisJCS8qIHVubWFwcGVkPyBJdCdzIGEgaG9sZSAtIG5vdGhpbmcgdG8gZG8gKi8KKwkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkgeworCQkJQlVGRkVSX1RSQUNFKGJoLCAic3RpbGwgdW5tYXBwZWQiKTsKKwkJCWdvdG8gdW5sb2NrOworCQl9CisJfQorCisJLyogT2ssIGl0J3MgbWFwcGVkLiBNYWtlIHN1cmUgaXQncyB1cC10by1kYXRlICovCisJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisKKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJZXJyID0gLUVJTzsKKwkJbGxfcndfYmxvY2soUkVBRCwgMSwgJmJoKTsKKwkJd2FpdF9vbl9idWZmZXIoYmgpOworCQkvKiBVaGh1aC4gUmVhZCBlcnJvci4gQ29tcGxhaW4gYW5kIHB1bnQuICovCisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCWdvdG8gdW5sb2NrOworCX0KKworCWlmIChleHQzX3Nob3VsZF9qb3VybmFsX2RhdGEoaW5vZGUpKSB7CisJCUJVRkZFUl9UUkFDRShiaCwgImdldCB3cml0ZSBhY2Nlc3MiKTsKKwkJZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7CisJCWlmIChlcnIpCisJCQlnb3RvIHVubG9jazsKKwl9CisKKwlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwltZW1zZXQoa2FkZHIgKyBvZmZzZXQsIDAsIGxlbmd0aCk7CisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCisJQlVGRkVSX1RSQUNFKGJoLCAiemVyb2VkIGVuZCBvZiBibG9jayIpOworCisJZXJyID0gMDsKKwlpZiAoZXh0M19zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkgeworCQllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJfSBlbHNlIHsKKwkJaWYgKGV4dDNfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKQorCQkJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X2RhdGEoaGFuZGxlLCBiaCk7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwl9CisKK3VubG9jazoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFByb2JhYmx5IGl0IHNob3VsZCBiZSBhIGxpYnJhcnkgZnVuY3Rpb24uLi4gc2VhcmNoIGZvciBmaXJzdCBub24temVybyB3b3JkCisgKiBvciBtZW1jbXAgd2l0aCB6ZXJvX3BhZ2UsIHdoYXRldmVyIGlzIGJldHRlciBmb3IgcGFydGljdWxhciBhcmNoaXRlY3R1cmUuCisgKiBMaW51cz8KKyAqLworc3RhdGljIGlubGluZSBpbnQgYWxsX3plcm9lcyhfX2xlMzIgKnAsIF9fbGUzMiAqcSkKK3sKKwl3aGlsZSAocCA8IHEpCisJCWlmICgqcCsrKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICoJZXh0M19maW5kX3NoYXJlZCAtIGZpbmQgdGhlIGluZGlyZWN0IGJsb2NrcyBmb3IgcGFydGlhbCB0cnVuY2F0aW9uLgorICoJQGlub2RlOgkgIGlub2RlIGluIHF1ZXN0aW9uCisgKglAZGVwdGg6CSAgZGVwdGggb2YgdGhlIGFmZmVjdGVkIGJyYW5jaAorICoJQG9mZnNldHM6IG9mZnNldHMgb2YgcG9pbnRlcnMgaW4gdGhhdCBicmFuY2ggKHNlZSBleHQzX2Jsb2NrX3RvX3BhdGgpCisgKglAY2hhaW46CSAgcGxhY2UgdG8gc3RvcmUgdGhlIHBvaW50ZXJzIHRvIHBhcnRpYWwgaW5kaXJlY3QgYmxvY2tzCisgKglAdG9wOgkgIHBsYWNlIHRvIHRoZSAoZGV0YWNoZWQpIHRvcCBvZiBicmFuY2gKKyAqCisgKglUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgZXh0M190cnVuY2F0ZSgpLgorICoKKyAqCVdoZW4gd2UgZG8gdHJ1bmNhdGUoKSB3ZSBtYXkgaGF2ZSB0byBjbGVhbiB0aGUgZW5kcyBvZiBzZXZlcmFsCisgKglpbmRpcmVjdCBibG9ja3MgYnV0IGxlYXZlIHRoZSBibG9ja3MgdGhlbXNlbHZlcyBhbGl2ZS4gQmxvY2sgaXMKKyAqCXBhcnRpYWxseSB0cnVuY2F0ZWQgaWYgc29tZSBkYXRhIGJlbG93IHRoZSBuZXcgaV9zaXplIGlzIHJlZmVyZWQKKyAqCWZyb20gaXQgKGFuZCBpdCBpcyBvbiB0aGUgcGF0aCB0byB0aGUgZmlyc3QgY29tcGxldGVseSB0cnVuY2F0ZWQKKyAqCWRhdGEgYmxvY2ssIGluZGVlZCkuICBXZSBoYXZlIHRvIGZyZWUgdGhlIHRvcCBvZiB0aGF0IHBhdGggYWxvbmcKKyAqCXdpdGggZXZlcnl0aGluZyB0byB0aGUgcmlnaHQgb2YgdGhlIHBhdGguIFNpbmNlIG5vIGFsbG9jYXRpb24KKyAqCXBhc3QgdGhlIHRydW5jYXRpb24gcG9pbnQgaXMgcG9zc2libGUgdW50aWwgZXh0M190cnVuY2F0ZSgpCisgKglmaW5pc2hlcywgd2UgbWF5IHNhZmVseSBkbyB0aGUgbGF0dGVyLCBidXQgdG9wIG9mIGJyYW5jaCBtYXkKKyAqCXJlcXVpcmUgc3BlY2lhbCBhdHRlbnRpb24gLSBwYWdlb3V0IGJlbG93IHRoZSB0cnVuY2F0aW9uIHBvaW50CisgKgltaWdodCB0cnkgdG8gcG9wdWxhdGUgaXQuCisgKgorICoJV2UgYXRvbWljYWxseSBkZXRhY2ggdGhlIHRvcCBvZiBicmFuY2ggZnJvbSB0aGUgdHJlZSwgc3RvcmUgdGhlCisgKglibG9jayBudW1iZXIgb2YgaXRzIHJvb3QgaW4gKkB0b3AsIHBvaW50ZXJzIHRvIGJ1ZmZlcl9oZWFkcyBvZgorICoJcGFydGlhbGx5IHRydW5jYXRlZCBibG9ja3MgLSBpbiBAY2hhaW5bXS5iaCBhbmQgcG9pbnRlcnMgdG8KKyAqCXRoZWlyIGxhc3QgZWxlbWVudHMgdGhhdCBzaG91bGQgbm90IGJlIHJlbW92ZWQgLSBpbgorICoJQGNoYWluW10ucC4gUmV0dXJuIHZhbHVlIGlzIHRoZSBwb2ludGVyIHRvIGxhc3QgZmlsbGVkIGVsZW1lbnQKKyAqCW9mIEBjaGFpbi4KKyAqCisgKglUaGUgd29yayBsZWZ0IHRvIGNhbGxlciB0byBkbyB0aGUgYWN0dWFsIGZyZWVpbmcgb2Ygc3VidHJlZXM6CisgKgkJYSkgZnJlZSB0aGUgc3VidHJlZSBzdGFydGluZyBmcm9tICpAdG9wCisgKgkJYikgZnJlZSB0aGUgc3VidHJlZXMgd2hvc2Ugcm9vdHMgYXJlIHN0b3JlZCBpbgorICoJCQkoQGNoYWluW2ldLnArMSAuLiBlbmQgb2YgQGNoYWluW2ldLmJoLT5iX2RhdGEpCisgKgkJYykgZnJlZSB0aGUgc3VidHJlZXMgZ3Jvd2luZyBmcm9tIHRoZSBpbm9kZSBwYXN0IHRoZSBAY2hhaW5bMF0uCisgKgkJCShubyBwYXJ0aWFsbHkgdHJ1bmNhdGVkIHN0dWZmIHRoZXJlKS4gICovCisKK3N0YXRpYyBJbmRpcmVjdCAqZXh0M19maW5kX3NoYXJlZChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCWludCBkZXB0aCwKKwkJCQlpbnQgb2Zmc2V0c1s0XSwKKwkJCQlJbmRpcmVjdCBjaGFpbls0XSwKKwkJCQlfX2xlMzIgKnRvcCkKK3sKKwlJbmRpcmVjdCAqcGFydGlhbCwgKnA7CisJaW50IGssIGVycjsKKworCSp0b3AgPSAwOworCS8qIE1ha2UgayBpbmRleCB0aGUgZGVlcGVzdCBub24tbnVsbCBvZmZlc3QgKyAxICovCisJZm9yIChrID0gZGVwdGg7IGsgPiAxICYmICFvZmZzZXRzW2stMV07IGstLSkKKwkJOworCXBhcnRpYWwgPSBleHQzX2dldF9icmFuY2goaW5vZGUsIGssIG9mZnNldHMsIGNoYWluLCAmZXJyKTsKKwkvKiBXcml0ZXI6IHBvaW50ZXJzICovCisJaWYgKCFwYXJ0aWFsKQorCQlwYXJ0aWFsID0gY2hhaW4gKyBrLTE7CisJLyoKKwkgKiBJZiB0aGUgYnJhbmNoIGFjcXVpcmVkIGNvbnRpbnVhdGlvbiBzaW5jZSB3ZSd2ZSBsb29rZWQgYXQgaXQgLQorCSAqIGZpbmUsIGl0IHNob3VsZCBhbGwgc3Vydml2ZSBhbmQgKG5ldykgdG9wIGRvZXNuJ3QgYmVsb25nIHRvIHVzLgorCSAqLworCWlmICghcGFydGlhbC0+a2V5ICYmICpwYXJ0aWFsLT5wKQorCQkvKiBXcml0ZXI6IGVuZCAqLworCQlnb3RvIG5vX3RvcDsKKwlmb3IgKHA9cGFydGlhbDsgcD5jaGFpbiAmJiBhbGxfemVyb2VzKChfX2xlMzIqKXAtPmJoLT5iX2RhdGEscC0+cCk7IHAtLSkKKwkJOworCS8qCisJICogT0ssIHdlJ3ZlIGZvdW5kIHRoZSBsYXN0IGJsb2NrIHRoYXQgbXVzdCBzdXJ2aXZlLiBUaGUgcmVzdCBvZiBvdXIKKwkgKiBicmFuY2ggc2hvdWxkIGJlIGRldGFjaGVkIGJlZm9yZSB1bmxvY2tpbmcuIEhvd2V2ZXIsIGlmIHRoYXQgcmVzdAorCSAqIG9mIGJyYW5jaCBpcyBhbGwgb3VycyBhbmQgZG9lcyBub3QgZ3JvdyBpbW1lZGlhdGVseSBmcm9tIHRoZSBpbm9kZQorCSAqIGl0J3MgZWFzaWVyIHRvIGNoZWF0IGFuZCBqdXN0IGRlY3JlbWVudCBwYXJ0aWFsLT5wLgorCSAqLworCWlmIChwID09IGNoYWluICsgayAtIDEgJiYgcCA+IGNoYWluKSB7CisJCXAtPnAtLTsKKwl9IGVsc2UgeworCQkqdG9wID0gKnAtPnA7CisJCS8qIE5vcGUsIGRvbid0IGRvIHRoaXMgaW4gZXh0My4gIE11c3QgbGVhdmUgdGhlIHRyZWUgaW50YWN0ICovCisjaWYgMAorCQkqcC0+cCA9IDA7CisjZW5kaWYKKwl9CisJLyogV3JpdGVyOiBlbmQgKi8KKworCXdoaWxlKHBhcnRpYWwgPiBwKQorCXsKKwkJYnJlbHNlKHBhcnRpYWwtPmJoKTsKKwkJcGFydGlhbC0tOworCX0KK25vX3RvcDoKKwlyZXR1cm4gcGFydGlhbDsKK30KKworLyoKKyAqIFplcm8gYSBudW1iZXIgb2YgYmxvY2sgcG9pbnRlcnMgaW4gZWl0aGVyIGFuIGlub2RlIG9yIGFuIGluZGlyZWN0IGJsb2NrLgorICogSWYgd2UgcmVzdGFydCB0aGUgdHJhbnNhY3Rpb24gd2UgbXVzdCBhZ2FpbiBnZXQgd3JpdGUgYWNjZXNzIHRvIHRoZQorICogaW5kaXJlY3QgYmxvY2sgZm9yIGZ1cnRoZXIgbW9kaWZpY2F0aW9uLgorICoKKyAqIFdlIHJlbGVhc2UgYGNvdW50JyBibG9ja3Mgb24gZGlzaywgYnV0IChsYXN0IC0gZmlyc3QpIG1heSBiZSBncmVhdGVyCisgKiB0aGFuIGBjb3VudCcgYmVjYXVzZSB0aGVyZSBjYW4gYmUgaG9sZXMgaW4gdGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkCitleHQzX2NsZWFyX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQl1bnNpZ25lZCBsb25nIGJsb2NrX3RvX2ZyZWUsIHVuc2lnbmVkIGxvbmcgY291bnQsCisJCV9fbGUzMiAqZmlyc3QsIF9fbGUzMiAqbGFzdCkKK3sKKwlfX2xlMzIgKnA7CisJaWYgKHRyeV90b19leHRlbmRfdHJhbnNhY3Rpb24oaGFuZGxlLCBpbm9kZSkpIHsKKwkJaWYgKGJoKSB7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCQkJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCQl9CisJCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwkJZXh0M19qb3VybmFsX3Rlc3RfcmVzdGFydChoYW5kbGUsIGlub2RlKTsKKwkJaWYgKGJoKSB7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJyZXRha2luZyB3cml0ZSBhY2Nlc3MiKTsKKwkJCWV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQl9CisJfQorCisJLyoKKwkgKiBBbnkgYnVmZmVycyB3aGljaCBhcmUgb24gdGhlIGpvdXJuYWwgd2lsbCBiZSBpbiBtZW1vcnkuIFdlIGZpbmQKKwkgKiB0aGVtIG9uIHRoZSBoYXNoIHRhYmxlIHNvIGpvdXJuYWxfcmV2b2tlKCkgd2lsbCBydW4gam91cm5hbF9mb3JnZXQoKQorCSAqIG9uIHRoZW0uICBXZSd2ZSBhbHJlYWR5IGRldGFjaGVkIGVhY2ggYmxvY2sgZnJvbSB0aGUgZmlsZSwgc28KKwkgKiBiZm9yZ2V0KCkgaW4gam91cm5hbF9mb3JnZXQoKSBzaG91bGQgYmUgc2FmZS4KKwkgKgorCSAqIEFLUE06IHR1cm4gb24gYmZvcmdldCBpbiBqb3VybmFsX2ZvcmdldCgpISEhCisJICovCisJZm9yIChwID0gZmlyc3Q7IHAgPCBsYXN0OyBwKyspIHsKKwkJdTMyIG5yID0gbGUzMl90b19jcHUoKnApOworCQlpZiAobnIpIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkJCSpwID0gMDsKKwkJCWJoID0gc2JfZmluZF9nZXRfYmxvY2soaW5vZGUtPmlfc2IsIG5yKTsKKwkJCWV4dDNfZm9yZ2V0KGhhbmRsZSwgMCwgaW5vZGUsIGJoLCBucik7CisJCX0KKwl9CisKKwlleHQzX2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJsb2NrX3RvX2ZyZWUsIGNvdW50KTsKK30KKworLyoqCisgKiBleHQzX2ZyZWVfZGF0YSAtIGZyZWUgYSBsaXN0IG9mIGRhdGEgYmxvY2tzCisgKiBAaGFuZGxlOgloYW5kbGUgZm9yIHRoaXMgdHJhbnNhY3Rpb24KKyAqIEBpbm9kZToJaW5vZGUgd2UgYXJlIGRlYWxpbmcgd2l0aAorICogQHRoaXNfYmg6CWluZGlyZWN0IGJ1ZmZlcl9oZWFkIHdoaWNoIGNvbnRhaW5zICpAZmlyc3QgYW5kICpAbGFzdAorICogQGZpcnN0OglhcnJheSBvZiBibG9jayBudW1iZXJzCisgKiBAbGFzdDoJcG9pbnRzIGltbWVkaWF0ZWx5IHBhc3QgdGhlIGVuZCBvZiBhcnJheQorICoKKyAqIFdlIGFyZSBmcmVlaW5nIGFsbCBibG9ja3MgcmVmZXJlZCBmcm9tIHRoYXQgYXJyYXkgKG51bWJlcnMgYXJlIHN0b3JlZCBhcworICogbGl0dGxlLWVuZGlhbiAzMi1iaXQpIGFuZCB1cGRhdGluZyBAaW5vZGUtPmlfYmxvY2tzIGFwcHJvcHJpYXRlbHkuCisgKgorICogV2UgYWNjdW11bGF0ZSBjb250aWd1b3VzIHJ1bnMgb2YgYmxvY2tzIHRvIGZyZWUuICBDb252ZW5pZW50bHksIGlmIHRoZXNlCisgKiBibG9ja3MgYXJlIGNvbnRpZ3VvdXMgdGhlbiByZWxlYXNpbmcgdGhlbSBhdCBvbmUgdGltZSB3aWxsIG9ubHkgYWZmZWN0IG9uZQorICogb3IgdHdvIGJpdG1hcCBibG9ja3MgKCsgZ3JvdXAgZGVzY3JpcHRvcihzKSBhbmQgc3VwZXJibG9jaykgYW5kIHdlIHdvbid0CisgKiBhY3R1YWxseSB1c2UgYSBsb3Qgb2Ygam91cm5hbCBzcGFjZS4KKyAqCisgKiBAdGhpc19iaCB3aWxsIGJlICVOVUxMIGlmIEBmaXJzdCBhbmQgQGxhc3QgcG9pbnQgaW50byB0aGUgaW5vZGUncyBkaXJlY3QKKyAqIGJsb2NrIHBvaW50ZXJzLgorICovCitzdGF0aWMgdm9pZCBleHQzX2ZyZWVfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICp0aGlzX2JoLAorCQkJICAgX19sZTMyICpmaXJzdCwgX19sZTMyICpsYXN0KQoreworCXVuc2lnbmVkIGxvbmcgYmxvY2tfdG9fZnJlZSA9IDA7ICAgIC8qIFN0YXJ0aW5nIGJsb2NrICMgb2YgYSBydW4gKi8KKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsJICAgIC8qIE51bWJlciBvZiBibG9ja3MgaW4gdGhlIHJ1biAqLyAKKwlfX2xlMzIgKmJsb2NrX3RvX2ZyZWVfcCA9IE5VTEw7CSAgICAvKiBQb2ludGVyIGludG8gaW5vZGUvaW5kCisJCQkJCSAgICAgICBjb3JyZXNwb25kaW5nIHRvCisJCQkJCSAgICAgICBibG9ja190b19mcmVlICovCisJdW5zaWduZWQgbG9uZyBucjsJCSAgICAvKiBDdXJyZW50IGJsb2NrICMgKi8KKwlfX2xlMzIgKnA7CQkJICAgIC8qIFBvaW50ZXIgaW50byBpbm9kZS9pbmQKKwkJCQkJICAgICAgIGZvciBjdXJyZW50IGJsb2NrICovCisJaW50IGVycjsKKworCWlmICh0aGlzX2JoKSB7CQkJCS8qIEZvciBpbmRpcmVjdCBibG9jayAqLworCQlCVUZGRVJfVFJBQ0UodGhpc19iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCB0aGlzX2JoKTsKKwkJLyogSW1wb3J0YW50OiBpZiB3ZSBjYW4ndCB1cGRhdGUgdGhlIGluZGlyZWN0IHBvaW50ZXJzCisJCSAqIHRvIHRoZSBibG9ja3MsIHdlIGNhbid0IGZyZWUgdGhlbS4gKi8KKwkJaWYgKGVycikKKwkJCXJldHVybjsKKwl9CisKKwlmb3IgKHAgPSBmaXJzdDsgcCA8IGxhc3Q7IHArKykgeworCQluciA9IGxlMzJfdG9fY3B1KCpwKTsKKwkJaWYgKG5yKSB7CisJCQkvKiBhY2N1bXVsYXRlIGJsb2NrcyB0byBmcmVlIGlmIHRoZXkncmUgY29udGlndW91cyAqLworCQkJaWYgKGNvdW50ID09IDApIHsKKwkJCQlibG9ja190b19mcmVlID0gbnI7CisJCQkJYmxvY2tfdG9fZnJlZV9wID0gcDsKKwkJCQljb3VudCA9IDE7CisJCQl9IGVsc2UgaWYgKG5yID09IGJsb2NrX3RvX2ZyZWUgKyBjb3VudCkgeworCQkJCWNvdW50Kys7CisJCQl9IGVsc2UgeworCQkJCWV4dDNfY2xlYXJfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIHRoaXNfYmgsIAorCQkJCQkJICBibG9ja190b19mcmVlLAorCQkJCQkJICBjb3VudCwgYmxvY2tfdG9fZnJlZV9wLCBwKTsKKwkJCQlibG9ja190b19mcmVlID0gbnI7CisJCQkJYmxvY2tfdG9fZnJlZV9wID0gcDsKKwkJCQljb3VudCA9IDE7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoY291bnQgPiAwKQorCQlleHQzX2NsZWFyX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCB0aGlzX2JoLCBibG9ja190b19mcmVlLAorCQkJCSAgY291bnQsIGJsb2NrX3RvX2ZyZWVfcCwgcCk7CisKKwlpZiAodGhpc19iaCkgeworCQlCVUZGRVJfVFJBQ0UodGhpc19iaCwgImNhbGwgZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIHRoaXNfYmgpOworCX0KK30KKworLyoqCisgKglleHQzX2ZyZWVfYnJhbmNoZXMgLSBmcmVlIGFuIGFycmF5IG9mIGJyYW5jaGVzCisgKglAaGFuZGxlOiBKQkQgaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCisgKglAaW5vZGU6CWlub2RlIHdlIGFyZSBkZWFsaW5nIHdpdGgKKyAqCUBwYXJlbnRfYmg6IHRoZSBidWZmZXJfaGVhZCB3aGljaCBjb250YWlucyAqQGZpcnN0IGFuZCAqQGxhc3QKKyAqCUBmaXJzdDoJYXJyYXkgb2YgYmxvY2sgbnVtYmVycworICoJQGxhc3Q6CXBvaW50ZXIgaW1tZWRpYXRlbHkgcGFzdCB0aGUgZW5kIG9mIGFycmF5CisgKglAZGVwdGg6CWRlcHRoIG9mIHRoZSBicmFuY2hlcyB0byBmcmVlCisgKgorICoJV2UgYXJlIGZyZWVpbmcgYWxsIGJsb2NrcyByZWZlcmVkIGZyb20gdGhlc2UgYnJhbmNoZXMgKG51bWJlcnMgYXJlCisgKglzdG9yZWQgYXMgbGl0dGxlLWVuZGlhbiAzMi1iaXQpIGFuZCB1cGRhdGluZyBAaW5vZGUtPmlfYmxvY2tzCisgKglhcHByb3ByaWF0ZWx5LgorICovCitzdGF0aWMgdm9pZCBleHQzX2ZyZWVfYnJhbmNoZXMoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBhcmVudF9iaCwKKwkJCSAgICAgICBfX2xlMzIgKmZpcnN0LCBfX2xlMzIgKmxhc3QsIGludCBkZXB0aCkKK3sKKwl1bnNpZ25lZCBsb25nIG5yOworCV9fbGUzMiAqcDsKKworCWlmIChpc19oYW5kbGVfYWJvcnRlZChoYW5kbGUpKQorCQlyZXR1cm47CisKKwlpZiAoZGVwdGgtLSkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQlpbnQgYWRkcl9wZXJfYmxvY2sgPSBFWFQzX0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKTsKKwkJcCA9IGxhc3Q7CisJCXdoaWxlICgtLXAgPj0gZmlyc3QpIHsKKwkJCW5yID0gbGUzMl90b19jcHUoKnApOworCQkJaWYgKCFucikKKwkJCQljb250aW51ZTsJCS8qIEEgaG9sZSAqLworCisJCQkvKiBHbyByZWFkIHRoZSBidWZmZXIgZm9yIHRoZSBuZXh0IGxldmVsIGRvd24gKi8KKwkJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIG5yKTsKKworCQkJLyoKKwkJCSAqIEEgcmVhZCBmYWlsdXJlPyBSZXBvcnQgZXJyb3IgYW5kIGNsZWFyIHNsb3QKKwkJCSAqIChzaG91bGQgYmUgcmFyZSkuCisJCQkgKi8KKwkJCWlmICghYmgpIHsKKwkJCQlleHQzX2Vycm9yKGlub2RlLT5pX3NiLCAiZXh0M19mcmVlX2JyYW5jaGVzIiwKKwkJCQkJICAgIlJlYWQgZmFpbHVyZSwgaW5vZGU9JWxkLCBibG9jaz0lbGQiLAorCQkJCQkgICBpbm9kZS0+aV9pbm8sIG5yKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogVGhpcyB6YXBzIHRoZSBlbnRpcmUgYmxvY2suICBCb3R0b20gdXAuICovCisJCQlCVUZGRVJfVFJBQ0UoYmgsICJmcmVlIGNoaWxkIGJyYW5jaGVzIik7CisJCQlleHQzX2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgYmgsCisJCQkJCSAgIChfX2xlMzIqKWJoLT5iX2RhdGEsCisJCQkJCSAgIChfX2xlMzIqKWJoLT5iX2RhdGEgKyBhZGRyX3Blcl9ibG9jaywKKwkJCQkJICAgZGVwdGgpOworCisJCQkvKgorCQkJICogV2UndmUgcHJvYmFibHkgam91cm5hbGxlZCB0aGUgaW5kaXJlY3QgYmxvY2sgc2V2ZXJhbAorCQkJICogdGltZXMgZHVyaW5nIHRoZSB0cnVuY2F0ZS4gIEJ1dCBpdCdzIG5vIGxvbmdlcgorCQkJICogbmVlZGVkIGFuZCB3ZSBub3cgZHJvcCBpdCBmcm9tIHRoZSB0cmFuc2FjdGlvbiB2aWEKKwkJCSAqIGpvdXJuYWxfcmV2b2tlKCkuCisJCQkgKgorCQkJICogVGhhdCdzIGVhc3kgaWYgaXQncyBleGNsdXNpdmVseSBwYXJ0IG9mIHRoaXMKKwkJCSAqIHRyYW5zYWN0aW9uLiAgQnV0IGlmIGl0J3MgcGFydCBvZiB0aGUgY29tbWl0dGluZworCQkJICogdHJhbnNhY3Rpb24gdGhlbiBqb3VybmFsX2ZvcmdldCgpIHdpbGwgc2ltcGx5CisJCQkgKiBicmVsc2UoKSBpdC4gIFRoYXQgbWVhbnMgdGhhdCBpZiB0aGUgdW5kZXJseWluZworCQkJICogYmxvY2sgaXMgcmVhbGxvY2F0ZWQgaW4gZXh0M19nZXRfYmxvY2soKSwKKwkJCSAqIHVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEoKSB3aWxsIGZpbmQgdGhpcyBibG9jaworCQkJICogYW5kIHdpbGwgdHJ5IHRvIGdldCByaWQgb2YgaXQuICBkYW1uLCBkYW1uLgorCQkJICoKKwkJCSAqIElmIHRoaXMgYmxvY2sgaGFzIGFscmVhZHkgYmVlbiBjb21taXR0ZWQgdG8gdGhlCisJCQkgKiBqb3VybmFsLCBhIHJldm9rZSByZWNvcmQgd2lsbCBiZSB3cml0dGVuLiAgQW5kCisJCQkgKiByZXZva2UgcmVjb3JkcyBtdXN0IGJlIGVtaXR0ZWQgKmJlZm9yZSogY2xlYXJpbmcKKwkJCSAqIHRoaXMgYmxvY2sncyBiaXQgaW4gdGhlIGJpdG1hcHMuCisJCQkgKi8KKwkJCWV4dDNfZm9yZ2V0KGhhbmRsZSwgMSwgaW5vZGUsIGJoLCBiaC0+Yl9ibG9ja25yKTsKKworCQkJLyoKKwkJCSAqIEV2ZXJ5dGhpbmcgYmVsb3cgdGhpcyB0aGlzIHBvaW50ZXIgaGFzIGJlZW4KKwkJCSAqIHJlbGVhc2VkLiAgTm93IGxldCB0aGlzIHRvcC1vZi1zdWJ0cmVlIGdvLgorCQkJICoKKwkJCSAqIFdlIHdhbnQgdGhlIGZyZWVpbmcgb2YgdGhpcyBpbmRpcmVjdCBibG9jayB0byBiZQorCQkJICogYXRvbWljIGluIHRoZSBqb3VybmFsIHdpdGggdGhlIHVwZGF0aW5nIG9mIHRoZQorCQkJICogYml0bWFwIGJsb2NrIHdoaWNoIG93bnMgaXQuICBTbyBtYWtlIHNvbWUgcm9vbSBpbgorCQkJICogdGhlIGpvdXJuYWwuCisJCQkgKgorCQkJICogV2UgemVybyB0aGUgcGFyZW50IHBvaW50ZXIgKmFmdGVyKiBmcmVlaW5nIGl0cworCQkJICogcG9pbnRlZSBpbiB0aGUgYml0bWFwcywgc28gaWYgZXh0ZW5kX3RyYW5zYWN0aW9uKCkKKwkJCSAqIGZvciBzb21lIHJlYXNvbiBmYWlscyB0byBwdXQgdGhlIGJpdG1hcCBjaGFuZ2VzIGFuZAorCQkJICogdGhlIHJlbGVhc2UgaW50byB0aGUgc2FtZSB0cmFuc2FjdGlvbiwgcmVjb3ZlcnkKKwkJCSAqIHdpbGwgbWVyZWx5IGNvbXBsYWluIGFib3V0IHJlbGVhc2luZyBhIGZyZWUgYmxvY2ssCisJCQkgKiByYXRoZXIgdGhhbiBsZWFraW5nIGJsb2Nrcy4KKwkJCSAqLworCQkJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCisJCQkJcmV0dXJuOworCQkJaWYgKHRyeV90b19leHRlbmRfdHJhbnNhY3Rpb24oaGFuZGxlLCBpbm9kZSkpIHsKKwkJCQlleHQzX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJCQkJZXh0M19qb3VybmFsX3Rlc3RfcmVzdGFydChoYW5kbGUsIGlub2RlKTsKKwkJCX0KKworCQkJZXh0M19mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBuciwgMSk7CisKKwkJCWlmIChwYXJlbnRfYmgpIHsKKwkJCQkvKgorCQkJCSAqIFRoZSBibG9jayB3aGljaCB3ZSBoYXZlIGp1c3QgZnJlZWQgaXMKKwkJCQkgKiBwb2ludGVkIHRvIGJ5IGFuIGluZGlyZWN0IGJsb2NrOiBqb3VybmFsIGl0CisJCQkJICovCisJCQkJQlVGRkVSX1RSQUNFKHBhcmVudF9iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJCQlpZiAoIWV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwKKwkJCQkJCQkJICAgcGFyZW50X2JoKSl7CisJCQkJCSpwID0gMDsKKwkJCQkJQlVGRkVSX1RSQUNFKHBhcmVudF9iaCwKKwkJCQkJImNhbGwgZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJCQkJCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIAorCQkJCQkJCQkgICAgcGFyZW50X2JoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBXZSBoYXZlIHJlYWNoZWQgdGhlIGJvdHRvbSBvZiB0aGUgdHJlZS4gKi8KKwkJQlVGRkVSX1RSQUNFKHBhcmVudF9iaCwgImZyZWUgZGF0YSBibG9ja3MiKTsKKwkJZXh0M19mcmVlX2RhdGEoaGFuZGxlLCBpbm9kZSwgcGFyZW50X2JoLCBmaXJzdCwgbGFzdCk7CisJfQorfQorCisvKgorICogZXh0M190cnVuY2F0ZSgpCisgKgorICogV2UgYmxvY2sgb3V0IGV4dDNfZ2V0X2Jsb2NrKCkgYmxvY2sgaW5zdGFudGlhdGlvbnMgYWNyb3NzIHRoZSBlbnRpcmUKKyAqIHRyYW5zYWN0aW9uLCBhbmQgVkZTL1ZNIGVuc3VyZXMgdGhhdCBleHQzX3RydW5jYXRlKCkgY2Fubm90IHJ1bgorICogc2ltdWx0YW5lb3VzbHkgb24gYmVoYWxmIG9mIHRoZSBzYW1lIGlub2RlLgorICoKKyAqIEFzIHdlIHdvcmsgdGhyb3VnaCB0aGUgdHJ1bmNhdGUgYW5kIGNvbW1taXQgYml0cyBvZiBpdCB0byB0aGUgam91cm5hbCB0aGVyZQorICogaXMgb25lIGNvcmUsIGd1aWRpbmcgcHJpbmNpcGxlOiB0aGUgZmlsZSdzIHRyZWUgbXVzdCBhbHdheXMgYmUgY29uc2lzdGVudCBvbgorICogZGlzay4gIFdlIG11c3QgYmUgYWJsZSB0byByZXN0YXJ0IHRoZSB0cnVuY2F0ZSBhZnRlciBhIGNyYXNoLgorICoKKyAqIFRoZSBmaWxlJ3MgdHJlZSBtYXkgYmUgdHJhbnNpZW50bHkgaW5jb25zaXN0ZW50IGluIG1lbW9yeSAoYWx0aG91Z2ggaXQKKyAqIHByb2JhYmx5IGlzbid0KSwgYnV0IHdoZW5ldmVyIHdlIGNsb3NlIG9mZiBhbmQgY29tbWl0IGEgam91cm5hbCB0cmFuc2FjdGlvbiwKKyAqIHRoZSBjb250ZW50cyBvZiAodGhlIGZpbGVzeXN0ZW0gKyB0aGUgam91cm5hbCkgbXVzdCBiZSBjb25zaXN0ZW50IGFuZAorICogcmVzdGFydGFibGUuICBJdCdzIHByZXR0eSBzaW1wbGUsIHJlYWxseTogYm90dG9tIHVwLCByaWdodCB0byBsZWZ0IChhbHRob3VnaAorICogbGVmdC10by1yaWdodCB3b3JrcyBPSyB0b28pLgorICoKKyAqIE5vdGUgdGhhdCBhdCByZWNvdmVyeSB0aW1lLCBqb3VybmFsIHJlcGxheSBvY2N1cnMgKmJlZm9yZSogdGhlIHJlc3RhcnQgb2YKKyAqIHRydW5jYXRlIGFnYWluc3QgdGhlIG9ycGhhbiBpbm9kZSBsaXN0LgorICoKKyAqIFRoZSBjb21taXR0ZWQgaW5vZGUgaGFzIHRoZSBuZXcsIGRlc2lyZWQgaV9zaXplICh3aGljaCBpcyB0aGUgc2FtZSBhcworICogaV9kaXNrc2l6ZSBpbiB0aGlzIGNhc2UpLiAgQWZ0ZXIgYSBjcmFzaCwgZXh0M19vcnBoYW5fY2xlYW51cCgpIHdpbGwgc2VlCisgKiB0aGF0IHRoaXMgaW5vZGUncyB0cnVuY2F0ZSBkaWQgbm90IGNvbXBsZXRlIGFuZCBpdCB3aWxsIGFnYWluIGNhbGwKKyAqIGV4dDNfdHJ1bmNhdGUoKSB0byBoYXZlIGFub3RoZXIgZ28uICBTbyB0aGVyZSB3aWxsIGJlIGluc3RhbnRpYXRlZCBibG9ja3MKKyAqIHRvIHRoZSByaWdodCBvZiB0aGUgdHJ1bmNhdGlvbiBwb2ludCBpbiBhIGNyYXNoZWQgZXh0MyBmaWxlc3lzdGVtLiAgQnV0CisgKiB0aGF0J3MgZmluZSAtIGFzIGxvbmcgYXMgdGhleSBhcmUgbGlua2VkIGZyb20gdGhlIGlub2RlLCB0aGUgcG9zdC1jcmFzaAorICogZXh0M190cnVuY2F0ZSgpIHJ1biB3aWxsIGZpbmQgdGhlbSBhbmQgcmVsZWFzZSB0aGVtLgorICovCisKK3ZvaWQgZXh0M190cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBleHQzX2lub2RlX2luZm8gKmVpID0gRVhUM19JKGlub2RlKTsKKwlfX2xlMzIgKmlfZGF0YSA9IGVpLT5pX2RhdGE7CisJaW50IGFkZHJfcGVyX2Jsb2NrID0gRVhUM19BRERSX1BFUl9CTE9DSyhpbm9kZS0+aV9zYik7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCWludCBvZmZzZXRzWzRdOworCUluZGlyZWN0IGNoYWluWzRdOworCUluZGlyZWN0ICpwYXJ0aWFsOworCV9fbGUzMiBuciA9IDA7CisJaW50IG47CisJbG9uZyBsYXN0X2Jsb2NrOworCXVuc2lnbmVkIGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCWlmICghKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fAorCSAgICBTX0lTTE5LKGlub2RlLT5pX21vZGUpKSkKKwkJcmV0dXJuOworCWlmIChleHQzX2lub2RlX2lzX2Zhc3Rfc3ltbGluayhpbm9kZSkpCisJCXJldHVybjsKKwlpZiAoSVNfQVBQRU5EKGlub2RlKSB8fCBJU19JTU1VVEFCTEUoaW5vZGUpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFdlIGhhdmUgdG8gbG9jayB0aGUgRU9GIHBhZ2UgaGVyZSwgYmVjYXVzZSBsb2NrX3BhZ2UoKSBuZXN0cworCSAqIG91dHNpZGUgam91cm5hbF9zdGFydCgpLgorCSAqLworCWlmICgoaW5vZGUtPmlfc2l6ZSAmIChibG9ja3NpemUgLSAxKSkgPT0gMCkgeworCQkvKiBCbG9jayBib3VuZGFyeT8gTm90aGluZyB0byBkbyAqLworCQlwYWdlID0gTlVMTDsKKwl9IGVsc2UgeworCQlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsCisJCQkJaW5vZGUtPmlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJaWYgKCFwYWdlKQorCQkJcmV0dXJuOworCX0KKworCWhhbmRsZSA9IHN0YXJ0X3RyYW5zYWN0aW9uKGlub2RlKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJaWYgKHBhZ2UpIHsKKwkJCWNsZWFyX2hpZ2hwYWdlKHBhZ2UpOworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJfQorCQlyZXR1cm47CQkvKiBBS1BNOiByZXR1cm4gd2hhdD8gKi8KKwl9CisKKwlsYXN0X2Jsb2NrID0gKGlub2RlLT5pX3NpemUgKyBibG9ja3NpemUtMSkKKwkJCQkJPj4gRVhUM19CTE9DS19TSVpFX0JJVFMoaW5vZGUtPmlfc2IpOworCisJaWYgKHBhZ2UpCisJCWV4dDNfYmxvY2tfdHJ1bmNhdGVfcGFnZShoYW5kbGUsIHBhZ2UsIG1hcHBpbmcsIGlub2RlLT5pX3NpemUpOworCisJbiA9IGV4dDNfYmxvY2tfdG9fcGF0aChpbm9kZSwgbGFzdF9ibG9jaywgb2Zmc2V0cywgTlVMTCk7CisJaWYgKG4gPT0gMCkKKwkJZ290byBvdXRfc3RvcDsJLyogZXJyb3IgKi8KKworCS8qCisJICogT0suICBUaGlzIHRydW5jYXRlIGlzIGdvaW5nIHRvIGhhcHBlbi4gIFdlIGFkZCB0aGUgaW5vZGUgdG8gdGhlCisJICogb3JwaGFuIGxpc3QsIHNvIHRoYXQgaWYgdGhpcyB0cnVuY2F0ZSBzcGFucyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMsCisJICogYW5kIHdlIGNyYXNoLCB3ZSB3aWxsIHJlc3VtZSB0aGUgdHJ1bmNhdGUgd2hlbiB0aGUgZmlsZXN5c3RlbQorCSAqIHJlY292ZXJzLiAgSXQgYWxzbyBtYXJrcyB0aGUgaW5vZGUgZGlydHksIHRvIGNhdGNoIHRoZSBuZXcgc2l6ZS4KKwkgKgorCSAqIEltcGxpY2F0aW9uOiB0aGUgZmlsZSBtdXN0IGFsd2F5cyBiZSBpbiBhIHNhbmUsIGNvbnNpc3RlbnQKKwkgKiB0cnVuY2F0YWJsZSBzdGF0ZSB3aGlsZSBlYWNoIHRyYW5zYWN0aW9uIGNvbW1pdHMuCisJICovCisJaWYgKGV4dDNfb3JwaGFuX2FkZChoYW5kbGUsIGlub2RlKSkKKwkJZ290byBvdXRfc3RvcDsKKworCS8qCisJICogVGhlIG9ycGhhbiBsaXN0IGVudHJ5IHdpbGwgbm93IHByb3RlY3QgdXMgZnJvbSBhbnkgY3Jhc2ggd2hpY2gKKwkgKiBvY2N1cnMgYmVmb3JlIHRoZSB0cnVuY2F0ZSBjb21wbGV0ZXMsIHNvIGl0IGlzIG5vdyBzYWZlIHRvIHByb3BhZ2F0ZQorCSAqIHRoZSBuZXcsIHNob3J0ZXIgaW5vZGUgc2l6ZSAoaGVsZCBmb3Igbm93IGluIGlfc2l6ZSkgaW50byB0aGUKKwkgKiBvbi1kaXNrIGlub2RlLiBXZSBkbyB0aGlzIHZpYSBpX2Rpc2tzaXplLCB3aGljaCBpcyB0aGUgdmFsdWUgd2hpY2gKKwkgKiBleHQzICpyZWFsbHkqIHdyaXRlcyBvbnRvIHRoZSBkaXNrIGlub2RlLgorCSAqLworCWVpLT5pX2Rpc2tzaXplID0gaW5vZGUtPmlfc2l6ZTsKKworCS8qCisJICogRnJvbSBoZXJlIHdlIGJsb2NrIG91dCBhbGwgZXh0M19nZXRfYmxvY2soKSBjYWxsZXJzIHdobyB3YW50IHRvCisJICogbW9kaWZ5IHRoZSBibG9jayBhbGxvY2F0aW9uIHRyZWUuCisJICovCisJZG93bigmZWktPnRydW5jYXRlX3NlbSk7CisKKwlpZiAobiA9PSAxKSB7CQkvKiBkaXJlY3QgYmxvY2tzICovCisJCWV4dDNfZnJlZV9kYXRhKGhhbmRsZSwgaW5vZGUsIE5VTEwsIGlfZGF0YStvZmZzZXRzWzBdLAorCQkJICAgICAgIGlfZGF0YSArIEVYVDNfTkRJUl9CTE9DS1MpOworCQlnb3RvIGRvX2luZGlyZWN0czsKKwl9CisKKwlwYXJ0aWFsID0gZXh0M19maW5kX3NoYXJlZChpbm9kZSwgbiwgb2Zmc2V0cywgY2hhaW4sICZucik7CisJLyogS2lsbCB0aGUgdG9wIG9mIHNoYXJlZCBicmFuY2ggKG5vdCBkZXRhY2hlZCkgKi8KKwlpZiAobnIpIHsKKwkJaWYgKHBhcnRpYWwgPT0gY2hhaW4pIHsKKwkJCS8qIFNoYXJlZCBicmFuY2ggZ3Jvd3MgZnJvbSB0aGUgaW5vZGUgKi8KKwkJCWV4dDNfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBOVUxMLAorCQkJCQkgICAmbnIsICZucisxLCAoY2hhaW4rbi0xKSAtIHBhcnRpYWwpOworCQkJKnBhcnRpYWwtPnAgPSAwOworCQkJLyoKKwkJCSAqIFdlIG1hcmsgdGhlIGlub2RlIGRpcnR5IHByaW9yIHRvIHJlc3RhcnQsCisJCQkgKiBhbmQgcHJpb3IgdG8gc3RvcC4gIE5vIG5lZWQgZm9yIGl0IGhlcmUuCisJCQkgKi8KKwkJfSBlbHNlIHsKKwkJCS8qIFNoYXJlZCBicmFuY2ggZ3Jvd3MgZnJvbSBhbiBpbmRpcmVjdCBibG9jayAqLworCQkJQlVGRkVSX1RSQUNFKHBhcnRpYWwtPmJoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOworCQkJZXh0M19mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIHBhcnRpYWwtPmJoLAorCQkJCQlwYXJ0aWFsLT5wLAorCQkJCQlwYXJ0aWFsLT5wKzEsIChjaGFpbituLTEpIC0gcGFydGlhbCk7CisJCX0KKwl9CisJLyogQ2xlYXIgdGhlIGVuZHMgb2YgaW5kaXJlY3QgYmxvY2tzIG9uIHRoZSBzaGFyZWQgYnJhbmNoICovCisJd2hpbGUgKHBhcnRpYWwgPiBjaGFpbikgeworCQlleHQzX2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgcGFydGlhbC0+YmgsIHBhcnRpYWwtPnAgKyAxLAorCQkJCSAgIChfX2xlMzIqKXBhcnRpYWwtPmJoLT5iX2RhdGErYWRkcl9wZXJfYmxvY2ssCisJCQkJICAgKGNoYWluK24tMSkgLSBwYXJ0aWFsKTsKKwkJQlVGRkVSX1RSQUNFKHBhcnRpYWwtPmJoLCAiY2FsbCBicmVsc2UiKTsKKwkJYnJlbHNlIChwYXJ0aWFsLT5iaCk7CisJCXBhcnRpYWwtLTsKKwl9Citkb19pbmRpcmVjdHM6CisJLyogS2lsbCB0aGUgcmVtYWluaW5nICh3aG9sZSkgc3VidHJlZXMgKi8KKwlzd2l0Y2ggKG9mZnNldHNbMF0pIHsKKwkJZGVmYXVsdDoKKwkJCW5yID0gaV9kYXRhW0VYVDNfSU5EX0JMT0NLXTsKKwkJCWlmIChucikgeworCQkJCWV4dDNfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBOVUxMLAorCQkJCQkJICAgJm5yLCAmbnIrMSwgMSk7CisJCQkJaV9kYXRhW0VYVDNfSU5EX0JMT0NLXSA9IDA7CisJCQl9CisJCWNhc2UgRVhUM19JTkRfQkxPQ0s6CisJCQluciA9IGlfZGF0YVtFWFQzX0RJTkRfQkxPQ0tdOworCQkJaWYgKG5yKSB7CisJCQkJZXh0M19mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIE5VTEwsCisJCQkJCQkgICAmbnIsICZucisxLCAyKTsKKwkJCQlpX2RhdGFbRVhUM19ESU5EX0JMT0NLXSA9IDA7CisJCQl9CisJCWNhc2UgRVhUM19ESU5EX0JMT0NLOgorCQkJbnIgPSBpX2RhdGFbRVhUM19USU5EX0JMT0NLXTsKKwkJCWlmIChucikgeworCQkJCWV4dDNfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBOVUxMLAorCQkJCQkJICAgJm5yLCAmbnIrMSwgMyk7CisJCQkJaV9kYXRhW0VYVDNfVElORF9CTE9DS10gPSAwOworCQkJfQorCQljYXNlIEVYVDNfVElORF9CTE9DSzoKKwkJCTsKKwl9CisKKwlleHQzX2Rpc2NhcmRfcmVzZXJ2YXRpb24oaW5vZGUpOworCisJdXAoJmVpLT50cnVuY2F0ZV9zZW0pOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKworCS8qIEluIGEgbXVsdGktdHJhbnNhY3Rpb24gdHJ1bmNhdGUsIHdlIG9ubHkgbWFrZSB0aGUgZmluYWwKKwkgKiB0cmFuc2FjdGlvbiBzeW5jaHJvbm91cyAqLworCWlmIChJU19TWU5DKGlub2RlKSkKKwkJaGFuZGxlLT5oX3N5bmMgPSAxOworb3V0X3N0b3A6CisJLyoKKwkgKiBJZiB0aGlzIHdhcyBhIHNpbXBsZSBmdHJ1bmNhdGUoKSwgYW5kIHRoZSBmaWxlIHdpbGwgcmVtYWluIGFsaXZlCisJICogdGhlbiB3ZSBuZWVkIHRvIGNsZWFyIHVwIHRoZSBvcnBoYW4gcmVjb3JkIHdoaWNoIHdlIGNyZWF0ZWQgYWJvdmUuCisJICogSG93ZXZlciwgaWYgdGhpcyB3YXMgYSByZWFsIHVubGluayB0aGVuIHdlIHdlcmUgY2FsbGVkIGJ5CisJICogZXh0M19kZWxldGVfaW5vZGUoKSwgYW5kIHdlIGFsbG93IHRoYXQgZnVuY3Rpb24gdG8gY2xlYW4gdXAgdGhlCisJICogb3JwaGFuIGluZm8gZm9yIHVzLgorCSAqLworCWlmIChpbm9kZS0+aV9ubGluaykKKwkJZXh0M19vcnBoYW5fZGVsKGhhbmRsZSwgaW5vZGUpOworCisJZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZXh0M19nZXRfaW5vZGVfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJdW5zaWduZWQgbG9uZyBpbm8sIHN0cnVjdCBleHQzX2lsb2MgKmlsb2MpCit7CisJdW5zaWduZWQgbG9uZyBkZXNjLCBncm91cF9kZXNjLCBibG9ja19ncm91cDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgYmxvY2s7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICogZ2RwOworCisKKwlpZiAoKGlubyAhPSBFWFQzX1JPT1RfSU5PICYmCisJCWlubyAhPSBFWFQzX0pPVVJOQUxfSU5PICYmCisJCWlubyAhPSBFWFQzX1JFU0laRV9JTk8gJiYKKwkJaW5vIDwgRVhUM19GSVJTVF9JTk8oc2IpKSB8fAorCQlpbm8gPiBsZTMyX3RvX2NwdSgKKwkJCUVYVDNfU0Ioc2IpLT5zX2VzLT5zX2lub2Rlc19jb3VudCkpIHsKKwkJZXh0M19lcnJvciAoc2IsICJleHQzX2dldF9pbm9kZV9ibG9jayIsCisJCQkgICAgImJhZCBpbm9kZSBudW1iZXI6ICVsdSIsIGlubyk7CisJCXJldHVybiAwOworCX0KKwlibG9ja19ncm91cCA9IChpbm8gLSAxKSAvIEVYVDNfSU5PREVTX1BFUl9HUk9VUChzYik7CisJaWYgKGJsb2NrX2dyb3VwID49IEVYVDNfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudCkgeworCQlleHQzX2Vycm9yIChzYiwgImV4dDNfZ2V0X2lub2RlX2Jsb2NrIiwKKwkJCSAgICAiZ3JvdXAgPj0gZ3JvdXBzIGNvdW50Iik7CisJCXJldHVybiAwOworCX0KKwlzbXBfcm1iKCk7CisJZ3JvdXBfZGVzYyA9IGJsb2NrX2dyb3VwID4+IEVYVDNfREVTQ19QRVJfQkxPQ0tfQklUUyhzYik7CisJZGVzYyA9IGJsb2NrX2dyb3VwICYgKEVYVDNfREVTQ19QRVJfQkxPQ0soc2IpIC0gMSk7CisJYmggPSBFWFQzX1NCKHNiKS0+c19ncm91cF9kZXNjW2dyb3VwX2Rlc2NdOworCWlmICghYmgpIHsKKwkJZXh0M19lcnJvciAoc2IsICJleHQzX2dldF9pbm9kZV9ibG9jayIsCisJCQkgICAgIkRlc2NyaXB0b3Igbm90IGxvYWRlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlnZHAgPSAoc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqKSBiaC0+Yl9kYXRhOworCS8qCisJICogRmlndXJlIG91dCB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgYmxvY2sgZ3JvdXAgaW5vZGUgdGFibGUKKwkgKi8KKwlvZmZzZXQgPSAoKGlubyAtIDEpICUgRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKSkgKgorCQlFWFQzX0lOT0RFX1NJWkUoc2IpOworCWJsb2NrID0gbGUzMl90b19jcHUoZ2RwW2Rlc2NdLmJnX2lub2RlX3RhYmxlKSArCisJCShvZmZzZXQgPj4gRVhUM19CTE9DS19TSVpFX0JJVFMoc2IpKTsKKworCWlsb2MtPmJsb2NrX2dyb3VwID0gYmxvY2tfZ3JvdXA7CisJaWxvYy0+b2Zmc2V0ID0gb2Zmc2V0ICYgKEVYVDNfQkxPQ0tfU0laRShzYikgLSAxKTsKKwlyZXR1cm4gYmxvY2s7Cit9CisKKy8qCisgKiBleHQzX2dldF9pbm9kZV9sb2MgcmV0dXJucyB3aXRoIGFuIGV4dHJhIHJlZmNvdW50IGFnYWluc3QgdGhlIGlub2RlJ3MKKyAqIHVuZGVybHlpbmcgYnVmZmVyX2hlYWQgb24gc3VjY2Vzcy4gSWYgJ2luX21lbScgaXMgdHJ1ZSwgd2UgaGF2ZSBhbGwKKyAqIGRhdGEgaW4gbWVtb3J5IHRoYXQgaXMgbmVlZGVkIHRvIHJlY3JlYXRlIHRoZSBvbi1kaXNrIHZlcnNpb24gb2YgdGhpcworICogaW5vZGUuCisgKi8KK3N0YXRpYyBpbnQgX19leHQzX2dldF9pbm9kZV9sb2Moc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlzdHJ1Y3QgZXh0M19pbG9jICppbG9jLCBpbnQgaW5fbWVtKQoreworCXVuc2lnbmVkIGxvbmcgYmxvY2s7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCWJsb2NrID0gZXh0M19nZXRfaW5vZGVfYmxvY2soaW5vZGUtPmlfc2IsIGlub2RlLT5pX2lubywgaWxvYyk7CisJaWYgKCFibG9jaykKKwkJcmV0dXJuIC1FSU87CisKKwliaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgYmxvY2spOworCWlmICghYmgpIHsKKwkJZXh0M19lcnJvciAoaW5vZGUtPmlfc2IsICJleHQzX2dldF9pbm9kZV9sb2MiLAorCQkJCSJ1bmFibGUgdG8gcmVhZCBpbm9kZSBibG9jayAtICIKKwkJCQkiaW5vZGU9JWx1LCBibG9jaz0lbHUiLCBpbm9kZS0+aV9pbm8sIGJsb2NrKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQlsb2NrX2J1ZmZlcihiaCk7CisJCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCQkvKiBzb21lb25lIGJyb3VnaHQgaXQgdXB0b2RhdGUgd2hpbGUgd2Ugd2FpdGVkICovCisJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJCWdvdG8gaGFzX2J1ZmZlcjsKKwkJfQorCisJCS8qCisJCSAqIElmIHdlIGhhdmUgYWxsIGluZm9ybWF0aW9uIG9mIHRoZSBpbm9kZSBpbiBtZW1vcnkgYW5kIHRoaXMKKwkJICogaXMgdGhlIG9ubHkgdmFsaWQgaW5vZGUgaW4gdGhlIGJsb2NrLCB3ZSBuZWVkIG5vdCByZWFkIHRoZQorCQkgKiBibG9jay4KKwkJICovCisJCWlmIChpbl9tZW0pIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoOworCQkJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqZGVzYzsKKwkJCWludCBpbm9kZXNfcGVyX2J1ZmZlcjsKKwkJCWludCBpbm9kZV9vZmZzZXQsIGk7CisJCQlpbnQgYmxvY2tfZ3JvdXA7CisJCQlpbnQgc3RhcnQ7CisKKwkJCWJsb2NrX2dyb3VwID0gKGlub2RlLT5pX2lubyAtIDEpIC8KKwkJCQkJRVhUM19JTk9ERVNfUEVSX0dST1VQKGlub2RlLT5pX3NiKTsKKwkJCWlub2Rlc19wZXJfYnVmZmVyID0gYmgtPmJfc2l6ZSAvCisJCQkJRVhUM19JTk9ERV9TSVpFKGlub2RlLT5pX3NiKTsKKwkJCWlub2RlX29mZnNldCA9ICgoaW5vZGUtPmlfaW5vIC0gMSkgJQorCQkJCQlFWFQzX0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpKTsKKwkJCXN0YXJ0ID0gaW5vZGVfb2Zmc2V0ICYgfihpbm9kZXNfcGVyX2J1ZmZlciAtIDEpOworCisJCQkvKiBJcyB0aGUgaW5vZGUgYml0bWFwIGluIGNhY2hlPyAqLworCQkJZGVzYyA9IGV4dDNfZ2V0X2dyb3VwX2Rlc2MoaW5vZGUtPmlfc2IsCisJCQkJCQlibG9ja19ncm91cCwgTlVMTCk7CisJCQlpZiAoIWRlc2MpCisJCQkJZ290byBtYWtlX2lvOworCisJCQliaXRtYXBfYmggPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsCisJCQkJCWxlMzJfdG9fY3B1KGRlc2MtPmJnX2lub2RlX2JpdG1hcCkpOworCQkJaWYgKCFiaXRtYXBfYmgpCisJCQkJZ290byBtYWtlX2lvOworCisJCQkvKgorCQkJICogSWYgdGhlIGlub2RlIGJpdG1hcCBpc24ndCBpbiBjYWNoZSB0aGVuIHRoZQorCQkJICogb3B0aW1pc2F0aW9uIG1heSBlbmQgdXAgcGVyZm9ybWluZyB0d28gcmVhZHMgaW5zdGVhZAorCQkJICogb2Ygb25lLCBzbyBza2lwIGl0LgorCQkJICovCisJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaXRtYXBfYmgpKSB7CisJCQkJYnJlbHNlKGJpdG1hcF9iaCk7CisJCQkJZ290byBtYWtlX2lvOworCQkJfQorCQkJZm9yIChpID0gc3RhcnQ7IGkgPCBzdGFydCArIGlub2Rlc19wZXJfYnVmZmVyOyBpKyspIHsKKwkJCQlpZiAoaSA9PSBpbm9kZV9vZmZzZXQpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChleHQzX3Rlc3RfYml0KGksIGJpdG1hcF9iaC0+Yl9kYXRhKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVsc2UoYml0bWFwX2JoKTsKKwkJCWlmIChpID09IHN0YXJ0ICsgaW5vZGVzX3Blcl9idWZmZXIpIHsKKwkJCQkvKiBhbGwgb3RoZXIgaW5vZGVzIGFyZSBmcmVlLCBzbyBza2lwIEkvTyAqLworCQkJCW1lbXNldChiaC0+Yl9kYXRhLCAwLCBiaC0+Yl9zaXplKTsKKwkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJCQlnb3RvIGhhc19idWZmZXI7CisJCQl9CisJCX0KKworbWFrZV9pbzoKKwkJLyoKKwkJICogVGhlcmUgYXJlIG90aGVyIHZhbGlkIGlub2RlcyBpbiB0aGUgYnVmZmVyLCB0aGlzIGlub2RlCisJCSAqIGhhcyBpbi1pbm9kZSB4YXR0cnMsIG9yIHdlIGRvbid0IGhhdmUgdGhpcyBpbm9kZSBpbiBtZW1vcnkuCisJCSAqIFJlYWQgdGhlIGJsb2NrIGZyb20gZGlzay4KKwkJICovCisJCWdldF9iaChiaCk7CisJCWJoLT5iX2VuZF9pbyA9IGVuZF9idWZmZXJfcmVhZF9zeW5jOworCQlzdWJtaXRfYmgoUkVBRCwgYmgpOworCQl3YWl0X29uX2J1ZmZlcihiaCk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJZXh0M19lcnJvcihpbm9kZS0+aV9zYiwgImV4dDNfZ2V0X2lub2RlX2xvYyIsCisJCQkJCSJ1bmFibGUgdG8gcmVhZCBpbm9kZSBibG9jayAtICIKKwkJCQkJImlub2RlPSVsdSwgYmxvY2s9JWx1IiwKKwkJCQkJaW5vZGUtPmlfaW5vLCBibG9jayk7CisJCQlicmVsc2UoYmgpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CitoYXNfYnVmZmVyOgorCWlsb2MtPmJoID0gYmg7CisJcmV0dXJuIDA7Cit9CisKK2ludCBleHQzX2dldF9pbm9kZV9sb2Moc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDNfaWxvYyAqaWxvYykKK3sKKwkvKiBXZSBoYXZlIGFsbCBpbm9kZSBkYXRhIGV4Y2VwdCB4YXR0cnMgaW4gbWVtb3J5IGhlcmUuICovCisJcmV0dXJuIF9fZXh0M19nZXRfaW5vZGVfbG9jKGlub2RlLCBpbG9jLAorCQkhKEVYVDNfSShpbm9kZSktPmlfc3RhdGUgJiBFWFQzX1NUQVRFX1hBVFRSKSk7Cit9CisKK3ZvaWQgZXh0M19zZXRfaW5vZGVfZmxhZ3Moc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBFWFQzX0koaW5vZGUpLT5pX2ZsYWdzOworCisJaW5vZGUtPmlfZmxhZ3MgJj0gfihTX1NZTkN8U19BUFBFTkR8U19JTU1VVEFCTEV8U19OT0FUSU1FfFNfRElSU1lOQyk7CisJaWYgKGZsYWdzICYgRVhUM19TWU5DX0ZMKQorCQlpbm9kZS0+aV9mbGFncyB8PSBTX1NZTkM7CisJaWYgKGZsYWdzICYgRVhUM19BUFBFTkRfRkwpCisJCWlub2RlLT5pX2ZsYWdzIHw9IFNfQVBQRU5EOworCWlmIChmbGFncyAmIEVYVDNfSU1NVVRBQkxFX0ZMKQorCQlpbm9kZS0+aV9mbGFncyB8PSBTX0lNTVVUQUJMRTsKKwlpZiAoZmxhZ3MgJiBFWFQzX05PQVRJTUVfRkwpCisJCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9BVElNRTsKKwlpZiAoZmxhZ3MgJiBFWFQzX0RJUlNZTkNfRkwpCisJCWlub2RlLT5pX2ZsYWdzIHw9IFNfRElSU1lOQzsKK30KKwordm9pZCBleHQzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworCXN0cnVjdCBleHQzX2lub2RlICpyYXdfaW5vZGU7CisJc3RydWN0IGV4dDNfaW5vZGVfaW5mbyAqZWkgPSBFWFQzX0koaW5vZGUpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IGJsb2NrOworCisjaWZkZWYgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMCisJZWktPmlfYWNsID0gRVhUM19BQ0xfTk9UX0NBQ0hFRDsKKwllaS0+aV9kZWZhdWx0X2FjbCA9IEVYVDNfQUNMX05PVF9DQUNIRUQ7CisjZW5kaWYKKwllaS0+aV9ibG9ja19hbGxvY19pbmZvID0gTlVMTDsKKworCWlmIChfX2V4dDNfZ2V0X2lub2RlX2xvYyhpbm9kZSwgJmlsb2MsIDApKQorCQlnb3RvIGJhZF9pbm9kZTsKKwliaCA9IGlsb2MuYmg7CisJcmF3X2lub2RlID0gZXh0M19yYXdfaW5vZGUoJmlsb2MpOworCWlub2RlLT5pX21vZGUgPSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfbW9kZSk7CisJaW5vZGUtPmlfdWlkID0gKHVpZF90KWxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV91aWRfbG93KTsKKwlpbm9kZS0+aV9naWQgPSAoZ2lkX3QpbGUxNl90b19jcHUocmF3X2lub2RlLT5pX2dpZF9sb3cpOworCWlmKCEodGVzdF9vcHQgKGlub2RlLT5pX3NiLCBOT19VSUQzMikpKSB7CisJCWlub2RlLT5pX3VpZCB8PSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfdWlkX2hpZ2gpIDw8IDE2OworCQlpbm9kZS0+aV9naWQgfD0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX2dpZF9oaWdoKSA8PCAxNjsKKwl9CisJaW5vZGUtPmlfbmxpbmsgPSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfbGlua3NfY291bnQpOworCWlub2RlLT5pX3NpemUgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfc2l6ZSk7CisJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2F0aW1lKTsKKwlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfY3RpbWUpOworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9tdGltZSk7CisJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IGlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSBpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gMDsKKworCWVpLT5pX3N0YXRlID0gMDsKKwllaS0+aV9kaXJfc3RhcnRfbG9va3VwID0gMDsKKwllaS0+aV9kdGltZSA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9kdGltZSk7CisJLyogV2Ugbm93IGhhdmUgZW5vdWdoIGZpZWxkcyB0byBjaGVjayBpZiB0aGUgaW5vZGUgd2FzIGFjdGl2ZSBvciBub3QuCisJICogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBuZnNkIG1pZ2h0IHRyeSB0byBhY2Nlc3MgZGVhZCBpbm9kZXMKKwkgKiB0aGUgdGVzdCBpcyB0aGF0IHNhbWUgb25lIHRoYXQgZTJmc2NrIHVzZXMKKwkgKiBOZWlsQnJvd24gMTk5OW9jdDE1CisJICovCisJaWYgKGlub2RlLT5pX25saW5rID09IDApIHsKKwkJaWYgKGlub2RlLT5pX21vZGUgPT0gMCB8fAorCQkgICAgIShFWFQzX1NCKGlub2RlLT5pX3NiKS0+c19tb3VudF9zdGF0ZSAmIEVYVDNfT1JQSEFOX0ZTKSkgeworCQkJLyogdGhpcyBpbm9kZSBpcyBkZWxldGVkICovCisJCQlicmVsc2UgKGJoKTsKKwkJCWdvdG8gYmFkX2lub2RlOworCQl9CisJCS8qIFRoZSBvbmx5IHVubGlua2VkIGlub2RlcyB3ZSBsZXQgdGhyb3VnaCBoZXJlIGhhdmUKKwkJICogdmFsaWQgaV9tb2RlIGFuZCBhcmUgYmVpbmcgcmVhZCBieSB0aGUgb3JwaGFuCisJCSAqIHJlY292ZXJ5IGNvZGU6IHRoYXQncyBmaW5lLCB3ZSdyZSBhYm91dCB0byBjb21wbGV0ZQorCQkgKiB0aGUgcHJvY2VzcyBvZiBkZWxldGluZyB0aG9zZS4gKi8KKwl9CisJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfU0laRTsJLyogVGhpcyBpcyB0aGUgb3B0aW1hbCBJTyBzaXplCisJCQkJCSAqIChmb3Igc3RhdCksIG5vdCB0aGUgZnMgYmxvY2sKKwkJCQkJICogc2l6ZSAqLyAgCisJaW5vZGUtPmlfYmxvY2tzID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2Jsb2Nrcyk7CisJZWktPmlfZmxhZ3MgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfZmxhZ3MpOworI2lmZGVmIEVYVDNfRlJBR01FTlRTCisJZWktPmlfZmFkZHIgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfZmFkZHIpOworCWVpLT5pX2ZyYWdfbm8gPSByYXdfaW5vZGUtPmlfZnJhZzsKKwllaS0+aV9mcmFnX3NpemUgPSByYXdfaW5vZGUtPmlfZnNpemU7CisjZW5kaWYKKwllaS0+aV9maWxlX2FjbCA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9maWxlX2FjbCk7CisJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCWVpLT5pX2Rpcl9hY2wgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfZGlyX2FjbCk7CisJfSBlbHNlIHsKKwkJaW5vZGUtPmlfc2l6ZSB8PQorCQkJKChfX3U2NClsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfc2l6ZV9oaWdoKSkgPDwgMzI7CisJfQorCWVpLT5pX2Rpc2tzaXplID0gaW5vZGUtPmlfc2l6ZTsKKwlpbm9kZS0+aV9nZW5lcmF0aW9uID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2dlbmVyYXRpb24pOworCWVpLT5pX2Jsb2NrX2dyb3VwID0gaWxvYy5ibG9ja19ncm91cDsKKwkvKgorCSAqIE5PVEUhIFRoZSBpbi1tZW1vcnkgaW5vZGUgaV9kYXRhIGFycmF5IGlzIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIKKwkgKiBldmVuIG9uIGJpZy1lbmRpYW4gbWFjaGluZXM6IHdlIGRvIE5PVCBieXRlc3dhcCB0aGUgYmxvY2sgbnVtYmVycyEKKwkgKi8KKwlmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCBFWFQzX05fQkxPQ0tTOyBibG9jaysrKQorCQllaS0+aV9kYXRhW2Jsb2NrXSA9IHJhd19pbm9kZS0+aV9ibG9ja1tibG9ja107CisJSU5JVF9MSVNUX0hFQUQoJmVpLT5pX29ycGhhbik7CisKKwlpZiAoaW5vZGUtPmlfaW5vID49IEVYVDNfRklSU1RfSU5PKGlub2RlLT5pX3NiKSArIDEgJiYKKwkgICAgRVhUM19JTk9ERV9TSVpFKGlub2RlLT5pX3NiKSA+IEVYVDNfR09PRF9PTERfSU5PREVfU0laRSkgeworCQkvKgorCQkgKiBXaGVuIG1rZTJmcyBjcmVhdGVzIGJpZyBpbm9kZXMgaXQgZG9lcyBub3QgemVybyBvdXQKKwkJICogdGhlIHVudXNlZCBieXRlcyBhYm92ZSBFWFQzX0dPT0RfT0xEX0lOT0RFX1NJWkUsCisJCSAqIHNvIGlnbm9yZSB0aG9zZSBmaXJzdCBmZXcgaW5vZGVzLgorCQkgKi8KKwkJZWktPmlfZXh0cmFfaXNpemUgPSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfZXh0cmFfaXNpemUpOworCQlpZiAoRVhUM19HT09EX09MRF9JTk9ERV9TSVpFICsgZWktPmlfZXh0cmFfaXNpemUgPgorCQkgICAgRVhUM19JTk9ERV9TSVpFKGlub2RlLT5pX3NiKSkKKwkJCWdvdG8gYmFkX2lub2RlOworCQlpZiAoZWktPmlfZXh0cmFfaXNpemUgPT0gMCkgeworCQkJLyogVGhlIGV4dHJhIHNwYWNlIGlzIGN1cnJlbnRseSB1bnVzZWQuIFVzZSBpdC4gKi8KKwkJCWVpLT5pX2V4dHJhX2lzaXplID0gc2l6ZW9mKHN0cnVjdCBleHQzX2lub2RlKSAtCisJCQkJCSAgICBFWFQzX0dPT0RfT0xEX0lOT0RFX1NJWkU7CisJCX0gZWxzZSB7CisJCQlfX2xlMzIgKm1hZ2ljID0gKHZvaWQgKilyYXdfaW5vZGUgKworCQkJCQlFWFQzX0dPT0RfT0xEX0lOT0RFX1NJWkUgKworCQkJCQllaS0+aV9leHRyYV9pc2l6ZTsKKwkJCWlmICgqbWFnaWMgPT0gY3B1X3RvX2xlMzIoRVhUM19YQVRUUl9NQUdJQykpCisJCQkJIGVpLT5pX3N0YXRlIHw9IEVYVDNfU1RBVEVfWEFUVFI7CisJCX0KKwl9IGVsc2UKKwkJZWktPmlfZXh0cmFfaXNpemUgPSAwOworCisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmZXh0M19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZleHQzX2ZpbGVfb3BlcmF0aW9uczsKKwkJZXh0M19zZXRfYW9wcyhpbm9kZSk7CisJfSBlbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJmV4dDNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZleHQzX2Rpcl9vcGVyYXRpb25zOworCX0gZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgeworCQlpZiAoZXh0M19pbm9kZV9pc19mYXN0X3N5bWxpbmsoaW5vZGUpKQorCQkJaW5vZGUtPmlfb3AgPSAmZXh0M19mYXN0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJZWxzZSB7CisJCQlpbm9kZS0+aV9vcCA9ICZleHQzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWV4dDNfc2V0X2FvcHMoaW5vZGUpOworCQl9CisJfSBlbHNlIHsKKwkJaW5vZGUtPmlfb3AgPSAmZXh0M19zcGVjaWFsX2lub2RlX29wZXJhdGlvbnM7CisJCWlmIChyYXdfaW5vZGUtPmlfYmxvY2tbMF0pCisJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCisJCQkgICBvbGRfZGVjb2RlX2RldihsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfYmxvY2tbMF0pKSk7CisJCWVsc2UgCisJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCisJCQkgICBuZXdfZGVjb2RlX2RldihsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfYmxvY2tbMV0pKSk7CisJfQorCWJyZWxzZSAoaWxvYy5iaCk7CisJZXh0M19zZXRfaW5vZGVfZmxhZ3MoaW5vZGUpOworCXJldHVybjsKKworYmFkX2lub2RlOgorCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBQb3N0IHRoZSBzdHJ1Y3QgaW5vZGUgaW5mbyBpbnRvIGFuIG9uLWRpc2sgaW5vZGUgbG9jYXRpb24gaW4gdGhlCisgKiBidWZmZXItY2FjaGUuICBUaGlzIGdvYmJsZXMgdGhlIGNhbGxlcidzIHJlZmVyZW5jZSB0byB0aGUKKyAqIGJ1ZmZlcl9oZWFkIGluIHRoZSBpbm9kZSBsb2NhdGlvbiBzdHJ1Y3QuCisgKgorICogVGhlIGNhbGxlciBtdXN0IGhhdmUgd3JpdGUgYWNjZXNzIHRvIGlsb2MtPmJoLgorICovCitzdGF0aWMgaW50IGV4dDNfZG9fdXBkYXRlX2lub2RlKGhhbmRsZV90ICpoYW5kbGUsIAorCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIAorCQkJCXN0cnVjdCBleHQzX2lsb2MgKmlsb2MpCit7CisJc3RydWN0IGV4dDNfaW5vZGUgKnJhd19pbm9kZSA9IGV4dDNfcmF3X2lub2RlKGlsb2MpOworCXN0cnVjdCBleHQzX2lub2RlX2luZm8gKmVpID0gRVhUM19JKGlub2RlKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gaWxvYy0+Ymg7CisJaW50IGVyciA9IDAsIHJjLCBibG9jazsKKworCS8qIEZvciBmaWVsZHMgbm90IG5vdCB0cmFja2luZyBpbiB0aGUgaW4tbWVtb3J5IGlub2RlLAorCSAqIGluaXRpYWxpc2UgdGhlbSB0byB6ZXJvIGZvciBuZXcgaW5vZGVzLiAqLworCWlmIChlaS0+aV9zdGF0ZSAmIEVYVDNfU1RBVEVfTkVXKQorCQltZW1zZXQocmF3X2lub2RlLCAwLCBFWFQzX1NCKGlub2RlLT5pX3NiKS0+c19pbm9kZV9zaXplKTsKKworCXJhd19pbm9kZS0+aV9tb2RlID0gY3B1X3RvX2xlMTYoaW5vZGUtPmlfbW9kZSk7CisJaWYoISh0ZXN0X29wdChpbm9kZS0+aV9zYiwgTk9fVUlEMzIpKSkgeworCQlyYXdfaW5vZGUtPmlfdWlkX2xvdyA9IGNwdV90b19sZTE2KGxvd18xNl9iaXRzKGlub2RlLT5pX3VpZCkpOworCQlyYXdfaW5vZGUtPmlfZ2lkX2xvdyA9IGNwdV90b19sZTE2KGxvd18xNl9iaXRzKGlub2RlLT5pX2dpZCkpOworLyoKKyAqIEZpeCB1cCBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb2xkIGtlcm5lbHMuIE90aGVyd2lzZSwgb2xkIGlub2RlcyBnZXQKKyAqIHJlLXVzZWQgd2l0aCB0aGUgdXBwZXIgMTYgYml0cyBvZiB0aGUgdWlkL2dpZCBpbnRhY3QKKyAqLworCQlpZighZWktPmlfZHRpbWUpIHsKKwkJCXJhd19pbm9kZS0+aV91aWRfaGlnaCA9CisJCQkJY3B1X3RvX2xlMTYoaGlnaF8xNl9iaXRzKGlub2RlLT5pX3VpZCkpOworCQkJcmF3X2lub2RlLT5pX2dpZF9oaWdoID0KKwkJCQljcHVfdG9fbGUxNihoaWdoXzE2X2JpdHMoaW5vZGUtPmlfZ2lkKSk7CisJCX0gZWxzZSB7CisJCQlyYXdfaW5vZGUtPmlfdWlkX2hpZ2ggPSAwOworCQkJcmF3X2lub2RlLT5pX2dpZF9oaWdoID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCXJhd19pbm9kZS0+aV91aWRfbG93ID0KKwkJCWNwdV90b19sZTE2KGZzX2hpZ2gybG93dWlkKGlub2RlLT5pX3VpZCkpOworCQlyYXdfaW5vZGUtPmlfZ2lkX2xvdyA9CisJCQljcHVfdG9fbGUxNihmc19oaWdoMmxvd2dpZChpbm9kZS0+aV9naWQpKTsKKwkJcmF3X2lub2RlLT5pX3VpZF9oaWdoID0gMDsKKwkJcmF3X2lub2RlLT5pX2dpZF9oaWdoID0gMDsKKwl9CisJcmF3X2lub2RlLT5pX2xpbmtzX2NvdW50ID0gY3B1X3RvX2xlMTYoaW5vZGUtPmlfbmxpbmspOworCXJhd19pbm9kZS0+aV9zaXplID0gY3B1X3RvX2xlMzIoZWktPmlfZGlza3NpemUpOworCXJhd19pbm9kZS0+aV9hdGltZSA9IGNwdV90b19sZTMyKGlub2RlLT5pX2F0aW1lLnR2X3NlYyk7CisJcmF3X2lub2RlLT5pX2N0aW1lID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfY3RpbWUudHZfc2VjKTsKKwlyYXdfaW5vZGUtPmlfbXRpbWUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9tdGltZS50dl9zZWMpOworCXJhd19pbm9kZS0+aV9ibG9ja3MgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9ibG9ja3MpOworCXJhd19pbm9kZS0+aV9kdGltZSA9IGNwdV90b19sZTMyKGVpLT5pX2R0aW1lKTsKKwlyYXdfaW5vZGUtPmlfZmxhZ3MgPSBjcHVfdG9fbGUzMihlaS0+aV9mbGFncyk7CisjaWZkZWYgRVhUM19GUkFHTUVOVFMKKwlyYXdfaW5vZGUtPmlfZmFkZHIgPSBjcHVfdG9fbGUzMihlaS0+aV9mYWRkcik7CisJcmF3X2lub2RlLT5pX2ZyYWcgPSBlaS0+aV9mcmFnX25vOworCXJhd19pbm9kZS0+aV9mc2l6ZSA9IGVpLT5pX2ZyYWdfc2l6ZTsKKyNlbmRpZgorCXJhd19pbm9kZS0+aV9maWxlX2FjbCA9IGNwdV90b19sZTMyKGVpLT5pX2ZpbGVfYWNsKTsKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJcmF3X2lub2RlLT5pX2Rpcl9hY2wgPSBjcHVfdG9fbGUzMihlaS0+aV9kaXJfYWNsKTsKKwl9IGVsc2UgeworCQlyYXdfaW5vZGUtPmlfc2l6ZV9oaWdoID0KKwkJCWNwdV90b19sZTMyKGVpLT5pX2Rpc2tzaXplID4+IDMyKTsKKwkJaWYgKGVpLT5pX2Rpc2tzaXplID4gMHg3ZmZmZmZmZlVMTCkgeworCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCQkJaWYgKCFFWFQzX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKKwkJCQkJRVhUM19GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFKSB8fAorCQkJICAgIEVYVDNfU0Ioc2IpLT5zX2VzLT5zX3Jldl9sZXZlbCA9PQorCQkJCQljcHVfdG9fbGUzMihFWFQzX0dPT0RfT0xEX1JFVikpIHsKKwkJCSAgICAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBsYXJnZSBmaWxlCisJCQkJKiBjcmVhdGVkLCBhZGQgYSBmbGFnIHRvIHRoZSBzdXBlcmJsb2NrLgorCQkJCSovCisJCQkJZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLAorCQkJCQkJRVhUM19TQihzYiktPnNfc2JoKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlnb3RvIG91dF9icmVsc2U7CisJCQkJZXh0M191cGRhdGVfZHluYW1pY19yZXYoc2IpOworCQkJCUVYVDNfU0VUX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAorCQkJCQlFWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEUpOworCQkJCXNiLT5zX2RpcnQgPSAxOworCQkJCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJCQllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLAorCQkJCQkJRVhUM19TQihzYiktPnNfc2JoKTsKKwkJCX0KKwkJfQorCX0KKwlyYXdfaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGNwdV90b19sZTMyKGlub2RlLT5pX2dlbmVyYXRpb24pOworCWlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKG9sZF92YWxpZF9kZXYoaW5vZGUtPmlfcmRldikpIHsKKwkJCXJhd19pbm9kZS0+aV9ibG9ja1swXSA9CisJCQkJY3B1X3RvX2xlMzIob2xkX2VuY29kZV9kZXYoaW5vZGUtPmlfcmRldikpOworCQkJcmF3X2lub2RlLT5pX2Jsb2NrWzFdID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJhd19pbm9kZS0+aV9ibG9ja1swXSA9IDA7CisJCQlyYXdfaW5vZGUtPmlfYmxvY2tbMV0gPQorCQkJCWNwdV90b19sZTMyKG5ld19lbmNvZGVfZGV2KGlub2RlLT5pX3JkZXYpKTsKKwkJCXJhd19pbm9kZS0+aV9ibG9ja1syXSA9IDA7CisJCX0KKwl9IGVsc2UgZm9yIChibG9jayA9IDA7IGJsb2NrIDwgRVhUM19OX0JMT0NLUzsgYmxvY2srKykKKwkJcmF3X2lub2RlLT5pX2Jsb2NrW2Jsb2NrXSA9IGVpLT5pX2RhdGFbYmxvY2tdOworCisJaWYgKEVYVDNfSU5PREVfU0laRShpbm9kZS0+aV9zYikgPiBFWFQzX0dPT0RfT0xEX0lOT0RFX1NJWkUpCisJCXJhd19pbm9kZS0+aV9leHRyYV9pc2l6ZSA9IGNwdV90b19sZTE2KGVpLT5pX2V4dHJhX2lzaXplKTsKKworCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJcmMgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJaWYgKCFlcnIpCisJCWVyciA9IHJjOworCWVpLT5pX3N0YXRlICY9IH5FWFQzX1NUQVRFX05FVzsKKworb3V0X2JyZWxzZToKKwlicmVsc2UgKGJoKTsKKwlleHQzX3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogZXh0M193cml0ZV9pbm9kZSgpCisgKgorICogV2UgYXJlIGNhbGxlZCBmcm9tIGEgZmV3IHBsYWNlczoKKyAqCisgKiAtIFdpdGhpbiBnZW5lcmljX2ZpbGVfd3JpdGUoKSBmb3IgT19TWU5DIGZpbGVzLgorICogICBIZXJlLCB0aGVyZSB3aWxsIGJlIG5vIHRyYW5zYWN0aW9uIHJ1bm5pbmcuIFdlIHdhaXQgZm9yIGFueSBydW5uaW5nCisgKiAgIHRyYXNuYWN0aW9uIHRvIGNvbW1pdC4KKyAqCisgKiAtIFdpdGhpbiBzeXNfc3luYygpLCBrdXBkYXRlIGFuZCBzdWNoLgorICogICBXZSB3YWl0IG9uIGNvbW1pdCwgaWYgdG9sIHRvLgorICoKKyAqIC0gV2l0aGluIHBydW5lX2ljYWNoZSgpIChQRl9NRU1BTExPQyA9PSB0cnVlKQorICogICBIZXJlIHdlIHNpbXBseSByZXR1cm4uICBXZSBjYW4ndCBhZmZvcmQgdG8gYmxvY2sga3N3YXBkIG9uIHRoZQorICogICBqb3VybmFsIGNvbW1pdC4KKyAqCisgKiBJbiBhbGwgY2FzZXMgaXQgaXMgYWN0dWFsbHkgc2FmZSBmb3IgdXMgdG8gcmV0dXJuIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcsCisgKiBiZWNhdXNlIHRoZSBpbm9kZSBoYXMgYmVlbiBjb3BpZWQgaW50byBhIHJhdyBpbm9kZSBidWZmZXIgaW4KKyAqIGV4dDNfbWFya19pbm9kZV9kaXJ0eSgpLiAgVGhpcyBpcyBhIGNvcnJlY3RuZXNzIHRoaW5nIGZvciBPX1NZTkMgYW5kIGZvcgorICoga25mc2QuCisgKgorICogTm90ZSB0aGF0IHdlIGFyZSBhYnNvbHV0ZWx5IGRlcGVuZGVudCB1cG9uIGFsbCBpbm9kZSBkaXJ0aWVycyBkb2luZyB0aGUKKyAqIHJpZ2h0IHRoaW5nOiB0aGV5ICptdXN0KiBjYWxsIG1hcmtfaW5vZGVfZGlydHkoKSBhZnRlciBkaXJ0eWluZyBpbmZvIGluCisgKiB3aGljaCB3ZSBhcmUgaW50ZXJlc3RlZC4KKyAqCisgKiBJdCB3b3VsZCBiZSBhIGJ1ZyBmb3IgdGhlbSB0byBub3QgZG8gdGhpcy4gIFRoZSBjb2RlOgorICoKKyAqCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpCisgKglzdHVmZigpOworICoJaW5vZGUtPmlfc2l6ZSA9IGV4cHI7CisgKgorICogaXMgaW4gZXJyb3IgYmVjYXVzZSBhIGtzd2FwZC1kcml2ZW4gd3JpdGVfaW5vZGUoKSBjb3VsZCBvY2N1ciB3aGlsZQorICogYHN0dWZmKCknIGlzIHJ1bm5pbmcsIGFuZCB0aGUgbmV3IGlfc2l6ZSB3aWxsIGJlIGxvc3QuICBQbHVzIHRoZSBpbm9kZQorICogd2lsbCBubyBsb25nZXIgYmUgb24gdGhlIHN1cGVyYmxvY2sncyBkaXJ0eSBpbm9kZSBsaXN0LgorICovCitpbnQgZXh0M193cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgd2FpdCkKK3sKKwlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9NRU1BTExPQykKKwkJcmV0dXJuIDA7CisKKwlpZiAoZXh0M19qb3VybmFsX2N1cnJlbnRfaGFuZGxlKCkpIHsKKwkJamJkX2RlYnVnKDAsICJjYWxsZWQgcmVjdXJzaXZlbHksIG5vbi1QRl9NRU1BTExPQyFcbiIpOworCQlkdW1wX3N0YWNrKCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICghd2FpdCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZXh0M19mb3JjZV9jb21taXQoaW5vZGUtPmlfc2IpOworfQorCisvKgorICogZXh0M19zZXRhdHRyKCkKKyAqCisgKiBDYWxsZWQgZnJvbSBub3RpZnlfY2hhbmdlLgorICoKKyAqIFdlIHdhbnQgdG8gdHJhcCBWRlMgYXR0ZW1wdHMgdG8gdHJ1bmNhdGUgdGhlIGZpbGUgYXMgc29vbiBhcworICogcG9zc2libGUuICBJbiBwYXJ0aWN1bGFyLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHdoZW4gdGhlIFZGUworICogc2hyaW5rcyBpX3NpemUsIHdlIHB1dCB0aGUgaW5vZGUgb24gdGhlIG9ycGhhbiBsaXN0IGFuZCBtb2RpZnkKKyAqIGlfZGlza3NpemUgaW1tZWRpYXRlbHksIHNvIHRoYXQgZHVyaW5nIHRoZSBzdWJzZXF1ZW50IGZsdXNoaW5nIG9mCisgKiBkaXJ0eSBwYWdlcyBhbmQgZnJlZWluZyBvZiBkaXNrIGJsb2Nrcywgd2UgY2FuIGd1YXJhbnRlZSB0aGF0IGFueQorICogY29tbWl0IHdpbGwgbGVhdmUgdGhlIGJsb2NrcyBiZWluZyBmbHVzaGVkIGluIGFuIHVudXNlZCBzdGF0ZSBvbgorICogZGlzay4gIChPbiByZWNvdmVyeSwgdGhlIGlub2RlIHdpbGwgZ2V0IHRydW5jYXRlZCBhbmQgdGhlIGJsb2NrcyB3aWxsCisgKiBiZSBmcmVlZCwgc28gd2UgaGF2ZSBhIHN0cm9uZyBndWFyYW50ZWUgdGhhdCBubyBmdXR1cmUgY29tbWl0IHdpbGwKKyAqIGxlYXZlIHRoZXNlIGJsb2NrcyB2aXNpYmxlIHRvIHRoZSB1c2VyLikgIAorICoKKyAqIENhbGxlZCB3aXRoIGlub2RlLT5zZW0gZG93bi4KKyAqLworaW50IGV4dDNfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvciwgcmMgPSAwOworCWNvbnN0IHVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHItPmlhX3ZhbGlkOworCisJZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGF0dHIpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKChpYV92YWxpZCAmIEFUVFJfVUlEICYmIGF0dHItPmlhX3VpZCAhPSBpbm9kZS0+aV91aWQpIHx8CisJCShpYV92YWxpZCAmIEFUVFJfR0lEICYmIGF0dHItPmlhX2dpZCAhPSBpbm9kZS0+aV9naWQpKSB7CisJCWhhbmRsZV90ICpoYW5kbGU7CisKKwkJLyogKHVzZXIrZ3JvdXApKihvbGQrbmV3KSBzdHJ1Y3R1cmUsIGlub2RlIHdyaXRlIChzYiwKKwkJICogaW5vZGUgYmxvY2ssID8gLSBidXQgdHJ1bmNhdGUgaW5vZGUgdXBkYXRlIGhhcyBpdCkgKi8KKwkJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCA0KkVYVDNfUVVPVEFfSU5JVF9CTE9DS1MrMyk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJZXJyb3IgPSBQVFJfRVJSKGhhbmRsZSk7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJZXJyb3IgPSBEUVVPVF9UUkFOU0ZFUihpbm9kZSwgYXR0cikgPyAtRURRVU9UIDogMDsKKwkJaWYgKGVycm9yKSB7CisJCQlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCS8qIFVwZGF0ZSBjb3JyZXNwb25kaW5nIGluZm8gaW4gaW5vZGUgc28gdGhhdCBldmVyeXRoaW5nIGlzIGluCisJCSAqIG9uZSB0cmFuc2FjdGlvbiAqLworCQlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCkKKwkJCWlub2RlLT5pX3VpZCA9IGF0dHItPmlhX3VpZDsKKwkJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpCisJCQlpbm9kZS0+aV9naWQgPSBhdHRyLT5pYV9naWQ7CisJCWVycm9yID0gZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCQlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCX0KKworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCisJICAgIGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFICYmIGF0dHItPmlhX3NpemUgPCBpbm9kZS0+aV9zaXplKSB7CisJCWhhbmRsZV90ICpoYW5kbGU7CisKKwkJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCAzKTsKKwkJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCQllcnJvciA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCisJCWVycm9yID0gZXh0M19vcnBoYW5fYWRkKGhhbmRsZSwgaW5vZGUpOworCQlFWFQzX0koaW5vZGUpLT5pX2Rpc2tzaXplID0gYXR0ci0+aWFfc2l6ZTsKKwkJcmMgPSBleHQzX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJCWlmICghZXJyb3IpCisJCQllcnJvciA9IHJjOworCQlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCX0KKworCXJjID0gaW5vZGVfc2V0YXR0cihpbm9kZSwgYXR0cik7CisKKwkvKiBJZiBpbm9kZV9zZXRhdHRyJ3MgY2FsbCB0byBleHQzX3RydW5jYXRlIGZhaWxlZCB0byBnZXQgYQorCSAqIHRyYW5zYWN0aW9uIGhhbmRsZSBhdCBhbGwsIHdlIG5lZWQgdG8gY2xlYW4gdXAgdGhlIGluLWNvcmUKKwkgKiBvcnBoYW4gbGlzdCBtYW51YWxseS4gKi8KKwlpZiAoaW5vZGUtPmlfbmxpbmspCisJCWV4dDNfb3JwaGFuX2RlbChOVUxMLCBpbm9kZSk7CisKKwlpZiAoIXJjICYmIChpYV92YWxpZCAmIEFUVFJfTU9ERSkpCisJCXJjID0gZXh0M19hY2xfY2htb2QoaW5vZGUpOworCitlcnJfb3V0OgorCWV4dDNfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnJvcik7CisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSByYzsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoKKyAqIGFrcG06IGhvdyBtYW55IGJsb2NrcyBkb3RoIG1ha2UgYSB3cml0ZXBhZ2UoKT8KKyAqCisgKiBXaXRoIE4gYmxvY2tzIHBlciBwYWdlLCBpdCBtYXkgYmU6CisgKiBOIGRhdGEgYmxvY2tzCisgKiAyIGluZGlyZWN0IGJsb2NrCisgKiAyIGRpbmRpcmVjdAorICogMSB0aW5kaXJlY3QKKyAqIE4rNSBiaXRtYXAgYmxvY2tzIChmcm9tIHRoZSBhYm92ZSkKKyAqIE4rNSBncm91cCBkZXNjcmlwdG9yIHN1bW1hcnkgYmxvY2tzCisgKiAxIGlub2RlIGJsb2NrCisgKiAxIHN1cGVyYmxvY2suCisgKiAyICogRVhUM19TSU5HTEVEQVRBX1RSQU5TX0JMT0NLUyBmb3IgdGhlIHF1b3RlIGZpbGVzCisgKgorICogMyAqIChOICsgNSkgKyAyICsgMiAqIEVYVDNfU0lOR0xFREFUQV9UUkFOU19CTE9DS1MKKyAqCisgKiBXaXRoIG9yZGVyZWQgb3Igd3JpdGViYWNrIGRhdGEgaXQncyB0aGUgc2FtZSwgbGVzcyB0aGUgTiBkYXRhIGJsb2Nrcy4KKyAqCisgKiBJZiB0aGUgaW5vZGUncyBkaXJlY3QgYmxvY2tzIGNhbiBob2xkIGFuIGludGVncmFsIG51bWJlciBvZiBwYWdlcyB0aGVuIGEKKyAqIHBhZ2UgY2Fubm90IHN0cmFkZGxlIHR3byBpbmRpcmVjdCBibG9ja3MsIGFuZCB3ZSBjYW4gb25seSB0b3VjaCBvbmUgaW5kaXJlY3QKKyAqIGFuZCBkaW5kaXJlY3QgYmxvY2ssIGFuZCB0aGUgIjUiIGFib3ZlIGJlY29tZXMgIjMiLgorICoKKyAqIFRoaXMgc3RpbGwgb3ZlcmVzdGltYXRlcyB1bmRlciBtb3N0IGNpcmN1bXN0YW5jZXMuICBJZiB3ZSB3ZXJlIHRvIHBhc3MgdGhlCisgKiBzdGFydCBhbmQgZW5kIG9mZnNldHMgaW4gaGVyZSBhcyB3ZWxsIHdlIGNvdWxkIGRvIGJsb2NrX3RvX3BhdGgoKSBvbiBlYWNoCisgKiBibG9jayBhbmQgd29yayBvdXQgdGhlIGV4YWN0IG51bWJlciBvZiBpbmRpcmVjdHMgd2hpY2ggYXJlIHRvdWNoZWQuICBQYWguCisgKi8KKworc3RhdGljIGludCBleHQzX3dyaXRlcGFnZV90cmFuc19ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbnQgYnBwID0gZXh0M19qb3VybmFsX2Jsb2Nrc19wZXJfcGFnZShpbm9kZSk7CisJaW50IGluZGlyZWN0cyA9IChFWFQzX05ESVJfQkxPQ0tTICUgYnBwKSA/IDUgOiAzOworCWludCByZXQ7CisKKwlpZiAoZXh0M19zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkKKwkJcmV0ID0gMyAqIChicHAgKyBpbmRpcmVjdHMpICsgMjsKKwllbHNlCisJCXJldCA9IDIgKiAoYnBwICsgaW5kaXJlY3RzKSArIDI7CisKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwkvKiBXZSBrbm93IHRoYXQgc3RydWN0dXJlIHdhcyBhbHJlYWR5IGFsbG9jYXRlZCBkdXJpbmcgRFFVT1RfSU5JVCBzbworCSAqIHdlIHdpbGwgYmUgdXBkYXRpbmcgb25seSB0aGUgZGF0YSBibG9ja3MgKyBpbm9kZXMgKi8KKwlyZXQgKz0gMipFWFQzX1FVT1RBX1RSQU5TX0JMT0NLUzsKKyNlbmRpZgorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIHByZXZpb3VzbHkgY2FsbGVkIGV4dDNfcmVzZXJ2ZV9pbm9kZV93cml0ZSgpLgorICogR2l2ZSB0aGlzLCB3ZSBrbm93IHRoYXQgdGhlIGNhbGxlciBhbHJlYWR5IGhhcyB3cml0ZSBhY2Nlc3MgdG8gaWxvYy0+YmguCisgKi8KK2ludCBleHQzX21hcmtfaWxvY19kaXJ0eShoYW5kbGVfdCAqaGFuZGxlLAorCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0M19pbG9jICppbG9jKQoreworCWludCBlcnIgPSAwOworCisJLyogdGhlIGRvX3VwZGF0ZV9pbm9kZSBjb25zdW1lcyBvbmUgYmgtPmJfY291bnQgKi8KKwlnZXRfYmgoaWxvYy0+YmgpOworCisJLyogZXh0M19kb191cGRhdGVfaW5vZGUoKSBkb2VzIGpvdXJuYWxfZGlydHlfbWV0YWRhdGEgKi8KKwllcnIgPSBleHQzX2RvX3VwZGF0ZV9pbm9kZShoYW5kbGUsIGlub2RlLCBpbG9jKTsKKwlwdXRfYmgoaWxvYy0+YmgpOworCXJldHVybiBlcnI7Cit9CisKKy8qIAorICogT24gc3VjY2VzcywgV2UgZW5kIHVwIHdpdGggYW4gb3V0c3RhbmRpbmcgcmVmZXJlbmNlIGNvdW50IGFnYWluc3QKKyAqIGlsb2MtPmJoLiAgVGhpcyBfbXVzdF8gYmUgY2xlYW5lZCB1cCBsYXRlci4gCisgKi8KKworaW50CitleHQzX3Jlc2VydmVfaW5vZGVfd3JpdGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgCisJCQkgc3RydWN0IGV4dDNfaWxvYyAqaWxvYykKK3sKKwlpbnQgZXJyID0gMDsKKwlpZiAoaGFuZGxlKSB7CisJCWVyciA9IGV4dDNfZ2V0X2lub2RlX2xvYyhpbm9kZSwgaWxvYyk7CisJCWlmICghZXJyKSB7CisJCQlCVUZGRVJfVFJBQ0UoaWxvYy0+YmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCQllcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlsb2MtPmJoKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlicmVsc2UoaWxvYy0+YmgpOworCQkJCWlsb2MtPmJoID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKwlleHQzX3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogYWtwbTogV2hhdCB3ZSBkbyBoZXJlIGlzIHRvIG1hcmsgdGhlIGluLWNvcmUgaW5vZGUgYXMgY2xlYW4KKyAqIHdpdGggcmVzcGVjdCB0byBpbm9kZSBkaXJ0aW5lc3MgKGl0IG1heSBzdGlsbCBiZSBkYXRhLWRpcnR5KS4KKyAqIFRoaXMgbWVhbnMgdGhhdCB0aGUgaW4tY29yZSBpbm9kZSBtYXkgYmUgcmVhcGVkIGJ5IHBydW5lX2ljYWNoZQorICogd2l0aG91dCBoYXZpbmcgdG8gcGVyZm9ybSBhbnkgSS9PLiAgVGhpcyBpcyBhIHZlcnkgZ29vZCB0aGluZywKKyAqIGJlY2F1c2UgKmFueSogdGFzayBtYXkgY2FsbCBwcnVuZV9pY2FjaGUgLSBldmVuIG9uZXMgd2hpY2gKKyAqIGhhdmUgYSB0cmFuc2FjdGlvbiBvcGVuIGFnYWluc3QgYSBkaWZmZXJlbnQgam91cm5hbC4KKyAqCisgKiBJcyB0aGlzIGNoZWF0aW5nPyAgTm90IHJlYWxseS4gIFN1cmUsIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUKKyAqIGlub2RlIG91dCwgYnV0IHBydW5lX2ljYWNoZSBpc24ndCBhIHVzZXItdmlzaWJsZSBzeW5jaW5nIGZ1bmN0aW9uLgorICogV2hlbmV2ZXIgdGhlIHVzZXIgd2FudHMgc3R1ZmYgc3luY2VkIChzeXNfc3luYywgc3lzX21zeW5jLCBzeXNfZnN5bmMpCisgKiB3ZSBzdGFydCBhbmQgd2FpdCBvbiBjb21taXRzLgorICoKKyAqIElzIHRoaXMgZWZmaWNpZW50L2VmZmVjdGl2ZT8gIFdlbGwsIHdlJ3JlIGJlaW5nIG5pY2UgdG8gdGhlIHN5c3RlbQorICogYnkgY2xlYW5pbmcgdXAgb3VyIGlub2RlcyBwcm9hY3RpdmVseSBzbyB0aGV5IGNhbiBiZSByZWFwZWQKKyAqIHdpdGhvdXQgSS9PLiAgQnV0IHdlIGFyZSBwb3RlbnRpYWxseSBsZWF2aW5nIHVwIHRvIGZpdmUgc2Vjb25kcycKKyAqIHdvcnRoIG9mIGlub2RlcyBmbG9hdGluZyBhYm91dCB3aGljaCBwcnVuZV9pY2FjaGUgd2FudHMgdXMgdG8KKyAqIHdyaXRlIG91dC4gIE9uZSB3YXkgdG8gZml4IHRoYXQgd291bGQgYmUgdG8gZ2V0IHBydW5lX2ljYWNoZSgpCisgKiB0byBkbyBhIHdyaXRlX3N1cGVyKCkgdG8gZnJlZSB1cCBzb21lIG1lbW9yeS4gIEl0IGhhcyB0aGUgZGVzaXJlZAorICogZWZmZWN0LgorICovCitpbnQgZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworCWludCBlcnI7CisKKwltaWdodF9zbGVlcCgpOworCWVyciA9IGV4dDNfcmVzZXJ2ZV9pbm9kZV93cml0ZShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CisJaWYgKCFlcnIpCisJCWVyciA9IGV4dDNfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogYWtwbTogZXh0M19kaXJ0eV9pbm9kZSgpIGlzIGNhbGxlZCBmcm9tIF9fbWFya19pbm9kZV9kaXJ0eSgpCisgKgorICogV2UncmUgcmVhbGx5IGludGVyZXN0ZWQgaW4gdGhlIGNhc2Ugd2hlcmUgYSBmaWxlIGlzIGJlaW5nIGV4dGVuZGVkLgorICogaV9zaXplIGhhcyBiZWVuIGNoYW5nZWQgYnkgZ2VuZXJpY19jb21taXRfd3JpdGUoKSBhbmQgd2UgdGh1cyBuZWVkCisgKiB0byBpbmNsdWRlIHRoZSB1cGRhdGVkIGlub2RlIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgorICoKKyAqIEFsc28sIERRVU9UX0FMTE9DX1NQQUNFKCkgd2lsbCBhbHdheXMgZGlydHkgdGhlIGlub2RlIHdoZW4gYmxvY2tzCisgKiBhcmUgYWxsb2NhdGVkIHRvIHRoZSBmaWxlLgorICoKKyAqIElmIHRoZSBpbm9kZSBpcyBtYXJrZWQgc3luY2hyb25vdXMsIHdlIGRvbid0IGhvbm91ciB0aGF0IGhlcmUgLSBkb2luZworICogc28gd291bGQgY2F1c2UgYSBjb21taXQgb24gYXRpbWUgdXBkYXRlcywgd2hpY2ggd2UgZG9uJ3QgYm90aGVyIGRvaW5nLgorICogV2UgaGFuZGxlIHN5bmNocm9ub3VzIGlub2RlcyBhdCB0aGUgaGlnaGVzdCBwb3NzaWJsZSBsZXZlbC4KKyAqLwordm9pZCBleHQzX2RpcnR5X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaGFuZGxlX3QgKmN1cnJlbnRfaGFuZGxlID0gZXh0M19qb3VybmFsX2N1cnJlbnRfaGFuZGxlKCk7CisJaGFuZGxlX3QgKmhhbmRsZTsKKworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChpbm9kZSwgMik7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlnb3RvIG91dDsKKwlpZiAoY3VycmVudF9oYW5kbGUgJiYKKwkJY3VycmVudF9oYW5kbGUtPmhfdHJhbnNhY3Rpb24gIT0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uKSB7CisJCS8qIFRoaXMgdGFzayBoYXMgYSB0cmFuc2FjdGlvbiBvcGVuIGFnYWluc3QgYSBkaWZmZXJlbnQgZnMgKi8KKwkJcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiB0cmFuc2FjdGlvbnMgZG8gbm90IG1hdGNoIVxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJfSBlbHNlIHsKKwkJamJkX2RlYnVnKDUsICJtYXJraW5nIGRpcnR5LiAgb3V0ZXIgaGFuZGxlPSVwXG4iLAorCQkJCWN1cnJlbnRfaGFuZGxlKTsKKwkJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCX0KKwlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworb3V0OgorCXJldHVybjsKK30KKworI2lmZGVmIEFLUE0KKy8qIAorICogQmluZCBhbiBpbm9kZSdzIGJhY2tpbmcgYnVmZmVyX2hlYWQgaW50byB0aGlzIHRyYW5zYWN0aW9uLCB0byBwcmV2ZW50CisgKiBpdCBmcm9tIGJlaW5nIGZsdXNoZWQgdG8gZGlzayBlYXJseS4gIFVubGlrZQorICogZXh0M19yZXNlcnZlX2lub2RlX3dyaXRlLCB0aGlzIGxlYXZlcyBiZWhpbmQgbm8gYmggcmVmZXJlbmNlIGFuZAorICogcmV0dXJucyBubyBpbG9jIHN0cnVjdHVyZSwgc28gdGhlIGNhbGxlciBuZWVkcyB0byByZXBlYXQgdGhlIGlsb2MKKyAqIGxvb2t1cCB0byBtYXJrIHRoZSBpbm9kZSBkaXJ0eSBsYXRlci4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2V4dDNfcGluX2lub2RlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworCisJaW50IGVyciA9IDA7CisJaWYgKGhhbmRsZSkgeworCQllcnIgPSBleHQzX2dldF9pbm9kZV9sb2MoaW5vZGUsICZpbG9jKTsKKwkJaWYgKCFlcnIpIHsKKwkJCUJVRkZFUl9UUkFDRShpbG9jLmJoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOworCQkJZXJyID0gam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgaWxvYy5iaCk7CisJCQlpZiAoIWVycikKKwkJCQllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCAKKwkJCQkJCQkJICBpbG9jLmJoKTsKKwkJCWJyZWxzZShpbG9jLmJoKTsKKwkJfQorCX0KKwlleHQzX3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKK2ludCBleHQzX2NoYW5nZV9pbm9kZV9qb3VybmFsX2ZsYWcoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHZhbCkKK3sKKwlqb3VybmFsX3QgKmpvdXJuYWw7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlpbnQgZXJyOworCisJLyoKKwkgKiBXZSBoYXZlIHRvIGJlIHZlcnkgY2FyZWZ1bCBoZXJlOiBjaGFuZ2luZyBhIGRhdGEgYmxvY2sncworCSAqIGpvdXJuYWxpbmcgc3RhdHVzIGR5bmFtaWNhbGx5IGlzIGRhbmdlcm91cy4gIElmIHdlIHdyaXRlIGEKKwkgKiBkYXRhIGJsb2NrIHRvIHRoZSBqb3VybmFsLCBjaGFuZ2UgdGhlIHN0YXR1cyBhbmQgdGhlbiBkZWxldGUKKwkgKiB0aGF0IGJsb2NrLCB3ZSByaXNrIGZvcmdldHRpbmcgdG8gcmV2b2tlIHRoZSBvbGQgbG9nIHJlY29yZAorCSAqIGZyb20gdGhlIGpvdXJuYWwgYW5kIHNvIGEgc3Vic2VxdWVudCByZXBsYXkgY2FuIGNvcnJ1cHQgZGF0YS4KKwkgKiBTbywgZmlyc3Qgd2UgbWFrZSBzdXJlIHRoYXQgdGhlIGpvdXJuYWwgaXMgZW1wdHkgYW5kIHRoYXQKKwkgKiBub2JvZHkgaXMgY2hhbmdpbmcgYW55dGhpbmcuCisJICovCisKKwlqb3VybmFsID0gRVhUM19KT1VSTkFMKGlub2RlKTsKKwlpZiAoaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpIHx8IElTX1JET05MWShpbm9kZSkpCisJCXJldHVybiAtRVJPRlM7CisKKwlqb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsKTsKKwlqb3VybmFsX2ZsdXNoKGpvdXJuYWwpOworCisJLyoKKwkgKiBPSywgdGhlcmUgYXJlIG5vIHVwZGF0ZXMgcnVubmluZyBub3csIGFuZCBhbGwgY2FjaGVkIGRhdGEgaXMKKwkgKiBzeW5jZWQgdG8gZGlzay4gIFdlIGFyZSBub3cgaW4gYSBjb21wbGV0ZWx5IGNvbnNpc3RlbnQgc3RhdGUKKwkgKiB3aGljaCBkb2Vzbid0IGhhdmUgYW55dGhpbmcgaW4gdGhlIGpvdXJuYWwsIGFuZCB3ZSBrbm93IHRoYXQKKwkgKiBubyBmaWxlc3lzdGVtIHVwZGF0ZXMgYXJlIHJ1bm5pbmcsIHNvIGl0IGlzIHNhZmUgdG8gbW9kaWZ5CisJICogdGhlIGlub2RlJ3MgaW4tY29yZSBkYXRhLWpvdXJuYWxpbmcgc3RhdGUgZmxhZyBub3cuCisJICovCisKKwlpZiAodmFsKQorCQlFWFQzX0koaW5vZGUpLT5pX2ZsYWdzIHw9IEVYVDNfSk9VUk5BTF9EQVRBX0ZMOworCWVsc2UKKwkJRVhUM19JKGlub2RlKS0+aV9mbGFncyAmPSB+RVhUM19KT1VSTkFMX0RBVEFfRkw7CisJZXh0M19zZXRfYW9wcyhpbm9kZSk7CisKKwlqb3VybmFsX3VubG9ja191cGRhdGVzKGpvdXJuYWwpOworCisJLyogRmluYWxseSB3ZSBjYW4gbWFyayB0aGUgaW5vZGUgYXMgZGlydHkuICovCisKKwloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoaW5vZGUsIDEpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKworCWVyciA9IGV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwloYW5kbGUtPmhfc3luYyA9IDE7CisJZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlleHQzX3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKKworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9mcy9leHQzL2lvY3RsLmMgYi9mcy9leHQzL2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2ZDY4NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDMvaW9jdGwuYwpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIGxpbnV4L2ZzL2V4dDMvaW9jdGwuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXh0M19qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworCitpbnQgZXh0M19pb2N0bCAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGV4dDNfaW5vZGVfaW5mbyAqZWkgPSBFWFQzX0koaW5vZGUpOworCXVuc2lnbmVkIGludCBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCByc3Zfd2luZG93X3NpemU7CisKKwlleHQzX2RlYnVnICgiY21kID0gJXUsIGFyZyA9ICVsdVxuIiwgY21kLCBhcmcpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEVYVDNfSU9DX0dFVEZMQUdTOgorCQlmbGFncyA9IGVpLT5pX2ZsYWdzICYgRVhUM19GTF9VU0VSX1ZJU0lCTEU7CisJCXJldHVybiBwdXRfdXNlcihmbGFncywgKGludCBfX3VzZXIgKikgYXJnKTsKKwljYXNlIEVYVDNfSU9DX1NFVEZMQUdTOiB7CisJCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOworCQlpbnQgZXJyOworCQlzdHJ1Y3QgZXh0M19pbG9jIGlsb2M7CisJCXVuc2lnbmVkIGludCBvbGRmbGFnczsKKwkJdW5zaWduZWQgaW50IGpmbGFnOworCisJCWlmIChJU19SRE9OTFkoaW5vZGUpKQorCQkJcmV0dXJuIC1FUk9GUzsKKworCQlpZiAoKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCkgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlpZiAoZ2V0X3VzZXIoZmxhZ3MsIChpbnQgX191c2VyICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCQlmbGFncyAmPSB+RVhUM19ESVJTWU5DX0ZMOworCisJCW9sZGZsYWdzID0gZWktPmlfZmxhZ3M7CisKKwkJLyogVGhlIEpPVVJOQUxfREFUQSBmbGFnIGlzIG1vZGlmaWFibGUgb25seSBieSByb290ICovCisJCWpmbGFnID0gZmxhZ3MgJiBFWFQzX0pPVVJOQUxfREFUQV9GTDsKKworCQkvKgorCQkgKiBUaGUgSU1NVVRBQkxFIGFuZCBBUFBFTkRfT05MWSBmbGFncyBjYW4gb25seSBiZSBjaGFuZ2VkIGJ5CisJCSAqIHRoZSByZWxldmFudCBjYXBhYmlsaXR5LgorCQkgKgorCQkgKiBUaGlzIHRlc3QgbG9va3MgbmljZXIuIFRoYW5rcyB0byBQYXVsaW5lIE1pZGRlbGluaworCQkgKi8KKwkJaWYgKChmbGFncyBeIG9sZGZsYWdzKSAmIChFWFQzX0FQUEVORF9GTCB8IEVYVDNfSU1NVVRBQkxFX0ZMKSkgeworCQkJaWYgKCFjYXBhYmxlKENBUF9MSU5VWF9JTU1VVEFCTEUpKQorCQkJCXJldHVybiAtRVBFUk07CisJCX0KKworCQkvKgorCQkgKiBUaGUgSk9VUk5BTF9EQVRBIGZsYWcgY2FuIG9ubHkgYmUgY2hhbmdlZCBieQorCQkgKiB0aGUgcmVsZXZhbnQgY2FwYWJpbGl0eS4KKwkJICovCisJCWlmICgoamZsYWcgXiBvbGRmbGFncykgJiAoRVhUM19KT1VSTkFMX0RBVEFfRkwpKSB7CisJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCisKKwkJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCAxKTsKKwkJaWYgKElTX0VSUihoYW5kbGUpKQorCQkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKwkJaWYgKElTX1NZTkMoaW5vZGUpKQorCQkJaGFuZGxlLT5oX3N5bmMgPSAxOworCQllcnIgPSBleHQzX3Jlc2VydmVfaW5vZGVfd3JpdGUoaGFuZGxlLCBpbm9kZSwgJmlsb2MpOworCQlpZiAoZXJyKQorCQkJZ290byBmbGFnc19lcnI7CisKKwkJZmxhZ3MgPSBmbGFncyAmIEVYVDNfRkxfVVNFUl9NT0RJRklBQkxFOworCQlmbGFncyB8PSBvbGRmbGFncyAmIH5FWFQzX0ZMX1VTRVJfTU9ESUZJQUJMRTsKKwkJZWktPmlfZmxhZ3MgPSBmbGFnczsKKworCQlleHQzX3NldF9pbm9kZV9mbGFncyhpbm9kZSk7CisJCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKworCQllcnIgPSBleHQzX21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CitmbGFnc19lcnI6CisJCWV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCWlmICgoamZsYWcgXiBvbGRmbGFncykgJiAoRVhUM19KT1VSTkFMX0RBVEFfRkwpKQorCQkJZXJyID0gZXh0M19jaGFuZ2VfaW5vZGVfam91cm5hbF9mbGFnKGlub2RlLCBqZmxhZyk7CisJCXJldHVybiBlcnI7CisJfQorCWNhc2UgRVhUM19JT0NfR0VUVkVSU0lPTjoKKwljYXNlIEVYVDNfSU9DX0dFVFZFUlNJT05fT0xEOgorCQlyZXR1cm4gcHV0X3VzZXIoaW5vZGUtPmlfZ2VuZXJhdGlvbiwgKGludCBfX3VzZXIgKikgYXJnKTsKKwljYXNlIEVYVDNfSU9DX1NFVFZFUlNJT046CisJY2FzZSBFWFQzX0lPQ19TRVRWRVJTSU9OX09MRDogeworCQloYW5kbGVfdCAqaGFuZGxlOworCQlzdHJ1Y3QgZXh0M19pbG9jIGlsb2M7CisJCV9fdTMyIGdlbmVyYXRpb247CisJCWludCBlcnI7CisKKwkJaWYgKChjdXJyZW50LT5mc3VpZCAhPSBpbm9kZS0+aV91aWQpICYmICFjYXBhYmxlKENBUF9GT1dORVIpKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKElTX1JET05MWShpbm9kZSkpCisJCQlyZXR1cm4gLUVST0ZTOworCQlpZiAoZ2V0X3VzZXIoZ2VuZXJhdGlvbiwgKGludCBfX3VzZXIgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChpbm9kZSwgMSk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CisJCWVyciA9IGV4dDNfcmVzZXJ2ZV9pbm9kZV93cml0ZShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CisJCWlmIChlcnIgPT0gMCkgeworCQkJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQkJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGdlbmVyYXRpb247CisJCQllcnIgPSBleHQzX21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CisJCX0KKwkJZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwkJcmV0dXJuIGVycjsKKwl9CisjaWZkZWYgQ09ORklHX0pCRF9ERUJVRworCWNhc2UgRVhUM19JT0NfV0FJVF9GT1JfUkVBRE9OTFk6CisJCS8qCisJCSAqIFRoaXMgaXMgcmFjeSAtIGJ5IHRoZSB0aW1lIHdlJ3JlIHdva2VuIHVwIGFuZCBydW5uaW5nLAorCQkgKiB0aGUgc3VwZXJibG9jayBjb3VsZCBiZSByZWxlYXNlZC4gIEFuZCB0aGUgbW9kdWxlIGNvdWxkCisJCSAqIGhhdmUgYmVlbiB1bmxvYWRlZC4gIFNvIHN1ZSBtZS4KKwkJICoKKwkJICogUmV0dXJucyAxIGlmIGl0IHNsZXB0LCBlbHNlIHplcm8uCisJCSAqLworCQl7CisJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwkJCWludCByZXQgPSAwOworCisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJYWRkX3dhaXRfcXVldWUoJkVYVDNfU0Ioc2IpLT5yb193YWl0X3F1ZXVlLCAmd2FpdCk7CisJCQlpZiAodGltZXJfcGVuZGluZygmRVhUM19TQihzYiktPnR1cm5fcm9fdGltZXIpKSB7CisJCQkJc2NoZWR1bGUoKTsKKwkJCQlyZXQgPSAxOworCQkJfQorCQkJcmVtb3ZlX3dhaXRfcXVldWUoJkVYVDNfU0Ioc2IpLT5yb193YWl0X3F1ZXVlLCAmd2FpdCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisjZW5kaWYKKwljYXNlIEVYVDNfSU9DX0dFVFJTVlNaOgorCQlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIFJFU0VSVkFUSU9OKQorCQkJJiYgU19JU1JFRyhpbm9kZS0+aV9tb2RlKQorCQkJJiYgZWktPmlfYmxvY2tfYWxsb2NfaW5mbykgeworCQkJcnN2X3dpbmRvd19zaXplID0gZWktPmlfYmxvY2tfYWxsb2NfaW5mby0+cnN2X3dpbmRvd19ub2RlLnJzdl9nb2FsX3NpemU7CisJCQlyZXR1cm4gcHV0X3VzZXIocnN2X3dpbmRvd19zaXplLCAoaW50IF9fdXNlciAqKWFyZyk7CisJCX0KKwkJcmV0dXJuIC1FTk9UVFk7CisJY2FzZSBFWFQzX0lPQ19TRVRSU1ZTWjogeworCisJCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFJFU0VSVkFUSU9OKSB8fCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQkJcmV0dXJuIC1FTk9UVFk7CisKKwkJaWYgKElTX1JET05MWShpbm9kZSkpCisJCQlyZXR1cm4gLUVST0ZTOworCisJCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWlmIChnZXRfdXNlcihyc3Zfd2luZG93X3NpemUsIChpbnQgX191c2VyICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChyc3Zfd2luZG93X3NpemUgPiBFWFQzX01BWF9SRVNFUlZFX0JMT0NLUykKKwkJCXJzdl93aW5kb3dfc2l6ZSA9IEVYVDNfTUFYX1JFU0VSVkVfQkxPQ0tTOworCisJCS8qCisJCSAqIG5lZWQgdG8gYWxsb2NhdGUgcmVzZXJ2YXRpb24gc3RydWN0dXJlIGZvciB0aGlzIGlub2RlCisJCSAqIGJlZm9yZSBzZXQgdGhlIHdpbmRvdyBzaXplCisJCSAqLworCQlkb3duKCZlaS0+dHJ1bmNhdGVfc2VtKTsKKwkJaWYgKCFlaS0+aV9ibG9ja19hbGxvY19pbmZvKQorCQkJZXh0M19pbml0X2Jsb2NrX2FsbG9jX2luZm8oaW5vZGUpOworCisJCWlmIChlaS0+aV9ibG9ja19hbGxvY19pbmZvKXsKKwkJCXN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKnJzdiA9ICZlaS0+aV9ibG9ja19hbGxvY19pbmZvLT5yc3Zfd2luZG93X25vZGU7CisJCQlyc3YtPnJzdl9nb2FsX3NpemUgPSByc3Zfd2luZG93X3NpemU7CisJCX0KKwkJdXAoJmVpLT50cnVuY2F0ZV9zZW0pOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBFWFQzX0lPQ19HUk9VUF9FWFRFTkQ6IHsKKwkJdW5zaWduZWQgbG9uZyBuX2Jsb2Nrc19jb3VudDsKKwkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCQlpbnQgZXJyOworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKElTX1JET05MWShpbm9kZSkpCisJCQlyZXR1cm4gLUVST0ZTOworCisJCWlmIChnZXRfdXNlcihuX2Jsb2Nrc19jb3VudCwgKF9fdTMyIF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQllcnIgPSBleHQzX2dyb3VwX2V4dGVuZChzYiwgRVhUM19TQihzYiktPnNfZXMsIG5fYmxvY2tzX2NvdW50KTsKKwkJam91cm5hbF9sb2NrX3VwZGF0ZXMoRVhUM19TQihzYiktPnNfam91cm5hbCk7CisJCWpvdXJuYWxfZmx1c2goRVhUM19TQihzYiktPnNfam91cm5hbCk7CisJCWpvdXJuYWxfdW5sb2NrX3VwZGF0ZXMoRVhUM19TQihzYiktPnNfam91cm5hbCk7CisKKwkJcmV0dXJuIGVycjsKKwl9CisJY2FzZSBFWFQzX0lPQ19HUk9VUF9BREQ6IHsKKwkJc3RydWN0IGV4dDNfbmV3X2dyb3VwX2RhdGEgaW5wdXQ7CisJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwkJaW50IGVycjsKKworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChJU19SRE9OTFkoaW5vZGUpKQorCQkJcmV0dXJuIC1FUk9GUzsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmlucHV0LCAoc3RydWN0IGV4dDNfbmV3X2dyb3VwX2lucHV0IF9fdXNlciAqKWFyZywKKwkJCQlzaXplb2YoaW5wdXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWVyciA9IGV4dDNfZ3JvdXBfYWRkKHNiLCAmaW5wdXQpOworCQlqb3VybmFsX2xvY2tfdXBkYXRlcyhFWFQzX1NCKHNiKS0+c19qb3VybmFsKTsKKwkJam91cm5hbF9mbHVzaChFWFQzX1NCKHNiKS0+c19qb3VybmFsKTsKKwkJam91cm5hbF91bmxvY2tfdXBkYXRlcyhFWFQzX1NCKHNiKS0+c19qb3VybmFsKTsKKworCQlyZXR1cm4gZXJyOworCX0KKworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZnMvZXh0My9uYW1laS5jIGIvZnMvZXh0My9uYW1laS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NzQyZDgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQzL25hbWVpLmMKQEAgLTAsMCArMSwyMzc4IEBACisvKgorICogIGxpbnV4L2ZzL2V4dDMvbmFtZWkuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9mcy9taW5peC9uYW1laS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqICBEaXJlY3RvcnkgZW50cnkgZmlsZSB0eXBlIHN1cHBvcnQgYW5kIGZvcndhcmQgY29tcGF0aWJpbGl0eSBob29rcworICogIAlmb3IgQi10cmVlIGRpcmVjdG9yaWVzIGJ5IFRoZW9kb3JlIFRzJ28gKHR5dHNvQG1pdC5lZHUpLCAxOTk4CisgKiAgSGFzaCBUcmVlIERpcmVjdG9yeSBpbmRleGluZyAoYykKKyAqICAJRGFuaWVsIFBoaWxsaXBzLCAyMDAxCisgKiAgSGFzaCBUcmVlIERpcmVjdG9yeSBpbmRleGluZyBwb3J0aW5nCisgKiAgCUNocmlzdG9waGVyIExpLCAyMDAyCisgKiAgSGFzaCBUcmVlIERpcmVjdG9yeSBpbmRleGluZyBjbGVhbnVwCisgKiAJVGhlb2RvcmUgVHMnbywgMjAwMgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXh0M19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDNfamJkLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSAieGF0dHIuaCIKKyNpbmNsdWRlICJhY2wuaCIKKworLyoKKyAqIGRlZmluZSBob3cgZmFyIGFoZWFkIHRvIHJlYWQgZGlyZWN0b3JpZXMgd2hpbGUgc2VhcmNoaW5nIHRoZW0uCisgKi8KKyNkZWZpbmUgTkFNRUlfUkFfQ0hVTktTICAyCisjZGVmaW5lIE5BTUVJX1JBX0JMT0NLUyAgNAorI2RlZmluZSBOQU1FSV9SQV9TSVpFICAgICAgICAoTkFNRUlfUkFfQ0hVTktTICogTkFNRUlfUkFfQkxPQ0tTKQorI2RlZmluZSBOQU1FSV9SQV9JTkRFWChjLGIpICAoKChjKSAqIE5BTUVJX1JBX0JMT0NLUykgKyAoYikpCisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmV4dDNfYXBwZW5kKGhhbmRsZV90ICpoYW5kbGUsCisJCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCXUzMiAqYmxvY2ssIGludCAqZXJyKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkqYmxvY2sgPSBpbm9kZS0+aV9zaXplID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCisJaWYgKChiaCA9IGV4dDNfYnJlYWQoaGFuZGxlLCBpbm9kZSwgKmJsb2NrLCAxLCBlcnIpKSkgeworCQlpbm9kZS0+aV9zaXplICs9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJRVhUM19JKGlub2RlKS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJCWV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSxiaCk7CisJfQorCXJldHVybiBiaDsKK30KKworI2lmbmRlZiBhc3NlcnQKKyNkZWZpbmUgYXNzZXJ0KHRlc3QpIEpfQVNTRVJUKHRlc3QpCisjZW5kaWYKKworI2lmbmRlZiBzd2FwCisjZGVmaW5lIHN3YXAoeCwgeSkgZG8geyB0eXBlb2YoeCkgeiA9IHg7IHggPSB5OyB5ID0gejsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZkZWYgRFhfREVCVUcKKyNkZWZpbmUgZHh0cmFjZShjb21tYW5kKSBjb21tYW5kCisjZWxzZQorI2RlZmluZSBkeHRyYWNlKGNvbW1hbmQpIAorI2VuZGlmCisKK3N0cnVjdCBmYWtlX2RpcmVudAoreworCV9fbGUzMiBpbm9kZTsKKwlfX2xlMTYgcmVjX2xlbjsKKwl1OCBuYW1lX2xlbjsKKwl1OCBmaWxlX3R5cGU7Cit9OworCitzdHJ1Y3QgZHhfY291bnRsaW1pdAoreworCV9fbGUxNiBsaW1pdDsKKwlfX2xlMTYgY291bnQ7Cit9OworCitzdHJ1Y3QgZHhfZW50cnkKK3sKKwlfX2xlMzIgaGFzaDsKKwlfX2xlMzIgYmxvY2s7Cit9OworCisvKgorICogZHhfcm9vdF9pbmZvIGlzIGxhaWQgb3V0IHNvIHRoYXQgaWYgaXQgc2hvdWxkIHNvbWVob3cgZ2V0IG92ZXJsYWlkIGJ5IGEKKyAqIGRpcmVudCB0aGUgdHdvIGxvdyBiaXRzIG9mIHRoZSBoYXNoIHZlcnNpb24gd2lsbCBiZSB6ZXJvLiAgVGhlcmVmb3JlLCB0aGUKKyAqIGhhc2ggdmVyc2lvbiBtb2QgNCBzaG91bGQgbmV2ZXIgYmUgMC4gIFNpbmNlcmVseSwgdGhlIHBhcmFub2lhIGRlcGFydG1lbnQuCisgKi8KKworc3RydWN0IGR4X3Jvb3QKK3sKKwlzdHJ1Y3QgZmFrZV9kaXJlbnQgZG90OworCWNoYXIgZG90X25hbWVbNF07CisJc3RydWN0IGZha2VfZGlyZW50IGRvdGRvdDsKKwljaGFyIGRvdGRvdF9uYW1lWzRdOworCXN0cnVjdCBkeF9yb290X2luZm8KKwl7CisJCV9fbGUzMiByZXNlcnZlZF96ZXJvOworCQl1OCBoYXNoX3ZlcnNpb247CisJCXU4IGluZm9fbGVuZ3RoOyAvKiA4ICovCisJCXU4IGluZGlyZWN0X2xldmVsczsKKwkJdTggdW51c2VkX2ZsYWdzOworCX0KKwlpbmZvOworCXN0cnVjdCBkeF9lbnRyeQllbnRyaWVzWzBdOworfTsKKworc3RydWN0IGR4X25vZGUKK3sKKwlzdHJ1Y3QgZmFrZV9kaXJlbnQgZmFrZTsKKwlzdHJ1Y3QgZHhfZW50cnkJZW50cmllc1swXTsKK307CisKKworc3RydWN0IGR4X2ZyYW1lCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXM7CisJc3RydWN0IGR4X2VudHJ5ICphdDsKK307CisKK3N0cnVjdCBkeF9tYXBfZW50cnkKK3sKKwl1MzIgaGFzaDsKKwl1MzIgb2ZmczsKK307CisKKyNpZmRlZiBDT05GSUdfRVhUM19JTkRFWAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBkeF9nZXRfYmxvY2sgKHN0cnVjdCBkeF9lbnRyeSAqZW50cnkpOworc3RhdGljIHZvaWQgZHhfc2V0X2Jsb2NrIChzdHJ1Y3QgZHhfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCB2YWx1ZSk7CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGR4X2dldF9oYXNoIChzdHJ1Y3QgZHhfZW50cnkgKmVudHJ5KTsKK3N0YXRpYyB2b2lkIGR4X3NldF9oYXNoIChzdHJ1Y3QgZHhfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCB2YWx1ZSk7CitzdGF0aWMgdW5zaWduZWQgZHhfZ2V0X2NvdW50IChzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMpOworc3RhdGljIHVuc2lnbmVkIGR4X2dldF9saW1pdCAoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzKTsKK3N0YXRpYyB2b2lkIGR4X3NldF9jb3VudCAoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzLCB1bnNpZ25lZCB2YWx1ZSk7CitzdGF0aWMgdm9pZCBkeF9zZXRfbGltaXQgKHN0cnVjdCBkeF9lbnRyeSAqZW50cmllcywgdW5zaWduZWQgdmFsdWUpOworc3RhdGljIHVuc2lnbmVkIGR4X3Jvb3RfbGltaXQgKHN0cnVjdCBpbm9kZSAqZGlyLCB1bnNpZ25lZCBpbmZvc2l6ZSk7CitzdGF0aWMgdW5zaWduZWQgZHhfbm9kZV9saW1pdCAoc3RydWN0IGlub2RlICpkaXIpOworc3RhdGljIHN0cnVjdCBkeF9mcmFtZSAqZHhfcHJvYmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCQkgc3RydWN0IGR4X2hhc2hfaW5mbyAqaGluZm8sCisJCQkJIHN0cnVjdCBkeF9mcmFtZSAqZnJhbWUsCisJCQkJIGludCAqZXJyKTsKK3N0YXRpYyB2b2lkIGR4X3JlbGVhc2UgKHN0cnVjdCBkeF9mcmFtZSAqZnJhbWVzKTsKK3N0YXRpYyBpbnQgZHhfbWFrZV9tYXAgKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICpkZSwgaW50IHNpemUsCisJCQlzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbywgc3RydWN0IGR4X21hcF9lbnRyeSBtYXBbXSk7CitzdGF0aWMgdm9pZCBkeF9zb3J0X21hcChzdHJ1Y3QgZHhfbWFwX2VudHJ5ICptYXAsIHVuc2lnbmVkIGNvdW50KTsKK3N0YXRpYyBzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqZHhfbW92ZV9kaXJlbnRzIChjaGFyICpmcm9tLCBjaGFyICp0bywKKwkJc3RydWN0IGR4X21hcF9lbnRyeSAqb2Zmc2V0cywgaW50IGNvdW50KTsKK3N0YXRpYyBzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiogZHhfcGFja19kaXJlbnRzIChjaGFyICpiYXNlLCBpbnQgc2l6ZSk7CitzdGF0aWMgdm9pZCBkeF9pbnNlcnRfYmxvY2sgKHN0cnVjdCBkeF9mcmFtZSAqZnJhbWUsIHUzMiBoYXNoLCB1MzIgYmxvY2spOworc3RhdGljIGludCBleHQzX2h0cmVlX25leHRfYmxvY2soc3RydWN0IGlub2RlICpkaXIsIF9fdTMyIGhhc2gsCisJCQkJIHN0cnVjdCBkeF9mcmFtZSAqZnJhbWUsCisJCQkJIHN0cnVjdCBkeF9mcmFtZSAqZnJhbWVzLCAKKwkJCQkgX191MzIgKnN0YXJ0X2hhc2gpOworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIGV4dDNfZHhfZmluZF9lbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCSAgICAgICBzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKnJlc19kaXIsIGludCAqZXJyKTsKK3N0YXRpYyBpbnQgZXh0M19keF9hZGRfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworLyoKKyAqIEZ1dHVyZTogdXNlIGhpZ2ggZm91ciBiaXRzIG9mIGJsb2NrIGZvciBjb2FsZXNjZS1vbi1kZWxldGUgZmxhZ3MKKyAqIE1hc2sgdGhlbSBvZmYgZm9yIG5vdy4KKyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGR4X2dldF9ibG9jayAoc3RydWN0IGR4X2VudHJ5ICplbnRyeSkKK3sKKwlyZXR1cm4gbGUzMl90b19jcHUoZW50cnktPmJsb2NrKSAmIDB4MDBmZmZmZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkeF9zZXRfYmxvY2sgKHN0cnVjdCBkeF9lbnRyeSAqZW50cnksIHVuc2lnbmVkIHZhbHVlKQoreworCWVudHJ5LT5ibG9jayA9IGNwdV90b19sZTMyKHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBkeF9nZXRfaGFzaCAoc3RydWN0IGR4X2VudHJ5ICplbnRyeSkKK3sKKwlyZXR1cm4gbGUzMl90b19jcHUoZW50cnktPmhhc2gpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHhfc2V0X2hhc2ggKHN0cnVjdCBkeF9lbnRyeSAqZW50cnksIHVuc2lnbmVkIHZhbHVlKQoreworCWVudHJ5LT5oYXNoID0gY3B1X3RvX2xlMzIodmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGR4X2dldF9jb3VudCAoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzKQoreworCXJldHVybiBsZTE2X3RvX2NwdSgoKHN0cnVjdCBkeF9jb3VudGxpbWl0ICopIGVudHJpZXMpLT5jb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZHhfZ2V0X2xpbWl0IChzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMpCit7CisJcmV0dXJuIGxlMTZfdG9fY3B1KCgoc3RydWN0IGR4X2NvdW50bGltaXQgKikgZW50cmllcyktPmxpbWl0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR4X3NldF9jb3VudCAoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzLCB1bnNpZ25lZCB2YWx1ZSkKK3sKKwkoKHN0cnVjdCBkeF9jb3VudGxpbWl0ICopIGVudHJpZXMpLT5jb3VudCA9IGNwdV90b19sZTE2KHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR4X3NldF9saW1pdCAoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzLCB1bnNpZ25lZCB2YWx1ZSkKK3sKKwkoKHN0cnVjdCBkeF9jb3VudGxpbWl0ICopIGVudHJpZXMpLT5saW1pdCA9IGNwdV90b19sZTE2KHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBkeF9yb290X2xpbWl0IChzdHJ1Y3QgaW5vZGUgKmRpciwgdW5zaWduZWQgaW5mb3NpemUpCit7CisJdW5zaWduZWQgZW50cnlfc3BhY2UgPSBkaXItPmlfc2ItPnNfYmxvY2tzaXplIC0gRVhUM19ESVJfUkVDX0xFTigxKSAtCisJCUVYVDNfRElSX1JFQ19MRU4oMikgLSBpbmZvc2l6ZTsKKwlyZXR1cm4gMD8gMjA6IGVudHJ5X3NwYWNlIC8gc2l6ZW9mKHN0cnVjdCBkeF9lbnRyeSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZHhfbm9kZV9saW1pdCAoc3RydWN0IGlub2RlICpkaXIpCit7CisJdW5zaWduZWQgZW50cnlfc3BhY2UgPSBkaXItPmlfc2ItPnNfYmxvY2tzaXplIC0gRVhUM19ESVJfUkVDX0xFTigwKTsKKwlyZXR1cm4gMD8gMjI6IGVudHJ5X3NwYWNlIC8gc2l6ZW9mKHN0cnVjdCBkeF9lbnRyeSk7Cit9CisKKy8qCisgKiBEZWJ1ZworICovCisjaWZkZWYgRFhfREVCVUcKK3N0YXRpYyB2b2lkIGR4X3Nob3dfaW5kZXggKGNoYXIgKiBsYWJlbCwgc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzKQoreworICAgICAgICBpbnQgaSwgbiA9IGR4X2dldF9jb3VudCAoZW50cmllcyk7CisgICAgICAgIHByaW50aygiJXMgaW5kZXggIiwgbGFiZWwpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCIleC0+JXUgIiwgaT8gZHhfZ2V0X2hhc2goZW50cmllcyArIGkpOiAwLCBkeF9nZXRfYmxvY2soZW50cmllcyArIGkpKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGsoIlxuIik7Cit9CisKK3N0cnVjdCBzdGF0cworeyAKKwl1bnNpZ25lZCBuYW1lczsKKwl1bnNpZ25lZCBzcGFjZTsKKwl1bnNpZ25lZCBiY291bnQ7Cit9OworCitzdGF0aWMgc3RydWN0IHN0YXRzIGR4X3Nob3dfbGVhZihzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbywgc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKmRlLAorCQkJCSBpbnQgc2l6ZSwgaW50IHNob3dfbmFtZXMpCit7CisJdW5zaWduZWQgbmFtZXMgPSAwLCBzcGFjZSA9IDA7CisJY2hhciAqYmFzZSA9IChjaGFyICopIGRlOworCXN0cnVjdCBkeF9oYXNoX2luZm8gaCA9ICpoaW5mbzsKKworCXByaW50aygibmFtZXM6ICIpOworCXdoaWxlICgoY2hhciAqKSBkZSA8IGJhc2UgKyBzaXplKQorCXsKKwkJaWYgKGRlLT5pbm9kZSkKKwkJeworCQkJaWYgKHNob3dfbmFtZXMpCisJCQl7CisJCQkJaW50IGxlbiA9IGRlLT5uYW1lX2xlbjsKKwkJCQljaGFyICpuYW1lID0gZGUtPm5hbWU7CisJCQkJd2hpbGUgKGxlbi0tKSBwcmludGsoIiVjIiwgKm5hbWUrKyk7CisJCQkJZXh0M2ZzX2Rpcmhhc2goZGUtPm5hbWUsIGRlLT5uYW1lX2xlbiwgJmgpOworCQkJCXByaW50aygiOiV4LiV1ICIsIGguaGFzaCwKKwkJCQkgICAgICAgKChjaGFyICopIGRlIC0gYmFzZSkpOworCQkJfQorCQkJc3BhY2UgKz0gRVhUM19ESVJfUkVDX0xFTihkZS0+bmFtZV9sZW4pOworCSAJCW5hbWVzKys7CisJCX0KKwkJZGUgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikgKChjaGFyICopIGRlICsgbGUxNl90b19jcHUoZGUtPnJlY19sZW4pKTsKKwl9CisJcHJpbnRrKCIoJWkpXG4iLCBuYW1lcyk7CisJcmV0dXJuIChzdHJ1Y3Qgc3RhdHMpIHsgbmFtZXMsIHNwYWNlLCAxIH07Cit9CisKK3N0cnVjdCBzdGF0cyBkeF9zaG93X2VudHJpZXMoc3RydWN0IGR4X2hhc2hfaW5mbyAqaGluZm8sIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJICAgICBzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMsIGludCBsZXZlbHMpCit7CisJdW5zaWduZWQgYmxvY2tzaXplID0gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwl1bnNpZ25lZCBjb3VudCA9IGR4X2dldF9jb3VudCAoZW50cmllcyksIG5hbWVzID0gMCwgc3BhY2UgPSAwLCBpOworCXVuc2lnbmVkIGJjb3VudCA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgZXJyOworCXByaW50aygiJWkgaW5kZXhlZCBibG9ja3MuLi5cbiIsIGNvdW50KTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgZW50cmllcysrKQorCXsKKwkJdTMyIGJsb2NrID0gZHhfZ2V0X2Jsb2NrKGVudHJpZXMpLCBoYXNoID0gaT8gZHhfZ2V0X2hhc2goZW50cmllcyk6IDA7CisJCXUzMiByYW5nZSA9IGkgPCBjb3VudCAtIDE/IChkeF9nZXRfaGFzaChlbnRyaWVzICsgMSkgLSBoYXNoKTogfmhhc2g7CisJCXN0cnVjdCBzdGF0cyBzdGF0czsKKwkJcHJpbnRrKCIlcyUzdTolMDN1IGhhc2ggJTh4LyU4eCAiLGxldmVscz8iIjoiICAgIiwgaSwgYmxvY2ssIGhhc2gsIHJhbmdlKTsKKwkJaWYgKCEoYmggPSBleHQzX2JyZWFkIChOVUxMLGRpciwgYmxvY2ssIDAsJmVycikpKSBjb250aW51ZTsKKwkJc3RhdHMgPSBsZXZlbHM/CisJCSAgIGR4X3Nob3dfZW50cmllcyhoaW5mbywgZGlyLCAoKHN0cnVjdCBkeF9ub2RlICopIGJoLT5iX2RhdGEpLT5lbnRyaWVzLCBsZXZlbHMgLSAxKToKKwkJICAgZHhfc2hvd19sZWFmKGhpbmZvLCAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikgYmgtPmJfZGF0YSwgYmxvY2tzaXplLCAwKTsKKwkJbmFtZXMgKz0gc3RhdHMubmFtZXM7CisJCXNwYWNlICs9IHN0YXRzLnNwYWNlOworCQliY291bnQgKz0gc3RhdHMuYmNvdW50OworCQlicmVsc2UgKGJoKTsKKwl9CisJaWYgKGJjb3VudCkKKwkJcHJpbnRrKCIlc25hbWVzICV1LCBmdWxsbmVzcyAldSAoJXUlJSlcbiIsIGxldmVscz8iIjoiICAgIiwKKwkJCW5hbWVzLCBzcGFjZS9iY291bnQsKHNwYWNlL2Jjb3VudCkqMTAwL2Jsb2Nrc2l6ZSk7CisJcmV0dXJuIChzdHJ1Y3Qgc3RhdHMpIHsgbmFtZXMsIHNwYWNlLCBiY291bnR9OworfQorI2VuZGlmIC8qIERYX0RFQlVHICovCisKKy8qCisgKiBQcm9iZSBmb3IgYSBkaXJlY3RvcnkgbGVhZiBibG9jayB0byBzZWFyY2guCisgKgorICogZHhfcHJvYmUgY2FuIHJldHVybiBFUlJfQkFEX0RYX0RJUiwgd2hpY2ggbWVhbnMgdGhlcmUgd2FzIGEgZm9ybWF0CisgKiBlcnJvciBpbiB0aGUgZGlyZWN0b3J5IGluZGV4LCBhbmQgdGhlIGNhbGxlciBzaG91bGQgZmFsbCBiYWNrIHRvCisgKiBzZWFyY2hpbmcgdGhlIGRpcmVjdG9yeSBub3JtYWxseS4gIFRoZSBjYWxsZXJzIG9mIGR4X3Byb2JlICoqTVVTVCoqCisgKiBjaGVjayBmb3IgdGhpcyBlcnJvciBjb2RlLCBhbmQgbWFrZSBzdXJlIGl0IG5ldmVyIGdldHMgcmVmbGVjdGVkCisgKiBiYWNrIHRvIHVzZXJzcGFjZS4KKyAqLworc3RhdGljIHN0cnVjdCBkeF9mcmFtZSAqCitkeF9wcm9iZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqZGlyLAorCSBzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbywgc3RydWN0IGR4X2ZyYW1lICpmcmFtZV9pbiwgaW50ICplcnIpCit7CisJdW5zaWduZWQgY291bnQsIGluZGlyZWN0OworCXN0cnVjdCBkeF9lbnRyeSAqYXQsICplbnRyaWVzLCAqcCwgKnEsICptOworCXN0cnVjdCBkeF9yb290ICpyb290OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGR4X2ZyYW1lICpmcmFtZSA9IGZyYW1lX2luOworCXUzMiBoYXNoOworCisJZnJhbWUtPmJoID0gTlVMTDsKKwlpZiAoZGVudHJ5KQorCQlkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCWlmICghKGJoID0gZXh0M19icmVhZCAoTlVMTCxkaXIsIDAsIDAsIGVycikpKQorCQlnb3RvIGZhaWw7CisJcm9vdCA9IChzdHJ1Y3QgZHhfcm9vdCAqKSBiaC0+Yl9kYXRhOworCWlmIChyb290LT5pbmZvLmhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX1RFQSAmJgorCSAgICByb290LT5pbmZvLmhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX0hBTEZfTUQ0ICYmCisJICAgIHJvb3QtPmluZm8uaGFzaF92ZXJzaW9uICE9IERYX0hBU0hfTEVHQUNZKSB7CisJCWV4dDNfd2FybmluZyhkaXItPmlfc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgIlVucmVjb2duaXNlZCBpbm9kZSBoYXNoIGNvZGUgJWQiLAorCQkJICAgICByb290LT5pbmZvLmhhc2hfdmVyc2lvbik7CisJCWJyZWxzZShiaCk7CisJCSplcnIgPSBFUlJfQkFEX0RYX0RJUjsKKwkJZ290byBmYWlsOworCX0KKwloaW5mby0+aGFzaF92ZXJzaW9uID0gcm9vdC0+aW5mby5oYXNoX3ZlcnNpb247CisJaGluZm8tPnNlZWQgPSBFWFQzX1NCKGRpci0+aV9zYiktPnNfaGFzaF9zZWVkOworCWlmIChkZW50cnkpCisJCWV4dDNmc19kaXJoYXNoKGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgaGluZm8pOworCWhhc2ggPSBoaW5mby0+aGFzaDsKKworCWlmIChyb290LT5pbmZvLnVudXNlZF9mbGFncyAmIDEpIHsKKwkJZXh0M193YXJuaW5nKGRpci0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiVW5pbXBsZW1lbnRlZCBpbm9kZSBoYXNoIGZsYWdzOiAlIzA2eCIsCisJCQkgICAgIHJvb3QtPmluZm8udW51c2VkX2ZsYWdzKTsKKwkJYnJlbHNlKGJoKTsKKwkJKmVyciA9IEVSUl9CQURfRFhfRElSOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKChpbmRpcmVjdCA9IHJvb3QtPmluZm8uaW5kaXJlY3RfbGV2ZWxzKSA+IDEpIHsKKwkJZXh0M193YXJuaW5nKGRpci0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiVW5pbXBsZW1lbnRlZCBpbm9kZSBoYXNoIGRlcHRoOiAlIzA2eCIsCisJCQkgICAgIHJvb3QtPmluZm8uaW5kaXJlY3RfbGV2ZWxzKTsKKwkJYnJlbHNlKGJoKTsKKwkJKmVyciA9IEVSUl9CQURfRFhfRElSOworCQlnb3RvIGZhaWw7CisJfQorCisJZW50cmllcyA9IChzdHJ1Y3QgZHhfZW50cnkgKikgKCgoY2hhciAqKSZyb290LT5pbmZvKSArCisJCQkJICAgICAgIHJvb3QtPmluZm8uaW5mb19sZW5ndGgpOworCWFzc2VydChkeF9nZXRfbGltaXQoZW50cmllcykgPT0gZHhfcm9vdF9saW1pdChkaXIsCisJCQkJCQkgICAgICByb290LT5pbmZvLmluZm9fbGVuZ3RoKSk7CisJZHh0cmFjZSAocHJpbnRrKCJMb29rIHVwICV4IiwgaGFzaCkpOworCXdoaWxlICgxKQorCXsKKwkJY291bnQgPSBkeF9nZXRfY291bnQoZW50cmllcyk7CisJCWFzc2VydCAoY291bnQgJiYgY291bnQgPD0gZHhfZ2V0X2xpbWl0KGVudHJpZXMpKTsKKwkJcCA9IGVudHJpZXMgKyAxOworCQlxID0gZW50cmllcyArIGNvdW50IC0gMTsKKwkJd2hpbGUgKHAgPD0gcSkKKwkJeworCQkJbSA9IHAgKyAocSAtIHApLzI7CisJCQlkeHRyYWNlKHByaW50aygiLiIpKTsKKwkJCWlmIChkeF9nZXRfaGFzaChtKSA+IGhhc2gpCisJCQkJcSA9IG0gLSAxOworCQkJZWxzZQorCQkJCXAgPSBtICsgMTsKKwkJfQorCisJCWlmICgwKSAvLyBsaW5lYXIgc2VhcmNoIGNyb3NzIGNoZWNrCisJCXsKKwkJCXVuc2lnbmVkIG4gPSBjb3VudCAtIDE7CisJCQlhdCA9IGVudHJpZXM7CisJCQl3aGlsZSAobi0tKQorCQkJeworCQkJCWR4dHJhY2UocHJpbnRrKCIsIikpOworCQkJCWlmIChkeF9nZXRfaGFzaCgrK2F0KSA+IGhhc2gpCisJCQkJeworCQkJCQlhdC0tOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlhc3NlcnQgKGF0ID09IHAgLSAxKTsKKwkJfQorCisJCWF0ID0gcCAtIDE7CisJCWR4dHJhY2UocHJpbnRrKCIgJXgtPiV1XG4iLCBhdCA9PSBlbnRyaWVzPyAwOiBkeF9nZXRfaGFzaChhdCksIGR4X2dldF9ibG9jayhhdCkpKTsKKwkJZnJhbWUtPmJoID0gYmg7CisJCWZyYW1lLT5lbnRyaWVzID0gZW50cmllczsKKwkJZnJhbWUtPmF0ID0gYXQ7CisJCWlmICghaW5kaXJlY3QtLSkgcmV0dXJuIGZyYW1lOworCQlpZiAoIShiaCA9IGV4dDNfYnJlYWQgKE5VTEwsZGlyLCBkeF9nZXRfYmxvY2soYXQpLCAwLCBlcnIpKSkKKwkJCWdvdG8gZmFpbDI7CisJCWF0ID0gZW50cmllcyA9ICgoc3RydWN0IGR4X25vZGUgKikgYmgtPmJfZGF0YSktPmVudHJpZXM7CisJCWFzc2VydCAoZHhfZ2V0X2xpbWl0KGVudHJpZXMpID09IGR4X25vZGVfbGltaXQgKGRpcikpOworCQlmcmFtZSsrOworCX0KK2ZhaWwyOgorCXdoaWxlIChmcmFtZSA+PSBmcmFtZV9pbikgeworCQlicmVsc2UoZnJhbWUtPmJoKTsKKwkJZnJhbWUtLTsKKwl9CitmYWlsOgorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBkeF9yZWxlYXNlIChzdHJ1Y3QgZHhfZnJhbWUgKmZyYW1lcykKK3sKKwlpZiAoZnJhbWVzWzBdLmJoID09IE5VTEwpCisJCXJldHVybjsKKworCWlmICgoKHN0cnVjdCBkeF9yb290ICopIGZyYW1lc1swXS5iaC0+Yl9kYXRhKS0+aW5mby5pbmRpcmVjdF9sZXZlbHMpCisJCWJyZWxzZShmcmFtZXNbMV0uYmgpOworCWJyZWxzZShmcmFtZXNbMF0uYmgpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpbmNyZW1lbnRzIHRoZSBmcmFtZSBwb2ludGVyIHRvIHNlYXJjaCB0aGUgbmV4dCBsZWFmCisgKiBibG9jaywgYW5kIHJlYWRzIGluIHRoZSBuZWNlc3NhcnkgaW50ZXJ2ZW5pbmcgbm9kZXMgaWYgdGhlIHNlYXJjaAorICogc2hvdWxkIGJlIG5lY2Vzc2FyeS4gIFdoZXRoZXIgb3Igbm90IHRoZSBzZWFyY2ggaXMgbmVjZXNzYXJ5IGlzCisgKiBjb250cm9sbGVkIGJ5IHRoZSBoYXNoIHBhcmFtZXRlci4gIElmIHRoZSBoYXNoIHZhbHVlIGlzIGV2ZW4sIHRoZW4KKyAqIHRoZSBzZWFyY2ggaXMgb25seSBjb250aW51ZWQgaWYgdGhlIG5leHQgYmxvY2sgc3RhcnRzIHdpdGggdGhhdAorICogaGFzaCB2YWx1ZS4gIFRoaXMgaXMgdXNlZCBpZiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBhIHNwZWNpZmljIGZpbGUuCisgKgorICogSWYgdGhlIGhhc2ggdmFsdWUgaXMgSEFTSF9OQl9BTFdBWVMsIHRoZW4gYWx3YXlzIGdvIHRvIHRoZSBuZXh0IGJsb2NrLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAxIGlmIHRoZSBjYWxsZXIgc2hvdWxkIGNvbnRpbnVlIHRvIHNlYXJjaCwKKyAqIG9yIDAgaWYgaXQgc2hvdWxkIG5vdC4gIElmIHRoZXJlIGlzIGFuIGVycm9yIHJlYWRpbmcgb25lIG9mIHRoZQorICogaW5kZXggYmxvY2tzLCBpdCB3aWxsIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqCisgKiBJZiBzdGFydF9oYXNoIGlzIG5vbi1udWxsLCBpdCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIHRoZSBzdGFydGluZworICogaGFzaCBvZiB0aGUgbmV4dCBwYWdlLgorICovCitzdGF0aWMgaW50IGV4dDNfaHRyZWVfbmV4dF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmRpciwgX191MzIgaGFzaCwKKwkJCQkgc3RydWN0IGR4X2ZyYW1lICpmcmFtZSwKKwkJCQkgc3RydWN0IGR4X2ZyYW1lICpmcmFtZXMsIAorCQkJCSBfX3UzMiAqc3RhcnRfaGFzaCkKK3sKKwlzdHJ1Y3QgZHhfZnJhbWUgKnA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgZXJyLCBudW1fZnJhbWVzID0gMDsKKwlfX3UzMiBiaGFzaDsKKworCXAgPSBmcmFtZTsKKwkvKgorCSAqIEZpbmQgdGhlIG5leHQgbGVhZiBwYWdlIGJ5IGluY3JlbWVudGluZyB0aGUgZnJhbWUgcG9pbnRlci4KKwkgKiBJZiB3ZSBydW4gb3V0IG9mIGVudHJpZXMgaW4gdGhlIGludGVyaW9yIG5vZGUsIGxvb3AgYXJvdW5kIGFuZAorCSAqIGluY3JlbWVudCBwb2ludGVyIGluIHRoZSBwYXJlbnQgbm9kZS4gIFdoZW4gd2UgYnJlYWsgb3V0IG9mCisJICogdGhpcyBsb29wLCBudW1fZnJhbWVzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGludGVyaW9yCisJICogbm9kZXMgbmVlZCB0byBiZSByZWFkLgorCSAqLworCXdoaWxlICgxKSB7CisJCWlmICgrKyhwLT5hdCkgPCBwLT5lbnRyaWVzICsgZHhfZ2V0X2NvdW50KHAtPmVudHJpZXMpKQorCQkJYnJlYWs7CisJCWlmIChwID09IGZyYW1lcykKKwkJCXJldHVybiAwOworCQludW1fZnJhbWVzKys7CisJCXAtLTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBoYXNoIGlzIDEsIHRoZW4gY29udGludWUgb25seSBpZiB0aGUgbmV4dCBwYWdlIGhhcyBhCisJICogY29udGludWF0aW9uIGhhc2ggb2YgYW55IHZhbHVlLiAgVGhpcyBpcyB1c2VkIGZvciByZWFkZGlyCisJICogaGFuZGxpbmcuICBPdGhlcndpc2UsIGNoZWNrIHRvIHNlZSBpZiB0aGUgaGFzaCBtYXRjaGVzIHRoZQorCSAqIGRlc2lyZWQgY29udGl1YXRpb24gaGFzaC4gIElmIGl0IGRvZXNuJ3QsIHJldHVybiBzaW5jZQorCSAqIHRoZXJlJ3Mgbm8gcG9pbnQgdG8gcmVhZCBpbiB0aGUgc3VjY2Vzc2l2ZSBpbmRleCBwYWdlcy4KKwkgKi8KKwliaGFzaCA9IGR4X2dldF9oYXNoKHAtPmF0KTsKKwlpZiAoc3RhcnRfaGFzaCkKKwkJKnN0YXJ0X2hhc2ggPSBiaGFzaDsKKwlpZiAoKGhhc2ggJiAxKSA9PSAwKSB7CisJCWlmICgoYmhhc2ggJiB+MSkgIT0gaGFzaCkKKwkJCXJldHVybiAwOworCX0KKwkvKgorCSAqIElmIHRoZSBoYXNoIGlzIEhBU0hfTkJfQUxXQVlTLCB3ZSBhbHdheXMgZ28gdG8gdGhlIG5leHQKKwkgKiBibG9jayBzbyBubyBjaGVjayBpcyBuZWNlc3NhcnkKKwkgKi8KKwl3aGlsZSAobnVtX2ZyYW1lcy0tKSB7CisJCWlmICghKGJoID0gZXh0M19icmVhZChOVUxMLCBkaXIsIGR4X2dldF9ibG9jayhwLT5hdCksCisJCQkJICAgICAgMCwgJmVycikpKQorCQkJcmV0dXJuIGVycjsgLyogRmFpbHVyZSAqLworCQlwKys7CisJCWJyZWxzZSAocC0+YmgpOworCQlwLT5iaCA9IGJoOworCQlwLT5hdCA9IHAtPmVudHJpZXMgPSAoKHN0cnVjdCBkeF9ub2RlICopIGJoLT5iX2RhdGEpLT5lbnRyaWVzOworCX0KKwlyZXR1cm4gMTsKK30KKworCisvKgorICogcCBpcyBhdCBsZWFzdCA2IGJ5dGVzIGJlZm9yZSB0aGUgZW5kIG9mIHBhZ2UKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqZXh0M19uZXh0X2VudHJ5KHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICpwKQoreworCXJldHVybiAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikoKGNoYXIqKXAgKyBsZTE2X3RvX2NwdShwLT5yZWNfbGVuKSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGZpbGxzIGEgcmVkLWJsYWNrIHRyZWUgd2l0aCBpbmZvcm1hdGlvbiBmcm9tIGEKKyAqIGRpcmVjdG9yeSBibG9jay4gIEl0IHJldHVybnMgdGhlIG51bWJlciBkaXJlY3RvcnkgZW50cmllcyBsb2FkZWQKKyAqIGludG8gdGhlIHRyZWUuICBJZiB0aGVyZSBpcyBhbiBlcnJvciBpdCBpcyByZXR1cm5lZCBpbiBlcnIuCisgKi8KK3N0YXRpYyBpbnQgaHRyZWVfZGlyYmxvY2tfdG9fdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsCisJCQkJICBzdHJ1Y3QgaW5vZGUgKmRpciwgaW50IGJsb2NrLAorCQkJCSAgc3RydWN0IGR4X2hhc2hfaW5mbyAqaGluZm8sCisJCQkJICBfX3UzMiBzdGFydF9oYXNoLCBfX3UzMiBzdGFydF9taW5vcl9oYXNoKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKmRlLCAqdG9wOworCWludCBlcnIsIGNvdW50ID0gMDsKKworCWR4dHJhY2UocHJpbnRrKCJJbiBodHJlZSBkaXJibG9ja190b190cmVlOiBibG9jayAlZFxuIiwgYmxvY2spKTsKKwlpZiAoIShiaCA9IGV4dDNfYnJlYWQgKE5VTEwsIGRpciwgYmxvY2ssIDAsICZlcnIpKSkKKwkJcmV0dXJuIGVycjsKKworCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopIGJoLT5iX2RhdGE7CisJdG9wID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopICgoY2hhciAqKSBkZSArCisJCQkJCSAgIGRpci0+aV9zYi0+c19ibG9ja3NpemUgLQorCQkJCQkgICBFWFQzX0RJUl9SRUNfTEVOKDApKTsKKwlmb3IgKDsgZGUgPCB0b3A7IGRlID0gZXh0M19uZXh0X2VudHJ5KGRlKSkgeworCQlleHQzZnNfZGlyaGFzaChkZS0+bmFtZSwgZGUtPm5hbWVfbGVuLCBoaW5mbyk7CisJCWlmICgoaGluZm8tPmhhc2ggPCBzdGFydF9oYXNoKSB8fAorCQkgICAgKChoaW5mby0+aGFzaCA9PSBzdGFydF9oYXNoKSAmJgorCQkgICAgIChoaW5mby0+bWlub3JfaGFzaCA8IHN0YXJ0X21pbm9yX2hhc2gpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZGUtPmlub2RlID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKChlcnIgPSBleHQzX2h0cmVlX3N0b3JlX2RpcmVudChkaXJfZmlsZSwKKwkJCQkgICBoaW5mby0+aGFzaCwgaGluZm8tPm1pbm9yX2hhc2gsIGRlKSkgIT0gMCkgeworCQkJYnJlbHNlKGJoKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJY291bnQrKzsKKwl9CisJYnJlbHNlKGJoKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSByZWQtYmxhY2sgdHJlZSB3aXRoIGluZm9ybWF0aW9uIGZyb20gYQorICogZGlyZWN0b3J5LiAgV2Ugc3RhcnQgc2Nhbm5pbmcgdGhlIGRpcmVjdG9yeSBpbiBoYXNoIG9yZGVyLCBzdGFydGluZworICogYXQgc3RhcnRfaGFzaCBhbmQgc3RhcnRfbWlub3JfaGFzaC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluc2VydGVkIGludG8gdGhlIHRyZWUsCisgKiBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK2ludCBleHQzX2h0cmVlX2ZpbGxfdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsIF9fdTMyIHN0YXJ0X2hhc2gsCisJCQkgX191MzIgc3RhcnRfbWlub3JfaGFzaCwgX191MzIgKm5leHRfaGFzaCkKK3sKKwlzdHJ1Y3QgZHhfaGFzaF9pbmZvIGhpbmZvOworCXN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICpkZTsKKwlzdHJ1Y3QgZHhfZnJhbWUgZnJhbWVzWzJdLCAqZnJhbWU7CisJc3RydWN0IGlub2RlICpkaXI7CisJaW50IGJsb2NrLCBlcnI7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgcmV0OworCV9fdTMyIGhhc2h2YWw7CisKKwlkeHRyYWNlKHByaW50aygiSW4gaHRyZWVfZmlsbF90cmVlLCBzdGFydCBoYXNoOiAleDoleFxuIiwgc3RhcnRfaGFzaCwKKwkJICAgICAgIHN0YXJ0X21pbm9yX2hhc2gpKTsKKwlkaXIgPSBkaXJfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJaWYgKCEoRVhUM19JKGRpciktPmlfZmxhZ3MgJiBFWFQzX0lOREVYX0ZMKSkgeworCQloaW5mby5oYXNoX3ZlcnNpb24gPSBFWFQzX1NCKGRpci0+aV9zYiktPnNfZGVmX2hhc2hfdmVyc2lvbjsKKwkJaGluZm8uc2VlZCA9IEVYVDNfU0IoZGlyLT5pX3NiKS0+c19oYXNoX3NlZWQ7CisJCWNvdW50ID0gaHRyZWVfZGlyYmxvY2tfdG9fdHJlZShkaXJfZmlsZSwgZGlyLCAwLCAmaGluZm8sCisJCQkJCSAgICAgICBzdGFydF9oYXNoLCBzdGFydF9taW5vcl9oYXNoKTsKKwkJKm5leHRfaGFzaCA9IH4wOworCQlyZXR1cm4gY291bnQ7CisJfQorCWhpbmZvLmhhc2ggPSBzdGFydF9oYXNoOworCWhpbmZvLm1pbm9yX2hhc2ggPSAwOworCWZyYW1lID0gZHhfcHJvYmUoTlVMTCwgZGlyX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCAmaGluZm8sIGZyYW1lcywgJmVycik7CisJaWYgKCFmcmFtZSkKKwkJcmV0dXJuIGVycjsKKworCS8qIEFkZCAnLicgYW5kICcuLicgZnJvbSB0aGUgaHRyZWUgaGVhZGVyICovCisJaWYgKCFzdGFydF9oYXNoICYmICFzdGFydF9taW5vcl9oYXNoKSB7CisJCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopIGZyYW1lc1swXS5iaC0+Yl9kYXRhOworCQlpZiAoKGVyciA9IGV4dDNfaHRyZWVfc3RvcmVfZGlyZW50KGRpcl9maWxlLCAwLCAwLCBkZSkpICE9IDApCisJCQlnb3RvIGVycm91dDsKKwkJY291bnQrKzsKKwl9CisJaWYgKHN0YXJ0X2hhc2ggPCAyIHx8IChzdGFydF9oYXNoID09MiAmJiBzdGFydF9taW5vcl9oYXNoPT0wKSkgeworCQlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSBmcmFtZXNbMF0uYmgtPmJfZGF0YTsKKwkJZGUgPSBleHQzX25leHRfZW50cnkoZGUpOworCQlpZiAoKGVyciA9IGV4dDNfaHRyZWVfc3RvcmVfZGlyZW50KGRpcl9maWxlLCAyLCAwLCBkZSkpICE9IDApCisJCQlnb3RvIGVycm91dDsKKwkJY291bnQrKzsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlibG9jayA9IGR4X2dldF9ibG9jayhmcmFtZS0+YXQpOworCQlyZXQgPSBodHJlZV9kaXJibG9ja190b190cmVlKGRpcl9maWxlLCBkaXIsIGJsb2NrLCAmaGluZm8sCisJCQkJCSAgICAgc3RhcnRfaGFzaCwgc3RhcnRfbWlub3JfaGFzaCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQllcnIgPSByZXQ7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCQljb3VudCArPSByZXQ7CisJCWhhc2h2YWwgPSB+MDsKKwkJcmV0ID0gZXh0M19odHJlZV9uZXh0X2Jsb2NrKGRpciwgSEFTSF9OQl9BTFdBWVMsIAorCQkJCQkgICAgZnJhbWUsIGZyYW1lcywgJmhhc2h2YWwpOworCQkqbmV4dF9oYXNoID0gaGFzaHZhbDsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWVyciA9IHJldDsKKwkJCWdvdG8gZXJyb3V0OworCQl9CisJCS8qCisJCSAqIFN0b3AgaWY6ICAoYSkgdGhlcmUgYXJlIG5vIG1vcmUgZW50cmllcywgb3IKKwkJICogKGIpIHdlIGhhdmUgaW5zZXJ0ZWQgYXQgbGVhc3Qgb25lIGVudHJ5IGFuZCB0aGUKKwkJICogbmV4dCBoYXNoIHZhbHVlIGlzIG5vdCBhIGNvbnRpbnVhdGlvbgorCQkgKi8KKwkJaWYgKChyZXQgPT0gMCkgfHwKKwkJICAgIChjb3VudCAmJiAoKGhhc2h2YWwgJiAxKSA9PSAwKSkpCisJCQlicmVhazsKKwl9CisJZHhfcmVsZWFzZShmcmFtZXMpOworCWR4dHJhY2UocHJpbnRrKCJGaWxsIHRyZWU6IHJldHVybmVkICVkIGVudHJpZXMsIG5leHQgaGFzaDogJXhcbiIsIAorCQkgICAgICAgY291bnQsICpuZXh0X2hhc2gpKTsKKwlyZXR1cm4gY291bnQ7CitlcnJvdXQ6CisJZHhfcmVsZWFzZShmcmFtZXMpOworCXJldHVybiAoZXJyKTsKK30KKworCisvKgorICogRGlyZWN0b3J5IGJsb2NrIHNwbGl0dGluZywgY29tcGFjdGluZworICovCisKK3N0YXRpYyBpbnQgZHhfbWFrZV9tYXAgKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICpkZSwgaW50IHNpemUsCisJCQlzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbywgc3RydWN0IGR4X21hcF9lbnRyeSAqbWFwX3RhaWwpCit7CisJaW50IGNvdW50ID0gMDsKKwljaGFyICpiYXNlID0gKGNoYXIgKikgZGU7CisJc3RydWN0IGR4X2hhc2hfaW5mbyBoID0gKmhpbmZvOworCisJd2hpbGUgKChjaGFyICopIGRlIDwgYmFzZSArIHNpemUpCisJeworCQlpZiAoZGUtPm5hbWVfbGVuICYmIGRlLT5pbm9kZSkgeworCQkJZXh0M2ZzX2Rpcmhhc2goZGUtPm5hbWUsIGRlLT5uYW1lX2xlbiwgJmgpOworCQkJbWFwX3RhaWwtLTsKKwkJCW1hcF90YWlsLT5oYXNoID0gaC5oYXNoOworCQkJbWFwX3RhaWwtPm9mZnMgPSAodTMyKSAoKGNoYXIgKikgZGUgLSBiYXNlKTsKKwkJCWNvdW50Kys7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJfQorCQkvKiBYWFg6IGRvIHdlIG5lZWQgdG8gY2hlY2sgcmVjX2xlbiA9PSAwIGNhc2U/IC1DaHJpcyAqLworCQlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSAoKGNoYXIgKikgZGUgKyBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbikpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIGR4X3NvcnRfbWFwIChzdHJ1Y3QgZHhfbWFwX2VudHJ5ICptYXAsIHVuc2lnbmVkIGNvdW50KQoreworICAgICAgICBzdHJ1Y3QgZHhfbWFwX2VudHJ5ICpwLCAqcSwgKnRvcCA9IG1hcCArIGNvdW50IC0gMTsKKyAgICAgICAgaW50IG1vcmU7CisgICAgICAgIC8qIENvbWJzb3J0IHVudGlsIGJ1YmJsZSBzb3J0IGRvZXNuJ3Qgc3VjayAqLworICAgICAgICB3aGlsZSAoY291bnQgPiAyKQorCXsKKyAgICAgICAgICAgICAgICBjb3VudCA9IGNvdW50KjEwLzEzOworICAgICAgICAgICAgICAgIGlmIChjb3VudCAtIDkgPCAyKSAvKiA5LCAxMCAtPiAxMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSAxMTsKKyAgICAgICAgICAgICAgICBmb3IgKHAgPSB0b3AsIHEgPSBwIC0gY291bnQ7IHEgPj0gbWFwOyBwLS0sIHEtLSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLT5oYXNoIDwgcS0+aGFzaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcCgqcCwgKnEpOworICAgICAgICB9CisgICAgICAgIC8qIEdhcmRlbiB2YXJpZXR5IGJ1YmJsZSBzb3J0ICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBtb3JlID0gMDsKKyAgICAgICAgICAgICAgICBxID0gdG9wOworICAgICAgICAgICAgICAgIHdoaWxlIChxLS0gPiBtYXApCisJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxWzFdLmhhc2ggPj0gcVswXS5oYXNoKQorCQkJCWNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgc3dhcCgqKHErMSksICpxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUgPSAxOworCQl9CisJfSB3aGlsZShtb3JlKTsKK30KKworc3RhdGljIHZvaWQgZHhfaW5zZXJ0X2Jsb2NrKHN0cnVjdCBkeF9mcmFtZSAqZnJhbWUsIHUzMiBoYXNoLCB1MzIgYmxvY2spCit7CisJc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzID0gZnJhbWUtPmVudHJpZXM7CisJc3RydWN0IGR4X2VudHJ5ICpvbGQgPSBmcmFtZS0+YXQsICpuZXcgPSBvbGQgKyAxOworCWludCBjb3VudCA9IGR4X2dldF9jb3VudChlbnRyaWVzKTsKKworCWFzc2VydChjb3VudCA8IGR4X2dldF9saW1pdChlbnRyaWVzKSk7CisJYXNzZXJ0KG9sZCA8IGVudHJpZXMgKyBjb3VudCk7CisJbWVtbW92ZShuZXcgKyAxLCBuZXcsIChjaGFyICopKGVudHJpZXMgKyBjb3VudCkgLSAoY2hhciAqKShuZXcpKTsKKwlkeF9zZXRfaGFzaChuZXcsIGhhc2gpOworCWR4X3NldF9ibG9jayhuZXcsIGJsb2NrKTsKKwlkeF9zZXRfY291bnQoZW50cmllcywgY291bnQgKyAxKTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIGV4dDNfdXBkYXRlX2R4X2ZsYWcoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoIUVYVDNfSEFTX0NPTVBBVF9GRUFUVVJFKGlub2RlLT5pX3NiLAorCQkJCSAgICAgRVhUM19GRUFUVVJFX0NPTVBBVF9ESVJfSU5ERVgpKQorCQlFWFQzX0koaW5vZGUpLT5pX2ZsYWdzICY9IH5FWFQzX0lOREVYX0ZMOworfQorCisvKgorICogTk9URSEgdW5saWtlIHN0cm5jbXAsIGV4dDNfbWF0Y2ggcmV0dXJucyAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLgorICoKKyAqIGBsZW4gPD0gRVhUM19OQU1FX0xFTicgaXMgZ3VhcmFudGVlZCBieSBjYWxsZXIuCisgKiBgZGUgIT0gTlVMTCcgaXMgZ3VhcmFudGVlZCBieSBjYWxsZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGV4dDNfbWF0Y2ggKGludCBsZW4sIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lLAorCQkJICAgICAgc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKiBkZSkKK3sKKwlpZiAobGVuICE9IGRlLT5uYW1lX2xlbikKKwkJcmV0dXJuIDA7CisJaWYgKCFkZS0+aW5vZGUpCisJCXJldHVybiAwOworCXJldHVybiAhbWVtY21wKG5hbWUsIGRlLT5uYW1lLCBsZW4pOworfQorCisvKgorICogUmV0dXJucyAwIGlmIG5vdCBmb3VuZCwgLTEgb24gZmFpbHVyZSwgYW5kIDEgb24gc3VjY2VzcworICovCitzdGF0aWMgaW5saW5lIGludCBzZWFyY2hfZGlyYmxvY2soc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsCisJCQkJICBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCQkgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSAgc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKiogcmVzX2RpcikKK3sKKwlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqIGRlOworCWNoYXIgKiBkbGltaXQ7CisJaW50IGRlX2xlbjsKKwljb25zdCBjaGFyICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwlpbnQgbmFtZWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKworCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopIGJoLT5iX2RhdGE7CisJZGxpbWl0ID0gYmgtPmJfZGF0YSArIGRpci0+aV9zYi0+c19ibG9ja3NpemU7CisJd2hpbGUgKChjaGFyICopIGRlIDwgZGxpbWl0KSB7CisJCS8qIHRoaXMgY29kZSBpcyBleGVjdXRlZCBxdWFkcmF0aWNhbGx5IG9mdGVuICovCisJCS8qIGRvIG1pbmltYWwgY2hlY2tpbmcgYGJ5IGhhbmQnICovCisKKwkJaWYgKChjaGFyICopIGRlICsgbmFtZWxlbiA8PSBkbGltaXQgJiYKKwkJICAgIGV4dDNfbWF0Y2ggKG5hbWVsZW4sIG5hbWUsIGRlKSkgeworCQkJLyogZm91bmQgYSBtYXRjaCAtIGp1c3QgdG8gYmUgc3VyZSwgZG8gYSBmdWxsIGNoZWNrICovCisJCQlpZiAoIWV4dDNfY2hlY2tfZGlyX2VudHJ5KCJleHQzX2ZpbmRfZW50cnkiLAorCQkJCQkJICBkaXIsIGRlLCBiaCwgb2Zmc2V0KSkKKwkJCQlyZXR1cm4gLTE7CisJCQkqcmVzX2RpciA9IGRlOworCQkJcmV0dXJuIDE7CisJCX0KKwkJLyogcHJldmVudCBsb29waW5nIG9uIGEgYmFkIGJsb2NrICovCisJCWRlX2xlbiA9IGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKTsKKwkJaWYgKGRlX2xlbiA8PSAwKQorCQkJcmV0dXJuIC0xOworCQlvZmZzZXQgKz0gZGVfbGVuOworCQlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSAoKGNoYXIgKikgZGUgKyBkZV9sZW4pOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJZXh0M19maW5kX2VudHJ5KCkKKyAqCisgKiBmaW5kcyBhbiBlbnRyeSBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB3aXRoIHRoZSB3YW50ZWQgbmFtZS4gSXQKKyAqIHJldHVybnMgdGhlIGNhY2hlIGJ1ZmZlciBpbiB3aGljaCB0aGUgZW50cnkgd2FzIGZvdW5kLCBhbmQgdGhlIGVudHJ5CisgKiBpdHNlbGYgKGFzIGEgcGFyYW1ldGVyIC0gcmVzX2RpcikuIEl0IGRvZXMgTk9UIHJlYWQgdGhlIGlub2RlIG9mIHRoZQorICogZW50cnkgLSB5b3UnbGwgaGF2ZSB0byBkbyB0aGF0IHlvdXJzZWxmIGlmIHlvdSB3YW50IHRvLgorICoKKyAqIFRoZSByZXR1cm5lZCBidWZmZXJfaGVhZCBoYXMgLT5iX2NvdW50IGVsZXZhdGVkLiAgVGhlIGNhbGxlciBpcyBleHBlY3RlZAorICogdG8gYnJlbHNlKCkgaXQgd2hlbiBhcHByb3ByaWF0ZS4KKyAqLworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIGV4dDNfZmluZF9lbnRyeSAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCQlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKiByZXNfZGlyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoX3VzZVtOQU1FSV9SQV9TSVpFXTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgKnJldCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgYmxvY2ssIGI7CisJaW50IHJhX21heCA9IDA7CQkvKiBOdW1iZXIgb2YgYmgncyBpbiB0aGUgcmVhZGFoZWFkCisJCQkJICAgYnVmZmVyLCBiaF91c2VbXSAqLworCWludCByYV9wdHIgPSAwOwkJLyogQ3VycmVudCBpbmRleCBpbnRvIHJlYWRhaGVhZAorCQkJCSAgIGJ1ZmZlciAqLworCWludCBudW0gPSAwOworCWludCBuYmxvY2tzLCBpLCBlcnI7CisJc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCWludCBuYW1lbGVuOworCWNvbnN0IHU4ICpuYW1lOworCXVuc2lnbmVkIGJsb2Nrc2l6ZTsKKworCSpyZXNfZGlyID0gTlVMTDsKKwlzYiA9IGRpci0+aV9zYjsKKwlibG9ja3NpemUgPSBzYi0+c19ibG9ja3NpemU7CisJbmFtZWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwluYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwlpZiAobmFtZWxlbiA+IEVYVDNfTkFNRV9MRU4pCisJCXJldHVybiBOVUxMOworI2lmZGVmIENPTkZJR19FWFQzX0lOREVYCisJaWYgKGlzX2R4KGRpcikpIHsKKwkJYmggPSBleHQzX2R4X2ZpbmRfZW50cnkoZGVudHJ5LCByZXNfZGlyLCAmZXJyKTsKKwkJLyoKKwkJICogT24gc3VjY2Vzcywgb3IgaWYgdGhlIGVycm9yIHdhcyBmaWxlIG5vdCBmb3VuZCwKKwkJICogcmV0dXJuLiAgT3RoZXJ3aXNlLCBmYWxsIGJhY2sgdG8gZG9pbmcgYSBzZWFyY2ggdGhlCisJCSAqIG9sZCBmYXNoaW9uZWQgd2F5LgorCQkgKi8KKwkJaWYgKGJoIHx8IChlcnIgIT0gRVJSX0JBRF9EWF9ESVIpKQorCQkJcmV0dXJuIGJoOworCQlkeHRyYWNlKHByaW50aygiZXh0M19maW5kX2VudHJ5OiBkeCBmYWlsZWQsIGZhbGxpbmcgYmFja1xuIikpOworCX0KKyNlbmRpZgorCW5ibG9ja3MgPSBkaXItPmlfc2l6ZSA+PiBFWFQzX0JMT0NLX1NJWkVfQklUUyhzYik7CisJc3RhcnQgPSBFWFQzX0koZGlyKS0+aV9kaXJfc3RhcnRfbG9va3VwOworCWlmIChzdGFydCA+PSBuYmxvY2tzKQorCQlzdGFydCA9IDA7CisJYmxvY2sgPSBzdGFydDsKK3Jlc3RhcnQ6CisJZG8geworCQkvKgorCQkgKiBXZSBkZWFsIHdpdGggdGhlIHJlYWQtYWhlYWQgbG9naWMgaGVyZS4KKwkJICovCisJCWlmIChyYV9wdHIgPj0gcmFfbWF4KSB7CisJCQkvKiBSZWZpbGwgdGhlIHJlYWRhaGVhZCBidWZmZXIgKi8KKwkJCXJhX3B0ciA9IDA7CisJCQliID0gYmxvY2s7CisJCQlmb3IgKHJhX21heCA9IDA7IHJhX21heCA8IE5BTUVJX1JBX1NJWkU7IHJhX21heCsrKSB7CisJCQkJLyoKKwkJCQkgKiBUZXJtaW5hdGUgaWYgd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUKKwkJCQkgKiBkaXJlY3RvcnkgYW5kIG11c3Qgd3JhcCwgb3IgaWYgb3VyCisJCQkJICogc2VhcmNoIGhhcyBmaW5pc2hlZCBhdCB0aGlzIGJsb2NrLgorCQkJCSAqLworCQkJCWlmIChiID49IG5ibG9ja3MgfHwgKG51bSAmJiBibG9jayA9PSBzdGFydCkpIHsKKwkJCQkJYmhfdXNlW3JhX21heF0gPSBOVUxMOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbnVtKys7CisJCQkJYmggPSBleHQzX2dldGJsayhOVUxMLCBkaXIsIGIrKywgMCwgJmVycik7CisJCQkJYmhfdXNlW3JhX21heF0gPSBiaDsKKwkJCQlpZiAoYmgpCisJCQkJCWxsX3J3X2Jsb2NrKFJFQUQsIDEsICZiaCk7CisJCQl9CisJCX0KKwkJaWYgKChiaCA9IGJoX3VzZVtyYV9wdHIrK10pID09IE5VTEwpCisJCQlnb3RvIG5leHQ7CisJCXdhaXRfb25fYnVmZmVyKGJoKTsKKwkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCQkvKiByZWFkIGVycm9yLCBza2lwIGJsb2NrICYgaG9wZSBmb3IgdGhlIGJlc3QgKi8KKwkJCWV4dDNfZXJyb3Ioc2IsIF9fRlVOQ1RJT05fXywgInJlYWRpbmcgZGlyZWN0b3J5ICMlbHUgIgorCQkJCSAgICJvZmZzZXQgJWx1IiwgZGlyLT5pX2lubywgYmxvY2spOworCQkJYnJlbHNlKGJoKTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCQlpID0gc2VhcmNoX2RpcmJsb2NrKGJoLCBkaXIsIGRlbnRyeSwKKwkJCSAgICBibG9jayA8PCBFWFQzX0JMT0NLX1NJWkVfQklUUyhzYiksIHJlc19kaXIpOworCQlpZiAoaSA9PSAxKSB7CisJCQlFWFQzX0koZGlyKS0+aV9kaXJfc3RhcnRfbG9va3VwID0gYmxvY2s7CisJCQlyZXQgPSBiaDsKKwkJCWdvdG8gY2xlYW51cF9hbmRfZXhpdDsKKwkJfSBlbHNlIHsKKwkJCWJyZWxzZShiaCk7CisJCQlpZiAoaSA8IDApCisJCQkJZ290byBjbGVhbnVwX2FuZF9leGl0OworCQl9CisJbmV4dDoKKwkJaWYgKCsrYmxvY2sgPj0gbmJsb2NrcykKKwkJCWJsb2NrID0gMDsKKwl9IHdoaWxlIChibG9jayAhPSBzdGFydCk7CisKKwkvKgorCSAqIElmIHRoZSBkaXJlY3RvcnkgaGFzIGdyb3duIHdoaWxlIHdlIHdlcmUgc2VhcmNoaW5nLCB0aGVuCisJICogc2VhcmNoIHRoZSBsYXN0IHBhcnQgb2YgdGhlIGRpcmVjdG9yeSBiZWZvcmUgZ2l2aW5nIHVwLgorCSAqLworCWJsb2NrID0gbmJsb2NrczsKKwluYmxvY2tzID0gZGlyLT5pX3NpemUgPj4gRVhUM19CTE9DS19TSVpFX0JJVFMoc2IpOworCWlmIChibG9jayA8IG5ibG9ja3MpIHsKKwkJc3RhcnQgPSAwOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCitjbGVhbnVwX2FuZF9leGl0OgorCS8qIENsZWFuIHVwIHRoZSByZWFkLWFoZWFkIGJsb2NrcyAqLworCWZvciAoOyByYV9wdHIgPCByYV9tYXg7IHJhX3B0cisrKQorCQlicmVsc2UgKGJoX3VzZVtyYV9wdHJdKTsKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX0VYVDNfSU5ERVgKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBleHQzX2R4X2ZpbmRfZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICAgICAgc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKipyZXNfZGlyLCBpbnQgKmVycikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwlzdHJ1Y3QgZHhfaGFzaF9pbmZvCWhpbmZvOworCXUzMiBoYXNoOworCXN0cnVjdCBkeF9mcmFtZSBmcmFtZXNbMl0sICpmcmFtZTsKKwlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqZGUsICp0b3A7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwl1bnNpZ25lZCBsb25nIGJsb2NrOworCWludCByZXR2YWw7CisJaW50IG5hbWVsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJY29uc3QgdTggKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCXN0cnVjdCBpbm9kZSAqZGlyID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKKworCXNiID0gZGlyLT5pX3NiOworCWlmICghKGZyYW1lID0gZHhfcHJvYmUoZGVudHJ5LCBOVUxMLCAmaGluZm8sIGZyYW1lcywgZXJyKSkpCisJCXJldHVybiBOVUxMOworCWhhc2ggPSBoaW5mby5oYXNoOworCWRvIHsKKwkJYmxvY2sgPSBkeF9nZXRfYmxvY2soZnJhbWUtPmF0KTsKKwkJaWYgKCEoYmggPSBleHQzX2JyZWFkIChOVUxMLGRpciwgYmxvY2ssIDAsIGVycikpKQorCQkJZ290byBlcnJvdXQ7CisJCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopIGJoLT5iX2RhdGE7CisJCXRvcCA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSAoKGNoYXIgKikgZGUgKyBzYi0+c19ibG9ja3NpemUgLQorCQkJCSAgICAgICBFWFQzX0RJUl9SRUNfTEVOKDApKTsKKwkJZm9yICg7IGRlIDwgdG9wOyBkZSA9IGV4dDNfbmV4dF9lbnRyeShkZSkpCisJCWlmIChleHQzX21hdGNoIChuYW1lbGVuLCBuYW1lLCBkZSkpIHsKKwkJCWlmICghZXh0M19jaGVja19kaXJfZW50cnkoImV4dDNfZmluZF9lbnRyeSIsCisJCQkJCQkgIGRpciwgZGUsIGJoLAorCQkJCSAgKGJsb2NrPDxFWFQzX0JMT0NLX1NJWkVfQklUUyhzYikpCisJCQkJCSAgKygoY2hhciAqKWRlIC0gYmgtPmJfZGF0YSkpKSB7CisJCQkJYnJlbHNlIChiaCk7CisJCQkJZ290byBlcnJvdXQ7CisJCQl9CisJCQkqcmVzX2RpciA9IGRlOworCQkJZHhfcmVsZWFzZSAoZnJhbWVzKTsKKwkJCXJldHVybiBiaDsKKwkJfQorCQlicmVsc2UgKGJoKTsKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCBjb250aW51ZSB0byBzZWFyY2ggKi8KKwkJcmV0dmFsID0gZXh0M19odHJlZV9uZXh0X2Jsb2NrKGRpciwgaGFzaCwgZnJhbWUsCisJCQkJCSAgICAgICBmcmFtZXMsIE5VTEwpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJlcnJvciByZWFkaW5nIGluZGV4IHBhZ2UgaW4gZGlyZWN0b3J5ICMlbHUiLAorCQkJICAgICBkaXItPmlfaW5vKTsKKwkJCSplcnIgPSByZXR2YWw7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCX0gd2hpbGUgKHJldHZhbCA9PSAxKTsKKworCSplcnIgPSAtRU5PRU5UOworZXJyb3V0OgorCWR4dHJhY2UocHJpbnRrKCIlcyBub3QgZm91bmRcbiIsIG5hbWUpKTsKKwlkeF9yZWxlYXNlIChmcmFtZXMpOworCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpleHQzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKiBkZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKworCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiBFWFQzX05BTUVfTEVOKQorCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKKworCWJoID0gZXh0M19maW5kX2VudHJ5KGRlbnRyeSwgJmRlKTsKKwlpbm9kZSA9IE5VTEw7CisJaWYgKGJoKSB7CisJCXVuc2lnbmVkIGxvbmcgaW5vID0gbGUzMl90b19jcHUoZGUtPmlub2RlKTsKKwkJYnJlbHNlIChiaCk7CisJCWlub2RlID0gaWdldChkaXItPmlfc2IsIGlubyk7CisKKwkJaWYgKCFpbm9kZSkKKwkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCX0KKwlpZiAoaW5vZGUpCisJCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdHJ1Y3QgZGVudHJ5ICpleHQzX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpCit7CisJdW5zaWduZWQgbG9uZyBpbm87CisJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGRlbnRyeSBkb3Rkb3Q7CisJc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKiBkZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJZG90ZG90LmRfbmFtZS5uYW1lID0gIi4uIjsKKwlkb3Rkb3QuZF9uYW1lLmxlbiA9IDI7CisJZG90ZG90LmRfcGFyZW50ID0gY2hpbGQ7IC8qIGNvbmZ1c2luZywgaXNuJ3QgaXQhICovCisKKwliaCA9IGV4dDNfZmluZF9lbnRyeSgmZG90ZG90LCAmZGUpOworCWlub2RlID0gTlVMTDsKKwlpZiAoIWJoKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwlpbm8gPSBsZTMyX3RvX2NwdShkZS0+aW5vZGUpOworCWJyZWxzZShiaCk7CisJaW5vZGUgPSBpZ2V0KGNoaWxkLT5kX2lub2RlLT5pX3NiLCBpbm8pOworCisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisKKwlwYXJlbnQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOworCWlmICghcGFyZW50KSB7CisJCWlwdXQoaW5vZGUpOworCQlwYXJlbnQgPSBFUlJfUFRSKC1FTk9NRU0pOworCX0KKwlyZXR1cm4gcGFyZW50OworfSAKKworI2RlZmluZSBTX1NISUZUIDEyCitzdGF0aWMgdW5zaWduZWQgY2hhciBleHQzX3R5cGVfYnlfbW9kZVtTX0lGTVQgPj4gU19TSElGVF0gPSB7CisJW1NfSUZSRUcgPj4gU19TSElGVF0JPSBFWFQzX0ZUX1JFR19GSUxFLAorCVtTX0lGRElSID4+IFNfU0hJRlRdCT0gRVhUM19GVF9ESVIsCisJW1NfSUZDSFIgPj4gU19TSElGVF0JPSBFWFQzX0ZUX0NIUkRFViwKKwlbU19JRkJMSyA+PiBTX1NISUZUXQk9IEVYVDNfRlRfQkxLREVWLAorCVtTX0lGSUZPID4+IFNfU0hJRlRdCT0gRVhUM19GVF9GSUZPLAorCVtTX0lGU09DSyA+PiBTX1NISUZUXQk9IEVYVDNfRlRfU09DSywKKwlbU19JRkxOSyA+PiBTX1NISUZUXQk9IEVYVDNfRlRfU1lNTElOSywKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQzX3NldF9kZV90eXBlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKmRlLAorCQkJCXVtb2RlX3QgbW9kZSkgeworCWlmIChFWFQzX0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEUpKQorCQlkZS0+ZmlsZV90eXBlID0gZXh0M190eXBlX2J5X21vZGVbKG1vZGUgJiBTX0lGTVQpPj5TX1NISUZUXTsKK30KKworI2lmZGVmIENPTkZJR19FWFQzX0lOREVYCitzdGF0aWMgc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKgorZHhfbW92ZV9kaXJlbnRzKGNoYXIgKmZyb20sIGNoYXIgKnRvLCBzdHJ1Y3QgZHhfbWFwX2VudHJ5ICptYXAsIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCByZWNfbGVuID0gMDsKKworCXdoaWxlIChjb3VudC0tKSB7CisJCXN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICpkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSAoZnJvbSArIG1hcC0+b2Zmcyk7CisJCXJlY19sZW4gPSBFWFQzX0RJUl9SRUNfTEVOKGRlLT5uYW1lX2xlbik7CisJCW1lbWNweSAodG8sIGRlLCByZWNfbGVuKTsKKwkJKChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSB0byktPnJlY19sZW4gPQorCQkJCWNwdV90b19sZTE2KHJlY19sZW4pOworCQlkZS0+aW5vZGUgPSAwOworCQltYXArKzsKKwkJdG8gKz0gcmVjX2xlbjsKKwl9CisJcmV0dXJuIChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSAodG8gLSByZWNfbGVuKTsKK30KKworc3RhdGljIHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yKiBkeF9wYWNrX2RpcmVudHMoY2hhciAqYmFzZSwgaW50IHNpemUpCit7CisJc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKm5leHQsICp0bywgKnByZXYsICpkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSBiYXNlOworCXVuc2lnbmVkIHJlY19sZW4gPSAwOworCisJcHJldiA9IHRvID0gZGU7CisJd2hpbGUgKChjaGFyKilkZSA8IGJhc2UgKyBzaXplKSB7CisJCW5leHQgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikgKChjaGFyICopIGRlICsKKwkJCQkJCSAgICBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbikpOworCQlpZiAoZGUtPmlub2RlICYmIGRlLT5uYW1lX2xlbikgeworCQkJcmVjX2xlbiA9IEVYVDNfRElSX1JFQ19MRU4oZGUtPm5hbWVfbGVuKTsKKwkJCWlmIChkZSA+IHRvKQorCQkJCW1lbW1vdmUodG8sIGRlLCByZWNfbGVuKTsKKwkJCXRvLT5yZWNfbGVuID0gY3B1X3RvX2xlMTYocmVjX2xlbik7CisJCQlwcmV2ID0gdG87CisJCQl0byA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSAoKChjaGFyICopIHRvKSArIHJlY19sZW4pOworCQl9CisJCWRlID0gbmV4dDsKKwl9CisJcmV0dXJuIHByZXY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqZG9fc3BsaXQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsCisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCxzdHJ1Y3QgZHhfZnJhbWUgKmZyYW1lLAorCQkJc3RydWN0IGR4X2hhc2hfaW5mbyAqaGluZm8sIGludCAqZXJyb3IpCit7CisJdW5zaWduZWQgYmxvY2tzaXplID0gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwl1bnNpZ25lZCBjb3VudCwgY29udGludWVkOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgyOworCXUzMiBuZXdibG9jazsKKwl1MzIgaGFzaDI7CisJc3RydWN0IGR4X21hcF9lbnRyeSAqbWFwOworCWNoYXIgKmRhdGExID0gKCpiaCktPmJfZGF0YSwgKmRhdGEyOworCXVuc2lnbmVkIHNwbGl0OworCXN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICpkZSA9IE5VTEwsICpkZTI7CisJaW50CWVycjsKKworCWJoMiA9IGV4dDNfYXBwZW5kIChoYW5kbGUsIGRpciwgJm5ld2Jsb2NrLCBlcnJvcik7CisJaWYgKCEoYmgyKSkgeworCQlicmVsc2UoKmJoKTsKKwkJKmJoID0gTlVMTDsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJQlVGRkVSX1RSQUNFKCpiaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsICpiaCk7CisJaWYgKGVycikgeworCWpvdXJuYWxfZXJyb3I6CisJCWJyZWxzZSgqYmgpOworCQlicmVsc2UoYmgyKTsKKwkJKmJoID0gTlVMTDsKKwkJZXh0M19zdGRfZXJyb3IoZGlyLT5pX3NiLCBlcnIpOworCQlnb3RvIGVycm91dDsKKwl9CisJQlVGRkVSX1RSQUNFKGZyYW1lLT5iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGZyYW1lLT5iaCk7CisJaWYgKGVycikKKwkJZ290byBqb3VybmFsX2Vycm9yOworCisJZGF0YTIgPSBiaDItPmJfZGF0YTsKKworCS8qIGNyZWF0ZSBtYXAgaW4gdGhlIGVuZCBvZiBkYXRhMiBibG9jayAqLworCW1hcCA9IChzdHJ1Y3QgZHhfbWFwX2VudHJ5ICopIChkYXRhMiArIGJsb2Nrc2l6ZSk7CisJY291bnQgPSBkeF9tYWtlX21hcCAoKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopIGRhdGExLAorCQkJICAgICBibG9ja3NpemUsIGhpbmZvLCBtYXApOworCW1hcCAtPSBjb3VudDsKKwlzcGxpdCA9IGNvdW50LzI7IC8vIG5lZWQgdG8gYWRqdXN0IHRvIGFjdHVhbCBtaWRkbGUKKwlkeF9zb3J0X21hcCAobWFwLCBjb3VudCk7CisJaGFzaDIgPSBtYXBbc3BsaXRdLmhhc2g7CisJY29udGludWVkID0gaGFzaDIgPT0gbWFwW3NwbGl0IC0gMV0uaGFzaDsKKwlkeHRyYWNlKHByaW50aygiU3BsaXQgYmxvY2sgJWkgYXQgJXgsICVpLyVpXG4iLAorCQlkeF9nZXRfYmxvY2soZnJhbWUtPmF0KSwgaGFzaDIsIHNwbGl0LCBjb3VudC1zcGxpdCkpOworCisJLyogRmFuY3kgZGFuY2UgdG8gc3RheSB3aXRoaW4gdHdvIGJ1ZmZlcnMgKi8KKwlkZTIgPSBkeF9tb3ZlX2RpcmVudHMoZGF0YTEsIGRhdGEyLCBtYXAgKyBzcGxpdCwgY291bnQgLSBzcGxpdCk7CisJZGUgPSBkeF9wYWNrX2RpcmVudHMoZGF0YTEsYmxvY2tzaXplKTsKKwlkZS0+cmVjX2xlbiA9IGNwdV90b19sZTE2KGRhdGExICsgYmxvY2tzaXplIC0gKGNoYXIgKikgZGUpOworCWRlMi0+cmVjX2xlbiA9IGNwdV90b19sZTE2KGRhdGEyICsgYmxvY2tzaXplIC0gKGNoYXIgKikgZGUyKTsKKwlkeHRyYWNlKGR4X3Nob3dfbGVhZiAoaGluZm8sIChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSBkYXRhMSwgYmxvY2tzaXplLCAxKSk7CisJZHh0cmFjZShkeF9zaG93X2xlYWYgKGhpbmZvLCAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikgZGF0YTIsIGJsb2Nrc2l6ZSwgMSkpOworCisJLyogV2hpY2ggYmxvY2sgZ2V0cyB0aGUgbmV3IGVudHJ5PyAqLworCWlmIChoaW5mby0+aGFzaCA+PSBoYXNoMikKKwl7CisJCXN3YXAoKmJoLCBiaDIpOworCQlkZSA9IGRlMjsKKwl9CisJZHhfaW5zZXJ0X2Jsb2NrIChmcmFtZSwgaGFzaDIgKyBjb250aW51ZWQsIG5ld2Jsb2NrKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEgKGhhbmRsZSwgYmgyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGpvdXJuYWxfZXJyb3I7CisJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIChoYW5kbGUsIGZyYW1lLT5iaCk7CisJaWYgKGVycikKKwkJZ290byBqb3VybmFsX2Vycm9yOworCWJyZWxzZSAoYmgyKTsKKwlkeHRyYWNlKGR4X3Nob3dfaW5kZXggKCJmcmFtZSIsIGZyYW1lLT5lbnRyaWVzKSk7CitlcnJvdXQ6CisJcmV0dXJuIGRlOworfQorI2VuZGlmCisKKworLyoKKyAqIEFkZCBhIG5ldyBlbnRyeSBpbnRvIGEgZGlyZWN0b3J5IChsZWFmKSBibG9jay4gIElmIGRlIGlzIG5vbi1OVUxMLAorICogaXQgcG9pbnRzIHRvIGEgZGlyZWN0b3J5IGVudHJ5IHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgbGFyZ2UKKyAqIGVub3VnaCBmb3IgbmV3IGRpcmVjdG9yeSBlbnRyeS4gIElmIGRlIGlzIE5VTEwsIHRoZW4KKyAqIGFkZF9kaXJlbnRfdG9fYnVmIHdpbGwgYXR0ZW1wdCBzZWFyY2ggdGhlIGRpcmVjdG9yeSBibG9jayBmb3IKKyAqIHNwYWNlLiAgSXQgd2lsbCByZXR1cm4gLUVOT1NQQyBpZiBubyBzcGFjZSBpcyBhdmFpbGFibGUsIGFuZCAtRUlPCisgKiBhbmQgLUVFWElTVCBpZiBkaXJlY3RvcnkgZW50cnkgYWxyZWFkeSBleGlzdHMuCisgKiAKKyAqIE5PVEUhICBiaCBpcyBOT1QgcmVsZWFzZWQgaW4gdGhlIGNhc2Ugd2hlcmUgRU5PU1BDIGlzIHJldHVybmVkLiAgSW4KKyAqIGFsbCBvdGhlciBjYXNlcyBiaCBpcyByZWxlYXNlZC4KKyAqLworc3RhdGljIGludCBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICpkZSwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCit7CisJc3RydWN0IGlub2RlCSpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCWNvbnN0IGNoYXIJKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludAkJbmFtZWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwl1bnNpZ25lZCBsb25nCW9mZnNldCA9IDA7CisJdW5zaWduZWQgc2hvcnQJcmVjbGVuOworCWludAkJbmxlbiwgcmxlbiwgZXJyOworCWNoYXIJCSp0b3A7CisKKwlyZWNsZW4gPSBFWFQzX0RJUl9SRUNfTEVOKG5hbWVsZW4pOworCWlmICghZGUpIHsKKwkJZGUgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKiliaC0+Yl9kYXRhOworCQl0b3AgPSBiaC0+Yl9kYXRhICsgZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHJlY2xlbjsKKwkJd2hpbGUgKChjaGFyICopIGRlIDw9IHRvcCkgeworCQkJaWYgKCFleHQzX2NoZWNrX2Rpcl9lbnRyeSgiZXh0M19hZGRfZW50cnkiLCBkaXIsIGRlLAorCQkJCQkJICBiaCwgb2Zmc2V0KSkgeworCQkJCWJyZWxzZSAoYmgpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJaWYgKGV4dDNfbWF0Y2ggKG5hbWVsZW4sIG5hbWUsIGRlKSkgeworCQkJCWJyZWxzZSAoYmgpOworCQkJCXJldHVybiAtRUVYSVNUOworCQkJfQorCQkJbmxlbiA9IEVYVDNfRElSX1JFQ19MRU4oZGUtPm5hbWVfbGVuKTsKKwkJCXJsZW4gPSBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbik7CisJCQlpZiAoKGRlLT5pbm9kZT8gcmxlbiAtIG5sZW46IHJsZW4pID49IHJlY2xlbikKKwkJCQlicmVhazsKKwkJCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopKChjaGFyICopZGUgKyBybGVuKTsKKwkJCW9mZnNldCArPSBybGVuOworCQl9CisJCWlmICgoY2hhciAqKSBkZSA+IHRvcCkKKwkJCXJldHVybiAtRU5PU1BDOworCX0KKwlCVUZGRVJfVFJBQ0UoYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7CisJaWYgKGVycikgeworCQlleHQzX3N0ZF9lcnJvcihkaXItPmlfc2IsIGVycik7CisJCWJyZWxzZShiaCk7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogQnkgbm93IHRoZSBidWZmZXIgaXMgbWFya2VkIGZvciBqb3VybmFsaW5nICovCisJbmxlbiA9IEVYVDNfRElSX1JFQ19MRU4oZGUtPm5hbWVfbGVuKTsKKwlybGVuID0gbGUxNl90b19jcHUoZGUtPnJlY19sZW4pOworCWlmIChkZS0+aW5vZGUpIHsKKwkJc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKmRlMSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSgoY2hhciAqKWRlICsgbmxlbik7CisJCWRlMS0+cmVjX2xlbiA9IGNwdV90b19sZTE2KHJsZW4gLSBubGVuKTsKKwkJZGUtPnJlY19sZW4gPSBjcHVfdG9fbGUxNihubGVuKTsKKwkJZGUgPSBkZTE7CisJfQorCWRlLT5maWxlX3R5cGUgPSBFWFQzX0ZUX1VOS05PV047CisJaWYgKGlub2RlKSB7CisJCWRlLT5pbm9kZSA9IGNwdV90b19sZTMyKGlub2RlLT5pX2lubyk7CisJCWV4dDNfc2V0X2RlX3R5cGUoZGlyLT5pX3NiLCBkZSwgaW5vZGUtPmlfbW9kZSk7CisJfSBlbHNlCisJCWRlLT5pbm9kZSA9IDA7CisJZGUtPm5hbWVfbGVuID0gbmFtZWxlbjsKKwltZW1jcHkgKGRlLT5uYW1lLCBuYW1lLCBuYW1lbGVuKTsKKwkvKgorCSAqIFhYWCBzaG91bGRuJ3QgdXBkYXRlIGFueSB0aW1lcyB1bnRpbCBzdWNjZXNzZnVsCisJICogY29tcGxldGlvbiBvZiBzeXNjYWxsLCBidXQgdG9vIG1hbnkgY2FsbGVycyBkZXBlbmQKKwkgKiBvbiB0aGlzLgorCSAqCisJICogWFhYIHNpbWlsYXJseSwgdG9vIG1hbnkgY2FsbGVycyBkZXBlbmQgb24KKwkgKiBleHQzX25ld19pbm9kZSgpIHNldHRpbmcgdGhlIHRpbWVzLCBidXQgZXJyb3IKKwkgKiByZWNvdmVyeSBkZWxldGVzIHRoZSBpbm9kZSwgc28gdGhlIHdvcnN0IHRoYXQgY2FuCisJICogaGFwcGVuIGlzIHRoYXQgdGhlIHRpbWVzIGFyZSBzbGlnaHRseSBvdXQgb2YgZGF0ZQorCSAqIGFuZC9vciBkaWZmZXJlbnQgZnJvbSB0aGUgZGlyZWN0b3J5IGNoYW5nZSB0aW1lLgorCSAqLworCWRpci0+aV9tdGltZSA9IGRpci0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJZXh0M191cGRhdGVfZHhfZmxhZyhkaXIpOworCWRpci0+aV92ZXJzaW9uKys7CisJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZGlyKTsKKwlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwlpZiAoZXJyKQorCQlleHQzX3N0ZF9lcnJvcihkaXItPmlfc2IsIGVycik7CisJYnJlbHNlKGJoKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19FWFQzX0lOREVYCisvKgorICogVGhpcyBjb252ZXJ0cyBhIG9uZSBibG9jayB1bmluZGV4ZWQgZGlyZWN0b3J5IHRvIGEgMyBibG9jayBpbmRleGVkCisgKiBkaXJlY3RvcnksIGFuZCBhZGRzIHRoZSBkZW50cnkgdG8gdGhlIGluZGV4ZWQgZGlyZWN0b3J5LgorICovCitzdGF0aWMgaW50IG1ha2VfaW5kZXhlZF9kaXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJc3RydWN0IGlub2RlCSpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCWNvbnN0IGNoYXIJKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludAkJbmFtZWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMjsKKwlzdHJ1Y3QgZHhfcm9vdAkqcm9vdDsKKwlzdHJ1Y3QgZHhfZnJhbWUJZnJhbWVzWzJdLCAqZnJhbWU7CisJc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzOworCXN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yCSpkZSwgKmRlMjsKKwljaGFyCQkqZGF0YTEsICp0b3A7CisJdW5zaWduZWQJbGVuOworCWludAkJcmV0dmFsOworCXVuc2lnbmVkCWJsb2Nrc2l6ZTsKKwlzdHJ1Y3QgZHhfaGFzaF9pbmZvIGhpbmZvOworCXUzMgkJYmxvY2s7CisJc3RydWN0IGZha2VfZGlyZW50ICpmZGU7CisKKwlibG9ja3NpemUgPSAgZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlkeHRyYWNlKHByaW50aygiQ3JlYXRpbmcgaW5kZXhcbiIpKTsKKwlyZXR2YWwgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwlpZiAocmV0dmFsKSB7CisJCWV4dDNfc3RkX2Vycm9yKGRpci0+aV9zYiwgcmV0dmFsKTsKKwkJYnJlbHNlKGJoKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJcm9vdCA9IChzdHJ1Y3QgZHhfcm9vdCAqKSBiaC0+Yl9kYXRhOworCisJYmgyID0gZXh0M19hcHBlbmQgKGhhbmRsZSwgZGlyLCAmYmxvY2ssICZyZXR2YWwpOworCWlmICghKGJoMikpIHsKKwkJYnJlbHNlKGJoKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJRVhUM19JKGRpciktPmlfZmxhZ3MgfD0gRVhUM19JTkRFWF9GTDsKKwlkYXRhMSA9IGJoMi0+Yl9kYXRhOworCisJLyogVGhlIDB0aCBibG9jayBiZWNvbWVzIHRoZSByb290LCBtb3ZlIHRoZSBkaXJlbnRzIG91dCAqLworCWZkZSA9ICZyb290LT5kb3Rkb3Q7CisJZGUgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikoKGNoYXIgKilmZGUgKyBsZTE2X3RvX2NwdShmZGUtPnJlY19sZW4pKTsKKwlsZW4gPSAoKGNoYXIgKikgcm9vdCkgKyBibG9ja3NpemUgLSAoY2hhciAqKSBkZTsKKwltZW1jcHkgKGRhdGExLCBkZSwgbGVuKTsKKwlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSBkYXRhMTsKKwl0b3AgPSBkYXRhMSArIGxlbjsKKwl3aGlsZSAoKGNoYXIgKikoZGUyPSh2b2lkKilkZStsZTE2X3RvX2NwdShkZS0+cmVjX2xlbikpIDwgdG9wKQorCQlkZSA9IGRlMjsKKwlkZS0+cmVjX2xlbiA9IGNwdV90b19sZTE2KGRhdGExICsgYmxvY2tzaXplIC0gKGNoYXIgKikgZGUpOworCS8qIEluaXRpYWxpemUgdGhlIHJvb3Q7IHRoZSBkb3QgZGlyZW50cyBhbHJlYWR5IGV4aXN0ICovCisJZGUgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikgKCZyb290LT5kb3Rkb3QpOworCWRlLT5yZWNfbGVuID0gY3B1X3RvX2xlMTYoYmxvY2tzaXplIC0gRVhUM19ESVJfUkVDX0xFTigyKSk7CisJbWVtc2V0ICgmcm9vdC0+aW5mbywgMCwgc2l6ZW9mKHJvb3QtPmluZm8pKTsKKwlyb290LT5pbmZvLmluZm9fbGVuZ3RoID0gc2l6ZW9mKHJvb3QtPmluZm8pOworCXJvb3QtPmluZm8uaGFzaF92ZXJzaW9uID0gRVhUM19TQihkaXItPmlfc2IpLT5zX2RlZl9oYXNoX3ZlcnNpb247CisJZW50cmllcyA9IHJvb3QtPmVudHJpZXM7CisJZHhfc2V0X2Jsb2NrIChlbnRyaWVzLCAxKTsKKwlkeF9zZXRfY291bnQgKGVudHJpZXMsIDEpOworCWR4X3NldF9saW1pdCAoZW50cmllcywgZHhfcm9vdF9saW1pdChkaXIsIHNpemVvZihyb290LT5pbmZvKSkpOworCisJLyogSW5pdGlhbGl6ZSBhcyBmb3IgZHhfcHJvYmUgKi8KKwloaW5mby5oYXNoX3ZlcnNpb24gPSByb290LT5pbmZvLmhhc2hfdmVyc2lvbjsKKwloaW5mby5zZWVkID0gRVhUM19TQihkaXItPmlfc2IpLT5zX2hhc2hfc2VlZDsKKwlleHQzZnNfZGlyaGFzaChuYW1lLCBuYW1lbGVuLCAmaGluZm8pOworCWZyYW1lID0gZnJhbWVzOworCWZyYW1lLT5lbnRyaWVzID0gZW50cmllczsKKwlmcmFtZS0+YXQgPSBlbnRyaWVzOworCWZyYW1lLT5iaCA9IGJoOworCWJoID0gYmgyOworCWRlID0gZG9fc3BsaXQoaGFuZGxlLGRpciwgJmJoLCBmcmFtZSwgJmhpbmZvLCAmcmV0dmFsKTsKKwlkeF9yZWxlYXNlIChmcmFtZXMpOworCWlmICghKGRlKSkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGUsIGRlbnRyeSwgaW5vZGUsIGRlLCBiaCk7Cit9CisjZW5kaWYKKworLyoKKyAqCWV4dDNfYWRkX2VudHJ5KCkKKyAqCisgKiBhZGRzIGEgZmlsZSBlbnRyeSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSwgdXNpbmcgdGhlIHNhbWUKKyAqIHNlbWFudGljcyBhcyBleHQzX2ZpbmRfZW50cnkoKS4gSXQgcmV0dXJucyBOVUxMIGlmIGl0IGZhaWxlZC4KKyAqCisgKiBOT1RFISEgVGhlIGlub2RlIHBhcnQgb2YgJ2RlJyBpcyBsZWZ0IGF0IDAgLSB3aGljaCBtZWFucyB5b3UKKyAqIG1heSBub3Qgc2xlZXAgYmV0d2VlbiBjYWxsaW5nIHRoaXMgYW5kIHB1dHRpbmcgc29tZXRoaW5nIGludG8KKyAqIHRoZSBlbnRyeSwgYXMgc29tZW9uZSBlbHNlIG1pZ2h0IGhhdmUgdXNlZCBpdCB3aGlsZSB5b3Ugc2xlcHQuCisgKi8KK3N0YXRpYyBpbnQgZXh0M19hZGRfZW50cnkgKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJaW50CXJldHZhbDsKKyNpZmRlZiBDT05GSUdfRVhUM19JTkRFWAorCWludAlkeF9mYWxsYmFjaz0wOworI2VuZGlmCisJdW5zaWduZWQgYmxvY2tzaXplOworCXVuc2lnbmVkIG5sZW4sIHJsZW47CisJdTMyIGJsb2NrLCBibG9ja3M7CisKKwlzYiA9IGRpci0+aV9zYjsKKwlibG9ja3NpemUgPSBzYi0+c19ibG9ja3NpemU7CisJaWYgKCFkZW50cnktPmRfbmFtZS5sZW4pCisJCXJldHVybiAtRUlOVkFMOworI2lmZGVmIENPTkZJR19FWFQzX0lOREVYCisJaWYgKGlzX2R4KGRpcikpIHsKKwkJcmV0dmFsID0gZXh0M19keF9hZGRfZW50cnkoaGFuZGxlLCBkZW50cnksIGlub2RlKTsKKwkJaWYgKCFyZXR2YWwgfHwgKHJldHZhbCAhPSBFUlJfQkFEX0RYX0RJUikpCisJCQlyZXR1cm4gcmV0dmFsOworCQlFWFQzX0koZGlyKS0+aV9mbGFncyAmPSB+RVhUM19JTkRFWF9GTDsKKwkJZHhfZmFsbGJhY2srKzsKKwkJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZGlyKTsKKwl9CisjZW5kaWYKKwlibG9ja3MgPSBkaXItPmlfc2l6ZSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwlmb3IgKGJsb2NrID0gMCwgb2Zmc2V0ID0gMDsgYmxvY2sgPCBibG9ja3M7IGJsb2NrKyspIHsKKwkJYmggPSBleHQzX2JyZWFkKGhhbmRsZSwgZGlyLCBibG9jaywgMCwgJnJldHZhbCk7CisJCWlmKCFiaCkKKwkJCXJldHVybiByZXR2YWw7CisJCXJldHZhbCA9IGFkZF9kaXJlbnRfdG9fYnVmKGhhbmRsZSwgZGVudHJ5LCBpbm9kZSwgTlVMTCwgYmgpOworCQlpZiAocmV0dmFsICE9IC1FTk9TUEMpCisJCQlyZXR1cm4gcmV0dmFsOworCisjaWZkZWYgQ09ORklHX0VYVDNfSU5ERVgKKwkJaWYgKGJsb2NrcyA9PSAxICYmICFkeF9mYWxsYmFjayAmJgorCQkgICAgRVhUM19IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDNfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYKSkKKwkJCXJldHVybiBtYWtlX2luZGV4ZWRfZGlyKGhhbmRsZSwgZGVudHJ5LCBpbm9kZSwgYmgpOworI2VuZGlmCisJCWJyZWxzZShiaCk7CisJfQorCWJoID0gZXh0M19hcHBlbmQoaGFuZGxlLCBkaXIsICZibG9jaywgJnJldHZhbCk7CisJaWYgKCFiaCkKKwkJcmV0dXJuIHJldHZhbDsKKwlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSBiaC0+Yl9kYXRhOworCWRlLT5pbm9kZSA9IDA7CisJZGUtPnJlY19sZW4gPSBjcHVfdG9fbGUxNihybGVuID0gYmxvY2tzaXplKTsKKwlubGVuID0gMDsKKwlyZXR1cm4gYWRkX2RpcmVudF90b19idWYoaGFuZGxlLCBkZW50cnksIGlub2RlLCBkZSwgYmgpOworfQorCisjaWZkZWYgQ09ORklHX0VYVDNfSU5ERVgKKy8qCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgdmFsdWUKKyAqLworc3RhdGljIGludCBleHQzX2R4X2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGR4X2ZyYW1lIGZyYW1lc1syXSwgKmZyYW1lOworCXN0cnVjdCBkeF9lbnRyeSAqZW50cmllcywgKmF0OworCXN0cnVjdCBkeF9oYXNoX2luZm8gaGluZm87CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICpkZTsKKwlpbnQgZXJyOworCisJZnJhbWUgPSBkeF9wcm9iZShkZW50cnksIE5VTEwsICZoaW5mbywgZnJhbWVzLCAmZXJyKTsKKwlpZiAoIWZyYW1lKQorCQlyZXR1cm4gZXJyOworCWVudHJpZXMgPSBmcmFtZS0+ZW50cmllczsKKwlhdCA9IGZyYW1lLT5hdDsKKworCWlmICghKGJoID0gZXh0M19icmVhZChoYW5kbGUsZGlyLCBkeF9nZXRfYmxvY2soZnJhbWUtPmF0KSwgMCwgJmVycikpKQorCQlnb3RvIGNsZWFudXA7CisKKwlCVUZGRVJfVFJBQ0UoYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7CisJaWYgKGVycikKKwkJZ290byBqb3VybmFsX2Vycm9yOworCisJZXJyID0gYWRkX2RpcmVudF90b19idWYoaGFuZGxlLCBkZW50cnksIGlub2RlLCBOVUxMLCBiaCk7CisJaWYgKGVyciAhPSAtRU5PU1BDKSB7CisJCWJoID0gTlVMTDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIEJsb2NrIGZ1bGwsIHNob3VsZCBjb21wcmVzcyBidXQgZm9yIG5vdyBqdXN0IHNwbGl0ICovCisJZHh0cmFjZShwcmludGsoInVzaW5nICV1IG9mICV1IG5vZGUgZW50cmllc1xuIiwKKwkJICAgICAgIGR4X2dldF9jb3VudChlbnRyaWVzKSwgZHhfZ2V0X2xpbWl0KGVudHJpZXMpKSk7CisJLyogTmVlZCB0byBzcGxpdCBpbmRleD8gKi8KKwlpZiAoZHhfZ2V0X2NvdW50KGVudHJpZXMpID09IGR4X2dldF9saW1pdChlbnRyaWVzKSkgeworCQl1MzIgbmV3YmxvY2s7CisJCXVuc2lnbmVkIGljb3VudCA9IGR4X2dldF9jb3VudChlbnRyaWVzKTsKKwkJaW50IGxldmVscyA9IGZyYW1lIC0gZnJhbWVzOworCQlzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMyOworCQlzdHJ1Y3QgZHhfbm9kZSAqbm9kZTI7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgyOworCisJCWlmIChsZXZlbHMgJiYgKGR4X2dldF9jb3VudChmcmFtZXMtPmVudHJpZXMpID09CisJCQkgICAgICAgZHhfZ2V0X2xpbWl0KGZyYW1lcy0+ZW50cmllcykpKSB7CisJCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgICJEaXJlY3RvcnkgaW5kZXggZnVsbCFcbiIpOworCQkJZXJyID0gLUVOT1NQQzsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQliaDIgPSBleHQzX2FwcGVuZCAoaGFuZGxlLCBkaXIsICZuZXdibG9jaywgJmVycik7CisJCWlmICghKGJoMikpCisJCQlnb3RvIGNsZWFudXA7CisJCW5vZGUyID0gKHN0cnVjdCBkeF9ub2RlICopKGJoMi0+Yl9kYXRhKTsKKwkJZW50cmllczIgPSBub2RlMi0+ZW50cmllczsKKwkJbm9kZTItPmZha2UucmVjX2xlbiA9IGNwdV90b19sZTE2KHNiLT5zX2Jsb2Nrc2l6ZSk7CisJCW5vZGUyLT5mYWtlLmlub2RlID0gMDsKKwkJQlVGRkVSX1RSQUNFKGZyYW1lLT5iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBmcmFtZS0+YmgpOworCQlpZiAoZXJyKQorCQkJZ290byBqb3VybmFsX2Vycm9yOworCQlpZiAobGV2ZWxzKSB7CisJCQl1bnNpZ25lZCBpY291bnQxID0gaWNvdW50LzIsIGljb3VudDIgPSBpY291bnQgLSBpY291bnQxOworCQkJdW5zaWduZWQgaGFzaDIgPSBkeF9nZXRfaGFzaChlbnRyaWVzICsgaWNvdW50MSk7CisJCQlkeHRyYWNlKHByaW50aygiU3BsaXQgaW5kZXggJWkvJWlcbiIsIGljb3VudDEsIGljb3VudDIpKTsKKworCQkJQlVGRkVSX1RSQUNFKGZyYW1lLT5iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsgLyogaW5kZXggcm9vdCAqLworCQkJZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLAorCQkJCQkJCSAgICAgZnJhbWVzWzBdLmJoKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBqb3VybmFsX2Vycm9yOworCisJCQltZW1jcHkgKChjaGFyICopIGVudHJpZXMyLCAoY2hhciAqKSAoZW50cmllcyArIGljb3VudDEpLAorCQkJCWljb3VudDIgKiBzaXplb2Yoc3RydWN0IGR4X2VudHJ5KSk7CisJCQlkeF9zZXRfY291bnQgKGVudHJpZXMsIGljb3VudDEpOworCQkJZHhfc2V0X2NvdW50IChlbnRyaWVzMiwgaWNvdW50Mik7CisJCQlkeF9zZXRfbGltaXQgKGVudHJpZXMyLCBkeF9ub2RlX2xpbWl0KGRpcikpOworCisJCQkvKiBXaGljaCBpbmRleCBibG9jayBnZXRzIHRoZSBuZXcgZW50cnk/ICovCisJCQlpZiAoYXQgLSBlbnRyaWVzID49IGljb3VudDEpIHsKKwkJCQlmcmFtZS0+YXQgPSBhdCA9IGF0IC0gZW50cmllcyAtIGljb3VudDEgKyBlbnRyaWVzMjsKKwkJCQlmcmFtZS0+ZW50cmllcyA9IGVudHJpZXMgPSBlbnRyaWVzMjsKKwkJCQlzd2FwKGZyYW1lLT5iaCwgYmgyKTsKKwkJCX0KKwkJCWR4X2luc2VydF9ibG9jayAoZnJhbWVzICsgMCwgaGFzaDIsIG5ld2Jsb2NrKTsKKwkJCWR4dHJhY2UoZHhfc2hvd19pbmRleCAoIm5vZGUiLCBmcmFtZXNbMV0uZW50cmllcykpOworCQkJZHh0cmFjZShkeF9zaG93X2luZGV4ICgibm9kZSIsCisJCQkgICAgICAgKChzdHJ1Y3QgZHhfbm9kZSAqKSBiaDItPmJfZGF0YSktPmVudHJpZXMpKTsKKwkJCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoMik7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gam91cm5hbF9lcnJvcjsKKwkJCWJyZWxzZSAoYmgyKTsKKwkJfSBlbHNlIHsKKwkJCWR4dHJhY2UocHJpbnRrKCJDcmVhdGluZyBzZWNvbmQgbGV2ZWwgaW5kZXguLi5cbiIpKTsKKwkJCW1lbWNweSgoY2hhciAqKSBlbnRyaWVzMiwgKGNoYXIgKikgZW50cmllcywKKwkJCSAgICAgICBpY291bnQgKiBzaXplb2Yoc3RydWN0IGR4X2VudHJ5KSk7CisJCQlkeF9zZXRfbGltaXQoZW50cmllczIsIGR4X25vZGVfbGltaXQoZGlyKSk7CisKKwkJCS8qIFNldCB1cCByb290ICovCisJCQlkeF9zZXRfY291bnQoZW50cmllcywgMSk7CisJCQlkeF9zZXRfYmxvY2soZW50cmllcyArIDAsIG5ld2Jsb2NrKTsKKwkJCSgoc3RydWN0IGR4X3Jvb3QgKikgZnJhbWVzWzBdLmJoLT5iX2RhdGEpLT5pbmZvLmluZGlyZWN0X2xldmVscyA9IDE7CisKKwkJCS8qIEFkZCBuZXcgYWNjZXNzIHBhdGggZnJhbWUgKi8KKwkJCWZyYW1lID0gZnJhbWVzICsgMTsKKwkJCWZyYW1lLT5hdCA9IGF0ID0gYXQgLSBlbnRyaWVzICsgZW50cmllczI7CisJCQlmcmFtZS0+ZW50cmllcyA9IGVudHJpZXMgPSBlbnRyaWVzMjsKKwkJCWZyYW1lLT5iaCA9IGJoMjsKKwkJCWVyciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwKKwkJCQkJCQkgICAgIGZyYW1lLT5iaCk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gam91cm5hbF9lcnJvcjsKKwkJfQorCQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBmcmFtZXNbMF0uYmgpOworCX0KKwlkZSA9IGRvX3NwbGl0KGhhbmRsZSwgZGlyLCAmYmgsIGZyYW1lLCAmaGluZm8sICZlcnIpOworCWlmICghZGUpCisJCWdvdG8gY2xlYW51cDsKKwllcnIgPSBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGUsIGRlbnRyeSwgaW5vZGUsIGRlLCBiaCk7CisJYmggPSBOVUxMOworCWdvdG8gY2xlYW51cDsKKworam91cm5hbF9lcnJvcjoKKwlleHQzX3N0ZF9lcnJvcihkaXItPmlfc2IsIGVycik7CitjbGVhbnVwOgorCWlmIChiaCkKKwkJYnJlbHNlKGJoKTsKKwlkeF9yZWxlYXNlKGZyYW1lcyk7CisJcmV0dXJuIGVycjsKK30KKyNlbmRpZgorCisvKgorICogZXh0M19kZWxldGVfZW50cnkgZGVsZXRlcyBhIGRpcmVjdG9yeSBlbnRyeSBieSBtZXJnaW5nIGl0IHdpdGggdGhlCisgKiBwcmV2aW91cyBlbnRyeQorICovCitzdGF0aWMgaW50IGV4dDNfZGVsZXRlX2VudHJ5IChoYW5kbGVfdCAqaGFuZGxlLCAKKwkJCSAgICAgIHN0cnVjdCBpbm9kZSAqIGRpciwKKwkJCSAgICAgIHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICogZGVfZGVsLAorCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCit7CisJc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKiBkZSwgKiBwZGU7CisJaW50IGk7CisKKwlpID0gMDsKKwlwZGUgPSBOVUxMOworCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopIGJoLT5iX2RhdGE7CisJd2hpbGUgKGkgPCBiaC0+Yl9zaXplKSB7CisJCWlmICghZXh0M19jaGVja19kaXJfZW50cnkoImV4dDNfZGVsZXRlX2VudHJ5IiwgZGlyLCBkZSwgYmgsIGkpKQorCQkJcmV0dXJuIC1FSU87CisJCWlmIChkZSA9PSBkZV9kZWwpICB7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCQlleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwkJCWlmIChwZGUpCisJCQkJcGRlLT5yZWNfbGVuID0KKwkJCQkJY3B1X3RvX2xlMTYobGUxNl90b19jcHUocGRlLT5yZWNfbGVuKSArCisJCQkJCQkgICAgbGUxNl90b19jcHUoZGUtPnJlY19sZW4pKTsKKwkJCWVsc2UKKwkJCQlkZS0+aW5vZGUgPSAwOworCQkJZGlyLT5pX3ZlcnNpb24rKzsKKwkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJCQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpICs9IGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKTsKKwkJcGRlID0gZGU7CisJCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopCisJCQkoKGNoYXIgKikgZGUgKyBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbikpOworCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KKworLyoKKyAqIGV4dDNfbWFya19pbm9kZV9kaXJ0eSBpcyBzb21ld2hhdCBleHBlbnNpdmUsIHNvIHVubGlrZSBleHQyIHdlCisgKiBkbyBub3QgcGVyZm9ybSBpdCBpbiB0aGVzZSBmdW5jdGlvbnMuICBXZSBwZXJmb3JtIGl0IGF0IHRoZSBjYWxsIHNpdGUsCisgKiBpZiBpdCBpcyBuZWVkZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQzX2luY19jb3VudChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlub2RlLT5pX25saW5rKys7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQzX2RlY19jb3VudChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlub2RlLT5pX25saW5rLS07Cit9CisKK3N0YXRpYyBpbnQgZXh0M19hZGRfbm9uZGlyKGhhbmRsZV90ICpoYW5kbGUsCisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbnQgZXJyID0gZXh0M19hZGRfZW50cnkoaGFuZGxlLCBkZW50cnksIGlub2RlKTsKKwlpZiAoIWVycikgeworCQlleHQzX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJCXJldHVybiAwOworCX0KKwlleHQzX2RlY19jb3VudChoYW5kbGUsIGlub2RlKTsKKwlpcHV0KGlub2RlKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogQnkgdGhlIHRpbWUgdGhpcyBpcyBjYWxsZWQsIHdlIGFscmVhZHkgaGF2ZSBjcmVhdGVkCisgKiB0aGUgZGlyZWN0b3J5IGNhY2hlIGVudHJ5IGZvciB0aGUgbmV3IGZpbGUsIGJ1dCBpdAorICogaXMgc28gZmFyIG5lZ2F0aXZlIC0gaXQgaGFzIG5vIGlub2RlLgorICoKKyAqIElmIHRoZSBjcmVhdGUgc3VjY2VlZHMsIHdlIGZpbGwgaW4gdGhlIGlub2RlIGluZm9ybWF0aW9uCisgKiB3aXRoIGRfaW5zdGFudGlhdGUoKS4gCisgKi8KK3N0YXRpYyBpbnQgZXh0M19jcmVhdGUgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgaW50IG1vZGUsCisJCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWhhbmRsZV90ICpoYW5kbGU7IAorCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCWludCBlcnIsIHJldHJpZXMgPSAwOworCityZXRyeToKKwloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoZGlyLCBFWFQzX0RBVEFfVFJBTlNfQkxPQ0tTICsKKwkJCQkJRVhUM19JTkRFWF9FWFRSQV9UUkFOU19CTE9DS1MgKyAzICsKKwkJCQkJMipFWFQzX1FVT1RBX0lOSVRfQkxPQ0tTKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpCisJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CisKKwlpZiAoSVNfRElSU1lOQyhkaXIpKQorCQloYW5kbGUtPmhfc3luYyA9IDE7CisKKwlpbm9kZSA9IGV4dDNfbmV3X2lub2RlIChoYW5kbGUsIGRpciwgbW9kZSk7CisJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJaWYgKCFJU19FUlIoaW5vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJmV4dDNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmZXh0M19maWxlX29wZXJhdGlvbnM7CisJCWV4dDNfc2V0X2FvcHMoaW5vZGUpOworCQllcnIgPSBleHQzX2FkZF9ub25kaXIoaGFuZGxlLCBkZW50cnksIGlub2RlKTsKKwl9CisJZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlpZiAoZXJyID09IC1FTk9TUEMgJiYgZXh0M19zaG91bGRfcmV0cnlfYWxsb2MoZGlyLT5pX3NiLCAmcmV0cmllcykpCisJCWdvdG8gcmV0cnk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBleHQzX21rbm9kIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCWludCBtb2RlLCBkZXZfdCByZGV2KQoreworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgZXJyLCByZXRyaWVzID0gMDsKKworCWlmICghbmV3X3ZhbGlkX2RldihyZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKK3JldHJ5OgorCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChkaXIsIEVYVDNfREFUQV9UUkFOU19CTE9DS1MgKworCQkJIAkJRVhUM19JTkRFWF9FWFRSQV9UUkFOU19CTE9DS1MgKyAzICsKKwkJCQkJMipFWFQzX1FVT1RBX0lOSVRfQkxPQ0tTKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpCisJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CisKKwlpZiAoSVNfRElSU1lOQyhkaXIpKQorCQloYW5kbGUtPmhfc3luYyA9IDE7CisKKwlpbm9kZSA9IGV4dDNfbmV3X2lub2RlIChoYW5kbGUsIGRpciwgbW9kZSk7CisJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJaWYgKCFJU19FUlIoaW5vZGUpKSB7CisJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgcmRldik7CisjaWZkZWYgQ09ORklHX0VYVDNfRlNfWEFUVFIKKwkJaW5vZGUtPmlfb3AgPSAmZXh0M19zcGVjaWFsX2lub2RlX29wZXJhdGlvbnM7CisjZW5kaWYKKwkJZXJyID0gZXh0M19hZGRfbm9uZGlyKGhhbmRsZSwgZGVudHJ5LCBpbm9kZSk7CisJfQorCWV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKGVyciA9PSAtRU5PU1BDICYmIGV4dDNfc2hvdWxkX3JldHJ5X2FsbG9jKGRpci0+aV9zYiwgJnJldHJpZXMpKQorCQlnb3RvIHJldHJ5OworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19ta2RpcihzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGludCBtb2RlKQoreworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogZGlyX2Jsb2NrOworCXN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICogZGU7CisJaW50IGVyciwgcmV0cmllcyA9IDA7CisKKwlpZiAoZGlyLT5pX25saW5rID49IEVYVDNfTElOS19NQVgpCisJCXJldHVybiAtRU1MSU5LOworCityZXRyeToKKwloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoZGlyLCBFWFQzX0RBVEFfVFJBTlNfQkxPQ0tTICsKKwkJCQkJRVhUM19JTkRFWF9FWFRSQV9UUkFOU19CTE9DS1MgKyAzICsKKwkJCQkJMipFWFQzX1FVT1RBX0lOSVRfQkxPQ0tTKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpCisJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CisKKwlpZiAoSVNfRElSU1lOQyhkaXIpKQorCQloYW5kbGUtPmhfc3luYyA9IDE7CisKKwlpbm9kZSA9IGV4dDNfbmV3X2lub2RlIChoYW5kbGUsIGRpciwgU19JRkRJUiB8IG1vZGUpOworCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCWlmIChJU19FUlIoaW5vZGUpKQorCQlnb3RvIG91dF9zdG9wOworCisJaW5vZGUtPmlfb3AgPSAmZXh0M19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9mb3AgPSAmZXh0M19kaXJfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9zaXplID0gRVhUM19JKGlub2RlKS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlkaXJfYmxvY2sgPSBleHQzX2JyZWFkIChoYW5kbGUsIGlub2RlLCAwLCAxLCAmZXJyKTsKKwlpZiAoIWRpcl9ibG9jaykgeworCQlpbm9kZS0+aV9ubGluay0tOyAvKiBpcyB0aGlzIG5saW5rID09IDA/ICovCisJCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwkJaXB1dCAoaW5vZGUpOworCQlnb3RvIG91dF9zdG9wOworCX0KKwlCVUZGRVJfVFJBQ0UoZGlyX2Jsb2NrLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOworCWV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZGlyX2Jsb2NrKTsKKwlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSBkaXJfYmxvY2stPmJfZGF0YTsKKwlkZS0+aW5vZGUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9pbm8pOworCWRlLT5uYW1lX2xlbiA9IDE7CisJZGUtPnJlY19sZW4gPSBjcHVfdG9fbGUxNihFWFQzX0RJUl9SRUNfTEVOKGRlLT5uYW1lX2xlbikpOworCXN0cmNweSAoZGUtPm5hbWUsICIuIik7CisJZXh0M19zZXRfZGVfdHlwZShkaXItPmlfc2IsIGRlLCBTX0lGRElSKTsKKwlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKQorCQkJKChjaGFyICopIGRlICsgbGUxNl90b19jcHUoZGUtPnJlY19sZW4pKTsKKwlkZS0+aW5vZGUgPSBjcHVfdG9fbGUzMihkaXItPmlfaW5vKTsKKwlkZS0+cmVjX2xlbiA9IGNwdV90b19sZTE2KGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZS1FWFQzX0RJUl9SRUNfTEVOKDEpKTsKKwlkZS0+bmFtZV9sZW4gPSAyOworCXN0cmNweSAoZGUtPm5hbWUsICIuLiIpOworCWV4dDNfc2V0X2RlX3R5cGUoZGlyLT5pX3NiLCBkZSwgU19JRkRJUik7CisJaW5vZGUtPmlfbmxpbmsgPSAyOworCUJVRkZFUl9UUkFDRShkaXJfYmxvY2ssICJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpcl9ibG9jayk7CisJYnJlbHNlIChkaXJfYmxvY2spOworCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwllcnIgPSBleHQzX2FkZF9lbnRyeSAoaGFuZGxlLCBkZW50cnksIGlub2RlKTsKKwlpZiAoZXJyKSB7CisJCWlub2RlLT5pX25saW5rID0gMDsKKwkJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCQlpcHV0IChpbm9kZSk7CisJCWdvdG8gb3V0X3N0b3A7CisJfQorCWRpci0+aV9ubGluaysrOworCWV4dDNfdXBkYXRlX2R4X2ZsYWcoZGlyKTsKKwlleHQzX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBkaXIpOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CitvdXRfc3RvcDoKKwlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmIChlcnIgPT0gLUVOT1NQQyAmJiBleHQzX3Nob3VsZF9yZXRyeV9hbGxvYyhkaXItPmlfc2IsICZyZXRyaWVzKSkKKwkJZ290byByZXRyeTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogcm91dGluZSB0byBjaGVjayB0aGF0IHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGlzIGVtcHR5IChmb3Igcm1kaXIpCisgKi8KK3N0YXRpYyBpbnQgZW1wdHlfZGlyIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqIGRlLCAqIGRlMTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwlpbnQgZXJyID0gMDsKKworCXNiID0gaW5vZGUtPmlfc2I7CisJaWYgKGlub2RlLT5pX3NpemUgPCBFWFQzX0RJUl9SRUNfTEVOKDEpICsgRVhUM19ESVJfUkVDX0xFTigyKSB8fAorCSAgICAhKGJoID0gZXh0M19icmVhZCAoTlVMTCwgaW5vZGUsIDAsIDAsICZlcnIpKSkgeworCQlpZiAoZXJyKQorCQkJZXh0M19lcnJvcihpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJCSAgICJlcnJvciAlZCByZWFkaW5nIGRpcmVjdG9yeSAjJWx1IG9mZnNldCAwIiwKKwkJCQkgICBlcnIsIGlub2RlLT5pX2lubyk7CisJCWVsc2UKKwkJCWV4dDNfd2FybmluZyhpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJCSAgICAgImJhZCBkaXJlY3RvcnkgKGRpciAjJWx1KSAtIG5vIGRhdGEgYmxvY2siLAorCQkJCSAgICAgaW5vZGUtPmlfaW5vKTsKKwkJcmV0dXJuIDE7CisJfQorCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopIGJoLT5iX2RhdGE7CisJZGUxID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopCisJCQkoKGNoYXIgKikgZGUgKyBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbikpOworCWlmIChsZTMyX3RvX2NwdShkZS0+aW5vZGUpICE9IGlub2RlLT5pX2lubyB8fAorCQkJIWxlMzJfdG9fY3B1KGRlMS0+aW5vZGUpIHx8IAorCQkJc3RyY21wICgiLiIsIGRlLT5uYW1lKSB8fAorCQkJc3RyY21wICgiLi4iLCBkZTEtPm5hbWUpKSB7CisJICAgIAlleHQzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiZW1wdHlfZGlyIiwKKwkJCSAgICAgICJiYWQgZGlyZWN0b3J5IChkaXIgIyVsdSkgLSBubyBgLicgb3IgYC4uJyIsCisJCQkgICAgICBpbm9kZS0+aV9pbm8pOworCQlicmVsc2UgKGJoKTsKKwkJcmV0dXJuIDE7CisJfQorCW9mZnNldCA9IGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKSArIGxlMTZfdG9fY3B1KGRlMS0+cmVjX2xlbik7CisJZGUgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikKKwkJCSgoY2hhciAqKSBkZTEgKyBsZTE2X3RvX2NwdShkZTEtPnJlY19sZW4pKTsKKwl3aGlsZSAob2Zmc2V0IDwgaW5vZGUtPmlfc2l6ZSApIHsKKwkJaWYgKCFiaCB8fAorCQkJKHZvaWQgKikgZGUgPj0gKHZvaWQgKikgKGJoLT5iX2RhdGErc2ItPnNfYmxvY2tzaXplKSkgeworCQkJZXJyID0gMDsKKwkJCWJyZWxzZSAoYmgpOworCQkJYmggPSBleHQzX2JyZWFkIChOVUxMLCBpbm9kZSwKKwkJCQlvZmZzZXQgPj4gRVhUM19CTE9DS19TSVpFX0JJVFMoc2IpLCAwLCAmZXJyKTsKKwkJCWlmICghYmgpIHsKKwkJCQlpZiAoZXJyKQorCQkJCQlleHQzX2Vycm9yKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkJCQkgICAiZXJyb3IgJWQgcmVhZGluZyBkaXJlY3RvcnkiCisJCQkJCQkgICAiICMlbHUgb2Zmc2V0ICVsdSIsCisJCQkJCQkgICBlcnIsIGlub2RlLT5pX2lubywgb2Zmc2V0KTsKKwkJCQlvZmZzZXQgKz0gc2ItPnNfYmxvY2tzaXplOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZGUgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikgYmgtPmJfZGF0YTsKKwkJfQorCQlpZiAoIWV4dDNfY2hlY2tfZGlyX2VudHJ5KCJlbXB0eV9kaXIiLCBpbm9kZSwgZGUsIGJoLCBvZmZzZXQpKSB7CisJCQlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKShiaC0+Yl9kYXRhICsKKwkJCQkJCQkgc2ItPnNfYmxvY2tzaXplKTsKKwkJCW9mZnNldCA9IChvZmZzZXQgfCAoc2ItPnNfYmxvY2tzaXplIC0gMSkpICsgMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChsZTMyX3RvX2NwdShkZS0+aW5vZGUpKSB7CisJCQlicmVsc2UgKGJoKTsKKwkJCXJldHVybiAwOworCQl9CisJCW9mZnNldCArPSBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbik7CisJCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopCisJCQkJKChjaGFyICopIGRlICsgbGUxNl90b19jcHUoZGUtPnJlY19sZW4pKTsKKwl9CisJYnJlbHNlIChiaCk7CisJcmV0dXJuIDE7Cit9CisKKy8qIGV4dDNfb3JwaGFuX2FkZCgpIGxpbmtzIGFuIHVubGlua2VkIG9yIHRydW5jYXRlZCBpbm9kZSBpbnRvIGEgbGlzdCBvZgorICogc3VjaCBpbm9kZXMsIHN0YXJ0aW5nIGF0IHRoZSBzdXBlcmJsb2NrLCBpbiBjYXNlIHdlIGNyYXNoIGJlZm9yZSB0aGUKKyAqIGZpbGUgaXMgY2xvc2VkL2RlbGV0ZWQsIG9yIGluIGNhc2UgdGhlIGlub2RlIHRydW5jYXRlIHNwYW5zIG11bHRpcGxlCisgKiB0cmFuc2FjdGlvbnMgYW5kIHRoZSBsYXN0IHRyYW5zYWN0aW9uIGlzIG5vdCByZWNvdmVyZWQgYWZ0ZXIgYSBjcmFzaC4KKyAqCisgKiBBdCBmaWxlc3lzdGVtIHJlY292ZXJ5IHRpbWUsIHdlIHdhbGsgdGhpcyBsaXN0IGRlbGV0aW5nIHVubGlua2VkCisgKiBpbm9kZXMgYW5kIHRydW5jYXRpbmcgbGlua2VkIGlub2RlcyBpbiBleHQzX29ycGhhbl9jbGVhbnVwKCkuCisgKi8KK2ludCBleHQzX29ycGhhbl9hZGQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworCWludCBlcnIgPSAwLCByYzsKKworCWxvY2tfc3VwZXIoc2IpOworCWlmICghbGlzdF9lbXB0eSgmRVhUM19JKGlub2RlKS0+aV9vcnBoYW4pKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwkvKiBPcnBoYW4gaGFuZGxpbmcgaXMgb25seSB2YWxpZCBmb3IgZmlsZXMgd2l0aCBkYXRhIGJsb2NrcworCSAqIGJlaW5nIHRydW5jYXRlZCwgb3IgZmlsZXMgYmVpbmcgdW5saW5rZWQuICovCisKKwkvKiBAQEAgRklYTUU6IE9ic2VydmF0aW9uIGZyb20gYXZpcm86CisJICogSSB0aGluayBJIGNhbiB0cmlnZ2VyIEpfQVNTRVJUIGluIGV4dDNfb3JwaGFuX2FkZCgpLiAgV2UgYmxvY2sgCisJICogaGVyZSAob24gbG9ja19zdXBlcigpKSwgc28gcmFjZSB3aXRoIGV4dDNfbGluaygpIHdoaWNoIG1pZ2h0IGJ1bXAKKwkgKiAtPmlfbmxpbmsuIEZvciwgc2F5IGl0LCBjaGFyYWN0ZXIgZGV2aWNlLiBOb3QgYSByZWd1bGFyIGZpbGUsCisJICogbm90IGEgZGlyZWN0b3J5LCBub3QgYSBzeW1saW5rIGFuZCAtPmlfbmxpbmsgPiAwLgorCSAqLworCUpfQVNTRVJUICgoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8CisJCVNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHx8IGlub2RlLT5pX25saW5rID09IDApOworCisJQlVGRkVSX1RSQUNFKEVYVDNfU0Ioc2IpLT5zX3NiaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIEVYVDNfU0Ioc2IpLT5zX3NiaCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5sb2NrOworCisJZXJyID0gZXh0M19yZXNlcnZlX2lub2RlX3dyaXRlKGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwkvKiBJbnNlcnQgdGhpcyBpbm9kZSBhdCB0aGUgaGVhZCBvZiB0aGUgb24tZGlzayBvcnBoYW4gbGlzdC4uLiAqLworCU5FWFRfT1JQSEFOKGlub2RlKSA9IGxlMzJfdG9fY3B1KEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2xhc3Rfb3JwaGFuKTsKKwlFWFQzX1NCKHNiKS0+c19lcy0+c19sYXN0X29ycGhhbiA9IGNwdV90b19sZTMyKGlub2RlLT5pX2lubyk7CisJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUM19TQihzYiktPnNfc2JoKTsKKwlyYyA9IGV4dDNfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKKwlpZiAoIWVycikKKwkJZXJyID0gcmM7CisKKwkvKiBPbmx5IGFkZCB0byB0aGUgaGVhZCBvZiB0aGUgaW4tbWVtb3J5IGxpc3QgaWYgYWxsIHRoZQorCSAqIHByZXZpb3VzIG9wZXJhdGlvbnMgc3VjY2VlZGVkLiAgSWYgdGhlIG9ycGhhbl9hZGQgaXMgZ29pbmcgdG8KKwkgKiBmYWlsIChwb3NzaWJseSB0YWtpbmcgdGhlIGpvdXJuYWwgb2ZmbGluZSksIHdlIGNhbid0IHJpc2sKKwkgKiBsZWF2aW5nIHRoZSBpbm9kZSBvbiB0aGUgb3JwaGFuIGxpc3Q6IHN0cmF5IG9ycGhhbi1saXN0CisJICogZW50cmllcyBjYW4gY2F1c2UgcGFuaWNzIGF0IHVubW91bnQgdGltZS4KKwkgKgorCSAqIFRoaXMgaXMgc2FmZTogb24gZXJyb3Igd2UncmUgZ29pbmcgdG8gaWdub3JlIHRoZSBvcnBoYW4gbGlzdAorCSAqIGFueXdheSBvbiB0aGUgbmV4dCByZWNvdmVyeS4gKi8KKwlpZiAoIWVycikKKwkJbGlzdF9hZGQoJkVYVDNfSShpbm9kZSktPmlfb3JwaGFuLCAmRVhUM19TQihzYiktPnNfb3JwaGFuKTsKKworCWpiZF9kZWJ1Zyg0LCAic3VwZXJibG9jayB3aWxsIHBvaW50IHRvICVsZFxuIiwgaW5vZGUtPmlfaW5vKTsKKwlqYmRfZGVidWcoNCwgIm9ycGhhbiBpbm9kZSAlbGQgd2lsbCBwb2ludCB0byAlZFxuIiwKKwkJCWlub2RlLT5pX2lubywgTkVYVF9PUlBIQU4oaW5vZGUpKTsKK291dF91bmxvY2s6CisJdW5sb2NrX3N1cGVyKHNiKTsKKwlleHQzX3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogZXh0M19vcnBoYW5fZGVsKCkgcmVtb3ZlcyBhbiB1bmxpbmtlZCBvciB0cnVuY2F0ZWQgaW5vZGUgZnJvbSB0aGUgbGlzdAorICogb2Ygc3VjaCBpbm9kZXMgc3RvcmVkIG9uIGRpc2ssIGJlY2F1c2UgaXQgaXMgZmluYWxseSBiZWluZyBjbGVhbmVkIHVwLgorICovCitpbnQgZXh0M19vcnBoYW5fZGVsKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcHJldjsKKwlzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvICplaSA9IEVYVDNfSShpbm9kZSk7CisJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpOworCXVuc2lnbmVkIGxvbmcgaW5vX25leHQ7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworCWludCBlcnIgPSAwOworCisJbG9ja19zdXBlcihpbm9kZS0+aV9zYik7CisJaWYgKGxpc3RfZW1wdHkoJmVpLT5pX29ycGhhbikpIHsKKwkJdW5sb2NrX3N1cGVyKGlub2RlLT5pX3NiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW5vX25leHQgPSBORVhUX09SUEhBTihpbm9kZSk7CisJcHJldiA9IGVpLT5pX29ycGhhbi5wcmV2OworCXNiaSA9IEVYVDNfU0IoaW5vZGUtPmlfc2IpOworCisJamJkX2RlYnVnKDQsICJyZW1vdmUgaW5vZGUgJWx1IGZyb20gb3JwaGFuIGxpc3RcbiIsIGlub2RlLT5pX2lubyk7CisKKwlsaXN0X2RlbF9pbml0KCZlaS0+aV9vcnBoYW4pOworCisJLyogSWYgd2UncmUgb24gYW4gZXJyb3IgcGF0aCwgd2UgbWF5IG5vdCBoYXZlIGEgdmFsaWQKKwkgKiB0cmFuc2FjdGlvbiBoYW5kbGUgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIG9ycGhhbiBsaXN0IG9uCisJICogZGlzaywgYnV0IHdlIHN0aWxsIG5lZWQgdG8gcmVtb3ZlIHRoZSBpbm9kZSBmcm9tIHRoZSBsaW5rZWQKKwkgKiBsaXN0IGluIG1lbW9yeS4gKi8KKwlpZiAoIWhhbmRsZSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBleHQzX3Jlc2VydmVfaW5vZGVfd3JpdGUoaGFuZGxlLCBpbm9kZSwgJmlsb2MpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2VycjsKKworCWlmIChwcmV2ID09ICZzYmktPnNfb3JwaGFuKSB7CisJCWpiZF9kZWJ1Zyg0LCAic3VwZXJibG9jayB3aWxsIHBvaW50IHRvICVsdVxuIiwgaW5vX25leHQpOworCQlCVUZGRVJfVFJBQ0Uoc2JpLT5zX3NiaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBzYmktPnNfc2JoKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2JyZWxzZTsKKwkJc2JpLT5zX2VzLT5zX2xhc3Rfb3JwaGFuID0gY3B1X3RvX2xlMzIoaW5vX25leHQpOworCQllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBzYmktPnNfc2JoKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZXh0M19pbG9jIGlsb2MyOworCQlzdHJ1Y3QgaW5vZGUgKmlfcHJldiA9CisJCQkmbGlzdF9lbnRyeShwcmV2LCBzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvLCBpX29ycGhhbiktPnZmc19pbm9kZTsKKworCQlqYmRfZGVidWcoNCwgIm9ycGhhbiBpbm9kZSAlbHUgd2lsbCBwb2ludCB0byAlbHVcbiIsCisJCQkgIGlfcHJldi0+aV9pbm8sIGlub19uZXh0KTsKKwkJZXJyID0gZXh0M19yZXNlcnZlX2lub2RlX3dyaXRlKGhhbmRsZSwgaV9wcmV2LCAmaWxvYzIpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfYnJlbHNlOworCQlORVhUX09SUEhBTihpX3ByZXYpID0gaW5vX25leHQ7CisJCWVyciA9IGV4dDNfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaV9wcmV2LCAmaWxvYzIpOworCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dF9icmVsc2U7CisJTkVYVF9PUlBIQU4oaW5vZGUpID0gMDsKKwllcnIgPSBleHQzX21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CisKK291dF9lcnI6CisJZXh0M19zdGRfZXJyb3IoaW5vZGUtPmlfc2IsIGVycik7CitvdXQ6CisJdW5sb2NrX3N1cGVyKGlub2RlLT5pX3NiKTsKKwlyZXR1cm4gZXJyOworCitvdXRfYnJlbHNlOgorCWJyZWxzZShpbG9jLmJoKTsKKwlnb3RvIG91dF9lcnI7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19ybWRpciAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqIGRlOworCWhhbmRsZV90ICpoYW5kbGU7CisKKwkvKiBJbml0aWFsaXplIHF1b3RhcyBiZWZvcmUgc28gdGhhdCBldmVudHVhbCB3cml0ZXMgZ28gaW4KKwkgKiBzZXBhcmF0ZSB0cmFuc2FjdGlvbiAqLworCURRVU9UX0lOSVQoZGVudHJ5LT5kX2lub2RlKTsKKwloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoZGlyLCBFWFQzX0RFTEVURV9UUkFOU19CTE9DS1MpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKworCXJldHZhbCA9IC1FTk9FTlQ7CisJYmggPSBleHQzX2ZpbmRfZW50cnkgKGRlbnRyeSwgJmRlKTsKKwlpZiAoIWJoKQorCQlnb3RvIGVuZF9ybWRpcjsKKworCWlmIChJU19ESVJTWU5DKGRpcikpCisJCWhhbmRsZS0+aF9zeW5jID0gMTsKKworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJcmV0dmFsID0gLUVJTzsKKwlpZiAobGUzMl90b19jcHUoZGUtPmlub2RlKSAhPSBpbm9kZS0+aV9pbm8pCisJCWdvdG8gZW5kX3JtZGlyOworCisJcmV0dmFsID0gLUVOT1RFTVBUWTsKKwlpZiAoIWVtcHR5X2RpciAoaW5vZGUpKQorCQlnb3RvIGVuZF9ybWRpcjsKKworCXJldHZhbCA9IGV4dDNfZGVsZXRlX2VudHJ5KGhhbmRsZSwgZGlyLCBkZSwgYmgpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZW5kX3JtZGlyOworCWlmIChpbm9kZS0+aV9ubGluayAhPSAyKQorCQlleHQzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiZXh0M19ybWRpciIsCisJCQkgICAgICAiZW1wdHkgZGlyZWN0b3J5IGhhcyBubGluayE9MiAoJWQpIiwKKwkJCSAgICAgIGlub2RlLT5pX25saW5rKTsKKwlpbm9kZS0+aV92ZXJzaW9uKys7CisJaW5vZGUtPmlfbmxpbmsgPSAwOworCS8qIFRoZXJlJ3Mgbm8gbmVlZCB0byBzZXQgaV9kaXNrc2l6ZTogdGhlIGZhY3QgdGhhdCBpX25saW5rIGlzCisJICogemVybyB3aWxsIGVuc3VyZSB0aGF0IHRoZSByaWdodCB0aGluZyBoYXBwZW5zIGR1cmluZyBhbnkKKwkgKiByZWNvdmVyeS4gKi8KKwlpbm9kZS0+aV9zaXplID0gMDsKKwlleHQzX29ycGhhbl9hZGQoaGFuZGxlLCBpbm9kZSk7CisJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWUgPSBkaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwlkaXItPmlfbmxpbmstLTsKKwlleHQzX3VwZGF0ZV9keF9mbGFnKGRpcik7CisJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZGlyKTsKKworZW5kX3JtZGlyOgorCWV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJYnJlbHNlIChiaCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBleHQzX3VubGluayhzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICogZGU7CisJaGFuZGxlX3QgKmhhbmRsZTsKKworCS8qIEluaXRpYWxpemUgcXVvdGFzIGJlZm9yZSBzbyB0aGF0IGV2ZW50dWFsIHdyaXRlcyBnbworCSAqIGluIHNlcGFyYXRlIHRyYW5zYWN0aW9uICovCisJRFFVT1RfSU5JVChkZW50cnktPmRfaW5vZGUpOworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChkaXIsIEVYVDNfREVMRVRFX1RSQU5TX0JMT0NLUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCisJaWYgKElTX0RJUlNZTkMoZGlyKSkKKwkJaGFuZGxlLT5oX3N5bmMgPSAxOworCisJcmV0dmFsID0gLUVOT0VOVDsKKwliaCA9IGV4dDNfZmluZF9lbnRyeSAoZGVudHJ5LCAmZGUpOworCWlmICghYmgpCisJCWdvdG8gZW5kX3VubGluazsKKworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJcmV0dmFsID0gLUVJTzsKKwlpZiAobGUzMl90b19jcHUoZGUtPmlub2RlKSAhPSBpbm9kZS0+aV9pbm8pCisJCWdvdG8gZW5kX3VubGluazsKKworCWlmICghaW5vZGUtPmlfbmxpbmspIHsKKwkJZXh0M193YXJuaW5nIChpbm9kZS0+aV9zYiwgImV4dDNfdW5saW5rIiwKKwkJCSAgICAgICJEZWxldGluZyBub25leGlzdGVudCBmaWxlICglbHUpLCAlZCIsCisJCQkgICAgICBpbm9kZS0+aV9pbm8sIGlub2RlLT5pX25saW5rKTsKKwkJaW5vZGUtPmlfbmxpbmsgPSAxOworCX0KKwlyZXR2YWwgPSBleHQzX2RlbGV0ZV9lbnRyeShoYW5kbGUsIGRpciwgZGUsIGJoKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVuZF91bmxpbms7CisJZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlleHQzX3VwZGF0ZV9keF9mbGFnKGRpcik7CisJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZGlyKTsKKwlpbm9kZS0+aV9ubGluay0tOworCWlmICghaW5vZGUtPmlfbmxpbmspCisJCWV4dDNfb3JwaGFuX2FkZChoYW5kbGUsIGlub2RlKTsKKwlpbm9kZS0+aV9jdGltZSA9IGRpci0+aV9jdGltZTsKKwlleHQzX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJcmV0dmFsID0gMDsKKworZW5kX3VubGluazoKKwlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWJyZWxzZSAoYmgpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19zeW1saW5rIChzdHJ1Y3QgaW5vZGUgKiBkaXIsCisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqIHN5bW5hbWUpCit7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlpbnQgbCwgZXJyLCByZXRyaWVzID0gMDsKKworCWwgPSBzdHJsZW4oc3ltbmFtZSkrMTsKKwlpZiAobCA+IGRpci0+aV9zYi0+c19ibG9ja3NpemUpCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCityZXRyeToKKwloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoZGlyLCBFWFQzX0RBVEFfVFJBTlNfQkxPQ0tTICsKKwkJCSAJCUVYVDNfSU5ERVhfRVhUUkFfVFJBTlNfQkxPQ0tTICsgNSArCisJCQkJCTIqRVhUM19RVU9UQV9JTklUX0JMT0NLUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCisJaWYgKElTX0RJUlNZTkMoZGlyKSkKKwkJaGFuZGxlLT5oX3N5bmMgPSAxOworCisJaW5vZGUgPSBleHQzX25ld19pbm9kZSAoaGFuZGxlLCBkaXIsIFNfSUZMTkt8U19JUldYVUdPKTsKKwllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJZ290byBvdXRfc3RvcDsKKworCWlmIChsID4gc2l6ZW9mIChFWFQzX0koaW5vZGUpLT5pX2RhdGEpKSB7CisJCWlub2RlLT5pX29wID0gJmV4dDNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQlleHQzX3NldF9hb3BzKGlub2RlKTsKKwkJLyoKKwkJICogcGFnZV9zeW1saW5rKCkgY2FsbHMgaW50byBleHQzX3ByZXBhcmUvY29tbWl0X3dyaXRlLgorCQkgKiBXZSBoYXZlIGEgdHJhbnNhY3Rpb24gb3Blbi4gIEFsbCBpcyBzd2VldG5lc3MuICBJdCBhbHNvIHNldHMKKwkJICogaV9zaXplIGluIGdlbmVyaWNfY29tbWl0X3dyaXRlKCkuCisJCSAqLworCQllcnIgPSBwYWdlX3N5bWxpbmsoaW5vZGUsIHN5bW5hbWUsIGwpOworCQlpZiAoZXJyKSB7CisJCQlleHQzX2RlY19jb3VudChoYW5kbGUsIGlub2RlKTsKKwkJCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwkJCWlwdXQgKGlub2RlKTsKKwkJCWdvdG8gb3V0X3N0b3A7CisJCX0KKwl9IGVsc2UgeworCQlpbm9kZS0+aV9vcCA9ICZleHQzX2Zhc3Rfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQltZW1jcHkoKGNoYXIqKSZFWFQzX0koaW5vZGUpLT5pX2RhdGEsc3ltbmFtZSxsKTsKKwkJaW5vZGUtPmlfc2l6ZSA9IGwtMTsKKwl9CisJRVhUM19JKGlub2RlKS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJZXJyID0gZXh0M19hZGRfbm9uZGlyKGhhbmRsZSwgZGVudHJ5LCBpbm9kZSk7CitvdXRfc3RvcDoKKwlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmIChlcnIgPT0gLUVOT1NQQyAmJiBleHQzX3Nob3VsZF9yZXRyeV9hbGxvYyhkaXItPmlfc2IsICZyZXRyaWVzKSkKKwkJZ290byByZXRyeTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGV4dDNfbGluayAoc3RydWN0IGRlbnRyeSAqIG9sZF9kZW50cnksCisJCXN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisJaW50IGVyciwgcmV0cmllcyA9IDA7CisKKwlpZiAoaW5vZGUtPmlfbmxpbmsgPj0gRVhUM19MSU5LX01BWCkKKwkJcmV0dXJuIC1FTUxJTks7CisKK3JldHJ5OgorCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChkaXIsIEVYVDNfREFUQV9UUkFOU19CTE9DS1MgKworCQkJCQlFWFQzX0lOREVYX0VYVFJBX1RSQU5TX0JMT0NLUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCisJaWYgKElTX0RJUlNZTkMoZGlyKSkKKwkJaGFuZGxlLT5oX3N5bmMgPSAxOworCisJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWV4dDNfaW5jX2NvdW50KGhhbmRsZSwgaW5vZGUpOworCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKKworCWVyciA9IGV4dDNfYWRkX25vbmRpcihoYW5kbGUsIGRlbnRyeSwgaW5vZGUpOworCWV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKGVyciA9PSAtRU5PU1BDICYmIGV4dDNfc2hvdWxkX3JldHJ5X2FsbG9jKGRpci0+aV9zYiwgJnJldHJpZXMpKQorCQlnb3RvIHJldHJ5OworCXJldHVybiBlcnI7Cit9CisKKyNkZWZpbmUgUEFSRU5UX0lOTyhidWZmZXIpIFwKKwkoKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopICgoY2hhciAqKSBidWZmZXIgKyBcCisJbGUxNl90b19jcHUoKChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSBidWZmZXIpLT5yZWNfbGVuKSkpLT5pbm9kZQorCisvKgorICogQW55Ym9keSBjYW4gcmVuYW1lIGFueXRoaW5nIHdpdGggdGhpczogdGhlIHBlcm1pc3Npb24gY2hlY2tzIGFyZSBsZWZ0IHRvIHRoZQorICogaGlnaGVyLWxldmVsIHJvdXRpbmVzLgorICovCitzdGF0aWMgaW50IGV4dDNfcmVuYW1lIChzdHJ1Y3QgaW5vZGUgKiBvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorCQkJICAgc3RydWN0IGlub2RlICogbmV3X2RpcixzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQoreworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IGlub2RlICogb2xkX2lub2RlLCAqIG5ld19pbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBvbGRfYmgsICogbmV3X2JoLCAqIGRpcl9iaDsKKwlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqIG9sZF9kZSwgKiBuZXdfZGU7CisJaW50IHJldHZhbDsKKworCW9sZF9iaCA9IG5ld19iaCA9IGRpcl9iaCA9IE5VTEw7CisKKwkvKiBJbml0aWFsaXplIHF1b3RhcyBiZWZvcmUgc28gdGhhdCBldmVudHVhbCB3cml0ZXMgZ28KKwkgKiBpbiBzZXBhcmF0ZSB0cmFuc2FjdGlvbiAqLworCWlmIChuZXdfZGVudHJ5LT5kX2lub2RlKQorCQlEUVVPVF9JTklUKG5ld19kZW50cnktPmRfaW5vZGUpOworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChvbGRfZGlyLCAyICogRVhUM19EQVRBX1RSQU5TX0JMT0NLUyArCisJCQkgCQlFWFQzX0lOREVYX0VYVFJBX1RSQU5TX0JMT0NLUyArIDIpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKworCWlmIChJU19ESVJTWU5DKG9sZF9kaXIpIHx8IElTX0RJUlNZTkMobmV3X2RpcikpCisJCWhhbmRsZS0+aF9zeW5jID0gMTsKKworCW9sZF9iaCA9IGV4dDNfZmluZF9lbnRyeSAob2xkX2RlbnRyeSwgJm9sZF9kZSk7CisJLyoKKwkgKiAgQ2hlY2sgZm9yIGlub2RlIG51bWJlciBpcyBfbm90XyBkdWUgdG8gcG9zc2libGUgSU8gZXJyb3JzLgorCSAqICBXZSBtaWdodCBybWRpciB0aGUgc291cmNlLCBrZWVwIGl0IGFzIHB3ZCBvZiBzb21lIHByb2Nlc3MKKwkgKiAgYW5kIG1lcnJpbHkga2lsbCB0aGUgbGluayB0byB3aGF0ZXZlciB3YXMgY3JlYXRlZCB1bmRlciB0aGUKKwkgKiAgc2FtZSBuYW1lLiBHb29kYnllIHN0aWNreSBiaXQgOy08CisJICovCisJb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKwlyZXR2YWwgPSAtRU5PRU5UOworCWlmICghb2xkX2JoIHx8IGxlMzJfdG9fY3B1KG9sZF9kZS0+aW5vZGUpICE9IG9sZF9pbm9kZS0+aV9pbm8pCisJCWdvdG8gZW5kX3JlbmFtZTsKKworCW5ld19pbm9kZSA9IG5ld19kZW50cnktPmRfaW5vZGU7CisJbmV3X2JoID0gZXh0M19maW5kX2VudHJ5IChuZXdfZGVudHJ5LCAmbmV3X2RlKTsKKwlpZiAobmV3X2JoKSB7CisJCWlmICghbmV3X2lub2RlKSB7CisJCQlicmVsc2UgKG5ld19iaCk7CisJCQluZXdfYmggPSBOVUxMOworCQl9CisJfQorCWlmIChTX0lTRElSKG9sZF9pbm9kZS0+aV9tb2RlKSkgeworCQlpZiAobmV3X2lub2RlKSB7CisJCQlyZXR2YWwgPSAtRU5PVEVNUFRZOworCQkJaWYgKCFlbXB0eV9kaXIgKG5ld19pbm9kZSkpCisJCQkJZ290byBlbmRfcmVuYW1lOworCQl9CisJCXJldHZhbCA9IC1FSU87CisJCWRpcl9iaCA9IGV4dDNfYnJlYWQgKGhhbmRsZSwgb2xkX2lub2RlLCAwLCAwLCAmcmV0dmFsKTsKKwkJaWYgKCFkaXJfYmgpCisJCQlnb3RvIGVuZF9yZW5hbWU7CisJCWlmIChsZTMyX3RvX2NwdShQQVJFTlRfSU5PKGRpcl9iaC0+Yl9kYXRhKSkgIT0gb2xkX2Rpci0+aV9pbm8pCisJCQlnb3RvIGVuZF9yZW5hbWU7CisJCXJldHZhbCA9IC1FTUxJTks7CisJCWlmICghbmV3X2lub2RlICYmIG5ld19kaXIhPW9sZF9kaXIgJiYKKwkJCQluZXdfZGlyLT5pX25saW5rID49IEVYVDNfTElOS19NQVgpCisJCQlnb3RvIGVuZF9yZW5hbWU7CisJfQorCWlmICghbmV3X2JoKSB7CisJCXJldHZhbCA9IGV4dDNfYWRkX2VudHJ5IChoYW5kbGUsIG5ld19kZW50cnksIG9sZF9pbm9kZSk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGVuZF9yZW5hbWU7CisJfSBlbHNlIHsKKwkJQlVGRkVSX1RSQUNFKG5ld19iaCwgImdldCB3cml0ZSBhY2Nlc3MiKTsKKwkJZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBuZXdfYmgpOworCQluZXdfZGUtPmlub2RlID0gY3B1X3RvX2xlMzIob2xkX2lub2RlLT5pX2lubyk7CisJCWlmIChFWFQzX0hBU19JTkNPTVBBVF9GRUFUVVJFKG5ld19kaXItPmlfc2IsCisJCQkJCSAgICAgIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRSkpCisJCQluZXdfZGUtPmZpbGVfdHlwZSA9IG9sZF9kZS0+ZmlsZV90eXBlOworCQluZXdfZGlyLT5pX3ZlcnNpb24rKzsKKwkJQlVGRkVSX1RSQUNFKG5ld19iaCwgImNhbGwgZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIG5ld19iaCk7CisJCWJyZWxzZShuZXdfYmgpOworCQluZXdfYmggPSBOVUxMOworCX0KKworCS8qCisJICogTGlrZSBtb3N0IG90aGVyIFVuaXggc3lzdGVtcywgc2V0IHRoZSBjdGltZSBmb3IgaW5vZGVzIG9uIGEKKwkgKiByZW5hbWUuCisJICovCisJb2xkX2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlleHQzX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBvbGRfaW5vZGUpOworCisJLyoKKwkgKiBvaywgdGhhdCdzIGl0CisJICovCisJaWYgKGxlMzJfdG9fY3B1KG9sZF9kZS0+aW5vZGUpICE9IG9sZF9pbm9kZS0+aV9pbm8gfHwKKwkgICAgb2xkX2RlLT5uYW1lX2xlbiAhPSBvbGRfZGVudHJ5LT5kX25hbWUubGVuIHx8CisJICAgIHN0cm5jbXAob2xkX2RlLT5uYW1lLCBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwgb2xkX2RlLT5uYW1lX2xlbikgfHwKKwkgICAgKHJldHZhbCA9IGV4dDNfZGVsZXRlX2VudHJ5KGhhbmRsZSwgb2xkX2RpciwKKwkJCQkJb2xkX2RlLCBvbGRfYmgpKSA9PSAtRU5PRU5UKSB7CisJCS8qIG9sZF9kZSBjb3VsZCBoYXZlIG1vdmVkIGZyb20gdW5kZXIgdXMgZHVyaW5nIGh0cmVlIHNwbGl0LCBzbworCQkgKiBtYWtlIHN1cmUgdGhhdCB3ZSBhcmUgZGVsZXRpbmcgdGhlIHJpZ2h0IGVudHJ5LiAgV2UgbWlnaHQKKwkJICogYWxzbyBiZSBwb2ludGluZyB0byBhIHN0YWxlIGVudHJ5IGluIHRoZSB1bnVzZWQgcGFydCBvZgorCQkgKiBvbGRfYmggc28ganVzdCBjaGVja2luZyBpbnVtIGFuZCB0aGUgbmFtZSBpc24ndCBlbm91Z2guICovCisJCXN0cnVjdCBidWZmZXJfaGVhZCAqb2xkX2JoMjsKKwkJc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKm9sZF9kZTI7CisKKwkJb2xkX2JoMiA9IGV4dDNfZmluZF9lbnRyeShvbGRfZGVudHJ5LCAmb2xkX2RlMik7CisJCWlmIChvbGRfYmgyKSB7CisJCQlyZXR2YWwgPSBleHQzX2RlbGV0ZV9lbnRyeShoYW5kbGUsIG9sZF9kaXIsCisJCQkJCQkgICBvbGRfZGUyLCBvbGRfYmgyKTsKKwkJCWJyZWxzZShvbGRfYmgyKTsKKwkJfQorCX0KKwlpZiAocmV0dmFsKSB7CisJCWV4dDNfd2FybmluZyhvbGRfZGlyLT5pX3NiLCAiZXh0M19yZW5hbWUiLAorCQkJCSJEZWxldGluZyBvbGQgZmlsZSAoJWx1KSwgJWQsIGVycm9yPSVkIiwKKwkJCQlvbGRfZGlyLT5pX2lubywgb2xkX2Rpci0+aV9ubGluaywgcmV0dmFsKTsKKwl9CisKKwlpZiAobmV3X2lub2RlKSB7CisJCW5ld19pbm9kZS0+aV9ubGluay0tOworCQluZXdfaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCX0KKwlvbGRfZGlyLT5pX2N0aW1lID0gb2xkX2Rpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJZXh0M191cGRhdGVfZHhfZmxhZyhvbGRfZGlyKTsKKwlpZiAoZGlyX2JoKSB7CisJCUJVRkZFUl9UUkFDRShkaXJfYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCWV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZGlyX2JoKTsKKwkJUEFSRU5UX0lOTyhkaXJfYmgtPmJfZGF0YSkgPSBjcHVfdG9fbGUzMihuZXdfZGlyLT5pX2lubyk7CisJCUJVRkZFUl9UUkFDRShkaXJfYmgsICJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBkaXJfYmgpOworCQlvbGRfZGlyLT5pX25saW5rLS07CisJCWlmIChuZXdfaW5vZGUpIHsKKwkJCW5ld19pbm9kZS0+aV9ubGluay0tOworCQl9IGVsc2UgeworCQkJbmV3X2Rpci0+aV9ubGluaysrOworCQkJZXh0M191cGRhdGVfZHhfZmxhZyhuZXdfZGlyKTsKKwkJCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIG5ld19kaXIpOworCQl9CisJfQorCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIG9sZF9kaXIpOworCWlmIChuZXdfaW5vZGUpIHsKKwkJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgbmV3X2lub2RlKTsKKwkJaWYgKCFuZXdfaW5vZGUtPmlfbmxpbmspCisJCQlleHQzX29ycGhhbl9hZGQoaGFuZGxlLCBuZXdfaW5vZGUpOworCX0KKwlyZXR2YWwgPSAwOworCitlbmRfcmVuYW1lOgorCWJyZWxzZSAoZGlyX2JoKTsKKwlicmVsc2UgKG9sZF9iaCk7CisJYnJlbHNlIChuZXdfYmgpOworCWV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIGRpcmVjdG9yaWVzIGNhbiBoYW5kbGUgbW9zdCBvcGVyYXRpb25zLi4uCisgKi8KK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmNyZWF0ZQkJPSBleHQzX2NyZWF0ZSwKKwkubG9va3VwCQk9IGV4dDNfbG9va3VwLAorCS5saW5rCQk9IGV4dDNfbGluaywKKwkudW5saW5rCQk9IGV4dDNfdW5saW5rLAorCS5zeW1saW5rCT0gZXh0M19zeW1saW5rLAorCS5ta2RpcgkJPSBleHQzX21rZGlyLAorCS5ybWRpcgkJPSBleHQzX3JtZGlyLAorCS5ta25vZAkJPSBleHQzX21rbm9kLAorCS5yZW5hbWUJCT0gZXh0M19yZW5hbWUsCisJLnNldGF0dHIJPSBleHQzX3NldGF0dHIsCisjaWZkZWYgQ09ORklHX0VYVDNfRlNfWEFUVFIKKwkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0cgk9IGV4dDNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCisjZW5kaWYKKwkucGVybWlzc2lvbgk9IGV4dDNfcGVybWlzc2lvbiwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDNfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zID0geworCS5zZXRhdHRyCT0gZXh0M19zZXRhdHRyLAorI2lmZGVmIENPTkZJR19FWFQzX0ZTX1hBVFRSCisJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAorCS5saXN0eGF0dHIJPSBleHQzX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAorI2VuZGlmCisJLnBlcm1pc3Npb24JPSBleHQzX3Blcm1pc3Npb24sCit9OyAKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvcmVzaXplLmMgYi9mcy9leHQzL3Jlc2l6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjOWY4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQzL3Jlc2l6ZS5jCkBAIC0wLDAgKzEsOTk2IEBACisvKgorICogIGxpbnV4L2ZzL2V4dDMvcmVzaXplLmMKKyAqCisgKiBTdXBwb3J0IGZvciByZXNpemluZyBhbiBleHQzIGZpbGVzeXN0ZW0gd2hpbGUgaXQgaXMgbW91bnRlZC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgQW5kcmVhcyBEaWxnZXIgPGFkaWxnZXJAY2x1c3RlcmZzLmNvbT4KKyAqCisgKiBUaGlzIGNvdWxkIHByb2JhYmx5IGJlIG1hZGUgaW50byBhIG1vZHVsZSwgYmVjYXVzZSBpdCBpcyBub3Qgb2Z0ZW4gaW4gdXNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2RlZmluZSBFWFQzRlNfREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2piZC5oPgorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKworI2RlZmluZSBvdXRzaWRlKGIsIGZpcnN0LCBsYXN0KQkoKGIpIDwgKGZpcnN0KSB8fCAoYikgPj0gKGxhc3QpKQorI2RlZmluZSBpbnNpZGUoYiwgZmlyc3QsIGxhc3QpCSgoYikgPj0gKGZpcnN0KSAmJiAoYikgPCAobGFzdCkpCisKK3N0YXRpYyBpbnQgdmVyaWZ5X2dyb3VwX2lucHV0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgICAgICBzdHJ1Y3QgZXh0M19uZXdfZ3JvdXBfZGF0YSAqaW5wdXQpCit7CisJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpID0gRVhUM19TQihzYik7CisJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKmVzID0gc2JpLT5zX2VzOworCXVuc2lnbmVkIHN0YXJ0ID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KTsKKwl1bnNpZ25lZCBlbmQgPSBzdGFydCArIGlucHV0LT5ibG9ja3NfY291bnQ7CisJdW5zaWduZWQgZ3JvdXAgPSBpbnB1dC0+Z3JvdXA7CisJdW5zaWduZWQgaXRlbmQgPSBpbnB1dC0+aW5vZGVfdGFibGUgKyBFWFQzX1NCKHNiKS0+c19pdGJfcGVyX2dyb3VwOworCXVuc2lnbmVkIG92ZXJoZWFkID0gZXh0M19iZ19oYXNfc3VwZXIoc2IsIGdyb3VwKSA/CisJCSgxICsgZXh0M19iZ19udW1fZ2RiKHNiLCBncm91cCkgKworCQkgbGUxNl90b19jcHUoZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcykpIDogMDsKKwl1bnNpZ25lZCBtZXRhZW5kID0gc3RhcnQgKyBvdmVyaGVhZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlpbnQgZnJlZV9ibG9ja3NfY291bnQ7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKwlpbnB1dC0+ZnJlZV9ibG9ja3NfY291bnQgPSBmcmVlX2Jsb2Nrc19jb3VudCA9CisJCWlucHV0LT5ibG9ja3NfY291bnQgLSAyIC0gb3ZlcmhlYWQgLSBzYmktPnNfaXRiX3Blcl9ncm91cDsKKworCWlmICh0ZXN0X29wdChzYiwgREVCVUcpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhUMy1mczogYWRkaW5nICVzIGdyb3VwICV1OiAldSBibG9ja3MgIgorCQkgICAgICAgIiglZCBmcmVlLCAldSByZXNlcnZlZClcbiIsCisJCSAgICAgICBleHQzX2JnX2hhc19zdXBlcihzYiwgaW5wdXQtPmdyb3VwKSA/ICJub3JtYWwiIDoKKwkJICAgICAgICJuby1zdXBlciIsIGlucHV0LT5ncm91cCwgaW5wdXQtPmJsb2Nrc19jb3VudCwKKwkJICAgICAgIGZyZWVfYmxvY2tzX2NvdW50LCBpbnB1dC0+cmVzZXJ2ZWRfYmxvY2tzKTsKKworCWlmIChncm91cCAhPSBzYmktPnNfZ3JvdXBzX2NvdW50KQorCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgIkNhbm5vdCBhZGQgYXQgZ3JvdXAgJXUgKG9ubHkgJWx1IGdyb3VwcykiLAorCQkJICAgICBpbnB1dC0+Z3JvdXAsIHNiaS0+c19ncm91cHNfY291bnQpOworCWVsc2UgaWYgKChzdGFydCAtIGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKSAlCisJCSBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpKQorCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywgIkxhc3QgZ3JvdXAgbm90IGZ1bGwiKTsKKwllbHNlIGlmIChpbnB1dC0+cmVzZXJ2ZWRfYmxvY2tzID4gaW5wdXQtPmJsb2Nrc19jb3VudCAvIDUpCisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLCAiUmVzZXJ2ZWQgYmxvY2tzIHRvbyBoaWdoICgldSkiLAorCQkJICAgICBpbnB1dC0+cmVzZXJ2ZWRfYmxvY2tzKTsKKwllbHNlIGlmIChmcmVlX2Jsb2Nrc19jb3VudCA8IDApCisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLCAiQmFkIGJsb2NrcyBjb3VudCAldSIsCisJCQkgICAgIGlucHV0LT5ibG9ja3NfY291bnQpOworCWVsc2UgaWYgKCEoYmggPSBzYl9icmVhZChzYiwgZW5kIC0gMSkpKQorCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywgIkNhbm5vdCByZWFkIGxhc3QgYmxvY2sgKCV1KSIsCisJCQkgICAgIGVuZCAtIDEpOworCWVsc2UgaWYgKG91dHNpZGUoaW5wdXQtPmJsb2NrX2JpdG1hcCwgc3RhcnQsIGVuZCkpCisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiQmxvY2sgYml0bWFwIG5vdCBpbiBncm91cCAoYmxvY2sgJXUpIiwKKwkJCSAgICAgaW5wdXQtPmJsb2NrX2JpdG1hcCk7CisJZWxzZSBpZiAob3V0c2lkZShpbnB1dC0+aW5vZGVfYml0bWFwLCBzdGFydCwgZW5kKSkKKwkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJJbm9kZSBiaXRtYXAgbm90IGluIGdyb3VwIChibG9jayAldSkiLAorCQkJICAgICBpbnB1dC0+aW5vZGVfYml0bWFwKTsKKwllbHNlIGlmIChvdXRzaWRlKGlucHV0LT5pbm9kZV90YWJsZSwgc3RhcnQsIGVuZCkgfHwKKwkgICAgICAgICBvdXRzaWRlKGl0ZW5kIC0gMSwgc3RhcnQsIGVuZCkpCisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiSW5vZGUgdGFibGUgbm90IGluIGdyb3VwIChibG9ja3MgJXUtJXUpIiwKKwkJCSAgICAgaW5wdXQtPmlub2RlX3RhYmxlLCBpdGVuZCAtIDEpOworCWVsc2UgaWYgKGlucHV0LT5pbm9kZV9iaXRtYXAgPT0gaW5wdXQtPmJsb2NrX2JpdG1hcCkKKwkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJCbG9jayBiaXRtYXAgc2FtZSBhcyBpbm9kZSBiaXRtYXAgKCV1KSIsCisJCQkgICAgIGlucHV0LT5ibG9ja19iaXRtYXApOworCWVsc2UgaWYgKGluc2lkZShpbnB1dC0+YmxvY2tfYml0bWFwLCBpbnB1dC0+aW5vZGVfdGFibGUsIGl0ZW5kKSkKKwkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJCbG9jayBiaXRtYXAgKCV1KSBpbiBpbm9kZSB0YWJsZSAoJXUtJXUpIiwKKwkJCSAgICAgaW5wdXQtPmJsb2NrX2JpdG1hcCwgaW5wdXQtPmlub2RlX3RhYmxlLCBpdGVuZC0xKTsKKwllbHNlIGlmIChpbnNpZGUoaW5wdXQtPmlub2RlX2JpdG1hcCwgaW5wdXQtPmlub2RlX3RhYmxlLCBpdGVuZCkpCisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiSW5vZGUgYml0bWFwICgldSkgaW4gaW5vZGUgdGFibGUgKCV1LSV1KSIsCisJCQkgICAgIGlucHV0LT5pbm9kZV9iaXRtYXAsIGlucHV0LT5pbm9kZV90YWJsZSwgaXRlbmQtMSk7CisJZWxzZSBpZiAoaW5zaWRlKGlucHV0LT5ibG9ja19iaXRtYXAsIHN0YXJ0LCBtZXRhZW5kKSkKKwkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJCbG9jayBiaXRtYXAgKCV1KSBpbiBHRFQgdGFibGUgKCV1LSV1KSIsCisJCQkgICAgIGlucHV0LT5ibG9ja19iaXRtYXAsIHN0YXJ0LCBtZXRhZW5kIC0gMSk7CisJZWxzZSBpZiAoaW5zaWRlKGlucHV0LT5pbm9kZV9iaXRtYXAsIHN0YXJ0LCBtZXRhZW5kKSkKKwkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJJbm9kZSBiaXRtYXAgKCV1KSBpbiBHRFQgdGFibGUgKCV1LSV1KSIsCisJCQkgICAgIGlucHV0LT5pbm9kZV9iaXRtYXAsIHN0YXJ0LCBtZXRhZW5kIC0gMSk7CisJZWxzZSBpZiAoaW5zaWRlKGlucHV0LT5pbm9kZV90YWJsZSwgc3RhcnQsIG1ldGFlbmQpIHx8CisJICAgICAgICAgaW5zaWRlKGl0ZW5kIC0gMSwgc3RhcnQsIG1ldGFlbmQpKQorCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgIklub2RlIHRhYmxlICgldS0ldSkgb3ZlcmxhcHMgR0RUIHRhYmxlICgldS0ldSkiLAorCQkJICAgICBpbnB1dC0+aW5vZGVfdGFibGUsIGl0ZW5kIC0gMSwgc3RhcnQsIG1ldGFlbmQgLSAxKTsKKwllbHNlCisJCWVyciA9IDA7CisJYnJlbHNlKGJoKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJjbGVhbihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgdW5zaWduZWQgbG9uZyBibGspCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgZXJyOworCisJYmggPSBzYl9nZXRibGsoc2IsIGJsayk7CisJaWYgKChlcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKSkpIHsKKwkJYnJlbHNlKGJoKTsKKwkJYmggPSBFUlJfUFRSKGVycik7CisJfSBlbHNlIHsKKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1zZXQoYmgtPmJfZGF0YSwgMCwgc2ItPnNfYmxvY2tzaXplKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCXVubG9ja19idWZmZXIoYmgpOworCX0KKworCXJldHVybiBiaDsKK30KKworLyoKKyAqIFRvIGF2b2lkIGNhbGxpbmcgdGhlIGF0b21pYyBzZXRiaXQgaHVuZHJlZHMgb3IgdGhvdXNhbmRzIG9mIHRpbWVzLCB3ZSBvbmx5CisgKiBuZWVkIHRvIHVzZSBpdCB3aXRoaW4gYSBzaW5nbGUgYnl0ZSAodG8gZW5zdXJlIHdlIGdldCBlbmRpYW5uZXNzIHJpZ2h0KS4KKyAqIFdlIGNhbiB1c2UgbWVtc2V0IGZvciB0aGUgcmVzdCBvZiB0aGUgYml0bWFwIGFzIHRoZXJlIGFyZSBubyBvdGhlciB1c2Vycy4KKyAqLworc3RhdGljIHZvaWQgbWFya19iaXRtYXBfZW5kKGludCBzdGFydF9iaXQsIGludCBlbmRfYml0LCBjaGFyICpiaXRtYXApCit7CisJaW50IGk7CisKKwlpZiAoc3RhcnRfYml0ID49IGVuZF9iaXQpCisJCXJldHVybjsKKworCWV4dDNfZGVidWcoIm1hcmsgZW5kIGJpdHMgKyVkIHRocm91Z2ggKyVkIHVzZWRcbiIsIHN0YXJ0X2JpdCwgZW5kX2JpdCk7CisJZm9yIChpID0gc3RhcnRfYml0OyBpIDwgKChzdGFydF9iaXQgKyA3KSAmIH43VUwpOyBpKyspCisJCWV4dDNfc2V0X2JpdChpLCBiaXRtYXApOworCWlmIChpIDwgZW5kX2JpdCkKKwkJbWVtc2V0KGJpdG1hcCArIChpID4+IDMpLCAweGZmLCAoZW5kX2JpdCAtIGkpID4+IDMpOworfQorCisvKgorICogU2V0IHVwIHRoZSBibG9jayBhbmQgaW5vZGUgYml0bWFwcywgYW5kIHRoZSBpbm9kZSB0YWJsZSBmb3IgdGhlIG5ldyBncm91cC4KKyAqIFRoaXMgZG9lc24ndCBuZWVkIHRvIGJlIHBhcnQgb2YgdGhlIG1haW4gdHJhbnNhY3Rpb24sIHNpbmNlIHdlIGFyZSBvbmx5CisgKiBjaGFuZ2luZyBibG9ja3Mgb3V0c2lkZSB0aGUgYWN0dWFsIGZpbGVzeXN0ZW0uICBXZSBzdGlsbCBkbyBqb3VybmFsaW5nIHRvCisgKiBlbnN1cmUgdGhlIHJlY292ZXJ5IGlzIGNvcnJlY3QgaW4gY2FzZSBvZiBhIGZhaWx1cmUganVzdCBhZnRlciByZXNpemUuCisgKiBJZiBhbnkgcGFydCBvZiB0aGlzIGZhaWxzLCB3ZSBzaW1wbHkgYWJvcnQgdGhlIHJlc2l6ZS4KKyAqLworc3RhdGljIGludCBzZXR1cF9uZXdfZ3JvdXBfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICBzdHJ1Y3QgZXh0M19uZXdfZ3JvdXBfZGF0YSAqaW5wdXQpCit7CisJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpID0gRVhUM19TQihzYik7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IGlucHV0LT5ncm91cCAqIHNiaS0+c19ibG9ja3NfcGVyX2dyb3VwICsKKwkJbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOworCWludCByZXNlcnZlZF9nZGIgPSBleHQzX2JnX2hhc19zdXBlcihzYiwgaW5wdXQtPmdyb3VwKSA/CisJCWxlMTZfdG9fY3B1KHNiaS0+c19lcy0+c19yZXNlcnZlZF9nZHRfYmxvY2tzKSA6IDA7CisJdW5zaWduZWQgbG9uZyBnZGJsb2NrcyA9IGV4dDNfYmdfbnVtX2dkYihzYiwgaW5wdXQtPmdyb3VwKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWhhbmRsZV90ICpoYW5kbGU7CisJdW5zaWduZWQgbG9uZyBibG9jazsKKwlpbnQgYml0OworCWludCBpOworCWludCBlcnIgPSAwLCBlcnIyOworCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0X3NiKHNiLCByZXNlcnZlZF9nZGIgKyBnZGJsb2NrcyArCisJCQkJICAgICAgIDIgKyBzYmktPnNfaXRiX3Blcl9ncm91cCk7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCisJbG9ja19zdXBlcihzYik7CisJaWYgKGlucHV0LT5ncm91cCAhPSBzYmktPnNfZ3JvdXBzX2NvdW50KSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBleGl0X2pvdXJuYWw7CisJfQorCisJaWYgKElTX0VSUihiaCA9IGJjbGVhbihoYW5kbGUsIHNiLCBpbnB1dC0+YmxvY2tfYml0bWFwKSkpIHsKKwkJZXJyID0gUFRSX0VSUihiaCk7CisJCWdvdG8gZXhpdF9qb3VybmFsOworCX0KKworCWlmIChleHQzX2JnX2hhc19zdXBlcihzYiwgaW5wdXQtPmdyb3VwKSkgeworCQlleHQzX2RlYnVnKCJtYXJrIGJhY2t1cCBzdXBlcmJsb2NrICUjMDRseCAoKzApXG4iLCBzdGFydCk7CisJCWV4dDNfc2V0X2JpdCgwLCBiaC0+Yl9kYXRhKTsKKwl9CisKKwkvKiBDb3B5IGFsbCBvZiB0aGUgR0RUIGJsb2NrcyBpbnRvIHRoZSBiYWNrdXAgaW4gdGhpcyBncm91cCAqLworCWZvciAoaSA9IDAsIGJpdCA9IDEsIGJsb2NrID0gc3RhcnQgKyAxOworCSAgICAgaSA8IGdkYmxvY2tzOyBpKyssIGJsb2NrKyssIGJpdCsrKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RiOworCisJCWV4dDNfZGVidWcoInVwZGF0ZSBiYWNrdXAgZ3JvdXAgJSMwNGx4ICgrJWQpXG4iLCBibG9jaywgYml0KTsKKworCQlnZGIgPSBzYl9nZXRibGsoc2IsIGJsb2NrKTsKKwkJaWYgKChlcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGdkYikpKSB7CisJCQlicmVsc2UoZ2RiKTsKKwkJCWdvdG8gZXhpdF9iaDsKKwkJfQorCQlsb2NrX2J1ZmZlcihiaCk7CisJCW1lbWNweShnZGItPmJfZGF0YSwgc2JpLT5zX2dyb3VwX2Rlc2NbaV0sIGJoLT5iX3NpemUpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGdkYik7CisJCXVubG9ja19idWZmZXIoYmgpOworCQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBnZGIpOworCQlleHQzX3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKKwkJYnJlbHNlKGdkYik7CisJfQorCisJLyogWmVybyBvdXQgYWxsIG9mIHRoZSByZXNlcnZlZCBiYWNrdXAgZ3JvdXAgZGVzY3JpcHRvciB0YWJsZSBibG9ja3MgKi8KKwlmb3IgKGkgPSAwLCBiaXQgPSBnZGJsb2NrcyArIDEsIGJsb2NrID0gc3RhcnQgKyBiaXQ7CisJICAgICBpIDwgcmVzZXJ2ZWRfZ2RiOyBpKyssIGJsb2NrKyssIGJpdCsrKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RiOworCisJCWV4dDNfZGVidWcoImNsZWFyIHJlc2VydmVkIGJsb2NrICUjMDRseCAoKyVkKVxuIiwgYmxvY2ssIGJpdCk7CisKKwkJaWYgKElTX0VSUihnZGIgPSBiY2xlYW4oaGFuZGxlLCBzYiwgYmxvY2spKSkgeworCQkJZXJyID0gUFRSX0VSUihiaCk7CisJCQlnb3RvIGV4aXRfYmg7CisJCX0KKwkJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZ2RiKTsKKwkJZXh0M19zZXRfYml0KGJpdCwgYmgtPmJfZGF0YSk7CisJCWJyZWxzZShnZGIpOworCX0KKwlleHQzX2RlYnVnKCJtYXJrIGJsb2NrIGJpdG1hcCAlIzA0eCAoKyVsZClcbiIsIGlucHV0LT5ibG9ja19iaXRtYXAsCisJCSAgIGlucHV0LT5ibG9ja19iaXRtYXAgLSBzdGFydCk7CisJZXh0M19zZXRfYml0KGlucHV0LT5ibG9ja19iaXRtYXAgLSBzdGFydCwgYmgtPmJfZGF0YSk7CisJZXh0M19kZWJ1ZygibWFyayBpbm9kZSBiaXRtYXAgJSMwNHggKCslbGQpXG4iLCBpbnB1dC0+aW5vZGVfYml0bWFwLAorCQkgICBpbnB1dC0+aW5vZGVfYml0bWFwIC0gc3RhcnQpOworCWV4dDNfc2V0X2JpdChpbnB1dC0+aW5vZGVfYml0bWFwIC0gc3RhcnQsIGJoLT5iX2RhdGEpOworCisJLyogWmVybyBvdXQgYWxsIG9mIHRoZSBpbm9kZSB0YWJsZSBibG9ja3MgKi8KKwlmb3IgKGkgPSAwLCBibG9jayA9IGlucHV0LT5pbm9kZV90YWJsZSwgYml0ID0gYmxvY2sgLSBzdGFydDsKKwkgICAgIGkgPCBzYmktPnNfaXRiX3Blcl9ncm91cDsgaSsrLCBiaXQrKywgYmxvY2srKykgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKml0OworCisJCWV4dDNfZGVidWcoImNsZWFyIGlub2RlIGJsb2NrICUjMDR4ICgrJWxkKVxuIiwgYmxvY2ssIGJpdCk7CisJCWlmIChJU19FUlIoaXQgPSBiY2xlYW4oaGFuZGxlLCBzYiwgYmxvY2spKSkgeworCQkJZXJyID0gUFRSX0VSUihpdCk7CisJCQlnb3RvIGV4aXRfYmg7CisJCX0KKwkJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaXQpOworCQlicmVsc2UoaXQpOworCQlleHQzX3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKKwl9CisJbWFya19iaXRtYXBfZW5kKGlucHV0LT5ibG9ja3NfY291bnQsIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYiksCisJCQliaC0+Yl9kYXRhKTsKKwlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJYnJlbHNlKGJoKTsKKworCS8qIE1hcmsgdW51c2VkIGVudHJpZXMgaW4gaW5vZGUgYml0bWFwIHVzZWQgKi8KKwlleHQzX2RlYnVnKCJjbGVhciBpbm9kZSBiaXRtYXAgJSMwNHggKCslbGQpXG4iLAorCQkgICBpbnB1dC0+aW5vZGVfYml0bWFwLCBpbnB1dC0+aW5vZGVfYml0bWFwIC0gc3RhcnQpOworCWlmIChJU19FUlIoYmggPSBiY2xlYW4oaGFuZGxlLCBzYiwgaW5wdXQtPmlub2RlX2JpdG1hcCkpKSB7CisJCWVyciA9IFBUUl9FUlIoYmgpOworCQlnb3RvIGV4aXRfam91cm5hbDsKKwl9CisKKwltYXJrX2JpdG1hcF9lbmQoRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKSwgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSwKKwkJCWJoLT5iX2RhdGEpOworCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKK2V4aXRfYmg6CisJYnJlbHNlKGJoKTsKKworZXhpdF9qb3VybmFsOgorCXVubG9ja19zdXBlcihzYik7CisJaWYgKChlcnIyID0gZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKSkgJiYgIWVycikKKwkJZXJyID0gZXJyMjsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBJdGVyYXRlIHRocm91Z2ggdGhlIGdyb3VwcyB3aGljaCBob2xkIEJBQ0tVUCBzdXBlcmJsb2NrL0dEVCBjb3BpZXMgaW4gYW4KKyAqIGV4dDMgZmlsZXN5c3RlbS4gIFRoZSBjb3VudGVycyBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gMSwgNSwgYW5kIDcgYmVmb3JlCisgKiBjYWxsaW5nIHRoaXMgZm9yIHRoZSBmaXJzdCB0aW1lLiAgSW4gYSBzcGFyc2UgZmlsZXN5c3RlbSBpdCB3aWxsIGJlIHRoZQorICogc2VxdWVuY2Ugb2YgcG93ZXJzIG9mIDMsIDUsIGFuZCA3OiAxLCAzLCA1LCA3LCA5LCAyNSwgMjcsIDQ5LCA4MSwgLi4uCisgKiBGb3IgYSBub24tc3BhcnNlIGZpbGVzeXN0ZW0gaXQgd2lsbCBiZSBldmVyeSBncm91cDogMSwgMiwgMywgNCwgLi4uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBleHQzX2xpc3RfYmFja3VwcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCAqdGhyZWUsCisJCQkJICB1bnNpZ25lZCAqZml2ZSwgdW5zaWduZWQgKnNldmVuKQoreworCXVuc2lnbmVkICptaW4gPSB0aHJlZTsKKwlpbnQgbXVsdCA9IDM7CisJdW5zaWduZWQgcmV0OworCisJaWYgKCFFWFQzX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKKwkJCQkJRVhUM19GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVIpKSB7CisJCXJldCA9ICptaW47CisJCSptaW4gKz0gMTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoKmZpdmUgPCAqbWluKSB7CisJCW1pbiA9IGZpdmU7CisJCW11bHQgPSA1OworCX0KKwlpZiAoKnNldmVuIDwgKm1pbikgeworCQltaW4gPSBzZXZlbjsKKwkJbXVsdCA9IDc7CisJfQorCisJcmV0ID0gKm1pbjsKKwkqbWluICo9IG11bHQ7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQ2hlY2sgdGhhdCBhbGwgb2YgdGhlIGJhY2t1cCBHRFQgYmxvY2tzIGFyZSBoZWxkIGluIHRoZSBwcmltYXJ5IEdEVCBibG9jay4KKyAqIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGV5IGFyZSBzdG9yZWQgaW4gZ3JvdXAgb3JkZXIuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAqIGdyb3VwcyBpbiBjdXJyZW50IGZpbGVzeXN0ZW0gdGhhdCBoYXZlIEJBQ0tVUFMsIG9yIC12ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50IHZlcmlmeV9yZXNlcnZlZF9nZGIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnByaW1hcnkpCit7CisJY29uc3QgdW5zaWduZWQgbG9uZyBibGsgPSBwcmltYXJ5LT5iX2Jsb2NrbnI7CisJY29uc3QgdW5zaWduZWQgbG9uZyBlbmQgPSBFWFQzX1NCKHNiKS0+c19ncm91cHNfY291bnQ7CisJdW5zaWduZWQgdGhyZWUgPSAxOworCXVuc2lnbmVkIGZpdmUgPSA1OworCXVuc2lnbmVkIHNldmVuID0gNzsKKwl1bnNpZ25lZCBncnA7CisJX191MzIgKnAgPSAoX191MzIgKilwcmltYXJ5LT5iX2RhdGE7CisJaW50IGdkYmFja3VwcyA9IDA7CisKKwl3aGlsZSAoKGdycCA9IGV4dDNfbGlzdF9iYWNrdXBzKHNiLCAmdGhyZWUsICZmaXZlLCAmc2V2ZW4pKSA8IGVuZCkgeworCQlpZiAobGUzMl90b19jcHUoKnArKykgIT0gZ3JwICogRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSArIGJsayl7CisJCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgICJyZXNlcnZlZCBHRFQgJWxkIG1pc3NpbmcgZ3JwICVkICglbGQpXG4iLAorCQkJCSAgICAgYmxrLCBncnAsCisJCQkJICAgICBncnAgKiBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpICsgYmxrKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICgrK2dkYmFja3VwcyA+IEVYVDNfQUREUl9QRVJfQkxPQ0soc2IpKQorCQkJcmV0dXJuIC1FRkJJRzsKKwl9CisKKwlyZXR1cm4gZ2RiYWNrdXBzOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gd2UgbmVlZCB0byBicmluZyBhIHJlc2VydmVkIGdyb3VwIGRlc2NyaXB0b3IgdGFibGUgYmxvY2sgaW50bworICogdXNlIGZyb20gdGhlIHJlc2l6ZSBpbm9kZS4gIFRoZSBwcmltYXJ5IGNvcHkgb2YgdGhlIG5ldyBHRFQgYmxvY2sgY3VycmVudGx5CisgKiBpcyBhbiBpbmRpcmVjdCBibG9jayAodW5kZXIgdGhlIGRvdWJsZSBpbmRpcmVjdCBibG9jayBpbiB0aGUgcmVzaXplIGlub2RlKS4KKyAqIFRoZSBuZXcgYmFja3VwIEdEVCBibG9ja3Mgd2lsbCBiZSBzdG9yZWQgYXMgbGVhZiBibG9ja3MgaW4gdGhpcyBpbmRpcmVjdAorICogYmxvY2ssIGluIGdyb3VwIG9yZGVyLiAgRXZlbiB0aG91Z2ggd2Uga25vdyBhbGwgdGhlIGJsb2NrIG51bWJlcnMgd2UgbmVlZCwKKyAqIHdlIGNoZWNrIHRvIGVuc3VyZSB0aGF0IHRoZSByZXNpemUgaW5vZGUgaGFzIGFjdHVhbGx5IHJlc2VydmVkIHRoZXNlIGJsb2Nrcy4KKyAqCisgKiBEb24ndCBuZWVkIHRvIHVwZGF0ZSB0aGUgYmxvY2sgYml0bWFwcyBiZWNhdXNlIHRoZSBibG9ja3MgYXJlIHN0aWxsIGluIHVzZS4KKyAqCisgKiBXZSBnZXQgYWxsIG9mIHRoZSBlcnJvciBjYXNlcyBvdXQgb2YgdGhlIHdheSwgc28gdGhhdCB3ZSBhcmUgc3VyZSB0byBub3QKKyAqIGZhaWwgb25jZSB3ZSBzdGFydCBtb2RpZnlpbmcgdGhlIGRhdGEgb24gZGlzaywgYmVjYXVzZSBKQkQgaGFzIG5vIHJvbGxiYWNrLgorICovCitzdGF0aWMgaW50IGFkZF9uZXdfZ2RiKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCSAgICAgICBzdHJ1Y3QgZXh0M19uZXdfZ3JvdXBfZGF0YSAqaW5wdXQsCisJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipwcmltYXJ5KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXMgPSBFWFQzX1NCKHNiKS0+c19lczsKKwl1bnNpZ25lZCBsb25nIGdkYl9udW0gPSBpbnB1dC0+Z3JvdXAgLyBFWFQzX0RFU0NfUEVSX0JMT0NLKHNiKTsKKwl1bnNpZ25lZCBsb25nIGdkYmxvY2sgPSBFWFQzX1NCKHNiKS0+c19zYmgtPmJfYmxvY2tuciArIDEgKyBnZGJfbnVtOworCXN0cnVjdCBidWZmZXJfaGVhZCAqKm9fZ3JvdXBfZGVzYywgKipuX2dyb3VwX2Rlc2M7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaW5kOworCWludCBnZGJhY2t1cHM7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworCV9fdTMyICpkYXRhOworCWludCBlcnI7CisKKwlpZiAodGVzdF9vcHQoc2IsIERFQlVHKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJFWFQzLWZzOiBleHQzX2FkZF9uZXdfZ2RiOiBhZGRpbmcgZ3JvdXAgYmxvY2sgJWx1XG4iLAorCQkgICAgICAgZ2RiX251bSk7CisKKwkvKgorCSAqIElmIHdlIGFyZSBub3QgdXNpbmcgdGhlIHByaW1hcnkgc3VwZXJibG9jay9HRFQgY29weSBkb24ndCByZXNpemUsCisJICogYmVjYXVzZSB0aGUgdXNlciB0b29scyBoYXZlIG5vIHdheSBvZiBoYW5kbGluZyB0aGlzLiAgUHJvYmFibHkgYQorCSAqIGJhZCB0aW1lIHRvIGRvIGl0IGFueXdheXMuCisJICovCisJaWYgKEVYVDNfU0Ioc2IpLT5zX3NiaC0+Yl9ibG9ja25yICE9CisJICAgIGxlMzJfdG9fY3B1KEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKSB7CisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJIndvbid0IHJlc2l6ZSB1c2luZyBiYWNrdXAgc3VwZXJibG9jayBhdCAlbGx1XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylFWFQzX1NCKHNiKS0+c19zYmgtPmJfYmxvY2tucik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJKnByaW1hcnkgPSBzYl9icmVhZChzYiwgZ2RibG9jayk7CisJaWYgKCEqcHJpbWFyeSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoKGdkYmFja3VwcyA9IHZlcmlmeV9yZXNlcnZlZF9nZGIoc2IsICpwcmltYXJ5KSkgPCAwKSB7CisJCWVyciA9IGdkYmFja3VwczsKKwkJZ290byBleGl0X2JoOworCX0KKworCWRhdGEgPSBFWFQzX0koaW5vZGUpLT5pX2RhdGEgKyBFWFQzX0RJTkRfQkxPQ0s7CisJZGluZCA9IHNiX2JyZWFkKHNiLCBsZTMyX3RvX2NwdSgqZGF0YSkpOworCWlmICghZGluZCkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGV4aXRfYmg7CisJfQorCisJZGF0YSA9IChfX3UzMiAqKWRpbmQtPmJfZGF0YTsKKwlpZiAobGUzMl90b19jcHUoZGF0YVtnZGJfbnVtICUgRVhUM19BRERSX1BFUl9CTE9DSyhzYildKSAhPSBnZGJsb2NrKSB7CisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAibmV3IGdyb3VwICV1IEdEVCBibG9jayAlbHUgbm90IHJlc2VydmVkXG4iLAorCQkJICAgICBpbnB1dC0+Z3JvdXAsIGdkYmxvY2spOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGV4aXRfZGluZDsKKwl9CisKKwlpZiAoKGVyciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgRVhUM19TQihzYiktPnNfc2JoKSkpCisJCWdvdG8gZXhpdF9kaW5kOworCisJaWYgKChlcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsICpwcmltYXJ5KSkpCisJCWdvdG8gZXhpdF9zYmg7CisKKwlpZiAoKGVyciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZGluZCkpKQorCQlnb3RvIGV4aXRfcHJpbWFyeTsKKworCS8qIGV4dDNfcmVzZXJ2ZV9pbm9kZV93cml0ZSgpIGdldHMgYSByZWZlcmVuY2Ugb24gdGhlIGlsb2MgKi8KKwlpZiAoKGVyciA9IGV4dDNfcmVzZXJ2ZV9pbm9kZV93cml0ZShoYW5kbGUsIGlub2RlLCAmaWxvYykpKQorCQlnb3RvIGV4aXRfZGluZGo7CisKKwluX2dyb3VwX2Rlc2MgPSAoc3RydWN0IGJ1ZmZlcl9oZWFkICoqKWttYWxsb2MoKGdkYl9udW0gKyAxKSAqCisJCQkJc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuX2dyb3VwX2Rlc2MpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZXh0M193YXJuaW5nIChzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciAlbHUgZ3JvdXBzIiwgZ2RiX251bSArIDEpOworCQlnb3RvIGV4aXRfaW5vZGU7CisJfQorCisJLyoKKwkgKiBGaW5hbGx5LCB3ZSBoYXZlIGFsbCBvZiB0aGUgcG9zc2libGUgZmFpbHVyZXMgYmVoaW5kIHVzLi4uCisJICoKKwkgKiBSZW1vdmUgbmV3IEdEVCBibG9jayBmcm9tIGlub2RlIGRvdWJsZS1pbmRpcmVjdCBibG9jayBhbmQgY2xlYXIgb3V0CisJICogdGhlIG5ldyBHRFQgYmxvY2sgZm9yIHVzZSAod2hpY2ggYWxzbyAiZnJlZXMiIHRoZSBiYWNrdXAgR0RUIGJsb2NrcworCSAqIGZyb20gdGhlIHJlc2VydmVkIGlub2RlKS4gIFdlIGRvbid0IG5lZWQgdG8gY2hhbmdlIHRoZSBiaXRtYXBzIGZvcgorCSAqIHRoZXNlIGJsb2NrcywgYmVjYXVzZSB0aGV5IGFyZSBtYXJrZWQgYXMgaW4tdXNlIGZyb20gYmVpbmcgaW4gdGhlCisJICogcmVzZXJ2ZWQgaW5vZGUsIGFuZCB3aWxsIGJlY29tZSBHRFQgYmxvY2tzIChwcmltYXJ5IGFuZCBiYWNrdXApLgorCSAqLworCWRhdGFbZ2RiX251bSAlIEVYVDNfQUREUl9QRVJfQkxPQ0soc2IpXSA9IDA7CisJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGluZCk7CisJYnJlbHNlKGRpbmQpOworCWlub2RlLT5pX2Jsb2NrcyAtPSAoZ2RiYWNrdXBzICsgMSkgKiBzYi0+c19ibG9ja3NpemUgPj4gOTsKKwlleHQzX21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CisJbWVtc2V0KCgqcHJpbWFyeSktPmJfZGF0YSwgMCwgc2ItPnNfYmxvY2tzaXplKTsKKwlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCAqcHJpbWFyeSk7CisKKwlvX2dyb3VwX2Rlc2MgPSBFWFQzX1NCKHNiKS0+c19ncm91cF9kZXNjOworCW1lbWNweShuX2dyb3VwX2Rlc2MsIG9fZ3JvdXBfZGVzYywKKwkgICAgICAgRVhUM19TQihzYiktPnNfZ2RiX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSk7CisJbl9ncm91cF9kZXNjW2dkYl9udW1dID0gKnByaW1hcnk7CisJRVhUM19TQihzYiktPnNfZ3JvdXBfZGVzYyA9IG5fZ3JvdXBfZGVzYzsKKwlFWFQzX1NCKHNiKS0+c19nZGJfY291bnQrKzsKKwlrZnJlZShvX2dyb3VwX2Rlc2MpOworCisJZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcyA9CisJCWNwdV90b19sZTE2KGxlMTZfdG9fY3B1KGVzLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MpIC0gMSk7CisJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUM19TQihzYiktPnNfc2JoKTsKKworCXJldHVybiAwOworCitleGl0X2lub2RlOgorCS8vZXh0M19qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZSwgaWxvYy5iaCk7CisJYnJlbHNlKGlsb2MuYmgpOworZXhpdF9kaW5kajoKKwkvL2V4dDNfam91cm5hbF9yZWxlYXNlX2J1ZmZlcihoYW5kbGUsIGRpbmQpOworZXhpdF9wcmltYXJ5OgorCS8vZXh0M19qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZSwgKnByaW1hcnkpOworZXhpdF9zYmg6CisJLy9leHQzX2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCAqcHJpbWFyeSk7CitleGl0X2RpbmQ6CisJYnJlbHNlKGRpbmQpOworZXhpdF9iaDoKKwlicmVsc2UoKnByaW1hcnkpOworCisJZXh0M19kZWJ1ZygibGVhdmluZyB3aXRoIGVycm9yICVkXG4iLCBlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiB3ZSBhcmUgYWRkaW5nIGEgbmV3IGdyb3VwIHdoaWNoIGhhcyBhIGJhY2t1cCBjb3B5IG9mIGVhY2ggb2YKKyAqIHRoZSBHRFQgYmxvY2tzIChpLmUuIHNwYXJzZSBncm91cCkgYW5kIHRoZXJlIGFyZSByZXNlcnZlZCBHRFQgYmxvY2tzLgorICogV2UgbmVlZCB0byBhZGQgdGhlc2UgcmVzZXJ2ZWQgYmFja3VwIEdEVCBibG9ja3MgdG8gdGhlIHJlc2l6ZSBpbm9kZSwgc28KKyAqIHRoYXQgdGhleSBhcmUga2VwdCBmb3IgZnV0dXJlIHJlc2l6aW5nIGFuZCBub3QgYWxsb2NhdGVkIHRvIGZpbGVzLgorICoKKyAqIEVhY2ggcmVzZXJ2ZWQgYmFja3VwIEdEVCBibG9jayB3aWxsIGdvIGludG8gYSBkaWZmZXJlbnQgaW5kaXJlY3QgYmxvY2suCisgKiBUaGUgaW5kaXJlY3QgYmxvY2tzIGFyZSBhY3R1YWxseSB0aGUgcHJpbWFyeSByZXNlcnZlZCBHRFQgYmxvY2tzLAorICogc28gd2Uga25vdyBpbiBhZHZhbmNlIHdoYXQgdGhlaXIgYmxvY2sgbnVtYmVycyBhcmUuICBXZSBvbmx5IGdldCB0aGUKKyAqIGRvdWJsZS1pbmRpcmVjdCBibG9jayB0byB2ZXJpZnkgaXQgaXMgcG9pbnRpbmcgdG8gdGhlIHByaW1hcnkgcmVzZXJ2ZWQKKyAqIEdEVCBibG9ja3Mgc28gd2UgZG9uJ3Qgb3ZlcndyaXRlIGEgZGF0YSBibG9jayBieSBhY2NpZGVudC4gIFRoZSByZXNlcnZlZAorICogYmFja3VwIEdEVCBibG9ja3MgYXJlIHN0b3JlZCBpbiB0aGVpciByZXNlcnZlZCBwcmltYXJ5IEdEVCBibG9jay4KKyAqLworc3RhdGljIGludCByZXNlcnZlX2JhY2t1cF9nZGIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgIHN0cnVjdCBleHQzX25ld19ncm91cF9kYXRhICppbnB1dCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJaW50IHJlc2VydmVkX2dkYiA9bGUxNl90b19jcHUoRVhUM19TQihzYiktPnNfZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2Nrcyk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICoqcHJpbWFyeTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpbmQ7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworCXVuc2lnbmVkIGxvbmcgYmxrOworCV9fdTMyICpkYXRhLCAqZW5kOworCWludCBnZGJhY2t1cHMgPSAwOworCWludCByZXMsIGk7CisJaW50IGVycjsKKworCXByaW1hcnkgPSBrbWFsbG9jKHJlc2VydmVkX2dkYiAqIHNpemVvZigqcHJpbWFyeSksIEdGUF9LRVJORUwpOworCWlmICghcHJpbWFyeSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkYXRhID0gRVhUM19JKGlub2RlKS0+aV9kYXRhICsgRVhUM19ESU5EX0JMT0NLOworCWRpbmQgPSBzYl9icmVhZChzYiwgbGUzMl90b19jcHUoKmRhdGEpKTsKKwlpZiAoIWRpbmQpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBleGl0X2ZyZWU7CisJfQorCisJYmxrID0gRVhUM19TQihzYiktPnNfc2JoLT5iX2Jsb2NrbnIgKyAxICsgRVhUM19TQihzYiktPnNfZ2RiX2NvdW50OworCWRhdGEgPSAoX191MzIgKilkaW5kLT5iX2RhdGEgKyBFWFQzX1NCKHNiKS0+c19nZGJfY291bnQ7CisJZW5kID0gKF9fdTMyICopZGluZC0+Yl9kYXRhICsgRVhUM19BRERSX1BFUl9CTE9DSyhzYik7CisKKwkvKiBHZXQgZWFjaCByZXNlcnZlZCBwcmltYXJ5IEdEVCBibG9jayBhbmQgdmVyaWZ5IGl0IGhvbGRzIGJhY2t1cHMgKi8KKwlmb3IgKHJlcyA9IDA7IHJlcyA8IHJlc2VydmVkX2dkYjsgcmVzKyssIGJsaysrKSB7CisJCWlmIChsZTMyX3RvX2NwdSgqZGF0YSkgIT0gYmxrKSB7CisJCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgICJyZXNlcnZlZCBibG9jayAlbHUgbm90IGF0IG9mZnNldCAlbGRcbiIsCisJCQkJICAgICBibGssIChsb25nKShkYXRhIC0gKF9fdTMyICopZGluZC0+Yl9kYXRhKSk7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBleGl0X2JoOworCQl9CisJCXByaW1hcnlbcmVzXSA9IHNiX2JyZWFkKHNiLCBibGspOworCQlpZiAoIXByaW1hcnlbcmVzXSkgeworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gZXhpdF9iaDsKKwkJfQorCQlpZiAoKGdkYmFja3VwcyA9IHZlcmlmeV9yZXNlcnZlZF9nZGIoc2IsIHByaW1hcnlbcmVzXSkpIDwgMCkgeworCQkJYnJlbHNlKHByaW1hcnlbcmVzXSk7CisJCQllcnIgPSBnZGJhY2t1cHM7CisJCQlnb3RvIGV4aXRfYmg7CisJCX0KKwkJaWYgKCsrZGF0YSA+PSBlbmQpCisJCQlkYXRhID0gKF9fdTMyICopZGluZC0+Yl9kYXRhOworCX0KKworCWZvciAoaSA9IDA7IGkgPCByZXNlcnZlZF9nZGI7IGkrKykgeworCQlpZiAoKGVyciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgcHJpbWFyeVtpXSkpKSB7CisJCQkvKgorCQkJaW50IGo7CisJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCQkJCWV4dDNfam91cm5hbF9yZWxlYXNlX2J1ZmZlcihoYW5kbGUsIHByaW1hcnlbal0pOworCQkJICovCisJCQlnb3RvIGV4aXRfYmg7CisJCX0KKwl9CisKKwlpZiAoKGVyciA9IGV4dDNfcmVzZXJ2ZV9pbm9kZV93cml0ZShoYW5kbGUsIGlub2RlLCAmaWxvYykpKQorCQlnb3RvIGV4aXRfYmg7CisKKwkvKgorCSAqIEZpbmFsbHkgd2UgY2FuIGFkZCBlYWNoIG9mIHRoZSByZXNlcnZlZCBiYWNrdXAgR0RUIGJsb2NrcyBmcm9tCisJICogdGhlIG5ldyBncm91cCB0byBpdHMgcmVzZXJ2ZWQgcHJpbWFyeSBHRFQgYmxvY2suCisJICovCisJYmxrID0gaW5wdXQtPmdyb3VwICogRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmVzZXJ2ZWRfZ2RiOyBpKyspIHsKKwkJaW50IGVycjI7CisJCWRhdGEgPSAoX191MzIgKilwcmltYXJ5W2ldLT5iX2RhdGE7CisJCS8qIHByaW50aygicmVzZXJ2aW5nIGJhY2t1cCAlbHVbJXVdID0gJWx1XG4iLAorCQkgICAgICAgcHJpbWFyeVtpXS0+Yl9ibG9ja25yLCBnZGJhY2t1cHMsCisJCSAgICAgICBibGsgKyBwcmltYXJ5W2ldLT5iX2Jsb2NrbnIpOyAqLworCQlkYXRhW2dkYmFja3Vwc10gPSBjcHVfdG9fbGUzMihibGsgKyBwcmltYXJ5W2ldLT5iX2Jsb2NrbnIpOworCQllcnIyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgcHJpbWFyeVtpXSk7CisJCWlmICghZXJyKQorCQkJZXJyID0gZXJyMjsKKwl9CisJaW5vZGUtPmlfYmxvY2tzICs9IHJlc2VydmVkX2dkYiAqIHNiLT5zX2Jsb2Nrc2l6ZSA+PiA5OworCWV4dDNfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKKworZXhpdF9iaDoKKwl3aGlsZSAoLS1yZXMgPj0gMCkKKwkJYnJlbHNlKHByaW1hcnlbcmVzXSk7CisJYnJlbHNlKGRpbmQpOworCitleGl0X2ZyZWU6CisJa2ZyZWUocHJpbWFyeSk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogVXBkYXRlIHRoZSBiYWNrdXAgY29waWVzIG9mIHRoZSBleHQzIG1ldGFkYXRhLiAgVGhlc2UgZG9uJ3QgbmVlZCB0byBiZSBwYXJ0CisgKiBvZiB0aGUgbWFpbiByZXNpemUgdHJhbnNhY3Rpb24sIGJlY2F1c2UgZTJmc2NrIHdpbGwgcmUtd3JpdGUgdGhlbSBpZiB0aGVyZQorICogaXMgYSBwcm9ibGVtIChiYXNpY2FsbHkgb25seSBPT00gd2lsbCBjYXVzZSBhIHByb2JsZW0pLiAgSG93ZXZlciwgd2UKKyAqIF9zaG91bGRfIHVwZGF0ZSB0aGUgYmFja3VwcyBpZiBwb3NzaWJsZSwgaW4gY2FzZSB0aGUgcHJpbWFyeSBnZXRzIHRyYXNoZWQKKyAqIGZvciBzb21lIHJlYXNvbiBhbmQgd2UgbmVlZCB0byBydW4gZTJmc2NrIGZyb20gYSBiYWNrdXAgc3VwZXJibG9jay4gIFRoZQorICogaW1wb3J0YW50IHBhcnQgaXMgdGhhdCB0aGUgbmV3IGJsb2NrIGFuZCBpbm9kZSBjb3VudHMgYXJlIGluIHRoZSBiYWNrdXAKKyAqIHN1cGVyYmxvY2tzLCBhbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBuZXcgZ3JvdXAgbWV0YWRhdGEgaW4gdGhlIEdEVCBiYWNrdXBzLgorICoKKyAqIFdlIGRvIG5vdCBuZWVkIGxvY2tfc3VwZXIoKSBmb3IgdGhpcywgYmVjYXVzZSB0aGVzZSBibG9ja3MgYXJlIG5vdAorICogb3RoZXJ3aXNlIHRvdWNoZWQgYnkgdGhlIGZpbGVzeXN0ZW0gY29kZSB3aGVuIGl0IGlzIG1vdW50ZWQuICBXZSBkb24ndAorICogbmVlZCB0byB3b3JyeSBhYm91dCBsYXN0IGNoYW5naW5nIGZyb20gc2JpLT5zX2dyb3Vwc19jb3VudCwgYmVjYXVzZSB0aGUKKyAqIHdvcnN0IHRoYXQgY2FuIGhhcHBlbiBpcyB0aGF0IHdlIGRvIG5vdCBjb3B5IHRoZSBmdWxsIG51bWJlciBvZiBiYWNrdXBzCisgKiBhdCB0aGlzIHRpbWUuICBUaGUgcmVzaXplIHdoaWNoIGNoYW5nZWQgc19ncm91cHNfY291bnQgd2lsbCBiYWNrdXAgYWdhaW4uCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9iYWNrdXBzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgICBpbnQgYmxrX29mZiwgY2hhciAqZGF0YSwgaW50IHNpemUpCit7CisJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpID0gRVhUM19TQihzYik7CisJY29uc3QgdW5zaWduZWQgbG9uZyBsYXN0ID0gc2JpLT5zX2dyb3Vwc19jb3VudDsKKwljb25zdCBpbnQgYnBnID0gRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwl1bnNpZ25lZCB0aHJlZSA9IDE7CisJdW5zaWduZWQgZml2ZSA9IDU7CisJdW5zaWduZWQgc2V2ZW4gPSA3OworCXVuc2lnbmVkIGdyb3VwOworCWludCByZXN0ID0gc2ItPnNfYmxvY2tzaXplIC0gc2l6ZTsKKwloYW5kbGVfdCAqaGFuZGxlOworCWludCBlcnIgPSAwLCBlcnIyOworCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0X3NiKHNiLCBFWFQzX01BWF9UUkFOU19EQVRBKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJZ3JvdXAgPSAxOworCQllcnIgPSBQVFJfRVJSKGhhbmRsZSk7CisJCWdvdG8gZXhpdF9lcnI7CisJfQorCisJd2hpbGUgKChncm91cCA9IGV4dDNfbGlzdF9iYWNrdXBzKHNiLCAmdGhyZWUsICZmaXZlLCAmc2V2ZW4pKSA8IGxhc3QpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCQkvKiBPdXQgb2Ygam91cm5hbCBzcGFjZSwgYW5kIGNhbid0IGdldCBtb3JlIC0gYWJvcnQgLSBzbyBzYWQgKi8KKwkJaWYgKGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cyA9PSAwICYmCisJCSAgICBleHQzX2pvdXJuYWxfZXh0ZW5kKGhhbmRsZSwgRVhUM19NQVhfVFJBTlNfREFUQSkgJiYKKwkJICAgIChlcnIgPSBleHQzX2pvdXJuYWxfcmVzdGFydChoYW5kbGUsIEVYVDNfTUFYX1RSQU5TX0RBVEEpKSkKKwkJCWJyZWFrOworCisJCWJoID0gc2JfZ2V0YmxrKHNiLCBncm91cCAqIGJwZyArIGJsa19vZmYpOworCQlleHQzX2RlYnVnKHNiLCBfX0ZVTkNUSU9OX18sICJ1cGRhdGUgbWV0YWRhdGEgYmFja3VwICUjMDRseFxuIiwKKwkJCSAgIGJoLT5iX2Jsb2NrbnIpOworCQlpZiAoKGVyciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpKSkKKwkJCWJyZWFrOworCQlsb2NrX2J1ZmZlcihiaCk7CisJCW1lbWNweShiaC0+Yl9kYXRhLCBkYXRhLCBzaXplKTsKKwkJaWYgKHJlc3QpCisJCQltZW1zZXQoYmgtPmJfZGF0YSArIHNpemUsIDAsIHJlc3QpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwkJYnJlbHNlKGJoKTsKKwl9CisJaWYgKChlcnIyID0gZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKSkgJiYgIWVycikKKwkJZXJyID0gZXJyMjsKKworCS8qCisJICogVWdoISBOZWVkIHRvIGhhdmUgZTJmc2NrIHdyaXRlIHRoZSBiYWNrdXAgY29waWVzLiAgSXQgaXMgdG9vCisJICogbGF0ZSB0byByZXZlcnQgdGhlIHJlc2l6ZSwgd2Ugc2hvdWxkbid0IGZhaWwganVzdCBiZWNhdXNlIG9mCisJICogdGhlIGJhY2t1cCBjb3BpZXMgKHRoZXkgYXJlIG9ubHkgbmVlZGVkIGluIGNhc2Ugb2YgY29ycnVwdGlvbikuCisJICoKKwkgKiBIb3dldmVyLCBpZiB3ZSBnb3QgaGVyZSB3ZSBoYXZlIGEgam91cm5hbCBwcm9ibGVtIHRvbywgc28gd2UKKwkgKiBjYW4ndCByZWFsbHkgc3RhcnQgYSB0cmFuc2FjdGlvbiB0byBtYXJrIHRoZSBzdXBlcmJsb2NrLgorCSAqIENoaWNrZW4gb3V0IGFuZCBqdXN0IHNldCB0aGUgZmxhZyBvbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHdyaXR0ZW4KKwkgKiB0byBkaXNrLCBhbmQgaWYgbm90IC0gd2Ugd2lsbCBzaW1wbHkgd2FpdCB1bnRpbCBuZXh0IGZzY2suCisJICovCitleGl0X2VycjoKKwlpZiAoZXJyKSB7CisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiY2FuJ3QgdXBkYXRlIGJhY2t1cCBmb3IgZ3JvdXAgJWQgKGVyciAlZCksICIKKwkJCSAgICAgImZvcmNpbmcgZnNjayBvbiBuZXh0IHJlYm9vdFxuIiwgZ3JvdXAsIGVycik7CisJCXNiaS0+c19tb3VudF9zdGF0ZSAmPSB+RVhUM19WQUxJRF9GUzsKKwkJc2JpLT5zX2VzLT5zX3N0YXRlICY9IH5jcHVfdG9fbGUxNihFWFQzX1ZBTElEX0ZTKTsKKwkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX3NiaCk7CisJfQorfQorCisvKiBBZGQgZ3JvdXAgZGVzY3JpcHRvciBkYXRhIHRvIGFuIGV4aXN0aW5nIG9yIG5ldyBncm91cCBkZXNjcmlwdG9yIGJsb2NrLgorICogRW5zdXJlIHdlIGhhbmRsZSBhbGwgcG9zc2libGUgZXJyb3IgY29uZGl0aW9ucyBfYmVmb3JlXyB3ZSBzdGFydCBtb2RpZnlpbmcKKyAqIHRoZSBmaWxlc3lzdGVtLCBiZWNhdXNlIHdlIGNhbm5vdCBhYm9ydCB0aGUgdHJhbnNhY3Rpb24gYW5kIG5vdCBoYXZlIGl0CisgKiB3cml0ZSB0aGUgZGF0YSB0byBkaXNrLgorICoKKyAqIElmIHdlIGFyZSBvbiBhIEdEVCBibG9jayBib3VuZGFyeSwgd2UgbmVlZCB0byBnZXQgdGhlIHJlc2VydmVkIEdEVCBibG9jay4KKyAqIE90aGVyd2lzZSwgd2UgbWF5IG5lZWQgdG8gYWRkIGJhY2t1cCBHRFQgYmxvY2tzIGZvciBhIHNwYXJzZSBncm91cC4KKyAqCisgKiBXZSBvbmx5IG5lZWQgdG8gaG9sZCB0aGUgc3VwZXJibG9jayBsb2NrIHdoaWxlIHdlIGFyZSBhY3R1YWxseSBhZGRpbmcKKyAqIGluIHRoZSBuZXcgZ3JvdXAncyBjb3VudHMgdG8gdGhlIHN1cGVyYmxvY2suICBQcmlvciB0byB0aGF0IHdlIGhhdmUKKyAqIG5vdCByZWFsbHkgImFkZGVkIiB0aGUgZ3JvdXAgYXQgYWxsLiAgV2UgcmUtY2hlY2sgdGhhdCB3ZSBhcmUgc3RpbGwKKyAqIGFkZGluZyBpbiB0aGUgbGFzdCBncm91cCBpbiBjYXNlIHRoaW5ncyBoYXZlIGNoYW5nZWQgc2luY2UgdmVyaWZ5aW5nLgorICovCitpbnQgZXh0M19ncm91cF9hZGQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGV4dDNfbmV3X2dyb3VwX2RhdGEgKmlucHV0KQoreworCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSA9IEVYVDNfU0Ioc2IpOworCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcyA9IHNiaS0+c19lczsKKwlpbnQgcmVzZXJ2ZWRfZ2RiID0gZXh0M19iZ19oYXNfc3VwZXIoc2IsIGlucHV0LT5ncm91cCkgPworCQlsZTE2X3RvX2NwdShlcy0+c19yZXNlcnZlZF9nZHRfYmxvY2tzKSA6IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpwcmltYXJ5ID0gTlVMTDsKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICpnZHA7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlpbnQgZ2RiX29mZiwgZ2RiX251bTsKKwlpbnQgZXJyLCBlcnIyOworCisJZ2RiX251bSA9IGlucHV0LT5ncm91cCAvIEVYVDNfREVTQ19QRVJfQkxPQ0soc2IpOworCWdkYl9vZmYgPSBpbnB1dC0+Z3JvdXAgJSBFWFQzX0RFU0NfUEVSX0JMT0NLKHNiKTsKKworCWlmIChnZGJfb2ZmID09IDAgJiYgIUVYVDNfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAorCQkJCQlFWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUikpIHsKKwkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJDYW4ndCByZXNpemUgbm9uLXNwYXJzZSBmaWxlc3lzdGVtIGZ1cnRoZXJcbiIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmIChyZXNlcnZlZF9nZGIgfHwgZ2RiX29mZiA9PSAwKSB7CisJCWlmICghRVhUM19IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsCisJCQkJCSAgICAgRVhUM19GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PREUpKXsKKwkJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJCSAgICAgIk5vIHJlc2VydmVkIEdEVCBibG9ja3MsIGNhbid0IHJlc2l6ZVxuIik7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJCWlub2RlID0gaWdldChzYiwgRVhUM19SRVNJWkVfSU5PKTsKKwkJaWYgKCFpbm9kZSB8fCBpc19iYWRfaW5vZGUoaW5vZGUpKSB7CisJCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgICJFcnJvciBvcGVuaW5nIHJlc2l6ZSBpbm9kZVxuIik7CisJCQlpcHV0KGlub2RlKTsKKwkJCXJldHVybiAtRU5PRU5UOworCQl9CisJfQorCisJaWYgKChlcnIgPSB2ZXJpZnlfZ3JvdXBfaW5wdXQoc2IsIGlucHV0KSkpCisJCWdvdG8gZXhpdF9wdXQ7CisKKwlpZiAoKGVyciA9IHNldHVwX25ld19ncm91cF9ibG9ja3Moc2IsIGlucHV0KSkpCisJCWdvdG8gZXhpdF9wdXQ7CisKKwkvKgorCSAqIFdlIHdpbGwgYWx3YXlzIGJlIG1vZGlmeWluZyBhdCBsZWFzdCB0aGUgc3VwZXJibG9jayBhbmQgYSBHRFQKKwkgKiBibG9jay4gIElmIHdlIGFyZSBhZGRpbmcgYSBncm91cCBwYXN0IHRoZSBsYXN0IGN1cnJlbnQgR0RUIGJsb2NrLAorCSAqIHdlIHdpbGwgYWxzbyBtb2RpZnkgdGhlIGlub2RlIGFuZCB0aGUgZGluZGlyZWN0IGJsb2NrLiAgSWYgd2UKKwkgKiBhcmUgYWRkaW5nIGEgZ3JvdXAgd2l0aCBzdXBlcmJsb2NrL0dEVCBiYWNrdXBzICB3ZSB3aWxsIGFsc28KKwkgKiBtb2RpZnkgZWFjaCBvZiB0aGUgcmVzZXJ2ZWQgR0RUIGRpbmRpcmVjdCBibG9ja3MuCisJICovCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0X3NiKHNiLAorCQkJCSAgICAgICBleHQzX2JnX2hhc19zdXBlcihzYiwgaW5wdXQtPmdyb3VwKSA/CisJCQkJICAgICAgIDMgKyByZXNlcnZlZF9nZGIgOiA0KTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJZXJyID0gUFRSX0VSUihoYW5kbGUpOworCQlnb3RvIGV4aXRfcHV0OworCX0KKworCWxvY2tfc3VwZXIoc2IpOworCWlmIChpbnB1dC0+Z3JvdXAgIT0gRVhUM19TQihzYiktPnNfZ3JvdXBzX2NvdW50KSB7CisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAibXVsdGlwbGUgcmVzaXplcnMgcnVuIG9uIGZpbGVzeXN0ZW0hXG4iKTsKKwkJZ290byBleGl0X2pvdXJuYWw7CisJfQorCisJaWYgKChlcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIHNiaS0+c19zYmgpKSkKKwkJZ290byBleGl0X2pvdXJuYWw7CisKKwkvKgorCSAqIFdlIHdpbGwgb25seSBlaXRoZXIgYWRkIHJlc2VydmVkIGdyb3VwIGJsb2NrcyB0byBhIGJhY2t1cCBncm91cAorCSAqIG9yIHJlbW92ZSByZXNlcnZlZCBibG9ja3MgZm9yIHRoZSBmaXJzdCBncm91cCBpbiBhIG5ldyBncm91cCBibG9jay4KKwkgKiBEb2luZyBib3RoIHdvdWxkIGJlIG1lYW4gbW9yZSBjb21wbGV4IGNvZGUsIGFuZCBzYW5lIHBlb3BsZSBkb24ndAorCSAqIHVzZSBub24tc3BhcnNlIGZpbGVzeXN0ZW1zIGFueW1vcmUuICBUaGlzIGlzIGFscmVhZHkgY2hlY2tlZCBhYm92ZS4KKwkgKi8KKwlpZiAoZ2RiX29mZikgeworCQlwcmltYXJ5ID0gc2JpLT5zX2dyb3VwX2Rlc2NbZ2RiX251bV07CisJCWlmICgoZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBwcmltYXJ5KSkpCisJCQlnb3RvIGV4aXRfam91cm5hbDsKKworCQlpZiAocmVzZXJ2ZWRfZ2RiICYmIGV4dDNfYmdfbnVtX2dkYihzYiwgaW5wdXQtPmdyb3VwKSAmJgorCQkgICAgKGVyciA9IHJlc2VydmVfYmFja3VwX2dkYihoYW5kbGUsIGlub2RlLCBpbnB1dCkpKQorCQkJZ290byBleGl0X2pvdXJuYWw7CisJfSBlbHNlIGlmICgoZXJyID0gYWRkX25ld19nZGIoaGFuZGxlLCBpbm9kZSwgaW5wdXQsICZwcmltYXJ5KSkpCisJCWdvdG8gZXhpdF9qb3VybmFsOworCisJLyoKKwkgKiBPSywgbm93IHdlJ3ZlIHNldCB1cCB0aGUgbmV3IGdyb3VwLiAgVGltZSB0byBtYWtlIGl0IGFjdGl2ZS4KKwkgKgorCSAqIEN1cnJlbnQga2VybmVscyBkb24ndCBsb2NrIGFsbCBhbGxvY2F0aW9ucyB2aWEgbG9ja19zdXBlcigpLAorCSAqIHNvIHdlIGhhdmUgdG8gYmUgc2FmZSB3cnQuIGNvbmN1cnJlbnQgYWNjZXNzZXMgdGhlIGdyb3VwCisJICogZGF0YS4gIFNvIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCB0byBzZXQgYWxsIG9mIHRoZSByZWxldmFudAorCSAqIGdyb3VwIGRlc2NyaXB0b3IgZGF0YSBldGMuICpiZWZvcmUqIHdlIGVuYWJsZSB0aGUgZ3JvdXAuCisJICoKKwkgKiBUaGUga2V5IGZpZWxkIGhlcmUgaXMgRVhUM19TQihzYiktPnNfZ3JvdXBzX2NvdW50OiBhcyBsb25nIGFzCisJICogdGhhdCByZXRhaW5zIGl0cyBvbGQgdmFsdWUsIG5vYm9keSBpcyBnb2luZyB0byBhY2Nlc3MgdGhlIG5ldworCSAqIGdyb3VwLgorCSAqCisJICogU28gZmlyc3Qgd2UgdXBkYXRlIGFsbCB0aGUgZGVzY3JpcHRvciBtZXRhZGF0YSBmb3IgdGhlIG5ldworCSAqIGdyb3VwOyB0aGVuIHdlIHVwZGF0ZSB0aGUgdG90YWwgZGlzayBibG9ja3MgY291bnQ7IHRoZW4gd2UKKwkgKiB1cGRhdGUgdGhlIGdyb3VwcyBjb3VudCB0byBlbmFibGUgdGhlIGdyb3VwOyB0aGVuIGZpbmFsbHkgd2UKKwkgKiB1cGRhdGUgdGhlIGZyZWUgc3BhY2UgY291bnRzIHNvIHRoYXQgdGhlIHN5c3RlbSBjYW4gc3RhcnQKKwkgKiB1c2luZyB0aGUgbmV3IGRpc2sgYmxvY2tzLgorCSAqLworCisJLyogVXBkYXRlIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2sgZm9yIG5ldyBncm91cCAqLworCWdkcCA9IChzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICopcHJpbWFyeS0+Yl9kYXRhICsgZ2RiX29mZjsKKworCWdkcC0+YmdfYmxvY2tfYml0bWFwID0gY3B1X3RvX2xlMzIoaW5wdXQtPmJsb2NrX2JpdG1hcCk7CisJZ2RwLT5iZ19pbm9kZV9iaXRtYXAgPSBjcHVfdG9fbGUzMihpbnB1dC0+aW5vZGVfYml0bWFwKTsKKwlnZHAtPmJnX2lub2RlX3RhYmxlID0gY3B1X3RvX2xlMzIoaW5wdXQtPmlub2RlX3RhYmxlKTsKKwlnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50ID0gY3B1X3RvX2xlMTYoaW5wdXQtPmZyZWVfYmxvY2tzX2NvdW50KTsKKwlnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50ID0gY3B1X3RvX2xlMTYoRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKSk7CisKKwkvKgorCSAqIE1ha2UgdGhlIG5ldyBibG9ja3MgYW5kIGlub2RlcyB2YWxpZCBuZXh0LiAgV2UgZG8gdGhpcyBiZWZvcmUKKwkgKiBpbmNyZWFzaW5nIHRoZSBncm91cCBjb3VudCBzbyB0aGF0IG9uY2UgdGhlIGdyb3VwIGlzIGVuYWJsZWQsCisJICogYWxsIG9mIGl0cyBibG9ja3MgYW5kIGlub2RlcyBhcmUgYWxyZWFkeSB2YWxpZC4KKwkgKgorCSAqIFdlIGFsd2F5cyBhbGxvY2F0ZSBncm91cC1ieS1ncm91cCwgdGhlbiBibG9jay1ieS1ibG9jayBvcgorCSAqIGlub2RlLWJ5LWlub2RlIHdpdGhpbiBhIGdyb3VwLCBzbyBlbmFibGluZyB0aGVzZQorCSAqIGJsb2Nrcy9pbm9kZXMgYmVmb3JlIHRoZSBncm91cCBpcyBsaXZlIHdvbid0IGFjdHVhbGx5IGxldCB1cworCSAqIGFsbG9jYXRlIHRoZSBuZXcgc3BhY2UgeWV0LgorCSAqLworCWVzLT5zX2Jsb2Nrc19jb3VudCA9IGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkgKworCQlpbnB1dC0+YmxvY2tzX2NvdW50KTsKKwllcy0+c19pbm9kZXNfY291bnQgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfY291bnQpICsKKwkJRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKSk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gcHJvdGVjdCBzX2dyb3Vwc19jb3VudCBhZ2FpbnN0IG90aGVyIENQVXMgc2VlaW5nCisJICogaW5jb25zaXN0ZW50IHN0YXRlIGluIHRoZSBzdXBlcmJsb2NrLgorCSAqCisJICogVGhlIHByZWNpc2UgcnVsZXMgd2UgdXNlIGFyZToKKwkgKgorCSAqICogV3JpdGVycyBvZiBzX2dyb3Vwc19jb3VudCAqbXVzdCogaG9sZCBsb2NrX3N1cGVyCisJICogQU5ECisJICogKiBXcml0ZXJzIG11c3QgcGVyZm9ybSBhIHNtcF93bWIoKSBhZnRlciB1cGRhdGluZyBhbGwgZGVwZW5kZW50CisJICogICBkYXRhIGFuZCBiZWZvcmUgbW9kaWZ5aW5nIHRoZSBncm91cHMgY291bnQKKwkgKgorCSAqICogUmVhZGVycyBtdXN0IGhvbGQgbG9ja19zdXBlcigpIG92ZXIgdGhlIGFjY2VzcworCSAqIE9SCisJICogKiBSZWFkZXJzIG11c3QgcGVyZm9ybSBhbiBzbXBfcm1iKCkgYWZ0ZXIgcmVhZGluZyB0aGUgZ3JvdXBzIGNvdW50CisJICogICBhbmQgYmVmb3JlIHJlYWRpbmcgYW55IGRlcGVuZGVudCBkYXRhLgorCSAqCisJICogTkIuIFRoZXNlIHJ1bGVzIGNhbiBiZSByZWxheGVkIHdoZW4gY2hlY2tpbmcgdGhlIGdyb3VwIGNvdW50CisJICogd2hpbGUgZnJlZWluZyBkYXRhLCBhcyB3ZSBjYW4gb25seSBhbGxvY2F0ZSBmcm9tIGEgYmxvY2sKKwkgKiBncm91cCBhZnRlciBzZXJpYWxpc2luZyBhZ2FpbnN0IHRoZSBncm91cCBjb3VudCwgYW5kIHdlIGNhbgorCSAqIG9ubHkgdGhlbiBmcmVlIGFmdGVyIHNlcmlhbGlzaW5nIGluIHR1cm4gYWdhaW5zdCB0aGF0CisJICogYWxsb2NhdGlvbi4KKwkgKi8KKwlzbXBfd21iKCk7CisKKwkvKiBVcGRhdGUgdGhlIGdsb2JhbCBmcyBzaXplIGZpZWxkcyAqLworCUVYVDNfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudCsrOworCisJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgcHJpbWFyeSk7CisKKwkvKiBVcGRhdGUgdGhlIHJlc2VydmVkIGJsb2NrIGNvdW50cyBvbmx5IG9uY2UgdGhlIG5ldyBncm91cCBpcworCSAqIGFjdGl2ZS4gKi8KKwllcy0+c19yX2Jsb2Nrc19jb3VudCA9IGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KGVzLT5zX3JfYmxvY2tzX2NvdW50KSArCisJCWlucHV0LT5yZXNlcnZlZF9ibG9ja3MpOworCisJLyogVXBkYXRlIHRoZSBmcmVlIHNwYWNlIGNvdW50cyAqLworCXBlcmNwdV9jb3VudGVyX21vZCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwKKwkJCSAgIGlucHV0LT5mcmVlX2Jsb2Nrc19jb3VudCk7CisJcGVyY3B1X2NvdW50ZXJfbW9kKCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyLAorCQkJICAgRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKSk7CisKKwlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBFWFQzX1NCKHNiKS0+c19zYmgpOworCXNiLT5zX2RpcnQgPSAxOworCitleGl0X2pvdXJuYWw6CisJdW5sb2NrX3N1cGVyKHNiKTsKKwlpZiAoKGVycjIgPSBleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpKSAmJiAhZXJyKQorCQllcnIgPSBlcnIyOworCWlmICghZXJyKSB7CisJCXVwZGF0ZV9iYWNrdXBzKHNiLCBzYmktPnNfc2JoLT5iX2Jsb2NrbnIsIChjaGFyICopZXMsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrKSk7CisJCXVwZGF0ZV9iYWNrdXBzKHNiLCBwcmltYXJ5LT5iX2Jsb2NrbnIsIHByaW1hcnktPmJfZGF0YSwKKwkJCSAgICAgICBwcmltYXJ5LT5iX3NpemUpOworCX0KK2V4aXRfcHV0OgorCWlwdXQoaW5vZGUpOworCXJldHVybiBlcnI7Cit9IC8qIGV4dDNfZ3JvdXBfYWRkICovCisKKy8qIEV4dGVuZCB0aGUgZmlsZXN5c3RlbSB0byB0aGUgbmV3IG51bWJlciBvZiBibG9ja3Mgc3BlY2lmaWVkLiAgVGhpcyBlbnRyeQorICogcG9pbnQgaXMgb25seSB1c2VkIHRvIGV4dGVuZCB0aGUgY3VycmVudCBmaWxlc3lzdGVtIHRvIHRoZSBlbmQgb2YgdGhlIGxhc3QKKyAqIGV4aXN0aW5nIGdyb3VwLiAgSXQgY2FuIGJlIGFjY2Vzc2VkIHZpYSBpb2N0bCwgb3IgYnkgInJlbW91bnQscmVzaXplPTxzaXplPiIKKyAqIGZvciBlbWVyZ2VuY2llcyAoYmVjYXVzZSBpdCBoYXMgbm8gZGVwZW5kZW5jaWVzIG9uIHJlc2VydmVkIGJsb2NrcykuCisgKgorICogSWYgd2UgX3JlYWxseV8gd2FudGVkLCB3ZSBjb3VsZCB1c2UgZGVmYXVsdCB2YWx1ZXMgdG8gY2FsbCBleHQzX2dyb3VwX2FkZCgpCisgKiBhbGxvdyB0aGUgInJlbW91bnQiIHRyaWNrIHRvIHdvcmsgZm9yIGFyYml0cmFyeSByZXNpemluZywgYXNzdW1pbmcgZW5vdWdoCisgKiBHRFQgYmxvY2tzIGFyZSByZXNlcnZlZCB0byBncm93IHRvIHRoZSBkZXNpcmVkIHNpemUuCisgKi8KK2ludCBleHQzX2dyb3VwX2V4dGVuZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXMsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgbl9ibG9ja3NfY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBvX2Jsb2Nrc19jb3VudDsKKwl1bnNpZ25lZCBsb25nIG9fZ3JvdXBzX2NvdW50OworCXVuc2lnbmVkIGxvbmcgbGFzdDsKKwlpbnQgYWRkOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCWhhbmRsZV90ICpoYW5kbGU7CisJaW50IGVyciwgZnJlZWRfYmxvY2tzOworCisJLyogV2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBsb2NraW5nIHdydCBvdGhlciByZXNpemVycyBqdXN0CisJICogeWV0OiB3ZSdyZSBnb2luZyB0byByZXZhbGlkYXRlIGVzLT5zX2Jsb2Nrc19jb3VudCBhZnRlcgorCSAqIHRha2luZyBsb2NrX3N1cGVyKCkgYmVsb3cuICovCisJb19ibG9ja3NfY291bnQgPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpOworCW9fZ3JvdXBzX2NvdW50ID0gRVhUM19TQihzYiktPnNfZ3JvdXBzX2NvdW50OworCisJaWYgKHRlc3Rfb3B0KHNiLCBERUJVRykpCisJCXByaW50ayhLRVJOX0RFQlVHICJFWFQzLWZzOiBleHRlbmRpbmcgbGFzdCBncm91cCBmcm9tICVsdSB0byAlbHUgYmxvY2tzXG4iLAorCQkgICAgICAgb19ibG9ja3NfY291bnQsIG5fYmxvY2tzX2NvdW50KTsKKworCWlmIChuX2Jsb2Nrc19jb3VudCA9PSAwIHx8IG5fYmxvY2tzX2NvdW50ID09IG9fYmxvY2tzX2NvdW50KQorCQlyZXR1cm4gMDsKKworCWlmIChuX2Jsb2Nrc19jb3VudCA8IG9fYmxvY2tzX2NvdW50KSB7CisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiY2FuJ3Qgc2hyaW5rIEZTIC0gcmVzaXplIGFib3J0ZWQiKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBIYW5kbGUgdGhlIHJlbWFpbmluZyBibG9ja3MgaW4gdGhlIGxhc3QgZ3JvdXAgb25seS4gKi8KKwlsYXN0ID0gKG9fYmxvY2tzX2NvdW50IC0gbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykpICUKKwkJRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKworCWlmIChsYXN0ID09IDApIHsKKwkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJuZWVkIHRvIHVzZSBleHQyb25saW5lIHRvIHJlc2l6ZSBmdXJ0aGVyXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlhZGQgPSBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gbGFzdDsKKworCWlmIChvX2Jsb2Nrc19jb3VudCArIGFkZCA+IG5fYmxvY2tzX2NvdW50KQorCQlhZGQgPSBuX2Jsb2Nrc19jb3VudCAtIG9fYmxvY2tzX2NvdW50OworCisJaWYgKG9fYmxvY2tzX2NvdW50ICsgYWRkIDwgbl9ibG9ja3NfY291bnQpCisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAid2lsbCBvbmx5IGZpbmlzaCBncm91cCAoJWx1IGJsb2NrcywgJXUgbmV3KSIsCisJCQkgICAgIG9fYmxvY2tzX2NvdW50ICsgYWRkLCBhZGQpOworCisJLyogU2VlIGlmIHRoZSBkZXZpY2UgaXMgYWN0dWFsbHkgYXMgYmlnIGFzIHdoYXQgd2FzIHJlcXVlc3RlZCAqLworCWJoID0gc2JfYnJlYWQoc2IsIG9fYmxvY2tzX2NvdW50ICsgYWRkIC0xKTsKKwlpZiAoIWJoKSB7CisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiY2FuJ3QgcmVhZCBsYXN0IGJsb2NrLCByZXNpemUgYWJvcnRlZCIpOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisJYnJlbHNlKGJoKTsKKworCS8qIFdlIHdpbGwgdXBkYXRlIHRoZSBzdXBlcmJsb2NrLCBvbmUgYmxvY2sgYml0bWFwLCBhbmQKKwkgKiBvbmUgZ3JvdXAgZGVzY3JpcHRvciB2aWEgZXh0M19mcmVlX2Jsb2NrcygpLgorCSAqLworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydF9zYihzYiwgMyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCWVyciA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sICJlcnJvciAlZCBvbiBqb3VybmFsIHN0YXJ0IixlcnIpOworCQlnb3RvIGV4aXRfcHV0OworCX0KKworCWxvY2tfc3VwZXIoc2IpOworCWlmIChvX2Jsb2Nrc19jb3VudCAhPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpKSB7CisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAibXVsdGlwbGUgcmVzaXplcnMgcnVuIG9uIGZpbGVzeXN0ZW0hXG4iKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIGV4aXRfcHV0OworCX0KKworCWlmICgoZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLAorCQkJCQkJIEVYVDNfU0Ioc2IpLT5zX3NiaCkpKSB7CisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiZXJyb3IgJWQgb24gam91cm5hbCB3cml0ZSBhY2Nlc3MiLCBlcnIpOworCQl1bmxvY2tfc3VwZXIoc2IpOworCQlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCQlnb3RvIGV4aXRfcHV0OworCX0KKwllcy0+c19ibG9ja3NfY291bnQgPSBjcHVfdG9fbGUzMihvX2Jsb2Nrc19jb3VudCArIGFkZCk7CisJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUM19TQihzYiktPnNfc2JoKTsKKwlzYi0+c19kaXJ0ID0gMTsKKwl1bmxvY2tfc3VwZXIoc2IpOworCWV4dDNfZGVidWcoImZyZWVpbmcgYmxvY2tzICVsZCB0aHJvdWdoICVsZFxuIiwgb19ibG9ja3NfY291bnQsCisJCSAgIG9fYmxvY2tzX2NvdW50ICsgYWRkKTsKKwlleHQzX2ZyZWVfYmxvY2tzX3NiKGhhbmRsZSwgc2IsIG9fYmxvY2tzX2NvdW50LCBhZGQsICZmcmVlZF9ibG9ja3MpOworCWV4dDNfZGVidWcoImZyZWVkIGJsb2NrcyAlbGQgdGhyb3VnaCAlbGRcbiIsIG9fYmxvY2tzX2NvdW50LAorCQkgICBvX2Jsb2Nrc19jb3VudCArIGFkZCk7CisJaWYgKChlcnIgPSBleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpKSkKKwkJZ290byBleGl0X3B1dDsKKwlpZiAodGVzdF9vcHQoc2IsIERFQlVHKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYVDMtZnM6IGV4dGVuZGVkIGdyb3VwIHRvICV1IGJsb2Nrc1xuIiwKKwkJICAgICAgIGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkpOworCXVwZGF0ZV9iYWNrdXBzKHNiLCBFWFQzX1NCKHNiKS0+c19zYmgtPmJfYmxvY2tuciwgKGNoYXIgKillcywKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jaykpOworZXhpdF9wdXQ6CisJcmV0dXJuIGVycjsKK30gLyogZXh0M19ncm91cF9leHRlbmQgKi8KZGlmZiAtLWdpdCBhL2ZzL2V4dDMvc3VwZXIuYyBiL2ZzL2V4dDMvc3VwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDViNDQwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0My9zdXBlci5jCkBAIC0wLDAgKzEsMjUzOSBAQAorLyoKKyAqICBsaW51eC9mcy9leHQzL3N1cGVyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvbWluaXgvaW5vZGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIEJpZy1lbmRpYW4gdG8gbGl0dGxlLWVuZGlhbiBieXRlLXN3YXBwaW5nL2JpdG1hcHMgYnkKKyAqICAgICAgICBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpLCAxOTk1CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSAieGF0dHIuaCIKKyNpbmNsdWRlICJhY2wuaCIKKworc3RhdGljIGludCBleHQzX2xvYWRfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKik7CitzdGF0aWMgaW50IGV4dDNfY3JlYXRlX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICosCisJCQkgICAgICAgaW50KTsKK3N0YXRpYyB2b2lkIGV4dDNfY29tbWl0X3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCSAgICAgICBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzLAorCQkJICAgICAgIGludCBzeW5jKTsKK3N0YXRpYyB2b2lkIGV4dDNfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCQkJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlcyk7CitzdGF0aWMgdm9pZCBleHQzX2NsZWFyX2pvdXJuYWxfZXJyKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAorCQkJCSAgIHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICogZXMpOworc3RhdGljIGludCBleHQzX3N5bmNfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpOworc3RhdGljIGNvbnN0IGNoYXIgKmV4dDNfZGVjb2RlX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBpbnQgZXJybm8sCisJCQkJICAgICBjaGFyIG5idWZbMTZdKTsKK3N0YXRpYyBpbnQgZXh0M19yZW1vdW50IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgaW50ICogZmxhZ3MsIGNoYXIgKiBkYXRhKTsKK3N0YXRpYyBpbnQgZXh0M19zdGF0ZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBzdHJ1Y3Qga3N0YXRmcyAqIGJ1Zik7CitzdGF0aWMgdm9pZCBleHQzX3VubG9ja2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworc3RhdGljIHZvaWQgZXh0M193cml0ZV9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpOworc3RhdGljIHZvaWQgZXh0M193cml0ZV9zdXBlcl9sb2NrZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CisKKy8qIAorICogV3JhcHBlcnMgZm9yIGpvdXJuYWxfc3RhcnQvZW5kLgorICoKKyAqIFRoZSBvbmx5IHNwZWNpYWwgdGhpbmcgd2UgbmVlZCB0byBkbyBoZXJlIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbAorICogam91cm5hbF9lbmQgY2FsbHMgcmVzdWx0IGluIHRoZSBzdXBlcmJsb2NrIGJlaW5nIG1hcmtlZCBkaXJ0eSwgc28KKyAqIHRoYXQgc3luYygpIHdpbGwgY2FsbCB0aGUgZmlsZXN5c3RlbSdzIHdyaXRlX3N1cGVyIGNhbGxiYWNrIGlmCisgKiBhcHByb3ByaWF0ZS4gCisgKi8KK2hhbmRsZV90ICpleHQzX2pvdXJuYWxfc3RhcnRfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG5ibG9ja3MpCit7CisJam91cm5hbF90ICpqb3VybmFsOworCisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlyZXR1cm4gRVJSX1BUUigtRVJPRlMpOworCisJLyogU3BlY2lhbCBjYXNlIGhlcmU6IGlmIHRoZSBqb3VybmFsIGhhcyBhYm9ydGVkIGJlaGluZCBvdXIKKwkgKiBiYWNrcyAoZWcuIEVJTyBpbiB0aGUgY29tbWl0IHRocmVhZCksIHRoZW4gd2Ugc3RpbGwgbmVlZCB0bworCSAqIHRha2UgdGhlIEZTIGl0c2VsZiByZWFkb25seSBjbGVhbmx5LiAqLworCWpvdXJuYWwgPSBFWFQzX1NCKHNiKS0+c19qb3VybmFsOworCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKKwkJZXh0M19hYm9ydChzYiwgX19GVU5DVElPTl9fLAorCQkJICAgIkRldGVjdGVkIGFib3J0ZWQgam91cm5hbCIpOworCQlyZXR1cm4gRVJSX1BUUigtRVJPRlMpOworCX0KKworCXJldHVybiBqb3VybmFsX3N0YXJ0KGpvdXJuYWwsIG5ibG9ja3MpOworfQorCisvKiAKKyAqIFRoZSBvbmx5IHNwZWNpYWwgdGhpbmcgd2UgbmVlZCB0byBkbyBoZXJlIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbAorICogam91cm5hbF9zdG9wIGNhbGxzIHJlc3VsdCBpbiB0aGUgc3VwZXJibG9jayBiZWluZyBtYXJrZWQgZGlydHksIHNvCisgKiB0aGF0IHN5bmMoKSB3aWxsIGNhbGwgdGhlIGZpbGVzeXN0ZW0ncyB3cml0ZV9zdXBlciBjYWxsYmFjayBpZgorICogYXBwcm9wcmlhdGUuIAorICovCitpbnQgX19leHQzX2pvdXJuYWxfc3RvcChjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCWludCBlcnI7CisJaW50IHJjOworCisJc2IgPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb24tPnRfam91cm5hbC0+al9wcml2YXRlOworCWVyciA9IGhhbmRsZS0+aF9lcnI7CisJcmMgPSBqb3VybmFsX3N0b3AoaGFuZGxlKTsKKworCWlmICghZXJyKQorCQllcnIgPSByYzsKKwlpZiAoZXJyKQorCQlfX2V4dDNfc3RkX2Vycm9yKHNiLCB3aGVyZSwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIGV4dDNfam91cm5hbF9hYm9ydF9oYW5kbGUoY29uc3QgY2hhciAqY2FsbGVyLCBjb25zdCBjaGFyICplcnJfZm4sCisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGhhbmRsZV90ICpoYW5kbGUsIGludCBlcnIpCit7CisJY2hhciBuYnVmWzE2XTsKKwljb25zdCBjaGFyICplcnJzdHIgPSBleHQzX2RlY29kZV9lcnJvcihOVUxMLCBlcnIsIG5idWYpOworCisJaWYgKGJoKQorCQlCVUZGRVJfVFJBQ0UoYmgsICJhYm9ydCIpOworCisJaWYgKCFoYW5kbGUtPmhfZXJyKQorCQloYW5kbGUtPmhfZXJyID0gZXJyOworCisJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IGFib3J0aW5nIHRyYW5zYWN0aW9uOiAlcyBpbiAlc1xuIiwKKwkgICAgICAgY2FsbGVyLCBlcnJzdHIsIGVycl9mbik7CisKKwlqb3VybmFsX2Fib3J0X2hhbmRsZShoYW5kbGUpOworfQorCisvKiBEZWFsIHdpdGggdGhlIHJlcG9ydGluZyBvZiBmYWlsdXJlIGNvbmRpdGlvbnMgb24gYSBmaWxlc3lzdGVtIHN1Y2ggYXMKKyAqIGluY29uc2lzdGVuY2llcyBkZXRlY3RlZCBvciByZWFkIElPIGZhaWx1cmVzLgorICoKKyAqIE9uIGV4dDIsIHdlIGNhbiBzdG9yZSB0aGUgZXJyb3Igc3RhdGUgb2YgdGhlIGZpbGVzeXN0ZW0gaW4gdGhlCisgKiBzdXBlcmJsb2NrLiAgVGhhdCBpcyBub3QgcG9zc2libGUgb24gZXh0MywgYmVjYXVzZSB3ZSBtYXkgaGF2ZSBvdGhlcgorICogd3JpdGUgb3JkZXJpbmcgY29uc3RyYWludHMgb24gdGhlIHN1cGVyYmxvY2sgd2hpY2ggcHJldmVudCB1cyBmcm9tCisgKiB3cml0aW5nIGl0IG91dCBzdHJhaWdodCBhd2F5OyBhbmQgZ2l2ZW4gdGhhdCB0aGUgam91cm5hbCBpcyBhYm91dCB0bworICogYmUgYWJvcnRlZCwgd2UgY2FuJ3QgcmVseSBvbiB0aGUgY3VycmVudCwgb3IgZnV0dXJlLCB0cmFuc2FjdGlvbnMgdG8KKyAqIHdyaXRlIG91dCB0aGUgc3VwZXJibG9jayBzYWZlbHkuCisgKgorICogV2UnbGwganVzdCB1c2UgdGhlIGpvdXJuYWxfYWJvcnQoKSBlcnJvciBjb2RlIHRvIHJlY29yZCBhbiBlcnJvciBpbgorICogdGhlIGpvdXJuYWwgaW5zdGVhZC4gIE9uIHJlY292ZXJ5LCB0aGUgam91cm5hbCB3aWxsIGNvbXBhaW4gYWJvdXQKKyAqIHRoYXQgZXJyb3IgdW50aWwgd2UndmUgbm90ZWQgaXQgZG93biBhbmQgY2xlYXJlZCBpdC4KKyAqLworCitzdGF0aWMgdm9pZCBleHQzX2hhbmRsZV9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcyA9IEVYVDNfU0Ioc2IpLT5zX2VzOworCisJRVhUM19TQihzYiktPnNfbW91bnRfc3RhdGUgfD0gRVhUM19FUlJPUl9GUzsKKwllcy0+c19zdGF0ZSB8PSBjcHVfdG9fbGUxNihFWFQzX0VSUk9SX0ZTKTsKKworCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkKKwkJcmV0dXJuOworCisJaWYgKHRlc3Rfb3B0IChzYiwgRVJST1JTX1JPKSkgeworCQlwcmludGsgKEtFUk5fQ1JJVCAiUmVtb3VudGluZyBmaWxlc3lzdGVtIHJlYWQtb25seVxuIik7CisJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKwl9IGVsc2UgeworCQlqb3VybmFsX3QgKmpvdXJuYWwgPSBFWFQzX1NCKHNiKS0+c19qb3VybmFsOworCisJCUVYVDNfU0Ioc2IpLT5zX21vdW50X29wdCB8PSBFWFQzX01PVU5UX0FCT1JUOworCQlpZiAoam91cm5hbCkKKwkJCWpvdXJuYWxfYWJvcnQoam91cm5hbCwgLUVJTyk7CisJfQorCWlmICh0ZXN0X29wdChzYiwgRVJST1JTX1BBTklDKSkKKwkJcGFuaWMoIkVYVDMtZnMgKGRldmljZSAlcyk6IHBhbmljIGZvcmNlZCBhZnRlciBlcnJvclxuIiwKKwkJCXNiLT5zX2lkKTsKKwlleHQzX2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOworfQorCit2b2lkIGV4dDNfZXJyb3IgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBjb25zdCBjaGFyICogZnVuY3Rpb24sCisJCSBjb25zdCBjaGFyICogZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlwcmludGsoS0VSTl9DUklUICJFWFQzLWZzIGVycm9yIChkZXZpY2UgJXMpOiAlczogIixzYi0+c19pZCwgZnVuY3Rpb24pOworCXZwcmludGsoZm10LCBhcmdzKTsKKwlwcmludGsoIlxuIik7CisJdmFfZW5kKGFyZ3MpOworCisJZXh0M19oYW5kbGVfZXJyb3Ioc2IpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZXh0M19kZWNvZGVfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGludCBlcnJubywKKwkJCQkgICAgIGNoYXIgbmJ1ZlsxNl0pCit7CisJY2hhciAqZXJyc3RyID0gTlVMTDsKKworCXN3aXRjaCAoZXJybm8pIHsKKwljYXNlIC1FSU86CisJCWVycnN0ciA9ICJJTyBmYWlsdXJlIjsKKwkJYnJlYWs7CisJY2FzZSAtRU5PTUVNOgorCQllcnJzdHIgPSAiT3V0IG9mIG1lbW9yeSI7CisJCWJyZWFrOworCWNhc2UgLUVST0ZTOgorCQlpZiAoIXNiIHx8IEVYVDNfU0Ioc2IpLT5zX2pvdXJuYWwtPmpfZmxhZ3MgJiBKRlNfQUJPUlQpCisJCQllcnJzdHIgPSAiSm91cm5hbCBoYXMgYWJvcnRlZCI7CisJCWVsc2UKKwkJCWVycnN0ciA9ICJSZWFkb25seSBmaWxlc3lzdGVtIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogSWYgdGhlIGNhbGxlciBwYXNzZWQgaW4gYW4gZXh0cmEgYnVmZmVyIGZvciB1bmtub3duCisJCSAqIGVycm9ycywgdGV4dHVhbGlzZSB0aGVtIG5vdy4gIEVsc2Ugd2UganVzdCByZXR1cm4KKwkJICogTlVMTC4gKi8KKwkJaWYgKG5idWYpIHsKKwkJCS8qIENoZWNrIGZvciB0cnVuY2F0ZWQgZXJyb3IgY29kZXMuLi4gKi8KKwkJCWlmIChzbnByaW50ZihuYnVmLCAxNiwgImVycm9yICVkIiwgLWVycm5vKSA+PSAwKQorCQkJCWVycnN0ciA9IG5idWY7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycnN0cjsKK30KKworLyogX19leHQzX3N0ZF9lcnJvciBkZWNvZGVzIGV4cGVjdGVkIGVycm9ycyBmcm9tIGpvdXJuYWxpbmcgZnVuY3Rpb25zCisgKiBhdXRvbWF0aWNhbGx5IGFuZCBpbnZva2VzIHRoZSBhcHByb3ByaWF0ZSBlcnJvciByZXNwb25zZS4gICovCisKK3ZvaWQgX19leHQzX3N0ZF9lcnJvciAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGNvbnN0IGNoYXIgKiBmdW5jdGlvbiwKKwkJICAgICAgIGludCBlcnJubykKK3sKKwljaGFyIG5idWZbMTZdOworCWNvbnN0IGNoYXIgKmVycnN0ciA9IGV4dDNfZGVjb2RlX2Vycm9yKHNiLCBlcnJubywgbmJ1Zik7CisKKwlwcmludGsgKEtFUk5fQ1JJVCAiRVhUMy1mcyBlcnJvciAoZGV2aWNlICVzKSBpbiAlczogJXNcbiIsCisJCXNiLT5zX2lkLCBmdW5jdGlvbiwgZXJyc3RyKTsKKworCWV4dDNfaGFuZGxlX2Vycm9yKHNiKTsKK30KKworLyoKKyAqIGV4dDNfYWJvcnQgaXMgYSBtdWNoIHN0cm9uZ2VyIGZhaWx1cmUgaGFuZGxlciB0aGFuIGV4dDNfZXJyb3IuICBUaGUKKyAqIGFib3J0IGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIGRlYWwgd2l0aCB1bnJlY292ZXJhYmxlIGZhaWx1cmVzIHN1Y2gKKyAqIGFzIGpvdXJuYWwgSU8gZXJyb3JzIG9yIEVOT01FTSBhdCBhIGNyaXRpY2FsIG1vbWVudCBpbiBsb2cgbWFuYWdlbWVudC4KKyAqCisgKiBXZSB1bmNvbmRpdGlvbmFsbHkgZm9yY2UgdGhlIGZpbGVzeXN0ZW0gaW50byBhbiBBQk9SVHxSRUFET05MWSBzdGF0ZSwKKyAqIHVubGVzcyB0aGUgZXJyb3IgcmVzcG9uc2Ugb24gdGhlIGZzIGhhcyBiZWVuIHNldCB0byBwYW5pYyBpbiB3aGljaAorICogY2FzZSB3ZSB0YWtlIHRoZSBlYXN5IHdheSBvdXQgYW5kIHBhbmljIGltbWVkaWF0ZWx5LgorICovCisKK3ZvaWQgZXh0M19hYm9ydCAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGNvbnN0IGNoYXIgKiBmdW5jdGlvbiwKKwkJIGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwlwcmludGsgKEtFUk5fQ1JJVCAiZXh0M19hYm9ydCBjYWxsZWQuXG4iKTsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcHJpbnRrKEtFUk5fQ1JJVCAiRVhUMy1mcyBlcnJvciAoZGV2aWNlICVzKTogJXM6ICIsc2ItPnNfaWQsIGZ1bmN0aW9uKTsKKwl2cHJpbnRrKGZtdCwgYXJncyk7CisJcHJpbnRrKCJcbiIpOworCXZhX2VuZChhcmdzKTsKKworCWlmICh0ZXN0X29wdChzYiwgRVJST1JTX1BBTklDKSkKKwkJcGFuaWMoIkVYVDMtZnMgcGFuaWMgZnJvbSBwcmV2aW91cyBlcnJvclxuIik7CisKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0NSSVQgIlJlbW91bnRpbmcgZmlsZXN5c3RlbSByZWFkLW9ubHlcbiIpOworCUVYVDNfU0Ioc2IpLT5zX21vdW50X3N0YXRlIHw9IEVYVDNfRVJST1JfRlM7CisJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCUVYVDNfU0Ioc2IpLT5zX21vdW50X29wdCB8PSBFWFQzX01PVU5UX0FCT1JUOworCWpvdXJuYWxfYWJvcnQoRVhUM19TQihzYiktPnNfam91cm5hbCwgLUVJTyk7Cit9CisKK3ZvaWQgZXh0M193YXJuaW5nIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3QgY2hhciAqIGZ1bmN0aW9uLAorCQkgICBjb25zdCBjaGFyICogZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQzLWZzIHdhcm5pbmcgKGRldmljZSAlcyk6ICVzOiAiLAorCSAgICAgICBzYi0+c19pZCwgZnVuY3Rpb24pOworCXZwcmludGsoZm10LCBhcmdzKTsKKwlwcmludGsoIlxuIik7CisJdmFfZW5kKGFyZ3MpOworfQorCit2b2lkIGV4dDNfdXBkYXRlX2R5bmFtaWNfcmV2KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKmVzID0gRVhUM19TQihzYiktPnNfZXM7CisKKwlpZiAobGUzMl90b19jcHUoZXMtPnNfcmV2X2xldmVsKSA+IEVYVDNfR09PRF9PTERfUkVWKQorCQlyZXR1cm47CisKKwlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJICAgICAidXBkYXRpbmcgdG8gcmV2ICVkIGJlY2F1c2Ugb2YgbmV3IGZlYXR1cmUgZmxhZywgIgorCQkgICAgICJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZCIsCisJCSAgICAgRVhUM19EWU5BTUlDX1JFVik7CisKKwllcy0+c19maXJzdF9pbm8gPSBjcHVfdG9fbGUzMihFWFQzX0dPT0RfT0xEX0ZJUlNUX0lOTyk7CisJZXMtPnNfaW5vZGVfc2l6ZSA9IGNwdV90b19sZTE2KEVYVDNfR09PRF9PTERfSU5PREVfU0laRSk7CisJZXMtPnNfcmV2X2xldmVsID0gY3B1X3RvX2xlMzIoRVhUM19EWU5BTUlDX1JFVik7CisJLyogbGVhdmUgZXMtPnNfZmVhdHVyZV8qY29tcGF0IGZsYWdzIGFsb25lICovCisJLyogZXMtPnNfdXVpZCB3aWxsIGJlIHNldCBieSBlMmZzY2sgaWYgZW1wdHkgKi8KKworCS8qCisJICogVGhlIHJlc3Qgb2YgdGhlIHN1cGVyYmxvY2sgZmllbGRzIHNob3VsZCBiZSB6ZXJvLCBhbmQgaWYgbm90IGl0CisJICogbWVhbnMgdGhleSBhcmUgbGlrZWx5IGFscmVhZHkgaW4gdXNlLCBzbyBsZWF2ZSB0aGVtIGFsb25lLiAgV2UKKwkgKiBjYW4gbGVhdmUgaXQgdXAgdG8gZTJmc2NrIHRvIGNsZWFuIHVwIGFueSBpbmNvbnNpc3RlbmNpZXMgdGhlcmUuCisJICovCit9CisKKy8qCisgKiBPcGVuIHRoZSBleHRlcm5hbCBqb3VybmFsIGRldmljZQorICovCitzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZSAqZXh0M19ibGtkZXZfZ2V0KGRldl90IGRldikKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKKworCWJkZXYgPSBvcGVuX2J5X2Rldm51bShkZXYsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOworCWlmIChJU19FUlIoYmRldikpCisJCWdvdG8gZmFpbDsKKwlyZXR1cm4gYmRldjsKKworZmFpbDoKKwlwcmludGsoS0VSTl9FUlIgIkVYVDM6IGZhaWxlZCB0byBvcGVuIGpvdXJuYWwgZGV2aWNlICVzOiAlbGRcbiIsCisJCQlfX2JkZXZuYW1lKGRldiwgYiksIFBUUl9FUlIoYmRldikpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogUmVsZWFzZSB0aGUgam91cm5hbCBkZXZpY2UKKyAqLworc3RhdGljIGludCBleHQzX2Jsa2Rldl9wdXQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwliZF9yZWxlYXNlKGJkZXYpOworCXJldHVybiBibGtkZXZfcHV0KGJkZXYpOworfQorCitzdGF0aWMgaW50IGV4dDNfYmxrZGV2X3JlbW92ZShzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkpCit7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKworCWJkZXYgPSBzYmktPmpvdXJuYWxfYmRldjsKKwlpZiAoYmRldikgeworCQlyZXQgPSBleHQzX2Jsa2Rldl9wdXQoYmRldik7CisJCXNiaS0+am91cm5hbF9iZGV2ID0gTlVMTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vZGUgKm9ycGhhbl9saXN0X2VudHJ5KHN0cnVjdCBsaXN0X2hlYWQgKmwpCit7CisJcmV0dXJuICZsaXN0X2VudHJ5KGwsIHN0cnVjdCBleHQzX2lub2RlX2luZm8sIGlfb3JwaGFuKS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBkdW1wX29ycGhhbl9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsOworCisJcHJpbnRrKEtFUk5fRVJSICJzYiBvcnBoYW4gaGVhZCBpcyAlZFxuIiwgCisJICAgICAgIGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19sYXN0X29ycGhhbikpOworCisJcHJpbnRrKEtFUk5fRVJSICJzYl9pbmZvIG9ycGhhbiBsaXN0OlxuIik7CisJbGlzdF9mb3JfZWFjaChsLCAmc2JpLT5zX29ycGhhbikgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gb3JwaGFuX2xpc3RfZW50cnkobCk7CisJCXByaW50ayhLRVJOX0VSUiAiICAiCisJCSAgICAgICAiaW5vZGUgJXM6JWxkIGF0ICVwOiBtb2RlICVvLCBubGluayAlZCwgbmV4dCAlZFxuIiwKKwkJICAgICAgIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sIGlub2RlLAorCQkgICAgICAgaW5vZGUtPmlfbW9kZSwgaW5vZGUtPmlfbmxpbmssIAorCQkgICAgICAgTkVYVF9PUlBIQU4oaW5vZGUpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGV4dDNfcHV0X3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKK3sKKwlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkgPSBFWFQzX1NCKHNiKTsKKwlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7CisJaW50IGk7CisKKwlleHQzX3hhdHRyX3B1dF9zdXBlcihzYik7CisJam91cm5hbF9kZXN0cm95KHNiaS0+c19qb3VybmFsKTsKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJRVhUM19DTEVBUl9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7CisJCWVzLT5zX3N0YXRlID0gY3B1X3RvX2xlMTYoc2JpLT5zX21vdW50X3N0YXRlKTsKKwkJQlVGRkVSX1RSQUNFKHNiaS0+c19zYmgsICJtYXJraW5nIGRpcnR5Iik7CisJCW1hcmtfYnVmZmVyX2RpcnR5KHNiaS0+c19zYmgpOworCQlleHQzX2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfZ2RiX2NvdW50OyBpKyspCisJCWJyZWxzZShzYmktPnNfZ3JvdXBfZGVzY1tpXSk7CisJa2ZyZWUoc2JpLT5zX2dyb3VwX2Rlc2MpOworCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOworCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19mcmVlaW5vZGVzX2NvdW50ZXIpOworCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19kaXJzX2NvdW50ZXIpOworCWJyZWxzZShzYmktPnNfc2JoKTsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspCisJCWtmcmVlKHNiaS0+c19xZl9uYW1lc1tpXSk7CisjZW5kaWYKKworCS8qIERlYnVnZ2luZyBjb2RlIGp1c3QgaW4gY2FzZSB0aGUgaW4tbWVtb3J5IGlub2RlIG9ycGhhbiBsaXN0CisJICogaXNuJ3QgZW1wdHkuICBUaGUgb24tZGlzayBvbmUgY2FuIGJlIG5vbi1lbXB0eSBpZiB3ZSd2ZQorCSAqIGRldGVjdGVkIGFuIGVycm9yIGFuZCB0YWtlbiB0aGUgZnMgcmVhZG9ubHksIGJ1dCB0aGUKKwkgKiBpbi1tZW1vcnkgbGlzdCBoYWQgYmV0dGVyIGJlIGNsZWFuIGJ5IHRoaXMgcG9pbnQuICovCisJaWYgKCFsaXN0X2VtcHR5KCZzYmktPnNfb3JwaGFuKSkKKwkJZHVtcF9vcnBoYW5fbGlzdChzYiwgc2JpKTsKKwlKX0FTU0VSVChsaXN0X2VtcHR5KCZzYmktPnNfb3JwaGFuKSk7CisKKwlpbnZhbGlkYXRlX2JkZXYoc2ItPnNfYmRldiwgMCk7CisJaWYgKHNiaS0+am91cm5hbF9iZGV2ICYmIHNiaS0+am91cm5hbF9iZGV2ICE9IHNiLT5zX2JkZXYpIHsKKwkJLyoKKwkJICogSW52YWxpZGF0ZSB0aGUgam91cm5hbCBkZXZpY2UncyBidWZmZXJzLiAgV2UgZG9uJ3Qgd2FudCB0aGVtCisJCSAqIGZsb2F0aW5nIGFib3V0IGluIG1lbW9yeSAtIHRoZSBwaHlzaWNhbCBqb3VybmFsIGRldmljZSBtYXkKKwkJICogaG90c3dhcHBlZCwgYW5kIGl0IGJyZWFrcyB0aGUgYHJvLWFmdGVyJyB0ZXN0aW5nIGNvZGUuCisJCSAqLworCQlzeW5jX2Jsb2NrZGV2KHNiaS0+am91cm5hbF9iZGV2KTsKKwkJaW52YWxpZGF0ZV9iZGV2KHNiaS0+am91cm5hbF9iZGV2LCAwKTsKKwkJZXh0M19ibGtkZXZfcmVtb3ZlKHNiaSk7CisJfQorCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNiaSk7CisJcmV0dXJuOworfQorCitzdGF0aWMga21lbV9jYWNoZV90ICpleHQzX2lub2RlX2NhY2hlcDsKKworLyoKKyAqIENhbGxlZCBpbnNpZGUgdHJhbnNhY3Rpb24sIHNvIHVzZSBHRlBfTk9GUworICovCitzdGF0aWMgc3RydWN0IGlub2RlICpleHQzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGV4dDNfaW5vZGVfaW5mbyAqZWk7CisKKwllaSA9IGttZW1fY2FjaGVfYWxsb2MoZXh0M19pbm9kZV9jYWNoZXAsIFNMQUJfTk9GUyk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisjaWZkZWYgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMCisJZWktPmlfYWNsID0gRVhUM19BQ0xfTk9UX0NBQ0hFRDsKKwllaS0+aV9kZWZhdWx0X2FjbCA9IEVYVDNfQUNMX05PVF9DQUNIRUQ7CisjZW5kaWYKKwllaS0+aV9ibG9ja19hbGxvY19pbmZvID0gTlVMTDsKKwllaS0+dmZzX2lub2RlLmlfdmVyc2lvbiA9IDE7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBleHQzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUoZXh0M19pbm9kZV9jYWNoZXAsIEVYVDNfSShpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBleHQzX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBleHQzX2lub2RlX2luZm8gKikgZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikgeworCQlJTklUX0xJU1RfSEVBRCgmZWktPmlfb3JwaGFuKTsKKyNpZmRlZiBDT05GSUdfRVhUM19GU19YQVRUUgorCQlpbml0X3J3c2VtKCZlaS0+eGF0dHJfc2VtKTsKKyNlbmRpZgorCQlpbml0X01VVEVYKCZlaS0+dHJ1bmNhdGVfc2VtKTsKKwkJaW5vZGVfaW5pdF9vbmNlKCZlaS0+dmZzX2lub2RlKTsKKwl9Cit9CisgCitzdGF0aWMgaW50IGluaXRfaW5vZGVjYWNoZSh2b2lkKQoreworCWV4dDNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImV4dDNfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvKSwKKwkJCQkJICAgICAwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQkJICAgICBpbml0X29uY2UsIE5VTEwpOworCWlmIChleHQzX2lub2RlX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCit7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShleHQzX2lub2RlX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX0lORk8gImV4dDNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworc3RhdGljIHZvaWQgZXh0M19jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBleHQzX2Jsb2NrX2FsbG9jX2luZm8gKnJzdiA9IEVYVDNfSShpbm9kZSktPmlfYmxvY2tfYWxsb2NfaW5mbzsKKyNpZmRlZiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wKKyAgICAgICBpZiAoRVhUM19JKGlub2RlKS0+aV9hY2wgJiYKKyAgICAgICAgICAgRVhUM19JKGlub2RlKS0+aV9hY2wgIT0gRVhUM19BQ0xfTk9UX0NBQ0hFRCkgeworICAgICAgICAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UoRVhUM19JKGlub2RlKS0+aV9hY2wpOworICAgICAgICAgICAgICAgRVhUM19JKGlub2RlKS0+aV9hY2wgPSBFWFQzX0FDTF9OT1RfQ0FDSEVEOworICAgICAgIH0KKyAgICAgICBpZiAoRVhUM19JKGlub2RlKS0+aV9kZWZhdWx0X2FjbCAmJgorICAgICAgICAgICBFWFQzX0koaW5vZGUpLT5pX2RlZmF1bHRfYWNsICE9IEVYVDNfQUNMX05PVF9DQUNIRUQpIHsKKyAgICAgICAgICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlKEVYVDNfSShpbm9kZSktPmlfZGVmYXVsdF9hY2wpOworICAgICAgICAgICAgICAgRVhUM19JKGlub2RlKS0+aV9kZWZhdWx0X2FjbCA9IEVYVDNfQUNMX05PVF9DQUNIRUQ7CisgICAgICAgfQorI2VuZGlmCisJZXh0M19kaXNjYXJkX3Jlc2VydmF0aW9uKGlub2RlKTsKKwlFWFQzX0koaW5vZGUpLT5pX2Jsb2NrX2FsbG9jX2luZm8gPSBOVUxMOworCWtmcmVlKHJzdik7Cit9CisKKyNpZmRlZiBDT05GSUdfUVVPVEEKKworI2RlZmluZSBRVFlQRTJOQU1FKHQpICgodCk9PVVTUlFVT1RBPyJ1c2VyIjoiZ3JvdXAiKQorI2RlZmluZSBRVFlQRTJNT1BUKG9uLCB0KSAoKHQpPT1VU1JRVU9UQT8oKG9uKSMjVVNSSlFVT1RBKTooKG9uKSMjR1JQSlFVT1RBKSkKKworc3RhdGljIGludCBleHQzX2RxdW90X2luaXRpYWxpemUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpOworc3RhdGljIGludCBleHQzX2RxdW90X2Ryb3Aoc3RydWN0IGlub2RlICppbm9kZSk7CitzdGF0aWMgaW50IGV4dDNfd3JpdGVfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCk7CitzdGF0aWMgaW50IGV4dDNfYWNxdWlyZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KTsKK3N0YXRpYyBpbnQgZXh0M19yZWxlYXNlX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpOworc3RhdGljIGludCBleHQzX21hcmtfZHF1b3RfZGlydHkoc3RydWN0IGRxdW90ICpkcXVvdCk7CitzdGF0aWMgaW50IGV4dDNfd3JpdGVfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSk7CitzdGF0aWMgaW50IGV4dDNfcXVvdGFfb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCBmb3JtYXRfaWQsIGNoYXIgKnBhdGgpOworc3RhdGljIGludCBleHQzX3F1b3RhX29uX21vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKTsKK3N0YXRpYyBzc2l6ZV90IGV4dDNfcXVvdGFfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgY2hhciAqZGF0YSwKKwkJCSAgICAgICBzaXplX3QgbGVuLCBsb2ZmX3Qgb2ZmKTsKK3N0YXRpYyBzc2l6ZV90IGV4dDNfcXVvdGFfd3JpdGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsCisJCQkJY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgbG9mZl90IG9mZik7CisKK3N0YXRpYyBzdHJ1Y3QgZHF1b3Rfb3BlcmF0aW9ucyBleHQzX3F1b3RhX29wZXJhdGlvbnMgPSB7CisJLmluaXRpYWxpemUJPSBleHQzX2RxdW90X2luaXRpYWxpemUsCisJLmRyb3AJCT0gZXh0M19kcXVvdF9kcm9wLAorCS5hbGxvY19zcGFjZQk9IGRxdW90X2FsbG9jX3NwYWNlLAorCS5hbGxvY19pbm9kZQk9IGRxdW90X2FsbG9jX2lub2RlLAorCS5mcmVlX3NwYWNlCT0gZHF1b3RfZnJlZV9zcGFjZSwKKwkuZnJlZV9pbm9kZQk9IGRxdW90X2ZyZWVfaW5vZGUsCisJLnRyYW5zZmVyCT0gZHF1b3RfdHJhbnNmZXIsCisJLndyaXRlX2RxdW90CT0gZXh0M193cml0ZV9kcXVvdCwKKwkuYWNxdWlyZV9kcXVvdAk9IGV4dDNfYWNxdWlyZV9kcXVvdCwKKwkucmVsZWFzZV9kcXVvdAk9IGV4dDNfcmVsZWFzZV9kcXVvdCwKKwkubWFya19kaXJ0eQk9IGV4dDNfbWFya19kcXVvdF9kaXJ0eSwKKwkud3JpdGVfaW5mbwk9IGV4dDNfd3JpdGVfaW5mbworfTsKKworc3RhdGljIHN0cnVjdCBxdW90YWN0bF9vcHMgZXh0M19xY3RsX29wZXJhdGlvbnMgPSB7CisJLnF1b3RhX29uCT0gZXh0M19xdW90YV9vbiwKKwkucXVvdGFfb2ZmCT0gdmZzX3F1b3RhX29mZiwKKwkucXVvdGFfc3luYwk9IHZmc19xdW90YV9zeW5jLAorCS5nZXRfaW5mbwk9IHZmc19nZXRfZHFpbmZvLAorCS5zZXRfaW5mbwk9IHZmc19zZXRfZHFpbmZvLAorCS5nZXRfZHFibGsJPSB2ZnNfZ2V0X2RxYmxrLAorCS5zZXRfZHFibGsJPSB2ZnNfc2V0X2RxYmxrCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBleHQzX3NvcHMgPSB7CisJLmFsbG9jX2lub2RlCT0gZXh0M19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IGV4dDNfZGVzdHJveV9pbm9kZSwKKwkucmVhZF9pbm9kZQk9IGV4dDNfcmVhZF9pbm9kZSwKKwkud3JpdGVfaW5vZGUJPSBleHQzX3dyaXRlX2lub2RlLAorCS5kaXJ0eV9pbm9kZQk9IGV4dDNfZGlydHlfaW5vZGUsCisJLmRlbGV0ZV9pbm9kZQk9IGV4dDNfZGVsZXRlX2lub2RlLAorCS5wdXRfc3VwZXIJPSBleHQzX3B1dF9zdXBlciwKKwkud3JpdGVfc3VwZXIJPSBleHQzX3dyaXRlX3N1cGVyLAorCS5zeW5jX2ZzCT0gZXh0M19zeW5jX2ZzLAorCS53cml0ZV9zdXBlcl9sb2NrZnMgPSBleHQzX3dyaXRlX3N1cGVyX2xvY2tmcywKKwkudW5sb2NrZnMJPSBleHQzX3VubG9ja2ZzLAorCS5zdGF0ZnMJCT0gZXh0M19zdGF0ZnMsCisJLnJlbW91bnRfZnMJPSBleHQzX3JlbW91bnQsCisJLmNsZWFyX2lub2RlCT0gZXh0M19jbGVhcl9pbm9kZSwKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwkucXVvdGFfcmVhZAk9IGV4dDNfcXVvdGFfcmVhZCwKKwkucXVvdGFfd3JpdGUJPSBleHQzX3F1b3RhX3dyaXRlLAorI2VuZGlmCit9OworCitzdHJ1Y3QgZGVudHJ5ICpleHQzX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpOworc3RhdGljIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBleHQzX2V4cG9ydF9vcHMgPSB7CisJLmdldF9wYXJlbnQgPSBleHQzX2dldF9wYXJlbnQsCit9OworCitlbnVtIHsKKwlPcHRfYnNkX2RmLCBPcHRfbWluaXhfZGYsIE9wdF9ncnBpZCwgT3B0X25vZ3JwaWQsCisJT3B0X3Jlc2dpZCwgT3B0X3Jlc3VpZCwgT3B0X3NiLCBPcHRfZXJyX2NvbnQsIE9wdF9lcnJfcGFuaWMsIE9wdF9lcnJfcm8sCisJT3B0X25vdWlkMzIsIE9wdF9jaGVjaywgT3B0X25vY2hlY2ssIE9wdF9kZWJ1ZywgT3B0X29sZGFsbG9jLCBPcHRfb3Jsb3YsCisJT3B0X3VzZXJfeGF0dHIsIE9wdF9ub3VzZXJfeGF0dHIsIE9wdF9hY2wsIE9wdF9ub2FjbCwKKwlPcHRfcmVzZXJ2YXRpb24sIE9wdF9ub3Jlc2VydmF0aW9uLCBPcHRfbm9sb2FkLCBPcHRfbm9iaCwKKwlPcHRfY29tbWl0LCBPcHRfam91cm5hbF91cGRhdGUsIE9wdF9qb3VybmFsX2ludW0sCisJT3B0X2Fib3J0LCBPcHRfZGF0YV9qb3VybmFsLCBPcHRfZGF0YV9vcmRlcmVkLCBPcHRfZGF0YV93cml0ZWJhY2ssCisJT3B0X3VzcmpxdW90YSwgT3B0X2dycGpxdW90YSwgT3B0X29mZnVzcmpxdW90YSwgT3B0X29mZmdycGpxdW90YSwKKwlPcHRfanFmbXRfdmZzb2xkLCBPcHRfanFmbXRfdmZzdjAsCisJT3B0X2lnbm9yZSwgT3B0X2JhcnJpZXIsIE9wdF9lcnIsIE9wdF9yZXNpemUsCit9OworCitzdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CisJe09wdF9ic2RfZGYsICJic2RkZiJ9LAorCXtPcHRfbWluaXhfZGYsICJtaW5peGRmIn0sCisJe09wdF9ncnBpZCwgImdycGlkIn0sCisJe09wdF9ncnBpZCwgImJzZGdyb3VwcyJ9LAorCXtPcHRfbm9ncnBpZCwgIm5vZ3JwaWQifSwKKwl7T3B0X25vZ3JwaWQsICJzeXN2Z3JvdXBzIn0sCisJe09wdF9yZXNnaWQsICJyZXNnaWQ9JXUifSwKKwl7T3B0X3Jlc3VpZCwgInJlc3VpZD0ldSJ9LAorCXtPcHRfc2IsICJzYj0ldSJ9LAorCXtPcHRfZXJyX2NvbnQsICJlcnJvcnM9Y29udGludWUifSwKKwl7T3B0X2Vycl9wYW5pYywgImVycm9ycz1wYW5pYyJ9LAorCXtPcHRfZXJyX3JvLCAiZXJyb3JzPXJlbW91bnQtcm8ifSwKKwl7T3B0X25vdWlkMzIsICJub3VpZDMyIn0sCisJe09wdF9ub2NoZWNrLCAibm9jaGVjayJ9LAorCXtPcHRfbm9jaGVjaywgImNoZWNrPW5vbmUifSwKKwl7T3B0X2NoZWNrLCAiY2hlY2sifSwKKwl7T3B0X2RlYnVnLCAiZGVidWcifSwKKwl7T3B0X29sZGFsbG9jLCAib2xkYWxsb2MifSwKKwl7T3B0X29ybG92LCAib3Jsb3YifSwKKwl7T3B0X3VzZXJfeGF0dHIsICJ1c2VyX3hhdHRyIn0sCisJe09wdF9ub3VzZXJfeGF0dHIsICJub3VzZXJfeGF0dHIifSwKKwl7T3B0X2FjbCwgImFjbCJ9LAorCXtPcHRfbm9hY2wsICJub2FjbCJ9LAorCXtPcHRfcmVzZXJ2YXRpb24sICJyZXNlcnZhdGlvbiJ9LAorCXtPcHRfbm9yZXNlcnZhdGlvbiwgIm5vcmVzZXJ2YXRpb24ifSwKKwl7T3B0X25vbG9hZCwgIm5vbG9hZCJ9LAorCXtPcHRfbm9iaCwgIm5vYmgifSwKKwl7T3B0X2NvbW1pdCwgImNvbW1pdD0ldSJ9LAorCXtPcHRfam91cm5hbF91cGRhdGUsICJqb3VybmFsPXVwZGF0ZSJ9LAorCXtPcHRfam91cm5hbF9pbnVtLCAiam91cm5hbD0ldSJ9LAorCXtPcHRfYWJvcnQsICJhYm9ydCJ9LAorCXtPcHRfZGF0YV9qb3VybmFsLCAiZGF0YT1qb3VybmFsIn0sCisJe09wdF9kYXRhX29yZGVyZWQsICJkYXRhPW9yZGVyZWQifSwKKwl7T3B0X2RhdGFfd3JpdGViYWNrLCAiZGF0YT13cml0ZWJhY2sifSwKKwl7T3B0X29mZnVzcmpxdW90YSwgInVzcmpxdW90YT0ifSwKKwl7T3B0X3VzcmpxdW90YSwgInVzcmpxdW90YT0lcyJ9LAorCXtPcHRfb2ZmZ3JwanF1b3RhLCAiZ3JwanF1b3RhPSJ9LAorCXtPcHRfZ3JwanF1b3RhLCAiZ3JwanF1b3RhPSVzIn0sCisJe09wdF9qcWZtdF92ZnNvbGQsICJqcWZtdD12ZnNvbGQifSwKKwl7T3B0X2pxZm10X3Zmc3YwLCAianFmbXQ9dmZzdjAifSwKKwl7T3B0X2lnbm9yZSwgImdycHF1b3RhIn0sCisJe09wdF9pZ25vcmUsICJub3F1b3RhIn0sCisJe09wdF9pZ25vcmUsICJxdW90YSJ9LAorCXtPcHRfaWdub3JlLCAidXNycXVvdGEifSwKKwl7T3B0X2JhcnJpZXIsICJiYXJyaWVyPSV1In0sCisJe09wdF9lcnIsIE5VTEx9LAorCXtPcHRfcmVzaXplLCAicmVzaXplIn0sCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfc2JfYmxvY2sodm9pZCAqKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyAJc2JfYmxvY2s7CisJY2hhciAJCSpvcHRpb25zID0gKGNoYXIgKikgKmRhdGE7CisKKwlpZiAoIW9wdGlvbnMgfHwgc3RybmNtcChvcHRpb25zLCAic2I9IiwgMykgIT0gMCkKKwkJcmV0dXJuIDE7CS8qIERlZmF1bHQgbG9jYXRpb24gKi8KKwlvcHRpb25zICs9IDM7CisJc2JfYmxvY2sgPSBzaW1wbGVfc3RydG91bChvcHRpb25zLCAmb3B0aW9ucywgMCk7CisJaWYgKCpvcHRpb25zICYmICpvcHRpb25zICE9ICcsJykgeworCQlwcmludGsoIkVYVDMtZnM6IEludmFsaWQgc2Igc3BlY2lmaWNhdGlvbjogJXNcbiIsCisJCSAgICAgICAoY2hhciAqKSAqZGF0YSk7CisJCXJldHVybiAxOworCX0KKwlpZiAoKm9wdGlvbnMgPT0gJywnKQorCQlvcHRpb25zKys7CisJKmRhdGEgPSAodm9pZCAqKSBvcHRpb25zOworCXJldHVybiBzYl9ibG9jazsKK30KKworc3RhdGljIGludCBwYXJzZV9vcHRpb25zIChjaGFyICogb3B0aW9ucywgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgdW5zaWduZWQgbG9uZyAqIGludW0sIHVuc2lnbmVkIGxvbmcgKm5fYmxvY2tzX2NvdW50LCBpbnQgaXNfcmVtb3VudCkKK3sKKwlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkgPSBFWFQzX1NCKHNiKTsKKwljaGFyICogcDsKKwlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJaW50IGRhdGFfb3B0ID0gMDsKKwlpbnQgb3B0aW9uOworI2lmZGVmIENPTkZJR19RVU9UQQorCWludCBxdHlwZTsKKwljaGFyICpxbmFtZTsKKyNlbmRpZgorCisJaWYgKCFvcHRpb25zKQorCQlyZXR1cm4gMTsKKworCXdoaWxlICgocCA9IHN0cnNlcCAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJaW50IHRva2VuOworCQlpZiAoISpwKQorCQkJY29udGludWU7CisKKwkJdG9rZW4gPSBtYXRjaF90b2tlbihwLCB0b2tlbnMsIGFyZ3MpOworCQlzd2l0Y2ggKHRva2VuKSB7CisJCWNhc2UgT3B0X2JzZF9kZjoKKwkJCWNsZWFyX29wdCAoc2JpLT5zX21vdW50X29wdCwgTUlOSVhfREYpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X21pbml4X2RmOgorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgTUlOSVhfREYpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2dycGlkOgorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgR1JQSUQpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vZ3JwaWQ6CisJCQljbGVhcl9vcHQgKHNiaS0+c19tb3VudF9vcHQsIEdSUElEKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9yZXN1aWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXNiaS0+c19yZXN1aWQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfcmVzZ2lkOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCisJCQkJcmV0dXJuIDA7CisJCQlzYmktPnNfcmVzZ2lkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3NiOgorCQkJLyogaGFuZGxlZCBieSBnZXRfc2JfYmxvY2soKSBpbnN0ZWFkIG9mIGhlcmUgKi8KKwkJCS8qICpzYl9ibG9jayA9IG1hdGNoX2ludCgmYXJnc1swXSk7ICovCisJCQlicmVhazsKKwkJY2FzZSBPcHRfZXJyX3BhbmljOgorCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfQ09OVCk7CisJCQljbGVhcl9vcHQgKHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19STyk7CisJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUEFOSUMpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2Vycl9ybzoKKwkJCWNsZWFyX29wdCAoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX0NPTlQpOworCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUEFOSUMpOworCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX1JPKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9lcnJfY29udDoKKwkJCWNsZWFyX29wdCAoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX1JPKTsKKwkJCWNsZWFyX29wdCAoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX1BBTklDKTsKKwkJCXNldF9vcHQgKHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19DT05UKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub3VpZDMyOgorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgTk9fVUlEMzIpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2NoZWNrOgorI2lmZGVmIENPTkZJR19FWFQzX0NIRUNLCisJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBDSEVDSyk7CisjZWxzZQorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIkVYVDMgQ2hlY2sgb3B0aW9uIG5vdCBzdXBwb3J0ZWRcbiIpOworI2VuZGlmCisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9jaGVjazoKKwkJCWNsZWFyX29wdCAoc2JpLT5zX21vdW50X29wdCwgQ0hFQ0spOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2RlYnVnOgorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgREVCVUcpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X29sZGFsbG9jOgorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgT0xEQUxMT0MpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X29ybG92OgorCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBPTERBTExPQyk7CisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfRVhUM19GU19YQVRUUgorCQljYXNlIE9wdF91c2VyX3hhdHRyOgorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgWEFUVFJfVVNFUik7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm91c2VyX3hhdHRyOgorCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBYQVRUUl9VU0VSKTsKKwkJCWJyZWFrOworI2Vsc2UKKwkJY2FzZSBPcHRfdXNlcl94YXR0cjoKKwkJY2FzZSBPcHRfbm91c2VyX3hhdHRyOgorCQkJcHJpbnRrKCJFWFQzIChubyl1c2VyX3hhdHRyIG9wdGlvbnMgbm90IHN1cHBvcnRlZFxuIik7CisJCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTAorCQljYXNlIE9wdF9hY2w6CisJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFBPU0lYX0FDTCk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9hY2w6CisJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgUE9TSVhfQUNMKTsKKwkJCWJyZWFrOworI2Vsc2UKKwkJY2FzZSBPcHRfYWNsOgorCQljYXNlIE9wdF9ub2FjbDoKKwkJCXByaW50aygiRVhUMyAobm8pYWNsIG9wdGlvbnMgbm90IHN1cHBvcnRlZFxuIik7CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlIE9wdF9yZXNlcnZhdGlvbjoKKwkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgUkVTRVJWQVRJT04pOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vcmVzZXJ2YXRpb246CisJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgUkVTRVJWQVRJT04pOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2pvdXJuYWxfdXBkYXRlOgorCQkJLyogQEBAIEZJWE1FICovCisJCQkvKiBFdmVudHVhbGx5IHdlIHdpbGwgd2FudCB0byBiZSBhYmxlIHRvIGNyZWF0ZQorCQkJICAgYSBqb3VybmFsIGZpbGUgaGVyZS4gIEZvciBub3csIG9ubHkgYWxsb3cgdGhlCisJCQkgICB1c2VyIHRvIHNwZWNpZnkgYW4gZXhpc3RpbmcgaW5vZGUgdG8gYmUgdGhlCisJCQkgICBqb3VybmFsIGZpbGUuICovCisJCQlpZiAoaXNfcmVtb3VudCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogY2Fubm90IHNwZWNpZnkgIgorCQkJCSAgICAgICAiam91cm5hbCBvbiByZW1vdW50XG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXNldF9vcHQgKHNiaS0+c19tb3VudF9vcHQsIFVQREFURV9KT1VSTkFMKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9qb3VybmFsX2ludW06CisJCQlpZiAoaXNfcmVtb3VudCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogY2Fubm90IHNwZWNpZnkgIgorCQkJCSAgICAgICAiam91cm5hbCBvbiByZW1vdW50XG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJKmludW0gPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9sb2FkOgorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgTk9MT0FEKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9jb21taXQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChvcHRpb24gPCAwKQorCQkJCXJldHVybiAwOworCQkJaWYgKG9wdGlvbiA9PSAwKQorCQkJCW9wdGlvbiA9IEpCRF9ERUZBVUxUX01BWF9DT01NSVRfQUdFOworCQkJc2JpLT5zX2NvbW1pdF9pbnRlcnZhbCA9IEhaICogb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2RhdGFfam91cm5hbDoKKwkJCWRhdGFfb3B0ID0gRVhUM19NT1VOVF9KT1VSTkFMX0RBVEE7CisJCQlnb3RvIGRhdGFjaGVjazsKKwkJY2FzZSBPcHRfZGF0YV9vcmRlcmVkOgorCQkJZGF0YV9vcHQgPSBFWFQzX01PVU5UX09SREVSRURfREFUQTsKKwkJCWdvdG8gZGF0YWNoZWNrOworCQljYXNlIE9wdF9kYXRhX3dyaXRlYmFjazoKKwkJCWRhdGFfb3B0ID0gRVhUM19NT1VOVF9XUklURUJBQ0tfREFUQTsKKwkJZGF0YWNoZWNrOgorCQkJaWYgKGlzX3JlbW91bnQpIHsKKwkJCQlpZiAoKHNiaS0+c19tb3VudF9vcHQgJiBFWFQzX01PVU5UX0RBVEFfRkxBR1MpCisJCQkJCQkhPSBkYXRhX29wdCkgeworCQkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJCSJFWFQzLWZzOiBjYW5ub3QgY2hhbmdlIGRhdGEgIgorCQkJCQkJIm1vZGUgb24gcmVtb3VudFxuIik7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJc2JpLT5zX21vdW50X29wdCAmPSB+RVhUM19NT1VOVF9EQVRBX0ZMQUdTOworCQkJCXNiaS0+c19tb3VudF9vcHQgfD0gZGF0YV9vcHQ7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwkJY2FzZSBPcHRfdXNyanF1b3RhOgorCQkJcXR5cGUgPSBVU1JRVU9UQTsKKwkJCWdvdG8gc2V0X3FmX25hbWU7CisJCWNhc2UgT3B0X2dycGpxdW90YToKKwkJCXF0eXBlID0gR1JQUVVPVEE7CitzZXRfcWZfbmFtZToKKwkJCWlmIChzYl9hbnlfcXVvdGFfZW5hYmxlZChzYikpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJIkVYVDMtZnM6IENhbm5vdCBjaGFuZ2Ugam91cm5hbGxlZCAiCisJCQkJCSJxdW90YSBvcHRpb25zIHdoZW4gcXVvdGEgdHVybmVkIG9uLlxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlxbmFtZSA9IG1hdGNoX3N0cmR1cCgmYXJnc1swXSk7CisJCQlpZiAoIXFuYW1lKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSJFWFQzLWZzOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgIgorCQkJCQkic3RvcmluZyBxdW90YWZpbGUgbmFtZS5cbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKHNiaS0+c19xZl9uYW1lc1txdHlwZV0gJiYKKwkJCSAgICBzdHJjbXAoc2JpLT5zX3FmX25hbWVzW3F0eXBlXSwgcW5hbWUpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSJFWFQzLWZzOiAlcyBxdW90YSBmaWxlIGFscmVhZHkgIgorCQkJCQkic3BlY2lmaWVkLlxuIiwgUVRZUEUyTkFNRShxdHlwZSkpOworCQkJCWtmcmVlKHFuYW1lKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXNiaS0+c19xZl9uYW1lc1txdHlwZV0gPSBxbmFtZTsKKwkJCWlmIChzdHJjaHIoc2JpLT5zX3FmX25hbWVzW3F0eXBlXSwgJy8nKSkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkiRVhUMy1mczogcXVvdGFmaWxlIG11c3QgYmUgb24gIgorCQkJCQkiZmlsZXN5c3RlbSByb290LlxuIik7CisJCQkJa2ZyZWUoc2JpLT5zX3FmX25hbWVzW3F0eXBlXSk7CisJCQkJc2JpLT5zX3FmX25hbWVzW3F0eXBlXSA9IE5VTEw7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPcHRfb2ZmdXNyanF1b3RhOgorCQkJcXR5cGUgPSBVU1JRVU9UQTsKKwkJCWdvdG8gY2xlYXJfcWZfbmFtZTsKKwkJY2FzZSBPcHRfb2ZmZ3JwanF1b3RhOgorCQkJcXR5cGUgPSBHUlBRVU9UQTsKK2NsZWFyX3FmX25hbWU6CisJCQlpZiAoc2JfYW55X3F1b3RhX2VuYWJsZWQoc2IpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBDYW5ub3QgY2hhbmdlICIKKwkJCQkJImpvdXJuYWxsZWQgcXVvdGEgb3B0aW9ucyB3aGVuICIKKwkJCQkJInF1b3RhIHR1cm5lZCBvbi5cbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJa2ZyZWUoc2JpLT5zX3FmX25hbWVzW3F0eXBlXSk7CisJCQlzYmktPnNfcWZfbmFtZXNbcXR5cGVdID0gTlVMTDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9qcWZtdF92ZnNvbGQ6CisJCQlzYmktPnNfanF1b3RhX2ZtdCA9IFFGTVRfVkZTX09MRDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9qcWZtdF92ZnN2MDoKKwkJCXNiaS0+c19qcXVvdGFfZm10ID0gUUZNVF9WRlNfVjA7CisJCQlicmVhazsKKyNlbHNlCisJCWNhc2UgT3B0X3VzcmpxdW90YToKKwkJY2FzZSBPcHRfZ3JwanF1b3RhOgorCQljYXNlIE9wdF9vZmZ1c3JqcXVvdGE6CisJCWNhc2UgT3B0X29mZmdycGpxdW90YToKKwkJY2FzZSBPcHRfanFmbXRfdmZzb2xkOgorCQljYXNlIE9wdF9qcWZtdF92ZnN2MDoKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJFWFQzLWZzOiBqb3VybmFsbGVkIHF1b3RhIG9wdGlvbnMgbm90ICIKKwkJCQkic3VwcG9ydGVkLlxuIik7CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlIE9wdF9hYm9ydDoKKwkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgQUJPUlQpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2JhcnJpZXI6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChvcHRpb24pCisJCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBCQVJSSUVSKTsKKwkJCWVsc2UKKwkJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgQkFSUklFUik7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfaWdub3JlOgorCQkJYnJlYWs7CisJCWNhc2UgT3B0X3Jlc2l6ZToKKwkJCWlmICghbl9ibG9ja3NfY291bnQpIHsKKwkJCQlwcmludGsoIkVYVDMtZnM6IHJlc2l6ZSBvcHRpb24gb25seSBhdmFpbGFibGUgIgorCQkJCQkiZm9yIHJlbW91bnRcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKTsKKwkJCSpuX2Jsb2Nrc19jb3VudCA9IG9wdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub2JoOgorCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBOT0JIKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrIChLRVJOX0VSUgorCQkJCSJFWFQzLWZzOiBVbnJlY29nbml6ZWQgbW91bnQgb3B0aW9uIFwiJXNcIiAiCisJCQkJIm9yIG1pc3NpbmcgdmFsdWVcbiIsIHApOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisjaWZkZWYgQ09ORklHX1FVT1RBCisJaWYgKCFzYmktPnNfanF1b3RhX2ZtdCAmJiAoc2JpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSB8fAorCSAgICBzYmktPnNfcWZfbmFtZXNbR1JQUVVPVEFdKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJFWFQzLWZzOiBqb3VybmFsbGVkIHF1b3RhIGZvcm1hdCBub3Qgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19zZXR1cF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXMsCisJCQkgICAgaW50IHJlYWRfb25seSkKK3sKKwlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkgPSBFWFQzX1NCKHNiKTsKKwlpbnQgcmVzID0gMDsKKworCWlmIChsZTMyX3RvX2NwdShlcy0+c19yZXZfbGV2ZWwpID4gRVhUM19NQVhfU1VQUF9SRVYpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiRVhUMy1mcyB3YXJuaW5nOiByZXZpc2lvbiBsZXZlbCB0b28gaGlnaCwgIgorCQkJImZvcmNpbmcgcmVhZC1vbmx5IG1vZGVcbiIpOworCQlyZXMgPSBNU19SRE9OTFk7CisJfQorCWlmIChyZWFkX29ubHkpCisJCXJldHVybiByZXM7CisJaWYgKCEoc2JpLT5zX21vdW50X3N0YXRlICYgRVhUM19WQUxJRF9GUykpCisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJFWFQzLWZzIHdhcm5pbmc6IG1vdW50aW5nIHVuY2hlY2tlZCBmcywgIgorCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwllbHNlIGlmICgoc2JpLT5zX21vdW50X3N0YXRlICYgRVhUM19FUlJPUl9GUykpCisJCXByaW50ayAoS0VSTl9XQVJOSU5HCisJCQkiRVhUMy1mcyB3YXJuaW5nOiBtb3VudGluZyBmcyB3aXRoIGVycm9ycywgIgorCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwllbHNlIGlmICgoX19zMTYpIGxlMTZfdG9fY3B1KGVzLT5zX21heF9tbnRfY291bnQpID49IDAgJiYKKwkJIGxlMTZfdG9fY3B1KGVzLT5zX21udF9jb3VudCkgPj0KKwkJICh1bnNpZ25lZCBzaG9ydCkgKF9fczE2KSBsZTE2X3RvX2NwdShlcy0+c19tYXhfbW50X2NvdW50KSkKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcKKwkJCSJFWFQzLWZzIHdhcm5pbmc6IG1heGltYWwgbW91bnQgY291bnQgcmVhY2hlZCwgIgorCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwllbHNlIGlmIChsZTMyX3RvX2NwdShlcy0+c19jaGVja2ludGVydmFsKSAmJgorCQkobGUzMl90b19jcHUoZXMtPnNfbGFzdGNoZWNrKSArCisJCQlsZTMyX3RvX2NwdShlcy0+c19jaGVja2ludGVydmFsKSA8PSBnZXRfc2Vjb25kcygpKSkKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcKKwkJCSJFWFQzLWZzIHdhcm5pbmc6IGNoZWNrdGltZSByZWFjaGVkLCAiCisJCQkicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOworI2lmIDAKKwkJLyogQEBAIFdlIF93aWxsXyB3YW50IHRvIGNsZWFyIHRoZSB2YWxpZCBiaXQgaWYgd2UgZmluZAorICAgICAgICAgICAgICAgICAgIGluY29uc2lzdGVuY2llcywgdG8gZm9yY2UgYSBmc2NrIGF0IHJlYm9vdC4gIEJ1dCBmb3IKKyAgICAgICAgICAgICAgICAgICBhIHBsYWluIGpvdXJuYWxlZCBmaWxlc3lzdGVtIHdlIGNhbiBrZWVwIGl0IHNldCBhcworICAgICAgICAgICAgICAgICAgIHZhbGlkIGZvcmV2ZXIhIDopICovCisJZXMtPnNfc3RhdGUgPSBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShlcy0+c19zdGF0ZSkgJiB+RVhUM19WQUxJRF9GUyk7CisjZW5kaWYKKwlpZiAoIShfX3MxNikgbGUxNl90b19jcHUoZXMtPnNfbWF4X21udF9jb3VudCkpCisJCWVzLT5zX21heF9tbnRfY291bnQgPSBjcHVfdG9fbGUxNihFWFQzX0RGTF9NQVhfTU5UX0NPVU5UKTsKKwllcy0+c19tbnRfY291bnQ9Y3B1X3RvX2xlMTYobGUxNl90b19jcHUoZXMtPnNfbW50X2NvdW50KSArIDEpOworCWVzLT5zX210aW1lID0gY3B1X3RvX2xlMzIoZ2V0X3NlY29uZHMoKSk7CisJZXh0M191cGRhdGVfZHluYW1pY19yZXYoc2IpOworCUVYVDNfU0VUX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKKworCWV4dDNfY29tbWl0X3N1cGVyKHNiLCBlcywgMSk7CisJaWYgKHRlc3Rfb3B0KHNiLCBERUJVRykpCisJCXByaW50ayhLRVJOX0lORk8gIltFWFQzIEZTIGJzPSVsdSwgZ2M9JWx1LCAiCisJCQkJImJwZz0lbHUsIGlwZz0lbHUsIG1vPSUwNGx4XVxuIiwKKwkJCXNiLT5zX2Jsb2Nrc2l6ZSwKKwkJCXNiaS0+c19ncm91cHNfY291bnQsCisJCQlFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpLAorCQkJRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKSwKKwkJCXNiaS0+c19tb3VudF9vcHQpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRVhUMyBGUyBvbiAlcywgIiwgc2ItPnNfaWQpOworCWlmIChFWFQzX1NCKHNiKS0+c19qb3VybmFsLT5qX2lub2RlID09IE5VTEwpIHsKKwkJY2hhciBiW0JERVZOQU1FX1NJWkVdOworCisJCXByaW50aygiZXh0ZXJuYWwgam91cm5hbCBvbiAlc1xuIiwKKwkJCWJkZXZuYW1lKEVYVDNfU0Ioc2IpLT5zX2pvdXJuYWwtPmpfZGV2LCBiKSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJpbnRlcm5hbCBqb3VybmFsXG4iKTsKKwl9CisjaWZkZWYgQ09ORklHX0VYVDNfQ0hFQ0sKKwlpZiAodGVzdF9vcHQgKHNiLCBDSEVDSykpIHsKKwkJZXh0M19jaGVja19ibG9ja3NfYml0bWFwIChzYik7CisJCWV4dDNfY2hlY2tfaW5vZGVzX2JpdG1hcCAoc2IpOworCX0KKyNlbmRpZgorCXJldHVybiByZXM7Cit9CisKKy8qIENhbGxlZCBhdCBtb3VudC10aW1lLCBzdXBlci1ibG9jayBpcyBsb2NrZWQgKi8KK3N0YXRpYyBpbnQgZXh0M19jaGVja19kZXNjcmlwdG9ycyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpID0gRVhUM19TQihzYik7CisJdW5zaWduZWQgbG9uZyBibG9jayA9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICogZ2RwID0gTlVMTDsKKwlpbnQgZGVzY19ibG9jayA9IDA7CisJaW50IGk7CisKKwlleHQzX2RlYnVnICgiQ2hlY2tpbmcgZ3JvdXAgZGVzY3JpcHRvcnMiKTsKKworCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfZ3JvdXBzX2NvdW50OyBpKyspCisJeworCQlpZiAoKGkgJSBFWFQzX0RFU0NfUEVSX0JMT0NLKHNiKSkgPT0gMCkKKwkJCWdkcCA9IChzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICopCisJCQkJCXNiaS0+c19ncm91cF9kZXNjW2Rlc2NfYmxvY2srK10tPmJfZGF0YTsKKwkJaWYgKGxlMzJfdG9fY3B1KGdkcC0+YmdfYmxvY2tfYml0bWFwKSA8IGJsb2NrIHx8CisJCSAgICBsZTMyX3RvX2NwdShnZHAtPmJnX2Jsb2NrX2JpdG1hcCkgPj0KKwkJCQlibG9jayArIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikpCisJCXsKKwkJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19jaGVja19kZXNjcmlwdG9ycyIsCisJCQkJICAgICJCbG9jayBiaXRtYXAgZm9yIGdyb3VwICVkIgorCQkJCSAgICAiIG5vdCBpbiBncm91cCAoYmxvY2sgJWx1KSEiLAorCQkJCSAgICBpLCAodW5zaWduZWQgbG9uZykKKwkJCQkJbGUzMl90b19jcHUoZ2RwLT5iZ19ibG9ja19iaXRtYXApKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX2JpdG1hcCkgPCBibG9jayB8fAorCQkgICAgbGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV9iaXRtYXApID49CisJCQkJYmxvY2sgKyBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpKQorCQl7CisJCQlleHQzX2Vycm9yIChzYiwgImV4dDNfY2hlY2tfZGVzY3JpcHRvcnMiLAorCQkJCSAgICAiSW5vZGUgYml0bWFwIGZvciBncm91cCAlZCIKKwkJCQkgICAgIiBub3QgaW4gZ3JvdXAgKGJsb2NrICVsdSkhIiwKKwkJCQkgICAgaSwgKHVuc2lnbmVkIGxvbmcpCisJCQkJCWxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfYml0bWFwKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAobGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV90YWJsZSkgPCBibG9jayB8fAorCQkgICAgbGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV90YWJsZSkgKyBzYmktPnNfaXRiX3Blcl9ncm91cCA+PQorCQkgICAgYmxvY2sgKyBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpKQorCQl7CisJCQlleHQzX2Vycm9yIChzYiwgImV4dDNfY2hlY2tfZGVzY3JpcHRvcnMiLAorCQkJCSAgICAiSW5vZGUgdGFibGUgZm9yIGdyb3VwICVkIgorCQkJCSAgICAiIG5vdCBpbiBncm91cCAoYmxvY2sgJWx1KSEiLAorCQkJCSAgICBpLCAodW5zaWduZWQgbG9uZykKKwkJCQkJbGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV90YWJsZSkpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYmxvY2sgKz0gRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwkJZ2RwKys7CisJfQorCisJc2JpLT5zX2VzLT5zX2ZyZWVfYmxvY2tzX2NvdW50PWNwdV90b19sZTMyKGV4dDNfY291bnRfZnJlZV9ibG9ja3Moc2IpKTsKKwlzYmktPnNfZXMtPnNfZnJlZV9pbm9kZXNfY291bnQ9Y3B1X3RvX2xlMzIoZXh0M19jb3VudF9mcmVlX2lub2RlcyhzYikpOworCXJldHVybiAxOworfQorCisKKy8qIGV4dDNfb3JwaGFuX2NsZWFudXAoKSB3YWxrcyBhIHNpbmdseS1saW5rZWQgbGlzdCBvZiBpbm9kZXMgKHN0YXJ0aW5nIGF0CisgKiB0aGUgc3VwZXJibG9jaykgd2hpY2ggd2VyZSBkZWxldGVkIGZyb20gYWxsIGRpcmVjdG9yaWVzLCBidXQgaGVsZCBvcGVuIGJ5CisgKiBhIHByb2Nlc3MgYXQgdGhlIHRpbWUgb2YgYSBjcmFzaC4gIFdlIHdhbGsgdGhlIGxpc3QgYW5kIHRyeSB0byBkZWxldGUgdGhlc2UKKyAqIGlub2RlcyBhdCByZWNvdmVyeSB0aW1lIChvbmx5IHdpdGggYSByZWFkLXdyaXRlIGZpbGVzeXN0ZW0pLgorICoKKyAqIEluIG9yZGVyIHRvIGtlZXAgdGhlIG9ycGhhbiBpbm9kZSBjaGFpbiBjb25zaXN0ZW50IGR1cmluZyB0cmF2ZXJzYWwgKGluCisgKiBjYXNlIG9mIGNyYXNoIGR1cmluZyByZWNvdmVyeSksIHdlIGxpbmsgZWFjaCBpbm9kZSBpbnRvIHRoZSBzdXBlcmJsb2NrCisgKiBvcnBoYW4gbGlzdF9oZWFkIGFuZCBoYW5kbGUgaXQgdGhlIHNhbWUgd2F5IGFzIGFuIGlub2RlIGRlbGV0aW9uIGR1cmluZworICogbm9ybWFsIG9wZXJhdGlvbiAod2hpY2ggam91cm5hbHMgdGhlIG9wZXJhdGlvbnMgZm9yIHVzKS4KKyAqCisgKiBXZSBvbmx5IGRvIGFuIGlnZXQoKSBhbmQgYW4gaXB1dCgpIG9uIGVhY2ggaW5vZGUsIHdoaWNoIGlzIHZlcnkgc2FmZSBpZiB3ZQorICogYWNjaWRlbnRhbGx5IHBvaW50IGF0IGFuIGluLXVzZSBvciBhbHJlYWR5IGRlbGV0ZWQgaW5vZGUuICBUaGUgd29yc3QgdGhhdAorICogY2FuIGhhcHBlbiBpbiB0aGlzIGNhc2UgaXMgdGhhdCB3ZSBnZXQgYSAiYml0IGFscmVhZHkgY2xlYXJlZCIgbWVzc2FnZSBmcm9tCisgKiBleHQzX2ZyZWVfaW5vZGUoKS4gIFRoZSBvbmx5IHJlYXNvbiB3ZSB3b3VsZCBwb2ludCBhdCBhIHdyb25nIGlub2RlIGlzIGlmCisgKiBlMmZzY2sgd2FzIHJ1biBvbiB0aGlzIGZpbGVzeXN0ZW0sIGFuZCBpdCBtdXN0IGhhdmUgYWxyZWFkeSBkb25lIHRoZSBvcnBoYW4KKyAqIGlub2RlIGNsZWFudXAgZm9yIHVzLCBzbyB3ZSBjYW4gc2FmZWx5IGFib3J0IHdpdGhvdXQgYW55IGZ1cnRoZXIgYWN0aW9uLgorICovCitzdGF0aWMgdm9pZCBleHQzX29ycGhhbl9jbGVhbnVwIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCQkgc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlcykKK3sKKwl1bnNpZ25lZCBpbnQgc19mbGFncyA9IHNiLT5zX2ZsYWdzOworCWludCBucl9vcnBoYW5zID0gMCwgbnJfdHJ1bmNhdGVzID0gMDsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwlpbnQgaTsKKyNlbmRpZgorCWlmICghZXMtPnNfbGFzdF9vcnBoYW4pIHsKKwkJamJkX2RlYnVnKDQsICJubyBvcnBoYW4gaW5vZGVzIHRvIGNsZWFuIHVwXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChFWFQzX1NCKHNiKS0+c19tb3VudF9zdGF0ZSAmIEVYVDNfRVJST1JfRlMpIHsKKwkJaWYgKGVzLT5zX2xhc3Rfb3JwaGFuKQorCQkJamJkX2RlYnVnKDEsICJFcnJvcnMgb24gZmlsZXN5c3RlbSwgIgorCQkJCSAgImNsZWFyaW5nIG9ycGhhbiBsaXN0LlxuIik7CisJCWVzLT5zX2xhc3Rfb3JwaGFuID0gMDsKKwkJamJkX2RlYnVnKDEsICJTa2lwcGluZyBvcnBoYW4gcmVjb3Zlcnkgb24gZnMgd2l0aCBlcnJvcnMuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzX2ZsYWdzICYgTVNfUkRPTkxZKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkVYVDMtZnM6ICVzOiBvcnBoYW4gY2xlYW51cCBvbiByZWFkb25seSBmc1xuIiwKKwkJICAgICAgIHNiLT5zX2lkKTsKKwkJc2ItPnNfZmxhZ3MgJj0gfk1TX1JET05MWTsKKwl9CisjaWZkZWYgQ09ORklHX1FVT1RBCisJLyogTmVlZGVkIGZvciBpcHV0KCkgdG8gd29yayBjb3JyZWN0bHkgYW5kIG5vdCB0cmFzaCBkYXRhICovCisJc2ItPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOworCS8qIFR1cm4gb24gcXVvdGFzIHNvIHRoYXQgdGhleSBhcmUgdXBkYXRlZCBjb3JyZWN0bHkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspIHsKKwkJaWYgKEVYVDNfU0Ioc2IpLT5zX3FmX25hbWVzW2ldKSB7CisJCQlpbnQgcmV0ID0gZXh0M19xdW90YV9vbl9tb3VudChzYiwgaSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJIkVYVDMtZnM6IENhbm5vdCB0dXJuIG9uIGpvdXJuYWxsZWQgIgorCQkJCQkicXVvdGE6IGVycm9yICVkXG4iLCByZXQpOworCQl9CisJfQorI2VuZGlmCisKKwl3aGlsZSAoZXMtPnNfbGFzdF9vcnBoYW4pIHsKKwkJc3RydWN0IGlub2RlICppbm9kZTsKKworCQlpZiAoIShpbm9kZSA9CisJCSAgICAgIGV4dDNfb3JwaGFuX2dldChzYiwgbGUzMl90b19jcHUoZXMtPnNfbGFzdF9vcnBoYW4pKSkpIHsKKwkJCWVzLT5zX2xhc3Rfb3JwaGFuID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJbGlzdF9hZGQoJkVYVDNfSShpbm9kZSktPmlfb3JwaGFuLCAmRVhUM19TQihzYiktPnNfb3JwaGFuKTsKKwkJRFFVT1RfSU5JVChpbm9kZSk7CisJCWlmIChpbm9kZS0+aV9ubGluaykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkiJXM6IHRydW5jYXRpbmcgaW5vZGUgJWxkIHRvICVMZCBieXRlc1xuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGlub2RlLT5pX2lubywgaW5vZGUtPmlfc2l6ZSk7CisJCQlqYmRfZGVidWcoMiwgInRydW5jYXRpbmcgaW5vZGUgJWxkIHRvICVMZCBieXRlc1xuIiwKKwkJCQkgIGlub2RlLT5pX2lubywgaW5vZGUtPmlfc2l6ZSk7CisJCQlleHQzX3RydW5jYXRlKGlub2RlKTsKKwkJCW5yX3RydW5jYXRlcysrOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkiJXM6IGRlbGV0aW5nIHVucmVmZXJlbmNlZCBpbm9kZSAlbGRcbiIsCisJCQkJX19GVU5DVElPTl9fLCBpbm9kZS0+aV9pbm8pOworCQkJamJkX2RlYnVnKDIsICJkZWxldGluZyB1bnJlZmVyZW5jZWQgaW5vZGUgJWxkXG4iLAorCQkJCSAgaW5vZGUtPmlfaW5vKTsKKwkJCW5yX29ycGhhbnMrKzsKKwkJfQorCQlpcHV0KGlub2RlKTsgIC8qIFRoZSBkZWxldGUgbWFnaWMgaGFwcGVucyBoZXJlISAqLworCX0KKworI2RlZmluZSBQTFVSQUwoeCkgKHgpLCAoKHgpPT0xKSA/ICIiIDogInMiCisKKwlpZiAobnJfb3JwaGFucykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRVhUMy1mczogJXM6ICVkIG9ycGhhbiBpbm9kZSVzIGRlbGV0ZWRcbiIsCisJCSAgICAgICBzYi0+c19pZCwgUExVUkFMKG5yX29ycGhhbnMpKTsKKwlpZiAobnJfdHJ1bmNhdGVzKQorCQlwcmludGsoS0VSTl9JTkZPICJFWFQzLWZzOiAlczogJWQgdHJ1bmNhdGUlcyBjbGVhbmVkIHVwXG4iLAorCQkgICAgICAgc2ItPnNfaWQsIFBMVVJBTChucl90cnVuY2F0ZXMpKTsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwkvKiBUdXJuIHF1b3RhcyBvZmYgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspIHsKKwkJaWYgKHNiX2Rxb3B0KHNiKS0+ZmlsZXNbaV0pCisJCQl2ZnNfcXVvdGFfb2ZmKHNiLCBpKTsKKwl9CisjZW5kaWYKKwlzYi0+c19mbGFncyA9IHNfZmxhZ3M7IC8qIFJlc3RvcmUgTVNfUkRPTkxZIHN0YXR1cyAqLworfQorCisjZGVmaW5lIGxvZzIobikgZmZ6KH4obikpCisKKy8qCisgKiBNYXhpbWFsIGZpbGUgc2l6ZS4gIFRoZXJlIGlzIGEgZGlyZWN0LCBhbmQgeyxkb3VibGUtLHRyaXBsZS19aW5kaXJlY3QKKyAqIGJsb2NrIGxpbWl0LCBhbmQgYWxzbyBhIGxpbWl0IG9mICgyXjMyIC0gMSkgNTEyLWJ5dGUgc2VjdG9ycyBpbiBpX2Jsb2Nrcy4KKyAqIFdlIG5lZWQgdG8gYmUgMSBmaWxlc3lzdGVtIGJsb2NrIGxlc3MgdGhhbiB0aGUgMl4zMiBzZWN0b3IgbGltaXQuCisgKi8KK3N0YXRpYyBsb2ZmX3QgZXh0M19tYXhfc2l6ZShpbnQgYml0cykKK3sKKwlsb2ZmX3QgcmVzID0gRVhUM19ORElSX0JMT0NLUzsKKwkvKiBUaGlzIGNvbnN0YW50IGlzIGNhbGN1bGF0ZWQgdG8gYmUgdGhlIGxhcmdlc3QgZmlsZSBzaXplIGZvciBhCisJICogZGVuc2UsIDRrLWJsb2Nrc2l6ZSBmaWxlIHN1Y2ggdGhhdCB0aGUgdG90YWwgbnVtYmVyIG9mCisJICogc2VjdG9ycyBpbiB0aGUgZmlsZSwgaW5jbHVkaW5nIGRhdGEgYW5kIGFsbCBpbmRpcmVjdCBibG9ja3MsCisJICogZG9lcyBub3QgZXhjZWVkIDJeMzIuICovCisJY29uc3QgbG9mZl90IHVwcGVyX2xpbWl0ID0gMHgxZmY3ZmZmZDAwMExMOworCisJcmVzICs9IDFMTCA8PCAoYml0cy0yKTsKKwlyZXMgKz0gMUxMIDw8ICgyKihiaXRzLTIpKTsKKwlyZXMgKz0gMUxMIDw8ICgzKihiaXRzLTIpKTsKKwlyZXMgPDw9IGJpdHM7CisJaWYgKHJlcyA+IHVwcGVyX2xpbWl0KQorCQlyZXMgPSB1cHBlcl9saW1pdDsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkZXNjcmlwdG9yX2xvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGxvZ2ljX3NiX2Jsb2NrLAorCQkJCSAgICBpbnQgbnIpCit7CisJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpID0gRVhUM19TQihzYik7CisJdW5zaWduZWQgbG9uZyBiZywgZmlyc3RfZGF0YV9ibG9jaywgZmlyc3RfbWV0YV9iZzsKKwlpbnQgaGFzX3N1cGVyID0gMDsKKworCWZpcnN0X2RhdGFfYmxvY2sgPSBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisJZmlyc3RfbWV0YV9iZyA9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19maXJzdF9tZXRhX2JnKTsKKworCWlmICghRVhUM19IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcpIHx8CisJICAgIG5yIDwgZmlyc3RfbWV0YV9iZykKKwkJcmV0dXJuIChsb2dpY19zYl9ibG9jayArIG5yICsgMSk7CisJYmcgPSBzYmktPnNfZGVzY19wZXJfYmxvY2sgKiBucjsKKwlpZiAoZXh0M19iZ19oYXNfc3VwZXIoc2IsIGJnKSkKKwkJaGFzX3N1cGVyID0gMTsKKwlyZXR1cm4gKGZpcnN0X2RhdGFfYmxvY2sgKyBoYXNfc3VwZXIgKyAoYmcgKiBzYmktPnNfYmxvY2tzX3Blcl9ncm91cCkpOworfQorCisKK3N0YXRpYyBpbnQgZXh0M19maWxsX3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcyA9IE5VTEw7CisJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpOworCXVuc2lnbmVkIGxvbmcgYmxvY2s7CisJdW5zaWduZWQgbG9uZyBzYl9ibG9jayA9IGdldF9zYl9ibG9jaygmZGF0YSk7CisJdW5zaWduZWQgbG9uZyBsb2dpY19zYl9ibG9jazsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7CisJdW5zaWduZWQgbG9uZyBqb3VybmFsX2ludW0gPSAwOworCXVuc2lnbmVkIGxvbmcgZGVmX21vdW50X29wdHM7CisJc3RydWN0IGlub2RlICpyb290OworCWludCBibG9ja3NpemU7CisJaW50IGhibG9jazsKKwlpbnQgZGJfY291bnQ7CisJaW50IGk7CisJaW50IG5lZWRzX3JlY292ZXJ5OworCV9fbGUzMiBmZWF0dXJlczsKKworCXNiaSA9IGttYWxsb2Moc2l6ZW9mKCpzYmkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNiaSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2ItPnNfZnNfaW5mbyA9IHNiaTsKKwltZW1zZXQoc2JpLCAwLCBzaXplb2YoKnNiaSkpOworCXNiaS0+c19tb3VudF9vcHQgPSAwOworCXNiaS0+c19yZXN1aWQgPSBFWFQzX0RFRl9SRVNVSUQ7CisJc2JpLT5zX3Jlc2dpZCA9IEVYVDNfREVGX1JFU0dJRDsKKworCXVubG9ja19rZXJuZWwoKTsKKworCWJsb2Nrc2l6ZSA9IHNiX21pbl9ibG9ja3NpemUoc2IsIEVYVDNfTUlOX0JMT0NLX1NJWkUpOworCWlmICghYmxvY2tzaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogdW5hYmxlIHRvIHNldCBibG9ja3NpemVcbiIpOworCQlnb3RvIG91dF9mYWlsOworCX0KKworCS8qCisJICogVGhlIGV4dDMgc3VwZXJibG9jayB3aWxsIG5vdCBiZSBidWZmZXIgYWxpZ25lZCBmb3Igb3RoZXIgdGhhbiAxa0IKKwkgKiBibG9jayBzaXplcy4gIFdlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgZnJvbSBidWZmZXIgc3RhcnQuCisJICovCisJaWYgKGJsb2Nrc2l6ZSAhPSBFWFQzX01JTl9CTE9DS19TSVpFKSB7CisJCWxvZ2ljX3NiX2Jsb2NrID0gKHNiX2Jsb2NrICogRVhUM19NSU5fQkxPQ0tfU0laRSkgLyBibG9ja3NpemU7CisJCW9mZnNldCA9IChzYl9ibG9jayAqIEVYVDNfTUlOX0JMT0NLX1NJWkUpICUgYmxvY2tzaXplOworCX0gZWxzZSB7CisJCWxvZ2ljX3NiX2Jsb2NrID0gc2JfYmxvY2s7CisJfQorCisJaWYgKCEoYmggPSBzYl9icmVhZChzYiwgbG9naWNfc2JfYmxvY2spKSkgeworCQlwcmludGsgKEtFUk5fRVJSICJFWFQzLWZzOiB1bmFibGUgdG8gcmVhZCBzdXBlcmJsb2NrXG4iKTsKKwkJZ290byBvdXRfZmFpbDsKKwl9CisJLyoKKwkgKiBOb3RlOiBzX2VzIG11c3QgYmUgaW5pdGlhbGl6ZWQgYXMgc29vbiBhcyBwb3NzaWJsZSBiZWNhdXNlCisJICogICAgICAgc29tZSBleHQzIG1hY3JvLWluc3RydWN0aW9ucyBkZXBlbmQgb24gaXRzIHZhbHVlCisJICovCisJZXMgPSAoc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKikgKCgoY2hhciAqKWJoLT5iX2RhdGEpICsgb2Zmc2V0KTsKKwlzYmktPnNfZXMgPSBlczsKKwlzYi0+c19tYWdpYyA9IGxlMTZfdG9fY3B1KGVzLT5zX21hZ2ljKTsKKwlpZiAoc2ItPnNfbWFnaWMgIT0gRVhUM19TVVBFUl9NQUdJQykKKwkJZ290byBjYW50ZmluZF9leHQzOworCisJLyogU2V0IGRlZmF1bHRzIGJlZm9yZSB3ZSBwYXJzZSB0aGUgbW91bnQgb3B0aW9ucyAqLworCWRlZl9tb3VudF9vcHRzID0gbGUzMl90b19jcHUoZXMtPnNfZGVmYXVsdF9tb3VudF9vcHRzKTsKKwlpZiAoZGVmX21vdW50X29wdHMgJiBFWFQzX0RFRk1fREVCVUcpCisJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgREVCVUcpOworCWlmIChkZWZfbW91bnRfb3B0cyAmIEVYVDNfREVGTV9CU0RHUk9VUFMpCisJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgR1JQSUQpOworCWlmIChkZWZfbW91bnRfb3B0cyAmIEVYVDNfREVGTV9VSUQxNikKKwkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBOT19VSUQzMik7CisJaWYgKGRlZl9tb3VudF9vcHRzICYgRVhUM19ERUZNX1hBVFRSX1VTRVIpCisJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgWEFUVFJfVVNFUik7CisJaWYgKGRlZl9tb3VudF9vcHRzICYgRVhUM19ERUZNX0FDTCkKKwkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBQT1NJWF9BQ0wpOworCWlmICgoZGVmX21vdW50X29wdHMgJiBFWFQzX0RFRk1fSk1PREUpID09IEVYVDNfREVGTV9KTU9ERV9EQVRBKQorCQlzYmktPnNfbW91bnRfb3B0IHw9IEVYVDNfTU9VTlRfSk9VUk5BTF9EQVRBOworCWVsc2UgaWYgKChkZWZfbW91bnRfb3B0cyAmIEVYVDNfREVGTV9KTU9ERSkgPT0gRVhUM19ERUZNX0pNT0RFX09SREVSRUQpCisJCXNiaS0+c19tb3VudF9vcHQgfD0gRVhUM19NT1VOVF9PUkRFUkVEX0RBVEE7CisJZWxzZSBpZiAoKGRlZl9tb3VudF9vcHRzICYgRVhUM19ERUZNX0pNT0RFKSA9PSBFWFQzX0RFRk1fSk1PREVfV0JBQ0spCisJCXNiaS0+c19tb3VudF9vcHQgfD0gRVhUM19NT1VOVF9XUklURUJBQ0tfREFUQTsKKworCWlmIChsZTE2X3RvX2NwdShzYmktPnNfZXMtPnNfZXJyb3JzKSA9PSBFWFQzX0VSUk9SU19QQU5JQykKKwkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUEFOSUMpOworCWVsc2UgaWYgKGxlMTZfdG9fY3B1KHNiaS0+c19lcy0+c19lcnJvcnMpID09IEVYVDNfRVJST1JTX1JPKQorCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19STyk7CisKKwlzYmktPnNfcmVzdWlkID0gbGUxNl90b19jcHUoZXMtPnNfZGVmX3Jlc3VpZCk7CisJc2JpLT5zX3Jlc2dpZCA9IGxlMTZfdG9fY3B1KGVzLT5zX2RlZl9yZXNnaWQpOworCisJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBSRVNFUlZBVElPTik7CisKKwlpZiAoIXBhcnNlX29wdGlvbnMgKChjaGFyICopIGRhdGEsIHNiLCAmam91cm5hbF9pbnVtLCBOVUxMLCAwKSkKKwkJZ290byBmYWlsZWRfbW91bnQ7CisKKwlzYi0+c19mbGFncyA9IChzYi0+c19mbGFncyAmIH5NU19QT1NJWEFDTCkgfAorCQkoKHNiaS0+c19tb3VudF9vcHQgJiBFWFQzX01PVU5UX1BPU0lYX0FDTCkgPyBNU19QT1NJWEFDTCA6IDApOworCisJaWYgKGxlMzJfdG9fY3B1KGVzLT5zX3Jldl9sZXZlbCkgPT0gRVhUM19HT09EX09MRF9SRVYgJiYKKwkgICAgKEVYVDNfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCB+MFUpIHx8CisJICAgICBFWFQzX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgfjBVKSB8fAorCSAgICAgRVhUM19IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgfjBVKSkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCSAgICAgICAiRVhUMy1mcyB3YXJuaW5nOiBmZWF0dXJlIGZsYWdzIHNldCBvbiByZXYgMCBmcywgIgorCQkgICAgICAgInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwkvKgorCSAqIENoZWNrIGZlYXR1cmUgZmxhZ3MgcmVnYXJkbGVzcyBvZiB0aGUgcmV2aXNpb24gbGV2ZWwsIHNpbmNlIHdlCisJICogcHJldmlvdXNseSBkaWRuJ3QgY2hhbmdlIHRoZSByZXZpc2lvbiBsZXZlbCB3aGVuIHNldHRpbmcgdGhlIGZsYWdzLAorCSAqIHNvIHRoZXJlIGlzIGEgY2hhbmNlIGluY29tcGF0IGZsYWdzIGFyZSBzZXQgb24gYSByZXYgMCBmaWxlc3lzdGVtLgorCSAqLworCWZlYXR1cmVzID0gRVhUM19IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgfkVYVDNfRkVBVFVSRV9JTkNPTVBBVF9TVVBQKTsKKwlpZiAoZmVhdHVyZXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiAlczogY291bGRuJ3QgbW91bnQgYmVjYXVzZSBvZiAiCisJCSAgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsCisJCSAgICAgICBzYi0+c19pZCwgbGUzMl90b19jcHUoZmVhdHVyZXMpKTsKKwkJZ290byBmYWlsZWRfbW91bnQ7CisJfQorCWZlYXR1cmVzID0gRVhUM19IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsIH5FWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApOworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJiBmZWF0dXJlcykgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6ICVzOiBjb3VsZG4ndCBtb3VudCBSRFdSIGJlY2F1c2Ugb2YgIgorCQkgICAgICAgInVuc3VwcG9ydGVkIG9wdGlvbmFsIGZlYXR1cmVzICgleCkuXG4iLAorCQkgICAgICAgc2ItPnNfaWQsIGxlMzJfdG9fY3B1KGZlYXR1cmVzKSk7CisJCWdvdG8gZmFpbGVkX21vdW50OworCX0KKwlibG9ja3NpemUgPSBCTE9DS19TSVpFIDw8IGxlMzJfdG9fY3B1KGVzLT5zX2xvZ19ibG9ja19zaXplKTsKKworCWlmIChibG9ja3NpemUgPCBFWFQzX01JTl9CTE9DS19TSVpFIHx8CisJICAgIGJsb2Nrc2l6ZSA+IEVYVDNfTUFYX0JMT0NLX1NJWkUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIAorCQkgICAgICAgIkVYVDMtZnM6IFVuc3VwcG9ydGVkIGZpbGVzeXN0ZW0gYmxvY2tzaXplICVkIG9uICVzLlxuIiwKKwkJICAgICAgIGJsb2Nrc2l6ZSwgc2ItPnNfaWQpOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisKKwloYmxvY2sgPSBiZGV2X2hhcmRzZWN0X3NpemUoc2ItPnNfYmRldik7CisJaWYgKHNiLT5zX2Jsb2Nrc2l6ZSAhPSBibG9ja3NpemUpIHsKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZSBibG9ja3NpemUgZm9yIHRoZSBmaWxlc3lzdGVtIGlzIGxhcmdlcgorCQkgKiB0aGFuIHRoZSBoYXJkd2FyZSBzZWN0b3JzaXplIGZvciB0aGUgbWFjaGluZS4KKwkJICovCisJCWlmIChibG9ja3NpemUgPCBoYmxvY2spIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogYmxvY2tzaXplICVkIHRvbyBzbWFsbCBmb3IgIgorCQkJICAgICAgICJkZXZpY2UgYmxvY2tzaXplICVkLlxuIiwgYmxvY2tzaXplLCBoYmxvY2spOworCQkJZ290byBmYWlsZWRfbW91bnQ7CisJCX0KKworCQlicmVsc2UgKGJoKTsKKwkJc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgYmxvY2tzaXplKTsKKwkJbG9naWNfc2JfYmxvY2sgPSAoc2JfYmxvY2sgKiBFWFQzX01JTl9CTE9DS19TSVpFKSAvIGJsb2Nrc2l6ZTsKKwkJb2Zmc2V0ID0gKHNiX2Jsb2NrICogRVhUM19NSU5fQkxPQ0tfU0laRSkgJSBibG9ja3NpemU7CisJCWJoID0gc2JfYnJlYWQoc2IsIGxvZ2ljX3NiX2Jsb2NrKTsKKwkJaWYgKCFiaCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIAorCQkJICAgICAgICJFWFQzLWZzOiBDYW4ndCByZWFkIHN1cGVyYmxvY2sgb24gMm5kIHRyeS5cbiIpOworCQkJZ290byBmYWlsZWRfbW91bnQ7CisJCX0KKwkJZXMgPSAoc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKikoKChjaGFyICopYmgtPmJfZGF0YSkgKyBvZmZzZXQpOworCQlzYmktPnNfZXMgPSBlczsKKwkJaWYgKGVzLT5zX21hZ2ljICE9IGNwdV90b19sZTE2KEVYVDNfU1VQRVJfTUFHSUMpKSB7CisJCQlwcmludGsgKEtFUk5fRVJSIAorCQkJCSJFWFQzLWZzOiBNYWdpYyBtaXNtYXRjaCwgdmVyeSB3ZWlyZCAhXG4iKTsKKwkJCWdvdG8gZmFpbGVkX21vdW50OworCQl9CisJfQorCisJc2ItPnNfbWF4Ynl0ZXMgPSBleHQzX21heF9zaXplKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKworCWlmIChsZTMyX3RvX2NwdShlcy0+c19yZXZfbGV2ZWwpID09IEVYVDNfR09PRF9PTERfUkVWKSB7CisJCXNiaS0+c19pbm9kZV9zaXplID0gRVhUM19HT09EX09MRF9JTk9ERV9TSVpFOworCQlzYmktPnNfZmlyc3RfaW5vID0gRVhUM19HT09EX09MRF9GSVJTVF9JTk87CisJfSBlbHNlIHsKKwkJc2JpLT5zX2lub2RlX3NpemUgPSBsZTE2X3RvX2NwdShlcy0+c19pbm9kZV9zaXplKTsKKwkJc2JpLT5zX2ZpcnN0X2lubyA9IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2lubyk7CisJCWlmICgoc2JpLT5zX2lub2RlX3NpemUgPCBFWFQzX0dPT0RfT0xEX0lOT0RFX1NJWkUpIHx8CisJCSAgICAoc2JpLT5zX2lub2RlX3NpemUgJiAoc2JpLT5zX2lub2RlX3NpemUgLSAxKSkgfHwKKwkJICAgIChzYmktPnNfaW5vZGVfc2l6ZSA+IGJsb2Nrc2l6ZSkpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIKKwkJCQkiRVhUMy1mczogdW5zdXBwb3J0ZWQgaW5vZGUgc2l6ZTogJWRcbiIsCisJCQkJc2JpLT5zX2lub2RlX3NpemUpOworCQkJZ290byBmYWlsZWRfbW91bnQ7CisJCX0KKwl9CisJc2JpLT5zX2ZyYWdfc2l6ZSA9IEVYVDNfTUlOX0ZSQUdfU0laRSA8PAorCQkJCSAgIGxlMzJfdG9fY3B1KGVzLT5zX2xvZ19mcmFnX3NpemUpOworCWlmIChibG9ja3NpemUgIT0gc2JpLT5zX2ZyYWdfc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJFWFQzLWZzOiBmcmFnc2l6ZSAlbHUgIT0gYmxvY2tzaXplICV1ICh1bnN1cHBvcnRlZClcbiIsCisJCSAgICAgICBzYmktPnNfZnJhZ19zaXplLCBibG9ja3NpemUpOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisJc2JpLT5zX2ZyYWdzX3Blcl9ibG9jayA9IDE7CisJc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXAgPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfcGVyX2dyb3VwKTsKKwlzYmktPnNfZnJhZ3NfcGVyX2dyb3VwID0gbGUzMl90b19jcHUoZXMtPnNfZnJhZ3NfcGVyX2dyb3VwKTsKKwlzYmktPnNfaW5vZGVzX3Blcl9ncm91cCA9IGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19wZXJfZ3JvdXApOworCWlmIChFWFQzX0lOT0RFX1NJWkUoc2IpID09IDApCisJCWdvdG8gY2FudGZpbmRfZXh0MzsKKwlzYmktPnNfaW5vZGVzX3Blcl9ibG9jayA9IGJsb2Nrc2l6ZSAvIEVYVDNfSU5PREVfU0laRShzYik7CisJaWYgKHNiaS0+c19pbm9kZXNfcGVyX2Jsb2NrID09IDApCisJCWdvdG8gY2FudGZpbmRfZXh0MzsKKwlzYmktPnNfaXRiX3Blcl9ncm91cCA9IHNiaS0+c19pbm9kZXNfcGVyX2dyb3VwIC8KKwkJCQkJc2JpLT5zX2lub2Rlc19wZXJfYmxvY2s7CisJc2JpLT5zX2Rlc2NfcGVyX2Jsb2NrID0gYmxvY2tzaXplIC8gc2l6ZW9mKHN0cnVjdCBleHQzX2dyb3VwX2Rlc2MpOworCXNiaS0+c19zYmggPSBiaDsKKwlzYmktPnNfbW91bnRfc3RhdGUgPSBsZTE2X3RvX2NwdShlcy0+c19zdGF0ZSk7CisJc2JpLT5zX2FkZHJfcGVyX2Jsb2NrX2JpdHMgPSBsb2cyKEVYVDNfQUREUl9QRVJfQkxPQ0soc2IpKTsKKwlzYmktPnNfZGVzY19wZXJfYmxvY2tfYml0cyA9IGxvZzIoRVhUM19ERVNDX1BFUl9CTE9DSyhzYikpOworCWZvciAoaT0wOyBpIDwgNDsgaSsrKQorCQlzYmktPnNfaGFzaF9zZWVkW2ldID0gbGUzMl90b19jcHUoZXMtPnNfaGFzaF9zZWVkW2ldKTsKKwlzYmktPnNfZGVmX2hhc2hfdmVyc2lvbiA9IGVzLT5zX2RlZl9oYXNoX3ZlcnNpb247CisKKwlpZiAoc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXAgPiBibG9ja3NpemUgKiA4KSB7CisJCXByaW50ayAoS0VSTl9FUlIKKwkJCSJFWFQzLWZzOiAjYmxvY2tzIHBlciBncm91cCB0b28gYmlnOiAlbHVcbiIsCisJCQlzYmktPnNfYmxvY2tzX3Blcl9ncm91cCk7CisJCWdvdG8gZmFpbGVkX21vdW50OworCX0KKwlpZiAoc2JpLT5zX2ZyYWdzX3Blcl9ncm91cCA+IGJsb2Nrc2l6ZSAqIDgpIHsKKwkJcHJpbnRrIChLRVJOX0VSUgorCQkJIkVYVDMtZnM6ICNmcmFnbWVudHMgcGVyIGdyb3VwIHRvbyBiaWc6ICVsdVxuIiwKKwkJCXNiaS0+c19mcmFnc19wZXJfZ3JvdXApOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisJaWYgKHNiaS0+c19pbm9kZXNfcGVyX2dyb3VwID4gYmxvY2tzaXplICogOCkgeworCQlwcmludGsgKEtFUk5fRVJSCisJCQkiRVhUMy1mczogI2lub2RlcyBwZXIgZ3JvdXAgdG9vIGJpZzogJWx1XG4iLAorCQkJc2JpLT5zX2lub2Rlc19wZXJfZ3JvdXApOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisKKwlpZiAoRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSA9PSAwKQorCQlnb3RvIGNhbnRmaW5kX2V4dDM7CisJc2JpLT5zX2dyb3Vwc19jb3VudCA9IChsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpIC0KKwkJCSAgICAgICBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSArCisJCQkgICAgICAgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSAtIDEpIC8KKwkJCSAgICAgIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJZGJfY291bnQgPSAoc2JpLT5zX2dyb3Vwc19jb3VudCArIEVYVDNfREVTQ19QRVJfQkxPQ0soc2IpIC0gMSkgLworCQkgICBFWFQzX0RFU0NfUEVSX0JMT0NLKHNiKTsKKwlzYmktPnNfZ3JvdXBfZGVzYyA9IGttYWxsb2MoZGJfY291bnQgKiBzaXplb2YgKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKHNiaS0+c19ncm91cF9kZXNjID09IE5VTEwpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiRVhUMy1mczogbm90IGVub3VnaCBtZW1vcnlcbiIpOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisKKwlwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKKwlwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKKwlwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZGlyc19jb3VudGVyKTsKKwliZ2xfbG9ja19pbml0KCZzYmktPnNfYmxvY2tncm91cF9sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBkYl9jb3VudDsgaSsrKSB7CisJCWJsb2NrID0gZGVzY3JpcHRvcl9sb2Moc2IsIGxvZ2ljX3NiX2Jsb2NrLCBpKTsKKwkJc2JpLT5zX2dyb3VwX2Rlc2NbaV0gPSBzYl9icmVhZChzYiwgYmxvY2spOworCQlpZiAoIXNiaS0+c19ncm91cF9kZXNjW2ldKSB7CisJCQlwcmludGsgKEtFUk5fRVJSICJFWFQzLWZzOiAiCisJCQkJImNhbid0IHJlYWQgZ3JvdXAgZGVzY3JpcHRvciAlZFxuIiwgaSk7CisJCQlkYl9jb3VudCA9IGk7CisJCQlnb3RvIGZhaWxlZF9tb3VudDI7CisJCX0KKwl9CisJaWYgKCFleHQzX2NoZWNrX2Rlc2NyaXB0b3JzIChzYikpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiRVhUMy1mczogZ3JvdXAgZGVzY3JpcHRvcnMgY29ycnVwdGVkICFcbiIpOworCQlnb3RvIGZhaWxlZF9tb3VudDI7CisJfQorCXNiaS0+c19nZGJfY291bnQgPSBkYl9jb3VudDsKKwlnZXRfcmFuZG9tX2J5dGVzKCZzYmktPnNfbmV4dF9nZW5lcmF0aW9uLCBzaXplb2YodTMyKSk7CisJc3Bpbl9sb2NrX2luaXQoJnNiaS0+c19uZXh0X2dlbl9sb2NrKTsKKwkvKiBwZXIgZmlsZXlzdGVtIHJlc2VydmF0aW9uIGxpc3QgaGVhZCAmIGxvY2sgKi8KKwlzcGluX2xvY2tfaW5pdCgmc2JpLT5zX3Jzdl93aW5kb3dfbG9jayk7CisJc2JpLT5zX3Jzdl93aW5kb3dfcm9vdCA9IFJCX1JPT1Q7CisJLyogQWRkIGEgc2luZ2xlLCBzdGF0aWMgZHVtbXkgcmVzZXJ2YXRpb24gdG8gdGhlIHN0YXJ0IG9mIHRoZQorCSAqIHJlc2VydmF0aW9uIHdpbmRvdyBsaXN0IC0tLSBpdCBnaXZlcyB1cyBhIHBsYWNlaG9sZGVyIGZvcgorCSAqIGFwcGVuZC1hdC1zdGFydC1vZi1saXN0IHdoaWNoIG1ha2VzIHRoZSBhbGxvY2F0aW9uIGxvZ2ljCisJICogX211Y2hfIHNpbXBsZXIuICovCisJc2JpLT5zX3Jzdl93aW5kb3dfaGVhZC5yc3Zfc3RhcnQgPSBFWFQzX1JFU0VSVkVfV0lORE9XX05PVF9BTExPQ0FURUQ7CisJc2JpLT5zX3Jzdl93aW5kb3dfaGVhZC5yc3ZfZW5kID0gRVhUM19SRVNFUlZFX1dJTkRPV19OT1RfQUxMT0NBVEVEOworCXNiaS0+c19yc3Zfd2luZG93X2hlYWQucnN2X2FsbG9jX2hpdCA9IDA7CisJc2JpLT5zX3Jzdl93aW5kb3dfaGVhZC5yc3ZfZ29hbF9zaXplID0gMDsKKwlleHQzX3Jzdl93aW5kb3dfYWRkKHNiLCAmc2JpLT5zX3Jzdl93aW5kb3dfaGVhZCk7CisKKwkvKgorCSAqIHNldCB1cCBlbm91Z2ggc28gdGhhdCBpdCBjYW4gcmVhZCBhbiBpbm9kZQorCSAqLworCXNiLT5zX29wID0gJmV4dDNfc29wczsKKwlzYi0+c19leHBvcnRfb3AgPSAmZXh0M19leHBvcnRfb3BzOworCXNiLT5zX3hhdHRyID0gZXh0M194YXR0cl9oYW5kbGVyczsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwlzYi0+c19xY29wID0gJmV4dDNfcWN0bF9vcGVyYXRpb25zOworCXNiLT5kcV9vcCA9ICZleHQzX3F1b3RhX29wZXJhdGlvbnM7CisjZW5kaWYKKwlJTklUX0xJU1RfSEVBRCgmc2JpLT5zX29ycGhhbik7IC8qIHVubGlua2VkIGJ1dCBvcGVuIGZpbGVzICovCisKKwlzYi0+c19yb290ID0gTlVMTDsKKworCW5lZWRzX3JlY292ZXJ5ID0gKGVzLT5zX2xhc3Rfb3JwaGFuICE9IDAgfHwKKwkJCSAgRVhUM19IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwKKwkJCQkgICAgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpKTsKKworCS8qCisJICogVGhlIGZpcnN0IGlub2RlIHdlIGxvb2sgYXQgaXMgdGhlIGpvdXJuYWwgaW5vZGUuICBEb24ndCB0cnkKKwkgKiByb290IGZpcnN0OiBpdCBtYXkgYmUgbW9kaWZpZWQgaW4gdGhlIGpvdXJuYWwhCisJICovCisJaWYgKCF0ZXN0X29wdChzYiwgTk9MT0FEKSAmJgorCSAgICBFWFQzX0hBU19DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpIHsKKwkJaWYgKGV4dDNfbG9hZF9qb3VybmFsKHNiLCBlcykpCisJCQlnb3RvIGZhaWxlZF9tb3VudDI7CisJfSBlbHNlIGlmIChqb3VybmFsX2ludW0pIHsKKwkJaWYgKGV4dDNfY3JlYXRlX2pvdXJuYWwoc2IsIGVzLCBqb3VybmFsX2ludW0pKQorCQkJZ290byBmYWlsZWRfbW91bnQyOworCX0gZWxzZSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrIChLRVJOX0VSUgorCQkJCSJleHQzOiBObyBqb3VybmFsIG9uIGZpbGVzeXN0ZW0gb24gJXNcbiIsCisJCQkJc2ItPnNfaWQpOworCQlnb3RvIGZhaWxlZF9tb3VudDI7CisJfQorCisJLyogV2UgaGF2ZSBub3cgdXBkYXRlZCB0aGUgam91cm5hbCBpZiByZXF1aXJlZCwgc28gd2UgY2FuCisJICogdmFsaWRhdGUgdGhlIGRhdGEgam91cm5hbGluZyBtb2RlLiAqLworCXN3aXRjaCAodGVzdF9vcHQoc2IsIERBVEFfRkxBR1MpKSB7CisJY2FzZSAwOgorCQkvKiBObyBtb2RlIHNldCwgYXNzdW1lIGEgZGVmYXVsdCBiYXNlZCBvbiB0aGUgam91cm5hbAorICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllczogT1JERVJFRF9EQVRBIGlmIHRoZSBqb3VybmFsIGNhbgorICAgICAgICAgICAgICAgICAgIGNvcGUsIGVsc2UgSk9VUk5BTF9EQVRBICovCisJCWlmIChqb3VybmFsX2NoZWNrX2F2YWlsYWJsZV9mZWF0dXJlcworCQkgICAgKHNiaS0+c19qb3VybmFsLCAwLCAwLCBKRlNfRkVBVFVSRV9JTkNPTVBBVF9SRVZPS0UpKQorCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBPUkRFUkVEX0RBVEEpOworCQllbHNlCisJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEpPVVJOQUxfREFUQSk7CisJCWJyZWFrOworCisJY2FzZSBFWFQzX01PVU5UX09SREVSRURfREFUQToKKwljYXNlIEVYVDNfTU9VTlRfV1JJVEVCQUNLX0RBVEE6CisJCWlmICgham91cm5hbF9jaGVja19hdmFpbGFibGVfZmVhdHVyZXMKKwkJICAgIChzYmktPnNfam91cm5hbCwgMCwgMCwgSkZTX0ZFQVRVUkVfSU5DT01QQVRfUkVWT0tFKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBKb3VybmFsIGRvZXMgbm90IHN1cHBvcnQgIgorCQkJICAgICAgICJyZXF1ZXN0ZWQgZGF0YSBqb3VybmFsaW5nIG1vZGVcbiIpOworCQkJZ290byBmYWlsZWRfbW91bnQzOworCQl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKHRlc3Rfb3B0KHNiLCBOT0JIKSkgeworCQlpZiAoc2ItPnNfYmxvY2tzaXplX2JpdHMgIT0gUEFHRV9DQUNIRV9TSElGVCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUMy1mczogSWdub3Jpbmcgbm9iaCBvcHRpb24gIgorCQkJCSJzaW5jZSBmaWxlc3lzdGVtIGJsb2Nrc2l6ZSBkb2Vzbid0IG1hdGNoICIKKwkJCQkicGFnZXNpemVcbiIpOworCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIE5PQkgpOworCQl9CisJCWlmICghKHRlc3Rfb3B0KHNiLCBEQVRBX0ZMQUdTKSA9PSBFWFQzX01PVU5UX1dSSVRFQkFDS19EQVRBKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUMy1mczogSWdub3Jpbmcgbm9iaCBvcHRpb24gLSAiCisJCQkJIml0cyBzdXBwb3J0ZWQgb25seSB3aXRoIHdyaXRlYmFjayBtb2RlXG4iKTsKKwkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBOT0JIKTsKKwkJfQorCX0KKwkvKgorCSAqIFRoZSBqb3VybmFsX2xvYWQgd2lsbCBoYXZlIGRvbmUgYW55IG5lY2Vzc2FyeSBsb2cgcmVjb3ZlcnksCisJICogc28gd2UgY2FuIHNhZmVseSBtb3VudCB0aGUgcmVzdCBvZiB0aGUgZmlsZXN5c3RlbSBub3cuCisJICovCisKKwlyb290ID0gaWdldChzYiwgRVhUM19ST09UX0lOTyk7CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKKwlpZiAoIXNiLT5zX3Jvb3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBnZXQgcm9vdCBpbm9kZSBmYWlsZWRcbiIpOworCQlpcHV0KHJvb3QpOworCQlnb3RvIGZhaWxlZF9tb3VudDM7CisJfQorCWlmICghU19JU0RJUihyb290LT5pX21vZGUpIHx8ICFyb290LT5pX2Jsb2NrcyB8fCAhcm9vdC0+aV9zaXplKSB7CisJCWRwdXQoc2ItPnNfcm9vdCk7CisJCXNiLT5zX3Jvb3QgPSBOVUxMOworCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGNvcnJ1cHQgcm9vdCBpbm9kZSwgcnVuIGUyZnNja1xuIik7CisJCWdvdG8gZmFpbGVkX21vdW50MzsKKwl9CisKKwlleHQzX3NldHVwX3N1cGVyIChzYiwgZXMsIHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKTsKKwkvKgorCSAqIGFrcG06IGNvcmUgcmVhZF9zdXBlcigpIGNhbGxzIGluIGhlcmUgd2l0aCB0aGUgc3VwZXJibG9jayBsb2NrZWQuCisJICogVGhhdCBkZWFkbG9ja3MsIGJlY2F1c2Ugb3JwaGFuIGNsZWFudXAgbmVlZHMgdG8gbG9jayB0aGUgc3VwZXJibG9jaworCSAqIGluIG51bWVyb3VzIHBsYWNlcy4gIEhlcmUgd2UganVzdCBwb3AgdGhlIGxvY2sgLSBpdCdzIHJlbGF0aXZlbHkKKwkgKiBoYXJtbGVzcywgYmVjYXVzZSB3ZSBhcmUgbm93IHJlYWR5IHRvIGFjY2VwdCB3cml0ZV9zdXBlcigpIHJlcXVlc3RzLAorCSAqIGFuZCBhdmlybyBzYXlzIHRoYXQncyB0aGUgb25seSByZWFzb24gZm9yIGhhbmdpbmcgb250byB0aGUKKwkgKiBzdXBlcmJsb2NrIGxvY2suCisJICovCisJRVhUM19TQihzYiktPnNfbW91bnRfc3RhdGUgfD0gRVhUM19PUlBIQU5fRlM7CisJZXh0M19vcnBoYW5fY2xlYW51cChzYiwgZXMpOworCUVYVDNfU0Ioc2IpLT5zX21vdW50X3N0YXRlICY9IH5FWFQzX09SUEhBTl9GUzsKKwlpZiAobmVlZHNfcmVjb3ZlcnkpCisJCXByaW50ayAoS0VSTl9JTkZPICJFWFQzLWZzOiByZWNvdmVyeSBjb21wbGV0ZS5cbiIpOworCWV4dDNfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzYiwgZXMpOworCXByaW50ayAoS0VSTl9JTkZPICJFWFQzLWZzOiBtb3VudGVkIGZpbGVzeXN0ZW0gd2l0aCAlcyBkYXRhIG1vZGUuXG4iLAorCQl0ZXN0X29wdChzYixEQVRBX0ZMQUdTKSA9PSBFWFQzX01PVU5UX0pPVVJOQUxfREFUQSA/ICJqb3VybmFsIjoKKwkJdGVzdF9vcHQoc2IsREFUQV9GTEFHUykgPT0gRVhUM19NT1VOVF9PUkRFUkVEX0RBVEEgPyAib3JkZXJlZCI6CisJCSJ3cml0ZWJhY2siKTsKKworCXBlcmNwdV9jb3VudGVyX21vZCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwKKwkJZXh0M19jb3VudF9mcmVlX2Jsb2NrcyhzYikpOworCXBlcmNwdV9jb3VudGVyX21vZCgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlciwKKwkJZXh0M19jb3VudF9mcmVlX2lub2RlcyhzYikpOworCXBlcmNwdV9jb3VudGVyX21vZCgmc2JpLT5zX2RpcnNfY291bnRlciwKKwkJZXh0M19jb3VudF9kaXJzKHNiKSk7CisKKwlsb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworCitjYW50ZmluZF9leHQzOgorCWlmICghc2lsZW50KQorCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2FuJ3QgZmluZCBleHQzIGZpbGVzeXN0ZW0gb24gZGV2ICVzLlxuIiwKKwkJICAgICAgIHNiLT5zX2lkKTsKKwlnb3RvIGZhaWxlZF9tb3VudDsKKworZmFpbGVkX21vdW50MzoKKwlqb3VybmFsX2Rlc3Ryb3koc2JpLT5zX2pvdXJuYWwpOworZmFpbGVkX21vdW50MjoKKwlmb3IgKGkgPSAwOyBpIDwgZGJfY291bnQ7IGkrKykKKwkJYnJlbHNlKHNiaS0+c19ncm91cF9kZXNjW2ldKTsKKwlrZnJlZShzYmktPnNfZ3JvdXBfZGVzYyk7CitmYWlsZWRfbW91bnQ6CisjaWZkZWYgQ09ORklHX1FVT1RBCisJZm9yIChpID0gMDsgaSA8IE1BWFFVT1RBUzsgaSsrKQorCQlrZnJlZShzYmktPnNfcWZfbmFtZXNbaV0pOworI2VuZGlmCisJZXh0M19ibGtkZXZfcmVtb3ZlKHNiaSk7CisJYnJlbHNlKGJoKTsKK291dF9mYWlsOgorCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNiaSk7CisJbG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqIFNldHVwIGFueSBwZXItZnMgam91cm5hbCBwYXJhbWV0ZXJzIG5vdy4gIFdlJ2xsIGRvIHRoaXMgYm90aCBvbgorICogaW5pdGlhbCBtb3VudCwgb25jZSB0aGUgam91cm5hbCBoYXMgYmVlbiBpbml0aWFsaXNlZCBidXQgYmVmb3JlIHdlJ3ZlCisgKiBkb25lIGFueSByZWNvdmVyeTsgYW5kIGFnYWluIG9uIGFueSBzdWJzZXF1ZW50IHJlbW91bnQuIAorICovCitzdGF0aWMgdm9pZCBleHQzX2luaXRfam91cm5hbF9wYXJhbXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgam91cm5hbF90ICpqb3VybmFsKQoreworCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSA9IEVYVDNfU0Ioc2IpOworCisJaWYgKHNiaS0+c19jb21taXRfaW50ZXJ2YWwpCisJCWpvdXJuYWwtPmpfY29tbWl0X2ludGVydmFsID0gc2JpLT5zX2NvbW1pdF9pbnRlcnZhbDsKKwkvKiBXZSBjb3VsZCBhbHNvIHNldCB1cCBhbiBleHQzLXNwZWNpZmljIGRlZmF1bHQgZm9yIHRoZSBjb21taXQKKwkgKiBpbnRlcnZhbCBoZXJlLCBidXQgZm9yIG5vdyB3ZSdsbCBqdXN0IGZhbGwgYmFjayB0byB0aGUgamJkCisJICogZGVmYXVsdC4gKi8KKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlpZiAodGVzdF9vcHQoc2IsIEJBUlJJRVIpKQorCQlqb3VybmFsLT5qX2ZsYWdzIHw9IEpGU19CQVJSSUVSOworCWVsc2UKKwkJam91cm5hbC0+al9mbGFncyAmPSB+SkZTX0JBUlJJRVI7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7Cit9CisKK3N0YXRpYyBqb3VybmFsX3QgKmV4dDNfZ2V0X2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGpvdXJuYWxfaW51bSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmpvdXJuYWxfaW5vZGU7CisJam91cm5hbF90ICpqb3VybmFsOworCisJLyogRmlyc3QsIHRlc3QgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYSB2YWxpZCBpbm9kZSBvbiBkaXNrLiAgQmFkCisJICogdGhpbmdzIGhhcHBlbiBpZiB3ZSBpZ2V0KCkgYW4gdW51c2VkIGlub2RlLCBhcyB0aGUgc3Vic2VxdWVudAorCSAqIGlwdXQoKSB3aWxsIHRyeSB0byBkZWxldGUgaXQuICovCisKKwlqb3VybmFsX2lub2RlID0gaWdldChzYiwgam91cm5hbF9pbnVtKTsKKwlpZiAoIWpvdXJuYWxfaW5vZGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBubyBqb3VybmFsIGZvdW5kLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoIWpvdXJuYWxfaW5vZGUtPmlfbmxpbmspIHsKKwkJbWFrZV9iYWRfaW5vZGUoam91cm5hbF9pbm9kZSk7CisJCWlwdXQoam91cm5hbF9pbm9kZSk7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogam91cm5hbCBpbm9kZSBpcyBkZWxldGVkLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWpiZF9kZWJ1ZygyLCAiSm91cm5hbCBpbm9kZSBmb3VuZCBhdCAlcDogJUxkIGJ5dGVzXG4iLAorCQkgIGpvdXJuYWxfaW5vZGUsIGpvdXJuYWxfaW5vZGUtPmlfc2l6ZSk7CisJaWYgKGlzX2JhZF9pbm9kZShqb3VybmFsX2lub2RlKSB8fCAhU19JU1JFRyhqb3VybmFsX2lub2RlLT5pX21vZGUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogaW52YWxpZCBqb3VybmFsIGlub2RlLlxuIik7CisJCWlwdXQoam91cm5hbF9pbm9kZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWpvdXJuYWwgPSBqb3VybmFsX2luaXRfaW5vZGUoam91cm5hbF9pbm9kZSk7CisJaWYgKCFqb3VybmFsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogQ291bGQgbm90IGxvYWQgam91cm5hbCBpbm9kZVxuIik7CisJCWlwdXQoam91cm5hbF9pbm9kZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlqb3VybmFsLT5qX3ByaXZhdGUgPSBzYjsKKwlleHQzX2luaXRfam91cm5hbF9wYXJhbXMoc2IsIGpvdXJuYWwpOworCXJldHVybiBqb3VybmFsOworfQorCitzdGF0aWMgam91cm5hbF90ICpleHQzX2dldF9kZXZfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgICBkZXZfdCBqX2RldikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlqb3VybmFsX3QgKmpvdXJuYWw7CisJaW50IHN0YXJ0OworCWludCBsZW47CisJaW50IGhibG9jaywgYmxvY2tzaXplOworCXVuc2lnbmVkIGxvbmcgc2JfYmxvY2s7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlczsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCisJYmRldiA9IGV4dDNfYmxrZGV2X2dldChqX2Rldik7CisJaWYgKGJkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoYmRfY2xhaW0oYmRldiwgc2IpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgICJFWFQzOiBmYWlsZWQgdG8gY2xhaW0gZXh0ZXJuYWwgam91cm5hbCBkZXZpY2UuXG4iKTsKKwkJYmxrZGV2X3B1dChiZGV2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYmxvY2tzaXplID0gc2ItPnNfYmxvY2tzaXplOworCWhibG9jayA9IGJkZXZfaGFyZHNlY3Rfc2l6ZShiZGV2KTsKKwlpZiAoYmxvY2tzaXplIDwgaGJsb2NrKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJIkVYVDMtZnM6IGJsb2Nrc2l6ZSB0b28gc21hbGwgZm9yIGpvdXJuYWwgZGV2aWNlLlxuIik7CisJCWdvdG8gb3V0X2JkZXY7CisJfQorCisJc2JfYmxvY2sgPSBFWFQzX01JTl9CTE9DS19TSVpFIC8gYmxvY2tzaXplOworCW9mZnNldCA9IEVYVDNfTUlOX0JMT0NLX1NJWkUgJSBibG9ja3NpemU7CisJc2V0X2Jsb2Nrc2l6ZShiZGV2LCBibG9ja3NpemUpOworCWlmICghKGJoID0gX19icmVhZChiZGV2LCBzYl9ibG9jaywgYmxvY2tzaXplKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBjb3VsZG4ndCByZWFkIHN1cGVyYmxvY2sgb2YgIgorCQkgICAgICAgImV4dGVybmFsIGpvdXJuYWxcbiIpOworCQlnb3RvIG91dF9iZGV2OworCX0KKworCWVzID0gKHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICopICgoKGNoYXIgKiliaC0+Yl9kYXRhKSArIG9mZnNldCk7CisJaWYgKChsZTE2X3RvX2NwdShlcy0+c19tYWdpYykgIT0gRVhUM19TVVBFUl9NQUdJQykgfHwKKwkgICAgIShsZTMyX3RvX2NwdShlcy0+c19mZWF0dXJlX2luY29tcGF0KSAmCisJICAgICAgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGV4dGVybmFsIGpvdXJuYWwgaGFzICIKKwkJCQkJImJhZCBzdXBlcmJsb2NrXG4iKTsKKwkJYnJlbHNlKGJoKTsKKwkJZ290byBvdXRfYmRldjsKKwl9CisKKwlpZiAobWVtY21wKEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2pvdXJuYWxfdXVpZCwgZXMtPnNfdXVpZCwgMTYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogam91cm5hbCBVVUlEIGRvZXMgbm90IG1hdGNoXG4iKTsKKwkJYnJlbHNlKGJoKTsKKwkJZ290byBvdXRfYmRldjsKKwl9CisKKwlsZW4gPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpOworCXN0YXJ0ID0gc2JfYmxvY2sgKyAxOworCWJyZWxzZShiaCk7CS8qIHdlJ3JlIGRvbmUgd2l0aCB0aGUgc3VwZXJibG9jayAqLworCisJam91cm5hbCA9IGpvdXJuYWxfaW5pdF9kZXYoYmRldiwgc2ItPnNfYmRldiwKKwkJCQkJc3RhcnQsIGxlbiwgYmxvY2tzaXplKTsKKwlpZiAoIWpvdXJuYWwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBmYWlsZWQgdG8gY3JlYXRlIGRldmljZSBqb3VybmFsXG4iKTsKKwkJZ290byBvdXRfYmRldjsKKwl9CisJam91cm5hbC0+al9wcml2YXRlID0gc2I7CisJbGxfcndfYmxvY2soUkVBRCwgMSwgJmpvdXJuYWwtPmpfc2JfYnVmZmVyKTsKKwl3YWl0X29uX2J1ZmZlcihqb3VybmFsLT5qX3NiX2J1ZmZlcik7CisJaWYgKCFidWZmZXJfdXB0b2RhdGUoam91cm5hbC0+al9zYl9idWZmZXIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogSS9PIGVycm9yIG9uIGpvdXJuYWwgZGV2aWNlXG4iKTsKKwkJZ290byBvdXRfam91cm5hbDsKKwl9CisJaWYgKGJlMzJfdG9fY3B1KGpvdXJuYWwtPmpfc3VwZXJibG9jay0+c19ucl91c2VycykgIT0gMSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IEV4dGVybmFsIGpvdXJuYWwgaGFzIG1vcmUgdGhhbiBvbmUgIgorCQkJCQkidXNlciAodW5zdXBwb3J0ZWQpIC0gJWRcbiIsCisJCQliZTMyX3RvX2NwdShqb3VybmFsLT5qX3N1cGVyYmxvY2stPnNfbnJfdXNlcnMpKTsKKwkJZ290byBvdXRfam91cm5hbDsKKwl9CisJRVhUM19TQihzYiktPmpvdXJuYWxfYmRldiA9IGJkZXY7CisJZXh0M19pbml0X2pvdXJuYWxfcGFyYW1zKHNiLCBqb3VybmFsKTsKKwlyZXR1cm4gam91cm5hbDsKK291dF9qb3VybmFsOgorCWpvdXJuYWxfZGVzdHJveShqb3VybmFsKTsKK291dF9iZGV2OgorCWV4dDNfYmxrZGV2X3B1dChiZGV2KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBleHQzX2xvYWRfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCSAgICAgc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlcykKK3sKKwlqb3VybmFsX3QgKmpvdXJuYWw7CisJaW50IGpvdXJuYWxfaW51bSA9IGxlMzJfdG9fY3B1KGVzLT5zX2pvdXJuYWxfaW51bSk7CisJZGV2X3Qgam91cm5hbF9kZXYgPSBuZXdfZGVjb2RlX2RldihsZTMyX3RvX2NwdShlcy0+c19qb3VybmFsX2RldikpOworCWludCBlcnIgPSAwOworCWludCByZWFsbHlfcmVhZF9vbmx5OworCisJcmVhbGx5X3JlYWRfb25seSA9IGJkZXZfcmVhZF9vbmx5KHNiLT5zX2JkZXYpOworCisJLyoKKwkgKiBBcmUgd2UgbG9hZGluZyBhIGJsYW5rIGpvdXJuYWwgb3IgcGVyZm9ybWluZyByZWNvdmVyeSBhZnRlciBhCisJICogY3Jhc2g/ICBGb3IgcmVjb3ZlcnksIHdlIG5lZWQgdG8gY2hlY2sgaW4gYWR2YW5jZSB3aGV0aGVyIHdlCisJICogY2FuIGdldCByZWFkLXdyaXRlIGFjY2VzcyB0byB0aGUgZGV2aWNlLgorCSAqLworCisJaWYgKEVYVDNfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKSkgeworCQlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIkVYVDMtZnM6IElORk86IHJlY292ZXJ5ICIKKwkJCQkJInJlcXVpcmVkIG9uIHJlYWRvbmx5IGZpbGVzeXN0ZW0uXG4iKTsKKwkJCWlmIChyZWFsbHlfcmVhZF9vbmx5KSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiB3cml0ZSBhY2Nlc3MgIgorCQkJCQkidW5hdmFpbGFibGUsIGNhbm5vdCBwcm9jZWVkLlxuIik7CisJCQkJcmV0dXJuIC1FUk9GUzsKKwkJCX0KKwkJCXByaW50ayAoS0VSTl9JTkZPICJFWFQzLWZzOiB3cml0ZSBhY2Nlc3Mgd2lsbCAiCisJCQkJCSJiZSBlbmFibGVkIGR1cmluZyByZWNvdmVyeS5cbiIpOworCQl9CisJfQorCisJaWYgKGpvdXJuYWxfaW51bSAmJiBqb3VybmFsX2RldikgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGZpbGVzeXN0ZW0gaGFzIGJvdGggam91cm5hbCAiCisJCSAgICAgICAiYW5kIGlub2RlIGpvdXJuYWxzIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChqb3VybmFsX2ludW0pIHsKKwkJaWYgKCEoam91cm5hbCA9IGV4dDNfZ2V0X2pvdXJuYWwoc2IsIGpvdXJuYWxfaW51bSkpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJaWYgKCEoam91cm5hbCA9IGV4dDNfZ2V0X2Rldl9qb3VybmFsKHNiLCBqb3VybmFsX2RldikpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFyZWFsbHlfcmVhZF9vbmx5ICYmIHRlc3Rfb3B0KHNiLCBVUERBVEVfSk9VUk5BTCkpIHsKKwkJZXJyID0gam91cm5hbF91cGRhdGVfZm9ybWF0KGpvdXJuYWwpOworCQlpZiAoZXJyKSAgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBlcnJvciB1cGRhdGluZyBqb3VybmFsLlxuIik7CisJCQlqb3VybmFsX2Rlc3Ryb3koam91cm5hbCk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJaWYgKCFFWFQzX0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUikpCisJCWVyciA9IGpvdXJuYWxfd2lwZShqb3VybmFsLCAhcmVhbGx5X3JlYWRfb25seSk7CisJaWYgKCFlcnIpCisJCWVyciA9IGpvdXJuYWxfbG9hZChqb3VybmFsKTsKKworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBlcnJvciBsb2FkaW5nIGpvdXJuYWwuXG4iKTsKKwkJam91cm5hbF9kZXN0cm95KGpvdXJuYWwpOworCQlyZXR1cm4gZXJyOworCX0KKworCUVYVDNfU0Ioc2IpLT5zX2pvdXJuYWwgPSBqb3VybmFsOworCWV4dDNfY2xlYXJfam91cm5hbF9lcnIoc2IsIGVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleHQzX2NyZWF0ZV9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAorCQkJICAgICAgIHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICogZXMsCisJCQkgICAgICAgaW50IGpvdXJuYWxfaW51bSkKK3sKKwlqb3VybmFsX3QgKmpvdXJuYWw7CisKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiByZWFkb25seSBmaWxlc3lzdGVtIHdoZW4gdHJ5aW5nIHRvICIKKwkJCQkiY3JlYXRlIGpvdXJuYWwuXG4iKTsKKwkJcmV0dXJuIC1FUk9GUzsKKwl9CisKKwlpZiAoIShqb3VybmFsID0gZXh0M19nZXRfam91cm5hbChzYiwgam91cm5hbF9pbnVtKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRVhUMy1mczogY3JlYXRpbmcgbmV3IGpvdXJuYWwgb24gaW5vZGUgJWRcbiIsCisJICAgICAgIGpvdXJuYWxfaW51bSk7CisKKwlpZiAoam91cm5hbF9jcmVhdGUoam91cm5hbCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBlcnJvciBjcmVhdGluZyBqb3VybmFsLlxuIik7CisJCWpvdXJuYWxfZGVzdHJveShqb3VybmFsKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJRVhUM19TQihzYiktPnNfam91cm5hbCA9IGpvdXJuYWw7CisKKwlleHQzX3VwZGF0ZV9keW5hbWljX3JldihzYik7CisJRVhUM19TRVRfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpOworCUVYVDNfU0VUX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKTsKKworCWVzLT5zX2pvdXJuYWxfaW51bSA9IGNwdV90b19sZTMyKGpvdXJuYWxfaW51bSk7CisJc2ItPnNfZGlydCA9IDE7CisKKwkvKiBNYWtlIHN1cmUgd2UgZmx1c2ggdGhlIHJlY292ZXJ5IGZsYWcgdG8gZGlzay4gKi8KKwlleHQzX2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV4dDNfY29tbWl0X3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCSAgICAgICBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzLAorCQkJICAgICAgIGludCBzeW5jKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqc2JoID0gRVhUM19TQihzYiktPnNfc2JoOworCisJaWYgKCFzYmgpCisJCXJldHVybjsKKwllcy0+c193dGltZSA9IGNwdV90b19sZTMyKGdldF9zZWNvbmRzKCkpOworCWVzLT5zX2ZyZWVfYmxvY2tzX2NvdW50ID0gY3B1X3RvX2xlMzIoZXh0M19jb3VudF9mcmVlX2Jsb2NrcyhzYikpOworCWVzLT5zX2ZyZWVfaW5vZGVzX2NvdW50ID0gY3B1X3RvX2xlMzIoZXh0M19jb3VudF9mcmVlX2lub2RlcyhzYikpOworCUJVRkZFUl9UUkFDRShzYmgsICJtYXJraW5nIGRpcnR5Iik7CisJbWFya19idWZmZXJfZGlydHkoc2JoKTsKKwlpZiAoc3luYykKKwkJc3luY19kaXJ0eV9idWZmZXIoc2JoKTsKK30KKworCisvKgorICogSGF2ZSB3ZSBqdXN0IGZpbmlzaGVkIHJlY292ZXJ5PyAgSWYgc28sIGFuZCBpZiB3ZSBhcmUgbW91bnRpbmcgKG9yCisgKiByZW1vdW50aW5nKSB0aGUgZmlsZXN5c3RlbSByZWFkb25seSwgdGhlbiB3ZSB3aWxsIGVuZCB1cCB3aXRoIGEKKyAqIGNvbnNpc3RlbnQgZnMgb24gZGlzay4gIFJlY29yZCB0aGF0IGZhY3QuCisgKi8KK3N0YXRpYyB2b2lkIGV4dDNfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCQkJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlcykKK3sKKwlqb3VybmFsX3QgKmpvdXJuYWwgPSBFWFQzX1NCKHNiKS0+c19qb3VybmFsOworCisJam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbCk7CisJam91cm5hbF9mbHVzaChqb3VybmFsKTsKKwlpZiAoRVhUM19IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpICYmCisJICAgIHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB7CisJCUVYVDNfQ0xFQVJfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpOworCQlzYi0+c19kaXJ0ID0gMDsKKwkJZXh0M19jb21taXRfc3VwZXIoc2IsIGVzLCAxKTsKKwl9CisJam91cm5hbF91bmxvY2tfdXBkYXRlcyhqb3VybmFsKTsKK30KKworLyoKKyAqIElmIHdlIGFyZSBtb3VudGluZyAob3IgcmVhZC13cml0ZSByZW1vdW50aW5nKSBhIGZpbGVzeXN0ZW0gd2hvc2Ugam91cm5hbAorICogaGFzIHJlY29yZGVkIGFuIGVycm9yIGZyb20gYSBwcmV2aW91cyBsaWZldGltZSwgbW92ZSB0aGF0IGVycm9yIHRvIHRoZQorICogbWFpbiBmaWxlc3lzdGVtIG5vdy4KKyAqLworc3RhdGljIHZvaWQgZXh0M19jbGVhcl9qb3VybmFsX2VycihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCQkgICBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzKQoreworCWpvdXJuYWxfdCAqam91cm5hbDsKKwlpbnQgal9lcnJubzsKKwljb25zdCBjaGFyICplcnJzdHI7CisKKwlqb3VybmFsID0gRVhUM19TQihzYiktPnNfam91cm5hbDsKKworCS8qCisJICogTm93IGNoZWNrIGZvciBhbnkgZXJyb3Igc3RhdHVzIHdoaWNoIG1heSBoYXZlIGJlZW4gcmVjb3JkZWQgaW4gdGhlCisJICogam91cm5hbCBieSBhIHByaW9yIGV4dDNfZXJyb3IoKSBvciBleHQzX2Fib3J0KCkKKwkgKi8KKworCWpfZXJybm8gPSBqb3VybmFsX2Vycm5vKGpvdXJuYWwpOworCWlmIChqX2Vycm5vKSB7CisJCWNoYXIgbmJ1ZlsxNl07CisKKwkJZXJyc3RyID0gZXh0M19kZWNvZGVfZXJyb3Ioc2IsIGpfZXJybm8sIG5idWYpOworCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywgIkZpbGVzeXN0ZW0gZXJyb3IgcmVjb3JkZWQgIgorCQkJICAgICAiZnJvbSBwcmV2aW91cyBtb3VudDogJXMiLCBlcnJzdHIpOworCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywgIk1hcmtpbmcgZnMgaW4gbmVlZCBvZiAiCisJCQkgICAgICJmaWxlc3lzdGVtIGNoZWNrLiIpOworCisJCUVYVDNfU0Ioc2IpLT5zX21vdW50X3N0YXRlIHw9IEVYVDNfRVJST1JfRlM7CisJCWVzLT5zX3N0YXRlIHw9IGNwdV90b19sZTE2KEVYVDNfRVJST1JfRlMpOworCQlleHQzX2NvbW1pdF9zdXBlciAoc2IsIGVzLCAxKTsKKworCQlqb3VybmFsX2NsZWFyX2Vycihqb3VybmFsKTsKKwl9Cit9CisKKy8qCisgKiBGb3JjZSB0aGUgcnVubmluZyBhbmQgY29tbWl0dGluZyB0cmFuc2FjdGlvbnMgdG8gY29tbWl0LAorICogYW5kIHdhaXQgb24gdGhlIGNvbW1pdC4KKyAqLworaW50IGV4dDNfZm9yY2VfY29tbWl0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJam91cm5hbF90ICpqb3VybmFsOworCWludCByZXQ7CisKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCXJldHVybiAwOworCisJam91cm5hbCA9IEVYVDNfU0Ioc2IpLT5zX2pvdXJuYWw7CisJc2ItPnNfZGlydCA9IDA7CisJcmV0ID0gZXh0M19qb3VybmFsX2ZvcmNlX2NvbW1pdChqb3VybmFsKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRXh0MyBhbHdheXMgam91cm5hbHMgdXBkYXRlcyB0byB0aGUgc3VwZXJibG9jayBpdHNlbGYsIHNvIHdlIGRvbid0CisgKiBoYXZlIHRvIHByb3BhZ2F0ZSBhbnkgb3RoZXIgdXBkYXRlcyB0byB0aGUgc3VwZXJibG9jayBvbiBkaXNrIGF0IHRoaXMKKyAqIHBvaW50LiAgSnVzdCBzdGFydCBhbiBhc3luYyB3cml0ZWJhY2sgdG8gZ2V0IHRoZSBidWZmZXJzIG9uIHRoZWlyIHdheQorICogdG8gdGhlIGRpc2suCisgKgorICogVGhpcyBpbXBsaWNpdGx5IHRyaWdnZXJzIHRoZSB3cml0ZWJlaGluZCBvbiBzeW5jKCkuCisgKi8KKworc3RhdGljIHZvaWQgZXh0M193cml0ZV9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJaWYgKGRvd25fdHJ5bG9jaygmc2ItPnNfbG9jaykgPT0gMCkKKwkJQlVHKCk7CisJc2ItPnNfZGlydCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19zeW5jX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB3YWl0KQoreworCXRpZF90IHRhcmdldDsKKworCXNiLT5zX2RpcnQgPSAwOworCWlmIChqb3VybmFsX3N0YXJ0X2NvbW1pdChFWFQzX1NCKHNiKS0+c19qb3VybmFsLCAmdGFyZ2V0KSkgeworCQlpZiAod2FpdCkKKwkJCWxvZ193YWl0X2NvbW1pdChFWFQzX1NCKHNiKS0+c19qb3VybmFsLCB0YXJnZXQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExWTSBjYWxscyB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBhIChyZWFkLW9ubHkpIHNuYXBzaG90IGlzIGNyZWF0ZWQuICBUaGlzCisgKiBnaXZlcyB1cyBhIGNoYW5jZSB0byBmbHVzaCB0aGUgam91cm5hbCBjb21wbGV0ZWx5IGFuZCBtYXJrIHRoZSBmcyBjbGVhbi4KKyAqLworc3RhdGljIHZvaWQgZXh0M193cml0ZV9zdXBlcl9sb2NrZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzYi0+c19kaXJ0ID0gMDsKKworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlqb3VybmFsX3QgKmpvdXJuYWwgPSBFWFQzX1NCKHNiKS0+c19qb3VybmFsOworCisJCS8qIE5vdyB3ZSBzZXQgdXAgdGhlIGpvdXJuYWwgYmFycmllci4gKi8KKwkJam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbCk7CisJCWpvdXJuYWxfZmx1c2goam91cm5hbCk7CisKKwkJLyogSm91cm5hbCBibG9ja2VkIGFuZCBmbHVzaGVkLCBjbGVhciBuZWVkc19yZWNvdmVyeSBmbGFnLiAqLworCQlFWFQzX0NMRUFSX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKKwkJZXh0M19jb21taXRfc3VwZXIoc2IsIEVYVDNfU0Ioc2IpLT5zX2VzLCAxKTsKKwl9Cit9CisKKy8qCisgKiBDYWxsZWQgYnkgTFZNIGFmdGVyIHRoZSBzbmFwc2hvdCBpcyBkb25lLiAgV2UgbmVlZCB0byByZXNldCB0aGUgUkVDT1ZFUgorICogZmxhZyBoZXJlLCBldmVuIHRob3VnaCB0aGUgZmlsZXN5c3RlbSBpcyBub3QgdGVjaG5pY2FsbHkgZGlydHkgeWV0LgorICovCitzdGF0aWMgdm9pZCBleHQzX3VubG9ja2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCWxvY2tfc3VwZXIoc2IpOworCQkvKiBSZXNlciB0aGUgbmVlZHNfcmVjb3ZlcnkgZmxhZyBiZWZvcmUgdGhlIGZzIGlzIHVubG9ja2VkLiAqLworCQlFWFQzX1NFVF9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7CisJCWV4dDNfY29tbWl0X3N1cGVyKHNiLCBFWFQzX1NCKHNiKS0+c19lcywgMSk7CisJCXVubG9ja19zdXBlcihzYik7CisJCWpvdXJuYWxfdW5sb2NrX3VwZGF0ZXMoRVhUM19TQihzYiktPnNfam91cm5hbCk7CisJfQorfQorCitzdGF0aWMgaW50IGV4dDNfcmVtb3VudCAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGludCAqIGZsYWdzLCBjaGFyICogZGF0YSkKK3sKKwlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzOworCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSA9IEVYVDNfU0Ioc2IpOworCXVuc2lnbmVkIGxvbmcgdG1wOworCXVuc2lnbmVkIGxvbmcgbl9ibG9ja3NfY291bnQgPSAwOworCisJLyoKKwkgKiBBbGxvdyB0aGUgImNoZWNrIiBvcHRpb24gdG8gYmUgcGFzc2VkIGFzIGEgcmVtb3VudCBvcHRpb24uCisJICovCisJaWYgKCFwYXJzZV9vcHRpb25zKGRhdGEsIHNiLCAmdG1wLCAmbl9ibG9ja3NfY291bnQsIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzYmktPnNfbW91bnRfb3B0ICYgRVhUM19NT1VOVF9BQk9SVCkKKwkJZXh0M19hYm9ydChzYiwgX19GVU5DVElPTl9fLCAiQWJvcnQgZm9yY2VkIGJ5IHVzZXIiKTsKKworCXNiLT5zX2ZsYWdzID0gKHNiLT5zX2ZsYWdzICYgfk1TX1BPU0lYQUNMKSB8CisJCSgoc2JpLT5zX21vdW50X29wdCAmIEVYVDNfTU9VTlRfUE9TSVhfQUNMKSA/IE1TX1BPU0lYQUNMIDogMCk7CisKKwllcyA9IHNiaS0+c19lczsKKworCWV4dDNfaW5pdF9qb3VybmFsX3BhcmFtcyhzYiwgc2JpLT5zX2pvdXJuYWwpOworCisJaWYgKCgqZmxhZ3MgJiBNU19SRE9OTFkpICE9IChzYi0+c19mbGFncyAmIE1TX1JET05MWSkgfHwKKwkJbl9ibG9ja3NfY291bnQgPiBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpKSB7CisJCWlmIChzYmktPnNfbW91bnRfb3B0ICYgRVhUM19NT1VOVF9BQk9SVCkKKwkJCXJldHVybiAtRVJPRlM7CisKKwkJaWYgKCpmbGFncyAmIE1TX1JET05MWSkgeworCQkJLyoKKwkJCSAqIEZpcnN0IG9mIGFsbCwgdGhlIHVuY29uZGl0aW9uYWwgc3R1ZmYgd2UgaGF2ZSB0byBkbworCQkJICogdG8gZGlzYWJsZSByZXBsYXkgb2YgdGhlIGpvdXJuYWwgd2hlbiB3ZSBuZXh0IHJlbW91bnQKKwkJCSAqLworCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCisJCQkvKgorCQkJICogT0ssIHRlc3QgaWYgd2UgYXJlIHJlbW91bnRpbmcgYSB2YWxpZCBydyBwYXJ0aXRpb24KKwkJCSAqIHJlYWRvbmx5LCBhbmQgaWYgc28gc2V0IHRoZSByZG9ubHkgZmxhZyBhbmQgdGhlbgorCQkJICogbWFyayB0aGUgcGFydGl0aW9uIGFzIHZhbGlkIGFnYWluLgorCQkJICovCisJCQlpZiAoIShlcy0+c19zdGF0ZSAmIGNwdV90b19sZTE2KEVYVDNfVkFMSURfRlMpKSAmJgorCQkJICAgIChzYmktPnNfbW91bnRfc3RhdGUgJiBFWFQzX1ZBTElEX0ZTKSkKKwkJCQllcy0+c19zdGF0ZSA9IGNwdV90b19sZTE2KHNiaS0+c19tb3VudF9zdGF0ZSk7CisKKwkJCWV4dDNfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzYiwgZXMpOworCQl9IGVsc2UgeworCQkJX19sZTMyIHJldDsKKwkJCWlmICgocmV0ID0gRVhUM19IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCisJCQkJCX5FWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDMtZnM6ICVzOiBjb3VsZG4ndCAiCisJCQkJICAgICAgICJyZW1vdW50IFJEV1IgYmVjYXVzZSBvZiB1bnN1cHBvcnRlZCAiCisJCQkJICAgICAgICJvcHRpb25hbCBmZWF0dXJlcyAoJXgpLlxuIiwKKwkJCQkgICAgICAgc2ItPnNfaWQsIGxlMzJfdG9fY3B1KHJldCkpOworCQkJCXJldHVybiAtRVJPRlM7CisJCQl9CisJCQkvKgorCQkJICogTW91bnRpbmcgYSBSRE9OTFkgcGFydGl0aW9uIHJlYWQtd3JpdGUsIHNvIHJlcmVhZAorCQkJICogYW5kIHN0b3JlIHRoZSBjdXJyZW50IHZhbGlkIGZsYWcuICAoSXQgbWF5IGhhdmUKKwkJCSAqIGJlZW4gY2hhbmdlZCBieSBlMmZzY2sgc2luY2Ugd2Ugb3JpZ2luYWxseSBtb3VudGVkCisJCQkgKiB0aGUgcGFydGl0aW9uLikKKwkJCSAqLworCQkJZXh0M19jbGVhcl9qb3VybmFsX2VycihzYiwgZXMpOworCQkJc2JpLT5zX21vdW50X3N0YXRlID0gbGUxNl90b19jcHUoZXMtPnNfc3RhdGUpOworCQkJaWYgKChyZXQgPSBleHQzX2dyb3VwX2V4dGVuZChzYiwgZXMsIG5fYmxvY2tzX2NvdW50KSkpCisJCQkJcmV0dXJuIHJldDsKKwkJCWlmICghZXh0M19zZXR1cF9zdXBlciAoc2IsIGVzLCAwKSkKKwkJCQlzYi0+c19mbGFncyAmPSB+TVNfUkRPTkxZOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4dDNfc3RhdGZzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgc3RydWN0IGtzdGF0ZnMgKiBidWYpCit7CisJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKmVzID0gRVhUM19TQihzYiktPnNfZXM7CisJdW5zaWduZWQgbG9uZyBvdmVyaGVhZDsKKwlpbnQgaTsKKworCWlmICh0ZXN0X29wdCAoc2IsIE1JTklYX0RGKSkKKwkJb3ZlcmhlYWQgPSAwOworCWVsc2UgeworCQl1bnNpZ25lZCBsb25nIG5ncm91cHM7CisJCW5ncm91cHMgPSBFWFQzX1NCKHNiKS0+c19ncm91cHNfY291bnQ7CisJCXNtcF9ybWIoKTsKKworCQkvKgorCQkgKiBDb21wdXRlIHRoZSBvdmVyaGVhZCAoRlMgc3RydWN0dXJlcykKKwkJICovCisKKwkJLyoKKwkJICogQWxsIG9mIHRoZSBibG9ja3MgYmVmb3JlIGZpcnN0X2RhdGFfYmxvY2sgYXJlCisJCSAqIG92ZXJoZWFkCisJCSAqLworCQlvdmVyaGVhZCA9IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOworCisJCS8qCisJCSAqIEFkZCB0aGUgb3ZlcmhlYWQgYXR0cmlidXRlZCB0byB0aGUgc3VwZXJibG9jayBhbmQKKwkJICogYmxvY2sgZ3JvdXAgZGVzY3JpcHRvcnMuICBJZiB0aGUgc3BhcnNlIHN1cGVyYmxvY2tzCisJCSAqIGZlYXR1cmUgaXMgdHVybmVkIG9uLCB0aGVuIG5vdCBhbGwgZ3JvdXBzIGhhdmUgdGhpcy4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKKwkJCW92ZXJoZWFkICs9IGV4dDNfYmdfaGFzX3N1cGVyKHNiLCBpKSArCisJCQkJZXh0M19iZ19udW1fZ2RiKHNiLCBpKTsKKwkJCWNvbmRfcmVzY2hlZCgpOworCQl9CisKKwkJLyoKKwkJICogRXZlcnkgYmxvY2sgZ3JvdXAgaGFzIGFuIGlub2RlIGJpdG1hcCwgYSBibG9jaworCQkgKiBiaXRtYXAsIGFuZCBhbiBpbm9kZSB0YWJsZS4KKwkJICovCisJCW92ZXJoZWFkICs9IChuZ3JvdXBzICogKDIgKyBFWFQzX1NCKHNiKS0+c19pdGJfcGVyX2dyb3VwKSk7CisJfQorCisJYnVmLT5mX3R5cGUgPSBFWFQzX1NVUEVSX01BR0lDOworCWJ1Zi0+Zl9ic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwlidWYtPmZfYmxvY2tzID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSAtIG92ZXJoZWFkOworCWJ1Zi0+Zl9iZnJlZSA9IGV4dDNfY291bnRfZnJlZV9ibG9ja3MgKHNiKTsKKwlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlIC0gbGUzMl90b19jcHUoZXMtPnNfcl9ibG9ja3NfY291bnQpOworCWlmIChidWYtPmZfYmZyZWUgPCBsZTMyX3RvX2NwdShlcy0+c19yX2Jsb2Nrc19jb3VudCkpCisJCWJ1Zi0+Zl9iYXZhaWwgPSAwOworCWJ1Zi0+Zl9maWxlcyA9IGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19jb3VudCk7CisJYnVmLT5mX2ZmcmVlID0gZXh0M19jb3VudF9mcmVlX2lub2RlcyAoc2IpOworCWJ1Zi0+Zl9uYW1lbGVuID0gRVhUM19OQU1FX0xFTjsKKwlyZXR1cm4gMDsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIGZvciB3cml0aW5nIHF1b3RhcyBvbiBzeW5jIC0gd2UgbmVlZCB0byBzdGFydCB0cmFuc2FjdGlvbiBiZWZvcmUgcXVvdGEgZmlsZQorICogaXMgbG9ja2VkIGZvciB3cml0ZS4gT3RoZXJ3aXNlIHRoZSBhcmUgcG9zc2libGUgZGVhZGxvY2tzOgorICogUHJvY2VzcyAxICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3MgMgorICogZXh0M19jcmVhdGUoKSAgICAgICAgICAgICAgICAgICAgIHF1b3RhX3N5bmMoKQorICogICBqb3VybmFsX3N0YXJ0KCkgICAgICAgICAgICAgICAgICAgd3JpdGVfZHF1b3QoKQorICogICBEUVVPVF9JTklUKCkgICAgICAgICAgICAgICAgICAgICAgICBkb3duKGRxaW9fc2VtKQorICogICAgIGRvd24oZHFpb19zZW0pICAgICAgICAgICAgICAgICAgICBqb3VybmFsX3N0YXJ0KCkKKyAqCisgKi8KKworI2lmZGVmIENPTkZJR19RVU9UQQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbm9kZSAqZHF1b3RfdG9faW5vZGUoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlyZXR1cm4gc2JfZHFvcHQoZHF1b3QtPmRxX3NiKS0+ZmlsZXNbZHF1b3QtPmRxX3R5cGVdOworfQorCitzdGF0aWMgaW50IGV4dDNfZHF1b3RfaW5pdGlhbGl6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKK3sKKwloYW5kbGVfdCAqaGFuZGxlOworCWludCByZXQsIGVycjsKKworCS8qIFdlIG1heSBjcmVhdGUgcXVvdGEgc3RydWN0dXJlIHNvIHdlIG5lZWQgdG8gcmVzZXJ2ZSBlbm91Z2ggYmxvY2tzICovCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCAyKkVYVDNfUVVPVEFfSU5JVF9CTE9DS1MpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKwlyZXQgPSBkcXVvdF9pbml0aWFsaXplKGlub2RlLCB0eXBlKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmICghcmV0KQorCQlyZXQgPSBlcnI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBleHQzX2RxdW90X2Ryb3Aoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwloYW5kbGVfdCAqaGFuZGxlOworCWludCByZXQsIGVycjsKKworCS8qIFdlIG1heSBkZWxldGUgcXVvdGEgc3RydWN0dXJlIHNvIHdlIG5lZWQgdG8gcmVzZXJ2ZSBlbm91Z2ggYmxvY2tzICovCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCAyKkVYVDNfUVVPVEFfSU5JVF9CTE9DS1MpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKwlyZXQgPSBkcXVvdF9kcm9wKGlub2RlKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmICghcmV0KQorCQlyZXQgPSBlcnI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBleHQzX3dyaXRlX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJaW50IHJldCwgZXJyOworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCWlub2RlID0gZHF1b3RfdG9faW5vZGUoZHF1b3QpOworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChpbm9kZSwKKwkJCQkJRVhUM19RVU9UQV9UUkFOU19CTE9DS1MpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKwlyZXQgPSBkcXVvdF9jb21taXQoZHF1b3QpOworCWVyciA9IGV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGV4dDNfYWNxdWlyZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWludCByZXQsIGVycjsKKwloYW5kbGVfdCAqaGFuZGxlOworCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGRxdW90X3RvX2lub2RlKGRxdW90KSwKKwkJCQkJRVhUM19RVU9UQV9JTklUX0JMT0NLUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCXJldCA9IGRxdW90X2FjcXVpcmUoZHF1b3QpOworCWVyciA9IGV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGV4dDNfcmVsZWFzZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWludCByZXQsIGVycjsKKwloYW5kbGVfdCAqaGFuZGxlOworCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGRxdW90X3RvX2lub2RlKGRxdW90KSwKKwkJCQkJRVhUM19RVU9UQV9JTklUX0JMT0NLUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCXJldCA9IGRxdW90X3JlbGVhc2UoZHF1b3QpOworCWVyciA9IGV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGV4dDNfbWFya19kcXVvdF9kaXJ0eShzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCS8qIEFyZSB3ZSBqb3VybmFsbGluZyBxdW90YXM/ICovCisJaWYgKEVYVDNfU0IoZHF1b3QtPmRxX3NiKS0+c19xZl9uYW1lc1tVU1JRVU9UQV0gfHwKKwkgICAgRVhUM19TQihkcXVvdC0+ZHFfc2IpLT5zX3FmX25hbWVzW0dSUFFVT1RBXSkgeworCQlkcXVvdF9tYXJrX2RxdW90X2RpcnR5KGRxdW90KTsKKwkJcmV0dXJuIGV4dDNfd3JpdGVfZHF1b3QoZHF1b3QpOworCX0gZWxzZSB7CisJCXJldHVybiBkcXVvdF9tYXJrX2RxdW90X2RpcnR5KGRxdW90KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZXh0M193cml0ZV9pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCWludCByZXQsIGVycjsKKwloYW5kbGVfdCAqaGFuZGxlOworCisJLyogRGF0YSBibG9jayArIGlub2RlIGJsb2NrICovCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KHNiLT5zX3Jvb3QtPmRfaW5vZGUsIDIpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKwlyZXQgPSBkcXVvdF9jb21taXRfaW5mbyhzYiwgdHlwZSk7CisJZXJyID0gZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gZXJyOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUdXJuIG9uIHF1b3RhcyBkdXJpbmcgbW91bnQgdGltZSAtIHdlIG5lZWQgdG8gZmluZAorICogdGhlIHF1b3RhIGZpbGUgYW5kIHN1Y2guLi4KKyAqLworc3RhdGljIGludCBleHQzX3F1b3RhX29uX21vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCWludCBlcnI7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBxc3RyIG5hbWUgPSB7IC5uYW1lID0gRVhUM19TQihzYiktPnNfcWZfbmFtZXNbdHlwZV0sCisJCQkgICAgIC5oYXNoID0gMCwKKwkJCSAgICAgLmxlbiA9IHN0cmxlbihFWFQzX1NCKHNiKS0+c19xZl9uYW1lc1t0eXBlXSl9OworCisJZGVudHJ5ID0gbG9va3VwX2hhc2goJm5hbWUsIHNiLT5zX3Jvb3QpOworCWlmIChJU19FUlIoZGVudHJ5KSkKKwkJcmV0dXJuIFBUUl9FUlIoZGVudHJ5KTsKKwllcnIgPSB2ZnNfcXVvdGFfb25fbW91bnQodHlwZSwgRVhUM19TQihzYiktPnNfanF1b3RhX2ZtdCwgZGVudHJ5KTsKKwkvKiBOb3cgaW52YWxpZGF0ZSBhbmQgcHV0IHRoZSBkZW50cnkgLSBxdW90YSBnb3QgaXRzIG93biByZWZlcmVuY2UKKwkgKiB0byBpbm9kZSBhbmQgZGVudHJ5IGhhcyBhdCBsZWFzdCB3cm9uZyBoYXNoIHNvIHdlIGhhZCBiZXR0ZXIKKwkgKiB0aHJvdyBpdCBhd2F5ICovCisJZF9pbnZhbGlkYXRlKGRlbnRyeSk7CisJZHB1dChkZW50cnkpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBTdGFuZGFyZCBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gcXVvdGFfb24KKyAqLworc3RhdGljIGludCBleHQzX3F1b3RhX29uKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBpbnQgZm9ybWF0X2lkLAorCQkJIGNoYXIgKnBhdGgpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCisJLyogTm90IGpvdXJuYWxsaW5nIHF1b3RhPyAqLworCWlmICghRVhUM19TQihzYiktPnNfcWZfbmFtZXNbVVNSUVVPVEFdICYmCisJICAgICFFWFQzX1NCKHNiKS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pCisJCXJldHVybiB2ZnNfcXVvdGFfb24oc2IsIHR5cGUsIGZvcm1hdF9pZCwgcGF0aCk7CisJZXJyID0gcGF0aF9sb29rdXAocGF0aCwgTE9PS1VQX0ZPTExPVywgJm5kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCS8qIFF1b3RhZmlsZSBub3Qgb24gdGhlIHNhbWUgZmlsZXN5c3RlbT8gKi8KKwlpZiAobmQubW50LT5tbnRfc2IgIT0gc2IpIHsKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJCXJldHVybiAtRVhERVY7CisJfQorCS8qIFF1b3RhZmlsZSBub3Qgb2YgZnMgcm9vdD8gKi8KKwlpZiAobmQuZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSAhPSBzYi0+c19yb290LT5kX2lub2RlKQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiRVhUMy1mczogUXVvdGEgZmlsZSBub3Qgb24gZmlsZXN5c3RlbSByb290LiAiCisJCQkiSm91cm5hbGxlZCBxdW90YSB3aWxsIG5vdCB3b3JrLlxuIik7CisJcGF0aF9yZWxlYXNlKCZuZCk7CisJcmV0dXJuIHZmc19xdW90YV9vbihzYiwgdHlwZSwgZm9ybWF0X2lkLCBwYXRoKTsKK30KKworLyogUmVhZCBkYXRhIGZyb20gcXVvdGFmaWxlIC0gYXZvaWQgcGFnZWNhY2hlIGFuZCBzdWNoIGJlY2F1c2Ugd2UgY2Fubm90IGFmZm9yZAorICogYWNxdWlyaW5nIHRoZSBsb2Nrcy4uLiBBcyBxdW90YSBmaWxlcyBhcmUgbmV2ZXIgdHJ1bmNhdGVkIGFuZCBxdW90YSBjb2RlCisgKiBpdHNlbGYgc2VyaWFsaXplcyB0aGUgb3BlcmF0aW9ucyAoYW5kIG5vb25lIGVsc2Ugc2hvdWxkIHRvdWNoIHRoZSBmaWxlcykKKyAqIHdlIGRvbid0IGhhdmUgdG8gYmUgYWZyYWlkIG9mIHJhY2VzICovCitzdGF0aWMgc3NpemVfdCBleHQzX3F1b3RhX3JlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGNoYXIgKmRhdGEsCisJCQkgICAgICAgc2l6ZV90IGxlbiwgbG9mZl90IG9mZikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXTsKKwlzZWN0b3JfdCBibGsgPSBvZmYgPj4gRVhUM19CTE9DS19TSVpFX0JJVFMoc2IpOworCWludCBlcnIgPSAwOworCWludCBvZmZzZXQgPSBvZmYgJiAoc2ItPnNfYmxvY2tzaXplIC0gMSk7CisJaW50IHRvY29weTsKKwlzaXplX3QgdG9yZWFkOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJbG9mZl90IGlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKworCWlmIChvZmYgPiBpX3NpemUpCisJCXJldHVybiAwOworCWlmIChvZmYrbGVuID4gaV9zaXplKQorCQlsZW4gPSBpX3NpemUtb2ZmOworCXRvcmVhZCA9IGxlbjsKKwl3aGlsZSAodG9yZWFkID4gMCkgeworCQl0b2NvcHkgPSBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgPCB0b3JlYWQgPworCQkJCXNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA6IHRvcmVhZDsKKwkJYmggPSBleHQzX2JyZWFkKE5VTEwsIGlub2RlLCBibGssIDAsICZlcnIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKCFiaCkJLyogQSBob2xlPyAqLworCQkJbWVtc2V0KGRhdGEsIDAsIHRvY29weSk7CisJCWVsc2UKKwkJCW1lbWNweShkYXRhLCBiaC0+Yl9kYXRhK29mZnNldCwgdG9jb3B5KTsKKwkJYnJlbHNlKGJoKTsKKwkJb2Zmc2V0ID0gMDsKKwkJdG9yZWFkIC09IHRvY29weTsKKwkJZGF0YSArPSB0b2NvcHk7CisJCWJsaysrOworCX0KKwlyZXR1cm4gbGVuOworfQorCisvKiBXcml0ZSB0byBxdW90YWZpbGUgKHdlIGtub3cgdGhlIHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgc3RhcnRlZCBhbmQgaGFzCisgKiBlbm91Z2ggY3JlZGl0cykgKi8KK3N0YXRpYyBzc2l6ZV90IGV4dDNfcXVvdGFfd3JpdGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsCisJCQkJY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgbG9mZl90IG9mZikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXTsKKwlzZWN0b3JfdCBibGsgPSBvZmYgPj4gRVhUM19CTE9DS19TSVpFX0JJVFMoc2IpOworCWludCBlcnIgPSAwOworCWludCBvZmZzZXQgPSBvZmYgJiAoc2ItPnNfYmxvY2tzaXplIC0gMSk7CisJaW50IHRvY29weTsKKwlpbnQgam91cm5hbF9xdW90YSA9IEVYVDNfU0Ioc2IpLT5zX3FmX25hbWVzW3R5cGVdICE9IE5VTEw7CisJc2l6ZV90IHRvd3JpdGUgPSBsZW47CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwloYW5kbGVfdCAqaGFuZGxlID0gam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOworCisJZG93bigmaW5vZGUtPmlfc2VtKTsKKwl3aGlsZSAodG93cml0ZSA+IDApIHsKKwkJdG9jb3B5ID0gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDwgdG93cml0ZSA/CisJCQkJc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDogdG93cml0ZTsKKwkJYmggPSBleHQzX2JyZWFkKGhhbmRsZSwgaW5vZGUsIGJsaywgMSwgJmVycik7CisJCWlmICghYmgpCisJCQlnb3RvIG91dDsKKwkJaWYgKGpvdXJuYWxfcXVvdGEpIHsKKwkJCWVyciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQkJaWYgKGVycikgeworCQkJCWJyZWxzZShiaCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1jcHkoYmgtPmJfZGF0YStvZmZzZXQsIGRhdGEsIHRvY29weSk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKGJoLT5iX3BhZ2UpOworCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJaWYgKGpvdXJuYWxfcXVvdGEpCisJCQllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCWVsc2UgeworCQkJLyogQWx3YXlzIGRvIGF0IGxlYXN0IG9yZGVyZWQgd3JpdGVzIGZvciBxdW90YXMgKi8KKwkJCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9kYXRhKGhhbmRsZSwgYmgpOworCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQl9CisJCWJyZWxzZShiaCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJb2Zmc2V0ID0gMDsKKwkJdG93cml0ZSAtPSB0b2NvcHk7CisJCWRhdGEgKz0gdG9jb3B5OworCQlibGsrKzsKKwl9CitvdXQ6CisJaWYgKGxlbiA9PSB0b3dyaXRlKQorCQlyZXR1cm4gZXJyOworCWlmIChpbm9kZS0+aV9zaXplIDwgb2ZmK2xlbi10b3dyaXRlKSB7CisJCWlfc2l6ZV93cml0ZShpbm9kZSwgb2ZmK2xlbi10b3dyaXRlKTsKKwkJRVhUM19JKGlub2RlKS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJfQorCWlub2RlLT5pX3ZlcnNpb24rKzsKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwl1cCgmaW5vZGUtPmlfc2VtKTsKKwlyZXR1cm4gbGVuIC0gdG93cml0ZTsKK30KKworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmV4dDNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgZXh0M19maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGV4dDNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImV4dDMiLAorCS5nZXRfc2IJCT0gZXh0M19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2Jsb2NrX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZXh0M19mcyh2b2lkKQoreworCWludCBlcnIgPSBpbml0X2V4dDNfeGF0dHIoKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWVyciA9IGluaXRfaW5vZGVjYWNoZSgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKyAgICAgICAgZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmZXh0M19mc190eXBlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlyZXR1cm4gMDsKK291dDoKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKK291dDE6CisgCWV4aXRfZXh0M194YXR0cigpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2V4dDNfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmV4dDNfZnNfdHlwZSk7CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CisJZXhpdF9leHQzX3hhdHRyKCk7Cit9CisKK01PRFVMRV9BVVRIT1IoIlJlbXkgQ2FyZCwgU3RlcGhlbiBUd2VlZGllLCBBbmRyZXcgTW9ydG9uLCBBbmRyZWFzIERpbGdlciwgVGhlb2RvcmUgVHMnbyBhbmQgb3RoZXJzIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNlY29uZCBFeHRlbmRlZCBGaWxlc3lzdGVtIHdpdGggam91cm5hbGluZyBleHRlbnNpb25zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfaW5pdChpbml0X2V4dDNfZnMpCittb2R1bGVfZXhpdChleGl0X2V4dDNfZnMpCmRpZmYgLS1naXQgYS9mcy9leHQzL3N5bWxpbmsuYyBiL2ZzL2V4dDMvc3ltbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjM2U3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQzL3N5bWxpbmsuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogIGxpbnV4L2ZzL2V4dDMvc3ltbGluay5jCisgKgorICogT25seSBmYXN0IHN5bWxpbmtzIGxlZnQgaGVyZSAtIHRoZSByZXN0IGlzIGRvbmUgYnkgZ2VuZXJpYyBjb2RlLiBBViwgMTk5OQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9mcy9taW5peC9zeW1saW5rLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBleHQzIHN5bWxpbmsgaGFuZGxpbmcgY29kZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgInhhdHRyLmgiCisKK3N0YXRpYyBpbnQgZXh0M19mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBleHQzX2lub2RlX2luZm8gKmVpID0gRVhUM19JKGRlbnRyeS0+ZF9pbm9kZSk7CisJbmRfc2V0X2xpbmsobmQsIChjaGFyKillaS0+aV9kYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZXh0M19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBwYWdlX2ZvbGxvd19saW5rX2xpZ2h0LAorCS5wdXRfbGluawk9IHBhZ2VfcHV0X2xpbmssCisjaWZkZWYgQ09ORklHX0VYVDNfRlNfWEFUVFIKKwkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0cgk9IGV4dDNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCisjZW5kaWYKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDNfZmFzdF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBleHQzX2ZvbGxvd19saW5rLAorI2lmZGVmIENPTkZJR19FWFQzX0ZTX1hBVFRSCisJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAorCS5saXN0eGF0dHIJPSBleHQzX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAorI2VuZGlmCit9OwpkaWZmIC0tZ2l0IGEvZnMvZXh0My94YXR0ci5jIGIvZnMvZXh0My94YXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYmM2ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQzL3hhdHRyLmMKQEAgLTAsMCArMSwxMzIwIEBACisvKgorICogbGludXgvZnMvZXh0My94YXR0ci5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgQW5kcmVhcyBHcnVlbmJhY2hlciwgPGFncnVlbkBzdXNlLmRlPgorICoKKyAqIEZpeCBieSBIYXJyaXNvbiBYaW5nIDxoYXJyaXNvbkBtb3VudGFpbnZpZXdkYXRhLmNvbT4uCisgKiBFeHQzIGNvZGUgd2l0aCBhIGxvdCBvZiBoZWxwIGZyb20gRXJpYyBKYXJtYW4gPGVqYXJtYW5AYWNtLm9yZz4uCisgKiBFeHRlbmRlZCBhdHRyaWJ1dGVzIGZvciBzeW1saW5rcyBhbmQgc3BlY2lhbCBmaWxlcyBhZGRlZCBwZXIKKyAqICBzdWdnZXN0aW9uIG9mIEx1a2EgUmVua28gPGx1a2EucmVua29AaGVybWVzLnNpPi4KKyAqIHhhdHRyIGNvbnNvbGlkYXRpb24gQ29weXJpZ2h0IChjKSAyMDA0IEphbWVzIE1vcnJpcyA8am1vcnJpc0ByZWRoYXQuY29tPiwKKyAqICBSZWQgSGF0IEluYy4KKyAqIGVhLWluLWlub2RlIHN1cHBvcnQgYnkgQWxleCBUb21hcyA8YWxleEBjbHVzdGVyZnMuY29tPiBha2EgYnp6egorICogIGFuZCBBbmRyZWFzIEdydWVuYmFjaGVyIDxhZ3J1ZW5Ac3VzZS5kZT4uCisgKi8KKworLyoKKyAqIEV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIHN0b3JlZCBkaXJlY3RseSBpbiBpbm9kZXMgKG9uIGZpbGUgc3lzdGVtcyB3aXRoCisgKiBpbm9kZXMgYmlnZ2VyIHRoYW4gMTI4IGJ5dGVzKSBhbmQgb24gYWRkaXRpb25hbCBkaXNrIGJsb2Nrcy4gVGhlIGlfZmlsZV9hY2wKKyAqIGZpZWxkIGNvbnRhaW5zIHRoZSBibG9jayBudW1iZXIgaWYgYW4gaW5vZGUgdXNlcyBhbiBhZGRpdGlvbmFsIGJsb2NrLiBBbGwKKyAqIGF0dHJpYnV0ZXMgbXVzdCBmaXQgaW4gdGhlIGlub2RlIGFuZCBvbmUgYWRkaXRpb25hbCBibG9jay4gQmxvY2tzIHRoYXQKKyAqIGNvbnRhaW4gdGhlIGlkZW50aWNhbCBzZXQgb2YgYXR0cmlidXRlcyBtYXkgYmUgc2hhcmVkIGFtb25nIHNldmVyYWwgaW5vZGVzLgorICogSWRlbnRpY2FsIGJsb2NrcyBhcmUgZGV0ZWN0ZWQgYnkga2VlcGluZyBhIGNhY2hlIG9mIGJsb2NrcyB0aGF0IGhhdmUKKyAqIHJlY2VudGx5IGJlZW4gYWNjZXNzZWQuCisgKgorICogVGhlIGF0dHJpYnV0ZXMgaW4gaW5vZGVzIGFuZCBvbiBibG9ja3MgaGF2ZSBhIGRpZmZlcmVudCBoZWFkZXI7IHRoZSBlbnRyaWVzCisgKiBhcmUgc3RvcmVkIGluIHRoZSBzYW1lIGZvcm1hdDoKKyAqCisgKiAgICstLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgIHwgaGVhZGVyICAgICAgICAgICB8CisgKiAgIHwgZW50cnkgMSAgICAgICAgICB8IHwKKyAqICAgfCBlbnRyeSAyICAgICAgICAgIHwgfCBncm93aW5nIGRvd253YXJkcworICogICB8IGVudHJ5IDMgICAgICAgICAgfCB2CisgKiAgIHwgZm91ciBudWxsIGJ5dGVzICB8CisgKiAgIHwgLiAuIC4gICAgICAgICAgICB8CisgKiAgIHwgdmFsdWUgMSAgICAgICAgICB8IF4KKyAqICAgfCB2YWx1ZSAzICAgICAgICAgIHwgfCBncm93aW5nIHVwd2FyZHMKKyAqICAgfCB2YWx1ZSAyICAgICAgICAgIHwgfAorICogICArLS0tLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIFRoZSBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgbXVsdGlwbGUgZW50cnkgZGVzY3JpcHRvcnMuIEluIGRpc2sgYmxvY2tzLCB0aGUKKyAqIGVudHJ5IGRlc2NyaXB0b3JzIGFyZSBrZXB0IHNvcnRlZC4gSW4gaW5vZGVzLCB0aGV5IGFyZSB1bnNvcnRlZC4gVGhlCisgKiBhdHRyaWJ1dGUgdmFsdWVzIGFyZSBhbGlnbmVkIHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrIGluIG5vIHNwZWNpZmljIG9yZGVyLgorICoKKyAqIExvY2tpbmcgc3RyYXRlZ3kKKyAqIC0tLS0tLS0tLS0tLS0tLS0KKyAqIEVYVDNfSShpbm9kZSktPmlfZmlsZV9hY2wgaXMgcHJvdGVjdGVkIGJ5IEVYVDNfSShpbm9kZSktPnhhdHRyX3NlbS4KKyAqIEVBIGJsb2NrcyBhcmUgb25seSBjaGFuZ2VkIGlmIHRoZXkgYXJlIGV4Y2x1c2l2ZSB0byBhbiBpbm9kZSwgc28KKyAqIGhvbGRpbmcgeGF0dHJfc2VtIGFsc28gbWVhbnMgdGhhdCBub3RoaW5nIGJ1dCB0aGUgRUEgYmxvY2sncyByZWZlcmVuY2UKKyAqIGNvdW50IGNhbiBjaGFuZ2UuIE11bHRpcGxlIHdyaXRlcnMgdG8gdGhlIHNhbWUgYmxvY2sgYXJlIHN5bmNocm9uaXplZAorICogYnkgdGhlIGJ1ZmZlciBsb2NrLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXh0M19qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWJjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImFjbC5oIgorCisjZGVmaW5lIEJIRFIoYmgpICgoc3RydWN0IGV4dDNfeGF0dHJfaGVhZGVyICopKChiaCktPmJfZGF0YSkpCisjZGVmaW5lIEVOVFJZKHB0cikgKChzdHJ1Y3QgZXh0M194YXR0cl9lbnRyeSAqKShwdHIpKQorI2RlZmluZSBCRklSU1QoYmgpIEVOVFJZKEJIRFIoYmgpKzEpCisjZGVmaW5lIElTX0xBU1RfRU5UUlkoZW50cnkpICgqKF9fdTMyICopKGVudHJ5KSA9PSAwKQorCisjZGVmaW5lIElIRFIoaW5vZGUsIHJhd19pbm9kZSkgXAorCSgoc3RydWN0IGV4dDNfeGF0dHJfaWJvZHlfaGVhZGVyICopIFwKKwkJKCh2b2lkICopcmF3X2lub2RlICsgXAorCQkgRVhUM19HT09EX09MRF9JTk9ERV9TSVpFICsgXAorCQkgRVhUM19JKGlub2RlKS0+aV9leHRyYV9pc2l6ZSkpCisjZGVmaW5lIElGSVJTVChoZHIpICgoc3RydWN0IGV4dDNfeGF0dHJfZW50cnkgKikoKGhkcikrMSkpCisKKyNpZmRlZiBFWFQzX1hBVFRSX0RFQlVHCisjIGRlZmluZSBlYV9pZGVidWcoaW5vZGUsIGYuLi4pIGRvIHsgXAorCQlwcmludGsoS0VSTl9ERUJVRyAiaW5vZGUgJXM6JWxkOiAiLCBcCisJCQlpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsgXAorCQlwcmludGsoZik7IFwKKwkJcHJpbnRrKCJcbiIpOyBcCisJfSB3aGlsZSAoMCkKKyMgZGVmaW5lIGVhX2JkZWJ1ZyhiaCwgZi4uLikgZG8geyBcCisJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsgXAorCQlwcmludGsoS0VSTl9ERUJVRyAiYmxvY2sgJXM6JWx1OiAiLCBcCisJCQliZGV2bmFtZShiaC0+Yl9iZGV2LCBiKSwgXAorCQkJKHVuc2lnbmVkIGxvbmcpIGJoLT5iX2Jsb2NrbnIpOyBcCisJCXByaW50ayhmKTsgXAorCQlwcmludGsoIlxuIik7IFwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyMgZGVmaW5lIGVhX2lkZWJ1ZyhmLi4uKQorIyBkZWZpbmUgZWFfYmRlYnVnKGYuLi4pCisjZW5kaWYKKworc3RhdGljIHZvaWQgZXh0M194YXR0cl9jYWNoZV9pbnNlcnQoc3RydWN0IGJ1ZmZlcl9oZWFkICopOworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqZXh0M194YXR0cl9jYWNoZV9maW5kKHN0cnVjdCBpbm9kZSAqLAorCQkJCQkJIHN0cnVjdCBleHQzX3hhdHRyX2hlYWRlciAqLAorCQkJCQkJIHN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqKik7CitzdGF0aWMgdm9pZCBleHQzX3hhdHRyX3JlaGFzaChzdHJ1Y3QgZXh0M194YXR0cl9oZWFkZXIgKiwKKwkJCSAgICAgIHN0cnVjdCBleHQzX3hhdHRyX2VudHJ5ICopOworCitzdGF0aWMgc3RydWN0IG1iX2NhY2hlICpleHQzX3hhdHRyX2NhY2hlOworCitzdGF0aWMgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmV4dDNfeGF0dHJfaGFuZGxlcl9tYXBbXSA9IHsKKwlbRVhUM19YQVRUUl9JTkRFWF9VU0VSXQkJICAgICA9ICZleHQzX3hhdHRyX3VzZXJfaGFuZGxlciwKKyNpZmRlZiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wKKwlbRVhUM19YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfQUNDRVNTXSAgPSAmZXh0M194YXR0cl9hY2xfYWNjZXNzX2hhbmRsZXIsCisJW0VYVDNfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0RFRkFVTFRdID0gJmV4dDNfeGF0dHJfYWNsX2RlZmF1bHRfaGFuZGxlciwKKyNlbmRpZgorCVtFWFQzX1hBVFRSX0lOREVYX1RSVVNURURdCSAgICAgPSAmZXh0M194YXR0cl90cnVzdGVkX2hhbmRsZXIsCisjaWZkZWYgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkKKwlbRVhUM19YQVRUUl9JTkRFWF9TRUNVUklUWV0JICAgICA9ICZleHQzX3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIsCisjZW5kaWYKK307CisKK3N0cnVjdCB4YXR0cl9oYW5kbGVyICpleHQzX3hhdHRyX2hhbmRsZXJzW10gPSB7CisJJmV4dDNfeGF0dHJfdXNlcl9oYW5kbGVyLAorCSZleHQzX3hhdHRyX3RydXN0ZWRfaGFuZGxlciwKKyNpZmRlZiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wKKwkmZXh0M194YXR0cl9hY2xfYWNjZXNzX2hhbmRsZXIsCisJJmV4dDNfeGF0dHJfYWNsX2RlZmF1bHRfaGFuZGxlciwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZCisJJmV4dDNfeGF0dHJfc2VjdXJpdHlfaGFuZGxlciwKKyNlbmRpZgorCU5VTEwKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHhhdHRyX2hhbmRsZXIgKgorZXh0M194YXR0cl9oYW5kbGVyKGludCBuYW1lX2luZGV4KQoreworCXN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyID0gTlVMTDsKKworCWlmIChuYW1lX2luZGV4ID4gMCAmJiBuYW1lX2luZGV4IDwgQVJSQVlfU0laRShleHQzX3hhdHRyX2hhbmRsZXJfbWFwKSkKKwkJaGFuZGxlciA9IGV4dDNfeGF0dHJfaGFuZGxlcl9tYXBbbmFtZV9pbmRleF07CisJcmV0dXJuIGhhbmRsZXI7Cit9CisKKy8qCisgKiBJbm9kZSBvcGVyYXRpb24gbGlzdHhhdHRyKCkKKyAqCisgKiBkZW50cnktPmRfaW5vZGUtPmlfc2VtOiBkb24ndCBjYXJlCisgKi8KK3NzaXplX3QKK2V4dDNfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gZXh0M194YXR0cl9saXN0KGRlbnRyeS0+ZF9pbm9kZSwgYnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl9jaGVja19uYW1lcyhzdHJ1Y3QgZXh0M194YXR0cl9lbnRyeSAqZW50cnksIHZvaWQgKmVuZCkKK3sKKwl3aGlsZSAoIUlTX0xBU1RfRU5UUlkoZW50cnkpKSB7CisJCXN0cnVjdCBleHQzX3hhdHRyX2VudHJ5ICpuZXh0ID0gRVhUM19YQVRUUl9ORVhUKGVudHJ5KTsKKwkJaWYgKCh2b2lkICopbmV4dCA+PSBlbmQpCisJCQlyZXR1cm4gLUVJTzsKKwkJZW50cnkgPSBuZXh0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2V4dDNfeGF0dHJfY2hlY2tfYmxvY2soc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoQkhEUihiaCktPmhfbWFnaWMgIT0gY3B1X3RvX2xlMzIoRVhUM19YQVRUUl9NQUdJQykgfHwKKwkgICAgQkhEUihiaCktPmhfYmxvY2tzICE9IGNwdV90b19sZTMyKDEpKQorCQlyZXR1cm4gLUVJTzsKKwllcnJvciA9IGV4dDNfeGF0dHJfY2hlY2tfbmFtZXMoQkZJUlNUKGJoKSwgYmgtPmJfZGF0YSArIGJoLT5iX3NpemUpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2V4dDNfeGF0dHJfY2hlY2tfZW50cnkoc3RydWN0IGV4dDNfeGF0dHJfZW50cnkgKmVudHJ5LCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgdmFsdWVfc2l6ZSA9IGxlMzJfdG9fY3B1KGVudHJ5LT5lX3ZhbHVlX3NpemUpOworCisJaWYgKGVudHJ5LT5lX3ZhbHVlX2Jsb2NrICE9IDAgfHwgdmFsdWVfc2l6ZSA+IHNpemUgfHwKKwkgICAgbGUxNl90b19jcHUoZW50cnktPmVfdmFsdWVfb2ZmcykgKyB2YWx1ZV9zaXplID4gc2l6ZSkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDNfeGF0dHJfZmluZF9lbnRyeShzdHJ1Y3QgZXh0M194YXR0cl9lbnRyeSAqKnBlbnRyeSwgaW50IG5hbWVfaW5kZXgsCisJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBzaXplLCBpbnQgc29ydGVkKQoreworCXN0cnVjdCBleHQzX3hhdHRyX2VudHJ5ICplbnRyeTsKKwlzaXplX3QgbmFtZV9sZW47CisJaW50IGNtcCA9IDE7CisKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwluYW1lX2xlbiA9IHN0cmxlbihuYW1lKTsKKwllbnRyeSA9ICpwZW50cnk7CisJZm9yICg7ICFJU19MQVNUX0VOVFJZKGVudHJ5KTsgZW50cnkgPSBFWFQzX1hBVFRSX05FWFQoZW50cnkpKSB7CisJCWNtcCA9IG5hbWVfaW5kZXggLSBlbnRyeS0+ZV9uYW1lX2luZGV4OworCQlpZiAoIWNtcCkKKwkJCWNtcCA9IG5hbWVfbGVuIC0gZW50cnktPmVfbmFtZV9sZW47CisJCWlmICghY21wKQorCQkJY21wID0gbWVtY21wKG5hbWUsIGVudHJ5LT5lX25hbWUsIG5hbWVfbGVuKTsKKwkJaWYgKGNtcCA8PSAwICYmIChzb3J0ZWQgfHwgY21wID09IDApKQorCQkJYnJlYWs7CisJfQorCSpwZW50cnkgPSBlbnRyeTsKKwlpZiAoIWNtcCAmJiBleHQzX3hhdHRyX2NoZWNrX2VudHJ5KGVudHJ5LCBzaXplKSkKKwkJCXJldHVybiAtRUlPOworCXJldHVybiBjbXAgPyAtRU5PREFUQSA6IDA7Cit9CisKK2ludAorZXh0M194YXR0cl9ibG9ja19nZXQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5hbWVfaW5kZXgsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IGV4dDNfeGF0dHJfZW50cnkgKmVudHJ5OworCXNpemVfdCBzaXplOworCWludCBlcnJvcjsKKworCWVhX2lkZWJ1Zyhpbm9kZSwgIm5hbWU9JWQuJXMsIGJ1ZmZlcj0lcCwgYnVmZmVyX3NpemU9JWxkIiwKKwkJICBuYW1lX2luZGV4LCBuYW1lLCBidWZmZXIsIChsb25nKWJ1ZmZlcl9zaXplKTsKKworCWVycm9yID0gLUVOT0RBVEE7CisJaWYgKCFFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKQorCQlnb3RvIGNsZWFudXA7CisJZWFfaWRlYnVnKGlub2RlLCAicmVhZGluZyBibG9jayAlZCIsIEVYVDNfSShpbm9kZSktPmlfZmlsZV9hY2wpOworCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIEVYVDNfSShpbm9kZSktPmlfZmlsZV9hY2wpOworCWlmICghYmgpCisJCWdvdG8gY2xlYW51cDsKKwllYV9iZGVidWcoYmgsICJiX2NvdW50PSVkLCByZWZjb3VudD0lZCIsCisJCWF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSwgbGUzMl90b19jcHUoQkhEUihiaCktPmhfcmVmY291bnQpKTsKKwlpZiAoZXh0M194YXR0cl9jaGVja19ibG9jayhiaCkpIHsKK2JhZF9ibG9jazoJZXh0M19lcnJvcihpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJICAgImlub2RlICVsZDogYmFkIGJsb2NrICVkIiwgaW5vZGUtPmlfaW5vLAorCQkJICAgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJCWVycm9yID0gLUVJTzsKKwkJZ290byBjbGVhbnVwOworCX0KKwlleHQzX3hhdHRyX2NhY2hlX2luc2VydChiaCk7CisJZW50cnkgPSBCRklSU1QoYmgpOworCWVycm9yID0gZXh0M194YXR0cl9maW5kX2VudHJ5KCZlbnRyeSwgbmFtZV9pbmRleCwgbmFtZSwgYmgtPmJfc2l6ZSwgMSk7CisJaWYgKGVycm9yID09IC1FSU8pCisJCWdvdG8gYmFkX2Jsb2NrOworCWlmIChlcnJvcikKKwkJZ290byBjbGVhbnVwOworCXNpemUgPSBsZTMyX3RvX2NwdShlbnRyeS0+ZV92YWx1ZV9zaXplKTsKKwlpZiAoYnVmZmVyKSB7CisJCWVycm9yID0gLUVSQU5HRTsKKwkJaWYgKHNpemUgPiBidWZmZXJfc2l6ZSkKKwkJCWdvdG8gY2xlYW51cDsKKwkJbWVtY3B5KGJ1ZmZlciwgYmgtPmJfZGF0YSArIGxlMTZfdG9fY3B1KGVudHJ5LT5lX3ZhbHVlX29mZnMpLAorCQkgICAgICAgc2l6ZSk7CisJfQorCWVycm9yID0gc2l6ZTsKKworY2xlYW51cDoKKwlicmVsc2UoYmgpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl9pYm9keV9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5hbWVfaW5kZXgsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUpCit7CisJc3RydWN0IGV4dDNfeGF0dHJfaWJvZHlfaGVhZGVyICpoZWFkZXI7CisJc3RydWN0IGV4dDNfeGF0dHJfZW50cnkgKmVudHJ5OworCXN0cnVjdCBleHQzX2lub2RlICpyYXdfaW5vZGU7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworCXNpemVfdCBzaXplOworCXZvaWQgKmVuZDsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIShFWFQzX0koaW5vZGUpLT5pX3N0YXRlICYgRVhUM19TVEFURV9YQVRUUikpCisJCXJldHVybiAtRU5PREFUQTsKKwllcnJvciA9IGV4dDNfZ2V0X2lub2RlX2xvYyhpbm9kZSwgJmlsb2MpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCXJhd19pbm9kZSA9IGV4dDNfcmF3X2lub2RlKCZpbG9jKTsKKwloZWFkZXIgPSBJSERSKGlub2RlLCByYXdfaW5vZGUpOworCWVudHJ5ID0gSUZJUlNUKGhlYWRlcik7CisJZW5kID0gKHZvaWQgKilyYXdfaW5vZGUgKyBFWFQzX1NCKGlub2RlLT5pX3NiKS0+c19pbm9kZV9zaXplOworCWVycm9yID0gZXh0M194YXR0cl9jaGVja19uYW1lcyhlbnRyeSwgZW5kKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cDsKKwllcnJvciA9IGV4dDNfeGF0dHJfZmluZF9lbnRyeSgmZW50cnksIG5hbWVfaW5kZXgsIG5hbWUsCisJCQkJICAgICAgZW5kIC0gKHZvaWQgKillbnRyeSwgMCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGNsZWFudXA7CisJc2l6ZSA9IGxlMzJfdG9fY3B1KGVudHJ5LT5lX3ZhbHVlX3NpemUpOworCWlmIChidWZmZXIpIHsKKwkJZXJyb3IgPSAtRVJBTkdFOworCQlpZiAoc2l6ZSA+IGJ1ZmZlcl9zaXplKQorCQkJZ290byBjbGVhbnVwOworCQltZW1jcHkoYnVmZmVyLCAodm9pZCAqKUlGSVJTVChoZWFkZXIpICsKKwkJICAgICAgIGxlMTZfdG9fY3B1KGVudHJ5LT5lX3ZhbHVlX29mZnMpLCBzaXplKTsKKwl9CisJZXJyb3IgPSBzaXplOworCitjbGVhbnVwOgorCWJyZWxzZShpbG9jLmJoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBleHQzX3hhdHRyX2dldCgpCisgKgorICogQ29weSBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgaW50byB0aGUgYnVmZmVyCisgKiBwcm92aWRlZCwgb3IgY29tcHV0ZSB0aGUgYnVmZmVyIHNpemUgcmVxdWlyZWQuCisgKiBCdWZmZXIgaXMgTlVMTCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQuCisgKgorICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIG51bWJlciBvbiBmYWlsdXJlLCBvciB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgKiB1c2VkIC8gcmVxdWlyZWQgb24gc3VjY2Vzcy4KKyAqLworaW50CitleHQzX3hhdHRyX2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbmFtZV9pbmRleCwgY29uc3QgY2hhciAqbmFtZSwKKwkgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUpCit7CisJaW50IGVycm9yOworCisJZG93bl9yZWFkKCZFWFQzX0koaW5vZGUpLT54YXR0cl9zZW0pOworCWVycm9yID0gZXh0M194YXR0cl9pYm9keV9nZXQoaW5vZGUsIG5hbWVfaW5kZXgsIG5hbWUsIGJ1ZmZlciwKKwkJCQkgICAgIGJ1ZmZlcl9zaXplKTsKKwlpZiAoZXJyb3IgPT0gLUVOT0RBVEEpCisJCWVycm9yID0gZXh0M194YXR0cl9ibG9ja19nZXQoaW5vZGUsIG5hbWVfaW5kZXgsIG5hbWUsIGJ1ZmZlciwKKwkJCQkJICAgICBidWZmZXJfc2l6ZSk7CisJdXBfcmVhZCgmRVhUM19JKGlub2RlKS0+eGF0dHJfc2VtKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDNfeGF0dHJfbGlzdF9lbnRyaWVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQzX3hhdHRyX2VudHJ5ICplbnRyeSwKKwkJCWNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplKQoreworCXNpemVfdCByZXN0ID0gYnVmZmVyX3NpemU7CisKKwlmb3IgKDsgIUlTX0xBU1RfRU5UUlkoZW50cnkpOyBlbnRyeSA9IEVYVDNfWEFUVFJfTkVYVChlbnRyeSkpIHsKKwkJc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIgPQorCQkJZXh0M194YXR0cl9oYW5kbGVyKGVudHJ5LT5lX25hbWVfaW5kZXgpOworCisJCWlmIChoYW5kbGVyKSB7CisJCQlzaXplX3Qgc2l6ZSA9IGhhbmRsZXItPmxpc3QoaW5vZGUsIGJ1ZmZlciwgcmVzdCwKKwkJCQkJCSAgICBlbnRyeS0+ZV9uYW1lLAorCQkJCQkJICAgIGVudHJ5LT5lX25hbWVfbGVuKTsKKwkJCWlmIChidWZmZXIpIHsKKwkJCQlpZiAoc2l6ZSA+IHJlc3QpCisJCQkJCXJldHVybiAtRVJBTkdFOworCQkJCWJ1ZmZlciArPSBzaXplOworCQkJfQorCQkJcmVzdCAtPSBzaXplOworCQl9CisJfQorCXJldHVybiBidWZmZXJfc2l6ZSAtIHJlc3Q7Cit9CisKK2ludAorZXh0M194YXR0cl9ibG9ja19saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWludCBlcnJvcjsKKworCWVhX2lkZWJ1Zyhpbm9kZSwgImJ1ZmZlcj0lcCwgYnVmZmVyX3NpemU9JWxkIiwKKwkJICBidWZmZXIsIChsb25nKWJ1ZmZlcl9zaXplKTsKKworCWVycm9yID0gMDsKKwlpZiAoIUVYVDNfSShpbm9kZSktPmlfZmlsZV9hY2wpCisJCWdvdG8gY2xlYW51cDsKKwllYV9pZGVidWcoaW5vZGUsICJyZWFkaW5nIGJsb2NrICVkIiwgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJZXJyb3IgPSAtRUlPOworCWlmICghYmgpCisJCWdvdG8gY2xlYW51cDsKKwllYV9iZGVidWcoYmgsICJiX2NvdW50PSVkLCByZWZjb3VudD0lZCIsCisJCWF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSwgbGUzMl90b19jcHUoQkhEUihiaCktPmhfcmVmY291bnQpKTsKKwlpZiAoZXh0M194YXR0cl9jaGVja19ibG9jayhiaCkpIHsKKwkJZXh0M19lcnJvcihpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJICAgImlub2RlICVsZDogYmFkIGJsb2NrICVkIiwgaW5vZGUtPmlfaW5vLAorCQkJICAgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJCWVycm9yID0gLUVJTzsKKwkJZ290byBjbGVhbnVwOworCX0KKwlleHQzX3hhdHRyX2NhY2hlX2luc2VydChiaCk7CisJZXJyb3IgPSBleHQzX3hhdHRyX2xpc3RfZW50cmllcyhpbm9kZSwgQkZJUlNUKGJoKSwgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CisKK2NsZWFudXA6CisJYnJlbHNlKGJoKTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl9pYm9keV9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBleHQzX3hhdHRyX2lib2R5X2hlYWRlciAqaGVhZGVyOworCXN0cnVjdCBleHQzX2lub2RlICpyYXdfaW5vZGU7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworCXZvaWQgKmVuZDsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIShFWFQzX0koaW5vZGUpLT5pX3N0YXRlICYgRVhUM19TVEFURV9YQVRUUikpCisJCXJldHVybiAwOworCWVycm9yID0gZXh0M19nZXRfaW5vZGVfbG9jKGlub2RlLCAmaWxvYyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJcmF3X2lub2RlID0gZXh0M19yYXdfaW5vZGUoJmlsb2MpOworCWhlYWRlciA9IElIRFIoaW5vZGUsIHJhd19pbm9kZSk7CisJZW5kID0gKHZvaWQgKilyYXdfaW5vZGUgKyBFWFQzX1NCKGlub2RlLT5pX3NiKS0+c19pbm9kZV9zaXplOworCWVycm9yID0gZXh0M194YXR0cl9jaGVja19uYW1lcyhJRklSU1QoaGVhZGVyKSwgZW5kKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cDsKKwllcnJvciA9IGV4dDNfeGF0dHJfbGlzdF9lbnRyaWVzKGlub2RlLCBJRklSU1QoaGVhZGVyKSwKKwkJCQkJYnVmZmVyLCBidWZmZXJfc2l6ZSk7CisKK2NsZWFudXA6CisJYnJlbHNlKGlsb2MuYmgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIGV4dDNfeGF0dHJfbGlzdCgpCisgKgorICogQ29weSBhIGxpc3Qgb2YgYXR0cmlidXRlIG5hbWVzIGludG8gdGhlIGJ1ZmZlcgorICogcHJvdmlkZWQsIG9yIGNvbXB1dGUgdGhlIGJ1ZmZlciBzaXplIHJlcXVpcmVkLgorICogQnVmZmVyIGlzIE5VTEwgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkLgorICoKKyAqIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb24gZmFpbHVyZSwgb3IgdGhlIG51bWJlciBvZiBieXRlcworICogdXNlZCAvIHJlcXVpcmVkIG9uIHN1Y2Nlc3MuCisgKi8KK2ludAorZXh0M194YXR0cl9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplKQoreworCWludCBpX2Vycm9yLCBiX2Vycm9yOworCisJZG93bl9yZWFkKCZFWFQzX0koaW5vZGUpLT54YXR0cl9zZW0pOworCWlfZXJyb3IgPSBleHQzX3hhdHRyX2lib2R5X2xpc3QoaW5vZGUsIGJ1ZmZlciwgYnVmZmVyX3NpemUpOworCWlmIChpX2Vycm9yIDwgMCkgeworCQliX2Vycm9yID0gMDsKKwl9IGVsc2UgeworCQlpZiAoYnVmZmVyKSB7CisJCQlidWZmZXIgKz0gaV9lcnJvcjsKKwkJCWJ1ZmZlcl9zaXplIC09IGlfZXJyb3I7CisJCX0KKwkJYl9lcnJvciA9IGV4dDNfeGF0dHJfYmxvY2tfbGlzdChpbm9kZSwgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CisJCWlmIChiX2Vycm9yIDwgMCkKKwkJCWlfZXJyb3IgPSAwOworCX0KKwl1cF9yZWFkKCZFWFQzX0koaW5vZGUpLT54YXR0cl9zZW0pOworCXJldHVybiBpX2Vycm9yICsgYl9lcnJvcjsKK30KKworLyoKKyAqIElmIHRoZSBFWFQzX0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSIGZlYXR1cmUgb2YgdGhpcyBmaWxlIHN5c3RlbSBpcworICogbm90IHNldCwgc2V0IGl0LgorICovCitzdGF0aWMgdm9pZCBleHQzX3hhdHRyX3VwZGF0ZV9zdXBlcl9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLAorCQkJCQkgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaWYgKEVYVDNfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQzX0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSKSkKKwkJcmV0dXJuOworCisJbG9ja19zdXBlcihzYik7CisJaWYgKGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgRVhUM19TQihzYiktPnNfc2JoKSA9PSAwKSB7CisJCUVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfY29tcGF0IHw9CisJCQljcHVfdG9fbGUzMihFWFQzX0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSKTsKKwkJc2ItPnNfZGlydCA9IDE7CisJCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIEVYVDNfU0Ioc2IpLT5zX3NiaCk7CisJfQorCXVubG9ja19zdXBlcihzYik7Cit9CisKKy8qCisgKiBSZWxlYXNlIHRoZSB4YXR0ciBibG9jayBCSDogSWYgdGhlIHJlZmVyZW5jZSBjb3VudCBpcyA+IDEsIGRlY3JlbWVudAorICogaXQ7IG90aGVyd2lzZSBmcmVlIHRoZSBibG9jay4KKyAqLworc3RhdGljIHZvaWQKK2V4dDNfeGF0dHJfcmVsZWFzZV9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJc3RydWN0IG1iX2NhY2hlX2VudHJ5ICpjZSA9IE5VTEw7CisKKwljZSA9IG1iX2NhY2hlX2VudHJ5X2dldChleHQzX3hhdHRyX2NhY2hlLCBiaC0+Yl9iZGV2LCBiaC0+Yl9ibG9ja25yKTsKKwlpZiAoQkhEUihiaCktPmhfcmVmY291bnQgPT0gY3B1X3RvX2xlMzIoMSkpIHsKKwkJZWFfYmRlYnVnKGJoLCAicmVmY291bnQgbm93PTA7IGZyZWVpbmciKTsKKwkJaWYgKGNlKQorCQkJbWJfY2FjaGVfZW50cnlfZnJlZShjZSk7CisJCWV4dDNfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmgtPmJfYmxvY2tuciwgMSk7CisJCWdldF9iaChiaCk7CisJCWV4dDNfZm9yZ2V0KGhhbmRsZSwgMSwgaW5vZGUsIGJoLCBiaC0+Yl9ibG9ja25yKTsKKwl9IGVsc2UgeworCQlpZiAoZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCkgPT0gMCkgeworCQkJbG9ja19idWZmZXIoYmgpOworCQkJQkhEUihiaCktPmhfcmVmY291bnQgPSBjcHVfdG9fbGUzMigKKwkJCQlsZTMyX3RvX2NwdShCSERSKGJoKS0+aF9yZWZjb3VudCkgLSAxKTsKKwkJCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwkJCWlmIChJU19TWU5DKGlub2RlKSkKKwkJCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCQlEUVVPVF9GUkVFX0JMT0NLKGlub2RlLCAxKTsKKwkJCXVubG9ja19idWZmZXIoYmgpOworCQkJZWFfYmRlYnVnKGJoLCAicmVmY291bnQgbm93PSVkOyByZWxlYXNpbmciLAorCQkJCSAgbGUzMl90b19jcHUoQkhEUihiaCktPmhfcmVmY291bnQpKTsKKwkJfQorCQlpZiAoY2UpCisJCQltYl9jYWNoZV9lbnRyeV9yZWxlYXNlKGNlKTsKKwl9Cit9CisKK3N0cnVjdCBleHQzX3hhdHRyX2luZm8geworCWludCBuYW1lX2luZGV4OworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3Qgdm9pZCAqdmFsdWU7CisJc2l6ZV90IHZhbHVlX2xlbjsKK307CisKK3N0cnVjdCBleHQzX3hhdHRyX3NlYXJjaCB7CisJc3RydWN0IGV4dDNfeGF0dHJfZW50cnkgKmZpcnN0OworCXZvaWQgKmJhc2U7CisJdm9pZCAqZW5kOworCXN0cnVjdCBleHQzX3hhdHRyX2VudHJ5ICpoZXJlOworCWludCBub3RfZm91bmQ7Cit9OworCitzdGF0aWMgaW50CitleHQzX3hhdHRyX3NldF9lbnRyeShzdHJ1Y3QgZXh0M194YXR0cl9pbmZvICppLCBzdHJ1Y3QgZXh0M194YXR0cl9zZWFyY2ggKnMpCit7CisJc3RydWN0IGV4dDNfeGF0dHJfZW50cnkgKmxhc3Q7CisJc2l6ZV90IGZyZWUsIG1pbl9vZmZzID0gcy0+ZW5kIC0gcy0+YmFzZSwgbmFtZV9sZW4gPSBzdHJsZW4oaS0+bmFtZSk7CisKKwkvKiBDb21wdXRlIG1pbl9vZmZzIGFuZCBsYXN0LiAqLworCWxhc3QgPSBzLT5maXJzdDsKKwlmb3IgKDsgIUlTX0xBU1RfRU5UUlkobGFzdCk7IGxhc3QgPSBFWFQzX1hBVFRSX05FWFQobGFzdCkpIHsKKwkJaWYgKCFsYXN0LT5lX3ZhbHVlX2Jsb2NrICYmIGxhc3QtPmVfdmFsdWVfc2l6ZSkgeworCQkJc2l6ZV90IG9mZnMgPSBsZTE2X3RvX2NwdShsYXN0LT5lX3ZhbHVlX29mZnMpOworCQkJaWYgKG9mZnMgPCBtaW5fb2ZmcykKKwkJCQltaW5fb2ZmcyA9IG9mZnM7CisJCX0KKwl9CisJZnJlZSA9IG1pbl9vZmZzIC0gKCh2b2lkICopbGFzdCAtIHMtPmJhc2UpIC0gc2l6ZW9mKF9fdTMyKTsKKwlpZiAoIXMtPm5vdF9mb3VuZCkgeworCQlpZiAoIXMtPmhlcmUtPmVfdmFsdWVfYmxvY2sgJiYgcy0+aGVyZS0+ZV92YWx1ZV9zaXplKSB7CisJCQlzaXplX3Qgc2l6ZSA9IGxlMzJfdG9fY3B1KHMtPmhlcmUtPmVfdmFsdWVfc2l6ZSk7CisJCQlmcmVlICs9IEVYVDNfWEFUVFJfU0laRShzaXplKTsKKwkJfQorCQlmcmVlICs9IEVYVDNfWEFUVFJfTEVOKG5hbWVfbGVuKTsKKwl9CisJaWYgKGktPnZhbHVlKSB7CisJCWlmIChmcmVlIDwgRVhUM19YQVRUUl9TSVpFKGktPnZhbHVlX2xlbikgfHwKKwkJICAgIGZyZWUgPCBFWFQzX1hBVFRSX0xFTihuYW1lX2xlbikgKworCQkJICAgRVhUM19YQVRUUl9TSVpFKGktPnZhbHVlX2xlbikpCisJCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwlpZiAoaS0+dmFsdWUgJiYgcy0+bm90X2ZvdW5kKSB7CisJCS8qIEluc2VydCB0aGUgbmV3IG5hbWUuICovCisJCXNpemVfdCBzaXplID0gRVhUM19YQVRUUl9MRU4obmFtZV9sZW4pOworCQlzaXplX3QgcmVzdCA9ICh2b2lkICopbGFzdCAtICh2b2lkICopcy0+aGVyZSArIHNpemVvZihfX3UzMik7CisJCW1lbW1vdmUoKHZvaWQgKilzLT5oZXJlICsgc2l6ZSwgcy0+aGVyZSwgcmVzdCk7CisJCW1lbXNldChzLT5oZXJlLCAwLCBzaXplKTsKKwkJcy0+aGVyZS0+ZV9uYW1lX2luZGV4ID0gaS0+bmFtZV9pbmRleDsKKwkJcy0+aGVyZS0+ZV9uYW1lX2xlbiA9IG5hbWVfbGVuOworCQltZW1jcHkocy0+aGVyZS0+ZV9uYW1lLCBpLT5uYW1lLCBuYW1lX2xlbik7CisJfSBlbHNlIHsKKwkJaWYgKCFzLT5oZXJlLT5lX3ZhbHVlX2Jsb2NrICYmIHMtPmhlcmUtPmVfdmFsdWVfc2l6ZSkgeworCQkJdm9pZCAqZmlyc3RfdmFsID0gcy0+YmFzZSArIG1pbl9vZmZzOworCQkJc2l6ZV90IG9mZnMgPSBsZTE2X3RvX2NwdShzLT5oZXJlLT5lX3ZhbHVlX29mZnMpOworCQkJdm9pZCAqdmFsID0gcy0+YmFzZSArIG9mZnM7CisJCQlzaXplX3Qgc2l6ZSA9IEVYVDNfWEFUVFJfU0laRSgKKwkJCQlsZTMyX3RvX2NwdShzLT5oZXJlLT5lX3ZhbHVlX3NpemUpKTsKKworCQkJaWYgKGktPnZhbHVlICYmIHNpemUgPT0gRVhUM19YQVRUUl9TSVpFKGktPnZhbHVlX2xlbikpIHsKKwkJCQkvKiBUaGUgb2xkIGFuZCB0aGUgbmV3IHZhbHVlIGhhdmUgdGhlIHNhbWUKKwkJCQkgICBzaXplLiBKdXN0IHJlcGxhY2UuICovCisJCQkJcy0+aGVyZS0+ZV92YWx1ZV9zaXplID0KKwkJCQkJY3B1X3RvX2xlMzIoaS0+dmFsdWVfbGVuKTsKKwkJCQltZW1zZXQodmFsICsgc2l6ZSAtIEVYVDNfWEFUVFJfUEFELCAwLAorCQkJCSAgICAgICBFWFQzX1hBVFRSX1BBRCk7IC8qIENsZWFyIHBhZCBieXRlcy4gKi8KKwkJCQltZW1jcHkodmFsLCBpLT52YWx1ZSwgaS0+dmFsdWVfbGVuKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJLyogUmVtb3ZlIHRoZSBvbGQgdmFsdWUuICovCisJCQltZW1tb3ZlKGZpcnN0X3ZhbCArIHNpemUsIGZpcnN0X3ZhbCwgdmFsIC0gZmlyc3RfdmFsKTsKKwkJCW1lbXNldChmaXJzdF92YWwsIDAsIHNpemUpOworCQkJcy0+aGVyZS0+ZV92YWx1ZV9zaXplID0gMDsKKwkJCXMtPmhlcmUtPmVfdmFsdWVfb2ZmcyA9IDA7CisJCQltaW5fb2ZmcyArPSBzaXplOworCisJCQkvKiBBZGp1c3QgYWxsIHZhbHVlIG9mZnNldHMuICovCisJCQlsYXN0ID0gcy0+Zmlyc3Q7CisJCQl3aGlsZSAoIUlTX0xBU1RfRU5UUlkobGFzdCkpIHsKKwkJCQlzaXplX3QgbyA9IGxlMTZfdG9fY3B1KGxhc3QtPmVfdmFsdWVfb2Zmcyk7CisJCQkJaWYgKCFsYXN0LT5lX3ZhbHVlX2Jsb2NrICYmCisJCQkJICAgIGxhc3QtPmVfdmFsdWVfc2l6ZSAmJiBvIDwgb2ZmcykKKwkJCQkJbGFzdC0+ZV92YWx1ZV9vZmZzID0KKwkJCQkJCWNwdV90b19sZTE2KG8gKyBzaXplKTsKKwkJCQlsYXN0ID0gRVhUM19YQVRUUl9ORVhUKGxhc3QpOworCQkJfQorCQl9CisJCWlmICghaS0+dmFsdWUpIHsKKwkJCS8qIFJlbW92ZSB0aGUgb2xkIG5hbWUuICovCisJCQlzaXplX3Qgc2l6ZSA9IEVYVDNfWEFUVFJfTEVOKG5hbWVfbGVuKTsKKwkJCWxhc3QgPSBFTlRSWSgodm9pZCAqKWxhc3QgLSBzaXplKTsKKwkJCW1lbW1vdmUocy0+aGVyZSwgKHZvaWQgKilzLT5oZXJlICsgc2l6ZSwKKwkJCQkodm9pZCAqKWxhc3QgLSAodm9pZCAqKXMtPmhlcmUgKyBzaXplb2YoX191MzIpKTsKKwkJCW1lbXNldChsYXN0LCAwLCBzaXplKTsKKwkJfQorCX0KKworCWlmIChpLT52YWx1ZSkgeworCQkvKiBJbnNlcnQgdGhlIG5ldyB2YWx1ZS4gKi8KKwkJcy0+aGVyZS0+ZV92YWx1ZV9zaXplID0gY3B1X3RvX2xlMzIoaS0+dmFsdWVfbGVuKTsKKwkJaWYgKGktPnZhbHVlX2xlbikgeworCQkJc2l6ZV90IHNpemUgPSBFWFQzX1hBVFRSX1NJWkUoaS0+dmFsdWVfbGVuKTsKKwkJCXZvaWQgKnZhbCA9IHMtPmJhc2UgKyBtaW5fb2ZmcyAtIHNpemU7CisJCQlzLT5oZXJlLT5lX3ZhbHVlX29mZnMgPSBjcHVfdG9fbGUxNihtaW5fb2ZmcyAtIHNpemUpOworCQkJbWVtc2V0KHZhbCArIHNpemUgLSBFWFQzX1hBVFRSX1BBRCwgMCwKKwkJCSAgICAgICBFWFQzX1hBVFRSX1BBRCk7IC8qIENsZWFyIHRoZSBwYWQgYnl0ZXMuICovCisJCQltZW1jcHkodmFsLCBpLT52YWx1ZSwgaS0+dmFsdWVfbGVuKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGV4dDNfeGF0dHJfYmxvY2tfZmluZCB7CisJc3RydWN0IGV4dDNfeGF0dHJfc2VhcmNoIHM7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKK307CisKK2ludAorZXh0M194YXR0cl9ibG9ja19maW5kKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQzX3hhdHRyX2luZm8gKmksCisJCSAgICAgIHN0cnVjdCBleHQzX3hhdHRyX2Jsb2NrX2ZpbmQgKmJzKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlpbnQgZXJyb3I7CisKKwllYV9pZGVidWcoaW5vZGUsICJuYW1lPSVkLiVzLCB2YWx1ZT0lcCwgdmFsdWVfbGVuPSVsZCIsCisJCSAgaS0+bmFtZV9pbmRleCwgaS0+bmFtZSwgaS0+dmFsdWUsIChsb25nKWktPnZhbHVlX2xlbik7CisKKwlpZiAoRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCkgeworCQkvKiBUaGUgaW5vZGUgYWxyZWFkeSBoYXMgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrLiAqLworCQlicy0+YmggPSBzYl9icmVhZChzYiwgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJCWVycm9yID0gLUVJTzsKKwkJaWYgKCFicy0+YmgpCisJCQlnb3RvIGNsZWFudXA7CisJCWVhX2JkZWJ1Zyhicy0+YmgsICJiX2NvdW50PSVkLCByZWZjb3VudD0lZCIsCisJCQlhdG9taWNfcmVhZCgmKGJzLT5iaC0+Yl9jb3VudCkpLAorCQkJbGUzMl90b19jcHUoQkhEUihicy0+YmgpLT5oX3JlZmNvdW50KSk7CisJCWlmIChleHQzX3hhdHRyX2NoZWNrX2Jsb2NrKGJzLT5iaCkpIHsKKwkJCWV4dDNfZXJyb3Ioc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkiaW5vZGUgJWxkOiBiYWQgYmxvY2sgJWQiLCBpbm9kZS0+aV9pbm8sCisJCQkJRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJCQllcnJvciA9IC1FSU87CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJLyogRmluZCB0aGUgbmFtZWQgYXR0cmlidXRlLiAqLworCQlicy0+cy5iYXNlID0gQkhEUihicy0+YmgpOworCQlicy0+cy5maXJzdCA9IEJGSVJTVChicy0+YmgpOworCQlicy0+cy5lbmQgPSBicy0+YmgtPmJfZGF0YSArIGJzLT5iaC0+Yl9zaXplOworCQlicy0+cy5oZXJlID0gYnMtPnMuZmlyc3Q7CisJCWVycm9yID0gZXh0M194YXR0cl9maW5kX2VudHJ5KCZicy0+cy5oZXJlLCBpLT5uYW1lX2luZGV4LAorCQkJCQkgICAgICBpLT5uYW1lLCBicy0+YmgtPmJfc2l6ZSwgMSk7CisJCWlmIChlcnJvciAmJiBlcnJvciAhPSAtRU5PREFUQSkKKwkJCWdvdG8gY2xlYW51cDsKKwkJYnMtPnMubm90X2ZvdW5kID0gZXJyb3I7CisJfQorCWVycm9yID0gMDsKKworY2xlYW51cDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDNfeGF0dHJfYmxvY2tfc2V0KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCSAgICAgc3RydWN0IGV4dDNfeGF0dHJfaW5mbyAqaSwKKwkJICAgICBzdHJ1Y3QgZXh0M194YXR0cl9ibG9ja19maW5kICpicykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXdfYmggPSBOVUxMOworCXN0cnVjdCBleHQzX3hhdHRyX3NlYXJjaCAqcyA9ICZicy0+czsKKwlzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlID0gTlVMTDsKKwlpbnQgZXJyb3I7CisKKyNkZWZpbmUgaGVhZGVyKHgpICgoc3RydWN0IGV4dDNfeGF0dHJfaGVhZGVyICopKHgpKQorCisJaWYgKGktPnZhbHVlICYmIGktPnZhbHVlX2xlbiA+IHNiLT5zX2Jsb2Nrc2l6ZSkKKwkJcmV0dXJuIC1FTk9TUEM7CisJaWYgKHMtPmJhc2UpIHsKKwkJY2UgPSBtYl9jYWNoZV9lbnRyeV9nZXQoZXh0M194YXR0cl9jYWNoZSwgYnMtPmJoLT5iX2JkZXYsCisJCQkJCWJzLT5iaC0+Yl9ibG9ja25yKTsKKwkJaWYgKGhlYWRlcihzLT5iYXNlKS0+aF9yZWZjb3VudCA9PSBjcHVfdG9fbGUzMigxKSkgeworCQkJaWYgKGNlKSB7CisJCQkJbWJfY2FjaGVfZW50cnlfZnJlZShjZSk7CisJCQkJY2UgPSBOVUxMOworCQkJfQorCQkJZWFfYmRlYnVnKGJzLT5iaCwgIm1vZGlmeWluZyBpbi1wbGFjZSIpOworCQkJZXJyb3IgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJzLT5iaCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBjbGVhbnVwOworCQkJbG9ja19idWZmZXIoYnMtPmJoKTsKKwkJCWVycm9yID0gZXh0M194YXR0cl9zZXRfZW50cnkoaSwgcyk7CisJCQlpZiAoIWVycm9yKSB7CisJCQkJaWYgKCFJU19MQVNUX0VOVFJZKHMtPmZpcnN0KSkKKwkJCQkJZXh0M194YXR0cl9yZWhhc2goaGVhZGVyKHMtPmJhc2UpLAorCQkJCQkJCSAgcy0+aGVyZSk7CisJCQkJZXh0M194YXR0cl9jYWNoZV9pbnNlcnQoYnMtPmJoKTsKKwkJCX0KKwkJCXVubG9ja19idWZmZXIoYnMtPmJoKTsKKwkJCWlmIChlcnJvciA9PSAtRUlPKQorCQkJCWdvdG8gYmFkX2Jsb2NrOworCQkJaWYgKCFlcnJvcikKKwkJCQllcnJvciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCisJCQkJCQkJCSAgICBicy0+YmgpOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gY2xlYW51cDsKKwkJCWdvdG8gaW5zZXJ0ZWQ7CisJCX0gZWxzZSB7CisJCQlpbnQgb2Zmc2V0ID0gKGNoYXIgKilzLT5oZXJlIC0gYnMtPmJoLT5iX2RhdGE7CisKKwkJCWlmIChjZSkgeworCQkJCW1iX2NhY2hlX2VudHJ5X3JlbGVhc2UoY2UpOworCQkJCWNlID0gTlVMTDsKKwkJCX0KKwkJCWVhX2JkZWJ1Zyhicy0+YmgsICJjbG9uaW5nIik7CisJCQlzLT5iYXNlID0ga21hbGxvYyhicy0+YmgtPmJfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQllcnJvciA9IC1FTk9NRU07CisJCQlpZiAocy0+YmFzZSA9PSBOVUxMKQorCQkJCWdvdG8gY2xlYW51cDsKKwkJCW1lbWNweShzLT5iYXNlLCBCSERSKGJzLT5iaCksIGJzLT5iaC0+Yl9zaXplKTsKKwkJCXMtPmZpcnN0ID0gRU5UUlkoaGVhZGVyKHMtPmJhc2UpKzEpOworCQkJaGVhZGVyKHMtPmJhc2UpLT5oX3JlZmNvdW50ID0gY3B1X3RvX2xlMzIoMSk7CisJCQlzLT5oZXJlID0gRU5UUlkocy0+YmFzZSArIG9mZnNldCk7CisJCQlzLT5lbmQgPSBzLT5iYXNlICsgYnMtPmJoLT5iX3NpemU7CisJCX0KKwl9IGVsc2UgeworCQkvKiBBbGxvY2F0ZSBhIGJ1ZmZlciB3aGVyZSB3ZSBjb25zdHJ1Y3QgdGhlIG5ldyBibG9jay4gKi8KKwkJcy0+YmFzZSA9IGttYWxsb2Moc2ItPnNfYmxvY2tzaXplLCBHRlBfS0VSTkVMKTsKKwkJLyogYXNzZXJ0KGhlYWRlciA9PSBzLT5iYXNlKSAqLworCQllcnJvciA9IC1FTk9NRU07CisJCWlmIChzLT5iYXNlID09IE5VTEwpCisJCQlnb3RvIGNsZWFudXA7CisJCW1lbXNldChzLT5iYXNlLCAwLCBzYi0+c19ibG9ja3NpemUpOworCQloZWFkZXIocy0+YmFzZSktPmhfbWFnaWMgPSBjcHVfdG9fbGUzMihFWFQzX1hBVFRSX01BR0lDKTsKKwkJaGVhZGVyKHMtPmJhc2UpLT5oX2Jsb2NrcyA9IGNwdV90b19sZTMyKDEpOworCQloZWFkZXIocy0+YmFzZSktPmhfcmVmY291bnQgPSBjcHVfdG9fbGUzMigxKTsKKwkJcy0+Zmlyc3QgPSBFTlRSWShoZWFkZXIocy0+YmFzZSkrMSk7CisJCXMtPmhlcmUgPSBFTlRSWShoZWFkZXIocy0+YmFzZSkrMSk7CisJCXMtPmVuZCA9IHMtPmJhc2UgKyBzYi0+c19ibG9ja3NpemU7CisJfQorCisJZXJyb3IgPSBleHQzX3hhdHRyX3NldF9lbnRyeShpLCBzKTsKKwlpZiAoZXJyb3IgPT0gLUVJTykKKwkJZ290byBiYWRfYmxvY2s7CisJaWYgKGVycm9yKQorCQlnb3RvIGNsZWFudXA7CisJaWYgKCFJU19MQVNUX0VOVFJZKHMtPmZpcnN0KSkKKwkJZXh0M194YXR0cl9yZWhhc2goaGVhZGVyKHMtPmJhc2UpLCBzLT5oZXJlKTsKKworaW5zZXJ0ZWQ6CisJaWYgKCFJU19MQVNUX0VOVFJZKHMtPmZpcnN0KSkgeworCQluZXdfYmggPSBleHQzX3hhdHRyX2NhY2hlX2ZpbmQoaW5vZGUsIGhlYWRlcihzLT5iYXNlKSwgJmNlKTsKKwkJaWYgKG5ld19iaCkgeworCQkJLyogV2UgZm91bmQgYW4gaWRlbnRpY2FsIGJsb2NrIGluIHRoZSBjYWNoZS4gKi8KKwkJCWlmIChuZXdfYmggPT0gYnMtPmJoKQorCQkJCWVhX2JkZWJ1ZyhuZXdfYmgsICJrZWVwaW5nIik7CisJCQllbHNlIHsKKwkJCQkvKiBUaGUgb2xkIGJsb2NrIGlzIHJlbGVhc2VkIGFmdGVyIHVwZGF0aW5nCisJCQkJICAgdGhlIGlub2RlLiAqLworCQkJCWVycm9yID0gLUVEUVVPVDsKKwkJCQlpZiAoRFFVT1RfQUxMT0NfQkxPQ0soaW5vZGUsIDEpKQorCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJZXJyb3IgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsCisJCQkJCQkJCSAgICAgIG5ld19iaCk7CisJCQkJaWYgKGVycm9yKQorCQkJCQlnb3RvIGNsZWFudXBfZHF1b3Q7CisJCQkJbG9ja19idWZmZXIobmV3X2JoKTsKKwkJCQlCSERSKG5ld19iaCktPmhfcmVmY291bnQgPSBjcHVfdG9fbGUzMigxICsKKwkJCQkJbGUzMl90b19jcHUoQkhEUihuZXdfYmgpLT5oX3JlZmNvdW50KSk7CisJCQkJZWFfYmRlYnVnKG5ld19iaCwgInJldXNpbmc7IHJlZmNvdW50IG5vdz0lZCIsCisJCQkJCWxlMzJfdG9fY3B1KEJIRFIobmV3X2JoKS0+aF9yZWZjb3VudCkpOworCQkJCXVubG9ja19idWZmZXIobmV3X2JoKTsKKwkJCQllcnJvciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCisJCQkJCQkJCSAgICBuZXdfYmgpOworCQkJCWlmIChlcnJvcikKKwkJCQkJZ290byBjbGVhbnVwX2RxdW90OworCQkJfQorCQkJbWJfY2FjaGVfZW50cnlfcmVsZWFzZShjZSk7CisJCQljZSA9IE5VTEw7CisJCX0gZWxzZSBpZiAoYnMtPmJoICYmIHMtPmJhc2UgPT0gYnMtPmJoLT5iX2RhdGEpIHsKKwkJCS8qIFdlIHdlcmUgbW9kaWZ5aW5nIHRoaXMgYmxvY2sgaW4tcGxhY2UuICovCisJCQllYV9iZGVidWcoYnMtPmJoLCAia2VlcGluZyB0aGlzIGJsb2NrIik7CisJCQluZXdfYmggPSBicy0+Ymg7CisJCQlnZXRfYmgobmV3X2JoKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgYmxvY2sgKi8KKwkJCWludCBnb2FsID0gbGUzMl90b19jcHUoCisJCQkJCUVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spICsKKwkJCQlFWFQzX0koaW5vZGUpLT5pX2Jsb2NrX2dyb3VwICoKKwkJCQlFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpOworCQkJaW50IGJsb2NrID0gZXh0M19uZXdfYmxvY2soaGFuZGxlLCBpbm9kZSwgZ29hbCwgJmVycm9yKTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGNsZWFudXA7CisJCQllYV9pZGVidWcoaW5vZGUsICJjcmVhdGluZyBibG9jayAlZCIsIGJsb2NrKTsKKworCQkJbmV3X2JoID0gc2JfZ2V0YmxrKHNiLCBibG9jayk7CisJCQlpZiAoIW5ld19iaCkgeworZ2V0YmxrX2ZhaWxlZDoKKwkJCQlleHQzX2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJsb2NrLCAxKTsKKwkJCQllcnJvciA9IC1FSU87CisJCQkJZ290byBjbGVhbnVwOworCQkJfQorCQkJbG9ja19idWZmZXIobmV3X2JoKTsKKwkJCWVycm9yID0gZXh0M19qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgbmV3X2JoKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXVubG9ja19idWZmZXIobmV3X2JoKTsKKwkJCQlnb3RvIGdldGJsa19mYWlsZWQ7CisJCQl9CisJCQltZW1jcHkobmV3X2JoLT5iX2RhdGEsIHMtPmJhc2UsIG5ld19iaC0+Yl9zaXplKTsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUobmV3X2JoKTsKKwkJCXVubG9ja19idWZmZXIobmV3X2JoKTsKKwkJCWV4dDNfeGF0dHJfY2FjaGVfaW5zZXJ0KG5ld19iaCk7CisJCQllcnJvciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIG5ld19iaCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBjbGVhbnVwOworCQl9CisJfQorCisJLyogVXBkYXRlIHRoZSBpbm9kZS4gKi8KKwlFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsID0gbmV3X2JoID8gbmV3X2JoLT5iX2Jsb2NrbnIgOiAwOworCisJLyogRHJvcCB0aGUgcHJldmlvdXMgeGF0dHIgYmxvY2suICovCisJaWYgKGJzLT5iaCAmJiBicy0+YmggIT0gbmV3X2JoKQorCQlleHQzX3hhdHRyX3JlbGVhc2VfYmxvY2soaGFuZGxlLCBpbm9kZSwgYnMtPmJoKTsKKwllcnJvciA9IDA7CisKK2NsZWFudXA6CisJaWYgKGNlKQorCQltYl9jYWNoZV9lbnRyeV9yZWxlYXNlKGNlKTsKKwlicmVsc2UobmV3X2JoKTsKKwlpZiAoIShicy0+YmggJiYgcy0+YmFzZSA9PSBicy0+YmgtPmJfZGF0YSkpCisJCWtmcmVlKHMtPmJhc2UpOworCisJcmV0dXJuIGVycm9yOworCitjbGVhbnVwX2RxdW90OgorCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIDEpOworCWdvdG8gY2xlYW51cDsKKworYmFkX2Jsb2NrOgorCWV4dDNfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKKwkJICAgImlub2RlICVsZDogYmFkIGJsb2NrICVkIiwgaW5vZGUtPmlfaW5vLAorCQkgICBFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKKwlnb3RvIGNsZWFudXA7CisKKyN1bmRlZiBoZWFkZXIKK30KKworc3RydWN0IGV4dDNfeGF0dHJfaWJvZHlfZmluZCB7CisJc3RydWN0IGV4dDNfeGF0dHJfc2VhcmNoIHM7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworfTsKKworaW50CitleHQzX3hhdHRyX2lib2R5X2ZpbmQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDNfeGF0dHJfaW5mbyAqaSwKKwkJICAgICAgc3RydWN0IGV4dDNfeGF0dHJfaWJvZHlfZmluZCAqaXMpCit7CisJc3RydWN0IGV4dDNfeGF0dHJfaWJvZHlfaGVhZGVyICpoZWFkZXI7CisJc3RydWN0IGV4dDNfaW5vZGUgKnJhd19pbm9kZTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoRVhUM19JKGlub2RlKS0+aV9leHRyYV9pc2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyYXdfaW5vZGUgPSBleHQzX3Jhd19pbm9kZSgmaXMtPmlsb2MpOworCWhlYWRlciA9IElIRFIoaW5vZGUsIHJhd19pbm9kZSk7CisJaXMtPnMuYmFzZSA9IGlzLT5zLmZpcnN0ID0gSUZJUlNUKGhlYWRlcik7CisJaXMtPnMuaGVyZSA9IGlzLT5zLmZpcnN0OworCWlzLT5zLmVuZCA9ICh2b2lkICopcmF3X2lub2RlICsgRVhUM19TQihpbm9kZS0+aV9zYiktPnNfaW5vZGVfc2l6ZTsKKwlpZiAoRVhUM19JKGlub2RlKS0+aV9zdGF0ZSAmIEVYVDNfU1RBVEVfWEFUVFIpIHsKKwkJZXJyb3IgPSBleHQzX3hhdHRyX2NoZWNrX25hbWVzKElGSVJTVChoZWFkZXIpLCBpcy0+cy5lbmQpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJCS8qIEZpbmQgdGhlIG5hbWVkIGF0dHJpYnV0ZS4gKi8KKwkJZXJyb3IgPSBleHQzX3hhdHRyX2ZpbmRfZW50cnkoJmlzLT5zLmhlcmUsIGktPm5hbWVfaW5kZXgsCisJCQkJCSAgICAgIGktPm5hbWUsIGlzLT5zLmVuZCAtCisJCQkJCSAgICAgICh2b2lkICopaXMtPnMuYmFzZSwgMCk7CisJCWlmIChlcnJvciAmJiBlcnJvciAhPSAtRU5PREFUQSkKKwkJCXJldHVybiBlcnJvcjsKKwkJaXMtPnMubm90X2ZvdW5kID0gZXJyb3I7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitleHQzX3hhdHRyX2lib2R5X3NldChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICAgIHN0cnVjdCBleHQzX3hhdHRyX2luZm8gKmksCisJCSAgICAgc3RydWN0IGV4dDNfeGF0dHJfaWJvZHlfZmluZCAqaXMpCit7CisJc3RydWN0IGV4dDNfeGF0dHJfaWJvZHlfaGVhZGVyICpoZWFkZXI7CisJc3RydWN0IGV4dDNfeGF0dHJfc2VhcmNoICpzID0gJmlzLT5zOworCWludCBlcnJvcjsKKworCWlmIChFWFQzX0koaW5vZGUpLT5pX2V4dHJhX2lzaXplID09IDApCisJCXJldHVybiAtRU5PU1BDOworCWVycm9yID0gZXh0M194YXR0cl9zZXRfZW50cnkoaSwgcyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJaGVhZGVyID0gSUhEUihpbm9kZSwgZXh0M19yYXdfaW5vZGUoJmlzLT5pbG9jKSk7CisJaWYgKCFJU19MQVNUX0VOVFJZKHMtPmZpcnN0KSkgeworCQloZWFkZXItPmhfbWFnaWMgPSBjcHVfdG9fbGUzMihFWFQzX1hBVFRSX01BR0lDKTsKKwkJRVhUM19JKGlub2RlKS0+aV9zdGF0ZSB8PSBFWFQzX1NUQVRFX1hBVFRSOworCX0gZWxzZSB7CisJCWhlYWRlci0+aF9tYWdpYyA9IGNwdV90b19sZTMyKDApOworCQlFWFQzX0koaW5vZGUpLT5pX3N0YXRlICY9IH5FWFQzX1NUQVRFX1hBVFRSOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGV4dDNfeGF0dHJfc2V0X2hhbmRsZSgpCisgKgorICogQ3JlYXRlLCByZXBsYWNlIG9yIHJlbW92ZSBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgZm9yIHRoaXMgaW5vZGUuIEJ1ZmZlcgorICogaXMgTlVMTCB0byByZW1vdmUgYW4gZXhpc3RpbmcgZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmQgbm9uLU5VTEwgdG8KKyAqIGVpdGhlciByZXBsYWNlIGFuIGV4aXN0aW5nIGV4dGVuZGVkIGF0dHJpYnV0ZSwgb3IgY3JlYXRlIGEgbmV3IGV4dGVuZGVkCisgKiBhdHRyaWJ1dGUuIFRoZSBmbGFncyBYQVRUUl9SRVBMQUNFIGFuZCBYQVRUUl9DUkVBVEUKKyAqIHNwZWNpZnkgdGhhdCBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgbXVzdCBleGlzdCBhbmQgbXVzdCBub3QgZXhpc3QKKyAqIHByZXZpb3VzIHRvIHRoZSBjYWxsLCByZXNwZWN0aXZlbHkuCisgKgorICogUmV0dXJucyAwLCBvciBhIG5lZ2F0aXZlIGVycm9yIG51bWJlciBvbiBmYWlsdXJlLgorICovCitpbnQKK2V4dDNfeGF0dHJfc2V0X2hhbmRsZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbmFtZV9pbmRleCwKKwkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCB2YWx1ZV9sZW4sCisJCSAgICAgIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgZXh0M194YXR0cl9pbmZvIGkgPSB7CisJCS5uYW1lX2luZGV4ID0gbmFtZV9pbmRleCwKKwkJLm5hbWUgPSBuYW1lLAorCQkudmFsdWUgPSB2YWx1ZSwKKwkJLnZhbHVlX2xlbiA9IHZhbHVlX2xlbiwKKworCX07CisJc3RydWN0IGV4dDNfeGF0dHJfaWJvZHlfZmluZCBpcyA9IHsKKwkJLnMgPSB7IC5ub3RfZm91bmQgPSAtRU5PREFUQSwgfSwKKwl9OworCXN0cnVjdCBleHQzX3hhdHRyX2Jsb2NrX2ZpbmQgYnMgPSB7CisJCS5zID0geyAubm90X2ZvdW5kID0gLUVOT0RBVEEsIH0sCisJfTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoSVNfUkRPTkxZKGlub2RlKSkKKwkJcmV0dXJuIC1FUk9GUzsKKwlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpKQorCQlyZXR1cm4gLUVQRVJNOworCWlmICghbmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHN0cmxlbihuYW1lKSA+IDI1NSkKKwkJcmV0dXJuIC1FUkFOR0U7CisJZG93bl93cml0ZSgmRVhUM19JKGlub2RlKS0+eGF0dHJfc2VtKTsKKwllcnJvciA9IGV4dDNfZ2V0X2lub2RlX2xvYyhpbm9kZSwgJmlzLmlsb2MpOworCWlmIChlcnJvcikKKwkJZ290byBjbGVhbnVwOworCisJaWYgKEVYVDNfSShpbm9kZSktPmlfc3RhdGUgJiBFWFQzX1NUQVRFX05FVykgeworCQlzdHJ1Y3QgZXh0M19pbm9kZSAqcmF3X2lub2RlID0gZXh0M19yYXdfaW5vZGUoJmlzLmlsb2MpOworCQltZW1zZXQocmF3X2lub2RlLCAwLCBFWFQzX1NCKGlub2RlLT5pX3NiKS0+c19pbm9kZV9zaXplKTsKKwkJRVhUM19JKGlub2RlKS0+aV9zdGF0ZSAmPSB+RVhUM19TVEFURV9ORVc7CisJfQorCisJZXJyb3IgPSBleHQzX3hhdHRyX2lib2R5X2ZpbmQoaW5vZGUsICZpLCAmaXMpOworCWlmIChlcnJvcikKKwkJZ290byBjbGVhbnVwOworCWlmIChpcy5zLm5vdF9mb3VuZCkKKwkJZXJyb3IgPSBleHQzX3hhdHRyX2Jsb2NrX2ZpbmQoaW5vZGUsICZpLCAmYnMpOworCWlmIChlcnJvcikKKwkJZ290byBjbGVhbnVwOworCWlmIChpcy5zLm5vdF9mb3VuZCAmJiBicy5zLm5vdF9mb3VuZCkgeworCQllcnJvciA9IC1FTk9EQVRBOworCQlpZiAoZmxhZ3MgJiBYQVRUUl9SRVBMQUNFKQorCQkJZ290byBjbGVhbnVwOworCQllcnJvciA9IDA7CisJCWlmICghdmFsdWUpCisJCQlnb3RvIGNsZWFudXA7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSAtRUVYSVNUOworCQlpZiAoZmxhZ3MgJiBYQVRUUl9DUkVBVEUpCisJCQlnb3RvIGNsZWFudXA7CisJfQorCWVycm9yID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBpcy5pbG9jLmJoKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cDsKKwlpZiAoIXZhbHVlKSB7CisJCWlmICghaXMucy5ub3RfZm91bmQpCisJCQllcnJvciA9IGV4dDNfeGF0dHJfaWJvZHlfc2V0KGhhbmRsZSwgaW5vZGUsICZpLCAmaXMpOworCQllbHNlIGlmICghYnMucy5ub3RfZm91bmQpCisJCQllcnJvciA9IGV4dDNfeGF0dHJfYmxvY2tfc2V0KGhhbmRsZSwgaW5vZGUsICZpLCAmYnMpOworCX0gZWxzZSB7CisJCWVycm9yID0gZXh0M194YXR0cl9pYm9keV9zZXQoaGFuZGxlLCBpbm9kZSwgJmksICZpcyk7CisJCWlmICghZXJyb3IgJiYgIWJzLnMubm90X2ZvdW5kKSB7CisJCQlpLnZhbHVlID0gTlVMTDsKKwkJCWVycm9yID0gZXh0M194YXR0cl9ibG9ja19zZXQoaGFuZGxlLCBpbm9kZSwgJmksICZicyk7CisJCX0gZWxzZSBpZiAoZXJyb3IgPT0gLUVOT1NQQykgeworCQkJZXJyb3IgPSBleHQzX3hhdHRyX2Jsb2NrX3NldChoYW5kbGUsIGlub2RlLCAmaSwgJmJzKTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGNsZWFudXA7CisJCQlpZiAoIWlzLnMubm90X2ZvdW5kKSB7CisJCQkJaS52YWx1ZSA9IE5VTEw7CisJCQkJZXJyb3IgPSBleHQzX3hhdHRyX2lib2R5X3NldChoYW5kbGUsIGlub2RlLCAmaSwKKwkJCQkJCQkgICAgICZpcyk7CisJCQl9CisJCX0KKwl9CisJaWYgKCFlcnJvcikgeworCQlleHQzX3hhdHRyX3VwZGF0ZV9zdXBlcl9ibG9jayhoYW5kbGUsIGlub2RlLT5pX3NiKTsKKwkJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQllcnJvciA9IGV4dDNfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZpcy5pbG9jKTsKKwkJLyoKKwkJICogVGhlIGJoIGlzIGNvbnN1bWVkIGJ5IGV4dDNfbWFya19pbG9jX2RpcnR5LCBldmVuIHdpdGgKKwkJICogZXJyb3IgIT0gMC4KKwkJICovCisJCWlzLmlsb2MuYmggPSBOVUxMOworCQlpZiAoSVNfU1lOQyhpbm9kZSkpCisJCQloYW5kbGUtPmhfc3luYyA9IDE7CisJfQorCitjbGVhbnVwOgorCWJyZWxzZShpcy5pbG9jLmJoKTsKKwlicmVsc2UoYnMuYmgpOworCXVwX3dyaXRlKCZFWFQzX0koaW5vZGUpLT54YXR0cl9zZW0pOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIGV4dDNfeGF0dHJfc2V0KCkKKyAqCisgKiBMaWtlIGV4dDNfeGF0dHJfc2V0X2hhbmRsZSwgYnV0IHN0YXJ0IGZyb20gYW4gaW5vZGUuIFRoaXMgZXh0ZW5kZWQKKyAqIGF0dHJpYnV0ZSBtb2RpZmljYXRpb24gaXMgYSBmaWxlc3lzdGVtIHRyYW5zYWN0aW9uIGJ5IGl0c2VsZi4KKyAqCisgKiBSZXR1cm5zIDAsIG9yIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyIG9uIGZhaWx1cmUuCisgKi8KK2ludAorZXh0M194YXR0cl9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5hbWVfaW5kZXgsIGNvbnN0IGNoYXIgKm5hbWUsCisJICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3QgdmFsdWVfbGVuLCBpbnQgZmxhZ3MpCit7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlpbnQgZXJyb3IsIHJldHJpZXMgPSAwOworCityZXRyeToKKwloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDNfREFUQV9UUkFOU19CTE9DS1MpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQllcnJvciA9IFBUUl9FUlIoaGFuZGxlKTsKKwl9IGVsc2UgeworCQlpbnQgZXJyb3IyOworCisJCWVycm9yID0gZXh0M194YXR0cl9zZXRfaGFuZGxlKGhhbmRsZSwgaW5vZGUsIG5hbWVfaW5kZXgsIG5hbWUsCisJCQkJCSAgICAgIHZhbHVlLCB2YWx1ZV9sZW4sIGZsYWdzKTsKKwkJZXJyb3IyID0gZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwkJaWYgKGVycm9yID09IC1FTk9TUEMgJiYKKwkJICAgIGV4dDNfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCisJCQlnb3RvIHJldHJ5OworCQlpZiAoZXJyb3IgPT0gMCkKKwkJCWVycm9yID0gZXJyb3IyOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIGV4dDNfeGF0dHJfZGVsZXRlX2lub2RlKCkKKyAqCisgKiBGcmVlIGV4dGVuZGVkIGF0dHJpYnV0ZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5vZGUuIFRoaXMKKyAqIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgYW4gaW5vZGUgaXMgZnJlZWQuIFdlIGhhdmUgZXhjbHVzaXZlCisgKiBhY2Nlc3MgdG8gdGhlIGlub2RlLgorICovCit2b2lkCitleHQzX3hhdHRyX2RlbGV0ZV9pbm9kZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCisJaWYgKCFFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKQorCQlnb3RvIGNsZWFudXA7CisJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJaWYgKCFiaCkgeworCQlleHQzX2Vycm9yKGlub2RlLT5pX3NiLCBfX0ZVTkNUSU9OX18sCisJCQkiaW5vZGUgJWxkOiBibG9jayAlZCByZWFkIGVycm9yIiwgaW5vZGUtPmlfaW5vLAorCQkJRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisJaWYgKEJIRFIoYmgpLT5oX21hZ2ljICE9IGNwdV90b19sZTMyKEVYVDNfWEFUVFJfTUFHSUMpIHx8CisJICAgIEJIRFIoYmgpLT5oX2Jsb2NrcyAhPSBjcHVfdG9fbGUzMigxKSkgeworCQlleHQzX2Vycm9yKGlub2RlLT5pX3NiLCBfX0ZVTkNUSU9OX18sCisJCQkiaW5vZGUgJWxkOiBiYWQgYmxvY2sgJWQiLCBpbm9kZS0+aV9pbm8sCisJCQlFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKKwkJZ290byBjbGVhbnVwOworCX0KKwlleHQzX3hhdHRyX3JlbGVhc2VfYmxvY2soaGFuZGxlLCBpbm9kZSwgYmgpOworCUVYVDNfSShpbm9kZSktPmlfZmlsZV9hY2wgPSAwOworCitjbGVhbnVwOgorCWJyZWxzZShiaCk7Cit9CisKKy8qCisgKiBleHQzX3hhdHRyX3B1dF9zdXBlcigpCisgKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGZpbGUgc3lzdGVtIGlzIHVubW91bnRlZC4KKyAqLwordm9pZAorZXh0M194YXR0cl9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwltYl9jYWNoZV9zaHJpbmsoZXh0M194YXR0cl9jYWNoZSwgc2ItPnNfYmRldik7Cit9CisKKy8qCisgKiBleHQzX3hhdHRyX2NhY2hlX2luc2VydCgpCisgKgorICogQ3JlYXRlIGEgbmV3IGVudHJ5IGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY2FjaGUsIGFuZCBpbnNlcnQKKyAqIGl0IHVubGVzcyBzdWNoIGFuIGVudHJ5IGlzIGFscmVhZHkgaW4gdGhlIGNhY2hlLgorICoKKyAqIFJldHVybnMgMCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIHZvaWQKK2V4dDNfeGF0dHJfY2FjaGVfaW5zZXJ0KHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJX191MzIgaGFzaCA9IGxlMzJfdG9fY3B1KEJIRFIoYmgpLT5oX2hhc2gpOworCXN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqY2U7CisJaW50IGVycm9yOworCisJY2UgPSBtYl9jYWNoZV9lbnRyeV9hbGxvYyhleHQzX3hhdHRyX2NhY2hlKTsKKwlpZiAoIWNlKSB7CisJCWVhX2JkZWJ1ZyhiaCwgIm91dCBvZiBtZW1vcnkiKTsKKwkJcmV0dXJuOworCX0KKwllcnJvciA9IG1iX2NhY2hlX2VudHJ5X2luc2VydChjZSwgYmgtPmJfYmRldiwgYmgtPmJfYmxvY2tuciwgJmhhc2gpOworCWlmIChlcnJvcikgeworCQltYl9jYWNoZV9lbnRyeV9mcmVlKGNlKTsKKwkJaWYgKGVycm9yID09IC1FQlVTWSkgeworCQkJZWFfYmRlYnVnKGJoLCAiYWxyZWFkeSBpbiBjYWNoZSIpOworCQkJZXJyb3IgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJZWFfYmRlYnVnKGJoLCAiaW5zZXJ0aW5nIFsleF0iLCAoaW50KWhhc2gpOworCQltYl9jYWNoZV9lbnRyeV9yZWxlYXNlKGNlKTsKKwl9Cit9CisKKy8qCisgKiBleHQzX3hhdHRyX2NtcCgpCisgKgorICogQ29tcGFyZSB0d28gZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrcyBmb3IgZXF1YWxpdHkuCisgKgorICogUmV0dXJucyAwIGlmIHRoZSBibG9ja3MgYXJlIGVxdWFsLCAxIGlmIHRoZXkgZGlmZmVyLCBhbmQKKyAqIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyIG9uIGVycm9ycy4KKyAqLworc3RhdGljIGludAorZXh0M194YXR0cl9jbXAoc3RydWN0IGV4dDNfeGF0dHJfaGVhZGVyICpoZWFkZXIxLAorCSAgICAgICBzdHJ1Y3QgZXh0M194YXR0cl9oZWFkZXIgKmhlYWRlcjIpCit7CisJc3RydWN0IGV4dDNfeGF0dHJfZW50cnkgKmVudHJ5MSwgKmVudHJ5MjsKKworCWVudHJ5MSA9IEVOVFJZKGhlYWRlcjErMSk7CisJZW50cnkyID0gRU5UUlkoaGVhZGVyMisxKTsKKwl3aGlsZSAoIUlTX0xBU1RfRU5UUlkoZW50cnkxKSkgeworCQlpZiAoSVNfTEFTVF9FTlRSWShlbnRyeTIpKQorCQkJcmV0dXJuIDE7CisJCWlmIChlbnRyeTEtPmVfaGFzaCAhPSBlbnRyeTItPmVfaGFzaCB8fAorCQkgICAgZW50cnkxLT5lX25hbWVfaW5kZXggIT0gZW50cnkyLT5lX25hbWVfaW5kZXggfHwKKwkJICAgIGVudHJ5MS0+ZV9uYW1lX2xlbiAhPSBlbnRyeTItPmVfbmFtZV9sZW4gfHwKKwkJICAgIGVudHJ5MS0+ZV92YWx1ZV9zaXplICE9IGVudHJ5Mi0+ZV92YWx1ZV9zaXplIHx8CisJCSAgICBtZW1jbXAoZW50cnkxLT5lX25hbWUsIGVudHJ5Mi0+ZV9uYW1lLCBlbnRyeTEtPmVfbmFtZV9sZW4pKQorCQkJcmV0dXJuIDE7CisJCWlmIChlbnRyeTEtPmVfdmFsdWVfYmxvY2sgIT0gMCB8fCBlbnRyeTItPmVfdmFsdWVfYmxvY2sgIT0gMCkKKwkJCXJldHVybiAtRUlPOworCQlpZiAobWVtY21wKChjaGFyICopaGVhZGVyMSArIGxlMTZfdG9fY3B1KGVudHJ5MS0+ZV92YWx1ZV9vZmZzKSwKKwkJCSAgIChjaGFyICopaGVhZGVyMiArIGxlMTZfdG9fY3B1KGVudHJ5Mi0+ZV92YWx1ZV9vZmZzKSwKKwkJCSAgIGxlMzJfdG9fY3B1KGVudHJ5MS0+ZV92YWx1ZV9zaXplKSkpCisJCQlyZXR1cm4gMTsKKworCQllbnRyeTEgPSBFWFQzX1hBVFRSX05FWFQoZW50cnkxKTsKKwkJZW50cnkyID0gRVhUM19YQVRUUl9ORVhUKGVudHJ5Mik7CisJfQorCWlmICghSVNfTEFTVF9FTlRSWShlbnRyeTIpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGV4dDNfeGF0dHJfY2FjaGVfZmluZCgpCisgKgorICogRmluZCBhbiBpZGVudGljYWwgZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrLgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBibG9jayBmb3VuZCwgb3IgTlVMTCBpZiBzdWNoIGEgYmxvY2sgd2FzCisgKiBub3QgZm91bmQgb3IgYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorZXh0M194YXR0cl9jYWNoZV9maW5kKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQzX3hhdHRyX2hlYWRlciAqaGVhZGVyLAorCQkgICAgICBzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKipwY2UpCit7CisJX191MzIgaGFzaCA9IGxlMzJfdG9fY3B1KGhlYWRlci0+aF9oYXNoKTsKKwlzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlOworCisJaWYgKCFoZWFkZXItPmhfaGFzaCkKKwkJcmV0dXJuIE5VTEw7ICAvKiBuZXZlciBzaGFyZSAqLworCWVhX2lkZWJ1Zyhpbm9kZSwgImxvb2tpbmcgZm9yIGNhY2hlZCBibG9ja3MgWyV4XSIsIChpbnQpaGFzaCk7CithZ2FpbjoKKwljZSA9IG1iX2NhY2hlX2VudHJ5X2ZpbmRfZmlyc3QoZXh0M194YXR0cl9jYWNoZSwgMCwKKwkJCQkgICAgICAgaW5vZGUtPmlfc2ItPnNfYmRldiwgaGFzaCk7CisJd2hpbGUgKGNlKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkJaWYgKElTX0VSUihjZSkpIHsKKwkJCWlmIChQVFJfRVJSKGNlKSA9PSAtRUFHQUlOKQorCQkJCWdvdG8gYWdhaW47CisJCQlicmVhazsKKwkJfQorCQliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBjZS0+ZV9ibG9jayk7CisJCWlmICghYmgpIHsKKwkJCWV4dDNfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkiaW5vZGUgJWxkOiBibG9jayAlbGQgcmVhZCBlcnJvciIsCisJCQkJaW5vZGUtPmlfaW5vLCAodW5zaWduZWQgbG9uZykgY2UtPmVfYmxvY2spOworCQl9IGVsc2UgaWYgKGxlMzJfdG9fY3B1KEJIRFIoYmgpLT5oX3JlZmNvdW50KSA+PQorCQkJCUVYVDNfWEFUVFJfUkVGQ09VTlRfTUFYKSB7CisJCQllYV9pZGVidWcoaW5vZGUsICJibG9jayAlbGQgcmVmY291bnQgJWQ+PSVkIiwKKwkJCQkgICh1bnNpZ25lZCBsb25nKSBjZS0+ZV9ibG9jaywKKwkJCQkgIGxlMzJfdG9fY3B1KEJIRFIoYmgpLT5oX3JlZmNvdW50KSwKKwkJCQkJICBFWFQzX1hBVFRSX1JFRkNPVU5UX01BWCk7CisJCX0gZWxzZSBpZiAoZXh0M194YXR0cl9jbXAoaGVhZGVyLCBCSERSKGJoKSkgPT0gMCkgeworCQkJKnBjZSA9IGNlOworCQkJcmV0dXJuIGJoOworCQl9CisJCWJyZWxzZShiaCk7CisJCWNlID0gbWJfY2FjaGVfZW50cnlfZmluZF9uZXh0KGNlLCAwLCBpbm9kZS0+aV9zYi0+c19iZGV2LCBoYXNoKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKyNkZWZpbmUgTkFNRV9IQVNIX1NISUZUIDUKKyNkZWZpbmUgVkFMVUVfSEFTSF9TSElGVCAxNgorCisvKgorICogZXh0M194YXR0cl9oYXNoX2VudHJ5KCkKKyAqCisgKiBDb21wdXRlIHRoZSBoYXNoIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGV4dDNfeGF0dHJfaGFzaF9lbnRyeShzdHJ1Y3QgZXh0M194YXR0cl9oZWFkZXIgKmhlYWRlciwKKwkJCQkJIHN0cnVjdCBleHQzX3hhdHRyX2VudHJ5ICplbnRyeSkKK3sKKwlfX3UzMiBoYXNoID0gMDsKKwljaGFyICpuYW1lID0gZW50cnktPmVfbmFtZTsKKwlpbnQgbjsKKworCWZvciAobj0wOyBuIDwgZW50cnktPmVfbmFtZV9sZW47IG4rKykgeworCQloYXNoID0gKGhhc2ggPDwgTkFNRV9IQVNIX1NISUZUKSBeCisJCSAgICAgICAoaGFzaCA+PiAoOCpzaXplb2YoaGFzaCkgLSBOQU1FX0hBU0hfU0hJRlQpKSBeCisJCSAgICAgICAqbmFtZSsrOworCX0KKworCWlmIChlbnRyeS0+ZV92YWx1ZV9ibG9jayA9PSAwICYmIGVudHJ5LT5lX3ZhbHVlX3NpemUgIT0gMCkgeworCQlfX2xlMzIgKnZhbHVlID0gKF9fbGUzMiAqKSgoY2hhciAqKWhlYWRlciArCisJCQlsZTE2X3RvX2NwdShlbnRyeS0+ZV92YWx1ZV9vZmZzKSk7CisJCWZvciAobiA9IChsZTMyX3RvX2NwdShlbnRyeS0+ZV92YWx1ZV9zaXplKSArCisJCSAgICAgRVhUM19YQVRUUl9ST1VORCkgPj4gRVhUM19YQVRUUl9QQURfQklUUzsgbjsgbi0tKSB7CisJCQloYXNoID0gKGhhc2ggPDwgVkFMVUVfSEFTSF9TSElGVCkgXgorCQkJICAgICAgIChoYXNoID4+ICg4KnNpemVvZihoYXNoKSAtIFZBTFVFX0hBU0hfU0hJRlQpKSBeCisJCQkgICAgICAgbGUzMl90b19jcHUoKnZhbHVlKyspOworCQl9CisJfQorCWVudHJ5LT5lX2hhc2ggPSBjcHVfdG9fbGUzMihoYXNoKTsKK30KKworI3VuZGVmIE5BTUVfSEFTSF9TSElGVAorI3VuZGVmIFZBTFVFX0hBU0hfU0hJRlQKKworI2RlZmluZSBCTE9DS19IQVNIX1NISUZUIDE2CisKKy8qCisgKiBleHQzX3hhdHRyX3JlaGFzaCgpCisgKgorICogUmUtY29tcHV0ZSB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGhhc2ggdmFsdWUgYWZ0ZXIgYW4gZW50cnkgaGFzIGNoYW5nZWQuCisgKi8KK3N0YXRpYyB2b2lkIGV4dDNfeGF0dHJfcmVoYXNoKHN0cnVjdCBleHQzX3hhdHRyX2hlYWRlciAqaGVhZGVyLAorCQkJICAgICAgc3RydWN0IGV4dDNfeGF0dHJfZW50cnkgKmVudHJ5KQoreworCXN0cnVjdCBleHQzX3hhdHRyX2VudHJ5ICpoZXJlOworCV9fdTMyIGhhc2ggPSAwOworCisJZXh0M194YXR0cl9oYXNoX2VudHJ5KGhlYWRlciwgZW50cnkpOworCWhlcmUgPSBFTlRSWShoZWFkZXIrMSk7CisJd2hpbGUgKCFJU19MQVNUX0VOVFJZKGhlcmUpKSB7CisJCWlmICghaGVyZS0+ZV9oYXNoKSB7CisJCQkvKiBCbG9jayBpcyBub3Qgc2hhcmVkIGlmIGFuIGVudHJ5J3MgaGFzaCB2YWx1ZSA9PSAwICovCisJCQloYXNoID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWhhc2ggPSAoaGFzaCA8PCBCTE9DS19IQVNIX1NISUZUKSBeCisJCSAgICAgICAoaGFzaCA+PiAoOCpzaXplb2YoaGFzaCkgLSBCTE9DS19IQVNIX1NISUZUKSkgXgorCQkgICAgICAgbGUzMl90b19jcHUoaGVyZS0+ZV9oYXNoKTsKKwkJaGVyZSA9IEVYVDNfWEFUVFJfTkVYVChoZXJlKTsKKwl9CisJaGVhZGVyLT5oX2hhc2ggPSBjcHVfdG9fbGUzMihoYXNoKTsKK30KKworI3VuZGVmIEJMT0NLX0hBU0hfU0hJRlQKKworaW50IF9faW5pdAoraW5pdF9leHQzX3hhdHRyKHZvaWQpCit7CisJZXh0M194YXR0cl9jYWNoZSA9IG1iX2NhY2hlX2NyZWF0ZSgiZXh0M194YXR0ciIsIE5VTEwsCisJCXNpemVvZihzdHJ1Y3QgbWJfY2FjaGVfZW50cnkpICsKKwkJc2l6ZW9mKCgoc3RydWN0IG1iX2NhY2hlX2VudHJ5ICopIDApLT5lX2luZGV4ZXNbMF0pLCAxLCA2KTsKKwlpZiAoIWV4dDNfeGF0dHJfY2FjaGUpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCit2b2lkCitleGl0X2V4dDNfeGF0dHIodm9pZCkKK3sKKwlpZiAoZXh0M194YXR0cl9jYWNoZSkKKwkJbWJfY2FjaGVfZGVzdHJveShleHQzX3hhdHRyX2NhY2hlKTsKKwlleHQzX3hhdHRyX2NhY2hlID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZzL2V4dDMveGF0dHIuaCBiL2ZzL2V4dDMveGF0dHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjMxYTY5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0My94YXR0ci5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICBGaWxlOiBmcy9leHQzL3hhdHRyLmgKKworICBPbi1kaXNrIGZvcm1hdCBvZiBleHRlbmRlZCBhdHRyaWJ1dGVzIGZvciB0aGUgZXh0MyBmaWxlc3lzdGVtLgorCisgIChDKSAyMDAxIEFuZHJlYXMgR3J1ZW5iYWNoZXIsIDxhLmdydWVuYmFjaGVyQGNvbXB1dGVyLm9yZz4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgorCisvKiBNYWdpYyB2YWx1ZSBpbiBhdHRyaWJ1dGUgYmxvY2tzICovCisjZGVmaW5lIEVYVDNfWEFUVFJfTUFHSUMJCTB4RUEwMjAwMDAKKworLyogTWF4aW11bSBudW1iZXIgb2YgcmVmZXJlbmNlcyB0byBvbmUgYXR0cmlidXRlIGJsb2NrICovCisjZGVmaW5lIEVYVDNfWEFUVFJfUkVGQ09VTlRfTUFYCQkxMDI0CisKKy8qIE5hbWUgaW5kZXhlcyAqLworI2RlZmluZSBFWFQzX1hBVFRSX0lOREVYX1VTRVIJCQkxCisjZGVmaW5lIEVYVDNfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0FDQ0VTUwkyCisjZGVmaW5lIEVYVDNfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0RFRkFVTFQJMworI2RlZmluZSBFWFQzX1hBVFRSX0lOREVYX1RSVVNURUQJCTQKKyNkZWZpbmUJRVhUM19YQVRUUl9JTkRFWF9MVVNUUkUJCQk1CisjZGVmaW5lIEVYVDNfWEFUVFJfSU5ERVhfU0VDVVJJVFkJICAgICAgICA2CisKK3N0cnVjdCBleHQzX3hhdHRyX2hlYWRlciB7CisJX19sZTMyCWhfbWFnaWM7CS8qIG1hZ2ljIG51bWJlciBmb3IgaWRlbnRpZmljYXRpb24gKi8KKwlfX2xlMzIJaF9yZWZjb3VudDsJLyogcmVmZXJlbmNlIGNvdW50ICovCisJX19sZTMyCWhfYmxvY2tzOwkvKiBudW1iZXIgb2YgZGlzayBibG9ja3MgdXNlZCAqLworCV9fbGUzMgloX2hhc2g7CQkvKiBoYXNoIHZhbHVlIG9mIGFsbCBhdHRyaWJ1dGVzICovCisJX191MzIJaF9yZXNlcnZlZFs0XTsJLyogemVybyByaWdodCBub3cgKi8KK307CisKK3N0cnVjdCBleHQzX3hhdHRyX2lib2R5X2hlYWRlciB7CisJX19sZTMyCWhfbWFnaWM7CS8qIG1hZ2ljIG51bWJlciBmb3IgaWRlbnRpZmljYXRpb24gKi8KK307CisKK3N0cnVjdCBleHQzX3hhdHRyX2VudHJ5IHsKKwlfX3U4CWVfbmFtZV9sZW47CS8qIGxlbmd0aCBvZiBuYW1lICovCisJX191OAllX25hbWVfaW5kZXg7CS8qIGF0dHJpYnV0ZSBuYW1lIGluZGV4ICovCisJX19sZTE2CWVfdmFsdWVfb2ZmczsJLyogb2Zmc2V0IGluIGRpc2sgYmxvY2sgb2YgdmFsdWUgKi8KKwlfX2xlMzIJZV92YWx1ZV9ibG9jazsJLyogZGlzayBibG9jayBhdHRyaWJ1dGUgaXMgc3RvcmVkIG9uIChuL2kpICovCisJX19sZTMyCWVfdmFsdWVfc2l6ZTsJLyogc2l6ZSBvZiBhdHRyaWJ1dGUgdmFsdWUgKi8KKwlfX2xlMzIJZV9oYXNoOwkJLyogaGFzaCB2YWx1ZSBvZiBuYW1lIGFuZCB2YWx1ZSAqLworCWNoYXIJZV9uYW1lWzBdOwkvKiBhdHRyaWJ1dGUgbmFtZSAqLworfTsKKworI2RlZmluZSBFWFQzX1hBVFRSX1BBRF9CSVRTCQkyCisjZGVmaW5lIEVYVDNfWEFUVFJfUEFECQkoMTw8RVhUM19YQVRUUl9QQURfQklUUykKKyNkZWZpbmUgRVhUM19YQVRUUl9ST1VORAkJKEVYVDNfWEFUVFJfUEFELTEpCisjZGVmaW5lIEVYVDNfWEFUVFJfTEVOKG5hbWVfbGVuKSBcCisJKCgobmFtZV9sZW4pICsgRVhUM19YQVRUUl9ST1VORCArIFwKKwlzaXplb2Yoc3RydWN0IGV4dDNfeGF0dHJfZW50cnkpKSAmIH5FWFQzX1hBVFRSX1JPVU5EKQorI2RlZmluZSBFWFQzX1hBVFRSX05FWFQoZW50cnkpIFwKKwkoIChzdHJ1Y3QgZXh0M194YXR0cl9lbnRyeSAqKSggXAorCSAgKGNoYXIgKikoZW50cnkpICsgRVhUM19YQVRUUl9MRU4oKGVudHJ5KS0+ZV9uYW1lX2xlbikpICkKKyNkZWZpbmUgRVhUM19YQVRUUl9TSVpFKHNpemUpIFwKKwkoKChzaXplKSArIEVYVDNfWEFUVFJfUk9VTkQpICYgfkVYVDNfWEFUVFJfUk9VTkQpCisKKyMgaWZkZWYgQ09ORklHX0VYVDNfRlNfWEFUVFIKKworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDNfeGF0dHJfdXNlcl9oYW5kbGVyOworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDNfeGF0dHJfdHJ1c3RlZF9oYW5kbGVyOworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDNfeGF0dHJfYWNsX2FjY2Vzc19oYW5kbGVyOworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDNfeGF0dHJfYWNsX2RlZmF1bHRfaGFuZGxlcjsKK2V4dGVybiBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBleHQzX3hhdHRyX3NlY3VyaXR5X2hhbmRsZXI7CisKK2V4dGVybiBzc2l6ZV90IGV4dDNfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKiwgY2hhciAqLCBzaXplX3QpOworCitleHRlcm4gaW50IGV4dDNfeGF0dHJfZ2V0KHN0cnVjdCBpbm9kZSAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCBzaXplX3QpOworZXh0ZXJuIGludCBleHQzX3hhdHRyX2xpc3Qoc3RydWN0IGlub2RlICosIGNoYXIgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQgZXh0M194YXR0cl9zZXQoc3RydWN0IGlub2RlICosIGludCwgY29uc3QgY2hhciAqLCBjb25zdCB2b2lkICosIHNpemVfdCwgaW50KTsKK2V4dGVybiBpbnQgZXh0M194YXR0cl9zZXRfaGFuZGxlKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7CisKK2V4dGVybiB2b2lkIGV4dDNfeGF0dHJfZGVsZXRlX2lub2RlKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiB2b2lkIGV4dDNfeGF0dHJfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKworZXh0ZXJuIGludCBpbml0X2V4dDNfeGF0dHIodm9pZCk7CitleHRlcm4gdm9pZCBleGl0X2V4dDNfeGF0dHIodm9pZCk7CisKK2V4dGVybiBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqZXh0M194YXR0cl9oYW5kbGVyc1tdOworCisjIGVsc2UgIC8qIENPTkZJR19FWFQzX0ZTX1hBVFRSICovCisKK3N0YXRpYyBpbmxpbmUgaW50CitleHQzX3hhdHRyX2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbmFtZV9pbmRleCwgY29uc3QgY2hhciAqbmFtZSwKKwkgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2V4dDNfeGF0dHJfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2V4dDNfeGF0dHJfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBuYW1lX2luZGV4LCBjb25zdCBjaGFyICpuYW1lLAorCSAgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitleHQzX3hhdHRyX3NldF9oYW5kbGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5hbWVfaW5kZXgsCisJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitleHQzX3hhdHRyX2RlbGV0ZV9pbm9kZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2V4dDNfeGF0dHJfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citpbml0X2V4dDNfeGF0dHIodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitleGl0X2V4dDNfeGF0dHIodm9pZCkKK3sKK30KKworI2RlZmluZSBleHQzX3hhdHRyX2hhbmRsZXJzCU5VTEwKKworIyBlbmRpZiAgLyogQ09ORklHX0VYVDNfRlNfWEFUVFIgKi8KZGlmZiAtLWdpdCBhL2ZzL2V4dDMveGF0dHJfc2VjdXJpdHkuYyBiL2ZzL2V4dDMveGF0dHJfc2VjdXJpdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGMxYzQxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0My94YXR0cl9zZWN1cml0eS5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBsaW51eC9mcy9leHQzL3hhdHRyX3NlY3VyaXR5LmMKKyAqIEhhbmRsZXIgZm9yIHN0b3Jpbmcgc2VjdXJpdHkgbGFiZWxzIGFzIGV4dGVuZGVkIGF0dHJpYnV0ZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDNfZnMuaD4KKyNpbmNsdWRlICJ4YXR0ci5oIgorCitzdGF0aWMgc2l6ZV90CitleHQzX3hhdHRyX3NlY3VyaXR5X2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqbGlzdCwgc2l6ZV90IGxpc3Rfc2l6ZSwKKwkJCSBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9sZW4pCit7CisJY29uc3Qgc2l6ZV90IHByZWZpeF9sZW4gPSBzaXplb2YoWEFUVFJfU0VDVVJJVFlfUFJFRklYKS0xOworCWNvbnN0IHNpemVfdCB0b3RhbF9sZW4gPSBwcmVmaXhfbGVuICsgbmFtZV9sZW4gKyAxOworCisKKwlpZiAobGlzdCAmJiB0b3RhbF9sZW4gPD0gbGlzdF9zaXplKSB7CisJCW1lbWNweShsaXN0LCBYQVRUUl9TRUNVUklUWV9QUkVGSVgsIHByZWZpeF9sZW4pOworCQltZW1jcHkobGlzdCtwcmVmaXhfbGVuLCBuYW1lLCBuYW1lX2xlbik7CisJCWxpc3RbcHJlZml4X2xlbiArIG5hbWVfbGVuXSA9ICdcMCc7CisJfQorCXJldHVybiB0b3RhbF9sZW47Cit9CisKK3N0YXRpYyBpbnQKK2V4dDNfeGF0dHJfc2VjdXJpdHlfZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBleHQzX3hhdHRyX2dldChpbm9kZSwgRVhUM19YQVRUUl9JTkRFWF9TRUNVUklUWSwgbmFtZSwKKwkJCSAgICAgIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDNfeGF0dHJfc2VjdXJpdHlfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gZXh0M194YXR0cl9zZXQoaW5vZGUsIEVYVDNfWEFUVFJfSU5ERVhfU0VDVVJJVFksIG5hbWUsCisJCQkgICAgICB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworfQorCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciBleHQzX3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIgPSB7CisJLnByZWZpeAk9IFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwKKwkubGlzdAk9IGV4dDNfeGF0dHJfc2VjdXJpdHlfbGlzdCwKKwkuZ2V0CT0gZXh0M194YXR0cl9zZWN1cml0eV9nZXQsCisJLnNldAk9IGV4dDNfeGF0dHJfc2VjdXJpdHlfc2V0LAorfTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDMveGF0dHJfdHJ1c3RlZC5jIGIvZnMvZXh0My94YXR0cl90cnVzdGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4YmZkMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDMveGF0dHJfdHJ1c3RlZC5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBsaW51eC9mcy9leHQzL3hhdHRyX3RydXN0ZWQuYworICogSGFuZGxlciBmb3IgdHJ1c3RlZCBleHRlbmRlZCBhdHRyaWJ1dGVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBieSBBbmRyZWFzIEdydWVuYmFjaGVyLCA8YS5ncnVlbmJhY2hlckBjb21wdXRlci5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDNfZnMuaD4KKyNpbmNsdWRlICJ4YXR0ci5oIgorCisjZGVmaW5lIFhBVFRSX1RSVVNURURfUFJFRklYICJ0cnVzdGVkLiIKKworc3RhdGljIHNpemVfdAorZXh0M194YXR0cl90cnVzdGVkX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqbGlzdCwgc2l6ZV90IGxpc3Rfc2l6ZSwKKwkJCWNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbikKK3sKKwljb25zdCBzaXplX3QgcHJlZml4X2xlbiA9IHNpemVvZihYQVRUUl9UUlVTVEVEX1BSRUZJWCktMTsKKwljb25zdCBzaXplX3QgdG90YWxfbGVuID0gcHJlZml4X2xlbiArIG5hbWVfbGVuICsgMTsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobGlzdCAmJiB0b3RhbF9sZW4gPD0gbGlzdF9zaXplKSB7CisJCW1lbWNweShsaXN0LCBYQVRUUl9UUlVTVEVEX1BSRUZJWCwgcHJlZml4X2xlbik7CisJCW1lbWNweShsaXN0K3ByZWZpeF9sZW4sIG5hbWUsIG5hbWVfbGVuKTsKKwkJbGlzdFtwcmVmaXhfbGVuICsgbmFtZV9sZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIHRvdGFsX2xlbjsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl90cnVzdGVkX2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJcmV0dXJuIGV4dDNfeGF0dHJfZ2V0KGlub2RlLCBFWFQzX1hBVFRSX0lOREVYX1RSVVNURUQsIG5hbWUsCisJCQkgICAgICBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50CitleHQzX3hhdHRyX3RydXN0ZWRfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJcmV0dXJuIGV4dDNfeGF0dHJfc2V0KGlub2RlLCBFWFQzX1hBVFRSX0lOREVYX1RSVVNURUQsIG5hbWUsCisJCQkgICAgICB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworfQorCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciBleHQzX3hhdHRyX3RydXN0ZWRfaGFuZGxlciA9IHsKKwkucHJlZml4CT0gWEFUVFJfVFJVU1RFRF9QUkVGSVgsCisJLmxpc3QJPSBleHQzX3hhdHRyX3RydXN0ZWRfbGlzdCwKKwkuZ2V0CT0gZXh0M194YXR0cl90cnVzdGVkX2dldCwKKwkuc2V0CT0gZXh0M194YXR0cl90cnVzdGVkX3NldCwKK307CmRpZmYgLS1naXQgYS9mcy9leHQzL3hhdHRyX3VzZXIuYyBiL2ZzL2V4dDMveGF0dHJfdXNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MDdjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQzL3hhdHRyX3VzZXIuYwpAQCAtMCwwICsxLDc5IEBACisvKgorICogbGludXgvZnMvZXh0My94YXR0cl91c2VyLmMKKyAqIEhhbmRsZXIgZm9yIGV4dGVuZGVkIHVzZXIgYXR0cmlidXRlcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgQW5kcmVhcyBHcnVlbmJhY2hlciwgPGEuZ3J1ZW5iYWNoZXJAY29tcHV0ZXIub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXh0M19qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2ZzLmg+CisjaW5jbHVkZSAieGF0dHIuaCIKKworI2RlZmluZSBYQVRUUl9VU0VSX1BSRUZJWCAidXNlci4iCisKK3N0YXRpYyBzaXplX3QKK2V4dDNfeGF0dHJfdXNlcl9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmxpc3QsIHNpemVfdCBsaXN0X3NpemUsCisJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQoreworCWNvbnN0IHNpemVfdCBwcmVmaXhfbGVuID0gc2l6ZW9mKFhBVFRSX1VTRVJfUFJFRklYKS0xOworCWNvbnN0IHNpemVfdCB0b3RhbF9sZW4gPSBwcmVmaXhfbGVuICsgbmFtZV9sZW4gKyAxOworCisJaWYgKCF0ZXN0X29wdChpbm9kZS0+aV9zYiwgWEFUVFJfVVNFUikpCisJCXJldHVybiAwOworCisJaWYgKGxpc3QgJiYgdG90YWxfbGVuIDw9IGxpc3Rfc2l6ZSkgeworCQltZW1jcHkobGlzdCwgWEFUVFJfVVNFUl9QUkVGSVgsIHByZWZpeF9sZW4pOworCQltZW1jcHkobGlzdCtwcmVmaXhfbGVuLCBuYW1lLCBuYW1lX2xlbik7CisJCWxpc3RbcHJlZml4X2xlbiArIG5hbWVfbGVuXSA9ICdcMCc7CisJfQorCXJldHVybiB0b3RhbF9sZW47Cit9CisKK3N0YXRpYyBpbnQKK2V4dDNfeGF0dHJfdXNlcl9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJaW50IGVycm9yOworCisJaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCF0ZXN0X29wdChpbm9kZS0+aV9zYiwgWEFUVFJfVVNFUikpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwllcnJvciA9IHBlcm1pc3Npb24oaW5vZGUsIE1BWV9SRUFELCBOVUxMKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXJldHVybiBleHQzX3hhdHRyX2dldChpbm9kZSwgRVhUM19YQVRUUl9JTkRFWF9VU0VSLCBuYW1lLCBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50CitleHQzX3hhdHRyX3VzZXJfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBYQVRUUl9VU0VSKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICggIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYKKwkgICAgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8IGlub2RlLT5pX21vZGUgJiBTX0lTVlRYKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwllcnJvciA9IHBlcm1pc3Npb24oaW5vZGUsIE1BWV9XUklURSwgTlVMTCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gZXh0M194YXR0cl9zZXQoaW5vZGUsIEVYVDNfWEFUVFJfSU5ERVhfVVNFUiwgbmFtZSwKKwkJCSAgICAgIHZhbHVlLCBzaXplLCBmbGFncyk7Cit9CisKK3N0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDNfeGF0dHJfdXNlcl9oYW5kbGVyID0geworCS5wcmVmaXgJPSBYQVRUUl9VU0VSX1BSRUZJWCwKKwkubGlzdAk9IGV4dDNfeGF0dHJfdXNlcl9saXN0LAorCS5nZXQJPSBleHQzX3hhdHRyX3VzZXJfZ2V0LAorCS5zZXQJPSBleHQzX3hhdHRyX3VzZXJfc2V0LAorfTsKZGlmZiAtLWdpdCBhL2ZzL2ZhdC9NYWtlZmlsZSBiL2ZzL2ZhdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmI1ZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZmF0L01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IGZhdCBmaWxlc3lzdGVtIHN1cHBvcnQuCisjCisKK29iai0kKENPTkZJR19GQVRfRlMpICs9IGZhdC5vCisKK2ZhdC1vYmpzIDo9IGNhY2hlLm8gZGlyLm8gZmF0ZW50Lm8gZmlsZS5vIGlub2RlLm8gbWlzYy5vCmRpZmYgLS1naXQgYS9mcy9mYXQvY2FjaGUuYyBiL2ZzL2ZhdC9jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNTJlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mYXQvY2FjaGUuYwpAQCAtMCwwICsxLDMyNCBAQAorLyoKKyAqICBsaW51eC9mcy9mYXQvY2FjaGUuYworICoKKyAqICBXcml0dGVuIDE5OTIsMTk5MyBieSBXZXJuZXIgQWxtZXNiZXJnZXIKKyAqCisgKiAgTWFyIDE5OTkuIEFWLiBDaGFuZ2VkIGNhY2hlLCBzbyB0aGF0IGl0IHVzZXMgdGhlIHN0YXJ0aW5nIGNsdXN0ZXIgaW5zdGVhZAorICoJb2YgaW5vZGUgbnVtYmVyLgorICogIE1heSAxOTk5LiBBVi4gRml4ZWQgdGhlIGJvZ29zaXR5IHdpdGggRkFUMzIgKHJlYWQgIkZBVDI4IikuIEZzY2tpbmcgbHVzZXJzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21zZG9zX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworLyogdGhpcyBtdXN0IGJlID4gMC4gKi8KKyNkZWZpbmUgRkFUX01BWF9DQUNIRQk4CisKK3N0cnVjdCBmYXRfY2FjaGUgeworCXN0cnVjdCBsaXN0X2hlYWQgY2FjaGVfbGlzdDsKKwlpbnQgbnJfY29udGlnOwkvKiBudW1iZXIgb2YgY29udGlndW91cyBjbHVzdGVycyAqLworCWludCBmY2x1c3RlcjsJLyogY2x1c3RlciBudW1iZXIgaW4gdGhlIGZpbGUuICovCisJaW50IGRjbHVzdGVyOwkvKiBjbHVzdGVyIG51bWJlciBvbiBkaXNrLiAqLworfTsKKworc3RydWN0IGZhdF9jYWNoZV9pZCB7CisJdW5zaWduZWQgaW50IGlkOworCWludCBucl9jb250aWc7CisJaW50IGZjbHVzdGVyOworCWludCBkY2x1c3RlcjsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGZhdF9tYXhfY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gRkFUX01BWF9DQUNIRTsKK30KKworc3RhdGljIGttZW1fY2FjaGVfdCAqZmF0X2NhY2hlX2NhY2hlcDsKKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKmZvbywga21lbV9jYWNoZV90ICpjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGZhdF9jYWNoZSAqY2FjaGUgPSAoc3RydWN0IGZhdF9jYWNoZSAqKWZvbzsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQorCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpCisJCUlOSVRfTElTVF9IRUFEKCZjYWNoZS0+Y2FjaGVfbGlzdCk7Cit9CisKK2ludCBfX2luaXQgZmF0X2NhY2hlX2luaXQodm9pZCkKK3sKKwlmYXRfY2FjaGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImZhdF9jYWNoZSIsCisJCQkJc2l6ZW9mKHN0cnVjdCBmYXRfY2FjaGUpLAorCQkJCTAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCWluaXRfb25jZSwgTlVMTCk7CisJaWYgKGZhdF9jYWNoZV9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19leGl0IGZhdF9jYWNoZV9kZXN0cm95KHZvaWQpCit7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShmYXRfY2FjaGVfY2FjaGVwKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZmF0X2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZhdF9jYWNoZSAqZmF0X2NhY2hlX2FsbG9jKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoZmF0X2NhY2hlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmF0X2NhY2hlX2ZyZWUoc3RydWN0IGZhdF9jYWNoZSAqY2FjaGUpCit7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZjYWNoZS0+Y2FjaGVfbGlzdCkpOworCWttZW1fY2FjaGVfZnJlZShmYXRfY2FjaGVfY2FjaGVwLCBjYWNoZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYXRfY2FjaGVfdXBkYXRlX2xydShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQlzdHJ1Y3QgZmF0X2NhY2hlICpjYWNoZSkKK3sKKwlpZiAoTVNET1NfSShpbm9kZSktPmNhY2hlX2xydS5uZXh0ICE9ICZjYWNoZS0+Y2FjaGVfbGlzdCkKKwkJbGlzdF9tb3ZlKCZjYWNoZS0+Y2FjaGVfbGlzdCwgJk1TRE9TX0koaW5vZGUpLT5jYWNoZV9scnUpOworfQorCitzdGF0aWMgaW50IGZhdF9jYWNoZV9sb29rdXAoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZjbHVzLAorCQkJICAgIHN0cnVjdCBmYXRfY2FjaGVfaWQgKmNpZCwKKwkJCSAgICBpbnQgKmNhY2hlZF9mY2x1cywgaW50ICpjYWNoZWRfZGNsdXMpCit7CisJc3RhdGljIHN0cnVjdCBmYXRfY2FjaGUgbm9oaXQgPSB7IC5mY2x1c3RlciA9IDAsIH07CisKKwlzdHJ1Y3QgZmF0X2NhY2hlICpoaXQgPSAmbm9oaXQsICpwOworCWludCBvZmZzZXQgPSAtMTsKKworCXNwaW5fbG9jaygmTVNET1NfSShpbm9kZSktPmNhY2hlX2xydV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZNU0RPU19JKGlub2RlKS0+Y2FjaGVfbHJ1LCBjYWNoZV9saXN0KSB7CisJCS8qIEZpbmQgdGhlIGNhY2hlIG9mICJmY2x1cyIgb3IgbmVhcmVzdCBjYWNoZS4gKi8KKwkJaWYgKHAtPmZjbHVzdGVyIDw9IGZjbHVzICYmIGhpdC0+ZmNsdXN0ZXIgPCBwLT5mY2x1c3RlcikgeworCQkJaGl0ID0gcDsKKwkJCWlmICgoaGl0LT5mY2x1c3RlciArIGhpdC0+bnJfY29udGlnKSA8IGZjbHVzKSB7CisJCQkJb2Zmc2V0ID0gaGl0LT5ucl9jb250aWc7CisJCQl9IGVsc2UgeworCQkJCW9mZnNldCA9IGZjbHVzIC0gaGl0LT5mY2x1c3RlcjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlpZiAoaGl0ICE9ICZub2hpdCkgeworCQlmYXRfY2FjaGVfdXBkYXRlX2xydShpbm9kZSwgaGl0KTsKKworCQljaWQtPmlkID0gTVNET1NfSShpbm9kZSktPmNhY2hlX3ZhbGlkX2lkOworCQljaWQtPm5yX2NvbnRpZyA9IGhpdC0+bnJfY29udGlnOworCQljaWQtPmZjbHVzdGVyID0gaGl0LT5mY2x1c3RlcjsKKwkJY2lkLT5kY2x1c3RlciA9IGhpdC0+ZGNsdXN0ZXI7CisJCSpjYWNoZWRfZmNsdXMgPSBjaWQtPmZjbHVzdGVyICsgb2Zmc2V0OworCQkqY2FjaGVkX2RjbHVzID0gY2lkLT5kY2x1c3RlciArIG9mZnNldDsKKwl9CisJc3Bpbl91bmxvY2soJk1TRE9TX0koaW5vZGUpLT5jYWNoZV9scnVfbG9jayk7CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgc3RydWN0IGZhdF9jYWNoZSAqZmF0X2NhY2hlX21lcmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSBzdHJ1Y3QgZmF0X2NhY2hlX2lkICpuZXcpCit7CisJc3RydWN0IGZhdF9jYWNoZSAqcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJk1TRE9TX0koaW5vZGUpLT5jYWNoZV9scnUsIGNhY2hlX2xpc3QpIHsKKwkJLyogRmluZCB0aGUgc2FtZSBwYXJ0IGFzICJuZXciIGluIGNsdXN0ZXItY2hhaW4uICovCisJCWlmIChwLT5mY2x1c3RlciA9PSBuZXctPmZjbHVzdGVyKSB7CisJCQlCVUdfT04ocC0+ZGNsdXN0ZXIgIT0gbmV3LT5kY2x1c3Rlcik7CisJCQlpZiAobmV3LT5ucl9jb250aWcgPiBwLT5ucl9jb250aWcpCisJCQkJcC0+bnJfY29udGlnID0gbmV3LT5ucl9jb250aWc7CisJCQlyZXR1cm4gcDsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZmF0X2NhY2hlX2FkZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmF0X2NhY2hlX2lkICpuZXcpCit7CisJc3RydWN0IGZhdF9jYWNoZSAqY2FjaGUsICp0bXA7CisKKwlpZiAobmV3LT5mY2x1c3RlciA9PSAtMSkgLyogZHVtbXkgY2FjaGUgKi8KKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZNU0RPU19JKGlub2RlKS0+Y2FjaGVfbHJ1X2xvY2spOworCWlmIChuZXctPmlkICE9IEZBVF9DQUNIRV9WQUxJRCAmJgorCSAgICBuZXctPmlkICE9IE1TRE9TX0koaW5vZGUpLT5jYWNoZV92YWxpZF9pZCkKKwkJZ290byBvdXQ7CS8qIHRoaXMgY2FjaGUgd2FzIGludmFsaWRhdGVkICovCisKKwljYWNoZSA9IGZhdF9jYWNoZV9tZXJnZShpbm9kZSwgbmV3KTsKKwlpZiAoY2FjaGUgPT0gTlVMTCkgeworCQlpZiAoTVNET1NfSShpbm9kZSktPm5yX2NhY2hlcyA8IGZhdF9tYXhfY2FjaGUoaW5vZGUpKSB7CisJCQlNU0RPU19JKGlub2RlKS0+bnJfY2FjaGVzKys7CisJCQlzcGluX3VubG9jaygmTVNET1NfSShpbm9kZSktPmNhY2hlX2xydV9sb2NrKTsKKworCQkJdG1wID0gZmF0X2NhY2hlX2FsbG9jKGlub2RlKTsKKwkJCXNwaW5fbG9jaygmTVNET1NfSShpbm9kZSktPmNhY2hlX2xydV9sb2NrKTsKKwkJCWNhY2hlID0gZmF0X2NhY2hlX21lcmdlKGlub2RlLCBuZXcpOworCQkJaWYgKGNhY2hlICE9IE5VTEwpIHsKKwkJCQlNU0RPU19JKGlub2RlKS0+bnJfY2FjaGVzLS07CisJCQkJZmF0X2NhY2hlX2ZyZWUodG1wKTsKKwkJCQlnb3RvIG91dF91cGRhdGVfbHJ1OworCQkJfQorCQkJY2FjaGUgPSB0bXA7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgbGlzdF9oZWFkICpwID0gTVNET1NfSShpbm9kZSktPmNhY2hlX2xydS5wcmV2OworCQkJY2FjaGUgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBmYXRfY2FjaGUsIGNhY2hlX2xpc3QpOworCQl9CisJCWNhY2hlLT5mY2x1c3RlciA9IG5ldy0+ZmNsdXN0ZXI7CisJCWNhY2hlLT5kY2x1c3RlciA9IG5ldy0+ZGNsdXN0ZXI7CisJCWNhY2hlLT5ucl9jb250aWcgPSBuZXctPm5yX2NvbnRpZzsKKwl9CitvdXRfdXBkYXRlX2xydToKKwlmYXRfY2FjaGVfdXBkYXRlX2xydShpbm9kZSwgY2FjaGUpOworb3V0OgorCXNwaW5fdW5sb2NrKCZNU0RPU19JKGlub2RlKS0+Y2FjaGVfbHJ1X2xvY2spOworfQorCisvKgorICogQ2FjaGUgaW52YWxpZGF0aW9uIG9jY3VycyByYXJlbHksIHRodXMgdGhlIExSVSBjaGFpbiBpcyBub3QgdXBkYXRlZC4gSXQKKyAqIGZpeGVzIGl0c2VsZiBhZnRlciBhIHdoaWxlLgorICovCitzdGF0aWMgdm9pZCBfX2ZhdF9jYWNoZV9pbnZhbF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBtc2Rvc19pbm9kZV9pbmZvICppID0gTVNET1NfSShpbm9kZSk7CisJc3RydWN0IGZhdF9jYWNoZSAqY2FjaGU7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmktPmNhY2hlX2xydSkpIHsKKwkJY2FjaGUgPSBsaXN0X2VudHJ5KGktPmNhY2hlX2xydS5uZXh0LCBzdHJ1Y3QgZmF0X2NhY2hlLCBjYWNoZV9saXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmY2FjaGUtPmNhY2hlX2xpc3QpOworCQlpLT5ucl9jYWNoZXMtLTsKKwkJZmF0X2NhY2hlX2ZyZWUoY2FjaGUpOworCX0KKwkvKiBVcGRhdGUuIFRoZSBjb3B5IG9mIGNhY2hlcyBiZWZvcmUgdGhpcyBpZCBpcyBkaXNjYXJkZWQuICovCisJaS0+Y2FjaGVfdmFsaWRfaWQrKzsKKwlpZiAoaS0+Y2FjaGVfdmFsaWRfaWQgPT0gRkFUX0NBQ0hFX1ZBTElEKQorCQlpLT5jYWNoZV92YWxpZF9pZCsrOworfQorCit2b2lkIGZhdF9jYWNoZV9pbnZhbF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXNwaW5fbG9jaygmTVNET1NfSShpbm9kZSktPmNhY2hlX2xydV9sb2NrKTsKKwlfX2ZhdF9jYWNoZV9pbnZhbF9pbm9kZShpbm9kZSk7CisJc3Bpbl91bmxvY2soJk1TRE9TX0koaW5vZGUpLT5jYWNoZV9scnVfbG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNhY2hlX2NvbnRpZ3VvdXMoc3RydWN0IGZhdF9jYWNoZV9pZCAqY2lkLCBpbnQgZGNsdXMpCit7CisJY2lkLT5ucl9jb250aWcrKzsKKwlyZXR1cm4gKChjaWQtPmRjbHVzdGVyICsgY2lkLT5ucl9jb250aWcpID09IGRjbHVzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNhY2hlX2luaXQoc3RydWN0IGZhdF9jYWNoZV9pZCAqY2lkLCBpbnQgZmNsdXMsIGludCBkY2x1cykKK3sKKwljaWQtPmlkID0gRkFUX0NBQ0hFX1ZBTElEOworCWNpZC0+ZmNsdXN0ZXIgPSBmY2x1czsKKwljaWQtPmRjbHVzdGVyID0gZGNsdXM7CisJY2lkLT5ucl9jb250aWcgPSAwOworfQorCitpbnQgZmF0X2dldF9jbHVzdGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBjbHVzdGVyLCBpbnQgKmZjbHVzLCBpbnQgKmRjbHVzKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwljb25zdCBpbnQgbGltaXQgPSBzYi0+c19tYXhieXRlcyA+PiBNU0RPU19TQihzYiktPmNsdXN0ZXJfYml0czsKKwlzdHJ1Y3QgZmF0X2VudHJ5IGZhdGVudDsKKwlzdHJ1Y3QgZmF0X2NhY2hlX2lkIGNpZDsKKwlpbnQgbnI7CisKKwlCVUdfT04oTVNET1NfSShpbm9kZSktPmlfc3RhcnQgPT0gMCk7CisKKwkqZmNsdXMgPSAwOworCSpkY2x1cyA9IE1TRE9TX0koaW5vZGUpLT5pX3N0YXJ0OworCWlmIChjbHVzdGVyID09IDApCisJCXJldHVybiAwOworCisJaWYgKGZhdF9jYWNoZV9sb29rdXAoaW5vZGUsIGNsdXN0ZXIsICZjaWQsIGZjbHVzLCBkY2x1cykgPCAwKSB7CisJCS8qCisJCSAqIGR1bW15LCBhbHdheXMgbm90IGNvbnRpZ3VvdXMKKwkJICogVGhpcyBpcyByZWluaXRpYWxpemVkIGJ5IGNhY2hlX2luaXQoKSwgbGF0ZXIuCisJCSAqLworCQljYWNoZV9pbml0KCZjaWQsIC0xLCAtMSk7CisJfQorCisJZmF0ZW50X2luaXQoJmZhdGVudCk7CisJd2hpbGUgKCpmY2x1cyA8IGNsdXN0ZXIpIHsKKwkJLyogcHJldmVudCB0aGUgaW5maW5pdGUgbG9vcCBvZiBjbHVzdGVyIGNoYWluICovCisJCWlmICgqZmNsdXMgPiBsaW1pdCkgeworCQkJZmF0X2ZzX3BhbmljKHNiLCAiJXM6IGRldGVjdGVkIHRoZSBjbHVzdGVyIGNoYWluIGxvb3AiCisJCQkJICAgICAiIChpX3BvcyAlbGxkKSIsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgIE1TRE9TX0koaW5vZGUpLT5pX3Bvcyk7CisJCQluciA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCisJCW5yID0gZmF0X2VudF9yZWFkKGlub2RlLCAmZmF0ZW50LCAqZGNsdXMpOworCQlpZiAobnIgPCAwKQorCQkJZ290byBvdXQ7CisJCWVsc2UgaWYgKG5yID09IEZBVF9FTlRfRlJFRSkgeworCQkJZmF0X2ZzX3BhbmljKHNiLCAiJXM6IGludmFsaWQgY2x1c3RlciBjaGFpbiIKKwkJCQkgICAgICIgKGlfcG9zICVsbGQpIiwgX19GVU5DVElPTl9fLAorCQkJCSAgICAgTVNET1NfSShpbm9kZSktPmlfcG9zKTsKKwkJCW5yID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgaWYgKG5yID09IEZBVF9FTlRfRU9GKSB7CisJCQlmYXRfY2FjaGVfYWRkKGlub2RlLCAmY2lkKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCSgqZmNsdXMpKys7CisJCSpkY2x1cyA9IG5yOworCQlpZiAoIWNhY2hlX2NvbnRpZ3VvdXMoJmNpZCwgKmRjbHVzKSkKKwkJCWNhY2hlX2luaXQoJmNpZCwgKmZjbHVzLCAqZGNsdXMpOworCX0KKwluciA9IDA7CisJZmF0X2NhY2hlX2FkZChpbm9kZSwgJmNpZCk7CitvdXQ6CisJZmF0ZW50X2JyZWxzZSgmZmF0ZW50KTsKKwlyZXR1cm4gbnI7Cit9CisKK3N0YXRpYyBpbnQgZmF0X2JtYXBfY2x1c3RlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgY2x1c3RlcikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJaW50IHJldCwgZmNsdXMsIGRjbHVzOworCisJaWYgKE1TRE9TX0koaW5vZGUpLT5pX3N0YXJ0ID09IDApCisJCXJldHVybiAwOworCisJcmV0ID0gZmF0X2dldF9jbHVzdGVyKGlub2RlLCBjbHVzdGVyLCAmZmNsdXMsICZkY2x1cyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJZWxzZSBpZiAocmV0ID09IEZBVF9FTlRfRU9GKSB7CisJCWZhdF9mc19wYW5pYyhzYiwgIiVzOiByZXF1ZXN0IGJleW9uZCBFT0YgKGlfcG9zICVsbGQpIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCBNU0RPU19JKGlub2RlKS0+aV9wb3MpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIGRjbHVzOworfQorCitpbnQgZmF0X2JtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3Qgc2VjdG9yLCBzZWN0b3JfdCAqcGh5cykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlzZWN0b3JfdCBsYXN0X2Jsb2NrOworCWludCBjbHVzdGVyLCBvZmZzZXQ7CisKKwkqcGh5cyA9IDA7CisJaWYgKChzYmktPmZhdF9iaXRzICE9IDMyKSAmJiAoaW5vZGUtPmlfaW5vID09IE1TRE9TX1JPT1RfSU5PKSkgeworCQlpZiAoc2VjdG9yIDwgKHNiaS0+ZGlyX2VudHJpZXMgPj4gc2JpLT5kaXJfcGVyX2Jsb2NrX2JpdHMpKQorCQkJKnBoeXMgPSBzZWN0b3IgKyBzYmktPmRpcl9zdGFydDsKKwkJcmV0dXJuIDA7CisJfQorCWxhc3RfYmxvY2sgPSAoTVNET1NfSShpbm9kZSktPm1tdV9wcml2YXRlICsgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpKQorCQk+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwlpZiAoc2VjdG9yID49IGxhc3RfYmxvY2spCisJCXJldHVybiAwOworCisJY2x1c3RlciA9IHNlY3RvciA+PiAoc2JpLT5jbHVzdGVyX2JpdHMgLSBzYi0+c19ibG9ja3NpemVfYml0cyk7CisJb2Zmc2V0ICA9IHNlY3RvciAmIChzYmktPnNlY19wZXJfY2x1cyAtIDEpOworCWNsdXN0ZXIgPSBmYXRfYm1hcF9jbHVzdGVyKGlub2RlLCBjbHVzdGVyKTsKKwlpZiAoY2x1c3RlciA8IDApCisJCXJldHVybiBjbHVzdGVyOworCWVsc2UgaWYgKGNsdXN0ZXIpCisJCSpwaHlzID0gZmF0X2NsdXNfdG9fYmxrbnIoc2JpLCBjbHVzdGVyKSArIG9mZnNldDsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2ZhdC9kaXIuYyBiL2ZzL2ZhdC9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWFlMWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZmF0L2Rpci5jCkBAIC0wLDAgKzEsMTI3MSBAQAorLyoKKyAqICBsaW51eC9mcy9mYXQvZGlyLmMKKyAqCisgKiAgZGlyZWN0b3J5IGhhbmRsaW5nIGZ1bmN0aW9ucyBmb3IgZmF0LWJhc2VkIGZpbGVzeXN0ZW1zCisgKgorICogIFdyaXR0ZW4gMTk5MiwxOTkzIGJ5IFdlcm5lciBBbG1lc2JlcmdlcgorICoKKyAqICBIaWRkZW4gZmlsZXMgMTk5NSBieSBBbGJlcnQgQ2FoYWxhbiA8YWxiZXJ0QGNjcy5uZXUuZWR1PiA8YWRjQGNvZS5uZXUuZWR1PgorICoKKyAqICBWRkFUIGV4dGVuc2lvbnMgYnkgR29yZG9uIENoYWZmZWUgPGNoYWZmZWVAcGxhdGVhdS5jcy5iZXJrZWxleS5lZHU+CisgKiAgTWVyZ2VkIHdpdGggbXNkb3MgZnMgYnkgSGVucmlrIFN0b3JuZXIgPHN0b3JuZXJAb3NpcmlzLnBpbmcuZGs+CisgKiAgUmV3cml0dGVuIGZvciBjb25zdGFudCBpbnVtYmVycy4gUGx1Z2dlZCBidWZmZXIgb3ZlcnJ1biBpbiByZWFkZGlyKCkuIEFWCisgKiAgU2hvcnQgbmFtZSB0cmFuc2xhdGlvbiAxOTk5LCAyMDAxIGJ5IFdvbGZyYW0gUGllbmtvc3MgPHdwQGJzemguZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbXNkb3NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kaXJlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIGlubGluZSBsb2ZmX3QgZmF0X21ha2VfaV9wb3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQkgICAgc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqZGUpCit7CisJcmV0dXJuICgobG9mZl90KWJoLT5iX2Jsb2NrbnIgPDwgTVNET1NfU0Ioc2IpLT5kaXJfcGVyX2Jsb2NrX2JpdHMpCisJCXwgKGRlIC0gKHN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKiliaC0+Yl9kYXRhKTsKK30KKworLyogUmV0dXJucyB0aGUgaW5vZGUgbnVtYmVyIG9mIHRoZSBkaXJlY3RvcnkgZW50cnkgYXQgb2Zmc2V0IHBvcy4gSWYgYmggaXMKKyAgIG5vbi1OVUxMLCBpdCBpcyBicmVsc2UnZCBiZWZvcmUuIFBvcyBpcyBpbmNyZW1lbnRlZC4gVGhlIGJ1ZmZlciBoZWFkZXIgaXMKKyAgIHJldHVybmVkIGluIGJoLgorICAgQVYuIE1vc3Qgb2Z0ZW4gd2UgZG8gaXQgaXRlbS1ieS1pdGVtLiBNYWtlcyBzZW5zZSB0byBvcHRpbWl6ZS4KKyAgIEFWLiBPSywgdGhlcmUgd2UgZ286IGlmIGJvdGggYmggYW5kIGRlIGFyZSBub24tTlVMTCB3ZSBhc3N1bWUgdGhhdCB3ZSBqdXN0CisgICBBVi4gd2FudCB0aGUgbmV4dCBlbnRyeSAodG9vayBvbmUgZXhwbGljaXQgZGU9TlVMTCBpbiB2ZmF0L25hbWVpLmMpLgorICAgQVYuIEl0J3MgZG9uZSBpbiBmYXRfZ2V0X2VudHJ5KCkgKGlubGluZWQpLCBoZXJlIHRoZSBzbG93IGNhc2UgbGl2ZXMuCisgICBBVi4gQWRkaXRpb25hbGx5LCB3aGVuIHdlIHJldHVybiAtMSAoaS5lLiByZWFjaGVkIHRoZSBlbmQgb2YgZGlyZWN0b3J5KQorICAgQVYuIHdlIG1ha2UgYmggTlVMTC4KKyAqLworc3RhdGljIGludCBmYXRfX2dldF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwgbG9mZl90ICpwb3MsCisJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLCBzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICoqZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKKwlzZWN0b3JfdCBwaHlzLCBpYmxvY2s7CisJaW50IG9mZnNldDsKKwlpbnQgZXJyOworCituZXh0OgorCWlmICgqYmgpCisJCWJyZWxzZSgqYmgpOworCisJKmJoID0gTlVMTDsKKwlpYmxvY2sgPSAqcG9zID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCWVyciA9IGZhdF9ibWFwKGRpciwgaWJsb2NrLCAmcGh5cyk7CisJaWYgKGVyciB8fCAhcGh5cykKKwkJcmV0dXJuIC0xOwkvKiBiZXlvbmQgRU9GIG9yIGVycm9yICovCisKKwkqYmggPSBzYl9icmVhZChzYiwgcGh5cyk7CisJaWYgKCpiaCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRkFUOiBEaXJlY3RvcnkgYnJlYWQoYmxvY2sgJWxsdSkgZmFpbGVkXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwaHlzKTsKKwkJLyogc2tpcCB0aGlzIGJsb2NrICovCisJCSpwb3MgPSAoaWJsb2NrICsgMSkgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCWdvdG8gbmV4dDsKKwl9CisKKwlvZmZzZXQgPSAqcG9zICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOworCSpwb3MgKz0gc2l6ZW9mKHN0cnVjdCBtc2Rvc19kaXJfZW50cnkpOworCSpkZSA9IChzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICopKCgqYmgpLT5iX2RhdGEgKyBvZmZzZXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZhdF9nZXRfZW50cnkoc3RydWN0IGlub2RlICpkaXIsIGxvZmZfdCAqcG9zLAorCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLAorCQkJCXN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKipkZSkKK3sKKwkvKiBGYXN0IHN0dWZmIGZpcnN0ICovCisJaWYgKCpiaCAmJiAqZGUgJiYKKwkgICAgKCpkZSAtIChzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICopKCpiaCktPmJfZGF0YSkgPCBNU0RPU19TQihkaXItPmlfc2IpLT5kaXJfcGVyX2Jsb2NrIC0gMSkgeworCQkqcG9zICs9IHNpemVvZihzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5KTsKKwkJKCpkZSkrKzsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBmYXRfX2dldF9lbnRyeShkaXIsIHBvcywgYmgsIGRlKTsKK30KKworLyoKKyAqIENvbnZlcnQgVW5pY29kZSAxNiB0byBVVEY4LCB0cmFuc2xhdGVkIFVuaWNvZGUsIG9yIEFTQ0lJLgorICogSWYgdW5pX3hsYXRlIGlzIGVuYWJsZWQgYW5kIHdlIGNhbid0IGdldCBhIDE6MSBjb252ZXJzaW9uLCB1c2UgYQorICogY29sb24gYXMgYW4gZXNjYXBlIGNoYXJhY3RlciBzaW5jZSBpdCBpcyBub3JtYWxseSBpbnZhbGlkIG9uIHRoZSB2ZmF0CisgKiBmaWxlc3lzdGVtLiBUaGUgZm9sbG93aW5nIGZvdXIgY2hhcmFjdGVycyBhcmUgdGhlIGhleGFkZWNpbWFsIGRpZ2l0cworICogb2YgVW5pY29kZSB2YWx1ZS4gVGhpcyBsZXRzIHVzIGRvIGEgZnVsbCBkdW1wIGFuZCByZXN0b3JlIG9mIFVuaWNvZGUKKyAqIGZpbGVuYW1lcy4gV2UgY291bGQgZ2V0IGludG8gc29tZSB0cm91YmxlIHdpdGggbG9uZyBVbmljb2RlIG5hbWVzLAorICogYnV0IGlnbm9yZSB0aGF0IHJpZ2h0IG5vdy4KKyAqIEFoZW0uLi4gU3RhY2sgc21hc2hpbmcgaW4gcmluZyAwIGlzbid0IGZ1bi4gRml4ZWQuCisgKi8KK3N0YXRpYyBpbnQgdW5pMTZfdG9feDgodW5zaWduZWQgY2hhciAqYXNjaWksIHdjaGFyX3QgKnVuaSwgaW50IHVuaV94bGF0ZSwKKwkJICAgICAgIHN0cnVjdCBubHNfdGFibGUgKm5scykKK3sKKwl3Y2hhcl90ICppcCwgZWM7CisJdW5zaWduZWQgY2hhciAqb3AsIG5jOworCWludCBjaGFybGVuOworCWludCBrOworCisJaXAgPSB1bmk7CisJb3AgPSBhc2NpaTsKKworCXdoaWxlICgqaXApIHsKKwkJZWMgPSAqaXArKzsKKwkJaWYgKCAoY2hhcmxlbiA9IG5scy0+dW5pMmNoYXIoZWMsIG9wLCBOTFNfTUFYX0NIQVJTRVRfU0laRSkpID4gMCkgeworCQkJb3AgKz0gY2hhcmxlbjsKKwkJfSBlbHNlIHsKKwkJCWlmICh1bmlfeGxhdGUgPT0gMSkgeworCQkJCSpvcCA9ICc6JzsKKwkJCQlmb3IgKGsgPSA0OyBrID4gMDsgay0tKSB7CisJCQkJCW5jID0gZWMgJiAweEY7CisJCQkJCW9wW2tdID0gbmMgPiA5CT8gbmMgKyAoJ2EnIC0gMTApCisJCQkJCQkJOiBuYyArICcwJzsKKwkJCQkJZWMgPj49IDQ7CisJCQkJfQorCQkJCW9wICs9IDU7CisJCQl9IGVsc2UgeworCQkJCSpvcCsrID0gJz8nOworCQkJfQorCQl9CisJCS8qIFdlIGhhdmUgc29tZSBzbGFjayB0aGVyZSwgc28gaXQncyBPSyAqLworCQlpZiAob3A+YXNjaWkrMjU2KSB7CisJCQlvcCA9IGFzY2lpICsgMjU2OworCQkJYnJlYWs7CisJCX0KKwl9CisJKm9wID0gMDsKKwlyZXR1cm4gKG9wIC0gYXNjaWkpOworfQorCitzdGF0aWMgaW5saW5lIGludAorZmF0X3Nob3J0MnVuaShzdHJ1Y3QgbmxzX3RhYmxlICp0LCB1bnNpZ25lZCBjaGFyICpjLCBpbnQgY2xlbiwgd2NoYXJfdCAqdW5pKQoreworCWludCBjaGFybGVuOworCisJY2hhcmxlbiA9IHQtPmNoYXIydW5pKGMsIGNsZW4sIHVuaSk7CisJaWYgKGNoYXJsZW4gPCAwKSB7CisJCSp1bmkgPSAweDAwM2Y7CS8qIGEgcXVlc3Rpb24gbWFyayAqLworCQljaGFybGVuID0gMTsKKwl9CisJcmV0dXJuIGNoYXJsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitmYXRfc2hvcnQybG93ZXJfdW5pKHN0cnVjdCBubHNfdGFibGUgKnQsIHVuc2lnbmVkIGNoYXIgKmMsIGludCBjbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJaW50IGNoYXJsZW47CisJd2NoYXJfdCB3YzsKKworCWNoYXJsZW4gPSB0LT5jaGFyMnVuaShjLCBjbGVuLCAmd2MpOworCWlmIChjaGFybGVuIDwgMCkgeworCQkqdW5pID0gMHgwMDNmOwkvKiBhIHF1ZXN0aW9uIG1hcmsgKi8KKwkJY2hhcmxlbiA9IDE7CisJfSBlbHNlIGlmIChjaGFybGVuIDw9IDEpIHsKKwkJdW5zaWduZWQgY2hhciBuYyA9IHQtPmNoYXJzZXQybG93ZXJbKmNdOworCisJCWlmICghbmMpCisJCQluYyA9ICpjOworCisJCWlmICggKGNoYXJsZW4gPSB0LT5jaGFyMnVuaSgmbmMsIDEsIHVuaSkpIDwgMCkgeworCQkJKnVuaSA9IDB4MDAzZjsJLyogYSBxdWVzdGlvbiBtYXJrICovCisJCQljaGFybGVuID0gMTsKKwkJfQorCX0gZWxzZQorCQkqdW5pID0gd2M7CisKKwlyZXR1cm4gY2hhcmxlbjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2ZhdF9zaG9ydG5hbWUydW5pKHN0cnVjdCBubHNfdGFibGUgKm5scywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsCisJCSAgd2NoYXJfdCAqdW5pX2J1ZiwgdW5zaWduZWQgc2hvcnQgb3B0LCBpbnQgbG93ZXIpCit7CisJaW50IGxlbiA9IDA7CisKKwlpZiAob3B0ICYgVkZBVF9TRk5fRElTUExBWV9MT1dFUikKKwkJbGVuID0gIGZhdF9zaG9ydDJsb3dlcl91bmkobmxzLCBidWYsIGJ1Zl9zaXplLCB1bmlfYnVmKTsKKwllbHNlIGlmIChvcHQgJiBWRkFUX1NGTl9ESVNQTEFZX1dJTjk1KQorCQlsZW4gPSBmYXRfc2hvcnQydW5pKG5scywgYnVmLCBidWZfc2l6ZSwgdW5pX2J1Zik7CisJZWxzZSBpZiAob3B0ICYgVkZBVF9TRk5fRElTUExBWV9XSU5OVCkgeworCQlpZiAobG93ZXIpCisJCQlsZW4gPSBmYXRfc2hvcnQybG93ZXJfdW5pKG5scywgYnVmLCBidWZfc2l6ZSwgdW5pX2J1Zik7CisJCWVsc2UKKwkJCWxlbiA9IGZhdF9zaG9ydDJ1bmkobmxzLCBidWYsIGJ1Zl9zaXplLCB1bmlfYnVmKTsKKwl9IGVsc2UKKwkJbGVuID0gZmF0X3Nob3J0MnVuaShubHMsIGJ1ZiwgYnVmX3NpemUsIHVuaV9idWYpOworCisJcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIFJldHVybiB2YWx1ZXM6IG5lZ2F0aXZlIC0+IGVycm9yLCAwIC0+IG5vdCBmb3VuZCwgcG9zaXRpdmUgLT4gZm91bmQsCisgKiB2YWx1ZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIHNsb3RzLCBpbmNsdWRpbmcgdGhlIHNob3J0bmFtZSBlbnRyeS4KKyAqLworaW50IGZhdF9zZWFyY2hfbG9uZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLAorCQkgICAgaW50IG5hbWVfbGVuLCBzdHJ1Y3QgZmF0X3Nsb3RfaW5mbyAqc2luZm8pCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqZGU7CisJc3RydWN0IG5sc190YWJsZSAqbmxzX2lvID0gc2JpLT5ubHNfaW87CisJc3RydWN0IG5sc190YWJsZSAqbmxzX2Rpc2sgPSBzYmktPm5sc19kaXNrOworCXdjaGFyX3QgYnVmdW5hbWVbMTRdOworCXVuc2lnbmVkIGNoYXIgeGxhdGVfbGVuLCBucl9zbG90czsKKwl3Y2hhcl90ICp1bmljb2RlID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyIHdvcmtbOF0sIGJ1Zm5hbWVbMjYwXTsJLyogMjU2ICsgNCAqLworCWludCB1bmlfeGxhdGUgPSBzYmktPm9wdGlvbnMudW5pY29kZV94bGF0ZTsKKwlpbnQgdXRmOCA9IHNiaS0+b3B0aW9ucy51dGY4OworCWludCBhbnljYXNlID0gKHNiaS0+b3B0aW9ucy5uYW1lX2NoZWNrICE9ICdzJyk7CisJdW5zaWduZWQgc2hvcnQgb3B0X3Nob3J0bmFtZSA9IHNiaS0+b3B0aW9ucy5zaG9ydG5hbWU7CisJbG9mZl90IGNwb3MgPSAwOworCWludCBjaGwsIGksIGosIGxhc3RfdSwgZXJyOworCisJZXJyID0gLUVOT0VOVDsKKwl3aGlsZSgxKSB7CisJCWlmIChmYXRfZ2V0X2VudHJ5KGlub2RlLCAmY3BvcywgJmJoLCAmZGUpID09IC0xKQorCQkJZ290byBFT0RpcjsKK3BhcnNlX3JlY29yZDoKKwkJbnJfc2xvdHMgPSAwOworCQlpZiAoZGUtPm5hbWVbMF0gPT0gREVMRVRFRF9GTEFHKQorCQkJY29udGludWU7CisJCWlmIChkZS0+YXR0ciAhPSBBVFRSX0VYVCAmJiAoZGUtPmF0dHIgJiBBVFRSX1ZPTFVNRSkpCisJCQljb250aW51ZTsKKwkJaWYgKGRlLT5hdHRyICE9IEFUVFJfRVhUICYmIElTX0ZSRUUoZGUtPm5hbWUpKQorCQkJY29udGludWU7CisJCWlmIChkZS0+YXR0ciA9PSBBVFRSX0VYVCkgeworCQkJc3RydWN0IG1zZG9zX2Rpcl9zbG90ICpkczsKKwkJCXVuc2lnbmVkIGNoYXIgaWQ7CisJCQl1bnNpZ25lZCBjaGFyIHNsb3Q7CisJCQl1bnNpZ25lZCBjaGFyIHNsb3RzOworCQkJdW5zaWduZWQgY2hhciBzdW07CisJCQl1bnNpZ25lZCBjaGFyIGFsaWFzX2NoZWNrc3VtOworCisJCQlpZiAoIXVuaWNvZGUpIHsKKwkJCQl1bmljb2RlID0gKHdjaGFyX3QgKikKKwkJCQkJX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCQkJCWlmICghdW5pY29kZSkgeworCQkJCQlicmVsc2UoYmgpOworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl9CisJCQl9CitwYXJzZV9sb25nOgorCQkJc2xvdHMgPSAwOworCQkJZHMgPSAoc3RydWN0IG1zZG9zX2Rpcl9zbG90ICopIGRlOworCQkJaWQgPSBkcy0+aWQ7CisJCQlpZiAoIShpZCAmIDB4NDApKQorCQkJCWNvbnRpbnVlOworCQkJc2xvdHMgPSBpZCAmIH4weDQwOworCQkJaWYgKHNsb3RzID4gMjAgfHwgIXNsb3RzKQkvKiBjZWlsKDI1NiAqIDIgLyAyNikgKi8KKwkJCQljb250aW51ZTsKKwkJCW5yX3Nsb3RzID0gc2xvdHM7CisJCQlhbGlhc19jaGVja3N1bSA9IGRzLT5hbGlhc19jaGVja3N1bTsKKworCQkJc2xvdCA9IHNsb3RzOworCQkJd2hpbGUgKDEpIHsKKwkJCQlpbnQgb2Zmc2V0OworCisJCQkJc2xvdC0tOworCQkJCW9mZnNldCA9IHNsb3QgKiAxMzsKKwkJCQlmYXQxNl90b3djaGFyKHVuaWNvZGUgKyBvZmZzZXQsIGRzLT5uYW1lMF80LCA1KTsKKwkJCQlmYXQxNl90b3djaGFyKHVuaWNvZGUgKyBvZmZzZXQgKyA1LCBkcy0+bmFtZTVfMTAsIDYpOworCQkJCWZhdDE2X3Rvd2NoYXIodW5pY29kZSArIG9mZnNldCArIDExLCBkcy0+bmFtZTExXzEyLCAyKTsKKworCQkJCWlmIChkcy0+aWQgJiAweDQwKSB7CisJCQkJCXVuaWNvZGVbb2Zmc2V0ICsgMTNdID0gMDsKKwkJCQl9CisJCQkJaWYgKGZhdF9nZXRfZW50cnkoaW5vZGUsICZjcG9zLCAmYmgsICZkZSkgPCAwKQorCQkJCQlnb3RvIEVPRGlyOworCQkJCWlmIChzbG90ID09IDApCisJCQkJCWJyZWFrOworCQkJCWRzID0gKHN0cnVjdCBtc2Rvc19kaXJfc2xvdCAqKSBkZTsKKwkJCQlpZiAoZHMtPmF0dHIgIT0gIEFUVFJfRVhUKQorCQkJCQlnb3RvIHBhcnNlX3JlY29yZDsKKwkJCQlpZiAoKGRzLT5pZCAmIH4weDQwKSAhPSBzbG90KQorCQkJCQlnb3RvIHBhcnNlX2xvbmc7CisJCQkJaWYgKGRzLT5hbGlhc19jaGVja3N1bSAhPSBhbGlhc19jaGVja3N1bSkKKwkJCQkJZ290byBwYXJzZV9sb25nOworCQkJfQorCQkJaWYgKGRlLT5uYW1lWzBdID09IERFTEVURURfRkxBRykKKwkJCQljb250aW51ZTsKKwkJCWlmIChkZS0+YXR0ciA9PSAgQVRUUl9FWFQpCisJCQkJZ290byBwYXJzZV9sb25nOworCQkJaWYgKElTX0ZSRUUoZGUtPm5hbWUpIHx8IChkZS0+YXR0ciAmIEFUVFJfVk9MVU1FKSkKKwkJCQljb250aW51ZTsKKwkJCWZvciAoc3VtID0gMCwgaSA9IDA7IGkgPCAxMTsgaSsrKQorCQkJCXN1bSA9ICgoKHN1bSYxKTw8Nyl8KChzdW0mMHhmZSk+PjEpKSArIGRlLT5uYW1lW2ldOworCQkJaWYgKHN1bSAhPSBhbGlhc19jaGVja3N1bSkKKwkJCQlucl9zbG90cyA9IDA7CisJCX0KKworCQltZW1jcHkod29yaywgZGUtPm5hbWUsIHNpemVvZihkZS0+bmFtZSkpOworCQkvKiBzZWUgbmFtZWkuYywgbXNkb3NfZm9ybWF0X25hbWUgKi8KKwkJaWYgKHdvcmtbMF0gPT0gMHgwNSkKKwkJCXdvcmtbMF0gPSAweEU1OworCQlmb3IgKGkgPSAwLCBqID0gMCwgbGFzdF91ID0gMDsgaSA8IDg7KSB7CisJCQlpZiAoIXdvcmtbaV0pIGJyZWFrOworCQkJY2hsID0gZmF0X3Nob3J0bmFtZTJ1bmkobmxzX2Rpc2ssICZ3b3JrW2ldLCA4IC0gaSwKKwkJCQkJCSZidWZ1bmFtZVtqKytdLCBvcHRfc2hvcnRuYW1lLAorCQkJCQkJZGUtPmxjYXNlICYgQ0FTRV9MT1dFUl9CQVNFKTsKKwkJCWlmIChjaGwgPD0gMSkgeworCQkJCWlmICh3b3JrW2ldICE9ICcgJykKKwkJCQkJbGFzdF91ID0gajsKKwkJCX0gZWxzZSB7CisJCQkJbGFzdF91ID0gajsKKwkJCX0KKwkJCWkgKz0gY2hsOworCQl9CisJCWogPSBsYXN0X3U7CisJCWZhdF9zaG9ydDJ1bmkobmxzX2Rpc2ssICIuIiwgMSwgJmJ1ZnVuYW1lW2orK10pOworCQlmb3IgKGkgPSAwOyBpIDwgMzspIHsKKwkJCWlmICghZGUtPmV4dFtpXSkgYnJlYWs7CisJCQljaGwgPSBmYXRfc2hvcnRuYW1lMnVuaShubHNfZGlzaywgJmRlLT5leHRbaV0sIDMgLSBpLAorCQkJCQkJJmJ1ZnVuYW1lW2orK10sIG9wdF9zaG9ydG5hbWUsCisJCQkJCQlkZS0+bGNhc2UgJiBDQVNFX0xPV0VSX0VYVCk7CisJCQlpZiAoY2hsIDw9IDEpIHsKKwkJCQlpZiAoZGUtPmV4dFtpXSAhPSAnICcpCisJCQkJCWxhc3RfdSA9IGo7CisJCQl9IGVsc2UgeworCQkJCWxhc3RfdSA9IGo7CisJCQl9CisJCQlpICs9IGNobDsKKwkJfQorCQlpZiAoIWxhc3RfdSkKKwkJCWNvbnRpbnVlOworCisJCWJ1ZnVuYW1lW2xhc3RfdV0gPSAweDAwMDA7CisJCXhsYXRlX2xlbiA9IHV0ZjgKKwkJCT91dGY4X3djc3RvbWJzKGJ1Zm5hbWUsIGJ1ZnVuYW1lLCBzaXplb2YoYnVmbmFtZSkpCisJCQk6dW5pMTZfdG9feDgoYnVmbmFtZSwgYnVmdW5hbWUsIHVuaV94bGF0ZSwgbmxzX2lvKTsKKwkJaWYgKHhsYXRlX2xlbiA9PSBuYW1lX2xlbikKKwkJCWlmICgoIWFueWNhc2UgJiYgIW1lbWNtcChuYW1lLCBidWZuYW1lLCB4bGF0ZV9sZW4pKSB8fAorCQkJICAgIChhbnljYXNlICYmICFubHNfc3RybmljbXAobmxzX2lvLCBuYW1lLCBidWZuYW1lLAorCQkJCQkJCQl4bGF0ZV9sZW4pKSkKKwkJCQlnb3RvIEZvdW5kOworCisJCWlmIChucl9zbG90cykgeworCQkJeGxhdGVfbGVuID0gdXRmOAorCQkJCT91dGY4X3djc3RvbWJzKGJ1Zm5hbWUsIHVuaWNvZGUsIHNpemVvZihidWZuYW1lKSkKKwkJCQk6dW5pMTZfdG9feDgoYnVmbmFtZSwgdW5pY29kZSwgdW5pX3hsYXRlLCBubHNfaW8pOworCQkJaWYgKHhsYXRlX2xlbiAhPSBuYW1lX2xlbikKKwkJCQljb250aW51ZTsKKwkJCWlmICgoIWFueWNhc2UgJiYgIW1lbWNtcChuYW1lLCBidWZuYW1lLCB4bGF0ZV9sZW4pKSB8fAorCQkJICAgIChhbnljYXNlICYmICFubHNfc3RybmljbXAobmxzX2lvLCBuYW1lLCBidWZuYW1lLAorCQkJCQkJCQl4bGF0ZV9sZW4pKSkKKwkJCQlnb3RvIEZvdW5kOworCQl9CisJfQorCitGb3VuZDoKKwlucl9zbG90cysrOwkvKiBpbmNsdWRlIHRoZSBkZSAqLworCXNpbmZvLT5zbG90X29mZiA9IGNwb3MgLSBucl9zbG90cyAqIHNpemVvZigqZGUpOworCXNpbmZvLT5ucl9zbG90cyA9IG5yX3Nsb3RzOworCXNpbmZvLT5kZSA9IGRlOworCXNpbmZvLT5iaCA9IGJoOworCXNpbmZvLT5pX3BvcyA9IGZhdF9tYWtlX2lfcG9zKHNiLCBzaW5mby0+YmgsIHNpbmZvLT5kZSk7CisJZXJyID0gMDsKK0VPRGlyOgorCWlmICh1bmljb2RlKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdW5pY29kZSk7CisKKwlyZXR1cm4gZXJyOworfQorCitFWFBPUlRfU1lNQk9MKGZhdF9zZWFyY2hfbG9uZyk7CisKK3N0cnVjdCBmYXRfaW9jdGxfZmlsbGRpcl9jYWxsYmFjayB7CisJc3RydWN0IGRpcmVudCBfX3VzZXIgKmRpcmVudDsKKwlpbnQgcmVzdWx0OworCS8qIGZvciBkaXIgaW9jdGwgKi8KKwljb25zdCBjaGFyICpsb25nbmFtZTsKKwlpbnQgbG9uZ19sZW47CisJY29uc3QgY2hhciAqc2hvcnRuYW1lOworCWludCBzaG9ydF9sZW47Cit9OworCitzdGF0aWMgaW50IGZhdF9yZWFkZGlyeChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LAorCQkJZmlsbGRpcl90IGZpbGxkaXIsIGludCBzaG9ydF9vbmx5LCBpbnQgYm90aCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKmRlOworCXN0cnVjdCBubHNfdGFibGUgKm5sc19pbyA9IHNiaS0+bmxzX2lvOworCXN0cnVjdCBubHNfdGFibGUgKm5sc19kaXNrID0gc2JpLT5ubHNfZGlzazsKKwl1bnNpZ25lZCBjaGFyIGxvbmdfc2xvdHM7CisJY29uc3QgY2hhciAqZmlsbF9uYW1lOworCWludCBmaWxsX2xlbjsKKwl3Y2hhcl90IGJ1ZnVuYW1lWzE0XTsKKwl3Y2hhcl90ICp1bmljb2RlID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyIGMsIHdvcmtbOF0sIGJ1Zm5hbWVbNTZdLCAqcHRuYW1lID0gYnVmbmFtZTsKKwl1bnNpZ25lZCBsb25nIGxwb3MsIGR1bW15LCAqZnVycmZ1ID0gJmxwb3M7CisJaW50IHVuaV94bGF0ZSA9IHNiaS0+b3B0aW9ucy51bmljb2RlX3hsYXRlOworCWludCBpc3ZmYXQgPSBzYmktPm9wdGlvbnMuaXN2ZmF0OworCWludCB1dGY4ID0gc2JpLT5vcHRpb25zLnV0Zjg7CisJaW50IG5vY2FzZSA9IHNiaS0+b3B0aW9ucy5ub2Nhc2U7CisJdW5zaWduZWQgc2hvcnQgb3B0X3Nob3J0bmFtZSA9IHNiaS0+b3B0aW9ucy5zaG9ydG5hbWU7CisJdW5zaWduZWQgbG9uZyBpbnVtOworCWludCBjaGksIGNobCwgaSwgaTIsIGosIGxhc3QsIGxhc3RfdSwgZG90b2Zmc2V0ID0gMDsKKwlsb2ZmX3QgY3BvczsKKwlpbnQgcmV0ID0gMDsKKworCWxvY2tfa2VybmVsKCk7CisKKwljcG9zID0gZmlscC0+Zl9wb3M7CisJLyogRmFrZSAuIGFuZCAuLiBmb3IgdGhlIHJvb3QgZGlyZWN0b3J5LiAqLworCWlmIChpbm9kZS0+aV9pbm8gPT0gTVNET1NfUk9PVF9JTk8pIHsKKwkJd2hpbGUgKGNwb3MgPCAyKSB7CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIGNwb3MrMSwgY3BvcywgTVNET1NfUk9PVF9JTk8sIERUX0RJUikgPCAwKQorCQkJCWdvdG8gb3V0OworCQkJY3BvcysrOworCQkJZmlscC0+Zl9wb3MrKzsKKwkJfQorCQlpZiAoY3BvcyA9PSAyKSB7CisJCQlkdW1teSA9IDI7CisJCQlmdXJyZnUgPSAmZHVtbXk7CisJCQljcG9zID0gMDsKKwkJfQorCX0KKwlpZiAoY3BvcyAmIChzaXplb2Yoc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSktMSkpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJYmggPSBOVUxMOworR2V0TmV3OgorCWxvbmdfc2xvdHMgPSAwOworCWlmIChmYXRfZ2V0X2VudHJ5KGlub2RlLCAmY3BvcywgJmJoLCAmZGUpID09IC0xKQorCQlnb3RvIEVPRGlyOworCS8qIENoZWNrIGZvciBsb25nIGZpbGVuYW1lIGVudHJ5ICovCisJaWYgKGlzdmZhdCkgeworCQlpZiAoZGUtPm5hbWVbMF0gPT0gREVMRVRFRF9GTEFHKQorCQkJZ290byBSZWNFbmQ7CisJCWlmIChkZS0+YXR0ciAhPSBBVFRSX0VYVCAmJiAoZGUtPmF0dHIgJiBBVFRSX1ZPTFVNRSkpCisJCQlnb3RvIFJlY0VuZDsKKwkJaWYgKGRlLT5hdHRyICE9IEFUVFJfRVhUICYmIElTX0ZSRUUoZGUtPm5hbWUpKQorCQkJZ290byBSZWNFbmQ7CisJfSBlbHNlIHsKKwkJaWYgKChkZS0+YXR0ciAmIEFUVFJfVk9MVU1FKSB8fCBJU19GUkVFKGRlLT5uYW1lKSkKKwkJCWdvdG8gUmVjRW5kOworCX0KKworCWlmIChpc3ZmYXQgJiYgZGUtPmF0dHIgPT0gQVRUUl9FWFQpIHsKKwkJc3RydWN0IG1zZG9zX2Rpcl9zbG90ICpkczsKKwkJdW5zaWduZWQgY2hhciBpZDsKKwkJdW5zaWduZWQgY2hhciBzbG90OworCQl1bnNpZ25lZCBjaGFyIHNsb3RzOworCQl1bnNpZ25lZCBjaGFyIHN1bTsKKwkJdW5zaWduZWQgY2hhciBhbGlhc19jaGVja3N1bTsKKworCQlpZiAoIXVuaWNvZGUpIHsKKwkJCXVuaWNvZGUgPSAod2NoYXJfdCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwkJCWlmICghdW5pY29kZSkgeworCQkJCWZpbHAtPmZfcG9zID0gY3BvczsKKwkJCQlicmVsc2UoYmgpOworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KK1BhcnNlTG9uZzoKKwkJc2xvdHMgPSAwOworCQlkcyA9IChzdHJ1Y3QgbXNkb3NfZGlyX3Nsb3QgKikgZGU7CisJCWlkID0gZHMtPmlkOworCQlpZiAoIShpZCAmIDB4NDApKQorCQkJZ290byBSZWNFbmQ7CisJCXNsb3RzID0gaWQgJiB+MHg0MDsKKwkJaWYgKHNsb3RzID4gMjAgfHwgIXNsb3RzKQkvKiBjZWlsKDI1NiAqIDIgLyAyNikgKi8KKwkJCWdvdG8gUmVjRW5kOworCQlsb25nX3Nsb3RzID0gc2xvdHM7CisJCWFsaWFzX2NoZWNrc3VtID0gZHMtPmFsaWFzX2NoZWNrc3VtOworCisJCXNsb3QgPSBzbG90czsKKwkJd2hpbGUgKDEpIHsKKwkJCWludCBvZmZzZXQ7CisKKwkJCXNsb3QtLTsKKwkJCW9mZnNldCA9IHNsb3QgKiAxMzsKKwkJCWZhdDE2X3Rvd2NoYXIodW5pY29kZSArIG9mZnNldCwgZHMtPm5hbWUwXzQsIDUpOworCQkJZmF0MTZfdG93Y2hhcih1bmljb2RlICsgb2Zmc2V0ICsgNSwgZHMtPm5hbWU1XzEwLCA2KTsKKwkJCWZhdDE2X3Rvd2NoYXIodW5pY29kZSArIG9mZnNldCArIDExLCBkcy0+bmFtZTExXzEyLCAyKTsKKworCQkJaWYgKGRzLT5pZCAmIDB4NDApIHsKKwkJCQl1bmljb2RlW29mZnNldCArIDEzXSA9IDA7CisJCQl9CisJCQlpZiAoZmF0X2dldF9lbnRyeShpbm9kZSwgJmNwb3MsICZiaCwgJmRlKSA9PSAtMSkKKwkJCQlnb3RvIEVPRGlyOworCQkJaWYgKHNsb3QgPT0gMCkKKwkJCQlicmVhazsKKwkJCWRzID0gKHN0cnVjdCBtc2Rvc19kaXJfc2xvdCAqKSBkZTsKKwkJCWlmIChkcy0+YXR0ciAhPSAgQVRUUl9FWFQpCisJCQkJZ290byBSZWNFbmQ7CS8qIFhYWCAqLworCQkJaWYgKChkcy0+aWQgJiB+MHg0MCkgIT0gc2xvdCkKKwkJCQlnb3RvIFBhcnNlTG9uZzsKKwkJCWlmIChkcy0+YWxpYXNfY2hlY2tzdW0gIT0gYWxpYXNfY2hlY2tzdW0pCisJCQkJZ290byBQYXJzZUxvbmc7CisJCX0KKwkJaWYgKGRlLT5uYW1lWzBdID09IERFTEVURURfRkxBRykKKwkJCWdvdG8gUmVjRW5kOworCQlpZiAoZGUtPmF0dHIgPT0gIEFUVFJfRVhUKQorCQkJZ290byBQYXJzZUxvbmc7CisJCWlmIChJU19GUkVFKGRlLT5uYW1lKSB8fCAoZGUtPmF0dHIgJiBBVFRSX1ZPTFVNRSkpCisJCQlnb3RvIFJlY0VuZDsKKwkJZm9yIChzdW0gPSAwLCBpID0gMDsgaSA8IDExOyBpKyspCisJCQlzdW0gPSAoKChzdW0mMSk8PDcpfCgoc3VtJjB4ZmUpPj4xKSkgKyBkZS0+bmFtZVtpXTsKKwkJaWYgKHN1bSAhPSBhbGlhc19jaGVja3N1bSkKKwkJCWxvbmdfc2xvdHMgPSAwOworCX0KKworCWlmIChzYmktPm9wdGlvbnMuZG90c09LKSB7CisJCXB0bmFtZSA9IGJ1Zm5hbWU7CisJCWRvdG9mZnNldCA9IDA7CisJCWlmIChkZS0+YXR0ciAmIEFUVFJfSElEREVOKSB7CisJCQkqcHRuYW1lKysgPSAnLic7CisJCQlkb3RvZmZzZXQgPSAxOworCQl9CisJfQorCisJbWVtY3B5KHdvcmssIGRlLT5uYW1lLCBzaXplb2YoZGUtPm5hbWUpKTsKKwkvKiBzZWUgbmFtZWkuYywgbXNkb3NfZm9ybWF0X25hbWUgKi8KKwlpZiAod29ya1swXSA9PSAweDA1KQorCQl3b3JrWzBdID0gMHhFNTsKKwlmb3IgKGkgPSAwLCBqID0gMCwgbGFzdCA9IDAsIGxhc3RfdSA9IDA7IGkgPCA4OykgeworCQlpZiAoIShjID0gd29ya1tpXSkpIGJyZWFrOworCQljaGwgPSBmYXRfc2hvcnRuYW1lMnVuaShubHNfZGlzaywgJndvcmtbaV0sIDggLSBpLAorCQkJCQkmYnVmdW5hbWVbaisrXSwgb3B0X3Nob3J0bmFtZSwKKwkJCQkJZGUtPmxjYXNlICYgQ0FTRV9MT1dFUl9CQVNFKTsKKwkJaWYgKGNobCA8PSAxKSB7CisJCQlwdG5hbWVbaSsrXSA9ICghbm9jYXNlICYmIGM+PSdBJyAmJiBjPD0nWicpID8gYyszMiA6IGM7CisJCQlpZiAoYyAhPSAnICcpIHsKKwkJCQlsYXN0ID0gaTsKKwkJCQlsYXN0X3UgPSBqOworCQkJfQorCQl9IGVsc2UgeworCQkJbGFzdF91ID0gajsKKwkJCWZvciAoY2hpID0gMDsgY2hpIDwgY2hsICYmIGkgPCA4OyBjaGkrKykgeworCQkJCXB0bmFtZVtpXSA9IHdvcmtbaV07CisJCQkJaSsrOyBsYXN0ID0gaTsKKwkJCX0KKwkJfQorCX0KKwlpID0gbGFzdDsKKwlqID0gbGFzdF91OworCWZhdF9zaG9ydDJ1bmkobmxzX2Rpc2ssICIuIiwgMSwgJmJ1ZnVuYW1lW2orK10pOworCXB0bmFtZVtpKytdID0gJy4nOworCWZvciAoaTIgPSAwOyBpMiA8IDM7KSB7CisJCWlmICghKGMgPSBkZS0+ZXh0W2kyXSkpIGJyZWFrOworCQljaGwgPSBmYXRfc2hvcnRuYW1lMnVuaShubHNfZGlzaywgJmRlLT5leHRbaTJdLCAzIC0gaTIsCisJCQkJCSZidWZ1bmFtZVtqKytdLCBvcHRfc2hvcnRuYW1lLAorCQkJCQlkZS0+bGNhc2UgJiBDQVNFX0xPV0VSX0VYVCk7CisJCWlmIChjaGwgPD0gMSkgeworCQkJaTIrKzsKKwkJCXB0bmFtZVtpKytdID0gKCFub2Nhc2UgJiYgYz49J0EnICYmIGM8PSdaJykgPyBjKzMyIDogYzsKKwkJCWlmIChjICE9ICcgJykgeworCQkJCWxhc3QgPSBpOworCQkJCWxhc3RfdSA9IGo7CisJCQl9CisJCX0gZWxzZSB7CisJCQlsYXN0X3UgPSBqOworCQkJZm9yIChjaGkgPSAwOyBjaGkgPCBjaGwgJiYgaTIgPCAzOyBjaGkrKykgeworCQkJCXB0bmFtZVtpKytdID0gZGUtPmV4dFtpMisrXTsKKwkJCQlsYXN0ID0gaTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIWxhc3QpCisJCWdvdG8gUmVjRW5kOworCisJaSA9IGxhc3QgKyBkb3RvZmZzZXQ7CisJaiA9IGxhc3RfdTsKKworCWxwb3MgPSBjcG9zIC0gKGxvbmdfc2xvdHMrMSkqc2l6ZW9mKHN0cnVjdCBtc2Rvc19kaXJfZW50cnkpOworCWlmICghbWVtY21wKGRlLT5uYW1lLCBNU0RPU19ET1QsIE1TRE9TX05BTUUpKQorCQlpbnVtID0gaW5vZGUtPmlfaW5vOworCWVsc2UgaWYgKCFtZW1jbXAoZGUtPm5hbWUsIE1TRE9TX0RPVERPVCwgTVNET1NfTkFNRSkpIHsKKwkJaW51bSA9IHBhcmVudF9pbm8oZmlscC0+Zl9kZW50cnkpOworCX0gZWxzZSB7CisJCWxvZmZfdCBpX3BvcyA9IGZhdF9tYWtlX2lfcG9zKHNiLCBiaCwgZGUpOworCQlzdHJ1Y3QgaW5vZGUgKnRtcCA9IGZhdF9pZ2V0KHNiLCBpX3Bvcyk7CisJCWlmICh0bXApIHsKKwkJCWludW0gPSB0bXAtPmlfaW5vOworCQkJaXB1dCh0bXApOworCQl9IGVsc2UKKwkJCWludW0gPSBpdW5pcXVlKHNiLCBNU0RPU19ST09UX0lOTyk7CisJfQorCisJaWYgKGlzdmZhdCkgeworCQlidWZ1bmFtZVtqXSA9IDB4MDAwMDsKKwkJaSA9IHV0ZjggPyB1dGY4X3djc3RvbWJzKGJ1Zm5hbWUsIGJ1ZnVuYW1lLCBzaXplb2YoYnVmbmFtZSkpCisJCQkgOiB1bmkxNl90b194OChidWZuYW1lLCBidWZ1bmFtZSwgdW5pX3hsYXRlLCBubHNfaW8pOworCX0KKworCWZpbGxfbmFtZSA9IGJ1Zm5hbWU7CisJZmlsbF9sZW4gPSBpOworCWlmICghc2hvcnRfb25seSAmJiBsb25nX3Nsb3RzKSB7CisJCS8qIGNvbnZlcnQgdGhlIHVuaWNvZGUgbG9uZyBuYW1lLiAyNjEgaXMgbWF4aW11bSBzaXplCisJCSAqIG9mIHVuaWNvZGUgYnVmZmVyLiAoMTMgKiBzbG90cyArIG51bCkgKi8KKwkJdm9pZCAqbG9uZ25hbWUgPSB1bmljb2RlICsgMjYxOworCQlpbnQgYnVmX3NpemUgPSBQQUdFX1NJWkUgLSAoMjYxICogc2l6ZW9mKHVuaWNvZGVbMF0pKTsKKwkJaW50IGxvbmdfbGVuID0gdXRmOAorCQkJPyB1dGY4X3djc3RvbWJzKGxvbmduYW1lLCB1bmljb2RlLCBidWZfc2l6ZSkKKwkJCTogdW5pMTZfdG9feDgobG9uZ25hbWUsIHVuaWNvZGUsIHVuaV94bGF0ZSwgbmxzX2lvKTsKKworCQlpZiAoIWJvdGgpIHsKKwkJCWZpbGxfbmFtZSA9IGxvbmduYW1lOworCQkJZmlsbF9sZW4gPSBsb25nX2xlbjsKKwkJfSBlbHNlIHsKKwkJCS8qIGhhY2sgZm9yIGZhdF9pb2N0bF9maWxsZGlyKCkgKi8KKwkJCXN0cnVjdCBmYXRfaW9jdGxfZmlsbGRpcl9jYWxsYmFjayAqcCA9IGRpcmVudDsKKworCQkJcC0+bG9uZ25hbWUgPSBsb25nbmFtZTsKKwkJCXAtPmxvbmdfbGVuID0gbG9uZ19sZW47CisJCQlwLT5zaG9ydG5hbWUgPSBidWZuYW1lOworCQkJcC0+c2hvcnRfbGVuID0gaTsKKwkJCWZpbGxfbmFtZSA9IE5VTEw7CisJCQlmaWxsX2xlbiA9IDA7CisJCX0KKwl9CisJaWYgKGZpbGxkaXIoZGlyZW50LCBmaWxsX25hbWUsIGZpbGxfbGVuLCAqZnVycmZ1LCBpbnVtLAorCQkgICAgKGRlLT5hdHRyICYgQVRUUl9ESVIpID8gRFRfRElSIDogRFRfUkVHKSA8IDApCisJCWdvdG8gRmlsbEZhaWxlZDsKKworUmVjRW5kOgorCWZ1cnJmdSA9ICZscG9zOworCWZpbHAtPmZfcG9zID0gY3BvczsKKwlnb3RvIEdldE5ldzsKK0VPRGlyOgorCWZpbHAtPmZfcG9zID0gY3BvczsKK0ZpbGxGYWlsZWQ6CisJaWYgKGJoKQorCQlicmVsc2UoYmgpOworCWlmICh1bmljb2RlKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdW5pY29kZSk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmF0X3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXJldHVybiBmYXRfcmVhZGRpcngoaW5vZGUsIGZpbHAsIGRpcmVudCwgZmlsbGRpciwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgZmF0X2lvY3RsX2ZpbGxkaXIodm9pZCAqX19idWYsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lX2xlbiwKKwkJCSAgICAgbG9mZl90IG9mZnNldCwgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQoreworCXN0cnVjdCBmYXRfaW9jdGxfZmlsbGRpcl9jYWxsYmFjayAqYnVmID0gX19idWY7CisJc3RydWN0IGRpcmVudCBfX3VzZXIgKmQxID0gYnVmLT5kaXJlbnQ7CisJc3RydWN0IGRpcmVudCBfX3VzZXIgKmQyID0gZDEgKyAxOworCisJaWYgKGJ1Zi0+cmVzdWx0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlidWYtPnJlc3VsdCsrOworCisJaWYgKG5hbWUgIT0gTlVMTCkgeworCQkvKiBkaXJlbnQgaGFzIG9ubHkgc2hvcnQgbmFtZSAqLworCQlpZiAobmFtZV9sZW4gPj0gc2l6ZW9mKGQxLT5kX25hbWUpKQorCQkJbmFtZV9sZW4gPSBzaXplb2YoZDEtPmRfbmFtZSkgLSAxOworCisJCWlmIChwdXRfdXNlcigwLCBkMi0+ZF9uYW1lKQkJCXx8CisJCSAgICBwdXRfdXNlcigwLCAmZDItPmRfcmVjbGVuKQkJCXx8CisJCSAgICBjb3B5X3RvX3VzZXIoZDEtPmRfbmFtZSwgbmFtZSwgbmFtZV9sZW4pCXx8CisJCSAgICBwdXRfdXNlcigwLCBkMS0+ZF9uYW1lICsgbmFtZV9sZW4pCQl8fAorCQkgICAgcHV0X3VzZXIobmFtZV9sZW4sICZkMS0+ZF9yZWNsZW4pKQorCQkJZ290byBlZmF1bHQ7CisJfSBlbHNlIHsKKwkJLyogZGlyZW50IGhhcyBzaG9ydCBhbmQgbG9uZyBuYW1lICovCisJCWNvbnN0IGNoYXIgKmxvbmduYW1lID0gYnVmLT5sb25nbmFtZTsKKwkJaW50IGxvbmdfbGVuID0gYnVmLT5sb25nX2xlbjsKKwkJY29uc3QgY2hhciAqc2hvcnRuYW1lID0gYnVmLT5zaG9ydG5hbWU7CisJCWludCBzaG9ydF9sZW4gPSBidWYtPnNob3J0X2xlbjsKKworCQlpZiAobG9uZ19sZW4gPj0gc2l6ZW9mKGQxLT5kX25hbWUpKQorCQkJbG9uZ19sZW4gPSBzaXplb2YoZDEtPmRfbmFtZSkgLSAxOworCQlpZiAoc2hvcnRfbGVuID49IHNpemVvZihkMS0+ZF9uYW1lKSkKKwkJCXNob3J0X2xlbiA9IHNpemVvZihkMS0+ZF9uYW1lKSAtIDE7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihkMi0+ZF9uYW1lLCBsb25nbmFtZSwgbG9uZ19sZW4pCXx8CisJCSAgICBwdXRfdXNlcigwLCBkMi0+ZF9uYW1lICsgbG9uZ19sZW4pCQkJfHwKKwkJICAgIHB1dF91c2VyKGxvbmdfbGVuLCAmZDItPmRfcmVjbGVuKQkJCXx8CisJCSAgICBwdXRfdXNlcihpbm8sICZkMi0+ZF9pbm8pCQkJCXx8CisJCSAgICBwdXRfdXNlcihvZmZzZXQsICZkMi0+ZF9vZmYpCQkJfHwKKwkJICAgIGNvcHlfdG9fdXNlcihkMS0+ZF9uYW1lLCBzaG9ydG5hbWUsIHNob3J0X2xlbikJfHwKKwkJICAgIHB1dF91c2VyKDAsIGQxLT5kX25hbWUgKyBzaG9ydF9sZW4pCQkJfHwKKwkJICAgIHB1dF91c2VyKHNob3J0X2xlbiwgJmQxLT5kX3JlY2xlbikpCisJCQlnb3RvIGVmYXVsdDsKKwl9CisJcmV0dXJuIDA7CitlZmF1bHQ6CisJYnVmLT5yZXN1bHQgPSAtRUZBVUxUOworCXJldHVybiAtRUZBVUxUOworfQorCitzdGF0aWMgaW50IGZhdF9kaXJfaW9jdGwoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCwKKwkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZmF0X2lvY3RsX2ZpbGxkaXJfY2FsbGJhY2sgYnVmOworCXN0cnVjdCBkaXJlbnQgX191c2VyICpkMTsKKwlpbnQgcmV0LCBzaG9ydF9vbmx5LCBib3RoOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFZGQVRfSU9DVExfUkVBRERJUl9TSE9SVDoKKwkJc2hvcnRfb25seSA9IDE7CisJCWJvdGggPSAwOworCQlicmVhazsKKwljYXNlIFZGQVRfSU9DVExfUkVBRERJUl9CT1RIOgorCQlzaG9ydF9vbmx5ID0gMDsKKwkJYm90aCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBmYXRfZ2VuZXJpY19pb2N0bChpbm9kZSwgZmlscCwgY21kLCBhcmcpOworCX0KKworCWQxID0gKHN0cnVjdCBkaXJlbnQgX191c2VyICopYXJnOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZDEsIHNpemVvZihzdHJ1Y3QgZGlyZW50WzJdKSkpCisJCXJldHVybiAtRUZBVUxUOworCS8qCisJICogWWVzLCB3ZSBkb24ndCBuZWVkIHRoaXMgcHV0X3VzZXIoKSBhYnNvbHV0ZWx5LiBIb3dldmVyIG9sZAorCSAqIGNvZGUgZGlkbid0IHJldHVybiB0aGUgcmlnaHQgdmFsdWUuIFNvLCBhcHAgdXNlIHRoaXMgdmFsdWUsCisJICogaW4gb3JkZXIgdG8gY2hlY2sgd2hldGhlciBpdCBpcyBFT0YuCisJICovCisJaWYgKHB1dF91c2VyKDAsICZkMS0+ZF9yZWNsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWJ1Zi5kaXJlbnQgPSBkMTsKKwlidWYucmVzdWx0ID0gMDsKKwlkb3duKCZpbm9kZS0+aV9zZW0pOworCXJldCA9IC1FTk9FTlQ7CisJaWYgKCFJU19ERUFERElSKGlub2RlKSkgeworCQlyZXQgPSBmYXRfcmVhZGRpcngoaW5vZGUsIGZpbHAsICZidWYsIGZhdF9pb2N0bF9maWxsZGlyLAorCQkJCSAgIHNob3J0X29ubHksIGJvdGgpOworCX0KKwl1cCgmaW5vZGUtPmlfc2VtKTsKKwlpZiAocmV0ID49IDApCisJCXJldCA9IGJ1Zi5yZXN1bHQ7CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmYXRfZGlyX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IGZhdF9yZWFkZGlyLAorCS5pb2N0bAkJPSBmYXRfZGlyX2lvY3RsLAorCS5mc3luYwkJPSBmaWxlX2ZzeW5jLAorfTsKKworc3RhdGljIGludCBmYXRfZ2V0X3Nob3J0X2VudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLCBsb2ZmX3QgKnBvcywKKwkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCwKKwkJCSAgICAgICBzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICoqZGUpCit7CisJd2hpbGUgKGZhdF9nZXRfZW50cnkoZGlyLCBwb3MsIGJoLCBkZSkgPj0gMCkgeworCQkvKiBmcmVlIGVudHJ5IG9yIGxvbmcgbmFtZSBlbnRyeSBvciB2b2x1bWUgbGFiZWwgKi8KKwkJaWYgKCFJU19GUkVFKCgqZGUpLT5uYW1lKSAmJiAhKCgqZGUpLT5hdHRyICYgQVRUUl9WT0xVTUUpKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PRU5UOworfQorCisvKgorICogVGhlICIuLiIgZW50cnkgY2FuIG5vdCBwcm92aWRlIHRoZSAic3RydWN0IGZhdF9zbG90X2luZm8iIGluZm9ybWF0aW9ucworICogZm9yIGlub2RlLiBTbywgdGhpcyBmdW5jdGlvbiBwcm92aWRlIHRoZSBzb21lIGluZm9ybWF0aW9ucyBvbmx5LgorICovCitpbnQgZmF0X2dldF9kb3Rkb3RfZW50cnkoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLAorCQkJIHN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKipkZSwgbG9mZl90ICppX3BvcykKK3sKKwlsb2ZmX3Qgb2Zmc2V0OworCisJb2Zmc2V0ID0gMDsKKwkqYmggPSBOVUxMOworCXdoaWxlIChmYXRfZ2V0X3Nob3J0X2VudHJ5KGRpciwgJm9mZnNldCwgYmgsIGRlKSA+PSAwKSB7CisJCWlmICghc3RybmNtcCgoKmRlKS0+bmFtZSwgTVNET1NfRE9URE9ULCBNU0RPU19OQU1FKSkgeworCQkJKmlfcG9zID0gZmF0X21ha2VfaV9wb3MoZGlyLT5pX3NiLCAqYmgsICpkZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KKworRVhQT1JUX1NZTUJPTChmYXRfZ2V0X2RvdGRvdF9lbnRyeSk7CisKKy8qIFNlZSBpZiBkaXJlY3RvcnkgaXMgZW1wdHkgKi8KK2ludCBmYXRfZGlyX2VtcHR5KHN0cnVjdCBpbm9kZSAqZGlyKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqZGU7CisJbG9mZl90IGNwb3M7CisJaW50IHJlc3VsdCA9IDA7CisKKwliaCA9IE5VTEw7CisJY3BvcyA9IDA7CisJd2hpbGUgKGZhdF9nZXRfc2hvcnRfZW50cnkoZGlyLCAmY3BvcywgJmJoLCAmZGUpID49IDApIHsKKwkJaWYgKHN0cm5jbXAoZGUtPm5hbWUsIE1TRE9TX0RPVCAgICwgTVNET1NfTkFNRSkgJiYKKwkJICAgIHN0cm5jbXAoZGUtPm5hbWUsIE1TRE9TX0RPVERPVCwgTVNET1NfTkFNRSkpIHsKKwkJCXJlc3VsdCA9IC1FTk9URU1QVFk7CisJCQlicmVhazsKKwkJfQorCX0KKwlicmVsc2UoYmgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK0VYUE9SVF9TWU1CT0woZmF0X2Rpcl9lbXB0eSk7CisKKy8qCisgKiBmYXRfc3ViZGlycyBjb3VudHMgdGhlIG51bWJlciBvZiBzdWItZGlyZWN0b3JpZXMgb2YgZGlyLiBJdCBjYW4gYmUgcnVuCisgKiBvbiBkaXJlY3RvcmllcyBiZWluZyBjcmVhdGVkLgorICovCitpbnQgZmF0X3N1YmRpcnMoc3RydWN0IGlub2RlICpkaXIpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICpkZTsKKwlsb2ZmX3QgY3BvczsKKwlpbnQgY291bnQgPSAwOworCisJYmggPSBOVUxMOworCWNwb3MgPSAwOworCXdoaWxlIChmYXRfZ2V0X3Nob3J0X2VudHJ5KGRpciwgJmNwb3MsICZiaCwgJmRlKSA+PSAwKSB7CisJCWlmIChkZS0+YXR0ciAmIEFUVFJfRElSKQorCQkJY291bnQrKzsKKwl9CisJYnJlbHNlKGJoKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBTY2FucyBhIGRpcmVjdG9yeSBmb3IgYSBnaXZlbiBmaWxlIChuYW1lIHBvaW50cyB0byBpdHMgZm9ybWF0dGVkIG5hbWUpLgorICogUmV0dXJucyBhbiBlcnJvciBjb2RlIG9yIHplcm8uCisgKi8KK2ludCBmYXRfc2NhbihzdHJ1Y3QgaW5vZGUgKmRpciwgY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSwKKwkgICAgIHN0cnVjdCBmYXRfc2xvdF9pbmZvICpzaW5mbykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCisJc2luZm8tPnNsb3Rfb2ZmID0gMDsKKwlzaW5mby0+YmggPSBOVUxMOworCXdoaWxlIChmYXRfZ2V0X3Nob3J0X2VudHJ5KGRpciwgJnNpbmZvLT5zbG90X29mZiwgJnNpbmZvLT5iaCwKKwkJCQkgICAmc2luZm8tPmRlKSA+PSAwKSB7CisJCWlmICghc3RybmNtcChzaW5mby0+ZGUtPm5hbWUsIG5hbWUsIE1TRE9TX05BTUUpKSB7CisJCQlzaW5mby0+c2xvdF9vZmYgLT0gc2l6ZW9mKCpzaW5mby0+ZGUpOworCQkJc2luZm8tPm5yX3Nsb3RzID0gMTsKKwkJCXNpbmZvLT5pX3BvcyA9IGZhdF9tYWtlX2lfcG9zKHNiLCBzaW5mby0+YmgsIHNpbmZvLT5kZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KKworRVhQT1JUX1NZTUJPTChmYXRfc2Nhbik7CisKK3N0YXRpYyBpbnQgX19mYXRfcmVtb3ZlX2VudHJpZXMoc3RydWN0IGlub2RlICpkaXIsIGxvZmZfdCBwb3MsIGludCBucl9zbG90cykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqZGUsICplbmRwOworCWludCBlcnIgPSAwLCBvcmlnX3Nsb3RzOworCisJd2hpbGUgKG5yX3Nsb3RzKSB7CisJCWJoID0gTlVMTDsKKwkJaWYgKGZhdF9nZXRfZW50cnkoZGlyLCAmcG9zLCAmYmgsICZkZSkgPCAwKSB7CisJCQllcnIgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKworCQlvcmlnX3Nsb3RzID0gbnJfc2xvdHM7CisJCWVuZHAgPSAoc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqKShiaC0+Yl9kYXRhICsgc2ItPnNfYmxvY2tzaXplKTsKKwkJd2hpbGUgKG5yX3Nsb3RzICYmIGRlIDwgZW5kcCkgeworCQkJZGUtPm5hbWVbMF0gPSBERUxFVEVEX0ZMQUc7CisJCQlkZSsrOworCQkJbnJfc2xvdHMtLTsKKwkJfQorCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCWlmIChJU19ESVJTWU5DKGRpcikpCisJCQllcnIgPSBzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CisJCWJyZWxzZShiaCk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKworCQkvKiBwb3MgaXMgKm5leHQqIGRlJ3MgcG9zaXRpb24sIHNvIHRoaXMgZG9lcyBgLSBzaXplb2YoZGUpJyAqLworCQlwb3MgKz0gKChvcmlnX3Nsb3RzIC0gbnJfc2xvdHMpICogc2l6ZW9mKCpkZSkpIC0gc2l6ZW9mKCpkZSk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworaW50IGZhdF9yZW1vdmVfZW50cmllcyhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGZhdF9zbG90X2luZm8gKnNpbmZvKQoreworCXN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKmRlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IGVyciA9IDAsIG5yX3Nsb3RzOworCisJLyoKKwkgKiBGaXJzdCBzdGFnZTogUmVtb3ZlIHRoZSBzaG9ydG5hbWUuIEJ5IHRoaXMsIHRoZSBkaXJlY3RvcnkKKwkgKiBlbnRyeSBpcyByZW1vdmVkLgorCSAqLworCW5yX3Nsb3RzID0gc2luZm8tPm5yX3Nsb3RzOworCWRlID0gc2luZm8tPmRlOworCXNpbmZvLT5kZSA9IE5VTEw7CisJYmggPSBzaW5mby0+Ymg7CisJc2luZm8tPmJoID0gTlVMTDsKKwl3aGlsZSAobnJfc2xvdHMgJiYgZGUgPj0gKHN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKiliaC0+Yl9kYXRhKSB7CisJCWRlLT5uYW1lWzBdID0gREVMRVRFRF9GTEFHOworCQlkZS0tOworCQlucl9zbG90cy0tOworCX0KKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKElTX0RJUlNZTkMoZGlyKSkKKwkJZXJyID0gc3luY19kaXJ0eV9idWZmZXIoYmgpOworCWJyZWxzZShiaCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlkaXItPmlfdmVyc2lvbisrOworCisJaWYgKG5yX3Nsb3RzKSB7CisJCS8qCisJCSAqIFNlY29uZCBzdGFnZTogcmVtb3ZlIHRoZSByZW1haW5pbmcgbG9uZ25hbWUgc2xvdHMuCisJCSAqIChUaGlzIGRpcmVjdG9yeSBlbnRyeSBpcyBhbHJlYWR5IHJlbW92ZWQsIGFuZCBzbyByZXR1cm4KKwkJICogdGhlIHN1Y2Nlc3MpCisJCSAqLworCQllcnIgPSBfX2ZhdF9yZW1vdmVfZW50cmllcyhkaXIsIHNpbmZvLT5zbG90X29mZiwgbnJfc2xvdHMpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIkZBVDogQ291bGRuJ3QgcmVtb3ZlIHRoZSBsb25nIG5hbWUgc2xvdHNcbiIpOworCQl9CisJfQorCisJZGlyLT5pX210aW1lID0gZGlyLT5pX2F0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpZiAoSVNfRElSU1lOQyhkaXIpKQorCQkodm9pZClmYXRfc3luY19pbm9kZShkaXIpOworCWVsc2UKKwkJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woZmF0X3JlbW92ZV9lbnRyaWVzKTsKKworc3RhdGljIGludCBmYXRfemVyb2VkX2NsdXN0ZXIoc3RydWN0IGlub2RlICpkaXIsIHNlY3Rvcl90IGJsa25yLCBpbnQgbnJfdXNlZCwKKwkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocywgaW50IG5yX2JocykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXNlY3Rvcl90IGxhc3RfYmxrbnIgPSBibGtuciArIE1TRE9TX1NCKHNiKS0+c2VjX3Blcl9jbHVzOworCWludCBlcnIsIGksIG47CisKKwkvKiBaZXJvaW5nIHRoZSB1bnVzZWQgYmxvY2tzIG9uIHRoaXMgY2x1c3RlciAqLworCWJsa25yICs9IG5yX3VzZWQ7CisJbiA9IG5yX3VzZWQ7CisJd2hpbGUgKGJsa25yIDwgbGFzdF9ibGtucikgeworCQliaHNbbl0gPSBzYl9nZXRibGsoc2IsIGJsa25yKTsKKwkJaWYgKCFiaHNbbl0pIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yOworCQl9CisJCW1lbXNldChiaHNbbl0tPmJfZGF0YSwgMCwgc2ItPnNfYmxvY2tzaXplKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaHNbbl0pOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaHNbbl0pOworCisJCW4rKzsKKwkJYmxrbnIrKzsKKwkJaWYgKG4gPT0gbnJfYmhzKSB7CisJCQlpZiAoSVNfRElSU1lOQyhkaXIpKSB7CisJCQkJZXJyID0gZmF0X3N5bmNfYmhzKGJocywgbik7CisJCQkJaWYgKGVycikKKwkJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCQkJYnJlbHNlKGJoc1tpXSk7CisJCQluID0gMDsKKwkJfQorCX0KKwlpZiAoSVNfRElSU1lOQyhkaXIpKSB7CisJCWVyciA9IGZhdF9zeW5jX2JocyhiaHMsIG4pOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJvcjsKKwl9CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJYnJlbHNlKGJoc1tpXSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJYmZvcmdldChiaHNbaV0pOworCXJldHVybiBlcnI7Cit9CisKK2ludCBmYXRfYWxsb2NfbmV3X2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbTUFYX0JVRl9QRVJfUEFHRV07CisJc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqZGU7CisJc2VjdG9yX3QgYmxrbnI7CisJX19sZTE2IGRhdGUsIHRpbWU7CisJaW50IGVyciwgY2x1c3RlcjsKKworCWVyciA9IGZhdF9hbGxvY19jbHVzdGVycyhkaXIsICZjbHVzdGVyLCAxKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yOworCisJYmxrbnIgPSBmYXRfY2x1c190b19ibGtucihzYmksIGNsdXN0ZXIpOworCWJoc1swXSA9IHNiX2dldGJsayhzYiwgYmxrbnIpOworCWlmICghYmhzWzBdKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZTsKKwl9CisKKwlmYXRfZGF0ZV91bml4MmRvcyh0cy0+dHZfc2VjLCAmdGltZSwgJmRhdGUpOworCisJZGUgPSAoc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqKWJoc1swXS0+Yl9kYXRhOworCS8qIGZpbGxpbmcgdGhlIG5ldyBkaXJlY3Rvcnkgc2xvdHMgKCIuIiBhbmQgIi4uIiBlbnRyaWVzKSAqLworCW1lbWNweShkZVswXS5uYW1lLCBNU0RPU19ET1QsIE1TRE9TX05BTUUpOworCW1lbWNweShkZVsxXS5uYW1lLCBNU0RPU19ET1RET1QsIE1TRE9TX05BTUUpOworCWRlLT5hdHRyID0gZGVbMV0uYXR0ciA9IEFUVFJfRElSOworCWRlWzBdLmxjYXNlID0gZGVbMV0ubGNhc2UgPSAwOworCWRlWzBdLnRpbWUgPSBkZVsxXS50aW1lID0gdGltZTsKKwlkZVswXS5kYXRlID0gZGVbMV0uZGF0ZSA9IGRhdGU7CisJZGVbMF0uY3RpbWVfY3MgPSBkZVsxXS5jdGltZV9jcyA9IDA7CisJaWYgKHNiaS0+b3B0aW9ucy5pc3ZmYXQpIHsKKwkJLyogZXh0cmEgdGltZXN0YW1wcyAqLworCQlkZVswXS5jdGltZSA9IGRlWzFdLmN0aW1lID0gdGltZTsKKwkJZGVbMF0uYWRhdGUgPSBkZVswXS5jZGF0ZSA9IGRlWzFdLmFkYXRlID0gZGVbMV0uY2RhdGUgPSBkYXRlOworCX0gZWxzZSB7CisJCWRlWzBdLmN0aW1lID0gZGVbMV0uY3RpbWUgPSAwOworCQlkZVswXS5hZGF0ZSA9IGRlWzBdLmNkYXRlID0gZGVbMV0uYWRhdGUgPSBkZVsxXS5jZGF0ZSA9IDA7CisJfQorCWRlWzBdLnN0YXJ0ID0gY3B1X3RvX2xlMTYoY2x1c3Rlcik7CisJZGVbMF0uc3RhcnRoaSA9IGNwdV90b19sZTE2KGNsdXN0ZXIgPj4gMTYpOworCWRlWzFdLnN0YXJ0ID0gY3B1X3RvX2xlMTYoTVNET1NfSShkaXIpLT5pX2xvZ3N0YXJ0KTsKKwlkZVsxXS5zdGFydGhpID0gY3B1X3RvX2xlMTYoTVNET1NfSShkaXIpLT5pX2xvZ3N0YXJ0ID4+IDE2KTsKKwlkZVswXS5zaXplID0gZGVbMV0uc2l6ZSA9IDA7CisJbWVtc2V0KGRlICsgMiwgMCwgc2ItPnNfYmxvY2tzaXplIC0gMiAqIHNpemVvZigqZGUpKTsKKwlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoc1swXSk7CisJbWFya19idWZmZXJfZGlydHkoYmhzWzBdKTsKKworCWVyciA9IGZhdF96ZXJvZWRfY2x1c3RlcihkaXIsIGJsa25yLCAxLCBiaHMsIE1BWF9CVUZfUEVSX1BBR0UpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3JfZnJlZTsKKworCXJldHVybiBjbHVzdGVyOworCitlcnJvcl9mcmVlOgorCWZhdF9mcmVlX2NsdXN0ZXJzKGRpciwgY2x1c3Rlcik7CitlcnJvcjoKKwlyZXR1cm4gZXJyOworfQorCitFWFBPUlRfU1lNQk9MKGZhdF9hbGxvY19uZXdfZGlyKTsKKworc3RhdGljIGludCBmYXRfYWRkX25ld19lbnRyaWVzKHN0cnVjdCBpbm9kZSAqZGlyLCB2b2lkICpzbG90cywgaW50IG5yX3Nsb3RzLAorCQkJICAgICAgIGludCAqbnJfY2x1c3Rlciwgc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqKmRlLAorCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLCBsb2ZmX3QgKmlfcG9zKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tNQVhfQlVGX1BFUl9QQUdFXTsKKwlzZWN0b3JfdCBibGtuciwgc3RhcnRfYmxrbnIsIGxhc3RfYmxrbnI7CisJdW5zaWduZWQgbG9uZyBzaXplLCBjb3B5OworCWludCBlcnIsIGksIG4sIG9mZnNldCwgY2x1c3RlclsyXTsKKworCS8qCisJICogVGhlIG1pbmltdW0gY2x1c3RlciBzaXplIGlzIDUxMmJ5dGVzLCBhbmQgbWF4aW11bSBlbnRyeQorCSAqIHNpemUgaXMgMzIqc2xvdHMgKDY3MmJ5dGVzKS4gIFNvLCBpZmYgdGhlIGNsdXN0ZXIgc2l6ZSBpcworCSAqIDUxMmJ5dGVzLCB3ZSBtYXkgbmVlZCB0d28gY2x1c3RlcnMuCisJICovCisJc2l6ZSA9IG5yX3Nsb3RzICogc2l6ZW9mKHN0cnVjdCBtc2Rvc19kaXJfZW50cnkpOworCSpucl9jbHVzdGVyID0gKHNpemUgKyAoc2JpLT5jbHVzdGVyX3NpemUgLSAxKSkgPj4gc2JpLT5jbHVzdGVyX2JpdHM7CisJQlVHX09OKCpucl9jbHVzdGVyID4gMik7CisKKwllcnIgPSBmYXRfYWxsb2NfY2x1c3RlcnMoZGlyLCBjbHVzdGVyLCAqbnJfY2x1c3Rlcik7CisJaWYgKGVycikKKwkJZ290byBlcnJvcjsKKworCS8qCisJICogRmlyc3Qgc3RhZ2U6IEZpbGwgdGhlIGRpcmVjdG9yeSBlbnRyeS4gIE5PVEU6IFRoaXMgY2x1c3RlcgorCSAqIGlzIG5vdCByZWZlcmVuY2VkIGZyb20gYW55IGlub2RlIHlldCwgc28gdXBkYXRlcyBvcmRlciBpcworCSAqIG5vdCBpbXBvcnRhbnQuCisJICovCisJaSA9IG4gPSBjb3B5ID0gMDsKKwlkbyB7CisJCXN0YXJ0X2Jsa25yID0gYmxrbnIgPSBmYXRfY2x1c190b19ibGtucihzYmksIGNsdXN0ZXJbaV0pOworCQlsYXN0X2Jsa25yID0gc3RhcnRfYmxrbnIgKyBzYmktPnNlY19wZXJfY2x1czsKKwkJd2hpbGUgKGJsa25yIDwgbGFzdF9ibGtucikgeworCQkJYmhzW25dID0gc2JfZ2V0YmxrKHNiLCBibGtucik7CisJCQlpZiAoIWJoc1tuXSkgeworCQkJCWVyciA9IC1FTk9NRU07CisJCQkJZ290byBlcnJvcl9ub21lbTsKKwkJCX0KKworCQkJLyogZmlsbCB0aGUgZGlyZWN0b3J5IGVudHJ5ICovCisJCQljb3B5ID0gbWluKHNpemUsIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJCQltZW1jcHkoYmhzW25dLT5iX2RhdGEsIHNsb3RzLCBjb3B5KTsKKwkJCXNsb3RzICs9IGNvcHk7CisJCQlzaXplIC09IGNvcHk7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoc1tuXSk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaHNbbl0pOworCQkJaWYgKCFzaXplKQorCQkJCWJyZWFrOworCQkJbisrOworCQkJYmxrbnIrKzsKKwkJfQorCX0gd2hpbGUgKCsraSA8ICpucl9jbHVzdGVyKTsKKworCW1lbXNldChiaHNbbl0tPmJfZGF0YSArIGNvcHksIDAsIHNiLT5zX2Jsb2Nrc2l6ZSAtIGNvcHkpOworCW9mZnNldCA9IGNvcHkgLSBzaXplb2Yoc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSk7CisJZ2V0X2JoKGJoc1tuXSk7CisJKmJoID0gYmhzW25dOworCSpkZSA9IChzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICopKCgqYmgpLT5iX2RhdGEgKyBvZmZzZXQpOworCSppX3BvcyA9IGZhdF9tYWtlX2lfcG9zKHNiLCAqYmgsICpkZSk7CisKKwkvKiBTZWNvbmQgc3RhZ2U6IGNsZWFyIHRoZSByZXN0IG9mIGNsdXN0ZXIsIGFuZCB3cml0ZSBvdXRzICovCisJZXJyID0gZmF0X3plcm9lZF9jbHVzdGVyKGRpciwgc3RhcnRfYmxrbnIsICsrbiwgYmhzLCBNQVhfQlVGX1BFUl9QQUdFKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yX2ZyZWU7CisKKwlyZXR1cm4gY2x1c3RlclswXTsKKworZXJyb3JfZnJlZToKKwlicmVsc2UoKmJoKTsKKwkqYmggPSBOVUxMOworCW4gPSAwOworZXJyb3Jfbm9tZW06CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJYmZvcmdldChiaHNbaV0pOworCWZhdF9mcmVlX2NsdXN0ZXJzKGRpciwgY2x1c3RlclswXSk7CitlcnJvcjoKKwlyZXR1cm4gZXJyOworfQorCitpbnQgZmF0X2FkZF9lbnRyaWVzKHN0cnVjdCBpbm9kZSAqZGlyLCB2b2lkICpzbG90cywgaW50IG5yX3Nsb3RzLAorCQkgICAgc3RydWN0IGZhdF9zbG90X2luZm8gKnNpbmZvKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqcHJldiwgKmJoc1szXTsgLyogMzIqc2xvdHMgKDY3MmJ5dGVzKSAqLworCXN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKmRlOworCWludCBlcnIsIGZyZWVfc2xvdHMsIGksIG5yX2JoczsKKwlsb2ZmX3QgcG9zLCBpX3BvczsKKworCXNpbmZvLT5ucl9zbG90cyA9IG5yX3Nsb3RzOworCisJLyogRmlyc3Qgc3RhZ2U6IHNlYXJjaCBmcmVlIGRpcmVjb3RyeSBlbnRyaWVzICovCisJZnJlZV9zbG90cyA9IG5yX2JocyA9IDA7CisJYmggPSBwcmV2ID0gTlVMTDsKKwlwb3MgPSAwOworCWVyciA9IC1FTk9TUEM7CisJd2hpbGUgKGZhdF9nZXRfZW50cnkoZGlyLCAmcG9zLCAmYmgsICZkZSkgPiAtMSkgeworCQkvKiBjaGVjayB0aGUgbWF4aW11bSBzaXplIG9mIGRpcmVjdG9yeSAqLworCQlpZiAocG9zID49IEZBVF9NQVhfRElSX1NJWkUpCisJCQlnb3RvIGVycm9yOworCisJCWlmIChJU19GUkVFKGRlLT5uYW1lKSkgeworCQkJaWYgKHByZXYgIT0gYmgpIHsKKwkJCQlnZXRfYmgoYmgpOworCQkJCWJoc1tucl9iaHNdID0gcHJldiA9IGJoOworCQkJCW5yX2JocysrOworCQkJfQorCQkJZnJlZV9zbG90cysrOworCQkJaWYgKGZyZWVfc2xvdHMgPT0gbnJfc2xvdHMpCisJCQkJZ290byBmb3VuZDsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykKKwkJCQlicmVsc2UoYmhzW2ldKTsKKwkJCXByZXYgPSBOVUxMOworCQkJZnJlZV9zbG90cyA9IG5yX2JocyA9IDA7CisJCX0KKwl9CisJaWYgKGRpci0+aV9pbm8gPT0gTVNET1NfUk9PVF9JTk8pIHsKKwkJaWYgKHNiaS0+ZmF0X2JpdHMgIT0gMzIpCisJCQlnb3RvIGVycm9yOworCX0gZWxzZSBpZiAoTVNET1NfSShkaXIpLT5pX3N0YXJ0ID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGQVQ6IENvcnJ1cHRlZCBkaXJlY3RvcnkgKGlfcG9zICVsbGQpXG4iLAorCQkgICAgICAgTVNET1NfSShkaXIpLT5pX3Bvcyk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyb3I7CisJfQorCitmb3VuZDoKKwllcnIgPSAwOworCXBvcyAtPSBmcmVlX3Nsb3RzICogc2l6ZW9mKCpkZSk7CisJbnJfc2xvdHMgLT0gZnJlZV9zbG90czsKKwlpZiAoZnJlZV9zbG90cykgeworCQkvKgorCQkgKiBTZWNvbmQgc3RhZ2U6IGZpbGxpbmcgdGhlIGZyZWUgZW50cmllcyB3aXRoIG5ldyBlbnRyaWVzLgorCQkgKiBOT1RFOiBJZiB0aGlzIHNsb3RzIGhhcyBzaG9ydG5hbWUsIGZpcnN0LCB3ZSB3cml0ZQorCQkgKiB0aGUgbG9uZyBuYW1lIHNsb3RzLCB0aGVuIHdyaXRlIHRoZSBzaG9ydCBuYW1lLgorCQkgKi8KKwkJaW50IHNpemUgPSBmcmVlX3Nsb3RzICogc2l6ZW9mKCpkZSk7CisJCWludCBvZmZzZXQgPSBwb3MgJiAoc2ItPnNfYmxvY2tzaXplIC0gMSk7CisJCWludCBsb25nX2JocyA9IG5yX2JocyAtIChucl9zbG90cyA9PSAwKTsKKworCQkvKiBGaWxsIHRoZSBsb25nIG5hbWUgc2xvdHMuICovCisJCWZvciAoaSA9IDA7IGkgPCBsb25nX2JoczsgaSsrKSB7CisJCQlpbnQgY29weSA9IG1pbl90KGludCwgc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0LCBzaXplKTsKKwkJCW1lbWNweShiaHNbaV0tPmJfZGF0YSArIG9mZnNldCwgc2xvdHMsIGNvcHkpOworCQkJbWFya19idWZmZXJfZGlydHkoYmhzW2ldKTsKKwkJCW9mZnNldCA9IDA7CisJCQlzbG90cyArPSBjb3B5OworCQkJc2l6ZSAtPSBjb3B5OworCQl9CisJCWlmIChsb25nX2JocyAmJiBJU19ESVJTWU5DKGRpcikpCisJCQllcnIgPSBmYXRfc3luY19iaHMoYmhzLCBsb25nX2Jocyk7CisJCWlmICghZXJyICYmIGkgPCBucl9iaHMpIHsKKwkJCS8qIEZpbGwgdGhlIHNob3J0IG5hbWUgc2xvdC4gKi8KKwkJCWludCBjb3B5ID0gbWluX3QoaW50LCBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQsIHNpemUpOworCQkJbWVtY3B5KGJoc1tpXS0+Yl9kYXRhICsgb2Zmc2V0LCBzbG90cywgY29weSk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaHNbaV0pOworCQkJaWYgKElTX0RJUlNZTkMoZGlyKSkKKwkJCQllcnIgPSBzeW5jX2RpcnR5X2J1ZmZlcihiaHNbaV0pOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykKKwkJCWJyZWxzZShiaHNbaV0pOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJvcl9yZW1vdmU7CisJfQorCisJaWYgKG5yX3Nsb3RzKSB7CisJCWludCBjbHVzdGVyLCBucl9jbHVzdGVyOworCisJCS8qCisJCSAqIFRoaXJkIHN0YWdlOiBhbGxvY2F0ZSB0aGUgY2x1c3RlciBmb3IgbmV3IGVudHJpZXMuCisJCSAqIEFuZCBpbml0aWFsaXplIHRoZSBjbHVzdGVyIHdpdGggbmV3IGVudHJpZXMsIHRoZW4KKwkJICogYWRkIHRoZSBjbHVzdGVyIHRvIGRpci4KKwkJICovCisJCWNsdXN0ZXIgPSBmYXRfYWRkX25ld19lbnRyaWVzKGRpciwgc2xvdHMsIG5yX3Nsb3RzLCAmbnJfY2x1c3RlciwKKwkJCQkJICAgICAgJmRlLCAmYmgsICZpX3Bvcyk7CisJCWlmIChjbHVzdGVyIDwgMCkgeworCQkJZXJyID0gY2x1c3RlcjsKKwkJCWdvdG8gZXJyb3JfcmVtb3ZlOworCQl9CisJCWVyciA9IGZhdF9jaGFpbl9hZGQoZGlyLCBjbHVzdGVyLCBucl9jbHVzdGVyKTsKKwkJaWYgKGVycikgeworCQkJZmF0X2ZyZWVfY2x1c3RlcnMoZGlyLCBjbHVzdGVyKTsKKwkJCWdvdG8gZXJyb3JfcmVtb3ZlOworCQl9CisJCWlmIChkaXItPmlfc2l6ZSAmIChzYmktPmNsdXN0ZXJfc2l6ZSAtIDEpKSB7CisJCQlmYXRfZnNfcGFuaWMoc2IsICJPZGQgZGlyZWN0b3J5IHNpemUiKTsKKwkJCWRpci0+aV9zaXplID0gKGRpci0+aV9zaXplICsgc2JpLT5jbHVzdGVyX3NpemUgLSAxKQorCQkJCSYgfigobG9mZl90KXNiaS0+Y2x1c3Rlcl9zaXplIC0gMSk7CisJCX0KKwkJZGlyLT5pX3NpemUgKz0gbnJfY2x1c3RlciA8PCBzYmktPmNsdXN0ZXJfYml0czsKKwkJTVNET1NfSShkaXIpLT5tbXVfcHJpdmF0ZSArPSBucl9jbHVzdGVyIDw8IHNiaS0+Y2x1c3Rlcl9iaXRzOworCX0KKwlzaW5mby0+c2xvdF9vZmYgPSBwb3M7CisJc2luZm8tPmRlID0gZGU7CisJc2luZm8tPmJoID0gYmg7CisJc2luZm8tPmlfcG9zID0gZmF0X21ha2VfaV9wb3Moc2IsIHNpbmZvLT5iaCwgc2luZm8tPmRlKTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlicmVsc2UoYmgpOworCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykKKwkJYnJlbHNlKGJoc1tpXSk7CisJcmV0dXJuIGVycjsKKworZXJyb3JfcmVtb3ZlOgorCWJyZWxzZShiaCk7CisJaWYgKGZyZWVfc2xvdHMpCisJCV9fZmF0X3JlbW92ZV9lbnRyaWVzKGRpciwgcG9zLCBmcmVlX3Nsb3RzKTsKKwlyZXR1cm4gZXJyOworfQorCitFWFBPUlRfU1lNQk9MKGZhdF9hZGRfZW50cmllcyk7CmRpZmYgLS1naXQgYS9mcy9mYXQvZmF0ZW50LmMgYi9mcy9mYXQvZmF0ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE2NGNkNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2ZhdC9mYXRlbnQuYwpAQCAtMCwwICsxLDYxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgT0dBV0EgSGlyb2Z1bWkKKyAqIFJlbGVhc2VkIHVuZGVyIEdQTCB2Mi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tc2Rvc19mcy5oPgorCitzdHJ1Y3QgZmF0ZW50X29wZXJhdGlvbnMgeworCXZvaWQgKCplbnRfYmxvY2tucikoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgaW50ICosIHNlY3Rvcl90ICopOworCXZvaWQgKCplbnRfc2V0X3B0cikoc3RydWN0IGZhdF9lbnRyeSAqLCBpbnQpOworCWludCAoKmVudF9icmVhZCkoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBmYXRfZW50cnkgKiwKKwkJCSBpbnQsIHNlY3Rvcl90KTsKKwlpbnQgKCplbnRfZ2V0KShzdHJ1Y3QgZmF0X2VudHJ5ICopOworCXZvaWQgKCplbnRfcHV0KShzdHJ1Y3QgZmF0X2VudHJ5ICosIGludCk7CisJaW50ICgqZW50X25leHQpKHN0cnVjdCBmYXRfZW50cnkgKik7Cit9OworCitzdGF0aWMgdm9pZCBmYXQxMl9lbnRfYmxvY2tucihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZW50cnksCisJCQkgICAgICBpbnQgKm9mZnNldCwgc2VjdG9yX3QgKmJsb2NrbnIpCit7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlpbnQgYnl0ZXMgPSBlbnRyeSArIChlbnRyeSA+PiAxKTsKKwlXQVJOX09OKGVudHJ5IDwgRkFUX1NUQVJUX0VOVCB8fCBzYmktPm1heF9jbHVzdGVyIDw9IGVudHJ5KTsKKwkqb2Zmc2V0ID0gYnl0ZXMgJiAoc2ItPnNfYmxvY2tzaXplIC0gMSk7CisJKmJsb2NrbnIgPSBzYmktPmZhdF9zdGFydCArIChieXRlcyA+PiBzYi0+c19ibG9ja3NpemVfYml0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGZhdF9lbnRfYmxvY2tucihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZW50cnksCisJCQkgICAgaW50ICpvZmZzZXQsIHNlY3Rvcl90ICpibG9ja25yKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisJaW50IGJ5dGVzID0gKGVudHJ5IDw8IHNiaS0+ZmF0ZW50X3NoaWZ0KTsKKwlXQVJOX09OKGVudHJ5IDwgRkFUX1NUQVJUX0VOVCB8fCBzYmktPm1heF9jbHVzdGVyIDw9IGVudHJ5KTsKKwkqb2Zmc2V0ID0gYnl0ZXMgJiAoc2ItPnNfYmxvY2tzaXplIC0gMSk7CisJKmJsb2NrbnIgPSBzYmktPmZhdF9zdGFydCArIChieXRlcyA+PiBzYi0+c19ibG9ja3NpemVfYml0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGZhdDEyX2VudF9zZXRfcHRyKHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCwgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMgPSBmYXRlbnQtPmJoczsKKwlpZiAoZmF0ZW50LT5ucl9iaHMgPT0gMSkgeworCQlXQVJOX09OKG9mZnNldCA+PSAoYmhzWzBdLT5iX3NpemUgLSAxKSk7CisJCWZhdGVudC0+dS5lbnQxMl9wWzBdID0gYmhzWzBdLT5iX2RhdGEgKyBvZmZzZXQ7CisJCWZhdGVudC0+dS5lbnQxMl9wWzFdID0gYmhzWzBdLT5iX2RhdGEgKyAob2Zmc2V0ICsgMSk7CisJfSBlbHNlIHsKKwkJV0FSTl9PTihvZmZzZXQgIT0gKGJoc1swXS0+Yl9zaXplIC0gMSkpOworCQlmYXRlbnQtPnUuZW50MTJfcFswXSA9IGJoc1swXS0+Yl9kYXRhICsgb2Zmc2V0OworCQlmYXRlbnQtPnUuZW50MTJfcFsxXSA9IGJoc1sxXS0+Yl9kYXRhOworCX0KK30KKworc3RhdGljIHZvaWQgZmF0MTZfZW50X3NldF9wdHIoc3RydWN0IGZhdF9lbnRyeSAqZmF0ZW50LCBpbnQgb2Zmc2V0KQoreworCVdBUk5fT04ob2Zmc2V0ICYgKDIgLSAxKSk7CisJZmF0ZW50LT51LmVudDE2X3AgPSAoX19sZTE2ICopKGZhdGVudC0+YmhzWzBdLT5iX2RhdGEgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBmYXQzMl9lbnRfc2V0X3B0cihzdHJ1Y3QgZmF0X2VudHJ5ICpmYXRlbnQsIGludCBvZmZzZXQpCit7CisJV0FSTl9PTihvZmZzZXQgJiAoNCAtIDEpKTsKKwlmYXRlbnQtPnUuZW50MzJfcCA9IChfX2xlMzIgKikoZmF0ZW50LT5iaHNbMF0tPmJfZGF0YSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgZmF0MTJfZW50X2JyZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCwKKwkJCSAgIGludCBvZmZzZXQsIHNlY3Rvcl90IGJsb2NrbnIpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzID0gZmF0ZW50LT5iaHM7CisKKwlXQVJOX09OKGJsb2NrbnIgPCBNU0RPU19TQihzYiktPmZhdF9zdGFydCk7CisJYmhzWzBdID0gc2JfYnJlYWQoc2IsIGJsb2NrbnIpOworCWlmICghYmhzWzBdKQorCQlnb3RvIGVycjsKKworCWlmICgob2Zmc2V0ICsgMSkgPCBzYi0+c19ibG9ja3NpemUpCisJCWZhdGVudC0+bnJfYmhzID0gMTsKKwllbHNlIHsKKwkJLyogVGhpcyBlbnRyeSBpcyBibG9jayBib3VuZGFyeSwgaXQgbmVlZHMgdGhlIG5leHQgYmxvY2sgKi8KKwkJYmxvY2tucisrOworCQliaHNbMV0gPSBzYl9icmVhZChzYiwgYmxvY2tucik7CisJCWlmICghYmhzWzFdKQorCQkJZ290byBlcnJfYnJlbHNlOworCQlmYXRlbnQtPm5yX2JocyA9IDI7CisJfQorCWZhdDEyX2VudF9zZXRfcHRyKGZhdGVudCwgb2Zmc2V0KTsKKwlyZXR1cm4gMDsKKworZXJyX2JyZWxzZToKKwlicmVsc2UoYmhzWzBdKTsKK2VycjoKKwlwcmludGsoS0VSTl9FUlIgIkZBVDogRkFUIHJlYWQgZmFpbGVkIChibG9ja25yICVsbHUpXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJsb2NrbnIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IGZhdF9lbnRfYnJlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZhdF9lbnRyeSAqZmF0ZW50LAorCQkJIGludCBvZmZzZXQsIHNlY3Rvcl90IGJsb2NrbnIpCit7CisJc3RydWN0IGZhdGVudF9vcGVyYXRpb25zICpvcHMgPSBNU0RPU19TQihzYiktPmZhdGVudF9vcHM7CisKKwlXQVJOX09OKGJsb2NrbnIgPCBNU0RPU19TQihzYiktPmZhdF9zdGFydCk7CisJZmF0ZW50LT5iaHNbMF0gPSBzYl9icmVhZChzYiwgYmxvY2tucik7CisJaWYgKCFmYXRlbnQtPmJoc1swXSkgeworCQlwcmludGsoS0VSTl9FUlIgIkZBVDogRkFUIHJlYWQgZmFpbGVkIChibG9ja25yICVsbHUpXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylibG9ja25yKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWZhdGVudC0+bnJfYmhzID0gMTsKKwlvcHMtPmVudF9zZXRfcHRyKGZhdGVudCwgb2Zmc2V0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmYXQxMl9lbnRfZ2V0KHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCkKK3sKKwl1OCAqKmVudDEyX3AgPSBmYXRlbnQtPnUuZW50MTJfcDsKKwlpbnQgbmV4dDsKKworCWlmIChmYXRlbnQtPmVudHJ5ICYgMSkKKwkJbmV4dCA9ICgqZW50MTJfcFswXSA+PiA0KSB8ICgqZW50MTJfcFsxXSA8PCA0KTsKKwllbHNlCisJCW5leHQgPSAoKmVudDEyX3BbMV0gPDwgOCkgfCAqZW50MTJfcFswXTsKKwluZXh0ICY9IDB4MGZmZjsKKwlpZiAobmV4dCA+PSBCQURfRkFUMTIpCisJCW5leHQgPSBGQVRfRU5UX0VPRjsKKwlyZXR1cm4gbmV4dDsKK30KKworc3RhdGljIGludCBmYXQxNl9lbnRfZ2V0KHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCkKK3sKKwlpbnQgbmV4dCA9IGxlMTZfdG9fY3B1KCpmYXRlbnQtPnUuZW50MTZfcCk7CisJV0FSTl9PTigodW5zaWduZWQgbG9uZylmYXRlbnQtPnUuZW50MTZfcCAmICgyIC0gMSkpOworCWlmIChuZXh0ID49IEJBRF9GQVQxNikKKwkJbmV4dCA9IEZBVF9FTlRfRU9GOworCXJldHVybiBuZXh0OworfQorCitzdGF0aWMgaW50IGZhdDMyX2VudF9nZXQoc3RydWN0IGZhdF9lbnRyeSAqZmF0ZW50KQoreworCWludCBuZXh0ID0gbGUzMl90b19jcHUoKmZhdGVudC0+dS5lbnQzMl9wKSAmIDB4MGZmZmZmZmY7CisJV0FSTl9PTigodW5zaWduZWQgbG9uZylmYXRlbnQtPnUuZW50MzJfcCAmICg0IC0gMSkpOworCWlmIChuZXh0ID49IEJBRF9GQVQzMikKKwkJbmV4dCA9IEZBVF9FTlRfRU9GOworCXJldHVybiBuZXh0OworfQorCitzdGF0aWMgdm9pZCBmYXQxMl9lbnRfcHV0KHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCwgaW50IG5ldykKK3sKKwl1OCAqKmVudDEyX3AgPSBmYXRlbnQtPnUuZW50MTJfcDsKKworCWlmIChuZXcgPT0gRkFUX0VOVF9FT0YpCisJCW5ldyA9IEVPRl9GQVQxMjsKKworCWlmIChmYXRlbnQtPmVudHJ5ICYgMSkgeworCQkqZW50MTJfcFswXSA9IChuZXcgPDwgNCkgfCAoKmVudDEyX3BbMF0gJiAweDBmKTsKKwkJKmVudDEyX3BbMV0gPSBuZXcgPj4gNDsKKwl9IGVsc2UgeworCQkqZW50MTJfcFswXSA9IG5ldyAmIDB4ZmY7CisJCSplbnQxMl9wWzFdID0gKCplbnQxMl9wWzFdICYgMHhmMCkgfCAobmV3ID4+IDgpOworCX0KKworCW1hcmtfYnVmZmVyX2RpcnR5KGZhdGVudC0+YmhzWzBdKTsKKwlpZiAoZmF0ZW50LT5ucl9iaHMgPT0gMikKKwkJbWFya19idWZmZXJfZGlydHkoZmF0ZW50LT5iaHNbMV0pOworfQorCitzdGF0aWMgdm9pZCBmYXQxNl9lbnRfcHV0KHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCwgaW50IG5ldykKK3sKKwlpZiAobmV3ID09IEZBVF9FTlRfRU9GKQorCQluZXcgPSBFT0ZfRkFUMTY7CisKKwkqZmF0ZW50LT51LmVudDE2X3AgPSBjcHVfdG9fbGUxNihuZXcpOworCW1hcmtfYnVmZmVyX2RpcnR5KGZhdGVudC0+YmhzWzBdKTsKK30KKworc3RhdGljIHZvaWQgZmF0MzJfZW50X3B1dChzdHJ1Y3QgZmF0X2VudHJ5ICpmYXRlbnQsIGludCBuZXcpCit7CisJaWYgKG5ldyA9PSBGQVRfRU5UX0VPRikKKwkJbmV3ID0gRU9GX0ZBVDMyOworCisJV0FSTl9PTihuZXcgJiAweGYwMDAwMDAwKTsKKwluZXcgfD0gbGUzMl90b19jcHUoKmZhdGVudC0+dS5lbnQzMl9wKSAmIH4weDBmZmZmZmZmOworCSpmYXRlbnQtPnUuZW50MzJfcCA9IGNwdV90b19sZTMyKG5ldyk7CisJbWFya19idWZmZXJfZGlydHkoZmF0ZW50LT5iaHNbMF0pOworfQorCitzdGF0aWMgaW50IGZhdDEyX2VudF9uZXh0KHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCkKK3sKKwl1OCAqKmVudDEyX3AgPSBmYXRlbnQtPnUuZW50MTJfcDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMgPSBmYXRlbnQtPmJoczsKKwl1OCAqbmV4dHAgPSBlbnQxMl9wWzFdICsgMSArIChmYXRlbnQtPmVudHJ5ICYgMSk7CisKKwlmYXRlbnQtPmVudHJ5Kys7CisJaWYgKGZhdGVudC0+bnJfYmhzID09IDEpIHsKKwkJV0FSTl9PTihlbnQxMl9wWzBdID4gKHU4ICopKGJoc1swXS0+Yl9kYXRhICsgKGJoc1swXS0+Yl9zaXplIC0gMikpKTsKKwkJV0FSTl9PTihlbnQxMl9wWzFdID4gKHU4ICopKGJoc1swXS0+Yl9kYXRhICsgKGJoc1swXS0+Yl9zaXplIC0gMSkpKTsKKwkJaWYgKG5leHRwIDwgKHU4ICopKGJoc1swXS0+Yl9kYXRhICsgKGJoc1swXS0+Yl9zaXplIC0gMSkpKSB7CisJCQllbnQxMl9wWzBdID0gbmV4dHAgLSAxOworCQkJZW50MTJfcFsxXSA9IG5leHRwOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgeworCQlXQVJOX09OKGVudDEyX3BbMF0gIT0gKHU4ICopKGJoc1swXS0+Yl9kYXRhICsgKGJoc1swXS0+Yl9zaXplIC0gMSkpKTsKKwkJV0FSTl9PTihlbnQxMl9wWzFdICE9ICh1OCAqKWJoc1sxXS0+Yl9kYXRhKTsKKwkJZW50MTJfcFswXSA9IG5leHRwIC0gMTsKKwkJZW50MTJfcFsxXSA9IG5leHRwOworCQlicmVsc2UoYmhzWzBdKTsKKwkJYmhzWzBdID0gYmhzWzFdOworCQlmYXRlbnQtPm5yX2JocyA9IDE7CisJCXJldHVybiAxOworCX0KKwllbnQxMl9wWzBdID0gTlVMTDsKKwllbnQxMl9wWzFdID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmYXQxNl9lbnRfbmV4dChzdHJ1Y3QgZmF0X2VudHJ5ICpmYXRlbnQpCit7CisJY29uc3Qgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGZhdGVudC0+YmhzWzBdOworCWZhdGVudC0+ZW50cnkrKzsKKwlpZiAoZmF0ZW50LT51LmVudDE2X3AgPCAoX19sZTE2ICopKGJoLT5iX2RhdGEgKyAoYmgtPmJfc2l6ZSAtIDIpKSkgeworCQlmYXRlbnQtPnUuZW50MTZfcCsrOworCQlyZXR1cm4gMTsKKwl9CisJZmF0ZW50LT51LmVudDE2X3AgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZhdDMyX2VudF9uZXh0KHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCkKK3sKKwljb25zdCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gZmF0ZW50LT5iaHNbMF07CisJZmF0ZW50LT5lbnRyeSsrOworCWlmIChmYXRlbnQtPnUuZW50MzJfcCA8IChfX2xlMzIgKikoYmgtPmJfZGF0YSArIChiaC0+Yl9zaXplIC0gNCkpKSB7CisJCWZhdGVudC0+dS5lbnQzMl9wKys7CisJCXJldHVybiAxOworCX0KKwlmYXRlbnQtPnUuZW50MzJfcCA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmF0ZW50X29wZXJhdGlvbnMgZmF0MTJfb3BzID0geworCS5lbnRfYmxvY2tucgk9IGZhdDEyX2VudF9ibG9ja25yLAorCS5lbnRfc2V0X3B0cgk9IGZhdDEyX2VudF9zZXRfcHRyLAorCS5lbnRfYnJlYWQJPSBmYXQxMl9lbnRfYnJlYWQsCisJLmVudF9nZXQJPSBmYXQxMl9lbnRfZ2V0LAorCS5lbnRfcHV0CT0gZmF0MTJfZW50X3B1dCwKKwkuZW50X25leHQJPSBmYXQxMl9lbnRfbmV4dCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmF0ZW50X29wZXJhdGlvbnMgZmF0MTZfb3BzID0geworCS5lbnRfYmxvY2tucgk9IGZhdF9lbnRfYmxvY2tuciwKKwkuZW50X3NldF9wdHIJPSBmYXQxNl9lbnRfc2V0X3B0ciwKKwkuZW50X2JyZWFkCT0gZmF0X2VudF9icmVhZCwKKwkuZW50X2dldAk9IGZhdDE2X2VudF9nZXQsCisJLmVudF9wdXQJPSBmYXQxNl9lbnRfcHV0LAorCS5lbnRfbmV4dAk9IGZhdDE2X2VudF9uZXh0LAorfTsKKworc3RhdGljIHN0cnVjdCBmYXRlbnRfb3BlcmF0aW9ucyBmYXQzMl9vcHMgPSB7CisJLmVudF9ibG9ja25yCT0gZmF0X2VudF9ibG9ja25yLAorCS5lbnRfc2V0X3B0cgk9IGZhdDMyX2VudF9zZXRfcHRyLAorCS5lbnRfYnJlYWQJPSBmYXRfZW50X2JyZWFkLAorCS5lbnRfZ2V0CT0gZmF0MzJfZW50X2dldCwKKwkuZW50X3B1dAk9IGZhdDMyX2VudF9wdXQsCisJLmVudF9uZXh0CT0gZmF0MzJfZW50X25leHQsCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgbG9ja19mYXQoc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSkKK3sKKwlkb3duKCZzYmktPmZhdF9sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVubG9ja19mYXQoc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSkKK3sKKwl1cCgmc2JpLT5mYXRfbG9jayk7Cit9CisKK3ZvaWQgZmF0X2VudF9hY2Nlc3NfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisKKwlpbml0X01VVEVYKCZzYmktPmZhdF9sb2NrKTsKKworCXN3aXRjaCAoc2JpLT5mYXRfYml0cykgeworCWNhc2UgMzI6CisJCXNiaS0+ZmF0ZW50X3NoaWZ0ID0gMjsKKwkJc2JpLT5mYXRlbnRfb3BzID0gJmZhdDMyX29wczsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJc2JpLT5mYXRlbnRfc2hpZnQgPSAxOworCQlzYmktPmZhdGVudF9vcHMgPSAmZmF0MTZfb3BzOworCQlicmVhazsKKwljYXNlIDEyOgorCQlzYmktPmZhdGVudF9zaGlmdCA9IC0xOworCQlzYmktPmZhdGVudF9vcHMgPSAmZmF0MTJfb3BzOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZhdF9lbnRfdXBkYXRlX3B0cihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgc3RydWN0IGZhdF9lbnRyeSAqZmF0ZW50LAorCQkJCSAgICAgaW50IG9mZnNldCwgc2VjdG9yX3QgYmxvY2tucikKK3sKKwlzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpID0gTVNET1NfU0Ioc2IpOworCXN0cnVjdCBmYXRlbnRfb3BlcmF0aW9ucyAqb3BzID0gc2JpLT5mYXRlbnRfb3BzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqKmJocyA9IGZhdGVudC0+YmhzOworCisJLyogSXMgdGhpcyBmYXRlbnQncyBibG9ja3MgaW5jbHVkaW5nIHRoaXMgZW50cnk/ICovCisJaWYgKCFmYXRlbnQtPm5yX2JocyB8fCBiaHNbMF0tPmJfYmxvY2tuciAhPSBibG9ja25yKQorCQlyZXR1cm4gMDsKKwkvKiBEb2VzIHRoaXMgZW50cnkgbmVlZCB0aGUgbmV4dCBibG9jaz8gKi8KKwlpZiAoc2JpLT5mYXRfYml0cyA9PSAxMiAmJiAob2Zmc2V0ICsgMSkgPj0gc2ItPnNfYmxvY2tzaXplKSB7CisJCWlmIChmYXRlbnQtPm5yX2JocyAhPSAyIHx8IGJoc1sxXS0+Yl9ibG9ja25yICE9IChibG9ja25yICsgMSkpCisJCQlyZXR1cm4gMDsKKwl9CisJb3BzLT5lbnRfc2V0X3B0cihmYXRlbnQsIG9mZnNldCk7CisJcmV0dXJuIDE7Cit9CisKK2ludCBmYXRfZW50X3JlYWQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZhdF9lbnRyeSAqZmF0ZW50LCBpbnQgZW50cnkpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IGZhdGVudF9vcGVyYXRpb25zICpvcHMgPSBzYmktPmZhdGVudF9vcHM7CisJaW50IGVyciwgb2Zmc2V0OworCXNlY3Rvcl90IGJsb2NrbnI7CisKKwlpZiAoZW50cnkgPCBGQVRfU1RBUlRfRU5UIHx8IHNiaS0+bWF4X2NsdXN0ZXIgPD0gZW50cnkpIHsKKwkJZmF0ZW50X2JyZWxzZShmYXRlbnQpOworCQlmYXRfZnNfcGFuaWMoc2IsICJpbnZhbGlkIGFjY2VzcyB0byBGQVQgKGVudHJ5IDB4JTA4eCkiLCBlbnRyeSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWZhdGVudF9zZXRfZW50cnkoZmF0ZW50LCBlbnRyeSk7CisJb3BzLT5lbnRfYmxvY2tucihzYiwgZW50cnksICZvZmZzZXQsICZibG9ja25yKTsKKworCWlmICghZmF0X2VudF91cGRhdGVfcHRyKHNiLCBmYXRlbnQsIG9mZnNldCwgYmxvY2tucikpIHsKKwkJZmF0ZW50X2JyZWxzZShmYXRlbnQpOworCQllcnIgPSBvcHMtPmVudF9icmVhZChzYiwgZmF0ZW50LCBvZmZzZXQsIGJsb2NrbnIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIG9wcy0+ZW50X2dldChmYXRlbnQpOworfQorCisvKiBGSVhNRTogV2UgY2FuIHdyaXRlIHRoZSBibG9ja3MgYXMgbW9yZSBiaWcgY2h1bmsuICovCitzdGF0aWMgaW50IGZhdF9taXJyb3JfYmhzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocywKKwkJCSAgaW50IG5yX2JocykKK3sKKwlzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpID0gTVNET1NfU0Ioc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqY19iaDsKKwlpbnQgZXJyLCBuLCBjb3B5OworCisJZXJyID0gMDsKKwlmb3IgKGNvcHkgPSAxOyBjb3B5IDwgc2JpLT5mYXRzOyBjb3B5KyspIHsKKwkJc2VjdG9yX3QgYmFja3VwX2ZhdCA9IHNiaS0+ZmF0X2xlbmd0aCAqIGNvcHk7CisKKwkJZm9yIChuID0gMDsgbiA8IG5yX2JoczsgbisrKSB7CisJCQljX2JoID0gc2JfZ2V0YmxrKHNiLCBiYWNrdXBfZmF0ICsgYmhzW25dLT5iX2Jsb2NrbnIpOworCQkJaWYgKCFjX2JoKSB7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQkJbWVtY3B5KGNfYmgtPmJfZGF0YSwgYmhzW25dLT5iX2RhdGEsIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGNfYmgpOworCQkJbWFya19idWZmZXJfZGlydHkoY19iaCk7CisJCQlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykKKwkJCQllcnIgPSBzeW5jX2RpcnR5X2J1ZmZlcihjX2JoKTsKKwkJCWJyZWxzZShjX2JoKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBlcnJvcjsKKwkJfQorCX0KK2Vycm9yOgorCXJldHVybiBlcnI7Cit9CisKK2ludCBmYXRfZW50X3dyaXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCwKKwkJICBpbnQgbmV3LCBpbnQgd2FpdCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGZhdGVudF9vcGVyYXRpb25zICpvcHMgPSBNU0RPU19TQihzYiktPmZhdGVudF9vcHM7CisJaW50IGVycjsKKworCW9wcy0+ZW50X3B1dChmYXRlbnQsIG5ldyk7CisJaWYgKHdhaXQpIHsKKwkJZXJyID0gZmF0X3N5bmNfYmhzKGZhdGVudC0+YmhzLCBmYXRlbnQtPm5yX2Jocyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gZmF0X21pcnJvcl9iaHMoc2IsIGZhdGVudC0+YmhzLCBmYXRlbnQtPm5yX2Jocyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZhdF9lbnRfbmV4dChzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpLAorCQkJICAgICAgIHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCkKK3sKKwlpZiAoc2JpLT5mYXRlbnRfb3BzLT5lbnRfbmV4dChmYXRlbnQpKSB7CisJCWlmIChmYXRlbnQtPmVudHJ5IDwgc2JpLT5tYXhfY2x1c3RlcikKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmF0X2VudF9yZWFkX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICBzdHJ1Y3QgZmF0X2VudHJ5ICpmYXRlbnQpCit7CisJc3RydWN0IGZhdGVudF9vcGVyYXRpb25zICpvcHMgPSBNU0RPU19TQihzYiktPmZhdGVudF9vcHM7CisJc2VjdG9yX3QgYmxvY2tucjsKKwlpbnQgb2Zmc2V0OworCisJZmF0ZW50X2JyZWxzZShmYXRlbnQpOworCW9wcy0+ZW50X2Jsb2NrbnIoc2IsIGZhdGVudC0+ZW50cnksICZvZmZzZXQsICZibG9ja25yKTsKKwlyZXR1cm4gb3BzLT5lbnRfYnJlYWQoc2IsIGZhdGVudCwgb2Zmc2V0LCBibG9ja25yKTsKK30KKworc3RhdGljIHZvaWQgZmF0X2NvbGxlY3RfYmhzKHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocywgaW50ICpucl9iaHMsCisJCQkgICAgc3RydWN0IGZhdF9lbnRyeSAqZmF0ZW50KQoreworCWludCBuLCBpOworCisJZm9yIChuID0gMDsgbiA8IGZhdGVudC0+bnJfYmhzOyBuKyspIHsKKwkJZm9yIChpID0gMDsgaSA8ICpucl9iaHM7IGkrKykgeworCQkJaWYgKGZhdGVudC0+YmhzW25dID09IGJoc1tpXSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSAqbnJfYmhzKSB7CisJCQlnZXRfYmgoZmF0ZW50LT5iaHNbbl0pOworCQkJYmhzW2ldID0gZmF0ZW50LT5iaHNbbl07CisJCQkoKm5yX2JocykrKzsKKwkJfQorCX0KK30KKworaW50IGZhdF9hbGxvY19jbHVzdGVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmNsdXN0ZXIsIGludCBucl9jbHVzdGVyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpID0gTVNET1NfU0Ioc2IpOworCXN0cnVjdCBmYXRlbnRfb3BlcmF0aW9ucyAqb3BzID0gc2JpLT5mYXRlbnRfb3BzOworCXN0cnVjdCBmYXRfZW50cnkgZmF0ZW50LCBwcmV2X2VudDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tNQVhfQlVGX1BFUl9QQUdFXTsKKwlpbnQgaSwgY291bnQsIGVyciwgbnJfYmhzLCBpZHhfY2x1czsKKworCUJVR19PTihucl9jbHVzdGVyID4gKE1BWF9CVUZfUEVSX1BBR0UgLyAyKSk7CS8qIGZpeGVkIGxpbWl0ICovCisKKwlsb2NrX2ZhdChzYmkpOworCWlmIChzYmktPmZyZWVfY2x1c3RlcnMgIT0gLTEgJiYgc2JpLT5mcmVlX2NsdXN0ZXJzIDwgbnJfY2x1c3RlcikgeworCQl1bmxvY2tfZmF0KHNiaSk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCWVyciA9IG5yX2JocyA9IGlkeF9jbHVzID0gMDsKKwljb3VudCA9IEZBVF9TVEFSVF9FTlQ7CisJZmF0ZW50X2luaXQoJnByZXZfZW50KTsKKwlmYXRlbnRfaW5pdCgmZmF0ZW50KTsKKwlmYXRlbnRfc2V0X2VudHJ5KCZmYXRlbnQsIHNiaS0+cHJldl9mcmVlICsgMSk7CisJd2hpbGUgKGNvdW50IDwgc2JpLT5tYXhfY2x1c3RlcikgeworCQlpZiAoZmF0ZW50LmVudHJ5ID49IHNiaS0+bWF4X2NsdXN0ZXIpCisJCQlmYXRlbnQuZW50cnkgPSBGQVRfU1RBUlRfRU5UOworCQlmYXRlbnRfc2V0X2VudHJ5KCZmYXRlbnQsIGZhdGVudC5lbnRyeSk7CisJCWVyciA9IGZhdF9lbnRfcmVhZF9ibG9jayhzYiwgJmZhdGVudCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKworCQkvKiBGaW5kIHRoZSBmcmVlIGVudHJpZXMgaW4gYSBibG9jayAqLworCQlkbyB7CisJCQlpZiAob3BzLT5lbnRfZ2V0KCZmYXRlbnQpID09IEZBVF9FTlRfRlJFRSkgeworCQkJCWludCBlbnRyeSA9IGZhdGVudC5lbnRyeTsKKworCQkJCS8qIG1ha2UgdGhlIGNsdXN0ZXIgY2hhaW4gKi8KKwkJCQlvcHMtPmVudF9wdXQoJmZhdGVudCwgRkFUX0VOVF9FT0YpOworCQkJCWlmIChwcmV2X2VudC5ucl9iaHMpCisJCQkJCW9wcy0+ZW50X3B1dCgmcHJldl9lbnQsIGVudHJ5KTsKKworCQkJCWZhdF9jb2xsZWN0X2JocyhiaHMsICZucl9iaHMsICZmYXRlbnQpOworCisJCQkJc2JpLT5wcmV2X2ZyZWUgPSBlbnRyeTsKKwkJCQlpZiAoc2JpLT5mcmVlX2NsdXN0ZXJzICE9IC0xKQorCQkJCQlzYmktPmZyZWVfY2x1c3RlcnMtLTsKKworCQkJCWNsdXN0ZXJbaWR4X2NsdXNdID0gZW50cnk7CisJCQkJaWR4X2NsdXMrKzsKKwkJCQlpZiAoaWR4X2NsdXMgPT0gbnJfY2x1c3RlcikKKwkJCQkJZ290byBvdXQ7CisKKwkJCQkvKgorCQkJCSAqIGZhdF9jb2xsZWN0X2JocygpIGdldHMgcmVmLWNvdW50IG9mIGJocywKKwkJCQkgKiBzbyB3ZSBjYW4gc3RpbGwgdXNlIHRoZSBwcmV2X2VudC4KKwkJCQkgKi8KKwkJCQlwcmV2X2VudCA9IGZhdGVudDsKKwkJCX0KKwkJCWNvdW50Kys7CisJCQlpZiAoY291bnQgPT0gc2JpLT5tYXhfY2x1c3RlcikKKwkJCQlicmVhazsKKwkJfSB3aGlsZSAoZmF0X2VudF9uZXh0KHNiaSwgJmZhdGVudCkpOworCX0KKworCS8qIENvdWxkbid0IGFsbG9jYXRlIHRoZSBmcmVlIGVudHJpZXMgKi8KKwlzYmktPmZyZWVfY2x1c3RlcnMgPSAwOworCWVyciA9IC1FTk9TUEM7CisKK291dDoKKwl1bmxvY2tfZmF0KHNiaSk7CisJZmF0ZW50X2JyZWxzZSgmZmF0ZW50KTsKKwlpZiAoIWVycikgeworCQlpZiAoaW5vZGVfbmVlZHNfc3luYyhpbm9kZSkpCisJCQllcnIgPSBmYXRfc3luY19iaHMoYmhzLCBucl9iaHMpOworCQlpZiAoIWVycikKKwkJCWVyciA9IGZhdF9taXJyb3JfYmhzKHNiLCBiaHMsIG5yX2Jocyk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykKKwkJYnJlbHNlKGJoc1tpXSk7CisJZmF0X2NsdXN0ZXJzX2ZsdXNoKHNiKTsKKworCWlmIChlcnIgJiYgaWR4X2NsdXMpCisJCWZhdF9mcmVlX2NsdXN0ZXJzKGlub2RlLCBjbHVzdGVyWzBdKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBmYXRfZnJlZV9jbHVzdGVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgY2x1c3RlcikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlzdHJ1Y3QgZmF0ZW50X29wZXJhdGlvbnMgKm9wcyA9IHNiaS0+ZmF0ZW50X29wczsKKwlzdHJ1Y3QgZmF0X2VudHJ5IGZhdGVudDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tNQVhfQlVGX1BFUl9QQUdFXTsKKwlpbnQgaSwgZXJyLCBucl9iaHM7CisKKwlucl9iaHMgPSAwOworCWZhdGVudF9pbml0KCZmYXRlbnQpOworCWxvY2tfZmF0KHNiaSk7CisJZG8geworCQljbHVzdGVyID0gZmF0X2VudF9yZWFkKGlub2RlLCAmZmF0ZW50LCBjbHVzdGVyKTsKKwkJaWYgKGNsdXN0ZXIgPCAwKSB7CisJCQllcnIgPSBjbHVzdGVyOworCQkJZ290byBlcnJvcjsKKwkJfSBlbHNlIGlmIChjbHVzdGVyID09IEZBVF9FTlRfRlJFRSkgeworCQkJZmF0X2ZzX3BhbmljKHNiLCAiJXM6IGRlbGV0aW5nIEZBVCBlbnRyeSBiZXlvbmQgRU9GIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCW9wcy0+ZW50X3B1dCgmZmF0ZW50LCBGQVRfRU5UX0ZSRUUpOworCQlpZiAoc2JpLT5mcmVlX2NsdXN0ZXJzICE9IC0xKQorCQkJc2JpLT5mcmVlX2NsdXN0ZXJzKys7CisKKwkJaWYgKG5yX2JocyArIGZhdGVudC5ucl9iaHMgPiBNQVhfQlVGX1BFUl9QQUdFKSB7CisJCQlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykgeworCQkJCWVyciA9IGZhdF9zeW5jX2JocyhiaHMsIG5yX2Jocyk7CisJCQkJaWYgKGVycikKKwkJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCWVyciA9IGZhdF9taXJyb3JfYmhzKHNiLCBiaHMsIG5yX2Jocyk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gZXJyb3I7CisJCQlmb3IgKGkgPSAwOyBpIDwgbnJfYmhzOyBpKyspCisJCQkJYnJlbHNlKGJoc1tpXSk7CisJCQlucl9iaHMgPSAwOworCQl9CisJCWZhdF9jb2xsZWN0X2JocyhiaHMsICZucl9iaHMsICZmYXRlbnQpOworCX0gd2hpbGUgKGNsdXN0ZXIgIT0gRkFUX0VOVF9FT0YpOworCisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfU1lOQ0hST05PVVMpIHsKKwkJZXJyID0gZmF0X3N5bmNfYmhzKGJocywgbnJfYmhzKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyb3I7CisJfQorCWVyciA9IGZhdF9taXJyb3JfYmhzKHNiLCBiaHMsIG5yX2Jocyk7CitlcnJvcjoKKwlmYXRlbnRfYnJlbHNlKCZmYXRlbnQpOworCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykKKwkJYnJlbHNlKGJoc1tpXSk7CisJdW5sb2NrX2ZhdChzYmkpOworCisJZmF0X2NsdXN0ZXJzX2ZsdXNoKHNiKTsKKworCXJldHVybiBlcnI7Cit9CisKK0VYUE9SVF9TWU1CT0woZmF0X2ZyZWVfY2x1c3RlcnMpOworCitpbnQgZmF0X2NvdW50X2ZyZWVfY2x1c3RlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpID0gTVNET1NfU0Ioc2IpOworCXN0cnVjdCBmYXRlbnRfb3BlcmF0aW9ucyAqb3BzID0gc2JpLT5mYXRlbnRfb3BzOworCXN0cnVjdCBmYXRfZW50cnkgZmF0ZW50OworCWludCBlcnIgPSAwLCBmcmVlOworCisJbG9ja19mYXQoc2JpKTsKKwlpZiAoc2JpLT5mcmVlX2NsdXN0ZXJzICE9IC0xKQorCQlnb3RvIG91dDsKKworCWZyZWUgPSAwOworCWZhdGVudF9pbml0KCZmYXRlbnQpOworCWZhdGVudF9zZXRfZW50cnkoJmZhdGVudCwgRkFUX1NUQVJUX0VOVCk7CisJd2hpbGUgKGZhdGVudC5lbnRyeSA8IHNiaS0+bWF4X2NsdXN0ZXIpIHsKKwkJZXJyID0gZmF0X2VudF9yZWFkX2Jsb2NrKHNiLCAmZmF0ZW50KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCisJCWRvIHsKKwkJCWlmIChvcHMtPmVudF9nZXQoJmZhdGVudCkgPT0gRkFUX0VOVF9GUkVFKQorCQkJCWZyZWUrKzsKKwkJfSB3aGlsZSAoZmF0X2VudF9uZXh0KHNiaSwgJmZhdGVudCkpOworCX0KKwlzYmktPmZyZWVfY2x1c3RlcnMgPSBmcmVlOworCWZhdGVudF9icmVsc2UoJmZhdGVudCk7CitvdXQ6CisJdW5sb2NrX2ZhdChzYmkpOworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9mcy9mYXQvZmlsZS5jIGIvZnMvZmF0L2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmZmYTkxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZmF0L2ZpbGUuYwpAQCAtMCwwICsxLDMwOCBAQAorLyoKKyAqICBsaW51eC9mcy9mYXQvZmlsZS5jCisgKgorICogIFdyaXR0ZW4gMTk5MiwxOTkzIGJ5IFdlcm5lciBBbG1lc2JlcmdlcgorICoKKyAqICByZWd1bGFyIGZpbGUgaGFuZGxpbmcgcHJpbWl0aXZlcyBmb3IgZmF0LWJhc2VkIGZpbGVzeXN0ZW1zCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tc2Rvc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworc3RhdGljIHNzaXplX3QgZmF0X2ZpbGVfYWlvX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gaW9jYi0+a2lfZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgYnVmLCBjb3VudCwgcG9zKTsKKwlpZiAocmV0dmFsID4gMCkgeworCQlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwkJTVNET1NfSShpbm9kZSktPmlfYXR0cnMgfD0gQVRUUl9BUkNIOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKy8vCQljaGVjayB0aGUgbG9ja2luZyBydWxlcworLy8JCWlmIChJU19TWU5DKGlub2RlKSkKKy8vCQkJZmF0X3N5bmNfaW5vZGUoaW5vZGUpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgc3NpemVfdCBmYXRfZmlsZV93cml0ZXYoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gZ2VuZXJpY19maWxlX3dyaXRldihmaWxwLCBpb3YsIG5yX3NlZ3MsIHBwb3MpOworCWlmIChyZXR2YWwgPiAwKSB7CisJCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQlNU0RPU19JKGlub2RlKS0+aV9hdHRycyB8PSBBVFRSX0FSQ0g7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgZmF0X2dlbmVyaWNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihpbm9kZS0+aV9zYik7CisJdTMyIF9fdXNlciAqdXNlcl9hdHRyID0gKHUzMiBfX3VzZXIgKilhcmc7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRkFUX0lPQ1RMX0dFVF9BVFRSSUJVVEVTOgorCXsKKwkJdTMyIGF0dHI7CisKKwkJaWYgKGlub2RlLT5pX2lubyA9PSBNU0RPU19ST09UX0lOTykKKwkJCWF0dHIgPSBBVFRSX0RJUjsKKwkJZWxzZQorCQkJYXR0ciA9IGZhdF9hdHRyKGlub2RlKTsKKworCQlyZXR1cm4gcHV0X3VzZXIoYXR0ciwgdXNlcl9hdHRyKTsKKwl9CisJY2FzZSBGQVRfSU9DVExfU0VUX0FUVFJJQlVURVM6CisJeworCQl1MzIgYXR0ciwgb2xkYXR0cjsKKwkJaW50IGVyciwgaXNfZGlyID0gU19JU0RJUihpbm9kZS0+aV9tb2RlKTsKKwkJc3RydWN0IGlhdHRyIGlhOworCisJCWVyciA9IGdldF91c2VyKGF0dHIsIHVzZXJfYXR0cik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCWRvd24oJmlub2RlLT5pX3NlbSk7CisKKwkJaWYgKElTX1JET05MWShpbm9kZSkpIHsKKwkJCWVyciA9IC1FUk9GUzsKKwkJCWdvdG8gdXA7CisJCX0KKworCQkvKgorCQkgKiBBVFRSX1ZPTFVNRSBhbmQgQVRUUl9ESVIgY2Fubm90IGJlIGNoYW5nZWQ7IHRoaXMgYWxzbworCQkgKiBwcmV2ZW50cyB0aGUgdXNlciBmcm9tIHR1cm5pbmcgdXMgaW50byBhIFZGQVQKKwkJICogbG9uZ25hbWUgZW50cnkuICBBbHNvLCB3ZSBvYnZpb3VzbHkgY2FuJ3Qgc2V0CisJCSAqIGFueSBvZiB0aGUgTlRGUyBhdHRyaWJ1dGVzIGluIHRoZSBoaWdoIDI0IGJpdHMuCisJCSAqLworCQlhdHRyICY9IDB4ZmYgJiB+KEFUVFJfVk9MVU1FIHwgQVRUUl9ESVIpOworCQkvKiBNZXJnZSBpbiBBVFRSX1ZPTFVNRSBhbmQgQVRUUl9ESVIgKi8KKwkJYXR0ciB8PSAoTVNET1NfSShpbm9kZSktPmlfYXR0cnMgJiBBVFRSX1ZPTFVNRSkgfAorCQkJKGlzX2RpciA/IEFUVFJfRElSIDogMCk7CisJCW9sZGF0dHIgPSBmYXRfYXR0cihpbm9kZSk7CisKKwkJLyogRXF1aXZhbGVudCB0byBhIGNobW9kKCkgKi8KKwkJaWEuaWFfdmFsaWQgPSBBVFRSX01PREUgfCBBVFRSX0NUSU1FOworCQlpZiAoaXNfZGlyKSB7CisJCQlpYS5pYV9tb2RlID0gTVNET1NfTUtNT0RFKGF0dHIsCisJCQkJU19JUldYVUdPICYgfnNiaS0+b3B0aW9ucy5mc19kbWFzaykKKwkJCQl8IFNfSUZESVI7CisJCX0gZWxzZSB7CisJCQlpYS5pYV9tb2RlID0gTVNET1NfTUtNT0RFKGF0dHIsCisJCQkJKFNfSVJVR08gfCBTX0lXVUdPIHwgKGlub2RlLT5pX21vZGUgJiBTX0lYVUdPKSkKKwkJCQkmIH5zYmktPm9wdGlvbnMuZnNfZm1hc2spCisJCQkJfCBTX0lGUkVHOworCQl9CisKKwkJLyogVGhlIHJvb3QgZGlyZWN0b3J5IGhhcyBubyBhdHRyaWJ1dGVzICovCisJCWlmIChpbm9kZS0+aV9pbm8gPT0gTVNET1NfUk9PVF9JTk8gJiYgYXR0ciAhPSBBVFRSX0RJUikgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gdXA7CisJCX0KKworCQlpZiAoc2JpLT5vcHRpb25zLnN5c19pbW11dGFibGUpIHsKKwkJCWlmICgoYXR0ciB8IG9sZGF0dHIpICYgQVRUUl9TWVMpIHsKKwkJCQlpZiAoIWNhcGFibGUoQ0FQX0xJTlVYX0lNTVVUQUJMRSkpIHsKKwkJCQkJZXJyID0gLUVQRVJNOworCQkJCQlnb3RvIHVwOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIFRoaXMgTVVTVCBiZSBkb25lIGJlZm9yZSBkb2luZyBhbnl0aGluZyBpcnJldmVyc2libGUuLi4gKi8KKwkJZXJyID0gbm90aWZ5X2NoYW5nZShmaWxwLT5mX2RlbnRyeSwgJmlhKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gdXA7CisKKwkJaWYgKHNiaS0+b3B0aW9ucy5zeXNfaW1tdXRhYmxlKSB7CisJCQlpZiAoYXR0ciAmIEFUVFJfU1lTKQorCQkJCWlub2RlLT5pX2ZsYWdzIHw9IFNfSU1NVVRBQkxFOworCQkJZWxzZQorCQkJCWlub2RlLT5pX2ZsYWdzICY9IFNfSU1NVVRBQkxFOworCQl9CisKKwkJTVNET1NfSShpbm9kZSktPmlfYXR0cnMgPSBhdHRyICYgQVRUUl9VTlVTRUQ7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXVwOgorCQl1cCgmaW5vZGUtPmlfc2VtKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CS8qIEluYXBwcm9wcmlhdGUgaW9jdGwgZm9yIGRldmljZSAqLworCX0KK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmYXRfZmlsZV9vcGVyYXRpb25zID0geworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkucmVhZAkJPSBkb19zeW5jX3JlYWQsCisJLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCisJLnJlYWR2CQk9IGdlbmVyaWNfZmlsZV9yZWFkdiwKKwkud3JpdGV2CQk9IGZhdF9maWxlX3dyaXRldiwKKwkuYWlvX3JlYWQJPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCisJLmFpb193cml0ZQk9IGZhdF9maWxlX2Fpb193cml0ZSwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkuaW9jdGwJCT0gZmF0X2dlbmVyaWNfaW9jdGwsCisJLmZzeW5jCQk9IGZpbGVfZnN5bmMsCisJLnNlbmRmaWxlCT0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorfTsKKworaW50IGZhdF9ub3RpZnlfY2hhbmdlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihkZW50cnktPmRfc2IpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IG1hc2ssIGVycm9yID0gMDsKKworCWxvY2tfa2VybmVsKCk7CisKKwkvKiBGQVQgY2Fubm90IHRydW5jYXRlIHRvIGEgbG9uZ2VyIGZpbGUgKi8KKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKKwkJaWYgKGF0dHItPmlhX3NpemUgPiBpbm9kZS0+aV9zaXplKSB7CisJCQllcnJvciA9IC1FUEVSTTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGF0dHIpOworCWlmIChlcnJvcikgeworCQlpZiAoc2JpLT5vcHRpb25zLnF1aWV0KQorCQkJZXJyb3IgPSAwOworCQlnb3RvIG91dDsKKwl9CisJaWYgKCgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCkgJiYKKwkgICAgIChhdHRyLT5pYV91aWQgIT0gc2JpLT5vcHRpb25zLmZzX3VpZCkpIHx8CisJICAgICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCkgJiYKKwkgICAgIChhdHRyLT5pYV9naWQgIT0gc2JpLT5vcHRpb25zLmZzX2dpZCkpIHx8CisJICAgICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpICYmCisJICAgICAoYXR0ci0+aWFfbW9kZSAmIH5NU0RPU19WQUxJRF9NT0RFKSkpCisJCWVycm9yID0gLUVQRVJNOworCisJaWYgKGVycm9yKSB7CisJCWlmIChzYmktPm9wdGlvbnMucXVpZXQpCisJCQllcnJvciA9IDA7CisJCWdvdG8gb3V0OworCX0KKwllcnJvciA9IGlub2RlX3NldGF0dHIoaW5vZGUsIGF0dHIpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJbWFzayA9IHNiaS0+b3B0aW9ucy5mc19kbWFzazsKKwllbHNlCisJCW1hc2sgPSBzYmktPm9wdGlvbnMuZnNfZm1hc2s7CisJaW5vZGUtPmlfbW9kZSAmPSBTX0lGTVQgfCAoU19JUldYVUdPICYgfm1hc2spOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK0VYUE9SVF9TWU1CT0woZmF0X25vdGlmeV9jaGFuZ2UpOworCisvKiBGcmVlIGFsbCBjbHVzdGVycyBhZnRlciB0aGUgc2tpcCd0aCBjbHVzdGVyLiAqLworc3RhdGljIGludCBmYXRfZnJlZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgc2tpcCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJaW50IGVyciwgd2FpdCwgZnJlZV9zdGFydCwgaV9zdGFydCwgaV9sb2dzdGFydDsKKworCWlmIChNU0RPU19JKGlub2RlKS0+aV9zdGFydCA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogV3JpdGUgYSBuZXcgRU9GLCBhbmQgZ2V0IHRoZSByZW1haW5pbmcgY2x1c3RlciBjaGFpbiBmb3IgZnJlZWluZy4KKwkgKi8KKwl3YWl0ID0gSVNfRElSU1lOQyhpbm9kZSk7CisJaWYgKHNraXApIHsKKwkJc3RydWN0IGZhdF9lbnRyeSBmYXRlbnQ7CisJCWludCByZXQsIGZjbHVzLCBkY2x1czsKKworCQlyZXQgPSBmYXRfZ2V0X2NsdXN0ZXIoaW5vZGUsIHNraXAgLSAxLCAmZmNsdXMsICZkY2x1cyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJZWxzZSBpZiAocmV0ID09IEZBVF9FTlRfRU9GKQorCQkJcmV0dXJuIDA7CisKKwkJZmF0ZW50X2luaXQoJmZhdGVudCk7CisJCXJldCA9IGZhdF9lbnRfcmVhZChpbm9kZSwgJmZhdGVudCwgZGNsdXMpOworCQlpZiAocmV0ID09IEZBVF9FTlRfRU9GKSB7CisJCQlmYXRlbnRfYnJlbHNlKCZmYXRlbnQpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAocmV0ID09IEZBVF9FTlRfRlJFRSkgeworCQkJZmF0X2ZzX3BhbmljKHNiLAorCQkJCSAgICAgIiVzOiBpbnZhbGlkIGNsdXN0ZXIgY2hhaW4gKGlfcG9zICVsbGQpIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXywgTVNET1NfSShpbm9kZSktPmlfcG9zKTsKKwkJCXJldCA9IC1FSU87CisJCX0gZWxzZSBpZiAocmV0ID4gMCkgeworCQkJZXJyID0gZmF0X2VudF93cml0ZShpbm9kZSwgJmZhdGVudCwgRkFUX0VOVF9FT0YsIHdhaXQpOworCQkJaWYgKGVycikKKwkJCQlyZXQgPSBlcnI7CisJCX0KKwkJZmF0ZW50X2JyZWxzZSgmZmF0ZW50KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCWZyZWVfc3RhcnQgPSByZXQ7CisJCWlfc3RhcnQgPSBpX2xvZ3N0YXJ0ID0gMDsKKwkJZmF0X2NhY2hlX2ludmFsX2lub2RlKGlub2RlKTsKKwl9IGVsc2UgeworCQlmYXRfY2FjaGVfaW52YWxfaW5vZGUoaW5vZGUpOworCisJCWlfc3RhcnQgPSBmcmVlX3N0YXJ0ID0gTVNET1NfSShpbm9kZSktPmlfc3RhcnQ7CisJCWlfbG9nc3RhcnQgPSBNU0RPU19JKGlub2RlKS0+aV9sb2dzdGFydDsKKwkJTVNET1NfSShpbm9kZSktPmlfc3RhcnQgPSAwOworCQlNU0RPU19JKGlub2RlKS0+aV9sb2dzdGFydCA9IDA7CisJfQorCU1TRE9TX0koaW5vZGUpLT5pX2F0dHJzIHw9IEFUVFJfQVJDSDsKKwlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpZiAod2FpdCkgeworCQllcnIgPSBmYXRfc3luY19pbm9kZShpbm9kZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycm9yOworCX0gZWxzZQorCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlpbm9kZS0+aV9ibG9ja3MgPSBza2lwIDw8IChNU0RPU19TQihzYiktPmNsdXN0ZXJfYml0cyAtIDkpOworCisJLyogRnJlZWluZyB0aGUgcmVtYWluZWQgY2x1c3RlciBjaGFpbiAqLworCXJldHVybiBmYXRfZnJlZV9jbHVzdGVycyhpbm9kZSwgZnJlZV9zdGFydCk7CisKK2Vycm9yOgorCWlmIChpX3N0YXJ0KSB7CisJCU1TRE9TX0koaW5vZGUpLT5pX3N0YXJ0ID0gaV9zdGFydDsKKwkJTVNET1NfSShpbm9kZSktPmlfbG9nc3RhcnQgPSBpX2xvZ3N0YXJ0OworCX0KKwlyZXR1cm4gZXJyOworfQorCit2b2lkIGZhdF90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihpbm9kZS0+aV9zYik7CisJY29uc3QgdW5zaWduZWQgaW50IGNsdXN0ZXJfc2l6ZSA9IHNiaS0+Y2x1c3Rlcl9zaXplOworCWludCBucl9jbHVzdGVyczsKKworCS8qCisJICogVGhpcyBwcm90ZWN0cyBhZ2FpbnN0IHRydW5jYXRpbmcgYSBmaWxlIGJpZ2dlciB0aGFuIGl0IHdhcyB0aGVuCisJICogdHJ5aW5nIHRvIHdyaXRlIGludG8gdGhlIGhvbGUuCisJICovCisJaWYgKE1TRE9TX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA+IGlub2RlLT5pX3NpemUpCisJCU1TRE9TX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA9IGlub2RlLT5pX3NpemU7CisKKwlucl9jbHVzdGVycyA9IChpbm9kZS0+aV9zaXplICsgKGNsdXN0ZXJfc2l6ZSAtIDEpKSA+PiBzYmktPmNsdXN0ZXJfYml0czsKKworCWxvY2tfa2VybmVsKCk7CisJZmF0X2ZyZWUoaW5vZGUsIG5yX2NsdXN0ZXJzKTsKKwl1bmxvY2tfa2VybmVsKCk7Cit9CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGZhdF9maWxlX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnRydW5jYXRlCT0gZmF0X3RydW5jYXRlLAorCS5zZXRhdHRyCT0gZmF0X25vdGlmeV9jaGFuZ2UsCit9OwpkaWZmIC0tZ2l0IGEvZnMvZmF0L2lub2RlLmMgYi9mcy9mYXQvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2NlZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZmF0L2lub2RlLmMKQEAgLTAsMCArMSwxMzUxIEBACisvKgorICogIGxpbnV4L2ZzL2ZhdC9pbm9kZS5jCisgKgorICogIFdyaXR0ZW4gMTk5MiwxOTkzIGJ5IFdlcm5lciBBbG1lc2JlcmdlcgorICogIFZGQVQgZXh0ZW5zaW9ucyBieSBHb3Jkb24gQ2hhZmZlZSwgbWVyZ2VkIHdpdGggbXNkb3MgZnMgYnkgSGVucmlrIFN0b3JuZXIKKyAqICBSZXdyaXR0ZW4gZm9yIHRoZSBjb25zdGFudCBpbnVtYmVycyBzdXBwb3J0IGJ5IEFsIFZpcm8KKyAqCisgKiAgRml4ZXM6CisgKgorICoJTWF4IENvaGFuOiBGaXhlZCBpbnZhbGlkIEZTSU5GTyBvZmZzZXQgd2hlbiBpbmZvX3NlY3RvciBpcyAwCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tc2Rvc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaWZuZGVmIENPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQKKy8qIGlmIHVzZXIgZG9uJ3Qgc2VsZWN0IFZGQVQsIHRoaXMgaXMgdW5kZWZpbmVkLiAqLworI2RlZmluZSBDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUCSIiCisjZW5kaWYKKworc3RhdGljIGludCBmYXRfZGVmYXVsdF9jb2RlcGFnZSA9IENPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRTsKK3N0YXRpYyBjaGFyIGZhdF9kZWZhdWx0X2lvY2hhcnNldFtdID0gQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVDsKKworCitzdGF0aWMgaW50IGZhdF9hZGRfY2x1c3RlcihzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWludCBlcnIsIGNsdXN0ZXI7CisKKwllcnIgPSBmYXRfYWxsb2NfY2x1c3RlcnMoaW5vZGUsICZjbHVzdGVyLCAxKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCS8qIEZJWE1FOiB0aGlzIGNsdXN0ZXIgc2hvdWxkIGJlIGFkZGVkIGFmdGVyIGRhdGEgb2YgdGhpcworCSAqIGNsdXN0ZXIgaXMgd3JpdGVkICovCisJZXJyID0gZmF0X2NoYWluX2FkZChpbm9kZSwgY2x1c3RlciwgMSk7CisJaWYgKGVycikKKwkJZmF0X2ZyZWVfY2x1c3RlcnMoaW5vZGUsIGNsdXN0ZXIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZmF0X2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssCisJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXNlY3Rvcl90IHBoeXM7CisJaW50IGVycjsKKworCWVyciA9IGZhdF9ibWFwKGlub2RlLCBpYmxvY2ssICZwaHlzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWlmIChwaHlzKSB7CisJCW1hcF9iaChiaF9yZXN1bHQsIHNiLCBwaHlzKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghY3JlYXRlKQorCQlyZXR1cm4gMDsKKwlpZiAoaWJsb2NrICE9IE1TRE9TX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA+PiBzYi0+c19ibG9ja3NpemVfYml0cykgeworCQlmYXRfZnNfcGFuaWMoc2IsICJjb3JydXB0ZWQgZmlsZSBzaXplIChpX3BvcyAlbGxkLCAlbGxkKSIsCisJCQkgICAgIE1TRE9TX0koaW5vZGUpLT5pX3BvcywgTVNET1NfSShpbm9kZSktPm1tdV9wcml2YXRlKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICghKCh1bnNpZ25lZCBsb25nKWlibG9jayAmIChNU0RPU19TQihzYiktPnNlY19wZXJfY2x1cyAtIDEpKSkgeworCQllcnIgPSBmYXRfYWRkX2NsdXN0ZXIoaW5vZGUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisJTVNET1NfSShpbm9kZSktPm1tdV9wcml2YXRlICs9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwllcnIgPSBmYXRfYm1hcChpbm9kZSwgaWJsb2NrLCAmcGh5cyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlpZiAoIXBoeXMpCisJCUJVRygpOworCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJbWFwX2JoKGJoX3Jlc3VsdCwgc2IsIHBoeXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZhdF93cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXJldHVybiBibG9ja193cml0ZV9mdWxsX3BhZ2UocGFnZSwgZmF0X2dldF9ibG9jaywgd2JjKTsKK30KKworc3RhdGljIGludCBmYXRfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLCBmYXRfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIGludCBmYXRfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICAgIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXJldHVybiBjb250X3ByZXBhcmVfd3JpdGUocGFnZSwgZnJvbSwgdG8sIGZhdF9nZXRfYmxvY2ssCisJCQkJICAmTVNET1NfSShwYWdlLT5tYXBwaW5nLT5ob3N0KS0+bW11X3ByaXZhdGUpOworfQorCitzdGF0aWMgc2VjdG9yX3QgX2ZhdF9ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jaykKK3sKKwlyZXR1cm4gZ2VuZXJpY19ibG9ja19ibWFwKG1hcHBpbmcsIGJsb2NrLCBmYXRfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZmF0X2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gZmF0X3JlYWRwYWdlLAorCS53cml0ZXBhZ2UJPSBmYXRfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UJPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUJPSBmYXRfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gZ2VuZXJpY19jb21taXRfd3JpdGUsCisJLmJtYXAJCT0gX2ZhdF9ibWFwCit9OworCisvKgorICogTmV3IEZBVCBpbm9kZSBzdHVmZi4gV2UgZG8gdGhlIGZvbGxvd2luZzoKKyAqCWEpIGlfaW5vIGlzIGNvbnN0YW50IGFuZCBoYXMgbm90aGluZyB3aXRoIG9uLWRpc2sgbG9jYXRpb24uCisgKgliKSBGQVQgbWFuYWdlcyBpdHMgb3duIGNhY2hlIG9mIGRpcmVjdG9yeSBlbnRyaWVzLgorICoJYykgKlRoaXMqIGNhY2hlIGlzIGluZGV4ZWQgYnkgb24tZGlzayBsb2NhdGlvbi4KKyAqCWQpIGlub2RlIGhhcyBhbiBhc3NvY2lhdGVkIGRpcmVjdG9yeSBlbnRyeSwgYWxsIHJpZ2h0LCBidXQKKyAqCQlpdCBtYXkgYmUgdW5oYXNoZWQuCisgKgllKSBjdXJyZW50bHkgZW50cmllcyBhcmUgc3RvcmVkIHdpdGhpbiBzdHJ1Y3QgaW5vZGUuIFRoYXQgc2hvdWxkCisgKgkJY2hhbmdlLgorICoJZikgd2UgZGVhbCB3aXRoIHJhY2VzIGluIHRoZSBmb2xsb3dpbmcgd2F5OgorICoJCTEuIHJlYWRkaXIoKSBhbmQgbG9va3VwKCkgZG8gRkFULWRpci1jYWNoZSBsb29rdXAuCisgKgkJMi4gcmVuYW1lKCkgdW5oYXNoZXMgdGhlIEYtZC1jIGVudHJ5IGFuZCByZWhhc2hlcyBpdCBpbgorICoJCQlhIG5ldyBwbGFjZS4KKyAqCQkzLiB1bmxpbmsoKSBhbmQgcm1kaXIoKSB1bmhhc2ggRi1kLWMgZW50cnkuCisgKgkJNC4gZmF0X3dyaXRlX2lub2RlKCkgY2hlY2tzIHdoZXRoZXIgdGhlIHRoaW5nIGlzIHVuaGFzaGVkLgorICoJCQlJZiBpdCBpcyB3ZSBzaWxlbnRseSByZXR1cm4uIElmIGl0IGlzbid0IHdlIGRvIGJyZWFkKCksCisgKgkJCWNoZWNrIGlmIHRoZSBsb2NhdGlvbiBpcyBzdGlsbCB2YWxpZCBhbmQgcmV0cnkgaWYgaXQKKyAqCQkJaXNuJ3QuIE90aGVyd2lzZSB3ZSBkbyBjaGFuZ2VzLgorICoJCTUuIFNwaW5sb2NrIGlzIHVzZWQgdG8gcHJvdGVjdCBoYXNoL3VuaGFzaC9sb2NhdGlvbiBjaGVjay9sb29rdXAKKyAqCQk2LiBmYXRfY2xlYXJfaW5vZGUoKSB1bmhhc2hlcyB0aGUgRi1kLWMgZW50cnkuCisgKgkJNy4gbG9va3VwKCkgYW5kIHJlYWRkaXIoKSBkbyBpZ3JhYigpIGlmIHRoZXkgZmluZCBhIEYtZC1jIGVudHJ5CisgKgkJCWFuZCBjb25zaWRlciBuZWdhdGl2ZSByZXN1bHQgYXMgY2FjaGUgbWlzcy4KKyAqLworCitzdGF0aWMgdm9pZCBmYXRfaGFzaF9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pbml0KCZzYmktPmlub2RlX2hhc2hfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IEZBVF9IQVNIX1NJWkU7IGkrKykKKwkJSU5JVF9ITElTVF9IRUFEKCZzYmktPmlub2RlX2hhc2h0YWJsZVtpXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBmYXRfaGFzaChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBsb2ZmX3QgaV9wb3MpCit7CisJdW5zaWduZWQgbG9uZyB0bXAgPSAodW5zaWduZWQgbG9uZylpX3BvcyB8ICh1bnNpZ25lZCBsb25nKSBzYjsKKwl0bXAgPSB0bXAgKyAodG1wID4+IEZBVF9IQVNIX0JJVFMpICsgKHRtcCA+PiBGQVRfSEFTSF9CSVRTICogMik7CisJcmV0dXJuIHRtcCAmIEZBVF9IQVNIX01BU0s7Cit9CisKK3ZvaWQgZmF0X2F0dGFjaChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgaV9wb3MpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisKKwlzcGluX2xvY2soJnNiaS0+aW5vZGVfaGFzaF9sb2NrKTsKKwlNU0RPU19JKGlub2RlKS0+aV9wb3MgPSBpX3BvczsKKwlobGlzdF9hZGRfaGVhZCgmTVNET1NfSShpbm9kZSktPmlfZmF0X2hhc2gsCisJCQlzYmktPmlub2RlX2hhc2h0YWJsZSArIGZhdF9oYXNoKHNiLCBpX3BvcykpOworCXNwaW5fdW5sb2NrKCZzYmktPmlub2RlX2hhc2hfbG9jayk7Cit9CisKK0VYUE9SVF9TWU1CT0woZmF0X2F0dGFjaCk7CisKK3ZvaWQgZmF0X2RldGFjaChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihpbm9kZS0+aV9zYik7CisJc3Bpbl9sb2NrKCZzYmktPmlub2RlX2hhc2hfbG9jayk7CisJTVNET1NfSShpbm9kZSktPmlfcG9zID0gMDsKKwlobGlzdF9kZWxfaW5pdCgmTVNET1NfSShpbm9kZSktPmlfZmF0X2hhc2gpOworCXNwaW5fdW5sb2NrKCZzYmktPmlub2RlX2hhc2hfbG9jayk7Cit9CisKK0VYUE9SVF9TWU1CT0woZmF0X2RldGFjaCk7CisKK3N0cnVjdCBpbm9kZSAqZmF0X2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgbG9mZl90IGlfcG9zKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSBzYmktPmlub2RlX2hhc2h0YWJsZSArIGZhdF9oYXNoKHNiLCBpX3Bvcyk7CisJc3RydWN0IGhsaXN0X25vZGUgKl9wOworCXN0cnVjdCBtc2Rvc19pbm9kZV9pbmZvICppOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCisJc3Bpbl9sb2NrKCZzYmktPmlub2RlX2hhc2hfbG9jayk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnkoaSwgX3AsIGhlYWQsIGlfZmF0X2hhc2gpIHsKKwkJQlVHX09OKGktPnZmc19pbm9kZS5pX3NiICE9IHNiKTsKKwkJaWYgKGktPmlfcG9zICE9IGlfcG9zKQorCQkJY29udGludWU7CisJCWlub2RlID0gaWdyYWIoJmktPnZmc19pbm9kZSk7CisJCWlmIChpbm9kZSkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmc2JpLT5pbm9kZV9oYXNoX2xvY2spOworCXJldHVybiBpbm9kZTsKK30KKworc3RhdGljIGludCBpc19leGVjKHVuc2lnbmVkIGNoYXIgKmV4dGVuc2lvbikKK3sKKwl1bnNpZ25lZCBjaGFyICpleGVfZXh0ZW5zaW9ucyA9ICJFWEVDT01CQVQiLCAqd2FsazsKKworCWZvciAod2FsayA9IGV4ZV9leHRlbnNpb25zOyAqd2Fsazsgd2FsayArPSAzKQorCQlpZiAoIXN0cm5jbXAoZXh0ZW5zaW9uLCB3YWxrLCAzKSkKKwkJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZhdF9jYWxjX2Rpcl9zaXplKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKGlub2RlLT5pX3NiKTsKKwlpbnQgcmV0LCBmY2x1cywgZGNsdXM7CisKKwlpbm9kZS0+aV9zaXplID0gMDsKKwlpZiAoTVNET1NfSShpbm9kZSktPmlfc3RhcnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBmYXRfZ2V0X2NsdXN0ZXIoaW5vZGUsIEZBVF9FTlRfRU9GLCAmZmNsdXMsICZkY2x1cyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaW5vZGUtPmlfc2l6ZSA9IChmY2x1cyArIDEpIDw8IHNiaS0+Y2x1c3Rlcl9iaXRzOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGRvZXNuJ3QgZGVhbCB3aXRoIHJvb3QgaW5vZGUgKi8KK3N0YXRpYyBpbnQgZmF0X2ZpbGxfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqZGUpCit7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKGlub2RlLT5pX3NiKTsKKwlpbnQgZXJyb3I7CisKKwlNU0RPU19JKGlub2RlKS0+aV9wb3MgPSAwOworCWlub2RlLT5pX3VpZCA9IHNiaS0+b3B0aW9ucy5mc191aWQ7CisJaW5vZGUtPmlfZ2lkID0gc2JpLT5vcHRpb25zLmZzX2dpZDsKKwlpbm9kZS0+aV92ZXJzaW9uKys7CisJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGdldF9zZWNvbmRzKCk7CisKKwlpZiAoKGRlLT5hdHRyICYgQVRUUl9ESVIpICYmICFJU19GUkVFKGRlLT5uYW1lKSkgeworCQlpbm9kZS0+aV9nZW5lcmF0aW9uICY9IH4xOworCQlpbm9kZS0+aV9tb2RlID0gTVNET1NfTUtNT0RFKGRlLT5hdHRyLAorCQkJU19JUldYVUdPICYgfnNiaS0+b3B0aW9ucy5mc19kbWFzaykgfCBTX0lGRElSOworCQlpbm9kZS0+aV9vcCA9IHNiaS0+ZGlyX29wczsKKwkJaW5vZGUtPmlfZm9wID0gJmZhdF9kaXJfb3BlcmF0aW9uczsKKworCQlNU0RPU19JKGlub2RlKS0+aV9zdGFydCA9IGxlMTZfdG9fY3B1KGRlLT5zdGFydCk7CisJCWlmIChzYmktPmZhdF9iaXRzID09IDMyKQorCQkJTVNET1NfSShpbm9kZSktPmlfc3RhcnQgfD0gKGxlMTZfdG9fY3B1KGRlLT5zdGFydGhpKSA8PCAxNik7CisKKwkJTVNET1NfSShpbm9kZSktPmlfbG9nc3RhcnQgPSBNU0RPU19JKGlub2RlKS0+aV9zdGFydDsKKwkJZXJyb3IgPSBmYXRfY2FsY19kaXJfc2l6ZShpbm9kZSk7CisJCWlmIChlcnJvciA8IDApCisJCQlyZXR1cm4gZXJyb3I7CisJCU1TRE9TX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA9IGlub2RlLT5pX3NpemU7CisKKwkJaW5vZGUtPmlfbmxpbmsgPSBmYXRfc3ViZGlycyhpbm9kZSk7CisJfSBlbHNlIHsgLyogbm90IGEgZGlyZWN0b3J5ICovCisJCWlub2RlLT5pX2dlbmVyYXRpb24gfD0gMTsKKwkJaW5vZGUtPmlfbW9kZSA9IE1TRE9TX01LTU9ERShkZS0+YXR0ciwKKwkJICAgICgoc2JpLT5vcHRpb25zLnNob3dleGVjICYmCisJCQkhaXNfZXhlYyhkZS0+ZXh0KSkKKwkJCT8gU19JUlVHT3xTX0lXVUdPIDogU19JUldYVUdPKQorCQkgICAgJiB+c2JpLT5vcHRpb25zLmZzX2ZtYXNrKSB8IFNfSUZSRUc7CisJCU1TRE9TX0koaW5vZGUpLT5pX3N0YXJ0ID0gbGUxNl90b19jcHUoZGUtPnN0YXJ0KTsKKwkJaWYgKHNiaS0+ZmF0X2JpdHMgPT0gMzIpCisJCQlNU0RPU19JKGlub2RlKS0+aV9zdGFydCB8PSAobGUxNl90b19jcHUoZGUtPnN0YXJ0aGkpIDw8IDE2KTsKKworCQlNU0RPU19JKGlub2RlKS0+aV9sb2dzdGFydCA9IE1TRE9TX0koaW5vZGUpLT5pX3N0YXJ0OworCQlpbm9kZS0+aV9zaXplID0gbGUzMl90b19jcHUoZGUtPnNpemUpOworCQlpbm9kZS0+aV9vcCA9ICZmYXRfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmZmF0X2ZpbGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmZmF0X2FvcHM7CisJCU1TRE9TX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA9IGlub2RlLT5pX3NpemU7CisJfQorCWlmIChkZS0+YXR0ciAmIEFUVFJfU1lTKSB7CisJCWlmIChzYmktPm9wdGlvbnMuc3lzX2ltbXV0YWJsZSkKKwkJCWlub2RlLT5pX2ZsYWdzIHw9IFNfSU1NVVRBQkxFOworCX0KKwlNU0RPU19JKGlub2RlKS0+aV9hdHRycyA9IGRlLT5hdHRyICYgQVRUUl9VTlVTRUQ7CisJLyogdGhpcyBpcyBhcyBjbG9zZSB0byB0aGUgdHJ1dGggYXMgd2UgY2FuIGdldCAuLi4gKi8KKwlpbm9kZS0+aV9ibGtzaXplID0gc2JpLT5jbHVzdGVyX3NpemU7CisJaW5vZGUtPmlfYmxvY2tzID0gKChpbm9kZS0+aV9zaXplICsgKHNiaS0+Y2x1c3Rlcl9zaXplIC0gMSkpCisJCQkgICAmIH4oKGxvZmZfdClzYmktPmNsdXN0ZXJfc2l6ZSAtIDEpKSA+PiA5OworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGlub2RlLT5pX2F0aW1lLnR2X3NlYyA9CisJCWRhdGVfZG9zMnVuaXgobGUxNl90b19jcHUoZGUtPnRpbWUpLCBsZTE2X3RvX2NwdShkZS0+ZGF0ZSkpOworCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSBpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gMDsKKwlpZiAoc2JpLT5vcHRpb25zLmlzdmZhdCkgeworCQlpbnQgc2VjcyA9IGRlLT5jdGltZV9jcyAvIDEwMDsKKwkJaW50IGNzZWNzID0gZGUtPmN0aW1lX2NzICUgMTAwOworCQlpbm9kZS0+aV9jdGltZS50dl9zZWMgID0KKwkJCWRhdGVfZG9zMnVuaXgobGUxNl90b19jcHUoZGUtPmN0aW1lKSwKKwkJCQkgICAgICBsZTE2X3RvX2NwdShkZS0+Y2RhdGUpKSArIHNlY3M7CisJCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSBjc2VjcyAqIDEwMDAwMDAwOworCX0gZWxzZQorCQlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpbm9kZSAqZmF0X2J1aWxkX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQlzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICpkZSwgbG9mZl90IGlfcG9zKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGVycjsKKworCWlub2RlID0gZmF0X2lnZXQoc2IsIGlfcG9zKTsKKwlpZiAoaW5vZGUpCisJCWdvdG8gb3V0OworCWlub2RlID0gbmV3X2lub2RlKHNiKTsKKwlpZiAoIWlub2RlKSB7CisJCWlub2RlID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJZ290byBvdXQ7CisJfQorCWlub2RlLT5pX2lubyA9IGl1bmlxdWUoc2IsIE1TRE9TX1JPT1RfSU5PKTsKKwlpbm9kZS0+aV92ZXJzaW9uID0gMTsKKwllcnIgPSBmYXRfZmlsbF9pbm9kZShpbm9kZSwgZGUpOworCWlmIChlcnIpIHsKKwkJaXB1dChpbm9kZSk7CisJCWlub2RlID0gRVJSX1BUUihlcnIpOworCQlnb3RvIG91dDsKKwl9CisJZmF0X2F0dGFjaChpbm9kZSwgaV9wb3MpOworCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKK291dDoKKwlyZXR1cm4gaW5vZGU7Cit9CisKK0VYUE9SVF9TWU1CT0woZmF0X2J1aWxkX2lub2RlKTsKKworc3RhdGljIHZvaWQgZmF0X2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmICghaXNfYmFkX2lub2RlKGlub2RlKSkgeworCQlpbm9kZS0+aV9zaXplID0gMDsKKwkJZmF0X3RydW5jYXRlKGlub2RlKTsKKwl9CisJY2xlYXJfaW5vZGUoaW5vZGUpOworfQorCitzdGF0aWMgdm9pZCBmYXRfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpID0gTVNET1NfU0IoaW5vZGUtPmlfc2IpOworCisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCisJCXJldHVybjsKKwlsb2NrX2tlcm5lbCgpOworCXNwaW5fbG9jaygmc2JpLT5pbm9kZV9oYXNoX2xvY2spOworCWZhdF9jYWNoZV9pbnZhbF9pbm9kZShpbm9kZSk7CisJaGxpc3RfZGVsX2luaXQoJk1TRE9TX0koaW5vZGUpLT5pX2ZhdF9oYXNoKTsKKwlzcGluX3VubG9jaygmc2JpLT5pbm9kZV9oYXNoX2xvY2spOworCXVubG9ja19rZXJuZWwoKTsKK30KKworc3RhdGljIHZvaWQgZmF0X3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCisJCWZhdF9jbHVzdGVyc19mbHVzaChzYik7CisKKwlpZiAoc2JpLT5ubHNfZGlzaykgeworCQl1bmxvYWRfbmxzKHNiaS0+bmxzX2Rpc2spOworCQlzYmktPm5sc19kaXNrID0gTlVMTDsKKwkJc2JpLT5vcHRpb25zLmNvZGVwYWdlID0gZmF0X2RlZmF1bHRfY29kZXBhZ2U7CisJfQorCWlmIChzYmktPm5sc19pbykgeworCQl1bmxvYWRfbmxzKHNiaS0+bmxzX2lvKTsKKwkJc2JpLT5ubHNfaW8gPSBOVUxMOworCX0KKwlpZiAoc2JpLT5vcHRpb25zLmlvY2hhcnNldCAhPSBmYXRfZGVmYXVsdF9pb2NoYXJzZXQpIHsKKwkJa2ZyZWUoc2JpLT5vcHRpb25zLmlvY2hhcnNldCk7CisJCXNiaS0+b3B0aW9ucy5pb2NoYXJzZXQgPSBmYXRfZGVmYXVsdF9pb2NoYXJzZXQ7CisJfQorCisJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CisJa2ZyZWUoc2JpKTsKK30KKworc3RhdGljIGttZW1fY2FjaGVfdCAqZmF0X2lub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqZmF0X2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IG1zZG9zX2lub2RlX2luZm8gKmVpOworCWVpID0ga21lbV9jYWNoZV9hbGxvYyhmYXRfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBmYXRfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShmYXRfaW5vZGVfY2FjaGVwLCBNU0RPU19JKGlub2RlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IG1zZG9zX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBtc2Rvc19pbm9kZV9pbmZvICopZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikgeworCQlzcGluX2xvY2tfaW5pdCgmZWktPmNhY2hlX2xydV9sb2NrKTsKKwkJZWktPm5yX2NhY2hlcyA9IDA7CisJCWVpLT5jYWNoZV92YWxpZF9pZCA9IEZBVF9DQUNIRV9WQUxJRCArIDE7CisJCUlOSVRfTElTVF9IRUFEKCZlaS0+Y2FjaGVfbHJ1KTsKKwkJSU5JVF9ITElTVF9OT0RFKCZlaS0+aV9mYXRfaGFzaCk7CisJCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBmYXRfaW5pdF9pbm9kZWNhY2hlKHZvaWQpCit7CisJZmF0X2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJmYXRfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgbXNkb3NfaW5vZGVfaW5mbyksCisJCQkJCSAgICAgMCwgU0xBQl9SRUNMQUlNX0FDQ09VTlQsCisJCQkJCSAgICAgaW5pdF9vbmNlLCBOVUxMKTsKKwlpZiAoZmF0X2lub2RlX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZhdF9kZXN0cm95X2lub2RlY2FjaGUodm9pZCkKK3sKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGZhdF9pbm9kZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9JTkZPICJmYXRfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworc3RhdGljIGludCBmYXRfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisJKmZsYWdzIHw9IE1TX05PRElSQVRJTUUgfCAoc2JpLT5vcHRpb25zLmlzdmZhdCA/IDAgOiBNU19OT0FUSU1FKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmYXRfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCit7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKworCS8qIElmIHRoZSBjb3VudCBvZiBmcmVlIGNsdXN0ZXIgaXMgc3RpbGwgdW5rbm93biwgY291bnRzIGl0IGhlcmUuICovCisJaWYgKHNiaS0+ZnJlZV9jbHVzdGVycyA9PSAtMSkgeworCQlpbnQgZXJyID0gZmF0X2NvdW50X2ZyZWVfY2x1c3RlcnMoc2IpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlidWYtPmZfdHlwZSA9IHNiLT5zX21hZ2ljOworCWJ1Zi0+Zl9ic2l6ZSA9IHNiaS0+Y2x1c3Rlcl9zaXplOworCWJ1Zi0+Zl9ibG9ja3MgPSBzYmktPm1heF9jbHVzdGVyIC0gRkFUX1NUQVJUX0VOVDsKKwlidWYtPmZfYmZyZWUgPSBzYmktPmZyZWVfY2x1c3RlcnM7CisJYnVmLT5mX2JhdmFpbCA9IHNiaS0+ZnJlZV9jbHVzdGVyczsKKwlidWYtPmZfbmFtZWxlbiA9IHNiaS0+b3B0aW9ucy5pc3ZmYXQgPyAyNjAgOiAxMjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZhdF93cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgd2FpdCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKnJhd19lbnRyeTsKKwlsb2ZmX3QgaV9wb3M7CisJaW50IGVyciA9IDA7CisKK3JldHJ5OgorCWlfcG9zID0gTVNET1NfSShpbm9kZSktPmlfcG9zOworCWlmIChpbm9kZS0+aV9pbm8gPT0gTVNET1NfUk9PVF9JTk8gfHwgIWlfcG9zKQorCQlyZXR1cm4gMDsKKworCWxvY2tfa2VybmVsKCk7CisJYmggPSBzYl9icmVhZChzYiwgaV9wb3MgPj4gc2JpLT5kaXJfcGVyX2Jsb2NrX2JpdHMpOworCWlmICghYmgpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGQVQ6IHVuYWJsZSB0byByZWFkIGlub2RlIGJsb2NrICIKKwkJICAgICAgICJmb3IgdXBkYXRpbmcgKGlfcG9zICVsbGQpXG4iLCBpX3Bvcyk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKwlzcGluX2xvY2soJnNiaS0+aW5vZGVfaGFzaF9sb2NrKTsKKwlpZiAoaV9wb3MgIT0gTVNET1NfSShpbm9kZSktPmlfcG9zKSB7CisJCXNwaW5fdW5sb2NrKCZzYmktPmlub2RlX2hhc2hfbG9jayk7CisJCWJyZWxzZShiaCk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJZ290byByZXRyeTsKKwl9CisKKwlyYXdfZW50cnkgPSAmKChzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICopIChiaC0+Yl9kYXRhKSkKKwkgICAgW2lfcG9zICYgKHNiaS0+ZGlyX3Blcl9ibG9jayAtIDEpXTsKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJcmF3X2VudHJ5LT5zaXplID0gMDsKKwllbHNlCisJCXJhd19lbnRyeS0+c2l6ZSA9IGNwdV90b19sZTMyKGlub2RlLT5pX3NpemUpOworCXJhd19lbnRyeS0+YXR0ciA9IGZhdF9hdHRyKGlub2RlKTsKKwlyYXdfZW50cnktPnN0YXJ0ID0gY3B1X3RvX2xlMTYoTVNET1NfSShpbm9kZSktPmlfbG9nc3RhcnQpOworCXJhd19lbnRyeS0+c3RhcnRoaSA9IGNwdV90b19sZTE2KE1TRE9TX0koaW5vZGUpLT5pX2xvZ3N0YXJ0ID4+IDE2KTsKKwlmYXRfZGF0ZV91bml4MmRvcyhpbm9kZS0+aV9tdGltZS50dl9zZWMsICZyYXdfZW50cnktPnRpbWUsICZyYXdfZW50cnktPmRhdGUpOworCWlmIChzYmktPm9wdGlvbnMuaXN2ZmF0KSB7CisJCWZhdF9kYXRlX3VuaXgyZG9zKGlub2RlLT5pX2N0aW1lLnR2X3NlYywmcmF3X2VudHJ5LT5jdGltZSwmcmF3X2VudHJ5LT5jZGF0ZSk7CisJCXJhd19lbnRyeS0+Y3RpbWVfY3MgPSAoaW5vZGUtPmlfY3RpbWUudHZfc2VjICYgMSkgKiAxMDAgKworCQkJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyAvIDEwMDAwMDAwOworCX0KKwlzcGluX3VubG9jaygmc2JpLT5pbm9kZV9oYXNoX2xvY2spOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlpZiAod2FpdCkKKwkJZXJyID0gc3luY19kaXJ0eV9idWZmZXIoYmgpOworCWJyZWxzZShiaCk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBmYXRfc3luY19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBmYXRfd3JpdGVfaW5vZGUoaW5vZGUsIDEpOworfQorCitFWFBPUlRfU1lNQk9MKGZhdF9zeW5jX2lub2RlKTsKKworc3RhdGljIGludCBmYXRfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHZmc21vdW50ICptbnQpOworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGZhdF9zb3BzID0geworCS5hbGxvY19pbm9kZQk9IGZhdF9hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IGZhdF9kZXN0cm95X2lub2RlLAorCS53cml0ZV9pbm9kZQk9IGZhdF93cml0ZV9pbm9kZSwKKwkuZGVsZXRlX2lub2RlCT0gZmF0X2RlbGV0ZV9pbm9kZSwKKwkucHV0X3N1cGVyCT0gZmF0X3B1dF9zdXBlciwKKwkuc3RhdGZzCQk9IGZhdF9zdGF0ZnMsCisJLmNsZWFyX2lub2RlCT0gZmF0X2NsZWFyX2lub2RlLAorCS5yZW1vdW50X2ZzCT0gZmF0X3JlbW91bnQsCisKKwkucmVhZF9pbm9kZQk9IG1ha2VfYmFkX2lub2RlLAorCisJLnNob3dfb3B0aW9ucwk9IGZhdF9zaG93X29wdGlvbnMsCit9OworCisvKgorICogYSBGQVQgZmlsZSBoYW5kbGUgd2l0aCBmaHR5cGUgMyBpcworICogIDAvICBpX2lubyAtIGZvciBmYXN0LCByZWxpYWJsZSBsb29rdXAgaWYgc3RpbGwgaW4gdGhlIGNhY2hlCisgKiAgMS8gIGlfZ2VuZXJhdGlvbiAtIHRvIHNlZSBpZiBpX2lubyBpcyBzdGlsbCB2YWxpZAorICogICAgICAgICAgYml0IDAgPT0gMCBpZmYgZGlyZWN0b3J5CisgKiAgMi8gIGlfcG9zKDgtMzkpIC0gaWYgaW5vIGhhcyBjaGFuZ2VkLCBidXQgc3RpbGwgaW4gY2FjaGUKKyAqICAzLyAgaV9wb3MoNC03KXxpX2xvZ3N0YXJ0IC0gdG8gc2VtaS12ZXJpZnkgaW5vZGUgZm91bmQgYXQgaV9wb3MKKyAqICA0LyAgaV9wb3MoMC0zKXxwYXJlbnQtPmlfbG9nc3RhcnQgLSBtYXliZSB1c2VkIHRvIGh1bnQgZm9yIHRoZSBmaWxlIG9uIGRpc2MKKyAqCisgKiBIYWNrIGZvciBORlN2MjogTWF4aW11bSBGQVQgZW50cnkgbnVtYmVyIGlzIDI4Yml0cyBhbmQgbWF4aW11bQorICogaV9wb3MgaXMgNDBiaXRzIChibG9ja25yKDMyKSArIGRpciBvZmZzZXQoOCkpLCBzbyB0d28gNGJpdHMKKyAqIG9mIGlfbG9nc3RhcnQgaXMgdXNlZCB0byBzdG9yZSB0aGUgZGlyZWN0b3J5IGVudHJ5IG9mZnNldC4KKyAqLworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqCitmYXRfZGVjb2RlX2ZoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIF9fdTMyICpmaCwgaW50IGxlbiwgaW50IGZodHlwZSwKKwkgICAgICBpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCisJICAgICAgdm9pZCAqY29udGV4dCkKK3sKKwlpZiAoZmh0eXBlICE9IDMpCisJCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOworCWlmIChsZW4gPCA1KQorCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKKworCXJldHVybiBzYi0+c19leHBvcnRfb3AtPmZpbmRfZXhwb3J0ZWRfZGVudHJ5KHNiLCBmaCwgTlVMTCwgYWNjZXB0YWJsZSwgY29udGV4dCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpmYXRfZ2V0X2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICppbnVtcCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlzdHJ1Y3QgZGVudHJ5ICpyZXN1bHQ7CisJX191MzIgKmZoID0gaW51bXA7CisKKwlpbm9kZSA9IGlnZXQoc2IsIGZoWzBdKTsKKwlpZiAoIWlub2RlIHx8IGlzX2JhZF9pbm9kZShpbm9kZSkgfHwgaW5vZGUtPmlfZ2VuZXJhdGlvbiAhPSBmaFsxXSkgeworCQlpZiAoaW5vZGUpCisJCQlpcHV0KGlub2RlKTsKKwkJaW5vZGUgPSBOVUxMOworCX0KKwlpZiAoIWlub2RlKSB7CisJCWxvZmZfdCBpX3BvczsKKwkJaW50IGlfbG9nc3RhcnQgPSBmaFszXSAmIDB4MGZmZmZmZmY7CisKKwkJaV9wb3MgPSAobG9mZl90KWZoWzJdIDw8IDg7CisJCWlfcG9zIHw9ICgoZmhbM10gPj4gMjQpICYgMHhmMCkgfCAoZmhbNF0gPj4gMjgpOworCisJCS8qIHRyeSAyIC0gc2VlIGlmIGlfcG9zIGlzIGluIEYtZC1jCisJCSAqIHJlcXVpcmUgaV9sb2dzdGFydCB0byBiZSB0aGUgc2FtZQorCQkgKiBXaWxsIGZhaWwgaWYgeW91IHRydW5jYXRlIGFuZCB0aGVuIHJlLXdyaXRlCisJCSAqLworCisJCWlub2RlID0gZmF0X2lnZXQoc2IsIGlfcG9zKTsKKwkJaWYgKGlub2RlICYmIE1TRE9TX0koaW5vZGUpLT5pX2xvZ3N0YXJ0ICE9IGlfbG9nc3RhcnQpIHsKKwkJCWlwdXQoaW5vZGUpOworCQkJaW5vZGUgPSBOVUxMOworCQl9CisJfQorCWlmICghaW5vZGUpIHsKKwkJLyogRm9yIG5vdywgZG8gbm90aGluZworCQkgKiBXaGF0IHdlIGNvdWxkIGRvIGlzOgorCQkgKiBmb2xsb3cgdGhlIGZpbGUgc3RhcnRpbmcgYXQgZmhbNF0sIGFuZCByZWNvcmQKKwkJICogdGhlICIuLiIgZW50cnksIGFuZCB0aGUgbmFtZSBvZiB0aGUgZmhbMl0gZW50cnkuCisJCSAqIFRoZSBmb2xsb3cgdGhlICIuLiIgZmlsZSBmaW5kaW5nIHRoZSBuZXh0IHN0ZXAgdXAuCisJCSAqIFRoaXMgd2F5IHdlIGJ1aWxkIGEgcGF0aCB0byB0aGUgcm9vdCBvZgorCQkgKiB0aGUgdHJlZS4gSWYgdGhpcyB3b3Jrcywgd2UgbG9va3VwIHRoZSBwYXRoIGFuZCBzbworCQkgKiBnZXQgdGhpcyBpbm9kZSBpbnRvIHRoZSBjYWNoZS4KKwkJICogRmluYWxseSB0cnkgdGhlIGZhdF9pZ2V0IGxvb2t1cCBhZ2FpbgorCQkgKiBJZiB0aGF0IGZhaWxzLCB0aGVuIHdlYXJlIHRvdGFsbHkgb3V0IG9mIGx1Y2sKKwkJICogQnV0IGFsbCB0aGF0IGlzIGZvciBhbm90aGVyIGRheQorCQkgKi8KKwl9CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7CisKKworCS8qIG5vdyB0byBmaW5kIGEgZGVudHJ5LgorCSAqIElmIHBvc3NpYmxlLCBnZXQgYSB3ZWxsLWNvbm5lY3RlZCBvbmUKKwkgKi8KKwlyZXN1bHQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOworCWlmIChyZXN1bHQgPT0gTlVMTCkgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCXJlc3VsdC0+ZF9vcCA9IHNiLT5zX3Jvb3QtPmRfb3A7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludAorZmF0X2VuY29kZV9maChzdHJ1Y3QgZGVudHJ5ICpkZSwgX191MzIgKmZoLCBpbnQgKmxlbnAsIGludCBjb25uZWN0YWJsZSkKK3sKKwlpbnQgbGVuID0gKmxlbnA7CisJc3RydWN0IGlub2RlICppbm9kZSA9ICBkZS0+ZF9pbm9kZTsKKwl1MzIgaXBvc19oLCBpcG9zX20sIGlwb3NfbDsKKworCWlmIChsZW4gPCA1KQorCQlyZXR1cm4gMjU1OyAvKiBubyByb29tICovCisKKwlpcG9zX2ggPSBNU0RPU19JKGlub2RlKS0+aV9wb3MgPj4gODsKKwlpcG9zX20gPSAoTVNET1NfSShpbm9kZSktPmlfcG9zICYgMHhmMCkgPDwgMjQ7CisJaXBvc19sID0gKE1TRE9TX0koaW5vZGUpLT5pX3BvcyAmIDB4MGYpIDw8IDI4OworCSpsZW5wID0gNTsKKwlmaFswXSA9IGlub2RlLT5pX2lubzsKKwlmaFsxXSA9IGlub2RlLT5pX2dlbmVyYXRpb247CisJZmhbMl0gPSBpcG9zX2g7CisJZmhbM10gPSBpcG9zX20gfCBNU0RPU19JKGlub2RlKS0+aV9sb2dzdGFydDsKKwlzcGluX2xvY2soJmRlLT5kX2xvY2spOworCWZoWzRdID0gaXBvc19sIHwgTVNET1NfSShkZS0+ZF9wYXJlbnQtPmRfaW5vZGUpLT5pX2xvZ3N0YXJ0OworCXNwaW5fdW5sb2NrKCZkZS0+ZF9sb2NrKTsKKwlyZXR1cm4gMzsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmZhdF9nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmNoaWxkKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqZGU7CisJbG9mZl90IGlfcG9zOworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnI7CisKKwlsb2NrX2tlcm5lbCgpOworCisJZXJyID0gZmF0X2dldF9kb3Rkb3RfZW50cnkoY2hpbGQtPmRfaW5vZGUsICZiaCwgJmRlLCAmaV9wb3MpOworCWlmIChlcnIpIHsKKwkJcGFyZW50ID0gRVJSX1BUUihlcnIpOworCQlnb3RvIG91dDsKKwl9CisJaW5vZGUgPSBmYXRfYnVpbGRfaW5vZGUoY2hpbGQtPmRfc2IsIGRlLCBpX3Bvcyk7CisJYnJlbHNlKGJoKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQlwYXJlbnQgPSBFUlJfUFRSKFBUUl9FUlIoaW5vZGUpKTsKKwkJZ290byBvdXQ7CisJfQorCXBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisJaWYgKCFwYXJlbnQpIHsKKwkJaXB1dChpbm9kZSk7CisJCXBhcmVudCA9IEVSUl9QVFIoLUVOT01FTSk7CisJfQorb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiBwYXJlbnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgZmF0X2V4cG9ydF9vcHMgPSB7CisJLmRlY29kZV9maAk9IGZhdF9kZWNvZGVfZmgsCisJLmVuY29kZV9maAk9IGZhdF9lbmNvZGVfZmgsCisJLmdldF9kZW50cnkJPSBmYXRfZ2V0X2RlbnRyeSwKKwkuZ2V0X3BhcmVudAk9IGZhdF9nZXRfcGFyZW50LAorfTsKKworc3RhdGljIGludCBmYXRfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKG1udC0+bW50X3NiKTsKKwlzdHJ1Y3QgZmF0X21vdW50X29wdGlvbnMgKm9wdHMgPSAmc2JpLT5vcHRpb25zOworCWludCBpc3ZmYXQgPSBvcHRzLT5pc3ZmYXQ7CisKKwlpZiAob3B0cy0+ZnNfdWlkICE9IDApCisJCXNlcV9wcmludGYobSwgIix1aWQ9JXUiLCBvcHRzLT5mc191aWQpOworCWlmIChvcHRzLT5mc19naWQgIT0gMCkKKwkJc2VxX3ByaW50ZihtLCAiLGdpZD0ldSIsIG9wdHMtPmZzX2dpZCk7CisJc2VxX3ByaW50ZihtLCAiLGZtYXNrPSUwNG8iLCBvcHRzLT5mc19mbWFzayk7CisJc2VxX3ByaW50ZihtLCAiLGRtYXNrPSUwNG8iLCBvcHRzLT5mc19kbWFzayk7CisJaWYgKHNiaS0+bmxzX2Rpc2spCisJCXNlcV9wcmludGYobSwgIixjb2RlcGFnZT0lcyIsIHNiaS0+bmxzX2Rpc2stPmNoYXJzZXQpOworCWlmIChpc3ZmYXQpIHsKKwkJaWYgKHNiaS0+bmxzX2lvKQorCQkJc2VxX3ByaW50ZihtLCAiLGlvY2hhcnNldD0lcyIsIHNiaS0+bmxzX2lvLT5jaGFyc2V0KTsKKworCQlzd2l0Y2ggKG9wdHMtPnNob3J0bmFtZSkgeworCQljYXNlIFZGQVRfU0ZOX0RJU1BMQVlfV0lOOTUgfCBWRkFUX1NGTl9DUkVBVEVfV0lOOTU6CisJCQlzZXFfcHV0cyhtLCAiLHNob3J0bmFtZT13aW45NSIpOworCQkJYnJlYWs7CisJCWNhc2UgVkZBVF9TRk5fRElTUExBWV9XSU5OVCB8IFZGQVRfU0ZOX0NSRUFURV9XSU5OVDoKKwkJCXNlcV9wdXRzKG0sICIsc2hvcnRuYW1lPXdpbm50Iik7CisJCQlicmVhazsKKwkJY2FzZSBWRkFUX1NGTl9ESVNQTEFZX1dJTk5UIHwgVkZBVF9TRk5fQ1JFQVRFX1dJTjk1OgorCQkJc2VxX3B1dHMobSwgIixzaG9ydG5hbWU9bWl4ZWQiKTsKKwkJCWJyZWFrOworCQljYXNlIFZGQVRfU0ZOX0RJU1BMQVlfTE9XRVIgfCBWRkFUX1NGTl9DUkVBVEVfV0lOOTU6CisJCQkvKiBzZXFfcHV0cyhtLCAiLHNob3J0bmFtZT1sb3dlciIpOyAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzZXFfcHV0cyhtLCAiLHNob3J0bmFtZT11bmtub3duIik7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAob3B0cy0+bmFtZV9jaGVjayAhPSAnbicpCisJCXNlcV9wcmludGYobSwgIixjaGVjaz0lYyIsIG9wdHMtPm5hbWVfY2hlY2spOworCWlmIChvcHRzLT5xdWlldCkKKwkJc2VxX3B1dHMobSwgIixxdWlldCIpOworCWlmIChvcHRzLT5zaG93ZXhlYykKKwkJc2VxX3B1dHMobSwgIixzaG93ZXhlYyIpOworCWlmIChvcHRzLT5zeXNfaW1tdXRhYmxlKQorCQlzZXFfcHV0cyhtLCAiLHN5c19pbW11dGFibGUiKTsKKwlpZiAoIWlzdmZhdCkgeworCQlpZiAob3B0cy0+ZG90c09LKQorCQkJc2VxX3B1dHMobSwgIixkb3RzT0s9eWVzIik7CisJCWlmIChvcHRzLT5ub2Nhc2UpCisJCQlzZXFfcHV0cyhtLCAiLG5vY2FzZSIpOworCX0gZWxzZSB7CisJCWlmIChvcHRzLT51dGY4KQorCQkJc2VxX3B1dHMobSwgIix1dGY4Iik7CisJCWlmIChvcHRzLT51bmljb2RlX3hsYXRlKQorCQkJc2VxX3B1dHMobSwgIix1bmlfeGxhdGUiKTsKKwkJaWYgKCFvcHRzLT5udW10YWlsKQorCQkJc2VxX3B1dHMobSwgIixub251bXRhaWwiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworZW51bSB7CisJT3B0X2NoZWNrX24sIE9wdF9jaGVja19yLCBPcHRfY2hlY2tfcywgT3B0X3VpZCwgT3B0X2dpZCwKKwlPcHRfdW1hc2ssIE9wdF9kbWFzaywgT3B0X2ZtYXNrLCBPcHRfY29kZXBhZ2UsIE9wdF9ub2Nhc2UsCisJT3B0X3F1aWV0LCBPcHRfc2hvd2V4ZWMsIE9wdF9kZWJ1ZywgT3B0X2ltbXV0YWJsZSwKKwlPcHRfZG90cywgT3B0X25vZG90cywKKwlPcHRfY2hhcnNldCwgT3B0X3Nob3J0bmFtZV9sb3dlciwgT3B0X3Nob3J0bmFtZV93aW45NSwKKwlPcHRfc2hvcnRuYW1lX3dpbm50LCBPcHRfc2hvcnRuYW1lX21peGVkLCBPcHRfdXRmOF9ubywgT3B0X3V0ZjhfeWVzLAorCU9wdF91bmlfeGxfbm8sIE9wdF91bmlfeGxfeWVzLCBPcHRfbm9udW10YWlsX25vLCBPcHRfbm9udW10YWlsX3llcywKKwlPcHRfb2Jzb2xhdGUsIE9wdF9lcnIsCit9OworCitzdGF0aWMgbWF0Y2hfdGFibGVfdCBmYXRfdG9rZW5zID0geworCXtPcHRfY2hlY2tfciwgImNoZWNrPXJlbGF4ZWQifSwKKwl7T3B0X2NoZWNrX3MsICJjaGVjaz1zdHJpY3QifSwKKwl7T3B0X2NoZWNrX24sICJjaGVjaz1ub3JtYWwifSwKKwl7T3B0X2NoZWNrX3IsICJjaGVjaz1yIn0sCisJe09wdF9jaGVja19zLCAiY2hlY2s9cyJ9LAorCXtPcHRfY2hlY2tfbiwgImNoZWNrPW4ifSwKKwl7T3B0X3VpZCwgInVpZD0ldSJ9LAorCXtPcHRfZ2lkLCAiZ2lkPSV1In0sCisJe09wdF91bWFzaywgInVtYXNrPSVvIn0sCisJe09wdF9kbWFzaywgImRtYXNrPSVvIn0sCisJe09wdF9mbWFzaywgImZtYXNrPSVvIn0sCisJe09wdF9jb2RlcGFnZSwgImNvZGVwYWdlPSV1In0sCisJe09wdF9ub2Nhc2UsICJub2Nhc2UifSwKKwl7T3B0X3F1aWV0LCAicXVpZXQifSwKKwl7T3B0X3Nob3dleGVjLCAic2hvd2V4ZWMifSwKKwl7T3B0X2RlYnVnLCAiZGVidWcifSwKKwl7T3B0X2ltbXV0YWJsZSwgInN5c19pbW11dGFibGUifSwKKwl7T3B0X29ic29sYXRlLCAiY29udj1iaW5hcnkifSwKKwl7T3B0X29ic29sYXRlLCAiY29udj10ZXh0In0sCisJe09wdF9vYnNvbGF0ZSwgImNvbnY9YXV0byJ9LAorCXtPcHRfb2Jzb2xhdGUsICJjb252PWIifSwKKwl7T3B0X29ic29sYXRlLCAiY29udj10In0sCisJe09wdF9vYnNvbGF0ZSwgImNvbnY9YSJ9LAorCXtPcHRfb2Jzb2xhdGUsICJmYXQ9JXUifSwKKwl7T3B0X29ic29sYXRlLCAiYmxvY2tzaXplPSV1In0sCisJe09wdF9vYnNvbGF0ZSwgImN2Zl9mb3JtYXQ9JTIwcyJ9LAorCXtPcHRfb2Jzb2xhdGUsICJjdmZfb3B0aW9ucz0lMTAwcyJ9LAorCXtPcHRfb2Jzb2xhdGUsICJwb3NpeCJ9LAorCXtPcHRfZXJyLCBOVUxMfQorfTsKK3N0YXRpYyBtYXRjaF90YWJsZV90IG1zZG9zX3Rva2VucyA9IHsKKwl7T3B0X25vZG90cywgIm5vZG90cyJ9LAorCXtPcHRfbm9kb3RzLCAiZG90c09LPW5vIn0sCisJe09wdF9kb3RzLCAiZG90cyJ9LAorCXtPcHRfZG90cywgImRvdHNPSz15ZXMifSwKKwl7T3B0X2VyciwgTlVMTH0KK307CitzdGF0aWMgbWF0Y2hfdGFibGVfdCB2ZmF0X3Rva2VucyA9IHsKKwl7T3B0X2NoYXJzZXQsICJpb2NoYXJzZXQ9JXMifSwKKwl7T3B0X3Nob3J0bmFtZV9sb3dlciwgInNob3J0bmFtZT1sb3dlciJ9LAorCXtPcHRfc2hvcnRuYW1lX3dpbjk1LCAic2hvcnRuYW1lPXdpbjk1In0sCisJe09wdF9zaG9ydG5hbWVfd2lubnQsICJzaG9ydG5hbWU9d2lubnQifSwKKwl7T3B0X3Nob3J0bmFtZV9taXhlZCwgInNob3J0bmFtZT1taXhlZCJ9LAorCXtPcHRfdXRmOF9ubywgInV0Zjg9MCJ9LAkJLyogMCBvciBubyBvciBmYWxzZSAqLworCXtPcHRfdXRmOF9ubywgInV0Zjg9bm8ifSwKKwl7T3B0X3V0Zjhfbm8sICJ1dGY4PWZhbHNlIn0sCisJe09wdF91dGY4X3llcywgInV0Zjg9MSJ9LAkJLyogZW1wdHkgb3IgMSBvciB5ZXMgb3IgdHJ1ZSAqLworCXtPcHRfdXRmOF95ZXMsICJ1dGY4PXllcyJ9LAorCXtPcHRfdXRmOF95ZXMsICJ1dGY4PXRydWUifSwKKwl7T3B0X3V0ZjhfeWVzLCAidXRmOCJ9LAorCXtPcHRfdW5pX3hsX25vLCAidW5pX3hsYXRlPTAifSwJCS8qIDAgb3Igbm8gb3IgZmFsc2UgKi8KKwl7T3B0X3VuaV94bF9ubywgInVuaV94bGF0ZT1ubyJ9LAorCXtPcHRfdW5pX3hsX25vLCAidW5pX3hsYXRlPWZhbHNlIn0sCisJe09wdF91bmlfeGxfeWVzLCAidW5pX3hsYXRlPTEifSwJLyogZW1wdHkgb3IgMSBvciB5ZXMgb3IgdHJ1ZSAqLworCXtPcHRfdW5pX3hsX3llcywgInVuaV94bGF0ZT15ZXMifSwKKwl7T3B0X3VuaV94bF95ZXMsICJ1bmlfeGxhdGU9dHJ1ZSJ9LAorCXtPcHRfdW5pX3hsX3llcywgInVuaV94bGF0ZSJ9LAorCXtPcHRfbm9udW10YWlsX25vLCAibm9udW10YWlsPTAifSwJLyogMCBvciBubyBvciBmYWxzZSAqLworCXtPcHRfbm9udW10YWlsX25vLCAibm9udW10YWlsPW5vIn0sCisJe09wdF9ub251bXRhaWxfbm8sICJub251bXRhaWw9ZmFsc2UifSwKKwl7T3B0X25vbnVtdGFpbF95ZXMsICJub251bXRhaWw9MSJ9LAkvKiBlbXB0eSBvciAxIG9yIHllcyBvciB0cnVlICovCisJe09wdF9ub251bXRhaWxfeWVzLCAibm9udW10YWlsPXllcyJ9LAorCXtPcHRfbm9udW10YWlsX3llcywgIm5vbnVtdGFpbD10cnVlIn0sCisJe09wdF9ub251bXRhaWxfeWVzLCAibm9udW10YWlsIn0sCisJe09wdF9lcnIsIE5VTEx9Cit9OworCitzdGF0aWMgaW50IHBhcnNlX29wdGlvbnMoY2hhciAqb3B0aW9ucywgaW50IGlzX3ZmYXQsIGludCAqZGVidWcsCisJCQkgc3RydWN0IGZhdF9tb3VudF9vcHRpb25zICpvcHRzKQoreworCWNoYXIgKnA7CisJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCWludCBvcHRpb247CisJY2hhciAqaW9jaGFyc2V0OworCisJb3B0cy0+aXN2ZmF0ID0gaXNfdmZhdDsKKworCW9wdHMtPmZzX3VpZCA9IGN1cnJlbnQtPnVpZDsKKwlvcHRzLT5mc19naWQgPSBjdXJyZW50LT5naWQ7CisJb3B0cy0+ZnNfZm1hc2sgPSBvcHRzLT5mc19kbWFzayA9IGN1cnJlbnQtPmZzLT51bWFzazsKKwlvcHRzLT5jb2RlcGFnZSA9IGZhdF9kZWZhdWx0X2NvZGVwYWdlOworCW9wdHMtPmlvY2hhcnNldCA9IGZhdF9kZWZhdWx0X2lvY2hhcnNldDsKKwlpZiAoaXNfdmZhdCkKKwkJb3B0cy0+c2hvcnRuYW1lID0gVkZBVF9TRk5fRElTUExBWV9MT1dFUnxWRkFUX1NGTl9DUkVBVEVfV0lOOTU7CisJZWxzZQorCQlvcHRzLT5zaG9ydG5hbWUgPSAwOworCW9wdHMtPm5hbWVfY2hlY2sgPSAnbic7CisJb3B0cy0+cXVpZXQgPSBvcHRzLT5zaG93ZXhlYyA9IG9wdHMtPnN5c19pbW11dGFibGUgPSBvcHRzLT5kb3RzT0sgPSAgMDsKKwlvcHRzLT51dGY4ID0gb3B0cy0+dW5pY29kZV94bGF0ZSA9IDA7CisJb3B0cy0+bnVtdGFpbCA9IDE7CisJb3B0cy0+bm9jYXNlID0gMDsKKwkqZGVidWcgPSAwOworCisJaWYgKCFvcHRpb25zKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpbnQgdG9rZW47CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIGZhdF90b2tlbnMsIGFyZ3MpOworCQlpZiAodG9rZW4gPT0gT3B0X2VycikgeworCQkJaWYgKGlzX3ZmYXQpCisJCQkJdG9rZW4gPSBtYXRjaF90b2tlbihwLCB2ZmF0X3Rva2VucywgYXJncyk7CisJCQllbHNlCisJCQkJdG9rZW4gPSBtYXRjaF90b2tlbihwLCBtc2Rvc190b2tlbnMsIGFyZ3MpOworCQl9CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJY2FzZSBPcHRfY2hlY2tfczoKKwkJCW9wdHMtPm5hbWVfY2hlY2sgPSAncyc7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfY2hlY2tfcjoKKwkJCW9wdHMtPm5hbWVfY2hlY2sgPSAncic7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfY2hlY2tfbjoKKwkJCW9wdHMtPm5hbWVfY2hlY2sgPSAnbic7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9jYXNlOgorCQkJaWYgKCFpc192ZmF0KQorCQkJCW9wdHMtPm5vY2FzZSA9IDE7CisJCQllbHNlIHsKKwkJCQkvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworCQkJCW9wdHMtPnNob3J0bmFtZSA9IFZGQVRfU0ZOX0RJU1BMQVlfV0lOOTUKKwkJCQkJfCBWRkFUX1NGTl9DUkVBVEVfV0lOOTU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPcHRfcXVpZXQ6CisJCQlvcHRzLT5xdWlldCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfc2hvd2V4ZWM6CisJCQlvcHRzLT5zaG93ZXhlYyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZGVidWc6CisJCQkqZGVidWcgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2ltbXV0YWJsZToKKwkJCW9wdHMtPnN5c19pbW11dGFibGUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3VpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJb3B0cy0+ZnNfdWlkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2dpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJb3B0cy0+ZnNfZ2lkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3VtYXNrOgorCQkJaWYgKG1hdGNoX29jdGFsKCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCW9wdHMtPmZzX2ZtYXNrID0gb3B0cy0+ZnNfZG1hc2sgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZG1hc2s6CisJCQlpZiAobWF0Y2hfb2N0YWwoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJb3B0cy0+ZnNfZG1hc2sgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZm1hc2s6CisJCQlpZiAobWF0Y2hfb2N0YWwoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJb3B0cy0+ZnNfZm1hc2sgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfY29kZXBhZ2U6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCW9wdHMtPmNvZGVwYWdlID0gb3B0aW9uOworCQkJYnJlYWs7CisKKwkJLyogbXNkb3Mgc3BlY2lmaWMgKi8KKwkJY2FzZSBPcHRfZG90czoKKwkJCW9wdHMtPmRvdHNPSyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9kb3RzOgorCQkJb3B0cy0+ZG90c09LID0gMDsKKwkJCWJyZWFrOworCisJCS8qIHZmYXQgc3BlY2lmaWMgKi8KKwkJY2FzZSBPcHRfY2hhcnNldDoKKwkJCWlmIChvcHRzLT5pb2NoYXJzZXQgIT0gZmF0X2RlZmF1bHRfaW9jaGFyc2V0KQorCQkJCWtmcmVlKG9wdHMtPmlvY2hhcnNldCk7CisJCQlpb2NoYXJzZXQgPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMF0pOworCQkJaWYgKCFpb2NoYXJzZXQpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlvcHRzLT5pb2NoYXJzZXQgPSBpb2NoYXJzZXQ7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfc2hvcnRuYW1lX2xvd2VyOgorCQkJb3B0cy0+c2hvcnRuYW1lID0gVkZBVF9TRk5fRElTUExBWV9MT1dFUgorCQkJCQl8IFZGQVRfU0ZOX0NSRUFURV9XSU45NTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9zaG9ydG5hbWVfd2luOTU6CisJCQlvcHRzLT5zaG9ydG5hbWUgPSBWRkFUX1NGTl9ESVNQTEFZX1dJTjk1CisJCQkJCXwgVkZBVF9TRk5fQ1JFQVRFX1dJTjk1OworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3Nob3J0bmFtZV93aW5udDoKKwkJCW9wdHMtPnNob3J0bmFtZSA9IFZGQVRfU0ZOX0RJU1BMQVlfV0lOTlQKKwkJCQkJfCBWRkFUX1NGTl9DUkVBVEVfV0lOTlQ7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfc2hvcnRuYW1lX21peGVkOgorCQkJb3B0cy0+c2hvcnRuYW1lID0gVkZBVF9TRk5fRElTUExBWV9XSU5OVAorCQkJCQl8IFZGQVRfU0ZOX0NSRUFURV9XSU45NTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF91dGY4X25vOgkJLyogMCBvciBubyBvciBmYWxzZSAqLworCQkJb3B0cy0+dXRmOCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfdXRmOF95ZXM6CQkvKiBlbXB0eSBvciAxIG9yIHllcyBvciB0cnVlICovCisJCQlvcHRzLT51dGY4ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF91bmlfeGxfbm86CQkvKiAwIG9yIG5vIG9yIGZhbHNlICovCisJCQlvcHRzLT51bmljb2RlX3hsYXRlID0gMDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF91bmlfeGxfeWVzOgkJLyogZW1wdHkgb3IgMSBvciB5ZXMgb3IgdHJ1ZSAqLworCQkJb3B0cy0+dW5pY29kZV94bGF0ZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9udW10YWlsX25vOgkJLyogMCBvciBubyBvciBmYWxzZSAqLworCQkJb3B0cy0+bnVtdGFpbCA9IDE7CS8qIG5lZ2F0ZWQgb3B0aW9uICovCisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9udW10YWlsX3llczoJCS8qIGVtcHR5IG9yIDEgb3IgeWVzIG9yIHRydWUgKi8KKwkJCW9wdHMtPm51bXRhaWwgPSAwOwkvKiBuZWdhdGVkIG9wdGlvbiAqLworCQkJYnJlYWs7CisKKwkJLyogb2Jzb2xldGUgbW91bnQgb3B0aW9ucyAqLworCQljYXNlIE9wdF9vYnNvbGF0ZToKKwkJCXByaW50ayhLRVJOX0lORk8gIkZBVDogXCIlc1wiIG9wdGlvbiBpcyBvYnNvbGV0ZSwgIgorCQkJICAgICAgICJub3Qgc3VwcG9ydGVkIG5vd1xuIiwgcCk7CisJCQlicmVhazsKKwkJLyogdW5rbm93biBvcHRpb24gKi8KKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiRkFUOiBVbnJlY29nbml6ZWQgbW91bnQgb3B0aW9uIFwiJXNcIiAiCisJCQkgICAgICAgIm9yIG1pc3NpbmcgdmFsdWVcbiIsIHApOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJLyogVVRGOCBkb2Vzbid0IHByb3ZpZGUgRkFUIHNlbWFudGljcyAqLworCWlmICghc3RyY21wKG9wdHMtPmlvY2hhcnNldCwgInV0ZjgiKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkZBVDogdXRmOCBpcyBub3QgYSByZWNvbW1lbmRlZCBJTyBjaGFyc2V0IgorCQkgICAgICAgIiBmb3IgRkFUIGZpbGVzeXN0ZW1zLCBmaWxlc3lzdGVtIHdpbGwgYmUgY2FzZSBzZW5zaXRpdmUhXG4iKTsKKwl9CisKKwlpZiAob3B0cy0+dW5pY29kZV94bGF0ZSkKKwkJb3B0cy0+dXRmOCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmYXRfcmVhZF9yb290KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisJaW50IGVycm9yOworCisJTVNET1NfSShpbm9kZSktPmlfcG9zID0gMDsKKwlpbm9kZS0+aV91aWQgPSBzYmktPm9wdGlvbnMuZnNfdWlkOworCWlub2RlLT5pX2dpZCA9IHNiaS0+b3B0aW9ucy5mc19naWQ7CisJaW5vZGUtPmlfdmVyc2lvbisrOworCWlub2RlLT5pX2dlbmVyYXRpb24gPSAwOworCWlub2RlLT5pX21vZGUgPSAoU19JUldYVUdPICYgfnNiaS0+b3B0aW9ucy5mc19kbWFzaykgfCBTX0lGRElSOworCWlub2RlLT5pX29wID0gc2JpLT5kaXJfb3BzOworCWlub2RlLT5pX2ZvcCA9ICZmYXRfZGlyX29wZXJhdGlvbnM7CisJaWYgKHNiaS0+ZmF0X2JpdHMgPT0gMzIpIHsKKwkJTVNET1NfSShpbm9kZSktPmlfc3RhcnQgPSBzYmktPnJvb3RfY2x1c3RlcjsKKwkJZXJyb3IgPSBmYXRfY2FsY19kaXJfc2l6ZShpbm9kZSk7CisJCWlmIChlcnJvciA8IDApCisJCQlyZXR1cm4gZXJyb3I7CisJfSBlbHNlIHsKKwkJTVNET1NfSShpbm9kZSktPmlfc3RhcnQgPSAwOworCQlpbm9kZS0+aV9zaXplID0gc2JpLT5kaXJfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5KTsKKwl9CisJaW5vZGUtPmlfYmxrc2l6ZSA9IHNiaS0+Y2x1c3Rlcl9zaXplOworCWlub2RlLT5pX2Jsb2NrcyA9ICgoaW5vZGUtPmlfc2l6ZSArIChzYmktPmNsdXN0ZXJfc2l6ZSAtIDEpKQorCQkJICAgJiB+KChsb2ZmX3Qpc2JpLT5jbHVzdGVyX3NpemUgLSAxKSkgPj4gOTsKKwlNU0RPU19JKGlub2RlKS0+aV9sb2dzdGFydCA9IDA7CisJTVNET1NfSShpbm9kZSktPm1tdV9wcml2YXRlID0gaW5vZGUtPmlfc2l6ZTsKKworCU1TRE9TX0koaW5vZGUpLT5pX2F0dHJzID0gQVRUUl9OT05FOworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IGlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IDA7CisJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IGlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSBpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9ubGluayA9IGZhdF9zdWJkaXJzKGlub2RlKSsyOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBzdXBlciBibG9jayBvZiBhbiBNUy1ET1MgRlMuCisgKi8KK2ludCBmYXRfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50LAorCQkgICBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyAqZnNfZGlyX2lub2RlX29wcywgaW50IGlzdmZhdCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGUgPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGZhdF9ib290X3NlY3RvciAqYjsKKwlzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpOworCXUxNiBsb2dpY2FsX3NlY3Rvcl9zaXplOworCXUzMiB0b3RhbF9zZWN0b3JzLCB0b3RhbF9jbHVzdGVycywgZmF0X2NsdXN0ZXJzLCByb290ZGlyX3NlY3RvcnM7CisJaW50IGRlYnVnOworCXVuc2lnbmVkIGludCBtZWRpYTsKKwlsb25nIGVycm9yOworCWNoYXIgYnVmWzUwXTsKKworCXNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtc2Rvc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmkpCisJCXJldHVybiAtRU5PTUVNOworCXNiLT5zX2ZzX2luZm8gPSBzYmk7CisJbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKHN0cnVjdCBtc2Rvc19zYl9pbmZvKSk7CisKKwlzYi0+c19mbGFncyB8PSBNU19OT0RJUkFUSU1FOworCXNiLT5zX21hZ2ljID0gTVNET1NfU1VQRVJfTUFHSUM7CisJc2ItPnNfb3AgPSAmZmF0X3NvcHM7CisJc2ItPnNfZXhwb3J0X29wID0gJmZhdF9leHBvcnRfb3BzOworCXNiaS0+ZGlyX29wcyA9IGZzX2Rpcl9pbm9kZV9vcHM7CisKKwllcnJvciA9IHBhcnNlX29wdGlvbnMoZGF0YSwgaXN2ZmF0LCAmZGVidWcsICZzYmktPm9wdGlvbnMpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfZmFpbDsKKworCWVycm9yID0gLUVJTzsKKwlzYl9taW5fYmxvY2tzaXplKHNiLCA1MTIpOworCWJoID0gc2JfYnJlYWQoc2IsIDApOworCWlmIChiaCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRkFUOiB1bmFibGUgdG8gcmVhZCBib290IHNlY3RvclxuIik7CisJCWdvdG8gb3V0X2ZhaWw7CisJfQorCisJYiA9IChzdHJ1Y3QgZmF0X2Jvb3Rfc2VjdG9yICopIGJoLT5iX2RhdGE7CisJaWYgKCFiLT5yZXNlcnZlZCkgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50ayhLRVJOX0VSUiAiRkFUOiBib2d1cyBudW1iZXIgb2YgcmVzZXJ2ZWQgc2VjdG9yc1xuIik7CisJCWJyZWxzZShiaCk7CisJCWdvdG8gb3V0X2ludmFsaWQ7CisJfQorCWlmICghYi0+ZmF0cykgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50ayhLRVJOX0VSUiAiRkFUOiBib2d1cyBudW1iZXIgb2YgRkFUIHN0cnVjdHVyZVxuIik7CisJCWJyZWxzZShiaCk7CisJCWdvdG8gb3V0X2ludmFsaWQ7CisJfQorCisJLyoKKwkgKiBFYXJsaWVyIHdlIGNoZWNrZWQgaGVyZSB0aGF0IGItPnNlY3NfdHJhY2sgYW5kIGItPmhlYWQgYXJlIG5vbnplcm8sCisJICogYnV0IGl0IHR1cm5zIG91dCB2YWxpZCBGQVQgZmlsZXN5c3RlbXMgY2FuIGhhdmUgemVybyB0aGVyZS4KKwkgKi8KKworCW1lZGlhID0gYi0+bWVkaWE7CisJaWYgKCFGQVRfVkFMSURfTUVESUEobWVkaWEpKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKEtFUk5fRVJSICJGQVQ6IGludmFsaWQgbWVkaWEgdmFsdWUgKDB4JTAyeClcbiIsCisJCQkgICAgICAgbWVkaWEpOworCQlicmVsc2UoYmgpOworCQlnb3RvIG91dF9pbnZhbGlkOworCX0KKwlsb2dpY2FsX3NlY3Rvcl9zaXplID0KKwkJbGUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoX19sZTE2ICopJmItPnNlY3Rvcl9zaXplKSk7CisJaWYgKCFsb2dpY2FsX3NlY3Rvcl9zaXplCisJICAgIHx8IChsb2dpY2FsX3NlY3Rvcl9zaXplICYgKGxvZ2ljYWxfc2VjdG9yX3NpemUgLSAxKSkKKwkgICAgfHwgKGxvZ2ljYWxfc2VjdG9yX3NpemUgPCA1MTIpCisJICAgIHx8IChQQUdFX0NBQ0hFX1NJWkUgPCBsb2dpY2FsX3NlY3Rvcl9zaXplKSkgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50ayhLRVJOX0VSUiAiRkFUOiBib2d1cyBsb2dpY2FsIHNlY3RvciBzaXplICV1XG4iLAorCQkJICAgICAgIGxvZ2ljYWxfc2VjdG9yX3NpemUpOworCQlicmVsc2UoYmgpOworCQlnb3RvIG91dF9pbnZhbGlkOworCX0KKwlzYmktPnNlY19wZXJfY2x1cyA9IGItPnNlY19wZXJfY2x1czsKKwlpZiAoIXNiaS0+c2VjX3Blcl9jbHVzCisJICAgIHx8IChzYmktPnNlY19wZXJfY2x1cyAmIChzYmktPnNlY19wZXJfY2x1cyAtIDEpKSkgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50ayhLRVJOX0VSUiAiRkFUOiBib2d1cyBzZWN0b3JzIHBlciBjbHVzdGVyICV1XG4iLAorCQkJICAgICAgIHNiaS0+c2VjX3Blcl9jbHVzKTsKKwkJYnJlbHNlKGJoKTsKKwkJZ290byBvdXRfaW52YWxpZDsKKwl9CisKKwlpZiAobG9naWNhbF9zZWN0b3Jfc2l6ZSA8IHNiLT5zX2Jsb2Nrc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIgIkZBVDogbG9naWNhbCBzZWN0b3Igc2l6ZSB0b28gc21hbGwgZm9yIGRldmljZSIKKwkJICAgICAgICIgKGxvZ2ljYWwgc2VjdG9yIHNpemUgPSAldSlcbiIsIGxvZ2ljYWxfc2VjdG9yX3NpemUpOworCQlicmVsc2UoYmgpOworCQlnb3RvIG91dF9mYWlsOworCX0KKwlpZiAobG9naWNhbF9zZWN0b3Jfc2l6ZSA+IHNiLT5zX2Jsb2Nrc2l6ZSkgeworCQlicmVsc2UoYmgpOworCisJCWlmICghc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgbG9naWNhbF9zZWN0b3Jfc2l6ZSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRkFUOiB1bmFibGUgdG8gc2V0IGJsb2Nrc2l6ZSAldVxuIiwKKwkJCSAgICAgICBsb2dpY2FsX3NlY3Rvcl9zaXplKTsKKwkJCWdvdG8gb3V0X2ZhaWw7CisJCX0KKwkJYmggPSBzYl9icmVhZChzYiwgMCk7CisJCWlmIChiaCA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkZBVDogdW5hYmxlIHRvIHJlYWQgYm9vdCBzZWN0b3IiCisJCQkgICAgICAgIiAobG9naWNhbCBzZWN0b3Igc2l6ZSA9ICVsdSlcbiIsCisJCQkgICAgICAgc2ItPnNfYmxvY2tzaXplKTsKKwkJCWdvdG8gb3V0X2ZhaWw7CisJCX0KKwkJYiA9IChzdHJ1Y3QgZmF0X2Jvb3Rfc2VjdG9yICopIGJoLT5iX2RhdGE7CisJfQorCisJc2JpLT5jbHVzdGVyX3NpemUgPSBzYi0+c19ibG9ja3NpemUgKiBzYmktPnNlY19wZXJfY2x1czsKKwlzYmktPmNsdXN0ZXJfYml0cyA9IGZmcyhzYmktPmNsdXN0ZXJfc2l6ZSkgLSAxOworCXNiaS0+ZmF0cyA9IGItPmZhdHM7CisJc2JpLT5mYXRfYml0cyA9IDA7CQkvKiBEb24ndCBrbm93IHlldCAqLworCXNiaS0+ZmF0X3N0YXJ0ID0gbGUxNl90b19jcHUoYi0+cmVzZXJ2ZWQpOworCXNiaS0+ZmF0X2xlbmd0aCA9IGxlMTZfdG9fY3B1KGItPmZhdF9sZW5ndGgpOworCXNiaS0+cm9vdF9jbHVzdGVyID0gMDsKKwlzYmktPmZyZWVfY2x1c3RlcnMgPSAtMTsJLyogRG9uJ3Qga25vdyB5ZXQgKi8KKwlzYmktPnByZXZfZnJlZSA9IEZBVF9TVEFSVF9FTlQ7CisKKwlpZiAoIXNiaS0+ZmF0X2xlbmd0aCAmJiBiLT5mYXQzMl9sZW5ndGgpIHsKKwkJc3RydWN0IGZhdF9ib290X2ZzaW5mbyAqZnNpbmZvOworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZzaW5mb19iaDsKKworCQkvKiBNdXN0IGJlIEZBVDMyICovCisJCXNiaS0+ZmF0X2JpdHMgPSAzMjsKKwkJc2JpLT5mYXRfbGVuZ3RoID0gbGUzMl90b19jcHUoYi0+ZmF0MzJfbGVuZ3RoKTsKKwkJc2JpLT5yb290X2NsdXN0ZXIgPSBsZTMyX3RvX2NwdShiLT5yb290X2NsdXN0ZXIpOworCisJCXNiLT5zX21heGJ5dGVzID0gMHhmZmZmZmZmZjsKKworCQkvKiBNQyAtIGlmIGluZm9fc2VjdG9yIGlzIDAsIGRvbid0IG11bHRpcGx5IGJ5IDAgKi8KKwkJc2JpLT5mc2luZm9fc2VjdG9yID0gbGUxNl90b19jcHUoYi0+aW5mb19zZWN0b3IpOworCQlpZiAoc2JpLT5mc2luZm9fc2VjdG9yID09IDApCisJCQlzYmktPmZzaW5mb19zZWN0b3IgPSAxOworCisJCWZzaW5mb19iaCA9IHNiX2JyZWFkKHNiLCBzYmktPmZzaW5mb19zZWN0b3IpOworCQlpZiAoZnNpbmZvX2JoID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRkFUOiBicmVhZCBmYWlsZWQsIEZTSU5GTyBibG9jayIKKwkJCSAgICAgICAiIChzZWN0b3IgPSAlbHUpXG4iLCBzYmktPmZzaW5mb19zZWN0b3IpOworCQkJYnJlbHNlKGJoKTsKKwkJCWdvdG8gb3V0X2ZhaWw7CisJCX0KKworCQlmc2luZm8gPSAoc3RydWN0IGZhdF9ib290X2ZzaW5mbyAqKWZzaW5mb19iaC0+Yl9kYXRhOworCQlpZiAoIUlTX0ZTSU5GTyhmc2luZm8pKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIkZBVDogRGlkIG5vdCBmaW5kIHZhbGlkIEZTSU5GTyBzaWduYXR1cmUuXG4iCisJCQkgICAgICAgIiAgICAgRm91bmQgc2lnbmF0dXJlMSAweCUwOHggc2lnbmF0dXJlMiAweCUwOHgiCisJCQkgICAgICAgIiAoc2VjdG9yID0gJWx1KVxuIiwKKwkJCSAgICAgICBsZTMyX3RvX2NwdShmc2luZm8tPnNpZ25hdHVyZTEpLAorCQkJICAgICAgIGxlMzJfdG9fY3B1KGZzaW5mby0+c2lnbmF0dXJlMiksCisJCQkgICAgICAgc2JpLT5mc2luZm9fc2VjdG9yKTsKKwkJfSBlbHNlIHsKKwkJCXNiaS0+ZnJlZV9jbHVzdGVycyA9IGxlMzJfdG9fY3B1KGZzaW5mby0+ZnJlZV9jbHVzdGVycyk7CisJCQlzYmktPnByZXZfZnJlZSA9IGxlMzJfdG9fY3B1KGZzaW5mby0+bmV4dF9jbHVzdGVyKTsKKwkJfQorCisJCWJyZWxzZShmc2luZm9fYmgpOworCX0KKworCXNiaS0+ZGlyX3Blcl9ibG9jayA9IHNiLT5zX2Jsb2Nrc2l6ZSAvIHNpemVvZihzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5KTsKKwlzYmktPmRpcl9wZXJfYmxvY2tfYml0cyA9IGZmcyhzYmktPmRpcl9wZXJfYmxvY2spIC0gMTsKKworCXNiaS0+ZGlyX3N0YXJ0ID0gc2JpLT5mYXRfc3RhcnQgKyBzYmktPmZhdHMgKiBzYmktPmZhdF9sZW5ndGg7CisJc2JpLT5kaXJfZW50cmllcyA9CisJCWxlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fbGUxNiAqKSZiLT5kaXJfZW50cmllcykpOworCWlmIChzYmktPmRpcl9lbnRyaWVzICYgKHNiaS0+ZGlyX3Blcl9ibG9jayAtIDEpKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKEtFUk5fRVJSICJGQVQ6IGJvZ3VzIGRpcmVjdHJveS1lbnRyaWVzIHBlciBibG9jayIKKwkJCSAgICAgICAiICgldSlcbiIsIHNiaS0+ZGlyX2VudHJpZXMpOworCQlicmVsc2UoYmgpOworCQlnb3RvIG91dF9pbnZhbGlkOworCX0KKworCXJvb3RkaXJfc2VjdG9ycyA9IHNiaS0+ZGlyX2VudHJpZXMKKwkJKiBzaXplb2Yoc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSkgLyBzYi0+c19ibG9ja3NpemU7CisJc2JpLT5kYXRhX3N0YXJ0ID0gc2JpLT5kaXJfc3RhcnQgKyByb290ZGlyX3NlY3RvcnM7CisJdG90YWxfc2VjdG9ycyA9IGxlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fbGUxNiAqKSZiLT5zZWN0b3JzKSk7CisJaWYgKHRvdGFsX3NlY3RvcnMgPT0gMCkKKwkJdG90YWxfc2VjdG9ycyA9IGxlMzJfdG9fY3B1KGItPnRvdGFsX3NlY3QpOworCisJdG90YWxfY2x1c3RlcnMgPSAodG90YWxfc2VjdG9ycyAtIHNiaS0+ZGF0YV9zdGFydCkgLyBzYmktPnNlY19wZXJfY2x1czsKKworCWlmIChzYmktPmZhdF9iaXRzICE9IDMyKQorCQlzYmktPmZhdF9iaXRzID0gKHRvdGFsX2NsdXN0ZXJzID4gTUFYX0ZBVDEyKSA/IDE2IDogMTI7CisKKwkvKiBjaGVjayB0aGF0IEZBVCB0YWJsZSBkb2VzIG5vdCBvdmVyZmxvdyAqLworCWZhdF9jbHVzdGVycyA9IHNiaS0+ZmF0X2xlbmd0aCAqIHNiLT5zX2Jsb2Nrc2l6ZSAqIDggLyBzYmktPmZhdF9iaXRzOworCXRvdGFsX2NsdXN0ZXJzID0gbWluKHRvdGFsX2NsdXN0ZXJzLCBmYXRfY2x1c3RlcnMgLSBGQVRfU1RBUlRfRU5UKTsKKwlpZiAodG90YWxfY2x1c3RlcnMgPiBNQVhfRkFUKHNiKSkgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50ayhLRVJOX0VSUiAiRkFUOiBjb3VudCBvZiBjbHVzdGVycyB0b28gYmlnICgldSlcbiIsCisJCQkgICAgICAgdG90YWxfY2x1c3RlcnMpOworCQlicmVsc2UoYmgpOworCQlnb3RvIG91dF9pbnZhbGlkOworCX0KKworCXNiaS0+bWF4X2NsdXN0ZXIgPSB0b3RhbF9jbHVzdGVycyArIEZBVF9TVEFSVF9FTlQ7CisJLyogY2hlY2sgdGhlIGZyZWVfY2x1c3RlcnMsIGl0J3Mgbm90IG5lY2Vzc2FyaWx5IGNvcnJlY3QgKi8KKwlpZiAoc2JpLT5mcmVlX2NsdXN0ZXJzICE9IC0xICYmIHNiaS0+ZnJlZV9jbHVzdGVycyA+IHRvdGFsX2NsdXN0ZXJzKQorCQlzYmktPmZyZWVfY2x1c3RlcnMgPSAtMTsKKwkvKiBjaGVjayB0aGUgcHJldl9mcmVlLCBpdCdzIG5vdCBuZWNlc3NhcmlseSBjb3JyZWN0ICovCisJc2JpLT5wcmV2X2ZyZWUgJT0gc2JpLT5tYXhfY2x1c3RlcjsKKwlpZiAoc2JpLT5wcmV2X2ZyZWUgPCBGQVRfU1RBUlRfRU5UKQorCQlzYmktPnByZXZfZnJlZSA9IEZBVF9TVEFSVF9FTlQ7CisKKwlicmVsc2UoYmgpOworCisJLyogc2V0IHVwIGVub3VnaCBzbyB0aGF0IGl0IGNhbiByZWFkIGFuIGlub2RlICovCisJZmF0X2hhc2hfaW5pdChzYik7CisJZmF0X2VudF9hY2Nlc3NfaW5pdChzYik7CisKKwkvKgorCSAqIFRoZSBsb3cgYnl0ZSBvZiBGQVQncyBmaXJzdCBlbnRyeSBtdXN0IGhhdmUgc2FtZSB2YWx1ZSB3aXRoCisJICogbWVkaWEtZmllbGQuICBCdXQgaW4gcmVhbCB3b3JsZCwgdG9vIG1hbnkgZGV2aWNlcyBpcworCSAqIHdyaXRpbmcgd3JvbmcgdmFsdWUuICBTbywgcmVtb3ZlZCB0aGF0IHZhbGlkaXR5IGNoZWNrLgorCSAqCisJICogaWYgKEZBVF9GSVJTVF9FTlQoc2IsIG1lZGlhKSAhPSBmaXJzdCkKKwkgKi8KKworCWVycm9yID0gLUVJTlZBTDsKKwlzcHJpbnRmKGJ1ZiwgImNwJWQiLCBzYmktPm9wdGlvbnMuY29kZXBhZ2UpOworCXNiaS0+bmxzX2Rpc2sgPSBsb2FkX25scyhidWYpOworCWlmICghc2JpLT5ubHNfZGlzaykgeworCQlwcmludGsoS0VSTl9FUlIgIkZBVDogY29kZXBhZ2UgJXMgbm90IGZvdW5kXG4iLCBidWYpOworCQlnb3RvIG91dF9mYWlsOworCX0KKworCS8qIEZJWE1FOiB1dGY4IGlzIHVzaW5nIGlvY2hhcnNldCBmb3IgdXBwZXIvbG93ZXIgY29udmVyc2lvbiAqLworCWlmIChzYmktPm9wdGlvbnMuaXN2ZmF0KSB7CisJCXNiaS0+bmxzX2lvID0gbG9hZF9ubHMoc2JpLT5vcHRpb25zLmlvY2hhcnNldCk7CisJCWlmICghc2JpLT5ubHNfaW8pIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRkFUOiBJTyBjaGFyc2V0ICVzIG5vdCBmb3VuZFxuIiwKKwkJCSAgICAgICBzYmktPm9wdGlvbnMuaW9jaGFyc2V0KTsKKwkJCWdvdG8gb3V0X2ZhaWw7CisJCX0KKwl9CisKKwllcnJvciA9IC1FTk9NRU07CisJcm9vdF9pbm9kZSA9IG5ld19pbm9kZShzYik7CisJaWYgKCFyb290X2lub2RlKQorCQlnb3RvIG91dF9mYWlsOworCXJvb3RfaW5vZGUtPmlfaW5vID0gTVNET1NfUk9PVF9JTk87CisJcm9vdF9pbm9kZS0+aV92ZXJzaW9uID0gMTsKKwllcnJvciA9IGZhdF9yZWFkX3Jvb3Qocm9vdF9pbm9kZSk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXRfZmFpbDsKKwllcnJvciA9IC1FTk9NRU07CisJaW5zZXJ0X2lub2RlX2hhc2gocm9vdF9pbm9kZSk7CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKKwlpZiAoIXNiLT5zX3Jvb3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGQVQ6IGdldCByb290IGlub2RlIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0X2ZhaWw7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9pbnZhbGlkOgorCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoIXNpbGVudCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVkZTOiBDYW4ndCBmaW5kIGEgdmFsaWQgRkFUIGZpbGVzeXN0ZW0iCisJCSAgICAgICAiIG9uIGRldiAlcy5cbiIsIHNiLT5zX2lkKTsKKworb3V0X2ZhaWw6CisJaWYgKHJvb3RfaW5vZGUpCisJCWlwdXQocm9vdF9pbm9kZSk7CisJaWYgKHNiaS0+bmxzX2lvKQorCQl1bmxvYWRfbmxzKHNiaS0+bmxzX2lvKTsKKwlpZiAoc2JpLT5ubHNfZGlzaykKKwkJdW5sb2FkX25scyhzYmktPm5sc19kaXNrKTsKKwlpZiAoc2JpLT5vcHRpb25zLmlvY2hhcnNldCAhPSBmYXRfZGVmYXVsdF9pb2NoYXJzZXQpCisJCWtmcmVlKHNiaS0+b3B0aW9ucy5pb2NoYXJzZXQpOworCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNiaSk7CisJcmV0dXJuIGVycm9yOworfQorCitFWFBPUlRfU1lNQk9MKGZhdF9maWxsX3N1cGVyKTsKKworaW50IF9faW5pdCBmYXRfY2FjaGVfaW5pdCh2b2lkKTsKK3ZvaWQgX19leGl0IGZhdF9jYWNoZV9kZXN0cm95KHZvaWQpOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2ZhdF9mcyh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBmYXRfY2FjaGVfaW5pdCgpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldHVybiBmYXRfaW5pdF9pbm9kZWNhY2hlKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2ZhdF9mcyh2b2lkKQoreworCWZhdF9jYWNoZV9kZXN0cm95KCk7CisJZmF0X2Rlc3Ryb3lfaW5vZGVjYWNoZSgpOworfQorCittb2R1bGVfaW5pdChpbml0X2ZhdF9mcykKK21vZHVsZV9leGl0KGV4aXRfZmF0X2ZzKQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9mYXQvbWlzYy5jIGIvZnMvZmF0L21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTBkZjIxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZmF0L21pc2MuYwpAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqICBsaW51eC9mcy9mYXQvbWlzYy5jCisgKgorICogIFdyaXR0ZW4gMTk5MiwxOTkzIGJ5IFdlcm5lciBBbG1lc2JlcmdlcgorICogIDIyLzExLzIwMDAgLSBGaXhlZCBmYXRfZGF0ZV91bml4MmRvcyBmb3IgZGF0ZXMgZWFybGllciB0aGFuIDAxLzAxLzE5ODAKKyAqCQkgYW5kIGRhdGVfZG9zMnVuaXggZm9yIGRhdGU9PTAgYnkgSWdvciBaaGJhbm92KGJzZ0B1bml5YXIuYWMucnUpCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbXNkb3NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisvKgorICogZmF0X2ZzX3BhbmljIHJlcG9ydHMgYSBzZXZlcmUgZmlsZSBzeXN0ZW0gcHJvYmxlbSBhbmQgc2V0cyB0aGUgZmlsZSBzeXN0ZW0KKyAqIHJlYWQtb25seS4gVGhlIGZpbGUgc3lzdGVtIGNhbiBiZSBtYWRlIHdyaXRhYmxlIGFnYWluIGJ5IHJlbW91bnRpbmcgaXQuCisgKi8KK3ZvaWQgZmF0X2ZzX3BhbmljKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJcHJpbnRrKEtFUk5fRVJSICJGQVQ6IEZpbGVzeXN0ZW0gcGFuaWMgKGRldiAlcylcbiIsIHMtPnNfaWQpOworCisJcHJpbnRrKEtFUk5fRVJSICIgICAgIik7CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwl2cHJpbnRrKGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXByaW50aygiXG4iKTsKKworCWlmICghKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCXMtPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCQlwcmludGsoS0VSTl9FUlIgIiAgICBGaWxlIHN5c3RlbSBoYXMgYmVlbiBzZXQgcmVhZC1vbmx5XG4iKTsKKwl9Cit9CisKK0VYUE9SVF9TWU1CT0woZmF0X2ZzX3BhbmljKTsKKworLyogRmx1c2hlcyB0aGUgbnVtYmVyIG9mIGZyZWUgY2x1c3RlcnMgb24gRkFUMzIgKi8KKy8qIFhYWDogTmVlZCB0byB3cml0ZSBvbmUgcGVyIEZTSU5GTyBibG9jay4gIEN1cnJlbnRseSBvbmx5IHdyaXRlcyAxICovCit2b2lkIGZhdF9jbHVzdGVyc19mbHVzaChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgZmF0X2Jvb3RfZnNpbmZvICpmc2luZm87CisKKwlpZiAoc2JpLT5mYXRfYml0cyAhPSAzMikKKwkJcmV0dXJuOworCisJYmggPSBzYl9icmVhZChzYiwgc2JpLT5mc2luZm9fc2VjdG9yKTsKKwlpZiAoYmggPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIkZBVDogYnJlYWQgZmFpbGVkIGluIGZhdF9jbHVzdGVyc19mbHVzaFxuIik7CisJCXJldHVybjsKKwl9CisKKwlmc2luZm8gPSAoc3RydWN0IGZhdF9ib290X2ZzaW5mbyAqKWJoLT5iX2RhdGE7CisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKCFJU19GU0lORk8oZnNpbmZvKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkZBVDogRGlkIG5vdCBmaW5kIHZhbGlkIEZTSU5GTyBzaWduYXR1cmUuXG4iCisJCSAgICAgICAiICAgICBGb3VuZCBzaWduYXR1cmUxIDB4JTA4eCBzaWduYXR1cmUyIDB4JTA4eCIKKwkJICAgICAgICIgKHNlY3RvciA9ICVsdSlcbiIsCisJCSAgICAgICBsZTMyX3RvX2NwdShmc2luZm8tPnNpZ25hdHVyZTEpLAorCQkgICAgICAgbGUzMl90b19jcHUoZnNpbmZvLT5zaWduYXR1cmUyKSwKKwkJICAgICAgIHNiaS0+ZnNpbmZvX3NlY3Rvcik7CisJfSBlbHNlIHsKKwkJaWYgKHNiaS0+ZnJlZV9jbHVzdGVycyAhPSAtMSkKKwkJCWZzaW5mby0+ZnJlZV9jbHVzdGVycyA9IGNwdV90b19sZTMyKHNiaS0+ZnJlZV9jbHVzdGVycyk7CisJCWlmIChzYmktPnByZXZfZnJlZSAhPSAtMSkKKwkJCWZzaW5mby0+bmV4dF9jbHVzdGVyID0gY3B1X3RvX2xlMzIoc2JpLT5wcmV2X2ZyZWUpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKQorCQkJc3luY19kaXJ0eV9idWZmZXIoYmgpOworCX0KKwlicmVsc2UoYmgpOworfQorCisvKgorICogZmF0X2NoYWluX2FkZCgpIGFkZHMgYSBuZXcgY2x1c3RlciB0byB0aGUgY2hhaW4gb2YgY2x1c3RlcnMgcmVwcmVzZW50ZWQKKyAqIGJ5IGlub2RlLgorICovCitpbnQgZmF0X2NoYWluX2FkZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbmV3X2RjbHVzLCBpbnQgbnJfY2x1c3RlcikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlpbnQgcmV0LCBuZXdfZmNsdXMsIGxhc3Q7CisKKwkvKgorCSAqIFdlIG11c3QgbG9jYXRlIHRoZSBsYXN0IGNsdXN0ZXIgb2YgdGhlIGZpbGUgdG8gYWRkIHRoaXMgbmV3CisJICogb25lIChuZXdfZGNsdXMpIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmsgbGlzdCAodGhlIEZBVCkuCisJICovCisJbGFzdCA9IG5ld19mY2x1cyA9IDA7CisJaWYgKE1TRE9TX0koaW5vZGUpLT5pX3N0YXJ0KSB7CisJCWludCBmY2x1cywgZGNsdXM7CisKKwkJcmV0ID0gZmF0X2dldF9jbHVzdGVyKGlub2RlLCBGQVRfRU5UX0VPRiwgJmZjbHVzLCAmZGNsdXMpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCW5ld19mY2x1cyA9IGZjbHVzICsgMTsKKwkJbGFzdCA9IGRjbHVzOworCX0KKworCS8qIGFkZCBuZXcgb25lIHRvIHRoZSBsYXN0IG9mIHRoZSBjbHVzdGVyIGNoYWluICovCisJaWYgKGxhc3QpIHsKKwkJc3RydWN0IGZhdF9lbnRyeSBmYXRlbnQ7CisKKwkJZmF0ZW50X2luaXQoJmZhdGVudCk7CisJCXJldCA9IGZhdF9lbnRfcmVhZChpbm9kZSwgJmZhdGVudCwgbGFzdCk7CisJCWlmIChyZXQgPj0gMCkgeworCQkJaW50IHdhaXQgPSBpbm9kZV9uZWVkc19zeW5jKGlub2RlKTsKKwkJCXJldCA9IGZhdF9lbnRfd3JpdGUoaW5vZGUsICZmYXRlbnQsIG5ld19kY2x1cywgd2FpdCk7CisJCQlmYXRlbnRfYnJlbHNlKCZmYXRlbnQpOworCQl9CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKy8vCQlmYXRfY2FjaGVfYWRkKGlub2RlLCBuZXdfZmNsdXMsIG5ld19kY2x1cyk7CisJfSBlbHNlIHsKKwkJTVNET1NfSShpbm9kZSktPmlfc3RhcnQgPSBuZXdfZGNsdXM7CisJCU1TRE9TX0koaW5vZGUpLT5pX2xvZ3N0YXJ0ID0gbmV3X2RjbHVzOworCQkvKgorCQkgKiBTaW5jZSBnZW5lcmljX29zeW5jX2lub2RlKCkgc3luY2hyb25pemUgbGF0ZXIgaWYKKwkJICogdGhpcyBpcyBub3QgZGlyZWN0b3J5LCB3ZSBkb24ndCBoZXJlLgorCQkgKi8KKwkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgSVNfRElSU1lOQyhpbm9kZSkpIHsKKwkJCXJldCA9IGZhdF9zeW5jX2lub2RlKGlub2RlKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlCisJCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl9CisJaWYgKG5ld19mY2x1cyAhPSAoaW5vZGUtPmlfYmxvY2tzID4+IChzYmktPmNsdXN0ZXJfYml0cyAtIDkpKSkgeworCQlmYXRfZnNfcGFuaWMoc2IsICJjbHVzdGVycyBiYWRseSBjb21wdXRlZCAoJWQgIT0gJWx1KSIsCisJCQluZXdfZmNsdXMsIGlub2RlLT5pX2Jsb2NrcyA+PiAoc2JpLT5jbHVzdGVyX2JpdHMgLSA5KSk7CisJCWZhdF9jYWNoZV9pbnZhbF9pbm9kZShpbm9kZSk7CisJfQorCWlub2RlLT5pX2Jsb2NrcyArPSBucl9jbHVzdGVyIDw8IChzYmktPmNsdXN0ZXJfYml0cyAtIDkpOworCisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OworCisvKiBMaW5lYXIgZGF5IG51bWJlcnMgb2YgdGhlIHJlc3BlY3RpdmUgMXN0cyBpbiBub24tbGVhcCB5ZWFycy4gKi8KK3N0YXRpYyBpbnQgZGF5X25bXSA9IHsKKyAgIC8qIEphbiAgRmViICBNYXIgIEFwciAgIE1heSAgSnVuICBKdWwgIEF1ZyAgU2VwICBPY3QgIE5vdiAgRGVjICovCisJMCwgIDMxLCAgNTksICA5MCwgIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0LCAwLCAwLCAwLCAwCit9OworCisvKiBDb252ZXJ0IGEgTVMtRE9TIHRpbWUvZGF0ZSBwYWlyIHRvIGEgVU5JWCBkYXRlIChzZWNvbmRzIHNpbmNlIDEgMSA3MCkuICovCitpbnQgZGF0ZV9kb3MydW5peCh1bnNpZ25lZCBzaG9ydCB0aW1lLCB1bnNpZ25lZCBzaG9ydCBkYXRlKQoreworCWludCBtb250aCwgeWVhciwgc2VjczsKKworCS8qCisJICogZmlyc3Qgc3VidHJhY3QgYW5kIG1hc2sgYWZ0ZXIgdGhhdC4uLiBPdGhlcndpc2UsIGlmCisJICogZGF0ZSA9PSAwLCBiYWQgdGhpbmdzIGhhcHBlbgorCSAqLworCW1vbnRoID0gKChkYXRlID4+IDUpIC0gMSkgJiAxNTsKKwl5ZWFyID0gZGF0ZSA+PiA5OworCXNlY3MgPSAodGltZSAmIDMxKSoyKzYwKigodGltZSA+PiA1KSAmIDYzKSsodGltZSA+PiAxMSkqMzYwMCs4NjQwMCoKKwkgICAgKChkYXRlICYgMzEpLTErZGF5X25bbW9udGhdKyh5ZWFyLzQpK3llYXIqMzY1LSgoeWVhciAmIDMpID09IDAgJiYKKwkgICAgbW9udGggPCAyID8gMSA6IDApKzM2NTMpOworCQkJLyogZGF5cyBzaW5jZSAxLjEuNzAgcGx1cyA4MCdzIGxlYXAgZGF5ICovCisJc2VjcyArPSBzeXNfdHoudHpfbWludXRlc3dlc3QqNjA7CisJcmV0dXJuIHNlY3M7Cit9CisKKy8qIENvbnZlcnQgbGluZWFyIFVOSVggZGF0ZSB0byBhIE1TLURPUyB0aW1lL2RhdGUgcGFpci4gKi8KK3ZvaWQgZmF0X2RhdGVfdW5peDJkb3MoaW50IHVuaXhfZGF0ZSwgX19sZTE2ICp0aW1lLCBfX2xlMTYgKmRhdGUpCit7CisJaW50IGRheSwgeWVhciwgbmxfZGF5LCBtb250aDsKKworCXVuaXhfZGF0ZSAtPSBzeXNfdHoudHpfbWludXRlc3dlc3QqNjA7CisKKwkvKiBKYW4gMSBHTVQgMDA6MDA6MDAgMTk4MC4gQnV0IHdoYXQgYWJvdXQgYW5vdGhlciB0aW1lIHpvbmU/ICovCisJaWYgKHVuaXhfZGF0ZSA8IDMxNTUzMjgwMCkKKwkJdW5peF9kYXRlID0gMzE1NTMyODAwOworCisJKnRpbWUgPSBjcHVfdG9fbGUxNigodW5peF9kYXRlICUgNjApLzIrKCgodW5peF9kYXRlLzYwKSAlIDYwKSA8PCA1KSsKKwkgICAgKCgodW5peF9kYXRlLzM2MDApICUgMjQpIDw8IDExKSk7CisJZGF5ID0gdW5peF9kYXRlLzg2NDAwLTM2NTI7CisJeWVhciA9IGRheS8zNjU7CisJaWYgKCh5ZWFyKzMpLzQrMzY1KnllYXIgPiBkYXkpCisJCXllYXItLTsKKwlkYXkgLT0gKHllYXIrMykvNCszNjUqeWVhcjsKKwlpZiAoZGF5ID09IDU5ICYmICEoeWVhciAmIDMpKSB7CisJCW5sX2RheSA9IGRheTsKKwkJbW9udGggPSAyOworCX0gZWxzZSB7CisJCW5sX2RheSA9ICh5ZWFyICYgMykgfHwgZGF5IDw9IDU5ID8gZGF5IDogZGF5LTE7CisJCWZvciAobW9udGggPSAwOyBtb250aCA8IDEyOyBtb250aCsrKSB7CisJCQlpZiAoZGF5X25bbW9udGhdID4gbmxfZGF5KQorCQkJCWJyZWFrOworCQl9CisJfQorCSpkYXRlID0gY3B1X3RvX2xlMTYobmxfZGF5LWRheV9uW21vbnRoLTFdKzErKG1vbnRoIDw8IDUpKyh5ZWFyIDw8IDkpKTsKK30KKworRVhQT1JUX1NZTUJPTChmYXRfZGF0ZV91bml4MmRvcyk7CisKK2ludCBmYXRfc3luY19iaHMoc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzLCBpbnQgbnJfYmhzKQoreworCWludCBpLCBlLCBlcnIgPSAwOworCisJZm9yIChpID0gMDsgaSA8IG5yX2JoczsgaSsrKSB7CisJCWxvY2tfYnVmZmVyKGJoc1tpXSk7CisJCWlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaHNbaV0pKSB7CisJCQlnZXRfYmgoYmhzW2ldKTsKKwkJCWJoc1tpXS0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX3dyaXRlX3N5bmM7CisJCQllID0gc3VibWl0X2JoKFdSSVRFLCBiaHNbaV0pOworCQkJaWYgKCFlcnIgJiYgZSkKKwkJCQllcnIgPSBlOworCQl9IGVsc2UKKwkJCXVubG9ja19idWZmZXIoYmhzW2ldKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IG5yX2JoczsgaSsrKSB7CisJCXdhaXRfb25fYnVmZmVyKGJoc1tpXSk7CisJCWlmIChidWZmZXJfZW9wbm90c3VwcChiaHNbaV0pKSB7CisJCQljbGVhcl9idWZmZXJfZW9wbm90c3VwcChiaHNbaV0pOworCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCX0gZWxzZSBpZiAoIWVyciAmJiAhYnVmZmVyX3VwdG9kYXRlKGJoc1tpXSkpCisJCQllcnIgPSAtRUlPOworCX0KKwlyZXR1cm4gZXJyOworfQorCitFWFBPUlRfU1lNQk9MKGZhdF9zeW5jX2Jocyk7CmRpZmYgLS1naXQgYS9mcy9mY250bC5jIGIvZnMvZmNudGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTcwODA2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZmNudGwuYwpAQCAtMCwwICsxLDYwMSBAQAorLyoKKyAqICBsaW51eC9mcy9mY250bC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKworI2luY2x1ZGUgPGFzbS9wb2xsLmg+CisjaW5jbHVkZSA8YXNtL3NpZ2luZm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCit2b2lkIGZhc3RjYWxsIHNldF9jbG9zZV9vbl9leGVjKHVuc2lnbmVkIGludCBmZCwgaW50IGZsYWcpCit7CisJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBjdXJyZW50LT5maWxlczsKKwlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCWlmIChmbGFnKQorCQlGRF9TRVQoZmQsIGZpbGVzLT5jbG9zZV9vbl9leGVjKTsKKwllbHNlCisJCUZEX0NMUihmZCwgZmlsZXMtPmNsb3NlX29uX2V4ZWMpOworCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X2Nsb3NlX29uX2V4ZWModW5zaWduZWQgaW50IGZkKQoreworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzID0gY3VycmVudC0+ZmlsZXM7CisJaW50IHJlczsKKwlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCXJlcyA9IEZEX0lTU0VUKGZkLCBmaWxlcy0+Y2xvc2Vfb25fZXhlYyk7CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBsb2NhdGVfZmQgZmluZHMgYSBmcmVlIGZpbGUgZGVzY3JpcHRvciBpbiB0aGUgb3Blbl9mZHMgZmRzZXQsCisgKiBleHBhbmRpbmcgdGhlIGZkIGFycmF5cyBpZiBuZWNlc3NhcnkuICBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZQorICogZmlsZV9sb2NrIGhlbGQgZm9yIHdyaXRlLgorICovCisKK3N0YXRpYyBpbnQgbG9jYXRlX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzLCAKKwkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IG9yaWdfc3RhcnQpCit7CisJdW5zaWduZWQgaW50IG5ld2ZkOworCXVuc2lnbmVkIGludCBzdGFydDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKG9yaWdfc3RhcnQgPj0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9OT0ZJTEVdLnJsaW1fY3VyKQorCQlnb3RvIG91dDsKKworcmVwZWF0OgorCS8qCisJICogU29tZW9uZSBtaWdodCBoYXZlIGNsb3NlZCBmZCdzIGluIHRoZSByYW5nZQorCSAqIG9yaWdfc3RhcnQuLmZpbGVzLT5uZXh0X2ZkCisJICovCisJc3RhcnQgPSBvcmlnX3N0YXJ0OworCWlmIChzdGFydCA8IGZpbGVzLT5uZXh0X2ZkKQorCQlzdGFydCA9IGZpbGVzLT5uZXh0X2ZkOworCisJbmV3ZmQgPSBzdGFydDsKKwlpZiAoc3RhcnQgPCBmaWxlcy0+bWF4X2Zkc2V0KSB7CisJCW5ld2ZkID0gZmluZF9uZXh0X3plcm9fYml0KGZpbGVzLT5vcGVuX2Zkcy0+ZmRzX2JpdHMsCisJCQlmaWxlcy0+bWF4X2Zkc2V0LCBzdGFydCk7CisJfQorCQorCWVycm9yID0gLUVNRklMRTsKKwlpZiAobmV3ZmQgPj0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9OT0ZJTEVdLnJsaW1fY3VyKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gZXhwYW5kX2ZpbGVzKGZpbGVzLCBuZXdmZCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIElmIHdlIG5lZWRlZCB0byBleHBhbmQgdGhlIGZzIGFycmF5IHdlCisJICogbWlnaHQgaGF2ZSBibG9ja2VkIC0gdHJ5IGFnYWluLgorCSAqLworCWlmIChlcnJvcikKKwkJZ290byByZXBlYXQ7CisKKwlpZiAoc3RhcnQgPD0gZmlsZXMtPm5leHRfZmQpCisJCWZpbGVzLT5uZXh0X2ZkID0gbmV3ZmQgKyAxOworCQorCWVycm9yID0gbmV3ZmQ7CisJCitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IGR1cGZkKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgc3RhcnQpCit7CisJc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzID0gY3VycmVudC0+ZmlsZXM7CisJaW50IGZkOworCisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlmZCA9IGxvY2F0ZV9mZChmaWxlcywgZmlsZSwgc3RhcnQpOworCWlmIChmZCA+PSAwKSB7CisJCUZEX1NFVChmZCwgZmlsZXMtPm9wZW5fZmRzKTsKKwkJRkRfQ0xSKGZkLCBmaWxlcy0+Y2xvc2Vfb25fZXhlYyk7CisJCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJZmRfaW5zdGFsbChmZCwgZmlsZSk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQlmcHV0KGZpbGUpOworCX0KKworCXJldHVybiBmZDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19kdXAyKHVuc2lnbmVkIGludCBvbGRmZCwgdW5zaWduZWQgaW50IG5ld2ZkKQoreworCWludCBlcnIgPSAtRUJBREY7CisJc3RydWN0IGZpbGUgKiBmaWxlLCAqdG9mcmVlOworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOworCisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlpZiAoIShmaWxlID0gZmNoZWNrKG9sZGZkKSkpCisJCWdvdG8gb3V0X3VubG9jazsKKwllcnIgPSBuZXdmZDsKKwlpZiAobmV3ZmQgPT0gb2xkZmQpCisJCWdvdG8gb3V0X3VubG9jazsKKwllcnIgPSAtRUJBREY7CisJaWYgKG5ld2ZkID49IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfTk9GSUxFXS5ybGltX2N1cikKKwkJZ290byBvdXRfdW5sb2NrOworCWdldF9maWxlKGZpbGUpOwkJCS8qIFdlIGFyZSBub3cgZmluaXNoZWQgd2l0aCBvbGRmZCAqLworCisJZXJyID0gZXhwYW5kX2ZpbGVzKGZpbGVzLCBuZXdmZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X2ZwdXQ7CisKKwkvKiBUbyBhdm9pZCByYWNlcyB3aXRoIG9wZW4oKSBhbmQgZHVwKCksIHdlIHdpbGwgbWFyayB0aGUgZmQgYXMKKwkgKiBpbi11c2UgaW4gdGhlIG9wZW4tZmlsZSBiaXRtYXAgdGhyb3VnaG91dCB0aGUgZW50aXJlIGR1cDIoKQorCSAqIHByb2Nlc3MuICBUaGlzIGlzIHF1aXRlIHNhZmU6IGRvX2Nsb3NlKCkgdXNlcyB0aGUgZmQgYXJyYXkKKwkgKiBlbnRyeSwgbm90IHRoZSBiaXRtYXAsIHRvIGRlY2lkZSB3aGF0IHdvcmsgbmVlZHMgdG8gYmUKKwkgKiBkb25lLiAgLS1zY3QgKi8KKwkvKiBEb2Vzbid0IHdvcmsuIG9wZW4oKSBtaWdodCBiZSB0aGVyZSBmaXJzdC4gLS1BViAqLworCisJLyogWWVzLiBJdCdzIGEgcmFjZS4gSW4gdXNlciBzcGFjZS4gTm90aGluZyBzYW5lIHRvIGRvICovCisJZXJyID0gLUVCVVNZOworCXRvZnJlZSA9IGZpbGVzLT5mZFtuZXdmZF07CisJaWYgKCF0b2ZyZWUgJiYgRkRfSVNTRVQobmV3ZmQsIGZpbGVzLT5vcGVuX2ZkcykpCisJCWdvdG8gb3V0X2ZwdXQ7CisKKwlmaWxlcy0+ZmRbbmV3ZmRdID0gZmlsZTsKKwlGRF9TRVQobmV3ZmQsIGZpbGVzLT5vcGVuX2Zkcyk7CisJRkRfQ0xSKG5ld2ZkLCBmaWxlcy0+Y2xvc2Vfb25fZXhlYyk7CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCisJaWYgKHRvZnJlZSkKKwkJZmlscF9jbG9zZSh0b2ZyZWUsIGZpbGVzKTsKKwllcnIgPSBuZXdmZDsKK291dDoKKwlyZXR1cm4gZXJyOworb3V0X3VubG9jazoKKwlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJZ290byBvdXQ7CisKK291dF9mcHV0OgorCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlmcHV0KGZpbGUpOworCWdvdG8gb3V0OworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2R1cCh1bnNpZ25lZCBpbnQgZmlsZGVzKQoreworCWludCByZXQgPSAtRUJBREY7CisJc3RydWN0IGZpbGUgKiBmaWxlID0gZmdldChmaWxkZXMpOworCisJaWYgKGZpbGUpCisJCXJldCA9IGR1cGZkKGZpbGUsIDApOworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgU0VURkxfTUFTSyAoT19BUFBFTkQgfCBPX05PTkJMT0NLIHwgT19OREVMQVkgfCBGQVNZTkMgfCBPX0RJUkVDVCB8IE9fTk9BVElNRSkKKworc3RhdGljIGludCBzZXRmbChpbnQgZmQsIHN0cnVjdCBmaWxlICogZmlscCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyb3IgPSAwOworCisJLyogT19BUFBFTkQgY2Fubm90IGJlIGNsZWFyZWQgaWYgdGhlIGZpbGUgaXMgbWFya2VkIGFzIGFwcGVuZC1vbmx5ICovCisJaWYgKCEoYXJnICYgT19BUFBFTkQpICYmIElTX0FQUEVORChpbm9kZSkpCisJCXJldHVybiAtRVBFUk07CisKKwkvKiBPX05PQVRJTUUgY2FuIG9ubHkgYmUgc2V0IGJ5IHRoZSBvd25lciBvciBzdXBlcnVzZXIgKi8KKwlpZiAoKGFyZyAmIE9fTk9BVElNRSkgJiYgIShmaWxwLT5mX2ZsYWdzICYgT19OT0FUSU1FKSkKKwkJaWYgKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkvKiByZXF1aXJlZCBmb3Igc3RyaWN0IFN1bk9TIGVtdWxhdGlvbiAqLworCWlmIChPX05PTkJMT0NLICE9IE9fTkRFTEFZKQorCSAgICAgICBpZiAoYXJnICYgT19OREVMQVkpCisJCSAgIGFyZyB8PSBPX05PTkJMT0NLOworCisJaWYgKGFyZyAmIE9fRElSRUNUKSB7CisJCWlmICghZmlscC0+Zl9tYXBwaW5nIHx8ICFmaWxwLT5mX21hcHBpbmctPmFfb3BzIHx8CisJCQkhZmlscC0+Zl9tYXBwaW5nLT5hX29wcy0+ZGlyZWN0X0lPKQorCQkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChmaWxwLT5mX29wICYmIGZpbHAtPmZfb3AtPmNoZWNrX2ZsYWdzKQorCQllcnJvciA9IGZpbHAtPmZfb3AtPmNoZWNrX2ZsYWdzKGFyZyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlsb2NrX2tlcm5lbCgpOworCWlmICgoYXJnIF4gZmlscC0+Zl9mbGFncykgJiBGQVNZTkMpIHsKKwkJaWYgKGZpbHAtPmZfb3AgJiYgZmlscC0+Zl9vcC0+ZmFzeW5jKSB7CisJCQllcnJvciA9IGZpbHAtPmZfb3AtPmZhc3luYyhmZCwgZmlscCwgKGFyZyAmIEZBU1lOQykgIT0gMCk7CisJCQlpZiAoZXJyb3IgPCAwKQorCQkJCWdvdG8gb3V0OworCQl9CisJfQorCisJZmlscC0+Zl9mbGFncyA9IChhcmcgJiBTRVRGTF9NQVNLKSB8IChmaWxwLT5mX2ZsYWdzICYgflNFVEZMX01BU0spOworIG91dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBmX21vZG93bihzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgbG9uZyBwaWQsCisgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIHVpZF90IGV1aWQsIGludCBmb3JjZSkKK3sKKwl3cml0ZV9sb2NrX2lycSgmZmlscC0+Zl9vd25lci5sb2NrKTsKKwlpZiAoZm9yY2UgfHwgIWZpbHAtPmZfb3duZXIucGlkKSB7CisJCWZpbHAtPmZfb3duZXIucGlkID0gcGlkOworCQlmaWxwLT5mX293bmVyLnVpZCA9IHVpZDsKKwkJZmlscC0+Zl9vd25lci5ldWlkID0gZXVpZDsKKwl9CisJd3JpdGVfdW5sb2NrX2lycSgmZmlscC0+Zl9vd25lci5sb2NrKTsKK30KKworaW50IGZfc2V0b3duKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIGFyZywgaW50IGZvcmNlKQoreworCWludCBlcnI7CisJCisJZXJyID0gc2VjdXJpdHlfZmlsZV9zZXRfZm93bmVyKGZpbHApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlmX21vZG93bihmaWxwLCBhcmcsIGN1cnJlbnQtPnVpZCwgY3VycmVudC0+ZXVpZCwgZm9yY2UpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKGZfc2V0b3duKTsKKwordm9pZCBmX2RlbG93bihzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlmX21vZG93bihmaWxwLCAwLCAwLCAwLCAxKTsKK30KKworc3RhdGljIGxvbmcgZG9fZmNudGwoaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywKKwkJc3RydWN0IGZpbGUgKmZpbHApCit7CisJbG9uZyBlcnIgPSAtRUlOVkFMOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEZfRFVQRkQ6CisJCWdldF9maWxlKGZpbHApOworCQllcnIgPSBkdXBmZChmaWxwLCBhcmcpOworCQlicmVhazsKKwljYXNlIEZfR0VURkQ6CisJCWVyciA9IGdldF9jbG9zZV9vbl9leGVjKGZkKSA/IEZEX0NMT0VYRUMgOiAwOworCQlicmVhazsKKwljYXNlIEZfU0VURkQ6CisJCWVyciA9IDA7CisJCXNldF9jbG9zZV9vbl9leGVjKGZkLCBhcmcgJiBGRF9DTE9FWEVDKTsKKwkJYnJlYWs7CisJY2FzZSBGX0dFVEZMOgorCQllcnIgPSBmaWxwLT5mX2ZsYWdzOworCQlicmVhazsKKwljYXNlIEZfU0VURkw6CisJCWVyciA9IHNldGZsKGZkLCBmaWxwLCBhcmcpOworCQlicmVhazsKKwljYXNlIEZfR0VUTEs6CisJCWVyciA9IGZjbnRsX2dldGxrKGZpbHAsIChzdHJ1Y3QgZmxvY2sgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCWNhc2UgRl9TRVRMSzoKKwljYXNlIEZfU0VUTEtXOgorCQllcnIgPSBmY250bF9zZXRsayhmaWxwLCBjbWQsIChzdHJ1Y3QgZmxvY2sgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCWNhc2UgRl9HRVRPV046CisJCS8qCisJCSAqIFhYWCBJZiBmX293bmVyIGlzIGEgcHJvY2VzcyBncm91cCwgdGhlCisJCSAqIG5lZ2F0aXZlIHJldHVybiB2YWx1ZSB3aWxsIGdldCBjb252ZXJ0ZWQKKwkJICogaW50byBhbiBlcnJvci4gIE9vcHMuICBJZiB3ZSBrZWVwIHRoZQorCQkgKiBjdXJyZW50IHN5c2NhbGwgY29udmVudGlvbnMsIHRoZSBvbmx5IHdheQorCQkgKiB0byBmaXggdGhpcyB3aWxsIGJlIGluIGxpYmMuCisJCSAqLworCQllcnIgPSBmaWxwLT5mX293bmVyLnBpZDsKKwkJZm9yY2Vfc3VjY2Vzc2Z1bF9zeXNjYWxsX3JldHVybigpOworCQlicmVhazsKKwljYXNlIEZfU0VUT1dOOgorCQllcnIgPSBmX3NldG93bihmaWxwLCBhcmcsIDEpOworCQlicmVhazsKKwljYXNlIEZfR0VUU0lHOgorCQllcnIgPSBmaWxwLT5mX293bmVyLnNpZ251bTsKKwkJYnJlYWs7CisJY2FzZSBGX1NFVFNJRzoKKwkJLyogYXJnID09IDAgcmVzdG9yZXMgZGVmYXVsdCBiZWhhdmlvdXIuICovCisJCWlmIChhcmcgPCAwIHx8IGFyZyA+IF9OU0lHKSB7CisJCQlicmVhazsKKwkJfQorCQllcnIgPSAwOworCQlmaWxwLT5mX293bmVyLnNpZ251bSA9IGFyZzsKKwkJYnJlYWs7CisJY2FzZSBGX0dFVExFQVNFOgorCQllcnIgPSBmY250bF9nZXRsZWFzZShmaWxwKTsKKwkJYnJlYWs7CisJY2FzZSBGX1NFVExFQVNFOgorCQllcnIgPSBmY250bF9zZXRsZWFzZShmZCwgZmlscCwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGX05PVElGWToKKwkJZXJyID0gZmNudGxfZGlybm90aWZ5KGZkLCBmaWxwLCBhcmcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIGVycjsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19mY250bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorewkKKwlzdHJ1Y3QgZmlsZSAqZmlscDsKKwlsb25nIGVyciA9IC1FQkFERjsKKworCWZpbHAgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbHApCisJCWdvdG8gb3V0OworCisJZXJyID0gc2VjdXJpdHlfZmlsZV9mY250bChmaWxwLCBjbWQsIGFyZyk7CisJaWYgKGVycikgeworCQlmcHV0KGZpbHApOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IGRvX2ZjbnRsKGZkLCBjbWQsIGFyZywgZmlscCk7CisKKyAJZnB1dChmaWxwKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorYXNtbGlua2FnZSBsb25nIHN5c19mY250bDY0KHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CQorCXN0cnVjdCBmaWxlICogZmlscDsKKwlsb25nIGVycjsKKworCWVyciA9IC1FQkFERjsKKwlmaWxwID0gZmdldChmZCk7CisJaWYgKCFmaWxwKQorCQlnb3RvIG91dDsKKworCWVyciA9IHNlY3VyaXR5X2ZpbGVfZmNudGwoZmlscCwgY21kLCBhcmcpOworCWlmIChlcnIpIHsKKwkJZnB1dChmaWxwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZXJyID0gLUVCQURGOworCQorCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgRl9HRVRMSzY0OgorCQkJZXJyID0gZmNudGxfZ2V0bGs2NChmaWxwLCAoc3RydWN0IGZsb2NrNjQgX191c2VyICopIGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSBGX1NFVExLNjQ6CisJCWNhc2UgRl9TRVRMS1c2NDoKKwkJCWVyciA9IGZjbnRsX3NldGxrNjQoZmlscCwgY21kLCAoc3RydWN0IGZsb2NrNjQgX191c2VyICopIGFyZyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVyciA9IGRvX2ZjbnRsKGZkLCBjbWQsIGFyZywgZmlscCk7CisJCQlicmVhazsKKwl9CisJZnB1dChmaWxwKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKKy8qIFRhYmxlIHRvIGNvbnZlcnQgc2lnaW8gc2lnbmFsIGNvZGVzIGludG8gcG9sbCBiYW5kIGJpdG1hcHMgKi8KKworc3RhdGljIGxvbmcgYmFuZF90YWJsZVtOU0lHUE9MTF0gPSB7CisJUE9MTElOIHwgUE9MTFJETk9STSwJCQkvKiBQT0xMX0lOICovCisJUE9MTE9VVCB8IFBPTExXUk5PUk0gfCBQT0xMV1JCQU5ELAkvKiBQT0xMX09VVCAqLworCVBPTExJTiB8IFBPTExSRE5PUk0gfCBQT0xMTVNHLAkJLyogUE9MTF9NU0cgKi8KKwlQT0xMRVJSLAkJCQkvKiBQT0xMX0VSUiAqLworCVBPTExQUkkgfCBQT0xMUkRCQU5ELAkJCS8qIFBPTExfUFJJICovCisJUE9MTEhVUCB8IFBPTExFUlIJCQkvKiBQT0xMX0hVUCAqLworfTsKKworc3RhdGljIGlubGluZSBpbnQgc2lnaW9fcGVybShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBmb3duX3N0cnVjdCAqZm93biwgaW50IHNpZykKK3sKKwlyZXR1cm4gKCgoZm93bi0+ZXVpZCA9PSAwKSB8fAorCQkgKGZvd24tPmV1aWQgPT0gcC0+c3VpZCkgfHwgKGZvd24tPmV1aWQgPT0gcC0+dWlkKSB8fAorCQkgKGZvd24tPnVpZCA9PSBwLT5zdWlkKSB8fCAoZm93bi0+dWlkID09IHAtPnVpZCkpICYmCisJCSFzZWN1cml0eV9maWxlX3NlbmRfc2lnaW90YXNrKHAsIGZvd24sIHNpZykpOworfQorCitzdGF0aWMgdm9pZCBzZW5kX3NpZ2lvX3RvX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwLAorCQkJICAgICAgIHN0cnVjdCBmb3duX3N0cnVjdCAqZm93biwgCisJCQkgICAgICAgaW50IGZkLAorCQkJICAgICAgIGludCByZWFzb24pCit7CisJaWYgKCFzaWdpb19wZXJtKHAsIGZvd24sIGZvd24tPnNpZ251bSkpCisJCXJldHVybjsKKworCXN3aXRjaCAoZm93bi0+c2lnbnVtKSB7CisJCXNpZ2luZm9fdCBzaTsKKwkJZGVmYXVsdDoKKwkJCS8qIFF1ZXVlIGEgcnQgc2lnbmFsIHdpdGggdGhlIGFwcHJvcHJpYXRlIGZkIGFzIGl0cworCQkJICAgdmFsdWUuICBXZSB1c2UgU0lfU0lHSU8gYXMgdGhlIHNvdXJjZSwgbm90IAorCQkJICAgU0lfS0VSTkVMLCBzaW5jZSBrZXJuZWwgc2lnbmFscyBhbHdheXMgZ2V0IAorCQkJICAgZGVsaXZlcmVkIGV2ZW4gaWYgd2UgY2FuJ3QgcXVldWUuICBGYWlsdXJlIHRvCisJCQkgICBxdWV1ZSBpbiB0aGlzIGNhc2UgX3Nob3VsZF8gYmUgcmVwb3J0ZWQ7IHdlIGZhbGwKKwkJCSAgIGJhY2sgdG8gU0lHSU8gaW4gdGhhdCBjYXNlLiAtLXNjdCAqLworCQkJc2kuc2lfc2lnbm8gPSBmb3duLT5zaWdudW07CisJCQlzaS5zaV9lcnJubyA9IDA7CisJCSAgICAgICAgc2kuc2lfY29kZSAgPSByZWFzb247CisJCQkvKiBNYWtlIHN1cmUgd2UgYXJlIGNhbGxlZCB3aXRoIG9uZSBvZiB0aGUgUE9MTF8qCisJCQkgICByZWFzb25zLCBvdGhlcndpc2Ugd2UgY291bGQgbGVhayBrZXJuZWwgc3RhY2sgaW50bworCQkJICAgdXNlcnNwYWNlLiAgKi8KKwkJCWlmICgocmVhc29uICYgX19TSV9NQVNLKSAhPSBfX1NJX1BPTEwpCisJCQkJQlVHKCk7CisJCQlpZiAocmVhc29uIC0gUE9MTF9JTiA+PSBOU0lHUE9MTCkKKwkJCQlzaS5zaV9iYW5kICA9IH4wTDsKKwkJCWVsc2UKKwkJCQlzaS5zaV9iYW5kID0gYmFuZF90YWJsZVtyZWFzb24gLSBQT0xMX0lOXTsKKwkJCXNpLnNpX2ZkICAgID0gZmQ7CisJCQlpZiAoIXNlbmRfc2lnX2luZm8oZm93bi0+c2lnbnVtLCAmc2ksIHApKQorCQkJCWJyZWFrOworCQkvKiBmYWxsLXRocm91Z2g6IGZhbGwgYmFjayBvbiB0aGUgb2xkIHBsYWluIFNJR0lPIHNpZ25hbCAqLworCQljYXNlIDA6CisJCQlzZW5kX2dyb3VwX3NpZ19pbmZvKFNJR0lPLCBTRU5EX1NJR19QUklWLCBwKTsKKwl9Cit9CisKK3ZvaWQgc2VuZF9zaWdpbyhzdHJ1Y3QgZm93bl9zdHJ1Y3QgKmZvd24sIGludCBmZCwgaW50IGJhbmQpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCWludCBwaWQ7CisJCisJcmVhZF9sb2NrKCZmb3duLT5sb2NrKTsKKwlwaWQgPSBmb3duLT5waWQ7CisJaWYgKCFwaWQpCisJCWdvdG8gb3V0X3VubG9ja19mb3duOworCQorCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJaWYgKHBpZCA+IDApIHsKKwkJcCA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKKwkJaWYgKHApIHsKKwkJCXNlbmRfc2lnaW9fdG9fdGFzayhwLCBmb3duLCBmZCwgYmFuZCk7CisJCX0KKwl9IGVsc2UgeworCQlkb19lYWNoX3Rhc2tfcGlkKC1waWQsIFBJRFRZUEVfUEdJRCwgcCkgeworCQkJc2VuZF9zaWdpb190b190YXNrKHAsIGZvd24sIGZkLCBiYW5kKTsKKwkJfSB3aGlsZV9lYWNoX3Rhc2tfcGlkKC1waWQsIFBJRFRZUEVfUEdJRCwgcCk7CisJfQorCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKyBvdXRfdW5sb2NrX2Zvd246CisJcmVhZF91bmxvY2soJmZvd24tPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBzZW5kX3NpZ3VyZ190b190YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZvd25fc3RydWN0ICpmb3duKQoreworCWlmIChzaWdpb19wZXJtKHAsIGZvd24sIFNJR1VSRykpCisJCXNlbmRfZ3JvdXBfc2lnX2luZm8oU0lHVVJHLCBTRU5EX1NJR19QUklWLCBwKTsKK30KKworaW50IHNlbmRfc2lndXJnKHN0cnVjdCBmb3duX3N0cnVjdCAqZm93bikKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CisJaW50IHBpZCwgcmV0ID0gMDsKKwkKKwlyZWFkX2xvY2soJmZvd24tPmxvY2spOworCXBpZCA9IGZvd24tPnBpZDsKKwlpZiAoIXBpZCkKKwkJZ290byBvdXRfdW5sb2NrX2Zvd247CisKKwlyZXQgPSAxOworCQorCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJaWYgKHBpZCA+IDApIHsKKwkJcCA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKKwkJaWYgKHApIHsKKwkJCXNlbmRfc2lndXJnX3RvX3Rhc2socCwgZm93bik7CisJCX0KKwl9IGVsc2UgeworCQlkb19lYWNoX3Rhc2tfcGlkKC1waWQsIFBJRFRZUEVfUEdJRCwgcCkgeworCQkJc2VuZF9zaWd1cmdfdG9fdGFzayhwLCBmb3duKTsKKwkJfSB3aGlsZV9lYWNoX3Rhc2tfcGlkKC1waWQsIFBJRFRZUEVfUEdJRCwgcCk7CisJfQorCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKyBvdXRfdW5sb2NrX2Zvd246CisJcmVhZF91bmxvY2soJmZvd24tPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBERUZJTkVfUldMT0NLKGZhc3luY19sb2NrKTsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmZhc3luY19jYWNoZTsKKworLyoKKyAqIGZhc3luY19oZWxwZXIoKSBpcyB1c2VkIGJ5IHNvbWUgY2hhcmFjdGVyIGRldmljZSBkcml2ZXJzIChtYWlubHkgbWljZSkKKyAqIHRvIHNldCB1cCB0aGUgZmFzeW5jIHF1ZXVlLiBJdCByZXR1cm5zIG5lZ2F0aXZlIG9uIGVycm9yLCAwIGlmIGl0IGRpZAorICogbm8gY2hhbmdlcyBhbmQgcG9zaXRpdmUgaWYgaXQgYWRkZWQvZGVsZXRlZCB0aGUgZW50cnkuCisgKi8KK2ludCBmYXN5bmNfaGVscGVyKGludCBmZCwgc3RydWN0IGZpbGUgKiBmaWxwLCBpbnQgb24sIHN0cnVjdCBmYXN5bmNfc3RydWN0ICoqZmFwcCkKK3sKKwlzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqZmEsICoqZnA7CisJc3RydWN0IGZhc3luY19zdHJ1Y3QgKm5ldyA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisKKwlpZiAob24pIHsKKwkJbmV3ID0ga21lbV9jYWNoZV9hbGxvYyhmYXN5bmNfY2FjaGUsIFNMQUJfS0VSTkVMKTsKKwkJaWYgKCFuZXcpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJd3JpdGVfbG9ja19pcnEoJmZhc3luY19sb2NrKTsKKwlmb3IgKGZwID0gZmFwcDsgKGZhID0gKmZwKSAhPSBOVUxMOyBmcCA9ICZmYS0+ZmFfbmV4dCkgeworCQlpZiAoZmEtPmZhX2ZpbGUgPT0gZmlscCkgeworCQkJaWYob24pIHsKKwkJCQlmYS0+ZmFfZmQgPSBmZDsKKwkJCQlrbWVtX2NhY2hlX2ZyZWUoZmFzeW5jX2NhY2hlLCBuZXcpOworCQkJfSBlbHNlIHsKKwkJCQkqZnAgPSBmYS0+ZmFfbmV4dDsKKwkJCQlrbWVtX2NhY2hlX2ZyZWUoZmFzeW5jX2NhY2hlLCBmYSk7CisJCQkJcmVzdWx0ID0gMTsKKwkJCX0KKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKG9uKSB7CisJCW5ldy0+bWFnaWMgPSBGQVNZTkNfTUFHSUM7CisJCW5ldy0+ZmFfZmlsZSA9IGZpbHA7CisJCW5ldy0+ZmFfZmQgPSBmZDsKKwkJbmV3LT5mYV9uZXh0ID0gKmZhcHA7CisJCSpmYXBwID0gbmV3OworCQlyZXN1bHQgPSAxOworCX0KK291dDoKKwl3cml0ZV91bmxvY2tfaXJxKCZmYXN5bmNfbG9jayk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworRVhQT1JUX1NZTUJPTChmYXN5bmNfaGVscGVyKTsKKwordm9pZCBfX2tpbGxfZmFzeW5jKHN0cnVjdCBmYXN5bmNfc3RydWN0ICpmYSwgaW50IHNpZywgaW50IGJhbmQpCit7CisJd2hpbGUgKGZhKSB7CisJCXN0cnVjdCBmb3duX3N0cnVjdCAqIGZvd247CisJCWlmIChmYS0+bWFnaWMgIT0gRkFTWU5DX01BR0lDKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImtpbGxfZmFzeW5jOiBiYWQgbWFnaWMgbnVtYmVyIGluICIKKwkJCSAgICAgICAiZmFzeW5jX3N0cnVjdCFcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWZvd24gPSAmZmEtPmZhX2ZpbGUtPmZfb3duZXI7CisJCS8qIERvbid0IHNlbmQgU0lHVVJHIHRvIHByb2Nlc3NlcyB3aGljaCBoYXZlIG5vdCBzZXQgYQorCQkgICBxdWV1ZWQgc2lnbnVtOiBTSUdVUkcgaGFzIGl0cyBvd24gZGVmYXVsdCBzaWduYWxsaW5nCisJCSAgIG1lY2hhbmlzbS4gKi8KKwkJaWYgKCEoc2lnID09IFNJR1VSRyAmJiBmb3duLT5zaWdudW0gPT0gMCkpCisJCQlzZW5kX3NpZ2lvKGZvd24sIGZhLT5mYV9mZCwgYmFuZCk7CisJCWZhID0gZmEtPmZhX25leHQ7CisJfQorfQorCitFWFBPUlRfU1lNQk9MKF9fa2lsbF9mYXN5bmMpOworCit2b2lkIGtpbGxfZmFzeW5jKHN0cnVjdCBmYXN5bmNfc3RydWN0ICoqZnAsIGludCBzaWcsIGludCBiYW5kKQoreworCS8qIEZpcnN0IGEgcXVpY2sgdGVzdCB3aXRob3V0IGxvY2tpbmc6IHVzdWFsbHkKKwkgKiB0aGUgbGlzdCBpcyBlbXB0eS4KKwkgKi8KKwlpZiAoKmZwKSB7CisJCXJlYWRfbG9jaygmZmFzeW5jX2xvY2spOworCQkvKiByZXJlYWQgKmZwIGFmdGVyIG9idGFpbmluZyB0aGUgbG9jayAqLworCQlfX2tpbGxfZmFzeW5jKCpmcCwgc2lnLCBiYW5kKTsKKwkJcmVhZF91bmxvY2soJmZhc3luY19sb2NrKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGtpbGxfZmFzeW5jKTsKKworc3RhdGljIGludCBfX2luaXQgZmFzeW5jX2luaXQodm9pZCkKK3sKKwlmYXN5bmNfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZmFzeW5jX2NhY2hlIiwKKwkJc2l6ZW9mKHN0cnVjdCBmYXN5bmNfc3RydWN0KSwgMCwgU0xBQl9QQU5JQywgTlVMTCwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KGZhc3luY19pbml0KQpkaWZmIC0tZ2l0IGEvZnMvZmlmby5jIGIvZnMvZmlmby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTU5MTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9maWZvLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiAgbGludXgvZnMvZmlmby5jCisgKgorICogIHdyaXR0ZW4gYnkgUGF1bCBILiBIYXJncm92ZQorICoKKyAqICBGaXhlczoKKyAqCTEwLTA2LTE5OTksIEFWOiBmaXhlZCBPT00gaGFuZGxpbmcgaW4gZmlmb19vcGVuKCksIG1vdmVkCisgKgkJCWluaXRpYWxpemF0aW9uIHRoZXJlLCBzd2l0Y2hlZCB0byBleHRlcm5hbAorICoJCQlhbGxvY2F0aW9uIG9mIHBpcGVfaW5vZGVfaW5mby4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BpcGVfZnNfaS5oPgorCitzdGF0aWMgdm9pZCB3YWl0X2Zvcl9wYXJ0bmVyKHN0cnVjdCBpbm9kZSogaW5vZGUsIHVuc2lnbmVkIGludCogY250KQoreworCWludCBjdXIgPSAqY250OwkKKwl3aGlsZShjdXIgPT0gKmNudCkgeworCQlwaXBlX3dhaXQoaW5vZGUpOworCQlpZihzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgd2FrZV91cF9wYXJ0bmVyKHN0cnVjdCBpbm9kZSogaW5vZGUpCit7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKFBJUEVfV0FJVCgqaW5vZGUpKTsKK30KKworc3RhdGljIGludCBmaWZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJaW50IHJldDsKKworCXJldCA9IC1FUkVTVEFSVFNZUzsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKFBJUEVfU0VNKCppbm9kZSkpKQorCQlnb3RvIGVycl9ub2xvY2tfbm9jbGVhbnVwOworCisJaWYgKCFpbm9kZS0+aV9waXBlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWlmKCFwaXBlX25ldyhpbm9kZSkpCisJCQlnb3RvIGVycl9ub2NsZWFudXA7CisJfQorCWZpbHAtPmZfdmVyc2lvbiA9IDA7CisKKwkvKiBXZSBjYW4gb25seSBkbyByZWd1bGFyIHJlYWQvd3JpdGUgb24gZmlmb3MgKi8KKwlmaWxwLT5mX21vZGUgJj0gKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CisKKwlzd2l0Y2ggKGZpbHAtPmZfbW9kZSkgeworCWNhc2UgMToKKwkvKgorCSAqICBPX1JET05MWQorCSAqICBQT1NJWC4xIHNheXMgdGhhdCBPX05PTkJMT0NLIG1lYW5zIHJldHVybiB3aXRoIHRoZSBGSUZPCisJICogIG9wZW5lZCwgZXZlbiB3aGVuIHRoZXJlIGlzIG5vIHByb2Nlc3Mgd3JpdGluZyB0aGUgRklGTy4KKwkgKi8KKwkJZmlscC0+Zl9vcCA9ICZyZWFkX2ZpZm9fZm9wczsKKwkJUElQRV9SQ09VTlRFUigqaW5vZGUpKys7CisJCWlmIChQSVBFX1JFQURFUlMoKmlub2RlKSsrID09IDApCisJCQl3YWtlX3VwX3BhcnRuZXIoaW5vZGUpOworCisJCWlmICghUElQRV9XUklURVJTKCppbm9kZSkpIHsKKwkJCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKSB7CisJCQkJLyogc3VwcHJlc3MgUE9MTEhVUCB1bnRpbCB3ZSBoYXZlCisJCQkJICogc2VlbiBhIHdyaXRlciAqLworCQkJCWZpbHAtPmZfdmVyc2lvbiA9IFBJUEVfV0NPVU5URVIoKmlub2RlKTsKKwkJCX0gZWxzZSAKKwkJCXsKKwkJCQl3YWl0X2Zvcl9wYXJ0bmVyKGlub2RlLCAmUElQRV9XQ09VTlRFUigqaW5vZGUpKTsKKwkJCQlpZihzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQkJZ290byBlcnJfcmQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJCisJY2FzZSAyOgorCS8qCisJICogIE9fV1JPTkxZCisJICogIFBPU0lYLjEgc2F5cyB0aGF0IE9fTk9OQkxPQ0sgbWVhbnMgcmV0dXJuIC0xIHdpdGgKKwkgKiAgZXJybm89RU5YSU8gd2hlbiB0aGVyZSBpcyBubyBwcm9jZXNzIHJlYWRpbmcgdGhlIEZJRk8uCisJICovCisJCXJldCA9IC1FTlhJTzsKKwkJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYgIVBJUEVfUkVBREVSUygqaW5vZGUpKQorCQkJZ290byBlcnI7CisKKwkJZmlscC0+Zl9vcCA9ICZ3cml0ZV9maWZvX2ZvcHM7CisJCVBJUEVfV0NPVU5URVIoKmlub2RlKSsrOworCQlpZiAoIVBJUEVfV1JJVEVSUygqaW5vZGUpKyspCisJCQl3YWtlX3VwX3BhcnRuZXIoaW5vZGUpOworCisJCWlmICghUElQRV9SRUFERVJTKCppbm9kZSkpIHsKKwkJCXdhaXRfZm9yX3BhcnRuZXIoaW5vZGUsICZQSVBFX1JDT1VOVEVSKCppbm9kZSkpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCWdvdG8gZXJyX3dyOworCQl9CisJCWJyZWFrOworCQorCWNhc2UgMzoKKwkvKgorCSAqICBPX1JEV1IKKwkgKiAgUE9TSVguMSBsZWF2ZXMgdGhpcyBjYXNlICJ1bmRlZmluZWQiIHdoZW4gT19OT05CTE9DSyBpcyBzZXQuCisJICogIFRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBORVZFUiBibG9jayBvbiBhIE9fUkRXUiBvcGVuLCBzaW5jZQorCSAqICB0aGUgcHJvY2VzcyBjYW4gYXQgbGVhc3QgdGFsayB0byBpdHNlbGYuCisJICovCisJCWZpbHAtPmZfb3AgPSAmcmR3cl9maWZvX2ZvcHM7CisKKwkJUElQRV9SRUFERVJTKCppbm9kZSkrKzsKKwkJUElQRV9XUklURVJTKCppbm9kZSkrKzsKKwkJUElQRV9SQ09VTlRFUigqaW5vZGUpKys7CisJCVBJUEVfV0NPVU5URVIoKmlub2RlKSsrOworCQlpZiAoUElQRV9SRUFERVJTKCppbm9kZSkgPT0gMSB8fCBQSVBFX1dSSVRFUlMoKmlub2RlKSA9PSAxKQorCQkJd2FrZV91cF9wYXJ0bmVyKGlub2RlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBPayEgKi8KKwl1cChQSVBFX1NFTSgqaW5vZGUpKTsKKwlyZXR1cm4gMDsKKworZXJyX3JkOgorCWlmICghLS1QSVBFX1JFQURFUlMoKmlub2RlKSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKFBJUEVfV0FJVCgqaW5vZGUpKTsKKwlyZXQgPSAtRVJFU1RBUlRTWVM7CisJZ290byBlcnI7CisKK2Vycl93cjoKKwlpZiAoIS0tUElQRV9XUklURVJTKCppbm9kZSkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZShQSVBFX1dBSVQoKmlub2RlKSk7CisJcmV0ID0gLUVSRVNUQVJUU1lTOworCWdvdG8gZXJyOworCitlcnI6CisJaWYgKCFQSVBFX1JFQURFUlMoKmlub2RlKSAmJiAhUElQRV9XUklURVJTKCppbm9kZSkpCisJCWZyZWVfcGlwZV9pbmZvKGlub2RlKTsKKworZXJyX25vY2xlYW51cDoKKwl1cChQSVBFX1NFTSgqaW5vZGUpKTsKKworZXJyX25vbG9ja19ub2NsZWFudXA6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIER1bW15IGRlZmF1bHQgZmlsZS1vcGVyYXRpb25zOiB0aGUgb25seSB0aGluZyB0aGlzIGRvZXMKKyAqIGlzIGNvbnRhaW4gdGhlIG9wZW4gdGhhdCB0aGVuIGZpbGxzIGluIHRoZSBjb3JyZWN0IG9wZXJhdGlvbnMKKyAqIGRlcGVuZGluZyBvbiB0aGUgYWNjZXNzIG1vZGUgb2YgdGhlIGZpbGUuLi4KKyAqLworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWZfZmlmb19mb3BzID0geworCS5vcGVuCQk9IGZpZm9fb3BlbiwJLyogd2lsbCBzZXQgcmVhZCBvciB3cml0ZSBwaXBlX2ZvcHMgKi8KK307CmRpZmYgLS1naXQgYS9mcy9maWxlLmMgYi9mcy9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiNWYyNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2ZpbGUuYwpAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAqICBsaW51eC9mcy9maWxlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4LTE5OTksIFN0ZXBoZW4gVHdlZWRpZSBhbmQgQmlsbCBIYXdlcworICoKKyAqICBNYW5hZ2UgdGhlIGR5bmFtaWMgZmQgYXJyYXlzIGluIHRoZSBwcm9jZXNzIGZpbGVzX3N0cnVjdC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworCisvKgorICogQWxsb2NhdGUgYW4gZmQgYXJyYXksIHVzaW5nIGttYWxsb2Mgb3Igdm1hbGxvYy4KKyAqIE5vdGU6IHRoZSBhcnJheSBpc24ndCBjbGVhcmVkIGF0IGFsbG9jYXRpb24gdGltZS4KKyAqLworc3RydWN0IGZpbGUgKiogYWxsb2NfZmRfYXJyYXkoaW50IG51bSkKK3sKKwlzdHJ1Y3QgZmlsZSAqKm5ld19mZHM7CisJaW50IHNpemUgPSBudW0gKiBzaXplb2Yoc3RydWN0IGZpbGUgKik7CisKKwlpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpCisJCW5ld19mZHMgPSAoc3RydWN0IGZpbGUgKiopIGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJZWxzZSAKKwkJbmV3X2ZkcyA9IChzdHJ1Y3QgZmlsZSAqKikgdm1hbGxvYyhzaXplKTsKKwlyZXR1cm4gbmV3X2ZkczsKK30KKwordm9pZCBmcmVlX2ZkX2FycmF5KHN0cnVjdCBmaWxlICoqYXJyYXksIGludCBudW0pCit7CisJaW50IHNpemUgPSBudW0gKiBzaXplb2Yoc3RydWN0IGZpbGUgKik7CisKKwlpZiAoIWFycmF5KSB7CisJCXByaW50ayAoS0VSTl9FUlIgImZyZWVfZmRfYXJyYXk6IGFycmF5ID0gMCAobnVtID0gJWQpXG4iLCBudW0pOworCQlyZXR1cm47CisJfQorCisJaWYgKG51bSA8PSBOUl9PUEVOX0RFRkFVTFQpIC8qIERvbid0IGZyZWUgdGhlIGVtYmVkZGVkIGZkIGFycmF5ISAqLworCQlyZXR1cm47CisJZWxzZSBpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpCisJCWtmcmVlKGFycmF5KTsKKwllbHNlCisJCXZmcmVlKGFycmF5KTsKK30KKworLyoKKyAqIEV4cGFuZCB0aGUgZmQgYXJyYXkgaW4gdGhlIGZpbGVzX3N0cnVjdC4gIENhbGxlZCB3aXRoIHRoZSBmaWxlcworICogc3BpbmxvY2sgaGVsZCBmb3Igd3JpdGUuCisgKi8KKworc3RhdGljIGludCBleHBhbmRfZmRfYXJyYXkoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMsIGludCBucikKKwlfX3JlbGVhc2VzKGZpbGVzLT5maWxlX2xvY2spCisJX19hY3F1aXJlcyhmaWxlcy0+ZmlsZV9sb2NrKQoreworCXN0cnVjdCBmaWxlICoqbmV3X2ZkczsKKwlpbnQgZXJyb3IsIG5mZHM7CisKKwkKKwllcnJvciA9IC1FTUZJTEU7CisJaWYgKGZpbGVzLT5tYXhfZmRzID49IE5SX09QRU4gfHwgbnIgPj0gTlJfT1BFTikKKwkJZ290byBvdXQ7CisKKwluZmRzID0gZmlsZXMtPm1heF9mZHM7CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCisJLyogCisJICogRXhwYW5kIHRvIHRoZSBtYXggaW4gZWFzeSBzdGVwcywgYW5kIGtlZXAgZXhwYW5kaW5nIGl0IHVudGlsCisJICogd2UgaGF2ZSBlbm91Z2ggZm9yIHRoZSByZXF1ZXN0ZWQgZmQgYXJyYXkgc2l6ZS4gCisJICovCisKKwlkbyB7CisjaWYgTlJfT1BFTl9ERUZBVUxUIDwgMjU2CisJCWlmIChuZmRzIDwgMjU2KQorCQkJbmZkcyA9IDI1NjsKKwkJZWxzZSAKKyNlbmRpZgorCQlpZiAobmZkcyA8IChQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGZpbGUgKikpKQorCQkJbmZkcyA9IFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgZmlsZSAqKTsKKwkJZWxzZSB7CisJCQluZmRzID0gbmZkcyAqIDI7CisJCQlpZiAobmZkcyA+IE5SX09QRU4pCisJCQkJbmZkcyA9IE5SX09QRU47CisJCX0KKwl9IHdoaWxlIChuZmRzIDw9IG5yKTsKKworCWVycm9yID0gLUVOT01FTTsKKwluZXdfZmRzID0gYWxsb2NfZmRfYXJyYXkobmZkcyk7CisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlpZiAoIW5ld19mZHMpCisJCWdvdG8gb3V0OworCisJLyogQ29weSB0aGUgZXhpc3RpbmcgYXJyYXkgYW5kIGluc3RhbGwgdGhlIG5ldyBwb2ludGVyICovCisKKwlpZiAobmZkcyA+IGZpbGVzLT5tYXhfZmRzKSB7CisJCXN0cnVjdCBmaWxlICoqb2xkX2ZkczsKKwkJaW50IGk7CisJCQorCQlvbGRfZmRzID0geGNoZygmZmlsZXMtPmZkLCBuZXdfZmRzKTsKKwkJaSA9IHhjaGcoJmZpbGVzLT5tYXhfZmRzLCBuZmRzKTsKKworCQkvKiBEb24ndCBjb3B5L2NsZWFyIHRoZSBhcnJheSBpZiB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcKKwkJICAgZmQgYXJyYXkgZm9yIGZvcmsoKSAqLworCQlpZiAoaSkgeworCQkJbWVtY3B5KG5ld19mZHMsIG9sZF9mZHMsIGkgKiBzaXplb2Yoc3RydWN0IGZpbGUgKikpOworCQkJLyogY2xlYXIgdGhlIHJlbWFpbmRlciBvZiB0aGUgYXJyYXkgKi8KKwkJCW1lbXNldCgmbmV3X2Zkc1tpXSwgMCwKKwkJCSAgICAgICAobmZkcy1pKSAqIHNpemVvZihzdHJ1Y3QgZmlsZSAqKSk7IAorCisJCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCQlmcmVlX2ZkX2FycmF5KG9sZF9mZHMsIGkpOworCQkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFNvbWVib2R5IGV4cGFuZGVkIHRoZSBhcnJheSB3aGlsZSB3ZSBzbGVwdCAuLi4gKi8KKwkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQlmcmVlX2ZkX2FycmF5KG5ld19mZHMsIG5mZHMpOworCQlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCX0KKwllcnJvciA9IDA7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogQWxsb2NhdGUgYW4gZmRzZXQgYXJyYXksIHVzaW5nIGttYWxsb2Mgb3Igdm1hbGxvYy4KKyAqIE5vdGU6IHRoZSBhcnJheSBpc24ndCBjbGVhcmVkIGF0IGFsbG9jYXRpb24gdGltZS4KKyAqLworZmRfc2V0ICogYWxsb2NfZmRzZXQoaW50IG51bSkKK3sKKwlmZF9zZXQgKm5ld19mZHNldDsKKwlpbnQgc2l6ZSA9IG51bSAvIDg7CisKKwlpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpCisJCW5ld19mZHNldCA9IChmZF9zZXQgKikga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwllbHNlCisJCW5ld19mZHNldCA9IChmZF9zZXQgKikgdm1hbGxvYyhzaXplKTsKKwlyZXR1cm4gbmV3X2Zkc2V0OworfQorCit2b2lkIGZyZWVfZmRzZXQoZmRfc2V0ICphcnJheSwgaW50IG51bSkKK3sKKwlpbnQgc2l6ZSA9IG51bSAvIDg7CisKKwlpZiAobnVtIDw9IF9fRkRfU0VUU0laRSkgLyogRG9uJ3QgZnJlZSBhbiBlbWJlZGRlZCBmZHNldCAqLworCQlyZXR1cm47CisJZWxzZSBpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpCisJCWtmcmVlKGFycmF5KTsKKwllbHNlCisJCXZmcmVlKGFycmF5KTsKK30KKworLyoKKyAqIEV4cGFuZCB0aGUgZmRzZXQgaW4gdGhlIGZpbGVzX3N0cnVjdC4gIENhbGxlZCB3aXRoIHRoZSBmaWxlcyBzcGlubG9jaworICogaGVsZCBmb3Igd3JpdGUuCisgKi8KK3N0YXRpYyBpbnQgZXhwYW5kX2Zkc2V0KHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzLCBpbnQgbnIpCisJX19yZWxlYXNlcyhmaWxlLT5maWxlX2xvY2spCisJX19hY3F1aXJlcyhmaWxlLT5maWxlX2xvY2spCit7CisJZmRfc2V0ICpuZXdfb3BlbnNldCA9IE5VTEwsICpuZXdfZXhlY3NldCA9IE5VTEw7CisJaW50IGVycm9yLCBuZmRzID0gMDsKKworCWVycm9yID0gLUVNRklMRTsKKwlpZiAoZmlsZXMtPm1heF9mZHNldCA+PSBOUl9PUEVOIHx8IG5yID49IE5SX09QRU4pCisJCWdvdG8gb3V0OworCisJbmZkcyA9IGZpbGVzLT5tYXhfZmRzZXQ7CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCisJLyogRXhwYW5kIHRvIHRoZSBtYXggaW4gZWFzeSBzdGVwcyAqLworCWRvIHsKKwkJaWYgKG5mZHMgPCAoUEFHRV9TSVpFICogOCkpCisJCQluZmRzID0gUEFHRV9TSVpFICogODsKKwkJZWxzZSB7CisJCQluZmRzID0gbmZkcyAqIDI7CisJCQlpZiAobmZkcyA+IE5SX09QRU4pCisJCQkJbmZkcyA9IE5SX09QRU47CisJCX0KKwl9IHdoaWxlIChuZmRzIDw9IG5yKTsKKworCWVycm9yID0gLUVOT01FTTsKKwluZXdfb3BlbnNldCA9IGFsbG9jX2Zkc2V0KG5mZHMpOworCW5ld19leGVjc2V0ID0gYWxsb2NfZmRzZXQobmZkcyk7CisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlpZiAoIW5ld19vcGVuc2V0IHx8ICFuZXdfZXhlY3NldCkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IDA7CisJCisJLyogQ29weSB0aGUgZXhpc3RpbmcgdGFibGVzIGFuZCBpbnN0YWxsIHRoZSBuZXcgcG9pbnRlcnMgKi8KKwlpZiAobmZkcyA+IGZpbGVzLT5tYXhfZmRzZXQpIHsKKwkJaW50IGkgPSBmaWxlcy0+bWF4X2Zkc2V0IC8gKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpOworCQlpbnQgY291bnQgPSAobmZkcyAtIGZpbGVzLT5tYXhfZmRzZXQpIC8gODsKKwkJCisJCS8qIAorCQkgKiBEb24ndCBjb3B5IHRoZSBlbnRpcmUgYXJyYXkgaWYgdGhlIGN1cnJlbnQgZmRzZXQgaXMKKwkJICogbm90IHlldCBpbml0aWFsaXNlZC4gIAorCQkgKi8KKwkJaWYgKGkpIHsKKwkJCW1lbWNweSAobmV3X29wZW5zZXQsIGZpbGVzLT5vcGVuX2ZkcywgZmlsZXMtPm1heF9mZHNldC84KTsKKwkJCW1lbWNweSAobmV3X2V4ZWNzZXQsIGZpbGVzLT5jbG9zZV9vbl9leGVjLCBmaWxlcy0+bWF4X2Zkc2V0LzgpOworCQkJbWVtc2V0ICgmbmV3X29wZW5zZXQtPmZkc19iaXRzW2ldLCAwLCBjb3VudCk7CisJCQltZW1zZXQgKCZuZXdfZXhlY3NldC0+ZmRzX2JpdHNbaV0sIDAsIGNvdW50KTsKKwkJfQorCQkKKwkJbmZkcyA9IHhjaGcoJmZpbGVzLT5tYXhfZmRzZXQsIG5mZHMpOworCQluZXdfb3BlbnNldCA9IHhjaGcoJmZpbGVzLT5vcGVuX2ZkcywgbmV3X29wZW5zZXQpOworCQluZXdfZXhlY3NldCA9IHhjaGcoJmZpbGVzLT5jbG9zZV9vbl9leGVjLCBuZXdfZXhlY3NldCk7CisJCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJZnJlZV9mZHNldCAobmV3X29wZW5zZXQsIG5mZHMpOworCQlmcmVlX2Zkc2V0IChuZXdfZXhlY3NldCwgbmZkcyk7CisJCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCXJldHVybiAwOworCX0gCisJLyogU29tZWJvZHkgZXhwYW5kZWQgdGhlIGFycmF5IHdoaWxlIHdlIHNsZXB0IC4uLiAqLworCitvdXQ6CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCWlmIChuZXdfb3BlbnNldCkKKwkJZnJlZV9mZHNldChuZXdfb3BlbnNldCwgbmZkcyk7CisJaWYgKG5ld19leGVjc2V0KQorCQlmcmVlX2Zkc2V0KG5ld19leGVjc2V0LCBuZmRzKTsKKwlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEV4cGFuZCBmaWxlcy4KKyAqIFJldHVybiA8MCBvbiBlcnJvcjsgMCBub3RoaW5nIGRvbmU7IDEgZmlsZXMgZXhwYW5kZWQsIHdlIG1heSBoYXZlIGJsb2NrZWQuCisgKiBTaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGZpbGVzLT5maWxlX2xvY2sgc3BpbmxvY2sgaGVsZCBmb3Igd3JpdGUuCisgKi8KK2ludCBleHBhbmRfZmlsZXMoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMsIGludCBucikKK3sKKwlpbnQgZXJyLCBleHBhbmQgPSAwOworCisJaWYgKG5yID49IGZpbGVzLT5tYXhfZmRzZXQpIHsKKwkJZXhwYW5kID0gMTsKKwkJaWYgKChlcnIgPSBleHBhbmRfZmRzZXQoZmlsZXMsIG5yKSkpCisJCQlnb3RvIG91dDsKKwl9CisJaWYgKG5yID49IGZpbGVzLT5tYXhfZmRzKSB7CisJCWV4cGFuZCA9IDE7CisJCWlmICgoZXJyID0gZXhwYW5kX2ZkX2FycmF5KGZpbGVzLCBucikpKQorCQkJZ290byBvdXQ7CisJfQorCWVyciA9IGV4cGFuZDsKK291dDoKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvZnMvZmlsZV90YWJsZS5jIGIvZnMvZmlsZV90YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZDgzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9maWxlX3RhYmxlLmMKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiAgbGludXgvZnMvZmlsZV90YWJsZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldmVudHBvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKworLyogc3lzY3RsIHR1bmFibGVzLi4uICovCitzdHJ1Y3QgZmlsZXNfc3RhdF9zdHJ1Y3QgZmlsZXNfc3RhdCA9IHsKKwkubWF4X2ZpbGVzID0gTlJfRklMRQorfTsKKworRVhQT1JUX1NZTUJPTChmaWxlc19zdGF0KTsgLyogTmVlZGVkIGJ5IHVuaXgubyAqLworCisvKiBwdWJsaWMuIE5vdCBwcmV0dHkhICovCisgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NQSU5MT0NLKGZpbGVzX2xvY2spOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGZpbHBfY291bnRfbG9jayk7CisKKy8qIHNsYWIgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhcmUgY2FsbGVkIGZyb20gYXJiaXRyYXJ5CisgKiBjb250ZXh0IGFuZCBtdXN0IGJlIGZ1bGx5IHRocmVhZGVkIC0gdXNlIGEgbG9jYWwgc3BpbmxvY2sKKyAqIHRvIHByb3RlY3QgZmlsZXNfc3RhdC5ucl9maWxlcworICovCit2b2lkIGZpbHBfY3Rvcih2b2lkICogb2JqcCwgc3RydWN0IGttZW1fY2FjaGVfcyAqY2FjaGVwLCB1bnNpZ25lZCBsb25nIGNmbGFncykKK3sKKwlpZiAoKGNmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZmlscF9jb3VudF9sb2NrLCBmbGFncyk7CisJCWZpbGVzX3N0YXQubnJfZmlsZXMrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmlscF9jb3VudF9sb2NrLCBmbGFncyk7CisJfQorfQorCit2b2lkIGZpbHBfZHRvcih2b2lkICogb2JqcCwgc3RydWN0IGttZW1fY2FjaGVfcyAqY2FjaGVwLCB1bnNpZ25lZCBsb25nIGRmbGFncykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZmaWxwX2NvdW50X2xvY2ssIGZsYWdzKTsKKwlmaWxlc19zdGF0Lm5yX2ZpbGVzLS07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmlscF9jb3VudF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaWxlX2ZyZWUoc3RydWN0IGZpbGUgKmYpCit7CisJa21lbV9jYWNoZV9mcmVlKGZpbHBfY2FjaGVwLCBmKTsKK30KKworLyogRmluZCBhbiB1bnVzZWQgZmlsZSBzdHJ1Y3R1cmUgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuCisgKiBSZXR1cm5zIE5VTEwsIGlmIHRoZXJlIGFyZSBubyBtb3JlIGZyZWUgZmlsZSBzdHJ1Y3R1cmVzIG9yCisgKiB3ZSBydW4gb3V0IG9mIG1lbW9yeS4KKyAqLworc3RydWN0IGZpbGUgKmdldF9lbXB0eV9maWxwKHZvaWQpCit7CitzdGF0aWMgaW50IG9sZF9tYXg7CisJc3RydWN0IGZpbGUgKiBmOworCisJLyoKKwkgKiBQcml2aWxlZ2VkIHVzZXJzIGNhbiBnbyBhYm92ZSBtYXhfZmlsZXMKKwkgKi8KKwlpZiAoZmlsZXNfc3RhdC5ucl9maWxlcyA8IGZpbGVzX3N0YXQubWF4X2ZpbGVzIHx8CisJCQkJY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQlmID0ga21lbV9jYWNoZV9hbGxvYyhmaWxwX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJCWlmIChmKSB7CisJCQltZW1zZXQoZiwgMCwgc2l6ZW9mKCpmKSk7CisJCQlpZiAoc2VjdXJpdHlfZmlsZV9hbGxvYyhmKSkgeworCQkJCWZpbGVfZnJlZShmKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCQlldmVudHBvbGxfaW5pdF9maWxlKGYpOworCQkJYXRvbWljX3NldCgmZi0+Zl9jb3VudCwgMSk7CisJCQlmLT5mX3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCQkJZi0+Zl9naWQgPSBjdXJyZW50LT5mc2dpZDsKKwkJCXJ3bG9ja19pbml0KCZmLT5mX293bmVyLmxvY2spOworCQkJLyogZi0+Zl92ZXJzaW9uOiAwICovCisJCQlJTklUX0xJU1RfSEVBRCgmZi0+Zl9saXN0KTsKKwkJCWYtPmZfbWF4Y291bnQgPSBJTlRfTUFYOworCQkJcmV0dXJuIGY7CisJCX0KKwl9CisKKwkvKiBSYW4gb3V0IG9mIGZpbHBzIC0gcmVwb3J0IHRoYXQgKi8KKwlpZiAoZmlsZXNfc3RhdC5tYXhfZmlsZXMgPj0gb2xkX21heCkgeworCQlwcmludGsoS0VSTl9JTkZPICJWRlM6IGZpbGUtbWF4IGxpbWl0ICVkIHJlYWNoZWRcbiIsCisJCQkJCWZpbGVzX3N0YXQubWF4X2ZpbGVzKTsKKwkJb2xkX21heCA9IGZpbGVzX3N0YXQubWF4X2ZpbGVzOworCX0gZWxzZSB7CisJCS8qIEJpZyBwcm9ibGVtcy4uLiAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICJWRlM6IGZpbHAgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCX0KK2ZhaWw6CisJcmV0dXJuIE5VTEw7Cit9CisKK0VYUE9SVF9TWU1CT0woZ2V0X2VtcHR5X2ZpbHApOworCit2b2lkIGZhc3RjYWxsIGZwdXQoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmZpbGUtPmZfY291bnQpKQorCQlfX2ZwdXQoZmlsZSk7Cit9CisKK0VYUE9SVF9TWU1CT0woZnB1dCk7CisKKy8qIF9fZnB1dCBpcyBjYWxsZWQgZnJvbSB0YXNrIGNvbnRleHQgd2hlbiBhaW8gY29tcGxldGlvbiByZWxlYXNlcyB0aGUgbGFzdAorICogbGFzdCB1c2Ugb2YgYSBzdHJ1Y3QgZmlsZSAqLiAgRG8gbm90IHVzZSBvdGhlcndpc2UuCisgKi8KK3ZvaWQgZmFzdGNhbGwgX19mcHV0KHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gZmlsZS0+Zl92ZnNtbnQ7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCW1pZ2h0X3NsZWVwKCk7CisJLyoKKwkgKiBUaGUgZnVuY3Rpb24gZXZlbnRwb2xsX3JlbGVhc2UoKSBzaG91bGQgYmUgdGhlIGZpcnN0IGNhbGxlZAorCSAqIGluIHRoZSBmaWxlIGNsZWFudXAgY2hhaW4uCisJICovCisJZXZlbnRwb2xsX3JlbGVhc2UoZmlsZSk7CisJbG9ja3NfcmVtb3ZlX2Zsb2NrKGZpbGUpOworCisJaWYgKGZpbGUtPmZfb3AgJiYgZmlsZS0+Zl9vcC0+cmVsZWFzZSkKKwkJZmlsZS0+Zl9vcC0+cmVsZWFzZShpbm9kZSwgZmlsZSk7CisJc2VjdXJpdHlfZmlsZV9mcmVlKGZpbGUpOworCWlmICh1bmxpa2VseShpbm9kZS0+aV9jZGV2ICE9IE5VTEwpKQorCQljZGV2X3B1dChpbm9kZS0+aV9jZGV2KTsKKwlmb3BzX3B1dChmaWxlLT5mX29wKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCXB1dF93cml0ZV9hY2Nlc3MoaW5vZGUpOworCWZpbGVfa2lsbChmaWxlKTsKKwlmaWxlLT5mX2RlbnRyeSA9IE5VTEw7CisJZmlsZS0+Zl92ZnNtbnQgPSBOVUxMOworCWZpbGVfZnJlZShmaWxlKTsKKwlkcHV0KGRlbnRyeSk7CisJbW50cHV0KG1udCk7Cit9CisKK3N0cnVjdCBmaWxlIGZhc3RjYWxsICpmZ2V0KHVuc2lnbmVkIGludCBmZCkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOworCisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlmaWxlID0gZmNoZWNrX2ZpbGVzKGZpbGVzLCBmZCk7CisJaWYgKGZpbGUpCisJCWdldF9maWxlKGZpbGUpOworCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlyZXR1cm4gZmlsZTsKK30KKworRVhQT1JUX1NZTUJPTChmZ2V0KTsKKworLyoKKyAqIExpZ2h0d2VpZ2h0IGZpbGUgbG9va3VwIC0gbm8gcmVmY250IGluY3JlbWVudCBpZiBmZCB0YWJsZSBpc24ndCBzaGFyZWQuIAorICogWW91IGNhbiB1c2UgdGhpcyBvbmx5IGlmIGl0IGlzIGd1cmFudGVlZCB0aGF0IHRoZSBjdXJyZW50IHRhc2sgYWxyZWFkeSAKKyAqIGhvbGRzIGEgcmVmY250IHRvIHRoYXQgZmlsZS4gVGhhdCBjaGVjayBoYXMgdG8gYmUgZG9uZSBhdCBmZ2V0KCkgb25seQorICogYW5kIGEgZmxhZyBpcyByZXR1cm5lZCB0byBiZSBwYXNzZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZnB1dF9saWdodCgpLgorICogVGhlcmUgbXVzdCBub3QgYmUgYSBjbG9uaW5nIGJldHdlZW4gYW4gZmdldF9saWdodC9mcHV0X2xpZ2h0IHBhaXIuCisgKi8KK3N0cnVjdCBmaWxlIGZhc3RjYWxsICpmZ2V0X2xpZ2h0KHVuc2lnbmVkIGludCBmZCwgaW50ICpmcHV0X25lZWRlZCkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOworCisJKmZwdXRfbmVlZGVkID0gMDsKKwlpZiAobGlrZWx5KChhdG9taWNfcmVhZCgmZmlsZXMtPmNvdW50KSA9PSAxKSkpIHsKKwkJZmlsZSA9IGZjaGVja19maWxlcyhmaWxlcywgZmQpOworCX0gZWxzZSB7CisJCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCWZpbGUgPSBmY2hlY2tfZmlsZXMoZmlsZXMsIGZkKTsKKwkJaWYgKGZpbGUpIHsKKwkJCWdldF9maWxlKGZpbGUpOworCQkJKmZwdXRfbmVlZGVkID0gMTsKKwkJfQorCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJfQorCXJldHVybiBmaWxlOworfQorCisKK3ZvaWQgcHV0X2ZpbHAoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmZpbGUtPmZfY291bnQpKSB7CisJCXNlY3VyaXR5X2ZpbGVfZnJlZShmaWxlKTsKKwkJZmlsZV9raWxsKGZpbGUpOworCQlmaWxlX2ZyZWUoZmlsZSk7CisJfQorfQorCit2b2lkIGZpbGVfbW92ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlpZiAoIWxpc3QpCisJCXJldHVybjsKKwlmaWxlX2xpc3RfbG9jaygpOworCWxpc3RfbW92ZSgmZmlsZS0+Zl9saXN0LCBsaXN0KTsKKwlmaWxlX2xpc3RfdW5sb2NrKCk7Cit9CisKK3ZvaWQgZmlsZV9raWxsKHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICghbGlzdF9lbXB0eSgmZmlsZS0+Zl9saXN0KSkgeworCQlmaWxlX2xpc3RfbG9jaygpOworCQlsaXN0X2RlbF9pbml0KCZmaWxlLT5mX2xpc3QpOworCQlmaWxlX2xpc3RfdW5sb2NrKCk7CisJfQorfQorCitpbnQgZnNfbWF5X3JlbW91bnRfcm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJLyogQ2hlY2sgdGhhdCBubyBmaWxlcyBhcmUgY3VycmVudGx5IG9wZW5lZCBmb3Igd3JpdGluZy4gKi8KKwlmaWxlX2xpc3RfbG9jaygpOworCWxpc3RfZm9yX2VhY2gocCwgJnNiLT5zX2ZpbGVzKSB7CisJCXN0cnVjdCBmaWxlICpmaWxlID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgZmlsZSwgZl9saXN0KTsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCisJCS8qIEZpbGUgd2l0aCBwZW5kaW5nIGRlbGV0ZT8gKi8KKwkJaWYgKGlub2RlLT5pX25saW5rID09IDApCisJCQlnb3RvIHRvb19iYWQ7CisKKwkJLyogV3JpdGVhYmxlIGZpbGU/ICovCisJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlnb3RvIHRvb19iYWQ7CisJfQorCWZpbGVfbGlzdF91bmxvY2soKTsKKwlyZXR1cm4gMTsgLyogVGlzJyBjb29sIGJyby4gKi8KK3Rvb19iYWQ6CisJZmlsZV9saXN0X3VubG9jaygpOworCXJldHVybiAwOworfQorCit2b2lkIF9faW5pdCBmaWxlc19pbml0KHVuc2lnbmVkIGxvbmcgbWVtcGFnZXMpCit7IAorCWludCBuOyAKKwkvKiBPbmUgZmlsZSB3aXRoIGFzc29jaWF0ZWQgaW5vZGUgYW5kIGRjYWNoZSBpcyB2ZXJ5IHJvdWdobHkgMUsuIAorCSAqIFBlciBkZWZhdWx0IGRvbid0IHVzZSBtb3JlIHRoYW4gMTAlIG9mIG91ciBtZW1vcnkgZm9yIGZpbGVzLiAKKwkgKi8gCisKKwluID0gKG1lbXBhZ2VzICogKFBBR0VfU0laRSAvIDEwMjQpKSAvIDEwOworCWZpbGVzX3N0YXQubWF4X2ZpbGVzID0gbjsgCisJaWYgKGZpbGVzX3N0YXQubWF4X2ZpbGVzIDwgTlJfRklMRSkKKwkJZmlsZXNfc3RhdC5tYXhfZmlsZXMgPSBOUl9GSUxFOworfSAKZGlmZiAtLWdpdCBhL2ZzL2ZpbGVzeXN0ZW1zLmMgYi9mcy9maWxlc3lzdGVtcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MDgyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9maWxlc3lzdGVtcy5jCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogIGxpbnV4L2ZzL2ZpbGVzeXN0ZW1zLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICB0YWJsZSBvZiBjb25maWd1cmVkIGZpbGVzeXN0ZW1zCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKgorICogSGFuZGxpbmcgb2YgZmlsZXN5c3RlbSBkcml2ZXJzIGxpc3QuCisgKiBSdWxlczoKKyAqCUluY2x1c2lvbiB0by9yZW1vdmFscyBmcm9tL3NjYW5uaW5nIG9mIGxpc3QgYXJlIHByb3RlY3RlZCBieSBzcGlubG9jay4KKyAqCUR1cmluZyB0aGUgdW5sb2FkIG1vZHVsZSBtdXN0IGNhbGwgdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCkuCisgKglXZSBjYW4gYWNjZXNzIHRoZSBmaWVsZHMgb2YgbGlzdCBlbGVtZW50IGlmOgorICoJCTEpIHNwaW5sb2NrIGlzIGhlbGQgb3IKKyAqCQkyKSB3ZSBob2xkIHRoZSByZWZlcmVuY2UgdG8gdGhlIG1vZHVsZS4KKyAqCVRoZSBsYXR0ZXIgY2FuIGJlIGd1YXJhbnRlZWQgYnkgY2FsbCBvZiB0cnlfbW9kdWxlX2dldCgpOyBpZiBpdAorICoJcmV0dXJuZWQgMCB3ZSBtdXN0IHNraXAgdGhlIGVsZW1lbnQsIG90aGVyd2lzZSB3ZSBnb3QgdGhlIHJlZmVyZW5jZS4KKyAqCU9uY2UgdGhlIHJlZmVyZW5jZSBpcyBvYnRhaW5lZCB3ZSBjYW4gZHJvcCB0aGUgc3BpbmxvY2suCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmaWxlX3N5c3RlbXM7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhmaWxlX3N5c3RlbXNfbG9jayk7CisKKy8qIFdBUk5JTkc6IFRoaXMgY2FuIGJlIHVzZWQgb25seSBpZiB3ZSBfYWxyZWFkeV8gb3duIGEgcmVmZXJlbmNlICovCit2b2lkIGdldF9maWxlc3lzdGVtKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmcykKK3sKKwlfX21vZHVsZV9nZXQoZnMtPm93bmVyKTsKK30KKwordm9pZCBwdXRfZmlsZXN5c3RlbShzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnMpCit7CisJbW9kdWxlX3B1dChmcy0+b3duZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKipmaW5kX2ZpbGVzeXN0ZW0oY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqKnA7CisJZm9yIChwPSZmaWxlX3N5c3RlbXM7ICpwOyBwPSYoKnApLT5uZXh0KQorCQlpZiAoc3RyY21wKCgqcCktPm5hbWUsbmFtZSkgPT0gMCkKKwkJCWJyZWFrOworCXJldHVybiBwOworfQorCisvKioKKyAqCXJlZ2lzdGVyX2ZpbGVzeXN0ZW0gLSByZWdpc3RlciBhIG5ldyBmaWxlc3lzdGVtCisgKglAZnM6IHRoZSBmaWxlIHN5c3RlbSBzdHJ1Y3R1cmUKKyAqCisgKglBZGRzIHRoZSBmaWxlIHN5c3RlbSBwYXNzZWQgdG8gdGhlIGxpc3Qgb2YgZmlsZSBzeXN0ZW1zIHRoZSBrZXJuZWwKKyAqCWlzIGF3YXJlIG9mIGZvciBtb3VudCBhbmQgb3RoZXIgc3lzY2FsbHMuIFJldHVybnMgMCBvbiBzdWNjZXNzLAorICoJb3IgYSBuZWdhdGl2ZSBlcnJubyBjb2RlIG9uIGFuIGVycm9yLgorICoKKyAqCVRoZSAmc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgdGhhdCBpcyBwYXNzZWQgaXMgbGlua2VkIGludG8gdGhlIGtlcm5lbCAKKyAqCXN0cnVjdHVyZXMgYW5kIG11c3Qgbm90IGJlIGZyZWVkIHVudGlsIHRoZSBmaWxlIHN5c3RlbSBoYXMgYmVlbgorICoJdW5yZWdpc3RlcmVkLgorICovCisgCitpbnQgcmVnaXN0ZXJfZmlsZXN5c3RlbShzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqIGZzKQoreworCWludCByZXMgPSAwOworCXN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICoqIHA7CisKKwlpZiAoIWZzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZnMtPm5leHQpCisJCXJldHVybiAtRUJVU1k7CisJSU5JVF9MSVNUX0hFQUQoJmZzLT5mc19zdXBlcnMpOworCXdyaXRlX2xvY2soJmZpbGVfc3lzdGVtc19sb2NrKTsKKwlwID0gZmluZF9maWxlc3lzdGVtKGZzLT5uYW1lKTsKKwlpZiAoKnApCisJCXJlcyA9IC1FQlVTWTsKKwllbHNlCisJCSpwID0gZnM7CisJd3JpdGVfdW5sb2NrKCZmaWxlX3N5c3RlbXNfbG9jayk7CisJcmV0dXJuIHJlczsKK30KKworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9maWxlc3lzdGVtKTsKKworLyoqCisgKgl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0gLSB1bnJlZ2lzdGVyIGEgZmlsZSBzeXN0ZW0KKyAqCUBmczogZmlsZXN5c3RlbSB0byB1bnJlZ2lzdGVyCisgKgorICoJUmVtb3ZlIGEgZmlsZSBzeXN0ZW0gdGhhdCB3YXMgcHJldmlvdXNseSBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZAorICoJd2l0aCB0aGUga2VybmVsLiBBbiBlcnJvciBpcyByZXR1cm5lZCBpZiB0aGUgZmlsZSBzeXN0ZW0gaXMgbm90IGZvdW5kLgorICoJWmVybyBpcyByZXR1cm5lZCBvbiBhIHN1Y2Nlc3MuCisgKgkKKyAqCU9uY2UgdGhpcyBmdW5jdGlvbiBoYXMgcmV0dXJuZWQgdGhlICZzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBzdHJ1Y3R1cmUKKyAqCW1heSBiZSBmcmVlZCBvciByZXVzZWQuCisgKi8KKyAKK2ludCB1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiBmcykKK3sKKwlzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqKiB0bXA7CisKKwl3cml0ZV9sb2NrKCZmaWxlX3N5c3RlbXNfbG9jayk7CisJdG1wID0gJmZpbGVfc3lzdGVtczsKKwl3aGlsZSAoKnRtcCkgeworCQlpZiAoZnMgPT0gKnRtcCkgeworCQkJKnRtcCA9IGZzLT5uZXh0OworCQkJZnMtPm5leHQgPSBOVUxMOworCQkJd3JpdGVfdW5sb2NrKCZmaWxlX3N5c3RlbXNfbG9jayk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQl0bXAgPSAmKCp0bXApLT5uZXh0OworCX0KKwl3cml0ZV91bmxvY2soJmZpbGVfc3lzdGVtc19sb2NrKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0pOworCitzdGF0aWMgaW50IGZzX2luZGV4KGNvbnN0IGNoYXIgX191c2VyICogX19uYW1lKQoreworCXN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICogdG1wOworCWNoYXIgKiBuYW1lOworCWludCBlcnIsIGluZGV4OworCisJbmFtZSA9IGdldG5hbWUoX19uYW1lKTsKKwllcnIgPSBQVFJfRVJSKG5hbWUpOworCWlmIChJU19FUlIobmFtZSkpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSAtRUlOVkFMOworCXJlYWRfbG9jaygmZmlsZV9zeXN0ZW1zX2xvY2spOworCWZvciAodG1wPWZpbGVfc3lzdGVtcywgaW5kZXg9MCA7IHRtcCA7IHRtcD10bXAtPm5leHQsIGluZGV4KyspIHsKKwkJaWYgKHN0cmNtcCh0bXAtPm5hbWUsbmFtZSkgPT0gMCkgeworCQkJZXJyID0gaW5kZXg7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmZmlsZV9zeXN0ZW1zX2xvY2spOworCXB1dG5hbWUobmFtZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBmc19uYW1lKHVuc2lnbmVkIGludCBpbmRleCwgY2hhciBfX3VzZXIgKiBidWYpCit7CisJc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiB0bXA7CisJaW50IGxlbiwgcmVzOworCisJcmVhZF9sb2NrKCZmaWxlX3N5c3RlbXNfbG9jayk7CisJZm9yICh0bXAgPSBmaWxlX3N5c3RlbXM7IHRtcDsgdG1wID0gdG1wLT5uZXh0LCBpbmRleC0tKQorCQlpZiAoaW5kZXggPD0gMCAmJiB0cnlfbW9kdWxlX2dldCh0bXAtPm93bmVyKSkKKwkJCWJyZWFrOworCXJlYWRfdW5sb2NrKCZmaWxlX3N5c3RlbXNfbG9jayk7CisJaWYgKCF0bXApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogT0ssIHdlIGdvdCB0aGUgcmVmZXJlbmNlLCBzbyB3ZSBjYW4gc2FmZWx5IGJsb2NrICovCisJbGVuID0gc3RybGVuKHRtcC0+bmFtZSkgKyAxOworCXJlcyA9IGNvcHlfdG9fdXNlcihidWYsIHRtcC0+bmFtZSwgbGVuKSA/IC1FRkFVTFQgOiAwOworCXB1dF9maWxlc3lzdGVtKHRtcCk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBmc19tYXhpbmRleCh2b2lkKQoreworCXN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICogdG1wOworCWludCBpbmRleDsKKworCXJlYWRfbG9jaygmZmlsZV9zeXN0ZW1zX2xvY2spOworCWZvciAodG1wID0gZmlsZV9zeXN0ZW1zLCBpbmRleCA9IDAgOyB0bXAgOyB0bXAgPSB0bXAtPm5leHQsIGluZGV4KyspCisJCTsKKwlyZWFkX3VubG9jaygmZmlsZV9zeXN0ZW1zX2xvY2spOworCXJldHVybiBpbmRleDsKK30KKworLyoKKyAqIFdoZWUuLiBXZWlyZCBzeXN2IHN5c2NhbGwuIAorICovCithc21saW5rYWdlIGxvbmcgc3lzX3N5c2ZzKGludCBvcHRpb24sIHVuc2lnbmVkIGxvbmcgYXJnMSwgdW5zaWduZWQgbG9uZyBhcmcyKQoreworCWludCByZXR2YWwgPSAtRUlOVkFMOworCisJc3dpdGNoIChvcHRpb24pIHsKKwkJY2FzZSAxOgorCQkJcmV0dmFsID0gZnNfaW5kZXgoKGNvbnN0IGNoYXIgX191c2VyICopIGFyZzEpOworCQkJYnJlYWs7CisKKwkJY2FzZSAyOgorCQkJcmV0dmFsID0gZnNfbmFtZShhcmcxLCAoY2hhciBfX3VzZXIgKikgYXJnMik7CisJCQlicmVhazsKKworCQljYXNlIDM6CisJCQlyZXR2YWwgPSBmc19tYXhpbmRleCgpOworCQkJYnJlYWs7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBnZXRfZmlsZXN5c3RlbV9saXN0KGNoYXIgKiBidWYpCit7CisJaW50IGxlbiA9IDA7CisJc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiB0bXA7CisKKwlyZWFkX2xvY2soJmZpbGVfc3lzdGVtc19sb2NrKTsKKwl0bXAgPSBmaWxlX3N5c3RlbXM7CisJd2hpbGUgKHRtcCAmJiBsZW4gPCBQQUdFX1NJWkUgLSA4MCkgeworCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiJXNcdCVzXG4iLAorCQkJKHRtcC0+ZnNfZmxhZ3MgJiBGU19SRVFVSVJFU19ERVYpID8gIiIgOiAibm9kZXYiLAorCQkJdG1wLT5uYW1lKTsKKwkJdG1wID0gdG1wLT5uZXh0OworCX0KKwlyZWFkX3VubG9jaygmZmlsZV9zeXN0ZW1zX2xvY2spOworCXJldHVybiBsZW47Cit9CisKK3N0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpnZXRfZnNfdHlwZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmczsKKworCXJlYWRfbG9jaygmZmlsZV9zeXN0ZW1zX2xvY2spOworCWZzID0gKihmaW5kX2ZpbGVzeXN0ZW0obmFtZSkpOworCWlmIChmcyAmJiAhdHJ5X21vZHVsZV9nZXQoZnMtPm93bmVyKSkKKwkJZnMgPSBOVUxMOworCXJlYWRfdW5sb2NrKCZmaWxlX3N5c3RlbXNfbG9jayk7CisJaWYgKCFmcyAmJiAocmVxdWVzdF9tb2R1bGUoIiVzIiwgbmFtZSkgPT0gMCkpIHsKKwkJcmVhZF9sb2NrKCZmaWxlX3N5c3RlbXNfbG9jayk7CisJCWZzID0gKihmaW5kX2ZpbGVzeXN0ZW0obmFtZSkpOworCQlpZiAoZnMgJiYgIXRyeV9tb2R1bGVfZ2V0KGZzLT5vd25lcikpCisJCQlmcyA9IE5VTEw7CisJCXJlYWRfdW5sb2NrKCZmaWxlX3N5c3RlbXNfbG9jayk7CisJfQorCXJldHVybiBmczsKK30KKworRVhQT1JUX1NZTUJPTChnZXRfZnNfdHlwZSk7CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy9NYWtlZmlsZSBiL2ZzL2ZyZWV2eGZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YWQwOTcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mcmVldnhmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgVnhGUyBNYWtlZmlsZQorIworCitvYmotJChDT05GSUdfVlhGU19GUykgKz0gZnJlZXZ4ZnMubworCitmcmVldnhmcy1vYmpzIDo9IHZ4ZnNfYm1hcC5vIHZ4ZnNfZnNoZWFkLm8gdnhmc19pbW1lZC5vIHZ4ZnNfaW5vZGUubyBcCisJCSB2eGZzX2xvb2t1cC5vIHZ4ZnNfb2x0Lm8gdnhmc19zdWJyLm8gdnhmc19zdXBlci5vCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzLmggYi9mcy9mcmVldnhmcy92eGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRhMDI1MgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnMuaApAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKyNpZm5kZWYgX1ZYRlNfU1VQRVJfSF8KKyNkZWZpbmUgX1ZYRlNfU1VQRVJfSF8KKworLyoKKyAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBzdXBlcmJsb2NrIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGRpc2sgYW5kIGNvcmUKKyAqIHN1cGVyYmxvY2tzIG9mIHRoZSBWZXJpdGFzIEZpbGVzeXN0ZW0uCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgInZ4ZnNfa2NvbXBhdC5oIgorCisKKy8qCisgKiBEYXRhIHR5cGVzIGZvciB1c2Ugd2l0aCB0aGUgVnhGUyBvbmRpc2sgZm9ybWF0LgorICovCit0eXBlZGVmCWludDMyX3QJCXZ4X2RhZGRyX3Q7Cit0eXBlZGVmIGludDMyX3QJCXZ4X2lub190OworCisvKgorICogU3VwZXJibG9jayBtYWdpYyBudW1iZXIgKHZ4ZnNfc3VwZXItPnZzX21hZ2ljKS4KKyAqLworI2RlZmluZSBWWEZTX1NVUEVSX01BR0lDCTB4YTUwMUZDRjUKKworLyoKKyAqIFRoZSByb290IGlub2RlLgorICovCisjZGVmaW5lIFZYRlNfUk9PVF9JTk8JCTIKKworLyoKKyAqIE51bSBvZiBlbnRyaWVzIGluIGZyZWUgZXh0ZW50IGFycmF5CisgKi8KKyNkZWZpbmUgVlhGU19ORUZSRUUJCTMyCisKKworLyoKKyAqIFZ4RlMgc3VwZXJibG9jayAoZGlzaykuCisgKi8KK3N0cnVjdCB2eGZzX3NiIHsKKwkvKgorCSAqIFJlYWRvbmx5IGZpZWxkcyBmb3IgdGhlIHZlcnNpb24gMSBzdXBlcmJsb2NrLgorCSAqCisJICogTG90cyBvZiB0aGlzIGZpZWxkcyBhcmUgbm8gbW9yZSB1c2VkIGJ5IHZlcnNpb24gMgorCSAqIGFuZCBuZXZlciBmaWxlc3lzdGVtcy4KKwkgKi8KKwl1X2ludDMyX3QJdnNfbWFnaWM7CQkvKiBNYWdpYyBudW1iZXIgKi8KKwlpbnQzMl90CQl2c192ZXJzaW9uOwkJLyogVnhGUyB2ZXJzaW9uICovCisJdV9pbnQzMl90CXZzX2N0aW1lOwkJLyogY3JlYXRlIHRpbWUgLSBzZWNzICovCisJdV9pbnQzMl90CXZzX2N1dGltZTsJCS8qIGNyZWF0ZSB0aW1lIC0gdXNlY3MgKi8KKwlpbnQzMl90CQlfX3VudXNlZDE7CQkvKiB1bnVzZWQgKi8KKwlpbnQzMl90CQlfX3VudXNlZDI7CQkvKiB1bnVzZWQgKi8KKwl2eF9kYWRkcl90CXZzX29sZF9sb2dzdGFydDsJLyogb2Jzb2xldGUgKi8KKwl2eF9kYWRkcl90CXZzX29sZF9sb2dlbmQ7CQkvKiBvYnNvbGV0ZSAqLworCWludDMyX3QJCXZzX2JzaXplOwkJLyogYmxvY2sgc2l6ZSAqLworCWludDMyX3QJCXZzX3NpemU7CQkvKiBudW1iZXIgb2YgYmxvY2tzICovCisJaW50MzJfdAkJdnNfZHNpemU7CQkvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgKi8KKwl1X2ludDMyX3QJdnNfb2xkX25pbm9kZTsJCS8qIG9ic29sZXRlICovCisJaW50MzJfdAkJdnNfb2xkX25hdTsJCS8qIG9ic29sZXRlICovCisJaW50MzJfdAkJX191bnVzZWQzOwkJLyogdW51c2VkICovCisJaW50MzJfdAkJdnNfb2xkX2RlZmlleHRzaXplOwkvKiBvYnNvbGV0ZSAqLworCWludDMyX3QJCXZzX29sZF9pbGJzaXplOwkJLyogb2Jzb2xldGUgKi8KKwlpbnQzMl90CQl2c19pbW1lZGxlbjsJCS8qIHNpemUgb2YgaW1tZWRpYXRlIGRhdGEgYXJlYSAqLworCWludDMyX3QJCXZzX25kYWRkcjsJCS8qIG51bWJlciBvZiBkaXJlY3QgZXh0ZW50ZXMgKi8KKwl2eF9kYWRkcl90CXZzX2ZpcnN0YXU7CQkvKiBhZGRyZXNzIG9mIGZpcnN0IEFVICovCisJdnhfZGFkZHJfdAl2c19lbWFwOwkJLyogb2Zmc2V0IG9mIGV4dGVudCBtYXAgaW4gQVUgKi8KKwl2eF9kYWRkcl90CXZzX2ltYXA7CQkvKiBvZmZzZXQgb2YgaW5vZGUgbWFwIGluIEFVICovCisJdnhfZGFkZHJfdAl2c19pZXh0b3A7CQkvKiBvZmZzZXQgb2YgRXh0T3AuIG1hcCBpbiBBVSAqLworCXZ4X2RhZGRyX3QJdnNfaXN0YXJ0OwkJLyogb2Zmc2V0IG9mIGlub2RlIGxpc3QgaW4gQVUgKi8KKwl2eF9kYWRkcl90CXZzX2JzdGFydDsJCS8qIG9mZnNldCBvZiBmZGJsb2NrIGluIEFVICovCisJdnhfZGFkZHJfdAl2c19mZW1hcDsJCS8qIGF1Zmlyc3QgKyBlbWFwICovCisJdnhfZGFkZHJfdAl2c19maW1hcDsJCS8qIGF1Zmlyc3QgKyBpbWFwICovCisJdnhfZGFkZHJfdAl2c19maWV4dG9wOwkJLyogYXVmaXJzdCArIGlleHRvcCAqLworCXZ4X2RhZGRyX3QJdnNfZmlzdGFydDsJCS8qIGF1Zmlyc3QgKyBpc3RhcnQgKi8KKwl2eF9kYWRkcl90CXZzX2Zic3RhcnQ7CQkvKiBhdWZpcnN0ICsgYnN0YXJ0ICovCisJaW50MzJfdAkJdnNfbmluZGlyOwkJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gaW5kaXIgKi8KKwlpbnQzMl90CQl2c19hdWxlbjsJCS8qIGxlbmd0aCBvZiBBVSBpbiBibG9ja3MgKi8KKwlpbnQzMl90CQl2c19hdWltbGVuOwkJLyogbGVuZ3RoIG9mIGltYXAgaW4gYmxvY2tzICovCisJaW50MzJfdAkJdnNfYXVlbWxlbjsJCS8qIGxlbmd0aCBvZiBlbWFwIGluIGJsb2NrcyAqLworCWludDMyX3QJCXZzX2F1aWxlbjsJCS8qIGxlbmd0aCBvZiBpbGlzdCBpbiBibG9ja3MgKi8KKwlpbnQzMl90CQl2c19hdXBhZDsJCS8qIGxlbmd0aCBvZiBwYWQgaW4gYmxvY2tzICovCisJaW50MzJfdAkJdnNfYXVibG9ja3M7CQkvKiBkYXRhIGJsb2NrcyBpbiBBVSAqLworCWludDMyX3QJCXZzX21heHRpZXI7CQkvKiBsb2cgYmFzZSAyIG9mIGF1YmxvY2tzICovCisJaW50MzJfdAkJdnNfaW5vcGI7CQkvKiBudW1iZXIgb2YgaW5vZGVzIHBlciBibGsgKi8KKwlpbnQzMl90CQl2c19vbGRfaW5vcGF1OwkJLyogb2Jzb2xldGUgKi8KKwlpbnQzMl90CQl2c19vbGRfaW5vcGlsYjsJCS8qIG9ic29sZXRlICovCisJaW50MzJfdAkJdnNfb2xkX25kaXJpcGF1OwkvKiBvYnNvbGV0ZSAqLworCWludDMyX3QJCXZzX2lhZGRybGVuOwkJLyogc2l6ZSBvZiBpbmRpcmVjdCBhZGRyIGV4dC4gKi8KKwlpbnQzMl90CQl2c19ic2hpZnQ7CQkvKiBsb2cgYmFzZSAyIG9mIGJzaXplICovCisJaW50MzJfdAkJdnNfaW5vc2hpZnQ7CQkvKiBsb2cgYmFzZSAyIG9mIGlub2JwICovCisJaW50MzJfdAkJdnNfYm1hc2s7CQkvKiB+KCBic2l6ZSAtIDEgKSAqLworCWludDMyX3QJCXZzX2JvZmZtYXNrOwkJLyogYnNpemUgLSAxICovCisJaW50MzJfdAkJdnNfb2xkX2lub21hc2s7CQkvKiBvbGRfaW5vcGlsYiAtIDEgKi8KKwlpbnQzMl90CQl2c19jaGVja3N1bTsJCS8qIGNoZWNrc3VtIG9mIFYxIGRhdGEgKi8KKwkKKwkvKgorCSAqIFZlcnNpb24gMSwgd3JpdGFibGUKKwkgKi8KKwlpbnQzMl90CQl2c19mcmVlOwkJLyogbnVtYmVyIG9mIGZyZWUgYmxvY2tzICovCisJaW50MzJfdAkJdnNfaWZyZWU7CQkvKiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgKi8KKwlpbnQzMl90CQl2c19lZnJlZVtWWEZTX05FRlJFRV07CS8qIG51bWJlciBvZiBmcmVlIGV4dGVudHMgYnkgc2l6ZSAqLworCWludDMyX3QJCXZzX2ZsYWdzOwkJLyogZmxhZ3MgPyE/ICovCisJdV9pbnQ4X3QJdnNfbW9kOwkJCS8qIGZpbGVzeXN0ZW0gaGFzIGJlZW4gY2hhbmdlZCAqLworCXVfaW50OF90CXZzX2NsZWFuOwkJLyogY2xlYW4gRlMgKi8KKwl1X2ludDE2X3QJX191bnVzZWQ0OwkJLyogdW51c2VkICovCisJdV9pbnQzMl90CXZzX2ZpcnN0bG9naWQ7CQkvKiBtb3VudCB0aW1lIGxvZyBJRCAqLworCXVfaW50MzJfdAl2c193dGltZTsJCS8qIGxhc3QgdGltZSB3cml0dGVuIC0gc2VjICovCisJdV9pbnQzMl90CXZzX3d1dGltZTsJCS8qIGxhc3QgdGltZSB3cml0dGVuIC0gdXNlYyAqLworCXVfaW50OF90CXZzX2ZuYW1lWzZdOwkJLyogRlMgbmFtZSAqLworCXVfaW50OF90CXZzX2ZwYWNrWzZdOwkJLyogRlMgcGFjayBuYW1lICovCisJaW50MzJfdAkJdnNfbG9ndmVyc2lvbjsJCS8qIGxvZyBmb3JtYXQgdmVyc2lvbiAqLworCWludDMyX3QJCV9fdW51c2VkNTsJCS8qIHVudXNlZCAqLworCQorCS8qCisJICogVmVyc2lvbiAyLCBSZWFkLW9ubHkKKwkgKi8KKwl2eF9kYWRkcl90CXZzX29sdGV4dFsyXTsJCS8qIE9MVCBleHRlbnQgYW5kIHJlcGxpY2EgKi8KKwlpbnQzMl90CQl2c19vbHRzaXplOwkJLyogT0xUIGV4dGVudCBzaXplICovCisJaW50MzJfdAkJdnNfaWF1aW1sZW47CQkvKiBzaXplIG9mIGlub2RlIG1hcCAqLworCWludDMyX3QJCXZzX2lhdXNpemU7CQkvKiBzaXplIG9mIElBVSBpbiBibG9ja3MgKi8KKwlpbnQzMl90CQl2c19kaW5vc2l6ZTsJCS8qIHNpemUgb2YgaW5vZGUgaW4gYnl0ZXMgKi8KKwlpbnQzMl90CQl2c19vbGRfZG5pYWRkcjsJCS8qIGluZGlyIGxldmVscyBwZXIgaW5vZGUgKi8KKwlpbnQzMl90CQl2c19jaGVja3N1bTI7CQkvKiBjaGVja3N1bSBvZiBWMiBSTyAqLworCisJLyoKKwkgKiBBY3R1YWxseSBtdWNoIG1vcmUuLi4KKwkgKi8KK307CisKKworLyoKKyAqIEluIGNvcmUgc3VwZXJibG9jayBmaWxlc3lzdGVtIHByaXZhdGUgZGF0YSBmb3IgVnhGUy4KKyAqLworc3RydWN0IHZ4ZnNfc2JfaW5mbyB7CisJc3RydWN0IHZ4ZnNfc2IJCSp2c2lfcmF3OwkvKiByYXcgKG9uIGRpc2spIHN1cGVibG9jayAqLworCXN0cnVjdCBidWZmZXJfaGVhZAkqdnNpX2JwOwkvKiBidWZmZXIgZm9yIHJhdyBzdXBlcmJsb2NrKi8KKwlzdHJ1Y3QgaW5vZGUJCSp2c2lfZnNoaXA7CS8qIGZpbGVzZXQgaGVhZGVyIGlub2RlICovCisJc3RydWN0IGlub2RlCQkqdnNpX2lsaXN0OwkvKiBpbm9kZSBsaXN0IGlub2RlICovCisJc3RydWN0IGlub2RlCQkqdnNpX3N0aWxpc3Q7CS8qIHN0cnVjdHVhbCBpbm9kZSBsaXN0IGlub2RlICovCisJdV9sb25nCQkJdnNpX2lleHQ7CS8qIGluaXRpYWwgaW5vZGUgbGlzdCAqLworCWlub190CQkJdnNpX2ZzaGlubzsJLyogZmlsZXNldCBoZWFkZXIgaW5vZGUgKi8KKwlkYWRkcl90CQkJdnNpX29sdGV4dDsJLyogT0xUIGV4dGVudCAqLworCWRhZGRyX3QJCQl2c2lfb2x0c2l6ZTsJLyogT0xUIHNpemUgKi8KK307CisKKworLyoKKyAqIEZpbGUgbW9kZXMuICBGaWxlIHR5cGVzIGFib3ZlIDB4ZjAwMCBhcmUgdnhmcyBpbnRlcm5hbCBvbmx5LCB0aGV5IHNob3VsZAorICogbm90IGJlIHBhc3NlZCBiYWNrIHRvIGhpZ2hlciBsZXZlbHMgb2YgdGhlIHN5c3RlbS4gIHZ4ZnMgZmlsZSB0eXBlcyBtdXN0CisgKiBuZXZlciBoYXZlIG9uZSBvZiB0aGUgcmVndWxhciBmaWxlIHR5cGUgYml0cyBzZXQuCisgKi8KK2VudW0gdnhmc19tb2RlIHsKKwlWWEZTX0lTVUlEID0gMHgwMDAwMDgwMCwJLyogc2V0dWlkICovCisJVlhGU19JU0dJRCA9IDB4MDAwMDA0MDAsCS8qIHNldGdpZCAqLworCVZYRlNfSVNWVFggPSAweDAwMDAwMjAwLAkvKiBzdGlja3kgYml0ICovCisJVlhGU19JUkVBRCA9IDB4MDAwMDAxMDAsCS8qIHJlYWQgKi8KKwlWWEZTX0lXUklURSA9IDB4MDAwMDAwODAsCS8qIHdyaXRlICovCisJVlhGU19JRVhFQyA9IDB4MDAwMDAwNDAsCS8qIGV4ZWMgKi8KKworCVZYRlNfSUZJRk8gPSAweDAwMDAxMDAwLAkvKiBOYW1lZCBwaXBlICovCisJVlhGU19JRkNIUiA9IDB4MDAwMDIwMDAsCS8qIENoYXJhY3RlciBkZXZpY2UgKi8KKwlWWEZTX0lGRElSID0gMHgwMDAwNDAwMCwJLyogRGlyZWN0b3J5ICovCisJVlhGU19JRk5BTSA9IDB4MDAwMDUwMDAsCS8qIFhlbml4IGRldmljZSA/PyAqLworCVZYRlNfSUZCTEsgPSAweDAwMDA2MDAwLAkvKiBCbG9jayBkZXZpY2UgKi8KKwlWWEZTX0lGUkVHID0gMHgwMDAwODAwMCwJLyogUmVndWxhciBmaWxlICovCisJVlhGU19JRkNNUCA9IDB4MDAwMDkwMDAsCS8qIENvbXByZXNzZWQgZmlsZSA/IT8gKi8KKwlWWEZTX0lGTE5LID0gMHgwMDAwYTAwMCwJLyogU3ltbGluayAqLworCVZYRlNfSUZTT0MgPSAweDAwMDBjMDAwLAkvKiBTb2NrZXQgKi8KKworCS8qIFZ4RlMgaW50ZXJuYWwgKi8KKwlWWEZTX0lGRlNIID0gMHgxMDAwMDAwMCwJLyogRmlsZXNldCBoZWFkZXIgKi8KKwlWWEZTX0lGSUxUID0gMHgyMDAwMDAwMCwJLyogSW5vZGUgbGlzdCAqLworCVZYRlNfSUZJQVUgPSAweDMwMDAwMDAwLAkvKiBJbm9kZSBhbGxvY2F0aW9uIHVuaXQgKi8KKwlWWEZTX0lGQ1VUID0gMHg0MDAwMDAwMCwJLyogQ3VycmVudCB1c2FnZSB0YWJsZSAqLworCVZYRlNfSUZBVFQgPSAweDUwMDAwMDAwLAkvKiBBdHRyLiBpbm9kZSAqLworCVZYRlNfSUZMQ1QgPSAweDYwMDAwMDAwLAkvKiBMaW5rIGNvdW50IHRhYmxlICovCisJVlhGU19JRklBVCA9IDB4NzAwMDAwMDAsCS8qIEluZGlyZWN0IGF0dHJpYnV0ZSBmaWxlICovCisJVlhGU19JRkVNUiA9IDB4ODAwMDAwMDAsCS8qIEV4dGVudCBtYXAgcmVvcmcgZmlsZSAqLworCVZYRlNfSUZRVU8gPSAweDkwMDAwMDAwLAkvKiBCU0QgcXVvdGEgZmlsZSAqLworCVZYRlNfSUZQVEkgPSAweGEwMDAwMDAwLAkvKiAiUGFzcyB0aHJvdWdoIiBpbm9kZSAqLworCVZYRlNfSUZMQUIgPSAweDExMDAwMDAwLAkvKiBEZXZpY2UgbGFiZWwgZmlsZSAqLworCVZYRlNfSUZPTFQgPSAweDEyMDAwMDAwLAkvKiBPTFQgZmlsZSAqLworCVZYRlNfSUZMT0cgPSAweDEzMDAwMDAwLAkvKiBMb2cgZmlsZSAqLworCVZYRlNfSUZFTVAgPSAweDE0MDAwMDAwLAkvKiBFeHRlbnQgbWFwIGZpbGUgKi8KKwlWWEZTX0lGRUFVID0gMHgxNTAwMDAwMCwJLyogRXh0ZW50IEFVIGZpbGUgKi8KKwlWWEZTX0lGQVVTID0gMHgxNjAwMDAwMCwJLyogRXh0ZW50IEFVIHN1bW1hcnkgZmlsZSAqLworCVZYRlNfSUZERVYgPSAweDE3MDAwMDAwLAkvKiBEZXZpY2UgY29uZmlnIGZpbGUgKi8KKworfTsKKworI2RlZmluZQlWWEZTX1RZUEVfTUFTSwkJMHhmZmZmZjAwMAorCisjZGVmaW5lIFZYRlNfSVNfVFlQRShpcCx0eXBlKQkoKChpcCktPnZpaV9tb2RlICYgVlhGU19UWVBFX01BU0spID09ICh0eXBlKSkKKyNkZWZpbmUgVlhGU19JU0ZJRk8oeCkJCVZYRlNfSVNfVFlQRSgoeCksVlhGU19JRklGTykKKyNkZWZpbmUgVlhGU19JU0NIUih4KQkJVlhGU19JU19UWVBFKCh4KSxWWEZTX0lGQ0hSKQorI2RlZmluZSBWWEZTX0lTRElSKHgpCQlWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZESVIpCisjZGVmaW5lIFZYRlNfSVNOQU0oeCkJCVZYRlNfSVNfVFlQRSgoeCksVlhGU19JRk5BTSkKKyNkZWZpbmUgVlhGU19JU0JMSyh4KQkJVlhGU19JU19UWVBFKCh4KSxWWEZTX0lGQkxLKQorI2RlZmluZSBWWEZTX0lTTE5LKHgpCQlWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZMTkspCisjZGVmaW5lIFZYRlNfSVNSRUcoeCkJCVZYRlNfSVNfVFlQRSgoeCksVlhGU19JRlJFRykKKyNkZWZpbmUgVlhGU19JU0NNUCh4KQkJVlhGU19JU19UWVBFKCh4KSxWWEZTX0lGQ01QKQorI2RlZmluZSBWWEZTX0lTU09DKHgpCQlWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZTT0MpCisKKyNkZWZpbmUgVlhGU19JU0ZTSCh4KQkJVlhGU19JU19UWVBFKCh4KSxWWEZTX0lGRlNIKQorI2RlZmluZSBWWEZTX0lTSUxUKHgpCQlWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZJTFQpCisKKy8qCisgKiBJbm1vZGUgb3JnYW5pc2F0aW9uIHR5cGVzLgorICovCitlbnVtIHsKKwlWWEZTX09SR19OT05FCT0gMCwJLyogSW5vZGUgaGFzICpubyogZm9ybWF0ID8hPyAqLworCVZYRlNfT1JHX0VYVDQJPSAxLAkvKiBFeHQ0ICovCisJVlhGU19PUkdfSU1NRUQJPSAyLAkvKiBBbGwgZGF0YSBzdG9yZWQgaW4gaW5vZGUgKi8KKwlWWEZTX09SR19UWVBFRAk9IDMsCS8qIFR5cGVkIGV4dGVudHMgKi8KK307CisKKyNkZWZpbmUgVlhGU19JU19PUkcoaXAsb3JnKQkoKGlwKS0+dmlpX29yZ3R5cGUgPT0gKG9yZykpCisjZGVmaW5lIFZYRlNfSVNOT05FKGlwKQkJVlhGU19JU19PUkcoKGlwKSwgVlhGU19PUkdfTk9ORSkKKyNkZWZpbmUgVlhGU19JU0VYVDQoaXApCQlWWEZTX0lTX09SRygoaXApLCBWWEZTX09SR19FWFQ0KQorI2RlZmluZSBWWEZTX0lTSU1NRUQoaXApCVZYRlNfSVNfT1JHKChpcCksIFZYRlNfT1JHX0lNTUVEKQorI2RlZmluZSBWWEZTX0lTVFlQRUQoaXApCVZYRlNfSVNfT1JHKChpcCksIFZYRlNfT1JHX1RZUEVEKQorCisKKy8qCisgKiBHZXQgZmlsZXN5c3RlbSBwcml2YXRlIGRhdGEgZnJvbSBWRlMgaW5vZGUuCisgKi8KKyNkZWZpbmUgVlhGU19JTk8oaXApIFwKKwkoKHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKikoaXApLT51LmdlbmVyaWNfaXApCisKKy8qCisgKiBHZXQgZmlsZXN5c3RlbSBwcml2YXRlIGRhdGEgZnJvbSBWRlMgc3VwZXJibG9jay4KKyAqLworI2RlZmluZSBWWEZTX1NCSShzYnApIFwKKwkoKHN0cnVjdCB2eGZzX3NiX2luZm8gKikoc2JwKS0+c19mc19pbmZvKQorCisjZW5kaWYgLyogX1ZYRlNfU1VQRVJfSF8gKi8KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfYm1hcC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19ibWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0YjU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfYm1hcC5jCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZmlsZXN5c3RlbSB0byBkaXNrIGJsb2NrIG1hcHBpbmcuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlICJ2eGZzLmgiCisjaW5jbHVkZSAidnhmc19pbm9kZS5oIgorCisKKyNpZmRlZiBESUFHTk9TVElDCitzdGF0aWMgdm9pZAordnhmc190eXBkdW1wKHN0cnVjdCB2eGZzX3R5cGVkICp0eXApCit7CisJcHJpbnRrKEtFUk5fREVCVUcgInR5cGU9JUx1ICIsIHR5cC0+dnRfaGRyID4+IFZYRlNfVFlQRURfVFlQRVNISUZUKTsKKwlwcmludGsoIm9mZnNldD0lTHggIiwgdHlwLT52dF9oZHIgJiBWWEZTX1RZUEVEX09GRlNFVE1BU0spOworCXByaW50aygiYmxvY2s9JXggIiwgdHlwLT52dF9ibG9jayk7CisJcHJpbnRrKCJzaXplPSV4XG4iLCB0eXAtPnZ0X3NpemUpOworfQorI2VuZGlmCisKKy8qKgorICogdnhmc19ibWFwX2V4dDQgLSBkbyBibWFwIGZvciBleHQ0IGV4dGVudHMKKyAqIEBpcDoJCXBvaW50ZXIgdG8gdGhlIGlub2RlIHdlIGRvIGJtYXAgZm9yCisgKiBAaWJsb2NrOglsb2dpY2FsIGJsb2NrLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICB2eGZzX2JtYXBfZXh0NCBwZXJmb3JtcyB0aGUgYm1hcCBvcGVyYXRpb24gZm9yIGlub2RlcyB3aXRoCisgKiAgIGV4dDQtc3R5bGUgZXh0ZW50cyAod2hpY2ggYXJlIG11Y2ggbGlrZSB0aGUgdHJhZGl0aW9uYWwgVU5JWAorICogICBpbm9kZSBvcmdhbmlzYXRpb24pLgorICoKKyAqIFJldHVybnM6CisgKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLgorICovCitzdGF0aWMgZGFkZHJfdAordnhmc19ibWFwX2V4dDQoc3RydWN0IGlub2RlICppcCwgbG9uZyBibikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaXAtPmlfc2I7CisJc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwID0gVlhGU19JTk8oaXApOworCXVuc2lnbmVkIGxvbmcgYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CisJdTMyIGluZHNpemUgPSB2aXAtPnZpaV9leHQ0LnZlNF9pbmRzaXplOworCWludCBpOworCisJaWYgKGluZHNpemUgPiBzYi0+c19ibG9ja3NpemUpCisJCWdvdG8gZmFpbF9zaXplOworCisJZm9yIChpID0gMDsgaSA8IFZYRlNfTkRBRERSOyBpKyspIHsKKwkJc3RydWN0IGRpcmVjdCAqZCA9IHZpcC0+dmlpX2V4dDQudmU0X2RpcmVjdCArIGk7CisJCWlmIChibiA+PSAwICYmIGJuIDwgZC0+c2l6ZSkKKwkJCXJldHVybiAoYm4gKyBkLT5leHRlbnQpOworCQlibiAtPSBkLT5zaXplOworCX0KKworCWlmICgoYm4gLyAoaW5kc2l6ZSAqIGluZHNpemUgKiBic2l6ZSAvIDQpKSA9PSAwKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYnVmOworCQlkYWRkcl90CWJubzsKKwkJdTMyICppbmRpcjsKKworCQlidWYgPSBzYl9icmVhZChzYiwgdmlwLT52aWlfZXh0NC52ZTRfaW5kaXJbMF0pOworCQlpZiAoIWJ1ZiB8fCAhYnVmZmVyX21hcHBlZChidWYpKQorCQkJZ290byBmYWlsX2J1ZjsKKworCQlpbmRpciA9ICh1MzIgKilidWYtPmJfZGF0YTsKKwkJYm5vID0gaW5kaXJbKGJuL2luZHNpemUpICUgKGluZHNpemUqYm4pXSArIChibiVpbmRzaXplKTsKKworCQlicmVsc2UoYnVmKTsKKwkJcmV0dXJuIGJubzsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibm8gbWF0Y2hpbmcgaW5kaXI/Iik7CisKKwlyZXR1cm4gMDsKKworZmFpbF9zaXplOgorCXByaW50aygidnhmczogaW5kaXJlY3QgZXh0ZW50IHRvIGJpZyFcbiIpOworZmFpbF9idWY6CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdnhmc19ibWFwX2luZGlyIC0gcmVjdXJzaW9uIGZvciB2eGZzX2JtYXBfdHlwZWQKKyAqIEBpcDoJCXBvaW50ZXIgdG8gdGhlIGlub2RlIHdlIGRvIGJtYXAgZm9yCisgKiBAaW5kaXI6CWluZGlyZWN0IGJsb2NrIHdlIHN0YXJ0IHJlYWRpbmcgYXQKKyAqIEBzaXplOglzaXplIG9mIHRoZSB0eXBlZCBhcmVhIHRvIHNlYXJjaAorICogQGJsb2NrOglwYXJ0aWFsbHkgcmVzdWx0IGZyb20gZnVydGhlciBzZWFyY2hlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogICB2eGZzX2JtYXBfaW5kaXIgcmVhZHMgYSAmc3RydWN0IHZ4ZnNfdHlwZWQgYXQgQGluZGlyCisgKiAgIGFuZCBwZXJmb3JtcyB0aGUgdHlwZS1kZWZpbmVkIGFjdGlvbi4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLgorICoKKyAqIE5vdGU6CisgKiAgIEtlcm5lbHN0YWNrIGlzIHJhcmUuICBVbnJlY3Vyc2U/CisgKi8KK3N0YXRpYyBkYWRkcl90Cit2eGZzX2JtYXBfaW5kaXIoc3RydWN0IGlub2RlICppcCwgbG9uZyBpbmRpciwgaW50IHNpemUsIGxvbmcgYmxvY2spCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkCQkqYnAgPSBOVUxMOworCWRhZGRyX3QJCQkJcGJsb2NrID0gMDsKKwlpbnQJCQkJaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplICogVlhGU19UWVBFRF9QRVJfQkxPQ0soaXAtPmlfc2IpOyBpKyspIHsKKwkJc3RydWN0IHZ4ZnNfdHlwZWQJKnR5cDsKKwkJaW50NjRfdAkJCW9mZjsKKworCQlicCA9IHNiX2JyZWFkKGlwLT5pX3NiLAorCQkJCWluZGlyICsgKGkgLyBWWEZTX1RZUEVEX1BFUl9CTE9DSyhpcC0+aV9zYikpKTsKKwkJaWYgKCFidWZmZXJfbWFwcGVkKGJwKSkKKwkJCXJldHVybiAwOworCisJCXR5cCA9ICgoc3RydWN0IHZ4ZnNfdHlwZWQgKilicC0+Yl9kYXRhKSArCisJCQkoaSAlIFZYRlNfVFlQRURfUEVSX0JMT0NLKGlwLT5pX3NiKSk7CisJCW9mZiA9ICh0eXAtPnZ0X2hkciAmIFZYRlNfVFlQRURfT0ZGU0VUTUFTSyk7CisKKwkJaWYgKGJsb2NrIDwgb2ZmKSB7CisJCQlicmVsc2UoYnApOworCQkJY29udGludWU7CisJCX0KKworCQlzd2l0Y2ggKCh1X2ludDMyX3QpKHR5cC0+dnRfaGRyID4+IFZYRlNfVFlQRURfVFlQRVNISUZUKSkgeworCQljYXNlIFZYRlNfVFlQRURfSU5ESVJFQ1Q6CisJCQlwYmxvY2sgPSB2eGZzX2JtYXBfaW5kaXIoaXAsIHR5cC0+dnRfYmxvY2ssCisJCQkJCXR5cC0+dnRfc2l6ZSwgYmxvY2sgLSBvZmYpOworCQkJaWYgKHBibG9jayA9PSAtMikKKwkJCQlicmVhazsKKwkJCWdvdG8gb3V0OworCQljYXNlIFZYRlNfVFlQRURfREFUQToKKwkJCWlmICgoYmxvY2sgLSBvZmYpID49IHR5cC0+dnRfc2l6ZSkKKwkJCQlicmVhazsKKwkJCXBibG9jayA9ICh0eXAtPnZ0X2Jsb2NrICsgYmxvY2sgLSBvZmYpOworCQkJZ290byBvdXQ7CisJCWNhc2UgVlhGU19UWVBFRF9JTkRJUkVDVF9ERVY0OgorCQljYXNlIFZYRlNfVFlQRURfREFUQV9ERVY0OiB7CisJCQlzdHJ1Y3Qgdnhmc190eXBlZF9kZXY0CSp0eXA0ID0KKwkJCQkoc3RydWN0IHZ4ZnNfdHlwZWRfZGV2NCAqKXR5cDsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiXG5cblRZUEVEX0RFVjQgZGV0ZWN0ZWQhXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gImJsb2NrOiAlTHVcdHNpemU6ICVMZFx0ZGV2OiAlZFxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSB0eXA0LT52ZDRfYmxvY2ssCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdHlwNC0+dmQ0X3NpemUsCisJCQkgICAgICAgdHlwNC0+dmQ0X2Rldik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQl9CisJCWJyZWxzZShicCk7CisJfQorCitmYWlsOgorCXBibG9jayA9IDA7CitvdXQ6CisJYnJlbHNlKGJwKTsKKwlyZXR1cm4gKHBibG9jayk7Cit9CisKKy8qKgorICogdnhmc19ibWFwX3R5cGVkIC0gYm1hcCBmb3IgdHlwZWQgZXh0ZW50cworICogQGlwOgkJcG9pbnRlciB0byB0aGUgaW5vZGUgd2UgZG8gYm1hcCBmb3IKKyAqIEBpYmxvY2s6CWxvZ2ljYWwgYmxvY2sKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUGVyZm9ybXMgdGhlIGJtYXAgb3BlcmF0aW9uIGZvciB0eXBlZCBleHRlbnRzLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgVGhlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBvbiBzdWNjZXNzLCBlbHNlIFplcm8uCisgKi8KK3N0YXRpYyBkYWRkcl90Cit2eGZzX2JtYXBfdHlwZWQoc3RydWN0IGlub2RlICppcCwgbG9uZyBpYmxvY2spCit7CisJc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbwkJKnZpcCA9IFZYRlNfSU5PKGlwKTsKKwlkYWRkcl90CQkJCXBibG9jayA9IDA7CisJaW50CQkJCWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVlhGU19OVFlQRUQ7IGkrKykgeworCQlzdHJ1Y3Qgdnhmc190eXBlZAkqdHlwID0gdmlwLT52aWlfb3JnLnR5cGVkICsgaTsKKwkJaW50NjRfdAkJCW9mZiA9ICh0eXAtPnZ0X2hkciAmIFZYRlNfVFlQRURfT0ZGU0VUTUFTSyk7CisKKyNpZmRlZiBESUFHTk9TVElDCisJCXZ4ZnNfdHlwZHVtcCh0eXApOworI2VuZGlmCisJCWlmIChpYmxvY2sgPCBvZmYpCisJCQljb250aW51ZTsKKwkJc3dpdGNoICgodV9pbnQzMl90KSh0eXAtPnZ0X2hkciA+PiBWWEZTX1RZUEVEX1RZUEVTSElGVCkpIHsKKwkJY2FzZSBWWEZTX1RZUEVEX0lORElSRUNUOgorCQkJcGJsb2NrID0gdnhmc19ibWFwX2luZGlyKGlwLCB0eXAtPnZ0X2Jsb2NrLAorCQkJCQl0eXAtPnZ0X3NpemUsIGlibG9jayAtIG9mZik7CisJCQlpZiAocGJsb2NrID09IC0yKQorCQkJCWJyZWFrOworCQkJcmV0dXJuIChwYmxvY2spOworCQljYXNlIFZYRlNfVFlQRURfREFUQToKKwkJCWlmICgoaWJsb2NrIC0gb2ZmKSA8IHR5cC0+dnRfc2l6ZSkKKwkJCQlyZXR1cm4gKHR5cC0+dnRfYmxvY2sgKyBpYmxvY2sgLSBvZmYpOworCQkJYnJlYWs7CisJCWNhc2UgVlhGU19UWVBFRF9JTkRJUkVDVF9ERVY0OgorCQljYXNlIFZYRlNfVFlQRURfREFUQV9ERVY0OiB7CisJCQlzdHJ1Y3Qgdnhmc190eXBlZF9kZXY0CSp0eXA0ID0KKwkJCQkoc3RydWN0IHZ4ZnNfdHlwZWRfZGV2NCAqKXR5cDsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiXG5cblRZUEVEX0RFVjQgZGV0ZWN0ZWQhXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gImJsb2NrOiAlTHVcdHNpemU6ICVMZFx0ZGV2OiAlZFxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSB0eXA0LT52ZDRfYmxvY2ssCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdHlwNC0+dmQ0X3NpemUsCisJCQkgICAgICAgdHlwNC0+dmQ0X2Rldik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2eGZzX2JtYXAxIC0gdnhmcy1pbnRlcm5hbCBibWFwIG9wZXJhdGlvbgorICogQGlwOgkJCXBvaW50ZXIgdG8gdGhlIGlub2RlIHdlIGRvIGJtYXAgZm9yCisgKiBAaWJsb2NrOgkJbG9naWNhbCBibG9jaworICoKKyAqIERlc2NyaXB0aW9uOgorICogICB2eGZzX2JtYXAxIHBlcmZvbXMgYSBsb2dpY2FsIHRvIHBoeXNpY2FsIGJsb2NrIG1hcHBpbmcKKyAqICAgZm9yIHZ4ZnMtaW50ZXJuYWwgcHVycG9zZXMuCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICBUaGUgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIG9uIHN1Y2Nlc3MsIGVsc2UgWmVyby4KKyAqLworZGFkZHJfdAordnhmc19ibWFwMShzdHJ1Y3QgaW5vZGUgKmlwLCBsb25nIGlibG9jaykKK3sKKwlzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvCQkqdmlwID0gVlhGU19JTk8oaXApOworCisJaWYgKFZYRlNfSVNFWFQ0KHZpcCkpCisJCXJldHVybiB2eGZzX2JtYXBfZXh0NChpcCwgaWJsb2NrKTsKKwlpZiAoVlhGU19JU1RZUEVEKHZpcCkpCisJCXJldHVybiB2eGZzX2JtYXBfdHlwZWQoaXAsIGlibG9jayk7CisJaWYgKFZYRlNfSVNOT05FKHZpcCkpCisJCWdvdG8gdW5zdXBwOworCWlmIChWWEZTX0lTSU1NRUQodmlwKSkKKwkJZ290byB1bnN1cHA7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJ2eGZzOiBpbm9kZSAlbGQgaGFzIG5vIHZhbGlkIG9yZ3R5cGUgKCV4KVxuIiwKKwkJCWlwLT5pX2lubywgdmlwLT52aWlfb3JndHlwZSk7CisJQlVHKCk7CisKK3Vuc3VwcDoKKwlwcmludGsoS0VSTl9XQVJOSU5HICJ2eGZzOiBpbm9kZSAlbGQgaGFzIGFuIHVuc3VwcG9ydGVkIG9yZ3R5cGUgKCV4KVxuIiwKKwkJCWlwLT5pX2lubywgdmlwLT52aWlfb3JndHlwZSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2Rpci5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19kaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTRkZmVmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19kaXIuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqLworI2lmbmRlZiBfVlhGU19ESVJfSF8KKyNkZWZpbmUgX1ZYRlNfRElSX0hfCisKKy8qCisgKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZGlyZWN0b3J5IHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIHZ4ZnMgZGlyZWN0b3J5IGZvcm1hdC4KKyAqLworCisKKy8qCisgKiBWeEZTIGRpcmVjdG9yeSBibG9jayBoZWFkZXIuCisgKgorICogVGhpcyBlbnRyeSBpcyB0aGUgaGVhZCBvZiBldmVyeSBmaWxlc3lzdGVtIGJsb2NrIGluIGEgZGlyZWN0b3J5LgorICogSXQgaXMgdXNlZCBmb3IgZnJlZSBzcGFjZSBtYW5hZ21lbnQgYW5kIGFkZGl0aW9uYWxseSBpbmNsdWRlcworICogYSBoYXNoIGZvciBzcGVlZGluZyB1cCBkaXJlY3Rvcnkgc2VhcmNoIChsb29rdXApLgorICoKKyAqIFRoZSBoYXNoIG1heSBiZSBlbXB0eSBhbmQgaW4gZmFjdCB3ZSBkbyBub3QgdXNlIGl0IGFsbCBpbiB0aGUKKyAqIExpbnV4IGRyaXZlciBmb3Igbm93LgorICovCitzdHJ1Y3Qgdnhmc19kaXJibGsgeworCXVfaW50MTZfdAlkX2ZyZWU7CQkvKiBmcmVlIHNwYWNlIGluIGRpcmJsb2NrICovCisJdV9pbnQxNl90CWRfbmhhc2g7CS8qIG5vIG9mIGhhc2ggY2hhaW5zICovCisJdV9pbnQxNl90CWRfaGFzaFsxXTsJLyogaGFzaCBjaGFpbiAqLworfTsKKworLyoKKyAqIFZYRlNfTkFNRUxFTiBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIGRfbmFtZSBmaWVsZAorICoJb2YgYW4gVnhGUyBkaXJlY3RvcnkgZW50cnkuCisgKi8KKyNkZWZpbmUgVlhGU19OQU1FTEVOCTI1NgorCisvKgorICogVnhGUyBkaXJlY3RvcnkgZW50cnkuCisgKi8KK3N0cnVjdCB2eGZzX2RpcmVjdCB7CisJdnhfaW5vX3QJZF9pbm87CQkJLyogaW5vZGUgbnVtYmVyICovCisJdV9pbnQxNl90CWRfcmVjbGVuOwkJLyogcmVjb3JkIGxlbmd0aCAqLworCXVfaW50MTZfdAlkX25hbWVsZW47CQkvKiBkX25hbWUgbGVuZ3RoICovCisJdV9pbnQxNl90CWRfaGFzaG5leHQ7CQkvKiBuZXh0IGhhc2ggZW50cnkgKi8KKwljaGFyCQlkX25hbWVbVlhGU19OQU1FTEVOXTsJLyogbmFtZSAqLworfTsKKworLyoKKyAqIFZYRlNfRElSUEFEIGRlZmluZXMgdGhlIGRpcmVjdG9yeSBlbnRyeSBib3VuZGFyaWVzLCBpcyBfbXVzdF8gYmUKKyAqCWEgbXVsdGlwbGUgb2YgZm91ci4KKyAqIFZYRlNfTkFNRU1JTiBpcyB0aGUgbGVuZ3RoIG9mIGEgZGlyZWN0b3J5IGVudHJ5IHdpdGggYSBOVUxMIGRfbmFtZS4KKyAqIFZYRlNfRElSUk9VTkQgaXMgYW4gaW50ZXJuYWwgbWFjcm9zIHRoYXQgcm91bmRzIGEgbGVuZ3RoIHRvIGEgdmFsdWUKKyAqCXVzYWJsZSBmb3IgZGlyZWN0b3J5IHNpemVzLgorICogVlhGU19ESVJMRU4gY2FsY3VsYXRlcyB0aGUgZGlyZWN0b3J5IGVudHJ5IHNpemUgZm9yIGFuIGVudHJ5IHdpdGgKKyAqCWEgZF9uYW1lIHdpdGggc2l6ZSBsZW4uCisgKi8KKyNkZWZpbmUgVlhGU19ESVJQQUQJCTQKKyNkZWZpbmUgVlhGU19OQU1FTUlOCQkoKGludCkoKHN0cnVjdCB2eGZzX2RpcmVjdCAqKTApLT5kX25hbWUpCisjZGVmaW5lIFZYRlNfRElSUk9VTkQobGVuKQkoKFZYRlNfRElSUEFEICsgKGxlbikgLSAxKSAmIH4oVlhGU19ESVJQQUQgLTEpKQorI2RlZmluZSBWWEZTX0RJUkxFTihsZW4pCShWWEZTX0RJUlJPVU5EKFZYRlNfTkFNRU1JTiArIChsZW4pKSkKKworLyoKKyAqIFZYRlNfRElSQkxLT1YgaXMgdGhlIG92ZXJoZWFkIG9mIGEgc3BlY2lmaWMgZGlyYmxvY2suCisgKi8KKyNkZWZpbmUgVlhGU19ESVJCTEtPVihkYnApCSgoc2l6ZW9mKHNob3J0KSAqIGRicC0+ZF9uaGFzaCkgKyA0KQorCisjZW5kaWYgLyogX1ZYRlNfRElSX0hfICovCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2V4dGVybi5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19leHRlcm4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGJlOTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19leHRlcm4uaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqLworI2lmbmRlZiBfVlhGU19FWFRFUk5fSF8KKyNkZWZpbmUgX1ZYRlNfRVhURVJOX0hfCisKKy8qCisgKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZXh0ZXJuYWwgcHJvdG90eXBlcy4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcHJvdG90eXBlcyBmb3IgYWxsIHZ4ZnMgZnVuY3Rpb25zIHVzZWQKKyAqIG91dHNpZGUgdGhlaXIgcmVzcGVjdGl2ZSBzb3VyY2UgZmlsZXMuCisgKi8KKworCitzdHJ1Y3Qga21lbV9jYWNoZV9zOworc3RydWN0IHN1cGVyX2Jsb2NrOworc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbzsKK3N0cnVjdCBpbm9kZTsKKworCisvKiB2eGZzX2JtYXAuYyAqLworZXh0ZXJuIGRhZGRyX3QJCQl2eGZzX2JtYXAxKHN0cnVjdCBpbm9kZSAqLCBsb25nKTsKKworLyogdnhmc19mc2hlYWQuYyAqLworZXh0ZXJuIGludAkJCXZ4ZnNfcmVhZF9mc2hlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICopOworCisvKiB2eGZzX2lub2RlLmMgKi8KK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZV9zCSp2eGZzX2lub2RlX2NhY2hlcDsKK2V4dGVybiB2b2lkCQkJdnhmc19kdW1waShzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICosIGlub190KTsKK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKgkJdnhmc19nZXRfZmFrZV9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwKKwkJCQkJc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqKTsKK2V4dGVybiB2b2lkCQkJdnhmc19wdXRfZmFrZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqCXZ4ZnNfYmxraWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdV9sb25nLCBpbm9fdCk7CitleHRlcm4gc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqCXZ4ZnNfc3RpZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbm9fdCk7CitleHRlcm4gdm9pZAkJCXZ4ZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gdm9pZAkJCXZ4ZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOworCisvKiB2eGZzX2xvb2t1cC5jICovCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMJdnhmc19kaXJfaW5vZGVfb3BzOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMJdnhmc19kaXJfb3BlcmF0aW9uczsKKworLyogdnhmc19vbHQuYyAqLworZXh0ZXJuIGludAkJCXZ4ZnNfcmVhZF9vbHQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVfbG9uZyk7CisKKy8qIHZ4ZnNfc3Vici5jICovCitleHRlcm4gc3RydWN0IHBhZ2UgKgkJdnhmc19nZXRfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCB1X2xvbmcpOworZXh0ZXJuIHZvaWQJCQl2eGZzX3B1dF9wYWdlKHN0cnVjdCBwYWdlICopOworZXh0ZXJuIHN0cnVjdCBidWZmZXJfaGVhZCAqCXZ4ZnNfYnJlYWQoc3RydWN0IGlub2RlICosIGludCk7CisKKyNlbmRpZiAvKiBfVlhGU19FWFRFUk5fSF8gKi8KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZnNoZWFkLmMgYi9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YjE5ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5jCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZmlsZXNldCBoZWFkZXIgcm91dGluZXMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSAidnhmcy5oIgorI2luY2x1ZGUgInZ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ2eGZzX2V4dGVybi5oIgorI2luY2x1ZGUgInZ4ZnNfZnNoZWFkLmgiCisKKworI2lmZGVmIERJQUdOT1NUSUMKK3N0YXRpYyB2b2lkCit2eGZzX2R1bXBmc2goc3RydWN0IHZ4ZnNfZnNoICpmaHApCit7CisJcHJpbnRrKCJcblxuZHVtcGluZyBmaWxlc2V0IGhlYWRlcjpcbiIpOworCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRrKCJ2ZXJzaW9uOiAldVxuIiwgZmhwLT5mc2hfdmVyc2lvbik7CisJcHJpbnRrKCJmc2luZGV4OiAldVxuIiwgZmhwLT5mc2hfZnNpbmRleCk7CisJcHJpbnRrKCJpYXVpbm86ICV1XHRuaW5vZGVzOiV1XG4iLAorCQkJZmhwLT5mc2hfaWF1aW5vLCBmaHAtPmZzaF9uaW5vZGVzKTsKKwlwcmludGsoIm1heGlub2RlOiAldVx0bGN0aW5vOiAldVxuIiwKKwkJCWZocC0+ZnNoX21heGlub2RlLCBmaHAtPmZzaF9sY3Rpbm8pOworCXByaW50aygibmF1OiAldVxuIiwgZmhwLT5mc2hfbmF1KTsKKwlwcmludGsoImlsaXN0aW5vWzBdOiAldVx0aWxpc3Rpbm9bMV06ICV1XG4iLAorCQkJZmhwLT5mc2hfaWxpc3Rpbm9bMF0sIGZocC0+ZnNoX2lsaXN0aW5vWzFdKTsKK30KKyNlbmRpZgorCisvKioKKyAqIHZ4ZnNfZ2V0ZnNoIC0gcmVhZCBmaWxlc2V0IGhlYWRlciBpbnRvIG1lbW9yeQorICogQGlwOgkJdGhlIChmYWtlKSBmaWxlc2V0IGhlYWRlciBpbm9kZQorICogQHdoaWNoOgkwIGZvciB0aGUgc3RydWN0dXJhbCwgMSBmb3IgdGhlIHByaW1hcnkgZnNoLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICB2eGZzX2dldGZzaCByZWFkcyBlaXRoZXIgdGhlIHN0cnVjdHVyYWwgb3IgcHJpbWFyeSBmaWxlc2V0IGhlYWRlcgorICogICBkZXNjcmliZWQgYnkgQGlwIGludG8gbWVtb3J5LgorICoKKyAqIFJldHVybnM6CisgKiAgIFRoZSBmaWxlc2V0IGhlYWRlciBzdHJ1Y3R1cmUgb24gc3VjY2VzcywgZWxzZSBaZXJvLgorICovCitzdGF0aWMgc3RydWN0IHZ4ZnNfZnNoICoKK3Z4ZnNfZ2V0ZnNoKHN0cnVjdCBpbm9kZSAqaXAsIGludCB3aGljaCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJCSpicDsKKworCWJwID0gdnhmc19icmVhZChpcCwgd2hpY2gpOworCWlmIChidWZmZXJfbWFwcGVkKGJwKSkgeworCQlzdHJ1Y3Qgdnhmc19mc2gJCSpmaHA7CisKKwkJaWYgKCEoZmhwID0ga21hbGxvYyhzaXplb2YoKmZocCksIFNMQUJfS0VSTkVMKSkpCisJCQlyZXR1cm4gTlVMTDsKKwkJbWVtY3B5KGZocCwgYnAtPmJfZGF0YSwgc2l6ZW9mKCpmaHApKTsKKworCQlicmVsc2UoYnApOworCQlyZXR1cm4gKGZocCk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogdnhmc19yZWFkX2ZzaGVhZCAtIHJlYWQgdGhlIGZpbGVzZXQgaGVhZGVycworICogQHNicDoJc3VwZXJibG9jayB0byB3aGljaCB0aGUgZmlsZXNldCBiZWxvbmdzCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIHZ4ZnNfcmVhZF9mc2hlYWQgd2lsbCBmaWxsIHRoZSBpbm9kZSBhbmQgc3RydWN0dXJhbCBpbm9kZSBsaXN0IGluIEBzYi4KKyAqCisgKiBSZXR1cm5zOgorICogICBaZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlICgtRUlOVkFMKS4KKyAqLworaW50Cit2eGZzX3JlYWRfZnNoZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwKQoreworCXN0cnVjdCB2eGZzX3NiX2luZm8JCSppbmZwID0gVlhGU19TQkkoc2JwKTsKKwlzdHJ1Y3Qgdnhmc19mc2gJCQkqcGZwLCAqc2ZwOworCXN0cnVjdCB2eGZzX2lub2RlX2luZm8JCSp2aXAsICp0aXA7CisKKwl2aXAgPSB2eGZzX2Jsa2lnZXQoc2JwLCBpbmZwLT52c2lfaWV4dCwgaW5mcC0+dnNpX2ZzaGlubyk7CisJaWYgKCF2aXApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2eGZzOiB1bmFibGVkIHRvIHJlYWQgZnNoIGlub2RlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghVlhGU19JU0ZTSCh2aXApKSB7CisJCXByaW50ayhLRVJOX0VSUiAidnhmczogZnNoIGxpc3QgaW5vZGUgaXMgb2Ygd3JvbmcgdHlwZSAoJXgpXG4iLAorCQkJCXZpcC0+dmlpX21vZGUgJiBWWEZTX1RZUEVfTUFTSyk7IAorCQlnb3RvIG91dF9mcmVlX2ZzaGlwOworCX0KKworCisjaWZkZWYgRElBR05PU1RJQworCXByaW50aygidnhmczogZnNoIGlub2RlIGR1bXA6XG4iKTsKKwl2eGZzX2R1bXBpKHZpcCwgaW5mcC0+dnNpX2ZzaGlubyk7CisjZW5kaWYKKworCWluZnAtPnZzaV9mc2hpcCA9IHZ4ZnNfZ2V0X2Zha2VfaW5vZGUoc2JwLCB2aXApOworCWlmICghaW5mcC0+dnNpX2ZzaGlwKSB7CisJCXByaW50ayhLRVJOX0VSUiAidnhmczogdW5hYmxlZCB0byBnZXQgZnNoIGlub2RlXG4iKTsKKwkJZ290byBvdXRfZnJlZV9mc2hpcDsKKwl9CisKKwlzZnAgPSB2eGZzX2dldGZzaChpbmZwLT52c2lfZnNoaXAsIDApOworCWlmICghc2ZwKSB7CisJCXByaW50ayhLRVJOX0VSUiAidnhmczogdW5hYmxlZCB0byBnZXQgc3RydWN0dXJhbCBmc2hcbiIpOworCQlnb3RvIG91dF9pcHV0X2ZzaGlwOworCX0gCisKKyNpZmRlZiBESUFHTk9TVElDCisJdnhmc19kdW1wZnNoKHNmcCk7CisjZW5kaWYKKworCXBmcCA9IHZ4ZnNfZ2V0ZnNoKGluZnAtPnZzaV9mc2hpcCwgMSk7CisJaWYgKCFwZnApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2eGZzOiB1bmFibGVkIHRvIGdldCBwcmltYXJ5IGZzaFxuIik7CisJCWdvdG8gb3V0X2ZyZWVfc2ZwOworCX0KKworI2lmZGVmIERJQUdOT1NUSUMKKwl2eGZzX2R1bXBmc2gocGZwKTsKKyNlbmRpZgorCisJdGlwID0gdnhmc19ibGtpZ2V0KHNicCwgaW5mcC0+dnNpX2lleHQsIHNmcC0+ZnNoX2lsaXN0aW5vWzBdKTsKKwlpZiAoIXRpcCkKKwkJZ290byBvdXRfZnJlZV9wZnA7CisKKwlpbmZwLT52c2lfc3RpbGlzdCA9IHZ4ZnNfZ2V0X2Zha2VfaW5vZGUoc2JwLCB0aXApOworCWlmICghaW5mcC0+dnNpX3N0aWxpc3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2eGZzOiB1bmFibGVkIHRvIGdldCBzdHJ1Y3R1YWwgbGlzdCBpbm9kZVxuIik7CisJCWtmcmVlKHRpcCk7CisJCWdvdG8gb3V0X2ZyZWVfcGZwOworCX0KKwlpZiAoIVZYRlNfSVNJTFQoVlhGU19JTk8oaW5mcC0+dnNpX3N0aWxpc3QpKSkgeworCQlwcmludGsoS0VSTl9FUlIgInZ4ZnM6IHN0cnVjdHVhbCBsaXN0IGlub2RlIGlzIG9mIHdyb25nIHR5cGUgKCV4KVxuIiwKKwkJCQlWWEZTX0lOTyhpbmZwLT52c2lfc3RpbGlzdCktPnZpaV9tb2RlICYgVlhGU19UWVBFX01BU0spOyAKKwkJZ290byBvdXRfaXB1dF9zdGlsaXN0OworCX0KKworCXRpcCA9IHZ4ZnNfc3RpZ2V0KHNicCwgcGZwLT5mc2hfaWxpc3Rpbm9bMF0pOworCWlmICghdGlwKQorCQlnb3RvIG91dF9pcHV0X3N0aWxpc3Q7CisJaW5mcC0+dnNpX2lsaXN0ID0gdnhmc19nZXRfZmFrZV9pbm9kZShzYnAsIHRpcCk7CisJaWYgKCFpbmZwLT52c2lfaWxpc3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2eGZzOiB1bmFibGVkIHRvIGdldCBpbm9kZSBsaXN0IGlub2RlXG4iKTsKKwkJa2ZyZWUodGlwKTsKKwkJZ290byBvdXRfaXB1dF9zdGlsaXN0OworCX0KKwlpZiAoIVZYRlNfSVNJTFQoVlhGU19JTk8oaW5mcC0+dnNpX2lsaXN0KSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2eGZzOiBpbm9kZSBsaXN0IGlub2RlIGlzIG9mIHdyb25nIHR5cGUgKCV4KVxuIiwKKwkJCQlWWEZTX0lOTyhpbmZwLT52c2lfaWxpc3QpLT52aWlfbW9kZSAmIFZYRlNfVFlQRV9NQVNLKTsKKwkJZ290byBvdXRfaXB1dF9pbGlzdDsKKwl9CisKKwlyZXR1cm4gMDsKKworIG91dF9pcHV0X2lsaXN0OgorIAlpcHV0KGluZnAtPnZzaV9pbGlzdCk7Cisgb3V0X2lwdXRfc3RpbGlzdDoKKyAJaXB1dChpbmZwLT52c2lfc3RpbGlzdCk7Cisgb3V0X2ZyZWVfcGZwOgorCWtmcmVlKHBmcCk7Cisgb3V0X2ZyZWVfc2ZwOgorIAlrZnJlZShzZnApOworIG91dF9pcHV0X2ZzaGlwOgorCWlwdXQoaW5mcC0+dnNpX2ZzaGlwKTsKKwlyZXR1cm4gLUVJTlZBTDsKKyBvdXRfZnJlZV9mc2hpcDoKKyAJa2ZyZWUodmlwKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZnNoZWFkLmggYi9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZDBkNjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICovCisjaWZuZGVmIF9WWEZTX0ZTSEVBRF9IXworI2RlZmluZSBfVlhGU19GU0hFQURfSF8KKworLyoKKyAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBmaWxlc2V0IGhlYWRlciBzdHJ1Y3R1cmVzLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcGh5c2ljYWwgc3RydWN0dXJlIG9mIHRoZSBWeEZTCisgKiBmaWxlc2V0IGhlYWRlci4KKyAqLworCisKKy8qCisgKiBGaWxlc2V0IGhlYWRlciAKKyAqLworc3RydWN0IHZ4ZnNfZnNoIHsKKwl1X2ludDMyX3QJZnNoX3ZlcnNpb247CQkvKiBmaWxlc2V0IGhlYWRlciB2ZXJzaW9uICovCisJdV9pbnQzMl90CWZzaF9mc2luZGV4OwkJLyogZmlsZXNldCBpbmRleCAqLworCXVfaW50MzJfdAlmc2hfdGltZTsJCS8qIG1vZGlmaWNhdGlvbiB0aW1lIC0gc2VjICovCisJdV9pbnQzMl90CWZzaF91dGltZTsJCS8qIG1vZGlmaWNhdGlvbiB0aW1lIC0gdXNlYyAqLworCXVfaW50MzJfdAlmc2hfZXh0b3A7CQkvKiBleHRvcCBmbGFncyAqLworCXZ4X2lub190CWZzaF9uaW5vZGVzOwkJLyogYWxsb2NhdGVkIGlub2RlcyAqLworCXVfaW50MzJfdAlmc2hfbmF1OwkJLyogbnVtYmVyIG9mIElBVXMgKi8KKwl1X2ludDMyX3QJZnNoX29sZF9pbGVzaXplOwkvKiBvbGQgc2l6ZSBvZiBpbGlzdCAqLworCXVfaW50MzJfdAlmc2hfZGZsYWdzOwkJLyogZmxhZ3MgKi8KKwl1X2ludDMyX3QJZnNoX3F1b3RhOwkJLyogcXVvdGEgbGltaXQgKi8KKwl2eF9pbm9fdAlmc2hfbWF4aW5vZGU7CQkvKiBtYXhpbXVtIGlub2RlIG51bWJlciAqLworCXZ4X2lub190CWZzaF9pYXVpbm87CQkvKiBJQVUgaW5vZGUgKi8KKwl2eF9pbm9fdAlmc2hfaWxpc3Rpbm9bMl07CS8qIGlsaXN0IGlub2RlcyAqLworCXZ4X2lub190CWZzaF9sY3Rpbm87CQkvKiBsaW5rIGNvdW50IHRhYmxlIGlub2RlICovCisKKwkvKgorCSAqIFNsaWdodGx5IG1vcmUgZmllbGRzIGZvbGxvdywgYnV0IHRoZXkKKwkgKiAgYSkgYXJlIG5vdCBvZiBhbnkgaW50ZXJlc3QgZm9yIHVzLCBhbmQKKwkgKiAgYikgZGlmZmVyIGEgbG90IGluIGRpZmZlcmVudCB2eGZzIHZlcnNpb25zL3BvcnRzCisJICovCit9OworCisjZW5kaWYgLyogX1ZYRlNfRlNIRUFEX0hfICovCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2ltbWVkLmMgYi9mcy9mcmVldnhmcy92eGZzX2ltbWVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM2NzdhYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW1tZWQuYwpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIHN1cHBvcnQgZm9yICdpbW1lZCcgaW5vZGVzLgorICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKworI2luY2x1ZGUgInZ4ZnMuaCIKKyNpbmNsdWRlICJ2eGZzX2lub2RlLmgiCisKKworc3RhdGljIGludAl2eGZzX2ltbWVkX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IG5hbWVpZGF0YSAqKTsKKworc3RhdGljIGludAl2eGZzX2ltbWVkX3JlYWRwYWdlKHN0cnVjdCBmaWxlICosIHN0cnVjdCBwYWdlICopOworCisvKgorICogSW5vZGUgb3BlcmF0aW9ucyBmb3IgaW1tZWQgc3ltbGlua3MuCisgKgorICogVW5saWtlZCBhbGwgb3RoZXIgb3BlcmF0aW9ucyB3ZSBkbyBub3QgZ28gdGhyb3VnaCB0aGUgcGFnZWNhY2hlLAorICogYnV0IGRvIGFsbCB3b3JrIGRpcmVjdGx5IG9uIHRoZSBpbm9kZS4KKyAqLworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdnhmc19pbW1lZF9zeW1saW5rX2lvcHMgPSB7CisJLnJlYWRsaW5rID0JCWdlbmVyaWNfcmVhZGxpbmssCisJLmZvbGxvd19saW5rID0JCXZ4ZnNfaW1tZWRfZm9sbG93X2xpbmssCit9OworCisvKgorICogQWRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgZm9yIGltbWVkIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KKyAqLworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB2eGZzX2ltbWVkX2FvcHMgPSB7CisJLnJlYWRwYWdlID0JCXZ4ZnNfaW1tZWRfcmVhZHBhZ2UsCit9OworCisvKioKKyAqIHZ4ZnNfaW1tZWRfZm9sbG93X2xpbmsgLSBmb2xsb3cgaW1tZWQgc3ltbGluaworICogQGRwOgkJZGVudHJ5IGZvciB0aGUgbGluaworICogQG5wOgkJcGF0aG5hbWUgbG9va3VwIGRhdGEgZm9yIHRoZSBjdXJyZW50IHBhdGggd2FsaworICoKKyAqIERlc2NyaXB0aW9uOgorICogICB2eGZzX2ltbWVkX2ZvbGxvd19saW5rIHJlc3RhcnRzIHRoZSBwYXRobmFtZSBsb29rdXAgd2l0aAorICogICB0aGUgZGF0YSBvYnRhaW5lZCBmcm9tIEBkcC4KKyAqCisgKiBSZXR1cm5zOgorICogICBaZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50Cit2eGZzX2ltbWVkX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRwLCBzdHJ1Y3QgbmFtZWlkYXRhICpucCkKK3sKKwlzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvCQkqdmlwID0gVlhGU19JTk8oZHAtPmRfaW5vZGUpOworCW5kX3NldF9saW5rKG5wLCB2aXAtPnZpaV9pbW1lZC52aV9pbW1lZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdnhmc19pbW1lZF9yZWFkcGFnZSAtIHJlYWQgcGFydCBvZiBhbiBpbW1lZCBpbm9kZSBpbnRvIHBhZ2VjYWNoZQorICogQGZpbGU6CWZpbGUgY29udGV4dCAodW51c2VkKQorICogQHBhZ2U6CXBhZ2UgZnJhbWUgdG8gZmlsbCBpbi4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgdnhmc19pbW1lZF9yZWFkcGFnZSByZWFkcyBhIHBhcnQgb2YgdGhlIGltbWVkIGFyZWEgb2YgdGhlCisgKiAgIGZpbGUgdGhhdCBob3N0cyBAcHAgaW50byB0aGUgcGFnZWNhY2hlLgorICoKKyAqIFJldHVybnM6CisgKiAgIFplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKgorICogTG9ja2luZyBzdGF0dXM6CisgKiAgIEBwYWdlIGlzIGxvY2tlZCBhbmQgd2lsbCBiZSB1bmxvY2tlZC4KKyAqLworc3RhdGljIGludAordnhmc19pbW1lZF9yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBwYWdlICpwcCkKK3sKKwlzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvCSp2aXAgPSBWWEZTX0lOTyhwcC0+bWFwcGluZy0+aG9zdCk7CisJdV9pbnQ2NF90CQlvZmZzZXQgPSBwcC0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKwljYWRkcl90CQkJa2FkZHI7CisKKwlrYWRkciA9IGttYXAocHApOworCW1lbWNweShrYWRkciwgdmlwLT52aWlfaW1tZWQudmlfaW1tZWQgKyBvZmZzZXQsIFBBR0VfQ0FDSEVfU0laRSk7CisJa3VubWFwKHBwKTsKKwkKKwlmbHVzaF9kY2FjaGVfcGFnZShwcCk7CisJU2V0UGFnZVVwdG9kYXRlKHBwKTsKKyAgICAgICAgdW5sb2NrX3BhZ2UocHApOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2lub2RlLmMgYi9mcy9mcmVldnhmcy92eGZzX2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3MmQyZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuYwpAQCAtMCwwICsxLDM1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGlub2RlIHJvdXRpbmVzLgorICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJ2eGZzLmgiCisjaW5jbHVkZSAidnhmc19pbm9kZS5oIgorI2luY2x1ZGUgInZ4ZnNfZXh0ZXJuLmgiCisKKworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdnhmc19hb3BzOworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdnhmc19pbW1lZF9hb3BzOworCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdnhmc19pbW1lZF9zeW1saW5rX2lvcHM7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZ4ZnNfZmlsZV9vcGVyYXRpb25zID0geworCS5vcGVuID0JCQlnZW5lcmljX2ZpbGVfb3BlbiwKKwkubGxzZWVrID0JCWdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQgPQkJCWdlbmVyaWNfZmlsZV9yZWFkLAorCS5tbWFwID0JCQlnZW5lcmljX2ZpbGVfbW1hcCwKKwkuc2VuZGZpbGUgPQkJZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorfTsKKworCitrbWVtX2NhY2hlX3QJCSp2eGZzX2lub2RlX2NhY2hlcDsKKworCisjaWZkZWYgRElBR05PU1RJQworLyoKKyAqIER1bXAgaW5vZGUgY29udGVudHMgKHBhcnRpYWxseSkuCisgKi8KK3ZvaWQKK3Z4ZnNfZHVtcGkoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwLCBpbm9fdCBpbm8pCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIlxuXG4iKTsKKwlpZiAoaW5vKQorCQlwcmludGsoS0VSTl9ERUJVRyAiZHVtcGluZyB2eGZzIGlub2RlICVsZFxuIiwgaW5vKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0RFQlVHICJkdW1waW5nIHVua25vd24gdnhmcyBpbm9kZVxuIik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAibW9kZSBpcyAleFxuIiwgdmlwLT52aWlfbW9kZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIm5saW5rOiV1LCB1aWQ6JXUsIGdpZDoldVxuIiwKKwkJCXZpcC0+dmlpX25saW5rLCB2aXAtPnZpaV91aWQsIHZpcC0+dmlpX2dpZCk7CisJcHJpbnRrKEtFUk5fREVCVUcgInNpemU6JUx4LCBibG9ja3M6JXVcbiIsCisJCQl2aXAtPnZpaV9zaXplLCB2aXAtPnZpaV9ibG9ja3MpOworCXByaW50ayhLRVJOX0RFQlVHICJvcmd0eXBlOiV1XG4iLCB2aXAtPnZpaV9vcmd0eXBlKTsKK30KKyNlbmRpZgorCisKKy8qKgorICogdnhmc19ibGtpZ2V0IC0gZmluZCBpbm9kZSBiYXNlZCBvbiBleHRlbnQgIworICogQHNicDoJc3VwZXJibG9jayBvZiB0aGUgZmlsZXN5c3RlbSB3ZSBzZWFyY2ggaW4KKyAqIEBleHRlbnQ6CW51bWJlciBvZiB0aGUgZXh0ZW50IHRvIHNlYXJjaAorICogQGlubzoJaW5vZGUgbnVtYmVyIHRvIHNlYXJjaAorICoKKyAqIERlc2NyaXB0aW9uOgorICogIHZ4ZnNfYmxraWdldCBzZWFyY2hlcyBpbm9kZSBAaW5vIGluIHRoZSBmaWxlc3lzdGVtIGRlc2NyaWJlZCBieQorICogIEBzYnAgaW4gdGhlIGV4dGVudCBAZXh0ZW50LgorICogIFJldHVybnMgdGhlIG1hdGNoaW5nIFZ4RlMgaW5vZGUgb24gc3VjY2VzcywgZWxzZSBhIE5VTEwgcG9pbnRlci4KKyAqCisgKiBOT1RFOgorICogIFdoaWxlIF9fdnhmc19pZ2V0IHVzZXMgdGhlIHBhZ2VjYWNoZSB2eGZzX2Jsa2lnZXQgdXNlcyB0aGUKKyAqICBidWZmZXJjYWNoZS4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSB1c2VkIG91dHNpZGUgdGhlCisgKiAgcmVhZF9zdXBlcigpIG1ldGhvZCwgb3RoZXJ3aXNlIHRoZSBkYXRhIG1heSBiZSBpbmNvaGVyZW50LgorICovCitzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICoKK3Z4ZnNfYmxraWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgdV9sb25nIGV4dGVudCwgaW5vX3QgaW5vKQoreworCXN0cnVjdCBidWZmZXJfaGVhZAkJKmJwOworCXVfbG9uZwkJCQlibG9jaywgb2Zmc2V0OworCisJYmxvY2sgPSBleHRlbnQgKyAoKGlubyAqIFZYRlNfSVNJWkUpIC8gc2JwLT5zX2Jsb2Nrc2l6ZSk7CisJb2Zmc2V0ID0gKChpbm8gJSAoc2JwLT5zX2Jsb2Nrc2l6ZSAvIFZYRlNfSVNJWkUpKSAqIFZYRlNfSVNJWkUpOworCWJwID0gc2JfYnJlYWQoc2JwLCBibG9jayk7CisKKwlpZiAoYnVmZmVyX21hcHBlZChicCkpIHsKKwkJc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbwkqdmlwOworCQlzdHJ1Y3Qgdnhmc19kaW5vZGUJKmRpcDsKKworCQlpZiAoISh2aXAgPSBrbWVtX2NhY2hlX2FsbG9jKHZ4ZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCkpKQorCQkJZ290byBmYWlsOworCQlkaXAgPSAoc3RydWN0IHZ4ZnNfZGlub2RlICopKGJwLT5iX2RhdGEgKyBvZmZzZXQpOworCQltZW1jcHkodmlwLCBkaXAsIHNpemVvZigqdmlwKSk7CisjaWZkZWYgRElBR05PU1RJQworCQl2eGZzX2R1bXBpKHZpcCwgaW5vKTsKKyNlbmRpZgorCQlicmVsc2UoYnApOworCQlyZXR1cm4gKHZpcCk7CisJfQorCitmYWlsOgorCXByaW50ayhLRVJOX1dBUk5JTkcgInZ4ZnM6IHVuYWJsZSB0byByZWFkIGJsb2NrICVsZFxuIiwgYmxvY2spOworCWJyZWxzZShicCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogX192eGZzX2lnZXQgLSBnZW5lcmljIGZpbmQgaW5vZGUgZmFjaWxpdHkKKyAqIEBzYnA6CQlWRlMgc3VwZXJibG9jaworICogQGlubzoJCWlub2RlIG51bWJlcgorICogQGlsaXN0cDoJCWlub2RlIGxpc3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICBTZWFyY2ggdGhlIGZvciBpbm9kZSBudW1iZXIgQGlubyBpbiB0aGUgZmlsZXN5c3RlbQorICogIGRlc2NyaWJlZCBieSBAc2JwLiAgVXNlIHRoZSBzcGVjaWZpZWQgaW5vZGUgdGFibGUgKEBpbGlzdHApLgorICogIFJldHVybnMgdGhlIG1hdGNoaW5nIFZ4RlMgaW5vZGUgb24gc3VjY2VzcywgZWxzZSBhIE5VTEwgcG9pbnRlci4KKyAqLworc3RhdGljIHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKgorX192eGZzX2lnZXQoaW5vX3QgaW5vLCBzdHJ1Y3QgaW5vZGUgKmlsaXN0cCkKK3sKKwlzdHJ1Y3QgcGFnZQkJCSpwcDsKKwl1X2xvbmcJCQkJb2Zmc2V0OworCisJb2Zmc2V0ID0gKGlubyAlIChQQUdFX1NJWkUgLyBWWEZTX0lTSVpFKSkgKiBWWEZTX0lTSVpFOworCXBwID0gdnhmc19nZXRfcGFnZShpbGlzdHAtPmlfbWFwcGluZywgaW5vICogVlhGU19JU0laRSAvIFBBR0VfU0laRSk7CisKKwlpZiAoIUlTX0VSUihwcCkpIHsKKwkJc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbwkqdmlwOworCQlzdHJ1Y3Qgdnhmc19kaW5vZGUJKmRpcDsKKwkJY2FkZHJfdAkJCWthZGRyID0gKGNoYXIgKilwYWdlX2FkZHJlc3MocHApOworCisJCWlmICghKHZpcCA9IGttZW1fY2FjaGVfYWxsb2Modnhmc19pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKSkpCisJCQlnb3RvIGZhaWw7CisJCWRpcCA9IChzdHJ1Y3Qgdnhmc19kaW5vZGUgKikoa2FkZHIgKyBvZmZzZXQpOworCQltZW1jcHkodmlwLCBkaXAsIHNpemVvZigqdmlwKSk7CisjaWZkZWYgRElBR05PU1RJQworCQl2eGZzX2R1bXBpKHZpcCwgaW5vKTsKKyNlbmRpZgorCQl2eGZzX3B1dF9wYWdlKHBwKTsKKwkJcmV0dXJuICh2aXApOworCX0KKworCXByaW50ayhLRVJOX1dBUk5JTkcgInZ4ZnM6IGVycm9yIG9uIHBhZ2UgJXBcbiIsIHBwKTsKKwlyZXR1cm4gTlVMTDsKKworZmFpbDoKKwlwcmludGsoS0VSTl9XQVJOSU5HICJ2eGZzOiB1bmFibGUgdG8gcmVhZCBpbm9kZSAlbGRcbiIsICh1bnNpZ25lZCBsb25nKWlubyk7CisJdnhmc19wdXRfcGFnZShwcCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogdnhmc19zdGlnZXQgLSBmaW5kIGlub2RlIHVzaW5nIHRoZSBzdHJ1Y3R1cmFsIGlub2RlIGxpc3QKKyAqIEBzYnA6CVZGUyBzdXBlcmJsb2NrCisgKiBAaW5vOglpbm9kZSAjCisgKgorICogRGVzY3JpcHRpb246CisgKiAgRmluZCBpbm9kZSBAaW5vIGluIHRoZSBmaWxlc3lzdGVtIGRlc2NyaWJlZCBieSBAc2JwIHVzaW5nCisgKiAgdGhlIHN0cnVjdHVyYWwgaW5vZGUgbGlzdC4KKyAqICBSZXR1cm5zIHRoZSBtYXRjaGluZyBWeEZTIGlub2RlIG9uIHN1Y2Nlc3MsIGVsc2UgYSBOVUxMIHBvaW50ZXIuCisgKi8KK3N0cnVjdCB2eGZzX2lub2RlX2luZm8gKgordnhmc19zdGlnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIGlub190IGlubykKK3sKKyAgICAgICAgcmV0dXJuIF9fdnhmc19pZ2V0KGlubywgVlhGU19TQkkoc2JwKS0+dnNpX3N0aWxpc3QpOworfQorCisvKioKKyAqIHZ4ZnNfdHJhbnNtb2QgLSBtb2RlIGZvciBhIFZ4RlMgaW5vZGUKKyAqIEB2aXA6CVZ4RlMgaW5vZGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICB2eGZzX3RyYW5zbW9kIHJldHVybnMgYSBMaW51eCBtb2RlX3QgZm9yIGEgZ2l2ZW4KKyAqICBWeEZTIGlub2RlIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIF9faW5saW5lX18gbW9kZV90Cit2eGZzX3RyYW5zbW9kKHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpcCkKK3sKKwltb2RlX3QJCQlyZXQgPSB2aXAtPnZpaV9tb2RlICYgflZYRlNfVFlQRV9NQVNLOworCisJaWYgKFZYRlNfSVNGSUZPKHZpcCkpCisJCXJldCB8PSBTX0lGSUZPOworCWlmIChWWEZTX0lTQ0hSKHZpcCkpCisJCXJldCB8PSBTX0lGQ0hSOworCWlmIChWWEZTX0lTRElSKHZpcCkpCisJCXJldCB8PSBTX0lGRElSOworCWlmIChWWEZTX0lTQkxLKHZpcCkpCisJCXJldCB8PSBTX0lGQkxLOworCWlmIChWWEZTX0lTTE5LKHZpcCkpCisJCXJldCB8PSBTX0lGTE5LOworCWlmIChWWEZTX0lTUkVHKHZpcCkpCisJCXJldCB8PSBTX0lGUkVHOworCWlmIChWWEZTX0lTU09DKHZpcCkpCisJCXJldCB8PSBTX0lGU09DSzsKKworCXJldHVybiAocmV0KTsKK30KKworLyoqCisgKiB2eGZzX2lpbml0LSBoZWxwZXIgdG8gZmlsbCBpbm9kZSBmaWVsZHMKKyAqIEBpcDoJCVZGUyBpbm9kZQorICogQHZpcDoJVnhGUyBpbm9kZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogIHZ4ZnNfaW5zdGlubyBpcyBhIGhlbHBlciBmdW5jdGlvbiB0byBmaWxsIGluIGFsbCByZWxldmFudAorICogIGZpZWxkcyBpbiBAaXAgZnJvbSBAdmlwLgorICovCitzdGF0aWMgdm9pZAordnhmc19paW5pdChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICp2aXApCit7CisKKwlpcC0+aV9tb2RlID0gdnhmc190cmFuc21vZCh2aXApOworCWlwLT5pX3VpZCA9ICh1aWRfdCl2aXAtPnZpaV91aWQ7CisJaXAtPmlfZ2lkID0gKGdpZF90KXZpcC0+dmlpX2dpZDsKKworCWlwLT5pX25saW5rID0gdmlwLT52aWlfbmxpbms7CisJaXAtPmlfc2l6ZSA9IHZpcC0+dmlpX3NpemU7CisKKwlpcC0+aV9hdGltZS50dl9zZWMgPSB2aXAtPnZpaV9hdGltZTsKKwlpcC0+aV9jdGltZS50dl9zZWMgPSB2aXAtPnZpaV9jdGltZTsKKwlpcC0+aV9tdGltZS50dl9zZWMgPSB2aXAtPnZpaV9tdGltZTsKKwlpcC0+aV9hdGltZS50dl9uc2VjID0gMDsKKwlpcC0+aV9jdGltZS50dl9uc2VjID0gMDsKKwlpcC0+aV9tdGltZS50dl9uc2VjID0gMDsKKworCWlwLT5pX2Jsa3NpemUgPSBQQUdFX1NJWkU7CisJaXAtPmlfYmxvY2tzID0gdmlwLT52aWlfYmxvY2tzOworCWlwLT5pX2dlbmVyYXRpb24gPSB2aXAtPnZpaV9nZW47CisKKwlpcC0+dS5nZW5lcmljX2lwID0gKHZvaWQgKil2aXA7CisJCit9CisKKy8qKgorICogdnhmc19nZXRfZmFrZV9pbm9kZSAtIGdldCBmYWtlIGlub2RlIHN0cnVjdHVyZQorICogQHNicDoJCWZpbGVzeXN0ZW0gc3VwZXJibG9jaworICogQHZpcDoJCWZzcHJpdiBpbm9kZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogIHZ4ZnNfZmFrZV9pbm9kZSBnZXRzIGEgZmFrZSBpbm9kZSAobm90IGluIHRoZSBpbm9kZSBoYXNoKSBmb3IgYQorICogIHN1cGVyYmxvY2ssIHZ4ZnNfaW5vZGUgcGFpci4KKyAqICBSZXR1cm5zIHRoZSBmaWxsZWQgVkZTIGlub2RlLgorICovCitzdHJ1Y3QgaW5vZGUgKgordnhmc19nZXRfZmFrZV9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwKQoreworCXN0cnVjdCBpbm9kZQkJCSppcCA9IE5VTEw7CisKKwlpZiAoKGlwID0gbmV3X2lub2RlKHNicCkpKSB7CisJCXZ4ZnNfaWluaXQoaXAsIHZpcCk7CisJCWlwLT5pX21hcHBpbmctPmFfb3BzID0gJnZ4ZnNfYW9wczsKKwl9CisJcmV0dXJuIChpcCk7Cit9CisKKy8qKgorICogdnhmc19wdXRfZmFrZV9pbm9kZSAtIGZyZWUgZmFrZWQgaW5vZGUKKyAqICppcDoJCQlWRlMgaW5vZGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICB2eGZzX3B1dF9mYWtlX2lub2RlIGZyZWVzIGFsbCBkYXRhIGFzc3NvY2lhdGVkIHdpdGggQGlwLgorICovCit2b2lkCit2eGZzX3B1dF9mYWtlX2lub2RlKHN0cnVjdCBpbm9kZSAqaXApCit7CisJaXB1dChpcCk7Cit9CisKKy8qKgorICogdnhmc19yZWFkX2lub2RlIC0gZmlsbCBpbiBpbm9kZSBpbmZvcm1hdGlvbgorICogQGlwOgkJaW5vZGUgcG9pbnRlciB0byBmaWxsCisgKgorICogRGVzY3JpcHRpb246CisgKiAgdnhmc19yZWFkX2lub2RlIHJlYWRzIHRoZSBkaXNrIGlub2RlIGZvciBAaXAgYW5kIGZpbGxzCisgKiAgaW4gYWxsIHJlbGV2YW50IGZpZWxkcyBpbiBAaXAuCisgKi8KK3ZvaWQKK3Z4ZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlwKQoreworCXN0cnVjdCBzdXBlcl9ibG9jawkJKnNicCA9IGlwLT5pX3NiOworCXN0cnVjdCB2eGZzX2lub2RlX2luZm8JCSp2aXA7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucwkqYW9wczsKKwlpbm9fdAkJCQlpbm8gPSBpcC0+aV9pbm87CisKKwlpZiAoISh2aXAgPSBfX3Z4ZnNfaWdldChpbm8sIFZYRlNfU0JJKHNicCktPnZzaV9pbGlzdCkpKQorCQlyZXR1cm47CisKKwl2eGZzX2lpbml0KGlwLCB2aXApOworCisJaWYgKFZYRlNfSVNJTU1FRCh2aXApKQorCQlhb3BzID0gJnZ4ZnNfaW1tZWRfYW9wczsKKwllbHNlCisJCWFvcHMgPSAmdnhmc19hb3BzOworCisJaWYgKFNfSVNSRUcoaXAtPmlfbW9kZSkpIHsKKwkJaXAtPmlfZm9wID0gJnZ4ZnNfZmlsZV9vcGVyYXRpb25zOworCQlpcC0+aV9tYXBwaW5nLT5hX29wcyA9IGFvcHM7CisJfSBlbHNlIGlmIChTX0lTRElSKGlwLT5pX21vZGUpKSB7CisJCWlwLT5pX29wID0gJnZ4ZnNfZGlyX2lub2RlX29wczsKKwkJaXAtPmlfZm9wID0gJnZ4ZnNfZGlyX29wZXJhdGlvbnM7CisJCWlwLT5pX21hcHBpbmctPmFfb3BzID0gYW9wczsKKwl9IGVsc2UgaWYgKFNfSVNMTksoaXAtPmlfbW9kZSkpIHsKKwkJaWYgKCFWWEZTX0lTSU1NRUQodmlwKSkgeworCQkJaXAtPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCQlpcC0+aV9tYXBwaW5nLT5hX29wcyA9ICZ2eGZzX2FvcHM7CisJCX0gZWxzZQorCQkJaXAtPmlfb3AgPSAmdnhmc19pbW1lZF9zeW1saW5rX2lvcHM7CisJfSBlbHNlCisJCWluaXRfc3BlY2lhbF9pbm9kZShpcCwgaXAtPmlfbW9kZSwgb2xkX2RlY29kZV9kZXYodmlwLT52aWlfcmRldikpOworCisJcmV0dXJuOworfQorCisvKioKKyAqIHZ4ZnNfY2xlYXJfaW5vZGUgLSByZW1vdmUgaW5vZGUgZnJvbSBtYWluIG1lbW9yeQorICogQGlwOgkJaW5vZGUgdG8gZGlzY2FyZC4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICB2eGZzX2NsZWFyX2lub2RlKCkgaXMgY2FsbGVkIG9uIHRoZSBmaW5hbCBpcHV0IGFuZCBmcmVlcyB0aGUgcHJpdmF0ZQorICogIGlub2RlIGFyZWEuCisgKi8KK3ZvaWQKK3Z4ZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppcCkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUodnhmc19pbm9kZV9jYWNoZXAsIGlwLT51LmdlbmVyaWNfaXApOworfQpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGFlYjEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mcmVldnhmcy92eGZzX2lub2RlLmgKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICovCisjaWZuZGVmIF9WWEZTX0lOT0RFX0hfCisjZGVmaW5lIF9WWEZTX0lOT0RFX0hfCisKKy8qCisgKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gaW5vZGUgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZGlzayBhbmQgY29yZQorICogaW5vZGVzIG9mIHRoZSBWZXJpdGFzIEZpbGVzeXN0ZW0uCisgKi8KKworCisjZGVmaW5lIFZYRlNfSVNJWkUJCTB4MTAwCQkvKiBJbm9kZSBzaXplICovCisKKyNkZWZpbmUgVlhGU19OREFERFIJCTEwCQkvKiBOdW1iZXIgb2YgZGlyZWN0IGFkZHJzIGluIGlub2RlICovCisjZGVmaW5lIFZYRlNfTklBRERSCQkyCQkvKiBOdW1iZXIgb2YgaW5kaXJlY3QgYWRkcnMgaW4gaW5vZGUgKi8KKyNkZWZpbmUgVlhGU19OSU1NRUQJCTk2CQkvKiBTaXplIG9mIGltbWVkaWF0ZSBkYXRhIGluIGlub2RlICovCisjZGVmaW5lIFZYRlNfTlRZUEVECQk2CQkvKiBOdW0gb2YgdHlwZWQgZXh0ZW50cyAqLworCisjZGVmaW5lIFZYRlNfVFlQRURfT0ZGU0VUTUFTSwkoMHgwMEZGRkZGRkZGRkZGRkZGVUxMKQorI2RlZmluZSBWWEZTX1RZUEVEX1RZUEVNQVNLCSgweEZGMDAwMDAwMDAwMDAwMDBVTEwpCisjZGVmaW5lIFZYRlNfVFlQRURfVFlQRVNISUZUCTU2CisKKyNkZWZpbmUgVlhGU19UWVBFRF9QRVJfQkxPQ0soc2JwKSBcCisJKChzYnApLT5zX2Jsb2Nrc2l6ZSAvIHNpemVvZihzdHJ1Y3Qgdnhmc190eXBlZCkpCisKKy8qCisgKiBQb3NzaWJsZSBleHRlbnQgZGVzY3JpcHRvciB0eXBlcyBmb3IgJVZYRlNfT1JHX1RZUEVEIGV4dGVudHMuCisgKi8KK2VudW0geworCVZYRlNfVFlQRURfSU5ESVJFQ1QJCT0gMSwKKwlWWEZTX1RZUEVEX0RBVEEJCQk9IDIsCisJVlhGU19UWVBFRF9JTkRJUkVDVF9ERVY0CT0gMywKKwlWWEZTX1RZUEVEX0RBVEFfREVWNAkJPSA0LAorfTsKKworLyoKKyAqIERhdGEgc3RvcmVkIGltbWVkaWF0ZWx5IGluIHRoZSBpbm9kZS4KKyAqLworc3RydWN0IHZ4ZnNfaW1tZWQgeworCXVfaW50OF90CXZpX2ltbWVkW1ZYRlNfTklNTUVEXTsKK307CisKK3N0cnVjdCB2eGZzX2V4dDQgeworCXVfaW50MzJfdAkJdmU0X3NwYXJlOwkJLyogPz8gKi8KKwl1X2ludDMyX3QJCXZlNF9pbmRzaXplOwkJLyogSW5kaXJlY3QgZXh0ZW50IHNpemUgKi8KKwl2eF9kYWRkcl90CQl2ZTRfaW5kaXJbVlhGU19OSUFERFJdOwkvKiBJbmRpcmVjdCBleHRlbnRzICovCisJc3RydWN0IGRpcmVjdCB7CQkJCQkvKiBEaXJlY3QgZXh0ZW50cyAqLworCQl2eF9kYWRkcl90CWV4dGVudDsJCQkvKiBFeHRlbnQgbnVtYmVyICovCisJCWludDMyX3QJCXNpemU7CQkJLyogU2l6ZSBvZiBleHRlbnQgKi8KKwl9IHZlNF9kaXJlY3RbVlhGU19OREFERFJdOworfTsKKworc3RydWN0IHZ4ZnNfdHlwZWQgeworCXVfaW50NjRfdAl2dF9oZHI7CQkvKiBIZWFkZXIsIDB4VFRPT09PT09PT09PT09PTzsgVD10eXBlLE89b2ZmcyAqLworCXZ4X2RhZGRyX3QJdnRfYmxvY2s7CS8qIEV4dGVudCBibG9jayAqLworCWludDMyX3QJCXZ0X3NpemU7CS8qIFNpemUgaW4gYmxvY2tzICovCit9OworCitzdHJ1Y3Qgdnhmc190eXBlZF9kZXY0IHsKKwl1X2ludDY0X3QJdmQ0X2hkcjsJLyogSGVhZGVyLCAweFRUT09PT09PT09PT09PT087IFQ9dHlwZSxPPW9mZnMgKi8KKwl1X2ludDY0X3QJdmQ0X2Jsb2NrOwkvKiBFeHRlbnQgYmxvY2sgKi8KKwl1X2ludDY0X3QJdmQ0X3NpemU7CS8qIFNpemUgaW4gYmxvY2tzICovCisJaW50MzJfdAkJdmQ0X2RldjsJLyogRGV2aWNlIElEICovCisJdV9pbnQzMl90CV9fcGFkMTsKK307CisKKy8qCisgKiBUaGUgaW5vZGUgYXMgY29udGFpbmVkIG9uIHRoZSBwaHlzaWNhbCBkZXZpY2UuCisgKi8KK3N0cnVjdCB2eGZzX2Rpbm9kZSB7CisJaW50MzJfdAkJdmRpX21vZGU7CisJdV9pbnQzMl90CXZkaV9ubGluazsJLyogTGluayBjb3VudCAqLworCXVfaW50MzJfdAl2ZGlfdWlkOwkvKiBVSUQgKi8KKwl1X2ludDMyX3QJdmRpX2dpZDsJLyogR0lEICovCisJdV9pbnQ2NF90CXZkaV9zaXplOwkvKiBJbm9kZSBzaXplIGluIGJ5dGVzICovCisJdV9pbnQzMl90CXZkaV9hdGltZTsJLyogTGFzdCB0aW1lIGFjY2Vzc2VkIC0gc2VjICovCisJdV9pbnQzMl90CXZkaV9hdXRpbWU7CS8qIExhc3QgdGltZSBhY2Nlc3NlZCAtIHVzZWMgKi8KKwl1X2ludDMyX3QJdmRpX210aW1lOwkvKiBMYXN0IG1vZGlmeSB0aW1lIC0gc2VjICovCisJdV9pbnQzMl90CXZkaV9tdXRpbWU7CS8qIExhc3QgbW9kaWZ5IHRpbWUgLSB1c2VjICovCisJdV9pbnQzMl90CXZkaV9jdGltZTsJLyogQ3JlYXRlIHRpbWUgLSBzZWMgKi8KKwl1X2ludDMyX3QJdmRpX2N1dGltZTsJLyogQ3JlYXRlIHRpbWUgLSB1c2VjICovCisJdV9pbnQ4X3QJdmRpX2FmbGFnczsJLyogQWxsb2NhdGlvbiBmbGFncyAqLworCXVfaW50OF90CXZkaV9vcmd0eXBlOwkvKiBPcmdhbmlzYXRpb24gdHlwZSAqLworCXVfaW50MTZfdAl2ZGlfZW9wZmxhZ3M7CisJdV9pbnQzMl90CXZkaV9lb3BkYXRhOworCXVuaW9uIHsKKwkJdV9pbnQzMl90CQlyZGV2OworCQl1X2ludDMyX3QJCWRvdGRvdDsKKwkJc3RydWN0IHsKKwkJCXVfaW50MzJfdAlyZXNlcnZlZDsKKwkJCXVfaW50MzJfdAlmaXhleHRzaXplOworCQl9IGlfcmVndWxhcjsKKwkJc3RydWN0IHsKKwkJCXVfaW50MzJfdAltYXRjaGlubzsKKwkJCXVfaW50MzJfdAlmc2V0aW5kZXg7CisJCX0gaV92eHNwZWM7CisJCXVfaW50NjRfdAkJYWxpZ247CisJfSB2ZGlfZnRhcmVhOworCXVfaW50MzJfdAl2ZGlfYmxvY2tzOwkvKiBIb3cgbXVjaCBibG9ja3MgZG9lcyBpbm9kZSBvY2N1cHkgKi8KKwl1X2ludDMyX3QJdmRpX2dlbjsJLyogSW5vZGUgZ2VuZXJhdGlvbiAqLworCXVfaW50NjRfdAl2ZGlfdmVyc2lvbjsJLyogVmVyc2lvbiAqLworCXVuaW9uIHsKKwkJc3RydWN0IHZ4ZnNfaW1tZWQJaW1tZWQ7CisJCXN0cnVjdCB2eGZzX2V4dDQJZXh0NDsKKwkJc3RydWN0IHZ4ZnNfdHlwZWQJdHlwZWRbVlhGU19OVFlQRURdOworCX0gdmRpX29yZzsKKwl1X2ludDMyX3QJdmRpX2lhdHRyaW5vOworfTsKKworI2RlZmluZSB2ZGlfcmRldgl2ZGlfZnRhcmVhLnJkZXYKKyNkZWZpbmUgdmRpX2RvdGRvdAl2ZGlfZnRhcmVhLmRvdGRvdAorI2RlZmluZSB2ZGlfZml4ZXh0c2l6ZQl2ZGlfZnRhcmVhLnJlZ3VsYXIuZml4ZXh0c2l6ZQorI2RlZmluZSB2ZGlfbWF0Y2hpbm8JdmRpX2Z0YXJlYS52eHNwZWMubWF0Y2hpbm8KKyNkZWZpbmUgdmRpX2ZzZXRpbmRleAl2ZGlfZnRhcmVhLnZ4c3BlYy5mc2V0aW5kZXgKKworI2RlZmluZSB2ZGlfaW1tZWQJdmRpX29yZy5pbW1lZAorI2RlZmluZSB2ZGlfZXh0NAl2ZGlfb3JnLmV4dDQKKyNkZWZpbmUgdmRpX3R5cGVkCXZkaV9vcmcudHlwZWQKKworCisvKgorICogVGhlIGlub2RlIGFzIHJlcHJlc2VudGVkIGluIHRoZSBtYWluIG1lbW9yeS4KKyAqCisgKiBUQkQ6IFRoaXMgc2hvdWxkIGJlY29tZSBhIHNlcGFyYXRlIHN0cnVjdHVyZS4uLgorICovCisjZGVmaW5lIHZ4ZnNfaW5vZGVfaW5mbwl2eGZzX2Rpbm9kZQorCisjZGVmaW5lIHZpaV9tb2RlCXZkaV9tb2RlCisjZGVmaW5lIHZpaV91aWQJCXZkaV91aWQKKyNkZWZpbmUgdmlpX2dpZAkJdmRpX2dpZAorI2RlZmluZSB2aWlfbmxpbmsJdmRpX25saW5rCisjZGVmaW5lIHZpaV9zaXplCXZkaV9zaXplCisjZGVmaW5lIHZpaV9hdGltZQl2ZGlfYXRpbWUKKyNkZWZpbmUgdmlpX2N0aW1lCXZkaV9jdGltZQorI2RlZmluZSB2aWlfbXRpbWUJdmRpX210aW1lCisjZGVmaW5lIHZpaV9ibG9ja3MJdmRpX2Jsb2NrcworI2RlZmluZSB2aWlfb3JnCQl2ZGlfb3JnCisjZGVmaW5lIHZpaV9vcmd0eXBlCXZkaV9vcmd0eXBlCisjZGVmaW5lIHZpaV9nZW4JCXZkaV9nZW4KKworI2RlZmluZSB2aWlfcmRldgl2ZGlfZnRhcmVhLnJkZXYKKyNkZWZpbmUgdmlpX2RvdGRvdAl2ZGlfZnRhcmVhLmRvdGRvdAorI2RlZmluZSB2aWlfZml4ZXh0c2l6ZQl2ZGlfZnRhcmVhLnJlZ3VsYXIuZml4ZXh0c2l6ZQorI2RlZmluZSB2aWlfbWF0Y2hpbm8JdmRpX2Z0YXJlYS52eHNwZWMubWF0Y2hpbm8KKyNkZWZpbmUgdmlpX2ZzZXRpbmRleAl2ZGlfZnRhcmVhLnZ4c3BlYy5mc2V0aW5kZXgKKworI2RlZmluZSB2aWlfaW1tZWQJdmRpX29yZy5pbW1lZAorI2RlZmluZSB2aWlfZXh0NAl2ZGlfb3JnLmV4dDQKKyNkZWZpbmUgdmlpX3R5cGVkCXZkaV9vcmcudHlwZWQKKworI2VuZGlmIC8qIF9WWEZTX0lOT0RFX0hfICovCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2tjb21wYXQuaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfa2NvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MmE0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mcmVldnhmcy92eGZzX2tjb21wYXQuaApAQCAtMCwwICsxLDQ5IEBACisjaWZuZGVmIF9WWEZTX0tDT01QQVRfSAorI2RlZmluZSBfVlhGU19LQ09NUEFUX0gKKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKwordHlwZWRlZiBsb25nIHNlY3Rvcl90OworCisvKiBGcm9tIGluY2x1ZGUvbGludXgvZnMuaCAoTGludXggMi41LjItcHJlMykgICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBidWZmZXJfaGVhZCAqIHNiX2JyZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBibG9jaykKK3sKKwlyZXR1cm4gYnJlYWQoc2ItPnNfZGV2LCBibG9jaywgc2ItPnNfYmxvY2tzaXplKTsKK30KKworLyogRGl0by4gICovCitzdGF0aWMgaW5saW5lIHZvaWQgbWFwX2JoKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBibG9jaykKK3sKKwliaC0+Yl9zdGF0ZSB8PSAxIDw8IEJIX01hcHBlZDsKKwliaC0+Yl9kZXYgPSBzYi0+c19kZXY7CisJYmgtPmJfYmxvY2tuciA9IGJsb2NrOworfQorCisvKiBGcm9tIGZzL2Jsb2NrX2Rldi5jIChMaW51eCAyLjUuMi1wcmUyKSAgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNiX3NldF9ibG9ja3NpemUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHNpemUpCit7CisJaW50IGJpdHM7CisJaWYgKHNldF9ibG9ja3NpemUoc2ItPnNfZGV2LCBzaXplKSA8IDApCisJCXJldHVybiAwOworCXNiLT5zX2Jsb2Nrc2l6ZSA9IHNpemU7CisJZm9yIChiaXRzID0gOSwgc2l6ZSA+Pj0gOTsgc2l6ZSA+Pj0gMTsgYml0cysrKQorCQk7CisJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBiaXRzOworCXJldHVybiBzYi0+c19ibG9ja3NpemU7Cit9CisKKy8qIERpdG8uICAqLworc3RhdGljIGlubGluZSBpbnQgc2JfbWluX2Jsb2Nrc2l6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgc2l6ZSkKK3sKKwlpbnQgbWluc2l6ZSA9IGdldF9oYXJkc2VjdF9zaXplKHNiLT5zX2Rldik7CisJaWYgKHNpemUgPCBtaW5zaXplKQorCQlzaXplID0gbWluc2l6ZTsKKwlyZXR1cm4gc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgc2l6ZSk7Cit9CisKKyNlbmRpZiAvKiBLZXJuZWwgMi40ICovCisjZW5kaWYgLyogX1ZYRlNfS0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2xvb2t1cC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDZhZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuYwpAQCAtMCwwICsxLDMyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGxvb2t1cCBhbmQgb3RoZXIgZGlyZWN0b3J5IHJlbGF0ZWQgY29kZS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSAidnhmcy5oIgorI2luY2x1ZGUgInZ4ZnNfZGlyLmgiCisjaW5jbHVkZSAidnhmc19pbm9kZS5oIgorI2luY2x1ZGUgInZ4ZnNfZXh0ZXJuLmgiCisKKy8qCisgKiBOdW1iZXIgb2YgVnhGUyBibG9ja3MgcGVyIHBhZ2UuCisgKi8KKyNkZWZpbmUgVlhGU19CTE9DS19QRVJfUEFHRShzYnApICAoKFBBR0VfQ0FDSEVfU0laRSAvIChzYnApLT5zX2Jsb2Nrc2l6ZSkpCisKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKgl2eGZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOworc3RhdGljIGludAkJdnhmc19yZWFkZGlyKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdnhmc19kaXJfaW5vZGVfb3BzID0geworCS5sb29rdXAgPQkJdnhmc19sb29rdXAsCit9OworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZ4ZnNfZGlyX29wZXJhdGlvbnMgPSB7CisJLnJlYWRkaXIgPQkJdnhmc19yZWFkZGlyLAorfTsKKworIAorc3RhdGljIF9faW5saW5lX18gdV9sb25nCitkaXJfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gKGlub2RlLT5pX3NpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworfQorIAorc3RhdGljIF9faW5saW5lX18gdV9sb25nCitkaXJfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaXApCit7CisJdV9sb25nCQkJYnNpemUgPSBpcC0+aV9zYi0+c19ibG9ja3NpemU7CisJcmV0dXJuIChpcC0+aV9zaXplICsgYnNpemUgLSAxKSAmIH4oYnNpemUgLSAxKTsKK30KKworLyoKKyAqIE5PVEUhIHVubGlrZSBzdHJuY21wLCB2eGZzX21hdGNoIHJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4KKyAqCisgKiBsZW4gPD0gVlhGU19OQU1FTEVOIGFuZCBkZSAhPSBOVUxMIGFyZSBndWFyYW50ZWVkIGJ5IGNhbGxlci4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50Cit2eGZzX21hdGNoKGludCBsZW4sIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lLCBzdHJ1Y3Qgdnhmc19kaXJlY3QgKmRlKQoreworCWlmIChsZW4gIT0gZGUtPmRfbmFtZWxlbikKKwkJcmV0dXJuIDA7CisJaWYgKCFkZS0+ZF9pbm8pCisJCXJldHVybiAwOworCXJldHVybiAhbWVtY21wKG5hbWUsIGRlLT5kX25hbWUsIGxlbik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCB2eGZzX2RpcmVjdCAqCit2eGZzX25leHRfZW50cnkoc3RydWN0IHZ4ZnNfZGlyZWN0ICpkZSkKK3sKKwlyZXR1cm4gKChzdHJ1Y3Qgdnhmc19kaXJlY3QgKikoKGNoYXIqKWRlICsgZGUtPmRfcmVjbGVuKSk7Cit9CisKKy8qKgorICogdnhmc19maW5kX2VudHJ5IC0gZmluZCBhIG1hdGhpbmcgZGlyZWN0b3J5IGVudHJ5IGZvciBhIGRlbnRyeQorICogQGlwOgkJZGlyZWN0b3J5IGlub2RlCisgKiBAZHA6CQlkZW50cnkgZm9yIHdoaWNoIHdlIHdhbnQgdG8gZmluZCBhIGRpcmVjdAorICogQHBwcDoJZ2V0cyBmaWxsZWQgd2l0aCB0aGUgcGFnZSB0aGUgcmV0dXJuIHZhbHVlIHNpdHMgaW4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgdnhmc19maW5kX2VudHJ5IGZpbmRzIGEgJnN0cnVjdCB2eGZzX2RpcmVjdCBmb3IgdGhlIFZGUyBkaXJlY3RvcnkKKyAqICAgY2FjaGUgZW50cnkgQGRwLiAgQHBwcCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBwYWdlIHRoZSByZXR1cm4KKyAqICAgdmFsdWUgcmVzaWRlcyBpbi4KKyAqCisgKiBSZXR1cm5zOgorICogICBUaGUgd2FudGVkIGRpcmVjdCBvbiBzdWNjZXNzLCBlbHNlIGEgTlVMTCBwb2ludGVyLgorICovCitzdGF0aWMgc3RydWN0IHZ4ZnNfZGlyZWN0ICoKK3Z4ZnNfZmluZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZGVudHJ5ICpkcCwgc3RydWN0IHBhZ2UgKipwcHApCit7CisJdV9sb25nCQkJCW5wYWdlcywgcGFnZSwgbmJsb2NrcywgcGJsb2NrcywgYmxvY2s7CisJdV9sb25nCQkJCWJzaXplID0gaXAtPmlfc2ItPnNfYmxvY2tzaXplOworCWNvbnN0IGNoYXIJCQkqbmFtZSA9IGRwLT5kX25hbWUubmFtZTsKKwlpbnQJCQkJbmFtZWxlbiA9IGRwLT5kX25hbWUubGVuOworCisJbnBhZ2VzID0gZGlyX3BhZ2VzKGlwKTsKKwluYmxvY2tzID0gZGlyX2Jsb2NrcyhpcCk7CisJcGJsb2NrcyA9IFZYRlNfQkxPQ0tfUEVSX1BBR0UoaXAtPmlfc2IpOworCQorCWZvciAocGFnZSA9IDA7IHBhZ2UgPCBucGFnZXM7IHBhZ2UrKykgeworCQljYWRkcl90CQkJa2FkZHI7CisJCXN0cnVjdCBwYWdlCQkqcHA7CisKKwkJcHAgPSB2eGZzX2dldF9wYWdlKGlwLT5pX21hcHBpbmcsIHBhZ2UpOworCQlpZiAoSVNfRVJSKHBwKSkKKwkJCWNvbnRpbnVlOworCQlrYWRkciA9IChjYWRkcl90KXBhZ2VfYWRkcmVzcyhwcCk7CisKKwkJZm9yIChibG9jayA9IDA7IGJsb2NrIDw9IG5ibG9ja3MgJiYgYmxvY2sgPD0gcGJsb2NrczsgYmxvY2srKykgeworCQkJY2FkZHJfdAkJCWJhZGRyLCBsaW1pdDsKKwkJCXN0cnVjdCB2eGZzX2RpcmJsawkqZGJwOworCQkJc3RydWN0IHZ4ZnNfZGlyZWN0CSpkZTsKKworCQkJYmFkZHIgPSBrYWRkciArIChibG9jayAqIGJzaXplKTsKKwkJCWxpbWl0ID0gYmFkZHIgKyBic2l6ZSAtIFZYRlNfRElSTEVOKDEpOworCQkJCisJCQlkYnAgPSAoc3RydWN0IHZ4ZnNfZGlyYmxrICopYmFkZHI7CisJCQlkZSA9IChzdHJ1Y3Qgdnhmc19kaXJlY3QgKikoYmFkZHIgKyBWWEZTX0RJUkJMS09WKGRicCkpOworCisJCQlmb3IgKDsgKGNhZGRyX3QpZGUgPD0gbGltaXQ7IGRlID0gdnhmc19uZXh0X2VudHJ5KGRlKSkgeworCQkJCWlmICghZGUtPmRfcmVjbGVuKQorCQkJCQlicmVhazsKKwkJCQlpZiAoIWRlLT5kX2lubykKKwkJCQkJY29udGludWU7CisJCQkJaWYgKHZ4ZnNfbWF0Y2gobmFtZWxlbiwgbmFtZSwgZGUpKSB7CisJCQkJCSpwcHAgPSBwcDsKKwkJCQkJcmV0dXJuIChkZSk7CisJCQkJfQorCQkJfQorCQl9CisJCXZ4ZnNfcHV0X3BhZ2UocHApOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIHZ4ZnNfaW5vZGVfYnlfbmFtZSAtIGZpbmQgaW5vZGUgbnVtYmVyIGZvciBkZW50cnkKKyAqIEBkaXA6CWRpcmVjdG9yeSB0byBzZWFyY2ggaW4KKyAqIEBkcDoJCWRlbnRyeSB3ZSBzZWFjaCBmb3IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgdnhmc19pbm9kZV9ieV9uYW1lIGZpbmRzIG91dCB0aGUgaW5vZGUgbnVtYmVyIG9mCisgKiAgIHRoZSBwYXRoIGNvbXBvbmVudCBkZXNjcmliZWQgYnkgQGRwIGluIEBkaXAuCisgKgorICogUmV0dXJuczoKKyAqICAgVGhlIHdhbnRlZCBpbm9kZSBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLgorICovCitzdGF0aWMgaW5vX3QKK3Z4ZnNfaW5vZGVfYnlfbmFtZShzdHJ1Y3QgaW5vZGUgKmRpcCwgc3RydWN0IGRlbnRyeSAqZHApCit7CisJc3RydWN0IHZ4ZnNfZGlyZWN0CQkqZGU7CisJc3RydWN0IHBhZ2UJCQkqcHA7CisJaW5vX3QJCQkJaW5vID0gMDsKKworCWRlID0gdnhmc19maW5kX2VudHJ5KGRpcCwgZHAsICZwcCk7CisJaWYgKGRlKSB7CisJCWlubyA9IGRlLT5kX2lubzsKKwkJa3VubWFwKHBwKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBwKTsKKwl9CisJCisJcmV0dXJuIChpbm8pOworfQorCisvKioKKyAqIHZ4ZnNfbG9va3VwIC0gbG9va3VwIHBhdGhuYW1lIGNvbXBvbmVudAorICogQGRpcDoJZGlyIGluIHdoaWNoIHdlIGxvb2t1cAorICogQGRwOgkJZGVudHJ5IHdlIGxvb2t1cAorICogQG5kOgkJbG9va3VwIG5hbWVpZGF0YQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICB2eGZzX2xvb2t1cCB0cmllcyB0byBsb29rdXAgdGhlIHBhdGhuYW1lIGNvbXBvbmVudCBkZXNjcmliZWQKKyAqICAgYnkgQGRwIGluIEBkaXAuCisgKgorICogUmV0dXJuczoKKyAqICAgQSBOVUxMLXBvaW50ZXIgb24gc3VjY2VzcywgZWxzZSBhbiBuZWdhdGl2ZSBlcnJvciBjb2RlIGVuY29kZWQKKyAqICAgaW4gdGhlIHJldHVybiBwb2ludGVyLgorICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqCit2eGZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpcCwgc3RydWN0IGRlbnRyeSAqZHAsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZQkJKmlwID0gTlVMTDsKKwlpbm9fdAkJCWlubzsKKwkJCSAKKwlpZiAoZHAtPmRfbmFtZS5sZW4gPiBWWEZTX05BTUVMRU4pCisJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCQkJCSAKKwlsb2NrX2tlcm5lbCgpOworCWlubyA9IHZ4ZnNfaW5vZGVfYnlfbmFtZShkaXAsIGRwKTsKKwlpZiAoaW5vKSB7CisJCWlwID0gaWdldChkaXAtPmlfc2IsIGlubyk7CisJCWlmICghaXApIHsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCQl9CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlkX2FkZChkcCwgaXApOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIHZ4ZnNfcmVhZGRpciAtIHJlYWQgYSBkaXJlY3RvcnkKKyAqIEBmcDoJCXRoZSBkaXJlY3RvcnkgdG8gcmVhZAorICogQHJldHA6CXJldHVybiBidWZmZXIKKyAqIEBmaWxsZXI6CWZpbGxkaXIgY2FsbGJhY2sKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgdnhmc19yZWFkZGlyIGZpbGxzIEByZXRwIHdpdGggZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBAZnAKKyAqICAgdXNpbmcgdGhlIFZGUyBzdXBwbGllZCBjYWxsYmFjayBAZmlsbGVyLgorICoKKyAqIFJldHVybnM6CisgKiAgIFplcm8uCisgKi8KK3N0YXRpYyBpbnQKK3Z4ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZnAsIHZvaWQgKnJldHAsIGZpbGxkaXJfdCBmaWxsZXIpCit7CisJc3RydWN0IGlub2RlCQkqaXAgPSBmcC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYnAgPSBpcC0+aV9zYjsKKwl1X2xvbmcJCQlic2l6ZSA9IHNicC0+c19ibG9ja3NpemU7CisJdV9sb25nCQkJcGFnZSwgbnBhZ2VzLCBibG9jaywgcGJsb2NrcywgbmJsb2Nrcywgb2Zmc2V0OworCWxvZmZfdAkJCXBvczsKKworCXN3aXRjaCAoKGxvbmcpZnAtPmZfcG9zKSB7CisJY2FzZSAwOgorCQlpZiAoZmlsbGVyKHJldHAsICIuIiwgMSwgZnAtPmZfcG9zLCBpcC0+aV9pbm8sIERUX0RJUikgPCAwKQorCQkJZ290byBvdXQ7CisJCWZwLT5mX3BvcysrOworCQkvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgMToKKwkJaWYgKGZpbGxlcihyZXRwLCAiLi4iLCAyLCBmcC0+Zl9wb3MsIFZYRlNfSU5PKGlwKS0+dmlpX2RvdGRvdCwgRFRfRElSKSA8IDApCisJCQlnb3RvIG91dDsKKwkJZnAtPmZfcG9zKys7CisJCS8qIGZhbGx0aHJvdWdoICovCisJfQorCisJcG9zID0gZnAtPmZfcG9zIC0gMjsKKwkKKwlpZiAocG9zID4gVlhGU19ESVJST1VORChpcC0+aV9zaXplKSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAwOworCX0KKworCW5wYWdlcyA9IGRpcl9wYWdlcyhpcCk7CisJbmJsb2NrcyA9IGRpcl9ibG9ja3MoaXApOworCXBibG9ja3MgPSBWWEZTX0JMT0NLX1BFUl9QQUdFKHNicCk7CisKKwlwYWdlID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJb2Zmc2V0ID0gcG9zICYgflBBR0VfQ0FDSEVfTUFTSzsKKwlibG9jayA9ICh1X2xvbmcpKHBvcyA+PiBzYnAtPnNfYmxvY2tzaXplX2JpdHMpICUgcGJsb2NrczsKKworCWZvciAoOyBwYWdlIDwgbnBhZ2VzOyBwYWdlKyssIGJsb2NrID0gMCkgeworCQljYWRkcl90CQkJa2FkZHI7CisJCXN0cnVjdCBwYWdlCQkqcHA7CisKKwkJcHAgPSB2eGZzX2dldF9wYWdlKGlwLT5pX21hcHBpbmcsIHBhZ2UpOworCQlpZiAoSVNfRVJSKHBwKSkKKwkJCWNvbnRpbnVlOworCQlrYWRkciA9IChjYWRkcl90KXBhZ2VfYWRkcmVzcyhwcCk7CisKKwkJZm9yICg7IGJsb2NrIDw9IG5ibG9ja3MgJiYgYmxvY2sgPD0gcGJsb2NrczsgYmxvY2srKykgeworCQkJY2FkZHJfdAkJCWJhZGRyLCBsaW1pdDsKKwkJCXN0cnVjdCB2eGZzX2RpcmJsawkqZGJwOworCQkJc3RydWN0IHZ4ZnNfZGlyZWN0CSpkZTsKKworCQkJYmFkZHIgPSBrYWRkciArIChibG9jayAqIGJzaXplKTsKKwkJCWxpbWl0ID0gYmFkZHIgKyBic2l6ZSAtIFZYRlNfRElSTEVOKDEpOworCQorCQkJZGJwID0gKHN0cnVjdCB2eGZzX2RpcmJsayAqKWJhZGRyOworCQkJZGUgPSAoc3RydWN0IHZ4ZnNfZGlyZWN0ICopCisJCQkJKG9mZnNldCA/CisJCQkJIChrYWRkciArIG9mZnNldCkgOgorCQkJCSAoYmFkZHIgKyBWWEZTX0RJUkJMS09WKGRicCkpKTsKKworCQkJZm9yICg7IChjYWRkcl90KWRlIDw9IGxpbWl0OyBkZSA9IHZ4ZnNfbmV4dF9lbnRyeShkZSkpIHsKKwkJCQlpbnQJb3ZlcjsKKworCQkJCWlmICghZGUtPmRfcmVjbGVuKQorCQkJCQlicmVhazsKKwkJCQlpZiAoIWRlLT5kX2lubykKKwkJCQkJY29udGludWU7CisKKwkJCQlvZmZzZXQgPSAoY2FkZHJfdClkZSAtIGthZGRyOworCQkJCW92ZXIgPSBmaWxsZXIocmV0cCwgZGUtPmRfbmFtZSwgZGUtPmRfbmFtZWxlbiwKKwkJCQkJKChwYWdlIDw8IFBBR0VfQ0FDSEVfU0hJRlQpIHwgb2Zmc2V0KSArIDIsCisJCQkJCWRlLT5kX2lubywgRFRfVU5LTk9XTik7CisJCQkJaWYgKG92ZXIpIHsKKwkJCQkJdnhmc19wdXRfcGFnZShwcCk7CisJCQkJCWdvdG8gZG9uZTsKKwkJCQl9CisJCQl9CisJCQlvZmZzZXQgPSAwOworCQl9CisJCXZ4ZnNfcHV0X3BhZ2UocHApOworCQlvZmZzZXQgPSAwOworCX0KKworZG9uZToKKwlmcC0+Zl9wb3MgPSAoKHBhZ2UgPDwgUEFHRV9DQUNIRV9TSElGVCkgfCBvZmZzZXQpICsgMjsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX29sdC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTIwNGUzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuYwpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKiAKKyAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBvYmplY3QgbG9jYXRpb24gdGFibGUgc3VwcG9ydC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgInZ4ZnMuaCIKKyNpbmNsdWRlICJ2eGZzX29sdC5oIgorCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQKK3Z4ZnNfZ2V0X2ZzaGVhZChzdHJ1Y3Qgdnhmc19vbHRmc2hlYWQgKmZzaHAsIHN0cnVjdCB2eGZzX3NiX2luZm8gKmluZnApCit7CisJaWYgKGluZnAtPnZzaV9mc2hpbm8pCisJCUJVRygpOworCWluZnAtPnZzaV9mc2hpbm8gPSBmc2hwLT5vbHRfZnNpbm9bMF07Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQKK3Z4ZnNfZ2V0X2lsaXN0KHN0cnVjdCB2eGZzX29sdGlsaXN0ICppbGlzdHAsIHN0cnVjdCB2eGZzX3NiX2luZm8gKmluZnApCit7CisJaWYgKGluZnAtPnZzaV9pZXh0KQorCQlCVUcoKTsKKwlpbmZwLT52c2lfaWV4dCA9IGlsaXN0cC0+b2x0X2lleHRbMF07IAorfQorCitzdGF0aWMgX19pbmxpbmVfXyB1X2xvbmcKK3Z4ZnNfb2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCBkYWRkcl90IGJsb2NrLCB1X2xvbmcgYnNpemUpCit7CisJaWYgKHNicC0+c19ibG9ja3NpemUgJSBic2l6ZSkKKwkJQlVHKCk7CisJcmV0dXJuIChibG9jayAqIChzYnAtPnNfYmxvY2tzaXplIC8gYnNpemUpKTsKK30KKworCisvKioKKyAqIHZ4ZnNfcmVhZF9vbHQgLSByZWFkIG9sdAorICogQHNicDoJc3VwZXJibG9jayBvZiB0aGUgZmlsZXN5c3RlbQorICogQGJzaXplOglibG9ja3NpemUgb2YgdGhlIGZpbGVzeXN0ZW0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgdnhmc19yZWFkX29sdCByZWFkcyB0aGUgb2x0IG9mIHRoZSBmaWxlc3lzdGVtIGRlc2NyaWJlZCBieSBAc2JwCisgKiAgIGludG8gbWFpbiBtZW1vcnkgYW5kIGRvZXMgc29tZSBiYXNpYyBzZXR1cC4KKyAqCisgKiBSZXR1cm5zOgorICogICBaZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitpbnQKK3Z4ZnNfcmVhZF9vbHQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIHVfbG9uZyBic2l6ZSkKK3sKKwlzdHJ1Y3Qgdnhmc19zYl9pbmZvCSppbmZwID0gVlhGU19TQkkoc2JwKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJwOworCXN0cnVjdCB2eGZzX29sdAkJKm9wOworCWNoYXIJCQkqb2FkZHIsICplYWRkcjsKKworCisJYnAgPSBzYl9icmVhZChzYnAsIHZ4ZnNfb2Jsb2NrKHNicCwgaW5mcC0+dnNpX29sdGV4dCwgYnNpemUpKTsKKwlpZiAoIWJwIHx8ICFicC0+Yl9kYXRhKQorCQlnb3RvIGZhaWw7CisKKwlvcCA9IChzdHJ1Y3Qgdnhmc19vbHQgKilicC0+Yl9kYXRhOworCWlmIChvcC0+b2x0X21hZ2ljICE9IFZYRlNfT0xUX01BR0lDKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAidnhmczogaXZhbGlkIG9sdCBtYWdpYyBudW1iZXJcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJLyoKKwkgKiBJdCBpcyBpbiB0aGVvcnkgcG9zc2libGUgdGhhdCB2c2lfb2x0c2l6ZSBpcyA+IDEuCisJICogSSd2ZSBub3Qgc2VlbiBhbnkgc3VjaCBmaWxlc3lzdGVtIHlldCBhbmQgSSdtIGxhenkuLiAgLS1oY2gKKwkgKi8KKwlpZiAoaW5mcC0+dnNpX29sdHNpemUgPiAxKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAidnhmczogb2x0c2l6ZSA+IDEgZGV0ZWN0ZWQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJ2eGZzOiBwbGVhc2Ugbm90aWZ5IGhjaEBpbmZyYWRlYWQub3JnXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCW9hZGRyID0gKGNoYXIgKilicC0+Yl9kYXRhICsgb3AtPm9sdF9zaXplOworCWVhZGRyID0gKGNoYXIgKilicC0+Yl9kYXRhICsgKGluZnAtPnZzaV9vbHRzaXplICogc2JwLT5zX2Jsb2Nrc2l6ZSk7CisKKwl3aGlsZSAob2FkZHIgPCBlYWRkcikgeworCQlzdHJ1Y3Qgdnhmc19vbHRjb21tb24JKm9jcCA9CisJCQkoc3RydWN0IHZ4ZnNfb2x0Y29tbW9uICopb2FkZHI7CisJCQorCQlzd2l0Y2ggKG9jcC0+b2x0X3R5cGUpIHsKKwkJY2FzZSBWWEZTX09MVF9GU0hFQUQ6CisJCQl2eGZzX2dldF9mc2hlYWQoKHN0cnVjdCB2eGZzX29sdGZzaGVhZCAqKW9hZGRyLCBpbmZwKTsKKwkJCWJyZWFrOworCQljYXNlIFZYRlNfT0xUX0lMSVNUOgorCQkJdnhmc19nZXRfaWxpc3QoKHN0cnVjdCB2eGZzX29sdGlsaXN0ICopb2FkZHIsIGluZnApOworCQkJYnJlYWs7CisJCX0KKworCQlvYWRkciArPSBvY3AtPm9sdF9zaXplOworCX0KKworCWJyZWxzZShicCk7CisJcmV0dXJuIDA7CisKK2ZhaWw6CisJYnJlbHNlKGJwKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmggYi9mcy9mcmVldnhmcy92eGZzX29sdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MzI0MjkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mcmVldnhmcy92eGZzX29sdC5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqLworI2lmbmRlZiBfVlhGU19PTFRfSF8KKyNkZWZpbmUgX1ZYRlNfT0xUX0hfCisKKy8qCisgKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gT2JqZWN0IExvY2F0aW9uIFRhYmxlIGRhdGEgc3RydWN0dXJlcy4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHRoZSBPYmplY3QgTG9jYXRpb24gVGFibGUgdXNlZAorICogYnkgdGhlIFZlcml0YXMgRmlsZXN5c3RlbSB2ZXJzaW9uIDIgYW5kIG5ld2VyLgorICovCisKKworLyoKKyAqIE9MVCBtYWdpYyBudW1iZXIgKHZ4ZnNfb2x0LT5vbHRfbWFnaWMpLgorICovCisjZGVmaW5lIFZYRlNfT0xUX01BR0lDCQkweGE1MDRGQ0Y1CisKKy8qCisgKiBWeEZTIE9MVCBlbnRyeSB0eXBlcy4KKyAqLworZW51bSB7CisJVlhGU19PTFRfRlJFRQk9IDEsCisJVlhGU19PTFRfRlNIRUFECT0gMiwKKwlWWEZTX09MVF9DVVQJPSAzLAorCVZYRlNfT0xUX0lMSVNUCT0gNCwKKwlWWEZTX09MVF9ERVYJPSA1LAorCVZYRlNfT0xUX1NCCT0gNgorfTsKKworLyoKKyAqIFZ4RlMgT0xUIGhlYWRlci4KKyAqCisgKiBUaGUgT2JqZWN0IExvY2F0aW9uIFRhYmxlIGhlYWRlciBpcyBwbGFjZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoCisgKiBPTFQgZXh0ZW50LiAgSXQgaXMgdXNlZCB0byBmaW5nIGNlcnRhaW4gZmlsZXN5c3RlbS13aWRlIG1ldGFkYXRhLCBlLmcuCisgKiB0aGUgaW5pdGFsIGlub2RlIGxpc3QsIHRoZSBmaWxlc2V0IGhlYWRlciBvciB0aGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24uCisgKi8KK3N0cnVjdCB2eGZzX29sdCB7CisJdV9pbnQzMl90CW9sdF9tYWdpYzsJLyogbWFnaWMgbnVtYmVyCQkJKi8KKwl1X2ludDMyX3QJb2x0X3NpemU7CS8qIHNpemUgb2YgdGhpcyBlbnRyeQkJKi8KKwl1X2ludDMyX3QJb2x0X2NoZWNrc3VtOwkvKiBjaGVja3N1bSBvZiBleHRlbnQJCSovCisJdV9pbnQzMl90CV9fdW51c2VkMTsJLyogPz8/CQkJCSovCisJdV9pbnQzMl90CW9sdF9tdGltZTsJLyogdGltZSBvZiBsYXN0IG1vZC4gKHNlYykJKi8KKwl1X2ludDMyX3QJb2x0X211dGltZTsJLyogdGltZSBvZiBsYXN0IG1vZC4gKHVzZWMpCSovCisJdV9pbnQzMl90CW9sdF90b3RmcmVlOwkvKiBmcmVlIHNwYWNlIGluIE9MVCBleHRlbnQJKi8KKwl2eF9kYWRkcl90CW9sdF9leHRlbnRzWzJdOwkvKiBhZGRyIG9mIHRoaXMgZXh0ZW50LCByZXBsaWNhCSovCisJdV9pbnQzMl90CW9sdF9lc2l6ZTsJLyogc2l6ZSBvZiB0aGlzIGV4dGVudAkJKi8KKwl2eF9kYWRkcl90CW9sdF9uZXh0WzJdOyAgICAvKiBhZGRyIG9mIG5leHQgZXh0ZW50LCByZXBsaWNhCSovCisJdV9pbnQzMl90CW9sdF9uc2l6ZTsJLyogc2l6ZSBvZiBuZXh0IGV4dGVudAkJKi8KKwl1X2ludDMyX3QJX191bnVzZWQyOwkvKiBhbGlnbiB0byA4IGJ5dGUgYm91bmRhcnkJKi8KK307CisKKy8qCisgKiBWeEZTIGNvbW1vbiBPTFQgZW50cnkgKG9uIGRpc2spLgorICovCitzdHJ1Y3Qgdnhmc19vbHRjb21tb24geworCXVfaW50MzJfdAlvbHRfdHlwZTsJLyogdHlwZSBvZiB0aGlzIHJlY29yZAkJKi8KKwl1X2ludDMyX3QJb2x0X3NpemU7CS8qIHNpemUgb2YgdGhpcyByZWNvcmQJCSovCit9OworCisvKgorICogVnhGUyBmcmVlIE9MVCBlbnRyeSAob24gZGlzaykuCisgKi8KK3N0cnVjdCB2eGZzX29sdGZyZWUgeworCXVfaW50MzJfdAlvbHRfdHlwZTsJLyogdHlwZSBvZiB0aGlzIHJlY29yZAkJKi8KKwl1X2ludDMyX3QJb2x0X2ZzaXplOwkvKiBzaXplIG9mIHRoaXMgZnJlZSByZWNvcmQJKi8KK307CisKKy8qCisgKiBWeEZTIGluaXRpYWwtaW5vZGUgbGlzdCAob24gZGlzaykuCisgKi8KK3N0cnVjdCB2eGZzX29sdGlsaXN0IHsKKwl1X2ludDMyX3QJb2x0X3R5cGU7CS8qIHR5cGUgb2YgdGhpcyByZWNvcmQJCSovCisJdV9pbnQzMl90CW9sdF9zaXplOwkvKiBzaXplIG9mIHRoaXMgcmVjb3JkCQkqLworCXZ4X2lub190CW9sdF9pZXh0WzJdOwkvKiBpbml0aWFsIGlub2RlIGxpc3QsIHJlcGxpY2EJKi8KK307CisKKy8qCisgKiBDdXJyZW50IFVzYWdlIFRhYmxlIAorICovCitzdHJ1Y3Qgdnhmc19vbHRjdXQgeworCXVfaW50MzJfdAlvbHRfdHlwZTsJLyogdHlwZSBvZiB0aGlzIHJlY29yZAkJKi8KKwl1X2ludDMyX3QJb2x0X3NpemU7CS8qIHNpemUgb2YgdGhpcyByZWNvcmQJCSovCisJdnhfaW5vX3QJb2x0X2N1dGlubzsJLyogaW5vZGUgb2YgY3VycmVudCB1c2FnZSB0YWJsZQkqLworCXVfaW50MzJfdAlfX3BhZDsJCS8qIHVudXNlZCwgOCBieXRlIGFsaWduCQkqLworfTsKKworLyoKKyAqIElub2RlcyBjb250YWluaW5nIFN1cGVyYmxvY2ssIEludGVudCBsb2cgYW5kIE9MVHMgCisgKi8KK3N0cnVjdCB2eGZzX29sdHNiIHsKKwl1X2ludDMyX3QJb2x0X3R5cGU7CS8qIHR5cGUgb2YgdGhpcyByZWNvcmQJCSovCisJdV9pbnQzMl90CW9sdF9zaXplOwkvKiBzaXplIG9mIHRoaXMgcmVjb3JkCQkqLworCXZ4X2lub190CW9sdF9zYmlubzsJLyogaW5vZGUgb2Ygc3VwZXJibG9jayBmaWxlCSovCisJdV9pbnQzMl90CV9fdW51c2VkMTsJLyogPz8/CQkJCSovCisJdnhfaW5vX3QJb2x0X2xvZ2lub1syXTsJLyogaW5vZGUgb2YgbG9nIGZpbGUscmVwbGljYQkqLworCXZ4X2lub190CW9sdF9vbHRpbm9bMl07CS8qIGlub2RlIG9mIE9MVCwgcmVwbGljYQkqLworfTsKKworLyoKKyAqIElub2RlIGNvbnRhaW5pbmcgZGV2aWNlIGNvbmZpZ3VyYXRpb24gKyBpdCdzIHJlcGxpY2EgCisgKi8KK3N0cnVjdCB2eGZzX29sdGRldiB7CisJdV9pbnQzMl90CW9sdF90eXBlOwkvKiB0eXBlIG9mIHRoaXMgcmVjb3JkCQkqLworCXVfaW50MzJfdAlvbHRfc2l6ZTsJLyogc2l6ZSBvZiB0aGlzIHJlY29yZAkJKi8KKwl2eF9pbm9fdAlvbHRfZGV2aW5vWzJdOwkvKiBpbm9kZSBvZiBkZXZpY2UgY29uZmlnIGZpbGVzCSovCit9OworCisvKgorICogRmlsZXNldCBoZWFkZXIgCisgKi8KK3N0cnVjdCB2eGZzX29sdGZzaGVhZCB7CisJdV9pbnQzMl90CW9sdF90eXBlOwkvKiB0eXBlIG51bWJlcgkJCSovCisJdV9pbnQzMl90CW9sdF9zaXplOwkvKiBzaXplIG9mIHRoaXMgcmVjb3JkCQkqLworCXZ4X2lub190CW9sdF9mc2lub1syXTsgICAvKiBpbm9kZXMgb2YgZmlsZXNldCBoZWFkZXIJKi8KK307CisKKyNlbmRpZiAvKiBfVlhGU19PTFRfSF8gKi8KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3Vici5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19zdWJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUzMDU2MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3Vici5jCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gc2hhcmVkIHN1YnJvdXRpbmVzLgorICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisKKyNpbmNsdWRlICJ2eGZzX2tjb21wYXQuaCIKKyNpbmNsdWRlICJ2eGZzX2V4dGVybi5oIgorCisKK3N0YXRpYyBpbnQJCXZ4ZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKiwgc3RydWN0IHBhZ2UgKik7CitzdGF0aWMgc2VjdG9yX3QJCXZ4ZnNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBzZWN0b3JfdCk7CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdnhmc19hb3BzID0geworCS5yZWFkcGFnZSA9CQl2eGZzX3JlYWRwYWdlLAorCS5ibWFwID0JCQl2eGZzX2JtYXAsCisJLnN5bmNfcGFnZSA9CQlibG9ja19zeW5jX3BhZ2UsCit9OworCitpbmxpbmUgdm9pZAordnhmc19wdXRfcGFnZShzdHJ1Y3QgcGFnZSAqcHApCit7CisJa3VubWFwKHBwKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocHApOworfQorCisvKioKKyAqIHZ4ZnNfZ2V0X3BhZ2UgLSByZWFkIGEgcGFnZSBpbnRvIG1lbW9yeS4KKyAqIEBpcDoJCWlub2RlIHRvIHJlYWQgZnJvbQorICogQG46CQlwYWdlIG51bWJlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICB2eGZzX2dldF9wYWdlIHJlYWRzIHRoZSBAbiB0aCBwYWdlIG9mIEBpcCBpbnRvIHRoZSBwYWdlY2FjaGUuCisgKgorICogUmV0dXJuczoKKyAqICAgVGhlIHdhbnRlZCBwYWdlIG9uIHN1Y2Nlc3MsIGVsc2UgYSBOVUxMIHBvaW50ZXIuCisgKi8KK3N0cnVjdCBwYWdlICoKK3Z4ZnNfZ2V0X3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHVfbG9uZyBuKQoreworCXN0cnVjdCBwYWdlICoJCQlwcDsKKworCXBwID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIG4sCisJCQkoZmlsbGVyX3QqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisKKwlpZiAoIUlTX0VSUihwcCkpIHsKKwkJd2FpdF9vbl9wYWdlX2xvY2tlZChwcCk7CisJCWttYXAocHApOworCQlpZiAoIVBhZ2VVcHRvZGF0ZShwcCkpCisJCQlnb3RvIGZhaWw7CisJCS8qKiBpZiAoIVBhZ2VDaGVja2VkKHBwKSkgKiovCisJCQkvKiogdnhmc19jaGVja19wYWdlKHBwKTsgKiovCisJCWlmIChQYWdlRXJyb3IocHApKQorCQkJZ290byBmYWlsOworCX0KKwkKKwlyZXR1cm4gKHBwKTsKKwkJIAorZmFpbDoKKwl2eGZzX3B1dF9wYWdlKHBwKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlPKTsKK30KKworLyoqCisgKiB2eGZzX2JyZWFkIC0gcmVhZCBidWZmZXIgZm9yIGEgZ2l2ZSBpbm9kZSxibG9jayB0dXBsZQorICogQGlwOgkJaW5vZGUKKyAqIEBibG9jazoJbG9naWNhbCBibG9jaworICoKKyAqIERlc2NyaXB0aW9uOgorICogICBUaGUgdnhmc19icmVhZCBmdW5jdGlvbiByZWFkcyBibG9jayBubyBAYmxvY2sgIG9mCisgKiAgIEBpcCBpbnRvIHRoZSBidWZmZXJjYWNoZS4KKyAqCisgKiBSZXR1cm5zOgorICogICBUaGUgcmVzdWx0aW5nICZzdHJ1Y3QgYnVmZmVyX2hlYWQuCisgKi8KK3N0cnVjdCBidWZmZXJfaGVhZCAqCit2eGZzX2JyZWFkKHN0cnVjdCBpbm9kZSAqaXAsIGludCBibG9jaykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJwOworCWRhZGRyX3QJCQlwYmxvY2s7CisKKwlwYmxvY2sgPSB2eGZzX2JtYXAxKGlwLCBibG9jayk7CisJYnAgPSBzYl9icmVhZChpcC0+aV9zYiwgcGJsb2NrKTsKKworCXJldHVybiAoYnApOworfQorCisvKioKKyAqIHZ4ZnNfZ2V0X2Jsb2NrIC0gbG9jYXRlIGJ1ZmZlciBmb3IgZ2l2ZW4gaW5vZGUsYmxvY2sgdHVwbGUgCisgKiBAaXA6CQlpbm9kZQorICogQGlibG9jazoJbG9naWNhbCBibG9jaworICogQGJwOgkJYnVmZmVyIHNrZWxldG9uCisgKiBAY3JlYXRlOgklVFJVRSBpZiBibG9ja3MgbWF5IGJlIG5ld2x5IGFsbG9jYXRlZC4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVGhlIHZ4ZnNfZ2V0X2Jsb2NrIGZ1bmN0aW9uIGZpbGxzIEBicCB3aXRoIHRoZSByaWdodCBwaHlzaWNhbAorICogICBibG9jayBhbmQgZGV2aWNlIG51bWJlciB0byBwZXJmb3JtIGEgbG93bGV2ZWwgcmVhZC93cml0ZSBvbgorICogICBpdC4KKyAqCisgKiBSZXR1cm5zOgorICogICBaZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2IGVycm9yIGNvZGUgKC1FSU8pLgorICovCitzdGF0aWMgaW50Cit2eGZzX2dldGJsayhzdHJ1Y3QgaW5vZGUgKmlwLCBzZWN0b3JfdCBpYmxvY2ssCisJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYnAsIGludCBjcmVhdGUpCit7CisJZGFkZHJfdAkJCXBibG9jazsKKworCXBibG9jayA9IHZ4ZnNfYm1hcDEoaXAsIGlibG9jayk7CisJaWYgKHBibG9jayAhPSAwKSB7CisJCW1hcF9iaChicCwgaXAtPmlfc2IsIHBibG9jayk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlPOworfQorCisvKioKKyAqIHZ4ZnNfcmVhZHBhZ2UgLSByZWFkIG9uZSBwYWdlIHN5bmNocm9ub3VzbHkgaW50byB0aGUgcGFnZWNhY2hlCisgKiBAZmlsZToJZmlsZSBjb250ZXh0ICh1bnVzZWQpCisgKiBAcGFnZToJcGFnZSBmcmFtZSB0byBmaWxsIGluLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBUaGUgdnhmc19yZWFkcGFnZSByb3V0aW5lIHJlYWRzIEBwYWdlIHN5bmNocm9ub3VzbHkgaW50byB0aGUKKyAqICAgcGFnZWNhY2hlLgorICoKKyAqIFJldHVybnM6CisgKiAgIFplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKgorICogTG9ja2luZyBzdGF0dXM6CisgKiAgIEBwYWdlIGlzIGxvY2tlZCBhbmQgd2lsbCBiZSB1bmxvY2tlZC4KKyAqLworc3RhdGljIGludAordnhmc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlKHBhZ2UsIHZ4ZnNfZ2V0YmxrKTsKK30KKyAKKy8qKgorICogdnhmc19ibWFwIC0gcGVyZm9ybSBsb2dpY2FsIHRvIHBoeXNpY2FsIGJsb2NrIG1hcHBpbmcKKyAqIEBtYXBwaW5nOglsb2dpY2FsIHRvIHBoeXNpY2FsIG1hcHBpbmcgdG8gdXNlCisgKiBAYmxvY2s6CWxvZ2ljYWwgYmxvY2sgKHJlbGF0aXZlIHRvIEBtYXBwaW5nKS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVnhmc19ibWFwIGZpbmQgb3V0IHRoZSBjb3JyZXNwb25kaW5nIHBoc2ljYWwgYmxvY2sgdG8gdGhlCisgKiAgIEBtYXBwaW5nLCBAYmxvY2sgcGFpci4KKyAqCisgKiBSZXR1cm5zOgorICogICBQaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLgorICoKKyAqIExvY2tpbmcgc3RhdHVzOgorICogICBXZSBhcmUgdW5kZXIgdGhlIGJrbC4KKyAqLworc3RhdGljIHNlY3Rvcl90Cit2eGZzX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGJsb2NrKQoreworCXJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAobWFwcGluZywgYmxvY2ssIHZ4ZnNfZ2V0YmxrKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWUyYzdiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19zdXBlci5jCkBAIC0wLDAgKzEsMjc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gc3VwZXJibG9jayByZWxhdGVkIHJvdXRpbmVzLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisKKyNpbmNsdWRlICJ2eGZzLmgiCisjaW5jbHVkZSAidnhmc19leHRlcm4uaCIKKyNpbmNsdWRlICJ2eGZzX2Rpci5oIgorI2luY2x1ZGUgInZ4ZnNfaW5vZGUuaCIKKworCitNT0RVTEVfQVVUSE9SKCJDaHJpc3RvcGggSGVsbHdpZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJWZXJpdGFzIEZpbGVzeXN0ZW0gKFZ4RlMpIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworCitNT0RVTEVfQUxJQVMoInZ4ZnMiKTsgLyogbWFrZXMgbW91bnQgLXQgdnhmcyBhdXRvbG9hZCB0aGUgbW9kdWxlICovCisKKworc3RhdGljIHZvaWQJCXZ4ZnNfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK3N0YXRpYyBpbnQJCXZ4ZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKK3N0YXRpYyBpbnQJCXZ4ZnNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50ICosIGNoYXIgKik7CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyB2eGZzX3N1cGVyX29wcyA9IHsKKwkucmVhZF9pbm9kZSA9CQl2eGZzX3JlYWRfaW5vZGUsCisJLmNsZWFyX2lub2RlID0JCXZ4ZnNfY2xlYXJfaW5vZGUsCisJLnB1dF9zdXBlciA9CQl2eGZzX3B1dF9zdXBlciwKKwkuc3RhdGZzID0JCXZ4ZnNfc3RhdGZzLAorCS5yZW1vdW50X2ZzID0JCXZ4ZnNfcmVtb3VudCwKK307CisKKy8qKgorICogdnhmc19wdXRfc3VwZXIgLSBmcmVlIHN1cGVyYmxvY2sgcmVzb3VyY2VzCisgKiBAc2JwOglWRlMgc3VwZXJibG9jay4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgdnhmc19wdXRfc3VwZXIgZnJlZXMgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIEBzYnAKKyAqICAgYWZ0ZXIgdGhlIGxhc3QgaW5zdGFuY2Ugb2YgdGhlIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGVkLgorICovCisKK3N0YXRpYyB2b2lkCit2eGZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCkKK3sKKwlzdHJ1Y3Qgdnhmc19zYl9pbmZvCSppbmZwID0gVlhGU19TQkkoc2JwKTsKKworCXZ4ZnNfcHV0X2Zha2VfaW5vZGUoaW5mcC0+dnNpX2ZzaGlwKTsKKwl2eGZzX3B1dF9mYWtlX2lub2RlKGluZnAtPnZzaV9pbGlzdCk7CisJdnhmc19wdXRfZmFrZV9pbm9kZShpbmZwLT52c2lfc3RpbGlzdCk7CisKKwlicmVsc2UoaW5mcC0+dnNpX2JwKTsKKwlrZnJlZShpbmZwKTsKK30KKworLyoqCisgKiB2eGZzX3N0YXRmcyAtIGdldCBmaWxlc3lzdGVtIGluZm9ybWF0aW9uCisgKiBAc2JwOglWRlMgc3VwZXJibG9jaworICogQGJ1ZnA6CW91dHB1dCBidWZmZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgdnhmc19zdGF0ZnMgZmlsbHMgdGhlIHN0YXRmcyBidWZmZXIgQGJ1ZnAgd2l0aCBpbmZvcm1hdGlvbgorICogICBhYm91dCB0aGUgZmlsZXN5c3RlbSBkZXNjcmliZWQgYnkgQHNicC4KKyAqCisgKiBSZXR1cm5zOgorICogICBaZXJvLgorICoKKyAqIExvY2tpbmc6CisgKiAgIE5vIGxvY2tzIGhlbGQuCisgKgorICogTm90ZXM6CisgKiAgIFRoaXMgaXMgZXZlcnl0aGluZyBidXQgY29tcGxldGUuLi4KKyAqLworc3RhdGljIGludAordnhmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIHN0cnVjdCBrc3RhdGZzICpidWZwKQoreworCXN0cnVjdCB2eGZzX3NiX2luZm8JCSppbmZwID0gVlhGU19TQkkoc2JwKTsKKworCWJ1ZnAtPmZfdHlwZSA9IFZYRlNfU1VQRVJfTUFHSUM7CisJYnVmcC0+Zl9ic2l6ZSA9IHNicC0+c19ibG9ja3NpemU7CisJYnVmcC0+Zl9ibG9ja3MgPSBpbmZwLT52c2lfcmF3LT52c19kc2l6ZTsKKwlidWZwLT5mX2JmcmVlID0gaW5mcC0+dnNpX3Jhdy0+dnNfZnJlZTsKKwlidWZwLT5mX2JhdmFpbCA9IDA7CisJYnVmcC0+Zl9maWxlcyA9IDA7CisJYnVmcC0+Zl9mZnJlZSA9IGluZnAtPnZzaV9yYXctPnZzX2lmcmVlOworCWJ1ZnAtPmZfbmFtZWxlbiA9IFZYRlNfTkFNRUxFTjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZ4ZnNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCSpmbGFncyB8PSBNU19SRE9OTFk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdnhmc19yZWFkX3N1cGVyIC0gcmVhZCBzdXBlcmJsb2NrIGludG8gbWVtb3J5IGFuZCBpbml0YWxpemUgZmlsZXN5c3RlbQorICogQHNicDoJCVZGUyBzdXBlcmJsb2NrICh0byBmaWxsKQorICogQGRwOgkJCWZzIHByaXZhdGUgbW91bnQgZGF0YQorICogQHNpbGVudDoJCWRvIG5vdCBjb21wbGFpbiBsb3VkbHkgd2hlbiBzdGggaXMgd3JvbmcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgV2UgYXJlIGNhbGxlZCBvbiB0aGUgZmlyc3QgbW91bnQgb2YgYSBmaWxlc3lzdGVtIHRvIHJlYWQgdGhlCisgKiAgIHN1cGVyYmxvY2sgaW50byBtZW1vcnkgYW5kIGRvIHNvbWUgYmFzaWMgc2V0dXAuCisgKgorICogUmV0dXJuczoKKyAqICAgVGhlIHN1cGVyYmxvY2sgb24gc3VjY2VzcywgZWxzZSAlTlVMTC4KKyAqCisgKiBMb2NraW5nOgorICogICBXZSBhcmUgdW5kZXIgdGhlIGJrbCBhbmQgQHNicC0+c19sb2NrLgorICovCitzdGF0aWMgaW50IHZ4ZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgdm9pZCAqZHAsIGludCBzaWxlbnQpCit7CisJc3RydWN0IHZ4ZnNfc2JfaW5mbwkqaW5mcDsKKwlzdHJ1Y3Qgdnhmc19zYgkJKnJzYnA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpicCA9IE5VTEw7CisJdV9sb25nCQkJYnNpemU7CisJc3RydWN0IGlub2RlICpyb290OworCisJc2JwLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKworCWluZnAgPSBrbWFsbG9jKHNpemVvZigqaW5mcCksIEdGUF9LRVJORUwpOworCWlmICghaW5mcCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ2eGZzOiB1bmFibGUgdG8gYWxsb2NhdGUgaW5jb3JlIHN1cGVyYmxvY2tcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGluZnAsIDAsIHNpemVvZigqaW5mcCkpOworCisJYnNpemUgPSBzYl9taW5fYmxvY2tzaXplKHNicCwgQkxPQ0tfU0laRSk7CisJaWYgKCFic2l6ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ2eGZzOiB1bmFibGUgdG8gc2V0IGJsb2Nrc2l6ZVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWJwID0gc2JfYnJlYWQoc2JwLCAxKTsKKwlpZiAoIWJwIHx8ICFidWZmZXJfbWFwcGVkKGJwKSkgeworCQlpZiAoIXNpbGVudCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJ2eGZzOiB1bmFibGUgdG8gcmVhZCBkaXNrIHN1cGVyYmxvY2tcbiIpOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCXJzYnAgPSAoc3RydWN0IHZ4ZnNfc2IgKilicC0+Yl9kYXRhOworCWlmIChyc2JwLT52c19tYWdpYyAhPSBWWEZTX1NVUEVSX01BR0lDKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKEtFUk5fTk9USUNFICJ2eGZzOiBXUk9ORyBzdXBlcmJsb2NrIG1hZ2ljXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChyc2JwLT52c192ZXJzaW9uIDwgMiB8fCByc2JwLT52c192ZXJzaW9uID4gNCkgJiYgIXNpbGVudCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgInZ4ZnM6IHVuc3VwcG9ydGVkIFZ4RlMgdmVyc2lvbiAoJWQpXG4iLAorCQkgICAgICAgcnNicC0+dnNfdmVyc2lvbik7CisJCWdvdG8gb3V0OworCX0KKworI2lmZGVmIERJQUdOT1NUSUMKKwlwcmludGsoS0VSTl9ERUJVRyAidnhmczogc3VwcG9ydGVkIFZ4RlMgdmVyc2lvbiAoJWQpXG4iLCByc2JwLT52c192ZXJzaW9uKTsKKwlwcmludGsoS0VSTl9ERUJVRyAidnhmczogYmxvY2tzaXplOiAlZFxuIiwgcnNicC0+dnNfYnNpemUpOworI2VuZGlmCisKKwlzYnAtPnNfbWFnaWMgPSByc2JwLT52c19tYWdpYzsKKwlzYnAtPnNfZnNfaW5mbyA9ICh2b2lkICopaW5mcDsKKworCWluZnAtPnZzaV9yYXcgPSByc2JwOworCWluZnAtPnZzaV9icCA9IGJwOworCWluZnAtPnZzaV9vbHRleHQgPSByc2JwLT52c19vbHRleHRbMF07CisJaW5mcC0+dnNpX29sdHNpemUgPSByc2JwLT52c19vbHRzaXplOworCisJaWYgKCFzYl9zZXRfYmxvY2tzaXplKHNicCwgcnNicC0+dnNfYnNpemUpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInZ4ZnM6IHVuYWJsZSB0byBzZXQgZmluYWwgYmxvY2sgc2l6ZVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh2eGZzX3JlYWRfb2x0KHNicCwgYnNpemUpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInZ4ZnM6IHVuYWJsZSB0byByZWFkIG9sdFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh2eGZzX3JlYWRfZnNoZWFkKHNicCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAidnhmczogdW5hYmxlIHRvIHJlYWQgZnNoZWFkXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJc2JwLT5zX29wID0gJnZ4ZnNfc3VwZXJfb3BzOworCXJvb3QgPSBpZ2V0KHNicCwgVlhGU19ST09UX0lOTyk7CisJc2JwLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CisJaWYgKCFzYnAtPnNfcm9vdCkgeworCQlpcHV0KHJvb3QpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ2eGZzOiB1bmFibGUgdG8gZ2V0IHJvb3QgZGVudHJ5LlxuIik7CisJCWdvdG8gb3V0X2ZyZWVfaWxpc3Q7CisJfQorCisJcmV0dXJuIDA7CisJCitvdXRfZnJlZV9pbGlzdDoKKwl2eGZzX3B1dF9mYWtlX2lub2RlKGluZnAtPnZzaV9mc2hpcCk7CisJdnhmc19wdXRfZmFrZV9pbm9kZShpbmZwLT52c2lfaWxpc3QpOworCXZ4ZnNfcHV0X2Zha2VfaW5vZGUoaW5mcC0+dnNpX3N0aWxpc3QpOworb3V0OgorCWJyZWxzZShicCk7CisJa2ZyZWUoaW5mcCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBUaGUgdXN1YWwgbW9kdWxlIGJsdXJiLgorICovCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICp2eGZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIHZ4ZnNfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB2eGZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJ2eGZzIiwKKwkuZ2V0X3NiCQk9IHZ4ZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworCitzdGF0aWMgaW50IF9faW5pdAordnhmc19pbml0KHZvaWQpCit7CisJdnhmc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgidnhmc19pbm9kZSIsCisJCQlzaXplb2Yoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyksIDAsIAorCQkJU0xBQl9SRUNMQUlNX0FDQ09VTlQsIE5VTEwsIE5VTEwpOworCWlmICh2eGZzX2lub2RlX2NhY2hlcCkKKwkJcmV0dXJuIChyZWdpc3Rlcl9maWxlc3lzdGVtKCZ2eGZzX2ZzX3R5cGUpKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgX19leGl0Cit2eGZzX2NsZWFudXAodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnZ4ZnNfZnNfdHlwZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KHZ4ZnNfaW5vZGVfY2FjaGVwKTsKK30KKworbW9kdWxlX2luaXQodnhmc19pbml0KTsKK21vZHVsZV9leGl0KHZ4ZnNfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9mcy9mcy13cml0ZWJhY2suYyBiL2ZzL2ZzLXdyaXRlYmFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZWZiMzYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mcy13cml0ZWJhY2suYwpAQCAtMCwwICsxLDY5NSBAQAorLyoKKyAqIGZzL2ZzLXdyaXRlYmFjay5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCBMaW51cyBUb3J2YWxkcy4KKyAqCisgKiBDb250YWlucyBhbGwgdGhlIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHdyaXRpbmcgYmFjayBhbmQgd2FpdGluZworICogdXBvbiBkaXJ0eSBpbm9kZXMgYWdhaW5zdCBzdXBlcmJsb2NrcywgYW5kIHdyaXRpbmcgYmFjayBkaXJ0eQorICogcGFnZXMgYWdhaW5zdCBpbm9kZXMuICBpZTogZGF0YSB3cml0ZWJhY2suICBXcml0ZW91dCBvZiB0aGUKKyAqIGlub2RlIGl0c2VsZiBpcyBub3QgaGFuZGxlZCBoZXJlLgorICoKKyAqIDEwQXByMjAwMglha3BtQHppcC5jb20uYXUKKyAqCQlTcGxpdCBvdXQgb2YgZnMvaW5vZGUuYworICoJCUFkZGl0aW9ucyBmb3IgYWRkcmVzc19zcGFjZS1iYXNlZCB3cml0ZWJhY2sKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKK2V4dGVybiBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmJsb2NrZGV2X3N1cGVyYmxvY2s7CisKKy8qKgorICoJX19tYXJrX2lub2RlX2RpcnR5IC0JaW50ZXJuYWwgZnVuY3Rpb24KKyAqCUBpbm9kZTogaW5vZGUgdG8gbWFyaworICoJQGZsYWdzOiB3aGF0IGtpbmQgb2YgZGlydHkgKGkuZS4gSV9ESVJUWV9TWU5DKQorICoJTWFyayBhbiBpbm9kZSBhcyBkaXJ0eS4gQ2FsbGVycyBzaG91bGQgdXNlIG1hcmtfaW5vZGVfZGlydHkgb3IKKyAqICAJbWFya19pbm9kZV9kaXJ0eV9zeW5jLgorICoKKyAqIFB1dCB0aGUgaW5vZGUgb24gdGhlIHN1cGVyIGJsb2NrJ3MgZGlydHkgbGlzdC4KKyAqCisgKiBDQVJFRlVMISBXZSBtYXJrIGl0IGRpcnR5IHVuY29uZGl0aW9uYWxseSwgYnV0IG1vdmUgaXQgb250byB0aGUKKyAqIGRpcnR5IGxpc3Qgb25seSBpZiBpdCBpcyBoYXNoZWQgb3IgaWYgaXQgcmVmZXJzIHRvIGEgYmxvY2tkZXYuCisgKiBJZiBpdCB3YXMgbm90IGhhc2hlZCwgaXQgd2lsbCBuZXZlciBiZSBhZGRlZCB0byB0aGUgZGlydHkgbGlzdAorICogZXZlbiBpZiBpdCBpcyBsYXRlciBoYXNoZWQsIGFzIGl0IHdpbGwgaGF2ZSBiZWVuIG1hcmtlZCBkaXJ0eSBhbHJlYWR5LgorICoKKyAqIEluIHNob3J0LCBtYWtlIHN1cmUgeW91IGhhc2ggYW55IGlub2RlcyBfYmVmb3JlXyB5b3Ugc3RhcnQgbWFya2luZworICogdGhlbSBkaXJ0eS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uICptdXN0KiBiZSBhdG9taWMgZm9yIHRoZSBJX0RJUlRZX1BBR0VTIGNhc2UgLQorICogc2V0X3BhZ2VfZGlydHkoKSBpcyBjYWxsZWQgdW5kZXIgc3BpbmxvY2sgaW4gc2V2ZXJhbCBwbGFjZXMuCisgKgorICogTm90ZSB0aGF0IGZvciBibG9ja2RldnMsIGlub2RlLT5kaXJ0aWVkX3doZW4gcmVwcmVzZW50cyB0aGUgZGlydHlpbmcgdGltZSBvZgorICogdGhlIGJsb2NrLXNwZWNpYWwgaW5vZGUgKC9kZXYvaGRhMSkgaXRzZWxmLiAgQW5kIHRoZSAtPmRpcnRpZWRfd2hlbiBmaWVsZCBvZgorICogdGhlIGtlcm5lbC1pbnRlcm5hbCBibG9ja2RldiBpbm9kZSByZXByZXNlbnRzIHRoZSBkaXJ0eWluZyB0aW1lIG9mIHRoZQorICogYmxvY2tkZXYncyBwYWdlcy4gIFRoaXMgaXMgd2h5IGZvciBJX0RJUlRZX1BBR0VTIHdlIGFsd2F5cyB1c2UKKyAqIHBhZ2UtPm1hcHBpbmctPmhvc3QsIHNvIHRoZSBwYWdlLWRpcnR5aW5nIHRpbWUgaXMgcmVjb3JkZWQgaW4gdGhlIGludGVybmFsCisgKiBibG9ja2RldiBpbm9kZS4KKyAqLwordm9pZCBfX21hcmtfaW5vZGVfZGlydHkoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKworCS8qCisJICogRG9uJ3QgZG8gdGhpcyBmb3IgSV9ESVJUWV9QQUdFUyAtIHRoYXQgZG9lc24ndCBhY3R1YWxseQorCSAqIGRpcnR5IHRoZSBpbm9kZSBpdHNlbGYKKwkgKi8KKwlpZiAoZmxhZ3MgJiAoSV9ESVJUWV9TWU5DIHwgSV9ESVJUWV9EQVRBU1lOQykpIHsKKwkJaWYgKHNiLT5zX29wLT5kaXJ0eV9pbm9kZSkKKwkJCXNiLT5zX29wLT5kaXJ0eV9pbm9kZShpbm9kZSk7CisJfQorCisJLyoKKwkgKiBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIGFyZSBzZWVuIGJ5IGFsbCBjcHVzIGJlZm9yZSB3ZSB0ZXN0IGlfc3RhdGUKKwkgKiAtLSBtaWt1bGFzCisJICovCisJc21wX21iKCk7CisKKwkvKiBhdm9pZCB0aGUgbG9ja2luZyBpZiB3ZSBjYW4gKi8KKwlpZiAoKGlub2RlLT5pX3N0YXRlICYgZmxhZ3MpID09IGZsYWdzKQorCQlyZXR1cm47CisKKwlpZiAodW5saWtlbHkoYmxvY2tfZHVtcCkpIHsKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gTlVMTDsKKwkJY29uc3QgY2hhciAqbmFtZSA9ICI/IjsKKworCQlpZiAoIWxpc3RfZW1wdHkoJmlub2RlLT5pX2RlbnRyeSkpIHsKKwkJCWRlbnRyeSA9IGxpc3RfZW50cnkoaW5vZGUtPmlfZGVudHJ5Lm5leHQsCisJCQkJCSAgICBzdHJ1Y3QgZGVudHJ5LCBkX2FsaWFzKTsKKwkJCWlmIChkZW50cnkgJiYgZGVudHJ5LT5kX25hbWUubmFtZSkKKwkJCQluYW1lID0gKGNvbnN0IGNoYXIgKikgZGVudHJ5LT5kX25hbWUubmFtZTsKKwkJfQorCisJCWlmIChpbm9kZS0+aV9pbm8gfHwgc3RyY21wKGlub2RlLT5pX3NiLT5zX2lkLCAiYmRldiIpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCSAgICAgICAiJXMoJWQpOiBkaXJ0aWVkIGlub2RlICVsdSAoJXMpIG9uICVzXG4iLAorCQkJICAgICAgIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgaW5vZGUtPmlfaW5vLAorCQkJICAgICAgIG5hbWUsIGlub2RlLT5pX3NiLT5zX2lkKTsKKwl9CisKKwlzcGluX2xvY2soJmlub2RlX2xvY2spOworCWlmICgoaW5vZGUtPmlfc3RhdGUgJiBmbGFncykgIT0gZmxhZ3MpIHsKKwkJY29uc3QgaW50IHdhc19kaXJ0eSA9IGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWTsKKworCQlpbm9kZS0+aV9zdGF0ZSB8PSBmbGFnczsKKworCQkvKgorCQkgKiBJZiB0aGUgaW5vZGUgaXMgbG9ja2VkLCBqdXN0IHVwZGF0ZSBpdHMgZGlydHkgc3RhdGUuIAorCQkgKiBUaGUgdW5sb2NrZXIgd2lsbCBwbGFjZSB0aGUgaW5vZGUgb24gdGhlIGFwcHJvcHJpYXRlCisJCSAqIHN1cGVyYmxvY2sgbGlzdCwgYmFzZWQgdXBvbiBpdHMgc3RhdGUuCisJCSAqLworCQlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX0xPQ0spCisJCQlnb3RvIG91dDsKKworCQkvKgorCQkgKiBPbmx5IGFkZCB2YWxpZCAoaGFzaGVkKSBpbm9kZXMgdG8gdGhlIHN1cGVyYmxvY2sncworCQkgKiBkaXJ0eSBsaXN0LiAgQWRkIGJsb2NrZGV2IGlub2RlcyBhcyB3ZWxsLgorCQkgKi8KKwkJaWYgKCFTX0lTQkxLKGlub2RlLT5pX21vZGUpKSB7CisJCQlpZiAoaGxpc3RfdW5oYXNoZWQoJmlub2RlLT5pX2hhc2gpKQorCQkJCWdvdG8gb3V0OworCQl9CisJCWlmIChpbm9kZS0+aV9zdGF0ZSAmIChJX0ZSRUVJTkd8SV9DTEVBUikpCisJCQlnb3RvIG91dDsKKworCQkvKgorCQkgKiBJZiB0aGUgaW5vZGUgd2FzIGFscmVhZHkgb24gc19kaXJ0eSBvciBzX2lvLCBkb24ndAorCQkgKiByZXBvc2l0aW9uIGl0ICh0aGF0IHdvdWxkIGJyZWFrIHNfZGlydHkgdGltZS1vcmRlcmluZykuCisJCSAqLworCQlpZiAoIXdhc19kaXJ0eSkgeworCQkJaW5vZGUtPmRpcnRpZWRfd2hlbiA9IGppZmZpZXM7CisJCQlsaXN0X21vdmUoJmlub2RlLT5pX2xpc3QsICZzYi0+c19kaXJ0eSk7CisJCX0KKwl9CitvdXQ6CisJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworfQorCitFWFBPUlRfU1lNQk9MKF9fbWFya19pbm9kZV9kaXJ0eSk7CisKK3N0YXRpYyBpbnQgd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHN5bmMpCit7CisJaWYgKGlub2RlLT5pX3NiLT5zX29wLT53cml0ZV9pbm9kZSAmJiAhaXNfYmFkX2lub2RlKGlub2RlKSkKKwkJcmV0dXJuIGlub2RlLT5pX3NiLT5zX29wLT53cml0ZV9pbm9kZShpbm9kZSwgc3luYyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXcml0ZSBhIHNpbmdsZSBpbm9kZSdzIGRpcnR5IHBhZ2VzIGFuZCBpbm9kZSBkYXRhIG91dCB0byBkaXNrLgorICogSWYgYHdhaXQnIGlzIHNldCwgd2FpdCBvbiB0aGUgd3JpdGVvdXQuCisgKgorICogVGhlIHdob2xlIHdyaXRlb3V0IGRlc2lnbiBpcyBxdWl0ZSBjb21wbGV4IGFuZCBmcmFnaWxlLiAgV2Ugd2FudCB0byBhdm9pZAorICogc3RhcnZhdGlvbiBvZiBwYXJ0aWN1bGFyIGlub2RlcyB3aGVuIG90aGVycyBhcmUgYmVpbmcgcmVkaXJ0aWVkLCBwcmV2ZW50CisgKiBsaXZlbG9ja3MsIGV0Yy4KKyAqCisgKiBDYWxsZWQgdW5kZXIgaW5vZGVfbG9jay4KKyAqLworc3RhdGljIGludAorX19zeW5jX3NpbmdsZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwl1bnNpZ25lZCBkaXJ0eTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCWludCB3YWl0ID0gd2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19BTEw7CisJaW50IHJldDsKKworCUJVR19PTihpbm9kZS0+aV9zdGF0ZSAmIElfTE9DSyk7CisKKwkvKiBTZXQgSV9MT0NLLCByZXNldCBJX0RJUlRZICovCisJZGlydHkgPSBpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFk7CisJaW5vZGUtPmlfc3RhdGUgfD0gSV9MT0NLOworCWlub2RlLT5pX3N0YXRlICY9IH5JX0RJUlRZOworCisJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCisJcmV0ID0gZG9fd3JpdGVwYWdlcyhtYXBwaW5nLCB3YmMpOworCisJLyogRG9uJ3Qgd3JpdGUgdGhlIGlub2RlIGlmIG9ubHkgSV9ESVJUWV9QQUdFUyB3YXMgc2V0ICovCisJaWYgKGRpcnR5ICYgKElfRElSVFlfU1lOQyB8IElfRElSVFlfREFUQVNZTkMpKSB7CisJCWludCBlcnIgPSB3cml0ZV9pbm9kZShpbm9kZSwgd2FpdCk7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IGVycjsKKwl9CisKKwlpZiAod2FpdCkgeworCQlpbnQgZXJyID0gZmlsZW1hcF9mZGF0YXdhaXQobWFwcGluZyk7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IGVycjsKKwl9CisKKwlzcGluX2xvY2soJmlub2RlX2xvY2spOworCWlub2RlLT5pX3N0YXRlICY9IH5JX0xPQ0s7CisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX0ZSRUVJTkcpKSB7CisJCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWSkgJiYKKwkJICAgIG1hcHBpbmdfdGFnZ2VkKG1hcHBpbmcsIFBBR0VDQUNIRV9UQUdfRElSVFkpKSB7CisJCQkvKgorCQkJICogV2UgZGlkbid0IHdyaXRlIGJhY2sgYWxsIHRoZSBwYWdlcy4gIG5mc193cml0ZXBhZ2VzKCkKKwkJCSAqIHNvbWV0aW1lcyBiYWxlcyBvdXQgd2l0aG91dCBkb2luZyBhbnl0aGluZy4gUmVkaXJ0eQorCQkJICogdGhlIGlub2RlLiAgSXQgaXMgc3RpbGwgb24gc2ItPnNfaW8uCisJCQkgKi8KKwkJCWlmICh3YmMtPmZvcl9rdXBkYXRlKSB7CisJCQkJLyoKKwkJCQkgKiBGb3IgdGhlIGt1cGRhdGUgZnVuY3Rpb24gd2UgbGVhdmUgdGhlIGlub2RlCisJCQkJICogYXQgdGhlIGhlYWQgb2Ygc2JfZGlydHkgc28gaXQgd2lsbCBnZXQgbW9yZQorCQkJCSAqIHdyaXRlb3V0IGFzIHNvb24gYXMgdGhlIHF1ZXVlIGJlY29tZXMKKwkJCQkgKiB1bmNvbmdlc3RlZC4KKwkJCQkgKi8KKwkJCQlpbm9kZS0+aV9zdGF0ZSB8PSBJX0RJUlRZX1BBR0VTOworCQkJCWxpc3RfbW92ZV90YWlsKCZpbm9kZS0+aV9saXN0LCAmc2ItPnNfZGlydHkpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIE90aGVyd2lzZSBmdWxseSByZWRpcnR5IHRoZSBpbm9kZSBzbyB0aGF0CisJCQkJICogb3RoZXIgaW5vZGVzIG9uIHRoaXMgc3VwZXJibG9jayB3aWxsIGdldCBzb21lCisJCQkJICogd3JpdGVvdXQuICBPdGhlcndpc2UgaGVhdnkgd3JpdGluZyB0byBvbmUKKwkJCQkgKiBmaWxlIHdvdWxkIGluZGVmaW5pdGVseSBzdXNwZW5kIHdyaXRlb3V0IG9mCisJCQkJICogYWxsIHRoZSBvdGhlciBmaWxlcy4KKwkJCQkgKi8KKwkJCQlpbm9kZS0+aV9zdGF0ZSB8PSBJX0RJUlRZX1BBR0VTOworCQkJCWlub2RlLT5kaXJ0aWVkX3doZW4gPSBqaWZmaWVzOworCQkJCWxpc3RfbW92ZSgmaW5vZGUtPmlfbGlzdCwgJnNiLT5zX2RpcnR5KTsKKwkJCX0KKwkJfSBlbHNlIGlmIChpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFkpIHsKKwkJCS8qCisJCQkgKiBTb21lb25lIHJlZGlydGllZCB0aGUgaW5vZGUgd2hpbGUgd2VyZSB3cml0aW5nIGJhY2sKKwkJCSAqIHRoZSBwYWdlcy4KKwkJCSAqLworCQkJbGlzdF9tb3ZlKCZpbm9kZS0+aV9saXN0LCAmc2ItPnNfZGlydHkpOworCQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkpIHsKKwkJCS8qCisJCQkgKiBUaGUgaW5vZGUgaXMgY2xlYW4sIGludXNlCisJCQkgKi8KKwkJCWxpc3RfbW92ZSgmaW5vZGUtPmlfbGlzdCwgJmlub2RlX2luX3VzZSk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGhlIGlub2RlIGlzIGNsZWFuLCB1bnVzZWQKKwkJCSAqLworCQkJbGlzdF9tb3ZlKCZpbm9kZS0+aV9saXN0LCAmaW5vZGVfdW51c2VkKTsKKwkJCWlub2Rlc19zdGF0Lm5yX3VudXNlZCsrOworCQl9CisJfQorCXdha2VfdXBfaW5vZGUoaW5vZGUpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBXcml0ZSBvdXQgYW4gaW5vZGUncyBkaXJ0eSBwYWdlcy4gIENhbGxlZCB1bmRlciBpbm9kZV9sb2NrLgorICovCitzdGF0aWMgaW50CitfX3dyaXRlYmFja19zaW5nbGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXdhaXRfcXVldWVfaGVhZF90ICp3cWg7CisKKwlpZiAoKHdiYy0+c3luY19tb2RlICE9IFdCX1NZTkNfQUxMKSAmJiAoaW5vZGUtPmlfc3RhdGUgJiBJX0xPQ0spKSB7CisJCWxpc3RfbW92ZSgmaW5vZGUtPmlfbGlzdCwgJmlub2RlLT5pX3NiLT5zX2RpcnR5KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBJdCdzIGEgZGF0YS1pbnRlZ3JpdHkgc3luYy4gIFdlIG11c3Qgd2FpdC4KKwkgKi8KKwlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX0xPQ0spIHsKKwkJREVGSU5FX1dBSVRfQklUKHdxLCAmaW5vZGUtPmlfc3RhdGUsIF9fSV9MT0NLKTsKKworCQl3cWggPSBiaXRfd2FpdHF1ZXVlKCZpbm9kZS0+aV9zdGF0ZSwgX19JX0xPQ0spOworCQlkbyB7CisJCQlfX2lnZXQoaW5vZGUpOworCQkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCQkJX193YWl0X29uX2JpdCh3cWgsICZ3cSwgaW5vZGVfd2FpdCwKKwkJCQkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlpcHV0KGlub2RlKTsKKwkJCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJCX0gd2hpbGUgKGlub2RlLT5pX3N0YXRlICYgSV9MT0NLKTsKKwl9CisJcmV0dXJuIF9fc3luY19zaW5nbGVfaW5vZGUoaW5vZGUsIHdiYyk7Cit9CisKKy8qCisgKiBXcml0ZSBvdXQgYSBzdXBlcmJsb2NrJ3MgbGlzdCBvZiBkaXJ0eSBpbm9kZXMuICBBIHdhaXQgd2lsbCBiZSBwZXJmb3JtZWQKKyAqIHVwb24gbm8gaW5vZGVzLCBhbGwgaW5vZGVzIG9yIHRoZSBmaW5hbCBvbmUsIGRlcGVuZGluZyB1cG9uIHN5bmNfbW9kZS4KKyAqCisgKiBJZiBvbGRlcl90aGFuX3RoaXMgaXMgbm9uLU5VTEwsIHRoZW4gb25seSB3cml0ZSBvdXQgaW5vZGVzIHdoaWNoCisgKiBoYWQgdGhlaXIgZmlyc3QgZGlydHlpbmcgYXQgYSB0aW1lIGVhcmxpZXIgdGhhbiAqb2xkZXJfdGhhbl90aGlzLgorICoKKyAqIElmIHdlJ3JlIGEgcGRsZnVzaCB0aHJlYWQsIHRoZW4gaW1wbGVtZW50IHBkZmx1c2ggY29sbGlzaW9uIGF2b2lkYW5jZQorICogYWdhaW5zdCB0aGUgZW50aXJlIGxpc3QuCisgKgorICogV0JfU1lOQ19IT0xEIGlzIGEgaGFjayBmb3Igc3lzX3N5bmMoKTogcmVhdHRhY2ggdGhlIGlub2RlIHRvIHNiLT5zX2RpcnR5IHNvCisgKiB0aGF0IGl0IGNhbiBiZSBsb2NhdGVkIGZvciB3YWl0aW5nIG9uIGluIF9fd3JpdGViYWNrX3NpbmdsZV9pbm9kZSgpLgorICoKKyAqIENhbGxlZCB1bmRlciBpbm9kZV9sb2NrLgorICoKKyAqIElmIGBiZGknIGlzIG5vbi16ZXJvIHRoZW4gd2UncmUgYmVpbmcgYXNrZWQgdG8gd3JpdGViYWNrIGEgc3BlY2lmaWMgcXVldWUuCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgYmxvY2tkZXYgc3VwZXJibG9jaydzIGlub2RlcyBhcmUgYmFja2VkIGJ5CisgKiBhIHZhcmlldHkgb2YgcXVldWVzLCBzbyBhbGwgaW5vZGVzIGFyZSBzZWFyY2hlZC4gIEZvciBvdGhlciBzdXBlcmJsb2NrcywKKyAqIGFzc3VtZSB0aGF0IGFsbCBpbm9kZXMgYXJlIGJhY2tlZCBieSB0aGUgc2FtZSBxdWV1ZS4KKyAqCisgKiBGSVhNRTogdGhpcyBsaW5lYXIgc2VhcmNoIGNvdWxkIGdldCBleHBlbnNpdmUgd2l0aCBtYW55IGZpbGV5c3RlbXMuICBCdXQKKyAqIGhvdyB0byBmaXg/ICBXZSBuZWVkIHRvIGdvIGZyb20gYW4gYWRkcmVzc19zcGFjZSB0byBhbGwgaW5vZGVzIHdoaWNoIHNoYXJlCisgKiBhIHF1ZXVlIHdpdGggdGhhdCBhZGRyZXNzX3NwYWNlLiAgKEVhc3k6IGhhdmUgYSBnbG9iYWwgImRpcnR5IHN1cGVyYmxvY2tzIgorICogbGlzdCkuCisgKgorICogVGhlIGlub2RlcyB0byBiZSB3cml0dGVuIGFyZSBwYXJrZWQgb24gc2ItPnNfaW8uICBUaGV5IGFyZSBtb3ZlZCBiYWNrIG9udG8KKyAqIHNiLT5zX2RpcnR5IGFzIHRoZXkgYXJlIHNlbGVjdGVkIGZvciB3cml0aW5nLiAgVGhpcyB3YXksIG5vbmUgY2FuIGJlIG1pc3NlZAorICogb24gdGhlIHdyaXRlciB0aHJvdHRsaW5nIHBhdGgsIGFuZCB3ZSBnZXQgZGVjZW50IGJhbGFuY2luZyBiZXR3ZWVuIG1hbnkKKyAqIHRocm90dGxlZCB0aHJlYWRzOiB3ZSBkb24ndCB3YW50IHRoZW0gYWxsIHBpbGluZyB1cCBvbiBfX3dhaXRfb25faW5vZGUuCisgKi8KK3N0YXRpYyB2b2lkCitzeW5jX3NiX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwljb25zdCB1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllczsJLyogbGl2ZWxvY2sgYXZvaWRhbmNlICovCisKKwlpZiAoIXdiYy0+Zm9yX2t1cGRhdGUgfHwgbGlzdF9lbXB0eSgmc2ItPnNfaW8pKQorCQlsaXN0X3NwbGljZV9pbml0KCZzYi0+c19kaXJ0eSwgJnNiLT5zX2lvKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmc2ItPnNfaW8pKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBsaXN0X2VudHJ5KHNiLT5zX2lvLnByZXYsCisJCQkJCQlzdHJ1Y3QgaW5vZGUsIGlfbGlzdCk7CisJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwkJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSA9IG1hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87CisJCWxvbmcgcGFnZXNfc2tpcHBlZDsKKworCQlpZiAoIWJkaV9jYXBfd3JpdGViYWNrX2RpcnR5KGJkaSkpIHsKKwkJCWxpc3RfbW92ZSgmaW5vZGUtPmlfbGlzdCwgJnNiLT5zX2RpcnR5KTsKKwkJCWlmIChzYiA9PSBibG9ja2Rldl9zdXBlcmJsb2NrKSB7CisJCQkJLyoKKwkJCQkgKiBEaXJ0eSBtZW1vcnktYmFja2VkIGJsb2NrZGV2OiB0aGUgcmFtZGlzaworCQkJCSAqIGRyaXZlciBkb2VzIHRoaXMuICBTa2lwIGp1c3QgdGhpcyBpbm9kZQorCQkJCSAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyoKKwkJCSAqIERpcnR5IG1lbW9yeS1iYWNrZWQgaW5vZGUgYWdhaW5zdCBhIGZpbGVzeXN0ZW0gb3RoZXIKKwkJCSAqIHRoYW4gdGhlIGtlcm5lbC1pbnRlcm5hbCBiZGV2IGZpbGVzeXN0ZW0uICBTa2lwIHRoZQorCQkJICogZW50aXJlIHN1cGVyYmxvY2suCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHdiYy0+bm9uYmxvY2tpbmcgJiYgYmRpX3dyaXRlX2Nvbmdlc3RlZChiZGkpKSB7CisJCQl3YmMtPmVuY291bnRlcmVkX2Nvbmdlc3Rpb24gPSAxOworCQkJaWYgKHNiICE9IGJsb2NrZGV2X3N1cGVyYmxvY2spCisJCQkJYnJlYWs7CQkvKiBTa2lwIGEgY29uZ2VzdGVkIGZzICovCisJCQlsaXN0X21vdmUoJmlub2RlLT5pX2xpc3QsICZzYi0+c19kaXJ0eSk7CisJCQljb250aW51ZTsJCS8qIFNraXAgYSBjb25nZXN0ZWQgYmxvY2tkZXYgKi8KKwkJfQorCisJCWlmICh3YmMtPmJkaSAmJiBiZGkgIT0gd2JjLT5iZGkpIHsKKwkJCWlmIChzYiAhPSBibG9ja2Rldl9zdXBlcmJsb2NrKQorCQkJCWJyZWFrOwkJLyogZnMgaGFzIHRoZSB3cm9uZyBxdWV1ZSAqLworCQkJbGlzdF9tb3ZlKCZpbm9kZS0+aV9saXN0LCAmc2ItPnNfZGlydHkpOworCQkJY29udGludWU7CQkvKiBibG9ja2RldiBoYXMgd3JvbmcgcXVldWUgKi8KKwkJfQorCisJCS8qIFdhcyB0aGlzIGlub2RlIGRpcnRpZWQgYWZ0ZXIgc3luY19zYl9pbm9kZXMgd2FzIGNhbGxlZD8gKi8KKwkJaWYgKHRpbWVfYWZ0ZXIoaW5vZGUtPmRpcnRpZWRfd2hlbiwgc3RhcnQpKQorCQkJYnJlYWs7CisKKwkJLyogV2FzIHRoaXMgaW5vZGUgZGlydGllZCB0b28gcmVjZW50bHk/ICovCisJCWlmICh3YmMtPm9sZGVyX3RoYW5fdGhpcyAmJiB0aW1lX2FmdGVyKGlub2RlLT5kaXJ0aWVkX3doZW4sCisJCQkJCQkqd2JjLT5vbGRlcl90aGFuX3RoaXMpKQorCQkJYnJlYWs7CisKKwkJLyogSXMgYW5vdGhlciBwZGZsdXNoIGFscmVhZHkgZmx1c2hpbmcgdGhpcyBxdWV1ZT8gKi8KKwkJaWYgKGN1cnJlbnRfaXNfcGRmbHVzaCgpICYmICF3cml0ZWJhY2tfYWNxdWlyZShiZGkpKQorCQkJYnJlYWs7CisKKwkJQlVHX09OKGlub2RlLT5pX3N0YXRlICYgSV9GUkVFSU5HKTsKKwkJX19pZ2V0KGlub2RlKTsKKwkJcGFnZXNfc2tpcHBlZCA9IHdiYy0+cGFnZXNfc2tpcHBlZDsKKwkJX193cml0ZWJhY2tfc2luZ2xlX2lub2RlKGlub2RlLCB3YmMpOworCQlpZiAod2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19IT0xEKSB7CisJCQlpbm9kZS0+ZGlydGllZF93aGVuID0gamlmZmllczsKKwkJCWxpc3RfbW92ZSgmaW5vZGUtPmlfbGlzdCwgJnNiLT5zX2RpcnR5KTsKKwkJfQorCQlpZiAoY3VycmVudF9pc19wZGZsdXNoKCkpCisJCQl3cml0ZWJhY2tfcmVsZWFzZShiZGkpOworCQlpZiAod2JjLT5wYWdlc19za2lwcGVkICE9IHBhZ2VzX3NraXBwZWQpIHsKKwkJCS8qCisJCQkgKiB3cml0ZWJhY2sgaXMgbm90IG1ha2luZyBwcm9ncmVzcyBkdWUgdG8gbG9ja2VkCisJCQkgKiBidWZmZXJzLiAgU2tpcCB0aGlzIGlub2RlIGZvciBub3cuCisJCQkgKi8KKwkJCWxpc3RfbW92ZSgmaW5vZGUtPmlfbGlzdCwgJnNiLT5zX2RpcnR5KTsKKwkJfQorCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisJCWNvbmRfcmVzY2hlZCgpOworCQlpcHV0KGlub2RlKTsKKwkJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwkJaWYgKHdiYy0+bnJfdG9fd3JpdGUgPD0gMCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm47CQkvKiBMZWF2ZSBhbnkgdW53cml0dGVuIGlub2RlcyBvbiBzX2lvICovCit9CisKKy8qCisgKiBTdGFydCB3cml0ZWJhY2sgb2YgZGlydHkgcGFnZWNhY2hlIGRhdGEgYWdhaW5zdCBhbGwgdW5sb2NrZWQgaW5vZGVzLgorICoKKyAqIE5vdGU6CisgKiBXZSBkb24ndCBuZWVkIHRvIGdyYWIgYSByZWZlcmVuY2UgdG8gc3VwZXJibG9jayBoZXJlLiBJZiBpdCBoYXMgbm9uLWVtcHR5CisgKiAtPnNfZGlydHkgaXQncyBoYWRuJ3QgYmVlbiBraWxsZWQgeWV0IGFuZCBraWxsX3N1cGVyKCkgd29uJ3QgcHJvY2VlZAorICogcGFzdCBzeW5jX2lub2Rlc19zYigpIHVudGlsIGJvdGggdGhlIC0+c19kaXJ0eSBhbmQgLT5zX2lvIGxpc3RzIGFyZQorICogZW1wdHkuIFNpbmNlIF9fc3luY19zaW5nbGVfaW5vZGUoKSByZWdhaW5zIGlub2RlX2xvY2sgYmVmb3JlIGl0IGZpbmFsbHkgbW92ZXMKKyAqIGlub2RlIGZyb20gc3VwZXJibG9jayBsaXN0cyB3ZSBhcmUgT0suCisgKgorICogSWYgYG9sZGVyX3RoYW5fdGhpcycgaXMgbm9uLXplcm8gdGhlbiBvbmx5IGZsdXNoIGlub2RlcyB3aGljaCBoYXZlIGEKKyAqIGZsdXNodGltZSBvbGRlciB0aGFuICpvbGRlcl90aGFuX3RoaXMuCisgKgorICogSWYgYGJkaScgaXMgbm9uLXplcm8gdGhlbiB3ZSB3aWxsIHNjYW4gdGhlIGZpcnN0IGlub2RlIGFnYWluc3QgZWFjaAorICogc3VwZXJibG9jayB1bnRpbCB3ZSBmaW5kIHRoZSBtYXRjaGluZyBvbmVzLiAgT25lIGdyb3VwIHdpbGwgYmUgdGhlIGRpcnR5CisgKiBpbm9kZXMgYWdhaW5zdCBhIGZpbGVzeXN0ZW0uICBUaGVuIHdoZW4gd2UgaGl0IHRoZSBkdW1teSBibG9ja2RldiBzdXBlcmJsb2NrLAorICogc3luY19zYl9pbm9kZXMgd2lsbCBzZWVrb3V0IHRoZSBibG9ja2RldiB3aGljaCBtYXRjaGVzIGBiZGknLiAgTWF5YmUgbm90CisgKiBzdXBlci1lZmZpY2llbnQgYnV0IHdlJ3JlIGFib3V0IHRvIGRvIGEgdG9uIG9mIEkvTy4uLgorICovCit2b2lkCit3cml0ZWJhY2tfaW5vZGVzKHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisKKwltaWdodF9zbGVlcCgpOworCXNwaW5fbG9jaygmc2JfbG9jayk7CityZXN0YXJ0OgorCXNiID0gc2JfZW50cnkoc3VwZXJfYmxvY2tzLnByZXYpOworCWZvciAoOyBzYiAhPSBzYl9lbnRyeSgmc3VwZXJfYmxvY2tzKTsgc2IgPSBzYl9lbnRyeShzYi0+c19saXN0LnByZXYpKSB7CisJCWlmICghbGlzdF9lbXB0eSgmc2ItPnNfZGlydHkpIHx8ICFsaXN0X2VtcHR5KCZzYi0+c19pbykpIHsKKwkJCS8qIHdlJ3JlIG1ha2luZyBvdXIgb3duIGdldF9zdXBlciBoZXJlICovCisJCQlzYi0+c19jb3VudCsrOworCQkJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCQkJLyoKKwkJCSAqIElmIHdlIGNhbid0IGdldCB0aGUgcmVhZGxvY2ssIHRoZXJlJ3Mgbm8gc2Vuc2UgaW4KKwkJCSAqIHdhaXRpbmcgYXJvdW5kLCBtb3N0IG9mIHRoZSB0aW1lIHRoZSBGUyBpcyBnb2luZyB0bworCQkJICogYmUgdW5tb3VudGVkIGJ5IHRoZSB0aW1lIGl0IGlzIHJlbGVhc2VkLgorCQkJICovCisJCQlpZiAoZG93bl9yZWFkX3RyeWxvY2soJnNiLT5zX3Vtb3VudCkpIHsKKwkJCQlpZiAoc2ItPnNfcm9vdCkgeworCQkJCQlzcGluX2xvY2soJmlub2RlX2xvY2spOworCQkJCQlzeW5jX3NiX2lub2RlcyhzYiwgd2JjKTsKKwkJCQkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCQkJCX0KKwkJCQl1cF9yZWFkKCZzYi0+c191bW91bnQpOworCQkJfQorCQkJc3Bpbl9sb2NrKCZzYl9sb2NrKTsKKwkJCWlmIChfX3B1dF9zdXBlcl9hbmRfbmVlZF9yZXN0YXJ0KHNiKSkKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKwkJaWYgKHdiYy0+bnJfdG9fd3JpdGUgPD0gMCkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmc2JfbG9jayk7Cit9CisKKy8qCisgKiB3cml0ZWJhY2sgYW5kIHdhaXQgdXBvbiB0aGUgZmlsZXN5c3RlbSdzIGRpcnR5IGlub2Rlcy4gIFRoZSBjYWxsZXIgd2lsbAorICogZG8gdGhpcyBpbiB0d28gcGFzc2VzIC0gb25lIHRvIHdyaXRlLCBhbmQgb25lIHRvIHdhaXQuICBXQl9TWU5DX0hPTEQgaXMKKyAqIHVzZWQgdG8gcGFyayB0aGUgd3JpdHRlbiBpbm9kZXMgb24gc2ItPnNfZGlydHkgZm9yIHRoZSB3YWl0IHBhc3MuCisgKgorICogQSBmaW5pdGUgbGltaXQgaXMgc2V0IG9uIHRoZSBudW1iZXIgb2YgcGFnZXMgd2hpY2ggd2lsbCBiZSB3cml0dGVuLgorICogVG8gcHJldmVudCBpbmZpbml0ZSBsaXZlbG9jayBvZiBzeXNfc3luYygpLgorICoKKyAqIFdlIGFkZCBpbiB0aGUgbnVtYmVyIG9mIHBvdGVudGlhbGx5IGRpcnR5IGlub2RlcywgYmVjYXVzZSBlYWNoIGlub2RlIHdyaXRlCisgKiBjYW4gZGlydHkgcGFnZWNhY2hlIGluIHRoZSB1bmRlcmx5aW5nIGJsb2NrZGV2LgorICovCit2b2lkIHN5bmNfaW5vZGVzX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB3YWl0KQoreworCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCB3YmMgPSB7CisJCS5zeW5jX21vZGUJPSB3YWl0ID8gV0JfU1lOQ19BTEwgOiBXQl9TWU5DX0hPTEQsCisJfTsKKwl1bnNpZ25lZCBsb25nIG5yX2RpcnR5ID0gcmVhZF9wYWdlX3N0YXRlKG5yX2RpcnR5KTsKKwl1bnNpZ25lZCBsb25nIG5yX3Vuc3RhYmxlID0gcmVhZF9wYWdlX3N0YXRlKG5yX3Vuc3RhYmxlKTsKKworCXdiYy5ucl90b193cml0ZSA9IG5yX2RpcnR5ICsgbnJfdW5zdGFibGUgKworCQkJKGlub2Rlc19zdGF0Lm5yX2lub2RlcyAtIGlub2Rlc19zdGF0Lm5yX3VudXNlZCkgKworCQkJbnJfZGlydHkgKyBucl91bnN0YWJsZTsKKwl3YmMubnJfdG9fd3JpdGUgKz0gd2JjLm5yX3RvX3dyaXRlIC8gMjsJCS8qIEJpdCBtb3JlIGZvciBsdWNrICovCisJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwlzeW5jX3NiX2lub2RlcyhzYiwgJndiYyk7CisJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworfQorCisvKgorICogUmF0aGVyIGxhbWUgbGl2ZWxvY2sgYXZvaWRhbmNlLgorICovCitzdGF0aWMgdm9pZCBzZXRfc2Jfc3luY2luZyhpbnQgdmFsKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3Bpbl9sb2NrKCZzYl9sb2NrKTsKKwlzYiA9IHNiX2VudHJ5KHN1cGVyX2Jsb2Nrcy5wcmV2KTsKKwlmb3IgKDsgc2IgIT0gc2JfZW50cnkoJnN1cGVyX2Jsb2Nrcyk7IHNiID0gc2JfZW50cnkoc2ItPnNfbGlzdC5wcmV2KSkgeworCQlzYi0+c19zeW5jaW5nID0gdmFsOworCX0KKwlzcGluX3VubG9jaygmc2JfbG9jayk7Cit9CisKKy8qCisgKiBGaW5kIGEgc3VwZXJibG9jayB3aXRoIGlub2RlcyB0aGF0IG5lZWQgdG8gYmUgc3luY2VkCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmdldF9zdXBlcl90b19zeW5jKHZvaWQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKK3Jlc3RhcnQ6CisJc3Bpbl9sb2NrKCZzYl9sb2NrKTsKKwlzYiA9IHNiX2VudHJ5KHN1cGVyX2Jsb2Nrcy5wcmV2KTsKKwlmb3IgKDsgc2IgIT0gc2JfZW50cnkoJnN1cGVyX2Jsb2Nrcyk7IHNiID0gc2JfZW50cnkoc2ItPnNfbGlzdC5wcmV2KSkgeworCQlpZiAoc2ItPnNfc3luY2luZykKKwkJCWNvbnRpbnVlOworCQlzYi0+c19zeW5jaW5nID0gMTsKKwkJc2ItPnNfY291bnQrKzsKKwkJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCQlkb3duX3JlYWQoJnNiLT5zX3Vtb3VudCk7CisJCWlmICghc2ItPnNfcm9vdCkgeworCQkJZHJvcF9zdXBlcihzYik7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKwkJcmV0dXJuIHNiOworCX0KKwlzcGluX3VubG9jaygmc2JfbG9jayk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogc3luY19pbm9kZXMKKyAqCisgKiBzeW5jX2lub2RlcygpIGdvZXMgdGhyb3VnaCBlYWNoIHN1cGVyIGJsb2NrJ3MgZGlydHkgaW5vZGUgbGlzdCwgd3JpdGVzIHRoZQorICogaW5vZGVzIG91dCwgd2FpdHMgb24gdGhlIHdyaXRlb3V0IGFuZCBwdXRzIHRoZSBpbm9kZXMgYmFjayBvbiB0aGUgbm9ybWFsCisgKiBsaXN0LgorICoKKyAqIFRoaXMgaXMgZm9yIHN5c19zeW5jKCkuICBmc3luY19kZXYoKSB1c2VzIHRoZSBzYW1lIGFsZ29yaXRobS4gIFRoZSBzdWJ0bGUKKyAqIHBhcnQgb2YgdGhlIHN5bmMgZnVuY3Rpb25zIGlzIHRoYXQgdGhlIGJsb2NrZGV2ICJzdXBlcmJsb2NrIiBpcyBwcm9jZXNzZWQKKyAqIGxhc3QuICBUaGlzIGlzIGJlY2F1c2UgdGhlIHdyaXRlX2lub2RlKCkgZnVuY3Rpb24gb2YgYSB0eXBpY2FsIGZzIHdpbGwKKyAqIHBlcmZvcm0gbm8gSS9PLCBidXQgd2lsbCBtYXJrIGJ1ZmZlcnMgaW4gdGhlIGJsb2NrZGV2IG1hcHBpbmcgYXMgZGlydHkuCisgKiBXaGF0IHdlIHdhbnQgdG8gZG8gaXMgdG8gcGVyZm9ybSBhbGwgdGhhdCBkaXJ0eWluZyBmaXJzdCwgYW5kIHRoZW4gd3JpdGUKKyAqIGJhY2sgYWxsIHRob3NlIGlub2RlIGJsb2NrcyB2aWEgdGhlIGJsb2NrZGV2IG1hcHBpbmcgaW4gb25lIHN3ZWVwLiAgU28gdGhlCisgKiBhZGRpdGlvbmFsIChzb21ld2hhdCByZWR1bmRhbnQpIHN5bmNfYmxvY2tkZXYoKSBjYWxscyBoZXJlIGFyZSB0byBtYWtlCisgKiBzdXJlIHRoYXQgcmVhbGx5IGhhcHBlbnMuICBCZWNhdXNlIGlmIHdlIGNhbGwgc3luY19pbm9kZXNfc2Iod2FpdD0xKSB3aXRoCisgKiBvdXRzdGFuZGluZyBkaXJ0eSBpbm9kZXMsIHRoZSB3cml0ZWJhY2sgZ29lcyBibG9jay1hdC1hLXRpbWUgd2l0aGluIHRoZQorICogZmlsZXN5c3RlbSdzIHdyaXRlX2lub2RlKCkuICBUaGlzIGlzIGV4dHJlbWVseSBzbG93LgorICovCit2b2lkIHN5bmNfaW5vZGVzKGludCB3YWl0KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisKKwlzZXRfc2Jfc3luY2luZygwKTsKKwl3aGlsZSAoKHNiID0gZ2V0X3N1cGVyX3RvX3N5bmMoKSkgIT0gTlVMTCkgeworCQlzeW5jX2lub2Rlc19zYihzYiwgMCk7CisJCXN5bmNfYmxvY2tkZXYoc2ItPnNfYmRldik7CisJCWRyb3Bfc3VwZXIoc2IpOworCX0KKwlpZiAod2FpdCkgeworCQlzZXRfc2Jfc3luY2luZygwKTsKKwkJd2hpbGUgKChzYiA9IGdldF9zdXBlcl90b19zeW5jKCkpICE9IE5VTEwpIHsKKwkJCXN5bmNfaW5vZGVzX3NiKHNiLCAxKTsKKwkJCXN5bmNfYmxvY2tkZXYoc2ItPnNfYmRldik7CisJCQlkcm9wX3N1cGVyKHNiKTsKKwkJfQorCX0KK30KKworLyoqCisgKgl3cml0ZV9pbm9kZV9ub3cJLQl3cml0ZSBhbiBpbm9kZSB0byBkaXNrCisgKglAaW5vZGU6IGlub2RlIHRvIHdyaXRlIHRvIGRpc2sKKyAqCUBzeW5jOiB3aGV0aGVyIHRoZSB3cml0ZSBzaG91bGQgYmUgc3luY2hyb25vdXMgb3Igbm90CisgKgorICoJVGhpcyBmdW5jdGlvbiBjb21taXRzIGFuIGlub2RlIHRvIGRpc2sgaW1tZWRpYXRlbHkgaWYgaXQgaXMKKyAqCWRpcnR5LiBUaGlzIGlzIHByaW1hcmlseSBuZWVkZWQgYnkga25mc2QuCisgKi8KKyAKK2ludCB3cml0ZV9pbm9kZV9ub3coc3RydWN0IGlub2RlICppbm9kZSwgaW50IHN5bmMpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgd2JjID0geworCQkubnJfdG9fd3JpdGUgPSBMT05HX01BWCwKKwkJLnN5bmNfbW9kZSA9IFdCX1NZTkNfQUxMLAorCX07CisKKwlpZiAoIW1hcHBpbmdfY2FwX3dyaXRlYmFja19kaXJ0eShpbm9kZS0+aV9tYXBwaW5nKSkKKwkJcmV0dXJuIDA7CisKKwltaWdodF9zbGVlcCgpOworCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJcmV0ID0gX193cml0ZWJhY2tfc2luZ2xlX2lub2RlKGlub2RlLCAmd2JjKTsKKwlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisJaWYgKHN5bmMpCisJCXdhaXRfb25faW5vZGUoaW5vZGUpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHdyaXRlX2lub2RlX25vdyk7CisKKy8qKgorICogc3luY19pbm9kZSAtIHdyaXRlIGFuIGlub2RlIGFuZCBpdHMgcGFnZXMgdG8gZGlzay4KKyAqIEBpbm9kZTogdGhlIGlub2RlIHRvIHN5bmMKKyAqIEB3YmM6IGNvbnRyb2xzIHRoZSB3cml0ZWJhY2sgbW9kZQorICoKKyAqIHN5bmNfaW5vZGUoKSB3aWxsIHdyaXRlIGFuIGlub2RlIGFuZCBpdHMgcGFnZXMgdG8gZGlzay4gIEl0IHdpbGwgYWxzbworICogY29ycmVjdGx5IHVwZGF0ZSB0aGUgaW5vZGUgb24gaXRzIHN1cGVyYmxvY2sncyBkaXJ0eSBpbm9kZSBsaXN0cyBhbmQgd2lsbAorICogdXBkYXRlIGlub2RlLT5pX3N0YXRlLgorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGEgcmVmIG9uIHRoZSBpbm9kZS4KKyAqLworaW50IHN5bmNfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJaW50IHJldDsKKworCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJcmV0ID0gX193cml0ZWJhY2tfc2luZ2xlX2lub2RlKGlub2RlLCB3YmMpOworCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChzeW5jX2lub2RlKTsKKworLyoqCisgKiBnZW5lcmljX29zeW5jX2lub2RlIC0gZmx1c2ggYWxsIGRpcnR5IGRhdGEgZm9yIGEgZ2l2ZW4gaW5vZGUgdG8gZGlzaworICogQGlub2RlOiBpbm9kZSB0byB3cml0ZQorICogQHdoYXQ6ICB3aGF0IHRvIHdyaXRlIGFuZCB3YWl0IHVwb24KKyAqCisgKiBUaGlzIGNhbiBiZSBjYWxsZWQgYnkgZmlsZV93cml0ZSBmdW5jdGlvbnMgZm9yIGZpbGVzIHdoaWNoIGhhdmUgdGhlCisgKiBPX1NZTkMgZmxhZyBzZXQsIHRvIGZsdXNoIGRpcnR5IHdyaXRlcyB0byBkaXNrLgorICoKKyAqIEB3aGF0IGlzIGEgYml0bWFzaywgc3BlY2lmeWluZyB3aGljaCBwYXJ0IG9mIHRoZSBpbm9kZSdzIGRhdGEgc2hvdWxkIGJlCisgKiB3cml0dGVuIGFuZCB3YWl0ZWQgdXBvbjoKKyAqCisgKiAgICBPU1lOQ19EQVRBOiAgICAgaV9tYXBwaW5nJ3MgZGlydHkgZGF0YQorICogICAgT1NZTkNfTUVUQURBVEE6IHRoZSBidWZmZXJzIGF0IGlfbWFwcGluZy0+cHJpdmF0ZV9saXN0CisgKiAgICBPU1lOQ19JTk9ERTogICAgdGhlIGlub2RlIGl0c2VsZgorICovCisKK2ludCBnZW5lcmljX29zeW5jX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBpbnQgd2hhdCkKK3sKKwlpbnQgZXJyID0gMDsKKwlpbnQgbmVlZF93cml0ZV9pbm9kZV9ub3cgPSAwOworCWludCBlcnIyOworCisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfU1lOQ1dSSVRFOworCWlmICh3aGF0ICYgT1NZTkNfREFUQSkKKwkJZXJyID0gZmlsZW1hcF9mZGF0YXdyaXRlKG1hcHBpbmcpOworCWlmICh3aGF0ICYgKE9TWU5DX01FVEFEQVRBfE9TWU5DX0RBVEEpKSB7CisJCWVycjIgPSBzeW5jX21hcHBpbmdfYnVmZmVycyhtYXBwaW5nKTsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSBlcnIyOworCX0KKwlpZiAod2hhdCAmIE9TWU5DX0RBVEEpIHsKKwkJZXJyMiA9IGZpbGVtYXBfZmRhdGF3YWl0KG1hcHBpbmcpOworCQlpZiAoIWVycikKKwkJCWVyciA9IGVycjI7CisJfQorCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9TWU5DV1JJVEU7CisKKwlzcGluX2xvY2soJmlub2RlX2xvY2spOworCWlmICgoaW5vZGUtPmlfc3RhdGUgJiBJX0RJUlRZKSAmJgorCSAgICAoKHdoYXQgJiBPU1lOQ19JTk9ERSkgfHwgKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWV9EQVRBU1lOQykpKQorCQluZWVkX3dyaXRlX2lub2RlX25vdyA9IDE7CisJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCisJaWYgKG5lZWRfd3JpdGVfaW5vZGVfbm93KSB7CisJCWVycjIgPSB3cml0ZV9pbm9kZV9ub3coaW5vZGUsIDEpOworCQlpZiAoIWVycikKKwkJCWVyciA9IGVycjI7CisJfQorCWVsc2UKKwkJd2FpdF9vbl9pbm9kZShpbm9kZSk7CisKKwlyZXR1cm4gZXJyOworfQorCitFWFBPUlRfU1lNQk9MKGdlbmVyaWNfb3N5bmNfaW5vZGUpOworCisvKioKKyAqIHdyaXRlYmFja19hY3F1aXJlOiBhdHRlbXB0IHRvIGdldCBleGNsdXNpdmUgd3JpdGViYWNrIGFjY2VzcyB0byBhIGRldmljZQorICogQGJkaTogdGhlIGRldmljZSdzIGJhY2tpbmdfZGV2X2luZm8gc3RydWN0dXJlCisgKgorICogSXQgaXMgYSB3YXN0ZSBvZiByZXNvdXJjZXMgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIHBkZmx1c2ggdGhyZWFkIGJsb2NrZWQgb24KKyAqIGEgc2luZ2xlIHJlcXVlc3QgcXVldWUuICBFeGNsdXNpb24gYXQgdGhlIHJlcXVlc3RfcXVldWUgbGV2ZWwgaXMgb2J0YWluZWQKKyAqIHZpYSBhIGZsYWcgaW4gdGhlIHJlcXVlc3RfcXVldWUncyBiYWNraW5nX2Rldl9pbmZvLnN0YXRlLgorICoKKyAqIE5vbi1yZXF1ZXN0X3F1ZXVlLWJhY2tlZCBhZGRyZXNzX3NwYWNlcyB3aWxsIHNoYXJlIGRlZmF1bHRfYmFja2luZ19kZXZfaW5mbywKKyAqIHVubGVzcyB0aGV5IGltcGxlbWVudCB0aGVpciBvd24uICBXaGljaCBpcyBzb21ld2hhdCBpbmVmZmljaWVudCwgYXMgdGhpcworICogbWF5IHByZXZlbnQgY29uY3VycmVudCB3cml0ZWJhY2sgYWdhaW5zdCBtdWx0aXBsZSBkZXZpY2VzLgorICovCitpbnQgd3JpdGViYWNrX2FjcXVpcmUoc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSkKK3sKKwlyZXR1cm4gIXRlc3RfYW5kX3NldF9iaXQoQkRJX3BkZmx1c2gsICZiZGktPnN0YXRlKTsKK30KKworLyoqCisgKiB3cml0ZWJhY2tfaW5fcHJvZ3Jlc3M6IGRldGVybWluZSB3aGV0aGVyIHRoZXJlIGlzIHdyaXRlYmFjayBpbiBwcm9ncmVzcworICogICAgICAgICAgICAgICAgICAgICAgICBhZ2FpbnN0IGEgYmFja2luZyBkZXZpY2UuCisgKiBAYmRpOiB0aGUgZGV2aWNlJ3MgYmFja2luZ19kZXZfaW5mbyBzdHJ1Y3R1cmUuCisgKi8KK2ludCB3cml0ZWJhY2tfaW5fcHJvZ3Jlc3Moc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoQkRJX3BkZmx1c2gsICZiZGktPnN0YXRlKTsKK30KKworLyoqCisgKiB3cml0ZWJhY2tfcmVsZWFzZTogcmVsaW5xdWlzaCBleGNsdXNpdmUgd3JpdGViYWNrIGFjY2VzcyBhZ2FpbnN0IGEgZGV2aWNlLgorICogQGJkaTogdGhlIGRldmljZSdzIGJhY2tpbmdfZGV2X2luZm8gc3RydWN0dXJlCisgKi8KK3ZvaWQgd3JpdGViYWNrX3JlbGVhc2Uoc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSkKK3sKKwlCVUdfT04oIXdyaXRlYmFja19pbl9wcm9ncmVzcyhiZGkpKTsKKwljbGVhcl9iaXQoQkRJX3BkZmx1c2gsICZiZGktPnN0YXRlKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2hmcy9NYWtlZmlsZSBiL2ZzL2hmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDFmNWE4NQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDEwIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggaGZzIGZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19IRlNfRlMpICs9IGhmcy5vCisKK2hmcy1vYmpzIDo9IGJpdG1hcC5vIGJmaW5kLm8gYm5vZGUubyBicmVjLm8gYnRyZWUubyBcCisJICAgIGNhdGFsb2cubyBkaXIubyBleHRlbnQubyBpbm9kZS5vIGF0dHIubyBtZGIubyBcCisgICAgICAgICAgICBwYXJ0X3RibC5vIHN0cmluZy5vIHN1cGVyLm8gc3lzZGVwLm8gdHJhbnMubworCmRpZmYgLS1naXQgYS9mcy9oZnMvYXR0ci5jIGIvZnMvaGZzL2F0dHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDU3ZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzL2F0dHIuYwpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqICBsaW51eC9mcy9oZnMvYXR0ci5jCisgKgorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICoKKyAqIEV4cG9ydCBoZnMgZGF0YSB2aWEgeGF0dHIKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CisKKyNpbmNsdWRlICJoZnNfZnMuaCIKKyNpbmNsdWRlICJidHJlZS5oIgorCitpbnQgaGZzX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJaGZzX2NhdF9yZWMgcmVjOworCXN0cnVjdCBoZnNfY2F0X2ZpbGUgKmZpbGU7CisJaW50IHJlczsKKworCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBIRlNfSVNfUlNSQyhpbm9kZSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXJlcyA9IGhmc19maW5kX2luaXQoSEZTX1NCKGlub2RlLT5pX3NiKS0+Y2F0X3RyZWUsICZmZCk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKwlmZC5zZWFyY2hfa2V5LT5jYXQgPSBIRlNfSShpbm9kZSktPmNhdF9rZXk7CisJcmVzID0gaGZzX2JyZWNfZmluZCgmZmQpOworCWlmIChyZXMpCisJCWdvdG8gb3V0OworCWhmc19ibm9kZV9yZWFkKGZkLmJub2RlLCAmcmVjLCBmZC5lbnRyeW9mZnNldCwKKwkJCXNpemVvZihzdHJ1Y3QgaGZzX2NhdF9maWxlKSk7CisJZmlsZSA9ICZyZWMuZmlsZTsKKworCWlmICghc3RyY21wKG5hbWUsICJoZnMudHlwZSIpKSB7CisJCWlmIChzaXplID09IDQpCisJCQltZW1jcHkoJmZpbGUtPlVzcldkcy5mZFR5cGUsIHZhbHVlLCA0KTsKKwkJZWxzZQorCQkJcmVzID0gLUVSQU5HRTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImhmcy5jcmVhdG9yIikpIHsKKwkJaWYgKHNpemUgPT0gNCkKKwkJCW1lbWNweSgmZmlsZS0+VXNyV2RzLmZkQ3JlYXRvciwgdmFsdWUsIDQpOworCQllbHNlCisJCQlyZXMgPSAtRVJBTkdFOworCX0gZWxzZQorCQlyZXMgPSAtRU9QTk9UU1VQUDsKKwlpZiAoIXJlcykKKwkJaGZzX2Jub2RlX3dyaXRlKGZkLmJub2RlLCAmcmVjLCBmZC5lbnRyeW9mZnNldCwKKwkJCQlzaXplb2Yoc3RydWN0IGhmc19jYXRfZmlsZSkpOworb3V0OgorCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gcmVzOworfQorCitzc2l6ZV90IGhmc19nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJaGZzX2NhdF9yZWMgcmVjOworCXN0cnVjdCBoZnNfY2F0X2ZpbGUgKmZpbGU7CisJc3NpemVfdCByZXMgPSAwOworCisJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpIHx8IEhGU19JU19SU1JDKGlub2RlKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKHNpemUpIHsKKwkJcmVzID0gaGZzX2ZpbmRfaW5pdChIRlNfU0IoaW5vZGUtPmlfc2IpLT5jYXRfdHJlZSwgJmZkKTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiByZXM7CisJCWZkLnNlYXJjaF9rZXktPmNhdCA9IEhGU19JKGlub2RlKS0+Y2F0X2tleTsKKwkJcmVzID0gaGZzX2JyZWNfZmluZCgmZmQpOworCQlpZiAocmVzKQorCQkJZ290byBvdXQ7CisJCWhmc19ibm9kZV9yZWFkKGZkLmJub2RlLCAmcmVjLCBmZC5lbnRyeW9mZnNldCwKKwkJCQlzaXplb2Yoc3RydWN0IGhmc19jYXRfZmlsZSkpOworCX0KKwlmaWxlID0gJnJlYy5maWxlOworCisJaWYgKCFzdHJjbXAobmFtZSwgImhmcy50eXBlIikpIHsKKwkJaWYgKHNpemUgPj0gNCkgeworCQkJbWVtY3B5KHZhbHVlLCAmZmlsZS0+VXNyV2RzLmZkVHlwZSwgNCk7CisJCQlyZXMgPSA0OworCQl9IGVsc2UKKwkJCXJlcyA9IHNpemUgPyAtRVJBTkdFIDogNDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImhmcy5jcmVhdG9yIikpIHsKKwkJaWYgKHNpemUgPj0gNCkgeworCQkJbWVtY3B5KHZhbHVlLCAmZmlsZS0+VXNyV2RzLmZkQ3JlYXRvciwgNCk7CisJCQlyZXMgPSA0OworCQl9IGVsc2UKKwkJCXJlcyA9IHNpemUgPyAtRVJBTkdFIDogNDsKKwl9IGVsc2UKKwkJcmVzID0gLUVOT0RBVEE7CitvdXQ6CisJaWYgKHNpemUpCisJCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gcmVzOworfQorCisjZGVmaW5lIEhGU19BVFRSTElTVF9TSVpFIChzaXplb2YoImhmcy5jcmVhdG9yIikrc2l6ZW9mKCJoZnMudHlwZSIpKQorCitzc2l6ZV90IGhmc19saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwgSEZTX0lTX1JTUkMoaW5vZGUpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoIWJ1ZmZlciB8fCAhc2l6ZSkKKwkJcmV0dXJuIEhGU19BVFRSTElTVF9TSVpFOworCWlmIChzaXplIDwgSEZTX0FUVFJMSVNUX1NJWkUpCisJCXJldHVybiAtRVJBTkdFOworCXN0cmNweShidWZmZXIsICJoZnMudHlwZSIpOworCXN0cmNweShidWZmZXIgKyBzaXplb2YoImhmcy50eXBlIiksICJoZnMuY3JlYXRvciIpOworCisJcmV0dXJuIEhGU19BVFRSTElTVF9TSVpFOworfQpkaWZmIC0tZ2l0IGEvZnMvaGZzL2JmaW5kLmMgYi9mcy9oZnMvYmZpbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTQ1MGFlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzL2JmaW5kLmMKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzL2JmaW5kLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEKKyAqIEJyYWQgQm95ZXIgKGZsYXJAYWxsYW5kcmlhLmNvbSkKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqCisgKiBTZWFyY2ggcm91dGluZXMgZm9yIGJ0cmVlcworICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSAiYnRyZWUuaCIKKworaW50IGhmc19maW5kX2luaXQoc3RydWN0IGhmc19idHJlZSAqdHJlZSwgc3RydWN0IGhmc19maW5kX2RhdGEgKmZkKQoreworCXZvaWQgKnB0cjsKKworCWZkLT50cmVlID0gdHJlZTsKKwlmZC0+Ym5vZGUgPSBOVUxMOworCXB0ciA9IGttYWxsb2ModHJlZS0+bWF4X2tleV9sZW4gKiAyICsgNCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdHIpCisJCXJldHVybiAtRU5PTUVNOworCWZkLT5zZWFyY2hfa2V5ID0gcHRyOworCWZkLT5rZXkgPSBwdHIgKyB0cmVlLT5tYXhfa2V5X2xlbiArIDI7CisJZHByaW50KERCR19CTk9ERV9SRUZTLCAiZmluZF9pbml0OiAlZCAoJXApXG4iLCB0cmVlLT5jbmlkLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCWRvd24oJnRyZWUtPnRyZWVfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaGZzX2ZpbmRfZXhpdChzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQpCit7CisJaGZzX2Jub2RlX3B1dChmZC0+Ym5vZGUpOworCWtmcmVlKGZkLT5zZWFyY2hfa2V5KTsKKwlkcHJpbnQoREJHX0JOT0RFX1JFRlMsICJmaW5kX2V4aXQ6ICVkICglcClcbiIsIGZkLT50cmVlLT5jbmlkLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCXVwKCZmZC0+dHJlZS0+dHJlZV9sb2NrKTsKKwlmZC0+dHJlZSA9IE5VTEw7Cit9CisKKy8qIEZpbmQgdGhlIHJlY29yZCBpbiBibm9kZSB0aGF0IGJlc3QgbWF0Y2hlcyBrZXkgKG5vdCBncmVhdGVyIHRoYW4uLi4pKi8KK2ludCBfX2hmc19icmVjX2ZpbmQoc3RydWN0IGhmc19ibm9kZSAqYm5vZGUsIHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCkKK3sKKwlpbnQgY21wdmFsOworCXUxNiBvZmYsIGxlbiwga2V5bGVuOworCWludCByZWM7CisJaW50IGIsIGU7CisJaW50IHJlczsKKworCWIgPSAwOworCWUgPSBibm9kZS0+bnVtX3JlY3MgLSAxOworCXJlcyA9IC1FTk9FTlQ7CisJZG8geworCQlyZWMgPSAoZSArIGIpIC8gMjsKKwkJbGVuID0gaGZzX2JyZWNfbGVub2ZmKGJub2RlLCByZWMsICZvZmYpOworCQlrZXlsZW4gPSBoZnNfYnJlY19rZXlsZW4oYm5vZGUsIHJlYyk7CisJCWhmc19ibm9kZV9yZWFkKGJub2RlLCBmZC0+a2V5LCBvZmYsIGtleWxlbik7CisJCWNtcHZhbCA9IGJub2RlLT50cmVlLT5rZXljbXAoZmQtPmtleSwgZmQtPnNlYXJjaF9rZXkpOworCQlpZiAoIWNtcHZhbCkgeworCQkJZSA9IHJlYzsKKwkJCXJlcyA9IDA7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJaWYgKGNtcHZhbCA8IDApCisJCQliID0gcmVjICsgMTsKKwkJZWxzZQorCQkJZSA9IHJlYyAtIDE7CisJfSB3aGlsZSAoYiA8PSBlKTsKKwkvL3ByaW50aygiJWQ6ICVkLCVkLCVkXG4iLCBibm9kZS0+dGhpcywgYiwgZSwgcmVjKTsKKwlpZiAocmVjICE9IGUgJiYgZSA+PSAwKSB7CisJCWxlbiA9IGhmc19icmVjX2xlbm9mZihibm9kZSwgZSwgJm9mZik7CisJCWtleWxlbiA9IGhmc19icmVjX2tleWxlbihibm9kZSwgZSk7CisJCWhmc19ibm9kZV9yZWFkKGJub2RlLCBmZC0+a2V5LCBvZmYsIGtleWxlbik7CisJfQorZG9uZToKKwlmZC0+cmVjb3JkID0gZTsKKwlmZC0+a2V5b2Zmc2V0ID0gb2ZmOworCWZkLT5rZXlsZW5ndGggPSBrZXlsZW47CisJZmQtPmVudHJ5b2Zmc2V0ID0gb2ZmICsga2V5bGVuOworCWZkLT5lbnRyeWxlbmd0aCA9IGxlbiAtIGtleWxlbjsKKwlyZXR1cm4gcmVzOworfQorCisvKiBUcmF2ZXJzZSBhIEIqVHJlZSBmcm9tIHRoZSByb290IHRvIGEgbGVhZiBmaW5kaW5nIGJlc3QgZml0IHRvIGtleSAqLworLyogUmV0dXJuIGFsbG9jYXRlZCBjb3B5IG9mIG5vZGUgZm91bmQsIHNldCByZWNudW0gdG8gYmVzdCByZWNvcmQgKi8KK2ludCBoZnNfYnJlY19maW5kKHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBoZnNfYm5vZGUgKmJub2RlOworCXUzMiBuaWR4LCBwYXJlbnQ7CisJX19iZTMyIGRhdGE7CisJaW50IGhlaWdodCwgcmVzOworCisJdHJlZSA9IGZkLT50cmVlOworCWlmIChmZC0+Ym5vZGUpCisJCWhmc19ibm9kZV9wdXQoZmQtPmJub2RlKTsKKwlmZC0+Ym5vZGUgPSBOVUxMOworCW5pZHggPSB0cmVlLT5yb290OworCWlmICghbmlkeCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJaGVpZ2h0ID0gdHJlZS0+ZGVwdGg7CisJcmVzID0gMDsKKwlwYXJlbnQgPSAwOworCWZvciAoOzspIHsKKwkJYm5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBuaWR4KTsKKwkJaWYgKElTX0VSUihibm9kZSkpIHsKKwkJCXJlcyA9IFBUUl9FUlIoYm5vZGUpOworCQkJYm5vZGUgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGJub2RlLT5oZWlnaHQgIT0gaGVpZ2h0KQorCQkJZ290byBpbnZhbGlkOworCQlpZiAoYm5vZGUtPnR5cGUgIT0gKC0taGVpZ2h0ID8gSEZTX05PREVfSU5ERVggOiBIRlNfTk9ERV9MRUFGKSkKKwkJCWdvdG8gaW52YWxpZDsKKwkJYm5vZGUtPnBhcmVudCA9IHBhcmVudDsKKworCQlyZXMgPSBfX2hmc19icmVjX2ZpbmQoYm5vZGUsIGZkKTsKKwkJaWYgKCFoZWlnaHQpCisJCQlicmVhazsKKwkJaWYgKGZkLT5yZWNvcmQgPCAwKQorCQkJZ290byByZWxlYXNlOworCisJCXBhcmVudCA9IG5pZHg7CisJCWhmc19ibm9kZV9yZWFkKGJub2RlLCAmZGF0YSwgZmQtPmVudHJ5b2Zmc2V0LCA0KTsKKwkJbmlkeCA9IGJlMzJfdG9fY3B1KGRhdGEpOworCQloZnNfYm5vZGVfcHV0KGJub2RlKTsKKwl9CisJZmQtPmJub2RlID0gYm5vZGU7CisJcmV0dXJuIHJlczsKKworaW52YWxpZDoKKwlwcmludGsoIkhGUzogaW5jb25zaXN0ZW5jeSBpbiBCKlRyZWUgKCVkLCVkLCVkLCV1LCV1KVxuIiwKKwkJaGVpZ2h0LCBibm9kZS0+aGVpZ2h0LCBibm9kZS0+dHlwZSwgbmlkeCwgcGFyZW50KTsKKwlyZXMgPSAtRUlPOworcmVsZWFzZToKKwloZnNfYm5vZGVfcHV0KGJub2RlKTsKKwlyZXR1cm4gcmVzOworfQorCitpbnQgaGZzX2JyZWNfcmVhZChzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQsIHZvaWQgKnJlYywgaW50IHJlY19sZW4pCit7CisJaW50IHJlczsKKworCXJlcyA9IGhmc19icmVjX2ZpbmQoZmQpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisJaWYgKGZkLT5lbnRyeWxlbmd0aCA+IHJlY19sZW4pCisJCXJldHVybiAtRUlOVkFMOworCWhmc19ibm9kZV9yZWFkKGZkLT5ibm9kZSwgcmVjLCBmZC0+ZW50cnlvZmZzZXQsIGZkLT5lbnRyeWxlbmd0aCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBoZnNfYnJlY19nb3RvKHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCwgaW50IGNudCkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBoZnNfYm5vZGUgKmJub2RlOworCWludCBpZHgsIHJlcyA9IDA7CisJdTE2IG9mZiwgbGVuLCBrZXlsZW47CisKKwlibm9kZSA9IGZkLT5ibm9kZTsKKwl0cmVlID0gYm5vZGUtPnRyZWU7CisKKwlpZiAoY250IDwgMCkgeworCQljbnQgPSAtY250OworCQl3aGlsZSAoY250ID4gZmQtPnJlY29yZCkgeworCQkJY250IC09IGZkLT5yZWNvcmQgKyAxOworCQkJZmQtPnJlY29yZCA9IGJub2RlLT5udW1fcmVjcyAtIDE7CisJCQlpZHggPSBibm9kZS0+cHJldjsKKwkJCWlmICghaWR4KSB7CisJCQkJcmVzID0gLUVOT0VOVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWhmc19ibm9kZV9wdXQoYm5vZGUpOworCQkJYm5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBpZHgpOworCQkJaWYgKElTX0VSUihibm9kZSkpIHsKKwkJCQlyZXMgPSBQVFJfRVJSKGJub2RlKTsKKwkJCQlibm9kZSA9IE5VTEw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJZmQtPnJlY29yZCAtPSBjbnQ7CisJfSBlbHNlIHsKKwkJd2hpbGUgKGNudCA+PSBibm9kZS0+bnVtX3JlY3MgLSBmZC0+cmVjb3JkKSB7CisJCQljbnQgLT0gYm5vZGUtPm51bV9yZWNzIC0gZmQtPnJlY29yZDsKKwkJCWZkLT5yZWNvcmQgPSAwOworCQkJaWR4ID0gYm5vZGUtPm5leHQ7CisJCQlpZiAoIWlkeCkgeworCQkJCXJlcyA9IC1FTk9FTlQ7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQloZnNfYm5vZGVfcHV0KGJub2RlKTsKKwkJCWJub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgaWR4KTsKKwkJCWlmIChJU19FUlIoYm5vZGUpKSB7CisJCQkJcmVzID0gUFRSX0VSUihibm9kZSk7CisJCQkJYm5vZGUgPSBOVUxMOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCWZkLT5yZWNvcmQgKz0gY250OworCX0KKworCWxlbiA9IGhmc19icmVjX2xlbm9mZihibm9kZSwgZmQtPnJlY29yZCwgJm9mZik7CisJa2V5bGVuID0gaGZzX2JyZWNfa2V5bGVuKGJub2RlLCBmZC0+cmVjb3JkKTsKKwlmZC0+a2V5b2Zmc2V0ID0gb2ZmOworCWZkLT5rZXlsZW5ndGggPSBrZXlsZW47CisJZmQtPmVudHJ5b2Zmc2V0ID0gb2ZmICsga2V5bGVuOworCWZkLT5lbnRyeWxlbmd0aCA9IGxlbiAtIGtleWxlbjsKKwloZnNfYm5vZGVfcmVhZChibm9kZSwgZmQtPmtleSwgb2ZmLCBrZXlsZW4pOworb3V0OgorCWZkLT5ibm9kZSA9IGJub2RlOworCXJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9mcy9oZnMvYml0bWFwLmMgYi9mcy9oZnMvYml0bWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlNzU3OQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9iaXRtYXAuYwpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqICBsaW51eC9mcy9oZnMvYml0bWFwLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5NyAgUGF1bCBILiBIYXJncm92ZQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIEJhc2VkIG9uIEdQTGVkIGNvZGUgQ29weXJpZ2h0IChDKSAxOTk1ICBNaWNoYWVsIERyZWhlcgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSB0byBtb2RpZnkgdGhlIHZvbHVtZSBiaXRtYXA6CisgKiBzZWFyY2gvc2V0L2NsZWFyIGJpdHMuCisgKi8KKworI2luY2x1ZGUgImhmc19mcy5oIgorCisvKgorICogaGZzX2ZpbmRfemVyb19iaXQoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogIEdpdmVuIGEgYmxvY2sgb2YgbWVtb3J5LCBpdHMgbGVuZ3RoIGluIGJpdHMsIGFuZCBhIHN0YXJ0aW5nIGJpdCBudW1iZXIsCisgKiAgZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgdGhlIGZpcnN0IHplcm8gYml0cyAoaW4gbGVmdC10by1yaWdodCBvcmRlcmluZykKKyAqICBpbiB0aGF0IHJhbmdlLgorICoKKyAqICBSZXR1cm5zID49ICdzaXplJyBpZiBubyB6ZXJvIGJpdHMgYXJlIGZvdW5kIGluIHRoZSByYW5nZS4KKyAqCisgKiAgQWNjZXNzZXMgbWVtb3J5IGluIDMyLWJpdCBhbGlnbmVkIGNodW5rcyBvZiAzMi1iaXRzIGFuZCB0aHVzCisgKiAgbWF5IHJlYWQgYmV5b25kIHRoZSAnc2l6ZSd0aCBiaXQuCisgKi8KK3N0YXRpYyB1MzIgaGZzX2ZpbmRfc2V0X3plcm9fYml0cyhfX2JlMzIgKmJpdG1hcCwgdTMyIHNpemUsIHUzMiBvZmZzZXQsIHUzMiAqbWF4KQoreworCV9fYmUzMiAqY3VyciwgKmVuZDsKKwl1MzIgbWFzaywgc3RhcnQsIGxlbiwgbjsKKwlfX2JlMzIgdmFsOworCWludCBpOworCisJbGVuID0gKm1heDsKKwlpZiAoIWxlbikKKwkJcmV0dXJuIHNpemU7CisKKwljdXJyID0gYml0bWFwICsgKG9mZnNldCAvIDMyKTsKKwllbmQgPSBiaXRtYXAgKyAoKHNpemUgKyAzMSkgLyAzMik7CisKKwkvKiBzY2FuIHRoZSBmaXJzdCBwYXJ0aWFsIHUzMiBmb3IgemVybyBiaXRzICovCisJdmFsID0gKmN1cnI7CisJaWYgKH52YWwpIHsKKwkJbiA9IGJlMzJfdG9fY3B1KHZhbCk7CisJCWkgPSBvZmZzZXQgJSAzMjsKKwkJbWFzayA9ICgxVSA8PCAzMSkgPj4gaTsKKwkJZm9yICg7IGkgPCAzMjsgbWFzayA+Pj0gMSwgaSsrKSB7CisJCQlpZiAoIShuICYgbWFzaykpCisJCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKworCS8qIHNjYW4gY29tcGxldGUgdTMycyBmb3IgdGhlIGZpcnN0IHplcm8gYml0ICovCisJd2hpbGUgKCsrY3VyciA8IGVuZCkgeworCQl2YWwgPSAqY3VycjsKKwkJaWYgKH52YWwpIHsKKwkJCW4gPSBiZTMyX3RvX2NwdSh2YWwpOworCQkJbWFzayA9IDEgPDwgMzE7CisJCQlmb3IgKGkgPSAwOyBpIDwgMzI7IG1hc2sgPj49IDEsIGkrKykgeworCQkJCWlmICghKG4gJiBtYXNrKSkKKwkJCQkJZ290byBmb3VuZDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gc2l6ZTsKKworZm91bmQ6CisJc3RhcnQgPSAoY3VyciAtIGJpdG1hcCkgKiAzMiArIGk7CisJaWYgKHN0YXJ0ID49IHNpemUpCisJCXJldHVybiBzdGFydDsKKwkvKiBkbyBhbnkgcGFydGlhbCB1MzIgYXQgdGhlIHN0YXJ0ICovCisJbGVuID0gbWluKHNpemUgLSBzdGFydCwgbGVuKTsKKwl3aGlsZSAoMSkgeworCQluIHw9IG1hc2s7CisJCWlmICgrK2kgPj0gMzIpCisJCQlicmVhazsKKwkJbWFzayA+Pj0gMTsKKwkJaWYgKCEtLWxlbiB8fCBuICYgbWFzaykKKwkJCWdvdG8gZG9uZTsKKwl9CisJaWYgKCEtLWxlbikKKwkJZ290byBkb25lOworCSpjdXJyKysgPSBjcHVfdG9fYmUzMihuKTsKKwkvKiBkbyBmdWxsIHUzMnMgKi8KKwl3aGlsZSAoMSkgeworCQluID0gYmUzMl90b19jcHUoKmN1cnIpOworCQlpZiAobGVuIDwgMzIpCisJCQlicmVhazsKKwkJaWYgKG4pIHsKKwkJCWxlbiA9IDMyOworCQkJYnJlYWs7CisJCX0KKwkJKmN1cnIrKyA9IGNwdV90b19iZTMyKDB4ZmZmZmZmZmYpOworCQlsZW4gLT0gMzI7CisJfQorCS8qIGRvIGFueSBwYXJ0aWFsIHUzMiBhdCBlbmQgKi8KKwltYXNrID0gMVUgPDwgMzE7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmIChuICYgbWFzaykKKwkJCWJyZWFrOworCQluIHw9IG1hc2s7CisJCW1hc2sgPj49IDE7CisJfQorZG9uZToKKwkqY3VyciA9IGNwdV90b19iZTMyKG4pOworCSptYXggPSAoY3VyciAtIGJpdG1hcCkgKiAzMiArIGkgLSBzdGFydDsKKwlyZXR1cm4gc3RhcnQ7Cit9CisKKy8qCisgKiBoZnNfdmJtX3NlYXJjaF9mcmVlKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgU2VhcmNoIGZvciAnbnVtX2JpdHMnIGNvbnNlY3V0aXZlIGNsZWFyZWQgYml0cyBpbiB0aGUgYml0bWFwIGJsb2NrcyBvZgorICogICB0aGUgaGZzIE1EQi4gJ21kYicgaGFkIGJldHRlciBiZSBsb2NrZWQgb3IgdGhlIHJldHVybmVkIHJhbmdlCisgKiAgIG1heSBiZSBubyBsb25nZXIgZnJlZSwgd2hlbiB0aGlzIGZ1bmN0aW9ucyByZXR1cm5zIQorICogICBYWFggQ3VycmVudGx5IHRoZSBzZWFyY2ggc3RhcnRzIGZyb20gYml0IDAsIGJ1dCBpdCBzaG91bGQgc3RhcnQgd2l0aAorICogICB0aGUgYml0IG51bWJlciBzdG9yZWQgaW4gJ3NfYWxsb2NfcHRyJyBvZiB0aGUgTURCLgorICogSW5wdXQgVmFyaWFibGUocyk6CisgKiAgIHN0cnVjdCBoZnNfbWRiICptZGI6IFBvaW50ZXIgdG8gdGhlIGhmcyBNREIKKyAqICAgdTE2ICpudW1fYml0czogUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGNsZWFyZWQgYml0cworICogICAgIHRvIHNlYXJjaCBmb3IKKyAqIE91dHB1dCBWYXJpYWJsZShzKToKKyAqICAgdTE2ICpudW1fYml0czogVGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBjbGVhciBiaXRzIG9mIHRoZQorICogICAgIHJldHVybmVkIHJhbmdlLiBJZiB0aGUgYml0bWFwIGlzIGZyYWdtZW50ZWQsIHRoaXMgd2lsbCBiZSBsZXNzIHRoYW4KKyAqICAgICByZXF1ZXN0ZWQgYW5kIGl0IHdpbGwgYmUgemVybywgd2hlbiB0aGUgZGlzayBpcyBmdWxsLgorICogUmV0dXJuczoKKyAqICAgVGhlIG51bWJlciBvZiB0aGUgZmlyc3QgYml0IG9mIHRoZSByYW5nZSBvZiBjbGVhcmVkIGJpdHMgd2hpY2ggaGFzIGJlZW4KKyAqICAgZm91bmQuIFdoZW4gJ251bV9iaXRzJyBpcyB6ZXJvLCB0aGlzIGlzIGludmFsaWQhCisgKiBQcmVjb25kaXRpb25zOgorICogICAnbWRiJyBwb2ludHMgdG8gYSAidmFsaWQiIChzdHJ1Y3QgaGZzX21kYikuCisgKiAgICdudW1fYml0cycgcG9pbnRzIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAodTE2KSwgd2hpY2ggY29udGFpbnMKKyAqCXRoZSBudW1iZXIgb2YgY2xlYXJlZCBiaXRzIHRvIGZpbmQuCisgKiBQb3N0Y29uZGl0aW9uczoKKyAqICAgJ251bV9iaXRzJyBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgZm91bmQgc2VxdWVuY2UuCisgKi8KK3UzMiBoZnNfdmJtX3NlYXJjaF9mcmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHUzMiBnb2FsLCB1MzIgKm51bV9iaXRzKQoreworCXZvaWQgKmJpdG1hcDsKKwl1MzIgcG9zOworCisJLyogbWFrZSBzdXJlIHdlIGhhdmUgYWN0dWFsIHdvcmsgdG8gcGVyZm9ybSAqLworCWlmICghKm51bV9iaXRzKQorCQlyZXR1cm4gMDsKKworCWRvd24oJkhGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKKwliaXRtYXAgPSBIRlNfU0Ioc2IpLT5iaXRtYXA7CisKKwlwb3MgPSBoZnNfZmluZF9zZXRfemVyb19iaXRzKGJpdG1hcCwgSEZTX1NCKHNiKS0+ZnNfYWJsb2NrcywgZ29hbCwgbnVtX2JpdHMpOworCWlmIChwb3MgPj0gSEZTX1NCKHNiKS0+ZnNfYWJsb2NrcykgeworCQlpZiAoZ29hbCkKKwkJCXBvcyA9IGhmc19maW5kX3NldF96ZXJvX2JpdHMoYml0bWFwLCBnb2FsLCAwLCBudW1fYml0cyk7CisJCWlmIChwb3MgPj0gSEZTX1NCKHNiKS0+ZnNfYWJsb2NrcykgeworCQkJKm51bV9iaXRzID0gcG9zID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJZHByaW50KERCR19CSVRNQVAsICJhbGxvY19iaXRzOiAldSwldVxuIiwgcG9zLCAqbnVtX2JpdHMpOworCUhGU19TQihzYiktPmZyZWVfYWJsb2NrcyAtPSAqbnVtX2JpdHM7CisJaGZzX2JpdG1hcF9kaXJ0eShzYik7CitvdXQ6CisJdXAoJkhGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKKwlyZXR1cm4gcG9zOworfQorCisKKy8qCisgKiBoZnNfY2xlYXJfdmJtX2JpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBDbGVhciB0aGUgcmVxdWVzdGVkIGJpdHMgaW4gdGhlIHZvbHVtZSBiaXRtYXAgb2YgdGhlIGhmcyBmaWxlc3lzdGVtCisgKiBJbnB1dCBWYXJpYWJsZShzKToKKyAqICAgc3RydWN0IGhmc19tZGIgKm1kYjogUG9pbnRlciB0byB0aGUgaGZzIE1EQgorICogICB1MTYgc3RhcnQ6IFRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGJpdAorICogICB1MTYgY291bnQ6IFRoZSBudW1iZXIgb2YgYml0cworICogT3V0cHV0IFZhcmlhYmxlKHMpOgorICogICBOb25lCisgKiBSZXR1cm5zOgorICogICAgMDogbm8gZXJyb3IKKyAqICAgLTE6IE9uZSBvZiB0aGUgYml0cyB3YXMgYWxyZWFkeSBjbGVhci4gIFRoaXMgaXMgYSBzdHJhbmdlCisgKgkgZXJyb3IgYW5kIHdoZW4gaXQgaGFwcGVucywgdGhlIGZpbGVzeXN0ZW0gbXVzdCBiZSByZXBhaXJlZCEKKyAqICAgLTI6IE9uZSBvciBtb3JlIG9mIHRoZSBiaXRzIGFyZSBvdXQgb2YgcmFuZ2Ugb2YgdGhlIGJpdG1hcC4KKyAqIFByZWNvbmRpdGlvbnM6CisgKiAgICdtZGInIHBvaW50cyB0byBhICJ2YWxpZCIgKHN0cnVjdCBoZnNfbWRiKS4KKyAqIFBvc3Rjb25kaXRpb25zOgorICogICBTdGFydGluZyB3aXRoIGJpdCBudW1iZXIgJ3N0YXJ0JywgJ2NvdW50JyBiaXRzIGluIHRoZSB2b2x1bWUgYml0bWFwCisgKiAgIGFyZSBjbGVhcmVkLiBUaGUgYWZmZWN0ZWQgYml0bWFwIGJsb2NrcyBhcmUgbWFya2VkICJkaXJ0eSIsIHRoZSBmcmVlCisgKiAgIGJsb2NrIGNvdW50IG9mIHRoZSBNREIgaXMgdXBkYXRlZCBhbmQgdGhlIE1EQiBpcyBtYXJrZWQgZGlydHkuCisgKi8KK2ludCBoZnNfY2xlYXJfdmJtX2JpdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdTE2IHN0YXJ0LCB1MTYgY291bnQpCit7CisJX19iZTMyICpjdXJyOworCXUzMiBtYXNrOworCWludCBpLCBsZW47CisKKwkvKiBpcyB0aGVyZSBhbnkgYWN0dWFsIHdvcmsgdG8gYmUgZG9uZT8gKi8KKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gMDsKKworCWRwcmludChEQkdfQklUTUFQLCAiY2xlYXJfYml0czogJXUsJXVcbiIsIHN0YXJ0LCBjb3VudCk7CisJLyogYXJlIGFsbCBvZiB0aGUgYml0cyBpbiByYW5nZT8gKi8KKwlpZiAoKHN0YXJ0ICsgY291bnQpID4gSEZTX1NCKHNiKS0+ZnNfYWJsb2NrcykKKwkJcmV0dXJuIC0yOworCisJZG93bigmSEZTX1NCKHNiKS0+Yml0bWFwX2xvY2spOworCS8qIGJpdG1hcCBpcyBhbHdheXMgb24gYSAzMi1iaXQgYm91bmRhcnkgKi8KKwljdXJyID0gSEZTX1NCKHNiKS0+Yml0bWFwICsgKHN0YXJ0IC8gMzIpOworCWxlbiA9IGNvdW50OworCisJLyogZG8gYW55IHBhcnRpYWwgdTMyIGF0IHRoZSBzdGFydCAqLworCWkgPSBzdGFydCAlIDMyOworCWlmIChpKSB7CisJCWludCBqID0gMzIgLSBpOworCQltYXNrID0gMHhmZmZmZmZmZlUgPDwgajsKKwkJaWYgKGogPiBjb3VudCkgeworCQkJbWFzayB8PSAweGZmZmZmZmZmVSA+PiAoaSArIGNvdW50KTsKKwkJCSpjdXJyICY9IGNwdV90b19iZTMyKG1hc2spOworCQkJZ290byBvdXQ7CisJCX0KKwkJKmN1cnIrKyAmPSBjcHVfdG9fYmUzMihtYXNrKTsKKwkJY291bnQgLT0gajsKKwl9CisKKwkvKiBkbyBmdWxsIHUzMnMgKi8KKwl3aGlsZSAoY291bnQgPj0gMzIpIHsKKwkJKmN1cnIrKyA9IDA7CisJCWNvdW50IC09IDMyOworCX0KKwkvKiBkbyBhbnkgcGFydGlhbCB1MzIgYXQgZW5kICovCisJaWYgKGNvdW50KSB7CisJCW1hc2sgPSAweGZmZmZmZmZmVSA+PiBjb3VudDsKKwkJKmN1cnIgJj0gY3B1X3RvX2JlMzIobWFzayk7CisJfQorb3V0OgorCUhGU19TQihzYiktPmZyZWVfYWJsb2NrcyArPSBsZW47CisJdXAoJkhGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKKwloZnNfYml0bWFwX2RpcnR5KHNiKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvaGZzL2Jub2RlLmMgYi9mcy9oZnMvYm5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWQxMjExCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzL2Jub2RlLmMKQEAgLTAsMCArMSw0OTggQEAKKy8qCisgKiAgbGludXgvZnMvaGZzL2Jub2RlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEKKyAqIEJyYWQgQm95ZXIgKGZsYXJAYWxsYW5kcmlhLmNvbSkKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqCisgKiBIYW5kbGUgYmFzaWMgYnRyZWUgbm9kZSBvcGVyYXRpb25zCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisKKyNpbmNsdWRlICJidHJlZS5oIgorCisjZGVmaW5lIFJFRl9QQUdFUwkwCisKK3ZvaWQgaGZzX2Jub2RlX3JlYWQoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgdm9pZCAqYnVmLAorCQlpbnQgb2ZmLCBpbnQgbGVuKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCisJb2ZmICs9IG5vZGUtPnBhZ2Vfb2Zmc2V0OworCXBhZ2UgPSBub2RlLT5wYWdlWzBdOworCisJbWVtY3B5KGJ1Ziwga21hcChwYWdlKSArIG9mZiwgbGVuKTsKKwlrdW5tYXAocGFnZSk7Cit9CisKK3UxNiBoZnNfYm5vZGVfcmVhZF91MTYoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgaW50IG9mZikKK3sKKwlfX2JlMTYgZGF0YTsKKwkvLyBvcHRpbWl6ZSBsYXRlci4uLgorCWhmc19ibm9kZV9yZWFkKG5vZGUsICZkYXRhLCBvZmYsIDIpOworCXJldHVybiBiZTE2X3RvX2NwdShkYXRhKTsKK30KKwordTggaGZzX2Jub2RlX3JlYWRfdTgoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgaW50IG9mZikKK3sKKwl1OCBkYXRhOworCS8vIG9wdGltaXplIGxhdGVyLi4uCisJaGZzX2Jub2RlX3JlYWQobm9kZSwgJmRhdGEsIG9mZiwgMSk7CisJcmV0dXJuIGRhdGE7Cit9CisKK3ZvaWQgaGZzX2Jub2RlX3JlYWRfa2V5KHN0cnVjdCBoZnNfYm5vZGUgKm5vZGUsIHZvaWQgKmtleSwgaW50IG9mZikKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCWludCBrZXlfbGVuOworCisJdHJlZSA9IG5vZGUtPnRyZWU7CisJaWYgKG5vZGUtPnR5cGUgPT0gSEZTX05PREVfTEVBRiB8fAorCSAgICB0cmVlLT5hdHRyaWJ1dGVzICYgSEZTX1RSRUVfVkFSSURYS0VZUykKKwkJa2V5X2xlbiA9IGhmc19ibm9kZV9yZWFkX3U4KG5vZGUsIG9mZikgKyAxOworCWVsc2UKKwkJa2V5X2xlbiA9IHRyZWUtPm1heF9rZXlfbGVuICsgMTsKKworCWhmc19ibm9kZV9yZWFkKG5vZGUsIGtleSwgb2ZmLCBrZXlfbGVuKTsKK30KKwordm9pZCBoZnNfYm5vZGVfd3JpdGUoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgdm9pZCAqYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCisJb2ZmICs9IG5vZGUtPnBhZ2Vfb2Zmc2V0OworCXBhZ2UgPSBub2RlLT5wYWdlWzBdOworCisJbWVtY3B5KGttYXAocGFnZSkgKyBvZmYsIGJ1ZiwgbGVuKTsKKwlrdW5tYXAocGFnZSk7CisJc2V0X3BhZ2VfZGlydHkocGFnZSk7Cit9CisKK3ZvaWQgaGZzX2Jub2RlX3dyaXRlX3UxNihzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCBpbnQgb2ZmLCB1MTYgZGF0YSkKK3sKKwlfX2JlMTYgdiA9IGNwdV90b19iZTE2KGRhdGEpOworCS8vIG9wdGltaXplIGxhdGVyLi4uCisJaGZzX2Jub2RlX3dyaXRlKG5vZGUsICZ2LCBvZmYsIDIpOworfQorCit2b2lkIGhmc19ibm9kZV93cml0ZV91OChzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCBpbnQgb2ZmLCB1OCBkYXRhKQoreworCS8vIG9wdGltaXplIGxhdGVyLi4uCisJaGZzX2Jub2RlX3dyaXRlKG5vZGUsICZkYXRhLCBvZmYsIDEpOworfQorCit2b2lkIGhmc19ibm9kZV9jbGVhcihzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCBpbnQgb2ZmLCBpbnQgbGVuKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCisJb2ZmICs9IG5vZGUtPnBhZ2Vfb2Zmc2V0OworCXBhZ2UgPSBub2RlLT5wYWdlWzBdOworCisJbWVtc2V0KGttYXAocGFnZSkgKyBvZmYsIDAsIGxlbik7CisJa3VubWFwKHBhZ2UpOworCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworfQorCit2b2lkIGhmc19ibm9kZV9jb3B5KHN0cnVjdCBoZnNfYm5vZGUgKmRzdF9ub2RlLCBpbnQgZHN0LAorCQlzdHJ1Y3QgaGZzX2Jub2RlICpzcmNfbm9kZSwgaW50IHNyYywgaW50IGxlbikKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBwYWdlICpzcmNfcGFnZSwgKmRzdF9wYWdlOworCisJZHByaW50KERCR19CTk9ERV9NT0QsICJjb3B5Ynl0ZXM6ICV1LCV1LCV1XG4iLCBkc3QsIHNyYywgbGVuKTsKKwlpZiAoIWxlbikKKwkJcmV0dXJuOworCXRyZWUgPSBzcmNfbm9kZS0+dHJlZTsKKwlzcmMgKz0gc3JjX25vZGUtPnBhZ2Vfb2Zmc2V0OworCWRzdCArPSBkc3Rfbm9kZS0+cGFnZV9vZmZzZXQ7CisJc3JjX3BhZ2UgPSBzcmNfbm9kZS0+cGFnZVswXTsKKwlkc3RfcGFnZSA9IGRzdF9ub2RlLT5wYWdlWzBdOworCisJbWVtY3B5KGttYXAoZHN0X3BhZ2UpICsgZHN0LCBrbWFwKHNyY19wYWdlKSArIHNyYywgbGVuKTsKKwlrdW5tYXAoc3JjX3BhZ2UpOworCWt1bm1hcChkc3RfcGFnZSk7CisJc2V0X3BhZ2VfZGlydHkoZHN0X3BhZ2UpOworfQorCit2b2lkIGhmc19ibm9kZV9tb3ZlKHN0cnVjdCBoZnNfYm5vZGUgKm5vZGUsIGludCBkc3QsIGludCBzcmMsIGludCBsZW4pCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdm9pZCAqcHRyOworCisJZHByaW50KERCR19CTk9ERV9NT0QsICJtb3ZlYnl0ZXM6ICV1LCV1LCV1XG4iLCBkc3QsIHNyYywgbGVuKTsKKwlpZiAoIWxlbikKKwkJcmV0dXJuOworCXNyYyArPSBub2RlLT5wYWdlX29mZnNldDsKKwlkc3QgKz0gbm9kZS0+cGFnZV9vZmZzZXQ7CisJcGFnZSA9IG5vZGUtPnBhZ2VbMF07CisJcHRyID0ga21hcChwYWdlKTsKKwltZW1tb3ZlKHB0ciArIGRzdCwgcHRyICsgc3JjLCBsZW4pOworCWt1bm1hcChwYWdlKTsKKwlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKK30KKwordm9pZCBoZnNfYm5vZGVfZHVtcChzdHJ1Y3QgaGZzX2Jub2RlICpub2RlKQoreworCXN0cnVjdCBoZnNfYm5vZGVfZGVzYyBkZXNjOworCV9fYmUzMiBjbmlkOworCWludCBpLCBvZmYsIGtleV9vZmY7CisKKwlkcHJpbnQoREJHX0JOT0RFX01PRCwgImJub2RlOiAlZFxuIiwgbm9kZS0+dGhpcyk7CisJaGZzX2Jub2RlX3JlYWQobm9kZSwgJmRlc2MsIDAsIHNpemVvZihkZXNjKSk7CisJZHByaW50KERCR19CTk9ERV9NT0QsICIlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisJCWJlMzJfdG9fY3B1KGRlc2MubmV4dCksIGJlMzJfdG9fY3B1KGRlc2MucHJldiksCisJCWRlc2MudHlwZSwgZGVzYy5oZWlnaHQsIGJlMTZfdG9fY3B1KGRlc2MubnVtX3JlY3MpKTsKKworCW9mZiA9IG5vZGUtPnRyZWUtPm5vZGVfc2l6ZSAtIDI7CisJZm9yIChpID0gYmUxNl90b19jcHUoZGVzYy5udW1fcmVjcyk7IGkgPj0gMDsgb2ZmIC09IDIsIGktLSkgeworCQlrZXlfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIG9mZik7CisJCWRwcmludChEQkdfQk5PREVfTU9ELCAiICVkIiwga2V5X29mZik7CisJCWlmIChpICYmIG5vZGUtPnR5cGUgPT0gSEZTX05PREVfSU5ERVgpIHsKKwkJCWludCB0bXA7CisKKwkJCWlmIChub2RlLT50cmVlLT5hdHRyaWJ1dGVzICYgSEZTX1RSRUVfVkFSSURYS0VZUykKKwkJCQl0bXAgPSAoaGZzX2Jub2RlX3JlYWRfdTgobm9kZSwga2V5X29mZikgfCAxKSArIDE7CisJCQllbHNlCisJCQkJdG1wID0gbm9kZS0+dHJlZS0+bWF4X2tleV9sZW4gKyAxOworCQkJZHByaW50KERCR19CTk9ERV9NT0QsICIgKCVkLCVkIiwgdG1wLCBoZnNfYm5vZGVfcmVhZF91OChub2RlLCBrZXlfb2ZmKSk7CisJCQloZnNfYm5vZGVfcmVhZChub2RlLCAmY25pZCwga2V5X29mZiArIHRtcCwgNCk7CisJCQlkcHJpbnQoREJHX0JOT0RFX01PRCwgIiwlZCkiLCBiZTMyX3RvX2NwdShjbmlkKSk7CisJCX0gZWxzZSBpZiAoaSAmJiBub2RlLT50eXBlID09IEhGU19OT0RFX0xFQUYpIHsKKwkJCWludCB0bXA7CisKKwkJCXRtcCA9IGhmc19ibm9kZV9yZWFkX3U4KG5vZGUsIGtleV9vZmYpOworCQkJZHByaW50KERCR19CTk9ERV9NT0QsICIgKCVkKSIsIHRtcCk7CisJCX0KKwl9CisJZHByaW50KERCR19CTk9ERV9NT0QsICJcbiIpOworfQorCit2b2lkIGhmc19ibm9kZV91bmxpbmsoc3RydWN0IGhmc19ibm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBoZnNfYm5vZGUgKnRtcDsKKwlfX2JlMzIgY25pZDsKKworCXRyZWUgPSBub2RlLT50cmVlOworCWlmIChub2RlLT5wcmV2KSB7CisJCXRtcCA9IGhmc19ibm9kZV9maW5kKHRyZWUsIG5vZGUtPnByZXYpOworCQlpZiAoSVNfRVJSKHRtcCkpCisJCQlyZXR1cm47CisJCXRtcC0+bmV4dCA9IG5vZGUtPm5leHQ7CisJCWNuaWQgPSBjcHVfdG9fYmUzMih0bXAtPm5leHQpOworCQloZnNfYm5vZGVfd3JpdGUodG1wLCAmY25pZCwgb2Zmc2V0b2Yoc3RydWN0IGhmc19ibm9kZV9kZXNjLCBuZXh0KSwgNCk7CisJCWhmc19ibm9kZV9wdXQodG1wKTsKKwl9IGVsc2UgaWYgKG5vZGUtPnR5cGUgPT0gSEZTX05PREVfTEVBRikKKwkJdHJlZS0+bGVhZl9oZWFkID0gbm9kZS0+bmV4dDsKKworCWlmIChub2RlLT5uZXh0KSB7CisJCXRtcCA9IGhmc19ibm9kZV9maW5kKHRyZWUsIG5vZGUtPm5leHQpOworCQlpZiAoSVNfRVJSKHRtcCkpCisJCQlyZXR1cm47CisJCXRtcC0+cHJldiA9IG5vZGUtPnByZXY7CisJCWNuaWQgPSBjcHVfdG9fYmUzMih0bXAtPnByZXYpOworCQloZnNfYm5vZGVfd3JpdGUodG1wLCAmY25pZCwgb2Zmc2V0b2Yoc3RydWN0IGhmc19ibm9kZV9kZXNjLCBwcmV2KSwgNCk7CisJCWhmc19ibm9kZV9wdXQodG1wKTsKKwl9IGVsc2UgaWYgKG5vZGUtPnR5cGUgPT0gSEZTX05PREVfTEVBRikKKwkJdHJlZS0+bGVhZl90YWlsID0gbm9kZS0+cHJldjsKKworCS8vIG1vdmUgZG93bj8KKwlpZiAoIW5vZGUtPnByZXYgJiYgIW5vZGUtPm5leHQpIHsKKwkJcHJpbnRrKCJoZnNfYnRyZWVfZGVsX2xldmVsXG4iKTsKKwl9CisJaWYgKCFub2RlLT5wYXJlbnQpIHsKKwkJdHJlZS0+cm9vdCA9IDA7CisJCXRyZWUtPmRlcHRoID0gMDsKKwl9CisJc2V0X2JpdChIRlNfQk5PREVfREVMRVRFRCwgJm5vZGUtPmZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGZzX2Jub2RlX2hhc2godTMyIG51bSkKK3sKKwludW0gPSAobnVtID4+IDE2KSArIG51bTsKKwludW0gKz0gbnVtID4+IDg7CisJcmV0dXJuIG51bSAmIChOT0RFX0hBU0hfU0laRSAtIDEpOworfQorCitzdHJ1Y3QgaGZzX2Jub2RlICpoZnNfYm5vZGVfZmluZGhhc2goc3RydWN0IGhmc19idHJlZSAqdHJlZSwgdTMyIGNuaWQpCit7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZTsKKworCWlmIChjbmlkID49IHRyZWUtPm5vZGVfY291bnQpIHsKKwkJcHJpbnRrKCJIRlM6IHJlcXVlc3QgZm9yIG5vbi1leGlzdGVudCBub2RlICVkIGluIEIqVHJlZVxuIiwgY25pZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWZvciAobm9kZSA9IHRyZWUtPm5vZGVfaGFzaFtoZnNfYm5vZGVfaGFzaChjbmlkKV07CisJICAgICBub2RlOyBub2RlID0gbm9kZS0+bmV4dF9oYXNoKSB7CisJCWlmIChub2RlLT50aGlzID09IGNuaWQpIHsKKwkJCXJldHVybiBub2RlOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGhmc19ibm9kZSAqX19oZnNfYm5vZGVfY3JlYXRlKHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUsIHUzMiBjbmlkKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgKm5vZGUyOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCBzaXplLCBibG9jaywgaSwgaGFzaDsKKwlsb2ZmX3Qgb2ZmOworCisJaWYgKGNuaWQgPj0gdHJlZS0+bm9kZV9jb3VudCkgeworCQlwcmludGsoIkhGUzogcmVxdWVzdCBmb3Igbm9uLWV4aXN0ZW50IG5vZGUgJWQgaW4gQipUcmVlXG4iLCBjbmlkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2IgPSB0cmVlLT5pbm9kZS0+aV9zYjsKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBoZnNfYm5vZGUpICsgdHJlZS0+cGFnZXNfcGVyX2Jub2RlICoKKwkJc2l6ZW9mKHN0cnVjdCBwYWdlICopOworCW5vZGUgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KG5vZGUsIDAsIHNpemUpOworCW5vZGUtPnRyZWUgPSB0cmVlOworCW5vZGUtPnRoaXMgPSBjbmlkOworCXNldF9iaXQoSEZTX0JOT0RFX05FVywgJm5vZGUtPmZsYWdzKTsKKwlhdG9taWNfc2V0KCZub2RlLT5yZWZjbnQsIDEpOworCWRwcmludChEQkdfQk5PREVfUkVGUywgIm5ld19ub2RlKCVkOiVkKTogMVxuIiwKKwkgICAgICAgbm9kZS0+dHJlZS0+Y25pZCwgbm9kZS0+dGhpcyk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbm9kZS0+bG9ja193cSk7CisJc3Bpbl9sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCW5vZGUyID0gaGZzX2Jub2RlX2ZpbmRoYXNoKHRyZWUsIGNuaWQpOworCWlmICghbm9kZTIpIHsKKwkJaGFzaCA9IGhmc19ibm9kZV9oYXNoKGNuaWQpOworCQlub2RlLT5uZXh0X2hhc2ggPSB0cmVlLT5ub2RlX2hhc2hbaGFzaF07CisJCXRyZWUtPm5vZGVfaGFzaFtoYXNoXSA9IG5vZGU7CisJCXRyZWUtPm5vZGVfaGFzaF9jbnQrKzsKKwl9IGVsc2UgeworCQlzcGluX3VubG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwkJa2ZyZWUobm9kZSk7CisJCXdhaXRfZXZlbnQobm9kZTItPmxvY2tfd3EsICF0ZXN0X2JpdChIRlNfQk5PREVfTkVXLCAmbm9kZTItPmZsYWdzKSk7CisJCXJldHVybiBub2RlMjsKKwl9CisJc3Bpbl91bmxvY2soJnRyZWUtPmhhc2hfbG9jayk7CisKKwltYXBwaW5nID0gdHJlZS0+aW5vZGUtPmlfbWFwcGluZzsKKwlvZmYgPSAobG9mZl90KWNuaWQgKiB0cmVlLT5ub2RlX3NpemU7CisJYmxvY2sgPSBvZmYgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlub2RlLT5wYWdlX29mZnNldCA9IG9mZiAmIH5QQUdFX0NBQ0hFX01BU0s7CisJZm9yIChpID0gMDsgaSA8IHRyZWUtPnBhZ2VzX3Blcl9ibm9kZTsgaSsrKSB7CisJCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgYmxvY2srKywgKGZpbGxlcl90ICopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwkJaWYgKElTX0VSUihwYWdlKSkKKwkJCWdvdG8gZmFpbDsKKwkJaWYgKFBhZ2VFcnJvcihwYWdlKSkgeworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJZ290byBmYWlsOworCQl9CisjaWYgIVJFRl9QQUdFUworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisjZW5kaWYKKwkJbm9kZS0+cGFnZVtpXSA9IHBhZ2U7CisJfQorCisJcmV0dXJuIG5vZGU7CitmYWlsOgorCXNldF9iaXQoSEZTX0JOT0RFX0VSUk9SLCAmbm9kZS0+ZmxhZ3MpOworCXJldHVybiBub2RlOworfQorCit2b2lkIGhmc19ibm9kZV91bmhhc2goc3RydWN0IGhmc19ibm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgaGZzX2Jub2RlICoqcDsKKworCWRwcmludChEQkdfQk5PREVfUkVGUywgInJlbW92ZV9ub2RlKCVkOiVkKTogJWRcbiIsCisJCW5vZGUtPnRyZWUtPmNuaWQsIG5vZGUtPnRoaXMsIGF0b21pY19yZWFkKCZub2RlLT5yZWZjbnQpKTsKKwlmb3IgKHAgPSAmbm9kZS0+dHJlZS0+bm9kZV9oYXNoW2hmc19ibm9kZV9oYXNoKG5vZGUtPnRoaXMpXTsKKwkgICAgICpwICYmICpwICE9IG5vZGU7IHAgPSAmKCpwKS0+bmV4dF9oYXNoKQorCQk7CisJaWYgKCEqcCkKKwkJQlVHKCk7CisJKnAgPSBub2RlLT5uZXh0X2hhc2g7CisJbm9kZS0+dHJlZS0+bm9kZV9oYXNoX2NudC0tOworfQorCisvKiBMb2FkIGEgcGFydGljdWxhciBub2RlIG91dCBvZiBhIHRyZWUgKi8KK3N0cnVjdCBoZnNfYm5vZGUgKmhmc19ibm9kZV9maW5kKHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUsIHUzMiBudW0pCit7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MgKmRlc2M7CisJaW50IGksIHJlY19vZmYsIG9mZiwgbmV4dF9vZmY7CisJaW50IGVudHJ5X3NpemUsIGtleV9zaXplOworCisJc3Bpbl9sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCW5vZGUgPSBoZnNfYm5vZGVfZmluZGhhc2godHJlZSwgbnVtKTsKKwlpZiAobm9kZSkgeworCQloZnNfYm5vZGVfZ2V0KG5vZGUpOworCQlzcGluX3VubG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwkJd2FpdF9ldmVudChub2RlLT5sb2NrX3dxLCAhdGVzdF9iaXQoSEZTX0JOT0RFX05FVywgJm5vZGUtPmZsYWdzKSk7CisJCWlmICh0ZXN0X2JpdChIRlNfQk5PREVfRVJST1IsICZub2RlLT5mbGFncykpCisJCQlnb3RvIG5vZGVfZXJyb3I7CisJCXJldHVybiBub2RlOworCX0KKwlzcGluX3VubG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwlub2RlID0gX19oZnNfYm5vZGVfY3JlYXRlKHRyZWUsIG51bSk7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAodGVzdF9iaXQoSEZTX0JOT0RFX0VSUk9SLCAmbm9kZS0+ZmxhZ3MpKQorCQlnb3RvIG5vZGVfZXJyb3I7CisJaWYgKCF0ZXN0X2JpdChIRlNfQk5PREVfTkVXLCAmbm9kZS0+ZmxhZ3MpKQorCQlyZXR1cm4gbm9kZTsKKworCWRlc2MgPSAoc3RydWN0IGhmc19ibm9kZV9kZXNjICopKGttYXAobm9kZS0+cGFnZVswXSkgKyBub2RlLT5wYWdlX29mZnNldCk7CisJbm9kZS0+cHJldiA9IGJlMzJfdG9fY3B1KGRlc2MtPnByZXYpOworCW5vZGUtPm5leHQgPSBiZTMyX3RvX2NwdShkZXNjLT5uZXh0KTsKKwlub2RlLT5udW1fcmVjcyA9IGJlMTZfdG9fY3B1KGRlc2MtPm51bV9yZWNzKTsKKwlub2RlLT50eXBlID0gZGVzYy0+dHlwZTsKKwlub2RlLT5oZWlnaHQgPSBkZXNjLT5oZWlnaHQ7CisJa3VubWFwKG5vZGUtPnBhZ2VbMF0pOworCisJc3dpdGNoIChub2RlLT50eXBlKSB7CisJY2FzZSBIRlNfTk9ERV9IRUFERVI6CisJY2FzZSBIRlNfTk9ERV9NQVA6CisJCWlmIChub2RlLT5oZWlnaHQgIT0gMCkKKwkJCWdvdG8gbm9kZV9lcnJvcjsKKwkJYnJlYWs7CisJY2FzZSBIRlNfTk9ERV9MRUFGOgorCQlpZiAobm9kZS0+aGVpZ2h0ICE9IDEpCisJCQlnb3RvIG5vZGVfZXJyb3I7CisJCWJyZWFrOworCWNhc2UgSEZTX05PREVfSU5ERVg6CisJCWlmIChub2RlLT5oZWlnaHQgPD0gMSB8fCBub2RlLT5oZWlnaHQgPiB0cmVlLT5kZXB0aCkKKwkJCWdvdG8gbm9kZV9lcnJvcjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBub2RlX2Vycm9yOworCX0KKworCXJlY19vZmYgPSB0cmVlLT5ub2RlX3NpemUgLSAyOworCW9mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihub2RlLCByZWNfb2ZmKTsKKwlpZiAob2ZmICE9IHNpemVvZihzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MpKQorCQlnb3RvIG5vZGVfZXJyb3I7CisJZm9yIChpID0gMTsgaSA8PSBub2RlLT5udW1fcmVjczsgb2ZmID0gbmV4dF9vZmYsIGkrKykgeworCQlyZWNfb2ZmIC09IDI7CisJCW5leHRfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIHJlY19vZmYpOworCQlpZiAobmV4dF9vZmYgPD0gb2ZmIHx8CisJCSAgICBuZXh0X29mZiA+IHRyZWUtPm5vZGVfc2l6ZSB8fAorCQkgICAgbmV4dF9vZmYgJiAxKQorCQkJZ290byBub2RlX2Vycm9yOworCQllbnRyeV9zaXplID0gbmV4dF9vZmYgLSBvZmY7CisJCWlmIChub2RlLT50eXBlICE9IEhGU19OT0RFX0lOREVYICYmCisJCSAgICBub2RlLT50eXBlICE9IEhGU19OT0RFX0xFQUYpCisJCQljb250aW51ZTsKKwkJa2V5X3NpemUgPSBoZnNfYm5vZGVfcmVhZF91OChub2RlLCBvZmYpICsgMTsKKwkJaWYgKGtleV9zaXplID49IGVudHJ5X3NpemUgLyp8fCBrZXlfc2l6ZSAmIDEqLykKKwkJCWdvdG8gbm9kZV9lcnJvcjsKKwl9CisJY2xlYXJfYml0KEhGU19CTk9ERV9ORVcsICZub2RlLT5mbGFncyk7CisJd2FrZV91cCgmbm9kZS0+bG9ja193cSk7CisJcmV0dXJuIG5vZGU7CisKK25vZGVfZXJyb3I6CisJc2V0X2JpdChIRlNfQk5PREVfRVJST1IsICZub2RlLT5mbGFncyk7CisJY2xlYXJfYml0KEhGU19CTk9ERV9ORVcsICZub2RlLT5mbGFncyk7CisJd2FrZV91cCgmbm9kZS0+bG9ja193cSk7CisJaGZzX2Jub2RlX3B1dChub2RlKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlPKTsKK30KKwordm9pZCBoZnNfYm5vZGVfZnJlZShzdHJ1Y3QgaGZzX2Jub2RlICpub2RlKQoreworCS8vaW50IGk7CisKKwkvL2ZvciAoaSA9IDA7IGkgPCBub2RlLT50cmVlLT5wYWdlc19wZXJfYm5vZGU7IGkrKykKKwkvLwlpZiAobm9kZS0+cGFnZVtpXSkKKwkvLwkJcGFnZV9jYWNoZV9yZWxlYXNlKG5vZGUtPnBhZ2VbaV0pOworCWtmcmVlKG5vZGUpOworfQorCitzdHJ1Y3QgaGZzX2Jub2RlICpoZnNfYm5vZGVfY3JlYXRlKHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUsIHUzMiBudW0pCit7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZTsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VwOworCWludCBpOworCisJc3Bpbl9sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCW5vZGUgPSBoZnNfYm5vZGVfZmluZGhhc2godHJlZSwgbnVtKTsKKwlzcGluX3VubG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwlpZiAobm9kZSkKKwkJQlVHKCk7CisJbm9kZSA9IF9faGZzX2Jub2RlX2NyZWF0ZSh0cmVlLCBudW0pOworCWlmICghbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJaWYgKHRlc3RfYml0KEhGU19CTk9ERV9FUlJPUiwgJm5vZGUtPmZsYWdzKSkgeworCQloZnNfYm5vZGVfcHV0KG5vZGUpOworCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwl9CisKKwlwYWdlcCA9IG5vZGUtPnBhZ2U7CisJbWVtc2V0KGttYXAoKnBhZ2VwKSArIG5vZGUtPnBhZ2Vfb2Zmc2V0LCAwLAorCSAgICAgICBtaW4oKGludClQQUdFX0NBQ0hFX1NJWkUsIChpbnQpdHJlZS0+bm9kZV9zaXplKSk7CisJc2V0X3BhZ2VfZGlydHkoKnBhZ2VwKTsKKwlrdW5tYXAoKnBhZ2VwKTsKKwlmb3IgKGkgPSAxOyBpIDwgdHJlZS0+cGFnZXNfcGVyX2Jub2RlOyBpKyspIHsKKwkJbWVtc2V0KGttYXAoKisrcGFnZXApLCAwLCBQQUdFX0NBQ0hFX1NJWkUpOworCQlzZXRfcGFnZV9kaXJ0eSgqcGFnZXApOworCQlrdW5tYXAoKnBhZ2VwKTsKKwl9CisJY2xlYXJfYml0KEhGU19CTk9ERV9ORVcsICZub2RlLT5mbGFncyk7CisJd2FrZV91cCgmbm9kZS0+bG9ja193cSk7CisKKwlyZXR1cm4gbm9kZTsKK30KKwordm9pZCBoZnNfYm5vZGVfZ2V0KHN0cnVjdCBoZnNfYm5vZGUgKm5vZGUpCit7CisJaWYgKG5vZGUpIHsKKwkJYXRvbWljX2luYygmbm9kZS0+cmVmY250KTsKKyNpZiBSRUZfUEFHRVMKKwkJeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IG5vZGUtPnRyZWUtPnBhZ2VzX3Blcl9ibm9kZTsgaSsrKQorCQkJZ2V0X3BhZ2Uobm9kZS0+cGFnZVtpXSk7CisJCX0KKyNlbmRpZgorCQlkcHJpbnQoREJHX0JOT0RFX1JFRlMsICJnZXRfbm9kZSglZDolZCk6ICVkXG4iLAorCQkgICAgICAgbm9kZS0+dHJlZS0+Y25pZCwgbm9kZS0+dGhpcywgYXRvbWljX3JlYWQoJm5vZGUtPnJlZmNudCkpOworCX0KK30KKworLyogRGlzcG9zZSBvZiByZXNvdXJjZXMgdXNlZCBieSBhIG5vZGUgKi8KK3ZvaWQgaGZzX2Jub2RlX3B1dChzdHJ1Y3QgaGZzX2Jub2RlICpub2RlKQoreworCWlmIChub2RlKSB7CisJCXN0cnVjdCBoZnNfYnRyZWUgKnRyZWUgPSBub2RlLT50cmVlOworCQlpbnQgaTsKKworCQlkcHJpbnQoREJHX0JOT0RFX1JFRlMsICJwdXRfbm9kZSglZDolZCk6ICVkXG4iLAorCQkgICAgICAgbm9kZS0+dHJlZS0+Y25pZCwgbm9kZS0+dGhpcywgYXRvbWljX3JlYWQoJm5vZGUtPnJlZmNudCkpOworCQlpZiAoIWF0b21pY19yZWFkKCZub2RlLT5yZWZjbnQpKQorCQkJQlVHKCk7CisJCWlmICghYXRvbWljX2RlY19hbmRfbG9jaygmbm9kZS0+cmVmY250LCAmdHJlZS0+aGFzaF9sb2NrKSkgeworI2lmIFJFRl9QQUdFUworCQkJZm9yIChpID0gMDsgaSA8IHRyZWUtPnBhZ2VzX3Blcl9ibm9kZTsgaSsrKQorCQkJCXB1dF9wYWdlKG5vZGUtPnBhZ2VbaV0pOworI2VuZGlmCisJCQlyZXR1cm47CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IHRyZWUtPnBhZ2VzX3Blcl9ibm9kZTsgaSsrKSB7CisJCQltYXJrX3BhZ2VfYWNjZXNzZWQobm9kZS0+cGFnZVtpXSk7CisjaWYgUkVGX1BBR0VTCisJCQlwdXRfcGFnZShub2RlLT5wYWdlW2ldKTsKKyNlbmRpZgorCQl9CisKKwkJaWYgKHRlc3RfYml0KEhGU19CTk9ERV9ERUxFVEVELCAmbm9kZS0+ZmxhZ3MpKSB7CisJCQloZnNfYm5vZGVfdW5oYXNoKG5vZGUpOworCQkJc3Bpbl91bmxvY2soJnRyZWUtPmhhc2hfbG9jayk7CisJCQloZnNfYm1hcF9mcmVlKG5vZGUpOworCQkJaGZzX2Jub2RlX2ZyZWUobm9kZSk7CisJCQlyZXR1cm47CisJCX0KKwkJc3Bpbl91bmxvY2soJnRyZWUtPmhhc2hfbG9jayk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZnMvaGZzL2JyZWMuYyBiL2ZzL2hmcy9icmVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q4ZmZmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9icmVjLmMKQEAgLTAsMCArMSw0OTYgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzL2JyZWMuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMQorICogQnJhZCBCb3llciAoZmxhckBhbGxhbmRyaWEuY29tKQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICoKKyAqIEhhbmRsZSBpbmRpdmlkdWFsIGJ0cmVlIHJlY29yZHMKKyAqLworCisjaW5jbHVkZSAiYnRyZWUuaCIKKworc3RhdGljIHN0cnVjdCBoZnNfYm5vZGUgKmhmc19ibm9kZV9zcGxpdChzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQpOworc3RhdGljIGludCBoZnNfYnJlY191cGRhdGVfcGFyZW50KHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCk7CitzdGF0aWMgaW50IGhmc19idHJlZV9pbmNfaGVpZ2h0KHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUpOworCisvKiBHZXQgdGhlIGxlbmd0aCBhbmQgb2Zmc2V0IG9mIHRoZSBnaXZlbiByZWNvcmQgaW4gdGhlIGdpdmVuIG5vZGUgKi8KK3UxNiBoZnNfYnJlY19sZW5vZmYoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgdTE2IHJlYywgdTE2ICpvZmYpCit7CisJX19iZTE2IHJldHZhbFsyXTsKKwl1MTYgZGF0YW9mZjsKKworCWRhdGFvZmYgPSBub2RlLT50cmVlLT5ub2RlX3NpemUgLSAocmVjICsgMikgKiAyOworCWhmc19ibm9kZV9yZWFkKG5vZGUsIHJldHZhbCwgZGF0YW9mZiwgNCk7CisJKm9mZiA9IGJlMTZfdG9fY3B1KHJldHZhbFsxXSk7CisJcmV0dXJuIGJlMTZfdG9fY3B1KHJldHZhbFswXSkgLSAqb2ZmOworfQorCisvKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUga2V5IGZyb20gYSBrZXllZCByZWNvcmQgKi8KK3UxNiBoZnNfYnJlY19rZXlsZW4oc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgdTE2IHJlYykKK3sKKwl1MTYgcmV0dmFsLCByZWNvZmY7CisKKwlpZiAobm9kZS0+dHlwZSAhPSBIRlNfTk9ERV9JTkRFWCAmJiBub2RlLT50eXBlICE9IEhGU19OT0RFX0xFQUYpCisJCXJldHVybiAwOworCisJaWYgKChub2RlLT50eXBlID09IEhGU19OT0RFX0lOREVYKSAmJgorCSAgICEobm9kZS0+dHJlZS0+YXR0cmlidXRlcyAmIEhGU19UUkVFX1ZBUklEWEtFWVMpKSB7CisJCWlmIChub2RlLT50cmVlLT5hdHRyaWJ1dGVzICYgSEZTX1RSRUVfQklHS0VZUykKKwkJCXJldHZhbCA9IG5vZGUtPnRyZWUtPm1heF9rZXlfbGVuICsgMjsKKwkJZWxzZQorCQkJcmV0dmFsID0gbm9kZS0+dHJlZS0+bWF4X2tleV9sZW4gKyAxOworCX0gZWxzZSB7CisJCXJlY29mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihub2RlLCBub2RlLT50cmVlLT5ub2RlX3NpemUgLSAocmVjICsgMSkgKiAyKTsKKwkJaWYgKCFyZWNvZmYpCisJCQlyZXR1cm4gMDsKKwkJaWYgKG5vZGUtPnRyZWUtPmF0dHJpYnV0ZXMgJiBIRlNfVFJFRV9CSUdLRVlTKQorCQkJcmV0dmFsID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIHJlY29mZikgKyAyOworCQllbHNlCisJCQlyZXR2YWwgPSAoaGZzX2Jub2RlX3JlYWRfdTgobm9kZSwgcmVjb2ZmKSB8IDEpICsgMTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IGhmc19icmVjX2luc2VydChzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQsIHZvaWQgKmVudHJ5LCBpbnQgZW50cnlfbGVuKQoreworCXN0cnVjdCBoZnNfYnRyZWUgKnRyZWU7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgKm5ld19ub2RlOworCWludCBzaXplLCBrZXlfbGVuLCByZWM7CisJaW50IGRhdGFfb2ZmLCBlbmRfb2ZmOworCWludCBpZHhfcmVjX29mZiwgZGF0YV9yZWNfb2ZmLCBlbmRfcmVjX29mZjsKKwlfX2JlMzIgY25pZDsKKworCXRyZWUgPSBmZC0+dHJlZTsKKwlpZiAoIWZkLT5ibm9kZSkgeworCQlpZiAoIXRyZWUtPnJvb3QpCisJCQloZnNfYnRyZWVfaW5jX2hlaWdodCh0cmVlKTsKKwkJZmQtPmJub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgdHJlZS0+bGVhZl9oZWFkKTsKKwkJaWYgKElTX0VSUihmZC0+Ym5vZGUpKQorCQkJcmV0dXJuIFBUUl9FUlIoZmQtPmJub2RlKTsKKwkJZmQtPnJlY29yZCA9IC0xOworCX0KKwluZXdfbm9kZSA9IE5VTEw7CisJa2V5X2xlbiA9IChmZC0+c2VhcmNoX2tleS0+a2V5X2xlbiB8IDEpICsgMTsKK2FnYWluOgorCS8qIG5ldyByZWNvcmQgaWR4IGFuZCBjb21wbGV0ZSByZWNvcmQgc2l6ZSAqLworCXJlYyA9IGZkLT5yZWNvcmQgKyAxOworCXNpemUgPSBrZXlfbGVuICsgZW50cnlfbGVuOworCisJbm9kZSA9IGZkLT5ibm9kZTsKKwloZnNfYm5vZGVfZHVtcChub2RlKTsKKwkvKiBnZXQgbGFzdCBvZmZzZXQgKi8KKwllbmRfcmVjX29mZiA9IHRyZWUtPm5vZGVfc2l6ZSAtIChub2RlLT5udW1fcmVjcyArIDEpICogMjsKKwllbmRfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIGVuZF9yZWNfb2ZmKTsKKwllbmRfcmVjX29mZiAtPSAyOworCWRwcmludChEQkdfQk5PREVfTU9ELCAiaW5zZXJ0X3JlYzogJWQsICVkLCAlZCwgJWRcbiIsIHJlYywgc2l6ZSwgZW5kX29mZiwgZW5kX3JlY19vZmYpOworCWlmIChzaXplID4gZW5kX3JlY19vZmYgLSBlbmRfb2ZmKSB7CisJCWlmIChuZXdfbm9kZSkKKwkJCXBhbmljKCJub3QgZW5vdWdoIHJvb20hXG4iKTsKKwkJbmV3X25vZGUgPSBoZnNfYm5vZGVfc3BsaXQoZmQpOworCQlpZiAoSVNfRVJSKG5ld19ub2RlKSkKKwkJCXJldHVybiBQVFJfRVJSKG5ld19ub2RlKTsKKwkJZ290byBhZ2FpbjsKKwl9CisJaWYgKG5vZGUtPnR5cGUgPT0gSEZTX05PREVfTEVBRikgeworCQl0cmVlLT5sZWFmX2NvdW50Kys7CisJCW1hcmtfaW5vZGVfZGlydHkodHJlZS0+aW5vZGUpOworCX0KKwlub2RlLT5udW1fcmVjcysrOworCS8qIHdyaXRlIG5ldyBsYXN0IG9mZnNldCAqLworCWhmc19ibm9kZV93cml0ZV91MTYobm9kZSwgb2Zmc2V0b2Yoc3RydWN0IGhmc19ibm9kZV9kZXNjLCBudW1fcmVjcyksIG5vZGUtPm51bV9yZWNzKTsKKwloZnNfYm5vZGVfd3JpdGVfdTE2KG5vZGUsIGVuZF9yZWNfb2ZmLCBlbmRfb2ZmICsgc2l6ZSk7CisJZGF0YV9vZmYgPSBlbmRfb2ZmOworCWRhdGFfcmVjX29mZiA9IGVuZF9yZWNfb2ZmICsgMjsKKwlpZHhfcmVjX29mZiA9IHRyZWUtPm5vZGVfc2l6ZSAtIChyZWMgKyAxKSAqIDI7CisJaWYgKGlkeF9yZWNfb2ZmID09IGRhdGFfcmVjX29mZikKKwkJZ290byBza2lwOworCS8qIG1vdmUgYWxsIGZvbGxvd2luZyBlbnRyaWVzICovCisJZG8geworCQlkYXRhX29mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihub2RlLCBkYXRhX3JlY19vZmYgKyAyKTsKKwkJaGZzX2Jub2RlX3dyaXRlX3UxNihub2RlLCBkYXRhX3JlY19vZmYsIGRhdGFfb2ZmICsgc2l6ZSk7CisJCWRhdGFfcmVjX29mZiArPSAyOworCX0gd2hpbGUgKGRhdGFfcmVjX29mZiA8IGlkeF9yZWNfb2ZmKTsKKworCS8qIG1vdmUgZGF0YSBhd2F5ICovCisJaGZzX2Jub2RlX21vdmUobm9kZSwgZGF0YV9vZmYgKyBzaXplLCBkYXRhX29mZiwKKwkJICAgICAgIGVuZF9vZmYgLSBkYXRhX29mZik7CisKK3NraXA6CisJaGZzX2Jub2RlX3dyaXRlKG5vZGUsIGZkLT5zZWFyY2hfa2V5LCBkYXRhX29mZiwga2V5X2xlbik7CisJaGZzX2Jub2RlX3dyaXRlKG5vZGUsIGVudHJ5LCBkYXRhX29mZiArIGtleV9sZW4sIGVudHJ5X2xlbik7CisJaGZzX2Jub2RlX2R1bXAobm9kZSk7CisKKwlpZiAobmV3X25vZGUpIHsKKwkJLyogdXBkYXRlIHBhcmVudCBrZXkgaWYgd2UgaW5zZXJ0ZWQgYSBrZXkKKwkJICogYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBub2RlCisJCSAqLworCQlpZiAoIXJlYyAmJiBuZXdfbm9kZSAhPSBub2RlKQorCQkJaGZzX2JyZWNfdXBkYXRlX3BhcmVudChmZCk7CisKKwkJaGZzX2Jub2RlX3B1dChmZC0+Ym5vZGUpOworCQlpZiAoIW5ld19ub2RlLT5wYXJlbnQpIHsKKwkJCWhmc19idHJlZV9pbmNfaGVpZ2h0KHRyZWUpOworCQkJbmV3X25vZGUtPnBhcmVudCA9IHRyZWUtPnJvb3Q7CisJCX0KKwkJZmQtPmJub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbmV3X25vZGUtPnBhcmVudCk7CisKKwkJLyogY3JlYXRlIGluZGV4IGRhdGEgZW50cnkgKi8KKwkJY25pZCA9IGNwdV90b19iZTMyKG5ld19ub2RlLT50aGlzKTsKKwkJZW50cnkgPSAmY25pZDsKKwkJZW50cnlfbGVuID0gc2l6ZW9mKGNuaWQpOworCisJCS8qIGdldCBpbmRleCBrZXkgKi8KKwkJaGZzX2Jub2RlX3JlYWRfa2V5KG5ld19ub2RlLCBmZC0+c2VhcmNoX2tleSwgMTQpOworCQlfX2hmc19icmVjX2ZpbmQoZmQtPmJub2RlLCBmZCk7CisKKwkJaGZzX2Jub2RlX3B1dChuZXdfbm9kZSk7CisJCW5ld19ub2RlID0gTlVMTDsKKworCQlpZiAodHJlZS0+YXR0cmlidXRlcyAmIEhGU19UUkVFX1ZBUklEWEtFWVMpCisJCQlrZXlfbGVuID0gZmQtPnNlYXJjaF9rZXktPmtleV9sZW4gKyAxOworCQllbHNlIHsKKwkJCWZkLT5zZWFyY2hfa2V5LT5rZXlfbGVuID0gdHJlZS0+bWF4X2tleV9sZW47CisJCQlrZXlfbGVuID0gdHJlZS0+bWF4X2tleV9sZW4gKyAxOworCQl9CisJCWdvdG8gYWdhaW47CisJfQorCisJaWYgKCFyZWMpCisJCWhmc19icmVjX3VwZGF0ZV9wYXJlbnQoZmQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBoZnNfYnJlY19yZW1vdmUoc3RydWN0IGhmc19maW5kX2RhdGEgKmZkKQoreworCXN0cnVjdCBoZnNfYnRyZWUgKnRyZWU7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgKnBhcmVudDsKKwlpbnQgZW5kX29mZiwgcmVjX29mZiwgZGF0YV9vZmYsIHNpemU7CisKKwl0cmVlID0gZmQtPnRyZWU7CisJbm9kZSA9IGZkLT5ibm9kZTsKK2FnYWluOgorCXJlY19vZmYgPSB0cmVlLT5ub2RlX3NpemUgLSAoZmQtPnJlY29yZCArIDIpICogMjsKKwllbmRfb2ZmID0gdHJlZS0+bm9kZV9zaXplIC0gKG5vZGUtPm51bV9yZWNzICsgMSkgKiAyOworCisJaWYgKG5vZGUtPnR5cGUgPT0gSEZTX05PREVfTEVBRikgeworCQl0cmVlLT5sZWFmX2NvdW50LS07CisJCW1hcmtfaW5vZGVfZGlydHkodHJlZS0+aW5vZGUpOworCX0KKwloZnNfYm5vZGVfZHVtcChub2RlKTsKKwlkcHJpbnQoREJHX0JOT0RFX01PRCwgInJlbW92ZV9yZWM6ICVkLCAlZFxuIiwgZmQtPnJlY29yZCwgZmQtPmtleWxlbmd0aCArIGZkLT5lbnRyeWxlbmd0aCk7CisJaWYgKCEtLW5vZGUtPm51bV9yZWNzKSB7CisJCWhmc19ibm9kZV91bmxpbmsobm9kZSk7CisJCWlmICghbm9kZS0+cGFyZW50KQorCQkJcmV0dXJuIDA7CisJCXBhcmVudCA9IGhmc19ibm9kZV9maW5kKHRyZWUsIG5vZGUtPnBhcmVudCk7CisJCWlmIChJU19FUlIocGFyZW50KSkKKwkJCXJldHVybiBQVFJfRVJSKHBhcmVudCk7CisJCWhmc19ibm9kZV9wdXQobm9kZSk7CisJCW5vZGUgPSBmZC0+Ym5vZGUgPSBwYXJlbnQ7CisKKwkJX19oZnNfYnJlY19maW5kKG5vZGUsIGZkKTsKKwkJZ290byBhZ2FpbjsKKwl9CisJaGZzX2Jub2RlX3dyaXRlX3UxNihub2RlLCBvZmZzZXRvZihzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MsIG51bV9yZWNzKSwgbm9kZS0+bnVtX3JlY3MpOworCisJaWYgKHJlY19vZmYgPT0gZW5kX29mZikKKwkJZ290byBza2lwOworCXNpemUgPSBmZC0+a2V5bGVuZ3RoICsgZmQtPmVudHJ5bGVuZ3RoOworCisJZG8geworCQlkYXRhX29mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihub2RlLCByZWNfb2ZmKTsKKwkJaGZzX2Jub2RlX3dyaXRlX3UxNihub2RlLCByZWNfb2ZmICsgMiwgZGF0YV9vZmYgLSBzaXplKTsKKwkJcmVjX29mZiAtPSAyOworCX0gd2hpbGUgKHJlY19vZmYgPj0gZW5kX29mZik7CisKKwkvKiBmaWxsIGhvbGUgKi8KKwloZnNfYm5vZGVfbW92ZShub2RlLCBmZC0+a2V5b2Zmc2V0LCBmZC0+a2V5b2Zmc2V0ICsgc2l6ZSwKKwkJICAgICAgIGRhdGFfb2ZmIC0gZmQtPmtleW9mZnNldCAtIHNpemUpOworc2tpcDoKKwloZnNfYm5vZGVfZHVtcChub2RlKTsKKwlpZiAoIWZkLT5yZWNvcmQpCisJCWhmc19icmVjX3VwZGF0ZV9wYXJlbnQoZmQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGhmc19ibm9kZSAqaGZzX2Jub2RlX3NwbGl0KHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBoZnNfYm5vZGUgKm5vZGUsICpuZXdfbm9kZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2Mgbm9kZV9kZXNjOworCWludCBudW1fcmVjcywgbmV3X3JlY19vZmYsIG5ld19vZmYsIG9sZF9yZWNfb2ZmOworCWludCBkYXRhX3N0YXJ0LCBkYXRhX2VuZCwgc2l6ZTsKKworCXRyZWUgPSBmZC0+dHJlZTsKKwlub2RlID0gZmQtPmJub2RlOworCW5ld19ub2RlID0gaGZzX2JtYXBfYWxsb2ModHJlZSk7CisJaWYgKElTX0VSUihuZXdfbm9kZSkpCisJCXJldHVybiBuZXdfbm9kZTsKKwloZnNfYm5vZGVfZ2V0KG5vZGUpOworCWRwcmludChEQkdfQk5PREVfTU9ELCAic3BsaXRfbm9kZXM6ICVkIC0gJWQgLSAlZFxuIiwKKwkJbm9kZS0+dGhpcywgbmV3X25vZGUtPnRoaXMsIG5vZGUtPm5leHQpOworCW5ld19ub2RlLT5uZXh0ID0gbm9kZS0+bmV4dDsKKwluZXdfbm9kZS0+cHJldiA9IG5vZGUtPnRoaXM7CisJbmV3X25vZGUtPnBhcmVudCA9IG5vZGUtPnBhcmVudDsKKwluZXdfbm9kZS0+dHlwZSA9IG5vZGUtPnR5cGU7CisJbmV3X25vZGUtPmhlaWdodCA9IG5vZGUtPmhlaWdodDsKKworCXNpemUgPSB0cmVlLT5ub2RlX3NpemUgLyAyIC0gbm9kZS0+bnVtX3JlY3MgKiAyIC0gMTQ7CisJb2xkX3JlY19vZmYgPSB0cmVlLT5ub2RlX3NpemUgLSA0OworCW51bV9yZWNzID0gMTsKKwlmb3IgKDs7KSB7CisJCWRhdGFfc3RhcnQgPSBoZnNfYm5vZGVfcmVhZF91MTYobm9kZSwgb2xkX3JlY19vZmYpOworCQlpZiAoZGF0YV9zdGFydCA+IHNpemUpCisJCQlicmVhazsKKwkJb2xkX3JlY19vZmYgLT0gMjsKKwkJaWYgKCsrbnVtX3JlY3MgPCBub2RlLT5udW1fcmVjcykKKwkJCWNvbnRpbnVlOworCQkvKiBwYW5pYz8gKi8KKwkJaGZzX2Jub2RlX3B1dChub2RlKTsKKwkJaGZzX2Jub2RlX3B1dChuZXdfbm9kZSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9TUEMpOworCX0KKworCWlmIChmZC0+cmVjb3JkICsgMSA8IG51bV9yZWNzKSB7CisJCS8qIG5ldyByZWNvcmQgaXMgaW4gdGhlIGxvd2VyIGhhbGYsCisJCSAqIHNvIGxlYXZlIHNvbWUgbW9yZSBzcGFjZSB0aGVyZQorCQkgKi8KKwkJb2xkX3JlY19vZmYgKz0gMjsKKwkJbnVtX3JlY3MtLTsKKwkJZGF0YV9zdGFydCA9IGhmc19ibm9kZV9yZWFkX3UxNihub2RlLCBvbGRfcmVjX29mZik7CisJfSBlbHNlIHsKKwkJaGZzX2Jub2RlX3B1dChub2RlKTsKKwkJaGZzX2Jub2RlX2dldChuZXdfbm9kZSk7CisJCWZkLT5ibm9kZSA9IG5ld19ub2RlOworCQlmZC0+cmVjb3JkIC09IG51bV9yZWNzOworCQlmZC0+a2V5b2Zmc2V0IC09IGRhdGFfc3RhcnQgLSAxNDsKKwkJZmQtPmVudHJ5b2Zmc2V0IC09IGRhdGFfc3RhcnQgLSAxNDsKKwl9CisJbmV3X25vZGUtPm51bV9yZWNzID0gbm9kZS0+bnVtX3JlY3MgLSBudW1fcmVjczsKKwlub2RlLT5udW1fcmVjcyA9IG51bV9yZWNzOworCisJbmV3X3JlY19vZmYgPSB0cmVlLT5ub2RlX3NpemUgLSAyOworCW5ld19vZmYgPSAxNDsKKwlzaXplID0gZGF0YV9zdGFydCAtIG5ld19vZmY7CisJbnVtX3JlY3MgPSBuZXdfbm9kZS0+bnVtX3JlY3M7CisJZGF0YV9lbmQgPSBkYXRhX3N0YXJ0OworCXdoaWxlIChudW1fcmVjcykgeworCQloZnNfYm5vZGVfd3JpdGVfdTE2KG5ld19ub2RlLCBuZXdfcmVjX29mZiwgbmV3X29mZik7CisJCW9sZF9yZWNfb2ZmIC09IDI7CisJCW5ld19yZWNfb2ZmIC09IDI7CisJCWRhdGFfZW5kID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIG9sZF9yZWNfb2ZmKTsKKwkJbmV3X29mZiA9IGRhdGFfZW5kIC0gc2l6ZTsKKwkJbnVtX3JlY3MtLTsKKwl9CisJaGZzX2Jub2RlX3dyaXRlX3UxNihuZXdfbm9kZSwgbmV3X3JlY19vZmYsIG5ld19vZmYpOworCWhmc19ibm9kZV9jb3B5KG5ld19ub2RlLCAxNCwgbm9kZSwgZGF0YV9zdGFydCwgZGF0YV9lbmQgLSBkYXRhX3N0YXJ0KTsKKworCS8qIHVwZGF0ZSBuZXcgYm5vZGUgaGVhZGVyICovCisJbm9kZV9kZXNjLm5leHQgPSBjcHVfdG9fYmUzMihuZXdfbm9kZS0+bmV4dCk7CisJbm9kZV9kZXNjLnByZXYgPSBjcHVfdG9fYmUzMihuZXdfbm9kZS0+cHJldik7CisJbm9kZV9kZXNjLnR5cGUgPSBuZXdfbm9kZS0+dHlwZTsKKwlub2RlX2Rlc2MuaGVpZ2h0ID0gbmV3X25vZGUtPmhlaWdodDsKKwlub2RlX2Rlc2MubnVtX3JlY3MgPSBjcHVfdG9fYmUxNihuZXdfbm9kZS0+bnVtX3JlY3MpOworCW5vZGVfZGVzYy5yZXNlcnZlZCA9IDA7CisJaGZzX2Jub2RlX3dyaXRlKG5ld19ub2RlLCAmbm9kZV9kZXNjLCAwLCBzaXplb2Yobm9kZV9kZXNjKSk7CisKKwkvKiB1cGRhdGUgcHJldmlvdXMgYm5vZGUgaGVhZGVyICovCisJbm9kZS0+bmV4dCA9IG5ld19ub2RlLT50aGlzOworCWhmc19ibm9kZV9yZWFkKG5vZGUsICZub2RlX2Rlc2MsIDAsIHNpemVvZihub2RlX2Rlc2MpKTsKKwlub2RlX2Rlc2MubmV4dCA9IGNwdV90b19iZTMyKG5vZGUtPm5leHQpOworCW5vZGVfZGVzYy5udW1fcmVjcyA9IGNwdV90b19iZTE2KG5vZGUtPm51bV9yZWNzKTsKKwloZnNfYm5vZGVfd3JpdGUobm9kZSwgJm5vZGVfZGVzYywgMCwgc2l6ZW9mKG5vZGVfZGVzYykpOworCisJLyogdXBkYXRlIG5leHQgYm5vZGUgaGVhZGVyICovCisJaWYgKG5ld19ub2RlLT5uZXh0KSB7CisJCXN0cnVjdCBoZnNfYm5vZGUgKm5leHRfbm9kZSA9IGhmc19ibm9kZV9maW5kKHRyZWUsIG5ld19ub2RlLT5uZXh0KTsKKwkJbmV4dF9ub2RlLT5wcmV2ID0gbmV3X25vZGUtPnRoaXM7CisJCWhmc19ibm9kZV9yZWFkKG5leHRfbm9kZSwgJm5vZGVfZGVzYywgMCwgc2l6ZW9mKG5vZGVfZGVzYykpOworCQlub2RlX2Rlc2MucHJldiA9IGNwdV90b19iZTMyKG5leHRfbm9kZS0+cHJldik7CisJCWhmc19ibm9kZV93cml0ZShuZXh0X25vZGUsICZub2RlX2Rlc2MsIDAsIHNpemVvZihub2RlX2Rlc2MpKTsKKwkJaGZzX2Jub2RlX3B1dChuZXh0X25vZGUpOworCX0gZWxzZSBpZiAobm9kZS0+dGhpcyA9PSB0cmVlLT5sZWFmX3RhaWwpIHsKKwkJLyogaWYgdGhlcmUgaXMgbm8gbmV4dCBub2RlLCB0aGlzIG1pZ2h0IGJlIHRoZSBuZXcgdGFpbCAqLworCQl0cmVlLT5sZWFmX3RhaWwgPSBuZXdfbm9kZS0+dGhpczsKKwkJbWFya19pbm9kZV9kaXJ0eSh0cmVlLT5pbm9kZSk7CisJfQorCisJaGZzX2Jub2RlX2R1bXAobm9kZSk7CisJaGZzX2Jub2RlX2R1bXAobmV3X25vZGUpOworCWhmc19ibm9kZV9wdXQobm9kZSk7CisKKwlyZXR1cm4gbmV3X25vZGU7Cit9CisKK3N0YXRpYyBpbnQgaGZzX2JyZWNfdXBkYXRlX3BhcmVudChzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQpCit7CisJc3RydWN0IGhmc19idHJlZSAqdHJlZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCAqbmV3X25vZGUsICpwYXJlbnQ7CisJaW50IG5ld2tleWxlbiwgZGlmZjsKKwlpbnQgcmVjLCByZWNfb2ZmLCBlbmRfcmVjX29mZjsKKwlpbnQgc3RhcnRfb2ZmLCBlbmRfb2ZmOworCisJdHJlZSA9IGZkLT50cmVlOworCW5vZGUgPSBmZC0+Ym5vZGU7CisJbmV3X25vZGUgPSBOVUxMOworCWlmICghbm9kZS0+cGFyZW50KQorCQlyZXR1cm4gMDsKKworYWdhaW46CisJcGFyZW50ID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbm9kZS0+cGFyZW50KTsKKwlpZiAoSVNfRVJSKHBhcmVudCkpCisJCXJldHVybiBQVFJfRVJSKHBhcmVudCk7CisJX19oZnNfYnJlY19maW5kKHBhcmVudCwgZmQpOworCWhmc19ibm9kZV9kdW1wKHBhcmVudCk7CisJcmVjID0gZmQtPnJlY29yZDsKKworCS8qIHNpemUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9sZCBhbmQgbmV3IGtleSAqLworCWlmICh0cmVlLT5hdHRyaWJ1dGVzICYgSEZTX1RSRUVfVkFSSURYS0VZUykKKwkJbmV3a2V5bGVuID0gKGhmc19ibm9kZV9yZWFkX3U4KG5vZGUsIDE0KSB8IDEpICsgMTsKKwllbHNlCisJCWZkLT5rZXlsZW5ndGggPSBuZXdrZXlsZW4gPSB0cmVlLT5tYXhfa2V5X2xlbiArIDE7CisJZHByaW50KERCR19CTk9ERV9NT0QsICJ1cGRhdGVfcmVjOiAlZCwgJWQsICVkXG4iLCByZWMsIGZkLT5rZXlsZW5ndGgsIG5ld2tleWxlbik7CisKKwlyZWNfb2ZmID0gdHJlZS0+bm9kZV9zaXplIC0gKHJlYyArIDIpICogMjsKKwllbmRfcmVjX29mZiA9IHRyZWUtPm5vZGVfc2l6ZSAtIChwYXJlbnQtPm51bV9yZWNzICsgMSkgKiAyOworCWRpZmYgPSBuZXdrZXlsZW4gLSBmZC0+a2V5bGVuZ3RoOworCWlmICghZGlmZikKKwkJZ290byBza2lwOworCWlmIChkaWZmID4gMCkgeworCQllbmRfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KHBhcmVudCwgZW5kX3JlY19vZmYpOworCQlpZiAoZW5kX3JlY19vZmYgLSBlbmRfb2ZmIDwgZGlmZikgeworCisJCQlwcmludGsoInNwbGl0dGluZyBpbmRleCBub2RlLi4uXG4iKTsKKwkJCWZkLT5ibm9kZSA9IHBhcmVudDsKKwkJCW5ld19ub2RlID0gaGZzX2Jub2RlX3NwbGl0KGZkKTsKKwkJCWlmIChJU19FUlIobmV3X25vZGUpKQorCQkJCXJldHVybiBQVFJfRVJSKG5ld19ub2RlKTsKKwkJCXBhcmVudCA9IGZkLT5ibm9kZTsKKwkJCXJlYyA9IGZkLT5yZWNvcmQ7CisJCQlyZWNfb2ZmID0gdHJlZS0+bm9kZV9zaXplIC0gKHJlYyArIDIpICogMjsKKwkJCWVuZF9yZWNfb2ZmID0gdHJlZS0+bm9kZV9zaXplIC0gKHBhcmVudC0+bnVtX3JlY3MgKyAxKSAqIDI7CisJCX0KKwl9CisKKwllbmRfb2ZmID0gc3RhcnRfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KHBhcmVudCwgcmVjX29mZik7CisJaGZzX2Jub2RlX3dyaXRlX3UxNihwYXJlbnQsIHJlY19vZmYsIHN0YXJ0X29mZiArIGRpZmYpOworCXN0YXJ0X29mZiAtPSA0OwkvKiBtb3ZlIHByZXZpb3VzIGNuaWQgdG9vICovCisKKwl3aGlsZSAocmVjX29mZiA+IGVuZF9yZWNfb2ZmKSB7CisJCXJlY19vZmYgLT0gMjsKKwkJZW5kX29mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihwYXJlbnQsIHJlY19vZmYpOworCQloZnNfYm5vZGVfd3JpdGVfdTE2KHBhcmVudCwgcmVjX29mZiwgZW5kX29mZiArIGRpZmYpOworCX0KKwloZnNfYm5vZGVfbW92ZShwYXJlbnQsIHN0YXJ0X29mZiArIGRpZmYsIHN0YXJ0X29mZiwKKwkJICAgICAgIGVuZF9vZmYgLSBzdGFydF9vZmYpOworc2tpcDoKKwloZnNfYm5vZGVfY29weShwYXJlbnQsIGZkLT5rZXlvZmZzZXQsIG5vZGUsIDE0LCBuZXdrZXlsZW4pOworCWlmICghKHRyZWUtPmF0dHJpYnV0ZXMgJiBIRlNfVFJFRV9WQVJJRFhLRVlTKSkKKwkJaGZzX2Jub2RlX3dyaXRlX3U4KHBhcmVudCwgZmQtPmtleW9mZnNldCwgbmV3a2V5bGVuIC0gMSk7CisJaGZzX2Jub2RlX2R1bXAocGFyZW50KTsKKworCWhmc19ibm9kZV9wdXQobm9kZSk7CisJbm9kZSA9IHBhcmVudDsKKworCWlmIChuZXdfbm9kZSkgeworCQlfX2JlMzIgY25pZDsKKworCQlmZC0+Ym5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBuZXdfbm9kZS0+cGFyZW50KTsKKwkJLyogY3JlYXRlIGluZGV4IGtleSBhbmQgZW50cnkgKi8KKwkJaGZzX2Jub2RlX3JlYWRfa2V5KG5ld19ub2RlLCBmZC0+c2VhcmNoX2tleSwgMTQpOworCQljbmlkID0gY3B1X3RvX2JlMzIobmV3X25vZGUtPnRoaXMpOworCisJCV9faGZzX2JyZWNfZmluZChmZC0+Ym5vZGUsIGZkKTsKKwkJaGZzX2JyZWNfaW5zZXJ0KGZkLCAmY25pZCwgc2l6ZW9mKGNuaWQpKTsKKwkJaGZzX2Jub2RlX3B1dChmZC0+Ym5vZGUpOworCQloZnNfYm5vZGVfcHV0KG5ld19ub2RlKTsKKworCQlpZiAoIXJlYykgeworCQkJaWYgKG5ld19ub2RlID09IG5vZGUpCisJCQkJZ290byBvdXQ7CisJCQkvKiByZXN0b3JlIHNlYXJjaF9rZXkgKi8KKwkJCWhmc19ibm9kZV9yZWFkX2tleShub2RlLCBmZC0+c2VhcmNoX2tleSwgMTQpOworCQl9CisJfQorCisJaWYgKCFyZWMgJiYgbm9kZS0+cGFyZW50KQorCQlnb3RvIGFnYWluOworb3V0OgorCWZkLT5ibm9kZSA9IG5vZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGZzX2J0cmVlX2luY19oZWlnaHQoc3RydWN0IGhmc19idHJlZSAqdHJlZSkKK3sKKwlzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCAqbmV3X25vZGU7CisJc3RydWN0IGhmc19ibm9kZV9kZXNjIG5vZGVfZGVzYzsKKwlpbnQga2V5X3NpemUsIHJlYzsKKwlfX2JlMzIgY25pZDsKKworCW5vZGUgPSBOVUxMOworCWlmICh0cmVlLT5yb290KSB7CisJCW5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCB0cmVlLT5yb290KTsKKwkJaWYgKElTX0VSUihub2RlKSkKKwkJCXJldHVybiBQVFJfRVJSKG5vZGUpOworCX0KKwluZXdfbm9kZSA9IGhmc19ibWFwX2FsbG9jKHRyZWUpOworCWlmIChJU19FUlIobmV3X25vZGUpKSB7CisJCWhmc19ibm9kZV9wdXQobm9kZSk7CisJCXJldHVybiBQVFJfRVJSKG5ld19ub2RlKTsKKwl9CisKKwl0cmVlLT5yb290ID0gbmV3X25vZGUtPnRoaXM7CisJaWYgKCF0cmVlLT5kZXB0aCkgeworCQl0cmVlLT5sZWFmX2hlYWQgPSB0cmVlLT5sZWFmX3RhaWwgPSBuZXdfbm9kZS0+dGhpczsKKwkJbmV3X25vZGUtPnR5cGUgPSBIRlNfTk9ERV9MRUFGOworCQluZXdfbm9kZS0+bnVtX3JlY3MgPSAwOworCX0gZWxzZSB7CisJCW5ld19ub2RlLT50eXBlID0gSEZTX05PREVfSU5ERVg7CisJCW5ld19ub2RlLT5udW1fcmVjcyA9IDE7CisJfQorCW5ld19ub2RlLT5wYXJlbnQgPSAwOworCW5ld19ub2RlLT5uZXh0ID0gMDsKKwluZXdfbm9kZS0+cHJldiA9IDA7CisJbmV3X25vZGUtPmhlaWdodCA9ICsrdHJlZS0+ZGVwdGg7CisKKwlub2RlX2Rlc2MubmV4dCA9IGNwdV90b19iZTMyKG5ld19ub2RlLT5uZXh0KTsKKwlub2RlX2Rlc2MucHJldiA9IGNwdV90b19iZTMyKG5ld19ub2RlLT5wcmV2KTsKKwlub2RlX2Rlc2MudHlwZSA9IG5ld19ub2RlLT50eXBlOworCW5vZGVfZGVzYy5oZWlnaHQgPSBuZXdfbm9kZS0+aGVpZ2h0OworCW5vZGVfZGVzYy5udW1fcmVjcyA9IGNwdV90b19iZTE2KG5ld19ub2RlLT5udW1fcmVjcyk7CisJbm9kZV9kZXNjLnJlc2VydmVkID0gMDsKKwloZnNfYm5vZGVfd3JpdGUobmV3X25vZGUsICZub2RlX2Rlc2MsIDAsIHNpemVvZihub2RlX2Rlc2MpKTsKKworCXJlYyA9IHRyZWUtPm5vZGVfc2l6ZSAtIDI7CisJaGZzX2Jub2RlX3dyaXRlX3UxNihuZXdfbm9kZSwgcmVjLCAxNCk7CisKKwlpZiAobm9kZSkgeworCQkvKiBpbnNlcnQgb2xkIHJvb3QgaWR4IGludG8gbmV3IHJvb3QgKi8KKwkJbm9kZS0+cGFyZW50ID0gdHJlZS0+cm9vdDsKKwkJaWYgKG5vZGUtPnR5cGUgPT0gSEZTX05PREVfTEVBRiB8fAorCQkgICAgdHJlZS0+YXR0cmlidXRlcyAmIEhGU19UUkVFX1ZBUklEWEtFWVMpCisJCQlrZXlfc2l6ZSA9IGhmc19ibm9kZV9yZWFkX3U4KG5vZGUsIDE0KSArIDE7CisJCWVsc2UKKwkJCWtleV9zaXplID0gdHJlZS0+bWF4X2tleV9sZW4gKyAxOworCQloZnNfYm5vZGVfY29weShuZXdfbm9kZSwgMTQsIG5vZGUsIDE0LCBrZXlfc2l6ZSk7CisKKwkJaWYgKCEodHJlZS0+YXR0cmlidXRlcyAmIEhGU19UUkVFX1ZBUklEWEtFWVMpKSB7CisJCQlrZXlfc2l6ZSA9IHRyZWUtPm1heF9rZXlfbGVuICsgMTsKKwkJCWhmc19ibm9kZV93cml0ZV91OChuZXdfbm9kZSwgMTQsIHRyZWUtPm1heF9rZXlfbGVuKTsKKwkJfQorCQlrZXlfc2l6ZSA9IChrZXlfc2l6ZSArIDEpICYgLTI7CisJCWNuaWQgPSBjcHVfdG9fYmUzMihub2RlLT50aGlzKTsKKwkJaGZzX2Jub2RlX3dyaXRlKG5ld19ub2RlLCAmY25pZCwgMTQgKyBrZXlfc2l6ZSwgNCk7CisKKwkJcmVjIC09IDI7CisJCWhmc19ibm9kZV93cml0ZV91MTYobmV3X25vZGUsIHJlYywgMTQgKyBrZXlfc2l6ZSArIDQpOworCisJCWhmc19ibm9kZV9wdXQobm9kZSk7CisJfQorCWhmc19ibm9kZV9wdXQobmV3X25vZGUpOworCW1hcmtfaW5vZGVfZGlydHkodHJlZS0+aW5vZGUpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9oZnMvYnRyZWUuYyBiL2ZzL2hmcy9idHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDcyNWUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9oZnMvYnRyZWUuYwpAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqICBsaW51eC9mcy9oZnMvYnRyZWUuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMQorICogQnJhZCBCb3llciAoZmxhckBhbGxhbmRyaWEuY29tKQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICoKKyAqIEhhbmRsZSBvcGVuaW5nL2Nsb3NpbmcgYnRyZWUKKyAqLworCisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorCisjaW5jbHVkZSAiYnRyZWUuaCIKKworLyogR2V0IGEgcmVmZXJlbmNlIHRvIGEgQipUcmVlIGFuZCBkbyBzb21lIGluaXRpYWwgY2hlY2tzICovCitzdHJ1Y3QgaGZzX2J0cmVlICpoZnNfYnRyZWVfb3BlbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MzIgaWQsIGJ0cmVlX2tleWNtcCBrZXljbXApCit7CisJc3RydWN0IGhmc19idHJlZSAqdHJlZTsKKwlzdHJ1Y3QgaGZzX2J0cmVlX2hlYWRlcl9yZWMgKmhlYWQ7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwl0cmVlID0ga21hbGxvYyhzaXplb2YoKnRyZWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRyZWUpCisJCXJldHVybiBOVUxMOworCW1lbXNldCh0cmVlLCAwLCBzaXplb2YoKnRyZWUpKTsKKworCWluaXRfTVVURVgoJnRyZWUtPnRyZWVfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnRyZWUtPmhhc2hfbG9jayk7CisJLyogU2V0IHRoZSBjb3JyZWN0IGNvbXBhcmUgZnVuY3Rpb24gKi8KKwl0cmVlLT5zYiA9IHNiOworCXRyZWUtPmNuaWQgPSBpZDsKKwl0cmVlLT5rZXljbXAgPSBrZXljbXA7CisKKwl0cmVlLT5pbm9kZSA9IGlnZXRfbG9ja2VkKHNiLCBpZCk7CisJaWYgKCF0cmVlLT5pbm9kZSkKKwkJZ290byBmcmVlX3RyZWU7CisJaWYgKCEodHJlZS0+aW5vZGUtPmlfc3RhdGUgJiBJX05FVykpCisJCUJVRygpOworCXsKKwlzdHJ1Y3QgaGZzX21kYiAqbWRiID0gSEZTX1NCKHNiKS0+bWRiOworCUhGU19JKHRyZWUtPmlub2RlKS0+ZmxhZ3MgPSAwOworCWluaXRfTVVURVgoJkhGU19JKHRyZWUtPmlub2RlKS0+ZXh0ZW50c19sb2NrKTsKKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBIRlNfRVhUX0NOSUQ6CisJCWhmc19pbm9kZV9yZWFkX2ZvcmsodHJlZS0+aW5vZGUsIG1kYi0+ZHJYVEV4dFJlYywgbWRiLT5kclhURmxTaXplLAorCQkJCSAgICBtZGItPmRyWFRGbFNpemUsIGJlMzJfdG9fY3B1KG1kYi0+ZHJYVENscFNpeikpOworCQl0cmVlLT5pbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZoZnNfYnRyZWVfYW9wczsKKwkJYnJlYWs7CisJY2FzZSBIRlNfQ0FUX0NOSUQ6CisJCWhmc19pbm9kZV9yZWFkX2ZvcmsodHJlZS0+aW5vZGUsIG1kYi0+ZHJDVEV4dFJlYywgbWRiLT5kckNURmxTaXplLAorCQkJCSAgICBtZGItPmRyQ1RGbFNpemUsIGJlMzJfdG9fY3B1KG1kYi0+ZHJDVENscFNpeikpOworCQl0cmVlLT5pbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZoZnNfYnRyZWVfYW9wczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCX0KKwl1bmxvY2tfbmV3X2lub2RlKHRyZWUtPmlub2RlKTsKKworCW1hcHBpbmcgPSB0cmVlLT5pbm9kZS0+aV9tYXBwaW5nOworCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgMCwgKGZpbGxlcl90ICopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwlpZiAoSVNfRVJSKHBhZ2UpKQorCQlnb3RvIGZyZWVfdHJlZTsKKworCS8qIExvYWQgdGhlIGhlYWRlciAqLworCWhlYWQgPSAoc3RydWN0IGhmc19idHJlZV9oZWFkZXJfcmVjICopKGttYXAocGFnZSkgKyBzaXplb2Yoc3RydWN0IGhmc19ibm9kZV9kZXNjKSk7CisJdHJlZS0+cm9vdCA9IGJlMzJfdG9fY3B1KGhlYWQtPnJvb3QpOworCXRyZWUtPmxlYWZfY291bnQgPSBiZTMyX3RvX2NwdShoZWFkLT5sZWFmX2NvdW50KTsKKwl0cmVlLT5sZWFmX2hlYWQgPSBiZTMyX3RvX2NwdShoZWFkLT5sZWFmX2hlYWQpOworCXRyZWUtPmxlYWZfdGFpbCA9IGJlMzJfdG9fY3B1KGhlYWQtPmxlYWZfdGFpbCk7CisJdHJlZS0+bm9kZV9jb3VudCA9IGJlMzJfdG9fY3B1KGhlYWQtPm5vZGVfY291bnQpOworCXRyZWUtPmZyZWVfbm9kZXMgPSBiZTMyX3RvX2NwdShoZWFkLT5mcmVlX25vZGVzKTsKKwl0cmVlLT5hdHRyaWJ1dGVzID0gYmUzMl90b19jcHUoaGVhZC0+YXR0cmlidXRlcyk7CisJdHJlZS0+bm9kZV9zaXplID0gYmUxNl90b19jcHUoaGVhZC0+bm9kZV9zaXplKTsKKwl0cmVlLT5tYXhfa2V5X2xlbiA9IGJlMTZfdG9fY3B1KGhlYWQtPm1heF9rZXlfbGVuKTsKKwl0cmVlLT5kZXB0aCA9IGJlMTZfdG9fY3B1KGhlYWQtPmRlcHRoKTsKKworCXNpemUgPSB0cmVlLT5ub2RlX3NpemU7CisJaWYgKCFzaXplIHx8IHNpemUgJiAoc2l6ZSAtIDEpKQorCQlnb3RvIGZhaWxfcGFnZTsKKwlpZiAoIXRyZWUtPm5vZGVfY291bnQpCisJCWdvdG8gZmFpbF9wYWdlOworCXRyZWUtPm5vZGVfc2l6ZV9zaGlmdCA9IGZmcyhzaXplKSAtIDE7CisJdHJlZS0+cGFnZXNfcGVyX2Jub2RlID0gKHRyZWUtPm5vZGVfc2l6ZSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisKKwlrdW5tYXAocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXJldHVybiB0cmVlOworCisgZmFpbF9wYWdlOgorCXRyZWUtPmlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmhmc19hb3BzOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKyBmcmVlX3RyZWU6CisJaXB1dCh0cmVlLT5pbm9kZSk7CisJa2ZyZWUodHJlZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJlbGVhc2UgcmVzb3VyY2VzIHVzZWQgYnkgYSBidHJlZSAqLwordm9pZCBoZnNfYnRyZWVfY2xvc2Uoc3RydWN0IGhmc19idHJlZSAqdHJlZSkKK3sKKwlzdHJ1Y3QgaGZzX2Jub2RlICpub2RlOworCWludCBpOworCisJaWYgKCF0cmVlKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgTk9ERV9IQVNIX1NJWkU7IGkrKykgeworCQl3aGlsZSAoKG5vZGUgPSB0cmVlLT5ub2RlX2hhc2hbaV0pKSB7CisJCQl0cmVlLT5ub2RlX2hhc2hbaV0gPSBub2RlLT5uZXh0X2hhc2g7CisJCQlpZiAoYXRvbWljX3JlYWQoJm5vZGUtPnJlZmNudCkpCisJCQkJcHJpbnRrKCJIRlM6IG5vZGUgJWQ6JWQgc3RpbGwgaGFzICVkIHVzZXIocykhXG4iLAorCQkJCQlub2RlLT50cmVlLT5jbmlkLCBub2RlLT50aGlzLCBhdG9taWNfcmVhZCgmbm9kZS0+cmVmY250KSk7CisJCQloZnNfYm5vZGVfZnJlZShub2RlKTsKKwkJCXRyZWUtPm5vZGVfaGFzaF9jbnQtLTsKKwkJfQorCX0KKwlpcHV0KHRyZWUtPmlub2RlKTsKKwlrZnJlZSh0cmVlKTsKK30KKwordm9pZCBoZnNfYnRyZWVfd3JpdGUoc3RydWN0IGhmc19idHJlZSAqdHJlZSkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlX2hlYWRlcl9yZWMgKmhlYWQ7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCW5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCAwKTsKKwlpZiAoSVNfRVJSKG5vZGUpKQorCQkvKiBwYW5pYz8gKi8KKwkJcmV0dXJuOworCS8qIExvYWQgdGhlIGhlYWRlciAqLworCXBhZ2UgPSBub2RlLT5wYWdlWzBdOworCWhlYWQgPSAoc3RydWN0IGhmc19idHJlZV9oZWFkZXJfcmVjICopKGttYXAocGFnZSkgKyBzaXplb2Yoc3RydWN0IGhmc19ibm9kZV9kZXNjKSk7CisKKwloZWFkLT5yb290ID0gY3B1X3RvX2JlMzIodHJlZS0+cm9vdCk7CisJaGVhZC0+bGVhZl9jb3VudCA9IGNwdV90b19iZTMyKHRyZWUtPmxlYWZfY291bnQpOworCWhlYWQtPmxlYWZfaGVhZCA9IGNwdV90b19iZTMyKHRyZWUtPmxlYWZfaGVhZCk7CisJaGVhZC0+bGVhZl90YWlsID0gY3B1X3RvX2JlMzIodHJlZS0+bGVhZl90YWlsKTsKKwloZWFkLT5ub2RlX2NvdW50ID0gY3B1X3RvX2JlMzIodHJlZS0+bm9kZV9jb3VudCk7CisJaGVhZC0+ZnJlZV9ub2RlcyA9IGNwdV90b19iZTMyKHRyZWUtPmZyZWVfbm9kZXMpOworCWhlYWQtPmF0dHJpYnV0ZXMgPSBjcHVfdG9fYmUzMih0cmVlLT5hdHRyaWJ1dGVzKTsKKwloZWFkLT5kZXB0aCA9IGNwdV90b19iZTE2KHRyZWUtPmRlcHRoKTsKKworCWt1bm1hcChwYWdlKTsKKwlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwloZnNfYm5vZGVfcHV0KG5vZGUpOworfQorCitzdGF0aWMgc3RydWN0IGhmc19ibm9kZSAqaGZzX2JtYXBfbmV3X2JtYXAoc3RydWN0IGhmc19ibm9kZSAqcHJldiwgdTMyIGlkeCkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlID0gcHJldi0+dHJlZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlICpub2RlOworCXN0cnVjdCBoZnNfYm5vZGVfZGVzYyBkZXNjOworCV9fYmUzMiBjbmlkOworCisJbm9kZSA9IGhmc19ibm9kZV9jcmVhdGUodHJlZSwgaWR4KTsKKwlpZiAoSVNfRVJSKG5vZGUpKQorCQlyZXR1cm4gbm9kZTsKKworCWlmICghdHJlZS0+ZnJlZV9ub2RlcykKKwkJcGFuaWMoIkZJWE1FISEhIik7CisJdHJlZS0+ZnJlZV9ub2Rlcy0tOworCXByZXYtPm5leHQgPSBpZHg7CisJY25pZCA9IGNwdV90b19iZTMyKGlkeCk7CisJaGZzX2Jub2RlX3dyaXRlKHByZXYsICZjbmlkLCBvZmZzZXRvZihzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MsIG5leHQpLCA0KTsKKworCW5vZGUtPnR5cGUgPSBIRlNfTk9ERV9NQVA7CisJbm9kZS0+bnVtX3JlY3MgPSAxOworCWhmc19ibm9kZV9jbGVhcihub2RlLCAwLCB0cmVlLT5ub2RlX3NpemUpOworCWRlc2MubmV4dCA9IDA7CisJZGVzYy5wcmV2ID0gMDsKKwlkZXNjLnR5cGUgPSBIRlNfTk9ERV9NQVA7CisJZGVzYy5oZWlnaHQgPSAwOworCWRlc2MubnVtX3JlY3MgPSBjcHVfdG9fYmUxNigxKTsKKwlkZXNjLnJlc2VydmVkID0gMDsKKwloZnNfYm5vZGVfd3JpdGUobm9kZSwgJmRlc2MsIDAsIHNpemVvZihkZXNjKSk7CisJaGZzX2Jub2RlX3dyaXRlX3UxNihub2RlLCAxNCwgMHg4MDAwKTsKKwloZnNfYm5vZGVfd3JpdGVfdTE2KG5vZGUsIHRyZWUtPm5vZGVfc2l6ZSAtIDIsIDE0KTsKKwloZnNfYm5vZGVfd3JpdGVfdTE2KG5vZGUsIHRyZWUtPm5vZGVfc2l6ZSAtIDQsIHRyZWUtPm5vZGVfc2l6ZSAtIDYpOworCisJcmV0dXJuIG5vZGU7Cit9CisKK3N0cnVjdCBoZnNfYm5vZGUgKmhmc19ibWFwX2FsbG9jKHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUpCit7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgKm5leHRfbm9kZTsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VwOworCXUzMiBuaWR4LCBpZHg7CisJdTE2IG9mZiwgbGVuOworCXU4ICpkYXRhLCBieXRlLCBtOworCWludCBpOworCisJd2hpbGUgKCF0cmVlLT5mcmVlX25vZGVzKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSB0cmVlLT5pbm9kZTsKKwkJdTMyIGNvdW50OworCQlpbnQgcmVzOworCisJCXJlcyA9IGhmc19leHRlbmRfZmlsZShpbm9kZSk7CisJCWlmIChyZXMpCisJCQlyZXR1cm4gRVJSX1BUUihyZXMpOworCQlIRlNfSShpbm9kZSktPnBoeXNfc2l6ZSA9IGlub2RlLT5pX3NpemUgPQorCQkJCShsb2ZmX3QpSEZTX0koaW5vZGUpLT5hbGxvY19ibG9ja3MgKgorCQkJCUhGU19TQih0cmVlLT5zYiktPmFsbG9jX2Jsa3N6OworCQlIRlNfSShpbm9kZSktPmZzX2Jsb2NrcyA9IGlub2RlLT5pX3NpemUgPj4KKwkJCQkJICB0cmVlLT5zYi0+c19ibG9ja3NpemVfYml0czsKKwkJaW5vZGVfc2V0X2J5dGVzKGlub2RlLCBpbm9kZS0+aV9zaXplKTsKKwkJY291bnQgPSBpbm9kZS0+aV9zaXplID4+IHRyZWUtPm5vZGVfc2l6ZV9zaGlmdDsKKwkJdHJlZS0+ZnJlZV9ub2RlcyA9IGNvdW50IC0gdHJlZS0+bm9kZV9jb3VudDsKKwkJdHJlZS0+bm9kZV9jb3VudCA9IGNvdW50OworCX0KKworCW5pZHggPSAwOworCW5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBuaWR4KTsKKwlpZiAoSVNfRVJSKG5vZGUpKQorCQlyZXR1cm4gbm9kZTsKKwlsZW4gPSBoZnNfYnJlY19sZW5vZmYobm9kZSwgMiwgJm9mZik7CisKKwlvZmYgKz0gbm9kZS0+cGFnZV9vZmZzZXQ7CisJcGFnZXAgPSBub2RlLT5wYWdlICsgKG9mZiA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwlkYXRhID0ga21hcCgqcGFnZXApOworCW9mZiAmPSB+UEFHRV9DQUNIRV9NQVNLOworCWlkeCA9IDA7CisKKwlmb3IgKDs7KSB7CisJCXdoaWxlIChsZW4pIHsKKwkJCWJ5dGUgPSBkYXRhW29mZl07CisJCQlpZiAoYnl0ZSAhPSAweGZmKSB7CisJCQkJZm9yIChtID0gMHg4MCwgaSA9IDA7IGkgPCA4OyBtID4+PSAxLCBpKyspIHsKKwkJCQkJaWYgKCEoYnl0ZSAmIG0pKSB7CisJCQkJCQlpZHggKz0gaTsKKwkJCQkJCWRhdGFbb2ZmXSB8PSBtOworCQkJCQkJc2V0X3BhZ2VfZGlydHkoKnBhZ2VwKTsKKwkJCQkJCWt1bm1hcCgqcGFnZXApOworCQkJCQkJdHJlZS0+ZnJlZV9ub2Rlcy0tOworCQkJCQkJbWFya19pbm9kZV9kaXJ0eSh0cmVlLT5pbm9kZSk7CisJCQkJCQloZnNfYm5vZGVfcHV0KG5vZGUpOworCQkJCQkJcmV0dXJuIGhmc19ibm9kZV9jcmVhdGUodHJlZSwgaWR4KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmICgrK29mZiA+PSBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJCQlrdW5tYXAoKnBhZ2VwKTsKKwkJCQlkYXRhID0ga21hcCgqKytwYWdlcCk7CisJCQkJb2ZmID0gMDsKKwkJCX0KKwkJCWlkeCArPSA4OworCQkJbGVuLS07CisJCX0KKwkJa3VubWFwKCpwYWdlcCk7CisJCW5pZHggPSBub2RlLT5uZXh0OworCQlpZiAoIW5pZHgpIHsKKwkJCXByaW50aygiY3JlYXRlIG5ldyBibWFwIG5vZGUuLi5cbiIpOworCQkJbmV4dF9ub2RlID0gaGZzX2JtYXBfbmV3X2JtYXAobm9kZSwgaWR4KTsKKwkJfSBlbHNlCisJCQluZXh0X25vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBuaWR4KTsKKwkJaGZzX2Jub2RlX3B1dChub2RlKTsKKwkJaWYgKElTX0VSUihuZXh0X25vZGUpKQorCQkJcmV0dXJuIG5leHRfbm9kZTsKKwkJbm9kZSA9IG5leHRfbm9kZTsKKworCQlsZW4gPSBoZnNfYnJlY19sZW5vZmYobm9kZSwgMCwgJm9mZik7CisJCW9mZiArPSBub2RlLT5wYWdlX29mZnNldDsKKwkJcGFnZXAgPSBub2RlLT5wYWdlICsgKG9mZiA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJZGF0YSA9IGttYXAoKnBhZ2VwKTsKKwkJb2ZmICY9IH5QQUdFX0NBQ0hFX01BU0s7CisJfQorfQorCit2b2lkIGhmc19ibWFwX2ZyZWUoc3RydWN0IGhmc19ibm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBwYWdlICpwYWdlOworCXUxNiBvZmYsIGxlbjsKKwl1MzIgbmlkeDsKKwl1OCAqZGF0YSwgYnl0ZSwgbTsKKworCWRwcmludChEQkdfQk5PREVfTU9ELCAiYnRyZWVfZnJlZV9ub2RlOiAldVxuIiwgbm9kZS0+dGhpcyk7CisJdHJlZSA9IG5vZGUtPnRyZWU7CisJbmlkeCA9IG5vZGUtPnRoaXM7CisJbm9kZSA9IGhmc19ibm9kZV9maW5kKHRyZWUsIDApOworCWlmIChJU19FUlIobm9kZSkpCisJCXJldHVybjsKKwlsZW4gPSBoZnNfYnJlY19sZW5vZmYobm9kZSwgMiwgJm9mZik7CisJd2hpbGUgKG5pZHggPj0gbGVuICogOCkgeworCQl1MzIgaTsKKworCQluaWR4IC09IGxlbiAqIDg7CisJCWkgPSBub2RlLT5uZXh0OworCQloZnNfYm5vZGVfcHV0KG5vZGUpOworCQlpZiAoIWkpIHsKKwkJCS8qIHBhbmljICovOworCQkJcHJpbnRrKCJIRlM6IHVuYWJsZSB0byBmcmVlIGJub2RlICV1LiBibWFwIG5vdCBmb3VuZCFcbiIsIG5vZGUtPnRoaXMpOworCQkJcmV0dXJuOworCQl9CisJCW5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBpKTsKKwkJaWYgKElTX0VSUihub2RlKSkKKwkJCXJldHVybjsKKwkJaWYgKG5vZGUtPnR5cGUgIT0gSEZTX05PREVfTUFQKSB7CisJCQkvKiBwYW5pYyAqLzsKKwkJCXByaW50aygiSEZTOiBpbnZhbGlkIGJtYXAgZm91bmQhICgldSwlZClcbiIsIG5vZGUtPnRoaXMsIG5vZGUtPnR5cGUpOworCQkJaGZzX2Jub2RlX3B1dChub2RlKTsKKwkJCXJldHVybjsKKwkJfQorCQlsZW4gPSBoZnNfYnJlY19sZW5vZmYobm9kZSwgMCwgJm9mZik7CisJfQorCW9mZiArPSBub2RlLT5wYWdlX29mZnNldCArIG5pZHggLyA4OworCXBhZ2UgPSBub2RlLT5wYWdlW29mZiA+PiBQQUdFX0NBQ0hFX1NISUZUXTsKKwlkYXRhID0ga21hcChwYWdlKTsKKwlvZmYgJj0gflBBR0VfQ0FDSEVfTUFTSzsKKwltID0gMSA8PCAofm5pZHggJiA3KTsKKwlieXRlID0gZGF0YVtvZmZdOworCWlmICghKGJ5dGUgJiBtKSkgeworCQlwcmludGsoIkhGUzogdHJ5aW5nIHRvIGZyZWUgZnJlZSBibm9kZSAldSglZClcbiIsIG5vZGUtPnRoaXMsIG5vZGUtPnR5cGUpOworCQlrdW5tYXAocGFnZSk7CisJCWhmc19ibm9kZV9wdXQobm9kZSk7CisJCXJldHVybjsKKwl9CisJZGF0YVtvZmZdID0gYnl0ZSAmIH5tOworCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwloZnNfYm5vZGVfcHV0KG5vZGUpOworCXRyZWUtPmZyZWVfbm9kZXMrKzsKKwltYXJrX2lub2RlX2RpcnR5KHRyZWUtPmlub2RlKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2hmcy9idHJlZS5oIGIvZnMvaGZzL2J0cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M1MTkwNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9idHJlZS5oCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogIGxpbnV4L2ZzL2hmcy9idHJlZS5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxCisgKiBCcmFkIEJveWVyIChmbGFyQGFsbGFuZHJpYS5jb20pCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKi8KKworI2luY2x1ZGUgImhmc19mcy5oIgorCit0eXBlZGVmIGludCAoKmJ0cmVlX2tleWNtcCkoY29uc3QgYnRyZWVfa2V5ICosIGNvbnN0IGJ0cmVlX2tleSAqKTsKKworI2RlZmluZSBOT0RFX0hBU0hfU0laRSAgMjU2CisKKy8qIEEgSEZTIEJUcmVlIGhlbGQgaW4gbWVtb3J5ICovCitzdHJ1Y3QgaGZzX2J0cmVlIHsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJYnRyZWVfa2V5Y21wIGtleWNtcDsKKworCXUzMiBjbmlkOworCXUzMiByb290OworCXUzMiBsZWFmX2NvdW50OworCXUzMiBsZWFmX2hlYWQ7CisJdTMyIGxlYWZfdGFpbDsKKwl1MzIgbm9kZV9jb3VudDsKKwl1MzIgZnJlZV9ub2RlczsKKwl1MzIgYXR0cmlidXRlczsKKworCXVuc2lnbmVkIGludCBub2RlX3NpemU7CisJdW5zaWduZWQgaW50IG5vZGVfc2l6ZV9zaGlmdDsKKwl1bnNpZ25lZCBpbnQgbWF4X2tleV9sZW47CisJdW5zaWduZWQgaW50IGRlcHRoOworCisJLy91bnNpZ25lZCBpbnQgbWFwMV9zaXplLCBtYXBfc2l6ZTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHRyZWVfbG9jazsKKworCXVuc2lnbmVkIGludCBwYWdlc19wZXJfYm5vZGU7CisJc3BpbmxvY2tfdCBoYXNoX2xvY2s7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZV9oYXNoW05PREVfSEFTSF9TSVpFXTsKKwlpbnQgbm9kZV9oYXNoX2NudDsKK307CisKKy8qIEEgSEZTIEJUcmVlIG5vZGUgaW4gbWVtb3J5ICovCitzdHJ1Y3QgaGZzX2Jub2RlIHsKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCisJdTMyIHByZXY7CisJdTMyIHRoaXM7CisJdTMyIG5leHQ7CisJdTMyIHBhcmVudDsKKworCXUxNiBudW1fcmVjczsKKwl1OCB0eXBlOworCXU4IGhlaWdodDsKKworCXN0cnVjdCBoZnNfYm5vZGUgKm5leHRfaGFzaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXdhaXRfcXVldWVfaGVhZF90IGxvY2tfd3E7CisJYXRvbWljX3QgcmVmY250OworCXVuc2lnbmVkIGludCBwYWdlX29mZnNldDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZVswXTsKK307CisKKyNkZWZpbmUgSEZTX0JOT0RFX0VSUk9SCQkwCisjZGVmaW5lIEhGU19CTk9ERV9ORVcJCTEKKyNkZWZpbmUgSEZTX0JOT0RFX0RFTEVURUQJMgorCitzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSB7CisJYnRyZWVfa2V5ICprZXk7CisJYnRyZWVfa2V5ICpzZWFyY2hfa2V5OworCXN0cnVjdCBoZnNfYnRyZWUgKnRyZWU7CisJc3RydWN0IGhmc19ibm9kZSAqYm5vZGU7CisJaW50IHJlY29yZDsKKwlpbnQga2V5b2Zmc2V0LCBrZXlsZW5ndGg7CisJaW50IGVudHJ5b2Zmc2V0LCBlbnRyeWxlbmd0aDsKK307CisKKworLyogYnRyZWUuYyAqLworZXh0ZXJuIHN0cnVjdCBoZnNfYnRyZWUgKmhmc19idHJlZV9vcGVuKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1MzIsIGJ0cmVlX2tleWNtcCk7CitleHRlcm4gdm9pZCBoZnNfYnRyZWVfY2xvc2Uoc3RydWN0IGhmc19idHJlZSAqKTsKK2V4dGVybiB2b2lkIGhmc19idHJlZV93cml0ZShzdHJ1Y3QgaGZzX2J0cmVlICopOworZXh0ZXJuIHN0cnVjdCBoZnNfYm5vZGUgKiBoZnNfYm1hcF9hbGxvYyhzdHJ1Y3QgaGZzX2J0cmVlICopOworZXh0ZXJuIHZvaWQgaGZzX2JtYXBfZnJlZShzdHJ1Y3QgaGZzX2Jub2RlICpub2RlKTsKKworLyogYm5vZGUuYyAqLworZXh0ZXJuIHZvaWQgaGZzX2Jub2RlX3JlYWQoc3RydWN0IGhmc19ibm9kZSAqLCB2b2lkICosIGludCwgaW50KTsKK2V4dGVybiB1MTYgaGZzX2Jub2RlX3JlYWRfdTE2KHN0cnVjdCBoZnNfYm5vZGUgKiwgaW50KTsKK2V4dGVybiB1OCBoZnNfYm5vZGVfcmVhZF91OChzdHJ1Y3QgaGZzX2Jub2RlICosIGludCk7CitleHRlcm4gdm9pZCBoZnNfYm5vZGVfcmVhZF9rZXkoc3RydWN0IGhmc19ibm9kZSAqLCB2b2lkICosIGludCk7CitleHRlcm4gdm9pZCBoZnNfYm5vZGVfd3JpdGUoc3RydWN0IGhmc19ibm9kZSAqLCB2b2lkICosIGludCwgaW50KTsKK2V4dGVybiB2b2lkIGhmc19ibm9kZV93cml0ZV91MTYoc3RydWN0IGhmc19ibm9kZSAqLCBpbnQsIHUxNik7CitleHRlcm4gdm9pZCBoZnNfYm5vZGVfd3JpdGVfdTgoc3RydWN0IGhmc19ibm9kZSAqLCBpbnQsIHU4KTsKK2V4dGVybiB2b2lkIGhmc19ibm9kZV9jbGVhcihzdHJ1Y3QgaGZzX2Jub2RlICosIGludCwgaW50KTsKK2V4dGVybiB2b2lkIGhmc19ibm9kZV9jb3B5KHN0cnVjdCBoZnNfYm5vZGUgKiwgaW50LAorCQkJICAgc3RydWN0IGhmc19ibm9kZSAqLCBpbnQsIGludCk7CitleHRlcm4gdm9pZCBoZnNfYm5vZGVfbW92ZShzdHJ1Y3QgaGZzX2Jub2RlICosIGludCwgaW50LCBpbnQpOworZXh0ZXJuIHZvaWQgaGZzX2Jub2RlX2R1bXAoc3RydWN0IGhmc19ibm9kZSAqKTsKK2V4dGVybiB2b2lkIGhmc19ibm9kZV91bmxpbmsoc3RydWN0IGhmc19ibm9kZSAqKTsKK2V4dGVybiBzdHJ1Y3QgaGZzX2Jub2RlICpoZnNfYm5vZGVfZmluZGhhc2goc3RydWN0IGhmc19idHJlZSAqLCB1MzIpOworZXh0ZXJuIHN0cnVjdCBoZnNfYm5vZGUgKmhmc19ibm9kZV9maW5kKHN0cnVjdCBoZnNfYnRyZWUgKiwgdTMyKTsKK2V4dGVybiB2b2lkIGhmc19ibm9kZV91bmhhc2goc3RydWN0IGhmc19ibm9kZSAqKTsKK2V4dGVybiB2b2lkIGhmc19ibm9kZV9mcmVlKHN0cnVjdCBoZnNfYm5vZGUgKik7CitleHRlcm4gc3RydWN0IGhmc19ibm9kZSAqaGZzX2Jub2RlX2NyZWF0ZShzdHJ1Y3QgaGZzX2J0cmVlICosIHUzMik7CitleHRlcm4gdm9pZCBoZnNfYm5vZGVfZ2V0KHN0cnVjdCBoZnNfYm5vZGUgKik7CitleHRlcm4gdm9pZCBoZnNfYm5vZGVfcHV0KHN0cnVjdCBoZnNfYm5vZGUgKik7CisKKy8qIGJyZWMuYyAqLworZXh0ZXJuIHUxNiBoZnNfYnJlY19sZW5vZmYoc3RydWN0IGhmc19ibm9kZSAqLCB1MTYsIHUxNiAqKTsKK2V4dGVybiB1MTYgaGZzX2JyZWNfa2V5bGVuKHN0cnVjdCBoZnNfYm5vZGUgKiwgdTE2KTsKK2V4dGVybiBpbnQgaGZzX2JyZWNfaW5zZXJ0KHN0cnVjdCBoZnNfZmluZF9kYXRhICosIHZvaWQgKiwgaW50KTsKK2V4dGVybiBpbnQgaGZzX2JyZWNfcmVtb3ZlKHN0cnVjdCBoZnNfZmluZF9kYXRhICopOworCisvKiBiZmluZC5jICovCitleHRlcm4gaW50IGhmc19maW5kX2luaXQoc3RydWN0IGhmc19idHJlZSAqLCBzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqKTsKK2V4dGVybiB2b2lkIGhmc19maW5kX2V4aXQoc3RydWN0IGhmc19maW5kX2RhdGEgKik7CitleHRlcm4gaW50IF9faGZzX2JyZWNfZmluZChzdHJ1Y3QgaGZzX2Jub2RlICosIHN0cnVjdCBoZnNfZmluZF9kYXRhICopOworZXh0ZXJuIGludCBoZnNfYnJlY19maW5kKHN0cnVjdCBoZnNfZmluZF9kYXRhICopOworZXh0ZXJuIGludCBoZnNfYnJlY19yZWFkKHN0cnVjdCBoZnNfZmluZF9kYXRhICosIHZvaWQgKiwgaW50KTsKK2V4dGVybiBpbnQgaGZzX2JyZWNfZ290byhzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqLCBpbnQpOworCisKK3N0cnVjdCBoZnNfYm5vZGVfZGVzYyB7CisJX19iZTMyIG5leHQ7CQkvKiAoVikgTnVtYmVyIG9mIHRoZSBuZXh0IG5vZGUgYXQgdGhpcyBsZXZlbCAqLworCV9fYmUzMiBwcmV2OwkJLyogKFYpIE51bWJlciBvZiB0aGUgcHJldiBub2RlIGF0IHRoaXMgbGV2ZWwgKi8KKwl1OCB0eXBlOwkJLyogKEYpIFRoZSB0eXBlIG9mIG5vZGUgKi8KKwl1OCBoZWlnaHQ7CQkvKiAoRikgVGhlIGxldmVsIG9mIHRoaXMgbm9kZSAobGVhdmVzPTEpICovCisJX19iZTE2IG51bV9yZWNzOwkvKiAoVikgVGhlIG51bWJlciBvZiByZWNvcmRzIGluIHRoaXMgbm9kZSAqLworCXUxNiByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgSEZTX05PREVfSU5ERVgJMHgwMAkvKiBBbiBpbnRlcm5hbCAoaW5kZXgpIG5vZGUgKi8KKyNkZWZpbmUgSEZTX05PREVfSEVBREVSCTB4MDEJLyogVGhlIHRyZWUgaGVhZGVyIG5vZGUgKG5vZGUgMCkgKi8KKyNkZWZpbmUgSEZTX05PREVfTUFQCTB4MDIJLyogSG9sZHMgcGFydCBvZiB0aGUgYml0bWFwIG9mIHVzZWQgbm9kZXMgKi8KKyNkZWZpbmUgSEZTX05PREVfTEVBRgkweEZGCS8qIEEgbGVhZiAobmROSGVpZ2h0PT0xKSBub2RlICovCisKK3N0cnVjdCBoZnNfYnRyZWVfaGVhZGVyX3JlYyB7CisJX19iZTE2IGRlcHRoOwkJLyogKFYpIFRoZSBudW1iZXIgb2YgbGV2ZWxzIGluIHRoaXMgQi10cmVlICovCisJX19iZTMyIHJvb3Q7CQkvKiAoVikgVGhlIG5vZGUgbnVtYmVyIG9mIHRoZSByb290IG5vZGUgKi8KKwlfX2JlMzIgbGVhZl9jb3VudDsJLyogKFYpIFRoZSBudW1iZXIgb2YgbGVhZiByZWNvcmRzICovCisJX19iZTMyIGxlYWZfaGVhZDsJLyogKFYpIFRoZSBudW1iZXIgb2YgdGhlIGZpcnN0IGxlYWYgbm9kZSAqLworCV9fYmUzMiBsZWFmX3RhaWw7CS8qIChWKSBUaGUgbnVtYmVyIG9mIHRoZSBsYXN0IGxlYWYgbm9kZSAqLworCV9fYmUxNiBub2RlX3NpemU7CS8qIChGKSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgbm9kZSAoPTUxMikgKi8KKwlfX2JlMTYgbWF4X2tleV9sZW47CS8qIChGKSBUaGUgbGVuZ3RoIG9mIGEga2V5IGluIGFuIGluZGV4IG5vZGUgKi8KKwlfX2JlMzIgbm9kZV9jb3VudDsJLyogKFYpIFRoZSB0b3RhbCBudW1iZXIgb2Ygbm9kZXMgKi8KKwlfX2JlMzIgZnJlZV9ub2RlczsJLyogKFYpIFRoZSBudW1iZXIgb2YgdW51c2VkIG5vZGVzICovCisJdTE2IHJlc2VydmVkMTsKKwlfX2JlMzIgY2x1bXBfc2l6ZTsJLyogKEYpIGNsdW1wIHNpemUuIG5vdCB1c3VhbGx5IHVzZWQuICovCisJdTggYnRyZWVfdHlwZTsJCS8qIChGKSBCVHJlZSB0eXBlICovCisJdTggcmVzZXJ2ZWQyOworCV9fYmUzMiBhdHRyaWJ1dGVzOwkvKiAoRikgYXR0cmlidXRlcyAqLworCXUzMiByZXNlcnZlZDNbMTZdOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBIRlNfTk9ERV9JTkRFWAkweDAwCS8qIEFuIGludGVybmFsIChpbmRleCkgbm9kZSAqLworI2RlZmluZSBIRlNfTk9ERV9IRUFERVIJMHgwMQkvKiBUaGUgdHJlZSBoZWFkZXIgbm9kZSAobm9kZSAwKSAqLworI2RlZmluZSBIRlNfTk9ERV9NQVAJCTB4MDIJLyogSG9sZHMgcGFydCBvZiB0aGUgYml0bWFwIG9mIHVzZWQgbm9kZXMgKi8KKyNkZWZpbmUgSEZTX05PREVfTEVBRgkJMHhGRgkvKiBBIGxlYWYgKG5kTkhlaWdodD09MSkgbm9kZSAqLworCisjZGVmaW5lIEJUUkVFX0FUVFJfQkFEQ0xPU0UJMHgwMDAwMDAwMQkvKiBiLXRyZWUgbm90IGNsb3NlZCBwcm9wZXJseS4gbm90CisJCQkJCQkgICB1c2VkIGJ5IGhmc3BsdXMuICovCisjZGVmaW5lIEhGU19UUkVFX0JJR0tFWVMJMHgwMDAwMDAwMgkvKiBrZXkgbGVuZ3RoIGlzIHUxNiBpbnN0ZWFkIG9mIHU4LgorCQkJCQkJICAgdXNlZCBieSBoZnNwbHVzLiAqLworI2RlZmluZSBIRlNfVFJFRV9WQVJJRFhLRVlTCTB4MDAwMDAwMDQJLyogdmFyaWFibGUga2V5IGxlbmd0aCBpbnN0ZWFkIG9mCisJCQkJCQkgICBtYXgga2V5IGxlbmd0aC4gdXNlIGRpbiBjYXRhbG9nCisJCQkJCQkgICBiLXRyZWUgYnV0IG5vdCBpbiBleHRlbnRzCisJCQkJCQkgICBiLXRyZWUgKGhmc3BsdXMpLiAqLwpkaWZmIC0tZ2l0IGEvZnMvaGZzL2NhdGFsb2cuYyBiL2ZzL2hmcy9jYXRhbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVkZWRlZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9jYXRhbG9nLmMKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzL2NhdGFsb2cuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3ICBQYXVsIEguIEhhcmdyb3ZlCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmdW5jdGlvbnMgcmVsYXRlZCB0byB0aGUgY2F0YWxvZyBCLXRyZWUuCisgKgorICogQ2FjaGUgY29kZSBzaGFtZWxlc3NseSBzdG9sZW4gZnJvbQorICogICAgIGxpbnV4L2ZzL2lub2RlLmMgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICogICAgIHJlLXNoYW1lbGVzc2x5IHN0b2xlbiBDb3B5cmlnaHQgKEMpIDE5OTcgTGludXMgVG9ydmFsZHMKKyAqLworCisjaW5jbHVkZSAiaGZzX2ZzLmgiCisjaW5jbHVkZSAiYnRyZWUuaCIKKworLyoKKyAqIGhmc19jYXRfYnVpbGRfa2V5KCkKKyAqCisgKiBHaXZlbiB0aGUgSUQgb2YgdGhlIHBhcmVudCBhbmQgdGhlIG5hbWUgYnVpbGQgYSBzZWFyY2gga2V5LgorICovCit2b2lkIGhmc19jYXRfYnVpbGRfa2V5KGJ0cmVlX2tleSAqa2V5LCB1MzIgcGFyZW50LCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwlrZXktPmNhdC5yZXNlcnZlZCA9IDA7CisJa2V5LT5jYXQuUGFySUQgPSBjcHVfdG9fYmUzMihwYXJlbnQpOworCWlmIChuYW1lKSB7CisJCWhmc190cml2Mm1hYygma2V5LT5jYXQuQ05hbWUsIG5hbWUpOworCQlrZXktPmtleV9sZW4gPSA2ICsga2V5LT5jYXQuQ05hbWUubGVuOworCX0gZWxzZSB7CisJCW1lbXNldCgma2V5LT5jYXQuQ05hbWUsIDAsIHNpemVvZihzdHJ1Y3QgaGZzX25hbWUpKTsKKwkJa2V5LT5rZXlfbGVuID0gNjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaGZzX2NhdF9idWlsZF9yZWNvcmQoaGZzX2NhdF9yZWMgKnJlYywgdTMyIGNuaWQsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJX19iZTMyIG10aW1lID0gaGZzX210aW1lKCk7CisKKwltZW1zZXQocmVjLCAwLCBzaXplb2YoKnJlYykpOworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCXJlYy0+dHlwZSA9IEhGU19DRFJfRElSOworCQlyZWMtPmRpci5EaXJJRCA9IGNwdV90b19iZTMyKGNuaWQpOworCQlyZWMtPmRpci5DckRhdCA9IG10aW1lOworCQlyZWMtPmRpci5NZERhdCA9IG10aW1lOworCQlyZWMtPmRpci5Ca0RhdCA9IDA7CisJCXJlYy0+ZGlyLlVzckluZm8uZnJWaWV3ID0gY3B1X3RvX2JlMTYoMHhmZik7CisJCXJldHVybiBzaXplb2Yoc3RydWN0IGhmc19jYXRfZGlyKTsKKwl9IGVsc2UgeworCQkvKiBpbml0IHNvbWUgZmllbGRzIGZvciB0aGUgZmlsZSByZWNvcmQgKi8KKwkJcmVjLT50eXBlID0gSEZTX0NEUl9GSUw7CisJCXJlYy0+ZmlsZS5GbGFncyA9IEhGU19GSUxfVVNFRCB8IEhGU19GSUxfVEhEOworCQlpZiAoIShpbm9kZS0+aV9tb2RlICYgU19JV1VTUikpCisJCQlyZWMtPmZpbGUuRmxhZ3MgfD0gSEZTX0ZJTF9MT0NLOworCQlyZWMtPmZpbGUuRmxOdW0gPSBjcHVfdG9fYmUzMihjbmlkKTsKKwkJcmVjLT5maWxlLkNyRGF0ID0gbXRpbWU7CisJCXJlYy0+ZmlsZS5NZERhdCA9IG10aW1lOworCQlyZWMtPmZpbGUuQmtEYXQgPSAwOworCQlyZWMtPmZpbGUuVXNyV2RzLmZkVHlwZSA9IEhGU19TQihpbm9kZS0+aV9zYiktPnNfdHlwZTsKKwkJcmVjLT5maWxlLlVzcldkcy5mZENyZWF0b3IgPSBIRlNfU0IoaW5vZGUtPmlfc2IpLT5zX2NyZWF0b3I7CisJCXJldHVybiBzaXplb2Yoc3RydWN0IGhmc19jYXRfZmlsZSk7CisJfQorfQorCitzdGF0aWMgaW50IGhmc19jYXRfYnVpbGRfdGhyZWFkKGhmc19jYXRfcmVjICpyZWMsIGludCB0eXBlLAorCQkJCXUzMiBwYXJlbnRpZCwgc3RydWN0IHFzdHIgKm5hbWUpCit7CisJcmVjLT50eXBlID0gdHlwZTsKKwltZW1zZXQocmVjLT50aHJlYWQucmVzZXJ2ZWQsIDAsIHNpemVvZihyZWMtPnRocmVhZC5yZXNlcnZlZCkpOworCXJlYy0+dGhyZWFkLlBhcklEID0gY3B1X3RvX2JlMzIocGFyZW50aWQpOworCWhmc190cml2Mm1hYygmcmVjLT50aHJlYWQuQ05hbWUsIG5hbWUpOworCXJldHVybiBzaXplb2Yoc3RydWN0IGhmc19jYXRfdGhyZWFkKTsKK30KKworLyoKKyAqIGNyZWF0ZV9lbnRyeSgpCisgKgorICogQWRkIGEgbmV3IGZpbGUgb3IgZGlyZWN0b3J5IHRvIHRoZSBjYXRhbG9nIEItdHJlZSBhbmQKKyAqIHJldHVybiBhIChzdHJ1Y3QgaGZzX2NhdF9lbnRyeSkgZm9yIGl0IGluICcqcmVzdWx0Jy4KKyAqLworaW50IGhmc19jYXRfY3JlYXRlKHUzMiBjbmlkLCBzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKnN0ciwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBmZDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXVuaW9uIGhmc19jYXRfcmVjIGVudHJ5OworCWludCBlbnRyeV9zaXplOworCWludCBlcnI7CisKKwlkcHJpbnQoREJHX0NBVF9NT0QsICJjcmVhdGVfY2F0OiAlcywldSglZClcbiIsIHN0ci0+bmFtZSwgY25pZCwgaW5vZGUtPmlfbmxpbmspOworCWlmIChkaXItPmlfc2l6ZSA+PSBIRlNfTUFYX1ZBTEVOQ0UpCisJCXJldHVybiAtRU5PU1BDOworCisJc2IgPSBkaXItPmlfc2I7CisJaGZzX2ZpbmRfaW5pdChIRlNfU0Ioc2IpLT5jYXRfdHJlZSwgJmZkKTsKKworCWhmc19jYXRfYnVpbGRfa2V5KGZkLnNlYXJjaF9rZXksIGNuaWQsIE5VTEwpOworCWVudHJ5X3NpemUgPSBoZnNfY2F0X2J1aWxkX3RocmVhZCgmZW50cnksIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgPworCQkJSEZTX0NEUl9USEQgOiBIRlNfQ0RSX0ZUSCwKKwkJCWRpci0+aV9pbm8sIHN0cik7CisJZXJyID0gaGZzX2JyZWNfZmluZCgmZmQpOworCWlmIChlcnIgIT0gLUVOT0VOVCkgeworCQlpZiAoIWVycikKKwkJCWVyciA9IC1FRVhJU1Q7CisJCWdvdG8gZXJyMjsKKwl9CisJZXJyID0gaGZzX2JyZWNfaW5zZXJ0KCZmZCwgJmVudHJ5LCBlbnRyeV9zaXplKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjI7CisKKwloZnNfY2F0X2J1aWxkX2tleShmZC5zZWFyY2hfa2V5LCBkaXItPmlfaW5vLCBzdHIpOworCWVudHJ5X3NpemUgPSBoZnNfY2F0X2J1aWxkX3JlY29yZCgmZW50cnksIGNuaWQsIGlub2RlKTsKKwllcnIgPSBoZnNfYnJlY19maW5kKCZmZCk7CisJaWYgKGVyciAhPSAtRU5PRU5UKSB7CisJCS8qIHBhbmljPyAqLworCQlpZiAoIWVycikKKwkJCWVyciA9IC1FRVhJU1Q7CisJCWdvdG8gZXJyMTsKKwl9CisJZXJyID0gaGZzX2JyZWNfaW5zZXJ0KCZmZCwgJmVudHJ5LCBlbnRyeV9zaXplKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjE7CisKKwlkaXItPmlfc2l6ZSsrOworCWRpci0+aV9tdGltZSA9IGRpci0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gMDsKKworZXJyMToKKwloZnNfY2F0X2J1aWxkX2tleShmZC5zZWFyY2hfa2V5LCBjbmlkLCBOVUxMKTsKKwlpZiAoIWhmc19icmVjX2ZpbmQoJmZkKSkKKwkJaGZzX2JyZWNfcmVtb3ZlKCZmZCk7CitlcnIyOgorCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogaGZzX2NhdF9jb21wYXJlKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyBpcyB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbiB1c2VkIGZvciB0aGUgY2F0YWxvZyBCLXRyZWUuICBJbgorICogICBjb21wYXJpbmcgY2F0YWxvZyBCLXRyZWUgZW50cmllcywgdGhlIHBhcmVudCBpZCBpcyB0aGUgbW9zdAorICogICBzaWduaWZpY2FudCBmaWVsZCAoY29tcGFyZWQgYXMgdW5zaWduZWQgaW50cykuICBUaGUgbmFtZSBmaWVsZCBpcworICogICB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgKGNvbXBhcmVkIGluICJNYWNpbnRvc2ggbGV4aWNhbCBvcmRlciIsCisgKiAgIHNlZSBoZnNfc3RyY21wKCkgaW4gc3RyaW5nLmMpCisgKiBJbnB1dCBWYXJpYWJsZShzKToKKyAqICAgc3RydWN0IGhmc19jYXRfa2V5ICprZXkxOiBwb2ludGVyIHRvIHRoZSBmaXJzdCBrZXkgdG8gY29tcGFyZQorICogICBzdHJ1Y3QgaGZzX2NhdF9rZXkgKmtleTI6IHBvaW50ZXIgdG8gdGhlIHNlY29uZCBrZXkgdG8gY29tcGFyZQorICogT3V0cHV0IFZhcmlhYmxlKHMpOgorICogICBOT05FCisgKiBSZXR1cm5zOgorICogICBpbnQ6IG5lZ2F0aXZlIGlmIGtleTE8a2V5MiwgcG9zaXRpdmUgaWYga2V5MT5rZXkyLCBhbmQgMCBpZiBrZXkxPT1rZXkyCisgKiBQcmVjb25kaXRpb25zOgorICogICBrZXkxIGFuZCBrZXkyIHBvaW50IHRvICJ2YWxpZCIgKHN0cnVjdCBoZnNfY2F0X2tleSlzLgorICogUG9zdGNvbmRpdGlvbnM6CisgKiAgIFRoaXMgZnVuY3Rpb24gaGFzIG5vIHNpZGUtZWZmZWN0cworICovCitpbnQgaGZzX2NhdF9rZXljbXAoY29uc3QgYnRyZWVfa2V5ICprZXkxLCBjb25zdCBidHJlZV9rZXkgKmtleTIpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGJlMzJfdG9fY3B1KGtleTEtPmNhdC5QYXJJRCkgLSBiZTMyX3RvX2NwdShrZXkyLT5jYXQuUGFySUQpOworCWlmICghcmV0dmFsKQorCQlyZXR2YWwgPSBoZnNfc3RyY21wKGtleTEtPmNhdC5DTmFtZS5uYW1lLCBrZXkxLT5jYXQuQ05hbWUubGVuLAorCQkJCSAgICBrZXkyLT5jYXQuQ05hbWUubmFtZSwga2V5Mi0+Y2F0LkNOYW1lLmxlbik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBUcnkgdG8gZ2V0IGEgY2F0YWxvZyBlbnRyeSBmb3IgZ2l2ZW4gY2F0YWxvZyBpZCAqLworLy8gbW92ZSB0byByZWFkX3N1cGVyPz8/CitpbnQgaGZzX2NhdF9maW5kX2JyZWMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdTMyIGNuaWQsCisJCSAgICAgIHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCkKK3sKKwloZnNfY2F0X3JlYyByZWM7CisJaW50IHJlcywgbGVuLCB0eXBlOworCisJaGZzX2NhdF9idWlsZF9rZXkoZmQtPnNlYXJjaF9rZXksIGNuaWQsIE5VTEwpOworCXJlcyA9IGhmc19icmVjX3JlYWQoZmQsICZyZWMsIHNpemVvZihyZWMpKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJdHlwZSA9IHJlYy50eXBlOworCWlmICh0eXBlICE9IEhGU19DRFJfVEhEICYmIHR5cGUgIT0gSEZTX0NEUl9GVEgpIHsKKwkJcHJpbnRrKCJIRlMtZnM6IEZvdW5kIGJhZCB0aHJlYWQgcmVjb3JkIGluIGNhdGFsb2dcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlmZC0+c2VhcmNoX2tleS0+Y2F0LlBhcklEID0gcmVjLnRocmVhZC5QYXJJRDsKKwlsZW4gPSBmZC0+c2VhcmNoX2tleS0+Y2F0LkNOYW1lLmxlbiA9IHJlYy50aHJlYWQuQ05hbWUubGVuOworCW1lbWNweShmZC0+c2VhcmNoX2tleS0+Y2F0LkNOYW1lLm5hbWUsIHJlYy50aHJlYWQuQ05hbWUubmFtZSwgbGVuKTsKKwlyZXR1cm4gaGZzX2JyZWNfZmluZChmZCk7Cit9CisKKworLyoKKyAqIGhmc19jYXRfZGVsZXRlKCkKKyAqCisgKiBEZWxldGUgdGhlIGluZGljYXRlZCBmaWxlIG9yIGRpcmVjdG9yeS4KKyAqIFRoZSBhc3NvY2lhdGVkIHRocmVhZCBpcyBhbHNvIHJlbW92ZWQgdW5sZXNzICgnd2l0aF90aHJlYWQnPT0wKS4KKyAqLworaW50IGhmc19jYXRfZGVsZXRlKHUzMiBjbmlkLCBzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKnN0cikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBoZnNfZmluZF9kYXRhIGZkOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlpbnQgcmVzLCB0eXBlOworCisJZHByaW50KERCR19DQVRfTU9ELCAiZGVsZXRlX2NhdDogJXMsJXVcbiIsIHN0ciA/IHN0ci0+bmFtZSA6IE5VTEwsIGNuaWQpOworCXNiID0gZGlyLT5pX3NiOworCWhmc19maW5kX2luaXQoSEZTX1NCKHNiKS0+Y2F0X3RyZWUsICZmZCk7CisKKwloZnNfY2F0X2J1aWxkX2tleShmZC5zZWFyY2hfa2V5LCBkaXItPmlfaW5vLCBzdHIpOworCXJlcyA9IGhmc19icmVjX2ZpbmQoJmZkKTsKKwlpZiAocmVzKQorCQlnb3RvIG91dDsKKworCXR5cGUgPSBoZnNfYm5vZGVfcmVhZF91OChmZC5ibm9kZSwgZmQuZW50cnlvZmZzZXQpOworCWlmICh0eXBlID09IEhGU19DRFJfRklMKSB7CisJCXN0cnVjdCBoZnNfY2F0X2ZpbGUgZmlsZTsKKwkJaGZzX2Jub2RlX3JlYWQoZmQuYm5vZGUsICZmaWxlLCBmZC5lbnRyeW9mZnNldCwgc2l6ZW9mKGZpbGUpKTsKKwkJaWYgKGJlMzJfdG9fY3B1KGZpbGUuRmxOdW0pID09IGNuaWQpIHsKKyNpZiAwCisJCQloZnNfZnJlZV9mb3JrKHNiLCAmZmlsZSwgSEZTX0ZLX0RBVEEpOworI2VuZGlmCisJCQloZnNfZnJlZV9mb3JrKHNiLCAmZmlsZSwgSEZTX0ZLX1JTUkMpOworCQl9CisJfQorCisJbGlzdF9mb3JfZWFjaChwb3MsICZIRlNfSShkaXIpLT5vcGVuX2Rpcl9saXN0KSB7CisJCXN0cnVjdCBoZnNfcmVhZGRpcl9kYXRhICpyZCA9CisJCQlsaXN0X2VudHJ5KHBvcywgc3RydWN0IGhmc19yZWFkZGlyX2RhdGEsIGxpc3QpOworCQlpZiAoZmQudHJlZS0+a2V5Y21wKGZkLnNlYXJjaF9rZXksICh2b2lkICopJnJkLT5rZXkpIDwgMCkKKwkJCXJkLT5maWxlLT5mX3Bvcy0tOworCX0KKworCXJlcyA9IGhmc19icmVjX3JlbW92ZSgmZmQpOworCWlmIChyZXMpCisJCWdvdG8gb3V0OworCisJaGZzX2NhdF9idWlsZF9rZXkoZmQuc2VhcmNoX2tleSwgY25pZCwgTlVMTCk7CisJcmVzID0gaGZzX2JyZWNfZmluZCgmZmQpOworCWlmICghcmVzKSB7CisJCXJlcyA9IGhmc19icmVjX3JlbW92ZSgmZmQpOworCQlpZiAocmVzKQorCQkJZ290byBvdXQ7CisJfQorCisJZGlyLT5pX3NpemUtLTsKKwlkaXItPmlfbXRpbWUgPSBkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKKwlyZXMgPSAwOworb3V0OgorCWhmc19maW5kX2V4aXQoJmZkKTsKKworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBoZnNfY2F0X21vdmUoKQorICoKKyAqIFJlbmFtZSBhIGZpbGUgb3IgZGlyZWN0b3J5LCBwb3NzaWJseSB0byBhIG5ldyBkaXJlY3RvcnkuCisgKiBJZiB0aGUgZGVzdGluYXRpb24gZXhpc3RzIGl0IGlzIHJlbW92ZWQgYW5kIGEKKyAqIChzdHJ1Y3QgaGZzX2NhdF9lbnRyeSkgZm9yIGl0IGlzIHJldHVybmVkIGluICcqcmVzdWx0Jy4KKyAqLworaW50IGhmc19jYXRfbW92ZSh1MzIgY25pZCwgc3RydWN0IGlub2RlICpzcmNfZGlyLCBzdHJ1Y3QgcXN0ciAqc3JjX25hbWUsCisJCSBzdHJ1Y3QgaW5vZGUgKmRzdF9kaXIsIHN0cnVjdCBxc3RyICpkc3RfbmFtZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBoZnNfZmluZF9kYXRhIHNyY19mZCwgZHN0X2ZkOworCXVuaW9uIGhmc19jYXRfcmVjIGVudHJ5OworCWludCBlbnRyeV9zaXplLCB0eXBlOworCWludCBlcnI7CisKKwlkcHJpbnQoREJHX0NBVF9NT0QsICJyZW5hbWVfY2F0OiAldSAtICVsdSwlcyAtICVsdSwlc1xuIiwgY25pZCwgc3JjX2Rpci0+aV9pbm8sIHNyY19uYW1lLT5uYW1lLAorCQlkc3RfZGlyLT5pX2lubywgZHN0X25hbWUtPm5hbWUpOworCXNiID0gc3JjX2Rpci0+aV9zYjsKKwloZnNfZmluZF9pbml0KEhGU19TQihzYiktPmNhdF90cmVlLCAmc3JjX2ZkKTsKKwlkc3RfZmQgPSBzcmNfZmQ7CisKKwkvKiBmaW5kIHRoZSBvbGQgZGlyIGVudHJ5IGFuZCByZWFkIHRoZSBkYXRhICovCisJaGZzX2NhdF9idWlsZF9rZXkoc3JjX2ZkLnNlYXJjaF9rZXksIHNyY19kaXItPmlfaW5vLCBzcmNfbmFtZSk7CisJZXJyID0gaGZzX2JyZWNfZmluZCgmc3JjX2ZkKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWhmc19ibm9kZV9yZWFkKHNyY19mZC5ibm9kZSwgJmVudHJ5LCBzcmNfZmQuZW50cnlvZmZzZXQsCisJCQkgICAgc3JjX2ZkLmVudHJ5bGVuZ3RoKTsKKworCS8qIGNyZWF0ZSBuZXcgZGlyIGVudHJ5IHdpdGggdGhlIGRhdGEgZnJvbSB0aGUgb2xkIGVudHJ5ICovCisJaGZzX2NhdF9idWlsZF9rZXkoZHN0X2ZkLnNlYXJjaF9rZXksIGRzdF9kaXItPmlfaW5vLCBkc3RfbmFtZSk7CisJZXJyID0gaGZzX2JyZWNfZmluZCgmZHN0X2ZkKTsKKwlpZiAoZXJyICE9IC1FTk9FTlQpIHsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBoZnNfYnJlY19pbnNlcnQoJmRzdF9mZCwgJmVudHJ5LCBzcmNfZmQuZW50cnlsZW5ndGgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWRzdF9kaXItPmlfc2l6ZSsrOworCWRzdF9kaXItPmlfbXRpbWUgPSBkc3RfZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGRzdF9kaXIpOworCisJLyogZmluYWxseSByZW1vdmUgdGhlIG9sZCBlbnRyeSAqLworCWhmc19jYXRfYnVpbGRfa2V5KHNyY19mZC5zZWFyY2hfa2V5LCBzcmNfZGlyLT5pX2lubywgc3JjX25hbWUpOworCWVyciA9IGhmc19icmVjX2ZpbmQoJnNyY19mZCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gaGZzX2JyZWNfcmVtb3ZlKCZzcmNfZmQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCXNyY19kaXItPmlfc2l6ZS0tOworCXNyY19kaXItPmlfbXRpbWUgPSBzcmNfZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KHNyY19kaXIpOworCisJdHlwZSA9IGVudHJ5LnR5cGU7CisJaWYgKHR5cGUgPT0gSEZTX0NEUl9GSUwgJiYgIShlbnRyeS5maWxlLkZsYWdzICYgSEZTX0ZJTF9USEQpKQorCQlnb3RvIG91dDsKKworCS8qIHJlbW92ZSBvbGQgdGhyZWFkIGVudHJ5ICovCisJaGZzX2NhdF9idWlsZF9rZXkoc3JjX2ZkLnNlYXJjaF9rZXksIGNuaWQsIE5VTEwpOworCWVyciA9IGhmc19icmVjX2ZpbmQoJnNyY19mZCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gaGZzX2JyZWNfcmVtb3ZlKCZzcmNfZmQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogY3JlYXRlIG5ldyB0aHJlYWQgZW50cnkgKi8KKwloZnNfY2F0X2J1aWxkX2tleShkc3RfZmQuc2VhcmNoX2tleSwgY25pZCwgTlVMTCk7CisJZW50cnlfc2l6ZSA9IGhmc19jYXRfYnVpbGRfdGhyZWFkKCZlbnRyeSwgdHlwZSA9PSBIRlNfQ0RSX0ZJTCA/IEhGU19DRFJfRlRIIDogSEZTX0NEUl9USEQsCisJCQkJCWRzdF9kaXItPmlfaW5vLCBkc3RfbmFtZSk7CisJZXJyID0gaGZzX2JyZWNfZmluZCgmZHN0X2ZkKTsKKwlpZiAoZXJyICE9IC1FTk9FTlQpIHsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIG91dDsKKwl9CisJZXJyID0gaGZzX2JyZWNfaW5zZXJ0KCZkc3RfZmQsICZlbnRyeSwgZW50cnlfc2l6ZSk7CitvdXQ6CisJaGZzX2Jub2RlX3B1dChkc3RfZmQuYm5vZGUpOworCWhmc19maW5kX2V4aXQoJnNyY19mZCk7CisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2ZzL2hmcy9kaXIuYyBiL2ZzL2hmcy9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTU5OTgyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzL2Rpci5jCkBAIC0wLDAgKzEsMzMwIEBACisvKgorICogIGxpbnV4L2ZzL2hmcy9kaXIuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3ICBQYXVsIEguIEhhcmdyb3ZlCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGRpcmVjdG9yeS1yZWxhdGVkIGZ1bmN0aW9ucyBpbmRlcGVuZGVudCBvZiB3aGljaAorICogc2NoZW1lIGlzIGJlaW5nIHVzZWQgdG8gcmVwcmVzZW50IGZvcmtzLgorICoKKyAqIEJhc2VkIG9uIHRoZSBtaW5peCBmaWxlIHN5c3RlbSBjb2RlLCAoQykgMTk5MSwgMTk5MiBieSBMaW51cyBUb3J2YWxkcworICovCisKKyNpbmNsdWRlICJoZnNfZnMuaCIKKyNpbmNsdWRlICJidHJlZS5oIgorCisvKgorICogaGZzX2xvb2t1cCgpCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpoZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWhmc19jYXRfcmVjIHJlYzsKKwlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBmZDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlpbnQgcmVzOworCisJZGVudHJ5LT5kX29wID0gJmhmc19kZW50cnlfb3BlcmF0aW9uczsKKworCWhmc19maW5kX2luaXQoSEZTX1NCKGRpci0+aV9zYiktPmNhdF90cmVlLCAmZmQpOworCWhmc19jYXRfYnVpbGRfa2V5KGZkLnNlYXJjaF9rZXksIGRpci0+aV9pbm8sICZkZW50cnktPmRfbmFtZSk7CisJcmVzID0gaGZzX2JyZWNfcmVhZCgmZmQsICZyZWMsIHNpemVvZihyZWMpKTsKKwlpZiAocmVzKSB7CisJCWhmc19maW5kX2V4aXQoJmZkKTsKKwkJaWYgKHJlcyA9PSAtRU5PRU5UKSB7CisJCQkvKiBObyBzdWNoIGVudHJ5ICovCisJCQlpbm9kZSA9IE5VTEw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJcmV0dXJuIEVSUl9QVFIocmVzKTsKKwl9CisJaW5vZGUgPSBoZnNfaWdldChkaXItPmlfc2IsICZmZC5zZWFyY2hfa2V5LT5jYXQsICZyZWMpOworCWhmc19maW5kX2V4aXQoJmZkKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKK2RvbmU6CisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBoZnNfcmVhZGRpcgorICovCitzdGF0aWMgaW50IGhmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJaW50IGxlbiwgZXJyOworCWNoYXIgc3RyYnVmW0hGU19OQU1FTEVOICsgMV07CisJdW5pb24gaGZzX2NhdF9yZWMgZW50cnk7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJc3RydWN0IGhmc19yZWFkZGlyX2RhdGEgKnJkOworCXUxNiB0eXBlOworCisJaWYgKGZpbHAtPmZfcG9zID49IGlub2RlLT5pX3NpemUpCisJCXJldHVybiAwOworCisJaGZzX2ZpbmRfaW5pdChIRlNfU0Ioc2IpLT5jYXRfdHJlZSwgJmZkKTsKKwloZnNfY2F0X2J1aWxkX2tleShmZC5zZWFyY2hfa2V5LCBpbm9kZS0+aV9pbm8sIE5VTEwpOworCWVyciA9IGhmc19icmVjX2ZpbmQoJmZkKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXN3aXRjaCAoKHUzMilmaWxwLT5mX3BvcykgeworCWNhc2UgMDoKKwkJLyogVGhpcyBpcyBjb21wbGV0ZWx5IGFydGlmaWNpYWwuLi4gKi8KKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIDAsIGlub2RlLT5pX2lubywgRFRfRElSKSkKKwkJCWdvdG8gb3V0OworCQlmaWxwLT5mX3BvcysrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIDE6CisJCWhmc19ibm9kZV9yZWFkKGZkLmJub2RlLCAmZW50cnksIGZkLmVudHJ5b2Zmc2V0LCBmZC5lbnRyeWxlbmd0aCk7CisJCWlmIChlbnRyeS50eXBlICE9IEhGU19DRFJfVEhEKSB7CisJCQlwcmludGsoIkhGUzogYmFkIGNhdGFsb2cgZm9sZGVyIHRocmVhZFxuIik7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwkJLy9pZiAoZmQuZW50cnlsZW5ndGggPCBIRlNfTUlOX1RIUkVBRF9TWikgeworCQkvLwlwcmludGsoIkhGUzogdHJ1bmNhdGVkIGNhdGFsb2cgdGhyZWFkXG4iKTsKKwkJLy8JZXJyID0gLUVJTzsKKwkJLy8JZ290byBvdXQ7CisJCS8vfQorCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIDEsCisJCQkgICAgYmUzMl90b19jcHUoZW50cnkudGhyZWFkLlBhcklEKSwgRFRfRElSKSkKKwkJCWdvdG8gb3V0OworCQlmaWxwLT5mX3BvcysrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCQlpZiAoZmlscC0+Zl9wb3MgPj0gaW5vZGUtPmlfc2l6ZSkKKwkJCWdvdG8gb3V0OworCQllcnIgPSBoZnNfYnJlY19nb3RvKCZmZCwgZmlscC0+Zl9wb3MgLSAxKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKworCWZvciAoOzspIHsKKwkJaWYgKGJlMzJfdG9fY3B1KGZkLmtleS0+Y2F0LlBhcklEKSAhPSBpbm9kZS0+aV9pbm8pIHsKKwkJCXByaW50aygiSEZTOiB3YWxrZWQgcGFzdCBlbmQgb2YgZGlyXG4iKTsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCQloZnNfYm5vZGVfcmVhZChmZC5ibm9kZSwgJmVudHJ5LCBmZC5lbnRyeW9mZnNldCwgZmQuZW50cnlsZW5ndGgpOworCQl0eXBlID0gZW50cnkudHlwZTsKKwkJbGVuID0gaGZzX21hYzJ0cml2KHN0cmJ1ZiwgJmZkLmtleS0+Y2F0LkNOYW1lKTsKKwkJaWYgKHR5cGUgPT0gSEZTX0NEUl9ESVIpIHsKKwkJCWlmIChmZC5lbnRyeWxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaGZzX2NhdF9kaXIpKSB7CisJCQkJcHJpbnRrKCJIRlM6IHNtYWxsIGRpciBlbnRyeVxuIik7CisJCQkJZXJyID0gLUVJTzsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmIChmaWxsZGlyKGRpcmVudCwgc3RyYnVmLCBsZW4sIGZpbHAtPmZfcG9zLAorCQkJCSAgICBiZTMyX3RvX2NwdShlbnRyeS5kaXIuRGlySUQpLCBEVF9ESVIpKQorCQkJCWJyZWFrOworCQl9IGVsc2UgaWYgKHR5cGUgPT0gSEZTX0NEUl9GSUwpIHsKKwkJCWlmIChmZC5lbnRyeWxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaGZzX2NhdF9maWxlKSkgeworCQkJCXByaW50aygiSEZTOiBzbWFsbCBmaWxlIGVudHJ5XG4iKTsKKwkJCQllcnIgPSAtRUlPOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBzdHJidWYsIGxlbiwgZmlscC0+Zl9wb3MsCisJCQkJICAgIGJlMzJfdG9fY3B1KGVudHJ5LmZpbGUuRmxOdW0pLCBEVF9SRUcpKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCJIRlM6IGJhZCBjYXRhbG9nIGVudHJ5IHR5cGUgJWRcbiIsIHR5cGUpOworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZpbHAtPmZfcG9zKys7CisJCWlmIChmaWxwLT5mX3BvcyA+PSBpbm9kZS0+aV9zaXplKQorCQkJZ290byBvdXQ7CisJCWVyciA9IGhmc19icmVjX2dvdG8oJmZkLCAxKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKwlyZCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpZiAoIXJkKSB7CisJCXJkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhmc19yZWFkZGlyX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFyZCkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZpbHAtPnByaXZhdGVfZGF0YSA9IHJkOworCQlyZC0+ZmlsZSA9IGZpbHA7CisJCWxpc3RfYWRkKCZyZC0+bGlzdCwgJkhGU19JKGlub2RlKS0+b3Blbl9kaXJfbGlzdCk7CisJfQorCW1lbWNweSgmcmQtPmtleSwgJmZkLmtleSwgc2l6ZW9mKHN0cnVjdCBoZnNfY2F0X2tleSkpOworb3V0OgorCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGhmc19kaXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaGZzX3JlYWRkaXJfZGF0YSAqcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKHJkKSB7CisJCWxpc3RfZGVsKCZyZC0+bGlzdCk7CisJCWtmcmVlKHJkKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBoZnNfY3JlYXRlKCkKKyAqCisgKiBUaGlzIGlzIHRoZSBjcmVhdGUoKSBlbnRyeSBpbiB0aGUgaW5vZGVfb3BlcmF0aW9ucyBzdHJ1Y3R1cmUgZm9yCisgKiByZWd1bGFyIEhGUyBkaXJlY3Rvcmllcy4gIFRoZSBwdXJwb3NlIGlzIHRvIGNyZWF0ZSBhIG5ldyBmaWxlIGluCisgKiBhIGRpcmVjdG9yeSBhbmQgcmV0dXJuIGEgY29ycmVzcG9uZGluZyBpbm9kZSwgZ2l2ZW4gdGhlIGlub2RlIGZvcgorICogdGhlIGRpcmVjdG9yeSBhbmQgdGhlIG5hbWUgKGFuZCBpdHMgbGVuZ3RoKSBvZiB0aGUgbmV3IGZpbGUuCisgKi8KK3N0YXRpYyBpbnQgaGZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJICAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgcmVzOworCisJaW5vZGUgPSBoZnNfbmV3X2lub2RlKGRpciwgJmRlbnRyeS0+ZF9uYW1lLCBtb2RlKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCXJlcyA9IGhmc19jYXRfY3JlYXRlKGlub2RlLT5pX2lubywgZGlyLCAmZGVudHJ5LT5kX25hbWUsIGlub2RlKTsKKwlpZiAocmVzKSB7CisJCWlub2RlLT5pX25saW5rID0gMDsKKwkJaGZzX2RlbGV0ZV9pbm9kZShpbm9kZSk7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gcmVzOworCX0KKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXJldHVybiAwOworfQorCisvKgorICogaGZzX21rZGlyKCkKKyAqCisgKiBUaGlzIGlzIHRoZSBta2RpcigpIGVudHJ5IGluIHRoZSBpbm9kZV9vcGVyYXRpb25zIHN0cnVjdHVyZSBmb3IKKyAqIHJlZ3VsYXIgSEZTIGRpcmVjdG9yaWVzLiAgVGhlIHB1cnBvc2UgaXMgdG8gY3JlYXRlIGEgbmV3IGRpcmVjdG9yeQorICogaW4gYSBkaXJlY3RvcnksIGdpdmVuIHRoZSBpbm9kZSBmb3IgdGhlIHBhcmVudCBkaXJlY3RvcnkgYW5kIHRoZQorICogbmFtZSAoYW5kIGl0cyBsZW5ndGgpIG9mIHRoZSBuZXcgZGlyZWN0b3J5LgorICovCitzdGF0aWMgaW50IGhmc19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCByZXM7CisKKwlpbm9kZSA9IGhmc19uZXdfaW5vZGUoZGlyLCAmZGVudHJ5LT5kX25hbWUsIFNfSUZESVIgfCBtb2RlKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCXJlcyA9IGhmc19jYXRfY3JlYXRlKGlub2RlLT5pX2lubywgZGlyLCAmZGVudHJ5LT5kX25hbWUsIGlub2RlKTsKKwlpZiAocmVzKSB7CisJCWlub2RlLT5pX25saW5rID0gMDsKKwkJaGZzX2RlbGV0ZV9pbm9kZShpbm9kZSk7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gcmVzOworCX0KKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXJldHVybiAwOworfQorCisvKgorICogaGZzX3VubGluaygpCisgKgorICogVGhpcyBpcyB0aGUgdW5saW5rKCkgZW50cnkgaW4gdGhlIGlub2RlX29wZXJhdGlvbnMgc3RydWN0dXJlIGZvcgorICogcmVndWxhciBIRlMgZGlyZWN0b3JpZXMuICBUaGUgcHVycG9zZSBpcyB0byBkZWxldGUgYW4gZXhpc3RpbmcKKyAqIGZpbGUsIGdpdmVuIHRoZSBpbm9kZSBmb3IgdGhlIHBhcmVudCBkaXJlY3RvcnkgYW5kIHRoZSBuYW1lCisgKiAoYW5kIGl0cyBsZW5ndGgpIG9mIHRoZSBleGlzdGluZyBmaWxlLgorICovCitzdGF0aWMgaW50IGhmc191bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCByZXM7CisKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlyZXMgPSBoZnNfY2F0X2RlbGV0ZShpbm9kZS0+aV9pbm8sIGRpciwgJmRlbnRyeS0+ZF9uYW1lKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJaW5vZGUtPmlfbmxpbmstLTsKKwloZnNfZGVsZXRlX2lub2RlKGlub2RlKTsKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogaGZzX3JtZGlyKCkKKyAqCisgKiBUaGlzIGlzIHRoZSBybWRpcigpIGVudHJ5IGluIHRoZSBpbm9kZV9vcGVyYXRpb25zIHN0cnVjdHVyZSBmb3IKKyAqIHJlZ3VsYXIgSEZTIGRpcmVjdG9yaWVzLiAgVGhlIHB1cnBvc2UgaXMgdG8gZGVsZXRlIGFuIGV4aXN0aW5nCisgKiBkaXJlY3RvcnksIGdpdmVuIHRoZSBpbm9kZSBmb3IgdGhlIHBhcmVudCBkaXJlY3RvcnkgYW5kIHRoZSBuYW1lCisgKiAoYW5kIGl0cyBsZW5ndGgpIG9mIHRoZSBleGlzdGluZyBkaXJlY3RvcnkuCisgKi8KK3N0YXRpYyBpbnQgaGZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgcmVzOworCisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaWYgKGlub2RlLT5pX3NpemUgIT0gMikKKwkJcmV0dXJuIC1FTk9URU1QVFk7CisJcmVzID0gaGZzX2NhdF9kZWxldGUoaW5vZGUtPmlfaW5vLCBkaXIsICZkZW50cnktPmRfbmFtZSk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKwlpbm9kZS0+aV9ubGluayA9IDA7CisJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWhmc19kZWxldGVfaW5vZGUoaW5vZGUpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXJldHVybiAwOworfQorCisvKgorICogaGZzX3JlbmFtZSgpCisgKgorICogVGhpcyBpcyB0aGUgcmVuYW1lKCkgZW50cnkgaW4gdGhlIGlub2RlX29wZXJhdGlvbnMgc3RydWN0dXJlIGZvcgorICogcmVndWxhciBIRlMgZGlyZWN0b3JpZXMuICBUaGUgcHVycG9zZSBpcyB0byByZW5hbWUgYW4gZXhpc3RpbmcKKyAqIGZpbGUgb3IgZGlyZWN0b3J5LCBnaXZlbiB0aGUgaW5vZGUgZm9yIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQKKyAqIHRoZSBuYW1lIChhbmQgaXRzIGxlbmd0aCkgb2YgdGhlIGV4aXN0aW5nIGZpbGUvZGlyZWN0b3J5IGFuZCB0aGUKKyAqIGlub2RlIGZvciB0aGUgbmV3IGRpcmVjdG9yeSBhbmQgdGhlIG5hbWUgKGFuZCBpdHMgbGVuZ3RoKSBvZiB0aGUKKyAqIG5ldyBmaWxlL2RpcmVjdG9yeS4KKyAqIFhYWDogaG93IGRvIHlvdSBoYW5kbGUgbXVzdF9iZSBkaXI/CisgKi8KK3N0YXRpYyBpbnQgaGZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCSAgICAgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwlpbnQgcmVzOworCisJLyogVW5saW5rIGRlc3RpbmF0aW9uIGlmIGl0IGFscmVhZHkgZXhpc3RzICovCisJaWYgKG5ld19kZW50cnktPmRfaW5vZGUpIHsKKwkJcmVzID0gaGZzX3VubGluayhuZXdfZGlyLCBuZXdfZGVudHJ5KTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiByZXM7CisJfQorCisJcmVzID0gaGZzX2NhdF9tb3ZlKG9sZF9kZW50cnktPmRfaW5vZGUtPmlfaW5vLAorCQkJICAgb2xkX2RpciwgJm9sZF9kZW50cnktPmRfbmFtZSwKKwkJCSAgIG5ld19kaXIsICZuZXdfZGVudHJ5LT5kX25hbWUpOworCWlmICghcmVzKQorCQloZnNfY2F0X2J1aWxkX2tleSgoYnRyZWVfa2V5ICopJkhGU19JKG9sZF9kZW50cnktPmRfaW5vZGUpLT5jYXRfa2V5LAorCQkJCSAgbmV3X2Rpci0+aV9pbm8sICZuZXdfZGVudHJ5LT5kX25hbWUpOworCXJldHVybiByZXM7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgaGZzX2Rpcl9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBoZnNfcmVhZGRpciwKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlbGVhc2UJPSBoZnNfZGlyX3JlbGVhc2UsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBoZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmNyZWF0ZQkJPSBoZnNfY3JlYXRlLAorCS5sb29rdXAJCT0gaGZzX2xvb2t1cCwKKwkudW5saW5rCQk9IGhmc191bmxpbmssCisJLm1rZGlyCQk9IGhmc19ta2RpciwKKwkucm1kaXIJCT0gaGZzX3JtZGlyLAorCS5yZW5hbWUJCT0gaGZzX3JlbmFtZSwKKwkuc2V0YXR0cgk9IGhmc19pbm9kZV9zZXRhdHRyLAorfTsKZGlmZiAtLWdpdCBhL2ZzL2hmcy9leHRlbnQuYyBiL2ZzL2hmcy9leHRlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmM4NTEwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzL2V4dGVudC5jCkBAIC0wLDAgKzEsNTI3IEBACisvKgorICogIGxpbnV4L2ZzL2hmcy9leHRlbnQuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3ICBQYXVsIEguIEhhcmdyb3ZlCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmdW5jdGlvbnMgcmVsYXRlZCB0byB0aGUgZXh0ZW50cyBCLXRyZWUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKworI2luY2x1ZGUgImhmc19mcy5oIgorI2luY2x1ZGUgImJ0cmVlLmgiCisKKy8qPT09PT09PT09PT09PT09PSBGaWxlLWxvY2FsIGZ1bmN0aW9ucyA9PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIGJ1aWxkX2tleQorICovCitzdGF0aWMgdm9pZCBoZnNfZXh0X2J1aWxkX2tleShoZnNfYnRyZWVfa2V5ICprZXksIHUzMiBjbmlkLCB1MTYgYmxvY2ssIHU4IHR5cGUpCit7CisJa2V5LT5rZXlfbGVuID0gNzsKKwlrZXktPmV4dC5Ga1R5cGUgPSB0eXBlOworCWtleS0+ZXh0LkZOdW0gPSBjcHVfdG9fYmUzMihjbmlkKTsKKwlrZXktPmV4dC5GQUJOID0gY3B1X3RvX2JlMTYoYmxvY2spOworfQorCisvKgorICogaGZzX2V4dF9jb21wYXJlKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyBpcyB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbiB1c2VkIGZvciB0aGUgZXh0ZW50cyBCLXRyZWUuICBJbgorICogICBjb21wYXJpbmcgZXh0ZW50IEItdHJlZSBlbnRyaWVzLCB0aGUgZmlsZSBpZCBpcyB0aGUgbW9zdAorICogICBzaWduaWZpY2FudCBmaWVsZCAoY29tcGFyZWQgYXMgdW5zaWduZWQgaW50cyk7IHRoZSBmb3JrIHR5cGUgaXMKKyAqICAgdGhlIHNlY29uZCBtb3N0IHNpZ25pZmljYW50IGZpZWxkIChjb21wYXJlZCBhcyB1bnNpZ25lZCBjaGFycyk7CisgKiAgIGFuZCB0aGUgYWxsb2NhdGlvbiBibG9jayBudW1iZXIgZmllbGQgaXMgdGhlIGxlYXN0IHNpZ25pZmljYW50CisgKiAgIChjb21wYXJlZCBhcyB1bnNpZ25lZCBpbnRzKS4KKyAqIElucHV0IFZhcmlhYmxlKHMpOgorICogICBzdHJ1Y3QgaGZzX2V4dF9rZXkgKmtleTE6IHBvaW50ZXIgdG8gdGhlIGZpcnN0IGtleSB0byBjb21wYXJlCisgKiAgIHN0cnVjdCBoZnNfZXh0X2tleSAqa2V5MjogcG9pbnRlciB0byB0aGUgc2Vjb25kIGtleSB0byBjb21wYXJlCisgKiBPdXRwdXQgVmFyaWFibGUocyk6CisgKiAgIE5PTkUKKyAqIFJldHVybnM6CisgKiAgIGludDogbmVnYXRpdmUgaWYga2V5MTxrZXkyLCBwb3NpdGl2ZSBpZiBrZXkxPmtleTIsIGFuZCAwIGlmIGtleTE9PWtleTIKKyAqIFByZWNvbmRpdGlvbnM6CisgKiAgIGtleTEgYW5kIGtleTIgcG9pbnQgdG8gInZhbGlkIiAoc3RydWN0IGhmc19leHRfa2V5KXMuCisgKiBQb3N0Y29uZGl0aW9uczoKKyAqICAgVGhpcyBmdW5jdGlvbiBoYXMgbm8gc2lkZS1lZmZlY3RzICovCitpbnQgaGZzX2V4dF9rZXljbXAoY29uc3QgYnRyZWVfa2V5ICprZXkxLCBjb25zdCBidHJlZV9rZXkgKmtleTIpCit7CisJX19iZTMyIGZudW0xLCBmbnVtMjsKKwlfX2JlMTYgYmxvY2sxLCBibG9jazI7CisKKwlmbnVtMSA9IGtleTEtPmV4dC5GTnVtOworCWZudW0yID0ga2V5Mi0+ZXh0LkZOdW07CisJaWYgKGZudW0xICE9IGZudW0yKQorCQlyZXR1cm4gYmUzMl90b19jcHUoZm51bTEpIDwgYmUzMl90b19jcHUoZm51bTIpID8gLTEgOiAxOworCWlmIChrZXkxLT5leHQuRmtUeXBlICE9IGtleTItPmV4dC5Ga1R5cGUpCisJCXJldHVybiBrZXkxLT5leHQuRmtUeXBlIDwga2V5Mi0+ZXh0LkZrVHlwZSA/IC0xIDogMTsKKworCWJsb2NrMSA9IGtleTEtPmV4dC5GQUJOOworCWJsb2NrMiA9IGtleTItPmV4dC5GQUJOOworCWlmIChibG9jazEgPT0gYmxvY2syKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gYmUxNl90b19jcHUoYmxvY2sxKSA8IGJlMTZfdG9fY3B1KGJsb2NrMikgPyAtMSA6IDE7Cit9CisKKy8qCisgKiBoZnNfZXh0X2ZpbmRfYmxvY2sKKyAqCisgKiBGaW5kIGEgYmxvY2sgd2l0aGluIGFuIGV4dGVudCByZWNvcmQKKyAqLworc3RhdGljIHUxNiBoZnNfZXh0X2ZpbmRfYmxvY2soc3RydWN0IGhmc19leHRlbnQgKmV4dCwgdTE2IG9mZikKK3sKKwlpbnQgaTsKKwl1MTYgY291bnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgZXh0KyssIGkrKykgeworCQljb3VudCA9IGJlMTZfdG9fY3B1KGV4dC0+Y291bnQpOworCQlpZiAob2ZmIDwgY291bnQpCisJCQlyZXR1cm4gYmUxNl90b19jcHUoZXh0LT5ibG9jaykgKyBvZmY7CisJCW9mZiAtPSBjb3VudDsKKwl9CisJLyogcGFuaWM/ICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGZzX2V4dF9ibG9ja19jb3VudChzdHJ1Y3QgaGZzX2V4dGVudCAqZXh0KQoreworCWludCBpOworCXUxNiBjb3VudCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgZXh0KyssIGkrKykKKwkJY291bnQgKz0gYmUxNl90b19jcHUoZXh0LT5jb3VudCk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdTE2IGhmc19leHRfbGFzdGJsb2NrKHN0cnVjdCBoZnNfZXh0ZW50ICpleHQpCit7CisJaW50IGk7CisKKwlleHQgKz0gMjsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgZXh0LS0sIGkrKykKKwkJaWYgKGV4dC0+Y291bnQpCisJCQlicmVhazsKKwlyZXR1cm4gYmUxNl90b19jcHUoZXh0LT5ibG9jaykgKyBiZTE2X3RvX2NwdShleHQtPmNvdW50KTsKK30KKworc3RhdGljIHZvaWQgX19oZnNfZXh0X3dyaXRlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQpCit7CisJaW50IHJlczsKKworCWhmc19leHRfYnVpbGRfa2V5KGZkLT5zZWFyY2hfa2V5LCBpbm9kZS0+aV9pbm8sIEhGU19JKGlub2RlKS0+Y2FjaGVkX3N0YXJ0LAorCQkJICBIRlNfSVNfUlNSQyhpbm9kZSkgPyAgSEZTX0ZLX1JTUkMgOiBIRlNfRktfREFUQSk7CisJcmVzID0gaGZzX2JyZWNfZmluZChmZCk7CisJaWYgKEhGU19JKGlub2RlKS0+ZmxhZ3MgJiBIRlNfRkxHX0VYVF9ORVcpIHsKKwkJaWYgKHJlcyAhPSAtRU5PRU5UKQorCQkJcmV0dXJuOworCQloZnNfYnJlY19pbnNlcnQoZmQsIEhGU19JKGlub2RlKS0+Y2FjaGVkX2V4dGVudHMsIHNpemVvZihoZnNfZXh0ZW50X3JlYykpOworCQlIRlNfSShpbm9kZSktPmZsYWdzICY9IH4oSEZTX0ZMR19FWFRfRElSVFl8SEZTX0ZMR19FWFRfTkVXKTsKKwl9IGVsc2UgeworCQlpZiAocmVzKQorCQkJcmV0dXJuOworCQloZnNfYm5vZGVfd3JpdGUoZmQtPmJub2RlLCBIRlNfSShpbm9kZSktPmNhY2hlZF9leHRlbnRzLCBmZC0+ZW50cnlvZmZzZXQsIGZkLT5lbnRyeWxlbmd0aCk7CisJCUhGU19JKGlub2RlKS0+ZmxhZ3MgJj0gfkhGU19GTEdfRVhUX0RJUlRZOworCX0KK30KKwordm9pZCBoZnNfZXh0X3dyaXRlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBoZnNfZmluZF9kYXRhIGZkOworCisJaWYgKEhGU19JKGlub2RlKS0+ZmxhZ3MgJiBIRlNfRkxHX0VYVF9ESVJUWSkgeworCQloZnNfZmluZF9pbml0KEhGU19TQihpbm9kZS0+aV9zYiktPmV4dF90cmVlLCAmZmQpOworCQlfX2hmc19leHRfd3JpdGVfZXh0ZW50KGlub2RlLCAmZmQpOworCQloZnNfZmluZF9leGl0KCZmZCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBfX2hmc19leHRfcmVhZF9leHRlbnQoc3RydWN0IGhmc19maW5kX2RhdGEgKmZkLCBzdHJ1Y3QgaGZzX2V4dGVudCAqZXh0ZW50LAorCQkJCQl1MzIgY25pZCwgdTMyIGJsb2NrLCB1OCB0eXBlKQoreworCWludCByZXM7CisKKwloZnNfZXh0X2J1aWxkX2tleShmZC0+c2VhcmNoX2tleSwgY25pZCwgYmxvY2ssIHR5cGUpOworCWZkLT5rZXktPmV4dC5GTnVtID0gMDsKKwlyZXMgPSBoZnNfYnJlY19maW5kKGZkKTsKKwlpZiAocmVzICYmIHJlcyAhPSAtRU5PRU5UKQorCQlyZXR1cm4gcmVzOworCWlmIChmZC0+a2V5LT5leHQuRk51bSAhPSBmZC0+c2VhcmNoX2tleS0+ZXh0LkZOdW0gfHwKKwkgICAgZmQtPmtleS0+ZXh0LkZrVHlwZSAhPSBmZC0+c2VhcmNoX2tleS0+ZXh0LkZrVHlwZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKGZkLT5lbnRyeWxlbmd0aCAhPSBzaXplb2YoaGZzX2V4dGVudF9yZWMpKQorCQlyZXR1cm4gLUVJTzsKKwloZnNfYm5vZGVfcmVhZChmZC0+Ym5vZGUsIGV4dGVudCwgZmQtPmVudHJ5b2Zmc2V0LCBzaXplb2YoaGZzX2V4dGVudF9yZWMpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19oZnNfZXh0X2NhY2hlX2V4dGVudChzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiBibG9jaykKK3sKKwlpbnQgcmVzOworCisJaWYgKEhGU19JKGlub2RlKS0+ZmxhZ3MgJiBIRlNfRkxHX0VYVF9ESVJUWSkKKwkJX19oZnNfZXh0X3dyaXRlX2V4dGVudChpbm9kZSwgZmQpOworCisJcmVzID0gX19oZnNfZXh0X3JlYWRfZXh0ZW50KGZkLCBIRlNfSShpbm9kZSktPmNhY2hlZF9leHRlbnRzLCBpbm9kZS0+aV9pbm8sCisJCQkJICAgIGJsb2NrLCBIRlNfSVNfUlNSQyhpbm9kZSkgPyBIRlNfRktfUlNSQyA6IEhGU19GS19EQVRBKTsKKwlpZiAoIXJlcykgeworCQlIRlNfSShpbm9kZSktPmNhY2hlZF9zdGFydCA9IGJlMTZfdG9fY3B1KGZkLT5rZXktPmV4dC5GQUJOKTsKKwkJSEZTX0koaW5vZGUpLT5jYWNoZWRfYmxvY2tzID0gaGZzX2V4dF9ibG9ja19jb3VudChIRlNfSShpbm9kZSktPmNhY2hlZF9leHRlbnRzKTsKKwl9IGVsc2UgeworCQlIRlNfSShpbm9kZSktPmNhY2hlZF9zdGFydCA9IEhGU19JKGlub2RlKS0+Y2FjaGVkX2Jsb2NrcyA9IDA7CisJCUhGU19JKGlub2RlKS0+ZmxhZ3MgJj0gfihIRlNfRkxHX0VYVF9ESVJUWXxIRlNfRkxHX0VYVF9ORVcpOworCX0KKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGhmc19leHRfcmVhZF9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwgdTE2IGJsb2NrKQoreworCXN0cnVjdCBoZnNfZmluZF9kYXRhIGZkOworCWludCByZXM7CisKKwlpZiAoYmxvY2sgPj0gSEZTX0koaW5vZGUpLT5jYWNoZWRfc3RhcnQgJiYKKwkgICAgYmxvY2sgPCBIRlNfSShpbm9kZSktPmNhY2hlZF9zdGFydCArIEhGU19JKGlub2RlKS0+Y2FjaGVkX2Jsb2NrcykKKwkJcmV0dXJuIDA7CisKKwloZnNfZmluZF9pbml0KEhGU19TQihpbm9kZS0+aV9zYiktPmV4dF90cmVlLCAmZmQpOworCXJlcyA9IF9faGZzX2V4dF9jYWNoZV9leHRlbnQoJmZkLCBpbm9kZSwgYmxvY2spOworCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBoZnNfZHVtcF9leHRlbnQoc3RydWN0IGhmc19leHRlbnQgKmV4dGVudCkKK3sKKwlpbnQgaTsKKworCWRwcmludChEQkdfRVhURU5ULCAiICAgIik7CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJZHByaW50KERCR19FWFRFTlQsICIgJXU6JXUiLCBiZTE2X3RvX2NwdShleHRlbnRbaV0uYmxvY2spLAorCQkJCSBiZTE2X3RvX2NwdShleHRlbnRbaV0uY291bnQpKTsKKwlkcHJpbnQoREJHX0VYVEVOVCwgIlxuIik7Cit9CisKK3N0YXRpYyBpbnQgaGZzX2FkZF9leHRlbnQoc3RydWN0IGhmc19leHRlbnQgKmV4dGVudCwgdTE2IG9mZnNldCwKKwkJCSAgdTE2IGFsbG9jX2Jsb2NrLCB1MTYgYmxvY2tfY291bnQpCit7CisJdTE2IGNvdW50LCBzdGFydDsKKwlpbnQgaTsKKworCWhmc19kdW1wX2V4dGVudChleHRlbnQpOworCWZvciAoaSA9IDA7IGkgPCAzOyBleHRlbnQrKywgaSsrKSB7CisJCWNvdW50ID0gYmUxNl90b19jcHUoZXh0ZW50LT5jb3VudCk7CisJCWlmIChvZmZzZXQgPT0gY291bnQpIHsKKwkJCXN0YXJ0ID0gYmUxNl90b19jcHUoZXh0ZW50LT5ibG9jayk7CisJCQlpZiAoYWxsb2NfYmxvY2sgIT0gc3RhcnQgKyBjb3VudCkgeworCQkJCWlmICgrK2kgPj0gMykKKwkJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQkJZXh0ZW50Kys7CisJCQkJZXh0ZW50LT5ibG9jayA9IGNwdV90b19iZTE2KGFsbG9jX2Jsb2NrKTsKKwkJCX0gZWxzZQorCQkJCWJsb2NrX2NvdW50ICs9IGNvdW50OworCQkJZXh0ZW50LT5jb3VudCA9IGNwdV90b19iZTE2KGJsb2NrX2NvdW50KTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKG9mZnNldCA8IGNvdW50KQorCQkJYnJlYWs7CisJCW9mZnNldCAtPSBjb3VudDsKKwl9CisJLyogcGFuaWM/ICovCisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgaGZzX2ZyZWVfZXh0ZW50cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaGZzX2V4dGVudCAqZXh0ZW50LAorCQkJICAgIHUxNiBvZmZzZXQsIHUxNiBibG9ja19ucikKK3sKKwl1MTYgY291bnQsIHN0YXJ0OworCWludCBpOworCisJaGZzX2R1bXBfZXh0ZW50KGV4dGVudCk7CisJZm9yIChpID0gMDsgaSA8IDM7IGV4dGVudCsrLCBpKyspIHsKKwkJY291bnQgPSBiZTE2X3RvX2NwdShleHRlbnQtPmNvdW50KTsKKwkJaWYgKG9mZnNldCA9PSBjb3VudCkKKwkJCWdvdG8gZm91bmQ7CisJCWVsc2UgaWYgKG9mZnNldCA8IGNvdW50KQorCQkJYnJlYWs7CisJCW9mZnNldCAtPSBjb3VudDsKKwl9CisJLyogcGFuaWM/ICovCisJcmV0dXJuIC1FSU87Citmb3VuZDoKKwlmb3IgKDs7KSB7CisJCXN0YXJ0ID0gYmUxNl90b19jcHUoZXh0ZW50LT5ibG9jayk7CisJCWlmIChjb3VudCA8PSBibG9ja19ucikgeworCQkJaGZzX2NsZWFyX3ZibV9iaXRzKHNiLCBzdGFydCwgY291bnQpOworCQkJZXh0ZW50LT5ibG9jayA9IDA7CisJCQlleHRlbnQtPmNvdW50ID0gMDsKKwkJCWJsb2NrX25yIC09IGNvdW50OworCQl9IGVsc2UgeworCQkJY291bnQgLT0gYmxvY2tfbnI7CisJCQloZnNfY2xlYXJfdmJtX2JpdHMoc2IsIHN0YXJ0ICsgY291bnQsIGJsb2NrX25yKTsKKwkJCWV4dGVudC0+Y291bnQgPSBjcHVfdG9fYmUxNihjb3VudCk7CisJCQlibG9ja19uciA9IDA7CisJCX0KKwkJaWYgKCFibG9ja19uciB8fCAhaSkKKwkJCXJldHVybiAwOworCQlpLS07CisJCWV4dGVudC0tOworCQljb3VudCA9IGJlMTZfdG9fY3B1KGV4dGVudC0+Y291bnQpOworCX0KK30KKworaW50IGhmc19mcmVlX2Zvcmsoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGhmc19jYXRfZmlsZSAqZmlsZSwgaW50IHR5cGUpCit7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJdTMyIHRvdGFsX2Jsb2NrcywgYmxvY2tzLCBzdGFydDsKKwl1MzIgY25pZCA9IGJlMzJfdG9fY3B1KGZpbGUtPkZsTnVtKTsKKwlzdHJ1Y3QgaGZzX2V4dGVudCAqZXh0ZW50OworCWludCByZXMsIGk7CisKKwlpZiAodHlwZSA9PSBIRlNfRktfREFUQSkgeworCQl0b3RhbF9ibG9ja3MgPSBiZTMyX3RvX2NwdShmaWxlLT5QeUxlbik7CisJCWV4dGVudCA9IGZpbGUtPkV4dFJlYzsKKwl9IGVsc2UgeworCQl0b3RhbF9ibG9ja3MgPSBiZTMyX3RvX2NwdShmaWxlLT5SUHlMZW4pOworCQlleHRlbnQgPSBmaWxlLT5SRXh0UmVjOworCX0KKwl0b3RhbF9ibG9ja3MgLz0gSEZTX1NCKHNiKS0+YWxsb2NfYmxrc3o7CisJaWYgKCF0b3RhbF9ibG9ja3MpCisJCXJldHVybiAwOworCisJYmxvY2tzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgZXh0ZW50KyssIGkrKykKKwkJYmxvY2tzICs9IGJlMTZfdG9fY3B1KGV4dGVudFtpXS5jb3VudCk7CisKKwlyZXMgPSBoZnNfZnJlZV9leHRlbnRzKHNiLCBleHRlbnQsIGJsb2NrcywgYmxvY2tzKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCWlmICh0b3RhbF9ibG9ja3MgPT0gYmxvY2tzKQorCQlyZXR1cm4gMDsKKworCWhmc19maW5kX2luaXQoSEZTX1NCKHNiKS0+ZXh0X3RyZWUsICZmZCk7CisJZG8geworCQlyZXMgPSBfX2hmc19leHRfcmVhZF9leHRlbnQoJmZkLCBleHRlbnQsIGNuaWQsIHRvdGFsX2Jsb2NrcywgdHlwZSk7CisJCWlmIChyZXMpCisJCQlicmVhazsKKwkJc3RhcnQgPSBiZTE2X3RvX2NwdShmZC5rZXktPmV4dC5GQUJOKTsKKwkJaGZzX2ZyZWVfZXh0ZW50cyhzYiwgZXh0ZW50LCB0b3RhbF9ibG9ja3MgLSBzdGFydCwgdG90YWxfYmxvY2tzKTsKKwkJaGZzX2JyZWNfcmVtb3ZlKCZmZCk7CisJCXRvdGFsX2Jsb2NrcyA9IHN0YXJ0OworCX0gd2hpbGUgKHRvdGFsX2Jsb2NrcyA+IGJsb2Nrcyk7CisJaGZzX2ZpbmRfZXhpdCgmZmQpOworCisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqIGhmc19nZXRfYmxvY2sKKyAqLworaW50IGhmc19nZXRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgYmxvY2ssCisJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwl1MTYgZGJsb2NrLCBhYmxvY2s7CisJaW50IHJlczsKKworCXNiID0gaW5vZGUtPmlfc2I7CisJLyogQ29udmVydCBpbm9kZSBibG9jayB0byBkaXNrIGFsbG9jYXRpb24gYmxvY2sgKi8KKwlhYmxvY2sgPSAodTMyKWJsb2NrIC8gSEZTX1NCKHNiKS0+ZnNfZGl2OworCisJaWYgKGJsb2NrID49IEhGU19JKGlub2RlKS0+ZnNfYmxvY2tzKSB7CisJCWlmIChibG9jayA+IEhGU19JKGlub2RlKS0+ZnNfYmxvY2tzIHx8ICFjcmVhdGUpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKGFibG9jayA+PSBIRlNfSShpbm9kZSktPmFsbG9jX2Jsb2NrcykgeworCQkJcmVzID0gaGZzX2V4dGVuZF9maWxlKGlub2RlKTsKKwkJCWlmIChyZXMpCisJCQkJcmV0dXJuIHJlczsKKwkJfQorCX0gZWxzZQorCQljcmVhdGUgPSAwOworCisJaWYgKGFibG9jayA8IEhGU19JKGlub2RlKS0+Zmlyc3RfYmxvY2tzKSB7CisJCWRibG9jayA9IGhmc19leHRfZmluZF9ibG9jayhIRlNfSShpbm9kZSktPmZpcnN0X2V4dGVudHMsIGFibG9jayk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlkb3duKCZIRlNfSShpbm9kZSktPmV4dGVudHNfbG9jayk7CisJcmVzID0gaGZzX2V4dF9yZWFkX2V4dGVudChpbm9kZSwgYWJsb2NrKTsKKwlpZiAoIXJlcykKKwkJZGJsb2NrID0gaGZzX2V4dF9maW5kX2Jsb2NrKEhGU19JKGlub2RlKS0+Y2FjaGVkX2V4dGVudHMsCisJCQkJCSAgICBhYmxvY2sgLSBIRlNfSShpbm9kZSktPmNhY2hlZF9zdGFydCk7CisJZWxzZSB7CisJCXVwKCZIRlNfSShpbm9kZSktPmV4dGVudHNfbG9jayk7CisJCXJldHVybiAtRUlPOworCX0KKwl1cCgmSEZTX0koaW5vZGUpLT5leHRlbnRzX2xvY2spOworCitkb25lOgorCW1hcF9iaChiaF9yZXN1bHQsIHNiLCBIRlNfU0Ioc2IpLT5mc19zdGFydCArCisJICAgICAgIGRibG9jayAqIEhGU19TQihzYiktPmZzX2RpdiArCisJICAgICAgICh1MzIpYmxvY2sgJSBIRlNfU0Ioc2IpLT5mc19kaXYpOworCisJaWYgKGNyZWF0ZSkgeworCQlzZXRfYnVmZmVyX25ldyhiaF9yZXN1bHQpOworCQlIRlNfSShpbm9kZSktPnBoeXNfc2l6ZSArPSBzYi0+c19ibG9ja3NpemU7CisJCUhGU19JKGlub2RlKS0+ZnNfYmxvY2tzKys7CisJCWlub2RlX2FkZF9ieXRlcyhpbm9kZSwgc2ItPnNfYmxvY2tzaXplKTsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgaGZzX2V4dGVuZF9maWxlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXUzMiBzdGFydCwgbGVuLCBnb2FsOworCWludCByZXM7CisKKwlkb3duKCZIRlNfSShpbm9kZSktPmV4dGVudHNfbG9jayk7CisJaWYgKEhGU19JKGlub2RlKS0+YWxsb2NfYmxvY2tzID09IEhGU19JKGlub2RlKS0+Zmlyc3RfYmxvY2tzKQorCQlnb2FsID0gaGZzX2V4dF9sYXN0YmxvY2soSEZTX0koaW5vZGUpLT5maXJzdF9leHRlbnRzKTsKKwllbHNlIHsKKwkJcmVzID0gaGZzX2V4dF9yZWFkX2V4dGVudChpbm9kZSwgSEZTX0koaW5vZGUpLT5hbGxvY19ibG9ja3MpOworCQlpZiAocmVzKQorCQkJZ290byBvdXQ7CisJCWdvYWwgPSBoZnNfZXh0X2xhc3RibG9jayhIRlNfSShpbm9kZSktPmNhY2hlZF9leHRlbnRzKTsKKwl9CisKKwlsZW4gPSBIRlNfSShpbm9kZSktPmNsdW1wX2Jsb2NrczsKKwlzdGFydCA9IGhmc192Ym1fc2VhcmNoX2ZyZWUoc2IsIGdvYWwsICZsZW4pOworCWlmICghbGVuKSB7CisJCXJlcyA9IC1FTk9TUEM7CisJCWdvdG8gb3V0OworCX0KKworCWRwcmludChEQkdfRVhURU5ULCAiZXh0ZW5kICVsdTogJXUsJXVcbiIsIGlub2RlLT5pX2lubywgc3RhcnQsIGxlbik7CisJaWYgKEhGU19JKGlub2RlKS0+YWxsb2NfYmxvY2tzID09IEhGU19JKGlub2RlKS0+Zmlyc3RfYmxvY2tzKSB7CisJCWlmICghSEZTX0koaW5vZGUpLT5maXJzdF9ibG9ja3MpIHsKKwkJCWRwcmludChEQkdfRVhURU5ULCAiZmlyc3QgZXh0ZW50c1xuIik7CisJCQkvKiBubyBleHRlbnRzIHlldCAqLworCQkJSEZTX0koaW5vZGUpLT5maXJzdF9leHRlbnRzWzBdLmJsb2NrID0gY3B1X3RvX2JlMTYoc3RhcnQpOworCQkJSEZTX0koaW5vZGUpLT5maXJzdF9leHRlbnRzWzBdLmNvdW50ID0gY3B1X3RvX2JlMTYobGVuKTsKKwkJCXJlcyA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiB0cnkgdG8gYXBwZW5kIHRvIGV4dGVudHMgaW4gaW5vZGUgKi8KKwkJCXJlcyA9IGhmc19hZGRfZXh0ZW50KEhGU19JKGlub2RlKS0+Zmlyc3RfZXh0ZW50cywKKwkJCQkJICAgICBIRlNfSShpbm9kZSktPmFsbG9jX2Jsb2NrcywKKwkJCQkJICAgICBzdGFydCwgbGVuKTsKKwkJCWlmIChyZXMgPT0gLUVOT1NQQykKKwkJCQlnb3RvIGluc2VydF9leHRlbnQ7CisJCX0KKwkJaWYgKCFyZXMpIHsKKwkJCWhmc19kdW1wX2V4dGVudChIRlNfSShpbm9kZSktPmZpcnN0X2V4dGVudHMpOworCQkJSEZTX0koaW5vZGUpLT5maXJzdF9ibG9ja3MgKz0gbGVuOworCQl9CisJfSBlbHNlIHsKKwkJcmVzID0gaGZzX2FkZF9leHRlbnQoSEZTX0koaW5vZGUpLT5jYWNoZWRfZXh0ZW50cywKKwkJCQkgICAgIEhGU19JKGlub2RlKS0+YWxsb2NfYmxvY2tzIC0KKwkJCQkgICAgIEhGU19JKGlub2RlKS0+Y2FjaGVkX3N0YXJ0LAorCQkJCSAgICAgc3RhcnQsIGxlbik7CisJCWlmICghcmVzKSB7CisJCQloZnNfZHVtcF9leHRlbnQoSEZTX0koaW5vZGUpLT5jYWNoZWRfZXh0ZW50cyk7CisJCQlIRlNfSShpbm9kZSktPmZsYWdzIHw9IEhGU19GTEdfRVhUX0RJUlRZOworCQkJSEZTX0koaW5vZGUpLT5jYWNoZWRfYmxvY2tzICs9IGxlbjsKKwkJfSBlbHNlIGlmIChyZXMgPT0gLUVOT1NQQykKKwkJCWdvdG8gaW5zZXJ0X2V4dGVudDsKKwl9CitvdXQ6CisJdXAoJkhGU19JKGlub2RlKS0+ZXh0ZW50c19sb2NrKTsKKwlpZiAoIXJlcykgeworCQlIRlNfSShpbm9kZSktPmFsbG9jX2Jsb2NrcyArPSBsZW47CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlpZiAoaW5vZGUtPmlfaW5vIDwgSEZTX0ZJUlNUVVNFUl9DTklEKQorCQkJc2V0X2JpdChIRlNfRkxHX0FMVF9NREJfRElSVFksICZIRlNfU0Ioc2IpLT5mbGFncyk7CisJCXNldF9iaXQoSEZTX0ZMR19NREJfRElSVFksICZIRlNfU0Ioc2IpLT5mbGFncyk7CisJCXNiLT5zX2RpcnQgPSAxOworCX0KKwlyZXR1cm4gcmVzOworCitpbnNlcnRfZXh0ZW50OgorCWRwcmludChEQkdfRVhURU5ULCAiaW5zZXJ0IG5ldyBleHRlbnRcbiIpOworCWhmc19leHRfd3JpdGVfZXh0ZW50KGlub2RlKTsKKworCW1lbXNldChIRlNfSShpbm9kZSktPmNhY2hlZF9leHRlbnRzLCAwLCBzaXplb2YoaGZzX2V4dGVudF9yZWMpKTsKKwlIRlNfSShpbm9kZSktPmNhY2hlZF9leHRlbnRzWzBdLmJsb2NrID0gY3B1X3RvX2JlMTYoc3RhcnQpOworCUhGU19JKGlub2RlKS0+Y2FjaGVkX2V4dGVudHNbMF0uY291bnQgPSBjcHVfdG9fYmUxNihsZW4pOworCWhmc19kdW1wX2V4dGVudChIRlNfSShpbm9kZSktPmNhY2hlZF9leHRlbnRzKTsKKwlIRlNfSShpbm9kZSktPmZsYWdzIHw9IEhGU19GTEdfRVhUX0RJUlRZfEhGU19GTEdfRVhUX05FVzsKKwlIRlNfSShpbm9kZSktPmNhY2hlZF9zdGFydCA9IEhGU19JKGlub2RlKS0+YWxsb2NfYmxvY2tzOworCUhGU19JKGlub2RlKS0+Y2FjaGVkX2Jsb2NrcyA9IGxlbjsKKworCXJlcyA9IDA7CisJZ290byBvdXQ7Cit9CisKK3ZvaWQgaGZzX2ZpbGVfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJdTE2IGJsa19jbnQsIGFsbG9jX2NudCwgc3RhcnQ7CisJdTMyIHNpemU7CisJaW50IHJlczsKKworCWRwcmludChEQkdfSU5PREUsICJ0cnVuY2F0ZTogJWx1LCAlTHUgLT4gJUx1XG4iLCBpbm9kZS0+aV9pbm8sCisJICAgICAgIChsb25nIGxvbmcpSEZTX0koaW5vZGUpLT5waHlzX3NpemUsIGlub2RlLT5pX3NpemUpOworCWlmIChpbm9kZS0+aV9zaXplID4gSEZTX0koaW5vZGUpLT5waHlzX3NpemUpIHsKKwkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJaW50IHJlczsKKworCQlzaXplID0gaW5vZGUtPmlfc2l6ZSAtIDE7CisJCXBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UobWFwcGluZywgc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJaWYgKCFwYWdlKQorCQkJcmV0dXJuOworCQlzaXplICY9IFBBR0VfQ0FDSEVfU0laRSAtIDE7CisJCXNpemUrKzsKKwkJcmVzID0gbWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgcGFnZSwgc2l6ZSwgc2l6ZSk7CisJCWlmICghcmVzKQorCQkJcmVzID0gbWFwcGluZy0+YV9vcHMtPmNvbW1pdF93cml0ZShOVUxMLCBwYWdlLCBzaXplLCBzaXplKTsKKwkJaWYgKHJlcykKKwkJCWlub2RlLT5pX3NpemUgPSBIRlNfSShpbm9kZSktPnBoeXNfc2l6ZTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCXJldHVybjsKKwl9CisJc2l6ZSA9IGlub2RlLT5pX3NpemUgKyBIRlNfU0Ioc2IpLT5hbGxvY19ibGtzeiAtIDE7CisJYmxrX2NudCA9IHNpemUgLyBIRlNfU0Ioc2IpLT5hbGxvY19ibGtzejsKKwlhbGxvY19jbnQgPSBIRlNfSShpbm9kZSktPmFsbG9jX2Jsb2NrczsKKwlpZiAoYmxrX2NudCA9PSBhbGxvY19jbnQpCisJCWdvdG8gb3V0OworCisJZG93bigmSEZTX0koaW5vZGUpLT5leHRlbnRzX2xvY2spOworCWhmc19maW5kX2luaXQoSEZTX1NCKHNiKS0+ZXh0X3RyZWUsICZmZCk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKGFsbG9jX2NudCA9PSBIRlNfSShpbm9kZSktPmZpcnN0X2Jsb2NrcykgeworCQkJaGZzX2ZyZWVfZXh0ZW50cyhzYiwgSEZTX0koaW5vZGUpLT5maXJzdF9leHRlbnRzLAorCQkJCQkgYWxsb2NfY250LCBhbGxvY19jbnQgLSBibGtfY250KTsKKwkJCWhmc19kdW1wX2V4dGVudChIRlNfSShpbm9kZSktPmZpcnN0X2V4dGVudHMpOworCQkJSEZTX0koaW5vZGUpLT5maXJzdF9ibG9ja3MgPSBibGtfY250OworCQkJYnJlYWs7CisJCX0KKwkJcmVzID0gX19oZnNfZXh0X2NhY2hlX2V4dGVudCgmZmQsIGlub2RlLCBhbGxvY19jbnQpOworCQlpZiAocmVzKQorCQkJYnJlYWs7CisJCXN0YXJ0ID0gSEZTX0koaW5vZGUpLT5jYWNoZWRfc3RhcnQ7CisJCWhmc19mcmVlX2V4dGVudHMoc2IsIEhGU19JKGlub2RlKS0+Y2FjaGVkX2V4dGVudHMsCisJCQkJIGFsbG9jX2NudCAtIHN0YXJ0LCBhbGxvY19jbnQgLSBibGtfY250KTsKKwkJaGZzX2R1bXBfZXh0ZW50KEhGU19JKGlub2RlKS0+Y2FjaGVkX2V4dGVudHMpOworCQlpZiAoYmxrX2NudCA+IHN0YXJ0KSB7CisJCQlIRlNfSShpbm9kZSktPmZsYWdzIHw9IEhGU19GTEdfRVhUX0RJUlRZOworCQkJYnJlYWs7CisJCX0KKwkJYWxsb2NfY250ID0gc3RhcnQ7CisJCUhGU19JKGlub2RlKS0+Y2FjaGVkX3N0YXJ0ID0gSEZTX0koaW5vZGUpLT5jYWNoZWRfYmxvY2tzID0gMDsKKwkJSEZTX0koaW5vZGUpLT5mbGFncyAmPSB+KEhGU19GTEdfRVhUX0RJUlRZfEhGU19GTEdfRVhUX05FVyk7CisJCWhmc19icmVjX3JlbW92ZSgmZmQpOworCX0KKwloZnNfZmluZF9leGl0KCZmZCk7CisJdXAoJkhGU19JKGlub2RlKS0+ZXh0ZW50c19sb2NrKTsKKworCUhGU19JKGlub2RlKS0+YWxsb2NfYmxvY2tzID0gYmxrX2NudDsKK291dDoKKwlIRlNfSShpbm9kZSktPnBoeXNfc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJSEZTX0koaW5vZGUpLT5mc19ibG9ja3MgPSAoaW5vZGUtPmlfc2l6ZSArIHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCWlub2RlX3NldF9ieXRlcyhpbm9kZSwgSEZTX0koaW5vZGUpLT5mc19ibG9ja3MgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworfQpkaWZmIC0tZ2l0IGEvZnMvaGZzL2hmcy5oIGIvZnMvaGZzL2hmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmIzM2EKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9oZnMvaGZzLmgKQEAgLTAsMCArMSwyODcgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzL2hmcy5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgIFBhdWwgSC4gSGFyZ3JvdmUKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9IRlNfSAorI2RlZmluZSBfSEZTX0gKKworLyogb2Zmc2V0cyB0byB2YXJpb3VzIGJsb2NrcyAqLworI2RlZmluZSBIRlNfRERfQkxLCQkwIC8qIERyaXZlciBEZXNjcmlwdG9yIGJsb2NrICovCisjZGVmaW5lIEhGU19QTUFQX0JMSwkJMSAvKiBGaXJzdCBibG9jayBvZiBwYXJ0aXRpb24gbWFwICovCisjZGVmaW5lIEhGU19NREJfQkxLCQkyIC8qIEJsb2NrICh3L2kgcGFydGl0aW9uKSBvZiBNREIgKi8KKworLyogbWFnaWMgbnVtYmVycyBmb3IgdmFyaW91cyBkaXNrIGJsb2NrcyAqLworI2RlZmluZSBIRlNfRFJWUl9ERVNDX01BR0lDCTB4NDU1MiAvKiAiRVIiOiBkcml2ZXIgZGVzY3JpcHRvciBtYXAgKi8KKyNkZWZpbmUgSEZTX09MRF9QTUFQX01BR0lDCTB4NTQ1MyAvKiAiVFMiOiBvbGQtdHlwZSBwYXJ0aXRpb24gbWFwICovCisjZGVmaW5lIEhGU19ORVdfUE1BUF9NQUdJQwkweDUwNEQgLyogIlBNIjogbmV3LXR5cGUgcGFydGl0aW9uIG1hcCAqLworI2RlZmluZSBIRlNfU1VQRVJfTUFHSUMJCTB4NDI0NCAvKiAiQkQiOiBIRlMgTURCIChzdXBlciBibG9jaykgKi8KKyNkZWZpbmUgSEZTX01GU19TVVBFUl9NQUdJQwkweEQyRDcgLyogTUZTIE1EQiAoc3VwZXIgYmxvY2spICovCisKKy8qIHZhcmlvdXMgRklYRUQgc2l6ZSBwYXJhbWV0ZXJzICovCisjZGVmaW5lIEhGU19TRUNUT1JfU0laRQkJNTEyICAgIC8qIHNpemUgb2YgYW4gSEZTIHNlY3RvciAqLworI2RlZmluZSBIRlNfU0VDVE9SX1NJWkVfQklUUwk5ICAgICAgLyogbG9nXzIoSEZTX1NFQ1RPUl9TSVpFKSAqLworI2RlZmluZSBIRlNfTkFNRUxFTgkJMzEgICAgIC8qIG1heGltdW0gbGVuZ3RoIG9mIGFuIEhGUyBmaWxlbmFtZSAqLworI2RlZmluZSBIRlNfTUFYX1ZBTEVOQ0UJCTMyNzY3VQorCisvKiBNZWFuaW5ncyBvZiB0aGUgZHJBdHJiIGZpZWxkIG9mIHRoZSBNREIsCisgKiBSZWZlcmVuY2U6IF9JbnNpZGUgTWFjaW50b3NoOiBGaWxlc18gcC4gMi02MQorICovCisjZGVmaW5lIEhGU19TQl9BVFRSSUJfSExPQ0sJKDEgPDwgNykKKyNkZWZpbmUgSEZTX1NCX0FUVFJJQl9VTk1OVAkoMSA8PCA4KQorI2RlZmluZSBIRlNfU0JfQVRUUklCX1NQQVJFRAkoMSA8PCA5KQorI2RlZmluZSBIRlNfU0JfQVRUUklCX0lOQ05TVE5UCSgxIDw8IDExKQorI2RlZmluZSBIRlNfU0JfQVRUUklCX1NMT0NLCSgxIDw8IDE1KQorCisvKiBTb21lIHNwZWNpYWwgRmlsZSBJRCBudW1iZXJzICovCisjZGVmaW5lIEhGU19QT1JfQ05JRAkJMQkvKiBQYXJlbnQgT2YgdGhlIFJvb3QgKi8KKyNkZWZpbmUgSEZTX1JPT1RfQ05JRAkJMgkvKiBST09UIGRpcmVjdG9yeSAqLworI2RlZmluZSBIRlNfRVhUX0NOSUQJCTMJLyogRVhUZW50cyBCLXRyZWUgKi8KKyNkZWZpbmUgSEZTX0NBVF9DTklECQk0CS8qIENBVGFsb2cgQi10cmVlICovCisjZGVmaW5lIEhGU19CQURfQ05JRAkJNQkvKiBCQUQgYmxvY2tzIGZpbGUgKi8KKyNkZWZpbmUgSEZTX0FMTE9DX0NOSUQJCTYJLyogQUxMT0NhdGlvbiBmaWxlIChIRlMrKSAqLworI2RlZmluZSBIRlNfU1RBUlRfQ05JRAkJNwkvKiBTVEFSVHVwIGZpbGUgKEhGUyspICovCisjZGVmaW5lIEhGU19BVFRSX0NOSUQJCTgJLyogQVRUUmlidXRlcyBmaWxlIChIRlMrKSAqLworI2RlZmluZSBIRlNfRVhDSF9DTklECQkxNQkvKiBFeGNoYW5nZUZpbGVzIHRlbXAgaWQgKi8KKyNkZWZpbmUgSEZTX0ZJUlNUVVNFUl9DTklECTE2CisKKy8qIHZhbHVlcyBmb3IgaGZzX2NhdF9yZWMuY2RyVHlwZSAqLworI2RlZmluZSBIRlNfQ0RSX0RJUiAgICAweDAxICAgIC8qIGZvbGRlciAoZGlyZWN0b3J5KSAqLworI2RlZmluZSBIRlNfQ0RSX0ZJTCAgICAweDAyICAgIC8qIGZpbGUgKi8KKyNkZWZpbmUgSEZTX0NEUl9USEQgICAgMHgwMyAgICAvKiBmb2xkZXIgKGRpcmVjdG9yeSkgdGhyZWFkICovCisjZGVmaW5lIEhGU19DRFJfRlRIICAgIDB4MDQgICAgLyogZmlsZSB0aHJlYWQgKi8KKworLyogbGVnYWwgdmFsdWVzIGZvciBoZnNfZXh0X2tleS5Ga1R5cGUgYW5kIGhmc19maWxlLmZvcmsgKi8KKyNkZWZpbmUgSEZTX0ZLX0RBVEEJMHgwMAorI2RlZmluZSBIRlNfRktfUlNSQwkweEZGCisKKy8qIGJpdHMgaW4gaGZzX2ZpbF9lbnRyeS5GbGFncyAqLworI2RlZmluZSBIRlNfRklMX0xPQ0sJMHgwMSAgLyogbG9ja2VkICovCisjZGVmaW5lIEhGU19GSUxfVEhECTB4MDIgIC8qIGZpbGUgdGhyZWFkICovCisjZGVmaW5lIEhGU19GSUxfRE9QRU4gICAweDA0ICAvKiBkYXRhIGZvcmsgb3BlbiAqLworI2RlZmluZSBIRlNfRklMX1JPUEVOICAgMHgwOCAgLyogcmVzb3VyY2UgZm9yayBvcGVuICovCisjZGVmaW5lIEhGU19GSUxfRElSICAgICAweDEwICAvKiBkaXJlY3RvcnkgKGFsd2F5cyBjbGVhcikgKi8KKyNkZWZpbmUgSEZTX0ZJTF9OT0NPUFkgIDB4NDAgIC8qIGNvcHktcHJvdGVjdGVkIGZpbGUgKi8KKyNkZWZpbmUgSEZTX0ZJTF9VU0VECTB4ODAgIC8qIG9wZW4gKi8KKworLyogYml0cyBpbiBoZnNfZGlyX2VudHJ5LkZsYWdzLiBkaXJmbGFncyBpcyAxNiBiaXRzLiAqLworI2RlZmluZSBIRlNfRElSX0xPQ0sgICAgICAgIDB4MDEgIC8qIGxvY2tlZCAqLworI2RlZmluZSBIRlNfRElSX1RIRCAgICAgICAgIDB4MDIgIC8qIGRpcmVjdG9yeSB0aHJlYWQgKi8KKyNkZWZpbmUgSEZTX0RJUl9JTkVYUEZPTERFUiAweDA0ICAvKiBpbiBhIHNoYXJlZCBhcmVhICovCisjZGVmaW5lIEhGU19ESVJfTU9VTlRFRCAgICAgMHgwOCAgLyogbW91bnRlZCAqLworI2RlZmluZSBIRlNfRElSX0RJUiAgICAgICAgIDB4MTAgIC8qIGRpcmVjdG9yeSAoYWx3YXlzIHNldCkgKi8KKyNkZWZpbmUgSEZTX0RJUl9FWFBGT0xERVIgICAweDIwICAvKiBzaGFyZSBwb2ludCAqLworCisvKiBiaXRzIGhmc19maW5mby5mZEZsYWdzICovCisjZGVmaW5lIEhGU19GTEdfSU5JVEVECQkweDAxMDAKKyNkZWZpbmUgSEZTX0ZMR19MT0NLRUQJCTB4MTAwMAorI2RlZmluZSBIRlNfRkxHX0lOVklTSUJMRQkweDQwMDAKKworLyo9PT09PT09PSBIRlMgc3RydWN0dXJlcyBhcyB0aGV5IGFwcGVhciBvbiB0aGUgZGlzayA9PT09PT09PSovCisKKyNkZWZpbmUgX19wYWNrZWQgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKy8qIFBhc2NhbC1zdHlsZSBzdHJpbmcgb2YgdXAgdG8gMzEgY2hhcmFjdGVycyAqLworc3RydWN0IGhmc19uYW1lIHsKKwl1OCBsZW47CisJdTggbmFtZVtIRlNfTkFNRUxFTl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaGZzX3BvaW50IHsKKwlfX2JlMTYgdjsKKwlfX2JlMTYgaDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBoZnNfcmVjdCB7CisJX19iZTE2IHRvcDsKKwlfX2JlMTYgbGVmdDsKKwlfX2JlMTYgYm90dG9tOworCV9fYmUxNiByaWdodDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBoZnNfZmluZm8geworCV9fYmUzMiBmZFR5cGU7CisJX19iZTMyIGZkQ3JlYXRvcjsKKwlfX2JlMTYgZmRGbGFnczsKKwlzdHJ1Y3QgaGZzX3BvaW50IGZkTG9jYXRpb247CisJX19iZTE2IGZkRmxkcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBoZnNfZnhpbmZvIHsKKwlfX2JlMTYgZmRJY29uSUQ7CisJdTggZmRVbnVzZWRbOF07CisJX19iZTE2IGZkQ29tbWVudDsKKwlfX2JlMzIgZmRQdXRBd2F5OworfSBfX3BhY2tlZDsKKworc3RydWN0IGhmc19kaW5mbyB7CisJc3RydWN0IGhmc19yZWN0IGZyUmVjdDsKKwlfX2JlMTYgZnJGbGFnczsKKwlzdHJ1Y3QgaGZzX3BvaW50IGZyTG9jYXRpb247CisJX19iZTE2IGZyVmlldzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBoZnNfZHhpbmZvIHsKKwlzdHJ1Y3QgaGZzX3BvaW50IGZyU2Nyb2xsOworCV9fYmUzMiBmck9wZW5DaGFpbjsKKwlfX2JlMTYgZnJVbnVzZWQ7CisJX19iZTE2IGZyQ29tbWVudDsKKwlfX2JlMzIgZnJQdXRBd2F5OworfSBfX3BhY2tlZDsKKwordW5pb24gaGZzX2ZpbmRlcl9pbmZvIHsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgaGZzX2ZpbmZvIGZpbmZvOworCQlzdHJ1Y3QgaGZzX2Z4aW5mbyBmeGluZm87CisJfSBmaWxlOworCXN0cnVjdCB7CisJCXN0cnVjdCBoZnNfZGluZm8gZGluZm87CisJCXN0cnVjdCBoZnNfZHhpbmZvIGR4aW5mbzsKKwl9IGRpcjsKK30gX19wYWNrZWQ7CisKKy8qIENhc3QgdG8gYSBwb2ludGVyIHRvIGEgZ2VuZXJpYyBia2V5ICovCisjZGVmaW5lCUhGU19CS0VZKFgpCSgoKHZvaWQpKChYKS0+S2V5TGVuKSksICgoc3RydWN0IGhmc19ia2V5ICopKFgpKSkKKworLyogVGhlIGtleSB1c2VkIGluIHRoZSBjYXRhbG9nIGItdHJlZTogKi8KK3N0cnVjdCBoZnNfY2F0X2tleSB7CisJdTgga2V5X2xlbjsJCS8qIG51bWJlciBvZiBieXRlcyBpbiB0aGUga2V5ICovCisJdTggcmVzZXJ2ZWQ7CQkvKiBwYWRkaW5nICovCisJX19iZTMyIFBhcklEOwkJLyogQ05JRCBvZiB0aGUgcGFyZW50IGRpciAqLworCXN0cnVjdCBoZnNfbmFtZQlDTmFtZTsJLyogVGhlIGZpbGVuYW1lIG9mIHRoZSBlbnRyeSAqLworfSBfX3BhY2tlZDsKKworLyogVGhlIGtleSB1c2VkIGluIHRoZSBleHRlbnRzIGItdHJlZTogKi8KK3N0cnVjdCBoZnNfZXh0X2tleSB7CisJdTgga2V5X2xlbjsJCS8qIG51bWJlciBvZiBieXRlcyBpbiB0aGUga2V5ICovCisJdTggRmtUeXBlOwkJLyogSEZTX0ZLX3tEQVRBLFJTUkN9ICovCisJX19iZTMyIEZOdW07CQkvKiBUaGUgRmlsZSBJRCBvZiB0aGUgZmlsZSAqLworCV9fYmUxNiBGQUJOOwkJLyogYWxsb2NhdGlvbiBibG9ja3MgbnVtYmVyKi8KK30gX19wYWNrZWQ7CisKK3R5cGVkZWYgdW5pb24gaGZzX2J0cmVlX2tleSB7CisJdTgga2V5X2xlbjsJCQkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGtleSAqLworCXN0cnVjdCBoZnNfY2F0X2tleSBjYXQ7CisJc3RydWN0IGhmc19leHRfa2V5IGV4dDsKK30gaGZzX2J0cmVlX2tleTsKKwordHlwZWRlZiB1bmlvbiBoZnNfYnRyZWVfa2V5IGJ0cmVlX2tleTsKKworc3RydWN0IGhmc19leHRlbnQgeworCV9fYmUxNiBibG9jazsKKwlfX2JlMTYgY291bnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgaGZzX2V4dGVudCBoZnNfZXh0ZW50X3JlY1szXTsKKworLyogVGhlIGNhdGFsb2cgcmVjb3JkIGZvciBhIGZpbGUgKi8KK3N0cnVjdCBoZnNfY2F0X2ZpbGUgeworCXM4IHR5cGU7CQkJLyogVGhlIHR5cGUgb2YgZW50cnkgKi8KKwl1OCByZXNlcnZlZDsKKwl1OCBGbGFnczsJCQkvKiBGbGFncyBzdWNoIGFzIHJlYWQtb25seSAqLworCXM4IFR5cDsJCQkJLyogZmlsZSB2ZXJzaW9uIG51bWJlciA9IDAgKi8KKwlzdHJ1Y3QgaGZzX2ZpbmZvIFVzcldkczsJLyogZGF0YSB1c2VkIGJ5IHRoZSBGaW5kZXIgKi8KKwlfX2JlMzIgRmxOdW07CQkJLyogVGhlIENOSUQgKi8KKwlfX2JlMTYgU3RCbGs7CQkJLyogb2Jzb2xldGUgKi8KKwlfX2JlMzIgTGdMZW47CQkJLyogVGhlIGxvZ2ljYWwgRU9GIG9mIHRoZSBkYXRhIGZvcmsqLworCV9fYmUzMiBQeUxlbjsJCQkvKiBUaGUgcGh5c2ljYWwgRU9GIG9mIHRoZSBkYXRhIGZvcmsgKi8KKwlfX2JlMTYgUlN0QmxrOwkJCS8qIG9ic29sZXRlICovCisJX19iZTMyIFJMZ0xlbjsJCQkvKiBUaGUgbG9naWNhbCBFT0Ygb2YgdGhlIHJzcmMgZm9yayAqLworCV9fYmUzMiBSUHlMZW47CQkJLyogVGhlIHBoeXNpY2FsIEVPRiBvZiB0aGUgcnNyYyBmb3JrICovCisJX19iZTMyIENyRGF0OwkJCS8qIFRoZSBjcmVhdGlvbiBkYXRlICovCisJX19iZTMyIE1kRGF0OwkJCS8qIFRoZSBtb2RpZmllZCBkYXRlICovCisJX19iZTMyIEJrRGF0OwkJCS8qIFRoZSBsYXN0IGJhY2t1cCBkYXRlICovCisJc3RydWN0IGhmc19meGluZm8gRm5kckluZm87CS8qIG1vcmUgZGF0YSBmb3IgdGhlIEZpbmRlciAqLworCV9fYmUxNiBDbHBTaXplOwkJCS8qIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQorCQkJCQkgICB3aGVuIGV4dGVuZGluZyBmaWxlcyAqLworCWhmc19leHRlbnRfcmVjIEV4dFJlYzsJCS8qIGZpcnN0IGV4dGVudCByZWNvcmQKKwkJCQkJICAgZm9yIHRoZSBkYXRhIGZvcmsgKi8KKwloZnNfZXh0ZW50X3JlYyBSRXh0UmVjOwkJLyogZmlyc3QgZXh0ZW50IHJlY29yZAorCQkJCQkgICBmb3IgdGhlIHJlc291cmNlIGZvcmsgKi8KKwl1MzIgUmVzcnY7CQkJLyogcmVzZXJ2ZWQgYnkgQXBwbGUgKi8KK30gX19wYWNrZWQ7CisKKy8qIHRoZSBjYXRhbG9nIHJlY29yZCBmb3IgYSBkaXJlY3RvcnkgKi8KK3N0cnVjdCBoZnNfY2F0X2RpciB7CisJczggdHlwZTsJCQkvKiBUaGUgdHlwZSBvZiBlbnRyeSAqLworCXU4IHJlc2VydmVkOworCV9fYmUxNiBGbGFnczsJCQkvKiBmbGFncyAqLworCV9fYmUxNiBWYWw7CQkJLyogVmFsZW5jZTogbnVtYmVyIG9mIGZpbGVzIGFuZAorCQkJCQkgICBkaXJzIGluIHRoZSBkaXJlY3RvcnkgKi8KKwlfX2JlMzIgRGlySUQ7CQkJLyogVGhlIENOSUQgKi8KKwlfX2JlMzIgQ3JEYXQ7CQkJLyogVGhlIGNyZWF0aW9uIGRhdGUgKi8KKwlfX2JlMzIgTWREYXQ7CQkJLyogVGhlIG1vZGlmaWNhdGlvbiBkYXRlICovCisJX19iZTMyIEJrRGF0OwkJCS8qIFRoZSBsYXN0IGJhY2t1cCBkYXRlICovCisJc3RydWN0IGhmc19kaW5mbyBVc3JJbmZvOwkvKiBkYXRhIHVzZWQgYnkgdGhlIEZpbmRlciAqLworCXN0cnVjdCBoZnNfZHhpbmZvIEZuZHJJbmZvOwkvKiBtb3JlIGRhdGEgdXNlZCBieSBGaW5kZXIgKi8KKwl1OCBSZXNydlsxNl07CQkJLyogcmVzZXJ2ZWQgYnkgQXBwbGUgKi8KK30gX19wYWNrZWQ7CisKKy8qIHRoZSBjYXRhbG9nIHJlY29yZCBmb3IgYSB0aHJlYWQgKi8KK3N0cnVjdCBoZnNfY2F0X3RocmVhZCB7CisJczggdHlwZTsJCQkvKiBUaGUgdHlwZSBvZiBlbnRyeSAqLworCXU4IHJlc2VydmVkWzldOwkJCS8qIHJlc2VydmVkIGJ5IEFwcGxlICovCisJX19iZTMyIFBhcklEOwkJCS8qIENOSUQgb2YgcGFyZW50IGRpcmVjdG9yeSAqLworCXN0cnVjdCBoZnNfbmFtZSBDTmFtZTsJCS8qIFRoZSBuYW1lIG9mIHRoaXMgZW50cnkgKi8KK30gIF9fcGFja2VkOworCisvKiBBIGNhdGFsb2cgdHJlZSByZWNvcmQgKi8KK3R5cGVkZWYgdW5pb24gaGZzX2NhdF9yZWMgeworCXM4IHR5cGU7CQkJLyogVGhlIHR5cGUgb2YgZW50cnkgKi8KKwlzdHJ1Y3QgaGZzX2NhdF9maWxlIGZpbGU7CisJc3RydWN0IGhmc19jYXRfZGlyIGRpcjsKKwlzdHJ1Y3QgaGZzX2NhdF90aHJlYWQgdGhyZWFkOworfSBoZnNfY2F0X3JlYzsKKworc3RydWN0IGhmc19tZGIgeworCV9fYmUxNiBkclNpZ1dvcmQ7CQkvKiBTaWduYXR1cmUgd29yZCBpbmRpY2F0aW5nIGZzIHR5cGUgKi8KKwlfX2JlMzIgZHJDckRhdGU7CQkvKiBmcyBjcmVhdGlvbiBkYXRlL3RpbWUgKi8KKwlfX2JlMzIgZHJMc01vZDsJCQkvKiBmcyBtb2RpZmljYXRpb24gZGF0ZS90aW1lICovCisJX19iZTE2IGRyQXRyYjsJCQkvKiBmcyBhdHRyaWJ1dGVzICovCisJX19iZTE2IGRyTm1GbHM7CQkJLyogbnVtYmVyIG9mIGZpbGVzIGluIHJvb3QgZGlyZWN0b3J5ICovCisJX19iZTE2IGRyVkJNU3Q7CQkJLyogbG9jYXRpb24gKGluIDUxMi1ieXRlIGJsb2NrcykKKwkJCQkJICAgb2YgdGhlIHZvbHVtZSBiaXRtYXAgKi8KKwlfX2JlMTYgZHJBbGxvY1B0cjsJCS8qIGxvY2F0aW9uIChpbiBhbGxvY2F0aW9uIGJsb2NrcykKKwkJCQkJICAgdG8gYmVnaW4gbmV4dCBhbGxvY2F0aW9uIHNlYXJjaCAqLworCV9fYmUxNiBkck5tQWxCbGtzOwkJLyogbnVtYmVyIG9mIGFsbG9jYXRpb24gYmxvY2tzICovCisJX19iZTMyIGRyQWxCbGtTaXo7CQkvKiBieXRlcyBpbiBhbiBhbGxvY2F0aW9uIGJsb2NrICovCisJX19iZTMyIGRyQ2xwU2l6OwkJLyogY2x1bXBzaXplLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvCisJCQkJCSAgIGFsbG9jYXRlIHdoZW4gZXh0ZW5kaW5nIGEgZmlsZSAqLworCV9fYmUxNiBkckFsQmxTdDsJCS8qIGxvY2F0aW9uIChpbiA1MTItYnl0ZSBibG9ja3MpCisJCQkJCSAgIG9mIHRoZSBmaXJzdCBhbGxvY2F0aW9uIGJsb2NrICovCisJX19iZTMyIGRyTnh0Q05JRDsJCS8qIENOSUQgdG8gYXNzaWduIHRvIHRoZSBuZXh0CisJCQkJCSAgIGZpbGUgb3IgZGlyZWN0b3J5IGNyZWF0ZWQgKi8KKwlfX2JlMTYgZHJGcmVlQmtzOwkJLyogbnVtYmVyIG9mIGZyZWUgYWxsb2NhdGlvbiBibG9ja3MgKi8KKwl1OCBkclZOWzI4XTsJCQkvKiB0aGUgdm9sdW1lIGxhYmVsICovCisJX19iZTMyIGRyVm9sQmtVcDsJCS8qIGZzIGJhY2t1cCBkYXRlL3RpbWUgKi8KKwlfX2JlMTYgZHJWU2VxTnVtOwkJLyogYmFja3VwIHNlcXVlbmNlIG51bWJlciAqLworCV9fYmUzMiBkcldyQ250OwkJCS8qIGZzIHdyaXRlIGNvdW50ICovCisJX19iZTMyIGRyWFRDbHBTaXo7CQkvKiBjbHVtcHNpemUgZm9yIHRoZSBleHRlbnRzIEItdHJlZSAqLworCV9fYmUzMiBkckNUQ2xwU2l6OwkJLyogY2x1bXBzaXplIGZvciB0aGUgY2F0YWxvZyBCLXRyZWUgKi8KKwlfX2JlMTYgZHJObVJ0RGlyczsJCS8qIG51bWJlciBvZiBkaXJlY3RvcmllcyBpbgorCQkJCQkgICB0aGUgcm9vdCBkaXJlY3RvcnkgKi8KKwlfX2JlMzIgZHJGaWxDbnQ7CQkvKiBudW1iZXIgb2YgZmlsZXMgaW4gdGhlIGZzICovCisJX19iZTMyIGRyRGlyQ250OwkJLyogbnVtYmVyIG9mIGRpcmVjdG9yaWVzIGluIHRoZSBmcyAqLworCXU4IGRyRm5kckluZm9bMzJdOwkJLyogZGF0YSB1c2VkIGJ5IHRoZSBGaW5kZXIgKi8KKwlfX2JlMTYgZHJFbWJlZFNpZ1dvcmQ7CQkvKiBlbWJlZGRlZCB2b2x1bWUgc2lnbmF0dXJlICovCisJX19iZTMyIGRyRW1iZWRFeHRlbnQ7CQkvKiBzdGFydGluZyBibG9jayBudW1iZXIgKHhkclN0QUJOKQorCQkJCQkgICBhbmQgbnVtYmVyIG9mIGFsbG9jYXRpb24gYmxvY2tzCisJCQkJCSAgICh4ZHJOdW1BQmxrcykgb2NjdXBpZWQgYnkgZW1iZWRkZWQKKwkJCQkJICAgdm9sdW1lICovCisJX19iZTMyIGRyWFRGbFNpemU7CQkvKiBieXRlcyBpbiB0aGUgZXh0ZW50cyBCLXRyZWUgKi8KKwloZnNfZXh0ZW50X3JlYyBkclhURXh0UmVjOwkvKiBleHRlbnRzIEItdHJlZSdzIGZpcnN0IDMgZXh0ZW50cyAqLworCV9fYmUzMiBkckNURmxTaXplOwkJLyogYnl0ZXMgaW4gdGhlIGNhdGFsb2cgQi10cmVlICovCisJaGZzX2V4dGVudF9yZWMgZHJDVEV4dFJlYzsJLyogY2F0YWxvZyBCLXRyZWUncyBmaXJzdCAzIGV4dGVudHMgKi8KK30gX19wYWNrZWQ7CisKKy8qPT09PT09PT0gRGF0YSBzdHJ1Y3R1cmVzIGtlcHQgaW4gbWVtb3J5ID09PT09PT09Ki8KKworc3RydWN0IGhmc19yZWFkZGlyX2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzdHJ1Y3QgaGZzX2NhdF9rZXkga2V5OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9oZnMvaGZzX2ZzLmggYi9mcy9oZnMvaGZzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjOGVmOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9oZnNfZnMuaApAQCAtMCwwICsxLDI4NiBAQAorLyoKKyAqICBsaW51eC9mcy9oZnMvaGZzX2ZzLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyAgUGF1bCBILiBIYXJncm92ZQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0hGU19GU19ICisjZGVmaW5lIF9MSU5VWF9IRlNfRlNfSAorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiaGZzLmgiCisKKyNkZWZpbmUgREJHX0JOT0RFX1JFRlMJMHgwMDAwMDAwMQorI2RlZmluZSBEQkdfQk5PREVfTU9ECTB4MDAwMDAwMDIKKyNkZWZpbmUgREJHX0NBVF9NT0QJMHgwMDAwMDAwNAorI2RlZmluZSBEQkdfSU5PREUJMHgwMDAwMDAwOAorI2RlZmluZSBEQkdfU1VQRVIJMHgwMDAwMDAxMAorI2RlZmluZSBEQkdfRVhURU5UCTB4MDAwMDAwMjAKKyNkZWZpbmUgREJHX0JJVE1BUAkweDAwMDAwMDQwCisKKy8vI2RlZmluZSBEQkdfTUFTSwkoREJHX0VYVEVOVHxEQkdfSU5PREV8REJHX0JOT0RFX01PRHxEQkdfQ0FUX01PRHxEQkdfQklUTUFQKQorLy8jZGVmaW5lIERCR19NQVNLCShEQkdfQk5PREVfTU9EfERCR19DQVRfTU9EfERCR19JTk9ERSkKKy8vI2RlZmluZSBEQkdfTUFTSwkoREJHX0NBVF9NT0R8REJHX0JOT0RFX1JFRlN8REJHX0lOT0RFfERCR19FWFRFTlQpCisjZGVmaW5lIERCR19NQVNLCSgwKQorCisjZGVmaW5lIGRwcmludChmbGcsIGZtdCwgYXJncy4uLikgXAorCWlmIChmbGcgJiBEQkdfTUFTSykgcHJpbnRrKGZtdCAsICMjIGFyZ3MpCisKKyNkZWZpbmUgaGZzX3dhcm4oZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIGZvcm1hdCAsICMjIGFyZ3MpCisjZGVmaW5lIGhmc19lcnJvcihmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiBmb3JtYXQgLCAjIyBhcmdzKQorCisvKgorICogc3RydWN0IGhmc19pbm9kZV9pbmZvCisgKgorICogVGhlIEhGUy1zcGVjaWZpYyBwYXJ0IG9mIGEgTGludXggKHN0cnVjdCBpbm9kZSkKKyAqLworc3RydWN0IGhmc19pbm9kZV9pbmZvIHsKKwlhdG9taWNfdCBvcGVuY250OworCisJdW5zaWduZWQgaW50IGZsYWdzOworCisJLyogdG8gZGVhbCB3aXRoIGxvY2FsdGltZSB1Z2xpbmVzcyAqLworCWludCB0el9zZWNvbmRzd2VzdDsKKworCXN0cnVjdCBoZnNfY2F0X2tleSBjYXRfa2V5OworCisJc3RydWN0IGxpc3RfaGVhZCBvcGVuX2Rpcl9saXN0OworCXN0cnVjdCBpbm9kZSAqcnNyY19pbm9kZTsKKworCXN0cnVjdCBzZW1hcGhvcmUgZXh0ZW50c19sb2NrOworCisJdTE2IGFsbG9jX2Jsb2NrcywgY2x1bXBfYmxvY2tzOworCXNlY3Rvcl90IGZzX2Jsb2NrczsKKwkvKiBBbGxvY2F0aW9uIGV4dGVudHMgZnJvbSBjYXRsb2cgcmVjb3JkIG9yIHZvbHVtZSBoZWFkZXIgKi8KKwloZnNfZXh0ZW50X3JlYyBmaXJzdF9leHRlbnRzOworCXUxNiBmaXJzdF9ibG9ja3M7CisJaGZzX2V4dGVudF9yZWMgY2FjaGVkX2V4dGVudHM7CisJdTE2IGNhY2hlZF9zdGFydCwgY2FjaGVkX2Jsb2NrczsKKworCWxvZmZfdCBwaHlzX3NpemU7CisJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKK307CisKKyNkZWZpbmUgSEZTX0ZMR19SU1JDCQkweDAwMDEKKyNkZWZpbmUgSEZTX0ZMR19FWFRfRElSVFkJMHgwMDAyCisjZGVmaW5lIEhGU19GTEdfRVhUX05FVwkJMHgwMDA0CisKKyNkZWZpbmUgSEZTX0lTX1JTUkMoaW5vZGUpCShIRlNfSShpbm9kZSktPmZsYWdzICYgSEZTX0ZMR19SU1JDKQorCisvKgorICogc3RydWN0IGhmc19zYl9pbmZvCisgKgorICogVGhlIEhGUy1zcGVjaWZpYyBwYXJ0IG9mIGEgTGludXggKHN0cnVjdCBzdXBlcl9ibG9jaykKKyAqLworc3RydWN0IGhmc19zYl9pbmZvIHsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm1kYl9iaDsJCS8qIFRoZSBoZnNfYnVmZmVyCisJCQkJCQkgICBob2xkaW5nIHRoZSByZWFsCisJCQkJCQkgICBzdXBlcmJsb2NrIChha2EgVklCCisJCQkJCQkgICBvciBNREIpICovCisJc3RydWN0IGhmc19tZGIgKm1kYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmFsdF9tZGJfYmg7CQkvKiBUaGUgaGZzX2J1ZmZlciBob2xkaW5nCisJCQkJCQkgICB0aGUgYWx0ZXJuYXRlIHN1cGVyYmxvY2sgKi8KKwlzdHJ1Y3QgaGZzX21kYiAqYWx0X21kYjsKKwlfX2JlMzIgKmJpdG1hcDsJCQkJLyogVGhlIHBhZ2UgaG9sZGluZyB0aGUKKwkJCQkJCSAgIGFsbG9jYXRpb24gYml0bWFwICovCisJc3RydWN0IGhmc19idHJlZSAqZXh0X3RyZWU7CQkJLyogSW5mb3JtYXRpb24gYWJvdXQKKwkJCQkJCSAgIHRoZSBleHRlbnRzIGItdHJlZSAqLworCXN0cnVjdCBoZnNfYnRyZWUgKmNhdF90cmVlOwkJCS8qIEluZm9ybWF0aW9uIGFib3V0CisJCQkJCQkgICB0aGUgY2F0YWxvZyBiLXRyZWUgKi8KKwl1MzIgZmlsZV9jb3VudDsJCQkJLyogVGhlIG51bWJlciBvZgorCQkJCQkJICAgcmVndWxhciBmaWxlcyBpbgorCQkJCQkJICAgdGhlIGZpbGVzeXN0ZW0gKi8KKwl1MzIgZm9sZGVyX2NvdW50OwkJCS8qIFRoZSBudW1iZXIgb2YKKwkJCQkJCSAgIGRpcmVjdG9yaWVzIGluIHRoZQorCQkJCQkJICAgZmlsZXN5c3RlbSAqLworCXUzMiBuZXh0X2lkOwkJCQkvKiBUaGUgbmV4dCBhdmFpbGFibGUKKwkJCQkJCSAgIGZpbGUgaWQgbnVtYmVyICovCisJdTMyIGNsdW1wYWJsa3M7CQkJCS8qIFRoZSBudW1iZXIgb2YgYWxsb2NhdGlvbgorCQkJCQkJICAgYmxvY2tzIHRvIHRyeSB0byBhZGQgd2hlbgorCQkJCQkJICAgZXh0ZW5kaW5nIGEgZmlsZSAqLworCXUzMiBmc19zdGFydDsJCQkJLyogVGhlIGZpcnN0IDUxMi1ieXRlCisJCQkJCQkgICBibG9jayByZXByZXNlbnRlZAorCQkJCQkJICAgaW4gdGhlIGJpdG1hcCAqLworCXUzMiBwYXJ0X3N0YXJ0OworCXUxNiByb290X2ZpbGVzOwkJCQkvKiBUaGUgbnVtYmVyIG9mCisJCQkJCQkgICByZWd1bGFyCisJCQkJCQkgICAobm9uLWRpcmVjdG9yeSkKKwkJCQkJCSAgIGZpbGVzIGluIHRoZSByb290CisJCQkJCQkgICBkaXJlY3RvcnkgKi8KKwl1MTYgcm9vdF9kaXJzOwkJCQkvKiBUaGUgbnVtYmVyIG9mCisJCQkJCQkgICBkaXJlY3RvcmllcyBpbiB0aGUKKwkJCQkJCSAgIHJvb3QgZGlyZWN0b3J5ICovCisJdTE2IGZzX2FibG9ja3M7CQkJCS8qIFRoZSBudW1iZXIgb2YKKwkJCQkJCSAgIGFsbG9jYXRpb24gYmxvY2tzCisJCQkJCQkgICBpbiB0aGUgZmlsZXN5c3RlbSAqLworCXUxNiBmcmVlX2FibG9ja3M7CQkJLyogdGhlIG51bWJlciBvZiB1bnVzZWQKKwkJCQkJCSAgIGFsbG9jYXRpb24gYmxvY2tzCisJCQkJCQkgICBpbiB0aGUgZmlsZXN5c3RlbSAqLworCXUzMiBhbGxvY19ibGtzejsJCQkvKiBUaGUgc2l6ZSBvZiBhbgorCQkJCQkJICAgImFsbG9jYXRpb24gYmxvY2siICovCisJaW50IHNfcXVpZXQ7CQkJCS8qIFNpbGVudCBmYWlsdXJlIHdoZW4KKwkJCQkJCSAgIGNoYW5naW5nIG93bmVyIG9yIG1vZGU/ICovCisJX19iZTMyIHNfdHlwZTsJCQkJLyogVHlwZSBmb3IgbmV3IGZpbGVzICovCisJX19iZTMyIHNfY3JlYXRvcjsJCQkvKiBDcmVhdG9yIGZvciBuZXcgZmlsZXMgKi8KKwl1bW9kZV90IHNfZmlsZV91bWFzazsJCQkvKiBUaGUgdW1hc2sgYXBwbGllZCB0byB0aGUKKwkJCQkJCSAgIHBlcm1pc3Npb25zIG9uIGFsbCBmaWxlcyAqLworCXVtb2RlX3Qgc19kaXJfdW1hc2s7CQkJLyogVGhlIHVtYXNrIGFwcGxpZWQgdG8gdGhlCisJCQkJCQkgICBwZXJtaXNzaW9ucyBvbiBhbGwgZGlycyAqLworCXVpZF90IHNfdWlkOwkJCQkvKiBUaGUgdWlkIG9mIGFsbCBmaWxlcyAqLworCWdpZF90IHNfZ2lkOwkJCQkvKiBUaGUgZ2lkIG9mIGFsbCBmaWxlcyAqLworCisJaW50IHNlc3Npb24sIHBhcnQ7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIGJpdG1hcF9sb2NrOworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXUxNiBibG9ja29mZnNldDsKKworCWludCBmc19kaXY7CisKKwlzdHJ1Y3QgaGxpc3RfaGVhZCByc3JjX2lub2RlczsKK307CisKKyNkZWZpbmUgSEZTX0ZMR19CSVRNQVBfRElSVFkJMAorI2RlZmluZSBIRlNfRkxHX01EQl9ESVJUWQkxCisjZGVmaW5lIEhGU19GTEdfQUxUX01EQl9ESVJUWQkyCisKKy8qIGJpdG1hcC5jICovCitleHRlcm4gdTMyIGhmc192Ym1fc2VhcmNoX2ZyZWUoc3RydWN0IHN1cGVyX2Jsb2NrICosIHUzMiwgdTMyICopOworZXh0ZXJuIGludCBoZnNfY2xlYXJfdmJtX2JpdHMoc3RydWN0IHN1cGVyX2Jsb2NrICosIHUxNiwgdTE2KTsKKworLyogY2F0YWxvZy5jICovCitleHRlcm4gaW50IGhmc19jYXRfa2V5Y21wKGNvbnN0IGJ0cmVlX2tleSAqLCBjb25zdCBidHJlZV9rZXkgKik7CitzdHJ1Y3QgaGZzX2ZpbmRfZGF0YTsKK2V4dGVybiBpbnQgaGZzX2NhdF9maW5kX2JyZWMoc3RydWN0IHN1cGVyX2Jsb2NrICosIHUzMiwgc3RydWN0IGhmc19maW5kX2RhdGEgKik7CitleHRlcm4gaW50IGhmc19jYXRfY3JlYXRlKHUzMiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBxc3RyICosIHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgaGZzX2NhdF9kZWxldGUodTMyLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHFzdHIgKik7CitleHRlcm4gaW50IGhmc19jYXRfbW92ZSh1MzIsIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcXN0ciAqLAorCQkJc3RydWN0IGlub2RlICosIHN0cnVjdCBxc3RyICopOworZXh0ZXJuIHZvaWQgaGZzX2NhdF9idWlsZF9rZXkoYnRyZWVfa2V5ICosIHUzMiwgc3RydWN0IHFzdHIgKik7CisKKy8qIGRpci5jICovCitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBoZnNfZGlyX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaGZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCisvKiBleHRlbnQuYyAqLworZXh0ZXJuIGludCBoZnNfZXh0X2tleWNtcChjb25zdCBidHJlZV9rZXkgKiwgY29uc3QgYnRyZWVfa2V5ICopOworZXh0ZXJuIGludCBoZnNfZnJlZV9mb3JrKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgaGZzX2NhdF9maWxlICosIGludCk7CitleHRlcm4gdm9pZCBoZnNfZXh0X3dyaXRlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gaW50IGhmc19leHRlbmRfZmlsZShzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gdm9pZCBoZnNfZmlsZV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKik7CisKK2V4dGVybiBpbnQgaGZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOworCisvKiBpbm9kZS5jICovCitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBoZnNfYW9wczsKK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGhmc19idHJlZV9hb3BzOworCitleHRlcm4gc3RydWN0IGlub2RlICpoZnNfbmV3X2lub2RlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcXN0ciAqLCBpbnQpOworZXh0ZXJuIHZvaWQgaGZzX2lub2RlX3dyaXRlX2Zvcmsoc3RydWN0IGlub2RlICosIHN0cnVjdCBoZnNfZXh0ZW50ICosIF9fYmUzMiAqLCBfX2JlMzIgKik7CitleHRlcm4gaW50IGhmc193cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKK2V4dGVybiBpbnQgaGZzX2lub2RlX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaWF0dHIgKik7CitleHRlcm4gdm9pZCBoZnNfaW5vZGVfcmVhZF9mb3JrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBoZnNfZXh0ZW50ICpleHQsCisJCQlfX2JlMzIgbG9nX3NpemUsIF9fYmUzMiBwaHlzX3NpemUsIHUzMiBjbHVtcF9zaXplKTsKK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKmhmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgaGZzX2NhdF9rZXkgKiwgaGZzX2NhdF9yZWMgKik7CitleHRlcm4gdm9pZCBoZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHZvaWQgaGZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CisKKy8qIGF0dHIuYyAqLworZXh0ZXJuIGludCBoZnNfc2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lLAorCQkJY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOworZXh0ZXJuIHNzaXplX3QgaGZzX2dldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUpOworZXh0ZXJuIHNzaXplX3QgaGZzX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworCisvKiBtZGIuYyAqLworZXh0ZXJuIGludCBoZnNfbWRiX2dldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitleHRlcm4gdm9pZCBoZnNfbWRiX2NvbW1pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitleHRlcm4gdm9pZCBoZnNfbWRiX2Nsb3NlKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2V4dGVybiB2b2lkIGhmc19tZGJfcHV0KHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKworLyogcGFydF90YmwuYyAqLworZXh0ZXJuIGludCBoZnNfcGFydF9maW5kKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWN0b3JfdCAqLCBzZWN0b3JfdCAqKTsKKworLyogc3RyaW5nLmMgKi8KK2V4dGVybiBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgaGZzX2RlbnRyeV9vcGVyYXRpb25zOworCitleHRlcm4gaW50IGhmc19oYXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBxc3RyICopOworZXh0ZXJuIGludCBoZnNfc3RyY21wKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LAorCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCk7CitleHRlcm4gaW50IGhmc19jb21wYXJlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBxc3RyICosIHN0cnVjdCBxc3RyICopOworCisvKiB0cmFucy5jICovCitleHRlcm4gdm9pZCBoZnNfdHJpdjJtYWMoc3RydWN0IGhmc19uYW1lICosIHN0cnVjdCBxc3RyICopOworZXh0ZXJuIGludCBoZnNfbWFjMnRyaXYoY2hhciAqLCBjb25zdCBzdHJ1Y3QgaGZzX25hbWUgKik7CisKK2V4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OworCisvKgorICogVGhlcmUgYXJlIHR3byB0aW1lIHN5c3RlbXMuICBCb3RoIGFyZSBiYXNlZCBvbiBzZWNvbmRzIHNpbmNlCisgKiBhIHBhcnRpY3VsYXIgdGltZS9kYXRlLgorICoJVW5peDoJdW5zaWduZWQgbGlsLWVuZGlhbiBzaW5jZSAwMDowMCBHTVQsIEphbi4gMSwgMTk3MAorICoJbWFjOgl1bnNpZ25lZCBiaWctZW5kaWFuIHNpbmNlIDAwOjAwIEdNVCwgSmFuLiAxLCAxOTA0CisgKgorICovCisjZGVmaW5lIF9faGZzX3VfdG9fbXRpbWUoc2VjKQljcHVfdG9fYmUzMihzZWMgKyAyMDgyODQ0ODAwVSAtIHN5c190ei50el9taW51dGVzd2VzdCAqIDYwKQorI2RlZmluZSBfX2hmc19tX3RvX3V0aW1lKHNlYykJKGJlMzJfdG9fY3B1KHNlYykgLSAyMDgyODQ0ODAwVSAgKyBzeXNfdHoudHpfbWludXRlc3dlc3QgKiA2MCkKKworI2RlZmluZSBIRlNfSShpbm9kZSkJKGxpc3RfZW50cnkoaW5vZGUsIHN0cnVjdCBoZnNfaW5vZGVfaW5mbywgdmZzX2lub2RlKSkKKyNkZWZpbmUgSEZTX1NCKHNiKQkoKHN0cnVjdCBoZnNfc2JfaW5mbyAqKShzYiktPnNfZnNfaW5mbykKKworI2RlZmluZSBoZnNfbV90b191dGltZSh0aW1lKQkoc3RydWN0IHRpbWVzcGVjKXsgLnR2X3NlYyA9IF9faGZzX21fdG9fdXRpbWUodGltZSkgfQorI2RlZmluZSBoZnNfdV90b19tdGltZSh0aW1lKQlfX2hmc191X3RvX210aW1lKCh0aW1lKS50dl9zZWMpCisjZGVmaW5lIGhmc19tdGltZSgpCQlfX2hmc191X3RvX210aW1lKGdldF9zZWNvbmRzKCkpCisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqaGZzX21kYl9uYW1lKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIHNiLT5zX2lkOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGZzX2JpdG1hcF9kaXJ0eShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXNldF9iaXQoSEZTX0ZMR19CSVRNQVBfRElSVFksICZIRlNfU0Ioc2IpLT5mbGFncyk7CisJc2ItPnNfZGlydCA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZnNfYnVmZmVyX3N5bmMoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwl3aGlsZSAoYnVmZmVyX2xvY2tlZChiaCkpIHsKKwkJd2FpdF9vbl9idWZmZXIoYmgpOworCX0KKwlpZiAoYnVmZmVyX2RpcnR5KGJoKSkgeworCQlsbF9yd19ibG9jayhXUklURSwgMSwgJmJoKTsKKwkJd2FpdF9vbl9idWZmZXIoYmgpOworCX0KK30KKworI2RlZmluZSBzYl9icmVhZDUxMihzYiwgc2VjLCBkYXRhKSAoewkJCVwKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKl9fYmg7CQkJXAorCXNlY3Rvcl90IF9fYmxvY2s7CQkJCVwKKwlsb2ZmX3QgX19zdGFydDsJCQkJCVwKKwlpbnQgX19vZmZzZXQ7CQkJCQlcCisJCQkJCQkJXAorCV9fc3RhcnQgPSAobG9mZl90KShzZWMpIDw8IEhGU19TRUNUT1JfU0laRV9CSVRTO1wKKwlfX2Jsb2NrID0gX19zdGFydCA+PiAoc2IpLT5zX2Jsb2Nrc2l6ZV9iaXRzOwlcCisJX19vZmZzZXQgPSBfX3N0YXJ0ICYgKChzYiktPnNfYmxvY2tzaXplIC0gMSk7CVwKKwlfX2JoID0gc2JfYnJlYWQoKHNiKSwgX19ibG9jayk7CQkJXAorCWlmIChsaWtlbHkoX19iaCAhPSBOVUxMKSkJCQlcCisJCWRhdGEgPSAodm9pZCAqKShfX2JoLT5iX2RhdGEgKyBfX29mZnNldCk7XAorCWVsc2UJCQkJCQlcCisJCWRhdGEgPSBOVUxMOwkJCQlcCisJX19iaDsJCQkJCQlcCit9KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2hmcy9pbm9kZS5jIGIvZnMvaGZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxOTEyMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9pbm9kZS5jCkBAIC0wLDAgKzEsNjM2IEBACisvKgorICogIGxpbnV4L2ZzL2hmcy9pbm9kZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgIFBhdWwgSC4gSGFyZ3JvdmUKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgaW5vZGUtcmVsYXRlZCBmdW5jdGlvbnMgd2hpY2ggZG8gbm90IGRlcGVuZCBvbgorICogd2hpY2ggc2NoZW1lIGlzIGJlaW5nIHVzZWQgdG8gcmVwcmVzZW50IGZvcmtzLgorICoKKyAqIEJhc2VkIG9uIHRoZSBtaW5peCBmaWxlIHN5c3RlbSBjb2RlLCAoQykgMTk5MSwgMTk5MiBieSBMaW51cyBUb3J2YWxkcworICovCisKKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CisKKyNpbmNsdWRlICJoZnNfZnMuaCIKKyNpbmNsdWRlICJidHJlZS5oIgorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBoZnNfZmlsZV9vcGVyYXRpb25zOworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGhmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisKKy8qPT09PT09PT09PT09PT09PSBWYXJpYWJsZS1saWtlIG1hY3JvcyA9PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBIRlNfVkFMSURfTU9ERV9CSVRTICAoU19JRlJFRyB8IFNfSUZESVIgfCBTX0lSV1hVR08pCisKK3N0YXRpYyBpbnQgaGZzX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJcmV0dXJuIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLCBoZnNfZ2V0X2Jsb2NrLCB3YmMpOworfQorCitzdGF0aWMgaW50IGhmc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlKHBhZ2UsIGhmc19nZXRfYmxvY2spOworfQorCitzdGF0aWMgaW50IGhmc19wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJcmV0dXJuIGNvbnRfcHJlcGFyZV93cml0ZShwYWdlLCBmcm9tLCB0bywgaGZzX2dldF9ibG9jaywKKwkJCQkgICZIRlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KS0+cGh5c19zaXplKTsKK30KKworc3RhdGljIHNlY3Rvcl90IGhmc19ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jaykKK3sKKwlyZXR1cm4gZ2VuZXJpY19ibG9ja19ibWFwKG1hcHBpbmcsIGJsb2NrLCBoZnNfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIGludCBoZnNfcmVsZWFzZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBtYXNrKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBoZnNfYm5vZGUgKm5vZGU7CisJdTMyIG5pZHg7CisJaW50IGksIHJlcyA9IDE7CisKKwlzd2l0Y2ggKGlub2RlLT5pX2lubykgeworCWNhc2UgSEZTX0VYVF9DTklEOgorCQl0cmVlID0gSEZTX1NCKHNiKS0+ZXh0X3RyZWU7CisJCWJyZWFrOworCWNhc2UgSEZTX0NBVF9DTklEOgorCQl0cmVlID0gSEZTX1NCKHNiKS0+Y2F0X3RyZWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHRyZWUtPm5vZGVfc2l6ZSA+PSBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJbmlkeCA9IHBhZ2UtPmluZGV4ID4+ICh0cmVlLT5ub2RlX3NpemVfc2hpZnQgLSBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJc3Bpbl9sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCQlub2RlID0gaGZzX2Jub2RlX2ZpbmRoYXNoKHRyZWUsIG5pZHgpOworCQlpZiAoIW5vZGUpCisJCQk7CisJCWVsc2UgaWYgKGF0b21pY19yZWFkKCZub2RlLT5yZWZjbnQpKQorCQkJcmVzID0gMDsKKwkJaWYgKHJlcyAmJiBub2RlKSB7CisJCQloZnNfYm5vZGVfdW5oYXNoKG5vZGUpOworCQkJaGZzX2Jub2RlX2ZyZWUobm9kZSk7CisJCX0KKwkJc3Bpbl91bmxvY2soJnRyZWUtPmhhc2hfbG9jayk7CisJfSBlbHNlIHsKKwkJbmlkeCA9IHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gdHJlZS0+bm9kZV9zaXplX3NoaWZ0KTsKKwkJaSA9IDEgPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSB0cmVlLT5ub2RlX3NpemVfc2hpZnQpOworCQlzcGluX2xvY2soJnRyZWUtPmhhc2hfbG9jayk7CisJCWRvIHsKKwkJCW5vZGUgPSBoZnNfYm5vZGVfZmluZGhhc2godHJlZSwgbmlkeCsrKTsKKwkJCWlmICghbm9kZSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChhdG9taWNfcmVhZCgmbm9kZS0+cmVmY250KSkgeworCQkJCXJlcyA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQloZnNfYm5vZGVfdW5oYXNoKG5vZGUpOworCQkJaGZzX2Jub2RlX2ZyZWUobm9kZSk7CisJCX0gd2hpbGUgKC0taSAmJiBuaWR4IDwgdHJlZS0+bm9kZV9jb3VudCk7CisJCXNwaW5fdW5sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCX0KKwkvL3ByaW50aygicmVsZWFzZXBhZ2U6ICVsdSwleCA9ICVkXG4iLCBwYWdlLT5pbmRleCwgbWFzaywgcmVzKTsKKwlyZXR1cm4gcmVzID8gdHJ5X3RvX2ZyZWVfYnVmZmVycyhwYWdlKSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgaGZzX2dldF9ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgaWJsb2NrLCB1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MsCisJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQoreworCWludCByZXQ7CisKKwlyZXQgPSBoZnNfZ2V0X2Jsb2NrKGlub2RlLCBpYmxvY2ssIGJoX3Jlc3VsdCwgY3JlYXRlKTsKKwlpZiAoIXJldCkKKwkJYmhfcmVzdWx0LT5iX3NpemUgPSAoMSA8PCBpbm9kZS0+aV9ibGtiaXRzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBoZnNfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAorCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZy0+aG9zdDsKKworCXJldHVybiBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpbm9kZS0+aV9zYi0+c19iZGV2LCBpb3YsCisJCQkJICBvZmZzZXQsIG5yX3NlZ3MsIGhmc19nZXRfYmxvY2tzLCBOVUxMKTsKK30KKworc3RhdGljIGludCBoZnNfd3JpdGVwYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCSAgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJcmV0dXJuIG1wYWdlX3dyaXRlcGFnZXMobWFwcGluZywgd2JjLCBoZnNfZ2V0X2Jsb2NrKTsKK30KKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBoZnNfYnRyZWVfYW9wcyA9IHsKKwkucmVhZHBhZ2UJPSBoZnNfcmVhZHBhZ2UsCisJLndyaXRlcGFnZQk9IGhmc193cml0ZXBhZ2UsCisJLnN5bmNfcGFnZQk9IGJsb2NrX3N5bmNfcGFnZSwKKwkucHJlcGFyZV93cml0ZQk9IGhmc19wcmVwYXJlX3dyaXRlLAorCS5jb21taXRfd3JpdGUJPSBnZW5lcmljX2NvbW1pdF93cml0ZSwKKwkuYm1hcAkJPSBoZnNfYm1hcCwKKwkucmVsZWFzZXBhZ2UJPSBoZnNfcmVsZWFzZXBhZ2UsCit9OworCitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGhmc19hb3BzID0geworCS5yZWFkcGFnZQk9IGhmc19yZWFkcGFnZSwKKwkud3JpdGVwYWdlCT0gaGZzX3dyaXRlcGFnZSwKKwkuc3luY19wYWdlCT0gYmxvY2tfc3luY19wYWdlLAorCS5wcmVwYXJlX3dyaXRlCT0gaGZzX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZQk9IGdlbmVyaWNfY29tbWl0X3dyaXRlLAorCS5ibWFwCQk9IGhmc19ibWFwLAorCS5kaXJlY3RfSU8JPSBoZnNfZGlyZWN0X0lPLAorCS53cml0ZXBhZ2VzCT0gaGZzX3dyaXRlcGFnZXMsCit9OworCisvKgorICogaGZzX25ld19pbm9kZQorICovCitzdHJ1Y3QgaW5vZGUgKmhmc19uZXdfaW5vZGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBxc3RyICpuYW1lLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCWlmICghaW5vZGUpCisJCXJldHVybiBOVUxMOworCisJaW5pdF9NVVRFWCgmSEZTX0koaW5vZGUpLT5leHRlbnRzX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZIRlNfSShpbm9kZSktPm9wZW5fZGlyX2xpc3QpOworCWhmc19jYXRfYnVpbGRfa2V5KChidHJlZV9rZXkgKikmSEZTX0koaW5vZGUpLT5jYXRfa2V5LCBkaXItPmlfaW5vLCBuYW1lKTsKKwlpbm9kZS0+aV9pbm8gPSBIRlNfU0Ioc2IpLT5uZXh0X2lkKys7CisJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJaW5vZGUtPmlfbmxpbmsgPSAxOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IEhGU19TQihzYiktPmFsbG9jX2Jsa3N6OworCUhGU19JKGlub2RlKS0+ZmxhZ3MgPSAwOworCUhGU19JKGlub2RlKS0+cnNyY19pbm9kZSA9IE5VTEw7CisJSEZTX0koaW5vZGUpLT5mc19ibG9ja3MgPSAwOworCWlmIChTX0lTRElSKG1vZGUpKSB7CisJCWlub2RlLT5pX3NpemUgPSAyOworCQlIRlNfU0Ioc2IpLT5mb2xkZXJfY291bnQrKzsKKwkJaWYgKGRpci0+aV9pbm8gPT0gSEZTX1JPT1RfQ05JRCkKKwkJCUhGU19TQihzYiktPnJvb3RfZGlycysrOworCQlpbm9kZS0+aV9vcCA9ICZoZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZoZnNfZGlyX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21vZGUgfD0gU19JUldYVUdPOworCQlpbm9kZS0+aV9tb2RlICY9IH5IRlNfU0IoaW5vZGUtPmlfc2IpLT5zX2Rpcl91bWFzazsKKwl9IGVsc2UgaWYgKFNfSVNSRUcobW9kZSkpIHsKKwkJSEZTX0koaW5vZGUpLT5jbHVtcF9ibG9ja3MgPSBIRlNfU0Ioc2IpLT5jbHVtcGFibGtzOworCQlIRlNfU0Ioc2IpLT5maWxlX2NvdW50Kys7CisJCWlmIChkaXItPmlfaW5vID09IEhGU19ST09UX0NOSUQpCisJCQlIRlNfU0Ioc2IpLT5yb290X2ZpbGVzKys7CisJCWlub2RlLT5pX29wID0gJmhmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZoZnNfZmlsZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZoZnNfYW9wczsKKwkJaW5vZGUtPmlfbW9kZSB8PSBTX0lSVUdPfFNfSVhVR087CisJCWlmIChtb2RlICYgU19JV1VTUikKKwkJCWlub2RlLT5pX21vZGUgfD0gU19JV1VHTzsKKwkJaW5vZGUtPmlfbW9kZSAmPSB+SEZTX1NCKGlub2RlLT5pX3NiKS0+c19maWxlX3VtYXNrOworCQlIRlNfSShpbm9kZSktPnBoeXNfc2l6ZSA9IDA7CisJCUhGU19JKGlub2RlKS0+YWxsb2NfYmxvY2tzID0gMDsKKwkJSEZTX0koaW5vZGUpLT5maXJzdF9ibG9ja3MgPSAwOworCQlIRlNfSShpbm9kZSktPmNhY2hlZF9zdGFydCA9IDA7CisJCUhGU19JKGlub2RlKS0+Y2FjaGVkX2Jsb2NrcyA9IDA7CisJCW1lbXNldChIRlNfSShpbm9kZSktPmZpcnN0X2V4dGVudHMsIDAsIHNpemVvZihoZnNfZXh0ZW50X3JlYykpOworCQltZW1zZXQoSEZTX0koaW5vZGUpLT5jYWNoZWRfZXh0ZW50cywgMCwgc2l6ZW9mKGhmc19leHRlbnRfcmVjKSk7CisJfQorCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlzZXRfYml0KEhGU19GTEdfTURCX0RJUlRZLCAmSEZTX1NCKHNiKS0+ZmxhZ3MpOworCXNiLT5zX2RpcnQgPSAxOworCisJcmV0dXJuIGlub2RlOworfQorCit2b2lkIGhmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisKKwlkcHJpbnQoREJHX0lOT0RFLCAiZGVsZXRlX2lub2RlOiAlbHVcbiIsIGlub2RlLT5pX2lubyk7CisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJSEZTX1NCKHNiKS0+Zm9sZGVyX2NvdW50LS07CisJCWlmIChIRlNfSShpbm9kZSktPmNhdF9rZXkuUGFySUQgPT0gY3B1X3RvX2JlMzIoSEZTX1JPT1RfQ05JRCkpCisJCQlIRlNfU0Ioc2IpLT5yb290X2RpcnMtLTsKKwkJc2V0X2JpdChIRlNfRkxHX01EQl9ESVJUWSwgJkhGU19TQihzYiktPmZsYWdzKTsKKwkJc2ItPnNfZGlydCA9IDE7CisJCXJldHVybjsKKwl9CisJSEZTX1NCKHNiKS0+ZmlsZV9jb3VudC0tOworCWlmIChIRlNfSShpbm9kZSktPmNhdF9rZXkuUGFySUQgPT0gY3B1X3RvX2JlMzIoSEZTX1JPT1RfQ05JRCkpCisJCUhGU19TQihzYiktPnJvb3RfZmlsZXMtLTsKKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQlpZiAoIWlub2RlLT5pX25saW5rKSB7CisJCQlpbm9kZS0+aV9zaXplID0gMDsKKwkJCWhmc19maWxlX3RydW5jYXRlKGlub2RlKTsKKwkJfQorCX0KKwlzZXRfYml0KEhGU19GTEdfTURCX0RJUlRZLCAmSEZTX1NCKHNiKS0+ZmxhZ3MpOworCXNiLT5zX2RpcnQgPSAxOworfQorCit2b2lkIGhmc19pbm9kZV9yZWFkX2Zvcmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGhmc19leHRlbnQgKmV4dCwKKwkJCSBfX2JlMzIgX19sb2dfc2l6ZSwgX19iZTMyIHBoeXNfc2l6ZSwgdTMyIGNsdW1wX3NpemUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXUzMiBsb2dfc2l6ZSA9IGJlMzJfdG9fY3B1KF9fbG9nX3NpemUpOworCXUxNiBjb3VudDsKKwlpbnQgaTsKKworCW1lbWNweShIRlNfSShpbm9kZSktPmZpcnN0X2V4dGVudHMsIGV4dCwgc2l6ZW9mKGhmc19leHRlbnRfcmVjKSk7CisJZm9yIChjb3VudCA9IDAsIGkgPSAwOyBpIDwgMzsgaSsrKQorCQljb3VudCArPSBiZTE2X3RvX2NwdShleHRbaV0uY291bnQpOworCUhGU19JKGlub2RlKS0+Zmlyc3RfYmxvY2tzID0gY291bnQ7CisKKwlpbm9kZS0+aV9zaXplID0gSEZTX0koaW5vZGUpLT5waHlzX3NpemUgPSBsb2dfc2l6ZTsKKwlIRlNfSShpbm9kZSktPmZzX2Jsb2NrcyA9IChsb2dfc2l6ZSArIHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCWlub2RlX3NldF9ieXRlcyhpbm9kZSwgSEZTX0koaW5vZGUpLT5mc19ibG9ja3MgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCUhGU19JKGlub2RlKS0+YWxsb2NfYmxvY2tzID0gYmUzMl90b19jcHUocGh5c19zaXplKSAvCisJCQkJICAgICBIRlNfU0Ioc2IpLT5hbGxvY19ibGtzejsKKwlIRlNfSShpbm9kZSktPmNsdW1wX2Jsb2NrcyA9IGNsdW1wX3NpemUgLyBIRlNfU0Ioc2IpLT5hbGxvY19ibGtzejsKKwlpZiAoIUhGU19JKGlub2RlKS0+Y2x1bXBfYmxvY2tzKQorCQlIRlNfSShpbm9kZSktPmNsdW1wX2Jsb2NrcyA9IEhGU19TQihzYiktPmNsdW1wYWJsa3M7Cit9CisKK3N0cnVjdCBoZnNfaWdldF9kYXRhIHsKKwlzdHJ1Y3QgaGZzX2NhdF9rZXkgKmtleTsKKwloZnNfY2F0X3JlYyAqcmVjOworfTsKKworc3RhdGljIGludCBoZnNfdGVzdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBoZnNfaWdldF9kYXRhICppZGF0YSA9IGRhdGE7CisJaGZzX2NhdF9yZWMgKnJlYzsKKworCXJlYyA9IGlkYXRhLT5yZWM7CisJc3dpdGNoIChyZWMtPnR5cGUpIHsKKwljYXNlIEhGU19DRFJfRElSOgorCQlyZXR1cm4gaW5vZGUtPmlfaW5vID09IGJlMzJfdG9fY3B1KHJlYy0+ZGlyLkRpcklEKTsKKwljYXNlIEhGU19DRFJfRklMOgorCQlyZXR1cm4gaW5vZGUtPmlfaW5vID09IGJlMzJfdG9fY3B1KHJlYy0+ZmlsZS5GbE51bSk7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAxOworCX0KK30KKworLyoKKyAqIGhmc19yZWFkX2lub2RlCisgKi8KK3N0YXRpYyBpbnQgaGZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaGZzX2lnZXRfZGF0YSAqaWRhdGEgPSBkYXRhOworCXN0cnVjdCBoZnNfc2JfaW5mbyAqaHNiID0gSEZTX1NCKGlub2RlLT5pX3NiKTsKKwloZnNfY2F0X3JlYyAqcmVjOworCisJSEZTX0koaW5vZGUpLT5mbGFncyA9IDA7CisJSEZTX0koaW5vZGUpLT5yc3JjX2lub2RlID0gTlVMTDsKKwlpbml0X01VVEVYKCZIRlNfSShpbm9kZSktPmV4dGVudHNfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJkhGU19JKGlub2RlKS0+b3Blbl9kaXJfbGlzdCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBpbm9kZSAqLworCWlub2RlLT5pX3VpZCA9IGhzYi0+c191aWQ7CisJaW5vZGUtPmlfZ2lkID0gaHNiLT5zX2dpZDsKKwlpbm9kZS0+aV9ubGluayA9IDE7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IEhGU19TQihpbm9kZS0+aV9zYiktPmFsbG9jX2Jsa3N6OworCisJaWYgKGlkYXRhLT5rZXkpCisJCUhGU19JKGlub2RlKS0+Y2F0X2tleSA9ICppZGF0YS0+a2V5OworCWVsc2UKKwkJSEZTX0koaW5vZGUpLT5mbGFncyB8PSBIRlNfRkxHX1JTUkM7CisJSEZTX0koaW5vZGUpLT50el9zZWNvbmRzd2VzdCA9IHN5c190ei50el9taW51dGVzd2VzdCAqIDYwOworCisJcmVjID0gaWRhdGEtPnJlYzsKKwlzd2l0Y2ggKHJlYy0+dHlwZSkgeworCWNhc2UgSEZTX0NEUl9GSUw6CisJCWlmICghSEZTX0lTX1JTUkMoaW5vZGUpKSB7CisJCQloZnNfaW5vZGVfcmVhZF9mb3JrKGlub2RlLCByZWMtPmZpbGUuRXh0UmVjLCByZWMtPmZpbGUuTGdMZW4sCisJCQkJCSAgICByZWMtPmZpbGUuUHlMZW4sIGJlMTZfdG9fY3B1KHJlYy0+ZmlsZS5DbHBTaXplKSk7CisJCX0gZWxzZSB7CisJCQloZnNfaW5vZGVfcmVhZF9mb3JrKGlub2RlLCByZWMtPmZpbGUuUkV4dFJlYywgcmVjLT5maWxlLlJMZ0xlbiwKKwkJCQkJICAgIHJlYy0+ZmlsZS5SUHlMZW4sIGJlMTZfdG9fY3B1KHJlYy0+ZmlsZS5DbHBTaXplKSk7CisJCX0KKworCQlpbm9kZS0+aV9pbm8gPSBiZTMyX3RvX2NwdShyZWMtPmZpbGUuRmxOdW0pOworCQlpbm9kZS0+aV9tb2RlID0gU19JUlVHTyB8IFNfSVhVR087CisJCWlmICghKHJlYy0+ZmlsZS5GbGFncyAmIEhGU19GSUxfTE9DSykpCisJCQlpbm9kZS0+aV9tb2RlIHw9IFNfSVdVR087CisJCWlub2RlLT5pX21vZGUgJj0gfmhzYi0+c19maWxlX3VtYXNrOworCQlpbm9kZS0+aV9tb2RlIHw9IFNfSUZSRUc7CisJCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9CisJCQkJaGZzX21fdG9fdXRpbWUocmVjLT5maWxlLk1kRGF0KTsKKwkJaW5vZGUtPmlfb3AgPSAmaGZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmhmc19maWxlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmhmc19hb3BzOworCQlicmVhazsKKwljYXNlIEhGU19DRFJfRElSOgorCQlpbm9kZS0+aV9pbm8gPSBiZTMyX3RvX2NwdShyZWMtPmRpci5EaXJJRCk7CisJCWlub2RlLT5pX3NpemUgPSBiZTE2X3RvX2NwdShyZWMtPmRpci5WYWwpICsgMjsKKwkJSEZTX0koaW5vZGUpLT5mc19ibG9ja3MgPSAwOworCQlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiB8IChTX0lSV1hVR08gJiB+aHNiLT5zX2Rpcl91bWFzayk7CisJCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9CisJCQkJaGZzX21fdG9fdXRpbWUocmVjLT5kaXIuTWREYXQpOworCQlpbm9kZS0+aV9vcCA9ICZoZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZoZnNfZGlyX29wZXJhdGlvbnM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBfX2hmc19pZ2V0KCkKKyAqCisgKiBHaXZlbiB0aGUgTURCIGZvciBhIEhGUyBmaWxlc3lzdGVtLCBhICdrZXknIGFuZCBhbiAnZW50cnknIGluCisgKiB0aGUgY2F0YWxvZyBCLXRyZWUgYW5kIHRoZSAndHlwZScgb2YgdGhlIGRlc2lyZWQgZmlsZSByZXR1cm4gdGhlCisgKiBpbm9kZSBmb3IgdGhhdCBmaWxlL2RpcmVjdG9yeSBvciBOVUxMLiAgTm90ZSB0aGF0ICd0eXBlJyBpbmRpY2F0ZXMKKyAqIHdoZXRoZXIgd2Ugd2FudCB0aGUgYWN0dWFsIGZpbGUgb3IgZGlyZWN0b3J5LCBvciB0aGUgY29ycmVzcG9uZGluZworICogbWV0YWRhdGEgKEFwcGxlRG91YmxlIGhlYWRlciBmaWxlIG9yIENBUCBtZXRhZGF0YSBmaWxlKS4KKyAqLworc3RydWN0IGlub2RlICpoZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaGZzX2NhdF9rZXkgKmtleSwgaGZzX2NhdF9yZWMgKnJlYykKK3sKKwlzdHJ1Y3QgaGZzX2lnZXRfZGF0YSBkYXRhID0geyBrZXksIHJlYyB9OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJdTMyIGNuaWQ7CisKKwlzd2l0Y2ggKHJlYy0+dHlwZSkgeworCWNhc2UgSEZTX0NEUl9ESVI6CisJCWNuaWQgPSBiZTMyX3RvX2NwdShyZWMtPmRpci5EaXJJRCk7CisJCWJyZWFrOworCWNhc2UgSEZTX0NEUl9GSUw6CisJCWNuaWQgPSBiZTMyX3RvX2NwdShyZWMtPmZpbGUuRmxOdW0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9CisJaW5vZGUgPSBpZ2V0NV9sb2NrZWQoc2IsIGNuaWQsIGhmc190ZXN0X2lub2RlLCBoZnNfcmVhZF9pbm9kZSwgJmRhdGEpOworCWlmIChpbm9kZSAmJiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykpCisJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCXJldHVybiBpbm9kZTsKK30KKwordm9pZCBoZnNfaW5vZGVfd3JpdGVfZm9yayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaGZzX2V4dGVudCAqZXh0LAorCQkJICBfX2JlMzIgKmxvZ19zaXplLCBfX2JlMzIgKnBoeXNfc2l6ZSkKK3sKKwltZW1jcHkoZXh0LCBIRlNfSShpbm9kZSktPmZpcnN0X2V4dGVudHMsIHNpemVvZihoZnNfZXh0ZW50X3JlYykpOworCisJaWYgKGxvZ19zaXplKQorCQkqbG9nX3NpemUgPSBjcHVfdG9fYmUzMihpbm9kZS0+aV9zaXplKTsKKwlpZiAocGh5c19zaXplKQorCQkqcGh5c19zaXplID0gY3B1X3RvX2JlMzIoSEZTX0koaW5vZGUpLT5hbGxvY19ibG9ja3MgKgorCQkJCQkgSEZTX1NCKGlub2RlLT5pX3NiKS0+YWxsb2NfYmxrc3opOworfQorCitpbnQgaGZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB1bnVzZWQpCit7CisJc3RydWN0IGlub2RlICptYWluX2lub2RlID0gaW5vZGU7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJaGZzX2NhdF9yZWMgcmVjOworCisJZHByaW50KERCR19JTk9ERSwgImhmc193cml0ZV9pbm9kZTogJWx1XG4iLCBpbm9kZS0+aV9pbm8pOworCWhmc19leHRfd3JpdGVfZXh0ZW50KGlub2RlKTsKKworCWlmIChpbm9kZS0+aV9pbm8gPCBIRlNfRklSU1RVU0VSX0NOSUQpIHsKKwkJc3dpdGNoIChpbm9kZS0+aV9pbm8pIHsKKwkJY2FzZSBIRlNfUk9PVF9DTklEOgorCQkJYnJlYWs7CisJCWNhc2UgSEZTX0VYVF9DTklEOgorCQkJaGZzX2J0cmVlX3dyaXRlKEhGU19TQihpbm9kZS0+aV9zYiktPmV4dF90cmVlKTsKKwkJCXJldHVybiAwOworCQljYXNlIEhGU19DQVRfQ05JRDoKKwkJCWhmc19idHJlZV93cml0ZShIRlNfU0IoaW5vZGUtPmlfc2IpLT5jYXRfdHJlZSk7CisJCQlyZXR1cm4gMDsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwlpZiAoSEZTX0lTX1JTUkMoaW5vZGUpKQorCQltYWluX2lub2RlID0gSEZTX0koaW5vZGUpLT5yc3JjX2lub2RlOworCisJaWYgKCFtYWluX2lub2RlLT5pX25saW5rKQorCQlyZXR1cm4gMDsKKworCWlmIChoZnNfZmluZF9pbml0KEhGU19TQihtYWluX2lub2RlLT5pX3NiKS0+Y2F0X3RyZWUsICZmZCkpCisJCS8qIHBhbmljPyAqLworCQlyZXR1cm4gLUVJTzsKKworCWZkLnNlYXJjaF9rZXktPmNhdCA9IEhGU19JKG1haW5faW5vZGUpLT5jYXRfa2V5OworCWlmIChoZnNfYnJlY19maW5kKCZmZCkpCisJCS8qIHBhbmljPyAqLworCQlnb3RvIG91dDsKKworCWlmIChTX0lTRElSKG1haW5faW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKGZkLmVudHJ5bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBoZnNfY2F0X2RpcikpCisJCQkvKiBwYW5pYz8gKi87CisJCWhmc19ibm9kZV9yZWFkKGZkLmJub2RlLCAmcmVjLCBmZC5lbnRyeW9mZnNldCwKKwkJCSAgIHNpemVvZihzdHJ1Y3QgaGZzX2NhdF9kaXIpKTsKKwkJaWYgKHJlYy50eXBlICE9IEhGU19DRFJfRElSIHx8CisJCSAgICBiZTMyX3RvX2NwdShyZWMuZGlyLkRpcklEKSAhPSBpbm9kZS0+aV9pbm8pIHsKKwkJfQorCisJCXJlYy5kaXIuTWREYXQgPSBoZnNfdV90b19tdGltZShpbm9kZS0+aV9tdGltZSk7CisJCXJlYy5kaXIuVmFsID0gY3B1X3RvX2JlMTYoaW5vZGUtPmlfc2l6ZSAtIDIpOworCisJCWhmc19ibm9kZV93cml0ZShmZC5ibm9kZSwgJnJlYywgZmQuZW50cnlvZmZzZXQsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBoZnNfY2F0X2RpcikpOworCX0gZWxzZSBpZiAoSEZTX0lTX1JTUkMoaW5vZGUpKSB7CisJCWhmc19ibm9kZV9yZWFkKGZkLmJub2RlLCAmcmVjLCBmZC5lbnRyeW9mZnNldCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGhmc19jYXRfZmlsZSkpOworCQloZnNfaW5vZGVfd3JpdGVfZm9yayhpbm9kZSwgcmVjLmZpbGUuUkV4dFJlYywKKwkJCQkgICAgICZyZWMuZmlsZS5STGdMZW4sICZyZWMuZmlsZS5SUHlMZW4pOworCQloZnNfYm5vZGVfd3JpdGUoZmQuYm5vZGUsICZyZWMsIGZkLmVudHJ5b2Zmc2V0LAorCQkJCXNpemVvZihzdHJ1Y3QgaGZzX2NhdF9maWxlKSk7CisJfSBlbHNlIHsKKwkJaWYgKGZkLmVudHJ5bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBoZnNfY2F0X2ZpbGUpKQorCQkJLyogcGFuaWM/ICovOworCQloZnNfYm5vZGVfcmVhZChmZC5ibm9kZSwgJnJlYywgZmQuZW50cnlvZmZzZXQsCisJCQkgICBzaXplb2Yoc3RydWN0IGhmc19jYXRfZmlsZSkpOworCQlpZiAocmVjLnR5cGUgIT0gSEZTX0NEUl9GSUwgfHwKKwkJICAgIGJlMzJfdG9fY3B1KHJlYy5maWxlLkZsTnVtKSAhPSBpbm9kZS0+aV9pbm8pIHsKKwkJfQorCisJCWlmIChpbm9kZS0+aV9tb2RlICYgU19JV1VTUikKKwkJCXJlYy5maWxlLkZsYWdzICY9IH5IRlNfRklMX0xPQ0s7CisJCWVsc2UKKwkJCXJlYy5maWxlLkZsYWdzIHw9IEhGU19GSUxfTE9DSzsKKwkJaGZzX2lub2RlX3dyaXRlX2ZvcmsoaW5vZGUsIHJlYy5maWxlLkV4dFJlYywgJnJlYy5maWxlLkxnTGVuLCAmcmVjLmZpbGUuUHlMZW4pOworCQlyZWMuZmlsZS5NZERhdCA9IGhmc191X3RvX210aW1lKGlub2RlLT5pX210aW1lKTsKKworCQloZnNfYm5vZGVfd3JpdGUoZmQuYm5vZGUsICZyZWMsIGZkLmVudHJ5b2Zmc2V0LAorCQkJICAgIHNpemVvZihzdHJ1Y3QgaGZzX2NhdF9maWxlKSk7CisJfQorb3V0OgorCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmhmc19maWxlX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCWhmc19jYXRfcmVjIHJlYzsKKwlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBmZDsKKwlpbnQgcmVzOworCisJaWYgKEhGU19JU19SU1JDKGRpcikgfHwgc3RyY21wKGRlbnRyeS0+ZF9uYW1lLm5hbWUsICJyc3JjIikpCisJCWdvdG8gb3V0OworCisJaW5vZGUgPSBIRlNfSShkaXIpLT5yc3JjX2lub2RlOworCWlmIChpbm9kZSkKKwkJZ290byBvdXQ7CisKKwlpbm9kZSA9IG5ld19pbm9kZShkaXItPmlfc2IpOworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaGZzX2ZpbmRfaW5pdChIRlNfU0IoZGlyLT5pX3NiKS0+Y2F0X3RyZWUsICZmZCk7CisJZmQuc2VhcmNoX2tleS0+Y2F0ID0gSEZTX0koZGlyKS0+Y2F0X2tleTsKKwlyZXMgPSBoZnNfYnJlY19yZWFkKCZmZCwgJnJlYywgc2l6ZW9mKHJlYykpOworCWlmICghcmVzKSB7CisJCXN0cnVjdCBoZnNfaWdldF9kYXRhIGlkYXRhID0geyBOVUxMLCAmcmVjIH07CisJCWhmc19yZWFkX2lub2RlKGlub2RlLCAmaWRhdGEpOworCX0KKwloZnNfZmluZF9leGl0KCZmZCk7CisJaWYgKHJlcykgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIEVSUl9QVFIocmVzKTsKKwl9CisJSEZTX0koaW5vZGUpLT5yc3JjX2lub2RlID0gZGlyOworCUhGU19JKGRpciktPnJzcmNfaW5vZGUgPSBpbm9kZTsKKwlpZ3JhYihkaXIpOworCWhsaXN0X2FkZF9oZWFkKCZpbm9kZS0+aV9oYXNoLCAmSEZTX1NCKGRpci0+aV9zYiktPnJzcmNfaW5vZGVzKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKK291dDoKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBoZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoSEZTX0lTX1JTUkMoaW5vZGUpICYmIEhGU19JKGlub2RlKS0+cnNyY19pbm9kZSkgeworCQlIRlNfSShIRlNfSShpbm9kZSktPnJzcmNfaW5vZGUpLT5yc3JjX2lub2RlID0gTlVMTDsKKwkJaXB1dChIRlNfSShpbm9kZSktPnJzcmNfaW5vZGUpOworCX0KK30KKworc3RhdGljIGludCBoZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywKKwkJCSAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgbWFzayAmIE1BWV9FWEVDKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBOVUxMKTsKK30KKworc3RhdGljIGludCBoZnNfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChIRlNfSVNfUlNSQyhpbm9kZSkpCisJCWlub2RlID0gSEZTX0koaW5vZGUpLT5yc3JjX2lub2RlOworCWlmIChhdG9taWNfcmVhZCgmZmlsZS0+Zl9jb3VudCkgIT0gMSkKKwkJcmV0dXJuIDA7CisJYXRvbWljX2luYygmSEZTX0koaW5vZGUpLT5vcGVuY250KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZnNfZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8vc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCisJaWYgKEhGU19JU19SU1JDKGlub2RlKSkKKwkJaW5vZGUgPSBIRlNfSShpbm9kZSktPnJzcmNfaW5vZGU7CisJaWYgKGF0b21pY19yZWFkKCZmaWxlLT5mX2NvdW50KSAhPSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmSEZTX0koaW5vZGUpLT5vcGVuY250KSkgeworCQlkb3duKCZpbm9kZS0+aV9zZW0pOworCQloZnNfZmlsZV90cnVuY2F0ZShpbm9kZSk7CisJCS8vaWYgKGlub2RlLT5pX2ZsYWdzICYgU19ERUFEKSB7CisJCS8vCWhmc19kZWxldGVfY2F0KGlub2RlLT5pX2lubywgSEZTUExVU19TQihzYikuaGlkZGVuX2RpciwgTlVMTCk7CisJCS8vCWhmc19kZWxldGVfaW5vZGUoaW5vZGUpOworCQkvL30KKwkJdXAoJmlub2RlLT5pX3NlbSk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogaGZzX25vdGlmeV9jaGFuZ2UoKQorICoKKyAqIEJhc2VkIHZlcnkgY2xvc2VseSBvbiBmcy9tc2Rvcy9pbm9kZS5jIGJ5IFdlcm5lciBBbG1lc2JlcmdlcgorICoKKyAqIFRoaXMgaXMgdGhlIG5vdGlmeV9jaGFuZ2UoKSBmaWVsZCBpbiB0aGUgc3VwZXJfb3BlcmF0aW9ucyBzdHJ1Y3R1cmUKKyAqIGZvciBIRlMgZmlsZSBzeXN0ZW1zLiAgVGhlIHB1cnBvc2UgaXMgdG8gdGFrZSB0aGF0IGNoYW5nZXMgbWFkZSB0bworICogYW4gaW5vZGUgYW5kIGFwcGx5IHRoZW4gaW4gYSBmaWxlc3lzdGVtLWRlcGVuZGVudCBtYW5uZXIuICBJbiB0aGlzCisgKiBjYXNlIHRoZSBwcm9jZXNzIGhhcyBhIGZldyBvZiB0YXNrcyB0byBkbzoKKyAqICAxKSBwcmV2ZW50IGNoYW5nZXMgdG8gdGhlIGlfdWlkIGFuZCBpX2dpZCBmaWVsZHMuCisgKiAgMikgbWFwIGZpbGUgcGVybWlzc2lvbnMgdG8gdGhlIGNsb3Nlc3QgYWxsb3dhYmxlIHBlcm1pc3Npb25zCisgKiAgMykgU2luY2UgbXVsdGlwbGUgTGludXggZmlsZXMgY2FuIHNoYXJlIHRoZSBzYW1lIG9uLWRpc2sgaW5vZGUgdW5kZXIKKyAqICAgICBIRlMgKGZvciBpbnN0YW5jZSB0aGUgZGF0YSBhbmQgcmVzb3VyY2UgZm9ya3Mgb2YgYSBmaWxlKSBhIGNoYW5nZQorICogICAgIHRvIHBlcm1pc3Npb25zIG11c3QgYmUgYXBwbGllZCB0byBhbGwgb3RoZXIgaW4tY29yZSBpbm9kZXMgd2hpY2gKKyAqICAgICBjb3JyZXNwb25kIHRvIHRoZSBzYW1lIEhGUyBmaWxlLgorICovCisKK2ludCBoZnNfaW5vZGVfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqIGF0dHIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaGZzX3NiX2luZm8gKmhzYiA9IEhGU19TQihpbm9kZS0+aV9zYik7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGF0dHIpOyAvKiBiYXNpYyBwZXJtaXNzaW9uIGNoZWNrcyAqLworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJLyogbm8gdWlnL2dpZCBjaGFuZ2VzIGFuZCBsaW1pdCB3aGljaCBtb2RlIGJpdHMgY2FuIGJlIHNldCAqLworCWlmICgoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQpICYmCisJICAgICAoYXR0ci0+aWFfdWlkICE9IGhzYi0+c191aWQpKSB8fAorCSAgICAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpICYmCisJICAgICAoYXR0ci0+aWFfZ2lkICE9IGhzYi0+c19naWQpKSB8fAorCSAgICAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSAmJgorCSAgICAgKChTX0lTRElSKGlub2RlLT5pX21vZGUpICYmCisJICAgICAgIChhdHRyLT5pYV9tb2RlICE9IGlub2RlLT5pX21vZGUpKSB8fAorCSAgICAgIChhdHRyLT5pYV9tb2RlICYgfkhGU19WQUxJRF9NT0RFX0JJVFMpKSkpIHsKKwkJcmV0dXJuIGhzYi0+c19xdWlldCA/IDAgOiBlcnJvcjsKKwl9CisKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpIHsKKwkJLyogT25seSB0aGUgJ3cnIGJpdHMgY2FuIGV2ZXIgY2hhbmdlIGFuZCBvbmx5IGFsbCB0b2dldGhlci4gKi8KKwkJaWYgKGF0dHItPmlhX21vZGUgJiBTX0lXVVNSKQorCQkJYXR0ci0+aWFfbW9kZSA9IGlub2RlLT5pX21vZGUgfCBTX0lXVUdPOworCQllbHNlCisJCQlhdHRyLT5pYV9tb2RlID0gaW5vZGUtPmlfbW9kZSAmIH5TX0lXVUdPOworCQlhdHRyLT5pYV9tb2RlICY9IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgPyB+aHNiLT5zX2Rpcl91bWFzazogfmhzYi0+c19maWxlX3VtYXNrOworCX0KKwllcnJvciA9IGlub2RlX3NldGF0dHIoaW5vZGUsIGF0dHIpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaGZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19maWxlX3JlYWQsCisJLndyaXRlCQk9IGdlbmVyaWNfZmlsZV93cml0ZSwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCisJLmZzeW5jCQk9IGZpbGVfZnN5bmMsCisJLm9wZW4JCT0gaGZzX2ZpbGVfb3BlbiwKKwkucmVsZWFzZQk9IGhmc19maWxlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaGZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IGhmc19maWxlX2xvb2t1cCwKKwkudHJ1bmNhdGUJPSBoZnNfZmlsZV90cnVuY2F0ZSwKKwkuc2V0YXR0cgk9IGhmc19pbm9kZV9zZXRhdHRyLAorCS5wZXJtaXNzaW9uCT0gaGZzX3Blcm1pc3Npb24sCisJLnNldHhhdHRyCT0gaGZzX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGhmc19nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gaGZzX2xpc3R4YXR0ciwKK307CmRpZmYgLS1naXQgYS9mcy9oZnMvbWRiLmMgYi9mcy9oZnMvbWRiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmYjY0MAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9tZGIuYwpAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAqICBsaW51eC9mcy9oZnMvbWRiLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyAgUGF1bCBILiBIYXJncm92ZQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIHJlYWRpbmcvd3JpdGluZyB0aGUgTURCLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisKKyNpbmNsdWRlICJoZnNfZnMuaCIKKyNpbmNsdWRlICJidHJlZS5oIgorCisvKj09PT09PT09PT09PT09PT0gRmlsZS1sb2NhbCBkYXRhIHR5cGVzID09PT09PT09PT09PT09PT0qLworCisvKgorICogVGhlIEhGUyBNYXN0ZXIgRGlyZWN0b3J5IEJsb2NrIChNREIpLgorICoKKyAqIEFsc28ga25vd24gYXMgdGhlIFZvbHVtZSBJbmZvcm1hdGlvbiBCbG9jayAoVklCKSwgdGhpcyBzdHJ1Y3R1cmUgaXMKKyAqIHRoZSBIRlMgZXF1aXZhbGVudCBvZiBhIHN1cGVyYmxvY2suCisgKgorICogUmVmZXJlbmNlOiBfSW5zaWRlIE1hY2ludG9zaDogRmlsZXNfIHBhZ2VzIDItNTkgdGhyb3VnaCAyLTYyCisgKgorICogbW9kaWZpZWQgZm9yIEhGUyBFeHRlbmRlZAorICovCisKK3N0YXRpYyBpbnQgaGZzX2dldF9sYXN0X3Nlc3Npb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQlzZWN0b3JfdCAqc3RhcnQsIHNlY3Rvcl90ICpzaXplKQoreworCXN0cnVjdCBjZHJvbV9tdWx0aXNlc3Npb24gbXNfaW5mbzsKKwlzdHJ1Y3QgY2Ryb21fdG9jZW50cnkgdGU7CisJaW50IHJlczsKKworCS8qIGRlZmF1bHQgdmFsdWVzICovCisJKnN0YXJ0ID0gMDsKKwkqc2l6ZSA9IHNiLT5zX2JkZXYtPmJkX2lub2RlLT5pX3NpemUgPj4gOTsKKworCWlmIChIRlNfU0Ioc2IpLT5zZXNzaW9uID49IDApIHsKKwkJdGUuY2R0ZV90cmFjayA9IEhGU19TQihzYiktPnNlc3Npb247CisJCXRlLmNkdGVfZm9ybWF0ID0gQ0RST01fTEJBOworCQlyZXMgPSBpb2N0bF9ieV9iZGV2KHNiLT5zX2JkZXYsIENEUk9NUkVBRFRPQ0VOVFJZLCAodW5zaWduZWQgbG9uZykmdGUpOworCQlpZiAoIXJlcyAmJiAodGUuY2R0ZV9jdHJsICYgQ0RST01fREFUQV9UUkFDSykgPT0gNCkgeworCQkJKnN0YXJ0ID0gKHNlY3Rvcl90KXRlLmNkdGVfYWRkci5sYmEgPDwgMjsKKwkJCXJldHVybiAwOworCQl9CisJCXByaW50ayhLRVJOX0VSUiAiSEZTOiBJbnZhbGlkIHNlc3Npb24gbnVtYmVyIG9yIHR5cGUgb2YgdHJhY2tcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbXNfaW5mby5hZGRyX2Zvcm1hdCA9IENEUk9NX0xCQTsKKwlyZXMgPSBpb2N0bF9ieV9iZGV2KHNiLT5zX2JkZXYsIENEUk9NTVVMVElTRVNTSU9OLCAodW5zaWduZWQgbG9uZykmbXNfaW5mbyk7CisJaWYgKCFyZXMgJiYgbXNfaW5mby54YV9mbGFnKQorCQkqc3RhcnQgPSAoc2VjdG9yX3QpbXNfaW5mby5hZGRyLmxiYSA8PCAyOworCXJldHVybiAwOworfQorCisvKgorICogaGZzX21kYl9nZXQoKQorICoKKyAqIEJ1aWxkIHRoZSBpbi1jb3JlIE1EQiBmb3IgYSBmaWxlc3lzdGVtLCBpbmNsdWRpbmcKKyAqIHRoZSBCLXRyZWVzIGFuZCB0aGUgdm9sdW1lIGJpdG1hcC4KKyAqLworaW50IGhmc19tZGJfZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgaGZzX21kYiAqbWRiLCAqbWRiMjsKKwl1bnNpZ25lZCBpbnQgYmxvY2s7CisJY2hhciAqcHRyOworCWludCBvZmYyLCBsZW4sIHNpemUsIHNlY3Q7CisJc2VjdG9yX3QgcGFydF9zdGFydCwgcGFydF9zaXplOworCWxvZmZfdCBvZmY7CisJX19iZTE2IGF0dHJpYjsKKworCS8qIHNldCB0aGUgZGV2aWNlIGRyaXZlciB0byA1MTItYnl0ZSBibG9ja3MgKi8KKwlzaXplID0gc2JfbWluX2Jsb2Nrc2l6ZShzYiwgSEZTX1NFQ1RPUl9TSVpFKTsKKwlpZiAoIXNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGhmc19nZXRfbGFzdF9zZXNzaW9uKHNiLCAmcGFydF9zdGFydCwgJnBhcnRfc2l6ZSkpCisJCXJldHVybiAtRUlOVkFMOworCXdoaWxlICgxKSB7CisJCS8qIFNlZSBpZiB0aGlzIGlzIGFuIEhGUyBmaWxlc3lzdGVtICovCisJCWJoID0gc2JfYnJlYWQ1MTIoc2IsIHBhcnRfc3RhcnQgKyBIRlNfTURCX0JMSywgbWRiKTsKKwkJaWYgKCFiaCkKKwkJCWdvdG8gb3V0OworCisJCWlmIChtZGItPmRyU2lnV29yZCA9PSBjcHVfdG9fYmUxNihIRlNfU1VQRVJfTUFHSUMpKQorCQkJYnJlYWs7CisJCWJyZWxzZShiaCk7CisKKwkJLyogY2hlY2sgZm9yIGEgcGFydGl0aW9uIGJsb2NrCisJCSAqIChzaG91bGQgZG8gdGhpcyBvbmx5IGZvciBjZHJvbS9sb29wIHRob3VnaCkKKwkJICovCisJCWlmIChoZnNfcGFydF9maW5kKHNiLCAmcGFydF9zdGFydCwgJnBhcnRfc2l6ZSkpCisJCQlnb3RvIG91dDsKKwl9CisKKwlIRlNfU0Ioc2IpLT5hbGxvY19ibGtzeiA9IHNpemUgPSBiZTMyX3RvX2NwdShtZGItPmRyQWxCbGtTaXopOworCWlmICghc2l6ZSB8fCAoc2l6ZSAmIChIRlNfU0VDVE9SX1NJWkUgLSAxKSkpIHsKKwkJaGZzX3dhcm4oImhmc19mczogYmFkIGFsbG9jYXRpb24gYmxvY2sgc2l6ZSAlZFxuIiwgc2l6ZSk7CisJCWdvdG8gb3V0X2JoOworCX0KKworCXNpemUgPSBtaW4oSEZTX1NCKHNiKS0+YWxsb2NfYmxrc3osICh1MzIpUEFHRV9TSVpFKTsKKwkvKiBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA1MTIgKi8KKwl3aGlsZSAoc2l6ZSAmIChzaXplIC0gMSkpCisJCXNpemUgLT0gSEZTX1NFQ1RPUl9TSVpFOworCXNlY3QgPSBiZTE2X3RvX2NwdShtZGItPmRyQWxCbFN0KSArIHBhcnRfc3RhcnQ7CisJLyogYWxpZ24gYmxvY2sgc2l6ZSB0byBmaXJzdCBzZWN0b3IgKi8KKwl3aGlsZSAoc2VjdCAmICgoc2l6ZSAtIDEpID4+IEhGU19TRUNUT1JfU0laRV9CSVRTKSkKKwkJc2l6ZSA+Pj0gMTsKKwkvKiBhbGlnbiBibG9jayBzaXplIHRvIHdlaXJkIGFsbG9jIHNpemUgKi8KKwl3aGlsZSAoSEZTX1NCKHNiKS0+YWxsb2NfYmxrc3ogJiAoc2l6ZSAtIDEpKQorCQlzaXplID4+PSAxOworCWJyZWxzZShiaCk7CisJaWYgKCFzYl9zZXRfYmxvY2tzaXplKHNiLCBzaXplKSkgeworCQlwcmludGsoImhmc19mczogdW5hYmxlIHRvIHNldCBibG9ja3NpemUgdG8gJXVcbiIsIHNpemUpOworCQlnb3RvIG91dDsKKwl9CisKKwliaCA9IHNiX2JyZWFkNTEyKHNiLCBwYXJ0X3N0YXJ0ICsgSEZTX01EQl9CTEssIG1kYik7CisJaWYgKCFiaCkKKwkJZ290byBvdXQ7CisJaWYgKG1kYi0+ZHJTaWdXb3JkICE9IGNwdV90b19iZTE2KEhGU19TVVBFUl9NQUdJQykpCisJCWdvdG8gb3V0X2JoOworCisJSEZTX1NCKHNiKS0+bWRiX2JoID0gYmg7CisJSEZTX1NCKHNiKS0+bWRiID0gbWRiOworCisJLyogVGhlc2UgcGFyYW1ldGVycyBhcmUgcmVhZCBmcm9tIHRoZSBNREIsIGFuZCBuZXZlciB3cml0dGVuICovCisJSEZTX1NCKHNiKS0+cGFydF9zdGFydCA9IHBhcnRfc3RhcnQ7CisJSEZTX1NCKHNiKS0+ZnNfYWJsb2NrcyA9IGJlMTZfdG9fY3B1KG1kYi0+ZHJObUFsQmxrcyk7CisJSEZTX1NCKHNiKS0+ZnNfZGl2ID0gSEZTX1NCKHNiKS0+YWxsb2NfYmxrc3ogPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJSEZTX1NCKHNiKS0+Y2x1bXBhYmxrcyA9IGJlMzJfdG9fY3B1KG1kYi0+ZHJDbHBTaXopIC8KKwkJCQkgSEZTX1NCKHNiKS0+YWxsb2NfYmxrc3o7CisJaWYgKCFIRlNfU0Ioc2IpLT5jbHVtcGFibGtzKQorCQlIRlNfU0Ioc2IpLT5jbHVtcGFibGtzID0gMTsKKwlIRlNfU0Ioc2IpLT5mc19zdGFydCA9IChiZTE2X3RvX2NwdShtZGItPmRyQWxCbFN0KSArIHBhcnRfc3RhcnQpID4+CisJCQkgICAgICAgKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gSEZTX1NFQ1RPUl9TSVpFX0JJVFMpOworCisJLyogVGhlc2UgcGFyYW1ldGVycyBhcmUgcmVhZCBmcm9tIGFuZCB3cml0dGVuIHRvIHRoZSBNREIgKi8KKwlIRlNfU0Ioc2IpLT5mcmVlX2FibG9ja3MgPSBiZTE2X3RvX2NwdShtZGItPmRyRnJlZUJrcyk7CisJSEZTX1NCKHNiKS0+bmV4dF9pZCA9IGJlMzJfdG9fY3B1KG1kYi0+ZHJOeHRDTklEKTsKKwlIRlNfU0Ioc2IpLT5yb290X2ZpbGVzID0gYmUxNl90b19jcHUobWRiLT5kck5tRmxzKTsKKwlIRlNfU0Ioc2IpLT5yb290X2RpcnMgPSBiZTE2X3RvX2NwdShtZGItPmRyTm1SdERpcnMpOworCUhGU19TQihzYiktPmZpbGVfY291bnQgPSBiZTMyX3RvX2NwdShtZGItPmRyRmlsQ250KTsKKwlIRlNfU0Ioc2IpLT5mb2xkZXJfY291bnQgPSBiZTMyX3RvX2NwdShtZGItPmRyRGlyQ250KTsKKworCS8qIFRSWSB0byBnZXQgdGhlIGFsdGVybmF0ZSAoYmFja3VwKSBNREIuICovCisJc2VjdCA9IHBhcnRfc3RhcnQgKyBwYXJ0X3NpemUgLSAyOworCWJoID0gc2JfYnJlYWQ1MTIoc2IsIHNlY3QsIG1kYjIpOworCWlmIChiaCkgeworCQlpZiAobWRiMi0+ZHJTaWdXb3JkID09IGNwdV90b19iZTE2KEhGU19TVVBFUl9NQUdJQykpIHsKKwkJCUhGU19TQihzYiktPmFsdF9tZGJfYmggPSBiaDsKKwkJCUhGU19TQihzYiktPmFsdF9tZGIgPSBtZGIyOworCQl9IGVsc2UKKwkJCWJyZWxzZShiaCk7CisJfQorCisJaWYgKCFIRlNfU0Ioc2IpLT5hbHRfbWRiKSB7CisJCWhmc193YXJuKCJoZnNfZnM6IHVuYWJsZSB0byBsb2NhdGUgYWx0ZXJuYXRlIE1EQlxuIik7CisJCWhmc193YXJuKCJoZnNfZnM6IGNvbnRpbnVpbmcgd2l0aG91dCBhbiBhbHRlcm5hdGUgTURCXG4iKTsKKwl9CisKKwlIRlNfU0Ioc2IpLT5iaXRtYXAgPSAoX19iZTMyICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBQQUdFX1NJWkUgPCA4MTkyID8gMSA6IDApOworCWlmICghSEZTX1NCKHNiKS0+Yml0bWFwKQorCQlnb3RvIG91dDsKKworCS8qIHJlYWQgaW4gdGhlIGJpdG1hcCAqLworCWJsb2NrID0gYmUxNl90b19jcHUobWRiLT5kclZCTVN0KSArIHBhcnRfc3RhcnQ7CisJb2ZmID0gKGxvZmZfdClibG9jayA8PCBIRlNfU0VDVE9SX1NJWkVfQklUUzsKKwlzaXplID0gKEhGU19TQihzYiktPmZzX2FibG9ja3MgKyA4KSAvIDg7CisJcHRyID0gKHU4ICopSEZTX1NCKHNiKS0+Yml0bWFwOworCXdoaWxlIChzaXplKSB7CisJCWJoID0gc2JfYnJlYWQoc2IsIG9mZiA+PiBzYi0+c19ibG9ja3NpemVfYml0cyk7CisJCWlmICghYmgpIHsKKwkJCWhmc193YXJuKCJoZnNfZnM6IHVuYWJsZSB0byByZWFkIHZvbHVtZSBiaXRtYXBcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJb2ZmMiA9IG9mZiAmIChzYi0+c19ibG9ja3NpemUgLSAxKTsKKwkJbGVuID0gbWluKChpbnQpc2ItPnNfYmxvY2tzaXplIC0gb2ZmMiwgc2l6ZSk7CisJCW1lbWNweShwdHIsIGJoLT5iX2RhdGEgKyBvZmYyLCBsZW4pOworCQlicmVsc2UoYmgpOworCQlwdHIgKz0gbGVuOworCQlvZmYgKz0gbGVuOworCQlzaXplIC09IGxlbjsKKwl9CisKKwlIRlNfU0Ioc2IpLT5leHRfdHJlZSA9IGhmc19idHJlZV9vcGVuKHNiLCBIRlNfRVhUX0NOSUQsIGhmc19leHRfa2V5Y21wKTsKKwlpZiAoIUhGU19TQihzYiktPmV4dF90cmVlKSB7CisJCWhmc193YXJuKCJoZnNfZnM6IHVuYWJsZSB0byBvcGVuIGV4dGVudCB0cmVlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCUhGU19TQihzYiktPmNhdF90cmVlID0gaGZzX2J0cmVlX29wZW4oc2IsIEhGU19DQVRfQ05JRCwgaGZzX2NhdF9rZXljbXApOworCWlmICghSEZTX1NCKHNiKS0+Y2F0X3RyZWUpIHsKKwkJaGZzX3dhcm4oImhmc19mczogdW5hYmxlIHRvIG9wZW4gY2F0YWxvZyB0cmVlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJYXR0cmliID0gbWRiLT5kckF0cmI7CisJaWYgKCEoYXR0cmliICYgY3B1X3RvX2JlMTYoSEZTX1NCX0FUVFJJQl9VTk1OVCkpKSB7CisJCWhmc193YXJuKCJIRlMtZnMgd2FybmluZzogRmlsZXN5c3RlbSB3YXMgbm90IGNsZWFubHkgdW5tb3VudGVkLCAiCisJCQkgInJ1bm5pbmcgZnNjay5oZnMgaXMgcmVjb21tZW5kZWQuICBtb3VudGluZyByZWFkLW9ubHkuXG4iKTsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCX0KKwlpZiAoKGF0dHJpYiAmIGNwdV90b19iZTE2KEhGU19TQl9BVFRSSUJfU0xPQ0spKSkgeworCQloZnNfd2FybigiSEZTLWZzOiBGaWxlc3lzdGVtIGlzIG1hcmtlZCBsb2NrZWQsIG1vdW50aW5nIHJlYWQtb25seS5cbiIpOworCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJfQorCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkvKiBNYXJrIHRoZSB2b2x1bWUgdW5jbGVhbmx5IHVubW91bnRlZCBpbiBjYXNlIHdlIGNyYXNoICovCisJCWF0dHJpYiAmPSBjcHVfdG9fYmUxNih+SEZTX1NCX0FUVFJJQl9VTk1OVCk7CisJCWF0dHJpYiB8PSBjcHVfdG9fYmUxNihIRlNfU0JfQVRUUklCX0lOQ05TVE5UKTsKKwkJbWRiLT5kckF0cmIgPSBhdHRyaWI7CisJCW1kYi0+ZHJXckNudCA9IGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KG1kYi0+ZHJXckNudCkgKyAxKTsKKwkJbWRiLT5kckxzTW9kID0gaGZzX210aW1lKCk7CisKKwkJbWFya19idWZmZXJfZGlydHkoSEZTX1NCKHNiKS0+bWRiX2JoKTsKKwkJaGZzX2J1ZmZlcl9zeW5jKEhGU19TQihzYiktPm1kYl9iaCk7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9iaDoKKwlicmVsc2UoYmgpOworb3V0OgorCWhmc19tZGJfcHV0KHNiKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIGhmc19tZGJfY29tbWl0KCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyB1cGRhdGVzIHRoZSBNREIgb24gZGlzayAobG9vayBhbHNvIGF0IGhmc193cml0ZV9zdXBlcigpKS4KKyAqICAgSXQgZG9lcyBub3QgY2hlY2ssIGlmIHRoZSBzdXBlcmJsb2NrIGhhcyBiZWVuIG1vZGlmaWVkLCBvcgorICogICBpZiB0aGUgZmlsZXN5c3RlbSBoYXMgYmVlbiBtb3VudGVkIHJlYWQtb25seS4gSXQgaXMgbWFpbmx5CisgKiAgIGNhbGxlZCBieSBoZnNfd3JpdGVfc3VwZXIoKSBhbmQgaGZzX2J0cmVlX2V4dGVuZCgpLgorICogSW5wdXQgVmFyaWFibGUocyk6CisgKiAgIHN0cnVjdCBoZnNfbWRiICptZGI6IFBvaW50ZXIgdG8gdGhlIGhmcyBNREIKKyAqICAgaW50IGJhY2t1cDsKKyAqIE91dHB1dCBWYXJpYWJsZShzKToKKyAqICAgTk9ORQorICogUmV0dXJuczoKKyAqICAgdm9pZAorICogUHJlY29uZGl0aW9uczoKKyAqICAgJ21kYicgcG9pbnRzIHRvIGEgInZhbGlkIiAoc3RydWN0IGhmc19tZGIpLgorICogUG9zdGNvbmRpdGlvbnM6CisgKiAgIFRoZSBIRlMgTURCIGFuZCBvbiBkaXNrIHdpbGwgYmUgdXBkYXRlZCwgYnkgY29weWluZyB0aGUgcG9zc2libHkKKyAqICAgbW9kaWZpZWQgZmllbGRzIGZyb20gdGhlIGluIG1lbW9yeSBNREIgKGluIG5hdGl2ZSBieXRlIG9yZGVyKSB0bworICogICB0aGUgZGlzayBibG9jayBidWZmZXIuCisgKiAgIElmICdiYWNrdXAnIGlzIG5vbi16ZXJvIHRoZW4gdGhlIGFsdGVybmF0ZSBNREIgaXMgYWxzbyB3cml0dGVuCisgKiAgIGFuZCB0aGUgZnVuY3Rpb24gZG9lc24ndCByZXR1cm4gdW50aWwgaXQgaXMgYWN0dWFsbHkgb24gZGlzay4KKyAqLwordm9pZCBoZnNfbWRiX2NvbW1pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBoZnNfbWRiICptZGIgPSBIRlNfU0Ioc2IpLT5tZGI7CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEhGU19GTEdfTURCX0RJUlRZLCAmSEZTX1NCKHNiKS0+ZmxhZ3MpKSB7CisJCS8qIFRoZXNlIHBhcmFtZXRlcnMgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCwgc28gd3JpdGUgdGhlbSBiYWNrICovCisJCW1kYi0+ZHJMc01vZCA9IGhmc19tdGltZSgpOworCQltZGItPmRyRnJlZUJrcyA9IGNwdV90b19iZTE2KEhGU19TQihzYiktPmZyZWVfYWJsb2Nrcyk7CisJCW1kYi0+ZHJOeHRDTklEID0gY3B1X3RvX2JlMzIoSEZTX1NCKHNiKS0+bmV4dF9pZCk7CisJCW1kYi0+ZHJObUZscyA9IGNwdV90b19iZTE2KEhGU19TQihzYiktPnJvb3RfZmlsZXMpOworCQltZGItPmRyTm1SdERpcnMgPSBjcHVfdG9fYmUxNihIRlNfU0Ioc2IpLT5yb290X2RpcnMpOworCQltZGItPmRyRmlsQ250ID0gY3B1X3RvX2JlMzIoSEZTX1NCKHNiKS0+ZmlsZV9jb3VudCk7CisJCW1kYi0+ZHJEaXJDbnQgPSBjcHVfdG9fYmUzMihIRlNfU0Ioc2IpLT5mb2xkZXJfY291bnQpOworCisJCS8qIHdyaXRlIE1EQiB0byBkaXNrICovCisJCW1hcmtfYnVmZmVyX2RpcnR5KEhGU19TQihzYiktPm1kYl9iaCk7CisJfQorCisJLyogd3JpdGUgdGhlIGJhY2t1cCBNREIsIG5vdCByZXR1cm5pbmcgdW50aWwgaXQgaXMgd3JpdHRlbi4KKwkgKiB3ZSBvbmx5IGRvIHRoaXMgd2hlbiBlaXRoZXIgdGhlIGNhdGFsb2cgb3IgZXh0ZW50cyBvdmVyZmxvdworCSAqIGZpbGVzIGdyb3cuICovCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChIRlNfRkxHX0FMVF9NREJfRElSVFksICZIRlNfU0Ioc2IpLT5mbGFncykgJiYKKwkgICAgSEZTX1NCKHNiKS0+YWx0X21kYikgeworCQloZnNfaW5vZGVfd3JpdGVfZm9yayhIRlNfU0Ioc2IpLT5leHRfdHJlZS0+aW5vZGUsIG1kYi0+ZHJYVEV4dFJlYywKKwkJCQkgICAgICZtZGItPmRyWFRGbFNpemUsIE5VTEwpOworCQloZnNfaW5vZGVfd3JpdGVfZm9yayhIRlNfU0Ioc2IpLT5jYXRfdHJlZS0+aW5vZGUsIG1kYi0+ZHJDVEV4dFJlYywKKwkJCQkgICAgICZtZGItPmRyQ1RGbFNpemUsIE5VTEwpOworCQltZW1jcHkoSEZTX1NCKHNiKS0+YWx0X21kYiwgSEZTX1NCKHNiKS0+bWRiLCBIRlNfU0VDVE9SX1NJWkUpOworCQlIRlNfU0Ioc2IpLT5hbHRfbWRiLT5kckF0cmIgfD0gY3B1X3RvX2JlMTYoSEZTX1NCX0FUVFJJQl9VTk1OVCk7CisJCUhGU19TQihzYiktPmFsdF9tZGItPmRyQXRyYiAmPSBjcHVfdG9fYmUxNih+SEZTX1NCX0FUVFJJQl9JTkNOU1ROVCk7CisJCW1hcmtfYnVmZmVyX2RpcnR5KEhGU19TQihzYiktPmFsdF9tZGJfYmgpOworCQloZnNfYnVmZmVyX3N5bmMoSEZTX1NCKHNiKS0+YWx0X21kYl9iaCk7CisJfQorCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChIRlNfRkxHX0JJVE1BUF9ESVJUWSwgJkhGU19TQihzYiktPmZsYWdzKSkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQlzZWN0b3JfdCBibG9jazsKKwkJY2hhciAqcHRyOworCQlpbnQgb2ZmLCBzaXplLCBsZW47CisKKwkJYmxvY2sgPSBiZTE2X3RvX2NwdShIRlNfU0Ioc2IpLT5tZGItPmRyVkJNU3QpICsgSEZTX1NCKHNiKS0+cGFydF9zdGFydDsKKwkJb2ZmID0gKGJsb2NrIDw8IEhGU19TRUNUT1JfU0laRV9CSVRTKSAmIChzYi0+c19ibG9ja3NpemUgLSAxKTsKKwkJYmxvY2sgPj49IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gSEZTX1NFQ1RPUl9TSVpFX0JJVFM7CisJCXNpemUgPSAoSEZTX1NCKHNiKS0+ZnNfYWJsb2NrcyArIDcpIC8gODsKKwkJcHRyID0gKHU4ICopSEZTX1NCKHNiKS0+Yml0bWFwOworCQl3aGlsZSAoc2l6ZSkgeworCQkJYmggPSBzYl9icmVhZChzYiwgYmxvY2spOworCQkJaWYgKCFiaCkgeworCQkJCWhmc193YXJuKCJoZnNfZnM6IHVuYWJsZSB0byByZWFkIHZvbHVtZSBiaXRtYXBcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbGVuID0gbWluKChpbnQpc2ItPnNfYmxvY2tzaXplIC0gb2ZmLCBzaXplKTsKKwkJCW1lbWNweShiaC0+Yl9kYXRhICsgb2ZmLCBwdHIsIGxlbik7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQlicmVsc2UoYmgpOworCQkJYmxvY2srKzsKKwkJCW9mZiA9IDA7CisJCQlwdHIgKz0gbGVuOworCQkJc2l6ZSAtPSBsZW47CisJCX0KKwl9Cit9CisKK3ZvaWQgaGZzX21kYl9jbG9zZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCS8qIHVwZGF0ZSB2b2x1bWUgYXR0cmlidXRlcyAqLworCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkKKwkJcmV0dXJuOworCUhGU19TQihzYiktPm1kYi0+ZHJBdHJiIHw9IGNwdV90b19iZTE2KEhGU19TQl9BVFRSSUJfVU5NTlQpOworCUhGU19TQihzYiktPm1kYi0+ZHJBdHJiICY9IGNwdV90b19iZTE2KH5IRlNfU0JfQVRUUklCX0lOQ05TVE5UKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShIRlNfU0Ioc2IpLT5tZGJfYmgpOworfQorCisvKgorICogaGZzX21kYl9wdXQoKQorICoKKyAqIFJlbGVhc2UgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGluLWNvcmUgTURCLiAgKi8KK3ZvaWQgaGZzX21kYl9wdXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwkvKiBmcmVlIHRoZSBCLXRyZWVzICovCisJaGZzX2J0cmVlX2Nsb3NlKEhGU19TQihzYiktPmV4dF90cmVlKTsKKwloZnNfYnRyZWVfY2xvc2UoSEZTX1NCKHNiKS0+Y2F0X3RyZWUpOworCisJLyogZnJlZSB0aGUgYnVmZmVycyBob2xkaW5nIHRoZSBwcmltYXJ5IGFuZCBhbHRlcm5hdGUgTURCcyAqLworCWJyZWxzZShIRlNfU0Ioc2IpLT5tZGJfYmgpOworCWJyZWxzZShIRlNfU0Ioc2IpLT5hbHRfbWRiX2JoKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2hmcy9wYXJ0X3RibC5jIGIvZnMvaGZzL3BhcnRfdGJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhZGQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9wYXJ0X3RibC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogIGxpbnV4L2ZzL2hmcy9wYXJ0X3RibC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTE5OTcgIFBhdWwgSC4gSGFyZ3JvdmUKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBPcmlnaW5hbCBjb2RlIHRvIGhhbmRsZSB0aGUgbmV3IHN0eWxlIE1hYyBwYXJ0aXRpb24gdGFibGUgYmFzZWQgb24KKyAqIGEgcGF0Y2ggY29udHJpYnV0ZWQgYnkgSG9sZ2VyIFNjaGVtZWwgKGFlZ2xvc0B2YWxpbm9yLm93bC5kZSkuCisgKi8KKworI2luY2x1ZGUgImhmc19mcy5oIgorCisvKgorICogVGhlIG5ldyBzdHlsZSBNYWMgcGFydGl0aW9uIG1hcAorICoKKyAqIEZvciBlYWNoIHBhcnRpdGlvbiBvbiB0aGUgbWVkaWEgdGhlcmUgaXMgYSBwaHlzaWNhbCBibG9jayAoNTEyLWJ5dGUKKyAqIGJsb2NrKSBjb250YWluaW5nIG9uZSBvZiB0aGVzZSBzdHJ1Y3R1cmVzLiAgVGhlc2UgYmxvY2tzIGFyZQorICogY29udGlndW91cyBzdGFydGluZyBhdCBibG9jayAxLgorICovCitzdHJ1Y3QgbmV3X3BtYXAgeworCV9fYmUxNglwbVNpZzsJCS8qIHNpZ25hdHVyZSAqLworCV9fYmUxNglyZVNpZ1BhZDsJLyogcGFkZGluZyAqLworCV9fYmUzMglwbU1hcEJsa0NudDsJLyogcGFydGl0aW9uIGJsb2NrcyBjb3VudCAqLworCV9fYmUzMglwbVB5UGFydFN0YXJ0OwkvKiBwaHlzaWNhbCBibG9jayBzdGFydCBvZiBwYXJ0aXRpb24gKi8KKwlfX2JlMzIJcG1QYXJ0QmxrQ250OwkvKiBwaHlzaWNhbCBibG9jayBjb3VudCBvZiBwYXJ0aXRpb24gKi8KKwl1OAlwbVBhcnROYW1lWzMyXTsJLyogKG51bGwgdGVybWluYXRlZD8pIHN0cmluZworCQkJCSAgIGdpdmluZyB0aGUgbmFtZSBvZiB0aGlzCisJCQkJICAgcGFydGl0aW9uICovCisJdTgJcG1QYXJ0VHlwZVszMl07CS8qIChudWxsIHRlcm1pbmF0ZWQ/KSBzdHJpbmcKKwkJCQkgICBnaXZpbmcgdGhlIHR5cGUgb2YgdGhpcworCQkJCSAgIHBhcnRpdGlvbiAqLworCS8qIGEgYnVuY2ggbW9yZSBzdHVmZiB3ZSBkb24ndCBuZWVkICovCit9IF9fcGFja2VkOworCisvKgorICogVGhlIG9sZCBzdHlsZSBNYWMgcGFydGl0aW9uIG1hcAorICoKKyAqIFRoZSBwYXJ0aXRpb24gbWFwIGNvbnNpc3RzIGZvciBhIDItYnl0ZSBzaWduYXR1cmUgZm9sbG93ZWQgYnkgYW4KKyAqIGFycmF5IG9mIHRoZXNlIHN0cnVjdHVyZXMuICBUaGUgbWFwIGlzIHRlcm1pbmF0ZWQgd2l0aCBhbiBhbGwtemVybworICogb25lIG9mIHRoZXNlLgorICovCitzdHJ1Y3Qgb2xkX3BtYXAgeworCV9fYmUxNgkJcGRTaWc7CS8qIFNpZ25hdHVyZSBieXRlcyAqLworCXN0cnVjdCAJb2xkX3BtYXBfZW50cnkgeworCQlfX2JlMzIJcGRTdGFydDsKKwkJX19iZTMyCXBkU2l6ZTsKKwkJX19iZTMyCXBkRlNJRDsKKwl9CXBkRW50cnlbNDJdOworfSBfX3BhY2tlZDsKKworLyoKKyAqIGhmc19wYXJ0X2ZpbmQoKQorICoKKyAqIFBhcnNlIHRoZSBwYXJ0aXRpb24gbWFwIGxvb2tpbmcgZm9yIHRoZQorICogc3RhcnQgYW5kIGxlbmd0aCBvZiB0aGUgJ3BhcnQndGggSEZTIHBhcnRpdGlvbi4KKyAqLworaW50IGhmc19wYXJ0X2ZpbmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJICBzZWN0b3JfdCAqcGFydF9zdGFydCwgc2VjdG9yX3QgKnBhcnRfc2l6ZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCV9fYmUxNiAqZGF0YTsKKwlpbnQgaSwgc2l6ZSwgcmVzOworCisJcmVzID0gLUVOT0VOVDsKKwliaCA9IHNiX2JyZWFkNTEyKHNiLCAqcGFydF9zdGFydCArIEhGU19QTUFQX0JMSywgZGF0YSk7CisJaWYgKCFiaCkKKwkJcmV0dXJuIC1FSU87CisKKwlzd2l0Y2ggKGJlMTZfdG9fY3B1KCpkYXRhKSkgeworCWNhc2UgSEZTX09MRF9QTUFQX01BR0lDOgorCSAgeworCQlzdHJ1Y3Qgb2xkX3BtYXAgKnBtOworCQlzdHJ1Y3Qgb2xkX3BtYXBfZW50cnkgKnA7CisKKwkJcG0gPSAoc3RydWN0IG9sZF9wbWFwICopYmgtPmJfZGF0YTsKKwkJcCA9IHBtLT5wZEVudHJ5OworCQlzaXplID0gNDI7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBwKyssIGkrKykgeworCQkJaWYgKHAtPnBkU3RhcnQgJiYgcC0+cGRTaXplICYmCisJCQkgICAgcC0+cGRGU0lEID09IGNwdV90b19iZTMyKDB4NTQ0NjUzMzEpLyoiVEZTMSIqLyAmJgorCQkJICAgIChIRlNfU0Ioc2IpLT5wYXJ0IDwgMCB8fCBIRlNfU0Ioc2IpLT5wYXJ0ID09IGkpKSB7CisJCQkJKnBhcnRfc3RhcnQgKz0gYmUzMl90b19jcHUocC0+cGRTdGFydCk7CisJCQkJKnBhcnRfc2l6ZSA9IGJlMzJfdG9fY3B1KHAtPnBkU2l6ZSk7CisJCQkJcmVzID0gMDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwkgIH0KKwljYXNlIEhGU19ORVdfUE1BUF9NQUdJQzoKKwkgIHsKKwkJc3RydWN0IG5ld19wbWFwICpwbTsKKworCQlwbSA9IChzdHJ1Y3QgbmV3X3BtYXAgKiliaC0+Yl9kYXRhOworCQlzaXplID0gYmUzMl90b19jcHUocG0tPnBtTWFwQmxrQ250KTsKKwkJZm9yIChpID0gMDsgaSA8IHNpemU7KSB7CisJCQlpZiAoIW1lbWNtcChwbS0+cG1QYXJ0VHlwZSwiQXBwbGVfSEZTIiwgOSkgJiYKKwkJCSAgICAoSEZTX1NCKHNiKS0+cGFydCA8IDAgfHwgSEZTX1NCKHNiKS0+cGFydCA9PSBpKSkgeworCQkJCSpwYXJ0X3N0YXJ0ICs9IGJlMzJfdG9fY3B1KHBtLT5wbVB5UGFydFN0YXJ0KTsKKwkJCQkqcGFydF9zaXplID0gYmUzMl90b19jcHUocG0tPnBtUGFydEJsa0NudCk7CisJCQkJcmVzID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWxzZShiaCk7CisJCQliaCA9IHNiX2JyZWFkNTEyKHNiLCAqcGFydF9zdGFydCArIEhGU19QTUFQX0JMSyArICsraSwgcG0pOworCQkJaWYgKCFiaCkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWlmIChwbS0+cG1TaWcgIT0gY3B1X3RvX2JlMTYoSEZTX05FV19QTUFQX01BR0lDKSkKKwkJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwkgIH0KKwl9CisJYnJlbHNlKGJoKTsKKworCXJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9mcy9oZnMvc3RyaW5nLmMgYi9mcy9oZnMvc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI3YTVhZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9zdHJpbmcuYwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqICBsaW51eC9mcy9oZnMvc3RyaW5nLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyAgUGF1bCBILiBIYXJncm92ZQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3RyaW5nIGNvbXBhcmlzb24gZnVuY3Rpb24gZm9yIHRoZQorICogTWFjaW50b3NoIGNoYXJhY3RlciBzZXQuCisgKgorICogVGhlIGNvZGUgaW4gdGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBjb2RlIHdoaWNoIGlzIGNvcHlyaWdodAorICogMTk4NiwgMTk4OSwgMTk5MCBieSBBYmFjdXMgUmVzZWFyY2ggYW5kIERldmVsb3BtZW50LCBJbmMuIChBUkRJKQorICogSXQgaXMgdXNlZCBoZXJlIGJ5IHRoZSBwZXJtaXNzaW9uIG9mIEFSREkncyBwcmVzaWRlbnQgQ2xpZmYgTWF0dGhld3MuCisgKi8KKworI2luY2x1ZGUgImhmc19mcy5oIgorI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorCisvKj09PT09PT09PT09PT09PT0gRmlsZS1sb2NhbCB2YXJpYWJsZXMgPT09PT09PT09PT09PT09PSovCisKKy8qCisgKiB1bnNpZ25lZCBjaGFyIGNhc2VvcmRlcltdCisgKgorICogRGVmaW5lcyB0aGUgbGV4aWNhbCBvcmRlcmluZyBvZiBjaGFyYWN0ZXJzIG9uIHRoZSBNYWNpbnRvc2gKKyAqCisgKiBDb21wb3NpdGlvbiBvZiB0aGUgJ2Nhc2Vmb2xkJyBhbmQgJ29yZGVyJyB0YWJsZXMgZnJvbSBBUkRJJ3MgY29kZQorICogd2l0aCB0aGUgZW50cnkgZm9yIDB4MjAgY2hhbmdlZCB0byBtYXRjaCB0aGF0IGZvciAweENBIHRvIHJlbW92ZQorICogc3BlY2lhbCBjYXNlIGZvciB0aG9zZSB0d28gY2hhcmFjdGVycy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2FzZW9yZGVyWzI1Nl0gPSB7CisJMHgwMCwweDAxLDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELDB4MEUsMHgwRiwKKwkweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwweDFDLDB4MUQsMHgxRSwweDFGLAorCTB4MjAsMHgyMiwweDIzLDB4MjgsMHgyOSwweDJBLDB4MkIsMHgyQywweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LDB4MzYsCisJMHgzNywweDM4LDB4MzksMHgzQSwweDNCLDB4M0MsMHgzRCwweDNFLDB4M0YsMHg0MCwweDQxLDB4NDIsMHg0MywweDQ0LDB4NDUsMHg0NiwKKwkweDQ3LDB4NDgsMHg1NywweDU5LDB4NUQsMHg1RiwweDY2LDB4NjgsMHg2QSwweDZDLDB4NzIsMHg3NCwweDc2LDB4NzgsMHg3QSwweDdFLAorCTB4OEMsMHg4RSwweDkwLDB4OTIsMHg5NSwweDk3LDB4OUUsMHhBMCwweEEyLDB4QTQsMHhBNywweEE5LDB4QUEsMHhBQiwweEFDLDB4QUQsCisJMHg0RSwweDQ4LDB4NTcsMHg1OSwweDVELDB4NUYsMHg2NiwweDY4LDB4NkEsMHg2QywweDcyLDB4NzQsMHg3NiwweDc4LDB4N0EsMHg3RSwKKwkweDhDLDB4OEUsMHg5MCwweDkyLDB4OTUsMHg5NywweDlFLDB4QTAsMHhBMiwweEE0LDB4QTcsMHhBRiwweEIwLDB4QjEsMHhCMiwweEIzLAorCTB4NEEsMHg0QywweDVBLDB4NjAsMHg3QiwweDdGLDB4OTgsMHg0RiwweDQ5LDB4NTEsMHg0QSwweDRCLDB4NEMsMHg1QSwweDYwLDB4NjMsCisJMHg2NCwweDY1LDB4NkUsMHg2RiwweDcwLDB4NzEsMHg3QiwweDg0LDB4ODUsMHg4NiwweDdGLDB4ODAsMHg5QSwweDlCLDB4OUMsMHg5OCwKKwkweEI0LDB4QjUsMHhCNiwweEI3LDB4QjgsMHhCOSwweEJBLDB4OTQsMHhCQiwweEJDLDB4QkQsMHhCRSwweEJGLDB4QzAsMHg0RCwweDgxLAorCTB4QzEsMHhDMiwweEMzLDB4QzQsMHhDNSwweEM2LDB4QzcsMHhDOCwweEM5LDB4Q0EsMHhDQiwweDU1LDB4OEEsMHhDQywweDRELDB4ODEsCisJMHhDRCwweENFLDB4Q0YsMHhEMCwweEQxLDB4RDIsMHhEMywweDI2LDB4MjcsMHhENCwweDIwLDB4NDksMHg0QiwweDgwLDB4ODIsMHg4MiwKKwkweEQ1LDB4RDYsMHgyNCwweDI1LDB4MkQsMHgyRSwweEQ3LDB4RDgsMHhBNiwweEQ5LDB4REEsMHhEQiwweERDLDB4REQsMHhERSwweERGLAorCTB4RTAsMHhFMSwweEUyLDB4RTMsMHhFNCwweEU1LDB4RTYsMHhFNywweEU4LDB4RTksMHhFQSwweEVCLDB4RUMsMHhFRCwweEVFLDB4RUYsCisJMHhGMCwweEYxLDB4RjIsMHhGMywweEY0LDB4RjUsMHhGNiwweEY3LDB4RjgsMHhGOSwweEZBLDB4RkIsMHhGQywweEZELDB4RkUsMHhGRgorfTsKKworLyo9PT09PT09PT09PT09PT09IEdsb2JhbCBmdW5jdGlvbnMgPT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBIYXNoIGEgc3RyaW5nIHRvIGFuIGludGVnZXIgaW4gYSBjYXNlLWluZGVwZW5kZW50IHdheQorICovCitpbnQgaGZzX2hhc2hfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnRoaXMpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSA9IHRoaXMtPm5hbWU7CisJdW5zaWduZWQgaW50IGhhc2gsIGxlbiA9IHRoaXMtPmxlbjsKKworCWlmIChsZW4gPiBIRlNfTkFNRUxFTikKKwkJbGVuID0gSEZTX05BTUVMRU47CisKKwloYXNoID0gaW5pdF9uYW1lX2hhc2goKTsKKwlmb3IgKDsgbGVuOyBsZW4tLSkKKwkJaGFzaCA9IHBhcnRpYWxfbmFtZV9oYXNoKGNhc2VvcmRlclsqbmFtZSsrXSwgaGFzaCk7CisJdGhpcy0+aGFzaCA9IGVuZF9uYW1lX2hhc2goaGFzaCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb21wYXJlIHR3byBzdHJpbmdzIGluIHRoZSBIRlMgZmlsZW5hbWUgY2hhcmFjdGVyIG9yZGVyaW5nCisgKiBSZXR1cm5zIHBvc2l0aXZlLCBuZWdhdGl2ZSwgb3IgemVybywgbm90IGp1c3QgMCBvciAoKy8tKTEKKyAqCisgKiBFcXVpdmFsZW50IHRvIEFSREkncyBjYWxsOgorICoJUk9NbGliX1JlbFN0cmluZyhzMSsxLCBzMisxLCB0cnVlLCBmYWxzZSwgKHMxWzBdPDwxNikgfCBzMlswXSkKKyAqLworaW50IGhmc19zdHJjbXAoY29uc3QgdW5zaWduZWQgY2hhciAqczEsIHVuc2lnbmVkIGludCBsZW4xLAorCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzMiwgdW5zaWduZWQgaW50IGxlbjIpCit7CisJaW50IGxlbiwgdG1wOworCisJbGVuID0gKGxlbjEgPiBsZW4yKSA/IGxlbjIgOiBsZW4xOworCisJd2hpbGUgKGxlbi0tKSB7CisJCXRtcCA9IChpbnQpY2FzZW9yZGVyWyooczErKyldIC0gKGludCljYXNlb3JkZXJbKihzMisrKV07CisJCWlmICh0bXApCisJCQlyZXR1cm4gdG1wOworCX0KKwlyZXR1cm4gbGVuMSAtIGxlbjI7Cit9CisKKy8qCisgKiBUZXN0IGZvciBlcXVhbGl0eSBvZiB0d28gc3RyaW5ncyBpbiB0aGUgSEZTIGZpbGVuYW1lIGNoYXJhY3RlciBvcmRlcmluZy4KKyAqIHJldHVybiAxIG9uIGZhaWx1cmUgYW5kIDAgb24gc3VjY2VzcworICovCitpbnQgaGZzX2NvbXBhcmVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnMxLCBzdHJ1Y3QgcXN0ciAqczIpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqbjEsICpuMjsKKwlpbnQgbGVuOworCisJbGVuID0gczEtPmxlbjsKKwlpZiAobGVuID49IEhGU19OQU1FTEVOKSB7CisJCWlmIChzMi0+bGVuIDwgSEZTX05BTUVMRU4pCisJCQlyZXR1cm4gMTsKKwkJbGVuID0gSEZTX05BTUVMRU47CisJfSBlbHNlIGlmIChsZW4gIT0gczItPmxlbikKKwkJcmV0dXJuIDE7CisKKwluMSA9IHMxLT5uYW1lOworCW4yID0gczItPm5hbWU7CisJd2hpbGUgKGxlbi0tKSB7CisJCWlmIChjYXNlb3JkZXJbKm4xKytdICE9IGNhc2VvcmRlclsqbjIrK10pCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9oZnMvc3VwZXIuYyBiL2ZzL2hmcy9zdXBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMmMxOTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9oZnMvc3VwZXIuYwpAQCAtMCwwICsxLDM5NSBAQAorLyoKKyAqICBsaW51eC9mcy9oZnMvc3VwZXIuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3ICBQYXVsIEguIEhhcmdyb3ZlCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGhmc19yZWFkX3N1cGVyKCksIHNvbWUgb2YgdGhlIHN1cGVyX29wcyBhbmQKKyAqIGluaXRfbW9kdWxlKCkgYW5kIGNsZWFudXBfbW9kdWxlKCkuCVRoZSByZW1haW5pbmcgc3VwZXJfb3BzIGFyZSBpbgorICogaW5vZGUuYyBzaW5jZSB0aGV5IGRlYWwgd2l0aCBpbm9kZXMuCisgKgorICogQmFzZWQgb24gdGhlIG1pbml4IGZpbGUgc3lzdGVtIGNvZGUsIChDKSAxOTkxLCAxOTkyIGJ5IExpbnVzIFRvcnZhbGRzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKworI2luY2x1ZGUgImhmc19mcy5oIgorI2luY2x1ZGUgImJ0cmVlLmgiCisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmhmc19pbm9kZV9jYWNoZXA7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIGhmc193cml0ZV9zdXBlcigpCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBWRlMgb25seS4gV2hlbiB0aGUgZmlsZXN5c3RlbQorICogICBpcyBtb3VudGVkIHIvdyBpdCB1cGRhdGVzIHRoZSBNREIgb24gZGlzay4KKyAqIElucHV0IFZhcmlhYmxlKHMpOgorICogICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOiBQb2ludGVyIHRvIHRoZSBoZnMgc3VwZXJibG9jaworICogT3V0cHV0IFZhcmlhYmxlKHMpOgorICogICBOT05FCisgKiBSZXR1cm5zOgorICogICB2b2lkCisgKiBQcmVjb25kaXRpb25zOgorICogICAnc2InIHBvaW50cyB0byBhICJ2YWxpZCIgKHN0cnVjdCBzdXBlcl9ibG9jaykuCisgKiBQb3N0Y29uZGl0aW9uczoKKyAqICAgVGhlIE1EQiBpcyBtYXJrZWQgJ3Vuc3VjY2Vzc2Z1bGx5IHVubW91bnRlZCcgYnkgY2xlYXJpbmcgYml0IDggb2YgZHJBdHJiCisgKiAgIChoZnNfcHV0X3N1cGVyKCkgbXVzdCBzZXQgdGhpcyBmbGFnISkuIFNvbWUgTURCIGZpZWxkcyBhcmUgdXBkYXRlZAorICogICBhbmQgdGhlIE1EQiBidWZmZXIgaXMgd3JpdHRlbiB0byBkaXNrIGJ5IGNhbGxpbmcgaGZzX21kYl9jb21taXQoKS4KKyAqLworc3RhdGljIHZvaWQgaGZzX3dyaXRlX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc2ItPnNfZGlydCA9IDA7CisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlyZXR1cm47CisJLyogc3luYyBldmVyeXRoaW5nIHRvIHRoZSBidWZmZXJzICovCisJaGZzX21kYl9jb21taXQoc2IpOworfQorCisvKgorICogaGZzX3B1dF9zdXBlcigpCisgKgorICogVGhpcyBpcyB0aGUgcHV0X3N1cGVyKCkgZW50cnkgaW4gdGhlIHN1cGVyX29wZXJhdGlvbnMgc3RydWN0dXJlIGZvcgorICogSEZTIGZpbGVzeXN0ZW1zLiAgVGhlIHB1cnBvc2UgaXMgdG8gcmVsZWFzZSB0aGUgcmVzb3VyY2VzCisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHN1cGVyYmxvY2sgc2IuCisgKi8KK3N0YXRpYyB2b2lkIGhmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwloZnNfbWRiX2Nsb3NlKHNiKTsKKwkvKiByZWxlYXNlIHRoZSBNREIncyByZXNvdXJjZXMgKi8KKwloZnNfbWRiX3B1dChzYik7Cit9CisKKy8qCisgKiBoZnNfc3RhdGZzKCkKKyAqCisgKiBUaGlzIGlzIHRoZSBzdGF0ZnMoKSBlbnRyeSBpbiB0aGUgc3VwZXJfb3BlcmF0aW9ucyBzdHJ1Y3R1cmUgZm9yCisgKiBIRlMgZmlsZXN5c3RlbXMuICBUaGUgcHVycG9zZSBpcyB0byByZXR1cm4gdmFyaW91cyBkYXRhIGFib3V0IHRoZQorICogZmlsZXN5c3RlbS4KKyAqCisgKiBjaGFuZ2VkIGZfZmlsZXMvZl9mZnJlZSB0byByZWZsZWN0IHRoZSBmc19hYmxvY2svZnJlZV9hYmxvY2tzLgorICovCitzdGF0aWMgaW50IGhmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlidWYtPmZfdHlwZSA9IEhGU19TVVBFUl9NQUdJQzsKKwlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CisJYnVmLT5mX2Jsb2NrcyA9ICh1MzIpSEZTX1NCKHNiKS0+ZnNfYWJsb2NrcyAqIEhGU19TQihzYiktPmZzX2RpdjsKKwlidWYtPmZfYmZyZWUgPSAodTMyKUhGU19TQihzYiktPmZyZWVfYWJsb2NrcyAqIEhGU19TQihzYiktPmZzX2RpdjsKKwlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlOworCWJ1Zi0+Zl9maWxlcyA9IEhGU19TQihzYiktPmZzX2FibG9ja3M7CisJYnVmLT5mX2ZmcmVlID0gSEZTX1NCKHNiKS0+ZnJlZV9hYmxvY2tzOworCWJ1Zi0+Zl9uYW1lbGVuID0gSEZTX05BTUVMRU47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZnNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCSpmbGFncyB8PSBNU19OT0RJUkFUSU1FOworCWlmICgoKmZsYWdzICYgTVNfUkRPTkxZKSA9PSAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQorCQlyZXR1cm4gMDsKKwlpZiAoISgqZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCWlmICghKEhGU19TQihzYiktPm1kYi0+ZHJBdHJiICYgY3B1X3RvX2JlMTYoSEZTX1NCX0FUVFJJQl9VTk1OVCkpKSB7CisJCQlwcmludGsoIkhGUy1mcyB3YXJuaW5nOiBGaWxlc3lzdGVtIHdhcyBub3QgY2xlYW5seSB1bm1vdW50ZWQsICIKKwkJCSAgICAgICAicnVubmluZyBmc2NrLmhmcyBpcyByZWNvbW1lbmRlZC4gIGxlYXZpbmcgcmVhZC1vbmx5LlxuIik7CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJCQkqZmxhZ3MgfD0gTVNfUkRPTkxZOworCQl9IGVsc2UgaWYgKEhGU19TQihzYiktPm1kYi0+ZHJBdHJiICYgY3B1X3RvX2JlMTYoSEZTX1NCX0FUVFJJQl9TTE9DSykpIHsKKwkJCXByaW50aygiSEZTLWZzOiBGaWxlc3lzdGVtIGlzIG1hcmtlZCBsb2NrZWQsIGxlYXZpbmcgcmVhZC1vbmx5LlxuIik7CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJCQkqZmxhZ3MgfD0gTVNfUkRPTkxZOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlICpoZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgaGZzX2lub2RlX2luZm8gKmk7CisKKwlpID0ga21lbV9jYWNoZV9hbGxvYyhoZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJcmV0dXJuIGkgPyAmaS0+dmZzX2lub2RlIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgaGZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUoaGZzX2lub2RlX2NhY2hlcCwgSEZTX0koaW5vZGUpKTsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGhmc19zdXBlcl9vcGVyYXRpb25zID0geworCS5hbGxvY19pbm9kZQk9IGhmc19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IGhmc19kZXN0cm95X2lub2RlLAorCS53cml0ZV9pbm9kZQk9IGhmc193cml0ZV9pbm9kZSwKKwkuY2xlYXJfaW5vZGUJPSBoZnNfY2xlYXJfaW5vZGUsCisJLnB1dF9zdXBlcgk9IGhmc19wdXRfc3VwZXIsCisJLndyaXRlX3N1cGVyCT0gaGZzX3dyaXRlX3N1cGVyLAorCS5zdGF0ZnMJCT0gaGZzX3N0YXRmcywKKwkucmVtb3VudF9mcyAgICAgPSBoZnNfcmVtb3VudCwKK307CisKK2VudW0geworCW9wdF91aWQsIG9wdF9naWQsIG9wdF91bWFzaywgb3B0X2ZpbGVfdW1hc2ssIG9wdF9kaXJfdW1hc2ssCisJb3B0X3BhcnQsIG9wdF9zZXNzaW9uLCBvcHRfdHlwZSwgb3B0X2NyZWF0b3IsIG9wdF9xdWlldCwKKwlvcHRfZXJyCit9OworCitzdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CisJeyBvcHRfdWlkLCAidWlkPSV1IiB9LAorCXsgb3B0X2dpZCwgImdpZD0ldSIgfSwKKwl7IG9wdF91bWFzaywgInVtYXNrPSVvIiB9LAorCXsgb3B0X2ZpbGVfdW1hc2ssICJmaWxlX3VtYXNrPSVvIiB9LAorCXsgb3B0X2Rpcl91bWFzaywgImRpcl91bWFzaz0lbyIgfSwKKwl7IG9wdF9wYXJ0LCAicGFydD0ldSIgfSwKKwl7IG9wdF9zZXNzaW9uLCAic2Vzc2lvbj0ldSIgfSwKKwl7IG9wdF90eXBlLCAidHlwZT0lcyIgfSwKKwl7IG9wdF9jcmVhdG9yLCAiY3JlYXRvcj0lcyIgfSwKKwl7IG9wdF9xdWlldCwgInF1aWV0IiB9LAorCXsgb3B0X2VyciwgTlVMTCB9Cit9OworCitzdGF0aWMgaW5saW5lIGludCBtYXRjaF9mb3VyY2hhcihzdWJzdHJpbmdfdCAqYXJnLCB1MzIgKnJlc3VsdCkKK3sKKwlpZiAoYXJnLT50byAtIGFyZy0+ZnJvbSAhPSA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwltZW1jcHkocmVzdWx0LCBhcmctPmZyb20sIDQpOworCXJldHVybiAwOworfQorCisvKgorICogcGFyc2Vfb3B0aW9ucygpCisgKgorICogYWRhcHRlZCBmcm9tIGxpbnV4L2ZzL21zZG9zL2lub2RlLmMgd3JpdHRlbiAxOTkyLDkzIGJ5IFdlcm5lciBBbG1lc2JlcmdlcgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaGZzX3JlYWRfc3VwZXIoKSB0byBwYXJzZSB0aGUgbW91bnQgb3B0aW9ucy4KKyAqLworc3RhdGljIGludCBwYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIHN0cnVjdCBoZnNfc2JfaW5mbyAqaHNiKQoreworCWNoYXIgKnA7CisJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCWludCB0bXAsIHRva2VuOworCisJLyogaW5pdGlhbGl6ZSB0aGUgc2Igd2l0aCBkZWZhdWx0cyAqLworCWhzYi0+c191aWQgPSBjdXJyZW50LT51aWQ7CisJaHNiLT5zX2dpZCA9IGN1cnJlbnQtPmdpZDsKKwloc2ItPnNfZmlsZV91bWFzayA9IDAxMzM7CisJaHNiLT5zX2Rpcl91bWFzayA9IDAwMjI7CisJaHNiLT5zX3R5cGUgPSBoc2ItPnNfY3JlYXRvciA9IGNwdV90b19iZTMyKDB4M2YzZjNmM2YpOwkvKiA9PSAnPz8/PycgKi8KKwloc2ItPnNfcXVpZXQgPSAwOworCWhzYi0+cGFydCA9IC0xOworCWhzYi0+c2Vzc2lvbiA9IC0xOworCisJaWYgKCFvcHRpb25zKQorCQlyZXR1cm4gMTsKKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpZiAoISpwKQorCQkJY29udGludWU7CisKKwkJdG9rZW4gPSBtYXRjaF90b2tlbihwLCB0b2tlbnMsIGFyZ3MpOworCQlzd2l0Y2ggKHRva2VuKSB7CisJCWNhc2Ugb3B0X3VpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZ0bXApKSB7CisJCQkJcHJpbnRrKCJIRlM6IHVpZCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQloc2ItPnNfdWlkID0gKHVpZF90KXRtcDsKKwkJCWJyZWFrOworCQljYXNlIG9wdF9naWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmdG1wKSkgeworCQkJCXByaW50aygiSEZTOiBnaWQgcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaHNiLT5zX2dpZCA9IChnaWRfdCl0bXA7CisJCQlicmVhazsKKwkJY2FzZSBvcHRfdW1hc2s6CisJCQlpZiAobWF0Y2hfb2N0YWwoJmFyZ3NbMF0sICZ0bXApKSB7CisJCQkJcHJpbnRrKCJIRlM6IHVtYXNrIHJlcXVpcmVzIGEgdmFsdWVcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaHNiLT5zX2ZpbGVfdW1hc2sgPSAodW1vZGVfdCl0bXA7CisJCQloc2ItPnNfZGlyX3VtYXNrID0gKHVtb2RlX3QpdG1wOworCQkJYnJlYWs7CisJCWNhc2Ugb3B0X2ZpbGVfdW1hc2s6CisJCQlpZiAobWF0Y2hfb2N0YWwoJmFyZ3NbMF0sICZ0bXApKSB7CisJCQkJcHJpbnRrKCJIRlM6IGZpbGVfdW1hc2sgcmVxdWlyZXMgYSB2YWx1ZVxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQloc2ItPnNfZmlsZV91bWFzayA9ICh1bW9kZV90KXRtcDsKKwkJCWJyZWFrOworCQljYXNlIG9wdF9kaXJfdW1hc2s6CisJCQlpZiAobWF0Y2hfb2N0YWwoJmFyZ3NbMF0sICZ0bXApKSB7CisJCQkJcHJpbnRrKCJIRlM6IGRpcl91bWFzayByZXF1aXJlcyBhIHZhbHVlXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWhzYi0+c19kaXJfdW1hc2sgPSAodW1vZGVfdCl0bXA7CisJCQlicmVhazsKKwkJY2FzZSBvcHRfcGFydDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZoc2ItPnBhcnQpKSB7CisJCQkJcHJpbnRrKCJIRlM6IHBhcnQgcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2Ugb3B0X3Nlc3Npb246CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmaHNiLT5zZXNzaW9uKSkgeworCQkJCXByaW50aygiSEZTOiBzZXNzaW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIG9wdF90eXBlOgorCQkJaWYgKG1hdGNoX2ZvdXJjaGFyKCZhcmdzWzBdLCAmaHNiLT5zX3R5cGUpKSB7CisJCQkJcHJpbnRrKCJIRlMrLWZzOiB0eXBlIHJlcXVpcmVzIGEgNCBjaGFyYWN0ZXIgdmFsdWVcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2Ugb3B0X2NyZWF0b3I6CisJCQlpZiAobWF0Y2hfZm91cmNoYXIoJmFyZ3NbMF0sICZoc2ItPnNfY3JlYXRvcikpIHsKKwkJCQlwcmludGsoIkhGUystZnM6IGNyZWF0b3IgcmVxdWlyZXMgYSA0IGNoYXJhY3RlciB2YWx1ZVxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBvcHRfcXVpZXQ6CisJCQloc2ItPnNfcXVpZXQgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWhzYi0+c19kaXJfdW1hc2sgJj0gMDc3NzsKKwloc2ItPnNfZmlsZV91bWFzayAmPSAwNTc3OworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBoZnNfcmVhZF9zdXBlcigpCisgKgorICogVGhpcyBpcyB0aGUgZnVuY3Rpb24gdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgbW91bnRpbmcgYW4gSEZTCisgKiBmaWxlc3lzdGVtLglJdCBwZXJmb3JtcyBhbGwgdGhlIHRhc2tzIG5lY2Vzc2FyeSB0byBnZXQgZW5vdWdoIGRhdGEKKyAqIGZyb20gdGhlIGRpc2sgdG8gcmVhZCB0aGUgcm9vdCBpbm9kZS4gIFRoaXMgaW5jbHVkZXMgcGFyc2luZyB0aGUKKyAqIG1vdW50IG9wdGlvbnMsIGRlYWxpbmcgd2l0aCBNYWNpbnRvc2ggcGFydGl0aW9ucywgcmVhZGluZyB0aGUKKyAqIHN1cGVyYmxvY2sgYW5kIHRoZSBhbGxvY2F0aW9uIGJpdG1hcCBibG9ja3MsIGNhbGxpbmcKKyAqIGhmc19idHJlZV9pbml0KCkgdG8gZ2V0IHRoZSBuZWNlc3NhcnkgZGF0YSBhYm91dCB0aGUgZXh0ZW50cyBhbmQKKyAqIGNhdGFsb2cgQi10cmVlcyBhbmQsIGZpbmFsbHksIHJlYWRpbmcgdGhlIHJvb3QgaW5vZGUgaW50byBtZW1vcnkuCisgKi8KK3N0YXRpYyBpbnQgaGZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaGZzX3NiX2luZm8gKnNiaTsKKwlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBmZDsKKwloZnNfY2F0X3JlYyByZWM7CisJc3RydWN0IGlub2RlICpyb290X2lub2RlOworCWludCByZXM7CisKKwlzYmkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGZzX3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNiaSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2ItPnNfZnNfaW5mbyA9IHNiaTsKKwltZW1zZXQoc2JpLCAwLCBzaXplb2Yoc3RydWN0IGhmc19zYl9pbmZvKSk7CisJSU5JVF9ITElTVF9IRUFEKCZzYmktPnJzcmNfaW5vZGVzKTsKKworCXJlcyA9IC1FSU5WQUw7CisJaWYgKCFwYXJzZV9vcHRpb25zKChjaGFyICopZGF0YSwgc2JpKSkgeworCQloZnNfd2FybigiaGZzX2ZzOiB1bmFibGUgdG8gcGFyc2UgbW91bnQgb3B0aW9ucy5cbiIpOworCQlnb3RvIGJhaWwzOworCX0KKworCXNiLT5zX29wID0gJmhmc19zdXBlcl9vcGVyYXRpb25zOworCXNiLT5zX2ZsYWdzIHw9IE1TX05PRElSQVRJTUU7CisJaW5pdF9NVVRFWCgmc2JpLT5iaXRtYXBfbG9jayk7CisKKwlyZXMgPSBoZnNfbWRiX2dldChzYik7CisJaWYgKHJlcykgeworCQlpZiAoIXNpbGVudCkKKwkJCWhmc193YXJuKCJWRlM6IENhbid0IGZpbmQgYSBIRlMgZmlsZXN5c3RlbSBvbiBkZXYgJXMuXG4iLAorCQkJCWhmc19tZGJfbmFtZShzYikpOworCQlyZXMgPSAtRUlOVkFMOworCQlnb3RvIGJhaWwyOworCX0KKworCS8qIHRyeSB0byBnZXQgdGhlIHJvb3QgaW5vZGUgKi8KKwloZnNfZmluZF9pbml0KEhGU19TQihzYiktPmNhdF90cmVlLCAmZmQpOworCXJlcyA9IGhmc19jYXRfZmluZF9icmVjKHNiLCBIRlNfUk9PVF9DTklELCAmZmQpOworCWlmICghcmVzKQorCQloZnNfYm5vZGVfcmVhZChmZC5ibm9kZSwgJnJlYywgZmQuZW50cnlvZmZzZXQsIGZkLmVudHJ5bGVuZ3RoKTsKKwlpZiAocmVzKSB7CisJCWhmc19maW5kX2V4aXQoJmZkKTsKKwkJZ290byBiYWlsX25vX3Jvb3Q7CisJfQorCXJvb3RfaW5vZGUgPSBoZnNfaWdldChzYiwgJmZkLnNlYXJjaF9rZXktPmNhdCwgJnJlYyk7CisJaGZzX2ZpbmRfZXhpdCgmZmQpOworCWlmICghcm9vdF9pbm9kZSkKKwkJZ290byBiYWlsX25vX3Jvb3Q7CisKKwlzYi0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOworCWlmICghc2ItPnNfcm9vdCkKKwkJZ290byBiYWlsX2lwdXQ7CisKKwlzYi0+c19yb290LT5kX29wID0gJmhmc19kZW50cnlfb3BlcmF0aW9uczsKKworCS8qIGV2ZXJ5dGhpbmcncyBva2F5ICovCisJcmV0dXJuIDA7CisKK2JhaWxfaXB1dDoKKwlpcHV0KHJvb3RfaW5vZGUpOworYmFpbF9ub19yb290OgorCWhmc193YXJuKCJoZnNfZnM6IGdldCByb290IGlub2RlIGZhaWxlZC5cbiIpOworCWhmc19tZGJfcHV0KHNiKTsKK2JhaWwyOgorYmFpbDM6CisJa2ZyZWUoc2JpKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpoZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkJCSAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgaGZzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgaGZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJoZnMiLAorCS5nZXRfc2IJCT0gaGZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworc3RhdGljIHZvaWQgaGZzX2luaXRfb25jZSh2b2lkICpwLCBrbWVtX2NhY2hlX3QgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgaGZzX2lub2RlX2luZm8gKmkgPSBwOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09IFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikKKwkJaW5vZGVfaW5pdF9vbmNlKCZpLT52ZnNfaW5vZGUpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2hmc19mcyh2b2lkKQoreworCWludCBlcnI7CisKKwloZnNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImhmc19pbm9kZV9jYWNoZSIsCisJCXNpemVvZihzdHJ1Y3QgaGZzX2lub2RlX2luZm8pLCAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCWhmc19pbml0X29uY2UsIE5VTEwpOworCWlmICghaGZzX2lub2RlX2NhY2hlcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmaGZzX2ZzX3R5cGUpOworCWlmIChlcnIpCisJCWttZW1fY2FjaGVfZGVzdHJveShoZnNfaW5vZGVfY2FjaGVwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9oZnNfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmhmc19mc190eXBlKTsKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGhmc19pbm9kZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9JTkZPICJoZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9oZnNfZnMpCittb2R1bGVfZXhpdChleGl0X2hmc19mcykKZGlmZiAtLWdpdCBhL2ZzL2hmcy9zeXNkZXAuYyBiL2ZzL2hmcy9zeXNkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmY4OWVjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzL3N5c2RlcC5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzL3N5c2RlcC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2ICBQYXVsIEguIEhhcmdyb3ZlCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIHRvIGRvIHZhcmlvdXMgc3lzdGVtIGRlcGVuZGVudCB0aGluZ3MuCisgKi8KKworI2luY2x1ZGUgImhmc19mcy5oIgorCisvKiBkZW50cnkgY2FzZS1oYW5kbGluZzoganVzdCBsb3dlcmNhc2UgZXZlcnl0aGluZyAqLworCitzdGF0aWMgaW50IGhmc19yZXZhbGlkYXRlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGRpZmY7CisKKwlpZighaW5vZGUpCisJCXJldHVybiAxOworCisJLyogZml4IHVwIGlub2RlIG9uIGEgdGltZXpvbmUgY2hhbmdlICovCisJZGlmZiA9IHN5c190ei50el9taW51dGVzd2VzdCAqIDYwIC0gSEZTX0koaW5vZGUpLT50el9zZWNvbmRzd2VzdDsKKwlpZiAoZGlmZikgeworCQlpbm9kZS0+aV9jdGltZS50dl9zZWMgKz0gZGlmZjsKKwkJaW5vZGUtPmlfYXRpbWUudHZfc2VjICs9IGRpZmY7CisJCWlub2RlLT5pX210aW1lLnR2X3NlYyArPSBkaWZmOworCQlIRlNfSShpbm9kZSktPnR6X3NlY29uZHN3ZXN0ICs9IGRpZmY7CisJfQorCXJldHVybiAxOworfQorCitzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgaGZzX2RlbnRyeV9vcGVyYXRpb25zID0KK3sKKwkuZF9yZXZhbGlkYXRlCT0gaGZzX3JldmFsaWRhdGVfZGVudHJ5LAorCS5kX2hhc2gJCT0gaGZzX2hhc2hfZGVudHJ5LAorCS5kX2NvbXBhcmUJPSBoZnNfY29tcGFyZV9kZW50cnksCit9OworCmRpZmYgLS1naXQgYS9mcy9oZnMvdHJhbnMuYyBiL2ZzL2hmcy90cmFucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOTcyMGEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9oZnMvdHJhbnMuYwpAQCAtMCwwICsxLDcyIEBACisvKgorICogIGxpbnV4L2ZzL2hmcy90cmFucy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgIFBhdWwgSC4gSGFyZ3JvdmUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgTWFjaW50b3NoCisgKiBjaGFyYWN0ZXIgc2V0IGFuZCB2YXJpb3VzIG90aGVyIGVuY29kaW5ncy4gIFRoaXMgaW5jbHVkZXMgZGVhbGluZworICogd2l0aCAnOicgdnMuICcvJyBhcyB0aGUgcGF0aC1lbGVtZW50IHNlcGFyYXRvci4KKyAqLworCisjaW5jbHVkZSAiaGZzX2ZzLmgiCisKKy8qPT09PT09PT09PT09PT09PSBHbG9iYWwgZnVuY3Rpb25zID09PT09PT09PT09PT09PT0qLworCisvKgorICogaGZzX21hYzJ0cml2KCkKKyAqCisgKiBHaXZlbiBhICdQYXNjYWwgU3RyaW5nJyAoYSBzdHJpbmcgcHJlY2VkZWQgYnkgYSBsZW5ndGggYnl0ZSkgaW4KKyAqIHRoZSBNYWNpbnRvc2ggY2hhcmFjdGVyIHNldCBwcm9kdWNlIHRoZSBjb3JyZXNwb25kaW5nIGZpbGVuYW1lIHVzaW5nCisgKiB0aGUgJ3RyaXZpYWwnIG5hbWUtbWFuZ2xpbmcgc2NoZW1lLCByZXR1cm5pbmcgdGhlIGxlbmd0aCBvZiB0aGUKKyAqIG1hbmdsZWQgZmlsZW5hbWUuICBOb3RlIHRoYXQgdGhlIG91dHB1dCBzdHJpbmcgaXMgbm90IE5VTEwKKyAqIHRlcm1pbmF0ZWQuCisgKgorICogVGhlIG5hbWUtbWFuZ2xpbmcgd29ya3MgYXMgZm9sbG93czoKKyAqIFRoZSBjaGFyYWN0ZXIgJy8nLCB3aGljaCBpcyBpbGxlZ2FsIGluIExpbnV4IGZpbGVuYW1lcyBpcyByZXBsYWNlZAorICogYnkgJzonIHdoaWNoIG5ldmVyIGFwcGVhcnMgaW4gSEZTIGZpbGVuYW1lcy4JIEFsbCBvdGhlciBjaGFyYWN0ZXJzCisgKiBhcmUgcGFzc2VkIHVuY2hhbmdlZCBmcm9tIGlucHV0IHRvIG91dHB1dC4KKyAqLworaW50IGhmc19tYWMydHJpdihjaGFyICpvdXQsIGNvbnN0IHN0cnVjdCBoZnNfbmFtZSAqaW4pCit7CisJY29uc3QgY2hhciAqcDsKKwljaGFyIGM7CisJaW50IGksIGxlbjsKKworCWxlbiA9IGluLT5sZW47CisJcCA9IGluLT5uYW1lOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQljID0gKnArKzsKKwkJKm91dCsrID0gYyA9PSAnLycgPyAnOicgOiBjOworCX0KKwlyZXR1cm4gaTsKK30KKworLyoKKyAqIGhmc190cml2Mm1hYygpCisgKgorICogR2l2ZW4gYW4gQVNDSUkgc3RyaW5nIChub3QgbnVsbC10ZXJtaW5hdGVkKSBhbmQgaXRzIGxlbmd0aCwKKyAqIGdlbmVyYXRlIHRoZSBjb3JyZXNwb25kaW5nIGZpbGVuYW1lIGluIHRoZSBNYWNpbnRvc2ggY2hhcmFjdGVyIHNldAorICogdXNpbmcgdGhlICd0cml2aWFsJyBuYW1lLW1hbmdsaW5nIHNjaGVtZSwgcmV0dXJuaW5nIHRoZSBsZW5ndGggb2YKKyAqIHRoZSBtYW5nbGVkIGZpbGVuYW1lLiAgTm90ZSB0aGF0IHRoZSBvdXRwdXQgc3RyaW5nIGlzIG5vdCBOVUxMCisgKiB0ZXJtaW5hdGVkLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBhIGludmVyc2UgdG8gaGZzX21hYzJ0cml2KCkuCisgKiBBICc6JyBpcyByZXBsYWNlZCBieSBhICcvJy4KKyAqLwordm9pZCBoZnNfdHJpdjJtYWMoc3RydWN0IGhmc19uYW1lICpvdXQsIHN0cnVjdCBxc3RyICppbikKK3sKKwljb25zdCBjaGFyICpzcmM7CisJY2hhciAqZHN0LCBjOworCWludCBpLCBsZW47CisKKwlvdXQtPmxlbiA9IGxlbiA9IG1pbigodW5zaWduZWQgaW50KUhGU19OQU1FTEVOLCBpbi0+bGVuKTsKKwlzcmMgPSBpbi0+bmFtZTsKKwlkc3QgPSBvdXQtPm5hbWU7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWMgPSAqc3JjKys7CisJCSpkc3QrKyA9IGMgPT0gJzonID8gJy8nIDogYzsKKwl9CisJZm9yICg7IGkgPCBIRlNfTkFNRUxFTjsgaSsrKQorCQkqZHN0KysgPSAwOworfQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9NYWtlZmlsZSBiL2ZzL2hmc3BsdXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjMGRmNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmc3BsdXMvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjCisjIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGhmc3BsdXMgZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX0hGU1BMVVNfRlMpICs9IGhmc3BsdXMubworCitoZnNwbHVzLW9ianMgOj0gc3VwZXIubyBvcHRpb25zLm8gaW5vZGUubyBpb2N0bC5vIGV4dGVudHMubyBjYXRhbG9nLm8gZGlyLm8gYnRyZWUubyBcCisJCWJub2RlLm8gYnJlYy5vIGJmaW5kLm8gdGFibGVzLm8gdW5pY29kZS5vIHdyYXBwZXIubyBiaXRtYXAubyBwYXJ0X3RibC5vCisKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvYmZpbmQuYyBiL2ZzL2hmc3BsdXMvYmZpbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTdjZGRlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzcGx1cy9iZmluZC5jCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogIGxpbnV4L2ZzL2hmc3BsdXMvYmZpbmQuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMQorICogQnJhZCBCb3llciAoZmxhckBhbGxhbmRyaWEuY29tKQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICoKKyAqIFNlYXJjaCByb3V0aW5lcyBmb3IgYnRyZWVzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJoZnNwbHVzX2ZzLmgiCisKK2ludCBoZnNfZmluZF9pbml0KHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUsIHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCkKK3sKKwl2b2lkICpwdHI7CisKKwlmZC0+dHJlZSA9IHRyZWU7CisJZmQtPmJub2RlID0gTlVMTDsKKwlwdHIgPSBrbWFsbG9jKHRyZWUtPm1heF9rZXlfbGVuICogMiArIDQsIEdGUF9LRVJORUwpOworCWlmICghcHRyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmZC0+c2VhcmNoX2tleSA9IHB0cjsKKwlmZC0+a2V5ID0gcHRyICsgdHJlZS0+bWF4X2tleV9sZW4gKyAyOworCWRwcmludChEQkdfQk5PREVfUkVGUywgImZpbmRfaW5pdDogJWQgKCVwKVxuIiwgdHJlZS0+Y25pZCwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKwlkb3duKCZ0cmVlLT50cmVlX2xvY2spOworCXJldHVybiAwOworfQorCit2b2lkIGhmc19maW5kX2V4aXQoc3RydWN0IGhmc19maW5kX2RhdGEgKmZkKQoreworCWhmc19ibm9kZV9wdXQoZmQtPmJub2RlKTsKKwlrZnJlZShmZC0+c2VhcmNoX2tleSk7CisJZHByaW50KERCR19CTk9ERV9SRUZTLCAiZmluZF9leGl0OiAlZCAoJXApXG4iLCBmZC0+dHJlZS0+Y25pZCwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKwl1cCgmZmQtPnRyZWUtPnRyZWVfbG9jayk7CisJZmQtPnRyZWUgPSBOVUxMOworfQorCisvKiBGaW5kIHRoZSByZWNvcmQgaW4gYm5vZGUgdGhhdCBiZXN0IG1hdGNoZXMga2V5IChub3QgZ3JlYXRlciB0aGFuLi4uKSovCitpbnQgX19oZnNfYnJlY19maW5kKHN0cnVjdCBoZnNfYm5vZGUgKmJub2RlLCBzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQpCit7CisJaW50IGNtcHZhbDsKKwl1MTYgb2ZmLCBsZW4sIGtleWxlbjsKKwlpbnQgcmVjOworCWludCBiLCBlOworCWludCByZXM7CisKKwliID0gMDsKKwllID0gYm5vZGUtPm51bV9yZWNzIC0gMTsKKwlyZXMgPSAtRU5PRU5UOworCWRvIHsKKwkJcmVjID0gKGUgKyBiKSAvIDI7CisJCWxlbiA9IGhmc19icmVjX2xlbm9mZihibm9kZSwgcmVjLCAmb2ZmKTsKKwkJa2V5bGVuID0gaGZzX2JyZWNfa2V5bGVuKGJub2RlLCByZWMpOworCQloZnNfYm5vZGVfcmVhZChibm9kZSwgZmQtPmtleSwgb2ZmLCBrZXlsZW4pOworCQljbXB2YWwgPSBibm9kZS0+dHJlZS0+a2V5Y21wKGZkLT5rZXksIGZkLT5zZWFyY2hfa2V5KTsKKwkJaWYgKCFjbXB2YWwpIHsKKwkJCWUgPSByZWM7CisJCQlyZXMgPSAwOworCQkJZ290byBkb25lOworCQl9CisJCWlmIChjbXB2YWwgPCAwKQorCQkJYiA9IHJlYyArIDE7CisJCWVsc2UKKwkJCWUgPSByZWMgLSAxOworCX0gd2hpbGUgKGIgPD0gZSk7CisJLy9wcmludGsoIiVkOiAlZCwlZCwlZFxuIiwgYm5vZGUtPnRoaXMsIGIsIGUsIHJlYyk7CisJaWYgKHJlYyAhPSBlICYmIGUgPj0gMCkgeworCQlsZW4gPSBoZnNfYnJlY19sZW5vZmYoYm5vZGUsIGUsICZvZmYpOworCQlrZXlsZW4gPSBoZnNfYnJlY19rZXlsZW4oYm5vZGUsIGUpOworCQloZnNfYm5vZGVfcmVhZChibm9kZSwgZmQtPmtleSwgb2ZmLCBrZXlsZW4pOworCX0KK2RvbmU6CisJZmQtPnJlY29yZCA9IGU7CisJZmQtPmtleW9mZnNldCA9IG9mZjsKKwlmZC0+a2V5bGVuZ3RoID0ga2V5bGVuOworCWZkLT5lbnRyeW9mZnNldCA9IG9mZiArIGtleWxlbjsKKwlmZC0+ZW50cnlsZW5ndGggPSBsZW4gLSBrZXlsZW47CisJcmV0dXJuIHJlczsKK30KKworLyogVHJhdmVyc2UgYSBCKlRyZWUgZnJvbSB0aGUgcm9vdCB0byBhIGxlYWYgZmluZGluZyBiZXN0IGZpdCB0byBrZXkgKi8KKy8qIFJldHVybiBhbGxvY2F0ZWQgY29weSBvZiBub2RlIGZvdW5kLCBzZXQgcmVjbnVtIHRvIGJlc3QgcmVjb3JkICovCitpbnQgaGZzX2JyZWNfZmluZChzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQpCit7CisJc3RydWN0IGhmc19idHJlZSAqdHJlZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlICpibm9kZTsKKwl1MzIgbmlkeCwgcGFyZW50OworCV9fYmUzMiBkYXRhOworCWludCBoZWlnaHQsIHJlczsKKworCXRyZWUgPSBmZC0+dHJlZTsKKwlpZiAoZmQtPmJub2RlKQorCQloZnNfYm5vZGVfcHV0KGZkLT5ibm9kZSk7CisJZmQtPmJub2RlID0gTlVMTDsKKwluaWR4ID0gdHJlZS0+cm9vdDsKKwlpZiAoIW5pZHgpCisJCXJldHVybiAtRU5PRU5UOworCWhlaWdodCA9IHRyZWUtPmRlcHRoOworCXJlcyA9IDA7CisJcGFyZW50ID0gMDsKKwlmb3IgKDs7KSB7CisJCWJub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbmlkeCk7CisJCWlmIChJU19FUlIoYm5vZGUpKSB7CisJCQlyZXMgPSBQVFJfRVJSKGJub2RlKTsKKwkJCWJub2RlID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChibm9kZS0+aGVpZ2h0ICE9IGhlaWdodCkKKwkJCWdvdG8gaW52YWxpZDsKKwkJaWYgKGJub2RlLT50eXBlICE9ICgtLWhlaWdodCA/IEhGU19OT0RFX0lOREVYIDogSEZTX05PREVfTEVBRikpCisJCQlnb3RvIGludmFsaWQ7CisJCWJub2RlLT5wYXJlbnQgPSBwYXJlbnQ7CisKKwkJcmVzID0gX19oZnNfYnJlY19maW5kKGJub2RlLCBmZCk7CisJCWlmICghaGVpZ2h0KQorCQkJYnJlYWs7CisJCWlmIChmZC0+cmVjb3JkIDwgMCkKKwkJCWdvdG8gcmVsZWFzZTsKKworCQlwYXJlbnQgPSBuaWR4OworCQloZnNfYm5vZGVfcmVhZChibm9kZSwgJmRhdGEsIGZkLT5lbnRyeW9mZnNldCwgNCk7CisJCW5pZHggPSBiZTMyX3RvX2NwdShkYXRhKTsKKwkJaGZzX2Jub2RlX3B1dChibm9kZSk7CisJfQorCWZkLT5ibm9kZSA9IGJub2RlOworCXJldHVybiByZXM7CisKK2ludmFsaWQ6CisJcHJpbnRrKCJIRlMrLWZzOiBpbmNvbnNpc3RlbmN5IGluIEIqVHJlZSAoJWQsJWQsJWQsJXUsJXUpXG4iLAorCQloZWlnaHQsIGJub2RlLT5oZWlnaHQsIGJub2RlLT50eXBlLCBuaWR4LCBwYXJlbnQpOworCXJlcyA9IC1FSU87CityZWxlYXNlOgorCWhmc19ibm9kZV9wdXQoYm5vZGUpOworCXJldHVybiByZXM7Cit9CisKK2ludCBoZnNfYnJlY19yZWFkKHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCwgdm9pZCAqcmVjLCBpbnQgcmVjX2xlbikKK3sKKwlpbnQgcmVzOworCisJcmVzID0gaGZzX2JyZWNfZmluZChmZCk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKwlpZiAoZmQtPmVudHJ5bGVuZ3RoID4gcmVjX2xlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaGZzX2Jub2RlX3JlYWQoZmQtPmJub2RlLCByZWMsIGZkLT5lbnRyeW9mZnNldCwgZmQtPmVudHJ5bGVuZ3RoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGhmc19icmVjX2dvdG8oc3RydWN0IGhmc19maW5kX2RhdGEgKmZkLCBpbnQgY250KQoreworCXN0cnVjdCBoZnNfYnRyZWUgKnRyZWU7CisJc3RydWN0IGhmc19ibm9kZSAqYm5vZGU7CisJaW50IGlkeCwgcmVzID0gMDsKKwl1MTYgb2ZmLCBsZW4sIGtleWxlbjsKKworCWJub2RlID0gZmQtPmJub2RlOworCXRyZWUgPSBibm9kZS0+dHJlZTsKKworCWlmIChjbnQgPCAwKSB7CisJCWNudCA9IC1jbnQ7CisJCXdoaWxlIChjbnQgPiBmZC0+cmVjb3JkKSB7CisJCQljbnQgLT0gZmQtPnJlY29yZCArIDE7CisJCQlmZC0+cmVjb3JkID0gYm5vZGUtPm51bV9yZWNzIC0gMTsKKwkJCWlkeCA9IGJub2RlLT5wcmV2OworCQkJaWYgKCFpZHgpIHsKKwkJCQlyZXMgPSAtRU5PRU5UOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaGZzX2Jub2RlX3B1dChibm9kZSk7CisJCQlibm9kZSA9IGhmc19ibm9kZV9maW5kKHRyZWUsIGlkeCk7CisJCQlpZiAoSVNfRVJSKGJub2RlKSkgeworCQkJCXJlcyA9IFBUUl9FUlIoYm5vZGUpOworCQkJCWJub2RlID0gTlVMTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlmZC0+cmVjb3JkIC09IGNudDsKKwl9IGVsc2UgeworCQl3aGlsZSAoY250ID49IGJub2RlLT5udW1fcmVjcyAtIGZkLT5yZWNvcmQpIHsKKwkJCWNudCAtPSBibm9kZS0+bnVtX3JlY3MgLSBmZC0+cmVjb3JkOworCQkJZmQtPnJlY29yZCA9IDA7CisJCQlpZHggPSBibm9kZS0+bmV4dDsKKwkJCWlmICghaWR4KSB7CisJCQkJcmVzID0gLUVOT0VOVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWhmc19ibm9kZV9wdXQoYm5vZGUpOworCQkJYm5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBpZHgpOworCQkJaWYgKElTX0VSUihibm9kZSkpIHsKKwkJCQlyZXMgPSBQVFJfRVJSKGJub2RlKTsKKwkJCQlibm9kZSA9IE5VTEw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJZmQtPnJlY29yZCArPSBjbnQ7CisJfQorCisJbGVuID0gaGZzX2JyZWNfbGVub2ZmKGJub2RlLCBmZC0+cmVjb3JkLCAmb2ZmKTsKKwlrZXlsZW4gPSBoZnNfYnJlY19rZXlsZW4oYm5vZGUsIGZkLT5yZWNvcmQpOworCWZkLT5rZXlvZmZzZXQgPSBvZmY7CisJZmQtPmtleWxlbmd0aCA9IGtleWxlbjsKKwlmZC0+ZW50cnlvZmZzZXQgPSBvZmYgKyBrZXlsZW47CisJZmQtPmVudHJ5bGVuZ3RoID0gbGVuIC0ga2V5bGVuOworCWhmc19ibm9kZV9yZWFkKGJub2RlLCBmZC0+a2V5LCBvZmYsIGtleWxlbik7CitvdXQ6CisJZmQtPmJub2RlID0gYm5vZGU7CisJcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvYml0bWFwLmMgYi9mcy9oZnNwbHVzL2JpdG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZDMxNjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9oZnNwbHVzL2JpdG1hcC5jCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogIGxpbnV4L2ZzL2hmc3BsdXMvYml0bWFwLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEKKyAqIEJyYWQgQm95ZXIgKGZsYXJAYWxsYW5kcmlhLmNvbSkKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqCisgKiBIYW5kbGluZyBvZiBhbGxvY2F0aW9uIGZpbGUKKyAqLworCisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorCisjaW5jbHVkZSAiaGZzcGx1c19mcy5oIgorI2luY2x1ZGUgImhmc3BsdXNfcmF3LmgiCisKKyNkZWZpbmUgUEFHRV9DQUNIRV9CSVRTCShQQUdFX0NBQ0hFX1NJWkUgKiA4KQorCitpbnQgaGZzcGx1c19ibG9ja19hbGxvY2F0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MzIgc2l6ZSwgdTMyIG9mZnNldCwgdTMyICptYXgpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJX19iZTMyICpwcHRyLCAqY3VyciwgKmVuZDsKKwl1MzIgbWFzaywgc3RhcnQsIGxlbiwgbjsKKwlfX2JlMzIgdmFsOworCWludCBpOworCisJbGVuID0gKm1heDsKKwlpZiAoIWxlbikKKwkJcmV0dXJuIHNpemU7CisKKwlkcHJpbnQoREJHX0JJVE1BUCwgImJsb2NrX2FsbG9jYXRlOiAldSwldSwldVxuIiwgc2l6ZSwgb2Zmc2V0LCBsZW4pOworCWRvd24oJkhGU1BMVVNfU0Ioc2IpLmFsbG9jX2ZpbGUtPmlfc2VtKTsKKwltYXBwaW5nID0gSEZTUExVU19TQihzYikuYWxsb2NfZmlsZS0+aV9tYXBwaW5nOworCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgb2Zmc2V0IC8gUEFHRV9DQUNIRV9CSVRTLAorCQkJICAgICAgIChmaWxsZXJfdCAqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisJcHB0ciA9IGttYXAocGFnZSk7CisJY3VyciA9IHBwdHIgKyAob2Zmc2V0ICYgKFBBR0VfQ0FDSEVfQklUUyAtIDEpKSAvIDMyOworCWkgPSBvZmZzZXQgJSAzMjsKKwlvZmZzZXQgJj0gfihQQUdFX0NBQ0hFX0JJVFMgLSAxKTsKKwlpZiAoKHNpemUgXiBvZmZzZXQpIC8gUEFHRV9DQUNIRV9CSVRTKQorCQllbmQgPSBwcHRyICsgUEFHRV9DQUNIRV9CSVRTIC8gMzI7CisJZWxzZQorCQllbmQgPSBwcHRyICsgKChzaXplICsgMzEpICYgKFBBR0VfQ0FDSEVfQklUUyAtIDEpKSAvIDMyOworCisJLyogc2NhbiB0aGUgZmlyc3QgcGFydGlhbCB1MzIgZm9yIHplcm8gYml0cyAqLworCXZhbCA9ICpjdXJyOworCWlmICh+dmFsKSB7CisJCW4gPSBiZTMyX3RvX2NwdSh2YWwpOworCQltYXNrID0gKDFVIDw8IDMxKSA+PiBpOworCQlmb3IgKDsgaSA8IDMyOyBtYXNrID4+PSAxLCBpKyspIHsKKwkJCWlmICghKG4gJiBtYXNrKSkKKwkJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCWN1cnIrKzsKKworCS8qIHNjYW4gY29tcGxldGUgdTMycyBmb3IgdGhlIGZpcnN0IHplcm8gYml0ICovCisJd2hpbGUgKDEpIHsKKwkJd2hpbGUgKGN1cnIgPCBlbmQpIHsKKwkJCXZhbCA9ICpjdXJyOworCQkJaWYgKH52YWwpIHsKKwkJCQluID0gYmUzMl90b19jcHUodmFsKTsKKwkJCQltYXNrID0gMSA8PCAzMTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgMzI7IG1hc2sgPj49IDEsIGkrKykgeworCQkJCQlpZiAoIShuICYgbWFzaykpCisJCQkJCQlnb3RvIGZvdW5kOworCQkJCX0KKwkJCX0KKwkJCWN1cnIrKzsKKwkJfQorCQlrdW5tYXAocGFnZSk7CisJCW9mZnNldCArPSBQQUdFX0NBQ0hFX0JJVFM7CisJCWlmIChvZmZzZXQgPj0gc2l6ZSkKKwkJCWJyZWFrOworCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIG9mZnNldCAvIFBBR0VfQ0FDSEVfQklUUywKKwkJCQkgICAgICAgKGZpbGxlcl90ICopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwkJY3VyciA9IHBwdHIgPSBrbWFwKHBhZ2UpOworCQlpZiAoKHNpemUgXiBvZmZzZXQpIC8gUEFHRV9DQUNIRV9CSVRTKQorCQkJZW5kID0gcHB0ciArIFBBR0VfQ0FDSEVfQklUUyAvIDMyOworCQllbHNlCisJCQllbmQgPSBwcHRyICsgKChzaXplICsgMzEpICYgKFBBR0VfQ0FDSEVfQklUUyAtIDEpKSAvIDMyOworCX0KKwlkcHJpbnQoREJHX0JJVE1BUCwgImJpdG1hcCBmdWxsXG4iKTsKKwlzdGFydCA9IHNpemU7CisJZ290byBvdXQ7CisKK2ZvdW5kOgorCXN0YXJ0ID0gb2Zmc2V0ICsgKGN1cnIgLSBwcHRyKSAqIDMyICsgaTsKKwlpZiAoc3RhcnQgPj0gc2l6ZSkgeworCQlkcHJpbnQoREJHX0JJVE1BUCwgImJpdG1hcCBmdWxsXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCS8qIGRvIGFueSBwYXJ0aWFsIHUzMiBhdCB0aGUgc3RhcnQgKi8KKwlsZW4gPSBtaW4oc2l6ZSAtIHN0YXJ0LCBsZW4pOworCXdoaWxlICgxKSB7CisJCW4gfD0gbWFzazsKKwkJaWYgKCsraSA+PSAzMikKKwkJCWJyZWFrOworCQltYXNrID4+PSAxOworCQlpZiAoIS0tbGVuIHx8IG4gJiBtYXNrKQorCQkJZ290byBkb25lOworCX0KKwlpZiAoIS0tbGVuKQorCQlnb3RvIGRvbmU7CisJKmN1cnIrKyA9IGNwdV90b19iZTMyKG4pOworCS8qIGRvIGZ1bGwgdTMycyAqLworCXdoaWxlICgxKSB7CisJCXdoaWxlIChjdXJyIDwgZW5kKSB7CisJCQluID0gYmUzMl90b19jcHUoKmN1cnIpOworCQkJaWYgKGxlbiA8IDMyKQorCQkJCWdvdG8gbGFzdDsKKwkJCWlmIChuKSB7CisJCQkJbGVuID0gMzI7CisJCQkJZ290byBsYXN0OworCQkJfQorCQkJKmN1cnIrKyA9IGNwdV90b19iZTMyKDB4ZmZmZmZmZmYpOworCQkJbGVuIC09IDMyOworCQl9CisJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCQlrdW5tYXAocGFnZSk7CisJCW9mZnNldCArPSBQQUdFX0NBQ0hFX0JJVFM7CisJCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgb2Zmc2V0IC8gUEFHRV9DQUNIRV9CSVRTLAorCQkJCSAgICAgICAoZmlsbGVyX3QgKiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOworCQlwcHRyID0ga21hcChwYWdlKTsKKwkJY3VyciA9IHBwdHI7CisJCWVuZCA9IHBwdHIgKyBQQUdFX0NBQ0hFX0JJVFMgLyAzMjsKKwl9CitsYXN0OgorCS8qIGRvIGFueSBwYXJ0aWFsIHUzMiBhdCBlbmQgKi8KKwltYXNrID0gMVUgPDwgMzE7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmIChuICYgbWFzaykKKwkJCWJyZWFrOworCQluIHw9IG1hc2s7CisJCW1hc2sgPj49IDE7CisJfQorZG9uZToKKwkqY3VyciA9IGNwdV90b19iZTMyKG4pOworCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwkqbWF4ID0gb2Zmc2V0ICsgKGN1cnIgLSBwcHRyKSAqIDMyICsgaSAtIHN0YXJ0OworCUhGU1BMVVNfU0Ioc2IpLmZyZWVfYmxvY2tzIC09ICptYXg7CisJc2ItPnNfZGlydCA9IDE7CisJZHByaW50KERCR19CSVRNQVAsICItPiAldSwldVxuIiwgc3RhcnQsICptYXgpOworb3V0OgorCXVwKCZIRlNQTFVTX1NCKHNiKS5hbGxvY19maWxlLT5pX3NlbSk7CisJcmV0dXJuIHN0YXJ0OworfQorCitpbnQgaGZzcGx1c19ibG9ja19mcmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHUzMiBvZmZzZXQsIHUzMiBjb3VudCkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlfX2JlMzIgKnBwdHIsICpjdXJyLCAqZW5kOworCXUzMiBtYXNrLCBsZW4sIHBucjsKKwlpbnQgaTsKKworCS8qIGlzIHRoZXJlIGFueSBhY3R1YWwgd29yayB0byBiZSBkb25lPyAqLworCWlmICghY291bnQpCisJCXJldHVybiAwOworCisJZHByaW50KERCR19CSVRNQVAsICJibG9ja19mcmVlOiAldSwldVxuIiwgb2Zmc2V0LCBjb3VudCk7CisJLyogYXJlIGFsbCBvZiB0aGUgYml0cyBpbiByYW5nZT8gKi8KKwlpZiAoKG9mZnNldCArIGNvdW50KSA+IEhGU1BMVVNfU0Ioc2IpLnRvdGFsX2Jsb2NrcykKKwkJcmV0dXJuIC0yOworCisJZG93bigmSEZTUExVU19TQihzYikuYWxsb2NfZmlsZS0+aV9zZW0pOworCW1hcHBpbmcgPSBIRlNQTFVTX1NCKHNiKS5hbGxvY19maWxlLT5pX21hcHBpbmc7CisJcG5yID0gb2Zmc2V0IC8gUEFHRV9DQUNIRV9CSVRTOworCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgcG5yLCAoZmlsbGVyX3QgKiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOworCXBwdHIgPSBrbWFwKHBhZ2UpOworCWN1cnIgPSBwcHRyICsgKG9mZnNldCAmIChQQUdFX0NBQ0hFX0JJVFMgLSAxKSkgLyAzMjsKKwllbmQgPSBwcHRyICsgUEFHRV9DQUNIRV9CSVRTIC8gMzI7CisJbGVuID0gY291bnQ7CisKKwkvKiBkbyBhbnkgcGFydGlhbCB1MzIgYXQgdGhlIHN0YXJ0ICovCisJaSA9IG9mZnNldCAlIDMyOworCWlmIChpKSB7CisJCWludCBqID0gMzIgLSBpOworCQltYXNrID0gMHhmZmZmZmZmZlUgPDwgajsKKwkJaWYgKGogPiBjb3VudCkgeworCQkJbWFzayB8PSAweGZmZmZmZmZmVSA+PiAoaSArIGNvdW50KTsKKwkJCSpjdXJyKysgJj0gY3B1X3RvX2JlMzIobWFzayk7CisJCQlnb3RvIG91dDsKKwkJfQorCQkqY3VycisrICY9IGNwdV90b19iZTMyKG1hc2spOworCQljb3VudCAtPSBqOworCX0KKworCS8qIGRvIGZ1bGwgdTMycyAqLworCXdoaWxlICgxKSB7CisJCXdoaWxlIChjdXJyIDwgZW5kKSB7CisJCQlpZiAoY291bnQgPCAzMikKKwkJCQlnb3RvIGRvbmU7CisJCQkqY3VycisrID0gMDsKKwkJCWNvdW50IC09IDMyOworCQl9CisJCWlmICghY291bnQpCisJCQlicmVhazsKKwkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCWt1bm1hcChwYWdlKTsKKwkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCArK3BuciwgKGZpbGxlcl90ICopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwkJcHB0ciA9IGttYXAocGFnZSk7CisJCWN1cnIgPSBwcHRyOworCQllbmQgPSBwcHRyICsgUEFHRV9DQUNIRV9CSVRTIC8gMzI7CisJfQorZG9uZToKKwkvKiBkbyBhbnkgcGFydGlhbCB1MzIgYXQgZW5kICovCisJaWYgKGNvdW50KSB7CisJCW1hc2sgPSAweGZmZmZmZmZmVSA+PiBjb3VudDsKKwkJKmN1cnIgJj0gY3B1X3RvX2JlMzIobWFzayk7CisJfQorb3V0OgorCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwlIRlNQTFVTX1NCKHNiKS5mcmVlX2Jsb2NrcyArPSBsZW47CisJc2ItPnNfZGlydCA9IDE7CisJdXAoJkhGU1BMVVNfU0Ioc2IpLmFsbG9jX2ZpbGUtPmlfc2VtKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9ibm9kZS5jIGIvZnMvaGZzcGx1cy9ibm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2Nzg3MmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9oZnNwbHVzL2Jub2RlLmMKQEAgLTAsMCArMSw2NjIgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzcGx1cy9ibm9kZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxCisgKiBCcmFkIEJveWVyIChmbGFyQGFsbGFuZHJpYS5jb20pCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKgorICogSGFuZGxlIGJhc2ljIGJ0cmVlIG5vZGUgb3BlcmF0aW9ucworICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgImhmc3BsdXNfZnMuaCIKKyNpbmNsdWRlICJoZnNwbHVzX3Jhdy5oIgorCisjZGVmaW5lIFJFRl9QQUdFUwkwCisKKy8qIENvcHkgYSBzcGVjaWZpZWQgcmFuZ2Ugb2YgYnl0ZXMgZnJvbSB0aGUgcmF3IGRhdGEgb2YgYSBub2RlICovCit2b2lkIGhmc19ibm9kZV9yZWFkKHN0cnVjdCBoZnNfYm5vZGUgKm5vZGUsIHZvaWQgKmJ1ZiwgaW50IG9mZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VwOworCWludCBsOworCisJb2ZmICs9IG5vZGUtPnBhZ2Vfb2Zmc2V0OworCXBhZ2VwID0gbm9kZS0+cGFnZSArIChvZmYgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJb2ZmICY9IH5QQUdFX0NBQ0hFX01BU0s7CisKKwlsID0gbWluKGxlbiwgKGludClQQUdFX0NBQ0hFX1NJWkUgLSBvZmYpOworCW1lbWNweShidWYsIGttYXAoKnBhZ2VwKSArIG9mZiwgbCk7CisJa3VubWFwKCpwYWdlcCk7CisKKwl3aGlsZSAoKGxlbiAtPSBsKSAhPSAwKSB7CisJCWJ1ZiArPSBsOworCQlsID0gbWluKGxlbiwgKGludClQQUdFX0NBQ0hFX1NJWkUpOworCQltZW1jcHkoYnVmLCBrbWFwKCorK3BhZ2VwKSwgbCk7CisJCWt1bm1hcCgqcGFnZXApOworCX0KK30KKwordTE2IGhmc19ibm9kZV9yZWFkX3UxNihzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCBpbnQgb2ZmKQoreworCV9fYmUxNiBkYXRhOworCS8vIG9wdGltaXplIGxhdGVyLi4uCisJaGZzX2Jub2RlX3JlYWQobm9kZSwgJmRhdGEsIG9mZiwgMik7CisJcmV0dXJuIGJlMTZfdG9fY3B1KGRhdGEpOworfQorCit1OCBoZnNfYm5vZGVfcmVhZF91OChzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCBpbnQgb2ZmKQoreworCXU4IGRhdGE7CisJLy8gb3B0aW1pemUgbGF0ZXIuLi4KKwloZnNfYm5vZGVfcmVhZChub2RlLCAmZGF0YSwgb2ZmLCAxKTsKKwlyZXR1cm4gZGF0YTsKK30KKwordm9pZCBoZnNfYm5vZGVfcmVhZF9rZXkoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgdm9pZCAqa2V5LCBpbnQgb2ZmKQoreworCXN0cnVjdCBoZnNfYnRyZWUgKnRyZWU7CisJaW50IGtleV9sZW47CisKKwl0cmVlID0gbm9kZS0+dHJlZTsKKwlpZiAobm9kZS0+dHlwZSA9PSBIRlNfTk9ERV9MRUFGIHx8CisJICAgIHRyZWUtPmF0dHJpYnV0ZXMgJiBIRlNfVFJFRV9WQVJJRFhLRVlTKQorCQlrZXlfbGVuID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIG9mZikgKyAyOworCWVsc2UKKwkJa2V5X2xlbiA9IHRyZWUtPm1heF9rZXlfbGVuICsgMjsKKworCWhmc19ibm9kZV9yZWFkKG5vZGUsIGtleSwgb2ZmLCBrZXlfbGVuKTsKK30KKwordm9pZCBoZnNfYm5vZGVfd3JpdGUoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgdm9pZCAqYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQoreworCXN0cnVjdCBwYWdlICoqcGFnZXA7CisJaW50IGw7CisKKwlvZmYgKz0gbm9kZS0+cGFnZV9vZmZzZXQ7CisJcGFnZXAgPSBub2RlLT5wYWdlICsgKG9mZiA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwlvZmYgJj0gflBBR0VfQ0FDSEVfTUFTSzsKKworCWwgPSBtaW4obGVuLCAoaW50KVBBR0VfQ0FDSEVfU0laRSAtIG9mZik7CisJbWVtY3B5KGttYXAoKnBhZ2VwKSArIG9mZiwgYnVmLCBsKTsKKwlzZXRfcGFnZV9kaXJ0eSgqcGFnZXApOworCWt1bm1hcCgqcGFnZXApOworCisJd2hpbGUgKChsZW4gLT0gbCkgIT0gMCkgeworCQlidWYgKz0gbDsKKwkJbCA9IG1pbihsZW4sIChpbnQpUEFHRV9DQUNIRV9TSVpFKTsKKwkJbWVtY3B5KGttYXAoKisrcGFnZXApLCBidWYsIGwpOworCQlzZXRfcGFnZV9kaXJ0eSgqcGFnZXApOworCQlrdW5tYXAoKnBhZ2VwKTsKKwl9Cit9CisKK3ZvaWQgaGZzX2Jub2RlX3dyaXRlX3UxNihzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCBpbnQgb2ZmLCB1MTYgZGF0YSkKK3sKKwlfX2JlMTYgdiA9IGNwdV90b19iZTE2KGRhdGEpOworCS8vIG9wdGltaXplIGxhdGVyLi4uCisJaGZzX2Jub2RlX3dyaXRlKG5vZGUsICZ2LCBvZmYsIDIpOworfQorCit2b2lkIGhmc19ibm9kZV9jbGVhcihzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCBpbnQgb2ZmLCBpbnQgbGVuKQoreworCXN0cnVjdCBwYWdlICoqcGFnZXA7CisJaW50IGw7CisKKwlvZmYgKz0gbm9kZS0+cGFnZV9vZmZzZXQ7CisJcGFnZXAgPSBub2RlLT5wYWdlICsgKG9mZiA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwlvZmYgJj0gflBBR0VfQ0FDSEVfTUFTSzsKKworCWwgPSBtaW4obGVuLCAoaW50KVBBR0VfQ0FDSEVfU0laRSAtIG9mZik7CisJbWVtc2V0KGttYXAoKnBhZ2VwKSArIG9mZiwgMCwgbCk7CisJc2V0X3BhZ2VfZGlydHkoKnBhZ2VwKTsKKwlrdW5tYXAoKnBhZ2VwKTsKKworCXdoaWxlICgobGVuIC09IGwpICE9IDApIHsKKwkJbCA9IG1pbihsZW4sIChpbnQpUEFHRV9DQUNIRV9TSVpFKTsKKwkJbWVtc2V0KGttYXAoKisrcGFnZXApLCAwLCBsKTsKKwkJc2V0X3BhZ2VfZGlydHkoKnBhZ2VwKTsKKwkJa3VubWFwKCpwYWdlcCk7CisJfQorfQorCit2b2lkIGhmc19ibm9kZV9jb3B5KHN0cnVjdCBoZnNfYm5vZGUgKmRzdF9ub2RlLCBpbnQgZHN0LAorCQkgICAgc3RydWN0IGhmc19ibm9kZSAqc3JjX25vZGUsIGludCBzcmMsIGludCBsZW4pCit7CisJc3RydWN0IGhmc19idHJlZSAqdHJlZTsKKwlzdHJ1Y3QgcGFnZSAqKnNyY19wYWdlLCAqKmRzdF9wYWdlOworCWludCBsOworCisJZHByaW50KERCR19CTk9ERV9NT0QsICJjb3B5Ynl0ZXM6ICV1LCV1LCV1XG4iLCBkc3QsIHNyYywgbGVuKTsKKwlpZiAoIWxlbikKKwkJcmV0dXJuOworCXRyZWUgPSBzcmNfbm9kZS0+dHJlZTsKKwlzcmMgKz0gc3JjX25vZGUtPnBhZ2Vfb2Zmc2V0OworCWRzdCArPSBkc3Rfbm9kZS0+cGFnZV9vZmZzZXQ7CisJc3JjX3BhZ2UgPSBzcmNfbm9kZS0+cGFnZSArIChzcmMgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJc3JjICY9IH5QQUdFX0NBQ0hFX01BU0s7CisJZHN0X3BhZ2UgPSBkc3Rfbm9kZS0+cGFnZSArIChkc3QgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJZHN0ICY9IH5QQUdFX0NBQ0hFX01BU0s7CisKKwlpZiAoc3JjID09IGRzdCkgeworCQlsID0gbWluKGxlbiwgKGludClQQUdFX0NBQ0hFX1NJWkUgLSBzcmMpOworCQltZW1jcHkoa21hcCgqZHN0X3BhZ2UpICsgc3JjLCBrbWFwKCpzcmNfcGFnZSkgKyBzcmMsIGwpOworCQlrdW5tYXAoKnNyY19wYWdlKTsKKwkJc2V0X3BhZ2VfZGlydHkoKmRzdF9wYWdlKTsKKwkJa3VubWFwKCpkc3RfcGFnZSk7CisKKwkJd2hpbGUgKChsZW4gLT0gbCkgIT0gMCkgeworCQkJbCA9IG1pbihsZW4sIChpbnQpUEFHRV9DQUNIRV9TSVpFKTsKKwkJCW1lbWNweShrbWFwKCorK2RzdF9wYWdlKSwga21hcCgqKytzcmNfcGFnZSksIGwpOworCQkJa3VubWFwKCpzcmNfcGFnZSk7CisJCQlzZXRfcGFnZV9kaXJ0eSgqZHN0X3BhZ2UpOworCQkJa3VubWFwKCpkc3RfcGFnZSk7CisJCX0KKwl9IGVsc2UgeworCQl2b2lkICpzcmNfcHRyLCAqZHN0X3B0cjsKKworCQlkbyB7CisJCQlzcmNfcHRyID0ga21hcCgqc3JjX3BhZ2UpICsgc3JjOworCQkJZHN0X3B0ciA9IGttYXAoKmRzdF9wYWdlKSArIGRzdDsKKwkJCWlmIChQQUdFX0NBQ0hFX1NJWkUgLSBzcmMgPCBQQUdFX0NBQ0hFX1NJWkUgLSBkc3QpIHsKKwkJCQlsID0gUEFHRV9DQUNIRV9TSVpFIC0gc3JjOworCQkJCXNyYyA9IDA7CisJCQkJZHN0ICs9IGw7CisJCQl9IGVsc2UgeworCQkJCWwgPSBQQUdFX0NBQ0hFX1NJWkUgLSBkc3Q7CisJCQkJc3JjICs9IGw7CisJCQkJZHN0ID0gMDsKKwkJCX0KKwkJCWwgPSBtaW4obGVuLCBsKTsKKwkJCW1lbWNweShkc3RfcHRyLCBzcmNfcHRyLCBsKTsKKwkJCWt1bm1hcCgqc3JjX3BhZ2UpOworCQkJc2V0X3BhZ2VfZGlydHkoKmRzdF9wYWdlKTsKKwkJCWt1bm1hcCgqZHN0X3BhZ2UpOworCQkJaWYgKCFkc3QpCisJCQkJZHN0X3BhZ2UrKzsKKwkJCWVsc2UKKwkJCQlzcmNfcGFnZSsrOworCQl9IHdoaWxlICgobGVuIC09IGwpKTsKKwl9Cit9CisKK3ZvaWQgaGZzX2Jub2RlX21vdmUoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgaW50IGRzdCwgaW50IHNyYywgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcGFnZSAqKnNyY19wYWdlLCAqKmRzdF9wYWdlOworCWludCBsOworCisJZHByaW50KERCR19CTk9ERV9NT0QsICJtb3ZlYnl0ZXM6ICV1LCV1LCV1XG4iLCBkc3QsIHNyYywgbGVuKTsKKwlpZiAoIWxlbikKKwkJcmV0dXJuOworCXNyYyArPSBub2RlLT5wYWdlX29mZnNldDsKKwlkc3QgKz0gbm9kZS0+cGFnZV9vZmZzZXQ7CisJaWYgKGRzdCA+IHNyYykgeworCQlzcmMgKz0gbGVuIC0gMTsKKwkJc3JjX3BhZ2UgPSBub2RlLT5wYWdlICsgKHNyYyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJc3JjID0gKHNyYyAmIH5QQUdFX0NBQ0hFX01BU0spICsgMTsKKwkJZHN0ICs9IGxlbiAtIDE7CisJCWRzdF9wYWdlID0gbm9kZS0+cGFnZSArIChkc3QgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJCWRzdCA9IChkc3QgJiB+UEFHRV9DQUNIRV9NQVNLKSArIDE7CisKKwkJaWYgKHNyYyA9PSBkc3QpIHsKKwkJCXdoaWxlIChzcmMgPCBsZW4pIHsKKwkJCQltZW1tb3ZlKGttYXAoKmRzdF9wYWdlKSwga21hcCgqc3JjX3BhZ2UpLCBzcmMpOworCQkJCWt1bm1hcCgqc3JjX3BhZ2UpOworCQkJCXNldF9wYWdlX2RpcnR5KCpkc3RfcGFnZSk7CisJCQkJa3VubWFwKCpkc3RfcGFnZSk7CisJCQkJbGVuIC09IHNyYzsKKwkJCQlzcmMgPSBQQUdFX0NBQ0hFX1NJWkU7CisJCQkJc3JjX3BhZ2UtLTsKKwkJCQlkc3RfcGFnZS0tOworCQkJfQorCQkJc3JjIC09IGxlbjsKKwkJCW1lbW1vdmUoa21hcCgqZHN0X3BhZ2UpICsgc3JjLCBrbWFwKCpzcmNfcGFnZSkgKyBzcmMsIGxlbik7CisJCQlrdW5tYXAoKnNyY19wYWdlKTsKKwkJCXNldF9wYWdlX2RpcnR5KCpkc3RfcGFnZSk7CisJCQlrdW5tYXAoKmRzdF9wYWdlKTsKKwkJfSBlbHNlIHsKKwkJCXZvaWQgKnNyY19wdHIsICpkc3RfcHRyOworCisJCQlkbyB7CisJCQkJc3JjX3B0ciA9IGttYXAoKnNyY19wYWdlKSArIHNyYzsKKwkJCQlkc3RfcHRyID0ga21hcCgqZHN0X3BhZ2UpICsgZHN0OworCQkJCWlmIChzcmMgPCBkc3QpIHsKKwkJCQkJbCA9IHNyYzsKKwkJCQkJc3JjID0gUEFHRV9DQUNIRV9TSVpFOworCQkJCQlkc3QgLT0gbDsKKwkJCQl9IGVsc2UgeworCQkJCQlsID0gZHN0OworCQkJCQlzcmMgLT0gbDsKKwkJCQkJZHN0ID0gUEFHRV9DQUNIRV9TSVpFOworCQkJCX0KKwkJCQlsID0gbWluKGxlbiwgbCk7CisJCQkJbWVtbW92ZShkc3RfcHRyIC0gbCwgc3JjX3B0ciAtIGwsIGwpOworCQkJCWt1bm1hcCgqc3JjX3BhZ2UpOworCQkJCXNldF9wYWdlX2RpcnR5KCpkc3RfcGFnZSk7CisJCQkJa3VubWFwKCpkc3RfcGFnZSk7CisJCQkJaWYgKGRzdCA9PSBQQUdFX0NBQ0hFX1NJWkUpCisJCQkJCWRzdF9wYWdlLS07CisJCQkJZWxzZQorCQkJCQlzcmNfcGFnZS0tOworCQkJfSB3aGlsZSAoKGxlbiAtPSBsKSk7CisJCX0KKwl9IGVsc2UgeworCQlzcmNfcGFnZSA9IG5vZGUtPnBhZ2UgKyAoc3JjID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCQlzcmMgJj0gflBBR0VfQ0FDSEVfTUFTSzsKKwkJZHN0X3BhZ2UgPSBub2RlLT5wYWdlICsgKGRzdCA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJZHN0ICY9IH5QQUdFX0NBQ0hFX01BU0s7CisKKwkJaWYgKHNyYyA9PSBkc3QpIHsKKwkJCWwgPSBtaW4obGVuLCAoaW50KVBBR0VfQ0FDSEVfU0laRSAtIHNyYyk7CisJCQltZW1tb3ZlKGttYXAoKmRzdF9wYWdlKSArIHNyYywga21hcCgqc3JjX3BhZ2UpICsgc3JjLCBsKTsKKwkJCWt1bm1hcCgqc3JjX3BhZ2UpOworCQkJc2V0X3BhZ2VfZGlydHkoKmRzdF9wYWdlKTsKKwkJCWt1bm1hcCgqZHN0X3BhZ2UpOworCisJCQl3aGlsZSAoKGxlbiAtPSBsKSAhPSAwKSB7CisJCQkJbCA9IG1pbihsZW4sIChpbnQpUEFHRV9DQUNIRV9TSVpFKTsKKwkJCQltZW1tb3ZlKGttYXAoKisrZHN0X3BhZ2UpLCBrbWFwKCorK3NyY19wYWdlKSwgbCk7CisJCQkJa3VubWFwKCpzcmNfcGFnZSk7CisJCQkJc2V0X3BhZ2VfZGlydHkoKmRzdF9wYWdlKTsKKwkJCQlrdW5tYXAoKmRzdF9wYWdlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXZvaWQgKnNyY19wdHIsICpkc3RfcHRyOworCisJCQlkbyB7CisJCQkJc3JjX3B0ciA9IGttYXAoKnNyY19wYWdlKSArIHNyYzsKKwkJCQlkc3RfcHRyID0ga21hcCgqZHN0X3BhZ2UpICsgZHN0OworCQkJCWlmIChQQUdFX0NBQ0hFX1NJWkUgLSBzcmMgPCBQQUdFX0NBQ0hFX1NJWkUgLSBkc3QpIHsKKwkJCQkJbCA9IFBBR0VfQ0FDSEVfU0laRSAtIHNyYzsKKwkJCQkJc3JjID0gMDsKKwkJCQkJZHN0ICs9IGw7CisJCQkJfSBlbHNlIHsKKwkJCQkJbCA9IFBBR0VfQ0FDSEVfU0laRSAtIGRzdDsKKwkJCQkJc3JjICs9IGw7CisJCQkJCWRzdCA9IDA7CisJCQkJfQorCQkJCWwgPSBtaW4obGVuLCBsKTsKKwkJCQltZW1tb3ZlKGRzdF9wdHIsIHNyY19wdHIsIGwpOworCQkJCWt1bm1hcCgqc3JjX3BhZ2UpOworCQkJCXNldF9wYWdlX2RpcnR5KCpkc3RfcGFnZSk7CisJCQkJa3VubWFwKCpkc3RfcGFnZSk7CisJCQkJaWYgKCFkc3QpCisJCQkJCWRzdF9wYWdlKys7CisJCQkJZWxzZQorCQkJCQlzcmNfcGFnZSsrOworCQkJfSB3aGlsZSAoKGxlbiAtPSBsKSk7CisJCX0KKwl9Cit9CisKK3ZvaWQgaGZzX2Jub2RlX2R1bXAoc3RydWN0IGhmc19ibm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MgZGVzYzsKKwlfX2JlMzIgY25pZDsKKwlpbnQgaSwgb2ZmLCBrZXlfb2ZmOworCisJZHByaW50KERCR19CTk9ERV9NT0QsICJibm9kZTogJWRcbiIsIG5vZGUtPnRoaXMpOworCWhmc19ibm9kZV9yZWFkKG5vZGUsICZkZXNjLCAwLCBzaXplb2YoZGVzYykpOworCWRwcmludChEQkdfQk5PREVfTU9ELCAiJWQsICVkLCAlZCwgJWQsICVkXG4iLAorCQliZTMyX3RvX2NwdShkZXNjLm5leHQpLCBiZTMyX3RvX2NwdShkZXNjLnByZXYpLAorCQlkZXNjLnR5cGUsIGRlc2MuaGVpZ2h0LCBiZTE2X3RvX2NwdShkZXNjLm51bV9yZWNzKSk7CisKKwlvZmYgPSBub2RlLT50cmVlLT5ub2RlX3NpemUgLSAyOworCWZvciAoaSA9IGJlMTZfdG9fY3B1KGRlc2MubnVtX3JlY3MpOyBpID49IDA7IG9mZiAtPSAyLCBpLS0pIHsKKwkJa2V5X29mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihub2RlLCBvZmYpOworCQlkcHJpbnQoREJHX0JOT0RFX01PRCwgIiAlZCIsIGtleV9vZmYpOworCQlpZiAoaSAmJiBub2RlLT50eXBlID09IEhGU19OT0RFX0lOREVYKSB7CisJCQlpbnQgdG1wOworCisJCQlpZiAobm9kZS0+dHJlZS0+YXR0cmlidXRlcyAmIEhGU19UUkVFX1ZBUklEWEtFWVMpCisJCQkJdG1wID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIGtleV9vZmYpICsgMjsKKwkJCWVsc2UKKwkJCQl0bXAgPSBub2RlLT50cmVlLT5tYXhfa2V5X2xlbiArIDI7CisJCQlkcHJpbnQoREJHX0JOT0RFX01PRCwgIiAoJWQiLCB0bXApOworCQkJaGZzX2Jub2RlX3JlYWQobm9kZSwgJmNuaWQsIGtleV9vZmYgKyB0bXAsIDQpOworCQkJZHByaW50KERCR19CTk9ERV9NT0QsICIsJWQpIiwgYmUzMl90b19jcHUoY25pZCkpOworCQl9IGVsc2UgaWYgKGkgJiYgbm9kZS0+dHlwZSA9PSBIRlNfTk9ERV9MRUFGKSB7CisJCQlpbnQgdG1wOworCisJCQl0bXAgPSBoZnNfYm5vZGVfcmVhZF91MTYobm9kZSwga2V5X29mZik7CisJCQlkcHJpbnQoREJHX0JOT0RFX01PRCwgIiAoJWQpIiwgdG1wKTsKKwkJfQorCX0KKwlkcHJpbnQoREJHX0JOT0RFX01PRCwgIlxuIik7Cit9CisKK3ZvaWQgaGZzX2Jub2RlX3VubGluayhzdHJ1Y3QgaGZzX2Jub2RlICpub2RlKQoreworCXN0cnVjdCBoZnNfYnRyZWUgKnRyZWU7CisJc3RydWN0IGhmc19ibm9kZSAqdG1wOworCV9fYmUzMiBjbmlkOworCisJdHJlZSA9IG5vZGUtPnRyZWU7CisJaWYgKG5vZGUtPnByZXYpIHsKKwkJdG1wID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbm9kZS0+cHJldik7CisJCWlmIChJU19FUlIodG1wKSkKKwkJCXJldHVybjsKKwkJdG1wLT5uZXh0ID0gbm9kZS0+bmV4dDsKKwkJY25pZCA9IGNwdV90b19iZTMyKHRtcC0+bmV4dCk7CisJCWhmc19ibm9kZV93cml0ZSh0bXAsICZjbmlkLCBvZmZzZXRvZihzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MsIG5leHQpLCA0KTsKKwkJaGZzX2Jub2RlX3B1dCh0bXApOworCX0gZWxzZSBpZiAobm9kZS0+dHlwZSA9PSBIRlNfTk9ERV9MRUFGKQorCQl0cmVlLT5sZWFmX2hlYWQgPSBub2RlLT5uZXh0OworCisJaWYgKG5vZGUtPm5leHQpIHsKKwkJdG1wID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbm9kZS0+bmV4dCk7CisJCWlmIChJU19FUlIodG1wKSkKKwkJCXJldHVybjsKKwkJdG1wLT5wcmV2ID0gbm9kZS0+cHJldjsKKwkJY25pZCA9IGNwdV90b19iZTMyKHRtcC0+cHJldik7CisJCWhmc19ibm9kZV93cml0ZSh0bXAsICZjbmlkLCBvZmZzZXRvZihzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MsIHByZXYpLCA0KTsKKwkJaGZzX2Jub2RlX3B1dCh0bXApOworCX0gZWxzZSBpZiAobm9kZS0+dHlwZSA9PSBIRlNfTk9ERV9MRUFGKQorCQl0cmVlLT5sZWFmX3RhaWwgPSBub2RlLT5wcmV2OworCisJLy8gbW92ZSBkb3duPworCWlmICghbm9kZS0+cHJldiAmJiAhbm9kZS0+bmV4dCkgeworCQlwcmludGsoImhmc19idHJlZV9kZWxfbGV2ZWxcbiIpOworCX0KKwlpZiAoIW5vZGUtPnBhcmVudCkgeworCQl0cmVlLT5yb290ID0gMDsKKwkJdHJlZS0+ZGVwdGggPSAwOworCX0KKwlzZXRfYml0KEhGU19CTk9ERV9ERUxFVEVELCAmbm9kZS0+ZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBoZnNfYm5vZGVfaGFzaCh1MzIgbnVtKQoreworCW51bSA9IChudW0gPj4gMTYpICsgbnVtOworCW51bSArPSBudW0gPj4gODsKKwlyZXR1cm4gbnVtICYgKE5PREVfSEFTSF9TSVpFIC0gMSk7Cit9CisKK3N0cnVjdCBoZnNfYm5vZGUgKmhmc19ibm9kZV9maW5kaGFzaChzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlLCB1MzIgY25pZCkKK3sKKwlzdHJ1Y3QgaGZzX2Jub2RlICpub2RlOworCisJaWYgKGNuaWQgPj0gdHJlZS0+bm9kZV9jb3VudCkgeworCQlwcmludGsoIkhGUystZnM6IHJlcXVlc3QgZm9yIG5vbi1leGlzdGVudCBub2RlICVkIGluIEIqVHJlZVxuIiwgY25pZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWZvciAobm9kZSA9IHRyZWUtPm5vZGVfaGFzaFtoZnNfYm5vZGVfaGFzaChjbmlkKV07CisJICAgICBub2RlOyBub2RlID0gbm9kZS0+bmV4dF9oYXNoKSB7CisJCWlmIChub2RlLT50aGlzID09IGNuaWQpIHsKKwkJCXJldHVybiBub2RlOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGhmc19ibm9kZSAqX19oZnNfYm5vZGVfY3JlYXRlKHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUsIHUzMiBjbmlkKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgKm5vZGUyOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCBzaXplLCBibG9jaywgaSwgaGFzaDsKKwlsb2ZmX3Qgb2ZmOworCisJaWYgKGNuaWQgPj0gdHJlZS0+bm9kZV9jb3VudCkgeworCQlwcmludGsoIkhGUystZnM6IHJlcXVlc3QgZm9yIG5vbi1leGlzdGVudCBub2RlICVkIGluIEIqVHJlZVxuIiwgY25pZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNiID0gdHJlZS0+aW5vZGUtPmlfc2I7CisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaGZzX2Jub2RlKSArIHRyZWUtPnBhZ2VzX3Blcl9ibm9kZSAqCisJCXNpemVvZihzdHJ1Y3QgcGFnZSAqKTsKKwlub2RlID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiBOVUxMOworCW1lbXNldChub2RlLCAwLCBzaXplKTsKKwlub2RlLT50cmVlID0gdHJlZTsKKwlub2RlLT50aGlzID0gY25pZDsKKwlzZXRfYml0KEhGU19CTk9ERV9ORVcsICZub2RlLT5mbGFncyk7CisJYXRvbWljX3NldCgmbm9kZS0+cmVmY250LCAxKTsKKwlkcHJpbnQoREJHX0JOT0RFX1JFRlMsICJuZXdfbm9kZSglZDolZCk6IDFcbiIsCisJICAgICAgIG5vZGUtPnRyZWUtPmNuaWQsIG5vZGUtPnRoaXMpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm5vZGUtPmxvY2tfd3EpOworCXNwaW5fbG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwlub2RlMiA9IGhmc19ibm9kZV9maW5kaGFzaCh0cmVlLCBjbmlkKTsKKwlpZiAoIW5vZGUyKSB7CisJCWhhc2ggPSBoZnNfYm5vZGVfaGFzaChjbmlkKTsKKwkJbm9kZS0+bmV4dF9oYXNoID0gdHJlZS0+bm9kZV9oYXNoW2hhc2hdOworCQl0cmVlLT5ub2RlX2hhc2hbaGFzaF0gPSBub2RlOworCQl0cmVlLT5ub2RlX2hhc2hfY250Kys7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2soJnRyZWUtPmhhc2hfbG9jayk7CisJCWtmcmVlKG5vZGUpOworCQl3YWl0X2V2ZW50KG5vZGUyLT5sb2NrX3dxLCAhdGVzdF9iaXQoSEZTX0JOT0RFX05FVywgJm5vZGUyLT5mbGFncykpOworCQlyZXR1cm4gbm9kZTI7CisJfQorCXNwaW5fdW5sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCisJbWFwcGluZyA9IHRyZWUtPmlub2RlLT5pX21hcHBpbmc7CisJb2ZmID0gKGxvZmZfdCljbmlkIDw8IHRyZWUtPm5vZGVfc2l6ZV9zaGlmdDsKKwlibG9jayA9IG9mZiA+PiBQQUdFX0NBQ0hFX1NISUZUOworCW5vZGUtPnBhZ2Vfb2Zmc2V0ID0gb2ZmICYgflBBR0VfQ0FDSEVfTUFTSzsKKwlmb3IgKGkgPSAwOyBpIDwgdHJlZS0+cGFnZXNfcGVyX2Jub2RlOyBibG9jaysrLCBpKyspIHsKKwkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBibG9jaywgKGZpbGxlcl90ICopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwkJaWYgKElTX0VSUihwYWdlKSkKKwkJCWdvdG8gZmFpbDsKKwkJaWYgKFBhZ2VFcnJvcihwYWdlKSkgeworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJZ290byBmYWlsOworCQl9CisjaWYgIVJFRl9QQUdFUworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisjZW5kaWYKKwkJbm9kZS0+cGFnZVtpXSA9IHBhZ2U7CisJfQorCisJcmV0dXJuIG5vZGU7CitmYWlsOgorCXNldF9iaXQoSEZTX0JOT0RFX0VSUk9SLCAmbm9kZS0+ZmxhZ3MpOworCXJldHVybiBub2RlOworfQorCit2b2lkIGhmc19ibm9kZV91bmhhc2goc3RydWN0IGhmc19ibm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgaGZzX2Jub2RlICoqcDsKKworCWRwcmludChEQkdfQk5PREVfUkVGUywgInJlbW92ZV9ub2RlKCVkOiVkKTogJWRcbiIsCisJCW5vZGUtPnRyZWUtPmNuaWQsIG5vZGUtPnRoaXMsIGF0b21pY19yZWFkKCZub2RlLT5yZWZjbnQpKTsKKwlmb3IgKHAgPSAmbm9kZS0+dHJlZS0+bm9kZV9oYXNoW2hmc19ibm9kZV9oYXNoKG5vZGUtPnRoaXMpXTsKKwkgICAgICpwICYmICpwICE9IG5vZGU7IHAgPSAmKCpwKS0+bmV4dF9oYXNoKQorCQk7CisJaWYgKCEqcCkKKwkJQlVHKCk7CisJKnAgPSBub2RlLT5uZXh0X2hhc2g7CisJbm9kZS0+dHJlZS0+bm9kZV9oYXNoX2NudC0tOworfQorCisvKiBMb2FkIGEgcGFydGljdWxhciBub2RlIG91dCBvZiBhIHRyZWUgKi8KK3N0cnVjdCBoZnNfYm5vZGUgKmhmc19ibm9kZV9maW5kKHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUsIHUzMiBudW0pCit7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MgKmRlc2M7CisJaW50IGksIHJlY19vZmYsIG9mZiwgbmV4dF9vZmY7CisJaW50IGVudHJ5X3NpemUsIGtleV9zaXplOworCisJc3Bpbl9sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCW5vZGUgPSBoZnNfYm5vZGVfZmluZGhhc2godHJlZSwgbnVtKTsKKwlpZiAobm9kZSkgeworCQloZnNfYm5vZGVfZ2V0KG5vZGUpOworCQlzcGluX3VubG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwkJd2FpdF9ldmVudChub2RlLT5sb2NrX3dxLCAhdGVzdF9iaXQoSEZTX0JOT0RFX05FVywgJm5vZGUtPmZsYWdzKSk7CisJCWlmICh0ZXN0X2JpdChIRlNfQk5PREVfRVJST1IsICZub2RlLT5mbGFncykpCisJCQlnb3RvIG5vZGVfZXJyb3I7CisJCXJldHVybiBub2RlOworCX0KKwlzcGluX3VubG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwlub2RlID0gX19oZnNfYm5vZGVfY3JlYXRlKHRyZWUsIG51bSk7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAodGVzdF9iaXQoSEZTX0JOT0RFX0VSUk9SLCAmbm9kZS0+ZmxhZ3MpKQorCQlnb3RvIG5vZGVfZXJyb3I7CisJaWYgKCF0ZXN0X2JpdChIRlNfQk5PREVfTkVXLCAmbm9kZS0+ZmxhZ3MpKQorCQlyZXR1cm4gbm9kZTsKKworCWRlc2MgPSAoc3RydWN0IGhmc19ibm9kZV9kZXNjICopKGttYXAobm9kZS0+cGFnZVswXSkgKyBub2RlLT5wYWdlX29mZnNldCk7CisJbm9kZS0+cHJldiA9IGJlMzJfdG9fY3B1KGRlc2MtPnByZXYpOworCW5vZGUtPm5leHQgPSBiZTMyX3RvX2NwdShkZXNjLT5uZXh0KTsKKwlub2RlLT5udW1fcmVjcyA9IGJlMTZfdG9fY3B1KGRlc2MtPm51bV9yZWNzKTsKKwlub2RlLT50eXBlID0gZGVzYy0+dHlwZTsKKwlub2RlLT5oZWlnaHQgPSBkZXNjLT5oZWlnaHQ7CisJa3VubWFwKG5vZGUtPnBhZ2VbMF0pOworCisJc3dpdGNoIChub2RlLT50eXBlKSB7CisJY2FzZSBIRlNfTk9ERV9IRUFERVI6CisJY2FzZSBIRlNfTk9ERV9NQVA6CisJCWlmIChub2RlLT5oZWlnaHQgIT0gMCkKKwkJCWdvdG8gbm9kZV9lcnJvcjsKKwkJYnJlYWs7CisJY2FzZSBIRlNfTk9ERV9MRUFGOgorCQlpZiAobm9kZS0+aGVpZ2h0ICE9IDEpCisJCQlnb3RvIG5vZGVfZXJyb3I7CisJCWJyZWFrOworCWNhc2UgSEZTX05PREVfSU5ERVg6CisJCWlmIChub2RlLT5oZWlnaHQgPD0gMSB8fCBub2RlLT5oZWlnaHQgPiB0cmVlLT5kZXB0aCkKKwkJCWdvdG8gbm9kZV9lcnJvcjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBub2RlX2Vycm9yOworCX0KKworCXJlY19vZmYgPSB0cmVlLT5ub2RlX3NpemUgLSAyOworCW9mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihub2RlLCByZWNfb2ZmKTsKKwlpZiAob2ZmICE9IHNpemVvZihzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MpKQorCQlnb3RvIG5vZGVfZXJyb3I7CisJZm9yIChpID0gMTsgaSA8PSBub2RlLT5udW1fcmVjczsgb2ZmID0gbmV4dF9vZmYsIGkrKykgeworCQlyZWNfb2ZmIC09IDI7CisJCW5leHRfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIHJlY19vZmYpOworCQlpZiAobmV4dF9vZmYgPD0gb2ZmIHx8CisJCSAgICBuZXh0X29mZiA+IHRyZWUtPm5vZGVfc2l6ZSB8fAorCQkgICAgbmV4dF9vZmYgJiAxKQorCQkJZ290byBub2RlX2Vycm9yOworCQllbnRyeV9zaXplID0gbmV4dF9vZmYgLSBvZmY7CisJCWlmIChub2RlLT50eXBlICE9IEhGU19OT0RFX0lOREVYICYmCisJCSAgICBub2RlLT50eXBlICE9IEhGU19OT0RFX0xFQUYpCisJCQljb250aW51ZTsKKwkJa2V5X3NpemUgPSBoZnNfYm5vZGVfcmVhZF91MTYobm9kZSwgb2ZmKSArIDI7CisJCWlmIChrZXlfc2l6ZSA+PSBlbnRyeV9zaXplIHx8IGtleV9zaXplICYgMSkKKwkJCWdvdG8gbm9kZV9lcnJvcjsKKwl9CisJY2xlYXJfYml0KEhGU19CTk9ERV9ORVcsICZub2RlLT5mbGFncyk7CisJd2FrZV91cCgmbm9kZS0+bG9ja193cSk7CisJcmV0dXJuIG5vZGU7CisKK25vZGVfZXJyb3I6CisJc2V0X2JpdChIRlNfQk5PREVfRVJST1IsICZub2RlLT5mbGFncyk7CisJY2xlYXJfYml0KEhGU19CTk9ERV9ORVcsICZub2RlLT5mbGFncyk7CisJd2FrZV91cCgmbm9kZS0+bG9ja193cSk7CisJaGZzX2Jub2RlX3B1dChub2RlKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlPKTsKK30KKwordm9pZCBoZnNfYm5vZGVfZnJlZShzdHJ1Y3QgaGZzX2Jub2RlICpub2RlKQoreworCS8vaW50IGk7CisKKwkvL2ZvciAoaSA9IDA7IGkgPCBub2RlLT50cmVlLT5wYWdlc19wZXJfYm5vZGU7IGkrKykKKwkvLwlpZiAobm9kZS0+cGFnZVtpXSkKKwkvLwkJcGFnZV9jYWNoZV9yZWxlYXNlKG5vZGUtPnBhZ2VbaV0pOworCWtmcmVlKG5vZGUpOworfQorCitzdHJ1Y3QgaGZzX2Jub2RlICpoZnNfYm5vZGVfY3JlYXRlKHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUsIHUzMiBudW0pCit7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZTsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VwOworCWludCBpOworCisJc3Bpbl9sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCW5vZGUgPSBoZnNfYm5vZGVfZmluZGhhc2godHJlZSwgbnVtKTsKKwlzcGluX3VubG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwlpZiAobm9kZSkgeworCQlwcmludGsoIm5ldyBub2RlICV1IGFscmVhZHkgaGFzaGVkP1xuIiwgbnVtKTsKKwkJQlVHKCk7CisJfQorCW5vZGUgPSBfX2hmc19ibm9kZV9jcmVhdGUodHJlZSwgbnVtKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlmICh0ZXN0X2JpdChIRlNfQk5PREVfRVJST1IsICZub2RlLT5mbGFncykpIHsKKwkJaGZzX2Jub2RlX3B1dChub2RlKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJfQorCisJcGFnZXAgPSBub2RlLT5wYWdlOworCW1lbXNldChrbWFwKCpwYWdlcCkgKyBub2RlLT5wYWdlX29mZnNldCwgMCwKKwkgICAgICAgbWluKChpbnQpUEFHRV9DQUNIRV9TSVpFLCAoaW50KXRyZWUtPm5vZGVfc2l6ZSkpOworCXNldF9wYWdlX2RpcnR5KCpwYWdlcCk7CisJa3VubWFwKCpwYWdlcCk7CisJZm9yIChpID0gMTsgaSA8IHRyZWUtPnBhZ2VzX3Blcl9ibm9kZTsgaSsrKSB7CisJCW1lbXNldChrbWFwKCorK3BhZ2VwKSwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKKwkJc2V0X3BhZ2VfZGlydHkoKnBhZ2VwKTsKKwkJa3VubWFwKCpwYWdlcCk7CisJfQorCWNsZWFyX2JpdChIRlNfQk5PREVfTkVXLCAmbm9kZS0+ZmxhZ3MpOworCXdha2VfdXAoJm5vZGUtPmxvY2tfd3EpOworCisJcmV0dXJuIG5vZGU7Cit9CisKK3ZvaWQgaGZzX2Jub2RlX2dldChzdHJ1Y3QgaGZzX2Jub2RlICpub2RlKQoreworCWlmIChub2RlKSB7CisJCWF0b21pY19pbmMoJm5vZGUtPnJlZmNudCk7CisjaWYgUkVGX1BBR0VTCisJCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBub2RlLT50cmVlLT5wYWdlc19wZXJfYm5vZGU7IGkrKykKKwkJCWdldF9wYWdlKG5vZGUtPnBhZ2VbaV0pOworCQl9CisjZW5kaWYKKwkJZHByaW50KERCR19CTk9ERV9SRUZTLCAiZ2V0X25vZGUoJWQ6JWQpOiAlZFxuIiwKKwkJICAgICAgIG5vZGUtPnRyZWUtPmNuaWQsIG5vZGUtPnRoaXMsIGF0b21pY19yZWFkKCZub2RlLT5yZWZjbnQpKTsKKwl9Cit9CisKKy8qIERpc3Bvc2Ugb2YgcmVzb3VyY2VzIHVzZWQgYnkgYSBub2RlICovCit2b2lkIGhmc19ibm9kZV9wdXQoc3RydWN0IGhmc19ibm9kZSAqbm9kZSkKK3sKKwlpZiAobm9kZSkgeworCQlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlID0gbm9kZS0+dHJlZTsKKwkJaW50IGk7CisKKwkJZHByaW50KERCR19CTk9ERV9SRUZTLCAicHV0X25vZGUoJWQ6JWQpOiAlZFxuIiwKKwkJICAgICAgIG5vZGUtPnRyZWUtPmNuaWQsIG5vZGUtPnRoaXMsIGF0b21pY19yZWFkKCZub2RlLT5yZWZjbnQpKTsKKwkJaWYgKCFhdG9taWNfcmVhZCgmbm9kZS0+cmVmY250KSkKKwkJCUJVRygpOworCQlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJm5vZGUtPnJlZmNudCwgJnRyZWUtPmhhc2hfbG9jaykpIHsKKyNpZiBSRUZfUEFHRVMKKwkJCWZvciAoaSA9IDA7IGkgPCB0cmVlLT5wYWdlc19wZXJfYm5vZGU7IGkrKykKKwkJCQlwdXRfcGFnZShub2RlLT5wYWdlW2ldKTsKKyNlbmRpZgorCQkJcmV0dXJuOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCB0cmVlLT5wYWdlc19wZXJfYm5vZGU7IGkrKykgeworCQkJbWFya19wYWdlX2FjY2Vzc2VkKG5vZGUtPnBhZ2VbaV0pOworI2lmIFJFRl9QQUdFUworCQkJcHV0X3BhZ2Uobm9kZS0+cGFnZVtpXSk7CisjZW5kaWYKKwkJfQorCisJCWlmICh0ZXN0X2JpdChIRlNfQk5PREVfREVMRVRFRCwgJm5vZGUtPmZsYWdzKSkgeworCQkJaGZzX2Jub2RlX3VuaGFzaChub2RlKTsKKwkJCXNwaW5fdW5sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCQkJaGZzX2JtYXBfZnJlZShub2RlKTsKKwkJCWhmc19ibm9kZV9mcmVlKG5vZGUpOworCQkJcmV0dXJuOworCQl9CisJCXNwaW5fdW5sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9icmVjLmMgYi9mcy9oZnNwbHVzL2JyZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2NlZjJhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzcGx1cy9icmVjLmMKQEAgLTAsMCArMSw0OTEgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzcGx1cy9icmVjLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEKKyAqIEJyYWQgQm95ZXIgKGZsYXJAYWxsYW5kcmlhLmNvbSkKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqCisgKiBIYW5kbGUgaW5kaXZpZHVhbCBidHJlZSByZWNvcmRzCisgKi8KKworI2luY2x1ZGUgImhmc3BsdXNfZnMuaCIKKyNpbmNsdWRlICJoZnNwbHVzX3Jhdy5oIgorCitzdGF0aWMgc3RydWN0IGhmc19ibm9kZSAqaGZzX2Jub2RlX3NwbGl0KHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCk7CitzdGF0aWMgaW50IGhmc19icmVjX3VwZGF0ZV9wYXJlbnQoc3RydWN0IGhmc19maW5kX2RhdGEgKmZkKTsKK3N0YXRpYyBpbnQgaGZzX2J0cmVlX2luY19oZWlnaHQoc3RydWN0IGhmc19idHJlZSAqKTsKKworLyogR2V0IHRoZSBsZW5ndGggYW5kIG9mZnNldCBvZiB0aGUgZ2l2ZW4gcmVjb3JkIGluIHRoZSBnaXZlbiBub2RlICovCit1MTYgaGZzX2JyZWNfbGVub2ZmKHN0cnVjdCBoZnNfYm5vZGUgKm5vZGUsIHUxNiByZWMsIHUxNiAqb2ZmKQoreworCV9fYmUxNiByZXR2YWxbMl07CisJdTE2IGRhdGFvZmY7CisKKwlkYXRhb2ZmID0gbm9kZS0+dHJlZS0+bm9kZV9zaXplIC0gKHJlYyArIDIpICogMjsKKwloZnNfYm5vZGVfcmVhZChub2RlLCByZXR2YWwsIGRhdGFvZmYsIDQpOworCSpvZmYgPSBiZTE2X3RvX2NwdShyZXR2YWxbMV0pOworCXJldHVybiBiZTE2X3RvX2NwdShyZXR2YWxbMF0pIC0gKm9mZjsKK30KKworLyogR2V0IHRoZSBsZW5ndGggb2YgdGhlIGtleSBmcm9tIGEga2V5ZWQgcmVjb3JkICovCit1MTYgaGZzX2JyZWNfa2V5bGVuKHN0cnVjdCBoZnNfYm5vZGUgKm5vZGUsIHUxNiByZWMpCit7CisJdTE2IHJldHZhbCwgcmVjb2ZmOworCisJaWYgKG5vZGUtPnR5cGUgIT0gSEZTX05PREVfSU5ERVggJiYgbm9kZS0+dHlwZSAhPSBIRlNfTk9ERV9MRUFGKQorCQlyZXR1cm4gMDsKKworCWlmICgobm9kZS0+dHlwZSA9PSBIRlNfTk9ERV9JTkRFWCkgJiYKKwkgICAhKG5vZGUtPnRyZWUtPmF0dHJpYnV0ZXMgJiBIRlNfVFJFRV9WQVJJRFhLRVlTKSkgeworCQlyZXR2YWwgPSBub2RlLT50cmVlLT5tYXhfa2V5X2xlbiArIDI7CisJfSBlbHNlIHsKKwkJcmVjb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIG5vZGUtPnRyZWUtPm5vZGVfc2l6ZSAtIChyZWMgKyAxKSAqIDIpOworCQlpZiAoIXJlY29mZikKKwkJCXJldHVybiAwOworCQlpZiAobm9kZS0+dHJlZS0+YXR0cmlidXRlcyAmIEhGU19UUkVFX0JJR0tFWVMpCisJCQlyZXR2YWwgPSBoZnNfYm5vZGVfcmVhZF91MTYobm9kZSwgcmVjb2ZmKSArIDI7CisJCWVsc2UKKwkJCXJldHZhbCA9IChoZnNfYm5vZGVfcmVhZF91OChub2RlLCByZWNvZmYpIHwgMSkgKyAxOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgaGZzX2JyZWNfaW5zZXJ0KHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCwgdm9pZCAqZW50cnksIGludCBlbnRyeV9sZW4pCit7CisJc3RydWN0IGhmc19idHJlZSAqdHJlZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCAqbmV3X25vZGU7CisJaW50IHNpemUsIGtleV9sZW4sIHJlYzsKKwlpbnQgZGF0YV9vZmYsIGVuZF9vZmY7CisJaW50IGlkeF9yZWNfb2ZmLCBkYXRhX3JlY19vZmYsIGVuZF9yZWNfb2ZmOworCV9fYmUzMiBjbmlkOworCisJdHJlZSA9IGZkLT50cmVlOworCWlmICghZmQtPmJub2RlKSB7CisJCWlmICghdHJlZS0+cm9vdCkKKwkJCWhmc19idHJlZV9pbmNfaGVpZ2h0KHRyZWUpOworCQlmZC0+Ym5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCB0cmVlLT5sZWFmX2hlYWQpOworCQlpZiAoSVNfRVJSKGZkLT5ibm9kZSkpCisJCQlyZXR1cm4gUFRSX0VSUihmZC0+Ym5vZGUpOworCQlmZC0+cmVjb3JkID0gLTE7CisJfQorCW5ld19ub2RlID0gTlVMTDsKKwlrZXlfbGVuID0gYmUxNl90b19jcHUoZmQtPnNlYXJjaF9rZXktPmtleV9sZW4pICsgMjsKK2FnYWluOgorCS8qIG5ldyByZWNvcmQgaWR4IGFuZCBjb21wbGV0ZSByZWNvcmQgc2l6ZSAqLworCXJlYyA9IGZkLT5yZWNvcmQgKyAxOworCXNpemUgPSBrZXlfbGVuICsgZW50cnlfbGVuOworCisJbm9kZSA9IGZkLT5ibm9kZTsKKwloZnNfYm5vZGVfZHVtcChub2RlKTsKKwkvKiBnZXQgbGFzdCBvZmZzZXQgKi8KKwllbmRfcmVjX29mZiA9IHRyZWUtPm5vZGVfc2l6ZSAtIChub2RlLT5udW1fcmVjcyArIDEpICogMjsKKwllbmRfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIGVuZF9yZWNfb2ZmKTsKKwllbmRfcmVjX29mZiAtPSAyOworCWRwcmludChEQkdfQk5PREVfTU9ELCAiaW5zZXJ0X3JlYzogJWQsICVkLCAlZCwgJWRcbiIsIHJlYywgc2l6ZSwgZW5kX29mZiwgZW5kX3JlY19vZmYpOworCWlmIChzaXplID4gZW5kX3JlY19vZmYgLSBlbmRfb2ZmKSB7CisJCWlmIChuZXdfbm9kZSkKKwkJCXBhbmljKCJub3QgZW5vdWdoIHJvb20hXG4iKTsKKwkJbmV3X25vZGUgPSBoZnNfYm5vZGVfc3BsaXQoZmQpOworCQlpZiAoSVNfRVJSKG5ld19ub2RlKSkKKwkJCXJldHVybiBQVFJfRVJSKG5ld19ub2RlKTsKKwkJZ290byBhZ2FpbjsKKwl9CisJaWYgKG5vZGUtPnR5cGUgPT0gSEZTX05PREVfTEVBRikgeworCQl0cmVlLT5sZWFmX2NvdW50Kys7CisJCW1hcmtfaW5vZGVfZGlydHkodHJlZS0+aW5vZGUpOworCX0KKwlub2RlLT5udW1fcmVjcysrOworCS8qIHdyaXRlIG5ldyBsYXN0IG9mZnNldCAqLworCWhmc19ibm9kZV93cml0ZV91MTYobm9kZSwgb2Zmc2V0b2Yoc3RydWN0IGhmc19ibm9kZV9kZXNjLCBudW1fcmVjcyksIG5vZGUtPm51bV9yZWNzKTsKKwloZnNfYm5vZGVfd3JpdGVfdTE2KG5vZGUsIGVuZF9yZWNfb2ZmLCBlbmRfb2ZmICsgc2l6ZSk7CisJZGF0YV9vZmYgPSBlbmRfb2ZmOworCWRhdGFfcmVjX29mZiA9IGVuZF9yZWNfb2ZmICsgMjsKKwlpZHhfcmVjX29mZiA9IHRyZWUtPm5vZGVfc2l6ZSAtIChyZWMgKyAxKSAqIDI7CisJaWYgKGlkeF9yZWNfb2ZmID09IGRhdGFfcmVjX29mZikKKwkJZ290byBza2lwOworCS8qIG1vdmUgYWxsIGZvbGxvd2luZyBlbnRyaWVzICovCisJZG8geworCQlkYXRhX29mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihub2RlLCBkYXRhX3JlY19vZmYgKyAyKTsKKwkJaGZzX2Jub2RlX3dyaXRlX3UxNihub2RlLCBkYXRhX3JlY19vZmYsIGRhdGFfb2ZmICsgc2l6ZSk7CisJCWRhdGFfcmVjX29mZiArPSAyOworCX0gd2hpbGUgKGRhdGFfcmVjX29mZiA8IGlkeF9yZWNfb2ZmKTsKKworCS8qIG1vdmUgZGF0YSBhd2F5ICovCisJaGZzX2Jub2RlX21vdmUobm9kZSwgZGF0YV9vZmYgKyBzaXplLCBkYXRhX29mZiwKKwkJICAgICAgIGVuZF9vZmYgLSBkYXRhX29mZik7CisKK3NraXA6CisJaGZzX2Jub2RlX3dyaXRlKG5vZGUsIGZkLT5zZWFyY2hfa2V5LCBkYXRhX29mZiwga2V5X2xlbik7CisJaGZzX2Jub2RlX3dyaXRlKG5vZGUsIGVudHJ5LCBkYXRhX29mZiArIGtleV9sZW4sIGVudHJ5X2xlbik7CisJaGZzX2Jub2RlX2R1bXAobm9kZSk7CisKKwlpZiAobmV3X25vZGUpIHsKKwkJLyogdXBkYXRlIHBhcmVudCBrZXkgaWYgd2UgaW5zZXJ0ZWQgYSBrZXkKKwkJICogYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBub2RlCisJCSAqLworCQlpZiAoIXJlYyAmJiBuZXdfbm9kZSAhPSBub2RlKQorCQkJaGZzX2JyZWNfdXBkYXRlX3BhcmVudChmZCk7CisKKwkJaGZzX2Jub2RlX3B1dChmZC0+Ym5vZGUpOworCQlpZiAoIW5ld19ub2RlLT5wYXJlbnQpIHsKKwkJCWhmc19idHJlZV9pbmNfaGVpZ2h0KHRyZWUpOworCQkJbmV3X25vZGUtPnBhcmVudCA9IHRyZWUtPnJvb3Q7CisJCX0KKwkJZmQtPmJub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbmV3X25vZGUtPnBhcmVudCk7CisKKwkJLyogY3JlYXRlIGluZGV4IGRhdGEgZW50cnkgKi8KKwkJY25pZCA9IGNwdV90b19iZTMyKG5ld19ub2RlLT50aGlzKTsKKwkJZW50cnkgPSAmY25pZDsKKwkJZW50cnlfbGVuID0gc2l6ZW9mKGNuaWQpOworCisJCS8qIGdldCBpbmRleCBrZXkgKi8KKwkJaGZzX2Jub2RlX3JlYWRfa2V5KG5ld19ub2RlLCBmZC0+c2VhcmNoX2tleSwgMTQpOworCQlfX2hmc19icmVjX2ZpbmQoZmQtPmJub2RlLCBmZCk7CisKKwkJaGZzX2Jub2RlX3B1dChuZXdfbm9kZSk7CisJCW5ld19ub2RlID0gTlVMTDsKKworCQlpZiAodHJlZS0+YXR0cmlidXRlcyAmIEhGU19UUkVFX1ZBUklEWEtFWVMpCisJCQlrZXlfbGVuID0gYmUxNl90b19jcHUoZmQtPnNlYXJjaF9rZXktPmtleV9sZW4pICsgMjsKKwkJZWxzZSB7CisJCQlmZC0+c2VhcmNoX2tleS0+a2V5X2xlbiA9IGNwdV90b19iZTE2KHRyZWUtPm1heF9rZXlfbGVuKTsKKwkJCWtleV9sZW4gPSB0cmVlLT5tYXhfa2V5X2xlbiArIDI7CisJCX0KKwkJZ290byBhZ2FpbjsKKwl9CisKKwlpZiAoIXJlYykKKwkJaGZzX2JyZWNfdXBkYXRlX3BhcmVudChmZCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGhmc19icmVjX3JlbW92ZShzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQpCit7CisJc3RydWN0IGhmc19idHJlZSAqdHJlZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCAqcGFyZW50OworCWludCBlbmRfb2ZmLCByZWNfb2ZmLCBkYXRhX29mZiwgc2l6ZTsKKworCXRyZWUgPSBmZC0+dHJlZTsKKwlub2RlID0gZmQtPmJub2RlOworYWdhaW46CisJcmVjX29mZiA9IHRyZWUtPm5vZGVfc2l6ZSAtIChmZC0+cmVjb3JkICsgMikgKiAyOworCWVuZF9vZmYgPSB0cmVlLT5ub2RlX3NpemUgLSAobm9kZS0+bnVtX3JlY3MgKyAxKSAqIDI7CisKKwlpZiAobm9kZS0+dHlwZSA9PSBIRlNfTk9ERV9MRUFGKSB7CisJCXRyZWUtPmxlYWZfY291bnQtLTsKKwkJbWFya19pbm9kZV9kaXJ0eSh0cmVlLT5pbm9kZSk7CisJfQorCWhmc19ibm9kZV9kdW1wKG5vZGUpOworCWRwcmludChEQkdfQk5PREVfTU9ELCAicmVtb3ZlX3JlYzogJWQsICVkXG4iLCBmZC0+cmVjb3JkLCBmZC0+a2V5bGVuZ3RoICsgZmQtPmVudHJ5bGVuZ3RoKTsKKwlpZiAoIS0tbm9kZS0+bnVtX3JlY3MpIHsKKwkJaGZzX2Jub2RlX3VubGluayhub2RlKTsKKwkJaWYgKCFub2RlLT5wYXJlbnQpCisJCQlyZXR1cm4gMDsKKwkJcGFyZW50ID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbm9kZS0+cGFyZW50KTsKKwkJaWYgKElTX0VSUihwYXJlbnQpKQorCQkJcmV0dXJuIFBUUl9FUlIocGFyZW50KTsKKwkJaGZzX2Jub2RlX3B1dChub2RlKTsKKwkJbm9kZSA9IGZkLT5ibm9kZSA9IHBhcmVudDsKKworCQlfX2hmc19icmVjX2ZpbmQobm9kZSwgZmQpOworCQlnb3RvIGFnYWluOworCX0KKwloZnNfYm5vZGVfd3JpdGVfdTE2KG5vZGUsIG9mZnNldG9mKHN0cnVjdCBoZnNfYm5vZGVfZGVzYywgbnVtX3JlY3MpLCBub2RlLT5udW1fcmVjcyk7CisKKwlpZiAocmVjX29mZiA9PSBlbmRfb2ZmKQorCQlnb3RvIHNraXA7CisJc2l6ZSA9IGZkLT5rZXlsZW5ndGggKyBmZC0+ZW50cnlsZW5ndGg7CisKKwlkbyB7CisJCWRhdGFfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIHJlY19vZmYpOworCQloZnNfYm5vZGVfd3JpdGVfdTE2KG5vZGUsIHJlY19vZmYgKyAyLCBkYXRhX29mZiAtIHNpemUpOworCQlyZWNfb2ZmIC09IDI7CisJfSB3aGlsZSAocmVjX29mZiA+PSBlbmRfb2ZmKTsKKworCS8qIGZpbGwgaG9sZSAqLworCWhmc19ibm9kZV9tb3ZlKG5vZGUsIGZkLT5rZXlvZmZzZXQsIGZkLT5rZXlvZmZzZXQgKyBzaXplLAorCQkgICAgICAgZGF0YV9vZmYgLSBmZC0+a2V5b2Zmc2V0IC0gc2l6ZSk7Citza2lwOgorCWhmc19ibm9kZV9kdW1wKG5vZGUpOworCWlmICghZmQtPnJlY29yZCkKKwkJaGZzX2JyZWNfdXBkYXRlX3BhcmVudChmZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaGZzX2Jub2RlICpoZnNfYm5vZGVfc3BsaXQoc3RydWN0IGhmc19maW5kX2RhdGEgKmZkKQoreworCXN0cnVjdCBoZnNfYnRyZWUgKnRyZWU7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgKm5ld19ub2RlOworCXN0cnVjdCBoZnNfYm5vZGVfZGVzYyBub2RlX2Rlc2M7CisJaW50IG51bV9yZWNzLCBuZXdfcmVjX29mZiwgbmV3X29mZiwgb2xkX3JlY19vZmY7CisJaW50IGRhdGFfc3RhcnQsIGRhdGFfZW5kLCBzaXplOworCisJdHJlZSA9IGZkLT50cmVlOworCW5vZGUgPSBmZC0+Ym5vZGU7CisJbmV3X25vZGUgPSBoZnNfYm1hcF9hbGxvYyh0cmVlKTsKKwlpZiAoSVNfRVJSKG5ld19ub2RlKSkKKwkJcmV0dXJuIG5ld19ub2RlOworCWhmc19ibm9kZV9nZXQobm9kZSk7CisJZHByaW50KERCR19CTk9ERV9NT0QsICJzcGxpdF9ub2RlczogJWQgLSAlZCAtICVkXG4iLAorCQlub2RlLT50aGlzLCBuZXdfbm9kZS0+dGhpcywgbm9kZS0+bmV4dCk7CisJbmV3X25vZGUtPm5leHQgPSBub2RlLT5uZXh0OworCW5ld19ub2RlLT5wcmV2ID0gbm9kZS0+dGhpczsKKwluZXdfbm9kZS0+cGFyZW50ID0gbm9kZS0+cGFyZW50OworCW5ld19ub2RlLT50eXBlID0gbm9kZS0+dHlwZTsKKwluZXdfbm9kZS0+aGVpZ2h0ID0gbm9kZS0+aGVpZ2h0OworCisJc2l6ZSA9IHRyZWUtPm5vZGVfc2l6ZSAvIDIgLSBub2RlLT5udW1fcmVjcyAqIDIgLSAxNDsKKwlvbGRfcmVjX29mZiA9IHRyZWUtPm5vZGVfc2l6ZSAtIDQ7CisJbnVtX3JlY3MgPSAxOworCWZvciAoOzspIHsKKwkJZGF0YV9zdGFydCA9IGhmc19ibm9kZV9yZWFkX3UxNihub2RlLCBvbGRfcmVjX29mZik7CisJCWlmIChkYXRhX3N0YXJ0ID4gc2l6ZSkKKwkJCWJyZWFrOworCQlvbGRfcmVjX29mZiAtPSAyOworCQlpZiAoKytudW1fcmVjcyA8IG5vZGUtPm51bV9yZWNzKQorCQkJY29udGludWU7CisJCS8qIHBhbmljPyAqLworCQloZnNfYm5vZGVfcHV0KG5vZGUpOworCQloZnNfYm5vZGVfcHV0KG5ld19ub2RlKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7CisJfQorCisJaWYgKGZkLT5yZWNvcmQgKyAxIDwgbnVtX3JlY3MpIHsKKwkJLyogbmV3IHJlY29yZCBpcyBpbiB0aGUgbG93ZXIgaGFsZiwKKwkJICogc28gbGVhdmUgc29tZSBtb3JlIHNwYWNlIHRoZXJlCisJCSAqLworCQlvbGRfcmVjX29mZiArPSAyOworCQludW1fcmVjcy0tOworCQlkYXRhX3N0YXJ0ID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIG9sZF9yZWNfb2ZmKTsKKwl9IGVsc2UgeworCQloZnNfYm5vZGVfcHV0KG5vZGUpOworCQloZnNfYm5vZGVfZ2V0KG5ld19ub2RlKTsKKwkJZmQtPmJub2RlID0gbmV3X25vZGU7CisJCWZkLT5yZWNvcmQgLT0gbnVtX3JlY3M7CisJCWZkLT5rZXlvZmZzZXQgLT0gZGF0YV9zdGFydCAtIDE0OworCQlmZC0+ZW50cnlvZmZzZXQgLT0gZGF0YV9zdGFydCAtIDE0OworCX0KKwluZXdfbm9kZS0+bnVtX3JlY3MgPSBub2RlLT5udW1fcmVjcyAtIG51bV9yZWNzOworCW5vZGUtPm51bV9yZWNzID0gbnVtX3JlY3M7CisKKwluZXdfcmVjX29mZiA9IHRyZWUtPm5vZGVfc2l6ZSAtIDI7CisJbmV3X29mZiA9IDE0OworCXNpemUgPSBkYXRhX3N0YXJ0IC0gbmV3X29mZjsKKwludW1fcmVjcyA9IG5ld19ub2RlLT5udW1fcmVjczsKKwlkYXRhX2VuZCA9IGRhdGFfc3RhcnQ7CisJd2hpbGUgKG51bV9yZWNzKSB7CisJCWhmc19ibm9kZV93cml0ZV91MTYobmV3X25vZGUsIG5ld19yZWNfb2ZmLCBuZXdfb2ZmKTsKKwkJb2xkX3JlY19vZmYgLT0gMjsKKwkJbmV3X3JlY19vZmYgLT0gMjsKKwkJZGF0YV9lbmQgPSBoZnNfYm5vZGVfcmVhZF91MTYobm9kZSwgb2xkX3JlY19vZmYpOworCQluZXdfb2ZmID0gZGF0YV9lbmQgLSBzaXplOworCQludW1fcmVjcy0tOworCX0KKwloZnNfYm5vZGVfd3JpdGVfdTE2KG5ld19ub2RlLCBuZXdfcmVjX29mZiwgbmV3X29mZik7CisJaGZzX2Jub2RlX2NvcHkobmV3X25vZGUsIDE0LCBub2RlLCBkYXRhX3N0YXJ0LCBkYXRhX2VuZCAtIGRhdGFfc3RhcnQpOworCisJLyogdXBkYXRlIG5ldyBibm9kZSBoZWFkZXIgKi8KKwlub2RlX2Rlc2MubmV4dCA9IGNwdV90b19iZTMyKG5ld19ub2RlLT5uZXh0KTsKKwlub2RlX2Rlc2MucHJldiA9IGNwdV90b19iZTMyKG5ld19ub2RlLT5wcmV2KTsKKwlub2RlX2Rlc2MudHlwZSA9IG5ld19ub2RlLT50eXBlOworCW5vZGVfZGVzYy5oZWlnaHQgPSBuZXdfbm9kZS0+aGVpZ2h0OworCW5vZGVfZGVzYy5udW1fcmVjcyA9IGNwdV90b19iZTE2KG5ld19ub2RlLT5udW1fcmVjcyk7CisJbm9kZV9kZXNjLnJlc2VydmVkID0gMDsKKwloZnNfYm5vZGVfd3JpdGUobmV3X25vZGUsICZub2RlX2Rlc2MsIDAsIHNpemVvZihub2RlX2Rlc2MpKTsKKworCS8qIHVwZGF0ZSBwcmV2aW91cyBibm9kZSBoZWFkZXIgKi8KKwlub2RlLT5uZXh0ID0gbmV3X25vZGUtPnRoaXM7CisJaGZzX2Jub2RlX3JlYWQobm9kZSwgJm5vZGVfZGVzYywgMCwgc2l6ZW9mKG5vZGVfZGVzYykpOworCW5vZGVfZGVzYy5uZXh0ID0gY3B1X3RvX2JlMzIobm9kZS0+bmV4dCk7CisJbm9kZV9kZXNjLm51bV9yZWNzID0gY3B1X3RvX2JlMTYobm9kZS0+bnVtX3JlY3MpOworCWhmc19ibm9kZV93cml0ZShub2RlLCAmbm9kZV9kZXNjLCAwLCBzaXplb2Yobm9kZV9kZXNjKSk7CisKKwkvKiB1cGRhdGUgbmV4dCBibm9kZSBoZWFkZXIgKi8KKwlpZiAobmV3X25vZGUtPm5leHQpIHsKKwkJc3RydWN0IGhmc19ibm9kZSAqbmV4dF9ub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbmV3X25vZGUtPm5leHQpOworCQluZXh0X25vZGUtPnByZXYgPSBuZXdfbm9kZS0+dGhpczsKKwkJaGZzX2Jub2RlX3JlYWQobmV4dF9ub2RlLCAmbm9kZV9kZXNjLCAwLCBzaXplb2Yobm9kZV9kZXNjKSk7CisJCW5vZGVfZGVzYy5wcmV2ID0gY3B1X3RvX2JlMzIobmV4dF9ub2RlLT5wcmV2KTsKKwkJaGZzX2Jub2RlX3dyaXRlKG5leHRfbm9kZSwgJm5vZGVfZGVzYywgMCwgc2l6ZW9mKG5vZGVfZGVzYykpOworCQloZnNfYm5vZGVfcHV0KG5leHRfbm9kZSk7CisJfSBlbHNlIGlmIChub2RlLT50aGlzID09IHRyZWUtPmxlYWZfdGFpbCkgeworCQkvKiBpZiB0aGVyZSBpcyBubyBuZXh0IG5vZGUsIHRoaXMgbWlnaHQgYmUgdGhlIG5ldyB0YWlsICovCisJCXRyZWUtPmxlYWZfdGFpbCA9IG5ld19ub2RlLT50aGlzOworCQltYXJrX2lub2RlX2RpcnR5KHRyZWUtPmlub2RlKTsKKwl9CisKKwloZnNfYm5vZGVfZHVtcChub2RlKTsKKwloZnNfYm5vZGVfZHVtcChuZXdfbm9kZSk7CisJaGZzX2Jub2RlX3B1dChub2RlKTsKKworCXJldHVybiBuZXdfbm9kZTsKK30KKworc3RhdGljIGludCBoZnNfYnJlY191cGRhdGVfcGFyZW50KHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBoZnNfYm5vZGUgKm5vZGUsICpuZXdfbm9kZSwgKnBhcmVudDsKKwlpbnQgbmV3a2V5bGVuLCBkaWZmOworCWludCByZWMsIHJlY19vZmYsIGVuZF9yZWNfb2ZmOworCWludCBzdGFydF9vZmYsIGVuZF9vZmY7CisKKwl0cmVlID0gZmQtPnRyZWU7CisJbm9kZSA9IGZkLT5ibm9kZTsKKwluZXdfbm9kZSA9IE5VTEw7CisJaWYgKCFub2RlLT5wYXJlbnQpCisJCXJldHVybiAwOworCithZ2FpbjoKKwlwYXJlbnQgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBub2RlLT5wYXJlbnQpOworCWlmIChJU19FUlIocGFyZW50KSkKKwkJcmV0dXJuIFBUUl9FUlIocGFyZW50KTsKKwlfX2hmc19icmVjX2ZpbmQocGFyZW50LCBmZCk7CisJaGZzX2Jub2RlX2R1bXAocGFyZW50KTsKKwlyZWMgPSBmZC0+cmVjb3JkOworCisJLyogc2l6ZSBkaWZmZXJlbmNlIGJldHdlZW4gb2xkIGFuZCBuZXcga2V5ICovCisJaWYgKHRyZWUtPmF0dHJpYnV0ZXMgJiBIRlNfVFJFRV9WQVJJRFhLRVlTKQorCQluZXdrZXlsZW4gPSBoZnNfYm5vZGVfcmVhZF91MTYobm9kZSwgMTQpICsgMjsKKwllbHNlCisJCWZkLT5rZXlsZW5ndGggPSBuZXdrZXlsZW4gPSB0cmVlLT5tYXhfa2V5X2xlbiArIDI7CisJZHByaW50KERCR19CTk9ERV9NT0QsICJ1cGRhdGVfcmVjOiAlZCwgJWQsICVkXG4iLCByZWMsIGZkLT5rZXlsZW5ndGgsIG5ld2tleWxlbik7CisKKwlyZWNfb2ZmID0gdHJlZS0+bm9kZV9zaXplIC0gKHJlYyArIDIpICogMjsKKwllbmRfcmVjX29mZiA9IHRyZWUtPm5vZGVfc2l6ZSAtIChwYXJlbnQtPm51bV9yZWNzICsgMSkgKiAyOworCWRpZmYgPSBuZXdrZXlsZW4gLSBmZC0+a2V5bGVuZ3RoOworCWlmICghZGlmZikKKwkJZ290byBza2lwOworCWlmIChkaWZmID4gMCkgeworCQllbmRfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KHBhcmVudCwgZW5kX3JlY19vZmYpOworCQlpZiAoZW5kX3JlY19vZmYgLSBlbmRfb2ZmIDwgZGlmZikgeworCisJCQlwcmludGsoInNwbGl0dGluZyBpbmRleCBub2RlLi4uXG4iKTsKKwkJCWZkLT5ibm9kZSA9IHBhcmVudDsKKwkJCW5ld19ub2RlID0gaGZzX2Jub2RlX3NwbGl0KGZkKTsKKwkJCWlmIChJU19FUlIobmV3X25vZGUpKQorCQkJCXJldHVybiBQVFJfRVJSKG5ld19ub2RlKTsKKwkJCXBhcmVudCA9IGZkLT5ibm9kZTsKKwkJCXJlYyA9IGZkLT5yZWNvcmQ7CisJCQlyZWNfb2ZmID0gdHJlZS0+bm9kZV9zaXplIC0gKHJlYyArIDIpICogMjsKKwkJCWVuZF9yZWNfb2ZmID0gdHJlZS0+bm9kZV9zaXplIC0gKHBhcmVudC0+bnVtX3JlY3MgKyAxKSAqIDI7CisJCX0KKwl9CisKKwllbmRfb2ZmID0gc3RhcnRfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KHBhcmVudCwgcmVjX29mZik7CisJaGZzX2Jub2RlX3dyaXRlX3UxNihwYXJlbnQsIHJlY19vZmYsIHN0YXJ0X29mZiArIGRpZmYpOworCXN0YXJ0X29mZiAtPSA0OwkvKiBtb3ZlIHByZXZpb3VzIGNuaWQgdG9vICovCisKKwl3aGlsZSAocmVjX29mZiA+IGVuZF9yZWNfb2ZmKSB7CisJCXJlY19vZmYgLT0gMjsKKwkJZW5kX29mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihwYXJlbnQsIHJlY19vZmYpOworCQloZnNfYm5vZGVfd3JpdGVfdTE2KHBhcmVudCwgcmVjX29mZiwgZW5kX29mZiArIGRpZmYpOworCX0KKwloZnNfYm5vZGVfbW92ZShwYXJlbnQsIHN0YXJ0X29mZiArIGRpZmYsIHN0YXJ0X29mZiwKKwkJICAgICAgIGVuZF9vZmYgLSBzdGFydF9vZmYpOworc2tpcDoKKwloZnNfYm5vZGVfY29weShwYXJlbnQsIGZkLT5rZXlvZmZzZXQsIG5vZGUsIDE0LCBuZXdrZXlsZW4pOworCWhmc19ibm9kZV9kdW1wKHBhcmVudCk7CisKKwloZnNfYm5vZGVfcHV0KG5vZGUpOworCW5vZGUgPSBwYXJlbnQ7CisKKwlpZiAobmV3X25vZGUpIHsKKwkJX19iZTMyIGNuaWQ7CisKKwkJZmQtPmJub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbmV3X25vZGUtPnBhcmVudCk7CisJCS8qIGNyZWF0ZSBpbmRleCBrZXkgYW5kIGVudHJ5ICovCisJCWhmc19ibm9kZV9yZWFkX2tleShuZXdfbm9kZSwgZmQtPnNlYXJjaF9rZXksIDE0KTsKKwkJY25pZCA9IGNwdV90b19iZTMyKG5ld19ub2RlLT50aGlzKTsKKworCQlfX2hmc19icmVjX2ZpbmQoZmQtPmJub2RlLCBmZCk7CisJCWhmc19icmVjX2luc2VydChmZCwgJmNuaWQsIHNpemVvZihjbmlkKSk7CisJCWhmc19ibm9kZV9wdXQoZmQtPmJub2RlKTsKKwkJaGZzX2Jub2RlX3B1dChuZXdfbm9kZSk7CisKKwkJaWYgKCFyZWMpIHsKKwkJCWlmIChuZXdfbm9kZSA9PSBub2RlKQorCQkJCWdvdG8gb3V0OworCQkJLyogcmVzdG9yZSBzZWFyY2hfa2V5ICovCisJCQloZnNfYm5vZGVfcmVhZF9rZXkobm9kZSwgZmQtPnNlYXJjaF9rZXksIDE0KTsKKwkJfQorCX0KKworCWlmICghcmVjICYmIG5vZGUtPnBhcmVudCkKKwkJZ290byBhZ2FpbjsKK291dDoKKwlmZC0+Ym5vZGUgPSBub2RlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhmc19idHJlZV9pbmNfaGVpZ2h0KHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUpCit7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgKm5ld19ub2RlOworCXN0cnVjdCBoZnNfYm5vZGVfZGVzYyBub2RlX2Rlc2M7CisJaW50IGtleV9zaXplLCByZWM7CisJX19iZTMyIGNuaWQ7CisKKwlub2RlID0gTlVMTDsKKwlpZiAodHJlZS0+cm9vdCkgeworCQlub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgdHJlZS0+cm9vdCk7CisJCWlmIChJU19FUlIobm9kZSkpCisJCQlyZXR1cm4gUFRSX0VSUihub2RlKTsKKwl9CisJbmV3X25vZGUgPSBoZnNfYm1hcF9hbGxvYyh0cmVlKTsKKwlpZiAoSVNfRVJSKG5ld19ub2RlKSkgeworCQloZnNfYm5vZGVfcHV0KG5vZGUpOworCQlyZXR1cm4gUFRSX0VSUihuZXdfbm9kZSk7CisJfQorCisJdHJlZS0+cm9vdCA9IG5ld19ub2RlLT50aGlzOworCWlmICghdHJlZS0+ZGVwdGgpIHsKKwkJdHJlZS0+bGVhZl9oZWFkID0gdHJlZS0+bGVhZl90YWlsID0gbmV3X25vZGUtPnRoaXM7CisJCW5ld19ub2RlLT50eXBlID0gSEZTX05PREVfTEVBRjsKKwkJbmV3X25vZGUtPm51bV9yZWNzID0gMDsKKwl9IGVsc2UgeworCQluZXdfbm9kZS0+dHlwZSA9IEhGU19OT0RFX0lOREVYOworCQluZXdfbm9kZS0+bnVtX3JlY3MgPSAxOworCX0KKwluZXdfbm9kZS0+cGFyZW50ID0gMDsKKwluZXdfbm9kZS0+bmV4dCA9IDA7CisJbmV3X25vZGUtPnByZXYgPSAwOworCW5ld19ub2RlLT5oZWlnaHQgPSArK3RyZWUtPmRlcHRoOworCisJbm9kZV9kZXNjLm5leHQgPSBjcHVfdG9fYmUzMihuZXdfbm9kZS0+bmV4dCk7CisJbm9kZV9kZXNjLnByZXYgPSBjcHVfdG9fYmUzMihuZXdfbm9kZS0+cHJldik7CisJbm9kZV9kZXNjLnR5cGUgPSBuZXdfbm9kZS0+dHlwZTsKKwlub2RlX2Rlc2MuaGVpZ2h0ID0gbmV3X25vZGUtPmhlaWdodDsKKwlub2RlX2Rlc2MubnVtX3JlY3MgPSBjcHVfdG9fYmUxNihuZXdfbm9kZS0+bnVtX3JlY3MpOworCW5vZGVfZGVzYy5yZXNlcnZlZCA9IDA7CisJaGZzX2Jub2RlX3dyaXRlKG5ld19ub2RlLCAmbm9kZV9kZXNjLCAwLCBzaXplb2Yobm9kZV9kZXNjKSk7CisKKwlyZWMgPSB0cmVlLT5ub2RlX3NpemUgLSAyOworCWhmc19ibm9kZV93cml0ZV91MTYobmV3X25vZGUsIHJlYywgMTQpOworCisJaWYgKG5vZGUpIHsKKwkJLyogaW5zZXJ0IG9sZCByb290IGlkeCBpbnRvIG5ldyByb290ICovCisJCW5vZGUtPnBhcmVudCA9IHRyZWUtPnJvb3Q7CisJCWlmIChub2RlLT50eXBlID09IEhGU19OT0RFX0xFQUYgfHwKKwkJICAgIHRyZWUtPmF0dHJpYnV0ZXMgJiBIRlNfVFJFRV9WQVJJRFhLRVlTKQorCQkJa2V5X3NpemUgPSBoZnNfYm5vZGVfcmVhZF91MTYobm9kZSwgMTQpICsgMjsKKwkJZWxzZQorCQkJa2V5X3NpemUgPSB0cmVlLT5tYXhfa2V5X2xlbiArIDI7CisJCWhmc19ibm9kZV9jb3B5KG5ld19ub2RlLCAxNCwgbm9kZSwgMTQsIGtleV9zaXplKTsKKworCQlpZiAoISh0cmVlLT5hdHRyaWJ1dGVzICYgSEZTX1RSRUVfVkFSSURYS0VZUykpIHsKKwkJCWtleV9zaXplID0gdHJlZS0+bWF4X2tleV9sZW4gKyAyOworCQkJaGZzX2Jub2RlX3dyaXRlX3UxNihuZXdfbm9kZSwgMTQsIHRyZWUtPm1heF9rZXlfbGVuKTsKKwkJfQorCQljbmlkID0gY3B1X3RvX2JlMzIobm9kZS0+dGhpcyk7CisJCWhmc19ibm9kZV93cml0ZShuZXdfbm9kZSwgJmNuaWQsIDE0ICsga2V5X3NpemUsIDQpOworCisJCXJlYyAtPSAyOworCQloZnNfYm5vZGVfd3JpdGVfdTE2KG5ld19ub2RlLCByZWMsIDE0ICsga2V5X3NpemUgKyA0KTsKKworCQloZnNfYm5vZGVfcHV0KG5vZGUpOworCX0KKwloZnNfYm5vZGVfcHV0KG5ld19ub2RlKTsKKwltYXJrX2lub2RlX2RpcnR5KHRyZWUtPmlub2RlKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9idHJlZS5jIGIvZnMvaGZzcGx1cy9idHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MzI2YWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9oZnNwbHVzL2J0cmVlLmMKQEAgLTAsMCArMSwzMTkgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzcGx1cy9idHJlZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxCisgKiBCcmFkIEJveWVyIChmbGFyQGFsbGFuZHJpYS5jb20pCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKgorICogSGFuZGxlIG9wZW5pbmcvY2xvc2luZyBidHJlZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorCisjaW5jbHVkZSAiaGZzcGx1c19mcy5oIgorI2luY2x1ZGUgImhmc3BsdXNfcmF3LmgiCisKKworLyogR2V0IGEgcmVmZXJlbmNlIHRvIGEgQipUcmVlIGFuZCBkbyBzb21lIGluaXRpYWwgY2hlY2tzICovCitzdHJ1Y3QgaGZzX2J0cmVlICpoZnNfYnRyZWVfb3BlbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MzIgaWQpCit7CisJc3RydWN0IGhmc19idHJlZSAqdHJlZTsKKwlzdHJ1Y3QgaGZzX2J0cmVlX2hlYWRlcl9yZWMgKmhlYWQ7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwl0cmVlID0ga21hbGxvYyhzaXplb2YoKnRyZWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRyZWUpCisJCXJldHVybiBOVUxMOworCW1lbXNldCh0cmVlLCAwLCBzaXplb2YoKnRyZWUpKTsKKworCWluaXRfTVVURVgoJnRyZWUtPnRyZWVfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnRyZWUtPmhhc2hfbG9jayk7CisJLyogU2V0IHRoZSBjb3JyZWN0IGNvbXBhcmUgZnVuY3Rpb24gKi8KKwl0cmVlLT5zYiA9IHNiOworCXRyZWUtPmNuaWQgPSBpZDsKKwlpZiAoaWQgPT0gSEZTUExVU19FWFRfQ05JRCkgeworCQl0cmVlLT5rZXljbXAgPSBoZnNwbHVzX2V4dF9jbXBfa2V5OworCX0gZWxzZSBpZiAoaWQgPT0gSEZTUExVU19DQVRfQ05JRCkgeworCQl0cmVlLT5rZXljbXAgPSBoZnNwbHVzX2NhdF9jbXBfa2V5OworCX0gZWxzZSB7CisJCXByaW50aygiSEZTKy1mczogdW5rbm93biBCKlRyZWUgcmVxdWVzdGVkXG4iKTsKKwkJZ290byBmcmVlX3RyZWU7CisJfQorCXRyZWUtPmlub2RlID0gaWdldChzYiwgaWQpOworCWlmICghdHJlZS0+aW5vZGUpCisJCWdvdG8gZnJlZV90cmVlOworCisJbWFwcGluZyA9IHRyZWUtPmlub2RlLT5pX21hcHBpbmc7CisJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCAwLCAoZmlsbGVyX3QgKiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOworCWlmIChJU19FUlIocGFnZSkpCisJCWdvdG8gZnJlZV90cmVlOworCisJLyogTG9hZCB0aGUgaGVhZGVyICovCisJaGVhZCA9IChzdHJ1Y3QgaGZzX2J0cmVlX2hlYWRlcl9yZWMgKikoa21hcChwYWdlKSArIHNpemVvZihzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MpKTsKKwl0cmVlLT5yb290ID0gYmUzMl90b19jcHUoaGVhZC0+cm9vdCk7CisJdHJlZS0+bGVhZl9jb3VudCA9IGJlMzJfdG9fY3B1KGhlYWQtPmxlYWZfY291bnQpOworCXRyZWUtPmxlYWZfaGVhZCA9IGJlMzJfdG9fY3B1KGhlYWQtPmxlYWZfaGVhZCk7CisJdHJlZS0+bGVhZl90YWlsID0gYmUzMl90b19jcHUoaGVhZC0+bGVhZl90YWlsKTsKKwl0cmVlLT5ub2RlX2NvdW50ID0gYmUzMl90b19jcHUoaGVhZC0+bm9kZV9jb3VudCk7CisJdHJlZS0+ZnJlZV9ub2RlcyA9IGJlMzJfdG9fY3B1KGhlYWQtPmZyZWVfbm9kZXMpOworCXRyZWUtPmF0dHJpYnV0ZXMgPSBiZTMyX3RvX2NwdShoZWFkLT5hdHRyaWJ1dGVzKTsKKwl0cmVlLT5ub2RlX3NpemUgPSBiZTE2X3RvX2NwdShoZWFkLT5ub2RlX3NpemUpOworCXRyZWUtPm1heF9rZXlfbGVuID0gYmUxNl90b19jcHUoaGVhZC0+bWF4X2tleV9sZW4pOworCXRyZWUtPmRlcHRoID0gYmUxNl90b19jcHUoaGVhZC0+ZGVwdGgpOworCisJc2l6ZSA9IHRyZWUtPm5vZGVfc2l6ZTsKKwlpZiAoIXNpemUgfHwgc2l6ZSAmIChzaXplIC0gMSkpCisJCWdvdG8gZmFpbF9wYWdlOworCWlmICghdHJlZS0+bm9kZV9jb3VudCkKKwkJZ290byBmYWlsX3BhZ2U7CisJdHJlZS0+bm9kZV9zaXplX3NoaWZ0ID0gZmZzKHNpemUpIC0gMTsKKworCXRyZWUtPnBhZ2VzX3Blcl9ibm9kZSA9ICh0cmVlLT5ub2RlX3NpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCisJa3VubWFwKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlyZXR1cm4gdHJlZTsKKworIGZhaWxfcGFnZToKKwl0cmVlLT5pbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZoZnNwbHVzX2FvcHM7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworIGZyZWVfdHJlZToKKwlpcHV0KHRyZWUtPmlub2RlKTsKKwlrZnJlZSh0cmVlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogUmVsZWFzZSByZXNvdXJjZXMgdXNlZCBieSBhIGJ0cmVlICovCit2b2lkIGhmc19idHJlZV9jbG9zZShzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlKQoreworCXN0cnVjdCBoZnNfYm5vZGUgKm5vZGU7CisJaW50IGk7CisKKwlpZiAoIXRyZWUpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBOT0RFX0hBU0hfU0laRTsgaSsrKSB7CisJCXdoaWxlICgobm9kZSA9IHRyZWUtPm5vZGVfaGFzaFtpXSkpIHsKKwkJCXRyZWUtPm5vZGVfaGFzaFtpXSA9IG5vZGUtPm5leHRfaGFzaDsKKwkJCWlmIChhdG9taWNfcmVhZCgmbm9kZS0+cmVmY250KSkKKwkJCQlwcmludGsoIkhGUys6IG5vZGUgJWQ6JWQgc3RpbGwgaGFzICVkIHVzZXIocykhXG4iLAorCQkJCQlub2RlLT50cmVlLT5jbmlkLCBub2RlLT50aGlzLCBhdG9taWNfcmVhZCgmbm9kZS0+cmVmY250KSk7CisJCQloZnNfYm5vZGVfZnJlZShub2RlKTsKKwkJCXRyZWUtPm5vZGVfaGFzaF9jbnQtLTsKKwkJfQorCX0KKwlpcHV0KHRyZWUtPmlub2RlKTsKKwlrZnJlZSh0cmVlKTsKK30KKwordm9pZCBoZnNfYnRyZWVfd3JpdGUoc3RydWN0IGhmc19idHJlZSAqdHJlZSkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlX2hlYWRlcl9yZWMgKmhlYWQ7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCW5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCAwKTsKKwlpZiAoSVNfRVJSKG5vZGUpKQorCQkvKiBwYW5pYz8gKi8KKwkJcmV0dXJuOworCS8qIExvYWQgdGhlIGhlYWRlciAqLworCXBhZ2UgPSBub2RlLT5wYWdlWzBdOworCWhlYWQgPSAoc3RydWN0IGhmc19idHJlZV9oZWFkZXJfcmVjICopKGttYXAocGFnZSkgKyBzaXplb2Yoc3RydWN0IGhmc19ibm9kZV9kZXNjKSk7CisKKwloZWFkLT5yb290ID0gY3B1X3RvX2JlMzIodHJlZS0+cm9vdCk7CisJaGVhZC0+bGVhZl9jb3VudCA9IGNwdV90b19iZTMyKHRyZWUtPmxlYWZfY291bnQpOworCWhlYWQtPmxlYWZfaGVhZCA9IGNwdV90b19iZTMyKHRyZWUtPmxlYWZfaGVhZCk7CisJaGVhZC0+bGVhZl90YWlsID0gY3B1X3RvX2JlMzIodHJlZS0+bGVhZl90YWlsKTsKKwloZWFkLT5ub2RlX2NvdW50ID0gY3B1X3RvX2JlMzIodHJlZS0+bm9kZV9jb3VudCk7CisJaGVhZC0+ZnJlZV9ub2RlcyA9IGNwdV90b19iZTMyKHRyZWUtPmZyZWVfbm9kZXMpOworCWhlYWQtPmF0dHJpYnV0ZXMgPSBjcHVfdG9fYmUzMih0cmVlLT5hdHRyaWJ1dGVzKTsKKwloZWFkLT5kZXB0aCA9IGNwdV90b19iZTE2KHRyZWUtPmRlcHRoKTsKKworCWt1bm1hcChwYWdlKTsKKwlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwloZnNfYm5vZGVfcHV0KG5vZGUpOworfQorCitzdGF0aWMgc3RydWN0IGhmc19ibm9kZSAqaGZzX2JtYXBfbmV3X2JtYXAoc3RydWN0IGhmc19ibm9kZSAqcHJldiwgdTMyIGlkeCkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlID0gcHJldi0+dHJlZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlICpub2RlOworCXN0cnVjdCBoZnNfYm5vZGVfZGVzYyBkZXNjOworCV9fYmUzMiBjbmlkOworCisJbm9kZSA9IGhmc19ibm9kZV9jcmVhdGUodHJlZSwgaWR4KTsKKwlpZiAoSVNfRVJSKG5vZGUpKQorCQlyZXR1cm4gbm9kZTsKKworCXRyZWUtPmZyZWVfbm9kZXMtLTsKKwlwcmV2LT5uZXh0ID0gaWR4OworCWNuaWQgPSBjcHVfdG9fYmUzMihpZHgpOworCWhmc19ibm9kZV93cml0ZShwcmV2LCAmY25pZCwgb2Zmc2V0b2Yoc3RydWN0IGhmc19ibm9kZV9kZXNjLCBuZXh0KSwgNCk7CisKKwlub2RlLT50eXBlID0gSEZTX05PREVfTUFQOworCW5vZGUtPm51bV9yZWNzID0gMTsKKwloZnNfYm5vZGVfY2xlYXIobm9kZSwgMCwgdHJlZS0+bm9kZV9zaXplKTsKKwlkZXNjLm5leHQgPSAwOworCWRlc2MucHJldiA9IDA7CisJZGVzYy50eXBlID0gSEZTX05PREVfTUFQOworCWRlc2MuaGVpZ2h0ID0gMDsKKwlkZXNjLm51bV9yZWNzID0gY3B1X3RvX2JlMTYoMSk7CisJZGVzYy5yZXNlcnZlZCA9IDA7CisJaGZzX2Jub2RlX3dyaXRlKG5vZGUsICZkZXNjLCAwLCBzaXplb2YoZGVzYykpOworCWhmc19ibm9kZV93cml0ZV91MTYobm9kZSwgMTQsIDB4ODAwMCk7CisJaGZzX2Jub2RlX3dyaXRlX3UxNihub2RlLCB0cmVlLT5ub2RlX3NpemUgLSAyLCAxNCk7CisJaGZzX2Jub2RlX3dyaXRlX3UxNihub2RlLCB0cmVlLT5ub2RlX3NpemUgLSA0LCB0cmVlLT5ub2RlX3NpemUgLSA2KTsKKworCXJldHVybiBub2RlOworfQorCitzdHJ1Y3QgaGZzX2Jub2RlICpoZnNfYm1hcF9hbGxvYyhzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlKQoreworCXN0cnVjdCBoZnNfYm5vZGUgKm5vZGUsICpuZXh0X25vZGU7CisJc3RydWN0IHBhZ2UgKipwYWdlcDsKKwl1MzIgbmlkeCwgaWR4OworCXUxNiBvZmYsIGxlbjsKKwl1OCAqZGF0YSwgYnl0ZSwgbTsKKwlpbnQgaTsKKworCXdoaWxlICghdHJlZS0+ZnJlZV9ub2RlcykgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gdHJlZS0+aW5vZGU7CisJCXUzMiBjb3VudDsKKwkJaW50IHJlczsKKworCQlyZXMgPSBoZnNwbHVzX2ZpbGVfZXh0ZW5kKGlub2RlKTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiBFUlJfUFRSKHJlcyk7CisJCUhGU1BMVVNfSShpbm9kZSkucGh5c19zaXplID0gaW5vZGUtPmlfc2l6ZSA9CisJCQkJKGxvZmZfdClIRlNQTFVTX0koaW5vZGUpLmFsbG9jX2Jsb2NrcyA8PAorCQkJCUhGU1BMVVNfU0IodHJlZS0+c2IpLmFsbG9jX2Jsa3N6X3NoaWZ0OworCQlIRlNQTFVTX0koaW5vZGUpLmZzX2Jsb2NrcyA9IEhGU1BMVVNfSShpbm9kZSkuYWxsb2NfYmxvY2tzIDw8CisJCQkJCSAgICAgSEZTUExVU19TQih0cmVlLT5zYikuZnNfc2hpZnQ7CisJCWlub2RlX3NldF9ieXRlcyhpbm9kZSwgaW5vZGUtPmlfc2l6ZSk7CisJCWNvdW50ID0gaW5vZGUtPmlfc2l6ZSA+PiB0cmVlLT5ub2RlX3NpemVfc2hpZnQ7CisJCXRyZWUtPmZyZWVfbm9kZXMgPSBjb3VudCAtIHRyZWUtPm5vZGVfY291bnQ7CisJCXRyZWUtPm5vZGVfY291bnQgPSBjb3VudDsKKwl9CisKKwluaWR4ID0gMDsKKwlub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbmlkeCk7CisJaWYgKElTX0VSUihub2RlKSkKKwkJcmV0dXJuIG5vZGU7CisJbGVuID0gaGZzX2JyZWNfbGVub2ZmKG5vZGUsIDIsICZvZmYpOworCisJb2ZmICs9IG5vZGUtPnBhZ2Vfb2Zmc2V0OworCXBhZ2VwID0gbm9kZS0+cGFnZSArIChvZmYgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJZGF0YSA9IGttYXAoKnBhZ2VwKTsKKwlvZmYgJj0gflBBR0VfQ0FDSEVfTUFTSzsKKwlpZHggPSAwOworCisJZm9yICg7OykgeworCQl3aGlsZSAobGVuKSB7CisJCQlieXRlID0gZGF0YVtvZmZdOworCQkJaWYgKGJ5dGUgIT0gMHhmZikgeworCQkJCWZvciAobSA9IDB4ODAsIGkgPSAwOyBpIDwgODsgbSA+Pj0gMSwgaSsrKSB7CisJCQkJCWlmICghKGJ5dGUgJiBtKSkgeworCQkJCQkJaWR4ICs9IGk7CisJCQkJCQlkYXRhW29mZl0gfD0gbTsKKwkJCQkJCXNldF9wYWdlX2RpcnR5KCpwYWdlcCk7CisJCQkJCQlrdW5tYXAoKnBhZ2VwKTsKKwkJCQkJCXRyZWUtPmZyZWVfbm9kZXMtLTsKKwkJCQkJCW1hcmtfaW5vZGVfZGlydHkodHJlZS0+aW5vZGUpOworCQkJCQkJaGZzX2Jub2RlX3B1dChub2RlKTsKKwkJCQkJCWlmICghaWR4KSB7CisJCQkJCQkJcHJpbnRrKCJ1bmV4cGVjdGVkIGlkeCAldSAoJXUpXG4iLCBpZHgsIG5vZGUtPnRoaXMpOworCQkJCQkJCUJVRygpOworCQkJCQkJfQorCQkJCQkJcmV0dXJuIGhmc19ibm9kZV9jcmVhdGUodHJlZSwgaWR4KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmICgrK29mZiA+PSBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJCQlrdW5tYXAoKnBhZ2VwKTsKKwkJCQlkYXRhID0ga21hcCgqKytwYWdlcCk7CisJCQkJb2ZmID0gMDsKKwkJCX0KKwkJCWlkeCArPSA4OworCQkJbGVuLS07CisJCX0KKwkJa3VubWFwKCpwYWdlcCk7CisJCW5pZHggPSBub2RlLT5uZXh0OworCQlpZiAoIW5pZHgpIHsKKwkJCXByaW50aygiY3JlYXRlIG5ldyBibWFwIG5vZGUuLi5cbiIpOworCQkJbmV4dF9ub2RlID0gaGZzX2JtYXBfbmV3X2JtYXAobm9kZSwgaWR4KTsKKwkJfSBlbHNlCisJCQluZXh0X25vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBuaWR4KTsKKwkJaGZzX2Jub2RlX3B1dChub2RlKTsKKwkJaWYgKElTX0VSUihuZXh0X25vZGUpKQorCQkJcmV0dXJuIG5leHRfbm9kZTsKKwkJbm9kZSA9IG5leHRfbm9kZTsKKworCQlsZW4gPSBoZnNfYnJlY19sZW5vZmYobm9kZSwgMCwgJm9mZik7CisJCW9mZiArPSBub2RlLT5wYWdlX29mZnNldDsKKwkJcGFnZXAgPSBub2RlLT5wYWdlICsgKG9mZiA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJZGF0YSA9IGttYXAoKnBhZ2VwKTsKKwkJb2ZmICY9IH5QQUdFX0NBQ0hFX01BU0s7CisJfQorfQorCit2b2lkIGhmc19ibWFwX2ZyZWUoc3RydWN0IGhmc19ibm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBwYWdlICpwYWdlOworCXUxNiBvZmYsIGxlbjsKKwl1MzIgbmlkeDsKKwl1OCAqZGF0YSwgYnl0ZSwgbTsKKworCWRwcmludChEQkdfQk5PREVfTU9ELCAiYnRyZWVfZnJlZV9ub2RlOiAldVxuIiwgbm9kZS0+dGhpcyk7CisJaWYgKCFub2RlLT50aGlzKQorCQlCVUcoKTsKKwl0cmVlID0gbm9kZS0+dHJlZTsKKwluaWR4ID0gbm9kZS0+dGhpczsKKwlub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgMCk7CisJaWYgKElTX0VSUihub2RlKSkKKwkJcmV0dXJuOworCWxlbiA9IGhmc19icmVjX2xlbm9mZihub2RlLCAyLCAmb2ZmKTsKKwl3aGlsZSAobmlkeCA+PSBsZW4gKiA4KSB7CisJCXUzMiBpOworCisJCW5pZHggLT0gbGVuICogODsKKwkJaSA9IG5vZGUtPm5leHQ7CisJCWhmc19ibm9kZV9wdXQobm9kZSk7CisJCWlmICghaSkgeworCQkJLyogcGFuaWMgKi87CisJCQlwcmludGsoIkhGUzogdW5hYmxlIHRvIGZyZWUgYm5vZGUgJXUuIGJtYXAgbm90IGZvdW5kIVxuIiwgbm9kZS0+dGhpcyk7CisJCQlyZXR1cm47CisJCX0KKwkJbm9kZSA9IGhmc19ibm9kZV9maW5kKHRyZWUsIGkpOworCQlpZiAoSVNfRVJSKG5vZGUpKQorCQkJcmV0dXJuOworCQlpZiAobm9kZS0+dHlwZSAhPSBIRlNfTk9ERV9NQVApIHsKKwkJCS8qIHBhbmljICovOworCQkJcHJpbnRrKCJIRlM6IGludmFsaWQgYm1hcCBmb3VuZCEgKCV1LCVkKVxuIiwgbm9kZS0+dGhpcywgbm9kZS0+dHlwZSk7CisJCQloZnNfYm5vZGVfcHV0KG5vZGUpOworCQkJcmV0dXJuOworCQl9CisJCWxlbiA9IGhmc19icmVjX2xlbm9mZihub2RlLCAwLCAmb2ZmKTsKKwl9CisJb2ZmICs9IG5vZGUtPnBhZ2Vfb2Zmc2V0ICsgbmlkeCAvIDg7CisJcGFnZSA9IG5vZGUtPnBhZ2Vbb2ZmID4+IFBBR0VfQ0FDSEVfU0hJRlRdOworCWRhdGEgPSBrbWFwKHBhZ2UpOworCW9mZiAmPSB+UEFHRV9DQUNIRV9NQVNLOworCW0gPSAxIDw8ICh+bmlkeCAmIDcpOworCWJ5dGUgPSBkYXRhW29mZl07CisJaWYgKCEoYnl0ZSAmIG0pKSB7CisJCXByaW50aygiSEZTOiB0cnlpbmcgdG8gZnJlZSBmcmVlIGJub2RlICV1KCVkKVxuIiwgbm9kZS0+dGhpcywgbm9kZS0+dHlwZSk7CisJCWt1bm1hcChwYWdlKTsKKwkJaGZzX2Jub2RlX3B1dChub2RlKTsKKwkJcmV0dXJuOworCX0KKwlkYXRhW29mZl0gPSBieXRlICYgfm07CisJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJa3VubWFwKHBhZ2UpOworCWhmc19ibm9kZV9wdXQobm9kZSk7CisJdHJlZS0+ZnJlZV9ub2RlcysrOworCW1hcmtfaW5vZGVfZGlydHkodHJlZS0+aW5vZGUpOworfQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9jYXRhbG9nLmMgYi9mcy9oZnNwbHVzL2NhdGFsb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDcxMjc5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzcGx1cy9jYXRhbG9nLmMKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiAgbGludXgvZnMvaGZzcGx1cy9jYXRhbG9nLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEKKyAqIEJyYWQgQm95ZXIgKGZsYXJAYWxsYW5kcmlhLmNvbSkKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqCisgKiBIYW5kbGluZyBvZiBjYXRhbG9nIHJlY29yZHMKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgImhmc3BsdXNfZnMuaCIKKyNpbmNsdWRlICJoZnNwbHVzX3Jhdy5oIgorCitpbnQgaGZzcGx1c19jYXRfY21wX2tleShoZnNwbHVzX2J0cmVlX2tleSAqazEsIGhmc3BsdXNfYnRyZWVfa2V5ICprMikKK3sKKwlfX2JlMzIgazFwLCBrMnA7CisKKwlrMXAgPSBrMS0+Y2F0LnBhcmVudDsKKwlrMnAgPSBrMi0+Y2F0LnBhcmVudDsKKwlpZiAoazFwICE9IGsycCkKKwkJcmV0dXJuIGJlMzJfdG9fY3B1KGsxcCkgPCBiZTMyX3RvX2NwdShrMnApID8gLTEgOiAxOworCisJcmV0dXJuIGhmc3BsdXNfdW5pc3RyY21wKCZrMS0+Y2F0Lm5hbWUsICZrMi0+Y2F0Lm5hbWUpOworfQorCit2b2lkIGhmc3BsdXNfY2F0X2J1aWxkX2tleShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBoZnNwbHVzX2J0cmVlX2tleSAqa2V5LAorCQkJICAgdTMyIHBhcmVudCwgc3RydWN0IHFzdHIgKnN0cikKK3sKKwlpbnQgbGVuOworCisJa2V5LT5jYXQucGFyZW50ID0gY3B1X3RvX2JlMzIocGFyZW50KTsKKwlpZiAoc3RyKSB7CisJCWhmc3BsdXNfYXNjMnVuaShzYiwgJmtleS0+Y2F0Lm5hbWUsIHN0ci0+bmFtZSwgc3RyLT5sZW4pOworCQlsZW4gPSBiZTE2X3RvX2NwdShrZXktPmNhdC5uYW1lLmxlbmd0aCk7CisJfSBlbHNlIHsKKwkJa2V5LT5jYXQubmFtZS5sZW5ndGggPSAwOworCQlsZW4gPSAwOworCX0KKwlrZXktPmtleV9sZW4gPSBjcHVfdG9fYmUxNig2ICsgMiAqIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIGhmc3BsdXNfY2F0X2J1aWxkX2tleV91bmkoaGZzcGx1c19idHJlZV9rZXkgKmtleSwgdTMyIHBhcmVudCwKKwkJCQkgICAgICBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKm5hbWUpCit7CisJaW50IHVzdHJsZW47CisKKwl1c3RybGVuID0gYmUxNl90b19jcHUobmFtZS0+bGVuZ3RoKTsKKwlrZXktPmNhdC5wYXJlbnQgPSBjcHVfdG9fYmUzMihwYXJlbnQpOworCWtleS0+Y2F0Lm5hbWUubGVuZ3RoID0gY3B1X3RvX2JlMTYodXN0cmxlbik7CisJdXN0cmxlbiAqPSAyOworCW1lbWNweShrZXktPmNhdC5uYW1lLnVuaWNvZGUsIG5hbWUtPnVuaWNvZGUsIHVzdHJsZW4pOworCWtleS0+a2V5X2xlbiA9IGNwdV90b19iZTE2KDYgKyB1c3RybGVuKTsKK30KKworc3RhdGljIHZvaWQgaGZzcGx1c19zZXRfcGVybXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGhmc3BsdXNfcGVybSAqcGVybXMpCit7CisJaWYgKGlub2RlLT5pX2ZsYWdzICYgU19JTU1VVEFCTEUpCisJCXBlcm1zLT5yb290ZmxhZ3MgfD0gSEZTUExVU19GTEdfSU1NVVRBQkxFOworCWVsc2UKKwkJcGVybXMtPnJvb3RmbGFncyAmPSB+SEZTUExVU19GTEdfSU1NVVRBQkxFOworCWlmIChpbm9kZS0+aV9mbGFncyAmIFNfQVBQRU5EKQorCQlwZXJtcy0+cm9vdGZsYWdzIHw9IEhGU1BMVVNfRkxHX0FQUEVORDsKKwllbHNlCisJCXBlcm1zLT5yb290ZmxhZ3MgJj0gfkhGU1BMVVNfRkxHX0FQUEVORDsKKwlIRlNQTFVTX0koaW5vZGUpLnJvb3RmbGFncyA9IHBlcm1zLT5yb290ZmxhZ3M7CisJSEZTUExVU19JKGlub2RlKS51c2VyZmxhZ3MgPSBwZXJtcy0+dXNlcmZsYWdzOworCXBlcm1zLT5tb2RlID0gY3B1X3RvX2JlMTYoaW5vZGUtPmlfbW9kZSk7CisJcGVybXMtPm93bmVyID0gY3B1X3RvX2JlMzIoaW5vZGUtPmlfdWlkKTsKKwlwZXJtcy0+Z3JvdXAgPSBjcHVfdG9fYmUzMihpbm9kZS0+aV9naWQpOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfY2F0X2J1aWxkX3JlY29yZChoZnNwbHVzX2NhdF9lbnRyeSAqZW50cnksIHUzMiBjbmlkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCXN0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIgKmZvbGRlcjsKKworCQlmb2xkZXIgPSAmZW50cnktPmZvbGRlcjsKKwkJbWVtc2V0KGZvbGRlciwgMCwgc2l6ZW9mKCpmb2xkZXIpKTsKKwkJZm9sZGVyLT50eXBlID0gY3B1X3RvX2JlMTYoSEZTUExVU19GT0xERVIpOworCQlmb2xkZXItPmlkID0gY3B1X3RvX2JlMzIoaW5vZGUtPmlfaW5vKTsKKwkJZm9sZGVyLT5jcmVhdGVfZGF0ZSA9IGZvbGRlci0+Y29udGVudF9tb2RfZGF0ZSA9CisJCQlmb2xkZXItPmF0dHJpYnV0ZV9tb2RfZGF0ZSA9IGZvbGRlci0+YWNjZXNzX2RhdGUgPSBoZnNwX25vdzJtdCgpOworCQloZnNwbHVzX3NldF9wZXJtcyhpbm9kZSwgJmZvbGRlci0+cGVybWlzc2lvbnMpOworCQlpZiAoaW5vZGUgPT0gSEZTUExVU19TQihpbm9kZS0+aV9zYikuaGlkZGVuX2RpcikKKwkJCS8qIGludmlzaWJsZSBhbmQgbmFtZWxvY2tlZCAqLworCQkJZm9sZGVyLT51c2VyX2luZm8uZnJGbGFncyA9IGNwdV90b19iZTE2KDB4NTAwMCk7CisJCXJldHVybiBzaXplb2YoKmZvbGRlcik7CisJfSBlbHNlIHsKKwkJc3RydWN0IGhmc3BsdXNfY2F0X2ZpbGUgKmZpbGU7CisKKwkJZmlsZSA9ICZlbnRyeS0+ZmlsZTsKKwkJbWVtc2V0KGZpbGUsIDAsIHNpemVvZigqZmlsZSkpOworCQlmaWxlLT50eXBlID0gY3B1X3RvX2JlMTYoSEZTUExVU19GSUxFKTsKKwkJZmlsZS0+ZmxhZ3MgPSBjcHVfdG9fYmUxNihIRlNQTFVTX0ZJTEVfVEhSRUFEX0VYSVNUUyk7CisJCWZpbGUtPmlkID0gY3B1X3RvX2JlMzIoY25pZCk7CisJCWZpbGUtPmNyZWF0ZV9kYXRlID0gZmlsZS0+Y29udGVudF9tb2RfZGF0ZSA9CisJCQlmaWxlLT5hdHRyaWJ1dGVfbW9kX2RhdGUgPSBmaWxlLT5hY2Nlc3NfZGF0ZSA9IGhmc3Bfbm93Mm10KCk7CisJCWlmIChjbmlkID09IGlub2RlLT5pX2lubykgeworCQkJaGZzcGx1c19zZXRfcGVybXMoaW5vZGUsICZmaWxlLT5wZXJtaXNzaW9ucyk7CisJCQlmaWxlLT51c2VyX2luZm8uZmRUeXBlID0gY3B1X3RvX2JlMzIoSEZTUExVU19TQihpbm9kZS0+aV9zYikudHlwZSk7CisJCQlmaWxlLT51c2VyX2luZm8uZmRDcmVhdG9yID0gY3B1X3RvX2JlMzIoSEZTUExVU19TQihpbm9kZS0+aV9zYikuY3JlYXRvcik7CisJCQlpZiAoKGZpbGUtPnBlcm1pc3Npb25zLnJvb3RmbGFncyB8IGZpbGUtPnBlcm1pc3Npb25zLnVzZXJmbGFncykgJiBIRlNQTFVTX0ZMR19JTU1VVEFCTEUpCisJCQkJZmlsZS0+ZmxhZ3MgfD0gY3B1X3RvX2JlMTYoSEZTUExVU19GSUxFX0xPQ0tFRCk7CisJCX0gZWxzZSB7CisJCQlmaWxlLT51c2VyX2luZm8uZmRUeXBlID0gY3B1X3RvX2JlMzIoSEZTUF9IQVJETElOS19UWVBFKTsKKwkJCWZpbGUtPnVzZXJfaW5mby5mZENyZWF0b3IgPSBjcHVfdG9fYmUzMihIRlNQX0hGU1BMVVNfQ1JFQVRPUik7CisJCQlmaWxlLT51c2VyX2luZm8uZmRGbGFncyA9IGNwdV90b19iZTE2KDB4MTAwKTsKKwkJCWZpbGUtPnBlcm1pc3Npb25zLmRldiA9IGNwdV90b19iZTMyKEhGU1BMVVNfSShpbm9kZSkuZGV2KTsKKwkJfQorCQlyZXR1cm4gc2l6ZW9mKCpmaWxlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaGZzcGx1c19maWxsX2NhdF90aHJlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICBoZnNwbHVzX2NhdF9lbnRyeSAqZW50cnksIGludCB0eXBlLAorCQkJCSAgIHUzMiBwYXJlbnRpZCwgc3RydWN0IHFzdHIgKnN0cikKK3sKKwllbnRyeS0+dHlwZSA9IGNwdV90b19iZTE2KHR5cGUpOworCWVudHJ5LT50aHJlYWQucmVzZXJ2ZWQgPSAwOworCWVudHJ5LT50aHJlYWQucGFyZW50SUQgPSBjcHVfdG9fYmUzMihwYXJlbnRpZCk7CisJaGZzcGx1c19hc2MydW5pKHNiLCAmZW50cnktPnRocmVhZC5ub2RlTmFtZSwgc3RyLT5uYW1lLCBzdHItPmxlbik7CisJcmV0dXJuIDEwICsgYmUxNl90b19jcHUoZW50cnktPnRocmVhZC5ub2RlTmFtZS5sZW5ndGgpICogMjsKK30KKworLyogVHJ5IHRvIGdldCBhIGNhdGFsb2cgZW50cnkgZm9yIGdpdmVuIGNhdGFsb2cgaWQgKi8KK2ludCBoZnNwbHVzX2ZpbmRfY2F0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHUzMiBjbmlkLAorCQkgICAgIHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCkKK3sKKwloZnNwbHVzX2NhdF9lbnRyeSB0bXA7CisJaW50IGVycjsKKwl1MTYgdHlwZTsKKworCWhmc3BsdXNfY2F0X2J1aWxkX2tleShzYiwgZmQtPnNlYXJjaF9rZXksIGNuaWQsIE5VTEwpOworCWVyciA9IGhmc19icmVjX3JlYWQoZmQsICZ0bXAsIHNpemVvZihoZnNwbHVzX2NhdF9lbnRyeSkpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwl0eXBlID0gYmUxNl90b19jcHUodG1wLnR5cGUpOworCWlmICh0eXBlICE9IEhGU1BMVVNfRk9MREVSX1RIUkVBRCAmJiB0eXBlICE9IEhGU1BMVVNfRklMRV9USFJFQUQpIHsKKwkJcHJpbnRrKCJIRlMrLWZzOiBGb3VuZCBiYWQgdGhyZWFkIHJlY29yZCBpbiBjYXRhbG9nXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaGZzcGx1c19jYXRfYnVpbGRfa2V5X3VuaShmZC0+c2VhcmNoX2tleSwgYmUzMl90b19jcHUodG1wLnRocmVhZC5wYXJlbnRJRCksCisJCQkJICZ0bXAudGhyZWFkLm5vZGVOYW1lKTsKKwlyZXR1cm4gaGZzX2JyZWNfZmluZChmZCk7Cit9CisKK2ludCBoZnNwbHVzX2NyZWF0ZV9jYXQodTMyIGNuaWQsIHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgcXN0ciAqc3RyLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBoZnNfZmluZF9kYXRhIGZkOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJaGZzcGx1c19jYXRfZW50cnkgZW50cnk7CisJaW50IGVudHJ5X3NpemU7CisJaW50IGVycjsKKworCWRwcmludChEQkdfQ0FUX01PRCwgImNyZWF0ZV9jYXQ6ICVzLCV1KCVkKVxuIiwgc3RyLT5uYW1lLCBjbmlkLCBpbm9kZS0+aV9ubGluayk7CisJc2IgPSBkaXItPmlfc2I7CisJaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKHNiKS5jYXRfdHJlZSwgJmZkKTsKKworCWhmc3BsdXNfY2F0X2J1aWxkX2tleShzYiwgZmQuc2VhcmNoX2tleSwgY25pZCwgTlVMTCk7CisJZW50cnlfc2l6ZSA9IGhmc3BsdXNfZmlsbF9jYXRfdGhyZWFkKHNiLCAmZW50cnksIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgPworCQkJSEZTUExVU19GT0xERVJfVEhSRUFEIDogSEZTUExVU19GSUxFX1RIUkVBRCwKKwkJCWRpci0+aV9pbm8sIHN0cik7CisJZXJyID0gaGZzX2JyZWNfZmluZCgmZmQpOworCWlmIChlcnIgIT0gLUVOT0VOVCkgeworCQlpZiAoIWVycikKKwkJCWVyciA9IC1FRVhJU1Q7CisJCWdvdG8gZXJyMjsKKwl9CisJZXJyID0gaGZzX2JyZWNfaW5zZXJ0KCZmZCwgJmVudHJ5LCBlbnRyeV9zaXplKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjI7CisKKwloZnNwbHVzX2NhdF9idWlsZF9rZXkoc2IsIGZkLnNlYXJjaF9rZXksIGRpci0+aV9pbm8sIHN0cik7CisJZW50cnlfc2l6ZSA9IGhmc3BsdXNfY2F0X2J1aWxkX3JlY29yZCgmZW50cnksIGNuaWQsIGlub2RlKTsKKwllcnIgPSBoZnNfYnJlY19maW5kKCZmZCk7CisJaWYgKGVyciAhPSAtRU5PRU5UKSB7CisJCS8qIHBhbmljPyAqLworCQlpZiAoIWVycikKKwkJCWVyciA9IC1FRVhJU1Q7CisJCWdvdG8gZXJyMTsKKwl9CisJZXJyID0gaGZzX2JyZWNfaW5zZXJ0KCZmZCwgJmVudHJ5LCBlbnRyeV9zaXplKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjE7CisKKwlkaXItPmlfc2l6ZSsrOworCWRpci0+aV9tdGltZSA9IGRpci0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gMDsKKworZXJyMToKKwloZnNwbHVzX2NhdF9idWlsZF9rZXkoc2IsIGZkLnNlYXJjaF9rZXksIGNuaWQsIE5VTEwpOworCWlmICghaGZzX2JyZWNfZmluZCgmZmQpKQorCQloZnNfYnJlY19yZW1vdmUoJmZkKTsKK2VycjI6CisJaGZzX2ZpbmRfZXhpdCgmZmQpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBoZnNwbHVzX2RlbGV0ZV9jYXQodTMyIGNuaWQsIHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgcXN0ciAqc3RyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJc3RydWN0IGhmc3BsdXNfZm9ya19yYXcgZm9yazsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJaW50IGVyciwgb2ZmOworCXUxNiB0eXBlOworCisJZHByaW50KERCR19DQVRfTU9ELCAiZGVsZXRlX2NhdDogJXMsJXVcbiIsIHN0ciA/IHN0ci0+bmFtZSA6IE5VTEwsIGNuaWQpOworCXNiID0gZGlyLT5pX3NiOworCWhmc19maW5kX2luaXQoSEZTUExVU19TQihzYikuY2F0X3RyZWUsICZmZCk7CisKKwlpZiAoIXN0cikgeworCQlpbnQgbGVuOworCisJCWhmc3BsdXNfY2F0X2J1aWxkX2tleShzYiwgZmQuc2VhcmNoX2tleSwgY25pZCwgTlVMTCk7CisJCWVyciA9IGhmc19icmVjX2ZpbmQoJmZkKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCisJCW9mZiA9IGZkLmVudHJ5b2Zmc2V0ICsgb2Zmc2V0b2Yoc3RydWN0IGhmc3BsdXNfY2F0X3RocmVhZCwgbm9kZU5hbWUpOworCQlmZC5zZWFyY2hfa2V5LT5jYXQucGFyZW50ID0gY3B1X3RvX2JlMzIoZGlyLT5pX2lubyk7CisJCWhmc19ibm9kZV9yZWFkKGZkLmJub2RlLCAmZmQuc2VhcmNoX2tleS0+Y2F0Lm5hbWUubGVuZ3RoLCBvZmYsIDIpOworCQlsZW4gPSBiZTE2X3RvX2NwdShmZC5zZWFyY2hfa2V5LT5jYXQubmFtZS5sZW5ndGgpICogMjsKKwkJaGZzX2Jub2RlX3JlYWQoZmQuYm5vZGUsICZmZC5zZWFyY2hfa2V5LT5jYXQubmFtZS51bmljb2RlLCBvZmYgKyAyLCBsZW4pOworCQlmZC5zZWFyY2hfa2V5LT5rZXlfbGVuID0gY3B1X3RvX2JlMTYoNiArIGxlbik7CisJfSBlbHNlCisJCWhmc3BsdXNfY2F0X2J1aWxkX2tleShzYiwgZmQuc2VhcmNoX2tleSwgZGlyLT5pX2lubywgc3RyKTsKKworCWVyciA9IGhmc19icmVjX2ZpbmQoJmZkKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXR5cGUgPSBoZnNfYm5vZGVfcmVhZF91MTYoZmQuYm5vZGUsIGZkLmVudHJ5b2Zmc2V0KTsKKwlpZiAodHlwZSA9PSBIRlNQTFVTX0ZJTEUpIHsKKyNpZiAwCisJCW9mZiA9IGZkLmVudHJ5b2Zmc2V0ICsgb2Zmc2V0b2YoaGZzcGx1c19jYXRfZmlsZSwgZGF0YV9mb3JrKTsKKwkJaGZzX2Jub2RlX3JlYWQoZmQuYm5vZGUsICZmb3JrLCBvZmYsIHNpemVvZihmb3JrKSk7CisJCWhmc3BsdXNfZnJlZV9mb3JrKHNiLCBjbmlkLCAmZm9yaywgSEZTUExVU19UWVBFX0RBVEEpOworI2VuZGlmCisKKwkJb2ZmID0gZmQuZW50cnlvZmZzZXQgKyBvZmZzZXRvZihzdHJ1Y3QgaGZzcGx1c19jYXRfZmlsZSwgcnNyY19mb3JrKTsKKwkJaGZzX2Jub2RlX3JlYWQoZmQuYm5vZGUsICZmb3JrLCBvZmYsIHNpemVvZihmb3JrKSk7CisJCWhmc3BsdXNfZnJlZV9mb3JrKHNiLCBjbmlkLCAmZm9yaywgSEZTUExVU19UWVBFX1JTUkMpOworCX0KKworCWxpc3RfZm9yX2VhY2gocG9zLCAmSEZTUExVU19JKGRpcikub3Blbl9kaXJfbGlzdCkgeworCQlzdHJ1Y3QgaGZzcGx1c19yZWFkZGlyX2RhdGEgKnJkID0KKwkJCWxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgaGZzcGx1c19yZWFkZGlyX2RhdGEsIGxpc3QpOworCQlpZiAoZmQudHJlZS0+a2V5Y21wKGZkLnNlYXJjaF9rZXksICh2b2lkICopJnJkLT5rZXkpIDwgMCkKKwkJCXJkLT5maWxlLT5mX3Bvcy0tOworCX0KKworCWVyciA9IGhmc19icmVjX3JlbW92ZSgmZmQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJaGZzcGx1c19jYXRfYnVpbGRfa2V5KHNiLCBmZC5zZWFyY2hfa2V5LCBjbmlkLCBOVUxMKTsKKwllcnIgPSBoZnNfYnJlY19maW5kKCZmZCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBoZnNfYnJlY19yZW1vdmUoJmZkKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWRpci0+aV9zaXplLS07CisJZGlyLT5pX210aW1lID0gZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGRpcik7CitvdXQ6CisJaGZzX2ZpbmRfZXhpdCgmZmQpOworCisJcmV0dXJuIGVycjsKK30KKworaW50IGhmc3BsdXNfcmVuYW1lX2NhdCh1MzIgY25pZCwKKwkJICAgICAgIHN0cnVjdCBpbm9kZSAqc3JjX2Rpciwgc3RydWN0IHFzdHIgKnNyY19uYW1lLAorCQkgICAgICAgc3RydWN0IGlub2RlICpkc3RfZGlyLCBzdHJ1Y3QgcXN0ciAqZHN0X25hbWUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBzcmNfZmQsIGRzdF9mZDsKKwloZnNwbHVzX2NhdF9lbnRyeSBlbnRyeTsKKwlpbnQgZW50cnlfc2l6ZSwgdHlwZTsKKwlpbnQgZXJyID0gMDsKKworCWRwcmludChEQkdfQ0FUX01PRCwgInJlbmFtZV9jYXQ6ICV1IC0gJWx1LCVzIC0gJWx1LCVzXG4iLCBjbmlkLCBzcmNfZGlyLT5pX2lubywgc3JjX25hbWUtPm5hbWUsCisJCWRzdF9kaXItPmlfaW5vLCBkc3RfbmFtZS0+bmFtZSk7CisJc2IgPSBzcmNfZGlyLT5pX3NiOworCWhmc19maW5kX2luaXQoSEZTUExVU19TQihzYikuY2F0X3RyZWUsICZzcmNfZmQpOworCWRzdF9mZCA9IHNyY19mZDsKKworCS8qIGZpbmQgdGhlIG9sZCBkaXIgZW50cnkgYW5kIHJlYWQgdGhlIGRhdGEgKi8KKwloZnNwbHVzX2NhdF9idWlsZF9rZXkoc2IsIHNyY19mZC5zZWFyY2hfa2V5LCBzcmNfZGlyLT5pX2lubywgc3JjX25hbWUpOworCWVyciA9IGhmc19icmVjX2ZpbmQoJnNyY19mZCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwloZnNfYm5vZGVfcmVhZChzcmNfZmQuYm5vZGUsICZlbnRyeSwgc3JjX2ZkLmVudHJ5b2Zmc2V0LAorCQkJCXNyY19mZC5lbnRyeWxlbmd0aCk7CisKKwkvKiBjcmVhdGUgbmV3IGRpciBlbnRyeSB3aXRoIHRoZSBkYXRhIGZyb20gdGhlIG9sZCBlbnRyeSAqLworCWhmc3BsdXNfY2F0X2J1aWxkX2tleShzYiwgZHN0X2ZkLnNlYXJjaF9rZXksIGRzdF9kaXItPmlfaW5vLCBkc3RfbmFtZSk7CisJZXJyID0gaGZzX2JyZWNfZmluZCgmZHN0X2ZkKTsKKwlpZiAoZXJyICE9IC1FTk9FTlQpIHsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBoZnNfYnJlY19pbnNlcnQoJmRzdF9mZCwgJmVudHJ5LCBzcmNfZmQuZW50cnlsZW5ndGgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWRzdF9kaXItPmlfc2l6ZSsrOworCWRzdF9kaXItPmlfbXRpbWUgPSBkc3RfZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGRzdF9kaXIpOworCisJLyogZmluYWxseSByZW1vdmUgdGhlIG9sZCBlbnRyeSAqLworCWhmc3BsdXNfY2F0X2J1aWxkX2tleShzYiwgc3JjX2ZkLnNlYXJjaF9rZXksIHNyY19kaXItPmlfaW5vLCBzcmNfbmFtZSk7CisJZXJyID0gaGZzX2JyZWNfZmluZCgmc3JjX2ZkKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSBoZnNfYnJlY19yZW1vdmUoJnNyY19mZCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJc3JjX2Rpci0+aV9zaXplLS07CisJc3JjX2Rpci0+aV9tdGltZSA9IHNyY19kaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCW1hcmtfaW5vZGVfZGlydHkoc3JjX2Rpcik7CisKKwkvKiByZW1vdmUgb2xkIHRocmVhZCBlbnRyeSAqLworCWhmc3BsdXNfY2F0X2J1aWxkX2tleShzYiwgc3JjX2ZkLnNlYXJjaF9rZXksIGNuaWQsIE5VTEwpOworCWVyciA9IGhmc19icmVjX2ZpbmQoJnNyY19mZCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJdHlwZSA9IGhmc19ibm9kZV9yZWFkX3UxNihzcmNfZmQuYm5vZGUsIHNyY19mZC5lbnRyeW9mZnNldCk7CisJZXJyID0gaGZzX2JyZWNfcmVtb3ZlKCZzcmNfZmQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogY3JlYXRlIG5ldyB0aHJlYWQgZW50cnkgKi8KKwloZnNwbHVzX2NhdF9idWlsZF9rZXkoc2IsIGRzdF9mZC5zZWFyY2hfa2V5LCBjbmlkLCBOVUxMKTsKKwllbnRyeV9zaXplID0gaGZzcGx1c19maWxsX2NhdF90aHJlYWQoc2IsICZlbnRyeSwgdHlwZSwgZHN0X2Rpci0+aV9pbm8sIGRzdF9uYW1lKTsKKwllcnIgPSBoZnNfYnJlY19maW5kKCZkc3RfZmQpOworCWlmIChlcnIgIT0gLUVOT0VOVCkgeworCQlpZiAoIWVycikKKwkJCWVyciA9IC1FRVhJU1Q7CisJCWdvdG8gb3V0OworCX0KKwllcnIgPSBoZnNfYnJlY19pbnNlcnQoJmRzdF9mZCwgJmVudHJ5LCBlbnRyeV9zaXplKTsKK291dDoKKwloZnNfYm5vZGVfcHV0KGRzdF9mZC5ibm9kZSk7CisJaGZzX2ZpbmRfZXhpdCgmc3JjX2ZkKTsKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9kaXIuYyBiL2ZzL2hmc3BsdXMvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JkYTc2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmc3BsdXMvZGlyLmMKQEAgLTAsMCArMSw0ODQgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzcGx1cy9kaXIuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMQorICogQnJhZCBCb3llciAoZmxhckBhbGxhbmRyaWEuY29tKQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICoKKyAqIEhhbmRsaW5nIG9mIGRpcmVjdG9yaWVzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJoZnNwbHVzX2ZzLmgiCisjaW5jbHVkZSAiaGZzcGx1c19yYXcuaCIKKworc3RhdGljIGlubGluZSB2b2lkIGhmc3BsdXNfaW5zdGFudGlhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgY25pZCkKK3sKKwlkZW50cnktPmRfZnNkYXRhID0gKHZvaWQgKikodW5zaWduZWQgbG9uZyljbmlkOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Cit9CisKKy8qIEZpbmQgdGhlIGVudHJ5IGluc2lkZSBkaXIgbmFtZWQgZGVudHJ5LT5kX25hbWUgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpoZnNwbHVzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwloZnNwbHVzX2NhdF9lbnRyeSBlbnRyeTsKKwlpbnQgZXJyOworCXUzMiBjbmlkLCBsaW5raWQgPSAwOworCXUxNiB0eXBlOworCisJc2IgPSBkaXItPmlfc2I7CisJZGVudHJ5LT5kX2ZzZGF0YSA9IE5VTEw7CisJaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKHNiKS5jYXRfdHJlZSwgJmZkKTsKKwloZnNwbHVzX2NhdF9idWlsZF9rZXkoc2IsIGZkLnNlYXJjaF9rZXksIGRpci0+aV9pbm8sICZkZW50cnktPmRfbmFtZSk7CithZ2FpbjoKKwllcnIgPSBoZnNfYnJlY19yZWFkKCZmZCwgJmVudHJ5LCBzaXplb2YoZW50cnkpKTsKKwlpZiAoZXJyKSB7CisJCWlmIChlcnIgPT0gLUVOT0VOVCkgeworCQkJaGZzX2ZpbmRfZXhpdCgmZmQpOworCQkJLyogTm8gc3VjaCBlbnRyeSAqLworCQkJaW5vZGUgPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKwkJZ290byBmYWlsOworCX0KKwl0eXBlID0gYmUxNl90b19jcHUoZW50cnkudHlwZSk7CisJaWYgKHR5cGUgPT0gSEZTUExVU19GT0xERVIpIHsKKwkJaWYgKGZkLmVudHJ5bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIpKSB7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBmYWlsOworCQl9CisJCWNuaWQgPSBiZTMyX3RvX2NwdShlbnRyeS5mb2xkZXIuaWQpOworCQlkZW50cnktPmRfZnNkYXRhID0gKHZvaWQgKikodW5zaWduZWQgbG9uZyljbmlkOworCX0gZWxzZSBpZiAodHlwZSA9PSBIRlNQTFVTX0ZJTEUpIHsKKwkJaWYgKGZkLmVudHJ5bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9maWxlKSkgeworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQljbmlkID0gYmUzMl90b19jcHUoZW50cnkuZmlsZS5pZCk7CisJCWlmIChlbnRyeS5maWxlLnVzZXJfaW5mby5mZFR5cGUgPT0gY3B1X3RvX2JlMzIoSEZTUF9IQVJETElOS19UWVBFKSAmJgorCQkgICAgZW50cnkuZmlsZS51c2VyX2luZm8uZmRDcmVhdG9yID09IGNwdV90b19iZTMyKEhGU1BfSEZTUExVU19DUkVBVE9SKSkgeworCQkJc3RydWN0IHFzdHIgc3RyOworCQkJY2hhciBuYW1lWzMyXTsKKworCQkJaWYgKGRlbnRyeS0+ZF9mc2RhdGEpIHsKKwkJCQllcnIgPSAtRU5PRU5UOworCQkJCWlub2RlID0gTlVMTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWRlbnRyeS0+ZF9mc2RhdGEgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWNuaWQ7CisJCQlsaW5raWQgPSBiZTMyX3RvX2NwdShlbnRyeS5maWxlLnBlcm1pc3Npb25zLmRldik7CisJCQlzdHIubGVuID0gc3ByaW50ZihuYW1lLCAiaU5vZGUlZCIsIGxpbmtpZCk7CisJCQlzdHIubmFtZSA9IG5hbWU7CisJCQloZnNwbHVzX2NhdF9idWlsZF9rZXkoc2IsIGZkLnNlYXJjaF9rZXksIEhGU1BMVVNfU0Ioc2IpLmhpZGRlbl9kaXItPmlfaW5vLCAmc3RyKTsKKwkJCWdvdG8gYWdhaW47CisJCX0gZWxzZSBpZiAoIWRlbnRyeS0+ZF9mc2RhdGEpCisJCQlkZW50cnktPmRfZnNkYXRhID0gKHZvaWQgKikodW5zaWduZWQgbG9uZyljbmlkOworCX0gZWxzZSB7CisJCXByaW50aygiSEZTKy1mczogSWxsZWdhbCBjYXRhbG9nIGVudHJ5IHR5cGUgaW4gbG9va3VwXG4iKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBmYWlsOworCX0KKwloZnNfZmluZF9leGl0KCZmZCk7CisJaW5vZGUgPSBpZ2V0KGRpci0+aV9zYiwgY25pZCk7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCUhGU1BMVVNfSShpbm9kZSkuZGV2ID0gbGlua2lkOworb3V0OgorCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiBOVUxMOworZmFpbDoKKwloZnNfZmluZF9leGl0KCZmZCk7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIGludCBoZnNwbHVzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlpbnQgbGVuLCBlcnI7CisJY2hhciBzdHJidWZbSEZTUExVU19NQVhfU1RSTEVOICsgMV07CisJaGZzcGx1c19jYXRfZW50cnkgZW50cnk7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJc3RydWN0IGhmc3BsdXNfcmVhZGRpcl9kYXRhICpyZDsKKwl1MTYgdHlwZTsKKworCWlmIChmaWxwLT5mX3BvcyA+PSBpbm9kZS0+aV9zaXplKQorCQlyZXR1cm4gMDsKKworCWhmc19maW5kX2luaXQoSEZTUExVU19TQihzYikuY2F0X3RyZWUsICZmZCk7CisJaGZzcGx1c19jYXRfYnVpbGRfa2V5KHNiLCBmZC5zZWFyY2hfa2V5LCBpbm9kZS0+aV9pbm8sIE5VTEwpOworCWVyciA9IGhmc19icmVjX2ZpbmQoJmZkKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXN3aXRjaCAoKHUzMilmaWxwLT5mX3BvcykgeworCWNhc2UgMDoKKwkJLyogVGhpcyBpcyBjb21wbGV0ZWx5IGFydGlmaWNpYWwuLi4gKi8KKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIDAsIGlub2RlLT5pX2lubywgRFRfRElSKSkKKwkJCWdvdG8gb3V0OworCQlmaWxwLT5mX3BvcysrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIDE6CisJCWhmc19ibm9kZV9yZWFkKGZkLmJub2RlLCAmZW50cnksIGZkLmVudHJ5b2Zmc2V0LCBmZC5lbnRyeWxlbmd0aCk7CisJCWlmIChiZTE2X3RvX2NwdShlbnRyeS50eXBlKSAhPSBIRlNQTFVTX0ZPTERFUl9USFJFQUQpIHsKKwkJCXByaW50aygiSEZTKy1mczogYmFkIGNhdGFsb2cgZm9sZGVyIHRocmVhZFxuIik7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGZkLmVudHJ5bGVuZ3RoIDwgSEZTUExVU19NSU5fVEhSRUFEX1NaKSB7CisJCQlwcmludGsoIkhGUystZnM6IHRydW5jYXRlZCBjYXRhbG9nIHRocmVhZFxuIik7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLi4iLCAyLCAxLAorCQkJICAgIGJlMzJfdG9fY3B1KGVudHJ5LnRocmVhZC5wYXJlbnRJRCksIERUX0RJUikpCisJCQlnb3RvIG91dDsKKwkJZmlscC0+Zl9wb3MrKzsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJaWYgKGZpbHAtPmZfcG9zID49IGlub2RlLT5pX3NpemUpCisJCQlnb3RvIG91dDsKKwkJZXJyID0gaGZzX2JyZWNfZ290bygmZmQsIGZpbHAtPmZfcG9zIC0gMSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKDs7KSB7CisJCWlmIChiZTMyX3RvX2NwdShmZC5rZXktPmNhdC5wYXJlbnQpICE9IGlub2RlLT5pX2lubykgeworCQkJcHJpbnRrKCJIRlMrLWZzOiB3YWxrZWQgcGFzdCBlbmQgb2YgZGlyXG4iKTsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCQloZnNfYm5vZGVfcmVhZChmZC5ibm9kZSwgJmVudHJ5LCBmZC5lbnRyeW9mZnNldCwgZmQuZW50cnlsZW5ndGgpOworCQl0eXBlID0gYmUxNl90b19jcHUoZW50cnkudHlwZSk7CisJCWxlbiA9IEhGU1BMVVNfTUFYX1NUUkxFTjsKKwkJZXJyID0gaGZzcGx1c191bmkyYXNjKHNiLCAmZmQua2V5LT5jYXQubmFtZSwgc3RyYnVmLCAmbGVuKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQlpZiAodHlwZSA9PSBIRlNQTFVTX0ZPTERFUikgeworCQkJaWYgKGZkLmVudHJ5bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIpKSB7CisJCQkJcHJpbnRrKCJIRlMrLWZzOiBzbWFsbCBkaXIgZW50cnlcbiIpOworCQkJCWVyciA9IC1FSU87CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlpZiAoSEZTUExVU19TQihzYikuaGlkZGVuX2RpciAmJgorCQkJICAgIEhGU1BMVVNfU0Ioc2IpLmhpZGRlbl9kaXItPmlfaW5vID09IGJlMzJfdG9fY3B1KGVudHJ5LmZvbGRlci5pZCkpCisJCQkJZ290byBuZXh0OworCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBzdHJidWYsIGxlbiwgZmlscC0+Zl9wb3MsCisJCQkJICAgIGJlMzJfdG9fY3B1KGVudHJ5LmZvbGRlci5pZCksIERUX0RJUikpCisJCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAodHlwZSA9PSBIRlNQTFVTX0ZJTEUpIHsKKwkJCWlmIChmZC5lbnRyeWxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaGZzcGx1c19jYXRfZmlsZSkpIHsKKwkJCQlwcmludGsoIkhGUystZnM6IHNtYWxsIGZpbGUgZW50cnlcbiIpOworCQkJCWVyciA9IC1FSU87CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsIHN0cmJ1ZiwgbGVuLCBmaWxwLT5mX3BvcywKKwkJCQkgICAgYmUzMl90b19jcHUoZW50cnkuZmlsZS5pZCksIERUX1JFRykpCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlwcmludGsoIkhGUystZnM6IGJhZCBjYXRhbG9nIGVudHJ5IHR5cGVcbiIpOworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJbmV4dDoKKwkJZmlscC0+Zl9wb3MrKzsKKwkJaWYgKGZpbHAtPmZfcG9zID49IGlub2RlLT5pX3NpemUpCisJCQlnb3RvIG91dDsKKwkJZXJyID0gaGZzX2JyZWNfZ290bygmZmQsIDEpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfQorCXJkID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWlmICghcmQpIHsKKwkJcmQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGZzcGx1c19yZWFkZGlyX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFyZCkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZpbHAtPnByaXZhdGVfZGF0YSA9IHJkOworCQlyZC0+ZmlsZSA9IGZpbHA7CisJCWxpc3RfYWRkKCZyZC0+bGlzdCwgJkhGU1BMVVNfSShpbm9kZSkub3Blbl9kaXJfbGlzdCk7CisJfQorCW1lbWNweSgmcmQtPmtleSwgZmQua2V5LCBzaXplb2Yoc3RydWN0IGhmc3BsdXNfY2F0X2tleSkpOworb3V0OgorCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfZGlyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGhmc3BsdXNfcmVhZGRpcl9kYXRhICpyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAocmQpIHsKKwkJbGlzdF9kZWwoJnJkLT5saXN0KTsKKwkJa2ZyZWUocmQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZnNwbHVzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJCSAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgcmVzOworCisJaW5vZGUgPSBoZnNwbHVzX25ld19pbm9kZShkaXItPmlfc2IsIG1vZGUpOworCWlmICghaW5vZGUpCisJCXJldHVybiAtRU5PU1BDOworCisJcmVzID0gaGZzcGx1c19jcmVhdGVfY2F0KGlub2RlLT5pX2lubywgZGlyLCAmZGVudHJ5LT5kX25hbWUsIGlub2RlKTsKKwlpZiAocmVzKSB7CisJCWlub2RlLT5pX25saW5rID0gMDsKKwkJaGZzcGx1c19kZWxldGVfaW5vZGUoaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIHJlczsKKwl9CisJaGZzcGx1c19pbnN0YW50aWF0ZShkZW50cnksIGlub2RlLCBpbm9kZS0+aV9pbm8pOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfbGluayhzdHJ1Y3QgZGVudHJ5ICpzcmNfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRzdF9kaXIsCisJCQlzdHJ1Y3QgZGVudHJ5ICpkc3RfZGVudHJ5KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkc3RfZGlyLT5pX3NiOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzcmNfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqc3JjX2RpciA9IHNyY19kZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCXN0cnVjdCBxc3RyIHN0cjsKKwljaGFyIG5hbWVbMzJdOworCXUzMiBjbmlkLCBpZDsKKwlpbnQgcmVzOworCisJaWYgKEhGU1BMVVNfSVNfUlNSQyhpbm9kZSkpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoaW5vZGUtPmlfaW5vID09ICh1MzIpKHVuc2lnbmVkIGxvbmcpc3JjX2RlbnRyeS0+ZF9mc2RhdGEpIHsKKwkJZm9yICg7OykgeworCQkJZ2V0X3JhbmRvbV9ieXRlcygmaWQsIHNpemVvZihjbmlkKSk7CisJCQlpZCAmPSAweDNmZmZmZmZmOworCQkJc3RyLm5hbWUgPSBuYW1lOworCQkJc3RyLmxlbiA9IHNwcmludGYobmFtZSwgImlOb2RlJWQiLCBpZCk7CisJCQlyZXMgPSBoZnNwbHVzX3JlbmFtZV9jYXQoaW5vZGUtPmlfaW5vLAorCQkJCQkJIHNyY19kaXIsICZzcmNfZGVudHJ5LT5kX25hbWUsCisJCQkJCQkgSEZTUExVU19TQihzYikuaGlkZGVuX2RpciwgJnN0cik7CisJCQlpZiAoIXJlcykKKwkJCQlicmVhazsKKwkJCWlmIChyZXMgIT0gLUVFWElTVCkKKwkJCQlyZXR1cm4gcmVzOworCQl9CisJCUhGU1BMVVNfSShpbm9kZSkuZGV2ID0gaWQ7CisJCWNuaWQgPSBIRlNQTFVTX1NCKHNiKS5uZXh0X2NuaWQrKzsKKwkJc3JjX2RlbnRyeS0+ZF9mc2RhdGEgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWNuaWQ7CisJCXJlcyA9IGhmc3BsdXNfY3JlYXRlX2NhdChjbmlkLCBzcmNfZGlyLCAmc3JjX2RlbnRyeS0+ZF9uYW1lLCBpbm9kZSk7CisJCWlmIChyZXMpCisJCQkvKiBwYW5pYz8gKi8KKwkJCXJldHVybiByZXM7CisJCUhGU1BMVVNfU0Ioc2IpLmZpbGVfY291bnQrKzsKKwl9CisJY25pZCA9IEhGU1BMVVNfU0Ioc2IpLm5leHRfY25pZCsrOworCXJlcyA9IGhmc3BsdXNfY3JlYXRlX2NhdChjbmlkLCBkc3RfZGlyLCAmZHN0X2RlbnRyeS0+ZF9uYW1lLCBpbm9kZSk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKworCWlub2RlLT5pX25saW5rKys7CisJaGZzcGx1c19pbnN0YW50aWF0ZShkc3RfZGVudHJ5LCBpbm9kZSwgY25pZCk7CisJYXRvbWljX2luYygmaW5vZGUtPmlfY291bnQpOworCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlIRlNQTFVTX1NCKHNiKS5maWxlX2NvdW50Kys7CisJc2ItPnNfZGlydCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZnNwbHVzX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgcXN0ciBzdHI7CisJY2hhciBuYW1lWzMyXTsKKwl1MzIgY25pZDsKKwlpbnQgcmVzOworCisJaWYgKEhGU1BMVVNfSVNfUlNSQyhpbm9kZSkpCisJCXJldHVybiAtRVBFUk07CisKKwljbmlkID0gKHUzMikodW5zaWduZWQgbG9uZylkZW50cnktPmRfZnNkYXRhOworCWlmIChpbm9kZS0+aV9pbm8gPT0gY25pZCAmJgorCSAgICBhdG9taWNfcmVhZCgmSEZTUExVU19JKGlub2RlKS5vcGVuY250KSkgeworCQlzdHIubmFtZSA9IG5hbWU7CisJCXN0ci5sZW4gPSBzcHJpbnRmKG5hbWUsICJ0ZW1wJWx1IiwgaW5vZGUtPmlfaW5vKTsKKwkJcmVzID0gaGZzcGx1c19yZW5hbWVfY2F0KGlub2RlLT5pX2lubywKKwkJCQkJIGRpciwgJmRlbnRyeS0+ZF9uYW1lLAorCQkJCQkgSEZTUExVU19TQihzYikuaGlkZGVuX2RpciwgJnN0cik7CisJCWlmICghcmVzKQorCQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19ERUFEOworCQlyZXR1cm4gcmVzOworCX0KKwlyZXMgPSBoZnNwbHVzX2RlbGV0ZV9jYXQoY25pZCwgZGlyLCAmZGVudHJ5LT5kX25hbWUpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKKwlpbm9kZS0+aV9ubGluay0tOworCWhmc3BsdXNfZGVsZXRlX2lub2RlKGlub2RlKTsKKwlpZiAoaW5vZGUtPmlfaW5vICE9IGNuaWQgJiYgIWlub2RlLT5pX25saW5rKSB7CisJCWlmICghYXRvbWljX3JlYWQoJkhGU1BMVVNfSShpbm9kZSkub3BlbmNudCkpIHsKKwkJCXJlcyA9IGhmc3BsdXNfZGVsZXRlX2NhdChpbm9kZS0+aV9pbm8sIEhGU1BMVVNfU0Ioc2IpLmhpZGRlbl9kaXIsIE5VTEwpOworCQkJaWYgKCFyZXMpCisJCQkJaGZzcGx1c19kZWxldGVfaW5vZGUoaW5vZGUpOworCQl9IGVsc2UKKwkJCWlub2RlLT5pX2ZsYWdzIHw9IFNfREVBRDsKKwl9CisJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBoZnNwbHVzX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHJlczsKKworCWlub2RlID0gaGZzcGx1c19uZXdfaW5vZGUoZGlyLT5pX3NiLCBTX0lGRElSIHwgbW9kZSk7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlyZXMgPSBoZnNwbHVzX2NyZWF0ZV9jYXQoaW5vZGUtPmlfaW5vLCBkaXIsICZkZW50cnktPmRfbmFtZSwgaW5vZGUpOworCWlmIChyZXMpIHsKKwkJaW5vZGUtPmlfbmxpbmsgPSAwOworCQloZnNwbHVzX2RlbGV0ZV9pbm9kZShpbm9kZSk7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gcmVzOworCX0KKwloZnNwbHVzX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUsIGlub2RlLT5pX2lubyk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGZzcGx1c19ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHJlczsKKworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWlmIChpbm9kZS0+aV9zaXplICE9IDIpCisJCXJldHVybiAtRU5PVEVNUFRZOworCXJlcyA9IGhmc3BsdXNfZGVsZXRlX2NhdChpbm9kZS0+aV9pbm8sIGRpciwgJmRlbnRyeS0+ZF9uYW1lKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCWlub2RlLT5pX25saW5rID0gMDsKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJaGZzcGx1c19kZWxldGVfaW5vZGUoaW5vZGUpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJICAgY29uc3QgY2hhciAqc3ltbmFtZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHJlczsKKworCXNiID0gZGlyLT5pX3NiOworCWlub2RlID0gaGZzcGx1c19uZXdfaW5vZGUoc2IsIFNfSUZMTksgfCBTX0lSV1hVR08pOworCWlmICghaW5vZGUpCisJCXJldHVybiAtRU5PU1BDOworCisJcmVzID0gcGFnZV9zeW1saW5rKGlub2RlLCBzeW1uYW1lLCBzdHJsZW4oc3ltbmFtZSkgKyAxKTsKKwlpZiAocmVzKSB7CisJCWlub2RlLT5pX25saW5rID0gMDsKKwkJaGZzcGx1c19kZWxldGVfaW5vZGUoaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlyZXMgPSBoZnNwbHVzX2NyZWF0ZV9jYXQoaW5vZGUtPmlfaW5vLCBkaXIsICZkZW50cnktPmRfbmFtZSwgaW5vZGUpOworCisJaWYgKCFyZXMpIHsKKwkJaGZzcGx1c19pbnN0YW50aWF0ZShkZW50cnksIGlub2RlLCBpbm9kZS0+aV9pbm8pOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfbWtub2Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCSBpbnQgbW9kZSwgZGV2X3QgcmRldikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHJlczsKKworCXNiID0gZGlyLT5pX3NiOworCWlub2RlID0gaGZzcGx1c19uZXdfaW5vZGUoc2IsIG1vZGUpOworCWlmICghaW5vZGUpCisJCXJldHVybiAtRU5PU1BDOworCisJcmVzID0gaGZzcGx1c19jcmVhdGVfY2F0KGlub2RlLT5pX2lubywgZGlyLCAmZGVudHJ5LT5kX25hbWUsIGlub2RlKTsKKwlpZiAocmVzKSB7CisJCWlub2RlLT5pX25saW5rID0gMDsKKwkJaGZzcGx1c19kZWxldGVfaW5vZGUoaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIHJlczsKKwl9CisJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBtb2RlLCByZGV2KTsKKwloZnNwbHVzX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUsIGlub2RlLT5pX2lubyk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZnNwbHVzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCQkgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwlpbnQgcmVzOworCisJLyogVW5saW5rIGRlc3RpbmF0aW9uIGlmIGl0IGFscmVhZHkgZXhpc3RzICovCisJaWYgKG5ld19kZW50cnktPmRfaW5vZGUpIHsKKwkJcmVzID0gaGZzcGx1c191bmxpbmsobmV3X2RpciwgbmV3X2RlbnRyeSk7CisJCWlmIChyZXMpCisJCQlyZXR1cm4gcmVzOworCX0KKworCXJlcyA9IGhmc3BsdXNfcmVuYW1lX2NhdCgodTMyKSh1bnNpZ25lZCBsb25nKW9sZF9kZW50cnktPmRfZnNkYXRhLAorCQkJCSBvbGRfZGlyLCAmb2xkX2RlbnRyeS0+ZF9uYW1lLAorCQkJCSBuZXdfZGlyLCAmbmV3X2RlbnRyeS0+ZF9uYW1lKTsKKwlpZiAoIXJlcykKKwkJbmV3X2RlbnRyeS0+ZF9mc2RhdGEgPSBvbGRfZGVudHJ5LT5kX2ZzZGF0YTsKKwlyZXR1cm4gcmVzOworfQorCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBoZnNwbHVzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0geworCS5sb29rdXAJCT0gaGZzcGx1c19sb29rdXAsCisJLmNyZWF0ZQkJPSBoZnNwbHVzX2NyZWF0ZSwKKwkubGluawkJPSBoZnNwbHVzX2xpbmssCisJLnVubGluawkJPSBoZnNwbHVzX3VubGluaywKKwkubWtkaXIJCT0gaGZzcGx1c19ta2RpciwKKwkucm1kaXIJCT0gaGZzcGx1c19ybWRpciwKKwkuc3ltbGluawk9IGhmc3BsdXNfc3ltbGluaywKKwkubWtub2QJCT0gaGZzcGx1c19ta25vZCwKKwkucmVuYW1lCQk9IGhmc3BsdXNfcmVuYW1lLAorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBoZnNwbHVzX2Rpcl9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBoZnNwbHVzX3JlYWRkaXIsCisJLmlvY3RsICAgICAgICAgID0gaGZzcGx1c19pb2N0bCwKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlbGVhc2UJPSBoZnNwbHVzX2Rpcl9yZWxlYXNlLAorfTsKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvZXh0ZW50cy5jIGIvZnMvaGZzcGx1cy9leHRlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2NDk4YwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmc3BsdXMvZXh0ZW50cy5jCkBAIC0wLDAgKzEsNTA1IEBACisvKgorICogIGxpbnV4L2ZzL2hmc3BsdXMvZXh0ZW50cy5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxCisgKiBCcmFkIEJveWVyIChmbGFyQGFsbGFuZHJpYS5jb20pCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKgorICogSGFuZGxpbmcgb2YgRXh0ZW50cyBib3RoIGluIGNhdGFsb2cgYW5kIGV4dGVudHMgb3ZlcmZsb3cgdHJlZXMKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJoZnNwbHVzX2ZzLmgiCisjaW5jbHVkZSAiaGZzcGx1c19yYXcuaCIKKworLyogQ29tcGFyZSB0d28gZXh0ZW50cyBrZXlzLCByZXR1cm5zIDAgb24gc2FtZSwgcG9zL25lZyBmb3IgZGlmZmVyZW5jZSAqLworaW50IGhmc3BsdXNfZXh0X2NtcF9rZXkoaGZzcGx1c19idHJlZV9rZXkgKmsxLCBoZnNwbHVzX2J0cmVlX2tleSAqazIpCit7CisJX19iZTMyIGsxaWQsIGsyaWQ7CisJX19iZTMyIGsxcywgazJzOworCisJazFpZCA9IGsxLT5leHQuY25pZDsKKwlrMmlkID0gazItPmV4dC5jbmlkOworCWlmIChrMWlkICE9IGsyaWQpCisJCXJldHVybiBiZTMyX3RvX2NwdShrMWlkKSA8IGJlMzJfdG9fY3B1KGsyaWQpID8gLTEgOiAxOworCisJaWYgKGsxLT5leHQuZm9ya190eXBlICE9IGsyLT5leHQuZm9ya190eXBlKQorCQlyZXR1cm4gazEtPmV4dC5mb3JrX3R5cGUgPCBrMi0+ZXh0LmZvcmtfdHlwZSA/IC0xIDogMTsKKworCWsxcyA9IGsxLT5leHQuc3RhcnRfYmxvY2s7CisJazJzID0gazItPmV4dC5zdGFydF9ibG9jazsKKwlpZiAoazFzID09IGsycykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGJlMzJfdG9fY3B1KGsxcykgPCBiZTMyX3RvX2NwdShrMnMpID8gLTEgOiAxOworfQorCitzdGF0aWMgdm9pZCBoZnNwbHVzX2V4dF9idWlsZF9rZXkoaGZzcGx1c19idHJlZV9rZXkgKmtleSwgdTMyIGNuaWQsCisJCQkJICB1MzIgYmxvY2ssIHU4IHR5cGUpCit7CisJa2V5LT5rZXlfbGVuID0gY3B1X3RvX2JlMTYoSEZTUExVU19FWFRfS0VZTEVOIC0gMik7CisJa2V5LT5leHQuY25pZCA9IGNwdV90b19iZTMyKGNuaWQpOworCWtleS0+ZXh0LnN0YXJ0X2Jsb2NrID0gY3B1X3RvX2JlMzIoYmxvY2spOworCWtleS0+ZXh0LmZvcmtfdHlwZSA9IHR5cGU7CisJa2V5LT5leHQucGFkID0gMDsKK30KKworc3RhdGljIHUzMiBoZnNwbHVzX2V4dF9maW5kX2Jsb2NrKHN0cnVjdCBoZnNwbHVzX2V4dGVudCAqZXh0LCB1MzIgb2ZmKQoreworCWludCBpOworCXUzMiBjb3VudDsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBleHQrKywgaSsrKSB7CisJCWNvdW50ID0gYmUzMl90b19jcHUoZXh0LT5ibG9ja19jb3VudCk7CisJCWlmIChvZmYgPCBjb3VudCkKKwkJCXJldHVybiBiZTMyX3RvX2NwdShleHQtPnN0YXJ0X2Jsb2NrKSArIG9mZjsKKwkJb2ZmIC09IGNvdW50OworCX0KKwkvKiBwYW5pYz8gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZnNwbHVzX2V4dF9ibG9ja19jb3VudChzdHJ1Y3QgaGZzcGx1c19leHRlbnQgKmV4dCkKK3sKKwlpbnQgaTsKKwl1MzIgY291bnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IDg7IGV4dCsrLCBpKyspCisJCWNvdW50ICs9IGJlMzJfdG9fY3B1KGV4dC0+YmxvY2tfY291bnQpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHUzMiBoZnNwbHVzX2V4dF9sYXN0YmxvY2soc3RydWN0IGhmc3BsdXNfZXh0ZW50ICpleHQpCit7CisJaW50IGk7CisKKwlleHQgKz0gNzsKKwlmb3IgKGkgPSAwOyBpIDwgNzsgZXh0LS0sIGkrKykKKwkJaWYgKGV4dC0+YmxvY2tfY291bnQpCisJCQlicmVhazsKKwlyZXR1cm4gYmUzMl90b19jcHUoZXh0LT5zdGFydF9ibG9jaykgKyBiZTMyX3RvX2NwdShleHQtPmJsb2NrX2NvdW50KTsKK30KKworc3RhdGljIHZvaWQgX19oZnNwbHVzX2V4dF93cml0ZV9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGhmc19maW5kX2RhdGEgKmZkKQoreworCWludCByZXM7CisKKwloZnNwbHVzX2V4dF9idWlsZF9rZXkoZmQtPnNlYXJjaF9rZXksIGlub2RlLT5pX2lubywgSEZTUExVU19JKGlub2RlKS5jYWNoZWRfc3RhcnQsCisJCQkgICAgICBIRlNQTFVTX0lTX1JTUkMoaW5vZGUpID8gIEhGU1BMVVNfVFlQRV9SU1JDIDogSEZTUExVU19UWVBFX0RBVEEpOworCXJlcyA9IGhmc19icmVjX2ZpbmQoZmQpOworCWlmIChIRlNQTFVTX0koaW5vZGUpLmZsYWdzICYgSEZTUExVU19GTEdfRVhUX05FVykgeworCQlpZiAocmVzICE9IC1FTk9FTlQpCisJCQlyZXR1cm47CisJCWhmc19icmVjX2luc2VydChmZCwgSEZTUExVU19JKGlub2RlKS5jYWNoZWRfZXh0ZW50cywgc2l6ZW9mKGhmc3BsdXNfZXh0ZW50X3JlYykpOworCQlIRlNQTFVTX0koaW5vZGUpLmZsYWdzICY9IH4oSEZTUExVU19GTEdfRVhUX0RJUlRZIHwgSEZTUExVU19GTEdfRVhUX05FVyk7CisJfSBlbHNlIHsKKwkJaWYgKHJlcykKKwkJCXJldHVybjsKKwkJaGZzX2Jub2RlX3dyaXRlKGZkLT5ibm9kZSwgSEZTUExVU19JKGlub2RlKS5jYWNoZWRfZXh0ZW50cywgZmQtPmVudHJ5b2Zmc2V0LCBmZC0+ZW50cnlsZW5ndGgpOworCQlIRlNQTFVTX0koaW5vZGUpLmZsYWdzICY9IH5IRlNQTFVTX0ZMR19FWFRfRElSVFk7CisJfQorfQorCit2b2lkIGhmc3BsdXNfZXh0X3dyaXRlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmIChIRlNQTFVTX0koaW5vZGUpLmZsYWdzICYgSEZTUExVU19GTEdfRVhUX0RJUlRZKSB7CisJCXN0cnVjdCBoZnNfZmluZF9kYXRhIGZkOworCisJCWhmc19maW5kX2luaXQoSEZTUExVU19TQihpbm9kZS0+aV9zYikuZXh0X3RyZWUsICZmZCk7CisJCV9faGZzcGx1c19leHRfd3JpdGVfZXh0ZW50KGlub2RlLCAmZmQpOworCQloZnNfZmluZF9leGl0KCZmZCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBfX2hmc3BsdXNfZXh0X3JlYWRfZXh0ZW50KHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCwKKwkJCQkJICAgIHN0cnVjdCBoZnNwbHVzX2V4dGVudCAqZXh0ZW50LAorCQkJCQkgICAgdTMyIGNuaWQsIHUzMiBibG9jaywgdTggdHlwZSkKK3sKKwlpbnQgcmVzOworCisJaGZzcGx1c19leHRfYnVpbGRfa2V5KGZkLT5zZWFyY2hfa2V5LCBjbmlkLCBibG9jaywgdHlwZSk7CisJZmQtPmtleS0+ZXh0LmNuaWQgPSAwOworCXJlcyA9IGhmc19icmVjX2ZpbmQoZmQpOworCWlmIChyZXMgJiYgcmVzICE9IC1FTk9FTlQpCisJCXJldHVybiByZXM7CisJaWYgKGZkLT5rZXktPmV4dC5jbmlkICE9IGZkLT5zZWFyY2hfa2V5LT5leHQuY25pZCB8fAorCSAgICBmZC0+a2V5LT5leHQuZm9ya190eXBlICE9IGZkLT5zZWFyY2hfa2V5LT5leHQuZm9ya190eXBlKQorCQlyZXR1cm4gLUVOT0VOVDsKKwlpZiAoZmQtPmVudHJ5bGVuZ3RoICE9IHNpemVvZihoZnNwbHVzX2V4dGVudF9yZWMpKQorCQlyZXR1cm4gLUVJTzsKKwloZnNfYm5vZGVfcmVhZChmZC0+Ym5vZGUsIGV4dGVudCwgZmQtPmVudHJ5b2Zmc2V0LCBzaXplb2YoaGZzcGx1c19leHRlbnRfcmVjKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9faGZzcGx1c19leHRfY2FjaGVfZXh0ZW50KHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCwgc3RydWN0IGlub2RlICppbm9kZSwgdTMyIGJsb2NrKQoreworCWludCByZXM7CisKKwlpZiAoSEZTUExVU19JKGlub2RlKS5mbGFncyAmIEhGU1BMVVNfRkxHX0VYVF9ESVJUWSkKKwkJX19oZnNwbHVzX2V4dF93cml0ZV9leHRlbnQoaW5vZGUsIGZkKTsKKworCXJlcyA9IF9faGZzcGx1c19leHRfcmVhZF9leHRlbnQoZmQsIEhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX2V4dGVudHMsIGlub2RlLT5pX2lubywKKwkJCQkJYmxvY2ssIEhGU1BMVVNfSVNfUlNSQyhpbm9kZSkgPyBIRlNQTFVTX1RZUEVfUlNSQyA6IEhGU1BMVVNfVFlQRV9EQVRBKTsKKwlpZiAoIXJlcykgeworCQlIRlNQTFVTX0koaW5vZGUpLmNhY2hlZF9zdGFydCA9IGJlMzJfdG9fY3B1KGZkLT5rZXktPmV4dC5zdGFydF9ibG9jayk7CisJCUhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX2Jsb2NrcyA9IGhmc3BsdXNfZXh0X2Jsb2NrX2NvdW50KEhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX2V4dGVudHMpOworCX0gZWxzZSB7CisJCUhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX3N0YXJ0ID0gSEZTUExVU19JKGlub2RlKS5jYWNoZWRfYmxvY2tzID0gMDsKKwkJSEZTUExVU19JKGlub2RlKS5mbGFncyAmPSB+KEhGU1BMVVNfRkxHX0VYVF9ESVJUWSB8IEhGU1BMVVNfRkxHX0VYVF9ORVcpOworCX0KKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfZXh0X3JlYWRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiBibG9jaykKK3sKKwlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBmZDsKKwlpbnQgcmVzOworCisJaWYgKGJsb2NrID49IEhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX3N0YXJ0ICYmCisJICAgIGJsb2NrIDwgSEZTUExVU19JKGlub2RlKS5jYWNoZWRfc3RhcnQgKyBIRlNQTFVTX0koaW5vZGUpLmNhY2hlZF9ibG9ja3MpCisJCXJldHVybiAwOworCisJaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKGlub2RlLT5pX3NiKS5leHRfdHJlZSwgJmZkKTsKKwlyZXMgPSBfX2hmc3BsdXNfZXh0X2NhY2hlX2V4dGVudCgmZmQsIGlub2RlLCBibG9jayk7CisJaGZzX2ZpbmRfZXhpdCgmZmQpOworCXJldHVybiByZXM7Cit9CisKKy8qIEdldCBhIGJsb2NrIGF0IGlibG9jayBmb3IgaW5vZGUsIHBvc3NpYmx5IGFsbG9jYXRpbmcgaWYgY3JlYXRlICovCitpbnQgaGZzcGx1c19nZXRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgaWJsb2NrLAorCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCWludCByZXMgPSAtRUlPOworCXUzMiBhYmxvY2ssIGRibG9jaywgbWFzazsKKwlpbnQgc2hpZnQ7CisKKwlzYiA9IGlub2RlLT5pX3NiOworCisJLyogQ29udmVydCBpbm9kZSBibG9jayB0byBkaXNrIGFsbG9jYXRpb24gYmxvY2sgKi8KKwlzaGlmdCA9IEhGU1BMVVNfU0Ioc2IpLmFsbG9jX2Jsa3N6X3NoaWZ0IC0gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJYWJsb2NrID0gaWJsb2NrID4+IEhGU1BMVVNfU0Ioc2IpLmZzX3NoaWZ0OworCisJaWYgKGlibG9jayA+PSBIRlNQTFVTX0koaW5vZGUpLmZzX2Jsb2NrcykgeworCQlpZiAoaWJsb2NrID4gSEZTUExVU19JKGlub2RlKS5mc19ibG9ja3MgfHwgIWNyZWF0ZSkKKwkJCXJldHVybiAtRUlPOworCQlpZiAoYWJsb2NrID49IEhGU1BMVVNfSShpbm9kZSkuYWxsb2NfYmxvY2tzKSB7CisJCQlyZXMgPSBoZnNwbHVzX2ZpbGVfZXh0ZW5kKGlub2RlKTsKKwkJCWlmIChyZXMpCisJCQkJcmV0dXJuIHJlczsKKwkJfQorCX0gZWxzZQorCQljcmVhdGUgPSAwOworCisJaWYgKGFibG9jayA8IEhGU1BMVVNfSShpbm9kZSkuZmlyc3RfYmxvY2tzKSB7CisJCWRibG9jayA9IGhmc3BsdXNfZXh0X2ZpbmRfYmxvY2soSEZTUExVU19JKGlub2RlKS5maXJzdF9leHRlbnRzLCBhYmxvY2spOworCQlnb3RvIGRvbmU7CisJfQorCisJZG93bigmSEZTUExVU19JKGlub2RlKS5leHRlbnRzX2xvY2spOworCXJlcyA9IGhmc3BsdXNfZXh0X3JlYWRfZXh0ZW50KGlub2RlLCBhYmxvY2spOworCWlmICghcmVzKSB7CisJCWRibG9jayA9IGhmc3BsdXNfZXh0X2ZpbmRfYmxvY2soSEZTUExVU19JKGlub2RlKS5jYWNoZWRfZXh0ZW50cywgYWJsb2NrIC0KKwkJCQkJICAgICBIRlNQTFVTX0koaW5vZGUpLmNhY2hlZF9zdGFydCk7CisJfSBlbHNlIHsKKwkJdXAoJkhGU1BMVVNfSShpbm9kZSkuZXh0ZW50c19sb2NrKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXVwKCZIRlNQTFVTX0koaW5vZGUpLmV4dGVudHNfbG9jayk7CisKK2RvbmU6CisJZHByaW50KERCR19FWFRFTlQsICJnZXRfYmxvY2soJWx1KTogJWxsdSAtICV1XG4iLCBpbm9kZS0+aV9pbm8sIChsb25nIGxvbmcpaWJsb2NrLCBkYmxvY2spOworCW1hc2sgPSAoMSA8PCBIRlNQTFVTX1NCKHNiKS5mc19zaGlmdCkgLSAxOworCW1hcF9iaChiaF9yZXN1bHQsIHNiLCAoZGJsb2NrIDw8IEhGU1BMVVNfU0Ioc2IpLmZzX3NoaWZ0KSArIEhGU1BMVVNfU0Ioc2IpLmJsb2Nrb2Zmc2V0ICsgKGlibG9jayAmIG1hc2spKTsKKwlpZiAoY3JlYXRlKSB7CisJCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJCUhGU1BMVVNfSShpbm9kZSkucGh5c19zaXplICs9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwkJSEZTUExVU19JKGlub2RlKS5mc19ibG9ja3MrKzsKKwkJaW5vZGVfYWRkX2J5dGVzKGlub2RlLCBzYi0+c19ibG9ja3NpemUpOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhmc3BsdXNfZHVtcF9leHRlbnQoc3RydWN0IGhmc3BsdXNfZXh0ZW50ICpleHRlbnQpCit7CisJaW50IGk7CisKKwlkcHJpbnQoREJHX0VYVEVOVCwgIiAgICIpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWRwcmludChEQkdfRVhURU5ULCAiICV1OiV1IiwgYmUzMl90b19jcHUoZXh0ZW50W2ldLnN0YXJ0X2Jsb2NrKSwKKwkJCQkgYmUzMl90b19jcHUoZXh0ZW50W2ldLmJsb2NrX2NvdW50KSk7CisJZHByaW50KERCR19FWFRFTlQsICJcbiIpOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfYWRkX2V4dGVudChzdHJ1Y3QgaGZzcGx1c19leHRlbnQgKmV4dGVudCwgdTMyIG9mZnNldCwKKwkJCSAgICAgIHUzMiBhbGxvY19ibG9jaywgdTMyIGJsb2NrX2NvdW50KQoreworCXUzMiBjb3VudCwgc3RhcnQ7CisJaW50IGk7CisKKwloZnNwbHVzX2R1bXBfZXh0ZW50KGV4dGVudCk7CisJZm9yIChpID0gMDsgaSA8IDg7IGV4dGVudCsrLCBpKyspIHsKKwkJY291bnQgPSBiZTMyX3RvX2NwdShleHRlbnQtPmJsb2NrX2NvdW50KTsKKwkJaWYgKG9mZnNldCA9PSBjb3VudCkgeworCQkJc3RhcnQgPSBiZTMyX3RvX2NwdShleHRlbnQtPnN0YXJ0X2Jsb2NrKTsKKwkJCWlmIChhbGxvY19ibG9jayAhPSBzdGFydCArIGNvdW50KSB7CisJCQkJaWYgKCsraSA+PSA4KQorCQkJCQlyZXR1cm4gLUVOT1NQQzsKKwkJCQlleHRlbnQrKzsKKwkJCQlleHRlbnQtPnN0YXJ0X2Jsb2NrID0gY3B1X3RvX2JlMzIoYWxsb2NfYmxvY2spOworCQkJfSBlbHNlCisJCQkJYmxvY2tfY291bnQgKz0gY291bnQ7CisJCQlleHRlbnQtPmJsb2NrX2NvdW50ID0gY3B1X3RvX2JlMzIoYmxvY2tfY291bnQpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAob2Zmc2V0IDwgY291bnQpCisJCQlicmVhazsKKwkJb2Zmc2V0IC09IGNvdW50OworCX0KKwkvKiBwYW5pYz8gKi8KKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBoZnNwbHVzX2ZyZWVfZXh0ZW50cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCXN0cnVjdCBoZnNwbHVzX2V4dGVudCAqZXh0ZW50LAorCQkJCXUzMiBvZmZzZXQsIHUzMiBibG9ja19ucikKK3sKKwl1MzIgY291bnQsIHN0YXJ0OworCWludCBpOworCisJaGZzcGx1c19kdW1wX2V4dGVudChleHRlbnQpOworCWZvciAoaSA9IDA7IGkgPCA4OyBleHRlbnQrKywgaSsrKSB7CisJCWNvdW50ID0gYmUzMl90b19jcHUoZXh0ZW50LT5ibG9ja19jb3VudCk7CisJCWlmIChvZmZzZXQgPT0gY291bnQpCisJCQlnb3RvIGZvdW5kOworCQllbHNlIGlmIChvZmZzZXQgPCBjb3VudCkKKwkJCWJyZWFrOworCQlvZmZzZXQgLT0gY291bnQ7CisJfQorCS8qIHBhbmljPyAqLworCXJldHVybiAtRUlPOworZm91bmQ6CisJZm9yICg7OykgeworCQlzdGFydCA9IGJlMzJfdG9fY3B1KGV4dGVudC0+c3RhcnRfYmxvY2spOworCQlpZiAoY291bnQgPD0gYmxvY2tfbnIpIHsKKwkJCWhmc3BsdXNfYmxvY2tfZnJlZShzYiwgc3RhcnQsIGNvdW50KTsKKwkJCWV4dGVudC0+YmxvY2tfY291bnQgPSAwOworCQkJZXh0ZW50LT5zdGFydF9ibG9jayA9IDA7CisJCQlibG9ja19uciAtPSBjb3VudDsKKwkJfSBlbHNlIHsKKwkJCWNvdW50IC09IGJsb2NrX25yOworCQkJaGZzcGx1c19ibG9ja19mcmVlKHNiLCBzdGFydCArIGNvdW50LCBibG9ja19ucik7CisJCQlleHRlbnQtPmJsb2NrX2NvdW50ID0gY3B1X3RvX2JlMzIoY291bnQpOworCQkJYmxvY2tfbnIgPSAwOworCQl9CisJCWlmICghYmxvY2tfbnIgfHwgIWkpCisJCQlyZXR1cm4gMDsKKwkJaS0tOworCQlleHRlbnQtLTsKKwkJY291bnQgPSBiZTMyX3RvX2NwdShleHRlbnQtPmJsb2NrX2NvdW50KTsKKwl9Cit9CisKK2ludCBoZnNwbHVzX2ZyZWVfZm9yayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MzIgY25pZCwgc3RydWN0IGhmc3BsdXNfZm9ya19yYXcgKmZvcmssIGludCB0eXBlKQoreworCXN0cnVjdCBoZnNfZmluZF9kYXRhIGZkOworCWhmc3BsdXNfZXh0ZW50X3JlYyBleHRfZW50cnk7CisJdTMyIHRvdGFsX2Jsb2NrcywgYmxvY2tzLCBzdGFydDsKKwlpbnQgcmVzLCBpOworCisJdG90YWxfYmxvY2tzID0gYmUzMl90b19jcHUoZm9yay0+dG90YWxfYmxvY2tzKTsKKwlpZiAoIXRvdGFsX2Jsb2NrcykKKwkJcmV0dXJuIDA7CisKKwlibG9ja3MgPSAwOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWJsb2NrcyArPSBiZTMyX3RvX2NwdShmb3JrLT5leHRlbnRzW2ldLmJsb2NrX2NvdW50KTsKKworCXJlcyA9IGhmc3BsdXNfZnJlZV9leHRlbnRzKHNiLCBmb3JrLT5leHRlbnRzLCBibG9ja3MsIGJsb2Nrcyk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKwlpZiAodG90YWxfYmxvY2tzID09IGJsb2NrcykKKwkJcmV0dXJuIDA7CisKKwloZnNfZmluZF9pbml0KEhGU1BMVVNfU0Ioc2IpLmV4dF90cmVlLCAmZmQpOworCWRvIHsKKwkJcmVzID0gX19oZnNwbHVzX2V4dF9yZWFkX2V4dGVudCgmZmQsIGV4dF9lbnRyeSwgY25pZCwKKwkJCQkJCXRvdGFsX2Jsb2NrcywgdHlwZSk7CisJCWlmIChyZXMpCisJCQlicmVhazsKKwkJc3RhcnQgPSBiZTMyX3RvX2NwdShmZC5rZXktPmV4dC5zdGFydF9ibG9jayk7CisJCWhmc3BsdXNfZnJlZV9leHRlbnRzKHNiLCBleHRfZW50cnksCisJCQkJICAgICB0b3RhbF9ibG9ja3MgLSBzdGFydCwKKwkJCQkgICAgIHRvdGFsX2Jsb2Nrcyk7CisJCWhmc19icmVjX3JlbW92ZSgmZmQpOworCQl0b3RhbF9ibG9ja3MgPSBzdGFydDsKKwl9IHdoaWxlICh0b3RhbF9ibG9ja3MgPiBibG9ja3MpOworCWhmc19maW5kX2V4aXQoJmZkKTsKKworCXJldHVybiByZXM7Cit9CisKK2ludCBoZnNwbHVzX2ZpbGVfZXh0ZW5kKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXUzMiBzdGFydCwgbGVuLCBnb2FsOworCWludCByZXM7CisKKwlpZiAoSEZTUExVU19TQihzYikuYWxsb2NfZmlsZS0+aV9zaXplICogOCA8IEhGU1BMVVNfU0Ioc2IpLnRvdGFsX2Jsb2NrcyAtIEhGU1BMVVNfU0Ioc2IpLmZyZWVfYmxvY2tzICsgOCkgeworCQkvLyBleHRlbmQgYWxsb2MgZmlsZQorCQlwcmludGsoImV4dGVuZCBhbGxvYyBmaWxlISAoJUx1LCV1LCV1KVxuIiwgSEZTUExVU19TQihzYikuYWxsb2NfZmlsZS0+aV9zaXplICogOCwKKwkJCUhGU1BMVVNfU0Ioc2IpLnRvdGFsX2Jsb2NrcywgSEZTUExVU19TQihzYikuZnJlZV9ibG9ja3MpOworCQlyZXR1cm4gLUVOT1NQQzsKKwkJLy9CVUcoKTsKKwl9CisKKwlkb3duKCZIRlNQTFVTX0koaW5vZGUpLmV4dGVudHNfbG9jayk7CisJaWYgKEhGU1BMVVNfSShpbm9kZSkuYWxsb2NfYmxvY2tzID09IEhGU1BMVVNfSShpbm9kZSkuZmlyc3RfYmxvY2tzKQorCQlnb2FsID0gaGZzcGx1c19leHRfbGFzdGJsb2NrKEhGU1BMVVNfSShpbm9kZSkuZmlyc3RfZXh0ZW50cyk7CisJZWxzZSB7CisJCXJlcyA9IGhmc3BsdXNfZXh0X3JlYWRfZXh0ZW50KGlub2RlLCBIRlNQTFVTX0koaW5vZGUpLmFsbG9jX2Jsb2Nrcyk7CisJCWlmIChyZXMpCisJCQlnb3RvIG91dDsKKwkJZ29hbCA9IGhmc3BsdXNfZXh0X2xhc3RibG9jayhIRlNQTFVTX0koaW5vZGUpLmNhY2hlZF9leHRlbnRzKTsKKwl9CisKKwlsZW4gPSBIRlNQTFVTX0koaW5vZGUpLmNsdW1wX2Jsb2NrczsKKwlzdGFydCA9IGhmc3BsdXNfYmxvY2tfYWxsb2NhdGUoc2IsIEhGU1BMVVNfU0Ioc2IpLnRvdGFsX2Jsb2NrcywgZ29hbCwgJmxlbik7CisJaWYgKHN0YXJ0ID49IEhGU1BMVVNfU0Ioc2IpLnRvdGFsX2Jsb2NrcykgeworCQlzdGFydCA9IGhmc3BsdXNfYmxvY2tfYWxsb2NhdGUoc2IsIGdvYWwsIDAsICZsZW4pOworCQlpZiAoc3RhcnQgPj0gZ29hbCkgeworCQkJcmVzID0gLUVOT1NQQzsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJZHByaW50KERCR19FWFRFTlQsICJleHRlbmQgJWx1OiAldSwldVxuIiwgaW5vZGUtPmlfaW5vLCBzdGFydCwgbGVuKTsKKwlpZiAoSEZTUExVU19JKGlub2RlKS5hbGxvY19ibG9ja3MgPD0gSEZTUExVU19JKGlub2RlKS5maXJzdF9ibG9ja3MpIHsKKwkJaWYgKCFIRlNQTFVTX0koaW5vZGUpLmZpcnN0X2Jsb2NrcykgeworCQkJZHByaW50KERCR19FWFRFTlQsICJmaXJzdCBleHRlbnRzXG4iKTsKKwkJCS8qIG5vIGV4dGVudHMgeWV0ICovCisJCQlIRlNQTFVTX0koaW5vZGUpLmZpcnN0X2V4dGVudHNbMF0uc3RhcnRfYmxvY2sgPSBjcHVfdG9fYmUzMihzdGFydCk7CisJCQlIRlNQTFVTX0koaW5vZGUpLmZpcnN0X2V4dGVudHNbMF0uYmxvY2tfY291bnQgPSBjcHVfdG9fYmUzMihsZW4pOworCQkJcmVzID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIHRyeSB0byBhcHBlbmQgdG8gZXh0ZW50cyBpbiBpbm9kZSAqLworCQkJcmVzID0gaGZzcGx1c19hZGRfZXh0ZW50KEhGU1BMVVNfSShpbm9kZSkuZmlyc3RfZXh0ZW50cywKKwkJCQkJCSBIRlNQTFVTX0koaW5vZGUpLmFsbG9jX2Jsb2NrcywKKwkJCQkJCSBzdGFydCwgbGVuKTsKKwkJCWlmIChyZXMgPT0gLUVOT1NQQykKKwkJCQlnb3RvIGluc2VydF9leHRlbnQ7CisJCX0KKwkJaWYgKCFyZXMpIHsKKwkJCWhmc3BsdXNfZHVtcF9leHRlbnQoSEZTUExVU19JKGlub2RlKS5maXJzdF9leHRlbnRzKTsKKwkJCUhGU1BMVVNfSShpbm9kZSkuZmlyc3RfYmxvY2tzICs9IGxlbjsKKwkJfQorCX0gZWxzZSB7CisJCXJlcyA9IGhmc3BsdXNfYWRkX2V4dGVudChIRlNQTFVTX0koaW5vZGUpLmNhY2hlZF9leHRlbnRzLAorCQkJCQkgSEZTUExVU19JKGlub2RlKS5hbGxvY19ibG9ja3MgLQorCQkJCQkgSEZTUExVU19JKGlub2RlKS5jYWNoZWRfc3RhcnQsCisJCQkJCSBzdGFydCwgbGVuKTsKKwkJaWYgKCFyZXMpIHsKKwkJCWhmc3BsdXNfZHVtcF9leHRlbnQoSEZTUExVU19JKGlub2RlKS5jYWNoZWRfZXh0ZW50cyk7CisJCQlIRlNQTFVTX0koaW5vZGUpLmZsYWdzIHw9IEhGU1BMVVNfRkxHX0VYVF9ESVJUWTsKKwkJCUhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX2Jsb2NrcyArPSBsZW47CisJCX0gZWxzZSBpZiAocmVzID09IC1FTk9TUEMpCisJCQlnb3RvIGluc2VydF9leHRlbnQ7CisJfQorb3V0OgorCXVwKCZIRlNQTFVTX0koaW5vZGUpLmV4dGVudHNfbG9jayk7CisJaWYgKCFyZXMpIHsKKwkJSEZTUExVU19JKGlub2RlKS5hbGxvY19ibG9ja3MgKz0gbGVuOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl9CisJcmV0dXJuIHJlczsKKworaW5zZXJ0X2V4dGVudDoKKwlkcHJpbnQoREJHX0VYVEVOVCwgImluc2VydCBuZXcgZXh0ZW50XG4iKTsKKwloZnNwbHVzX2V4dF93cml0ZV9leHRlbnQoaW5vZGUpOworCisJbWVtc2V0KEhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX2V4dGVudHMsIDAsIHNpemVvZihoZnNwbHVzX2V4dGVudF9yZWMpKTsKKwlIRlNQTFVTX0koaW5vZGUpLmNhY2hlZF9leHRlbnRzWzBdLnN0YXJ0X2Jsb2NrID0gY3B1X3RvX2JlMzIoc3RhcnQpOworCUhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX2V4dGVudHNbMF0uYmxvY2tfY291bnQgPSBjcHVfdG9fYmUzMihsZW4pOworCWhmc3BsdXNfZHVtcF9leHRlbnQoSEZTUExVU19JKGlub2RlKS5jYWNoZWRfZXh0ZW50cyk7CisJSEZTUExVU19JKGlub2RlKS5mbGFncyB8PSBIRlNQTFVTX0ZMR19FWFRfRElSVFkgfCBIRlNQTFVTX0ZMR19FWFRfTkVXOworCUhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX3N0YXJ0ID0gSEZTUExVU19JKGlub2RlKS5hbGxvY19ibG9ja3M7CisJSEZTUExVU19JKGlub2RlKS5jYWNoZWRfYmxvY2tzID0gbGVuOworCisJcmVzID0gMDsKKwlnb3RvIG91dDsKK30KKwordm9pZCBoZnNwbHVzX2ZpbGVfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJdTMyIGFsbG9jX2NudCwgYmxrX2NudCwgc3RhcnQ7CisJaW50IHJlczsKKworCWRwcmludChEQkdfSU5PREUsICJ0cnVuY2F0ZTogJWx1LCAlTHUgLT4gJUx1XG4iLCBpbm9kZS0+aV9pbm8sCisJICAgICAgIChsb25nIGxvbmcpSEZTUExVU19JKGlub2RlKS5waHlzX3NpemUsIGlub2RlLT5pX3NpemUpOworCWlmIChpbm9kZS0+aV9zaXplID4gSEZTUExVU19JKGlub2RlKS5waHlzX3NpemUpIHsKKwkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJdTMyIHNpemUgPSBpbm9kZS0+aV9zaXplIC0gMTsKKwkJaW50IHJlczsKKworCQlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIHNpemUgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJCWlmICghcGFnZSkKKwkJCXJldHVybjsKKwkJc2l6ZSAmPSBQQUdFX0NBQ0hFX1NJWkUgLSAxOworCQlzaXplKys7CisJCXJlcyA9IG1hcHBpbmctPmFfb3BzLT5wcmVwYXJlX3dyaXRlKE5VTEwsIHBhZ2UsIHNpemUsIHNpemUpOworCQlpZiAoIXJlcykKKwkJCXJlcyA9IG1hcHBpbmctPmFfb3BzLT5jb21taXRfd3JpdGUoTlVMTCwgcGFnZSwgc2l6ZSwgc2l6ZSk7CisJCWlmIChyZXMpCisJCQlpbm9kZS0+aV9zaXplID0gSEZTUExVU19JKGlub2RlKS5waHlzX3NpemU7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlyZXR1cm47CisJfQorCWJsa19jbnQgPSAoaW5vZGUtPmlfc2l6ZSArIEhGU1BMVVNfU0Ioc2IpLmFsbG9jX2Jsa3N6IC0gMSkgPj4gSEZTUExVU19TQihzYikuYWxsb2NfYmxrc3pfc2hpZnQ7CisJYWxsb2NfY250ID0gSEZTUExVU19JKGlub2RlKS5hbGxvY19ibG9ja3M7CisJaWYgKGJsa19jbnQgPT0gYWxsb2NfY250KQorCQlnb3RvIG91dDsKKworCWRvd24oJkhGU1BMVVNfSShpbm9kZSkuZXh0ZW50c19sb2NrKTsKKwloZnNfZmluZF9pbml0KEhGU1BMVVNfU0Ioc2IpLmV4dF90cmVlLCAmZmQpOworCXdoaWxlICgxKSB7CisJCWlmIChhbGxvY19jbnQgPT0gSEZTUExVU19JKGlub2RlKS5maXJzdF9ibG9ja3MpIHsKKwkJCWhmc3BsdXNfZnJlZV9leHRlbnRzKHNiLCBIRlNQTFVTX0koaW5vZGUpLmZpcnN0X2V4dGVudHMsCisJCQkJCSAgICAgYWxsb2NfY250LCBhbGxvY19jbnQgLSBibGtfY250KTsKKwkJCWhmc3BsdXNfZHVtcF9leHRlbnQoSEZTUExVU19JKGlub2RlKS5maXJzdF9leHRlbnRzKTsKKwkJCUhGU1BMVVNfSShpbm9kZSkuZmlyc3RfYmxvY2tzID0gYmxrX2NudDsKKwkJCWJyZWFrOworCQl9CisJCXJlcyA9IF9faGZzcGx1c19leHRfY2FjaGVfZXh0ZW50KCZmZCwgaW5vZGUsIGFsbG9jX2NudCk7CisJCWlmIChyZXMpCisJCQlicmVhazsKKwkJc3RhcnQgPSBIRlNQTFVTX0koaW5vZGUpLmNhY2hlZF9zdGFydDsKKwkJaGZzcGx1c19mcmVlX2V4dGVudHMoc2IsIEhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX2V4dGVudHMsCisJCQkJICAgICBhbGxvY19jbnQgLSBzdGFydCwgYWxsb2NfY250IC0gYmxrX2NudCk7CisJCWhmc3BsdXNfZHVtcF9leHRlbnQoSEZTUExVU19JKGlub2RlKS5jYWNoZWRfZXh0ZW50cyk7CisJCWlmIChibGtfY250ID4gc3RhcnQpIHsKKwkJCUhGU1BMVVNfSShpbm9kZSkuZmxhZ3MgfD0gSEZTUExVU19GTEdfRVhUX0RJUlRZOworCQkJYnJlYWs7CisJCX0KKwkJYWxsb2NfY250ID0gc3RhcnQ7CisJCUhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX3N0YXJ0ID0gSEZTUExVU19JKGlub2RlKS5jYWNoZWRfYmxvY2tzID0gMDsKKwkJSEZTUExVU19JKGlub2RlKS5mbGFncyAmPSB+KEhGU1BMVVNfRkxHX0VYVF9ESVJUWSB8IEhGU1BMVVNfRkxHX0VYVF9ORVcpOworCQloZnNfYnJlY19yZW1vdmUoJmZkKTsKKwl9CisJaGZzX2ZpbmRfZXhpdCgmZmQpOworCXVwKCZIRlNQTFVTX0koaW5vZGUpLmV4dGVudHNfbG9jayk7CisKKwlIRlNQTFVTX0koaW5vZGUpLmFsbG9jX2Jsb2NrcyA9IGJsa19jbnQ7CitvdXQ6CisJSEZTUExVU19JKGlub2RlKS5waHlzX3NpemUgPSBpbm9kZS0+aV9zaXplOworCUhGU1BMVVNfSShpbm9kZSkuZnNfYmxvY2tzID0gKGlub2RlLT5pX3NpemUgKyBzYi0+c19ibG9ja3NpemUgLSAxKSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwlpbm9kZV9zZXRfYnl0ZXMoaW5vZGUsIEhGU1BMVVNfSShpbm9kZSkuZnNfYmxvY2tzIDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvaGZzcGx1c19mcy5oIGIvZnMvaGZzcGx1cy9oZnNwbHVzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzMDk0YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmc3BsdXMvaGZzcGx1c19mcy5oCkBAIC0wLDAgKzEsNDE0IEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvbGludXgvaGZzcGx1c19mcy5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5CisgKiBCcmFkIEJveWVyIChmbGFyQHBhbnRzLm51KQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9IRlNQTFVTX0ZTX0gKKyNkZWZpbmUgX0xJTlVYX0hGU1BMVVNfRlNfSAorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlICJoZnNwbHVzX3Jhdy5oIgorCisjZGVmaW5lIERCR19CTk9ERV9SRUZTCTB4MDAwMDAwMDEKKyNkZWZpbmUgREJHX0JOT0RFX01PRAkweDAwMDAwMDAyCisjZGVmaW5lIERCR19DQVRfTU9ECTB4MDAwMDAwMDQKKyNkZWZpbmUgREJHX0lOT0RFCTB4MDAwMDAwMDgKKyNkZWZpbmUgREJHX1NVUEVSCTB4MDAwMDAwMTAKKyNkZWZpbmUgREJHX0VYVEVOVAkweDAwMDAwMDIwCisjZGVmaW5lIERCR19CSVRNQVAJMHgwMDAwMDA0MAorCisvLyNkZWZpbmUgREJHX01BU0sJKERCR19FWFRFTlR8REJHX0lOT0RFfERCR19CTk9ERV9NT0QpCisvLyNkZWZpbmUgREJHX01BU0sJKERCR19CTk9ERV9NT0R8REJHX0NBVF9NT0R8REJHX0lOT0RFKQorLy8jZGVmaW5lIERCR19NQVNLCShEQkdfQ0FUX01PRHxEQkdfQk5PREVfUkVGU3xEQkdfSU5PREV8REJHX0VYVEVOVCkKKyNkZWZpbmUgREJHX01BU0sJKDApCisKKyNkZWZpbmUgZHByaW50KGZsZywgZm10LCBhcmdzLi4uKSBcCisJaWYgKGZsZyAmIERCR19NQVNLKSBwcmludGsoZm10ICwgIyMgYXJncykKKworLyogUnVudGltZSBjb25maWcgb3B0aW9ucyAqLworI2RlZmluZSBIRlNQTFVTX0RFRl9DUl9UWVBFICAgIDB4M0YzRjNGM0YgIC8qICc/Pz8/JyAqLworCisjZGVmaW5lIEhGU1BMVVNfVFlQRV9EQVRBIDB4MDAKKyNkZWZpbmUgSEZTUExVU19UWVBFX1JTUkMgMHhGRgorCit0eXBlZGVmIGludCAoKmJ0cmVlX2tleWNtcCkoaGZzcGx1c19idHJlZV9rZXkgKiwgaGZzcGx1c19idHJlZV9rZXkgKik7CisKKyNkZWZpbmUgTk9ERV9IQVNIX1NJWkUJMjU2CisKKy8qIEFuIEhGUysgQlRyZWUgaGVsZCBpbiBtZW1vcnkgKi8KK3N0cnVjdCBoZnNfYnRyZWUgeworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlidHJlZV9rZXljbXAga2V5Y21wOworCisJdTMyIGNuaWQ7CisJdTMyIHJvb3Q7CisJdTMyIGxlYWZfY291bnQ7CisJdTMyIGxlYWZfaGVhZDsKKwl1MzIgbGVhZl90YWlsOworCXUzMiBub2RlX2NvdW50OworCXUzMiBmcmVlX25vZGVzOworCXUzMiBhdHRyaWJ1dGVzOworCisJdW5zaWduZWQgaW50IG5vZGVfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgbm9kZV9zaXplX3NoaWZ0OworCXVuc2lnbmVkIGludCBtYXhfa2V5X2xlbjsKKwl1bnNpZ25lZCBpbnQgZGVwdGg7CisKKwkvL3Vuc2lnbmVkIGludCBtYXAxX3NpemUsIG1hcF9zaXplOworCXN0cnVjdCBzZW1hcGhvcmUgdHJlZV9sb2NrOworCisJdW5zaWduZWQgaW50IHBhZ2VzX3Blcl9ibm9kZTsKKwlzcGlubG9ja190IGhhc2hfbG9jazsKKwlzdHJ1Y3QgaGZzX2Jub2RlICpub2RlX2hhc2hbTk9ERV9IQVNIX1NJWkVdOworCWludCBub2RlX2hhc2hfY250OworfTsKKworc3RydWN0IHBhZ2U7CisKKy8qIEFuIEhGUysgQlRyZWUgbm9kZSBpbiBtZW1vcnkgKi8KK3N0cnVjdCBoZnNfYm5vZGUgeworCXN0cnVjdCBoZnNfYnRyZWUgKnRyZWU7CisKKwl1MzIgcHJldjsKKwl1MzIgdGhpczsKKwl1MzIgbmV4dDsKKwl1MzIgcGFyZW50OworCisJdTE2IG51bV9yZWNzOworCXU4IHR5cGU7CisJdTggaGVpZ2h0OworCisJc3RydWN0IGhmc19ibm9kZSAqbmV4dF9oYXNoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJd2FpdF9xdWV1ZV9oZWFkX3QgbG9ja193cTsKKwlhdG9taWNfdCByZWZjbnQ7CisJdW5zaWduZWQgaW50IHBhZ2Vfb2Zmc2V0OworCXN0cnVjdCBwYWdlICpwYWdlWzBdOworfTsKKworI2RlZmluZSBIRlNfQk5PREVfTE9DSwkJMAorI2RlZmluZSBIRlNfQk5PREVfRVJST1IJCTEKKyNkZWZpbmUgSEZTX0JOT0RFX05FVwkJMgorI2RlZmluZSBIRlNfQk5PREVfRElSVFkJCTMKKyNkZWZpbmUgSEZTX0JOT0RFX0RFTEVURUQJNAorCisvKgorICogSEZTKyBzdXBlcmJsb2NrIGluZm8gKGJ1aWx0IGZyb20gVm9sdW1lIEhlYWRlciBvbiBkaXNrKQorICovCisKK3N0cnVjdCBoZnNwbHVzX3ZoOworc3RydWN0IGhmc19idHJlZTsKKworc3RydWN0IGhmc3BsdXNfc2JfaW5mbyB7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpzX3ZoYmg7CisJc3RydWN0IGhmc3BsdXNfdmggKnNfdmhkcjsKKwlzdHJ1Y3QgaGZzX2J0cmVlICpleHRfdHJlZTsKKwlzdHJ1Y3QgaGZzX2J0cmVlICpjYXRfdHJlZTsKKwlzdHJ1Y3QgaGZzX2J0cmVlICphdHRyX3RyZWU7CisJc3RydWN0IGlub2RlICphbGxvY19maWxlOworCXN0cnVjdCBpbm9kZSAqaGlkZGVuX2RpcjsKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHM7CisKKwkvKiBSdW50aW1lIHZhcmlhYmxlcyAqLworCXUzMiBibG9ja29mZnNldDsKKwl1MzIgc2VjdF9jb3VudDsKKwlpbnQgZnNfc2hpZnQ7CisKKwkvKiBTdHVmZiBpbiBob3N0IG9yZGVyIGZyb20gVm9sIEhlYWRlciAqLworCXUzMiBhbGxvY19ibGtzejsKKwlpbnQgYWxsb2NfYmxrc3pfc2hpZnQ7CisJdTMyIHRvdGFsX2Jsb2NrczsKKwl1MzIgZnJlZV9ibG9ja3M7CisJdTMyIG5leHRfYWxsb2M7CisJdTMyIG5leHRfY25pZDsKKwl1MzIgZmlsZV9jb3VudDsKKwl1MzIgZm9sZGVyX2NvdW50OworCXUzMiBkYXRhX2NsdW1wX2Jsb2NrcywgcnNyY19jbHVtcF9ibG9ja3M7CisKKwkvKiBDb25maWcgb3B0aW9ucyAqLworCXUzMiBjcmVhdG9yOworCXUzMiB0eXBlOworCisJdW1vZGVfdCB1bWFzazsKKwl1aWRfdCB1aWQ7CisJZ2lkX3QgZ2lkOworCisJaW50IHBhcnQsIHNlc3Npb247CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYXRvbWljX3QgaW5vZGVfY250OworCXUzMiBsYXN0X2lub2RlX2NudDsKKworCXN0cnVjdCBobGlzdF9oZWFkIHJzcmNfaW5vZGVzOworfTsKKworI2RlZmluZSBIRlNQTFVTX1NCX1dSSVRFQkFDS1VQCTB4MDAwMQorI2RlZmluZSBIRlNQTFVTX1NCX05PREVDT01QT1NFCTB4MDAwMgorCisKK3N0cnVjdCBoZnNwbHVzX2lub2RlX2luZm8geworCXN0cnVjdCBzZW1hcGhvcmUgZXh0ZW50c19sb2NrOworCXUzMiBjbHVtcF9ibG9ja3MsIGFsbG9jX2Jsb2NrczsKKwlzZWN0b3JfdCBmc19ibG9ja3M7CisJLyogQWxsb2NhdGlvbiBleHRlbnRzIGZyb20gY2F0YWxvZyByZWNvcmQgb3Igdm9sdW1lIGhlYWRlciAqLworCWhmc3BsdXNfZXh0ZW50X3JlYyBmaXJzdF9leHRlbnRzOworCXUzMiBmaXJzdF9ibG9ja3M7CisJaGZzcGx1c19leHRlbnRfcmVjIGNhY2hlZF9leHRlbnRzOworCXUzMiBjYWNoZWRfc3RhcnQsIGNhY2hlZF9ibG9ja3M7CisJYXRvbWljX3Qgb3BlbmNudDsKKworCXN0cnVjdCBpbm9kZSAqcnNyY19pbm9kZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogRGV2aWNlIG51bWJlciBpbiBoZnNwbHVzX3Blcm1pc3Npb25zIGluIGNhdGFsb2cgKi8KKwl1MzIgZGV2OworCS8qIEJTRCBzeXN0ZW0gYW5kIHVzZXIgZmlsZSBmbGFncyAqLworCXU4IHJvb3RmbGFnczsKKwl1OCB1c2VyZmxhZ3M7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIG9wZW5fZGlyX2xpc3Q7CisJbG9mZl90IHBoeXNfc2l6ZTsKKwlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOworfTsKKworI2RlZmluZSBIRlNQTFVTX0ZMR19SU1JDCTB4MDAwMQorI2RlZmluZSBIRlNQTFVTX0ZMR19FWFRfRElSVFkJMHgwMDAyCisjZGVmaW5lIEhGU1BMVVNfRkxHX0VYVF9ORVcJMHgwMDA0CisKKyNkZWZpbmUgSEZTUExVU19JU19EQVRBKGlub2RlKSAgICghKEhGU1BMVVNfSShpbm9kZSkuZmxhZ3MgJiBIRlNQTFVTX0ZMR19SU1JDKSkKKyNkZWZpbmUgSEZTUExVU19JU19SU1JDKGlub2RlKSAgIChIRlNQTFVTX0koaW5vZGUpLmZsYWdzICYgSEZTUExVU19GTEdfUlNSQykKKworc3RydWN0IGhmc19maW5kX2RhdGEgeworCS8qIGZpbGxlZCBieSBjYWxsZXIgKi8KKwloZnNwbHVzX2J0cmVlX2tleSAqc2VhcmNoX2tleTsKKwloZnNwbHVzX2J0cmVlX2tleSAqa2V5OworCS8qIGZpbGxlZCBieSBmaW5kICovCisJc3RydWN0IGhmc19idHJlZSAqdHJlZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlICpibm9kZTsKKwkvKiBmaWxsZWQgYnkgZmluZHJlYyAqLworCWludCByZWNvcmQ7CisJaW50IGtleW9mZnNldCwga2V5bGVuZ3RoOworCWludCBlbnRyeW9mZnNldCwgZW50cnlsZW5ndGg7Cit9OworCitzdHJ1Y3QgaGZzcGx1c19yZWFkZGlyX2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzdHJ1Y3QgaGZzcGx1c19jYXRfa2V5IGtleTsKK307CisKKyNkZWZpbmUgaGZzX2J0cmVlX29wZW4gaGZzcGx1c19idHJlZV9vcGVuCisjZGVmaW5lIGhmc19idHJlZV9jbG9zZSBoZnNwbHVzX2J0cmVlX2Nsb3NlCisjZGVmaW5lIGhmc19idHJlZV93cml0ZSBoZnNwbHVzX2J0cmVlX3dyaXRlCisjZGVmaW5lIGhmc19ibWFwX2FsbG9jIGhmc3BsdXNfYm1hcF9hbGxvYworI2RlZmluZSBoZnNfYm1hcF9mcmVlIGhmc3BsdXNfYm1hcF9mcmVlCisjZGVmaW5lIGhmc19ibm9kZV9yZWFkIGhmc3BsdXNfYm5vZGVfcmVhZAorI2RlZmluZSBoZnNfYm5vZGVfcmVhZF91MTYgaGZzcGx1c19ibm9kZV9yZWFkX3UxNgorI2RlZmluZSBoZnNfYm5vZGVfcmVhZF91OCBoZnNwbHVzX2Jub2RlX3JlYWRfdTgKKyNkZWZpbmUgaGZzX2Jub2RlX3JlYWRfa2V5IGhmc3BsdXNfYm5vZGVfcmVhZF9rZXkKKyNkZWZpbmUgaGZzX2Jub2RlX3dyaXRlIGhmc3BsdXNfYm5vZGVfd3JpdGUKKyNkZWZpbmUgaGZzX2Jub2RlX3dyaXRlX3UxNiBoZnNwbHVzX2Jub2RlX3dyaXRlX3UxNgorI2RlZmluZSBoZnNfYm5vZGVfY2xlYXIgaGZzcGx1c19ibm9kZV9jbGVhcgorI2RlZmluZSBoZnNfYm5vZGVfY29weSBoZnNwbHVzX2Jub2RlX2NvcHkKKyNkZWZpbmUgaGZzX2Jub2RlX21vdmUgaGZzcGx1c19ibm9kZV9tb3ZlCisjZGVmaW5lIGhmc19ibm9kZV9kdW1wIGhmc3BsdXNfYm5vZGVfZHVtcAorI2RlZmluZSBoZnNfYm5vZGVfdW5saW5rIGhmc3BsdXNfYm5vZGVfdW5saW5rCisjZGVmaW5lIGhmc19ibm9kZV9maW5kaGFzaCBoZnNwbHVzX2Jub2RlX2ZpbmRoYXNoCisjZGVmaW5lIGhmc19ibm9kZV9maW5kIGhmc3BsdXNfYm5vZGVfZmluZAorI2RlZmluZSBoZnNfYm5vZGVfdW5oYXNoIGhmc3BsdXNfYm5vZGVfdW5oYXNoCisjZGVmaW5lIGhmc19ibm9kZV9mcmVlIGhmc3BsdXNfYm5vZGVfZnJlZQorI2RlZmluZSBoZnNfYm5vZGVfY3JlYXRlIGhmc3BsdXNfYm5vZGVfY3JlYXRlCisjZGVmaW5lIGhmc19ibm9kZV9nZXQgaGZzcGx1c19ibm9kZV9nZXQKKyNkZWZpbmUgaGZzX2Jub2RlX3B1dCBoZnNwbHVzX2Jub2RlX3B1dAorI2RlZmluZSBoZnNfYnJlY19sZW5vZmYgaGZzcGx1c19icmVjX2xlbm9mZgorI2RlZmluZSBoZnNfYnJlY19rZXlsZW4gaGZzcGx1c19icmVjX2tleWxlbgorI2RlZmluZSBoZnNfYnJlY19pbnNlcnQgaGZzcGx1c19icmVjX2luc2VydAorI2RlZmluZSBoZnNfYnJlY19yZW1vdmUgaGZzcGx1c19icmVjX3JlbW92ZQorI2RlZmluZSBoZnNfZmluZF9pbml0IGhmc3BsdXNfZmluZF9pbml0CisjZGVmaW5lIGhmc19maW5kX2V4aXQgaGZzcGx1c19maW5kX2V4aXQKKyNkZWZpbmUgX19oZnNfYnJlY19maW5kIF9faHBsdXNmc19icmVjX2ZpbmQKKyNkZWZpbmUgaGZzX2JyZWNfZmluZCBoZnNwbHVzX2JyZWNfZmluZAorI2RlZmluZSBoZnNfYnJlY19yZWFkIGhmc3BsdXNfYnJlY19yZWFkCisjZGVmaW5lIGhmc19icmVjX2dvdG8gaGZzcGx1c19icmVjX2dvdG8KKyNkZWZpbmUgaGZzX3BhcnRfZmluZCBoZnNwbHVzX3BhcnRfZmluZAorCisvKgorICogZGVmaW5pdGlvbnMgZm9yIGV4dDIgZmxhZyBpb2N0bHMgKGxpbnV4IHJlYWxseSBuZWVkcyBhIGdlbmVyaWMKKyAqIGludGVyZmFjZSBmb3IgdGhpcykuCisgKi8KKworLyogZXh0MiBpb2N0bHMgKEVYVDJfSU9DX0dFVEZMQUdTIGFuZCBFWFQyX0lPQ19TRVRGTEFHUykgdG8gc3VwcG9ydAorICogY2hhdHRyL2xzYXR0ciAqLworI2RlZmluZSBIRlNQTFVTX0lPQ19FWFQyX0dFVEZMQUdTCV9JT1IoJ2YnLCAxLCBsb25nKQorI2RlZmluZSBIRlNQTFVTX0lPQ19FWFQyX1NFVEZMQUdTCV9JT1coJ2YnLCAyLCBsb25nKQorCisjZGVmaW5lIEVYVDJfRkxBR19JTU1VVEFCTEUJCTB4MDAwMDAwMTAgLyogSW1tdXRhYmxlIGZpbGUgKi8KKyNkZWZpbmUgRVhUMl9GTEFHX0FQUEVORAkJMHgwMDAwMDAyMCAvKiB3cml0ZXMgdG8gZmlsZSBtYXkgb25seSBhcHBlbmQgKi8KKyNkZWZpbmUgRVhUMl9GTEFHX05PRFVNUAkJMHgwMDAwMDA0MCAvKiBkbyBub3QgZHVtcCBmaWxlICovCisKKworLyoKKyAqIEZ1bmN0aW9ucyBpbiBhbnkgKi5jIHVzZWQgaW4gb3RoZXIgZmlsZXMKKyAqLworCisvKiBiaXRtYXAuYyAqLworaW50IGhmc3BsdXNfYmxvY2tfYWxsb2NhdGUoc3RydWN0IHN1cGVyX2Jsb2NrICosIHUzMiwgdTMyLCB1MzIgKik7CitpbnQgaGZzcGx1c19ibG9ja19mcmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1MzIsIHUzMik7CisKKy8qIGJ0cmVlLmMgKi8KK3N0cnVjdCBoZnNfYnRyZWUgKmhmc19idHJlZV9vcGVuKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1MzIpOwordm9pZCBoZnNfYnRyZWVfY2xvc2Uoc3RydWN0IGhmc19idHJlZSAqKTsKK3ZvaWQgaGZzX2J0cmVlX3dyaXRlKHN0cnVjdCBoZnNfYnRyZWUgKik7CitzdHJ1Y3QgaGZzX2Jub2RlICpoZnNfYm1hcF9hbGxvYyhzdHJ1Y3QgaGZzX2J0cmVlICopOwordm9pZCBoZnNfYm1hcF9mcmVlKHN0cnVjdCBoZnNfYm5vZGUgKik7CisKKy8qIGJub2RlLmMgKi8KK3ZvaWQgaGZzX2Jub2RlX3JlYWQoc3RydWN0IGhmc19ibm9kZSAqLCB2b2lkICosIGludCwgaW50KTsKK3UxNiBoZnNfYm5vZGVfcmVhZF91MTYoc3RydWN0IGhmc19ibm9kZSAqLCBpbnQpOwordTggaGZzX2Jub2RlX3JlYWRfdTgoc3RydWN0IGhmc19ibm9kZSAqLCBpbnQpOwordm9pZCBoZnNfYm5vZGVfcmVhZF9rZXkoc3RydWN0IGhmc19ibm9kZSAqLCB2b2lkICosIGludCk7Cit2b2lkIGhmc19ibm9kZV93cml0ZShzdHJ1Y3QgaGZzX2Jub2RlICosIHZvaWQgKiwgaW50LCBpbnQpOwordm9pZCBoZnNfYm5vZGVfd3JpdGVfdTE2KHN0cnVjdCBoZnNfYm5vZGUgKiwgaW50LCB1MTYpOwordm9pZCBoZnNfYm5vZGVfY2xlYXIoc3RydWN0IGhmc19ibm9kZSAqLCBpbnQsIGludCk7Cit2b2lkIGhmc19ibm9kZV9jb3B5KHN0cnVjdCBoZnNfYm5vZGUgKiwgaW50LAorCQkgICAgc3RydWN0IGhmc19ibm9kZSAqLCBpbnQsIGludCk7Cit2b2lkIGhmc19ibm9kZV9tb3ZlKHN0cnVjdCBoZnNfYm5vZGUgKiwgaW50LCBpbnQsIGludCk7Cit2b2lkIGhmc19ibm9kZV9kdW1wKHN0cnVjdCBoZnNfYm5vZGUgKik7Cit2b2lkIGhmc19ibm9kZV91bmxpbmsoc3RydWN0IGhmc19ibm9kZSAqKTsKK3N0cnVjdCBoZnNfYm5vZGUgKmhmc19ibm9kZV9maW5kaGFzaChzdHJ1Y3QgaGZzX2J0cmVlICosIHUzMik7CitzdHJ1Y3QgaGZzX2Jub2RlICpoZnNfYm5vZGVfZmluZChzdHJ1Y3QgaGZzX2J0cmVlICosIHUzMik7Cit2b2lkIGhmc19ibm9kZV91bmhhc2goc3RydWN0IGhmc19ibm9kZSAqKTsKK3ZvaWQgaGZzX2Jub2RlX2ZyZWUoc3RydWN0IGhmc19ibm9kZSAqKTsKK3N0cnVjdCBoZnNfYm5vZGUgKmhmc19ibm9kZV9jcmVhdGUoc3RydWN0IGhmc19idHJlZSAqLCB1MzIpOwordm9pZCBoZnNfYm5vZGVfZ2V0KHN0cnVjdCBoZnNfYm5vZGUgKik7Cit2b2lkIGhmc19ibm9kZV9wdXQoc3RydWN0IGhmc19ibm9kZSAqKTsKKworLyogYnJlYy5jICovCit1MTYgaGZzX2JyZWNfbGVub2ZmKHN0cnVjdCBoZnNfYm5vZGUgKiwgdTE2LCB1MTYgKik7Cit1MTYgaGZzX2JyZWNfa2V5bGVuKHN0cnVjdCBoZnNfYm5vZGUgKiwgdTE2KTsKK2ludCBoZnNfYnJlY19pbnNlcnQoc3RydWN0IGhmc19maW5kX2RhdGEgKiwgdm9pZCAqLCBpbnQpOworaW50IGhmc19icmVjX3JlbW92ZShzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqKTsKKworLyogYmZpbmQuYyAqLworaW50IGhmc19maW5kX2luaXQoc3RydWN0IGhmc19idHJlZSAqLCBzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqKTsKK3ZvaWQgaGZzX2ZpbmRfZXhpdChzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqKTsKK2ludCBfX2hmc19icmVjX2ZpbmQoc3RydWN0IGhmc19ibm9kZSAqLCBzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqKTsKK2ludCBoZnNfYnJlY19maW5kKHN0cnVjdCBoZnNfZmluZF9kYXRhICopOworaW50IGhmc19icmVjX3JlYWQoc3RydWN0IGhmc19maW5kX2RhdGEgKiwgdm9pZCAqLCBpbnQpOworaW50IGhmc19icmVjX2dvdG8oc3RydWN0IGhmc19maW5kX2RhdGEgKiwgaW50KTsKKworLyogY2F0YWxvZy5jICovCitpbnQgaGZzcGx1c19jYXRfY21wX2tleShoZnNwbHVzX2J0cmVlX2tleSAqLCBoZnNwbHVzX2J0cmVlX2tleSAqKTsKK3ZvaWQgaGZzcGx1c19jYXRfYnVpbGRfa2V5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGhmc3BsdXNfYnRyZWVfa2V5ICosIHUzMiwgc3RydWN0IHFzdHIgKik7CitpbnQgaGZzcGx1c19maW5kX2NhdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdTMyLCBzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqKTsKK2ludCBoZnNwbHVzX2NyZWF0ZV9jYXQodTMyLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHFzdHIgKiwgc3RydWN0IGlub2RlICopOworaW50IGhmc3BsdXNfZGVsZXRlX2NhdCh1MzIsIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcXN0ciAqKTsKK2ludCBoZnNwbHVzX3JlbmFtZV9jYXQodTMyLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHFzdHIgKiwKKwkJICAgICAgIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcXN0ciAqKTsKKworLyogZXh0ZW50cy5jICovCitpbnQgaGZzcGx1c19leHRfY21wX2tleShoZnNwbHVzX2J0cmVlX2tleSAqLCBoZnNwbHVzX2J0cmVlX2tleSAqKTsKK3ZvaWQgaGZzcGx1c19leHRfd3JpdGVfZXh0ZW50KHN0cnVjdCBpbm9kZSAqKTsKK2ludCBoZnNwbHVzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOworaW50IGhmc3BsdXNfZnJlZV9mb3JrKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1MzIsIHN0cnVjdCBoZnNwbHVzX2ZvcmtfcmF3ICosIGludCk7CitpbnQgaGZzcGx1c19maWxlX2V4dGVuZChzdHJ1Y3QgaW5vZGUgKik7Cit2b2lkIGhmc3BsdXNfZmlsZV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKik7CisKKy8qIGlub2RlLmMgKi8KK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGhmc3BsdXNfYW9wczsKK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGhmc3BsdXNfYnRyZWVfYW9wczsKKwordm9pZCBoZnNwbHVzX2lub2RlX3JlYWRfZm9yayhzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGhmc3BsdXNfZm9ya19yYXcgKik7Cit2b2lkIGhmc3BsdXNfaW5vZGVfd3JpdGVfZm9yayhzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGhmc3BsdXNfZm9ya19yYXcgKik7CitpbnQgaGZzcGx1c19jYXRfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGhmc19maW5kX2RhdGEgKik7CitpbnQgaGZzcGx1c19jYXRfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICopOworc3RydWN0IGlub2RlICpoZnNwbHVzX25ld19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50KTsKK3ZvaWQgaGZzcGx1c19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICopOworCisvKiBpb2N0bC5jICovCitpbnQgaGZzcGx1c19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJICB1bnNpZ25lZCBsb25nIGFyZyk7CitpbnQgaGZzcGx1c19zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOworc3NpemVfdCBoZnNwbHVzX2dldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUpOworc3NpemVfdCBoZnNwbHVzX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworCisvKiBvcHRpb25zLmMgKi8KK2ludCBwYXJzZV9vcHRpb25zKGNoYXIgKiwgc3RydWN0IGhmc3BsdXNfc2JfaW5mbyAqKTsKK3ZvaWQgZmlsbF9kZWZhdWx0cyhzdHJ1Y3QgaGZzcGx1c19zYl9pbmZvICopOworCisvKiB0YWJsZXMuYyAqLworZXh0ZXJuIHUxNiBoZnNwbHVzX2Nhc2VfZm9sZF90YWJsZVtdOworZXh0ZXJuIHUxNiBoZnNwbHVzX2RlY29tcG9zZV90YWJsZVtdOworZXh0ZXJuIHUxNiBoZnNwbHVzX2NvbXBvc2VfdGFibGVbXTsKKworLyogdW5pY29kZS5jICovCitpbnQgaGZzcGx1c191bmlzdHJjbXAoY29uc3Qgc3RydWN0IGhmc3BsdXNfdW5pc3RyICosIGNvbnN0IHN0cnVjdCBoZnNwbHVzX3VuaXN0ciAqKTsKK2ludCBoZnNwbHVzX3VuaTJhc2Moc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IHN0cnVjdCBoZnNwbHVzX3VuaXN0ciAqLCBjaGFyICosIGludCAqKTsKK2ludCBoZnNwbHVzX2FzYzJ1bmkoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBoZnNwbHVzX3VuaXN0ciAqLCBjb25zdCBjaGFyICosIGludCk7CisKKy8qIHdyYXBwZXIuYyAqLworaW50IGhmc3BsdXNfcmVhZF93cmFwcGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKworaW50IGhmc19wYXJ0X2ZpbmQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHNlY3Rvcl90ICosIHNlY3Rvcl90ICopOworCisvKiBhY2Nlc3MgbWFjcm9zICovCisvKgorc3RhdGljIGlubGluZSBzdHJ1Y3QgaGZzcGx1c19zYl9pbmZvICpIRlNQTFVTX1NCKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIHNiLT5zX2ZzX2luZm87Cit9CitzdGF0aWMgaW5saW5lIHN0cnVjdCBoZnNwbHVzX2lub2RlX2luZm8gKkhGU1BMVVNfSShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBsaXN0X2VudHJ5KGlub2RlLCBzdHJ1Y3QgaGZzcGx1c19pbm9kZV9pbmZvLCB2ZnNfaW5vZGUpOworfQorKi8KKyNkZWZpbmUgSEZTUExVU19TQihzdXBlcikJKCooc3RydWN0IGhmc3BsdXNfc2JfaW5mbyAqKShzdXBlciktPnNfZnNfaW5mbykKKyNkZWZpbmUgSEZTUExVU19JKGlub2RlKQkoKmxpc3RfZW50cnkoaW5vZGUsIHN0cnVjdCBoZnNwbHVzX2lub2RlX2luZm8sIHZmc19pbm9kZSkpCisKKyNpZiAxCisjZGVmaW5lIGhmc3BsdXNfa21hcChwKQkJKHsgc3RydWN0IHBhZ2UgKl9fcCA9IChwKTsga21hcChfX3ApOyB9KQorI2RlZmluZSBoZnNwbHVzX2t1bm1hcChwKQkoeyBzdHJ1Y3QgcGFnZSAqX19wID0gKHApOyBrdW5tYXAoX19wKTsgX19wOyB9KQorI2Vsc2UKKyNkZWZpbmUgaGZzcGx1c19rbWFwKHApCQlrbWFwKHApCisjZGVmaW5lIGhmc3BsdXNfa3VubWFwKHApCWt1bm1hcChwKQorI2VuZGlmCisKKyNkZWZpbmUgc2JfYnJlYWQ1MTIoc2IsIHNlYywgZGF0YSkgKHsJCQlcCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpfX2JoOwkJCVwKKwlzZWN0b3JfdCBfX2Jsb2NrOwkJCQlcCisJbG9mZl90IF9fc3RhcnQ7CQkJCQlcCisJaW50IF9fb2Zmc2V0OwkJCQkJXAorCQkJCQkJCVwKKwlfX3N0YXJ0ID0gKGxvZmZfdCkoc2VjKSA8PCBIRlNQTFVTX1NFQ1RPUl9TSElGVDtcCisJX19ibG9jayA9IF9fc3RhcnQgPj4gKHNiKS0+c19ibG9ja3NpemVfYml0czsJXAorCV9fb2Zmc2V0ID0gX19zdGFydCAmICgoc2IpLT5zX2Jsb2Nrc2l6ZSAtIDEpOwlcCisJX19iaCA9IHNiX2JyZWFkKChzYiksIF9fYmxvY2spOwkJCVwKKwlpZiAobGlrZWx5KF9fYmggIT0gTlVMTCkpCQkJXAorCQlkYXRhID0gKHZvaWQgKikoX19iaC0+Yl9kYXRhICsgX19vZmZzZXQpO1wKKwllbHNlCQkJCQkJXAorCQlkYXRhID0gTlVMTDsJCQkJXAorCV9fYmg7CQkJCQkJXAorfSkKKworLyogdGltZSBtYWNyb3MgKi8KKyNkZWZpbmUgX19oZnNwX210MnV0KHQpCQkoYmUzMl90b19jcHUodCkgLSAyMDgyODQ0ODAwVSkKKyNkZWZpbmUgX19oZnNwX3V0Mm10KHQpCQkoY3B1X3RvX2JlMzIodCArIDIwODI4NDQ4MDBVKSkKKworLyogY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBoZnNwX210MnV0KHQpCQkoc3RydWN0IHRpbWVzcGVjKXsgLnR2X3NlYyA9IF9faGZzcF9tdDJ1dCh0KSB9CisjZGVmaW5lIGhmc3BfdXQybXQodCkJCV9faGZzcF91dDJtdCgodCkudHZfc2VjKQorI2RlZmluZSBoZnNwX25vdzJtdCgpCQlfX2hmc3BfdXQybXQoZ2V0X3NlY29uZHMoKSkKKworI2RlZmluZSBrZGV2X3RfdG9fbnIoeCkJCSh4KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvaGZzcGx1c19yYXcuaCBiL2ZzL2hmc3BsdXMvaGZzcGx1c19yYXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmFkMzdjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzcGx1cy9oZnNwbHVzX3Jhdy5oCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvbGludXgvaGZzcGx1c19yYXcuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OQorICogQnJhZCBCb3llciAoZmxhckBwYW50cy5udSkKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqCisgKiBGb3JtYXQgb2Ygc3RydWN0dXJlcyBvbiBkaXNrCisgKiBJbmZvcm1hdGlvbiB0YWtlbiBmcm9tIEFwcGxlIFRlY2hub3RlICMxMTUwIChIRlMgUGx1cyBWb2x1bWUgRm9ybWF0KQorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9IRlNQTFVTX1JBV19ICisjZGVmaW5lIF9MSU5VWF9IRlNQTFVTX1JBV19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIF9fcGFja2VkIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQorCisvKiBTb21lIGNvbnN0YW50cyAqLworI2RlZmluZSBIRlNQTFVTX1NFQ1RPUl9TSVpFICAgICAgICA1MTIKKyNkZWZpbmUgSEZTUExVU19TRUNUT1JfU0hJRlQgICAgICAgICA5CisjZGVmaW5lIEhGU1BMVVNfVk9MSEVBRF9TRUNUT1IgICAgICAgMgorI2RlZmluZSBIRlNQTFVTX1ZPTEhFQURfU0lHICAgICAweDQ4MmIKKyNkZWZpbmUgSEZTUExVU19TVVBFUl9NQUdJQyAgICAgMHg0ODJiCisjZGVmaW5lIEhGU1BMVVNfQ1VSUkVOVF9WRVJTSU9OICAgICAgNAorCisjZGVmaW5lIEhGU1BfV1JBUF9NQUdJQyAgICAgICAgIDB4NDI0NAorI2RlZmluZSBIRlNQX1dSQVBfQVRUUklCX1NMT0NLICAweDgwMDAKKyNkZWZpbmUgSEZTUF9XUkFQX0FUVFJJQl9TUEFSRUQgMHgwMjAwCisKKyNkZWZpbmUgSEZTUF9XUkFQT0ZGX1NJRyAgICAgICAgICAweDAwCisjZGVmaW5lIEhGU1BfV1JBUE9GRl9BVFRSSUIgICAgICAgMHgwQQorI2RlZmluZSBIRlNQX1dSQVBPRkZfQUJMS1NJWkUgICAgIDB4MTQKKyNkZWZpbmUgSEZTUF9XUkFQT0ZGX0FCTEtTVEFSVCAgICAweDFDCisjZGVmaW5lIEhGU1BfV1JBUE9GRl9FTUJFRFNJRyAgICAgMHg3QworI2RlZmluZSBIRlNQX1dSQVBPRkZfRU1CRURFWFQgICAgIDB4N0UKKworI2RlZmluZSBIRlNQX0hJRERFTkRJUl9OQU1FCSJceGUyXHg5MFx4ODBceGUyXHg5MFx4ODBceGUyXHg5MFx4ODBceGUyXHg5MFx4ODBIRlMrIFByaXZhdGUgRGF0YSIKKworI2RlZmluZSBIRlNQX0hBUkRMSU5LX1RZUEUJMHg2ODZjNmU2YgkvKiAnaGxuaycgKi8KKyNkZWZpbmUgSEZTUF9IRlNQTFVTX0NSRUFUT1IJMHg2ODY2NzMyYgkvKiAnaGZzKycgKi8KKworI2RlZmluZSBIRlNQX01PVU5UX1ZFUlNJT04JMHg0ODJiNGM3OAkvKiAnSCtMeCcgKi8KKworLyogU3RydWN0dXJlcyB1c2VkIG9uIGRpc2sgKi8KKwordHlwZWRlZiBfX2JlMzIgaGZzcGx1c19jbmlkOwordHlwZWRlZiBfX2JlMTYgaGZzcGx1c191bmljaHI7CisKKy8qIEEgInN0cmluZyIgYXMgdXNlZCBpbiBmaWxlbmFtZXMsIGV0Yy4gKi8KK3N0cnVjdCBoZnNwbHVzX3VuaXN0ciB7CisJX19iZTE2IGxlbmd0aDsKKwloZnNwbHVzX3VuaWNociB1bmljb2RlWzI1NV07Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEhGU1BMVVNfTUFYX1NUUkxFTiAyNTUKKworLyogUE9TSVggcGVybWlzc2lvbnMgKi8KK3N0cnVjdCBoZnNwbHVzX3Blcm0geworCV9fYmUzMiBvd25lcjsKKwlfX2JlMzIgZ3JvdXA7CisJdTggIHJvb3RmbGFnczsKKwl1OCAgdXNlcmZsYWdzOworCV9fYmUxNiBtb2RlOworCV9fYmUzMiBkZXY7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEhGU1BMVVNfRkxHX05PRFVNUAkweDAxCisjZGVmaW5lIEhGU1BMVVNfRkxHX0lNTVVUQUJMRQkweDAyCisjZGVmaW5lIEhGU1BMVVNfRkxHX0FQUEVORAkweDA0CisKKy8qIEEgc2luZ2xlIGNvbnRpZ3VvdXMgYXJlYSBvZiBhIGZpbGUgKi8KK3N0cnVjdCBoZnNwbHVzX2V4dGVudCB7CisJX19iZTMyIHN0YXJ0X2Jsb2NrOworCV9fYmUzMiBibG9ja19jb3VudDsKK30gX19wYWNrZWQ7Cit0eXBlZGVmIHN0cnVjdCBoZnNwbHVzX2V4dGVudCBoZnNwbHVzX2V4dGVudF9yZWNbOF07CisKKy8qIEluZm9ybWF0aW9uIGZvciBhICJGb3JrIiBpbiBhIGZpbGUgKi8KK3N0cnVjdCBoZnNwbHVzX2ZvcmtfcmF3IHsKKwlfX2JlNjQgdG90YWxfc2l6ZTsKKwlfX2JlMzIgY2x1bXBfc2l6ZTsKKwlfX2JlMzIgdG90YWxfYmxvY2tzOworCWhmc3BsdXNfZXh0ZW50X3JlYyBleHRlbnRzOworfSBfX3BhY2tlZDsKKworLyogSEZTKyBWb2x1bWUgSGVhZGVyICovCitzdHJ1Y3QgaGZzcGx1c192aCB7CisJX19iZTE2IHNpZ25hdHVyZTsKKwlfX2JlMTYgdmVyc2lvbjsKKwlfX2JlMzIgYXR0cmlidXRlczsKKwlfX2JlMzIgbGFzdF9tb3VudF92ZXJzOworCXUzMiByZXNlcnZlZDsKKworCV9fYmUzMiBjcmVhdGVfZGF0ZTsKKwlfX2JlMzIgbW9kaWZ5X2RhdGU7CisJX19iZTMyIGJhY2t1cF9kYXRlOworCV9fYmUzMiBjaGVja2VkX2RhdGU7CisKKwlfX2JlMzIgZmlsZV9jb3VudDsKKwlfX2JlMzIgZm9sZGVyX2NvdW50OworCisJX19iZTMyIGJsb2Nrc2l6ZTsKKwlfX2JlMzIgdG90YWxfYmxvY2tzOworCV9fYmUzMiBmcmVlX2Jsb2NrczsKKworCV9fYmUzMiBuZXh0X2FsbG9jOworCV9fYmUzMiByc3JjX2NsdW1wX3N6OworCV9fYmUzMiBkYXRhX2NsdW1wX3N6OworCWhmc3BsdXNfY25pZCBuZXh0X2NuaWQ7CisKKwlfX2JlMzIgd3JpdGVfY291bnQ7CisJX19iZTY0IGVuY29kaW5nc19ibXA7CisKKwl1OCBmaW5kZXJfaW5mb1szMl07CisKKwlzdHJ1Y3QgaGZzcGx1c19mb3JrX3JhdyBhbGxvY19maWxlOworCXN0cnVjdCBoZnNwbHVzX2ZvcmtfcmF3IGV4dF9maWxlOworCXN0cnVjdCBoZnNwbHVzX2ZvcmtfcmF3IGNhdF9maWxlOworCXN0cnVjdCBoZnNwbHVzX2ZvcmtfcmF3IGF0dHJfZmlsZTsKKwlzdHJ1Y3QgaGZzcGx1c19mb3JrX3JhdyBzdGFydF9maWxlOworfSBfX3BhY2tlZDsKKworLyogSEZTKyB2b2x1bWUgYXR0cmlidXRlcyAqLworI2RlZmluZSBIRlNQTFVTX1ZPTF9VTk1OVCAgICAgKDEgPDwgOCkKKyNkZWZpbmUgSEZTUExVU19WT0xfU1BBUkVfQkxLICgxIDw8IDkpCisjZGVmaW5lIEhGU1BMVVNfVk9MX05PQ0FDSEUgICAoMSA8PCAxMCkKKyNkZWZpbmUgSEZTUExVU19WT0xfSU5DTlNUTlQgICgxIDw8IDExKQorI2RlZmluZSBIRlNQTFVTX1ZPTF9TT0ZUTE9DSyAgKDEgPDwgMTUpCisKKy8qIEhGUysgQlRyZWUgbm9kZSBkZXNjcmlwdG9yICovCitzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MgeworCV9fYmUzMiBuZXh0OworCV9fYmUzMiBwcmV2OworCXM4IHR5cGU7CisJdTggaGVpZ2h0OworCV9fYmUxNiBudW1fcmVjczsKKwl1MTYgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisvKiBIRlMrIEJUcmVlIG5vZGUgdHlwZXMgKi8KKyNkZWZpbmUgSEZTX05PREVfSU5ERVgJMHgwMAorI2RlZmluZSBIRlNfTk9ERV9IRUFERVIJMHgwMQorI2RlZmluZSBIRlNfTk9ERV9NQVAJMHgwMgorI2RlZmluZSBIRlNfTk9ERV9MRUFGCTB4RkYKKworLyogSEZTKyBCVHJlZSBoZWFkZXIgKi8KK3N0cnVjdCBoZnNfYnRyZWVfaGVhZGVyX3JlYyB7CisJX19iZTE2IGRlcHRoOworCV9fYmUzMiByb290OworCV9fYmUzMiBsZWFmX2NvdW50OworCV9fYmUzMiBsZWFmX2hlYWQ7CisJX19iZTMyIGxlYWZfdGFpbDsKKwlfX2JlMTYgbm9kZV9zaXplOworCV9fYmUxNiBtYXhfa2V5X2xlbjsKKwlfX2JlMzIgbm9kZV9jb3VudDsKKwlfX2JlMzIgZnJlZV9ub2RlczsKKwl1MTYgcmVzZXJ2ZWQxOworCV9fYmUzMiBjbHVtcF9zaXplOworCXU4IGJ0cmVlX3R5cGU7CisJdTggcmVzZXJ2ZWQyOworCV9fYmUzMiBhdHRyaWJ1dGVzOworCXUzMiByZXNlcnZlZDNbMTZdOworfSBfX3BhY2tlZDsKKworLyogQlRyZWUgYXR0cmlidXRlcyAqLworI2RlZmluZSBIRlNfVFJFRV9CSUdLRVlTCTIKKyNkZWZpbmUgSEZTX1RSRUVfVkFSSURYS0VZUwk0CisKKy8qIEhGUysgQlRyZWUgbWlzYyBpbmZvICovCisjZGVmaW5lIEhGU1BMVVNfVFJFRV9IRUFEIDAKKyNkZWZpbmUgSEZTUExVU19OT0RFX01YU1ogMzI3NjgKKworLyogU29tZSBzcGVjaWFsIEZpbGUgSUQgbnVtYmVycyAoc3RvbGVuIGZyb20gaGZzLmgpICovCisjZGVmaW5lIEhGU1BMVVNfUE9SX0NOSUQJCTEJLyogUGFyZW50IE9mIHRoZSBSb290ICovCisjZGVmaW5lIEhGU1BMVVNfUk9PVF9DTklECQkyCS8qIFJPT1QgZGlyZWN0b3J5ICovCisjZGVmaW5lIEhGU1BMVVNfRVhUX0NOSUQJCTMJLyogRVhUZW50cyBCLXRyZWUgKi8KKyNkZWZpbmUgSEZTUExVU19DQVRfQ05JRAkJNAkvKiBDQVRhbG9nIEItdHJlZSAqLworI2RlZmluZSBIRlNQTFVTX0JBRF9DTklECQk1CS8qIEJBRCBibG9ja3MgZmlsZSAqLworI2RlZmluZSBIRlNQTFVTX0FMTE9DX0NOSUQJCTYJLyogQUxMT0NhdGlvbiBmaWxlICovCisjZGVmaW5lIEhGU1BMVVNfU1RBUlRfQ05JRAkJNwkvKiBTVEFSVHVwIGZpbGUgKi8KKyNkZWZpbmUgSEZTUExVU19BVFRSX0NOSUQJCTgJLyogQVRUUmlidXRlcyBmaWxlICovCisjZGVmaW5lIEhGU1BMVVNfRVhDSF9DTklECQkxNQkvKiBFeGNoYW5nZUZpbGVzIHRlbXAgaWQgKi8KKyNkZWZpbmUgSEZTUExVU19GSVJTVFVTRVJfQ05JRAkJMTYJLyogZmlyc3QgYXZhaWxhYmxlIHVzZXIgaWQgKi8KKworLyogSEZTKyBjYXRhbG9nIGVudHJ5IGtleSAqLworc3RydWN0IGhmc3BsdXNfY2F0X2tleSB7CisJX19iZTE2IGtleV9sZW47CisJaGZzcGx1c19jbmlkIHBhcmVudDsKKwlzdHJ1Y3QgaGZzcGx1c191bmlzdHIgbmFtZTsKK30gX19wYWNrZWQ7CisKKworLyogU3RydWN0cyBmcm9tIGhmcy5oICovCitzdHJ1Y3QgaGZzcF9wb2ludCB7CisJX19iZTE2IHY7CisJX19iZTE2IGg7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaGZzcF9yZWN0IHsKKwlfX2JlMTYgdG9wOworCV9fYmUxNiBsZWZ0OworCV9fYmUxNiBib3R0b207CisJX19iZTE2IHJpZ2h0OworfSBfX3BhY2tlZDsKKworCisvKiBIRlMgZGlyZWN0b3J5IGluZm8gKHN0b2xlbiBmcm9tIGhmcy5oICovCitzdHJ1Y3QgREluZm8geworCXN0cnVjdCBoZnNwX3JlY3QgZnJSZWN0OworCV9fYmUxNiBmckZsYWdzOworCXN0cnVjdCBoZnNwX3BvaW50IGZyTG9jYXRpb247CisJX19iZTE2IGZyVmlldzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBEWEluZm8geworCXN0cnVjdCBoZnNwX3BvaW50IGZyU2Nyb2xsOworCV9fYmUzMiBmck9wZW5DaGFpbjsKKwlfX2JlMTYgZnJVbnVzZWQ7CisJX19iZTE2IGZyQ29tbWVudDsKKwlfX2JlMzIgZnJQdXRBd2F5OworfSBfX3BhY2tlZDsKKworLyogSEZTKyBmb2xkZXIgZGF0YSAocGFydCBvZiBhbiBoZnNwbHVzX2NhdF9lbnRyeSkgKi8KK3N0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIgeworCV9fYmUxNiB0eXBlOworCV9fYmUxNiBmbGFnczsKKwlfX2JlMzIgdmFsZW5jZTsKKwloZnNwbHVzX2NuaWQgaWQ7CisJX19iZTMyIGNyZWF0ZV9kYXRlOworCV9fYmUzMiBjb250ZW50X21vZF9kYXRlOworCV9fYmUzMiBhdHRyaWJ1dGVfbW9kX2RhdGU7CisJX19iZTMyIGFjY2Vzc19kYXRlOworCV9fYmUzMiBiYWNrdXBfZGF0ZTsKKwlzdHJ1Y3QgaGZzcGx1c19wZXJtIHBlcm1pc3Npb25zOworCXN0cnVjdCBESW5mbyB1c2VyX2luZm87CisJc3RydWN0IERYSW5mbyBmaW5kZXJfaW5mbzsKKwlfX2JlMzIgdGV4dF9lbmNvZGluZzsKKwl1MzIgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisvKiBIRlMgZmlsZSBpbmZvIChzdG9sZW4gZnJvbSBoZnMuaCkgKi8KK3N0cnVjdCBGSW5mbyB7CisJX19iZTMyIGZkVHlwZTsKKwlfX2JlMzIgZmRDcmVhdG9yOworCV9fYmUxNiBmZEZsYWdzOworCXN0cnVjdCBoZnNwX3BvaW50IGZkTG9jYXRpb247CisJX19iZTE2IGZkRmxkcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGWEluZm8geworCV9fYmUxNiBmZEljb25JRDsKKwl1OCBmZFVudXNlZFs4XTsKKwlfX2JlMTYgZmRDb21tZW50OworCV9fYmUzMiBmZFB1dEF3YXk7Cit9IF9fcGFja2VkOworCisvKiBIRlMrIGZpbGUgZGF0YSAocGFydCBvZiBhIGNhdF9lbnRyeSkgKi8KK3N0cnVjdCBoZnNwbHVzX2NhdF9maWxlIHsKKwlfX2JlMTYgdHlwZTsKKwlfX2JlMTYgZmxhZ3M7CisJdTMyIHJlc2VydmVkMTsKKwloZnNwbHVzX2NuaWQgaWQ7CisJX19iZTMyIGNyZWF0ZV9kYXRlOworCV9fYmUzMiBjb250ZW50X21vZF9kYXRlOworCV9fYmUzMiBhdHRyaWJ1dGVfbW9kX2RhdGU7CisJX19iZTMyIGFjY2Vzc19kYXRlOworCV9fYmUzMiBiYWNrdXBfZGF0ZTsKKwlzdHJ1Y3QgaGZzcGx1c19wZXJtIHBlcm1pc3Npb25zOworCXN0cnVjdCBGSW5mbyB1c2VyX2luZm87CisJc3RydWN0IEZYSW5mbyBmaW5kZXJfaW5mbzsKKwlfX2JlMzIgdGV4dF9lbmNvZGluZzsKKwl1MzIgcmVzZXJ2ZWQyOworCisJc3RydWN0IGhmc3BsdXNfZm9ya19yYXcgZGF0YV9mb3JrOworCXN0cnVjdCBoZnNwbHVzX2ZvcmtfcmF3IHJzcmNfZm9yazsKK30gX19wYWNrZWQ7CisKKy8qIEZpbGUgYXR0cmlidXRlIGJpdHMgKi8KKyNkZWZpbmUgSEZTUExVU19GSUxFX0xPQ0tFRAkJMHgwMDAxCisjZGVmaW5lIEhGU1BMVVNfRklMRV9USFJFQURfRVhJU1RTCTB4MDAwMgorCisvKiBIRlMrIGNhdGFsb2cgdGhyZWFkIChwYXJ0IG9mIGEgY2F0X2VudHJ5KSAqLworc3RydWN0IGhmc3BsdXNfY2F0X3RocmVhZCB7CisJX19iZTE2IHR5cGU7CisJczE2IHJlc2VydmVkOworCWhmc3BsdXNfY25pZCBwYXJlbnRJRDsKKwlzdHJ1Y3QgaGZzcGx1c191bmlzdHIgbm9kZU5hbWU7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEhGU1BMVVNfTUlOX1RIUkVBRF9TWiAxMAorCisvKiBBIGRhdGEgcmVjb3JkIGluIHRoZSBjYXRhbG9nIHRyZWUgKi8KK3R5cGVkZWYgdW5pb24geworCV9fYmUxNiB0eXBlOworCXN0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIgZm9sZGVyOworCXN0cnVjdCBoZnNwbHVzX2NhdF9maWxlIGZpbGU7CisJc3RydWN0IGhmc3BsdXNfY2F0X3RocmVhZCB0aHJlYWQ7Cit9IF9fcGFja2VkIGhmc3BsdXNfY2F0X2VudHJ5OworCisvKiBIRlMrIGNhdGFsb2cgZW50cnkgdHlwZSAqLworI2RlZmluZSBIRlNQTFVTX0ZPTERFUiAgICAgICAgIDB4MDAwMQorI2RlZmluZSBIRlNQTFVTX0ZJTEUgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBIRlNQTFVTX0ZPTERFUl9USFJFQUQgIDB4MDAwMworI2RlZmluZSBIRlNQTFVTX0ZJTEVfVEhSRUFEICAgIDB4MDAwNAorCisvKiBIRlMrIGV4dGVudHMgdHJlZSBrZXkgKi8KK3N0cnVjdCBoZnNwbHVzX2V4dF9rZXkgeworCV9fYmUxNiBrZXlfbGVuOworCXU4IGZvcmtfdHlwZTsKKwl1OCBwYWQ7CisJaGZzcGx1c19jbmlkIGNuaWQ7CisJX19iZTMyIHN0YXJ0X2Jsb2NrOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBIRlNQTFVTX0VYVF9LRVlMRU4gMTIKKworLyogSEZTKyBnZW5lcmljIEJUcmVlIGtleSAqLwordHlwZWRlZiB1bmlvbiB7CisJX19iZTE2IGtleV9sZW47CisJc3RydWN0IGhmc3BsdXNfY2F0X2tleSBjYXQ7CisJc3RydWN0IGhmc3BsdXNfZXh0X2tleSBleHQ7Cit9IF9fcGFja2VkIGhmc3BsdXNfYnRyZWVfa2V5OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvaW5vZGUuYyBiL2ZzL2hmc3BsdXMvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTY0MjcwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzcGx1cy9pbm9kZS5jCkBAIC0wLDAgKzEsNTU1IEBACisvKgorICogIGxpbnV4L2ZzL2hmc3BsdXMvaW5vZGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMQorICogQnJhZCBCb3llciAoZmxhckBhbGxhbmRyaWEuY29tKQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICoKKyAqIElub2RlIGhhbmRsaW5nIHJvdXRpbmVzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CisKKyNpbmNsdWRlICJoZnNwbHVzX2ZzLmgiCisjaW5jbHVkZSAiaGZzcGx1c19yYXcuaCIKKworc3RhdGljIGludCBoZnNwbHVzX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwkvL3ByaW50aygicmVhZHBhZ2U6ICVsdVxuIiwgcGFnZS0+aW5kZXgpOworCXJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLCBoZnNwbHVzX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgaGZzcGx1c193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCS8vcHJpbnRrKCJ3cml0ZXBhZ2U6ICVsdVxuIiwgcGFnZS0+aW5kZXgpOworCXJldHVybiBibG9ja193cml0ZV9mdWxsX3BhZ2UocGFnZSwgaGZzcGx1c19nZXRfYmxvY2ssIHdiYyk7Cit9CisKK3N0YXRpYyBpbnQgaGZzcGx1c19wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJcmV0dXJuIGNvbnRfcHJlcGFyZV93cml0ZShwYWdlLCBmcm9tLCB0bywgaGZzcGx1c19nZXRfYmxvY2ssCisJCSZIRlNQTFVTX0kocGFnZS0+bWFwcGluZy0+aG9zdCkucGh5c19zaXplKTsKK30KKworc3RhdGljIHNlY3Rvcl90IGhmc3BsdXNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2spCit7CisJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLCBibG9jaywgaGZzcGx1c19nZXRfYmxvY2spOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfcmVsZWFzZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBtYXNrKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBoZnNfYm5vZGUgKm5vZGU7CisJdTMyIG5pZHg7CisJaW50IGksIHJlcyA9IDE7CisKKwlzd2l0Y2ggKGlub2RlLT5pX2lubykgeworCWNhc2UgSEZTUExVU19FWFRfQ05JRDoKKwkJdHJlZSA9IEhGU1BMVVNfU0Ioc2IpLmV4dF90cmVlOworCQlicmVhazsKKwljYXNlIEhGU1BMVVNfQ0FUX0NOSUQ6CisJCXRyZWUgPSBIRlNQTFVTX1NCKHNiKS5jYXRfdHJlZTsKKwkJYnJlYWs7CisJY2FzZSBIRlNQTFVTX0FUVFJfQ05JRDoKKwkJdHJlZSA9IEhGU1BMVVNfU0Ioc2IpLmF0dHJfdHJlZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAwOworCX0KKwlpZiAodHJlZS0+bm9kZV9zaXplID49IFBBR0VfQ0FDSEVfU0laRSkgeworCQluaWR4ID0gcGFnZS0+aW5kZXggPj4gKHRyZWUtPm5vZGVfc2l6ZV9zaGlmdCAtIFBBR0VfQ0FDSEVfU0hJRlQpOworCQlzcGluX2xvY2soJnRyZWUtPmhhc2hfbG9jayk7CisJCW5vZGUgPSBoZnNfYm5vZGVfZmluZGhhc2godHJlZSwgbmlkeCk7CisJCWlmICghbm9kZSkKKwkJCTsKKwkJZWxzZSBpZiAoYXRvbWljX3JlYWQoJm5vZGUtPnJlZmNudCkpCisJCQlyZXMgPSAwOworCQlpZiAocmVzICYmIG5vZGUpIHsKKwkJCWhmc19ibm9kZV91bmhhc2gobm9kZSk7CisJCQloZnNfYm5vZGVfZnJlZShub2RlKTsKKwkJfQorCQlzcGluX3VubG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwl9IGVsc2UgeworCQluaWR4ID0gcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSB0cmVlLT5ub2RlX3NpemVfc2hpZnQpOworCQlpID0gMSA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIHRyZWUtPm5vZGVfc2l6ZV9zaGlmdCk7CisJCXNwaW5fbG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwkJZG8geworCQkJbm9kZSA9IGhmc19ibm9kZV9maW5kaGFzaCh0cmVlLCBuaWR4KyspOworCQkJaWYgKCFub2RlKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGF0b21pY19yZWFkKCZub2RlLT5yZWZjbnQpKSB7CisJCQkJcmVzID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWhmc19ibm9kZV91bmhhc2gobm9kZSk7CisJCQloZnNfYm5vZGVfZnJlZShub2RlKTsKKwkJfSB3aGlsZSAoLS1pICYmIG5pZHggPCB0cmVlLT5ub2RlX2NvdW50KTsKKwkJc3Bpbl91bmxvY2soJnRyZWUtPmhhc2hfbG9jayk7CisJfQorCS8vcHJpbnRrKCJyZWxlYXNlcGFnZTogJWx1LCV4ID0gJWRcbiIsIHBhZ2UtPmluZGV4LCBtYXNrLCByZXMpOworCXJldHVybiByZXMgPyB0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpIDogMDsKK30KKworc3RhdGljIGludCBoZnNwbHVzX2dldF9ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgaWJsb2NrLCB1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MsCisJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaGZzcGx1c19nZXRfYmxvY2soaW5vZGUsIGlibG9jaywgYmhfcmVzdWx0LCBjcmVhdGUpOworCWlmICghcmV0KQorCQliaF9yZXN1bHQtPmJfc2l6ZSA9ICgxIDw8IGlub2RlLT5pX2Jsa2JpdHMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGhmc3BsdXNfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAorCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZy0+aG9zdDsKKworCXJldHVybiBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpbm9kZS0+aV9zYi0+c19iZGV2LCBpb3YsCisJCQkJICBvZmZzZXQsIG5yX3NlZ3MsIGhmc3BsdXNfZ2V0X2Jsb2NrcywgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgaGZzcGx1c193cml0ZXBhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJICAgICAgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJcmV0dXJuIG1wYWdlX3dyaXRlcGFnZXMobWFwcGluZywgd2JjLCBoZnNwbHVzX2dldF9ibG9jayk7Cit9CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgaGZzcGx1c19idHJlZV9hb3BzID0geworCS5yZWFkcGFnZQk9IGhmc3BsdXNfcmVhZHBhZ2UsCisJLndyaXRlcGFnZQk9IGhmc3BsdXNfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UJPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUJPSBoZnNwbHVzX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZQk9IGdlbmVyaWNfY29tbWl0X3dyaXRlLAorCS5ibWFwCQk9IGhmc3BsdXNfYm1hcCwKKwkucmVsZWFzZXBhZ2UJPSBoZnNwbHVzX3JlbGVhc2VwYWdlLAorfTsKKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBoZnNwbHVzX2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gaGZzcGx1c19yZWFkcGFnZSwKKwkud3JpdGVwYWdlCT0gaGZzcGx1c193cml0ZXBhZ2UsCisJLnN5bmNfcGFnZQk9IGJsb2NrX3N5bmNfcGFnZSwKKwkucHJlcGFyZV93cml0ZQk9IGhmc3BsdXNfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gZ2VuZXJpY19jb21taXRfd3JpdGUsCisJLmJtYXAJCT0gaGZzcGx1c19ibWFwLAorCS5kaXJlY3RfSU8JPSBoZnNwbHVzX2RpcmVjdF9JTywKKwkud3JpdGVwYWdlcwk9IGhmc3BsdXNfd3JpdGVwYWdlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpoZnNwbHVzX2ZpbGVfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJCSAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlpbnQgZXJyOworCisJaWYgKEhGU1BMVVNfSVNfUlNSQyhkaXIpIHx8IHN0cmNtcChkZW50cnktPmRfbmFtZS5uYW1lLCAicnNyYyIpKQorCQlnb3RvIG91dDsKKworCWlub2RlID0gSEZTUExVU19JKGRpcikucnNyY19pbm9kZTsKKwlpZiAoaW5vZGUpCisJCWdvdG8gb3V0OworCisJaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaW5vZGUtPmlfaW5vID0gZGlyLT5pX2lubzsKKwlJTklUX0xJU1RfSEVBRCgmSEZTUExVU19JKGlub2RlKS5vcGVuX2Rpcl9saXN0KTsKKwlpbml0X01VVEVYKCZIRlNQTFVTX0koaW5vZGUpLmV4dGVudHNfbG9jayk7CisJSEZTUExVU19JKGlub2RlKS5mbGFncyA9IEhGU1BMVVNfRkxHX1JTUkM7CisKKwloZnNfZmluZF9pbml0KEhGU1BMVVNfU0Ioc2IpLmNhdF90cmVlLCAmZmQpOworCWVyciA9IGhmc3BsdXNfZmluZF9jYXQoc2IsIGRpci0+aV9pbm8sICZmZCk7CisJaWYgKCFlcnIpCisJCWVyciA9IGhmc3BsdXNfY2F0X3JlYWRfaW5vZGUoaW5vZGUsICZmZCk7CisJaGZzX2ZpbmRfZXhpdCgmZmQpOworCWlmIChlcnIpIHsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCUhGU1BMVVNfSShpbm9kZSkucnNyY19pbm9kZSA9IGRpcjsKKwlIRlNQTFVTX0koZGlyKS5yc3JjX2lub2RlID0gaW5vZGU7CisJaWdyYWIoZGlyKTsKKwlobGlzdF9hZGRfaGVhZCgmaW5vZGUtPmlfaGFzaCwgJkhGU1BMVVNfU0Ioc2IpLnJzcmNfaW5vZGVzKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl7CisJdm9pZCBoZnNwbHVzX2lub2RlX2NoZWNrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworCWF0b21pY19pbmMoJkhGU1BMVVNfU0Ioc2IpLmlub2RlX2NudCk7CisJaGZzcGx1c19pbm9kZV9jaGVjayhzYik7CisJfQorb3V0OgorCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBoZnNwbHVzX2dldF9wZXJtcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaGZzcGx1c19wZXJtICpwZXJtcywgaW50IGRpcikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJdTE2IG1vZGU7CisKKwltb2RlID0gYmUxNl90b19jcHUocGVybXMtPm1vZGUpOworCisJaW5vZGUtPmlfdWlkID0gYmUzMl90b19jcHUocGVybXMtPm93bmVyKTsKKwlpZiAoIWlub2RlLT5pX3VpZCAmJiAhbW9kZSkKKwkJaW5vZGUtPmlfdWlkID0gSEZTUExVU19TQihzYikudWlkOworCisJaW5vZGUtPmlfZ2lkID0gYmUzMl90b19jcHUocGVybXMtPmdyb3VwKTsKKwlpZiAoIWlub2RlLT5pX2dpZCAmJiAhbW9kZSkKKwkJaW5vZGUtPmlfZ2lkID0gSEZTUExVU19TQihzYikuZ2lkOworCisJaWYgKGRpcikgeworCQltb2RlID0gbW9kZSA/IChtb2RlICYgU19JQUxMVUdPKSA6CisJCQkoU19JUldYVUdPICYgfihIRlNQTFVTX1NCKHNiKS51bWFzaykpOworCQltb2RlIHw9IFNfSUZESVI7CisJfSBlbHNlIGlmICghbW9kZSkKKwkJbW9kZSA9IFNfSUZSRUcgfCAoKFNfSVJVR098U19JV1VHTykgJgorCQkJfihIRlNQTFVTX1NCKHNiKS51bWFzaykpOworCWlub2RlLT5pX21vZGUgPSBtb2RlOworCisJSEZTUExVU19JKGlub2RlKS5yb290ZmxhZ3MgPSBwZXJtcy0+cm9vdGZsYWdzOworCUhGU1BMVVNfSShpbm9kZSkudXNlcmZsYWdzID0gcGVybXMtPnVzZXJmbGFnczsKKwlpZiAocGVybXMtPnJvb3RmbGFncyAmIEhGU1BMVVNfRkxHX0lNTVVUQUJMRSkKKwkJaW5vZGUtPmlfZmxhZ3MgfD0gU19JTU1VVEFCTEU7CisJZWxzZQorCQlpbm9kZS0+aV9mbGFncyAmPSB+U19JTU1VVEFCTEU7CisJaWYgKHBlcm1zLT5yb290ZmxhZ3MgJiBIRlNQTFVTX0ZMR19BUFBFTkQpCisJCWlub2RlLT5pX2ZsYWdzIHw9IFNfQVBQRU5EOworCWVsc2UKKwkJaW5vZGUtPmlfZmxhZ3MgJj0gflNfQVBQRU5EOworfQorCitzdGF0aWMgdm9pZCBoZnNwbHVzX3NldF9wZXJtcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaGZzcGx1c19wZXJtICpwZXJtcykKK3sKKwlpZiAoaW5vZGUtPmlfZmxhZ3MgJiBTX0lNTVVUQUJMRSkKKwkJcGVybXMtPnJvb3RmbGFncyB8PSBIRlNQTFVTX0ZMR19JTU1VVEFCTEU7CisJZWxzZQorCQlwZXJtcy0+cm9vdGZsYWdzICY9IH5IRlNQTFVTX0ZMR19JTU1VVEFCTEU7CisJaWYgKGlub2RlLT5pX2ZsYWdzICYgU19BUFBFTkQpCisJCXBlcm1zLT5yb290ZmxhZ3MgfD0gSEZTUExVU19GTEdfQVBQRU5EOworCWVsc2UKKwkJcGVybXMtPnJvb3RmbGFncyAmPSB+SEZTUExVU19GTEdfQVBQRU5EOworCXBlcm1zLT51c2VyZmxhZ3MgPSBIRlNQTFVTX0koaW5vZGUpLnVzZXJmbGFnczsKKwlwZXJtcy0+bW9kZSA9IGNwdV90b19iZTE2KGlub2RlLT5pX21vZGUpOworCXBlcm1zLT5vd25lciA9IGNwdV90b19iZTMyKGlub2RlLT5pX3VpZCk7CisJcGVybXMtPmdyb3VwID0gY3B1X3RvX2JlMzIoaW5vZGUtPmlfZ2lkKTsKKwlwZXJtcy0+ZGV2ID0gY3B1X3RvX2JlMzIoSEZTUExVU19JKGlub2RlKS5kZXYpOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJLyogTUFZX0VYRUMgaXMgYWxzbyB1c2VkIGZvciBsb29rdXAsIGlmIG5vIHggYml0IGlzIHNldCBhbGxvdyBsb29rdXAsCisJICogb3Blbl9leGVjIGhhcyB0aGUgc2FtZSB0ZXN0LCBzbyBpdCdzIHN0aWxsIG5vdCBleGVjdXRhYmxlLCBpZiBhIHggYml0CisJICogaXMgc2V0IGZhbGwgYmFjayB0byBzdGFuZGFyZCBwZXJtaXNzaW9uIGNoZWNrLgorCSAqLworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmIG1hc2sgJiBNQVlfRVhFQyAmJiAhKGlub2RlLT5pX21vZGUgJiAwMTExKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgTlVMTCk7Cit9CisKKworc3RhdGljIGludCBoZnNwbHVzX2ZpbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoSEZTUExVU19JU19SU1JDKGlub2RlKSkKKwkJaW5vZGUgPSBIRlNQTFVTX0koaW5vZGUpLnJzcmNfaW5vZGU7CisJaWYgKGF0b21pY19yZWFkKCZmaWxlLT5mX2NvdW50KSAhPSAxKQorCQlyZXR1cm4gMDsKKwlhdG9taWNfaW5jKCZIRlNQTFVTX0koaW5vZGUpLm9wZW5jbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKworCWlmIChIRlNQTFVTX0lTX1JTUkMoaW5vZGUpKQorCQlpbm9kZSA9IEhGU1BMVVNfSShpbm9kZSkucnNyY19pbm9kZTsKKwlpZiAoYXRvbWljX3JlYWQoJmZpbGUtPmZfY291bnQpICE9IDApCisJCXJldHVybiAwOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZIRlNQTFVTX0koaW5vZGUpLm9wZW5jbnQpKSB7CisJCWRvd24oJmlub2RlLT5pX3NlbSk7CisJCWhmc3BsdXNfZmlsZV90cnVuY2F0ZShpbm9kZSk7CisJCWlmIChpbm9kZS0+aV9mbGFncyAmIFNfREVBRCkgeworCQkJaGZzcGx1c19kZWxldGVfY2F0KGlub2RlLT5pX2lubywgSEZTUExVU19TQihzYikuaGlkZGVuX2RpciwgTlVMTCk7CisJCQloZnNwbHVzX2RlbGV0ZV9pbm9kZShpbm9kZSk7CisJCX0KKwkJdXAoJmlub2RlLT5pX3NlbSk7CisJfQorCXJldHVybiAwOworfQorCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaGZzcGx1c19kaXJfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhmc3BsdXNfZGlyX29wZXJhdGlvbnM7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBoZnNwbHVzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IGhmc3BsdXNfZmlsZV9sb29rdXAsCisJLnRydW5jYXRlCT0gaGZzcGx1c19maWxlX3RydW5jYXRlLAorCS5wZXJtaXNzaW9uCT0gaGZzcGx1c19wZXJtaXNzaW9uLAorCS5zZXR4YXR0cgk9IGhmc3BsdXNfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gaGZzcGx1c19nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gaGZzcGx1c19saXN0eGF0dHIsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBoZnNwbHVzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrIAk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19maWxlX3JlYWQsCisJLndyaXRlCQk9IGdlbmVyaWNfZmlsZV93cml0ZSwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCisJLmZzeW5jCQk9IGZpbGVfZnN5bmMsCisJLm9wZW4JCT0gaGZzcGx1c19maWxlX29wZW4sCisJLnJlbGVhc2UJPSBoZnNwbHVzX2ZpbGVfcmVsZWFzZSwKKwkuaW9jdGwgICAgICAgICAgPSBoZnNwbHVzX2lvY3RsLAorfTsKKworc3RydWN0IGlub2RlICpoZnNwbHVzX25ld19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmV3X2lub2RlKHNiKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gTlVMTDsKKworCXsKKwl2b2lkIGhmc3BsdXNfaW5vZGVfY2hlY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CisJYXRvbWljX2luYygmSEZTUExVU19TQihzYikuaW5vZGVfY250KTsKKwloZnNwbHVzX2lub2RlX2NoZWNrKHNiKTsKKwl9CisJaW5vZGUtPmlfaW5vID0gSEZTUExVU19TQihzYikubmV4dF9jbmlkKys7CisJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJaW5vZGUtPmlfbmxpbmsgPSAxOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IEhGU1BMVVNfU0Ioc2IpLmFsbG9jX2Jsa3N6OworCUlOSVRfTElTVF9IRUFEKCZIRlNQTFVTX0koaW5vZGUpLm9wZW5fZGlyX2xpc3QpOworCWluaXRfTVVURVgoJkhGU1BMVVNfSShpbm9kZSkuZXh0ZW50c19sb2NrKTsKKwlhdG9taWNfc2V0KCZIRlNQTFVTX0koaW5vZGUpLm9wZW5jbnQsIDApOworCUhGU1BMVVNfSShpbm9kZSkuZmxhZ3MgPSAwOworCW1lbXNldChIRlNQTFVTX0koaW5vZGUpLmZpcnN0X2V4dGVudHMsIDAsIHNpemVvZihoZnNwbHVzX2V4dGVudF9yZWMpKTsKKwltZW1zZXQoSEZTUExVU19JKGlub2RlKS5jYWNoZWRfZXh0ZW50cywgMCwgc2l6ZW9mKGhmc3BsdXNfZXh0ZW50X3JlYykpOworCUhGU1BMVVNfSShpbm9kZSkuYWxsb2NfYmxvY2tzID0gMDsKKwlIRlNQTFVTX0koaW5vZGUpLmZpcnN0X2Jsb2NrcyA9IDA7CisJSEZTUExVU19JKGlub2RlKS5jYWNoZWRfc3RhcnQgPSAwOworCUhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX2Jsb2NrcyA9IDA7CisJSEZTUExVU19JKGlub2RlKS5waHlzX3NpemUgPSAwOworCUhGU1BMVVNfSShpbm9kZSkuZnNfYmxvY2tzID0gMDsKKwlIRlNQTFVTX0koaW5vZGUpLnJzcmNfaW5vZGUgPSBOVUxMOworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX3NpemUgPSAyOworCQlIRlNQTFVTX1NCKHNiKS5mb2xkZXJfY291bnQrKzsKKwkJaW5vZGUtPmlfb3AgPSAmaGZzcGx1c19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmhmc3BsdXNfZGlyX29wZXJhdGlvbnM7CisJfSBlbHNlIGlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCUhGU1BMVVNfU0Ioc2IpLmZpbGVfY291bnQrKzsKKwkJaW5vZGUtPmlfb3AgPSAmaGZzcGx1c19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZoZnNwbHVzX2ZpbGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmaGZzcGx1c19hb3BzOworCQlIRlNQTFVTX0koaW5vZGUpLmNsdW1wX2Jsb2NrcyA9IEhGU1BMVVNfU0Ioc2IpLmRhdGFfY2x1bXBfYmxvY2tzOworCX0gZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgeworCQlIRlNQTFVTX1NCKHNiKS5maWxlX2NvdW50Kys7CisJCWlub2RlLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZoZnNwbHVzX2FvcHM7CisJCUhGU1BMVVNfSShpbm9kZSkuY2x1bXBfYmxvY2tzID0gMTsKKwl9IGVsc2UKKwkJSEZTUExVU19TQihzYikuZmlsZV9jb3VudCsrOworCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlzYi0+c19kaXJ0ID0gMTsKKworCXJldHVybiBpbm9kZTsKK30KKwordm9pZCBoZnNwbHVzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCUhGU1BMVVNfU0Ioc2IpLmZvbGRlcl9jb3VudC0tOworCQlzYi0+c19kaXJ0ID0gMTsKKwkJcmV0dXJuOworCX0KKwlIRlNQTFVTX1NCKHNiKS5maWxlX2NvdW50LS07CisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKCFpbm9kZS0+aV9ubGluaykgeworCQkJaW5vZGUtPmlfc2l6ZSA9IDA7CisJCQloZnNwbHVzX2ZpbGVfdHJ1bmNhdGUoaW5vZGUpOworCQl9CisJfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX3NpemUgPSAwOworCQloZnNwbHVzX2ZpbGVfdHJ1bmNhdGUoaW5vZGUpOworCX0KKwlzYi0+c19kaXJ0ID0gMTsKK30KKwordm9pZCBoZnNwbHVzX2lub2RlX3JlYWRfZm9yayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaGZzcGx1c19mb3JrX3JhdyAqZm9yaykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJdTMyIGNvdW50OworCWludCBpOworCisJbWVtY3B5KCZIRlNQTFVTX0koaW5vZGUpLmZpcnN0X2V4dGVudHMsICZmb3JrLT5leHRlbnRzLAorCSAgICAgICBzaXplb2YoaGZzcGx1c19leHRlbnRfcmVjKSk7CisJZm9yIChjb3VudCA9IDAsIGkgPSAwOyBpIDwgODsgaSsrKQorCQljb3VudCArPSBiZTMyX3RvX2NwdShmb3JrLT5leHRlbnRzW2ldLmJsb2NrX2NvdW50KTsKKwlIRlNQTFVTX0koaW5vZGUpLmZpcnN0X2Jsb2NrcyA9IGNvdW50OworCW1lbXNldChIRlNQTFVTX0koaW5vZGUpLmNhY2hlZF9leHRlbnRzLCAwLCBzaXplb2YoaGZzcGx1c19leHRlbnRfcmVjKSk7CisJSEZTUExVU19JKGlub2RlKS5jYWNoZWRfc3RhcnQgPSAwOworCUhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX2Jsb2NrcyA9IDA7CisKKwlIRlNQTFVTX0koaW5vZGUpLmFsbG9jX2Jsb2NrcyA9IGJlMzJfdG9fY3B1KGZvcmstPnRvdGFsX2Jsb2Nrcyk7CisJaW5vZGUtPmlfc2l6ZSA9IEhGU1BMVVNfSShpbm9kZSkucGh5c19zaXplID0gYmU2NF90b19jcHUoZm9yay0+dG90YWxfc2l6ZSk7CisJSEZTUExVU19JKGlub2RlKS5mc19ibG9ja3MgPSAoaW5vZGUtPmlfc2l6ZSArIHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCWlub2RlX3NldF9ieXRlcyhpbm9kZSwgSEZTUExVU19JKGlub2RlKS5mc19ibG9ja3MgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCUhGU1BMVVNfSShpbm9kZSkuY2x1bXBfYmxvY2tzID0gYmUzMl90b19jcHUoZm9yay0+Y2x1bXBfc2l6ZSkgPj4gSEZTUExVU19TQihzYikuYWxsb2NfYmxrc3pfc2hpZnQ7CisJaWYgKCFIRlNQTFVTX0koaW5vZGUpLmNsdW1wX2Jsb2NrcykKKwkJSEZTUExVU19JKGlub2RlKS5jbHVtcF9ibG9ja3MgPSBIRlNQTFVTX0lTX1JTUkMoaW5vZGUpID8gSEZTUExVU19TQihzYikucnNyY19jbHVtcF9ibG9ja3MgOgorCQkJCUhGU1BMVVNfU0Ioc2IpLmRhdGFfY2x1bXBfYmxvY2tzOworfQorCit2b2lkIGhmc3BsdXNfaW5vZGVfd3JpdGVfZm9yayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaGZzcGx1c19mb3JrX3JhdyAqZm9yaykKK3sKKwltZW1jcHkoJmZvcmstPmV4dGVudHMsICZIRlNQTFVTX0koaW5vZGUpLmZpcnN0X2V4dGVudHMsCisJICAgICAgIHNpemVvZihoZnNwbHVzX2V4dGVudF9yZWMpKTsKKwlmb3JrLT50b3RhbF9zaXplID0gY3B1X3RvX2JlNjQoaW5vZGUtPmlfc2l6ZSk7CisJZm9yay0+dG90YWxfYmxvY2tzID0gY3B1X3RvX2JlMzIoSEZTUExVU19JKGlub2RlKS5hbGxvY19ibG9ja3MpOworfQorCitpbnQgaGZzcGx1c19jYXRfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQpCit7CisJaGZzcGx1c19jYXRfZW50cnkgZW50cnk7CisJaW50IHJlcyA9IDA7CisJdTE2IHR5cGU7CisKKwl0eXBlID0gaGZzX2Jub2RlX3JlYWRfdTE2KGZkLT5ibm9kZSwgZmQtPmVudHJ5b2Zmc2V0KTsKKworCUhGU1BMVVNfSShpbm9kZSkuZGV2ID0gMDsKKwlpbm9kZS0+aV9ibGtzaXplID0gSEZTUExVU19TQihpbm9kZS0+aV9zYikuYWxsb2NfYmxrc3o7CisJaWYgKHR5cGUgPT0gSEZTUExVU19GT0xERVIpIHsKKwkJc3RydWN0IGhmc3BsdXNfY2F0X2ZvbGRlciAqZm9sZGVyID0gJmVudHJ5LmZvbGRlcjsKKworCQlpZiAoZmQtPmVudHJ5bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIpKQorCQkJLyogcGFuaWM/ICovOworCQloZnNfYm5vZGVfcmVhZChmZC0+Ym5vZGUsICZlbnRyeSwgZmQtPmVudHJ5b2Zmc2V0LAorCQkJCQlzaXplb2Yoc3RydWN0IGhmc3BsdXNfY2F0X2ZvbGRlcikpOworCQloZnNwbHVzX2dldF9wZXJtcyhpbm9kZSwgJmZvbGRlci0+cGVybWlzc2lvbnMsIDEpOworCQlpbm9kZS0+aV9ubGluayA9IDE7CisJCWlub2RlLT5pX3NpemUgPSAyICsgYmUzMl90b19jcHUoZm9sZGVyLT52YWxlbmNlKTsKKwkJaW5vZGUtPmlfYXRpbWUgPSBoZnNwX210MnV0KGZvbGRlci0+YWNjZXNzX2RhdGUpOworCQlpbm9kZS0+aV9tdGltZSA9IGhmc3BfbXQydXQoZm9sZGVyLT5jb250ZW50X21vZF9kYXRlKTsKKwkJaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZTsKKwkJSEZTUExVU19JKGlub2RlKS5mc19ibG9ja3MgPSAwOworCQlpbm9kZS0+aV9vcCA9ICZoZnNwbHVzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmaGZzcGx1c19kaXJfb3BlcmF0aW9uczsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gSEZTUExVU19GSUxFKSB7CisJCXN0cnVjdCBoZnNwbHVzX2NhdF9maWxlICpmaWxlID0gJmVudHJ5LmZpbGU7CisKKwkJaWYgKGZkLT5lbnRyeWxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaGZzcGx1c19jYXRfZmlsZSkpCisJCQkvKiBwYW5pYz8gKi87CisJCWhmc19ibm9kZV9yZWFkKGZkLT5ibm9kZSwgJmVudHJ5LCBmZC0+ZW50cnlvZmZzZXQsCisJCQkJCXNpemVvZihzdHJ1Y3QgaGZzcGx1c19jYXRfZmlsZSkpOworCisJCWhmc3BsdXNfaW5vZGVfcmVhZF9mb3JrKGlub2RlLCBIRlNQTFVTX0lTX0RBVEEoaW5vZGUpID8KKwkJCQkJJmZpbGUtPmRhdGFfZm9yayA6ICZmaWxlLT5yc3JjX2ZvcmspOworCQloZnNwbHVzX2dldF9wZXJtcyhpbm9kZSwgJmZpbGUtPnBlcm1pc3Npb25zLCAwKTsKKwkJaW5vZGUtPmlfbmxpbmsgPSAxOworCQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQkJaWYgKGZpbGUtPnBlcm1pc3Npb25zLmRldikKKwkJCQlpbm9kZS0+aV9ubGluayA9IGJlMzJfdG9fY3B1KGZpbGUtPnBlcm1pc3Npb25zLmRldik7CisJCQlpbm9kZS0+aV9vcCA9ICZoZnNwbHVzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2ZvcCA9ICZoZnNwbHVzX2ZpbGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmhmc3BsdXNfYW9wczsKKwkJfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCQlpbm9kZS0+aV9vcCA9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmhmc3BsdXNfYW9wczsKKwkJfSBlbHNlIHsKKwkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwKKwkJCQkJICAgYmUzMl90b19jcHUoZmlsZS0+cGVybWlzc2lvbnMuZGV2KSk7CisJCX0KKwkJaW5vZGUtPmlfYXRpbWUgPSBoZnNwX210MnV0KGZpbGUtPmFjY2Vzc19kYXRlKTsKKwkJaW5vZGUtPmlfbXRpbWUgPSBoZnNwX210MnV0KGZpbGUtPmNvbnRlbnRfbW9kX2RhdGUpOworCQlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lOworCX0gZWxzZSB7CisJCXByaW50aygiSEZTKy1mczogYmFkIGNhdGFsb2cgZW50cnkgdXNlZCB0byBjcmVhdGUgaW5vZGVcbiIpOworCQlyZXMgPSAtRUlPOworCX0KKwlyZXR1cm4gcmVzOworfQorCitpbnQgaGZzcGx1c19jYXRfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKm1haW5faW5vZGUgPSBpbm9kZTsKKwlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBmZDsKKwloZnNwbHVzX2NhdF9lbnRyeSBlbnRyeTsKKworCWlmIChIRlNQTFVTX0lTX1JTUkMoaW5vZGUpKQorCQltYWluX2lub2RlID0gSEZTUExVU19JKGlub2RlKS5yc3JjX2lub2RlOworCisJaWYgKCFtYWluX2lub2RlLT5pX25saW5rKQorCQlyZXR1cm4gMDsKKworCWlmIChoZnNfZmluZF9pbml0KEhGU1BMVVNfU0IobWFpbl9pbm9kZS0+aV9zYikuY2F0X3RyZWUsICZmZCkpCisJCS8qIHBhbmljPyAqLworCQlyZXR1cm4gLUVJTzsKKworCWlmIChoZnNwbHVzX2ZpbmRfY2F0KG1haW5faW5vZGUtPmlfc2IsIG1haW5faW5vZGUtPmlfaW5vLCAmZmQpKQorCQkvKiBwYW5pYz8gKi8KKwkJZ290byBvdXQ7CisKKwlpZiAoU19JU0RJUihtYWluX2lub2RlLT5pX21vZGUpKSB7CisJCXN0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIgKmZvbGRlciA9ICZlbnRyeS5mb2xkZXI7CisKKwkJaWYgKGZkLmVudHJ5bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIpKQorCQkJLyogcGFuaWM/ICovOworCQloZnNfYm5vZGVfcmVhZChmZC5ibm9kZSwgJmVudHJ5LCBmZC5lbnRyeW9mZnNldCwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIpKTsKKwkJLyogc2ltcGxlIG5vZGUgY2hlY2tzPyAqLworCQloZnNwbHVzX3NldF9wZXJtcyhpbm9kZSwgJmZvbGRlci0+cGVybWlzc2lvbnMpOworCQlmb2xkZXItPmFjY2Vzc19kYXRlID0gaGZzcF91dDJtdChpbm9kZS0+aV9hdGltZSk7CisJCWZvbGRlci0+Y29udGVudF9tb2RfZGF0ZSA9IGhmc3BfdXQybXQoaW5vZGUtPmlfbXRpbWUpOworCQlmb2xkZXItPmF0dHJpYnV0ZV9tb2RfZGF0ZSA9IGhmc3BfdXQybXQoaW5vZGUtPmlfY3RpbWUpOworCQlmb2xkZXItPnZhbGVuY2UgPSBjcHVfdG9fYmUzMihpbm9kZS0+aV9zaXplIC0gMik7CisJCWhmc19ibm9kZV93cml0ZShmZC5ibm9kZSwgJmVudHJ5LCBmZC5lbnRyeW9mZnNldCwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgaGZzcGx1c19jYXRfZm9sZGVyKSk7CisJfSBlbHNlIGlmIChIRlNQTFVTX0lTX1JTUkMoaW5vZGUpKSB7CisJCXN0cnVjdCBoZnNwbHVzX2NhdF9maWxlICpmaWxlID0gJmVudHJ5LmZpbGU7CisJCWhmc19ibm9kZV9yZWFkKGZkLmJub2RlLCAmZW50cnksIGZkLmVudHJ5b2Zmc2V0LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaGZzcGx1c19jYXRfZmlsZSkpOworCQloZnNwbHVzX2lub2RlX3dyaXRlX2ZvcmsoaW5vZGUsICZmaWxlLT5yc3JjX2ZvcmspOworCQloZnNfYm5vZGVfd3JpdGUoZmQuYm5vZGUsICZlbnRyeSwgZmQuZW50cnlvZmZzZXQsCisJCQkJc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9maWxlKSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGhmc3BsdXNfY2F0X2ZpbGUgKmZpbGUgPSAmZW50cnkuZmlsZTsKKworCQlpZiAoZmQuZW50cnlsZW5ndGggPCBzaXplb2Yoc3RydWN0IGhmc3BsdXNfY2F0X2ZpbGUpKQorCQkJLyogcGFuaWM/ICovOworCQloZnNfYm5vZGVfcmVhZChmZC5ibm9kZSwgJmVudHJ5LCBmZC5lbnRyeW9mZnNldCwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9maWxlKSk7CisJCWhmc3BsdXNfaW5vZGVfd3JpdGVfZm9yayhpbm9kZSwgJmZpbGUtPmRhdGFfZm9yayk7CisJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQkJSEZTUExVU19JKGlub2RlKS5kZXYgPSBpbm9kZS0+aV9ubGluazsKKwkJaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKKwkJCUhGU1BMVVNfSShpbm9kZSkuZGV2ID0ga2Rldl90X3RvX25yKGlub2RlLT5pX3JkZXYpOworCQloZnNwbHVzX3NldF9wZXJtcyhpbm9kZSwgJmZpbGUtPnBlcm1pc3Npb25zKTsKKwkJaWYgKChmaWxlLT5wZXJtaXNzaW9ucy5yb290ZmxhZ3MgfCBmaWxlLT5wZXJtaXNzaW9ucy51c2VyZmxhZ3MpICYgSEZTUExVU19GTEdfSU1NVVRBQkxFKQorCQkJZmlsZS0+ZmxhZ3MgfD0gY3B1X3RvX2JlMTYoSEZTUExVU19GSUxFX0xPQ0tFRCk7CisJCWVsc2UKKwkJCWZpbGUtPmZsYWdzICY9IGNwdV90b19iZTE2KH5IRlNQTFVTX0ZJTEVfTE9DS0VEKTsKKwkJZmlsZS0+YWNjZXNzX2RhdGUgPSBoZnNwX3V0Mm10KGlub2RlLT5pX2F0aW1lKTsKKwkJZmlsZS0+Y29udGVudF9tb2RfZGF0ZSA9IGhmc3BfdXQybXQoaW5vZGUtPmlfbXRpbWUpOworCQlmaWxlLT5hdHRyaWJ1dGVfbW9kX2RhdGUgPSBoZnNwX3V0Mm10KGlub2RlLT5pX2N0aW1lKTsKKwkJaGZzX2Jub2RlX3dyaXRlKGZkLmJub2RlLCAmZW50cnksIGZkLmVudHJ5b2Zmc2V0LAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9maWxlKSk7CisJfQorb3V0OgorCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvaW9jdGwuYyBiL2ZzL2hmc3BsdXMvaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDdhYTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzcGx1cy9pb2N0bC5jCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogIGxpbnV4L2ZzL2hmc3BsdXMvaW9jdGwuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMworICogRXRoYW4gQmVuc29uIDxlcmJlbnNvbkBhbGFza2EubmV0PgorICogcGFydGlhbGx5IGRlcml2ZWQgZnJvbSBsaW51eC9mcy9leHQyL2lvY3RsLmMKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiBoZnNwbHVzIGlvY3RscworICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgImhmc3BsdXNfZnMuaCIKKworaW50IGhmc3BsdXNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgaW50IGZsYWdzOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEhGU1BMVVNfSU9DX0VYVDJfR0VURkxBR1M6CisJCWZsYWdzID0gMDsKKwkJaWYgKEhGU1BMVVNfSShpbm9kZSkucm9vdGZsYWdzICYgSEZTUExVU19GTEdfSU1NVVRBQkxFKQorCQkJZmxhZ3MgfD0gRVhUMl9GTEFHX0lNTVVUQUJMRTsgLyogRVhUMl9JTU1VVEFCTEVfRkwgKi8KKwkJaWYgKEhGU1BMVVNfSShpbm9kZSkucm9vdGZsYWdzICYgSEZTUExVU19GTEdfQVBQRU5EKQorCQkJZmxhZ3MgfD0gRVhUMl9GTEFHX0FQUEVORDsgLyogRVhUMl9BUFBFTkRfRkwgKi8KKwkJaWYgKEhGU1BMVVNfSShpbm9kZSkudXNlcmZsYWdzICYgSEZTUExVU19GTEdfTk9EVU1QKQorCQkJZmxhZ3MgfD0gRVhUMl9GTEFHX05PRFVNUDsgLyogRVhUMl9OT0RVTVBfRkwgKi8KKwkJcmV0dXJuIHB1dF91c2VyKGZsYWdzLCAoaW50IF9fdXNlciAqKWFyZyk7CisJY2FzZSBIRlNQTFVTX0lPQ19FWFQyX1NFVEZMQUdTOiB7CisJCWlmIChJU19SRE9OTFkoaW5vZGUpKQorCQkJcmV0dXJuIC1FUk9GUzsKKworCQlpZiAoKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCkgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlpZiAoZ2V0X3VzZXIoZmxhZ3MsIChpbnQgX191c2VyICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChmbGFncyAmIChFWFQyX0ZMQUdfSU1NVVRBQkxFfEVYVDJfRkxBR19BUFBFTkQpIHx8CisJCSAgICBIRlNQTFVTX0koaW5vZGUpLnJvb3RmbGFncyAmIChIRlNQTFVTX0ZMR19JTU1VVEFCTEV8SEZTUExVU19GTEdfQVBQRU5EKSkgeworCQkJaWYgKCFjYXBhYmxlKENBUF9MSU5VWF9JTU1VVEFCTEUpKQorCQkJCXJldHVybiAtRVBFUk07CisJCX0KKworCQkvKiBkb24ndCBzaWxlbnRseSBpZ25vcmUgdW5zdXBwb3J0ZWQgZXh0MiBmbGFncyAqLworCQlpZiAoZmxhZ3MgJiB+KEVYVDJfRkxBR19JTU1VVEFCTEV8RVhUMl9GTEFHX0FQUEVORHwKKwkJCSAgICAgIEVYVDJfRkxBR19OT0RVTVApKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJCWlmIChmbGFncyAmIEVYVDJfRkxBR19JTU1VVEFCTEUpIHsgLyogRVhUMl9JTU1VVEFCTEVfRkwgKi8KKwkJCWlub2RlLT5pX2ZsYWdzIHw9IFNfSU1NVVRBQkxFOworCQkJSEZTUExVU19JKGlub2RlKS5yb290ZmxhZ3MgfD0gSEZTUExVU19GTEdfSU1NVVRBQkxFOworCQl9IGVsc2UgeworCQkJaW5vZGUtPmlfZmxhZ3MgJj0gflNfSU1NVVRBQkxFOworCQkJSEZTUExVU19JKGlub2RlKS5yb290ZmxhZ3MgJj0gfkhGU1BMVVNfRkxHX0lNTVVUQUJMRTsKKwkJfQorCQlpZiAoZmxhZ3MgJiBFWFQyX0ZMQUdfQVBQRU5EKSB7IC8qIEVYVDJfQVBQRU5EX0ZMICovCisJCQlpbm9kZS0+aV9mbGFncyB8PSBTX0FQUEVORDsKKwkJCUhGU1BMVVNfSShpbm9kZSkucm9vdGZsYWdzIHw9IEhGU1BMVVNfRkxHX0FQUEVORDsKKwkJfSBlbHNlIHsKKwkJCWlub2RlLT5pX2ZsYWdzICY9IH5TX0FQUEVORDsKKwkJCUhGU1BMVVNfSShpbm9kZSkucm9vdGZsYWdzICY9IH5IRlNQTFVTX0ZMR19BUFBFTkQ7CisJCX0KKwkJaWYgKGZsYWdzICYgRVhUMl9GTEFHX05PRFVNUCkgLyogRVhUMl9OT0RVTVBfRkwgKi8KKwkJCUhGU1BMVVNfSShpbm9kZSkudXNlcmZsYWdzIHw9IEhGU1BMVVNfRkxHX05PRFVNUDsKKwkJZWxzZQorCQkJSEZTUExVU19JKGlub2RlKS51c2VyZmxhZ3MgJj0gfkhGU1BMVVNfRkxHX05PRFVNUDsKKworCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlyZXR1cm4gMDsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorfQorCitpbnQgaGZzcGx1c19zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBmZDsKKwloZnNwbHVzX2NhdF9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3QgaGZzcGx1c19jYXRfZmlsZSAqZmlsZTsKKwlpbnQgcmVzOworCisJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpIHx8IEhGU1BMVVNfSVNfUlNSQyhpbm9kZSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXJlcyA9IGhmc19maW5kX2luaXQoSEZTUExVU19TQihpbm9kZS0+aV9zYikuY2F0X3RyZWUsICZmZCk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKwlyZXMgPSBoZnNwbHVzX2ZpbmRfY2F0KGlub2RlLT5pX3NiLCBpbm9kZS0+aV9pbm8sICZmZCk7CisJaWYgKHJlcykKKwkJZ290byBvdXQ7CisJaGZzX2Jub2RlX3JlYWQoZmQuYm5vZGUsICZlbnRyeSwgZmQuZW50cnlvZmZzZXQsCisJCQlzaXplb2Yoc3RydWN0IGhmc3BsdXNfY2F0X2ZpbGUpKTsKKwlmaWxlID0gJmVudHJ5LmZpbGU7CisKKwlpZiAoIXN0cmNtcChuYW1lLCAiaGZzLnR5cGUiKSkgeworCQlpZiAoc2l6ZSA9PSA0KQorCQkJbWVtY3B5KCZmaWxlLT51c2VyX2luZm8uZmRUeXBlLCB2YWx1ZSwgNCk7CisJCWVsc2UKKwkJCXJlcyA9IC1FUkFOR0U7CisJfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJoZnMuY3JlYXRvciIpKSB7CisJCWlmIChzaXplID09IDQpCisJCQltZW1jcHkoJmZpbGUtPnVzZXJfaW5mby5mZENyZWF0b3IsIHZhbHVlLCA0KTsKKwkJZWxzZQorCQkJcmVzID0gLUVSQU5HRTsKKwl9IGVsc2UKKwkJcmVzID0gLUVPUE5PVFNVUFA7CisJaWYgKCFyZXMpCisJCWhmc19ibm9kZV93cml0ZShmZC5ibm9kZSwgJmVudHJ5LCBmZC5lbnRyeW9mZnNldCwKKwkJCQlzaXplb2Yoc3RydWN0IGhmc3BsdXNfY2F0X2ZpbGUpKTsKK291dDoKKwloZnNfZmluZF9leGl0KCZmZCk7CisJcmV0dXJuIHJlczsKK30KKworc3NpemVfdCBoZnNwbHVzX2dldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBmZDsKKwloZnNwbHVzX2NhdF9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3QgaGZzcGx1c19jYXRfZmlsZSAqZmlsZTsKKwlzc2l6ZV90IHJlcyA9IDA7CisKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwgSEZTUExVU19JU19SU1JDKGlub2RlKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKHNpemUpIHsKKwkJcmVzID0gaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKGlub2RlLT5pX3NiKS5jYXRfdHJlZSwgJmZkKTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiByZXM7CisJCXJlcyA9IGhmc3BsdXNfZmluZF9jYXQoaW5vZGUtPmlfc2IsIGlub2RlLT5pX2lubywgJmZkKTsKKwkJaWYgKHJlcykKKwkJCWdvdG8gb3V0OworCQloZnNfYm5vZGVfcmVhZChmZC5ibm9kZSwgJmVudHJ5LCBmZC5lbnRyeW9mZnNldCwKKwkJCQlzaXplb2Yoc3RydWN0IGhmc3BsdXNfY2F0X2ZpbGUpKTsKKwl9CisJZmlsZSA9ICZlbnRyeS5maWxlOworCisJaWYgKCFzdHJjbXAobmFtZSwgImhmcy50eXBlIikpIHsKKwkJaWYgKHNpemUgPj0gNCkgeworCQkJbWVtY3B5KHZhbHVlLCAmZmlsZS0+dXNlcl9pbmZvLmZkVHlwZSwgNCk7CisJCQlyZXMgPSA0OworCQl9IGVsc2UKKwkJCXJlcyA9IHNpemUgPyAtRVJBTkdFIDogNDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImhmcy5jcmVhdG9yIikpIHsKKwkJaWYgKHNpemUgPj0gNCkgeworCQkJbWVtY3B5KHZhbHVlLCAmZmlsZS0+dXNlcl9pbmZvLmZkQ3JlYXRvciwgNCk7CisJCQlyZXMgPSA0OworCQl9IGVsc2UKKwkJCXJlcyA9IHNpemUgPyAtRVJBTkdFIDogNDsKKwl9IGVsc2UKKwkJcmVzID0gLUVOT0RBVEE7CitvdXQ6CisJaWYgKHNpemUpCisJCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gcmVzOworfQorCisjZGVmaW5lIEhGU1BMVVNfQVRUUkxJU1RfU0laRSAoc2l6ZW9mKCJoZnMuY3JlYXRvciIpK3NpemVvZigiaGZzLnR5cGUiKSkKKworc3NpemVfdCBoZnNwbHVzX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBIRlNQTFVTX0lTX1JTUkMoaW5vZGUpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoIWJ1ZmZlciB8fCAhc2l6ZSkKKwkJcmV0dXJuIEhGU1BMVVNfQVRUUkxJU1RfU0laRTsKKwlpZiAoc2l6ZSA8IEhGU1BMVVNfQVRUUkxJU1RfU0laRSkKKwkJcmV0dXJuIC1FUkFOR0U7CisJc3RyY3B5KGJ1ZmZlciwgImhmcy50eXBlIik7CisJc3RyY3B5KGJ1ZmZlciArIHNpemVvZigiaGZzLnR5cGUiKSwgImhmcy5jcmVhdG9yIik7CisKKwlyZXR1cm4gSEZTUExVU19BVFRSTElTVF9TSVpFOworfQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9vcHRpb25zLmMgYi9mcy9oZnNwbHVzL29wdGlvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2NhMDEwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzcGx1cy9vcHRpb25zLmMKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzcGx1cy9vcHRpb25zLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEKKyAqIEJyYWQgQm95ZXIgKGZsYXJAYWxsYW5kcmlhLmNvbSkKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqCisgKiBPcHRpb24gcGFyc2luZworICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgImhmc3BsdXNfZnMuaCIKKworZW51bSB7CisJb3B0X2NyZWF0b3IsIG9wdF90eXBlLAorCW9wdF91bWFzaywgb3B0X3VpZCwgb3B0X2dpZCwKKwlvcHRfcGFydCwgb3B0X3Nlc3Npb24sIG9wdF9ubHMsCisJb3B0X25vZGVjb21wb3NlLCBvcHRfZGVjb21wb3NlLAorCW9wdF9lcnIKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7IG9wdF9jcmVhdG9yLCAiY3JlYXRvcj0lcyIgfSwKKwl7IG9wdF90eXBlLCAidHlwZT0lcyIgfSwKKwl7IG9wdF91bWFzaywgInVtYXNrPSVvIiB9LAorCXsgb3B0X3VpZCwgInVpZD0ldSIgfSwKKwl7IG9wdF9naWQsICJnaWQ9JXUiIH0sCisJeyBvcHRfcGFydCwgInBhcnQ9JXUiIH0sCisJeyBvcHRfc2Vzc2lvbiwgInNlc3Npb249JXUiIH0sCisJeyBvcHRfbmxzLCAibmxzPSVzIiB9LAorCXsgb3B0X2RlY29tcG9zZSwgImRlY29tcG9zZSIgfSwKKwl7IG9wdF9ub2RlY29tcG9zZSwgIm5vZGVjb21wb3NlIiB9LAorCXsgb3B0X2VyciwgTlVMTCB9Cit9OworCisvKiBJbml0aWFsaXplIGFuIG9wdGlvbnMgb2JqZWN0IHRvIHJlYXNvbmFibGUgZGVmYXVsdHMgKi8KK3ZvaWQgZmlsbF9kZWZhdWx0cyhzdHJ1Y3QgaGZzcGx1c19zYl9pbmZvICpvcHRzKQoreworCWlmICghb3B0cykKKwkJcmV0dXJuOworCisJb3B0cy0+Y3JlYXRvciA9IEhGU1BMVVNfREVGX0NSX1RZUEU7CisJb3B0cy0+dHlwZSA9IEhGU1BMVVNfREVGX0NSX1RZUEU7CisJb3B0cy0+dW1hc2sgPSBjdXJyZW50LT5mcy0+dW1hc2s7CisJb3B0cy0+dWlkID0gY3VycmVudC0+dWlkOworCW9wdHMtPmdpZCA9IGN1cnJlbnQtPmdpZDsKKwlvcHRzLT5wYXJ0ID0gLTE7CisJb3B0cy0+c2Vzc2lvbiA9IC0xOworfQorCisvKiBjb252ZXJ0IGEgImZvdXIgYnl0ZSBjaGFyYWN0ZXIiIHRvIGEgMzIgYml0IGludCB3aXRoIGVycm9yIGNoZWNrcyAqLworc3RhdGljIGlubGluZSBpbnQgbWF0Y2hfZm91cmNoYXIoc3Vic3RyaW5nX3QgKmFyZywgdTMyICpyZXN1bHQpCit7CisJaWYgKGFyZy0+dG8gLSBhcmctPmZyb20gIT0gNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbWVtY3B5KHJlc3VsdCwgYXJnLT5mcm9tLCA0KTsKKwlyZXR1cm4gMDsKK30KKworLyogUGFyc2Ugb3B0aW9ucyBmcm9tIG1vdW50LiBSZXR1cm5zIDAgb24gZmFpbHVyZSAqLworLyogaW5wdXQgaXMgdGhlIG9wdGlvbnMgcGFzc2VkIHRvIG1vdW50KCkgYXMgYSBzdHJpbmcgKi8KK2ludCBwYXJzZV9vcHRpb25zKGNoYXIgKmlucHV0LCBzdHJ1Y3QgaGZzcGx1c19zYl9pbmZvICpzYmkpCit7CisJY2hhciAqcDsKKwlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJaW50IHRtcCwgdG9rZW47CisKKwlpZiAoIWlucHV0KQorCQlnb3RvIGRvbmU7CisKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJmlucHV0LCAiLCIpKSAhPSBOVUxMKSB7CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJY2FzZSBvcHRfY3JlYXRvcjoKKwkJCWlmIChtYXRjaF9mb3VyY2hhcigmYXJnc1swXSwgJnNiaS0+Y3JlYXRvcikpIHsKKwkJCQlwcmludGsoIkhGUystZnM6IGNyZWF0b3IgcmVxdWlyZXMgYSA0IGNoYXJhY3RlciB2YWx1ZVxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBvcHRfdHlwZToKKwkJCWlmIChtYXRjaF9mb3VyY2hhcigmYXJnc1swXSwgJnNiaS0+dHlwZSkpIHsKKwkJCQlwcmludGsoIkhGUystZnM6IHR5cGUgcmVxdWlyZXMgYSA0IGNoYXJhY3RlciB2YWx1ZVxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBvcHRfdW1hc2s6CisJCQlpZiAobWF0Y2hfb2N0YWwoJmFyZ3NbMF0sICZ0bXApKSB7CisJCQkJcHJpbnRrKCJIRlMrLWZzOiB1bWFzayByZXF1aXJlcyBhIHZhbHVlXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXNiaS0+dW1hc2sgPSAodW1vZGVfdCl0bXA7CisJCQlicmVhazsKKwkJY2FzZSBvcHRfdWlkOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJnRtcCkpIHsKKwkJCQlwcmludGsoIkhGUystZnM6IHVpZCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlzYmktPnVpZCA9ICh1aWRfdCl0bXA7CisJCQlicmVhazsKKwkJY2FzZSBvcHRfZ2lkOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJnRtcCkpIHsKKwkJCQlwcmludGsoIkhGUystZnM6IGdpZCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlzYmktPmdpZCA9IChnaWRfdCl0bXA7CisJCQlicmVhazsKKwkJY2FzZSBvcHRfcGFydDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZzYmktPnBhcnQpKSB7CisJCQkJcHJpbnRrKCJIRlMrLWZzOiBwYXJ0IHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIG9wdF9zZXNzaW9uOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJnNiaS0+c2Vzc2lvbikpIHsKKwkJCQlwcmludGsoIkhGUystZnM6IHNlc3Npb24gcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2Ugb3B0X25sczoKKwkJCWlmIChzYmktPm5scykgeworCQkJCXByaW50aygiSEZTKy1mczogdW5hYmxlIHRvIGNoYW5nZSBubHMgbWFwcGluZ1xuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlwID0gbWF0Y2hfc3RyZHVwKCZhcmdzWzBdKTsKKwkJCXNiaS0+bmxzID0gbG9hZF9ubHMocCk7CisJCQlpZiAoIXNiaS0+bmxzKSB7CisJCQkJcHJpbnRrKCJIRlMrLWZzOiB1bmFibGUgdG8gbG9hZCBubHMgbWFwcGluZyBcIiVzXCJcbiIsIHApOworCQkJCWtmcmVlKHApOworCQkJCXJldHVybiAwOworCQkJfQorCQkJa2ZyZWUocCk7CisJCQlicmVhazsKKwkJY2FzZSBvcHRfZGVjb21wb3NlOgorCQkJc2JpLT5mbGFncyAmPSB+SEZTUExVU19TQl9OT0RFQ09NUE9TRTsKKwkJCWJyZWFrOworCQljYXNlIG9wdF9ub2RlY29tcG9zZToKKwkJCXNiaS0+ZmxhZ3MgfD0gSEZTUExVU19TQl9OT0RFQ09NUE9TRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKK2RvbmU6CisJaWYgKCFzYmktPm5scykgeworCQkvKiB0cnkgdXRmOCBmaXJzdCwgYXMgdGhpcyBpcyB0aGUgb2xkIGRlZmF1bHQgYmVoYXZpb3VyICovCisJCXNiaS0+bmxzID0gbG9hZF9ubHMoInV0ZjgiKTsKKwkJaWYgKCFzYmktPm5scykKKwkJCXNiaS0+bmxzID0gbG9hZF9ubHNfZGVmYXVsdCgpOworCQlpZiAoIXNiaS0+bmxzKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3BhcnRfdGJsLmMgYi9mcy9oZnNwbHVzL3BhcnRfdGJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3ODMwNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmc3BsdXMvcGFydF90YmwuYwpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIGxpbnV4L2ZzL2hmcy9wYXJ0X3RibC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTE5OTcgIFBhdWwgSC4gSGFyZ3JvdmUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBPcmlnaW5hbCBjb2RlIHRvIGhhbmRsZSB0aGUgbmV3IHN0eWxlIE1hYyBwYXJ0aXRpb24gdGFibGUgYmFzZWQgb24KKyAqIGEgcGF0Y2ggY29udHJpYnV0ZWQgYnkgSG9sZ2VyIFNjaGVtZWwgKGFlZ2xvc0B2YWxpbm9yLm93bC5kZSkuCisgKgorICogSW4gZnVuY3Rpb24gcHJlY29uZGl0aW9ucyB0aGUgdGVybSAidmFsaWQiIGFwcGxpZWQgdG8gYSBwb2ludGVyIHRvCisgKiBhIHN0cnVjdHVyZSBtZWFucyB0aGF0IHRoZSBwb2ludGVyIGlzIG5vbi1OVUxMIGFuZCB0aGUgc3RydWN0dXJlIGl0CisgKiBwb2ludHMgdG8gaGFzIGFsbCBmaWVsZHMgaW5pdGlhbGl6ZWQgdG8gY29uc2lzdGVudCB2YWx1ZXMuCisgKgorICovCisKKyNpbmNsdWRlICJoZnNwbHVzX2ZzLmgiCisKKy8qIG9mZnNldHMgdG8gdmFyaW91cyBibG9ja3MgKi8KKyNkZWZpbmUgSEZTX0REX0JMSwkJMCAvKiBEcml2ZXIgRGVzY3JpcHRvciBibG9jayAqLworI2RlZmluZSBIRlNfUE1BUF9CTEsJCTEgLyogRmlyc3QgYmxvY2sgb2YgcGFydGl0aW9uIG1hcCAqLworI2RlZmluZSBIRlNfTURCX0JMSwkJMiAvKiBCbG9jayAody9pIHBhcnRpdGlvbikgb2YgTURCICovCisKKy8qIG1hZ2ljIG51bWJlcnMgZm9yIHZhcmlvdXMgZGlzayBibG9ja3MgKi8KKyNkZWZpbmUgSEZTX0RSVlJfREVTQ19NQUdJQwkweDQ1NTIgLyogIkVSIjogZHJpdmVyIGRlc2NyaXB0b3IgbWFwICovCisjZGVmaW5lIEhGU19PTERfUE1BUF9NQUdJQwkweDU0NTMgLyogIlRTIjogb2xkLXR5cGUgcGFydGl0aW9uIG1hcCAqLworI2RlZmluZSBIRlNfTkVXX1BNQVBfTUFHSUMJMHg1MDREIC8qICJQTSI6IG5ldy10eXBlIHBhcnRpdGlvbiBtYXAgKi8KKyNkZWZpbmUgSEZTX1NVUEVSX01BR0lDCQkweDQyNDQgLyogIkJEIjogSEZTIE1EQiAoc3VwZXIgYmxvY2spICovCisjZGVmaW5lIEhGU19NRlNfU1VQRVJfTUFHSUMJMHhEMkQ3IC8qIE1GUyBNREIgKHN1cGVyIGJsb2NrKSAqLworCisvKgorICogVGhlIG5ldyBzdHlsZSBNYWMgcGFydGl0aW9uIG1hcAorICoKKyAqIEZvciBlYWNoIHBhcnRpdGlvbiBvbiB0aGUgbWVkaWEgdGhlcmUgaXMgYSBwaHlzaWNhbCBibG9jayAoNTEyLWJ5dGUKKyAqIGJsb2NrKSBjb250YWluaW5nIG9uZSBvZiB0aGVzZSBzdHJ1Y3R1cmVzLiAgVGhlc2UgYmxvY2tzIGFyZQorICogY29udGlndW91cyBzdGFydGluZyBhdCBibG9jayAxLgorICovCitzdHJ1Y3QgbmV3X3BtYXAgeworCV9fYmUxNglwbVNpZzsJCS8qIHNpZ25hdHVyZSAqLworCV9fYmUxNglyZVNpZ1BhZDsJLyogcGFkZGluZyAqLworCV9fYmUzMglwbU1hcEJsa0NudDsJLyogcGFydGl0aW9uIGJsb2NrcyBjb3VudCAqLworCV9fYmUzMglwbVB5UGFydFN0YXJ0OwkvKiBwaHlzaWNhbCBibG9jayBzdGFydCBvZiBwYXJ0aXRpb24gKi8KKwlfX2JlMzIJcG1QYXJ0QmxrQ250OwkvKiBwaHlzaWNhbCBibG9jayBjb3VudCBvZiBwYXJ0aXRpb24gKi8KKwl1OAlwbVBhcnROYW1lWzMyXTsJLyogKG51bGwgdGVybWluYXRlZD8pIHN0cmluZworCQkJCSAgIGdpdmluZyB0aGUgbmFtZSBvZiB0aGlzCisJCQkJICAgcGFydGl0aW9uICovCisJdTgJcG1QYXJ0VHlwZVszMl07CS8qIChudWxsIHRlcm1pbmF0ZWQ/KSBzdHJpbmcKKwkJCQkgICBnaXZpbmcgdGhlIHR5cGUgb2YgdGhpcworCQkJCSAgIHBhcnRpdGlvbiAqLworCS8qIGEgYnVuY2ggbW9yZSBzdHVmZiB3ZSBkb24ndCBuZWVkICovCit9IF9fcGFja2VkOworCisvKgorICogVGhlIG9sZCBzdHlsZSBNYWMgcGFydGl0aW9uIG1hcAorICoKKyAqIFRoZSBwYXJ0aXRpb24gbWFwIGNvbnNpc3RzIGZvciBhIDItYnl0ZSBzaWduYXR1cmUgZm9sbG93ZWQgYnkgYW4KKyAqIGFycmF5IG9mIHRoZXNlIHN0cnVjdHVyZXMuICBUaGUgbWFwIGlzIHRlcm1pbmF0ZWQgd2l0aCBhbiBhbGwtemVybworICogb25lIG9mIHRoZXNlLgorICovCitzdHJ1Y3Qgb2xkX3BtYXAgeworCV9fYmUxNgkJcGRTaWc7CS8qIFNpZ25hdHVyZSBieXRlcyAqLworCXN0cnVjdCAJb2xkX3BtYXBfZW50cnkgeworCQlfX2JlMzIJcGRTdGFydDsKKwkJX19iZTMyCXBkU2l6ZTsKKwkJX19iZTMyCXBkRlNJRDsKKwl9CXBkRW50cnlbNDJdOworfSBfX3BhY2tlZDsKKworLyoKKyAqIGhmc19wYXJ0X2ZpbmQoKQorICoKKyAqIFBhcnNlIHRoZSBwYXJ0aXRpb24gbWFwIGxvb2tpbmcgZm9yIHRoZQorICogc3RhcnQgYW5kIGxlbmd0aCBvZiB0aGUgJ3BhcnQndGggSEZTIHBhcnRpdGlvbi4KKyAqLworaW50IGhmc19wYXJ0X2ZpbmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJICBzZWN0b3JfdCAqcGFydF9zdGFydCwgc2VjdG9yX3QgKnBhcnRfc2l6ZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCV9fYmUxNiAqZGF0YTsKKwlpbnQgaSwgc2l6ZSwgcmVzOworCisJcmVzID0gLUVOT0VOVDsKKwliaCA9IHNiX2JyZWFkNTEyKHNiLCAqcGFydF9zdGFydCArIEhGU19QTUFQX0JMSywgZGF0YSk7CisJaWYgKCFiaCkKKwkJcmV0dXJuIC1FSU87CisKKwlzd2l0Y2ggKGJlMTZfdG9fY3B1KCpkYXRhKSkgeworCWNhc2UgSEZTX09MRF9QTUFQX01BR0lDOgorCSAgeworCQlzdHJ1Y3Qgb2xkX3BtYXAgKnBtOworCQlzdHJ1Y3Qgb2xkX3BtYXBfZW50cnkgKnA7CisKKwkJcG0gPSAoc3RydWN0IG9sZF9wbWFwICopYmgtPmJfZGF0YTsKKwkJcCA9IHBtLT5wZEVudHJ5OworCQlzaXplID0gNDI7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBwKyssIGkrKykgeworCQkJaWYgKHAtPnBkU3RhcnQgJiYgcC0+cGRTaXplICYmCisJCQkgICAgcC0+cGRGU0lEID09IGNwdV90b19iZTMyKDB4NTQ0NjUzMzEpLyoiVEZTMSIqLyAmJgorCQkJICAgIChIRlNQTFVTX1NCKHNiKS5wYXJ0IDwgMCB8fCBIRlNQTFVTX1NCKHNiKS5wYXJ0ID09IGkpKSB7CisJCQkJKnBhcnRfc3RhcnQgKz0gYmUzMl90b19jcHUocC0+cGRTdGFydCk7CisJCQkJKnBhcnRfc2l6ZSA9IGJlMzJfdG9fY3B1KHAtPnBkU2l6ZSk7CisJCQkJcmVzID0gMDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwkgIH0KKwljYXNlIEhGU19ORVdfUE1BUF9NQUdJQzoKKwkgIHsKKwkJc3RydWN0IG5ld19wbWFwICpwbTsKKworCQlwbSA9IChzdHJ1Y3QgbmV3X3BtYXAgKiliaC0+Yl9kYXRhOworCQlzaXplID0gYmUzMl90b19jcHUocG0tPnBtTWFwQmxrQ250KTsKKwkJZm9yIChpID0gMDsgaSA8IHNpemU7KSB7CisJCQlpZiAoIW1lbWNtcChwbS0+cG1QYXJ0VHlwZSwiQXBwbGVfSEZTIiwgOSkgJiYKKwkJCSAgICAoSEZTUExVU19TQihzYikucGFydCA8IDAgfHwgSEZTUExVU19TQihzYikucGFydCA9PSBpKSkgeworCQkJCSpwYXJ0X3N0YXJ0ICs9IGJlMzJfdG9fY3B1KHBtLT5wbVB5UGFydFN0YXJ0KTsKKwkJCQkqcGFydF9zaXplID0gYmUzMl90b19jcHUocG0tPnBtUGFydEJsa0NudCk7CisJCQkJcmVzID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWxzZShiaCk7CisJCQliaCA9IHNiX2JyZWFkNTEyKHNiLCAqcGFydF9zdGFydCArIEhGU19QTUFQX0JMSyArICsraSwgcG0pOworCQkJaWYgKCFiaCkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWlmIChwbS0+cG1TaWcgIT0gY3B1X3RvX2JlMTYoSEZTX05FV19QTUFQX01BR0lDKSkKKwkJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwkgIH0KKwl9CisJYnJlbHNlKGJoKTsKKworCXJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3N1cGVyLmMgYi9mcy9oZnNwbHVzL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY4MDQ0NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmc3BsdXMvc3VwZXIuYwpAQCAtMCwwICsxLDUwMiBAQAorLyoKKyAqICBsaW51eC9mcy9oZnNwbHVzL3N1cGVyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEKKyAqIEJyYWQgQm95ZXIgKGZsYXJAYWxsYW5kcmlhLmNvbSkKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmhmc3BsdXNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitzdGF0aWMgdm9pZCBoZnNwbHVzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CisKKyNpbmNsdWRlICJoZnNwbHVzX2ZzLmgiCisKK3ZvaWQgaGZzcGx1c19pbm9kZV9jaGVjayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworI2lmIDAKKwl1MzIgY250ID0gYXRvbWljX3JlYWQoJkhGU1BMVVNfU0Ioc2IpLmlub2RlX2NudCk7CisJdTMyIGxhc3RfY250ID0gSEZTUExVU19TQihzYikubGFzdF9pbm9kZV9jbnQ7CisKKwlpZiAoY250IDw9IChsYXN0X2NudCAvIDIpIHx8CisJICAgIGNudCA+PSAobGFzdF9jbnQgKiAyKSkgeworCQlIRlNQTFVTX1NCKHNiKS5sYXN0X2lub2RlX2NudCA9IGNudDsKKwkJcHJpbnRrKCJpbm9kZV9jaGVjazogJXUsJXUsJXVcbiIsIGNudCwgbGFzdF9jbnQsCisJCQlIRlNQTFVTX1NCKHNiKS5jYXRfdHJlZSA/IEhGU1BMVVNfU0Ioc2IpLmNhdF90cmVlLT5ub2RlX2hhc2hfY250IDogMCk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGhmc3BsdXNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBoZnNfZmluZF9kYXRhIGZkOworCXN0cnVjdCBoZnNwbHVzX3ZoICp2aGRyOworCWludCBlcnI7CisKKwlhdG9taWNfaW5jKCZIRlNQTFVTX1NCKGlub2RlLT5pX3NiKS5pbm9kZV9jbnQpOworCWhmc3BsdXNfaW5vZGVfY2hlY2soaW5vZGUtPmlfc2IpOworCUlOSVRfTElTVF9IRUFEKCZIRlNQTFVTX0koaW5vZGUpLm9wZW5fZGlyX2xpc3QpOworCWluaXRfTVVURVgoJkhGU1BMVVNfSShpbm9kZSkuZXh0ZW50c19sb2NrKTsKKwlIRlNQTFVTX0koaW5vZGUpLmZsYWdzID0gMDsKKwlIRlNQTFVTX0koaW5vZGUpLnJzcmNfaW5vZGUgPSBOVUxMOworCisJaWYgKGlub2RlLT5pX2lubyA+PSBIRlNQTFVTX0ZJUlNUVVNFUl9DTklEKSB7CisJcmVhZF9pbm9kZToKKwkJaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKGlub2RlLT5pX3NiKS5jYXRfdHJlZSwgJmZkKTsKKwkJZXJyID0gaGZzcGx1c19maW5kX2NhdChpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAmZmQpOworCQlpZiAoIWVycikKKwkJCWVyciA9IGhmc3BsdXNfY2F0X3JlYWRfaW5vZGUoaW5vZGUsICZmZCk7CisJCWhmc19maW5kX2V4aXQoJmZkKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gYmFkX2lub2RlOworCQlyZXR1cm47CisJfQorCXZoZHIgPSBIRlNQTFVTX1NCKGlub2RlLT5pX3NiKS5zX3ZoZHI7CisJc3dpdGNoKGlub2RlLT5pX2lubykgeworCWNhc2UgSEZTUExVU19ST09UX0NOSUQ6CisJCWdvdG8gcmVhZF9pbm9kZTsKKwljYXNlIEhGU1BMVVNfRVhUX0NOSUQ6CisJCWhmc3BsdXNfaW5vZGVfcmVhZF9mb3JrKGlub2RlLCAmdmhkci0+ZXh0X2ZpbGUpOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZoZnNwbHVzX2J0cmVlX2FvcHM7CisJCWJyZWFrOworCWNhc2UgSEZTUExVU19DQVRfQ05JRDoKKwkJaGZzcGx1c19pbm9kZV9yZWFkX2ZvcmsoaW5vZGUsICZ2aGRyLT5jYXRfZmlsZSk7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmhmc3BsdXNfYnRyZWVfYW9wczsKKwkJYnJlYWs7CisJY2FzZSBIRlNQTFVTX0FMTE9DX0NOSUQ6CisJCWhmc3BsdXNfaW5vZGVfcmVhZF9mb3JrKGlub2RlLCAmdmhkci0+YWxsb2NfZmlsZSk7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmhmc3BsdXNfYW9wczsKKwkJYnJlYWs7CisJY2FzZSBIRlNQTFVTX1NUQVJUX0NOSUQ6CisJCWhmc3BsdXNfaW5vZGVfcmVhZF9mb3JrKGlub2RlLCAmdmhkci0+c3RhcnRfZmlsZSk7CisJCWJyZWFrOworCWNhc2UgSEZTUExVU19BVFRSX0NOSUQ6CisJCWhmc3BsdXNfaW5vZGVfcmVhZF9mb3JrKGlub2RlLCAmdmhkci0+YXR0cl9maWxlKTsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmaGZzcGx1c19idHJlZV9hb3BzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIGJhZF9pbm9kZTsKKwl9CisKKwlyZXR1cm47CisKKyBiYWRfaW5vZGU6CisJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHVudXNlZCkKK3sKKwlzdHJ1Y3QgaGZzcGx1c192aCAqdmhkcjsKKwlpbnQgcmV0ID0gMDsKKworCWRwcmludChEQkdfSU5PREUsICJoZnNwbHVzX3dyaXRlX2lub2RlOiAlbHVcbiIsIGlub2RlLT5pX2lubyk7CisJaGZzcGx1c19leHRfd3JpdGVfZXh0ZW50KGlub2RlKTsKKwlpZiAoaW5vZGUtPmlfaW5vID49IEhGU1BMVVNfRklSU1RVU0VSX0NOSUQpIHsKKwkJcmV0dXJuIGhmc3BsdXNfY2F0X3dyaXRlX2lub2RlKGlub2RlKTsKKwl9CisJdmhkciA9IEhGU1BMVVNfU0IoaW5vZGUtPmlfc2IpLnNfdmhkcjsKKwlzd2l0Y2ggKGlub2RlLT5pX2lubykgeworCWNhc2UgSEZTUExVU19ST09UX0NOSUQ6CisJCXJldCA9IGhmc3BsdXNfY2F0X3dyaXRlX2lub2RlKGlub2RlKTsKKwkJYnJlYWs7CisJY2FzZSBIRlNQTFVTX0VYVF9DTklEOgorCQlpZiAodmhkci0+ZXh0X2ZpbGUudG90YWxfc2l6ZSAhPSBjcHVfdG9fYmU2NChpbm9kZS0+aV9zaXplKSkgeworCQkJSEZTUExVU19TQihpbm9kZS0+aV9zYikuZmxhZ3MgfD0gSEZTUExVU19TQl9XUklURUJBQ0tVUDsKKwkJCWlub2RlLT5pX3NiLT5zX2RpcnQgPSAxOworCQl9CisJCWhmc3BsdXNfaW5vZGVfd3JpdGVfZm9yayhpbm9kZSwgJnZoZHItPmV4dF9maWxlKTsKKwkJaGZzX2J0cmVlX3dyaXRlKEhGU1BMVVNfU0IoaW5vZGUtPmlfc2IpLmV4dF90cmVlKTsKKwkJYnJlYWs7CisJY2FzZSBIRlNQTFVTX0NBVF9DTklEOgorCQlpZiAodmhkci0+Y2F0X2ZpbGUudG90YWxfc2l6ZSAhPSBjcHVfdG9fYmU2NChpbm9kZS0+aV9zaXplKSkgeworCQkJSEZTUExVU19TQihpbm9kZS0+aV9zYikuZmxhZ3MgfD0gSEZTUExVU19TQl9XUklURUJBQ0tVUDsKKwkJCWlub2RlLT5pX3NiLT5zX2RpcnQgPSAxOworCQl9CisJCWhmc3BsdXNfaW5vZGVfd3JpdGVfZm9yayhpbm9kZSwgJnZoZHItPmNhdF9maWxlKTsKKwkJaGZzX2J0cmVlX3dyaXRlKEhGU1BMVVNfU0IoaW5vZGUtPmlfc2IpLmNhdF90cmVlKTsKKwkJYnJlYWs7CisJY2FzZSBIRlNQTFVTX0FMTE9DX0NOSUQ6CisJCWlmICh2aGRyLT5hbGxvY19maWxlLnRvdGFsX3NpemUgIT0gY3B1X3RvX2JlNjQoaW5vZGUtPmlfc2l6ZSkpIHsKKwkJCUhGU1BMVVNfU0IoaW5vZGUtPmlfc2IpLmZsYWdzIHw9IEhGU1BMVVNfU0JfV1JJVEVCQUNLVVA7CisJCQlpbm9kZS0+aV9zYi0+c19kaXJ0ID0gMTsKKwkJfQorCQloZnNwbHVzX2lub2RlX3dyaXRlX2ZvcmsoaW5vZGUsICZ2aGRyLT5hbGxvY19maWxlKTsKKwkJYnJlYWs7CisJY2FzZSBIRlNQTFVTX1NUQVJUX0NOSUQ6CisJCWlmICh2aGRyLT5zdGFydF9maWxlLnRvdGFsX3NpemUgIT0gY3B1X3RvX2JlNjQoaW5vZGUtPmlfc2l6ZSkpIHsKKwkJCUhGU1BMVVNfU0IoaW5vZGUtPmlfc2IpLmZsYWdzIHw9IEhGU1BMVVNfU0JfV1JJVEVCQUNLVVA7CisJCQlpbm9kZS0+aV9zYi0+c19kaXJ0ID0gMTsKKwkJfQorCQloZnNwbHVzX2lub2RlX3dyaXRlX2ZvcmsoaW5vZGUsICZ2aGRyLT5zdGFydF9maWxlKTsKKwkJYnJlYWs7CisJY2FzZSBIRlNQTFVTX0FUVFJfQ05JRDoKKwkJaWYgKHZoZHItPmF0dHJfZmlsZS50b3RhbF9zaXplICE9IGNwdV90b19iZTY0KGlub2RlLT5pX3NpemUpKSB7CisJCQlIRlNQTFVTX1NCKGlub2RlLT5pX3NiKS5mbGFncyB8PSBIRlNQTFVTX1NCX1dSSVRFQkFDS1VQOworCQkJaW5vZGUtPmlfc2ItPnNfZGlydCA9IDE7CisJCX0KKwkJaGZzcGx1c19pbm9kZV93cml0ZV9mb3JrKGlub2RlLCAmdmhkci0+YXR0cl9maWxlKTsKKwkJaGZzX2J0cmVlX3dyaXRlKEhGU1BMVVNfU0IoaW5vZGUtPmlfc2IpLmF0dHJfdHJlZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBoZnNwbHVzX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJZHByaW50KERCR19JTk9ERSwgImhmc3BsdXNfY2xlYXJfaW5vZGU6ICVsdVxuIiwgaW5vZGUtPmlfaW5vKTsKKwlhdG9taWNfZGVjKCZIRlNQTFVTX1NCKGlub2RlLT5pX3NiKS5pbm9kZV9jbnQpOworCWlmIChIRlNQTFVTX0lTX1JTUkMoaW5vZGUpKSB7CisJCUhGU1BMVVNfSShIRlNQTFVTX0koaW5vZGUpLnJzcmNfaW5vZGUpLnJzcmNfaW5vZGUgPSBOVUxMOworCQlpcHV0KEhGU1BMVVNfSShpbm9kZSkucnNyY19pbm9kZSk7CisJfQorCWhmc3BsdXNfaW5vZGVfY2hlY2soaW5vZGUtPmlfc2IpOworfQorCitzdGF0aWMgdm9pZCBoZnNwbHVzX3dyaXRlX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGhmc3BsdXNfdmggKnZoZHIgPSBIRlNQTFVTX1NCKHNiKS5zX3ZoZHI7CisKKwlkcHJpbnQoREJHX1NVUEVSLCAiaGZzcGx1c193cml0ZV9zdXBlclxuIik7CisJc2ItPnNfZGlydCA9IDA7CisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQkvKiB3YXJuPyAqLworCQlyZXR1cm47CisKKwl2aGRyLT5mcmVlX2Jsb2NrcyA9IGNwdV90b19iZTMyKEhGU1BMVVNfU0Ioc2IpLmZyZWVfYmxvY2tzKTsKKwl2aGRyLT5uZXh0X2FsbG9jID0gY3B1X3RvX2JlMzIoSEZTUExVU19TQihzYikubmV4dF9hbGxvYyk7CisJdmhkci0+bmV4dF9jbmlkID0gY3B1X3RvX2JlMzIoSEZTUExVU19TQihzYikubmV4dF9jbmlkKTsKKwl2aGRyLT5mb2xkZXJfY291bnQgPSBjcHVfdG9fYmUzMihIRlNQTFVTX1NCKHNiKS5mb2xkZXJfY291bnQpOworCXZoZHItPmZpbGVfY291bnQgPSBjcHVfdG9fYmUzMihIRlNQTFVTX1NCKHNiKS5maWxlX2NvdW50KTsKKworCW1hcmtfYnVmZmVyX2RpcnR5KEhGU1BMVVNfU0Ioc2IpLnNfdmhiaCk7CisJaWYgKEhGU1BMVVNfU0Ioc2IpLmZsYWdzICYgSEZTUExVU19TQl9XUklURUJBQ0tVUCkgeworCQlpZiAoSEZTUExVU19TQihzYikuc2VjdF9jb3VudCkgeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwkJCXUzMiBibG9jaywgb2Zmc2V0OworCisJCQlibG9jayA9IEhGU1BMVVNfU0Ioc2IpLmJsb2Nrb2Zmc2V0OworCQkJYmxvY2sgKz0gKEhGU1BMVVNfU0Ioc2IpLnNlY3RfY291bnQgLSAyKSA+PiAoc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KTsKKwkJCW9mZnNldCA9ICgoSEZTUExVU19TQihzYikuc2VjdF9jb3VudCAtIDIpIDw8IDkpICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOworCQkJcHJpbnRrKCJiYWNrdXA6ICV1LCV1LCV1LCV1XG4iLCBIRlNQTFVTX1NCKHNiKS5ibG9ja29mZnNldCwKKwkJCQlIRlNQTFVTX1NCKHNiKS5zZWN0X2NvdW50LCBibG9jaywgb2Zmc2V0KTsKKwkJCWJoID0gc2JfYnJlYWQoc2IsIGJsb2NrKTsKKwkJCWlmIChiaCkgeworCQkJCXZoZHIgPSAoc3RydWN0IGhmc3BsdXNfdmggKikoYmgtPmJfZGF0YSArIG9mZnNldCk7CisJCQkJaWYgKGJlMTZfdG9fY3B1KHZoZHItPnNpZ25hdHVyZSkgPT0gSEZTUExVU19WT0xIRUFEX1NJRykgeworCQkJCQltZW1jcHkodmhkciwgSEZTUExVU19TQihzYikuc192aGRyLCBzaXplb2YoKnZoZHIpKTsKKwkJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJCQlicmVsc2UoYmgpOworCQkJCX0gZWxzZQorCQkJCQlwcmludGsoImJhY2t1cCBub3QgZm91bmQhXG4iKTsKKwkJCX0KKwkJfQorCQlIRlNQTFVTX1NCKHNiKS5mbGFncyAmPSB+SEZTUExVU19TQl9XUklURUJBQ0tVUDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhmc3BsdXNfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJZHByaW50KERCR19TVVBFUiwgImhmc3BsdXNfcHV0X3N1cGVyXG4iKTsKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJc3RydWN0IGhmc3BsdXNfdmggKnZoZHIgPSBIRlNQTFVTX1NCKHNiKS5zX3ZoZHI7CisKKwkJdmhkci0+bW9kaWZ5X2RhdGUgPSBoZnNwX25vdzJtdCgpOworCQl2aGRyLT5hdHRyaWJ1dGVzIHw9IGNwdV90b19iZTMyKEhGU1BMVVNfVk9MX1VOTU5UKTsKKwkJdmhkci0+YXR0cmlidXRlcyAmPSBjcHVfdG9fYmUzMih+SEZTUExVU19WT0xfSU5DTlNUTlQpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShIRlNQTFVTX1NCKHNiKS5zX3ZoYmgpOworCQlsbF9yd19ibG9jayhXUklURSwgMSwgJkhGU1BMVVNfU0Ioc2IpLnNfdmhiaCk7CisJCXdhaXRfb25fYnVmZmVyKEhGU1BMVVNfU0Ioc2IpLnNfdmhiaCk7CisJfQorCisJaGZzX2J0cmVlX2Nsb3NlKEhGU1BMVVNfU0Ioc2IpLmNhdF90cmVlKTsKKwloZnNfYnRyZWVfY2xvc2UoSEZTUExVU19TQihzYikuZXh0X3RyZWUpOworCWlwdXQoSEZTUExVU19TQihzYikuYWxsb2NfZmlsZSk7CisJaXB1dChIRlNQTFVTX1NCKHNiKS5oaWRkZW5fZGlyKTsKKwlicmVsc2UoSEZTUExVU19TQihzYikuc192aGJoKTsKKwlpZiAoSEZTUExVU19TQihzYikubmxzKQorCQl1bmxvYWRfbmxzKEhGU1BMVVNfU0Ioc2IpLm5scyk7Cit9CisKK3N0YXRpYyBpbnQgaGZzcGx1c19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlidWYtPmZfdHlwZSA9IEhGU1BMVVNfU1VQRVJfTUFHSUM7CisJYnVmLT5mX2JzaXplID0gc2ItPnNfYmxvY2tzaXplOworCWJ1Zi0+Zl9ibG9ja3MgPSBIRlNQTFVTX1NCKHNiKS50b3RhbF9ibG9ja3MgPDwgSEZTUExVU19TQihzYikuZnNfc2hpZnQ7CisJYnVmLT5mX2JmcmVlID0gSEZTUExVU19TQihzYikuZnJlZV9ibG9ja3MgPDwgSEZTUExVU19TQihzYikuZnNfc2hpZnQ7CisJYnVmLT5mX2JhdmFpbCA9IGJ1Zi0+Zl9iZnJlZTsKKwlidWYtPmZfZmlsZXMgPSAweEZGRkZGRkZGOworCWJ1Zi0+Zl9mZnJlZSA9IDB4RkZGRkZGRkYgLSBIRlNQTFVTX1NCKHNiKS5uZXh0X2NuaWQ7CisJYnVmLT5mX25hbWVsZW4gPSBIRlNQTFVTX01BWF9TVFJMRU47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZnNwbHVzX3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSkKK3sKKwlpZiAoKCpmbGFncyAmIE1TX1JET05MWSkgPT0gKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKwkJcmV0dXJuIDA7CisJaWYgKCEoKmZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlzdHJ1Y3QgaGZzcGx1c192aCAqdmhkciA9IEhGU1BMVVNfU0Ioc2IpLnNfdmhkcjsKKworCQlpZiAoISh2aGRyLT5hdHRyaWJ1dGVzICYgY3B1X3RvX2JlMzIoSEZTUExVU19WT0xfVU5NTlQpKSkgeworCQkJcHJpbnRrKCJIRlMrLWZzIHdhcm5pbmc6IEZpbGVzeXN0ZW0gd2FzIG5vdCBjbGVhbmx5IHVubW91bnRlZCwgIgorCQkJICAgICAgICJydW5uaW5nIGZzY2suaGZzcGx1cyBpcyByZWNvbW1lbmRlZC4gIGxlYXZpbmcgcmVhZC1vbmx5LlxuIik7CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJCQkqZmxhZ3MgfD0gTVNfUkRPTkxZOworCQl9IGVsc2UgaWYgKHZoZHItPmF0dHJpYnV0ZXMgJiBjcHVfdG9fYmUzMihIRlNQTFVTX1ZPTF9TT0ZUTE9DSykpIHsKKwkJCXByaW50aygiSEZTKy1mczogRmlsZXN5c3RlbSBpcyBtYXJrZWQgbG9ja2VkLCBsZWF2aW5nIHJlYWQtb25seS5cbiIpOworCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCQkJKmZsYWdzIHw9IE1TX1JET05MWTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGhmc3BsdXNfc29wcyA9IHsKKwkuYWxsb2NfaW5vZGUJPSBoZnNwbHVzX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gaGZzcGx1c19kZXN0cm95X2lub2RlLAorCS5yZWFkX2lub2RlCT0gaGZzcGx1c19yZWFkX2lub2RlLAorCS53cml0ZV9pbm9kZQk9IGhmc3BsdXNfd3JpdGVfaW5vZGUsCisJLmNsZWFyX2lub2RlCT0gaGZzcGx1c19jbGVhcl9pbm9kZSwKKwkucHV0X3N1cGVyCT0gaGZzcGx1c19wdXRfc3VwZXIsCisJLndyaXRlX3N1cGVyCT0gaGZzcGx1c193cml0ZV9zdXBlciwKKwkuc3RhdGZzCQk9IGhmc3BsdXNfc3RhdGZzLAorCS5yZW1vdW50X2ZzCT0gaGZzcGx1c19yZW1vdW50LAorfTsKKworc3RhdGljIGludCBoZnNwbHVzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaGZzcGx1c192aCAqdmhkcjsKKwlzdHJ1Y3QgaGZzcGx1c19zYl9pbmZvICpzYmk7CisJaGZzcGx1c19jYXRfZW50cnkgZW50cnk7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJc3RydWN0IGlub2RlICpyb290OworCXN0cnVjdCBxc3RyIHN0cjsKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHMgPSBOVUxMOworCWludCBlcnIgPSAtRUlOVkFMOworCisJc2JpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhmc3BsdXNfc2JfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghc2JpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChzYmksIDAsIHNpemVvZihIRlNQTFVTX1NCKHNiKSkpOworCXNiLT5zX2ZzX2luZm8gPSBzYmk7CisJSU5JVF9ITElTVF9IRUFEKCZzYmktPnJzcmNfaW5vZGVzKTsKKwlmaWxsX2RlZmF1bHRzKHNiaSk7CisJaWYgKCFwYXJzZV9vcHRpb25zKGRhdGEsIHNiaSkpIHsKKwkJaWYgKCFzaWxlbnQpCisJCQlwcmludGsoIkhGUystZnM6IHVuYWJsZSB0byBwYXJzZSBtb3VudCBvcHRpb25zXG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIHRlbXBvcmFyaWx5IHVzZSB1dGY4IHRvIGNvcnJlY3RseSBmaW5kIHRoZSBoaWRkZW4gZGlyIGJlbG93ICovCisJbmxzID0gc2JpLT5ubHM7CisJc2JpLT5ubHMgPSBsb2FkX25scygidXRmOCIpOworCWlmICghbmxzKSB7CisJCXByaW50aygiSEZTKzogdW5hYmxlIHRvIGxvYWQgbmxzIGZvciB1dGY4XG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIEdyYWIgdGhlIHZvbHVtZSBoZWFkZXIgKi8KKwlpZiAoaGZzcGx1c19yZWFkX3dyYXBwZXIoc2IpKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKCJIRlMrLWZzOiB1bmFibGUgdG8gZmluZCBIRlMrIHN1cGVyYmxvY2tcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGNsZWFudXA7CisJfQorCXZoZHIgPSBIRlNQTFVTX1NCKHNiKS5zX3ZoZHI7CisKKwkvKiBDb3B5IHBhcnRzIG9mIHRoZSB2b2x1bWUgaGVhZGVyIGludG8gdGhlIHN1cGVyYmxvY2sgKi8KKwlzYi0+c19tYWdpYyA9IGJlMTZfdG9fY3B1KHZoZHItPnNpZ25hdHVyZSk7CisJaWYgKGJlMTZfdG9fY3B1KHZoZHItPnZlcnNpb24pICE9IEhGU1BMVVNfQ1VSUkVOVF9WRVJTSU9OKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKCJIRlMrLWZzOiB3cm9uZyBmaWxlc3lzdGVtIHZlcnNpb25cbiIpOworCQlnb3RvIGNsZWFudXA7CisJfQorCUhGU1BMVVNfU0Ioc2IpLnRvdGFsX2Jsb2NrcyA9IGJlMzJfdG9fY3B1KHZoZHItPnRvdGFsX2Jsb2Nrcyk7CisJSEZTUExVU19TQihzYikuZnJlZV9ibG9ja3MgPSBiZTMyX3RvX2NwdSh2aGRyLT5mcmVlX2Jsb2Nrcyk7CisJSEZTUExVU19TQihzYikubmV4dF9hbGxvYyA9IGJlMzJfdG9fY3B1KHZoZHItPm5leHRfYWxsb2MpOworCUhGU1BMVVNfU0Ioc2IpLm5leHRfY25pZCA9IGJlMzJfdG9fY3B1KHZoZHItPm5leHRfY25pZCk7CisJSEZTUExVU19TQihzYikuZmlsZV9jb3VudCA9IGJlMzJfdG9fY3B1KHZoZHItPmZpbGVfY291bnQpOworCUhGU1BMVVNfU0Ioc2IpLmZvbGRlcl9jb3VudCA9IGJlMzJfdG9fY3B1KHZoZHItPmZvbGRlcl9jb3VudCk7CisJSEZTUExVU19TQihzYikuZGF0YV9jbHVtcF9ibG9ja3MgPSBiZTMyX3RvX2NwdSh2aGRyLT5kYXRhX2NsdW1wX3N6KSA+PiBIRlNQTFVTX1NCKHNiKS5hbGxvY19ibGtzel9zaGlmdDsKKwlpZiAoIUhGU1BMVVNfU0Ioc2IpLmRhdGFfY2x1bXBfYmxvY2tzKQorCQlIRlNQTFVTX1NCKHNiKS5kYXRhX2NsdW1wX2Jsb2NrcyA9IDE7CisJSEZTUExVU19TQihzYikucnNyY19jbHVtcF9ibG9ja3MgPSBiZTMyX3RvX2NwdSh2aGRyLT5yc3JjX2NsdW1wX3N6KSA+PiBIRlNQTFVTX1NCKHNiKS5hbGxvY19ibGtzel9zaGlmdDsKKwlpZiAoIUhGU1BMVVNfU0Ioc2IpLnJzcmNfY2x1bXBfYmxvY2tzKQorCQlIRlNQTFVTX1NCKHNiKS5yc3JjX2NsdW1wX2Jsb2NrcyA9IDE7CisKKwkvKiBTZXQgdXAgb3BlcmF0aW9ucyBzbyB3ZSBjYW4gbG9hZCBtZXRhZGF0YSAqLworCXNiLT5zX29wID0gJmhmc3BsdXNfc29wczsKKwlzYi0+c19tYXhieXRlcyA9IE1BWF9MRlNfRklMRVNJWkU7CisKKwlpZiAoISh2aGRyLT5hdHRyaWJ1dGVzICYgY3B1X3RvX2JlMzIoSEZTUExVU19WT0xfVU5NTlQpKSkgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50aygiSEZTKy1mcyB3YXJuaW5nOiBGaWxlc3lzdGVtIHdhcyBub3QgY2xlYW5seSB1bm1vdW50ZWQsICIKKwkJCSAgICAgICAicnVubmluZyBmc2NrLmhmc3BsdXMgaXMgcmVjb21tZW5kZWQuICBtb3VudGluZyByZWFkLW9ubHkuXG4iKTsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCX0gZWxzZSBpZiAodmhkci0+YXR0cmlidXRlcyAmIGNwdV90b19iZTMyKEhGU1BMVVNfVk9MX1NPRlRMT0NLKSkgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50aygiSEZTKy1mczogRmlsZXN5c3RlbSBpcyBtYXJrZWQgbG9ja2VkLCBtb3VudGluZyByZWFkLW9ubHkuXG4iKTsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCX0KKworCS8qIExvYWQgbWV0YWRhdGEgb2JqZWN0cyAoQipUcmVlcykgKi8KKwlIRlNQTFVTX1NCKHNiKS5leHRfdHJlZSA9IGhmc19idHJlZV9vcGVuKHNiLCBIRlNQTFVTX0VYVF9DTklEKTsKKwlpZiAoIUhGU1BMVVNfU0Ioc2IpLmV4dF90cmVlKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKCJIRlMrLWZzOiBmYWlsZWQgdG8gbG9hZCBleHRlbnRzIGZpbGVcbiIpOworCQlnb3RvIGNsZWFudXA7CisJfQorCUhGU1BMVVNfU0Ioc2IpLmNhdF90cmVlID0gaGZzX2J0cmVlX29wZW4oc2IsIEhGU1BMVVNfQ0FUX0NOSUQpOworCWlmICghSEZTUExVU19TQihzYikuY2F0X3RyZWUpIHsKKwkJaWYgKCFzaWxlbnQpCisJCQlwcmludGsoIkhGUystZnM6IGZhaWxlZCB0byBsb2FkIGNhdGFsb2cgZmlsZVxuIik7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlIRlNQTFVTX1NCKHNiKS5hbGxvY19maWxlID0gaWdldChzYiwgSEZTUExVU19BTExPQ19DTklEKTsKKwlpZiAoIUhGU1BMVVNfU0Ioc2IpLmFsbG9jX2ZpbGUpIHsKKwkJaWYgKCFzaWxlbnQpCisJCQlwcmludGsoIkhGUystZnM6IGZhaWxlZCB0byBsb2FkIGFsbG9jYXRpb24gZmlsZVxuIik7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBMb2FkIHRoZSByb290IGRpcmVjdG9yeSAqLworCXJvb3QgPSBpZ2V0KHNiLCBIRlNQTFVTX1JPT1RfQ05JRCk7CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKKwlpZiAoIXNiLT5zX3Jvb3QpIHsKKwkJaWYgKCFzaWxlbnQpCisJCQlwcmludGsoIkhGUystZnM6IGZhaWxlZCB0byBsb2FkIHJvb3QgZGlyZWN0b3J5XG4iKTsKKwkJaXB1dChyb290KTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCXN0ci5sZW4gPSBzaXplb2YoSEZTUF9ISURERU5ESVJfTkFNRSkgLSAxOworCXN0ci5uYW1lID0gSEZTUF9ISURERU5ESVJfTkFNRTsKKwloZnNfZmluZF9pbml0KEhGU1BMVVNfU0Ioc2IpLmNhdF90cmVlLCAmZmQpOworCWhmc3BsdXNfY2F0X2J1aWxkX2tleShzYiwgZmQuc2VhcmNoX2tleSwgSEZTUExVU19ST09UX0NOSUQsICZzdHIpOworCWlmICghaGZzX2JyZWNfcmVhZCgmZmQsICZlbnRyeSwgc2l6ZW9mKGVudHJ5KSkpIHsKKwkJaGZzX2ZpbmRfZXhpdCgmZmQpOworCQlpZiAoZW50cnkudHlwZSAhPSBjcHVfdG9fYmUxNihIRlNQTFVTX0ZPTERFUikpCisJCQlnb3RvIGNsZWFudXA7CisJCUhGU1BMVVNfU0Ioc2IpLmhpZGRlbl9kaXIgPSBpZ2V0KHNiLCBiZTMyX3RvX2NwdShlbnRyeS5mb2xkZXIuaWQpKTsKKwkJaWYgKCFIRlNQTFVTX1NCKHNiKS5oaWRkZW5fZGlyKQorCQkJZ290byBjbGVhbnVwOworCX0gZWxzZQorCQloZnNfZmluZF9leGl0KCZmZCk7CisKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCWdvdG8gb3V0OworCisJLyogSCtMWCA9PSBoZnNwbHVzdXRpbHMsIEgrTHggPT0gdGhpcyBkcml2ZXIsIEgrbHggaXMgdW51c2VkCisJICogYWxsIHRocmVlIGFyZSByZWdpc3RlcmVkIHdpdGggQXBwbGUgZm9yIG91ciB1c2UKKwkgKi8KKwl2aGRyLT5sYXN0X21vdW50X3ZlcnMgPSBjcHVfdG9fYmUzMihIRlNQX01PVU5UX1ZFUlNJT04pOworCXZoZHItPm1vZGlmeV9kYXRlID0gaGZzcF9ub3cybXQoKTsKKwl2aGRyLT53cml0ZV9jb3VudCA9IGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KHZoZHItPndyaXRlX2NvdW50KSArIDEpOworCXZoZHItPmF0dHJpYnV0ZXMgJj0gY3B1X3RvX2JlMzIofkhGU1BMVVNfVk9MX1VOTU5UKTsKKwl2aGRyLT5hdHRyaWJ1dGVzIHw9IGNwdV90b19iZTMyKEhGU1BMVVNfVk9MX0lOQ05TVE5UKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShIRlNQTFVTX1NCKHNiKS5zX3ZoYmgpOworCWxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmSEZTUExVU19TQihzYikuc192aGJoKTsKKwl3YWl0X29uX2J1ZmZlcihIRlNQTFVTX1NCKHNiKS5zX3ZoYmgpOworCisJaWYgKCFIRlNQTFVTX1NCKHNiKS5oaWRkZW5fZGlyKSB7CisJCXByaW50aygiSEZTKzogY3JlYXRlIGhpZGRlbiBkaXIuLi5cbiIpOworCQlIRlNQTFVTX1NCKHNiKS5oaWRkZW5fZGlyID0gaGZzcGx1c19uZXdfaW5vZGUoc2IsIFNfSUZESVIpOworCQloZnNwbHVzX2NyZWF0ZV9jYXQoSEZTUExVU19TQihzYikuaGlkZGVuX2Rpci0+aV9pbm8sIHNiLT5zX3Jvb3QtPmRfaW5vZGUsCisJCQkJICAgJnN0ciwgSEZTUExVU19TQihzYikuaGlkZGVuX2Rpcik7CisJCW1hcmtfaW5vZGVfZGlydHkoSEZTUExVU19TQihzYikuaGlkZGVuX2Rpcik7CisJfQorb3V0OgorCXVubG9hZF9ubHMoc2JpLT5ubHMpOworCXNiaS0+bmxzID0gbmxzOworCXJldHVybiAwOworCitjbGVhbnVwOgorCWhmc3BsdXNfcHV0X3N1cGVyKHNiKTsKKwlpZiAobmxzKQorCQl1bmxvYWRfbmxzKG5scyk7CisJcmV0dXJuIGVycjsKK30KKworTU9EVUxFX0FVVEhPUigiQnJhZCBCb3llciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFeHRlbmRlZCBNYWNpbnRvc2ggRmlsZXN5c3RlbSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMga21lbV9jYWNoZV90ICpoZnNwbHVzX2lub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqaGZzcGx1c19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBoZnNwbHVzX2lub2RlX2luZm8gKmk7CisKKwlpID0ga21lbV9jYWNoZV9hbGxvYyhoZnNwbHVzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCXJldHVybiBpID8gJmktPnZmc19pbm9kZSA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGhmc3BsdXNfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShoZnNwbHVzX2lub2RlX2NhY2hlcCwgJkhGU1BMVVNfSShpbm9kZSkpOworfQorCisjZGVmaW5lIEhGU1BMVVNfSU5PREVfU0laRQlzaXplb2Yoc3RydWN0IGhmc3BsdXNfaW5vZGVfaW5mbykKKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqaGZzcGx1c19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkJCSAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBoZnNwbHVzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgaGZzcGx1c19mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiaGZzcGx1cyIsCisJLmdldF9zYgkJPSBoZnNwbHVzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworc3RhdGljIHZvaWQgaGZzcGx1c19pbml0X29uY2Uodm9pZCAqcCwga21lbV9jYWNoZV90ICpjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGhmc3BsdXNfaW5vZGVfaW5mbyAqaSA9IHA7CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0gU0xBQl9DVE9SX0NPTlNUUlVDVE9SKQorCQlpbm9kZV9pbml0X29uY2UoJmktPnZmc19pbm9kZSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfaGZzcGx1c19mcyh2b2lkKQoreworCWludCBlcnI7CisKKwloZnNwbHVzX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJoZnNwbHVzX2ljYWNoZSIsCisJCUhGU1BMVVNfSU5PREVfU0laRSwgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLAorCQloZnNwbHVzX2luaXRfb25jZSwgTlVMTCk7CisJaWYgKCFoZnNwbHVzX2lub2RlX2NhY2hlcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmaGZzcGx1c19mc190eXBlKTsKKwlpZiAoZXJyKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3koaGZzcGx1c19pbm9kZV9jYWNoZXApOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2hmc3BsdXNfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmhmc3BsdXNfZnNfdHlwZSk7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShoZnNwbHVzX2lub2RlX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX0lORk8gImhmc3BsdXNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9oZnNwbHVzX2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9oZnNwbHVzX2ZzKQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy90YWJsZXMuYyBiL2ZzL2hmc3BsdXMvdGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI5MTE3MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmc3BsdXMvdGFibGVzLmMKQEAgLTAsMCArMSwzMjQ1IEBACisvKgorICogbGludXgvZnMvaGZzcGx1cy90YWJsZXMuYworICoKKyAqIFZhcmlvdXMgZGF0YSB0YWJsZXMKKyAqLworCisjaW5jbHVkZSAiaGZzcGx1c19mcy5oIgorCisvKgorICogIFVuaWNvZGUgY2FzZSBmb2xkaW5nIHRhYmxlIHRha2VuIGZyb20gQXBwbGUgVGVjaG5vdGUgIzExNTAKKyAqICAoSEZTIFBsdXMgVm9sdW1lIEZvcm1hdCkKKyAqLworCit1MTYgaGZzcGx1c19jYXNlX2ZvbGRfdGFibGVbXSA9IHsKKy8qCisgKiAgVGhlIGxvd2VyIGNhc2UgdGFibGUgY29uc2lzdHMgb2YgYSAyNTYtZW50cnkgaGlnaC1ieXRlIHRhYmxlIGZvbGxvd2VkIGJ5CisgKiAgc29tZSBudW1iZXIgb2YgMjU2LWVudHJ5IHN1YnRhYmxlcy4gVGhlIGhpZ2gtYnl0ZSB0YWJsZSBjb250YWlucyBlaXRoZXIgYW4KKyAqICBvZmZzZXQgdG8gdGhlIHN1YnRhYmxlIGZvciBjaGFyYWN0ZXJzIHdpdGggdGhhdCBoaWdoIGJ5dGUgb3IgemVybywgd2hpY2gKKyAqICBtZWFucyB0aGF0IHRoZXJlIGFyZSBubyBjYXNlIG1hcHBpbmdzIG9yIGlnbm9yZWQgY2hhcmFjdGVycyBpbiB0aGF0IGJsb2NrLgorICogIElnbm9yZWQgY2hhcmFjdGVycyBhcmUgbWFwcGVkIHRvIHplcm8uCisgKi8KKworICAgIC8vIEhpZ2gtYnl0ZSBpbmRpY2VzICggPT0gMCBpZmYgbm8gY2FzZSBtYXBwaW5nIGFuZCBubyBpZ25vcmFibGVzICkKKworCisgICAgLyogMCAqLyAweDAxMDAsIDB4MDIwMCwgMHgwMDAwLCAweDAzMDAsIDB4MDQwMCwgMHgwNTAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIC8qIDEgKi8gMHgwNjAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAvKiAyICovIDB4MDcwMCwgMHgwODAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgLyogMyAqLyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIC8qIDQgKi8gMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAvKiA1ICovIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgLyogNiAqLyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIC8qIDcgKi8gMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAvKiA4ICovIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgLyogOSAqLyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIC8qIEEgKi8gMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAvKiBCICovIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgLyogQyAqLyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIC8qIEQgKi8gMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAvKiBFICovIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgLyogRiAqLyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDkwMCwgMHgwQTAwLAorCisgICAgLy8gVGFibGUgMSAoZm9yIGhpZ2ggYnl0ZSAweDAwKQorCisgICAgLyogMCAqLyAweEZGRkYsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsIDB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKyAgICAgICAgICAgIDB4MDAwOCwgMHgwMDA5LCAweDAwMEEsIDB4MDAwQiwgMHgwMDBDLCAweDAwMEQsIDB4MDAwRSwgMHgwMDBGLAorICAgIC8qIDEgKi8gMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLCAweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisgICAgICAgICAgICAweDAwMTgsIDB4MDAxOSwgMHgwMDFBLCAweDAwMUIsIDB4MDAxQywgMHgwMDFELCAweDAwMUUsIDB4MDAxRiwKKyAgICAvKiAyICovIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorICAgICAgICAgICAgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsCisgICAgLyogMyAqLyAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAgICAgICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwgMHgwMDNGLAorICAgIC8qIDQgKi8gMHgwMDQwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisgICAgICAgICAgICAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwKKyAgICAvKiA1ICovIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorICAgICAgICAgICAgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDVCLCAweDAwNUMsIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsCisgICAgLyogNiAqLyAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKyAgICAgICAgICAgIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLAorICAgIC8qIDcgKi8gMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisgICAgICAgICAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDAwN0UsIDB4MDA3RiwKKyAgICAvKiA4ICovIDB4MDA4MCwgMHgwMDgxLCAweDAwODIsIDB4MDA4MywgMHgwMDg0LCAweDAwODUsIDB4MDA4NiwgMHgwMDg3LAorICAgICAgICAgICAgMHgwMDg4LCAweDAwODksIDB4MDA4QSwgMHgwMDhCLCAweDAwOEMsIDB4MDA4RCwgMHgwMDhFLCAweDAwOEYsCisgICAgLyogOSAqLyAweDAwOTAsIDB4MDA5MSwgMHgwMDkyLCAweDAwOTMsIDB4MDA5NCwgMHgwMDk1LCAweDAwOTYsIDB4MDA5NywKKyAgICAgICAgICAgIDB4MDA5OCwgMHgwMDk5LCAweDAwOUEsIDB4MDA5QiwgMHgwMDlDLCAweDAwOUQsIDB4MDA5RSwgMHgwMDlGLAorICAgIC8qIEEgKi8gMHgwMEEwLCAweDAwQTEsIDB4MDBBMiwgMHgwMEEzLCAweDAwQTQsIDB4MDBBNSwgMHgwMEE2LCAweDAwQTcsCisgICAgICAgICAgICAweDAwQTgsIDB4MDBBOSwgMHgwMEFBLCAweDAwQUIsIDB4MDBBQywgMHgwMEFELCAweDAwQUUsIDB4MDBBRiwKKyAgICAvKiBCICovIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMEI0LCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAorICAgICAgICAgICAgMHgwMEI4LCAweDAwQjksIDB4MDBCQSwgMHgwMEJCLCAweDAwQkMsIDB4MDBCRCwgMHgwMEJFLCAweDAwQkYsCisgICAgLyogQyAqLyAweDAwQzAsIDB4MDBDMSwgMHgwMEMyLCAweDAwQzMsIDB4MDBDNCwgMHgwMEM1LCAweDAwRTYsIDB4MDBDNywKKyAgICAgICAgICAgIDB4MDBDOCwgMHgwMEM5LCAweDAwQ0EsIDB4MDBDQiwgMHgwMENDLCAweDAwQ0QsIDB4MDBDRSwgMHgwMENGLAorICAgIC8qIEQgKi8gMHgwMEYwLCAweDAwRDEsIDB4MDBEMiwgMHgwMEQzLCAweDAwRDQsIDB4MDBENSwgMHgwMEQ2LCAweDAwRDcsCisgICAgICAgICAgICAweDAwRjgsIDB4MDBEOSwgMHgwMERBLCAweDAwREIsIDB4MDBEQywgMHgwMERELCAweDAwRkUsIDB4MDBERiwKKyAgICAvKiBFICovIDB4MDBFMCwgMHgwMEUxLCAweDAwRTIsIDB4MDBFMywgMHgwMEU0LCAweDAwRTUsIDB4MDBFNiwgMHgwMEU3LAorICAgICAgICAgICAgMHgwMEU4LCAweDAwRTksIDB4MDBFQSwgMHgwMEVCLCAweDAwRUMsIDB4MDBFRCwgMHgwMEVFLCAweDAwRUYsCisgICAgLyogRiAqLyAweDAwRjAsIDB4MDBGMSwgMHgwMEYyLCAweDAwRjMsIDB4MDBGNCwgMHgwMEY1LCAweDAwRjYsIDB4MDBGNywKKyAgICAgICAgICAgIDB4MDBGOCwgMHgwMEY5LCAweDAwRkEsIDB4MDBGQiwgMHgwMEZDLCAweDAwRkQsIDB4MDBGRSwgMHgwMEZGLAorCisgICAgLy8gVGFibGUgMiAoZm9yIGhpZ2ggYnl0ZSAweDAxKQorCisgICAgLyogMCAqLyAweDAxMDAsIDB4MDEwMSwgMHgwMTAyLCAweDAxMDMsIDB4MDEwNCwgMHgwMTA1LCAweDAxMDYsIDB4MDEwNywKKyAgICAgICAgICAgIDB4MDEwOCwgMHgwMTA5LCAweDAxMEEsIDB4MDEwQiwgMHgwMTBDLCAweDAxMEQsIDB4MDEwRSwgMHgwMTBGLAorICAgIC8qIDEgKi8gMHgwMTExLCAweDAxMTEsIDB4MDExMiwgMHgwMTEzLCAweDAxMTQsIDB4MDExNSwgMHgwMTE2LCAweDAxMTcsCisgICAgICAgICAgICAweDAxMTgsIDB4MDExOSwgMHgwMTFBLCAweDAxMUIsIDB4MDExQywgMHgwMTFELCAweDAxMUUsIDB4MDExRiwKKyAgICAvKiAyICovIDB4MDEyMCwgMHgwMTIxLCAweDAxMjIsIDB4MDEyMywgMHgwMTI0LCAweDAxMjUsIDB4MDEyNywgMHgwMTI3LAorICAgICAgICAgICAgMHgwMTI4LCAweDAxMjksIDB4MDEyQSwgMHgwMTJCLCAweDAxMkMsIDB4MDEyRCwgMHgwMTJFLCAweDAxMkYsCisgICAgLyogMyAqLyAweDAxMzAsIDB4MDEzMSwgMHgwMTMzLCAweDAxMzMsIDB4MDEzNCwgMHgwMTM1LCAweDAxMzYsIDB4MDEzNywKKyAgICAgICAgICAgIDB4MDEzOCwgMHgwMTM5LCAweDAxM0EsIDB4MDEzQiwgMHgwMTNDLCAweDAxM0QsIDB4MDEzRSwgMHgwMTQwLAorICAgIC8qIDQgKi8gMHgwMTQwLCAweDAxNDIsIDB4MDE0MiwgMHgwMTQzLCAweDAxNDQsIDB4MDE0NSwgMHgwMTQ2LCAweDAxNDcsCisgICAgICAgICAgICAweDAxNDgsIDB4MDE0OSwgMHgwMTRCLCAweDAxNEIsIDB4MDE0QywgMHgwMTRELCAweDAxNEUsIDB4MDE0RiwKKyAgICAvKiA1ICovIDB4MDE1MCwgMHgwMTUxLCAweDAxNTMsIDB4MDE1MywgMHgwMTU0LCAweDAxNTUsIDB4MDE1NiwgMHgwMTU3LAorICAgICAgICAgICAgMHgwMTU4LCAweDAxNTksIDB4MDE1QSwgMHgwMTVCLCAweDAxNUMsIDB4MDE1RCwgMHgwMTVFLCAweDAxNUYsCisgICAgLyogNiAqLyAweDAxNjAsIDB4MDE2MSwgMHgwMTYyLCAweDAxNjMsIDB4MDE2NCwgMHgwMTY1LCAweDAxNjcsIDB4MDE2NywKKyAgICAgICAgICAgIDB4MDE2OCwgMHgwMTY5LCAweDAxNkEsIDB4MDE2QiwgMHgwMTZDLCAweDAxNkQsIDB4MDE2RSwgMHgwMTZGLAorICAgIC8qIDcgKi8gMHgwMTcwLCAweDAxNzEsIDB4MDE3MiwgMHgwMTczLCAweDAxNzQsIDB4MDE3NSwgMHgwMTc2LCAweDAxNzcsCisgICAgICAgICAgICAweDAxNzgsIDB4MDE3OSwgMHgwMTdBLCAweDAxN0IsIDB4MDE3QywgMHgwMTdELCAweDAxN0UsIDB4MDE3RiwKKyAgICAvKiA4ICovIDB4MDE4MCwgMHgwMjUzLCAweDAxODMsIDB4MDE4MywgMHgwMTg1LCAweDAxODUsIDB4MDI1NCwgMHgwMTg4LAorICAgICAgICAgICAgMHgwMTg4LCAweDAyNTYsIDB4MDI1NywgMHgwMThDLCAweDAxOEMsIDB4MDE4RCwgMHgwMURELCAweDAyNTksCisgICAgLyogOSAqLyAweDAyNUIsIDB4MDE5MiwgMHgwMTkyLCAweDAyNjAsIDB4MDI2MywgMHgwMTk1LCAweDAyNjksIDB4MDI2OCwKKyAgICAgICAgICAgIDB4MDE5OSwgMHgwMTk5LCAweDAxOUEsIDB4MDE5QiwgMHgwMjZGLCAweDAyNzIsIDB4MDE5RSwgMHgwMjc1LAorICAgIC8qIEEgKi8gMHgwMUEwLCAweDAxQTEsIDB4MDFBMywgMHgwMUEzLCAweDAxQTUsIDB4MDFBNSwgMHgwMUE2LCAweDAxQTgsCisgICAgICAgICAgICAweDAxQTgsIDB4MDI4MywgMHgwMUFBLCAweDAxQUIsIDB4MDFBRCwgMHgwMUFELCAweDAyODgsIDB4MDFBRiwKKyAgICAvKiBCICovIDB4MDFCMCwgMHgwMjhBLCAweDAyOEIsIDB4MDFCNCwgMHgwMUI0LCAweDAxQjYsIDB4MDFCNiwgMHgwMjkyLAorICAgICAgICAgICAgMHgwMUI5LCAweDAxQjksIDB4MDFCQSwgMHgwMUJCLCAweDAxQkQsIDB4MDFCRCwgMHgwMUJFLCAweDAxQkYsCisgICAgLyogQyAqLyAweDAxQzAsIDB4MDFDMSwgMHgwMUMyLCAweDAxQzMsIDB4MDFDNiwgMHgwMUM2LCAweDAxQzYsIDB4MDFDOSwKKyAgICAgICAgICAgIDB4MDFDOSwgMHgwMUM5LCAweDAxQ0MsIDB4MDFDQywgMHgwMUNDLCAweDAxQ0QsIDB4MDFDRSwgMHgwMUNGLAorICAgIC8qIEQgKi8gMHgwMUQwLCAweDAxRDEsIDB4MDFEMiwgMHgwMUQzLCAweDAxRDQsIDB4MDFENSwgMHgwMUQ2LCAweDAxRDcsCisgICAgICAgICAgICAweDAxRDgsIDB4MDFEOSwgMHgwMURBLCAweDAxREIsIDB4MDFEQywgMHgwMURELCAweDAxREUsIDB4MDFERiwKKyAgICAvKiBFICovIDB4MDFFMCwgMHgwMUUxLCAweDAxRTIsIDB4MDFFMywgMHgwMUU1LCAweDAxRTUsIDB4MDFFNiwgMHgwMUU3LAorICAgICAgICAgICAgMHgwMUU4LCAweDAxRTksIDB4MDFFQSwgMHgwMUVCLCAweDAxRUMsIDB4MDFFRCwgMHgwMUVFLCAweDAxRUYsCisgICAgLyogRiAqLyAweDAxRjAsIDB4MDFGMywgMHgwMUYzLCAweDAxRjMsIDB4MDFGNCwgMHgwMUY1LCAweDAxRjYsIDB4MDFGNywKKyAgICAgICAgICAgIDB4MDFGOCwgMHgwMUY5LCAweDAxRkEsIDB4MDFGQiwgMHgwMUZDLCAweDAxRkQsIDB4MDFGRSwgMHgwMUZGLAorCisgICAgLy8gVGFibGUgMyAoZm9yIGhpZ2ggYnl0ZSAweDAzKQorCisgICAgLyogMCAqLyAweDAzMDAsIDB4MDMwMSwgMHgwMzAyLCAweDAzMDMsIDB4MDMwNCwgMHgwMzA1LCAweDAzMDYsIDB4MDMwNywKKyAgICAgICAgICAgIDB4MDMwOCwgMHgwMzA5LCAweDAzMEEsIDB4MDMwQiwgMHgwMzBDLCAweDAzMEQsIDB4MDMwRSwgMHgwMzBGLAorICAgIC8qIDEgKi8gMHgwMzEwLCAweDAzMTEsIDB4MDMxMiwgMHgwMzEzLCAweDAzMTQsIDB4MDMxNSwgMHgwMzE2LCAweDAzMTcsCisgICAgICAgICAgICAweDAzMTgsIDB4MDMxOSwgMHgwMzFBLCAweDAzMUIsIDB4MDMxQywgMHgwMzFELCAweDAzMUUsIDB4MDMxRiwKKyAgICAvKiAyICovIDB4MDMyMCwgMHgwMzIxLCAweDAzMjIsIDB4MDMyMywgMHgwMzI0LCAweDAzMjUsIDB4MDMyNiwgMHgwMzI3LAorICAgICAgICAgICAgMHgwMzI4LCAweDAzMjksIDB4MDMyQSwgMHgwMzJCLCAweDAzMkMsIDB4MDMyRCwgMHgwMzJFLCAweDAzMkYsCisgICAgLyogMyAqLyAweDAzMzAsIDB4MDMzMSwgMHgwMzMyLCAweDAzMzMsIDB4MDMzNCwgMHgwMzM1LCAweDAzMzYsIDB4MDMzNywKKyAgICAgICAgICAgIDB4MDMzOCwgMHgwMzM5LCAweDAzM0EsIDB4MDMzQiwgMHgwMzNDLCAweDAzM0QsIDB4MDMzRSwgMHgwMzNGLAorICAgIC8qIDQgKi8gMHgwMzQwLCAweDAzNDEsIDB4MDM0MiwgMHgwMzQzLCAweDAzNDQsIDB4MDM0NSwgMHgwMzQ2LCAweDAzNDcsCisgICAgICAgICAgICAweDAzNDgsIDB4MDM0OSwgMHgwMzRBLCAweDAzNEIsIDB4MDM0QywgMHgwMzRELCAweDAzNEUsIDB4MDM0RiwKKyAgICAvKiA1ICovIDB4MDM1MCwgMHgwMzUxLCAweDAzNTIsIDB4MDM1MywgMHgwMzU0LCAweDAzNTUsIDB4MDM1NiwgMHgwMzU3LAorICAgICAgICAgICAgMHgwMzU4LCAweDAzNTksIDB4MDM1QSwgMHgwMzVCLCAweDAzNUMsIDB4MDM1RCwgMHgwMzVFLCAweDAzNUYsCisgICAgLyogNiAqLyAweDAzNjAsIDB4MDM2MSwgMHgwMzYyLCAweDAzNjMsIDB4MDM2NCwgMHgwMzY1LCAweDAzNjYsIDB4MDM2NywKKyAgICAgICAgICAgIDB4MDM2OCwgMHgwMzY5LCAweDAzNkEsIDB4MDM2QiwgMHgwMzZDLCAweDAzNkQsIDB4MDM2RSwgMHgwMzZGLAorICAgIC8qIDcgKi8gMHgwMzcwLCAweDAzNzEsIDB4MDM3MiwgMHgwMzczLCAweDAzNzQsIDB4MDM3NSwgMHgwMzc2LCAweDAzNzcsCisgICAgICAgICAgICAweDAzNzgsIDB4MDM3OSwgMHgwMzdBLCAweDAzN0IsIDB4MDM3QywgMHgwMzdELCAweDAzN0UsIDB4MDM3RiwKKyAgICAvKiA4ICovIDB4MDM4MCwgMHgwMzgxLCAweDAzODIsIDB4MDM4MywgMHgwMzg0LCAweDAzODUsIDB4MDM4NiwgMHgwMzg3LAorICAgICAgICAgICAgMHgwMzg4LCAweDAzODksIDB4MDM4QSwgMHgwMzhCLCAweDAzOEMsIDB4MDM4RCwgMHgwMzhFLCAweDAzOEYsCisgICAgLyogOSAqLyAweDAzOTAsIDB4MDNCMSwgMHgwM0IyLCAweDAzQjMsIDB4MDNCNCwgMHgwM0I1LCAweDAzQjYsIDB4MDNCNywKKyAgICAgICAgICAgIDB4MDNCOCwgMHgwM0I5LCAweDAzQkEsIDB4MDNCQiwgMHgwM0JDLCAweDAzQkQsIDB4MDNCRSwgMHgwM0JGLAorICAgIC8qIEEgKi8gMHgwM0MwLCAweDAzQzEsIDB4MDNBMiwgMHgwM0MzLCAweDAzQzQsIDB4MDNDNSwgMHgwM0M2LCAweDAzQzcsCisgICAgICAgICAgICAweDAzQzgsIDB4MDNDOSwgMHgwM0FBLCAweDAzQUIsIDB4MDNBQywgMHgwM0FELCAweDAzQUUsIDB4MDNBRiwKKyAgICAvKiBCICovIDB4MDNCMCwgMHgwM0IxLCAweDAzQjIsIDB4MDNCMywgMHgwM0I0LCAweDAzQjUsIDB4MDNCNiwgMHgwM0I3LAorICAgICAgICAgICAgMHgwM0I4LCAweDAzQjksIDB4MDNCQSwgMHgwM0JCLCAweDAzQkMsIDB4MDNCRCwgMHgwM0JFLCAweDAzQkYsCisgICAgLyogQyAqLyAweDAzQzAsIDB4MDNDMSwgMHgwM0MyLCAweDAzQzMsIDB4MDNDNCwgMHgwM0M1LCAweDAzQzYsIDB4MDNDNywKKyAgICAgICAgICAgIDB4MDNDOCwgMHgwM0M5LCAweDAzQ0EsIDB4MDNDQiwgMHgwM0NDLCAweDAzQ0QsIDB4MDNDRSwgMHgwM0NGLAorICAgIC8qIEQgKi8gMHgwM0QwLCAweDAzRDEsIDB4MDNEMiwgMHgwM0QzLCAweDAzRDQsIDB4MDNENSwgMHgwM0Q2LCAweDAzRDcsCisgICAgICAgICAgICAweDAzRDgsIDB4MDNEOSwgMHgwM0RBLCAweDAzREIsIDB4MDNEQywgMHgwM0RELCAweDAzREUsIDB4MDNERiwKKyAgICAvKiBFICovIDB4MDNFMCwgMHgwM0UxLCAweDAzRTMsIDB4MDNFMywgMHgwM0U1LCAweDAzRTUsIDB4MDNFNywgMHgwM0U3LAorICAgICAgICAgICAgMHgwM0U5LCAweDAzRTksIDB4MDNFQiwgMHgwM0VCLCAweDAzRUQsIDB4MDNFRCwgMHgwM0VGLCAweDAzRUYsCisgICAgLyogRiAqLyAweDAzRjAsIDB4MDNGMSwgMHgwM0YyLCAweDAzRjMsIDB4MDNGNCwgMHgwM0Y1LCAweDAzRjYsIDB4MDNGNywKKyAgICAgICAgICAgIDB4MDNGOCwgMHgwM0Y5LCAweDAzRkEsIDB4MDNGQiwgMHgwM0ZDLCAweDAzRkQsIDB4MDNGRSwgMHgwM0ZGLAorCisgICAgLy8gVGFibGUgNCAoZm9yIGhpZ2ggYnl0ZSAweDA0KQorCisgICAgLyogMCAqLyAweDA0MDAsIDB4MDQwMSwgMHgwNDUyLCAweDA0MDMsIDB4MDQ1NCwgMHgwNDU1LCAweDA0NTYsIDB4MDQwNywKKyAgICAgICAgICAgIDB4MDQ1OCwgMHgwNDU5LCAweDA0NUEsIDB4MDQ1QiwgMHgwNDBDLCAweDA0MEQsIDB4MDQwRSwgMHgwNDVGLAorICAgIC8qIDEgKi8gMHgwNDMwLCAweDA0MzEsIDB4MDQzMiwgMHgwNDMzLCAweDA0MzQsIDB4MDQzNSwgMHgwNDM2LCAweDA0MzcsCisgICAgICAgICAgICAweDA0MzgsIDB4MDQxOSwgMHgwNDNBLCAweDA0M0IsIDB4MDQzQywgMHgwNDNELCAweDA0M0UsIDB4MDQzRiwKKyAgICAvKiAyICovIDB4MDQ0MCwgMHgwNDQxLCAweDA0NDIsIDB4MDQ0MywgMHgwNDQ0LCAweDA0NDUsIDB4MDQ0NiwgMHgwNDQ3LAorICAgICAgICAgICAgMHgwNDQ4LCAweDA0NDksIDB4MDQ0QSwgMHgwNDRCLCAweDA0NEMsIDB4MDQ0RCwgMHgwNDRFLCAweDA0NEYsCisgICAgLyogMyAqLyAweDA0MzAsIDB4MDQzMSwgMHgwNDMyLCAweDA0MzMsIDB4MDQzNCwgMHgwNDM1LCAweDA0MzYsIDB4MDQzNywKKyAgICAgICAgICAgIDB4MDQzOCwgMHgwNDM5LCAweDA0M0EsIDB4MDQzQiwgMHgwNDNDLCAweDA0M0QsIDB4MDQzRSwgMHgwNDNGLAorICAgIC8qIDQgKi8gMHgwNDQwLCAweDA0NDEsIDB4MDQ0MiwgMHgwNDQzLCAweDA0NDQsIDB4MDQ0NSwgMHgwNDQ2LCAweDA0NDcsCisgICAgICAgICAgICAweDA0NDgsIDB4MDQ0OSwgMHgwNDRBLCAweDA0NEIsIDB4MDQ0QywgMHgwNDRELCAweDA0NEUsIDB4MDQ0RiwKKyAgICAvKiA1ICovIDB4MDQ1MCwgMHgwNDUxLCAweDA0NTIsIDB4MDQ1MywgMHgwNDU0LCAweDA0NTUsIDB4MDQ1NiwgMHgwNDU3LAorICAgICAgICAgICAgMHgwNDU4LCAweDA0NTksIDB4MDQ1QSwgMHgwNDVCLCAweDA0NUMsIDB4MDQ1RCwgMHgwNDVFLCAweDA0NUYsCisgICAgLyogNiAqLyAweDA0NjEsIDB4MDQ2MSwgMHgwNDYzLCAweDA0NjMsIDB4MDQ2NSwgMHgwNDY1LCAweDA0NjcsIDB4MDQ2NywKKyAgICAgICAgICAgIDB4MDQ2OSwgMHgwNDY5LCAweDA0NkIsIDB4MDQ2QiwgMHgwNDZELCAweDA0NkQsIDB4MDQ2RiwgMHgwNDZGLAorICAgIC8qIDcgKi8gMHgwNDcxLCAweDA0NzEsIDB4MDQ3MywgMHgwNDczLCAweDA0NzUsIDB4MDQ3NSwgMHgwNDc2LCAweDA0NzcsCisgICAgICAgICAgICAweDA0NzksIDB4MDQ3OSwgMHgwNDdCLCAweDA0N0IsIDB4MDQ3RCwgMHgwNDdELCAweDA0N0YsIDB4MDQ3RiwKKyAgICAvKiA4ICovIDB4MDQ4MSwgMHgwNDgxLCAweDA0ODIsIDB4MDQ4MywgMHgwNDg0LCAweDA0ODUsIDB4MDQ4NiwgMHgwNDg3LAorICAgICAgICAgICAgMHgwNDg4LCAweDA0ODksIDB4MDQ4QSwgMHgwNDhCLCAweDA0OEMsIDB4MDQ4RCwgMHgwNDhFLCAweDA0OEYsCisgICAgLyogOSAqLyAweDA0OTEsIDB4MDQ5MSwgMHgwNDkzLCAweDA0OTMsIDB4MDQ5NSwgMHgwNDk1LCAweDA0OTcsIDB4MDQ5NywKKyAgICAgICAgICAgIDB4MDQ5OSwgMHgwNDk5LCAweDA0OUIsIDB4MDQ5QiwgMHgwNDlELCAweDA0OUQsIDB4MDQ5RiwgMHgwNDlGLAorICAgIC8qIEEgKi8gMHgwNEExLCAweDA0QTEsIDB4MDRBMywgMHgwNEEzLCAweDA0QTUsIDB4MDRBNSwgMHgwNEE3LCAweDA0QTcsCisgICAgICAgICAgICAweDA0QTksIDB4MDRBOSwgMHgwNEFCLCAweDA0QUIsIDB4MDRBRCwgMHgwNEFELCAweDA0QUYsIDB4MDRBRiwKKyAgICAvKiBCICovIDB4MDRCMSwgMHgwNEIxLCAweDA0QjMsIDB4MDRCMywgMHgwNEI1LCAweDA0QjUsIDB4MDRCNywgMHgwNEI3LAorICAgICAgICAgICAgMHgwNEI5LCAweDA0QjksIDB4MDRCQiwgMHgwNEJCLCAweDA0QkQsIDB4MDRCRCwgMHgwNEJGLCAweDA0QkYsCisgICAgLyogQyAqLyAweDA0QzAsIDB4MDRDMSwgMHgwNEMyLCAweDA0QzQsIDB4MDRDNCwgMHgwNEM1LCAweDA0QzYsIDB4MDRDOCwKKyAgICAgICAgICAgIDB4MDRDOCwgMHgwNEM5LCAweDA0Q0EsIDB4MDRDQywgMHgwNENDLCAweDA0Q0QsIDB4MDRDRSwgMHgwNENGLAorICAgIC8qIEQgKi8gMHgwNEQwLCAweDA0RDEsIDB4MDREMiwgMHgwNEQzLCAweDA0RDQsIDB4MDRENSwgMHgwNEQ2LCAweDA0RDcsCisgICAgICAgICAgICAweDA0RDgsIDB4MDREOSwgMHgwNERBLCAweDA0REIsIDB4MDREQywgMHgwNERELCAweDA0REUsIDB4MDRERiwKKyAgICAvKiBFICovIDB4MDRFMCwgMHgwNEUxLCAweDA0RTIsIDB4MDRFMywgMHgwNEU0LCAweDA0RTUsIDB4MDRFNiwgMHgwNEU3LAorICAgICAgICAgICAgMHgwNEU4LCAweDA0RTksIDB4MDRFQSwgMHgwNEVCLCAweDA0RUMsIDB4MDRFRCwgMHgwNEVFLCAweDA0RUYsCisgICAgLyogRiAqLyAweDA0RjAsIDB4MDRGMSwgMHgwNEYyLCAweDA0RjMsIDB4MDRGNCwgMHgwNEY1LCAweDA0RjYsIDB4MDRGNywKKyAgICAgICAgICAgIDB4MDRGOCwgMHgwNEY5LCAweDA0RkEsIDB4MDRGQiwgMHgwNEZDLCAweDA0RkQsIDB4MDRGRSwgMHgwNEZGLAorCisgICAgLy8gVGFibGUgNSAoZm9yIGhpZ2ggYnl0ZSAweDA1KQorCisgICAgLyogMCAqLyAweDA1MDAsIDB4MDUwMSwgMHgwNTAyLCAweDA1MDMsIDB4MDUwNCwgMHgwNTA1LCAweDA1MDYsIDB4MDUwNywKKyAgICAgICAgICAgIDB4MDUwOCwgMHgwNTA5LCAweDA1MEEsIDB4MDUwQiwgMHgwNTBDLCAweDA1MEQsIDB4MDUwRSwgMHgwNTBGLAorICAgIC8qIDEgKi8gMHgwNTEwLCAweDA1MTEsIDB4MDUxMiwgMHgwNTEzLCAweDA1MTQsIDB4MDUxNSwgMHgwNTE2LCAweDA1MTcsCisgICAgICAgICAgICAweDA1MTgsIDB4MDUxOSwgMHgwNTFBLCAweDA1MUIsIDB4MDUxQywgMHgwNTFELCAweDA1MUUsIDB4MDUxRiwKKyAgICAvKiAyICovIDB4MDUyMCwgMHgwNTIxLCAweDA1MjIsIDB4MDUyMywgMHgwNTI0LCAweDA1MjUsIDB4MDUyNiwgMHgwNTI3LAorICAgICAgICAgICAgMHgwNTI4LCAweDA1MjksIDB4MDUyQSwgMHgwNTJCLCAweDA1MkMsIDB4MDUyRCwgMHgwNTJFLCAweDA1MkYsCisgICAgLyogMyAqLyAweDA1MzAsIDB4MDU2MSwgMHgwNTYyLCAweDA1NjMsIDB4MDU2NCwgMHgwNTY1LCAweDA1NjYsIDB4MDU2NywKKyAgICAgICAgICAgIDB4MDU2OCwgMHgwNTY5LCAweDA1NkEsIDB4MDU2QiwgMHgwNTZDLCAweDA1NkQsIDB4MDU2RSwgMHgwNTZGLAorICAgIC8qIDQgKi8gMHgwNTcwLCAweDA1NzEsIDB4MDU3MiwgMHgwNTczLCAweDA1NzQsIDB4MDU3NSwgMHgwNTc2LCAweDA1NzcsCisgICAgICAgICAgICAweDA1NzgsIDB4MDU3OSwgMHgwNTdBLCAweDA1N0IsIDB4MDU3QywgMHgwNTdELCAweDA1N0UsIDB4MDU3RiwKKyAgICAvKiA1ICovIDB4MDU4MCwgMHgwNTgxLCAweDA1ODIsIDB4MDU4MywgMHgwNTg0LCAweDA1ODUsIDB4MDU4NiwgMHgwNTU3LAorICAgICAgICAgICAgMHgwNTU4LCAweDA1NTksIDB4MDU1QSwgMHgwNTVCLCAweDA1NUMsIDB4MDU1RCwgMHgwNTVFLCAweDA1NUYsCisgICAgLyogNiAqLyAweDA1NjAsIDB4MDU2MSwgMHgwNTYyLCAweDA1NjMsIDB4MDU2NCwgMHgwNTY1LCAweDA1NjYsIDB4MDU2NywKKyAgICAgICAgICAgIDB4MDU2OCwgMHgwNTY5LCAweDA1NkEsIDB4MDU2QiwgMHgwNTZDLCAweDA1NkQsIDB4MDU2RSwgMHgwNTZGLAorICAgIC8qIDcgKi8gMHgwNTcwLCAweDA1NzEsIDB4MDU3MiwgMHgwNTczLCAweDA1NzQsIDB4MDU3NSwgMHgwNTc2LCAweDA1NzcsCisgICAgICAgICAgICAweDA1NzgsIDB4MDU3OSwgMHgwNTdBLCAweDA1N0IsIDB4MDU3QywgMHgwNTdELCAweDA1N0UsIDB4MDU3RiwKKyAgICAvKiA4ICovIDB4MDU4MCwgMHgwNTgxLCAweDA1ODIsIDB4MDU4MywgMHgwNTg0LCAweDA1ODUsIDB4MDU4NiwgMHgwNTg3LAorICAgICAgICAgICAgMHgwNTg4LCAweDA1ODksIDB4MDU4QSwgMHgwNThCLCAweDA1OEMsIDB4MDU4RCwgMHgwNThFLCAweDA1OEYsCisgICAgLyogOSAqLyAweDA1OTAsIDB4MDU5MSwgMHgwNTkyLCAweDA1OTMsIDB4MDU5NCwgMHgwNTk1LCAweDA1OTYsIDB4MDU5NywKKyAgICAgICAgICAgIDB4MDU5OCwgMHgwNTk5LCAweDA1OUEsIDB4MDU5QiwgMHgwNTlDLCAweDA1OUQsIDB4MDU5RSwgMHgwNTlGLAorICAgIC8qIEEgKi8gMHgwNUEwLCAweDA1QTEsIDB4MDVBMiwgMHgwNUEzLCAweDA1QTQsIDB4MDVBNSwgMHgwNUE2LCAweDA1QTcsCisgICAgICAgICAgICAweDA1QTgsIDB4MDVBOSwgMHgwNUFBLCAweDA1QUIsIDB4MDVBQywgMHgwNUFELCAweDA1QUUsIDB4MDVBRiwKKyAgICAvKiBCICovIDB4MDVCMCwgMHgwNUIxLCAweDA1QjIsIDB4MDVCMywgMHgwNUI0LCAweDA1QjUsIDB4MDVCNiwgMHgwNUI3LAorICAgICAgICAgICAgMHgwNUI4LCAweDA1QjksIDB4MDVCQSwgMHgwNUJCLCAweDA1QkMsIDB4MDVCRCwgMHgwNUJFLCAweDA1QkYsCisgICAgLyogQyAqLyAweDA1QzAsIDB4MDVDMSwgMHgwNUMyLCAweDA1QzMsIDB4MDVDNCwgMHgwNUM1LCAweDA1QzYsIDB4MDVDNywKKyAgICAgICAgICAgIDB4MDVDOCwgMHgwNUM5LCAweDA1Q0EsIDB4MDVDQiwgMHgwNUNDLCAweDA1Q0QsIDB4MDVDRSwgMHgwNUNGLAorICAgIC8qIEQgKi8gMHgwNUQwLCAweDA1RDEsIDB4MDVEMiwgMHgwNUQzLCAweDA1RDQsIDB4MDVENSwgMHgwNUQ2LCAweDA1RDcsCisgICAgICAgICAgICAweDA1RDgsIDB4MDVEOSwgMHgwNURBLCAweDA1REIsIDB4MDVEQywgMHgwNURELCAweDA1REUsIDB4MDVERiwKKyAgICAvKiBFICovIDB4MDVFMCwgMHgwNUUxLCAweDA1RTIsIDB4MDVFMywgMHgwNUU0LCAweDA1RTUsIDB4MDVFNiwgMHgwNUU3LAorICAgICAgICAgICAgMHgwNUU4LCAweDA1RTksIDB4MDVFQSwgMHgwNUVCLCAweDA1RUMsIDB4MDVFRCwgMHgwNUVFLCAweDA1RUYsCisgICAgLyogRiAqLyAweDA1RjAsIDB4MDVGMSwgMHgwNUYyLCAweDA1RjMsIDB4MDVGNCwgMHgwNUY1LCAweDA1RjYsIDB4MDVGNywKKyAgICAgICAgICAgIDB4MDVGOCwgMHgwNUY5LCAweDA1RkEsIDB4MDVGQiwgMHgwNUZDLCAweDA1RkQsIDB4MDVGRSwgMHgwNUZGLAorCisgICAgLy8gVGFibGUgNiAoZm9yIGhpZ2ggYnl0ZSAweDEwKQorCisgICAgLyogMCAqLyAweDEwMDAsIDB4MTAwMSwgMHgxMDAyLCAweDEwMDMsIDB4MTAwNCwgMHgxMDA1LCAweDEwMDYsIDB4MTAwNywKKyAgICAgICAgICAgIDB4MTAwOCwgMHgxMDA5LCAweDEwMEEsIDB4MTAwQiwgMHgxMDBDLCAweDEwMEQsIDB4MTAwRSwgMHgxMDBGLAorICAgIC8qIDEgKi8gMHgxMDEwLCAweDEwMTEsIDB4MTAxMiwgMHgxMDEzLCAweDEwMTQsIDB4MTAxNSwgMHgxMDE2LCAweDEwMTcsCisgICAgICAgICAgICAweDEwMTgsIDB4MTAxOSwgMHgxMDFBLCAweDEwMUIsIDB4MTAxQywgMHgxMDFELCAweDEwMUUsIDB4MTAxRiwKKyAgICAvKiAyICovIDB4MTAyMCwgMHgxMDIxLCAweDEwMjIsIDB4MTAyMywgMHgxMDI0LCAweDEwMjUsIDB4MTAyNiwgMHgxMDI3LAorICAgICAgICAgICAgMHgxMDI4LCAweDEwMjksIDB4MTAyQSwgMHgxMDJCLCAweDEwMkMsIDB4MTAyRCwgMHgxMDJFLCAweDEwMkYsCisgICAgLyogMyAqLyAweDEwMzAsIDB4MTAzMSwgMHgxMDMyLCAweDEwMzMsIDB4MTAzNCwgMHgxMDM1LCAweDEwMzYsIDB4MTAzNywKKyAgICAgICAgICAgIDB4MTAzOCwgMHgxMDM5LCAweDEwM0EsIDB4MTAzQiwgMHgxMDNDLCAweDEwM0QsIDB4MTAzRSwgMHgxMDNGLAorICAgIC8qIDQgKi8gMHgxMDQwLCAweDEwNDEsIDB4MTA0MiwgMHgxMDQzLCAweDEwNDQsIDB4MTA0NSwgMHgxMDQ2LCAweDEwNDcsCisgICAgICAgICAgICAweDEwNDgsIDB4MTA0OSwgMHgxMDRBLCAweDEwNEIsIDB4MTA0QywgMHgxMDRELCAweDEwNEUsIDB4MTA0RiwKKyAgICAvKiA1ICovIDB4MTA1MCwgMHgxMDUxLCAweDEwNTIsIDB4MTA1MywgMHgxMDU0LCAweDEwNTUsIDB4MTA1NiwgMHgxMDU3LAorICAgICAgICAgICAgMHgxMDU4LCAweDEwNTksIDB4MTA1QSwgMHgxMDVCLCAweDEwNUMsIDB4MTA1RCwgMHgxMDVFLCAweDEwNUYsCisgICAgLyogNiAqLyAweDEwNjAsIDB4MTA2MSwgMHgxMDYyLCAweDEwNjMsIDB4MTA2NCwgMHgxMDY1LCAweDEwNjYsIDB4MTA2NywKKyAgICAgICAgICAgIDB4MTA2OCwgMHgxMDY5LCAweDEwNkEsIDB4MTA2QiwgMHgxMDZDLCAweDEwNkQsIDB4MTA2RSwgMHgxMDZGLAorICAgIC8qIDcgKi8gMHgxMDcwLCAweDEwNzEsIDB4MTA3MiwgMHgxMDczLCAweDEwNzQsIDB4MTA3NSwgMHgxMDc2LCAweDEwNzcsCisgICAgICAgICAgICAweDEwNzgsIDB4MTA3OSwgMHgxMDdBLCAweDEwN0IsIDB4MTA3QywgMHgxMDdELCAweDEwN0UsIDB4MTA3RiwKKyAgICAvKiA4ICovIDB4MTA4MCwgMHgxMDgxLCAweDEwODIsIDB4MTA4MywgMHgxMDg0LCAweDEwODUsIDB4MTA4NiwgMHgxMDg3LAorICAgICAgICAgICAgMHgxMDg4LCAweDEwODksIDB4MTA4QSwgMHgxMDhCLCAweDEwOEMsIDB4MTA4RCwgMHgxMDhFLCAweDEwOEYsCisgICAgLyogOSAqLyAweDEwOTAsIDB4MTA5MSwgMHgxMDkyLCAweDEwOTMsIDB4MTA5NCwgMHgxMDk1LCAweDEwOTYsIDB4MTA5NywKKyAgICAgICAgICAgIDB4MTA5OCwgMHgxMDk5LCAweDEwOUEsIDB4MTA5QiwgMHgxMDlDLCAweDEwOUQsIDB4MTA5RSwgMHgxMDlGLAorICAgIC8qIEEgKi8gMHgxMEQwLCAweDEwRDEsIDB4MTBEMiwgMHgxMEQzLCAweDEwRDQsIDB4MTBENSwgMHgxMEQ2LCAweDEwRDcsCisgICAgICAgICAgICAweDEwRDgsIDB4MTBEOSwgMHgxMERBLCAweDEwREIsIDB4MTBEQywgMHgxMERELCAweDEwREUsIDB4MTBERiwKKyAgICAvKiBCICovIDB4MTBFMCwgMHgxMEUxLCAweDEwRTIsIDB4MTBFMywgMHgxMEU0LCAweDEwRTUsIDB4MTBFNiwgMHgxMEU3LAorICAgICAgICAgICAgMHgxMEU4LCAweDEwRTksIDB4MTBFQSwgMHgxMEVCLCAweDEwRUMsIDB4MTBFRCwgMHgxMEVFLCAweDEwRUYsCisgICAgLyogQyAqLyAweDEwRjAsIDB4MTBGMSwgMHgxMEYyLCAweDEwRjMsIDB4MTBGNCwgMHgxMEY1LCAweDEwQzYsIDB4MTBDNywKKyAgICAgICAgICAgIDB4MTBDOCwgMHgxMEM5LCAweDEwQ0EsIDB4MTBDQiwgMHgxMENDLCAweDEwQ0QsIDB4MTBDRSwgMHgxMENGLAorICAgIC8qIEQgKi8gMHgxMEQwLCAweDEwRDEsIDB4MTBEMiwgMHgxMEQzLCAweDEwRDQsIDB4MTBENSwgMHgxMEQ2LCAweDEwRDcsCisgICAgICAgICAgICAweDEwRDgsIDB4MTBEOSwgMHgxMERBLCAweDEwREIsIDB4MTBEQywgMHgxMERELCAweDEwREUsIDB4MTBERiwKKyAgICAvKiBFICovIDB4MTBFMCwgMHgxMEUxLCAweDEwRTIsIDB4MTBFMywgMHgxMEU0LCAweDEwRTUsIDB4MTBFNiwgMHgxMEU3LAorICAgICAgICAgICAgMHgxMEU4LCAweDEwRTksIDB4MTBFQSwgMHgxMEVCLCAweDEwRUMsIDB4MTBFRCwgMHgxMEVFLCAweDEwRUYsCisgICAgLyogRiAqLyAweDEwRjAsIDB4MTBGMSwgMHgxMEYyLCAweDEwRjMsIDB4MTBGNCwgMHgxMEY1LCAweDEwRjYsIDB4MTBGNywKKyAgICAgICAgICAgIDB4MTBGOCwgMHgxMEY5LCAweDEwRkEsIDB4MTBGQiwgMHgxMEZDLCAweDEwRkQsIDB4MTBGRSwgMHgxMEZGLAorCisgICAgLy8gVGFibGUgNyAoZm9yIGhpZ2ggYnl0ZSAweDIwKQorCisgICAgLyogMCAqLyAweDIwMDAsIDB4MjAwMSwgMHgyMDAyLCAweDIwMDMsIDB4MjAwNCwgMHgyMDA1LCAweDIwMDYsIDB4MjAwNywKKyAgICAgICAgICAgIDB4MjAwOCwgMHgyMDA5LCAweDIwMEEsIDB4MjAwQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIC8qIDEgKi8gMHgyMDEwLCAweDIwMTEsIDB4MjAxMiwgMHgyMDEzLCAweDIwMTQsIDB4MjAxNSwgMHgyMDE2LCAweDIwMTcsCisgICAgICAgICAgICAweDIwMTgsIDB4MjAxOSwgMHgyMDFBLCAweDIwMUIsIDB4MjAxQywgMHgyMDFELCAweDIwMUUsIDB4MjAxRiwKKyAgICAvKiAyICovIDB4MjAyMCwgMHgyMDIxLCAweDIwMjIsIDB4MjAyMywgMHgyMDI0LCAweDIwMjUsIDB4MjAyNiwgMHgyMDI3LAorICAgICAgICAgICAgMHgyMDI4LCAweDIwMjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwMkYsCisgICAgLyogMyAqLyAweDIwMzAsIDB4MjAzMSwgMHgyMDMyLCAweDIwMzMsIDB4MjAzNCwgMHgyMDM1LCAweDIwMzYsIDB4MjAzNywKKyAgICAgICAgICAgIDB4MjAzOCwgMHgyMDM5LCAweDIwM0EsIDB4MjAzQiwgMHgyMDNDLCAweDIwM0QsIDB4MjAzRSwgMHgyMDNGLAorICAgIC8qIDQgKi8gMHgyMDQwLCAweDIwNDEsIDB4MjA0MiwgMHgyMDQzLCAweDIwNDQsIDB4MjA0NSwgMHgyMDQ2LCAweDIwNDcsCisgICAgICAgICAgICAweDIwNDgsIDB4MjA0OSwgMHgyMDRBLCAweDIwNEIsIDB4MjA0QywgMHgyMDRELCAweDIwNEUsIDB4MjA0RiwKKyAgICAvKiA1ICovIDB4MjA1MCwgMHgyMDUxLCAweDIwNTIsIDB4MjA1MywgMHgyMDU0LCAweDIwNTUsIDB4MjA1NiwgMHgyMDU3LAorICAgICAgICAgICAgMHgyMDU4LCAweDIwNTksIDB4MjA1QSwgMHgyMDVCLCAweDIwNUMsIDB4MjA1RCwgMHgyMDVFLCAweDIwNUYsCisgICAgLyogNiAqLyAweDIwNjAsIDB4MjA2MSwgMHgyMDYyLCAweDIwNjMsIDB4MjA2NCwgMHgyMDY1LCAweDIwNjYsIDB4MjA2NywKKyAgICAgICAgICAgIDB4MjA2OCwgMHgyMDY5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIC8qIDcgKi8gMHgyMDcwLCAweDIwNzEsIDB4MjA3MiwgMHgyMDczLCAweDIwNzQsIDB4MjA3NSwgMHgyMDc2LCAweDIwNzcsCisgICAgICAgICAgICAweDIwNzgsIDB4MjA3OSwgMHgyMDdBLCAweDIwN0IsIDB4MjA3QywgMHgyMDdELCAweDIwN0UsIDB4MjA3RiwKKyAgICAvKiA4ICovIDB4MjA4MCwgMHgyMDgxLCAweDIwODIsIDB4MjA4MywgMHgyMDg0LCAweDIwODUsIDB4MjA4NiwgMHgyMDg3LAorICAgICAgICAgICAgMHgyMDg4LCAweDIwODksIDB4MjA4QSwgMHgyMDhCLCAweDIwOEMsIDB4MjA4RCwgMHgyMDhFLCAweDIwOEYsCisgICAgLyogOSAqLyAweDIwOTAsIDB4MjA5MSwgMHgyMDkyLCAweDIwOTMsIDB4MjA5NCwgMHgyMDk1LCAweDIwOTYsIDB4MjA5NywKKyAgICAgICAgICAgIDB4MjA5OCwgMHgyMDk5LCAweDIwOUEsIDB4MjA5QiwgMHgyMDlDLCAweDIwOUQsIDB4MjA5RSwgMHgyMDlGLAorICAgIC8qIEEgKi8gMHgyMEEwLCAweDIwQTEsIDB4MjBBMiwgMHgyMEEzLCAweDIwQTQsIDB4MjBBNSwgMHgyMEE2LCAweDIwQTcsCisgICAgICAgICAgICAweDIwQTgsIDB4MjBBOSwgMHgyMEFBLCAweDIwQUIsIDB4MjBBQywgMHgyMEFELCAweDIwQUUsIDB4MjBBRiwKKyAgICAvKiBCICovIDB4MjBCMCwgMHgyMEIxLCAweDIwQjIsIDB4MjBCMywgMHgyMEI0LCAweDIwQjUsIDB4MjBCNiwgMHgyMEI3LAorICAgICAgICAgICAgMHgyMEI4LCAweDIwQjksIDB4MjBCQSwgMHgyMEJCLCAweDIwQkMsIDB4MjBCRCwgMHgyMEJFLCAweDIwQkYsCisgICAgLyogQyAqLyAweDIwQzAsIDB4MjBDMSwgMHgyMEMyLCAweDIwQzMsIDB4MjBDNCwgMHgyMEM1LCAweDIwQzYsIDB4MjBDNywKKyAgICAgICAgICAgIDB4MjBDOCwgMHgyMEM5LCAweDIwQ0EsIDB4MjBDQiwgMHgyMENDLCAweDIwQ0QsIDB4MjBDRSwgMHgyMENGLAorICAgIC8qIEQgKi8gMHgyMEQwLCAweDIwRDEsIDB4MjBEMiwgMHgyMEQzLCAweDIwRDQsIDB4MjBENSwgMHgyMEQ2LCAweDIwRDcsCisgICAgICAgICAgICAweDIwRDgsIDB4MjBEOSwgMHgyMERBLCAweDIwREIsIDB4MjBEQywgMHgyMERELCAweDIwREUsIDB4MjBERiwKKyAgICAvKiBFICovIDB4MjBFMCwgMHgyMEUxLCAweDIwRTIsIDB4MjBFMywgMHgyMEU0LCAweDIwRTUsIDB4MjBFNiwgMHgyMEU3LAorICAgICAgICAgICAgMHgyMEU4LCAweDIwRTksIDB4MjBFQSwgMHgyMEVCLCAweDIwRUMsIDB4MjBFRCwgMHgyMEVFLCAweDIwRUYsCisgICAgLyogRiAqLyAweDIwRjAsIDB4MjBGMSwgMHgyMEYyLCAweDIwRjMsIDB4MjBGNCwgMHgyMEY1LCAweDIwRjYsIDB4MjBGNywKKyAgICAgICAgICAgIDB4MjBGOCwgMHgyMEY5LCAweDIwRkEsIDB4MjBGQiwgMHgyMEZDLCAweDIwRkQsIDB4MjBGRSwgMHgyMEZGLAorCisgICAgLy8gVGFibGUgOCAoZm9yIGhpZ2ggYnl0ZSAweDIxKQorCisgICAgLyogMCAqLyAweDIxMDAsIDB4MjEwMSwgMHgyMTAyLCAweDIxMDMsIDB4MjEwNCwgMHgyMTA1LCAweDIxMDYsIDB4MjEwNywKKyAgICAgICAgICAgIDB4MjEwOCwgMHgyMTA5LCAweDIxMEEsIDB4MjEwQiwgMHgyMTBDLCAweDIxMEQsIDB4MjEwRSwgMHgyMTBGLAorICAgIC8qIDEgKi8gMHgyMTEwLCAweDIxMTEsIDB4MjExMiwgMHgyMTEzLCAweDIxMTQsIDB4MjExNSwgMHgyMTE2LCAweDIxMTcsCisgICAgICAgICAgICAweDIxMTgsIDB4MjExOSwgMHgyMTFBLCAweDIxMUIsIDB4MjExQywgMHgyMTFELCAweDIxMUUsIDB4MjExRiwKKyAgICAvKiAyICovIDB4MjEyMCwgMHgyMTIxLCAweDIxMjIsIDB4MjEyMywgMHgyMTI0LCAweDIxMjUsIDB4MjEyNiwgMHgyMTI3LAorICAgICAgICAgICAgMHgyMTI4LCAweDIxMjksIDB4MjEyQSwgMHgyMTJCLCAweDIxMkMsIDB4MjEyRCwgMHgyMTJFLCAweDIxMkYsCisgICAgLyogMyAqLyAweDIxMzAsIDB4MjEzMSwgMHgyMTMyLCAweDIxMzMsIDB4MjEzNCwgMHgyMTM1LCAweDIxMzYsIDB4MjEzNywKKyAgICAgICAgICAgIDB4MjEzOCwgMHgyMTM5LCAweDIxM0EsIDB4MjEzQiwgMHgyMTNDLCAweDIxM0QsIDB4MjEzRSwgMHgyMTNGLAorICAgIC8qIDQgKi8gMHgyMTQwLCAweDIxNDEsIDB4MjE0MiwgMHgyMTQzLCAweDIxNDQsIDB4MjE0NSwgMHgyMTQ2LCAweDIxNDcsCisgICAgICAgICAgICAweDIxNDgsIDB4MjE0OSwgMHgyMTRBLCAweDIxNEIsIDB4MjE0QywgMHgyMTRELCAweDIxNEUsIDB4MjE0RiwKKyAgICAvKiA1ICovIDB4MjE1MCwgMHgyMTUxLCAweDIxNTIsIDB4MjE1MywgMHgyMTU0LCAweDIxNTUsIDB4MjE1NiwgMHgyMTU3LAorICAgICAgICAgICAgMHgyMTU4LCAweDIxNTksIDB4MjE1QSwgMHgyMTVCLCAweDIxNUMsIDB4MjE1RCwgMHgyMTVFLCAweDIxNUYsCisgICAgLyogNiAqLyAweDIxNzAsIDB4MjE3MSwgMHgyMTcyLCAweDIxNzMsIDB4MjE3NCwgMHgyMTc1LCAweDIxNzYsIDB4MjE3NywKKyAgICAgICAgICAgIDB4MjE3OCwgMHgyMTc5LCAweDIxN0EsIDB4MjE3QiwgMHgyMTdDLCAweDIxN0QsIDB4MjE3RSwgMHgyMTdGLAorICAgIC8qIDcgKi8gMHgyMTcwLCAweDIxNzEsIDB4MjE3MiwgMHgyMTczLCAweDIxNzQsIDB4MjE3NSwgMHgyMTc2LCAweDIxNzcsCisgICAgICAgICAgICAweDIxNzgsIDB4MjE3OSwgMHgyMTdBLCAweDIxN0IsIDB4MjE3QywgMHgyMTdELCAweDIxN0UsIDB4MjE3RiwKKyAgICAvKiA4ICovIDB4MjE4MCwgMHgyMTgxLCAweDIxODIsIDB4MjE4MywgMHgyMTg0LCAweDIxODUsIDB4MjE4NiwgMHgyMTg3LAorICAgICAgICAgICAgMHgyMTg4LCAweDIxODksIDB4MjE4QSwgMHgyMThCLCAweDIxOEMsIDB4MjE4RCwgMHgyMThFLCAweDIxOEYsCisgICAgLyogOSAqLyAweDIxOTAsIDB4MjE5MSwgMHgyMTkyLCAweDIxOTMsIDB4MjE5NCwgMHgyMTk1LCAweDIxOTYsIDB4MjE5NywKKyAgICAgICAgICAgIDB4MjE5OCwgMHgyMTk5LCAweDIxOUEsIDB4MjE5QiwgMHgyMTlDLCAweDIxOUQsIDB4MjE5RSwgMHgyMTlGLAorICAgIC8qIEEgKi8gMHgyMUEwLCAweDIxQTEsIDB4MjFBMiwgMHgyMUEzLCAweDIxQTQsIDB4MjFBNSwgMHgyMUE2LCAweDIxQTcsCisgICAgICAgICAgICAweDIxQTgsIDB4MjFBOSwgMHgyMUFBLCAweDIxQUIsIDB4MjFBQywgMHgyMUFELCAweDIxQUUsIDB4MjFBRiwKKyAgICAvKiBCICovIDB4MjFCMCwgMHgyMUIxLCAweDIxQjIsIDB4MjFCMywgMHgyMUI0LCAweDIxQjUsIDB4MjFCNiwgMHgyMUI3LAorICAgICAgICAgICAgMHgyMUI4LCAweDIxQjksIDB4MjFCQSwgMHgyMUJCLCAweDIxQkMsIDB4MjFCRCwgMHgyMUJFLCAweDIxQkYsCisgICAgLyogQyAqLyAweDIxQzAsIDB4MjFDMSwgMHgyMUMyLCAweDIxQzMsIDB4MjFDNCwgMHgyMUM1LCAweDIxQzYsIDB4MjFDNywKKyAgICAgICAgICAgIDB4MjFDOCwgMHgyMUM5LCAweDIxQ0EsIDB4MjFDQiwgMHgyMUNDLCAweDIxQ0QsIDB4MjFDRSwgMHgyMUNGLAorICAgIC8qIEQgKi8gMHgyMUQwLCAweDIxRDEsIDB4MjFEMiwgMHgyMUQzLCAweDIxRDQsIDB4MjFENSwgMHgyMUQ2LCAweDIxRDcsCisgICAgICAgICAgICAweDIxRDgsIDB4MjFEOSwgMHgyMURBLCAweDIxREIsIDB4MjFEQywgMHgyMURELCAweDIxREUsIDB4MjFERiwKKyAgICAvKiBFICovIDB4MjFFMCwgMHgyMUUxLCAweDIxRTIsIDB4MjFFMywgMHgyMUU0LCAweDIxRTUsIDB4MjFFNiwgMHgyMUU3LAorICAgICAgICAgICAgMHgyMUU4LCAweDIxRTksIDB4MjFFQSwgMHgyMUVCLCAweDIxRUMsIDB4MjFFRCwgMHgyMUVFLCAweDIxRUYsCisgICAgLyogRiAqLyAweDIxRjAsIDB4MjFGMSwgMHgyMUYyLCAweDIxRjMsIDB4MjFGNCwgMHgyMUY1LCAweDIxRjYsIDB4MjFGNywKKyAgICAgICAgICAgIDB4MjFGOCwgMHgyMUY5LCAweDIxRkEsIDB4MjFGQiwgMHgyMUZDLCAweDIxRkQsIDB4MjFGRSwgMHgyMUZGLAorCisgICAgLy8gVGFibGUgOSAoZm9yIGhpZ2ggYnl0ZSAweEZFKQorCisgICAgLyogMCAqLyAweEZFMDAsIDB4RkUwMSwgMHhGRTAyLCAweEZFMDMsIDB4RkUwNCwgMHhGRTA1LCAweEZFMDYsIDB4RkUwNywKKyAgICAgICAgICAgIDB4RkUwOCwgMHhGRTA5LCAweEZFMEEsIDB4RkUwQiwgMHhGRTBDLCAweEZFMEQsIDB4RkUwRSwgMHhGRTBGLAorICAgIC8qIDEgKi8gMHhGRTEwLCAweEZFMTEsIDB4RkUxMiwgMHhGRTEzLCAweEZFMTQsIDB4RkUxNSwgMHhGRTE2LCAweEZFMTcsCisgICAgICAgICAgICAweEZFMTgsIDB4RkUxOSwgMHhGRTFBLCAweEZFMUIsIDB4RkUxQywgMHhGRTFELCAweEZFMUUsIDB4RkUxRiwKKyAgICAvKiAyICovIDB4RkUyMCwgMHhGRTIxLCAweEZFMjIsIDB4RkUyMywgMHhGRTI0LCAweEZFMjUsIDB4RkUyNiwgMHhGRTI3LAorICAgICAgICAgICAgMHhGRTI4LCAweEZFMjksIDB4RkUyQSwgMHhGRTJCLCAweEZFMkMsIDB4RkUyRCwgMHhGRTJFLCAweEZFMkYsCisgICAgLyogMyAqLyAweEZFMzAsIDB4RkUzMSwgMHhGRTMyLCAweEZFMzMsIDB4RkUzNCwgMHhGRTM1LCAweEZFMzYsIDB4RkUzNywKKyAgICAgICAgICAgIDB4RkUzOCwgMHhGRTM5LCAweEZFM0EsIDB4RkUzQiwgMHhGRTNDLCAweEZFM0QsIDB4RkUzRSwgMHhGRTNGLAorICAgIC8qIDQgKi8gMHhGRTQwLCAweEZFNDEsIDB4RkU0MiwgMHhGRTQzLCAweEZFNDQsIDB4RkU0NSwgMHhGRTQ2LCAweEZFNDcsCisgICAgICAgICAgICAweEZFNDgsIDB4RkU0OSwgMHhGRTRBLCAweEZFNEIsIDB4RkU0QywgMHhGRTRELCAweEZFNEUsIDB4RkU0RiwKKyAgICAvKiA1ICovIDB4RkU1MCwgMHhGRTUxLCAweEZFNTIsIDB4RkU1MywgMHhGRTU0LCAweEZFNTUsIDB4RkU1NiwgMHhGRTU3LAorICAgICAgICAgICAgMHhGRTU4LCAweEZFNTksIDB4RkU1QSwgMHhGRTVCLCAweEZFNUMsIDB4RkU1RCwgMHhGRTVFLCAweEZFNUYsCisgICAgLyogNiAqLyAweEZFNjAsIDB4RkU2MSwgMHhGRTYyLCAweEZFNjMsIDB4RkU2NCwgMHhGRTY1LCAweEZFNjYsIDB4RkU2NywKKyAgICAgICAgICAgIDB4RkU2OCwgMHhGRTY5LCAweEZFNkEsIDB4RkU2QiwgMHhGRTZDLCAweEZFNkQsIDB4RkU2RSwgMHhGRTZGLAorICAgIC8qIDcgKi8gMHhGRTcwLCAweEZFNzEsIDB4RkU3MiwgMHhGRTczLCAweEZFNzQsIDB4RkU3NSwgMHhGRTc2LCAweEZFNzcsCisgICAgICAgICAgICAweEZFNzgsIDB4RkU3OSwgMHhGRTdBLCAweEZFN0IsIDB4RkU3QywgMHhGRTdELCAweEZFN0UsIDB4RkU3RiwKKyAgICAvKiA4ICovIDB4RkU4MCwgMHhGRTgxLCAweEZFODIsIDB4RkU4MywgMHhGRTg0LCAweEZFODUsIDB4RkU4NiwgMHhGRTg3LAorICAgICAgICAgICAgMHhGRTg4LCAweEZFODksIDB4RkU4QSwgMHhGRThCLCAweEZFOEMsIDB4RkU4RCwgMHhGRThFLCAweEZFOEYsCisgICAgLyogOSAqLyAweEZFOTAsIDB4RkU5MSwgMHhGRTkyLCAweEZFOTMsIDB4RkU5NCwgMHhGRTk1LCAweEZFOTYsIDB4RkU5NywKKyAgICAgICAgICAgIDB4RkU5OCwgMHhGRTk5LCAweEZFOUEsIDB4RkU5QiwgMHhGRTlDLCAweEZFOUQsIDB4RkU5RSwgMHhGRTlGLAorICAgIC8qIEEgKi8gMHhGRUEwLCAweEZFQTEsIDB4RkVBMiwgMHhGRUEzLCAweEZFQTQsIDB4RkVBNSwgMHhGRUE2LCAweEZFQTcsCisgICAgICAgICAgICAweEZFQTgsIDB4RkVBOSwgMHhGRUFBLCAweEZFQUIsIDB4RkVBQywgMHhGRUFELCAweEZFQUUsIDB4RkVBRiwKKyAgICAvKiBCICovIDB4RkVCMCwgMHhGRUIxLCAweEZFQjIsIDB4RkVCMywgMHhGRUI0LCAweEZFQjUsIDB4RkVCNiwgMHhGRUI3LAorICAgICAgICAgICAgMHhGRUI4LCAweEZFQjksIDB4RkVCQSwgMHhGRUJCLCAweEZFQkMsIDB4RkVCRCwgMHhGRUJFLCAweEZFQkYsCisgICAgLyogQyAqLyAweEZFQzAsIDB4RkVDMSwgMHhGRUMyLCAweEZFQzMsIDB4RkVDNCwgMHhGRUM1LCAweEZFQzYsIDB4RkVDNywKKyAgICAgICAgICAgIDB4RkVDOCwgMHhGRUM5LCAweEZFQ0EsIDB4RkVDQiwgMHhGRUNDLCAweEZFQ0QsIDB4RkVDRSwgMHhGRUNGLAorICAgIC8qIEQgKi8gMHhGRUQwLCAweEZFRDEsIDB4RkVEMiwgMHhGRUQzLCAweEZFRDQsIDB4RkVENSwgMHhGRUQ2LCAweEZFRDcsCisgICAgICAgICAgICAweEZFRDgsIDB4RkVEOSwgMHhGRURBLCAweEZFREIsIDB4RkVEQywgMHhGRURELCAweEZFREUsIDB4RkVERiwKKyAgICAvKiBFICovIDB4RkVFMCwgMHhGRUUxLCAweEZFRTIsIDB4RkVFMywgMHhGRUU0LCAweEZFRTUsIDB4RkVFNiwgMHhGRUU3LAorICAgICAgICAgICAgMHhGRUU4LCAweEZFRTksIDB4RkVFQSwgMHhGRUVCLCAweEZFRUMsIDB4RkVFRCwgMHhGRUVFLCAweEZFRUYsCisgICAgLyogRiAqLyAweEZFRjAsIDB4RkVGMSwgMHhGRUYyLCAweEZFRjMsIDB4RkVGNCwgMHhGRUY1LCAweEZFRjYsIDB4RkVGNywKKyAgICAgICAgICAgIDB4RkVGOCwgMHhGRUY5LCAweEZFRkEsIDB4RkVGQiwgMHhGRUZDLCAweEZFRkQsIDB4RkVGRSwgMHgwMDAwLAorCisgICAgLy8gVGFibGUgMTAgKGZvciBoaWdoIGJ5dGUgMHhGRikKKworICAgIC8qIDAgKi8gMHhGRjAwLCAweEZGMDEsIDB4RkYwMiwgMHhGRjAzLCAweEZGMDQsIDB4RkYwNSwgMHhGRjA2LCAweEZGMDcsCisgICAgICAgICAgICAweEZGMDgsIDB4RkYwOSwgMHhGRjBBLCAweEZGMEIsIDB4RkYwQywgMHhGRjBELCAweEZGMEUsIDB4RkYwRiwKKyAgICAvKiAxICovIDB4RkYxMCwgMHhGRjExLCAweEZGMTIsIDB4RkYxMywgMHhGRjE0LCAweEZGMTUsIDB4RkYxNiwgMHhGRjE3LAorICAgICAgICAgICAgMHhGRjE4LCAweEZGMTksIDB4RkYxQSwgMHhGRjFCLCAweEZGMUMsIDB4RkYxRCwgMHhGRjFFLCAweEZGMUYsCisgICAgLyogMiAqLyAweEZGMjAsIDB4RkY0MSwgMHhGRjQyLCAweEZGNDMsIDB4RkY0NCwgMHhGRjQ1LCAweEZGNDYsIDB4RkY0NywKKyAgICAgICAgICAgIDB4RkY0OCwgMHhGRjQ5LCAweEZGNEEsIDB4RkY0QiwgMHhGRjRDLCAweEZGNEQsIDB4RkY0RSwgMHhGRjRGLAorICAgIC8qIDMgKi8gMHhGRjUwLCAweEZGNTEsIDB4RkY1MiwgMHhGRjUzLCAweEZGNTQsIDB4RkY1NSwgMHhGRjU2LCAweEZGNTcsCisgICAgICAgICAgICAweEZGNTgsIDB4RkY1OSwgMHhGRjVBLCAweEZGM0IsIDB4RkYzQywgMHhGRjNELCAweEZGM0UsIDB4RkYzRiwKKyAgICAvKiA0ICovIDB4RkY0MCwgMHhGRjQxLCAweEZGNDIsIDB4RkY0MywgMHhGRjQ0LCAweEZGNDUsIDB4RkY0NiwgMHhGRjQ3LAorICAgICAgICAgICAgMHhGRjQ4LCAweEZGNDksIDB4RkY0QSwgMHhGRjRCLCAweEZGNEMsIDB4RkY0RCwgMHhGRjRFLCAweEZGNEYsCisgICAgLyogNSAqLyAweEZGNTAsIDB4RkY1MSwgMHhGRjUyLCAweEZGNTMsIDB4RkY1NCwgMHhGRjU1LCAweEZGNTYsIDB4RkY1NywKKyAgICAgICAgICAgIDB4RkY1OCwgMHhGRjU5LCAweEZGNUEsIDB4RkY1QiwgMHhGRjVDLCAweEZGNUQsIDB4RkY1RSwgMHhGRjVGLAorICAgIC8qIDYgKi8gMHhGRjYwLCAweEZGNjEsIDB4RkY2MiwgMHhGRjYzLCAweEZGNjQsIDB4RkY2NSwgMHhGRjY2LCAweEZGNjcsCisgICAgICAgICAgICAweEZGNjgsIDB4RkY2OSwgMHhGRjZBLCAweEZGNkIsIDB4RkY2QywgMHhGRjZELCAweEZGNkUsIDB4RkY2RiwKKyAgICAvKiA3ICovIDB4RkY3MCwgMHhGRjcxLCAweEZGNzIsIDB4RkY3MywgMHhGRjc0LCAweEZGNzUsIDB4RkY3NiwgMHhGRjc3LAorICAgICAgICAgICAgMHhGRjc4LCAweEZGNzksIDB4RkY3QSwgMHhGRjdCLCAweEZGN0MsIDB4RkY3RCwgMHhGRjdFLCAweEZGN0YsCisgICAgLyogOCAqLyAweEZGODAsIDB4RkY4MSwgMHhGRjgyLCAweEZGODMsIDB4RkY4NCwgMHhGRjg1LCAweEZGODYsIDB4RkY4NywKKyAgICAgICAgICAgIDB4RkY4OCwgMHhGRjg5LCAweEZGOEEsIDB4RkY4QiwgMHhGRjhDLCAweEZGOEQsIDB4RkY4RSwgMHhGRjhGLAorICAgIC8qIDkgKi8gMHhGRjkwLCAweEZGOTEsIDB4RkY5MiwgMHhGRjkzLCAweEZGOTQsIDB4RkY5NSwgMHhGRjk2LCAweEZGOTcsCisgICAgICAgICAgICAweEZGOTgsIDB4RkY5OSwgMHhGRjlBLCAweEZGOUIsIDB4RkY5QywgMHhGRjlELCAweEZGOUUsIDB4RkY5RiwKKyAgICAvKiBBICovIDB4RkZBMCwgMHhGRkExLCAweEZGQTIsIDB4RkZBMywgMHhGRkE0LCAweEZGQTUsIDB4RkZBNiwgMHhGRkE3LAorICAgICAgICAgICAgMHhGRkE4LCAweEZGQTksIDB4RkZBQSwgMHhGRkFCLCAweEZGQUMsIDB4RkZBRCwgMHhGRkFFLCAweEZGQUYsCisgICAgLyogQiAqLyAweEZGQjAsIDB4RkZCMSwgMHhGRkIyLCAweEZGQjMsIDB4RkZCNCwgMHhGRkI1LCAweEZGQjYsIDB4RkZCNywKKyAgICAgICAgICAgIDB4RkZCOCwgMHhGRkI5LCAweEZGQkEsIDB4RkZCQiwgMHhGRkJDLCAweEZGQkQsIDB4RkZCRSwgMHhGRkJGLAorICAgIC8qIEMgKi8gMHhGRkMwLCAweEZGQzEsIDB4RkZDMiwgMHhGRkMzLCAweEZGQzQsIDB4RkZDNSwgMHhGRkM2LCAweEZGQzcsCisgICAgICAgICAgICAweEZGQzgsIDB4RkZDOSwgMHhGRkNBLCAweEZGQ0IsIDB4RkZDQywgMHhGRkNELCAweEZGQ0UsIDB4RkZDRiwKKyAgICAvKiBEICovIDB4RkZEMCwgMHhGRkQxLCAweEZGRDIsIDB4RkZEMywgMHhGRkQ0LCAweEZGRDUsIDB4RkZENiwgMHhGRkQ3LAorICAgICAgICAgICAgMHhGRkQ4LCAweEZGRDksIDB4RkZEQSwgMHhGRkRCLCAweEZGREMsIDB4RkZERCwgMHhGRkRFLCAweEZGREYsCisgICAgLyogRSAqLyAweEZGRTAsIDB4RkZFMSwgMHhGRkUyLCAweEZGRTMsIDB4RkZFNCwgMHhGRkU1LCAweEZGRTYsIDB4RkZFNywKKyAgICAgICAgICAgIDB4RkZFOCwgMHhGRkU5LCAweEZGRUEsIDB4RkZFQiwgMHhGRkVDLCAweEZGRUQsIDB4RkZFRSwgMHhGRkVGLAorICAgIC8qIEYgKi8gMHhGRkYwLCAweEZGRjEsIDB4RkZGMiwgMHhGRkYzLCAweEZGRjQsIDB4RkZGNSwgMHhGRkY2LCAweEZGRjcsCisgICAgICAgICAgICAweEZGRjgsIDB4RkZGOSwgMHhGRkZBLCAweEZGRkIsIDB4RkZGQywgMHhGRkZELCAweEZGRkUsIDB4RkZGRiwKK307CisKK3UxNiBoZnNwbHVzX2RlY29tcG9zZV90YWJsZVtdID0geworCS8qIGJhc2UgdGFibGUgKi8KKwkweDAwMTAsIDB4MDRjMCwgMHgwMDAwLCAweDA2ZjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweDAwMDAsIDB4MDdiMCwKKwkvKiBjaGFyIHRhYmxlIDB4MF9fXyAqLworCTB4MDAyMCwgMHgwMDcwLCAweDAxNjAsIDB4MDE5MCwgMHgwMjMwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMmQwLCAweDAzNDAsIDB4MDM2MCwgMHgwM2IwLCAweDAzZTAsIDB4MDQwMCwgMHgwNDMwLAorCS8qIGNoYXIgdGFibGUgMHgwMF9fICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMzAsIDB4MDA0MCwgMHgwMDUwLCAweDAwNjAsCisJLyogY2hhciB2YWx1ZXMgMHgwMGNfICovCisJMHgyMDQyLCAweDIwNGEsIDB4MjA1MiwgMHgyMDVhLCAweDIwNjIsIDB4MjA2YSwgMHgwMDAwLCAweDIwNzIsCisJMHgyMDdhLCAweDIwODIsIDB4MjA4YSwgMHgyMDkyLCAweDIwOWEsIDB4MjBhMiwgMHgyMGFhLCAweDIwYjIsCisJLyogY2hhciB2YWx1ZXMgMHgwMGRfICovCisJMHgwMDAwLCAweDIwYmEsIDB4MjBjMiwgMHgyMGNhLCAweDIwZDIsIDB4MjBkYSwgMHgyMGUyLCAweDAwMDAsCisJMHgwMDAwLCAweDIwZWEsIDB4MjBmMiwgMHgyMGZhLCAweDIxMDIsIDB4MjEwYSwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwMGVfICovCisJMHgyMTEyLCAweDIxMWEsIDB4MjEyMiwgMHgyMTJhLCAweDIxMzIsIDB4MjEzYSwgMHgwMDAwLCAweDIxNDIsCisJMHgyMTRhLCAweDIxNTIsIDB4MjE1YSwgMHgyMTYyLCAweDIxNmEsIDB4MjE3MiwgMHgyMTdhLCAweDIxODIsCisJLyogY2hhciB2YWx1ZXMgMHgwMGZfICovCisJMHgwMDAwLCAweDIxOGEsIDB4MjE5MiwgMHgyMTlhLCAweDIxYTIsIDB4MjFhYSwgMHgyMWIyLCAweDAwMDAsCisJMHgwMDAwLCAweDIxYmEsIDB4MjFjMiwgMHgyMWNhLCAweDIxZDIsIDB4MjFkYSwgMHgwMDAwLCAweDIxZTIsCisJLyogY2hhciB0YWJsZSAweDAxX18gKi8KKwkweDAwODAsIDB4MDA5MCwgMHgwMGEwLCAweDAwYjAsIDB4MDBjMCwgMHgwMGQwLCAweDAwZTAsIDB4MDBmMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMTAwLCAweDAxMTAsIDB4MDEyMCwgMHgwMTMwLCAweDAxNDAsIDB4MDE1MCwKKwkvKiBjaGFyIHZhbHVlcyAweDAxMF8gKi8KKwkweDIxZWEsIDB4MjFmMiwgMHgyMWZhLCAweDIyMDIsIDB4MjIwYSwgMHgyMjEyLCAweDIyMWEsIDB4MjIyMiwKKwkweDIyMmEsIDB4MjIzMiwgMHgyMjNhLCAweDIyNDIsIDB4MjI0YSwgMHgyMjUyLCAweDIyNWEsIDB4MjI2MiwKKwkvKiBjaGFyIHZhbHVlcyAweDAxMV8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgyMjZhLCAweDIyNzIsIDB4MjI3YSwgMHgyMjgyLCAweDIyOGEsIDB4MjI5MiwKKwkweDIyOWEsIDB4MjJhMiwgMHgyMmFhLCAweDIyYjIsIDB4MjJiYSwgMHgyMmMyLCAweDIyY2EsIDB4MjJkMiwKKwkvKiBjaGFyIHZhbHVlcyAweDAxMl8gKi8KKwkweDIyZGEsIDB4MjJlMiwgMHgyMmVhLCAweDIyZjIsIDB4MjJmYSwgMHgyMzAyLCAweDAwMDAsIDB4MDAwMCwKKwkweDIzMGEsIDB4MjMxMiwgMHgyMzFhLCAweDIzMjIsIDB4MjMyYSwgMHgyMzMyLCAweDIzM2EsIDB4MjM0MiwKKwkvKiBjaGFyIHZhbHVlcyAweDAxM18gKi8KKwkweDIzNGEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjM1MiwgMHgyMzVhLCAweDIzNjIsIDB4MjM2YSwKKwkweDAwMDAsIDB4MjM3MiwgMHgyMzdhLCAweDIzODIsIDB4MjM4YSwgMHgyMzkyLCAweDIzOWEsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDAxNF8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIzYTIsIDB4MjNhYSwgMHgyM2IyLCAweDIzYmEsIDB4MjNjMiwKKwkweDIzY2EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjNkMiwgMHgyM2RhLCAweDIzZTIsIDB4MjNlYSwKKwkvKiBjaGFyIHZhbHVlcyAweDAxNV8gKi8KKwkweDIzZjIsIDB4MjNmYSwgMHgwMDAwLCAweDAwMDAsIDB4MjQwMiwgMHgyNDBhLCAweDI0MTIsIDB4MjQxYSwKKwkweDI0MjIsIDB4MjQyYSwgMHgyNDMyLCAweDI0M2EsIDB4MjQ0MiwgMHgyNDRhLCAweDI0NTIsIDB4MjQ1YSwKKwkvKiBjaGFyIHZhbHVlcyAweDAxNl8gKi8KKwkweDI0NjIsIDB4MjQ2YSwgMHgyNDcyLCAweDI0N2EsIDB4MjQ4MiwgMHgyNDhhLCAweDAwMDAsIDB4MDAwMCwKKwkweDI0OTIsIDB4MjQ5YSwgMHgyNGEyLCAweDI0YWEsIDB4MjRiMiwgMHgyNGJhLCAweDI0YzIsIDB4MjRjYSwKKwkvKiBjaGFyIHZhbHVlcyAweDAxN18gKi8KKwkweDI0ZDIsIDB4MjRkYSwgMHgyNGUyLCAweDI0ZWEsIDB4MjRmMiwgMHgyNGZhLCAweDI1MDIsIDB4MjUwYSwKKwkweDI1MTIsIDB4MjUxYSwgMHgyNTIyLCAweDI1MmEsIDB4MjUzMiwgMHgyNTNhLCAweDI1NDIsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDAxYV8gKi8KKwkweDI1NGEsIDB4MjU1MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjU1YSwKKwkvKiBjaGFyIHZhbHVlcyAweDAxYl8gKi8KKwkweDI1NjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDAxY18gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyNTZhLCAweDI1NzIsIDB4MjU3YSwKKwkvKiBjaGFyIHZhbHVlcyAweDAxZF8gKi8KKwkweDI1ODIsIDB4MjU4YSwgMHgyNTkyLCAweDI1OWEsIDB4MjVhMiwgMHgyNWFiLCAweDI1YjcsIDB4MjVjMywKKwkweDI1Y2YsIDB4MjVkYiwgMHgyNWU3LCAweDI1ZjMsIDB4MjVmZiwgMHgwMDAwLCAweDI2MGIsIDB4MjYxNywKKwkvKiBjaGFyIHZhbHVlcyAweDAxZV8gKi8KKwkweDI2MjMsIDB4MjYyZiwgMHgyNjNhLCAweDI2NDIsIDB4MDAwMCwgMHgwMDAwLCAweDI2NGEsIDB4MjY1MiwKKwkweDI2NWEsIDB4MjY2MiwgMHgyNjZhLCAweDI2NzIsIDB4MjY3YiwgMHgyNjg3LCAweDI2OTIsIDB4MjY5YSwKKwkvKiBjaGFyIHZhbHVlcyAweDAxZl8gKi8KKwkweDI2YTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjZhYSwgMHgyNmIyLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgyNmJiLCAweDI2YzcsIDB4MjZkMiwgMHgyNmRhLCAweDI2ZTIsIDB4MjZlYSwKKwkvKiBjaGFyIHRhYmxlIDB4MDJfXyAqLworCTB4MDE3MCwgMHgwMTgwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MDIwXyAqLworCTB4MjZmMiwgMHgyNmZhLCAweDI3MDIsIDB4MjcwYSwgMHgyNzEyLCAweDI3MWEsIDB4MjcyMiwgMHgyNzJhLAorCTB4MjczMiwgMHgyNzNhLCAweDI3NDIsIDB4Mjc0YSwgMHgyNzUyLCAweDI3NWEsIDB4Mjc2MiwgMHgyNzZhLAorCS8qIGNoYXIgdmFsdWVzIDB4MDIxXyAqLworCTB4Mjc3MiwgMHgyNzdhLCAweDI3ODIsIDB4Mjc4YSwgMHgyNzkyLCAweDI3OWEsIDB4MjdhMiwgMHgyN2FhLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdGFibGUgMHgwM19fICovCisJMHgwMDAwLCAweDAxYTAsIDB4MDAwMCwgMHgwMDAwLCAweDAxYjAsIDB4MDAwMCwgMHgwMDAwLCAweDAxYzAsCisJMHgwMWQwLCAweDAxZTAsIDB4MDFmMCwgMHgwMjAwLCAweDAyMTAsIDB4MDIyMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwMzFfICovCisJMHgyN2IyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwMzRfICovCisJMHgyN2I5LCAweDI3YmQsIDB4MDAwMCwgMHgyN2MxLCAweDI3YzYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwMzdfICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDI3Y2QsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyN2QxLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwMzhfICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjdkNiwgMHgyN2RlLCAweDI3ZTUsCisJMHgyN2VhLCAweDI3ZjIsIDB4MjdmYSwgMHgwMDAwLCAweDI4MDIsIDB4MDAwMCwgMHgyODBhLCAweDI4MTIsCisJLyogY2hhciB2YWx1ZXMgMHgwMzlfICovCisJMHgyODFiLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwM2FfICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MjgyNiwgMHgyODJlLCAweDI4MzYsIDB4MjgzZSwgMHgyODQ2LCAweDI4NGUsCisJLyogY2hhciB2YWx1ZXMgMHgwM2JfICovCisJMHgyODU3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwM2NfICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4Mjg2MiwgMHgyODZhLCAweDI4NzIsIDB4Mjg3YSwgMHgyODgyLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwM2RfICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyODhhLCAweDI4OTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB0YWJsZSAweDA0X18gKi8KKwkweDAyNDAsIDB4MDI1MCwgMHgwMDAwLCAweDAyNjAsIDB4MDAwMCwgMHgwMjcwLCAweDAwMDAsIDB4MDI4MCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDI5MCwgMHgwMmEwLCAweDAyYjAsIDB4MDJjMCwKKwkvKiBjaGFyIHZhbHVlcyAweDA0MF8gKi8KKwkweDAwMDAsIDB4Mjg5YSwgMHgwMDAwLCAweDI4YTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjhhYSwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjhiMiwgMHgwMDAwLCAweDI4YmEsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDA0MV8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MjhjMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDA0M18gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MjhjYSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDA0NV8gKi8KKwkweDAwMDAsIDB4MjhkMiwgMHgwMDAwLCAweDI4ZGEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjhlMiwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjhlYSwgMHgwMDAwLCAweDI4ZjIsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDA0N18gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDI4ZmEsIDB4MjkwMiwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDA0Y18gKi8KKwkweDAwMDAsIDB4MjkwYSwgMHgyOTEyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDA0ZF8gKi8KKwkweDI5MWEsIDB4MjkyMiwgMHgyOTJhLCAweDI5MzIsIDB4MjkzOSwgMHgyOTNkLCAweDI5NDIsIDB4Mjk0YSwKKwkweDI5NTEsIDB4Mjk1NSwgMHgyOTVhLCAweDI5NjIsIDB4Mjk2YSwgMHgyOTcyLCAweDI5N2EsIDB4Mjk4MiwKKwkvKiBjaGFyIHZhbHVlcyAweDA0ZV8gKi8KKwkweDI5ODksIDB4Mjk4ZCwgMHgyOTkyLCAweDI5OWEsIDB4MjlhMiwgMHgyOWFhLCAweDI5YjIsIDB4MjliYSwKKwkweDI5YzEsIDB4MjljNSwgMHgyOWNhLCAweDI5ZDIsIDB4MDAwMCwgMHgwMDAwLCAweDI5ZGEsIDB4MjllMiwKKwkvKiBjaGFyIHZhbHVlcyAweDA0Zl8gKi8KKwkweDI5ZWEsIDB4MjlmMiwgMHgyOWZhLCAweDJhMDIsIDB4MmEwYSwgMHgyYTEyLCAweDAwMDAsIDB4MDAwMCwKKwkweDJhMWEsIDB4MmEyMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHRhYmxlIDB4MDlfXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAyZTAsIDB4MDJmMCwgMHgwMDAwLCAweDAzMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDMxMCwgMHgwMzIwLCAweDAzMzAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MDkyXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgyYTJhLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MDkzXyAqLworCTB4MDAwMCwgMHgyYTMyLCAweDAwMDAsIDB4MDAwMCwgMHgyYTNhLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MDk1XyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MmE0MiwgMHgyYTRhLCAweDJhNTIsIDB4MmE1YSwgMHgyYTYyLCAweDJhNmEsIDB4MmE3MiwgMHgyYTdhLAorCS8qIGNoYXIgdmFsdWVzIDB4MDliXyAqLworCTB4MmE4MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MDljXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MmE4YSwgMHgyYTkyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MDlkXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyYTlhLCAweDJhYTIsIDB4MDAwMCwgMHgyYWFhLAorCS8qIGNoYXIgdGFibGUgMHgwYV9fICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDM1MCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwYTVfICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDJhYjIsIDB4MmFiYSwgMHgyYWMyLCAweDJhY2EsIDB4MDAwMCwgMHgyYWQyLCAweDAwMDAsCisJLyogY2hhciB0YWJsZSAweDBiX18gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDM3MCwgMHgwMzgwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDM5MCwgMHgwMDAwLCAweDAwMDAsIDB4MDNhMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDBiNF8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDJhZGEsIDB4MDAwMCwgMHgwMDAwLCAweDJhZTIsIDB4MmFlYSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDBiNV8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MmFmMiwgMHgyYWZhLCAweDAwMDAsIDB4MmIwMiwKKwkvKiBjaGFyIHZhbHVlcyAweDBiOV8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MmIwYSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDBiY18gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgyYjEyLCAweDJiMWEsIDB4MmIyMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHRhYmxlIDB4MGNfXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwM2MwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwM2QwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGM0XyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MmIyYSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGNjXyAqLworCTB4MmIzMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyYjNhLAorCTB4MmI0MiwgMHgwMDAwLCAweDJiNGEsIDB4MmI1MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdGFibGUgMHgwZF9fICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAzZjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwZDRfICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MmI1ZSwgMHgyYjY2LCAweDJiNmUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB0YWJsZSAweDBlX18gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDA0MTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDA0MjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDBlM18gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDJiNzYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDBlYl8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDJiN2UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHRhYmxlIDB4MGZfXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwNDQwLCAweDA0NTAsIDB4MDQ2MCwgMHgwNDcwLAorCTB4MDQ4MCwgMHgwNDkwLCAweDA0YTAsIDB4MDRiMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGY0XyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MmI4NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDJiOGUsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGY1XyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDJiOTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyYjllLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyYmE2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGY2XyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgyYmFlLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGY3XyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MmJiNiwgMHgwMDAwLCAweDJiYmUsIDB4MmJjNiwgMHgyYmNmLAorCTB4MmJkYSwgMHgyYmUzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGY4XyAqLworCTB4MDAwMCwgMHgyYmVlLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGY5XyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MmJmNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDJiZmUsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGZhXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDJjMDYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyYzBlLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyYzE2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGZiXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgyYzFlLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdGFibGUgMHgxX19fICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwNGQwLCAweDA1ZTAsCisJLyogY2hhciB0YWJsZSAweDFlX18gKi8KKwkweDA0ZTAsIDB4MDRmMCwgMHgwNTAwLCAweDA1MTAsIDB4MDUyMCwgMHgwNTMwLCAweDA1NDAsIDB4MDU1MCwKKwkweDA1NjAsIDB4MDU3MCwgMHgwNTgwLCAweDA1OTAsIDB4MDVhMCwgMHgwNWIwLCAweDA1YzAsIDB4MDVkMCwKKwkvKiBjaGFyIHZhbHVlcyAweDFlMF8gKi8KKwkweDJjMjYsIDB4MmMyZSwgMHgyYzM2LCAweDJjM2UsIDB4MmM0NiwgMHgyYzRlLCAweDJjNTYsIDB4MmM1ZSwKKwkweDJjNjcsIDB4MmM3MywgMHgyYzdlLCAweDJjODYsIDB4MmM4ZSwgMHgyYzk2LCAweDJjOWUsIDB4MmNhNiwKKwkvKiBjaGFyIHZhbHVlcyAweDFlMV8gKi8KKwkweDJjYWUsIDB4MmNiNiwgMHgyY2JlLCAweDJjYzYsIDB4MmNjZiwgMHgyY2RiLCAweDJjZTcsIDB4MmNmMywKKwkweDJjZmUsIDB4MmQwNiwgMHgyZDBlLCAweDJkMTYsIDB4MmQxZiwgMHgyZDJiLCAweDJkMzYsIDB4MmQzZSwKKwkvKiBjaGFyIHZhbHVlcyAweDFlMl8gKi8KKwkweDJkNDYsIDB4MmQ0ZSwgMHgyZDU2LCAweDJkNWUsIDB4MmQ2NiwgMHgyZDZlLCAweDJkNzYsIDB4MmQ3ZSwKKwkweDJkODYsIDB4MmQ4ZSwgMHgyZDk2LCAweDJkOWUsIDB4MmRhNiwgMHgyZGFlLCAweDJkYjcsIDB4MmRjMywKKwkvKiBjaGFyIHZhbHVlcyAweDFlM18gKi8KKwkweDJkY2UsIDB4MmRkNiwgMHgyZGRlLCAweDJkZTYsIDB4MmRlZSwgMHgyZGY2LCAweDJkZmUsIDB4MmUwNiwKKwkweDJlMGYsIDB4MmUxYiwgMHgyZTI2LCAweDJlMmUsIDB4MmUzNiwgMHgyZTNlLCAweDJlNDYsIDB4MmU0ZSwKKwkvKiBjaGFyIHZhbHVlcyAweDFlNF8gKi8KKwkweDJlNTYsIDB4MmU1ZSwgMHgyZTY2LCAweDJlNmUsIDB4MmU3NiwgMHgyZTdlLCAweDJlODYsIDB4MmU4ZSwKKwkweDJlOTYsIDB4MmU5ZSwgMHgyZWE2LCAweDJlYWUsIDB4MmViNywgMHgyZWMzLCAweDJlY2YsIDB4MmVkYiwKKwkvKiBjaGFyIHZhbHVlcyAweDFlNV8gKi8KKwkweDJlZTcsIDB4MmVmMywgMHgyZWZmLCAweDJmMGIsIDB4MmYxNiwgMHgyZjFlLCAweDJmMjYsIDB4MmYyZSwKKwkweDJmMzYsIDB4MmYzZSwgMHgyZjQ2LCAweDJmNGUsIDB4MmY1NywgMHgyZjYzLCAweDJmNmUsIDB4MmY3NiwKKwkvKiBjaGFyIHZhbHVlcyAweDFlNl8gKi8KKwkweDJmN2UsIDB4MmY4NiwgMHgyZjhlLCAweDJmOTYsIDB4MmY5ZiwgMHgyZmFiLCAweDJmYjcsIDB4MmZjMywKKwkweDJmY2YsIDB4MmZkYiwgMHgyZmU2LCAweDJmZWUsIDB4MmZmNiwgMHgyZmZlLCAweDMwMDYsIDB4MzAwZSwKKwkvKiBjaGFyIHZhbHVlcyAweDFlN18gKi8KKwkweDMwMTYsIDB4MzAxZSwgMHgzMDI2LCAweDMwMmUsIDB4MzAzNiwgMHgzMDNlLCAweDMwNDYsIDB4MzA0ZSwKKwkweDMwNTcsIDB4MzA2MywgMHgzMDZmLCAweDMwN2IsIDB4MzA4NiwgMHgzMDhlLCAweDMwOTYsIDB4MzA5ZSwKKwkvKiBjaGFyIHZhbHVlcyAweDFlOF8gKi8KKwkweDMwYTYsIDB4MzBhZSwgMHgzMGI2LCAweDMwYmUsIDB4MzBjNiwgMHgzMGNlLCAweDMwZDYsIDB4MzBkZSwKKwkweDMwZTYsIDB4MzBlZSwgMHgzMGY2LCAweDMwZmUsIDB4MzEwNiwgMHgzMTBlLCAweDMxMTYsIDB4MzExZSwKKwkvKiBjaGFyIHZhbHVlcyAweDFlOV8gKi8KKwkweDMxMjYsIDB4MzEyZSwgMHgzMTM2LCAweDMxM2UsIDB4MzE0NiwgMHgzMTRlLCAweDMxNTYsIDB4MzE1ZSwKKwkweDMxNjYsIDB4MzE2ZSwgMHgwMDAwLCAweDMxNzYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDFlYV8gKi8KKwkweDMxN2UsIDB4MzE4NiwgMHgzMThlLCAweDMxOTYsIDB4MzE5ZiwgMHgzMWFiLCAweDMxYjcsIDB4MzFjMywKKwkweDMxY2YsIDB4MzFkYiwgMHgzMWU3LCAweDMxZjMsIDB4MzFmZiwgMHgzMjBiLCAweDMyMTcsIDB4MzIyMywKKwkvKiBjaGFyIHZhbHVlcyAweDFlYl8gKi8KKwkweDMyMmYsIDB4MzIzYiwgMHgzMjQ3LCAweDMyNTMsIDB4MzI1ZiwgMHgzMjZiLCAweDMyNzcsIDB4MzI4MywKKwkweDMyOGUsIDB4MzI5NiwgMHgzMjllLCAweDMyYTYsIDB4MzJhZSwgMHgzMmI2LCAweDMyYmYsIDB4MzJjYiwKKwkvKiBjaGFyIHZhbHVlcyAweDFlY18gKi8KKwkweDMyZDcsIDB4MzJlMywgMHgzMmVmLCAweDMyZmIsIDB4MzMwNywgMHgzMzEzLCAweDMzMWYsIDB4MzMyYiwKKwkweDMzMzYsIDB4MzMzZSwgMHgzMzQ2LCAweDMzNGUsIDB4MzM1NiwgMHgzMzVlLCAweDMzNjYsIDB4MzM2ZSwKKwkvKiBjaGFyIHZhbHVlcyAweDFlZF8gKi8KKwkweDMzNzcsIDB4MzM4MywgMHgzMzhmLCAweDMzOWIsIDB4MzNhNywgMHgzM2IzLCAweDMzYmYsIDB4MzNjYiwKKwkweDMzZDcsIDB4MzNlMywgMHgzM2VmLCAweDMzZmIsIDB4MzQwNywgMHgzNDEzLCAweDM0MWYsIDB4MzQyYiwKKwkvKiBjaGFyIHZhbHVlcyAweDFlZV8gKi8KKwkweDM0MzcsIDB4MzQ0MywgMHgzNDRmLCAweDM0NWIsIDB4MzQ2NiwgMHgzNDZlLCAweDM0NzYsIDB4MzQ3ZSwKKwkweDM0ODcsIDB4MzQ5MywgMHgzNDlmLCAweDM0YWIsIDB4MzRiNywgMHgzNGMzLCAweDM0Y2YsIDB4MzRkYiwKKwkvKiBjaGFyIHZhbHVlcyAweDFlZl8gKi8KKwkweDM0ZTcsIDB4MzRmMywgMHgzNGZlLCAweDM1MDYsIDB4MzUwZSwgMHgzNTE2LCAweDM1MWUsIDB4MzUyNiwKKwkweDM1MmUsIDB4MzUzNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHRhYmxlIDB4MWZfXyAqLworCTB4MDVmMCwgMHgwNjAwLCAweDA2MTAsIDB4MDYyMCwgMHgwNjMwLCAweDA2NDAsIDB4MDY1MCwgMHgwNjYwLAorCTB4MDY3MCwgMHgwNjgwLCAweDA2OTAsIDB4MDZhMCwgMHgwNmIwLCAweDA2YzAsIDB4MDZkMCwgMHgwNmUwLAorCS8qIGNoYXIgdmFsdWVzIDB4MWYwXyAqLworCTB4MzUzZSwgMHgzNTQ2LCAweDM1NGYsIDB4MzU1YiwgMHgzNTY3LCAweDM1NzMsIDB4MzU3ZiwgMHgzNThiLAorCTB4MzU5NiwgMHgzNTllLCAweDM1YTcsIDB4MzViMywgMHgzNWJmLCAweDM1Y2IsIDB4MzVkNywgMHgzNWUzLAorCS8qIGNoYXIgdmFsdWVzIDB4MWYxXyAqLworCTB4MzVlZSwgMHgzNWY2LCAweDM1ZmYsIDB4MzYwYiwgMHgzNjE3LCAweDM2MjMsIDB4MDAwMCwgMHgwMDAwLAorCTB4MzYyZSwgMHgzNjM2LCAweDM2M2YsIDB4MzY0YiwgMHgzNjU3LCAweDM2NjMsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MWYyXyAqLworCTB4MzY2ZSwgMHgzNjc2LCAweDM2N2YsIDB4MzY4YiwgMHgzNjk3LCAweDM2YTMsIDB4MzZhZiwgMHgzNmJiLAorCTB4MzZjNiwgMHgzNmNlLCAweDM2ZDcsIDB4MzZlMywgMHgzNmVmLCAweDM2ZmIsIDB4MzcwNywgMHgzNzEzLAorCS8qIGNoYXIgdmFsdWVzIDB4MWYzXyAqLworCTB4MzcxZSwgMHgzNzI2LCAweDM3MmYsIDB4MzczYiwgMHgzNzQ3LCAweDM3NTMsIDB4Mzc1ZiwgMHgzNzZiLAorCTB4Mzc3NiwgMHgzNzdlLCAweDM3ODcsIDB4Mzc5MywgMHgzNzlmLCAweDM3YWIsIDB4MzdiNywgMHgzN2MzLAorCS8qIGNoYXIgdmFsdWVzIDB4MWY0XyAqLworCTB4MzdjZSwgMHgzN2Q2LCAweDM3ZGYsIDB4MzdlYiwgMHgzN2Y3LCAweDM4MDMsIDB4MDAwMCwgMHgwMDAwLAorCTB4MzgwZSwgMHgzODE2LCAweDM4MWYsIDB4MzgyYiwgMHgzODM3LCAweDM4NDMsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MWY1XyAqLworCTB4Mzg0ZSwgMHgzODU2LCAweDM4NWYsIDB4Mzg2YiwgMHgzODc3LCAweDM4ODMsIDB4Mzg4ZiwgMHgzODliLAorCTB4MDAwMCwgMHgzOGE2LCAweDAwMDAsIDB4MzhhZiwgMHgwMDAwLCAweDM4YmIsIDB4MDAwMCwgMHgzOGM3LAorCS8qIGNoYXIgdmFsdWVzIDB4MWY2XyAqLworCTB4MzhkMiwgMHgzOGRhLCAweDM4ZTMsIDB4MzhlZiwgMHgzOGZiLCAweDM5MDcsIDB4MzkxMywgMHgzOTFmLAorCTB4MzkyYSwgMHgzOTMyLCAweDM5M2IsIDB4Mzk0NywgMHgzOTUzLCAweDM5NWYsIDB4Mzk2YiwgMHgzOTc3LAorCS8qIGNoYXIgdmFsdWVzIDB4MWY3XyAqLworCTB4Mzk4MiwgMHgzOThhLCAweDM5OTIsIDB4Mzk5YSwgMHgzOWEyLCAweDM5YWEsIDB4MzliMiwgMHgzOWJhLAorCTB4MzljMiwgMHgzOWNhLCAweDM5ZDIsIDB4MzlkYSwgMHgzOWUyLCAweDM5ZWEsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MWY4XyAqLworCTB4MzlmMywgMHgzOWZmLCAweDNhMGMsIDB4M2ExYywgMHgzYTJjLCAweDNhM2MsIDB4M2E0YywgMHgzYTVjLAorCTB4M2E2YiwgMHgzYTc3LCAweDNhODQsIDB4M2E5NCwgMHgzYWE0LCAweDNhYjQsIDB4M2FjNCwgMHgzYWQ0LAorCS8qIGNoYXIgdmFsdWVzIDB4MWY5XyAqLworCTB4M2FlMywgMHgzYWVmLCAweDNhZmMsIDB4M2IwYywgMHgzYjFjLCAweDNiMmMsIDB4M2IzYywgMHgzYjRjLAorCTB4M2I1YiwgMHgzYjY3LCAweDNiNzQsIDB4M2I4NCwgMHgzYjk0LCAweDNiYTQsIDB4M2JiNCwgMHgzYmM0LAorCS8qIGNoYXIgdmFsdWVzIDB4MWZhXyAqLworCTB4M2JkMywgMHgzYmRmLCAweDNiZWMsIDB4M2JmYywgMHgzYzBjLCAweDNjMWMsIDB4M2MyYywgMHgzYzNjLAorCTB4M2M0YiwgMHgzYzU3LCAweDNjNjQsIDB4M2M3NCwgMHgzYzg0LCAweDNjOTQsIDB4M2NhNCwgMHgzY2I0LAorCS8qIGNoYXIgdmFsdWVzIDB4MWZiXyAqLworCTB4M2NjMiwgMHgzY2NhLCAweDNjZDMsIDB4M2NkZSwgMHgzY2U3LCAweDAwMDAsIDB4M2NmMiwgMHgzY2ZiLAorCTB4M2QwNiwgMHgzZDBlLCAweDNkMTYsIDB4M2QxZSwgMHgzZDI2LCAweDAwMDAsIDB4M2QyZCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MWZjXyAqLworCTB4MDAwMCwgMHgzZDMyLCAweDNkM2IsIDB4M2Q0NiwgMHgzZDRmLCAweDAwMDAsIDB4M2Q1YSwgMHgzZDYzLAorCTB4M2Q2ZSwgMHgzZDc2LCAweDNkN2UsIDB4M2Q4NiwgMHgzZDhlLCAweDNkOTYsIDB4M2Q5ZSwgMHgzZGE2LAorCS8qIGNoYXIgdmFsdWVzIDB4MWZkXyAqLworCTB4M2RhZSwgMHgzZGI2LCAweDNkYmYsIDB4M2RjYiwgMHgwMDAwLCAweDAwMDAsIDB4M2RkNiwgMHgzZGRmLAorCTB4M2RlYSwgMHgzZGYyLCAweDNkZmEsIDB4M2UwMiwgMHgwMDAwLCAweDNlMGEsIDB4M2UxMiwgMHgzZTFhLAorCS8qIGNoYXIgdmFsdWVzIDB4MWZlXyAqLworCTB4M2UyMiwgMHgzZTJhLCAweDNlMzMsIDB4M2UzZiwgMHgzZTRhLCAweDNlNTIsIDB4M2U1YSwgMHgzZTYzLAorCTB4M2U2ZSwgMHgzZTc2LCAweDNlN2UsIDB4M2U4NiwgMHgzZThlLCAweDNlOTYsIDB4M2U5ZSwgMHgzZWE1LAorCS8qIGNoYXIgdmFsdWVzIDB4MWZmXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDNlYWIsIDB4M2ViNiwgMHgzZWJmLCAweDAwMDAsIDB4M2VjYSwgMHgzZWQzLAorCTB4M2VkZSwgMHgzZWU2LCAweDNlZWUsIDB4M2VmNiwgMHgzZWZlLCAweDNmMDUsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdGFibGUgMHgzX19fICovCisJMHgwNzAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB0YWJsZSAweDMwX18gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDcxMCwgMHgwNzIwLCAweDA3MzAsIDB4MDc0MCwKKwkweDAwMDAsIDB4MDc1MCwgMHgwNzYwLCAweDA3NzAsIDB4MDc4MCwgMHgwNzkwLCAweDAwMDAsIDB4MDdhMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwNF8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M2YwYSwgMHgwMDAwLCAweDNmMTIsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwNV8gKi8KKwkweDNmMWEsIDB4MDAwMCwgMHgzZjIyLCAweDAwMDAsIDB4M2YyYSwgMHgwMDAwLCAweDNmMzIsIDB4MDAwMCwKKwkweDNmM2EsIDB4MDAwMCwgMHgzZjQyLCAweDAwMDAsIDB4M2Y0YSwgMHgwMDAwLCAweDNmNTIsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwNl8gKi8KKwkweDNmNWEsIDB4MDAwMCwgMHgzZjYyLCAweDAwMDAsIDB4MDAwMCwgMHgzZjZhLCAweDAwMDAsIDB4M2Y3MiwKKwkweDAwMDAsIDB4M2Y3YSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwN18gKi8KKwkweDNmODIsIDB4M2Y4YSwgMHgwMDAwLCAweDNmOTIsIDB4M2Y5YSwgMHgwMDAwLCAweDNmYTIsIDB4M2ZhYSwKKwkweDAwMDAsIDB4M2ZiMiwgMHgzZmJhLCAweDAwMDAsIDB4M2ZjMiwgMHgzZmNhLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwOV8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M2ZkMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNmZGEsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwYV8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M2ZlMiwgMHgwMDAwLCAweDNmZWEsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwYl8gKi8KKwkweDNmZjIsIDB4MDAwMCwgMHgzZmZhLCAweDAwMDAsIDB4NDAwMiwgMHgwMDAwLCAweDQwMGEsIDB4MDAwMCwKKwkweDQwMTIsIDB4MDAwMCwgMHg0MDFhLCAweDAwMDAsIDB4NDAyMiwgMHgwMDAwLCAweDQwMmEsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwY18gKi8KKwkweDQwMzIsIDB4MDAwMCwgMHg0MDNhLCAweDAwMDAsIDB4MDAwMCwgMHg0MDQyLCAweDAwMDAsIDB4NDA0YSwKKwkweDAwMDAsIDB4NDA1MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwZF8gKi8KKwkweDQwNWEsIDB4NDA2MiwgMHgwMDAwLCAweDQwNmEsIDB4NDA3MiwgMHgwMDAwLCAweDQwN2EsIDB4NDA4MiwKKwkweDAwMDAsIDB4NDA4YSwgMHg0MDkyLCAweDAwMDAsIDB4NDA5YSwgMHg0MGEyLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwZl8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NDBhYSwgMHgwMDAwLCAweDAwMDAsIDB4NDBiMiwKKwkweDQwYmEsIDB4NDBjMiwgMHg0MGNhLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDQwZDIsIDB4MDAwMCwKKwkvKiBjaGFyIHRhYmxlIDB4Zl9fXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDdjMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdGFibGUgMHhmYl9fICovCisJMHgwMDAwLCAweDA3ZDAsIDB4MDdlMCwgMHgwN2YwLCAweDA4MDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHhmYjFfICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDQwZGEsCisJLyogY2hhciB2YWx1ZXMgMHhmYjJfICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4NDBlMiwgMHg0MGVhLCAweDQwZjMsIDB4NDBmZiwgMHg0MTBhLCAweDQxMTIsCisJLyogY2hhciB2YWx1ZXMgMHhmYjNfICovCisJMHg0MTFhLCAweDQxMjIsIDB4NDEyYSwgMHg0MTMyLCAweDQxM2EsIDB4NDE0MiwgMHg0MTRhLCAweDAwMDAsCisJMHg0MTUyLCAweDQxNWEsIDB4NDE2MiwgMHg0MTZhLCAweDQxNzIsIDB4MDAwMCwgMHg0MTdhLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHhmYjRfICovCisJMHg0MTgyLCAweDQxOGEsIDB4MDAwMCwgMHg0MTkyLCAweDQxOWEsIDB4MDAwMCwgMHg0MWEyLCAweDQxYWEsCisJMHg0MWIyLCAweDQxYmEsIDB4NDFjMiwgMHg0MWNhLCAweDQxZDIsIDB4NDFkYSwgMHg0MWUyLCAweDAwMDAsCisJLyogZGVjb21wb3NlZCBjaGFyYWN0ZXJzICovCisJMHgwMDQxLCAweDAzMDAsIDB4MDA0MSwgMHgwMzAxLCAweDAwNDEsIDB4MDMwMiwgMHgwMDQxLCAweDAzMDMsCisJMHgwMDQxLCAweDAzMDgsIDB4MDA0MSwgMHgwMzBhLCAweDAwNDMsIDB4MDMyNywgMHgwMDQ1LCAweDAzMDAsCisJMHgwMDQ1LCAweDAzMDEsIDB4MDA0NSwgMHgwMzAyLCAweDAwNDUsIDB4MDMwOCwgMHgwMDQ5LCAweDAzMDAsCisJMHgwMDQ5LCAweDAzMDEsIDB4MDA0OSwgMHgwMzAyLCAweDAwNDksIDB4MDMwOCwgMHgwMDRlLCAweDAzMDMsCisJMHgwMDRmLCAweDAzMDAsIDB4MDA0ZiwgMHgwMzAxLCAweDAwNGYsIDB4MDMwMiwgMHgwMDRmLCAweDAzMDMsCisJMHgwMDRmLCAweDAzMDgsIDB4MDA1NSwgMHgwMzAwLCAweDAwNTUsIDB4MDMwMSwgMHgwMDU1LCAweDAzMDIsCisJMHgwMDU1LCAweDAzMDgsIDB4MDA1OSwgMHgwMzAxLCAweDAwNjEsIDB4MDMwMCwgMHgwMDYxLCAweDAzMDEsCisJMHgwMDYxLCAweDAzMDIsIDB4MDA2MSwgMHgwMzAzLCAweDAwNjEsIDB4MDMwOCwgMHgwMDYxLCAweDAzMGEsCisJMHgwMDYzLCAweDAzMjcsIDB4MDA2NSwgMHgwMzAwLCAweDAwNjUsIDB4MDMwMSwgMHgwMDY1LCAweDAzMDIsCisJMHgwMDY1LCAweDAzMDgsIDB4MDA2OSwgMHgwMzAwLCAweDAwNjksIDB4MDMwMSwgMHgwMDY5LCAweDAzMDIsCisJMHgwMDY5LCAweDAzMDgsIDB4MDA2ZSwgMHgwMzAzLCAweDAwNmYsIDB4MDMwMCwgMHgwMDZmLCAweDAzMDEsCisJMHgwMDZmLCAweDAzMDIsIDB4MDA2ZiwgMHgwMzAzLCAweDAwNmYsIDB4MDMwOCwgMHgwMDc1LCAweDAzMDAsCisJMHgwMDc1LCAweDAzMDEsIDB4MDA3NSwgMHgwMzAyLCAweDAwNzUsIDB4MDMwOCwgMHgwMDc5LCAweDAzMDEsCisJMHgwMDc5LCAweDAzMDgsIDB4MDA0MSwgMHgwMzA0LCAweDAwNjEsIDB4MDMwNCwgMHgwMDQxLCAweDAzMDYsCisJMHgwMDYxLCAweDAzMDYsIDB4MDA0MSwgMHgwMzI4LCAweDAwNjEsIDB4MDMyOCwgMHgwMDQzLCAweDAzMDEsCisJMHgwMDYzLCAweDAzMDEsIDB4MDA0MywgMHgwMzAyLCAweDAwNjMsIDB4MDMwMiwgMHgwMDQzLCAweDAzMDcsCisJMHgwMDYzLCAweDAzMDcsIDB4MDA0MywgMHgwMzBjLCAweDAwNjMsIDB4MDMwYywgMHgwMDQ0LCAweDAzMGMsCisJMHgwMDY0LCAweDAzMGMsIDB4MDA0NSwgMHgwMzA0LCAweDAwNjUsIDB4MDMwNCwgMHgwMDQ1LCAweDAzMDYsCisJMHgwMDY1LCAweDAzMDYsIDB4MDA0NSwgMHgwMzA3LCAweDAwNjUsIDB4MDMwNywgMHgwMDQ1LCAweDAzMjgsCisJMHgwMDY1LCAweDAzMjgsIDB4MDA0NSwgMHgwMzBjLCAweDAwNjUsIDB4MDMwYywgMHgwMDQ3LCAweDAzMDIsCisJMHgwMDY3LCAweDAzMDIsIDB4MDA0NywgMHgwMzA2LCAweDAwNjcsIDB4MDMwNiwgMHgwMDQ3LCAweDAzMDcsCisJMHgwMDY3LCAweDAzMDcsIDB4MDA0NywgMHgwMzI3LCAweDAwNjcsIDB4MDMyNywgMHgwMDQ4LCAweDAzMDIsCisJMHgwMDY4LCAweDAzMDIsIDB4MDA0OSwgMHgwMzAzLCAweDAwNjksIDB4MDMwMywgMHgwMDQ5LCAweDAzMDQsCisJMHgwMDY5LCAweDAzMDQsIDB4MDA0OSwgMHgwMzA2LCAweDAwNjksIDB4MDMwNiwgMHgwMDQ5LCAweDAzMjgsCisJMHgwMDY5LCAweDAzMjgsIDB4MDA0OSwgMHgwMzA3LCAweDAwNGEsIDB4MDMwMiwgMHgwMDZhLCAweDAzMDIsCisJMHgwMDRiLCAweDAzMjcsIDB4MDA2YiwgMHgwMzI3LCAweDAwNGMsIDB4MDMwMSwgMHgwMDZjLCAweDAzMDEsCisJMHgwMDRjLCAweDAzMjcsIDB4MDA2YywgMHgwMzI3LCAweDAwNGMsIDB4MDMwYywgMHgwMDZjLCAweDAzMGMsCisJMHgwMDRlLCAweDAzMDEsIDB4MDA2ZSwgMHgwMzAxLCAweDAwNGUsIDB4MDMyNywgMHgwMDZlLCAweDAzMjcsCisJMHgwMDRlLCAweDAzMGMsIDB4MDA2ZSwgMHgwMzBjLCAweDAwNGYsIDB4MDMwNCwgMHgwMDZmLCAweDAzMDQsCisJMHgwMDRmLCAweDAzMDYsIDB4MDA2ZiwgMHgwMzA2LCAweDAwNGYsIDB4MDMwYiwgMHgwMDZmLCAweDAzMGIsCisJMHgwMDUyLCAweDAzMDEsIDB4MDA3MiwgMHgwMzAxLCAweDAwNTIsIDB4MDMyNywgMHgwMDcyLCAweDAzMjcsCisJMHgwMDUyLCAweDAzMGMsIDB4MDA3MiwgMHgwMzBjLCAweDAwNTMsIDB4MDMwMSwgMHgwMDczLCAweDAzMDEsCisJMHgwMDUzLCAweDAzMDIsIDB4MDA3MywgMHgwMzAyLCAweDAwNTMsIDB4MDMyNywgMHgwMDczLCAweDAzMjcsCisJMHgwMDUzLCAweDAzMGMsIDB4MDA3MywgMHgwMzBjLCAweDAwNTQsIDB4MDMyNywgMHgwMDc0LCAweDAzMjcsCisJMHgwMDU0LCAweDAzMGMsIDB4MDA3NCwgMHgwMzBjLCAweDAwNTUsIDB4MDMwMywgMHgwMDc1LCAweDAzMDMsCisJMHgwMDU1LCAweDAzMDQsIDB4MDA3NSwgMHgwMzA0LCAweDAwNTUsIDB4MDMwNiwgMHgwMDc1LCAweDAzMDYsCisJMHgwMDU1LCAweDAzMGEsIDB4MDA3NSwgMHgwMzBhLCAweDAwNTUsIDB4MDMwYiwgMHgwMDc1LCAweDAzMGIsCisJMHgwMDU1LCAweDAzMjgsIDB4MDA3NSwgMHgwMzI4LCAweDAwNTcsIDB4MDMwMiwgMHgwMDc3LCAweDAzMDIsCisJMHgwMDU5LCAweDAzMDIsIDB4MDA3OSwgMHgwMzAyLCAweDAwNTksIDB4MDMwOCwgMHgwMDVhLCAweDAzMDEsCisJMHgwMDdhLCAweDAzMDEsIDB4MDA1YSwgMHgwMzA3LCAweDAwN2EsIDB4MDMwNywgMHgwMDVhLCAweDAzMGMsCisJMHgwMDdhLCAweDAzMGMsIDB4MDA0ZiwgMHgwMzFiLCAweDAwNmYsIDB4MDMxYiwgMHgwMDU1LCAweDAzMWIsCisJMHgwMDc1LCAweDAzMWIsIDB4MDA0MSwgMHgwMzBjLCAweDAwNjEsIDB4MDMwYywgMHgwMDQ5LCAweDAzMGMsCisJMHgwMDY5LCAweDAzMGMsIDB4MDA0ZiwgMHgwMzBjLCAweDAwNmYsIDB4MDMwYywgMHgwMDU1LCAweDAzMGMsCisJMHgwMDc1LCAweDAzMGMsIDB4MDA1NSwgMHgwMzA4LCAweDAzMDQsIDB4MDA3NSwgMHgwMzA4LCAweDAzMDQsCisJMHgwMDU1LCAweDAzMDgsIDB4MDMwMSwgMHgwMDc1LCAweDAzMDgsIDB4MDMwMSwgMHgwMDU1LCAweDAzMDgsCisJMHgwMzBjLCAweDAwNzUsIDB4MDMwOCwgMHgwMzBjLCAweDAwNTUsIDB4MDMwOCwgMHgwMzAwLCAweDAwNzUsCisJMHgwMzA4LCAweDAzMDAsIDB4MDA0MSwgMHgwMzA4LCAweDAzMDQsIDB4MDA2MSwgMHgwMzA4LCAweDAzMDQsCisJMHgwMDQxLCAweDAzMDcsIDB4MDMwNCwgMHgwMDYxLCAweDAzMDcsIDB4MDMwNCwgMHgwMGM2LCAweDAzMDQsCisJMHgwMGU2LCAweDAzMDQsIDB4MDA0NywgMHgwMzBjLCAweDAwNjcsIDB4MDMwYywgMHgwMDRiLCAweDAzMGMsCisJMHgwMDZiLCAweDAzMGMsIDB4MDA0ZiwgMHgwMzI4LCAweDAwNmYsIDB4MDMyOCwgMHgwMDRmLCAweDAzMjgsCisJMHgwMzA0LCAweDAwNmYsIDB4MDMyOCwgMHgwMzA0LCAweDAxYjcsIDB4MDMwYywgMHgwMjkyLCAweDAzMGMsCisJMHgwMDZhLCAweDAzMGMsIDB4MDA0NywgMHgwMzAxLCAweDAwNjcsIDB4MDMwMSwgMHgwMDQxLCAweDAzMGEsCisJMHgwMzAxLCAweDAwNjEsIDB4MDMwYSwgMHgwMzAxLCAweDAwYzYsIDB4MDMwMSwgMHgwMGU2LCAweDAzMDEsCisJMHgwMGQ4LCAweDAzMDEsIDB4MDBmOCwgMHgwMzAxLCAweDAwNDEsIDB4MDMwZiwgMHgwMDYxLCAweDAzMGYsCisJMHgwMDQxLCAweDAzMTEsIDB4MDA2MSwgMHgwMzExLCAweDAwNDUsIDB4MDMwZiwgMHgwMDY1LCAweDAzMGYsCisJMHgwMDQ1LCAweDAzMTEsIDB4MDA2NSwgMHgwMzExLCAweDAwNDksIDB4MDMwZiwgMHgwMDY5LCAweDAzMGYsCisJMHgwMDQ5LCAweDAzMTEsIDB4MDA2OSwgMHgwMzExLCAweDAwNGYsIDB4MDMwZiwgMHgwMDZmLCAweDAzMGYsCisJMHgwMDRmLCAweDAzMTEsIDB4MDA2ZiwgMHgwMzExLCAweDAwNTIsIDB4MDMwZiwgMHgwMDcyLCAweDAzMGYsCisJMHgwMDUyLCAweDAzMTEsIDB4MDA3MiwgMHgwMzExLCAweDAwNTUsIDB4MDMwZiwgMHgwMDc1LCAweDAzMGYsCisJMHgwMDU1LCAweDAzMTEsIDB4MDA3NSwgMHgwMzExLCAweDAzMDYsIDB4MDMwNywgMHgwMzAwLCAweDAzMDEsCisJMHgwMzEzLCAweDAzMDgsIDB4MDMwZCwgMHgwMmI5LCAweDAwM2IsIDB4MDBhOCwgMHgwMzBkLCAweDAzOTEsCisJMHgwMzBkLCAweDAwYjcsIDB4MDM5NSwgMHgwMzBkLCAweDAzOTcsIDB4MDMwZCwgMHgwMzk5LCAweDAzMGQsCisJMHgwMzlmLCAweDAzMGQsIDB4MDNhNSwgMHgwMzBkLCAweDAzYTksIDB4MDMwZCwgMHgwM2I5LCAweDAzMDgsCisJMHgwMzBkLCAweDAzOTksIDB4MDMwOCwgMHgwM2E1LCAweDAzMDgsIDB4MDNiMSwgMHgwMzBkLCAweDAzYjUsCisJMHgwMzBkLCAweDAzYjcsIDB4MDMwZCwgMHgwM2I5LCAweDAzMGQsIDB4MDNjNSwgMHgwMzA4LCAweDAzMGQsCisJMHgwM2I5LCAweDAzMDgsIDB4MDNjNSwgMHgwMzA4LCAweDAzYmYsIDB4MDMwZCwgMHgwM2M1LCAweDAzMGQsCisJMHgwM2M5LCAweDAzMGQsIDB4MDNkMiwgMHgwMzBkLCAweDAzZDIsIDB4MDMwOCwgMHgwNDE1LCAweDAzMDgsCisJMHgwNDEzLCAweDAzMDEsIDB4MDQwNiwgMHgwMzA4LCAweDA0MWEsIDB4MDMwMSwgMHgwNDIzLCAweDAzMDYsCisJMHgwNDE4LCAweDAzMDYsIDB4MDQzOCwgMHgwMzA2LCAweDA0MzUsIDB4MDMwOCwgMHgwNDMzLCAweDAzMDEsCisJMHgwNDU2LCAweDAzMDgsIDB4MDQzYSwgMHgwMzAxLCAweDA0NDMsIDB4MDMwNiwgMHgwNDc0LCAweDAzMGYsCisJMHgwNDc1LCAweDAzMGYsIDB4MDQxNiwgMHgwMzA2LCAweDA0MzYsIDB4MDMwNiwgMHgwNDEwLCAweDAzMDYsCisJMHgwNDMwLCAweDAzMDYsIDB4MDQxMCwgMHgwMzA4LCAweDA0MzAsIDB4MDMwOCwgMHgwMGM2LCAweDAwZTYsCisJMHgwNDE1LCAweDAzMDYsIDB4MDQzNSwgMHgwMzA2LCAweDAxOGYsIDB4MDI1OSwgMHgwMThmLCAweDAzMDgsCisJMHgwMjU5LCAweDAzMDgsIDB4MDQxNiwgMHgwMzA4LCAweDA0MzYsIDB4MDMwOCwgMHgwNDE3LCAweDAzMDgsCisJMHgwNDM3LCAweDAzMDgsIDB4MDFiNywgMHgwMjkyLCAweDA0MTgsIDB4MDMwNCwgMHgwNDM4LCAweDAzMDQsCisJMHgwNDE4LCAweDAzMDgsIDB4MDQzOCwgMHgwMzA4LCAweDA0MWUsIDB4MDMwOCwgMHgwNDNlLCAweDAzMDgsCisJMHgwMTlmLCAweDAyNzUsIDB4MDE5ZiwgMHgwMzA4LCAweDAyNzUsIDB4MDMwOCwgMHgwNDIzLCAweDAzMDQsCisJMHgwNDQzLCAweDAzMDQsIDB4MDQyMywgMHgwMzA4LCAweDA0NDMsIDB4MDMwOCwgMHgwNDIzLCAweDAzMGIsCisJMHgwNDQzLCAweDAzMGIsIDB4MDQyNywgMHgwMzA4LCAweDA0NDcsIDB4MDMwOCwgMHgwNDJiLCAweDAzMDgsCisJMHgwNDRiLCAweDAzMDgsIDB4MDkyOCwgMHgwOTNjLCAweDA5MzAsIDB4MDkzYywgMHgwOTMzLCAweDA5M2MsCisJMHgwOTE1LCAweDA5M2MsIDB4MDkxNiwgMHgwOTNjLCAweDA5MTcsIDB4MDkzYywgMHgwOTFjLCAweDA5M2MsCisJMHgwOTIxLCAweDA5M2MsIDB4MDkyMiwgMHgwOTNjLCAweDA5MmIsIDB4MDkzYywgMHgwOTJmLCAweDA5M2MsCisJMHgwOWFjLCAweDA5YmMsIDB4MDljNywgMHgwOWJlLCAweDA5YzcsIDB4MDlkNywgMHgwOWExLCAweDA5YmMsCisJMHgwOWEyLCAweDA5YmMsIDB4MDlhZiwgMHgwOWJjLCAweDBhMTYsIDB4MGEzYywgMHgwYTE3LCAweDBhM2MsCisJMHgwYTFjLCAweDBhM2MsIDB4MGEyMSwgMHgwYTNjLCAweDBhMmIsIDB4MGEzYywgMHgwYjQ3LCAweDBiNTYsCisJMHgwYjQ3LCAweDBiM2UsIDB4MGI0NywgMHgwYjU3LCAweDBiMjEsIDB4MGIzYywgMHgwYjIyLCAweDBiM2MsCisJMHgwYjJmLCAweDBiM2MsIDB4MGI5MiwgMHgwYmQ3LCAweDBiYzYsIDB4MGJiZSwgMHgwYmM3LCAweDBiYmUsCisJMHgwYmM2LCAweDBiZDcsIDB4MGM0NiwgMHgwYzU2LCAweDBjYmYsIDB4MGNkNSwgMHgwY2M2LCAweDBjZDUsCisJMHgwY2M2LCAweDBjZDYsIDB4MGNjNiwgMHgwY2MyLCAweDBjYzYsIDB4MGNjMiwgMHgwY2Q1LCAweDBkNDYsCisJMHgwZDNlLCAweDBkNDcsIDB4MGQzZSwgMHgwZDQ2LCAweDBkNTcsIDB4MGU0ZCwgMHgwZTMyLCAweDBlY2QsCisJMHgwZWIyLCAweDBmNDIsIDB4MGZiNywgMHgwZjRjLCAweDBmYjcsIDB4MGY1MSwgMHgwZmI3LCAweDBmNTYsCisJMHgwZmI3LCAweDBmNWIsIDB4MGZiNywgMHgwZjQwLCAweDBmYjUsIDB4MGY3MiwgMHgwZjcxLCAweDBmNzQsCisJMHgwZjcxLCAweDBmYjIsIDB4MGY4MCwgMHgwZmIyLCAweDBmODAsIDB4MGY3MSwgMHgwZmIzLCAweDBmODAsCisJMHgwZmIzLCAweDBmODAsIDB4MGY3MSwgMHgwZjgwLCAweDBmNzEsIDB4MGY5MiwgMHgwZmI3LCAweDBmOWMsCisJMHgwZmI3LCAweDBmYTEsIDB4MGZiNywgMHgwZmE2LCAweDBmYjcsIDB4MGZhYiwgMHgwZmI3LCAweDBmOTAsCisJMHgwZmI1LCAweDAwNDEsIDB4MDMyNSwgMHgwMDYxLCAweDAzMjUsIDB4MDA0MiwgMHgwMzA3LCAweDAwNjIsCisJMHgwMzA3LCAweDAwNDIsIDB4MDMyMywgMHgwMDYyLCAweDAzMjMsIDB4MDA0MiwgMHgwMzMxLCAweDAwNjIsCisJMHgwMzMxLCAweDAwNDMsIDB4MDMyNywgMHgwMzAxLCAweDAwNjMsIDB4MDMyNywgMHgwMzAxLCAweDAwNDQsCisJMHgwMzA3LCAweDAwNjQsIDB4MDMwNywgMHgwMDQ0LCAweDAzMjMsIDB4MDA2NCwgMHgwMzIzLCAweDAwNDQsCisJMHgwMzMxLCAweDAwNjQsIDB4MDMzMSwgMHgwMDQ0LCAweDAzMjcsIDB4MDA2NCwgMHgwMzI3LCAweDAwNDQsCisJMHgwMzJkLCAweDAwNjQsIDB4MDMyZCwgMHgwMDQ1LCAweDAzMDQsIDB4MDMwMCwgMHgwMDY1LCAweDAzMDQsCisJMHgwMzAwLCAweDAwNDUsIDB4MDMwNCwgMHgwMzAxLCAweDAwNjUsIDB4MDMwNCwgMHgwMzAxLCAweDAwNDUsCisJMHgwMzJkLCAweDAwNjUsIDB4MDMyZCwgMHgwMDQ1LCAweDAzMzAsIDB4MDA2NSwgMHgwMzMwLCAweDAwNDUsCisJMHgwMzI3LCAweDAzMDYsIDB4MDA2NSwgMHgwMzI3LCAweDAzMDYsIDB4MDA0NiwgMHgwMzA3LCAweDAwNjYsCisJMHgwMzA3LCAweDAwNDcsIDB4MDMwNCwgMHgwMDY3LCAweDAzMDQsIDB4MDA0OCwgMHgwMzA3LCAweDAwNjgsCisJMHgwMzA3LCAweDAwNDgsIDB4MDMyMywgMHgwMDY4LCAweDAzMjMsIDB4MDA0OCwgMHgwMzA4LCAweDAwNjgsCisJMHgwMzA4LCAweDAwNDgsIDB4MDMyNywgMHgwMDY4LCAweDAzMjcsIDB4MDA0OCwgMHgwMzJlLCAweDAwNjgsCisJMHgwMzJlLCAweDAwNDksIDB4MDMzMCwgMHgwMDY5LCAweDAzMzAsIDB4MDA0OSwgMHgwMzA4LCAweDAzMDEsCisJMHgwMDY5LCAweDAzMDgsIDB4MDMwMSwgMHgwMDRiLCAweDAzMDEsIDB4MDA2YiwgMHgwMzAxLCAweDAwNGIsCisJMHgwMzIzLCAweDAwNmIsIDB4MDMyMywgMHgwMDRiLCAweDAzMzEsIDB4MDA2YiwgMHgwMzMxLCAweDAwNGMsCisJMHgwMzIzLCAweDAwNmMsIDB4MDMyMywgMHgwMDRjLCAweDAzMjMsIDB4MDMwNCwgMHgwMDZjLCAweDAzMjMsCisJMHgwMzA0LCAweDAwNGMsIDB4MDMzMSwgMHgwMDZjLCAweDAzMzEsIDB4MDA0YywgMHgwMzJkLCAweDAwNmMsCisJMHgwMzJkLCAweDAwNGQsIDB4MDMwMSwgMHgwMDZkLCAweDAzMDEsIDB4MDA0ZCwgMHgwMzA3LCAweDAwNmQsCisJMHgwMzA3LCAweDAwNGQsIDB4MDMyMywgMHgwMDZkLCAweDAzMjMsIDB4MDA0ZSwgMHgwMzA3LCAweDAwNmUsCisJMHgwMzA3LCAweDAwNGUsIDB4MDMyMywgMHgwMDZlLCAweDAzMjMsIDB4MDA0ZSwgMHgwMzMxLCAweDAwNmUsCisJMHgwMzMxLCAweDAwNGUsIDB4MDMyZCwgMHgwMDZlLCAweDAzMmQsIDB4MDA0ZiwgMHgwMzAzLCAweDAzMDEsCisJMHgwMDZmLCAweDAzMDMsIDB4MDMwMSwgMHgwMDRmLCAweDAzMDMsIDB4MDMwOCwgMHgwMDZmLCAweDAzMDMsCisJMHgwMzA4LCAweDAwNGYsIDB4MDMwNCwgMHgwMzAwLCAweDAwNmYsIDB4MDMwNCwgMHgwMzAwLCAweDAwNGYsCisJMHgwMzA0LCAweDAzMDEsIDB4MDA2ZiwgMHgwMzA0LCAweDAzMDEsIDB4MDA1MCwgMHgwMzAxLCAweDAwNzAsCisJMHgwMzAxLCAweDAwNTAsIDB4MDMwNywgMHgwMDcwLCAweDAzMDcsIDB4MDA1MiwgMHgwMzA3LCAweDAwNzIsCisJMHgwMzA3LCAweDAwNTIsIDB4MDMyMywgMHgwMDcyLCAweDAzMjMsIDB4MDA1MiwgMHgwMzIzLCAweDAzMDQsCisJMHgwMDcyLCAweDAzMjMsIDB4MDMwNCwgMHgwMDUyLCAweDAzMzEsIDB4MDA3MiwgMHgwMzMxLCAweDAwNTMsCisJMHgwMzA3LCAweDAwNzMsIDB4MDMwNywgMHgwMDUzLCAweDAzMjMsIDB4MDA3MywgMHgwMzIzLCAweDAwNTMsCisJMHgwMzAxLCAweDAzMDcsIDB4MDA3MywgMHgwMzAxLCAweDAzMDcsIDB4MDA1MywgMHgwMzBjLCAweDAzMDcsCisJMHgwMDczLCAweDAzMGMsIDB4MDMwNywgMHgwMDUzLCAweDAzMjMsIDB4MDMwNywgMHgwMDczLCAweDAzMjMsCisJMHgwMzA3LCAweDAwNTQsIDB4MDMwNywgMHgwMDc0LCAweDAzMDcsIDB4MDA1NCwgMHgwMzIzLCAweDAwNzQsCisJMHgwMzIzLCAweDAwNTQsIDB4MDMzMSwgMHgwMDc0LCAweDAzMzEsIDB4MDA1NCwgMHgwMzJkLCAweDAwNzQsCisJMHgwMzJkLCAweDAwNTUsIDB4MDMyNCwgMHgwMDc1LCAweDAzMjQsIDB4MDA1NSwgMHgwMzMwLCAweDAwNzUsCisJMHgwMzMwLCAweDAwNTUsIDB4MDMyZCwgMHgwMDc1LCAweDAzMmQsIDB4MDA1NSwgMHgwMzAzLCAweDAzMDEsCisJMHgwMDc1LCAweDAzMDMsIDB4MDMwMSwgMHgwMDU1LCAweDAzMDQsIDB4MDMwOCwgMHgwMDc1LCAweDAzMDQsCisJMHgwMzA4LCAweDAwNTYsIDB4MDMwMywgMHgwMDc2LCAweDAzMDMsIDB4MDA1NiwgMHgwMzIzLCAweDAwNzYsCisJMHgwMzIzLCAweDAwNTcsIDB4MDMwMCwgMHgwMDc3LCAweDAzMDAsIDB4MDA1NywgMHgwMzAxLCAweDAwNzcsCisJMHgwMzAxLCAweDAwNTcsIDB4MDMwOCwgMHgwMDc3LCAweDAzMDgsIDB4MDA1NywgMHgwMzA3LCAweDAwNzcsCisJMHgwMzA3LCAweDAwNTcsIDB4MDMyMywgMHgwMDc3LCAweDAzMjMsIDB4MDA1OCwgMHgwMzA3LCAweDAwNzgsCisJMHgwMzA3LCAweDAwNTgsIDB4MDMwOCwgMHgwMDc4LCAweDAzMDgsIDB4MDA1OSwgMHgwMzA3LCAweDAwNzksCisJMHgwMzA3LCAweDAwNWEsIDB4MDMwMiwgMHgwMDdhLCAweDAzMDIsIDB4MDA1YSwgMHgwMzIzLCAweDAwN2EsCisJMHgwMzIzLCAweDAwNWEsIDB4MDMzMSwgMHgwMDdhLCAweDAzMzEsIDB4MDA2OCwgMHgwMzMxLCAweDAwNzQsCisJMHgwMzA4LCAweDAwNzcsIDB4MDMwYSwgMHgwMDc5LCAweDAzMGEsIDB4MDE3ZiwgMHgwMzA3LCAweDAwNDEsCisJMHgwMzIzLCAweDAwNjEsIDB4MDMyMywgMHgwMDQxLCAweDAzMDksIDB4MDA2MSwgMHgwMzA5LCAweDAwNDEsCisJMHgwMzAyLCAweDAzMDEsIDB4MDA2MSwgMHgwMzAyLCAweDAzMDEsIDB4MDA0MSwgMHgwMzAyLCAweDAzMDAsCisJMHgwMDYxLCAweDAzMDIsIDB4MDMwMCwgMHgwMDQxLCAweDAzMDIsIDB4MDMwOSwgMHgwMDYxLCAweDAzMDIsCisJMHgwMzA5LCAweDAwNDEsIDB4MDMwMiwgMHgwMzAzLCAweDAwNjEsIDB4MDMwMiwgMHgwMzAzLCAweDAwNDEsCisJMHgwMzIzLCAweDAzMDIsIDB4MDA2MSwgMHgwMzIzLCAweDAzMDIsIDB4MDA0MSwgMHgwMzA2LCAweDAzMDEsCisJMHgwMDYxLCAweDAzMDYsIDB4MDMwMSwgMHgwMDQxLCAweDAzMDYsIDB4MDMwMCwgMHgwMDYxLCAweDAzMDYsCisJMHgwMzAwLCAweDAwNDEsIDB4MDMwNiwgMHgwMzA5LCAweDAwNjEsIDB4MDMwNiwgMHgwMzA5LCAweDAwNDEsCisJMHgwMzA2LCAweDAzMDMsIDB4MDA2MSwgMHgwMzA2LCAweDAzMDMsIDB4MDA0MSwgMHgwMzIzLCAweDAzMDYsCisJMHgwMDYxLCAweDAzMjMsIDB4MDMwNiwgMHgwMDQ1LCAweDAzMjMsIDB4MDA2NSwgMHgwMzIzLCAweDAwNDUsCisJMHgwMzA5LCAweDAwNjUsIDB4MDMwOSwgMHgwMDQ1LCAweDAzMDMsIDB4MDA2NSwgMHgwMzAzLCAweDAwNDUsCisJMHgwMzAyLCAweDAzMDEsIDB4MDA2NSwgMHgwMzAyLCAweDAzMDEsIDB4MDA0NSwgMHgwMzAyLCAweDAzMDAsCisJMHgwMDY1LCAweDAzMDIsIDB4MDMwMCwgMHgwMDQ1LCAweDAzMDIsIDB4MDMwOSwgMHgwMDY1LCAweDAzMDIsCisJMHgwMzA5LCAweDAwNDUsIDB4MDMwMiwgMHgwMzAzLCAweDAwNjUsIDB4MDMwMiwgMHgwMzAzLCAweDAwNDUsCisJMHgwMzIzLCAweDAzMDIsIDB4MDA2NSwgMHgwMzIzLCAweDAzMDIsIDB4MDA0OSwgMHgwMzA5LCAweDAwNjksCisJMHgwMzA5LCAweDAwNDksIDB4MDMyMywgMHgwMDY5LCAweDAzMjMsIDB4MDA0ZiwgMHgwMzIzLCAweDAwNmYsCisJMHgwMzIzLCAweDAwNGYsIDB4MDMwOSwgMHgwMDZmLCAweDAzMDksIDB4MDA0ZiwgMHgwMzAyLCAweDAzMDEsCisJMHgwMDZmLCAweDAzMDIsIDB4MDMwMSwgMHgwMDRmLCAweDAzMDIsIDB4MDMwMCwgMHgwMDZmLCAweDAzMDIsCisJMHgwMzAwLCAweDAwNGYsIDB4MDMwMiwgMHgwMzA5LCAweDAwNmYsIDB4MDMwMiwgMHgwMzA5LCAweDAwNGYsCisJMHgwMzAyLCAweDAzMDMsIDB4MDA2ZiwgMHgwMzAyLCAweDAzMDMsIDB4MDA0ZiwgMHgwMzIzLCAweDAzMDIsCisJMHgwMDZmLCAweDAzMjMsIDB4MDMwMiwgMHgwMDRmLCAweDAzMWIsIDB4MDMwMSwgMHgwMDZmLCAweDAzMWIsCisJMHgwMzAxLCAweDAwNGYsIDB4MDMxYiwgMHgwMzAwLCAweDAwNmYsIDB4MDMxYiwgMHgwMzAwLCAweDAwNGYsCisJMHgwMzFiLCAweDAzMDksIDB4MDA2ZiwgMHgwMzFiLCAweDAzMDksIDB4MDA0ZiwgMHgwMzFiLCAweDAzMDMsCisJMHgwMDZmLCAweDAzMWIsIDB4MDMwMywgMHgwMDRmLCAweDAzMWIsIDB4MDMyMywgMHgwMDZmLCAweDAzMWIsCisJMHgwMzIzLCAweDAwNTUsIDB4MDMyMywgMHgwMDc1LCAweDAzMjMsIDB4MDA1NSwgMHgwMzA5LCAweDAwNzUsCisJMHgwMzA5LCAweDAwNTUsIDB4MDMxYiwgMHgwMzAxLCAweDAwNzUsIDB4MDMxYiwgMHgwMzAxLCAweDAwNTUsCisJMHgwMzFiLCAweDAzMDAsIDB4MDA3NSwgMHgwMzFiLCAweDAzMDAsIDB4MDA1NSwgMHgwMzFiLCAweDAzMDksCisJMHgwMDc1LCAweDAzMWIsIDB4MDMwOSwgMHgwMDU1LCAweDAzMWIsIDB4MDMwMywgMHgwMDc1LCAweDAzMWIsCisJMHgwMzAzLCAweDAwNTUsIDB4MDMxYiwgMHgwMzIzLCAweDAwNzUsIDB4MDMxYiwgMHgwMzIzLCAweDAwNTksCisJMHgwMzAwLCAweDAwNzksIDB4MDMwMCwgMHgwMDU5LCAweDAzMjMsIDB4MDA3OSwgMHgwMzIzLCAweDAwNTksCisJMHgwMzA5LCAweDAwNzksIDB4MDMwOSwgMHgwMDU5LCAweDAzMDMsIDB4MDA3OSwgMHgwMzAzLCAweDAzYjEsCisJMHgwMzEzLCAweDAzYjEsIDB4MDMxNCwgMHgwM2IxLCAweDAzMTMsIDB4MDMwMCwgMHgwM2IxLCAweDAzMTQsCisJMHgwMzAwLCAweDAzYjEsIDB4MDMxMywgMHgwMzAxLCAweDAzYjEsIDB4MDMxNCwgMHgwMzAxLCAweDAzYjEsCisJMHgwMzEzLCAweDAzNDIsIDB4MDNiMSwgMHgwMzE0LCAweDAzNDIsIDB4MDM5MSwgMHgwMzEzLCAweDAzOTEsCisJMHgwMzE0LCAweDAzOTEsIDB4MDMxMywgMHgwMzAwLCAweDAzOTEsIDB4MDMxNCwgMHgwMzAwLCAweDAzOTEsCisJMHgwMzEzLCAweDAzMDEsIDB4MDM5MSwgMHgwMzE0LCAweDAzMDEsIDB4MDM5MSwgMHgwMzEzLCAweDAzNDIsCisJMHgwMzkxLCAweDAzMTQsIDB4MDM0MiwgMHgwM2I1LCAweDAzMTMsIDB4MDNiNSwgMHgwMzE0LCAweDAzYjUsCisJMHgwMzEzLCAweDAzMDAsIDB4MDNiNSwgMHgwMzE0LCAweDAzMDAsIDB4MDNiNSwgMHgwMzEzLCAweDAzMDEsCisJMHgwM2I1LCAweDAzMTQsIDB4MDMwMSwgMHgwMzk1LCAweDAzMTMsIDB4MDM5NSwgMHgwMzE0LCAweDAzOTUsCisJMHgwMzEzLCAweDAzMDAsIDB4MDM5NSwgMHgwMzE0LCAweDAzMDAsIDB4MDM5NSwgMHgwMzEzLCAweDAzMDEsCisJMHgwMzk1LCAweDAzMTQsIDB4MDMwMSwgMHgwM2I3LCAweDAzMTMsIDB4MDNiNywgMHgwMzE0LCAweDAzYjcsCisJMHgwMzEzLCAweDAzMDAsIDB4MDNiNywgMHgwMzE0LCAweDAzMDAsIDB4MDNiNywgMHgwMzEzLCAweDAzMDEsCisJMHgwM2I3LCAweDAzMTQsIDB4MDMwMSwgMHgwM2I3LCAweDAzMTMsIDB4MDM0MiwgMHgwM2I3LCAweDAzMTQsCisJMHgwMzQyLCAweDAzOTcsIDB4MDMxMywgMHgwMzk3LCAweDAzMTQsIDB4MDM5NywgMHgwMzEzLCAweDAzMDAsCisJMHgwMzk3LCAweDAzMTQsIDB4MDMwMCwgMHgwMzk3LCAweDAzMTMsIDB4MDMwMSwgMHgwMzk3LCAweDAzMTQsCisJMHgwMzAxLCAweDAzOTcsIDB4MDMxMywgMHgwMzQyLCAweDAzOTcsIDB4MDMxNCwgMHgwMzQyLCAweDAzYjksCisJMHgwMzEzLCAweDAzYjksIDB4MDMxNCwgMHgwM2I5LCAweDAzMTMsIDB4MDMwMCwgMHgwM2I5LCAweDAzMTQsCisJMHgwMzAwLCAweDAzYjksIDB4MDMxMywgMHgwMzAxLCAweDAzYjksIDB4MDMxNCwgMHgwMzAxLCAweDAzYjksCisJMHgwMzEzLCAweDAzNDIsIDB4MDNiOSwgMHgwMzE0LCAweDAzNDIsIDB4MDM5OSwgMHgwMzEzLCAweDAzOTksCisJMHgwMzE0LCAweDAzOTksIDB4MDMxMywgMHgwMzAwLCAweDAzOTksIDB4MDMxNCwgMHgwMzAwLCAweDAzOTksCisJMHgwMzEzLCAweDAzMDEsIDB4MDM5OSwgMHgwMzE0LCAweDAzMDEsIDB4MDM5OSwgMHgwMzEzLCAweDAzNDIsCisJMHgwMzk5LCAweDAzMTQsIDB4MDM0MiwgMHgwM2JmLCAweDAzMTMsIDB4MDNiZiwgMHgwMzE0LCAweDAzYmYsCisJMHgwMzEzLCAweDAzMDAsIDB4MDNiZiwgMHgwMzE0LCAweDAzMDAsIDB4MDNiZiwgMHgwMzEzLCAweDAzMDEsCisJMHgwM2JmLCAweDAzMTQsIDB4MDMwMSwgMHgwMzlmLCAweDAzMTMsIDB4MDM5ZiwgMHgwMzE0LCAweDAzOWYsCisJMHgwMzEzLCAweDAzMDAsIDB4MDM5ZiwgMHgwMzE0LCAweDAzMDAsIDB4MDM5ZiwgMHgwMzEzLCAweDAzMDEsCisJMHgwMzlmLCAweDAzMTQsIDB4MDMwMSwgMHgwM2M1LCAweDAzMTMsIDB4MDNjNSwgMHgwMzE0LCAweDAzYzUsCisJMHgwMzEzLCAweDAzMDAsIDB4MDNjNSwgMHgwMzE0LCAweDAzMDAsIDB4MDNjNSwgMHgwMzEzLCAweDAzMDEsCisJMHgwM2M1LCAweDAzMTQsIDB4MDMwMSwgMHgwM2M1LCAweDAzMTMsIDB4MDM0MiwgMHgwM2M1LCAweDAzMTQsCisJMHgwMzQyLCAweDAzYTUsIDB4MDMxNCwgMHgwM2E1LCAweDAzMTQsIDB4MDMwMCwgMHgwM2E1LCAweDAzMTQsCisJMHgwMzAxLCAweDAzYTUsIDB4MDMxNCwgMHgwMzQyLCAweDAzYzksIDB4MDMxMywgMHgwM2M5LCAweDAzMTQsCisJMHgwM2M5LCAweDAzMTMsIDB4MDMwMCwgMHgwM2M5LCAweDAzMTQsIDB4MDMwMCwgMHgwM2M5LCAweDAzMTMsCisJMHgwMzAxLCAweDAzYzksIDB4MDMxNCwgMHgwMzAxLCAweDAzYzksIDB4MDMxMywgMHgwMzQyLCAweDAzYzksCisJMHgwMzE0LCAweDAzNDIsIDB4MDNhOSwgMHgwMzEzLCAweDAzYTksIDB4MDMxNCwgMHgwM2E5LCAweDAzMTMsCisJMHgwMzAwLCAweDAzYTksIDB4MDMxNCwgMHgwMzAwLCAweDAzYTksIDB4MDMxMywgMHgwMzAxLCAweDAzYTksCisJMHgwMzE0LCAweDAzMDEsIDB4MDNhOSwgMHgwMzEzLCAweDAzNDIsIDB4MDNhOSwgMHgwMzE0LCAweDAzNDIsCisJMHgwM2IxLCAweDAzMDAsIDB4MDNiMSwgMHgwMzAxLCAweDAzYjUsIDB4MDMwMCwgMHgwM2I1LCAweDAzMDEsCisJMHgwM2I3LCAweDAzMDAsIDB4MDNiNywgMHgwMzAxLCAweDAzYjksIDB4MDMwMCwgMHgwM2I5LCAweDAzMDEsCisJMHgwM2JmLCAweDAzMDAsIDB4MDNiZiwgMHgwMzAxLCAweDAzYzUsIDB4MDMwMCwgMHgwM2M1LCAweDAzMDEsCisJMHgwM2M5LCAweDAzMDAsIDB4MDNjOSwgMHgwMzAxLCAweDAzYjEsIDB4MDM0NSwgMHgwMzEzLCAweDAzYjEsCisJMHgwMzQ1LCAweDAzMTQsIDB4MDNiMSwgMHgwMzQ1LCAweDAzMTMsIDB4MDMwMCwgMHgwM2IxLCAweDAzNDUsCisJMHgwMzE0LCAweDAzMDAsIDB4MDNiMSwgMHgwMzQ1LCAweDAzMTMsIDB4MDMwMSwgMHgwM2IxLCAweDAzNDUsCisJMHgwMzE0LCAweDAzMDEsIDB4MDNiMSwgMHgwMzQ1LCAweDAzMTMsIDB4MDM0MiwgMHgwM2IxLCAweDAzNDUsCisJMHgwMzE0LCAweDAzNDIsIDB4MDM5MSwgMHgwMzQ1LCAweDAzMTMsIDB4MDM5MSwgMHgwMzQ1LCAweDAzMTQsCisJMHgwMzkxLCAweDAzNDUsIDB4MDMxMywgMHgwMzAwLCAweDAzOTEsIDB4MDM0NSwgMHgwMzE0LCAweDAzMDAsCisJMHgwMzkxLCAweDAzNDUsIDB4MDMxMywgMHgwMzAxLCAweDAzOTEsIDB4MDM0NSwgMHgwMzE0LCAweDAzMDEsCisJMHgwMzkxLCAweDAzNDUsIDB4MDMxMywgMHgwMzQyLCAweDAzOTEsIDB4MDM0NSwgMHgwMzE0LCAweDAzNDIsCisJMHgwM2I3LCAweDAzNDUsIDB4MDMxMywgMHgwM2I3LCAweDAzNDUsIDB4MDMxNCwgMHgwM2I3LCAweDAzNDUsCisJMHgwMzEzLCAweDAzMDAsIDB4MDNiNywgMHgwMzQ1LCAweDAzMTQsIDB4MDMwMCwgMHgwM2I3LCAweDAzNDUsCisJMHgwMzEzLCAweDAzMDEsIDB4MDNiNywgMHgwMzQ1LCAweDAzMTQsIDB4MDMwMSwgMHgwM2I3LCAweDAzNDUsCisJMHgwMzEzLCAweDAzNDIsIDB4MDNiNywgMHgwMzQ1LCAweDAzMTQsIDB4MDM0MiwgMHgwMzk3LCAweDAzNDUsCisJMHgwMzEzLCAweDAzOTcsIDB4MDM0NSwgMHgwMzE0LCAweDAzOTcsIDB4MDM0NSwgMHgwMzEzLCAweDAzMDAsCisJMHgwMzk3LCAweDAzNDUsIDB4MDMxNCwgMHgwMzAwLCAweDAzOTcsIDB4MDM0NSwgMHgwMzEzLCAweDAzMDEsCisJMHgwMzk3LCAweDAzNDUsIDB4MDMxNCwgMHgwMzAxLCAweDAzOTcsIDB4MDM0NSwgMHgwMzEzLCAweDAzNDIsCisJMHgwMzk3LCAweDAzNDUsIDB4MDMxNCwgMHgwMzQyLCAweDAzYzksIDB4MDM0NSwgMHgwMzEzLCAweDAzYzksCisJMHgwMzQ1LCAweDAzMTQsIDB4MDNjOSwgMHgwMzQ1LCAweDAzMTMsIDB4MDMwMCwgMHgwM2M5LCAweDAzNDUsCisJMHgwMzE0LCAweDAzMDAsIDB4MDNjOSwgMHgwMzQ1LCAweDAzMTMsIDB4MDMwMSwgMHgwM2M5LCAweDAzNDUsCisJMHgwMzE0LCAweDAzMDEsIDB4MDNjOSwgMHgwMzQ1LCAweDAzMTMsIDB4MDM0MiwgMHgwM2M5LCAweDAzNDUsCisJMHgwMzE0LCAweDAzNDIsIDB4MDNhOSwgMHgwMzQ1LCAweDAzMTMsIDB4MDNhOSwgMHgwMzQ1LCAweDAzMTQsCisJMHgwM2E5LCAweDAzNDUsIDB4MDMxMywgMHgwMzAwLCAweDAzYTksIDB4MDM0NSwgMHgwMzE0LCAweDAzMDAsCisJMHgwM2E5LCAweDAzNDUsIDB4MDMxMywgMHgwMzAxLCAweDAzYTksIDB4MDM0NSwgMHgwMzE0LCAweDAzMDEsCisJMHgwM2E5LCAweDAzNDUsIDB4MDMxMywgMHgwMzQyLCAweDAzYTksIDB4MDM0NSwgMHgwMzE0LCAweDAzNDIsCisJMHgwM2IxLCAweDAzMDYsIDB4MDNiMSwgMHgwMzA0LCAweDAzYjEsIDB4MDM0NSwgMHgwMzAwLCAweDAzYjEsCisJMHgwMzQ1LCAweDAzYjEsIDB4MDM0NSwgMHgwMzAxLCAweDAzYjEsIDB4MDM0MiwgMHgwM2IxLCAweDAzNDUsCisJMHgwMzQyLCAweDAzOTEsIDB4MDMwNiwgMHgwMzkxLCAweDAzMDQsIDB4MDM5MSwgMHgwMzAwLCAweDAzOTEsCisJMHgwMzAxLCAweDAzOTEsIDB4MDM0NSwgMHgwM2I5LCAweDAwYTgsIDB4MDM0MiwgMHgwM2I3LCAweDAzNDUsCisJMHgwMzAwLCAweDAzYjcsIDB4MDM0NSwgMHgwM2I3LCAweDAzNDUsIDB4MDMwMSwgMHgwM2I3LCAweDAzNDIsCisJMHgwM2I3LCAweDAzNDUsIDB4MDM0MiwgMHgwMzk1LCAweDAzMDAsIDB4MDM5NSwgMHgwMzAxLCAweDAzOTcsCisJMHgwMzAwLCAweDAzOTcsIDB4MDMwMSwgMHgwMzk3LCAweDAzNDUsIDB4MWZiZiwgMHgwMzAwLCAweDFmYmYsCisJMHgwMzAxLCAweDFmYmYsIDB4MDM0MiwgMHgwM2I5LCAweDAzMDYsIDB4MDNiOSwgMHgwMzA0LCAweDAzYjksCisJMHgwMzA4LCAweDAzMDAsIDB4MDNiOSwgMHgwMzA4LCAweDAzMDEsIDB4MDNiOSwgMHgwMzQyLCAweDAzYjksCisJMHgwMzA4LCAweDAzNDIsIDB4MDM5OSwgMHgwMzA2LCAweDAzOTksIDB4MDMwNCwgMHgwMzk5LCAweDAzMDAsCisJMHgwMzk5LCAweDAzMDEsIDB4MWZmZSwgMHgwMzAwLCAweDFmZmUsIDB4MDMwMSwgMHgxZmZlLCAweDAzNDIsCisJMHgwM2M1LCAweDAzMDYsIDB4MDNjNSwgMHgwMzA0LCAweDAzYzUsIDB4MDMwOCwgMHgwMzAwLCAweDAzYzUsCisJMHgwMzA4LCAweDAzMDEsIDB4MDNjMSwgMHgwMzEzLCAweDAzYzEsIDB4MDMxNCwgMHgwM2M1LCAweDAzNDIsCisJMHgwM2M1LCAweDAzMDgsIDB4MDM0MiwgMHgwM2E1LCAweDAzMDYsIDB4MDNhNSwgMHgwMzA0LCAweDAzYTUsCisJMHgwMzAwLCAweDAzYTUsIDB4MDMwMSwgMHgwM2ExLCAweDAzMTQsIDB4MDBhOCwgMHgwMzAwLCAweDAwYTgsCisJMHgwMzAxLCAweDAwNjAsIDB4MDNjOSwgMHgwMzQ1LCAweDAzMDAsIDB4MDNjOSwgMHgwMzQ1LCAweDAzYmYsCisJMHgwMzQ1LCAweDAzMDEsIDB4MDNjOSwgMHgwMzQyLCAweDAzYzksIDB4MDM0NSwgMHgwMzQyLCAweDAzOWYsCisJMHgwMzAwLCAweDAzOWYsIDB4MDMwMSwgMHgwM2E5LCAweDAzMDAsIDB4MDNhOSwgMHgwMzAxLCAweDAzYTksCisJMHgwMzQ1LCAweDAwYjQsIDB4MzA0YiwgMHgzMDk5LCAweDMwNGQsIDB4MzA5OSwgMHgzMDRmLCAweDMwOTksCisJMHgzMDUxLCAweDMwOTksIDB4MzA1MywgMHgzMDk5LCAweDMwNTUsIDB4MzA5OSwgMHgzMDU3LCAweDMwOTksCisJMHgzMDU5LCAweDMwOTksIDB4MzA1YiwgMHgzMDk5LCAweDMwNWQsIDB4MzA5OSwgMHgzMDVmLCAweDMwOTksCisJMHgzMDYxLCAweDMwOTksIDB4MzA2NCwgMHgzMDk5LCAweDMwNjYsIDB4MzA5OSwgMHgzMDY4LCAweDMwOTksCisJMHgzMDZmLCAweDMwOTksIDB4MzA2ZiwgMHgzMDlhLCAweDMwNzIsIDB4MzA5OSwgMHgzMDcyLCAweDMwOWEsCisJMHgzMDc1LCAweDMwOTksIDB4MzA3NSwgMHgzMDlhLCAweDMwNzgsIDB4MzA5OSwgMHgzMDc4LCAweDMwOWEsCisJMHgzMDdiLCAweDMwOTksIDB4MzA3YiwgMHgzMDlhLCAweDMwNDYsIDB4MzA5OSwgMHgzMDlkLCAweDMwOTksCisJMHgzMGFiLCAweDMwOTksIDB4MzBhZCwgMHgzMDk5LCAweDMwYWYsIDB4MzA5OSwgMHgzMGIxLCAweDMwOTksCisJMHgzMGIzLCAweDMwOTksIDB4MzBiNSwgMHgzMDk5LCAweDMwYjcsIDB4MzA5OSwgMHgzMGI5LCAweDMwOTksCisJMHgzMGJiLCAweDMwOTksIDB4MzBiZCwgMHgzMDk5LCAweDMwYmYsIDB4MzA5OSwgMHgzMGMxLCAweDMwOTksCisJMHgzMGM0LCAweDMwOTksIDB4MzBjNiwgMHgzMDk5LCAweDMwYzgsIDB4MzA5OSwgMHgzMGNmLCAweDMwOTksCisJMHgzMGNmLCAweDMwOWEsIDB4MzBkMiwgMHgzMDk5LCAweDMwZDIsIDB4MzA5YSwgMHgzMGQ1LCAweDMwOTksCisJMHgzMGQ1LCAweDMwOWEsIDB4MzBkOCwgMHgzMDk5LCAweDMwZDgsIDB4MzA5YSwgMHgzMGRiLCAweDMwOTksCisJMHgzMGRiLCAweDMwOWEsIDB4MzBhNiwgMHgzMDk5LCAweDMwZWYsIDB4MzA5OSwgMHgzMGYwLCAweDMwOTksCisJMHgzMGYxLCAweDMwOTksIDB4MzBmMiwgMHgzMDk5LCAweDMwZmQsIDB4MzA5OSwgMHgwNWYyLCAweDA1YjcsCisJMHgwNWU5LCAweDA1YzEsIDB4MDVlOSwgMHgwNWMyLCAweDA1ZTksIDB4MDViYywgMHgwNWMxLCAweDA1ZTksCisJMHgwNWJjLCAweDA1YzIsIDB4MDVkMCwgMHgwNWI3LCAweDA1ZDAsIDB4MDViOCwgMHgwNWQwLCAweDA1YmMsCisJMHgwNWQxLCAweDA1YmMsIDB4MDVkMiwgMHgwNWJjLCAweDA1ZDMsIDB4MDViYywgMHgwNWQ0LCAweDA1YmMsCisJMHgwNWQ1LCAweDA1YmMsIDB4MDVkNiwgMHgwNWJjLCAweDA1ZDgsIDB4MDViYywgMHgwNWQ5LCAweDA1YmMsCisJMHgwNWRhLCAweDA1YmMsIDB4MDVkYiwgMHgwNWJjLCAweDA1ZGMsIDB4MDViYywgMHgwNWRlLCAweDA1YmMsCisJMHgwNWUwLCAweDA1YmMsIDB4MDVlMSwgMHgwNWJjLCAweDA1ZTMsIDB4MDViYywgMHgwNWU0LCAweDA1YmMsCisJMHgwNWU2LCAweDA1YmMsIDB4MDVlNywgMHgwNWJjLCAweDA1ZTgsIDB4MDViYywgMHgwNWU5LCAweDA1YmMsCisJMHgwNWVhLCAweDA1YmMsIDB4MDVkNSwgMHgwNWI5LCAweDA1ZDEsIDB4MDViZiwgMHgwNWRiLCAweDA1YmYsCisJMHgwNWU0LCAweDA1YmYKK307CisKK3UxNiBoZnNwbHVzX2NvbXBvc2VfdGFibGVbXSA9IHsKKwkvKiBiYXNlICovCisJMHgwMDAwLCAweDAwNTAsICAweDAzMDAsIDB4MDBhNCwgIDB4MDMwMSwgMHgwMGU0LCAgMHgwMzAyLCAweDAxNWMsCisJMHgwMzAzLCAweDAxOTIsICAweDAzMDQsIDB4MDFiNCwgIDB4MDMwNiwgMHgwMWU2LCAgMHgwMzA3LCAweDAyMjAsCisJMHgwMzA4LCAweDAyNzAsICAweDAzMDksIDB4MDJkMiwgIDB4MDMwYSwgMHgwMmVjLCAgMHgwMzBiLCAweDAyZmEsCisJMHgwMzBjLCAweDAzMDgsICAweDAzMGQsIDB4MDM0YywgIDB4MDMwZiwgMHgwMzcwLCAgMHgwMzExLCAweDAzOGUsCisJMHgwMzEzLCAweDAzYTgsICAweDAzMTQsIDB4MDNjNiwgIDB4MDMxYiwgMHgwM2U4LCAgMHgwMzIzLCAweDAzZjIsCisJMHgwMzI0LCAweDA0NDAsICAweDAzMjUsIDB4MDQ0NiwgIDB4MDMyNywgMHgwNDRjLCAgMHgwMzI4LCAweDA0N2EsCisJMHgwMzJkLCAweDA0OTAsICAweDAzMmUsIDB4MDRhYSwgIDB4MDMzMCwgMHgwNGIwLCAgMHgwMzMxLCAweDA0YmUsCisJMHgwMzQyLCAweDA0ZTIsICAweDAzNDUsIDB4MDRmNCwgIDB4MDViNywgMHgwNTA0LCAgMHgwNWI4LCAweDA1MGEsCisJMHgwNWI5LCAweDA1MGUsICAweDA1YmMsIDB4MDUxMiwgIDB4MDViZiwgMHgwNTQwLCAgMHgwNWMxLCAweDA1NDgsCisJMHgwNWMyLCAweDA1NGMsICAweDA5M2MsIDB4MDU1MCwgIDB4MDliYywgMHgwNTY4LCAgMHgwOWJlLCAweDA1NzIsCisJMHgwOWQ3LCAweDA1NzYsICAweDBhM2MsIDB4MDU3YSwgIDB4MGIzYywgMHgwNTg2LCAgMHgwYjNlLCAweDA1OGUsCisJMHgwYjU2LCAweDA1OTIsICAweDBiNTcsIDB4MDU5NiwgIDB4MGJiZSwgMHgwNTlhLCAgMHgwYmQ3LCAweDA1YTAsCisJMHgwYzU2LCAweDA1YTYsICAweDBjYzIsIDB4MDVhYSwgIDB4MGNkNSwgMHgwNWFlLCAgMHgwY2Q2LCAweDA1YjQsCisJMHgwZDNlLCAweDA1YjgsICAweDBkNTcsIDB4MDViZSwgIDB4MGUzMiwgMHgwNWMyLCAgMHgwZWIyLCAweDA1YzYsCisJMHgwZjcxLCAweDA1Y2EsICAweDBmODAsIDB4MDVkMiwgIDB4MGZiNSwgMHgwNWQ4LCAgMHgwZmI3LCAweDA1ZGUsCisJMHgxMTAwLCAweDAwYTIsICAweDExMDEsIDB4MDBhMiwgIDB4MTEwMiwgMHgwMGEyLCAgMHgxMTAzLCAweDAwYTIsCisJMHgxMTA0LCAweDAwYTIsICAweDExMDUsIDB4MDBhMiwgIDB4MTEwNiwgMHgwMGEyLCAgMHgxMTA3LCAweDAwYTIsCisJMHgxMTA4LCAweDAwYTIsICAweDExMDksIDB4MDBhMiwgIDB4MTEwYSwgMHgwMGEyLCAgMHgxMTBiLCAweDAwYTIsCisJMHgxMTBjLCAweDAwYTIsICAweDExMGQsIDB4MDBhMiwgIDB4MTEwZSwgMHgwMGEyLCAgMHgxMTBmLCAweDAwYTIsCisJMHgxMTEwLCAweDAwYTIsICAweDExMTEsIDB4MDBhMiwgIDB4MTExMiwgMHgwMGEyLCAgMHgzMDk5LCAweDA1ZjQsCisJMHgzMDlhLCAweDA2NTYsCisJLyogaGFuZ3VsIG1hcmtlciAqLworCTB4ZmZmZiwgMHgwMDAwLAorCS8qIDB4MDMwMCAqLworCTB4MDM0MCwgMHgwMDFmLCAgMHgwMDQxLCAweDA2NmMsICAweDAwNDUsIDB4MDY2ZSwgIDB4MDA0OSwgMHgwNjcwLAorCTB4MDA0ZiwgMHgwNjcyLCAgMHgwMDU1LCAweDA2NzQsICAweDAwNTcsIDB4MDY3NiwgIDB4MDA1OSwgMHgwNjc4LAorCTB4MDA2MSwgMHgwNjdhLCAgMHgwMDY1LCAweDA2N2MsICAweDAwNjksIDB4MDY3ZSwgIDB4MDA2ZiwgMHgwNjgwLAorCTB4MDA3NSwgMHgwNjgyLCAgMHgwMDc3LCAweDA2ODQsICAweDAwNzksIDB4MDY4NiwgIDB4MDBhOCwgMHgwNjg4LAorCTB4MDM5MSwgMHgwNjhhLCAgMHgwMzk1LCAweDA2OGMsICAweDAzOTcsIDB4MDY4ZSwgIDB4MDM5OSwgMHgwNjkwLAorCTB4MDM5ZiwgMHgwNjkyLCAgMHgwM2E1LCAweDA2OTQsICAweDAzYTksIDB4MDY5NiwgIDB4MDNiMSwgMHgwNjk4LAorCTB4MDNiNSwgMHgwNjlhLCAgMHgwM2I3LCAweDA2OWMsICAweDAzYjksIDB4MDY5ZSwgIDB4MDNiZiwgMHgwNmEwLAorCTB4MDNjNSwgMHgwNmEyLCAgMHgwM2M5LCAweDA2YTQsICAweDFmYmYsIDB4MDZhNiwgIDB4MWZmZSwgMHgwNmE4LAorCS8qIDB4MDMwMSAqLworCTB4MDM0MSwgMHgwMDNiLCAgMHgwMDQxLCAweDA2YWEsICAweDAwNDMsIDB4MDZhYywgIDB4MDA0NSwgMHgwNmFlLAorCTB4MDA0NywgMHgwNmIwLCAgMHgwMDQ5LCAweDA2YjIsICAweDAwNGIsIDB4MDZiNCwgIDB4MDA0YywgMHgwNmI2LAorCTB4MDA0ZCwgMHgwNmI4LCAgMHgwMDRlLCAweDA2YmEsICAweDAwNGYsIDB4MDZiYywgIDB4MDA1MCwgMHgwNmJlLAorCTB4MDA1MiwgMHgwNmMwLCAgMHgwMDUzLCAweDA2YzIsICAweDAwNTUsIDB4MDZjNiwgIDB4MDA1NywgMHgwNmM4LAorCTB4MDA1OSwgMHgwNmNhLCAgMHgwMDVhLCAweDA2Y2MsICAweDAwNjEsIDB4MDZjZSwgIDB4MDA2MywgMHgwNmQwLAorCTB4MDA2NSwgMHgwNmQyLCAgMHgwMDY3LCAweDA2ZDQsICAweDAwNjksIDB4MDZkNiwgIDB4MDA2YiwgMHgwNmQ4LAorCTB4MDA2YywgMHgwNmRhLCAgMHgwMDZkLCAweDA2ZGMsICAweDAwNmUsIDB4MDZkZSwgIDB4MDA2ZiwgMHgwNmUwLAorCTB4MDA3MCwgMHgwNmUyLCAgMHgwMDcyLCAweDA2ZTQsICAweDAwNzMsIDB4MDZlNiwgIDB4MDA3NSwgMHgwNmVhLAorCTB4MDA3NywgMHgwNmVjLCAgMHgwMDc5LCAweDA2ZWUsICAweDAwN2EsIDB4MDZmMCwgIDB4MDBhOCwgMHgwNmYyLAorCTB4MDBjNiwgMHgwNmY0LCAgMHgwMGQ4LCAweDA2ZjYsICAweDAwZTYsIDB4MDZmOCwgIDB4MDBmOCwgMHgwNmZhLAorCTB4MDM5MSwgMHgwNmZjLCAgMHgwMzk1LCAweDA2ZmUsICAweDAzOTcsIDB4MDcwMCwgIDB4MDM5OSwgMHgwNzAyLAorCTB4MDM5ZiwgMHgwNzA0LCAgMHgwM2E1LCAweDA3MDYsICAweDAzYTksIDB4MDcwOCwgIDB4MDNiMSwgMHgwNzBhLAorCTB4MDNiNSwgMHgwNzBjLCAgMHgwM2I3LCAweDA3MGUsICAweDAzYjksIDB4MDcxMCwgIDB4MDNiZiwgMHgwNzEyLAorCTB4MDNjNSwgMHgwNzE0LCAgMHgwM2M5LCAweDA3MTYsICAweDA0MTMsIDB4MDcxOCwgIDB4MDQxYSwgMHgwNzFhLAorCTB4MDQzMywgMHgwNzFjLCAgMHgwNDNhLCAweDA3MWUsICAweDFmYmYsIDB4MDcyMCwgIDB4MWZmZSwgMHgwNzIyLAorCS8qIDB4MDMwMiAqLworCTB4MDAwMCwgMHgwMDFhLCAgMHgwMDQxLCAweDA3MjQsICAweDAwNDMsIDB4MDcyZSwgIDB4MDA0NSwgMHgwNzMwLAorCTB4MDA0NywgMHgwNzNhLCAgMHgwMDQ4LCAweDA3M2MsICAweDAwNDksIDB4MDczZSwgIDB4MDA0YSwgMHgwNzQwLAorCTB4MDA0ZiwgMHgwNzQyLCAgMHgwMDUzLCAweDA3NGMsICAweDAwNTUsIDB4MDc0ZSwgIDB4MDA1NywgMHgwNzUwLAorCTB4MDA1OSwgMHgwNzUyLCAgMHgwMDVhLCAweDA3NTQsICAweDAwNjEsIDB4MDc1NiwgIDB4MDA2MywgMHgwNzYwLAorCTB4MDA2NSwgMHgwNzYyLCAgMHgwMDY3LCAweDA3NmMsICAweDAwNjgsIDB4MDc2ZSwgIDB4MDA2OSwgMHgwNzcwLAorCTB4MDA2YSwgMHgwNzcyLCAgMHgwMDZmLCAweDA3NzQsICAweDAwNzMsIDB4MDc3ZSwgIDB4MDA3NSwgMHgwNzgwLAorCTB4MDA3NywgMHgwNzgyLCAgMHgwMDc5LCAweDA3ODQsICAweDAwN2EsIDB4MDc4NiwKKwkvKiAweDAzMDMgKi8KKwkweDAwMDAsIDB4MDAxMCwgIDB4MDA0MSwgMHgwNzg4LCAgMHgwMDQ1LCAweDA3OGEsICAweDAwNDksIDB4MDc4YywKKwkweDAwNGUsIDB4MDc4ZSwgIDB4MDA0ZiwgMHgwNzkwLCAgMHgwMDU1LCAweDA3OTYsICAweDAwNTYsIDB4MDc5YSwKKwkweDAwNTksIDB4MDc5YywgIDB4MDA2MSwgMHgwNzllLCAgMHgwMDY1LCAweDA3YTAsICAweDAwNjksIDB4MDdhMiwKKwkweDAwNmUsIDB4MDdhNCwgIDB4MDA2ZiwgMHgwN2E2LCAgMHgwMDc1LCAweDA3YWMsICAweDAwNzYsIDB4MDdiMCwKKwkweDAwNzksIDB4MDdiMiwKKwkvKiAweDAzMDQgKi8KKwkweDAwMDAsIDB4MDAxOCwgIDB4MDA0MSwgMHgwN2I0LCAgMHgwMDQ1LCAweDA3YjYsICAweDAwNDcsIDB4MDdiYywKKwkweDAwNDksIDB4MDdiZSwgIDB4MDA0ZiwgMHgwN2MwLCAgMHgwMDU1LCAweDA3YzYsICAweDAwNjEsIDB4MDdjYSwKKwkweDAwNjUsIDB4MDdjYywgIDB4MDA2NywgMHgwN2QyLCAgMHgwMDY5LCAweDA3ZDQsICAweDAwNmYsIDB4MDdkNiwKKwkweDAwNzUsIDB4MDdkYywgIDB4MDBjNiwgMHgwN2UwLCAgMHgwMGU2LCAweDA3ZTIsICAweDAzOTEsIDB4MDdlNCwKKwkweDAzOTksIDB4MDdlNiwgIDB4MDNhNSwgMHgwN2U4LCAgMHgwM2IxLCAweDA3ZWEsICAweDAzYjksIDB4MDdlYywKKwkweDAzYzUsIDB4MDdlZSwgIDB4MDQxOCwgMHgwN2YwLCAgMHgwNDIzLCAweDA3ZjIsICAweDA0MzgsIDB4MDdmNCwKKwkweDA0NDMsIDB4MDdmNiwKKwkvKiAweDAzMDYgKi8KKwkweDAwMDAsIDB4MDAxYywgIDB4MDA0MSwgMHgwN2Y4LCAgMHgwMDQ1LCAweDA4MDIsICAweDAwNDcsIDB4MDgwNCwKKwkweDAwNDksIDB4MDgwNiwgIDB4MDA0ZiwgMHgwODA4LCAgMHgwMDU1LCAweDA4MGEsICAweDAwNjEsIDB4MDgwYywKKwkweDAwNjUsIDB4MDgxNiwgIDB4MDA2NywgMHgwODE4LCAgMHgwMDY5LCAweDA4MWEsICAweDAwNmYsIDB4MDgxYywKKwkweDAwNzUsIDB4MDgxZSwgIDB4MDM5MSwgMHgwODIwLCAgMHgwMzk5LCAweDA4MjIsICAweDAzYTUsIDB4MDgyNCwKKwkweDAzYjEsIDB4MDgyNiwgIDB4MDNiOSwgMHgwODI4LCAgMHgwM2M1LCAweDA4MmEsICAweDA0MTAsIDB4MDgyYywKKwkweDA0MTUsIDB4MDgyZSwgIDB4MDQxNiwgMHgwODMwLCAgMHgwNDE4LCAweDA4MzIsICAweDA0MjMsIDB4MDgzNCwKKwkweDA0MzAsIDB4MDgzNiwgIDB4MDQzNSwgMHgwODM4LCAgMHgwNDM2LCAweDA4M2EsICAweDA0MzgsIDB4MDgzYywKKwkweDA0NDMsIDB4MDgzZSwKKwkvKiAweDAzMDcgKi8KKwkweDAwMDAsIDB4MDAyNywgIDB4MDA0MSwgMHgwODQwLCAgMHgwMDQyLCAweDA4NDQsICAweDAwNDMsIDB4MDg0NiwKKwkweDAwNDQsIDB4MDg0OCwgIDB4MDA0NSwgMHgwODRhLCAgMHgwMDQ2LCAweDA4NGMsICAweDAwNDcsIDB4MDg0ZSwKKwkweDAwNDgsIDB4MDg1MCwgIDB4MDA0OSwgMHgwODUyLCAgMHgwMDRkLCAweDA4NTQsICAweDAwNGUsIDB4MDg1NiwKKwkweDAwNTAsIDB4MDg1OCwgIDB4MDA1MiwgMHgwODVhLCAgMHgwMDUzLCAweDA4NWMsICAweDAwNTQsIDB4MDg1ZSwKKwkweDAwNTcsIDB4MDg2MCwgIDB4MDA1OCwgMHgwODYyLCAgMHgwMDU5LCAweDA4NjQsICAweDAwNWEsIDB4MDg2NiwKKwkweDAwNjEsIDB4MDg2OCwgIDB4MDA2MiwgMHgwODZjLCAgMHgwMDYzLCAweDA4NmUsICAweDAwNjQsIDB4MDg3MCwKKwkweDAwNjUsIDB4MDg3MiwgIDB4MDA2NiwgMHgwODc0LCAgMHgwMDY3LCAweDA4NzYsICAweDAwNjgsIDB4MDg3OCwKKwkweDAwNmQsIDB4MDg3YSwgIDB4MDA2ZSwgMHgwODdjLCAgMHgwMDcwLCAweDA4N2UsICAweDAwNzIsIDB4MDg4MCwKKwkweDAwNzMsIDB4MDg4MiwgIDB4MDA3NCwgMHgwODg0LCAgMHgwMDc3LCAweDA4ODYsICAweDAwNzgsIDB4MDg4OCwKKwkweDAwNzksIDB4MDg4YSwgIDB4MDA3YSwgMHgwODhjLCAgMHgwMTdmLCAweDA4OGUsICAweDAzMDYsIDB4MDg5MCwKKwkvKiAweDAzMDggKi8KKwkweDAwMDAsIDB4MDAzMCwgIDB4MDA0MSwgMHgwODkyLCAgMHgwMDQ1LCAweDA4OTYsICAweDAwNDgsIDB4MDg5OCwKKwkweDAwNDksIDB4MDg5YSwgIDB4MDA0ZiwgMHgwODllLCAgMHgwMDU1LCAweDA4YTAsICAweDAwNTcsIDB4MDhhYSwKKwkweDAwNTgsIDB4MDhhYywgIDB4MDA1OSwgMHgwOGFlLCAgMHgwMDYxLCAweDA4YjAsICAweDAwNjUsIDB4MDhiNCwKKwkweDAwNjgsIDB4MDhiNiwgIDB4MDA2OSwgMHgwOGI4LCAgMHgwMDZmLCAweDA4YmMsICAweDAwNzQsIDB4MDhiZSwKKwkweDAwNzUsIDB4MDhjMCwgIDB4MDA3NywgMHgwOGNhLCAgMHgwMDc4LCAweDA4Y2MsICAweDAwNzksIDB4MDhjZSwKKwkweDAxOGYsIDB4MDhkMCwgIDB4MDE5ZiwgMHgwOGQyLCAgMHgwMjU5LCAweDA4ZDQsICAweDAyNzUsIDB4MDhkNiwKKwkweDAzOTksIDB4MDhkOCwgIDB4MDNhNSwgMHgwOGRhLCAgMHgwM2I5LCAweDA4ZGMsICAweDAzYzUsIDB4MDhlNiwKKwkweDAzZDIsIDB4MDhmMCwgIDB4MDQwNiwgMHgwOGYyLCAgMHgwNDEwLCAweDA4ZjQsICAweDA0MTUsIDB4MDhmNiwKKwkweDA0MTYsIDB4MDhmOCwgIDB4MDQxNywgMHgwOGZhLCAgMHgwNDE4LCAweDA4ZmMsICAweDA0MWUsIDB4MDhmZSwKKwkweDA0MjMsIDB4MDkwMCwgIDB4MDQyNywgMHgwOTAyLCAgMHgwNDJiLCAweDA5MDQsICAweDA0MzAsIDB4MDkwNiwKKwkweDA0MzUsIDB4MDkwOCwgIDB4MDQzNiwgMHgwOTBhLCAgMHgwNDM3LCAweDA5MGMsICAweDA0MzgsIDB4MDkwZSwKKwkweDA0M2UsIDB4MDkxMCwgIDB4MDQ0MywgMHgwOTEyLCAgMHgwNDQ3LCAweDA5MTQsICAweDA0NGIsIDB4MDkxNiwKKwkweDA0NTYsIDB4MDkxOCwKKwkvKiAweDAzMDkgKi8KKwkweDAwMDAsIDB4MDAwYywgIDB4MDA0MSwgMHgwOTFhLCAgMHgwMDQ1LCAweDA5MWMsICAweDAwNDksIDB4MDkxZSwKKwkweDAwNGYsIDB4MDkyMCwgIDB4MDA1NSwgMHgwOTIyLCAgMHgwMDU5LCAweDA5MjQsICAweDAwNjEsIDB4MDkyNiwKKwkweDAwNjUsIDB4MDkyOCwgIDB4MDA2OSwgMHgwOTJhLCAgMHgwMDZmLCAweDA5MmMsICAweDAwNzUsIDB4MDkyZSwKKwkweDAwNzksIDB4MDkzMCwKKwkvKiAweDAzMGEgKi8KKwkweDAwMDAsIDB4MDAwNiwgIDB4MDA0MSwgMHgwOTMyLCAgMHgwMDU1LCAweDA5MzYsICAweDAwNjEsIDB4MDkzOCwKKwkweDAwNzUsIDB4MDkzYywgIDB4MDA3NywgMHgwOTNlLCAgMHgwMDc5LCAweDA5NDAsCisJLyogMHgwMzBiICovCisJMHgwMDAwLCAweDAwMDYsICAweDAwNGYsIDB4MDk0MiwgIDB4MDA1NSwgMHgwOTQ0LCAgMHgwMDZmLCAweDA5NDYsCisJMHgwMDc1LCAweDA5NDgsICAweDA0MjMsIDB4MDk0YSwgIDB4MDQ0MywgMHgwOTRjLAorCS8qIDB4MDMwYyAqLworCTB4MDAwMCwgMHgwMDIxLCAgMHgwMDQxLCAweDA5NGUsICAweDAwNDMsIDB4MDk1MCwgIDB4MDA0NCwgMHgwOTUyLAorCTB4MDA0NSwgMHgwOTU0LCAgMHgwMDQ3LCAweDA5NTYsICAweDAwNDksIDB4MDk1OCwgIDB4MDA0YiwgMHgwOTVhLAorCTB4MDA0YywgMHgwOTVjLCAgMHgwMDRlLCAweDA5NWUsICAweDAwNGYsIDB4MDk2MCwgIDB4MDA1MiwgMHgwOTYyLAorCTB4MDA1MywgMHgwOTY0LCAgMHgwMDU0LCAweDA5NjgsICAweDAwNTUsIDB4MDk2YSwgIDB4MDA1YSwgMHgwOTZjLAorCTB4MDA2MSwgMHgwOTZlLCAgMHgwMDYzLCAweDA5NzAsICAweDAwNjQsIDB4MDk3MiwgIDB4MDA2NSwgMHgwOTc0LAorCTB4MDA2NywgMHgwOTc2LCAgMHgwMDY5LCAweDA5NzgsICAweDAwNmEsIDB4MDk3YSwgIDB4MDA2YiwgMHgwOTdjLAorCTB4MDA2YywgMHgwOTdlLCAgMHgwMDZlLCAweDA5ODAsICAweDAwNmYsIDB4MDk4MiwgIDB4MDA3MiwgMHgwOTg0LAorCTB4MDA3MywgMHgwOTg2LCAgMHgwMDc0LCAweDA5OGEsICAweDAwNzUsIDB4MDk4YywgIDB4MDA3YSwgMHgwOThlLAorCTB4MDFiNywgMHgwOTkwLCAgMHgwMjkyLCAweDA5OTIsCisJLyogMHgwMzBkICovCisJMHgwMDAwLCAweDAwMTEsICAweDAwYTgsIDB4MDk5NCwgIDB4MDMwOCwgMHgwOTk2LCAgMHgwMzkxLCAweDA5OTgsCisJMHgwMzk1LCAweDA5OWEsICAweDAzOTcsIDB4MDk5YywgIDB4MDM5OSwgMHgwOTllLCAgMHgwMzlmLCAweDA5YTAsCisJMHgwM2E1LCAweDA5YTIsICAweDAzYTksIDB4MDlhNCwgIDB4MDNiMSwgMHgwOWE2LCAgMHgwM2I1LCAweDA5YTgsCisJMHgwM2I3LCAweDA5YWEsICAweDAzYjksIDB4MDlhYywgIDB4MDNiZiwgMHgwOWFlLCAgMHgwM2M1LCAweDA5YjAsCisJMHgwM2M5LCAweDA5YjIsICAweDAzZDIsIDB4MDliNCwKKwkvKiAweDAzMGYgKi8KKwkweDAwMDAsIDB4MDAwZSwgIDB4MDA0MSwgMHgwOWI2LCAgMHgwMDQ1LCAweDA5YjgsICAweDAwNDksIDB4MDliYSwKKwkweDAwNGYsIDB4MDliYywgIDB4MDA1MiwgMHgwOWJlLCAgMHgwMDU1LCAweDA5YzAsICAweDAwNjEsIDB4MDljMiwKKwkweDAwNjUsIDB4MDljNCwgIDB4MDA2OSwgMHgwOWM2LCAgMHgwMDZmLCAweDA5YzgsICAweDAwNzIsIDB4MDljYSwKKwkweDAwNzUsIDB4MDljYywgIDB4MDQ3NCwgMHgwOWNlLCAgMHgwNDc1LCAweDA5ZDAsCisJLyogMHgwMzExICovCisJMHgwMDAwLCAweDAwMGMsICAweDAwNDEsIDB4MDlkMiwgIDB4MDA0NSwgMHgwOWQ0LCAgMHgwMDQ5LCAweDA5ZDYsCisJMHgwMDRmLCAweDA5ZDgsICAweDAwNTIsIDB4MDlkYSwgIDB4MDA1NSwgMHgwOWRjLCAgMHgwMDYxLCAweDA5ZGUsCisJMHgwMDY1LCAweDA5ZTAsICAweDAwNjksIDB4MDllMiwgIDB4MDA2ZiwgMHgwOWU0LCAgMHgwMDcyLCAweDA5ZTYsCisJMHgwMDc1LCAweDA5ZTgsCisJLyogMHgwMzEzICovCisJMHgwMzQzLCAweDAwMGUsICAweDAzOTEsIDB4MDllYSwgIDB4MDM5NSwgMHgwOWYyLCAgMHgwMzk3LCAweDA5ZjgsCisJMHgwMzk5LCAweDBhMDAsICAweDAzOWYsIDB4MGEwOCwgIDB4MDNhOSwgMHgwYTBlLCAgMHgwM2IxLCAweDBhMTYsCisJMHgwM2I1LCAweDBhMWUsICAweDAzYjcsIDB4MGEyNCwgIDB4MDNiOSwgMHgwYTJjLCAgMHgwM2JmLCAweDBhMzQsCisJMHgwM2MxLCAweDBhM2EsICAweDAzYzUsIDB4MGEzYywgIDB4MDNjOSwgMHgwYTQ0LAorCS8qIDB4MDMxNCAqLworCTB4MDAwMCwgMHgwMDEwLCAgMHgwMzkxLCAweDBhNGMsICAweDAzOTUsIDB4MGE1NCwgIDB4MDM5NywgMHgwYTVhLAorCTB4MDM5OSwgMHgwYTYyLCAgMHgwMzlmLCAweDBhNmEsICAweDAzYTEsIDB4MGE3MCwgIDB4MDNhNSwgMHgwYTcyLAorCTB4MDNhOSwgMHgwYTdhLCAgMHgwM2IxLCAweDBhODIsICAweDAzYjUsIDB4MGE4YSwgIDB4MDNiNywgMHgwYTkwLAorCTB4MDNiOSwgMHgwYTk4LCAgMHgwM2JmLCAweDBhYTAsICAweDAzYzEsIDB4MGFhNiwgIDB4MDNjNSwgMHgwYWE4LAorCTB4MDNjOSwgMHgwYWIwLAorCS8qIDB4MDMxYiAqLworCTB4MDAwMCwgMHgwMDA0LCAgMHgwMDRmLCAweDBhYjgsICAweDAwNTUsIDB4MGFjNCwgIDB4MDA2ZiwgMHgwYWQwLAorCTB4MDA3NSwgMHgwYWRjLAorCS8qIDB4MDMyMyAqLworCTB4MDAwMCwgMHgwMDI2LCAgMHgwMDQxLCAweDBhZTgsICAweDAwNDIsIDB4MGFlZSwgIDB4MDA0NCwgMHgwYWYwLAorCTB4MDA0NSwgMHgwYWYyLCAgMHgwMDQ4LCAweDBhZjYsICAweDAwNDksIDB4MGFmOCwgIDB4MDA0YiwgMHgwYWZhLAorCTB4MDA0YywgMHgwYWZjLCAgMHgwMDRkLCAweDBiMDAsICAweDAwNGUsIDB4MGIwMiwgIDB4MDA0ZiwgMHgwYjA0LAorCTB4MDA1MiwgMHgwYjA4LCAgMHgwMDUzLCAweDBiMGMsICAweDAwNTQsIDB4MGIxMCwgIDB4MDA1NSwgMHgwYjEyLAorCTB4MDA1NiwgMHgwYjE0LCAgMHgwMDU3LCAweDBiMTYsICAweDAwNTksIDB4MGIxOCwgIDB4MDA1YSwgMHgwYjFhLAorCTB4MDA2MSwgMHgwYjFjLCAgMHgwMDYyLCAweDBiMjIsICAweDAwNjQsIDB4MGIyNCwgIDB4MDA2NSwgMHgwYjI2LAorCTB4MDA2OCwgMHgwYjJhLCAgMHgwMDY5LCAweDBiMmMsICAweDAwNmIsIDB4MGIyZSwgIDB4MDA2YywgMHgwYjMwLAorCTB4MDA2ZCwgMHgwYjM0LCAgMHgwMDZlLCAweDBiMzYsICAweDAwNmYsIDB4MGIzOCwgIDB4MDA3MiwgMHgwYjNjLAorCTB4MDA3MywgMHgwYjQwLCAgMHgwMDc0LCAweDBiNDQsICAweDAwNzUsIDB4MGI0NiwgIDB4MDA3NiwgMHgwYjQ4LAorCTB4MDA3NywgMHgwYjRhLCAgMHgwMDc5LCAweDBiNGMsICAweDAwN2EsIDB4MGI0ZSwKKwkvKiAweDAzMjQgKi8KKwkweDAwMDAsIDB4MDAwMiwgIDB4MDA1NSwgMHgwYjUwLCAgMHgwMDc1LCAweDBiNTIsCisJLyogMHgwMzI1ICovCisJMHgwMDAwLCAweDAwMDIsICAweDAwNDEsIDB4MGI1NCwgIDB4MDA2MSwgMHgwYjU2LAorCS8qIDB4MDMyNyAqLworCTB4MDAwMCwgMHgwMDE2LCAgMHgwMDQzLCAweDBiNTgsICAweDAwNDQsIDB4MGI1YywgIDB4MDA0NSwgMHgwYjVlLAorCTB4MDA0NywgMHgwYjYyLCAgMHgwMDQ4LCAweDBiNjQsICAweDAwNGIsIDB4MGI2NiwgIDB4MDA0YywgMHgwYjY4LAorCTB4MDA0ZSwgMHgwYjZhLCAgMHgwMDUyLCAweDBiNmMsICAweDAwNTMsIDB4MGI2ZSwgIDB4MDA1NCwgMHgwYjcwLAorCTB4MDA2MywgMHgwYjcyLCAgMHgwMDY0LCAweDBiNzYsICAweDAwNjUsIDB4MGI3OCwgIDB4MDA2NywgMHgwYjdjLAorCTB4MDA2OCwgMHgwYjdlLCAgMHgwMDZiLCAweDBiODAsICAweDAwNmMsIDB4MGI4MiwgIDB4MDA2ZSwgMHgwYjg0LAorCTB4MDA3MiwgMHgwYjg2LCAgMHgwMDczLCAweDBiODgsICAweDAwNzQsIDB4MGI4YSwKKwkvKiAweDAzMjggKi8KKwkweDAwMDAsIDB4MDAwYSwgIDB4MDA0MSwgMHgwYjhjLCAgMHgwMDQ1LCAweDBiOGUsICAweDAwNDksIDB4MGI5MCwKKwkweDAwNGYsIDB4MGI5MiwgIDB4MDA1NSwgMHgwYjk2LCAgMHgwMDYxLCAweDBiOTgsICAweDAwNjUsIDB4MGI5YSwKKwkweDAwNjksIDB4MGI5YywgIDB4MDA2ZiwgMHgwYjllLCAgMHgwMDc1LCAweDBiYTIsCisJLyogMHgwMzJkICovCisJMHgwMDAwLCAweDAwMGMsICAweDAwNDQsIDB4MGJhNCwgIDB4MDA0NSwgMHgwYmE2LCAgMHgwMDRjLCAweDBiYTgsCisJMHgwMDRlLCAweDBiYWEsICAweDAwNTQsIDB4MGJhYywgIDB4MDA1NSwgMHgwYmFlLCAgMHgwMDY0LCAweDBiYjAsCisJMHgwMDY1LCAweDBiYjIsICAweDAwNmMsIDB4MGJiNCwgIDB4MDA2ZSwgMHgwYmI2LCAgMHgwMDc0LCAweDBiYjgsCisJMHgwMDc1LCAweDBiYmEsCisJLyogMHgwMzJlICovCisJMHgwMDAwLCAweDAwMDIsICAweDAwNDgsIDB4MGJiYywgIDB4MDA2OCwgMHgwYmJlLAorCS8qIDB4MDMzMCAqLworCTB4MDAwMCwgMHgwMDA2LCAgMHgwMDQ1LCAweDBiYzAsICAweDAwNDksIDB4MGJjMiwgIDB4MDA1NSwgMHgwYmM0LAorCTB4MDA2NSwgMHgwYmM2LCAgMHgwMDY5LCAweDBiYzgsICAweDAwNzUsIDB4MGJjYSwKKwkvKiAweDAzMzEgKi8KKwkweDAwMDAsIDB4MDAxMSwgIDB4MDA0MiwgMHgwYmNjLCAgMHgwMDQ0LCAweDBiY2UsICAweDAwNGIsIDB4MGJkMCwKKwkweDAwNGMsIDB4MGJkMiwgIDB4MDA0ZSwgMHgwYmQ0LCAgMHgwMDUyLCAweDBiZDYsICAweDAwNTQsIDB4MGJkOCwKKwkweDAwNWEsIDB4MGJkYSwgIDB4MDA2MiwgMHgwYmRjLCAgMHgwMDY0LCAweDBiZGUsICAweDAwNjgsIDB4MGJlMCwKKwkweDAwNmIsIDB4MGJlMiwgIDB4MDA2YywgMHgwYmU0LCAgMHgwMDZlLCAweDBiZTYsICAweDAwNzIsIDB4MGJlOCwKKwkweDAwNzQsIDB4MGJlYSwgIDB4MDA3YSwgMHgwYmVjLAorCS8qIDB4MDM0MiAqLworCTB4MDAwMCwgMHgwMDA4LCAgMHgwMGE4LCAweDBiZWUsICAweDAzYjEsIDB4MGJmMCwgIDB4MDNiNywgMHgwYmYyLAorCTB4MDNiOSwgMHgwYmY0LCAgMHgwM2M1LCAweDBiZjYsICAweDAzYzksIDB4MGJmOCwgIDB4MWZiZiwgMHgwYmZhLAorCTB4MWZmZSwgMHgwYmZjLAorCS8qIDB4MDM0NSAqLworCTB4MDAwMCwgMHgwMDA3LCAgMHgwMzkxLCAweDBiZmUsICAweDAzOTcsIDB4MGMwNCwgIDB4MDNhOSwgMHgwYzBhLAorCTB4MDNiMSwgMHgwYzEwLCAgMHgwM2I3LCAweDBjMWMsICAweDAzYmYsIDB4MGMyOCwgIDB4MDNjOSwgMHgwYzJjLAorCS8qIDB4MDViNyAqLworCTB4MDAwMCwgMHgwMDAyLCAgMHgwNWQwLCAweDBjMzYsICAweDA1ZjIsIDB4MGMzOCwKKwkvKiAweDA1YjggKi8KKwkweDAwMDAsIDB4MDAwMSwgIDB4MDVkMCwgMHgwYzNhLAorCS8qIDB4MDViOSAqLworCTB4MDAwMCwgMHgwMDAxLCAgMHgwNWQ1LCAweDBjM2MsCisJLyogMHgwNWJjICovCisJMHgwMDAwLCAweDAwMTYsICAweDA1ZDAsIDB4MGMzZSwgIDB4MDVkMSwgMHgwYzQwLCAgMHgwNWQyLCAweDBjNDIsCisJMHgwNWQzLCAweDBjNDQsICAweDA1ZDQsIDB4MGM0NiwgIDB4MDVkNSwgMHgwYzQ4LCAgMHgwNWQ2LCAweDBjNGEsCisJMHgwNWQ4LCAweDBjNGMsICAweDA1ZDksIDB4MGM0ZSwgIDB4MDVkYSwgMHgwYzUwLCAgMHgwNWRiLCAweDBjNTIsCisJMHgwNWRjLCAweDBjNTQsICAweDA1ZGUsIDB4MGM1NiwgIDB4MDVlMCwgMHgwYzU4LCAgMHgwNWUxLCAweDBjNWEsCisJMHgwNWUzLCAweDBjNWMsICAweDA1ZTQsIDB4MGM1ZSwgIDB4MDVlNiwgMHgwYzYwLCAgMHgwNWU3LCAweDBjNjIsCisJMHgwNWU4LCAweDBjNjQsICAweDA1ZTksIDB4MGM2NiwgIDB4MDVlYSwgMHgwYzZjLAorCS8qIDB4MDViZiAqLworCTB4MDAwMCwgMHgwMDAzLCAgMHgwNWQxLCAweDBjNmUsICAweDA1ZGIsIDB4MGM3MCwgIDB4MDVlNCwgMHgwYzcyLAorCS8qIDB4MDVjMSAqLworCTB4MDAwMCwgMHgwMDAxLCAgMHgwNWU5LCAweDBjNzQsCisJLyogMHgwNWMyICovCisJMHgwMDAwLCAweDAwMDEsICAweDA1ZTksIDB4MGM3NiwKKwkvKiAweDA5M2MgKi8KKwkweDAwMDAsIDB4MDAwYiwgIDB4MDkxNSwgMHgwYzc4LCAgMHgwOTE2LCAweDBjN2EsICAweDA5MTcsIDB4MGM3YywKKwkweDA5MWMsIDB4MGM3ZSwgIDB4MDkyMSwgMHgwYzgwLCAgMHgwOTIyLCAweDBjODIsICAweDA5MjgsIDB4MGM4NCwKKwkweDA5MmIsIDB4MGM4NiwgIDB4MDkyZiwgMHgwYzg4LCAgMHgwOTMwLCAweDBjOGEsICAweDA5MzMsIDB4MGM4YywKKwkvKiAweDA5YmMgKi8KKwkweDAwMDAsIDB4MDAwNCwgIDB4MDlhMSwgMHgwYzhlLCAgMHgwOWEyLCAweDBjOTAsICAweDA5YWMsIDB4MGM5MiwKKwkweDA5YWYsIDB4MGM5NCwKKwkvKiAweDA5YmUgKi8KKwkweDAwMDAsIDB4MDAwMSwgIDB4MDljNywgMHgwYzk2LAorCS8qIDB4MDlkNyAqLworCTB4MDAwMCwgMHgwMDAxLCAgMHgwOWM3LCAweDBjOTgsCisJLyogMHgwYTNjICovCisJMHgwMDAwLCAweDAwMDUsICAweDBhMTYsIDB4MGM5YSwgIDB4MGExNywgMHgwYzljLCAgMHgwYTFjLCAweDBjOWUsCisJMHgwYTIxLCAweDBjYTAsICAweDBhMmIsIDB4MGNhMiwKKwkvKiAweDBiM2MgKi8KKwkweDAwMDAsIDB4MDAwMywgIDB4MGIyMSwgMHgwY2E0LCAgMHgwYjIyLCAweDBjYTYsICAweDBiMmYsIDB4MGNhOCwKKwkvKiAweDBiM2UgKi8KKwkweDAwMDAsIDB4MDAwMSwgIDB4MGI0NywgMHgwY2FhLAorCS8qIDB4MGI1NiAqLworCTB4MDAwMCwgMHgwMDAxLCAgMHgwYjQ3LCAweDBjYWMsCisJLyogMHgwYjU3ICovCisJMHgwMDAwLCAweDAwMDEsICAweDBiNDcsIDB4MGNhZSwKKwkvKiAweDBiYmUgKi8KKwkweDAwMDAsIDB4MDAwMiwgIDB4MGJjNiwgMHgwY2IwLCAgMHgwYmM3LCAweDBjYjIsCisJLyogMHgwYmQ3ICovCisJMHgwMDAwLCAweDAwMDIsICAweDBiOTIsIDB4MGNiNCwgIDB4MGJjNiwgMHgwY2I2LAorCS8qIDB4MGM1NiAqLworCTB4MDAwMCwgMHgwMDAxLCAgMHgwYzQ2LCAweDBjYjgsCisJLyogMHgwY2MyICovCisJMHgwMDAwLCAweDAwMDEsICAweDBjYzYsIDB4MGNiYSwKKwkvKiAweDBjZDUgKi8KKwkweDAwMDAsIDB4MDAwMiwgIDB4MGNiZiwgMHgwY2JlLCAgMHgwY2M2LCAweDBjYzAsCisJLyogMHgwY2Q2ICovCisJMHgwMDAwLCAweDAwMDEsICAweDBjYzYsIDB4MGNjMiwKKwkvKiAweDBkM2UgKi8KKwkweDAwMDAsIDB4MDAwMiwgIDB4MGQ0NiwgMHgwY2M0LCAgMHgwZDQ3LCAweDBjYzYsCisJLyogMHgwZDU3ICovCisJMHgwMDAwLCAweDAwMDEsICAweDBkNDYsIDB4MGNjOCwKKwkvKiAweDBlMzIgKi8KKwkweDAwMDAsIDB4MDAwMSwgIDB4MGU0ZCwgMHgwY2NhLAorCS8qIDB4MGViMiAqLworCTB4MDAwMCwgMHgwMDAxLCAgMHgwZWNkLCAweDBjY2MsCisJLyogMHgwZjcxICovCisJMHgwMDAwLCAweDAwMDMsICAweDBmNzIsIDB4MGNjZSwgIDB4MGY3NCwgMHgwY2QwLCAgMHgwZjgwLCAweDBjZDIsCisJLyogMHgwZjgwICovCisJMHgwMDAwLCAweDAwMDIsICAweDBmYjIsIDB4MGNkNCwgIDB4MGZiMywgMHgwY2Q4LAorCS8qIDB4MGZiNSAqLworCTB4MDAwMCwgMHgwMDAyLCAgMHgwZjQwLCAweDBjZGMsICAweDBmOTAsIDB4MGNkZSwKKwkvKiAweDBmYjcgKi8KKwkweDAwMDAsIDB4MDAwYSwgIDB4MGY0MiwgMHgwY2UwLCAgMHgwZjRjLCAweDBjZTIsICAweDBmNTEsIDB4MGNlNCwKKwkweDBmNTYsIDB4MGNlNiwgIDB4MGY1YiwgMHgwY2U4LCAgMHgwZjkyLCAweDBjZWEsICAweDBmOWMsIDB4MGNlYywKKwkweDBmYTEsIDB4MGNlZSwgIDB4MGZhNiwgMHgwY2YwLCAgMHgwZmFiLCAweDBjZjIsCisJLyogMHgzMDk5ICovCisJMHgwMDAwLCAweDAwMzAsICAweDMwNDYsIDB4MGNmNCwgIDB4MzA0YiwgMHgwY2Y2LCAgMHgzMDRkLCAweDBjZjgsCisJMHgzMDRmLCAweDBjZmEsICAweDMwNTEsIDB4MGNmYywgIDB4MzA1MywgMHgwY2ZlLCAgMHgzMDU1LCAweDBkMDAsCisJMHgzMDU3LCAweDBkMDIsICAweDMwNTksIDB4MGQwNCwgIDB4MzA1YiwgMHgwZDA2LCAgMHgzMDVkLCAweDBkMDgsCisJMHgzMDVmLCAweDBkMGEsICAweDMwNjEsIDB4MGQwYywgIDB4MzA2NCwgMHgwZDBlLCAgMHgzMDY2LCAweDBkMTAsCisJMHgzMDY4LCAweDBkMTIsICAweDMwNmYsIDB4MGQxNCwgIDB4MzA3MiwgMHgwZDE2LCAgMHgzMDc1LCAweDBkMTgsCisJMHgzMDc4LCAweDBkMWEsICAweDMwN2IsIDB4MGQxYywgIDB4MzA5ZCwgMHgwZDFlLCAgMHgzMGE2LCAweDBkMjAsCisJMHgzMGFiLCAweDBkMjIsICAweDMwYWQsIDB4MGQyNCwgIDB4MzBhZiwgMHgwZDI2LCAgMHgzMGIxLCAweDBkMjgsCisJMHgzMGIzLCAweDBkMmEsICAweDMwYjUsIDB4MGQyYywgIDB4MzBiNywgMHgwZDJlLCAgMHgzMGI5LCAweDBkMzAsCisJMHgzMGJiLCAweDBkMzIsICAweDMwYmQsIDB4MGQzNCwgIDB4MzBiZiwgMHgwZDM2LCAgMHgzMGMxLCAweDBkMzgsCisJMHgzMGM0LCAweDBkM2EsICAweDMwYzYsIDB4MGQzYywgIDB4MzBjOCwgMHgwZDNlLCAgMHgzMGNmLCAweDBkNDAsCisJMHgzMGQyLCAweDBkNDIsICAweDMwZDUsIDB4MGQ0NCwgIDB4MzBkOCwgMHgwZDQ2LCAgMHgzMGRiLCAweDBkNDgsCisJMHgzMGVmLCAweDBkNGEsICAweDMwZjAsIDB4MGQ0YywgIDB4MzBmMSwgMHgwZDRlLCAgMHgzMGYyLCAweDBkNTAsCisJMHgzMGZkLCAweDBkNTIsCisJLyogMHgzMDlhICovCisJMHgwMDAwLCAweDAwMGEsICAweDMwNmYsIDB4MGQ1NCwgIDB4MzA3MiwgMHgwZDU2LCAgMHgzMDc1LCAweDBkNTgsCisJMHgzMDc4LCAweDBkNWEsICAweDMwN2IsIDB4MGQ1YywgIDB4MzBjZiwgMHgwZDVlLCAgMHgzMGQyLCAweDBkNjAsCisJMHgzMGQ1LCAweDBkNjIsICAweDMwZDgsIDB4MGQ2NCwgIDB4MzBkYiwgMHgwZDY2LAorCS8qIDB4MDA0MSAweDAzMDAgKi8KKwkweDAwYzAsIDB4MDAwMCwKKwkvKiAweDAwNDUgMHgwMzAwICovCisJMHgwMGM4LCAweDAwMDAsCisJLyogMHgwMDQ5IDB4MDMwMCAqLworCTB4MDBjYywgMHgwMDAwLAorCS8qIDB4MDA0ZiAweDAzMDAgKi8KKwkweDAwZDIsIDB4MDAwMCwKKwkvKiAweDAwNTUgMHgwMzAwICovCisJMHgwMGQ5LCAweDAwMDAsCisJLyogMHgwMDU3IDB4MDMwMCAqLworCTB4MWU4MCwgMHgwMDAwLAorCS8qIDB4MDA1OSAweDAzMDAgKi8KKwkweDFlZjIsIDB4MDAwMCwKKwkvKiAweDAwNjEgMHgwMzAwICovCisJMHgwMGUwLCAweDAwMDAsCisJLyogMHgwMDY1IDB4MDMwMCAqLworCTB4MDBlOCwgMHgwMDAwLAorCS8qIDB4MDA2OSAweDAzMDAgKi8KKwkweDAwZWMsIDB4MDAwMCwKKwkvKiAweDAwNmYgMHgwMzAwICovCisJMHgwMGYyLCAweDAwMDAsCisJLyogMHgwMDc1IDB4MDMwMCAqLworCTB4MDBmOSwgMHgwMDAwLAorCS8qIDB4MDA3NyAweDAzMDAgKi8KKwkweDFlODEsIDB4MDAwMCwKKwkvKiAweDAwNzkgMHgwMzAwICovCisJMHgxZWYzLCAweDAwMDAsCisJLyogMHgwMGE4IDB4MDMwMCAqLworCTB4MWZlZCwgMHgwMDAwLAorCS8qIDB4MDM5MSAweDAzMDAgKi8KKwkweDFmYmEsIDB4MDAwMCwKKwkvKiAweDAzOTUgMHgwMzAwICovCisJMHgxZmM4LCAweDAwMDAsCisJLyogMHgwMzk3IDB4MDMwMCAqLworCTB4MWZjYSwgMHgwMDAwLAorCS8qIDB4MDM5OSAweDAzMDAgKi8KKwkweDFmZGEsIDB4MDAwMCwKKwkvKiAweDAzOWYgMHgwMzAwICovCisJMHgxZmY4LCAweDAwMDAsCisJLyogMHgwM2E1IDB4MDMwMCAqLworCTB4MWZlYSwgMHgwMDAwLAorCS8qIDB4MDNhOSAweDAzMDAgKi8KKwkweDFmZmEsIDB4MDAwMCwKKwkvKiAweDAzYjEgMHgwMzAwICovCisJMHgxZjcwLCAweDAwMDAsCisJLyogMHgwM2I1IDB4MDMwMCAqLworCTB4MWY3MiwgMHgwMDAwLAorCS8qIDB4MDNiNyAweDAzMDAgKi8KKwkweDFmNzQsIDB4MDAwMCwKKwkvKiAweDAzYjkgMHgwMzAwICovCisJMHgxZjc2LCAweDAwMDAsCisJLyogMHgwM2JmIDB4MDMwMCAqLworCTB4MWY3OCwgMHgwMDAwLAorCS8qIDB4MDNjNSAweDAzMDAgKi8KKwkweDFmN2EsIDB4MDAwMCwKKwkvKiAweDAzYzkgMHgwMzAwICovCisJMHgxZjdjLCAweDAwMDAsCisJLyogMHgxZmJmIDB4MDMwMCAqLworCTB4MWZjZCwgMHgwMDAwLAorCS8qIDB4MWZmZSAweDAzMDAgKi8KKwkweDFmZGQsIDB4MDAwMCwKKwkvKiAweDAwNDEgMHgwMzAxICovCisJMHgwMGMxLCAweDAwMDAsCisJLyogMHgwMDQzIDB4MDMwMSAqLworCTB4MDEwNiwgMHgwMDAwLAorCS8qIDB4MDA0NSAweDAzMDEgKi8KKwkweDAwYzksIDB4MDAwMCwKKwkvKiAweDAwNDcgMHgwMzAxICovCisJMHgwMWY0LCAweDAwMDAsCisJLyogMHgwMDQ5IDB4MDMwMSAqLworCTB4MDBjZCwgMHgwMDAwLAorCS8qIDB4MDA0YiAweDAzMDEgKi8KKwkweDFlMzAsIDB4MDAwMCwKKwkvKiAweDAwNGMgMHgwMzAxICovCisJMHgwMTM5LCAweDAwMDAsCisJLyogMHgwMDRkIDB4MDMwMSAqLworCTB4MWUzZSwgMHgwMDAwLAorCS8qIDB4MDA0ZSAweDAzMDEgKi8KKwkweDAxNDMsIDB4MDAwMCwKKwkvKiAweDAwNGYgMHgwMzAxICovCisJMHgwMGQzLCAweDAwMDAsCisJLyogMHgwMDUwIDB4MDMwMSAqLworCTB4MWU1NCwgMHgwMDAwLAorCS8qIDB4MDA1MiAweDAzMDEgKi8KKwkweDAxNTQsIDB4MDAwMCwKKwkvKiAweDAwNTMgMHgwMzAxICovCisJMHgwMTVhLCAweDAwMDEsICAweDAzMDcsIDB4MGQ2OCwKKwkvKiAweDAwNTUgMHgwMzAxICovCisJMHgwMGRhLCAweDAwMDAsCisJLyogMHgwMDU3IDB4MDMwMSAqLworCTB4MWU4MiwgMHgwMDAwLAorCS8qIDB4MDA1OSAweDAzMDEgKi8KKwkweDAwZGQsIDB4MDAwMCwKKwkvKiAweDAwNWEgMHgwMzAxICovCisJMHgwMTc5LCAweDAwMDAsCisJLyogMHgwMDYxIDB4MDMwMSAqLworCTB4MDBlMSwgMHgwMDAwLAorCS8qIDB4MDA2MyAweDAzMDEgKi8KKwkweDAxMDcsIDB4MDAwMCwKKwkvKiAweDAwNjUgMHgwMzAxICovCisJMHgwMGU5LCAweDAwMDAsCisJLyogMHgwMDY3IDB4MDMwMSAqLworCTB4MDFmNSwgMHgwMDAwLAorCS8qIDB4MDA2OSAweDAzMDEgKi8KKwkweDAwZWQsIDB4MDAwMCwKKwkvKiAweDAwNmIgMHgwMzAxICovCisJMHgxZTMxLCAweDAwMDAsCisJLyogMHgwMDZjIDB4MDMwMSAqLworCTB4MDEzYSwgMHgwMDAwLAorCS8qIDB4MDA2ZCAweDAzMDEgKi8KKwkweDFlM2YsIDB4MDAwMCwKKwkvKiAweDAwNmUgMHgwMzAxICovCisJMHgwMTQ0LCAweDAwMDAsCisJLyogMHgwMDZmIDB4MDMwMSAqLworCTB4MDBmMywgMHgwMDAwLAorCS8qIDB4MDA3MCAweDAzMDEgKi8KKwkweDFlNTUsIDB4MDAwMCwKKwkvKiAweDAwNzIgMHgwMzAxICovCisJMHgwMTU1LCAweDAwMDAsCisJLyogMHgwMDczIDB4MDMwMSAqLworCTB4MDE1YiwgMHgwMDAxLCAgMHgwMzA3LCAweDBkNmEsCisJLyogMHgwMDc1IDB4MDMwMSAqLworCTB4MDBmYSwgMHgwMDAwLAorCS8qIDB4MDA3NyAweDAzMDEgKi8KKwkweDFlODMsIDB4MDAwMCwKKwkvKiAweDAwNzkgMHgwMzAxICovCisJMHgwMGZkLCAweDAwMDAsCisJLyogMHgwMDdhIDB4MDMwMSAqLworCTB4MDE3YSwgMHgwMDAwLAorCS8qIDB4MDBhOCAweDAzMDEgKi8KKwkweDFmZWUsIDB4MDAwMCwKKwkvKiAweDAwYzYgMHgwMzAxICovCisJMHgwMWZjLCAweDAwMDAsCisJLyogMHgwMGQ4IDB4MDMwMSAqLworCTB4MDFmZSwgMHgwMDAwLAorCS8qIDB4MDBlNiAweDAzMDEgKi8KKwkweDAxZmQsIDB4MDAwMCwKKwkvKiAweDAwZjggMHgwMzAxICovCisJMHgwMWZmLCAweDAwMDAsCisJLyogMHgwMzkxIDB4MDMwMSAqLworCTB4MWZiYiwgMHgwMDAwLAorCS8qIDB4MDM5NSAweDAzMDEgKi8KKwkweDFmYzksIDB4MDAwMCwKKwkvKiAweDAzOTcgMHgwMzAxICovCisJMHgxZmNiLCAweDAwMDAsCisJLyogMHgwMzk5IDB4MDMwMSAqLworCTB4MWZkYiwgMHgwMDAwLAorCS8qIDB4MDM5ZiAweDAzMDEgKi8KKwkweDFmZjksIDB4MDAwMCwKKwkvKiAweDAzYTUgMHgwMzAxICovCisJMHgxZmViLCAweDAwMDAsCisJLyogMHgwM2E5IDB4MDMwMSAqLworCTB4MWZmYiwgMHgwMDAwLAorCS8qIDB4MDNiMSAweDAzMDEgKi8KKwkweDFmNzEsIDB4MDAwMCwKKwkvKiAweDAzYjUgMHgwMzAxICovCisJMHgxZjczLCAweDAwMDAsCisJLyogMHgwM2I3IDB4MDMwMSAqLworCTB4MWY3NSwgMHgwMDAwLAorCS8qIDB4MDNiOSAweDAzMDEgKi8KKwkweDFmNzcsIDB4MDAwMCwKKwkvKiAweDAzYmYgMHgwMzAxICovCisJMHgxZjc5LCAweDAwMDAsCisJLyogMHgwM2M1IDB4MDMwMSAqLworCTB4MWY3YiwgMHgwMDAwLAorCS8qIDB4MDNjOSAweDAzMDEgKi8KKwkweDFmN2QsIDB4MDAwMCwKKwkvKiAweDA0MTMgMHgwMzAxICovCisJMHgwNDAzLCAweDAwMDAsCisJLyogMHgwNDFhIDB4MDMwMSAqLworCTB4MDQwYywgMHgwMDAwLAorCS8qIDB4MDQzMyAweDAzMDEgKi8KKwkweDA0NTMsIDB4MDAwMCwKKwkvKiAweDA0M2EgMHgwMzAxICovCisJMHgwNDVjLCAweDAwMDAsCisJLyogMHgxZmJmIDB4MDMwMSAqLworCTB4MWZjZSwgMHgwMDAwLAorCS8qIDB4MWZmZSAweDAzMDEgKi8KKwkweDFmZGUsIDB4MDAwMCwKKwkvKiAweDAwNDEgMHgwMzAyICovCisJMHgwMGMyLCAweDAwMDQsICAweDAzMDAsIDB4MGQ2YywgIDB4MDMwMSwgMHgwZDZlLCAgMHgwMzAzLCAweDBkNzAsCisJMHgwMzA5LCAweDBkNzIsCisJLyogMHgwMDQzIDB4MDMwMiAqLworCTB4MDEwOCwgMHgwMDAwLAorCS8qIDB4MDA0NSAweDAzMDIgKi8KKwkweDAwY2EsIDB4MDAwNCwgIDB4MDMwMCwgMHgwZDc0LCAgMHgwMzAxLCAweDBkNzYsICAweDAzMDMsIDB4MGQ3OCwKKwkweDAzMDksIDB4MGQ3YSwKKwkvKiAweDAwNDcgMHgwMzAyICovCisJMHgwMTFjLCAweDAwMDAsCisJLyogMHgwMDQ4IDB4MDMwMiAqLworCTB4MDEyNCwgMHgwMDAwLAorCS8qIDB4MDA0OSAweDAzMDIgKi8KKwkweDAwY2UsIDB4MDAwMCwKKwkvKiAweDAwNGEgMHgwMzAyICovCisJMHgwMTM0LCAweDAwMDAsCisJLyogMHgwMDRmIDB4MDMwMiAqLworCTB4MDBkNCwgMHgwMDA0LCAgMHgwMzAwLCAweDBkN2MsICAweDAzMDEsIDB4MGQ3ZSwgIDB4MDMwMywgMHgwZDgwLAorCTB4MDMwOSwgMHgwZDgyLAorCS8qIDB4MDA1MyAweDAzMDIgKi8KKwkweDAxNWMsIDB4MDAwMCwKKwkvKiAweDAwNTUgMHgwMzAyICovCisJMHgwMGRiLCAweDAwMDAsCisJLyogMHgwMDU3IDB4MDMwMiAqLworCTB4MDE3NCwgMHgwMDAwLAorCS8qIDB4MDA1OSAweDAzMDIgKi8KKwkweDAxNzYsIDB4MDAwMCwKKwkvKiAweDAwNWEgMHgwMzAyICovCisJMHgxZTkwLCAweDAwMDAsCisJLyogMHgwMDYxIDB4MDMwMiAqLworCTB4MDBlMiwgMHgwMDA0LCAgMHgwMzAwLCAweDBkODQsICAweDAzMDEsIDB4MGQ4NiwgIDB4MDMwMywgMHgwZDg4LAorCTB4MDMwOSwgMHgwZDhhLAorCS8qIDB4MDA2MyAweDAzMDIgKi8KKwkweDAxMDksIDB4MDAwMCwKKwkvKiAweDAwNjUgMHgwMzAyICovCisJMHgwMGVhLCAweDAwMDQsICAweDAzMDAsIDB4MGQ4YywgIDB4MDMwMSwgMHgwZDhlLCAgMHgwMzAzLCAweDBkOTAsCisJMHgwMzA5LCAweDBkOTIsCisJLyogMHgwMDY3IDB4MDMwMiAqLworCTB4MDExZCwgMHgwMDAwLAorCS8qIDB4MDA2OCAweDAzMDIgKi8KKwkweDAxMjUsIDB4MDAwMCwKKwkvKiAweDAwNjkgMHgwMzAyICovCisJMHgwMGVlLCAweDAwMDAsCisJLyogMHgwMDZhIDB4MDMwMiAqLworCTB4MDEzNSwgMHgwMDAwLAorCS8qIDB4MDA2ZiAweDAzMDIgKi8KKwkweDAwZjQsIDB4MDAwNCwgIDB4MDMwMCwgMHgwZDk0LCAgMHgwMzAxLCAweDBkOTYsICAweDAzMDMsIDB4MGQ5OCwKKwkweDAzMDksIDB4MGQ5YSwKKwkvKiAweDAwNzMgMHgwMzAyICovCisJMHgwMTVkLCAweDAwMDAsCisJLyogMHgwMDc1IDB4MDMwMiAqLworCTB4MDBmYiwgMHgwMDAwLAorCS8qIDB4MDA3NyAweDAzMDIgKi8KKwkweDAxNzUsIDB4MDAwMCwKKwkvKiAweDAwNzkgMHgwMzAyICovCisJMHgwMTc3LCAweDAwMDAsCisJLyogMHgwMDdhIDB4MDMwMiAqLworCTB4MWU5MSwgMHgwMDAwLAorCS8qIDB4MDA0MSAweDAzMDMgKi8KKwkweDAwYzMsIDB4MDAwMCwKKwkvKiAweDAwNDUgMHgwMzAzICovCisJMHgxZWJjLCAweDAwMDAsCisJLyogMHgwMDQ5IDB4MDMwMyAqLworCTB4MDEyOCwgMHgwMDAwLAorCS8qIDB4MDA0ZSAweDAzMDMgKi8KKwkweDAwZDEsIDB4MDAwMCwKKwkvKiAweDAwNGYgMHgwMzAzICovCisJMHgwMGQ1LCAweDAwMDIsICAweDAzMDEsIDB4MGQ5YywgIDB4MDMwOCwgMHgwZDllLAorCS8qIDB4MDA1NSAweDAzMDMgKi8KKwkweDAxNjgsIDB4MDAwMSwgIDB4MDMwMSwgMHgwZGEwLAorCS8qIDB4MDA1NiAweDAzMDMgKi8KKwkweDFlN2MsIDB4MDAwMCwKKwkvKiAweDAwNTkgMHgwMzAzICovCisJMHgxZWY4LCAweDAwMDAsCisJLyogMHgwMDYxIDB4MDMwMyAqLworCTB4MDBlMywgMHgwMDAwLAorCS8qIDB4MDA2NSAweDAzMDMgKi8KKwkweDFlYmQsIDB4MDAwMCwKKwkvKiAweDAwNjkgMHgwMzAzICovCisJMHgwMTI5LCAweDAwMDAsCisJLyogMHgwMDZlIDB4MDMwMyAqLworCTB4MDBmMSwgMHgwMDAwLAorCS8qIDB4MDA2ZiAweDAzMDMgKi8KKwkweDAwZjUsIDB4MDAwMiwgIDB4MDMwMSwgMHgwZGEyLCAgMHgwMzA4LCAweDBkYTQsCisJLyogMHgwMDc1IDB4MDMwMyAqLworCTB4MDE2OSwgMHgwMDAxLCAgMHgwMzAxLCAweDBkYTYsCisJLyogMHgwMDc2IDB4MDMwMyAqLworCTB4MWU3ZCwgMHgwMDAwLAorCS8qIDB4MDA3OSAweDAzMDMgKi8KKwkweDFlZjksIDB4MDAwMCwKKwkvKiAweDAwNDEgMHgwMzA0ICovCisJMHgwMTAwLCAweDAwMDAsCisJLyogMHgwMDQ1IDB4MDMwNCAqLworCTB4MDExMiwgMHgwMDAyLCAgMHgwMzAwLCAweDBkYTgsICAweDAzMDEsIDB4MGRhYSwKKwkvKiAweDAwNDcgMHgwMzA0ICovCisJMHgxZTIwLCAweDAwMDAsCisJLyogMHgwMDQ5IDB4MDMwNCAqLworCTB4MDEyYSwgMHgwMDAwLAorCS8qIDB4MDA0ZiAweDAzMDQgKi8KKwkweDAxNGMsIDB4MDAwMiwgIDB4MDMwMCwgMHgwZGFjLCAgMHgwMzAxLCAweDBkYWUsCisJLyogMHgwMDU1IDB4MDMwNCAqLworCTB4MDE2YSwgMHgwMDAxLCAgMHgwMzA4LCAweDBkYjAsCisJLyogMHgwMDYxIDB4MDMwNCAqLworCTB4MDEwMSwgMHgwMDAwLAorCS8qIDB4MDA2NSAweDAzMDQgKi8KKwkweDAxMTMsIDB4MDAwMiwgIDB4MDMwMCwgMHgwZGIyLCAgMHgwMzAxLCAweDBkYjQsCisJLyogMHgwMDY3IDB4MDMwNCAqLworCTB4MWUyMSwgMHgwMDAwLAorCS8qIDB4MDA2OSAweDAzMDQgKi8KKwkweDAxMmIsIDB4MDAwMCwKKwkvKiAweDAwNmYgMHgwMzA0ICovCisJMHgwMTRkLCAweDAwMDIsICAweDAzMDAsIDB4MGRiNiwgIDB4MDMwMSwgMHgwZGI4LAorCS8qIDB4MDA3NSAweDAzMDQgKi8KKwkweDAxNmIsIDB4MDAwMSwgIDB4MDMwOCwgMHgwZGJhLAorCS8qIDB4MDBjNiAweDAzMDQgKi8KKwkweDAxZTIsIDB4MDAwMCwKKwkvKiAweDAwZTYgMHgwMzA0ICovCisJMHgwMWUzLCAweDAwMDAsCisJLyogMHgwMzkxIDB4MDMwNCAqLworCTB4MWZiOSwgMHgwMDAwLAorCS8qIDB4MDM5OSAweDAzMDQgKi8KKwkweDFmZDksIDB4MDAwMCwKKwkvKiAweDAzYTUgMHgwMzA0ICovCisJMHgxZmU5LCAweDAwMDAsCisJLyogMHgwM2IxIDB4MDMwNCAqLworCTB4MWZiMSwgMHgwMDAwLAorCS8qIDB4MDNiOSAweDAzMDQgKi8KKwkweDFmZDEsIDB4MDAwMCwKKwkvKiAweDAzYzUgMHgwMzA0ICovCisJMHgxZmUxLCAweDAwMDAsCisJLyogMHgwNDE4IDB4MDMwNCAqLworCTB4MDRlMiwgMHgwMDAwLAorCS8qIDB4MDQyMyAweDAzMDQgKi8KKwkweDA0ZWUsIDB4MDAwMCwKKwkvKiAweDA0MzggMHgwMzA0ICovCisJMHgwNGUzLCAweDAwMDAsCisJLyogMHgwNDQzIDB4MDMwNCAqLworCTB4MDRlZiwgMHgwMDAwLAorCS8qIDB4MDA0MSAweDAzMDYgKi8KKwkweDAxMDIsIDB4MDAwNCwgIDB4MDMwMCwgMHgwZGJjLCAgMHgwMzAxLCAweDBkYmUsICAweDAzMDMsIDB4MGRjMCwKKwkweDAzMDksIDB4MGRjMiwKKwkvKiAweDAwNDUgMHgwMzA2ICovCisJMHgwMTE0LCAweDAwMDAsCisJLyogMHgwMDQ3IDB4MDMwNiAqLworCTB4MDExZSwgMHgwMDAwLAorCS8qIDB4MDA0OSAweDAzMDYgKi8KKwkweDAxMmMsIDB4MDAwMCwKKwkvKiAweDAwNGYgMHgwMzA2ICovCisJMHgwMTRlLCAweDAwMDAsCisJLyogMHgwMDU1IDB4MDMwNiAqLworCTB4MDE2YywgMHgwMDAwLAorCS8qIDB4MDA2MSAweDAzMDYgKi8KKwkweDAxMDMsIDB4MDAwNCwgIDB4MDMwMCwgMHgwZGM0LCAgMHgwMzAxLCAweDBkYzYsICAweDAzMDMsIDB4MGRjOCwKKwkweDAzMDksIDB4MGRjYSwKKwkvKiAweDAwNjUgMHgwMzA2ICovCisJMHgwMTE1LCAweDAwMDAsCisJLyogMHgwMDY3IDB4MDMwNiAqLworCTB4MDExZiwgMHgwMDAwLAorCS8qIDB4MDA2OSAweDAzMDYgKi8KKwkweDAxMmQsIDB4MDAwMCwKKwkvKiAweDAwNmYgMHgwMzA2ICovCisJMHgwMTRmLCAweDAwMDAsCisJLyogMHgwMDc1IDB4MDMwNiAqLworCTB4MDE2ZCwgMHgwMDAwLAorCS8qIDB4MDM5MSAweDAzMDYgKi8KKwkweDFmYjgsIDB4MDAwMCwKKwkvKiAweDAzOTkgMHgwMzA2ICovCisJMHgxZmQ4LCAweDAwMDAsCisJLyogMHgwM2E1IDB4MDMwNiAqLworCTB4MWZlOCwgMHgwMDAwLAorCS8qIDB4MDNiMSAweDAzMDYgKi8KKwkweDFmYjAsIDB4MDAwMCwKKwkvKiAweDAzYjkgMHgwMzA2ICovCisJMHgxZmQwLCAweDAwMDAsCisJLyogMHgwM2M1IDB4MDMwNiAqLworCTB4MWZlMCwgMHgwMDAwLAorCS8qIDB4MDQxMCAweDAzMDYgKi8KKwkweDA0ZDAsIDB4MDAwMCwKKwkvKiAweDA0MTUgMHgwMzA2ICovCisJMHgwNGQ2LCAweDAwMDAsCisJLyogMHgwNDE2IDB4MDMwNiAqLworCTB4MDRjMSwgMHgwMDAwLAorCS8qIDB4MDQxOCAweDAzMDYgKi8KKwkweDA0MTksIDB4MDAwMCwKKwkvKiAweDA0MjMgMHgwMzA2ICovCisJMHgwNDBlLCAweDAwMDAsCisJLyogMHgwNDMwIDB4MDMwNiAqLworCTB4MDRkMSwgMHgwMDAwLAorCS8qIDB4MDQzNSAweDAzMDYgKi8KKwkweDA0ZDcsIDB4MDAwMCwKKwkvKiAweDA0MzYgMHgwMzA2ICovCisJMHgwNGMyLCAweDAwMDAsCisJLyogMHgwNDM4IDB4MDMwNiAqLworCTB4MDQzOSwgMHgwMDAwLAorCS8qIDB4MDQ0MyAweDAzMDYgKi8KKwkweDA0NWUsIDB4MDAwMCwKKwkvKiAweDAwNDEgMHgwMzA3ICovCisJMHgwMDAwLCAweDAwMDEsICAweDAzMDQsIDB4MGRjYywKKwkvKiAweDAwNDIgMHgwMzA3ICovCisJMHgxZTAyLCAweDAwMDAsCisJLyogMHgwMDQzIDB4MDMwNyAqLworCTB4MDEwYSwgMHgwMDAwLAorCS8qIDB4MDA0NCAweDAzMDcgKi8KKwkweDFlMGEsIDB4MDAwMCwKKwkvKiAweDAwNDUgMHgwMzA3ICovCisJMHgwMTE2LCAweDAwMDAsCisJLyogMHgwMDQ2IDB4MDMwNyAqLworCTB4MWUxZSwgMHgwMDAwLAorCS8qIDB4MDA0NyAweDAzMDcgKi8KKwkweDAxMjAsIDB4MDAwMCwKKwkvKiAweDAwNDggMHgwMzA3ICovCisJMHgxZTIyLCAweDAwMDAsCisJLyogMHgwMDQ5IDB4MDMwNyAqLworCTB4MDEzMCwgMHgwMDAwLAorCS8qIDB4MDA0ZCAweDAzMDcgKi8KKwkweDFlNDAsIDB4MDAwMCwKKwkvKiAweDAwNGUgMHgwMzA3ICovCisJMHgxZTQ0LCAweDAwMDAsCisJLyogMHgwMDUwIDB4MDMwNyAqLworCTB4MWU1NiwgMHgwMDAwLAorCS8qIDB4MDA1MiAweDAzMDcgKi8KKwkweDFlNTgsIDB4MDAwMCwKKwkvKiAweDAwNTMgMHgwMzA3ICovCisJMHgxZTYwLCAweDAwMDAsCisJLyogMHgwMDU0IDB4MDMwNyAqLworCTB4MWU2YSwgMHgwMDAwLAorCS8qIDB4MDA1NyAweDAzMDcgKi8KKwkweDFlODYsIDB4MDAwMCwKKwkvKiAweDAwNTggMHgwMzA3ICovCisJMHgxZThhLCAweDAwMDAsCisJLyogMHgwMDU5IDB4MDMwNyAqLworCTB4MWU4ZSwgMHgwMDAwLAorCS8qIDB4MDA1YSAweDAzMDcgKi8KKwkweDAxN2IsIDB4MDAwMCwKKwkvKiAweDAwNjEgMHgwMzA3ICovCisJMHgwMDAwLCAweDAwMDEsICAweDAzMDQsIDB4MGRjZSwKKwkvKiAweDAwNjIgMHgwMzA3ICovCisJMHgxZTAzLCAweDAwMDAsCisJLyogMHgwMDYzIDB4MDMwNyAqLworCTB4MDEwYiwgMHgwMDAwLAorCS8qIDB4MDA2NCAweDAzMDcgKi8KKwkweDFlMGIsIDB4MDAwMCwKKwkvKiAweDAwNjUgMHgwMzA3ICovCisJMHgwMTE3LCAweDAwMDAsCisJLyogMHgwMDY2IDB4MDMwNyAqLworCTB4MWUxZiwgMHgwMDAwLAorCS8qIDB4MDA2NyAweDAzMDcgKi8KKwkweDAxMjEsIDB4MDAwMCwKKwkvKiAweDAwNjggMHgwMzA3ICovCisJMHgxZTIzLCAweDAwMDAsCisJLyogMHgwMDZkIDB4MDMwNyAqLworCTB4MWU0MSwgMHgwMDAwLAorCS8qIDB4MDA2ZSAweDAzMDcgKi8KKwkweDFlNDUsIDB4MDAwMCwKKwkvKiAweDAwNzAgMHgwMzA3ICovCisJMHgxZTU3LCAweDAwMDAsCisJLyogMHgwMDcyIDB4MDMwNyAqLworCTB4MWU1OSwgMHgwMDAwLAorCS8qIDB4MDA3MyAweDAzMDcgKi8KKwkweDFlNjEsIDB4MDAwMCwKKwkvKiAweDAwNzQgMHgwMzA3ICovCisJMHgxZTZiLCAweDAwMDAsCisJLyogMHgwMDc3IDB4MDMwNyAqLworCTB4MWU4NywgMHgwMDAwLAorCS8qIDB4MDA3OCAweDAzMDcgKi8KKwkweDFlOGIsIDB4MDAwMCwKKwkvKiAweDAwNzkgMHgwMzA3ICovCisJMHgxZThmLCAweDAwMDAsCisJLyogMHgwMDdhIDB4MDMwNyAqLworCTB4MDE3YywgMHgwMDAwLAorCS8qIDB4MDE3ZiAweDAzMDcgKi8KKwkweDFlOWIsIDB4MDAwMCwKKwkvKiAweDAzMDYgMHgwMzA3ICovCisJMHgwMzEwLCAweDAwMDAsCisJLyogMHgwMDQxIDB4MDMwOCAqLworCTB4MDBjNCwgMHgwMDAxLCAgMHgwMzA0LCAweDBkZDAsCisJLyogMHgwMDQ1IDB4MDMwOCAqLworCTB4MDBjYiwgMHgwMDAwLAorCS8qIDB4MDA0OCAweDAzMDggKi8KKwkweDFlMjYsIDB4MDAwMCwKKwkvKiAweDAwNDkgMHgwMzA4ICovCisJMHgwMGNmLCAweDAwMDEsICAweDAzMDEsIDB4MGRkMiwKKwkvKiAweDAwNGYgMHgwMzA4ICovCisJMHgwMGQ2LCAweDAwMDAsCisJLyogMHgwMDU1IDB4MDMwOCAqLworCTB4MDBkYywgMHgwMDA0LCAgMHgwMzAwLCAweDBkZDQsICAweDAzMDEsIDB4MGRkNiwgIDB4MDMwNCwgMHgwZGQ4LAorCTB4MDMwYywgMHgwZGRhLAorCS8qIDB4MDA1NyAweDAzMDggKi8KKwkweDFlODQsIDB4MDAwMCwKKwkvKiAweDAwNTggMHgwMzA4ICovCisJMHgxZThjLCAweDAwMDAsCisJLyogMHgwMDU5IDB4MDMwOCAqLworCTB4MDE3OCwgMHgwMDAwLAorCS8qIDB4MDA2MSAweDAzMDggKi8KKwkweDAwZTQsIDB4MDAwMSwgIDB4MDMwNCwgMHgwZGRjLAorCS8qIDB4MDA2NSAweDAzMDggKi8KKwkweDAwZWIsIDB4MDAwMCwKKwkvKiAweDAwNjggMHgwMzA4ICovCisJMHgxZTI3LCAweDAwMDAsCisJLyogMHgwMDY5IDB4MDMwOCAqLworCTB4MDBlZiwgMHgwMDAxLCAgMHgwMzAxLCAweDBkZGUsCisJLyogMHgwMDZmIDB4MDMwOCAqLworCTB4MDBmNiwgMHgwMDAwLAorCS8qIDB4MDA3NCAweDAzMDggKi8KKwkweDFlOTcsIDB4MDAwMCwKKwkvKiAweDAwNzUgMHgwMzA4ICovCisJMHgwMGZjLCAweDAwMDQsICAweDAzMDAsIDB4MGRlMCwgIDB4MDMwMSwgMHgwZGUyLCAgMHgwMzA0LCAweDBkZTQsCisJMHgwMzBjLCAweDBkZTYsCisJLyogMHgwMDc3IDB4MDMwOCAqLworCTB4MWU4NSwgMHgwMDAwLAorCS8qIDB4MDA3OCAweDAzMDggKi8KKwkweDFlOGQsIDB4MDAwMCwKKwkvKiAweDAwNzkgMHgwMzA4ICovCisJMHgwMGZmLCAweDAwMDAsCisJLyogMHgwMThmIDB4MDMwOCAqLworCTB4MDRkYSwgMHgwMDAwLAorCS8qIDB4MDE5ZiAweDAzMDggKi8KKwkweDA0ZWEsIDB4MDAwMCwKKwkvKiAweDAyNTkgMHgwMzA4ICovCisJMHgwNGRiLCAweDAwMDAsCisJLyogMHgwMjc1IDB4MDMwOCAqLworCTB4MDRlYiwgMHgwMDAwLAorCS8qIDB4MDM5OSAweDAzMDggKi8KKwkweDAzYWEsIDB4MDAwMCwKKwkvKiAweDAzYTUgMHgwMzA4ICovCisJMHgwM2FiLCAweDAwMDAsCisJLyogMHgwM2I5IDB4MDMwOCAqLworCTB4MDNjYSwgMHgwMDA0LCAgMHgwMzAwLCAweDBkZTgsICAweDAzMDEsIDB4MGRlYSwgIDB4MDMwZCwgMHgwZGVjLAorCTB4MDM0MiwgMHgwZGVlLAorCS8qIDB4MDNjNSAweDAzMDggKi8KKwkweDAzY2IsIDB4MDAwNCwgIDB4MDMwMCwgMHgwZGYwLCAgMHgwMzAxLCAweDBkZjIsICAweDAzMGQsIDB4MGRmNCwKKwkweDAzNDIsIDB4MGRmNiwKKwkvKiAweDAzZDIgMHgwMzA4ICovCisJMHgwM2Q0LCAweDAwMDAsCisJLyogMHgwNDA2IDB4MDMwOCAqLworCTB4MDQwNywgMHgwMDAwLAorCS8qIDB4MDQxMCAweDAzMDggKi8KKwkweDA0ZDIsIDB4MDAwMCwKKwkvKiAweDA0MTUgMHgwMzA4ICovCisJMHgwNDAxLCAweDAwMDAsCisJLyogMHgwNDE2IDB4MDMwOCAqLworCTB4MDRkYywgMHgwMDAwLAorCS8qIDB4MDQxNyAweDAzMDggKi8KKwkweDA0ZGUsIDB4MDAwMCwKKwkvKiAweDA0MTggMHgwMzA4ICovCisJMHgwNGU0LCAweDAwMDAsCisJLyogMHgwNDFlIDB4MDMwOCAqLworCTB4MDRlNiwgMHgwMDAwLAorCS8qIDB4MDQyMyAweDAzMDggKi8KKwkweDA0ZjAsIDB4MDAwMCwKKwkvKiAweDA0MjcgMHgwMzA4ICovCisJMHgwNGY0LCAweDAwMDAsCisJLyogMHgwNDJiIDB4MDMwOCAqLworCTB4MDRmOCwgMHgwMDAwLAorCS8qIDB4MDQzMCAweDAzMDggKi8KKwkweDA0ZDMsIDB4MDAwMCwKKwkvKiAweDA0MzUgMHgwMzA4ICovCisJMHgwNDUxLCAweDAwMDAsCisJLyogMHgwNDM2IDB4MDMwOCAqLworCTB4MDRkZCwgMHgwMDAwLAorCS8qIDB4MDQzNyAweDAzMDggKi8KKwkweDA0ZGYsIDB4MDAwMCwKKwkvKiAweDA0MzggMHgwMzA4ICovCisJMHgwNGU1LCAweDAwMDAsCisJLyogMHgwNDNlIDB4MDMwOCAqLworCTB4MDRlNywgMHgwMDAwLAorCS8qIDB4MDQ0MyAweDAzMDggKi8KKwkweDA0ZjEsIDB4MDAwMCwKKwkvKiAweDA0NDcgMHgwMzA4ICovCisJMHgwNGY1LCAweDAwMDAsCisJLyogMHgwNDRiIDB4MDMwOCAqLworCTB4MDRmOSwgMHgwMDAwLAorCS8qIDB4MDQ1NiAweDAzMDggKi8KKwkweDA0NTcsIDB4MDAwMCwKKwkvKiAweDAwNDEgMHgwMzA5ICovCisJMHgxZWEyLCAweDAwMDAsCisJLyogMHgwMDQ1IDB4MDMwOSAqLworCTB4MWViYSwgMHgwMDAwLAorCS8qIDB4MDA0OSAweDAzMDkgKi8KKwkweDFlYzgsIDB4MDAwMCwKKwkvKiAweDAwNGYgMHgwMzA5ICovCisJMHgxZWNlLCAweDAwMDAsCisJLyogMHgwMDU1IDB4MDMwOSAqLworCTB4MWVlNiwgMHgwMDAwLAorCS8qIDB4MDA1OSAweDAzMDkgKi8KKwkweDFlZjYsIDB4MDAwMCwKKwkvKiAweDAwNjEgMHgwMzA5ICovCisJMHgxZWEzLCAweDAwMDAsCisJLyogMHgwMDY1IDB4MDMwOSAqLworCTB4MWViYiwgMHgwMDAwLAorCS8qIDB4MDA2OSAweDAzMDkgKi8KKwkweDFlYzksIDB4MDAwMCwKKwkvKiAweDAwNmYgMHgwMzA5ICovCisJMHgxZWNmLCAweDAwMDAsCisJLyogMHgwMDc1IDB4MDMwOSAqLworCTB4MWVlNywgMHgwMDAwLAorCS8qIDB4MDA3OSAweDAzMDkgKi8KKwkweDFlZjcsIDB4MDAwMCwKKwkvKiAweDAwNDEgMHgwMzBhICovCisJMHgwMGM1LCAweDAwMDEsICAweDAzMDEsIDB4MGRmOCwKKwkvKiAweDAwNTUgMHgwMzBhICovCisJMHgwMTZlLCAweDAwMDAsCisJLyogMHgwMDYxIDB4MDMwYSAqLworCTB4MDBlNSwgMHgwMDAxLCAgMHgwMzAxLCAweDBkZmEsCisJLyogMHgwMDc1IDB4MDMwYSAqLworCTB4MDE2ZiwgMHgwMDAwLAorCS8qIDB4MDA3NyAweDAzMGEgKi8KKwkweDFlOTgsIDB4MDAwMCwKKwkvKiAweDAwNzkgMHgwMzBhICovCisJMHgxZTk5LCAweDAwMDAsCisJLyogMHgwMDRmIDB4MDMwYiAqLworCTB4MDE1MCwgMHgwMDAwLAorCS8qIDB4MDA1NSAweDAzMGIgKi8KKwkweDAxNzAsIDB4MDAwMCwKKwkvKiAweDAwNmYgMHgwMzBiICovCisJMHgwMTUxLCAweDAwMDAsCisJLyogMHgwMDc1IDB4MDMwYiAqLworCTB4MDE3MSwgMHgwMDAwLAorCS8qIDB4MDQyMyAweDAzMGIgKi8KKwkweDA0ZjIsIDB4MDAwMCwKKwkvKiAweDA0NDMgMHgwMzBiICovCisJMHgwNGYzLCAweDAwMDAsCisJLyogMHgwMDQxIDB4MDMwYyAqLworCTB4MDFjZCwgMHgwMDAwLAorCS8qIDB4MDA0MyAweDAzMGMgKi8KKwkweDAxMGMsIDB4MDAwMCwKKwkvKiAweDAwNDQgMHgwMzBjICovCisJMHgwMTBlLCAweDAwMDAsCisJLyogMHgwMDQ1IDB4MDMwYyAqLworCTB4MDExYSwgMHgwMDAwLAorCS8qIDB4MDA0NyAweDAzMGMgKi8KKwkweDAxZTYsIDB4MDAwMCwKKwkvKiAweDAwNDkgMHgwMzBjICovCisJMHgwMWNmLCAweDAwMDAsCisJLyogMHgwMDRiIDB4MDMwYyAqLworCTB4MDFlOCwgMHgwMDAwLAorCS8qIDB4MDA0YyAweDAzMGMgKi8KKwkweDAxM2QsIDB4MDAwMCwKKwkvKiAweDAwNGUgMHgwMzBjICovCisJMHgwMTQ3LCAweDAwMDAsCisJLyogMHgwMDRmIDB4MDMwYyAqLworCTB4MDFkMSwgMHgwMDAwLAorCS8qIDB4MDA1MiAweDAzMGMgKi8KKwkweDAxNTgsIDB4MDAwMCwKKwkvKiAweDAwNTMgMHgwMzBjICovCisJMHgwMTYwLCAweDAwMDEsICAweDAzMDcsIDB4MGRmYywKKwkvKiAweDAwNTQgMHgwMzBjICovCisJMHgwMTY0LCAweDAwMDAsCisJLyogMHgwMDU1IDB4MDMwYyAqLworCTB4MDFkMywgMHgwMDAwLAorCS8qIDB4MDA1YSAweDAzMGMgKi8KKwkweDAxN2QsIDB4MDAwMCwKKwkvKiAweDAwNjEgMHgwMzBjICovCisJMHgwMWNlLCAweDAwMDAsCisJLyogMHgwMDYzIDB4MDMwYyAqLworCTB4MDEwZCwgMHgwMDAwLAorCS8qIDB4MDA2NCAweDAzMGMgKi8KKwkweDAxMGYsIDB4MDAwMCwKKwkvKiAweDAwNjUgMHgwMzBjICovCisJMHgwMTFiLCAweDAwMDAsCisJLyogMHgwMDY3IDB4MDMwYyAqLworCTB4MDFlNywgMHgwMDAwLAorCS8qIDB4MDA2OSAweDAzMGMgKi8KKwkweDAxZDAsIDB4MDAwMCwKKwkvKiAweDAwNmEgMHgwMzBjICovCisJMHgwMWYwLCAweDAwMDAsCisJLyogMHgwMDZiIDB4MDMwYyAqLworCTB4MDFlOSwgMHgwMDAwLAorCS8qIDB4MDA2YyAweDAzMGMgKi8KKwkweDAxM2UsIDB4MDAwMCwKKwkvKiAweDAwNmUgMHgwMzBjICovCisJMHgwMTQ4LCAweDAwMDAsCisJLyogMHgwMDZmIDB4MDMwYyAqLworCTB4MDFkMiwgMHgwMDAwLAorCS8qIDB4MDA3MiAweDAzMGMgKi8KKwkweDAxNTksIDB4MDAwMCwKKwkvKiAweDAwNzMgMHgwMzBjICovCisJMHgwMTYxLCAweDAwMDEsICAweDAzMDcsIDB4MGRmZSwKKwkvKiAweDAwNzQgMHgwMzBjICovCisJMHgwMTY1LCAweDAwMDAsCisJLyogMHgwMDc1IDB4MDMwYyAqLworCTB4MDFkNCwgMHgwMDAwLAorCS8qIDB4MDA3YSAweDAzMGMgKi8KKwkweDAxN2UsIDB4MDAwMCwKKwkvKiAweDAxYjcgMHgwMzBjICovCisJMHgwMWVlLCAweDAwMDAsCisJLyogMHgwMjkyIDB4MDMwYyAqLworCTB4MDFlZiwgMHgwMDAwLAorCS8qIDB4MDBhOCAweDAzMGQgKi8KKwkweDAzODUsIDB4MDAwMCwKKwkvKiAweDAzMDggMHgwMzBkICovCisJMHgwMzQ0LCAweDAwMDAsCisJLyogMHgwMzkxIDB4MDMwZCAqLworCTB4MDM4NiwgMHgwMDAwLAorCS8qIDB4MDM5NSAweDAzMGQgKi8KKwkweDAzODgsIDB4MDAwMCwKKwkvKiAweDAzOTcgMHgwMzBkICovCisJMHgwMzg5LCAweDAwMDAsCisJLyogMHgwMzk5IDB4MDMwZCAqLworCTB4MDM4YSwgMHgwMDAwLAorCS8qIDB4MDM5ZiAweDAzMGQgKi8KKwkweDAzOGMsIDB4MDAwMCwKKwkvKiAweDAzYTUgMHgwMzBkICovCisJMHgwMzhlLCAweDAwMDAsCisJLyogMHgwM2E5IDB4MDMwZCAqLworCTB4MDM4ZiwgMHgwMDAwLAorCS8qIDB4MDNiMSAweDAzMGQgKi8KKwkweDAzYWMsIDB4MDAwMCwKKwkvKiAweDAzYjUgMHgwMzBkICovCisJMHgwM2FkLCAweDAwMDAsCisJLyogMHgwM2I3IDB4MDMwZCAqLworCTB4MDNhZSwgMHgwMDAwLAorCS8qIDB4MDNiOSAweDAzMGQgKi8KKwkweDAzYWYsIDB4MDAwMCwKKwkvKiAweDAzYmYgMHgwMzBkICovCisJMHgwM2NjLCAweDAwMDAsCisJLyogMHgwM2M1IDB4MDMwZCAqLworCTB4MDNjZCwgMHgwMDAwLAorCS8qIDB4MDNjOSAweDAzMGQgKi8KKwkweDAzY2UsIDB4MDAwMCwKKwkvKiAweDAzZDIgMHgwMzBkICovCisJMHgwM2QzLCAweDAwMDAsCisJLyogMHgwMDQxIDB4MDMwZiAqLworCTB4MDIwMCwgMHgwMDAwLAorCS8qIDB4MDA0NSAweDAzMGYgKi8KKwkweDAyMDQsIDB4MDAwMCwKKwkvKiAweDAwNDkgMHgwMzBmICovCisJMHgwMjA4LCAweDAwMDAsCisJLyogMHgwMDRmIDB4MDMwZiAqLworCTB4MDIwYywgMHgwMDAwLAorCS8qIDB4MDA1MiAweDAzMGYgKi8KKwkweDAyMTAsIDB4MDAwMCwKKwkvKiAweDAwNTUgMHgwMzBmICovCisJMHgwMjE0LCAweDAwMDAsCisJLyogMHgwMDYxIDB4MDMwZiAqLworCTB4MDIwMSwgMHgwMDAwLAorCS8qIDB4MDA2NSAweDAzMGYgKi8KKwkweDAyMDUsIDB4MDAwMCwKKwkvKiAweDAwNjkgMHgwMzBmICovCisJMHgwMjA5LCAweDAwMDAsCisJLyogMHgwMDZmIDB4MDMwZiAqLworCTB4MDIwZCwgMHgwMDAwLAorCS8qIDB4MDA3MiAweDAzMGYgKi8KKwkweDAyMTEsIDB4MDAwMCwKKwkvKiAweDAwNzUgMHgwMzBmICovCisJMHgwMjE1LCAweDAwMDAsCisJLyogMHgwNDc0IDB4MDMwZiAqLworCTB4MDQ3NiwgMHgwMDAwLAorCS8qIDB4MDQ3NSAweDAzMGYgKi8KKwkweDA0NzcsIDB4MDAwMCwKKwkvKiAweDAwNDEgMHgwMzExICovCisJMHgwMjAyLCAweDAwMDAsCisJLyogMHgwMDQ1IDB4MDMxMSAqLworCTB4MDIwNiwgMHgwMDAwLAorCS8qIDB4MDA0OSAweDAzMTEgKi8KKwkweDAyMGEsIDB4MDAwMCwKKwkvKiAweDAwNGYgMHgwMzExICovCisJMHgwMjBlLCAweDAwMDAsCisJLyogMHgwMDUyIDB4MDMxMSAqLworCTB4MDIxMiwgMHgwMDAwLAorCS8qIDB4MDA1NSAweDAzMTEgKi8KKwkweDAyMTYsIDB4MDAwMCwKKwkvKiAweDAwNjEgMHgwMzExICovCisJMHgwMjAzLCAweDAwMDAsCisJLyogMHgwMDY1IDB4MDMxMSAqLworCTB4MDIwNywgMHgwMDAwLAorCS8qIDB4MDA2OSAweDAzMTEgKi8KKwkweDAyMGIsIDB4MDAwMCwKKwkvKiAweDAwNmYgMHgwMzExICovCisJMHgwMjBmLCAweDAwMDAsCisJLyogMHgwMDcyIDB4MDMxMSAqLworCTB4MDIxMywgMHgwMDAwLAorCS8qIDB4MDA3NSAweDAzMTEgKi8KKwkweDAyMTcsIDB4MDAwMCwKKwkvKiAweDAzOTEgMHgwMzEzICovCisJMHgxZjA4LCAweDAwMDMsICAweDAzMDAsIDB4MGUwMCwgIDB4MDMwMSwgMHgwZTAyLCAgMHgwMzQyLCAweDBlMDQsCisJLyogMHgwMzk1IDB4MDMxMyAqLworCTB4MWYxOCwgMHgwMDAyLCAgMHgwMzAwLCAweDBlMDYsICAweDAzMDEsIDB4MGUwOCwKKwkvKiAweDAzOTcgMHgwMzEzICovCisJMHgxZjI4LCAweDAwMDMsICAweDAzMDAsIDB4MGUwYSwgIDB4MDMwMSwgMHgwZTBjLCAgMHgwMzQyLCAweDBlMGUsCisJLyogMHgwMzk5IDB4MDMxMyAqLworCTB4MWYzOCwgMHgwMDAzLCAgMHgwMzAwLCAweDBlMTAsICAweDAzMDEsIDB4MGUxMiwgIDB4MDM0MiwgMHgwZTE0LAorCS8qIDB4MDM5ZiAweDAzMTMgKi8KKwkweDFmNDgsIDB4MDAwMiwgIDB4MDMwMCwgMHgwZTE2LCAgMHgwMzAxLCAweDBlMTgsCisJLyogMHgwM2E5IDB4MDMxMyAqLworCTB4MWY2OCwgMHgwMDAzLCAgMHgwMzAwLCAweDBlMWEsICAweDAzMDEsIDB4MGUxYywgIDB4MDM0MiwgMHgwZTFlLAorCS8qIDB4MDNiMSAweDAzMTMgKi8KKwkweDFmMDAsIDB4MDAwMywgIDB4MDMwMCwgMHgwZTIwLCAgMHgwMzAxLCAweDBlMjIsICAweDAzNDIsIDB4MGUyNCwKKwkvKiAweDAzYjUgMHgwMzEzICovCisJMHgxZjEwLCAweDAwMDIsICAweDAzMDAsIDB4MGUyNiwgIDB4MDMwMSwgMHgwZTI4LAorCS8qIDB4MDNiNyAweDAzMTMgKi8KKwkweDFmMjAsIDB4MDAwMywgIDB4MDMwMCwgMHgwZTJhLCAgMHgwMzAxLCAweDBlMmMsICAweDAzNDIsIDB4MGUyZSwKKwkvKiAweDAzYjkgMHgwMzEzICovCisJMHgxZjMwLCAweDAwMDMsICAweDAzMDAsIDB4MGUzMCwgIDB4MDMwMSwgMHgwZTMyLCAgMHgwMzQyLCAweDBlMzQsCisJLyogMHgwM2JmIDB4MDMxMyAqLworCTB4MWY0MCwgMHgwMDAyLCAgMHgwMzAwLCAweDBlMzYsICAweDAzMDEsIDB4MGUzOCwKKwkvKiAweDAzYzEgMHgwMzEzICovCisJMHgxZmU0LCAweDAwMDAsCisJLyogMHgwM2M1IDB4MDMxMyAqLworCTB4MWY1MCwgMHgwMDAzLCAgMHgwMzAwLCAweDBlM2EsICAweDAzMDEsIDB4MGUzYywgIDB4MDM0MiwgMHgwZTNlLAorCS8qIDB4MDNjOSAweDAzMTMgKi8KKwkweDFmNjAsIDB4MDAwMywgIDB4MDMwMCwgMHgwZTQwLCAgMHgwMzAxLCAweDBlNDIsICAweDAzNDIsIDB4MGU0NCwKKwkvKiAweDAzOTEgMHgwMzE0ICovCisJMHgxZjA5LCAweDAwMDMsICAweDAzMDAsIDB4MGU0NiwgIDB4MDMwMSwgMHgwZTQ4LCAgMHgwMzQyLCAweDBlNGEsCisJLyogMHgwMzk1IDB4MDMxNCAqLworCTB4MWYxOSwgMHgwMDAyLCAgMHgwMzAwLCAweDBlNGMsICAweDAzMDEsIDB4MGU0ZSwKKwkvKiAweDAzOTcgMHgwMzE0ICovCisJMHgxZjI5LCAweDAwMDMsICAweDAzMDAsIDB4MGU1MCwgIDB4MDMwMSwgMHgwZTUyLCAgMHgwMzQyLCAweDBlNTQsCisJLyogMHgwMzk5IDB4MDMxNCAqLworCTB4MWYzOSwgMHgwMDAzLCAgMHgwMzAwLCAweDBlNTYsICAweDAzMDEsIDB4MGU1OCwgIDB4MDM0MiwgMHgwZTVhLAorCS8qIDB4MDM5ZiAweDAzMTQgKi8KKwkweDFmNDksIDB4MDAwMiwgIDB4MDMwMCwgMHgwZTVjLCAgMHgwMzAxLCAweDBlNWUsCisJLyogMHgwM2ExIDB4MDMxNCAqLworCTB4MWZlYywgMHgwMDAwLAorCS8qIDB4MDNhNSAweDAzMTQgKi8KKwkweDFmNTksIDB4MDAwMywgIDB4MDMwMCwgMHgwZTYwLCAgMHgwMzAxLCAweDBlNjIsICAweDAzNDIsIDB4MGU2NCwKKwkvKiAweDAzYTkgMHgwMzE0ICovCisJMHgxZjY5LCAweDAwMDMsICAweDAzMDAsIDB4MGU2NiwgIDB4MDMwMSwgMHgwZTY4LCAgMHgwMzQyLCAweDBlNmEsCisJLyogMHgwM2IxIDB4MDMxNCAqLworCTB4MWYwMSwgMHgwMDAzLCAgMHgwMzAwLCAweDBlNmMsICAweDAzMDEsIDB4MGU2ZSwgIDB4MDM0MiwgMHgwZTcwLAorCS8qIDB4MDNiNSAweDAzMTQgKi8KKwkweDFmMTEsIDB4MDAwMiwgIDB4MDMwMCwgMHgwZTcyLCAgMHgwMzAxLCAweDBlNzQsCisJLyogMHgwM2I3IDB4MDMxNCAqLworCTB4MWYyMSwgMHgwMDAzLCAgMHgwMzAwLCAweDBlNzYsICAweDAzMDEsIDB4MGU3OCwgIDB4MDM0MiwgMHgwZTdhLAorCS8qIDB4MDNiOSAweDAzMTQgKi8KKwkweDFmMzEsIDB4MDAwMywgIDB4MDMwMCwgMHgwZTdjLCAgMHgwMzAxLCAweDBlN2UsICAweDAzNDIsIDB4MGU4MCwKKwkvKiAweDAzYmYgMHgwMzE0ICovCisJMHgxZjQxLCAweDAwMDIsICAweDAzMDAsIDB4MGU4MiwgIDB4MDMwMSwgMHgwZTg0LAorCS8qIDB4MDNjMSAweDAzMTQgKi8KKwkweDFmZTUsIDB4MDAwMCwKKwkvKiAweDAzYzUgMHgwMzE0ICovCisJMHgxZjUxLCAweDAwMDMsICAweDAzMDAsIDB4MGU4NiwgIDB4MDMwMSwgMHgwZTg4LCAgMHgwMzQyLCAweDBlOGEsCisJLyogMHgwM2M5IDB4MDMxNCAqLworCTB4MWY2MSwgMHgwMDAzLCAgMHgwMzAwLCAweDBlOGMsICAweDAzMDEsIDB4MGU4ZSwgIDB4MDM0MiwgMHgwZTkwLAorCS8qIDB4MDA0ZiAweDAzMWIgKi8KKwkweDAxYTAsIDB4MDAwNSwgIDB4MDMwMCwgMHgwZTkyLCAgMHgwMzAxLCAweDBlOTQsICAweDAzMDMsIDB4MGU5NiwKKwkweDAzMDksIDB4MGU5OCwgIDB4MDMyMywgMHgwZTlhLAorCS8qIDB4MDA1NSAweDAzMWIgKi8KKwkweDAxYWYsIDB4MDAwNSwgIDB4MDMwMCwgMHgwZTljLCAgMHgwMzAxLCAweDBlOWUsICAweDAzMDMsIDB4MGVhMCwKKwkweDAzMDksIDB4MGVhMiwgIDB4MDMyMywgMHgwZWE0LAorCS8qIDB4MDA2ZiAweDAzMWIgKi8KKwkweDAxYTEsIDB4MDAwNSwgIDB4MDMwMCwgMHgwZWE2LCAgMHgwMzAxLCAweDBlYTgsICAweDAzMDMsIDB4MGVhYSwKKwkweDAzMDksIDB4MGVhYywgIDB4MDMyMywgMHgwZWFlLAorCS8qIDB4MDA3NSAweDAzMWIgKi8KKwkweDAxYjAsIDB4MDAwNSwgIDB4MDMwMCwgMHgwZWIwLCAgMHgwMzAxLCAweDBlYjIsICAweDAzMDMsIDB4MGViNCwKKwkweDAzMDksIDB4MGViNiwgIDB4MDMyMywgMHgwZWI4LAorCS8qIDB4MDA0MSAweDAzMjMgKi8KKwkweDFlYTAsIDB4MDAwMiwgIDB4MDMwMiwgMHgwZWJhLCAgMHgwMzA2LCAweDBlYmMsCisJLyogMHgwMDQyIDB4MDMyMyAqLworCTB4MWUwNCwgMHgwMDAwLAorCS8qIDB4MDA0NCAweDAzMjMgKi8KKwkweDFlMGMsIDB4MDAwMCwKKwkvKiAweDAwNDUgMHgwMzIzICovCisJMHgxZWI4LCAweDAwMDEsICAweDAzMDIsIDB4MGViZSwKKwkvKiAweDAwNDggMHgwMzIzICovCisJMHgxZTI0LCAweDAwMDAsCisJLyogMHgwMDQ5IDB4MDMyMyAqLworCTB4MWVjYSwgMHgwMDAwLAorCS8qIDB4MDA0YiAweDAzMjMgKi8KKwkweDFlMzIsIDB4MDAwMCwKKwkvKiAweDAwNGMgMHgwMzIzICovCisJMHgxZTM2LCAweDAwMDEsICAweDAzMDQsIDB4MGVjMCwKKwkvKiAweDAwNGQgMHgwMzIzICovCisJMHgxZTQyLCAweDAwMDAsCisJLyogMHgwMDRlIDB4MDMyMyAqLworCTB4MWU0NiwgMHgwMDAwLAorCS8qIDB4MDA0ZiAweDAzMjMgKi8KKwkweDFlY2MsIDB4MDAwMSwgIDB4MDMwMiwgMHgwZWMyLAorCS8qIDB4MDA1MiAweDAzMjMgKi8KKwkweDFlNWEsIDB4MDAwMSwgIDB4MDMwNCwgMHgwZWM0LAorCS8qIDB4MDA1MyAweDAzMjMgKi8KKwkweDFlNjIsIDB4MDAwMSwgIDB4MDMwNywgMHgwZWM2LAorCS8qIDB4MDA1NCAweDAzMjMgKi8KKwkweDFlNmMsIDB4MDAwMCwKKwkvKiAweDAwNTUgMHgwMzIzICovCisJMHgxZWU0LCAweDAwMDAsCisJLyogMHgwMDU2IDB4MDMyMyAqLworCTB4MWU3ZSwgMHgwMDAwLAorCS8qIDB4MDA1NyAweDAzMjMgKi8KKwkweDFlODgsIDB4MDAwMCwKKwkvKiAweDAwNTkgMHgwMzIzICovCisJMHgxZWY0LCAweDAwMDAsCisJLyogMHgwMDVhIDB4MDMyMyAqLworCTB4MWU5MiwgMHgwMDAwLAorCS8qIDB4MDA2MSAweDAzMjMgKi8KKwkweDFlYTEsIDB4MDAwMiwgIDB4MDMwMiwgMHgwZWM4LCAgMHgwMzA2LCAweDBlY2EsCisJLyogMHgwMDYyIDB4MDMyMyAqLworCTB4MWUwNSwgMHgwMDAwLAorCS8qIDB4MDA2NCAweDAzMjMgKi8KKwkweDFlMGQsIDB4MDAwMCwKKwkvKiAweDAwNjUgMHgwMzIzICovCisJMHgxZWI5LCAweDAwMDEsICAweDAzMDIsIDB4MGVjYywKKwkvKiAweDAwNjggMHgwMzIzICovCisJMHgxZTI1LCAweDAwMDAsCisJLyogMHgwMDY5IDB4MDMyMyAqLworCTB4MWVjYiwgMHgwMDAwLAorCS8qIDB4MDA2YiAweDAzMjMgKi8KKwkweDFlMzMsIDB4MDAwMCwKKwkvKiAweDAwNmMgMHgwMzIzICovCisJMHgxZTM3LCAweDAwMDEsICAweDAzMDQsIDB4MGVjZSwKKwkvKiAweDAwNmQgMHgwMzIzICovCisJMHgxZTQzLCAweDAwMDAsCisJLyogMHgwMDZlIDB4MDMyMyAqLworCTB4MWU0NywgMHgwMDAwLAorCS8qIDB4MDA2ZiAweDAzMjMgKi8KKwkweDFlY2QsIDB4MDAwMSwgIDB4MDMwMiwgMHgwZWQwLAorCS8qIDB4MDA3MiAweDAzMjMgKi8KKwkweDFlNWIsIDB4MDAwMSwgIDB4MDMwNCwgMHgwZWQyLAorCS8qIDB4MDA3MyAweDAzMjMgKi8KKwkweDFlNjMsIDB4MDAwMSwgIDB4MDMwNywgMHgwZWQ0LAorCS8qIDB4MDA3NCAweDAzMjMgKi8KKwkweDFlNmQsIDB4MDAwMCwKKwkvKiAweDAwNzUgMHgwMzIzICovCisJMHgxZWU1LCAweDAwMDAsCisJLyogMHgwMDc2IDB4MDMyMyAqLworCTB4MWU3ZiwgMHgwMDAwLAorCS8qIDB4MDA3NyAweDAzMjMgKi8KKwkweDFlODksIDB4MDAwMCwKKwkvKiAweDAwNzkgMHgwMzIzICovCisJMHgxZWY1LCAweDAwMDAsCisJLyogMHgwMDdhIDB4MDMyMyAqLworCTB4MWU5MywgMHgwMDAwLAorCS8qIDB4MDA1NSAweDAzMjQgKi8KKwkweDFlNzIsIDB4MDAwMCwKKwkvKiAweDAwNzUgMHgwMzI0ICovCisJMHgxZTczLCAweDAwMDAsCisJLyogMHgwMDQxIDB4MDMyNSAqLworCTB4MWUwMCwgMHgwMDAwLAorCS8qIDB4MDA2MSAweDAzMjUgKi8KKwkweDFlMDEsIDB4MDAwMCwKKwkvKiAweDAwNDMgMHgwMzI3ICovCisJMHgwMGM3LCAweDAwMDEsICAweDAzMDEsIDB4MGVkNiwKKwkvKiAweDAwNDQgMHgwMzI3ICovCisJMHgxZTEwLCAweDAwMDAsCisJLyogMHgwMDQ1IDB4MDMyNyAqLworCTB4MDAwMCwgMHgwMDAxLCAgMHgwMzA2LCAweDBlZDgsCisJLyogMHgwMDQ3IDB4MDMyNyAqLworCTB4MDEyMiwgMHgwMDAwLAorCS8qIDB4MDA0OCAweDAzMjcgKi8KKwkweDFlMjgsIDB4MDAwMCwKKwkvKiAweDAwNGIgMHgwMzI3ICovCisJMHgwMTM2LCAweDAwMDAsCisJLyogMHgwMDRjIDB4MDMyNyAqLworCTB4MDEzYiwgMHgwMDAwLAorCS8qIDB4MDA0ZSAweDAzMjcgKi8KKwkweDAxNDUsIDB4MDAwMCwKKwkvKiAweDAwNTIgMHgwMzI3ICovCisJMHgwMTU2LCAweDAwMDAsCisJLyogMHgwMDUzIDB4MDMyNyAqLworCTB4MDE1ZSwgMHgwMDAwLAorCS8qIDB4MDA1NCAweDAzMjcgKi8KKwkweDAxNjIsIDB4MDAwMCwKKwkvKiAweDAwNjMgMHgwMzI3ICovCisJMHgwMGU3LCAweDAwMDEsICAweDAzMDEsIDB4MGVkYSwKKwkvKiAweDAwNjQgMHgwMzI3ICovCisJMHgxZTExLCAweDAwMDAsCisJLyogMHgwMDY1IDB4MDMyNyAqLworCTB4MDAwMCwgMHgwMDAxLCAgMHgwMzA2LCAweDBlZGMsCisJLyogMHgwMDY3IDB4MDMyNyAqLworCTB4MDEyMywgMHgwMDAwLAorCS8qIDB4MDA2OCAweDAzMjcgKi8KKwkweDFlMjksIDB4MDAwMCwKKwkvKiAweDAwNmIgMHgwMzI3ICovCisJMHgwMTM3LCAweDAwMDAsCisJLyogMHgwMDZjIDB4MDMyNyAqLworCTB4MDEzYywgMHgwMDAwLAorCS8qIDB4MDA2ZSAweDAzMjcgKi8KKwkweDAxNDYsIDB4MDAwMCwKKwkvKiAweDAwNzIgMHgwMzI3ICovCisJMHgwMTU3LCAweDAwMDAsCisJLyogMHgwMDczIDB4MDMyNyAqLworCTB4MDE1ZiwgMHgwMDAwLAorCS8qIDB4MDA3NCAweDAzMjcgKi8KKwkweDAxNjMsIDB4MDAwMCwKKwkvKiAweDAwNDEgMHgwMzI4ICovCisJMHgwMTA0LCAweDAwMDAsCisJLyogMHgwMDQ1IDB4MDMyOCAqLworCTB4MDExOCwgMHgwMDAwLAorCS8qIDB4MDA0OSAweDAzMjggKi8KKwkweDAxMmUsIDB4MDAwMCwKKwkvKiAweDAwNGYgMHgwMzI4ICovCisJMHgwMWVhLCAweDAwMDEsICAweDAzMDQsIDB4MGVkZSwKKwkvKiAweDAwNTUgMHgwMzI4ICovCisJMHgwMTcyLCAweDAwMDAsCisJLyogMHgwMDYxIDB4MDMyOCAqLworCTB4MDEwNSwgMHgwMDAwLAorCS8qIDB4MDA2NSAweDAzMjggKi8KKwkweDAxMTksIDB4MDAwMCwKKwkvKiAweDAwNjkgMHgwMzI4ICovCisJMHgwMTJmLCAweDAwMDAsCisJLyogMHgwMDZmIDB4MDMyOCAqLworCTB4MDFlYiwgMHgwMDAxLCAgMHgwMzA0LCAweDBlZTAsCisJLyogMHgwMDc1IDB4MDMyOCAqLworCTB4MDE3MywgMHgwMDAwLAorCS8qIDB4MDA0NCAweDAzMmQgKi8KKwkweDFlMTIsIDB4MDAwMCwKKwkvKiAweDAwNDUgMHgwMzJkICovCisJMHgxZTE4LCAweDAwMDAsCisJLyogMHgwMDRjIDB4MDMyZCAqLworCTB4MWUzYywgMHgwMDAwLAorCS8qIDB4MDA0ZSAweDAzMmQgKi8KKwkweDFlNGEsIDB4MDAwMCwKKwkvKiAweDAwNTQgMHgwMzJkICovCisJMHgxZTcwLCAweDAwMDAsCisJLyogMHgwMDU1IDB4MDMyZCAqLworCTB4MWU3NiwgMHgwMDAwLAorCS8qIDB4MDA2NCAweDAzMmQgKi8KKwkweDFlMTMsIDB4MDAwMCwKKwkvKiAweDAwNjUgMHgwMzJkICovCisJMHgxZTE5LCAweDAwMDAsCisJLyogMHgwMDZjIDB4MDMyZCAqLworCTB4MWUzZCwgMHgwMDAwLAorCS8qIDB4MDA2ZSAweDAzMmQgKi8KKwkweDFlNGIsIDB4MDAwMCwKKwkvKiAweDAwNzQgMHgwMzJkICovCisJMHgxZTcxLCAweDAwMDAsCisJLyogMHgwMDc1IDB4MDMyZCAqLworCTB4MWU3NywgMHgwMDAwLAorCS8qIDB4MDA0OCAweDAzMmUgKi8KKwkweDFlMmEsIDB4MDAwMCwKKwkvKiAweDAwNjggMHgwMzJlICovCisJMHgxZTJiLCAweDAwMDAsCisJLyogMHgwMDQ1IDB4MDMzMCAqLworCTB4MWUxYSwgMHgwMDAwLAorCS8qIDB4MDA0OSAweDAzMzAgKi8KKwkweDFlMmMsIDB4MDAwMCwKKwkvKiAweDAwNTUgMHgwMzMwICovCisJMHgxZTc0LCAweDAwMDAsCisJLyogMHgwMDY1IDB4MDMzMCAqLworCTB4MWUxYiwgMHgwMDAwLAorCS8qIDB4MDA2OSAweDAzMzAgKi8KKwkweDFlMmQsIDB4MDAwMCwKKwkvKiAweDAwNzUgMHgwMzMwICovCisJMHgxZTc1LCAweDAwMDAsCisJLyogMHgwMDQyIDB4MDMzMSAqLworCTB4MWUwNiwgMHgwMDAwLAorCS8qIDB4MDA0NCAweDAzMzEgKi8KKwkweDFlMGUsIDB4MDAwMCwKKwkvKiAweDAwNGIgMHgwMzMxICovCisJMHgxZTM0LCAweDAwMDAsCisJLyogMHgwMDRjIDB4MDMzMSAqLworCTB4MWUzYSwgMHgwMDAwLAorCS8qIDB4MDA0ZSAweDAzMzEgKi8KKwkweDFlNDgsIDB4MDAwMCwKKwkvKiAweDAwNTIgMHgwMzMxICovCisJMHgxZTVlLCAweDAwMDAsCisJLyogMHgwMDU0IDB4MDMzMSAqLworCTB4MWU2ZSwgMHgwMDAwLAorCS8qIDB4MDA1YSAweDAzMzEgKi8KKwkweDFlOTQsIDB4MDAwMCwKKwkvKiAweDAwNjIgMHgwMzMxICovCisJMHgxZTA3LCAweDAwMDAsCisJLyogMHgwMDY0IDB4MDMzMSAqLworCTB4MWUwZiwgMHgwMDAwLAorCS8qIDB4MDA2OCAweDAzMzEgKi8KKwkweDFlOTYsIDB4MDAwMCwKKwkvKiAweDAwNmIgMHgwMzMxICovCisJMHgxZTM1LCAweDAwMDAsCisJLyogMHgwMDZjIDB4MDMzMSAqLworCTB4MWUzYiwgMHgwMDAwLAorCS8qIDB4MDA2ZSAweDAzMzEgKi8KKwkweDFlNDksIDB4MDAwMCwKKwkvKiAweDAwNzIgMHgwMzMxICovCisJMHgxZTVmLCAweDAwMDAsCisJLyogMHgwMDc0IDB4MDMzMSAqLworCTB4MWU2ZiwgMHgwMDAwLAorCS8qIDB4MDA3YSAweDAzMzEgKi8KKwkweDFlOTUsIDB4MDAwMCwKKwkvKiAweDAwYTggMHgwMzQyICovCisJMHgxZmMxLCAweDAwMDAsCisJLyogMHgwM2IxIDB4MDM0MiAqLworCTB4MWZiNiwgMHgwMDAwLAorCS8qIDB4MDNiNyAweDAzNDIgKi8KKwkweDFmYzYsIDB4MDAwMCwKKwkvKiAweDAzYjkgMHgwMzQyICovCisJMHgxZmQ2LCAweDAwMDAsCisJLyogMHgwM2M1IDB4MDM0MiAqLworCTB4MWZlNiwgMHgwMDAwLAorCS8qIDB4MDNjOSAweDAzNDIgKi8KKwkweDFmZjYsIDB4MDAwMCwKKwkvKiAweDFmYmYgMHgwMzQyICovCisJMHgxZmNmLCAweDAwMDAsCisJLyogMHgxZmZlIDB4MDM0MiAqLworCTB4MWZkZiwgMHgwMDAwLAorCS8qIDB4MDM5MSAweDAzNDUgKi8KKwkweDFmYmMsIDB4MDAwMiwgIDB4MDMxMywgMHgwZWUyLCAgMHgwMzE0LCAweDBlZWEsCisJLyogMHgwMzk3IDB4MDM0NSAqLworCTB4MWZjYywgMHgwMDAyLCAgMHgwMzEzLCAweDBlZjIsICAweDAzMTQsIDB4MGVmYSwKKwkvKiAweDAzYTkgMHgwMzQ1ICovCisJMHgxZmZjLCAweDAwMDIsICAweDAzMTMsIDB4MGYwMiwgIDB4MDMxNCwgMHgwZjBhLAorCS8qIDB4MDNiMSAweDAzNDUgKi8KKwkweDFmYjMsIDB4MDAwNSwgIDB4MDMwMCwgMHgwZjEyLCAgMHgwMzAxLCAweDBmMTQsICAweDAzMTMsIDB4MGYxNiwKKwkweDAzMTQsIDB4MGYxZSwgIDB4MDM0MiwgMHgwZjI2LAorCS8qIDB4MDNiNyAweDAzNDUgKi8KKwkweDFmYzMsIDB4MDAwNSwgIDB4MDMwMCwgMHgwZjI4LCAgMHgwMzAxLCAweDBmMmEsICAweDAzMTMsIDB4MGYyYywKKwkweDAzMTQsIDB4MGYzNCwgIDB4MDM0MiwgMHgwZjNjLAorCS8qIDB4MDNiZiAweDAzNDUgKi8KKwkweDAwMDAsIDB4MDAwMSwgIDB4MDMwMSwgMHgwZjNlLAorCS8qIDB4MDNjOSAweDAzNDUgKi8KKwkweDFmZjMsIDB4MDAwNCwgIDB4MDMwMCwgMHgwZjQwLCAgMHgwMzEzLCAweDBmNDIsICAweDAzMTQsIDB4MGY0YSwKKwkweDAzNDIsIDB4MGY1MiwKKwkvKiAweDA1ZDAgMHgwNWI3ICovCisJMHhmYjJlLCAweDAwMDAsCisJLyogMHgwNWYyIDB4MDViNyAqLworCTB4ZmIxZiwgMHgwMDAwLAorCS8qIDB4MDVkMCAweDA1YjggKi8KKwkweGZiMmYsIDB4MDAwMCwKKwkvKiAweDA1ZDUgMHgwNWI5ICovCisJMHhmYjRiLCAweDAwMDAsCisJLyogMHgwNWQwIDB4MDViYyAqLworCTB4ZmIzMCwgMHgwMDAwLAorCS8qIDB4MDVkMSAweDA1YmMgKi8KKwkweGZiMzEsIDB4MDAwMCwKKwkvKiAweDA1ZDIgMHgwNWJjICovCisJMHhmYjMyLCAweDAwMDAsCisJLyogMHgwNWQzIDB4MDViYyAqLworCTB4ZmIzMywgMHgwMDAwLAorCS8qIDB4MDVkNCAweDA1YmMgKi8KKwkweGZiMzQsIDB4MDAwMCwKKwkvKiAweDA1ZDUgMHgwNWJjICovCisJMHhmYjM1LCAweDAwMDAsCisJLyogMHgwNWQ2IDB4MDViYyAqLworCTB4ZmIzNiwgMHgwMDAwLAorCS8qIDB4MDVkOCAweDA1YmMgKi8KKwkweGZiMzgsIDB4MDAwMCwKKwkvKiAweDA1ZDkgMHgwNWJjICovCisJMHhmYjM5LCAweDAwMDAsCisJLyogMHgwNWRhIDB4MDViYyAqLworCTB4ZmIzYSwgMHgwMDAwLAorCS8qIDB4MDVkYiAweDA1YmMgKi8KKwkweGZiM2IsIDB4MDAwMCwKKwkvKiAweDA1ZGMgMHgwNWJjICovCisJMHhmYjNjLCAweDAwMDAsCisJLyogMHgwNWRlIDB4MDViYyAqLworCTB4ZmIzZSwgMHgwMDAwLAorCS8qIDB4MDVlMCAweDA1YmMgKi8KKwkweGZiNDAsIDB4MDAwMCwKKwkvKiAweDA1ZTEgMHgwNWJjICovCisJMHhmYjQxLCAweDAwMDAsCisJLyogMHgwNWUzIDB4MDViYyAqLworCTB4ZmI0MywgMHgwMDAwLAorCS8qIDB4MDVlNCAweDA1YmMgKi8KKwkweGZiNDQsIDB4MDAwMCwKKwkvKiAweDA1ZTYgMHgwNWJjICovCisJMHhmYjQ2LCAweDAwMDAsCisJLyogMHgwNWU3IDB4MDViYyAqLworCTB4ZmI0NywgMHgwMDAwLAorCS8qIDB4MDVlOCAweDA1YmMgKi8KKwkweGZiNDgsIDB4MDAwMCwKKwkvKiAweDA1ZTkgMHgwNWJjICovCisJMHhmYjQ5LCAweDAwMDIsICAweDA1YzEsIDB4MGY1NCwgIDB4MDVjMiwgMHgwZjU2LAorCS8qIDB4MDVlYSAweDA1YmMgKi8KKwkweGZiNGEsIDB4MDAwMCwKKwkvKiAweDA1ZDEgMHgwNWJmICovCisJMHhmYjRjLCAweDAwMDAsCisJLyogMHgwNWRiIDB4MDViZiAqLworCTB4ZmI0ZCwgMHgwMDAwLAorCS8qIDB4MDVlNCAweDA1YmYgKi8KKwkweGZiNGUsIDB4MDAwMCwKKwkvKiAweDA1ZTkgMHgwNWMxICovCisJMHhmYjJhLCAweDAwMDAsCisJLyogMHgwNWU5IDB4MDVjMiAqLworCTB4ZmIyYiwgMHgwMDAwLAorCS8qIDB4MDkxNSAweDA5M2MgKi8KKwkweDA5NTgsIDB4MDAwMCwKKwkvKiAweDA5MTYgMHgwOTNjICovCisJMHgwOTU5LCAweDAwMDAsCisJLyogMHgwOTE3IDB4MDkzYyAqLworCTB4MDk1YSwgMHgwMDAwLAorCS8qIDB4MDkxYyAweDA5M2MgKi8KKwkweDA5NWIsIDB4MDAwMCwKKwkvKiAweDA5MjEgMHgwOTNjICovCisJMHgwOTVjLCAweDAwMDAsCisJLyogMHgwOTIyIDB4MDkzYyAqLworCTB4MDk1ZCwgMHgwMDAwLAorCS8qIDB4MDkyOCAweDA5M2MgKi8KKwkweDA5MjksIDB4MDAwMCwKKwkvKiAweDA5MmIgMHgwOTNjICovCisJMHgwOTVlLCAweDAwMDAsCisJLyogMHgwOTJmIDB4MDkzYyAqLworCTB4MDk1ZiwgMHgwMDAwLAorCS8qIDB4MDkzMCAweDA5M2MgKi8KKwkweDA5MzEsIDB4MDAwMCwKKwkvKiAweDA5MzMgMHgwOTNjICovCisJMHgwOTM0LCAweDAwMDAsCisJLyogMHgwOWExIDB4MDliYyAqLworCTB4MDlkYywgMHgwMDAwLAorCS8qIDB4MDlhMiAweDA5YmMgKi8KKwkweDA5ZGQsIDB4MDAwMCwKKwkvKiAweDA5YWMgMHgwOWJjICovCisJMHgwOWIwLCAweDAwMDAsCisJLyogMHgwOWFmIDB4MDliYyAqLworCTB4MDlkZiwgMHgwMDAwLAorCS8qIDB4MDljNyAweDA5YmUgKi8KKwkweDA5Y2IsIDB4MDAwMCwKKwkvKiAweDA5YzcgMHgwOWQ3ICovCisJMHgwOWNjLCAweDAwMDAsCisJLyogMHgwYTE2IDB4MGEzYyAqLworCTB4MGE1OSwgMHgwMDAwLAorCS8qIDB4MGExNyAweDBhM2MgKi8KKwkweDBhNWEsIDB4MDAwMCwKKwkvKiAweDBhMWMgMHgwYTNjICovCisJMHgwYTViLCAweDAwMDAsCisJLyogMHgwYTIxIDB4MGEzYyAqLworCTB4MGE1YywgMHgwMDAwLAorCS8qIDB4MGEyYiAweDBhM2MgKi8KKwkweDBhNWUsIDB4MDAwMCwKKwkvKiAweDBiMjEgMHgwYjNjICovCisJMHgwYjVjLCAweDAwMDAsCisJLyogMHgwYjIyIDB4MGIzYyAqLworCTB4MGI1ZCwgMHgwMDAwLAorCS8qIDB4MGIyZiAweDBiM2MgKi8KKwkweDBiNWYsIDB4MDAwMCwKKwkvKiAweDBiNDcgMHgwYjNlICovCisJMHgwYjRiLCAweDAwMDAsCisJLyogMHgwYjQ3IDB4MGI1NiAqLworCTB4MGI0OCwgMHgwMDAwLAorCS8qIDB4MGI0NyAweDBiNTcgKi8KKwkweDBiNGMsIDB4MDAwMCwKKwkvKiAweDBiYzYgMHgwYmJlICovCisJMHgwYmNhLCAweDAwMDAsCisJLyogMHgwYmM3IDB4MGJiZSAqLworCTB4MGJjYiwgMHgwMDAwLAorCS8qIDB4MGI5MiAweDBiZDcgKi8KKwkweDBiOTQsIDB4MDAwMCwKKwkvKiAweDBiYzYgMHgwYmQ3ICovCisJMHgwYmNjLCAweDAwMDAsCisJLyogMHgwYzQ2IDB4MGM1NiAqLworCTB4MGM0OCwgMHgwMDAwLAorCS8qIDB4MGNjNiAweDBjYzIgKi8KKwkweDBjY2EsIDB4MDAwMSwgIDB4MGNkNSwgMHgwZjU4LAorCS8qIDB4MGNiZiAweDBjZDUgKi8KKwkweDBjYzAsIDB4MDAwMCwKKwkvKiAweDBjYzYgMHgwY2Q1ICovCisJMHgwY2M3LCAweDAwMDAsCisJLyogMHgwY2M2IDB4MGNkNiAqLworCTB4MGNjOCwgMHgwMDAwLAorCS8qIDB4MGQ0NiAweDBkM2UgKi8KKwkweDBkNGEsIDB4MDAwMCwKKwkvKiAweDBkNDcgMHgwZDNlICovCisJMHgwZDRiLCAweDAwMDAsCisJLyogMHgwZDQ2IDB4MGQ1NyAqLworCTB4MGQ0YywgMHgwMDAwLAorCS8qIDB4MGU0ZCAweDBlMzIgKi8KKwkweDBlMzMsIDB4MDAwMCwKKwkvKiAweDBlY2QgMHgwZWIyICovCisJMHgwZWIzLCAweDAwMDAsCisJLyogMHgwZjcyIDB4MGY3MSAqLworCTB4MGY3MywgMHgwMDAwLAorCS8qIDB4MGY3NCAweDBmNzEgKi8KKwkweDBmNzUsIDB4MDAwMCwKKwkvKiAweDBmODAgMHgwZjcxICovCisJMHgwZjgxLCAweDAwMDAsCisJLyogMHgwZmIyIDB4MGY4MCAqLworCTB4MGY3NiwgMHgwMDAxLCAgMHgwZjcxLCAweDBmNWEsCisJLyogMHgwZmIzIDB4MGY4MCAqLworCTB4MGY3OCwgMHgwMDAxLCAgMHgwZjcxLCAweDBmNWMsCisJLyogMHgwZjQwIDB4MGZiNSAqLworCTB4MGY2OSwgMHgwMDAwLAorCS8qIDB4MGY5MCAweDBmYjUgKi8KKwkweDBmYjksIDB4MDAwMCwKKwkvKiAweDBmNDIgMHgwZmI3ICovCisJMHgwZjQzLCAweDAwMDAsCisJLyogMHgwZjRjIDB4MGZiNyAqLworCTB4MGY0ZCwgMHgwMDAwLAorCS8qIDB4MGY1MSAweDBmYjcgKi8KKwkweDBmNTIsIDB4MDAwMCwKKwkvKiAweDBmNTYgMHgwZmI3ICovCisJMHgwZjU3LCAweDAwMDAsCisJLyogMHgwZjViIDB4MGZiNyAqLworCTB4MGY1YywgMHgwMDAwLAorCS8qIDB4MGY5MiAweDBmYjcgKi8KKwkweDBmOTMsIDB4MDAwMCwKKwkvKiAweDBmOWMgMHgwZmI3ICovCisJMHgwZjlkLCAweDAwMDAsCisJLyogMHgwZmExIDB4MGZiNyAqLworCTB4MGZhMiwgMHgwMDAwLAorCS8qIDB4MGZhNiAweDBmYjcgKi8KKwkweDBmYTcsIDB4MDAwMCwKKwkvKiAweDBmYWIgMHgwZmI3ICovCisJMHgwZmFjLCAweDAwMDAsCisJLyogMHgzMDQ2IDB4MzA5OSAqLworCTB4MzA5NCwgMHgwMDAwLAorCS8qIDB4MzA0YiAweDMwOTkgKi8KKwkweDMwNGMsIDB4MDAwMCwKKwkvKiAweDMwNGQgMHgzMDk5ICovCisJMHgzMDRlLCAweDAwMDAsCisJLyogMHgzMDRmIDB4MzA5OSAqLworCTB4MzA1MCwgMHgwMDAwLAorCS8qIDB4MzA1MSAweDMwOTkgKi8KKwkweDMwNTIsIDB4MDAwMCwKKwkvKiAweDMwNTMgMHgzMDk5ICovCisJMHgzMDU0LCAweDAwMDAsCisJLyogMHgzMDU1IDB4MzA5OSAqLworCTB4MzA1NiwgMHgwMDAwLAorCS8qIDB4MzA1NyAweDMwOTkgKi8KKwkweDMwNTgsIDB4MDAwMCwKKwkvKiAweDMwNTkgMHgzMDk5ICovCisJMHgzMDVhLCAweDAwMDAsCisJLyogMHgzMDViIDB4MzA5OSAqLworCTB4MzA1YywgMHgwMDAwLAorCS8qIDB4MzA1ZCAweDMwOTkgKi8KKwkweDMwNWUsIDB4MDAwMCwKKwkvKiAweDMwNWYgMHgzMDk5ICovCisJMHgzMDYwLCAweDAwMDAsCisJLyogMHgzMDYxIDB4MzA5OSAqLworCTB4MzA2MiwgMHgwMDAwLAorCS8qIDB4MzA2NCAweDMwOTkgKi8KKwkweDMwNjUsIDB4MDAwMCwKKwkvKiAweDMwNjYgMHgzMDk5ICovCisJMHgzMDY3LCAweDAwMDAsCisJLyogMHgzMDY4IDB4MzA5OSAqLworCTB4MzA2OSwgMHgwMDAwLAorCS8qIDB4MzA2ZiAweDMwOTkgKi8KKwkweDMwNzAsIDB4MDAwMCwKKwkvKiAweDMwNzIgMHgzMDk5ICovCisJMHgzMDczLCAweDAwMDAsCisJLyogMHgzMDc1IDB4MzA5OSAqLworCTB4MzA3NiwgMHgwMDAwLAorCS8qIDB4MzA3OCAweDMwOTkgKi8KKwkweDMwNzksIDB4MDAwMCwKKwkvKiAweDMwN2IgMHgzMDk5ICovCisJMHgzMDdjLCAweDAwMDAsCisJLyogMHgzMDlkIDB4MzA5OSAqLworCTB4MzA5ZSwgMHgwMDAwLAorCS8qIDB4MzBhNiAweDMwOTkgKi8KKwkweDMwZjQsIDB4MDAwMCwKKwkvKiAweDMwYWIgMHgzMDk5ICovCisJMHgzMGFjLCAweDAwMDAsCisJLyogMHgzMGFkIDB4MzA5OSAqLworCTB4MzBhZSwgMHgwMDAwLAorCS8qIDB4MzBhZiAweDMwOTkgKi8KKwkweDMwYjAsIDB4MDAwMCwKKwkvKiAweDMwYjEgMHgzMDk5ICovCisJMHgzMGIyLCAweDAwMDAsCisJLyogMHgzMGIzIDB4MzA5OSAqLworCTB4MzBiNCwgMHgwMDAwLAorCS8qIDB4MzBiNSAweDMwOTkgKi8KKwkweDMwYjYsIDB4MDAwMCwKKwkvKiAweDMwYjcgMHgzMDk5ICovCisJMHgzMGI4LCAweDAwMDAsCisJLyogMHgzMGI5IDB4MzA5OSAqLworCTB4MzBiYSwgMHgwMDAwLAorCS8qIDB4MzBiYiAweDMwOTkgKi8KKwkweDMwYmMsIDB4MDAwMCwKKwkvKiAweDMwYmQgMHgzMDk5ICovCisJMHgzMGJlLCAweDAwMDAsCisJLyogMHgzMGJmIDB4MzA5OSAqLworCTB4MzBjMCwgMHgwMDAwLAorCS8qIDB4MzBjMSAweDMwOTkgKi8KKwkweDMwYzIsIDB4MDAwMCwKKwkvKiAweDMwYzQgMHgzMDk5ICovCisJMHgzMGM1LCAweDAwMDAsCisJLyogMHgzMGM2IDB4MzA5OSAqLworCTB4MzBjNywgMHgwMDAwLAorCS8qIDB4MzBjOCAweDMwOTkgKi8KKwkweDMwYzksIDB4MDAwMCwKKwkvKiAweDMwY2YgMHgzMDk5ICovCisJMHgzMGQwLCAweDAwMDAsCisJLyogMHgzMGQyIDB4MzA5OSAqLworCTB4MzBkMywgMHgwMDAwLAorCS8qIDB4MzBkNSAweDMwOTkgKi8KKwkweDMwZDYsIDB4MDAwMCwKKwkvKiAweDMwZDggMHgzMDk5ICovCisJMHgzMGQ5LCAweDAwMDAsCisJLyogMHgzMGRiIDB4MzA5OSAqLworCTB4MzBkYywgMHgwMDAwLAorCS8qIDB4MzBlZiAweDMwOTkgKi8KKwkweDMwZjcsIDB4MDAwMCwKKwkvKiAweDMwZjAgMHgzMDk5ICovCisJMHgzMGY4LCAweDAwMDAsCisJLyogMHgzMGYxIDB4MzA5OSAqLworCTB4MzBmOSwgMHgwMDAwLAorCS8qIDB4MzBmMiAweDMwOTkgKi8KKwkweDMwZmEsIDB4MDAwMCwKKwkvKiAweDMwZmQgMHgzMDk5ICovCisJMHgzMGZlLCAweDAwMDAsCisJLyogMHgzMDZmIDB4MzA5YSAqLworCTB4MzA3MSwgMHgwMDAwLAorCS8qIDB4MzA3MiAweDMwOWEgKi8KKwkweDMwNzQsIDB4MDAwMCwKKwkvKiAweDMwNzUgMHgzMDlhICovCisJMHgzMDc3LCAweDAwMDAsCisJLyogMHgzMDc4IDB4MzA5YSAqLworCTB4MzA3YSwgMHgwMDAwLAorCS8qIDB4MzA3YiAweDMwOWEgKi8KKwkweDMwN2QsIDB4MDAwMCwKKwkvKiAweDMwY2YgMHgzMDlhICovCisJMHgzMGQxLCAweDAwMDAsCisJLyogMHgzMGQyIDB4MzA5YSAqLworCTB4MzBkNCwgMHgwMDAwLAorCS8qIDB4MzBkNSAweDMwOWEgKi8KKwkweDMwZDcsIDB4MDAwMCwKKwkvKiAweDMwZDggMHgzMDlhICovCisJMHgzMGRhLCAweDAwMDAsCisJLyogMHgzMGRiIDB4MzA5YSAqLworCTB4MzBkZCwgMHgwMDAwLAorCS8qIDB4MDMwNyAweDAwNTMgMHgwMzAxICovCisJMHgxZTY0LCAweDAwMDAsCisJLyogMHgwMzA3IDB4MDA3MyAweDAzMDEgKi8KKwkweDFlNjUsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMDQxIDB4MDMwMiAqLworCTB4MWVhNiwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAwNDEgMHgwMzAyICovCisJMHgxZWE0LCAweDAwMDAsCisJLyogMHgwMzAzIDB4MDA0MSAweDAzMDIgKi8KKwkweDFlYWEsIDB4MDAwMCwKKwkvKiAweDAzMDkgMHgwMDQxIDB4MDMwMiAqLworCTB4MWVhOCwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAwNDUgMHgwMzAyICovCisJMHgxZWMwLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA0NSAweDAzMDIgKi8KKwkweDFlYmUsIDB4MDAwMCwKKwkvKiAweDAzMDMgMHgwMDQ1IDB4MDMwMiAqLworCTB4MWVjNCwgMHgwMDAwLAorCS8qIDB4MDMwOSAweDAwNDUgMHgwMzAyICovCisJMHgxZWMyLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDA0ZiAweDAzMDIgKi8KKwkweDFlZDIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDRmIDB4MDMwMiAqLworCTB4MWVkMCwgMHgwMDAwLAorCS8qIDB4MDMwMyAweDAwNGYgMHgwMzAyICovCisJMHgxZWQ2LCAweDAwMDAsCisJLyogMHgwMzA5IDB4MDA0ZiAweDAzMDIgKi8KKwkweDFlZDQsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMDYxIDB4MDMwMiAqLworCTB4MWVhNywgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAwNjEgMHgwMzAyICovCisJMHgxZWE1LCAweDAwMDAsCisJLyogMHgwMzAzIDB4MDA2MSAweDAzMDIgKi8KKwkweDFlYWIsIDB4MDAwMCwKKwkvKiAweDAzMDkgMHgwMDYxIDB4MDMwMiAqLworCTB4MWVhOSwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAwNjUgMHgwMzAyICovCisJMHgxZWMxLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA2NSAweDAzMDIgKi8KKwkweDFlYmYsIDB4MDAwMCwKKwkvKiAweDAzMDMgMHgwMDY1IDB4MDMwMiAqLworCTB4MWVjNSwgMHgwMDAwLAorCS8qIDB4MDMwOSAweDAwNjUgMHgwMzAyICovCisJMHgxZWMzLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDA2ZiAweDAzMDIgKi8KKwkweDFlZDMsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDZmIDB4MDMwMiAqLworCTB4MWVkMSwgMHgwMDAwLAorCS8qIDB4MDMwMyAweDAwNmYgMHgwMzAyICovCisJMHgxZWQ3LCAweDAwMDAsCisJLyogMHgwMzA5IDB4MDA2ZiAweDAzMDIgKi8KKwkweDFlZDUsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDRmIDB4MDMwMyAqLworCTB4MWU0YywgMHgwMDAwLAorCS8qIDB4MDMwOCAweDAwNGYgMHgwMzAzICovCisJMHgxZTRlLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA1NSAweDAzMDMgKi8KKwkweDFlNzgsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDZmIDB4MDMwMyAqLworCTB4MWU0ZCwgMHgwMDAwLAorCS8qIDB4MDMwOCAweDAwNmYgMHgwMzAzICovCisJMHgxZTRmLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA3NSAweDAzMDMgKi8KKwkweDFlNzksIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMDQ1IDB4MDMwNCAqLworCTB4MWUxNCwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAwNDUgMHgwMzA0ICovCisJMHgxZTE2LCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDA0ZiAweDAzMDQgKi8KKwkweDFlNTAsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDRmIDB4MDMwNCAqLworCTB4MWU1MiwgMHgwMDAwLAorCS8qIDB4MDMwOCAweDAwNTUgMHgwMzA0ICovCisJMHgxZTdhLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDA2NSAweDAzMDQgKi8KKwkweDFlMTUsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDY1IDB4MDMwNCAqLworCTB4MWUxNywgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAwNmYgMHgwMzA0ICovCisJMHgxZTUxLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA2ZiAweDAzMDQgKi8KKwkweDFlNTMsIDB4MDAwMCwKKwkvKiAweDAzMDggMHgwMDc1IDB4MDMwNCAqLworCTB4MWU3YiwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAwNDEgMHgwMzA2ICovCisJMHgxZWIwLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA0MSAweDAzMDYgKi8KKwkweDFlYWUsIDB4MDAwMCwKKwkvKiAweDAzMDMgMHgwMDQxIDB4MDMwNiAqLworCTB4MWViNCwgMHgwMDAwLAorCS8qIDB4MDMwOSAweDAwNDEgMHgwMzA2ICovCisJMHgxZWIyLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDA2MSAweDAzMDYgKi8KKwkweDFlYjEsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDYxIDB4MDMwNiAqLworCTB4MWVhZiwgMHgwMDAwLAorCS8qIDB4MDMwMyAweDAwNjEgMHgwMzA2ICovCisJMHgxZWI1LCAweDAwMDAsCisJLyogMHgwMzA5IDB4MDA2MSAweDAzMDYgKi8KKwkweDFlYjMsIDB4MDAwMCwKKwkvKiAweDAzMDQgMHgwMDQxIDB4MDMwNyAqLworCTB4MDFlMCwgMHgwMDAwLAorCS8qIDB4MDMwNCAweDAwNjEgMHgwMzA3ICovCisJMHgwMWUxLCAweDAwMDAsCisJLyogMHgwMzA0IDB4MDA0MSAweDAzMDggKi8KKwkweDAxZGUsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDQ5IDB4MDMwOCAqLworCTB4MWUyZSwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAwNTUgMHgwMzA4ICovCisJMHgwMWRiLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA1NSAweDAzMDggKi8KKwkweDAxZDcsIDB4MDAwMCwKKwkvKiAweDAzMDQgMHgwMDU1IDB4MDMwOCAqLworCTB4MDFkNSwgMHgwMDAwLAorCS8qIDB4MDMwYyAweDAwNTUgMHgwMzA4ICovCisJMHgwMWQ5LCAweDAwMDAsCisJLyogMHgwMzA0IDB4MDA2MSAweDAzMDggKi8KKwkweDAxZGYsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDY5IDB4MDMwOCAqLworCTB4MWUyZiwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAwNzUgMHgwMzA4ICovCisJMHgwMWRjLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA3NSAweDAzMDggKi8KKwkweDAxZDgsIDB4MDAwMCwKKwkvKiAweDAzMDQgMHgwMDc1IDB4MDMwOCAqLworCTB4MDFkNiwgMHgwMDAwLAorCS8qIDB4MDMwYyAweDAwNzUgMHgwMzA4ICovCisJMHgwMWRhLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDNiOSAweDAzMDggKi8KKwkweDFmZDIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwM2I5IDB4MDMwOCAqLworCTB4MWZkMywgMHgwMDAwLAorCS8qIDB4MDMwZCAweDAzYjkgMHgwMzA4ICovCisJMHgwMzkwLCAweDAwMDAsCisJLyogMHgwMzQyIDB4MDNiOSAweDAzMDggKi8KKwkweDFmZDcsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwM2M1IDB4MDMwOCAqLworCTB4MWZlMiwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzYzUgMHgwMzA4ICovCisJMHgxZmUzLCAweDAwMDAsCisJLyogMHgwMzBkIDB4MDNjNSAweDAzMDggKi8KKwkweDAzYjAsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwM2M1IDB4MDMwOCAqLworCTB4MWZlNywgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAwNDEgMHgwMzBhICovCisJMHgwMWZhLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA2MSAweDAzMGEgKi8KKwkweDAxZmIsIDB4MDAwMCwKKwkvKiAweDAzMDcgMHgwMDUzIDB4MDMwYyAqLworCTB4MWU2NiwgMHgwMDAwLAorCS8qIDB4MDMwNyAweDAwNzMgMHgwMzBjICovCisJMHgxZTY3LCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDM5MSAweDAzMTMgKi8KKwkweDFmMGEsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzkxIDB4MDMxMyAqLworCTB4MWYwYywgMHgwMDAwLAorCS8qIDB4MDM0MiAweDAzOTEgMHgwMzEzICovCisJMHgxZjBlLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDM5NSAweDAzMTMgKi8KKwkweDFmMWEsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzk1IDB4MDMxMyAqLworCTB4MWYxYywgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzOTcgMHgwMzEzICovCisJMHgxZjJhLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDM5NyAweDAzMTMgKi8KKwkweDFmMmMsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzk3IDB4MDMxMyAqLworCTB4MWYyZSwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzOTkgMHgwMzEzICovCisJMHgxZjNhLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDM5OSAweDAzMTMgKi8KKwkweDFmM2MsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzk5IDB4MDMxMyAqLworCTB4MWYzZSwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzOWYgMHgwMzEzICovCisJMHgxZjRhLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDM5ZiAweDAzMTMgKi8KKwkweDFmNGMsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwM2E5IDB4MDMxMyAqLworCTB4MWY2YSwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzYTkgMHgwMzEzICovCisJMHgxZjZjLCAweDAwMDAsCisJLyogMHgwMzQyIDB4MDNhOSAweDAzMTMgKi8KKwkweDFmNmUsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwM2IxIDB4MDMxMyAqLworCTB4MWYwMiwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzYjEgMHgwMzEzICovCisJMHgxZjA0LCAweDAwMDAsCisJLyogMHgwMzQyIDB4MDNiMSAweDAzMTMgKi8KKwkweDFmMDYsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwM2I1IDB4MDMxMyAqLworCTB4MWYxMiwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzYjUgMHgwMzEzICovCisJMHgxZjE0LCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDNiNyAweDAzMTMgKi8KKwkweDFmMjIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwM2I3IDB4MDMxMyAqLworCTB4MWYyNCwgMHgwMDAwLAorCS8qIDB4MDM0MiAweDAzYjcgMHgwMzEzICovCisJMHgxZjI2LCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDNiOSAweDAzMTMgKi8KKwkweDFmMzIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwM2I5IDB4MDMxMyAqLworCTB4MWYzNCwgMHgwMDAwLAorCS8qIDB4MDM0MiAweDAzYjkgMHgwMzEzICovCisJMHgxZjM2LCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDNiZiAweDAzMTMgKi8KKwkweDFmNDIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwM2JmIDB4MDMxMyAqLworCTB4MWY0NCwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzYzUgMHgwMzEzICovCisJMHgxZjUyLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDNjNSAweDAzMTMgKi8KKwkweDFmNTQsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwM2M1IDB4MDMxMyAqLworCTB4MWY1NiwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzYzkgMHgwMzEzICovCisJMHgxZjYyLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDNjOSAweDAzMTMgKi8KKwkweDFmNjQsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwM2M5IDB4MDMxMyAqLworCTB4MWY2NiwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzOTEgMHgwMzE0ICovCisJMHgxZjBiLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDM5MSAweDAzMTQgKi8KKwkweDFmMGQsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzkxIDB4MDMxNCAqLworCTB4MWYwZiwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzOTUgMHgwMzE0ICovCisJMHgxZjFiLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDM5NSAweDAzMTQgKi8KKwkweDFmMWQsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzk3IDB4MDMxNCAqLworCTB4MWYyYiwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzOTcgMHgwMzE0ICovCisJMHgxZjJkLCAweDAwMDAsCisJLyogMHgwMzQyIDB4MDM5NyAweDAzMTQgKi8KKwkweDFmMmYsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzk5IDB4MDMxNCAqLworCTB4MWYzYiwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzOTkgMHgwMzE0ICovCisJMHgxZjNkLCAweDAwMDAsCisJLyogMHgwMzQyIDB4MDM5OSAweDAzMTQgKi8KKwkweDFmM2YsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzlmIDB4MDMxNCAqLworCTB4MWY0YiwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzOWYgMHgwMzE0ICovCisJMHgxZjRkLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDNhNSAweDAzMTQgKi8KKwkweDFmNWIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwM2E1IDB4MDMxNCAqLworCTB4MWY1ZCwgMHgwMDAwLAorCS8qIDB4MDM0MiAweDAzYTUgMHgwMzE0ICovCisJMHgxZjVmLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDNhOSAweDAzMTQgKi8KKwkweDFmNmIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwM2E5IDB4MDMxNCAqLworCTB4MWY2ZCwgMHgwMDAwLAorCS8qIDB4MDM0MiAweDAzYTkgMHgwMzE0ICovCisJMHgxZjZmLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDNiMSAweDAzMTQgKi8KKwkweDFmMDMsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwM2IxIDB4MDMxNCAqLworCTB4MWYwNSwgMHgwMDAwLAorCS8qIDB4MDM0MiAweDAzYjEgMHgwMzE0ICovCisJMHgxZjA3LCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDNiNSAweDAzMTQgKi8KKwkweDFmMTMsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwM2I1IDB4MDMxNCAqLworCTB4MWYxNSwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzYjcgMHgwMzE0ICovCisJMHgxZjIzLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDNiNyAweDAzMTQgKi8KKwkweDFmMjUsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwM2I3IDB4MDMxNCAqLworCTB4MWYyNywgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzYjkgMHgwMzE0ICovCisJMHgxZjMzLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDNiOSAweDAzMTQgKi8KKwkweDFmMzUsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwM2I5IDB4MDMxNCAqLworCTB4MWYzNywgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzYmYgMHgwMzE0ICovCisJMHgxZjQzLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDNiZiAweDAzMTQgKi8KKwkweDFmNDUsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwM2M1IDB4MDMxNCAqLworCTB4MWY1MywgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzYzUgMHgwMzE0ICovCisJMHgxZjU1LCAweDAwMDAsCisJLyogMHgwMzQyIDB4MDNjNSAweDAzMTQgKi8KKwkweDFmNTcsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwM2M5IDB4MDMxNCAqLworCTB4MWY2MywgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzYzkgMHgwMzE0ICovCisJMHgxZjY1LCAweDAwMDAsCisJLyogMHgwMzQyIDB4MDNjOSAweDAzMTQgKi8KKwkweDFmNjcsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMDRmIDB4MDMxYiAqLworCTB4MWVkYywgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAwNGYgMHgwMzFiICovCisJMHgxZWRhLCAweDAwMDAsCisJLyogMHgwMzAzIDB4MDA0ZiAweDAzMWIgKi8KKwkweDFlZTAsIDB4MDAwMCwKKwkvKiAweDAzMDkgMHgwMDRmIDB4MDMxYiAqLworCTB4MWVkZSwgMHgwMDAwLAorCS8qIDB4MDMyMyAweDAwNGYgMHgwMzFiICovCisJMHgxZWUyLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDA1NSAweDAzMWIgKi8KKwkweDFlZWEsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDU1IDB4MDMxYiAqLworCTB4MWVlOCwgMHgwMDAwLAorCS8qIDB4MDMwMyAweDAwNTUgMHgwMzFiICovCisJMHgxZWVlLCAweDAwMDAsCisJLyogMHgwMzA5IDB4MDA1NSAweDAzMWIgKi8KKwkweDFlZWMsIDB4MDAwMCwKKwkvKiAweDAzMjMgMHgwMDU1IDB4MDMxYiAqLworCTB4MWVmMCwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAwNmYgMHgwMzFiICovCisJMHgxZWRkLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA2ZiAweDAzMWIgKi8KKwkweDFlZGIsIDB4MDAwMCwKKwkvKiAweDAzMDMgMHgwMDZmIDB4MDMxYiAqLworCTB4MWVlMSwgMHgwMDAwLAorCS8qIDB4MDMwOSAweDAwNmYgMHgwMzFiICovCisJMHgxZWRmLCAweDAwMDAsCisJLyogMHgwMzIzIDB4MDA2ZiAweDAzMWIgKi8KKwkweDFlZTMsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMDc1IDB4MDMxYiAqLworCTB4MWVlYiwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAwNzUgMHgwMzFiICovCisJMHgxZWU5LCAweDAwMDAsCisJLyogMHgwMzAzIDB4MDA3NSAweDAzMWIgKi8KKwkweDFlZWYsIDB4MDAwMCwKKwkvKiAweDAzMDkgMHgwMDc1IDB4MDMxYiAqLworCTB4MWVlZCwgMHgwMDAwLAorCS8qIDB4MDMyMyAweDAwNzUgMHgwMzFiICovCisJMHgxZWYxLCAweDAwMDAsCisJLyogMHgwMzAyIDB4MDA0MSAweDAzMjMgKi8KKwkweDFlYWMsIDB4MDAwMCwKKwkvKiAweDAzMDYgMHgwMDQxIDB4MDMyMyAqLworCTB4MWViNiwgMHgwMDAwLAorCS8qIDB4MDMwMiAweDAwNDUgMHgwMzIzICovCisJMHgxZWM2LCAweDAwMDAsCisJLyogMHgwMzA0IDB4MDA0YyAweDAzMjMgKi8KKwkweDFlMzgsIDB4MDAwMCwKKwkvKiAweDAzMDIgMHgwMDRmIDB4MDMyMyAqLworCTB4MWVkOCwgMHgwMDAwLAorCS8qIDB4MDMwNCAweDAwNTIgMHgwMzIzICovCisJMHgxZTVjLCAweDAwMDAsCisJLyogMHgwMzA3IDB4MDA1MyAweDAzMjMgKi8KKwkweDFlNjgsIDB4MDAwMCwKKwkvKiAweDAzMDIgMHgwMDYxIDB4MDMyMyAqLworCTB4MWVhZCwgMHgwMDAwLAorCS8qIDB4MDMwNiAweDAwNjEgMHgwMzIzICovCisJMHgxZWI3LCAweDAwMDAsCisJLyogMHgwMzAyIDB4MDA2NSAweDAzMjMgKi8KKwkweDFlYzcsIDB4MDAwMCwKKwkvKiAweDAzMDQgMHgwMDZjIDB4MDMyMyAqLworCTB4MWUzOSwgMHgwMDAwLAorCS8qIDB4MDMwMiAweDAwNmYgMHgwMzIzICovCisJMHgxZWQ5LCAweDAwMDAsCisJLyogMHgwMzA0IDB4MDA3MiAweDAzMjMgKi8KKwkweDFlNWQsIDB4MDAwMCwKKwkvKiAweDAzMDcgMHgwMDczIDB4MDMyMyAqLworCTB4MWU2OSwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAwNDMgMHgwMzI3ICovCisJMHgxZTA4LCAweDAwMDAsCisJLyogMHgwMzA2IDB4MDA0NSAweDAzMjcgKi8KKwkweDFlMWMsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDYzIDB4MDMyNyAqLworCTB4MWUwOSwgMHgwMDAwLAorCS8qIDB4MDMwNiAweDAwNjUgMHgwMzI3ICovCisJMHgxZTFkLCAweDAwMDAsCisJLyogMHgwMzA0IDB4MDA0ZiAweDAzMjggKi8KKwkweDAxZWMsIDB4MDAwMCwKKwkvKiAweDAzMDQgMHgwMDZmIDB4MDMyOCAqLworCTB4MDFlZCwgMHgwMDAwLAorCS8qIDB4MDMxMyAweDAzOTEgMHgwMzQ1ICovCisJMHgxZjg4LCAweDAwMDMsICAweDAzMDAsIDB4MGY1ZSwgIDB4MDMwMSwgMHgwZjYwLCAgMHgwMzQyLCAweDBmNjIsCisJLyogMHgwMzE0IDB4MDM5MSAweDAzNDUgKi8KKwkweDFmODksIDB4MDAwMywgIDB4MDMwMCwgMHgwZjY0LCAgMHgwMzAxLCAweDBmNjYsICAweDAzNDIsIDB4MGY2OCwKKwkvKiAweDAzMTMgMHgwMzk3IDB4MDM0NSAqLworCTB4MWY5OCwgMHgwMDAzLCAgMHgwMzAwLCAweDBmNmEsICAweDAzMDEsIDB4MGY2YywgIDB4MDM0MiwgMHgwZjZlLAorCS8qIDB4MDMxNCAweDAzOTcgMHgwMzQ1ICovCisJMHgxZjk5LCAweDAwMDMsICAweDAzMDAsIDB4MGY3MCwgIDB4MDMwMSwgMHgwZjcyLCAgMHgwMzQyLCAweDBmNzQsCisJLyogMHgwMzEzIDB4MDNhOSAweDAzNDUgKi8KKwkweDFmYTgsIDB4MDAwMywgIDB4MDMwMCwgMHgwZjc2LCAgMHgwMzAxLCAweDBmNzgsICAweDAzNDIsIDB4MGY3YSwKKwkvKiAweDAzMTQgMHgwM2E5IDB4MDM0NSAqLworCTB4MWZhOSwgMHgwMDAzLCAgMHgwMzAwLCAweDBmN2MsICAweDAzMDEsIDB4MGY3ZSwgIDB4MDM0MiwgMHgwZjgwLAorCS8qIDB4MDMwMCAweDAzYjEgMHgwMzQ1ICovCisJMHgxZmIyLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDNiMSAweDAzNDUgKi8KKwkweDFmYjQsIDB4MDAwMCwKKwkvKiAweDAzMTMgMHgwM2IxIDB4MDM0NSAqLworCTB4MWY4MCwgMHgwMDAzLCAgMHgwMzAwLCAweDBmODIsICAweDAzMDEsIDB4MGY4NCwgIDB4MDM0MiwgMHgwZjg2LAorCS8qIDB4MDMxNCAweDAzYjEgMHgwMzQ1ICovCisJMHgxZjgxLCAweDAwMDMsICAweDAzMDAsIDB4MGY4OCwgIDB4MDMwMSwgMHgwZjhhLCAgMHgwMzQyLCAweDBmOGMsCisJLyogMHgwMzQyIDB4MDNiMSAweDAzNDUgKi8KKwkweDFmYjcsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwM2I3IDB4MDM0NSAqLworCTB4MWZjMiwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzYjcgMHgwMzQ1ICovCisJMHgxZmM0LCAweDAwMDAsCisJLyogMHgwMzEzIDB4MDNiNyAweDAzNDUgKi8KKwkweDFmOTAsIDB4MDAwMywgIDB4MDMwMCwgMHgwZjhlLCAgMHgwMzAxLCAweDBmOTAsICAweDAzNDIsIDB4MGY5MiwKKwkvKiAweDAzMTQgMHgwM2I3IDB4MDM0NSAqLworCTB4MWY5MSwgMHgwMDAzLCAgMHgwMzAwLCAweDBmOTQsICAweDAzMDEsIDB4MGY5NiwgIDB4MDM0MiwgMHgwZjk4LAorCS8qIDB4MDM0MiAweDAzYjcgMHgwMzQ1ICovCisJMHgxZmM3LCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDNiZiAweDAzNDUgKi8KKwkweDFmZjQsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwM2M5IDB4MDM0NSAqLworCTB4MWZmMiwgMHgwMDAwLAorCS8qIDB4MDMxMyAweDAzYzkgMHgwMzQ1ICovCisJMHgxZmEwLCAweDAwMDMsICAweDAzMDAsIDB4MGY5YSwgIDB4MDMwMSwgMHgwZjljLCAgMHgwMzQyLCAweDBmOWUsCisJLyogMHgwMzE0IDB4MDNjOSAweDAzNDUgKi8KKwkweDFmYTEsIDB4MDAwMywgIDB4MDMwMCwgMHgwZmEwLCAgMHgwMzAxLCAweDBmYTIsICAweDAzNDIsIDB4MGZhNCwKKwkvKiAweDAzNDIgMHgwM2M5IDB4MDM0NSAqLworCTB4MWZmNywgMHgwMDAwLAorCS8qIDB4MDVjMSAweDA1ZTkgMHgwNWJjICovCisJMHhmYjJjLCAweDAwMDAsCisJLyogMHgwNWMyIDB4MDVlOSAweDA1YmMgKi8KKwkweGZiMmQsIDB4MDAwMCwKKwkvKiAweDBjZDUgMHgwY2M2IDB4MGNjMiAqLworCTB4MGNjYiwgMHgwMDAwLAorCS8qIDB4MGY3MSAweDBmYjIgMHgwZjgwICovCisJMHgwZjc3LCAweDAwMDAsCisJLyogMHgwZjcxIDB4MGZiMyAweDBmODAgKi8KKwkweDBmNzksIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzEzIDB4MDM5MSAweDAzNDUgKi8KKwkweDFmOGEsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzEzIDB4MDM5MSAweDAzNDUgKi8KKwkweDFmOGMsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzEzIDB4MDM5MSAweDAzNDUgKi8KKwkweDFmOGUsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzE0IDB4MDM5MSAweDAzNDUgKi8KKwkweDFmOGIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzE0IDB4MDM5MSAweDAzNDUgKi8KKwkweDFmOGQsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzE0IDB4MDM5MSAweDAzNDUgKi8KKwkweDFmOGYsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzEzIDB4MDM5NyAweDAzNDUgKi8KKwkweDFmOWEsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzEzIDB4MDM5NyAweDAzNDUgKi8KKwkweDFmOWMsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzEzIDB4MDM5NyAweDAzNDUgKi8KKwkweDFmOWUsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzE0IDB4MDM5NyAweDAzNDUgKi8KKwkweDFmOWIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzE0IDB4MDM5NyAweDAzNDUgKi8KKwkweDFmOWQsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzE0IDB4MDM5NyAweDAzNDUgKi8KKwkweDFmOWYsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzEzIDB4MDNhOSAweDAzNDUgKi8KKwkweDFmYWEsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzEzIDB4MDNhOSAweDAzNDUgKi8KKwkweDFmYWMsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzEzIDB4MDNhOSAweDAzNDUgKi8KKwkweDFmYWUsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzE0IDB4MDNhOSAweDAzNDUgKi8KKwkweDFmYWIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzE0IDB4MDNhOSAweDAzNDUgKi8KKwkweDFmYWQsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzE0IDB4MDNhOSAweDAzNDUgKi8KKwkweDFmYWYsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzEzIDB4MDNiMSAweDAzNDUgKi8KKwkweDFmODIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzEzIDB4MDNiMSAweDAzNDUgKi8KKwkweDFmODQsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzEzIDB4MDNiMSAweDAzNDUgKi8KKwkweDFmODYsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzE0IDB4MDNiMSAweDAzNDUgKi8KKwkweDFmODMsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzE0IDB4MDNiMSAweDAzNDUgKi8KKwkweDFmODUsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzE0IDB4MDNiMSAweDAzNDUgKi8KKwkweDFmODcsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzEzIDB4MDNiNyAweDAzNDUgKi8KKwkweDFmOTIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzEzIDB4MDNiNyAweDAzNDUgKi8KKwkweDFmOTQsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzEzIDB4MDNiNyAweDAzNDUgKi8KKwkweDFmOTYsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzE0IDB4MDNiNyAweDAzNDUgKi8KKwkweDFmOTMsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzE0IDB4MDNiNyAweDAzNDUgKi8KKwkweDFmOTUsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzE0IDB4MDNiNyAweDAzNDUgKi8KKwkweDFmOTcsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzEzIDB4MDNjOSAweDAzNDUgKi8KKwkweDFmYTIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzEzIDB4MDNjOSAweDAzNDUgKi8KKwkweDFmYTQsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzEzIDB4MDNjOSAweDAzNDUgKi8KKwkweDFmYTYsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzE0IDB4MDNjOSAweDAzNDUgKi8KKwkweDFmYTMsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzE0IDB4MDNjOSAweDAzNDUgKi8KKwkweDFmYTUsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzE0IDB4MDNjOSAweDAzNDUgKi8KKwkweDFmYTcsIDB4MDAwMCwKK307CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3VuaWNvZGUuYyBiL2ZzL2hmc3BsdXMvdW5pY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MGM2OTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9oZnNwbHVzL3VuaWNvZGUuYwpAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqICBsaW51eC9mcy9oZnNwbHVzL3VuaWNvZGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMQorICogQnJhZCBCb3llciAoZmxhckBhbGxhbmRyaWEuY29tKQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICoKKyAqIEhhbmRsZXIgcm91dGluZXMgZm9yIHVuaWNvZGUgc3RyaW5ncworICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgImhmc3BsdXNfZnMuaCIKKyNpbmNsdWRlICJoZnNwbHVzX3Jhdy5oIgorCisvKiBGb2xkIHRoZSBjYXNlIG9mIGEgdW5pY29kZSBjaGFyLCBnaXZlbiB0aGUgMTYgYml0IHZhbHVlICovCisvKiBSZXR1cm5zIGZvbGRlZCBjaGFyLCBvciAwIGlmIGlnbm9yYWJsZSAqLworc3RhdGljIGlubGluZSB1MTYgY2FzZV9mb2xkKHUxNiBjKQoreworICAgICAgICB1MTYgdG1wOworCisgICAgICAgIHRtcCA9IGhmc3BsdXNfY2FzZV9mb2xkX3RhYmxlW2MgPj4gOF07CisgICAgICAgIGlmICh0bXApCisgICAgICAgICAgICAgICAgdG1wID0gaGZzcGx1c19jYXNlX2ZvbGRfdGFibGVbdG1wICsgKGMgJiAweGZmKV07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0bXAgPSBjOworICAgICAgICByZXR1cm4gdG1wOworfQorCisvKiBDb21wYXJlIHVuaWNvZGUgc3RyaW5ncywgcmV0dXJuIHZhbHVlcyBsaWtlIG5vcm1hbCBzdHJjbXAgKi8KK2ludCBoZnNwbHVzX3VuaXN0cmNtcChjb25zdCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKnMxLCBjb25zdCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKnMyKQoreworCXUxNiBsZW4xLCBsZW4yLCBjMSwgYzI7CisJY29uc3QgaGZzcGx1c191bmljaHIgKnAxLCAqcDI7CisKKwlsZW4xID0gYmUxNl90b19jcHUoczEtPmxlbmd0aCk7CisJbGVuMiA9IGJlMTZfdG9fY3B1KHMyLT5sZW5ndGgpOworCXAxID0gczEtPnVuaWNvZGU7CisJcDIgPSBzMi0+dW5pY29kZTsKKworCXdoaWxlICgxKSB7CisJCWMxID0gYzIgPSAwOworCisJCXdoaWxlIChsZW4xICYmICFjMSkgeworCQkJYzEgPSBjYXNlX2ZvbGQoYmUxNl90b19jcHUoKnAxKSk7CisJCQlwMSsrOworCQkJbGVuMS0tOworCQl9CisJCXdoaWxlIChsZW4yICYmICFjMikgeworCQkJYzIgPSBjYXNlX2ZvbGQoYmUxNl90b19jcHUoKnAyKSk7CisJCQlwMisrOworCQkJbGVuMi0tOworCQl9CisKKwkJaWYgKGMxICE9IGMyKQorCQkJcmV0dXJuIChjMSA8IGMyKSA/IC0xIDogMTsKKwkJaWYgKCFjMSAmJiAhYzIpCisJCQlyZXR1cm4gMDsKKwl9Cit9CisKKyNkZWZpbmUgSGFuZ3VsX1NCYXNlCTB4YWMwMAorI2RlZmluZSBIYW5ndWxfTEJhc2UJMHgxMTAwCisjZGVmaW5lIEhhbmd1bF9WQmFzZQkweDExNjEKKyNkZWZpbmUgSGFuZ3VsX1RCYXNlCTB4MTFhNworI2RlZmluZSBIYW5ndWxfU0NvdW50CTExMTcyCisjZGVmaW5lIEhhbmd1bF9MQ291bnQJMTkKKyNkZWZpbmUgSGFuZ3VsX1ZDb3VudAkyMQorI2RlZmluZSBIYW5ndWxfVENvdW50CTI4CisjZGVmaW5lIEhhbmd1bF9OQ291bnQJKEhhbmd1bF9WQ291bnQgKiBIYW5ndWxfVENvdW50KQorCisKK3N0YXRpYyB1MTYgKmhmc3BsdXNfY29tcG9zZV9sb29rdXAodTE2ICpwLCB1MTYgY2MpCit7CisJaW50IGksIHMsIGU7CisKKwlzID0gMTsKKwllID0gcFsxXTsKKwlpZiAoIWUgfHwgY2MgPCBwW3MgKiAyXSB8fCBjYyA+IHBbZSAqIDJdKQorCQlyZXR1cm4gTlVMTDsKKwlkbyB7CisJCWkgPSAocyArIGUpIC8gMjsKKwkJaWYgKGNjID4gcFtpICogMl0pCisJCQlzID0gaSArIDE7CisJCWVsc2UgaWYgKGNjIDwgcFtpICogMl0pCisJCQllID0gaSAtIDE7CisJCWVsc2UKKwkJCXJldHVybiBoZnNwbHVzX2NvbXBvc2VfdGFibGUgKyBwW2kgKiAyICsgMV07CisJfSB3aGlsZSAocyA8PSBlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IGhmc3BsdXNfdW5pMmFzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKnVzdHIsIGNoYXIgKmFzdHIsIGludCAqbGVuX3ApCit7CisJY29uc3QgaGZzcGx1c191bmljaHIgKmlwOworCXN0cnVjdCBubHNfdGFibGUgKm5scyA9IEhGU1BMVVNfU0Ioc2IpLm5sczsKKwl1OCAqb3A7CisJdTE2IGNjLCBjMCwgYzE7CisJdTE2ICpjZTEsICpjZTI7CisJaW50IGksIGxlbiwgdXN0cmxlbiwgcmVzLCBjb21wb3NlOworCisJb3AgPSBhc3RyOworCWlwID0gdXN0ci0+dW5pY29kZTsKKwl1c3RybGVuID0gYmUxNl90b19jcHUodXN0ci0+bGVuZ3RoKTsKKwlsZW4gPSAqbGVuX3A7CisJY2UxID0gTlVMTDsKKwljb21wb3NlID0gIShIRlNQTFVTX1NCKHNiKS5mbGFncyAmIEhGU1BMVVNfU0JfTk9ERUNPTVBPU0UpOworCisJd2hpbGUgKHVzdHJsZW4gPiAwKSB7CisJCWMwID0gYmUxNl90b19jcHUoKmlwKyspOworCQl1c3RybGVuLS07CisJCS8qIHNlYXJjaCBmb3Igc2luZ2xlIGRlY29tcG9zZWQgY2hhciAqLworCQlpZiAobGlrZWx5KGNvbXBvc2UpKQorCQkJY2UxID0gaGZzcGx1c19jb21wb3NlX2xvb2t1cChoZnNwbHVzX2NvbXBvc2VfdGFibGUsIGMwKTsKKwkJaWYgKGNlMSAmJiAoY2MgPSBjZTFbMF0pKSB7CisJCQkvKiBzdGFydCBvZiBhIHBvc3NpYmx5IGRlY29tcG9zZWQgSGFuZ3VsIGNoYXIgKi8KKwkJCWlmIChjYyAhPSAweGZmZmYpCisJCQkJZ290byBkb25lOworCQkJaWYgKCF1c3RybGVuKQorCQkJCWdvdG8gc2FtZTsKKwkJCWMxID0gYmUxNl90b19jcHUoKmlwKSAtIEhhbmd1bF9WQmFzZTsKKwkJCWlmIChjMSA8IEhhbmd1bF9WQ291bnQpIHsKKwkJCQkvKiBjb21wb3NlIHRoZSBIYW5ndWwgY2hhciAqLworCQkJCWNjID0gKGMwIC0gSGFuZ3VsX0xCYXNlKSAqIEhhbmd1bF9WQ291bnQ7CisJCQkJY2MgPSAoY2MgKyBjMSkgKiBIYW5ndWxfVENvdW50OworCQkJCWNjICs9IEhhbmd1bF9TQmFzZTsKKwkJCQlpcCsrOworCQkJCXVzdHJsZW4tLTsKKwkJCQlpZiAoIXVzdHJsZW4pCisJCQkJCWdvdG8gZG9uZTsKKwkJCQljMSA9IGJlMTZfdG9fY3B1KCppcCkgLSBIYW5ndWxfVEJhc2U7CisJCQkJaWYgKGMxID4gMCAmJiBjMSA8IEhhbmd1bF9UQ291bnQpIHsKKwkJCQkJY2MgKz0gYzE7CisJCQkJCWlwKys7CisJCQkJCXVzdHJsZW4tLTsKKwkJCQl9CisJCQkJZ290byBkb25lOworCQkJfQorCQl9CisJCXdoaWxlICgxKSB7CisJCQkvKiBtYWluIGxvb3AgZm9yIGNvbW1vbiBjYXNlIG9mIG5vdCBjb21wb3NlZCBjaGFycyAqLworCQkJaWYgKCF1c3RybGVuKQorCQkJCWdvdG8gc2FtZTsKKwkJCWMxID0gYmUxNl90b19jcHUoKmlwKTsKKwkJCWlmIChsaWtlbHkoY29tcG9zZSkpCisJCQkJY2UxID0gaGZzcGx1c19jb21wb3NlX2xvb2t1cChoZnNwbHVzX2NvbXBvc2VfdGFibGUsIGMxKTsKKwkJCWlmIChjZTEpCisJCQkJYnJlYWs7CisJCQlzd2l0Y2ggKGMwKSB7CisJCQljYXNlIDA6CisJCQkJYzAgPSAweDI0MDA7CisJCQkJYnJlYWs7CisJCQljYXNlICcvJzoKKwkJCQljMCA9ICc6JzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJlcyA9IG5scy0+dW5pMmNoYXIoYzAsIG9wLCBsZW4pOworCQkJaWYgKHJlcyA8IDApIHsKKwkJCQlpZiAocmVzID09IC1FTkFNRVRPT0xPTkcpCisJCQkJCWdvdG8gb3V0OworCQkJCSpvcCA9ICc/JzsKKwkJCQlyZXMgPSAxOworCQkJfQorCQkJb3AgKz0gcmVzOworCQkJbGVuIC09IHJlczsKKwkJCWMwID0gYzE7CisJCQlpcCsrOworCQkJdXN0cmxlbi0tOworCQl9CisJCWNlMiA9IGhmc3BsdXNfY29tcG9zZV9sb29rdXAoY2UxLCBjMCk7CisJCWlmIChjZTIpIHsKKwkJCWkgPSAxOworCQkJd2hpbGUgKGkgPCB1c3RybGVuKSB7CisJCQkJY2UxID0gaGZzcGx1c19jb21wb3NlX2xvb2t1cChjZTIsIGJlMTZfdG9fY3B1KGlwW2ldKSk7CisJCQkJaWYgKCFjZTEpCisJCQkJCWJyZWFrOworCQkJCWkrKzsKKwkJCQljZTIgPSBjZTE7CisJCQl9CisJCQlpZiAoKGNjID0gY2UyWzBdKSkgeworCQkJCWlwICs9IGk7CisJCQkJdXN0cmxlbiAtPSBpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCXNhbWU6CisJCXN3aXRjaCAoYzApIHsKKwkJY2FzZSAwOgorCQkJY2MgPSAweDI0MDA7CisJCQlicmVhazsKKwkJY2FzZSAnLyc6CisJCQljYyA9ICc6JzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY2MgPSBjMDsKKwkJfQorCWRvbmU6CisJCXJlcyA9IG5scy0+dW5pMmNoYXIoY2MsIG9wLCBsZW4pOworCQlpZiAocmVzIDwgMCkgeworCQkJaWYgKHJlcyA9PSAtRU5BTUVUT09MT05HKQorCQkJCWdvdG8gb3V0OworCQkJKm9wID0gJz8nOworCQkJcmVzID0gMTsKKwkJfQorCQlvcCArPSByZXM7CisJCWxlbiAtPSByZXM7CisJfQorCXJlcyA9IDA7CitvdXQ6CisJKmxlbl9wID0gKGNoYXIgKilvcCAtIGFzdHI7CisJcmV0dXJuIHJlczsKK30KKworaW50IGhmc3BsdXNfYXNjMnVuaShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKnVzdHIsIGNvbnN0IGNoYXIgKmFzdHIsIGludCBsZW4pCit7CisJc3RydWN0IG5sc190YWJsZSAqbmxzID0gSEZTUExVU19TQihzYikubmxzOworCWludCBzaXplLCBvZmYsIGRlY29tcG9zZTsKKwl3Y2hhcl90IGM7CisJdTE2IG91dGxlbiA9IDA7CisKKwlkZWNvbXBvc2UgPSAhKEhGU1BMVVNfU0Ioc2IpLmZsYWdzICYgSEZTUExVU19TQl9OT0RFQ09NUE9TRSk7CisKKwl3aGlsZSAob3V0bGVuIDwgSEZTUExVU19NQVhfU1RSTEVOICYmIGxlbiA+IDApIHsKKwkJc2l6ZSA9IG5scy0+Y2hhcjJ1bmkoYXN0ciwgbGVuLCAmYyk7CisJCWlmIChzaXplIDw9IDApIHsKKwkJCWMgPSAnPyc7CisJCQlzaXplID0gMTsKKwkJfQorCQlhc3RyICs9IHNpemU7CisJCWxlbiAtPSBzaXplOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAweDI0MDA6CisJCQljID0gMDsKKwkJCWJyZWFrOworCQljYXNlICc6JzoKKwkJCWMgPSAnLyc7CisJCQlicmVhazsKKwkJfQorCQlpZiAoYyA+PSAweGMwICYmIGRlY29tcG9zZSkgeworCQkJb2ZmID0gaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbKGMgPj4gMTIpICYgMHhmXTsKKwkJCWlmICghb2ZmKQorCQkJCWdvdG8gZG9uZTsKKwkJCWlmIChvZmYgPT0gMHhmZmZmKSB7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJb2ZmID0gaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbb2ZmICsgKChjID4+IDgpICYgMHhmKV07CisJCQlpZiAoIW9mZikKKwkJCQlnb3RvIGRvbmU7CisJCQlvZmYgPSBoZnNwbHVzX2RlY29tcG9zZV90YWJsZVtvZmYgKyAoKGMgPj4gNCkgJiAweGYpXTsKKwkJCWlmICghb2ZmKQorCQkJCWdvdG8gZG9uZTsKKwkJCW9mZiA9IGhmc3BsdXNfZGVjb21wb3NlX3RhYmxlW29mZiArIChjICYgMHhmKV07CisJCQlzaXplID0gb2ZmICYgMzsKKwkJCWlmICghc2l6ZSkKKwkJCQlnb3RvIGRvbmU7CisJCQlvZmYgLz0gNDsKKwkJCWlmIChvdXRsZW4gKyBzaXplID4gSEZTUExVU19NQVhfU1RSTEVOKQorCQkJCWJyZWFrOworCQkJZG8geworCQkJCXVzdHItPnVuaWNvZGVbb3V0bGVuKytdID0gY3B1X3RvX2JlMTYoaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbb2ZmKytdKTsKKwkJCX0gd2hpbGUgKC0tc2l6ZSA+IDApOworCQkJY29udGludWU7CisJCX0KKwlkb25lOgorCQl1c3RyLT51bmljb2RlW291dGxlbisrXSA9IGNwdV90b19iZTE2KGMpOworCX0KKwl1c3RyLT5sZW5ndGggPSBjcHVfdG9fYmUxNihvdXRsZW4pOworCWlmIChsZW4gPiAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvd3JhcHBlci5jIGIvZnMvaGZzcGx1cy93cmFwcGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1MWQ2MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmc3BsdXMvd3JhcHBlci5jCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogIGxpbnV4L2ZzL2hmc3BsdXMvd3JhcHBlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxCisgKiBCcmFkIEJveWVyIChmbGFyQGFsbGFuZHJpYS5jb20pCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKgorICogSGFuZGxpbmcgb2YgSEZTIHdyYXBwZXJzIGFyb3VuZCBIRlMrIHZvbHVtZXMKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworI2luY2x1ZGUgImhmc3BsdXNfZnMuaCIKKyNpbmNsdWRlICJoZnNwbHVzX3Jhdy5oIgorCitzdHJ1Y3QgaGZzcGx1c193ZCB7CisJdTMyIGFibGtfc2l6ZTsKKwl1MTYgYWJsa19zdGFydDsKKwl1MTYgZW1iZWRfc3RhcnQ7CisJdTE2IGVtYmVkX2NvdW50OworfTsKKworc3RhdGljIGludCBoZnNwbHVzX3JlYWRfbWRiKHZvaWQgKmJ1ZnB0ciwgc3RydWN0IGhmc3BsdXNfd2QgKndkKQoreworCXUzMiBleHRlbnQ7CisJdTE2IGF0dHJpYjsKKworCWlmIChiZTE2X3RvX2NwdSgqKF9fYmUxNiAqKShidWZwdHIgKyBIRlNQX1dSQVBPRkZfRU1CRURTSUcpKSAhPSBIRlNQTFVTX1ZPTEhFQURfU0lHKQorCQlyZXR1cm4gMDsKKworCWF0dHJpYiA9IGJlMTZfdG9fY3B1KCooX19iZTE2ICopKGJ1ZnB0ciArIEhGU1BfV1JBUE9GRl9BVFRSSUIpKTsKKwlpZiAoIShhdHRyaWIgJiBIRlNQX1dSQVBfQVRUUklCX1NMT0NLKSB8fAorCSAgICEoYXR0cmliICYgSEZTUF9XUkFQX0FUVFJJQl9TUEFSRUQpKQorCQlyZXR1cm4gMDsKKworCXdkLT5hYmxrX3NpemUgPSBiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKShidWZwdHIgKyBIRlNQX1dSQVBPRkZfQUJMS1NJWkUpKTsKKwlpZiAod2QtPmFibGtfc2l6ZSA8IEhGU1BMVVNfU0VDVE9SX1NJWkUpCisJCXJldHVybiAwOworCWlmICh3ZC0+YWJsa19zaXplICUgSEZTUExVU19TRUNUT1JfU0laRSkKKwkJcmV0dXJuIDA7CisJd2QtPmFibGtfc3RhcnQgPSBiZTE2X3RvX2NwdSgqKF9fYmUxNiAqKShidWZwdHIgKyBIRlNQX1dSQVBPRkZfQUJMS1NUQVJUKSk7CisKKwlleHRlbnQgPSBiZTMyX3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX2JlMzIgKikoYnVmcHRyICsgSEZTUF9XUkFQT0ZGX0VNQkVERVhUKSkpOworCXdkLT5lbWJlZF9zdGFydCA9IChleHRlbnQgPj4gMTYpICYgMHhGRkZGOworCXdkLT5lbWJlZF9jb3VudCA9IGV4dGVudCAmIDB4RkZGRjsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfZ2V0X2xhc3Rfc2Vzc2lvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICBzZWN0b3JfdCAqc3RhcnQsIHNlY3Rvcl90ICpzaXplKQoreworCXN0cnVjdCBjZHJvbV9tdWx0aXNlc3Npb24gbXNfaW5mbzsKKwlzdHJ1Y3QgY2Ryb21fdG9jZW50cnkgdGU7CisJaW50IHJlczsKKworCS8qIGRlZmF1bHQgdmFsdWVzICovCisJKnN0YXJ0ID0gMDsKKwkqc2l6ZSA9IHNiLT5zX2JkZXYtPmJkX2lub2RlLT5pX3NpemUgPj4gOTsKKworCWlmIChIRlNQTFVTX1NCKHNiKS5zZXNzaW9uID49IDApIHsKKwkJdGUuY2R0ZV90cmFjayA9IEhGU1BMVVNfU0Ioc2IpLnNlc3Npb247CisJCXRlLmNkdGVfZm9ybWF0ID0gQ0RST01fTEJBOworCQlyZXMgPSBpb2N0bF9ieV9iZGV2KHNiLT5zX2JkZXYsIENEUk9NUkVBRFRPQ0VOVFJZLCAodW5zaWduZWQgbG9uZykmdGUpOworCQlpZiAoIXJlcyAmJiAodGUuY2R0ZV9jdHJsICYgQ0RST01fREFUQV9UUkFDSykgPT0gNCkgeworCQkJKnN0YXJ0ID0gKHNlY3Rvcl90KXRlLmNkdGVfYWRkci5sYmEgPDwgMjsKKwkJCXJldHVybiAwOworCQl9CisJCXByaW50ayhLRVJOX0VSUiAiSEZTOiBJbnZhbGlkIHNlc3Npb24gbnVtYmVyIG9yIHR5cGUgb2YgdHJhY2tcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbXNfaW5mby5hZGRyX2Zvcm1hdCA9IENEUk9NX0xCQTsKKwlyZXMgPSBpb2N0bF9ieV9iZGV2KHNiLT5zX2JkZXYsIENEUk9NTVVMVElTRVNTSU9OLCAodW5zaWduZWQgbG9uZykmbXNfaW5mbyk7CisJaWYgKCFyZXMgJiYgbXNfaW5mby54YV9mbGFnKQorCQkqc3RhcnQgPSAoc2VjdG9yX3QpbXNfaW5mby5hZGRyLmxiYSA8PCAyOworCXJldHVybiAwOworfQorCisvKiBGaW5kIHRoZSB2b2x1bWUgaGVhZGVyIGFuZCBmaWxsIGluIHNvbWUgbWluaW11bSBiaXRzIGluIHN1cGVyYmxvY2sgKi8KKy8qIFRha2VzIGluIHN1cGVyIGJsb2NrLCByZXR1cm5zIHRydWUgaWYgZ29vZCBkYXRhIHJlYWQgKi8KK2ludCBoZnNwbHVzX3JlYWRfd3JhcHBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGhmc3BsdXNfdmggKnZoZHI7CisJc3RydWN0IGhmc3BsdXNfd2Qgd2Q7CisJc2VjdG9yX3QgcGFydF9zdGFydCwgcGFydF9zaXplOworCXUzMiBibG9ja3NpemU7CisKKwlibG9ja3NpemUgPSBzYl9taW5fYmxvY2tzaXplKHNiLCBIRlNQTFVTX1NFQ1RPUl9TSVpFKTsKKwlpZiAoIWJsb2Nrc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaGZzcGx1c19nZXRfbGFzdF9zZXNzaW9uKHNiLCAmcGFydF9zdGFydCwgJnBhcnRfc2l6ZSkpCisJCXJldHVybiAtRUlOVkFMOworCXdoaWxlICgxKSB7CisJCWJoID0gc2JfYnJlYWQ1MTIoc2IsIHBhcnRfc3RhcnQgKyBIRlNQTFVTX1ZPTEhFQURfU0VDVE9SLCB2aGRyKTsKKwkJaWYgKCFiaCkKKwkJCXJldHVybiAtRUlPOworCisJCWlmICh2aGRyLT5zaWduYXR1cmUgPT0gY3B1X3RvX2JlMTYoSEZTUF9XUkFQX01BR0lDKSkgeworCQkJaWYgKCFoZnNwbHVzX3JlYWRfbWRiKHZoZHIsICZ3ZCkpCisJCQkJZ290byBlcnJvcjsKKwkJCXdkLmFibGtfc2l6ZSA+Pj0gSEZTUExVU19TRUNUT1JfU0hJRlQ7CisJCQlwYXJ0X3N0YXJ0ICs9IHdkLmFibGtfc3RhcnQgKyB3ZC5lbWJlZF9zdGFydCAqIHdkLmFibGtfc2l6ZTsKKwkJCXBhcnRfc2l6ZSA9IHdkLmVtYmVkX2NvdW50ICogd2QuYWJsa19zaXplOworCQkJYnJlbHNlKGJoKTsKKwkJCWJoID0gc2JfYnJlYWQ1MTIoc2IsIHBhcnRfc3RhcnQgKyBIRlNQTFVTX1ZPTEhFQURfU0VDVE9SLCB2aGRyKTsKKwkJCWlmICghYmgpCisJCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJaWYgKHZoZHItPnNpZ25hdHVyZSA9PSBjcHVfdG9fYmUxNihIRlNQTFVTX1ZPTEhFQURfU0lHKSkKKwkJCWJyZWFrOworCQlicmVsc2UoYmgpOworCisJCS8qIGNoZWNrIGZvciBhIHBhcnRpdGlvbiBibG9jaworCQkgKiAoc2hvdWxkIGRvIHRoaXMgb25seSBmb3IgY2Ryb20vbG9vcCB0aG91Z2gpCisJCSAqLworCQlpZiAoaGZzX3BhcnRfZmluZChzYiwgJnBhcnRfc3RhcnQsICZwYXJ0X3NpemUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYmxvY2tzaXplID0gYmUzMl90b19jcHUodmhkci0+YmxvY2tzaXplKTsKKwlicmVsc2UoYmgpOworCisJLyogYmxvY2sgc2l6ZSBtdXN0IGJlIGF0IGxlYXN0IGFzIGxhcmdlIGFzIGEgc2VjdG9yCisJICogYW5kIGEgbXVsdGlwbGUgb2YgMgorCSAqLworCWlmIChibG9ja3NpemUgPCBIRlNQTFVTX1NFQ1RPUl9TSVpFIHx8CisJICAgICgoYmxvY2tzaXplIC0gMSkgJiBibG9ja3NpemUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlIRlNQTFVTX1NCKHNiKS5hbGxvY19ibGtzeiA9IGJsb2Nrc2l6ZTsKKwlIRlNQTFVTX1NCKHNiKS5hbGxvY19ibGtzel9zaGlmdCA9IDA7CisJd2hpbGUgKChibG9ja3NpemUgPj49IDEpICE9IDApCisJCUhGU1BMVVNfU0Ioc2IpLmFsbG9jX2Jsa3N6X3NoaWZ0Kys7CisJYmxvY2tzaXplID0gbWluKEhGU1BMVVNfU0Ioc2IpLmFsbG9jX2Jsa3N6LCAodTMyKVBBR0VfU0laRSk7CisKKwkvKiBhbGlnbiBibG9jayBzaXplIHRvIGJsb2NrIG9mZnNldCAqLworCXdoaWxlIChwYXJ0X3N0YXJ0ICYgKChibG9ja3NpemUgPj4gSEZTUExVU19TRUNUT1JfU0hJRlQpIC0gMSkpCisJCWJsb2Nrc2l6ZSA+Pj0gMTsKKworCWlmIChzYl9zZXRfYmxvY2tzaXplKHNiLCBibG9ja3NpemUpICE9IGJsb2Nrc2l6ZSkgeworCQlwcmludGsoIkhGUys6IHVuYWJsZSB0byBibG9ja3NpemUgdG8gJXUhXG4iLCBibG9ja3NpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlIRlNQTFVTX1NCKHNiKS5ibG9ja29mZnNldCA9IHBhcnRfc3RhcnQgPj4KKwkJCShzYi0+c19ibG9ja3NpemVfYml0cyAtIEhGU1BMVVNfU0VDVE9SX1NISUZUKTsKKwlIRlNQTFVTX1NCKHNiKS5zZWN0X2NvdW50ID0gcGFydF9zaXplOworCUhGU1BMVVNfU0Ioc2IpLmZzX3NoaWZ0ID0gSEZTUExVU19TQihzYikuYWxsb2NfYmxrc3pfc2hpZnQgLQorCQkJc2ItPnNfYmxvY2tzaXplX2JpdHM7CisKKwliaCA9IHNiX2JyZWFkNTEyKHNiLCBwYXJ0X3N0YXJ0ICsgSEZTUExVU19WT0xIRUFEX1NFQ1RPUiwgdmhkcik7CisJaWYgKCFiaCkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBzaG91bGQgc3RpbGwgYmUgdGhlIHNhbWUuLi4gKi8KKwlpZiAoYmUxNl90b19jcHUodmhkci0+c2lnbmF0dXJlKSAhPSBIRlNQTFVTX1ZPTEhFQURfU0lHKQorCQlnb3RvIGVycm9yOworCUhGU1BMVVNfU0Ioc2IpLnNfdmhiaCA9IGJoOworCUhGU1BMVVNfU0Ioc2IpLnNfdmhkciA9IHZoZHI7CisKKwlyZXR1cm4gMDsKKyBlcnJvcjoKKwlicmVsc2UoYmgpOworCXJldHVybiAtRUlOVkFMOworfQpkaWZmIC0tZ2l0IGEvZnMvaG9zdGZzL01ha2VmaWxlIGIvZnMvaG9zdGZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YmVhZmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ob3N0ZnMvTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDAgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisjCisKK2hvc3Rmcy1vYmpzIDo9IGhvc3Rmc19rZXJuLm8gaG9zdGZzX3VzZXIubworCitvYmoteSA6PQorb2JqLSQoQ09ORklHX0hPU1RGUykgKz0gaG9zdGZzLm8KKworaW5jbHVkZSBhcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMKZGlmZiAtLWdpdCBhL2ZzL2hvc3Rmcy9ob3N0ZnMuaCBiL2ZzL2hvc3Rmcy9ob3N0ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTUxNmQwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaG9zdGZzL2hvc3Rmcy5oCkBAIC0wLDAgKzEsMTAwIEBACisjaWZuZGVmIF9fVU1fRlNfSE9TVEZTCisjZGVmaW5lIF9fVU1fRlNfSE9TVEZTCisKKyNpbmNsdWRlICJvcy5oIgorCisvKiBUaGVzZSBhcmUgZXhhY3RseSB0aGUgc2FtZSBkZWZpbml0aW9ucyBhcyBpbiBmcy5oLCBidXQgdGhlIG5hbWVzIGFyZQorICogY2hhbmdlZCBzbyB0aGF0IHRoaXMgZmlsZSBjYW4gYmUgaW5jbHVkZWQgaW4gYm90aCBrZXJuZWwgYW5kIHVzZXIgZmlsZXMuCisgKi8KKworI2RlZmluZSBIT1NURlNfQVRUUl9NT0RFCTEKKyNkZWZpbmUgSE9TVEZTX0FUVFJfVUlEIAkyCisjZGVmaW5lIEhPU1RGU19BVFRSX0dJRCAJNAorI2RlZmluZSBIT1NURlNfQVRUUl9TSVpFCTgKKyNkZWZpbmUgSE9TVEZTX0FUVFJfQVRJTUUJMTYKKyNkZWZpbmUgSE9TVEZTX0FUVFJfTVRJTUUJMzIKKyNkZWZpbmUgSE9TVEZTX0FUVFJfQ1RJTUUJNjQKKyNkZWZpbmUgSE9TVEZTX0FUVFJfQVRJTUVfU0VUCTEyOAorI2RlZmluZSBIT1NURlNfQVRUUl9NVElNRV9TRVQJMjU2CisKKy8qIFRoZXNlIHR3byBhcmUgdW51c2VkIGJ5IGhvc3Rmcy4gKi8KKyNkZWZpbmUgSE9TVEZTX0FUVFJfRk9SQ0UJNTEyCS8qIE5vdCBhIGNoYW5nZSwgYnV0IGEgY2hhbmdlIGl0ICovCisjZGVmaW5lIEhPU1RGU19BVFRSX0FUVFJfRkxBRwkxMDI0CisKKy8qIElmIHlvdSBhcmUgdmVyeSBjYXJlZnVsLCB5b3UnbGwgbm90aWNlIHRoYXQgdGhlc2UgdHdvIGFyZSBtaXNzaW5nOgorICoKKyAqICNkZWZpbmUgQVRUUl9LSUxMX1NVSUQJMjA0OAorICogI2RlZmluZSBBVFRSX0tJTExfU0dJRAk0MDk2CisgKgorICogYW5kIHRoaXMgaXMgYmVjYXVzZSB0aGV5IHdlcmUgYWRkZWQgaW4gMi41IGRldmVsb3BtZW50IGluIHRoaXMgcGF0Y2g6CisgKgorICogaHR0cDovL2xpbnV4LmJrYml0cy5uZXQ6ODA4MC9saW51eC0yLjUvCisgKiBjc2V0QDNjYWY0YTEyazRYZ0R6Szd3eUstVEdwU1o5dTJXdz9uYXY9aW5kZXguaHRtbAorICogfHNyYy8ufHNyYy9pbmNsdWRlfHNyYy9pbmNsdWRlL2xpbnV4fHJlbGF0ZWQvaW5jbHVkZS9saW51eC9mcy5oCisgKgorICogQWN0dWFsbHksIHRoZXkgYXJlIG5vdCBuZWVkZWQgYnkgbW9zdCAtPnNldGF0dHIoKSBtZXRob2RzIC0gdGhleSBhcmUgc2V0IGJ5CisgKiBjYWxsZXJzIG9mIG5vdGlmeV9jaGFuZ2UoKSB0byBub3RpZnkgdGhhdCB0aGUgc2V0dWlkL3NldGdpZCBiaXRzIG11c3QgYmUKKyAqIGRyb3BwZWQuCisgKiBub3RpZnlfY2hhbmdlKCkgd2lsbCBkZWxldGUgdGhvc2UgZmxhZ3MsIG1ha2Ugc3VyZSBhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERQorICogaXMgb24sIGFuZCByZW1vdmUgdGhlIGFwcHJvcHJpYXRlIGJpdHMgZnJvbSBhdHRyLT5pYV9tb2RlIChhdHRyIGlzIGEKKyAqICJzdHJ1Y3QgaWF0dHIgKiIpLiAtQmxhaXNvckJsYWRlCisgKi8KKworc3RydWN0IGhvc3Rmc19pYXR0ciB7CisJdW5zaWduZWQgaW50CWlhX3ZhbGlkOworCW1vZGVfdAkJaWFfbW9kZTsKKwl1aWRfdAkJaWFfdWlkOworCWdpZF90CQlpYV9naWQ7CisJbG9mZl90CQlpYV9zaXplOworCXN0cnVjdCB0aW1lc3BlYwlpYV9hdGltZTsKKwlzdHJ1Y3QgdGltZXNwZWMJaWFfbXRpbWU7CisJc3RydWN0IHRpbWVzcGVjCWlhX2N0aW1lOworCXVuc2lnbmVkIGludAlpYV9hdHRyX2ZsYWdzOworfTsKKworZXh0ZXJuIGludCBzdGF0X2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgbG9uZyBsb25nICppbm9kZV9vdXQsCisJCSAgICAgaW50ICptb2RlX291dCwgaW50ICpubGlua19vdXQsIGludCAqdWlkX291dCwgaW50ICpnaWRfb3V0LAorCQkgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqc2l6ZV9vdXQsIHN0cnVjdCB0aW1lc3BlYyAqYXRpbWVfb3V0LAorCQkgICAgIHN0cnVjdCB0aW1lc3BlYyAqbXRpbWVfb3V0LCBzdHJ1Y3QgdGltZXNwZWMgKmN0aW1lX291dCwKKwkJICAgICBpbnQgKmJsa3NpemVfb3V0LCB1bnNpZ25lZCBsb25nIGxvbmcgKmJsb2Nrc19vdXQpOworZXh0ZXJuIGludCBhY2Nlc3NfZmlsZShjaGFyICpwYXRoLCBpbnQgciwgaW50IHcsIGludCB4KTsKK2V4dGVybiBpbnQgb3Blbl9maWxlKGNoYXIgKnBhdGgsIGludCByLCBpbnQgdywgaW50IGFwcGVuZCk7CitleHRlcm4gaW50IGZpbGVfdHlwZShjb25zdCBjaGFyICpwYXRoLCBpbnQgKm1haiwgaW50ICptaW4pOworZXh0ZXJuIHZvaWQgKm9wZW5fZGlyKGNoYXIgKnBhdGgsIGludCAqZXJyX291dCk7CitleHRlcm4gY2hhciAqcmVhZF9kaXIodm9pZCAqc3RyZWFtLCB1bnNpZ25lZCBsb25nIGxvbmcgKnBvcywKKwkJICAgICAgdW5zaWduZWQgbG9uZyBsb25nICppbm9fb3V0LCBpbnQgKmxlbl9vdXQpOworZXh0ZXJuIHZvaWQgY2xvc2VfZmlsZSh2b2lkICpzdHJlYW0pOworZXh0ZXJuIHZvaWQgY2xvc2VfZGlyKHZvaWQgKnN0cmVhbSk7CitleHRlcm4gaW50IHJlYWRfZmlsZShpbnQgZmQsIHVuc2lnbmVkIGxvbmcgbG9uZyAqb2Zmc2V0LCBjaGFyICpidWYsIGludCBsZW4pOworZXh0ZXJuIGludCB3cml0ZV9maWxlKGludCBmZCwgdW5zaWduZWQgbG9uZyBsb25nICpvZmZzZXQsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJICAgICAgaW50IGxlbik7CitleHRlcm4gaW50IGxzZWVrX2ZpbGUoaW50IGZkLCBsb25nIGxvbmcgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKK2V4dGVybiBpbnQgZmlsZV9jcmVhdGUoY2hhciAqbmFtZSwgaW50IHVyLCBpbnQgdXcsIGludCB1eCwgaW50IGdyLAorCQkgICAgICAgaW50IGd3LCBpbnQgZ3gsIGludCBvciwgaW50IG93LCBpbnQgb3gpOworZXh0ZXJuIGludCBzZXRfYXR0cihjb25zdCBjaGFyICpmaWxlLCBzdHJ1Y3QgaG9zdGZzX2lhdHRyICphdHRycyk7CitleHRlcm4gaW50IG1ha2Vfc3ltbGluayhjb25zdCBjaGFyICpmcm9tLCBjb25zdCBjaGFyICp0byk7CitleHRlcm4gaW50IHVubGlua19maWxlKGNvbnN0IGNoYXIgKmZpbGUpOworZXh0ZXJuIGludCBkb19ta2Rpcihjb25zdCBjaGFyICpmaWxlLCBpbnQgbW9kZSk7CitleHRlcm4gaW50IGRvX3JtZGlyKGNvbnN0IGNoYXIgKmZpbGUpOworZXh0ZXJuIGludCBkb19ta25vZChjb25zdCBjaGFyICpmaWxlLCBpbnQgbW9kZSwgaW50IGRldik7CitleHRlcm4gaW50IGxpbmtfZmlsZShjb25zdCBjaGFyICpmcm9tLCBjb25zdCBjaGFyICp0byk7CitleHRlcm4gaW50IGRvX3JlYWRsaW5rKGNoYXIgKmZpbGUsIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworZXh0ZXJuIGludCByZW5hbWVfZmlsZShjaGFyICpmcm9tLCBjaGFyICp0byk7CitleHRlcm4gaW50IGRvX3N0YXRmcyhjaGFyICpyb290LCBsb25nICpic2l6ZV9vdXQsIGxvbmcgbG9uZyAqYmxvY2tzX291dCwKKwkJICAgICBsb25nIGxvbmcgKmJmcmVlX291dCwgbG9uZyBsb25nICpiYXZhaWxfb3V0LAorCQkgICAgIGxvbmcgbG9uZyAqZmlsZXNfb3V0LCBsb25nIGxvbmcgKmZmcmVlX291dCwKKwkJICAgICB2b2lkICpmc2lkX291dCwgaW50IGZzaWRfc2l6ZSwgbG9uZyAqbmFtZWxlbl9vdXQsCisJCSAgICAgbG9uZyAqc3BhcmVfb3V0KTsKKworI2VuZGlmCisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KKyAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQorICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAorICogb2YgdGhlIGZpbGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9mcy9ob3N0ZnMvaG9zdGZzX2tlcm4uYyBiL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OGFkMjkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ob3N0ZnMvaG9zdGZzX2tlcm4uYwpAQCAtMCwwICsxLDEwNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICoKKyAqIFBvcnRlZCB0aGUgZmlsZXN5c3RlbSByb3V0aW5lcyB0byAyLjUuCisgKiAyMDAzLTAyLTEwIFBldHIgQmF1ZGlzIDxwYXNreUB1Y3cuY3o+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXRmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSAiaG9zdGZzLmgiCisjaW5jbHVkZSAia2Vybl91dGlsLmgiCisjaW5jbHVkZSAia2Vybi5oIgorI2luY2x1ZGUgInVzZXJfdXRpbC5oIgorI2luY2x1ZGUgIjJfNWNvbXBhdC5oIgorI2luY2x1ZGUgImluaXQuaCIKKworc3RydWN0IGhvc3Rmc19pbm9kZV9pbmZvIHsKKwljaGFyICpob3N0X2ZpbGVuYW1lOworCWludCBmZDsKKwlpbnQgbW9kZTsKKwlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaG9zdGZzX2lub2RlX2luZm8gKkhPU1RGU19JKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuKGxpc3RfZW50cnkoaW5vZGUsIHN0cnVjdCBob3N0ZnNfaW5vZGVfaW5mbywgdmZzX2lub2RlKSk7Cit9CisKKyNkZWZpbmUgRklMRV9IT1NURlNfSShmaWxlKSBIT1NURlNfSSgoZmlsZSktPmZfZGVudHJ5LT5kX2lub2RlKQorCitpbnQgaG9zdGZzX2RfZGVsZXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlyZXR1cm4oMSk7Cit9CisKK3N0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBob3N0ZnNfZGVudHJ5X29wcyA9IHsKKwkuZF9kZWxldGUJCT0gaG9zdGZzX2RfZGVsZXRlLAorfTsKKworLyogQ2hhbmdlZCBpbiBob3N0ZnNfYXJncyBiZWZvcmUgdGhlIGtlcm5lbCBzdGFydHMgcnVubmluZyAqLworc3RhdGljIGNoYXIgKnJvb3RfaW5vID0gIi8iOworc3RhdGljIGludCBhcHBlbmQgPSAwOworCisjZGVmaW5lIEhPU1RGU19TVVBFUl9NQUdJQyAweDAwYzBmZmVlCisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBob3N0ZnNfaW9wczsKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBob3N0ZnNfZGlyX2lvcHM7CitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBob3N0ZnNfbGlua19hb3BzOworCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgaG9zdGZzX2FyZ3MoY2hhciAqb3B0aW9ucywgaW50ICphZGQpCit7CisJY2hhciAqcHRyOworCisJcHRyID0gc3RyY2hyKG9wdGlvbnMsICcsJyk7CisJaWYocHRyICE9IE5VTEwpCisJCSpwdHIrKyA9ICdcMCc7CisJaWYoKm9wdGlvbnMgIT0gJ1wwJykKKwkJcm9vdF9pbm8gPSBvcHRpb25zOworCisJb3B0aW9ucyA9IHB0cjsKKwl3aGlsZShvcHRpb25zKXsKKwkJcHRyID0gc3RyY2hyKG9wdGlvbnMsICcsJyk7CisJCWlmKHB0ciAhPSBOVUxMKQorCQkJKnB0cisrID0gJ1wwJzsKKwkJaWYoKm9wdGlvbnMgIT0gJ1wwJyl7CisJCQlpZighc3RyY21wKG9wdGlvbnMsICJhcHBlbmQiKSkKKwkJCQlhcHBlbmQgPSAxOworCQkJZWxzZSBwcmludGYoImhvc3Rmc19hcmdzIC0gdW5zdXBwb3J0ZWQgb3B0aW9uIC0gJXNcbiIsCisJCQkJICAgIG9wdGlvbnMpOworCQl9CisJCW9wdGlvbnMgPSBwdHI7CisJfQorCXJldHVybigwKTsKK30KKworX191bWxfc2V0dXAoImhvc3Rmcz0iLCBob3N0ZnNfYXJncywKKyJob3N0ZnM9PHJvb3QgZGlyPiw8ZmxhZ3M+LC4uLlxuIgorIiAgICBUaGlzIGlzIHVzZWQgdG8gc2V0IGhvc3RmcyBwYXJhbWV0ZXJzLiAgVGhlIHJvb3QgZGlyZWN0b3J5IGFyZ3VtZW50XG4iCisiICAgIGlzIHVzZWQgdG8gY29uZmluZSBhbGwgaG9zdGZzIG1vdW50cyB0byB3aXRoaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnlcbiIKKyIgICAgdHJlZSBvbiB0aGUgaG9zdC4gIElmIHRoaXMgaXNuJ3Qgc3BlY2lmaWVkLCB0aGVuIGEgdXNlciBpbnNpZGUgVU1MIGNhblxuIgorIiAgICBtb3VudCBhbnl0aGluZyBvbiB0aGUgaG9zdCB0aGF0J3MgYWNjZXNzaWJsZSB0byB0aGUgdXNlciB0aGF0J3MgcnVubmluZ1xuIgorIiAgICBpdC5cbiIKKyIgICAgVGhlIG9ubHkgZmxhZyBjdXJyZW50bHkgc3VwcG9ydGVkIGlzICdhcHBlbmQnLCB3aGljaCBzcGVjaWZpZXMgdGhhdCBhbGxcbiIKKyIgICAgZmlsZXMgb3BlbmVkIGJ5IGhvc3RmcyB3aWxsIGJlIG9wZW5lZCBpbiBhcHBlbmQgbW9kZS5cblxuIgorKTsKKyNlbmRpZgorCitzdGF0aWMgY2hhciAqZGVudHJ5X25hbWUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZXh0cmEpCit7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCWNoYXIgKnJvb3QsICpuYW1lOworCWludCBsZW47CisKKwlsZW4gPSAwOworCXBhcmVudCA9IGRlbnRyeTsKKwl3aGlsZShwYXJlbnQtPmRfcGFyZW50ICE9IHBhcmVudCl7CisJCWxlbiArPSBwYXJlbnQtPmRfbmFtZS5sZW4gKyAxOworCQlwYXJlbnQgPSBwYXJlbnQtPmRfcGFyZW50OworCX0KKworCXJvb3QgPSBIT1NURlNfSShwYXJlbnQtPmRfaW5vZGUpLT5ob3N0X2ZpbGVuYW1lOworCWxlbiArPSBzdHJsZW4ocm9vdCk7CisJbmFtZSA9IGttYWxsb2MobGVuICsgZXh0cmEgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZihuYW1lID09IE5VTEwpIHJldHVybihOVUxMKTsKKworCW5hbWVbbGVuXSA9ICdcMCc7CisJcGFyZW50ID0gZGVudHJ5OworCXdoaWxlKHBhcmVudC0+ZF9wYXJlbnQgIT0gcGFyZW50KXsKKwkJbGVuIC09IHBhcmVudC0+ZF9uYW1lLmxlbiArIDE7CisJCW5hbWVbbGVuXSA9ICcvJzsKKwkJc3RybmNweSgmbmFtZVtsZW4gKyAxXSwgcGFyZW50LT5kX25hbWUubmFtZSwKKwkJCXBhcmVudC0+ZF9uYW1lLmxlbik7CisJCXBhcmVudCA9IHBhcmVudC0+ZF9wYXJlbnQ7CisJfQorCXN0cm5jcHkobmFtZSwgcm9vdCwgc3RybGVuKHJvb3QpKTsKKwlyZXR1cm4obmFtZSk7Cit9CisKK3N0YXRpYyBjaGFyICppbm9kZV9uYW1lKHN0cnVjdCBpbm9kZSAqaW5vLCBpbnQgZXh0cmEpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCisJZGVudHJ5ID0gbGlzdF9lbnRyeShpbm8tPmlfZGVudHJ5Lm5leHQsIHN0cnVjdCBkZW50cnksIGRfYWxpYXMpOworCXJldHVybihkZW50cnlfbmFtZShkZW50cnksIGV4dHJhKSk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9uYW1lKHN0cnVjdCBpbm9kZSAqaW5vLCBjaGFyICpuYW1lKQoreworCS8qIFRoZSBub24taW50IGlub2RlIGZpZWxkcyBhcmUgY29waWVkIGludG8gaW50cyBieSBzdGF0X2ZpbGUgYW5kCisJICogdGhlbiBjb3BpZWQgaW50byB0aGUgaW5vZGUgYmVjYXVzZSBwYXNzaW5nIHRoZSBhY3R1YWwgcG9pbnRlcnMKKwkgKiBpbiBhbmQgaGF2aW5nIHRoZW0gdHJlYXRlZCBhcyBpbnQgKiBicmVha3Mgb24gYmlnLWVuZGlhbiBtYWNoaW5lcworCSAqLworCWludCBlcnI7CisJaW50IGlfbW9kZSwgaV9ubGluaywgaV9ibGtzaXplOworCXVuc2lnbmVkIGxvbmcgbG9uZyBpX3NpemU7CisJdW5zaWduZWQgbG9uZyBsb25nIGlfaW5vOworCXVuc2lnbmVkIGxvbmcgbG9uZyBpX2Jsb2NrczsKKworCWVyciA9IHN0YXRfZmlsZShuYW1lLCAmaV9pbm8sICZpX21vZGUsICZpX25saW5rLCAmaW5vLT5pX3VpZCwKKwkJCSZpbm8tPmlfZ2lkLCAmaV9zaXplLCAmaW5vLT5pX2F0aW1lLCAmaW5vLT5pX210aW1lLAorCQkJJmluby0+aV9jdGltZSwgJmlfYmxrc2l6ZSwgJmlfYmxvY2tzKTsKKwlpZihlcnIpCisJCXJldHVybihlcnIpOworCisJaW5vLT5pX2lubyA9IGlfaW5vOworCWluby0+aV9tb2RlID0gaV9tb2RlOworCWluby0+aV9ubGluayA9IGlfbmxpbms7CisJaW5vLT5pX3NpemUgPSBpX3NpemU7CisJaW5vLT5pX2Jsa3NpemUgPSBpX2Jsa3NpemU7CisJaW5vLT5pX2Jsb2NrcyA9IGlfYmxvY2tzOworCWlmKChpbm8tPmlfc2ItPnNfZGV2ID09IFJPT1RfREVWKSAmJiAoaW5vLT5pX3VpZCA9PSBnZXR1aWQoKSkpCisJCWluby0+aV91aWQgPSAwOworCXJldHVybigwKTsKK30KKworc3RhdGljIGNoYXIgKmZvbGxvd19saW5rKGNoYXIgKmxpbmspCit7CisJaW50IGxlbiwgbjsKKwljaGFyICpuYW1lLCAqcmVzb2x2ZWQsICplbmQ7CisKKwlsZW4gPSA2NDsKKwl3aGlsZSgxKXsKKwkJbiA9IC1FTk9NRU07CisJCW5hbWUgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmKG5hbWUgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCisJCW4gPSBkb19yZWFkbGluayhsaW5rLCBuYW1lLCBsZW4pOworCQlpZihuIDwgbGVuKQorCQkJYnJlYWs7CisJCWxlbiAqPSAyOworCQlrZnJlZShuYW1lKTsKKwl9CisJaWYobiA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlpZigqbmFtZSA9PSAnLycpCisJCXJldHVybihuYW1lKTsKKworCWVuZCA9IHN0cnJjaHIobGluaywgJy8nKTsKKwlpZihlbmQgPT0gTlVMTCkKKwkJcmV0dXJuKG5hbWUpOworCisJKihlbmQgKyAxKSA9ICdcMCc7CisJbGVuID0gc3RybGVuKGxpbmspICsgc3RybGVuKG5hbWUpICsgMTsKKworCXJlc29sdmVkID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmKHJlc29sdmVkID09IE5VTEwpeworCQluID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlzcHJpbnRmKHJlc29sdmVkLCAiJXMlcyIsIGxpbmssIG5hbWUpOworCWtmcmVlKG5hbWUpOworCWtmcmVlKGxpbmspOworCXJldHVybihyZXNvbHZlZCk7CisKKyBvdXRfZnJlZToKKwlrZnJlZShuYW1lKTsKKyBvdXQ6CisJcmV0dXJuKEVSUl9QVFIobikpOworfQorCitzdGF0aWMgaW50IHJlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm8pCit7CisJY2hhciAqbmFtZTsKKwlpbnQgZXJyID0gMDsKKworCS8qIFVuZm9ydHVuYXRlbHksIHdlIGFyZSBjYWxsZWQgZnJvbSBpZ2V0KCkgd2hlbiB3ZSBkb24ndCBoYXZlIGEgZGVudHJ5CisJICogYWxsb2NhdGVkIHlldC4KKwkgKi8KKwlpZihsaXN0X2VtcHR5KCZpbm8tPmlfZGVudHJ5KSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRU5PTUVNOworCW5hbWUgPSBpbm9kZV9uYW1lKGlubywgMCk7CisJaWYobmFtZSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWlmKGZpbGVfdHlwZShuYW1lLCBOVUxMLCBOVUxMKSA9PSBPU19UWVBFX1NZTUxJTkspeworCQluYW1lID0gZm9sbG93X2xpbmsobmFtZSk7CisJCWlmKElTX0VSUihuYW1lKSl7CisJCQllcnIgPSBQVFJfRVJSKG5hbWUpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwllcnIgPSByZWFkX25hbWUoaW5vLCBuYW1lKTsKKwlrZnJlZShuYW1lKTsKKyBvdXQ6CisJcmV0dXJuKGVycik7Cit9CisKK2ludCBob3N0ZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpzZikKK3sKKwkvKiBkb19zdGF0ZnMgdXNlcyBzdHJ1Y3Qgc3RhdGZzNjQgaW50ZXJuYWxseSwgYnV0IHRoZSBsaW51eCBrZXJuZWwKKwkgKiBzdHJ1Y3Qgc3RhdGZzIHN0aWxsIGhhcyAzMi1iaXQgdmVyc2lvbnMgZm9yIG1vc3Qgb2YgdGhlc2UgZmllbGRzLAorCSAqIHNvIHdlIGNvbnZlcnQgdGhlbSBoZXJlCisJICovCisJaW50IGVycjsKKwlsb25nIGxvbmcgZl9ibG9ja3M7CisJbG9uZyBsb25nIGZfYmZyZWU7CisJbG9uZyBsb25nIGZfYmF2YWlsOworCWxvbmcgbG9uZyBmX2ZpbGVzOworCWxvbmcgbG9uZyBmX2ZmcmVlOworCisJZXJyID0gZG9fc3RhdGZzKEhPU1RGU19JKHNiLT5zX3Jvb3QtPmRfaW5vZGUpLT5ob3N0X2ZpbGVuYW1lLAorCQkJJnNmLT5mX2JzaXplLCAmZl9ibG9ja3MsICZmX2JmcmVlLCAmZl9iYXZhaWwsICZmX2ZpbGVzLAorCQkJJmZfZmZyZWUsICZzZi0+Zl9mc2lkLCBzaXplb2Yoc2YtPmZfZnNpZCksCisJCQkmc2YtPmZfbmFtZWxlbiwgc2YtPmZfc3BhcmUpOworCWlmKGVycikgcmV0dXJuKGVycik7CisJc2YtPmZfYmxvY2tzID0gZl9ibG9ja3M7CisJc2YtPmZfYmZyZWUgPSBmX2JmcmVlOworCXNmLT5mX2JhdmFpbCA9IGZfYmF2YWlsOworCXNmLT5mX2ZpbGVzID0gZl9maWxlczsKKwlzZi0+Zl9mZnJlZSA9IGZfZmZyZWU7CisJc2YtPmZfdHlwZSA9IEhPU1RGU19TVVBFUl9NQUdJQzsKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmhvc3Rmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBob3N0ZnNfaW5vZGVfaW5mbyAqaGk7CisKKwloaSA9IGttYWxsb2Moc2l6ZW9mKCpoaSksIEdGUF9LRVJORUwpOworCWlmKGhpID09IE5VTEwpCisJCXJldHVybihOVUxMKTsKKworCSpoaSA9ICgoc3RydWN0IGhvc3Rmc19pbm9kZV9pbmZvKSB7IC5ob3N0X2ZpbGVuYW1lCT0gTlVMTCwKKwkJCQkJICAgIC5mZAkJCT0gLTEsCisJCQkJCSAgICAubW9kZQkJPSAwIH0pOworCWlub2RlX2luaXRfb25jZSgmaGktPnZmc19pbm9kZSk7CisJcmV0dXJuKCZoaS0+dmZzX2lub2RlKTsKK30KKworc3RhdGljIHZvaWQgaG9zdGZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmKEhPU1RGU19JKGlub2RlKS0+ZmQgIT0gLTEpIHsKKwkJY2xvc2VfZmlsZSgmSE9TVEZTX0koaW5vZGUpLT5mZCk7CisJCUhPU1RGU19JKGlub2RlKS0+ZmQgPSAtMTsKKwl9CisJY2xlYXJfaW5vZGUoaW5vZGUpOworfQorCitzdGF0aWMgdm9pZCBob3N0ZnNfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmKEhPU1RGU19JKGlub2RlKS0+aG9zdF9maWxlbmFtZSkKKwkJa2ZyZWUoSE9TVEZTX0koaW5vZGUpLT5ob3N0X2ZpbGVuYW1lKTsKKworCS8qWFhYOiBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCBwcm9iYWJseS4gVGhlIGNoZWNrIGlzIGhlcmUgZm9yCisJICogYWRkaXRpb25hbCBzYWZldHkuKi8KKwlpZihIT1NURlNfSShpbm9kZSktPmZkICE9IC0xKSB7CisJCWNsb3NlX2ZpbGUoJkhPU1RGU19JKGlub2RlKS0+ZmQpOworCQlwcmludGsoS0VSTl9ERUJVRyAiQ2xvc2luZyBob3N0IGZkIGluIC5kZXN0cm95X2lub2RlXG4iKTsKKwl9CisKKwlrZnJlZShIT1NURlNfSShpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBob3N0ZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJlYWRfaW5vZGUoaW5vZGUpOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgaG9zdGZzX3Nib3BzID0geworCS5hbGxvY19pbm9kZQk9IGhvc3Rmc19hbGxvY19pbm9kZSwKKwkuZHJvcF9pbm9kZQk9IGdlbmVyaWNfZGVsZXRlX2lub2RlLAorCS5kZWxldGVfaW5vZGUgICA9IGhvc3Rmc19kZWxldGVfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSBob3N0ZnNfZGVzdHJveV9pbm9kZSwKKwkucmVhZF9pbm9kZQk9IGhvc3Rmc19yZWFkX2lub2RlLAorCS5zdGF0ZnMJCT0gaG9zdGZzX3N0YXRmcywKK307CisKK2ludCBob3N0ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwl2b2lkICpkaXI7CisJY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbmV4dCwgaW5vOworCWludCBlcnJvciwgbGVuOworCisJbmFtZSA9IGRlbnRyeV9uYW1lKGZpbGUtPmZfZGVudHJ5LCAwKTsKKwlpZihuYW1lID09IE5VTEwpIHJldHVybigtRU5PTUVNKTsKKwlkaXIgPSBvcGVuX2RpcihuYW1lLCAmZXJyb3IpOworCWtmcmVlKG5hbWUpOworCWlmKGRpciA9PSBOVUxMKSByZXR1cm4oLWVycm9yKTsKKwluZXh0ID0gZmlsZS0+Zl9wb3M7CisJd2hpbGUoKG5hbWUgPSByZWFkX2RpcihkaXIsICZuZXh0LCAmaW5vLCAmbGVuKSkgIT0gTlVMTCl7CisJCWVycm9yID0gKCpmaWxsZGlyKShlbnQsIG5hbWUsIGxlbiwgZmlsZS0+Zl9wb3MsCisJCQkJICAgaW5vLCBEVF9VTktOT1dOKTsKKwkJaWYoZXJyb3IpIGJyZWFrOworCQlmaWxlLT5mX3BvcyA9IG5leHQ7CisJfQorCWNsb3NlX2RpcihkaXIpOworCXJldHVybigwKTsKK30KKworaW50IGhvc3Rmc19maWxlX29wZW4oc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWNoYXIgKm5hbWU7CisJaW50IG1vZGUgPSAwLCByID0gMCwgdyA9IDAsIGZkOworCisJbW9kZSA9IGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpOworCWlmKChtb2RlICYgSE9TVEZTX0koaW5vKS0+bW9kZSkgPT0gbW9kZSkKKwkJcmV0dXJuKDApOworCisJLyogVGhlIGZpbGUgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIG9wZW5lZCwgYnV0IHdpdGggdGhlIHdyb25nIGFjY2VzcywKKwkgKiBzbyB0aGlzIHJlc2V0cyB0aGluZ3MgYW5kIHJlb3BlbnMgdGhlIGZpbGUgd2l0aCB0aGUgbmV3IGFjY2Vzcy4KKwkgKi8KKwlpZihIT1NURlNfSShpbm8pLT5mZCAhPSAtMSl7CisJCWNsb3NlX2ZpbGUoJkhPU1RGU19JKGlubyktPmZkKTsKKwkJSE9TVEZTX0koaW5vKS0+ZmQgPSAtMTsKKwl9CisKKwlIT1NURlNfSShpbm8pLT5tb2RlIHw9IG1vZGU7CisJaWYoSE9TVEZTX0koaW5vKS0+bW9kZSAmIEZNT0RFX1JFQUQpCisJCXIgPSAxOworCWlmKEhPU1RGU19JKGlubyktPm1vZGUgJiBGTU9ERV9XUklURSkKKwkJdyA9IDE7CisJaWYodykKKwkJciA9IDE7CisKKwluYW1lID0gZGVudHJ5X25hbWUoZmlsZS0+Zl9kZW50cnksIDApOworCWlmKG5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuKC1FTk9NRU0pOworCisJZmQgPSBvcGVuX2ZpbGUobmFtZSwgciwgdywgYXBwZW5kKTsKKwlrZnJlZShuYW1lKTsKKwlpZihmZCA8IDApIHJldHVybihmZCk7CisJRklMRV9IT1NURlNfSShmaWxlKS0+ZmQgPSBmZDsKKworCXJldHVybigwKTsKK30KKworaW50IGhvc3Rmc19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCit7CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBob3N0ZnNfZmlsZV9mb3BzID0geworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkucmVhZAkJPSBnZW5lcmljX2ZpbGVfcmVhZCwKKwkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCisJLmFpb19yZWFkCT0gZ2VuZXJpY19maWxlX2Fpb19yZWFkLAorCS5haW9fd3JpdGUJPSBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlLAorCS5yZWFkdgkJPSBnZW5lcmljX2ZpbGVfcmVhZHYsCisJLndyaXRldgkJPSBnZW5lcmljX2ZpbGVfd3JpdGV2LAorCS53cml0ZQkJPSBnZW5lcmljX2ZpbGVfd3JpdGUsCisJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCisJLm9wZW4JCT0gaG9zdGZzX2ZpbGVfb3BlbiwKKwkucmVsZWFzZQk9IE5VTEwsCisJLmZzeW5jCQk9IGhvc3Rmc19mc3luYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhvc3Rmc19kaXJfZm9wcyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWRkaXIJPSBob3N0ZnNfcmVhZGRpciwKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorfTsKKworaW50IGhvc3Rmc193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKwljaGFyICpidWZmZXI7CisJdW5zaWduZWQgbG9uZyBsb25nIGJhc2U7CisJaW50IGNvdW50ID0gUEFHRV9DQUNIRV9TSVpFOworCWludCBlbmRfaW5kZXggPSBpbm9kZS0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaW50IGVycjsKKworCWlmIChwYWdlLT5pbmRleCA+PSBlbmRfaW5kZXgpCisJCWNvdW50ID0gaW5vZGUtPmlfc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUtMSk7CisKKwlidWZmZXIgPSBrbWFwKHBhZ2UpOworCWJhc2UgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZykgcGFnZS0+aW5kZXgpIDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisKKwllcnIgPSB3cml0ZV9maWxlKEhPU1RGU19JKGlub2RlKS0+ZmQsICZiYXNlLCBidWZmZXIsIGNvdW50KTsKKwlpZihlcnIgIT0gY291bnQpeworCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGJhc2UgPiBpbm9kZS0+aV9zaXplKQorCQlpbm9kZS0+aV9zaXplID0gYmFzZTsKKworCWlmIChQYWdlRXJyb3IocGFnZSkpCisJCUNsZWFyUGFnZUVycm9yKHBhZ2UpOworCWVyciA9IDA7CisKKyBvdXQ6CisJa3VubWFwKHBhZ2UpOworCisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIGVycjsKK30KKworaW50IGhvc3Rmc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJY2hhciAqYnVmZmVyOworCWxvbmcgbG9uZyBzdGFydDsKKwlpbnQgZXJyID0gMDsKKworCXN0YXJ0ID0gKGxvbmcgbG9uZykgcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKwlidWZmZXIgPSBrbWFwKHBhZ2UpOworCWVyciA9IHJlYWRfZmlsZShGSUxFX0hPU1RGU19JKGZpbGUpLT5mZCwgJnN0YXJ0LCBidWZmZXIsCisJCQlQQUdFX0NBQ0hFX1NJWkUpOworCWlmKGVyciA8IDApIGdvdG8gb3V0OworCisJbWVtc2V0KCZidWZmZXJbZXJyXSwgMCwgUEFHRV9DQUNIRV9TSVpFIC0gZXJyKTsKKworCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlpZiAoUGFnZUVycm9yKHBhZ2UpKSBDbGVhclBhZ2VFcnJvcihwYWdlKTsKKwllcnIgPSAwOworIG91dDoKKwlrdW5tYXAocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuKGVycik7Cit9CisKK2ludCBob3N0ZnNfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgdW5zaWduZWQgaW50IGZyb20sIHVuc2lnbmVkIGludCB0bykKK3sKKwljaGFyICpidWZmZXI7CisJbG9uZyBsb25nIHN0YXJ0LCB0bXA7CisJaW50IGVycjsKKworCXN0YXJ0ID0gKGxvbmcgbG9uZykgcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKwlidWZmZXIgPSBrbWFwKHBhZ2UpOworCWlmKGZyb20gIT0gMCl7CisJCXRtcCA9IHN0YXJ0OworCQllcnIgPSByZWFkX2ZpbGUoRklMRV9IT1NURlNfSShmaWxlKS0+ZmQsICZ0bXAsIGJ1ZmZlciwKKwkJCQlmcm9tKTsKKwkJaWYoZXJyIDwgMCkgZ290byBvdXQ7CisJfQorCWlmKHRvICE9IFBBR0VfQ0FDSEVfU0laRSl7CisJCXN0YXJ0ICs9IHRvOworCQllcnIgPSByZWFkX2ZpbGUoRklMRV9IT1NURlNfSShmaWxlKS0+ZmQsICZzdGFydCwgYnVmZmVyICsgdG8sCisJCQkJUEFHRV9DQUNIRV9TSVpFIC0gdG8pOworCQlpZihlcnIgPCAwKSBnb3RvIG91dDsKKwl9CisJZXJyID0gMDsKKyBvdXQ6CisJa3VubWFwKHBhZ2UpOworCXJldHVybihlcnIpOworfQorCitpbnQgaG9zdGZzX2NvbW1pdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sCisJCSB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2UtPm1hcHBpbmc7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJY2hhciAqYnVmZmVyOworCWxvbmcgbG9uZyBzdGFydDsKKwlpbnQgZXJyID0gMDsKKworCXN0YXJ0ID0gKGxvbmcgbG9uZykgKHBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgZnJvbTsKKwlidWZmZXIgPSBrbWFwKHBhZ2UpOworCWVyciA9IHdyaXRlX2ZpbGUoRklMRV9IT1NURlNfSShmaWxlKS0+ZmQsICZzdGFydCwgYnVmZmVyICsgZnJvbSwKKwkJCSB0byAtIGZyb20pOworCWlmKGVyciA+IDApIGVyciA9IDA7CisJaWYoIWVyciAmJiAoc3RhcnQgPiBpbm9kZS0+aV9zaXplKSkKKwkJaW5vZGUtPmlfc2l6ZSA9IHN0YXJ0OworCisJa3VubWFwKHBhZ2UpOworCXJldHVybihlcnIpOworfQorCitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBob3N0ZnNfYW9wcyA9IHsKKwkud3JpdGVwYWdlIAk9IGhvc3Rmc193cml0ZXBhZ2UsCisJLnJlYWRwYWdlCT0gaG9zdGZzX3JlYWRwYWdlLAorLyogCS5zZXRfcGFnZV9kaXJ0eSA9IF9fc2V0X3BhZ2VfZGlydHlfbm9idWZmZXJzLCAqLworCS5wcmVwYXJlX3dyaXRlCT0gaG9zdGZzX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZQk9IGhvc3Rmc19jb21taXRfd3JpdGUKK307CisKK3N0YXRpYyBpbnQgaW5pdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJY2hhciAqbmFtZTsKKwlpbnQgdHlwZSwgZXJyID0gLUVOT01FTTsKKwlpbnQgbWFqLCBtaW47CisJZGV2X3QgcmRldiA9IDA7CisKKwlpZihkZW50cnkpeworCQluYW1lID0gZGVudHJ5X25hbWUoZGVudHJ5LCAwKTsKKwkJaWYobmFtZSA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCXR5cGUgPSBmaWxlX3R5cGUobmFtZSwgJm1haiwgJm1pbik7CisJCS8qUmVlbmNvZGUgbWFqIGFuZCBtaW4gd2l0aCB0aGUga2VybmVsIGVuY29kaW5nLiovCisJCXJkZXYgPSBNS0RFVihtYWosIG1pbik7CisJCWtmcmVlKG5hbWUpOworCX0KKwllbHNlIHR5cGUgPSBPU19UWVBFX0RJUjsKKworCWVyciA9IDA7CisJaWYodHlwZSA9PSBPU19UWVBFX1NZTUxJTkspCisJCWlub2RlLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCWVsc2UgaWYodHlwZSA9PSBPU19UWVBFX0RJUikKKwkJaW5vZGUtPmlfb3AgPSAmaG9zdGZzX2Rpcl9pb3BzOworCWVsc2UgaW5vZGUtPmlfb3AgPSAmaG9zdGZzX2lvcHM7CisKKwlpZih0eXBlID09IE9TX1RZUEVfRElSKSBpbm9kZS0+aV9mb3AgPSAmaG9zdGZzX2Rpcl9mb3BzOworCWVsc2UgaW5vZGUtPmlfZm9wID0gJmhvc3Rmc19maWxlX2ZvcHM7CisKKwlpZih0eXBlID09IE9TX1RZUEVfU1lNTElOSykKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmaG9zdGZzX2xpbmtfYW9wczsKKwllbHNlIGlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmhvc3Rmc19hb3BzOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBPU19UWVBFX0NIQVJERVY6CisJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgU19JRkNIUiwgcmRldik7CisJCWJyZWFrOworCWNhc2UgT1NfVFlQRV9CTE9DS0RFVjoKKwkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBTX0lGQkxLLCByZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBPU19UWVBFX0ZJRk86CisJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgU19JRklGTywgMCk7CisJCWJyZWFrOworCWNhc2UgT1NfVFlQRV9TT0NLOgorCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIFNfSUZTT0NLLCAwKTsKKwkJYnJlYWs7CisJfQorIG91dDoKKwlyZXR1cm4oZXJyKTsKK30KKworaW50IGhvc3Rmc19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisgICAgICAgICAgICAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJY2hhciAqbmFtZTsKKwlpbnQgZXJyb3IsIGZkOworCisJZXJyb3IgPSAtRU5PTUVNOworCWlub2RlID0gaWdldChkaXItPmlfc2IsIDApOworCWlmKGlub2RlID09IE5VTEwpIGdvdG8gb3V0OworCisJZXJyb3IgPSBpbml0X2lub2RlKGlub2RlLCBkZW50cnkpOworCWlmKGVycm9yKQorCQlnb3RvIG91dF9wdXQ7CisKKwllcnJvciA9IC1FTk9NRU07CisJbmFtZSA9IGRlbnRyeV9uYW1lKGRlbnRyeSwgMCk7CisJaWYobmFtZSA9PSBOVUxMKQorCQlnb3RvIG91dF9wdXQ7CisKKwlmZCA9IGZpbGVfY3JlYXRlKG5hbWUsCisJCQkgbW9kZSAmIFNfSVJVU1IsIG1vZGUgJiBTX0lXVVNSLCBtb2RlICYgU19JWFVTUiwKKwkJCSBtb2RlICYgU19JUkdSUCwgbW9kZSAmIFNfSVdHUlAsIG1vZGUgJiBTX0lYR1JQLAorCQkJIG1vZGUgJiBTX0lST1RILCBtb2RlICYgU19JV09USCwgbW9kZSAmIFNfSVhPVEgpOworCWlmKGZkIDwgMCkKKwkJZXJyb3IgPSBmZDsKKwllbHNlIGVycm9yID0gcmVhZF9uYW1lKGlub2RlLCBuYW1lKTsKKworCWtmcmVlKG5hbWUpOworCWlmKGVycm9yKQorCQlnb3RvIG91dF9wdXQ7CisKKwlIT1NURlNfSShpbm9kZSktPmZkID0gZmQ7CisJSE9TVEZTX0koaW5vZGUpLT5tb2RlID0gRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuKDApOworCisgb3V0X3B1dDoKKwlpcHV0KGlub2RlKTsKKyBvdXQ6CisJcmV0dXJuKGVycm9yKTsKK30KKworc3RydWN0IGRlbnRyeSAqaG9zdGZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJY2hhciAqbmFtZTsKKwlpbnQgZXJyOworCisJZXJyID0gLUVOT01FTTsKKwlpbm9kZSA9IGlnZXQoaW5vLT5pX3NiLCAwKTsKKwlpZihpbm9kZSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWVyciA9IGluaXRfaW5vZGUoaW5vZGUsIGRlbnRyeSk7CisJaWYoZXJyKQorCQlnb3RvIG91dF9wdXQ7CisKKwllcnIgPSAtRU5PTUVNOworCW5hbWUgPSBkZW50cnlfbmFtZShkZW50cnksIDApOworCWlmKG5hbWUgPT0gTlVMTCkKKwkJZ290byBvdXRfcHV0OworCisJZXJyID0gcmVhZF9uYW1lKGlub2RlLCBuYW1lKTsKKwlrZnJlZShuYW1lKTsKKwlpZihlcnIgPT0gLUVOT0VOVCl7CisJCWlwdXQoaW5vZGUpOworCQlpbm9kZSA9IE5VTEw7CisJfQorCWVsc2UgaWYoZXJyKQorCQlnb3RvIG91dF9wdXQ7CisKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlkZW50cnktPmRfb3AgPSAmaG9zdGZzX2RlbnRyeV9vcHM7CisJcmV0dXJuKE5VTEwpOworCisgb3V0X3B1dDoKKwlpcHV0KGlub2RlKTsKKyBvdXQ6CisJcmV0dXJuKEVSUl9QVFIoZXJyKSk7Cit9CisKK3N0YXRpYyBjaGFyICppbm9kZV9kZW50cnlfbmFtZShzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworICAgICAgICBjaGFyICpmaWxlOworCWludCBsZW47CisKKwlmaWxlID0gaW5vZGVfbmFtZShpbm8sIGRlbnRyeS0+ZF9uYW1lLmxlbiArIDEpOworCWlmKGZpbGUgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworICAgICAgICBzdHJjYXQoZmlsZSwgIi8iKTsKKwlsZW4gPSBzdHJsZW4oZmlsZSk7CisgICAgICAgIHN0cm5jYXQoZmlsZSwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuKTsKKwlmaWxlW2xlbiArIGRlbnRyeS0+ZF9uYW1lLmxlbl0gPSAnXDAnOworICAgICAgICByZXR1cm4oZmlsZSk7Cit9CisKK2ludCBob3N0ZnNfbGluayhzdHJ1Y3QgZGVudHJ5ICp0bywgc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBkZW50cnkgKmZyb20pCit7CisgICAgICAgIGNoYXIgKmZyb21fbmFtZSwgKnRvX25hbWU7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgaWYoKGZyb21fbmFtZSA9IGlub2RlX2RlbnRyeV9uYW1lKGlubywgZnJvbSkpID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuKC1FTk9NRU0pOworICAgICAgICB0b19uYW1lID0gZGVudHJ5X25hbWUodG8sIDApOworCWlmKHRvX25hbWUgPT0gTlVMTCl7CisJCWtmcmVlKGZyb21fbmFtZSk7CisJCXJldHVybigtRU5PTUVNKTsKKwl9CisgICAgICAgIGVyciA9IGxpbmtfZmlsZSh0b19uYW1lLCBmcm9tX25hbWUpOworICAgICAgICBrZnJlZShmcm9tX25hbWUpOworICAgICAgICBrZnJlZSh0b19uYW1lKTsKKyAgICAgICAgcmV0dXJuKGVycik7Cit9CisKK2ludCBob3N0ZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJY2hhciAqZmlsZTsKKwlpbnQgZXJyOworCisJaWYoKGZpbGUgPSBpbm9kZV9kZW50cnlfbmFtZShpbm8sIGRlbnRyeSkpID09IE5VTEwpIHJldHVybigtRU5PTUVNKTsKKwlpZihhcHBlbmQpCisJCXJldHVybigtRVBFUk0pOworCisJZXJyID0gdW5saW5rX2ZpbGUoZmlsZSk7CisJa2ZyZWUoZmlsZSk7CisJcmV0dXJuKGVycik7Cit9CisKK2ludCBob3N0ZnNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICp0bykKK3sKKwljaGFyICpmaWxlOworCWludCBlcnI7CisKKwlpZigoZmlsZSA9IGlub2RlX2RlbnRyeV9uYW1lKGlubywgZGVudHJ5KSkgPT0gTlVMTCkgcmV0dXJuKC1FTk9NRU0pOworCWVyciA9IG1ha2Vfc3ltbGluayhmaWxlLCB0byk7CisJa2ZyZWUoZmlsZSk7CisJcmV0dXJuKGVycik7Cit9CisKK2ludCBob3N0ZnNfbWtkaXIoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJY2hhciAqZmlsZTsKKwlpbnQgZXJyOworCisJaWYoKGZpbGUgPSBpbm9kZV9kZW50cnlfbmFtZShpbm8sIGRlbnRyeSkpID09IE5VTEwpIHJldHVybigtRU5PTUVNKTsKKwllcnIgPSBkb19ta2RpcihmaWxlLCBtb2RlKTsKKwlrZnJlZShmaWxlKTsKKwlyZXR1cm4oZXJyKTsKK30KKworaW50IGhvc3Rmc19ybWRpcihzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWNoYXIgKmZpbGU7CisJaW50IGVycjsKKworCWlmKChmaWxlID0gaW5vZGVfZGVudHJ5X25hbWUoaW5vLCBkZW50cnkpKSA9PSBOVUxMKSByZXR1cm4oLUVOT01FTSk7CisJZXJyID0gZG9fcm1kaXIoZmlsZSk7CisJa2ZyZWUoZmlsZSk7CisJcmV0dXJuKGVycik7Cit9CisKK2ludCBob3N0ZnNfbWtub2Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIGRldl90IGRldikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWNoYXIgKm5hbWU7CisJaW50IGVyciA9IC1FTk9NRU07CisKKwlpbm9kZSA9IGlnZXQoZGlyLT5pX3NiLCAwKTsKKwlpZihpbm9kZSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWVyciA9IGluaXRfaW5vZGUoaW5vZGUsIGRlbnRyeSk7CisJaWYoZXJyKQorCQlnb3RvIG91dF9wdXQ7CisKKwllcnIgPSAtRU5PTUVNOworCW5hbWUgPSBkZW50cnlfbmFtZShkZW50cnksIDApOworCWlmKG5hbWUgPT0gTlVMTCkKKwkJZ290byBvdXRfcHV0OworCisJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBtb2RlLCBkZXYpOworCWVyciA9IGRvX21rbm9kKG5hbWUsIG1vZGUsIGRldik7CisJaWYoZXJyKQorCQlnb3RvIG91dF9mcmVlOworCisJZXJyID0gcmVhZF9uYW1lKGlub2RlLCBuYW1lKTsKKwlrZnJlZShuYW1lKTsKKwlpZihlcnIpCisJCWdvdG8gb3V0X3B1dDsKKworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuKDApOworCisgb3V0X2ZyZWU6CisJa2ZyZWUobmFtZSk7Cisgb3V0X3B1dDoKKwlpcHV0KGlub2RlKTsKKyBvdXQ6CisJcmV0dXJuKGVycik7Cit9CisKK2ludCBob3N0ZnNfcmVuYW1lKHN0cnVjdCBpbm9kZSAqZnJvbV9pbm8sIHN0cnVjdCBkZW50cnkgKmZyb20sCisJCSAgc3RydWN0IGlub2RlICp0b19pbm8sIHN0cnVjdCBkZW50cnkgKnRvKQoreworCWNoYXIgKmZyb21fbmFtZSwgKnRvX25hbWU7CisJaW50IGVycjsKKworCWlmKChmcm9tX25hbWUgPSBpbm9kZV9kZW50cnlfbmFtZShmcm9tX2lubywgZnJvbSkpID09IE5VTEwpCisJCXJldHVybigtRU5PTUVNKTsKKwlpZigodG9fbmFtZSA9IGlub2RlX2RlbnRyeV9uYW1lKHRvX2lubywgdG8pKSA9PSBOVUxMKXsKKwkJa2ZyZWUoZnJvbV9uYW1lKTsKKwkJcmV0dXJuKC1FTk9NRU0pOworCX0KKwllcnIgPSByZW5hbWVfZmlsZShmcm9tX25hbWUsIHRvX25hbWUpOworCWtmcmVlKGZyb21fbmFtZSk7CisJa2ZyZWUodG9fbmFtZSk7CisJcmV0dXJuKGVycik7Cit9CisKK3ZvaWQgaG9zdGZzX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vKQoreworCW5vdF9pbXBsZW1lbnRlZCgpOworfQorCitpbnQgaG9zdGZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm8sIGludCBkZXNpcmVkLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwljaGFyICpuYW1lOworCWludCByID0gMCwgdyA9IDAsIHggPSAwLCBlcnI7CisKKwlpZiAoZGVzaXJlZCAmIE1BWV9SRUFEKSByID0gMTsKKwlpZiAoZGVzaXJlZCAmIE1BWV9XUklURSkgdyA9IDE7CisJaWYgKGRlc2lyZWQgJiBNQVlfRVhFQykgeCA9IDE7CisJbmFtZSA9IGlub2RlX25hbWUoaW5vLCAwKTsKKwlpZiAobmFtZSA9PSBOVUxMKSByZXR1cm4oLUVOT01FTSk7CisKKwlpZiAoU19JU0NIUihpbm8tPmlfbW9kZSkgfHwgU19JU0JMSyhpbm8tPmlfbW9kZSkgfHwKKwkJCVNfSVNGSUZPKGluby0+aV9tb2RlKSB8fCBTX0lTU09DSyhpbm8tPmlfbW9kZSkpCisJCWVyciA9IDA7CisJZWxzZQorCQllcnIgPSBhY2Nlc3NfZmlsZShuYW1lLCByLCB3LCB4KTsKKwlrZnJlZShuYW1lKTsKKwlpZighZXJyKQorCQllcnIgPSBnZW5lcmljX3Blcm1pc3Npb24oaW5vLCBkZXNpcmVkLCBOVUxMKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgaG9zdGZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCit7CisJc3RydWN0IGhvc3Rmc19pYXR0ciBhdHRyczsKKwljaGFyICpuYW1lOworCWludCBlcnI7CisKKwllcnIgPSBpbm9kZV9jaGFuZ2Vfb2soZGVudHJ5LT5kX2lub2RlLCBhdHRyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYoYXBwZW5kKQorCQlhdHRyLT5pYV92YWxpZCAmPSB+QVRUUl9TSVpFOworCisJYXR0cnMuaWFfdmFsaWQgPSAwOworCWlmKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKXsKKwkJYXR0cnMuaWFfdmFsaWQgfD0gSE9TVEZTX0FUVFJfTU9ERTsKKwkJYXR0cnMuaWFfbW9kZSA9IGF0dHItPmlhX21vZGU7CisJfQorCWlmKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQpeworCQlpZigoZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX2RldiA9PSBST09UX0RFVikgJiYKKwkJICAgKGF0dHItPmlhX3VpZCA9PSAwKSkKKwkJCWF0dHItPmlhX3VpZCA9IGdldHVpZCgpOworCQlhdHRycy5pYV92YWxpZCB8PSBIT1NURlNfQVRUUl9VSUQ7CisJCWF0dHJzLmlhX3VpZCA9IGF0dHItPmlhX3VpZDsKKwl9CisJaWYoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCl7CisJCWlmKChkZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfZGV2ID09IFJPT1RfREVWKSAmJgorCQkgICAoYXR0ci0+aWFfZ2lkID09IDApKQorCQkJYXR0ci0+aWFfZ2lkID0gZ2V0Z2lkKCk7CisJCWF0dHJzLmlhX3ZhbGlkIHw9IEhPU1RGU19BVFRSX0dJRDsKKwkJYXR0cnMuaWFfZ2lkID0gYXR0ci0+aWFfZ2lkOworCX0KKwlpZihhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSl7CisJCWF0dHJzLmlhX3ZhbGlkIHw9IEhPU1RGU19BVFRSX1NJWkU7CisJCWF0dHJzLmlhX3NpemUgPSBhdHRyLT5pYV9zaXplOworCX0KKwlpZihhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUUpeworCQlhdHRycy5pYV92YWxpZCB8PSBIT1NURlNfQVRUUl9BVElNRTsKKwkJYXR0cnMuaWFfYXRpbWUgPSBhdHRyLT5pYV9hdGltZTsKKwl9CisJaWYoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01USU1FKXsKKwkJYXR0cnMuaWFfdmFsaWQgfD0gSE9TVEZTX0FUVFJfTVRJTUU7CisJCWF0dHJzLmlhX210aW1lID0gYXR0ci0+aWFfbXRpbWU7CisJfQorCWlmKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9DVElNRSl7CisJCWF0dHJzLmlhX3ZhbGlkIHw9IEhPU1RGU19BVFRSX0NUSU1FOworCQlhdHRycy5pYV9jdGltZSA9IGF0dHItPmlhX2N0aW1lOworCX0KKwlpZihhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUVfU0VUKXsKKwkJYXR0cnMuaWFfdmFsaWQgfD0gSE9TVEZTX0FUVFJfQVRJTUVfU0VUOworCX0KKwlpZihhdHRyLT5pYV92YWxpZCAmIEFUVFJfTVRJTUVfU0VUKXsKKwkJYXR0cnMuaWFfdmFsaWQgfD0gSE9TVEZTX0FUVFJfTVRJTUVfU0VUOworCX0KKwluYW1lID0gZGVudHJ5X25hbWUoZGVudHJ5LCAwKTsKKwlpZihuYW1lID09IE5VTEwpIHJldHVybigtRU5PTUVNKTsKKwllcnIgPSBzZXRfYXR0cihuYW1lLCAmYXR0cnMpOworCWtmcmVlKG5hbWUpOworCWlmKGVycikKKwkJcmV0dXJuKGVycik7CisKKwlyZXR1cm4oaW5vZGVfc2V0YXR0cihkZW50cnktPmRfaW5vZGUsIGF0dHIpKTsKK30KKworaW50IGhvc3Rmc19nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJICAgc3RydWN0IGtzdGF0ICpzdGF0KQoreworCWdlbmVyaWNfZmlsbGF0dHIoZGVudHJ5LT5kX2lub2RlLCBzdGF0KTsKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBob3N0ZnNfaW9wcyA9IHsKKwkuY3JlYXRlCQk9IGhvc3Rmc19jcmVhdGUsCisJLmxpbmsJCT0gaG9zdGZzX2xpbmssCisJLnVubGluawkJPSBob3N0ZnNfdW5saW5rLAorCS5zeW1saW5rCT0gaG9zdGZzX3N5bWxpbmssCisJLm1rZGlyCQk9IGhvc3Rmc19ta2RpciwKKwkucm1kaXIJCT0gaG9zdGZzX3JtZGlyLAorCS5ta25vZAkJPSBob3N0ZnNfbWtub2QsCisJLnJlbmFtZQkJPSBob3N0ZnNfcmVuYW1lLAorCS50cnVuY2F0ZQk9IGhvc3Rmc190cnVuY2F0ZSwKKwkucGVybWlzc2lvbgk9IGhvc3Rmc19wZXJtaXNzaW9uLAorCS5zZXRhdHRyCT0gaG9zdGZzX3NldGF0dHIsCisJLmdldGF0dHIJPSBob3N0ZnNfZ2V0YXR0ciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBob3N0ZnNfZGlyX2lvcHMgPSB7CisJLmNyZWF0ZQkJPSBob3N0ZnNfY3JlYXRlLAorCS5sb29rdXAJCT0gaG9zdGZzX2xvb2t1cCwKKwkubGluawkJPSBob3N0ZnNfbGluaywKKwkudW5saW5rCQk9IGhvc3Rmc191bmxpbmssCisJLnN5bWxpbmsJPSBob3N0ZnNfc3ltbGluaywKKwkubWtkaXIJCT0gaG9zdGZzX21rZGlyLAorCS5ybWRpcgkJPSBob3N0ZnNfcm1kaXIsCisJLm1rbm9kCQk9IGhvc3Rmc19ta25vZCwKKwkucmVuYW1lCQk9IGhvc3Rmc19yZW5hbWUsCisJLnRydW5jYXRlCT0gaG9zdGZzX3RydW5jYXRlLAorCS5wZXJtaXNzaW9uCT0gaG9zdGZzX3Blcm1pc3Npb24sCisJLnNldGF0dHIJPSBob3N0ZnNfc2V0YXR0ciwKKwkuZ2V0YXR0cgk9IGhvc3Rmc19nZXRhdHRyLAorfTsKKworaW50IGhvc3Rmc19saW5rX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwljaGFyICpidWZmZXIsICpuYW1lOworCWxvbmcgbG9uZyBzdGFydDsKKwlpbnQgZXJyOworCisJc3RhcnQgPSBwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCWJ1ZmZlciA9IGttYXAocGFnZSk7CisJbmFtZSA9IGlub2RlX25hbWUocGFnZS0+bWFwcGluZy0+aG9zdCwgMCk7CisJaWYobmFtZSA9PSBOVUxMKSByZXR1cm4oLUVOT01FTSk7CisJZXJyID0gZG9fcmVhZGxpbmsobmFtZSwgYnVmZmVyLCBQQUdFX0NBQ0hFX1NJWkUpOworCWtmcmVlKG5hbWUpOworCWlmKGVyciA9PSBQQUdFX0NBQ0hFX1NJWkUpCisJCWVyciA9IC1FMkJJRzsKKwllbHNlIGlmKGVyciA+IDApeworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCQlpZiAoUGFnZUVycm9yKHBhZ2UpKSBDbGVhclBhZ2VFcnJvcihwYWdlKTsKKwkJZXJyID0gMDsKKwl9CisJa3VubWFwKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybihlcnIpOworfQorCitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBob3N0ZnNfbGlua19hb3BzID0geworCS5yZWFkcGFnZQk9IGhvc3Rmc19saW5rX3JlYWRwYWdlLAorfTsKKworc3RhdGljIGludCBob3N0ZnNfZmlsbF9zYl9jb21tb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZCwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGU7CisJY2hhciAqbmFtZSwgKmRhdGEgPSBkOworCWludCBlcnI7CisKKwlzYi0+c19ibG9ja3NpemUgPSAxMDI0OworCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gMTA7CisJc2ItPnNfbWFnaWMgPSBIT1NURlNfU1VQRVJfTUFHSUM7CisJc2ItPnNfb3AgPSAmaG9zdGZzX3Nib3BzOworCisJaWYoKGRhdGEgPT0gTlVMTCkgfHwgKCpkYXRhID09ICdcMCcpKQorCQlkYXRhID0gcm9vdF9pbm87CisKKwllcnIgPSAtRU5PTUVNOworCW5hbWUgPSBrbWFsbG9jKHN0cmxlbihkYXRhKSArIDEsIEdGUF9LRVJORUwpOworCWlmKG5hbWUgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlzdHJjcHkobmFtZSwgZGF0YSk7CisKKwlyb290X2lub2RlID0gaWdldChzYiwgMCk7CisJaWYocm9vdF9pbm9kZSA9PSBOVUxMKQorCQlnb3RvIG91dF9mcmVlOworCisJZXJyID0gaW5pdF9pbm9kZShyb290X2lub2RlLCBOVUxMKTsKKwlpZihlcnIpCisJCWdvdG8gb3V0X3B1dDsKKworCUhPU1RGU19JKHJvb3RfaW5vZGUpLT5ob3N0X2ZpbGVuYW1lID0gbmFtZTsKKworCWVyciA9IC1FTk9NRU07CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKKwlpZihzYi0+c19yb290ID09IE5VTEwpCisJCWdvdG8gb3V0X3B1dDsKKworCWVyciA9IHJlYWRfaW5vZGUocm9vdF9pbm9kZSk7CisJaWYoZXJyKQorCQlnb3RvIG91dF9wdXQ7CisKKwlyZXR1cm4oMCk7CisKKyBvdXRfcHV0OgorCWlwdXQocm9vdF9pbm9kZSk7Cisgb3V0X2ZyZWU6CisJa2ZyZWUobmFtZSk7Cisgb3V0OgorCXJldHVybihlcnIpOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpob3N0ZnNfcmVhZF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqdHlwZSwKKwkJCQkJICAgICBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJCQkgICAgIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuKGdldF9zYl9ub2Rldih0eXBlLCBmbGFncywgZGF0YSwgaG9zdGZzX2ZpbGxfc2JfY29tbW9uKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBob3N0ZnNfdHlwZSA9IHsKKwkub3duZXIgCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lIAkJPSAiaG9zdGZzIiwKKwkuZ2V0X3NiIAk9IGhvc3Rmc19yZWFkX3NiLAorCS5raWxsX3NiCT0ga2lsbF9hbm9uX3N1cGVyLAorCS5mc19mbGFncyAJPSAwLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ob3N0ZnModm9pZCkKK3sKKwlyZXR1cm4ocmVnaXN0ZXJfZmlsZXN5c3RlbSgmaG9zdGZzX3R5cGUpKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfaG9zdGZzKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZob3N0ZnNfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfaG9zdGZzKQorbW9kdWxlX2V4aXQoZXhpdF9ob3N0ZnMpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KKyAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQorICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAorICogb2YgdGhlIGZpbGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9mcy9ob3N0ZnMvaG9zdGZzX3VzZXIuYyBiL2ZzL2hvc3Rmcy9ob3N0ZnNfdXNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OTZlODQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ob3N0ZnMvaG9zdGZzX3VzZXIuYwpAQCAtMCwwICsxLDM2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHV0aW1lLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy92ZnMuaD4KKyNpbmNsdWRlICJob3N0ZnMuaCIKKyNpbmNsdWRlICJrZXJuX3V0aWwuaCIKKyNpbmNsdWRlICJ1c2VyLmgiCisKK2ludCBzdGF0X2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgbG9uZyBsb25nICppbm9kZV9vdXQsIGludCAqbW9kZV9vdXQsCisJICAgICAgaW50ICpubGlua19vdXQsIGludCAqdWlkX291dCwgaW50ICpnaWRfb3V0LAorCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqc2l6ZV9vdXQsIHN0cnVjdCB0aW1lc3BlYyAqYXRpbWVfb3V0LAorCSAgICAgIHN0cnVjdCB0aW1lc3BlYyAqbXRpbWVfb3V0LCBzdHJ1Y3QgdGltZXNwZWMgKmN0aW1lX291dCwKKwkgICAgICBpbnQgKmJsa3NpemVfb3V0LCB1bnNpZ25lZCBsb25nIGxvbmcgKmJsb2Nrc19vdXQpCit7CisJc3RydWN0IHN0YXQ2NCBidWY7CisKKwlpZihsc3RhdDY0KHBhdGgsICZidWYpIDwgMCkKKwkJcmV0dXJuKC1lcnJubyk7CisKKwlpZihpbm9kZV9vdXQgIT0gTlVMTCkgKmlub2RlX291dCA9IGJ1Zi5zdF9pbm87CisJaWYobW9kZV9vdXQgIT0gTlVMTCkgKm1vZGVfb3V0ID0gYnVmLnN0X21vZGU7CisJaWYobmxpbmtfb3V0ICE9IE5VTEwpICpubGlua19vdXQgPSBidWYuc3Rfbmxpbms7CisJaWYodWlkX291dCAhPSBOVUxMKSAqdWlkX291dCA9IGJ1Zi5zdF91aWQ7CisJaWYoZ2lkX291dCAhPSBOVUxMKSAqZ2lkX291dCA9IGJ1Zi5zdF9naWQ7CisJaWYoc2l6ZV9vdXQgIT0gTlVMTCkgKnNpemVfb3V0ID0gYnVmLnN0X3NpemU7CisJaWYoYXRpbWVfb3V0ICE9IE5VTEwpIHsKKwkJYXRpbWVfb3V0LT50dl9zZWMgPSBidWYuc3RfYXRpbWU7CisJCWF0aW1lX291dC0+dHZfbnNlYyA9IDA7CisJfQorCWlmKG10aW1lX291dCAhPSBOVUxMKSB7CisJCW10aW1lX291dC0+dHZfc2VjID0gYnVmLnN0X210aW1lOworCQltdGltZV9vdXQtPnR2X25zZWMgPSAwOworCX0KKwlpZihjdGltZV9vdXQgIT0gTlVMTCkgeworCQljdGltZV9vdXQtPnR2X3NlYyA9IGJ1Zi5zdF9jdGltZTsKKwkJY3RpbWVfb3V0LT50dl9uc2VjID0gMDsKKwl9CisJaWYoYmxrc2l6ZV9vdXQgIT0gTlVMTCkgKmJsa3NpemVfb3V0ID0gYnVmLnN0X2Jsa3NpemU7CisJaWYoYmxvY2tzX291dCAhPSBOVUxMKSAqYmxvY2tzX291dCA9IGJ1Zi5zdF9ibG9ja3M7CisJcmV0dXJuKDApOworfQorCitpbnQgZmlsZV90eXBlKGNvbnN0IGNoYXIgKnBhdGgsIGludCAqbWFqLCBpbnQgKm1pbikKK3sKKyAJc3RydWN0IHN0YXQ2NCBidWY7CisKKwlpZihsc3RhdDY0KHBhdGgsICZidWYpIDwgMCkKKwkJcmV0dXJuKC1lcnJubyk7CisJLypXZSBjYW5ub3QgcGFzcyByZGV2IGFzIGlzIGJlY2F1c2UgZ2xpYmMgYW5kIHRoZSBrZXJuZWwgZGlzYWdyZWUKKwkgKmFib3V0IGl0cyBkZWZpbml0aW9uLiovCisJaWYobWFqICE9IE5VTEwpCisJCSptYWogPSBtYWpvcihidWYuc3RfcmRldik7CisJaWYobWluICE9IE5VTEwpCisJCSptaW4gPSBtaW5vcihidWYuc3RfcmRldik7CisKKwlpZihTX0lTRElSKGJ1Zi5zdF9tb2RlKSkgcmV0dXJuKE9TX1RZUEVfRElSKTsKKwllbHNlIGlmKFNfSVNMTksoYnVmLnN0X21vZGUpKSByZXR1cm4oT1NfVFlQRV9TWU1MSU5LKTsKKwllbHNlIGlmKFNfSVNDSFIoYnVmLnN0X21vZGUpKSByZXR1cm4oT1NfVFlQRV9DSEFSREVWKTsKKwllbHNlIGlmKFNfSVNCTEsoYnVmLnN0X21vZGUpKSByZXR1cm4oT1NfVFlQRV9CTE9DS0RFVik7CisJZWxzZSBpZihTX0lTRklGTyhidWYuc3RfbW9kZSkpcmV0dXJuKE9TX1RZUEVfRklGTyk7CisJZWxzZSBpZihTX0lTU09DSyhidWYuc3RfbW9kZSkpcmV0dXJuKE9TX1RZUEVfU09DSyk7CisJZWxzZSByZXR1cm4oT1NfVFlQRV9GSUxFKTsKK30KKworaW50IGFjY2Vzc19maWxlKGNoYXIgKnBhdGgsIGludCByLCBpbnQgdywgaW50IHgpCit7CisJaW50IG1vZGUgPSAwOworCisJaWYocikgbW9kZSA9IFJfT0s7CisJaWYodykgbW9kZSB8PSBXX09LOworCWlmKHgpIG1vZGUgfD0gWF9PSzsKKwlpZihhY2Nlc3MocGF0aCwgbW9kZSkgIT0gMCkgcmV0dXJuKC1lcnJubyk7CisJZWxzZSByZXR1cm4oMCk7Cit9CisKK2ludCBvcGVuX2ZpbGUoY2hhciAqcGF0aCwgaW50IHIsIGludCB3LCBpbnQgYXBwZW5kKQoreworCWludCBtb2RlID0gMCwgZmQ7CisKKwlpZihyICYmICF3KQorCQltb2RlID0gT19SRE9OTFk7CisJZWxzZSBpZighciAmJiB3KQorCQltb2RlID0gT19XUk9OTFk7CisJZWxzZSBpZihyICYmIHcpCisJCW1vZGUgPSBPX1JEV1I7CisJZWxzZSBwYW5pYygiSW1wb3NzaWJsZSBtb2RlIGluIG9wZW5fZmlsZSIpOworCisJaWYoYXBwZW5kKQorCQltb2RlIHw9IE9fQVBQRU5EOworCWZkID0gb3BlbjY0KHBhdGgsIG1vZGUpOworCWlmKGZkIDwgMCkgcmV0dXJuKC1lcnJubyk7CisJZWxzZSByZXR1cm4oZmQpOworfQorCit2b2lkICpvcGVuX2RpcihjaGFyICpwYXRoLCBpbnQgKmVycl9vdXQpCit7CisJRElSICpkaXI7CisKKwlkaXIgPSBvcGVuZGlyKHBhdGgpOworCSplcnJfb3V0ID0gZXJybm87CisJaWYoZGlyID09IE5VTEwpIHJldHVybihOVUxMKTsKKwlyZXR1cm4oZGlyKTsKK30KKworY2hhciAqcmVhZF9kaXIodm9pZCAqc3RyZWFtLCB1bnNpZ25lZCBsb25nIGxvbmcgKnBvcywKKwkgICAgICAgdW5zaWduZWQgbG9uZyBsb25nICppbm9fb3V0LCBpbnQgKmxlbl9vdXQpCit7CisJRElSICpkaXIgPSBzdHJlYW07CisJc3RydWN0IGRpcmVudCAqZW50OworCisJc2Vla2RpcihkaXIsICpwb3MpOworCWVudCA9IHJlYWRkaXIoZGlyKTsKKwlpZihlbnQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCSpsZW5fb3V0ID0gc3RybGVuKGVudC0+ZF9uYW1lKTsKKwkqaW5vX291dCA9IGVudC0+ZF9pbm87CisJKnBvcyA9IHRlbGxkaXIoZGlyKTsKKwlyZXR1cm4oZW50LT5kX25hbWUpOworfQorCitpbnQgcmVhZF9maWxlKGludCBmZCwgdW5zaWduZWQgbG9uZyBsb25nICpvZmZzZXQsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgbjsKKworCW4gPSBwcmVhZDY0KGZkLCBidWYsIGxlbiwgKm9mZnNldCk7CisJaWYobiA8IDApIHJldHVybigtZXJybm8pOworCSpvZmZzZXQgKz0gbjsKKwlyZXR1cm4obik7Cit9CisKK2ludCB3cml0ZV9maWxlKGludCBmZCwgdW5zaWduZWQgbG9uZyBsb25nICpvZmZzZXQsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgbjsKKworCW4gPSBwd3JpdGU2NChmZCwgYnVmLCBsZW4sICpvZmZzZXQpOworCWlmKG4gPCAwKSByZXR1cm4oLWVycm5vKTsKKwkqb2Zmc2V0ICs9IG47CisJcmV0dXJuKG4pOworfQorCitpbnQgbHNlZWtfZmlsZShpbnQgZmQsIGxvbmcgbG9uZyBvZmZzZXQsIGludCB3aGVuY2UpCit7CisJaW50IHJldDsKKworCXJldCA9IGxzZWVrNjQoZmQsIG9mZnNldCwgd2hlbmNlKTsKKwlpZihyZXQgPCAwKSByZXR1cm4oLWVycm5vKTsKKwlyZXR1cm4oMCk7Cit9CisKK3ZvaWQgY2xvc2VfZmlsZSh2b2lkICpzdHJlYW0pCit7CisJY2xvc2UoKigoaW50ICopIHN0cmVhbSkpOworfQorCit2b2lkIGNsb3NlX2Rpcih2b2lkICpzdHJlYW0pCit7CisJY2xvc2VkaXIoc3RyZWFtKTsKK30KKworaW50IGZpbGVfY3JlYXRlKGNoYXIgKm5hbWUsIGludCB1ciwgaW50IHV3LCBpbnQgdXgsIGludCBnciwKKwkJaW50IGd3LCBpbnQgZ3gsIGludCBvciwgaW50IG93LCBpbnQgb3gpCit7CisJaW50IG1vZGUsIGZkOworCisJbW9kZSA9IDA7CisJbW9kZSB8PSB1ciA/IFNfSVJVU1IgOiAwOworCW1vZGUgfD0gdXcgPyBTX0lXVVNSIDogMDsKKwltb2RlIHw9IHV4ID8gU19JWFVTUiA6IDA7CisJbW9kZSB8PSBnciA/IFNfSVJHUlAgOiAwOworCW1vZGUgfD0gZ3cgPyBTX0lXR1JQIDogMDsKKwltb2RlIHw9IGd4ID8gU19JWEdSUCA6IDA7CisJbW9kZSB8PSBvciA/IFNfSVJPVEggOiAwOworCW1vZGUgfD0gb3cgPyBTX0lXT1RIIDogMDsKKwltb2RlIHw9IG94ID8gU19JWE9USCA6IDA7CisJZmQgPSBvcGVuNjQobmFtZSwgT19DUkVBVCB8IE9fUkRXUiwgbW9kZSk7CisJaWYoZmQgPCAwKQorCQlyZXR1cm4oLWVycm5vKTsKKwlyZXR1cm4oZmQpOworfQorCitpbnQgc2V0X2F0dHIoY29uc3QgY2hhciAqZmlsZSwgc3RydWN0IGhvc3Rmc19pYXR0ciAqYXR0cnMpCit7CisJc3RydWN0IHV0aW1idWYgYnVmOworCWludCBlcnIsIG1hOworCisJaWYoYXR0cnMtPmlhX3ZhbGlkICYgSE9TVEZTX0FUVFJfTU9ERSl7CisJCWlmKGNobW9kKGZpbGUsIGF0dHJzLT5pYV9tb2RlKSAhPSAwKSByZXR1cm4oLWVycm5vKTsKKwl9CisJaWYoYXR0cnMtPmlhX3ZhbGlkICYgSE9TVEZTX0FUVFJfVUlEKXsKKwkJaWYoY2hvd24oZmlsZSwgYXR0cnMtPmlhX3VpZCwgLTEpKSByZXR1cm4oLWVycm5vKTsKKwl9CisJaWYoYXR0cnMtPmlhX3ZhbGlkICYgSE9TVEZTX0FUVFJfR0lEKXsKKwkJaWYoY2hvd24oZmlsZSwgLTEsIGF0dHJzLT5pYV9naWQpKSByZXR1cm4oLWVycm5vKTsKKwl9CisJaWYoYXR0cnMtPmlhX3ZhbGlkICYgSE9TVEZTX0FUVFJfU0laRSl7CisJCWlmKHRydW5jYXRlKGZpbGUsIGF0dHJzLT5pYV9zaXplKSkgcmV0dXJuKC1lcnJubyk7CisJfQorCW1hID0gSE9TVEZTX0FUVFJfQVRJTUVfU0VUIHwgSE9TVEZTX0FUVFJfTVRJTUVfU0VUOworCWlmKChhdHRycy0+aWFfdmFsaWQgJiBtYSkgPT0gbWEpeworCQlidWYuYWN0aW1lID0gYXR0cnMtPmlhX2F0aW1lLnR2X3NlYzsKKwkJYnVmLm1vZHRpbWUgPSBhdHRycy0+aWFfbXRpbWUudHZfc2VjOworCQlpZih1dGltZShmaWxlLCAmYnVmKSAhPSAwKSByZXR1cm4oLWVycm5vKTsKKwl9CisJZWxzZSB7CisJCXN0cnVjdCB0aW1lc3BlYyB0czsKKworCQlpZihhdHRycy0+aWFfdmFsaWQgJiBIT1NURlNfQVRUUl9BVElNRV9TRVQpeworCQkJZXJyID0gc3RhdF9maWxlKGZpbGUsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCU5VTEwsIE5VTEwsICZ0cywgTlVMTCwgTlVMTCwgTlVMTCk7CisJCQlpZihlcnIgIT0gMCkKKwkJCQlyZXR1cm4oZXJyKTsKKwkJCWJ1Zi5hY3RpbWUgPSBhdHRycy0+aWFfYXRpbWUudHZfc2VjOworCQkJYnVmLm1vZHRpbWUgPSB0cy50dl9zZWM7CisJCQlpZih1dGltZShmaWxlLCAmYnVmKSAhPSAwKQorCQkJCXJldHVybigtZXJybm8pOworCQl9CisJCWlmKGF0dHJzLT5pYV92YWxpZCAmIEhPU1RGU19BVFRSX01USU1FX1NFVCl7CisJCQllcnIgPSBzdGF0X2ZpbGUoZmlsZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJTlVMTCwgJnRzLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJCWlmKGVyciAhPSAwKQorCQkJCXJldHVybihlcnIpOworCQkJYnVmLmFjdGltZSA9IHRzLnR2X3NlYzsKKwkJCWJ1Zi5tb2R0aW1lID0gYXR0cnMtPmlhX210aW1lLnR2X3NlYzsKKwkJCWlmKHV0aW1lKGZpbGUsICZidWYpICE9IDApCisJCQkJcmV0dXJuKC1lcnJubyk7CisJCX0KKwl9CisJaWYoYXR0cnMtPmlhX3ZhbGlkICYgSE9TVEZTX0FUVFJfQ1RJTUUpIDsKKwlpZihhdHRycy0+aWFfdmFsaWQgJiAoSE9TVEZTX0FUVFJfQVRJTUUgfCBIT1NURlNfQVRUUl9NVElNRSkpeworCQllcnIgPSBzdGF0X2ZpbGUoZmlsZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkmYXR0cnMtPmlhX2F0aW1lLCAmYXR0cnMtPmlhX210aW1lLCBOVUxMLAorCQkJCU5VTEwsIE5VTEwpOworCQlpZihlcnIgIT0gMCkgcmV0dXJuKGVycik7CisJfQorCXJldHVybigwKTsKK30KKworaW50IG1ha2Vfc3ltbGluayhjb25zdCBjaGFyICpmcm9tLCBjb25zdCBjaGFyICp0bykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gc3ltbGluayh0bywgZnJvbSk7CisJaWYoZXJyKSByZXR1cm4oLWVycm5vKTsKKwlyZXR1cm4oMCk7Cit9CisKK2ludCB1bmxpbmtfZmlsZShjb25zdCBjaGFyICpmaWxlKQoreworCWludCBlcnI7CisKKwllcnIgPSB1bmxpbmsoZmlsZSk7CisJaWYoZXJyKSByZXR1cm4oLWVycm5vKTsKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBkb19ta2Rpcihjb25zdCBjaGFyICpmaWxlLCBpbnQgbW9kZSkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gbWtkaXIoZmlsZSwgbW9kZSk7CisJaWYoZXJyKSByZXR1cm4oLWVycm5vKTsKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBkb19ybWRpcihjb25zdCBjaGFyICpmaWxlKQoreworCWludCBlcnI7CisKKwllcnIgPSBybWRpcihmaWxlKTsKKwlpZihlcnIpIHJldHVybigtZXJybm8pOworCXJldHVybigwKTsKK30KKworaW50IGRvX21rbm9kKGNvbnN0IGNoYXIgKmZpbGUsIGludCBtb2RlLCBpbnQgZGV2KQoreworCWludCBlcnI7CisKKwllcnIgPSBta25vZChmaWxlLCBtb2RlLCBkZXYpOworCWlmKGVycikgcmV0dXJuKC1lcnJubyk7CisJcmV0dXJuKDApOworfQorCitpbnQgbGlua19maWxlKGNvbnN0IGNoYXIgKnRvLCBjb25zdCBjaGFyICpmcm9tKQoreworCWludCBlcnI7CisKKwllcnIgPSBsaW5rKHRvLCBmcm9tKTsKKwlpZihlcnIpIHJldHVybigtZXJybm8pOworCXJldHVybigwKTsKK30KKworaW50IGRvX3JlYWRsaW5rKGNoYXIgKmZpbGUsIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJaW50IG47CisKKwluID0gcmVhZGxpbmsoZmlsZSwgYnVmLCBzaXplKTsKKwlpZihuIDwgMCkKKwkJcmV0dXJuKC1lcnJubyk7CisJaWYobiA8IHNpemUpCisJCWJ1ZltuXSA9ICdcMCc7CisJcmV0dXJuKG4pOworfQorCitpbnQgcmVuYW1lX2ZpbGUoY2hhciAqZnJvbSwgY2hhciAqdG8pCit7CisJaW50IGVycjsKKworCWVyciA9IHJlbmFtZShmcm9tLCB0byk7CisJaWYoZXJyIDwgMCkgcmV0dXJuKC1lcnJubyk7CisJcmV0dXJuKDApOworfQorCitpbnQgZG9fc3RhdGZzKGNoYXIgKnJvb3QsIGxvbmcgKmJzaXplX291dCwgbG9uZyBsb25nICpibG9ja3Nfb3V0LAorCSAgICAgIGxvbmcgbG9uZyAqYmZyZWVfb3V0LCBsb25nIGxvbmcgKmJhdmFpbF9vdXQsCisJICAgICAgbG9uZyBsb25nICpmaWxlc19vdXQsIGxvbmcgbG9uZyAqZmZyZWVfb3V0LAorCSAgICAgIHZvaWQgKmZzaWRfb3V0LCBpbnQgZnNpZF9zaXplLCBsb25nICpuYW1lbGVuX291dCwKKwkgICAgICBsb25nICpzcGFyZV9vdXQpCit7CisJc3RydWN0IHN0YXRmczY0IGJ1ZjsKKwlpbnQgZXJyOworCisJZXJyID0gc3RhdGZzNjQocm9vdCwgJmJ1Zik7CisJaWYoZXJyIDwgMCkgcmV0dXJuKC1lcnJubyk7CisJKmJzaXplX291dCA9IGJ1Zi5mX2JzaXplOworCSpibG9ja3Nfb3V0ID0gYnVmLmZfYmxvY2tzOworCSpiZnJlZV9vdXQgPSBidWYuZl9iZnJlZTsKKwkqYmF2YWlsX291dCA9IGJ1Zi5mX2JhdmFpbDsKKwkqZmlsZXNfb3V0ID0gYnVmLmZfZmlsZXM7CisJKmZmcmVlX291dCA9IGJ1Zi5mX2ZmcmVlOworCW1lbWNweShmc2lkX291dCwgJmJ1Zi5mX2ZzaWQsCisJICAgICAgIHNpemVvZihidWYuZl9mc2lkKSA+IGZzaWRfc2l6ZSA/IGZzaWRfc2l6ZSA6CisJICAgICAgIHNpemVvZihidWYuZl9mc2lkKSk7CisJKm5hbWVsZW5fb3V0ID0gYnVmLmZfbmFtZWxlbjsKKwlzcGFyZV9vdXRbMF0gPSBidWYuZl9zcGFyZVswXTsKKwlzcGFyZV9vdXRbMV0gPSBidWYuZl9zcGFyZVsxXTsKKwlzcGFyZV9vdXRbMl0gPSBidWYuZl9zcGFyZVsyXTsKKwlzcGFyZV9vdXRbM10gPSBidWYuZl9zcGFyZVszXTsKKwlzcGFyZV9vdXRbNF0gPSBidWYuZl9zcGFyZVs0XTsKKwlzcGFyZV9vdXRbNV0gPSBidWYuZl9zcGFyZVs1XTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KKyAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQorICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAorICogb2YgdGhlIGZpbGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9mcy9ocGZzL01ha2VmaWxlIGIvZnMvaHBmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2I3ODZmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaHBmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBocGZzIGZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19IUEZTX0ZTKSArPSBocGZzLm8KKworaHBmcy1vYmpzIDo9IGFsbG9jLm8gYW5vZGUubyBidWZmZXIubyBkZW50cnkubyBkaXIubyBkbm9kZS5vIGVhLm8gZmlsZS5vIFwKKwkgICAgIGlub2RlLm8gbWFwLm8gbmFtZS5vIG5hbWVpLm8gc3VwZXIubwpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9hbGxvYy5jIGIvZnMvaHBmcy9hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MDNlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ocGZzL2FsbG9jLmMKQEAgLTAsMCArMSw0NTYgQEAKKy8qCisgKiAgbGludXgvZnMvaHBmcy9hbGxvYy5jCisgKgorICogIE1pa3VsYXMgUGF0b2NrYSAobWlrdWxhc0BhcnRheC5rYXJsaW4ubWZmLmN1bmkuY3opLCAxOTk4LTE5OTkKKyAqCisgKiAgSFBGUyBiaXRtYXAgb3BlcmF0aW9ucworICovCisKKyNpbmNsdWRlICJocGZzX2ZuLmgiCisKK3N0YXRpYyBpbnQgaHBmc19hbGxvY19pZl9wb3NzaWJsZV9ub2xvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzZWNubyBzZWMpOworCisvKgorICogQ2hlY2sgaWYgYSBzZWN0b3IgaXMgYWxsb2NhdGVkIGluIGJpdG1hcAorICogVGhpcyBpcyByZWFsbHkgc2xvdy4gVHVybmVkIG9uIG9ubHkgaWYgY2hrPT0yCisgKi8KKworc3RhdGljIGludCBjaGtfaWZfYWxsb2NhdGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gc2VjLCBjaGFyICptc2cpCit7CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCXVuc2lnbmVkICpibXA7CisJaWYgKCEoYm1wID0gaHBmc19tYXBfYml0bWFwKHMsIHNlYyA+PiAxNCwgJnFiaCwgImNoayIpKSkgZ290byBmYWlsOworCWlmICgoYm1wWyhzZWMgJiAweDNmZmYpID4+IDVdID4+IChzZWMgJiAweDFmKSkgJiAxKSB7CisJCWhwZnNfZXJyb3IocywgInNlY3RvciAnJXMnIC0gJTA4eCBub3QgYWxsb2NhdGVkIGluIGJpdG1hcCIsIG1zZywgc2VjKTsKKwkJZ290byBmYWlsMTsKKwl9CisJaHBmc19icmVsc2U0KCZxYmgpOworCWlmIChzZWMgPj0gaHBmc19zYihzKS0+c2JfZGlyYmFuZF9zdGFydCAmJiBzZWMgPCBocGZzX3NiKHMpLT5zYl9kaXJiYW5kX3N0YXJ0ICsgaHBmc19zYihzKS0+c2JfZGlyYmFuZF9zaXplKSB7CisJCXVuc2lnbmVkIHNzZWMgPSAoc2VjIC0gaHBmc19zYihzKS0+c2JfZGlyYmFuZF9zdGFydCkgLyA0OworCQlpZiAoIShibXAgPSBocGZzX21hcF9kbm9kZV9iaXRtYXAocywgJnFiaCkpKSBnb3RvIGZhaWw7CisJCWlmICgoYm1wW3NzZWMgPj4gNV0gPj4gKHNzZWMgJiAweDFmKSkgJiAxKSB7CisJCQlocGZzX2Vycm9yKHMsICJzZWN0b3IgJyVzJyAtICUwOHggbm90IGFsbG9jYXRlZCBpbiBkaXJlY3RvcnkgYml0bWFwIiwgbXNnLCBzZWMpOworCQkJZ290byBmYWlsMTsKKwkJfQorCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJfQorCXJldHVybiAwOworCWZhaWwxOgorCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwlmYWlsOgorCXJldHVybiAxOworfQorCisvKgorICogQ2hlY2sgaWYgc2VjdG9yKHMpIGhhdmUgcHJvcGVyIG51bWJlciBhbmQgYWRkaXRpb25hbGx5IGNoZWNrIGlmIHRoZXkncmUKKyAqIGFsbG9jYXRlZCBpbiBiaXRtYXAuCisgKi8KKwkKK2ludCBocGZzX2Noa19zZWN0b3JzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gc3RhcnQsIGludCBsZW4sIGNoYXIgKm1zZykKK3sKKwlpZiAoc3RhcnQgKyBsZW4gPCBzdGFydCB8fCBzdGFydCA8IDB4MTIgfHwKKwkgICAgc3RhcnQgKyBsZW4gPiBocGZzX3NiKHMpLT5zYl9mc19zaXplKSB7CisJICAgIAlocGZzX2Vycm9yKHMsICJzZWN0b3IocykgJyVzJyBiYWRseSBwbGFjZWQgYXQgJTA4eCIsIG1zZywgc3RhcnQpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGhwZnNfc2IocyktPnNiX2Noaz49MikgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkJaWYgKGNoa19pZl9hbGxvY2F0ZWQocywgc3RhcnQgKyBpLCBtc2cpKSByZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzZWNubyBhbGxvY19pbl9ibXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzZWNubyBuZWFyLCB1bnNpZ25lZCBuLCB1bnNpZ25lZCBmb3J3YXJkKQoreworCXN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkIHFiaDsKKwl1bnNpZ25lZCAqYm1wOworCXVuc2lnbmVkIGJzID0gbmVhciAmIH4weDNmZmY7CisJdW5zaWduZWQgbnIgPSAobmVhciAmIDB4M2ZmZikgJiB+KG4gLSAxKTsKKwkvKnVuc2lnbmVkIG1ucjsqLworCXVuc2lnbmVkIGksIHE7CisJaW50IGEsIGI7CisJc2Vjbm8gcmV0ID0gMDsKKwlpZiAobiAhPSAxICYmIG4gIT0gNCkgeworCQlocGZzX2Vycm9yKHMsICJCYWQgYWxsb2NhdGlvbiBzaXplOiAlZCIsIG4pOworCQlyZXR1cm4gMDsKKwl9CisJbG9ja19zdXBlcihzKTsKKwlpZiAoYnMgIT0gfjB4M2ZmZikgeworCQlpZiAoIShibXAgPSBocGZzX21hcF9iaXRtYXAocywgbmVhciA+PiAxNCwgJnFiaCwgImFpYiIpKSkgZ290byB1bHM7CisJfSBlbHNlIHsKKwkJaWYgKCEoYm1wID0gaHBmc19tYXBfZG5vZGVfYml0bWFwKHMsICZxYmgpKSkgZ290byB1bHM7CisJfQorCWlmICghdHN0Yml0cyhibXAsIG5yLCBuICsgZm9yd2FyZCkpIHsKKwkJcmV0ID0gYnMgKyBucjsKKwkJZ290byBydDsKKwl9CisJLyppZiAoIXRzdGJpdHMoYm1wLCBuciArIG4sIG4gKyBmb3J3YXJkKSkgeworCQlyZXQgPSBicyArIG5yICsgbjsKKwkJZ290byBydDsKKwl9Ki8KKwlxID0gbnIgKyBuOyBiID0gMDsKKwl3aGlsZSAoKGEgPSB0c3RiaXRzKGJtcCwgcSwgbiArIGZvcndhcmQpKSAhPSAwKSB7CisJCXEgKz0gYTsKKwkJaWYgKG4gIT0gMSkgcSA9ICgocS0xKSZ+KG4tMSkpK247CisJCWlmICghYikgeworCQkJaWYgKHE+PjUgIT0gbnI+PjUpIHsKKwkJCQliID0gMTsKKwkJCQlxID0gbnIgJiAweDFmOworCQkJfQorCQl9IGVsc2UgaWYgKHEgPiBucikgYnJlYWs7CisJfQorCWlmICghYSkgeworCQlyZXQgPSBicyArIHE7CisJCWdvdG8gcnQ7CisJfQorCW5yID4+PSA1OworCS8qZm9yIChpID0gbnIgKyAxOyBpICE9IG5yOyBpKyssIGkgJj0gMHgxZmYpIHsqLworCWkgPSBucjsKKwlkbyB7CisJCWlmICghYm1wW2ldKSBnb3RvIGNvbnQ7CisJCWlmIChuICsgZm9yd2FyZCA+PSAweDNmICYmIGJtcFtpXSAhPSAtMSkgZ290byBjb250OworCQlxID0gaTw8NTsKKwkJaWYgKGkgPiAwKSB7CisJCQl1bnNpZ25lZCBrID0gYm1wW2ktMV07CisJCQl3aGlsZSAoayAmIDB4ODAwMDAwMDApIHsKKwkJCQlxLS07IGsgPDw9IDE7CisJCQl9CisJCX0KKwkJaWYgKG4gIT0gMSkgcSA9ICgocS0xKSZ+KG4tMSkpK247CisJCXdoaWxlICgoYSA9IHRzdGJpdHMoYm1wLCBxLCBuICsgZm9yd2FyZCkpICE9IDApIHsKKwkJCXEgKz0gYTsKKwkJCWlmIChuICE9IDEpIHEgPSAoKHEtMSkmfihuLTEpKStuOworCQkJaWYgKHE+PjUgPiBpKSBicmVhazsKKwkJfQorCQlpZiAoIWEpIHsKKwkJCXJldCA9IGJzICsgcTsKKwkJCWdvdG8gcnQ7CisJCX0KKwkJY29udDoKKwkJaSsrLCBpICY9IDB4MWZmOworCX0gd2hpbGUgKGkgIT0gbnIpOworCXJ0OgorCWlmIChyZXQpIHsKKwkJaWYgKGhwZnNfc2IocyktPnNiX2NoayAmJiAoKHJldCA+PiAxNCkgIT0gKGJzID4+IDE0KSB8fCAoYm1wWyhyZXQgJiAweDNmZmYpID4+IDVdIHwgfigoKDEgPDwgbikgLSAxKSA8PCAocmV0ICYgMHgxZikpKSAhPSAweGZmZmZmZmZmKSkgeworCQkJaHBmc19lcnJvcihzLCAiQWxsb2NhdGlvbiBkb2Vzbid0IHdvcmshIFdhbnRlZCAlZCwgYWxsb2NhdGVkIGF0ICUwOHgiLCBuLCByZXQpOworCQkJcmV0ID0gMDsKKwkJCWdvdG8gYjsKKwkJfQorCQlibXBbKHJldCAmIDB4M2ZmZikgPj4gNV0gJj0gfigoKDEgPDwgbikgLSAxKSA8PCAocmV0ICYgMHgxZikpOworCQlocGZzX21hcmtfNGJ1ZmZlcnNfZGlydHkoJnFiaCk7CisJfQorCWI6CisJaHBmc19icmVsc2U0KCZxYmgpOworCXVsczoKKwl1bmxvY2tfc3VwZXIocyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEFsbG9jYXRpb24gc3RyYXRlZ3k6CTEpIHNlYXJjaCBwbGFjZSBuZWFyIHRoZSBzZWN0b3Igc3BlY2lmaWVkCisgKgkJCTIpIHNlYXJjaCBiaXRtYXAgd2hlcmUgZnJlZSBzZWN0b3JzIGxhc3QgZm91bmQKKyAqCQkJMykgc2VhcmNoIGFsbCBiaXRtYXBzCisgKgkJCTQpIHNlYXJjaCBhbGwgYml0bWFwcyBpZ25vcmluZyBudW1iZXIgb2YgcHJlLWFsbG9jYXRlZAorICoJCQkJc2VjdG9ycworICovCisKK3NlY25vIGhwZnNfYWxsb2Nfc2VjdG9yKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gbmVhciwgdW5zaWduZWQgbiwgaW50IGZvcndhcmQsIGludCBsb2NrKQoreworCXNlY25vIHNlYzsKKwlpbnQgaTsKKwl1bnNpZ25lZCBuX2JtcHM7CisJc3RydWN0IGhwZnNfc2JfaW5mbyAqc2JpID0gaHBmc19zYihzKTsKKwlpbnQgZl9wID0gMDsKKwlpbnQgbmVhcl9ibXA7CisJaWYgKGZvcndhcmQgPCAwKSB7CisJCWZvcndhcmQgPSAtZm9yd2FyZDsKKwkJZl9wID0gMTsKKwl9CisJaWYgKGxvY2spIGhwZnNfbG9ja19jcmVhdGlvbihzKTsKKwluX2JtcHMgPSAoc2JpLT5zYl9mc19zaXplICsgMHg0MDAwIC0gMSkgPj4gMTQ7CisJaWYgKG5lYXIgJiYgbmVhciA8IHNiaS0+c2JfZnNfc2l6ZSkgeworCQlpZiAoKHNlYyA9IGFsbG9jX2luX2JtcChzLCBuZWFyLCBuLCBmX3AgPyBmb3J3YXJkIDogZm9yd2FyZC80KSkpIGdvdG8gcmV0OworCQluZWFyX2JtcCA9IG5lYXIgPj4gMTQ7CisJfSBlbHNlIG5lYXJfYm1wID0gbl9ibXBzIC8gMjsKKwkvKgorCWlmIChiICE9IC0xKSB7CisJCWlmICgoc2VjID0gYWxsb2NfaW5fYm1wKHMsIGI8PDE0LCBuLCBmX3AgPyBmb3J3YXJkIDogZm9yd2FyZC8yKSkpIHsKKwkJCWIgJj0gMHgwZmZmZmZmZjsKKwkJCWdvdG8gcmV0OworCQl9CisJCWlmIChiID4gMHgxMDAwMDAwMCkgaWYgKChzZWMgPSBhbGxvY19pbl9ibXAocywgKGImMHhmZmZmZmZmKTw8MTQsIG4sIGZfcCA/IGZvcndhcmQgOiAwKSkpIGdvdG8gcmV0OworCSovCisJaWYgKCFmX3ApIGlmIChmb3J3YXJkID4gc2JpLT5zYl9tYXhfZndkX2FsbG9jKSBmb3J3YXJkID0gc2JpLT5zYl9tYXhfZndkX2FsbG9jOworCWxlc3NfZndkOgorCWZvciAoaSA9IDA7IGkgPCBuX2JtcHM7IGkrKykgeworCQlpZiAobmVhcl9ibXAraSA8IG5fYm1wcyAmJiAoKHNlYyA9IGFsbG9jX2luX2JtcChzLCAobmVhcl9ibXAraSkgPDwgMTQsIG4sIGZvcndhcmQpKSkpIHsKKwkJCXNiaS0+c2JfY19iaXRtYXAgPSBuZWFyX2JtcCtpOworCQkJZ290byByZXQ7CisJCX0JCisJCWlmICghZm9yd2FyZCkgeworCQkJaWYgKG5lYXJfYm1wLWktMSA+PSAwICYmICgoc2VjID0gYWxsb2NfaW5fYm1wKHMsIChuZWFyX2JtcC1pLTEpIDw8IDE0LCBuLCBmb3J3YXJkKSkpKSB7CisJCQkJc2JpLT5zYl9jX2JpdG1hcCA9IG5lYXJfYm1wLWktMTsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChuZWFyX2JtcCtpID49IG5fYm1wcyAmJiAoKHNlYyA9IGFsbG9jX2luX2JtcChzLCAobmVhcl9ibXAraS1uX2JtcHMpIDw8IDE0LCBuLCBmb3J3YXJkKSkpKSB7CisJCQkJc2JpLT5zYl9jX2JpdG1hcCA9IG5lYXJfYm1wK2ktbl9ibXBzOworCQkJCWdvdG8gcmV0OworCQkJfQorCQl9CisJCWlmIChpID09IDEgJiYgc2JpLT5zYl9jX2JpdG1hcCAhPSAtMSAmJiAoKHNlYyA9IGFsbG9jX2luX2JtcChzLCAoc2JpLT5zYl9jX2JpdG1hcCkgPDwgMTQsIG4sIGZvcndhcmQpKSkpIHsKKwkJCWdvdG8gcmV0OworCQl9CisJfQorCWlmICghZl9wKSB7CisJCWlmIChmb3J3YXJkKSB7CisJCQlzYmktPnNiX21heF9md2RfYWxsb2MgPSBmb3J3YXJkICogMyAvIDQ7CisJCQlmb3J3YXJkIC89IDI7CisJCQlnb3RvIGxlc3NfZndkOworCQl9CisJfQorCXNlYyA9IDA7CisJcmV0OgorCWlmIChzZWMgJiYgZl9wKSB7CisJCWZvciAoaSA9IDA7IGkgPCBmb3J3YXJkOyBpKyspIHsKKwkJCWlmICghaHBmc19hbGxvY19pZl9wb3NzaWJsZV9ub2xvY2socywgc2VjICsgaSArIDEpKSB7CisJCQkJaHBmc19lcnJvcihzLCAiUHJlYWxsb2MgZG9lc24ndCB3b3JrISBXYW50ZWQgJWQsIGFsbG9jYXRlZCBhdCAlMDh4LCBjYW4ndCBhbGxvY2F0ZSAlZCIsIGZvcndhcmQsIHNlYywgaSk7CisJCQkJc2VjID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlpZiAobG9jaykgaHBmc191bmxvY2tfY3JlYXRpb24ocyk7CisJcmV0dXJuIHNlYzsKK30KKworc3RhdGljIHNlY25vIGFsbG9jX2luX2RpcmJhbmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzZWNubyBuZWFyLCBpbnQgbG9jaykKK3sKKwl1bnNpZ25lZCBuciA9IG5lYXI7CisJc2Vjbm8gc2VjOworCXN0cnVjdCBocGZzX3NiX2luZm8gKnNiaSA9IGhwZnNfc2Iocyk7CisJaWYgKG5yIDwgc2JpLT5zYl9kaXJiYW5kX3N0YXJ0KQorCQluciA9IHNiaS0+c2JfZGlyYmFuZF9zdGFydDsKKwlpZiAobnIgPj0gc2JpLT5zYl9kaXJiYW5kX3N0YXJ0ICsgc2JpLT5zYl9kaXJiYW5kX3NpemUpCisJCW5yID0gc2JpLT5zYl9kaXJiYW5kX3N0YXJ0ICsgc2JpLT5zYl9kaXJiYW5kX3NpemUgLSA0OworCW5yIC09IHNiaS0+c2JfZGlyYmFuZF9zdGFydDsKKwluciA+Pj0gMjsKKwlpZiAobG9jaykgaHBmc19sb2NrX2NyZWF0aW9uKHMpOworCXNlYyA9IGFsbG9jX2luX2JtcChzLCAofjB4M2ZmZikgfCBuciwgMSwgMCk7CisJaWYgKGxvY2spIGhwZnNfdW5sb2NrX2NyZWF0aW9uKHMpOworCWlmICghc2VjKSByZXR1cm4gMDsKKwlyZXR1cm4gKChzZWMgJiAweDNmZmYpIDw8IDIpICsgc2JpLT5zYl9kaXJiYW5kX3N0YXJ0OworfQorCisvKiBBbGxvYyBzZWN0b3IgaWYgaXQncyBmcmVlICovCisKK3N0YXRpYyBpbnQgaHBmc19hbGxvY19pZl9wb3NzaWJsZV9ub2xvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzZWNubyBzZWMpCit7CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCXVuc2lnbmVkICpibXA7CisJbG9ja19zdXBlcihzKTsKKwlpZiAoIShibXAgPSBocGZzX21hcF9iaXRtYXAocywgc2VjID4+IDE0LCAmcWJoLCAiYWlwIikpKSBnb3RvIGVuZDsKKwlpZiAoYm1wWyhzZWMgJiAweDNmZmYpID4+IDVdICYgKDEgPDwgKHNlYyAmIDB4MWYpKSkgeworCQlibXBbKHNlYyAmIDB4M2ZmZikgPj4gNV0gJj0gfigxIDw8IChzZWMgJiAweDFmKSk7CisJCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eSgmcWJoKTsKKwkJaHBmc19icmVsc2U0KCZxYmgpOworCQl1bmxvY2tfc3VwZXIocyk7CisJCXJldHVybiAxOworCX0KKwlocGZzX2JyZWxzZTQoJnFiaCk7CisJZW5kOgorCXVubG9ja19zdXBlcihzKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGhwZnNfYWxsb2NfaWZfcG9zc2libGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzZWNubyBzZWMpCit7CisJaW50IHI7CisJaHBmc19sb2NrX2NyZWF0aW9uKHMpOworCXIgPSBocGZzX2FsbG9jX2lmX3Bvc3NpYmxlX25vbG9jayhzLCBzZWMpOworCWhwZnNfdW5sb2NrX2NyZWF0aW9uKHMpOworCXJldHVybiByOworfQorCisvKiBGcmVlIHNlY3RvcnMgaW4gYml0bWFwcyAqLworCit2b2lkIGhwZnNfZnJlZV9zZWN0b3JzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gc2VjLCB1bnNpZ25lZCBuKQoreworCXN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkIHFiaDsKKwl1bnNpZ25lZCAqYm1wOworCXN0cnVjdCBocGZzX3NiX2luZm8gKnNiaSA9IGhwZnNfc2Iocyk7CisJLypwcmludGsoIjIgLSAiKTsqLworCWlmICghbikgcmV0dXJuOworCWlmIChzZWMgPCAweDEyKSB7CisJCWhwZnNfZXJyb3IocywgIlRyeWluZyB0byBmcmVlIHJlc2VydmVkIHNlY3RvciAlMDh4Iiwgc2VjKTsKKwkJcmV0dXJuOworCX0KKwlsb2NrX3N1cGVyKHMpOworCXNiaS0+c2JfbWF4X2Z3ZF9hbGxvYyArPSBuID4gMHhmZmZmID8gMHhmZmZmIDogbjsKKwlpZiAoc2JpLT5zYl9tYXhfZndkX2FsbG9jID4gMHhmZmZmZmYpIHNiaS0+c2JfbWF4X2Z3ZF9hbGxvYyA9IDB4ZmZmZmZmOworCW5ld19tYXA6CisJaWYgKCEoYm1wID0gaHBmc19tYXBfYml0bWFwKHMsIHNlYyA+PiAxNCwgJnFiaCwgImZyZWUiKSkpIHsKKwkJdW5sb2NrX3N1cGVyKHMpOworCQlyZXR1cm47CisJfQkKKwluZXdfdHN0OgorCWlmICgoYm1wWyhzZWMgJiAweDNmZmYpID4+IDVdID4+IChzZWMgJiAweDFmKSAmIDEpKSB7CisJCWhwZnNfZXJyb3IocywgInNlY3RvciAlMDh4IG5vdCBhbGxvY2F0ZWQiLCBzZWMpOworCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCXVubG9ja19zdXBlcihzKTsKKwkJcmV0dXJuOworCX0KKwlibXBbKHNlYyAmIDB4M2ZmZikgPj4gNV0gfD0gMSA8PCAoc2VjICYgMHgxZik7CisJaWYgKCEtLW4pIHsKKwkJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgpOworCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCXVubG9ja19zdXBlcihzKTsKKwkJcmV0dXJuOworCX0JCisJaWYgKCEoKytzZWMgJiAweDNmZmYpKSB7CisJCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eSgmcWJoKTsKKwkJaHBmc19icmVsc2U0KCZxYmgpOworCQlnb3RvIG5ld19tYXA7CisJfQorCWdvdG8gbmV3X3RzdDsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZXJlIGFyZSBhdCBsZWFzdCBuIGZyZWUgZG5vZGVzIG9uIHRoZSBmaWxlc3lzdGVtLgorICogQ2FsbGVkIGJlZm9yZSBhZGRpbmcgdG8gZG5vZGUuIElmIHdlIHJ1biBvdXQgb2Ygc3BhY2Ugd2hpbGUKKyAqIHNwbGl0dGluZyBkbm9kZXMsIGl0IHdvdWxkIGNvcnJ1cHQgZG5vZGUgdHJlZS4KKyAqLworCitpbnQgaHBmc19jaGVja19mcmVlX2Rub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBuKQoreworCWludCBuX2JtcHMgPSAoaHBmc19zYihzKS0+c2JfZnNfc2l6ZSArIDB4NDAwMCAtIDEpID4+IDE0OworCWludCBiID0gaHBmc19zYihzKS0+c2JfY19iaXRtYXAgJiAweDBmZmZmZmZmOworCWludCBpLCBqOworCXVuc2lnbmVkICpibXA7CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCWlmICgoYm1wID0gaHBmc19tYXBfZG5vZGVfYml0bWFwKHMsICZxYmgpKSkgeworCQlmb3IgKGogPSAwOyBqIDwgNTEyOyBqKyspIHsKKwkJCXVuc2lnbmVkIGs7CisJCQlpZiAoIWJtcFtqXSkgY29udGludWU7CisJCQlmb3IgKGsgPSBibXBbal07IGs7IGsgPj49IDEpIGlmIChrICYgMSkgaWYgKCEtLW4pIHsKKwkJCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJaHBmc19icmVsc2U0KCZxYmgpOworCWkgPSAwOworCWlmIChocGZzX3NiKHMpLT5zYl9jX2JpdG1hcCAhPSAtMSkgeworCQlibXAgPSBocGZzX21hcF9iaXRtYXAocywgYiwgJnFiaCwgImNoa2RuMSIpOworCQlnb3RvIGNoa19ibXA7CisJfQorCWNoa19uZXh0OgorCWlmIChpID09IGIpIGkrKzsKKwlpZiAoaSA+PSBuX2JtcHMpIHJldHVybiAxOworCWJtcCA9IGhwZnNfbWFwX2JpdG1hcChzLCBpLCAmcWJoLCAiY2hrZG4yIik7CisJY2hrX2JtcDoKKwlpZiAoYm1wKSB7CisJCWZvciAoaiA9IDA7IGogPCA1MTI7IGorKykgeworCQkJdW5zaWduZWQgazsKKwkJCWlmICghYm1wW2pdKSBjb250aW51ZTsKKwkJCWZvciAoayA9IDB4ZjsgazsgayA8PD0gNCkKKwkJCQlpZiAoKGJtcFtqXSAmIGspID09IGspIHsKKwkJCQkJaWYgKCEtLW4pIHsKKwkJCQkJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJfQorCQl9CisJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwl9CisJaSsrOworCWdvdG8gY2hrX25leHQ7Cit9CisKK3ZvaWQgaHBmc19mcmVlX2Rub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgZG5vZGVfc2Vjbm8gZG5vKQoreworCWlmIChocGZzX3NiKHMpLT5zYl9jaGspIGlmIChkbm8gJiAzKSB7CisJCWhwZnNfZXJyb3IocywgImhwZnNfZnJlZV9kbm9kZTogZG5vZGUgJTA4eCBub3QgYWxpZ25lZCIsIGRubyk7CisJCXJldHVybjsKKwl9CisJaWYgKGRubyA8IGhwZnNfc2IocyktPnNiX2RpcmJhbmRfc3RhcnQgfHwKKwkgICAgZG5vID49IGhwZnNfc2IocyktPnNiX2RpcmJhbmRfc3RhcnQgKyBocGZzX3NiKHMpLT5zYl9kaXJiYW5kX3NpemUpIHsKKwkJaHBmc19mcmVlX3NlY3RvcnMocywgZG5vLCA0KTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCBxYmg7CisJCXVuc2lnbmVkICpibXA7CisJCXVuc2lnbmVkIHNzZWMgPSAoZG5vIC0gaHBmc19zYihzKS0+c2JfZGlyYmFuZF9zdGFydCkgLyA0OworCQlsb2NrX3N1cGVyKHMpOworCQlpZiAoIShibXAgPSBocGZzX21hcF9kbm9kZV9iaXRtYXAocywgJnFiaCkpKSB7CisJCQl1bmxvY2tfc3VwZXIocyk7CisJCQlyZXR1cm47CisJCX0KKwkJYm1wW3NzZWMgPj4gNV0gfD0gMSA8PCAoc3NlYyAmIDB4MWYpOworCQlocGZzX21hcmtfNGJ1ZmZlcnNfZGlydHkoJnFiaCk7CisJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJdW5sb2NrX3N1cGVyKHMpOworCX0KK30KKworc3RydWN0IGRub2RlICpocGZzX2FsbG9jX2Rub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gbmVhciwKKwkJCSBkbm9kZV9zZWNubyAqZG5vLCBzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCAqcWJoLAorCQkJIGludCBsb2NrKQoreworCXN0cnVjdCBkbm9kZSAqZDsKKwlpZiAoaHBmc19jb3VudF9vbmVfYml0bWFwKHMsIGhwZnNfc2IocyktPnNiX2RtYXApID4gRlJFRV9ETk9ERVNfQUREKSB7CisJCWlmICghKCpkbm8gPSBhbGxvY19pbl9kaXJiYW5kKHMsIG5lYXIsIGxvY2spKSkKKwkJCWlmICghKCpkbm8gPSBocGZzX2FsbG9jX3NlY3RvcihzLCBuZWFyLCA0LCAwLCBsb2NrKSkpIHJldHVybiBOVUxMOworCX0gZWxzZSB7CisJCWlmICghKCpkbm8gPSBocGZzX2FsbG9jX3NlY3RvcihzLCBuZWFyLCA0LCAwLCBsb2NrKSkpCisJCQlpZiAoISgqZG5vID0gYWxsb2NfaW5fZGlyYmFuZChzLCBuZWFyLCBsb2NrKSkpIHJldHVybiBOVUxMOworCX0KKwlpZiAoIShkID0gaHBmc19nZXRfNHNlY3RvcnMocywgKmRubywgcWJoKSkpIHsKKwkJaHBmc19mcmVlX2Rub2RlKHMsICpkbm8pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KGQsIDAsIDIwNDgpOworCWQtPm1hZ2ljID0gRE5PREVfTUFHSUM7CisJZC0+Zmlyc3RfZnJlZSA9IDUyOworCWQtPmRpcmVudFswXSA9IDMyOworCWQtPmRpcmVudFsyXSA9IDg7CisJZC0+ZGlyZW50WzMwXSA9IDE7CisJZC0+ZGlyZW50WzMxXSA9IDI1NTsKKwlkLT5zZWxmID0gKmRubzsKKwlyZXR1cm4gZDsKK30KKworc3RydWN0IGZub2RlICpocGZzX2FsbG9jX2Zub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gbmVhciwgZm5vZGVfc2Vjbm8gKmZubywKKwkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpCit7CisJc3RydWN0IGZub2RlICpmOworCWlmICghKCpmbm8gPSBocGZzX2FsbG9jX3NlY3RvcihzLCBuZWFyLCAxLCBGTk9ERV9BTExPQ19GV0QsIDEpKSkgcmV0dXJuIE5VTEw7CisJaWYgKCEoZiA9IGhwZnNfZ2V0X3NlY3RvcihzLCAqZm5vLCBiaCkpKSB7CisJCWhwZnNfZnJlZV9zZWN0b3JzKHMsICpmbm8sIDEpOworCQlyZXR1cm4gTlVMTDsKKwl9CQorCW1lbXNldChmLCAwLCA1MTIpOworCWYtPm1hZ2ljID0gRk5PREVfTUFHSUM7CisJZi0+ZWFfb2ZmcyA9IDB4YzQ7CisJZi0+YnRyZWUubl9mcmVlX25vZGVzID0gODsKKwlmLT5idHJlZS5maXJzdF9mcmVlID0gODsKKwlyZXR1cm4gZjsKK30KKworc3RydWN0IGFub2RlICpocGZzX2FsbG9jX2Fub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gbmVhciwgYW5vZGVfc2Vjbm8gKmFubywKKwkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpCit7CisJc3RydWN0IGFub2RlICphOworCWlmICghKCphbm8gPSBocGZzX2FsbG9jX3NlY3RvcihzLCBuZWFyLCAxLCBBTk9ERV9BTExPQ19GV0QsIDEpKSkgcmV0dXJuIE5VTEw7CisJaWYgKCEoYSA9IGhwZnNfZ2V0X3NlY3RvcihzLCAqYW5vLCBiaCkpKSB7CisJCWhwZnNfZnJlZV9zZWN0b3JzKHMsICphbm8sIDEpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KGEsIDAsIDUxMik7CisJYS0+bWFnaWMgPSBBTk9ERV9NQUdJQzsKKwlhLT5zZWxmID0gKmFubzsKKwlhLT5idHJlZS5uX2ZyZWVfbm9kZXMgPSA0MDsKKwlhLT5idHJlZS5uX3VzZWRfbm9kZXMgPSAwOworCWEtPmJ0cmVlLmZpcnN0X2ZyZWUgPSA4OworCXJldHVybiBhOworfQpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9hbm9kZS5jIGIvZnMvaHBmcy9hbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYTg4YzQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ocGZzL2Fub2RlLmMKQEAgLTAsMCArMSw0OTEgQEAKKy8qCisgKiAgbGludXgvZnMvaHBmcy9hbm9kZS5jCisgKgorICogIE1pa3VsYXMgUGF0b2NrYSAobWlrdWxhc0BhcnRheC5rYXJsaW4ubWZmLmN1bmkuY3opLCAxOTk4LTE5OTkKKyAqCisgKiAgaGFuZGxpbmcgSFBGUyBhbm9kZSB0cmVlIHRoYXQgY29udGFpbnMgZmlsZSBhbGxvY2F0aW9uIGluZm8KKyAqLworCisjaW5jbHVkZSAiaHBmc19mbi5oIgorCisvKiBGaW5kIGEgc2VjdG9yIGluIGFsbG9jYXRpb24gdHJlZSAqLworCitzZWNubyBocGZzX2JwbHVzX2xvb2t1cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCSAgIHN0cnVjdCBicGx1c19oZWFkZXIgKmJ0cmVlLCB1bnNpZ25lZCBzZWMsCisJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJYW5vZGVfc2Vjbm8gYSA9IC0xOworCXN0cnVjdCBhbm9kZSAqYW5vZGU7CisJaW50IGk7CisJaW50IGMxLCBjMiA9IDA7CisJZ29fZG93bjoKKwlpZiAoaHBmc19zYihzKS0+c2JfY2hrKSBpZiAoaHBmc19zdG9wX2N5Y2xlcyhzLCBhLCAmYzEsICZjMiwgImhwZnNfYnBsdXNfbG9va3VwIikpIHJldHVybiAtMTsKKwlpZiAoYnRyZWUtPmludGVybmFsKSB7CisJCWZvciAoaSA9IDA7IGkgPCBidHJlZS0+bl91c2VkX25vZGVzOyBpKyspCisJCQlpZiAoYnRyZWUtPnUuaW50ZXJuYWxbaV0uZmlsZV9zZWNubyA+IHNlYykgeworCQkJCWEgPSBidHJlZS0+dS5pbnRlcm5hbFtpXS5kb3duOworCQkJCWJyZWxzZShiaCk7CisJCQkJaWYgKCEoYW5vZGUgPSBocGZzX21hcF9hbm9kZShzLCBhLCAmYmgpKSkgcmV0dXJuIC0xOworCQkJCWJ0cmVlID0gJmFub2RlLT5idHJlZTsKKwkJCQlnb3RvIGdvX2Rvd247CisJCQl9CisJCWhwZnNfZXJyb3IocywgInNlY3RvciAlMDh4IG5vdCBmb3VuZCBpbiBpbnRlcm5hbCBhbm9kZSAlMDh4Iiwgc2VjLCBhKTsKKwkJYnJlbHNlKGJoKTsKKwkJcmV0dXJuIC0xOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgYnRyZWUtPm5fdXNlZF9ub2RlczsgaSsrKQorCQlpZiAoYnRyZWUtPnUuZXh0ZXJuYWxbaV0uZmlsZV9zZWNubyA8PSBzZWMgJiYKKwkJICAgIGJ0cmVlLT51LmV4dGVybmFsW2ldLmZpbGVfc2Vjbm8gKyBidHJlZS0+dS5leHRlcm5hbFtpXS5sZW5ndGggPiBzZWMpIHsKKwkJCWEgPSBidHJlZS0+dS5leHRlcm5hbFtpXS5kaXNrX3NlY25vICsgc2VjIC0gYnRyZWUtPnUuZXh0ZXJuYWxbaV0uZmlsZV9zZWNubzsKKwkJCWlmIChocGZzX3NiKHMpLT5zYl9jaGspIGlmIChocGZzX2Noa19zZWN0b3JzKHMsIGEsIDEsICJkYXRhIikpIHsKKwkJCQlicmVsc2UoYmgpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChpbm9kZSkgeworCQkJCXN0cnVjdCBocGZzX2lub2RlX2luZm8gKmhwZnNfaW5vZGUgPSBocGZzX2koaW5vZGUpOworCQkJCWhwZnNfaW5vZGUtPmlfZmlsZV9zZWMgPSBidHJlZS0+dS5leHRlcm5hbFtpXS5maWxlX3NlY25vOworCQkJCWhwZnNfaW5vZGUtPmlfZGlza19zZWMgPSBidHJlZS0+dS5leHRlcm5hbFtpXS5kaXNrX3NlY25vOworCQkJCWhwZnNfaW5vZGUtPmlfbl9zZWNzID0gYnRyZWUtPnUuZXh0ZXJuYWxbaV0ubGVuZ3RoOworCQkJfQorCQkJYnJlbHNlKGJoKTsKKwkJCXJldHVybiBhOworCQl9CisJaHBmc19lcnJvcihzLCAic2VjdG9yICUwOHggbm90IGZvdW5kIGluIGV4dGVybmFsIGFub2RlICUwOHgiLCBzZWMsIGEpOworCWJyZWxzZShiaCk7CisJcmV0dXJuIC0xOworfQorCisvKiBBZGQgYSBzZWN0b3IgdG8gdHJlZSAqLworCitzZWNubyBocGZzX2FkZF9zZWN0b3JfdG9fYnRyZWUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzZWNubyBub2RlLCBpbnQgZm5vZCwgdW5zaWduZWQgZnNlY25vKQoreworCXN0cnVjdCBicGx1c19oZWFkZXIgKmJ0cmVlOworCXN0cnVjdCBhbm9kZSAqYW5vZGUgPSBOVUxMLCAqcmFub2RlID0gTlVMTDsKKwlzdHJ1Y3QgZm5vZGUgKmZub2RlOworCWFub2RlX3NlY25vIGEsIG5hID0gLTEsIHJhLCB1cCA9IC0xOworCXNlY25vIHNlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpiaDEsICpiaDI7CisJaW50IG47CisJdW5zaWduZWQgZnM7CisJaW50IGMxLCBjMiA9IDA7CisJaWYgKGZub2QpIHsKKwkJaWYgKCEoZm5vZGUgPSBocGZzX21hcF9mbm9kZShzLCBub2RlLCAmYmgpKSkgcmV0dXJuIC0xOworCQlidHJlZSA9ICZmbm9kZS0+YnRyZWU7CisJfSBlbHNlIHsKKwkJaWYgKCEoYW5vZGUgPSBocGZzX21hcF9hbm9kZShzLCBub2RlLCAmYmgpKSkgcmV0dXJuIC0xOworCQlidHJlZSA9ICZhbm9kZS0+YnRyZWU7CisJfQorCWEgPSBub2RlOworCWdvX2Rvd246CisJaWYgKChuID0gYnRyZWUtPm5fdXNlZF9ub2RlcyAtIDEpIDwgLSEhZm5vZCkgeworCQlocGZzX2Vycm9yKHMsICJhbm9kZSAlMDh4IGhhcyBubyBlbnRyaWVzIiwgYSk7CisJCWJyZWxzZShiaCk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGJ0cmVlLT5pbnRlcm5hbCkgeworCQlhID0gYnRyZWUtPnUuaW50ZXJuYWxbbl0uZG93bjsKKwkJYnRyZWUtPnUuaW50ZXJuYWxbbl0uZmlsZV9zZWNubyA9IC0xOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCWJyZWxzZShiaCk7CisJCWlmIChocGZzX3NiKHMpLT5zYl9jaGspCisJCQlpZiAoaHBmc19zdG9wX2N5Y2xlcyhzLCBhLCAmYzEsICZjMiwgImhwZnNfYWRkX3NlY3Rvcl90b19idHJlZSAjMSIpKSByZXR1cm4gLTE7CisJCWlmICghKGFub2RlID0gaHBmc19tYXBfYW5vZGUocywgYSwgJmJoKSkpIHJldHVybiAtMTsKKwkJYnRyZWUgPSAmYW5vZGUtPmJ0cmVlOworCQlnb3RvIGdvX2Rvd247CisJfQorCWlmIChuID49IDApIHsKKwkJaWYgKGJ0cmVlLT51LmV4dGVybmFsW25dLmZpbGVfc2Vjbm8gKyBidHJlZS0+dS5leHRlcm5hbFtuXS5sZW5ndGggIT0gZnNlY25vKSB7CisJCQlocGZzX2Vycm9yKHMsICJhbGxvY2F0ZWQgc2l6ZSAlMDh4LCB0cnlpbmcgdG8gYWRkIHNlY3RvciAlMDh4LCAlY25vZGUgJTA4eCIsCisJCQkJYnRyZWUtPnUuZXh0ZXJuYWxbbl0uZmlsZV9zZWNubyArIGJ0cmVlLT51LmV4dGVybmFsW25dLmxlbmd0aCwgZnNlY25vLAorCQkJCWZub2Q/J2YnOidhJywgbm9kZSk7CisJCQlicmVsc2UoYmgpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChocGZzX2FsbG9jX2lmX3Bvc3NpYmxlKHMsIHNlID0gYnRyZWUtPnUuZXh0ZXJuYWxbbl0uZGlza19zZWNubyArIGJ0cmVlLT51LmV4dGVybmFsW25dLmxlbmd0aCkpIHsKKwkJCWJ0cmVlLT51LmV4dGVybmFsW25dLmxlbmd0aCsrOworCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJYnJlbHNlKGJoKTsKKwkJCXJldHVybiBzZTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChmc2Vjbm8pIHsKKwkJCWhwZnNfZXJyb3IocywgImVtcHR5IGZpbGUgJTA4eCwgdHJ5aW5nIHRvIGFkZCBzZWN0b3IgJTA4eCIsIG5vZGUsIGZzZWNubyk7CisJCQlicmVsc2UoYmgpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXNlID0gIWZub2QgPyBub2RlIDogKG5vZGUgKyAxNjM4NCkgJiB+MTYzODM7CisJfQkKKwlpZiAoIShzZSA9IGhwZnNfYWxsb2Nfc2VjdG9yKHMsIHNlLCAxLCBmc2Vjbm8qQUxMT0NfTT5BTExPQ19GV0RfTUFYID8gQUxMT0NfRldEX01BWCA6IGZzZWNubypBTExPQ19NPEFMTE9DX0ZXRF9NSU4gPyBBTExPQ19GV0RfTUlOIDogZnNlY25vKkFMTE9DX00sIDEpKSkgeworCQlicmVsc2UoYmgpOworCQlyZXR1cm4gLTE7CisJfQorCWZzID0gbiA8IDAgPyAwIDogYnRyZWUtPnUuZXh0ZXJuYWxbbl0uZmlsZV9zZWNubyArIGJ0cmVlLT51LmV4dGVybmFsW25dLmxlbmd0aDsKKwlpZiAoIWJ0cmVlLT5uX2ZyZWVfbm9kZXMpIHsKKwkJdXAgPSBhICE9IG5vZGUgPyBhbm9kZS0+dXAgOiAtMTsKKwkJaWYgKCEoYW5vZGUgPSBocGZzX2FsbG9jX2Fub2RlKHMsIGEsICZuYSwgJmJoMSkpKSB7CisJCQlicmVsc2UoYmgpOworCQkJaHBmc19mcmVlX3NlY3RvcnMocywgc2UsIDEpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChhID09IG5vZGUgJiYgZm5vZCkgeworCQkJYW5vZGUtPnVwID0gbm9kZTsKKwkJCWFub2RlLT5idHJlZS5mbm9kZV9wYXJlbnQgPSAxOworCQkJYW5vZGUtPmJ0cmVlLm5fdXNlZF9ub2RlcyA9IGJ0cmVlLT5uX3VzZWRfbm9kZXM7CisJCQlhbm9kZS0+YnRyZWUuZmlyc3RfZnJlZSA9IGJ0cmVlLT5maXJzdF9mcmVlOworCQkJYW5vZGUtPmJ0cmVlLm5fZnJlZV9ub2RlcyA9IDQwIC0gYW5vZGUtPmJ0cmVlLm5fdXNlZF9ub2RlczsKKwkJCW1lbWNweSgmYW5vZGUtPnUsICZidHJlZS0+dSwgYnRyZWUtPm5fdXNlZF9ub2RlcyAqIDEyKTsKKwkJCWJ0cmVlLT5pbnRlcm5hbCA9IDE7CisJCQlidHJlZS0+bl9mcmVlX25vZGVzID0gMTE7CisJCQlidHJlZS0+bl91c2VkX25vZGVzID0gMTsKKwkJCWJ0cmVlLT5maXJzdF9mcmVlID0gKGNoYXIgKikmKGJ0cmVlLT51LmludGVybmFsWzFdKSAtIChjaGFyICopYnRyZWU7CisJCQlidHJlZS0+dS5pbnRlcm5hbFswXS5maWxlX3NlY25vID0gLTE7CisJCQlidHJlZS0+dS5pbnRlcm5hbFswXS5kb3duID0gbmE7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCX0gZWxzZSBpZiAoIShyYW5vZGUgPSBocGZzX2FsbG9jX2Fub2RlKHMsIC8qYSovMCwgJnJhLCAmYmgyKSkpIHsKKwkJCWJyZWxzZShiaCk7CisJCQlicmVsc2UoYmgxKTsKKwkJCWhwZnNfZnJlZV9zZWN0b3JzKHMsIHNlLCAxKTsKKwkJCWhwZnNfZnJlZV9zZWN0b3JzKHMsIG5hLCAxKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlicmVsc2UoYmgpOworCQliaCA9IGJoMTsKKwkJYnRyZWUgPSAmYW5vZGUtPmJ0cmVlOworCX0KKwlidHJlZS0+bl9mcmVlX25vZGVzLS07IG4gPSBidHJlZS0+bl91c2VkX25vZGVzKys7CisJYnRyZWUtPmZpcnN0X2ZyZWUgKz0gMTI7CisJYnRyZWUtPnUuZXh0ZXJuYWxbbl0uZGlza19zZWNubyA9IHNlOworCWJ0cmVlLT51LmV4dGVybmFsW25dLmZpbGVfc2Vjbm8gPSBmczsKKwlidHJlZS0+dS5leHRlcm5hbFtuXS5sZW5ndGggPSAxOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlicmVsc2UoYmgpOworCWlmICgoYSA9PSBub2RlICYmIGZub2QpIHx8IG5hID09IC0xKSByZXR1cm4gc2U7CisJYzIgPSAwOworCXdoaWxlICh1cCAhPSAtMSkgeworCQlzdHJ1Y3QgYW5vZGUgKm5ld19hbm9kZTsKKwkJaWYgKGhwZnNfc2IocyktPnNiX2NoaykKKwkJCWlmIChocGZzX3N0b3BfY3ljbGVzKHMsIHVwLCAmYzEsICZjMiwgImhwZnNfYWRkX3NlY3Rvcl90b19idHJlZSAjMiIpKSByZXR1cm4gLTE7CisJCWlmICh1cCAhPSBub2RlIHx8ICFmbm9kKSB7CisJCQlpZiAoIShhbm9kZSA9IGhwZnNfbWFwX2Fub2RlKHMsIHVwLCAmYmgpKSkgcmV0dXJuIC0xOworCQkJYnRyZWUgPSAmYW5vZGUtPmJ0cmVlOworCQl9IGVsc2UgeworCQkJaWYgKCEoZm5vZGUgPSBocGZzX21hcF9mbm9kZShzLCB1cCwgJmJoKSkpIHJldHVybiAtMTsKKwkJCWJ0cmVlID0gJmZub2RlLT5idHJlZTsKKwkJfQorCQlpZiAoYnRyZWUtPm5fZnJlZV9ub2RlcykgeworCQkJYnRyZWUtPm5fZnJlZV9ub2Rlcy0tOyBuID0gYnRyZWUtPm5fdXNlZF9ub2RlcysrOworCQkJYnRyZWUtPmZpcnN0X2ZyZWUgKz0gODsKKwkJCWJ0cmVlLT51LmludGVybmFsW25dLmZpbGVfc2Vjbm8gPSAtMTsKKwkJCWJ0cmVlLT51LmludGVybmFsW25dLmRvd24gPSBuYTsKKwkJCWJ0cmVlLT51LmludGVybmFsW24tMV0uZmlsZV9zZWNubyA9IGZzOworCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJYnJlbHNlKGJoKTsKKwkJCWJyZWxzZShiaDIpOworCQkJaHBmc19mcmVlX3NlY3RvcnMocywgcmEsIDEpOworCQkJaWYgKChhbm9kZSA9IGhwZnNfbWFwX2Fub2RlKHMsIG5hLCAmYmgpKSkgeworCQkJCWFub2RlLT51cCA9IHVwOworCQkJCWFub2RlLT5idHJlZS5mbm9kZV9wYXJlbnQgPSB1cCA9PSBub2RlICYmIGZub2Q7CisJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJCWJyZWxzZShiaCk7CisJCQl9CisJCQlyZXR1cm4gc2U7CisJCX0KKwkJdXAgPSB1cCAhPSBub2RlID8gYW5vZGUtPnVwIDogLTE7CisJCWJ0cmVlLT51LmludGVybmFsW2J0cmVlLT5uX3VzZWRfbm9kZXMgLSAxXS5maWxlX3NlY25vID0gLypmcyovLTE7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJYnJlbHNlKGJoKTsKKwkJYSA9IG5hOworCQlpZiAoKG5ld19hbm9kZSA9IGhwZnNfYWxsb2NfYW5vZGUocywgYSwgJm5hLCAmYmgpKSkgeworCQkJYW5vZGUgPSBuZXdfYW5vZGU7CisJCQkvKmFub2RlLT51cCA9IHVwICE9IC0xID8gdXAgOiByYTsqLworCQkJYW5vZGUtPmJ0cmVlLmludGVybmFsID0gMTsKKwkJCWFub2RlLT5idHJlZS5uX3VzZWRfbm9kZXMgPSAxOworCQkJYW5vZGUtPmJ0cmVlLm5fZnJlZV9ub2RlcyA9IDU5OworCQkJYW5vZGUtPmJ0cmVlLmZpcnN0X2ZyZWUgPSAxNjsKKwkJCWFub2RlLT5idHJlZS51LmludGVybmFsWzBdLmRvd24gPSBhOworCQkJYW5vZGUtPmJ0cmVlLnUuaW50ZXJuYWxbMF0uZmlsZV9zZWNubyA9IC0xOworCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJYnJlbHNlKGJoKTsKKwkJCWlmICgoYW5vZGUgPSBocGZzX21hcF9hbm9kZShzLCBhLCAmYmgpKSkgeworCQkJCWFub2RlLT51cCA9IG5hOworCQkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCQlicmVsc2UoYmgpOworCQkJfQorCQl9IGVsc2UgbmEgPSBhOworCX0KKwlpZiAoKGFub2RlID0gaHBmc19tYXBfYW5vZGUocywgbmEsICZiaCkpKSB7CisJCWFub2RlLT51cCA9IG5vZGU7CisJCWlmIChmbm9kKSBhbm9kZS0+YnRyZWUuZm5vZGVfcGFyZW50ID0gMTsKKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQlicmVsc2UoYmgpOworCX0KKwlpZiAoIWZub2QpIHsKKwkJaWYgKCEoYW5vZGUgPSBocGZzX21hcF9hbm9kZShzLCBub2RlLCAmYmgpKSkgeworCQkJYnJlbHNlKGJoMik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYnRyZWUgPSAmYW5vZGUtPmJ0cmVlOworCX0gZWxzZSB7CisJCWlmICghKGZub2RlID0gaHBmc19tYXBfZm5vZGUocywgbm9kZSwgJmJoKSkpIHsKKwkJCWJyZWxzZShiaDIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWJ0cmVlID0gJmZub2RlLT5idHJlZTsKKwl9CisJcmFub2RlLT51cCA9IG5vZGU7CisJbWVtY3B5KCZyYW5vZGUtPmJ0cmVlLCBidHJlZSwgYnRyZWUtPmZpcnN0X2ZyZWUpOworCWlmIChmbm9kKSByYW5vZGUtPmJ0cmVlLmZub2RlX3BhcmVudCA9IDE7CisJcmFub2RlLT5idHJlZS5uX2ZyZWVfbm9kZXMgPSAocmFub2RlLT5idHJlZS5pbnRlcm5hbCA/IDYwIDogNDApIC0gcmFub2RlLT5idHJlZS5uX3VzZWRfbm9kZXM7CisJaWYgKHJhbm9kZS0+YnRyZWUuaW50ZXJuYWwpIGZvciAobiA9IDA7IG4gPCByYW5vZGUtPmJ0cmVlLm5fdXNlZF9ub2RlczsgbisrKSB7CisJCXN0cnVjdCBhbm9kZSAqdW5vZGU7CisJCWlmICgodW5vZGUgPSBocGZzX21hcF9hbm9kZShzLCByYW5vZGUtPnUuaW50ZXJuYWxbbl0uZG93biwgJmJoMSkpKSB7CisJCQl1bm9kZS0+dXAgPSByYTsKKwkJCXVub2RlLT5idHJlZS5mbm9kZV9wYXJlbnQgPSAwOworCQkJbWFya19idWZmZXJfZGlydHkoYmgxKTsKKwkJCWJyZWxzZShiaDEpOworCQl9CisJfQorCWJ0cmVlLT5pbnRlcm5hbCA9IDE7CisJYnRyZWUtPm5fZnJlZV9ub2RlcyA9IGZub2QgPyAxMCA6IDU4OworCWJ0cmVlLT5uX3VzZWRfbm9kZXMgPSAyOworCWJ0cmVlLT5maXJzdF9mcmVlID0gKGNoYXIgKikmYnRyZWUtPnUuaW50ZXJuYWxbMl0gLSAoY2hhciAqKWJ0cmVlOworCWJ0cmVlLT51LmludGVybmFsWzBdLmZpbGVfc2Vjbm8gPSBmczsKKwlidHJlZS0+dS5pbnRlcm5hbFswXS5kb3duID0gcmE7CisJYnRyZWUtPnUuaW50ZXJuYWxbMV0uZmlsZV9zZWNubyA9IC0xOworCWJ0cmVlLT51LmludGVybmFsWzFdLmRvd24gPSBuYTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJYnJlbHNlKGJoKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaDIpOworCWJyZWxzZShiaDIpOworCXJldHVybiBzZTsKK30KKworLyoKKyAqIFJlbW92ZSBhbGxvY2F0aW9uIHRyZWUuIFJlY3Vyc2lvbiB3b3VsZCBsb29rIG11Y2ggbmljZXIgYnV0CisgKiBJIHdhbnQgdG8gYXZvaWQgaXQgYmVjYXVzZSBpdCBjYW4gY2F1c2Ugc3RhY2sgb3ZlcmZsb3cuCisgKi8KKwordm9pZCBocGZzX3JlbW92ZV9idHJlZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBicGx1c19oZWFkZXIgKmJ0cmVlKQoreworCXN0cnVjdCBicGx1c19oZWFkZXIgKmJ0cmVlMSA9IGJ0cmVlOworCXN0cnVjdCBhbm9kZSAqYW5vZGUgPSBOVUxMOworCWFub2RlX3NlY25vIGFubyA9IDAsIG9hbm87CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgbGV2ZWwgPSAwOworCWludCBwb3MgPSAwOworCWludCBpOworCWludCBjMSwgYzIgPSAwOworCWludCBkMSwgZDI7CisJZ29fZG93bjoKKwlkMiA9IDA7CisJd2hpbGUgKGJ0cmVlMS0+aW50ZXJuYWwpIHsKKwkJYW5vID0gYnRyZWUxLT51LmludGVybmFsW3Bvc10uZG93bjsKKwkJaWYgKGxldmVsKSBicmVsc2UoYmgpOworCQlpZiAoaHBmc19zYihzKS0+c2JfY2hrKQorCQkJaWYgKGhwZnNfc3RvcF9jeWNsZXMocywgYW5vLCAmZDEsICZkMiwgImhwZnNfcmVtb3ZlX2J0cmVlICMxIikpCisJCQkJcmV0dXJuOworCQlpZiAoIShhbm9kZSA9IGhwZnNfbWFwX2Fub2RlKHMsIGFubywgJmJoKSkpIHJldHVybjsKKwkJYnRyZWUxID0gJmFub2RlLT5idHJlZTsKKwkJbGV2ZWwrKzsKKwkJcG9zID0gMDsKKwl9CisJZm9yIChpID0gMDsgaSA8IGJ0cmVlMS0+bl91c2VkX25vZGVzOyBpKyspCisJCWhwZnNfZnJlZV9zZWN0b3JzKHMsIGJ0cmVlMS0+dS5leHRlcm5hbFtpXS5kaXNrX3NlY25vLCBidHJlZTEtPnUuZXh0ZXJuYWxbaV0ubGVuZ3RoKTsKKwlnb191cDoKKwlpZiAoIWxldmVsKSByZXR1cm47CisJYnJlbHNlKGJoKTsKKwlpZiAoaHBmc19zYihzKS0+c2JfY2hrKQorCQlpZiAoaHBmc19zdG9wX2N5Y2xlcyhzLCBhbm8sICZjMSwgJmMyLCAiaHBmc19yZW1vdmVfYnRyZWUgIzIiKSkgcmV0dXJuOworCWhwZnNfZnJlZV9zZWN0b3JzKHMsIGFubywgMSk7CisJb2FubyA9IGFubzsKKwlhbm8gPSBhbm9kZS0+dXA7CisJaWYgKC0tbGV2ZWwpIHsKKwkJaWYgKCEoYW5vZGUgPSBocGZzX21hcF9hbm9kZShzLCBhbm8sICZiaCkpKSByZXR1cm47CisJCWJ0cmVlMSA9ICZhbm9kZS0+YnRyZWU7CisJfSBlbHNlIGJ0cmVlMSA9IGJ0cmVlOworCWZvciAoaSA9IDA7IGkgPCBidHJlZTEtPm5fdXNlZF9ub2RlczsgaSsrKSB7CisJCWlmIChidHJlZTEtPnUuaW50ZXJuYWxbaV0uZG93biA9PSBvYW5vKSB7CisJCQlpZiAoKHBvcyA9IGkgKyAxKSA8IGJ0cmVlMS0+bl91c2VkX25vZGVzKQorCQkJCWdvdG8gZ29fZG93bjsKKwkJCWVsc2UKKwkJCQlnb3RvIGdvX3VwOworCQl9CisJfQorCWhwZnNfZXJyb3IocywKKwkJICAgInJlZmVyZW5jZSB0byBhbm9kZSAlMDh4IG5vdCBmb3VuZCBpbiBhbm9kZSAlMDh4ICIKKwkJICAgIihwcm9iYWJseSBiYWQgdXAgcG9pbnRlcikiLAorCQkgICBvYW5vLCBsZXZlbCA/IGFubyA6IC0xKTsKKwlpZiAobGV2ZWwpCisJCWJyZWxzZShiaCk7Cit9CisKKy8qIEp1c3QgYSB3cmFwcGVyIGFyb3VuZCBocGZzX2JwbHVzX2xvb2t1cCAuLiB1c2VkIGZvciByZWFkaW5nIGVhcyAqLworCitzdGF0aWMgc2Vjbm8gYW5vZGVfbG9va3VwKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgYW5vZGVfc2Vjbm8gYSwgdW5zaWduZWQgc2VjKQoreworCXN0cnVjdCBhbm9kZSAqYW5vZGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpZiAoIShhbm9kZSA9IGhwZnNfbWFwX2Fub2RlKHMsIGEsICZiaCkpKSByZXR1cm4gLTE7CisJcmV0dXJuIGhwZnNfYnBsdXNfbG9va3VwKHMsIE5VTEwsICZhbm9kZS0+YnRyZWUsIHNlYywgYmgpOworfQorCitpbnQgaHBmc19lYV9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gYSwgaW50IGFubywgdW5zaWduZWQgcG9zLAorCSAgICB1bnNpZ25lZCBsZW4sIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWNoYXIgKmRhdGE7CisJc2Vjbm8gc2VjOworCXVuc2lnbmVkIGw7CisJd2hpbGUgKGxlbikgeworCQlpZiAoYW5vKSB7CisJCQlpZiAoKHNlYyA9IGFub2RlX2xvb2t1cChzLCBhLCBwb3MgPj4gOSkpID09IC0xKQorCQkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHNlYyA9IGEgKyAocG9zID4+IDkpOworCQlpZiAoaHBmc19zYihzKS0+c2JfY2hrKSBpZiAoaHBmc19jaGtfc2VjdG9ycyhzLCBzZWMsIDEsICJlYSAjMSIpKSByZXR1cm4gLTE7CisJCWlmICghKGRhdGEgPSBocGZzX21hcF9zZWN0b3Iocywgc2VjLCAmYmgsIChsZW4gLSAxKSA+PiA5KSkpCisJCQlyZXR1cm4gLTE7CisJCWwgPSAweDIwMCAtIChwb3MgJiAweDFmZik7IGlmIChsID4gbGVuKSBsID0gbGVuOworCQltZW1jcHkoYnVmLCBkYXRhICsgKHBvcyAmIDB4MWZmKSwgbCk7CisJCWJyZWxzZShiaCk7CisJCWJ1ZiArPSBsOyBwb3MgKz0gbDsgbGVuIC09IGw7CisJfQorCXJldHVybiAwOworfQorCitpbnQgaHBmc19lYV93cml0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHNlY25vIGEsIGludCBhbm8sIHVuc2lnbmVkIHBvcywKKwkgICAgIHVuc2lnbmVkIGxlbiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJY2hhciAqZGF0YTsKKwlzZWNubyBzZWM7CisJdW5zaWduZWQgbDsKKwl3aGlsZSAobGVuKSB7CisJCWlmIChhbm8pIHsKKwkJCWlmICgoc2VjID0gYW5vZGVfbG9va3VwKHMsIGEsIHBvcyA+PiA5KSkgPT0gLTEpCisJCQkJcmV0dXJuIC0xOworCQl9IGVsc2Ugc2VjID0gYSArIChwb3MgPj4gOSk7CisJCWlmIChocGZzX3NiKHMpLT5zYl9jaGspIGlmIChocGZzX2Noa19zZWN0b3JzKHMsIHNlYywgMSwgImVhICMyIikpIHJldHVybiAtMTsKKwkJaWYgKCEoZGF0YSA9IGhwZnNfbWFwX3NlY3RvcihzLCBzZWMsICZiaCwgKGxlbiAtIDEpID4+IDkpKSkKKwkJCXJldHVybiAtMTsKKwkJbCA9IDB4MjAwIC0gKHBvcyAmIDB4MWZmKTsgaWYgKGwgPiBsZW4pIGwgPSBsZW47CisJCW1lbWNweShkYXRhICsgKHBvcyAmIDB4MWZmKSwgYnVmLCBsKTsKKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQlicmVsc2UoYmgpOworCQlidWYgKz0gbDsgcG9zICs9IGw7IGxlbiAtPSBsOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBocGZzX2VhX3JlbW92ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHNlY25vIGEsIGludCBhbm8sIHVuc2lnbmVkIGxlbikKK3sKKwlzdHJ1Y3QgYW5vZGUgKmFub2RlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaWYgKGFubykgeworCQlpZiAoIShhbm9kZSA9IGhwZnNfbWFwX2Fub2RlKHMsIGEsICZiaCkpKSByZXR1cm47CisJCWhwZnNfcmVtb3ZlX2J0cmVlKHMsICZhbm9kZS0+YnRyZWUpOworCQlicmVsc2UoYmgpOworCQlocGZzX2ZyZWVfc2VjdG9ycyhzLCBhLCAxKTsKKwl9IGVsc2UgaHBmc19mcmVlX3NlY3RvcnMocywgYSwgKGxlbiArIDUxMSkgPj4gOSk7Cit9CisKKy8qIFRydW5jYXRlIGFsbG9jYXRpb24gdHJlZS4gRG9lc24ndCBqb2luIGFub2RlcyAtIEkgaG9wZSBpdCBkb2Vzbid0IG1hdHRlciAqLworCit2b2lkIGhwZnNfdHJ1bmNhdGVfYnRyZWUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzZWNubyBmLCBpbnQgZm5vLCB1bnNpZ25lZCBzZWNzKQoreworCXN0cnVjdCBmbm9kZSAqZm5vZGU7CisJc3RydWN0IGFub2RlICphbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBicGx1c19oZWFkZXIgKmJ0cmVlOworCWFub2RlX3NlY25vIG5vZGUgPSBmOworCWludCBpLCBqLCBub2RlczsKKwlpbnQgYzEsIGMyID0gMDsKKwlpZiAoZm5vKSB7CisJCWlmICghKGZub2RlID0gaHBmc19tYXBfZm5vZGUocywgZiwgJmJoKSkpIHJldHVybjsKKwkJYnRyZWUgPSAmZm5vZGUtPmJ0cmVlOworCX0gZWxzZSB7CisJCWlmICghKGFub2RlID0gaHBmc19tYXBfYW5vZGUocywgZiwgJmJoKSkpIHJldHVybjsKKwkJYnRyZWUgPSAmYW5vZGUtPmJ0cmVlOworCX0KKwlpZiAoIXNlY3MpIHsKKwkJaHBmc19yZW1vdmVfYnRyZWUocywgYnRyZWUpOworCQlpZiAoZm5vKSB7CisJCQlidHJlZS0+bl9mcmVlX25vZGVzID0gODsKKwkJCWJ0cmVlLT5uX3VzZWRfbm9kZXMgPSAwOworCQkJYnRyZWUtPmZpcnN0X2ZyZWUgPSA4OworCQkJYnRyZWUtPmludGVybmFsID0gMDsKKwkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJfSBlbHNlIGhwZnNfZnJlZV9zZWN0b3JzKHMsIGYsIDEpOworCQlicmVsc2UoYmgpOworCQlyZXR1cm47CisJfQorCXdoaWxlIChidHJlZS0+aW50ZXJuYWwpIHsKKwkJbm9kZXMgPSBidHJlZS0+bl91c2VkX25vZGVzICsgYnRyZWUtPm5fZnJlZV9ub2RlczsKKwkJZm9yIChpID0gMDsgaSA8IGJ0cmVlLT5uX3VzZWRfbm9kZXM7IGkrKykKKwkJCWlmIChidHJlZS0+dS5pbnRlcm5hbFtpXS5maWxlX3NlY25vID49IHNlY3MpIGdvdG8gZjsKKwkJYnJlbHNlKGJoKTsKKwkJaHBmc19lcnJvcihzLCAiaW50ZXJuYWwgYnRyZWUgJTA4eCBkb2Vzbid0IGVuZCB3aXRoIC0xIiwgbm9kZSk7CisJCXJldHVybjsKKwkJZjoKKwkJZm9yIChqID0gaSArIDE7IGogPCBidHJlZS0+bl91c2VkX25vZGVzOyBqKyspCisJCQlocGZzX2VhX3JlbW92ZShzLCBidHJlZS0+dS5pbnRlcm5hbFtqXS5kb3duLCAxLCAwKTsKKwkJYnRyZWUtPm5fdXNlZF9ub2RlcyA9IGkgKyAxOworCQlidHJlZS0+bl9mcmVlX25vZGVzID0gbm9kZXMgLSBidHJlZS0+bl91c2VkX25vZGVzOworCQlidHJlZS0+Zmlyc3RfZnJlZSA9IDggKyA4ICogYnRyZWUtPm5fdXNlZF9ub2RlczsKKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQlpZiAoYnRyZWUtPnUuaW50ZXJuYWxbaV0uZmlsZV9zZWNubyA9PSBzZWNzKSB7CisJCQlicmVsc2UoYmgpOworCQkJcmV0dXJuOworCQl9CisJCW5vZGUgPSBidHJlZS0+dS5pbnRlcm5hbFtpXS5kb3duOworCQlicmVsc2UoYmgpOworCQlpZiAoaHBmc19zYihzKS0+c2JfY2hrKQorCQkJaWYgKGhwZnNfc3RvcF9jeWNsZXMocywgbm9kZSwgJmMxLCAmYzIsICJocGZzX3RydW5jYXRlX2J0cmVlIikpCisJCQkJcmV0dXJuOworCQlpZiAoIShhbm9kZSA9IGhwZnNfbWFwX2Fub2RlKHMsIG5vZGUsICZiaCkpKSByZXR1cm47CisJCWJ0cmVlID0gJmFub2RlLT5idHJlZTsKKwl9CQorCW5vZGVzID0gYnRyZWUtPm5fdXNlZF9ub2RlcyArIGJ0cmVlLT5uX2ZyZWVfbm9kZXM7CisJZm9yIChpID0gMDsgaSA8IGJ0cmVlLT5uX3VzZWRfbm9kZXM7IGkrKykKKwkJaWYgKGJ0cmVlLT51LmV4dGVybmFsW2ldLmZpbGVfc2Vjbm8gKyBidHJlZS0+dS5leHRlcm5hbFtpXS5sZW5ndGggPj0gc2VjcykgZ290byBmZjsKKwlicmVsc2UoYmgpOworCXJldHVybjsKKwlmZjoKKwlpZiAoc2VjcyA8PSBidHJlZS0+dS5leHRlcm5hbFtpXS5maWxlX3NlY25vKSB7CisJCWhwZnNfZXJyb3IocywgInRoZXJlIGlzIGFuIGFsbG9jYXRpb24gZXJyb3IgaW4gZmlsZSAlMDh4LCBzZWN0b3IgJTA4eCIsIGYsIHNlY3MpOworCQlpZiAoaSkgaS0tOworCX0KKwllbHNlIGlmIChidHJlZS0+dS5leHRlcm5hbFtpXS5maWxlX3NlY25vICsgYnRyZWUtPnUuZXh0ZXJuYWxbaV0ubGVuZ3RoID4gc2VjcykgeworCQlocGZzX2ZyZWVfc2VjdG9ycyhzLCBidHJlZS0+dS5leHRlcm5hbFtpXS5kaXNrX3NlY25vICsgc2VjcyAtCisJCQlidHJlZS0+dS5leHRlcm5hbFtpXS5maWxlX3NlY25vLCBidHJlZS0+dS5leHRlcm5hbFtpXS5sZW5ndGgKKwkJCS0gc2VjcyArIGJ0cmVlLT51LmV4dGVybmFsW2ldLmZpbGVfc2Vjbm8pOyAvKiBJIGhvcGUgZ2NjIG9wdGltaXplcyB0aGlzIDotKSAqLworCQlidHJlZS0+dS5leHRlcm5hbFtpXS5sZW5ndGggPSBzZWNzIC0gYnRyZWUtPnUuZXh0ZXJuYWxbaV0uZmlsZV9zZWNubzsKKwl9CisJZm9yIChqID0gaSArIDE7IGogPCBidHJlZS0+bl91c2VkX25vZGVzOyBqKyspCisJCWhwZnNfZnJlZV9zZWN0b3JzKHMsIGJ0cmVlLT51LmV4dGVybmFsW2pdLmRpc2tfc2Vjbm8sIGJ0cmVlLT51LmV4dGVybmFsW2pdLmxlbmd0aCk7CisJYnRyZWUtPm5fdXNlZF9ub2RlcyA9IGkgKyAxOworCWJ0cmVlLT5uX2ZyZWVfbm9kZXMgPSBub2RlcyAtIGJ0cmVlLT5uX3VzZWRfbm9kZXM7CisJYnRyZWUtPmZpcnN0X2ZyZWUgPSA4ICsgMTIgKiBidHJlZS0+bl91c2VkX25vZGVzOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlicmVsc2UoYmgpOworfQorCisvKiBSZW1vdmUgZmlsZSBvciBkaXJlY3RvcnkgYW5kIGl0J3MgZWFzIC0gbm90ZSB0aGF0IGRpcmVjdG9yeSBtdXN0CisgICBiZSBlbXB0eSB3aGVuIHRoaXMgaXMgY2FsbGVkLiAqLworCit2b2lkIGhwZnNfcmVtb3ZlX2Zub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgZm5vZGVfc2Vjbm8gZm5vKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGZub2RlICpmbm9kZTsKKwlzdHJ1Y3QgZXh0ZW5kZWRfYXR0cmlidXRlICplYTsKKwlzdHJ1Y3QgZXh0ZW5kZWRfYXR0cmlidXRlICplYV9lbmQ7CisJaWYgKCEoZm5vZGUgPSBocGZzX21hcF9mbm9kZShzLCBmbm8sICZiaCkpKSByZXR1cm47CisJaWYgKCFmbm9kZS0+ZGlyZmxhZykgaHBmc19yZW1vdmVfYnRyZWUocywgJmZub2RlLT5idHJlZSk7CisJZWxzZSBocGZzX3JlbW92ZV9kdHJlZShzLCBmbm9kZS0+dS5leHRlcm5hbFswXS5kaXNrX3NlY25vKTsKKwllYV9lbmQgPSBmbm9kZV9lbmRfZWEoZm5vZGUpOworCWZvciAoZWEgPSBmbm9kZV9lYShmbm9kZSk7IGVhIDwgZWFfZW5kOyBlYSA9IG5leHRfZWEoZWEpKQorCQlpZiAoZWEtPmluZGlyZWN0KQorCQkJaHBmc19lYV9yZW1vdmUocywgZWFfc2VjKGVhKSwgZWEtPmFub2RlLCBlYV9sZW4oZWEpKTsKKwlocGZzX2VhX2V4dF9yZW1vdmUocywgZm5vZGUtPmVhX3NlY25vLCBmbm9kZS0+ZWFfYW5vZGUsIGZub2RlLT5lYV9zaXplX2wpOworCWJyZWxzZShiaCk7CisJaHBmc19mcmVlX3NlY3RvcnMocywgZm5vLCAxKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2hwZnMvYnVmZmVyLmMgYi9mcy9ocGZzL2J1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MDdhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ocGZzL2J1ZmZlci5jCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogIGxpbnV4L2ZzL2hwZnMvYnVmZmVyLmMKKyAqCisgKiAgTWlrdWxhcyBQYXRvY2thIChtaWt1bGFzQGFydGF4Lmthcmxpbi5tZmYuY3VuaS5jeiksIDE5OTgtMTk5OQorICoKKyAqICBnZW5lcmFsIGJ1ZmZlciBpL28KKyAqLworCisjaW5jbHVkZSAiaHBmc19mbi5oIgorCit2b2lkIGhwZnNfbG9ja19jcmVhdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisjaWZkZWYgREVCVUdfTE9DS1MKKwlwcmludGsoImxvY2sgY3JlYXRpb25cbiIpOworI2VuZGlmCisJZG93bigmaHBmc19zYihzKS0+aHBmc19jcmVhdGlvbl9kZSk7Cit9CisKK3ZvaWQgaHBmc191bmxvY2tfY3JlYXRpb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworI2lmZGVmIERFQlVHX0xPQ0tTCisJcHJpbnRrKCJ1bmxvY2sgY3JlYXRpb25cbiIpOworI2VuZGlmCisJdXAoJmhwZnNfc2IocyktPmhwZnNfY3JlYXRpb25fZGUpOworfQorCisvKiBNYXAgYSBzZWN0b3IgaW50byBhIGJ1ZmZlciBhbmQgcmV0dXJuIHBvaW50ZXJzIHRvIGl0IGFuZCB0byB0aGUgYnVmZmVyLiAqLworCit2b2lkICpocGZzX21hcF9zZWN0b3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBzZWNubywgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhwLAorCQkgaW50IGFoZWFkKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwljb25kX3Jlc2NoZWQoKTsKKworCSpiaHAgPSBiaCA9IHNiX2JyZWFkKHMsIHNlY25vKTsKKwlpZiAoYmggIT0gTlVMTCkKKwkJcmV0dXJuIGJoLT5iX2RhdGE7CisJZWxzZSB7CisJCXByaW50aygiSFBGUzogaHBmc19tYXBfc2VjdG9yOiByZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCisvKiBMaWtlIGhwZnNfbWFwX3NlY3RvciBidXQgZG9uJ3QgcmVhZCBhbnl0aGluZyAqLworCit2b2lkICpocGZzX2dldF9zZWN0b3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBzZWNubywgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhwKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJLypyZXR1cm4gaHBmc19tYXBfc2VjdG9yKHMsIHNlY25vLCBiaHAsIDApOyovCisKKwljb25kX3Jlc2NoZWQoKTsKKworCWlmICgoKmJocCA9IGJoID0gc2JfZ2V0YmxrKHMsIHNlY25vKSkgIT0gTlVMTCkgeworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHdhaXRfb25fYnVmZmVyKGJoKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCXJldHVybiBiaC0+Yl9kYXRhOworCX0gZWxzZSB7CisJCXByaW50aygiSFBGUzogaHBmc19nZXRfc2VjdG9yOiBnZXRibGsgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCisvKiBNYXAgNCBzZWN0b3JzIGludG8gYSA0YnVmZmVyIGFuZCByZXR1cm4gcG9pbnRlcnMgdG8gaXQgYW5kIHRvIHRoZSBidWZmZXIuICovCisKK3ZvaWQgKmhwZnNfbWFwXzRzZWN0b3JzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdW5zaWduZWQgc2Vjbm8sIHN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkICpxYmgsCisJCSAgIGludCBhaGVhZCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWNoYXIgKmRhdGE7CisKKwljb25kX3Jlc2NoZWQoKTsKKworCWlmIChzZWNubyAmIDMpIHsKKwkJcHJpbnRrKCJIUEZTOiBocGZzX21hcF80c2VjdG9yczogdW5hbGlnbmVkIHJlYWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlxYmgtPmRhdGEgPSBkYXRhID0gKGNoYXIgKilrbWFsbG9jKDIwNDgsIEdGUF9OT0ZTKTsKKwlpZiAoIWRhdGEpIHsKKwkJcHJpbnRrKCJIUEZTOiBocGZzX21hcF80c2VjdG9yczogb3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlxYmgtPmJoWzBdID0gYmggPSBzYl9icmVhZChzLCBzZWNubyk7CisJaWYgKCFiaCkKKwkJZ290byBiYWlsMDsKKwltZW1jcHkoZGF0YSwgYmgtPmJfZGF0YSwgNTEyKTsKKworCXFiaC0+YmhbMV0gPSBiaCA9IHNiX2JyZWFkKHMsIHNlY25vICsgMSk7CisJaWYgKCFiaCkKKwkJZ290byBiYWlsMTsKKwltZW1jcHkoZGF0YSArIDUxMiwgYmgtPmJfZGF0YSwgNTEyKTsKKworCXFiaC0+YmhbMl0gPSBiaCA9IHNiX2JyZWFkKHMsIHNlY25vICsgMik7CisJaWYgKCFiaCkKKwkJZ290byBiYWlsMjsKKwltZW1jcHkoZGF0YSArIDIgKiA1MTIsIGJoLT5iX2RhdGEsIDUxMik7CisKKwlxYmgtPmJoWzNdID0gYmggPSBzYl9icmVhZChzLCBzZWNubyArIDMpOworCWlmICghYmgpCisJCWdvdG8gYmFpbDM7CisJbWVtY3B5KGRhdGEgKyAzICogNTEyLCBiaC0+Yl9kYXRhLCA1MTIpOworCisJcmV0dXJuIGRhdGE7CisKKyBiYWlsMzoKKwlicmVsc2UocWJoLT5iaFsyXSk7CisgYmFpbDI6CisJYnJlbHNlKHFiaC0+YmhbMV0pOworIGJhaWwxOgorCWJyZWxzZShxYmgtPmJoWzBdKTsKKyBiYWlsMDoKKwlrZnJlZShkYXRhKTsKKwlwcmludGsoIkhQRlM6IGhwZnNfbWFwXzRzZWN0b3JzOiByZWFkIGVycm9yXG4iKTsKKyBiYWlsOgorCXJldHVybiBOVUxMOworfQorCisvKiBEb24ndCByZWFkIHNlY3RvcnMgKi8KKwordm9pZCAqaHBmc19nZXRfNHNlY3RvcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBzZWNubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKnFiaCkKK3sKKwljb25kX3Jlc2NoZWQoKTsKKworCWlmIChzZWNubyAmIDMpIHsKKwkJcHJpbnRrKCJIUEZTOiBocGZzX2dldF80c2VjdG9yczogdW5hbGlnbmVkIHJlYWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKnJldHVybiBocGZzX21hcF80c2VjdG9ycyhzLCBzZWNubywgcWJoLCAwKTsqLworCWlmICghKHFiaC0+ZGF0YSA9IGttYWxsb2MoMjA0OCwgR0ZQX05PRlMpKSkgeworCQlwcmludGsoIkhQRlM6IGhwZnNfZ2V0XzRzZWN0b3JzOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICghKGhwZnNfZ2V0X3NlY3RvcihzLCBzZWNubywgJnFiaC0+YmhbMF0pKSkgZ290byBiYWlsMDsKKwlpZiAoIShocGZzX2dldF9zZWN0b3Iocywgc2Vjbm8gKyAxLCAmcWJoLT5iaFsxXSkpKSBnb3RvIGJhaWwxOworCWlmICghKGhwZnNfZ2V0X3NlY3RvcihzLCBzZWNubyArIDIsICZxYmgtPmJoWzJdKSkpIGdvdG8gYmFpbDI7CisJaWYgKCEoaHBmc19nZXRfc2VjdG9yKHMsIHNlY25vICsgMywgJnFiaC0+YmhbM10pKSkgZ290byBiYWlsMzsKKwltZW1jcHkocWJoLT5kYXRhLCBxYmgtPmJoWzBdLT5iX2RhdGEsIDUxMik7CisJbWVtY3B5KHFiaC0+ZGF0YSArIDUxMiwgcWJoLT5iaFsxXS0+Yl9kYXRhLCA1MTIpOworCW1lbWNweShxYmgtPmRhdGEgKyAyKjUxMiwgcWJoLT5iaFsyXS0+Yl9kYXRhLCA1MTIpOworCW1lbWNweShxYmgtPmRhdGEgKyAzKjUxMiwgcWJoLT5iaFszXS0+Yl9kYXRhLCA1MTIpOworCXJldHVybiBxYmgtPmRhdGE7CisKKwliYWlsMzoJYnJlbHNlKHFiaC0+YmhbMl0pOworCWJhaWwyOglicmVsc2UocWJoLT5iaFsxXSk7CisJYmFpbDE6CWJyZWxzZShxYmgtPmJoWzBdKTsKKwliYWlsMDoKKwlyZXR1cm4gTlVMTDsKK30KKwkKKwordm9pZCBocGZzX2JyZWxzZTQoc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKnFiaCkKK3sKKwlicmVsc2UocWJoLT5iaFszXSk7CisJYnJlbHNlKHFiaC0+YmhbMl0pOworCWJyZWxzZShxYmgtPmJoWzFdKTsKKwlicmVsc2UocWJoLT5iaFswXSk7CisJa2ZyZWUocWJoLT5kYXRhKTsKK30JCisKK3ZvaWQgaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KHN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkICpxYmgpCit7CisJUFJJTlRLKCgiaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5XG4iKSk7CisJbWVtY3B5KHFiaC0+YmhbMF0tPmJfZGF0YSwgcWJoLT5kYXRhLCA1MTIpOworCW1lbWNweShxYmgtPmJoWzFdLT5iX2RhdGEsIHFiaC0+ZGF0YSArIDUxMiwgNTEyKTsKKwltZW1jcHkocWJoLT5iaFsyXS0+Yl9kYXRhLCBxYmgtPmRhdGEgKyAyICogNTEyLCA1MTIpOworCW1lbWNweShxYmgtPmJoWzNdLT5iX2RhdGEsIHFiaC0+ZGF0YSArIDMgKiA1MTIsIDUxMik7CisJbWFya19idWZmZXJfZGlydHkocWJoLT5iaFswXSk7CisJbWFya19idWZmZXJfZGlydHkocWJoLT5iaFsxXSk7CisJbWFya19idWZmZXJfZGlydHkocWJoLT5iaFsyXSk7CisJbWFya19idWZmZXJfZGlydHkocWJoLT5iaFszXSk7Cit9CmRpZmYgLS1naXQgYS9mcy9ocGZzL2RlbnRyeS5jIGIvZnMvaHBmcy9kZW50cnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODMxOTEyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaHBmcy9kZW50cnkuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogIGxpbnV4L2ZzL2hwZnMvZGVudHJ5LmMKKyAqCisgKiAgTWlrdWxhcyBQYXRvY2thIChtaWt1bGFzQGFydGF4Lmthcmxpbi5tZmYuY3VuaS5jeiksIDE5OTgtMTk5OQorICoKKyAqICBkY2FjaGUgb3BlcmF0aW9ucworICovCisKKyNpbmNsdWRlICJocGZzX2ZuLmgiCisKKy8qCisgKiBOb3RlOiB0aGUgZGVudHJ5IGFyZ3VtZW50IGlzIHRoZSBwYXJlbnQgZGVudHJ5LgorICovCisKK3N0YXRpYyBpbnQgaHBmc19oYXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxc3RyKQoreworCXVuc2lnbmVkIGxvbmcJIGhhc2g7CisJaW50CQkgaTsKKwl1bnNpZ25lZCBsID0gcXN0ci0+bGVuOworCisJaWYgKGwgPT0gMSkgaWYgKHFzdHItPm5hbWVbMF09PScuJykgZ290byB4OworCWlmIChsID09IDIpIGlmIChxc3RyLT5uYW1lWzBdPT0nLicgfHwgcXN0ci0+bmFtZVsxXT09Jy4nKSBnb3RvIHg7CisJaHBmc19hZGp1c3RfbGVuZ3RoKChjaGFyICopcXN0ci0+bmFtZSwgJmwpOworCS8qaWYgKGhwZnNfY2hrX25hbWUoKGNoYXIgKilxc3RyLT5uYW1lLCZsKSkqLworCQkvKnJldHVybiAtRU5BTUVUT09MT05HOyovCisJCS8qcmV0dXJuIC1FTk9FTlQ7Ki8KKwl4OgorCisJaGFzaCA9IGluaXRfbmFtZV9oYXNoKCk7CisJZm9yIChpID0gMDsgaSA8IGw7IGkrKykKKwkJaGFzaCA9IHBhcnRpYWxfbmFtZV9oYXNoKGhwZnNfdXBjYXNlKGhwZnNfc2IoZGVudHJ5LT5kX3NiKS0+c2JfY3BfdGFibGUscXN0ci0+bmFtZVtpXSksIGhhc2gpOworCXFzdHItPmhhc2ggPSBlbmRfbmFtZV9oYXNoKGhhc2gpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHBmc19jb21wYXJlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICphLCBzdHJ1Y3QgcXN0ciAqYikKK3sKKwl1bnNpZ25lZCBhbD1hLT5sZW47CisJdW5zaWduZWQgYmw9Yi0+bGVuOworCWhwZnNfYWRqdXN0X2xlbmd0aCgoY2hhciAqKWEtPm5hbWUsICZhbCk7CisJLypocGZzX2FkanVzdF9sZW5ndGgoKGNoYXIgKiliLT5uYW1lLCAmYmwpOyovCisJLyogJ2EnIGlzIHRoZSBxc3RyIG9mIGFuIGFscmVhZHkgZXhpc3RpbmcgZGVudHJ5LCBzbyB0aGUgbmFtZQorCSAqIG11c3QgYmUgdmFsaWQuICdiJyBtdXN0IGJlIHZhbGlkYXRlZCBmaXJzdC4KKwkgKi8KKworCWlmIChocGZzX2Noa19uYW1lKChjaGFyICopYi0+bmFtZSwgJmJsKSkgcmV0dXJuIDE7CisJaWYgKGhwZnNfY29tcGFyZV9uYW1lcyhkZW50cnktPmRfc2IsIChjaGFyICopYS0+bmFtZSwgYWwsIChjaGFyICopYi0+bmFtZSwgYmwsIDApKSByZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBocGZzX2RlbnRyeV9vcGVyYXRpb25zID0geworCS5kX2hhc2gJCT0gaHBmc19oYXNoX2RlbnRyeSwKKwkuZF9jb21wYXJlCT0gaHBmc19jb21wYXJlX2RlbnRyeSwKK307CisKK3ZvaWQgaHBmc19zZXRfZGVudHJ5X29wZXJhdGlvbnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWRlbnRyeS0+ZF9vcCA9ICZocGZzX2RlbnRyeV9vcGVyYXRpb25zOworfQpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9kaXIuYyBiL2ZzL2hwZnMvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIxN2MzYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hwZnMvZGlyLmMKQEAgLTAsMCArMSwzMjAgQEAKKy8qCisgKiAgbGludXgvZnMvaHBmcy9kaXIuYworICoKKyAqICBNaWt1bGFzIFBhdG9ja2EgKG1pa3VsYXNAYXJ0YXgua2FybGluLm1mZi5jdW5pLmN6KSwgMTk5OC0xOTk5CisgKgorICogIGRpcmVjdG9yeSBWRlMgZnVuY3Rpb25zCisgKi8KKworI2luY2x1ZGUgImhwZnNfZm4uaCIKKworc3RhdGljIGludCBocGZzX2Rpcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWxvY2tfa2VybmVsKCk7CisJaHBmc19kZWxfcG9zKGlub2RlLCAmZmlscC0+Zl9wb3MpOworCS8qaHBmc193cml0ZV9pZl9jaGFuZ2VkKGlub2RlKTsqLworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBpcyBzbG93LCBidXQgaXQncyBub3QgdXNlZCBvZnRlbiAqLworCitzdGF0aWMgbG9mZl90IGhwZnNfZGlyX2xzZWVrKHN0cnVjdCBmaWxlICpmaWxwLCBsb2ZmX3Qgb2ZmLCBpbnQgd2hlbmNlKQoreworCWxvZmZfdCBuZXdfb2ZmID0gb2ZmICsgKHdoZW5jZSA9PSAxID8gZmlscC0+Zl9wb3MgOiAwKTsKKwlsb2ZmX3QgcG9zOworCXN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkIHFiaDsKKwlzdHJ1Y3QgaW5vZGUgKmkgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaHBmc19pbm9kZV9pbmZvICpocGZzX2lub2RlID0gaHBmc19pKGkpOworCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IGktPmlfc2I7CisKKwlsb2NrX2tlcm5lbCgpOworCisJLypwcmludGsoImRpciBsc2Vla1xuIik7Ki8KKwlpZiAobmV3X29mZiA9PSAwIHx8IG5ld19vZmYgPT0gMSB8fCBuZXdfb2ZmID09IDExIHx8IG5ld19vZmYgPT0gMTIgfHwgbmV3X29mZiA9PSAxMykgZ290byBvazsKKwlkb3duKCZpLT5pX3NlbSk7CisJcG9zID0gKChsb2ZmX3QpIGhwZnNfZGVfYXNfZG93bl9hc19wb3NzaWJsZShzLCBocGZzX2lub2RlLT5pX2RubykgPDwgNCkgKyAxOworCXdoaWxlIChwb3MgIT0gbmV3X29mZikgeworCQlpZiAobWFwX3Bvc19kaXJlbnQoaSwgJnBvcywgJnFiaCkpIGhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJZWxzZSBnb3RvIGZhaWw7CisJCWlmIChwb3MgPT0gMTIpIGdvdG8gZmFpbDsKKwl9CisJdXAoJmktPmlfc2VtKTsKK29rOgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZmlscC0+Zl9wb3MgPSBuZXdfb2ZmOworZmFpbDoKKwl1cCgmaS0+aV9zZW0pOworCS8qcHJpbnRrKCJpbGxlZ2FsIGxzZWVrOiAlMDE2bGx4XG4iLCBuZXdfb2ZmKTsqLworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gLUVTUElQRTsKK30KKworc3RhdGljIGludCBocGZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBocGZzX2lub2RlX2luZm8gKmhwZnNfaW5vZGUgPSBocGZzX2koaW5vZGUpOworCXN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkIHFiaDsKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlOworCWludCBsYzsKKwlsb25nIG9sZF9wb3M7CisJY2hhciAqdGVtcG5hbWU7CisJaW50IGMxLCBjMiA9IDA7CisJaW50IHJldCA9IDA7CisKKwlsb2NrX2tlcm5lbCgpOworCisJaWYgKGhwZnNfc2IoaW5vZGUtPmlfc2IpLT5zYl9jaGspIHsKKwkJaWYgKGhwZnNfY2hrX3NlY3RvcnMoaW5vZGUtPmlfc2IsIGlub2RlLT5pX2lubywgMSwgImRpcl9mbm9kZSIpKSB7CisJCQlyZXQgPSAtRUZTRVJST1I7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoaHBmc19jaGtfc2VjdG9ycyhpbm9kZS0+aV9zYiwgaHBmc19pbm9kZS0+aV9kbm8sIDQsICJkaXJfZG5vZGUiKSkgeworCQkJcmV0ID0gLUVGU0VSUk9SOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJaWYgKGhwZnNfc2IoaW5vZGUtPmlfc2IpLT5zYl9jaGsgPj0gMikgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQlzdHJ1Y3QgZm5vZGUgKmZubzsKKwkJaW50IGUgPSAwOworCQlpZiAoIShmbm8gPSBocGZzX21hcF9mbm9kZShpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAmYmgpKSkgeworCQkJcmV0ID0gLUVJT0VSUk9SOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKCFmbm8tPmRpcmZsYWcpIHsKKwkJCWUgPSAxOworCQkJaHBmc19lcnJvcihpbm9kZS0+aV9zYiwgIm5vdCBhIGRpcmVjdG9yeSwgZm5vZGUgJTA4eCIsaW5vZGUtPmlfaW5vKTsKKwkJfQorCQlpZiAoaHBmc19pbm9kZS0+aV9kbm8gIT0gZm5vLT51LmV4dGVybmFsWzBdLmRpc2tfc2Vjbm8pIHsKKwkJCWUgPSAxOworCQkJaHBmc19lcnJvcihpbm9kZS0+aV9zYiwgImNvcnJ1cHRlZCBpbm9kZTogaV9kbm8gPT0gJTA4eCwgZm5vZGUgLT4gZG5vZGUgPT0gJTA4eCIsIGhwZnNfaW5vZGUtPmlfZG5vLCBmbm8tPnUuZXh0ZXJuYWxbMF0uZGlza19zZWNubyk7CisJCX0KKwkJYnJlbHNlKGJoKTsKKwkJaWYgKGUpIHsKKwkJCXJldCA9IC1FRlNFUlJPUjsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWxjID0gaHBmc19zYihpbm9kZS0+aV9zYiktPnNiX2xvd2VyY2FzZTsKKwlpZiAoZmlscC0+Zl9wb3MgPT0gMTIpIHsgLyogZGlmZiAtciByZXF1aXJlcyB0aGlzIChub3RlLCB0aGF0IGRpZmYgLXIgKi8KKwkJZmlscC0+Zl9wb3MgPSAxMzsgLyogYWxzbyBmYWlscyBvbiBtc2RvcyBmaWxlc3lzdGVtIGluIDIuMCkgKi8KKwkJZ290byBvdXQ7CisJfQorCWlmIChmaWxwLT5mX3BvcyA9PSAxMykgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dDsKKwl9CisJCisJd2hpbGUgKDEpIHsKKwkJYWdhaW46CisJCS8qIFRoaXMgd29uJ3Qgd29yayB3aGVuIGN5Y2xlIGlzIGxvbmdlciB0aGFuIG51bWJlciBvZiBkaXJlbnRzCisJCSAgIGFjY2VwdGVkIGJ5IGZpbGxkaXIsIGJ1dCB3aGF0IGNhbiBJIGRvPworCQkgICBtYXliZSBraWxsYWxsIC05IGxzIGhlbHBzICovCisJCWlmIChocGZzX3NiKGlub2RlLT5pX3NiKS0+c2JfY2hrKQorCQkJaWYgKGhwZnNfc3RvcF9jeWNsZXMoaW5vZGUtPmlfc2IsIGZpbHAtPmZfcG9zLCAmYzEsICZjMiwgImhwZnNfcmVhZGRpciIpKSB7CisJCQkJcmV0ID0gLUVGU0VSUk9SOworCQkJCWdvdG8gb3V0OworCQkJfQorCQlpZiAoZmlscC0+Zl9wb3MgPT0gMTIpCisJCQlnb3RvIG91dDsKKwkJaWYgKGZpbHAtPmZfcG9zID09IDMgfHwgZmlscC0+Zl9wb3MgPT0gNCB8fCBmaWxwLT5mX3BvcyA9PSA1KSB7CisJCQlwcmludGsoIkhQRlM6IHdhcm5pbmc6IHBvcz09JWRcbiIsKGludClmaWxwLT5mX3Bvcyk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoZmlscC0+Zl9wb3MgPT0gMCkgeworCQkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIGZpbHAtPmZfcG9zLCBpbm9kZS0+aV9pbm8sIERUX0RJUikgPCAwKQorCQkJCWdvdG8gb3V0OworCQkJZmlscC0+Zl9wb3MgPSAxMTsKKwkJfQorCQlpZiAoZmlscC0+Zl9wb3MgPT0gMTEpIHsKKwkJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgZmlscC0+Zl9wb3MsIGhwZnNfaW5vZGUtPmlfcGFyZW50X2RpciwgRFRfRElSKSA8IDApCisJCQkJZ290byBvdXQ7CisJCQlmaWxwLT5mX3BvcyA9IDE7CisJCX0KKwkJaWYgKGZpbHAtPmZfcG9zID09IDEpIHsKKwkJCWZpbHAtPmZfcG9zID0gKChsb2ZmX3QpIGhwZnNfZGVfYXNfZG93bl9hc19wb3NzaWJsZShpbm9kZS0+aV9zYiwgaHBmc19pbm9kZS0+aV9kbm8pIDw8IDQpICsgMTsKKwkJCWhwZnNfYWRkX3Bvcyhpbm9kZSwgJmZpbHAtPmZfcG9zKTsKKwkJCWZpbHAtPmZfdmVyc2lvbiA9IGlub2RlLT5pX3ZlcnNpb247CisJCX0KKwkJb2xkX3BvcyA9IGZpbHAtPmZfcG9zOworCQlpZiAoIShkZSA9IG1hcF9wb3NfZGlyZW50KGlub2RlLCAmZmlscC0+Zl9wb3MsICZxYmgpKSkgeworCQkJcmV0ID0gLUVJT0VSUk9SOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGRlLT5maXJzdCB8fCBkZS0+bGFzdCkgeworCQkJaWYgKGhwZnNfc2IoaW5vZGUtPmlfc2IpLT5zYl9jaGspIHsKKwkJCQlpZiAoZGUtPmZpcnN0ICYmICFkZS0+bGFzdCAmJiAoZGUtPm5hbWVsZW4gIT0gMiB8fCBkZSAtPm5hbWVbMF0gIT0gMSB8fCBkZS0+bmFtZVsxXSAhPSAxKSkgaHBmc19lcnJvcihpbm9kZS0+aV9zYiwgImhwZnNfcmVhZGRpcjogYmFkIF5BXkEgZW50cnk7IHBvcyA9ICUwOHgiLCBvbGRfcG9zKTsKKwkJCQlpZiAoZGUtPmxhc3QgJiYgKGRlLT5uYW1lbGVuICE9IDEgfHwgZGUgLT5uYW1lWzBdICE9IDI1NSkpIGhwZnNfZXJyb3IoaW5vZGUtPmlfc2IsICJocGZzX3JlYWRkaXI6IGJhZCBcXDM3NyBlbnRyeTsgcG9zID0gJTA4eCIsIG9sZF9wb3MpOworCQkJfQorCQkJaHBmc19icmVsc2U0KCZxYmgpOworCQkJZ290byBhZ2FpbjsKKwkJfQorCQl0ZW1wbmFtZSA9IGhwZnNfdHJhbnNsYXRlX25hbWUoaW5vZGUtPmlfc2IsIGRlLT5uYW1lLCBkZS0+bmFtZWxlbiwgbGMsIGRlLT5ub3RfOHgzKTsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCB0ZW1wbmFtZSwgZGUtPm5hbWVsZW4sIG9sZF9wb3MsIGRlLT5mbm9kZSwgRFRfVU5LTk9XTikgPCAwKSB7CisJCQlmaWxwLT5mX3BvcyA9IG9sZF9wb3M7CisJCQlpZiAodGVtcG5hbWUgIT0gKGNoYXIgKilkZS0+bmFtZSkga2ZyZWUodGVtcG5hbWUpOworCQkJaHBmc19icmVsc2U0KCZxYmgpOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKHRlbXBuYW1lICE9IChjaGFyICopZGUtPm5hbWUpIGtmcmVlKHRlbXBuYW1lKTsKKwkJaHBmc19icmVsc2U0KCZxYmgpOworCX0KK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGxvb2t1cC4gIFNlYXJjaCB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmllZCBuYW1lLCBzZXQKKyAqICpyZXN1bHQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgaW5vZGUuCisgKgorICogbG9va3VwIHVzZXMgdGhlIGlub2RlIG51bWJlciB0byB0ZWxsIHJlYWRfaW5vZGUgd2hldGhlciBpdCBpcyByZWFkaW5nCisgKiB0aGUgaW5vZGUgb2YgYSBkaXJlY3Rvcnkgb3IgYSBmaWxlIC0tIGZpbGUgaW5vJ3MgYXJlIG9kZCwgZGlyZWN0b3J5CisgKiBpbm8ncyBhcmUgZXZlbi4gIHJlYWRfaW5vZGUgYXZvaWRzIGkvbyBmb3IgZmlsZSBpbm9kZXM7IGV2ZXJ5dGhpbmcKKyAqIG5lZWRlZCBpcyB1cCBoZXJlIGluIHRoZSBkaXJlY3RvcnkuICAoQW5kIGZpbGUgZm5vZGVzIGFyZSBvdXQgaW4KKyAqIHRoZSBib29uZG9ja3MuKQorICoKKyAqICAgIC0gTS5QLjogdGhpcyBpcyBvdmVyLCBzb21ldGltZXMgd2UndmUgZ290IHRvIHJlYWQgZmlsZSdzIGZub2RlIGZvciBlYXMKKyAqCSAgICAgIGlub2RlIG51bWJlcnMgYXJlIGp1c3QgZm5vZGUgc2VjdG9yIG51bWJlcnM7IGlnZXQgbG9jayBpcyB1c2VkCisgKgkgICAgICB0byB0ZWxsIHJlYWRfaW5vZGUgdG8gcmVhZCBmbm9kZSBvciBub3QuCisgKi8KKworc3RydWN0IGRlbnRyeSAqaHBmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJdW5zaWduZWQgbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkIHFiaDsKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlOworCWlub190IGlubzsKKwlpbnQgZXJyOworCXN0cnVjdCBpbm9kZSAqcmVzdWx0ID0gTlVMTDsKKwlzdHJ1Y3QgaHBmc19pbm9kZV9pbmZvICpocGZzX3Jlc3VsdDsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKChlcnIgPSBocGZzX2Noa19uYW1lKChjaGFyICopbmFtZSwgJmxlbikpKSB7CisJCWlmIChlcnIgPT0gLUVOQU1FVE9PTE9ORykgeworCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CisJCX0KKwkJZ290byBlbmRfYWRkOworCX0KKworCS8qCisJICogJy4nIGFuZCAnLi4nIHdpbGwgbmV2ZXIgYmUgcGFzc2VkIGhlcmUuCisJICovCisKKwlkZSA9IG1hcF9kaXJlbnQoZGlyLCBocGZzX2koZGlyKS0+aV9kbm8sIChjaGFyICopIG5hbWUsIGxlbiwgTlVMTCwgJnFiaCk7CisKKwkvKgorCSAqIFRoaXMgaXMgbm90IHJlYWxseSBhIGJhaWxvdXQsIGp1c3QgbWVhbnMgZmlsZSBub3QgZm91bmQuCisJICovCisKKwlpZiAoIWRlKSBnb3RvIGVuZDsKKworCS8qCisJICogR2V0IGlub2RlIG51bWJlciwgd2hhdCB3ZSdyZSBhZnRlci4KKwkgKi8KKworCWlubyA9IGRlLT5mbm9kZTsKKworCS8qCisJICogR28gZmluZCBvciBtYWtlIGFuIGlub2RlLgorCSAqLworCisJcmVzdWx0ID0gaWdldF9sb2NrZWQoZGlyLT5pX3NiLCBpbm8pOworCWlmICghcmVzdWx0KSB7CisJCWhwZnNfZXJyb3IoZGlyLT5pX3NiLCAiaHBmc19sb29rdXA6IGNhbid0IGdldCBpbm9kZSIpOworCQlnb3RvIGJhaWwxOworCX0KKwlpZiAocmVzdWx0LT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJaHBmc19pbml0X2lub2RlKHJlc3VsdCk7CisJCWlmIChkZS0+ZGlyZWN0b3J5KQorCQkJaHBmc19yZWFkX2lub2RlKHJlc3VsdCk7CisJCWVsc2UgaWYgKGRlLT5lYV9zaXplICYmIGhwZnNfc2IoZGlyLT5pX3NiKS0+c2JfZWFzKQorCQkJaHBmc19yZWFkX2lub2RlKHJlc3VsdCk7CisJCWVsc2UgeworCQkJcmVzdWx0LT5pX21vZGUgfD0gU19JRlJFRzsKKwkJCXJlc3VsdC0+aV9tb2RlICY9IH4wMTExOworCQkJcmVzdWx0LT5pX29wID0gJmhwZnNfZmlsZV9pb3BzOworCQkJcmVzdWx0LT5pX2ZvcCA9ICZocGZzX2ZpbGVfb3BzOworCQkJcmVzdWx0LT5pX25saW5rID0gMTsKKwkJfQorCQl1bmxvY2tfbmV3X2lub2RlKHJlc3VsdCk7CisJfQorCWhwZnNfcmVzdWx0ID0gaHBmc19pKHJlc3VsdCk7CisJaWYgKCFkZS0+ZGlyZWN0b3J5KSBocGZzX3Jlc3VsdC0+aV9wYXJlbnRfZGlyID0gZGlyLT5pX2lubzsKKworCWhwZnNfZGVjaWRlX2NvbnYocmVzdWx0LCAoY2hhciAqKW5hbWUsIGxlbik7CisKKwlpZiAoZGUtPmhhc19hY2wgfHwgZGUtPmhhc194dGRfcGVybSkgaWYgKCEoZGlyLT5pX3NiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlocGZzX2Vycm9yKHJlc3VsdC0+aV9zYiwgIkFDTHMgb3IgWFBFUk0gZm91bmQuIFRoaXMgaXMgcHJvYmFibHkgSFBGUzM4Ni4gVGhpcyBkcml2ZXIgZG9lc24ndCBzdXBwb3J0IGl0IG5vdy4gU2VuZCBtZSBzb21lIGluZm8gb24gdGhlc2Ugc3RydWN0dXJlcyIpOworCQlnb3RvIGJhaWwxOworCX0KKworCS8qCisJICogRmlsbCBpbiB0aGUgaW5mbyBmcm9tIHRoZSBkaXJlY3RvcnkgaWYgdGhpcyBpcyBhIG5ld2x5IGNyZWF0ZWQKKwkgKiBpbm9kZS4KKwkgKi8KKworCWlmICghcmVzdWx0LT5pX2N0aW1lLnR2X3NlYykgeworCQlpZiAoIShyZXN1bHQtPmlfY3RpbWUudHZfc2VjID0gbG9jYWxfdG9fZ210KGRpci0+aV9zYiwgZGUtPmNyZWF0aW9uX2RhdGUpKSkKKwkJCXJlc3VsdC0+aV9jdGltZS50dl9zZWMgPSAxOworCQlyZXN1bHQtPmlfY3RpbWUudHZfbnNlYyA9IDA7CisJCXJlc3VsdC0+aV9tdGltZS50dl9zZWMgPSBsb2NhbF90b19nbXQoZGlyLT5pX3NiLCBkZS0+d3JpdGVfZGF0ZSk7CisJCXJlc3VsdC0+aV9tdGltZS50dl9uc2VjID0gMDsKKwkJcmVzdWx0LT5pX2F0aW1lLnR2X3NlYyA9IGxvY2FsX3RvX2dtdChkaXItPmlfc2IsIGRlLT5yZWFkX2RhdGUpOworCQlyZXN1bHQtPmlfYXRpbWUudHZfbnNlYyA9IDA7CisJCWhwZnNfcmVzdWx0LT5pX2VhX3NpemUgPSBkZS0+ZWFfc2l6ZTsKKwkJaWYgKCFocGZzX3Jlc3VsdC0+aV9lYV9tb2RlICYmIGRlLT5yZWFkX29ubHkpCisJCQlyZXN1bHQtPmlfbW9kZSAmPSB+MDIyMjsKKwkJaWYgKCFkZS0+ZGlyZWN0b3J5KSB7CisJCQlpZiAocmVzdWx0LT5pX3NpemUgPT0gLTEpIHsKKwkJCQlyZXN1bHQtPmlfc2l6ZSA9IGRlLT5maWxlX3NpemU7CisJCQkJcmVzdWx0LT5pX2RhdGEuYV9vcHMgPSAmaHBmc19hb3BzOworCQkJCWhwZnNfaShyZXN1bHQpLT5tbXVfcHJpdmF0ZSA9IHJlc3VsdC0+aV9zaXplOworCQkJLyoKKwkJCSAqIGlfYmxvY2tzIHNob3VsZCBjb3VudCB0aGUgZm5vZGUgYW5kIGFueSBhbm9kZXMuCisJCQkgKiBXZSBjb3VudCAxIGZvciB0aGUgZm5vZGUgYW5kIGRvbid0IGJvdGhlciBhYm91dAorCQkJICogYW5vZGVzIC0tIHRoZSBkaXNrIGhlYWRzIGFyZSBvbiB0aGUgZGlyZWN0b3J5IGJhbmQKKwkJCSAqIGFuZCB3ZSB3YW50IHRoZW0gdG8gc3RheSB0aGVyZS4KKwkJCSAqLworCQkJCXJlc3VsdC0+aV9ibG9ja3MgPSAxICsgKChyZXN1bHQtPmlfc2l6ZSArIDUxMSkgPj4gOSk7CisJCQl9CisJCX0KKwl9CisKKwlocGZzX2JyZWxzZTQoJnFiaCk7CisKKwkvKgorCSAqIE1hZGUgaXQuCisJICovCisKKwllbmQ6CisJZW5kX2FkZDoKKwlocGZzX3NldF9kZW50cnlfb3BlcmF0aW9ucyhkZW50cnkpOworCXVubG9ja19rZXJuZWwoKTsKKwlkX2FkZChkZW50cnksIHJlc3VsdCk7CisJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIERpZG4ndC4KKwkgKi8KKwliYWlsMToKKwkKKwlocGZzX2JyZWxzZTQoJnFiaCk7CisJCisJLypiYWlsOiovCisKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgaHBmc19kaXJfb3BzID0KK3sKKwkubGxzZWVrCQk9IGhwZnNfZGlyX2xzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBocGZzX3JlYWRkaXIsCisJLnJlbGVhc2UJPSBocGZzX2Rpcl9yZWxlYXNlLAorCS5mc3luYwkJPSBocGZzX2ZpbGVfZnN5bmMsCit9OwpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9kbm9kZS5jIGIvZnMvaHBmcy9kbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMjEzMDcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ocGZzL2Rub2RlLmMKQEAgLTAsMCArMSwxMDgwIEBACisvKgorICogIGxpbnV4L2ZzL2hwZnMvZG5vZGUuYworICoKKyAqICBNaWt1bGFzIFBhdG9ja2EgKG1pa3VsYXNAYXJ0YXgua2FybGluLm1mZi5jdW5pLmN6KSwgMTk5OC0xOTk5CisgKgorICogIGhhbmRsaW5nIGRpcmVjdG9yeSBkbm9kZSB0cmVlIC0gYWRkaW5nLCBkZWxldGVpbmcgJiBzZWFyY2hpbmcgZm9yIGRpcmVudHMKKyAqLworCisjaW5jbHVkZSAiaHBmc19mbi5oIgorCitzdGF0aWMgbG9mZl90IGdldF9wb3Moc3RydWN0IGRub2RlICpkLCBzdHJ1Y3QgaHBmc19kaXJlbnQgKmZkZSkKK3sKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGVfZW5kID0gZG5vZGVfZW5kX2RlKGQpOworCWludCBpID0gMTsKKwlmb3IgKGRlID0gZG5vZGVfZmlyc3RfZGUoZCk7IGRlIDwgZGVfZW5kOyBkZSA9IGRlX25leHRfZGUoZGUpKSB7CisJCWlmIChkZSA9PSBmZGUpIHJldHVybiAoKGxvZmZfdCkgZC0+c2VsZiA8PCA0KSB8IChsb2ZmX3QpaTsKKwkJaSsrOworCX0KKwlwcmludGsoIkhQRlM6IGdldF9wb3M6IG5vdF9mb3VuZFxuIik7CisJcmV0dXJuICgobG9mZl90KWQtPnNlbGYgPDwgNCkgfCAobG9mZl90KTE7Cit9CisKK3ZvaWQgaHBmc19hZGRfcG9zKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBocGZzX2lub2RlX2luZm8gKmhwZnNfaW5vZGUgPSBocGZzX2koaW5vZGUpOworCWludCBpID0gMDsKKwlsb2ZmX3QgKipwcG9zOworCisJaWYgKGhwZnNfaW5vZGUtPmlfcmRkaXJfb2ZmKQorCQlmb3IgKDsgaHBmc19pbm9kZS0+aV9yZGRpcl9vZmZbaV07IGkrKykKKwkJCWlmIChocGZzX2lub2RlLT5pX3JkZGlyX29mZltpXSA9PSBwb3MpIHJldHVybjsKKwlpZiAoIShpJjB4MGYpKSB7CisJCWlmICghKHBwb3MgPSBrbWFsbG9jKChpKzB4MTEpICogc2l6ZW9mKGxvZmZfdCopLCBHRlBfTk9GUykpKSB7CisJCQlwcmludGsoIkhQRlM6IG91dCBvZiBtZW1vcnkgZm9yIHBvc2l0aW9uIGxpc3RcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChocGZzX2lub2RlLT5pX3JkZGlyX29mZikgeworCQkJbWVtY3B5KHBwb3MsIGhwZnNfaW5vZGUtPmlfcmRkaXJfb2ZmLCBpICogc2l6ZW9mKGxvZmZfdCkpOworCQkJa2ZyZWUoaHBmc19pbm9kZS0+aV9yZGRpcl9vZmYpOworCQl9CisJCWhwZnNfaW5vZGUtPmlfcmRkaXJfb2ZmID0gcHBvczsKKwl9CisJaHBmc19pbm9kZS0+aV9yZGRpcl9vZmZbaV0gPSBwb3M7CisJaHBmc19pbm9kZS0+aV9yZGRpcl9vZmZbaSArIDFdID0gTlVMTDsKK30KKwordm9pZCBocGZzX2RlbF9wb3Moc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGhwZnNfaW5vZGVfaW5mbyAqaHBmc19pbm9kZSA9IGhwZnNfaShpbm9kZSk7CisJbG9mZl90ICoqaSwgKipqOworCisJaWYgKCFocGZzX2lub2RlLT5pX3JkZGlyX29mZikgZ290byBub3RfZjsKKwlmb3IgKGkgPSBocGZzX2lub2RlLT5pX3JkZGlyX29mZjsgKmk7IGkrKykgaWYgKCppID09IHBvcykgZ290byBmbmQ7CisJZ290byBub3RfZjsKKwlmbmQ6CisJZm9yIChqID0gaSArIDE7ICpqOyBqKyspIDsKKwkqaSA9ICooaiAtIDEpOworCSooaiAtIDEpID0gTlVMTDsKKwlpZiAoaiAtIDEgPT0gaHBmc19pbm9kZS0+aV9yZGRpcl9vZmYpIHsKKwkJa2ZyZWUoaHBmc19pbm9kZS0+aV9yZGRpcl9vZmYpOworCQlocGZzX2lub2RlLT5pX3JkZGlyX29mZiA9IE5VTEw7CisJfQorCXJldHVybjsKKwlub3RfZjoKKwkvKnByaW50aygiSFBGUzogd2FybmluZzogcG9zaXRpb24gcG9pbnRlciAlcC0+JTA4eCBub3QgZm91bmRcbiIsIHBvcywgKGludCkqcG9zKTsqLworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgZm9yX2FsbF9wb3NzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKCpmKShsb2ZmX3QgKiwgbG9mZl90LCBsb2ZmX3QpLAorCQkJIGxvZmZfdCBwMSwgbG9mZl90IHAyKQoreworCXN0cnVjdCBocGZzX2lub2RlX2luZm8gKmhwZnNfaW5vZGUgPSBocGZzX2koaW5vZGUpOworCWxvZmZfdCAqKmk7CisKKwlpZiAoIWhwZnNfaW5vZGUtPmlfcmRkaXJfb2ZmKSByZXR1cm47CisJZm9yIChpID0gaHBmc19pbm9kZS0+aV9yZGRpcl9vZmY7ICppOyBpKyspICgqZikoKmksIHAxLCBwMik7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBocGZzX3Bvc19zdWJzdChsb2ZmX3QgKnAsIGxvZmZfdCBmLCBsb2ZmX3QgdCkKK3sKKwlpZiAoKnAgPT0gZikgKnAgPSB0OworfQorCisvKnZvaWQgaHBmc19ocGZzX3Bvc19zdWJzdGQobG9mZl90ICpwLCBsb2ZmX3QgZiwgbG9mZl90IHQpCit7CisJaWYgKCgqcCAmIH4weDNmKSA9PSAoZiAmIH4weDNmKSkgKnAgPSAodCAmIH4weDNmKSB8ICgqcCAmIDB4M2YpOworfSovCisKK3N0YXRpYyB2b2lkIGhwZnNfcG9zX2lucyhsb2ZmX3QgKnAsIGxvZmZfdCBkLCBsb2ZmX3QgYykKK3sKKwlpZiAoKCpwICYgfjB4M2YpID09IChkICYgfjB4M2YpICYmICgqcCAmIDB4M2YpID49IChkICYgMHgzZikpIHsKKwkJaW50IG4gPSAoKnAgJiAweDNmKSArIGM7CisJCWlmIChuID4gMHgzZikgcHJpbnRrKCJIUEZTOiBocGZzX3Bvc19pbnM6ICUwOHggKyAlZFxuIiwgKGludCkqcCwgKGludCljID4+IDgpOworCQllbHNlICpwID0gKCpwICYgfjB4M2YpIHwgbjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhwZnNfcG9zX2RlbChsb2ZmX3QgKnAsIGxvZmZfdCBkLCBsb2ZmX3QgYykKK3sKKwlpZiAoKCpwICYgfjB4M2YpID09IChkICYgfjB4M2YpICYmICgqcCAmIDB4M2YpID49IChkICYgMHgzZikpIHsKKwkJaW50IG4gPSAoKnAgJiAweDNmKSAtIGM7CisJCWlmIChuIDwgMSkgcHJpbnRrKCJIUEZTOiBocGZzX3Bvc19pbnM6ICUwOHggLSAlZFxuIiwgKGludCkqcCwgKGludCljID4+IDgpOworCQllbHNlICpwID0gKCpwICYgfjB4M2YpIHwgbjsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHBmc19kaXJlbnQgKmRub2RlX3ByZV9sYXN0X2RlKHN0cnVjdCBkbm9kZSAqZCkKK3sKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlLCAqZGVfZW5kLCAqZGVlID0gTlVMTCwgKmRlZWUgPSBOVUxMOworCWRlX2VuZCA9IGRub2RlX2VuZF9kZShkKTsKKwlmb3IgKGRlID0gZG5vZGVfZmlyc3RfZGUoZCk7IGRlIDwgZGVfZW5kOyBkZSA9IGRlX25leHRfZGUoZGUpKSB7CisJCWRlZWUgPSBkZWU7IGRlZSA9IGRlOworCX0JCisJcmV0dXJuIGRlZWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHBmc19kaXJlbnQgKmRub2RlX2xhc3RfZGUoc3RydWN0IGRub2RlICpkKQoreworCXN0cnVjdCBocGZzX2RpcmVudCAqZGUsICpkZV9lbmQsICpkZWUgPSBOVUxMOworCWRlX2VuZCA9IGRub2RlX2VuZF9kZShkKTsKKwlmb3IgKGRlID0gZG5vZGVfZmlyc3RfZGUoZCk7IGRlIDwgZGVfZW5kOyBkZSA9IGRlX25leHRfZGUoZGUpKSB7CisJCWRlZSA9IGRlOworCX0JCisJcmV0dXJuIGRlZTsKK30KKworc3RhdGljIHZvaWQgc2V0X2xhc3RfcG9pbnRlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBkbm9kZSAqZCwgZG5vZGVfc2Vjbm8gcHRyKQoreworCXN0cnVjdCBocGZzX2RpcmVudCAqZGU7CisJaWYgKCEoZGUgPSBkbm9kZV9sYXN0X2RlKGQpKSkgeworCQlocGZzX2Vycm9yKHMsICJzZXRfbGFzdF9wb2ludGVyOiBlbXB0eSBkbm9kZSAlMDh4IiwgZC0+c2VsZik7CisJCXJldHVybjsKKwl9CisJaWYgKGhwZnNfc2IocyktPnNiX2NoaykgeworCQlpZiAoZGUtPmRvd24pIHsKKwkJCWhwZnNfZXJyb3IocywgInNldF9sYXN0X3BvaW50ZXI6IGRub2RlICUwOHggaGFzIGFscmVhZHkgbGFzdCBwb2ludGVyICUwOHgiLAorCQkJCWQtPnNlbGYsIGRlX2Rvd25fcG9pbnRlcihkZSkpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChkZS0+bGVuZ3RoICE9IDMyKSB7CisJCQlocGZzX2Vycm9yKHMsICJzZXRfbGFzdF9wb2ludGVyOiBiYWQgbGFzdCBkaXJlbnQgaW4gZG5vZGUgJTA4eCIsIGQtPnNlbGYpOworCQkJcmV0dXJuOworCQl9CisJfQorCWlmIChwdHIpIHsKKwkJaWYgKChkLT5maXJzdF9mcmVlICs9IDQpID4gMjA0OCkgeworCQkJaHBmc19lcnJvcihzLCJzZXRfbGFzdF9wb2ludGVyOiB0b28gbG9uZyBkbm9kZSAlMDh4IiwgZC0+c2VsZik7CisJCQlkLT5maXJzdF9mcmVlIC09IDQ7CisJCQlyZXR1cm47CisJCX0KKwkJZGUtPmxlbmd0aCA9IDM2OworCQlkZS0+ZG93biA9IDE7CisJCSooZG5vZGVfc2Vjbm8gKikoKGNoYXIgKilkZSArIDMyKSA9IHB0cjsKKwl9Cit9CisKKy8qIEFkZCBhbiBlbnRyeSB0byBkbm9kZSBhbmQgZG9uJ3QgY2FyZSBpZiBpdCBncm93cyBvdmVyIDIwNDggYnl0ZXMgKi8KKworc3RydWN0IGhwZnNfZGlyZW50ICpocGZzX2FkZF9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBkbm9kZSAqZCwgdW5zaWduZWQgY2hhciAqbmFtZSwKKwkJCQl1bnNpZ25lZCBuYW1lbGVuLCBzZWNubyBkb3duX3B0cikKK3sKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGVfZW5kID0gZG5vZGVfZW5kX2RlKGQpOworCXVuc2lnbmVkIGRfc2l6ZSA9IGRlX3NpemUobmFtZWxlbiwgZG93bl9wdHIpOworCWZvciAoZGUgPSBkbm9kZV9maXJzdF9kZShkKTsgZGUgPCBkZV9lbmQ7IGRlID0gZGVfbmV4dF9kZShkZSkpIHsKKwkJaW50IGMgPSBocGZzX2NvbXBhcmVfbmFtZXMocywgbmFtZSwgbmFtZWxlbiwgZGUtPm5hbWUsIGRlLT5uYW1lbGVuLCBkZS0+bGFzdCk7CisJCWlmICghYykgeworCQkJaHBmc19lcnJvcihzLCAibmFtZSAoJWMsJWQpIGFscmVhZHkgZXhpc3RzIGluIGRub2RlICUwOHgiLCAqbmFtZSwgbmFtZWxlbiwgZC0+c2VsZik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoYyA8IDApIGJyZWFrOworCX0KKwltZW1tb3ZlKChjaGFyICopZGUgKyBkX3NpemUsIGRlLCAoY2hhciAqKWRlX2VuZCAtIChjaGFyICopZGUpOworCW1lbXNldChkZSwgMCwgZF9zaXplKTsKKwlpZiAoZG93bl9wdHIpIHsKKwkJKihpbnQgKikoKGNoYXIgKilkZSArIGRfc2l6ZSAtIDQpID0gZG93bl9wdHI7CisJCWRlLT5kb3duID0gMTsKKwl9CisJZGUtPmxlbmd0aCA9IGRfc2l6ZTsKKwlpZiAoZG93bl9wdHIpIGRlLT5kb3duID0gMTsKKwlkZS0+bm90Xzh4MyA9IGhwZnNfaXNfbmFtZV9sb25nKG5hbWUsIG5hbWVsZW4pOworCWRlLT5uYW1lbGVuID0gbmFtZWxlbjsKKwltZW1jcHkoZGUtPm5hbWUsIG5hbWUsIG5hbWVsZW4pOworCWQtPmZpcnN0X2ZyZWUgKz0gZF9zaXplOworCXJldHVybiBkZTsKK30KKworLyogRGVsZXRlIGRpcmVudCBhbmQgZG9uJ3QgY2FyZSBhYm91dCBpdHMgc3VidHJlZSAqLworCitzdGF0aWMgdm9pZCBocGZzX2RlbGV0ZV9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBkbm9kZSAqZCwKKwkJCSAgIHN0cnVjdCBocGZzX2RpcmVudCAqZGUpCit7CisJaWYgKGRlLT5sYXN0KSB7CisJCWhwZnNfZXJyb3IocywgImF0dGVtcHQgdG8gZGVsZXRlIGxhc3QgZGlyZW50IGluIGRub2RlICUwOHgiLCBkLT5zZWxmKTsKKwkJcmV0dXJuOworCX0KKwlkLT5maXJzdF9mcmVlIC09IGRlLT5sZW5ndGg7CisJbWVtbW92ZShkZSwgZGVfbmV4dF9kZShkZSksIGQtPmZpcnN0X2ZyZWUgKyAoY2hhciAqKWQgLSAoY2hhciAqKWRlKTsKK30KKworc3RhdGljIHZvaWQgZml4X3VwX3B0cnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgZG5vZGUgKmQpCit7CisJc3RydWN0IGhwZnNfZGlyZW50ICpkZTsKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlX2VuZCA9IGRub2RlX2VuZF9kZShkKTsKKwlkbm9kZV9zZWNubyBkbm8gPSBkLT5zZWxmOworCWZvciAoZGUgPSBkbm9kZV9maXJzdF9kZShkKTsgZGUgPCBkZV9lbmQ7IGRlID0gZGVfbmV4dF9kZShkZSkpCisJCWlmIChkZS0+ZG93bikgeworCQkJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCQkJc3RydWN0IGRub2RlICpkZDsKKwkJCWlmICgoZGQgPSBocGZzX21hcF9kbm9kZShzLCBkZV9kb3duX3BvaW50ZXIoZGUpLCAmcWJoKSkpIHsKKwkJCQlpZiAoZGQtPnVwICE9IGRubyB8fCBkZC0+cm9vdF9kbm9kZSkgeworCQkJCQlkZC0+dXAgPSBkbm87CisJCQkJCWRkLT5yb290X2Rub2RlID0gMDsKKwkJCQkJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgpOworCQkJCX0KKwkJCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCQl9CisJCX0KK30KKworLyogQWRkIGFuIGVudHJ5IHRvIGRub2RlIGFuZCBkbyBkbm9kZSBzcGxpdHRpbmcgaWYgcmVxdWlyZWQgKi8KKworc3RhdGljIGludCBocGZzX2FkZF90b19kbm9kZShzdHJ1Y3QgaW5vZGUgKmksIGRub2RlX3NlY25vIGRubywKKwkJCSAgICAgdW5zaWduZWQgY2hhciAqbmFtZSwgdW5zaWduZWQgbmFtZWxlbiwKKwkJCSAgICAgc3RydWN0IGhwZnNfZGlyZW50ICpuZXdfZGUsIGRub2RlX3NlY25vIGRvd25fcHRyKQoreworCXN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkIHFiaCwgcWJoMSwgcWJoMjsKKwlzdHJ1Y3QgZG5vZGUgKmQsICphZCwgKnJkLCAqbmQgPSBOVUxMOworCWRub2RlX3NlY25vIGFkbm8sIHJkbm87CisJc3RydWN0IGhwZnNfZGlyZW50ICpkZTsKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgbmRlOworCWNoYXIgKm5uYW1lOworCWludCBoOworCWludCBwb3M7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgZm5vZGUgKmZub2RlOworCWludCBjMSwgYzIgPSAwOworCWlmICghKG5uYW1lID0ga21hbGxvYygyNTYsIEdGUF9OT0ZTKSkpIHsKKwkJcHJpbnRrKCJIUEZTOiBvdXQgb2YgbWVtb3J5LCBjYW4ndCBhZGQgdG8gZG5vZGVcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJZ29fdXA6CisJaWYgKG5hbWVsZW4gPj0gMjU2KSB7CisJCWhwZnNfZXJyb3IoaS0+aV9zYiwgImhwZnNfYWRkX3RvX2Rub2RlOiBuYW1lbGVuID09ICVkIiwgbmFtZWxlbik7CisJCWlmIChuZCkga2ZyZWUobmQpOworCQlrZnJlZShubmFtZSk7CisJCXJldHVybiAxOworCX0KKwlpZiAoIShkID0gaHBmc19tYXBfZG5vZGUoaS0+aV9zYiwgZG5vLCAmcWJoKSkpIHsKKwkJaWYgKG5kKSBrZnJlZShuZCk7CisJCWtmcmVlKG5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCWdvX3VwX2E6CisJaWYgKGhwZnNfc2IoaS0+aV9zYiktPnNiX2NoaykKKwkJaWYgKGhwZnNfc3RvcF9jeWNsZXMoaS0+aV9zYiwgZG5vLCAmYzEsICZjMiwgImhwZnNfYWRkX3RvX2Rub2RlIikpIHsKKwkJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJCWlmIChuZCkga2ZyZWUobmQpOworCQkJa2ZyZWUobm5hbWUpOworCQkJcmV0dXJuIDE7CisJCX0KKwlpZiAoZC0+Zmlyc3RfZnJlZSArIGRlX3NpemUobmFtZWxlbiwgZG93bl9wdHIpIDw9IDIwNDgpIHsKKwkJbG9mZl90IHQ7CisJCWNvcHlfZGUoZGU9aHBmc19hZGRfZGUoaS0+aV9zYiwgZCwgbmFtZSwgbmFtZWxlbiwgZG93bl9wdHIpLCBuZXdfZGUpOworCQl0ID0gZ2V0X3BvcyhkLCBkZSk7CisJCWZvcl9hbGxfcG9zcyhpLCBocGZzX3Bvc19pbnMsIHQsIDEpOworCQlmb3JfYWxsX3Bvc3MoaSwgaHBmc19wb3Nfc3Vic3QsIDQsIHQpOworCQlmb3JfYWxsX3Bvc3MoaSwgaHBmc19wb3Nfc3Vic3QsIDUsIHQgKyAxKTsKKwkJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgpOworCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCWlmIChuZCkga2ZyZWUobmQpOworCQlrZnJlZShubmFtZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIW5kKSBpZiAoIShuZCA9IGttYWxsb2MoMHg5MjQsIEdGUF9OT0ZTKSkpIHsKKwkJLyogMHg5MjQgaXMgYSBtYXggc2l6ZSBvZiBkbm9kZSBhZnRlciBhZGRpbmcgYSBkaXJlbnQgd2l0aAorCQkgICBtYXggbmFtZSBsZW5ndGguIFdlIGFsbG9jIHRoaXMgb25seSBvbmNlLiBUaGVyZSBtdXN0CisJCSAgIG5vdCBiZSBhbnkgZXJyb3Igd2hpbGUgc3BsaXR0aW5nIGRub2Rlcywgb3RoZXJ3aXNlIHRoZQorCQkgICB3aG9sZSBkaXJlY3RvcnksIG5vdCBvbmx5IGZpbGUgd2UncmUgYWRkaW5nLCB3b3VsZAorCQkgICBiZSBsb3N0LiAqLworCQlwcmludGsoIkhQRlM6IG91dCBvZiBtZW1vcnkgZm9yIGRub2RlIHNwbGl0dGluZ1xuIik7CisJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJa2ZyZWUobm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CQorCW1lbWNweShuZCwgZCwgZC0+Zmlyc3RfZnJlZSk7CisJY29weV9kZShkZSA9IGhwZnNfYWRkX2RlKGktPmlfc2IsIG5kLCBuYW1lLCBuYW1lbGVuLCBkb3duX3B0ciksIG5ld19kZSk7CisJZm9yX2FsbF9wb3NzKGksIGhwZnNfcG9zX2lucywgZ2V0X3BvcyhuZCwgZGUpLCAxKTsKKwloID0gKChjaGFyICopZG5vZGVfbGFzdF9kZShuZCkgLSAoY2hhciAqKW5kKSAvIDIgKyAxMDsKKwlpZiAoIShhZCA9IGhwZnNfYWxsb2NfZG5vZGUoaS0+aV9zYiwgZC0+dXAsICZhZG5vLCAmcWJoMSwgMCkpKSB7CisJCWhwZnNfZXJyb3IoaS0+aV9zYiwgInVuYWJsZSB0byBhbGxvYyBkbm9kZSAtIGRub2RlIHRyZWUgd2lsbCBiZSBjb3JydXB0ZWQiKTsKKwkJaHBmc19icmVsc2U0KCZxYmgpOworCQlrZnJlZShuZCk7CisJCWtmcmVlKG5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCWktPmlfc2l6ZSArPSAyMDQ4OworCWktPmlfYmxvY2tzICs9IDQ7CisJcG9zID0gMTsKKwlmb3IgKGRlID0gZG5vZGVfZmlyc3RfZGUobmQpOyAoY2hhciAqKWRlX25leHRfZGUoZGUpIC0gKGNoYXIgKiluZCA8IGg7IGRlID0gZGVfbmV4dF9kZShkZSkpIHsKKwkJY29weV9kZShocGZzX2FkZF9kZShpLT5pX3NiLCBhZCwgZGUtPm5hbWUsIGRlLT5uYW1lbGVuLCBkZS0+ZG93biA/IGRlX2Rvd25fcG9pbnRlcihkZSkgOiAwKSwgZGUpOworCQlmb3JfYWxsX3Bvc3MoaSwgaHBmc19wb3Nfc3Vic3QsICgobG9mZl90KWRubyA8PCA0KSB8IHBvcywgKChsb2ZmX3QpYWRubyA8PCA0KSB8IHBvcyk7CisJCXBvcysrOworCX0KKwljb3B5X2RlKG5ld19kZSA9ICZuZGUsIGRlKTsKKwltZW1jcHkobmFtZSA9IG5uYW1lLCBkZS0+bmFtZSwgbmFtZWxlbiA9IGRlLT5uYW1lbGVuKTsKKwlmb3JfYWxsX3Bvc3MoaSwgaHBmc19wb3Nfc3Vic3QsICgobG9mZl90KWRubyA8PCA0KSB8IHBvcywgNCk7CisJZG93bl9wdHIgPSBhZG5vOworCXNldF9sYXN0X3BvaW50ZXIoaS0+aV9zYiwgYWQsIGRlLT5kb3duID8gZGVfZG93bl9wb2ludGVyKGRlKSA6IDApOworCWRlID0gZGVfbmV4dF9kZShkZSk7CisJbWVtbW92ZSgoY2hhciAqKW5kICsgMjAsIGRlLCBuZC0+Zmlyc3RfZnJlZSArIChjaGFyICopbmQgLSAoY2hhciAqKWRlKTsKKwluZC0+Zmlyc3RfZnJlZSAtPSAoY2hhciAqKWRlIC0gKGNoYXIgKiluZCAtIDIwOworCW1lbWNweShkLCBuZCwgbmQtPmZpcnN0X2ZyZWUpOworCWZvcl9hbGxfcG9zcyhpLCBocGZzX3Bvc19kZWwsIChsb2ZmX3QpZG5vIDw8IDQsIHBvcyk7CisJZml4X3VwX3B0cnMoaS0+aV9zYiwgYWQpOworCWlmICghZC0+cm9vdF9kbm9kZSkgeworCQlkbm8gPSBhZC0+dXAgPSBkLT51cDsKKwkJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgpOworCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eSgmcWJoMSk7CisJCWhwZnNfYnJlbHNlNCgmcWJoMSk7CisJCWdvdG8gZ29fdXA7CisJfQorCWlmICghKHJkID0gaHBmc19hbGxvY19kbm9kZShpLT5pX3NiLCBkLT51cCwgJnJkbm8sICZxYmgyLCAwKSkpIHsKKwkJaHBmc19lcnJvcihpLT5pX3NiLCAidW5hYmxlIHRvIGFsbG9jIGRub2RlIC0gZG5vZGUgdHJlZSB3aWxsIGJlIGNvcnJ1cHRlZCIpOworCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCWhwZnNfYnJlbHNlNCgmcWJoMSk7CisJCWtmcmVlKG5kKTsKKwkJa2ZyZWUobm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisJaS0+aV9zaXplICs9IDIwNDg7CisJaS0+aV9ibG9ja3MgKz0gNDsKKwlyZC0+cm9vdF9kbm9kZSA9IDE7CisJcmQtPnVwID0gZC0+dXA7CisJaWYgKCEoZm5vZGUgPSBocGZzX21hcF9mbm9kZShpLT5pX3NiLCBkLT51cCwgJmJoKSkpIHsKKwkJaHBmc19mcmVlX2Rub2RlKGktPmlfc2IsIHJkbm8pOworCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCWhwZnNfYnJlbHNlNCgmcWJoMSk7CisJCWhwZnNfYnJlbHNlNCgmcWJoMik7CisJCWtmcmVlKG5kKTsKKwkJa2ZyZWUobm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisJZm5vZGUtPnUuZXh0ZXJuYWxbMF0uZGlza19zZWNubyA9IHJkbm87CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWJyZWxzZShiaCk7CisJZC0+dXAgPSBhZC0+dXAgPSBocGZzX2koaSktPmlfZG5vID0gcmRubzsKKwlkLT5yb290X2Rub2RlID0gYWQtPnJvb3RfZG5vZGUgPSAwOworCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eSgmcWJoKTsKKwlocGZzX2JyZWxzZTQoJnFiaCk7CisJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgxKTsKKwlocGZzX2JyZWxzZTQoJnFiaDEpOworCXFiaCA9IHFiaDI7CisJc2V0X2xhc3RfcG9pbnRlcihpLT5pX3NiLCByZCwgZG5vKTsKKwlkbm8gPSByZG5vOworCWQgPSByZDsKKwlnb3RvIGdvX3VwX2E7Cit9CisKKy8qCisgKiBBZGQgYW4gZW50cnkgdG8gZGlyZWN0b3J5IGJ0cmVlLgorICogSSBoYXRlIHN1Y2ggY3JhenkgZGlyZWN0b3J5IHN0cnVjdHVyZS4KKyAqIEl0J3MgZWFzeSB0byByZWFkIGJ1dCB0ZXJyaWJsZSB0byB3cml0ZS4KKyAqIEkgd3JvdGUgdGhpcyBkaXJlY3RvcnkgY29kZSA0IHRpbWVzLgorICogSSBob3BlLCBub3cgaXQncyBmaW5hbGx5IGJ1Zy1mcmVlLgorICovCisKK2ludCBocGZzX2FkZF9kaXJlbnQoc3RydWN0IGlub2RlICppLCB1bnNpZ25lZCBjaGFyICpuYW1lLCB1bnNpZ25lZCBuYW1lbGVuLAorCQkgICAgc3RydWN0IGhwZnNfZGlyZW50ICpuZXdfZGUsIGludCBjZGVwdGgpCit7CisJc3RydWN0IGhwZnNfaW5vZGVfaW5mbyAqaHBmc19pbm9kZSA9IGhwZnNfaShpKTsKKwlzdHJ1Y3QgZG5vZGUgKmQ7CisJc3RydWN0IGhwZnNfZGlyZW50ICpkZSwgKmRlX2VuZDsKKwlzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCBxYmg7CisJZG5vZGVfc2Vjbm8gZG5vOworCWludCBjOworCWludCBjMSwgYzIgPSAwOworCWRubyA9IGhwZnNfaW5vZGUtPmlfZG5vOworCWRvd246CisJaWYgKGhwZnNfc2IoaS0+aV9zYiktPnNiX2NoaykKKwkJaWYgKGhwZnNfc3RvcF9jeWNsZXMoaS0+aV9zYiwgZG5vLCAmYzEsICZjMiwgImhwZnNfYWRkX2RpcmVudCIpKSByZXR1cm4gMTsKKwlpZiAoIShkID0gaHBmc19tYXBfZG5vZGUoaS0+aV9zYiwgZG5vLCAmcWJoKSkpIHJldHVybiAxOworCWRlX2VuZCA9IGRub2RlX2VuZF9kZShkKTsKKwlmb3IgKGRlID0gZG5vZGVfZmlyc3RfZGUoZCk7IGRlIDwgZGVfZW5kOyBkZSA9IGRlX25leHRfZGUoZGUpKSB7CisJCWlmICghKGMgPSBocGZzX2NvbXBhcmVfbmFtZXMoaS0+aV9zYiwgbmFtZSwgbmFtZWxlbiwgZGUtPm5hbWUsIGRlLT5uYW1lbGVuLCBkZS0+bGFzdCkpKSB7CisJCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCQlyZXR1cm4gLTE7CisJCX0JCisJCWlmIChjIDwgMCkgeworCQkJaWYgKGRlLT5kb3duKSB7CisJCQkJZG5vID0gZGVfZG93bl9wb2ludGVyKGRlKTsKKwkJCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCQkJZ290byBkb3duOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJaHBmc19icmVsc2U0KCZxYmgpOworCWlmICghY2RlcHRoKSBocGZzX2xvY2tfY3JlYXRpb24oaS0+aV9zYik7CisJaWYgKGhwZnNfY2hlY2tfZnJlZV9kbm9kZXMoaS0+aV9zYiwgRlJFRV9ETk9ERVNfQUREKSkgeworCQljID0gMTsKKwkJZ290byByZXQ7CisJfQkKKwlpLT5pX3ZlcnNpb24rKzsKKwljID0gaHBmc19hZGRfdG9fZG5vZGUoaSwgZG5vLCBuYW1lLCBuYW1lbGVuLCBuZXdfZGUsIDApOworCXJldDoKKwlpZiAoIWNkZXB0aCkgaHBmc191bmxvY2tfY3JlYXRpb24oaS0+aV9zYik7CisJcmV0dXJuIGM7Cit9CisKKy8qIAorICogRmluZCBkaXJlbnQgd2l0aCBoaWdoZXIgbmFtZSBpbiAnZnJvbScgc3VidHJlZSBhbmQgbW92ZSBpdCB0byAndG8nIGRub2RlLgorICogUmV0dXJuIHRoZSBkbm9kZSB3ZSBtb3ZlZCBmcm9tICh0byBiZSBjaGVja2VkIGxhdGVyIGlmIGl0J3MgZW1wdHkpCisgKi8KKworc3RhdGljIHNlY25vIG1vdmVfdG9fdG9wKHN0cnVjdCBpbm9kZSAqaSwgZG5vZGVfc2Vjbm8gZnJvbSwgZG5vZGVfc2Vjbm8gdG8pCit7CisJZG5vZGVfc2Vjbm8gZG5vLCBkZG5vOworCWRub2RlX3NlY25vIGNoa191cCA9IHRvOworCXN0cnVjdCBkbm9kZSAqZG5vZGU7CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGUsICpuZGU7CisJaW50IGE7CisJbG9mZl90IHQ7CisJaW50IGMxLCBjMiA9IDA7CisJZG5vID0gZnJvbTsKKwl3aGlsZSAoMSkgeworCQlpZiAoaHBmc19zYihpLT5pX3NiKS0+c2JfY2hrKQorCQkJaWYgKGhwZnNfc3RvcF9jeWNsZXMoaS0+aV9zYiwgZG5vLCAmYzEsICZjMiwgIm1vdmVfdG9fdG9wIikpCisJCQkJcmV0dXJuIDA7CisJCWlmICghKGRub2RlID0gaHBmc19tYXBfZG5vZGUoaS0+aV9zYiwgZG5vLCAmcWJoKSkpIHJldHVybiAwOworCQlpZiAoaHBmc19zYihpLT5pX3NiKS0+c2JfY2hrKSB7CisJCQlpZiAoZG5vZGUtPnVwICE9IGNoa191cCkgeworCQkJCWhwZnNfZXJyb3IoaS0+aV9zYiwgIm1vdmVfdG9fdG9wOiB1cCBwb2ludGVyIGZyb20gJTA4eCBzaG91bGQgYmUgJTA4eCwgaXMgJTA4eCIsCisJCQkJCWRubywgY2hrX3VwLCBkbm9kZS0+dXApOworCQkJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWNoa191cCA9IGRubzsKKwkJfQorCQlpZiAoIShkZSA9IGRub2RlX2xhc3RfZGUoZG5vZGUpKSkgeworCQkJaHBmc19lcnJvcihpLT5pX3NiLCAibW92ZV90b190b3A6IGRub2RlICUwOHggaGFzIG5vIGxhc3QgZGUiLCBkbm8pOworCQkJaHBmc19icmVsc2U0KCZxYmgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFkZS0+ZG93bikgYnJlYWs7CisJCWRubyA9IGRlX2Rvd25fcG9pbnRlcihkZSk7CisJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwl9CisJd2hpbGUgKCEoZGUgPSBkbm9kZV9wcmVfbGFzdF9kZShkbm9kZSkpKSB7CisJCWRub2RlX3NlY25vIHVwID0gZG5vZGUtPnVwOworCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCWhwZnNfZnJlZV9kbm9kZShpLT5pX3NiLCBkbm8pOworCQlpLT5pX3NpemUgLT0gMjA0ODsKKwkJaS0+aV9ibG9ja3MgLT0gNDsKKwkJZm9yX2FsbF9wb3NzKGksIGhwZnNfcG9zX3N1YnN0LCAoKGxvZmZfdClkbm8gPDwgNCkgfCAxLCA1KTsKKwkJaWYgKHVwID09IHRvKSByZXR1cm4gdG87CisJCWlmICghKGRub2RlID0gaHBmc19tYXBfZG5vZGUoaS0+aV9zYiwgdXAsICZxYmgpKSkgcmV0dXJuIDA7CisJCWlmIChkbm9kZS0+cm9vdF9kbm9kZSkgeworCQkJaHBmc19lcnJvcihpLT5pX3NiLCAibW92ZV90b190b3A6IGdvdCB0byByb290X2Rub2RlIHdoaWxlIG1vdmluZyBmcm9tICUwOHggdG8gJTA4eCIsIGZyb20sIHRvKTsKKwkJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJCXJldHVybiAwOworCQl9CisJCWRlID0gZG5vZGVfbGFzdF9kZShkbm9kZSk7CisJCWlmICghZGUgfHwgIWRlLT5kb3duKSB7CisJCQlocGZzX2Vycm9yKGktPmlfc2IsICJtb3ZlX3RvX3RvcDogZG5vZGUgJTA4eCBkb2Vzbid0IHBvaW50IGRvd24gdG8gJTA4eCIsIHVwLCBkbm8pOworCQkJaHBmc19icmVsc2U0KCZxYmgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZG5vZGUtPmZpcnN0X2ZyZWUgLT0gNDsKKwkJZGUtPmxlbmd0aCAtPSA0OworCQlkZS0+ZG93biA9IDA7CisJCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eSgmcWJoKTsKKwkJZG5vID0gdXA7CisJfQorCXQgPSBnZXRfcG9zKGRub2RlLCBkZSk7CisJZm9yX2FsbF9wb3NzKGksIGhwZnNfcG9zX3N1YnN0LCB0LCA0KTsKKwlmb3JfYWxsX3Bvc3MoaSwgaHBmc19wb3Nfc3Vic3QsIHQgKyAxLCA1KTsKKwlpZiAoIShuZGUgPSBrbWFsbG9jKGRlLT5sZW5ndGgsIEdGUF9OT0ZTKSkpIHsKKwkJaHBmc19lcnJvcihpLT5pX3NiLCAib3V0IG9mIG1lbW9yeSBmb3IgZGlyZW50IC0gZGlyZWN0b3J5IHdpbGwgYmUgY29ycnVwdGVkIik7CisJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJcmV0dXJuIDA7CisJfQorCW1lbWNweShuZGUsIGRlLCBkZS0+bGVuZ3RoKTsKKwlkZG5vID0gZGUtPmRvd24gPyBkZV9kb3duX3BvaW50ZXIoZGUpIDogMDsKKwlocGZzX2RlbGV0ZV9kZShpLT5pX3NiLCBkbm9kZSwgZGUpOworCXNldF9sYXN0X3BvaW50ZXIoaS0+aV9zYiwgZG5vZGUsIGRkbm8pOworCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eSgmcWJoKTsKKwlocGZzX2JyZWxzZTQoJnFiaCk7CisJYSA9IGhwZnNfYWRkX3RvX2Rub2RlKGksIHRvLCBuZGUtPm5hbWUsIG5kZS0+bmFtZWxlbiwgbmRlLCBmcm9tKTsKKwlrZnJlZShuZGUpOworCWlmIChhKSByZXR1cm4gMDsKKwlyZXR1cm4gZG5vOworfQorCisvKiAKKyAqIENoZWNrIGlmIGEgZG5vZGUgaXMgZW1wdHkgYW5kIGRlbGV0ZSBpdCBmcm9tIHRoZSB0cmVlCisgKiAoY2hrZHNrIGRvZXNuJ3QgbGlrZSBlbXB0eSBkbm9kZXMpCisgKi8KKworc3RhdGljIHZvaWQgZGVsZXRlX2VtcHR5X2Rub2RlKHN0cnVjdCBpbm9kZSAqaSwgZG5vZGVfc2Vjbm8gZG5vKQoreworCXN0cnVjdCBocGZzX2lub2RlX2luZm8gKmhwZnNfaW5vZGUgPSBocGZzX2koaSk7CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCXN0cnVjdCBkbm9kZSAqZG5vZGU7CisJZG5vZGVfc2Vjbm8gZG93biwgdXAsIG5kb3duOworCWludCBwOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGU7CisJaW50IGMxLCBjMiA9IDA7CisJdHJ5X2l0X2FnYWluOgorCWlmIChocGZzX3N0b3BfY3ljbGVzKGktPmlfc2IsIGRubywgJmMxLCAmYzIsICJkZWxldGVfZW1wdHlfZG5vZGUiKSkgcmV0dXJuOworCWlmICghKGRub2RlID0gaHBmc19tYXBfZG5vZGUoaS0+aV9zYiwgZG5vLCAmcWJoKSkpIHJldHVybjsKKwlpZiAoZG5vZGUtPmZpcnN0X2ZyZWUgPiA1NikgZ290byBlbmQ7CisJaWYgKGRub2RlLT5maXJzdF9mcmVlID09IDUyIHx8IGRub2RlLT5maXJzdF9mcmVlID09IDU2KSB7CisJCXN0cnVjdCBocGZzX2RpcmVudCAqZGVfZW5kOworCQlpbnQgcm9vdCA9IGRub2RlLT5yb290X2Rub2RlOworCQl1cCA9IGRub2RlLT51cDsKKwkJZGUgPSBkbm9kZV9maXJzdF9kZShkbm9kZSk7CisJCWRvd24gPSBkZS0+ZG93biA/IGRlX2Rvd25fcG9pbnRlcihkZSkgOiAwOworCQlpZiAoaHBmc19zYihpLT5pX3NiKS0+c2JfY2hrKSBpZiAocm9vdCAmJiAhZG93bikgeworCQkJaHBmc19lcnJvcihpLT5pX3NiLCAiZGVsZXRlX2VtcHR5X2Rub2RlOiByb290IGRub2RlICUwOHggaXMgZW1wdHkiLCBkbm8pOworCQkJZ290byBlbmQ7CisJCX0KKwkJaHBmc19icmVsc2U0KCZxYmgpOworCQlocGZzX2ZyZWVfZG5vZGUoaS0+aV9zYiwgZG5vKTsKKwkJaS0+aV9zaXplIC09IDIwNDg7CisJCWktPmlfYmxvY2tzIC09IDQ7CisJCWlmIChyb290KSB7CisJCQlzdHJ1Y3QgZm5vZGUgKmZub2RlOworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwkJCXN0cnVjdCBkbm9kZSAqZDE7CisJCQlzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCBxYmgxOworCQkJaWYgKGhwZnNfc2IoaS0+aV9zYiktPnNiX2NoaykgaWYgKHVwICE9IGktPmlfaW5vKSB7CisJCQkJaHBmc19lcnJvcihpLT5pX3NiLCAiYmFkIHBvaW50ZXIgdG8gZm5vZGUsIGRub2RlICUwOHgsIHBvaW50aW5nIHRvICUwOHgsIHNob3VsZCBiZSAlMDh4IiwgZG5vLCB1cCwgaS0+aV9pbm8pOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmICgoZDEgPSBocGZzX21hcF9kbm9kZShpLT5pX3NiLCBkb3duLCAmcWJoMSkpKSB7CisJCQkJZDEtPnVwID0gdXA7CisJCQkJZDEtPnJvb3RfZG5vZGUgPSAxOworCQkJCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eSgmcWJoMSk7CisJCQkJaHBmc19icmVsc2U0KCZxYmgxKTsKKwkJCX0KKwkJCWlmICgoZm5vZGUgPSBocGZzX21hcF9mbm9kZShpLT5pX3NiLCB1cCwgJmJoKSkpIHsKKwkJCQlmbm9kZS0+dS5leHRlcm5hbFswXS5kaXNrX3NlY25vID0gZG93bjsKKwkJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQkJYnJlbHNlKGJoKTsKKwkJCX0KKwkJCWhwZnNfaW5vZGUtPmlfZG5vID0gZG93bjsKKwkJCWZvcl9hbGxfcG9zcyhpLCBocGZzX3Bvc19zdWJzdCwgKChsb2ZmX3QpZG5vIDw8IDQpIHwgMSwgKGxvZmZfdCkgMTIpOworCQkJcmV0dXJuOworCQl9CisJCWlmICghKGRub2RlID0gaHBmc19tYXBfZG5vZGUoaS0+aV9zYiwgdXAsICZxYmgpKSkgcmV0dXJuOworCQlwID0gMTsKKwkJZGVfZW5kID0gZG5vZGVfZW5kX2RlKGRub2RlKTsKKwkJZm9yIChkZSA9IGRub2RlX2ZpcnN0X2RlKGRub2RlKTsgZGUgPCBkZV9lbmQ7IGRlID0gZGVfbmV4dF9kZShkZSksIHArKykKKwkJCWlmIChkZS0+ZG93bikgaWYgKGRlX2Rvd25fcG9pbnRlcihkZSkgPT0gZG5vKSBnb3RvIGZuZDsKKwkJaHBmc19lcnJvcihpLT5pX3NiLCAiZGVsZXRlX2VtcHR5X2Rub2RlOiBwb2ludGVyIHRvIGRub2RlICUwOHggbm90IGZvdW5kIGluIGRub2RlICUwOHgiLCBkbm8sIHVwKTsKKwkJZ290byBlbmQ7CisJCWZuZDoKKwkJZm9yX2FsbF9wb3NzKGksIGhwZnNfcG9zX3N1YnN0LCAoKGxvZmZfdClkbm8gPDwgNCkgfCAxLCAoKGxvZmZfdCl1cCA8PCA0KSB8IHApOworCQlpZiAoIWRvd24pIHsKKwkJCWRlLT5kb3duID0gMDsKKwkJCWRlLT5sZW5ndGggLT0gNDsKKwkJCWRub2RlLT5maXJzdF9mcmVlIC09IDQ7CisJCQltZW1tb3ZlKGRlX25leHRfZGUoZGUpLCAoY2hhciAqKWRlX25leHRfZGUoZGUpICsgNCwKKwkJCQkoY2hhciAqKWRub2RlICsgZG5vZGUtPmZpcnN0X2ZyZWUgLSAoY2hhciAqKWRlX25leHRfZGUoZGUpKTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBkbm9kZSAqZDE7CisJCQlzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCBxYmgxOworCQkJKihkbm9kZV9zZWNubyAqKSAoKHZvaWQgKikgZGUgKyBkZS0+bGVuZ3RoIC0gNCkgPSBkb3duOworCQkJaWYgKChkMSA9IGhwZnNfbWFwX2Rub2RlKGktPmlfc2IsIGRvd24sICZxYmgxKSkpIHsKKwkJCQlkMS0+dXAgPSB1cDsKKwkJCQlocGZzX21hcmtfNGJ1ZmZlcnNfZGlydHkoJnFiaDEpOworCQkJCWhwZnNfYnJlbHNlNCgmcWJoMSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlocGZzX2Vycm9yKGktPmlfc2IsICJkZWxldGVfZW1wdHlfZG5vZGU6IGRub2RlICUwOHgsIGZpcnN0X2ZyZWUgPT0gJTAzeCIsIGRubywgZG5vZGUtPmZpcnN0X2ZyZWUpOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAoIWRlLT5sYXN0KSB7CisJCXN0cnVjdCBocGZzX2RpcmVudCAqZGVfbmV4dCA9IGRlX25leHRfZGUoZGUpOworCQlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlX2NwOworCQlzdHJ1Y3QgZG5vZGUgKmQxOworCQlzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCBxYmgxOworCQlpZiAoIWRlX25leHQtPmRvd24pIGdvdG8gZW5kbTsKKwkJbmRvd24gPSBkZV9kb3duX3BvaW50ZXIoZGVfbmV4dCk7CisJCWlmICghKGRlX2NwID0ga21hbGxvYyhkZS0+bGVuZ3RoLCBHRlBfTk9GUykpKSB7CisJCQlwcmludGsoIkhQRlM6IG91dCBvZiBtZW1vcnkgZm9yIGR0cmVlIGJhbGFuY2luZ1xuIik7CisJCQlnb3RvIGVuZG07CisJCX0KKwkJbWVtY3B5KGRlX2NwLCBkZSwgZGUtPmxlbmd0aCk7CisJCWhwZnNfZGVsZXRlX2RlKGktPmlfc2IsIGRub2RlLCBkZSk7CisJCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eSgmcWJoKTsKKwkJaHBmc19icmVsc2U0KCZxYmgpOworCQlmb3JfYWxsX3Bvc3MoaSwgaHBmc19wb3Nfc3Vic3QsICgobG9mZl90KXVwIDw8IDQpIHwgcCwgNCk7CisJCWZvcl9hbGxfcG9zcyhpLCBocGZzX3Bvc19kZWwsICgobG9mZl90KXVwIDw8IDQpIHwgcCwgMSk7CisJCWlmIChkZV9jcC0+ZG93bikgaWYgKChkMSA9IGhwZnNfbWFwX2Rub2RlKGktPmlfc2IsIGRlX2Rvd25fcG9pbnRlcihkZV9jcCksICZxYmgxKSkpIHsKKwkJCWQxLT51cCA9IG5kb3duOworCQkJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgxKTsKKwkJCWhwZnNfYnJlbHNlNCgmcWJoMSk7CisJCX0KKwkJaHBmc19hZGRfdG9fZG5vZGUoaSwgbmRvd24sIGRlX2NwLT5uYW1lLCBkZV9jcC0+bmFtZWxlbiwgZGVfY3AsIGRlX2NwLT5kb3duID8gZGVfZG93bl9wb2ludGVyKGRlX2NwKSA6IDApOworCQkvKnByaW50aygiVVAtVE8tRE5PREU6ICUwOHggKG5kb3duID0gJTA4eCwgZG93biA9ICUwOHgsIGRubyA9ICUwOHgpXG4iLCB1cCwgbmRvd24sIGRvd24sIGRubyk7Ki8KKwkJZG5vID0gdXA7CisJCWtmcmVlKGRlX2NwKTsKKwkJZ290byB0cnlfaXRfYWdhaW47CisJfSBlbHNlIHsKKwkJc3RydWN0IGhwZnNfZGlyZW50ICpkZV9wcmV2ID0gZG5vZGVfcHJlX2xhc3RfZGUoZG5vZGUpOworCQlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlX2NwOworCQlzdHJ1Y3QgZG5vZGUgKmQxOworCQlzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCBxYmgxOworCQlkbm9kZV9zZWNubyBkbHA7CisJCWlmICghZGVfcHJldikgeworCQkJaHBmc19lcnJvcihpLT5pX3NiLCAiZGVsZXRlX2VtcHR5X2Rub2RlOiBlbXB0eSBkbm9kZSAlMDh4IiwgdXApOworCQkJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgpOworCQkJaHBmc19icmVsc2U0KCZxYmgpOworCQkJZG5vID0gdXA7CisJCQlnb3RvIHRyeV9pdF9hZ2FpbjsKKwkJfQorCQlpZiAoIWRlX3ByZXYtPmRvd24pIGdvdG8gZW5kbTsKKwkJbmRvd24gPSBkZV9kb3duX3BvaW50ZXIoZGVfcHJldik7CisJCWlmICgoZDEgPSBocGZzX21hcF9kbm9kZShpLT5pX3NiLCBuZG93biwgJnFiaDEpKSkgeworCQkJc3RydWN0IGhwZnNfZGlyZW50ICpkZWwgPSBkbm9kZV9sYXN0X2RlKGQxKTsKKwkJCWRscCA9IGRlbC0+ZG93biA/IGRlX2Rvd25fcG9pbnRlcihkZWwpIDogMDsKKwkJCWlmICghZGxwICYmIGRvd24pIHsKKwkJCQlpZiAoZDEtPmZpcnN0X2ZyZWUgPiAyMDQ0KSB7CisJCQkJCWlmIChocGZzX3NiKGktPmlfc2IpLT5zYl9jaGsgPj0gMikgeworCQkJCQkJcHJpbnRrKCJIUEZTOiB3YXJuaW5nOiB1bmJhbGFuY2VkIGRub2RlIHRyZWUsIHNlZSBocGZzLnR4dCA0IG1vcmUgaW5mb1xuIik7CisJCQkJCQlwcmludGsoIkhQRlM6IHdhcm5pbmc6IHRlcm1pbmF0aW5nIGJhbGFuY2luZyBvcGVyYXRpb25cbiIpOworCQkJCQl9CisJCQkJCWhwZnNfYnJlbHNlNCgmcWJoMSk7CisJCQkJCWdvdG8gZW5kbTsKKwkJCQl9CisJCQkJaWYgKGhwZnNfc2IoaS0+aV9zYiktPnNiX2NoayA+PSAyKSB7CisJCQkJCXByaW50aygiSFBGUzogd2FybmluZzogdW5iYWxhbmNlZCBkbm9kZSB0cmVlLCBzZWUgaHBmcy50eHQgNCBtb3JlIGluZm9cbiIpOworCQkJCQlwcmludGsoIkhQRlM6IHdhcm5pbmc6IGdvaW4nb25cbiIpOworCQkJCX0KKwkJCQlkZWwtPmxlbmd0aCArPSA0OworCQkJCWRlbC0+ZG93biA9IDE7CisJCQkJZDEtPmZpcnN0X2ZyZWUgKz0gNDsKKwkJCX0KKwkJCWlmIChkbHAgJiYgIWRvd24pIHsKKwkJCQlkZWwtPmxlbmd0aCAtPSA0OworCQkJCWRlbC0+ZG93biA9IDA7CisJCQkJZDEtPmZpcnN0X2ZyZWUgLT0gNDsKKwkJCX0gZWxzZSBpZiAoZG93bikKKwkJCQkqKGRub2RlX3NlY25vICopICgodm9pZCAqKSBkZWwgKyBkZWwtPmxlbmd0aCAtIDQpID0gZG93bjsKKwkJfSBlbHNlIGdvdG8gZW5kbTsKKwkJaWYgKCEoZGVfY3AgPSBrbWFsbG9jKGRlX3ByZXYtPmxlbmd0aCwgR0ZQX05PRlMpKSkgeworCQkJcHJpbnRrKCJIUEZTOiBvdXQgb2YgbWVtb3J5IGZvciBkdHJlZSBiYWxhbmNpbmdcbiIpOworCQkJaHBmc19icmVsc2U0KCZxYmgxKTsKKwkJCWdvdG8gZW5kbTsKKwkJfQorCQlocGZzX21hcmtfNGJ1ZmZlcnNfZGlydHkoJnFiaDEpOworCQlocGZzX2JyZWxzZTQoJnFiaDEpOworCQltZW1jcHkoZGVfY3AsIGRlX3ByZXYsIGRlX3ByZXYtPmxlbmd0aCk7CisJCWhwZnNfZGVsZXRlX2RlKGktPmlfc2IsIGRub2RlLCBkZV9wcmV2KTsKKwkJaWYgKCFkZV9wcmV2LT5kb3duKSB7CisJCQlkZV9wcmV2LT5sZW5ndGggKz0gNDsKKwkJCWRlX3ByZXYtPmRvd24gPSAxOworCQkJZG5vZGUtPmZpcnN0X2ZyZWUgKz0gNDsKKwkJfQorCQkqKGRub2RlX3NlY25vICopICgodm9pZCAqKSBkZV9wcmV2ICsgZGVfcHJldi0+bGVuZ3RoIC0gNCkgPSBuZG93bjsKKwkJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgpOworCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCWZvcl9hbGxfcG9zcyhpLCBocGZzX3Bvc19zdWJzdCwgKChsb2ZmX3QpdXAgPDwgNCkgfCAocCAtIDEpLCA0KTsKKwkJZm9yX2FsbF9wb3NzKGksIGhwZnNfcG9zX3N1YnN0LCAoKGxvZmZfdCl1cCA8PCA0KSB8IHAsICgobG9mZl90KXVwIDw8IDQpIHwgKHAgLSAxKSk7CisJCWlmIChkb3duKSBpZiAoKGQxID0gaHBmc19tYXBfZG5vZGUoaS0+aV9zYiwgZGVfZG93bl9wb2ludGVyKGRlKSwgJnFiaDEpKSkgeworCQkJZDEtPnVwID0gbmRvd247CisJCQlocGZzX21hcmtfNGJ1ZmZlcnNfZGlydHkoJnFiaDEpOworCQkJaHBmc19icmVsc2U0KCZxYmgxKTsKKwkJfQorCQlocGZzX2FkZF90b19kbm9kZShpLCBuZG93biwgZGVfY3AtPm5hbWUsIGRlX2NwLT5uYW1lbGVuLCBkZV9jcCwgZGxwKTsKKwkJZG5vID0gdXA7CisJCWtmcmVlKGRlX2NwKTsKKwkJZ290byB0cnlfaXRfYWdhaW47CisJfQorCWVuZG06CisJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgpOworCWVuZDoKKwlocGZzX2JyZWxzZTQoJnFiaCk7Cit9CisKKworLyogRGVsZXRlIGRpcmVudCBmcm9tIGRpcmVjdG9yeSAqLworCitpbnQgaHBmc19yZW1vdmVfZGlyZW50KHN0cnVjdCBpbm9kZSAqaSwgZG5vZGVfc2Vjbm8gZG5vLCBzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlLAorCQkgICAgICAgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKnFiaCwgaW50IGRlcHRoKQoreworCXN0cnVjdCBkbm9kZSAqZG5vZGUgPSBxYmgtPmRhdGE7CisJZG5vZGVfc2Vjbm8gZG93biA9IDA7CisJaW50IGxvY2sgPSAwOworCWxvZmZfdCB0OworCWlmIChkZS0+Zmlyc3QgfHwgZGUtPmxhc3QpIHsKKwkJaHBmc19lcnJvcihpLT5pX3NiLCAiaHBmc19yZW1vdmVfZGlyZW50OiBhdHRlbXB0IHRvIGRlbGV0ZSBmaXJzdCBvciBsYXN0IGRpcmVudCBpbiBkbm9kZSAlMDh4IiwgZG5vKTsKKwkJaHBmc19icmVsc2U0KHFiaCk7CisJCXJldHVybiAxOworCX0KKwlpZiAoZGUtPmRvd24pIGRvd24gPSBkZV9kb3duX3BvaW50ZXIoZGUpOworCWlmIChkZXB0aCAmJiAoZGUtPmRvd24gfHwgKGRlID09IGRub2RlX2ZpcnN0X2RlKGRub2RlKSAmJiBkZV9uZXh0X2RlKGRlKS0+bGFzdCkpKSB7CisJCWxvY2sgPSAxOworCQlocGZzX2xvY2tfY3JlYXRpb24oaS0+aV9zYik7CisJCWlmIChocGZzX2NoZWNrX2ZyZWVfZG5vZGVzKGktPmlfc2IsIEZSRUVfRE5PREVTX0RFTCkpIHsKKwkJCWhwZnNfYnJlbHNlNChxYmgpOworCQkJaHBmc191bmxvY2tfY3JlYXRpb24oaS0+aV9zYik7CisJCQlyZXR1cm4gMjsKKwkJfQorCX0KKwlpLT5pX3ZlcnNpb24rKzsKKwlmb3JfYWxsX3Bvc3MoaSwgaHBmc19wb3NfZGVsLCAodCA9IGdldF9wb3MoZG5vZGUsIGRlKSkgKyAxLCAxKTsKKwlocGZzX2RlbGV0ZV9kZShpLT5pX3NiLCBkbm9kZSwgZGUpOworCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eShxYmgpOworCWhwZnNfYnJlbHNlNChxYmgpOworCWlmIChkb3duKSB7CisJCWRub2RlX3NlY25vIGEgPSBtb3ZlX3RvX3RvcChpLCBkb3duLCBkbm8pOworCQlmb3JfYWxsX3Bvc3MoaSwgaHBmc19wb3Nfc3Vic3QsIDUsIHQpOworCQlpZiAoYSkgZGVsZXRlX2VtcHR5X2Rub2RlKGksIGEpOworCQlpZiAobG9jaykgaHBmc191bmxvY2tfY3JlYXRpb24oaS0+aV9zYik7CisJCXJldHVybiAhYTsKKwl9CisJZGVsZXRlX2VtcHR5X2Rub2RlKGksIGRubyk7CisJaWYgKGxvY2spIGhwZnNfdW5sb2NrX2NyZWF0aW9uKGktPmlfc2IpOworCXJldHVybiAwOworfQorCit2b2lkIGhwZnNfY291bnRfZG5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgZG5vZGVfc2Vjbm8gZG5vLCBpbnQgKm5fZG5vZGVzLAorCQkgICAgICAgaW50ICpuX3N1YmRpcnMsIGludCAqbl9pdGVtcykKK3sKKwlzdHJ1Y3QgZG5vZGUgKmRub2RlOworCXN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkIHFiaDsKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlOworCWRub2RlX3NlY25vIHB0ciwgb2RubyA9IDA7CisJaW50IGMxLCBjMiA9IDA7CisJaW50IGQxLCBkMiA9IDA7CisJZ29fZG93bjoKKwlpZiAobl9kbm9kZXMpICgqbl9kbm9kZXMpKys7CisJaWYgKGhwZnNfc2IocyktPnNiX2NoaykKKwkJaWYgKGhwZnNfc3RvcF9jeWNsZXMocywgZG5vLCAmYzEsICZjMiwgImhwZnNfY291bnRfZG5vZGVzICMxIikpIHJldHVybjsKKwlwdHIgPSAwOworCWdvX3VwOgorCWlmICghKGRub2RlID0gaHBmc19tYXBfZG5vZGUocywgZG5vLCAmcWJoKSkpIHJldHVybjsKKwlpZiAoaHBmc19zYihzKS0+c2JfY2hrKSBpZiAob2RubyAmJiBvZG5vICE9IC0xICYmIGRub2RlLT51cCAhPSBvZG5vKQorCQlocGZzX2Vycm9yKHMsICJocGZzX2NvdW50X2Rub2RlczogYmFkIHVwIHBvaW50ZXI7IGRub2RlICUwOHgsIGRvd24gJTA4eCBwb2ludHMgdG8gJTA4eCIsIG9kbm8sIGRubywgZG5vZGUtPnVwKTsKKwlkZSA9IGRub2RlX2ZpcnN0X2RlKGRub2RlKTsKKwlpZiAocHRyKSB3aGlsZSgxKSB7CisJCWlmIChkZS0+ZG93bikgaWYgKGRlX2Rvd25fcG9pbnRlcihkZSkgPT0gcHRyKSBnb3RvIHByb2Nlc3NfZGU7CisJCWlmIChkZS0+bGFzdCkgeworCQkJaHBmc19icmVsc2U0KCZxYmgpOworCQkJaHBmc19lcnJvcihzLCAiaHBmc19jb3VudF9kbm9kZXM6IHBvaW50ZXIgdG8gZG5vZGUgJTA4eCBub3QgZm91bmQgaW4gZG5vZGUgJTA4eCwgZ290IGhlcmUgZnJvbSAlMDh4IiwKKwkJCQlwdHIsIGRubywgb2Rubyk7CisJCQlyZXR1cm47CisJCX0KKwkJZGUgPSBkZV9uZXh0X2RlKGRlKTsKKwl9CisJbmV4dF9kZToKKwlpZiAoZGUtPmRvd24pIHsKKwkJb2RubyA9IGRubzsKKwkJZG5vID0gZGVfZG93bl9wb2ludGVyKGRlKTsKKwkJaHBmc19icmVsc2U0KCZxYmgpOworCQlnb3RvIGdvX2Rvd247CisJfQorCXByb2Nlc3NfZGU6CisJaWYgKCFkZS0+Zmlyc3QgJiYgIWRlLT5sYXN0ICYmIGRlLT5kaXJlY3RvcnkgJiYgbl9zdWJkaXJzKSAoKm5fc3ViZGlycykrKzsKKwlpZiAoIWRlLT5maXJzdCAmJiAhZGUtPmxhc3QgJiYgbl9pdGVtcykgKCpuX2l0ZW1zKSsrOworCWlmICgoZGUgPSBkZV9uZXh0X2RlKGRlKSkgPCBkbm9kZV9lbmRfZGUoZG5vZGUpKSBnb3RvIG5leHRfZGU7CisJcHRyID0gZG5vOworCWRubyA9IGRub2RlLT51cDsKKwlpZiAoZG5vZGUtPnJvb3RfZG5vZGUpIHsKKwkJaHBmc19icmVsc2U0KCZxYmgpOworCQlyZXR1cm47CisJfQorCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwlpZiAoaHBmc19zYihzKS0+c2JfY2hrKQorCQlpZiAoaHBmc19zdG9wX2N5Y2xlcyhzLCBwdHIsICZkMSwgJmQyLCAiaHBmc19jb3VudF9kbm9kZXMgIzIiKSkgcmV0dXJuOworCW9kbm8gPSAtMTsKKwlnb3RvIGdvX3VwOworfQorCitzdGF0aWMgc3RydWN0IGhwZnNfZGlyZW50ICptYXBfbnRoX2RpcmVudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGRub2RlX3NlY25vIGRubywgaW50IG4sCisJCQkJCSAgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKnFiaCwgc3RydWN0IGRub2RlICoqZG4pCit7CisJaW50IGk7CisJc3RydWN0IGhwZnNfZGlyZW50ICpkZSwgKmRlX2VuZDsKKwlzdHJ1Y3QgZG5vZGUgKmRub2RlOworCWRub2RlID0gaHBmc19tYXBfZG5vZGUocywgZG5vLCBxYmgpOworCWlmICghZG5vZGUpIHJldHVybiBOVUxMOworCWlmIChkbikgKmRuPWRub2RlOworCWRlID0gZG5vZGVfZmlyc3RfZGUoZG5vZGUpOworCWRlX2VuZCA9IGRub2RlX2VuZF9kZShkbm9kZSk7CisJZm9yIChpID0gMTsgZGUgPCBkZV9lbmQ7IGkrKywgZGUgPSBkZV9uZXh0X2RlKGRlKSkgeworCQlpZiAoaSA9PSBuKSB7CisJCQlyZXR1cm4gZGU7CisJCX0JCisJCWlmIChkZS0+bGFzdCkgYnJlYWs7CisJfQorCWhwZnNfYnJlbHNlNChxYmgpOworCWhwZnNfZXJyb3IocywgIm1hcF9udGhfZGlyZW50OiBuIHRvbyBoaWdoOyBkbm9kZSA9ICUwOHgsIHJlcXVlc3RlZCAlMDh4IiwgZG5vLCBuKTsKKwlyZXR1cm4gTlVMTDsKK30KKworZG5vZGVfc2Vjbm8gaHBmc19kZV9hc19kb3duX2FzX3Bvc3NpYmxlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgZG5vZGVfc2Vjbm8gZG5vKQoreworCXN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkIHFiaDsKKwlkbm9kZV9zZWNubyBkID0gZG5vOworCWRub2RlX3NlY25vIHVwID0gMDsKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlOworCWludCBjMSwgYzIgPSAwOworCisJYWdhaW46CisJaWYgKGhwZnNfc2IocyktPnNiX2NoaykKKwkJaWYgKGhwZnNfc3RvcF9jeWNsZXMocywgZCwgJmMxLCAmYzIsICJocGZzX2RlX2FzX2Rvd25fYXNfcG9zc2libGUiKSkKKwkJCXJldHVybiBkOworCWlmICghKGRlID0gbWFwX250aF9kaXJlbnQocywgZCwgMSwgJnFiaCwgTlVMTCkpKSByZXR1cm4gZG5vOworCWlmIChocGZzX3NiKHMpLT5zYl9jaGspCisJCWlmICh1cCAmJiAoKHN0cnVjdCBkbm9kZSAqKXFiaC5kYXRhKS0+dXAgIT0gdXApCisJCQlocGZzX2Vycm9yKHMsICJocGZzX2RlX2FzX2Rvd25fYXNfcG9zc2libGU6IGJhZCB1cCBwb2ludGVyOyBkbm9kZSAlMDh4LCBkb3duICUwOHggcG9pbnRzIHRvICUwOHgiLCB1cCwgZCwgKChzdHJ1Y3QgZG5vZGUgKilxYmguZGF0YSktPnVwKTsKKwlpZiAoIWRlLT5kb3duKSB7CisJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJcmV0dXJuIGQ7CisJfQorCXVwID0gZDsKKwlkID0gZGVfZG93bl9wb2ludGVyKGRlKTsKKwlocGZzX2JyZWxzZTQoJnFiaCk7CisJZ290byBhZ2FpbjsKK30KKworc3RydWN0IGhwZnNfZGlyZW50ICptYXBfcG9zX2RpcmVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgKnBvc3AsCisJCQkJICAgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKnFiaCkKK3sKKwlsb2ZmX3QgcG9zOworCXVuc2lnbmVkIGM7CisJZG5vZGVfc2Vjbm8gZG5vOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGUsICpkOworCXN0cnVjdCBocGZzX2RpcmVudCAqdXBfZGU7CisJc3RydWN0IGhwZnNfZGlyZW50ICplbmRfdXBfZGU7CisJc3RydWN0IGRub2RlICpkbm9kZTsKKwlzdHJ1Y3QgZG5vZGUgKnVwX2Rub2RlOworCXN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkIHFiaDA7CisKKwlwb3MgPSAqcG9zcDsKKwlkbm8gPSBwb3MgPj4gNiA8PCAyOworCXBvcyAmPSAwNzc7CisJaWYgKCEoZGUgPSBtYXBfbnRoX2RpcmVudChpbm9kZS0+aV9zYiwgZG5vLCBwb3MsIHFiaCwgJmRub2RlKSkpCisJCWdvdG8gYmFpbDsKKworCS8qIEdvaW5nIHRvIHRoZSBuZXh0IGRpcmVudCAqLworCWlmICgoZCA9IGRlX25leHRfZGUoZGUpKSA8IGRub2RlX2VuZF9kZShkbm9kZSkpIHsKKwkJaWYgKCEoKysqcG9zcCAmIDA3NykpIHsKKwkJCWhwZnNfZXJyb3IoaW5vZGUtPmlfc2IsICJtYXBfcG9zX2RpcmVudDogcG9zIGNyb3NzZWQgZG5vZGUgYm91bmRhcnk7IHBvcyA9ICUwOHgiLCAqcG9zcCk7CisJCQlnb3RvIGJhaWw7CisJCX0KKwkJLyogV2UncmUgZ29pbmcgZG93biB0aGUgdHJlZSAqLworCQlpZiAoZC0+ZG93bikgeworCQkJKnBvc3AgPSAoKGxvZmZfdCkgaHBmc19kZV9hc19kb3duX2FzX3Bvc3NpYmxlKGlub2RlLT5pX3NiLCBkZV9kb3duX3BvaW50ZXIoZCkpIDw8IDQpICsgMTsKKwkJfQorCQorCQlyZXR1cm4gZGU7CisJfQorCisJLyogR29pbmcgdXAgKi8KKwlpZiAoZG5vZGUtPnJvb3RfZG5vZGUpIGdvdG8gYmFpbDsKKworCWlmICghKHVwX2Rub2RlID0gaHBmc19tYXBfZG5vZGUoaW5vZGUtPmlfc2IsIGRub2RlLT51cCwgJnFiaDApKSkKKwkJZ290byBiYWlsOworCisJZW5kX3VwX2RlID0gZG5vZGVfZW5kX2RlKHVwX2Rub2RlKTsKKwljID0gMDsKKwlmb3IgKHVwX2RlID0gZG5vZGVfZmlyc3RfZGUodXBfZG5vZGUpOyB1cF9kZSA8IGVuZF91cF9kZTsKKwkgICAgIHVwX2RlID0gZGVfbmV4dF9kZSh1cF9kZSkpIHsKKwkJaWYgKCEoKytjICYgMDc3KSkgaHBmc19lcnJvcihpbm9kZS0+aV9zYiwKKwkJCSJtYXBfcG9zX2RpcmVudDogcG9zIGNyb3NzZWQgZG5vZGUgYm91bmRhcnk7IGRub2RlID0gJTA4eCIsIGRub2RlLT51cCk7CisJCWlmICh1cF9kZS0+ZG93biAmJiBkZV9kb3duX3BvaW50ZXIodXBfZGUpID09IGRubykgeworCQkJKnBvc3AgPSAoKGxvZmZfdCkgZG5vZGUtPnVwIDw8IDQpICsgYzsKKwkJCWhwZnNfYnJlbHNlNCgmcWJoMCk7CisJCQlyZXR1cm4gZGU7CisJCX0KKwl9CisJCisJaHBmc19lcnJvcihpbm9kZS0+aV9zYiwgIm1hcF9wb3NfZGlyZW50OiBwb2ludGVyIHRvIGRub2RlICUwOHggbm90IGZvdW5kIGluIHBhcmVudCBkbm9kZSAlMDh4IiwKKwkJZG5vLCBkbm9kZS0+dXApOworCWhwZnNfYnJlbHNlNCgmcWJoMCk7CisJCisJYmFpbDoKKwkqcG9zcCA9IDEyOworCXJldHVybiBkZTsKK30KKworLyogRmluZCBhIGRpcmVudCBpbiB0cmVlICovCisKK3N0cnVjdCBocGZzX2RpcmVudCAqbWFwX2RpcmVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBkbm9kZV9zZWNubyBkbm8sIGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxlbiwKKwkJCSAgICAgICBkbm9kZV9zZWNubyAqZGQsIHN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkICpxYmgpCit7CisJc3RydWN0IGRub2RlICpkbm9kZTsKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGVfZW5kOworCWludCBjMSwgYzIgPSAwOworCisJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKSBocGZzX2Vycm9yKGlub2RlLT5pX3NiLCAibWFwX2RpcmVudDogbm90IGEgZGlyZWN0b3J5XG4iKTsKKwlhZ2FpbjoKKwlpZiAoaHBmc19zYihpbm9kZS0+aV9zYiktPnNiX2NoaykKKwkJaWYgKGhwZnNfc3RvcF9jeWNsZXMoaW5vZGUtPmlfc2IsIGRubywgJmMxLCAmYzIsICJtYXBfZGlyZW50IikpIHJldHVybiBOVUxMOworCWlmICghKGRub2RlID0gaHBmc19tYXBfZG5vZGUoaW5vZGUtPmlfc2IsIGRubywgcWJoKSkpIHJldHVybiBOVUxMOworCQorCWRlX2VuZCA9IGRub2RlX2VuZF9kZShkbm9kZSk7CisJZm9yIChkZSA9IGRub2RlX2ZpcnN0X2RlKGRub2RlKTsgZGUgPCBkZV9lbmQ7IGRlID0gZGVfbmV4dF9kZShkZSkpIHsKKwkJaW50IHQgPSBocGZzX2NvbXBhcmVfbmFtZXMoaW5vZGUtPmlfc2IsIG5hbWUsIGxlbiwgZGUtPm5hbWUsIGRlLT5uYW1lbGVuLCBkZS0+bGFzdCk7CisJCWlmICghdCkgeworCQkJaWYgKGRkKSAqZGQgPSBkbm87CisJCQlyZXR1cm4gZGU7CisJCX0KKwkJaWYgKHQgPCAwKSB7CisJCQlpZiAoZGUtPmRvd24pIHsKKwkJCQlkbm8gPSBkZV9kb3duX3BvaW50ZXIoZGUpOworCQkJCWhwZnNfYnJlbHNlNChxYmgpOworCQkJCWdvdG8gYWdhaW47CisJCQl9CisJCWJyZWFrOworCQl9CisJfQorCWhwZnNfYnJlbHNlNChxYmgpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogUmVtb3ZlIGVtcHR5IGRpcmVjdG9yeS4gSW4gbm9ybWFsIGNhc2VzIGl0IGlzIG9ubHkgb25lIGRub2RlIHdpdGggdHdvCisgKiBlbnRyaWVzLCBidXQgd2UgbXVzdCBoYW5kbGUgYWxzbyBzdWNoIG9ic2N1cmUgY2FzZXMgd2hlbiBpdCdzIGEgdHJlZQorICogb2YgZW1wdHkgZG5vZGVzLgorICovCisKK3ZvaWQgaHBmc19yZW1vdmVfZHRyZWUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBkbm9kZV9zZWNubyBkbm8pCit7CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCXN0cnVjdCBkbm9kZSAqZG5vZGU7CisJc3RydWN0IGhwZnNfZGlyZW50ICpkZTsKKwlkbm9kZV9zZWNubyBkMSwgZDIsIHJkbm8gPSBkbm87CisJd2hpbGUgKDEpIHsKKwkJaWYgKCEoZG5vZGUgPSBocGZzX21hcF9kbm9kZShzLCBkbm8sICZxYmgpKSkgcmV0dXJuOworCQlkZSA9IGRub2RlX2ZpcnN0X2RlKGRub2RlKTsKKwkJaWYgKGRlLT5sYXN0KSB7CisJCQlpZiAoZGUtPmRvd24pIGQxID0gZGVfZG93bl9wb2ludGVyKGRlKTsKKwkJCWVsc2UgZ290byBlcnJvcjsKKwkJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJCWhwZnNfZnJlZV9kbm9kZShzLCBkbm8pOworCQkJZG5vID0gZDE7CisJCX0gZWxzZSBicmVhazsKKwl9CisJaWYgKCFkZS0+Zmlyc3QpIGdvdG8gZXJyb3I7CisJZDEgPSBkZS0+ZG93biA/IGRlX2Rvd25fcG9pbnRlcihkZSkgOiAwOworCWRlID0gZGVfbmV4dF9kZShkZSk7CisJaWYgKCFkZS0+bGFzdCkgZ290byBlcnJvcjsKKwlkMiA9IGRlLT5kb3duID8gZGVfZG93bl9wb2ludGVyKGRlKSA6IDA7CisJaHBmc19icmVsc2U0KCZxYmgpOworCWhwZnNfZnJlZV9kbm9kZShzLCBkbm8pOworCWRvIHsKKwkJd2hpbGUgKGQxKSB7CisJCQlpZiAoIShkbm9kZSA9IGhwZnNfbWFwX2Rub2RlKHMsIGRubyA9IGQxLCAmcWJoKSkpIHJldHVybjsKKwkJCWRlID0gZG5vZGVfZmlyc3RfZGUoZG5vZGUpOworCQkJaWYgKCFkZS0+bGFzdCkgZ290byBlcnJvcjsKKwkJCWQxID0gZGUtPmRvd24gPyBkZV9kb3duX3BvaW50ZXIoZGUpIDogMDsKKwkJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJCWhwZnNfZnJlZV9kbm9kZShzLCBkbm8pOworCQl9CisJCWQxID0gZDI7CisJCWQyID0gMDsKKwl9IHdoaWxlIChkMSk7CisJcmV0dXJuOworCWVycm9yOgorCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwlocGZzX2ZyZWVfZG5vZGUocywgZG5vKTsKKwlocGZzX2Vycm9yKHMsICJkaXJlY3RvcnkgJTA4eCBpcyBjb3JydXB0ZWQgb3Igbm90IGVtcHR5IiwgcmRubyk7Cit9CisKKy8qIAorICogRmluZCBkaXJlbnQgZm9yIHNwZWNpZmllZCBmbm9kZS4gVXNlIHRydW5jYXRlZCAxNS1jaGFyIG5hbWUgaW4gZm5vZGUgYXMKKyAqIGEgaGVscCBmb3Igc2VhcmNoaW5nLgorICovCisKK3N0cnVjdCBocGZzX2RpcmVudCAqbWFwX2Zub2RlX2RpcmVudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGZub2RlX3NlY25vIGZubywKKwkJCQkgICAgIHN0cnVjdCBmbm9kZSAqZiwgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKnFiaCkKK3sKKwljaGFyICpuYW1lMTsKKwljaGFyICpuYW1lMjsKKwlpbnQgbmFtZTFsZW4sIG5hbWUybGVuOworCXN0cnVjdCBkbm9kZSAqZDsKKwlkbm9kZV9zZWNubyBkbm8sIGRvd25kOworCXN0cnVjdCBmbm9kZSAqdXBmOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGhwZnNfZGlyZW50ICpkZSwgKmRlX2VuZDsKKwlpbnQgYzsKKwlpbnQgYzEsIGMyID0gMDsKKwlpbnQgZDEsIGQyID0gMDsKKwluYW1lMSA9IGYtPm5hbWU7CisJaWYgKCEobmFtZTIgPSBrbWFsbG9jKDI1NiwgR0ZQX05PRlMpKSkgeworCQlwcmludGsoIkhQRlM6IG91dCBvZiBtZW1vcnksIGNhbid0IG1hcCBkaXJlbnRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKGYtPmxlbiA8PSAxNSkKKwkJbWVtY3B5KG5hbWUyLCBuYW1lMSwgbmFtZTFsZW4gPSBuYW1lMmxlbiA9IGYtPmxlbik7CisJZWxzZSB7CisJCW1lbWNweShuYW1lMiwgbmFtZTEsIDE1KTsKKwkJbWVtc2V0KG5hbWUyICsgMTUsIDB4ZmYsIDI1NiAtIDE1KTsKKwkJLypuYW1lMlsxNV0gPSAweGZmOyovCisJCW5hbWUxbGVuID0gMTU7IG5hbWUybGVuID0gMjU2OworCX0KKwlpZiAoISh1cGYgPSBocGZzX21hcF9mbm9kZShzLCBmLT51cCwgJmJoKSkpIHsKKwkJa2ZyZWUobmFtZTIpOworCQlyZXR1cm4gTlVMTDsKKwl9CQorCWlmICghdXBmLT5kaXJmbGFnKSB7CisJCWJyZWxzZShiaCk7CisJCWhwZnNfZXJyb3IocywgImZub2RlICUwOHggaGFzIG5vbi1kaXJlY3RvcnkgcGFyZW50ICUwOHgiLCBmbm8sIGYtPnVwKTsKKwkJa2ZyZWUobmFtZTIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZG5vID0gdXBmLT51LmV4dGVybmFsWzBdLmRpc2tfc2Vjbm87CisJYnJlbHNlKGJoKTsKKwlnb19kb3duOgorCWRvd25kID0gMDsKKwlnb191cDoKKwlpZiAoIShkID0gaHBmc19tYXBfZG5vZGUocywgZG5vLCBxYmgpKSkgeworCQlrZnJlZShuYW1lMik7CisJCXJldHVybiBOVUxMOworCX0KKwlkZV9lbmQgPSBkbm9kZV9lbmRfZGUoZCk7CisJZGUgPSBkbm9kZV9maXJzdF9kZShkKTsKKwlpZiAoZG93bmQpIHsKKwkJd2hpbGUgKGRlIDwgZGVfZW5kKSB7CisJCQlpZiAoZGUtPmRvd24pIGlmIChkZV9kb3duX3BvaW50ZXIoZGUpID09IGRvd25kKSBnb3RvIGY7CisJCQlkZSA9IGRlX25leHRfZGUoZGUpOworCQl9CisJCWhwZnNfZXJyb3IocywgInBvaW50ZXIgdG8gZG5vZGUgJTA4eCBub3QgZm91bmQgaW4gZG5vZGUgJTA4eCIsIGRvd25kLCBkbm8pOworCQlocGZzX2JyZWxzZTQocWJoKTsKKwkJa2ZyZWUobmFtZTIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbmV4dF9kZToKKwlpZiAoZGUtPmZub2RlID09IGZubykgeworCQlrZnJlZShuYW1lMik7CisJCXJldHVybiBkZTsKKwl9CisJYyA9IGhwZnNfY29tcGFyZV9uYW1lcyhzLCBuYW1lMSwgbmFtZTFsZW4sIGRlLT5uYW1lLCBkZS0+bmFtZWxlbiwgZGUtPmxhc3QpOworCWlmIChjIDwgMCAmJiBkZS0+ZG93bikgeworCQlkbm8gPSBkZV9kb3duX3BvaW50ZXIoZGUpOworCQlocGZzX2JyZWxzZTQocWJoKTsKKwkJaWYgKGhwZnNfc2IocyktPnNiX2NoaykKKwkJCWlmIChocGZzX3N0b3BfY3ljbGVzKHMsIGRubywgJmMxLCAmYzIsICJtYXBfZm5vZGVfZGlyZW50ICMxIikpIHsKKwkJCWtmcmVlKG5hbWUyKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWdvdG8gZ29fZG93bjsKKwl9CisJZjoKKwlpZiAoZGUtPmZub2RlID09IGZubykgeworCQlrZnJlZShuYW1lMik7CisJCXJldHVybiBkZTsKKwl9CisJYyA9IGhwZnNfY29tcGFyZV9uYW1lcyhzLCBuYW1lMiwgbmFtZTJsZW4sIGRlLT5uYW1lLCBkZS0+bmFtZWxlbiwgZGUtPmxhc3QpOworCWlmIChjIDwgMCAmJiAhZGUtPmxhc3QpIGdvdG8gbm90X2ZvdW5kOworCWlmICgoZGUgPSBkZV9uZXh0X2RlKGRlKSkgPCBkZV9lbmQpIGdvdG8gbmV4dF9kZTsKKwlpZiAoZC0+cm9vdF9kbm9kZSkgZ290byBub3RfZm91bmQ7CisJZG93bmQgPSBkbm87CisJZG5vID0gZC0+dXA7CisJaHBmc19icmVsc2U0KHFiaCk7CisJaWYgKGhwZnNfc2IocyktPnNiX2NoaykKKwkJaWYgKGhwZnNfc3RvcF9jeWNsZXMocywgZG93bmQsICZkMSwgJmQyLCAibWFwX2Zub2RlX2RpcmVudCAjMiIpKSB7CisJCQlrZnJlZShuYW1lMik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCWdvdG8gZ29fdXA7CisJbm90X2ZvdW5kOgorCWhwZnNfYnJlbHNlNChxYmgpOworCWhwZnNfZXJyb3IocywgImRpcmVudCBmb3IgZm5vZGUgJTA4eCBub3QgZm91bmQiLCBmbm8pOworCWtmcmVlKG5hbWUyKTsKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZzL2hwZnMvZWEuYyBiL2ZzL2hwZnMvZWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjMzOWRjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaHBmcy9lYS5jCkBAIC0wLDAgKzEsMzYzIEBACisvKgorICogIGxpbnV4L2ZzL2hwZnMvZWEuYworICoKKyAqICBNaWt1bGFzIFBhdG9ja2EgKG1pa3VsYXNAYXJ0YXgua2FybGluLm1mZi5jdW5pLmN6KSwgMTk5OC0xOTk5CisgKgorICogIGhhbmRsaW5nIGV4dGVuZGVkIGF0dHJpYnV0ZXMKKyAqLworCisjaW5jbHVkZSAiaHBmc19mbi5oIgorCisvKiBSZW1vdmUgZXh0ZXJuYWwgZXh0ZW5kZWQgYXR0cmlidXRlcy4gYW5vIHNwZWNpZmllcyB3aGV0aGVyIGEgaXMgYSAKKyAgIGRpcmVjdCBzZWN0b3Igd2hlcmUgZWFzIHN0YXJ0cyBvciBhbiBhbm9kZSAqLworCit2b2lkIGhwZnNfZWFfZXh0X3JlbW92ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHNlY25vIGEsIGludCBhbm8sIHVuc2lnbmVkIGxlbikKK3sKKwl1bnNpZ25lZCBwb3MgPSAwOworCXdoaWxlIChwb3MgPCBsZW4pIHsKKwkJY2hhciBleFs0ICsgMjU1ICsgMSArIDhdOworCQlzdHJ1Y3QgZXh0ZW5kZWRfYXR0cmlidXRlICplYSA9IChzdHJ1Y3QgZXh0ZW5kZWRfYXR0cmlidXRlICopZXg7CisJCWlmIChwb3MgKyA0ID4gbGVuKSB7CisJCQlocGZzX2Vycm9yKHMsICJFQXMgZG9uJ3QgZW5kIGNvcnJlY3RseSwgJXMgJTA4eCwgbGVuICUwOHgiLAorCQkJCWFubyA/ICJhbm9kZSIgOiAic2VjdG9ycyIsIGEsIGxlbik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGhwZnNfZWFfcmVhZChzLCBhLCBhbm8sIHBvcywgNCwgZXgpKSByZXR1cm47CisJCWlmIChlYS0+aW5kaXJlY3QpIHsKKwkJCWlmIChlYS0+dmFsdWVsZW4gIT0gOCkgeworCQkJCWhwZnNfZXJyb3IocywgImVhLT5pbmRpcmVjdCBzZXQgd2hpbGUgZWEtPnZhbHVlbGVuIT04LCAlcyAlMDh4LCBwb3MgJTA4eCIsCisJCQkJCWFubyA/ICJhbm9kZSIgOiAic2VjdG9ycyIsIGEsIHBvcyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKGhwZnNfZWFfcmVhZChzLCBhLCBhbm8sIHBvcyArIDQsIGVhLT5uYW1lbGVuICsgOSwgZXgrNCkpCisJCQkJcmV0dXJuOworCQkJaHBmc19lYV9yZW1vdmUocywgZWFfc2VjKGVhKSwgZWEtPmFub2RlLCBlYV9sZW4oZWEpKTsKKwkJfQorCQlwb3MgKz0gZWEtPm5hbWVsZW4gKyBlYS0+dmFsdWVsZW4gKyA1OworCX0KKwlpZiAoIWFubykgaHBmc19mcmVlX3NlY3RvcnMocywgYSwgKGxlbis1MTEpID4+IDkpOworCWVsc2UgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQlzdHJ1Y3QgYW5vZGUgKmFub2RlOworCQlpZiAoKGFub2RlID0gaHBmc19tYXBfYW5vZGUocywgYSwgJmJoKSkpIHsKKwkJCWhwZnNfcmVtb3ZlX2J0cmVlKHMsICZhbm9kZS0+YnRyZWUpOworCQkJYnJlbHNlKGJoKTsKKwkJCWhwZnNfZnJlZV9zZWN0b3JzKHMsIGEsIDEpOworCQl9CisJfQorfQorCitzdGF0aWMgY2hhciAqZ2V0X2luZGlyZWN0X2VhKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgaW50IGFubywgc2Vjbm8gYSwgaW50IHNpemUpCit7CisJY2hhciAqcmV0OworCWlmICghKHJldCA9IGttYWxsb2Moc2l6ZSArIDEsIEdGUF9OT0ZTKSkpIHsKKwkJcHJpbnRrKCJIUEZTOiBvdXQgb2YgbWVtb3J5IGZvciBFQVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoaHBmc19lYV9yZWFkKHMsIGEsIGFubywgMCwgc2l6ZSwgcmV0KSkgeworCQlrZnJlZShyZXQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0W3NpemVdID0gMDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzZXRfaW5kaXJlY3RfZWEoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBpbnQgYW5vLCBzZWNubyBhLCBjaGFyICpkYXRhLAorCQkJICAgIGludCBzaXplKQoreworCWhwZnNfZWFfd3JpdGUocywgYSwgYW5vLCAwLCBzaXplLCBkYXRhKTsKK30KKworLyogUmVhZCBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgbmFtZWQgJ2tleScgaW50byB0aGUgcHJvdmlkZWQgYnVmZmVyICovCisKK2ludCBocGZzX3JlYWRfZWEoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgZm5vZGUgKmZub2RlLCBjaGFyICprZXksCisJCWNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJdW5zaWduZWQgcG9zOworCWludCBhbm8sIGxlbjsKKwlzZWNubyBhOworCXN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKmVhOworCXN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKmVhX2VuZCA9IGZub2RlX2VuZF9lYShmbm9kZSk7CisJZm9yIChlYSA9IGZub2RlX2VhKGZub2RlKTsgZWEgPCBlYV9lbmQ7IGVhID0gbmV4dF9lYShlYSkpCisJCWlmICghc3RyY21wKGVhLT5uYW1lLCBrZXkpKSB7CisJCQlpZiAoZWEtPmluZGlyZWN0KQorCQkJCWdvdG8gaW5kaXJlY3Q7CisJCQlpZiAoZWEtPnZhbHVlbGVuID49IHNpemUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQltZW1jcHkoYnVmLCBlYV9kYXRhKGVhKSwgZWEtPnZhbHVlbGVuKTsKKwkJCWJ1ZltlYS0+dmFsdWVsZW5dID0gMDsKKwkJCXJldHVybiAwOworCQl9CisJYSA9IGZub2RlLT5lYV9zZWNubzsKKwlsZW4gPSBmbm9kZS0+ZWFfc2l6ZV9sOworCWFubyA9IGZub2RlLT5lYV9hbm9kZTsKKwlwb3MgPSAwOworCXdoaWxlIChwb3MgPCBsZW4pIHsKKwkJY2hhciBleFs0ICsgMjU1ICsgMSArIDhdOworCQllYSA9IChzdHJ1Y3QgZXh0ZW5kZWRfYXR0cmlidXRlICopZXg7CisJCWlmIChwb3MgKyA0ID4gbGVuKSB7CisJCQlocGZzX2Vycm9yKHMsICJFQXMgZG9uJ3QgZW5kIGNvcnJlY3RseSwgJXMgJTA4eCwgbGVuICUwOHgiLAorCQkJCWFubyA/ICJhbm9kZSIgOiAic2VjdG9ycyIsIGEsIGxlbik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpZiAoaHBmc19lYV9yZWFkKHMsIGEsIGFubywgcG9zLCA0LCBleCkpIHJldHVybiAtRUlPOworCQlpZiAoaHBmc19lYV9yZWFkKHMsIGEsIGFubywgcG9zICsgNCwgZWEtPm5hbWVsZW4gKyAxICsgKGVhLT5pbmRpcmVjdCA/IDggOiAwKSwgZXggKyA0KSkKKwkJCXJldHVybiAtRUlPOworCQlpZiAoIXN0cmNtcChlYS0+bmFtZSwga2V5KSkgeworCQkJaWYgKGVhLT5pbmRpcmVjdCkKKwkJCQlnb3RvIGluZGlyZWN0OworCQkJaWYgKGVhLT52YWx1ZWxlbiA+PSBzaXplKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKGhwZnNfZWFfcmVhZChzLCBhLCBhbm8sIHBvcyArIDQgKyBlYS0+bmFtZWxlbiArIDEsIGVhLT52YWx1ZWxlbiwgYnVmKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWJ1ZltlYS0+dmFsdWVsZW5dID0gMDsKKwkJCXJldHVybiAwOworCQl9CisJCXBvcyArPSBlYS0+bmFtZWxlbiArIGVhLT52YWx1ZWxlbiArIDU7CisJfQorCXJldHVybiAtRU5PRU5UOworaW5kaXJlY3Q6CisJaWYgKGVhX2xlbihlYSkgPj0gc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGhwZnNfZWFfcmVhZChzLCBlYV9zZWMoZWEpLCBlYS0+YW5vZGUsIDAsIGVhX2xlbihlYSksIGJ1ZikpCisJCXJldHVybiAtRUlPOworCWJ1ZltlYV9sZW4oZWEpXSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJlYWQgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIG5hbWVkICdrZXknICovCitjaGFyICpocGZzX2dldF9lYShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBmbm9kZSAqZm5vZGUsIGNoYXIgKmtleSwgaW50ICpzaXplKQoreworCWNoYXIgKnJldDsKKwl1bnNpZ25lZCBwb3M7CisJaW50IGFubywgbGVuOworCXNlY25vIGE7CisJc3RydWN0IGV4dGVuZGVkX2F0dHJpYnV0ZSAqZWE7CisJc3RydWN0IGV4dGVuZGVkX2F0dHJpYnV0ZSAqZWFfZW5kID0gZm5vZGVfZW5kX2VhKGZub2RlKTsKKwlmb3IgKGVhID0gZm5vZGVfZWEoZm5vZGUpOyBlYSA8IGVhX2VuZDsgZWEgPSBuZXh0X2VhKGVhKSkKKwkJaWYgKCFzdHJjbXAoZWEtPm5hbWUsIGtleSkpIHsKKwkJCWlmIChlYS0+aW5kaXJlY3QpCisJCQkJcmV0dXJuIGdldF9pbmRpcmVjdF9lYShzLCBlYS0+YW5vZGUsIGVhX3NlYyhlYSksICpzaXplID0gZWFfbGVuKGVhKSk7CisJCQlpZiAoIShyZXQgPSBrbWFsbG9jKCgqc2l6ZSA9IGVhLT52YWx1ZWxlbikgKyAxLCBHRlBfTk9GUykpKSB7CisJCQkJcHJpbnRrKCJIUEZTOiBvdXQgb2YgbWVtb3J5IGZvciBFQVxuIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQltZW1jcHkocmV0LCBlYV9kYXRhKGVhKSwgZWEtPnZhbHVlbGVuKTsKKwkJCXJldFtlYS0+dmFsdWVsZW5dID0gMDsKKwkJCXJldHVybiByZXQ7CisJCX0KKwlhID0gZm5vZGUtPmVhX3NlY25vOworCWxlbiA9IGZub2RlLT5lYV9zaXplX2w7CisJYW5vID0gZm5vZGUtPmVhX2Fub2RlOworCXBvcyA9IDA7CisJd2hpbGUgKHBvcyA8IGxlbikgeworCQljaGFyIGV4WzQgKyAyNTUgKyAxICsgOF07CisJCWVhID0gKHN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKilleDsKKwkJaWYgKHBvcyArIDQgPiBsZW4pIHsKKwkJCWhwZnNfZXJyb3IocywgIkVBcyBkb24ndCBlbmQgY29ycmVjdGx5LCAlcyAlMDh4LCBsZW4gJTA4eCIsCisJCQkJYW5vID8gImFub2RlIiA6ICJzZWN0b3JzIiwgYSwgbGVuKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChocGZzX2VhX3JlYWQocywgYSwgYW5vLCBwb3MsIDQsIGV4KSkgcmV0dXJuIE5VTEw7CisJCWlmIChocGZzX2VhX3JlYWQocywgYSwgYW5vLCBwb3MgKyA0LCBlYS0+bmFtZWxlbiArIDEgKyAoZWEtPmluZGlyZWN0ID8gOCA6IDApLCBleCArIDQpKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmICghc3RyY21wKGVhLT5uYW1lLCBrZXkpKSB7CisJCQlpZiAoZWEtPmluZGlyZWN0KQorCQkJCXJldHVybiBnZXRfaW5kaXJlY3RfZWEocywgZWEtPmFub2RlLCBlYV9zZWMoZWEpLCAqc2l6ZSA9IGVhX2xlbihlYSkpOworCQkJaWYgKCEocmV0ID0ga21hbGxvYygoKnNpemUgPSBlYS0+dmFsdWVsZW4pICsgMSwgR0ZQX05PRlMpKSkgeworCQkJCXByaW50aygiSFBGUzogb3V0IG9mIG1lbW9yeSBmb3IgRUFcbiIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJaWYgKGhwZnNfZWFfcmVhZChzLCBhLCBhbm8sIHBvcyArIDQgKyBlYS0+bmFtZWxlbiArIDEsIGVhLT52YWx1ZWxlbiwgcmV0KSkgeworCQkJCWtmcmVlKHJldCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlyZXRbZWEtPnZhbHVlbGVuXSA9IDA7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXBvcyArPSBlYS0+bmFtZWxlbiArIGVhLT52YWx1ZWxlbiArIDU7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiAKKyAqIFVwZGF0ZSBvciBjcmVhdGUgZXh0ZW5kZWQgYXR0cmlidXRlICdrZXknIHdpdGggdmFsdWUgJ2RhdGEnLiBOb3RlIHRoYXQKKyAqIHdoZW4gdGhpcyBlYSBleGlzdHMsIGl0IE1VU1QgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHNpemUgb2YgZGF0YS4KKyAqIFRoaXMgZHJpdmVyIGNhbid0IGNoYW5nZSBzaXplcyBvZiBlYXMgKCdjYXVzZSBJIGp1c3QgZG9uJ3QgbmVlZCBpdCkuCisgKi8KKwordm9pZCBocGZzX3NldF9lYShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZm5vZGUgKmZub2RlLCBjaGFyICprZXksIGNoYXIgKmRhdGEsIGludCBzaXplKQoreworCWZub2RlX3NlY25vIGZubyA9IGlub2RlLT5pX2lubzsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBpbm9kZS0+aV9zYjsKKwl1bnNpZ25lZCBwb3M7CisJaW50IGFubywgbGVuOworCXNlY25vIGE7CisJdW5zaWduZWQgY2hhciBoWzRdOworCXN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKmVhOworCXN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKmVhX2VuZCA9IGZub2RlX2VuZF9lYShmbm9kZSk7CisJZm9yIChlYSA9IGZub2RlX2VhKGZub2RlKTsgZWEgPCBlYV9lbmQ7IGVhID0gbmV4dF9lYShlYSkpCisJCWlmICghc3RyY21wKGVhLT5uYW1lLCBrZXkpKSB7CisJCQlpZiAoZWEtPmluZGlyZWN0KSB7CisJCQkJaWYgKGVhX2xlbihlYSkgPT0gc2l6ZSkKKwkJCQkJc2V0X2luZGlyZWN0X2VhKHMsIGVhLT5hbm9kZSwgZWFfc2VjKGVhKSwgZGF0YSwgc2l6ZSk7CisJCQl9IGVsc2UgaWYgKGVhLT52YWx1ZWxlbiA9PSBzaXplKSB7CisJCQkJbWVtY3B5KGVhX2RhdGEoZWEpLCBkYXRhLCBzaXplKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCWEgPSBmbm9kZS0+ZWFfc2Vjbm87CisJbGVuID0gZm5vZGUtPmVhX3NpemVfbDsKKwlhbm8gPSBmbm9kZS0+ZWFfYW5vZGU7CisJcG9zID0gMDsKKwl3aGlsZSAocG9zIDwgbGVuKSB7CisJCWNoYXIgZXhbNCArIDI1NSArIDEgKyA4XTsKKwkJZWEgPSAoc3RydWN0IGV4dGVuZGVkX2F0dHJpYnV0ZSAqKWV4OworCQlpZiAocG9zICsgNCA+IGxlbikgeworCQkJaHBmc19lcnJvcihzLCAiRUFzIGRvbid0IGVuZCBjb3JyZWN0bHksICVzICUwOHgsIGxlbiAlMDh4IiwKKwkJCQlhbm8gPyAiYW5vZGUiIDogInNlY3RvcnMiLCBhLCBsZW4pOworCQkJcmV0dXJuOworCQl9CisJCWlmIChocGZzX2VhX3JlYWQocywgYSwgYW5vLCBwb3MsIDQsIGV4KSkgcmV0dXJuOworCQlpZiAoaHBmc19lYV9yZWFkKHMsIGEsIGFubywgcG9zICsgNCwgZWEtPm5hbWVsZW4gKyAxICsgKGVhLT5pbmRpcmVjdCA/IDggOiAwKSwgZXggKyA0KSkKKwkJCXJldHVybjsKKwkJaWYgKCFzdHJjbXAoZWEtPm5hbWUsIGtleSkpIHsKKwkJCWlmIChlYS0+aW5kaXJlY3QpIHsKKwkJCQlpZiAoZWFfbGVuKGVhKSA9PSBzaXplKQorCQkJCQlzZXRfaW5kaXJlY3RfZWEocywgZWEtPmFub2RlLCBlYV9zZWMoZWEpLCBkYXRhLCBzaXplKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWlmIChlYS0+dmFsdWVsZW4gPT0gc2l6ZSkKKwkJCQkJaHBmc19lYV93cml0ZShzLCBhLCBhbm8sIHBvcyArIDQgKyBlYS0+bmFtZWxlbiArIDEsIHNpemUsIGRhdGEpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCXBvcyArPSBlYS0+bmFtZWxlbiArIGVhLT52YWx1ZWxlbiArIDU7CisJfQorCWlmICghZm5vZGUtPmVhX29mZnMpIHsKKwkJLyppZiAoZm5vZGUtPmVhX3NpemVfcykgeworCQkJaHBmc19lcnJvcihzLCAiZm5vZGUgJTA4eDogZWFfc2l6ZV9zID09ICUwM3gsIGVhX29mZnMgPT0gMCIsCisJCQkJaW5vZGUtPmlfaW5vLCBmbm9kZS0+ZWFfc2l6ZV9zKTsKKwkJCXJldHVybjsKKwkJfSovCisJCWZub2RlLT5lYV9vZmZzID0gMHhjNDsKKwl9CisJaWYgKGZub2RlLT5lYV9vZmZzIDwgMHhjNCB8fCBmbm9kZS0+ZWFfb2ZmcyArIGZub2RlLT5hY2xfc2l6ZV9zICsgZm5vZGUtPmVhX3NpemVfcyA+IDB4MjAwKSB7CisJCWhwZnNfZXJyb3IocywgImZub2RlICUwOHg6IGVhX29mZnMgPT0gJTAzeCwgZWFfc2l6ZV9zID09ICUwM3giLAorCQkJaW5vZGUtPmlfaW5vLCBmbm9kZS0+ZWFfb2ZmcywgZm5vZGUtPmVhX3NpemVfcyk7CisJCXJldHVybjsKKwl9CisJaWYgKChmbm9kZS0+ZWFfc2l6ZV9zIHx8ICFmbm9kZS0+ZWFfc2l6ZV9sKSAmJgorCSAgICAgZm5vZGUtPmVhX29mZnMgKyBmbm9kZS0+YWNsX3NpemVfcyArIGZub2RlLT5lYV9zaXplX3MgKyBzdHJsZW4oa2V5KSArIHNpemUgKyA1IDw9IDB4MjAwKSB7CisJCWVhID0gZm5vZGVfZW5kX2VhKGZub2RlKTsKKwkJKihjaGFyICopZWEgPSAwOworCQllYS0+bmFtZWxlbiA9IHN0cmxlbihrZXkpOworCQllYS0+dmFsdWVsZW4gPSBzaXplOworCQlzdHJjcHkoZWEtPm5hbWUsIGtleSk7CisJCW1lbWNweShlYV9kYXRhKGVhKSwgZGF0YSwgc2l6ZSk7CisJCWZub2RlLT5lYV9zaXplX3MgKz0gc3RybGVuKGtleSkgKyBzaXplICsgNTsKKwkJZ290byByZXQ7CisJfQorCS8qIE1vc3QgdGhlIGNvZGUgaGVyZSBpcyA5OS45OTkzNDIyJSB1bnVzZWQuIEkgaG9wZSB0aGVyZSBhcmUgbm8gYnVncy4KKwkgICBCdXQgd2hhdCAuLiBIUEZTLklGUyBoYXMgYWxzbyBidWdzIGluIGVhIG1hbmFnZW1lbnQuICovCisJaWYgKGZub2RlLT5lYV9zaXplX3MgJiYgIWZub2RlLT5lYV9zaXplX2wpIHsKKwkJc2Vjbm8gbjsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwkJY2hhciAqZGF0YTsKKwkJaWYgKCEobiA9IGhwZnNfYWxsb2Nfc2VjdG9yKHMsIGZubywgMSwgMCwgMSkpKSByZXR1cm47CisJCWlmICghKGRhdGEgPSBocGZzX2dldF9zZWN0b3IocywgbiwgJmJoKSkpIHsKKwkJCWhwZnNfZnJlZV9zZWN0b3JzKHMsIG4sIDEpOworCQkJcmV0dXJuOworCQl9CisJCW1lbWNweShkYXRhLCBmbm9kZV9lYShmbm9kZSksIGZub2RlLT5lYV9zaXplX3MpOworCQlmbm9kZS0+ZWFfc2l6ZV9sID0gZm5vZGUtPmVhX3NpemVfczsKKwkJZm5vZGUtPmVhX3NpemVfcyA9IDA7CisJCWZub2RlLT5lYV9zZWNubyA9IG47CisJCWZub2RlLT5lYV9hbm9kZSA9IDA7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJYnJlbHNlKGJoKTsKKwl9CisJcG9zID0gZm5vZGUtPmVhX3NpemVfbCArIDUgKyBzdHJsZW4oa2V5KSArIHNpemU7CisJbGVuID0gKGZub2RlLT5lYV9zaXplX2wgKyA1MTEpID4+IDk7CisJaWYgKHBvcyA+PSAzMDAwMCkgZ290byBiYWlsOworCXdoaWxlICgoKHBvcyArIDUxMSkgPj4gOSkgPiBsZW4pIHsKKwkJaWYgKCFsZW4pIHsKKwkJCWlmICghKGZub2RlLT5lYV9zZWNubyA9IGhwZnNfYWxsb2Nfc2VjdG9yKHMsIGZubywgMSwgMCwgMSkpKQorCQkJCWdvdG8gYmFpbDsKKwkJCWZub2RlLT5lYV9hbm9kZSA9IDA7CisJCQlsZW4rKzsKKwkJfSBlbHNlIGlmICghZm5vZGUtPmVhX2Fub2RlKSB7CisJCQlpZiAoaHBmc19hbGxvY19pZl9wb3NzaWJsZShzLCBmbm9kZS0+ZWFfc2Vjbm8gKyBsZW4pKSB7CisJCQkJbGVuKys7CisJCQl9IGVsc2UgeworCQkJCS8qIEFhcmdoLi4uIGRvbid0IGtub3cgaG93IHRvIGNyZWF0ZSBlYSBhbm9kZXMgOi0oICovCisJCQkJLypzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQkJCXN0cnVjdCBhbm9kZSAqYW5vZGU7CisJCQkJYW5vZGVfc2Vjbm8gYV9zOworCQkJCWlmICghKGFub2RlID0gaHBmc19hbGxvY19hbm9kZShzLCBmbm8sICZhX3MsICZiaCkpKQorCQkJCQlnb3RvIGJhaWw7CisJCQkJYW5vZGUtPnVwID0gZm5vOworCQkJCWFub2RlLT5idHJlZS5mbm9kZV9wYXJlbnQgPSAxOworCQkJCWFub2RlLT5idHJlZS5uX2ZyZWVfbm9kZXMtLTsKKwkJCQlhbm9kZS0+YnRyZWUubl91c2VkX25vZGVzKys7CisJCQkJYW5vZGUtPmJ0cmVlLmZpcnN0X2ZyZWUgKz0gMTI7CisJCQkJYW5vZGUtPnUuZXh0ZXJuYWxbMF0uZGlza19zZWNubyA9IGZub2RlLT5lYV9zZWNubzsKKwkJCQlhbm9kZS0+dS5leHRlcm5hbFswXS5maWxlX3NlY25vID0gMDsKKwkJCQlhbm9kZS0+dS5leHRlcm5hbFswXS5sZW5ndGggPSBsZW47CisJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJCWJyZWxzZShiaCk7CisJCQkJZm5vZGUtPmVhX2Fub2RlID0gMTsKKwkJCQlmbm9kZS0+ZWFfc2Vjbm8gPSBhX3M7Ki8KKwkJCQlzZWNubyBuZXdfc2VjOworCQkJCWludCBpOworCQkJCWlmICghKG5ld19zZWMgPSBocGZzX2FsbG9jX3NlY3RvcihzLCBmbm8sIDEsIDEgLSAoKHBvcyArIDUxMSkgPj4gOSksIDEpKSkKKwkJCQkJZ290byBiYWlsOworCQkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMSwgKmJoMjsKKwkJCQkJdm9pZCAqYjEsICpiMjsKKwkJCQkJaWYgKCEoYjEgPSBocGZzX21hcF9zZWN0b3IocywgZm5vZGUtPmVhX3NlY25vICsgaSwgJmJoMSwgbGVuIC0gaSAtIDEpKSkgeworCQkJCQkJaHBmc19mcmVlX3NlY3RvcnMocywgbmV3X3NlYywgKHBvcyArIDUxMSkgPj4gOSk7CisJCQkJCQlnb3RvIGJhaWw7CisJCQkJCX0KKwkJCQkJaWYgKCEoYjIgPSBocGZzX2dldF9zZWN0b3IocywgbmV3X3NlYyArIGksICZiaDIpKSkgeworCQkJCQkJYnJlbHNlKGJoMSk7CisJCQkJCQlocGZzX2ZyZWVfc2VjdG9ycyhzLCBuZXdfc2VjLCAocG9zICsgNTExKSA+PiA5KTsKKwkJCQkJCWdvdG8gYmFpbDsKKwkJCQkJfQorCQkJCQltZW1jcHkoYjIsIGIxLCA1MTIpOworCQkJCQlicmVsc2UoYmgxKTsKKwkJCQkJbWFya19idWZmZXJfZGlydHkoYmgyKTsKKwkJCQkJYnJlbHNlKGJoMik7CisJCQkJfQorCQkJCWhwZnNfZnJlZV9zZWN0b3JzKHMsIGZub2RlLT5lYV9zZWNubywgbGVuKTsKKwkJCQlmbm9kZS0+ZWFfc2Vjbm8gPSBuZXdfc2VjOworCQkJCWxlbiA9IChwb3MgKyA1MTEpID4+IDk7CisJCQl9CisJCX0KKwkJaWYgKGZub2RlLT5lYV9hbm9kZSkgeworCQkJaWYgKGhwZnNfYWRkX3NlY3Rvcl90b19idHJlZShzLCBmbm9kZS0+ZWFfc2Vjbm8sCisJCQkJCQkgICAgIDAsIGxlbikgIT0gLTEpIHsKKwkJCQlsZW4rKzsKKwkJCX0gZWxzZSB7CisJCQkJZ290byBiYWlsOworCQkJfQorCQl9CisJfQorCWhbMF0gPSAwOworCWhbMV0gPSBzdHJsZW4oa2V5KTsKKwloWzJdID0gc2l6ZSAmIDB4ZmY7CisJaFszXSA9IHNpemUgPj4gODsKKwlpZiAoaHBmc19lYV93cml0ZShzLCBmbm9kZS0+ZWFfc2Vjbm8sIGZub2RlLT5lYV9hbm9kZSwgZm5vZGUtPmVhX3NpemVfbCwgNCwgaCkpIGdvdG8gYmFpbDsKKwlpZiAoaHBmc19lYV93cml0ZShzLCBmbm9kZS0+ZWFfc2Vjbm8sIGZub2RlLT5lYV9hbm9kZSwgZm5vZGUtPmVhX3NpemVfbCArIDQsIGhbMV0gKyAxLCBrZXkpKSBnb3RvIGJhaWw7CisJaWYgKGhwZnNfZWFfd3JpdGUocywgZm5vZGUtPmVhX3NlY25vLCBmbm9kZS0+ZWFfYW5vZGUsIGZub2RlLT5lYV9zaXplX2wgKyA1ICsgaFsxXSwgc2l6ZSwgZGF0YSkpIGdvdG8gYmFpbDsKKwlmbm9kZS0+ZWFfc2l6ZV9sID0gcG9zOworCXJldDoKKwlocGZzX2koaW5vZGUpLT5pX2VhX3NpemUgKz0gNSArIHN0cmxlbihrZXkpICsgc2l6ZTsKKwlyZXR1cm47CisJYmFpbDoKKwlpZiAoZm5vZGUtPmVhX3NlY25vKQorCQlpZiAoZm5vZGUtPmVhX2Fub2RlKSBocGZzX3RydW5jYXRlX2J0cmVlKHMsIGZub2RlLT5lYV9zZWNubywgMSwgKGZub2RlLT5lYV9zaXplX2wgKyA1MTEpID4+IDkpOworCQllbHNlIGhwZnNfZnJlZV9zZWN0b3JzKHMsIGZub2RlLT5lYV9zZWNubyArICgoZm5vZGUtPmVhX3NpemVfbCArIDUxMSkgPj4gOSksIGxlbiAtICgoZm5vZGUtPmVhX3NpemVfbCArIDUxMSkgPj4gOSkpOworCWVsc2UgZm5vZGUtPmVhX3NlY25vID0gZm5vZGUtPmVhX3NpemVfbCA9IDA7Cit9CisJCmRpZmYgLS1naXQgYS9mcy9ocGZzL2ZpbGUuYyBiL2ZzL2hwZnMvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMTQ0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ocGZzL2ZpbGUuYwpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqICBsaW51eC9mcy9ocGZzL2ZpbGUuYworICoKKyAqICBNaWt1bGFzIFBhdG9ja2EgKG1pa3VsYXNAYXJ0YXgua2FybGluLm1mZi5jdW5pLmN6KSwgMTk5OC0xOTk5CisgKgorICogIGZpbGUgVkZTIGZ1bmN0aW9ucworICovCisKKyNpbmNsdWRlICJocGZzX2ZuLmgiCisKKyNkZWZpbmUgQkxPQ0tTKHNpemUpICgoKHNpemUpICsgNTExKSA+PiA5KQorCitzdGF0aWMgaW50IGhwZnNfZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWxvY2tfa2VybmVsKCk7CisJaHBmc193cml0ZV9pZl9jaGFuZ2VkKGlub2RlKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBocGZzX2ZpbGVfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKQoreworCS8qcmV0dXJuIGZpbGVfZnN5bmMoZmlsZSwgZGVudHJ5KTsqLworCXJldHVybiAwOyAvKiBEb24ndCBmc3luYyA6LSkgKi8KK30KKworLyoKKyAqIGdlbmVyaWNfZmlsZV9yZWFkIG9mdGVuIGNhbGxzIGJtYXAgd2l0aCBub24tZXhpc3Rpbmcgc2VjdG9yLAorICogc28gd2UgbXVzdCBpZ25vcmUgc3VjaCBlcnJvcnMuCisgKi8KKworc3RhdGljIHNlY25vIGhwZnNfYm1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBmaWxlX3NlY25vKQoreworCXN0cnVjdCBocGZzX2lub2RlX2luZm8gKmhwZnNfaW5vZGUgPSBocGZzX2koaW5vZGUpOworCXVuc2lnbmVkIG4sIGRpc2tfc2Vjbm87CisJc3RydWN0IGZub2RlICpmbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWlmIChCTE9DS1MoaHBmc19pKGlub2RlKS0+bW11X3ByaXZhdGUpIDw9IGZpbGVfc2Vjbm8pIHJldHVybiAwOworCW4gPSBmaWxlX3NlY25vIC0gaHBmc19pbm9kZS0+aV9maWxlX3NlYzsKKwlpZiAobiA8IGhwZnNfaW5vZGUtPmlfbl9zZWNzKSByZXR1cm4gaHBmc19pbm9kZS0+aV9kaXNrX3NlYyArIG47CisJaWYgKCEoZm5vZGUgPSBocGZzX21hcF9mbm9kZShpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAmYmgpKSkgcmV0dXJuIDA7CisJZGlza19zZWNubyA9IGhwZnNfYnBsdXNfbG9va3VwKGlub2RlLT5pX3NiLCBpbm9kZSwgJmZub2RlLT5idHJlZSwgZmlsZV9zZWNubywgYmgpOworCWlmIChkaXNrX3NlY25vID09IC0xKSByZXR1cm4gMDsKKwlpZiAoaHBmc19jaGtfc2VjdG9ycyhpbm9kZS0+aV9zYiwgZGlza19zZWNubywgMSwgImJtYXAiKSkgcmV0dXJuIDA7CisJcmV0dXJuIGRpc2tfc2Vjbm87Cit9CisKK3N0YXRpYyB2b2lkIGhwZnNfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppKQoreworCWlmIChJU19JTU1VVEFCTEUoaSkpIHJldHVybiAvKi1FUEVSTSovOworCWxvY2tfa2VybmVsKCk7CisJaHBmc19pKGkpLT5pX25fc2VjcyA9IDA7CisJaS0+aV9ibG9ja3MgPSAxICsgKChpLT5pX3NpemUgKyA1MTEpID4+IDkpOworCWhwZnNfaShpKS0+bW11X3ByaXZhdGUgPSBpLT5pX3NpemU7CisJaHBmc190cnVuY2F0ZV9idHJlZShpLT5pX3NiLCBpLT5pX2lubywgMSwgKChpLT5pX3NpemUgKyA1MTEpID4+IDkpKTsKKwlocGZzX3dyaXRlX2lub2RlKGkpOworCWhwZnNfaShpKS0+aV9uX3NlY3MgPSAwOworCXVubG9ja19rZXJuZWwoKTsKK30KKworc3RhdGljIGludCBocGZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQoreworCXNlY25vIHM7CisJcyA9IGhwZnNfYm1hcChpbm9kZSwgaWJsb2NrKTsKKwlpZiAocykgeworCQltYXBfYmgoYmhfcmVzdWx0LCBpbm9kZS0+aV9zYiwgcyk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIWNyZWF0ZSkgcmV0dXJuIDA7CisJaWYgKGlibG9jazw8OSAhPSBocGZzX2koaW5vZGUpLT5tbXVfcHJpdmF0ZSkgeworCQlCVUcoKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICgocyA9IGhwZnNfYWRkX3NlY3Rvcl90b19idHJlZShpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAxLCBpbm9kZS0+aV9ibG9ja3MgLSAxKSkgPT0gLTEpIHsKKwkJaHBmc190cnVuY2F0ZV9idHJlZShpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAxLCBpbm9kZS0+aV9ibG9ja3MgLSAxKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCWlub2RlLT5pX2Jsb2NrcysrOworCWhwZnNfaShpbm9kZSktPm1tdV9wcml2YXRlICs9IDUxMjsKKwlzZXRfYnVmZmVyX25ldyhiaF9yZXN1bHQpOworCW1hcF9iaChiaF9yZXN1bHQsIGlub2RlLT5pX3NiLCBzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBocGZzX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJcmV0dXJuIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLGhwZnNfZ2V0X2Jsb2NrLCB3YmMpOworfQorc3RhdGljIGludCBocGZzX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gYmxvY2tfcmVhZF9mdWxsX3BhZ2UocGFnZSxocGZzX2dldF9ibG9jayk7Cit9CitzdGF0aWMgaW50IGhwZnNfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXJldHVybiBjb250X3ByZXBhcmVfd3JpdGUocGFnZSxmcm9tLHRvLGhwZnNfZ2V0X2Jsb2NrLAorCQkmaHBmc19pKHBhZ2UtPm1hcHBpbmctPmhvc3QpLT5tbXVfcHJpdmF0ZSk7Cit9CitzdGF0aWMgc2VjdG9yX3QgX2hwZnNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2spCit7CisJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLGJsb2NrLGhwZnNfZ2V0X2Jsb2NrKTsKK30KK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgaHBmc19hb3BzID0geworCS5yZWFkcGFnZSA9IGhwZnNfcmVhZHBhZ2UsCisJLndyaXRlcGFnZSA9IGhwZnNfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UgPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUgPSBocGZzX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZSA9IGdlbmVyaWNfY29tbWl0X3dyaXRlLAorCS5ibWFwID0gX2hwZnNfYm1hcAorfTsKKworc3RhdGljIHNzaXplX3QgaHBmc19maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3NpemVfdCByZXR2YWw7CisKKwlyZXR2YWwgPSBnZW5lcmljX2ZpbGVfd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7CisJaWYgKHJldHZhbCA+IDApIHsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCQlpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJCWhwZnNfaShpbm9kZSktPmlfZGlydHkgPSAxOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhwZnNfZmlsZV9vcHMgPQoreworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkucmVhZAkJPSBnZW5lcmljX2ZpbGVfcmVhZCwKKwkud3JpdGUJCT0gaHBmc19maWxlX3dyaXRlLAorCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAorCS5yZWxlYXNlCT0gaHBmc19maWxlX3JlbGVhc2UsCisJLmZzeW5jCQk9IGhwZnNfZmlsZV9mc3luYywKKwkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBocGZzX2ZpbGVfaW9wcyA9Cit7CisJLnRydW5jYXRlCT0gaHBmc190cnVuY2F0ZSwKKwkuc2V0YXR0cgk9IGhwZnNfbm90aWZ5X2NoYW5nZSwKK307CmRpZmYgLS1naXQgYS9mcy9ocGZzL2hwZnMuaCBiL2ZzL2hwZnMvaHBmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlODRjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ocGZzL2hwZnMuaApAQCAtMCwwICsxLDQ5MyBAQAorLyoKKyAqICBsaW51eC9mcy9ocGZzL2hwZnMuaAorICoKKyAqICBIUEZTIHN0cnVjdHVyZXMgYnkgQ2hyaXMgU21pdGgsIDE5OTMKKyAqCisgKiAgYSBsaXR0bGUgYml0IG1vZGlmaWVkIGJ5IE1pa3VsYXMgUGF0b2NrYSwgMTk5OC0xOTk5CisgKi8KKworLyogVGhlIHBhcGVyCisKKyAgICAgRHVuY2FuLCBSb3kKKyAgICAgRGVzaWduIGdvYWxzIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbmV3IEhpZ2ggUGVyZm9ybWFuY2UgRmlsZSBTeXN0ZW0KKyAgICAgTWljcm9zb2Z0IFN5c3RlbXMgSm91cm5hbCAgU2VwdCAxOTg5ICB2NCBuNSBwMSgxMykKKworICAgZGVzY3JpYmVzIHdoYXQgSFBGUyBsb29rZWQgbGlrZSB3aGVuIGl0IHdhcyBuZXcsIGFuZCBpdCBpcyB0aGUgc291cmNlCisgICBvZiBtb3N0IG9mIHRoZSBpbmZvcm1hdGlvbiBnaXZlbiBoZXJlLiAgVGhlIHJlc3QgaXMgY29uamVjdHVyZS4KKworICAgRm9yIGRlZmluaXRpdmUgaW5mb3JtYXRpb24gb24gdGhlIER1bmNhbiBwYXBlciwgc2VlIGl0LCBub3QgdGhpcyBmaWxlLgorICAgRm9yIGRlZmluaXRpdmUgaW5mb3JtYXRpb24gb24gSFBGUywgYXNrIHNvbWVib2R5IGVsc2UgLS0gdGhpcyBpcyBndWVzc3dvcmsuCisgICBUaGVyZSBhcmUgY2VydGFpbiB0byBiZSBtYW55IG1pc3Rha2VzLiAqLworCisvKiBOb3RhdGlvbiAqLworCit0eXBlZGVmIHVuc2lnbmVkIHNlY25vOwkJCS8qIHNlY3RvciBudW1iZXIsIHBhcnRpdGlvbiByZWxhdGl2ZSAqLworCit0eXBlZGVmIHNlY25vIGRub2RlX3NlY25vOwkJLyogc2VjdG9yIG51bWJlciBvZiBhIGRub2RlICovCit0eXBlZGVmIHNlY25vIGZub2RlX3NlY25vOwkJLyogc2VjdG9yIG51bWJlciBvZiBhbiBmbm9kZSAqLwordHlwZWRlZiBzZWNubyBhbm9kZV9zZWNubzsJCS8qIHNlY3RvciBudW1iZXIgb2YgYW4gYW5vZGUgKi8KKwordHlwZWRlZiB1MzIgdGltZTMyX3Q7CQkvKiAzMi1iaXQgdGltZV90IHR5cGUgKi8KKworLyogc2VjdG9yIDAgKi8KKworLyogVGhlIGJvb3QgYmxvY2sgaXMgdmVyeSBsaWtlIGEgRkFUIGJvb3QgYmxvY2ssIGV4Y2VwdCB0aGF0IHRoZQorICAgMjloIHNpZ25hdHVyZSBieXRlIGlzIDI4aCBpbnN0ZWFkLCBhbmQgdGhlIElEIHN0cmluZyBpcyAiSFBGUyIuICovCisKKyNkZWZpbmUgQkJfTUFHSUMgMHhhYTU1CisKK3N0cnVjdCBocGZzX2Jvb3RfYmxvY2sKK3sKKyAgdW5zaWduZWQgY2hhciBqbXBbM107CisgIHVuc2lnbmVkIGNoYXIgb2VtX2lkWzhdOworICB1bnNpZ25lZCBjaGFyIGJ5dGVzX3Blcl9zZWN0b3JbMl07CS8qIDUxMiAqLworICB1bnNpZ25lZCBjaGFyIHNlY3RvcnNfcGVyX2NsdXN0ZXI7CisgIHVuc2lnbmVkIGNoYXIgbl9yZXNlcnZlZF9zZWN0b3JzWzJdOworICB1bnNpZ25lZCBjaGFyIG5fZmF0czsKKyAgdW5zaWduZWQgY2hhciBuX3Jvb3RkaXJfZW50cmllc1syXTsKKyAgdW5zaWduZWQgY2hhciBuX3NlY3RvcnNfc1syXTsKKyAgdW5zaWduZWQgY2hhciBtZWRpYV9ieXRlOworICB1bnNpZ25lZCBzaG9ydCBzZWN0b3JzX3Blcl9mYXQ7CisgIHVuc2lnbmVkIHNob3J0IHNlY3RvcnNfcGVyX3RyYWNrOworICB1bnNpZ25lZCBzaG9ydCBoZWFkc19wZXJfY3lsOworICB1bnNpZ25lZCBpbnQgbl9oaWRkZW5fc2VjdG9yczsKKyAgdW5zaWduZWQgaW50IG5fc2VjdG9yc19sOwkJLyogc2l6ZSBvZiBwYXJ0aXRpb24gKi8KKyAgdW5zaWduZWQgY2hhciBkcml2ZV9udW1iZXI7CisgIHVuc2lnbmVkIGNoYXIgbWJ6OworICB1bnNpZ25lZCBjaGFyIHNpZ18yOGg7CQkvKiAyOGggKi8KKyAgdW5zaWduZWQgY2hhciB2b2xfc2Vybm9bNF07CisgIHVuc2lnbmVkIGNoYXIgdm9sX2xhYmVsWzExXTsKKyAgdW5zaWduZWQgY2hhciBzaWdfaHBmc1s4XTsJCS8qICJIUEZTICAgICIgKi8KKyAgdW5zaWduZWQgY2hhciBwYWRbNDQ4XTsKKyAgdW5zaWduZWQgc2hvcnQgbWFnaWM7CQkJLyogYWE1NSAqLworfTsKKworCisvKiBzZWN0b3IgMTYgKi8KKworLyogVGhlIHN1cGVyIGJsb2NrIGhhcyB0aGUgcG9pbnRlciB0byB0aGUgcm9vdCBkaXJlY3RvcnkuICovCisKKyNkZWZpbmUgU0JfTUFHSUMgMHhmOTk1ZTg0OQorCitzdHJ1Y3QgaHBmc19zdXBlcl9ibG9jaworeworICB1bnNpZ25lZCBtYWdpYzsJCQkvKiBmOTk1IGU4NDkgKi8KKyAgdW5zaWduZWQgbWFnaWMxOwkJCS8qIGZhNTMgZTljNSwgbW9yZSBtYWdpYz8gKi8KKyAgLyp1bnNpZ25lZCBodWgyMDI7Ki8JCQkvKiA/PyAyMDIgPSBOLiBvZiBCLiBpbiAxLjAwMzkwNjI1IFMuKi8KKyAgY2hhciB2ZXJzaW9uOwkJCQkvKiB2ZXJzaW9uIG9mIGEgZmlsZXN5c3RlbSAgdXN1YWxseSAyICovCisgIGNoYXIgZnVuY3ZlcnNpb247CQkJLyogZnVuY3Rpb25hbCB2ZXJzaW9uIC0gb2xkZXN0IHZlcnNpb24KKyAgCQkJCQkgICBvZiBmaWxlc3lzdGVtIHRoYXQgY2FuIHVuZGVyc3RhbmQKKwkJCQkJICAgdGhpcyBkaXNrICovCisgIHVuc2lnbmVkIHNob3J0IGludCB6ZXJvOwkJLyogMCAqLworICBmbm9kZV9zZWNubyByb290OwkJCS8qIGZub2RlIG9mIHJvb3QgZGlyZWN0b3J5ICovCisgIHNlY25vIG5fc2VjdG9yczsJCQkvKiBzaXplIG9mIGZpbGVzeXN0ZW0gKi8KKyAgdW5zaWduZWQgbl9iYWRibG9ja3M7CQkJLyogbnVtYmVyIG9mIGJhZCBibG9ja3MgKi8KKyAgc2Vjbm8gYml0bWFwczsJCQkvKiBwb2ludGVycyB0byBmcmVlIHNwYWNlIGJpdCBtYXBzICovCisgIHVuc2lnbmVkIHplcm8xOwkJCS8qIDAgKi8KKyAgc2Vjbm8gYmFkYmxvY2tzOwkJCS8qIGJhZCBibG9jayBsaXN0ICovCisgIHVuc2lnbmVkIHplcm8zOwkJCS8qIDAgKi8KKyAgdGltZTMyX3QgbGFzdF9jaGtkc2s7CQkJLyogZGF0ZSBsYXN0IGNoZWNrZWQsIDAgaWYgbmV2ZXIgKi8KKyAgLyp1bnNpZ25lZCB6ZXJvNDsqLwkJCS8qIDAgKi8KKyAgdGltZTMyX3QgbGFzdF9vcHRpbWl6ZTsJCQkvKiBkYXRlIGxhc3Qgb3B0aW1pemVkLCAwIGlmIG5ldmVyICovCisgIHNlY25vIG5fZGlyX2JhbmQ7CQkJLyogbnVtYmVyIG9mIHNlY3RvcnMgaW4gZGlyIGJhbmQgKi8KKyAgc2Vjbm8gZGlyX2JhbmRfc3RhcnQ7CQkJLyogZmlyc3Qgc2VjdG9yIGluIGRpciBiYW5kICovCisgIHNlY25vIGRpcl9iYW5kX2VuZDsJCQkvKiBsYXN0IHNlY3RvciBpbiBkaXIgYmFuZCAqLworICBzZWNubyBkaXJfYmFuZF9iaXRtYXA7CQkvKiBmcmVlIHNwYWNlIG1hcCwgMSBkbm9kZSBwZXIgYml0ICovCisgIGNoYXIgdm9sdW1lX25hbWVbMzJdOwkJCS8qIG5vdCB1c2VkICovCisgIHNlY25vIHVzZXJfaWRfdGFibGU7CQkJLyogOCBwcmVhbGxvY2F0ZWQgc2VjdG9ycyAtIHVzZXIgaWQgKi8KKyAgdW5zaWduZWQgemVybzZbMTAzXTsJCQkvKiAwICovCit9OworCisKKy8qIHNlY3RvciAxNyAqLworCisvKiBUaGUgc3BhcmUgYmxvY2sgaGFzIHBvaW50ZXJzIHRvIHNwYXJlIHNlY3RvcnMuICAqLworCisjZGVmaW5lIFNQX01BR0lDIDB4Zjk5MTE4NDkKKworc3RydWN0IGhwZnNfc3BhcmVfYmxvY2sKK3sKKyAgdW5zaWduZWQgbWFnaWM7CQkJLyogZjk5MSAxODQ5ICovCisgIHVuc2lnbmVkIG1hZ2ljMTsJCQkvKiBmYTUyIDI5YzUsIG1vcmUgbWFnaWM/ICovCisKKyAgdW5zaWduZWQgZGlydHk6IDE7CQkJLyogMCBjbGVhbiwgMSAiaW1wcm9wZXJseSBzdG9wcGVkIiAqLworICAvKnVuc2lnbmVkIGZsYWcxMjM0OiA0OyovCQkvKiB1bmtub3duIGZsYWdzICovCisgIHVuc2lnbmVkIHNwYXJlZGlyX3VzZWQ6IDE7CQkvKiBzcGFyZSBkaXJibGtzIHVzZWQgKi8KKyAgdW5zaWduZWQgaG90Zml4ZXNfdXNlZDogMTsJCS8qIGhvdGZpeGVzIHVzZWQgKi8KKyAgdW5zaWduZWQgYmFkX3NlY3RvcjogMTsJCS8qIGJhZCBzZWN0b3IsIGNvcnJ1cHRlZCBkaXNrICg/Pz8pICovCisgIHVuc2lnbmVkIGJhZF9iaXRtYXA6IDE7CQkvKiBiYWQgYml0bWFwICovCisgIHVuc2lnbmVkIGZhc3Q6IDE7CQkJLyogcGFydGl0aW9uIHdhcyBmYXN0IGZvcm1hdHRlZCAqLworICB1bnNpZ25lZCBvbGRfd3JvdGU6IDE7CQkvKiBvbGQgdmVyc2lvbiB3cm90ZSB0byBwYXJ0aW9uICovCisgIHVuc2lnbmVkIG9sZF93cm90ZV8xOiAxOwkJLyogb2xkIHZlcnNpb24gd3JvdGUgdG8gcGFydGlvbiAoPykgKi8KKyAgdW5zaWduZWQgaW5zdGFsbF9kYXNkX2xpbWl0czogMTsJLyogSFBGUzM4NiBmbGFncyAqLworICB1bnNpZ25lZCByZXN5bmNoX2Rhc2RfbGltaXRzOiAxOworICB1bnNpZ25lZCBkYXNkX2xpbWl0c19vcGVyYXRpb25hbDogMTsKKyAgdW5zaWduZWQgbXVsdGltZWRpYV9hY3RpdmU6IDE7CisgIHVuc2lnbmVkIGRjZV9hY2xzX2FjdGl2ZTogMTsKKyAgdW5zaWduZWQgZGFzZF9saW1pdHNfZGlydHk6IDE7CisgIHVuc2lnbmVkIGZsYWc2NzogMjsKKyAgdW5zaWduZWQgY2hhciBtbV9jb250bGd1bHR5OworICB1bnNpZ25lZCBjaGFyIHVudXNlZDsKKworICBzZWNubyBob3RmaXhfbWFwOwkJCS8qIGluZm8gYWJvdXQgcmVtYXBwZWQgYmFkIHNlY3RvcnMgKi8KKyAgdW5zaWduZWQgbl9zcGFyZXNfdXNlZDsJCS8qIG51bWJlciBvZiBob3RmaXhlcyAqLworICB1bnNpZ25lZCBuX3NwYXJlczsJCQkvKiBudW1iZXIgb2Ygc3BhcmVzIGluIGhvdGZpeCBtYXAgKi8KKyAgdW5zaWduZWQgbl9kbm9kZV9zcGFyZXNfZnJlZTsJCS8qIHNwYXJlIGRub2RlcyB1bnVzZWQgKi8KKyAgdW5zaWduZWQgbl9kbm9kZV9zcGFyZXM7CQkvKiBsZW5ndGggb2Ygc3BhcmVfZG5vZGVzW10gbGlzdCwKKwkJCQkJICAgZm9sbG93cyBpbiB0aGlzIGJsb2NrKi8KKyAgc2Vjbm8gY29kZV9wYWdlX2RpcjsJCQkvKiBjb2RlIHBhZ2UgZGlyZWN0b3J5IGJsb2NrICovCisgIHVuc2lnbmVkIG5fY29kZV9wYWdlczsJCS8qIG51bWJlciBvZiBjb2RlIHBhZ2VzICovCisgIC8qdW5zaWduZWQgbGFyZ2VfbnVtYmVyc1syXTsqLwkvKiA/PyAqLworICB1bnNpZ25lZCBzdXBlcl9jcmM7CQkJLyogb24gSFBGUzM4NiBhbmQgTEFOIFNlcnZlciB0aGlzIGlzCisgIAkJCQkJICAgY2hlY2tzdW0gb2Ygc3VwZXJibG9jaywgb24gbm9ybWFsCisJCQkJCSAgIE9TLzIgdW51c2VkICovCisgIHVuc2lnbmVkIHNwYXJlX2NyYzsJCQkvKiBvbiBIUEZTMzg2IGNoZWNrc3VtIG9mIHNwYXJlYmxvY2sgKi8KKyAgdW5zaWduZWQgemVybzFbMTVdOwkJCS8qIHVudXNlZCAqLworICBkbm9kZV9zZWNubyBzcGFyZV9kbm9kZXNbMTAwXTsJLyogZW1lcmdlbmN5IGZyZWUgZG5vZGUgbGlzdCAqLworICB1bnNpZ25lZCB6ZXJvMlsxXTsJCQkvKiByb29tIGZvciBtb3JlPyAqLworfTsKKworLyogVGhlIGJhZCBibG9jayBsaXN0IGlzIDQgc2VjdG9ycyBsb25nLiAgVGhlIGZpcnN0IHdvcmQgbXVzdCBiZSB6ZXJvLAorICAgdGhlIHJlbWFpbmluZyB3b3JkcyBnaXZlIG5fYmFkYmxvY2tzIGJhZCBibG9jayBudW1iZXJzLgorICAgSSBiZXQgeW91IGNhbiBzZWUgaXQgY29taW5nLi4uICovCisKKyNkZWZpbmUgQkFEX01BR0lDIDAKKyAgICAgICAKKy8qIFRoZSBob3RmaXggbWFwIGlzIDQgc2VjdG9ycyBsb25nLiAgSXQgbG9va3MgbGlrZQorCisgICAgICAgc2Vjbm8gZnJvbVtuX3NwYXJlc107CisgICAgICAgc2Vjbm8gdG9bbl9zcGFyZXNdOworCisgICBUaGUgdG9bXSBsaXN0IGlzIGluaXRpYWxpemVkIHRvIHBvaW50IHRvIG5fc3BhcmVzIHByZWFsbG9jYXRlZCBlbXB0eQorICAgc2VjdG9ycy4gIFRoZSBmcm9tW10gbGlzdCBjb250YWlucyB0aGUgc2VjdG9yIG51bWJlcnMgb2YgYmFkIGJsb2NrcworICAgd2hpY2ggaGF2ZSBiZWVuIHJlbWFwcGVkIHRvIGNvcnJlc3BvbmRpbmcgc2VjdG9ycyBpbiB0aGUgdG9bXSBsaXN0LgorICAgbl9zcGFyZXNfdXNlZCBnaXZlcyB0aGUgbGVuZ3RoIG9mIHRoZSBmcm9tW10gbGlzdC4gKi8KKworCisvKiBTZWN0b3JzIDE4IGFuZCAxOSBhcmUgcHJlYWxsb2NhdGVkIGFuZCB1bnVzZWQuCisgICBNYXliZSB0aGV5J3JlIHNwYXJlcyBmb3IgMTYgYW5kIDE3LCBidXQgc2ltcGxlIHN1YnN0aXR1dGlvbiBmYWlscy4gKi8KKworCisvKiBUaGUgY29kZSBwYWdlIGluZm8gcG9pbnRlZCB0byBieSB0aGUgc3BhcmUgYmxvY2sgY29uc2lzdHMgb2YgYW4gaW5kZXgKKyAgIGJsb2NrIGFuZCBibG9ja3MgY29udGFpbmluZyB1cHBlcmNhc2luZyB0YWJsZXMuICBJIGRvbid0IGtub3cgd2hhdAorICAgdGhlc2UgYXJlIGZvciAoQ0hLRFNLLCBtYXliZT8pIC0tIE9TLzIgZG9lcyBub3Qgc2VlbSB0byB1c2UgdGhlbQorICAgaXRzZWxmLiAgTGludXggZG9lc24ndCB1c2UgdGhlbSBlaXRoZXIuICovCisKKy8qIGJsb2NrIHBvaW50ZWQgdG8gYnkgc3BhcmVibG9jay0+Y29kZV9wYWdlX2RpciAqLworCisjZGVmaW5lIENQX0RJUl9NQUdJQyAweDQ5NDUyMWY3CisKK3N0cnVjdCBjb2RlX3BhZ2VfZGlyZWN0b3J5Cit7CisgIHVuc2lnbmVkIG1hZ2ljOwkJCS8qIDQ5NDUgMjFmNyAqLworICB1bnNpZ25lZCBuX2NvZGVfcGFnZXM7CQkvKiBudW1iZXIgb2YgcG9pbnRlcnMgZm9sbG93aW5nICovCisgIHVuc2lnbmVkIHplcm8xWzJdOworICBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIHNob3J0IGl4OwkJCS8qIGluZGV4ICovCisgICAgdW5zaWduZWQgc2hvcnQgY29kZV9wYWdlX251bWJlcjsJLyogY29kZSBwYWdlIG51bWJlciAqLworICAgIHVuc2lnbmVkIGJvdW5kczsJCQkvKiBtYXRjaGVzIGNvcnJlc3BvbmRpbmcgd29yZAorCQkJCQkgICBpbiBkYXRhIGJsb2NrICovCisgICAgc2Vjbm8gY29kZV9wYWdlX2RhdGE7CQkvKiBzZWN0b3IgbnVtYmVyIG9mIGEgY29kZV9wYWdlX2RhdGEKKwkJCQkJICAgY29udGFpbmluZyBjLnAuIGFycmF5ICovCisgICAgdW5zaWduZWQgc2hvcnQgaW5kZXg7CQkvKiBpbmRleCBpbiBjLnAuIGFycmF5IGluIHRoYXQgc2VjdG9yKi8KKyAgICB1bnNpZ25lZCBzaG9ydCB1bmtub3duOwkJLyogc29tZSB1bmtub3duIHZhbHVlOyB1c3VhbGx5IDA7CisgICAgCQkJCQkgICAyIGluIEphcGFuZXNlIHZlcnNpb24gKi8KKyAgfSBhcnJheVszMV07CQkJCS8qIHVua25vd24gbGVuZ3RoICovCit9OworCisvKiBibG9ja3MgcG9pbnRlZCB0byBieSBjb2RlX3BhZ2VfZGlyZWN0b3J5ICovCisKKyNkZWZpbmUgQ1BfREFUQV9NQUdJQyAweDg5NDUyMWY3CisKK3N0cnVjdCBjb2RlX3BhZ2VfZGF0YQoreworICB1bnNpZ25lZCBtYWdpYzsJCQkvKiA4OTQ1IDIxZjcgKi8KKyAgdW5zaWduZWQgbl91c2VkOwkJCS8qICMgZWxlbWVudHMgdXNlZCBpbiBjX3BfZGF0YVtdICovCisgIHVuc2lnbmVkIGJvdW5kc1szXTsJCQkvKiBsb29rcyBhIGJpdCBsaWtlCisJCQkJCSAgICAgKGJlZzEsZW5kMSksIChiZWcyLGVuZDIpCisJCQkJCSAgIG9uZSBieXRlIGVhY2ggKi8KKyAgdW5zaWduZWQgc2hvcnQgb2Zmc1szXTsJCS8qIG9mZnNldHMgZnJvbSBzdGFydCBvZiBzZWN0b3IKKwkJCQkJICAgdG8gc3RhcnQgb2YgY19wX2RhdGFbaXhdICovCisgIHN0cnVjdCB7CisgICAgdW5zaWduZWQgc2hvcnQgaXg7CQkJLyogaW5kZXggKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBjb2RlX3BhZ2VfbnVtYmVyOwkvKiBjb2RlIHBhZ2UgbnVtYmVyICovCisgICAgdW5zaWduZWQgc2hvcnQgdW5rbm93bjsJCS8qIHRoZSBzYW1lIGFzIGluIGNwIGRpcmVjdG9yeSAqLworICAgIHVuc2lnbmVkIGNoYXIgbWFwWzEyOF07CQkvKiB1cGNhc2UgdGFibGUgZm9yIGNoYXJzIDgwLi5mZiAqLworICAgIHVuc2lnbmVkIHNob3J0IHplcm8yOworICB9IGNvZGVfcGFnZVszXTsKKyAgdW5zaWduZWQgY2hhciBpbmNvZ25pdGFbNzhdOworfTsKKworCisvKiBGcmVlIHNwYWNlIGJpdG1hcHMgYXJlIDQgc2VjdG9ycyBsb25nLCB3aGljaCBpcyAxNjM4NCBiaXRzLgorICAgMTYzODQgc2VjdG9ycyBpcyA4IG1lZywgYW5kIGVhY2ggOCBtZWcgYmFuZCBoYXMgYSA0LXNlY3RvciBiaXRtYXAuCisgICBCaXQgb3JkZXIgaW4gdGhlIG1hcHMgaXMgbGl0dGxlLWVuZGlhbi4gIDAgbWVhbnMgdGFrZW4sIDEgbWVhbnMgZnJlZS4KKworICAgQml0IG1hcCBzZWN0b3JzIGFyZSBtYXJrZWQgYWxsb2NhdGVkIGluIHRoZSBiaXQgbWFwcywgYW5kIHNvIGFyZSBzZWN0b3JzIAorICAgb2ZmIHRoZSBlbmQgb2YgdGhlIHBhcnRpdGlvbi4KKworICAgQmFuZCAwIGlzIHNlY3RvcnMgMC0zZmZmLCBpdHMgbWFwIGlzIGluIHNlY3RvcnMgMTgtMWIuCisgICBCYW5kIDEgaXMgNDAwMC03ZmZmLCBpdHMgbWFwIGlzIGluIDdmZmMtN2ZmZi4KKyAgIEJhbmQgMiBpcyA4MDAwLWZmZmYsIGl0cyBtYXAgaXMgaW4gODAwMC04MDAzLgorICAgVGhlIHJlbWFpbmluZyBiYW5kcyBoYXZlIG1hcHMgaW4gdGhlaXIgZmlyc3QgKGV2ZW4pIG9yIGxhc3QgKG9kZCkgNCBzZWN0b3JzCisgICAgIC0tIGlmIHRoZSBsYXN0LCBwYXJ0aWFsLCBiYW5kIGlzIG9kZCBpdHMgbWFwIGlzIGluIGl0cyBsYXN0IDQgc2VjdG9ycy4KKworICAgVGhlIGJpdG1hcCBsb2NhdGlvbnMgYXJlIGdpdmVuIGluIGEgdGFibGUgcG9pbnRlZCB0byBieSB0aGUgc3VwZXIgYmxvY2suCisgICBObyBkb3VidCB0aGV5IGFyZW4ndCBjb25zdHJhaW5lZCB0byBiZSBhdCAxOCwgN2ZmYywgODAwMCwgLi4uOyB0aGF0IGlzCisgICBqdXN0IHdoZXJlIHRoZXkgdXN1YWxseSBhcmUuCisKKyAgIFRoZSAiZGlyZWN0b3J5IGJhbmQiIGlzIGEgYnVuY2ggb2Ygc2VjdG9ycyBwcmVhbGxvY2F0ZWQgZm9yIGRub2Rlcy4KKyAgIEl0IGhhcyBhIDQtc2VjdG9yIGZyZWUgc3BhY2UgYml0bWFwIG9mIGl0cyBvd24uICBFYWNoIGJpdCBpbiB0aGUgbWFwCisgICBjb3JyZXNwb25kcyB0byBvbmUgNC1zZWN0b3IgZG5vZGUsIGJpdCAwIG9mIHRoZSBtYXAgY29ycmVzcG9uZGluZyB0bworICAgdGhlIGZpcnN0IDQgc2VjdG9ycyBvZiB0aGUgZGlyZWN0b3J5IGJhbmQuICBUaGUgZW50aXJlIGJhbmQgaXMgbWFya2VkCisgICBhbGxvY2F0ZWQgaW4gdGhlIG1haW4gYml0bWFwLiAgIFRoZSBzdXBlciBibG9jayBnaXZlcyB0aGUgbG9jYXRpb25zCisgICBvZiB0aGUgZGlyZWN0b3J5IGJhbmQgYW5kIGl0cyBiaXRtYXAuICAoImJhbmQiIGRvZXNuJ3QgbWVhbiBpdCBpcworICAgOCBtZWcgbG9uZzsgaXQgaXNuJ3QuKSAgKi8KKworCisvKiBkbm9kZTogZGlyZWN0b3J5LiAgNCBzZWN0b3JzIGxvbmcgKi8KKworLyogQSBkaXJlY3RvcnkgaXMgYSB0cmVlIG9mIGRub2Rlcy4gIFRoZSBmbm9kZSBmb3IgYSBkaXJlY3RvcnkKKyAgIGNvbnRhaW5zIG9uZSBwb2ludGVyLCB0byB0aGUgcm9vdCBkbm9kZSBvZiB0aGUgdHJlZS4gIFRoZSBmbm9kZQorICAgbmV2ZXIgbW92ZXMsIHRoZSBkbm9kZXMgZG8gdGhlIEItdHJlZSB0aGluZywgc3BsaXR0aW5nIGFuZCBtZXJnaW5nCisgICBhcyBmaWxlcyBhcmUgYWRkZWQgYW5kIHJlbW92ZWQuICAqLworCisjZGVmaW5lIEROT0RFX01BR0lDICAgMHg3N2U0MGFhZQorCitzdHJ1Y3QgZG5vZGUgeworICB1bnNpZ25lZCBtYWdpYzsJCQkvKiA3N2U0IDBhYWUgKi8KKyAgdW5zaWduZWQgZmlyc3RfZnJlZTsJCQkvKiBvZmZzZXQgZnJvbSBzdGFydCBvZiBkbm9kZSB0bworCQkJCQkgICBmaXJzdCBmcmVlIGRpciBlbnRyeSAqLworICB1bnNpZ25lZCByb290X2Rub2RlOjE7CQkvKiBJcyBpdCByb290IGRub2RlPyAqLworICB1bnNpZ25lZCBpbmNyZW1lbnRfbWU6MzE7CQkvKiBzb21lIGtpbmQgb2YgYWN0aXZpdHkgY291bnRlcj8KKwkJCQkJICAgTmVpdGhlciBIUEZTLklGUyBub3IgQ0hLRFNLIGNhcmVzCisJCQkJCSAgIGlmIHlvdSBjaGFuZ2UgdGhpcyB3b3JkICovCisgIHNlY25vIHVwOwkJCQkvKiAocm9vdCBkbm9kZSkgZGlyZWN0b3J5J3MgZm5vZGUKKwkJCQkJICAgKG5vbnJvb3QpIHBhcmVudCBkbm9kZSAqLworICBkbm9kZV9zZWNubyBzZWxmOwkJCS8qIHBvaW50ZXIgdG8gdGhpcyBkbm9kZSAqLworICB1bnNpZ25lZCBjaGFyIGRpcmVudFsyMDI4XTsJCS8qIG9uZSBvciBtb3JlIGRpcmVudHMgKi8KK307CisKK3N0cnVjdCBocGZzX2RpcmVudCB7CisgIHVuc2lnbmVkIHNob3J0IGxlbmd0aDsJCS8qIG9mZnNldCB0byBuZXh0IGRpcmVudCAqLworICB1bnNpZ25lZCBmaXJzdDogMTsJCQkvKiBzZXQgb24gcGhvbnkgXkFeQSAoIi4iKSBlbnRyeSAqLworICB1bnNpZ25lZCBoYXNfYWNsOiAxOworICB1bnNpZ25lZCBkb3duOiAxOwkJCS8qIGRvd24gcG9pbnRlciBwcmVzZW50IChhZnRlciBuYW1lKSAqLworICB1bnNpZ25lZCBsYXN0OiAxOwkJCS8qIHNldCBvbiBwaG9ueSBcMzc3IGVudHJ5ICovCisgIHVuc2lnbmVkIGhhc19lYTogMTsJCQkvKiBlbnRyeSBoYXMgRUEgKi8KKyAgdW5zaWduZWQgaGFzX3h0ZF9wZXJtOiAxOwkJLyogaGFzIGV4dGVuZGVkIHBlcm0gbGlzdCAoPz8/KSAqLworICB1bnNpZ25lZCBoYXNfZXhwbGljaXRfYWNsOiAxOworICB1bnNpZ25lZCBoYXNfbmVlZGVhOiAxOwkJLyogPz8gc29tZSBFQSBoYXMgTkVFREVBIHNldAorCQkJCQkgICBJIGhhdmUgbm8gaWRlYSB3aHkgdGhpcyBpcworCQkJCQkgICBpbnRlcmVzdGluZyBpbiBhIGRpciBlbnRyeSAqLworICB1bnNpZ25lZCByZWFkX29ubHk6IDE7CQkvKiBkb3MgYXR0cmliICovCisgIHVuc2lnbmVkIGhpZGRlbjogMTsJCQkvKiBkb3MgYXR0cmliICovCisgIHVuc2lnbmVkIHN5c3RlbTogMTsJCQkvKiBkb3MgYXR0cmliICovCisgIHVuc2lnbmVkIGZsYWcxMTogMTsJCQkvKiB3b3VsZCBiZSB2b2x1bWUgbGFiZWwgZG9zIGF0dHJpYiAqLworICB1bnNpZ25lZCBkaXJlY3Rvcnk6IDE7CQkvKiBkb3MgYXR0cmliICovCisgIHVuc2lnbmVkIGFyY2hpdmU6IDE7CQkJLyogZG9zIGF0dHJpYiAqLworICB1bnNpZ25lZCBub3RfOHgzOiAxOwkJCS8qIG5hbWUgaXMgbm90IDguMyAqLworICB1bnNpZ25lZCBmbGFnMTU6IDE7CisgIGZub2RlX3NlY25vIGZub2RlOwkJCS8qIGZub2RlIGdpdmluZyBhbGxvY2F0aW9uIGluZm8gKi8KKyAgdGltZTMyX3Qgd3JpdGVfZGF0ZTsJCQkvKiBtdGltZSAqLworICB1bnNpZ25lZCBmaWxlX3NpemU7CQkJLyogZmlsZSBsZW5ndGgsIGJ5dGVzICovCisgIHRpbWUzMl90IHJlYWRfZGF0ZTsJCQkvKiBhdGltZSAqLworICB0aW1lMzJfdCBjcmVhdGlvbl9kYXRlOwkJCS8qIGN0aW1lICovCisgIHVuc2lnbmVkIGVhX3NpemU7CQkJLyogdG90YWwgRUEgbGVuZ3RoLCBieXRlcyAqLworICB1bnNpZ25lZCBjaGFyIG5vX29mX2FjbHMgOiAzOwkJLyogbnVtYmVyIG9mIEFDTCdzICovCisgIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZXIgOiA1OworICB1bnNpZ25lZCBjaGFyIGl4OwkJCS8qIGNvZGUgcGFnZSBpbmRleCAob2YgZmlsZW5hbWUpLCBzZWUKKwkJCQkJICAgc3RydWN0IGNvZGVfcGFnZV9kYXRhICovCisgIHVuc2lnbmVkIGNoYXIgbmFtZWxlbiwgbmFtZVsxXTsJLyogZmlsZSBuYW1lICovCisgIC8qIGRub2RlX3NlY25vIGRvd247CSAgYnRyZWUgZG93biBwb2ludGVyLCBpZiBwcmVzZW50LAorICAgICAJCQkgIGZvbGxvd3MgbmFtZSBvbiBuZXh0IHdvcmQgYm91bmRhcnksIG9yIG1heWJlIGl0CisJCQkgIHByZWNlZGVzIG5leHQgZGlyZW50LCB3aGljaCBpcyBvbiBhIHdvcmQgYm91bmRhcnkuICovCit9OworCisKKy8qIEIrIHRyZWU6IGFsbG9jYXRpb24gaW5mbyBpbiBmbm9kZXMgYW5kIGFub2RlcyAqLworCisvKiBkbm9kZXMgcG9pbnQgdG8gZm5vZGVzIHdoaWNoIGFyZSByZXNwb25zaWJsZSBmb3IgbGlzdGluZyB0aGUgc2VjdG9ycworICAgYXNzaWduZWQgdG8gdGhlIGZpbGUuICBUaGlzIGlzIGRvbmUgd2l0aCB0cmVlcyBvZiAobGVuZ3RoLGFkZHJlc3MpCisgICBwYWlycy4gIChBY3R1YWxseSB0cmlwbGVzLCBvZiAobGVuZ3RoLCBmaWxlLWFkZHJlc3MsIGRpc2stYWRkcmVzcykKKyAgIHdoaWNoIGNhbiByZXByZXNlbnQgaG9sZXMuICBGaW5kIG91dCBpZiBIUEZTIGRvZXMgdGhhdC4pCisgICBBdCBhbnkgcmF0ZSwgZm5vZGVzIGNvbnRhaW4gYSBzbWFsbCB0cmVlOyBpZiBzdWJ0cmVlcyBhcmUgbmVlZGVkCisgICB0aGV5IG9jY3VweSBlc3NlbnRpYWxseSBhIGZ1bGwgYmxvY2sgaW4gYW5vZGVzLiAgQSBsZWFmLWxldmVsIHRyZWUgbm9kZQorICAgaGFzIDMtd29yZCBlbnRyaWVzIGdpdmluZyBzZWN0b3IgcnVucywgYSBub24tbGVhZiBub2RlIGhhcyAyLXdvcmQKKyAgIGVudHJpZXMgZ2l2aW5nIHN1YnRyZWUgcG9pbnRlcnMuICBBIGZsYWcgaW4gdGhlIGhlYWRlciBzYXlzIHdoaWNoLiAqLworCitzdHJ1Y3QgYnBsdXNfbGVhZl9ub2RlCit7CisgIHVuc2lnbmVkIGZpbGVfc2Vjbm87CQkJLyogZmlyc3QgZmlsZSBzZWN0b3IgaW4gZXh0ZW50ICovCisgIHVuc2lnbmVkIGxlbmd0aDsJCQkvKiBsZW5ndGgsIHNlY3RvcnMgKi8KKyAgc2Vjbm8gZGlza19zZWNubzsJCQkvKiBmaXJzdCBjb3JyZXNwb25kaW5nIGRpc2sgc2VjdG9yICovCit9OworCitzdHJ1Y3QgYnBsdXNfaW50ZXJuYWxfbm9kZQoreworICB1bnNpZ25lZCBmaWxlX3NlY25vOwkJCS8qIHN1YnRyZWUgbWFwcyBzZWN0b3JzIDwgdGhpcyAgKi8KKyAgYW5vZGVfc2Vjbm8gZG93bjsJCQkvKiBwb2ludGVyIHRvIHN1YnRyZWUgKi8KK307CisKK3N0cnVjdCBicGx1c19oZWFkZXIKK3sKKyAgdW5zaWduZWQgaGJmZjogMTsJLyogaGlnaCBiaXQgb2YgZmlyc3QgZnJlZSBlbnRyeSBvZmZzZXQgKi8KKyAgdW5zaWduZWQgZmxhZzE6IDE7CisgIHVuc2lnbmVkIGZsYWcyOiAxOworICB1bnNpZ25lZCBmbGFnMzogMTsKKyAgdW5zaWduZWQgZmxhZzQ6IDE7CisgIHVuc2lnbmVkIGZub2RlX3BhcmVudDogMTsJCS8qID8gd2UncmUgcG9pbnRlZCB0byBieSBhbiBmbm9kZSwKKwkJCQkJICAgdGhlIGRhdGEgYnRyZWUgb3Igc29tZSBlYSBvciB0aGUKKwkJCQkJICAgbWFpbiBlYSBib290YWdlIHBvaW50ZXIgZWFfc2Vjbm8gKi8KKwkJCQkJLyogYWxzbyBjYW4gZ2V0IHNldCBpbiBmbm9kZXMsIHdoaWNoCisJCQkJCSAgIG1heSBiZSBhIGNoa2RzayBnbGl0Y2ggb3IgbWF5IG1lYW4KKwkJCQkJICAgdGhpcyBiaXQgaXMgaXJyZWxldmFudCBpbiBmbm9kZXMsCisJCQkJCSAgIG9yIHRoaXMgaW50ZXJwcmV0YXRpb24gaXMgYWxsIHdldCAqLworICB1bnNpZ25lZCBiaW5hcnlfc2VhcmNoOiAxOwkJLyogc3VnZ2VzdCBiaW5hcnkgc2VhcmNoICh1bnVzZWQpICovCisgIHVuc2lnbmVkIGludGVybmFsOiAxOwkJCS8qIDEgLT4gKGludGVybmFsKSB0cmVlIG9mIGFub2RlcworCQkJCQkgICAwIC0+IChsZWFmKSBsaXN0IG9mIGV4dGVudHMgKi8KKyAgdW5zaWduZWQgY2hhciBmaWxsWzNdOworICB1bnNpZ25lZCBjaGFyIG5fZnJlZV9ub2RlczsJCS8qIGZyZWUgbm9kZXMgaW4gZm9sbG93aW5nIGFycmF5ICovCisgIHVuc2lnbmVkIGNoYXIgbl91c2VkX25vZGVzOwkJLyogdXNlZCBub2RlcyBpbiBmb2xsb3dpbmcgYXJyYXkgKi8KKyAgdW5zaWduZWQgc2hvcnQgZmlyc3RfZnJlZTsJCS8qIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGhlYWRlciB0bworCQkJCQkgICBmaXJzdCBmcmVlIG5vZGUgaW4gYXJyYXkgKi8KKyAgdW5pb24geworICAgIHN0cnVjdCBicGx1c19pbnRlcm5hbF9ub2RlIGludGVybmFsWzBdOyAvKiAoaW50ZXJuYWwpIDItd29yZCBlbnRyaWVzIGdpdmluZworCQkJCQkgICAgICAgc3VidHJlZSBwb2ludGVycyAqLworICAgIHN0cnVjdCBicGx1c19sZWFmX25vZGUgZXh0ZXJuYWxbMF07CSAgICAvKiAoZXh0ZXJuYWwpIDMtd29yZCBlbnRyaWVzIGdpdmluZworCQkJCQkgICAgICAgc2VjdG9yIHJ1bnMgKi8KKyAgfSB1OworfTsKKworLyogZm5vZGU6IHJvb3Qgb2YgYWxsb2NhdGlvbiBiKyB0cmVlLCBhbmQgRUEncyAqLworCisvKiBFdmVyeSBmaWxlIGFuZCBldmVyeSBkaXJlY3RvcnkgaGFzIG9uZSBmbm9kZSwgcG9pbnRlZCB0byBieSB0aGUgZGlyZWN0b3J5CisgICBlbnRyeSBhbmQgcG9pbnRpbmcgdG8gdGhlIGZpbGUncyBzZWN0b3JzIG9yIGRpcmVjdG9yeSdzIHJvb3QgZG5vZGUuICBFQSdzCisgICBhcmUgYWxzbyBzdG9yZWQgaGVyZSwgYW5kIHRoZXJlIGFyZSBzYWlkIHRvIGJlIEFDTCdzIHNvbWV3aGVyZSBoZXJlIHRvby4gKi8KKworI2RlZmluZSBGTk9ERV9NQUdJQyAweGY3ZTQwYWFlCisKK3N0cnVjdCBmbm9kZQoreworICB1bnNpZ25lZCBtYWdpYzsJCQkvKiBmN2U0IDBhYWUgKi8KKyAgdW5zaWduZWQgemVybzFbMl07CQkJLyogcmVhZCBoaXN0b3J5ICovCisgIHVuc2lnbmVkIGNoYXIgbGVuLCBuYW1lWzE1XTsJCS8qIHRydWUgbGVuZ3RoLCB0cnVuY2F0ZWQgbmFtZSAqLworICBmbm9kZV9zZWNubyB1cDsJCQkvKiBwb2ludGVyIHRvIGZpbGUncyBkaXJlY3RvcnkgZm5vZGUgKi8KKyAgLyp1bnNpZ25lZCB6ZXJvMlszXTsqLworICBzZWNubyBhY2xfc2l6ZV9sOworICBzZWNubyBhY2xfc2Vjbm87CisgIHVuc2lnbmVkIHNob3J0IGFjbF9zaXplX3M7CisgIGNoYXIgYWNsX2Fub2RlOworICBjaGFyIHplcm8yOwkJCQkvKiBoaXN0b3J5IGJpdCBjb3VudCAqLworICB1bnNpZ25lZCBlYV9zaXplX2w7CQkJLyogbGVuZ3RoIG9mIGRpc2stcmVzaWRlbnQgZWEncyAqLworICBzZWNubyBlYV9zZWNubzsJCQkvKiBmaXJzdCBzZWN0b3Igb2YgZGlzay1yZXNpZGVudCBlYSdzKi8KKyAgdW5zaWduZWQgc2hvcnQgZWFfc2l6ZV9zOwkJLyogbGVuZ3RoIG9mIGZub2RlLXJlc2lkZW50IGVhJ3MgKi8KKworICB1bnNpZ25lZCBmbGFnMDogMTsKKyAgdW5zaWduZWQgZWFfYW5vZGU6IDE7CQkJLyogMSAtPiBlYV9zZWNubyBpcyBhbiBhbm9kZSAqLworICB1bnNpZ25lZCBmbGFnMjogMTsKKyAgdW5zaWduZWQgZmxhZzM6IDE7CisgIHVuc2lnbmVkIGZsYWc0OiAxOworICB1bnNpZ25lZCBmbGFnNTogMTsKKyAgdW5zaWduZWQgZmxhZzY6IDE7CisgIHVuc2lnbmVkIGZsYWc3OiAxOworICB1bnNpZ25lZCBkaXJmbGFnOiAxOwkJCS8qIDEgLT4gZGlyZWN0b3J5LiAgZmlyc3QgJiBvbmx5IGV4dGVudAorCQkJCQkgICBwb2ludHMgdG8gZG5vZGUuICovCisgIHVuc2lnbmVkIGZsYWc5OiAxOworICB1bnNpZ25lZCBmbGFnMTA6IDE7CisgIHVuc2lnbmVkIGZsYWcxMTogMTsKKyAgdW5zaWduZWQgZmxhZzEyOiAxOworICB1bnNpZ25lZCBmbGFnMTM6IDE7CisgIHVuc2lnbmVkIGZsYWcxNDogMTsKKyAgdW5zaWduZWQgZmxhZzE1OiAxOworCisgIHN0cnVjdCBicGx1c19oZWFkZXIgYnRyZWU7CQkvKiBiKyB0cmVlLCA4IGV4dGVudHMgb3IgMTIgc3VidHJlZXMgKi8KKyAgdW5pb24geworICAgIHN0cnVjdCBicGx1c19sZWFmX25vZGUgZXh0ZXJuYWxbOF07CisgICAgc3RydWN0IGJwbHVzX2ludGVybmFsX25vZGUgaW50ZXJuYWxbMTJdOworICB9IHU7CisKKyAgdW5zaWduZWQgZmlsZV9zaXplOwkJCS8qIGZpbGUgbGVuZ3RoLCBieXRlcyAqLworICB1bnNpZ25lZCBuX25lZWRlYTsJCQkvKiBudW1iZXIgb2YgRUEncyB3aXRoIE5FRURFQSBzZXQgKi8KKyAgY2hhciB1c2VyX2lkWzE2XTsJCQkvKiB1bnVzZWQgKi8KKyAgdW5zaWduZWQgc2hvcnQgZWFfb2ZmczsJCS8qIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGZub2RlCisJCQkJCSAgIHRvIGZpcnN0IGZub2RlLXJlc2lkZW50IGVhICovCisgIGNoYXIgZGFzZF9saW1pdF90cmVzaGhvbGQ7CisgIGNoYXIgZGFzZF9saW1pdF9kZWx0YTsKKyAgdW5zaWduZWQgZGFzZF9saW1pdDsKKyAgdW5zaWduZWQgZGFzZF91c2FnZTsKKyAgLyp1bnNpZ25lZCB6ZXJvNVsyXTsqLworICB1bnNpZ25lZCBjaGFyIGVhWzMxNl07CQkvKiB6ZXJvIG9yIG1vcmUgRUEncywgcGFja2VkIHRvZ2V0aGVyCisJCQkJCSAgIHdpdGggbm8gYWxpZ25tZW50IHBhZGRpbmcuCisJCQkJCSAgIChEbyBub3QgdXNlIHRoaXMgbmFtZSwgZ2V0IGhlcmUKKwkJCQkJICAgdmlhIGZub2RlICsgZWFfb2Zmcy4gSSB0aGluay4pICovCit9OworCisKKy8qIGFub2RlOiA5OS40NCUgcHVyZSBhbGxvY2F0aW9uIHRyZWUgKi8KKworI2RlZmluZSBBTk9ERV9NQUdJQyAweDM3ZTQwYWFlCisKK3N0cnVjdCBhbm9kZQoreworICB1bnNpZ25lZCBtYWdpYzsJCQkvKiAzN2U0IDBhYWUgKi8KKyAgYW5vZGVfc2Vjbm8gc2VsZjsJCQkvKiBwb2ludGVyIHRvIHRoaXMgYW5vZGUgKi8KKyAgc2Vjbm8gdXA7CQkJCS8qIHBhcmVudCBhbm9kZSBvciBmbm9kZSAqLworCisgIHN0cnVjdCBicGx1c19oZWFkZXIgYnRyZWU7CQkvKiBiK3RyZWUsIDQwIGV4dGVudHMgb3IgNjAgc3VidHJlZXMgKi8KKyAgdW5pb24geworICAgIHN0cnVjdCBicGx1c19sZWFmX25vZGUgZXh0ZXJuYWxbNDBdOworICAgIHN0cnVjdCBicGx1c19pbnRlcm5hbF9ub2RlIGludGVybmFsWzYwXTsKKyAgfSB1OworCisgIHVuc2lnbmVkIGZpbGxbM107CQkJLyogdW51c2VkICovCit9OworCisKKy8qIGV4dGVuZGVkIGF0dHJpYnV0ZXMuCisKKyAgIEEgZmlsZSdzIEVBIGluZm8gaXMgc3RvcmVkIGFzIGEgbGlzdCBvZiAobmFtZSx2YWx1ZSkgcGFpcnMuICBJdCBpcworICAgdXN1YWxseSBpbiB0aGUgZm5vZGUsIGJ1dCAoaWYgaXQncyBsYXJnZSkgaXQgaXMgbW92ZWQgdG8gYSBzaW5nbGUKKyAgIHNlY3RvciBydW4gb3V0c2lkZSB0aGUgZm5vZGUsIG9yIHRvIG11bHRpcGxlIHJ1bnMgd2l0aCBhbiBhbm9kZSB0cmVlCisgICB0aGF0IHBvaW50cyB0byB0aGVtLgorCisgICBUaGUgdmFsdWUgb2YgYSBzaW5nbGUgRUEgaXMgc3RvcmVkIGFsb25nIHdpdGggdGhlIG5hbWUsIG9yIChpZiBsYXJnZSkKKyAgIGl0IGlzIG1vdmVkIHRvIGEgc2luZ2xlIHNlY3RvciBydW4sIG9yIG11bHRpcGxlIHJ1bnMgcG9pbnRlZCB0byBieSBhbgorICAgYW5vZGUgdHJlZSwgcG9pbnRlZCB0byBieSB0aGUgdmFsdWUgZmllbGQgb2YgdGhlIChuYW1lLHZhbHVlKSBwYWlyLgorCisgICBGbGFncyBpbiB0aGUgRUEgdGVsbCB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBpbW1lZGlhdGUsIGluIGEgc2luZ2xlIHNlY3RvcgorICAgcnVuLCBvciBpbiBtdWx0aXBsZSBydW5zLiAgRmxhZ3MgaW4gdGhlIGZub2RlIHRlbGwgd2hldGhlciB0aGUgRUEgbGlzdAorICAgaXMgaW1tZWRpYXRlLCBpbiBhIHNpbmdsZSBydW4sIG9yIGluIG11bHRpcGxlIHJ1bnMuICovCisKK3N0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUKK3sKKyAgdW5zaWduZWQgaW5kaXJlY3Q6IDE7CQkJLyogMSAtPiB2YWx1ZSBnaXZlcyBzZWN0b3IgbnVtYmVyCisJCQkJCSAgIHdoZXJlIHJlYWwgdmFsdWUgc3RhcnRzICovCisgIHVuc2lnbmVkIGFub2RlOiAxOwkJCS8qIDEgLT4gc2VjdG9yIGlzIGFuIGFub2RlCisJCQkJCSAgIHRoYXQgcG9pbnRzIHRvIGZyYWdtZW50ZWQgdmFsdWUgKi8KKyAgdW5zaWduZWQgZmxhZzI6IDE7CisgIHVuc2lnbmVkIGZsYWczOiAxOworICB1bnNpZ25lZCBmbGFnNDogMTsKKyAgdW5zaWduZWQgZmxhZzU6IDE7CisgIHVuc2lnbmVkIGZsYWc2OiAxOworICB1bnNpZ25lZCBuZWVkZWE6IDE7CQkJLyogcmVxdWlyZWQgZWEgKi8KKyAgdW5zaWduZWQgY2hhciBuYW1lbGVuOwkJLyogbGVuZ3RoIG9mIG5hbWUsIGJ5dGVzICovCisgIHVuc2lnbmVkIHNob3J0IHZhbHVlbGVuOwkJLyogbGVuZ3RoIG9mIHZhbHVlLCBieXRlcyAqLworICB1bnNpZ25lZCBjaGFyIG5hbWVbMF07CisgIC8qCisgICAgdW5zaWduZWQgY2hhciBuYW1lW25hbWVsZW5dOwlhc2NpaSBhdHRyaWIgbmFtZQorICAgIHVuc2lnbmVkIGNoYXIgbnVsOwkJCXRlcm1pbmF0aW5nICdcMCcsIG5vdCBjb3VudGVkCisgICAgdW5zaWduZWQgY2hhciB2YWx1ZVt2YWx1ZWxlbl07CXZhbHVlLCBhcmJpdHJhcnkKKyAgICAgIGlmIHRoaXMuaW5kaXJlY3QsIHZhbHVlbGVuIGlzIDggYW5kIHRoZSB2YWx1ZSBpcworICAgICAgICB1bnNpZ25lZCBsZW5ndGg7CQlyZWFsIGxlbmd0aCBvZiB2YWx1ZSwgYnl0ZXMKKyAgICAgICAgc2Vjbm8gc2Vjbm87CQkJc2VjdG9yIGFkZHJlc3Mgd2hlcmUgaXQgc3RhcnRzCisgICAgICBpZiB0aGlzLmFub2RlLCB0aGUgYWJvdmUgc2VjdG9yIG51bWJlciBpcyB0aGUgcm9vdCBvZiBhbiBhbm9kZSB0cmVlCisgICAgICAgIHdoaWNoIHBvaW50cyB0byB0aGUgdmFsdWUuCisgICovCit9OworCisvKgorICAgTG9jYWwgVmFyaWFibGVzOgorICAgY29tbWVudC1jb2x1bW46IDQwCisgICBFbmQ6CisqLwpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9ocGZzX2ZuLmggYi9mcy9ocGZzL2hwZnNfZm4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjI4YzNiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaHBmcy9ocGZzX2ZuLmgKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiAgbGludXgvZnMvaHBmcy9ocGZzX2ZuLmgKKyAqCisgKiAgTWlrdWxhcyBQYXRvY2thIChtaWt1bGFzQGFydGF4Lmthcmxpbi5tZmYuY3VuaS5jeiksIDE5OTgtMTk5OQorICoKKyAqICBmdW5jdGlvbiBoZWFkZXJzCisgKi8KKworLy8jZGVmaW5lIERCRworLy8jZGVmaW5lIERFQlVHX0xPQ0tTCisKKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9ocGZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNpbmNsdWRlICJocGZzLmgiCisKKyNkZWZpbmUgRUlPRVJST1IgIEVJTworI2RlZmluZSBFRlNFUlJPUiAgRVBFUk0KKyNkZWZpbmUgRU1FTUVSUk9SIEVOT01FTQorCisjZGVmaW5lIEFOT0RFX0FMTE9DX0ZXRAk1MTIKKyNkZWZpbmUgRk5PREVfQUxMT0NfRldECTAKKyNkZWZpbmUgQUxMT0NfRldEX01JTgkxNgorI2RlZmluZSBBTExPQ19GV0RfTUFYCTEyOAorI2RlZmluZSBBTExPQ19NCQkxCisjZGVmaW5lIEZOT0RFX1JEX0FIRUFECTE2CisjZGVmaW5lIEFOT0RFX1JEX0FIRUFECTE2CisjZGVmaW5lIEROT0RFX1JEX0FIRUFECTQKKworI2RlZmluZSBGUkVFX0ROT0RFU19BREQJNTgKKyNkZWZpbmUgRlJFRV9ETk9ERVNfREVMCTI5CisKKyNkZWZpbmUgQ0hLQ09ORCh4LHkpIGlmICghKHgpKSBwcmludGsgeQorCisjaWZkZWYgREJHCisjZGVmaW5lIFBSSU5USyh4KSBwcmludGsgeAorI2Vsc2UKKyN1bmRlZiBQUklOVEsKKyNkZWZpbmUgUFJJTlRLKHgpCisjZW5kaWYKKworc3RydWN0IGhwZnNfaW5vZGVfaW5mbyB7CisJbG9mZl90IG1tdV9wcml2YXRlOworCWlub190IGlfcGFyZW50X2RpcjsJLyogKGRpcmVjdG9yaWVzKSBnaXZlcyBmbm9kZSBvZiBwYXJlbnQgZGlyICovCisJdW5zaWduZWQgaV9kbm87CQkvKiAoZGlyZWN0b3JpZXMpIHJvb3QgZG5vZGUgKi8KKwl1bnNpZ25lZCBpX2Rwb3M7CS8qIChkaXJlY3RvcmllcykgdGVtcCBmb3IgcmVhZGRpciAqLworCXVuc2lnbmVkIGlfZHN1YmRubzsJLyogKGRpcmVjdG9yaWVzKSB0ZW1wIGZvciByZWFkZGlyICovCisJdW5zaWduZWQgaV9maWxlX3NlYzsJLyogKGZpbGVzKSBtaW5pbWFsaXN0IGNhY2hlIG9mIGFsbG9jIGluZm8gKi8KKwl1bnNpZ25lZCBpX2Rpc2tfc2VjOwkvKiAoZmlsZXMpIG1pbmltYWxpc3QgY2FjaGUgb2YgYWxsb2MgaW5mbyAqLworCXVuc2lnbmVkIGlfbl9zZWNzOwkvKiAoZmlsZXMpIG1pbmltYWxpc3QgY2FjaGUgb2YgYWxsb2MgaW5mbyAqLworCXVuc2lnbmVkIGlfZWFfc2l6ZTsJLyogc2l6ZSBvZiBleHRlbmRlZCBhdHRyaWJ1dGVzICovCisJdW5zaWduZWQgaV9jb252IDogMjsJLyogKGZpbGVzKSBjcmxmLT5uZXdsaW5lIGhhY2tlcnkgKi8KKwl1bnNpZ25lZCBpX2VhX21vZGUgOiAxOwkvKiBmaWxlJ3MgcGVybWlzc2lvbiBpcyBzdG9yZWQgaW4gZWEgKi8KKwl1bnNpZ25lZCBpX2VhX3VpZCA6IDE7CS8qIGZpbGUncyB1aWQgaXMgc3RvcmVkIGluIGVhICovCisJdW5zaWduZWQgaV9lYV9naWQgOiAxOwkvKiBmaWxlJ3MgZ2lkIGlzIHN0b3JlZCBpbiBlYSAqLworCXVuc2lnbmVkIGlfZGlydHkgOiAxOworCXN0cnVjdCBzZW1hcGhvcmUgaV9zZW07CisJc3RydWN0IHNlbWFwaG9yZSBpX3BhcmVudDsKKwlsb2ZmX3QgKippX3JkZGlyX29mZjsKKwlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOworfTsKKworc3RydWN0IGhwZnNfc2JfaW5mbyB7CisJaW5vX3Qgc2Jfcm9vdDsJCQkvKiBpbm9kZSBudW1iZXIgb2Ygcm9vdCBkaXIgKi8KKwl1bnNpZ25lZCBzYl9mc19zaXplOwkJLyogZmlsZSBzeXN0ZW0gc2l6ZSwgc2VjdG9ycyAqLworCXVuc2lnbmVkIHNiX2JpdG1hcHM7CQkvKiBzZWN0b3IgbnVtYmVyIG9mIGJpdG1hcCBsaXN0ICovCisJdW5zaWduZWQgc2JfZGlyYmFuZF9zdGFydDsJLyogZGlyZWN0b3J5IGJhbmQgc3RhcnQgc2VjdG9yICovCisJdW5zaWduZWQgc2JfZGlyYmFuZF9zaXplOwkvKiBkaXJlY3RvcnkgYmFuZCBzaXplLCBkbm9kZXMgKi8KKwl1bnNpZ25lZCBzYl9kbWFwOwkJLyogc2VjdG9yIG51bWJlciBvZiBkbm9kZSBiaXQgbWFwICovCisJdW5zaWduZWQgc2Jfbl9mcmVlOwkJLyogZnJlZSBibG9ja3MgZm9yIHN0YXRmcywgb3IgLTEgKi8KKwl1bnNpZ25lZCBzYl9uX2ZyZWVfZG5vZGVzOwkvKiBmcmVlIGRub2RlcyBmb3Igc3RhdGZzLCBvciAtMSAqLworCXVpZF90IHNiX3VpZDsJCQkvKiB1aWQgZnJvbSBtb3VudCBvcHRpb25zICovCisJZ2lkX3Qgc2JfZ2lkOwkJCS8qIGdpZCBmcm9tIG1vdW50IG9wdGlvbnMgKi8KKwl1bW9kZV90IHNiX21vZGU7CQkvKiBtb2RlIGZyb20gbW91bnQgb3B0aW9ucyAqLworCXVuc2lnbmVkIHNiX2NvbnYgOiAyOwkJLyogY3JsZi0+bmV3bGluZSBoYWNrZXJ5ICovCisJdW5zaWduZWQgc2JfZWFzIDogMjsJCS8qIGVhczogMC1pZ25vcmUsIDEtcm8sIDItcncgKi8KKwl1bnNpZ25lZCBzYl9lcnIgOiAyOwkJLyogb24gZXJyczogMC1jb250LCAxLXJvLCAyLXBhbmljICovCisJdW5zaWduZWQgc2JfY2hrIDogMjsJCS8qIGNoZWNrczogMC1ubywgMS1ub3JtYWwsIDItc3RyaWN0ICovCisJdW5zaWduZWQgc2JfbG93ZXJjYXNlIDogMTsJLyogZG93bmNhc2UgZmlsZW5hbWVzIGhhY2tlcnkgKi8KKwl1bnNpZ25lZCBzYl93YXNfZXJyb3IgOiAxOwkvKiB0aGVyZSB3YXMgYW4gZXJyb3IsIHNldCBkaXJ0eSBmbGFnICovCisJdW5zaWduZWQgc2JfY2hrZHNrIDogMjsJCS8qIGNoa2RzazogMC1ubywgMS1vbiBlcnJzLCAyLWFsbHdheXMgKi8KKwl1bnNpZ25lZCBjaGFyICpzYl9jcF90YWJsZTsJLyogY29kZSBwYWdlIHRhYmxlczogKi8KKwkJCQkJLyogCTEyOCBieXRlcyB1cHBlcmNhc2luZyB0YWJsZSAmICovCisJCQkJCS8qCTEyOCBieXRlcyBsb3dlcmNhc2luZyB0YWJsZSAqLworCXVuc2lnbmVkICpzYl9ibXBfZGlyOwkJLyogbWFpbiBiaXRtYXAgZGlyZWN0b3J5ICovCisJdW5zaWduZWQgc2JfY19iaXRtYXA7CQkvKiBjdXJyZW50IGJpdG1hcCAqLworCXVuc2lnbmVkIHNiX21heF9md2RfYWxsb2M7CS8qIG1heCBmb3J3YWQgYWxsb2NhdGlvbiAqLworCXN0cnVjdCBzZW1hcGhvcmUgaHBmc19jcmVhdGlvbl9kZTsgLyogd2hlbiBjcmVhdGluZyBkaXJlbnRzLCBub2JvZHkgZWxzZQorCQkJCQkgICBjYW4gYWxsb2MgYmxvY2tzICovCisJLyp1bnNpZ25lZCBzYl9tb3VudGluZyA6IDE7Ki8KKwlpbnQgc2JfdGltZXNoaWZ0OworfTsKKworLyoKKyAqIGNvbnY9IG9wdGlvbnMKKyAqLworCisjZGVmaW5lIENPTlZfQklOQVJZIDAJCQkvKiBubyBjb252ZXJzaW9uICovCisjZGVmaW5lIENPTlZfVEVYVCAxCQkJLyogY3JsZi0+bmV3bGluZSAqLworI2RlZmluZSBDT05WX0FVVE8gMgkJCS8qIGRlY2lkZSBiYXNlZCBvbiBmaWxlIGNvbnRlbnRzICovCisKKy8qIEZvdXIgNTEyLWJ5dGUgYnVmZmVycyBhbmQgdGhlIDJrIGJsb2NrIG9idGFpbmVkIGJ5IGNvbmNhdGVuYXRpbmcgdGhlbSAqLworCitzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCB7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaFs0XTsKKwl2b2lkICpkYXRhOworfTsKKworLyogVGhlIGItdHJlZSBkb3duIHBvaW50ZXIgZnJvbSBhIGRpciBlbnRyeSAqLworCitzdGF0aWMgaW5saW5lIGRub2RlX3NlY25vIGRlX2Rvd25fcG9pbnRlciAoc3RydWN0IGhwZnNfZGlyZW50ICpkZSkKK3sKKyAgQ0hLQ09ORChkZS0+ZG93biwoIkhQRlM6IGRlX2Rvd25fcG9pbnRlcjogIWRlLT5kb3duXG4iKSk7CisgIHJldHVybiAqKGRub2RlX3NlY25vICopICgodm9pZCAqKSBkZSArIGRlLT5sZW5ndGggLSA0KTsKK30KKworLyogVGhlIGZpcnN0IGRpciBlbnRyeSBpbiBhIGRub2RlICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGhwZnNfZGlyZW50ICpkbm9kZV9maXJzdF9kZSAoc3RydWN0IGRub2RlICpkbm9kZSkKK3sKKyAgcmV0dXJuICh2b2lkICopIGRub2RlLT5kaXJlbnQ7Cit9CisKKy8qIFRoZSBlbmQrMSBvZiB0aGUgZGlyIGVudHJpZXMgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaHBmc19kaXJlbnQgKmRub2RlX2VuZF9kZSAoc3RydWN0IGRub2RlICpkbm9kZSkKK3sKKyAgQ0hLQ09ORChkbm9kZS0+Zmlyc3RfZnJlZT49MHgxNCAmJiBkbm9kZS0+Zmlyc3RfZnJlZTw9MHhhMDAsKCJIUEZTOiBkbm9kZV9lbmRfZGU6IGRub2RlLT5maXJzdF9mcmVlID0gJWRcbiIsKGludClkbm9kZS0+Zmlyc3RfZnJlZSkpOworICByZXR1cm4gKHZvaWQgKikgZG5vZGUgKyBkbm9kZS0+Zmlyc3RfZnJlZTsKK30KKworLyogVGhlIGRpciBlbnRyeSBhZnRlciBkaXIgZW50cnkgZGUgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlX25leHRfZGUgKHN0cnVjdCBocGZzX2RpcmVudCAqZGUpCit7CisgIENIS0NPTkQoZGUtPmxlbmd0aD49MHgyMCAmJiBkZS0+bGVuZ3RoPDB4ODAwLCgiSFBGUzogZGVfbmV4dF9kZTogZGUtPmxlbmd0aCA9ICVkXG4iLChpbnQpZGUtPmxlbmd0aCkpOworICByZXR1cm4gKHZvaWQgKikgZGUgKyBkZS0+bGVuZ3RoOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKmZub2RlX2VhKHN0cnVjdCBmbm9kZSAqZm5vZGUpCit7CisJcmV0dXJuIChzdHJ1Y3QgZXh0ZW5kZWRfYXR0cmlidXRlICopKChjaGFyICopZm5vZGUgKyBmbm9kZS0+ZWFfb2ZmcyArIGZub2RlLT5hY2xfc2l6ZV9zKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXh0ZW5kZWRfYXR0cmlidXRlICpmbm9kZV9lbmRfZWEoc3RydWN0IGZub2RlICpmbm9kZSkKK3sKKwlyZXR1cm4gKHN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKikoKGNoYXIgKilmbm9kZSArIGZub2RlLT5lYV9vZmZzICsgZm5vZGUtPmFjbF9zaXplX3MgKyBmbm9kZS0+ZWFfc2l6ZV9zKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXh0ZW5kZWRfYXR0cmlidXRlICpuZXh0X2VhKHN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKmVhKQoreworCXJldHVybiAoc3RydWN0IGV4dGVuZGVkX2F0dHJpYnV0ZSAqKSgoY2hhciAqKWVhICsgNSArIGVhLT5uYW1lbGVuICsgZWEtPnZhbHVlbGVuKTsKK30KKworc3RhdGljIGlubGluZSBzZWNubyBlYV9zZWMoc3RydWN0IGV4dGVuZGVkX2F0dHJpYnV0ZSAqZWEpCit7CisJcmV0dXJuICooc2Vjbm8gKikoKGNoYXIgKillYSArIDkgKyBlYS0+bmFtZWxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2Vjbm8gZWFfbGVuKHN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKmVhKQoreworCXJldHVybiAqKHNlY25vICopKChjaGFyICopZWEgKyA1ICsgZWEtPm5hbWVsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKmVhX2RhdGEoc3RydWN0IGV4dGVuZGVkX2F0dHJpYnV0ZSAqZWEpCit7CisJcmV0dXJuIChjaGFyICopKChjaGFyICopZWEgKyA1ICsgZWEtPm5hbWVsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGRlX3NpemUoaW50IG5hbWVsZW4sIHNlY25vIGRvd25fcHRyKQoreworCXJldHVybiAoKDB4MWYgKyBuYW1lbGVuICsgMykgJiB+MykgKyAoZG93bl9wdHIgPyA0IDogMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2RlKHN0cnVjdCBocGZzX2RpcmVudCAqZHN0LCBzdHJ1Y3QgaHBmc19kaXJlbnQgKnNyYykKK3sKKwlpbnQgYTsKKwlpbnQgbjsKKwlpZiAoIWRzdCB8fCAhc3JjKSByZXR1cm47CisJYSA9IGRzdC0+ZG93bjsKKwluID0gZHN0LT5ub3RfOHgzOworCW1lbWNweSgoY2hhciAqKWRzdCArIDIsIChjaGFyICopc3JjICsgMiwgMjgpOworCWRzdC0+ZG93biA9IGE7CisJZHN0LT5ub3RfOHgzID0gbjsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCB0c3RiaXRzKHVuc2lnbmVkICpibXAsIHVuc2lnbmVkIGIsIHVuc2lnbmVkIG4pCit7CisJaW50IGk7CisJaWYgKChiID49IDB4NDAwMCkgfHwgKGIgKyBuIC0gMSA+PSAweDQwMDApKSByZXR1cm4gbjsKKwlpZiAoISgoYm1wWyhiICYgMHgzZmZmKSA+PiA1XSA+PiAoYiAmIDB4MWYpKSAmIDEpKSByZXR1cm4gMTsKKwlmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKQorCQlpZiAoLypiK2kgPCAweDQwMDAgJiYqLyAhKChibXBbKChiK2kpICYgMHgzZmZmKSA+PiA1XSA+PiAoKGIraSkgJiAweDFmKSkgJiAxKSkKKwkJCXJldHVybiBpICsgMTsKKwlyZXR1cm4gMDsKK30KKworLyogYWxsb2MuYyAqLworCitpbnQgaHBmc19jaGtfc2VjdG9ycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc2Vjbm8sIGludCwgY2hhciAqKTsKK3NlY25vIGhwZnNfYWxsb2Nfc2VjdG9yKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWNubywgdW5zaWduZWQsIGludCwgaW50KTsKK2ludCBocGZzX2FsbG9jX2lmX3Bvc3NpYmxlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWNubyk7Cit2b2lkIGhwZnNfZnJlZV9zZWN0b3JzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWNubywgdW5zaWduZWQpOworaW50IGhwZnNfY2hlY2tfZnJlZV9kbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCk7Cit2b2lkIGhwZnNfZnJlZV9kbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc2Vjbm8pOworc3RydWN0IGRub2RlICpocGZzX2FsbG9jX2Rub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWNubywgZG5vZGVfc2Vjbm8gKiwgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKiwgaW50KTsKK3N0cnVjdCBmbm9kZSAqaHBmc19hbGxvY19mbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc2Vjbm8sIGZub2RlX3NlY25vICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKik7CitzdHJ1Y3QgYW5vZGUgKmhwZnNfYWxsb2NfYW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICosIHNlY25vLCBhbm9kZV9zZWNubyAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiopOworCisvKiBhbm9kZS5jICovCisKK3NlY25vIGhwZnNfYnBsdXNfbG9va3VwKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGJwbHVzX2hlYWRlciAqLCB1bnNpZ25lZCwgc3RydWN0IGJ1ZmZlcl9oZWFkICopOworc2Vjbm8gaHBmc19hZGRfc2VjdG9yX3RvX2J0cmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWNubywgaW50LCB1bnNpZ25lZCk7Cit2b2lkIGhwZnNfcmVtb3ZlX2J0cmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgYnBsdXNfaGVhZGVyICopOworaW50IGhwZnNfZWFfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc2Vjbm8sIGludCwgdW5zaWduZWQsIHVuc2lnbmVkLCBjaGFyICopOworaW50IGhwZnNfZWFfd3JpdGUoc3RydWN0IHN1cGVyX2Jsb2NrICosIHNlY25vLCBpbnQsIHVuc2lnbmVkLCB1bnNpZ25lZCwgY2hhciAqKTsKK3ZvaWQgaHBmc19lYV9yZW1vdmUoc3RydWN0IHN1cGVyX2Jsb2NrICosIHNlY25vLCBpbnQsIHVuc2lnbmVkKTsKK3ZvaWQgaHBmc190cnVuY2F0ZV9idHJlZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc2Vjbm8sIGludCwgdW5zaWduZWQpOwordm9pZCBocGZzX3JlbW92ZV9mbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgZm5vZGVfc2Vjbm8gZm5vKTsKKworLyogYnVmZmVyLmMgKi8KKwordm9pZCBocGZzX2xvY2tfY3JlYXRpb24oc3RydWN0IHN1cGVyX2Jsb2NrICopOwordm9pZCBocGZzX3VubG9ja19jcmVhdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Cit2b2lkICpocGZzX21hcF9zZWN0b3Ioc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiosIGludCk7Cit2b2lkICpocGZzX2dldF9zZWN0b3Ioc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiopOwordm9pZCAqaHBmc19tYXBfNHNlY3RvcnMoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkLCBzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCAqLCBpbnQpOwordm9pZCAqaHBmc19nZXRfNHNlY3RvcnMoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkLCBzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCAqKTsKK3ZvaWQgaHBmc19icmVsc2U0KHN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkICopOwordm9pZCBocGZzX21hcmtfNGJ1ZmZlcnNfZGlydHkoc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKik7CisKKy8qIGRlbnRyeS5jICovCisKK3ZvaWQgaHBmc19zZXRfZGVudHJ5X29wZXJhdGlvbnMoc3RydWN0IGRlbnRyeSAqKTsKKworLyogZGlyLmMgKi8KKworc3RydWN0IGRlbnRyeSAqaHBmc19sb29rdXAoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IG5hbWVpZGF0YSAqKTsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhwZnNfZGlyX29wczsKKworLyogZG5vZGUuYyAqLworCit2b2lkIGhwZnNfYWRkX3BvcyhzdHJ1Y3QgaW5vZGUgKiwgbG9mZl90ICopOwordm9pZCBocGZzX2RlbF9wb3Moc3RydWN0IGlub2RlICosIGxvZmZfdCAqKTsKK3N0cnVjdCBocGZzX2RpcmVudCAqaHBmc19hZGRfZGUoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBkbm9kZSAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkLCBzZWNubyk7CitpbnQgaHBmc19hZGRfZGlyZW50KHN0cnVjdCBpbm9kZSAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkLCBzdHJ1Y3QgaHBmc19kaXJlbnQgKiwgaW50KTsKK2ludCBocGZzX3JlbW92ZV9kaXJlbnQoc3RydWN0IGlub2RlICosIGRub2RlX3NlY25vLCBzdHJ1Y3QgaHBmc19kaXJlbnQgKiwgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKiwgaW50KTsKK3ZvaWQgaHBmc19jb3VudF9kbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICosIGRub2RlX3NlY25vLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2Rub2RlX3NlY25vIGhwZnNfZGVfYXNfZG93bl9hc19wb3NzaWJsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgZG5vZGVfc2Vjbm8gZG5vKTsKK3N0cnVjdCBocGZzX2RpcmVudCAqbWFwX3Bvc19kaXJlbnQoc3RydWN0IGlub2RlICosIGxvZmZfdCAqLCBzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCAqKTsKK3N0cnVjdCBocGZzX2RpcmVudCAqbWFwX2RpcmVudChzdHJ1Y3QgaW5vZGUgKiwgZG5vZGVfc2Vjbm8sIGNoYXIgKiwgdW5zaWduZWQsIGRub2RlX3NlY25vICosIHN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkICopOwordm9pZCBocGZzX3JlbW92ZV9kdHJlZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgZG5vZGVfc2Vjbm8pOworc3RydWN0IGhwZnNfZGlyZW50ICptYXBfZm5vZGVfZGlyZW50KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBmbm9kZV9zZWNubywgc3RydWN0IGZub2RlICosIHN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkICopOworCisvKiBlYS5jICovCisKK3ZvaWQgaHBmc19lYV9leHRfcmVtb3ZlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWNubywgaW50LCB1bnNpZ25lZCk7CitpbnQgaHBmc19yZWFkX2VhKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgZm5vZGUgKiwgY2hhciAqLCBjaGFyICosIGludCk7CitjaGFyICpocGZzX2dldF9lYShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGZub2RlICosIGNoYXIgKiwgaW50ICopOwordm9pZCBocGZzX3NldF9lYShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZub2RlICosIGNoYXIgKiwgY2hhciAqLCBpbnQpOworCisvKiBmaWxlLmMgKi8KKworaW50IGhwZnNfZmlsZV9mc3luYyhzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBocGZzX2ZpbGVfb3BzOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGhwZnNfZmlsZV9pb3BzOworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgaHBmc19hb3BzOworCisvKiBpbm9kZS5jICovCisKK3ZvaWQgaHBmc19pbml0X2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK3ZvaWQgaHBmc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK3ZvaWQgaHBmc193cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7Cit2b2lkIGhwZnNfd3JpdGVfaW5vZGVfbm9sb2NrKHN0cnVjdCBpbm9kZSAqKTsKK2ludCBocGZzX25vdGlmeV9jaGFuZ2Uoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaWF0dHIgKik7Cit2b2lkIGhwZnNfd3JpdGVfaWZfY2hhbmdlZChzdHJ1Y3QgaW5vZGUgKik7Cit2b2lkIGhwZnNfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKKworLyogbWFwLmMgKi8KKwordW5zaWduZWQgKmhwZnNfbWFwX2Rub2RlX2JpdG1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKik7Cit1bnNpZ25lZCAqaHBmc19tYXBfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1bnNpZ25lZCwgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKiwgY2hhciAqKTsKK2NoYXIgKmhwZnNfbG9hZF9jb2RlX3BhZ2Uoc3RydWN0IHN1cGVyX2Jsb2NrICosIHNlY25vKTsKK3NlY25vICpocGZzX2xvYWRfYml0bWFwX2RpcmVjdG9yeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc2Vjbm8gYm1wKTsKK3N0cnVjdCBmbm9kZSAqaHBmc19tYXBfZm5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBpbm9fdCwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqKTsKK3N0cnVjdCBhbm9kZSAqaHBmc19tYXBfYW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBhbm9kZV9zZWNubywgc3RydWN0IGJ1ZmZlcl9oZWFkICoqKTsKK3N0cnVjdCBkbm9kZSAqaHBmc19tYXBfZG5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBkbm9kZV9zZWNubywgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKik7Citkbm9kZV9zZWNubyBocGZzX2Zub2RlX2RubyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGlub190IGlubyk7CisKKy8qIG5hbWUuYyAqLworCit1bnNpZ25lZCBjaGFyIGhwZnNfdXBjYXNlKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhcik7CitpbnQgaHBmc19jaGtfbmFtZSh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkICopOworY2hhciAqaHBmc190cmFuc2xhdGVfbmFtZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCwgaW50LCBpbnQpOworaW50IGhwZnNfY29tcGFyZV9uYW1lcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCwgaW50KTsKK2ludCBocGZzX2lzX25hbWVfbG9uZyh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkKTsKK3ZvaWQgaHBmc19hZGp1c3RfbGVuZ3RoKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgKik7Cit2b2lkIGhwZnNfZGVjaWRlX2NvbnYoc3RydWN0IGlub2RlICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQpOworCisvKiBuYW1laS5jICovCisKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBocGZzX2Rpcl9pb3BzOworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgaHBmc19zeW1saW5rX2FvcHM7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGhwZnNfaW5vZGVfaW5mbyAqaHBmc19pKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGxpc3RfZW50cnkoaW5vZGUsIHN0cnVjdCBocGZzX2lub2RlX2luZm8sIHZmc19pbm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGhwZnNfc2JfaW5mbyAqaHBmc19zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiBzYi0+c19mc19pbmZvOworfQorCisvKiBzdXBlci5jICovCisKK3ZvaWQgaHBmc19lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY2hhciAqLCAuLi4pOworaW50IGhwZnNfc3RvcF9jeWNsZXMoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgaW50ICosIGludCAqLCBjaGFyICopOwordW5zaWduZWQgaHBmc19jb3VudF9vbmVfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWNubyk7CisKKy8qCisgKiBsb2NhbCB0aW1lIChIUEZTKSB0byBHTVQgKFVuaXgpCisgKi8KKworc3RhdGljIGlubGluZSB0aW1lX3QgbG9jYWxfdG9fZ210KHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdGltZTMyX3QgdCkKK3sKKwlleHRlcm4gc3RydWN0IHRpbWV6b25lIHN5c190ejsKKwlyZXR1cm4gdCArIHN5c190ei50el9taW51dGVzd2VzdCAqIDYwICsgaHBmc19zYihzKS0+c2JfdGltZXNoaWZ0OworfQorCitzdGF0aWMgaW5saW5lIHRpbWUzMl90IGdtdF90b19sb2NhbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHRpbWVfdCB0KQoreworCWV4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OworCXJldHVybiB0IC0gc3lzX3R6LnR6X21pbnV0ZXN3ZXN0ICogNjAgLSBocGZzX3NiKHMpLT5zYl90aW1lc2hpZnQ7Cit9CmRpZmYgLS1naXQgYS9mcy9ocGZzL2lub2RlLmMgYi9mcy9ocGZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiMTc0MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hwZnMvaW5vZGUuYwpAQCAtMCwwICsxLDI5MSBAQAorLyoKKyAqICBsaW51eC9mcy9ocGZzL2lub2RlLmMKKyAqCisgKiAgTWlrdWxhcyBQYXRvY2thIChtaWt1bGFzQGFydGF4Lmthcmxpbi5tZmYuY3VuaS5jeiksIDE5OTgtMTk5OQorICoKKyAqICBpbm9kZSBWRlMgZnVuY3Rpb25zCisgKi8KKworI2luY2x1ZGUgImhwZnNfZm4uaCIKKwordm9pZCBocGZzX2luaXRfaW5vZGUoc3RydWN0IGlub2RlICppKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpLT5pX3NiOworCXN0cnVjdCBocGZzX2lub2RlX2luZm8gKmhwZnNfaW5vZGUgPSBocGZzX2koaSk7CisKKwlpLT5pX3VpZCA9IGhwZnNfc2Ioc2IpLT5zYl91aWQ7CisJaS0+aV9naWQgPSBocGZzX3NiKHNiKS0+c2JfZ2lkOworCWktPmlfbW9kZSA9IGhwZnNfc2Ioc2IpLT5zYl9tb2RlOworCWhwZnNfaW5vZGUtPmlfY29udiA9IGhwZnNfc2Ioc2IpLT5zYl9jb252OworCWktPmlfYmxrc2l6ZSA9IDUxMjsKKwlpLT5pX3NpemUgPSAtMTsKKwlpLT5pX2Jsb2NrcyA9IC0xOworCQorCWhwZnNfaW5vZGUtPmlfZG5vID0gMDsKKwlocGZzX2lub2RlLT5pX25fc2VjcyA9IDA7CisJaHBmc19pbm9kZS0+aV9maWxlX3NlYyA9IDA7CisJaHBmc19pbm9kZS0+aV9kaXNrX3NlYyA9IDA7CisJaHBmc19pbm9kZS0+aV9kcG9zID0gMDsKKwlocGZzX2lub2RlLT5pX2RzdWJkbm8gPSAwOworCWhwZnNfaW5vZGUtPmlfZWFfbW9kZSA9IDA7CisJaHBmc19pbm9kZS0+aV9lYV91aWQgPSAwOworCWhwZnNfaW5vZGUtPmlfZWFfZ2lkID0gMDsKKwlocGZzX2lub2RlLT5pX2VhX3NpemUgPSAwOworCisJaHBmc19pbm9kZS0+aV9yZGRpcl9vZmYgPSBOVUxMOworCWhwZnNfaW5vZGUtPmlfZGlydHkgPSAwOworCisJaS0+aV9jdGltZS50dl9zZWMgPSBpLT5pX2N0aW1lLnR2X25zZWMgPSAwOworCWktPmlfbXRpbWUudHZfc2VjID0gaS0+aV9tdGltZS50dl9uc2VjID0gMDsKKwlpLT5pX2F0aW1lLnR2X3NlYyA9IGktPmlfYXRpbWUudHZfbnNlYyA9IDA7Cit9CisKK3ZvaWQgaHBmc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBmbm9kZSAqZm5vZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGktPmlfc2I7CisJc3RydWN0IGhwZnNfaW5vZGVfaW5mbyAqaHBmc19pbm9kZSA9IGhwZnNfaShpKTsKKwl1bnNpZ25lZCBjaGFyICplYTsKKwlpbnQgZWFfc2l6ZTsKKworCWlmICghKGZub2RlID0gaHBmc19tYXBfZm5vZGUoc2IsIGktPmlfaW5vLCAmYmgpKSkgeworCQkvKmktPmlfbW9kZSB8PSBTX0lGUkVHOworCQlpLT5pX21vZGUgJj0gfjAxMTE7CisJCWktPmlfb3AgPSAmaHBmc19maWxlX2lvcHM7CisJCWktPmlfZm9wID0gJmhwZnNfZmlsZV9vcHM7CisJCWktPmlfbmxpbmsgPSAwOyovCisJCW1ha2VfYmFkX2lub2RlKGkpOworCQlyZXR1cm47CisJfQorCWlmIChocGZzX3NiKGktPmlfc2IpLT5zYl9lYXMpIHsKKwkJaWYgKChlYSA9IGhwZnNfZ2V0X2VhKGktPmlfc2IsIGZub2RlLCAiVUlEIiwgJmVhX3NpemUpKSkgeworCQkJaWYgKGVhX3NpemUgPT0gMikgeworCQkJCWktPmlfdWlkID0gbGUxNl90b19jcHUoKih1MTYqKWVhKTsKKwkJCQlocGZzX2lub2RlLT5pX2VhX3VpZCA9IDE7CisJCQl9CisJCQlrZnJlZShlYSk7CisJCX0KKwkJaWYgKChlYSA9IGhwZnNfZ2V0X2VhKGktPmlfc2IsIGZub2RlLCAiR0lEIiwgJmVhX3NpemUpKSkgeworCQkJaWYgKGVhX3NpemUgPT0gMikgeworCQkJCWktPmlfZ2lkID0gbGUxNl90b19jcHUoKih1MTYqKWVhKTsKKwkJCQlocGZzX2lub2RlLT5pX2VhX2dpZCA9IDE7CisJCQl9CisJCQlrZnJlZShlYSk7CisJCX0KKwkJaWYgKChlYSA9IGhwZnNfZ2V0X2VhKGktPmlfc2IsIGZub2RlLCAiU1lNTElOSyIsICZlYV9zaXplKSkpIHsKKwkJCWtmcmVlKGVhKTsKKwkJCWktPmlfbW9kZSA9IFNfSUZMTksgfCAwNzc3OworCQkJaS0+aV9vcCA9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWktPmlfZGF0YS5hX29wcyA9ICZocGZzX3N5bWxpbmtfYW9wczsKKwkJCWktPmlfbmxpbmsgPSAxOworCQkJaS0+aV9zaXplID0gZWFfc2l6ZTsKKwkJCWktPmlfYmxvY2tzID0gMTsKKwkJCWJyZWxzZShiaCk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKChlYSA9IGhwZnNfZ2V0X2VhKGktPmlfc2IsIGZub2RlLCAiTU9ERSIsICZlYV9zaXplKSkpIHsKKwkJCWludCByZGV2ID0gMDsKKwkJCXVtb2RlX3QgbW9kZSA9IGhwZnNfc2Ioc2IpLT5zYl9tb2RlOworCQkJaWYgKGVhX3NpemUgPT0gMikgeworCQkJCW1vZGUgPSBsZTE2X3RvX2NwdSgqKHUxNiopZWEpOworCQkJCWhwZnNfaW5vZGUtPmlfZWFfbW9kZSA9IDE7CisJCQl9CisJCQlrZnJlZShlYSk7CisJCQlpLT5pX21vZGUgPSBtb2RlOworCQkJaWYgKFNfSVNCTEsobW9kZSkgfHwgU19JU0NIUihtb2RlKSkgeworCQkJCWlmICgoZWEgPSBocGZzX2dldF9lYShpLT5pX3NiLCBmbm9kZSwgIkRFViIsICZlYV9zaXplKSkpIHsKKwkJCQkJaWYgKGVhX3NpemUgPT0gNCkKKwkJCQkJCXJkZXYgPSBsZTMyX3RvX2NwdSgqKHUzMiopZWEpOworCQkJCQlrZnJlZShlYSk7CisJCQkJfQorCQkJfQorCQkJaWYgKFNfSVNCTEsobW9kZSkgfHwgU19JU0NIUihtb2RlKSB8fCBTX0lTRklGTyhtb2RlKSB8fCBTX0lTU09DSyhtb2RlKSkgeworCQkJCWJyZWxzZShiaCk7CisJCQkJaS0+aV9ubGluayA9IDE7CisJCQkJaS0+aV9zaXplID0gMDsKKwkJCQlpLT5pX2Jsb2NrcyA9IDE7CisJCQkJaW5pdF9zcGVjaWFsX2lub2RlKGksIG1vZGUsCisJCQkJCW5ld19kZWNvZGVfZGV2KHJkZXYpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisJaWYgKGZub2RlLT5kaXJmbGFnKSB7CisJCXVuc2lnbmVkIG5fZG5vZGVzLCBuX3N1YmRpcnM7CisJCWktPmlfbW9kZSB8PSBTX0lGRElSOworCQlpLT5pX29wID0gJmhwZnNfZGlyX2lvcHM7CisJCWktPmlfZm9wID0gJmhwZnNfZGlyX29wczsKKwkJaHBmc19pbm9kZS0+aV9wYXJlbnRfZGlyID0gZm5vZGUtPnVwOworCQlocGZzX2lub2RlLT5pX2RubyA9IGZub2RlLT51LmV4dGVybmFsWzBdLmRpc2tfc2Vjbm87CisJCWlmIChocGZzX3NiKHNiKS0+c2JfY2hrID49IDIpIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgwOworCQkJaWYgKGhwZnNfbWFwX2Zub2RlKHNiLCBocGZzX2lub2RlLT5pX3BhcmVudF9kaXIsICZiaDApKSBicmVsc2UoYmgwKTsKKwkJfQorCQluX2Rub2RlcyA9IDA7IG5fc3ViZGlycyA9IDA7CisJCWhwZnNfY291bnRfZG5vZGVzKGktPmlfc2IsIGhwZnNfaW5vZGUtPmlfZG5vLCAmbl9kbm9kZXMsICZuX3N1YmRpcnMsIE5VTEwpOworCQlpLT5pX2Jsb2NrcyA9IDQgKiBuX2Rub2RlczsKKwkJaS0+aV9zaXplID0gMjA0OCAqIG5fZG5vZGVzOworCQlpLT5pX25saW5rID0gMiArIG5fc3ViZGlyczsKKwl9IGVsc2UgeworCQlpLT5pX21vZGUgfD0gU19JRlJFRzsKKwkJaWYgKCFocGZzX2lub2RlLT5pX2VhX21vZGUpIGktPmlfbW9kZSAmPSB+MDExMTsKKwkJaS0+aV9vcCA9ICZocGZzX2ZpbGVfaW9wczsKKwkJaS0+aV9mb3AgPSAmaHBmc19maWxlX29wczsKKwkJaS0+aV9ubGluayA9IDE7CisJCWktPmlfc2l6ZSA9IGZub2RlLT5maWxlX3NpemU7CisJCWktPmlfYmxvY2tzID0gKChpLT5pX3NpemUgKyA1MTEpID4+IDkpICsgMTsKKwkJaS0+aV9kYXRhLmFfb3BzID0gJmhwZnNfYW9wczsKKwkJaHBmc19pKGkpLT5tbXVfcHJpdmF0ZSA9IGktPmlfc2l6ZTsKKwl9CisJYnJlbHNlKGJoKTsKK30KKworc3RhdGljIHZvaWQgaHBmc193cml0ZV9pbm9kZV9lYShzdHJ1Y3QgaW5vZGUgKmksIHN0cnVjdCBmbm9kZSAqZm5vZGUpCit7CisJc3RydWN0IGhwZnNfaW5vZGVfaW5mbyAqaHBmc19pbm9kZSA9IGhwZnNfaShpKTsKKwkvKmlmIChmbm9kZS0+YWNsX3NpemVfbCB8fCBmbm9kZS0+YWNsX3NpemVfcykgeworCQkgICBTb21lIHVua25vd24gc3RydWN0dXJlcyBsaWtlIEFDTCBtYXkgYmUgaW4gZm5vZGUsCisJCSAgIHdlJ2QgYmV0dGVyIG5vdCBvdmVyd3JpdGUgdGhlbQorCQlocGZzX2Vycm9yKGktPmlfc2IsICJmbm9kZSAlMDh4IGhhcyBzb21lIHVua25vd24gSFBGUzM4NiBzdHVjdHVyZXMiLCBpLT5pX2lubyk7CisJfSBlbHNlKi8gaWYgKGhwZnNfc2IoaS0+aV9zYiktPnNiX2VhcyA+PSAyKSB7CisJCXUzMiBlYTsKKwkJaWYgKChpLT5pX3VpZCAhPSBocGZzX3NiKGktPmlfc2IpLT5zYl91aWQpIHx8IGhwZnNfaW5vZGUtPmlfZWFfdWlkKSB7CisJCQllYSA9IGNwdV90b19sZTMyKGktPmlfdWlkKTsKKwkJCWhwZnNfc2V0X2VhKGksIGZub2RlLCAiVUlEIiwgKGNoYXIqKSZlYSwgMik7CisJCQlocGZzX2lub2RlLT5pX2VhX3VpZCA9IDE7CisJCX0KKwkJaWYgKChpLT5pX2dpZCAhPSBocGZzX3NiKGktPmlfc2IpLT5zYl9naWQpIHx8IGhwZnNfaW5vZGUtPmlfZWFfZ2lkKSB7CisJCQllYSA9IGNwdV90b19sZTMyKGktPmlfZ2lkKTsKKwkJCWhwZnNfc2V0X2VhKGksIGZub2RlLCAiR0lEIiwgKGNoYXIgKikmZWEsIDIpOworCQkJaHBmc19pbm9kZS0+aV9lYV9naWQgPSAxOworCQl9CisJCWlmICghU19JU0xOSyhpLT5pX21vZGUpKQorCQkJaWYgKChpLT5pX21vZGUgIT0gKChocGZzX3NiKGktPmlfc2IpLT5zYl9tb2RlICYgfihTX0lTRElSKGktPmlfbW9kZSkgPyAwIDogMDExMSkpCisJCQkgIHwgKFNfSVNESVIoaS0+aV9tb2RlKSA/IFNfSUZESVIgOiBTX0lGUkVHKSkKKwkJCSAgJiYgaS0+aV9tb2RlICE9ICgoaHBmc19zYihpLT5pX3NiKS0+c2JfbW9kZSAmIH4oU19JU0RJUihpLT5pX21vZGUpID8gMDIyMiA6IDAzMzMpKQorCQkJICB8IChTX0lTRElSKGktPmlfbW9kZSkgPyBTX0lGRElSIDogU19JRlJFRykpKSB8fCBocGZzX2lub2RlLT5pX2VhX21vZGUpIHsKKwkJCQllYSA9IGNwdV90b19sZTMyKGktPmlfbW9kZSk7CisJCQkJaHBmc19zZXRfZWEoaSwgZm5vZGUsICJNT0RFIiwgKGNoYXIgKikmZWEsIDIpOworCQkJCWhwZnNfaW5vZGUtPmlfZWFfbW9kZSA9IDE7CisJCQl9CisJCWlmIChTX0lTQkxLKGktPmlfbW9kZSkgfHwgU19JU0NIUihpLT5pX21vZGUpKSB7CisJCQllYSA9IGNwdV90b19sZTMyKG5ld19lbmNvZGVfZGV2KGktPmlfcmRldikpOworCQkJaHBmc19zZXRfZWEoaSwgZm5vZGUsICJERVYiLCAoY2hhciAqKSZlYSwgNCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgaHBmc193cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmkpCit7CisJc3RydWN0IGhwZnNfaW5vZGVfaW5mbyAqaHBmc19pbm9kZSA9IGhwZnNfaShpKTsKKwlzdHJ1Y3QgaW5vZGUgKnBhcmVudDsKKwlpZiAoaS0+aV9pbm8gPT0gaHBmc19zYihpLT5pX3NiKS0+c2Jfcm9vdCkgcmV0dXJuOworCWlmIChocGZzX2lub2RlLT5pX3JkZGlyX29mZiAmJiAhYXRvbWljX3JlYWQoJmktPmlfY291bnQpKSB7CisJCWlmICgqaHBmc19pbm9kZS0+aV9yZGRpcl9vZmYpIHByaW50aygiSFBGUzogd3JpdGVfaW5vZGU6IHNvbWUgcG9zaXRpb24gc3RpbGwgdGhlcmVcbiIpOworCQlrZnJlZShocGZzX2lub2RlLT5pX3JkZGlyX29mZik7CisJCWhwZnNfaW5vZGUtPmlfcmRkaXJfb2ZmID0gTlVMTDsKKwl9CisJZG93bigmaHBmc19pbm9kZS0+aV9wYXJlbnQpOworCWlmICghaS0+aV9ubGluaykgeworCQl1cCgmaHBmc19pbm9kZS0+aV9wYXJlbnQpOworCQlyZXR1cm47CisJfQorCXBhcmVudCA9IGlnZXRfbG9ja2VkKGktPmlfc2IsIGhwZnNfaW5vZGUtPmlfcGFyZW50X2Rpcik7CisJaWYgKHBhcmVudCkgeworCQlocGZzX2lub2RlLT5pX2RpcnR5ID0gMDsKKwkJaWYgKHBhcmVudC0+aV9zdGF0ZSAmIElfTkVXKSB7CisJCQlocGZzX2luaXRfaW5vZGUocGFyZW50KTsKKwkJCWhwZnNfcmVhZF9pbm9kZShwYXJlbnQpOworCQkJdW5sb2NrX25ld19pbm9kZShwYXJlbnQpOworCQl9CisJCWRvd24oJmhwZnNfaW5vZGUtPmlfc2VtKTsKKwkJaHBmc193cml0ZV9pbm9kZV9ub2xvY2soaSk7CisJCXVwKCZocGZzX2lub2RlLT5pX3NlbSk7CisJCWlwdXQocGFyZW50KTsKKwl9IGVsc2UgeworCQltYXJrX2lub2RlX2RpcnR5KGkpOworCX0KKwl1cCgmaHBmc19pbm9kZS0+aV9wYXJlbnQpOworfQorCit2b2lkIGhwZnNfd3JpdGVfaW5vZGVfbm9sb2NrKHN0cnVjdCBpbm9kZSAqaSkKK3sKKwlzdHJ1Y3QgaHBmc19pbm9kZV9pbmZvICpocGZzX2lub2RlID0gaHBmc19pKGkpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGZub2RlICpmbm9kZTsKKwlzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCBxYmg7CisJc3RydWN0IGhwZnNfZGlyZW50ICpkZTsKKwlpZiAoaS0+aV9pbm8gPT0gaHBmc19zYihpLT5pX3NiKS0+c2Jfcm9vdCkgcmV0dXJuOworCWlmICghKGZub2RlID0gaHBmc19tYXBfZm5vZGUoaS0+aV9zYiwgaS0+aV9pbm8sICZiaCkpKSByZXR1cm47CisJaWYgKGktPmlfaW5vICE9IGhwZnNfc2IoaS0+aV9zYiktPnNiX3Jvb3QgJiYgaS0+aV9ubGluaykgeworCQlpZiAoIShkZSA9IG1hcF9mbm9kZV9kaXJlbnQoaS0+aV9zYiwgaS0+aV9pbm8sIGZub2RlLCAmcWJoKSkpIHsKKwkJCWJyZWxzZShiaCk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgZGUgPSBOVUxMOworCWlmIChTX0lTUkVHKGktPmlfbW9kZSkpIHsKKwkJZm5vZGUtPmZpbGVfc2l6ZSA9IGktPmlfc2l6ZTsKKwkJaWYgKGRlKSBkZS0+ZmlsZV9zaXplID0gaS0+aV9zaXplOworCX0gZWxzZSBpZiAoU19JU0RJUihpLT5pX21vZGUpKSB7CisJCWZub2RlLT5maWxlX3NpemUgPSAwOworCQlpZiAoZGUpIGRlLT5maWxlX3NpemUgPSAwOworCX0KKwlocGZzX3dyaXRlX2lub2RlX2VhKGksIGZub2RlKTsKKwlpZiAoZGUpIHsKKwkJZGUtPndyaXRlX2RhdGUgPSBnbXRfdG9fbG9jYWwoaS0+aV9zYiwgaS0+aV9tdGltZS50dl9zZWMpOworCQlkZS0+cmVhZF9kYXRlID0gZ210X3RvX2xvY2FsKGktPmlfc2IsIGktPmlfYXRpbWUudHZfc2VjKTsKKwkJZGUtPmNyZWF0aW9uX2RhdGUgPSBnbXRfdG9fbG9jYWwoaS0+aV9zYiwgaS0+aV9jdGltZS50dl9zZWMpOworCQlkZS0+cmVhZF9vbmx5ID0gIShpLT5pX21vZGUgJiAwMjIyKTsKKwkJZGUtPmVhX3NpemUgPSBocGZzX2lub2RlLT5pX2VhX3NpemU7CisJCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eSgmcWJoKTsKKwkJaHBmc19icmVsc2U0KCZxYmgpOworCX0KKwlpZiAoU19JU0RJUihpLT5pX21vZGUpKSB7CisJCWlmICgoZGUgPSBtYXBfZGlyZW50KGksIGhwZnNfaW5vZGUtPmlfZG5vLCAiXDAwMVwwMDEiLCAyLCBOVUxMLCAmcWJoKSkpIHsKKwkJCWRlLT53cml0ZV9kYXRlID0gZ210X3RvX2xvY2FsKGktPmlfc2IsIGktPmlfbXRpbWUudHZfc2VjKTsKKwkJCWRlLT5yZWFkX2RhdGUgPSBnbXRfdG9fbG9jYWwoaS0+aV9zYiwgaS0+aV9hdGltZS50dl9zZWMpOworCQkJZGUtPmNyZWF0aW9uX2RhdGUgPSBnbXRfdG9fbG9jYWwoaS0+aV9zYiwgaS0+aV9jdGltZS50dl9zZWMpOworCQkJZGUtPnJlYWRfb25seSA9ICEoaS0+aV9tb2RlICYgMDIyMik7CisJCQlkZS0+ZWFfc2l6ZSA9IC8qaHBmc19pbm9kZS0+aV9lYV9zaXplKi8wOworCQkJZGUtPmZpbGVfc2l6ZSA9IDA7CisJCQlocGZzX21hcmtfNGJ1ZmZlcnNfZGlydHkoJnFiaCk7CisJCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCX0gZWxzZSBocGZzX2Vycm9yKGktPmlfc2IsICJkaXJlY3RvcnkgJTA4eCBkb2Vzbid0IGhhdmUgJy4nIGVudHJ5IiwgaS0+aV9pbm8pOworCX0KKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJYnJlbHNlKGJoKTsKK30KKworaW50IGhwZnNfbm90aWZ5X2NoYW5nZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvcj0wOworCWxvY2tfa2VybmVsKCk7CisJaWYgKCAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSAmJiBhdHRyLT5pYV9zaXplID4gaW5vZGUtPmlfc2l6ZSkgfHwKKwkgICAgIChocGZzX3NiKGlub2RlLT5pX3NiKS0+c2Jfcm9vdCA9PSBpbm9kZS0+aV9pbm8pICkgeworCQllcnJvciA9IC1FSU5WQUw7CisJfSBlbHNlIGlmICgoZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGF0dHIpKSkgeworCX0gZWxzZSBpZiAoKGVycm9yID0gaW5vZGVfc2V0YXR0cihpbm9kZSwgYXR0cikpKSB7CisJfSBlbHNlIHsKKwkJaHBmc193cml0ZV9pbm9kZShpbm9kZSk7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3ZvaWQgaHBmc193cml0ZV9pZl9jaGFuZ2VkKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGhwZnNfaW5vZGVfaW5mbyAqaHBmc19pbm9kZSA9IGhwZnNfaShpbm9kZSk7CisKKwlpZiAoaHBmc19pbm9kZS0+aV9kaXJ0eSkKKwkJaHBmc193cml0ZV9pbm9kZShpbm9kZSk7Cit9CisKK3ZvaWQgaHBmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlsb2NrX2tlcm5lbCgpOworCWhwZnNfcmVtb3ZlX2Zub2RlKGlub2RlLT5pX3NiLCBpbm9kZS0+aV9pbm8pOworCXVubG9ja19rZXJuZWwoKTsKKwljbGVhcl9pbm9kZShpbm9kZSk7Cit9CmRpZmYgLS1naXQgYS9mcy9ocGZzL21hcC5jIGIvZnMvaHBmcy9tYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmVjZGFjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaHBmcy9tYXAuYwpAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqICBsaW51eC9mcy9ocGZzL21hcC5jCisgKgorICogIE1pa3VsYXMgUGF0b2NrYSAobWlrdWxhc0BhcnRheC5rYXJsaW4ubWZmLmN1bmkuY3opLCAxOTk4LTE5OTkKKyAqCisgKiAgbWFwcGluZyBzdHJ1Y3R1cmVzIHRvIG1lbW9yeSB3aXRoIHNvbWUgbWluaW1hbCBjaGVja3MKKyAqLworCisjaW5jbHVkZSAiaHBmc19mbi5oIgorCit1bnNpZ25lZCAqaHBmc19tYXBfZG5vZGVfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKnFiaCkKK3sKKwlyZXR1cm4gaHBmc19tYXBfNHNlY3RvcnMocywgaHBmc19zYihzKS0+c2JfZG1hcCwgcWJoLCAwKTsKK30KKwordW5zaWduZWQgaW50ICpocGZzX21hcF9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBibXBfYmxvY2ssCisJCQkgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKnFiaCwgY2hhciAqaWQpCit7CisJc2Vjbm8gc2VjOworCWlmIChocGZzX3NiKHMpLT5zYl9jaGspIGlmIChibXBfYmxvY2sgKiAxNjM4NCA+IGhwZnNfc2IocyktPnNiX2ZzX3NpemUpIHsKKwkJaHBmc19lcnJvcihzLCAiaHBmc19tYXBfYml0bWFwIGNhbGxlZCB3aXRoIGJhZCBwYXJhbWV0ZXI6ICUwOHggYXQgJXMiLCBibXBfYmxvY2ssIGlkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNlYyA9IGhwZnNfc2IocyktPnNiX2JtcF9kaXJbYm1wX2Jsb2NrXTsKKwlpZiAoIXNlYyB8fCBzZWMgPiBocGZzX3NiKHMpLT5zYl9mc19zaXplLTQpIHsKKwkJaHBmc19lcnJvcihzLCAiaW52YWxpZCBiaXRtYXAgYmxvY2sgcG9pbnRlciAlMDh4IC0+ICUwOHggYXQgJXMiLCBibXBfYmxvY2ssIHNlYywgaWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGhwZnNfbWFwXzRzZWN0b3JzKHMsIHNlYywgcWJoLCA0KTsKK30KKworLyoKKyAqIExvYWQgZmlyc3QgY29kZSBwYWdlIGludG8ga2VybmVsIG1lbW9yeSwgcmV0dXJuIHBvaW50ZXIgdG8gMjU2LWJ5dGUgYXJyYXksCisgKiBmaXJzdCAxMjggYnl0ZXMgYXJlIHVwcGVyY2FzaW5nIHRhYmxlIGZvciBjaGFycyAxMjgtMjU1LCBuZXh0IDEyOCBieXRlcyBhcmUKKyAqIGxvd2VyY2FzaW5nIHRhYmxlCisgKi8KKworY2hhciAqaHBmc19sb2FkX2NvZGVfcGFnZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHNlY25vIGNwcykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXNlY25vIGNwZHM7CisJdW5zaWduZWQgY3BpOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwl1bnNpZ25lZCBjaGFyICpjcF90YWJsZTsKKwlpbnQgaTsKKwlzdHJ1Y3QgY29kZV9wYWdlX2RhdGEgKmNwZDsKKwlzdHJ1Y3QgY29kZV9wYWdlX2RpcmVjdG9yeSAqY3AgPSBocGZzX21hcF9zZWN0b3IocywgY3BzLCAmYmgsIDApOworCWlmICghY3ApIHJldHVybiBOVUxMOworCWlmIChjcC0+bWFnaWMgIT0gQ1BfRElSX01BR0lDKSB7CisJCXByaW50aygiSFBGUzogQ29kZSBwYWdlIGRpcmVjdG9yeSBtYWdpYyBkb2Vzbid0IG1hdGNoIChtYWdpYyA9ICUwOHgpXG4iLCBjcC0+bWFnaWMpOworCQlicmVsc2UoYmgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCFjcC0+bl9jb2RlX3BhZ2VzKSB7CisJCXByaW50aygiSFBGUzogbl9jb2RlX3BhZ2VzID09IDBcbiIpOworCQlicmVsc2UoYmgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJY3BkcyA9IGNwLT5hcnJheVswXS5jb2RlX3BhZ2VfZGF0YTsKKwljcGkgPSBjcC0+YXJyYXlbMF0uaW5kZXg7CisJYnJlbHNlKGJoKTsKKworCWlmIChjcGkgPj0gMykgeworCQlwcmludGsoIkhQRlM6IENvZGUgcGFnZSBpbmRleCBvdXQgb2YgYXJyYXlcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJaWYgKCEoY3BkID0gaHBmc19tYXBfc2VjdG9yKHMsIGNwZHMsICZiaCwgMCkpKSByZXR1cm4gTlVMTDsKKwlpZiAoKHVuc2lnbmVkKWNwZC0+b2Zmc1tjcGldID4gMHgxNzgpIHsKKwkJcHJpbnRrKCJIUEZTOiBDb2RlIHBhZ2UgaW5kZXggb3V0IG9mIHNlY3RvclxuIik7CisJCWJyZWxzZShiaCk7CisJCXJldHVybiBOVUxMOworCX0KKwlwdHIgPSAoY2hhciAqKWNwZCArIGNwZC0+b2Zmc1tjcGldICsgNjsKKwlpZiAoIShjcF90YWJsZSA9IGttYWxsb2MoMjU2LCBHRlBfS0VSTkVMKSkpIHsKKwkJcHJpbnRrKCJIUEZTOiBvdXQgb2YgbWVtb3J5IGZvciBjb2RlIHBhZ2UgdGFibGVcbiIpOworCQlicmVsc2UoYmgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtY3B5KGNwX3RhYmxlLCBwdHIsIDEyOCk7CisJYnJlbHNlKGJoKTsKKworCS8qIFRyeSB0byBidWlsZCBsb3dlcmNhc2luZyB0YWJsZSBmcm9tIHVwcGVyY2FzaW5nIG9uZSAqLworCisJZm9yIChpPTEyODsgaTwyNTY7IGkrKykgY3BfdGFibGVbaV09aTsKKwlmb3IgKGk9MTI4OyBpPDI1NjsgaSsrKSBpZiAoY3BfdGFibGVbaS0xMjhdIT1pICYmIGNwX3RhYmxlW2ktMTI4XT49MTI4KQorCQljcF90YWJsZVtjcF90YWJsZVtpLTEyOF1dID0gaTsKKwkKKwlyZXR1cm4gY3BfdGFibGU7Cit9CisKK3NlY25vICpocGZzX2xvYWRfYml0bWFwX2RpcmVjdG9yeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHNlY25vIGJtcCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBuID0gKGhwZnNfc2IocyktPnNiX2ZzX3NpemUgKyAweDIwMDAwMCAtIDEpID4+IDIxOworCWludCBpOworCXNlY25vICpiOworCWlmICghKGIgPSBrbWFsbG9jKG4gKiA1MTIsIEdGUF9LRVJORUwpKSkgeworCQlwcmludGsoIkhQRlM6IGNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgYml0bWFwIGRpcmVjdG9yeVxuIik7CisJCXJldHVybiBOVUxMOworCX0JCisJZm9yIChpPTA7aTxuO2krKykgeworCQlzZWNubyAqZCA9IGhwZnNfbWFwX3NlY3RvcihzLCBibXAraSwgJmJoLCBuIC0gaSAtIDEpOworCQlpZiAoIWQpIHsKKwkJCWtmcmVlKGIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJbWVtY3B5KChjaGFyICopYiArIDUxMiAqIGksIGQsIDUxMik7CisJCWJyZWxzZShiaCk7CisJfQorCXJldHVybiBiOworfQorCisvKgorICogTG9hZCBmbm9kZSB0byBtZW1vcnkKKyAqLworCitzdHJ1Y3QgZm5vZGUgKmhwZnNfbWFwX2Zub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgaW5vX3QgaW5vLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHApCit7CisJc3RydWN0IGZub2RlICpmbm9kZTsKKwlpZiAoaHBmc19zYihzKS0+c2JfY2hrKSBpZiAoaHBmc19jaGtfc2VjdG9ycyhzLCBpbm8sIDEsICJmbm9kZSIpKSB7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoKGZub2RlID0gaHBmc19tYXBfc2VjdG9yKHMsIGlubywgYmhwLCBGTk9ERV9SRF9BSEVBRCkpKSB7CisJCWlmIChocGZzX3NiKHMpLT5zYl9jaGspIHsKKwkJCXN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKmVhOworCQkJc3RydWN0IGV4dGVuZGVkX2F0dHJpYnV0ZSAqZWFfZW5kOworCQkJaWYgKGZub2RlLT5tYWdpYyAhPSBGTk9ERV9NQUdJQykgeworCQkJCWhwZnNfZXJyb3IocywgImJhZCBtYWdpYyBvbiBmbm9kZSAlMDh4IiwgaW5vKTsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisJCQlpZiAoIWZub2RlLT5kaXJmbGFnKSB7CisJCQkJaWYgKCh1bnNpZ25lZClmbm9kZS0+YnRyZWUubl91c2VkX25vZGVzICsgKHVuc2lnbmVkKWZub2RlLT5idHJlZS5uX2ZyZWVfbm9kZXMgIT0KKwkJCQkgICAgKGZub2RlLT5idHJlZS5pbnRlcm5hbCA/IDEyIDogOCkpIHsKKwkJCQkJaHBmc19lcnJvcihzLCAiYmFkIG51bWJlciBvZiBub2RlcyBpbiBmbm9kZSAlMDh4IiwgaW5vKTsKKwkJCQkJZ290byBiYWlsOworCQkJCX0KKwkJCQlpZiAoZm5vZGUtPmJ0cmVlLmZpcnN0X2ZyZWUgIT0KKwkJCQkgICAgOCArIGZub2RlLT5idHJlZS5uX3VzZWRfbm9kZXMgKiAoZm5vZGUtPmJ0cmVlLmludGVybmFsID8gOCA6IDEyKSkgeworCQkJCQlocGZzX2Vycm9yKHMsICJiYWQgZmlyc3RfZnJlZSBwb2ludGVyIGluIGZub2RlICUwOHgiLCBpbm8pOworCQkJCQlnb3RvIGJhaWw7CisJCQkJfQorCQkJfQorCQkJaWYgKGZub2RlLT5lYV9zaXplX3MgJiYgKChzaWduZWQgaW50KWZub2RlLT5lYV9vZmZzIDwgMHhjNCB8fAorCQkJICAgKHNpZ25lZCBpbnQpZm5vZGUtPmVhX29mZnMgKyBmbm9kZS0+YWNsX3NpemVfcyArIGZub2RlLT5lYV9zaXplX3MgPiAweDIwMCkpIHsKKwkJCQlocGZzX2Vycm9yKHMsICJiYWQgRUEgaW5mbyBpbiBmbm9kZSAlMDh4OiBlYV9vZmZzID09ICUwNHggZWFfc2l6ZV9zID09ICUwNHgiLAorCQkJCQlpbm8sIGZub2RlLT5lYV9vZmZzLCBmbm9kZS0+ZWFfc2l6ZV9zKTsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisJCQllYSA9IGZub2RlX2VhKGZub2RlKTsKKwkJCWVhX2VuZCA9IGZub2RlX2VuZF9lYShmbm9kZSk7CisJCQl3aGlsZSAoZWEgIT0gZWFfZW5kKSB7CisJCQkJaWYgKGVhID4gZWFfZW5kKSB7CisJCQkJCWhwZnNfZXJyb3IocywgImJhZCBFQSBpbiBmbm9kZSAlMDh4IiwgaW5vKTsKKwkJCQkJZ290byBiYWlsOworCQkJCX0KKwkJCQllYSA9IG5leHRfZWEoZWEpOworCQkJfQorCQl9CisJfQorCXJldHVybiBmbm9kZTsKKwliYWlsOgorCWJyZWxzZSgqYmhwKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGFub2RlICpocGZzX21hcF9hbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGFub2RlX3NlY25vIGFubywgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhwKQoreworCXN0cnVjdCBhbm9kZSAqYW5vZGU7CisJaWYgKGhwZnNfc2IocyktPnNiX2NoaykgaWYgKGhwZnNfY2hrX3NlY3RvcnMocywgYW5vLCAxLCAiYW5vZGUiKSkgcmV0dXJuIE5VTEw7CisJaWYgKChhbm9kZSA9IGhwZnNfbWFwX3NlY3RvcihzLCBhbm8sIGJocCwgQU5PREVfUkRfQUhFQUQpKSkKKwkJaWYgKGhwZnNfc2IocyktPnNiX2NoaykgeworCQkJaWYgKGFub2RlLT5tYWdpYyAhPSBBTk9ERV9NQUdJQyB8fCBhbm9kZS0+c2VsZiAhPSBhbm8pIHsKKwkJCQlocGZzX2Vycm9yKHMsICJiYWQgbWFnaWMgb24gYW5vZGUgJTA4eCIsIGFubyk7CisJCQkJZ290byBiYWlsOworCQkJfQorCQkJaWYgKCh1bnNpZ25lZClhbm9kZS0+YnRyZWUubl91c2VkX25vZGVzICsgKHVuc2lnbmVkKWFub2RlLT5idHJlZS5uX2ZyZWVfbm9kZXMgIT0KKwkJCSAgICAoYW5vZGUtPmJ0cmVlLmludGVybmFsID8gNjAgOiA0MCkpIHsKKwkJCQlocGZzX2Vycm9yKHMsICJiYWQgbnVtYmVyIG9mIG5vZGVzIGluIGFub2RlICUwOHgiLCBhbm8pOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJCWlmIChhbm9kZS0+YnRyZWUuZmlyc3RfZnJlZSAhPQorCQkJICAgIDggKyBhbm9kZS0+YnRyZWUubl91c2VkX25vZGVzICogKGFub2RlLT5idHJlZS5pbnRlcm5hbCA/IDggOiAxMikpIHsKKwkJCQlocGZzX2Vycm9yKHMsICJiYWQgZmlyc3RfZnJlZSBwb2ludGVyIGluIGFub2RlICUwOHgiLCBhbm8pOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJfQorCXJldHVybiBhbm9kZTsKKwliYWlsOgorCWJyZWxzZSgqYmhwKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIExvYWQgZG5vZGUgdG8gbWVtb3J5IGFuZCBkbyBzb21lIGNoZWNrcworICovCisKK3N0cnVjdCBkbm9kZSAqaHBmc19tYXBfZG5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBzZWNubywKKwkJCSAgICAgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKnFiaCkKK3sKKwlzdHJ1Y3QgZG5vZGUgKmRub2RlOworCWlmIChocGZzX3NiKHMpLT5zYl9jaGspIHsKKwkJaWYgKGhwZnNfY2hrX3NlY3RvcnMocywgc2Vjbm8sIDQsICJkbm9kZSIpKSByZXR1cm4gTlVMTDsKKwkJaWYgKHNlY25vICYgMykgeworCQkJaHBmc19lcnJvcihzLCAiZG5vZGUgJTA4eCBub3QgYnl0ZS1hbGlnbmVkIiwgc2Vjbm8pOworCQkJcmV0dXJuIE5VTEw7CisJCX0JCisJfQorCWlmICgoZG5vZGUgPSBocGZzX21hcF80c2VjdG9ycyhzLCBzZWNubywgcWJoLCBETk9ERV9SRF9BSEVBRCkpKQorCQlpZiAoaHBmc19zYihzKS0+c2JfY2hrKSB7CisJCQl1bnNpZ25lZCBwLCBwcCA9IDA7CisJCQl1bnNpZ25lZCBjaGFyICpkID0gKGNoYXIgKilkbm9kZTsKKwkJCWludCBiID0gMDsKKwkJCWlmIChkbm9kZS0+bWFnaWMgIT0gRE5PREVfTUFHSUMpIHsKKwkJCQlocGZzX2Vycm9yKHMsICJiYWQgbWFnaWMgb24gZG5vZGUgJTA4eCIsIHNlY25vKTsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisJCQlpZiAoZG5vZGUtPnNlbGYgIT0gc2Vjbm8pCisJCQkJaHBmc19lcnJvcihzLCAiYmFkIHNlbGYgcG9pbnRlciBvbiBkbm9kZSAlMDh4IHNlbGYgPSAlMDh4Iiwgc2Vjbm8sIGRub2RlLT5zZWxmKTsKKwkJCS8qIENoZWNrIGRpcmVudHMgLSBiYWQgZGlyZW50cyB3b3VsZCBjYXVzZSBpbmZpbml0ZQorCQkJICAgbG9vcHMgb3Igc2hvb3RpbmcgdG8gbWVtb3J5ICovCisJCQlpZiAoZG5vZGUtPmZpcnN0X2ZyZWUgPiAyMDQ4LyogfHwgZG5vZGUtPmZpcnN0X2ZyZWUgPCA4NCovKSB7CisJCQkJaHBmc19lcnJvcihzLCAiZG5vZGUgJTA4eCBoYXMgZmlyc3RfZnJlZSA9PSAlMDh4Iiwgc2Vjbm8sIGRub2RlLT5maXJzdF9mcmVlKTsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisJCQlmb3IgKHAgPSAyMDsgcCA8IGRub2RlLT5maXJzdF9mcmVlOyBwICs9IGRbcF0gKyAoZFtwKzFdIDw8IDgpKSB7CisJCQkJc3RydWN0IGhwZnNfZGlyZW50ICpkZSA9IChzdHJ1Y3QgaHBmc19kaXJlbnQgKikoKGNoYXIgKilkbm9kZSArIHApOworCQkJCWlmIChkZS0+bGVuZ3RoID4gMjkyIHx8IChkZS0+bGVuZ3RoIDwgMzIpIHx8IChkZS0+bGVuZ3RoICYgMykgfHwgcCArIGRlLT5sZW5ndGggPiAyMDQ4KSB7CisJCQkJCWhwZnNfZXJyb3IocywgImJhZCBkaXJlbnQgc2l6ZSBpbiBkbm9kZSAlMDh4LCBkaXJlbnQgJTAzeCwgbGFzdCAlMDN4Iiwgc2Vjbm8sIHAsIHBwKTsKKwkJCQkJZ290byBiYWlsOworCQkJCX0KKwkJCQlpZiAoKCgzMSArIGRlLT5uYW1lbGVuICsgZGUtPmRvd24qNCArIDMpICYgfjMpICE9IGRlLT5sZW5ndGgpIHsKKwkJCQkJaWYgKCgoMzEgKyBkZS0+bmFtZWxlbiArIGRlLT5kb3duKjQgKyAzKSAmIH4zKSA8IGRlLT5sZW5ndGggJiYgcy0+c19mbGFncyAmIE1TX1JET05MWSkgZ290byBvazsKKwkJCQkJaHBmc19lcnJvcihzLCAibmFtZWxlbiBkb2VzIG5vdCBtYXRjaCBkaXJlbnQgc2l6ZSBpbiBkbm9kZSAlMDh4LCBkaXJlbnQgJTAzeCwgbGFzdCAlMDN4Iiwgc2Vjbm8sIHAsIHBwKTsKKwkJCQkJZ290byBiYWlsOworCQkJCX0KKwkJCQlvazoKKwkJCQlpZiAoaHBmc19zYihzKS0+c2JfY2hrID49IDIpIGIgfD0gMSA8PCBkZS0+ZG93bjsKKwkJCQlpZiAoZGUtPmRvd24pIGlmIChkZV9kb3duX3BvaW50ZXIoZGUpIDwgMHgxMCkgeworCQkJCQlocGZzX2Vycm9yKHMsICJiYWQgZG93biBwb2ludGVyIGluIGRub2RlICUwOHgsIGRpcmVudCAlMDN4LCBsYXN0ICUwM3giLCBzZWNubywgcCwgcHApOworCQkJCQlnb3RvIGJhaWw7CisJCQkJfQorCQkJCXBwID0gcDsKKwkJCQkKKwkJCX0KKwkJCWlmIChwICE9IGRub2RlLT5maXJzdF9mcmVlKSB7CisJCQkJaHBmc19lcnJvcihzLCAic2l6ZSBvbiBsYXN0IGRpcmVudCBkb2VzIG5vdCBtYXRjaCBmaXJzdF9mcmVlOyBkbm9kZSAlMDh4Iiwgc2Vjbm8pOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJCWlmIChkW3BwICsgMzBdICE9IDEgfHwgZFtwcCArIDMxXSAhPSAyNTUpIHsKKwkJCQlocGZzX2Vycm9yKHMsICJkbm9kZSAlMDh4IGRvZXMgbm90IGVuZCB3aXRoIFxcMzc3IGVudHJ5Iiwgc2Vjbm8pOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJCWlmIChiID09IDMpIHByaW50aygiSFBGUzogd2FybmluZzogdW5iYWxhbmNlZCBkbm9kZSB0cmVlLCBkbm9kZSAlMDh4OyBzZWUgaHBmcy50eHQgNCBtb3JlIGluZm9cbiIsIHNlY25vKTsKKwkJfQorCXJldHVybiBkbm9kZTsKKwliYWlsOgorCWhwZnNfYnJlbHNlNChxYmgpOworCXJldHVybiBOVUxMOworfQorCitkbm9kZV9zZWNubyBocGZzX2Zub2RlX2RubyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGlub190IGlubykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBmbm9kZSAqZm5vZGU7CisJZG5vZGVfc2Vjbm8gZG5vOworCisJZm5vZGUgPSBocGZzX21hcF9mbm9kZShzLCBpbm8sICZiaCk7CisJaWYgKCFmbm9kZSkKKwkJcmV0dXJuIDA7CisKKwlkbm8gPSBmbm9kZS0+dS5leHRlcm5hbFswXS5kaXNrX3NlY25vOworCWJyZWxzZShiaCk7CisJcmV0dXJuIGRubzsKK30KZGlmZiAtLWdpdCBhL2ZzL2hwZnMvbmFtZS5jIGIvZnMvaHBmcy9uYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY0YTk2NAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hwZnMvbmFtZS5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogIGxpbnV4L2ZzL2hwZnMvbmFtZS5jCisgKgorICogIE1pa3VsYXMgUGF0b2NrYSAobWlrdWxhc0BhcnRheC5rYXJsaW4ubWZmLmN1bmkuY3opLCAxOTk4LTE5OTkKKyAqCisgKiAgb3BlcmF0aW9ucyB3aXRoIGZpbGVuYW1lcworICovCisKKyNpbmNsdWRlICJocGZzX2ZuLmgiCisKK3N0YXRpYyBjaGFyICp0ZXh0X3Bvc3RmaXhbXT17CisiLkFTTSIsICIuQkFTIiwgIi5CQVQiLCAiLkMiLCAiLkNDIiwgIi5DRkciLCAiLkNNRCIsICIuQ09OIiwgIi5DUFAiLCAiLkRFRiIsCisiLkRPQyIsICIuRFBSIiwgIi5FUlgiLCAiLkgiLCAiLkhQUCIsICIuSFRNIiwgIi5IVE1MIiwgIi5KQVZBIiwgIi5MT0ciLCAiLlBBUyIsCisiLlJDIiwgIi5URVgiLCAiLlRYVCIsICIuWSIsICIifTsKKworc3RhdGljIGNoYXIgKnRleHRfcHJlZml4W109eworIkFVVE9FWEVDLiIsICJDSEFOR0VTIiwgIkNPUFlJTkciLCAiQ09ORklHLiIsICJDUkVESVRTIiwgIkZBUSIsICJGSUxFX0lELkRJWiIsCisiTUFLRUZJTEUiLCAiUkVBRC5NRSIsICJSRUFETUUiLCAiVEVSTUNBUCIsICIifTsKKwordm9pZCBocGZzX2RlY2lkZV9jb252KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxlbikKK3sKKwlzdHJ1Y3QgaHBmc19pbm9kZV9pbmZvICpocGZzX2lub2RlID0gaHBmc19pKGlub2RlKTsKKwlpbnQgaTsKKwlpZiAoaHBmc19pbm9kZS0+aV9jb252ICE9IENPTlZfQVVUTykgcmV0dXJuOworCWZvciAoaSA9IDA7ICp0ZXh0X3Bvc3RmaXhbaV07IGkrKykgeworCQlpbnQgbCA9IHN0cmxlbih0ZXh0X3Bvc3RmaXhbaV0pOworCQlpZiAobCA8PSBsZW4pCisJCQlpZiAoIWhwZnNfY29tcGFyZV9uYW1lcyhpbm9kZS0+aV9zYiwgdGV4dF9wb3N0Zml4W2ldLCBsLCBuYW1lICsgbGVuIC0gbCwgbCwgMCkpCisJCQkJZ290byB0ZXh0OworCX0KKwlmb3IgKGkgPSAwOyAqdGV4dF9wcmVmaXhbaV07IGkrKykgeworCQlpbnQgbCA9IHN0cmxlbih0ZXh0X3ByZWZpeFtpXSk7CisJCWlmIChsIDw9IGxlbikKKwkJCWlmICghaHBmc19jb21wYXJlX25hbWVzKGlub2RlLT5pX3NiLCB0ZXh0X3ByZWZpeFtpXSwgbCwgbmFtZSwgbCwgMCkpCisJCQkJZ290byB0ZXh0OworCX0KKwlocGZzX2lub2RlLT5pX2NvbnYgPSBDT05WX0JJTkFSWTsKKwlyZXR1cm47CisJdGV4dDoKKwlocGZzX2lub2RlLT5pX2NvbnYgPSBDT05WX1RFWFQ7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIGludCBub3RfYWxsb3dlZF9jaGFyKHVuc2lnbmVkIGNoYXIgYykKK3sKKwlyZXR1cm4gYzwnICcgfHwgYz09JyInIHx8IGM9PScqJyB8fCBjPT0nLycgfHwgYz09JzonIHx8IGM9PSc8JyB8fAorCSAgICAgIGM9PSc+JyB8fCBjPT0nPycgfHwgYz09J1xcJyB8fCBjPT0nfCc7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5vX2Rvc19jaGFyKHVuc2lnbmVkIGNoYXIgYykKK3sJLyogQ2hhcmFjdGVycyB0aGF0IGFyZSBhbGxvd2VkIGluIEhQRlMgYnV0IG5vdCBpbiBET1MgKi8KKwlyZXR1cm4gYz09JysnIHx8IGM9PScsJyB8fCBjPT0nOycgfHwgYz09Jz0nIHx8IGM9PSdbJyB8fCBjPT0nXSc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciB1cGNhc2UodW5zaWduZWQgY2hhciAqZGlyLCB1bnNpZ25lZCBjaGFyIGEpCit7CisJaWYgKGE8MTI4IHx8IGE9PTI1NSkgcmV0dXJuIGE+PSdhJyAmJiBhPD0neicgPyBhIC0gMHgyMCA6IGE7CisJaWYgKCFkaXIpIHJldHVybiBhOworCXJldHVybiBkaXJbYS0xMjhdOworfQorCit1bnNpZ25lZCBjaGFyIGhwZnNfdXBjYXNlKHVuc2lnbmVkIGNoYXIgKmRpciwgdW5zaWduZWQgY2hhciBhKQoreworCXJldHVybiB1cGNhc2UoZGlyLCBhKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIGxvY2FzZSh1bnNpZ25lZCBjaGFyICpkaXIsIHVuc2lnbmVkIGNoYXIgYSkKK3sKKwlpZiAoYTwxMjggfHwgYT09MjU1KSByZXR1cm4gYT49J0EnICYmIGE8PSdaJyA/IGEgKyAweDIwIDogYTsKKwlpZiAoIWRpcikgcmV0dXJuIGE7CisJcmV0dXJuIGRpclthXTsKK30KKworaW50IGhwZnNfY2hrX25hbWUodW5zaWduZWQgY2hhciAqbmFtZSwgdW5zaWduZWQgKmxlbikKK3sKKwlpbnQgaTsKKwlpZiAoKmxlbiA+IDI1NCkgcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisJaHBmc19hZGp1c3RfbGVuZ3RoKG5hbWUsIGxlbik7CisJaWYgKCEqbGVuKSByZXR1cm4gLUVJTlZBTDsKKwlmb3IgKGkgPSAwOyBpIDwgKmxlbjsgaSsrKSBpZiAobm90X2FsbG93ZWRfY2hhcihuYW1lW2ldKSkgcmV0dXJuIC1FSU5WQUw7CisJaWYgKCpsZW4gPT0gMSkgaWYgKG5hbWVbMF0gPT0gJy4nKSByZXR1cm4gLUVJTlZBTDsKKwlpZiAoKmxlbiA9PSAyKSBpZiAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnLicpIHJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitjaGFyICpocGZzX3RyYW5zbGF0ZV9uYW1lKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdW5zaWduZWQgY2hhciAqZnJvbSwKKwkJCSAgdW5zaWduZWQgbGVuLCBpbnQgbGMsIGludCBsbmcpCit7CisJY2hhciAqdG87CisJaW50IGk7CisJaWYgKGhwZnNfc2IocyktPnNiX2NoayA+PSAyKSBpZiAoaHBmc19pc19uYW1lX2xvbmcoZnJvbSwgbGVuKSAhPSBsbmcpIHsKKwkJcHJpbnRrKCJIUEZTOiBMb25nIG5hbWUgZmxhZyBtaXNtYXRjaCAtIG5hbWUgIik7CisJCWZvciAoaT0wOyBpPGxlbjsgaSsrKSBwcmludGsoIiVjIiwgZnJvbVtpXSk7CisJCXByaW50aygiIG1pc2lkZW50aWZpZWQgYXMgJXMuXG4iLCBsbmcgPyAic2hvcnQiIDogImxvbmciKTsKKwkJcHJpbnRrKCJIUEZTOiBJdCdzIG5vdGhpbmcgc2VyaW91cy4gSXQgY291bGQgaGFwcGVuIGJlY2F1c2Ugb2YgYnVnIGluIE9TLzIuXG5IUEZTOiBTZXQgY2hlY2tzPW5vcm1hbCB0byBkaXNhYmxlIHRoaXMgbWVzc2FnZS5cbiIpOworCX0KKwlpZiAoIWxjKSByZXR1cm4gZnJvbTsKKwlpZiAoISh0byA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKSkpIHsKKwkJcHJpbnRrKCJIUEZTOiBjYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5hbWUgY29udmVyc2lvbiBidWZmZXJcbiIpOworCQlyZXR1cm4gZnJvbTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB0b1tpXSA9IGxvY2FzZShocGZzX3NiKHMpLT5zYl9jcF90YWJsZSxmcm9tW2ldKTsKKwlyZXR1cm4gdG87Cit9CisKK2ludCBocGZzX2NvbXBhcmVfbmFtZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBjaGFyICpuMSwgdW5zaWduZWQgbDEsCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpuMiwgdW5zaWduZWQgbDIsIGludCBsYXN0KQoreworCXVuc2lnbmVkIGwgPSBsMSA8IGwyID8gbDEgOiBsMjsKKwl1bnNpZ25lZCBpOworCWlmIChsYXN0KSByZXR1cm4gLTE7CisJZm9yIChpID0gMDsgaSA8IGw7IGkrKykgeworCQl1bnNpZ25lZCBjaGFyIGMxID0gdXBjYXNlKGhwZnNfc2IocyktPnNiX2NwX3RhYmxlLG4xW2ldKTsKKwkJdW5zaWduZWQgY2hhciBjMiA9IHVwY2FzZShocGZzX3NiKHMpLT5zYl9jcF90YWJsZSxuMltpXSk7CisJCWlmIChjMSA8IGMyKSByZXR1cm4gLTE7CisJCWlmIChjMSA+IGMyKSByZXR1cm4gMTsKKwl9CisJaWYgKGwxIDwgbDIpIHJldHVybiAtMTsKKwlpZiAobDEgPiBsMikgcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBocGZzX2lzX25hbWVfbG9uZyh1bnNpZ25lZCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsZW4pCit7CisJaW50IGksajsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuICYmIG5hbWVbaV0gIT0gJy4nOyBpKyspCisJCWlmIChub19kb3NfY2hhcihuYW1lW2ldKSkgcmV0dXJuIDE7CisJaWYgKCFpIHx8IGkgPiA4KSByZXR1cm4gMTsKKwlpZiAoaSA9PSBsZW4pIHJldHVybiAwOworCWZvciAoaiA9IGkgKyAxOyBqIDwgbGVuOyBqKyspCisJCWlmIChuYW1lW2pdID09ICcuJyB8fCBub19kb3NfY2hhcihuYW1lW2ldKSkgcmV0dXJuIDE7CisJcmV0dXJuIGogLSBpID4gNDsKK30KKworLyogT1MvMiBjbGVhcnMgZG90cyBhbmQgc3BhY2VzIGF0IHRoZSBlbmQgb2YgZmlsZSBuYW1lLCBzbyB3ZSBoYXZlIHRvICovCisKK3ZvaWQgaHBmc19hZGp1c3RfbGVuZ3RoKHVuc2lnbmVkIGNoYXIgKm5hbWUsIHVuc2lnbmVkICpsZW4pCit7CisJaWYgKCEqbGVuKSByZXR1cm47CisJaWYgKCpsZW4gPT0gMSAmJiBuYW1lWzBdID09ICcuJykgcmV0dXJuOworCWlmICgqbGVuID09IDIgJiYgbmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnLicpIHJldHVybjsKKwl3aGlsZSAoKmxlbiAmJiAobmFtZVsqbGVuIC0gMV0gPT0gJy4nIHx8IG5hbWVbKmxlbiAtIDFdID09ICcgJykpCisJCSgqbGVuKS0tOworfQpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9uYW1laS5jIGIvZnMvaHBmcy9uYW1laS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZjhmYzQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ocGZzL25hbWVpLmMKQEAgLTAsMCArMSw2NzMgQEAKKy8qCisgKiAgbGludXgvZnMvaHBmcy9uYW1laS5jCisgKgorICogIE1pa3VsYXMgUGF0b2NrYSAobWlrdWxhc0BhcnRheC5rYXJsaW4ubWZmLmN1bmkuY3opLCAxOTk4LTE5OTkKKyAqCisgKiAgYWRkaW5nICYgcmVtb3ZpbmcgZmlsZXMgJiBkaXJlY3RvcmllcworICovCisKKyNpbmNsdWRlICJocGZzX2ZuLmgiCisKK3N0YXRpYyBpbnQgaHBmc19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwl1bnNpZ25lZCBsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGU7CisJc3RydWN0IGZub2RlICpmbm9kZTsKKwlzdHJ1Y3QgZG5vZGUgKmRub2RlOworCXN0cnVjdCBpbm9kZSAqcmVzdWx0OworCWZub2RlX3NlY25vIGZubzsKKwlkbm9kZV9zZWNubyBkbm87CisJaW50IHI7CisJc3RydWN0IGhwZnNfZGlyZW50IGRlZTsKKwlpbnQgZXJyOworCWlmICgoZXJyID0gaHBmc19jaGtfbmFtZSgoY2hhciAqKW5hbWUsICZsZW4pKSkgcmV0dXJuIGVycj09LUVOT0VOVCA/IC1FSU5WQUwgOiBlcnI7CisJbG9ja19rZXJuZWwoKTsKKwllcnIgPSAtRU5PU1BDOworCWZub2RlID0gaHBmc19hbGxvY19mbm9kZShkaXItPmlfc2IsIGhwZnNfaShkaXIpLT5pX2RubywgJmZubywgJmJoKTsKKwlpZiAoIWZub2RlKQorCQlnb3RvIGJhaWw7CisJZG5vZGUgPSBocGZzX2FsbG9jX2Rub2RlKGRpci0+aV9zYiwgZm5vLCAmZG5vLCAmcWJoMCwgMSk7CisJaWYgKCFkbm9kZSkKKwkJZ290byBiYWlsMTsKKwltZW1zZXQoJmRlZSwgMCwgc2l6ZW9mIGRlZSk7CisJZGVlLmRpcmVjdG9yeSA9IDE7CisJaWYgKCEobW9kZSAmIDAyMjIpKSBkZWUucmVhZF9vbmx5ID0gMTsKKwkvKmRlZS5hcmNoaXZlID0gMDsqLworCWRlZS5oaWRkZW4gPSBuYW1lWzBdID09ICcuJzsKKwlkZWUuZm5vZGUgPSBmbm87CisJZGVlLmNyZWF0aW9uX2RhdGUgPSBkZWUud3JpdGVfZGF0ZSA9IGRlZS5yZWFkX2RhdGUgPSBnbXRfdG9fbG9jYWwoZGlyLT5pX3NiLCBnZXRfc2Vjb25kcygpKTsKKwlyZXN1bHQgPSBuZXdfaW5vZGUoZGlyLT5pX3NiKTsKKwlpZiAoIXJlc3VsdCkKKwkJZ290byBiYWlsMjsKKwlocGZzX2luaXRfaW5vZGUocmVzdWx0KTsKKwlyZXN1bHQtPmlfaW5vID0gZm5vOworCWhwZnNfaShyZXN1bHQpLT5pX3BhcmVudF9kaXIgPSBkaXItPmlfaW5vOworCWhwZnNfaShyZXN1bHQpLT5pX2RubyA9IGRubzsKKwlyZXN1bHQtPmlfY3RpbWUudHZfc2VjID0gcmVzdWx0LT5pX210aW1lLnR2X3NlYyA9IHJlc3VsdC0+aV9hdGltZS50dl9zZWMgPSBsb2NhbF90b19nbXQoZGlyLT5pX3NiLCBkZWUuY3JlYXRpb25fZGF0ZSk7CisJcmVzdWx0LT5pX2N0aW1lLnR2X25zZWMgPSAwOyAKKwlyZXN1bHQtPmlfbXRpbWUudHZfbnNlYyA9IDA7IAorCXJlc3VsdC0+aV9hdGltZS50dl9uc2VjID0gMDsgCisJaHBmc19pKHJlc3VsdCktPmlfZWFfc2l6ZSA9IDA7CisJcmVzdWx0LT5pX21vZGUgfD0gU19JRkRJUjsKKwlyZXN1bHQtPmlfb3AgPSAmaHBmc19kaXJfaW9wczsKKwlyZXN1bHQtPmlfZm9wID0gJmhwZnNfZGlyX29wczsKKwlyZXN1bHQtPmlfYmxvY2tzID0gNDsKKwlyZXN1bHQtPmlfc2l6ZSA9IDIwNDg7CisJcmVzdWx0LT5pX25saW5rID0gMjsKKwlpZiAoZGVlLnJlYWRfb25seSkKKwkJcmVzdWx0LT5pX21vZGUgJj0gfjAyMjI7CisKKwlkb3duKCZocGZzX2koZGlyKS0+aV9zZW0pOworCXIgPSBocGZzX2FkZF9kaXJlbnQoZGlyLCAoY2hhciAqKW5hbWUsIGxlbiwgJmRlZSwgMCk7CisJaWYgKHIgPT0gMSkKKwkJZ290byBiYWlsMzsKKwlpZiAociA9PSAtMSkgeworCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIGJhaWwzOworCX0KKwlmbm9kZS0+bGVuID0gbGVuOworCW1lbWNweShmbm9kZS0+bmFtZSwgbmFtZSwgbGVuID4gMTUgPyAxNSA6IGxlbik7CisJZm5vZGUtPnVwID0gZGlyLT5pX2lubzsKKwlmbm9kZS0+ZGlyZmxhZyA9IDE7CisJZm5vZGUtPmJ0cmVlLm5fZnJlZV9ub2RlcyA9IDc7CisJZm5vZGUtPmJ0cmVlLm5fdXNlZF9ub2RlcyA9IDE7CisJZm5vZGUtPmJ0cmVlLmZpcnN0X2ZyZWUgPSAweDE0OworCWZub2RlLT51LmV4dGVybmFsWzBdLmRpc2tfc2Vjbm8gPSBkbm87CisJZm5vZGUtPnUuZXh0ZXJuYWxbMF0uZmlsZV9zZWNubyA9IC0xOworCWRub2RlLT5yb290X2Rub2RlID0gMTsKKwlkbm9kZS0+dXAgPSBmbm87CisJZGUgPSBocGZzX2FkZF9kZShkaXItPmlfc2IsIGRub2RlLCAiXDAwMVwwMDEiLCAyLCAwKTsKKwlkZS0+Y3JlYXRpb25fZGF0ZSA9IGRlLT53cml0ZV9kYXRlID0gZGUtPnJlYWRfZGF0ZSA9IGdtdF90b19sb2NhbChkaXItPmlfc2IsIGdldF9zZWNvbmRzKCkpOworCWlmICghKG1vZGUgJiAwMjIyKSkgZGUtPnJlYWRfb25seSA9IDE7CisJZGUtPmZpcnN0ID0gZGUtPmRpcmVjdG9yeSA9IDE7CisJLypkZS0+aGlkZGVuID0gZGUtPnN5c3RlbSA9IDA7Ki8KKwlkZS0+Zm5vZGUgPSBmbm87CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWJyZWxzZShiaCk7CisJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgwKTsKKwlocGZzX2JyZWxzZTQoJnFiaDApOworCWRpci0+aV9ubGluaysrOworCWluc2VydF9pbm9kZV9oYXNoKHJlc3VsdCk7CisKKwlpZiAocmVzdWx0LT5pX3VpZCAhPSBjdXJyZW50LT5mc3VpZCB8fAorCSAgICByZXN1bHQtPmlfZ2lkICE9IGN1cnJlbnQtPmZzZ2lkIHx8CisJICAgIHJlc3VsdC0+aV9tb2RlICE9IChtb2RlIHwgU19JRkRJUikpIHsKKwkJcmVzdWx0LT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCQlyZXN1bHQtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJCXJlc3VsdC0+aV9tb2RlID0gbW9kZSB8IFNfSUZESVI7CisJCWhwZnNfd3JpdGVfaW5vZGVfbm9sb2NrKHJlc3VsdCk7CisJfQorCWRfaW5zdGFudGlhdGUoZGVudHJ5LCByZXN1bHQpOworCXVwKCZocGZzX2koZGlyKS0+aV9zZW0pOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK2JhaWwzOgorCXVwKCZocGZzX2koZGlyKS0+aV9zZW0pOworCWlwdXQocmVzdWx0KTsKK2JhaWwyOgorCWhwZnNfYnJlbHNlNCgmcWJoMCk7CisJaHBmc19mcmVlX2Rub2RlKGRpci0+aV9zYiwgZG5vKTsKK2JhaWwxOgorCWJyZWxzZShiaCk7CisJaHBmc19mcmVlX3NlY3RvcnMoZGlyLT5pX3NiLCBmbm8sIDEpOworYmFpbDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBocGZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJdW5zaWduZWQgbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXN0cnVjdCBpbm9kZSAqcmVzdWx0ID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBmbm9kZSAqZm5vZGU7CisJZm5vZGVfc2Vjbm8gZm5vOworCWludCByOworCXN0cnVjdCBocGZzX2RpcmVudCBkZWU7CisJaW50IGVycjsKKwlpZiAoKGVyciA9IGhwZnNfY2hrX25hbWUoKGNoYXIgKiluYW1lLCAmbGVuKSkpCisJCXJldHVybiBlcnI9PS1FTk9FTlQgPyAtRUlOVkFMIDogZXJyOworCWxvY2tfa2VybmVsKCk7CisJZXJyID0gLUVOT1NQQzsKKwlmbm9kZSA9IGhwZnNfYWxsb2NfZm5vZGUoZGlyLT5pX3NiLCBocGZzX2koZGlyKS0+aV9kbm8sICZmbm8sICZiaCk7CisJaWYgKCFmbm9kZSkKKwkJZ290byBiYWlsOworCW1lbXNldCgmZGVlLCAwLCBzaXplb2YgZGVlKTsKKwlpZiAoIShtb2RlICYgMDIyMikpIGRlZS5yZWFkX29ubHkgPSAxOworCWRlZS5hcmNoaXZlID0gMTsKKwlkZWUuaGlkZGVuID0gbmFtZVswXSA9PSAnLic7CisJZGVlLmZub2RlID0gZm5vOworCWRlZS5jcmVhdGlvbl9kYXRlID0gZGVlLndyaXRlX2RhdGUgPSBkZWUucmVhZF9kYXRlID0gZ210X3RvX2xvY2FsKGRpci0+aV9zYiwgZ2V0X3NlY29uZHMoKSk7CisKKwlyZXN1bHQgPSBuZXdfaW5vZGUoZGlyLT5pX3NiKTsKKwlpZiAoIXJlc3VsdCkKKwkJZ290byBiYWlsMTsKKwkKKwlocGZzX2luaXRfaW5vZGUocmVzdWx0KTsKKwlyZXN1bHQtPmlfaW5vID0gZm5vOworCXJlc3VsdC0+aV9tb2RlIHw9IFNfSUZSRUc7CisJcmVzdWx0LT5pX21vZGUgJj0gfjAxMTE7CisJcmVzdWx0LT5pX29wID0gJmhwZnNfZmlsZV9pb3BzOworCXJlc3VsdC0+aV9mb3AgPSAmaHBmc19maWxlX29wczsKKwlyZXN1bHQtPmlfbmxpbmsgPSAxOworCWhwZnNfZGVjaWRlX2NvbnYocmVzdWx0LCAoY2hhciAqKW5hbWUsIGxlbik7CisJaHBmc19pKHJlc3VsdCktPmlfcGFyZW50X2RpciA9IGRpci0+aV9pbm87CisJcmVzdWx0LT5pX2N0aW1lLnR2X3NlYyA9IHJlc3VsdC0+aV9tdGltZS50dl9zZWMgPSByZXN1bHQtPmlfYXRpbWUudHZfc2VjID0gbG9jYWxfdG9fZ210KGRpci0+aV9zYiwgZGVlLmNyZWF0aW9uX2RhdGUpOworCXJlc3VsdC0+aV9jdGltZS50dl9uc2VjID0gMDsKKwlyZXN1bHQtPmlfbXRpbWUudHZfbnNlYyA9IDA7CisJcmVzdWx0LT5pX2F0aW1lLnR2X25zZWMgPSAwOworCWhwZnNfaShyZXN1bHQpLT5pX2VhX3NpemUgPSAwOworCWlmIChkZWUucmVhZF9vbmx5KQorCQlyZXN1bHQtPmlfbW9kZSAmPSB+MDIyMjsKKwlyZXN1bHQtPmlfYmxvY2tzID0gMTsKKwlyZXN1bHQtPmlfc2l6ZSA9IDA7CisJcmVzdWx0LT5pX2RhdGEuYV9vcHMgPSAmaHBmc19hb3BzOworCWhwZnNfaShyZXN1bHQpLT5tbXVfcHJpdmF0ZSA9IDA7CisKKwlkb3duKCZocGZzX2koZGlyKS0+aV9zZW0pOworCXIgPSBocGZzX2FkZF9kaXJlbnQoZGlyLCAoY2hhciAqKW5hbWUsIGxlbiwgJmRlZSwgMCk7CisJaWYgKHIgPT0gMSkKKwkJZ290byBiYWlsMjsKKwlpZiAociA9PSAtMSkgeworCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIGJhaWwyOworCX0KKwlmbm9kZS0+bGVuID0gbGVuOworCW1lbWNweShmbm9kZS0+bmFtZSwgbmFtZSwgbGVuID4gMTUgPyAxNSA6IGxlbik7CisJZm5vZGUtPnVwID0gZGlyLT5pX2lubzsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJYnJlbHNlKGJoKTsKKworCWluc2VydF9pbm9kZV9oYXNoKHJlc3VsdCk7CisKKwlpZiAocmVzdWx0LT5pX3VpZCAhPSBjdXJyZW50LT5mc3VpZCB8fAorCSAgICByZXN1bHQtPmlfZ2lkICE9IGN1cnJlbnQtPmZzZ2lkIHx8CisJICAgIHJlc3VsdC0+aV9tb2RlICE9IChtb2RlIHwgU19JRlJFRykpIHsKKwkJcmVzdWx0LT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCQlyZXN1bHQtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJCXJlc3VsdC0+aV9tb2RlID0gbW9kZSB8IFNfSUZSRUc7CisJCWhwZnNfd3JpdGVfaW5vZGVfbm9sb2NrKHJlc3VsdCk7CisJfQorCWRfaW5zdGFudGlhdGUoZGVudHJ5LCByZXN1bHQpOworCXVwKCZocGZzX2koZGlyKS0+aV9zZW0pOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKKworYmFpbDI6CisJdXAoJmhwZnNfaShkaXIpLT5pX3NlbSk7CisJaXB1dChyZXN1bHQpOworYmFpbDE6CisJYnJlbHNlKGJoKTsKKwlocGZzX2ZyZWVfc2VjdG9ycyhkaXItPmlfc2IsIGZubywgMSk7CitiYWlsOgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGhwZnNfbWtub2Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIGRldl90IHJkZXYpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJdW5zaWduZWQgbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGZub2RlICpmbm9kZTsKKwlmbm9kZV9zZWNubyBmbm87CisJaW50IHI7CisJc3RydWN0IGhwZnNfZGlyZW50IGRlZTsKKwlzdHJ1Y3QgaW5vZGUgKnJlc3VsdCA9IE5VTEw7CisJaW50IGVycjsKKwlpZiAoKGVyciA9IGhwZnNfY2hrX25hbWUoKGNoYXIgKiluYW1lLCAmbGVuKSkpIHJldHVybiBlcnI9PS1FTk9FTlQgPyAtRUlOVkFMIDogZXJyOworCWlmIChocGZzX3NiKGRpci0+aV9zYiktPnNiX2VhcyA8IDIpIHJldHVybiAtRVBFUk07CisJaWYgKCFuZXdfdmFsaWRfZGV2KHJkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlsb2NrX2tlcm5lbCgpOworCWVyciA9IC1FTk9TUEM7CisJZm5vZGUgPSBocGZzX2FsbG9jX2Zub2RlKGRpci0+aV9zYiwgaHBmc19pKGRpciktPmlfZG5vLCAmZm5vLCAmYmgpOworCWlmICghZm5vZGUpCisJCWdvdG8gYmFpbDsKKwltZW1zZXQoJmRlZSwgMCwgc2l6ZW9mIGRlZSk7CisJaWYgKCEobW9kZSAmIDAyMjIpKSBkZWUucmVhZF9vbmx5ID0gMTsKKwlkZWUuYXJjaGl2ZSA9IDE7CisJZGVlLmhpZGRlbiA9IG5hbWVbMF0gPT0gJy4nOworCWRlZS5mbm9kZSA9IGZubzsKKwlkZWUuY3JlYXRpb25fZGF0ZSA9IGRlZS53cml0ZV9kYXRlID0gZGVlLnJlYWRfZGF0ZSA9IGdtdF90b19sb2NhbChkaXItPmlfc2IsIGdldF9zZWNvbmRzKCkpOworCisJcmVzdWx0ID0gbmV3X2lub2RlKGRpci0+aV9zYik7CisJaWYgKCFyZXN1bHQpCisJCWdvdG8gYmFpbDE7CisKKwlocGZzX2luaXRfaW5vZGUocmVzdWx0KTsKKwlyZXN1bHQtPmlfaW5vID0gZm5vOworCWhwZnNfaShyZXN1bHQpLT5pX3BhcmVudF9kaXIgPSBkaXItPmlfaW5vOworCXJlc3VsdC0+aV9jdGltZS50dl9zZWMgPSByZXN1bHQtPmlfbXRpbWUudHZfc2VjID0gcmVzdWx0LT5pX2F0aW1lLnR2X3NlYyA9IGxvY2FsX3RvX2dtdChkaXItPmlfc2IsIGRlZS5jcmVhdGlvbl9kYXRlKTsKKwlyZXN1bHQtPmlfY3RpbWUudHZfbnNlYyA9IDA7CisJcmVzdWx0LT5pX210aW1lLnR2X25zZWMgPSAwOworCXJlc3VsdC0+aV9hdGltZS50dl9uc2VjID0gMDsKKwlocGZzX2kocmVzdWx0KS0+aV9lYV9zaXplID0gMDsKKwlyZXN1bHQtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJcmVzdWx0LT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCXJlc3VsdC0+aV9ubGluayA9IDE7CisJcmVzdWx0LT5pX3NpemUgPSAwOworCXJlc3VsdC0+aV9ibG9ja3MgPSAxOworCWluaXRfc3BlY2lhbF9pbm9kZShyZXN1bHQsIG1vZGUsIHJkZXYpOworCisJZG93bigmaHBmc19pKGRpciktPmlfc2VtKTsKKwlyID0gaHBmc19hZGRfZGlyZW50KGRpciwgKGNoYXIgKiluYW1lLCBsZW4sICZkZWUsIDApOworCWlmIChyID09IDEpCisJCWdvdG8gYmFpbDI7CisJaWYgKHIgPT0gLTEpIHsKKwkJZXJyID0gLUVFWElTVDsKKwkJZ290byBiYWlsMjsKKwl9CisJZm5vZGUtPmxlbiA9IGxlbjsKKwltZW1jcHkoZm5vZGUtPm5hbWUsIG5hbWUsIGxlbiA+IDE1ID8gMTUgOiBsZW4pOworCWZub2RlLT51cCA9IGRpci0+aV9pbm87CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCisJaW5zZXJ0X2lub2RlX2hhc2gocmVzdWx0KTsKKworCWhwZnNfd3JpdGVfaW5vZGVfbm9sb2NrKHJlc3VsdCk7CisJZF9pbnN0YW50aWF0ZShkZW50cnksIHJlc3VsdCk7CisJdXAoJmhwZnNfaShkaXIpLT5pX3NlbSk7CisJYnJlbHNlKGJoKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7CitiYWlsMjoKKwl1cCgmaHBmc19pKGRpciktPmlfc2VtKTsKKwlpcHV0KHJlc3VsdCk7CitiYWlsMToKKwlicmVsc2UoYmgpOworCWhwZnNfZnJlZV9zZWN0b3JzKGRpci0+aV9zYiwgZm5vLCAxKTsKK2JhaWw6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaHBmc19zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKnN5bWxpbmspCit7CisJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJdW5zaWduZWQgbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGZub2RlICpmbm9kZTsKKwlmbm9kZV9zZWNubyBmbm87CisJaW50IHI7CisJc3RydWN0IGhwZnNfZGlyZW50IGRlZTsKKwlzdHJ1Y3QgaW5vZGUgKnJlc3VsdDsKKwlpbnQgZXJyOworCWlmICgoZXJyID0gaHBmc19jaGtfbmFtZSgoY2hhciAqKW5hbWUsICZsZW4pKSkgcmV0dXJuIGVycj09LUVOT0VOVCA/IC1FSU5WQUwgOiBlcnI7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoaHBmc19zYihkaXItPmlfc2IpLT5zYl9lYXMgPCAyKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJZXJyID0gLUVOT1NQQzsKKwlmbm9kZSA9IGhwZnNfYWxsb2NfZm5vZGUoZGlyLT5pX3NiLCBocGZzX2koZGlyKS0+aV9kbm8sICZmbm8sICZiaCk7CisJaWYgKCFmbm9kZSkKKwkJZ290byBiYWlsOworCW1lbXNldCgmZGVlLCAwLCBzaXplb2YgZGVlKTsKKwlkZWUuYXJjaGl2ZSA9IDE7CisJZGVlLmhpZGRlbiA9IG5hbWVbMF0gPT0gJy4nOworCWRlZS5mbm9kZSA9IGZubzsKKwlkZWUuY3JlYXRpb25fZGF0ZSA9IGRlZS53cml0ZV9kYXRlID0gZGVlLnJlYWRfZGF0ZSA9IGdtdF90b19sb2NhbChkaXItPmlfc2IsIGdldF9zZWNvbmRzKCkpOworCisJcmVzdWx0ID0gbmV3X2lub2RlKGRpci0+aV9zYik7CisJaWYgKCFyZXN1bHQpCisJCWdvdG8gYmFpbDE7CisJcmVzdWx0LT5pX2lubyA9IGZubzsKKwlocGZzX2luaXRfaW5vZGUocmVzdWx0KTsKKwlocGZzX2kocmVzdWx0KS0+aV9wYXJlbnRfZGlyID0gZGlyLT5pX2lubzsKKwlyZXN1bHQtPmlfY3RpbWUudHZfc2VjID0gcmVzdWx0LT5pX210aW1lLnR2X3NlYyA9IHJlc3VsdC0+aV9hdGltZS50dl9zZWMgPSBsb2NhbF90b19nbXQoZGlyLT5pX3NiLCBkZWUuY3JlYXRpb25fZGF0ZSk7CisJcmVzdWx0LT5pX2N0aW1lLnR2X25zZWMgPSAwOworCXJlc3VsdC0+aV9tdGltZS50dl9uc2VjID0gMDsKKwlyZXN1bHQtPmlfYXRpbWUudHZfbnNlYyA9IDA7CisJaHBmc19pKHJlc3VsdCktPmlfZWFfc2l6ZSA9IDA7CisJcmVzdWx0LT5pX21vZGUgPSBTX0lGTE5LIHwgMDc3NzsKKwlyZXN1bHQtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJcmVzdWx0LT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCXJlc3VsdC0+aV9ibG9ja3MgPSAxOworCXJlc3VsdC0+aV9ubGluayA9IDE7CisJcmVzdWx0LT5pX3NpemUgPSBzdHJsZW4oc3ltbGluayk7CisJcmVzdWx0LT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCXJlc3VsdC0+aV9kYXRhLmFfb3BzID0gJmhwZnNfc3ltbGlua19hb3BzOworCisJZG93bigmaHBmc19pKGRpciktPmlfc2VtKTsKKwlyID0gaHBmc19hZGRfZGlyZW50KGRpciwgKGNoYXIgKiluYW1lLCBsZW4sICZkZWUsIDApOworCWlmIChyID09IDEpCisJCWdvdG8gYmFpbDI7CisJaWYgKHIgPT0gLTEpIHsKKwkJZXJyID0gLUVFWElTVDsKKwkJZ290byBiYWlsMjsKKwl9CisJZm5vZGUtPmxlbiA9IGxlbjsKKwltZW1jcHkoZm5vZGUtPm5hbWUsIG5hbWUsIGxlbiA+IDE1ID8gMTUgOiBsZW4pOworCWZub2RlLT51cCA9IGRpci0+aV9pbm87CisJaHBmc19zZXRfZWEocmVzdWx0LCBmbm9kZSwgIlNZTUxJTksiLCAoY2hhciAqKXN5bWxpbmssIHN0cmxlbihzeW1saW5rKSk7CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWJyZWxzZShiaCk7CisKKwlpbnNlcnRfaW5vZGVfaGFzaChyZXN1bHQpOworCisJaHBmc193cml0ZV9pbm9kZV9ub2xvY2socmVzdWx0KTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgcmVzdWx0KTsKKwl1cCgmaHBmc19pKGRpciktPmlfc2VtKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7CitiYWlsMjoKKwl1cCgmaHBmc19pKGRpciktPmlfc2VtKTsKKwlpcHV0KHJlc3VsdCk7CitiYWlsMToKKwlicmVsc2UoYmgpOworCWhwZnNfZnJlZV9zZWN0b3JzKGRpci0+aV9zYiwgZm5vLCAxKTsKK2JhaWw6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaHBmc191bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwl1bnNpZ25lZCBsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlkbm9kZV9zZWNubyBkbm87CisJZm5vZGVfc2Vjbm8gZm5vOworCWludCByOworCWludCByZXAgPSAwOworCWludCBlcnI7CisKKwlsb2NrX2tlcm5lbCgpOworCWhwZnNfYWRqdXN0X2xlbmd0aCgoY2hhciAqKW5hbWUsICZsZW4pOworYWdhaW46CisJZG93bigmaHBmc19pKGlub2RlKS0+aV9wYXJlbnQpOworCWRvd24oJmhwZnNfaShkaXIpLT5pX3NlbSk7CisJZXJyID0gLUVOT0VOVDsKKwlkZSA9IG1hcF9kaXJlbnQoZGlyLCBocGZzX2koZGlyKS0+aV9kbm8sIChjaGFyICopbmFtZSwgbGVuLCAmZG5vLCAmcWJoKTsKKwlpZiAoIWRlKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FUEVSTTsKKwlpZiAoZGUtPmZpcnN0KQorCQlnb3RvIG91dDE7CisKKwllcnIgPSAtRUlTRElSOworCWlmIChkZS0+ZGlyZWN0b3J5KQorCQlnb3RvIG91dDE7CisKKwlmbm8gPSBkZS0+Zm5vZGU7CisJciA9IGhwZnNfcmVtb3ZlX2RpcmVudChkaXIsIGRubywgZGUsICZxYmgsIDEpOworCXN3aXRjaCAocikgeworCWNhc2UgMToKKwkJaHBmc19lcnJvcihkaXItPmlfc2IsICJ0aGVyZSB3YXMgZXJyb3Igd2hlbiByZW1vdmluZyBkaXJlbnQiKTsKKwkJZXJyID0gLUVGU0VSUk9SOworCQlicmVhazsKKwljYXNlIDI6CQkvKiBubyBzcGFjZSBmb3IgZGVsZXRpbmcsIHRyeSB0byB0cnVuY2F0ZSBmaWxlICovCisKKwkJZXJyID0gLUVOT1NQQzsKKwkJaWYgKHJlcCsrKQorCQkJYnJlYWs7CisKKwkJdXAoJmhwZnNfaShkaXIpLT5pX3NlbSk7CisJCXVwKCZocGZzX2koaW5vZGUpLT5pX3BhcmVudCk7CisJCWRfZHJvcChkZW50cnkpOworCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJaWYgKGF0b21pY19yZWFkKCZkZW50cnktPmRfY291bnQpID4gMSB8fAorCQkgICAgcGVybWlzc2lvbihpbm9kZSwgTUFZX1dSSVRFLCBOVUxMKSB8fAorCQkgICAgIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwKKwkJICAgIGdldF93cml0ZV9hY2Nlc3MoaW5vZGUpKSB7CisJCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQkJZF9yZWhhc2goZGVudHJ5KTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBpYXR0ciBuZXdhdHRyczsKKwkJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCQkvKnByaW50aygiSFBGUzogdHJ1bmNhdGluZyBmaWxlIGJlZm9yZSBkZWxldGUuXG4iKTsqLworCQkJbmV3YXR0cnMuaWFfc2l6ZSA9IDA7CisJCQluZXdhdHRycy5pYV92YWxpZCA9IEFUVFJfU0laRSB8IEFUVFJfQ1RJTUU7CisJCQllcnIgPSBub3RpZnlfY2hhbmdlKGRlbnRyeSwgJm5ld2F0dHJzKTsKKwkJCXB1dF93cml0ZV9hY2Nlc3MoaW5vZGUpOworCQkJaWYgKCFlcnIpCisJCQkJZ290byBhZ2FpbjsKKwkJfQorCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PU1BDOworCWRlZmF1bHQ6CisJCWlub2RlLT5pX25saW5rLS07CisJCWVyciA9IDA7CisJfQorCWdvdG8gb3V0OworCitvdXQxOgorCWhwZnNfYnJlbHNlNCgmcWJoKTsKK291dDoKKwl1cCgmaHBmc19pKGRpciktPmlfc2VtKTsKKwl1cCgmaHBmc19pKGlub2RlKS0+aV9wYXJlbnQpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGhwZnNfcm1kaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwl1bnNpZ25lZCBsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlkbm9kZV9zZWNubyBkbm87CisJZm5vZGVfc2Vjbm8gZm5vOworCWludCBuX2l0ZW1zID0gMDsKKwlpbnQgZXJyOworCWludCByOworCisJaHBmc19hZGp1c3RfbGVuZ3RoKChjaGFyICopbmFtZSwgJmxlbik7CisJbG9ja19rZXJuZWwoKTsKKwlkb3duKCZocGZzX2koaW5vZGUpLT5pX3BhcmVudCk7CisJZG93bigmaHBmc19pKGRpciktPmlfc2VtKTsKKwllcnIgPSAtRU5PRU5UOworCWRlID0gbWFwX2RpcmVudChkaXIsIGhwZnNfaShkaXIpLT5pX2RubywgKGNoYXIgKiluYW1lLCBsZW4sICZkbm8sICZxYmgpOworCWlmICghZGUpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVQRVJNOworCWlmIChkZS0+Zmlyc3QpCisJCWdvdG8gb3V0MTsKKworCWVyciA9IC1FTk9URElSOworCWlmICghZGUtPmRpcmVjdG9yeSkKKwkJZ290byBvdXQxOworCisJaHBmc19jb3VudF9kbm9kZXMoZGlyLT5pX3NiLCBocGZzX2koaW5vZGUpLT5pX2RubywgTlVMTCwgTlVMTCwgJm5faXRlbXMpOworCWVyciA9IC1FTk9URU1QVFk7CisJaWYgKG5faXRlbXMpCisJCWdvdG8gb3V0MTsKKworCWZubyA9IGRlLT5mbm9kZTsKKwlyID0gaHBmc19yZW1vdmVfZGlyZW50KGRpciwgZG5vLCBkZSwgJnFiaCwgMSk7CisJc3dpdGNoIChyKSB7CisJY2FzZSAxOgorCQlocGZzX2Vycm9yKGRpci0+aV9zYiwgInRoZXJlIHdhcyBlcnJvciB3aGVuIHJlbW92aW5nIGRpcmVudCIpOworCQllcnIgPSAtRUZTRVJST1I7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZXJyID0gLUVOT1NQQzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGlyLT5pX25saW5rLS07CisJCWlub2RlLT5pX25saW5rID0gMDsKKwkJZXJyID0gMDsKKwl9CisJZ290byBvdXQ7CitvdXQxOgorCWhwZnNfYnJlbHNlNCgmcWJoKTsKK291dDoKKwl1cCgmaHBmc19pKGRpciktPmlfc2VtKTsKKwl1cCgmaHBmc19pKGlub2RlKS0+aV9wYXJlbnQpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGhwZnNfc3ltbGlua19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJY2hhciAqbGluayA9IGttYXAocGFnZSk7CisJc3RydWN0IGlub2RlICppID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgZm5vZGUgKmZub2RlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IGVycjsKKworCWVyciA9IC1FSU87CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoIShmbm9kZSA9IGhwZnNfbWFwX2Zub2RlKGktPmlfc2IsIGktPmlfaW5vLCAmYmgpKSkKKwkJZ290byBmYWlsOworCWVyciA9IGhwZnNfcmVhZF9lYShpLT5pX3NiLCBmbm9kZSwgIlNZTUxJTksiLCBsaW5rLCBQQUdFX1NJWkUpOworCWJyZWxzZShiaCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsOworCXVubG9ja19rZXJuZWwoKTsKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJa3VubWFwKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiAwOworCitmYWlsOgorCXVubG9ja19rZXJuZWwoKTsKKwlTZXRQYWdlRXJyb3IocGFnZSk7CisJa3VubWFwKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgaHBmc19zeW1saW5rX2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gaHBmc19zeW1saW5rX3JlYWRwYWdlCit9OworCQorc3RhdGljIGludCBocGZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCXN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwljaGFyICpvbGRfbmFtZSA9IChjaGFyICopb2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWU7CisJaW50IG9sZF9sZW4gPSBvbGRfZGVudHJ5LT5kX25hbWUubGVuOworCWNoYXIgKm5ld19uYW1lID0gKGNoYXIgKiluZXdfZGVudHJ5LT5kX25hbWUubmFtZTsKKwlpbnQgbmV3X2xlbiA9IG5ld19kZW50cnktPmRfbmFtZS5sZW47CisJc3RydWN0IGlub2RlICppID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKm5ld19pbm9kZSA9IG5ld19kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoLCBxYmgxOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGVwLCAqbmRlOworCXN0cnVjdCBocGZzX2RpcmVudCBkZTsKKwlkbm9kZV9zZWNubyBkbm87CisJaW50IHI7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgZm5vZGUgKmZub2RlOworCWludCBlcnI7CisJaWYgKChlcnIgPSBocGZzX2Noa19uYW1lKChjaGFyICopbmV3X25hbWUsICZuZXdfbGVuKSkpIHJldHVybiBlcnI7CisJZXJyID0gMDsKKwlocGZzX2FkanVzdF9sZW5ndGgoKGNoYXIgKilvbGRfbmFtZSwgJm9sZF9sZW4pOworCisJbG9ja19rZXJuZWwoKTsKKwkvKiBvcmRlciBkb2Vzbid0IG1hdHRlciwgZHVlIHRvIFZGUyBleGNsdXNpb24gKi8KKwlkb3duKCZocGZzX2koaSktPmlfcGFyZW50KTsKKwlpZiAobmV3X2lub2RlKQorCQlkb3duKCZocGZzX2kobmV3X2lub2RlKS0+aV9wYXJlbnQpOworCWRvd24oJmhwZnNfaShvbGRfZGlyKS0+aV9zZW0pOworCWlmIChuZXdfZGlyICE9IG9sZF9kaXIpCisJCWRvd24oJmhwZnNfaShuZXdfZGlyKS0+aV9zZW0pOworCQorCS8qIEVybT8gTW92aW5nIG92ZXIgdGhlIGVtcHR5IG5vbi1idXN5IGRpcmVjdG9yeSBpcyBwZXJmZWN0bHkgbGVnYWwgKi8KKwlpZiAobmV3X2lub2RlICYmIFNfSVNESVIobmV3X2lub2RlLT5pX21vZGUpKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZW5kMTsKKwl9CisKKwlpZiAoIShkZXAgPSBtYXBfZGlyZW50KG9sZF9kaXIsIGhwZnNfaShvbGRfZGlyKS0+aV9kbm8sIChjaGFyICopb2xkX25hbWUsIG9sZF9sZW4sICZkbm8sICZxYmgpKSkgeworCQlocGZzX2Vycm9yKGktPmlfc2IsICJsb29rdXAgc3VjY2VlZGVkIGJ1dCBtYXAgZGlyZW50IGZhaWxlZCIpOworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGVuZDE7CisJfQorCWNvcHlfZGUoJmRlLCBkZXApOworCWRlLmhpZGRlbiA9IG5ld19uYW1lWzBdID09ICcuJzsKKworCWlmIChuZXdfaW5vZGUpIHsKKwkJaW50IHI7CisJCWlmICgociA9IGhwZnNfcmVtb3ZlX2RpcmVudChvbGRfZGlyLCBkbm8sIGRlcCwgJnFiaCwgMSkpICE9IDIpIHsKKwkJCWlmICgobmRlID0gbWFwX2RpcmVudChuZXdfZGlyLCBocGZzX2kobmV3X2RpciktPmlfZG5vLCAoY2hhciAqKW5ld19uYW1lLCBuZXdfbGVuLCBOVUxMLCAmcWJoMSkpKSB7CisJCQkJbmV3X2lub2RlLT5pX25saW5rID0gMDsKKwkJCQljb3B5X2RlKG5kZSwgJmRlKTsKKwkJCQltZW1jcHkobmRlLT5uYW1lLCBuZXdfbmFtZSwgbmV3X2xlbik7CisJCQkJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgxKTsKKwkJCQlocGZzX2JyZWxzZTQoJnFiaDEpOworCQkJCWdvdG8gZW5kOworCQkJfQorCQkJaHBmc19lcnJvcihuZXdfZGlyLT5pX3NiLCAiaHBmc19yZW5hbWU6IGNvdWxkIG5vdCBmaW5kIGRpcmVudCIpOworCQkJZXJyID0gLUVGU0VSUk9SOworCQkJZ290byBlbmQxOworCQl9CisJCWVyciA9IHIgPT0gMiA/IC1FTk9TUEMgOiByID09IDEgPyAtRUZTRVJST1IgOiAwOworCQlnb3RvIGVuZDE7CisJfQorCisJaWYgKG5ld19kaXIgPT0gb2xkX2RpcikgaHBmc19icmVsc2U0KCZxYmgpOworCisJaHBmc19sb2NrX2NyZWF0aW9uKGktPmlfc2IpOworCWlmICgociA9IGhwZnNfYWRkX2RpcmVudChuZXdfZGlyLCBuZXdfbmFtZSwgbmV3X2xlbiwgJmRlLCAxKSkpIHsKKwkJaHBmc191bmxvY2tfY3JlYXRpb24oaS0+aV9zYik7CisJCWlmIChyID09IC0xKSBocGZzX2Vycm9yKG5ld19kaXItPmlfc2IsICJocGZzX3JlbmFtZTogZGlyZW50IGFscmVhZHkgZXhpc3RzISIpOworCQllcnIgPSByID09IDEgPyAtRU5PU1BDIDogLUVGU0VSUk9SOworCQlpZiAobmV3X2RpciAhPSBvbGRfZGlyKSBocGZzX2JyZWxzZTQoJnFiaCk7CisJCWdvdG8gZW5kMTsKKwl9CisJCisJaWYgKG5ld19kaXIgPT0gb2xkX2RpcikKKwkJaWYgKCEoZGVwID0gbWFwX2RpcmVudChvbGRfZGlyLCBocGZzX2kob2xkX2RpciktPmlfZG5vLCAoY2hhciAqKW9sZF9uYW1lLCBvbGRfbGVuLCAmZG5vLCAmcWJoKSkpIHsKKwkJCWhwZnNfdW5sb2NrX2NyZWF0aW9uKGktPmlfc2IpOworCQkJaHBmc19lcnJvcihpLT5pX3NiLCAibG9va3VwIHN1Y2NlZWRlZCBidXQgbWFwIGRpcmVudCBmYWlsZWQgYXQgIzIiKTsKKwkJCWVyciA9IC1FTk9FTlQ7CisJCQlnb3RvIGVuZDE7CisJCX0KKworCWlmICgociA9IGhwZnNfcmVtb3ZlX2RpcmVudChvbGRfZGlyLCBkbm8sIGRlcCwgJnFiaCwgMCkpKSB7CisJCWhwZnNfdW5sb2NrX2NyZWF0aW9uKGktPmlfc2IpOworCQlocGZzX2Vycm9yKGktPmlfc2IsICJocGZzX3JlbmFtZTogY291bGQgbm90IHJlbW92ZSBkaXJlbnQiKTsKKwkJZXJyID0gciA9PSAyID8gLUVOT1NQQyA6IC1FRlNFUlJPUjsKKwkJZ290byBlbmQxOworCX0KKwlocGZzX3VubG9ja19jcmVhdGlvbihpLT5pX3NiKTsKKwkKKwllbmQ6CisJaHBmc19pKGkpLT5pX3BhcmVudF9kaXIgPSBuZXdfZGlyLT5pX2lubzsKKwlpZiAoU19JU0RJUihpLT5pX21vZGUpKSB7CisJCW5ld19kaXItPmlfbmxpbmsrKzsKKwkJb2xkX2Rpci0+aV9ubGluay0tOworCX0KKwlpZiAoKGZub2RlID0gaHBmc19tYXBfZm5vZGUoaS0+aV9zYiwgaS0+aV9pbm8sICZiaCkpKSB7CisJCWZub2RlLT51cCA9IG5ld19kaXItPmlfaW5vOworCQlmbm9kZS0+bGVuID0gbmV3X2xlbjsKKwkJbWVtY3B5KGZub2RlLT5uYW1lLCBuZXdfbmFtZSwgbmV3X2xlbj4xNT8xNTpuZXdfbGVuKTsKKwkJaWYgKG5ld19sZW4gPCAxNSkgbWVtc2V0KCZmbm9kZS0+bmFtZVtuZXdfbGVuXSwgMCwgMTUgLSBuZXdfbGVuKTsKKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQlicmVsc2UoYmgpOworCX0KKwlocGZzX2koaSktPmlfY29udiA9IGhwZnNfc2IoaS0+aV9zYiktPnNiX2NvbnY7CisJaHBmc19kZWNpZGVfY29udihpLCAoY2hhciAqKW5ld19uYW1lLCBuZXdfbGVuKTsKK2VuZDE6CisJaWYgKG9sZF9kaXIgIT0gbmV3X2RpcikKKwkJdXAoJmhwZnNfaShuZXdfZGlyKS0+aV9zZW0pOworCXVwKCZocGZzX2kob2xkX2RpciktPmlfc2VtKTsKKwl1cCgmaHBmc19pKGkpLT5pX3BhcmVudCk7CisJaWYgKG5ld19pbm9kZSkKKwkJdXAoJmhwZnNfaShuZXdfaW5vZGUpLT5pX3BhcmVudCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGhwZnNfZGlyX2lvcHMgPQoreworCS5jcmVhdGUJCT0gaHBmc19jcmVhdGUsCisJLmxvb2t1cAkJPSBocGZzX2xvb2t1cCwKKwkudW5saW5rCQk9IGhwZnNfdW5saW5rLAorCS5zeW1saW5rCT0gaHBmc19zeW1saW5rLAorCS5ta2RpcgkJPSBocGZzX21rZGlyLAorCS5ybWRpcgkJPSBocGZzX3JtZGlyLAorCS5ta25vZAkJPSBocGZzX21rbm9kLAorCS5yZW5hbWUJCT0gaHBmc19yZW5hbWUsCisJLnNldGF0dHIJPSBocGZzX25vdGlmeV9jaGFuZ2UsCit9OwpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9zdXBlci5jIGIvZnMvaHBmcy9zdXBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZWZhNjMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ocGZzL3N1cGVyLmMKQEAgLTAsMCArMSw3MDEgQEAKKy8qCisgKiAgbGludXgvZnMvaHBmcy9zdXBlci5jCisgKgorICogIE1pa3VsYXMgUGF0b2NrYSAobWlrdWxhc0BhcnRheC5rYXJsaW4ubWZmLmN1bmkuY3opLCAxOTk4LTE5OTkKKyAqCisgKiAgbW91bnRpbmcsIHVubW91bnRpbmcsIGVycm9yIGhhbmRsaW5nCisgKi8KKworI2luY2x1ZGUgImhwZnNfZm4uaCIKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RhdGZzLmg+CisKKy8qIE1hcmsgdGhlIGZpbGVzeXN0ZW0gZGlydHksIHNvIHRoYXQgY2hrZHNrIGNoZWNrcyBpdCB3aGVuIG9zLzIgYm9vdGVkICovCisKK3N0YXRpYyB2b2lkIG1hcmtfZGlydHkoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCWlmIChocGZzX3NiKHMpLT5zYl9jaGtkc2sgJiYgIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQlzdHJ1Y3QgaHBmc19zcGFyZV9ibG9jayAqc2I7CisJCWlmICgoc2IgPSBocGZzX21hcF9zZWN0b3IocywgMTcsICZiaCwgMCkpKSB7CisJCQlzYi0+ZGlydHkgPSAxOworCQkJc2ItPm9sZF93cm90ZSA9IDA7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQlicmVsc2UoYmgpOworCQl9CisJfQorfQorCisvKiBNYXJrIHRoZSBmaWxlc3lzdGVtIGNsZWFuIChtYXJrIGl0IGRpcnR5IGZvciBjaGtkc2sgaWYgY2hrZHNrPT0yIG9yIGlmIHRoZXJlCisgICB3ZXJlIGVycm9ycykgKi8KKworc3RhdGljIHZvaWQgdW5tYXJrX2RpcnR5KHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBocGZzX3NwYXJlX2Jsb2NrICpzYjsKKwlpZiAocy0+c19mbGFncyAmIE1TX1JET05MWSkgcmV0dXJuOworCWlmICgoc2IgPSBocGZzX21hcF9zZWN0b3IocywgMTcsICZiaCwgMCkpKSB7CisJCXNiLT5kaXJ0eSA9IGhwZnNfc2IocyktPnNiX2Noa2RzayA+IDEgLSBocGZzX3NiKHMpLT5zYl93YXNfZXJyb3I7CisJCXNiLT5vbGRfd3JvdGUgPSBocGZzX3NiKHMpLT5zYl9jaGtkc2sgPj0gMiAmJiAhaHBmc19zYihzKS0+c2Jfd2FzX2Vycm9yOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCWJyZWxzZShiaCk7CisJfQorfQorCisvKiBGaWxlc3lzdGVtIGVycm9yLi4uICovCisKKyNkZWZpbmUgRVJSX0JVRl9TSVpFIDEwMjQKKwordm9pZCBocGZzX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY2hhciAqbSwuLi4pCit7CisJY2hhciAqYnVmOworCXZhX2xpc3QgbDsKKwl2YV9zdGFydChsLCBtKTsKKwlpZiAoIShidWYgPSBrbWFsbG9jKEVSUl9CVUZfU0laRSwgR0ZQX0tFUk5FTCkpKQorCQlwcmludGsoIkhQRlM6IE5vIG1lbW9yeSBmb3IgZXJyb3IgbWVzc2FnZSAnJXMnXG4iLG0pOworCWVsc2UgaWYgKHZzcHJpbnRmKGJ1ZiwgbSwgbCkgPj0gRVJSX0JVRl9TSVpFKQorCQlwcmludGsoIkhQRlM6IEdycnJyLi4uIEtlcm5lbCBtZW1vcnkgY29ycnVwdGVkIC4uLiBnb2luZyBvbiwgYnV0IGl0J2xsIGNyYXNoIHZlcnkgc29vbiA6LShcbiIpOworCXByaW50aygiSFBGUzogZmlsZXN5c3RlbSBlcnJvcjogIik7CisJaWYgKGJ1ZikgcHJpbnRrKCIlcyIsIGJ1Zik7CisJZWxzZSBwcmludGsoIiVzXG4iLG0pOworCWlmICghaHBmc19zYihzKS0+c2Jfd2FzX2Vycm9yKSB7CisJCWlmIChocGZzX3NiKHMpLT5zYl9lcnIgPT0gMikgeworCQkJcHJpbnRrKCI7IGNyYXNoaW5nIHRoZSBzeXN0ZW0gYmVjYXVzZSB5b3Ugd2FudGVkIGl0XG4iKTsKKwkJCW1hcmtfZGlydHkocyk7CisJCQlwYW5pYygiSFBGUyBwYW5pYyIpOworCQl9IGVsc2UgaWYgKGhwZnNfc2IocyktPnNiX2VyciA9PSAxKSB7CisJCQlpZiAocy0+c19mbGFncyAmIE1TX1JET05MWSkgcHJpbnRrKCI7IGFscmVhZHkgbW91bnRlZCByZWFkLW9ubHlcbiIpOworCQkJZWxzZSB7CisJCQkJcHJpbnRrKCI7IHJlbW91bnRpbmcgcmVhZC1vbmx5XG4iKTsKKwkJCQltYXJrX2RpcnR5KHMpOworCQkJCXMtPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCQkJfQorCQl9IGVsc2UgaWYgKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHByaW50aygiOyBnb2luZyBvbiAtIGJ1dCBhbnl0aGluZyB3b24ndCBiZSBkZXN0cm95ZWQgYmVjYXVzZSBpdCdzIHJlYWQtb25seVxuIik7CisJCWVsc2UgcHJpbnRrKCI7IGNvcnJ1cHRlZCBmaWxlc3lzdGVtIG1vdW50ZWQgcmVhZC93cml0ZSAtIHlvdXIgY29tcHV0ZXIgd2lsbCBleHBsb2RlIHdpdGhpbiAyMCBzZWNvbmRzIC4uLiBidXQgeW91IHdhbnRlZCBpdCBzbyFcbiIpOworCX0gZWxzZSBwcmludGsoIlxuIik7CisJaWYgKGJ1Zikga2ZyZWUoYnVmKTsKKwlocGZzX3NiKHMpLT5zYl93YXNfZXJyb3IgPSAxOworfQorCisvKiAKKyAqIEEgbGl0dGxlIHRyaWNrIHRvIGRldGVjdCBjeWNsZXMgaW4gbWFueSBocGZzIHN0cnVjdHVyZXMgYW5kIGRvbid0IGxldCB0aGUKKyAqIGtlcm5lbCBjcmFzaCBvbiBjb3JydXB0ZWQgZmlsZXN5c3RlbS4gV2hlbiBmaXJzdCBjYWxsZWQsIHNldCBjMiB0byAwLgorICoKKyAqIEJUVy4gY2hrZHNrIGRvZXNuJ3QgZGV0ZWN0IGN5Y2xlcyBjb3JyZWN0bHkuIFdoZW4gSSBoYWQgMiBsb3N0IGRpcmVjdG9yaWVzCisgKiBuZXN0ZWQgZWFjaCBpbiBvdGhlciwgY2hrZHNrIGxvY2tlZCB1cCBoYXBwaWxseS4KKyAqLworCitpbnQgaHBmc19zdG9wX2N5Y2xlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBrZXksIGludCAqYzEsIGludCAqYzIsCisJCWNoYXIgKm1zZykKK3sKKwlpZiAoKmMyICYmICpjMSA9PSBrZXkpIHsKKwkJaHBmc19lcnJvcihzLCAiY3ljbGUgZGV0ZWN0ZWQgb24ga2V5ICUwOHggaW4gJXMiLCBrZXksIG1zZyk7CisJCXJldHVybiAxOworCX0KKwkoKmMyKSsrOworCWlmICghKCgqYzIgLSAxKSAmICpjMikpICpjMSA9IGtleTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaHBmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCXN0cnVjdCBocGZzX3NiX2luZm8gKnNiaSA9IGhwZnNfc2Iocyk7CisJaWYgKHNiaS0+c2JfY3BfdGFibGUpIGtmcmVlKHNiaS0+c2JfY3BfdGFibGUpOworCWlmIChzYmktPnNiX2JtcF9kaXIpIGtmcmVlKHNiaS0+c2JfYm1wX2Rpcik7CisJdW5tYXJrX2RpcnR5KHMpOworCXMtPnNfZnNfaW5mbyA9IE5VTEw7CisJa2ZyZWUoc2JpKTsKK30KKwordW5zaWduZWQgaHBmc19jb3VudF9vbmVfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gc2Vjbm8pCit7CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCXVuc2lnbmVkICpiaXRzOworCXVuc2lnbmVkIGksIGNvdW50OworCWlmICghKGJpdHMgPSBocGZzX21hcF80c2VjdG9ycyhzLCBzZWNubywgJnFiaCwgNCkpKSByZXR1cm4gMDsKKwljb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IDIwNDggLyBzaXplb2YodW5zaWduZWQpOyBpKyspIHsKKwkJdW5zaWduZWQgYjsgCisJCWlmICghYml0c1tpXSkgY29udGludWU7CisJCWZvciAoYiA9IGJpdHNbaV07IGI7IGI+Pj0xKSBjb3VudCArPSBiICYgMTsKKwl9CisJaHBmc19icmVsc2U0KCZxYmgpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNvdW50X2JpdG1hcHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCXVuc2lnbmVkIG4sIGNvdW50LCBuX2JhbmRzOworCW5fYmFuZHMgPSAoaHBmc19zYihzKS0+c2JfZnNfc2l6ZSArIDB4M2ZmZikgPj4gMTQ7CisJY291bnQgPSAwOworCWZvciAobiA9IDA7IG4gPCBuX2JhbmRzOyBuKyspCisJCWNvdW50ICs9IGhwZnNfY291bnRfb25lX2JpdG1hcChzLCBocGZzX3NiKHMpLT5zYl9ibXBfZGlyW25dKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgaHBmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCXN0cnVjdCBocGZzX3NiX2luZm8gKnNiaSA9IGhwZnNfc2Iocyk7CisJbG9ja19rZXJuZWwoKTsKKworCS8qaWYgKHNiaS0+c2Jfbl9mcmVlID09IC0xKSB7Ki8KKwkJc2JpLT5zYl9uX2ZyZWUgPSBjb3VudF9iaXRtYXBzKHMpOworCQlzYmktPnNiX25fZnJlZV9kbm9kZXMgPSBocGZzX2NvdW50X29uZV9iaXRtYXAocywgc2JpLT5zYl9kbWFwKTsKKwkvKn0qLworCWJ1Zi0+Zl90eXBlID0gcy0+c19tYWdpYzsKKwlidWYtPmZfYnNpemUgPSA1MTI7CisJYnVmLT5mX2Jsb2NrcyA9IHNiaS0+c2JfZnNfc2l6ZTsKKwlidWYtPmZfYmZyZWUgPSBzYmktPnNiX25fZnJlZTsKKwlidWYtPmZfYmF2YWlsID0gc2JpLT5zYl9uX2ZyZWU7CisJYnVmLT5mX2ZpbGVzID0gc2JpLT5zYl9kaXJiYW5kX3NpemUgLyA0OworCWJ1Zi0+Zl9mZnJlZSA9IHNiaS0+c2Jfbl9mcmVlX2Rub2RlczsKKwlidWYtPmZfbmFtZWxlbiA9IDI1NDsKKworCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMga21lbV9jYWNoZV90ICogaHBmc19pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmhwZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgaHBmc19pbm9kZV9pbmZvICplaTsKKwllaSA9IChzdHJ1Y3QgaHBmc19pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhocGZzX2lub2RlX2NhY2hlcCwgU0xBQl9OT0ZTKTsKKwlpZiAoIWVpKQorCQlyZXR1cm4gTlVMTDsKKwllaS0+dmZzX2lub2RlLmlfdmVyc2lvbiA9IDE7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBocGZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUoaHBmc19pbm9kZV9jYWNoZXAsIGhwZnNfaShpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBocGZzX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBocGZzX2lub2RlX2luZm8gKikgZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikgeworCQlpbml0X01VVEVYKCZlaS0+aV9zZW0pOworCQlpbml0X01VVEVYKCZlaS0+aV9wYXJlbnQpOworCQlpbm9kZV9pbml0X29uY2UoJmVpLT52ZnNfaW5vZGUpOworCX0KK30KKyAKK3N0YXRpYyBpbnQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpCit7CisJaHBmc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaHBmc19pbm9kZV9jYWNoZSIsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBocGZzX2lub2RlX2luZm8pLAorCQkJCQkgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKGhwZnNfaW5vZGVfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKK3sKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGhwZnNfaW5vZGVfY2FjaGVwKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaHBmc19pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQorCisvKgorICogQSB0aW55IHBhcnNlciBmb3Igb3B0aW9uIHN0cmluZ3MsIHN0b2xlbiBmcm9tIGRvc2ZzLgorICogU3RvbGVuIGFnYWluIGZyb20gcmVhZC1vbmx5IGhwZnMuCisgKiBBbmQgdXBkYXRlZCBmb3IgdGFibGUtZHJpdmVuIG9wdGlvbiBwYXJzaW5nLgorICovCisKK2VudW0geworCU9wdF9oZWxwLCBPcHRfdWlkLCBPcHRfZ2lkLCBPcHRfdW1hc2ssIE9wdF9jYXNlX2xvd2VyLCBPcHRfY2FzZV9hc2lzLAorCU9wdF9jb252X2JpbmFyeSwgT3B0X2NvbnZfdGV4dCwgT3B0X2NvbnZfYXV0bywKKwlPcHRfY2hlY2tfbm9uZSwgT3B0X2NoZWNrX25vcm1hbCwgT3B0X2NoZWNrX3N0cmljdCwKKwlPcHRfZXJyX2NvbnQsIE9wdF9lcnJfcm8sIE9wdF9lcnJfcGFuaWMsCisJT3B0X2Vhc19ubywgT3B0X2Vhc19ybywgT3B0X2Vhc19ydywKKwlPcHRfY2hrZHNrX25vLCBPcHRfY2hrZHNrX2Vycm9ycywgT3B0X2Noa2Rza19hbHdheXMsCisJT3B0X3RpbWVzaGlmdCwgT3B0X2VyciwKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7T3B0X2hlbHAsICJoZWxwIn0sCisJe09wdF91aWQsICJ1aWQ9JXUifSwKKwl7T3B0X2dpZCwgImdpZD0ldSJ9LAorCXtPcHRfdW1hc2ssICJ1bWFzaz0lbyJ9LAorCXtPcHRfY2FzZV9sb3dlciwgImNhc2U9bG93ZXIifSwKKwl7T3B0X2Nhc2VfYXNpcywgImNhc2U9YXNpcyJ9LAorCXtPcHRfY29udl9iaW5hcnksICJjb252PWJpbmFyeSJ9LAorCXtPcHRfY29udl90ZXh0LCAiY29udj10ZXh0In0sCisJe09wdF9jb252X2F1dG8sICJjb252PWF1dG8ifSwKKwl7T3B0X2NoZWNrX25vbmUsICJjaGVjaz1ub25lIn0sCisJe09wdF9jaGVja19ub3JtYWwsICJjaGVjaz1ub3JtYWwifSwKKwl7T3B0X2NoZWNrX3N0cmljdCwgImNoZWNrPXN0cmljdCJ9LAorCXtPcHRfZXJyX2NvbnQsICJlcnJvcnM9Y29udGludWUifSwKKwl7T3B0X2Vycl9ybywgImVycm9ycz1yZW1vdW50LXJvIn0sCisJe09wdF9lcnJfcGFuaWMsICJlcnJvcnM9cGFuaWMifSwKKwl7T3B0X2Vhc19ubywgImVhcz1ubyJ9LAorCXtPcHRfZWFzX3JvLCAiZWFzPXJvIn0sCisJe09wdF9lYXNfcncsICJlYXM9cncifSwKKwl7T3B0X2Noa2Rza19ubywgImNoa2Rzaz1ubyJ9LAorCXtPcHRfY2hrZHNrX2Vycm9ycywgImNoa2Rzaz1lcnJvcnMifSwKKwl7T3B0X2Noa2Rza19hbHdheXMsICJjaGtkc2s9YWx3YXlzIn0sCisJe09wdF90aW1lc2hpZnQsICJ0aW1lc2hpZnQ9JWQifSwKKwl7T3B0X2VyciwgTlVMTH0sCit9OworCitzdGF0aWMgaW50IHBhcnNlX29wdHMoY2hhciAqb3B0cywgdWlkX3QgKnVpZCwgZ2lkX3QgKmdpZCwgdW1vZGVfdCAqdW1hc2ssCisJCSAgICAgIGludCAqbG93ZXJjYXNlLCBpbnQgKmNvbnYsIGludCAqZWFzLCBpbnQgKmNoaywgaW50ICplcnJzLAorCQkgICAgICBpbnQgKmNoa2RzaywgaW50ICp0aW1lc2hpZnQpCit7CisJY2hhciAqcDsKKwlpbnQgb3B0aW9uOworCisJaWYgKCFvcHRzKQorCQlyZXR1cm4gMTsKKworCS8qcHJpbnRrKCJQYXJzaW5nIG9wdHM6ICclcydcbiIsb3B0cyk7Ki8KKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0cywgIiwiKSkgIT0gTlVMTCkgeworCQlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJCWludCB0b2tlbjsKKwkJaWYgKCEqcCkKKwkJCWNvbnRpbnVlOworCisJCXRva2VuID0gbWF0Y2hfdG9rZW4ocCwgdG9rZW5zLCBhcmdzKTsKKwkJc3dpdGNoICh0b2tlbikgeworCQljYXNlIE9wdF9oZWxwOgorCQkJcmV0dXJuIDI7CisJCWNhc2UgT3B0X3VpZDoKKwkJCWlmIChtYXRjaF9pbnQoYXJncywgJm9wdGlvbikpCisJCQkJcmV0dXJuIDA7CisJCQkqdWlkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2dpZDoKKwkJCWlmIChtYXRjaF9pbnQoYXJncywgJm9wdGlvbikpCisJCQkJcmV0dXJuIDA7CisJCQkqZ2lkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3VtYXNrOgorCQkJaWYgKG1hdGNoX29jdGFsKGFyZ3MsICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJKnVtYXNrID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2Nhc2VfbG93ZXI6CisJCQkqbG93ZXJjYXNlID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9jYXNlX2FzaXM6CisJCQkqbG93ZXJjYXNlID0gMDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9jb252X2JpbmFyeToKKwkJCSpjb252ID0gQ09OVl9CSU5BUlk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfY29udl90ZXh0OgorCQkJKmNvbnYgPSBDT05WX1RFWFQ7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfY29udl9hdXRvOgorCQkJKmNvbnYgPSBDT05WX0FVVE87CisJCQlicmVhazsKKwkJY2FzZSBPcHRfY2hlY2tfbm9uZToKKwkJCSpjaGsgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2NoZWNrX25vcm1hbDoKKwkJCSpjaGsgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2NoZWNrX3N0cmljdDoKKwkJCSpjaGsgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2Vycl9jb250OgorCQkJKmVycnMgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2Vycl9ybzoKKwkJCSplcnJzID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9lcnJfcGFuaWM6CisJCQkqZXJycyA9IDI7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZWFzX25vOgorCQkJKmVhcyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZWFzX3JvOgorCQkJKmVhcyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZWFzX3J3OgorCQkJKmVhcyA9IDI7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfY2hrZHNrX25vOgorCQkJKmNoa2RzayA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfY2hrZHNrX2Vycm9yczoKKwkJCSpjaGtkc2sgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2Noa2Rza19hbHdheXM6CisJCQkqY2hrZHNrID0gMjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF90aW1lc2hpZnQ6CisJCXsKKwkJCWludCBtID0gMTsKKwkJCWNoYXIgKnJocyA9IGFyZ3NbMF0uZnJvbTsKKwkJCWlmICghcmhzIHx8ICEqcmhzKQorCQkJCXJldHVybiAwOworCQkJaWYgKCpyaHMgPT0gJy0nKSBtID0gLTE7CisJCQlpZiAoKnJocyA9PSAnKycgfHwgKnJocyA9PSAnLScpIHJocysrOworCQkJKnRpbWVzaGlmdCA9IHNpbXBsZV9zdHJ0b3VsKHJocywgJnJocywgMCkgKiBtOworCQkJaWYgKCpyaHMpCisJCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBocGZzX2hlbHAodm9pZCkKK3sKKwlwcmludGsoIlxuXAorSFBGUyBmaWxlc3lzdGVtIG9wdGlvbnM6XG5cCisgICAgICBoZWxwICAgICAgICAgICAgICBkbyBub3QgbW91bnQgYW5kIGRpc3BsYXkgdGhpcyB0ZXh0XG5cCisgICAgICB1aWQ9eHh4ICAgICAgICAgICBzZXQgdWlkIG9mIGZpbGVzIHRoYXQgZG9uJ3QgaGF2ZSB1aWQgc3BlY2lmaWVkIGluIGVhc1xuXAorICAgICAgZ2lkPXh4eCAgICAgICAgICAgc2V0IGdpZCBvZiBmaWxlcyB0aGF0IGRvbid0IGhhdmUgZ2lkIHNwZWNpZmllZCBpbiBlYXNcblwKKyAgICAgIHVtYXNrPXh4eCAgICAgICAgIHNldCBtb2RlIG9mIGZpbGVzIHRoYXQgZG9uJ3QgaGF2ZSBtb2RlIHNwZWNpZmllZCBpbiBlYXNcblwKKyAgICAgIGNhc2U9bG93ZXIgICAgICAgIGxvd2VyY2FzZSBhbGwgZmlsZXNcblwKKyAgICAgIGNhc2U9YXNpcyAgICAgICAgIGRvIG5vdCBsb3dlcmNhc2UgZmlsZXMgKGRlZmF1bHQpXG5cCisgICAgICBjb252PWJpbmFyeSAgICAgICBkbyBub3QgY29udmVydCBDUi9MRiAtPiBMRiAoZGVmYXVsdClcblwKKyAgICAgIGNvbnY9YXV0byAgICAgICAgIGNvbnZlcnQgb25seSBmaWxlcyB3aXRoIGtub3duIHRleHQgZXh0ZW5zaW9uc1xuXAorICAgICAgY29udj10ZXh0ICAgICAgICAgY29udmVydCBhbGwgZmlsZXNcblwKKyAgICAgIGNoZWNrPW5vbmUgICAgICAgIG5vIGZzIGNoZWNrcyAtIGtlcm5lbCBtYXkgY3Jhc2ggb24gY29ycnVwdGVkIGZpbGVzeXN0ZW1cblwKKyAgICAgIGNoZWNrPW5vcm1hbCAgICAgIGRvIHNvbWUgY2hlY2tzIC0gaXQgc2hvdWxkIG5vdCBjcmFzaCAoZGVmYXVsdClcblwKKyAgICAgIGNoZWNrPXN0cmljdCAgICAgIGRvIGV4dHJhIHRpbWUtY29uc3VtaW5nIGNoZWNrcywgdXNlZCBmb3IgZGVidWdnaW5nXG5cCisgICAgICBlcnJvcnM9Y29udGludWUgICBjb250aW51ZSBvbiBlcnJvcnNcblwKKyAgICAgIGVycm9ycz1yZW1vdW50LXJvIHJlbW91bnQgcmVhZC1vbmx5IGlmIGVycm9ycyBmb3VuZCAoZGVmYXVsdClcblwKKyAgICAgIGVycm9ycz1wYW5pYyAgICAgIHBhbmljIG9uIGVycm9yc1xuXAorICAgICAgY2hrZHNrPW5vICAgICAgICAgZG8gbm90IG1hcmsgZnMgZm9yIGNoa2Rza2luZyBldmVuIGlmIHRoZXJlIHdlcmUgZXJyb3JzXG5cCisgICAgICBjaGtkc2s9ZXJyb3JzICAgICBtYXJrIGZzIGRpcnR5IGlmIGVycm9ycyBmb3VuZCAoZGVmYXVsdClcblwKKyAgICAgIGNoa2Rzaz1hbHdheXMgICAgIGFsd2F5cyBtYXJrIGZzIGRpcnR5IC0gdXNlZCBmb3IgZGVidWdnaW5nXG5cCisgICAgICBlYXM9bm8gICAgICAgICAgICBpZ25vcmUgZXh0ZW5kZWQgYXR0cmlidXRlc1xuXAorICAgICAgZWFzPXJvICAgICAgICAgICAgcmVhZCBidXQgZG8gbm90IHdyaXRlIGV4dGVuZGVkIGF0dHJpYnV0ZXNcblwKKyAgICAgIGVhcz1ydyAgICAgICAgICAgIHIvdyBlYXMgPT4gZW5hYmxlcyBjaG1vZCwgY2hvd24sIG1rbm9kLCBsbiAtcyAoZGVmYXVsdClcblwKKyAgICAgIHRpbWVzaGlmdD1ubm4JYWRkIG5ubiBzZWNvbmRzIHRvIGZpbGUgdGltZXNcblwKK1xuIik7Cit9CisKK3N0YXRpYyBpbnQgaHBmc19yZW1vdW50X2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgaW50ICpmbGFncywgY2hhciAqZGF0YSkKK3sKKwl1aWRfdCB1aWQ7CisJZ2lkX3QgZ2lkOworCXVtb2RlX3QgdW1hc2s7CisJaW50IGxvd2VyY2FzZSwgY29udiwgZWFzLCBjaGssIGVycnMsIGNoa2RzaywgdGltZXNoaWZ0OworCWludCBvOworCXN0cnVjdCBocGZzX3NiX2luZm8gKnNiaSA9IGhwZnNfc2Iocyk7CisJCisJKmZsYWdzIHw9IE1TX05PQVRJTUU7CisJCisJdWlkID0gc2JpLT5zYl91aWQ7IGdpZCA9IHNiaS0+c2JfZ2lkOworCXVtYXNrID0gMDc3NyAmIH5zYmktPnNiX21vZGU7CisJbG93ZXJjYXNlID0gc2JpLT5zYl9sb3dlcmNhc2U7IGNvbnYgPSBzYmktPnNiX2NvbnY7CisJZWFzID0gc2JpLT5zYl9lYXM7IGNoayA9IHNiaS0+c2JfY2hrOyBjaGtkc2sgPSBzYmktPnNiX2Noa2RzazsKKwllcnJzID0gc2JpLT5zYl9lcnI7IHRpbWVzaGlmdCA9IHNiaS0+c2JfdGltZXNoaWZ0OworCisJaWYgKCEobyA9IHBhcnNlX29wdHMoZGF0YSwgJnVpZCwgJmdpZCwgJnVtYXNrLCAmbG93ZXJjYXNlLCAmY29udiwKKwkgICAgJmVhcywgJmNoaywgJmVycnMsICZjaGtkc2ssICZ0aW1lc2hpZnQpKSkgeworCQlwcmludGsoIkhQRlM6IGJhZCBtb3VudCBvcHRpb25zLlxuIik7CisJICAgIAlyZXR1cm4gMTsKKwl9CisJaWYgKG8gPT0gMikgeworCQlocGZzX2hlbHAoKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICh0aW1lc2hpZnQgIT0gc2JpLT5zYl90aW1lc2hpZnQpIHsKKwkJcHJpbnRrKCJIUEZTOiB0aW1lc2hpZnQgY2FuJ3QgYmUgY2hhbmdlZCB1c2luZyByZW1vdW50LlxuIik7CisJCXJldHVybiAxOworCX0KKworCXVubWFya19kaXJ0eShzKTsKKworCXNiaS0+c2JfdWlkID0gdWlkOyBzYmktPnNiX2dpZCA9IGdpZDsKKwlzYmktPnNiX21vZGUgPSAwNzc3ICYgfnVtYXNrOworCXNiaS0+c2JfbG93ZXJjYXNlID0gbG93ZXJjYXNlOyBzYmktPnNiX2NvbnYgPSBjb252OworCXNiaS0+c2JfZWFzID0gZWFzOyBzYmktPnNiX2NoayA9IGNoazsgc2JpLT5zYl9jaGtkc2sgPSBjaGtkc2s7CisJc2JpLT5zYl9lcnIgPSBlcnJzOyBzYmktPnNiX3RpbWVzaGlmdCA9IHRpbWVzaGlmdDsKKworCWlmICghKCpmbGFncyAmIE1TX1JET05MWSkpIG1hcmtfZGlydHkocyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogU3VwZXIgb3BlcmF0aW9ucyAqLworCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgaHBmc19zb3BzID0KK3sKKwkuYWxsb2NfaW5vZGUJPSBocGZzX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gaHBmc19kZXN0cm95X2lub2RlLAorCS5kZWxldGVfaW5vZGUJPSBocGZzX2RlbGV0ZV9pbm9kZSwKKwkucHV0X3N1cGVyCT0gaHBmc19wdXRfc3VwZXIsCisJLnN0YXRmcwkJPSBocGZzX3N0YXRmcywKKwkucmVtb3VudF9mcwk9IGhwZnNfcmVtb3VudF9mcywKK307CisKK3N0YXRpYyBpbnQgaHBmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqb3B0aW9ucywgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMCwgKmJoMSwgKmJoMjsKKwlzdHJ1Y3QgaHBmc19ib290X2Jsb2NrICpib290YmxvY2s7CisJc3RydWN0IGhwZnNfc3VwZXJfYmxvY2sgKnN1cGVyYmxvY2s7CisJc3RydWN0IGhwZnNfc3BhcmVfYmxvY2sgKnNwYXJlYmxvY2s7CisJc3RydWN0IGhwZnNfc2JfaW5mbyAqc2JpOworCXN0cnVjdCBpbm9kZSAqcm9vdDsKKworCXVpZF90IHVpZDsKKwlnaWRfdCBnaWQ7CisJdW1vZGVfdCB1bWFzazsKKwlpbnQgbG93ZXJjYXNlLCBjb252LCBlYXMsIGNoaywgZXJycywgY2hrZHNrLCB0aW1lc2hpZnQ7CisKKwlkbm9kZV9zZWNubyByb290X2RubzsKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlID0gTlVMTDsKKwlzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCBxYmg7CisKKwlpbnQgbzsKKworCXNiaSA9IGttYWxsb2Moc2l6ZW9mKCpzYmkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNiaSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcy0+c19mc19pbmZvID0gc2JpOworCW1lbXNldChzYmksIDAsIHNpemVvZigqc2JpKSk7CisKKwlzYmktPnNiX2JtcF9kaXIgPSBOVUxMOworCXNiaS0+c2JfY3BfdGFibGUgPSBOVUxMOworCisJaW5pdF9NVVRFWCgmc2JpLT5ocGZzX2NyZWF0aW9uX2RlKTsKKworCXVpZCA9IGN1cnJlbnQtPnVpZDsKKwlnaWQgPSBjdXJyZW50LT5naWQ7CisJdW1hc2sgPSBjdXJyZW50LT5mcy0+dW1hc2s7CisJbG93ZXJjYXNlID0gMDsKKwljb252ID0gQ09OVl9CSU5BUlk7CisJZWFzID0gMjsKKwljaGsgPSAxOworCWVycnMgPSAxOworCWNoa2RzayA9IDE7CisJdGltZXNoaWZ0ID0gMDsKKworCWlmICghKG8gPSBwYXJzZV9vcHRzKG9wdGlvbnMsICZ1aWQsICZnaWQsICZ1bWFzaywgJmxvd2VyY2FzZSwgJmNvbnYsCisJICAgICZlYXMsICZjaGssICZlcnJzLCAmY2hrZHNrLCAmdGltZXNoaWZ0KSkpIHsKKwkJcHJpbnRrKCJIUEZTOiBiYWQgbW91bnQgb3B0aW9ucy5cbiIpOworCQlnb3RvIGJhaWwwOworCX0KKwlpZiAobz09MikgeworCQlocGZzX2hlbHAoKTsKKwkJZ290byBiYWlsMDsKKwl9CisKKwkvKnNiaS0+c2JfbW91bnRpbmcgPSAxOyovCisJc2Jfc2V0X2Jsb2Nrc2l6ZShzLCA1MTIpOworCXNiaS0+c2JfZnNfc2l6ZSA9IC0xOworCWlmICghKGJvb3RibG9jayA9IGhwZnNfbWFwX3NlY3RvcihzLCAwLCAmYmgwLCAwKSkpIGdvdG8gYmFpbDE7CisJaWYgKCEoc3VwZXJibG9jayA9IGhwZnNfbWFwX3NlY3RvcihzLCAxNiwgJmJoMSwgMSkpKSBnb3RvIGJhaWwyOworCWlmICghKHNwYXJlYmxvY2sgPSBocGZzX21hcF9zZWN0b3IocywgMTcsICZiaDIsIDApKSkgZ290byBiYWlsMzsKKworCS8qIENoZWNrIG1hZ2ljcyAqLworCWlmICgvKmJvb3RibG9jay0+bWFnaWMgIT0gQkJfTUFHSUMKKwkgICAgfHwqLyBzdXBlcmJsb2NrLT5tYWdpYyAhPSBTQl9NQUdJQworCSAgICB8fCBzcGFyZWJsb2NrLT5tYWdpYyAhPSBTUF9NQUdJQykgeworCQlpZiAoIXNpbGVudCkgcHJpbnRrKCJIUEZTOiBCYWQgbWFnaWMgLi4uIHByb2JhYmx5IG5vdCBIUEZTXG4iKTsKKwkJZ290byBiYWlsNDsKKwl9CisKKwkvKiBDaGVjayB2ZXJzaW9uICovCisJaWYgKCEocy0+c19mbGFncyAmIE1TX1JET05MWSkgJiYKKwkgICAgICBzdXBlcmJsb2NrLT5mdW5jdmVyc2lvbiAhPSAyICYmIHN1cGVyYmxvY2stPmZ1bmN2ZXJzaW9uICE9IDMpIHsKKwkJcHJpbnRrKCJIUEZTOiBCYWQgdmVyc2lvbiAlZCwlZC4gTW91bnQgcmVhZG9ubHkgdG8gZ28gYXJvdW5kXG4iLAorCQkJKGludClzdXBlcmJsb2NrLT52ZXJzaW9uLCAoaW50KXN1cGVyYmxvY2stPmZ1bmN2ZXJzaW9uKTsKKwkJcHJpbnRrKCJIUEZTOiBwbGVhc2UgdHJ5IHJlY2VudCB2ZXJzaW9uIG9mIEhQRlMgZHJpdmVyIGF0IGh0dHA6Ly9hcnRheC5rYXJsaW4ubWZmLmN1bmkuY3ovfm1pa3VsYXMvdnlwbG9keS9ocGZzL2luZGV4LWUuY2dpIGFuZCBpZiBpdCBzdGlsbCBjYW4ndCB1bmRlcnN0YW5kIHRoaXMgZm9ybWF0LCBjb250YWN0IGF1dGhvciAtIG1pa3VsYXNAYXJ0YXgua2FybGluLm1mZi5jdW5pLmN6XG4iKTsKKwkJZ290byBiYWlsNDsKKwl9CisKKwlzLT5zX2ZsYWdzIHw9IE1TX05PQVRJTUU7CisKKwkvKiBGaWxsIHN1cGVyYmxvY2sgc3R1ZmYgKi8KKwlzLT5zX21hZ2ljID0gSFBGU19TVVBFUl9NQUdJQzsKKwlzLT5zX29wID0gJmhwZnNfc29wczsKKworCXNiaS0+c2Jfcm9vdCA9IHN1cGVyYmxvY2stPnJvb3Q7CisJc2JpLT5zYl9mc19zaXplID0gc3VwZXJibG9jay0+bl9zZWN0b3JzOworCXNiaS0+c2JfYml0bWFwcyA9IHN1cGVyYmxvY2stPmJpdG1hcHM7CisJc2JpLT5zYl9kaXJiYW5kX3N0YXJ0ID0gc3VwZXJibG9jay0+ZGlyX2JhbmRfc3RhcnQ7CisJc2JpLT5zYl9kaXJiYW5kX3NpemUgPSBzdXBlcmJsb2NrLT5uX2Rpcl9iYW5kOworCXNiaS0+c2JfZG1hcCA9IHN1cGVyYmxvY2stPmRpcl9iYW5kX2JpdG1hcDsKKwlzYmktPnNiX3VpZCA9IHVpZDsKKwlzYmktPnNiX2dpZCA9IGdpZDsKKwlzYmktPnNiX21vZGUgPSAwNzc3ICYgfnVtYXNrOworCXNiaS0+c2Jfbl9mcmVlID0gLTE7CisJc2JpLT5zYl9uX2ZyZWVfZG5vZGVzID0gLTE7CisJc2JpLT5zYl9sb3dlcmNhc2UgPSBsb3dlcmNhc2U7CisJc2JpLT5zYl9jb252ID0gY29udjsKKwlzYmktPnNiX2VhcyA9IGVhczsKKwlzYmktPnNiX2NoayA9IGNoazsKKwlzYmktPnNiX2Noa2RzayA9IGNoa2RzazsKKwlzYmktPnNiX2VyciA9IGVycnM7CisJc2JpLT5zYl90aW1lc2hpZnQgPSB0aW1lc2hpZnQ7CisJc2JpLT5zYl93YXNfZXJyb3IgPSAwOworCXNiaS0+c2JfY3BfdGFibGUgPSBOVUxMOworCXNiaS0+c2JfY19iaXRtYXAgPSAtMTsKKwlzYmktPnNiX21heF9md2RfYWxsb2MgPSAweGZmZmZmZjsKKwkKKwkvKiBMb2FkIGJpdG1hcCBkaXJlY3RvcnkgKi8KKwlpZiAoIShzYmktPnNiX2JtcF9kaXIgPSBocGZzX2xvYWRfYml0bWFwX2RpcmVjdG9yeShzLCBzdXBlcmJsb2NrLT5iaXRtYXBzKSkpCisJCWdvdG8gYmFpbDQ7CisJCisJLyogQ2hlY2sgZm9yIGdlbmVyYWwgZnMgZXJyb3JzKi8KKwlpZiAoc3BhcmVibG9jay0+ZGlydHkgJiYgIXNwYXJlYmxvY2stPm9sZF93cm90ZSkgeworCQlpZiAoZXJycyA9PSAyKSB7CisJCQlwcmludGsoIkhQRlM6IEltcHJvcGVybHkgc3RvcHBlZCwgbm90IG1vdW50ZWRcbiIpOworCQkJZ290byBiYWlsNDsKKwkJfQorCQlocGZzX2Vycm9yKHMsICJpbXByb3Blcmx5IHN0b3BwZWQiKTsKKwl9CisKKwlpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlzcGFyZWJsb2NrLT5kaXJ0eSA9IDE7CisJCXNwYXJlYmxvY2stPm9sZF93cm90ZSA9IDA7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoMik7CisJfQorCisJaWYgKHNwYXJlYmxvY2stPmhvdGZpeGVzX3VzZWQgfHwgc3BhcmVibG9jay0+bl9zcGFyZXNfdXNlZCkgeworCQlpZiAoZXJycyA+PSAyKSB7CisJCQlwcmludGsoIkhQRlM6IEhvdGZpeGVzIG5vdCBzdXBwb3J0ZWQgaGVyZSwgdHJ5IGNoa2Rza1xuIik7CisJCQltYXJrX2RpcnR5KHMpOworCQkJZ290byBiYWlsNDsKKwkJfQorCQlocGZzX2Vycm9yKHMsICJob3RmaXhlcyBub3Qgc3VwcG9ydGVkIGhlcmUsIHRyeSBjaGtkc2siKTsKKwkJaWYgKGVycnMgPT0gMCkgcHJpbnRrKCJIUEZTOiBQcm9jZWVkaW5nLCBidXQgeW91ciBmaWxlc3lzdGVtIHdpbGwgYmUgcHJvYmFibHkgY29ycnVwdGVkIGJ5IHRoaXMgZHJpdmVyLi4uXG4iKTsKKwkJZWxzZSBwcmludGsoIkhQRlM6IFRoaXMgZHJpdmVyIG1heSByZWFkIGJhZCBmaWxlcyBvciBjcmFzaCB3aGVuIG9wZXJhdGluZyBvbiBkaXNrIHdpdGggaG90Zml4ZXMuXG4iKTsKKwl9CisJaWYgKHNwYXJlYmxvY2stPm5fZG5vZGVfc3BhcmVzICE9IHNwYXJlYmxvY2stPm5fZG5vZGVfc3BhcmVzX2ZyZWUpIHsKKwkJaWYgKGVycnMgPj0gMikgeworCQkJcHJpbnRrKCJIUEZTOiBTcGFyZSBkbm9kZXMgdXNlZCwgdHJ5IGNoa2Rza1xuIik7CisJCQltYXJrX2RpcnR5KHMpOworCQkJZ290byBiYWlsNDsKKwkJfQorCQlocGZzX2Vycm9yKHMsICJ3YXJuaW5nOiBzcGFyZSBkbm9kZXMgdXNlZCwgdHJ5IGNoa2RzayIpOworCQlpZiAoZXJycyA9PSAwKSBwcmludGsoIkhQRlM6IFByb2NlZWRpbmcsIGJ1dCB5b3VyIGZpbGVzeXN0ZW0gY291bGQgYmUgY29ycnVwdGVkIGlmIHlvdSBkZWxldGUgZmlsZXMgb3IgZGlyZWN0b3JpZXNcbiIpOworCX0KKwlpZiAoY2hrKSB7CisJCXVuc2lnbmVkIGE7CisJCWlmIChzdXBlcmJsb2NrLT5kaXJfYmFuZF9lbmQgLSBzdXBlcmJsb2NrLT5kaXJfYmFuZF9zdGFydCArIDEgIT0gc3VwZXJibG9jay0+bl9kaXJfYmFuZCB8fAorCQkgICAgc3VwZXJibG9jay0+ZGlyX2JhbmRfZW5kIDwgc3VwZXJibG9jay0+ZGlyX2JhbmRfc3RhcnQgfHwgc3VwZXJibG9jay0+bl9kaXJfYmFuZCA+IDB4NDAwMCkgeworCQkJaHBmc19lcnJvcihzLCAiZGlyIGJhbmQgc2l6ZSBtaXNtYXRjaDogZGlyX2JhbmRfc3RhcnQ9PSUwOHgsIGRpcl9iYW5kX2VuZD09JTA4eCwgbl9kaXJfYmFuZD09JTA4eCIsCisJCQkJc3VwZXJibG9jay0+ZGlyX2JhbmRfc3RhcnQsIHN1cGVyYmxvY2stPmRpcl9iYW5kX2VuZCwgc3VwZXJibG9jay0+bl9kaXJfYmFuZCk7CisJCQlnb3RvIGJhaWw0OworCQl9CisJCWEgPSBzYmktPnNiX2RpcmJhbmRfc2l6ZTsKKwkJc2JpLT5zYl9kaXJiYW5kX3NpemUgPSAwOworCQlpZiAoaHBmc19jaGtfc2VjdG9ycyhzLCBzdXBlcmJsb2NrLT5kaXJfYmFuZF9zdGFydCwgc3VwZXJibG9jay0+bl9kaXJfYmFuZCwgImRpcl9iYW5kIikgfHwKKwkJICAgIGhwZnNfY2hrX3NlY3RvcnMocywgc3VwZXJibG9jay0+ZGlyX2JhbmRfYml0bWFwLCA0LCAiZGlyX2JhbmRfYml0bWFwIikgfHwKKwkJICAgIGhwZnNfY2hrX3NlY3RvcnMocywgc3VwZXJibG9jay0+Yml0bWFwcywgNCwgImJpdG1hcHMiKSkgeworCQkJbWFya19kaXJ0eShzKTsKKwkJCWdvdG8gYmFpbDQ7CisJCX0KKwkJc2JpLT5zYl9kaXJiYW5kX3NpemUgPSBhOworCX0gZWxzZSBwcmludGsoIkhQRlM6IFlvdSByZWFsbHkgZG9uJ3Qgd2FudCBhbnkgY2hlY2tzPyBZb3UgYXJlIGNyYXp5Li4uXG4iKTsKKworCS8qIExvYWQgY29kZSBwYWdlIHRhYmxlICovCisJaWYgKHNwYXJlYmxvY2stPm5fY29kZV9wYWdlcykKKwkJaWYgKCEoc2JpLT5zYl9jcF90YWJsZSA9IGhwZnNfbG9hZF9jb2RlX3BhZ2Uocywgc3BhcmVibG9jay0+Y29kZV9wYWdlX2RpcikpKQorCQkJcHJpbnRrKCJIUEZTOiBXYXJuaW5nOiBjb2RlIHBhZ2Ugc3VwcG9ydCBpcyBkaXNhYmxlZFxuIik7CisKKwlicmVsc2UoYmgyKTsKKwlicmVsc2UoYmgxKTsKKwlicmVsc2UoYmgwKTsKKworCXJvb3QgPSBpZ2V0X2xvY2tlZChzLCBzYmktPnNiX3Jvb3QpOworCWlmICghcm9vdCkKKwkJZ290byBiYWlsMDsKKwlocGZzX2luaXRfaW5vZGUocm9vdCk7CisJaHBmc19yZWFkX2lub2RlKHJvb3QpOworCXVubG9ja19uZXdfaW5vZGUocm9vdCk7CisJcy0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3QpOworCWlmICghcy0+c19yb290KSB7CisJCWlwdXQocm9vdCk7CisJCWdvdG8gYmFpbDA7CisJfQorCWhwZnNfc2V0X2RlbnRyeV9vcGVyYXRpb25zKHMtPnNfcm9vdCk7CisKKwkvKgorCSAqIGZpbmQgdGhlIHJvb3QgZGlyZWN0b3J5J3MgLiBwb2ludGVyICYgZmluaXNoIGZpbGxpbmcgaW4gdGhlIGlub2RlCisJICovCisKKwlyb290X2RubyA9IGhwZnNfZm5vZGVfZG5vKHMsIHNiaS0+c2Jfcm9vdCk7CisJaWYgKHJvb3RfZG5vKQorCQlkZSA9IG1hcF9kaXJlbnQocm9vdCwgcm9vdF9kbm8sICJcMDAxXDAwMSIsIDIsIE5VTEwsICZxYmgpOworCWlmICghZGUpCisJCWhwZnNfZXJyb3IocywgInVuYWJsZSB0byBmaW5kIHJvb3QgZGlyIik7CisJZWxzZSB7CisJCXJvb3QtPmlfYXRpbWUudHZfc2VjID0gbG9jYWxfdG9fZ210KHMsIGRlLT5yZWFkX2RhdGUpOworCQlyb290LT5pX2F0aW1lLnR2X25zZWMgPSAwOworCQlyb290LT5pX210aW1lLnR2X3NlYyA9IGxvY2FsX3RvX2dtdChzLCBkZS0+d3JpdGVfZGF0ZSk7CisJCXJvb3QtPmlfbXRpbWUudHZfbnNlYyA9IDA7CisJCXJvb3QtPmlfY3RpbWUudHZfc2VjID0gbG9jYWxfdG9fZ210KHMsIGRlLT5jcmVhdGlvbl9kYXRlKTsKKwkJcm9vdC0+aV9jdGltZS50dl9uc2VjID0gMDsKKwkJaHBmc19pKHJvb3QpLT5pX2VhX3NpemUgPSBkZS0+ZWFfc2l6ZTsKKwkJaHBmc19pKHJvb3QpLT5pX3BhcmVudF9kaXIgPSByb290LT5pX2lubzsKKwkJaWYgKHJvb3QtPmlfc2l6ZSA9PSAtMSkKKwkJCXJvb3QtPmlfc2l6ZSA9IDIwNDg7CisJCWlmIChyb290LT5pX2Jsb2NrcyA9PSAtMSkKKwkJCXJvb3QtPmlfYmxvY2tzID0gNTsKKwkJaHBmc19icmVsc2U0KCZxYmgpOworCX0KKwlyZXR1cm4gMDsKKworYmFpbDQ6CWJyZWxzZShiaDIpOworYmFpbDM6CWJyZWxzZShiaDEpOworYmFpbDI6CWJyZWxzZShiaDApOworYmFpbDE6CitiYWlsMDoKKwlpZiAoc2JpLT5zYl9ibXBfZGlyKSBrZnJlZShzYmktPnNiX2JtcF9kaXIpOworCWlmIChzYmktPnNiX2NwX3RhYmxlKSBrZnJlZShzYmktPnNiX2NwX3RhYmxlKTsKKwlzLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNiaSk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmhwZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgaHBmc19maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGhwZnNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImhwZnMiLAorCS5nZXRfc2IJCT0gaHBmc19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2Jsb2NrX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfaHBmc19mcyh2b2lkKQoreworCWludCBlcnIgPSBpbml0X2lub2RlY2FjaGUoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmaHBmc19mc190eXBlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlyZXR1cm4gMDsKK291dDoKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKK291dDE6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfaHBmc19mcyh2b2lkKQoreworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmaHBmc19mc190eXBlKTsKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ocGZzX2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9ocGZzX2ZzKQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvaHBwZnMvTWFrZWZpbGUgYi9mcy9ocHBmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODkwNDMzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaHBwZnMvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjCisjIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyMKKworaHBwZnMtb2JqcyA6PSBocHBmc19rZXJuLm8KKworb2JqLXkgPQorb2JqLSQoQ09ORklHX0hQUEZTKSArPSBocHBmcy5vCmRpZmYgLS1naXQgYS9mcy9ocHBmcy9ocHBmc19rZXJuLmMgYi9mcy9ocHBmcy9ocHBmc19rZXJuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhlMGNiZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hwcGZzL2hwcGZzX2tlcm4uYwpAQCAtMCwwICsxLDgxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0ZnMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9mY250bC5oPgorI2luY2x1ZGUgIm9zLmgiCisKK3N0YXRpYyBpbnQgaW5pdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworCitzdHJ1Y3QgaHBwZnNfZGF0YSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWNoYXIgY29udGVudHNbUEFHRV9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpXTsKK307CisKK3N0cnVjdCBocHBmc19wcml2YXRlIHsKKwlzdHJ1Y3QgZmlsZSAqcHJvY19maWxlOworCWludCBob3N0X2ZkOworCWxvZmZfdCBsZW47CisJc3RydWN0IGhwcGZzX2RhdGEgKmNvbnRlbnRzOworfTsKKworc3RydWN0IGhwcGZzX2lub2RlX2luZm8geworICAgICAgICBzdHJ1Y3QgZGVudHJ5ICpwcm9jX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaHBwZnNfaW5vZGVfaW5mbyAqSFBQRlNfSShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybihsaXN0X2VudHJ5KGlub2RlLCBzdHJ1Y3QgaHBwZnNfaW5vZGVfaW5mbywgdmZzX2lub2RlKSk7Cit9CisKKyNkZWZpbmUgSFBQRlNfU1VQRVJfTUFHSUMgMHhiMDAwMDBlZQorCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgaHBwZnNfc2JvcHM7CisKK3N0YXRpYyBpbnQgaXNfcGlkKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCWludCBpOworCisJc2IgPSBkZW50cnktPmRfc2I7CisJaWYoKHNiLT5zX29wICE9ICZocHBmc19zYm9wcykgfHwgKGRlbnRyeS0+ZF9wYXJlbnQgIT0gc2ItPnNfcm9vdCkpCisJCXJldHVybigwKTsKKworCWZvcihpID0gMDsgaSA8IGRlbnRyeS0+ZF9uYW1lLmxlbjsgaSsrKXsKKwkJaWYoIWlzZGlnaXQoZGVudHJ5LT5kX25hbWUubmFtZVtpXSkpCisJCQlyZXR1cm4oMCk7CisJfQorCXJldHVybigxKTsKK30KKworc3RhdGljIGNoYXIgKmRlbnRyeV9uYW1lKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGV4dHJhKQoreworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwljaGFyICpyb290LCAqbmFtZTsKKwljb25zdCBjaGFyICpzZWdfbmFtZTsKKwlpbnQgbGVuLCBzZWdfbGVuOworCisJbGVuID0gMDsKKwlwYXJlbnQgPSBkZW50cnk7CisJd2hpbGUocGFyZW50LT5kX3BhcmVudCAhPSBwYXJlbnQpeworCQlpZihpc19waWQocGFyZW50KSkKKwkJCWxlbiArPSBzdHJsZW4oInBpZCIpICsgMTsKKwkJZWxzZSBsZW4gKz0gcGFyZW50LT5kX25hbWUubGVuICsgMTsKKwkJcGFyZW50ID0gcGFyZW50LT5kX3BhcmVudDsKKwl9CisKKwlyb290ID0gInByb2MiOworCWxlbiArPSBzdHJsZW4ocm9vdCk7CisJbmFtZSA9IGttYWxsb2MobGVuICsgZXh0cmEgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZihuYW1lID09IE5VTEwpIHJldHVybihOVUxMKTsKKworCW5hbWVbbGVuXSA9ICdcMCc7CisJcGFyZW50ID0gZGVudHJ5OworCXdoaWxlKHBhcmVudC0+ZF9wYXJlbnQgIT0gcGFyZW50KXsKKwkJaWYoaXNfcGlkKHBhcmVudCkpeworCQkJc2VnX25hbWUgPSAicGlkIjsKKwkJCXNlZ19sZW4gPSBzdHJsZW4oInBpZCIpOworCQl9CisJCWVsc2UgeworCQkJc2VnX25hbWUgPSBwYXJlbnQtPmRfbmFtZS5uYW1lOworCQkJc2VnX2xlbiA9IHBhcmVudC0+ZF9uYW1lLmxlbjsKKwkJfQorCisJCWxlbiAtPSBzZWdfbGVuICsgMTsKKwkJbmFtZVtsZW5dID0gJy8nOworCQlzdHJuY3B5KCZuYW1lW2xlbiArIDFdLCBzZWdfbmFtZSwgc2VnX2xlbik7CisJCXBhcmVudCA9IHBhcmVudC0+ZF9wYXJlbnQ7CisJfQorCXN0cm5jcHkobmFtZSwgcm9vdCwgc3RybGVuKHJvb3QpKTsKKwlyZXR1cm4obmFtZSk7Cit9CisKK3N0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBocHBmc19kZW50cnlfb3BzID0geworfTsKKworc3RhdGljIGludCBmaWxlX3JlbW92ZWQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpmaWxlKQoreworCWNoYXIgKmhvc3RfZmlsZTsKKwlpbnQgZXh0cmEsIGZkOworCisJZXh0cmEgPSAwOworCWlmKGZpbGUgIT0gTlVMTCkgZXh0cmEgKz0gc3RybGVuKGZpbGUpICsgMTsKKworCWhvc3RfZmlsZSA9IGRlbnRyeV9uYW1lKGRlbnRyeSwgZXh0cmEgKyBzdHJsZW4oIi9yZW1vdmUiKSk7CisJaWYoaG9zdF9maWxlID09IE5VTEwpeworCQlwcmludGsoImZpbGVfcmVtb3ZlZCA6IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuKC1FTk9NRU0pOworCX0KKworCWlmKGZpbGUgIT0gTlVMTCl7CisJCXN0cmNhdChob3N0X2ZpbGUsICIvIik7CisJCXN0cmNhdChob3N0X2ZpbGUsIGZpbGUpOworCX0KKwlzdHJjYXQoaG9zdF9maWxlLCAiL3JlbW92ZSIpOworCisJZmQgPSBvc19vcGVuX2ZpbGUoaG9zdF9maWxlLCBvZl9yZWFkKE9QRU5GTEFHUygpKSwgMCk7CisJa2ZyZWUoaG9zdF9maWxlKTsKKwlpZihmZCA+IDApeworCQlvc19jbG9zZV9maWxlKGZkKTsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIGhwcGZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm8pCit7CisJc3RydWN0IGlub2RlICpwcm9jX2lubzsKKworCWlmKEhQUEZTX0koaW5vKS0+cHJvY19kZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcHJvY19pbm8gPSBIUFBGU19JKGlubyktPnByb2NfZGVudHJ5LT5kX2lub2RlOworCWluby0+aV91aWQgPSBwcm9jX2luby0+aV91aWQ7CisJaW5vLT5pX2dpZCA9IHByb2NfaW5vLT5pX2dpZDsKKwlpbm8tPmlfYXRpbWUgPSBwcm9jX2luby0+aV9hdGltZTsKKwlpbm8tPmlfbXRpbWUgPSBwcm9jX2luby0+aV9tdGltZTsKKwlpbm8tPmlfY3RpbWUgPSBwcm9jX2luby0+aV9jdGltZTsKKwlpbm8tPmlfaW5vID0gcHJvY19pbm8tPmlfaW5vOworCWluby0+aV9tb2RlID0gcHJvY19pbm8tPmlfbW9kZTsKKwlpbm8tPmlfbmxpbmsgPSBwcm9jX2luby0+aV9ubGluazsKKwlpbm8tPmlfc2l6ZSA9IHByb2NfaW5vLT5pX3NpemU7CisJaW5vLT5pX2Jsa3NpemUgPSBwcm9jX2luby0+aV9ibGtzaXplOworCWluby0+aV9ibG9ja3MgPSBwcm9jX2luby0+aV9ibG9ja3M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpocHBmc19sb29rdXAoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpwcm9jX2RlbnRyeSwgKm5ldywgKnBhcmVudDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnIsIGRlbGV0ZWQ7CisKKwlkZWxldGVkID0gZmlsZV9yZW1vdmVkKGRlbnRyeSwgTlVMTCk7CisJaWYoZGVsZXRlZCA8IDApCisJCXJldHVybihFUlJfUFRSKGRlbGV0ZWQpKTsKKwllbHNlIGlmKGRlbGV0ZWQpCisJCXJldHVybihFUlJfUFRSKC1FTk9FTlQpKTsKKworCWVyciA9IC1FTk9NRU07CisJcGFyZW50ID0gSFBQRlNfSShpbm8pLT5wcm9jX2RlbnRyeTsKKwlkb3duKCZwYXJlbnQtPmRfaW5vZGUtPmlfc2VtKTsKKwlwcm9jX2RlbnRyeSA9IGRfbG9va3VwKHBhcmVudCwgJmRlbnRyeS0+ZF9uYW1lKTsKKwlpZihwcm9jX2RlbnRyeSA9PSBOVUxMKXsKKwkJcHJvY19kZW50cnkgPSBkX2FsbG9jKHBhcmVudCwgJmRlbnRyeS0+ZF9uYW1lKTsKKwkJaWYocHJvY19kZW50cnkgPT0gTlVMTCl7CisJCQl1cCgmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQluZXcgPSAoKnBhcmVudC0+ZF9pbm9kZS0+aV9vcC0+bG9va3VwKShwYXJlbnQtPmRfaW5vZGUsCisJCQkJCQkgICAgICAgcHJvY19kZW50cnksIE5VTEwpOworCQlpZihuZXcpeworCQkJZHB1dChwcm9jX2RlbnRyeSk7CisJCQlwcm9jX2RlbnRyeSA9IG5ldzsKKwkJfQorCX0KKwl1cCgmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisKKwlpZihJU19FUlIocHJvY19kZW50cnkpKQorCQlyZXR1cm4ocHJvY19kZW50cnkpOworCisJaW5vZGUgPSBpZ2V0KGluby0+aV9zYiwgMCk7CisJaWYoaW5vZGUgPT0gTlVMTCkKKwkJZ290byBvdXRfZHB1dDsKKworCWVyciA9IGluaXRfaW5vZGUoaW5vZGUsIHByb2NfZGVudHJ5KTsKKwlpZihlcnIpCisJCWdvdG8gb3V0X3B1dDsKKworCWhwcGZzX3JlYWRfaW5vZGUoaW5vZGUpOworCisgCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCWRlbnRyeS0+ZF9vcCA9ICZocHBmc19kZW50cnlfb3BzOworCXJldHVybihOVUxMKTsKKworIG91dF9wdXQ6CisJaXB1dChpbm9kZSk7Cisgb3V0X2RwdXQ6CisJZHB1dChwcm9jX2RlbnRyeSk7Cisgb3V0OgorCXJldHVybihFUlJfUFRSKGVycikpOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaHBwZnNfZmlsZV9pb3BzID0geworfTsKKworc3RhdGljIHNzaXplX3QgcmVhZF9wcm9jKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNzaXplX3QgY291bnQsCisJCQkgbG9mZl90ICpwcG9zLCBpbnQgaXNfdXNlcikKK3sKKwlzc2l6ZV90ICgqcmVhZCkoc3RydWN0IGZpbGUgKiwgY2hhciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKKwlzc2l6ZV90IG47CisKKwlyZWFkID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfZm9wLT5yZWFkOworCisJaWYoIWlzX3VzZXIpCisJCXNldF9mcyhLRVJORUxfRFMpOworCisJbiA9ICgqcmVhZCkoZmlsZSwgYnVmLCBjb3VudCwgJmZpbGUtPmZfcG9zKTsKKworCWlmKCFpc191c2VyKQorCQlzZXRfZnMoVVNFUl9EUyk7CisKKwlpZihwcG9zKSAqcHBvcyA9IGZpbGUtPmZfcG9zOworCXJldHVybihuKTsKK30KKworc3RhdGljIHNzaXplX3QgaHBwZnNfcmVhZF9maWxlKGludCBmZCwgY2hhciAqYnVmLCBzc2l6ZV90IGNvdW50KQoreworCXNzaXplX3QgbjsKKwlpbnQgY3VyLCBlcnI7CisJY2hhciAqbmV3X2J1ZjsKKworCW4gPSAtRU5PTUVNOworCW5ld19idWYgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYobmV3X2J1ZiA9PSBOVUxMKXsKKwkJcHJpbnRrKCJocHBmc19yZWFkX2ZpbGUgOiBrbWFsbG9jIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKwluID0gMDsKKwl3aGlsZShjb3VudCA+IDApeworCQljdXIgPSBtaW5fdChzc2l6ZV90LCBjb3VudCwgUEFHRV9TSVpFKTsKKwkJZXJyID0gb3NfcmVhZF9maWxlKGZkLCBuZXdfYnVmLCBjdXIpOworCQlpZihlcnIgPCAwKXsKKwkJCXByaW50aygiaHBwZnNfcmVhZCA6IHJlYWQgZmFpbGVkLCBlcnJubyA9ICVkXG4iLAorCQkJICAgICAgIGNvdW50KTsKKwkJCW4gPSBlcnI7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCWVsc2UgaWYoZXJyID09IDApCisJCQlicmVhazsKKworCQlpZihjb3B5X3RvX3VzZXIoYnVmLCBuZXdfYnVmLCBlcnIpKXsKKwkJCW4gPSAtRUZBVUxUOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQluICs9IGVycjsKKwkJY291bnQgLT0gZXJyOworCX0KKyBvdXRfZnJlZToKKwlrZnJlZShuZXdfYnVmKTsKKyBvdXQ6CisJcmV0dXJuKG4pOworfQorCitzdGF0aWMgc3NpemVfdCBocHBmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCSAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBocHBmc19wcml2YXRlICpocHBmcyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaHBwZnNfZGF0YSAqZGF0YTsKKwlsb2ZmX3Qgb2ZmOworCWludCBlcnI7CisKKwlpZihocHBmcy0+Y29udGVudHMgIT0gTlVMTCl7CisJCWlmKCpwcG9zID49IGhwcGZzLT5sZW4pIHJldHVybigwKTsKKworCQlkYXRhID0gaHBwZnMtPmNvbnRlbnRzOworCQlvZmYgPSAqcHBvczsKKwkJd2hpbGUob2ZmID49IHNpemVvZihkYXRhLT5jb250ZW50cykpeworCQkJZGF0YSA9IGxpc3RfZW50cnkoZGF0YS0+bGlzdC5uZXh0LCBzdHJ1Y3QgaHBwZnNfZGF0YSwKKwkJCQkJICBsaXN0KTsKKwkJCW9mZiAtPSBzaXplb2YoZGF0YS0+Y29udGVudHMpOworCQl9CisKKwkJaWYob2ZmICsgY291bnQgPiBocHBmcy0+bGVuKQorCQkJY291bnQgPSBocHBmcy0+bGVuIC0gb2ZmOworCQljb3B5X3RvX3VzZXIoYnVmLCAmZGF0YS0+Y29udGVudHNbb2ZmXSwgY291bnQpOworCQkqcHBvcyArPSBjb3VudDsKKwl9CisJZWxzZSBpZihocHBmcy0+aG9zdF9mZCAhPSAtMSl7CisJCWVyciA9IG9zX3NlZWtfZmlsZShocHBmcy0+aG9zdF9mZCwgKnBwb3MpOworCQlpZihlcnIpeworCQkJcHJpbnRrKCJocHBmc19yZWFkIDogc2VlayBmYWlsZWQsIGVycm5vID0gJWRcbiIsIGVycik7CisJCQlyZXR1cm4oZXJyKTsKKwkJfQorCQljb3VudCA9IGhwcGZzX3JlYWRfZmlsZShocHBmcy0+aG9zdF9mZCwgYnVmLCBjb3VudCk7CisJCWlmKGNvdW50ID4gMCkKKwkJCSpwcG9zICs9IGNvdW50OworCX0KKwllbHNlIGNvdW50ID0gcmVhZF9wcm9jKGhwcGZzLT5wcm9jX2ZpbGUsIGJ1ZiwgY291bnQsIHBwb3MsIDEpOworCisJcmV0dXJuKGNvdW50KTsKK30KKworc3RhdGljIHNzaXplX3QgaHBwZnNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwKKwkJCSAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaHBwZnNfcHJpdmF0ZSAqZGF0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZmlsZSAqcHJvY19maWxlID0gZGF0YS0+cHJvY19maWxlOworCXNzaXplX3QgKCp3cml0ZSkoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKKwlpbnQgZXJyOworCisJd3JpdGUgPSBwcm9jX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2ZvcC0+d3JpdGU7CisKKwlwcm9jX2ZpbGUtPmZfcG9zID0gZmlsZS0+Zl9wb3M7CisJZXJyID0gKCp3cml0ZSkocHJvY19maWxlLCBidWYsIGxlbiwgJnByb2NfZmlsZS0+Zl9wb3MpOworCWZpbGUtPmZfcG9zID0gcHJvY19maWxlLT5mX3BvczsKKworCXJldHVybihlcnIpOworfQorCitzdGF0aWMgaW50IG9wZW5faG9zdF9zb2NrKGNoYXIgKmhvc3RfZmlsZSwgaW50ICpmaWx0ZXJfb3V0KQoreworCWNoYXIgKmVuZDsKKwlpbnQgZmQ7CisKKwllbmQgPSAmaG9zdF9maWxlW3N0cmxlbihob3N0X2ZpbGUpXTsKKwlzdHJjcHkoZW5kLCAiL3J3Iik7CisJKmZpbHRlcl9vdXQgPSAxOworCWZkID0gb3NfY29ubmVjdF9zb2NrZXQoaG9zdF9maWxlKTsKKwlpZihmZCA+IDApCisJCXJldHVybihmZCk7CisKKwlzdHJjcHkoZW5kLCAiL3IiKTsKKwkqZmlsdGVyX291dCA9IDA7CisJZmQgPSBvc19jb25uZWN0X3NvY2tldChob3N0X2ZpbGUpOworCXJldHVybihmZCk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfY29udGVudHMoc3RydWN0IGhwcGZzX2RhdGEgKmhlYWQpCit7CisJc3RydWN0IGhwcGZzX2RhdGEgKmRhdGE7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlLCAqbmV4dDsKKworCWlmKGhlYWQgPT0gTlVMTCkgcmV0dXJuOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGVsZSwgbmV4dCwgJmhlYWQtPmxpc3QpeworCQlkYXRhID0gbGlzdF9lbnRyeShlbGUsIHN0cnVjdCBocHBmc19kYXRhLCBsaXN0KTsKKwkJa2ZyZWUoZGF0YSk7CisJfQorCWtmcmVlKGhlYWQpOworfQorCitzdGF0aWMgc3RydWN0IGhwcGZzX2RhdGEgKmhwcGZzX2dldF9kYXRhKGludCBmZCwgaW50IGZpbHRlciwKKwkJCQkJIHN0cnVjdCBmaWxlICpwcm9jX2ZpbGUsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqaHBwZnNfZmlsZSwKKwkJCQkJIGxvZmZfdCAqc2l6ZV9vdXQpCit7CisJc3RydWN0IGhwcGZzX2RhdGEgKmRhdGEsICpuZXcsICpoZWFkOworCWludCBuLCBlcnI7CisKKwllcnIgPSAtRU5PTUVNOworCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOworCWlmKGRhdGEgPT0gTlVMTCl7CisJCXByaW50aygiaHBwZnNfZ2V0X2RhdGEgOiBoZWFkIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJmRhdGEtPmxpc3QpOworCisJaGVhZCA9IGRhdGE7CisJKnNpemVfb3V0ID0gMDsKKworCWlmKGZpbHRlcil7CisJCXdoaWxlKChuID0gcmVhZF9wcm9jKHByb2NfZmlsZSwgZGF0YS0+Y29udGVudHMsCisJCQkJICAgICBzaXplb2YoZGF0YS0+Y29udGVudHMpLCBOVUxMLCAwKSkgPiAwKQorCQkJb3Nfd3JpdGVfZmlsZShmZCwgZGF0YS0+Y29udGVudHMsIG4pOworCQllcnIgPSBvc19zaHV0ZG93bl9zb2NrZXQoZmQsIDAsIDEpOworCQlpZihlcnIpeworCQkJcHJpbnRrKCJocHBmc19nZXRfZGF0YSA6IGZhaWxlZCB0byBzaHV0IGRvd24gIgorCQkJICAgICAgICJzb2NrZXRcbiIpOworCQkJZ290byBmYWlsZWRfZnJlZTsKKwkJfQorCX0KKwl3aGlsZSgxKXsKKwkJbiA9IG9zX3JlYWRfZmlsZShmZCwgZGF0YS0+Y29udGVudHMsIHNpemVvZihkYXRhLT5jb250ZW50cykpOworCQlpZihuIDwgMCl7CisJCQllcnIgPSBuOworCQkJcHJpbnRrKCJocHBmc19nZXRfZGF0YSA6IHJlYWQgZmFpbGVkLCBlcnJubyA9ICVkXG4iLAorCQkJICAgICAgIGVycik7CisJCQlnb3RvIGZhaWxlZF9mcmVlOworCQl9CisJCWVsc2UgaWYobiA9PSAwKQorCQkJYnJlYWs7CisKKwkJKnNpemVfb3V0ICs9IG47CisKKwkJaWYobiA8IHNpemVvZihkYXRhLT5jb250ZW50cykpCisJCQlicmVhazsKKworCQluZXcgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOworCQlpZihuZXcgPT0gMCl7CisJCQlwcmludGsoImhwcGZzX2dldF9kYXRhIDogZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBmYWlsZWRfZnJlZTsKKwkJfQorCisJCUlOSVRfTElTVF9IRUFEKCZuZXctPmxpc3QpOworCQlsaXN0X2FkZCgmbmV3LT5saXN0LCAmZGF0YS0+bGlzdCk7CisJCWRhdGEgPSBuZXc7CisJfQorCXJldHVybihoZWFkKTsKKworIGZhaWxlZF9mcmVlOgorCWZyZWVfY29udGVudHMoaGVhZCk7CisgZmFpbGVkOgorCXJldHVybihFUlJfUFRSKGVycikpOworfQorCitzdGF0aWMgc3RydWN0IGhwcGZzX3ByaXZhdGUgKmhwcGZzX2RhdGEodm9pZCkKK3sKKwlzdHJ1Y3QgaHBwZnNfcHJpdmF0ZSAqZGF0YTsKKworCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOworCWlmKGRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuKGRhdGEpOworCisJKmRhdGEgPSAoKHN0cnVjdCBocHBmc19wcml2YXRlICkgeyAuaG9zdF9mZCAgCQk9IC0xLAorCQkJCQkgICAubGVuICAJCT0gLTEsCisJCQkJCSAgIC5jb250ZW50cyAJCT0gTlVMTCB9ICk7CisJcmV0dXJuKGRhdGEpOworfQorCitzdGF0aWMgaW50IGZpbGVfbW9kZShpbnQgZm1vZGUpCit7CisJaWYoZm1vZGUgPT0gKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSkpCisJCXJldHVybihPX1JEV1IpOworCWlmKGZtb2RlID09IEZNT0RFX1JFQUQpCisJCXJldHVybihPX1JET05MWSk7CisJaWYoZm1vZGUgPT0gRk1PREVfV1JJVEUpCisJCXJldHVybihPX1dST05MWSk7CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IGhwcGZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGhwcGZzX3ByaXZhdGUgKmRhdGE7CisJc3RydWN0IGRlbnRyeSAqcHJvY19kZW50cnk7CisJY2hhciAqaG9zdF9maWxlOworCWludCBlcnIsIGZkLCB0eXBlLCBmaWx0ZXI7CisKKwllcnIgPSAtRU5PTUVNOworCWRhdGEgPSBocHBmc19kYXRhKCk7CisJaWYoZGF0YSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWhvc3RfZmlsZSA9IGRlbnRyeV9uYW1lKGZpbGUtPmZfZGVudHJ5LCBzdHJsZW4oIi9ydyIpKTsKKwlpZihob3N0X2ZpbGUgPT0gTlVMTCkKKwkJZ290byBvdXRfZnJlZTI7CisKKwlwcm9jX2RlbnRyeSA9IEhQUEZTX0koaW5vZGUpLT5wcm9jX2RlbnRyeTsKKworCS8qIFhYWCBUaGlzIGlzbid0IGNsb3NlZCBhbnl3aGVyZSAqLworCWRhdGEtPnByb2NfZmlsZSA9IGRlbnRyeV9vcGVuKGRnZXQocHJvY19kZW50cnkpLCBOVUxMLAorCQkJCSAgICAgIGZpbGVfbW9kZShmaWxlLT5mX21vZGUpKTsKKwllcnIgPSBQVFJfRVJSKGRhdGEtPnByb2NfZmlsZSk7CisJaWYoSVNfRVJSKGRhdGEtPnByb2NfZmlsZSkpCisJCWdvdG8gb3V0X2ZyZWUxOworCisJdHlwZSA9IG9zX2ZpbGVfdHlwZShob3N0X2ZpbGUpOworCWlmKHR5cGUgPT0gT1NfVFlQRV9GSUxFKXsKKwkJZmQgPSBvc19vcGVuX2ZpbGUoaG9zdF9maWxlLCBvZl9yZWFkKE9QRU5GTEFHUygpKSwgMCk7CisJCWlmKGZkID49IDApCisJCQlkYXRhLT5ob3N0X2ZkID0gZmQ7CisJCWVsc2UgcHJpbnRrKCJocHBmc19vcGVuIDogZmFpbGVkIHRvIG9wZW4gJyVzJywgZXJybm8gPSAlZFxuIiwKKwkJCSAgICBob3N0X2ZpbGUsIC1mZCk7CisKKwkJZGF0YS0+Y29udGVudHMgPSBOVUxMOworCX0KKwllbHNlIGlmKHR5cGUgPT0gT1NfVFlQRV9ESVIpeworCQlmZCA9IG9wZW5faG9zdF9zb2NrKGhvc3RfZmlsZSwgJmZpbHRlcik7CisJCWlmKGZkID4gMCl7CisJCQlkYXRhLT5jb250ZW50cyA9IGhwcGZzX2dldF9kYXRhKGZkLCBmaWx0ZXIsCisJCQkJCQkJJmRhdGEtPnByb2NfZmlsZSwKKwkJCQkJCQlmaWxlLCAmZGF0YS0+bGVuKTsKKwkJCWlmKCFJU19FUlIoZGF0YS0+Y29udGVudHMpKQorCQkJCWRhdGEtPmhvc3RfZmQgPSBmZDsKKwkJfQorCQllbHNlIHByaW50aygiaHBwZnNfb3BlbiA6IGZhaWxlZCB0byBvcGVuIGEgc29ja2V0IGluICIKKwkJCSAgICAiJyVzJywgZXJybm8gPSAlZFxuIiwgaG9zdF9maWxlLCAtZmQpOworCX0KKwlrZnJlZShob3N0X2ZpbGUpOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZGF0YTsKKwlyZXR1cm4oMCk7CisKKyBvdXRfZnJlZTE6CisJa2ZyZWUoaG9zdF9maWxlKTsKKyBvdXRfZnJlZTI6CisJZnJlZV9jb250ZW50cyhkYXRhLT5jb250ZW50cyk7CisJa2ZyZWUoZGF0YSk7Cisgb3V0OgorCXJldHVybihlcnIpOworfQorCitzdGF0aWMgaW50IGhwcGZzX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBocHBmc19wcml2YXRlICpkYXRhOworCXN0cnVjdCBkZW50cnkgKnByb2NfZGVudHJ5OworCWludCBlcnI7CisKKwllcnIgPSAtRU5PTUVNOworCWRhdGEgPSBocHBmc19kYXRhKCk7CisJaWYoZGF0YSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCXByb2NfZGVudHJ5ID0gSFBQRlNfSShpbm9kZSktPnByb2NfZGVudHJ5OworCWRhdGEtPnByb2NfZmlsZSA9IGRlbnRyeV9vcGVuKGRnZXQocHJvY19kZW50cnkpLCBOVUxMLAorCQkJCSAgICAgIGZpbGVfbW9kZShmaWxlLT5mX21vZGUpKTsKKwllcnIgPSBQVFJfRVJSKGRhdGEtPnByb2NfZmlsZSk7CisJaWYoSVNfRVJSKGRhdGEtPnByb2NfZmlsZSkpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBkYXRhOworCXJldHVybigwKTsKKworIG91dF9mcmVlOgorCWtmcmVlKGRhdGEpOworIG91dDoKKwlyZXR1cm4oZXJyKTsKK30KKworc3RhdGljIGxvZmZfdCBocHBmc19sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmYsIGludCB3aGVyZSkKK3sKKwlzdHJ1Y3QgaHBwZnNfcHJpdmF0ZSAqZGF0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZmlsZSAqcHJvY19maWxlID0gJmRhdGEtPnByb2NfZmlsZTsKKwlsb2ZmX3QgKCpsbHNlZWspKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgaW50KTsKKwlsb2ZmX3QgcmV0OworCisJbGxzZWVrID0gcHJvY19maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9mb3AtPmxsc2VlazsKKwlpZihsbHNlZWsgIT0gTlVMTCl7CisJCXJldCA9ICgqbGxzZWVrKShwcm9jX2ZpbGUsIG9mZiwgd2hlcmUpOworCQlpZihyZXQgPCAwKQorCQkJcmV0dXJuKHJldCk7CisJfQorCisJcmV0dXJuKGRlZmF1bHRfbGxzZWVrKGZpbGUsIG9mZiwgd2hlcmUpKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaHBwZnNfZmlsZV9mb3BzID0geworCS5vd25lcgkJPSBOVUxMLAorCS5sbHNlZWsJCT0gaHBwZnNfbGxzZWVrLAorCS5yZWFkCQk9IGhwcGZzX3JlYWQsCisJLndyaXRlCQk9IGhwcGZzX3dyaXRlLAorCS5vcGVuCQk9IGhwcGZzX29wZW4sCit9OworCitzdHJ1Y3QgaHBwZnNfZGlyZW50IHsKKwl2b2lkICp2ZnNfZGlyZW50OworCWZpbGxkaXJfdCBmaWxsZGlyOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKK307CisKK3N0YXRpYyBpbnQgaHBwZnNfZmlsbGRpcih2b2lkICpkLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgc2l6ZSwKKwkJCSBsb2ZmX3Qgb2Zmc2V0LCBpbm9fdCBpbm9kZSwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJc3RydWN0IGhwcGZzX2RpcmVudCAqZGlyZW50ID0gZDsKKworCWlmKGZpbGVfcmVtb3ZlZChkaXJlbnQtPmRlbnRyeSwgbmFtZSkpCisJCXJldHVybigwKTsKKworCXJldHVybigoKmRpcmVudC0+ZmlsbGRpcikoZGlyZW50LT52ZnNfZGlyZW50LCBuYW1lLCBzaXplLCBvZmZzZXQsCisJCQkJICBpbm9kZSwgdHlwZSkpOworfQorCitzdGF0aWMgaW50IGhwcGZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGhwcGZzX3ByaXZhdGUgKmRhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGZpbGUgKnByb2NfZmlsZSA9ICZkYXRhLT5wcm9jX2ZpbGU7CisJaW50ICgqcmVhZGRpcikoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOworCXN0cnVjdCBocHBmc19kaXJlbnQgZGlyZW50ID0gKChzdHJ1Y3QgaHBwZnNfZGlyZW50KQorCQkgICAgICAgICAgICAgICAgICAgICAgeyAudmZzX2RpcmVudCAgCT0gZW50LAorCQkJCQkuZmlsbGRpciAJPSBmaWxsZGlyLAorCQkJCQkuZGVudHJ5ICAJPSBmaWxlLT5mX2RlbnRyeSB9ICk7CisJaW50IGVycjsKKworCXJlYWRkaXIgPSBwcm9jX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2ZvcC0+cmVhZGRpcjsKKworCXByb2NfZmlsZS0+Zl9wb3MgPSBmaWxlLT5mX3BvczsKKwllcnIgPSAoKnJlYWRkaXIpKHByb2NfZmlsZSwgJmRpcmVudCwgaHBwZnNfZmlsbGRpcik7CisJZmlsZS0+Zl9wb3MgPSBwcm9jX2ZpbGUtPmZfcG9zOworCisJcmV0dXJuKGVycik7Cit9CisKK3N0YXRpYyBpbnQgaHBwZnNfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKQoreworCXJldHVybigwKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaHBwZnNfZGlyX2ZvcHMgPSB7CisJLm93bmVyCQk9IE5VTEwsCisJLnJlYWRkaXIJPSBocHBmc19yZWFkZGlyLAorCS5vcGVuCQk9IGhwcGZzX2Rpcl9vcGVuLAorCS5mc3luYwkJPSBocHBmc19mc3luYywKK307CisKK3N0YXRpYyBpbnQgaHBwZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpzZikKK3sKKwlzZi0+Zl9ibG9ja3MgPSAwOworCXNmLT5mX2JmcmVlID0gMDsKKwlzZi0+Zl9iYXZhaWwgPSAwOworCXNmLT5mX2ZpbGVzID0gMDsKKwlzZi0+Zl9mZnJlZSA9IDA7CisJc2YtPmZfdHlwZSA9IEhQUEZTX1NVUEVSX01BR0lDOworCXJldHVybigwKTsKK30KKworc3RhdGljIHN0cnVjdCBpbm9kZSAqaHBwZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgaHBwZnNfaW5vZGVfaW5mbyAqaGk7CisKKwloaSA9IGttYWxsb2Moc2l6ZW9mKCpoaSksIEdGUF9LRVJORUwpOworCWlmKGhpID09IE5VTEwpCisJCXJldHVybihOVUxMKTsKKworCSpoaSA9ICgoc3RydWN0IGhwcGZzX2lub2RlX2luZm8pIHsgLnByb2NfZGVudHJ5CT0gTlVMTCB9KTsKKwlpbm9kZV9pbml0X29uY2UoJmhpLT52ZnNfaW5vZGUpOworCXJldHVybigmaGktPnZmc19pbm9kZSk7Cit9CisKK3ZvaWQgaHBwZnNfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vKQoreworCWNsZWFyX2lub2RlKGlubyk7Cit9CisKK3N0YXRpYyB2b2lkIGhwcGZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrZnJlZShIUFBGU19JKGlub2RlKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBocHBmc19zYm9wcyA9IHsKKwkuYWxsb2NfaW5vZGUJPSBocHBmc19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IGhwcGZzX2Rlc3Ryb3lfaW5vZGUsCisJLnJlYWRfaW5vZGUJPSBocHBmc19yZWFkX2lub2RlLAorCS5kZWxldGVfaW5vZGUJPSBocHBmc19kZWxldGVfaW5vZGUsCisJLnN0YXRmcwkJPSBocHBmc19zdGF0ZnMsCit9OworCitzdGF0aWMgaW50IGhwcGZzX3JlYWRsaW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmZmVyLCBpbnQgYnVmbGVuKQoreworCXN0cnVjdCBmaWxlICpwcm9jX2ZpbGU7CisJc3RydWN0IGRlbnRyeSAqcHJvY19kZW50cnk7CisJaW50ICgqcmVhZGxpbmspKHN0cnVjdCBkZW50cnkgKiwgY2hhciAqLCBpbnQpOworCWludCBlcnIsIG47CisKKwlwcm9jX2RlbnRyeSA9IEhQUEZTX0koZGVudHJ5LT5kX2lub2RlKS0+cHJvY19kZW50cnk7CisJcHJvY19maWxlID0gZGVudHJ5X29wZW4oZGdldChwcm9jX2RlbnRyeSksIE5VTEwsIE9fUkRPTkxZKTsKKwllcnIgPSBQVFJfRVJSKHByb2NfZGVudHJ5KTsKKwlpZihJU19FUlIocHJvY19kZW50cnkpKQorCQlyZXR1cm4oZXJyKTsKKworCXJlYWRsaW5rID0gcHJvY19kZW50cnktPmRfaW5vZGUtPmlfb3AtPnJlYWRsaW5rOworCW4gPSAoKnJlYWRsaW5rKShwcm9jX2RlbnRyeSwgYnVmZmVyLCBidWZsZW4pOworCisJZnB1dChwcm9jX2ZpbGUpOworCisJcmV0dXJuKG4pOworfQorCitzdGF0aWMgaW50IGhwcGZzX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGZpbGUgKnByb2NfZmlsZTsKKwlzdHJ1Y3QgZGVudHJ5ICpwcm9jX2RlbnRyeTsKKwlpbnQgKCpmb2xsb3dfbGluaykoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOworCWludCBlcnIsIG47CisKKwlwcm9jX2RlbnRyeSA9IEhQUEZTX0koZGVudHJ5LT5kX2lub2RlKS0+cHJvY19kZW50cnk7CisJcHJvY19maWxlID0gZGVudHJ5X29wZW4oZGdldChwcm9jX2RlbnRyeSksIE5VTEwsIE9fUkRPTkxZKTsKKwllcnIgPSBQVFJfRVJSKHByb2NfZGVudHJ5KTsKKwlpZihJU19FUlIocHJvY19kZW50cnkpKQorCQlyZXR1cm4oZXJyKTsKKworCWZvbGxvd19saW5rID0gcHJvY19kZW50cnktPmRfaW5vZGUtPmlfb3AtPmZvbGxvd19saW5rOworCW4gPSAoKmZvbGxvd19saW5rKShwcm9jX2RlbnRyeSwgbmQpOworCisJZnB1dChwcm9jX2ZpbGUpOworCisJcmV0dXJuKG4pOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaHBwZnNfZGlyX2lvcHMgPSB7CisJLmxvb2t1cAkJPSBocHBmc19sb29rdXAsCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaHBwZnNfbGlua19pb3BzID0geworCS5yZWFkbGluawk9IGhwcGZzX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawk9IGhwcGZzX2ZvbGxvd19saW5rLAorfTsKKworc3RhdGljIGludCBpbml0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpZihTX0lTRElSKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSl7CisJCWlub2RlLT5pX29wID0gJmhwcGZzX2Rpcl9pb3BzOworCQlpbm9kZS0+aV9mb3AgPSAmaHBwZnNfZGlyX2ZvcHM7CisJfQorCWVsc2UgaWYoU19JU0xOSyhkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpeworCQlpbm9kZS0+aV9vcCA9ICZocHBmc19saW5rX2lvcHM7CisJCWlub2RlLT5pX2ZvcCA9ICZocHBmc19maWxlX2ZvcHM7CisJfQorCWVsc2UgeworCQlpbm9kZS0+aV9vcCA9ICZocHBmc19maWxlX2lvcHM7CisJCWlub2RlLT5pX2ZvcCA9ICZocHBmc19maWxlX2ZvcHM7CisJfQorCisJSFBQRlNfSShpbm9kZSktPnByb2NfZGVudHJ5ID0gZGVudHJ5OworCisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IGhwcGZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZCwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGU7CisJc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnByb2NmczsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnByb2Nfc2I7CisJaW50IGVycjsKKworCWVyciA9IC1FTk9FTlQ7CisJcHJvY2ZzID0gZ2V0X2ZzX3R5cGUoInByb2MiKTsKKwlpZihwcm9jZnMgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlpZihsaXN0X2VtcHR5KCZwcm9jZnMtPmZzX3N1cGVycykpCisJCWdvdG8gb3V0OworCisJcHJvY19zYiA9IGxpc3RfZW50cnkocHJvY2ZzLT5mc19zdXBlcnMubmV4dCwgc3RydWN0IHN1cGVyX2Jsb2NrLAorCQkJICAgICBzX2luc3RhbmNlcyk7CisKKwlzYi0+c19ibG9ja3NpemUgPSAxMDI0OworCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gMTA7CisJc2ItPnNfbWFnaWMgPSBIUFBGU19TVVBFUl9NQUdJQzsKKwlzYi0+c19vcCA9ICZocHBmc19zYm9wczsKKworCXJvb3RfaW5vZGUgPSBpZ2V0KHNiLCAwKTsKKwlpZihyb290X2lub2RlID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJZXJyID0gaW5pdF9pbm9kZShyb290X2lub2RlLCBwcm9jX3NiLT5zX3Jvb3QpOworCWlmKGVycikKKwkJZ290byBvdXRfcHV0OworCisJZXJyID0gLUVOT01FTTsKKwlzYi0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOworCWlmKHNiLT5zX3Jvb3QgPT0gTlVMTCkKKwkJZ290byBvdXRfcHV0OworCisJaHBwZnNfcmVhZF9pbm9kZShyb290X2lub2RlKTsKKworCXJldHVybigwKTsKKworIG91dF9wdXQ6CisJaXB1dChyb290X2lub2RlKTsKKyBvdXQ6CisJcmV0dXJuKGVycik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmhwcGZzX3JlYWRfc3VwZXIoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnR5cGUsCisJCQkJCSAgICAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCQkJICAgICB2b2lkICpkYXRhKQoreworCXJldHVybihnZXRfc2Jfbm9kZXYodHlwZSwgZmxhZ3MsIGRhdGEsIGhwcGZzX2ZpbGxfc3VwZXIpKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGhwcGZzX3R5cGUgPSB7CisJLm93bmVyIAkJPSBUSElTX01PRFVMRSwKKwkubmFtZSAJCT0gImhwcGZzIiwKKwkuZ2V0X3NiIAk9IGhwcGZzX3JlYWRfc3VwZXIsCisJLmtpbGxfc2IJPSBraWxsX2Fub25fc3VwZXIsCisJLmZzX2ZsYWdzIAk9IDAsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2hwcGZzKHZvaWQpCit7CisJcmV0dXJuKHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmhwcGZzX3R5cGUpKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfaHBwZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmhwcGZzX3R5cGUpOworfQorCittb2R1bGVfaW5pdChpbml0X2hwcGZzKQorbW9kdWxlX2V4aXQoZXhpdF9ocHBmcykKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgorICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5CisgKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCisgKiBvZiB0aGUgZmlsZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1maWxlLXN0eWxlOiAibGludXgiCisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2ZzL2h1Z2V0bGJmcy9NYWtlZmlsZSBiL2ZzL2h1Z2V0bGJmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWRmODcwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaHVnZXRsYmZzL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IHJhbWZzIHJvdXRpbmVzLgorIworCitvYmotJChDT05GSUdfSFVHRVRMQkZTKSArPSBodWdldGxiZnMubworCitodWdldGxiZnMtb2JqcyA6PSBpbm9kZS5vCmRpZmYgLS1naXQgYS9mcy9odWdldGxiZnMvaW5vZGUuYyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZjMzMzgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9odWdldGxiZnMvaW5vZGUuYwpAQCAtMCwwICsxLDg1MyBAQAorLyoKKyAqIGh1Z2V0bGJwYWdlLWJhY2tlZCBmaWxlc3lzdGVtLiAgQmFzZWQgb24gcmFtZnMuCisgKgorICogV2lsbGlhbSBJcndpbiwgMjAwMgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBMaW51cyBUb3J2YWxkcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CQkvKiByZW1vdmUgQVNBUCAqLworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZXZlYy5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Rub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogc29tZSByYW5kb20gbnVtYmVyICovCisjZGVmaW5lIEhVR0VUTEJGU19NQUdJQwkweDk1ODQ1OGY2CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBodWdldGxiZnNfb3BzOworc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgaHVnZXRsYmZzX2FvcHM7CitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGh1Z2V0bGJmc19maWxlX29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaHVnZXRsYmZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGh1Z2V0bGJmc19pbm9kZV9vcGVyYXRpb25zOworCitzdGF0aWMgc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gaHVnZXRsYmZzX2JhY2tpbmdfZGV2X2luZm8gPSB7CisJLnJhX3BhZ2VzCT0gMCwJLyogTm8gcmVhZGFoZWFkICovCisJLmNhcGFiaWxpdGllcwk9IEJESV9DQVBfTk9fQUNDVF9ESVJUWSB8IEJESV9DQVBfTk9fV1JJVEVCQUNLLAorfTsKKworaW50IHN5c2N0bF9odWdldGxiX3NobV9ncm91cDsKKworc3RhdGljIGludCBodWdldGxiZnNfZmlsZV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCWxvZmZfdCBsZW4sIHZtYV9sZW47CisJaW50IHJldDsKKworCWlmICgodm1hLT52bV9mbGFncyAmIChWTV9NQVlTSEFSRSB8IFZNX1dSSVRFKSkgPT0gVk1fV1JJVEUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZtYS0+dm1fcGdvZmYgJiAoSFBBR0VfU0laRSAvIFBBR0VfU0laRSAtIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh2bWEtPnZtX3N0YXJ0ICYgfkhQQUdFX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZtYS0+dm1fZW5kICYgfkhQQUdFX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCA8IEhQQUdFX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJdm1hX2xlbiA9IChsb2ZmX3QpKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCk7CisKKwlkb3duKCZpbm9kZS0+aV9zZW0pOworCWZpbGVfYWNjZXNzZWQoZmlsZSk7CisJdm1hLT52bV9mbGFncyB8PSBWTV9IVUdFVExCIHwgVk1fUkVTRVJWRUQ7CisJdm1hLT52bV9vcHMgPSAmaHVnZXRsYl92bV9vcHM7CisKKwlyZXQgPSAtRU5PTUVNOworCWxlbiA9IHZtYV9sZW4gKyAoKGxvZmZfdCl2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQpOworCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgJiYgbGVuID4gaW5vZGUtPmlfc2l6ZSkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBodWdldGxiX3ByZWZhdWx0KG1hcHBpbmcsIHZtYSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAoaW5vZGUtPmlfc2l6ZSA8IGxlbikKKwkJaW5vZGUtPmlfc2l6ZSA9IGxlbjsKK291dDoKKwl1cCgmaW5vZGUtPmlfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDYWxsZWQgdW5kZXIgZG93bl93cml0ZShtbWFwX3NlbSksIHBhZ2VfdGFibGVfbG9jayBpcyBub3QgaGVsZAorICovCisKKyNpZmRlZiBIQVZFX0FSQ0hfSFVHRVRMQl9VTk1BUFBFRF9BUkVBCit1bnNpZ25lZCBsb25nIGh1Z2V0bGJfZ2V0X3VubWFwcGVkX2FyZWEoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgcGdvZmYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitodWdldGxiX2dldF91bm1hcHBlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHBnb2ZmLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyOworCisJaWYgKGxlbiAmIH5IUEFHRV9NQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobGVuID4gVEFTS19TSVpFKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChhZGRyKSB7CisJCWFkZHIgPSBBTElHTihhZGRyLCBIUEFHRV9TSVpFKTsKKwkJdm1hID0gZmluZF92bWEobW0sIGFkZHIpOworCQlpZiAoVEFTS19TSVpFIC0gbGVuID49IGFkZHIgJiYKKwkJICAgICghdm1hIHx8IGFkZHIgKyBsZW4gPD0gdm1hLT52bV9zdGFydCkpCisJCQlyZXR1cm4gYWRkcjsKKwl9CisKKwlzdGFydF9hZGRyID0gbW0tPmZyZWVfYXJlYV9jYWNoZTsKKworZnVsbF9zZWFyY2g6CisJYWRkciA9IEFMSUdOKHN0YXJ0X2FkZHIsIEhQQUdFX1NJWkUpOworCisJZm9yICh2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcik7IDsgdm1hID0gdm1hLT52bV9uZXh0KSB7CisJCS8qIEF0IHRoaXMgcG9pbnQ6ICAoIXZtYSB8fCBhZGRyIDwgdm1hLT52bV9lbmQpLiAqLworCQlpZiAoVEFTS19TSVpFIC0gbGVuIDwgYWRkcikgeworCQkJLyoKKwkJCSAqIFN0YXJ0IGEgbmV3IHNlYXJjaCAtIGp1c3QgaW4gY2FzZSB3ZSBtaXNzZWQKKwkJCSAqIHNvbWUgaG9sZXMuCisJCQkgKi8KKwkJCWlmIChzdGFydF9hZGRyICE9IFRBU0tfVU5NQVBQRURfQkFTRSkgeworCQkJCXN0YXJ0X2FkZHIgPSBUQVNLX1VOTUFQUEVEX0JBU0U7CisJCQkJZ290byBmdWxsX3NlYXJjaDsKKwkJCX0KKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJaWYgKCF2bWEgfHwgYWRkciArIGxlbiA8PSB2bWEtPnZtX3N0YXJ0KQorCQkJcmV0dXJuIGFkZHI7CisJCWFkZHIgPSBBTElHTih2bWEtPnZtX2VuZCwgSFBBR0VfU0laRSk7CisJfQorfQorI2VuZGlmCisKKy8qCisgKiBSZWFkIGEgcGFnZS4gQWdhaW4gdHJpdmlhbC4gSWYgaXQgZGlkbid0IGFscmVhZHkgZXhpc3QKKyAqIGluIHRoZSBwYWdlIGNhY2hlLCBpdCBpcyB6ZXJvLWZpbGxlZC4KKyAqLworc3RhdGljIGludCBodWdldGxiZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICogcGFnZSkKK3sKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBodWdldGxiZnNfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIHRvKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGh1Z2V0bGJmc19jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCB0bykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgaHVnZV9wYWdldmVjX3JlbGVhc2Uoc3RydWN0IHBhZ2V2ZWMgKnB2ZWMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXZlY19jb3VudChwdmVjKTsgKytpKQorCQlwdXRfcGFnZShwdmVjLT5wYWdlc1tpXSk7CisKKwlwYWdldmVjX3JlaW5pdChwdmVjKTsKK30KKworc3RhdGljIHZvaWQgdHJ1bmNhdGVfaHVnZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCWNsZWFyX3BhZ2VfZGlydHkocGFnZSk7CisJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CisJcmVtb3ZlX2Zyb21fcGFnZV9jYWNoZShwYWdlKTsKKwlwdXRfcGFnZShwYWdlKTsKK30KKworc3RhdGljIHZvaWQgdHJ1bmNhdGVfaHVnZXBhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBsb2ZmX3QgbHN0YXJ0KQoreworCWNvbnN0IHBnb2ZmX3Qgc3RhcnQgPSBsc3RhcnQgPj4gSFBBR0VfU0hJRlQ7CisJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKKwlwZ29mZl90IG5leHQ7CisJaW50IGk7CisKKwlwYWdldmVjX2luaXQoJnB2ZWMsIDApOworCW5leHQgPSBzdGFydDsKKwl3aGlsZSAoMSkgeworCQlpZiAoIXBhZ2V2ZWNfbG9va3VwKCZwdmVjLCBtYXBwaW5nLCBuZXh0LCBQQUdFVkVDX1NJWkUpKSB7CisJCQlpZiAobmV4dCA9PSBzdGFydCkKKwkJCQlicmVhazsKKwkJCW5leHQgPSBzdGFydDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IHBhZ2V2ZWNfY291bnQoJnB2ZWMpOyArK2kpIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gcHZlYy5wYWdlc1tpXTsKKworCQkJbG9ja19wYWdlKHBhZ2UpOworCQkJaWYgKHBhZ2UtPmluZGV4ID4gbmV4dCkKKwkJCQluZXh0ID0gcGFnZS0+aW5kZXg7CisJCQkrK25leHQ7CisJCQl0cnVuY2F0ZV9odWdlX3BhZ2UocGFnZSk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCWh1Z2V0bGJfcHV0X3F1b3RhKG1hcHBpbmcpOworCQl9CisJCWh1Z2VfcGFnZXZlY19yZWxlYXNlKCZwdmVjKTsKKwl9CisJQlVHX09OKCFsc3RhcnQgJiYgbWFwcGluZy0+bnJwYWdlcyk7Cit9CisKK3N0YXRpYyB2b2lkIGh1Z2V0bGJmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgaHVnZXRsYmZzX3NiX2luZm8gKnNiaW5mbyA9IEhVR0VUTEJGU19TQihpbm9kZS0+aV9zYik7CisKKwlobGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfaGFzaCk7CisJbGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfbGlzdCk7CisJbGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfc2JfbGlzdCk7CisJaW5vZGUtPmlfc3RhdGUgfD0gSV9GUkVFSU5HOworCWlub2Rlc19zdGF0Lm5yX2lub2Rlcy0tOworCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKworCWlmIChpbm9kZS0+aV9kYXRhLm5ycGFnZXMpCisJCXRydW5jYXRlX2h1Z2VwYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CisKKwlzZWN1cml0eV9pbm9kZV9kZWxldGUoaW5vZGUpOworCisJaWYgKHNiaW5mby0+ZnJlZV9pbm9kZXMgPj0gMCkgeworCQlzcGluX2xvY2soJnNiaW5mby0+c3RhdF9sb2NrKTsKKwkJc2JpbmZvLT5mcmVlX2lub2RlcysrOworCQlzcGluX3VubG9jaygmc2JpbmZvLT5zdGF0X2xvY2spOworCX0KKworCWNsZWFyX2lub2RlKGlub2RlKTsKKwlkZXN0cm95X2lub2RlKGlub2RlKTsKK30KKworc3RhdGljIHZvaWQgaHVnZXRsYmZzX2ZvcmdldF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc3VwZXJfYmxvY2sgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgaHVnZXRsYmZzX3NiX2luZm8gKnNiaW5mbyA9IEhVR0VUTEJGU19TQihzdXBlcl9ibG9jayk7CisKKwlpZiAoaGxpc3RfdW5oYXNoZWQoJmlub2RlLT5pX2hhc2gpKQorCQlnb3RvIG91dF90cnVuY2F0ZTsKKworCWlmICghKGlub2RlLT5pX3N0YXRlICYgKElfRElSVFl8SV9MT0NLKSkpIHsKKwkJbGlzdF9kZWwoJmlub2RlLT5pX2xpc3QpOworCQlsaXN0X2FkZCgmaW5vZGUtPmlfbGlzdCwgJmlub2RlX3VudXNlZCk7CisJfQorCWlub2Rlc19zdGF0Lm5yX3VudXNlZCsrOworCWlmICghc3VwZXJfYmxvY2sgfHwgKHN1cGVyX2Jsb2NrLT5zX2ZsYWdzICYgTVNfQUNUSVZFKSkgeworCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisJCXJldHVybjsKKwl9CisKKwkvKiB3cml0ZV9pbm9kZV9ub3coKSA/ICovCisJaW5vZGVzX3N0YXQubnJfdW51c2VkLS07CisJaGxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2hhc2gpOworb3V0X3RydW5jYXRlOgorCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2xpc3QpOworCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX3NiX2xpc3QpOworCWlub2RlLT5pX3N0YXRlIHw9IElfRlJFRUlORzsKKwlpbm9kZXNfc3RhdC5ucl9pbm9kZXMtLTsKKwlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisJaWYgKGlub2RlLT5pX2RhdGEubnJwYWdlcykKKwkJdHJ1bmNhdGVfaHVnZXBhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKKworCWlmIChzYmluZm8tPmZyZWVfaW5vZGVzID49IDApIHsKKwkJc3Bpbl9sb2NrKCZzYmluZm8tPnN0YXRfbG9jayk7CisJCXNiaW5mby0+ZnJlZV9pbm9kZXMrKzsKKwkJc3Bpbl91bmxvY2soJnNiaW5mby0+c3RhdF9sb2NrKTsKKwl9CisKKwljbGVhcl9pbm9kZShpbm9kZSk7CisJZGVzdHJveV9pbm9kZShpbm9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGh1Z2V0bGJmc19kcm9wX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKCFpbm9kZS0+aV9ubGluaykKKwkJaHVnZXRsYmZzX2RlbGV0ZV9pbm9kZShpbm9kZSk7CisJZWxzZQorCQlodWdldGxiZnNfZm9yZ2V0X2lub2RlKGlub2RlKTsKK30KKworLyoKKyAqIGhfcGdvZmYgaXMgaW4gSFBBR0VfU0laRSB1bml0cy4KKyAqIHZtYS0+dm1fcGdvZmYgaXMgaW4gUEFHRV9TSVpFIHVuaXRzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2h1Z2V0bGJfdm10cnVuY2F0ZV9saXN0KHN0cnVjdCBwcmlvX3RyZWVfcm9vdCAqcm9vdCwgdW5zaWduZWQgbG9uZyBoX3Bnb2ZmKQoreworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXN0cnVjdCBwcmlvX3RyZWVfaXRlciBpdGVyOworCisJdm1hX3ByaW9fdHJlZV9mb3JlYWNoKHZtYSwgJml0ZXIsIHJvb3QsIGhfcGdvZmYsIFVMT05HX01BWCkgeworCQl1bnNpZ25lZCBsb25nIGhfdm1fcGdvZmY7CisJCXVuc2lnbmVkIGxvbmcgdl9sZW5ndGg7CisJCXVuc2lnbmVkIGxvbmcgdl9vZmZzZXQ7CisKKwkJaF92bV9wZ29mZiA9IHZtYS0+dm1fcGdvZmYgPj4gKEhQQUdFX1NISUZUIC0gUEFHRV9TSElGVCk7CisJCXZfb2Zmc2V0ID0gKGhfcGdvZmYgLSBoX3ZtX3Bnb2ZmKSA8PCBIUEFHRV9TSElGVDsKKwkJLyoKKwkJICogSXMgdGhpcyBWTUEgZnVsbHkgb3V0c2lkZSB0aGUgdHJ1bmNhdGlvbiBwb2ludD8KKwkJICovCisJCWlmIChoX3ZtX3Bnb2ZmID49IGhfcGdvZmYpCisJCQl2X29mZnNldCA9IDA7CisKKwkJdl9sZW5ndGggPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisKKwkJemFwX2h1Z2VwYWdlX3JhbmdlKHZtYSwKKwkJCQl2bWEtPnZtX3N0YXJ0ICsgdl9vZmZzZXQsCisJCQkJdl9sZW5ndGggLSB2X29mZnNldCk7CisJfQorfQorCisvKgorICogRXhwYW5kaW5nIHRydW5jYXRlcyBhcmUgbm90IGFsbG93ZWQuCisgKi8KK3N0YXRpYyBpbnQgaHVnZXRsYl92bXRydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBvZmZzZXQpCit7CisJdW5zaWduZWQgbG9uZyBwZ29mZjsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisKKwlpZiAob2Zmc2V0ID4gaW5vZGUtPmlfc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlCVUdfT04ob2Zmc2V0ICYgfkhQQUdFX01BU0spOworCXBnb2ZmID0gb2Zmc2V0ID4+IEhQQUdFX1NISUZUOworCisJaW5vZGUtPmlfc2l6ZSA9IG9mZnNldDsKKwlzcGluX2xvY2soJm1hcHBpbmctPmlfbW1hcF9sb2NrKTsKKwlpZiAoIXByaW9fdHJlZV9lbXB0eSgmbWFwcGluZy0+aV9tbWFwKSkKKwkJaHVnZXRsYl92bXRydW5jYXRlX2xpc3QoJm1hcHBpbmctPmlfbW1hcCwgcGdvZmYpOworCXNwaW5fdW5sb2NrKCZtYXBwaW5nLT5pX21tYXBfbG9jayk7CisJdHJ1bmNhdGVfaHVnZXBhZ2VzKG1hcHBpbmcsIG9mZnNldCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHVnZXRsYmZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyb3I7CisJdW5zaWduZWQgaW50IGlhX3ZhbGlkID0gYXR0ci0+aWFfdmFsaWQ7CisKKwlCVUdfT04oIWlub2RlKTsKKworCWVycm9yID0gaW5vZGVfY2hhbmdlX29rKGlub2RlLCBhdHRyKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJaWYgKGlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJaWYgKCEoYXR0ci0+aWFfc2l6ZSAmIH5IUEFHRV9NQVNLKSkKKwkJCWVycm9yID0gaHVnZXRsYl92bXRydW5jYXRlKGlub2RlLCBhdHRyLT5pYV9zaXplKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJCWF0dHItPmlhX3ZhbGlkICY9IH5BVFRSX1NJWkU7CisJfQorCWVycm9yID0gaW5vZGVfc2V0YXR0cihpbm9kZSwgYXR0cik7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlICpodWdldGxiZnNfZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVpZF90IHVpZCwgCisJCQkJCWdpZF90IGdpZCwgaW50IG1vZGUsIGRldl90IGRldikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBodWdldGxiZnNfc2JfaW5mbyAqc2JpbmZvID0gSFVHRVRMQkZTX1NCKHNiKTsKKworCWlmIChzYmluZm8tPmZyZWVfaW5vZGVzID49IDApIHsKKwkJc3Bpbl9sb2NrKCZzYmluZm8tPnN0YXRfbG9jayk7CisJCWlmICghc2JpbmZvLT5mcmVlX2lub2RlcykgeworCQkJc3Bpbl91bmxvY2soJnNiaW5mby0+c3RhdF9sb2NrKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXNiaW5mby0+ZnJlZV9pbm9kZXMtLTsKKwkJc3Bpbl91bmxvY2soJnNiaW5mby0+c3RhdF9sb2NrKTsKKwl9CisKKwlpbm9kZSA9IG5ld19pbm9kZShzYik7CisJaWYgKGlub2RlKSB7CisJCXN0cnVjdCBodWdldGxiZnNfaW5vZGVfaW5mbyAqaW5mbzsKKwkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCWlub2RlLT5pX3VpZCA9IHVpZDsKKwkJaW5vZGUtPmlfZ2lkID0gZ2lkOworCQlpbm9kZS0+aV9ibGtzaXplID0gSFBBR0VfU0laRTsKKwkJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmaHVnZXRsYmZzX2FvcHM7CisJCWlub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSZodWdldGxiZnNfYmFja2luZ19kZXZfaW5mbzsKKwkJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCQlpbmZvID0gSFVHRVRMQkZTX0koaW5vZGUpOworCQltcG9sX3NoYXJlZF9wb2xpY3lfaW5pdCgmaW5mby0+cG9saWN5KTsKKwkJc3dpdGNoIChtb2RlICYgU19JRk1UKSB7CisJCWRlZmF1bHQ6CisJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIG1vZGUsIGRldik7CisJCQlicmVhazsKKwkJY2FzZSBTX0lGUkVHOgorCQkJaW5vZGUtPmlfb3AgPSAmaHVnZXRsYmZzX2lub2RlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9mb3AgPSAmaHVnZXRsYmZzX2ZpbGVfb3BlcmF0aW9uczsKKwkJCWJyZWFrOworCQljYXNlIFNfSUZESVI6CisJCQlpbm9kZS0+aV9vcCA9ICZodWdldGxiZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOworCisJCQkvKiBkaXJlY3RvcnkgaW5vZGVzIHN0YXJ0IG9mZiB3aXRoIGlfbmxpbmsgPT0gMiAoZm9yICIuIiBlbnRyeSkgKi8KKwkJCWlub2RlLT5pX25saW5rKys7CisJCQlicmVhazsKKwkJY2FzZSBTX0lGTE5LOgorCQkJaW5vZGUtPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gaW5vZGU7Cit9CisKKy8qCisgKiBGaWxlIGNyZWF0aW9uLiBBbGxvY2F0ZSBhbiBpbm9kZSwgYW5kIHdlJ3JlIGRvbmUuLgorICovCitzdGF0aWMgaW50IGh1Z2V0bGJmc19ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIGRldl90IGRldikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnJvciA9IC1FTk9TUEM7CisJZ2lkX3QgZ2lkOworCisJaWYgKGRpci0+aV9tb2RlICYgU19JU0dJRCkgeworCQlnaWQgPSBkaXItPmlfZ2lkOworCQlpZiAoU19JU0RJUihtb2RlKSkKKwkJCW1vZGUgfD0gU19JU0dJRDsKKwl9IGVsc2UgeworCQlnaWQgPSBjdXJyZW50LT5mc2dpZDsKKwl9CisJaW5vZGUgPSBodWdldGxiZnNfZ2V0X2lub2RlKGRpci0+aV9zYiwgY3VycmVudC0+ZnN1aWQsIGdpZCwgbW9kZSwgZGV2KTsKKwlpZiAoaW5vZGUpIHsKKwkJZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOworCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCQlkZ2V0KGRlbnRyeSk7CS8qIEV4dHJhIGNvdW50IC0gcGluIHRoZSBkZW50cnkgaW4gY29yZSAqLworCQllcnJvciA9IDA7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBodWdldGxiZnNfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJaW50IHJldHZhbCA9IGh1Z2V0bGJmc19ta25vZChkaXIsIGRlbnRyeSwgbW9kZSB8IFNfSUZESVIsIDApOworCWlmICghcmV0dmFsKQorCQlkaXItPmlfbmxpbmsrKzsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGh1Z2V0bGJmc19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXJldHVybiBodWdldGxiZnNfbWtub2QoZGlyLCBkZW50cnksIG1vZGUgfCBTX0lGUkVHLCAwKTsKK30KKworc3RhdGljIGludCBodWdldGxiZnNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqc3ltbmFtZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnJvciA9IC1FTk9TUEM7CisJZ2lkX3QgZ2lkOworCisJaWYgKGRpci0+aV9tb2RlICYgU19JU0dJRCkKKwkJZ2lkID0gZGlyLT5pX2dpZDsKKwllbHNlCisJCWdpZCA9IGN1cnJlbnQtPmZzZ2lkOworCisJaW5vZGUgPSBodWdldGxiZnNfZ2V0X2lub2RlKGRpci0+aV9zYiwgY3VycmVudC0+ZnN1aWQsCisJCQkJCWdpZCwgU19JRkxOS3xTX0lSV1hVR08sIDApOworCWlmIChpbm9kZSkgeworCQlpbnQgbCA9IHN0cmxlbihzeW1uYW1lKSsxOworCQllcnJvciA9IHBhZ2Vfc3ltbGluayhpbm9kZSwgc3ltbmFtZSwgbCk7CisJCWlmICghZXJyb3IpIHsKKwkJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJCQlkZ2V0KGRlbnRyeSk7CisJCX0gZWxzZQorCQkJaXB1dChpbm9kZSk7CisJfQorCWRpci0+aV9jdGltZSA9IGRpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKKworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEZvciBkaXJlY3QtSU8gcmVhZHMgaW50byBodWdldGxiIHBhZ2VzCisgKi8KK3N0YXRpYyBpbnQgaHVnZXRsYmZzX3NldF9wYWdlX2RpcnR5KHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh1Z2V0bGJmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlzdHJ1Y3QgaHVnZXRsYmZzX3NiX2luZm8gKnNiaW5mbyA9IEhVR0VUTEJGU19TQihzYik7CisKKwlidWYtPmZfdHlwZSA9IEhVR0VUTEJGU19NQUdJQzsKKwlidWYtPmZfYnNpemUgPSBIUEFHRV9TSVpFOworCWlmIChzYmluZm8pIHsKKwkJc3Bpbl9sb2NrKCZzYmluZm8tPnN0YXRfbG9jayk7CisJCWJ1Zi0+Zl9ibG9ja3MgPSBzYmluZm8tPm1heF9ibG9ja3M7CisJCWJ1Zi0+Zl9iYXZhaWwgPSBidWYtPmZfYmZyZWUgPSBzYmluZm8tPmZyZWVfYmxvY2tzOworCQlidWYtPmZfZmlsZXMgPSBzYmluZm8tPm1heF9pbm9kZXM7CisJCWJ1Zi0+Zl9mZnJlZSA9IHNiaW5mby0+ZnJlZV9pbm9kZXM7CisJCXNwaW5fdW5sb2NrKCZzYmluZm8tPnN0YXRfbG9jayk7CisJfQorCWJ1Zi0+Zl9uYW1lbGVuID0gTkFNRV9NQVg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGh1Z2V0bGJmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgaHVnZXRsYmZzX3NiX2luZm8gKnNiaSA9IEhVR0VUTEJGU19TQihzYik7CisKKwlpZiAoc2JpKSB7CisJCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCQlrZnJlZShzYmkpOworCX0KK30KKworc3RhdGljIGttZW1fY2FjaGVfdCAqaHVnZXRsYmZzX2lub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqaHVnZXRsYmZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGh1Z2V0bGJmc19pbm9kZV9pbmZvICpwOworCisJcCA9IGttZW1fY2FjaGVfYWxsb2MoaHVnZXRsYmZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghcCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZwLT52ZnNfaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28sIGttZW1fY2FjaGVfdCAqY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBodWdldGxiZnNfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IGh1Z2V0bGJmc19pbm9kZV9pbmZvICopZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikKKwkJaW5vZGVfaW5pdF9vbmNlKCZlaS0+dmZzX2lub2RlKTsKK30KKworc3RhdGljIHZvaWQgaHVnZXRsYmZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwltcG9sX2ZyZWVfc2hhcmVkX3BvbGljeSgmSFVHRVRMQkZTX0koaW5vZGUpLT5wb2xpY3kpOworCWttZW1fY2FjaGVfZnJlZShodWdldGxiZnNfaW5vZGVfY2FjaGVwLCBIVUdFVExCRlNfSShpbm9kZSkpOworfQorCitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBodWdldGxiZnNfYW9wcyA9IHsKKwkucmVhZHBhZ2UJPSBodWdldGxiZnNfcmVhZHBhZ2UsCisJLnByZXBhcmVfd3JpdGUJPSBodWdldGxiZnNfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gaHVnZXRsYmZzX2NvbW1pdF93cml0ZSwKKwkuc2V0X3BhZ2VfZGlydHkJPSBodWdldGxiZnNfc2V0X3BhZ2VfZGlydHksCit9OworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGh1Z2V0bGJmc19maWxlX29wZXJhdGlvbnMgPSB7CisJLm1tYXAJCQk9IGh1Z2V0bGJmc19maWxlX21tYXAsCisJLmZzeW5jCQkJPSBzaW1wbGVfc3luY19maWxlLAorCS5nZXRfdW5tYXBwZWRfYXJlYQk9IGh1Z2V0bGJfZ2V0X3VubWFwcGVkX2FyZWEsCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaHVnZXRsYmZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0geworCS5jcmVhdGUJCT0gaHVnZXRsYmZzX2NyZWF0ZSwKKwkubG9va3VwCQk9IHNpbXBsZV9sb29rdXAsCisJLmxpbmsJCT0gc2ltcGxlX2xpbmssCisJLnVubGluawkJPSBzaW1wbGVfdW5saW5rLAorCS5zeW1saW5rCT0gaHVnZXRsYmZzX3N5bWxpbmssCisJLm1rZGlyCQk9IGh1Z2V0bGJmc19ta2RpciwKKwkucm1kaXIJCT0gc2ltcGxlX3JtZGlyLAorCS5ta25vZAkJPSBodWdldGxiZnNfbWtub2QsCisJLnJlbmFtZQkJPSBzaW1wbGVfcmVuYW1lLAorCS5zZXRhdHRyCT0gaHVnZXRsYmZzX3NldGF0dHIsCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaHVnZXRsYmZzX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnNldGF0dHIJPSBodWdldGxiZnNfc2V0YXR0ciwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBodWdldGxiZnNfb3BzID0geworCS5hbGxvY19pbm9kZSAgICA9IGh1Z2V0bGJmc19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZSAgPSBodWdldGxiZnNfZGVzdHJveV9pbm9kZSwKKwkuc3RhdGZzCQk9IGh1Z2V0bGJmc19zdGF0ZnMsCisJLmRyb3BfaW5vZGUJPSBodWdldGxiZnNfZHJvcF9pbm9kZSwKKwkucHV0X3N1cGVyCT0gaHVnZXRsYmZzX3B1dF9zdXBlciwKK307CisKK3N0YXRpYyBpbnQKK2h1Z2V0bGJmc19wYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIHN0cnVjdCBodWdldGxiZnNfY29uZmlnICpwY29uZmlnKQoreworCWNoYXIgKm9wdCwgKnZhbHVlLCAqcmVzdDsKKworCWlmICghb3B0aW9ucykKKwkJcmV0dXJuIDA7CisJd2hpbGUgKChvcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJaWYgKCEqb3B0KQorCQkJY29udGludWU7CisKKwkJdmFsdWUgPSBzdHJjaHIob3B0LCAnPScpOworCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZWxzZQorCQkJKnZhbHVlKysgPSAnXDAnOworCisJCWlmICghc3RyY21wKG9wdCwgInVpZCIpKQorCQkJcGNvbmZpZy0+dWlkID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZ2YWx1ZSwgMCk7CisJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAiZ2lkIikpCisJCQlwY29uZmlnLT5naWQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgJnZhbHVlLCAwKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJtb2RlIikpCisJCQlwY29uZmlnLT5tb2RlID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsJnZhbHVlLDApICYgMDc3N1U7CisJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAic2l6ZSIpKSB7CisJCQl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSA9IG1lbXBhcnNlKHZhbHVlLCAmcmVzdCk7CisJCQlpZiAoKnJlc3QgPT0gJyUnKSB7CisJCQkJc2l6ZSA8PD0gSFBBR0VfU0hJRlQ7CisJCQkJc2l6ZSAqPSBtYXhfaHVnZV9wYWdlczsKKwkJCQlkb19kaXYoc2l6ZSwgMTAwKTsKKwkJCQlyZXN0Kys7CisJCQl9CisJCQlzaXplICY9IEhQQUdFX01BU0s7CisJCQlwY29uZmlnLT5ucl9ibG9ja3MgPSAoc2l6ZSA+PiBIUEFHRV9TSElGVCk7CisJCQl2YWx1ZSA9IHJlc3Q7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsIm5yX2lub2RlcyIpKSB7CisJCQlwY29uZmlnLT5ucl9pbm9kZXMgPSBtZW1wYXJzZSh2YWx1ZSwgJnJlc3QpOworCQkJdmFsdWUgPSByZXN0OworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICgqdmFsdWUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2h1Z2V0bGJmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqIHJvb3Q7CisJaW50IHJldDsKKwlzdHJ1Y3QgaHVnZXRsYmZzX2NvbmZpZyBjb25maWc7CisJc3RydWN0IGh1Z2V0bGJmc19zYl9pbmZvICpzYmluZm87CisKKwljb25maWcubnJfYmxvY2tzID0gLTE7IC8qIE5vIGxpbWl0IG9uIHNpemUgYnkgZGVmYXVsdCAqLworCWNvbmZpZy5ucl9pbm9kZXMgPSAtMTsgLyogTm8gbGltaXQgb24gbnVtYmVyIG9mIGlub2RlcyBieSBkZWZhdWx0ICovCisJY29uZmlnLnVpZCA9IGN1cnJlbnQtPmZzdWlkOworCWNvbmZpZy5naWQgPSBjdXJyZW50LT5mc2dpZDsKKwljb25maWcubW9kZSA9IDA3NTU7CisJcmV0ID0gaHVnZXRsYmZzX3BhcnNlX29wdGlvbnMoZGF0YSwgJmNvbmZpZyk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc2JpbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGh1Z2V0bGJmc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmluZm8pCisJCXJldHVybiAtRU5PTUVNOworCXNiLT5zX2ZzX2luZm8gPSBzYmluZm87CisJc3Bpbl9sb2NrX2luaXQoJnNiaW5mby0+c3RhdF9sb2NrKTsKKwlzYmluZm8tPm1heF9ibG9ja3MgPSBjb25maWcubnJfYmxvY2tzOworCXNiaW5mby0+ZnJlZV9ibG9ja3MgPSBjb25maWcubnJfYmxvY2tzOworCXNiaW5mby0+bWF4X2lub2RlcyA9IGNvbmZpZy5ucl9pbm9kZXM7CisJc2JpbmZvLT5mcmVlX2lub2RlcyA9IGNvbmZpZy5ucl9pbm9kZXM7CisJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOworCXNiLT5zX2Jsb2Nrc2l6ZSA9IEhQQUdFX1NJWkU7CisJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBIUEFHRV9TSElGVDsKKwlzYi0+c19tYWdpYyA9IEhVR0VUTEJGU19NQUdJQzsKKwlzYi0+c19vcCA9ICZodWdldGxiZnNfb3BzOworCXNiLT5zX3RpbWVfZ3JhbiA9IDE7CisJaW5vZGUgPSBodWdldGxiZnNfZ2V0X2lub2RlKHNiLCBjb25maWcudWlkLCBjb25maWcuZ2lkLAorCQkJCQlTX0lGRElSIHwgY29uZmlnLm1vZGUsIDApOworCWlmICghaW5vZGUpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlyb290ID0gZF9hbGxvY19yb290KGlub2RlKTsKKwlpZiAoIXJvb3QpIHsKKwkJaXB1dChpbm9kZSk7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCXNiLT5zX3Jvb3QgPSByb290OworCXJldHVybiAwOworb3V0X2ZyZWU6CisJa2ZyZWUoc2JpbmZvKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworaW50IGh1Z2V0bGJfZ2V0X3F1b3RhKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBodWdldGxiZnNfc2JfaW5mbyAqc2JpbmZvID0gSFVHRVRMQkZTX1NCKG1hcHBpbmctPmhvc3QtPmlfc2IpOworCisJaWYgKHNiaW5mby0+ZnJlZV9ibG9ja3MgPiAtMSkgeworCQlzcGluX2xvY2soJnNiaW5mby0+c3RhdF9sb2NrKTsKKwkJaWYgKHNiaW5mby0+ZnJlZV9ibG9ja3MgPiAwKQorCQkJc2JpbmZvLT5mcmVlX2Jsb2Nrcy0tOworCQllbHNlCisJCQlyZXQgPSAtRU5PTUVNOworCQlzcGluX3VubG9jaygmc2JpbmZvLT5zdGF0X2xvY2spOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgaHVnZXRsYl9wdXRfcXVvdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpCit7CisJc3RydWN0IGh1Z2V0bGJmc19zYl9pbmZvICpzYmluZm8gPSBIVUdFVExCRlNfU0IobWFwcGluZy0+aG9zdC0+aV9zYik7CisKKwlpZiAoc2JpbmZvLT5mcmVlX2Jsb2NrcyA+IC0xKSB7CisJCXNwaW5fbG9jaygmc2JpbmZvLT5zdGF0X2xvY2spOworCQlzYmluZm8tPmZyZWVfYmxvY2tzKys7CisJCXNwaW5fdW5sb2NrKCZzYmluZm8tPnN0YXRfbG9jayk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpodWdldGxiZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgZGF0YSwgaHVnZXRsYmZzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgaHVnZXRsYmZzX2ZzX3R5cGUgPSB7CisJLm5hbWUJCT0gImh1Z2V0bGJmcyIsCisJLmdldF9zYgkJPSBodWdldGxiZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9saXR0ZXJfc3VwZXIsCit9OworCitzdGF0aWMgc3RydWN0IHZmc21vdW50ICpodWdldGxiZnNfdmZzbW91bnQ7CisKKy8qCisgKiBSZXR1cm4gdGhlIG5leHQgaWRlbnRpZmllciBmb3IgYSBzaG0gZmlsZQorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBodWdldGxiZnNfY291bnRlcih2b2lkKQoreworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgY291bnRlcjsKKwl1bnNpZ25lZCBsb25nIHJldDsKKworCXNwaW5fbG9jaygmbG9jayk7CisJcmV0ID0gKytjb3VudGVyOworCXNwaW5fdW5sb2NrKCZsb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNhbl9kb19odWdldGxiX3NobSh2b2lkKQoreworCXJldHVybiBsaWtlbHkoY2FwYWJsZShDQVBfSVBDX0xPQ0spIHx8CisJCQlpbl9ncm91cF9wKHN5c2N0bF9odWdldGxiX3NobV9ncm91cCkgfHwKKwkJCWNhbl9kb19tbG9jaygpKTsKK30KKworc3RydWN0IGZpbGUgKmh1Z2V0bGJfemVyb19zZXR1cChzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgZXJyb3IgPSAtRU5PTUVNOworCXN0cnVjdCBmaWxlICpmaWxlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCAqcm9vdDsKKwlzdHJ1Y3QgcXN0ciBxdWlja19zdHJpbmc7CisJY2hhciBidWZbMTZdOworCisJaWYgKCFjYW5fZG9faHVnZXRsYl9zaG0oKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVQRVJNKTsKKworCWlmICghaXNfaHVnZXBhZ2VfbWVtX2Vub3VnaChzaXplKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAoIXVzZXJfc2htX2xvY2soc2l6ZSwgY3VycmVudC0+dXNlcikpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJcm9vdCA9IGh1Z2V0bGJmc192ZnNtb3VudC0+bW50X3Jvb3Q7CisJc25wcmludGYoYnVmLCAxNiwgIiVsdSIsIGh1Z2V0bGJmc19jb3VudGVyKCkpOworCXF1aWNrX3N0cmluZy5uYW1lID0gYnVmOworCXF1aWNrX3N0cmluZy5sZW4gPSBzdHJsZW4ocXVpY2tfc3RyaW5nLm5hbWUpOworCXF1aWNrX3N0cmluZy5oYXNoID0gMDsKKwlkZW50cnkgPSBkX2FsbG9jKHJvb3QsICZxdWlja19zdHJpbmcpOworCWlmICghZGVudHJ5KQorCQlnb3RvIG91dF9zaG1fdW5sb2NrOworCisJZXJyb3IgPSAtRU5GSUxFOworCWZpbGUgPSBnZXRfZW1wdHlfZmlscCgpOworCWlmICghZmlsZSkKKwkJZ290byBvdXRfZGVudHJ5OworCisJZXJyb3IgPSAtRU5PU1BDOworCWlub2RlID0gaHVnZXRsYmZzX2dldF9pbm9kZShyb290LT5kX3NiLCBjdXJyZW50LT5mc3VpZCwKKwkJCQljdXJyZW50LT5mc2dpZCwgU19JRlJFRyB8IFNfSVJXWFVHTywgMCk7CisJaWYgKCFpbm9kZSkKKwkJZ290byBvdXRfZmlsZTsKKworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJaW5vZGUtPmlfc2l6ZSA9IHNpemU7CisJaW5vZGUtPmlfbmxpbmsgPSAwOworCWZpbGUtPmZfdmZzbW50ID0gbW50Z2V0KGh1Z2V0bGJmc192ZnNtb3VudCk7CisJZmlsZS0+Zl9kZW50cnkgPSBkZW50cnk7CisJZmlsZS0+Zl9tYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlmaWxlLT5mX29wID0gJmh1Z2V0bGJmc19maWxlX29wZXJhdGlvbnM7CisJZmlsZS0+Zl9tb2RlID0gRk1PREVfV1JJVEUgfCBGTU9ERV9SRUFEOworCXJldHVybiBmaWxlOworCitvdXRfZmlsZToKKwlwdXRfZmlscChmaWxlKTsKK291dF9kZW50cnk6CisJZHB1dChkZW50cnkpOworb3V0X3NobV91bmxvY2s6CisJdXNlcl9zaG1fdW5sb2NrKHNpemUsIGN1cnJlbnQtPnVzZXIpOworCXJldHVybiBFUlJfUFRSKGVycm9yKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9odWdldGxiZnNfZnModm9pZCkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IHZmc21vdW50ICp2ZnNtb3VudDsKKworCWh1Z2V0bGJmc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaHVnZXRsYmZzX2lub2RlX2NhY2hlIiwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBodWdldGxiZnNfaW5vZGVfaW5mbyksCisJCQkJCTAsIDAsIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKGh1Z2V0bGJmc19pbm9kZV9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnJvciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmh1Z2V0bGJmc19mc190eXBlKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJdmZzbW91bnQgPSBrZXJuX21vdW50KCZodWdldGxiZnNfZnNfdHlwZSk7CisKKwlpZiAoIUlTX0VSUih2ZnNtb3VudCkpIHsKKwkJaHVnZXRsYmZzX3Zmc21vdW50ID0gdmZzbW91bnQ7CisJCXJldHVybiAwOworCX0KKworCWVycm9yID0gUFRSX0VSUih2ZnNtb3VudCk7CisKKyBvdXQ6CisJaWYgKGVycm9yKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3koaHVnZXRsYmZzX2lub2RlX2NhY2hlcCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9odWdldGxiZnNfZnModm9pZCkKK3sKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koaHVnZXRsYmZzX2lub2RlX2NhY2hlcCk7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZodWdldGxiZnNfZnNfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfaHVnZXRsYmZzX2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9odWdldGxiZnNfZnMpCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL2lub2RlLmMgYi9mcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOGZkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9pbm9kZS5jCkBAIC0wLDAgKzEsMTM3NyBAQAorLyoKKyAqIGxpbnV4L2ZzL2lub2RlLmMKKyAqCisgKiAoQykgMTk5NyBMaW51cyBUb3J2YWxkcworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKworLyoKKyAqIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKyAqICAtIGlub2RlX2hhc19idWZmZXJzCisgKiAgLSBpbnZhbGlkYXRlX2lub2RlX2J1ZmZlcnMKKyAqICAtIGZzeW5jX2JkZXYKKyAqICAtIGludmFsaWRhdGVfYmRldgorICoKKyAqIEZJWE1FOiByZW1vdmUgYWxsIGtub3dsZWRnZSBvZiB0aGUgYnVmZmVyIGxheWVyIGZyb20gdGhpcyBmaWxlCisgKi8KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisvKgorICogTmV3IGlub2RlLmMgaW1wbGVtZW50YXRpb24uCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIGJhc2ljIHByZW1pc2Ugb2YgdHJ5aW5nCisgKiB0byBiZSBleHRyZW1lbHkgbG93LW92ZXJoZWFkIGFuZCBTTVAtc2FmZSwgeWV0IGJlCisgKiBzaW1wbGUgZW5vdWdoIHRvIGJlICJvYnZpb3VzbHkgY29ycmVjdCIuCisgKgorICogRmFtb3VzIGxhc3Qgd29yZHMuCisgKi8KKworLyogaW5vZGUgZHluYW1pYyBhbGxvY2F0aW9uIDE5OTksIEFuZHJlYSBBcmNhbmdlbGkgPGFuZHJlYUBzdXNlLmRlPiAqLworCisvKiAjZGVmaW5lIElOT0RFX1BBUkFOT0lBIDEgKi8KKy8qICNkZWZpbmUgSU5PREVfREVCVUcgMSAqLworCisvKgorICogSW5vZGUgbG9va3VwIGlzIG5vIGxvbmdlciBhcyBjcml0aWNhbCBhcyBpdCB1c2VkIHRvIGJlOgorICogbW9zdCBvZiB0aGUgbG9va3VwcyBhcmUgZ29pbmcgdG8gYmUgdGhyb3VnaCB0aGUgZGNhY2hlLgorICovCisjZGVmaW5lIElfSEFTSEJJVFMJaV9oYXNoX3NoaWZ0CisjZGVmaW5lIElfSEFTSE1BU0sJaV9oYXNoX21hc2sKKworc3RhdGljIHVuc2lnbmVkIGludCBpX2hhc2hfbWFzazsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaV9oYXNoX3NoaWZ0OworCisvKgorICogRWFjaCBpbm9kZSBjYW4gYmUgb24gdHdvIHNlcGFyYXRlIGxpc3RzLiBPbmUgaXMKKyAqIHRoZSBoYXNoIGxpc3Qgb2YgdGhlIGlub2RlLCB1c2VkIGZvciBsb29rdXBzLiBUaGUKKyAqIG90aGVyIGxpbmtlZCBsaXN0IGlzIHRoZSAidHlwZSIgbGlzdDoKKyAqICAiaW5fdXNlIiAtIHZhbGlkIGlub2RlLCBpX2NvdW50ID4gMCwgaV9ubGluayA+IDAKKyAqICAiZGlydHkiICAtIGFzICJpbl91c2UiIGJ1dCBhbHNvIGRpcnR5CisgKiAgInVudXNlZCIgLSB2YWxpZCBpbm9kZSwgaV9jb3VudCA9IDAKKyAqCisgKiBBICJkaXJ0eSIgbGlzdCBpcyBtYWludGFpbmVkIGZvciBlYWNoIHN1cGVyIGJsb2NrLAorICogYWxsb3dpbmcgZm9yIGxvdy1vdmVyaGVhZCBpbm9kZSBzeW5jKCkgb3BlcmF0aW9ucy4KKyAqLworCitMSVNUX0hFQUQoaW5vZGVfaW5fdXNlKTsKK0xJU1RfSEVBRChpbm9kZV91bnVzZWQpOworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICppbm9kZV9oYXNodGFibGU7CisKKy8qCisgKiBBIHNpbXBsZSBzcGlubG9jayB0byBwcm90ZWN0IHRoZSBsaXN0IG1hbmlwdWxhdGlvbnMuCisgKgorICogTk9URSEgWW91IGFsc28gaGF2ZSB0byBvd24gdGhlIGxvY2sgaWYgeW91IGNoYW5nZQorICogdGhlIGlfc3RhdGUgb2YgYW4gaW5vZGUgd2hpbGUgaXQgaXMgaW4gdXNlLi4KKyAqLworREVGSU5FX1NQSU5MT0NLKGlub2RlX2xvY2spOworCisvKgorICogaXBydW5lX3NlbSBwcm92aWRlcyBleGNsdXNpb24gYmV0d2VlbiB0aGUga3N3YXBkIG9yIHRyeV90b19mcmVlX3BhZ2VzCisgKiBpY2FjaGUgc2hyaW5raW5nIHBhdGgsIGFuZCB0aGUgdW1vdW50IHBhdGguICBXaXRob3V0IHRoaXMgZXhjbHVzaW9uLAorICogYnkgdGhlIHRpbWUgcHJ1bmVfaWNhY2hlIGNhbGxzIGlwdXQgZm9yIHRoZSBpbm9kZSB3aG9zZSBwYWdlcyBpdCBoYXMKKyAqIGJlZW4gaW52YWxpZGF0aW5nLCBvciBieSB0aGUgdGltZSBpdCBjYWxscyBjbGVhcl9pbm9kZSAmIGRlc3Ryb3lfaW5vZGUKKyAqIGZyb20gaXRzIGZpbmFsIGRpc3Bvc2VfbGlzdCwgdGhlIHN0cnVjdCBzdXBlcl9ibG9jayB0aGV5IHJlZmVyIHRvCisgKiAoZm9yIGlub2RlLT5pX3NiLT5zX29wKSBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gZnJlZWQgYW5kIHJldXNlZC4KKyAqLworREVDTEFSRV9NVVRFWChpcHJ1bmVfc2VtKTsKKworLyoKKyAqIFN0YXRpc3RpY3MgZ2F0aGVyaW5nLi4KKyAqLworc3RydWN0IGlub2Rlc19zdGF0X3QgaW5vZGVzX3N0YXQ7CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKiBpbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZW1wdHlfYW9wczsKKwlzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZW1wdHlfaW9wczsKKwlzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlbXB0eV9mb3BzOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlpZiAoc2ItPnNfb3AtPmFsbG9jX2lub2RlKQorCQlpbm9kZSA9IHNiLT5zX29wLT5hbGxvY19pbm9kZShzYik7CisJZWxzZQorCQlpbm9kZSA9IChzdHJ1Y3QgaW5vZGUgKikga21lbV9jYWNoZV9hbGxvYyhpbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKworCWlmIChpbm9kZSkgeworCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqIGNvbnN0IG1hcHBpbmcgPSAmaW5vZGUtPmlfZGF0YTsKKworCQlpbm9kZS0+aV9zYiA9IHNiOworCQlpbm9kZS0+aV9ibGtiaXRzID0gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCWlub2RlLT5pX2ZsYWdzID0gMDsKKwkJYXRvbWljX3NldCgmaW5vZGUtPmlfY291bnQsIDEpOworCQlpbm9kZS0+aV9vcCA9ICZlbXB0eV9pb3BzOworCQlpbm9kZS0+aV9mb3AgPSAmZW1wdHlfZm9wczsKKwkJaW5vZGUtPmlfbmxpbmsgPSAxOworCQlhdG9taWNfc2V0KCZpbm9kZS0+aV93cml0ZWNvdW50LCAwKTsKKwkJaW5vZGUtPmlfc2l6ZSA9IDA7CisJCWlub2RlLT5pX2Jsb2NrcyA9IDA7CisJCWlub2RlLT5pX2J5dGVzID0gMDsKKwkJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IDA7CisjaWZkZWYgQ09ORklHX1FVT1RBCisJCW1lbXNldCgmaW5vZGUtPmlfZHF1b3QsIDAsIHNpemVvZihpbm9kZS0+aV9kcXVvdCkpOworI2VuZGlmCisJCWlub2RlLT5pX3BpcGUgPSBOVUxMOworCQlpbm9kZS0+aV9iZGV2ID0gTlVMTDsKKwkJaW5vZGUtPmlfY2RldiA9IE5VTEw7CisJCWlub2RlLT5pX3JkZXYgPSAwOworCQlpbm9kZS0+aV9zZWN1cml0eSA9IE5VTEw7CisJCWlub2RlLT5kaXJ0aWVkX3doZW4gPSAwOworCQlpZiAoc2VjdXJpdHlfaW5vZGVfYWxsb2MoaW5vZGUpKSB7CisJCQlpZiAoaW5vZGUtPmlfc2ItPnNfb3AtPmRlc3Ryb3lfaW5vZGUpCisJCQkJaW5vZGUtPmlfc2ItPnNfb3AtPmRlc3Ryb3lfaW5vZGUoaW5vZGUpOworCQkJZWxzZQorCQkJCWttZW1fY2FjaGVfZnJlZShpbm9kZV9jYWNoZXAsIChpbm9kZSkpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltYXBwaW5nLT5hX29wcyA9ICZlbXB0eV9hb3BzOworIAkJbWFwcGluZy0+aG9zdCA9IGlub2RlOworCQltYXBwaW5nLT5mbGFncyA9IDA7CisJCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG1hcHBpbmcsIEdGUF9ISUdIVVNFUik7CisJCW1hcHBpbmctPmFzc29jX21hcHBpbmcgPSBOVUxMOworCQltYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJmRlZmF1bHRfYmFja2luZ19kZXZfaW5mbzsKKworCQkvKgorCQkgKiBJZiB0aGUgYmxvY2tfZGV2aWNlIHByb3ZpZGVzIGEgYmFja2luZ19kZXZfaW5mbyBmb3IgY2xpZW50CisJCSAqIGlub2RlcyB0aGVuIHVzZSB0aGF0LiAgT3RoZXJ3aXNlIHRoZSBpbm9kZSBzaGFyZSB0aGUgYmRldidzCisJCSAqIGJhY2tpbmdfZGV2X2luZm8uCisJCSAqLworCQlpZiAoc2ItPnNfYmRldikgeworCQkJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaTsKKworCQkJYmRpID0gc2ItPnNfYmRldi0+YmRfaW5vZGVfYmFja2luZ19kZXZfaW5mbzsKKwkJCWlmICghYmRpKQorCQkJCWJkaSA9IHNiLT5zX2JkZXYtPmJkX2lub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87CisJCQltYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gYmRpOworCQl9CisJCW1lbXNldCgmaW5vZGUtPnUsIDAsIHNpemVvZihpbm9kZS0+dSkpOworCQlpbm9kZS0+aV9tYXBwaW5nID0gbWFwcGluZzsKKwl9CisJcmV0dXJuIGlub2RlOworfQorCit2b2lkIGRlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkgCit7CisJaWYgKGlub2RlX2hhc19idWZmZXJzKGlub2RlKSkKKwkJQlVHKCk7CisJc2VjdXJpdHlfaW5vZGVfZnJlZShpbm9kZSk7CisJaWYgKGlub2RlLT5pX3NiLT5zX29wLT5kZXN0cm95X2lub2RlKQorCQlpbm9kZS0+aV9zYi0+c19vcC0+ZGVzdHJveV9pbm9kZShpbm9kZSk7CisJZWxzZQorCQlrbWVtX2NhY2hlX2ZyZWUoaW5vZGVfY2FjaGVwLCAoaW5vZGUpKTsKK30KKworCisvKgorICogVGhlc2UgYXJlIGluaXRpYWxpemF0aW9ucyB0aGF0IG9ubHkgbmVlZCB0byBiZSBkb25lCisgKiBvbmNlLCBiZWNhdXNlIHRoZSBmaWVsZHMgYXJlIGlkZW1wb3RlbnQgYWNyb3NzIHVzZQorICogb2YgdGhlIGlub2RlLCBzbyBsZXQgdGhlIHNsYWIgYXdhcmUgb2YgdGhhdC4KKyAqLwordm9pZCBpbm9kZV9pbml0X29uY2Uoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwltZW1zZXQoaW5vZGUsIDAsIHNpemVvZigqaW5vZGUpKTsKKwlJTklUX0hMSVNUX05PREUoJmlub2RlLT5pX2hhc2gpOworCUlOSVRfTElTVF9IRUFEKCZpbm9kZS0+aV9kZW50cnkpOworCUlOSVRfTElTVF9IRUFEKCZpbm9kZS0+aV9kZXZpY2VzKTsKKwlzZW1hX2luaXQoJmlub2RlLT5pX3NlbSwgMSk7CisJaW5pdF9yd3NlbSgmaW5vZGUtPmlfYWxsb2Nfc2VtKTsKKwlJTklUX1JBRElYX1RSRUUoJmlub2RlLT5pX2RhdGEucGFnZV90cmVlLCBHRlBfQVRPTUlDKTsKKwlyd2xvY2tfaW5pdCgmaW5vZGUtPmlfZGF0YS50cmVlX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZpbm9kZS0+aV9kYXRhLmlfbW1hcF9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmaW5vZGUtPmlfZGF0YS5wcml2YXRlX2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZpbm9kZS0+aV9kYXRhLnByaXZhdGVfbG9jayk7CisJSU5JVF9SQVdfUFJJT19UUkVFX1JPT1QoJmlub2RlLT5pX2RhdGEuaV9tbWFwKTsKKwlJTklUX0xJU1RfSEVBRCgmaW5vZGUtPmlfZGF0YS5pX21tYXBfbm9ubGluZWFyKTsKKwlzcGluX2xvY2tfaW5pdCgmaW5vZGUtPmlfbG9jayk7CisJaV9zaXplX29yZGVyZWRfaW5pdChpbm9kZSk7Cit9CisKK0VYUE9SVF9TWU1CT0woaW5vZGVfaW5pdF9vbmNlKTsKKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IChzdHJ1Y3QgaW5vZGUgKikgZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikKKwkJaW5vZGVfaW5pdF9vbmNlKGlub2RlKTsKK30KKworLyoKKyAqIGlub2RlX2xvY2sgbXVzdCBiZSBoZWxkCisgKi8KK3ZvaWQgX19pZ2V0KHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCWlmIChhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpKSB7CisJCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKKwkJcmV0dXJuOworCX0KKwlhdG9taWNfaW5jKCZpbm9kZS0+aV9jb3VudCk7CisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiAoSV9ESVJUWXxJX0xPQ0spKSkKKwkJbGlzdF9tb3ZlKCZpbm9kZS0+aV9saXN0LCAmaW5vZGVfaW5fdXNlKTsKKwlpbm9kZXNfc3RhdC5ucl91bnVzZWQtLTsKK30KKworLyoqCisgKiBjbGVhcl9pbm9kZSAtIGNsZWFyIGFuIGlub2RlCisgKiBAaW5vZGU6IGlub2RlIHRvIGNsZWFyCisgKgorICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGZpbGVzeXN0ZW0gdG8gdGVsbCB1cworICogdGhhdCB0aGUgaW5vZGUgaXMgbm8gbG9uZ2VyIHVzZWZ1bC4gV2UganVzdAorICogdGVybWluYXRlIGl0IHdpdGggZXh0cmVtZSBwcmVqdWRpY2UuCisgKi8KK3ZvaWQgY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwltaWdodF9zbGVlcCgpOworCWludmFsaWRhdGVfaW5vZGVfYnVmZmVycyhpbm9kZSk7CisgICAgICAgCisJaWYgKGlub2RlLT5pX2RhdGEubnJwYWdlcykKKwkJQlVHKCk7CisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX0ZSRUVJTkcpKQorCQlCVUcoKTsKKwlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX0NMRUFSKQorCQlCVUcoKTsKKwl3YWl0X29uX2lub2RlKGlub2RlKTsKKwlEUVVPVF9EUk9QKGlub2RlKTsKKwlpZiAoaW5vZGUtPmlfc2IgJiYgaW5vZGUtPmlfc2ItPnNfb3AtPmNsZWFyX2lub2RlKQorCQlpbm9kZS0+aV9zYi0+c19vcC0+Y2xlYXJfaW5vZGUoaW5vZGUpOworCWlmIChpbm9kZS0+aV9iZGV2KQorCQliZF9mb3JnZXQoaW5vZGUpOworCWlmIChpbm9kZS0+aV9jZGV2KQorCQljZF9mb3JnZXQoaW5vZGUpOworCWlub2RlLT5pX3N0YXRlID0gSV9DTEVBUjsKK30KKworRVhQT1JUX1NZTUJPTChjbGVhcl9pbm9kZSk7CisKKy8qCisgKiBkaXNwb3NlX2xpc3QgLSBkaXNwb3NlIG9mIHRoZSBjb250ZW50cyBvZiBhIGxvY2FsIGxpc3QKKyAqIEBoZWFkOiB0aGUgaGVhZCBvZiB0aGUgbGlzdCB0byBmcmVlCisgKgorICogRGlzcG9zZS1saXN0IGdldHMgYSBsb2NhbCBsaXN0IHdpdGggbG9jYWwgaW5vZGVzIGluIGl0LCBzbyBpdCBkb2Vzbid0CisgKiBuZWVkIHRvIHdvcnJ5IGFib3V0IGxpc3QgY29ycnVwdGlvbiBhbmQgU01QIGxvY2tzLgorICovCitzdGF0aWMgdm9pZCBkaXNwb3NlX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlpbnQgbnJfZGlzcG9zZWQgPSAwOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KGhlYWQpKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwkJaW5vZGUgPSBsaXN0X2VudHJ5KGhlYWQtPm5leHQsIHN0cnVjdCBpbm9kZSwgaV9saXN0KTsKKwkJbGlzdF9kZWwoJmlub2RlLT5pX2xpc3QpOworCisJCWlmIChpbm9kZS0+aV9kYXRhLm5ycGFnZXMpCisJCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CisJCWNsZWFyX2lub2RlKGlub2RlKTsKKwkJZGVzdHJveV9pbm9kZShpbm9kZSk7CisJCW5yX2Rpc3Bvc2VkKys7CisJfQorCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJaW5vZGVzX3N0YXQubnJfaW5vZGVzIC09IG5yX2Rpc3Bvc2VkOworCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKK30KKworLyoKKyAqIEludmFsaWRhdGUgYWxsIGlub2RlcyBmb3IgYSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgaW52YWxpZGF0ZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBsaXN0X2hlYWQgKmRpc3Bvc2UpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dDsKKwlpbnQgYnVzeSA9IDAsIGNvdW50ID0gMDsKKworCW5leHQgPSBoZWFkLT5uZXh0OworCWZvciAoOzspIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqIHRtcCA9IG5leHQ7CisJCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCisJCS8qCisJCSAqIFdlIGNhbiByZXNjaGVkdWxlIGhlcmUgd2l0aG91dCB3b3JyeWluZyBhYm91dCB0aGUgbGlzdCdzCisJCSAqIGNvbnNpc3RlbmN5IGJlY2F1c2UgdGhlIHBlci1zYiBsaXN0IG9mIGlub2RlcyBtdXN0IG5vdAorCQkgKiBjaGFuZ2UgZHVyaW5nIHVtb3VudCBhbnltb3JlLCBhbmQgYmVjYXVzZSBpcHJ1bmVfc2VtIGtlZXBzCisJCSAqIHNocmlua19pY2FjaGVfbWVtb3J5KCkgYXdheS4KKwkJICovCisJCWNvbmRfcmVzY2hlZF9sb2NrKCZpbm9kZV9sb2NrKTsKKworCQluZXh0ID0gbmV4dC0+bmV4dDsKKwkJaWYgKHRtcCA9PSBoZWFkKQorCQkJYnJlYWs7CisJCWlub2RlID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBpbm9kZSwgaV9zYl9saXN0KTsKKwkJaW52YWxpZGF0ZV9pbm9kZV9idWZmZXJzKGlub2RlKTsKKwkJaWYgKCFhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpKSB7CisJCQlobGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfaGFzaCk7CisJCQlsaXN0X2RlbCgmaW5vZGUtPmlfc2JfbGlzdCk7CisJCQlsaXN0X21vdmUoJmlub2RlLT5pX2xpc3QsIGRpc3Bvc2UpOworCQkJaW5vZGUtPmlfc3RhdGUgfD0gSV9GUkVFSU5HOworCQkJY291bnQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJ1c3kgPSAxOworCX0KKwkvKiBvbmx5IHVudXNlZCBpbm9kZXMgbWF5IGJlIGNhY2hlZCB3aXRoIGlfY291bnQgemVybyAqLworCWlub2Rlc19zdGF0Lm5yX3VudXNlZCAtPSBjb3VudDsKKwlyZXR1cm4gYnVzeTsKK30KKworLyoKKyAqIFRoaXMgaXMgYSB0d28tc3RhZ2UgcHJvY2Vzcy4gRmlyc3Qgd2UgY29sbGVjdCBhbGwKKyAqIG9mZmVuZGluZyBpbm9kZXMgb250byB0aGUgdGhyb3ctYXdheSBsaXN0LCBhbmQgaW4KKyAqIHRoZSBzZWNvbmQgc3RhZ2Ugd2UgYWN0dWFsbHkgZGlzcG9zZSBvZiB0aGVtLiBUaGlzCisgKiBpcyBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gc2xlZXAgd2hpbGUgbWVzc2luZworICogd2l0aCB0aGUgZ2xvYmFsIGxpc3RzLi4KKyAqLworIAorLyoqCisgKglpbnZhbGlkYXRlX2lub2RlcwktIGRpc2NhcmQgdGhlIGlub2RlcyBvbiBhIGRldmljZQorICoJQHNiOiBzdXBlcmJsb2NrCisgKgorICoJRGlzY2FyZCBhbGwgb2YgdGhlIGlub2RlcyBmb3IgYSBnaXZlbiBzdXBlcmJsb2NrLiBJZiB0aGUgZGlzY2FyZAorICoJZmFpbHMgYmVjYXVzZSB0aGVyZSBhcmUgYnVzeSBpbm9kZXMgdGhlbiBhIG5vbiB6ZXJvIHZhbHVlIGlzIHJldHVybmVkLgorICoJSWYgdGhlIGRpc2NhcmQgaXMgc3VjY2Vzc2Z1bCBhbGwgdGhlIGlub2RlcyBoYXZlIGJlZW4gZGlzY2FyZGVkLgorICovCitpbnQgaW52YWxpZGF0ZV9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJaW50IGJ1c3k7CisJTElTVF9IRUFEKHRocm93X2F3YXkpOworCisJZG93bigmaXBydW5lX3NlbSk7CisJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwlidXN5ID0gaW52YWxpZGF0ZV9saXN0KCZzYi0+c19pbm9kZXMsICZ0aHJvd19hd2F5KTsKKwlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisKKwlkaXNwb3NlX2xpc3QoJnRocm93X2F3YXkpOworCXVwKCZpcHJ1bmVfc2VtKTsKKworCXJldHVybiBidXN5OworfQorCitFWFBPUlRfU1lNQk9MKGludmFsaWRhdGVfaW5vZGVzKTsKKyAKK2ludCBfX2ludmFsaWRhdGVfZGV2aWNlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGludCBkb19zeW5jKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJaW50IHJlczsKKworCWlmIChkb19zeW5jKQorCQlmc3luY19iZGV2KGJkZXYpOworCisJcmVzID0gMDsKKwlzYiA9IGdldF9zdXBlcihiZGV2KTsKKwlpZiAoc2IpIHsKKwkJLyoKKwkJICogbm8gbmVlZCB0byBsb2NrIHRoZSBzdXBlciwgZ2V0X3N1cGVyIGhvbGRzIHRoZQorCQkgKiByZWFkIHNlbWFwaG9yZSBzbyB0aGUgZmlsZXN5c3RlbSBjYW5ub3QgZ28gYXdheQorCQkgKiB1bmRlciB1cyAoLT5wdXRfc3VwZXIgcnVucyB3aXRoIHRoZSB3cml0ZSBsb2NrCisJCSAqIGhvbGQpLgorCQkgKi8KKwkJc2hyaW5rX2RjYWNoZV9zYihzYik7CisJCXJlcyA9IGludmFsaWRhdGVfaW5vZGVzKHNiKTsKKwkJZHJvcF9zdXBlcihzYik7CisJfQorCWludmFsaWRhdGVfYmRldihiZGV2LCAwKTsKKwlyZXR1cm4gcmVzOworfQorCitFWFBPUlRfU1lNQk9MKF9faW52YWxpZGF0ZV9kZXZpY2UpOworCitzdGF0aWMgaW50IGNhbl91bnVzZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmIChpbm9kZS0+aV9zdGF0ZSkKKwkJcmV0dXJuIDA7CisJaWYgKGlub2RlX2hhc19idWZmZXJzKGlub2RlKSkKKwkJcmV0dXJuIDA7CisJaWYgKGF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkpCisJCXJldHVybiAwOworCWlmIChpbm9kZS0+aV9kYXRhLm5ycGFnZXMpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKgorICogU2NhbiBgZ29hbCcgaW5vZGVzIG9uIHRoZSB1bnVzZWQgbGlzdCBmb3IgZnJlZWFibGUgb25lcy4gVGhleSBhcmUgbW92ZWQgdG8KKyAqIGEgdGVtcG9yYXJ5IGxpc3QgYW5kIHRoZW4gYXJlIGZyZWVkIG91dHNpZGUgaW5vZGVfbG9jayBieSBkaXNwb3NlX2xpc3QoKS4KKyAqCisgKiBBbnkgaW5vZGVzIHdoaWNoIGFyZSBwaW5uZWQgcHVyZWx5IGJlY2F1c2Ugb2YgYXR0YWNoZWQgcGFnZWNhY2hlIGhhdmUgdGhlaXIKKyAqIHBhZ2VjYWNoZSByZW1vdmVkLiAgV2UgZXhwZWN0IHRoZSBmaW5hbCBpcHV0KCkgb24gdGhhdCBpbm9kZSB0byBhZGQgaXQgdG8KKyAqIHRoZSBmcm9udCBvZiB0aGUgaW5vZGVfdW51c2VkIGxpc3QuICBTbyBsb29rIGZvciBpdCB0aGVyZSBhbmQgaWYgdGhlCisgKiBpbm9kZSBpcyBzdGlsbCBmcmVlYWJsZSwgcHJvY2VlZC4gIFRoZSByaWdodCBpbm9kZSBpcyBmb3VuZCA5OS45JSBvZiB0aGUKKyAqIHRpbWUgaW4gdGVzdGluZyBvbiBhIDQtd2F5LgorICoKKyAqIElmIHRoZSBpbm9kZSBoYXMgbWV0YWRhdGEgYnVmZmVycyBhdHRhY2hlZCB0byBtYXBwaW5nLT5wcml2YXRlX2xpc3QgdGhlbgorICogdHJ5IHRvIHJlbW92ZSB0aGVtLgorICovCitzdGF0aWMgdm9pZCBwcnVuZV9pY2FjaGUoaW50IG5yX3RvX3NjYW4pCit7CisJTElTVF9IRUFEKGZyZWVhYmxlKTsKKwlpbnQgbnJfcHJ1bmVkID0gMDsKKwlpbnQgbnJfc2Nhbm5lZDsKKwl1bnNpZ25lZCBsb25nIHJlYXAgPSAwOworCisJZG93bigmaXBydW5lX3NlbSk7CisJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwlmb3IgKG5yX3NjYW5uZWQgPSAwOyBucl9zY2FubmVkIDwgbnJfdG9fc2NhbjsgbnJfc2Nhbm5lZCsrKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwkJaWYgKGxpc3RfZW1wdHkoJmlub2RlX3VudXNlZCkpCisJCQlicmVhazsKKworCQlpbm9kZSA9IGxpc3RfZW50cnkoaW5vZGVfdW51c2VkLnByZXYsIHN0cnVjdCBpbm9kZSwgaV9saXN0KTsKKworCQlpZiAoaW5vZGUtPmlfc3RhdGUgfHwgYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSkgeworCQkJbGlzdF9tb3ZlKCZpbm9kZS0+aV9saXN0LCAmaW5vZGVfdW51c2VkKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChpbm9kZV9oYXNfYnVmZmVycyhpbm9kZSkgfHwgaW5vZGUtPmlfZGF0YS5ucnBhZ2VzKSB7CisJCQlfX2lnZXQoaW5vZGUpOworCQkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCQkJaWYgKHJlbW92ZV9pbm9kZV9idWZmZXJzKGlub2RlKSkKKwkJCQlyZWFwICs9IGludmFsaWRhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEpOworCQkJaXB1dChpbm9kZSk7CisJCQlzcGluX2xvY2soJmlub2RlX2xvY2spOworCisJCQlpZiAoaW5vZGUgIT0gbGlzdF9lbnRyeShpbm9kZV91bnVzZWQubmV4dCwKKwkJCQkJCXN0cnVjdCBpbm9kZSwgaV9saXN0KSkKKwkJCQljb250aW51ZTsJLyogd3JvbmcgaW5vZGUgb3IgbGlzdF9lbXB0eSAqLworCQkJaWYgKCFjYW5fdW51c2UoaW5vZGUpKQorCQkJCWNvbnRpbnVlOworCQl9CisJCWhsaXN0X2RlbF9pbml0KCZpbm9kZS0+aV9oYXNoKTsKKwkJbGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfc2JfbGlzdCk7CisJCWxpc3RfbW92ZSgmaW5vZGUtPmlfbGlzdCwgJmZyZWVhYmxlKTsKKwkJaW5vZGUtPmlfc3RhdGUgfD0gSV9GUkVFSU5HOworCQlucl9wcnVuZWQrKzsKKwl9CisJaW5vZGVzX3N0YXQubnJfdW51c2VkIC09IG5yX3BydW5lZDsKKwlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisKKwlkaXNwb3NlX2xpc3QoJmZyZWVhYmxlKTsKKwl1cCgmaXBydW5lX3NlbSk7CisKKwlpZiAoY3VycmVudF9pc19rc3dhcGQoKSkKKwkJbW9kX3BhZ2Vfc3RhdGUoa3N3YXBkX2lub2Rlc3RlYWwsIHJlYXApOworCWVsc2UKKwkJbW9kX3BhZ2Vfc3RhdGUocGdpbm9kZXN0ZWFsLCByZWFwKTsKK30KKworLyoKKyAqIHNocmlua19pY2FjaGVfbWVtb3J5KCkgd2lsbCBhdHRlbXB0IHRvIHJlY2xhaW0gc29tZSB1bnVzZWQgaW5vZGVzLiAgSGVyZSwKKyAqICJ1bnVzZWQiIG1lYW5zIHRoYXQgbm8gZGVudHJpZXMgYXJlIHJlZmVycmluZyB0byB0aGUgaW5vZGVzOiB0aGUgZmlsZXMgYXJlCisgKiBub3Qgb3BlbiBhbmQgdGhlIGRjYWNoZSByZWZlcmVuY2VzIHRvIHRob3NlIGlub2RlcyBoYXZlIGFscmVhZHkgYmVlbgorICogcmVjbGFpbWVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRoZSBudW1iZXIgb2YgaW5vZGVzIHRvIHNjYW4sIGFuZCBpdCByZXR1cm5zIHRoZQorICogdG90YWwgbnVtYmVyIG9mIHJlbWFpbmluZyBwb3NzaWJseS1yZWNsYWltYWJsZSBpbm9kZXMuCisgKi8KK3N0YXRpYyBpbnQgc2hyaW5rX2ljYWNoZV9tZW1vcnkoaW50IG5yLCB1bnNpZ25lZCBpbnQgZ2ZwX21hc2spCit7CisJaWYgKG5yKSB7CisJCS8qCisJCSAqIE5hc3R5IGRlYWRsb2NrIGF2b2lkYW5jZS4gIFdlIG1heSBob2xkIHZhcmlvdXMgRlMgbG9ja3MsCisJCSAqIGFuZCB3ZSBkb24ndCB3YW50IHRvIHJlY3Vyc2UgaW50byB0aGUgRlMgdGhhdCBjYWxsZWQgdXMKKwkJICogaW4gY2xlYXJfaW5vZGUoKSBhbmQgZnJpZW5kcy4uCisJIAkgKi8KKwkJaWYgKCEoZ2ZwX21hc2sgJiBfX0dGUF9GUykpCisJCQlyZXR1cm4gLTE7CisJCXBydW5lX2ljYWNoZShucik7CisJfQorCXJldHVybiAoaW5vZGVzX3N0YXQubnJfdW51c2VkIC8gMTAwKSAqIHN5c2N0bF92ZnNfY2FjaGVfcHJlc3N1cmU7Cit9CisKK3N0YXRpYyB2b2lkIF9fd2FpdF9vbl9mcmVlaW5nX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworLyoKKyAqIENhbGxlZCB3aXRoIHRoZSBpbm9kZSBsb2NrIGhlbGQuCisgKiBOT1RFOiB3ZSBhcmUgbm90IGluY3JlYXNpbmcgdGhlIGlub2RlLXJlZmNvdW50LCB5b3UgbXVzdCBjYWxsIF9faWdldCgpCisgKiBieSBoYW5kIGFmdGVyIGNhbGxpbmcgZmluZF9pbm9kZSBub3chIFRoaXMgc2ltcGxpZmllcyBpdW5pcXVlIGFuZCB3b24ndAorICogYWRkIGFueSBhZGRpdGlvbmFsIGJyYW5jaCBpbiB0aGUgY29tbW9uIGNvZGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKiBmaW5kX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCwgaW50ICgqdGVzdCkoc3RydWN0IGlub2RlICosIHZvaWQgKiksIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBOVUxMOworCityZXBlYXQ6CisJaGxpc3RfZm9yX2VhY2ggKG5vZGUsIGhlYWQpIHsgCisJCWlub2RlID0gaGxpc3RfZW50cnkobm9kZSwgc3RydWN0IGlub2RlLCBpX2hhc2gpOworCQlpZiAoaW5vZGUtPmlfc2IgIT0gc2IpCisJCQljb250aW51ZTsKKwkJaWYgKCF0ZXN0KGlub2RlLCBkYXRhKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoaW5vZGUtPmlfc3RhdGUgJiAoSV9GUkVFSU5HfElfQ0xFQVIpKSB7CisJCQlfX3dhaXRfb25fZnJlZWluZ19pbm9kZShpbm9kZSk7CisJCQlnb3RvIHJlcGVhdDsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIG5vZGUgPyBpbm9kZSA6IE5VTEw7Cit9CisKKy8qCisgKiBmaW5kX2lub2RlX2Zhc3QgaXMgdGhlIGZhc3QgcGF0aCB2ZXJzaW9uIG9mIGZpbmRfaW5vZGUsIHNlZSB0aGUgY29tbWVudCBhdAorICogaWdldF9sb2NrZWQgZm9yIGRldGFpbHMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKiBmaW5kX2lub2RlX2Zhc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHN0cnVjdCBobGlzdF9oZWFkICpoZWFkLCB1bnNpZ25lZCBsb25nIGlubykKK3sKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IE5VTEw7CisKK3JlcGVhdDoKKwlobGlzdF9mb3JfZWFjaCAobm9kZSwgaGVhZCkgeworCQlpbm9kZSA9IGhsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBpbm9kZSwgaV9oYXNoKTsKKwkJaWYgKGlub2RlLT5pX2lubyAhPSBpbm8pCisJCQljb250aW51ZTsKKwkJaWYgKGlub2RlLT5pX3NiICE9IHNiKQorCQkJY29udGludWU7CisJCWlmIChpbm9kZS0+aV9zdGF0ZSAmIChJX0ZSRUVJTkd8SV9DTEVBUikpIHsKKwkJCV9fd2FpdF9vbl9mcmVlaW5nX2lub2RlKGlub2RlKTsKKwkJCWdvdG8gcmVwZWF0OworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gbm9kZSA/IGlub2RlIDogTlVMTDsKK30KKworLyoqCisgKgluZXdfaW5vZGUgCS0gb2J0YWluIGFuIGlub2RlCisgKglAc2I6IHN1cGVyYmxvY2sKKyAqCisgKglBbGxvY2F0ZXMgYSBuZXcgaW5vZGUgZm9yIGdpdmVuIHN1cGVyYmxvY2suCisgKi8KK3N0cnVjdCBpbm9kZSAqbmV3X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9pbm87CisJc3RydWN0IGlub2RlICogaW5vZGU7CisKKwlzcGluX2xvY2tfcHJlZmV0Y2goJmlub2RlX2xvY2spOworCQorCWlub2RlID0gYWxsb2NfaW5vZGUoc2IpOworCWlmIChpbm9kZSkgeworCQlzcGluX2xvY2soJmlub2RlX2xvY2spOworCQlpbm9kZXNfc3RhdC5ucl9pbm9kZXMrKzsKKwkJbGlzdF9hZGQoJmlub2RlLT5pX2xpc3QsICZpbm9kZV9pbl91c2UpOworCQlsaXN0X2FkZCgmaW5vZGUtPmlfc2JfbGlzdCwgJnNiLT5zX2lub2Rlcyk7CisJCWlub2RlLT5pX2lubyA9ICsrbGFzdF9pbm87CisJCWlub2RlLT5pX3N0YXRlID0gMDsKKwkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCX0KKwlyZXR1cm4gaW5vZGU7Cit9CisKK0VYUE9SVF9TWU1CT0wobmV3X2lub2RlKTsKKwordm9pZCB1bmxvY2tfbmV3X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJLyoKKwkgKiBUaGlzIGlzIHNwZWNpYWwhICBXZSBkbyBub3QgbmVlZCB0aGUgc3BpbmxvY2sKKwkgKiB3aGVuIGNsZWFyaW5nIElfTE9DSywgYmVjYXVzZSB3ZSdyZSBndWFyYW50ZWVkCisJICogdGhhdCBub2JvZHkgZWxzZSB0cmllcyB0byBkbyBhbnl0aGluZyBhYm91dCB0aGUKKwkgKiBzdGF0ZSBvZiB0aGUgaW5vZGUgd2hlbiBpdCBpcyBsb2NrZWQsIGFzIHdlCisJICoganVzdCBjcmVhdGVkIGl0IChzbyB0aGVyZSBjYW4gYmUgbm8gb2xkIGhvbGRlcnMKKwkgKiB0aGF0IGhhdmVuJ3QgdGVzdGVkIElfTE9DSykuCisJICovCisJaW5vZGUtPmlfc3RhdGUgJj0gfihJX0xPQ0t8SV9ORVcpOworCXdha2VfdXBfaW5vZGUoaW5vZGUpOworfQorCitFWFBPUlRfU1lNQk9MKHVubG9ja19uZXdfaW5vZGUpOworCisvKgorICogVGhpcyBpcyBjYWxsZWQgd2l0aG91dCB0aGUgaW5vZGUgbG9jayBoZWxkLi4gQmUgY2FyZWZ1bC4KKyAqCisgKiBXZSBubyBsb25nZXIgY2FjaGUgdGhlIHNiX2ZsYWdzIGluIGlfZmxhZ3MgLSBzZWUgZnMuaAorICoJLS0gcm1rQGFybS51ay5saW51eC5vcmcKKyAqLworc3RhdGljIHN0cnVjdCBpbm9kZSAqIGdldF9uZXdfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQsIGludCAoKnRlc3QpKHN0cnVjdCBpbm9kZSAqLCB2b2lkICopLCBpbnQgKCpzZXQpKHN0cnVjdCBpbm9kZSAqLCB2b2lkICopLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCisJaW5vZGUgPSBhbGxvY19pbm9kZShzYik7CisJaWYgKGlub2RlKSB7CisJCXN0cnVjdCBpbm9kZSAqIG9sZDsKKworCQlzcGluX2xvY2soJmlub2RlX2xvY2spOworCQkvKiBXZSByZWxlYXNlZCB0aGUgbG9jaywgc28uLiAqLworCQlvbGQgPSBmaW5kX2lub2RlKHNiLCBoZWFkLCB0ZXN0LCBkYXRhKTsKKwkJaWYgKCFvbGQpIHsKKwkJCWlmIChzZXQoaW5vZGUsIGRhdGEpKQorCQkJCWdvdG8gc2V0X2ZhaWxlZDsKKworCQkJaW5vZGVzX3N0YXQubnJfaW5vZGVzKys7CisJCQlsaXN0X2FkZCgmaW5vZGUtPmlfbGlzdCwgJmlub2RlX2luX3VzZSk7CisJCQlsaXN0X2FkZCgmaW5vZGUtPmlfc2JfbGlzdCwgJnNiLT5zX2lub2Rlcyk7CisJCQlobGlzdF9hZGRfaGVhZCgmaW5vZGUtPmlfaGFzaCwgaGVhZCk7CisJCQlpbm9kZS0+aV9zdGF0ZSA9IElfTE9DS3xJX05FVzsKKwkJCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKworCQkJLyogUmV0dXJuIHRoZSBsb2NrZWQgaW5vZGUgd2l0aCBJX05FVyBzZXQsIHRoZQorCQkJICogY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmaWxsaW5nIGluIHRoZSBjb250ZW50cworCQkJICovCisJCQlyZXR1cm4gaW5vZGU7CisJCX0KKworCQkvKgorCQkgKiBVaGh1aCwgc29tZWJvZHkgZWxzZSBjcmVhdGVkIHRoZSBzYW1lIGlub2RlIHVuZGVyCisJCSAqIHVzLiBVc2UgdGhlIG9sZCBpbm9kZSBpbnN0ZWFkIG9mIHRoZSBvbmUgd2UganVzdAorCQkgKiBhbGxvY2F0ZWQuCisJCSAqLworCQlfX2lnZXQob2xkKTsKKwkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCQlkZXN0cm95X2lub2RlKGlub2RlKTsKKwkJaW5vZGUgPSBvbGQ7CisJCXdhaXRfb25faW5vZGUoaW5vZGUpOworCX0KKwlyZXR1cm4gaW5vZGU7CisKK3NldF9mYWlsZWQ6CisJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCWRlc3Ryb3lfaW5vZGUoaW5vZGUpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogZ2V0X25ld19pbm9kZV9mYXN0IGlzIHRoZSBmYXN0IHBhdGggdmVyc2lvbiBvZiBnZXRfbmV3X2lub2RlLCBzZWUgdGhlCisgKiBjb21tZW50IGF0IGlnZXRfbG9ja2VkIGZvciBkZXRhaWxzLgorICovCitzdGF0aWMgc3RydWN0IGlub2RlICogZ2V0X25ld19pbm9kZV9mYXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBobGlzdF9oZWFkICpoZWFkLCB1bnNpZ25lZCBsb25nIGlubykKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKworCWlub2RlID0gYWxsb2NfaW5vZGUoc2IpOworCWlmIChpbm9kZSkgeworCQlzdHJ1Y3QgaW5vZGUgKiBvbGQ7CisKKwkJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwkJLyogV2UgcmVsZWFzZWQgdGhlIGxvY2ssIHNvLi4gKi8KKwkJb2xkID0gZmluZF9pbm9kZV9mYXN0KHNiLCBoZWFkLCBpbm8pOworCQlpZiAoIW9sZCkgeworCQkJaW5vZGUtPmlfaW5vID0gaW5vOworCQkJaW5vZGVzX3N0YXQubnJfaW5vZGVzKys7CisJCQlsaXN0X2FkZCgmaW5vZGUtPmlfbGlzdCwgJmlub2RlX2luX3VzZSk7CisJCQlsaXN0X2FkZCgmaW5vZGUtPmlfc2JfbGlzdCwgJnNiLT5zX2lub2Rlcyk7CisJCQlobGlzdF9hZGRfaGVhZCgmaW5vZGUtPmlfaGFzaCwgaGVhZCk7CisJCQlpbm9kZS0+aV9zdGF0ZSA9IElfTE9DS3xJX05FVzsKKwkJCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKworCQkJLyogUmV0dXJuIHRoZSBsb2NrZWQgaW5vZGUgd2l0aCBJX05FVyBzZXQsIHRoZQorCQkJICogY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmaWxsaW5nIGluIHRoZSBjb250ZW50cworCQkJICovCisJCQlyZXR1cm4gaW5vZGU7CisJCX0KKworCQkvKgorCQkgKiBVaGh1aCwgc29tZWJvZHkgZWxzZSBjcmVhdGVkIHRoZSBzYW1lIGlub2RlIHVuZGVyCisJCSAqIHVzLiBVc2UgdGhlIG9sZCBpbm9kZSBpbnN0ZWFkIG9mIHRoZSBvbmUgd2UganVzdAorCQkgKiBhbGxvY2F0ZWQuCisJCSAqLworCQlfX2lnZXQob2xkKTsKKwkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCQlkZXN0cm95X2lub2RlKGlub2RlKTsKKwkJaW5vZGUgPSBvbGQ7CisJCXdhaXRfb25faW5vZGUoaW5vZGUpOworCX0KKwlyZXR1cm4gaW5vZGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBoYXNoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaGFzaHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCXRtcCA9IChoYXNodmFsICogKHVuc2lnbmVkIGxvbmcpc2IpIF4gKEdPTERFTl9SQVRJT19QUklNRSArIGhhc2h2YWwpIC8KKwkJCUwxX0NBQ0hFX0JZVEVTOworCXRtcCA9IHRtcCBeICgodG1wIF4gR09MREVOX1JBVElPX1BSSU1FKSA+PiBJX0hBU0hCSVRTKTsKKwlyZXR1cm4gdG1wICYgSV9IQVNITUFTSzsKK30KKworLyoqCisgKglpdW5pcXVlIC0gZ2V0IGEgdW5pcXVlIGlub2RlIG51bWJlcgorICoJQHNiOiBzdXBlcmJsb2NrCisgKglAbWF4X3Jlc2VydmVkOiBoaWdoZXN0IHJlc2VydmVkIGlub2RlIG51bWJlcgorICoKKyAqCU9idGFpbiBhbiBpbm9kZSBudW1iZXIgdGhhdCBpcyB1bmlxdWUgb24gdGhlIHN5c3RlbSBmb3IgYSBnaXZlbgorICoJc3VwZXJibG9jay4gVGhpcyBpcyB1c2VkIGJ5IGZpbGUgc3lzdGVtcyB0aGF0IGhhdmUgbm8gbmF0dXJhbAorICoJcGVybWFuZW50IGlub2RlIG51bWJlcmluZyBzeXN0ZW0uIEFuIGlub2RlIG51bWJlciBpcyByZXR1cm5lZCB0aGF0CisgKglpcyBoaWdoZXIgdGhhbiB0aGUgcmVzZXJ2ZWQgbGltaXQgYnV0IHVuaXF1ZS4KKyAqCisgKglCVUdTOgorICoJV2l0aCBhIGxhcmdlIG51bWJlciBvZiBpbm9kZXMgbGl2ZSBvbiB0aGUgZmlsZSBzeXN0ZW0gdGhpcyBmdW5jdGlvbgorICoJY3VycmVudGx5IGJlY29tZXMgcXVpdGUgc2xvdy4KKyAqLworaW5vX3QgaXVuaXF1ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbm9fdCBtYXhfcmVzZXJ2ZWQpCit7CisJc3RhdGljIGlub190IGNvdW50ZXI7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqIGhlYWQ7CisJaW5vX3QgcmVzOworCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CityZXRyeToKKwlpZiAoY291bnRlciA+IG1heF9yZXNlcnZlZCkgeworCQloZWFkID0gaW5vZGVfaGFzaHRhYmxlICsgaGFzaChzYixjb3VudGVyKTsKKwkJcmVzID0gY291bnRlcisrOworCQlpbm9kZSA9IGZpbmRfaW5vZGVfZmFzdChzYiwgaGVhZCwgcmVzKTsKKwkJaWYgKCFpbm9kZSkgeworCQkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCQkJcmV0dXJuIHJlczsKKwkJfQorCX0gZWxzZSB7CisJCWNvdW50ZXIgPSBtYXhfcmVzZXJ2ZWQgKyAxOworCX0KKwlnb3RvIHJldHJ5OworCQorfQorCitFWFBPUlRfU1lNQk9MKGl1bmlxdWUpOworCitzdHJ1Y3QgaW5vZGUgKmlncmFiKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfRlJFRUlORykpCisJCV9faWdldChpbm9kZSk7CisJZWxzZQorCQkvKgorCQkgKiBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgc19vcC0+Y2xlYXJfaW5vZGUgaXMgbm90IGJlZW4KKwkJICogY2FsbGVkIHlldCwgYW5kIHNvbWVib2R5IGlzIGNhbGxpbmcgaWdyYWIKKwkJICogd2hpbGUgdGhlIGlub2RlIGlzIGdldHRpbmcgZnJlZWQuCisJCSAqLworCQlpbm9kZSA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCXJldHVybiBpbm9kZTsKK30KKworRVhQT1JUX1NZTUJPTChpZ3JhYik7CisKKy8qKgorICogaWZpbmQgLSBpbnRlcm5hbCBmdW5jdGlvbiwgeW91IHdhbnQgaWxvb2t1cDUoKSBvciBpZ2V0NSgpLgorICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgZmlsZSBzeXN0ZW0gdG8gc2VhcmNoCisgKiBAaGVhZDogICAgICAgdGhlIGhlYWQgb2YgdGhlIGxpc3QgdG8gc2VhcmNoCisgKiBAdGVzdDoJY2FsbGJhY2sgdXNlZCBmb3IgY29tcGFyaXNvbnMgYmV0d2VlbiBpbm9kZXMKKyAqIEBkYXRhOglvcGFxdWUgZGF0YSBwb2ludGVyIHRvIHBhc3MgdG8gQHRlc3QKKyAqCisgKiBpZmluZCgpIHNlYXJjaGVzIGZvciB0aGUgaW5vZGUgc3BlY2lmaWVkIGJ5IEBkYXRhIGluIHRoZSBpbm9kZQorICogY2FjaGUuIFRoaXMgaXMgYSBnZW5lcmFsaXplZCB2ZXJzaW9uIG9mIGlmaW5kX2Zhc3QoKSBmb3IgZmlsZSBzeXN0ZW1zIHdoZXJlCisgKiB0aGUgaW5vZGUgbnVtYmVyIGlzIG5vdCBzdWZmaWNpZW50IGZvciB1bmlxdWUgaWRlbnRpZmljYXRpb24gb2YgYW4gaW5vZGUuCisgKgorICogSWYgdGhlIGlub2RlIGlzIGluIHRoZSBjYWNoZSwgdGhlIGlub2RlIGlzIHJldHVybmVkIHdpdGggYW4gaW5jcmVtZW50ZWQKKyAqIHJlZmVyZW5jZSBjb3VudC4KKyAqCisgKiBPdGhlcndpc2UgTlVMTCBpcyByZXR1cm5lZC4KKyAqCisgKiBOb3RlLCBAdGVzdCBpcyBjYWxsZWQgd2l0aCB0aGUgaW5vZGVfbG9jayBoZWxkLCBzbyBjYW4ndCBzbGVlcC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vZGUgKmlmaW5kKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkLCBpbnQgKCp0ZXN0KShzdHJ1Y3QgaW5vZGUgKiwgdm9pZCAqKSwKKwkJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwlpbm9kZSA9IGZpbmRfaW5vZGUoc2IsIGhlYWQsIHRlc3QsIGRhdGEpOworCWlmIChpbm9kZSkgeworCQlfX2lnZXQoaW5vZGUpOworCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisJCXdhaXRfb25faW5vZGUoaW5vZGUpOworCQlyZXR1cm4gaW5vZGU7CisJfQorCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBpZmluZF9mYXN0IC0gaW50ZXJuYWwgZnVuY3Rpb24sIHlvdSB3YW50IGlsb29rdXAoKSBvciBpZ2V0KCkuCisgKiBAc2I6CQlzdXBlciBibG9jayBvZiBmaWxlIHN5c3RlbSB0byBzZWFyY2gKKyAqIEBoZWFkOiAgICAgICBoZWFkIG9mIHRoZSBsaXN0IHRvIHNlYXJjaAorICogQGlubzoJaW5vZGUgbnVtYmVyIHRvIHNlYXJjaCBmb3IKKyAqCisgKiBpZmluZF9mYXN0KCkgc2VhcmNoZXMgZm9yIHRoZSBpbm9kZSBAaW5vIGluIHRoZSBpbm9kZSBjYWNoZS4gVGhpcyBpcyBmb3IKKyAqIGZpbGUgc3lzdGVtcyB3aGVyZSB0aGUgaW5vZGUgbnVtYmVyIGlzIHN1ZmZpY2llbnQgZm9yIHVuaXF1ZSBpZGVudGlmaWNhdGlvbgorICogb2YgYW4gaW5vZGUuCisgKgorICogSWYgdGhlIGlub2RlIGlzIGluIHRoZSBjYWNoZSwgdGhlIGlub2RlIGlzIHJldHVybmVkIHdpdGggYW4gaW5jcmVtZW50ZWQKKyAqIHJlZmVyZW5jZSBjb3VudC4KKyAqCisgKiBPdGhlcndpc2UgTlVMTCBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vZGUgKmlmaW5kX2Zhc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQsIHVuc2lnbmVkIGxvbmcgaW5vKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlzcGluX2xvY2soJmlub2RlX2xvY2spOworCWlub2RlID0gZmluZF9pbm9kZV9mYXN0KHNiLCBoZWFkLCBpbm8pOworCWlmIChpbm9kZSkgeworCQlfX2lnZXQoaW5vZGUpOworCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisJCXdhaXRfb25faW5vZGUoaW5vZGUpOworCQlyZXR1cm4gaW5vZGU7CisJfQorCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBpbG9va3VwNSAtIHNlYXJjaCBmb3IgYW4gaW5vZGUgaW4gdGhlIGlub2RlIGNhY2hlCisgKiBAc2I6CQlzdXBlciBibG9jayBvZiBmaWxlIHN5c3RlbSB0byBzZWFyY2gKKyAqIEBoYXNodmFsOgloYXNoIHZhbHVlICh1c3VhbGx5IGlub2RlIG51bWJlcikgdG8gc2VhcmNoIGZvcgorICogQHRlc3Q6CWNhbGxiYWNrIHVzZWQgZm9yIGNvbXBhcmlzb25zIGJldHdlZW4gaW5vZGVzCisgKiBAZGF0YToJb3BhcXVlIGRhdGEgcG9pbnRlciB0byBwYXNzIHRvIEB0ZXN0CisgKgorICogaWxvb2t1cDUoKSB1c2VzIGlmaW5kKCkgdG8gc2VhcmNoIGZvciB0aGUgaW5vZGUgc3BlY2lmaWVkIGJ5IEBoYXNodmFsIGFuZAorICogQGRhdGEgaW4gdGhlIGlub2RlIGNhY2hlLiBUaGlzIGlzIGEgZ2VuZXJhbGl6ZWQgdmVyc2lvbiBvZiBpbG9va3VwKCkgZm9yCisgKiBmaWxlIHN5c3RlbXMgd2hlcmUgdGhlIGlub2RlIG51bWJlciBpcyBub3Qgc3VmZmljaWVudCBmb3IgdW5pcXVlCisgKiBpZGVudGlmaWNhdGlvbiBvZiBhbiBpbm9kZS4KKyAqCisgKiBJZiB0aGUgaW5vZGUgaXMgaW4gdGhlIGNhY2hlLCB0aGUgaW5vZGUgaXMgcmV0dXJuZWQgd2l0aCBhbiBpbmNyZW1lbnRlZAorICogcmVmZXJlbmNlIGNvdW50LgorICoKKyAqIE90aGVyd2lzZSBOVUxMIGlzIHJldHVybmVkLgorICoKKyAqIE5vdGUsIEB0ZXN0IGlzIGNhbGxlZCB3aXRoIHRoZSBpbm9kZV9sb2NrIGhlbGQsIHNvIGNhbid0IHNsZWVwLgorICovCitzdHJ1Y3QgaW5vZGUgKmlsb29rdXA1KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaGFzaHZhbCwKKwkJaW50ICgqdGVzdCkoc3RydWN0IGlub2RlICosIHZvaWQgKiksIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSBpbm9kZV9oYXNodGFibGUgKyBoYXNoKHNiLCBoYXNodmFsKTsKKworCXJldHVybiBpZmluZChzYiwgaGVhZCwgdGVzdCwgZGF0YSk7Cit9CisKK0VYUE9SVF9TWU1CT0woaWxvb2t1cDUpOworCisvKioKKyAqIGlsb29rdXAgLSBzZWFyY2ggZm9yIGFuIGlub2RlIGluIHRoZSBpbm9kZSBjYWNoZQorICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgZmlsZSBzeXN0ZW0gdG8gc2VhcmNoCisgKiBAaW5vOglpbm9kZSBudW1iZXIgdG8gc2VhcmNoIGZvcgorICoKKyAqIGlsb29rdXAoKSB1c2VzIGlmaW5kX2Zhc3QoKSB0byBzZWFyY2ggZm9yIHRoZSBpbm9kZSBAaW5vIGluIHRoZSBpbm9kZSBjYWNoZS4KKyAqIFRoaXMgaXMgZm9yIGZpbGUgc3lzdGVtcyB3aGVyZSB0aGUgaW5vZGUgbnVtYmVyIGlzIHN1ZmZpY2llbnQgZm9yIHVuaXF1ZQorICogaWRlbnRpZmljYXRpb24gb2YgYW4gaW5vZGUuCisgKgorICogSWYgdGhlIGlub2RlIGlzIGluIHRoZSBjYWNoZSwgdGhlIGlub2RlIGlzIHJldHVybmVkIHdpdGggYW4gaW5jcmVtZW50ZWQKKyAqIHJlZmVyZW5jZSBjb3VudC4KKyAqCisgKiBPdGhlcndpc2UgTlVMTCBpcyByZXR1cm5lZC4KKyAqLworc3RydWN0IGlub2RlICppbG9va3VwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaW5vKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gaW5vZGVfaGFzaHRhYmxlICsgaGFzaChzYiwgaW5vKTsKKworCXJldHVybiBpZmluZF9mYXN0KHNiLCBoZWFkLCBpbm8pOworfQorCitFWFBPUlRfU1lNQk9MKGlsb29rdXApOworCisvKioKKyAqIGlnZXQ1X2xvY2tlZCAtIG9idGFpbiBhbiBpbm9kZSBmcm9tIGEgbW91bnRlZCBmaWxlIHN5c3RlbQorICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgZmlsZSBzeXN0ZW0KKyAqIEBoYXNodmFsOgloYXNoIHZhbHVlICh1c3VhbGx5IGlub2RlIG51bWJlcikgdG8gZ2V0CisgKiBAdGVzdDoJY2FsbGJhY2sgdXNlZCBmb3IgY29tcGFyaXNvbnMgYmV0d2VlbiBpbm9kZXMKKyAqIEBzZXQ6CWNhbGxiYWNrIHVzZWQgdG8gaW5pdGlhbGl6ZSBhIG5ldyBzdHJ1Y3QgaW5vZGUKKyAqIEBkYXRhOglvcGFxdWUgZGF0YSBwb2ludGVyIHRvIHBhc3MgdG8gQHRlc3QgYW5kIEBzZXQKKyAqCisgKiBUaGlzIGlzIGlnZXQoKSB3aXRob3V0IHRoZSByZWFkX2lub2RlKCkgcG9ydGlvbiBvZiBnZXRfbmV3X2lub2RlKCkuCisgKgorICogaWdldDVfbG9ja2VkKCkgdXNlcyBpZmluZCgpIHRvIHNlYXJjaCBmb3IgdGhlIGlub2RlIHNwZWNpZmllZCBieSBAaGFzaHZhbAorICogYW5kIEBkYXRhIGluIHRoZSBpbm9kZSBjYWNoZSBhbmQgaWYgcHJlc2VudCBpdCBpcyByZXR1cm5lZCB3aXRoIGFuIGluY3JlYXNlZAorICogcmVmZXJlbmNlIGNvdW50LiBUaGlzIGlzIGEgZ2VuZXJhbGl6ZWQgdmVyc2lvbiBvZiBpZ2V0X2xvY2tlZCgpIGZvciBmaWxlCisgKiBzeXN0ZW1zIHdoZXJlIHRoZSBpbm9kZSBudW1iZXIgaXMgbm90IHN1ZmZpY2llbnQgZm9yIHVuaXF1ZSBpZGVudGlmaWNhdGlvbgorICogb2YgYW4gaW5vZGUuCisgKgorICogSWYgdGhlIGlub2RlIGlzIG5vdCBpbiBjYWNoZSwgZ2V0X25ld19pbm9kZSgpIGlzIGNhbGxlZCB0byBhbGxvY2F0ZSBhIG5ldworICogaW5vZGUgYW5kIHRoaXMgaXMgcmV0dXJuZWQgbG9ja2VkLCBoYXNoZWQsIGFuZCB3aXRoIHRoZSBJX05FVyBmbGFnIHNldC4gVGhlCisgKiBmaWxlIHN5c3RlbSBnZXRzIHRvIGZpbGwgaXQgaW4gYmVmb3JlIHVubG9ja2luZyBpdCB2aWEgdW5sb2NrX25ld19pbm9kZSgpLgorICoKKyAqIE5vdGUgYm90aCBAdGVzdCBhbmQgQHNldCBhcmUgY2FsbGVkIHdpdGggdGhlIGlub2RlX2xvY2sgaGVsZCwgc28gY2FuJ3Qgc2xlZXAuCisgKi8KK3N0cnVjdCBpbm9kZSAqaWdldDVfbG9ja2VkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaGFzaHZhbCwKKwkJaW50ICgqdGVzdCkoc3RydWN0IGlub2RlICosIHZvaWQgKiksCisJCWludCAoKnNldCkoc3RydWN0IGlub2RlICosIHZvaWQgKiksIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSBpbm9kZV9oYXNodGFibGUgKyBoYXNoKHNiLCBoYXNodmFsKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaW5vZGUgPSBpZmluZChzYiwgaGVhZCwgdGVzdCwgZGF0YSk7CisJaWYgKGlub2RlKQorCQlyZXR1cm4gaW5vZGU7CisJLyoKKwkgKiBnZXRfbmV3X2lub2RlKCkgd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcsIHJlLXRyeWluZyB0aGUgc2VhcmNoCisJICogaW4gY2FzZSBpdCBoYWQgdG8gYmxvY2sgYXQgYW55IHBvaW50LgorCSAqLworCXJldHVybiBnZXRfbmV3X2lub2RlKHNiLCBoZWFkLCB0ZXN0LCBzZXQsIGRhdGEpOworfQorCitFWFBPUlRfU1lNQk9MKGlnZXQ1X2xvY2tlZCk7CisKKy8qKgorICogaWdldF9sb2NrZWQgLSBvYnRhaW4gYW4gaW5vZGUgZnJvbSBhIG1vdW50ZWQgZmlsZSBzeXN0ZW0KKyAqIEBzYjoJCXN1cGVyIGJsb2NrIG9mIGZpbGUgc3lzdGVtCisgKiBAaW5vOglpbm9kZSBudW1iZXIgdG8gZ2V0CisgKgorICogVGhpcyBpcyBpZ2V0KCkgd2l0aG91dCB0aGUgcmVhZF9pbm9kZSgpIHBvcnRpb24gb2YgZ2V0X25ld19pbm9kZV9mYXN0KCkuCisgKgorICogaWdldF9sb2NrZWQoKSB1c2VzIGlmaW5kX2Zhc3QoKSB0byBzZWFyY2ggZm9yIHRoZSBpbm9kZSBzcGVjaWZpZWQgYnkgQGlubyBpbgorICogdGhlIGlub2RlIGNhY2hlIGFuZCBpZiBwcmVzZW50IGl0IGlzIHJldHVybmVkIHdpdGggYW4gaW5jcmVhc2VkIHJlZmVyZW5jZQorICogY291bnQuIFRoaXMgaXMgZm9yIGZpbGUgc3lzdGVtcyB3aGVyZSB0aGUgaW5vZGUgbnVtYmVyIGlzIHN1ZmZpY2llbnQgZm9yCisgKiB1bmlxdWUgaWRlbnRpZmljYXRpb24gb2YgYW4gaW5vZGUuCisgKgorICogSWYgdGhlIGlub2RlIGlzIG5vdCBpbiBjYWNoZSwgZ2V0X25ld19pbm9kZV9mYXN0KCkgaXMgY2FsbGVkIHRvIGFsbG9jYXRlIGEKKyAqIG5ldyBpbm9kZSBhbmQgdGhpcyBpcyByZXR1cm5lZCBsb2NrZWQsIGhhc2hlZCwgYW5kIHdpdGggdGhlIElfTkVXIGZsYWcgc2V0LgorICogVGhlIGZpbGUgc3lzdGVtIGdldHMgdG8gZmlsbCBpdCBpbiBiZWZvcmUgdW5sb2NraW5nIGl0IHZpYQorICogdW5sb2NrX25ld19pbm9kZSgpLgorICovCitzdHJ1Y3QgaW5vZGUgKmlnZXRfbG9ja2VkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaW5vKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gaW5vZGVfaGFzaHRhYmxlICsgaGFzaChzYiwgaW5vKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaW5vZGUgPSBpZmluZF9mYXN0KHNiLCBoZWFkLCBpbm8pOworCWlmIChpbm9kZSkKKwkJcmV0dXJuIGlub2RlOworCS8qCisJICogZ2V0X25ld19pbm9kZV9mYXN0KCkgd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcsIHJlLXRyeWluZyB0aGUgc2VhcmNoCisJICogaW4gY2FzZSBpdCBoYWQgdG8gYmxvY2sgYXQgYW55IHBvaW50LgorCSAqLworCXJldHVybiBnZXRfbmV3X2lub2RlX2Zhc3Qoc2IsIGhlYWQsIGlubyk7Cit9CisKK0VYUE9SVF9TWU1CT0woaWdldF9sb2NrZWQpOworCisvKioKKyAqCV9faW5zZXJ0X2lub2RlX2hhc2ggLSBoYXNoIGFuIGlub2RlCisgKglAaW5vZGU6IHVuaGFzaGVkIGlub2RlCisgKglAaGFzaHZhbDogdW5zaWduZWQgbG9uZyB2YWx1ZSB1c2VkIHRvIGxvY2F0ZSB0aGlzIG9iamVjdCBpbiB0aGUKKyAqCQlpbm9kZV9oYXNodGFibGUuCisgKgorICoJQWRkIGFuIGlub2RlIHRvIHRoZSBpbm9kZSBoYXNoIGZvciB0aGlzIHN1cGVyYmxvY2suCisgKi8KK3ZvaWQgX19pbnNlcnRfaW5vZGVfaGFzaChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGhhc2h2YWwpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSBpbm9kZV9oYXNodGFibGUgKyBoYXNoKGlub2RlLT5pX3NiLCBoYXNodmFsKTsKKwlzcGluX2xvY2soJmlub2RlX2xvY2spOworCWhsaXN0X2FkZF9oZWFkKCZpbm9kZS0+aV9oYXNoLCBoZWFkKTsKKwlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7Cit9CisKK0VYUE9SVF9TWU1CT0woX19pbnNlcnRfaW5vZGVfaGFzaCk7CisKKy8qKgorICoJcmVtb3ZlX2lub2RlX2hhc2ggLSByZW1vdmUgYW4gaW5vZGUgZnJvbSB0aGUgaGFzaAorICoJQGlub2RlOiBpbm9kZSB0byB1bmhhc2gKKyAqCisgKglSZW1vdmUgYW4gaW5vZGUgZnJvbSB0aGUgc3VwZXJibG9jay4KKyAqLwordm9pZCByZW1vdmVfaW5vZGVfaGFzaChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJaGxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2hhc2gpOworCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKK30KKworRVhQT1JUX1NZTUJPTChyZW1vdmVfaW5vZGVfaGFzaCk7CisKKy8qCisgKiBUZWxsIHRoZSBmaWxlc3lzdGVtIHRoYXQgdGhpcyBpbm9kZSBpcyBubyBsb25nZXIgb2YgYW55IGludGVyZXN0IGFuZCBzaG91bGQKKyAqIGJlIGNvbXBsZXRlbHkgZGVzdHJveWVkLgorICoKKyAqIFdlIGxlYXZlIHRoZSBpbm9kZSBpbiB0aGUgaW5vZGUgaGFzaCB0YWJsZSB1bnRpbCAqYWZ0ZXIqIHRoZSBmaWxlc3lzdGVtJ3MKKyAqIC0+ZGVsZXRlX2lub2RlIGNvbXBsZXRlcy4gIFRoaXMgZW5zdXJlcyB0aGF0IGFuIGlnZXQgKHN1Y2ggYXMgbmZzZCBtaWdodAorICogaW5zdGlnYXRlKSB3aWxsIGFsd2F5cyBmaW5kIHVwLXRvLWRhdGUgaW5mb3JtYXRpb24gZWl0aGVyIGluIHRoZSBoYXNoIG9yIG9uCisgKiBkaXNrLgorICoKKyAqIElfRlJFRUlORyBpcyBzZXQgc28gdGhhdCBuby1vbmUgd2lsbCB0YWtlIGEgbmV3IHJlZmVyZW5jZSB0byB0aGUgaW5vZGUgd2hpbGUKKyAqIGl0IGlzIGJlaW5nIGRlbGV0ZWQuCisgKi8KK3ZvaWQgZ2VuZXJpY19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyAqb3AgPSBpbm9kZS0+aV9zYi0+c19vcDsKKworCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2xpc3QpOworCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX3NiX2xpc3QpOworCWlub2RlLT5pX3N0YXRlfD1JX0ZSRUVJTkc7CisJaW5vZGVzX3N0YXQubnJfaW5vZGVzLS07CisJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCisJaWYgKGlub2RlLT5pX2RhdGEubnJwYWdlcykKKwkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOworCisJc2VjdXJpdHlfaW5vZGVfZGVsZXRlKGlub2RlKTsKKworCWlmIChvcC0+ZGVsZXRlX2lub2RlKSB7CisJCXZvaWQgKCpkZWxldGUpKHN0cnVjdCBpbm9kZSAqKSA9IG9wLT5kZWxldGVfaW5vZGU7CisJCWlmICghaXNfYmFkX2lub2RlKGlub2RlKSkKKwkJCURRVU9UX0lOSVQoaW5vZGUpOworCQkvKiBzX29wLT5kZWxldGVfaW5vZGUgaW50ZXJuYWxseSByZWNhbGxzIGNsZWFyX2lub2RlKCkgKi8KKwkJZGVsZXRlKGlub2RlKTsKKwl9IGVsc2UKKwkJY2xlYXJfaW5vZGUoaW5vZGUpOworCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJaGxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2hhc2gpOworCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKwl3YWtlX3VwX2lub2RlKGlub2RlKTsKKwlpZiAoaW5vZGUtPmlfc3RhdGUgIT0gSV9DTEVBUikKKwkJQlVHKCk7CisJZGVzdHJveV9pbm9kZShpbm9kZSk7Cit9CisKK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19kZWxldGVfaW5vZGUpOworCitzdGF0aWMgdm9pZCBnZW5lcmljX2ZvcmdldF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKworCWlmICghaGxpc3RfdW5oYXNoZWQoJmlub2RlLT5pX2hhc2gpKSB7CisJCWlmICghKGlub2RlLT5pX3N0YXRlICYgKElfRElSVFl8SV9MT0NLKSkpCisJCQlsaXN0X21vdmUoJmlub2RlLT5pX2xpc3QsICZpbm9kZV91bnVzZWQpOworCQlpbm9kZXNfc3RhdC5ucl91bnVzZWQrKzsKKwkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCQlpZiAoIXNiIHx8IChzYi0+c19mbGFncyAmIE1TX0FDVElWRSkpCisJCQlyZXR1cm47CisJCXdyaXRlX2lub2RlX25vdyhpbm9kZSwgMSk7CisJCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJCWlub2Rlc19zdGF0Lm5yX3VudXNlZC0tOworCQlobGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfaGFzaCk7CisJfQorCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2xpc3QpOworCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX3NiX2xpc3QpOworCWlub2RlLT5pX3N0YXRlfD1JX0ZSRUVJTkc7CisJaW5vZGVzX3N0YXQubnJfaW5vZGVzLS07CisJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCWlmIChpbm9kZS0+aV9kYXRhLm5ycGFnZXMpCisJCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKKwljbGVhcl9pbm9kZShpbm9kZSk7CisJZGVzdHJveV9pbm9kZShpbm9kZSk7Cit9CisKKy8qCisgKiBOb3JtYWwgVU5JWCBmaWxlc3lzdGVtIGJlaGF2aW91cjogZGVsZXRlIHRoZQorICogaW5vZGUgd2hlbiB0aGUgdXNhZ2UgY291bnQgZHJvcHMgdG8gemVybywgYW5kCisgKiBpX25saW5rIGlzIHplcm8uCisgKi8KK3N0YXRpYyB2b2lkIGdlbmVyaWNfZHJvcF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmICghaW5vZGUtPmlfbmxpbmspCisJCWdlbmVyaWNfZGVsZXRlX2lub2RlKGlub2RlKTsKKwllbHNlCisJCWdlbmVyaWNfZm9yZ2V0X2lub2RlKGlub2RlKTsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIHdlJ3JlIGRyb3BwaW5nIHRoZSBsYXN0IHJlZmVyZW5jZQorICogdG8gYW4gaW5vZGUuIAorICoKKyAqIENhbGwgdGhlIEZTICJkcm9wKCkiIGZ1bmN0aW9uLCBkZWZhdWx0aW5nIHRvCisgKiB0aGUgbGVnYWN5IFVOSVggZmlsZXN5c3RlbSBiZWhhdmlvdXIuLgorICoKKyAqIE5PVEUhIE5PVEUhIE5PVEUhIFdlJ3JlIGNhbGxlZCB3aXRoIHRoZSBpbm9kZSBsb2NrCisgKiBoZWxkLCBhbmQgdGhlIGRyb3AgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gcmVsZWFzZQorICogdGhlIGxvY2shCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpcHV0X2ZpbmFsKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgKm9wID0gaW5vZGUtPmlfc2ItPnNfb3A7CisJdm9pZCAoKmRyb3ApKHN0cnVjdCBpbm9kZSAqKSA9IGdlbmVyaWNfZHJvcF9pbm9kZTsKKworCWlmIChvcCAmJiBvcC0+ZHJvcF9pbm9kZSkKKwkJZHJvcCA9IG9wLT5kcm9wX2lub2RlOworCWRyb3AoaW5vZGUpOworfQorCisvKioKKyAqCWlwdXQJLSBwdXQgYW4gaW5vZGUgCisgKglAaW5vZGU6IGlub2RlIHRvIHB1dAorICoKKyAqCVB1dHMgYW4gaW5vZGUsIGRyb3BwaW5nIGl0cyB1c2FnZSBjb3VudC4gSWYgdGhlIGlub2RlIHVzZSBjb3VudCBoaXRzCisgKgl6ZXJvLCB0aGUgaW5vZGUgaXMgdGhlbiBmcmVlZCBhbmQgbWF5IGFsc28gYmUgZGVzdHJveWVkLgorICoKKyAqCUNvbnNlcXVlbnRseSwgaXB1dCgpIGNhbiBzbGVlcC4KKyAqLwordm9pZCBpcHV0KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKGlub2RlKSB7CisJCXN0cnVjdCBzdXBlcl9vcGVyYXRpb25zICpvcCA9IGlub2RlLT5pX3NiLT5zX29wOworCisJCUJVR19PTihpbm9kZS0+aV9zdGF0ZSA9PSBJX0NMRUFSKTsKKworCQlpZiAob3AgJiYgb3AtPnB1dF9pbm9kZSkKKwkJCW9wLT5wdXRfaW5vZGUoaW5vZGUpOworCisJCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZpbm9kZS0+aV9jb3VudCwgJmlub2RlX2xvY2spKQorCQkJaXB1dF9maW5hbChpbm9kZSk7CisJfQorfQorCitFWFBPUlRfU1lNQk9MKGlwdXQpOworCisvKioKKyAqCWJtYXAJLSBmaW5kIGEgYmxvY2sgbnVtYmVyIGluIGEgZmlsZQorICoJQGlub2RlOiBpbm9kZSBvZiBmaWxlCisgKglAYmxvY2s6IGJsb2NrIHRvIGZpbmQKKyAqCisgKglSZXR1cm5zIHRoZSBibG9jayBudW1iZXIgb24gdGhlIGRldmljZSBob2xkaW5nIHRoZSBpbm9kZSB0aGF0CisgKglpcyB0aGUgZGlzayBibG9jayBudW1iZXIgZm9yIHRoZSBibG9jayBvZiB0aGUgZmlsZSByZXF1ZXN0ZWQuCisgKglUaGF0IGlzLCBhc2tlZCBmb3IgYmxvY2sgNCBvZiBpbm9kZSAxIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUKKyAqCWRpc2sgYmxvY2sgcmVsYXRpdmUgdG8gdGhlIGRpc2sgc3RhcnQgdGhhdCBob2xkcyB0aGF0IGJsb2NrIG9mIHRoZSAKKyAqCWZpbGUuCisgKi8KK3NlY3Rvcl90IGJtYXAoc3RydWN0IGlub2RlICogaW5vZGUsIHNlY3Rvcl90IGJsb2NrKQoreworCXNlY3Rvcl90IHJlcyA9IDA7CisJaWYgKGlub2RlLT5pX21hcHBpbmctPmFfb3BzLT5ibWFwKQorCQlyZXMgPSBpbm9kZS0+aV9tYXBwaW5nLT5hX29wcy0+Ym1hcChpbm9kZS0+aV9tYXBwaW5nLCBibG9jayk7CisJcmV0dXJuIHJlczsKK30KKworRVhQT1JUX1NZTUJPTChibWFwKTsKKworLyoqCisgKgl1cGRhdGVfYXRpbWUJLQl1cGRhdGUgdGhlIGFjY2VzcyB0aW1lCisgKglAaW5vZGU6IGlub2RlIGFjY2Vzc2VkCisgKgorICoJVXBkYXRlIHRoZSBhY2Nlc3NlZCB0aW1lIG9uIGFuIGlub2RlIGFuZCBtYXJrIGl0IGZvciB3cml0ZWJhY2suCisgKglUaGlzIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgaGFuZGxlcyByZWFkIG9ubHkgZmlsZSBzeXN0ZW1zIGFuZCBtZWRpYSwKKyAqCWFzIHdlbGwgYXMgdGhlICJub2F0aW1lIiBmbGFnIGFuZCBpbm9kZSBzcGVjaWZpYyAibm9hdGltZSIgbWFya2Vycy4KKyAqLwordm9pZCB1cGRhdGVfYXRpbWUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgbm93OworCisJaWYgKElTX05PQVRJTUUoaW5vZGUpKQorCQlyZXR1cm47CisJaWYgKElTX05PRElSQVRJTUUoaW5vZGUpICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybjsKKwlpZiAoSVNfUkRPTkxZKGlub2RlKSkKKwkJcmV0dXJuOworCisJbm93ID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKwlpZiAoIXRpbWVzcGVjX2VxdWFsKCZpbm9kZS0+aV9hdGltZSwgJm5vdykpIHsKKwkJaW5vZGUtPmlfYXRpbWUgPSBub3c7CisJCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7CisJfSBlbHNlIHsKKwkJaWYgKCF0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfYXRpbWUsICZub3cpKQorCQkJaW5vZGUtPmlfYXRpbWUgPSBub3c7CisJfQorfQorCitFWFBPUlRfU1lNQk9MKHVwZGF0ZV9hdGltZSk7CisKKy8qKgorICoJaW5vZGVfdXBkYXRlX3RpbWUJLQl1cGRhdGUgbXRpbWUgYW5kIGN0aW1lIHRpbWUKKyAqCUBpbm9kZTogaW5vZGUgYWNjZXNzZWQKKyAqCUBjdGltZV90b286IHVwZGF0ZSBjdGltZSB0b28KKyAqCisgKglVcGRhdGUgdGhlIG10aW1lIHRpbWUgb24gYW4gaW5vZGUgYW5kIG1hcmsgaXQgZm9yIHdyaXRlYmFjay4KKyAqCVdoZW4gY3RpbWVfdG9vIGlzIHNwZWNpZmllZCB1cGRhdGUgdGhlIGN0aW1lIHRvby4KKyAqLworCit2b2lkIGlub2RlX3VwZGF0ZV90aW1lKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBjdGltZV90b28pCit7CisJc3RydWN0IHRpbWVzcGVjIG5vdzsKKwlpbnQgc3luY19pdCA9IDA7CisKKwlpZiAoSVNfTk9DTVRJTUUoaW5vZGUpKQorCQlyZXR1cm47CisJaWYgKElTX1JET05MWShpbm9kZSkpCisJCXJldHVybjsKKworCW5vdyA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CisJaWYgKCF0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfbXRpbWUsICZub3cpKQorCQlzeW5jX2l0ID0gMTsKKwlpbm9kZS0+aV9tdGltZSA9IG5vdzsKKworCWlmIChjdGltZV90b28pIHsKKwkJaWYgKCF0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfY3RpbWUsICZub3cpKQorCQkJc3luY19pdCA9IDE7CisJCWlub2RlLT5pX2N0aW1lID0gbm93OworCX0KKwlpZiAoc3luY19pdCkKKwkJbWFya19pbm9kZV9kaXJ0eV9zeW5jKGlub2RlKTsKK30KKworRVhQT1JUX1NZTUJPTChpbm9kZV91cGRhdGVfdGltZSk7CisKK2ludCBpbm9kZV9uZWVkc19zeW5jKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKElTX1NZTkMoaW5vZGUpKQorCQlyZXR1cm4gMTsKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiBJU19ESVJTWU5DKGlub2RlKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woaW5vZGVfbmVlZHNfc3luYyk7CisKKy8qCisgKglRdW90YSBmdW5jdGlvbnMgdGhhdCB3YW50IHRvIHdhbGsgdGhlIGlub2RlIGxpc3RzLi4KKyAqLworI2lmZGVmIENPTkZJR19RVU9UQQorCisvKiBGdW5jdGlvbiBiYWNrIGluIGRxdW90LmMgKi8KK2ludCByZW1vdmVfaW5vZGVfZHF1b3RfcmVmKHN0cnVjdCBpbm9kZSAqLCBpbnQsIHN0cnVjdCBsaXN0X2hlYWQgKik7CisKK3ZvaWQgcmVtb3ZlX2RxdW90X3JlZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKnRvZnJlZV9oZWFkKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlpZiAoIXNiLT5kcV9vcCkKKwkJcmV0dXJuOwkvKiBub3RoaW5nIHRvIGRvICovCisJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsJLyogVGhpcyBsb2NrIGlzIGZvciBpbm9kZXMgY29kZSAqLworCisJLyoKKwkgKiBXZSBkb24ndCBoYXZlIHRvIGxvY2sgYWdhaW5zdCBxdW90YSBjb2RlIC0gdGVzdCBJU19RVU9UQUlOSVQgaXMKKwkgKiBqdXN0IGZvciBzcGVlZHVwLi4uCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgJnNiLT5zX2lub2RlcywgaV9zYl9saXN0KQorCQlpZiAoIUlTX05PUVVPVEEoaW5vZGUpKQorCQkJcmVtb3ZlX2lub2RlX2RxdW90X3JlZihpbm9kZSwgdHlwZSwgdG9mcmVlX2hlYWQpOworCisJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworfQorCisjZW5kaWYKKworaW50IGlub2RlX3dhaXQodm9pZCAqd29yZCkKK3sKKwlzY2hlZHVsZSgpOworCXJldHVybiAwOworfQorCisvKgorICogSWYgd2UgdHJ5IHRvIGZpbmQgYW4gaW5vZGUgaW4gdGhlIGlub2RlIGhhc2ggd2hpbGUgaXQgaXMgYmVpbmcgZGVsZXRlZCwgd2UKKyAqIGhhdmUgdG8gd2FpdCB1bnRpbCB0aGUgZmlsZXN5c3RlbSBjb21wbGV0ZXMgaXRzIGRlbGV0aW9uIGJlZm9yZSByZXBvcnRpbmcKKyAqIHRoYXQgaXQgaXNuJ3QgZm91bmQuICBUaGlzIGlzIGJlY2F1c2UgaWdldCB3aWxsIGltbWVkaWF0ZWx5IGNhbGwKKyAqIC0+cmVhZF9pbm9kZSwgYW5kIHdlIHdhbnQgdG8gYmUgc3VyZSB0aGF0IGV2aWRlbmNlIG9mIHRoZSBkZWxldGlvbiBpcyBmb3VuZAorICogYnkgLT5yZWFkX2lub2RlLgorICogVGhpcyBpcyBjYWxsZWQgd2l0aCBpbm9kZV9sb2NrIGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIF9fd2FpdF9vbl9mcmVlaW5nX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJd2FpdF9xdWV1ZV9oZWFkX3QgKndxOworCURFRklORV9XQUlUX0JJVCh3YWl0LCAmaW5vZGUtPmlfc3RhdGUsIF9fSV9MT0NLKTsKKworCS8qCisJICogSV9GUkVFSU5HIGFuZCBJX0NMRUFSIGFyZSBjbGVhcmVkIGluIHByb2Nlc3MgY29udGV4dCB1bmRlcgorCSAqIGlub2RlX2xvY2ssIHNvIHdlIGhhdmUgdG8gZ2l2ZSB0aGUgdGFza3Mgd2hvIHdvdWxkIGNsZWFyIHRoZW0KKwkgKiBhIGNoYW5jZSB0byBydW4gYW5kIGFjcXVpcmUgaW5vZGVfbG9jay4KKwkgKi8KKwlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfTE9DSykpIHsKKwkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCQl5aWVsZCgpOworCQlzcGluX2xvY2soJmlub2RlX2xvY2spOworCQlyZXR1cm47CisJfQorCXdxID0gYml0X3dhaXRxdWV1ZSgmaW5vZGUtPmlfc3RhdGUsIF9fSV9MT0NLKTsKKwlwcmVwYXJlX3RvX3dhaXQod3EsICZ3YWl0LndhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisJc2NoZWR1bGUoKTsKKwlmaW5pc2hfd2FpdCh3cSwgJndhaXQud2FpdCk7CisJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKK30KKwordm9pZCB3YWtlX3VwX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJLyoKKwkgKiBQcmV2ZW50IHNwZWN1bGF0aXZlIGV4ZWN1dGlvbiB0aHJvdWdoIHNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKwkgKi8KKwlzbXBfbWIoKTsKKwl3YWtlX3VwX2JpdCgmaW5vZGUtPmlfc3RhdGUsIF9fSV9MT0NLKTsKK30KKworc3RhdGljIF9faW5pdGRhdGEgdW5zaWduZWQgbG9uZyBpaGFzaF9lbnRyaWVzOworc3RhdGljIGludCBfX2luaXQgc2V0X2loYXNoX2VudHJpZXMoY2hhciAqc3RyKQoreworCWlmICghc3RyKQorCQlyZXR1cm4gMDsKKwlpaGFzaF9lbnRyaWVzID0gc2ltcGxlX3N0cnRvdWwoc3RyLCAmc3RyLCAwKTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImloYXNoX2VudHJpZXM9Iiwgc2V0X2loYXNoX2VudHJpZXMpOworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgd2FpdHF1ZXVlcyBhbmQgaW5vZGUgaGFzaCB0YWJsZS4KKyAqLwordm9pZCBfX2luaXQgaW5vZGVfaW5pdF9lYXJseSh2b2lkKQoreworCWludCBsb29wOworCisJLyogSWYgaGFzaGVzIGFyZSBkaXN0cmlidXRlZCBhY3Jvc3MgTlVNQSBub2RlcywgZGVmZXIKKwkgKiBoYXNoIGFsbG9jYXRpb24gdW50aWwgdm1hbGxvYyBzcGFjZSBpcyBhdmFpbGFibGUuCisJICovCisJaWYgKGhhc2hkaXN0KQorCQlyZXR1cm47CisKKwlpbm9kZV9oYXNodGFibGUgPQorCQlhbGxvY19sYXJnZV9zeXN0ZW1faGFzaCgiSW5vZGUtY2FjaGUiLAorCQkJCQlzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpLAorCQkJCQlpaGFzaF9lbnRyaWVzLAorCQkJCQkxNCwKKwkJCQkJSEFTSF9FQVJMWSwKKwkJCQkJJmlfaGFzaF9zaGlmdCwKKwkJCQkJJmlfaGFzaF9tYXNrLAorCQkJCQkwKTsKKworCWZvciAobG9vcCA9IDA7IGxvb3AgPCAoMSA8PCBpX2hhc2hfc2hpZnQpOyBsb29wKyspCisJCUlOSVRfSExJU1RfSEVBRCgmaW5vZGVfaGFzaHRhYmxlW2xvb3BdKTsKK30KKwordm9pZCBfX2luaXQgaW5vZGVfaW5pdCh1bnNpZ25lZCBsb25nIG1lbXBhZ2VzKQoreworCWludCBsb29wOworCisJLyogaW5vZGUgc2xhYiBjYWNoZSAqLworCWlub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJpbm9kZV9jYWNoZSIsIHNpemVvZihzdHJ1Y3QgaW5vZGUpLAorCQkJCTAsIFNMQUJfUEFOSUMsIGluaXRfb25jZSwgTlVMTCk7CisJc2V0X3Nocmlua2VyKERFRkFVTFRfU0VFS1MsIHNocmlua19pY2FjaGVfbWVtb3J5KTsKKworCS8qIEhhc2ggbWF5IGhhdmUgYmVlbiBzZXQgdXAgaW4gaW5vZGVfaW5pdF9lYXJseSAqLworCWlmICghaGFzaGRpc3QpCisJCXJldHVybjsKKworCWlub2RlX2hhc2h0YWJsZSA9CisJCWFsbG9jX2xhcmdlX3N5c3RlbV9oYXNoKCJJbm9kZS1jYWNoZSIsCisJCQkJCXNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCksCisJCQkJCWloYXNoX2VudHJpZXMsCisJCQkJCTE0LAorCQkJCQkwLAorCQkJCQkmaV9oYXNoX3NoaWZ0LAorCQkJCQkmaV9oYXNoX21hc2ssCisJCQkJCTApOworCisJZm9yIChsb29wID0gMDsgbG9vcCA8ICgxIDw8IGlfaGFzaF9zaGlmdCk7IGxvb3ArKykKKwkJSU5JVF9ITElTVF9IRUFEKCZpbm9kZV9oYXNodGFibGVbbG9vcF0pOworfQorCit2b2lkIGluaXRfc3BlY2lhbF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bW9kZV90IG1vZGUsIGRldl90IHJkZXYpCit7CisJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJaWYgKFNfSVNDSFIobW9kZSkpIHsKKwkJaW5vZGUtPmlfZm9wID0gJmRlZl9jaHJfZm9wczsKKwkJaW5vZGUtPmlfcmRldiA9IHJkZXY7CisJfSBlbHNlIGlmIChTX0lTQkxLKG1vZGUpKSB7CisJCWlub2RlLT5pX2ZvcCA9ICZkZWZfYmxrX2ZvcHM7CisJCWlub2RlLT5pX3JkZXYgPSByZGV2OworCX0gZWxzZSBpZiAoU19JU0ZJRk8obW9kZSkpCisJCWlub2RlLT5pX2ZvcCA9ICZkZWZfZmlmb19mb3BzOworCWVsc2UgaWYgKFNfSVNTT0NLKG1vZGUpKQorCQlpbm9kZS0+aV9mb3AgPSAmYmFkX3NvY2tfZm9wczsKKwllbHNlCisJCXByaW50ayhLRVJOX0RFQlVHICJpbml0X3NwZWNpYWxfaW5vZGU6IGJvZ3VzIGlfbW9kZSAoJW8pXG4iLAorCQkgICAgICAgbW9kZSk7Cit9CitFWFBPUlRfU1lNQk9MKGluaXRfc3BlY2lhbF9pbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9pb2N0bC5jIGIvZnMvaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjkyMDkxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaW9jdGwuYwpAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqICBsaW51eC9mcy9pb2N0bC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorCitzdGF0aWMgbG9uZyBkb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVycm9yID0gLUVOT1RUWTsKKworCWlmICghZmlscC0+Zl9vcCkKKwkJZ290byBvdXQ7CisKKwlpZiAoZmlscC0+Zl9vcC0+dW5sb2NrZWRfaW9jdGwpIHsKKwkJZXJyb3IgPSBmaWxwLT5mX29wLT51bmxvY2tlZF9pb2N0bChmaWxwLCBjbWQsIGFyZyk7CisJCWlmIChlcnJvciA9PSAtRU5PSU9DVExDTUQpCisJCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoZmlscC0+Zl9vcC0+aW9jdGwpIHsKKwkJbG9ja19rZXJuZWwoKTsKKwkJZXJyb3IgPSBmaWxwLT5mX29wLT5pb2N0bChmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSwKKwkJCQkJICBmaWxwLCBjbWQsIGFyZyk7CisJCXVubG9ja19rZXJuZWwoKTsKKwl9CisKKyBvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IGZpbGVfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBlcnJvcjsKKwlpbnQgYmxvY2s7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIEZJQk1BUDoKKwkJeworCQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxwLT5mX21hcHBpbmc7CisJCQlpbnQgcmVzOworCQkJLyogZG8gd2Ugc3VwcG9ydCB0aGlzIG1lc3M/ICovCisJCQlpZiAoIW1hcHBpbmctPmFfb3BzLT5ibWFwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlpZiAoKGVycm9yID0gZ2V0X3VzZXIoYmxvY2ssIHApKSAhPSAwKQorCQkJCXJldHVybiBlcnJvcjsKKworCQkJbG9ja19rZXJuZWwoKTsKKwkJCXJlcyA9IG1hcHBpbmctPmFfb3BzLT5ibWFwKG1hcHBpbmcsIGJsb2NrKTsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJCXJldHVybiBwdXRfdXNlcihyZXMsIHApOworCQl9CisJCWNhc2UgRklHRVRCU1o6CisJCQlpZiAoaW5vZGUtPmlfc2IgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVCQURGOworCQkJcmV0dXJuIHB1dF91c2VyKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwgcCk7CisJCWNhc2UgRklPTlJFQUQ6CisJCQlyZXR1cm4gcHV0X3VzZXIoaV9zaXplX3JlYWQoaW5vZGUpIC0gZmlscC0+Zl9wb3MsIHApOworCX0KKworCXJldHVybiBkb19pb2N0bChmaWxwLCBjbWQsIGFyZyk7Cit9CisKKy8qCisgKiBXaGVuIHlvdSBhZGQgYW55IG5ldyBjb21tb24gaW9jdGxzIHRvIHRoZSBzd2l0Y2hlcyBhYm92ZSBhbmQgYmVsb3cKKyAqIHBsZWFzZSB1cGRhdGUgY29tcGF0X3N5c19pb2N0bCgpIHRvby4KKyAqCisgKiB2ZnNfaW9jdGwoKSBpcyBub3QgZm9yIGRyaXZlcnMgYW5kIG5vdCBpbnRlbmRlZCB0byBiZSBFWFBPUlRfU1lNQk9MKCknZC4KKyAqIEl0J3MganVzdCBhIHNpbXBsZSBoZWxwZXIgZm9yIHN5c19pb2N0bCBhbmQgY29tcGF0X3N5c19pb2N0bC4KKyAqLworaW50IHZmc19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBpbnQgZmxhZzsKKwlpbnQgb24sIGVycm9yID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgRklPQ0xFWDoKKwkJCXNldF9jbG9zZV9vbl9leGVjKGZkLCAxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRklPTkNMRVg6CisJCQlzZXRfY2xvc2Vfb25fZXhlYyhmZCwgMCk7CisJCQlicmVhazsKKworCQljYXNlIEZJT05CSU86CisJCQlpZiAoKGVycm9yID0gZ2V0X3VzZXIob24sIChpbnQgX191c2VyICopYXJnKSkgIT0gMCkKKwkJCQlicmVhazsKKwkJCWZsYWcgPSBPX05PTkJMT0NLOworI2lmZGVmIF9fc3BhcmNfXworCQkJLyogU3VuT1MgY29tcGF0aWJpbGl0eSBpdGVtLiAqLworCQkJaWYoT19OT05CTE9DSyAhPSBPX05ERUxBWSkKKwkJCQlmbGFnIHw9IE9fTkRFTEFZOworI2VuZGlmCisJCQlpZiAob24pCisJCQkJZmlscC0+Zl9mbGFncyB8PSBmbGFnOworCQkJZWxzZQorCQkJCWZpbHAtPmZfZmxhZ3MgJj0gfmZsYWc7CisJCQlicmVhazsKKworCQljYXNlIEZJT0FTWU5DOgorCQkJaWYgKChlcnJvciA9IGdldF91c2VyKG9uLCAoaW50IF9fdXNlciAqKWFyZykpICE9IDApCisJCQkJYnJlYWs7CisJCQlmbGFnID0gb24gPyBGQVNZTkMgOiAwOworCisJCQkvKiBEaWQgRkFTWU5DIHN0YXRlIGNoYW5nZSA/ICovCisJCQlpZiAoKGZsYWcgXiBmaWxwLT5mX2ZsYWdzKSAmIEZBU1lOQykgeworCQkJCWlmIChmaWxwLT5mX29wICYmIGZpbHAtPmZfb3AtPmZhc3luYykgeworCQkJCQlsb2NrX2tlcm5lbCgpOworCQkJCQllcnJvciA9IGZpbHAtPmZfb3AtPmZhc3luYyhmZCwgZmlscCwgb24pOworCQkJCQl1bmxvY2tfa2VybmVsKCk7CisJCQkJfQorCQkJCWVsc2UgZXJyb3IgPSAtRU5PVFRZOworCQkJfQorCQkJaWYgKGVycm9yICE9IDApCisJCQkJYnJlYWs7CisKKwkJCWlmIChvbikKKwkJCQlmaWxwLT5mX2ZsYWdzIHw9IEZBU1lOQzsKKwkJCWVsc2UKKwkJCQlmaWxwLT5mX2ZsYWdzICY9IH5GQVNZTkM7CisJCQlicmVhazsKKworCQljYXNlIEZJT1FTSVpFOgorCQkJaWYgKFNfSVNESVIoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgfHwKKwkJCSAgICBTX0lTUkVHKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpIHx8CisJCQkgICAgU19JU0xOSyhmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkgeworCQkJCWxvZmZfdCByZXMgPSBpbm9kZV9nZXRfYnl0ZXMoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCQkJCWVycm9yID0gY29weV90b191c2VyKChsb2ZmX3QgX191c2VyICopYXJnLCAmcmVzLCBzaXplb2YocmVzKSkgPyAtRUZBVUxUIDogMDsKKwkJCX0KKwkJCWVsc2UKKwkJCQllcnJvciA9IC1FTk9UVFk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChTX0lTUkVHKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQorCQkJCWVycm9yID0gZmlsZV9pb2N0bChmaWxwLCBjbWQsIGFyZyk7CisJCQllbHNlCisJCQkJZXJyb3IgPSBkb19pb2N0bChmaWxwLCBjbWQsIGFyZyk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGZpbGUgKiBmaWxwOworCWludCBlcnJvciA9IC1FQkFERjsKKwlpbnQgZnB1dF9uZWVkZWQ7CisKKwlmaWxwID0gZmdldF9saWdodChmZCwgJmZwdXRfbmVlZGVkKTsKKwlpZiAoIWZpbHApCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSBzZWN1cml0eV9maWxlX2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2ZwdXQ7CisKKwllcnJvciA9IHZmc19pb2N0bChmaWxwLCBmZCwgY21kLCBhcmcpOworIG91dF9mcHV0OgorCWZwdXRfbGlnaHQoZmlscCwgZnB1dF9uZWVkZWQpOworIG91dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBQbGF0Zm9ybXMgaW1wbGVtZW50aW5nIDMyIGJpdCBjb21wYXRpYmlsaXR5IGlvY3RsIGhhbmRsZXJzIGluCisgKiBtb2R1bGVzIG5lZWQgdGhpcyBleHBvcnRlZAorICovCisjaWZkZWYgQ09ORklHX0NPTVBBVAorRVhQT1JUX1NZTUJPTChzeXNfaW9jdGwpOworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9pc29mcy9NYWtlZmlsZSBiL2ZzL2lzb2ZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMTYyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9pc29mcy9NYWtlZmlsZQpAQCAtMCwwICsxLDEwIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggaXNvZnMgZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX0lTTzk2NjBfRlMpICs9IGlzb2ZzLm8KKworaXNvZnMtb2Jqcy15IAkJCTo9IG5hbWVpLm8gaW5vZGUubyBkaXIubyB1dGlsLm8gcm9jay5vIGV4cG9ydC5vCitpc29mcy1vYmpzLSQoQ09ORklHX0pPTElFVCkJKz0gam9saWV0Lm8KK2lzb2ZzLW9ianMtJChDT05GSUdfWklTT0ZTKQkrPSBjb21wcmVzcy5vCitpc29mcy1vYmpzCQkJOj0gJChpc29mcy1vYmpzLXkpCmRpZmYgLS1naXQgYS9mcy9pc29mcy9jb21wcmVzcy5jIGIvZnMvaXNvZnMvY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjQyYzNmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaXNvZnMvY29tcHJlc3MuYwpAQCAtMCwwICsxLDM1OSBAQAorLyogLSotIGxpbnV4LWMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICogICAKKyAqICAgQ29weXJpZ2h0IDIwMDEgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSBNQSAwMjEzOSwKKyAqICAgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorICogICB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogbGludXgvZnMvaXNvZnMvY29tcHJlc3MuYworICoKKyAqIFRyYW5zcGFyZW50IGRlY29tcHJlc3Npb24gb2YgZmlsZXMgb24gYW4gaXNvOTY2MCBmaWxlc3lzdGVtCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pc29fZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvemxpYi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlICJ6aXNvZnMuaCIKKworLyogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgZ2xvYmFsLiAqLworc3RhdGljIGNoYXIgemlzb2ZzX3NpbmtfcGFnZVtQQUdFX0NBQ0hFX1NJWkVdOworCisvKgorICogVGhpcyBjb250YWlucyB0aGUgemxpYiBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgdGhlIG11dGV4IGZvciB0aGUKKyAqIGFsbG9jYXRpb247IHRoaXMgYXZvaWRzIGZhaWx1cmVzIGF0IGJsb2NrLWRlY29tcHJlc3Npb24gdGltZS4KKyAqLworc3RhdGljIHZvaWQgKnppc29mc196bGliX3dvcmtzcGFjZTsKK3N0YXRpYyBzdHJ1Y3Qgc2VtYXBob3JlIHppc29mc196bGliX3NlbWFwaG9yZTsKKworLyoKKyAqIFdoZW4gZGVjb21wcmVzc2luZywgd2UgdHlwaWNhbGx5IG9idGFpbiBtb3JlIHRoYW4gb25lIHBhZ2UKKyAqIHBlciByZWZlcmVuY2UuICBXZSBpbmplY3QgdGhlIGFkZGl0aW9uYWwgcGFnZXMgaW50byB0aGUgcGFnZQorICogY2FjaGUgYXMgYSBmb3JtIG9mIHJlYWRhaGVhZC4KKyAqLworc3RhdGljIGludCB6aXNvZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJdW5zaWduZWQgaW50IG1heHBhZ2UsIHhwYWdlLCBmcGFnZSwgYmxvY2tpbmRleDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIGJsb2NrcHRyLCBibG9ja2VuZHB0ciwgY3N0YXJ0LCBjZW5kLCBjc2l6ZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqcHRyYmhbMl07CisJdW5zaWduZWQgbG9uZyBidWZzaXplID0gSVNPRlNfQlVGRkVSX1NJWkUoaW5vZGUpOworCXVuc2lnbmVkIGludCBidWZzaGlmdCA9IElTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKTsKKwl1bnNpZ25lZCBsb25nIGJ1Zm1hc2sgID0gYnVmc2l6ZSAtIDE7CisJaW50IGVyciA9IC1FSU87CisJaW50IGk7CisJdW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gSVNPRlNfSShpbm9kZSktPmlfZm9ybWF0X3Bhcm1bMF07CisJdW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLT5pX2Zvcm1hdF9wYXJtWzFdOworCS8qIHVuc2lnbmVkIGxvbmcgemlzb2ZzX2Jsb2NrX3NpemUgPSAxVUwgPDwgemlzb2ZzX2Jsb2NrX3NoaWZ0OyAqLworCXVuc2lnbmVkIGludCB6aXNvZnNfYmxvY2tfcGFnZV9zaGlmdCA9IHppc29mc19ibG9ja19zaGlmdC1QQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgemlzb2ZzX2Jsb2NrX3BhZ2VzID0gMVVMIDw8IHppc29mc19ibG9ja19wYWdlX3NoaWZ0OworCXVuc2lnbmVkIGxvbmcgemlzb2ZzX2Jsb2NrX3BhZ2VfbWFzayA9IHppc29mc19ibG9ja19wYWdlcy0xOworCXN0cnVjdCBwYWdlICpwYWdlc1t6aXNvZnNfYmxvY2tfcGFnZXNdOworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSBwYWdlLT5pbmRleDsKKwlpbnQgaW5kZXhibG9ja3M7CisKKwkvKiBXZSBoYXZlIGFscmVhZHkgYmVlbiBnaXZlbiBvbmUgcGFnZSwgdGhpcyBpcyB0aGUgb25lCisJICAgd2UgbXVzdCBkby4gKi8KKwl4cGFnZSA9IGluZGV4ICYgemlzb2ZzX2Jsb2NrX3BhZ2VfbWFzazsKKwlwYWdlc1t4cGFnZV0gPSBwYWdlOworIAorCS8qIFRoZSByZW1haW5pbmcgcGFnZXMgbmVlZCB0byBiZSBhbGxvY2F0ZWQgYW5kIGluc2VydGVkICovCisJb2Zmc2V0ID0gaW5kZXggJiB+emlzb2ZzX2Jsb2NrX3BhZ2VfbWFzazsKKwlibG9ja2luZGV4ID0gb2Zmc2V0ID4+IHppc29mc19ibG9ja19wYWdlX3NoaWZ0OworCW1heHBhZ2UgPSAoaW5vZGUtPmlfc2l6ZSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJbWF4cGFnZSA9IG1pbih6aXNvZnNfYmxvY2tfcGFnZXMsIG1heHBhZ2Utb2Zmc2V0KTsKKworCWZvciAoIGkgPSAwIDsgaSA8IG1heHBhZ2UgOyBpKyssIG9mZnNldCsrICkgeworCQlpZiAoIGkgIT0geHBhZ2UgKSB7CisJCQlwYWdlc1tpXSA9IGdyYWJfY2FjaGVfcGFnZV9ub3dhaXQobWFwcGluZywgb2Zmc2V0KTsKKwkJfQorCQlwYWdlID0gcGFnZXNbaV07CisJCWlmICggcGFnZSApIHsKKwkJCUNsZWFyUGFnZUVycm9yKHBhZ2UpOworCQkJa21hcChwYWdlKTsKKwkJfQorCX0KKworCS8qIFRoaXMgaXMgdGhlIGxhc3QgcGFnZSBmaWxsZWQsIHBsdXMgb25lOyB1c2VkIGluIGNhc2Ugb2YgYWJvcnQuICovCisJZnBhZ2UgPSAwOworCisJLyogRmluZCB0aGUgcG9pbnRlciB0byB0aGlzIHNwZWNpZmljIGNodW5rICovCisJLyogTm90ZTogd2UncmUgbm90IHVzaW5nIGlzb251bV83MzEoKSBoZXJlIGJlY2F1c2UgdGhlIGRhdGEgaXMga25vd24gYWxpZ25lZCAqLworCS8qIE5vdGU6IGhlYWRlcl9zaXplIGlzIGluIDMyLWJpdCB3b3JkcyAoNCBieXRlcykgKi8KKwlibG9ja3B0ciA9IChoZWFkZXJfc2l6ZSArIGJsb2NraW5kZXgpIDw8IDI7CisJYmxvY2tlbmRwdHIgPSBibG9ja3B0ciArIDQ7CisKKwlpbmRleGJsb2NrcyA9ICgoYmxvY2twdHJeYmxvY2tlbmRwdHIpID4+IGJ1ZnNoaWZ0KSA/IDIgOiAxOworCXB0cmJoWzBdID0gcHRyYmhbMV0gPSBOVUxMOworCisJaWYgKCBpc29mc19nZXRfYmxvY2tzKGlub2RlLCBibG9ja3B0ciA+PiBidWZzaGlmdCwgcHRyYmgsIGluZGV4YmxvY2tzKSAhPSBpbmRleGJsb2NrcyApIHsKKwkJaWYgKCBwdHJiaFswXSApIGJyZWxzZShwdHJiaFswXSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJ6aXNvZnM6IE51bGwgYnVmZmVyIG9uIHJlYWRpbmcgYmxvY2sgdGFibGUsIGlub2RlID0gJWx1LCBibG9jayA9ICVsdVxuIiwKKwkJICAgICAgIGlub2RlLT5pX2lubywgYmxvY2twdHIgPj4gYnVmc2hpZnQpOworCQlnb3RvIGVpbzsKKwl9CisJbGxfcndfYmxvY2soUkVBRCwgaW5kZXhibG9ja3MsIHB0cmJoKTsKKworCWJoID0gcHRyYmhbMF07CisJaWYgKCAhYmggfHwgKHdhaXRfb25fYnVmZmVyKGJoKSwgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpICkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiemlzb2ZzOiBGYWlsZWQgdG8gcmVhZCBibG9jayB0YWJsZSwgaW5vZGUgPSAlbHUsIGJsb2NrID0gJWx1XG4iLAorCQkgICAgICAgaW5vZGUtPmlfaW5vLCBibG9ja3B0ciA+PiBidWZzaGlmdCk7CisJCWlmICggcHRyYmhbMV0gKQorCQkJYnJlbHNlKHB0cmJoWzFdKTsKKwkJZ290byBlaW87CisJfQorCWNzdGFydCA9IGxlMzJfdG9fY3B1KCooX19sZTMyICopKGJoLT5iX2RhdGEgKyAoYmxvY2twdHIgJiBidWZtYXNrKSkpOworCisJaWYgKCBpbmRleGJsb2NrcyA9PSAyICkgeworCQkvKiBXZSBqdXN0IGNyb3NzZWQgYSBibG9jayBib3VuZGFyeS4gIFN3aXRjaCB0byB0aGUgbmV4dCBibG9jayAqLworCQlicmVsc2UoYmgpOworCQliaCA9IHB0cmJoWzFdOworCQlpZiAoICFiaCB8fCAod2FpdF9vbl9idWZmZXIoYmgpLCAhYnVmZmVyX3VwdG9kYXRlKGJoKSkgKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiemlzb2ZzOiBGYWlsZWQgdG8gcmVhZCBibG9jayB0YWJsZSwgaW5vZGUgPSAlbHUsIGJsb2NrID0gJWx1XG4iLAorCQkJICAgICAgIGlub2RlLT5pX2lubywgYmxvY2tlbmRwdHIgPj4gYnVmc2hpZnQpOworCQkJZ290byBlaW87CisJCX0KKwl9CisJY2VuZCA9IGxlMzJfdG9fY3B1KCooX19sZTMyICopKGJoLT5iX2RhdGEgKyAoYmxvY2tlbmRwdHIgJiBidWZtYXNrKSkpOworCWJyZWxzZShiaCk7CisKKwljc2l6ZSA9IGNlbmQtY3N0YXJ0OworCisJLyogTm93IHBhZ2VbXSBjb250YWlucyBhbiBhcnJheSBvZiBwYWdlcywgYW55IG9mIHdoaWNoIGNhbiBiZSBOVUxMLAorCSAgIGFuZCB0aGUgbG9ja3Mgb24gd2hpY2ggd2UgaG9sZC4gIFdlIHNob3VsZCBub3cgcmVhZCB0aGUgZGF0YSBhbmQKKwkgICByZWxlYXNlIHRoZSBwYWdlcy4gIElmIHRoZSBwYWdlcyBhcmUgTlVMTCB0aGUgZGVjb21wcmVzc2VkIGRhdGEKKwkgICBmb3IgdGhhdCBwYXJ0aWN1bGFyIHBhZ2Ugc2hvdWxkIGJlIGRpc2NhcmRlZC4gKi8KKwkKKwlpZiAoIGNzaXplID09IDAgKSB7CisJCS8qIFRoaXMgZGF0YSBibG9jayBpcyBlbXB0eS4gKi8KKworCQlmb3IgKCBmcGFnZSA9IDAgOyBmcGFnZSA8IG1heHBhZ2UgOyBmcGFnZSsrICkgeworCQkJaWYgKCAocGFnZSA9IHBhZ2VzW2ZwYWdlXSkgIT0gTlVMTCApIHsKKwkJCQltZW1zZXQocGFnZV9hZGRyZXNzKHBhZ2UpLCAwLCBQQUdFX0NBQ0hFX1NJWkUpOworCQkJCQorCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJCQlrdW5tYXAocGFnZSk7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJaWYgKCBmcGFnZSA9PSB4cGFnZSApCisJCQkJCWVyciA9IDA7IC8qIFRoZSBjcml0aWNhbCBwYWdlICovCisJCQkJZWxzZQorCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBUaGlzIGRhdGEgYmxvY2sgaXMgY29tcHJlc3NlZC4gKi8KKwkJel9zdHJlYW0gc3RyZWFtOworCQlpbnQgYmFpbCA9IDAsIGxlZnRfb3V0ID0gLTE7CisJCWludCB6ZXJyOworCQlpbnQgbmVlZGJsb2NrcyA9IChjc2l6ZSArIChjc3RhcnQgJiBidWZtYXNrKSArIGJ1Zm1hc2spID4+IGJ1ZnNoaWZ0OworCQlpbnQgaGF2ZWJsb2NrczsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbbmVlZGJsb2NrcysxXTsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhwdHI7CisKKwkJLyogQmVjYXVzZSB6bGliIGlzIG5vdCB0aHJlYWQtc2FmZSwgZG8gYWxsIHRoZSBJL08gYXQgdGhlIHRvcC4gKi8KKworCQlibG9ja3B0ciA9IGNzdGFydCA+PiBidWZzaGlmdDsKKwkJbWVtc2V0KGJocywgMCwgKG5lZWRibG9ja3MrMSkqc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSk7CisJCWhhdmVibG9ja3MgPSBpc29mc19nZXRfYmxvY2tzKGlub2RlLCBibG9ja3B0ciwgYmhzLCBuZWVkYmxvY2tzKTsKKwkJbGxfcndfYmxvY2soUkVBRCwgaGF2ZWJsb2NrcywgYmhzKTsKKworCQliaHB0ciA9ICZiaHNbMF07CisJCWJoID0gKmJocHRyKys7CisKKwkJLyogRmlyc3QgYmxvY2sgaXMgc3BlY2lhbCBzaW5jZSBpdCBtYXkgYmUgZnJhY3Rpb25hbC4KKwkJICAgV2UgYWxzbyB3YWl0IGZvciBpdCBiZWZvcmUgZ3JhYmJpbmcgdGhlIHpsaWIKKwkJICAgc2VtYXBob3JlOyBvZGRzIGFyZSB0aGF0IHRoZSBzdWJzZXF1ZW50IGJsb2NrcyBhcmUKKwkJICAgZ29pbmcgdG8gY29tZSBpbiBpbiBzaG9ydCBvcmRlciBzbyB3ZSBkb24ndCBob2xkCisJCSAgIHRoZSB6bGliIHNlbWFwaG9yZSBsb25nZXIgdGhhbiBuZWNlc3NhcnkuICovCisKKwkJaWYgKCAhYmggfHwgKHdhaXRfb25fYnVmZmVyKGJoKSwgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpICkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInppc29mczogSGl0IG51bGwgYnVmZmVyLCBmcGFnZSA9ICVkLCB4cGFnZSA9ICVkLCBjc2l6ZSA9ICVsZFxuIiwKKwkJCSAgICAgICBmcGFnZSwgeHBhZ2UsIGNzaXplKTsKKwkJCWdvdG8gYl9laW87CisJCX0KKwkJc3RyZWFtLm5leHRfaW4gID0gYmgtPmJfZGF0YSArIChjc3RhcnQgJiBidWZtYXNrKTsKKwkJc3RyZWFtLmF2YWlsX2luID0gbWluKGJ1ZnNpemUtKGNzdGFydCAmIGJ1Zm1hc2spLCBjc2l6ZSk7CisJCWNzaXplIC09IHN0cmVhbS5hdmFpbF9pbjsKKworCQlzdHJlYW0ud29ya3NwYWNlID0gemlzb2ZzX3psaWJfd29ya3NwYWNlOworCQlkb3duKCZ6aXNvZnNfemxpYl9zZW1hcGhvcmUpOworCQkKKwkJemVyciA9IHpsaWJfaW5mbGF0ZUluaXQoJnN0cmVhbSk7CisJCWlmICggemVyciAhPSBaX09LICkgeworCQkJaWYgKCBlcnIgJiYgemVyciA9PSBaX01FTV9FUlJPUiApCisJCQkJZXJyID0gLUVOT01FTTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJ6aXNvZnM6IHppc29mc19pbmZsYXRlSW5pdCByZXR1cm5lZCAlZFxuIiwKKwkJCSAgICAgICB6ZXJyKTsKKwkJCWdvdG8gel9laW87CisJCX0KKworCQl3aGlsZSAoICFiYWlsICYmIGZwYWdlIDwgbWF4cGFnZSApIHsKKwkJCXBhZ2UgPSBwYWdlc1tmcGFnZV07CisJCQlpZiAoIHBhZ2UgKQorCQkJCXN0cmVhbS5uZXh0X291dCA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJCWVsc2UKKwkJCQlzdHJlYW0ubmV4dF9vdXQgPSAodm9pZCAqKSZ6aXNvZnNfc2lua19wYWdlOworCQkJc3RyZWFtLmF2YWlsX291dCA9IFBBR0VfQ0FDSEVfU0laRTsKKworCQkJd2hpbGUgKCBzdHJlYW0uYXZhaWxfb3V0ICkgeworCQkJCWludCBhbywgYWk7CisJCQkJaWYgKCBzdHJlYW0uYXZhaWxfaW4gPT0gMCAmJiBsZWZ0X291dCApIHsKKwkJCQkJaWYgKCAhY3NpemUgKSB7CisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ6aXNvZnM6IFpGIHJlYWQgYmV5b25kIGVuZCBvZiBpbnB1dFxuIik7CisJCQkJCQliYWlsID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQl9IGVsc2UgeworCQkJCQkJYmggPSAqYmhwdHIrKzsKKwkJCQkJCWlmICggIWJoIHx8CisJCQkJCQkgICAgICh3YWl0X29uX2J1ZmZlcihiaCksICFidWZmZXJfdXB0b2RhdGUoYmgpKSApIHsKKwkJCQkJCQkvKiBSZWFjaGVkIGFuIEVJTyAqLworIAkJCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiemlzb2ZzOiBIaXQgbnVsbCBidWZmZXIsIGZwYWdlID0gJWQsIHhwYWdlID0gJWQsIGNzaXplID0gJWxkXG4iLAorCQkJCQkJCSAgICAgICBmcGFnZSwgeHBhZ2UsIGNzaXplKTsKKwkJCQkJCQkgICAgICAgCisJCQkJCQkJYmFpbCA9IDE7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlzdHJlYW0ubmV4dF9pbiA9IGJoLT5iX2RhdGE7CisJCQkJCQlzdHJlYW0uYXZhaWxfaW4gPSBtaW4oY3NpemUsYnVmc2l6ZSk7CisJCQkJCQljc2l6ZSAtPSBzdHJlYW0uYXZhaWxfaW47CisJCQkJCX0KKwkJCQl9CisJCQkJYW8gPSBzdHJlYW0uYXZhaWxfb3V0OyAgYWkgPSBzdHJlYW0uYXZhaWxfaW47CisJCQkJemVyciA9IHpsaWJfaW5mbGF0ZSgmc3RyZWFtLCBaX1NZTkNfRkxVU0gpOworCQkJCWxlZnRfb3V0ID0gc3RyZWFtLmF2YWlsX291dDsKKwkJCQlpZiAoIHplcnIgPT0gWl9CVUZfRVJST1IgJiYgc3RyZWFtLmF2YWlsX2luID09IDAgKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoIHplcnIgIT0gWl9PSyApIHsKKwkJCQkJLyogRU9GLCBlcnJvciwgb3IgdHJ5aW5nIHRvIHJlYWQgYmV5b25kIGVuZCBvZiBpbnB1dCAqLworCQkJCQlpZiAoIGVyciAmJiB6ZXJyID09IFpfTUVNX0VSUk9SICkKKwkJCQkJCWVyciA9IC1FTk9NRU07CisJCQkJCWlmICggemVyciAhPSBaX1NUUkVBTV9FTkQgKQorCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgInppc29mczogemlzb2ZzX2luZmxhdGUgcmV0dXJuZWQgJWQsIGlub2RlID0gJWx1LCBpbmRleCA9ICVsdSwgZnBhZ2UgPSAlZCwgeHBhZ2UgPSAlZCwgYXZhaWxfaW4gPSAlZCwgYXZhaWxfb3V0ID0gJWQsIGFpID0gJWQsIGFvID0gJWRcbiIsCisJCQkJCQkgICAgICAgemVyciwgaW5vZGUtPmlfaW5vLCBpbmRleCwKKwkJCQkJCSAgICAgICBmcGFnZSwgeHBhZ2UsCisJCQkJCQkgICAgICAgc3RyZWFtLmF2YWlsX2luLCBzdHJlYW0uYXZhaWxfb3V0LAorCQkJCQkJICAgICAgIGFpLCBhbyk7CisJCQkJCWJhaWwgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmICggc3RyZWFtLmF2YWlsX291dCAmJiB6ZXJyID09IFpfU1RSRUFNX0VORCApIHsKKwkJCQkvKiBGcmFjdGlvbmFsIHBhZ2Ugd3JpdHRlbiBiZWZvcmUgRU9GLiAgVGhpcyBtYXkKKwkJCQkgICBiZSB0aGUgbGFzdCBwYWdlIGluIHRoZSBmaWxlLiAqLworCQkJCW1lbXNldChzdHJlYW0ubmV4dF9vdXQsIDAsIHN0cmVhbS5hdmFpbF9vdXQpOworCQkJCXN0cmVhbS5hdmFpbF9vdXQgPSAwOworCQkJfQorCisJCQlpZiAoICFzdHJlYW0uYXZhaWxfb3V0ICkgeworCQkJCS8qIFRoaXMgcGFnZSBjb21wbGV0ZWQgKi8KKwkJCQlpZiAoIHBhZ2UgKSB7CisJCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCQkJCWt1bm1hcChwYWdlKTsKKwkJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJCWlmICggZnBhZ2UgPT0geHBhZ2UgKQorCQkJCQkJZXJyID0gMDsgLyogVGhlIGNyaXRpY2FsIHBhZ2UgKi8KKwkJCQkJZWxzZQorCQkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCX0KKwkJCQlmcGFnZSsrOworCQkJfQorCQl9CisJCXpsaWJfaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKworCXpfZWlvOgorCQl1cCgmemlzb2ZzX3psaWJfc2VtYXBob3JlKTsKKworCWJfZWlvOgorCQlmb3IgKCBpID0gMCA7IGkgPCBoYXZlYmxvY2tzIDsgaSsrICkgeworCQkJaWYgKCBiaHNbaV0gKQorCQkJCWJyZWxzZShiaHNbaV0pOworCQl9CisJfQorCitlaW86CisKKwkvKiBSZWxlYXNlIGFueSByZXNpZHVhbCBwYWdlcywgZG8gbm90IFNldFBhZ2VVcHRvZGF0ZSAqLworCXdoaWxlICggZnBhZ2UgPCBtYXhwYWdlICkgeworCQlwYWdlID0gcGFnZXNbZnBhZ2VdOworCQlpZiAoIHBhZ2UgKSB7CisJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCWlmICggZnBhZ2UgPT0geHBhZ2UgKQorCQkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJCWt1bm1hcChwYWdlKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJaWYgKCBmcGFnZSAhPSB4cGFnZSApCisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQl9CisJCWZwYWdlKys7CisJfQkJCQorCisJLyogQXQgdGhpcyBwb2ludCwgZXJyIGNvbnRhaW5zIDAgb3IgLUVJTyBkZXBlbmRpbmcgb24gdGhlICJjcml0aWNhbCIgcGFnZSAqLworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgemlzb2ZzX2FvcHMgPSB7CisJLnJlYWRwYWdlID0gemlzb2ZzX3JlYWRwYWdlLAorCS8qIE5vIHN5bmNfcGFnZSBvcGVyYXRpb24gc3VwcG9ydGVkPyAqLworCS8qIE5vIGJtYXAgb3BlcmF0aW9uIHN1cHBvcnRlZCAqLworfTsKKworc3RhdGljIGludCBpbml0aWFsaXplZDsKKworaW50IF9faW5pdCB6aXNvZnNfaW5pdCh2b2lkKQoreworCWlmICggaW5pdGlhbGl6ZWQgKSB7CisJCXByaW50aygiemlzb2ZzX2luaXQ6IGNhbGxlZCBtb3JlIHRoYW4gb25jZVxuIik7CisJCXJldHVybiAwOworCX0KKworCXppc29mc196bGliX3dvcmtzcGFjZSA9IHZtYWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSk7CisJaWYgKCAhemlzb2ZzX3psaWJfd29ya3NwYWNlICkKKwkJcmV0dXJuIC1FTk9NRU07CisJaW5pdF9NVVRFWCgmemlzb2ZzX3psaWJfc2VtYXBob3JlKTsKKworCWluaXRpYWxpemVkID0gMTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCB6aXNvZnNfY2xlYW51cCh2b2lkKQoreworCWlmICggIWluaXRpYWxpemVkICkgeworCQlwcmludGsoInppc29mc19jbGVhbnVwOiBjYWxsZWQgd2l0aG91dCBpbml0aWFsaXphdGlvblxuIik7CisJCXJldHVybjsKKwl9CisKKwl2ZnJlZSh6aXNvZnNfemxpYl93b3Jrc3BhY2UpOworCWluaXRpYWxpemVkID0gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2Rpci5jIGIvZnMvaXNvZnMvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRkODZkZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2lzb2ZzL2Rpci5jCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogIGxpbnV4L2ZzL2lzb2ZzL2Rpci5jCisgKgorICogIChDKSAxOTkyLCAxOTkzLCAxOTk0ICBFcmljIFlvdW5nZGFsZSBNb2RpZmllZCBmb3IgSVNPIDk2NjAgZmlsZXN5c3RlbS4KKyAqCisgKiAgKEMpIDE5OTEgIExpbnVzIFRvcnZhbGRzIC0gbWluaXggZmlsZXN5c3RlbQorICoKKyAqICBTdGV2ZSBCZXlub24JCSAgICAgICA6IE1pc3NpbmcgbGFzdCBkaXJlY3RvcnkgZW50cmllcyBmaXhlZAorICogIChzdGVwaGVuQGFza29uZS5kZW1vbi5jby51aykgICAgICA6IDIxc3QgSnVuZSAxOTk2CisgKiAKKyAqICBpc29mcyBkaXJlY3RvcnkgaGFuZGxpbmcgZnVuY3Rpb25zCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaXNvX2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW50IGlzb2ZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlzb2ZzX2Rpcl9vcGVyYXRpb25zID0KK3sKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gaXNvZnNfcmVhZGRpciwKK307CisKKy8qCisgKiBkaXJlY3RvcmllcyBjYW4gaGFuZGxlIG1vc3Qgb3BlcmF0aW9ucy4uLgorICovCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBpc29mc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9Cit7CisJLmxvb2t1cAkJPSBpc29mc19sb29rdXAsCit9OworCitpbnQgaXNvZnNfbmFtZV90cmFuc2xhdGUoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpkZSwgY2hhciAqbmV3LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWNoYXIgKiBvbGQgPSBkZS0+bmFtZTsKKwlpbnQgbGVuID0gZGUtPm5hbWVfbGVuWzBdOworCWludCBpOworCQkJCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9IG9sZFtpXTsKKwkJaWYgKCFjKQorCQkJYnJlYWs7CisKKwkJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQorCQkJYyB8PSAweDIwOwkvKiBsb3dlciBjYXNlICovCisKKwkJLyogRHJvcCB0cmFpbGluZyAnLjsxJyAoSVNPIDk2NjA6MTk4OCA3LjUuMSByZXF1aXJlcyBwZXJpb2QpICovCisJCWlmIChjID09ICcuJyAmJiBpID09IGxlbiAtIDMgJiYgb2xkW2kgKyAxXSA9PSAnOycgJiYgb2xkW2kgKyAyXSA9PSAnMScpCisJCQlicmVhazsKKworCQkvKiBEcm9wIHRyYWlsaW5nICc7MScgKi8KKwkJaWYgKGMgPT0gJzsnICYmIGkgPT0gbGVuIC0gMiAmJiBvbGRbaSArIDFdID09ICcxJykKKwkJCWJyZWFrOworCisJCS8qIENvbnZlcnQgcmVtYWluaW5nICc7JyB0byAnLicgKi8KKwkJLyogQWxzbyAnLycgdG8gJy4nIChicm9rZW4gQWNvcm4tZ2VuZXJhdGVkIElTTzk2NjAgaW1hZ2VzKSAqLworCQlpZiAoYyA9PSAnOycgfHwgYyA9PSAnLycpCisJCQljID0gJy4nOworCisJCW5ld1tpXSA9IGM7CisJfQorCXJldHVybiBpOworfQorCisvKiBBY29ybiBleHRlbnNpb25zIHdyaXR0ZW4gYnkgTWF0dGhldyBXaWxjb3ggPHdpbGx5QGJvZmguYWk+IDE5OTggKi8KK2ludCBnZXRfYWNvcm5fZmlsZW5hbWUoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogZGUsCisJCQkgICAgY2hhciAqIHJldG5hbWUsIHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCWludCBzdGQ7CisJdW5zaWduZWQgY2hhciAqIGNocjsKKwlpbnQgcmV0bmFtbGVuID0gaXNvZnNfbmFtZV90cmFuc2xhdGUoZGUsIHJldG5hbWUsIGlub2RlKTsKKwlpZiAocmV0bmFtbGVuID09IDApIHJldHVybiAwOworCXN0ZCA9IHNpemVvZihzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQpICsgZGUtPm5hbWVfbGVuWzBdOworCWlmIChzdGQgJiAxKSBzdGQrKzsKKwlpZiAoKCooKHVuc2lnbmVkIGNoYXIgKikgZGUpIC0gc3RkKSAhPSAzMikgcmV0dXJuIHJldG5hbWxlbjsKKwljaHIgPSAoKHVuc2lnbmVkIGNoYXIgKikgZGUpICsgc3RkOworCWlmIChzdHJuY21wKGNociwgIkFSQ0hJTUVERVMiLCAxMCkpIHJldHVybiByZXRuYW1sZW47CisJaWYgKCgqcmV0bmFtZSA9PSAnXycpICYmICgoY2hyWzE5XSAmIDEpID09IDEpKSAqcmV0bmFtZSA9ICchJzsKKwlpZiAoKChkZS0+ZmxhZ3NbMF0gJiAyKSA9PSAwKSAmJiAoY2hyWzEzXSA9PSAweGZmKQorCQkmJiAoKGNoclsxMl0gJiAweGYwKSA9PSAweGYwKSkKKwl7CisJCXJldG5hbWVbcmV0bmFtbGVuXSA9ICcsJzsKKwkJc3ByaW50ZihyZXRuYW1lK3JldG5hbWxlbisxLCAiJTMuM3giLAorCQkJKChjaHJbMTJdICYgMHhmKSA8PCA4KSB8IGNoclsxMV0pOworCQlyZXRuYW1sZW4gKz0gNDsKKwl9CisJcmV0dXJuIHJldG5hbWxlbjsKK30KKworLyoKKyAqIFRoaXMgc2hvdWxkIF9yZWFsbHlfIGJlIGNsZWFuZWQgdXAgc29tZSBkYXkuLgorICovCitzdGF0aWMgaW50IGRvX2lzb2ZzX3JlYWRkaXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCXZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIsCisJCWNoYXIgKiB0bXBuYW1lLCBzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiB0bXBkZSkKK3sKKwl1bnNpZ25lZCBsb25nIGJ1ZnNpemUgPSBJU09GU19CVUZGRVJfU0laRShpbm9kZSk7CisJdW5zaWduZWQgY2hhciBidWZiaXRzID0gSVNPRlNfQlVGRkVSX0JJVFMoaW5vZGUpOworCXVuc2lnbmVkIGxvbmcgYmxvY2ssIG9mZnNldCwgYmxvY2tfc2F2ZWQsIG9mZnNldF9zYXZlZDsKKwl1bnNpZ25lZCBsb25nIGlub2RlX251bWJlciA9IDA7CS8qIFF1aWV0IEdDQyAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWludCBsZW47CisJaW50IG1hcDsKKwlpbnQgZmlyc3RfZGUgPSAxOworCWNoYXIgKnAgPSBOVUxMOwkJLyogUXVpZXQgR0NDICovCisJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpkZTsKKwlzdHJ1Y3QgaXNvZnNfc2JfaW5mbyAqc2JpID0gSVNPRlNfU0IoaW5vZGUtPmlfc2IpOworCisJb2Zmc2V0ID0gZmlscC0+Zl9wb3MgJiAoYnVmc2l6ZSAtIDEpOworCWJsb2NrID0gZmlscC0+Zl9wb3MgPj4gYnVmYml0czsKKworCXdoaWxlIChmaWxwLT5mX3BvcyA8IGlub2RlLT5pX3NpemUpIHsKKwkJaW50IGRlX2xlbjsKKworCQlpZiAoIWJoKSB7CisJCQliaCA9IGlzb2ZzX2JyZWFkKGlub2RlLCBibG9jayk7CisJCQlpZiAoIWJoKQorCQkJCXJldHVybiAwOworCQl9CisKKwkJZGUgPSAoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICopIChiaC0+Yl9kYXRhICsgb2Zmc2V0KTsKKworCQlkZV9sZW4gPSAqKHVuc2lnbmVkIGNoYXIgKikgZGU7CisKKwkJLyogSWYgdGhlIGxlbmd0aCBieXRlIGlzIHplcm8sIHdlIHNob3VsZCBtb3ZlIG9uIHRvIHRoZSBuZXh0CisJCSAgIENEUk9NIHNlY3Rvci4gIElmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBkaXJlY3RvcnksIHdlCisJCSAgIGtpY2sgb3V0IG9mIHRoZSB3aGlsZSBsb29wLiAqLworCisJCWlmIChkZV9sZW4gPT0gMCkgeworCQkJYnJlbHNlKGJoKTsKKwkJCWJoID0gTlVMTDsKKwkJCWZpbHAtPmZfcG9zID0gKGZpbHAtPmZfcG9zICsgSVNPRlNfQkxPQ0tfU0laRSkgJiB+KElTT0ZTX0JMT0NLX1NJWkUgLSAxKTsKKwkJCWJsb2NrID0gZmlscC0+Zl9wb3MgPj4gYnVmYml0czsKKwkJCW9mZnNldCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCWJsb2NrX3NhdmVkID0gYmxvY2s7CisJCW9mZnNldF9zYXZlZCA9IG9mZnNldDsKKwkJb2Zmc2V0ICs9IGRlX2xlbjsKKworCQkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIGZ1bGwgZGlyZWN0b3J5IGVudHJ5ICovCisJCWlmIChvZmZzZXQgPj0gYnVmc2l6ZSkgeworCQkJaW50IHNsb3AgPSBidWZzaXplIC0gb2Zmc2V0ICsgZGVfbGVuOworCQkJbWVtY3B5KHRtcGRlLCBkZSwgc2xvcCk7CisJCQlvZmZzZXQgJj0gYnVmc2l6ZSAtIDE7CisJCQlibG9jaysrOworCQkJYnJlbHNlKGJoKTsKKwkJCWJoID0gTlVMTDsKKwkJCWlmIChvZmZzZXQpIHsKKwkJCQliaCA9IGlzb2ZzX2JyZWFkKGlub2RlLCBibG9jayk7CisJCQkJaWYgKCFiaCkKKwkJCQkJcmV0dXJuIDA7CisJCQkJbWVtY3B5KCh2b2lkICopIHRtcGRlICsgc2xvcCwgYmgtPmJfZGF0YSwgb2Zmc2V0KTsKKwkJCX0KKwkJCWRlID0gdG1wZGU7CisJCX0KKworCQlpZiAoZmlyc3RfZGUpIHsKKwkJCWlzb2ZzX25vcm1hbGl6ZV9ibG9ja19hbmRfb2Zmc2V0KGRlLAorCQkJCQkJCSAmYmxvY2tfc2F2ZWQsCisJCQkJCQkJICZvZmZzZXRfc2F2ZWQpOworCQkJaW5vZGVfbnVtYmVyID0gaXNvZnNfZ2V0X2lubyhibG9ja19zYXZlZCwKKwkJCQkJCSAgICAgb2Zmc2V0X3NhdmVkLAorCQkJCQkJICAgICBidWZiaXRzKTsKKwkJfQorCisJCWlmIChkZS0+ZmxhZ3NbLXNiaS0+c19oaWdoX3NpZXJyYV0gJiAweDgwKSB7CisJCQlmaXJzdF9kZSA9IDA7CisJCQlmaWxwLT5mX3BvcyArPSBkZV9sZW47CisJCQljb250aW51ZTsKKwkJfQorCQlmaXJzdF9kZSA9IDE7CisKKwkJLyogSGFuZGxlIHRoZSBjYXNlIG9mIHRoZSAnLicgZGlyZWN0b3J5ICovCisJCWlmIChkZS0+bmFtZV9sZW5bMF0gPT0gMSAmJiBkZS0+bmFtZVswXSA9PSAwKSB7CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgZmlscC0+Zl9wb3MsIGlub2RlLT5pX2lubywgRFRfRElSKSA8IDApCisJCQkJYnJlYWs7CisJCQlmaWxwLT5mX3BvcyArPSBkZV9sZW47CisJCQljb250aW51ZTsKKwkJfQorCisJCWxlbiA9IDA7CisKKwkJLyogSGFuZGxlIHRoZSBjYXNlIG9mIHRoZSAnLi4nIGRpcmVjdG9yeSAqLworCQlpZiAoZGUtPm5hbWVfbGVuWzBdID09IDEgJiYgZGUtPm5hbWVbMF0gPT0gMSkgeworCQkJaW5vZGVfbnVtYmVyID0gcGFyZW50X2lubyhmaWxwLT5mX2RlbnRyeSk7CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIGZpbHAtPmZfcG9zLCBpbm9kZV9udW1iZXIsIERUX0RJUikgPCAwKQorCQkJCWJyZWFrOworCQkJZmlscC0+Zl9wb3MgKz0gZGVfbGVuOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBIYW5kbGUgZXZlcnl0aGluZyBlbHNlLiAgRG8gbmFtZSB0cmFuc2xhdGlvbiBpZiB0aGVyZQorCQkgICBpcyBubyBSb2NrIFJpZGdlIE5NIGZpZWxkLiAqLworCQlpZiAoc2JpLT5zX3VuaGlkZSA9PSAnbicpIHsKKwkJCS8qIERvIG5vdCByZXBvcnQgaGlkZGVuIG9yIGFzc29jaWF0ZWQgZmlsZXMgKi8KKwkJCWlmIChkZS0+ZmxhZ3NbLXNiaS0+c19oaWdoX3NpZXJyYV0gJiA1KSB7CisJCQkJZmlscC0+Zl9wb3MgKz0gZGVfbGVuOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJbWFwID0gMTsKKwkJaWYgKHNiaS0+c19yb2NrKSB7CisJCQlsZW4gPSBnZXRfcm9ja19yaWRnZV9maWxlbmFtZShkZSwgdG1wbmFtZSwgaW5vZGUpOworCQkJaWYgKGxlbiAhPSAwKSB7CQkvKiBtYXkgYmUgLTEgKi8KKwkJCQlwID0gdG1wbmFtZTsKKwkJCQltYXAgPSAwOworCQkJfQorCQl9CisJCWlmIChtYXApIHsKKyNpZmRlZiBDT05GSUdfSk9MSUVUCisJCQlpZiAoc2JpLT5zX2pvbGlldF9sZXZlbCkgeworCQkJCWxlbiA9IGdldF9qb2xpZXRfZmlsZW5hbWUoZGUsIHRtcG5hbWUsIGlub2RlKTsKKwkJCQlwID0gdG1wbmFtZTsKKwkJCX0gZWxzZQorI2VuZGlmCisJCQlpZiAoc2JpLT5zX21hcHBpbmcgPT0gJ2EnKSB7CisJCQkJbGVuID0gZ2V0X2Fjb3JuX2ZpbGVuYW1lKGRlLCB0bXBuYW1lLCBpbm9kZSk7CisJCQkJcCA9IHRtcG5hbWU7CisJCQl9IGVsc2UKKwkJCWlmIChzYmktPnNfbWFwcGluZyA9PSAnbicpIHsKKwkJCQlsZW4gPSBpc29mc19uYW1lX3RyYW5zbGF0ZShkZSwgdG1wbmFtZSwgaW5vZGUpOworCQkJCXAgPSB0bXBuYW1lOworCQkJfSBlbHNlIHsKKwkJCQlwID0gZGUtPm5hbWU7CisJCQkJbGVuID0gZGUtPm5hbWVfbGVuWzBdOworCQkJfQorCQl9CisJCWlmIChsZW4gPiAwKSB7CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsIHAsIGxlbiwgZmlscC0+Zl9wb3MsIGlub2RlX251bWJlciwgRFRfVU5LTk9XTikgPCAwKQorCQkJCWJyZWFrOworCQl9CisJCWZpbHAtPmZfcG9zICs9IGRlX2xlbjsKKworCQljb250aW51ZTsKKwl9CisJaWYgKGJoKSBicmVsc2UoYmgpOworCXJldHVybiAwOworfQorCisvKgorICogSGFuZGxlIGFsbG9jYXRpb24gb2YgdGVtcG9yYXJ5IHNwYWNlIGZvciBuYW1lIHRyYW5zbGF0aW9uIGFuZAorICogaGFuZGxpbmcgc3BsaXQgZGlyZWN0b3J5IGVudHJpZXMuLiBUaGUgcmVhbCB3b3JrIGlzIGRvbmUgYnkKKyAqICJkb19pc29mc19yZWFkZGlyKCkiLgorICovCitzdGF0aWMgaW50IGlzb2ZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsCisJCXZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJaW50IHJlc3VsdDsKKwljaGFyICogdG1wbmFtZTsKKwlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiB0bXBkZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisKKworCXRtcG5hbWUgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAodG1wbmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxvY2tfa2VybmVsKCk7CisJdG1wZGUgPSAoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICopICh0bXBuYW1lKzEwMjQpOworCisJcmVzdWx0ID0gZG9faXNvZnNfcmVhZGRpcihpbm9kZSwgZmlscCwgZGlyZW50LCBmaWxsZGlyLCB0bXBuYW1lLCB0bXBkZSk7CisKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHRtcG5hbWUpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvZXhwb3J0LmMgYi9mcy9pc29mcy9leHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDI1MmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvaXNvZnMvZXhwb3J0LmMKQEAgLTAsMCArMSwyMjggQEAKKy8qCisgKiBmcy9pc29mcy9leHBvcnQuYworICoKKyAqICAoQykgMjAwNCAgUGF1bCBTZXJpY2UgLSBUaGUgbmV3IGlub2RlIHNjaGVtZSByZXF1aXJlcyBzd2l0Y2hpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGlnZXQoKSB0byBpZ2V0NV9sb2NrZWQoKSB3aGljaCBtZWFucworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBORlMgZXhwb3J0IG9wZXJhdGlvbnMgaGF2ZSB0byBiZSBoYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWQgYmVjYXVzZSB0aGUgZGVmYXVsdCByb3V0aW5lcyByZWx5IG9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaWdldCgpLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIGhlbHBmdWw6CisgKgorICogICAgIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvRXhwb3J0aW5nCisgKiAgICAgZnMvZXhwb3J0ZnMvZXhwZnMuYy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaXNvX2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKK2lzb2ZzX2V4cG9ydF9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCSAgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJICBfX3UzMiBnZW5lcmF0aW9uKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqcmVzdWx0OworCWlmIChibG9jayA9PSAwKQorCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKKwlpbm9kZSA9IGlzb2ZzX2lnZXQoc2IsIGJsb2NrLCBvZmZzZXQpOworCWlmIChpbm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAoaXNfYmFkX2lub2RlKGlub2RlKQorCSAgICB8fCAoZ2VuZXJhdGlvbiAmJiBpbm9kZS0+aV9nZW5lcmF0aW9uICE9IGdlbmVyYXRpb24pKQorCXsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOworCX0KKwlyZXN1bHQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOworCWlmICghcmVzdWx0KSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKgoraXNvZnNfZXhwb3J0X2dldF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdm9ianApCit7CisJX191MzIgKm9ianAgPSB2b2JqcDsKKwl1bnNpZ25lZCBsb25nIGJsb2NrID0gb2JqcFswXTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IG9ianBbMV07CisJX191MzIgZ2VuZXJhdGlvbiA9IG9ianBbMl07CisJcmV0dXJuIGlzb2ZzX2V4cG9ydF9pZ2V0KHNiLCBibG9jaywgb2Zmc2V0LCBnZW5lcmF0aW9uKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBzdXJwcmlzaW5nbHkgc2ltcGxlLiAgVGhlIHRyaWNrIGlzIHVuZGVyc3RhbmRpbmcKKyAqIHRoYXQgImNoaWxkIiBpcyBhbHdheXMgYSBkaXJlY3RvcnkuIFNvLCB0byBmaW5kIGl0cyBwYXJlbnQsIHlvdQorICogc2ltcGx5IG5lZWQgdG8gZmluZCBpdHMgIi4uIiBlbnRyeSwgbm9ybWFsaXplIGl0cyBibG9jayBhbmQgb2Zmc2V0LAorICogYW5kIHJldHVybiB0aGUgdW5kZXJseWluZyBpbm9kZS4gIFNlZSB0aGUgY29tbWVudHMgZm9yCisgKiBpc29mc19ub3JtYWxpemVfYmxvY2tfYW5kX29mZnNldCgpLiAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKmlzb2ZzX2V4cG9ydF9nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmNoaWxkKQoreworCXVuc2lnbmVkIGxvbmcgcGFyZW50X2Jsb2NrID0gMDsKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9vZmZzZXQgPSAwOworCXN0cnVjdCBpbm9kZSAqY2hpbGRfaW5vZGUgPSBjaGlsZC0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaXNvX2lub2RlX2luZm8gKmVfY2hpbGRfaW5vZGUgPSBJU09GU19JKGNoaWxkX2lub2RlKTsKKwlzdHJ1Y3QgaW5vZGUgKnBhcmVudF9pbm9kZSA9IE5VTEw7CisJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpkZSA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggPSBOVUxMOworCXN0cnVjdCBkZW50cnkgKnJ2ID0gTlVMTDsKKworCS8qICJjaGlsZCIgbXVzdCBhbHdheXMgYmUgYSBkaXJlY3RvcnkuICovCisJaWYgKCFTX0lTRElSKGNoaWxkX2lub2RlLT5pX21vZGUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXNvZnM6IGlzb2ZzX2V4cG9ydF9nZXRfcGFyZW50KCk6ICIKKwkJICAgICAgICJjaGlsZCBpcyBub3QgYSBkaXJlY3RvcnkhXG4iKTsKKwkJcnYgPSBFUlJfUFRSKC1FQUNDRVMpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBJdCBpcyBhbiBpbnZhcmlhbnQgdGhhdCB0aGUgZGlyZWN0b3J5IG9mZnNldCBpcyB6ZXJvLiAgSWYKKwkgKiBpdCBpcyBub3QgemVybywgaXQgbWVhbnMgdGhlIGRpcmVjdG9yeSBmYWlsZWQgdG8gYmUKKwkgKiBub3JtYWxpemVkIGZvciBzb21lIHJlYXNvbi4gKi8KKwlpZiAoZV9jaGlsZF9pbm9kZS0+aV9pZ2V0NV9vZmZzZXQgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgImlzb2ZzOiBpc29mc19leHBvcnRfZ2V0X3BhcmVudCgpOiAiCisJCSAgICAgICAiY2hpbGQgZGlyZWN0b3J5IG5vdCBub3JtYWxpemVkIVxuIik7CisJCXJ2ID0gRVJSX1BUUigtRUFDQ0VTKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogVGhlIGNoaWxkIGlub2RlIGhhcyBiZWVuIG5vcm1hbGl6ZWQgc3VjaCB0aGF0IGl0cworCSAqIGlfaWdldDVfYmxvY2sgdmFsdWUgcG9pbnRzIHRvIHRoZSAiLiIgZW50cnkuICBGb3J0dW5hdGVseSwKKwkgKiB0aGUgIi4uIiBlbnRyeSBpcyBsb2NhdGVkIGluIHRoZSBzYW1lIGJsb2NrLiAqLworCXBhcmVudF9ibG9jayA9IGVfY2hpbGRfaW5vZGUtPmlfaWdldDVfYmxvY2s7CisKKwkvKiBHZXQgdGhlIGJsb2NrIGluIHF1ZXN0aW9uLiAqLworCWJoID0gc2JfYnJlYWQoY2hpbGRfaW5vZGUtPmlfc2IsIHBhcmVudF9ibG9jayk7CisJaWYgKGJoID09IE5VTEwpIHsKKwkJcnYgPSBFUlJfUFRSKC1FQUNDRVMpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBUaGlzIGlzIHRoZSAiLiIgZW50cnkuICovCisJZGUgPSAoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkKiliaC0+Yl9kYXRhOworCisJLyogVGhlICIuLiIgZW50cnkgaXMgYWx3YXlzIHRoZSBzZWNvbmQgZW50cnkuICovCisJcGFyZW50X29mZnNldCA9ICh1bnNpZ25lZCBsb25nKWlzb251bV83MTEoZGUtPmxlbmd0aCk7CisJZGUgPSAoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkKikoYmgtPmJfZGF0YSArIHBhcmVudF9vZmZzZXQpOworCisJLyogVmVyaWZ5IGl0IGlzIGluIGZhY3QgdGhlICIuLiIgZW50cnkuICovCisJaWYgKChpc29udW1fNzExKGRlLT5uYW1lX2xlbikgIT0gMSkgfHwgKGRlLT5uYW1lWzBdICE9IDEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXNvZnM6IFVuYWJsZSB0byBmaW5kIHRoZSBcIi4uXCIgIgorCQkgICAgICAgImRpcmVjdG9yeSBmb3IgTkZTLlxuIik7CisJCXJ2ID0gRVJSX1BUUigtRUFDQ0VTKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogTm9ybWFsaXplICovCisJaXNvZnNfbm9ybWFsaXplX2Jsb2NrX2FuZF9vZmZzZXQoZGUsICZwYXJlbnRfYmxvY2ssICZwYXJlbnRfb2Zmc2V0KTsKKworCS8qIEdldCB0aGUgaW5vZGUuICovCisJcGFyZW50X2lub2RlID0gaXNvZnNfaWdldChjaGlsZF9pbm9kZS0+aV9zYiwKKwkJCQkgIHBhcmVudF9ibG9jaywKKwkJCQkgIHBhcmVudF9vZmZzZXQpOworCWlmIChwYXJlbnRfaW5vZGUgPT0gTlVMTCkgeworCQlydiA9IEVSUl9QVFIoLUVBQ0NFUyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBkZW50cnkuICovCisJcnYgPSBkX2FsbG9jX2Fub24ocGFyZW50X2lub2RlKTsKKwlpZiAocnYgPT0gTlVMTCkgeworCQlydiA9IEVSUl9QVFIoLUVOT01FTSk7CisJCWdvdG8gb3V0OworCX0KKworIG91dDoKKwlpZiAoYmgpIHsKKwkJYnJlbHNlKGJoKTsKKwl9CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50Citpc29mc19leHBvcnRfZW5jb2RlX2ZoKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJICAgICAgIF9fdTMyICpmaDMyLAorCQkgICAgICAgaW50ICptYXhfbGVuLAorCQkgICAgICAgaW50IGNvbm5lY3RhYmxlKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpc29faW5vZGVfaW5mbyAqIGVpID0gSVNPRlNfSShpbm9kZSk7CisJaW50IGxlbiA9ICptYXhfbGVuOworCWludCB0eXBlID0gMTsKKwlfX3UxNiAqZmgxNiA9IChfX3UxNiopZmgzMjsKKworCS8qCisJICogV0FSTklORzogbWF4X2xlbiBpcyA1IGZvciBORlN2Mi4gIEJlY2F1c2Ugb2YgdGhpcworCSAqIGxpbWl0YXRpb24sIHdlIHVzZSB0aGUgbG93ZXIgMTYgYml0cyBvZiBmaDMyWzFdIHRvIGhvbGQgdGhlCisJICogb2Zmc2V0IG9mIHRoZSBpbm9kZSBhbmQgdGhlIHVwcGVyIDE2IGJpdHMgb2YgZmgzMlsxXSB0bworCSAqIGhvbGQgdGhlIG9mZnNldCBvZiB0aGUgcGFyZW50LgorCSAqLworCisJaWYgKGxlbiA8IDMgfHwgKGNvbm5lY3RhYmxlICYmIGxlbiA8IDUpKQorCQlyZXR1cm4gMjU1OworCisJbGVuID0gMzsKKwlmaDMyWzBdID0gZWktPmlfaWdldDVfYmxvY2s7CisgCWZoMTZbMl0gPSAoX191MTYpZWktPmlfaWdldDVfb2Zmc2V0OyAgLyogZmgxNiBbc2ljXSAqLworCWZoMzJbMl0gPSBpbm9kZS0+aV9nZW5lcmF0aW9uOworCWlmIChjb25uZWN0YWJsZSAmJiAhU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQlzdHJ1Y3QgaW5vZGUgKnBhcmVudDsKKwkJc3RydWN0IGlzb19pbm9kZV9pbmZvICplcGFyZW50OworCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJcGFyZW50ID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKKwkJZXBhcmVudCA9IElTT0ZTX0kocGFyZW50KTsKKwkJZmgzMlszXSA9IGVwYXJlbnQtPmlfaWdldDVfYmxvY2s7CisJCWZoMTZbM10gPSAoX191MTYpZXBhcmVudC0+aV9pZ2V0NV9vZmZzZXQ7ICAvKiBmaDE2IFtzaWNdICovCisJCWZoMzJbNF0gPSBwYXJlbnQtPmlfZ2VuZXJhdGlvbjsKKwkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJbGVuID0gNTsKKwkJdHlwZSA9IDI7CisJfQorCSptYXhfbGVuID0gbGVuOworCXJldHVybiB0eXBlOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKK2lzb2ZzX2V4cG9ydF9kZWNvZGVfZmgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJICAgICAgIF9fdTMyICpmaDMyLAorCQkgICAgICAgaW50IGZoX2xlbiwKKwkJICAgICAgIGludCBmaWxlaWRfdHlwZSwKKwkJICAgICAgIGludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBkZW50cnkgKmRlKSwKKwkJICAgICAgIHZvaWQgKmNvbnRleHQpCit7CisJX191MTYgKmZoMTYgPSAoX191MTYqKWZoMzI7CisJX191MzIgY2hpbGRbM107ICAgLyogVGhlIGNoaWxkIGlzIHdoYXQgdHJpZ2dlcmVkIGFsbCB0aGlzLiAqLworCV9fdTMyIHBhcmVudFszXTsgIC8qIFRoZSBwYXJlbnQgaXMganVzdCBhbG9uZyBmb3IgdGhlIHJpZGUuICovCisKKwlpZiAoZmhfbGVuIDwgMyB8fCBmaWxlaWRfdHlwZSA+IDIpCisJCXJldHVybiBOVUxMOworCisJY2hpbGRbMF0gPSBmaDMyWzBdOworCWNoaWxkWzFdID0gZmgxNlsyXTsgIC8qIGZoMTYgW3NpY10gKi8KKwljaGlsZFsyXSA9IGZoMzJbMl07CisKKwlwYXJlbnRbMF0gPSAwOworCXBhcmVudFsxXSA9IDA7CisJcGFyZW50WzJdID0gMDsKKwlpZiAoZmlsZWlkX3R5cGUgPT0gMikgeworCQlpZiAoZmhfbGVuID4gMikgcGFyZW50WzBdID0gZmgzMlszXTsKKwkJcGFyZW50WzFdID0gZmgxNlszXTsgIC8qIGZoMTYgW3NpY10gKi8KKwkJaWYgKGZoX2xlbiA+IDQpIHBhcmVudFsyXSA9IGZoMzJbNF07CisJfQorCisJcmV0dXJuIHNiLT5zX2V4cG9ydF9vcC0+ZmluZF9leHBvcnRlZF9kZW50cnkoc2IsIGNoaWxkLCBwYXJlbnQsCisJCQkJCQkgICAgIGFjY2VwdGFibGUsIGNvbnRleHQpOworfQorCisKK3N0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBpc29mc19leHBvcnRfb3BzID0geworCS5kZWNvZGVfZmgJPSBpc29mc19leHBvcnRfZGVjb2RlX2ZoLAorCS5lbmNvZGVfZmgJPSBpc29mc19leHBvcnRfZW5jb2RlX2ZoLAorCS5nZXRfZGVudHJ5CT0gaXNvZnNfZXhwb3J0X2dldF9kZW50cnksCisJLmdldF9wYXJlbnQgICAgID0gaXNvZnNfZXhwb3J0X2dldF9wYXJlbnQsCit9OwpkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvaW5vZGUuYyBiL2ZzL2lzb2ZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkyNTZlNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2lzb2ZzL2lub2RlLmMKQEAgLTAsMCArMSwxNTAzIEBACisvKgorICogIGxpbnV4L2ZzL2lzb2ZzL2lub2RlLmMKKyAqCisgKiAgKEMpIDE5OTEgIExpbnVzIFRvcnZhbGRzIC0gbWluaXggZmlsZXN5c3RlbQorICogICAgICAxOTkyLCAxOTkzLCAxOTk0ICBFcmljIFlvdW5nZGFsZSBNb2RpZmllZCBmb3IgSVNPIDk2NjAgZmlsZXN5c3RlbS4KKyAqICAgICAgMTk5NCAgRWJlcmhhcmQgTW9lbmtlYmVyZyAtIG11bHRpIHNlc3Npb24gaGFuZGxpbmcuCisgKiAgICAgIDE5OTUgIE1hcmsgRG9iaWUgLSBhbGxvdyBtb3VudGluZyBvZiBzb21lIHdlaXJkIFZpZGVvQ0RzIGFuZCBQaG90b0NEcy4KKyAqCTE5OTcgIEdvcmRvbiBDaGFmZmVlIC0gSm9saWV0IENEcworICoJMTk5OCAgRXJpYyBMYW1tZXJ0cyAtIElTTyA5NjYwIExldmVsIDMKKyAqCTIwMDQgIFBhdWwgU2VyaWNlIC0gSW5vZGUgU3VwcG9ydCBwdXNoZWQgb3V0IGZyb20gNEdCIHRvIDEyOEdCCisgKgkyMDA0ICBQYXVsIFNlcmljZSAtIE5GUyBFeHBvcnQgT3BlcmF0aW9ucworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvaXNvX2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Nkcm9tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiemlzb2ZzLmgiCisKKyNkZWZpbmUgQkVRVUlFVAorCisjaWZkZWYgTEVBS19DSEVDSworc3RhdGljIGludCBjaGVja19tYWxsb2M7CitzdGF0aWMgaW50IGNoZWNrX2JyZWFkOworI2VuZGlmCisKK3N0YXRpYyBpbnQgaXNvZnNfaGFzaGkoc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgcXN0ciAqcXN0cik7CitzdGF0aWMgaW50IGlzb2ZzX2hhc2goc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgcXN0ciAqcXN0cik7CitzdGF0aWMgaW50IGlzb2ZzX2RlbnRyeV9jbXBpKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKmEsIHN0cnVjdCBxc3RyICpiKTsKK3N0YXRpYyBpbnQgaXNvZnNfZGVudHJ5X2NtcChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICphLCBzdHJ1Y3QgcXN0ciAqYik7CisKKyNpZmRlZiBDT05GSUdfSk9MSUVUCitzdGF0aWMgaW50IGlzb2ZzX2hhc2hpX21zKHN0cnVjdCBkZW50cnkgKnBhcmVudCwgc3RydWN0IHFzdHIgKnFzdHIpOworc3RhdGljIGludCBpc29mc19oYXNoX21zKHN0cnVjdCBkZW50cnkgKnBhcmVudCwgc3RydWN0IHFzdHIgKnFzdHIpOworc3RhdGljIGludCBpc29mc19kZW50cnlfY21waV9tcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICphLCBzdHJ1Y3QgcXN0ciAqYik7CitzdGF0aWMgaW50IGlzb2ZzX2RlbnRyeV9jbXBfbXMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqYSwgc3RydWN0IHFzdHIgKmIpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGlzb2ZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBpc29mc19zYl9pbmZvICpzYmkgPSBJU09GU19TQihzYik7CisjaWZkZWYgQ09ORklHX0pPTElFVAorCWlmIChzYmktPnNfbmxzX2lvY2hhcnNldCkgeworCQl1bmxvYWRfbmxzKHNiaS0+c19ubHNfaW9jaGFyc2V0KTsKKwkJc2JpLT5zX25sc19pb2NoYXJzZXQgPSBOVUxMOworCX0KKyNlbmRpZgorCisjaWZkZWYgTEVBS19DSEVDSworCXByaW50aygiT3V0c3RhbmRpbmcgbWFsbG9jczolZCwgb3V0c3RhbmRpbmcgYnVmZmVyczogJWRcbiIsCisJICAgICAgIGNoZWNrX21hbGxvYywgY2hlY2tfYnJlYWQpOworI2VuZGlmCisKKwlrZnJlZShzYmkpOworCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgaXNvZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitzdGF0aWMgaW50IGlzb2ZzX3N0YXRmcyAoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBrc3RhdGZzICopOworCitzdGF0aWMga21lbV9jYWNoZV90ICppc29mc19pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmlzb2ZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGlzb19pbm9kZV9pbmZvICplaTsKKwllaSA9IChzdHJ1Y3QgaXNvX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKGlzb2ZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghZWkpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmZWktPnZmc19pbm9kZTsKK30KKworc3RhdGljIHZvaWQgaXNvZnNfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShpc29mc19pbm9kZV9jYWNoZXAsIElTT0ZTX0koaW5vZGUpKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgaXNvX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBpc29faW5vZGVfaW5mbyAqKSBmb287CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKQorCQlpbm9kZV9pbml0X29uY2UoJmVpLT52ZnNfaW5vZGUpOworfQorIAorc3RhdGljIGludCBpbml0X2lub2RlY2FjaGUodm9pZCkKK3sKKwlpc29mc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaXNvZnNfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgaXNvX2lub2RlX2luZm8pLAorCQkJCQkgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKGlzb2ZzX2lub2RlX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCit7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShpc29mc19pbm9kZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9JTkZPICJpc29faW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworc3RhdGljIGludCBpc29mc19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJLyogd2UgcHJvYmFibHkgd2FudCBhIGxvdCBtb3JlIGhlcmUgKi8KKwkqZmxhZ3MgfD0gTVNfUkRPTkxZOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgaXNvZnNfc29wcyA9IHsKKwkuYWxsb2NfaW5vZGUJPSBpc29mc19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IGlzb2ZzX2Rlc3Ryb3lfaW5vZGUsCisJLnJlYWRfaW5vZGUJPSBpc29mc19yZWFkX2lub2RlLAorCS5wdXRfc3VwZXIJPSBpc29mc19wdXRfc3VwZXIsCisJLnN0YXRmcwkJPSBpc29mc19zdGF0ZnMsCisJLnJlbW91bnRfZnMJPSBpc29mc19yZW1vdW50LAorfTsKKworCitzdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGlzb2ZzX2RlbnRyeV9vcHNbXSA9IHsKKwl7CisJCS5kX2hhc2gJCT0gaXNvZnNfaGFzaCwKKwkJLmRfY29tcGFyZQk9IGlzb2ZzX2RlbnRyeV9jbXAsCisJfSwKKwl7CisJCS5kX2hhc2gJCT0gaXNvZnNfaGFzaGksCisJCS5kX2NvbXBhcmUJPSBpc29mc19kZW50cnlfY21waSwKKwl9LAorI2lmZGVmIENPTkZJR19KT0xJRVQKKwl7CisJCS5kX2hhc2gJCT0gaXNvZnNfaGFzaF9tcywKKwkJLmRfY29tcGFyZQk9IGlzb2ZzX2RlbnRyeV9jbXBfbXMsCisJfSwKKwl7CisJCS5kX2hhc2gJCT0gaXNvZnNfaGFzaGlfbXMsCisJCS5kX2NvbXBhcmUJPSBpc29mc19kZW50cnlfY21waV9tcywKKwl9CisjZW5kaWYKK307CisKK3N0cnVjdCBpc285NjYwX29wdGlvbnN7CisJY2hhciBtYXA7CisJY2hhciByb2NrOworCWNoYXIgam9saWV0OworCWNoYXIgY3J1ZnQ7CisJY2hhciB1bmhpZGU7CisJY2hhciBub2NvbXByZXNzOworCXVuc2lnbmVkIGNoYXIgY2hlY2s7CisJdW5zaWduZWQgaW50IGJsb2Nrc2l6ZTsKKwltb2RlX3QgbW9kZTsKKwlnaWRfdCBnaWQ7CisJdWlkX3QgdWlkOworCWNoYXIgKmlvY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIHV0Zjg7CisgICAgICAgIC8qIExWRSAqLworICAgICAgICBzMzIgc2Vzc2lvbjsKKyAgICAgICAgczMyIHNic2VjdG9yOworfTsKKworLyoKKyAqIENvbXB1dGUgdGhlIGhhc2ggZm9yIHRoZSBpc29mcyBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRlbnRyeS4KKyAqLworc3RhdGljIGludAoraXNvZnNfaGFzaF9jb21tb24oc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0ciwgaW50IG1zKQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGxlbjsKKworCWxlbiA9IHFzdHItPmxlbjsKKwluYW1lID0gcXN0ci0+bmFtZTsKKwlpZiAobXMpIHsKKwkJd2hpbGUgKGxlbiAmJiBuYW1lW2xlbi0xXSA9PSAnLicpCisJCQlsZW4tLTsKKwl9CisKKwlxc3RyLT5oYXNoID0gZnVsbF9uYW1lX2hhc2gobmFtZSwgbGVuKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQ29tcHV0ZSB0aGUgaGFzaCBmb3IgdGhlIGlzb2ZzIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgZGVudHJ5LgorICovCitzdGF0aWMgaW50Citpc29mc19oYXNoaV9jb21tb24oc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0ciwgaW50IG1zKQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGxlbjsKKwljaGFyIGM7CisJdW5zaWduZWQgbG9uZyBoYXNoOworCisJbGVuID0gcXN0ci0+bGVuOworCW5hbWUgPSBxc3RyLT5uYW1lOworCWlmIChtcykgeworCQl3aGlsZSAobGVuICYmIG5hbWVbbGVuLTFdID09ICcuJykKKwkJCWxlbi0tOworCX0KKworCWhhc2ggPSBpbml0X25hbWVfaGFzaCgpOworCXdoaWxlIChsZW4tLSkgeworCQljID0gdG9sb3dlcigqbmFtZSsrKTsKKwkJaGFzaCA9IHBhcnRpYWxfbmFtZV9oYXNoKHRvbG93ZXIoYyksIGhhc2gpOworCX0KKwlxc3RyLT5oYXNoID0gZW5kX25hbWVfaGFzaChoYXNoKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJlIG9mIHR3byBpc29mcyBuYW1lcy4KKyAqLworc3RhdGljIGludAoraXNvZnNfZGVudHJ5X2NtcGlfY29tbW9uKHN0cnVjdCBkZW50cnkgKmRlbnRyeSxzdHJ1Y3QgcXN0ciAqYSxzdHJ1Y3QgcXN0ciAqYixpbnQgbXMpCit7CisJaW50IGFsZW4sIGJsZW47CisKKwkvKiBBIGZpbGVuYW1lIGNhbm5vdCBlbmQgaW4gJy4nIG9yIHdlIHRyZWF0IGl0IGxpa2UgaXQgaGFzIG5vbmUgKi8KKwlhbGVuID0gYS0+bGVuOworCWJsZW4gPSBiLT5sZW47CisJaWYgKG1zKSB7CisJCXdoaWxlIChhbGVuICYmIGEtPm5hbWVbYWxlbi0xXSA9PSAnLicpCisJCQlhbGVuLS07CisJCXdoaWxlIChibGVuICYmIGItPm5hbWVbYmxlbi0xXSA9PSAnLicpCisJCQlibGVuLS07CisJfQorCWlmIChhbGVuID09IGJsZW4pIHsKKwkJaWYgKHN0cm5pY21wKGEtPm5hbWUsIGItPm5hbWUsIGFsZW4pID09IDApCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBDYXNlIHNlbnNpdGl2ZSBjb21wYXJlIG9mIHR3byBpc29mcyBuYW1lcy4KKyAqLworc3RhdGljIGludAoraXNvZnNfZGVudHJ5X2NtcF9jb21tb24oc3RydWN0IGRlbnRyeSAqZGVudHJ5LHN0cnVjdCBxc3RyICphLHN0cnVjdCBxc3RyICpiLGludCBtcykKK3sKKwlpbnQgYWxlbiwgYmxlbjsKKworCS8qIEEgZmlsZW5hbWUgY2Fubm90IGVuZCBpbiAnLicgb3Igd2UgdHJlYXQgaXQgbGlrZSBpdCBoYXMgbm9uZSAqLworCWFsZW4gPSBhLT5sZW47CisJYmxlbiA9IGItPmxlbjsKKwlpZiAobXMpIHsKKwkJd2hpbGUgKGFsZW4gJiYgYS0+bmFtZVthbGVuLTFdID09ICcuJykKKwkJCWFsZW4tLTsKKwkJd2hpbGUgKGJsZW4gJiYgYi0+bmFtZVtibGVuLTFdID09ICcuJykKKwkJCWJsZW4tLTsKKwl9CisJaWYgKGFsZW4gPT0gYmxlbikgeworCQlpZiAoc3RybmNtcChhLT5uYW1lLCBiLT5uYW1lLCBhbGVuKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50Citpc29mc19oYXNoKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnFzdHIpCit7CisJcmV0dXJuIGlzb2ZzX2hhc2hfY29tbW9uKGRlbnRyeSwgcXN0ciwgMCk7Cit9CisKK3N0YXRpYyBpbnQKK2lzb2ZzX2hhc2hpKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnFzdHIpCit7CisJcmV0dXJuIGlzb2ZzX2hhc2hpX2NvbW1vbihkZW50cnksIHFzdHIsIDApOworfQorCitzdGF0aWMgaW50Citpc29mc19kZW50cnlfY21wKHN0cnVjdCBkZW50cnkgKmRlbnRyeSxzdHJ1Y3QgcXN0ciAqYSxzdHJ1Y3QgcXN0ciAqYikKK3sKKwlyZXR1cm4gaXNvZnNfZGVudHJ5X2NtcF9jb21tb24oZGVudHJ5LCBhLCBiLCAwKTsKK30KKworc3RhdGljIGludAoraXNvZnNfZGVudHJ5X2NtcGkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LHN0cnVjdCBxc3RyICphLHN0cnVjdCBxc3RyICpiKQoreworCXJldHVybiBpc29mc19kZW50cnlfY21waV9jb21tb24oZGVudHJ5LCBhLCBiLCAwKTsKK30KKworI2lmZGVmIENPTkZJR19KT0xJRVQKK3N0YXRpYyBpbnQKK2lzb2ZzX2hhc2hfbXMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0cikKK3sKKwlyZXR1cm4gaXNvZnNfaGFzaF9jb21tb24oZGVudHJ5LCBxc3RyLCAxKTsKK30KKworc3RhdGljIGludAoraXNvZnNfaGFzaGlfbXMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0cikKK3sKKwlyZXR1cm4gaXNvZnNfaGFzaGlfY29tbW9uKGRlbnRyeSwgcXN0ciwgMSk7Cit9CisKK3N0YXRpYyBpbnQKK2lzb2ZzX2RlbnRyeV9jbXBfbXMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LHN0cnVjdCBxc3RyICphLHN0cnVjdCBxc3RyICpiKQoreworCXJldHVybiBpc29mc19kZW50cnlfY21wX2NvbW1vbihkZW50cnksIGEsIGIsIDEpOworfQorCitzdGF0aWMgaW50Citpc29mc19kZW50cnlfY21waV9tcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksc3RydWN0IHFzdHIgKmEsc3RydWN0IHFzdHIgKmIpCit7CisJcmV0dXJuIGlzb2ZzX2RlbnRyeV9jbXBpX2NvbW1vbihkZW50cnksIGEsIGIsIDEpOworfQorI2VuZGlmCisKK2VudW0geworCU9wdF9ibG9jaywgT3B0X2NoZWNrX3IsIE9wdF9jaGVja19zLCBPcHRfY3J1ZnQsIE9wdF9naWQsIE9wdF9pZ25vcmUsCisJT3B0X2lvY2hhcnNldCwgT3B0X21hcF9hLCBPcHRfbWFwX24sIE9wdF9tYXBfbywgT3B0X21vZGUsIE9wdF9ub2pvbGlldCwKKwlPcHRfbm9yb2NrLCBPcHRfc2IsIE9wdF9zZXNzaW9uLCBPcHRfdWlkLCBPcHRfdW5oaWRlLCBPcHRfdXRmOCwgT3B0X2VyciwKKwlPcHRfbm9jb21wcmVzcywKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7T3B0X25vcm9jaywgIm5vcm9jayJ9LAorCXtPcHRfbm9qb2xpZXQsICJub2pvbGlldCJ9LAorCXtPcHRfdW5oaWRlLCAidW5oaWRlIn0sCisJe09wdF9jcnVmdCwgImNydWZ0In0sCisJe09wdF91dGY4LCAidXRmOCJ9LAorCXtPcHRfaW9jaGFyc2V0LCAiaW9jaGFyc2V0PSVzIn0sCisJe09wdF9tYXBfYSwgIm1hcD1hY29ybiJ9LAorCXtPcHRfbWFwX2EsICJtYXA9YSJ9LAorCXtPcHRfbWFwX24sICJtYXA9bm9ybWFsIn0sCisJe09wdF9tYXBfbiwgIm1hcD1uIn0sCisJe09wdF9tYXBfbywgIm1hcD1vZmYifSwKKwl7T3B0X21hcF9vLCAibWFwPW8ifSwKKwl7T3B0X3Nlc3Npb24sICJzZXNzaW9uPSV1In0sCisJe09wdF9zYiwgInNic2VjdG9yPSV1In0sCisJe09wdF9jaGVja19yLCAiY2hlY2s9cmVsYXhlZCJ9LAorCXtPcHRfY2hlY2tfciwgImNoZWNrPXIifSwKKwl7T3B0X2NoZWNrX3MsICJjaGVjaz1zdHJpY3QifSwKKwl7T3B0X2NoZWNrX3MsICJjaGVjaz1zIn0sCisJe09wdF91aWQsICJ1aWQ9JXUifSwKKwl7T3B0X2dpZCwgImdpZD0ldSJ9LAorCXtPcHRfbW9kZSwgIm1vZGU9JXUifSwKKwl7T3B0X2Jsb2NrLCAiYmxvY2s9JXUifSwKKwl7T3B0X2lnbm9yZSwgImNvbnY9YmluYXJ5In0sCisJe09wdF9pZ25vcmUsICJjb252PWIifSwKKwl7T3B0X2lnbm9yZSwgImNvbnY9dGV4dCJ9LAorCXtPcHRfaWdub3JlLCAiY29udj10In0sCisJe09wdF9pZ25vcmUsICJjb252PW10ZXh0In0sCisJe09wdF9pZ25vcmUsICJjb252PW0ifSwKKwl7T3B0X2lnbm9yZSwgImNvbnY9YXV0byJ9LAorCXtPcHRfaWdub3JlLCAiY29udj1hIn0sCisJe09wdF9ub2NvbXByZXNzLCAibm9jb21wcmVzcyJ9LAorCXtPcHRfZXJyLCBOVUxMfQorfTsKKworc3RhdGljIGludCBwYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIHN0cnVjdCBpc285NjYwX29wdGlvbnMgKiBwb3B0KQoreworCWNoYXIgKnA7CisJaW50IG9wdGlvbjsKKworCXBvcHQtPm1hcCA9ICduJzsKKwlwb3B0LT5yb2NrID0gJ3knOworCXBvcHQtPmpvbGlldCA9ICd5JzsKKwlwb3B0LT5jcnVmdCA9ICduJzsKKwlwb3B0LT51bmhpZGUgPSAnbic7CisJcG9wdC0+Y2hlY2sgPSAndSc7CQkvKiB1bnNldCAqLworCXBvcHQtPm5vY29tcHJlc3MgPSAwOworCXBvcHQtPmJsb2Nrc2l6ZSA9IDEwMjQ7CisJcG9wdC0+bW9kZSA9IFNfSVJVR08gfCBTX0lYVUdPOyAvKiByLXggZm9yIGFsbC4gIFRoZSBkaXNjIGNvdWxkCisJCQkJCSAgIGJlIHNoYXJlZCB3aXRoIERPUyBtYWNoaW5lcyBzbworCQkJCQkgICB2aXJ0dWFsbHkgYW55dGhpbmcgY291bGQgYmUKKwkJCQkJICAgYSB2YWxpZCBleGVjdXRhYmxlLiAqLworCXBvcHQtPmdpZCA9IDA7CisJcG9wdC0+dWlkID0gMDsKKwlwb3B0LT5pb2NoYXJzZXQgPSBOVUxMOworCXBvcHQtPnV0ZjggPSAwOworCXBvcHQtPnNlc3Npb249LTE7CisJcG9wdC0+c2JzZWN0b3I9LTE7CisJaWYgKCFvcHRpb25zKQorCQlyZXR1cm4gMTsKKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpbnQgdG9rZW47CisJCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKKwkJdW5zaWduZWQgbjsKKworCQlpZiAoISpwKQorCQkJY29udGludWU7CisKKwkJdG9rZW4gPSBtYXRjaF90b2tlbihwLCB0b2tlbnMsIGFyZ3MpOworCQlzd2l0Y2ggKHRva2VuKSB7CisJCWNhc2UgT3B0X25vcm9jazoKKwkJCXBvcHQtPnJvY2sgPSAnbic7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9qb2xpZXQ6CisJCQlwb3B0LT5qb2xpZXQgPSAnbic7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfdW5oaWRlOgorCQkJcG9wdC0+dW5oaWRlID0gJ3knOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2NydWZ0OgorCQkJcG9wdC0+Y3J1ZnQgPSAneSc7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfdXRmODoKKwkJCXBvcHQtPnV0ZjggPSAxOworCQkJYnJlYWs7CisjaWZkZWYgQ09ORklHX0pPTElFVAorCQljYXNlIE9wdF9pb2NoYXJzZXQ6CisJCQlwb3B0LT5pb2NoYXJzZXQgPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMF0pOworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSBPcHRfbWFwX2E6CisJCQlwb3B0LT5tYXAgPSAnYSc7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbWFwX286CisJCQlwb3B0LT5tYXAgPSAnbyc7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbWFwX246CisJCQlwb3B0LT5tYXAgPSAnbic7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfc2Vzc2lvbjoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJbiA9IG9wdGlvbjsKKwkJCWlmIChuID4gOTkpCisJCQkJcmV0dXJuIDA7CisJCQlwb3B0LT5zZXNzaW9uID0gbiArIDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfc2I6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXBvcHQtPnNic2VjdG9yID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2NoZWNrX3I6CisJCQlwb3B0LT5jaGVjayA9ICdyJzsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9jaGVja19zOgorCQkJcG9wdC0+Y2hlY2sgPSAncyc7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfaWdub3JlOgorCQkJYnJlYWs7CisJCWNhc2UgT3B0X3VpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJcG9wdC0+dWlkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2dpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJcG9wdC0+Z2lkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X21vZGU6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXBvcHQtPm1vZGUgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfYmxvY2s6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCW4gPSBvcHRpb247CisJCQlpZiAobiAhPSA1MTIgJiYgbiAhPSAxMDI0ICYmIG4gIT0gMjA0OCkKKwkJCQlyZXR1cm4gMDsKKwkJCXBvcHQtPmJsb2Nrc2l6ZSA9IG47CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9jb21wcmVzczoKKwkJCXBvcHQtPm5vY29tcHJlc3MgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIGxvb2sgaWYgdGhlIGRyaXZlciBjYW4gdGVsbCB0aGUgbXVsdGkgc2Vzc2lvbiByZWRpcmVjdGlvbiB2YWx1ZQorICoKKyAqIGRvbid0IGNoYW5nZSB0aGlzIGlmIHlvdSBkb24ndCBrbm93IHdoYXQgeW91IGRvLCBwbGVhc2UhCisgKiBNdWx0aXNlc3Npb24gaXMgbGVnYWwgb25seSB3aXRoIFhBIGRpc2tzLgorICogQSBub24tWEEgZGlzayB3aXRoIG1vcmUgdGhhbiBvbmUgdm9sdW1lIGRlc2NyaXB0b3IgbWF5IGRvIGl0IHJpZ2h0LCBidXQKKyAqIHVzdWFsbHkgaXMgd3JpdHRlbiBpbiBhIG5vd2hlcmUgc3RhbmRhcmRpemVkICJtdWx0aS1wYXJ0aXRpb24iIG1hbm5lci4KKyAqIE11bHRpc2Vzc2lvbiB1c2VzIGFic29sdXRlIGFkZHJlc3NpbmcgKHNvbGVseSB0aGUgZmlyc3QgZnJhbWUgb2YgdGhlIHdob2xlCisgKiB0cmFjayBpcyAjMCksIG11bHRpLXBhcnRpdGlvbiB1c2VzIHJlbGF0aXZlIGFkZHJlc3NpbmcgKGVhY2ggZmlyc3QgZnJhbWUgb2YKKyAqIGVhY2ggdHJhY2sgaXMgIzApLCBhbmQgYSB0cmFjayBpcyBub3QgYSBzZXNzaW9uLgorICoKKyAqIEEgYnJva2VuIENEd3JpdGVyIHNvZnR3YXJlIG9yIGRyaXZlIGZpcm13YXJlIGRvZXMgbm90IHNldCBuZXcgc3RhbmRhcmRzLAorICogYXQgbGVhc3Qgbm90IGlmIGNvbmZsaWN0aW5nIHdpdGggdGhlIGV4aXN0aW5nIG9uZXMuCisgKgorICogZW1vZW5rZUBnd2RnLmRlCisgKi8KKyNkZWZpbmUgV0VfT0JFWV9USEVfV1JJVFRFTl9TVEFOREFSRFMgMQorCitzdGF0aWMgdW5zaWduZWQgaW50IGlzb2ZzX2dldF9sYXN0X3Nlc3Npb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYixzMzIgc2Vzc2lvbiApCit7CisJc3RydWN0IGNkcm9tX211bHRpc2Vzc2lvbiBtc19pbmZvOworCXVuc2lnbmVkIGludCB2b2xfZGVzY19zdGFydDsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gc2ItPnNfYmRldjsKKwlpbnQgaTsKKworCXZvbF9kZXNjX3N0YXJ0PTA7CisJbXNfaW5mby5hZGRyX2Zvcm1hdD1DRFJPTV9MQkE7CisJaWYoc2Vzc2lvbiA+PSAwICYmIHNlc3Npb24gPD0gOTkpIHsKKwkJc3RydWN0IGNkcm9tX3RvY2VudHJ5IFRlOworCQlUZS5jZHRlX3RyYWNrPXNlc3Npb247CisJCVRlLmNkdGVfZm9ybWF0PUNEUk9NX0xCQTsKKwkJaSA9IGlvY3RsX2J5X2JkZXYoYmRldiwgQ0RST01SRUFEVE9DRU5UUlksICh1bnNpZ25lZCBsb25nKSAmVGUpOworCQlpZiAoIWkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJTZXNzaW9uICVkIHN0YXJ0ICVkIHR5cGUgJWRcbiIsCisJCQkgICAgICAgc2Vzc2lvbiwgVGUuY2R0ZV9hZGRyLmxiYSwKKwkJCSAgICAgICBUZS5jZHRlX2N0cmwmQ0RST01fREFUQV9UUkFDSyk7CisJCQlpZiAoKFRlLmNkdGVfY3RybCZDRFJPTV9EQVRBX1RSQUNLKSA9PSA0KQorCQkJCXJldHVybiBUZS5jZHRlX2FkZHIubGJhOworCQl9CisJCQkKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIHNlc3Npb24gbnVtYmVyIG9yIHR5cGUgb2YgdHJhY2tcbiIpOworCX0KKwlpID0gaW9jdGxfYnlfYmRldihiZGV2LCBDRFJPTU1VTFRJU0VTU0lPTiwgKHVuc2lnbmVkIGxvbmcpICZtc19pbmZvKTsKKwlpZihzZXNzaW9uID4gMCkgcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIHNlc3Npb24gbnVtYmVyXG4iKTsKKyNpZiAwCisJcHJpbnRrKCJpc29mcy5pbm9kZTogQ0RST01NVUxUSVNFU1NJT046IHJjPSVkXG4iLGkpOworCWlmIChpPT0wKSB7CisJCXByaW50aygiaXNvZnMuaW5vZGU6IFhBIGRpc2s6ICVzXG4iLG1zX2luZm8ueGFfZmxhZz8ieWVzIjoibm8iKTsKKwkJcHJpbnRrKCJpc29mcy5pbm9kZTogdm9sX2Rlc2Nfc3RhcnQgPSAlZFxuIiwgbXNfaW5mby5hZGRyLmxiYSk7CisJfQorI2VuZGlmCisJaWYgKGk9PTApCisjaWYgV0VfT0JFWV9USEVfV1JJVFRFTl9TVEFOREFSRFMKKyAgICAgICAgaWYgKG1zX2luZm8ueGFfZmxhZykgLyogbmVjZXNzYXJ5IGZvciBhIHZhbGlkIG1zX2luZm8uYWRkciAqLworI2VuZGlmCisJCXZvbF9kZXNjX3N0YXJ0PW1zX2luZm8uYWRkci5sYmE7CisJcmV0dXJuIHZvbF9kZXNjX3N0YXJ0OworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgc3VwZXJibG9jayBhbmQgcmVhZCB0aGUgcm9vdCBpbm9kZS4KKyAqCisgKiBOb3RlOiBhIGNoZWNrX2Rpc2tfY2hhbmdlKCkgaGFzIGJlZW4gZG9uZSBpbW1lZGlhdGVseSBwcmlvcgorICogdG8gdGhpcyBjYWxsLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGFnYWluLgorICovCitzdGF0aWMgaW50IGlzb2ZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBidWZmZXJfaGVhZAkgICAgICAqIGJoID0gTlVMTCwgKnByaV9iaCA9IE5VTEw7CisJc3RydWN0IGhzX3ByaW1hcnlfZGVzY3JpcHRvciAgKiBoX3ByaSA9IE5VTEw7CisJc3RydWN0IGlzb19wcmltYXJ5X2Rlc2NyaXB0b3IgKiBwcmkgPSBOVUxMOworCXN0cnVjdCBpc29fc3VwcGxlbWVudGFyeV9kZXNjcmlwdG9yICpzZWMgPSBOVUxMOworCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAgICogcm9vdHA7CisJaW50CQkJCWpvbGlldF9sZXZlbCA9IDA7CisJaW50CQkJCWlzb19ibGtudW0sIGJsb2NrOworCWludAkJCQlvcmlnX3pvbmVzaXplOworCWludAkJCQl0YWJsZTsKKwl1bnNpZ25lZCBpbnQJCQl2b2xfZGVzY19zdGFydDsKKwl1bnNpZ25lZCBsb25nCQkJZmlyc3RfZGF0YV96b25lOworCXN0cnVjdCBpbm9kZQkJICAgICAgKiBpbm9kZTsKKwlzdHJ1Y3QgaXNvOTY2MF9vcHRpb25zCQlvcHQ7CisJc3RydWN0IGlzb2ZzX3NiX2luZm8JICAgICAgKiBzYmk7CisKKwlzYmkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXNvZnNfc2JfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghc2JpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzLT5zX2ZzX2luZm8gPSBzYmk7CisJbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKHN0cnVjdCBpc29mc19zYl9pbmZvKSk7CisKKwlpZiAoIXBhcnNlX29wdGlvbnMoKGNoYXIgKikgZGF0YSwgJm9wdCkpCisJCWdvdG8gb3V0X2ZyZWVzYmk7CisKKwkvKgorCSAqIEZpcnN0IG9mIGFsbCwgZ2V0IHRoZSBoYXJkd2FyZSBibG9ja3NpemUgZm9yIHRoaXMgZGV2aWNlLgorCSAqIElmIHdlIGRvbid0IGtub3cgd2hhdCBpdCBpcywgb3IgdGhlIGhhcmR3YXJlIGJsb2Nrc2l6ZSBpcworCSAqIGxhcmdlciB0aGFuIHRoZSBibG9ja3NpemUgdGhlIHVzZXIgc3BlY2lmaWVkLCB0aGVuIHVzZQorCSAqIHRoYXQgdmFsdWUuCisJICovCisJLyoKKwkgKiBXaGF0IGlmIGJ1Z2dlciB0ZWxscyB1cyB0byBnbyBiZXlvbmQgcGFnZSBzaXplPworCSAqLworCW9wdC5ibG9ja3NpemUgPSBzYl9taW5fYmxvY2tzaXplKHMsIG9wdC5ibG9ja3NpemUpOworCisJc2JpLT5zX2hpZ2hfc2llcnJhID0gMDsgLyogZGVmYXVsdCBpcyBpc285NjYwICovCisKKwl2b2xfZGVzY19zdGFydCA9IChvcHQuc2JzZWN0b3IgIT0gLTEpID8KKwkJb3B0LnNic2VjdG9yIDogaXNvZnNfZ2V0X2xhc3Rfc2Vzc2lvbihzLG9wdC5zZXNzaW9uKTsKKworICAJZm9yIChpc29fYmxrbnVtID0gdm9sX2Rlc2Nfc3RhcnQrMTY7CisgICAgICAgICAgICAgaXNvX2Jsa251bSA8IHZvbF9kZXNjX3N0YXJ0KzEwMDsgaXNvX2Jsa251bSsrKQorCXsKKwkgICAgc3RydWN0IGhzX3ZvbHVtZV9kZXNjcmlwdG9yICAgKiBoZHA7CisJICAgIHN0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgICogdmRwOworCisJICAgIGJsb2NrID0gaXNvX2Jsa251bSA8PCAoSVNPRlNfQkxPQ0tfQklUUyAtIHMtPnNfYmxvY2tzaXplX2JpdHMpOworCSAgICBpZiAoIShiaCA9IHNiX2JyZWFkKHMsIGJsb2NrKSkpCisJCWdvdG8gb3V0X25vX3JlYWQ7CisKKwkgICAgdmRwID0gKHN0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgKiliaC0+Yl9kYXRhOworCSAgICBoZHAgPSAoc3RydWN0IGhzX3ZvbHVtZV9kZXNjcmlwdG9yICopYmgtPmJfZGF0YTsKKwkgICAgCisJICAgIC8qIER1ZSB0byB0aGUgb3ZlcmxhcHBpbmcgcGh5c2ljYWwgbG9jYXRpb24gb2YgdGhlIGRlc2NyaXB0b3JzLCAKKwkgICAgICogSVNPIENEcyBjYW4gbWF0Y2ggaGRwLT5pZD09SFNfU1RBTkRBUkRfSUQgYXMgd2VsbC4gVG8gZW5zdXJlIAorCSAgICAgKiBwcm9wZXIgaWRlbnRpZmljYXRpb24gaW4gdGhpcyBjYXNlLCB3ZSBmaXJzdCBjaGVjayBmb3IgSVNPLgorCSAgICAgKi8KKwkgICAgaWYgKHN0cm5jbXAgKHZkcC0+aWQsIElTT19TVEFOREFSRF9JRCwgc2l6ZW9mIHZkcC0+aWQpID09IDApIHsKKwkJaWYgKGlzb251bV83MTEgKHZkcC0+dHlwZSkgPT0gSVNPX1ZEX0VORCkKKwkJICAgIGJyZWFrOworCQlpZiAoaXNvbnVtXzcxMSAodmRwLT50eXBlKSA9PSBJU09fVkRfUFJJTUFSWSkgeworCQkgICAgaWYgKHByaSA9PSBOVUxMKSB7CisJCQlwcmkgPSAoc3RydWN0IGlzb19wcmltYXJ5X2Rlc2NyaXB0b3IgKil2ZHA7CisJCQkvKiBTYXZlIHRoZSBidWZmZXIgaW4gY2FzZSB3ZSBuZWVkIGl0IC4uLiAqLworCQkJcHJpX2JoID0gYmg7CisJCQliaCA9IE5VTEw7CisJCSAgICB9CisJCX0KKyNpZmRlZiBDT05GSUdfSk9MSUVUCisJCWVsc2UgaWYgKGlzb251bV83MTEgKHZkcC0+dHlwZSkgPT0gSVNPX1ZEX1NVUFBMRU1FTlRBUlkpIHsKKwkJICAgIHNlYyA9IChzdHJ1Y3QgaXNvX3N1cHBsZW1lbnRhcnlfZGVzY3JpcHRvciAqKXZkcDsKKwkJICAgIGlmIChzZWMtPmVzY2FwZVswXSA9PSAweDI1ICYmIHNlYy0+ZXNjYXBlWzFdID09IDB4MmYpIHsKKwkJCWlmIChvcHQuam9saWV0ID09ICd5JykgeworCQkJICAgIGlmIChzZWMtPmVzY2FwZVsyXSA9PSAweDQwKSB7CisJCQkJam9saWV0X2xldmVsID0gMTsKKwkJCSAgICB9IGVsc2UgaWYgKHNlYy0+ZXNjYXBlWzJdID09IDB4NDMpIHsKKwkJCQlqb2xpZXRfbGV2ZWwgPSAyOworCQkJICAgIH0gZWxzZSBpZiAoc2VjLT5lc2NhcGVbMl0gPT0gMHg0NSkgeworCQkJCWpvbGlldF9sZXZlbCA9IDM7CisJCQkgICAgfQorCQkJICAgIHByaW50ayhLRVJOX0RFQlVHIklTTyA5NjYwIEV4dGVuc2lvbnM6IE1pY3Jvc29mdCBKb2xpZXQgTGV2ZWwgJWRcbiIsCisJCQkJICAgam9saWV0X2xldmVsKTsKKwkJCX0KKwkJCWdvdG8gcm9vdF9mb3VuZDsKKwkJICAgIH0gZWxzZSB7CisJCQkvKiBVbmtub3duIHN1cHBsZW1lbnRhcnkgdm9sdW1lIGRlc2NyaXB0b3IgKi8KKwkJCXNlYyA9IE5VTEw7CisJCSAgICB9CisJCX0KKyNlbmRpZgorCSAgICB9IGVsc2UgeworCSAgICAgICAgaWYgKHN0cm5jbXAgKGhkcC0+aWQsIEhTX1NUQU5EQVJEX0lELCBzaXplb2YgaGRwLT5pZCkgPT0gMCkgeworCQkgICAgaWYgKGlzb251bV83MTEgKGhkcC0+dHlwZSkgIT0gSVNPX1ZEX1BSSU1BUlkpCisJCSAgICAgICAgZ290byBvdXRfZnJlZWJoOworCQkKKwkJICAgIHNiaS0+c19oaWdoX3NpZXJyYSA9IDE7CisJCSAgICBvcHQucm9jayA9ICduJzsKKwkJICAgIGhfcHJpID0gKHN0cnVjdCBoc19wcmltYXJ5X2Rlc2NyaXB0b3IgKil2ZHA7CisJCSAgICBnb3RvIHJvb3RfZm91bmQ7CisJCX0KKwkgICAgfQorCisgICAgICAgICAgICAvKiBKdXN0IHNraXAgYW55IHZvbHVtZSBkZXNjcmlwdG9ycyB3ZSBkb24ndCByZWNvZ25pemUgKi8KKworCSAgICBicmVsc2UoYmgpOworCSAgICBiaCA9IE5VTEw7CisJfQorCS8qCisJICogSWYgd2UgZmFsbCB0aHJvdWdoLCBlaXRoZXIgbm8gdm9sdW1lIGRlc2NyaXB0b3Igd2FzIGZvdW5kLAorCSAqIG9yIGVsc2Ugd2UgcGFzc2VkIGEgcHJpbWFyeSBkZXNjcmlwdG9yIGxvb2tpbmcgZm9yIG90aGVycy4KKwkgKi8KKwlpZiAoIXByaSkKKwkJZ290byBvdXRfdW5rbm93bl9mb3JtYXQ7CisJYnJlbHNlKGJoKTsKKwliaCA9IHByaV9iaDsKKwlwcmlfYmggPSBOVUxMOworCityb290X2ZvdW5kOgorCisJaWYgKGpvbGlldF9sZXZlbCAmJiAocHJpID09IE5VTEwgfHwgb3B0LnJvY2sgPT0gJ24nKSkgeworCSAgICAvKiBUaGlzIGlzIHRoZSBjYXNlIG9mIEpvbGlldCB3aXRoIHRoZSBub3JvY2sgbW91bnQgZmxhZy4KKwkgICAgICogQSBkaXNjIHdpdGggYm90aCBKb2xpZXQgYW5kIFJvY2sgUmlkZ2UgaXMgaGFuZGxlZCBsYXRlcgorCSAgICAgKi8KKwkgICAgcHJpID0gKHN0cnVjdCBpc29fcHJpbWFyeV9kZXNjcmlwdG9yICopIHNlYzsKKwl9CisKKwlpZihzYmktPnNfaGlnaF9zaWVycmEpeworCSAgcm9vdHAgPSAoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICopIGhfcHJpLT5yb290X2RpcmVjdG9yeV9yZWNvcmQ7CisJICBzYmktPnNfbnpvbmVzID0gaXNvbnVtXzczMyAoaF9wcmktPnZvbHVtZV9zcGFjZV9zaXplKTsKKwkgIHNiaS0+c19sb2dfem9uZV9zaXplID0gaXNvbnVtXzcyMyAoaF9wcmktPmxvZ2ljYWxfYmxvY2tfc2l6ZSk7CisJICBzYmktPnNfbWF4X3NpemUgPSBpc29udW1fNzMzKGhfcHJpLT52b2x1bWVfc3BhY2Vfc2l6ZSk7CisJfSBlbHNlIHsKKwkgIGlmICghcHJpKQorCSAgICBnb3RvIG91dF9mcmVlYmg7CisJICByb290cCA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKikgcHJpLT5yb290X2RpcmVjdG9yeV9yZWNvcmQ7CisJICBzYmktPnNfbnpvbmVzID0gaXNvbnVtXzczMyAocHJpLT52b2x1bWVfc3BhY2Vfc2l6ZSk7CisJICBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9IGlzb251bV83MjMgKHByaS0+bG9naWNhbF9ibG9ja19zaXplKTsKKwkgIHNiaS0+c19tYXhfc2l6ZSA9IGlzb251bV83MzMocHJpLT52b2x1bWVfc3BhY2Vfc2l6ZSk7CisJfQorCisJc2JpLT5zX25pbm9kZXMgPSAwOyAvKiBObyB3YXkgdG8gZmlndXJlIHRoaXMgb3V0IGVhc2lseSAqLworCisJb3JpZ196b25lc2l6ZSA9IHNiaS0+c19sb2dfem9uZV9zaXplOworCS8qCisJICogSWYgdGhlIHpvbmUgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIGhhcmR3YXJlIHNlY3RvciBzaXplLAorCSAqIHRoaXMgaXMgYSBmYXRhbCBlcnJvci4gIFRoaXMgd291bGQgb2NjdXIgaWYgdGhlIGRpc2MgZHJpdmUKKwkgKiBoYWQgc2VjdG9ycyB0aGF0IHdlcmUgMjA0OCBieXRlcywgYnV0IHRoZSBmaWxlc3lzdGVtIGhhZAorCSAqIGJsb2NrcyB0aGF0IHdlcmUgNTEyIGJ5dGVzICh3aGljaCBzaG91bGQgb25seSB2ZXJ5IHJhcmVseQorCSAqIGhhcHBlbi4pCisJICovCisJaWYob3JpZ196b25lc2l6ZSA8IG9wdC5ibG9ja3NpemUpCisJCWdvdG8gb3V0X2JhZF9zaXplOworCisJLyogUkRFOiBjb252ZXJ0IGxvZyB6b25lIHNpemUgdG8gYml0IHNoaWZ0ICovCisJc3dpdGNoIChzYmktPnNfbG9nX3pvbmVfc2l6ZSkKKwkgIHsgY2FzZSAgNTEyOiBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9ICA5OyBicmVhazsKKwkgICAgY2FzZSAxMDI0OiBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9IDEwOyBicmVhazsKKwkgICAgY2FzZSAyMDQ4OiBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9IDExOyBicmVhazsKKworCSAgICBkZWZhdWx0OgorCQlnb3RvIG91dF9iYWRfem9uZV9zaXplOworCSAgfQorCisJcy0+c19tYWdpYyA9IElTT0ZTX1NVUEVSX01BR0lDOworCXMtPnNfbWF4Ynl0ZXMgPSAweGZmZmZmZmZmOyAvKiBXZSBjYW4gaGFuZGxlIGZpbGVzIHVwIHRvIDQgR0IgKi8KKworCS8qIFRoZSBDRFJPTSBpcyByZWFkLW9ubHksIGhhcyBubyBub2RlcyAoZGV2aWNlcykgb24gaXQsIGFuZCBzaW5jZQorCSAgIGFsbCBvZiB0aGUgZmlsZXMgYXBwZWFyIHRvIGJlIG93bmVkIGJ5IHJvb3QsIHdlIHJlYWxseSBkbyBub3Qgd2FudAorCSAgIHRvIGFsbG93IHN1aWQuICAoc3VpZCBvciBkZXZpY2VzIHdpbGwgbm90IHNob3cgdXAgdW5sZXNzIHdlIGhhdmUKKwkgICBSb2NrIFJpZGdlIGV4dGVuc2lvbnMpICovCisKKwlzLT5zX2ZsYWdzIHw9IE1TX1JET05MWSAvKiB8IE1TX05PREVWIHwgTVNfTk9TVUlEICovOworCisJLyogU2V0IHRoaXMgZm9yIHJlZmVyZW5jZS4gSXRzIG5vdCBjdXJyZW50bHkgdXNlZCBleGNlcHQgb24gd3JpdGUKKwkgICB3aGljaCB3ZSBkb24ndCBoYXZlIC4uICovCisJICAgCisJZmlyc3RfZGF0YV96b25lID0gaXNvbnVtXzczMyAocm9vdHAtPmV4dGVudCkgKworCQkJICBpc29udW1fNzExIChyb290cC0+ZXh0X2F0dHJfbGVuZ3RoKTsKKwlzYmktPnNfZmlyc3RkYXRhem9uZSA9IGZpcnN0X2RhdGFfem9uZTsKKyNpZm5kZWYgQkVRVUlFVAorCXByaW50ayhLRVJOX0RFQlVHICJNYXggc2l6ZTolbGQgICBMb2cgem9uZSBzaXplOiVsZFxuIiwKKwkgICAgICAgc2JpLT5zX21heF9zaXplLAorCSAgICAgICAxVUwgPDwgc2JpLT5zX2xvZ196b25lX3NpemUpOworCXByaW50ayhLRVJOX0RFQlVHICJGaXJzdCBkYXRhem9uZTolbGRcbiIsIHNiaS0+c19maXJzdGRhdGF6b25lKTsKKwlpZihzYmktPnNfaGlnaF9zaWVycmEpCisJCXByaW50ayhLRVJOX0RFQlVHICJEaXNjIGluIEhpZ2ggU2llcnJhIGZvcm1hdC5cbiIpOworI2VuZGlmCisKKwkvKgorCSAqIElmIHRoZSBKb2xpZXQgbGV2ZWwgaXMgc2V0LCB3ZSBfbWF5XyBkZWNpZGUgdG8gdXNlIHRoZQorCSAqIHNlY29uZGFyeSBkZXNjcmlwdG9yLCBidXQgY2FuJ3QgYmUgc3VyZSB1bnRpbCBhZnRlciB3ZQorCSAqIHJlYWQgdGhlIHJvb3QgaW5vZGUuIEJ1dCBiZWZvcmUgcmVhZGluZyB0aGUgcm9vdCBpbm9kZQorCSAqIHdlIG1heSBuZWVkIHRvIGNoYW5nZSB0aGUgZGV2aWNlIGJsb2Nrc2l6ZSwgYW5kIHdvdWxkCisJICogcmF0aGVyIHJlbGVhc2UgdGhlIG9sZCBidWZmZXIgZmlyc3QuIFNvLCB3ZSBjYWNoZSB0aGUKKwkgKiBmaXJzdF9kYXRhX3pvbmUgdmFsdWUgZnJvbSB0aGUgc2Vjb25kYXJ5IGRlc2NyaXB0b3IuCisJICovCisJaWYgKGpvbGlldF9sZXZlbCkgeworCQlwcmkgPSAoc3RydWN0IGlzb19wcmltYXJ5X2Rlc2NyaXB0b3IgKikgc2VjOworCQlyb290cCA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKikKKwkJCXByaS0+cm9vdF9kaXJlY3RvcnlfcmVjb3JkOworCQlmaXJzdF9kYXRhX3pvbmUgPSBpc29udW1fNzMzIChyb290cC0+ZXh0ZW50KSArCisJCQkgIAlpc29udW1fNzExIChyb290cC0+ZXh0X2F0dHJfbGVuZ3RoKTsKKwl9CisKKwkvKgorCSAqIFdlJ3JlIGFsbCBkb25lIHVzaW5nIHRoZSB2b2x1bWUgZGVzY3JpcHRvciwgYW5kIG1heSBuZWVkCisJICogdG8gY2hhbmdlIHRoZSBkZXZpY2UgYmxvY2tzaXplLCBzbyByZWxlYXNlIHRoZSBidWZmZXIgbm93LgorCSAqLworCWJyZWxzZShwcmlfYmgpOworCWJyZWxzZShiaCk7CisKKwkvKgorCSAqIEZvcmNlIHRoZSBibG9ja3NpemUgdG8gNTEyIGZvciA1MTIgYnl0ZSBzZWN0b3JzLiAgVGhlIGZpbGUKKwkgKiByZWFkIHByaW1pdGl2ZXMgcmVhbGx5IGdldCBpdCB3cm9uZyBpbiBhIGJhZCB3YXkgaWYgd2UgZG9uJ3QKKwkgKiBkbyB0aGlzLgorCSAqCisJICogTm90ZSAtIHdlIHNob3VsZCBuZXZlciBiZSBzZXR0aW5nIHRoZSBibG9ja3NpemUgdG8gc29tZXRoaW5nCisJICogbGVzcyB0aGFuIHRoZSBoYXJkd2FyZSBzZWN0b3Igc2l6ZSBmb3IgdGhlIGRldmljZS4gIElmIHdlCisJICogZG8sIHdlIHdvdWxkIGVuZCB1cCBoYXZpbmcgdG8gcmVhZCBsYXJnZXIgYnVmZmVycyBhbmQgc3BsaXQKKwkgKiBvdXQgcG9ydGlvbnMgdG8gc2F0aXNmeSByZXF1ZXN0cy4KKwkgKgorCSAqIE5vdGUyLSB0aGUgaWRlYSBoZXJlIGlzIHRoYXQgd2Ugd2FudCB0byBkZWFsIHdpdGggdGhlIG9wdGltYWwKKwkgKiB6b25lc2l6ZSBpbiB0aGUgZmlsZXN5c3RlbS4gIElmIHdlIGhhdmUgaXQgc2V0IHRvIHNvbWV0aGluZyBsZXNzLAorCSAqIHRoZW4gd2UgaGF2ZSBob3JyaWJsZSBwcm9ibGVtcyB3aXRoIHRyeWluZyB0byBwaWVjZSB0b2dldGhlcgorCSAqIGJpdHMgb2YgYWRqYWNlbnQgYmxvY2tzIGluIG9yZGVyIHRvIHByb3Blcmx5IHJlYWQgZGlyZWN0b3J5CisJICogZW50cmllcy4gIEJ5IGZvcmNpbmcgdGhlIGJsb2Nrc2l6ZSBpbiB0aGlzIHdheSwgd2UgZW5zdXJlCisJICogdGhhdCB3ZSB3aWxsIG5ldmVyIGJlIHJlcXVpcmVkIHRvIGRvIHRoaXMuCisJICovCisJc2Jfc2V0X2Jsb2Nrc2l6ZShzLCBvcmlnX3pvbmVzaXplKTsKKworCXNiaS0+c19ubHNfaW9jaGFyc2V0ID0gTlVMTDsKKworI2lmZGVmIENPTkZJR19KT0xJRVQKKwlpZiAoam9saWV0X2xldmVsICYmIG9wdC51dGY4ID09IDApIHsKKwkJY2hhciAqIHAgPSBvcHQuaW9jaGFyc2V0ID8gb3B0LmlvY2hhcnNldCA6IENPTkZJR19OTFNfREVGQVVMVDsKKwkJc2JpLT5zX25sc19pb2NoYXJzZXQgPSBsb2FkX25scyhwKTsKKwkJaWYgKCEgc2JpLT5zX25sc19pb2NoYXJzZXQpIHsKKwkJCS8qIEZhaWwgb25seSBpZiBleHBsaWNpdCBjaGFyc2V0IHNwZWNpZmllZCAqLworCQkJaWYgKG9wdC5pb2NoYXJzZXQpCisJCQkJZ290byBvdXRfZnJlZXNiaTsKKwkJCXNiaS0+c19ubHNfaW9jaGFyc2V0ID0gbG9hZF9ubHNfZGVmYXVsdCgpOworCQl9CisJfQorI2VuZGlmCisJcy0+c19vcCA9ICZpc29mc19zb3BzOworCXMtPnNfZXhwb3J0X29wID0gJmlzb2ZzX2V4cG9ydF9vcHM7CisJc2JpLT5zX21hcHBpbmcgPSBvcHQubWFwOworCXNiaS0+c19yb2NrID0gKG9wdC5yb2NrID09ICd5JyA/IDIgOiAwKTsKKwlzYmktPnNfcm9ja19vZmZzZXQgPSAtMTsgLyogaW5pdGlhbCBvZmZzZXQsIHdpbGwgZ3Vlc3MgdW50aWwgU1AgaXMgZm91bmQqLworCXNiaS0+c19jcnVmdCA9IG9wdC5jcnVmdDsKKwlzYmktPnNfdW5oaWRlID0gb3B0LnVuaGlkZTsKKwlzYmktPnNfdWlkID0gb3B0LnVpZDsKKwlzYmktPnNfZ2lkID0gb3B0LmdpZDsKKwlzYmktPnNfdXRmOCA9IG9wdC51dGY4OworCXNiaS0+c19ub2NvbXByZXNzID0gb3B0Lm5vY29tcHJlc3M7CisJLyoKKwkgKiBJdCB3b3VsZCBiZSBpbmNyZWRpYmx5IHN0dXBpZCB0byBhbGxvdyBwZW9wbGUgdG8gbWFyayBldmVyeSBmaWxlCisJICogb24gdGhlIGRpc2sgYXMgc3VpZCwgc28gd2UgbWVyZWx5IGFsbG93IHRoZW0gdG8gc2V0IHRoZSBkZWZhdWx0CisJICogcGVybWlzc2lvbnMuCisJICovCisJc2JpLT5zX21vZGUgPSBvcHQubW9kZSAmIDA3Nzc7CisKKwkvKgorCSAqIFJlYWQgdGhlIHJvb3QgaW5vZGUsIHdoaWNoIF9tYXlfIHJlc3VsdCBpbiBjaGFuZ2luZworCSAqIHRoZSBzX3JvY2sgZmxhZy4gT25jZSB3ZSBoYXZlIHRoZSBmaW5hbCBzX3JvY2sgdmFsdWUsCisJICogd2UgdGhlbiBkZWNpZGUgd2hldGhlciB0byB1c2UgdGhlIEpvbGlldCBkZXNjcmlwdG9yLgorCSAqLworCWlub2RlID0gaXNvZnNfaWdldChzLCBzYmktPnNfZmlyc3RkYXRhem9uZSwgMCk7CisKKwkvKgorCSAqIElmIHRoaXMgZGlzayBoYXMgYm90aCBSb2NrIFJpZGdlIGFuZCBKb2xpZXQgb24gaXQsIHRoZW4gd2UKKwkgKiB3YW50IHRvIHVzZSBSb2NrIFJpZGdlIGJ5IGRlZmF1bHQuICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuCisJICogYnkgdXNpbmcgdGhlIG5vcm9jayBtb3VudCBvcHRpb24uICBUaGVyZSBpcyBzdGlsbCBvbmUgb3RoZXIKKwkgKiBwb3NzaWJpbGl0eSB0aGF0IGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQ6IGEgUm9jayBSaWRnZQorCSAqIENEIHdpdGggVW5pY29kZSBuYW1lcy4gIFVudGlsIHNvbWVvbmUgc2VlcyBzdWNoIGEgYmVhc3QsIGl0CisJICogd2lsbCBub3QgYmUgc3VwcG9ydGVkLgorCSAqLworCWlmIChzYmktPnNfcm9jayA9PSAxKSB7CisJCWpvbGlldF9sZXZlbCA9IDA7CisJfSBlbHNlIGlmIChqb2xpZXRfbGV2ZWwpIHsKKwkJc2JpLT5zX3JvY2sgPSAwOworCQlpZiAoc2JpLT5zX2ZpcnN0ZGF0YXpvbmUgIT0gZmlyc3RfZGF0YV96b25lKSB7CisJCQlzYmktPnNfZmlyc3RkYXRhem9uZSA9IGZpcnN0X2RhdGFfem9uZTsKKwkJCXByaW50ayhLRVJOX0RFQlVHIAorCQkJCSJJU09GUzogY2hhbmdpbmcgdG8gc2Vjb25kYXJ5IHJvb3RcbiIpOworCQkJaXB1dChpbm9kZSk7CisJCQlpbm9kZSA9IGlzb2ZzX2lnZXQocywgc2JpLT5zX2ZpcnN0ZGF0YXpvbmUsIDApOworCQl9CisJfQorCisJaWYgKG9wdC5jaGVjayA9PSAndScpIHsKKwkJLyogT25seSBKb2xpZXQgaXMgY2FzZSBpbnNlbnNpdGl2ZSBieSBkZWZhdWx0ICovCisJCWlmIChqb2xpZXRfbGV2ZWwpIG9wdC5jaGVjayA9ICdyJzsKKwkJZWxzZSBvcHQuY2hlY2sgPSAncyc7CisJfQorCXNiaS0+c19qb2xpZXRfbGV2ZWwgPSBqb2xpZXRfbGV2ZWw7CisKKwkvKiBjaGVjayB0aGUgcm9vdCBpbm9kZSAqLworCWlmICghaW5vZGUpCisJCWdvdG8gb3V0X25vX3Jvb3Q7CisJaWYgKCFpbm9kZS0+aV9vcCkKKwkJZ290byBvdXRfYmFkX3Jvb3Q7CisJLyogZ2V0IHRoZSByb290IGRlbnRyeSAqLworCXMtPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChpbm9kZSk7CisJaWYgKCEocy0+c19yb290KSkKKwkJZ290byBvdXRfbm9fcm9vdDsKKworCXRhYmxlID0gMDsKKwlpZiAoam9saWV0X2xldmVsKSB0YWJsZSArPSAyOworCWlmIChvcHQuY2hlY2sgPT0gJ3InKSB0YWJsZSsrOworCXMtPnNfcm9vdC0+ZF9vcCA9ICZpc29mc19kZW50cnlfb3BzW3RhYmxlXTsKKworCWlmIChvcHQuaW9jaGFyc2V0KQorCQlrZnJlZShvcHQuaW9jaGFyc2V0KTsKKworCXJldHVybiAwOworCisJLyoKKwkgKiBEaXNwbGF5IGVycm9yIG1lc3NhZ2VzIGFuZCBmcmVlIHJlc291cmNlcy4KKwkgKi8KK291dF9iYWRfcm9vdDoKKwlwcmludGsoS0VSTl9XQVJOSU5HICJpc29mc19maWxsX3N1cGVyOiByb290IGlub2RlIG5vdCBpbml0aWFsaXplZFxuIik7CisJZ290byBvdXRfaXB1dDsKK291dF9ub19yb290OgorCXByaW50ayhLRVJOX1dBUk5JTkcgImlzb2ZzX2ZpbGxfc3VwZXI6IGdldCByb290IGlub2RlIGZhaWxlZFxuIik7CitvdXRfaXB1dDoKKwlpcHV0KGlub2RlKTsKKyNpZmRlZiBDT05GSUdfSk9MSUVUCisJaWYgKHNiaS0+c19ubHNfaW9jaGFyc2V0KQorCQl1bmxvYWRfbmxzKHNiaS0+c19ubHNfaW9jaGFyc2V0KTsKKyNlbmRpZgorCWdvdG8gb3V0X2ZyZWVzYmk7CitvdXRfbm9fcmVhZDoKKwlwcmludGsoS0VSTl9XQVJOSU5HICJpc29mc19maWxsX3N1cGVyOiAiCisJCSJicmVhZCBmYWlsZWQsIGRldj0lcywgaXNvX2Jsa251bT0lZCwgYmxvY2s9JWRcbiIsCisJCXMtPnNfaWQsIGlzb19ibGtudW0sIGJsb2NrKTsKKwlnb3RvIG91dF9mcmVlc2JpOworb3V0X2JhZF96b25lX3NpemU6CisJcHJpbnRrKEtFUk5fV0FSTklORyAiQmFkIGxvZ2ljYWwgem9uZSBzaXplICVsZFxuIiwKKwkJc2JpLT5zX2xvZ196b25lX3NpemUpOworCWdvdG8gb3V0X2ZyZWViaDsKK291dF9iYWRfc2l6ZToKKwlwcmludGsoS0VSTl9XQVJOSU5HICJMb2dpY2FsIHpvbmUgc2l6ZSglZCkgPCBoYXJkd2FyZSBibG9ja3NpemUoJXUpXG4iLAorCQlvcmlnX3pvbmVzaXplLCBvcHQuYmxvY2tzaXplKTsKKwlnb3RvIG91dF9mcmVlYmg7CitvdXRfdW5rbm93bl9mb3JtYXQ6CisJaWYgKCFzaWxlbnQpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBpZGVudGlmeSBDRC1ST00gZm9ybWF0LlxuIik7CisKK291dF9mcmVlYmg6CisJYnJlbHNlKGJoKTsKK291dF9mcmVlc2JpOgorCWlmIChvcHQuaW9jaGFyc2V0KQorCQlrZnJlZShvcHQuaW9jaGFyc2V0KTsKKwlrZnJlZShzYmkpOworCXMtPnNfZnNfaW5mbyA9IE5VTEw7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgaXNvZnNfc3RhdGZzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCWJ1Zi0+Zl90eXBlID0gSVNPRlNfU1VQRVJfTUFHSUM7CisJYnVmLT5mX2JzaXplID0gc2ItPnNfYmxvY2tzaXplOworCWJ1Zi0+Zl9ibG9ja3MgPSAoSVNPRlNfU0Ioc2IpLT5zX256b25lcworICAgICAgICAgICAgICAgICAgPDwgKElTT0ZTX1NCKHNiKS0+c19sb2dfem9uZV9zaXplIC0gc2ItPnNfYmxvY2tzaXplX2JpdHMpKTsKKwlidWYtPmZfYmZyZWUgPSAwOworCWJ1Zi0+Zl9iYXZhaWwgPSAwOworCWJ1Zi0+Zl9maWxlcyA9IElTT0ZTX1NCKHNiKS0+c19uaW5vZGVzOworCWJ1Zi0+Zl9mZnJlZSA9IDA7CisJYnVmLT5mX25hbWVsZW4gPSBOQU1FX01BWDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdldCBhIHNldCBvZiBibG9ja3M7IGZpbGxpbmcgaW4gYnVmZmVyX2hlYWRzIGlmIGFscmVhZHkgYWxsb2NhdGVkCisgKiBvciBnZXRibGsoKSBpZiB0aGV5IGFyZSBub3QuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYmxvY2tzIGluc2VydGVkCisgKiAoMCA9PSBlcnJvci4pCisgKi8KK2ludCBpc29mc19nZXRfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9ja19zLAorCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpCit7CisJdW5zaWduZWQgbG9uZyBiX29mZjsKKwl1bnNpZ25lZCBvZmZzZXQsIHNlY3Rfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZmlyc3RleHQ7CisJdW5zaWduZWQgbG9uZyBuZXh0YmxrLCBuZXh0b2ZmOworCWxvbmcgaWJsb2NrID0gKGxvbmcpaWJsb2NrX3M7CisJaW50IHNlY3Rpb24sIHJ2OworCXN0cnVjdCBpc29faW5vZGVfaW5mbyAqZWkgPSBJU09GU19JKGlub2RlKTsKKworCWxvY2tfa2VybmVsKCk7CisKKwlydiA9IDA7CisJaWYgKGlibG9jayA8IDAgfHwgaWJsb2NrICE9IGlibG9ja19zKSB7CisJCXByaW50aygiaXNvZnNfZ2V0X2Jsb2NrczogYmxvY2sgbnVtYmVyIHRvbyBsYXJnZVxuIik7CisJCWdvdG8gYWJvcnQ7CisJfQorCisJYl9vZmYgPSBpYmxvY2s7CisJCisJb2Zmc2V0ICAgID0gMDsKKwlmaXJzdGV4dCAgPSBlaS0+aV9maXJzdF9leHRlbnQ7CisJc2VjdF9zaXplID0gZWktPmlfc2VjdGlvbl9zaXplID4+IElTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKTsKKwluZXh0YmxrICAgPSBlaS0+aV9uZXh0X3NlY3Rpb25fYmxvY2s7CisJbmV4dG9mZiAgID0gZWktPmlfbmV4dF9zZWN0aW9uX29mZnNldDsKKwlzZWN0aW9uICAgPSAwOworCisJd2hpbGUgKCBuYmxvY2tzICkgeworCQkvKiBJZiB3ZSBhcmUgKndheSogYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGUsIHByaW50IGEgbWVzc2FnZS4KKwkJICogQWNjZXNzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlIHVwIHRvIHRoZSBuZXh0IHBhZ2UgYm91bmRhcnkKKwkJICogaXMgbm9ybWFsLCBob3dldmVyIGJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgcGFnZSBjYWNoZSB3b3Jrcy4KKwkJICogSW4gdGhpcyBjYXNlLCB3ZSBqdXN0IHJldHVybiAwIHNvIHRoYXQgd2UgY2FuIHByb3Blcmx5IGZpbGwKKwkJICogdGhlIHBhZ2Ugd2l0aCB1c2VsZXNzIGluZm9ybWF0aW9uIHdpdGhvdXQgZ2VuZXJhdGluZyBhbnkKKwkJICogSS9PIGVycm9ycy4KKwkJICovCisJCWlmIChiX29mZiA+ICgoaW5vZGUtPmlfc2l6ZSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IElTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKSkpIHsKKwkJCXByaW50aygiaXNvZnNfZ2V0X2Jsb2NrczogYmxvY2sgPj0gRU9GICglbGQsICVsZClcbiIsCisJCQkgICAgICAgaWJsb2NrLCAodW5zaWduZWQgbG9uZykgaW5vZGUtPmlfc2l6ZSk7CisJCQlnb3RvIGFib3J0OworCQl9CisJCQorCQlpZiAobmV4dGJsaykgeworCQkJd2hpbGUgKGJfb2ZmID49IChvZmZzZXQgKyBzZWN0X3NpemUpKSB7CisJCQkJc3RydWN0IGlub2RlICpuaW5vZGU7CisJCQkJCisJCQkJb2Zmc2V0ICs9IHNlY3Rfc2l6ZTsKKwkJCQlpZiAobmV4dGJsayA9PSAwKQorCQkJCQlnb3RvIGFib3J0OworCQkJCW5pbm9kZSA9IGlzb2ZzX2lnZXQoaW5vZGUtPmlfc2IsIG5leHRibGssIG5leHRvZmYpOworCQkJCWlmICghbmlub2RlKQorCQkJCQlnb3RvIGFib3J0OworCQkJCWZpcnN0ZXh0ICA9IElTT0ZTX0kobmlub2RlKS0+aV9maXJzdF9leHRlbnQ7CisJCQkJc2VjdF9zaXplID0gSVNPRlNfSShuaW5vZGUpLT5pX3NlY3Rpb25fc2l6ZSA+PiBJU09GU19CVUZGRVJfQklUUyhuaW5vZGUpOworCQkJCW5leHRibGsgICA9IElTT0ZTX0kobmlub2RlKS0+aV9uZXh0X3NlY3Rpb25fYmxvY2s7CisJCQkJbmV4dG9mZiAgID0gSVNPRlNfSShuaW5vZGUpLT5pX25leHRfc2VjdGlvbl9vZmZzZXQ7CisJCQkJaXB1dChuaW5vZGUpOworCQkJCQorCQkJCWlmICgrK3NlY3Rpb24gPiAxMDApIHsKKwkJCQkJcHJpbnRrKCJpc29mc19nZXRfYmxvY2tzOiBNb3JlIHRoYW4gMTAwIGZpbGUgc2VjdGlvbnMgPyE/LCBhYm9ydGluZy4uLlxuIik7CisJCQkJCXByaW50aygiaXNvZnNfZ2V0X2Jsb2NrczogYmxvY2s9JWxkIGZpcnN0ZXh0PSV1IHNlY3Rfc2l6ZT0ldSAiCisJCQkJCSAgICAgICAibmV4dGJsaz0lbHUgbmV4dG9mZj0lbHVcbiIsCisJCQkJCSAgICAgICBpYmxvY2ssIGZpcnN0ZXh0LCAodW5zaWduZWQpIHNlY3Rfc2l6ZSwKKwkJCQkJICAgICAgIG5leHRibGssIG5leHRvZmYpOworCQkJCQlnb3RvIGFib3J0OworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJaWYgKCAqYmggKSB7CisJCQltYXBfYmgoKmJoLCBpbm9kZS0+aV9zYiwgZmlyc3RleHQgKyBiX29mZiAtIG9mZnNldCk7CisJCX0gZWxzZSB7CisJCQkqYmggPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsIGZpcnN0ZXh0K2Jfb2ZmLW9mZnNldCk7CisJCQlpZiAoICEqYmggKQorCQkJCWdvdG8gYWJvcnQ7CisJCX0KKwkJYmgrKzsJLyogTmV4dCBidWZmZXIgaGVhZCAqLworCQliX29mZisrOwkvKiBOZXh0IGJ1ZmZlciBvZmZzZXQgKi8KKwkJbmJsb2Nrcy0tOworCQlydisrOworCX0KKworCithYm9ydDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJ2OworfQorCisvKgorICogVXNlZCBieSB0aGUgc3RhbmRhcmQgaW50ZXJmYWNlcy4KKyAqLworc3RhdGljIGludCBpc29mc19nZXRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgaWJsb2NrLAorCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJaWYgKCBjcmVhdGUgKSB7CisJCXByaW50aygiaXNvZnNfZ2V0X2Jsb2NrOiBLZXJuZWwgdHJpZXMgdG8gYWxsb2NhdGUgYSBibG9ja1xuIik7CisJCXJldHVybiAtRVJPRlM7CisJfQorCisJcmV0dXJuIGlzb2ZzX2dldF9ibG9ja3MoaW5vZGUsIGlibG9jaywgJmJoX3Jlc3VsdCwgMSkgPyAwIDogLUVJTzsKK30KKworc3RhdGljIGludCBpc29mc19ibWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGJsb2NrKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCBkdW1teTsKKwlpbnQgZXJyb3I7CisKKwlkdW1teS5iX3N0YXRlID0gMDsKKwlkdW1teS5iX2Jsb2NrbnIgPSAtMTAwMDsKKwllcnJvciA9IGlzb2ZzX2dldF9ibG9jayhpbm9kZSwgYmxvY2ssICZkdW1teSwgMCk7CisJaWYgKCFlcnJvcikKKwkJcmV0dXJuIGR1bW15LmJfYmxvY2tucjsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGJ1ZmZlcl9oZWFkICppc29mc19icmVhZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBibG9jaykKK3sKKwlzZWN0b3JfdCBibGtuciA9IGlzb2ZzX2JtYXAoaW5vZGUsIGJsb2NrKTsKKwlpZiAoIWJsa25yKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIGJsa25yKTsKK30KKworc3RhdGljIGludCBpc29mc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlKHBhZ2UsaXNvZnNfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIHNlY3Rvcl90IF9pc29mc19ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jaykKK3sKKwlyZXR1cm4gZ2VuZXJpY19ibG9ja19ibWFwKG1hcHBpbmcsYmxvY2ssaXNvZnNfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgaXNvZnNfYW9wcyA9IHsKKwkucmVhZHBhZ2UgPSBpc29mc19yZWFkcGFnZSwKKwkuc3luY19wYWdlID0gYmxvY2tfc3luY19wYWdlLAorCS5ibWFwID0gX2lzb2ZzX2JtYXAKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZXN0X2FuZF9zZXRfdWlkKHVpZF90ICpwLCB1aWRfdCB2YWx1ZSkKK3sKKwlpZih2YWx1ZSkgeworCQkqcCA9IHZhbHVlOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRlc3RfYW5kX3NldF9naWQoZ2lkX3QgKnAsIGdpZF90IHZhbHVlKQoreworICAgICAgICBpZih2YWx1ZSkgeworICAgICAgICAgICAgICAgICpwID0gdmFsdWU7CisgICAgICAgIH0KK30KKworc3RhdGljIGludCBpc29mc19yZWFkX2xldmVsM19zaXplKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXVuc2lnbmVkIGxvbmcgYnVmc2l6ZSA9IElTT0ZTX0JVRkZFUl9TSVpFKGlub2RlKTsKKwlpbnQgaGlnaF9zaWVycmEgPSBJU09GU19TQihpbm9kZS0+aV9zYiktPnNfaGlnaF9zaWVycmE7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgYmxvY2ssIG9mZnNldCwgYmxvY2tfc2F2ZWQsIG9mZnNldF9zYXZlZDsKKwlpbnQgaSA9IDA7CisJaW50IG1vcmVfZW50cmllcyA9IDA7CisJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogdG1wZGUgPSBOVUxMOworCXN0cnVjdCBpc29faW5vZGVfaW5mbyAqZWkgPSBJU09GU19JKGlub2RlKTsKKworCWlub2RlLT5pX3NpemUgPSAwOworCisJLyogVGhlIGZpcnN0IDE2IGJsb2NrcyBhcmUgcmVzZXJ2ZWQgYXMgdGhlIFN5c3RlbSBBcmVhLiAgVGh1cywKKwkgKiBubyBpbm9kZXMgY2FuIGFwcGVhciBpbiBibG9jayAwLiAgV2UgdXNlIHRoaXMgdG8gZmxhZyB0aGF0CisJICogdGhpcyBpcyB0aGUgbGFzdCBzZWN0aW9uLiAqLworCWVpLT5pX25leHRfc2VjdGlvbl9ibG9jayA9IDA7CisJZWktPmlfbmV4dF9zZWN0aW9uX29mZnNldCA9IDA7CisKKwlibG9jayA9IGVpLT5pX2lnZXQ1X2Jsb2NrOworCW9mZnNldCA9IGVpLT5pX2lnZXQ1X29mZnNldDsKKworCWRvIHsKKwkJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogZGU7CisJCXVuc2lnbmVkIGludCBkZV9sZW47CisKKwkJaWYgKCFiaCkgeworCQkJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgYmxvY2spOworCQkJaWYgKCFiaCkKKwkJCQlnb3RvIG91dF9ub3JlYWQ7CisJCX0KKwkJZGUgPSAoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICopIChiaC0+Yl9kYXRhICsgb2Zmc2V0KTsKKwkJZGVfbGVuID0gKih1bnNpZ25lZCBjaGFyICopIGRlOworCisJCWlmIChkZV9sZW4gPT0gMCkgeworCQkJYnJlbHNlKGJoKTsKKwkJCWJoID0gTlVMTDsKKwkJCSsrYmxvY2s7CisJCQlvZmZzZXQgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlibG9ja19zYXZlZCA9IGJsb2NrOworCQlvZmZzZXRfc2F2ZWQgPSBvZmZzZXQ7CisJCW9mZnNldCArPSBkZV9sZW47CisKKwkJLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBmdWxsIGRpcmVjdG9yeSBlbnRyeSAqLworCQlpZiAob2Zmc2V0ID49IGJ1ZnNpemUpIHsKKwkJCWludCBzbG9wID0gYnVmc2l6ZSAtIG9mZnNldCArIGRlX2xlbjsKKwkJCWlmICghdG1wZGUpIHsKKwkJCQl0bXBkZSA9IGttYWxsb2MoMjU2LCBHRlBfS0VSTkVMKTsKKwkJCQlpZiAoIXRtcGRlKQorCQkJCQlnb3RvIG91dF9ub21lbTsKKwkJCX0KKwkJCW1lbWNweSh0bXBkZSwgZGUsIHNsb3ApOworCQkJb2Zmc2V0ICY9IGJ1ZnNpemUgLSAxOworCQkJYmxvY2srKzsKKwkJCWJyZWxzZShiaCk7CisJCQliaCA9IE5VTEw7CisJCQlpZiAob2Zmc2V0KSB7CisJCQkJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgYmxvY2spOworCQkJCWlmICghYmgpCisJCQkJCWdvdG8gb3V0X25vcmVhZDsKKwkJCQltZW1jcHkoKHZvaWQgKikgdG1wZGUgKyBzbG9wLCBiaC0+Yl9kYXRhLCBvZmZzZXQpOworCQkJfQorCQkJZGUgPSB0bXBkZTsKKwkJfQorCisJCWlub2RlLT5pX3NpemUgKz0gaXNvbnVtXzczMyhkZS0+c2l6ZSk7CisJCWlmIChpID09IDEpIHsKKwkJCWVpLT5pX25leHRfc2VjdGlvbl9ibG9jayA9IGJsb2NrX3NhdmVkOworCQkJZWktPmlfbmV4dF9zZWN0aW9uX29mZnNldCA9IG9mZnNldF9zYXZlZDsKKwkJfQorCisJCW1vcmVfZW50cmllcyA9IGRlLT5mbGFnc1staGlnaF9zaWVycmFdICYgMHg4MDsKKworCQlpKys7CisJCWlmKGkgPiAxMDApCisJCQlnb3RvIG91dF90b29tYW55OworCX0gd2hpbGUobW9yZV9lbnRyaWVzKTsKK291dDoKKwlpZiAodG1wZGUpCisJCWtmcmVlKHRtcGRlKTsKKwlpZiAoYmgpCisJCWJyZWxzZShiaCk7CisJcmV0dXJuIDA7CisKK291dF9ub21lbToKKwlpZiAoYmgpCisJCWJyZWxzZShiaCk7CisJcmV0dXJuIC1FTk9NRU07CisKK291dF9ub3JlYWQ6CisJcHJpbnRrKEtFUk5fSU5GTyAiSVNPRlM6IHVuYWJsZSB0byByZWFkIGktbm9kZSBibG9jayAlbHVcbiIsIGJsb2NrKTsKKwlpZiAodG1wZGUpCisJCWtmcmVlKHRtcGRlKTsKKwlyZXR1cm4gLUVJTzsKKworb3V0X3Rvb21hbnk6CisJcHJpbnRrKEtFUk5fSU5GTyAiaXNvZnNfcmVhZF9sZXZlbDNfc2l6ZTogIgorCQkiTW9yZSB0aGFuIDEwMCBmaWxlIHNlY3Rpb25zID8hPywgYWJvcnRpbmcuLi5cbiIKKwkgIAkiaXNvZnNfcmVhZF9sZXZlbDNfc2l6ZTogaW5vZGU9JWx1XG4iLAorCQlpbm9kZS0+aV9pbm8pOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBpc29mc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgaXNvZnNfc2JfaW5mbyAqc2JpID0gSVNPRlNfU0Ioc2IpOworCXVuc2lnbmVkIGxvbmcgYnVmc2l6ZSA9IElTT0ZTX0JVRkZFUl9TSVpFKGlub2RlKTsKKwl1bnNpZ25lZCBsb25nIGJsb2NrOworCWludCBoaWdoX3NpZXJyYSA9IHNiaS0+c19oaWdoX3NpZXJyYTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCA9IE5VTEw7CisJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogZGU7CisJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogdG1wZGUgPSBOVUxMOworCXVuc2lnbmVkIGludCBkZV9sZW47CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc3RydWN0IGlzb19pbm9kZV9pbmZvICplaSA9IElTT0ZTX0koaW5vZGUpOworCisJYmxvY2sgPSBlaS0+aV9pZ2V0NV9ibG9jazsKKwliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBibG9jayk7CisJaWYgKCFiaCkKKwkJZ290byBvdXRfYmFkcmVhZDsKKworCW9mZnNldCA9IGVpLT5pX2lnZXQ1X29mZnNldDsKKworCWRlID0gKHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqKSAoYmgtPmJfZGF0YSArIG9mZnNldCk7CisJZGVfbGVuID0gKih1bnNpZ25lZCBjaGFyICopIGRlOworCisJaWYgKG9mZnNldCArIGRlX2xlbiA+IGJ1ZnNpemUpIHsKKwkJaW50IGZyYWcxID0gYnVmc2l6ZSAtIG9mZnNldDsKKworCQl0bXBkZSA9IGttYWxsb2MoZGVfbGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHRtcGRlID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImlzb2ZzX3JlYWRfaW5vZGU6IG91dCBvZiBtZW1vcnlcbiIpOworCQkJZ290byBmYWlsOworCQl9CisJCW1lbWNweSh0bXBkZSwgYmgtPmJfZGF0YSArIG9mZnNldCwgZnJhZzEpOworCQlicmVsc2UoYmgpOworCQliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCArK2Jsb2NrKTsKKwkJaWYgKCFiaCkKKwkJCWdvdG8gb3V0X2JhZHJlYWQ7CisJCW1lbWNweSgoY2hhciAqKXRtcGRlK2ZyYWcxLCBiaC0+Yl9kYXRhLCBkZV9sZW4gLSBmcmFnMSk7CisJCWRlID0gdG1wZGU7CisJfQorCisJaW5vZGUtPmlfaW5vID0gaXNvZnNfZ2V0X2lubyhlaS0+aV9pZ2V0NV9ibG9jaywKKwkJCQkgICAgIGVpLT5pX2lnZXQ1X29mZnNldCwKKwkJCQkgICAgIElTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKSk7CisKKwkvKiBBc3N1bWUgaXQgaXMgYSBub3JtYWwtZm9ybWF0IGZpbGUgdW5sZXNzIHRvbGQgb3RoZXJ3aXNlICovCisJZWktPmlfZmlsZV9mb3JtYXQgPSBpc29mc19maWxlX25vcm1hbDsKKworCWlmIChkZS0+ZmxhZ3NbLWhpZ2hfc2llcnJhXSAmIDIpIHsKKwkJaW5vZGUtPmlfbW9kZSA9IFNfSVJVR08gfCBTX0lYVUdPIHwgU19JRkRJUjsKKwkJaW5vZGUtPmlfbmxpbmsgPSAxOyAvKiBTZXQgdG8gMS4gIFdlIGtub3cgdGhlcmUgYXJlIDIsIGJ1dAorCQkJCSAgICAgICB0aGUgZmluZCB1dGlsaXR5IHRyaWVzIHRvIG9wdGltaXplCisJCQkJICAgICAgIGlmIGl0IGlzIDIsIGFuZCBpdCBzY3Jld3MgdXAuICBJdCBpcworCQkJCSAgICAgICBlYXNpZXIgdG8gZ2l2ZSAxIHdoaWNoIHRlbGxzIGZpbmQgdG8KKwkJCQkgICAgICAgZG8gaXQgdGhlIGhhcmQgd2F5LiAqLworCX0gZWxzZSB7CisgCQkvKiBFdmVyeWJvZHkgZ2V0cyB0byByZWFkIHRoZSBmaWxlLiAqLworCQlpbm9kZS0+aV9tb2RlID0gc2JpLT5zX21vZGU7CisJCWlub2RlLT5pX25saW5rID0gMTsKKwkgICAgICAgIGlub2RlLT5pX21vZGUgfD0gU19JRlJFRzsKKwl9CisJaW5vZGUtPmlfdWlkID0gc2JpLT5zX3VpZDsKKwlpbm9kZS0+aV9naWQgPSBzYmktPnNfZ2lkOworCWlub2RlLT5pX2Jsb2NrcyA9IGlub2RlLT5pX2Jsa3NpemUgPSAwOworCisJZWktPmlfZm9ybWF0X3Bhcm1bMF0gPSAwOworCWVpLT5pX2Zvcm1hdF9wYXJtWzFdID0gMDsKKwllaS0+aV9mb3JtYXRfcGFybVsyXSA9IDA7CisKKwllaS0+aV9zZWN0aW9uX3NpemUgPSBpc29udW1fNzMzIChkZS0+c2l6ZSk7CisJaWYoZGUtPmZsYWdzWy1oaWdoX3NpZXJyYV0gJiAweDgwKSB7CisJCWlmKGlzb2ZzX3JlYWRfbGV2ZWwzX3NpemUoaW5vZGUpKSBnb3RvIGZhaWw7CisJfSBlbHNlIHsKKwkJZWktPmlfbmV4dF9zZWN0aW9uX2Jsb2NrID0gMDsKKwkJZWktPmlfbmV4dF9zZWN0aW9uX29mZnNldCA9IDA7CisJCWlub2RlLT5pX3NpemUgPSBpc29udW1fNzMzIChkZS0+c2l6ZSk7CisJfQorCisJLyoKKwkgKiBTb21lIGRpcHNoaXQgZGVjaWRlZCB0byBzdG9yZSBzb21lIG90aGVyIGJpdCBvZiBpbmZvcm1hdGlvbgorCSAqIGluIHRoZSBoaWdoIGJ5dGUgb2YgdGhlIGZpbGUgbGVuZ3RoLiAgVHJ1bmNhdGUgc2l6ZSBpbiBjYXNlCisJICogdGhpcyBDRFJPTSB3YXMgbW91bnRlZCB3aXRoIHRoZSBjcnVmdCBvcHRpb24uCisJICovCisKKwlpZiAoc2JpLT5zX2NydWZ0ID09ICd5JykKKwkJaW5vZGUtPmlfc2l6ZSAmPSAweDAwZmZmZmZmOworCisJaWYgKGRlLT5pbnRlcmxlYXZlWzBdKSB7CisJCXByaW50aygiSW50ZXJsZWF2ZWQgZmlsZXMgbm90ICh5ZXQpIHN1cHBvcnRlZC5cbiIpOworCQlpbm9kZS0+aV9zaXplID0gMDsKKwl9CisKKwkvKiBJIGhhdmUgbm8gaWRlYSB3aGF0IGZpbGVfdW5pdF9zaXplIGlzIHVzZWQgZm9yLCBzbworCSAgIHdlIHdpbGwgZmxhZyBpdCBmb3Igbm93ICovCisJaWYgKGRlLT5maWxlX3VuaXRfc2l6ZVswXSAhPSAwKSB7CisJCXByaW50aygiRmlsZSB1bml0IHNpemUgIT0gMCBmb3IgSVNPIGZpbGUgKCVsZCkuXG4iLAorCQkgICAgICAgaW5vZGUtPmlfaW5vKTsKKwl9CisKKwkvKiBJIGhhdmUgbm8gaWRlYSB3aGF0IG90aGVyIGZsYWcgYml0cyBhcmUgdXNlZCBmb3IsIHNvCisJICAgd2Ugd2lsbCBmbGFnIGl0IGZvciBub3cgKi8KKyNpZmRlZiBERUJVRworCWlmKChkZS0+ZmxhZ3NbLWhpZ2hfc2llcnJhXSAmIH4yKSE9IDApeworCQlwcmludGsoIlVudXN1YWwgZmxhZyBzZXR0aW5ncyBmb3IgSVNPIGZpbGUgKCVsZCAleCkuXG4iLAorCQkgICAgICAgaW5vZGUtPmlfaW5vLCBkZS0+ZmxhZ3NbLWhpZ2hfc2llcnJhXSk7CisJfQorI2VuZGlmCisKKwlpbm9kZS0+aV9tdGltZS50dl9zZWMgPQorCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9CisJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gaXNvX2RhdGUoZGUtPmRhdGUsIGhpZ2hfc2llcnJhKTsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0KKwlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0KKwlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKKworCWVpLT5pX2ZpcnN0X2V4dGVudCA9IChpc29udW1fNzMzIChkZS0+ZXh0ZW50KSArCisJCQkgICAgICBpc29udW1fNzExIChkZS0+ZXh0X2F0dHJfbGVuZ3RoKSk7CisKKwkvKiBTZXQgdGhlIG51bWJlciBvZiBibG9ja3MgZm9yIHN0YXQoKSAtIHNob3VsZCBiZSBkb25lIGJlZm9yZSBSUiAqLworCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7IC8qIEZvciBzdGF0KCkgb25seSAqLworCWlub2RlLT5pX2Jsb2NrcyAgPSAoaW5vZGUtPmlfc2l6ZSArIDUxMSkgPj4gOTsKKworCS8qCisJICogTm93IHRlc3QgZm9yIHBvc3NpYmxlIFJvY2sgUmlkZ2UgZXh0ZW5zaW9ucyB3aGljaCB3aWxsIG92ZXJyaWRlCisJICogc29tZSBvZiB0aGVzZSBudW1iZXJzIGluIHRoZSBpbm9kZSBzdHJ1Y3R1cmUuCisJICovCisKKwlpZiAoIWhpZ2hfc2llcnJhKSB7CisJCXBhcnNlX3JvY2tfcmlkZ2VfaW5vZGUoZGUsIGlub2RlKTsKKwkJLyogaWYgd2Ugd2FudCB1aWQvZ2lkIHNldCwgb3ZlcnJpZGUgdGhlIHJvY2sgcmlkZ2Ugc2V0dGluZyAqLworCQl0ZXN0X2FuZF9zZXRfdWlkKCZpbm9kZS0+aV91aWQsIHNiaS0+c191aWQpOworCQl0ZXN0X2FuZF9zZXRfZ2lkKCZpbm9kZS0+aV9naWQsIHNiaS0+c19naWQpOworCX0KKworCS8qIEluc3RhbGwgdGhlIGlub2RlIG9wZXJhdGlvbnMgdmVjdG9yICovCisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfZm9wID0gJmdlbmVyaWNfcm9fZm9wczsKKwkJc3dpdGNoICggZWktPmlfZmlsZV9mb3JtYXQgKSB7CisjaWZkZWYgQ09ORklHX1pJU09GUworCQljYXNlIGlzb2ZzX2ZpbGVfY29tcHJlc3NlZDoKKwkJCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmemlzb2ZzX2FvcHM7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZpc29mc19hb3BzOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmaXNvZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZpc29mc19kaXJfb3BlcmF0aW9uczsKKwl9IGVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmaXNvZnNfc3ltbGlua19hb3BzOworCX0gZWxzZQorCQkvKiBYWFggLSBwYXJzZV9yb2NrX3JpZGdlX2lub2RlKCkgaGFkIGFscmVhZHkgc2V0IGlfcmRldi4gKi8KKwkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9yZGV2KTsKKworIG91dDoKKwlpZiAodG1wZGUpCisJCWtmcmVlKHRtcGRlKTsKKwlpZiAoYmgpCisJCWJyZWxzZShiaCk7CisJcmV0dXJuOworCisgb3V0X2JhZHJlYWQ6CisJcHJpbnRrKEtFUk5fV0FSTklORyAiSVNPRlM6IHVuYWJsZSB0byByZWFkIGktbm9kZSBibG9ja1xuIik7CisgZmFpbDoKKwltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJZ290byBvdXQ7Cit9CisKK3N0cnVjdCBpc29mc19pZ2V0NV9jYWxsYmFja19kYXRhIHsKKwl1bnNpZ25lZCBsb25nIGJsb2NrOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworfTsKKworc3RhdGljIGludCBpc29mc19pZ2V0NV90ZXN0KHN0cnVjdCBpbm9kZSAqaW5vLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpc29faW5vZGVfaW5mbyAqaSA9IElTT0ZTX0koaW5vKTsKKwlzdHJ1Y3QgaXNvZnNfaWdldDVfY2FsbGJhY2tfZGF0YSAqZCA9CisJCShzdHJ1Y3QgaXNvZnNfaWdldDVfY2FsbGJhY2tfZGF0YSopZGF0YTsKKwlyZXR1cm4gKGktPmlfaWdldDVfYmxvY2sgPT0gZC0+YmxvY2spCisJICAgICAgICYmIChpLT5pX2lnZXQ1X29mZnNldCA9PSBkLT5vZmZzZXQpOworfQorCitzdGF0aWMgaW50IGlzb2ZzX2lnZXQ1X3NldChzdHJ1Y3QgaW5vZGUgKmlubywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXNvX2lub2RlX2luZm8gKmkgPSBJU09GU19JKGlubyk7CisJc3RydWN0IGlzb2ZzX2lnZXQ1X2NhbGxiYWNrX2RhdGEgKmQgPQorCQkoc3RydWN0IGlzb2ZzX2lnZXQ1X2NhbGxiYWNrX2RhdGEqKWRhdGE7CisJaS0+aV9pZ2V0NV9ibG9jayA9IGQtPmJsb2NrOworCWktPmlfaWdldDVfb2Zmc2V0ID0gZC0+b2Zmc2V0OworCXJldHVybiAwOworfQorCisvKiBTdG9yZSwgaW4gdGhlIGlub2RlJ3MgY29udGFpbmluZyBzdHJ1Y3R1cmUsIHRoZSBibG9jayBhbmQgYmxvY2sKKyAqIG9mZnNldCB0aGF0IHBvaW50IHRvIHRoZSB1bmRlcmx5aW5nIG1ldGEtZGF0YSBmb3IgdGhlIGlub2RlLiAgVGhlCisgKiBjb2RlIGJlbG93IGlzIG90aGVyd2lzZSBzaW1pbGFyIHRvIHRoZSBpZ2V0KCkgY29kZSBpbgorICogaW5jbHVkZS9saW51eC9mcy5oICovCitzdHJ1Y3QgaW5vZGUgKmlzb2ZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSB1bnNpZ25lZCBsb25nIGJsb2NrLAorCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXVuc2lnbmVkIGxvbmcgaGFzaHZhbDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBpc29mc19pZ2V0NV9jYWxsYmFja19kYXRhIGRhdGE7CisKKwlpZiAob2Zmc2V0ID49IDF1bCA8PCBzYi0+c19ibG9ja3NpemVfYml0cykKKwkJcmV0dXJuIE5VTEw7CisKKwlkYXRhLmJsb2NrID0gYmxvY2s7CisJZGF0YS5vZmZzZXQgPSBvZmZzZXQ7CisKKwloYXNodmFsID0gKGJsb2NrIDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSB8IG9mZnNldDsKKworCWlub2RlID0gaWdldDVfbG9ja2VkKHNiLAorCQkJICAgICBoYXNodmFsLAorCQkJICAgICAmaXNvZnNfaWdldDVfdGVzdCwKKwkJCSAgICAgJmlzb2ZzX2lnZXQ1X3NldCwKKwkJCSAgICAgJmRhdGEpOworCisJaWYgKGlub2RlICYmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSkgeworCQlzYi0+c19vcC0+cmVhZF9pbm9kZShpbm9kZSk7CisJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCX0KKworCXJldHVybiBpbm9kZTsKK30KKworI2lmZGVmIExFQUtfQ0hFQ0sKKyN1bmRlZiBtYWxsb2MKKyN1bmRlZiBmcmVlX3MKKyN1bmRlZiBzYl9icmVhZAorI3VuZGVmIGJyZWxzZQorCit2b2lkICogbGVha19jaGVja19tYWxsb2ModW5zaWduZWQgaW50IHNpemUpeworICB2b2lkICogdG1wOworICBjaGVja19tYWxsb2MrKzsKKyAgdG1wID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKyAgcmV0dXJuIHRtcDsKK30KKwordm9pZCBsZWFrX2NoZWNrX2ZyZWVfcyh2b2lkICogb2JqLCBpbnQgc2l6ZSl7CisgIGNoZWNrX21hbGxvYy0tOworICByZXR1cm4ga2ZyZWUob2JqKTsKK30KKworc3RydWN0IGJ1ZmZlcl9oZWFkICogbGVha19jaGVja19icmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgYmxvY2speworICBjaGVja19icmVhZCsrOworICByZXR1cm4gc2JfYnJlYWQoc2IsIGJsb2NrKTsKK30KKwordm9pZCBsZWFrX2NoZWNrX2JyZWxzZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCl7CisgIGNoZWNrX2JyZWFkLS07CisgIHJldHVybiBicmVsc2UoYmgpOworfQorCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqaXNvZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgaXNvZnNfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBpc285NjYwX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJpc285NjYwIiwKKwkuZ2V0X3NiCQk9IGlzb2ZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9pc285NjYwX2ZzKHZvaWQpCit7CisJaW50IGVyciA9IGluaXRfaW5vZGVjYWNoZSgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworI2lmZGVmIENPTkZJR19aSVNPRlMKKwllcnIgPSB6aXNvZnNfaW5pdCgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKyNlbmRpZgorCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmlzbzk2NjBfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQyOworCXJldHVybiAwOworb3V0MjoKKyNpZmRlZiBDT05GSUdfWklTT0ZTCisJemlzb2ZzX2NsZWFudXAoKTsKK291dDE6CisjZW5kaWYKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9pc285NjYwX2ZzKHZvaWQpCit7CisgICAgICAgIHVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmaXNvOTY2MF9mc190eXBlKTsKKyNpZmRlZiBDT05GSUdfWklTT0ZTCisJemlzb2ZzX2NsZWFudXAoKTsKKyNlbmRpZgorCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworfQorCittb2R1bGVfaW5pdChpbml0X2lzbzk2NjBfZnMpCittb2R1bGVfZXhpdChleGl0X2lzbzk2NjBfZnMpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisvKiBBY3R1YWwgZmlsZXN5c3RlbSBuYW1lIGlzIGlzbzk2NjAsIGFzIHJlcXVlc3RlZCBpbiBmaWxlc3lzdGVtcy5jICovCitNT0RVTEVfQUxJQVMoImlzbzk2NjAiKTsKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2pvbGlldC5jIGIvZnMvaXNvZnMvam9saWV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjNTBlMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2lzb2ZzL2pvbGlldC5jCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogIGxpbnV4L2ZzL2lzb2ZzL2pvbGlldC5jCisgKgorICogIChDKSAxOTk2IEdvcmRvbiBDaGFmZmVlCisgKgorICogIEpvbGlldDogTWljcm9zb2Z0J3MgVW5pY29kZSBleHRlbnNpb25zIHRvIGlzbzk2NjAKKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pc29fZnMuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKy8qCisgKiBDb252ZXJ0IFVuaWNvZGUgMTYgdG8gVVRGOCBvciBBU0NJSS4KKyAqLworc3RhdGljIGludAordW5pMTZfdG9feDgodW5zaWduZWQgY2hhciAqYXNjaWksIHUxNiAqdW5pLCBpbnQgbGVuLCBzdHJ1Y3QgbmxzX3RhYmxlICpubHMpCit7CisJd2NoYXJfdCAqaXAsIGNoOworCXVuc2lnbmVkIGNoYXIgKm9wOworCisJaXAgPSB1bmk7CisJb3AgPSBhc2NpaTsKKworCXdoaWxlICgoY2ggPSBnZXRfdW5hbGlnbmVkKGlwKSkgJiYgbGVuKSB7CisJCWludCBsbGVuOworCQljaCA9IGJlMTZfdG9fY3B1KGNoKTsKKwkJaWYgKChsbGVuID0gbmxzLT51bmkyY2hhcihjaCwgb3AsIE5MU19NQVhfQ0hBUlNFVF9TSVpFKSkgPiAwKQorCQkJb3AgKz0gbGxlbjsKKwkJZWxzZQorCQkJKm9wKysgPSAnPyc7CisJCWlwKys7CisKKwkJbGVuLS07CisJfQorCSpvcCA9IDA7CisJcmV0dXJuIChvcCAtIGFzY2lpKTsKK30KKworLyogQ29udmVydCBiaWcgZW5kaWFuIHdpZGUgY2hhcmFjdGVyIHN0cmluZyB0byB1dGY4ICovCitzdGF0aWMgaW50Cit3Y3NudG9tYnNfYmUoX191OCAqcywgY29uc3QgX191OCAqcHdjcywgaW50IGlubGVuLCBpbnQgbWF4bGVuKQoreworCWNvbnN0IF9fdTggKmlwOworCV9fdTggKm9wOworCWludCBzaXplOworCV9fdTE2IGM7CisKKwlvcCA9IHM7CisJaXAgPSBwd2NzOworCXdoaWxlICgoKmlwIHx8IGlwWzFdKSAmJiAobWF4bGVuID4gMCkgJiYgKGlubGVuID4gMCkpIHsKKwkJYyA9ICgqaXAgPDwgOCkgfCBpcFsxXTsKKwkJaWYgKGMgPiAweDdmKSB7CisJCQlzaXplID0gdXRmOF93Y3RvbWIob3AsIGMsIG1heGxlbik7CisJCQlpZiAoc2l6ZSA9PSAtMSkgeworCQkJCS8qIElnbm9yZSBjaGFyYWN0ZXIgYW5kIG1vdmUgb24gKi8KKwkJCQltYXhsZW4tLTsKKwkJCX0gZWxzZSB7CisJCQkJb3AgKz0gc2l6ZTsKKwkJCQltYXhsZW4gLT0gc2l6ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSpvcCsrID0gKF9fdTgpIGM7CisJCX0KKwkJaXAgKz0gMjsKKwkJaW5sZW4tLTsKKwl9CisJcmV0dXJuIChvcCAtIHMpOworfQorCitpbnQKK2dldF9qb2xpZXRfZmlsZW5hbWUoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogZGUsIHVuc2lnbmVkIGNoYXIgKm91dG5hbWUsIHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXVuc2lnbmVkIGNoYXIgdXRmODsKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHM7CisJdW5zaWduZWQgY2hhciBsZW4gPSAwOworCisJdXRmOCA9IElTT0ZTX1NCKGlub2RlLT5pX3NiKS0+c191dGY4OworCW5scyA9IElTT0ZTX1NCKGlub2RlLT5pX3NiKS0+c19ubHNfaW9jaGFyc2V0OworCisJaWYgKHV0ZjgpIHsKKwkJbGVuID0gd2NzbnRvbWJzX2JlKG91dG5hbWUsIGRlLT5uYW1lLAorCQkJCSAgIGRlLT5uYW1lX2xlblswXSA+PiAxLCBQQUdFX1NJWkUpOworCX0gZWxzZSB7CisJCWxlbiA9IHVuaTE2X3RvX3g4KG91dG5hbWUsICh1MTYgKikgZGUtPm5hbWUsCisJCQkJICBkZS0+bmFtZV9sZW5bMF0gPj4gMSwgbmxzKTsKKwl9CisJaWYgKChsZW4gPiAyKSAmJiAob3V0bmFtZVtsZW4tMl0gPT0gJzsnKSAmJiAob3V0bmFtZVtsZW4tMV0gPT0gJzEnKSkgeworCQlsZW4gLT0gMjsKKwl9CisKKwkvKgorCSAqIFdpbmRvd3MgZG9lc24ndCBsaWtlIHBlcmlvZHMgYXQgdGhlIGVuZCBvZiBhIG5hbWUsCisJICogc28gbmVpdGhlciBkbyB3ZQorCSAqLworCXdoaWxlIChsZW4gPj0gMiAmJiAob3V0bmFtZVtsZW4tMV0gPT0gJy4nKSkgeworCQlsZW4tLTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQpkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvbmFtZWkuYyBiL2ZzL2lzb2ZzL25hbWVpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU2OWZjNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2lzb2ZzL25hbWVpLmMKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiAgbGludXgvZnMvaXNvZnMvbmFtZWkuYworICoKKyAqICAoQykgMTk5MiAgRXJpYyBZb3VuZ2RhbGUgTW9kaWZpZWQgZm9yIElTTyA5NjYwIGZpbGVzeXN0ZW0uCisgKgorICogIChDKSAxOTkxICBMaW51cyBUb3J2YWxkcyAtIG1pbml4IGZpbGVzeXN0ZW0KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lzb19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4JLyogSm9saWV0PyAqLworI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qCisgKiBvaywgd2UgY2Fubm90IHVzZSBzdHJuY21wLCBhcyB0aGUgbmFtZSBpcyBub3QgaW4gb3VyIGRhdGEgc3BhY2UuCisgKiBUaHVzIHdlJ2xsIGhhdmUgdG8gdXNlIGlzb2ZzX21hdGNoLiBObyBiaWcgcHJvYmxlbS4gTWF0Y2ggYWxzbyBtYWtlcworICogc29tZSBzYW5pdHkgdGVzdHMuCisgKi8KK3N0YXRpYyBpbnQKK2lzb2ZzX2NtcChzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBjb25zdCBjaGFyICogY29tcGFyZSwgaW50IGRsZW4pCit7CisJc3RydWN0IHFzdHIgcXN0cjsKKworCWlmICghY29tcGFyZSkKKwkJcmV0dXJuIDE7CisKKwkvKiBjaGVjayBzcGVjaWFsICIuIiBhbmQgIi4uIiBmaWxlcyAqLworCWlmIChkbGVuID09IDEpIHsKKwkJLyogIi4iICovCisJCWlmIChjb21wYXJlWzBdID09IDApIHsKKwkJCWlmICghZGVudHJ5LT5kX25hbWUubGVuKQorCQkJCXJldHVybiAwOworCQkJY29tcGFyZSA9ICIuIjsKKwkJfSBlbHNlIGlmIChjb21wYXJlWzBdID09IDEpIHsKKwkJCWNvbXBhcmUgPSAiLi4iOworCQkJZGxlbiA9IDI7CisJCX0KKwl9CisKKwlxc3RyLm5hbWUgPSBjb21wYXJlOworCXFzdHIubGVuID0gZGxlbjsKKwlyZXR1cm4gZGVudHJ5LT5kX29wLT5kX2NvbXBhcmUoZGVudHJ5LCAmZGVudHJ5LT5kX25hbWUsICZxc3RyKTsKK30KKworLyoKKyAqCWlzb2ZzX2ZpbmRfZW50cnkoKQorICoKKyAqIGZpbmRzIGFuIGVudHJ5IGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHdpdGggdGhlIHdhbnRlZCBuYW1lLiBJdAorICogcmV0dXJucyB0aGUgaW5vZGUgbnVtYmVyIG9mIHRoZSBmb3VuZCBlbnRyeSwgb3IgMCBvbiBlcnJvci4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2lzb2ZzX2ZpbmRfZW50cnkoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwl1bnNpZ25lZCBsb25nICpibG9ja19ydiwgdW5zaWduZWQgbG9uZyogb2Zmc2V0X3J2LAorCWNoYXIgKiB0bXBuYW1lLCBzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiB0bXBkZSkKK3sKKwl1bnNpZ25lZCBsb25nIGJ1ZnNpemUgPSBJU09GU19CVUZGRVJfU0laRShkaXIpOworCXVuc2lnbmVkIGNoYXIgYnVmYml0cyA9IElTT0ZTX0JVRkZFUl9CSVRTKGRpcik7CisJdW5zaWduZWQgbG9uZyBibG9jaywgZl9wb3MsIG9mZnNldCwgYmxvY2tfc2F2ZWQsIG9mZnNldF9zYXZlZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCA9IE5VTEw7CisJc3RydWN0IGlzb2ZzX3NiX2luZm8gKnNiaSA9IElTT0ZTX1NCKGRpci0+aV9zYik7CisKKwlpZiAoIUlTT0ZTX0koZGlyKS0+aV9maXJzdF9leHRlbnQpCisJCXJldHVybiAwOworICAKKwlmX3BvcyA9IDA7CisJb2Zmc2V0ID0gMDsKKwlibG9jayA9IDA7CisKKwl3aGlsZSAoZl9wb3MgPCBkaXItPmlfc2l6ZSkgeworCQlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiBkZTsKKwkJaW50IGRlX2xlbiwgbWF0Y2gsIGksIGRsZW47CisJCWNoYXIgKmRwbnQ7CisKKwkJaWYgKCFiaCkgeworCQkJYmggPSBpc29mc19icmVhZChkaXIsIGJsb2NrKTsKKwkJCWlmICghYmgpCisJCQkJcmV0dXJuIDA7CisJCX0KKworCQlkZSA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKikgKGJoLT5iX2RhdGEgKyBvZmZzZXQpOworCisJCWRlX2xlbiA9ICoodW5zaWduZWQgY2hhciAqKSBkZTsKKwkJaWYgKCFkZV9sZW4pIHsKKwkJCWJyZWxzZShiaCk7CisJCQliaCA9IE5VTEw7CisJCQlmX3BvcyA9IChmX3BvcyArIElTT0ZTX0JMT0NLX1NJWkUpICYgfihJU09GU19CTE9DS19TSVpFIC0gMSk7CisJCQlibG9jayA9IGZfcG9zID4+IGJ1ZmJpdHM7CisJCQlvZmZzZXQgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlibG9ja19zYXZlZCA9IGJoLT5iX2Jsb2NrbnI7CisJCW9mZnNldF9zYXZlZCA9IG9mZnNldDsKKwkJb2Zmc2V0ICs9IGRlX2xlbjsKKwkJZl9wb3MgKz0gZGVfbGVuOworCisJCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZnVsbCBkaXJlY3RvcnkgZW50cnkgKi8KKwkJaWYgKG9mZnNldCA+PSBidWZzaXplKSB7CisJCQlpbnQgc2xvcCA9IGJ1ZnNpemUgLSBvZmZzZXQgKyBkZV9sZW47CisJCQltZW1jcHkodG1wZGUsIGRlLCBzbG9wKTsKKwkJCW9mZnNldCAmPSBidWZzaXplIC0gMTsKKwkJCWJsb2NrKys7CisJCQlicmVsc2UoYmgpOworCQkJYmggPSBOVUxMOworCQkJaWYgKG9mZnNldCkgeworCQkJCWJoID0gaXNvZnNfYnJlYWQoZGlyLCBibG9jayk7CisJCQkJaWYgKCFiaCkKKwkJCQkJcmV0dXJuIDA7CisJCQkJbWVtY3B5KCh2b2lkICopIHRtcGRlICsgc2xvcCwgYmgtPmJfZGF0YSwgb2Zmc2V0KTsKKwkJCX0KKwkJCWRlID0gdG1wZGU7CisJCX0KKworCQlkbGVuID0gZGUtPm5hbWVfbGVuWzBdOworCQlkcG50ID0gZGUtPm5hbWU7CisKKwkJaWYgKHNiaS0+c19yb2NrICYmCisJCSAgICAoKGkgPSBnZXRfcm9ja19yaWRnZV9maWxlbmFtZShkZSwgdG1wbmFtZSwgZGlyKSkpKSB7CisJCQlkbGVuID0gaTsgCS8qIHBvc3NpYmx5IC0xICovCisJCQlkcG50ID0gdG1wbmFtZTsKKyNpZmRlZiBDT05GSUdfSk9MSUVUCisJCX0gZWxzZSBpZiAoc2JpLT5zX2pvbGlldF9sZXZlbCkgeworCQkJZGxlbiA9IGdldF9qb2xpZXRfZmlsZW5hbWUoZGUsIHRtcG5hbWUsIGRpcik7CisJCQlkcG50ID0gdG1wbmFtZTsKKyNlbmRpZgorCQl9IGVsc2UgaWYgKHNiaS0+c19tYXBwaW5nID09ICdhJykgeworCQkJZGxlbiA9IGdldF9hY29ybl9maWxlbmFtZShkZSwgdG1wbmFtZSwgZGlyKTsKKwkJCWRwbnQgPSB0bXBuYW1lOworCQl9IGVsc2UgaWYgKHNiaS0+c19tYXBwaW5nID09ICduJykgeworCQkJZGxlbiA9IGlzb2ZzX25hbWVfdHJhbnNsYXRlKGRlLCB0bXBuYW1lLCBkaXIpOworCQkJZHBudCA9IHRtcG5hbWU7CisJCX0KKworCQkvKgorCQkgKiBTa2lwIGhpZGRlbiBvciBhc3NvY2lhdGVkIGZpbGVzIHVubGVzcyB1bmhpZGUgaXMgc2V0IAorCQkgKi8KKwkJbWF0Y2ggPSAwOworCQlpZiAoZGxlbiA+IDAgJiYKKwkJICAgICghKGRlLT5mbGFnc1stc2JpLT5zX2hpZ2hfc2llcnJhXSAmIDUpCisJCSAgICAgfHwgc2JpLT5zX3VuaGlkZSA9PSAneScpKQorCQl7CisJCQltYXRjaCA9IChpc29mc19jbXAoZGVudHJ5LGRwbnQsZGxlbikgPT0gMCk7CisJCX0KKwkJaWYgKG1hdGNoKSB7CisJCQlpc29mc19ub3JtYWxpemVfYmxvY2tfYW5kX29mZnNldChkZSwKKwkJCQkJCQkgJmJsb2NrX3NhdmVkLAorCQkJCQkJCSAmb2Zmc2V0X3NhdmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpibG9ja19ydiA9IGJsb2NrX3NhdmVkOworICAgICAgICAgICAgICAgICAgICAgICAgKm9mZnNldF9ydiA9IG9mZnNldF9zYXZlZDsKKwkJCWlmIChiaCkgYnJlbHNlKGJoKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCWlmIChiaCkgYnJlbHNlKGJoKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGRlbnRyeSAqaXNvZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IGZvdW5kOworCXVuc2lnbmVkIGxvbmcgYmxvY2ssIG9mZnNldDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJZGVudHJ5LT5kX29wID0gZGlyLT5pX3NiLT5zX3Jvb3QtPmRfb3A7CisKKwlwYWdlID0gYWxsb2NfcGFnZShHRlBfVVNFUik7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWxvY2tfa2VybmVsKCk7CisJZm91bmQgPSBpc29mc19maW5kX2VudHJ5KGRpciwgZGVudHJ5LAorCQkJCSAmYmxvY2ssICZvZmZzZXQsCisJCQkJIHBhZ2VfYWRkcmVzcyhwYWdlKSwKKwkJCQkgMTAyNCArIHBhZ2VfYWRkcmVzcyhwYWdlKSk7CisJX19mcmVlX3BhZ2UocGFnZSk7CisKKwlpbm9kZSA9IE5VTEw7CisJaWYgKGZvdW5kKSB7CisJCWlub2RlID0gaXNvZnNfaWdldChkaXItPmlfc2IsIGJsb2NrLCBvZmZzZXQpOworCQlpZiAoIWlub2RlKSB7CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKwkJfQorCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJaWYgKGlub2RlKQorCQlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9mcy9pc29mcy9yb2NrLmMgYi9mcy9pc29mcy9yb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkZDNlNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2lzb2ZzL3JvY2suYwpAQCAtMCwwICsxLDU2NSBAQAorLyoKKyAqICBsaW51eC9mcy9pc29mcy9yb2NrLmMKKyAqCisgKiAgKEMpIDE5OTIsIDE5OTMgIEVyaWMgWW91bmdkYWxlCisgKgorICogIFJvY2sgUmlkZ2UgRXh0ZW5zaW9ucyB0byBpc285NjYwCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvaXNvX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisjaW5jbHVkZSAicm9jay5oIgorCisvKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGRlc2lnbmVkIHRvIHJlYWQgdGhlIHN5c3RlbSBhcmVhcyBvZiBhIGRpcmVjdG9yeSByZWNvcmQKKyAqIGFuZCBleHRyYWN0IHJlbGV2YW50IGluZm9ybWF0aW9uLiAgVGhlcmUgYXJlIGRpZmZlcmVudCBmdW5jdGlvbnMgcHJvdmlkZWQKKyAqIGRlcGVuZGluZyB1cG9uIHdoYXQgaW5mb3JtYXRpb24gd2UgbmVlZCBhdCB0aGUgdGltZS4gIE9uZSBmdW5jdGlvbiBmaWxscworICogb3V0IGFuIGlub2RlIHN0cnVjdHVyZSwgYSBzZWNvbmQgb25lIGV4dHJhY3RzIGEgZmlsZW5hbWUsIGEgdGhpcmQgb25lCisgKiByZXR1cm5zIGEgc3ltYm9saWMgbGluayBuYW1lLCBhbmQgYSBmb3VydGggb25lIHJldHVybnMgdGhlIGV4dGVudCBudW1iZXIKKyAqIGZvciB0aGUgZmlsZS4gKi8KKworI2RlZmluZSBTSUcoQSxCKSAoKEEpIHwgKChCKSA8PCA4KSkgLyogaXNvbnVtXzcyMSgpICovCisKKworLyogVGhpcyBpcyBhIHdheSBvZiBlbnN1cmluZyB0aGF0IHdlIGhhdmUgc29tZXRoaW5nIGluIHRoZSBzeXN0ZW0KKyAgIHVzZSBmaWVsZHMgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggUm9jayBSaWRnZSAqLworI2RlZmluZSBDSEVDS19TUChGQUlMKQkgICAgICAgCQkJXAorICAgICAgaWYocnItPnUuU1AubWFnaWNbMF0gIT0gMHhiZSkgRkFJTDsJXAorICAgICAgaWYocnItPnUuU1AubWFnaWNbMV0gIT0gMHhlZikgRkFJTDsgICAgICAgXAorICAgICAgSVNPRlNfU0IoaW5vZGUtPmlfc2IpLT5zX3JvY2tfb2Zmc2V0PXJyLT51LlNQLnNraXA7CisvKiBXZSBkZWZpbmUgYSBzZXJpZXMgb2YgbWFjcm9zIGJlY2F1c2UgZWFjaCBmdW5jdGlvbiBtdXN0IGRvIGV4YWN0bHkgdGhlCisgICBzYW1lIHRoaW5nIGluIGNlcnRhaW4gcGxhY2VzLiAgV2UgdXNlIHRoZSBtYWNyb3MgdG8gZW5zdXJlIHRoYXQgZXZlcnl0aGluZworICAgaXMgZG9uZSBjb3JyZWN0bHkgKi8KKworI2RlZmluZSBDT05USU5VRV9ERUNMUyBcCisgIGludCBjb250X2V4dGVudCA9IDAsIGNvbnRfb2Zmc2V0ID0gMCwgY29udF9zaXplID0gMDsgICBcCisgIHZvaWQgKmJ1ZmZlciA9IE5VTEwKKworI2RlZmluZSBDSEVDS19DRQkgICAgICAgCQkJXAorICAgICAge2NvbnRfZXh0ZW50ID0gaXNvbnVtXzczMyhyci0+dS5DRS5leHRlbnQpOyBcCisgICAgICBjb250X29mZnNldCA9IGlzb251bV83MzMocnItPnUuQ0Uub2Zmc2V0KTsgXAorICAgICAgY29udF9zaXplID0gaXNvbnVtXzczMyhyci0+dS5DRS5zaXplKTt9CisKKyNkZWZpbmUgU0VUVVBfUk9DS19SSURHRShERSxDSFIsTEVOKQkgICAgICAJCSAgICAgIAlcCisgIHtMRU49IHNpemVvZihzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQpICsgREUtPm5hbWVfbGVuWzBdOwlcCisgIGlmKExFTiAmIDEpIExFTisrOwkJCQkJCVwKKyAgQ0hSID0gKCh1bnNpZ25lZCBjaGFyICopIERFKSArIExFTjsJCQkJXAorICBMRU4gPSAqKCh1bnNpZ25lZCBjaGFyICopIERFKSAtIExFTjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKExFTjwwKSBMRU49MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChJU09GU19TQihpbm9kZS0+aV9zYiktPnNfcm9ja19vZmZzZXQhPS0xKSAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBMRU4tPUlTT0ZTX1NCKGlub2RlLT5pX3NiKS0+c19yb2NrX29mZnNldDsgICAgICAgICAgICAgICAgXAorICAgICBDSFIrPUlTT0ZTX1NCKGlub2RlLT5pX3NiKS0+c19yb2NrX29mZnNldDsgICAgICAgICAgICAgICAgXAorICAgICBpZiAoTEVOPDApIExFTj0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisjZGVmaW5lIE1BWUJFX0NPTlRJTlVFKExBQkVMLERFVikgXAorICB7aWYgKGJ1ZmZlcikgeyBrZnJlZShidWZmZXIpOyBidWZmZXIgPSBOVUxMOyB9IFwKKyAgaWYgKGNvbnRfZXh0ZW50KXsgXAorICAgIGludCBibG9jaywgb2Zmc2V0LCBvZmZzZXQxOyBcCisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogcGJoOyBcCisgICAgYnVmZmVyID0ga21hbGxvYyhjb250X3NpemUsR0ZQX0tFUk5FTCk7IFwKKyAgICBpZiAoIWJ1ZmZlcikgZ290byBvdXQ7IFwKKyAgICBibG9jayA9IGNvbnRfZXh0ZW50OyBcCisgICAgb2Zmc2V0ID0gY29udF9vZmZzZXQ7IFwKKyAgICBvZmZzZXQxID0gMDsgXAorICAgIHBiaCA9IHNiX2JyZWFkKERFVi0+aV9zYiwgYmxvY2spOyBcCisgICAgaWYocGJoKXsgICAgICAgXAorICAgICAgaWYgKG9mZnNldCA+IHBiaC0+Yl9zaXplIHx8IG9mZnNldCArIGNvbnRfc2l6ZSA+IHBiaC0+Yl9zaXplKXsJXAorCWJyZWxzZShwYmgpOyBcCisJZ290byBvdXQ7IFwKKyAgICAgIH0gXAorICAgICAgbWVtY3B5KGJ1ZmZlciArIG9mZnNldDEsIHBiaC0+Yl9kYXRhICsgb2Zmc2V0LCBjb250X3NpemUgLSBvZmZzZXQxKTsgXAorICAgICAgYnJlbHNlKHBiaCk7IFwKKyAgICAgIGNociA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZmZlcjsgXAorICAgICAgbGVuID0gY29udF9zaXplOyBcCisgICAgICBjb250X2V4dGVudCA9IDA7IFwKKyAgICAgIGNvbnRfc2l6ZSA9IDA7IFwKKyAgICAgIGNvbnRfb2Zmc2V0ID0gMDsgXAorICAgICAgZ290byBMQUJFTDsgXAorICAgIH0gICAgXAorICAgIHByaW50aygiVW5hYmxlIHRvIHJlYWQgcm9jay1yaWRnZSBhdHRyaWJ1dGVzXG4iKTsgICAgXAorICB9fQorCisvKiByZXR1cm4gbGVuZ3RoIG9mIG5hbWUgZmllbGQ7IDA6IG5vdCBmb3VuZCwgLTE6IHRvIGJlIGlnbm9yZWQgKi8KK2ludCBnZXRfcm9ja19yaWRnZV9maWxlbmFtZShzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiBkZSwKKwkJCSAgICBjaGFyICogcmV0bmFtZSwgc3RydWN0IGlub2RlICogaW5vZGUpCit7CisgIGludCBsZW47CisgIHVuc2lnbmVkIGNoYXIgKiBjaHI7CisgIENPTlRJTlVFX0RFQ0xTOworICBpbnQgcmV0bmFtbGVuID0gMCwgdHJ1bmNhdGU9MDsKKyAKKyAgaWYgKCFJU09GU19TQihpbm9kZS0+aV9zYiktPnNfcm9jaykgcmV0dXJuIDA7CisgICpyZXRuYW1lID0gMDsKKworICBTRVRVUF9ST0NLX1JJREdFKGRlLCBjaHIsIGxlbik7CisgcmVwZWF0OgorICB7CisgICAgc3RydWN0IHJvY2tfcmlkZ2UgKiBycjsKKyAgICBpbnQgc2lnOworICAgIAorICAgIHdoaWxlIChsZW4gPiAyKXsgLyogVGhlcmUgbWF5IGJlIG9uZSBieXRlIGZvciBwYWRkaW5nIHNvbWV3aGVyZSAqLworICAgICAgcnIgPSAoc3RydWN0IHJvY2tfcmlkZ2UgKikgY2hyOworICAgICAgaWYgKHJyLT5sZW4gPCAzKSBnb3RvIG91dDsgLyogU29tZXRoaW5nIGdvdCBzY3Jld2VkIHVwIGhlcmUgKi8KKyAgICAgIHNpZyA9IGlzb251bV83MjEoY2hyKTsKKyAgICAgIGNociArPSByci0+bGVuOyAKKyAgICAgIGxlbiAtPSByci0+bGVuOworICAgICAgaWYgKGxlbiA8IDApIGdvdG8gb3V0OwkvKiBjb3JydXB0ZWQgaXNvZnMgKi8KKworICAgICAgc3dpdGNoKHNpZyl7CisgICAgICBjYXNlIFNJRygnUicsJ1InKToKKwlpZigocnItPnUuUlIuZmxhZ3NbMF0gJiBSUl9OTSkgPT0gMCkgZ290byBvdXQ7CisJYnJlYWs7CisgICAgICBjYXNlIFNJRygnUycsJ1AnKToKKwlDSEVDS19TUChnb3RvIG91dCk7CisJYnJlYWs7CisgICAgICBjYXNlIFNJRygnQycsJ0UnKToKKwlDSEVDS19DRTsKKwlicmVhazsKKyAgICAgIGNhc2UgU0lHKCdOJywnTScpOgorCWlmICh0cnVuY2F0ZSkgYnJlYWs7CisJaWYgKHJyLT5sZW4gPCA1KSBicmVhazsKKyAgICAgICAgLyoKKwkgKiBJZiB0aGUgZmxhZ3MgYXJlIDIgb3IgNCwgdGhpcyBpbmRpY2F0ZXMgJy4nIG9yICcuLicuCisJICogV2UgZG9uJ3Qgd2FudCB0byBkbyBhbnl0aGluZyB3aXRoIHRoaXMsIGJlY2F1c2UgaXQKKwkgKiBzY3Jld3MgdXAgdGhlIGNvZGUgdGhhdCBjYWxscyB1cy4gIFdlIGRvbid0IHJlYWxseQorCSAqIGNhcmUgYW55d2F5cywgc2luY2Ugd2UgY2FuIGp1c3QgdXNlIHRoZSBub24tUlIKKwkgKiBuYW1lLgorCSAqLworCWlmIChyci0+dS5OTS5mbGFncyAmIDYpIHsKKwkgIGJyZWFrOworCX0KKworCWlmIChyci0+dS5OTS5mbGFncyAmIH4xKSB7CisJICBwcmludGsoIlVuc3VwcG9ydGVkIE5NIGZsYWcgc2V0dGluZ3MgKCVkKVxuIixyci0+dS5OTS5mbGFncyk7CisJICBicmVhazsKKwl9CisJaWYoKHN0cmxlbihyZXRuYW1lKSArIHJyLT5sZW4gLSA1KSA+PSAyNTQpIHsKKwkgIHRydW5jYXRlID0gMTsKKwkgIGJyZWFrOworCX0KKwlzdHJuY2F0KHJldG5hbWUsIHJyLT51Lk5NLm5hbWUsIHJyLT5sZW4gLSA1KTsKKwlyZXRuYW1sZW4gKz0gcnItPmxlbiAtIDU7CisJYnJlYWs7CisgICAgICBjYXNlIFNJRygnUicsJ0UnKToKKwlpZiAoYnVmZmVyKSBrZnJlZShidWZmZXIpOworCXJldHVybiAtMTsKKyAgICAgIGRlZmF1bHQ6CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIE1BWUJFX0NPTlRJTlVFKHJlcGVhdCxpbm9kZSk7CisgIGlmIChidWZmZXIpIGtmcmVlKGJ1ZmZlcik7CisgIHJldHVybiByZXRuYW1sZW47IC8qIElmIDAsIHRoaXMgZmlsZSBkaWQgbm90IGhhdmUgYSBOTSBmaWVsZCAqLworIG91dDoKKyAgaWYoYnVmZmVyKSBrZnJlZShidWZmZXIpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcGFyc2Vfcm9ja19yaWRnZV9pbm9kZV9pbnRlcm5hbChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKmRlLAorCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCByZWdhcmRfeGEpCit7CisgIGludCBsZW47CisgIHVuc2lnbmVkIGNoYXIgKiBjaHI7CisgIGludCBzeW1saW5rX2xlbiA9IDA7CisgIENPTlRJTlVFX0RFQ0xTOworCisgIGlmICghSVNPRlNfU0IoaW5vZGUtPmlfc2IpLT5zX3JvY2spIHJldHVybiAwOworCisgIFNFVFVQX1JPQ0tfUklER0UoZGUsIGNociwgbGVuKTsKKyAgaWYgKHJlZ2FyZF94YSkKKyAgIHsKKyAgICAgY2hyKz0xNDsKKyAgICAgbGVuLT0xNDsKKyAgICAgaWYgKGxlbjwwKSBsZW49MDsKKyAgIH0KKyAgIAorIHJlcGVhdDoKKyAgeworICAgIGludCBjbnQsIHNpZzsKKyAgICBzdHJ1Y3QgaW5vZGUgKiByZWxvYzsKKyAgICBzdHJ1Y3Qgcm9ja19yaWRnZSAqIHJyOworICAgIGludCByb290ZmxhZzsKKyAgICAKKyAgICB3aGlsZSAobGVuID4gMil7IC8qIFRoZXJlIG1heSBiZSBvbmUgYnl0ZSBmb3IgcGFkZGluZyBzb21ld2hlcmUgKi8KKyAgICAgIHJyID0gKHN0cnVjdCByb2NrX3JpZGdlICopIGNocjsKKyAgICAgIGlmIChyci0+bGVuIDwgMykgZ290byBvdXQ7IC8qIFNvbWV0aGluZyBnb3Qgc2NyZXdlZCB1cCBoZXJlICovCisgICAgICBzaWcgPSBpc29udW1fNzIxKGNocik7CisgICAgICBjaHIgKz0gcnItPmxlbjsgCisgICAgICBsZW4gLT0gcnItPmxlbjsKKyAgICAgIGlmIChsZW4gPCAwKSBnb3RvIG91dDsJLyogY29ycnVwdGVkIGlzb2ZzICovCisgICAgICAKKyAgICAgIHN3aXRjaChzaWcpeworI2lmbmRlZiBDT05GSUdfWklTT0ZTCQkvKiBObyBmbGFnIGZvciBTRiBvciBaRiAqLworICAgICAgY2FzZSBTSUcoJ1InLCdSJyk6CisJaWYoKHJyLT51LlJSLmZsYWdzWzBdICYgCisgCSAgICAoUlJfUFggfCBSUl9URiB8IFJSX1NMIHwgUlJfQ0wpKSA9PSAwKSBnb3RvIG91dDsKKwlicmVhazsKKyNlbmRpZgorICAgICAgY2FzZSBTSUcoJ1MnLCdQJyk6CisJQ0hFQ0tfU1AoZ290byBvdXQpOworCWJyZWFrOworICAgICAgY2FzZSBTSUcoJ0MnLCdFJyk6CisJQ0hFQ0tfQ0U7CisJYnJlYWs7CisgICAgICBjYXNlIFNJRygnRScsJ1InKToKKwlJU09GU19TQihpbm9kZS0+aV9zYiktPnNfcm9jayA9IDE7CisJcHJpbnRrKEtFUk5fREVCVUcgIklTTyA5NjYwIEV4dGVuc2lvbnM6ICIpOworCXsgaW50IHA7CisJICBmb3IocD0wO3A8cnItPnUuRVIubGVuX2lkO3ArKykgcHJpbnRrKCIlYyIscnItPnUuRVIuZGF0YVtwXSk7CisJfQorCSAgcHJpbnRrKCJcbiIpOworCWJyZWFrOworICAgICAgY2FzZSBTSUcoJ1AnLCdYJyk6CisJaW5vZGUtPmlfbW9kZSAgPSBpc29udW1fNzMzKHJyLT51LlBYLm1vZGUpOworCWlub2RlLT5pX25saW5rID0gaXNvbnVtXzczMyhyci0+dS5QWC5uX2xpbmtzKTsKKwlpbm9kZS0+aV91aWQgICA9IGlzb251bV83MzMocnItPnUuUFgudWlkKTsKKwlpbm9kZS0+aV9naWQgICA9IGlzb251bV83MzMocnItPnUuUFguZ2lkKTsKKwlicmVhazsKKyAgICAgIGNhc2UgU0lHKCdQJywnTicpOgorCXsgaW50IGhpZ2gsIGxvdzsKKwkgIGhpZ2ggPSBpc29udW1fNzMzKHJyLT51LlBOLmRldl9oaWdoKTsKKwkgIGxvdyA9IGlzb251bV83MzMocnItPnUuUE4uZGV2X2xvdyk7CisJICAvKgorCSAgICogVGhlIFJvY2sgUmlkZ2Ugc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgaWYgc2l6ZW9mKGRldl90KSA8PSA0LAorCSAgICogdGhlbiB0aGUgaGlnaCBmaWVsZCBpcyB1bnVzZWQsIGFuZCB0aGUgZGV2aWNlIG51bWJlciBpcyBjb21wbGV0ZWx5CisJICAgKiBzdG9yZWQgaW4gdGhlIGxvdyBmaWVsZC4gIFNvbWUgd3JpdGVycyBtYXkgaWdub3JlIHRoaXMgc3VidGxldHksCisJICAgKiBhbmQgYXMgYSByZXN1bHQgd2UgdGVzdCB0byBzZWUgaWYgdGhlIGVudGlyZSBkZXZpY2UgbnVtYmVyIGlzCisJICAgKiBzdG9yZWQgaW4gdGhlIGxvdyBmaWVsZCwgYW5kIHVzZSB0aGF0LgorCSAgICovCisJICBpZigobG93ICYgfjB4ZmYpICYmIGhpZ2ggPT0gMCkgeworCSAgICBpbm9kZS0+aV9yZGV2ID0gTUtERVYobG93ID4+IDgsIGxvdyAmIDB4ZmYpOworCSAgfSBlbHNlIHsKKwkgICAgaW5vZGUtPmlfcmRldiA9IE1LREVWKGhpZ2gsIGxvdyk7CisJICB9CisJfQorCWJyZWFrOworICAgICAgY2FzZSBTSUcoJ1QnLCdGJyk6CisJLyogU29tZSBSUklQIHdyaXRlcnMgaW5jb3JyZWN0bHkgcGxhY2UgY3RpbWUgaW4gdGhlIFRGX0NSRUFURSBmaWVsZC4KKwkgICBUcnkgdG8gaGFuZGxlIHRoaXMgY29ycmVjdGx5IGZvciBlaXRoZXIgY2FzZS4gKi8KKwljbnQgPSAwOyAvKiBSb2NrIHJpZGdlIG5ldmVyIGFwcGVhcnMgb24gYSBIaWdoIFNpZXJyYSBkaXNrICovCisJaWYocnItPnUuVEYuZmxhZ3MgJiBURl9DUkVBVEUpIHsgCisJICBpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBpc29fZGF0ZShyci0+dS5URi50aW1lc1tjbnQrK10udGltZSwgMCk7CisJICBpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKKwl9CisJaWYocnItPnUuVEYuZmxhZ3MgJiBURl9NT0RJRlkpIHsKKwkgIGlub2RlLT5pX210aW1lLnR2X3NlYyA9IGlzb19kYXRlKHJyLT51LlRGLnRpbWVzW2NudCsrXS50aW1lLCAwKTsKKwkgIGlub2RlLT5pX210aW1lLnR2X25zZWMgPSAwOworCX0KKwlpZihyci0+dS5URi5mbGFncyAmIFRGX0FDQ0VTUykgeworCSAgaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gaXNvX2RhdGUocnItPnUuVEYudGltZXNbY250KytdLnRpbWUsIDApOworCSAgaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7CisJfQorCWlmKHJyLT51LlRGLmZsYWdzICYgVEZfQVRUUklCVVRFUykgeyAKKwkgIGlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IGlzb19kYXRlKHJyLT51LlRGLnRpbWVzW2NudCsrXS50aW1lLCAwKTsKKwkgIGlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOworCX0gCisJYnJlYWs7CisgICAgICBjYXNlIFNJRygnUycsJ0wnKToKKwl7aW50IHNsZW47CisJIHN0cnVjdCBTTF9jb21wb25lbnQgKiBzbHA7CisJIHN0cnVjdCBTTF9jb21wb25lbnQgKiBvbGRzbHA7CisJIHNsZW4gPSByci0+bGVuIC0gNTsKKwkgc2xwID0gJnJyLT51LlNMLmxpbms7CisJIGlub2RlLT5pX3NpemUgPSBzeW1saW5rX2xlbjsKKwkgd2hpbGUgKHNsZW4gPiAxKXsKKwkgICByb290ZmxhZyA9IDA7CisJICAgc3dpdGNoKHNscC0+ZmxhZ3MgJn4xKXsKKwkgICBjYXNlIDA6CisJICAgICBpbm9kZS0+aV9zaXplICs9IHNscC0+bGVuOworCSAgICAgYnJlYWs7CisJICAgY2FzZSAyOgorCSAgICAgaW5vZGUtPmlfc2l6ZSArPSAxOworCSAgICAgYnJlYWs7CisJICAgY2FzZSA0OgorCSAgICAgaW5vZGUtPmlfc2l6ZSArPSAyOworCSAgICAgYnJlYWs7CisJICAgY2FzZSA4OgorCSAgICAgcm9vdGZsYWcgPSAxOworCSAgICAgaW5vZGUtPmlfc2l6ZSArPSAxOworCSAgICAgYnJlYWs7CisJICAgZGVmYXVsdDoKKwkgICAgIHByaW50aygiU3ltbGluayBjb21wb25lbnQgZmxhZyBub3QgaW1wbGVtZW50ZWRcbiIpOworCSAgIH0KKwkgICBzbGVuIC09IHNscC0+bGVuICsgMjsKKwkgICBvbGRzbHAgPSBzbHA7CisJICAgc2xwID0gKHN0cnVjdCBTTF9jb21wb25lbnQgKikgKCgoY2hhciAqKSBzbHApICsgc2xwLT5sZW4gKyAyKTsKKworCSAgIGlmKHNsZW4gPCAyKSB7CisJICAgICBpZiggICAgKChyci0+dS5TTC5mbGFncyAmIDEpICE9IDApIAorCQkgICAgJiYgKChvbGRzbHAtPmZsYWdzICYgMSkgPT0gMCkgKSBpbm9kZS0+aV9zaXplICs9IDE7CisJICAgICBicmVhazsKKwkgICB9CisKKwkgICAvKgorCSAgICAqIElmIHRoaXMgY29tcG9uZW50IHJlY29yZCBpc24ndCBjb250aW51ZWQsIHRoZW4gYXBwZW5kIGEgJy8nLgorCSAgICAqLworCSAgIGlmICghcm9vdGZsYWcgJiYgKG9sZHNscC0+ZmxhZ3MgJiAxKSA9PSAwKQorCQkgICBpbm9kZS0+aV9zaXplICs9IDE7CisJIH0KKwl9CisJc3ltbGlua19sZW4gPSBpbm9kZS0+aV9zaXplOworCWJyZWFrOworICAgICAgY2FzZSBTSUcoJ1InLCdFJyk6CisJcHJpbnRrKEtFUk5fV0FSTklORyAiQXR0ZW1wdCB0byByZWFkIGlub2RlIGZvciByZWxvY2F0ZWQgZGlyZWN0b3J5XG4iKTsKKwlnb3RvIG91dDsKKyAgICAgIGNhc2UgU0lHKCdDJywnTCcpOgorCUlTT0ZTX0koaW5vZGUpLT5pX2ZpcnN0X2V4dGVudCA9IGlzb251bV83MzMocnItPnUuQ0wubG9jYXRpb24pOworCXJlbG9jID0gaXNvZnNfaWdldChpbm9kZS0+aV9zYiwgSVNPRlNfSShpbm9kZSktPmlfZmlyc3RfZXh0ZW50LCAwKTsKKwlpZiAoIXJlbG9jKQorCQlnb3RvIG91dDsKKwlpbm9kZS0+aV9tb2RlID0gcmVsb2MtPmlfbW9kZTsKKwlpbm9kZS0+aV9ubGluayA9IHJlbG9jLT5pX25saW5rOworCWlub2RlLT5pX3VpZCA9IHJlbG9jLT5pX3VpZDsKKwlpbm9kZS0+aV9naWQgPSByZWxvYy0+aV9naWQ7CisJaW5vZGUtPmlfcmRldiA9IHJlbG9jLT5pX3JkZXY7CisJaW5vZGUtPmlfc2l6ZSA9IHJlbG9jLT5pX3NpemU7CisJaW5vZGUtPmlfYmxvY2tzID0gcmVsb2MtPmlfYmxvY2tzOworCWlub2RlLT5pX2F0aW1lID0gcmVsb2MtPmlfYXRpbWU7CisJaW5vZGUtPmlfY3RpbWUgPSByZWxvYy0+aV9jdGltZTsKKwlpbm9kZS0+aV9tdGltZSA9IHJlbG9jLT5pX210aW1lOworCWlwdXQocmVsb2MpOworCWJyZWFrOworI2lmZGVmIENPTkZJR19aSVNPRlMKKyAgICAgIGNhc2UgU0lHKCdaJywnRicpOgorCSAgICAgIGlmICggIUlTT0ZTX1NCKGlub2RlLT5pX3NiKS0+c19ub2NvbXByZXNzICkgeworCQkgICAgICBpbnQgYWxnbzsKKwkJICAgICAgYWxnbyA9IGlzb251bV83MjEocnItPnUuWkYuYWxnb3JpdGhtKTsKKwkJICAgICAgaWYgKCBhbGdvID09IFNJRygncCcsJ3onKSApIHsKKwkJCSAgICAgIGludCBibG9ja19zaGlmdCA9IGlzb251bV83MTEoJnJyLT51LlpGLnBhcm1zWzFdKTsKKwkJCSAgICAgIGlmICggYmxvY2tfc2hpZnQgPCBQQUdFX0NBQ0hFX1NISUZUIHx8IGJsb2NrX3NoaWZ0ID4gMTcgKSB7CisJCQkJICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiaXNvZnM6IENhbid0IGhhbmRsZSBaRiBibG9jayBzaXplIG9mIDJeJWRcbiIsIGJsb2NrX3NoaWZ0KTsKKwkJCSAgICAgIH0gZWxzZSB7CisJCQkJLyogTm90ZTogd2UgZG9uJ3QgY2hhbmdlIGlfYmxvY2tzIGhlcmUgKi8KKwkJCQkgICAgICBJU09GU19JKGlub2RlKS0+aV9maWxlX2Zvcm1hdCA9IGlzb2ZzX2ZpbGVfY29tcHJlc3NlZDsKKwkJCQkvKiBQYXJhbWV0ZXJzIHRvIGNvbXByZXNzaW9uIGFsZ29yaXRobSAoaGVhZGVyIHNpemUsIGJsb2NrIHNpemUpICovCisJCQkJICAgICAgSVNPRlNfSShpbm9kZSktPmlfZm9ybWF0X3Bhcm1bMF0gPSBpc29udW1fNzExKCZyci0+dS5aRi5wYXJtc1swXSk7CisJCQkJICAgICAgSVNPRlNfSShpbm9kZSktPmlfZm9ybWF0X3Bhcm1bMV0gPSBpc29udW1fNzExKCZyci0+dS5aRi5wYXJtc1sxXSk7CisJCQkJICAgICAgaW5vZGUtPmlfc2l6ZSA9IGlzb251bV83MzMocnItPnUuWkYucmVhbF9zaXplKTsKKwkJCSAgICAgIH0KKwkJICAgICAgfSBlbHNlIHsKKwkJCSAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImlzb2ZzOiBVbmtub3duIFpGIGNvbXByZXNzaW9uIGFsZ29yaXRobTogJWMlY1xuIiwKKwkJCQkgICAgIHJyLT51LlpGLmFsZ29yaXRobVswXSwgcnItPnUuWkYuYWxnb3JpdGhtWzFdKTsKKwkJICAgICAgfQorCSAgICAgIH0KKwkgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgZGVmYXVsdDoKKwlicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgTUFZQkVfQ09OVElOVUUocmVwZWF0LGlub2RlKTsKKyBvdXQ6CisgIGlmKGJ1ZmZlcikga2ZyZWUoYnVmZmVyKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICpnZXRfc3ltbGlua19jaHVuayhjaGFyICpycG50LCBzdHJ1Y3Qgcm9ja19yaWRnZSAqcnIsIGNoYXIgKnBsaW1pdCkKK3sKKwlpbnQgc2xlbjsKKwlpbnQgcm9vdGZsYWc7CisJc3RydWN0IFNMX2NvbXBvbmVudCAqb2xkc2xwOworCXN0cnVjdCBTTF9jb21wb25lbnQgKnNscDsKKwlzbGVuID0gcnItPmxlbiAtIDU7CisJc2xwID0gJnJyLT51LlNMLmxpbms7CisJd2hpbGUgKHNsZW4gPiAxKSB7CisJCXJvb3RmbGFnID0gMDsKKwkJc3dpdGNoIChzbHAtPmZsYWdzICYgfjEpIHsKKwkJY2FzZSAwOgorCQkJaWYgKHNscC0+bGVuID4gcGxpbWl0IC0gcnBudCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCW1lbWNweShycG50LCBzbHAtPnRleHQsIHNscC0+bGVuKTsKKwkJCXJwbnQrPXNscC0+bGVuOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWlmIChycG50ID49IHBsaW1pdCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCSpycG50Kys9Jy4nOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWlmICgyID4gcGxpbWl0IC0gcnBudCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCSpycG50Kys9Jy4nOworCQkJKnJwbnQrKz0nLic7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJaWYgKHJwbnQgPj0gcGxpbWl0KQorCQkJCXJldHVybiBOVUxMOworCQkJcm9vdGZsYWcgPSAxOworCQkJKnJwbnQrKz0nLyc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiU3ltbGluayBjb21wb25lbnQgZmxhZyBub3QgaW1wbGVtZW50ZWQgKCVkKVxuIiwKKwkJCSAgICAgc2xwLT5mbGFncyk7CisJCX0KKwkJc2xlbiAtPSBzbHAtPmxlbiArIDI7CisJCW9sZHNscCA9IHNscDsKKwkJc2xwID0gKHN0cnVjdCBTTF9jb21wb25lbnQgKikgKChjaGFyICopIHNscCArIHNscC0+bGVuICsgMik7CisKKwkJaWYgKHNsZW4gPCAyKSB7CisJCQkvKgorCQkJICogSWYgdGhlcmUgaXMgYW5vdGhlciBTTCByZWNvcmQsIGFuZCB0aGlzIGNvbXBvbmVudAorCQkJICogcmVjb3JkIGlzbid0IGNvbnRpbnVlZCwgdGhlbiBhZGQgYSBzbGFzaC4KKwkJCSAqLworCQkJaWYgKCghcm9vdGZsYWcpICYmIChyci0+dS5TTC5mbGFncyAmIDEpICYmCisJCQkgICAgIShvbGRzbHAtPmZsYWdzICYgMSkpIHsKKwkJCQlpZiAocnBudCA+PSBwbGltaXQpCisJCQkJCXJldHVybiBOVUxMOworCQkJCSpycG50Kys9Jy8nOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGlzIGNvbXBvbmVudCByZWNvcmQgaXNuJ3QgY29udGludWVkLCB0aGVuIGFwcGVuZCBhICcvJy4KKwkJICovCisJCWlmICghcm9vdGZsYWcgJiYgIShvbGRzbHAtPmZsYWdzICYgMSkpIHsKKwkJCWlmIChycG50ID49IHBsaW1pdCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCSpycG50Kys9Jy8nOworCQl9CisJfQorCXJldHVybiBycG50OworfQorCitpbnQgcGFyc2Vfcm9ja19yaWRnZV9pbm9kZShzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiBkZSwKKwkJCSAgIHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworICAgaW50IHJlc3VsdD1wYXJzZV9yb2NrX3JpZGdlX2lub2RlX2ludGVybmFsKGRlLGlub2RlLDApOworICAgLyogaWYgcm9ja3JpZGdlIGZsYWcgd2FzIHJlc2V0IGFuZCB3ZSBkaWRuJ3QgbG9vayBmb3IgYXR0cmlidXRlcworICAgICogYmVoaW5kIGV2ZW50dWFsIFhBIGF0dHJpYnV0ZXMsIGhhdmUgYSBsb29rIHRoZXJlICovCisgICBpZiAoKElTT0ZTX1NCKGlub2RlLT5pX3NiKS0+c19yb2NrX29mZnNldD09LTEpCisgICAgICAgJiYoSVNPRlNfU0IoaW5vZGUtPmlfc2IpLT5zX3JvY2s9PTIpKQorICAgICB7CisJcmVzdWx0PXBhcnNlX3JvY2tfcmlkZ2VfaW5vZGVfaW50ZXJuYWwoZGUsaW5vZGUsMTQpOworICAgICB9CisgICByZXR1cm4gcmVzdWx0OworfQorCisvKiByZWFkcGFnZSgpIGZvciBzeW1saW5rczogcmVhZHMgc3ltbGluayBjb250ZW50cyBpbnRvIHRoZSBwYWdlIGFuZCBlaXRoZXIKKyAgIG1ha2VzIGl0IHVwdG9kYXRlIGFuZCByZXR1cm5zIDAgb3IgcmV0dXJucyBlcnJvciAoLUVJTykgKi8KKworc3RhdGljIGludCByb2NrX3JpZGdlX3N5bWxpbmtfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworICAgICAgICBzdHJ1Y3QgaXNvX2lub2RlX2luZm8gKmVpID0gSVNPRlNfSShpbm9kZSk7CisJY2hhciAqbGluayA9IGttYXAocGFnZSk7CisJdW5zaWduZWQgbG9uZyBidWZzaXplID0gSVNPRlNfQlVGRkVSX1NJWkUoaW5vZGUpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJY2hhciAqcnBudCA9IGxpbms7CisJdW5zaWduZWQgY2hhciAqcG50OworCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqcmF3X2lub2RlOworCUNPTlRJTlVFX0RFQ0xTOworCXVuc2lnbmVkIGxvbmcgYmxvY2ssIG9mZnNldDsKKwlpbnQgc2lnOworCWludCBsZW47CisJdW5zaWduZWQgY2hhciAqY2hyOworCXN0cnVjdCByb2NrX3JpZGdlICpycjsKKworCWlmICghSVNPRlNfU0IoaW5vZGUtPmlfc2IpLT5zX3JvY2spCisJCWdvdG8gZXJyb3I7CisKKwlibG9jayA9IGVpLT5pX2lnZXQ1X2Jsb2NrOworCWxvY2tfa2VybmVsKCk7CisJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgYmxvY2spOworCWlmICghYmgpCisJCWdvdG8gb3V0X25vcmVhZDsKKworICAgICAgICBvZmZzZXQgPSBlaS0+aV9pZ2V0NV9vZmZzZXQ7CisJcG50ID0gKHVuc2lnbmVkIGNoYXIgKikgYmgtPmJfZGF0YSArIG9mZnNldDsKKworCXJhd19pbm9kZSA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKikgcG50OworCisJLyoKKwkgKiBJZiB3ZSBnbyBwYXN0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgdGhlcmUgaXMgc29tZSBzb3J0IG9mIGVycm9yLgorCSAqLworCWlmIChvZmZzZXQgKyAqcG50ID4gYnVmc2l6ZSkKKwkJZ290byBvdXRfYmFkX3NwYW47CisKKwkvKiBOb3cgdGVzdCBmb3IgcG9zc2libGUgUm9jayBSaWRnZSBleHRlbnNpb25zIHdoaWNoIHdpbGwgb3ZlcnJpZGUKKwkgICBzb21lIG9mIHRoZXNlIG51bWJlcnMgaW4gdGhlIGlub2RlIHN0cnVjdHVyZS4gKi8KKworCVNFVFVQX1JPQ0tfUklER0UocmF3X2lub2RlLCBjaHIsIGxlbik7CisKKyAgICAgIHJlcGVhdDoKKwl3aGlsZSAobGVuID4gMikgeyAvKiBUaGVyZSBtYXkgYmUgb25lIGJ5dGUgZm9yIHBhZGRpbmcgc29tZXdoZXJlICovCisJCXJyID0gKHN0cnVjdCByb2NrX3JpZGdlICopIGNocjsKKwkJaWYgKHJyLT5sZW4gPCAzKQorCQkJZ290byBvdXQ7CS8qIFNvbWV0aGluZyBnb3Qgc2NyZXdlZCB1cCBoZXJlICovCisJCXNpZyA9IGlzb251bV83MjEoY2hyKTsKKwkJY2hyICs9IHJyLT5sZW47CisJCWxlbiAtPSByci0+bGVuOworCQlpZiAobGVuIDwgMCkKKwkJCWdvdG8gb3V0OwkvKiBjb3JydXB0ZWQgaXNvZnMgKi8KKworCQlzd2l0Y2ggKHNpZykgeworCQljYXNlIFNJRygnUicsICdSJyk6CisJCQlpZiAoKHJyLT51LlJSLmZsYWdzWzBdICYgUlJfU0wpID09IDApCisJCQkJZ290byBvdXQ7CisJCQlicmVhazsKKwkJY2FzZSBTSUcoJ1MnLCAnUCcpOgorCQkJQ0hFQ0tfU1AoZ290byBvdXQpOworCQkJYnJlYWs7CisJCWNhc2UgU0lHKCdTJywgJ0wnKToKKwkJCXJwbnQgPSBnZXRfc3ltbGlua19jaHVuayhycG50LCByciwKKwkJCQkJCSBsaW5rICsgKFBBR0VfU0laRSAtIDEpKTsKKwkJCWlmIChycG50ID09IE5VTEwpCisJCQkJZ290byBvdXQ7CisJCQlicmVhazsKKwkJY2FzZSBTSUcoJ0MnLCAnRScpOgorCQkJLyogVGhpcyB0ZWxscyBpcyBpZiB0aGVyZSBpcyBhIGNvbnRpbnVhdGlvbiByZWNvcmQgKi8KKwkJCUNIRUNLX0NFOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJTUFZQkVfQ09OVElOVUUocmVwZWF0LCBpbm9kZSk7CisJaWYgKGJ1ZmZlcikKKwkJa2ZyZWUoYnVmZmVyKTsKKworCWlmIChycG50ID09IGxpbmspCisJCWdvdG8gZmFpbDsKKwlicmVsc2UoYmgpOworCSpycG50ID0gJ1wwJzsKKwl1bmxvY2tfa2VybmVsKCk7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKKworCS8qIGVycm9yIGV4aXQgZnJvbSBtYWNybyAqLworICAgICAgb3V0OgorCWlmIChidWZmZXIpCisJCWtmcmVlKGJ1ZmZlcik7CisJZ290byBmYWlsOworICAgICAgb3V0X25vcmVhZDoKKwlwcmludGsoInVuYWJsZSB0byByZWFkIGktbm9kZSBibG9jayIpOworCWdvdG8gZmFpbDsKKyAgICAgIG91dF9iYWRfc3BhbjoKKwlwcmludGsoInN5bWxpbmsgc3BhbnMgaXNvOTY2MCBibG9ja3NcbiIpOworICAgICAgZmFpbDoKKwlicmVsc2UoYmgpOworCXVubG9ja19rZXJuZWwoKTsKKyAgICAgIGVycm9yOgorCVNldFBhZ2VFcnJvcihwYWdlKTsKKwlrdW5tYXAocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgaXNvZnNfc3ltbGlua19hb3BzID0geworCS5yZWFkcGFnZQk9IHJvY2tfcmlkZ2Vfc3ltbGlua19yZWFkcGFnZQorfTsKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL3JvY2suaCBiL2ZzL2lzb2ZzL3JvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWFmNWM4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvaXNvZnMvcm9jay5oCkBAIC0wLDAgKzEsMTE5IEBACisvKiBUaGVzZSBzdHJ1Y3RzIGFyZSB1c2VkIGJ5IHRoZSBzeXN0ZW0tdXNlLXNoYXJpbmcgcHJvdG9jb2wsIGluIHdoaWNoIHRoZQorICAgUm9jayBSaWRnZSBleHRlbnNpb25zIGFyZSBlbWJlZGRlZC4gIEl0IGlzIHF1aXRlIHBvc3NpYmxlIHRoYXQgb3RoZXIKKyAgIGV4dGVuc2lvbnMgYXJlIHByZXNlbnQgb24gdGhlIGRpc2ssIGFuZCB0aGlzIGlzIGZpbmUgYXMgbG9uZyBhcyB0aGV5CisgICBhbGwgdXNlIFNVU1AgKi8KKworc3RydWN0IFNVX1NQeworICB1bnNpZ25lZCBjaGFyIG1hZ2ljWzJdOworICB1bnNpZ25lZCBjaGFyIHNraXA7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgU1VfQ0V7CisgIGNoYXIgZXh0ZW50WzhdOworICBjaGFyIG9mZnNldFs4XTsKKyAgY2hhciBzaXplWzhdOworfTsKKworc3RydWN0IFNVX0VSeworICB1bnNpZ25lZCBjaGFyIGxlbl9pZDsKKyAgdW5zaWduZWQgY2hhciBsZW5fZGVzOworICB1bnNpZ25lZCBjaGFyIGxlbl9zcmM7CisgIHVuc2lnbmVkIGNoYXIgZXh0X3ZlcjsKKyAgY2hhciBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IFJSX1JSeworICBjaGFyIGZsYWdzWzFdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IFJSX1BYeworICBjaGFyIG1vZGVbOF07CisgIGNoYXIgbl9saW5rc1s4XTsKKyAgY2hhciB1aWRbOF07CisgIGNoYXIgZ2lkWzhdOworfTsKKworc3RydWN0IFJSX1BOeworICBjaGFyIGRldl9oaWdoWzhdOworICBjaGFyIGRldl9sb3dbOF07Cit9OworCisKK3N0cnVjdCBTTF9jb21wb25lbnR7CisgIHVuc2lnbmVkIGNoYXIgZmxhZ3M7CisgIHVuc2lnbmVkIGNoYXIgbGVuOworICBjaGFyIHRleHRbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgUlJfU0x7CisgIHVuc2lnbmVkIGNoYXIgZmxhZ3M7CisgIHN0cnVjdCBTTF9jb21wb25lbnQgbGluazsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBSUl9OTXsKKyAgdW5zaWduZWQgY2hhciBmbGFnczsKKyAgY2hhciBuYW1lWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IFJSX0NMeworICBjaGFyIGxvY2F0aW9uWzhdOworfTsKKworc3RydWN0IFJSX1BMeworICBjaGFyIGxvY2F0aW9uWzhdOworfTsKKworc3RydWN0IHN0YW1weworICBjaGFyIHRpbWVbN107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgUlJfVEZ7CisgIGNoYXIgZmxhZ3M7CisgIHN0cnVjdCBzdGFtcCB0aW1lc1swXTsgIC8qIFZhcmlhYmxlIG51bWJlciBvZiB0aGVzZSBiZWFzdHMgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIExpbnV4LXNwZWNpZmljIGV4dGVuc2lvbiBmb3IgdHJhbnNwYXJlbnQgZGVjb21wcmVzc2lvbiAqLworc3RydWN0IFJSX1pGeworICBjaGFyIGFsZ29yaXRobVsyXTsKKyAgY2hhciBwYXJtc1syXTsKKyAgY2hhciByZWFsX3NpemVbOF07Cit9OworCisvKiBUaGVzZSBhcmUgdGhlIGJpdHMgYW5kIHRoZWlyIG1lYW5pbmdzIGZvciBmbGFncyBpbiB0aGUgVEYgc3RydWN0dXJlLiAqLworI2RlZmluZSBURl9DUkVBVEUgMQorI2RlZmluZSBURl9NT0RJRlkgMgorI2RlZmluZSBURl9BQ0NFU1MgNAorI2RlZmluZSBURl9BVFRSSUJVVEVTIDgKKyNkZWZpbmUgVEZfQkFDS1VQIDE2CisjZGVmaW5lIFRGX0VYUElSQVRJT04gMzIKKyNkZWZpbmUgVEZfRUZGRUNUSVZFIDY0CisjZGVmaW5lIFRGX0xPTkdfRk9STSAxMjgKKworc3RydWN0IHJvY2tfcmlkZ2V7CisgIGNoYXIgc2lnbmF0dXJlWzJdOworICB1bnNpZ25lZCBjaGFyIGxlbjsKKyAgdW5zaWduZWQgY2hhciB2ZXJzaW9uOworICB1bmlvbnsKKyAgICBzdHJ1Y3QgU1VfU1AgU1A7CisgICAgc3RydWN0IFNVX0NFIENFOworICAgIHN0cnVjdCBTVV9FUiBFUjsKKyAgICBzdHJ1Y3QgUlJfUlIgUlI7CisgICAgc3RydWN0IFJSX1BYIFBYOworICAgIHN0cnVjdCBSUl9QTiBQTjsKKyAgICBzdHJ1Y3QgUlJfU0wgU0w7CisgICAgc3RydWN0IFJSX05NIE5NOworICAgIHN0cnVjdCBSUl9DTCBDTDsKKyAgICBzdHJ1Y3QgUlJfUEwgUEw7CisgICAgc3RydWN0IFJSX1RGIFRGOworICAgIHN0cnVjdCBSUl9aRiBaRjsKKyAgfSB1OworfTsKKworI2RlZmluZSBSUl9QWCAxICAgLyogUE9TSVggYXR0cmlidXRlcyAqLworI2RlZmluZSBSUl9QTiAyICAgLyogUE9TSVggZGV2aWNlcyAqLworI2RlZmluZSBSUl9TTCA0ICAgLyogU3ltYm9saWMgbGluayAqLworI2RlZmluZSBSUl9OTSA4ICAgLyogQWx0ZXJuYXRlIE5hbWUgKi8KKyNkZWZpbmUgUlJfQ0wgMTYgIC8qIENoaWxkIGxpbmsgKi8KKyNkZWZpbmUgUlJfUEwgMzIgIC8qIFBhcmVudCBsaW5rICovCisjZGVmaW5lIFJSX1JFIDY0ICAvKiBSZWxvY2F0aW9uIGRpcmVjdG9yeSAqLworI2RlZmluZSBSUl9URiAxMjggLyogVGltZXN0YW1wcyAqLwpkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvdXRpbC5jIGIvZnMvaXNvZnMvdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNmQ5YzEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9pc29mcy91dGlsLmMKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqICBsaW51eC9mcy9pc29mcy91dGlsLmMKKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaXNvX2ZzLmg+CisKKy8qIAorICogV2UgaGF2ZSB0byBjb252ZXJ0IGZyb20gYSBNTS9ERC9ZWSBmb3JtYXQgdG8gdGhlIFVuaXggY3RpbWUgZm9ybWF0LgorICogV2UgaGF2ZSB0byB0YWtlIGludG8gYWNjb3VudCBsZWFwIHllYXJzIGFuZCBhbGwgb2YgdGhhdCBnb29kIHN0dWZmLgorICogVW5mb3J0dW5hdGVseSwgdGhlIGtlcm5lbCBkb2VzIG5vdCBoYXZlIHRoZSBpbmZvcm1hdGlvbiBvbiBoYW5kIHRvCisgKiB0YWtlIGludG8gYWNjb3VudCBkYXlsaWdodCBzYXZpbmdzIHRpbWUsIGJ1dCBpdCBzaG91bGRuJ3QgbWF0dGVyLgorICogVGhlIHRpbWUgc3RvcmVkIHNob3VsZCBiZSBsb2NhbHRpbWUgKHdpdGggb3Igd2l0aG91dCBEU1QgaW4gZWZmZWN0KSwKKyAqIGFuZCB0aGUgdGltZXpvbmUgb2Zmc2V0IHNob3VsZCBob2xkIHRoZSBvZmZzZXQgcmVxdWlyZWQgdG8gZ2V0IGJhY2sKKyAqIHRvIEdNVC4gIFRodXMgIHdlIHNob3VsZCBhbHdheXMgYmUgY29ycmVjdC4KKyAqLworCitpbnQgaXNvX2RhdGUoY2hhciAqIHAsIGludCBmbGFnKQoreworCWludCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgdHo7CisJaW50IGNydGltZSwgZGF5cywgaTsKKworCXllYXIgPSBwWzBdIC0gNzA7CisJbW9udGggPSBwWzFdOworCWRheSA9IHBbMl07CisJaG91ciA9IHBbM107CisJbWludXRlID0gcFs0XTsKKwlzZWNvbmQgPSBwWzVdOworCWlmIChmbGFnID09IDApIHR6ID0gcFs2XTsgLyogSGlnaCBzaWVycmEgaGFzIG5vIHRpbWUgem9uZSAqLworCWVsc2UgdHogPSAwOworCQorCWlmICh5ZWFyIDwgMCkgeworCQljcnRpbWUgPSAwOworCX0gZWxzZSB7CisJCWludCBtb25sZW5bMTJdID0gezMxLDI4LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxfTsKKworCQlkYXlzID0geWVhciAqIDM2NTsKKwkJaWYgKHllYXIgPiAyKQorCQkJZGF5cyArPSAoeWVhcisxKSAvIDQ7CisJCWZvciAoaSA9IDE7IGkgPCBtb250aDsgaSsrKQorCQkJZGF5cyArPSBtb25sZW5baS0xXTsKKwkJaWYgKCgoeWVhcisyKSAlIDQpID09IDAgJiYgbW9udGggPiAyKQorCQkJZGF5cysrOworCQlkYXlzICs9IGRheSAtIDE7CisJCWNydGltZSA9ICgoKChkYXlzICogMjQpICsgaG91cikgKiA2MCArIG1pbnV0ZSkgKiA2MCkKKwkJCSsgc2Vjb25kOworCisJCS8qIHNpZ24gZXh0ZW5kICovCisJCWlmICh0eiAmIDB4ODApCisJCQl0eiB8PSAoLTEgPDwgOCk7CisJCQorCQkvKiAKKwkJICogVGhlIHRpbWV6b25lIG9mZnNldCBpcyB1bnJlbGlhYmxlIG9uIHNvbWUgZGlza3MsCisJCSAqIHNvIHdlIG1ha2UgYSBzYW5pdHkgY2hlY2suICBJbiBubyBjYXNlIGlzIGl0IGV2ZXIKKwkJICogbW9yZSB0aGFuIDEzIGhvdXJzIGZyb20gR01ULCB3aGljaCBpcyA1MioxNW1pbi4KKwkJICogVGhlIHRpbWUgaXMgYWx3YXlzIHN0b3JlZCBpbiBsb2NhbHRpbWUgd2l0aCB0aGUKKwkJICogdGltZXpvbmUgb2Zmc2V0IGJlaW5nIHdoYXQgZ2V0IGFkZGVkIHRvIEdNVCB0bworCQkgKiBnZXQgdG8gbG9jYWx0aW1lLiAgVGh1cyB3ZSBuZWVkIHRvIHN1YnRyYWN0IHRoZSBvZmZzZXQKKwkJICogdG8gZ2V0IHRvIHRydWUgR01ULCB3aGljaCBpcyB3aGF0IHdlIHN0b3JlIHRoZSB0aW1lCisJCSAqIGFzIGludGVybmFsbHkuICBPbiB0aGUgbG9jYWwgc3lzdGVtLCB0aGUgdXNlciBtYXkgc2V0CisJCSAqIHRoZWlyIHRpbWV6b25lIGFueSB3YXkgdGhleSB3aXNoLCBvZiBjb3Vyc2UsIHNvIEdNVAorCQkgKiBnZXRzIGNvbnZlcnRlZCBiYWNrIHRvIGxvY2FsdGltZSBvbiB0aGUgcmVjZWl2aW5nCisJCSAqIHN5c3RlbS4KKwkJICoKKwkJICogTk9URTogbWtpc29mcyBpbiB2ZXJzaW9ucyBwcmlvciB0byBta2lzb2ZzLTEuMTAgaGFkCisJCSAqIHRoZSBzaWduIHdyb25nIG9uIHRoZSB0aW1lem9uZSBvZmZzZXQuICBUaGlzIGhhcyBub3cKKwkJICogYmVlbiBjb3JyZWN0ZWQgdGhlcmUgdG9vLCBidXQgaWYgeW91IGFyZSBnZXR0aW5nIHNjcmV3eQorCQkgKiByZXN1bHRzIHRoaXMgbWF5IGJlIHRoZSBleHBsYW5hdGlvbi4gIElmIGVub3VnaCBwZW9wbGUKKwkJICogY29tcGxhaW4sIGEgdXNlciBjb25maWd1cmF0aW9uIG9wdGlvbiBjb3VsZCBiZSBhZGRlZAorCQkgKiB0byBhZGQgdGhlIHRpbWV6b25lIG9mZnNldCBpbiB3aXRoIHRoZSB3cm9uZyBzaWduCisJCSAqIGZvciAnY29tcGF0aWJpbGl0eScgd2l0aCBvbGRlciBkaXNjcywgYnV0IEkgY2Fubm90IHNlZSBob3cKKwkJICogaXQgd2lsbCBtYXR0ZXIgdGhhdCBtdWNoLgorCQkgKgorCQkgKiBUaGFua3MgdG8ga3VobG1hdkBlbGVjLmNhbnRlcmJ1cnkuYWMubnogKFZvbGtlciBLdWhsbWFubikKKwkJICogZm9yIHBvaW50aW5nIG91dCB0aGUgc2lnbiBlcnJvci4KKwkJICovCisJCWlmICgtNTIgPD0gdHogJiYgdHogPD0gNTIpCisJCQljcnRpbWUgLT0gdHogKiAxNSAqIDYwOworCX0KKwlyZXR1cm4gY3J0aW1lOworfQkJCisJCmRpZmYgLS1naXQgYS9mcy9pc29mcy96aXNvZnMuaCBiL2ZzL2lzb2ZzL3ppc29mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ODQ4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9pc29mcy96aXNvZnMuaApAQCAtMCwwICsxLDIxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKiAgIAorICogICBDb3B5cmlnaHQgMjAwMSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlIE1BIDAyMTM5LAorICogICBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisgKiAgIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBQcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgZXhwb3J0ZWQgZnJvbSB0aGUgY29tcHJlc3NlZCBpc29mcyBzdWJzeXN0ZW0KKyAqLworCisjaWZkZWYgQ09ORklHX1pJU09GUworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgemlzb2ZzX2FvcHM7CitleHRlcm4gaW50IF9faW5pdCB6aXNvZnNfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHppc29mc19jbGVhbnVwKHZvaWQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9qYmQvTWFrZWZpbGUgYi9mcy9qYmQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhY2E0OAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2piZC9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBqb3VybmFsaW5nIHJvdXRpbmVzLgorIworCitvYmotJChDT05GSUdfSkJEKSArPSBqYmQubworCitqYmQtb2JqcyA6PSB0cmFuc2FjdGlvbi5vIGNvbW1pdC5vIHJlY292ZXJ5Lm8gY2hlY2twb2ludC5vIHJldm9rZS5vIGpvdXJuYWwubwpkaWZmIC0tZ2l0IGEvZnMvamJkL2NoZWNrcG9pbnQuYyBiL2ZzL2piZC9jaGVja3BvaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThkODMwNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2piZC9jaGVja3BvaW50LmMKQEAgLTAsMCArMSw2MzYgQEAKKy8qCisgKiBsaW51eC9mcy9jaGVja3BvaW50LmMKKyAqIAorICogV3JpdHRlbiBieSBTdGVwaGVuIEMuIFR3ZWVkaWUgPHNjdEByZWRoYXQuY29tPiwgMTk5OQorICoKKyAqIENvcHlyaWdodCAxOTk5IFJlZCBIYXQgU29mdHdhcmUgLS0tIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiBDaGVja3BvaW50IHJvdXRpbmVzIGZvciB0aGUgZ2VuZXJpYyBmaWxlc3lzdGVtIGpvdXJuYWxpbmcgY29kZS4gIAorICogUGFydCBvZiB0aGUgZXh0MmZzIGpvdXJuYWxpbmcgc3lzdGVtLiAgCisgKgorICogQ2hlY2twb2ludGluZyBpcyB0aGUgcHJvY2VzcyBvZiBlbnN1cmluZyB0aGF0IGEgc2VjdGlvbiBvZiB0aGUgbG9nIGlzCisgKiBjb21taXR0ZWQgZnVsbHkgdG8gZGlzaywgc28gdGhhdCB0aGF0IHBvcnRpb24gb2YgdGhlIGxvZyBjYW4gYmUKKyAqIHJldXNlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamJkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKy8qCisgKiBVbmxpbmsgYSBidWZmZXIgZnJvbSBhIHRyYW5zYWN0aW9uLiAKKyAqCisgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2J1ZmZlcl91bmxpbmsoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb247CisKKwl0cmFuc2FjdGlvbiA9IGpoLT5iX2NwX3RyYW5zYWN0aW9uOworCWpoLT5iX2NwX3RyYW5zYWN0aW9uID0gTlVMTDsKKworCWpoLT5iX2NwbmV4dC0+Yl9jcHByZXYgPSBqaC0+Yl9jcHByZXY7CisJamgtPmJfY3BwcmV2LT5iX2NwbmV4dCA9IGpoLT5iX2NwbmV4dDsKKwlpZiAodHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0ID09IGpoKQorCQl0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPSBqaC0+Yl9jcG5leHQ7CisJaWYgKHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCA9PSBqaCkKKwkJdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0ID0gTlVMTDsKK30KKworLyoKKyAqIFRyeSB0byByZWxlYXNlIGEgY2hlY2twb2ludGVkIGJ1ZmZlciBmcm9tIGl0cyB0cmFuc2FjdGlvbi4KKyAqIFJldHVybnMgMSBpZiB3ZSByZWxlYXNlZCBpdC4KKyAqIFJlcXVpcmVzIGpfbGlzdF9sb2NrCisgKiBDYWxsZWQgdW5kZXIgamJkX2xvY2tfYmhfc3RhdGUoamgyYmgoamgpKSwgYW5kIGRyb3BzIGl0CisgKi8KK3N0YXRpYyBpbnQgX190cnlfdG9fZnJlZV9jcF9idWYoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKKworCWlmIChqaC0+Yl9qbGlzdCA9PSBCSl9Ob25lICYmICFidWZmZXJfbG9ja2VkKGJoKSAmJiAhYnVmZmVyX2RpcnR5KGJoKSkgeworCQlKQlVGRkVSX1RSQUNFKGpoLCAicmVtb3ZlIGZyb20gY2hlY2twb2ludCBsaXN0Iik7CisJCV9fam91cm5hbF9yZW1vdmVfY2hlY2twb2ludChqaCk7CisJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQlqb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOworCQlCVUZGRVJfVFJBQ0UoYmgsICJyZWxlYXNlIik7CisJCV9fYnJlbHNlKGJoKTsKKwkJcmV0ID0gMTsKKwl9IGVsc2UgeworCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIF9fbG9nX3dhaXRfZm9yX3NwYWNlOiB3YWl0IHVudGlsIHRoZXJlIGlzIHNwYWNlIGluIHRoZSBqb3VybmFsLgorICoKKyAqIENhbGxlZCB1bmRlciBqLXN0YXRlX2xvY2sgKm9ubHkqLiAgSXQgd2lsbCBiZSB1bmxvY2tlZCBpZiB3ZSBoYXZlIHRvIHdhaXQKKyAqIGZvciBhIGNoZWNrcG9pbnQgdG8gZnJlZSB1cCBzb21lIHNwYWNlIGluIHRoZSBsb2cuCisgKi8KK3ZvaWQgX19sb2dfd2FpdF9mb3Jfc3BhY2Uoam91cm5hbF90ICpqb3VybmFsKQoreworCWludCBuYmxvY2tzOworCWFzc2VydF9zcGluX2xvY2tlZCgmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCW5ibG9ja3MgPSBqYmRfc3BhY2VfbmVlZGVkKGpvdXJuYWwpOworCXdoaWxlIChfX2xvZ19zcGFjZV9sZWZ0KGpvdXJuYWwpIDwgbmJsb2NrcykgeworCQlpZiAoam91cm5hbC0+al9mbGFncyAmIEpGU19BQk9SVCkKKwkJCXJldHVybjsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCWRvd24oJmpvdXJuYWwtPmpfY2hlY2twb2ludF9zZW0pOworCisJCS8qCisJCSAqIFRlc3QgYWdhaW4sIGFub3RoZXIgcHJvY2VzcyBtYXkgaGF2ZSBjaGVja3BvaW50ZWQgd2hpbGUgd2UKKwkJICogd2VyZSB3YWl0aW5nIGZvciB0aGUgY2hlY2twb2ludCBsb2NrCisJCSAqLworCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCW5ibG9ja3MgPSBqYmRfc3BhY2VfbmVlZGVkKGpvdXJuYWwpOworCQlpZiAoX19sb2dfc3BhY2VfbGVmdChqb3VybmFsKSA8IG5ibG9ja3MpIHsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQkJbG9nX2RvX2NoZWNrcG9pbnQoam91cm5hbCk7CisJCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCX0KKwkJdXAoJmpvdXJuYWwtPmpfY2hlY2twb2ludF9zZW0pOworCX0KK30KKworLyoKKyAqIFdlIHdlcmUgdW5hYmxlIHRvIHBlcmZvcm0gamJkX3RyeWxvY2tfYmhfc3RhdGUoKSBpbnNpZGUgal9saXN0X2xvY2suCisgKiBUaGUgY2FsbGVyIG11c3QgcmVzdGFydCBhIGxpc3Qgd2Fsay4gIFdhaXQgZm9yIHNvbWVvbmUgZWxzZSB0byBydW4KKyAqIGpiZF91bmxvY2tfYmhfc3RhdGUoKS4KKyAqLworc3RhdGljIHZvaWQgamJkX3N5bmNfYmgoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWdldF9iaChiaCk7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwlqYmRfbG9ja19iaF9zdGF0ZShiaCk7CisJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJcHV0X2JoKGJoKTsKK30KKworLyoKKyAqIENsZWFuIHVwIGEgdHJhbnNhY3Rpb24ncyBjaGVja3BvaW50IGxpc3QuICAKKyAqCisgKiBXZSB3YWl0IGZvciBhbnkgcGVuZGluZyBJTyB0byBjb21wbGV0ZSBhbmQgbWFrZSBzdXJlIGFueSBjbGVhbgorICogYnVmZmVycyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSB0cmFuc2FjdGlvbi4gCisgKgorICogUmV0dXJuIDEgaWYgd2UgcGVyZm9ybWVkIGFueSBhY3Rpb25zIHdoaWNoIG1pZ2h0IGhhdmUgZGVzdHJveWVkIHRoZQorICogY2hlY2twb2ludC4gIChqb3VybmFsX3JlbW92ZV9jaGVja3BvaW50KCkgZGVsZXRlcyB0aGUgdHJhbnNhY3Rpb24gd2hlbgorICogdGhlIGxhc3QgY2hlY2twb2ludCBidWZmZXIgaXMgY2xlYW5zZWQpCisgKgorICogQ2FsbGVkIHdpdGggal9saXN0X2xvY2sgaGVsZC4KKyAqLworc3RhdGljIGludCBfX2NsZWFudXBfdHJhbnNhY3Rpb24oam91cm5hbF90ICpqb3VybmFsLCB0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbikKK3sKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCwgKm5leHRfamgsICpsYXN0X2poOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IHJldCA9IDA7CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwlqaCA9IHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdDsKKwlpZiAoIWpoKQorCQlyZXR1cm4gMDsKKworCWxhc3RfamggPSBqaC0+Yl9jcHByZXY7CisJbmV4dF9qaCA9IGpoOworCWRvIHsKKwkJamggPSBuZXh0X2poOworCQliaCA9IGpoMmJoKGpoKTsKKwkJaWYgKGJ1ZmZlcl9sb2NrZWQoYmgpKSB7CisJCQlhdG9taWNfaW5jKCZiaC0+Yl9jb3VudCk7CisJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQkJd2FpdF9vbl9idWZmZXIoYmgpOworCQkJLyogdGhlIGpvdXJuYWxfaGVhZCBtYXkgaGF2ZSBnb25lIGJ5IG5vdyAqLworCQkJQlVGRkVSX1RSQUNFKGJoLCAiYnJlbHNlIik7CisJCQlfX2JyZWxzZShiaCk7CisJCQlnb3RvIG91dF9yZXR1cm5fMTsKKwkJfQorCisJCS8qCisJCSAqIFRoaXMgaXMgZm91bAorCQkgKi8KKwkJaWYgKCFqYmRfdHJ5bG9ja19iaF9zdGF0ZShiaCkpIHsKKwkJCWpiZF9zeW5jX2JoKGpvdXJuYWwsIGJoKTsKKwkJCWdvdG8gb3V0X3JldHVybl8xOworCQl9CisKKwkJaWYgKGpoLT5iX3RyYW5zYWN0aW9uICE9IE5VTEwpIHsKKwkJCXRyYW5zYWN0aW9uX3QgKnQgPSBqaC0+Yl90cmFuc2FjdGlvbjsKKwkJCXRpZF90IHRpZCA9IHQtPnRfdGlkOworCisJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCQlsb2dfc3RhcnRfY29tbWl0KGpvdXJuYWwsIHRpZCk7CisJCQlsb2dfd2FpdF9jb21taXQoam91cm5hbCwgdGlkKTsKKwkJCWdvdG8gb3V0X3JldHVybl8xOworCQl9CisKKwkJLyoKKwkJICogQUtQTTogSSB0aGluayB0aGUgYnVmZmVyX2piZGRpcnR5IHRlc3QgaXMgcmVkdW5kYW50IC0gaXQKKwkJICogc2hvdWxkbid0IGhhdmUgTlVMTCBiX3RyYW5zYWN0aW9uPworCQkgKi8KKwkJbmV4dF9qaCA9IGpoLT5iX2NwbmV4dDsKKwkJaWYgKCFidWZmZXJfZGlydHkoYmgpICYmICFidWZmZXJfamJkZGlydHkoYmgpKSB7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJyZW1vdmUgZnJvbSBjaGVja3BvaW50Iik7CisJCQlfX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQoamgpOworCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCQlqb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOworCQkJX19icmVsc2UoYmgpOworCQkJcmV0ID0gMTsKKwkJfSBlbHNlIHsKKwkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQl9CisJCWpoID0gbmV4dF9qaDsKKwl9IHdoaWxlIChqaCAhPSBsYXN0X2poKTsKKworCXJldHVybiByZXQ7CitvdXRfcmV0dXJuXzE6CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgTlJfQkFUQ0gJNjQKKworc3RhdGljIHZvaWQKK19fZmx1c2hfYmF0Y2goam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMsIGludCAqYmF0Y2hfY291bnQpCit7CisJaW50IGk7CisKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCWxsX3J3X2Jsb2NrKFdSSVRFLCAqYmF0Y2hfY291bnQsIGJocyk7CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJZm9yIChpID0gMDsgaSA8ICpiYXRjaF9jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBiaHNbaV07CisJCWNsZWFyX2J1ZmZlcl9qd3JpdGUoYmgpOworCQlCVUZGRVJfVFJBQ0UoYmgsICJicmVsc2UiKTsKKwkJX19icmVsc2UoYmgpOworCX0KKwkqYmF0Y2hfY291bnQgPSAwOworfQorCisvKgorICogVHJ5IHRvIGZsdXNoIG9uZSBidWZmZXIgZnJvbSB0aGUgY2hlY2twb2ludCBsaXN0IHRvIGRpc2suCisgKgorICogUmV0dXJuIDEgaWYgc29tZXRoaW5nIGhhcHBlbmVkIHdoaWNoIHJlcXVpcmVzIHVzIHRvIGFib3J0IHRoZSBjdXJyZW50CisgKiBzY2FuIG9mIHRoZSBjaGVja3BvaW50IGxpc3QuICAKKyAqCisgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkLgorICogQ2FsbGVkIHVuZGVyIGpiZF9sb2NrX2JoX3N0YXRlKGpoMmJoKGpoKSksIGFuZCBkcm9wcyBpdAorICovCitzdGF0aWMgaW50IF9fZmx1c2hfYnVmZmVyKGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGpvdXJuYWxfaGVhZCAqamgsCisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMsIGludCAqYmF0Y2hfY291bnQsCisJCQlpbnQgKmRyb3BfY291bnQpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChidWZmZXJfZGlydHkoYmgpICYmICFidWZmZXJfbG9ja2VkKGJoKSAmJiBqaC0+Yl9qbGlzdCA9PSBCSl9Ob25lKSB7CisJCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl90cmFuc2FjdGlvbiA9PSBOVUxMKTsKKworCQkvKgorCQkgKiBJbXBvcnRhbnQ6IHdlIGFyZSBhYm91dCB0byB3cml0ZSB0aGUgYnVmZmVyLCBhbmQKKwkJICogcG9zc2libHkgYmxvY2ssIHdoaWxlIHN0aWxsIGhvbGRpbmcgdGhlIGpvdXJuYWwgbG9jay4KKwkJICogV2UgY2Fubm90IGFmZm9yZCB0byBsZXQgdGhlIHRyYW5zYWN0aW9uIGxvZ2ljIHN0YXJ0CisJCSAqIG1lc3NpbmcgYXJvdW5kIHdpdGggdGhpcyBidWZmZXIgYmVmb3JlIHdlIHdyaXRlIGl0IHRvCisJCSAqIGRpc2ssIGFzIHRoYXQgd291bGQgYnJlYWsgcmVjb3ZlcmFiaWxpdHkuICAKKwkJICovCisJCUJVRkZFUl9UUkFDRShiaCwgInF1ZXVlIik7CisJCWdldF9iaChiaCk7CisJCUpfQVNTRVJUX0JIKGJoLCAhYnVmZmVyX2p3cml0ZShiaCkpOworCQlzZXRfYnVmZmVyX2p3cml0ZShiaCk7CisJCWJoc1sqYmF0Y2hfY291bnRdID0gYmg7CisJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQkoKmJhdGNoX2NvdW50KSsrOworCQlpZiAoKmJhdGNoX2NvdW50ID09IE5SX0JBVENIKSB7CisJCQlfX2ZsdXNoX2JhdGNoKGpvdXJuYWwsIGJocywgYmF0Y2hfY291bnQpOworCQkJcmV0ID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCWludCBsYXN0X2J1ZmZlciA9IDA7CisJCWlmIChqaC0+Yl9jcG5leHQgPT0gamgpIHsKKwkJCS8qIFdlIG1heSBiZSBhYm91dCB0byBkcm9wIHRoZSB0cmFuc2FjdGlvbi4gIFRlbGwgdGhlCisJCQkgKiBjYWxsZXIgdGhhdCB0aGUgbGlzdHMgaGF2ZSBjaGFuZ2VkLgorCQkJICovCisJCQlsYXN0X2J1ZmZlciA9IDE7CisJCX0KKwkJaWYgKF9fdHJ5X3RvX2ZyZWVfY3BfYnVmKGpoKSkgeworCQkJKCpkcm9wX2NvdW50KSsrOworCQkJcmV0ID0gbGFzdF9idWZmZXI7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFBlcmZvcm0gYW4gYWN0dWFsIGNoZWNrcG9pbnQuICBXZSBkb24ndCB3cml0ZSBvdXQgb25seSBlbm91Z2ggdG8KKyAqIHNhdGlzZnkgdGhlIGN1cnJlbnQgYmxvY2tlZCByZXF1ZXN0czogcmF0aGVyIHdlIHN1Ym1pdCBhIHJlYXNvbmFibHkKKyAqIHNpemVkIGNodW5rIG9mIHRoZSBvdXRzdGFuZGluZyBkYXRhIHRvIGRpc2sgYXQgb25jZSBmb3IKKyAqIGVmZmljaWVuY3kuICBfX2xvZ193YWl0X2Zvcl9zcGFjZSgpIHdpbGwgcmV0cnkgaWYgd2UgZGlkbid0IGZyZWUgZW5vdWdoLgorICogCisgKiBIb3dldmVyLCB3ZSBfZG9fIHRha2UgaW50byBhY2NvdW50IHRoZSBhbW91bnQgcmVxdWVzdGVkIHNvIHRoYXQgb25jZQorICogdGhlIElPIGhhcyBiZWVuIHF1ZXVlZCwgd2UgY2FuIHJldHVybiBhcyBzb29uIGFzIGVub3VnaCBvZiBpdCBoYXMKKyAqIGNvbXBsZXRlZCB0byBkaXNrLiAgCisgKgorICogVGhlIGpvdXJuYWwgc2hvdWxkIGJlIGxvY2tlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICovCitpbnQgbG9nX2RvX2NoZWNrcG9pbnQoam91cm5hbF90ICpqb3VybmFsKQoreworCWludCByZXN1bHQ7CisJaW50IGJhdGNoX2NvdW50ID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tOUl9CQVRDSF07CisKKwlqYmRfZGVidWcoMSwgIlN0YXJ0IGNoZWNrcG9pbnRcbiIpOworCisJLyogCisJICogRmlyc3QgdGhpbmc6IGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIGluIHRoZSBsb2cgd2hpY2gKKwkgKiBkb24ndCBuZWVkIGNoZWNrcG9pbnRpbmcsIGp1c3QgZWxpbWluYXRlIHRoZW0gZnJvbSB0aGUKKwkgKiBqb3VybmFsIHN0cmFpZ2h0IGF3YXkuICAKKwkgKi8KKwlyZXN1bHQgPSBjbGVhbnVwX2pvdXJuYWxfdGFpbChqb3VybmFsKTsKKwlqYmRfZGVidWcoMSwgImNsZWFudXBfam91cm5hbF90YWlsIHJldHVybmVkICVkXG4iLCByZXN1bHQpOworCWlmIChyZXN1bHQgPD0gMCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCS8qCisJICogT0ssIHdlIG5lZWQgdG8gc3RhcnQgd3JpdGluZyBkaXNrIGJsb2Nrcy4gIFRyeSB0byBmcmVlIHVwIGEKKwkgKiBxdWFydGVyIG9mIHRoZSBsb2cgaW4gYSBzaW5nbGUgY2hlY2twb2ludCBpZiB3ZSBjYW4uCisJICovCisJLyoKKwkgKiBBS1BNOiBjaGVjayB0aGlzIGNvZGUuICBJIGhhZCBhIGZlZWxpbmcgYSB3aGlsZSBiYWNrIHRoYXQgaXQKKwkgKiBkZWdlbmVyYXRlcyBpbnRvIGEgYnVzeSBsb29wIGF0IHVubW91bnQgdGltZS4KKwkgKi8KKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwl3aGlsZSAoam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucykgeworCQl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbjsKKwkJc3RydWN0IGpvdXJuYWxfaGVhZCAqamgsICpsYXN0X2poLCAqbmV4dF9qaDsKKwkJaW50IGRyb3BfY291bnQgPSAwOworCQlpbnQgY2xlYW51cF9yZXQsIHJldHJ5ID0gMDsKKwkJdGlkX3QgdGhpc190aWQ7CisKKwkJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zOworCQl0aGlzX3RpZCA9IHRyYW5zYWN0aW9uLT50X3RpZDsKKwkJamggPSB0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3Q7CisJCWxhc3RfamggPSBqaC0+Yl9jcHByZXY7CisJCW5leHRfamggPSBqaDsKKwkJZG8geworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCQkJamggPSBuZXh0X2poOworCQkJbmV4dF9qaCA9IGpoLT5iX2NwbmV4dDsKKwkJCWJoID0gamgyYmgoamgpOworCQkJaWYgKCFqYmRfdHJ5bG9ja19iaF9zdGF0ZShiaCkpIHsKKwkJCQlqYmRfc3luY19iaChqb3VybmFsLCBiaCk7CisJCQkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQkJcmV0cnkgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJcmV0cnkgPSBfX2ZsdXNoX2J1ZmZlcihqb3VybmFsLCBqaCwgYmhzLCAmYmF0Y2hfY291bnQsICZkcm9wX2NvdW50KTsKKwkJCWlmIChjb25kX3Jlc2NoZWRfbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spKSB7CisJCQkJcmV0cnkgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9IHdoaWxlIChqaCAhPSBsYXN0X2poICYmICFyZXRyeSk7CisKKwkJaWYgKGJhdGNoX2NvdW50KQorCQkJX19mbHVzaF9iYXRjaChqb3VybmFsLCBiaHMsICZiYXRjaF9jb3VudCk7CisKKwkJLyoKKwkJICogSWYgc29tZW9uZSBjbGVhbmVkIHVwIHRoaXMgdHJhbnNhY3Rpb24gd2hpbGUgd2Ugc2xlcHQsIHdlJ3JlCisJCSAqIGRvbmUKKwkJICovCisJCWlmIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zICE9IHRyYW5zYWN0aW9uKQorCQkJYnJlYWs7CisJCWlmIChyZXRyeSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBNYXliZSBpdCdzIGEgbmV3IHRyYW5zYWN0aW9uLCBidXQgaXQgZmVsbCBhdCB0aGUgc2FtZQorCQkgKiBhZGRyZXNzCisJCSAqLworCQlpZiAodHJhbnNhY3Rpb24tPnRfdGlkICE9IHRoaXNfdGlkKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIFdlIGhhdmUgd2Fsa2VkIHRoZSB3aG9sZSB0cmFuc2FjdGlvbiBsaXN0IHdpdGhvdXQKKwkJICogZmluZGluZyBhbnl0aGluZyB0byB3cml0ZSB0byBkaXNrLiAgV2UgaGFkIGJldHRlciBiZQorCQkgKiBhYmxlIHRvIG1ha2Ugc29tZSBwcm9ncmVzcyBvciB3ZSBhcmUgaW4gdHJvdWJsZS4gCisJCSAqLworCQljbGVhbnVwX3JldCA9IF9fY2xlYW51cF90cmFuc2FjdGlvbihqb3VybmFsLCB0cmFuc2FjdGlvbik7CisJCUpfQVNTRVJUKGRyb3BfY291bnQgIT0gMCB8fCBjbGVhbnVwX3JldCAhPSAwKTsKKwkJaWYgKGpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgIT0gdHJhbnNhY3Rpb24pCisJCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwlyZXN1bHQgPSBjbGVhbnVwX2pvdXJuYWxfdGFpbChqb3VybmFsKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2sgdGhlIGxpc3Qgb2YgY2hlY2twb2ludCB0cmFuc2FjdGlvbnMgZm9yIHRoZSBqb3VybmFsIHRvIHNlZSBpZgorICogd2UgaGF2ZSBhbHJlYWR5IGdvdCByaWQgb2YgYW55IHNpbmNlIHRoZSBsYXN0IHVwZGF0ZSBvZiB0aGUgbG9nIHRhaWwKKyAqIGluIHRoZSBqb3VybmFsIHN1cGVyYmxvY2suICBJZiBzbywgd2UgY2FuIGluc3RhbnRseSByb2xsIHRoZQorICogc3VwZXJibG9jayBmb3J3YXJkIHRvIHJlbW92ZSB0aG9zZSB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgbG9nLgorICogCisgKiBSZXR1cm4gPDAgb24gZXJyb3IsIDAgb24gc3VjY2VzcywgMSBpZiB0aGVyZSB3YXMgbm90aGluZyB0byBjbGVhbiB1cC4KKyAqIAorICogQ2FsbGVkIHdpdGggdGhlIGpvdXJuYWwgbG9jayBoZWxkLgorICoKKyAqIFRoaXMgaXMgdGhlIG9ubHkgcGFydCBvZiB0aGUgam91cm5hbGluZyBjb2RlIHdoaWNoIHJlYWxseSBuZWVkcyB0byBiZQorICogYXdhcmUgb2YgdHJhbnNhY3Rpb24gYWJvcnRzLiAgQ2hlY2twb2ludGluZyBpbnZvbHZlcyB3cml0aW5nIHRvIHRoZQorICogbWFpbiBmaWxlc3lzdGVtIGFyZWEgcmF0aGVyIHRoYW4gdG8gdGhlIGpvdXJuYWwsIHNvIGl0IGNhbiBwcm9jZWVkCisgKiBldmVuIGluIGFib3J0IHN0YXRlLCBidXQgd2UgbXVzdCBub3QgdXBkYXRlIHRoZSBqb3VybmFsIHN1cGVyYmxvY2sgaWYKKyAqIHdlIGhhdmUgYW4gYWJvcnQgZXJyb3Igb3V0c3RhbmRpbmcuCisgKi8KKworaW50IGNsZWFudXBfam91cm5hbF90YWlsKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwl0cmFuc2FjdGlvbl90ICogdHJhbnNhY3Rpb247CisJdGlkX3QJCWZpcnN0X3RpZDsKKwl1bnNpZ25lZCBsb25nCWJsb2NrbnIsIGZyZWVkOworCisJLyogT0ssIHdvcmsgb3V0IHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gcmVtYWluaW5nIGluIHRoZSBsb2csIGFuZAorCSAqIHRoZSBsb2cgYmxvY2sgaXQgc3RhcnRzIGF0LiAKKwkgKiAKKwkgKiBJZiB0aGUgbG9nIGlzIG5vdyBlbXB0eSwgd2UgbmVlZCB0byB3b3JrIG91dCB3aGljaCBpcyB0aGUKKwkgKiBuZXh0IHRyYW5zYWN0aW9uIElEIHdlIHdpbGwgd3JpdGUsIGFuZCB3aGVyZSBpdCB3aWxsCisJICogc3RhcnQuICovCisKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zOworCWlmICh0cmFuc2FjdGlvbikgeworCQlmaXJzdF90aWQgPSB0cmFuc2FjdGlvbi0+dF90aWQ7CisJCWJsb2NrbnIgPSB0cmFuc2FjdGlvbi0+dF9sb2dfc3RhcnQ7CisJfSBlbHNlIGlmICgodHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24pICE9IE5VTEwpIHsKKwkJZmlyc3RfdGlkID0gdHJhbnNhY3Rpb24tPnRfdGlkOworCQlibG9ja25yID0gdHJhbnNhY3Rpb24tPnRfbG9nX3N0YXJ0OworCX0gZWxzZSBpZiAoKHRyYW5zYWN0aW9uID0gam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKSAhPSBOVUxMKSB7CisJCWZpcnN0X3RpZCA9IHRyYW5zYWN0aW9uLT50X3RpZDsKKwkJYmxvY2tuciA9IGpvdXJuYWwtPmpfaGVhZDsKKwl9IGVsc2UgeworCQlmaXJzdF90aWQgPSBqb3VybmFsLT5qX3RyYW5zYWN0aW9uX3NlcXVlbmNlOworCQlibG9ja25yID0gam91cm5hbC0+al9oZWFkOworCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCUpfQVNTRVJUKGJsb2NrbnIgIT0gMCk7CisKKwkvKiBJZiB0aGUgb2xkZXN0IHBpbm5lZCB0cmFuc2FjdGlvbiBpcyBhdCB0aGUgdGFpbCBvZiB0aGUgbG9nCisgICAgICAgICAgIGFscmVhZHkgdGhlbiB0aGVyZSdzIG5vdCBtdWNoIHdlIGNhbiBkbyByaWdodCBub3cuICovCisJaWYgKGpvdXJuYWwtPmpfdGFpbF9zZXF1ZW5jZSA9PSBmaXJzdF90aWQpIHsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCXJldHVybiAxOworCX0KKworCS8qIE9LLCB1cGRhdGUgdGhlIHN1cGVyYmxvY2sgdG8gcmVjb3ZlciB0aGUgZnJlZWQgc3BhY2UuCisJICogUGh5c2ljYWwgYmxvY2tzIGNvbWUgZmlyc3Q6IGhhdmUgd2Ugd3JhcHBlZCBiZXlvbmQgdGhlIGVuZCBvZgorCSAqIHRoZSBsb2c/ICAqLworCWZyZWVkID0gYmxvY2tuciAtIGpvdXJuYWwtPmpfdGFpbDsKKwlpZiAoYmxvY2tuciA8IGpvdXJuYWwtPmpfdGFpbCkKKwkJZnJlZWQgPSBmcmVlZCArIGpvdXJuYWwtPmpfbGFzdCAtIGpvdXJuYWwtPmpfZmlyc3Q7CisKKwlqYmRfZGVidWcoMSwKKwkJICAiQ2xlYW5pbmcgam91cm5hbCB0YWlsIGZyb20gJWQgdG8gJWQgKG9mZnNldCAlbHUpLCAiCisJCSAgImZyZWVpbmcgJWx1XG4iLAorCQkgIGpvdXJuYWwtPmpfdGFpbF9zZXF1ZW5jZSwgZmlyc3RfdGlkLCBibG9ja25yLCBmcmVlZCk7CisKKwlqb3VybmFsLT5qX2ZyZWUgKz0gZnJlZWQ7CisJam91cm5hbC0+al90YWlsX3NlcXVlbmNlID0gZmlyc3RfdGlkOworCWpvdXJuYWwtPmpfdGFpbCA9IGJsb2NrbnI7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJaWYgKCEoam91cm5hbC0+al9mbGFncyAmIEpGU19BQk9SVCkpCisJCWpvdXJuYWxfdXBkYXRlX3N1cGVyYmxvY2soam91cm5hbCwgMSk7CisJcmV0dXJuIDA7Cit9CisKKworLyogQ2hlY2twb2ludCBsaXN0IG1hbmFnZW1lbnQgKi8KKworLyoKKyAqIGpvdXJuYWxfY2xlYW5fY2hlY2twb2ludF9saXN0CisgKgorICogRmluZCBhbGwgdGhlIHdyaXR0ZW4tYmFjayBjaGVja3BvaW50IGJ1ZmZlcnMgaW4gdGhlIGpvdXJuYWwgYW5kIHJlbGVhc2UgdGhlbS4KKyAqCisgKiBDYWxsZWQgd2l0aCB0aGUgam91cm5hbCBsb2NrZWQuCisgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkLgorICogUmV0dXJucyBudW1iZXIgb2YgYnVmZXJzIHJlYXBlZCAoZm9yIGRlYnVnKQorICovCisKK2ludCBfX2pvdXJuYWxfY2xlYW5fY2hlY2twb2ludF9saXN0KGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbiwgKmxhc3RfdHJhbnNhY3Rpb24sICpuZXh0X3RyYW5zYWN0aW9uOworCWludCByZXQgPSAwOworCisJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zOworCWlmICh0cmFuc2FjdGlvbiA9PSAwKQorCQlnb3RvIG91dDsKKworCWxhc3RfdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbi0+dF9jcHByZXY7CisJbmV4dF90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uOworCWRvIHsKKwkJc3RydWN0IGpvdXJuYWxfaGVhZCAqamg7CisKKwkJdHJhbnNhY3Rpb24gPSBuZXh0X3RyYW5zYWN0aW9uOworCQluZXh0X3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb24tPnRfY3BuZXh0OworCQlqaCA9IHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdDsKKwkJaWYgKGpoKSB7CisJCQlzdHJ1Y3Qgam91cm5hbF9oZWFkICpsYXN0X2poID0gamgtPmJfY3BwcmV2OworCQkJc3RydWN0IGpvdXJuYWxfaGVhZCAqbmV4dF9qaCA9IGpoOworCisJCQlkbyB7CisJCQkJamggPSBuZXh0X2poOworCQkJCW5leHRfamggPSBqaC0+Yl9jcG5leHQ7CisJCQkJLyogVXNlIHRyeWxvY2sgYmVjYXVzZSBvZiB0aGUgcmFua25pZyAqLworCQkJCWlmIChqYmRfdHJ5bG9ja19iaF9zdGF0ZShqaDJiaChqaCkpKQorCQkJCQlyZXQgKz0gX190cnlfdG9fZnJlZV9jcF9idWYoamgpOworCQkJCS8qCisJCQkJICogVGhpcyBmdW5jdGlvbiBvbmx5IGZyZWVzIHVwIHNvbWUgbWVtb3J5CisJCQkJICogaWYgcG9zc2libGUgc28gd2UgZG9udCBoYXZlIGFuIG9ibGlnYXRpb24KKwkJCQkgKiB0byBmaW5pc2ggcHJvY2Vzc2luZy4gQmFpbCBvdXQgaWYgcHJlZW1wdGlvbgorCQkJCSAqIHJlcXVlc3RlZDoKKwkJCQkgKi8KKwkJCQlpZiAobmVlZF9yZXNjaGVkKCkpCisJCQkJCWdvdG8gb3V0OworCQkJfSB3aGlsZSAoamggIT0gbGFzdF9qaCk7CisJCX0KKwl9IHdoaWxlICh0cmFuc2FjdGlvbiAhPSBsYXN0X3RyYW5zYWN0aW9uKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKiAKKyAqIGpvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQ6IGNhbGxlZCBhZnRlciBhIGJ1ZmZlciBoYXMgYmVlbiBjb21taXR0ZWQKKyAqIHRvIGRpc2sgKGVpdGhlciBieSBiZWluZyB3cml0ZS1iYWNrIGZsdXNoZWQgdG8gZGlzaywgb3IgYmVpbmcKKyAqIGNvbW1pdHRlZCB0byB0aGUgbG9nKS4KKyAqCisgKiBXZSBjYW5ub3Qgc2FmZWx5IGNsZWFuIGEgdHJhbnNhY3Rpb24gb3V0IG9mIHRoZSBsb2cgdW50aWwgYWxsIG9mIHRoZQorICogYnVmZmVyIHVwZGF0ZXMgY29tbWl0dGVkIGluIHRoYXQgdHJhbnNhY3Rpb24gaGF2ZSBzYWZlbHkgYmVlbiBzdG9yZWQKKyAqIGVsc2V3aGVyZSBvbiBkaXNrLiAgVG8gYWNoaWV2ZSB0aGlzLCBhbGwgb2YgdGhlIGJ1ZmZlcnMgaW4gYQorICogdHJhbnNhY3Rpb24gbmVlZCB0byBiZSBtYWludGFpbmVkIG9uIHRoZSB0cmFuc2FjdGlvbidzIGNoZWNrcG9pbnQKKyAqIGxpc3QgdW50aWwgdGhleSBoYXZlIGJlZW4gcmV3cml0dGVuLCBhdCB3aGljaCBwb2ludCB0aGlzIGZ1bmN0aW9uIGlzCisgKiBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBidWZmZXIgZnJvbSB0aGUgZXhpc3RpbmcgdHJhbnNhY3Rpb24ncworICogY2hlY2twb2ludCBsaXN0LiAgCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgam91cm5hbCBsb2NrZWQuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGpfbGlzdF9sb2NrIGhlbGQuCisgKi8KKwordm9pZCBfX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb247CisJam91cm5hbF90ICpqb3VybmFsOworCisJSkJVRkZFUl9UUkFDRShqaCwgImVudHJ5Iik7CisKKwlpZiAoKHRyYW5zYWN0aW9uID0gamgtPmJfY3BfdHJhbnNhY3Rpb24pID09IE5VTEwpIHsKKwkJSkJVRkZFUl9UUkFDRShqaCwgIm5vdCBvbiB0cmFuc2FjdGlvbiIpOworCQlnb3RvIG91dDsKKwl9CisJam91cm5hbCA9IHRyYW5zYWN0aW9uLT50X2pvdXJuYWw7CisKKwlfX2J1ZmZlcl91bmxpbmsoamgpOworCisJaWYgKHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCAhPSBOVUxMKQorCQlnb3RvIG91dDsKKwlKQlVGRkVSX1RSQUNFKGpoLCAidHJhbnNhY3Rpb24gaGFzIG5vIG1vcmUgYnVmZmVycyIpOworCisJLyoKKwkgKiBUaGVyZSBpcyBvbmUgc3BlY2lhbCBjYXNlIHRvIHdvcnJ5IGFib3V0OiBpZiB3ZSBoYXZlIGp1c3QgcHVsbGVkIHRoZQorCSAqIGJ1ZmZlciBvZmYgYSBjb21taXR0aW5nIHRyYW5zYWN0aW9uJ3MgZm9yZ2V0IGxpc3QsIHRoZW4gZXZlbiBpZiB0aGUKKwkgKiBjaGVja3BvaW50IGxpc3QgaXMgZW1wdHksIHRoZSB0cmFuc2FjdGlvbiBvYnZpb3VzbHkgY2Fubm90IGJlCisJICogZHJvcHBlZCEKKwkgKgorCSAqIFRoZSBsb2NraW5nIGhlcmUgYXJvdW5kIGpfY29tbWl0dGluZ190cmFuc2FjdGlvbiBpcyBhIGJpdCBzbGVhenkuCisJICogU2VlIHRoZSBjb21tZW50IGF0IHRoZSBlbmQgb2Ygam91cm5hbF9jb21taXRfdHJhbnNhY3Rpb24oKS4KKwkgKi8KKwlpZiAodHJhbnNhY3Rpb24gPT0gam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJiZWxvbmdzIHRvIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogT0ssIHRoYXQgd2FzIHRoZSBsYXN0IGJ1ZmZlciBmb3IgdGhlIHRyYW5zYWN0aW9uOiB3ZSBjYW4gbm93CisJICAgc2FmZWx5IHJlbW92ZSB0aGlzIHRyYW5zYWN0aW9uIGZyb20gdGhlIGxvZyAqLworCisJX19qb3VybmFsX2Ryb3BfdHJhbnNhY3Rpb24oam91cm5hbCwgdHJhbnNhY3Rpb24pOworCisJLyogSnVzdCBpbiBjYXNlIGFueWJvZHkgd2FzIHdhaXRpbmcgZm9yIG1vcmUgdHJhbnNhY3Rpb25zIHRvIGJlCisgICAgICAgICAgIGNoZWNrcG9pbnRlZC4uLiAqLworCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF9sb2dzcGFjZSk7CitvdXQ6CisJSkJVRkZFUl9UUkFDRShqaCwgImV4aXQiKTsKK30KKworLyoKKyAqIGpvdXJuYWxfaW5zZXJ0X2NoZWNrcG9pbnQ6IHB1dCBhIGNvbW1pdHRlZCBidWZmZXIgb250byBhIGNoZWNrcG9pbnQKKyAqIGxpc3Qgc28gdGhhdCB3ZSBrbm93IHdoZW4gaXQgaXMgc2FmZSB0byBjbGVhbiB0aGUgdHJhbnNhY3Rpb24gb3V0IG9mCisgKiB0aGUgbG9nLgorICoKKyAqIENhbGxlZCB3aXRoIHRoZSBqb3VybmFsIGxvY2tlZC4KKyAqIENhbGxlZCB3aXRoIGpfbGlzdF9sb2NrIGhlbGQuCisgKi8KK3ZvaWQgX19qb3VybmFsX2luc2VydF9jaGVja3BvaW50KHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoLCAKKwkJCSAgICAgICB0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbikKK3sKKwlKQlVGRkVSX1RSQUNFKGpoLCAiZW50cnkiKTsKKwlKX0FTU0VSVF9KSChqaCwgYnVmZmVyX2RpcnR5KGpoMmJoKGpoKSkgfHwgYnVmZmVyX2piZGRpcnR5KGpoMmJoKGpoKSkpOworCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9jcF90cmFuc2FjdGlvbiA9PSBOVUxMKTsKKworCWpoLT5iX2NwX3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CisKKwlpZiAoIXRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCkgeworCQlqaC0+Yl9jcG5leHQgPSBqaC0+Yl9jcHByZXYgPSBqaDsKKwl9IGVsc2UgeworCQlqaC0+Yl9jcG5leHQgPSB0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3Q7CisJCWpoLT5iX2NwcHJldiA9IHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdC0+Yl9jcHByZXY7CisJCWpoLT5iX2NwcHJldi0+Yl9jcG5leHQgPSBqaDsKKwkJamgtPmJfY3BuZXh0LT5iX2NwcHJldiA9IGpoOworCX0KKwl0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPSBqaDsKK30KKworLyoKKyAqIFdlJ3ZlIGZpbmlzaGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmU6IGFkaW9zLi4uCisgKiAKKyAqIFRoZSB0cmFuc2FjdGlvbiBtdXN0IGhhdmUgbm8gbGlua3MgZXhjZXB0IGZvciB0aGUgY2hlY2twb2ludCBieSB0aGlzCisgKiBwb2ludC4KKyAqCisgKiBDYWxsZWQgd2l0aCB0aGUgam91cm5hbCBsb2NrZWQuCisgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkLgorICovCisKK3ZvaWQgX19qb3VybmFsX2Ryb3BfdHJhbnNhY3Rpb24oam91cm5hbF90ICpqb3VybmFsLCB0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbikKK3sKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwlpZiAodHJhbnNhY3Rpb24tPnRfY3BuZXh0KSB7CisJCXRyYW5zYWN0aW9uLT50X2NwbmV4dC0+dF9jcHByZXYgPSB0cmFuc2FjdGlvbi0+dF9jcHByZXY7CisJCXRyYW5zYWN0aW9uLT50X2NwcHJldi0+dF9jcG5leHQgPSB0cmFuc2FjdGlvbi0+dF9jcG5leHQ7CisJCWlmIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zID09IHRyYW5zYWN0aW9uKQorCQkJam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyA9CisJCQkJdHJhbnNhY3Rpb24tPnRfY3BuZXh0OworCQlpZiAoam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyA9PSB0cmFuc2FjdGlvbikKKwkJCWpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgPSBOVUxMOworCX0KKworCUpfQVNTRVJUKHRyYW5zYWN0aW9uLT50X3N0YXRlID09IFRfRklOSVNIRUQpOworCUpfQVNTRVJUKHRyYW5zYWN0aW9uLT50X2J1ZmZlcnMgPT0gTlVMTCk7CisJSl9BU1NFUlQodHJhbnNhY3Rpb24tPnRfc3luY19kYXRhbGlzdCA9PSBOVUxMKTsKKwlKX0FTU0VSVCh0cmFuc2FjdGlvbi0+dF9mb3JnZXQgPT0gTlVMTCk7CisJSl9BU1NFUlQodHJhbnNhY3Rpb24tPnRfaW9idWZfbGlzdCA9PSBOVUxMKTsKKwlKX0FTU0VSVCh0cmFuc2FjdGlvbi0+dF9zaGFkb3dfbGlzdCA9PSBOVUxMKTsKKwlKX0FTU0VSVCh0cmFuc2FjdGlvbi0+dF9sb2dfbGlzdCA9PSBOVUxMKTsKKwlKX0FTU0VSVCh0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPT0gTlVMTCk7CisJSl9BU1NFUlQodHJhbnNhY3Rpb24tPnRfdXBkYXRlcyA9PSAwKTsKKwlKX0FTU0VSVChqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24gIT0gdHJhbnNhY3Rpb24pOworCUpfQVNTRVJUKGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbiAhPSB0cmFuc2FjdGlvbik7CisKKwlqYmRfZGVidWcoMSwgIkRyb3BwaW5nIHRyYW5zYWN0aW9uICVkLCBhbGwgZG9uZVxuIiwgdHJhbnNhY3Rpb24tPnRfdGlkKTsKKwlrZnJlZSh0cmFuc2FjdGlvbik7Cit9CmRpZmYgLS1naXQgYS9mcy9qYmQvY29tbWl0LmMgYi9mcy9qYmQvY29tbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFjNzIwYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2piZC9jb21taXQuYwpAQCAtMCwwICsxLDg0NCBAQAorLyoKKyAqIGxpbnV4L2ZzL2NvbW1pdC5jCisgKgorICogV3JpdHRlbiBieSBTdGVwaGVuIEMuIFR3ZWVkaWUgPHNjdEByZWRoYXQuY29tPiwgMTk5OAorICoKKyAqIENvcHlyaWdodCAxOTk4IFJlZCBIYXQgY29ycCAtLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIEpvdXJuYWwgY29tbWl0IHJvdXRpbmVzIGZvciB0aGUgZ2VuZXJpYyBmaWxlc3lzdGVtIGpvdXJuYWxpbmcgY29kZTsKKyAqIHBhcnQgb2YgdGhlIGV4dDJmcyBqb3VybmFsaW5nIHN5c3RlbS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamJkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworLyoKKyAqIERlZmF1bHQgSU8gZW5kIGhhbmRsZXIgZm9yIHRlbXBvcmFyeSBCSl9JTyBidWZmZXJfaGVhZHMuCisgKi8KK3N0YXRpYyB2b2lkIGpvdXJuYWxfZW5kX2J1ZmZlcl9pb19zeW5jKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB1cHRvZGF0ZSkKK3sKKwlCVUZGRVJfVFJBQ0UoYmgsICIiKTsKKwlpZiAodXB0b2RhdGUpCisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCWVsc2UKKwkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwl1bmxvY2tfYnVmZmVyKGJoKTsKK30KKworLyoKKyAqIFdoZW4gYW4gZXh0My1vcmRlcmVkIGZpbGUgaXMgdHJ1bmNhdGVkLCBpdCBpcyBwb3NzaWJsZSB0aGF0IG1hbnkgcGFnZXMgYXJlCisgKiBub3Qgc3VjZXNzZnVsbHkgZnJlZWQsIGJlY2F1c2UgdGhleSBhcmUgYXR0YWNoZWQgdG8gYSBjb21taXR0aW5nIHRyYW5zYWN0aW9uLgorICogQWZ0ZXIgdGhlIHRyYW5zYWN0aW9uIGNvbW1pdHMsIHRoZXNlIHBhZ2VzIGFyZSBsZWZ0IG9uIHRoZSBMUlUsIHdpdGggbm8KKyAqIC0+bWFwcGluZywgYW5kIHdpdGggYXR0YWNoZWQgYnVmZmVycy4gIFRoZXNlIHBhZ2VzIGFyZSB0cml2aWFsbHkgcmVjbGFpbWFibGUKKyAqIGJ5IHRoZSBWTSwgYnV0IHRoZWlyIGFwcGFyZW50IGFic2VuY2UgdXBzZXRzIHRoZSBWTSBhY2NvdW50aW5nLCBhbmQgaXQgbWFrZXMKKyAqIHRoZSBudW1iZXJzIGluIC9wcm9jL21lbWluZm8gbG9vayBvZGQuCisgKgorICogU28gaGVyZSwgd2UgaGF2ZSBhIGJ1ZmZlciB3aGljaCBoYXMganVzdCBjb21lIG9mZiB0aGUgZm9yZ2V0IGxpc3QuICBMb29rIHRvCisgKiBzZWUgaWYgd2UgY2FuIHN0cmlwIGFsbCBidWZmZXJzIGZyb20gdGhlIGJhY2tpbmcgcGFnZS4KKyAqCisgKiBDYWxsZWQgdW5kZXIgbG9ja19qb3VybmFsKCksIGFuZCBwb3NzaWJseSB1bmRlciBqb3VybmFsX2RhdGFsaXN0X2xvY2suICBUaGUKKyAqIGNhbGxlciBwcm92aWRlZCB1cyB3aXRoIGEgcmVmIGFnYWluc3QgdGhlIGJ1ZmZlciwgYW5kIHdlIGRyb3AgdGhhdCBoZXJlLgorICovCitzdGF0aWMgdm9pZCByZWxlYXNlX2J1ZmZlcl9wYWdlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlpZiAoYnVmZmVyX2RpcnR5KGJoKSkKKwkJZ290byBub3BlOworCWlmIChhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpICE9IDEpCisJCWdvdG8gbm9wZTsKKwlwYWdlID0gYmgtPmJfcGFnZTsKKwlpZiAoIXBhZ2UpCisJCWdvdG8gbm9wZTsKKwlpZiAocGFnZS0+bWFwcGluZykKKwkJZ290byBub3BlOworCisJLyogT0ssIGl0J3MgYSB0cnVuY2F0ZWQgcGFnZSAqLworCWlmIChUZXN0U2V0UGFnZUxvY2tlZChwYWdlKSkKKwkJZ290byBub3BlOworCisJcGFnZV9jYWNoZV9nZXQocGFnZSk7CisJX19icmVsc2UoYmgpOworCXRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXJldHVybjsKKworbm9wZToKKwlfX2JyZWxzZShiaCk7Cit9CisKKy8qCisgKiBUcnkgdG8gYWNxdWlyZSBqYmRfbG9ja19iaF9zdGF0ZSgpIGFnYWluc3QgdGhlIGJ1ZmZlciwgd2hlbiBqX2xpc3RfbG9jayBpcworICogaGVsZC4gIEZvciByYW5raW5nIHJlYXNvbnMgd2UgbXVzdCB0cnlsb2NrLiAgSWYgd2UgbG9zZSwgc2NoZWR1bGUgYXdheSBhbmQKKyAqIHJldHVybiAwLiAgal9saXN0X2xvY2sgaXMgZHJvcHBlZCBpbiB0aGlzIGNhc2UuCisgKi8KK3N0YXRpYyBpbnQgaW52ZXJ0ZWRfbG9jayhqb3VybmFsX3QgKmpvdXJuYWwsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaWYgKCFqYmRfdHJ5bG9ja19iaF9zdGF0ZShiaCkpIHsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJc2NoZWR1bGUoKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisvKiBEb25lIGl0IGFsbDogbm93IHdyaXRlIHRoZSBjb21taXQgcmVjb3JkLiAgV2Ugc2hvdWxkIGhhdmUKKyAqIGNsZWFuZWQgdXAgb3VyIHByZXZpb3VzIGJ1ZmZlcnMgYnkgbm93LCBzbyBpZiB3ZSBhcmUgaW4gYWJvcnQKKyAqIG1vZGUgd2UgY2FuIG5vdyBqdXN0IHNraXAgdGhlIHJlc3Qgb2YgdGhlIGpvdXJuYWwgd3JpdGUKKyAqIGVudGlyZWx5LgorICoKKyAqIFJldHVybnMgMSBpZiB0aGUgam91cm5hbCBuZWVkcyB0byBiZSBhYm9ydGVkIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IGpvdXJuYWxfd3JpdGVfY29tbWl0X3JlY29yZChqb3VybmFsX3QgKmpvdXJuYWwsCisJCQkJCXRyYW5zYWN0aW9uX3QgKmNvbW1pdF90cmFuc2FjdGlvbikKK3sKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpkZXNjcmlwdG9yOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IGksIHJldDsKKwlpbnQgYmFycmllcl9kb25lID0gMDsKKworCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpCisJCXJldHVybiAwOworCisJZGVzY3JpcHRvciA9IGpvdXJuYWxfZ2V0X2Rlc2NyaXB0b3JfYnVmZmVyKGpvdXJuYWwpOworCWlmICghZGVzY3JpcHRvcikKKwkJcmV0dXJuIDE7CisKKwliaCA9IGpoMmJoKGRlc2NyaXB0b3IpOworCisJLyogQUtQTTogYnVnbGV0IC0gYWRkIGBpJyB0byB0bXAhICovCisJZm9yIChpID0gMDsgaSA8IGJoLT5iX3NpemU7IGkgKz0gNTEyKSB7CisJCWpvdXJuYWxfaGVhZGVyX3QgKnRtcCA9IChqb3VybmFsX2hlYWRlcl90KiliaC0+Yl9kYXRhOworCQl0bXAtPmhfbWFnaWMgPSBjcHVfdG9fYmUzMihKRlNfTUFHSUNfTlVNQkVSKTsKKwkJdG1wLT5oX2Jsb2NrdHlwZSA9IGNwdV90b19iZTMyKEpGU19DT01NSVRfQkxPQ0spOworCQl0bXAtPmhfc2VxdWVuY2UgPSBjcHVfdG9fYmUzMihjb21taXRfdHJhbnNhY3Rpb24tPnRfdGlkKTsKKwl9CisKKwlKQlVGRkVSX1RSQUNFKGRlc2NyaXB0b3IsICJ3cml0ZSBjb21taXQgYmxvY2siKTsKKwlzZXRfYnVmZmVyX2RpcnR5KGJoKTsKKwlpZiAoam91cm5hbC0+al9mbGFncyAmIEpGU19CQVJSSUVSKSB7CisJCXNldF9idWZmZXJfb3JkZXJlZChiaCk7CisJCWJhcnJpZXJfZG9uZSA9IDE7CisJfQorCXJldCA9IHN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwkvKiBpcyBpdCBwb3NzaWJsZSBmb3IgYW5vdGhlciBjb21taXQgdG8gZmFpbCBhdCByb3VnaGx5CisJICogdGhlIHNhbWUgdGltZSBhcyB0aGlzIG9uZT8gIElmIHNvLCB3ZSBkb24ndCB3YW50IHRvCisJICogdHJ1c3QgdGhlIGJhcnJpZXIgZmxhZyBpbiB0aGUgc3VwZXIsIGJ1dCBpbnN0ZWFkIHdhbnQKKwkgKiB0byByZW1lbWJlciBpZiB3ZSBzZW50IGEgYmFycmllciByZXF1ZXN0CisJICovCisJaWYgKHJldCA9PSAtRU9QTk9UU1VQUCAmJiBiYXJyaWVyX2RvbmUpIHsKKwkJY2hhciBiW0JERVZOQU1FX1NJWkVdOworCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJKQkQ6IGJhcnJpZXItYmFzZWQgc3luYyBmYWlsZWQgb24gJXMgLSAiCisJCQkiZGlzYWJsaW5nIGJhcnJpZXJzXG4iLAorCQkJYmRldm5hbWUoam91cm5hbC0+al9kZXYsIGIpKTsKKwkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQlqb3VybmFsLT5qX2ZsYWdzICY9IH5KRlNfQkFSUklFUjsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisKKwkJLyogQW5kIHRyeSBhZ2Fpbiwgd2l0aG91dCB0aGUgYmFycmllciAqLworCQljbGVhcl9idWZmZXJfb3JkZXJlZChiaCk7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQlzZXRfYnVmZmVyX2RpcnR5KGJoKTsKKwkJcmV0ID0gc3luY19kaXJ0eV9idWZmZXIoYmgpOworCX0KKwlwdXRfYmgoYmgpOwkJLyogT25lIGZvciBnZXRibGsoKSAqLworCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChkZXNjcmlwdG9yKTsKKworCXJldHVybiAocmV0ID09IC1FSU8pOworfQorCisvKgorICogam91cm5hbF9jb21taXRfdHJhbnNhY3Rpb24KKyAqCisgKiBUaGUgcHJpbWFyeSBmdW5jdGlvbiBmb3IgY29tbWl0dGluZyBhIHRyYW5zYWN0aW9uIHRvIHRoZSBsb2cuICBUaGlzCisgKiBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGpvdXJuYWwgdGhyZWFkIHRvIGJlZ2luIGEgY29tcGxldGUgY29tbWl0LgorICovCit2b2lkIGpvdXJuYWxfY29tbWl0X3RyYW5zYWN0aW9uKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwl0cmFuc2FjdGlvbl90ICpjb21taXRfdHJhbnNhY3Rpb247CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqamgsICpuZXdfamgsICpkZXNjcmlwdG9yOworCXN0cnVjdCBidWZmZXJfaGVhZCAqKndidWYgPSBqb3VybmFsLT5qX3didWY7CisJaW50IGJ1ZnM7CisJaW50IGZsYWdzOworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBibG9ja25yOworCWNoYXIgKnRhZ3AgPSBOVUxMOworCWpvdXJuYWxfaGVhZGVyX3QgKmhlYWRlcjsKKwlqb3VybmFsX2Jsb2NrX3RhZ190ICp0YWcgPSBOVUxMOworCWludCBzcGFjZV9sZWZ0ID0gMDsKKwlpbnQgZmlyc3RfdGFnID0gMDsKKwlpbnQgdGFnX2ZsYWc7CisJaW50IGk7CisKKwkvKgorCSAqIEZpcnN0IGpvYjogbG9jayBkb3duIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGFuZCB3YWl0IGZvcgorCSAqIGFsbCBvdXRzdGFuZGluZyB1cGRhdGVzIHRvIGNvbXBsZXRlLgorCSAqLworCisjaWZkZWYgQ09NTUlUX1NUQVRTCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJc3VtbWFyaXNlX2pvdXJuYWxfdXNhZ2Uoam91cm5hbCk7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKyNlbmRpZgorCisJLyogRG8gd2UgbmVlZCB0byBlcmFzZSB0aGUgZWZmZWN0cyBvZiBhIHByaW9yIGpvdXJuYWxfZmx1c2g/ICovCisJaWYgKGpvdXJuYWwtPmpfZmxhZ3MgJiBKRlNfRkxVU0hFRCkgeworCQlqYmRfZGVidWcoMywgInN1cGVyIGJsb2NrIHVwZGF0ZWRcbiIpOworCQlqb3VybmFsX3VwZGF0ZV9zdXBlcmJsb2NrKGpvdXJuYWwsIDEpOworCX0gZWxzZSB7CisJCWpiZF9kZWJ1ZygzLCAic3VwZXJibG9jayBub3QgdXBkYXRlZFxuIik7CisJfQorCisJSl9BU1NFUlQoam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uICE9IE5VTEwpOworCUpfQVNTRVJUKGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbiA9PSBOVUxMKTsKKworCWNvbW1pdF90cmFuc2FjdGlvbiA9IGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbjsKKwlKX0FTU0VSVChjb21taXRfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPT0gVF9SVU5OSU5HKTsKKworCWpiZF9kZWJ1ZygxLCAiSkJEOiBzdGFydGluZyBjb21taXQgb2YgdHJhbnNhY3Rpb24gJWRcbiIsCisJCQljb21taXRfdHJhbnNhY3Rpb24tPnRfdGlkKTsKKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwljb21taXRfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPSBUX0xPQ0tFRDsKKworCXNwaW5fbG9jaygmY29tbWl0X3RyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwl3aGlsZSAoY29tbWl0X3RyYW5zYWN0aW9uLT50X3VwZGF0ZXMpIHsKKwkJREVGSU5FX1dBSVQod2FpdCk7CisKKwkJcHJlcGFyZV90b193YWl0KCZqb3VybmFsLT5qX3dhaXRfdXBkYXRlcywgJndhaXQsCisJCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF91cGRhdGVzKSB7CisJCQlzcGluX3VubG9jaygmY29tbWl0X3RyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQkJc2NoZWR1bGUoKTsKKwkJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJCXNwaW5fbG9jaygmY29tbWl0X3RyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwkJfQorCQlmaW5pc2hfd2FpdCgmam91cm5hbC0+al93YWl0X3VwZGF0ZXMsICZ3YWl0KTsKKwl9CisJc3Bpbl91bmxvY2soJmNvbW1pdF90cmFuc2FjdGlvbi0+dF9oYW5kbGVfbG9jayk7CisKKwlKX0FTU0VSVCAoY29tbWl0X3RyYW5zYWN0aW9uLT50X291dHN0YW5kaW5nX2NyZWRpdHMgPD0KKwkJCWpvdXJuYWwtPmpfbWF4X3RyYW5zYWN0aW9uX2J1ZmZlcnMpOworCisJLyoKKwkgKiBGaXJzdCB0aGluZyB3ZSBhcmUgYWxsb3dlZCB0byBkbyBpcyB0byBkaXNjYXJkIGFueSByZW1haW5pbmcKKwkgKiBCSl9SZXNlcnZlZCBidWZmZXJzLiAgTm90ZSwgaXQgaXMgX25vdF8gcGVybWlzc2libGUgdG8gYXNzdW1lCisJICogdGhhdCB0aGVyZSBhcmUgbm8gc3VjaCBidWZmZXJzOiBpZiBhIGxhcmdlIGZpbGVzeXN0ZW0KKwkgKiBvcGVyYXRpb24gbGlrZSBhIHRydW5jYXRlIG5lZWRzIHRvIHNwbGl0IGl0c2VsZiBvdmVyIG11bHRpcGxlCisJICogdHJhbnNhY3Rpb25zLCB0aGVuIGl0IG1heSB0cnkgdG8gZG8gYSBqb3VybmFsX3Jlc3RhcnQoKSB3aGlsZQorCSAqIHRoZXJlIGFyZSBzdGlsbCBCSl9SZXNlcnZlZCBidWZmZXJzIG91dHN0YW5kaW5nLiAgVGhlc2UgbXVzdAorCSAqIGJlIHJlbGVhc2VkIGNsZWFubHkgZnJvbSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKwkgKgorCSAqIEluIHRoaXMgY2FzZSwgdGhlIGZpbGVzeXN0ZW0gbXVzdCBzdGlsbCByZXNlcnZlIHdyaXRlIGFjY2VzcworCSAqIGFnYWluIGJlZm9yZSBtb2RpZnlpbmcgdGhlIGJ1ZmZlciBpbiB0aGUgbmV3IHRyYW5zYWN0aW9uLCBidXQKKwkgKiB3ZSBkbyBub3QgcmVxdWlyZSBpdCB0byByZW1lbWJlciBleGFjdGx5IHdoaWNoIG9sZCBidWZmZXJzIGl0CisJICogaGFzIHJlc2VydmVkLiAgVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGV4aXN0aW5nIGJlaGF2aW91cgorCSAqIHRoYXQgbXVsdGlwbGUgam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKCkgY2FsbHMgdG8gdGhlIHNhbWUKKwkgKiBidWZmZXIgYXJlIHBlcmZlY3RseSBwZXJtaXNzYWJsZS4KKwkgKi8KKwl3aGlsZSAoY29tbWl0X3RyYW5zYWN0aW9uLT50X3Jlc2VydmVkX2xpc3QpIHsKKwkJamggPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfcmVzZXJ2ZWRfbGlzdDsKKwkJSkJVRkZFUl9UUkFDRShqaCwgInJlc2VydmVkLCB1bnVzZWQ6IHJlZmlsZSIpOworCQkvKgorCQkgKiBBIGpvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKCkram91cm5hbF9yZWxlYXNlX2J1ZmZlcigpIG1heQorCQkgKiBsZWF2ZSB1bmRvLWNvbW1pdHRlZCBkYXRhLgorCQkgKi8KKwkJaWYgKGpoLT5iX2NvbW1pdHRlZF9kYXRhKSB7CisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gamgyYmgoamgpOworCisJCQlqYmRfbG9ja19iaF9zdGF0ZShiaCk7CisJCQlpZiAoamgtPmJfY29tbWl0dGVkX2RhdGEpIHsKKwkJCQlrZnJlZShqaC0+Yl9jb21taXR0ZWRfZGF0YSk7CisJCQkJamgtPmJfY29tbWl0dGVkX2RhdGEgPSBOVUxMOworCQkJfQorCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCX0KKwkJam91cm5hbF9yZWZpbGVfYnVmZmVyKGpvdXJuYWwsIGpoKTsKKwl9CisKKwkvKgorCSAqIE5vdyB0cnkgdG8gZHJvcCBhbnkgd3JpdHRlbi1iYWNrIGJ1ZmZlcnMgZnJvbSB0aGUgam91cm5hbCdzCisJICogY2hlY2twb2ludCBsaXN0cy4gIFdlIGRvIHRoaXMgKmJlZm9yZSogY29tbWl0IGJlY2F1c2UgaXQgcG90ZW50aWFsbHkKKwkgKiBmcmVlcyBzb21lIG1lbW9yeQorCSAqLworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCV9fam91cm5hbF9jbGVhbl9jaGVja3BvaW50X2xpc3Qoam91cm5hbCk7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKworCWpiZF9kZWJ1ZyAoMywgIkpCRDogY29tbWl0IHBoYXNlIDFcbiIpOworCisJLyoKKwkgKiBTd2l0Y2ggdG8gYSBuZXcgcmV2b2tlIHRhYmxlLgorCSAqLworCWpvdXJuYWxfc3dpdGNoX3Jldm9rZV90YWJsZShqb3VybmFsKTsKKworCWNvbW1pdF90cmFuc2FjdGlvbi0+dF9zdGF0ZSA9IFRfRkxVU0g7CisJam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uID0gY29tbWl0X3RyYW5zYWN0aW9uOworCWpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbiA9IE5VTEw7CisJY29tbWl0X3RyYW5zYWN0aW9uLT50X2xvZ19zdGFydCA9IGpvdXJuYWwtPmpfaGVhZDsKKwl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfdHJhbnNhY3Rpb25fbG9ja2VkKTsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCWpiZF9kZWJ1ZyAoMywgIkpCRDogY29tbWl0IHBoYXNlIDJcbiIpOworCisJLyoKKwkgKiBGaXJzdCwgZHJvcCBtb2RpZmllZCBmbGFnOiBhbGwgYWNjZXNzZXMgdG8gdGhlIGJ1ZmZlcnMKKwkgKiB3aWxsIGJlIHRyYWNrZWQgZm9yIGEgbmV3IHRyYXNhY3Rpb24gb25seSAtYnp6egorCSAqLworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCWlmIChjb21taXRfdHJhbnNhY3Rpb24tPnRfYnVmZmVycykgeworCQluZXdfamggPSBqaCA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF9idWZmZXJzLT5iX3RuZXh0OworCQlkbyB7CisJCQlKX0FTU0VSVF9KSChuZXdfamgsIG5ld19qaC0+Yl9tb2RpZmllZCA9PSAxIHx8CisJCQkJCW5ld19qaC0+Yl9tb2RpZmllZCA9PSAwKTsKKwkJCW5ld19qaC0+Yl9tb2RpZmllZCA9IDA7CisJCQluZXdfamggPSBuZXdfamgtPmJfdG5leHQ7CisJCX0gd2hpbGUgKG5ld19qaCAhPSBqaCk7CisJfQorCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisKKwkvKgorCSAqIE5vdyBzdGFydCBmbHVzaGluZyB0aGluZ3MgdG8gZGlzaywgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyCisJICogb24gdGhlIHRyYW5zYWN0aW9uIGxpc3RzLiAgRGF0YSBibG9ja3MgZ28gZmlyc3QuCisJICovCisKKwllcnIgPSAwOworCS8qCisJICogV2hlbmV2ZXIgd2UgdW5sb2NrIHRoZSBqb3VybmFsIGFuZCBzbGVlcCwgdGhpbmdzIGNhbiBnZXQgYWRkZWQKKwkgKiBvbnRvIC0+dF9zeW5jX2RhdGFsaXN0LCBzbyB3ZSBoYXZlIHRvIGtlZXAgbG9vcGluZyBiYWNrIHRvCisJICogd3JpdGVfb3V0X2RhdGEgdW50aWwgd2UgKmtub3cqIHRoYXQgdGhlIGxpc3QgaXMgZW1wdHkuCisJICovCisJYnVmcyA9IDA7CisJLyoKKwkgKiBDbGVhbnVwIGFueSBmbHVzaGVkIGRhdGEgYnVmZmVycyBmcm9tIHRoZSBkYXRhIGxpc3QuICBFdmVuIGluCisJICogYWJvcnQgbW9kZSwgd2Ugd2FudCB0byBmbHVzaCB0aGlzIG91dCBhcyBzb29uIGFzIHBvc3NpYmxlLgorCSAqLword3JpdGVfb3V0X2RhdGE6CisJY29uZF9yZXNjaGVkKCk7CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisKKwl3aGlsZSAoY29tbWl0X3RyYW5zYWN0aW9uLT50X3N5bmNfZGF0YWxpc3QpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCQlqaCA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF9zeW5jX2RhdGFsaXN0OworCQljb21taXRfdHJhbnNhY3Rpb24tPnRfc3luY19kYXRhbGlzdCA9IGpoLT5iX3RuZXh0OworCQliaCA9IGpoMmJoKGpoKTsKKwkJaWYgKGJ1ZmZlcl9sb2NrZWQoYmgpKSB7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJsb2NrZWQiKTsKKwkJCWlmICghaW52ZXJ0ZWRfbG9jayhqb3VybmFsLCBiaCkpCisJCQkJZ290byB3cml0ZV9vdXRfZGF0YTsKKwkJCV9fam91cm5hbF90ZW1wX3VubGlua19idWZmZXIoamgpOworCQkJX19qb3VybmFsX2ZpbGVfYnVmZmVyKGpoLCBjb21taXRfdHJhbnNhY3Rpb24sCisJCQkJCQlCSl9Mb2NrZWQpOworCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCQlpZiAobG9ja19uZWVkX3Jlc2NoZWQoJmpvdXJuYWwtPmpfbGlzdF9sb2NrKSkgeworCQkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQkJZ290byB3cml0ZV9vdXRfZGF0YTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChidWZmZXJfZGlydHkoYmgpKSB7CisJCQkJQlVGRkVSX1RSQUNFKGJoLCAic3RhcnQgam91cm5hbCB3cml0ZW91dCIpOworCQkJCWdldF9iaChiaCk7CisJCQkJd2J1ZltidWZzKytdID0gYmg7CisJCQkJaWYgKGJ1ZnMgPT0gam91cm5hbC0+al93YnVmc2l6ZSkgeworCQkJCQlqYmRfZGVidWcoMiwgInN1Ym1pdCAlZCB3cml0ZXNcbiIsCisJCQkJCQkJYnVmcyk7CisJCQkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQkJCWxsX3J3X2Jsb2NrKFdSSVRFLCBidWZzLCB3YnVmKTsKKwkJCQkJam91cm5hbF9icmVsc2VfYXJyYXkod2J1ZiwgYnVmcyk7CisJCQkJCWJ1ZnMgPSAwOworCQkJCQlnb3RvIHdyaXRlX291dF9kYXRhOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJQlVGRkVSX1RSQUNFKGJoLCAid3JpdGVvdXQgY29tcGxldGU6IHVuZmlsZSIpOworCQkJCWlmICghaW52ZXJ0ZWRfbG9jayhqb3VybmFsLCBiaCkpCisJCQkJCWdvdG8gd3JpdGVfb3V0X2RhdGE7CisJCQkJX19qb3VybmFsX3VuZmlsZV9idWZmZXIoamgpOworCQkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQkJCWpvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7CisJCQkJcHV0X2JoKGJoKTsKKwkJCQlpZiAobG9ja19uZWVkX3Jlc2NoZWQoJmpvdXJuYWwtPmpfbGlzdF9sb2NrKSkgeworCQkJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQkJCQlnb3RvIHdyaXRlX291dF9kYXRhOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmIChidWZzKSB7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCWxsX3J3X2Jsb2NrKFdSSVRFLCBidWZzLCB3YnVmKTsKKwkJam91cm5hbF9icmVsc2VfYXJyYXkod2J1ZiwgYnVmcyk7CisJCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCX0KKworCS8qCisJICogV2FpdCBmb3IgYWxsIHByZXZpb3VzbHkgc3VibWl0dGVkIElPIHRvIGNvbXBsZXRlLgorCSAqLworCXdoaWxlIChjb21taXRfdHJhbnNhY3Rpb24tPnRfbG9ja2VkX2xpc3QpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCQlqaCA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF9sb2NrZWRfbGlzdC0+Yl90cHJldjsKKwkJYmggPSBqaDJiaChqaCk7CisJCWdldF9iaChiaCk7CisJCWlmIChidWZmZXJfbG9ja2VkKGJoKSkgeworCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCXdhaXRfb25fYnVmZmVyKGJoKTsKKwkJCWlmICh1bmxpa2VseSghYnVmZmVyX3VwdG9kYXRlKGJoKSkpCisJCQkJZXJyID0gLUVJTzsKKwkJCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQl9CisJCWlmICghaW52ZXJ0ZWRfbG9jayhqb3VybmFsLCBiaCkpIHsKKwkJCXB1dF9iaChiaCk7CisJCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChidWZmZXJfamJkKGJoKSAmJiBqaC0+Yl9qbGlzdCA9PSBCSl9Mb2NrZWQpIHsKKwkJCV9fam91cm5hbF91bmZpbGVfYnVmZmVyKGpoKTsKKwkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQkJam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKKwkJCXB1dF9iaChiaCk7CisJCX0gZWxzZSB7CisJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJfQorCQlwdXRfYmgoYmgpOworCQljb25kX3Jlc2NoZWRfbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCisJaWYgKGVycikKKwkJX19qb3VybmFsX2Fib3J0X2hhcmQoam91cm5hbCk7CisKKwlqb3VybmFsX3dyaXRlX3Jldm9rZV9yZWNvcmRzKGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbik7CisKKwlqYmRfZGVidWcoMywgIkpCRDogY29tbWl0IHBoYXNlIDJcbiIpOworCisJLyoKKwkgKiBJZiB3ZSBmb3VuZCBhbnkgZGlydHkgb3IgbG9ja2VkIGJ1ZmZlcnMsIHRoZW4gd2Ugc2hvdWxkIGhhdmUKKwkgKiBsb29wZWQgYmFjayB1cCB0byB0aGUgd3JpdGVfb3V0X2RhdGEgbGFiZWwuICBJZiB0aGVyZSB3ZXJlbid0CisJICogYW55IHRoZW4gam91cm5hbF9jbGVhbl9kYXRhX2xpc3Qgc2hvdWxkIGhhdmUgd2lwZWQgdGhlIGxpc3QKKwkgKiBjbGVhbiBieSBub3csIHNvIGNoZWNrIHRoYXQgaXQgaXMgaW4gZmFjdCBlbXB0eS4KKwkgKi8KKwlKX0FTU0VSVCAoY29tbWl0X3RyYW5zYWN0aW9uLT50X3N5bmNfZGF0YWxpc3QgPT0gTlVMTCk7CisKKwlqYmRfZGVidWcgKDMsICJKQkQ6IGNvbW1pdCBwaGFzZSAzXG4iKTsKKworCS8qCisJICogV2F5IHRvIGdvOiB3ZSBoYXZlIG5vdyB3cml0dGVuIG91dCBhbGwgb2YgdGhlIGRhdGEgZm9yIGEKKwkgKiB0cmFuc2FjdGlvbiEgIE5vdyBjb21lcyB0aGUgdHJpY2t5IHBhcnQ6IHdlIG5lZWQgdG8gd3JpdGUgb3V0CisJICogbWV0YWRhdGEuICBMb29wIG92ZXIgdGhlIHRyYW5zYWN0aW9uJ3MgZW50aXJlIGJ1ZmZlciBsaXN0OgorCSAqLworCWNvbW1pdF90cmFuc2FjdGlvbi0+dF9zdGF0ZSA9IFRfQ09NTUlUOworCisJZGVzY3JpcHRvciA9IE5VTEw7CisJYnVmcyA9IDA7CisJd2hpbGUgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9idWZmZXJzKSB7CisKKwkJLyogRmluZCB0aGUgbmV4dCBidWZmZXIgdG8gYmUgam91cm5hbGVkLi4uICovCisKKwkJamggPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfYnVmZmVyczsKKworCQkvKiBJZiB3ZSdyZSBpbiBhYm9ydCBtb2RlLCB3ZSBqdXN0IHVuLWpvdXJuYWwgdGhlIGJ1ZmZlciBhbmQKKwkJICAgcmVsZWFzZSBpdCBmb3IgYmFja2dyb3VuZCB3cml0aW5nLiAqLworCisJCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJqb3VybmFsIGlzIGFib3J0aW5nOiByZWZpbGUiKTsKKwkJCWpvdXJuYWxfcmVmaWxlX2J1ZmZlcihqb3VybmFsLCBqaCk7CisJCQkvKiBJZiB0aGF0IHdhcyB0aGUgbGFzdCBvbmUsIHdlIG5lZWQgdG8gY2xlYW4gdXAKKwkJCSAqIGFueSBkZXNjcmlwdG9yIGJ1ZmZlcnMgd2hpY2ggbWF5IGhhdmUgYmVlbgorCQkJICogYWxyZWFkeSBhbGxvY2F0ZWQsIGV2ZW4gaWYgd2UgYXJlIG5vdworCQkJICogYWJvcnRpbmcuICovCisJCQlpZiAoIWNvbW1pdF90cmFuc2FjdGlvbi0+dF9idWZmZXJzKQorCQkJCWdvdG8gc3RhcnRfam91cm5hbF9pbzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBkZXNjcmlwdG9yIGJsb2NrIGluIHdoaWNoIHRvCisJCSAgIHJlY29yZCB0aGUgbWV0YWRhdGEgYnVmZmVyLiAqLworCisJCWlmICghZGVzY3JpcHRvcikgeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCQkJSl9BU1NFUlQgKGJ1ZnMgPT0gMCk7CisKKwkJCWpiZF9kZWJ1Zyg0LCAiSkJEOiBnZXQgZGVzY3JpcHRvclxuIik7CisKKwkJCWRlc2NyaXB0b3IgPSBqb3VybmFsX2dldF9kZXNjcmlwdG9yX2J1ZmZlcihqb3VybmFsKTsKKwkJCWlmICghZGVzY3JpcHRvcikgeworCQkJCV9fam91cm5hbF9hYm9ydF9oYXJkKGpvdXJuYWwpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQliaCA9IGpoMmJoKGRlc2NyaXB0b3IpOworCQkJamJkX2RlYnVnKDQsICJKQkQ6IGdvdCBidWZmZXIgJWxsdSAoJXApXG4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwgYmgtPmJfZGF0YSk7CisJCQloZWFkZXIgPSAoam91cm5hbF9oZWFkZXJfdCAqKSZiaC0+Yl9kYXRhWzBdOworCQkJaGVhZGVyLT5oX21hZ2ljICAgICA9IGNwdV90b19iZTMyKEpGU19NQUdJQ19OVU1CRVIpOworCQkJaGVhZGVyLT5oX2Jsb2NrdHlwZSA9IGNwdV90b19iZTMyKEpGU19ERVNDUklQVE9SX0JMT0NLKTsKKwkJCWhlYWRlci0+aF9zZXF1ZW5jZSAgPSBjcHVfdG9fYmUzMihjb21taXRfdHJhbnNhY3Rpb24tPnRfdGlkKTsKKworCQkJdGFncCA9ICZiaC0+Yl9kYXRhW3NpemVvZihqb3VybmFsX2hlYWRlcl90KV07CisJCQlzcGFjZV9sZWZ0ID0gYmgtPmJfc2l6ZSAtIHNpemVvZihqb3VybmFsX2hlYWRlcl90KTsKKwkJCWZpcnN0X3RhZyA9IDE7CisJCQlzZXRfYnVmZmVyX2p3cml0ZShiaCk7CisJCQlzZXRfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCXdidWZbYnVmcysrXSA9IGJoOworCisJCQkvKiBSZWNvcmQgaXQgc28gdGhhdCB3ZSBjYW4gd2FpdCBmb3IgSU8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24gbGF0ZXIgKi8KKwkJCUJVRkZFUl9UUkFDRShiaCwgInBoMzogZmlsZSBhcyBkZXNjcmlwdG9yIik7CisJCQlqb3VybmFsX2ZpbGVfYnVmZmVyKGRlc2NyaXB0b3IsIGNvbW1pdF90cmFuc2FjdGlvbiwKKwkJCQkJQkpfTG9nQ3RsKTsKKwkJfQorCisJCS8qIFdoZXJlIGlzIHRoZSBidWZmZXIgdG8gYmUgd3JpdHRlbj8gKi8KKworCQllcnIgPSBqb3VybmFsX25leHRfbG9nX2Jsb2NrKGpvdXJuYWwsICZibG9ja25yKTsKKwkJLyogSWYgdGhlIGJsb2NrIG1hcHBpbmcgZmFpbGVkLCBqdXN0IGFiYW5kb24gdGhlIGJ1ZmZlcgorCQkgICBhbmQgcmVwZWF0IHRoaXMgbG9vcDogd2UnbGwgZmFsbCBpbnRvIHRoZQorCQkgICByZWZpbGUtb24tYWJvcnQgY29uZGl0aW9uIGFib3ZlLiAqLworCQlpZiAoZXJyKSB7CisJCQlfX2pvdXJuYWxfYWJvcnRfaGFyZChqb3VybmFsKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogc3RhcnRfdGhpc19oYW5kbGUoKSB1c2VzIHRfb3V0c3RhbmRpbmdfY3JlZGl0cyB0byBkZXRlcm1pbmUKKwkJICogdGhlIGZyZWUgc3BhY2UgaW4gdGhlIGxvZywgYnV0IHRoaXMgY291bnRlciBpcyBjaGFuZ2VkCisJCSAqIGJ5IGpvdXJuYWxfbmV4dF9sb2dfYmxvY2soKSBhbHNvLgorCQkgKi8KKwkJY29tbWl0X3RyYW5zYWN0aW9uLT50X291dHN0YW5kaW5nX2NyZWRpdHMtLTsKKworCQkvKiBCdW1wIGJfY291bnQgdG8gcHJldmVudCB0cnVuY2F0ZSBmcm9tIHN0dW1ibGluZyBvdmVyCisgICAgICAgICAgICAgICAgICAgdGhlIHNoYWRvd2VkIGJ1ZmZlciEgIEBAQCBUaGlzIGNhbiBnbyBpZiB3ZSBldmVyIGdldAorICAgICAgICAgICAgICAgICAgIHJpZCBvZiB0aGUgQkpfSU8vQkpfU2hhZG93IHBhaXJpbmcgb2YgYnVmZmVycy4gKi8KKwkJYXRvbWljX2luYygmamgyYmgoamgpLT5iX2NvdW50KTsKKworCQkvKiBNYWtlIGEgdGVtcG9yYXJ5IElPIGJ1ZmZlciB3aXRoIHdoaWNoIHRvIHdyaXRlIGl0IG91dAorICAgICAgICAgICAgICAgICAgICh0aGlzIHdpbGwgcmVxdWV1ZSBib3RoIHRoZSBtZXRhZGF0YSBidWZmZXIgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgIHRlbXBvcmFyeSBJTyBidWZmZXIpLiBuZXdfYmggZ29lcyBvbiBCSl9JTyovCisKKwkJc2V0X2JpdChCSF9KV3JpdGUsICZqaDJiaChqaCktPmJfc3RhdGUpOworCQkvKgorCQkgKiBha3BtOiBqb3VybmFsX3dyaXRlX21ldGFkYXRhX2J1ZmZlcigpIHNldHMKKwkJICogbmV3X2JoLT5iX3RyYW5zYWN0aW9uIHRvIGNvbW1pdF90cmFuc2FjdGlvbi4KKwkJICogV2UgbmVlZCB0byBjbGVhbiB0aGlzIHVwIGJlZm9yZSB3ZSByZWxlYXNlIG5ld19iaAorCQkgKiAod2hpY2ggaXMgb2YgdHlwZSBCSl9JTykKKwkJICovCisJCUpCVUZGRVJfVFJBQ0UoamgsICJwaDM6IHdyaXRlIG1ldGFkYXRhIik7CisJCWZsYWdzID0gam91cm5hbF93cml0ZV9tZXRhZGF0YV9idWZmZXIoY29tbWl0X3RyYW5zYWN0aW9uLAorCQkJCQkJICAgICAgamgsICZuZXdfamgsIGJsb2NrbnIpOworCQlzZXRfYml0KEJIX0pXcml0ZSwgJmpoMmJoKG5ld19qaCktPmJfc3RhdGUpOworCQl3YnVmW2J1ZnMrK10gPSBqaDJiaChuZXdfamgpOworCisJCS8qIFJlY29yZCB0aGUgbmV3IGJsb2NrJ3MgdGFnIGluIHRoZSBjdXJyZW50IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICBidWZmZXIgKi8KKworCQl0YWdfZmxhZyA9IDA7CisJCWlmIChmbGFncyAmIDEpCisJCQl0YWdfZmxhZyB8PSBKRlNfRkxBR19FU0NBUEU7CisJCWlmICghZmlyc3RfdGFnKQorCQkJdGFnX2ZsYWcgfD0gSkZTX0ZMQUdfU0FNRV9VVUlEOworCisJCXRhZyA9IChqb3VybmFsX2Jsb2NrX3RhZ190ICopIHRhZ3A7CisJCXRhZy0+dF9ibG9ja25yID0gY3B1X3RvX2JlMzIoamgyYmgoamgpLT5iX2Jsb2NrbnIpOworCQl0YWctPnRfZmxhZ3MgPSBjcHVfdG9fYmUzMih0YWdfZmxhZyk7CisJCXRhZ3AgKz0gc2l6ZW9mKGpvdXJuYWxfYmxvY2tfdGFnX3QpOworCQlzcGFjZV9sZWZ0IC09IHNpemVvZihqb3VybmFsX2Jsb2NrX3RhZ190KTsKKworCQlpZiAoZmlyc3RfdGFnKSB7CisJCQltZW1jcHkgKHRhZ3AsIGpvdXJuYWwtPmpfdXVpZCwgMTYpOworCQkJdGFncCArPSAxNjsKKwkJCXNwYWNlX2xlZnQgLT0gMTY7CisJCQlmaXJzdF90YWcgPSAwOworCQl9CisKKwkJLyogSWYgdGhlcmUncyBubyBtb3JlIHRvIGRvLCBvciBpZiB0aGUgZGVzY3JpcHRvciBpcyBmdWxsLAorCQkgICBsZXQgdGhlIElPIHJpcCEgKi8KKworCQlpZiAoYnVmcyA9PSBqb3VybmFsLT5qX3didWZzaXplIHx8CisJCSAgICBjb21taXRfdHJhbnNhY3Rpb24tPnRfYnVmZmVycyA9PSBOVUxMIHx8CisJCSAgICBzcGFjZV9sZWZ0IDwgc2l6ZW9mKGpvdXJuYWxfYmxvY2tfdGFnX3QpICsgMTYpIHsKKworCQkJamJkX2RlYnVnKDQsICJKQkQ6IFN1Ym1pdCAlZCBJT3NcbiIsIGJ1ZnMpOworCisJCQkvKiBXcml0ZSBhbiBlbmQtb2YtZGVzY3JpcHRvciBtYXJrZXIgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXR0aW5nIHRoZSBJT3MuICAidGFnIiBzdGlsbCBwb2ludHMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsYXN0IHRhZyB3ZSBzZXQgdXAuICovCisKKwkJCXRhZy0+dF9mbGFncyB8PSBjcHVfdG9fYmUzMihKRlNfRkxBR19MQVNUX1RBRyk7CisKK3N0YXJ0X2pvdXJuYWxfaW86CisJCQlmb3IgKGkgPSAwOyBpIDwgYnVmczsgaSsrKSB7CisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IHdidWZbaV07CisJCQkJbG9ja19idWZmZXIoYmgpOworCQkJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQkJYmgtPmJfZW5kX2lvID0gam91cm5hbF9lbmRfYnVmZmVyX2lvX3N5bmM7CisJCQkJc3VibWl0X2JoKFdSSVRFLCBiaCk7CisJCQl9CisJCQljb25kX3Jlc2NoZWQoKTsKKworCQkJLyogRm9yY2UgYSBuZXcgZGVzY3JpcHRvciB0byBiZSBnZW5lcmF0ZWQgbmV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSByb3VuZCB0aGUgbG9vcC4gKi8KKwkJCWRlc2NyaXB0b3IgPSBOVUxMOworCQkJYnVmcyA9IDA7CisJCX0KKwl9CisKKwkvKiBMbyBhbmQgYmVob2xkOiB3ZSBoYXZlIGp1c3QgbWFuYWdlZCB0byBzZW5kIGEgdHJhbnNhY3Rpb24gdG8KKyAgICAgICAgICAgdGhlIGxvZy4gIEJlZm9yZSB3ZSBjYW4gY29tbWl0IGl0LCB3YWl0IGZvciB0aGUgSU8gc28gZmFyIHRvCisgICAgICAgICAgIGNvbXBsZXRlLiAgQ29udHJvbCBidWZmZXJzIGJlaW5nIHdyaXR0ZW4gYXJlIG9uIHRoZQorICAgICAgICAgICB0cmFuc2FjdGlvbidzIHRfbG9nX2xpc3QgcXVldWUsIGFuZCBtZXRhZGF0YSBidWZmZXJzIGFyZSBvbgorICAgICAgICAgICB0aGUgdF9pb2J1Zl9saXN0IHF1ZXVlLgorCisJICAgV2FpdCBmb3IgdGhlIGJ1ZmZlcnMgaW4gcmV2ZXJzZSBvcmRlci4gIFRoYXQgd2F5IHdlIGFyZQorCSAgIGxlc3MgbGlrZWx5IHRvIGJlIHdva2VuIHVwIHVudGlsIGFsbCBJT3MgaGF2ZSBjb21wbGV0ZWQsIGFuZAorCSAgIHNvIHdlIGluY3VyIGxlc3Mgc2NoZWR1bGluZyBsb2FkLgorCSovCisKKwlqYmRfZGVidWcoMywgIkpCRDogY29tbWl0IHBoYXNlIDRcbiIpOworCisJLyoKKwkgKiBha3BtOiB0aGVzZSBhcmUgQkpfSU8sIGFuZCBqX2xpc3RfbG9jayBpcyBub3QgbmVlZGVkLgorCSAqIFNlZSBfX2pvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVyLgorCSAqLword2FpdF9mb3JfaW9idWY6CisJd2hpbGUgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9pb2J1Zl9saXN0ICE9IE5VTEwpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCQlqaCA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF9pb2J1Zl9saXN0LT5iX3RwcmV2OworCQliaCA9IGpoMmJoKGpoKTsKKwkJaWYgKGJ1ZmZlcl9sb2NrZWQoYmgpKSB7CisJCQl3YWl0X29uX2J1ZmZlcihiaCk7CisJCQlnb3RvIHdhaXRfZm9yX2lvYnVmOworCQl9CisJCWlmIChjb25kX3Jlc2NoZWQoKSkKKwkJCWdvdG8gd2FpdF9mb3JfaW9idWY7CisKKwkJaWYgKHVubGlrZWx5KCFidWZmZXJfdXB0b2RhdGUoYmgpKSkKKwkJCWVyciA9IC1FSU87CisKKwkJY2xlYXJfYnVmZmVyX2p3cml0ZShiaCk7CisKKwkJSkJVRkZFUl9UUkFDRShqaCwgInBoNDogdW5maWxlIGFmdGVyIGpvdXJuYWwgd3JpdGUiKTsKKwkJam91cm5hbF91bmZpbGVfYnVmZmVyKGpvdXJuYWwsIGpoKTsKKworCQkvKgorCQkgKiAtPnRfaW9idWZfbGlzdCBzaG91bGQgY29udGFpbiBvbmx5IGR1bW15IGJ1ZmZlcl9oZWFkcworCQkgKiB3aGljaCB3ZXJlIGNyZWF0ZWQgYnkgam91cm5hbF93cml0ZV9tZXRhZGF0YV9idWZmZXIoKS4KKwkJICovCisJCUJVRkZFUl9UUkFDRShiaCwgImR1bXBpbmcgdGVtcG9yYXJ5IGJoIik7CisJCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CisJCV9fYnJlbHNlKGJoKTsKKwkJSl9BU1NFUlRfQkgoYmgsIGF0b21pY19yZWFkKCZiaC0+Yl9jb3VudCkgPT0gMCk7CisJCWZyZWVfYnVmZmVyX2hlYWQoYmgpOworCisJCS8qIFdlIGFsc28gaGF2ZSB0byB1bmxvY2sgYW5kIGZyZWUgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICAgICAgICBzaGFkb3dlZCBidWZmZXIgKi8KKwkJamggPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfc2hhZG93X2xpc3QtPmJfdHByZXY7CisJCWJoID0gamgyYmgoamgpOworCQljbGVhcl9iaXQoQkhfSldyaXRlLCAmYmgtPmJfc3RhdGUpOworCQlKX0FTU0VSVF9CSChiaCwgYnVmZmVyX2piZGRpcnR5KGJoKSk7CisKKwkJLyogVGhlIG1ldGFkYXRhIGlzIG5vdyByZWxlYXNlZCBmb3IgcmV1c2UsIGJ1dCB3ZSBuZWVkCisgICAgICAgICAgICAgICAgICAgdG8gcmVtZW1iZXIgaXQgYWdhaW5zdCB0aGlzIHRyYW5zYWN0aW9uIHNvIHRoYXQgd2hlbgorICAgICAgICAgICAgICAgICAgIHdlIGZpbmFsbHkgY29tbWl0LCB3ZSBjYW4gZG8gYW55IGNoZWNrcG9pbnRpbmcKKyAgICAgICAgICAgICAgICAgICByZXF1aXJlZC4gKi8KKwkJSkJVRkZFUl9UUkFDRShqaCwgImZpbGUgYXMgQkpfRm9yZ2V0Iik7CisJCWpvdXJuYWxfZmlsZV9idWZmZXIoamgsIGNvbW1pdF90cmFuc2FjdGlvbiwgQkpfRm9yZ2V0KTsKKwkJLyogV2FrZSB1cCBhbnkgdHJhbnNhY3Rpb25zIHdoaWNoIHdlcmUgd2FpdGluZyBmb3IgdGhpcworCQkgICBJTyB0byBjb21wbGV0ZSAqLworCQl3YWtlX3VwX2JpdCgmYmgtPmJfc3RhdGUsIEJIX1Vuc2hhZG93KTsKKwkJSkJVRkZFUl9UUkFDRShqaCwgImJyZWxzZSBzaGFkb3dlZCBidWZmZXIiKTsKKwkJX19icmVsc2UoYmgpOworCX0KKworCUpfQVNTRVJUIChjb21taXRfdHJhbnNhY3Rpb24tPnRfc2hhZG93X2xpc3QgPT0gTlVMTCk7CisKKwlqYmRfZGVidWcoMywgIkpCRDogY29tbWl0IHBoYXNlIDVcbiIpOworCisJLyogSGVyZSB3ZSB3YWl0IGZvciB0aGUgcmV2b2tlIHJlY29yZCBhbmQgZGVzY3JpcHRvciByZWNvcmQgYnVmZmVycyAqLworIHdhaXRfZm9yX2N0bGJ1ZjoKKwl3aGlsZSAoY29tbWl0X3RyYW5zYWN0aW9uLT50X2xvZ19saXN0ICE9IE5VTEwpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCQlqaCA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF9sb2dfbGlzdC0+Yl90cHJldjsKKwkJYmggPSBqaDJiaChqaCk7CisJCWlmIChidWZmZXJfbG9ja2VkKGJoKSkgeworCQkJd2FpdF9vbl9idWZmZXIoYmgpOworCQkJZ290byB3YWl0X2Zvcl9jdGxidWY7CisJCX0KKwkJaWYgKGNvbmRfcmVzY2hlZCgpKQorCQkJZ290byB3YWl0X2Zvcl9jdGxidWY7CisKKwkJaWYgKHVubGlrZWx5KCFidWZmZXJfdXB0b2RhdGUoYmgpKSkKKwkJCWVyciA9IC1FSU87CisKKwkJQlVGRkVSX1RSQUNFKGJoLCAicGg1OiBjb250cm9sIGJ1ZmZlciB3cml0ZW91dCBkb25lOiB1bmZpbGUiKTsKKwkJY2xlYXJfYnVmZmVyX2p3cml0ZShiaCk7CisJCWpvdXJuYWxfdW5maWxlX2J1ZmZlcihqb3VybmFsLCBqaCk7CisJCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CisJCV9fYnJlbHNlKGJoKTsJCS8qIE9uZSBmb3IgZ2V0YmxrICovCisJCS8qIEFLUE06IGJmb3JnZXQgaGVyZSAqLworCX0KKworCWpiZF9kZWJ1ZygzLCAiSkJEOiBjb21taXQgcGhhc2UgNlxuIik7CisKKwlpZiAoam91cm5hbF93cml0ZV9jb21taXRfcmVjb3JkKGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbikpCisJCWVyciA9IC1FSU87CisKKwlpZiAoZXJyKQorCQlfX2pvdXJuYWxfYWJvcnRfaGFyZChqb3VybmFsKTsKKworCS8qIEVuZCBvZiBhIHRyYW5zYWN0aW9uISAgRmluYWxseSwgd2UgY2FuIGRvIGNoZWNrcG9pbnQKKyAgICAgICAgICAgcHJvY2Vzc2luZzogYW55IGJ1ZmZlcnMgY29tbWl0dGVkIGFzIGEgcmVzdWx0IG9mIHRoaXMKKyAgICAgICAgICAgdHJhbnNhY3Rpb24gY2FuIGJlIHJlbW92ZWQgZnJvbSBhbnkgY2hlY2twb2ludCBsaXN0IGl0IHdhcyBvbgorICAgICAgICAgICBiZWZvcmUuICovCisKKwlqYmRfZGVidWcoMywgIkpCRDogY29tbWl0IHBoYXNlIDdcbiIpOworCisJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uLT50X3N5bmNfZGF0YWxpc3QgPT0gTlVMTCk7CisJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uLT50X2J1ZmZlcnMgPT0gTlVMTCk7CisJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCA9PSBOVUxMKTsKKwlKX0FTU0VSVChjb21taXRfdHJhbnNhY3Rpb24tPnRfaW9idWZfbGlzdCA9PSBOVUxMKTsKKwlKX0FTU0VSVChjb21taXRfdHJhbnNhY3Rpb24tPnRfc2hhZG93X2xpc3QgPT0gTlVMTCk7CisJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uLT50X2xvZ19saXN0ID09IE5VTEwpOworCityZXN0YXJ0X2xvb3A6CisJd2hpbGUgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9mb3JnZXQpIHsKKwkJdHJhbnNhY3Rpb25fdCAqY3BfdHJhbnNhY3Rpb247CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkJamggPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfZm9yZ2V0OworCQliaCA9IGpoMmJoKGpoKTsKKwkJamJkX2xvY2tfYmhfc3RhdGUoYmgpOworCQlKX0FTU0VSVF9KSChqaCwJamgtPmJfdHJhbnNhY3Rpb24gPT0gY29tbWl0X3RyYW5zYWN0aW9uIHx8CisJCQlqaC0+Yl90cmFuc2FjdGlvbiA9PSBqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24pOworCisJCS8qCisJCSAqIElmIHRoZXJlIGlzIHVuZG8tcHJvdGVjdGVkIGNvbW1pdHRlZCBkYXRhIGFnYWluc3QKKwkJICogdGhpcyBidWZmZXIsIHRoZW4gd2UgY2FuIHJlbW92ZSBpdCBub3cuICBJZiBpdCBpcyBhCisJCSAqIGJ1ZmZlciBuZWVkaW5nIHN1Y2ggcHJvdGVjdGlvbiwgdGhlIG9sZCBmcm96ZW5fZGF0YQorCQkgKiBmaWVsZCBub3cgcG9pbnRzIHRvIGEgY29tbWl0dGVkIHZlcnNpb24gb2YgdGhlCisJCSAqIGJ1ZmZlciwgc28gcm90YXRlIHRoYXQgZmllbGQgdG8gdGhlIG5ldyBjb21taXR0ZWQKKwkJICogZGF0YS4KKwkJICoKKwkJICogT3RoZXJ3aXNlLCB3ZSBjYW4ganVzdCB0aHJvdyBhd2F5IHRoZSBmcm96ZW4gZGF0YSBub3cuCisJCSAqLworCQlpZiAoamgtPmJfY29tbWl0dGVkX2RhdGEpIHsKKwkJCWtmcmVlKGpoLT5iX2NvbW1pdHRlZF9kYXRhKTsKKwkJCWpoLT5iX2NvbW1pdHRlZF9kYXRhID0gTlVMTDsKKwkJCWlmIChqaC0+Yl9mcm96ZW5fZGF0YSkgeworCQkJCWpoLT5iX2NvbW1pdHRlZF9kYXRhID0gamgtPmJfZnJvemVuX2RhdGE7CisJCQkJamgtPmJfZnJvemVuX2RhdGEgPSBOVUxMOworCQkJfQorCQl9IGVsc2UgaWYgKGpoLT5iX2Zyb3plbl9kYXRhKSB7CisJCQlrZnJlZShqaC0+Yl9mcm96ZW5fZGF0YSk7CisJCQlqaC0+Yl9mcm96ZW5fZGF0YSA9IE5VTEw7CisJCX0KKworCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJY3BfdHJhbnNhY3Rpb24gPSBqaC0+Yl9jcF90cmFuc2FjdGlvbjsKKwkJaWYgKGNwX3RyYW5zYWN0aW9uKSB7CisJCQlKQlVGRkVSX1RSQUNFKGpoLCAicmVtb3ZlIGZyb20gb2xkIGNwIHRyYW5zYWN0aW9uIik7CisJCQlfX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQoamgpOworCQl9CisKKwkJLyogT25seSByZS1jaGVja3BvaW50IHRoZSBidWZmZXJfaGVhZCBpZiBpdCBpcyBtYXJrZWQKKwkJICogZGlydHkuICBJZiB0aGUgYnVmZmVyIHdhcyBhZGRlZCB0byB0aGUgQkpfRm9yZ2V0IGxpc3QKKwkJICogYnkgam91cm5hbF9mb3JnZXQsIGl0IG1heSBubyBsb25nZXIgYmUgZGlydHkgYW5kCisJCSAqIHRoZXJlJ3Mgbm8gcG9pbnQgaW4ga2VlcGluZyBhIGNoZWNrcG9pbnQgcmVjb3JkIGZvcgorCQkgKiBpdC4gKi8KKworCQkvKiBBIGJ1ZmZlciB3aGljaCBoYXMgYmVlbiBmcmVlZCB3aGlsZSBzdGlsbCBiZWluZworCQkgKiBqb3VybmFsZWQgYnkgYSBwcmV2aW91cyB0cmFuc2FjdGlvbiBtYXkgZW5kIHVwIHN0aWxsCisJCSAqIGJlaW5nIGRpcnR5IGhlcmUsIGJ1dCB3ZSB3YW50IHRvIGF2b2lkIHdyaXRpbmcgYmFjaworCQkgKiB0aGF0IGJ1ZmZlciBpbiB0aGUgZnV0dXJlIG5vdyB0aGF0IHRoZSBsYXN0IHVzZSBoYXMKKwkJICogYmVlbiBjb21taXR0ZWQuICBUaGF0J3Mgbm90IG9ubHkgYSBwZXJmb3JtYW5jZSBnYWluLAorCQkgKiBpdCBhbHNvIHN0b3BzIGFsaWFzaW5nIHByb2JsZW1zIGlmIHRoZSBidWZmZXIgaXMgbGVmdAorCQkgKiBiZWhpbmQgZm9yIHdyaXRlYmFjayBhbmQgZ2V0cyByZWFsbG9jYXRlZCBmb3IgYW5vdGhlcgorCQkgKiB1c2UgaW4gYSBkaWZmZXJlbnQgcGFnZS4gKi8KKwkJaWYgKGJ1ZmZlcl9mcmVlZChiaCkpIHsKKwkJCWNsZWFyX2J1ZmZlcl9mcmVlZChiaCk7CisJCQljbGVhcl9idWZmZXJfamJkZGlydHkoYmgpOworCQl9CisKKwkJaWYgKGJ1ZmZlcl9qYmRkaXJ0eShiaCkpIHsKKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJhZGQgdG8gbmV3IGNoZWNrcG9pbnRpbmcgdHJhbnMiKTsKKwkJCV9fam91cm5hbF9pbnNlcnRfY2hlY2twb2ludChqaCwgY29tbWl0X3RyYW5zYWN0aW9uKTsKKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJyZWZpbGUgZm9yIGNoZWNrcG9pbnQgd3JpdGViYWNrIik7CisJCQlfX2pvdXJuYWxfcmVmaWxlX2J1ZmZlcihqaCk7CisJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJfSBlbHNlIHsKKwkJCUpfQVNTRVJUX0JIKGJoLCAhYnVmZmVyX2RpcnR5KGJoKSk7CisJCQlKX0FTU0VSVF9KSChqaCwgamgtPmJfbmV4dF90cmFuc2FjdGlvbiA9PSBOVUxMKTsKKwkJCV9fam91cm5hbF91bmZpbGVfYnVmZmVyKGpoKTsKKwkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQkJam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsgIC8qIG5lZWRzIGEgYnJlbHNlICovCisJCQlyZWxlYXNlX2J1ZmZlcl9wYWdlKGJoKTsKKwkJfQorCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQlpZiAoY29uZF9yZXNjaGVkKCkpCisJCQlnb3RvIHJlc3RhcnRfbG9vcDsKKwl9CisKKwkvKiBEb25lIHdpdGggdGhpcyB0cmFuc2FjdGlvbiEgKi8KKworCWpiZF9kZWJ1ZygzLCAiSkJEOiBjb21taXQgcGhhc2UgOFxuIik7CisKKwlKX0FTU0VSVChjb21taXRfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPT0gVF9DT01NSVQpOworCisJLyoKKwkgKiBUaGlzIGlzIGEgYml0IHNsZWF6eS4gIFdlIGJvcnJvdyBqX2xpc3RfbG9jayB0byBwcm90ZWN0CisJICogam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uIGluIF9fam91cm5hbF9yZW1vdmVfY2hlY2twb2ludC4KKwkgKiBSZWFsbHksIF9fam9ybmFsX3JlbW92ZV9jaGVja3BvaW50IHNob3VsZCBiZSB1c2luZyBqX3N0YXRlX2xvY2sgYnV0CisJICogaXQncyBhIGJpdCBoYXNzbGUgdG8gaG9sZCB0aGF0IGFjcm9zcyBfX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQKKwkgKi8KKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJY29tbWl0X3RyYW5zYWN0aW9uLT50X3N0YXRlID0gVF9GSU5JU0hFRDsKKwlKX0FTU0VSVChjb21taXRfdHJhbnNhY3Rpb24gPT0gam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKTsKKwlqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF90aWQ7CisJam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uID0gTlVMTDsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCWlmIChjb21taXRfdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0ID09IE5VTEwpIHsKKwkJX19qb3VybmFsX2Ryb3BfdHJhbnNhY3Rpb24oam91cm5hbCwgY29tbWl0X3RyYW5zYWN0aW9uKTsKKwl9IGVsc2UgeworCQlpZiAoam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyA9PSBOVUxMKSB7CisJCQlqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zID0gY29tbWl0X3RyYW5zYWN0aW9uOworCQkJY29tbWl0X3RyYW5zYWN0aW9uLT50X2NwbmV4dCA9IGNvbW1pdF90cmFuc2FjdGlvbjsKKwkJCWNvbW1pdF90cmFuc2FjdGlvbi0+dF9jcHByZXYgPSBjb21taXRfdHJhbnNhY3Rpb247CisJCX0gZWxzZSB7CisJCQljb21taXRfdHJhbnNhY3Rpb24tPnRfY3BuZXh0ID0KKwkJCQlqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zOworCQkJY29tbWl0X3RyYW5zYWN0aW9uLT50X2NwcHJldiA9CisJCQkJY29tbWl0X3RyYW5zYWN0aW9uLT50X2NwbmV4dC0+dF9jcHByZXY7CisJCQljb21taXRfdHJhbnNhY3Rpb24tPnRfY3BuZXh0LT50X2NwcHJldiA9CisJCQkJY29tbWl0X3RyYW5zYWN0aW9uOworCQkJY29tbWl0X3RyYW5zYWN0aW9uLT50X2NwcHJldi0+dF9jcG5leHQgPQorCQkJCWNvbW1pdF90cmFuc2FjdGlvbjsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCisJamJkX2RlYnVnKDEsICJKQkQ6IGNvbW1pdCAlZCBjb21wbGV0ZSwgaGVhZCAlZFxuIiwKKwkJICBqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSwgam91cm5hbC0+al90YWlsX3NlcXVlbmNlKTsKKworCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF9kb25lX2NvbW1pdCk7Cit9CmRpZmYgLS1naXQgYS9mcy9qYmQvam91cm5hbC5jIGIvZnMvamJkL2pvdXJuYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTZmMmUyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamJkL2pvdXJuYWwuYwpAQCAtMCwwICsxLDIwMDMgQEAKKy8qCisgKiBsaW51eC9mcy9qb3VybmFsLmMKKyAqCisgKiBXcml0dGVuIGJ5IFN0ZXBoZW4gQy4gVHdlZWRpZSA8c2N0QHJlZGhhdC5jb20+LCAxOTk4CisgKgorICogQ29weXJpZ2h0IDE5OTggUmVkIEhhdCBjb3JwIC0tLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgb3IgYXQgeW91cgorICogb3B0aW9uLCBhbnkgbGF0ZXIgdmVyc2lvbiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogR2VuZXJpYyBmaWxlc3lzdGVtIGpvdXJuYWwtd3JpdGluZyBjb2RlOyBwYXJ0IG9mIHRoZSBleHQyZnMKKyAqIGpvdXJuYWxpbmcgc3lzdGVtLgorICoKKyAqIFRoaXMgZmlsZSBtYW5hZ2VzIGpvdXJuYWxzOiBhcmVhcyBvZiBkaXNrIHJlc2VydmVkIGZvciBsb2dnaW5nCisgKiB0cmFuc2FjdGlvbmFsIHVwZGF0ZXMuICBUaGlzIGluY2x1ZGVzIHRoZSBrZXJuZWwgam91cm5hbGluZyB0aHJlYWQKKyAqIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBzY2hlZHVsaW5nIHVwZGF0ZXMgdG8gdGhlIGxvZy4KKyAqCisgKiBXZSBkbyBub3QgYWN0dWFsbHkgbWFuYWdlIHRoZSBwaHlzaWNhbCBzdG9yYWdlIG9mIHRoZSBqb3VybmFsIGluIHRoaXMKKyAqIGZpbGU6IHRoYXQgaXMgbGVmdCB0byBhIHBlci1qb3VybmFsIHBvbGljeSBmdW5jdGlvbiwgd2hpY2ggYWxsb3dzIHVzCisgKiB0byBzdG9yZSB0aGUgam91cm5hbCB3aXRoaW4gYSBmaWxlc3lzdGVtLXNwZWNpZmllZCBhcmVhIGZvciBleHQyCisgKiBqb3VybmFsaW5nIChleHQyIGNhbiB1c2UgYSByZXNlcnZlZCBpbm9kZSBmb3Igc3RvcmluZyB0aGUgbG9nKS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamJkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKK0VYUE9SVF9TWU1CT0woam91cm5hbF9zdGFydCk7CitFWFBPUlRfU1lNQk9MKGpvdXJuYWxfcmVzdGFydCk7CitFWFBPUlRfU1lNQk9MKGpvdXJuYWxfZXh0ZW5kKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9zdG9wKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9sb2NrX3VwZGF0ZXMpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX3VubG9ja191cGRhdGVzKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9nZXRfY3JlYXRlX2FjY2Vzcyk7CitFWFBPUlRfU1lNQk9MKGpvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9kaXJ0eV9kYXRhKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9kaXJ0eV9tZXRhZGF0YSk7CitFWFBPUlRfU1lNQk9MKGpvdXJuYWxfcmVsZWFzZV9idWZmZXIpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX2ZvcmdldCk7CisjaWYgMAorRVhQT1JUX1NZTUJPTChqb3VybmFsX3N5bmNfYnVmZmVyKTsKKyNlbmRpZgorRVhQT1JUX1NZTUJPTChqb3VybmFsX2ZsdXNoKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9yZXZva2UpOworCitFWFBPUlRfU1lNQk9MKGpvdXJuYWxfaW5pdF9kZXYpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX2luaXRfaW5vZGUpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX3VwZGF0ZV9mb3JtYXQpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX2NoZWNrX3VzZWRfZmVhdHVyZXMpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX2NoZWNrX2F2YWlsYWJsZV9mZWF0dXJlcyk7CitFWFBPUlRfU1lNQk9MKGpvdXJuYWxfc2V0X2ZlYXR1cmVzKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9jcmVhdGUpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX2xvYWQpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX2Rlc3Ryb3kpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX3JlY292ZXIpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX3VwZGF0ZV9zdXBlcmJsb2NrKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9hYm9ydCk7CitFWFBPUlRfU1lNQk9MKGpvdXJuYWxfZXJybm8pOworRVhQT1JUX1NZTUJPTChqb3VybmFsX2Fja19lcnIpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX2NsZWFyX2Vycik7CitFWFBPUlRfU1lNQk9MKGxvZ193YWl0X2NvbW1pdCk7CitFWFBPUlRfU1lNQk9MKGpvdXJuYWxfc3RhcnRfY29tbWl0KTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9mb3JjZV9jb21taXRfbmVzdGVkKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF93aXBlKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9ibG9ja3NfcGVyX3BhZ2UpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX2ludmFsaWRhdGVwYWdlKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF90cnlfdG9fZnJlZV9idWZmZXJzKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9mb3JjZV9jb21taXQpOworCitzdGF0aWMgaW50IGpvdXJuYWxfY29udmVydF9zdXBlcmJsb2NrX3YxKGpvdXJuYWxfdCAqLCBqb3VybmFsX3N1cGVyYmxvY2tfdCAqKTsKKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIG1hbmFnZSBjb21taXQgdGltZW91dHMKKyAqLworCitzdGF0aWMgdm9pZCBjb21taXRfdGltZW91dCh1bnNpZ25lZCBsb25nIF9fZGF0YSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBwID0gKHN0cnVjdCB0YXNrX3N0cnVjdCAqKSBfX2RhdGE7CisKKwl3YWtlX3VwX3Byb2Nlc3MocCk7Cit9CisKKy8qIFN0YXRpYyBjaGVjayBmb3IgZGF0YSBzdHJ1Y3R1cmUgY29uc2lzdGVuY3kuICBUaGVyZSdzIG5vIGNvZGUKKyAqIGludm9rZWQgLS0tIHdlJ2xsIGp1c3QgZ2V0IGEgbGlua2VyIGZhaWx1cmUgaWYgdGhpbmdzIGFyZW4ndCByaWdodC4KKyAqLwordm9pZCBfX2pvdXJuYWxfaW50ZXJuYWxfY2hlY2sodm9pZCkKK3sKKwlleHRlcm4gdm9pZCBqb3VybmFsX2JhZF9zdXBlcmJsb2NrX3NpemUodm9pZCk7CisJaWYgKHNpemVvZihzdHJ1Y3Qgam91cm5hbF9zdXBlcmJsb2NrX3MpICE9IDEwMjQpCisJCWpvdXJuYWxfYmFkX3N1cGVyYmxvY2tfc2l6ZSgpOworfQorCisvKgorICoga2pvdXJuYWxkOiBUaGUgbWFpbiB0aHJlYWQgZnVuY3Rpb24gdXNlZCB0byBtYW5hZ2UgYSBsb2dnaW5nIGRldmljZQorICogam91cm5hbC4KKyAqCisgKiBUaGlzIGtlcm5lbCB0aHJlYWQgaXMgcmVzcG9uc2libGUgZm9yIHR3byB0aGluZ3M6CisgKgorICogMSkgQ09NTUlUOiAgRXZlcnkgc28gb2Z0ZW4gd2UgbmVlZCB0byBjb21taXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlCisgKiAgICBmaWxlc3lzdGVtIHRvIGRpc2suICBUaGUgam91cm5hbCB0aHJlYWQgaXMgcmVzcG9uc2libGUgZm9yIHdyaXRpbmcKKyAqICAgIGFsbCBvZiB0aGUgbWV0YWRhdGEgYnVmZmVycyB0byBkaXNrLgorICoKKyAqIDIpIENIRUNLUE9JTlQ6IFdlIGNhbm5vdCByZXVzZSBhIHVzZWQgc2VjdGlvbiBvZiB0aGUgbG9nIGZpbGUgdW50aWwgYWxsCisgKiAgICBvZiB0aGUgZGF0YSBpbiB0aGF0IHBhcnQgb2YgdGhlIGxvZyBoYXMgYmVlbiByZXdyaXR0ZW4gZWxzZXdoZXJlIG9uCisgKiAgICB0aGUgZGlzay4gIEZsdXNoaW5nIHRoZXNlIG9sZCBidWZmZXJzIHRvIHJlY2xhaW0gc3BhY2UgaW4gdGhlIGxvZyBpcworICogICAga25vd24gYXMgY2hlY2twb2ludGluZywgYW5kIHRoaXMgdGhyZWFkIGlzIHJlc3BvbnNpYmxlIGZvciB0aGF0IGpvYi4KKyAqLworCitqb3VybmFsX3QgKmN1cnJlbnRfam91cm5hbDsJCS8vIEFLUE06IGRlYnVnCisKK2ludCBram91cm5hbGQodm9pZCAqYXJnKQoreworCWpvdXJuYWxfdCAqam91cm5hbCA9IChqb3VybmFsX3QgKikgYXJnOworCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCisJY3VycmVudF9qb3VybmFsID0gam91cm5hbDsKKworCWRhZW1vbml6ZSgia2pvdXJuYWxkIik7CisKKwkvKiBTZXQgdXAgYW4gaW50ZXJ2YWwgdGltZXIgd2hpY2ggY2FuIGJlIHVzZWQgdG8gdHJpZ2dlciBhCisgICAgICAgICAgIGNvbW1pdCB3YWtldXAgYWZ0ZXIgdGhlIGNvbW1pdCBpbnRlcnZhbCBleHBpcmVzICovCisJaW5pdF90aW1lcigmdGltZXIpOworCXRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgY3VycmVudDsKKwl0aW1lci5mdW5jdGlvbiA9IGNvbW1pdF90aW1lb3V0OworCWpvdXJuYWwtPmpfY29tbWl0X3RpbWVyID0gJnRpbWVyOworCisJLyogUmVjb3JkIHRoYXQgdGhlIGpvdXJuYWwgdGhyZWFkIGlzIHJ1bm5pbmcgKi8KKwlqb3VybmFsLT5qX3Rhc2sgPSBjdXJyZW50OworCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF9kb25lX2NvbW1pdCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJram91cm5hbGQgc3RhcnRpbmcuICBDb21taXQgaW50ZXJ2YWwgJWxkIHNlY29uZHNcbiIsCisJCQlqb3VybmFsLT5qX2NvbW1pdF9pbnRlcnZhbCAvIEhaKTsKKworCS8qCisJICogQW5kIG5vdywgd2FpdCBmb3JldmVyIGZvciBjb21taXQgd2FrZXVwIGV2ZW50cy4KKwkgKi8KKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisKK2xvb3A6CisJaWYgKGpvdXJuYWwtPmpfZmxhZ3MgJiBKRlNfVU5NT1VOVCkKKwkJZ290byBlbmRfbG9vcDsKKworCWpiZF9kZWJ1ZygxLCAiY29tbWl0X3NlcXVlbmNlPSVkLCBjb21taXRfcmVxdWVzdD0lZFxuIiwKKwkJam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UsIGpvdXJuYWwtPmpfY29tbWl0X3JlcXVlc3QpOworCisJaWYgKGpvdXJuYWwtPmpfY29tbWl0X3NlcXVlbmNlICE9IGpvdXJuYWwtPmpfY29tbWl0X3JlcXVlc3QpIHsKKwkJamJkX2RlYnVnKDEsICJPSywgcmVxdWVzdHMgZGlmZmVyXG4iKTsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCWRlbF90aW1lcl9zeW5jKGpvdXJuYWwtPmpfY29tbWl0X3RpbWVyKTsKKwkJam91cm5hbF9jb21taXRfdHJhbnNhY3Rpb24oam91cm5hbCk7CisJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJZ290byBsb29wOworCX0KKworCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF9kb25lX2NvbW1pdCk7CisJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKSB7CisJCS8qCisJCSAqIFRoZSBzaW1wbGVyIHRoZSBiZXR0ZXIuIEZsdXNoaW5nIGpvdXJuYWwgaXNuJ3QgYQorCQkgKiBnb29kIGlkZWEsIGJlY2F1c2UgdGhhdCBkZXBlbmRzIG9uIHRocmVhZHMgdGhhdCBtYXkKKwkJICogYmUgYWxyZWFkeSBzdG9wcGVkLgorCQkgKi8KKwkJamJkX2RlYnVnKDEsICJOb3cgc3VzcGVuZGluZyBram91cm5hbGRcbiIpOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJcmVmcmlnZXJhdG9yKFBGX0ZSRUVaRSk7CisJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBXZSBhc3N1bWUgb24gcmVzdW1lIHRoYXQgY29tbWl0cyBhcmUgYWxyZWFkeSB0aGVyZSwKKwkJICogc28gd2UgZG9uJ3Qgc2xlZXAKKwkJICovCisJCURFRklORV9XQUlUKHdhaXQpOworCQlpbnQgc2hvdWxkX3NsZWVwID0gMTsKKworCQlwcmVwYXJlX3RvX3dhaXQoJmpvdXJuYWwtPmpfd2FpdF9jb21taXQsICZ3YWl0LAorCQkJCVRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSAhPSBqb3VybmFsLT5qX2NvbW1pdF9yZXF1ZXN0KQorCQkJc2hvdWxkX3NsZWVwID0gMDsKKwkJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb247CisJCWlmICh0cmFuc2FjdGlvbiAmJiB0aW1lX2FmdGVyX2VxKGppZmZpZXMsCisJCQkJCQl0cmFuc2FjdGlvbi0+dF9leHBpcmVzKSkKKwkJCXNob3VsZF9zbGVlcCA9IDA7CisJCWlmIChzaG91bGRfc2xlZXApIHsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQkJc2NoZWR1bGUoKTsKKwkJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJfQorCQlmaW5pc2hfd2FpdCgmam91cm5hbC0+al93YWl0X2NvbW1pdCwgJndhaXQpOworCX0KKworCWpiZF9kZWJ1ZygxLCAia2pvdXJuYWxkIHdha2VzXG4iKTsKKworCS8qCisJICogV2VyZSB3ZSB3b2tlbiB1cCBieSBhIGNvbW1pdCB3YWtldXAgZXZlbnQ/CisJICovCisJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb247CisJaWYgKHRyYW5zYWN0aW9uICYmIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdHJhbnNhY3Rpb24tPnRfZXhwaXJlcykpIHsKKwkJam91cm5hbC0+al9jb21taXRfcmVxdWVzdCA9IHRyYW5zYWN0aW9uLT50X3RpZDsKKwkJamJkX2RlYnVnKDEsICJ3b2tlIGJlY2F1c2Ugb2YgdGltZW91dFxuIik7CisJfQorCWdvdG8gbG9vcDsKKworZW5kX2xvb3A6CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJZGVsX3RpbWVyX3N5bmMoam91cm5hbC0+al9jb21taXRfdGltZXIpOworCWpvdXJuYWwtPmpfdGFzayA9IE5VTEw7CisJd2FrZV91cCgmam91cm5hbC0+al93YWl0X2RvbmVfY29tbWl0KTsKKwlqYmRfZGVidWcoMSwgIkpvdXJuYWwgdGhyZWFkIGV4aXRpbmcuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgam91cm5hbF9zdGFydF90aHJlYWQoam91cm5hbF90ICpqb3VybmFsKQoreworCWtlcm5lbF90aHJlYWQoa2pvdXJuYWxkLCBqb3VybmFsLCBDTE9ORV9WTXxDTE9ORV9GU3xDTE9ORV9GSUxFUyk7CisJd2FpdF9ldmVudChqb3VybmFsLT5qX3dhaXRfZG9uZV9jb21taXQsIGpvdXJuYWwtPmpfdGFzayAhPSAwKTsKK30KKworc3RhdGljIHZvaWQgam91cm5hbF9raWxsX3RocmVhZChqb3VybmFsX3QgKmpvdXJuYWwpCit7CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWpvdXJuYWwtPmpfZmxhZ3MgfD0gSkZTX1VOTU9VTlQ7CisKKwl3aGlsZSAoam91cm5hbC0+al90YXNrKSB7CisJCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF9jb21taXQpOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJd2FpdF9ldmVudChqb3VybmFsLT5qX3dhaXRfZG9uZV9jb21taXQsIGpvdXJuYWwtPmpfdGFzayA9PSAwKTsKKwkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKK30KKworLyoKKyAqIGpvdXJuYWxfd3JpdGVfbWV0YWRhdGFfYnVmZmVyOiB3cml0ZSBhIG1ldGFkYXRhIGJ1ZmZlciB0byB0aGUgam91cm5hbC4KKyAqCisgKiBXcml0ZXMgYSBtZXRhZGF0YSBidWZmZXIgdG8gYSBnaXZlbiBkaXNrIGJsb2NrLiAgVGhlIGFjdHVhbCBJTyBpcyBub3QKKyAqIHBlcmZvcm1lZCBidXQgYSBuZXcgYnVmZmVyX2hlYWQgaXMgY29uc3RydWN0ZWQgd2hpY2ggbGFiZWxzIHRoZSBkYXRhCisgKiB0byBiZSB3cml0dGVuIHdpdGggdGhlIGNvcnJlY3QgZGVzdGluYXRpb24gZGlzayBibG9jay4KKyAqCisgKiBBbnkgbWFnaWMtbnVtYmVyIGVzY2FwaW5nIHdoaWNoIG5lZWRzIHRvIGJlIGRvbmUgd2lsbCBjYXVzZSBhCisgKiBjb3B5LW91dCBoZXJlLiAgSWYgdGhlIGJ1ZmZlciBoYXBwZW5zIHRvIHN0YXJ0IHdpdGggdGhlCisgKiBKRlNfTUFHSUNfTlVNQkVSLCB0aGVuIHdlIGNhbid0IHdyaXRlIGl0IHRvIHRoZSBsb2cgZGlyZWN0bHk6IHRoZQorICogbWFnaWMgbnVtYmVyIGlzIG9ubHkgd3JpdHRlbiB0byB0aGUgbG9nIGZvciBkZXNjcmlwdGVyIGJsb2Nrcy4gIEluCisgKiB0aGlzIGNhc2UsIHdlIGNvcHkgdGhlIGRhdGEgYW5kIHJlcGxhY2UgdGhlIGZpcnN0IHdvcmQgd2l0aCAwLCBhbmQgd2UKKyAqIHJldHVybiBhIHJlc3VsdCBjb2RlIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoaXMgYnVmZmVyIG5lZWRzIHRvIGJlCisgKiBtYXJrZWQgYXMgYW4gZXNjYXBlZCBidWZmZXIgaW4gdGhlIGNvcnJlc3BvbmRpbmcgbG9nIGRlc2NyaXB0b3IKKyAqIGJsb2NrLiAgVGhlIG1pc3Npbmcgd29yZCBjYW4gdGhlbiBiZSByZXN0b3JlZCB3aGVuIHRoZSBibG9jayBpcyByZWFkCisgKiBkdXJpbmcgcmVjb3ZlcnkuCisgKgorICogSWYgdGhlIHNvdXJjZSBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiBtb2RpZmllZCBieSBhIG5ldyB0cmFuc2FjdGlvbgorICogc2luY2Ugd2UgdG9vayB0aGUgbGFzdCBjb21taXQgc25hcHNob3QsIHdlIHVzZSB0aGUgZnJvemVuIGNvcHkgb2YKKyAqIHRoYXQgZGF0YSBmb3IgSU8uICBJZiB3ZSBlbmQgdXAgdXNpbmcgdGhlIGV4aXN0aW5nIGJ1ZmZlcl9oZWFkJ3MgZGF0YQorICogZm9yIHRoZSB3cml0ZSwgdGhlbiB3ZSAqaGF2ZSogdG8gbG9jayB0aGUgYnVmZmVyIHRvIHByZXZlbnQgYW55b25lCisgKiBlbHNlIGZyb20gdXNpbmcgYW5kIHBvc3NpYmx5IG1vZGlmeWluZyBpdCB3aGlsZSB0aGUgSU8gaXMgaW4KKyAqIHByb2dyZXNzLgorICoKKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyX2hlYWRzIHRvIGJlIHVzZWQgZm9yIElPLgorICoKKyAqIFdlIGFzc3VtZSB0aGF0IHRoZSBqb3VybmFsIGhhcyBhbHJlYWR5IGJlZW4gbG9ja2VkIGluIHRoaXMgZnVuY3Rpb24uCisgKgorICogUmV0dXJuIHZhbHVlOgorICogIDwwOiBFcnJvcgorICogPj0wOiBGaW5pc2hlZCBPSworICoKKyAqIE9uIHN1Y2Nlc3M6CisgKiBCaXQgMCBzZXQgPT0gZXNjYXBlIHBlcmZvcm1lZCBvbiB0aGUgZGF0YQorICogQml0IDEgc2V0ID09IGJ1ZmZlciBjb3B5LW91dCBwZXJmb3JtZWQgKGtmcmVlIHRoZSBkYXRhIGFmdGVyIElPKQorICovCisKK2ludCBqb3VybmFsX3dyaXRlX21ldGFkYXRhX2J1ZmZlcih0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbiwKKwkJCQkgIHN0cnVjdCBqb3VybmFsX2hlYWQgICpqaF9pbiwKKwkJCQkgIHN0cnVjdCBqb3VybmFsX2hlYWQgKipqaF9vdXQsCisJCQkJICBpbnQgYmxvY2tucikKK3sKKwlpbnQgbmVlZF9jb3B5X291dCA9IDA7CisJaW50IGRvbmVfY29weV9vdXQgPSAwOworCWludCBkb19lc2NhcGUgPSAwOworCWNoYXIgKm1hcHBlZF9kYXRhOworCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV3X2JoOworCXN0cnVjdCBqb3VybmFsX2hlYWQgKm5ld19qaDsKKwlzdHJ1Y3QgcGFnZSAqbmV3X3BhZ2U7CisJdW5zaWduZWQgaW50IG5ld19vZmZzZXQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9pbiA9IGpoMmJoKGpoX2luKTsKKworCS8qCisJICogVGhlIGJ1ZmZlciByZWFsbHkgc2hvdWxkbid0IGJlIGxvY2tlZDogb25seSB0aGUgY3VycmVudCBjb21taXR0aW5nCisJICogdHJhbnNhY3Rpb24gaXMgYWxsb3dlZCB0byB3cml0ZSBpdCwgc28gbm9ib2R5IGVsc2UgaXMgYWxsb3dlZAorCSAqIHRvIGRvIGFueSBJTy4KKwkgKgorCSAqIGFrcG06IGV4Y2VwdCBpZiB3ZSdyZSBqb3VybmFsbGluZyBkYXRhLCBhbmQgd3JpdGUoKSBvdXRwdXQgaXMKKwkgKiBhbHNvIHBhcnQgb2YgYSBzaGFyZWQgbWFwcGluZywgYW5kIGFub3RoZXIgdGhyZWFkIGhhcworCSAqIGRlY2lkZWQgdG8gbGF1bmNoIGEgd3JpdGVwYWdlKCkgYWdhaW5zdCB0aGlzIGJ1ZmZlci4KKwkgKi8KKwlKX0FTU0VSVF9CSChiaF9pbiwgYnVmZmVyX2piZGRpcnR5KGJoX2luKSk7CisKKwluZXdfYmggPSBhbGxvY19idWZmZXJfaGVhZChHRlBfTk9GU3xfX0dGUF9OT0ZBSUwpOworCisJLyoKKwkgKiBJZiBhIG5ldyB0cmFuc2FjdGlvbiBoYXMgYWxyZWFkeSBkb25lIGEgYnVmZmVyIGNvcHktb3V0LCB0aGVuCisJICogd2UgdXNlIHRoYXQgdmVyc2lvbiBvZiB0aGUgZGF0YSBmb3IgdGhlIGNvbW1pdC4KKwkgKi8KKwlqYmRfbG9ja19iaF9zdGF0ZShiaF9pbik7CityZXBlYXQ6CisJaWYgKGpoX2luLT5iX2Zyb3plbl9kYXRhKSB7CisJCWRvbmVfY29weV9vdXQgPSAxOworCQluZXdfcGFnZSA9IHZpcnRfdG9fcGFnZShqaF9pbi0+Yl9mcm96ZW5fZGF0YSk7CisJCW5ld19vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShqaF9pbi0+Yl9mcm96ZW5fZGF0YSk7CisJfSBlbHNlIHsKKwkJbmV3X3BhZ2UgPSBqaDJiaChqaF9pbiktPmJfcGFnZTsKKwkJbmV3X29mZnNldCA9IG9mZnNldF9pbl9wYWdlKGpoMmJoKGpoX2luKS0+Yl9kYXRhKTsKKwl9CisKKwltYXBwZWRfZGF0YSA9IGttYXBfYXRvbWljKG5ld19wYWdlLCBLTV9VU0VSMCk7CisJLyoKKwkgKiBDaGVjayBmb3IgZXNjYXBpbmcKKwkgKi8KKwlpZiAoKigoX19iZTMyICopKG1hcHBlZF9kYXRhICsgbmV3X29mZnNldCkpID09CisJCQkJY3B1X3RvX2JlMzIoSkZTX01BR0lDX05VTUJFUikpIHsKKwkJbmVlZF9jb3B5X291dCA9IDE7CisJCWRvX2VzY2FwZSA9IDE7CisJfQorCWt1bm1hcF9hdG9taWMobWFwcGVkX2RhdGEsIEtNX1VTRVIwKTsKKworCS8qCisJICogRG8gd2UgbmVlZCB0byBkbyBhIGRhdGEgY29weT8KKwkgKi8KKwlpZiAobmVlZF9jb3B5X291dCAmJiAhZG9uZV9jb3B5X291dCkgeworCQljaGFyICp0bXA7CisKKwkJamJkX3VubG9ja19iaF9zdGF0ZShiaF9pbik7CisJCXRtcCA9IGpiZF9yZXBfa21hbGxvYyhiaF9pbi0+Yl9zaXplLCBHRlBfTk9GUyk7CisJCWpiZF9sb2NrX2JoX3N0YXRlKGJoX2luKTsKKwkJaWYgKGpoX2luLT5iX2Zyb3plbl9kYXRhKSB7CisJCQlrZnJlZSh0bXApOworCQkJZ290byByZXBlYXQ7CisJCX0KKworCQlqaF9pbi0+Yl9mcm96ZW5fZGF0YSA9IHRtcDsKKwkJbWFwcGVkX2RhdGEgPSBrbWFwX2F0b21pYyhuZXdfcGFnZSwgS01fVVNFUjApOworCQltZW1jcHkodG1wLCBtYXBwZWRfZGF0YSArIG5ld19vZmZzZXQsIGpoMmJoKGpoX2luKS0+Yl9zaXplKTsKKwkJa3VubWFwX2F0b21pYyhtYXBwZWRfZGF0YSwgS01fVVNFUjApOworCisJCW5ld19wYWdlID0gdmlydF90b19wYWdlKHRtcCk7CisJCW5ld19vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZSh0bXApOworCQlkb25lX2NvcHlfb3V0ID0gMTsKKwl9CisKKwkvKgorCSAqIERpZCB3ZSBuZWVkIHRvIGRvIGFuIGVzY2FwaW5nPyAgTm93IHdlJ3ZlIGRvbmUgYWxsIHRoZQorCSAqIGNvcHlpbmcsIHdlIGNhbiBmaW5hbGx5IGRvIHNvLgorCSAqLworCWlmIChkb19lc2NhcGUpIHsKKwkJbWFwcGVkX2RhdGEgPSBrbWFwX2F0b21pYyhuZXdfcGFnZSwgS01fVVNFUjApOworCQkqKCh1bnNpZ25lZCBpbnQgKikobWFwcGVkX2RhdGEgKyBuZXdfb2Zmc2V0KSkgPSAwOworCQlrdW5tYXBfYXRvbWljKG1hcHBlZF9kYXRhLCBLTV9VU0VSMCk7CisJfQorCisJLyoga2VlcCBzdWJzZXF1ZW50IGFzc2VydGlvbnMgc2FuZSAqLworCW5ld19iaC0+Yl9zdGF0ZSA9IDA7CisJaW5pdF9idWZmZXIobmV3X2JoLCBOVUxMLCBOVUxMKTsKKwlhdG9taWNfc2V0KCZuZXdfYmgtPmJfY291bnQsIDEpOworCWpiZF91bmxvY2tfYmhfc3RhdGUoYmhfaW4pOworCisJbmV3X2poID0gam91cm5hbF9hZGRfam91cm5hbF9oZWFkKG5ld19iaCk7CS8qIFRoaXMgc2xlZXBzICovCisKKwlzZXRfYmhfcGFnZShuZXdfYmgsIG5ld19wYWdlLCBuZXdfb2Zmc2V0KTsKKwluZXdfamgtPmJfdHJhbnNhY3Rpb24gPSBOVUxMOworCW5ld19iaC0+Yl9zaXplID0gamgyYmgoamhfaW4pLT5iX3NpemU7CisJbmV3X2JoLT5iX2JkZXYgPSB0cmFuc2FjdGlvbi0+dF9qb3VybmFsLT5qX2RldjsKKwluZXdfYmgtPmJfYmxvY2tuciA9IGJsb2NrbnI7CisJc2V0X2J1ZmZlcl9tYXBwZWQobmV3X2JoKTsKKwlzZXRfYnVmZmVyX2RpcnR5KG5ld19iaCk7CisKKwkqamhfb3V0ID0gbmV3X2poOworCisJLyoKKwkgKiBUaGUgdG8tYmUtd3JpdHRlbiBidWZmZXIgbmVlZHMgdG8gZ2V0IG1vdmVkIHRvIHRoZSBpbyBxdWV1ZSwKKwkgKiBhbmQgdGhlIG9yaWdpbmFsIGJ1ZmZlciB3aG9zZSBjb250ZW50cyB3ZSBhcmUgc2hhZG93aW5nIG9yCisJICogY29weWluZyBpcyBtb3ZlZCB0byB0aGUgdHJhbnNhY3Rpb24ncyBzaGFkb3cgcXVldWUuCisJICovCisJSkJVRkZFUl9UUkFDRShqaF9pbiwgImZpbGUgYXMgQkpfU2hhZG93Iik7CisJam91cm5hbF9maWxlX2J1ZmZlcihqaF9pbiwgdHJhbnNhY3Rpb24sIEJKX1NoYWRvdyk7CisJSkJVRkZFUl9UUkFDRShuZXdfamgsICJmaWxlIGFzIEJKX0lPIik7CisJam91cm5hbF9maWxlX2J1ZmZlcihuZXdfamgsIHRyYW5zYWN0aW9uLCBCSl9JTyk7CisKKwlyZXR1cm4gZG9fZXNjYXBlIHwgKGRvbmVfY29weV9vdXQgPDwgMSk7Cit9CisKKy8qCisgKiBBbGxvY2F0aW9uIGNvZGUgZm9yIHRoZSBqb3VybmFsIGZpbGUuICBNYW5hZ2UgdGhlIHNwYWNlIGxlZnQgaW4gdGhlCisgKiBqb3VybmFsLCBzbyB0aGF0IHdlIGNhbiBiZWdpbiBjaGVja3BvaW50aW5nIHdoZW4gYXBwcm9wcmlhdGUuCisgKi8KKworLyoKKyAqIF9fbG9nX3NwYWNlX2xlZnQ6IFJldHVybiB0aGUgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGxlZnQgaW4gdGhlIGpvdXJuYWwuCisgKgorICogQ2FsbGVkIHdpdGggdGhlIGpvdXJuYWwgYWxyZWFkeSBsb2NrZWQuCisgKgorICogQ2FsbGVkIHVuZGVyIGpfc3RhdGVfbG9jaworICovCisKK2ludCBfX2xvZ19zcGFjZV9sZWZ0KGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlpbnQgbGVmdCA9IGpvdXJuYWwtPmpfZnJlZTsKKworCWFzc2VydF9zcGluX2xvY2tlZCgmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCS8qCisJICogQmUgcGVzc2ltaXN0aWMgaGVyZSBhYm91dCB0aGUgbnVtYmVyIG9mIHRob3NlIGZyZWUgYmxvY2tzIHdoaWNoCisJICogbWlnaHQgYmUgcmVxdWlyZWQgZm9yIGxvZyBkZXNjcmlwdG9yIGNvbnRyb2wgYmxvY2tzLgorCSAqLworCisjZGVmaW5lIE1JTl9MT0dfUkVTRVJWRURfQkxPQ0tTIDMyIC8qIEFsbG93IGZvciByb3VuZGluZyBlcnJvcnMgKi8KKworCWxlZnQgLT0gTUlOX0xPR19SRVNFUlZFRF9CTE9DS1M7CisKKwlpZiAobGVmdCA8PSAwKQorCQlyZXR1cm4gMDsKKwlsZWZ0IC09IChsZWZ0ID4+IDMpOworCXJldHVybiBsZWZ0OworfQorCisvKgorICogQ2FsbGVkIHVuZGVyIGpfc3RhdGVfbG9jay4gIFJldHVybnMgdHJ1ZSBpZiBhIHRyYW5zYWN0aW9uIHdhcyBzdGFydGVkLgorICovCitpbnQgX19sb2dfc3RhcnRfY29tbWl0KGpvdXJuYWxfdCAqam91cm5hbCwgdGlkX3QgdGFyZ2V0KQoreworCS8qCisJICogQXJlIHdlIGFscmVhZHkgZG9pbmcgYSByZWNlbnQgZW5vdWdoIGNvbW1pdD8KKwkgKi8KKwlpZiAoIXRpZF9nZXEoam91cm5hbC0+al9jb21taXRfcmVxdWVzdCwgdGFyZ2V0KSkgeworCQkvKgorCQkgKiBXZSB3YW50IGEgbmV3IGNvbW1pdDogT0ssIG1hcmsgdGhlIHJlcXVlc3QgYW5kIHdha3VwIHRoZQorCQkgKiBjb21taXQgdGhyZWFkLiAgV2UgZG8gX25vdF8gZG8gdGhlIGNvbW1pdCBvdXJzZWx2ZXMuCisJCSAqLworCisJCWpvdXJuYWwtPmpfY29tbWl0X3JlcXVlc3QgPSB0YXJnZXQ7CisJCWpiZF9kZWJ1ZygxLCAiSkJEOiByZXF1ZXN0aW5nIGNvbW1pdCAlZC8lZFxuIiwKKwkJCSAgam91cm5hbC0+al9jb21taXRfcmVxdWVzdCwKKwkJCSAgam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UpOworCQl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfY29tbWl0KTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsX3QgKmpvdXJuYWwsIHRpZF90IHRpZCkKK3sKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCXJldCA9IF9fbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsLCB0aWQpOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGb3JjZSBhbmQgd2FpdCB1cG9uIGEgY29tbWl0IGlmIHRoZSBjYWxsaW5nIHByb2Nlc3MgaXMgbm90IHdpdGhpbgorICogdHJhbnNhY3Rpb24uICBUaGlzIGlzIHVzZWQgZm9yIGZvcmNpbmcgb3V0IHVuZG8tcHJvdGVjdGVkIGRhdGEgd2hpY2ggY29udGFpbnMKKyAqIGJpdG1hcHMsIHdoZW4gdGhlIGZzIGlzIHJ1bm5pbmcgb3V0IG9mIHNwYWNlLgorICoKKyAqIFdlIGNhbiBvbmx5IGZvcmNlIHRoZSBydW5uaW5nIHRyYW5zYWN0aW9uIGlmIHdlIGRvbid0IGhhdmUgYW4gYWN0aXZlIGhhbmRsZTsKKyAqIG90aGVyd2lzZSwgd2Ugd2lsbCBkZWFkbG9jay4KKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgYSB0cmFuc2FjdGlvbiB3YXMgc3RhcnRlZC4KKyAqLworaW50IGpvdXJuYWxfZm9yY2VfY29tbWl0X25lc3RlZChqb3VybmFsX3QgKmpvdXJuYWwpCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBOVUxMOworCXRpZF90IHRpZDsKKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlpZiAoam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uICYmICFjdXJyZW50LT5qb3VybmFsX2luZm8pIHsKKwkJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb247CisJCV9fbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsLCB0cmFuc2FjdGlvbi0+dF90aWQpOworCX0gZWxzZSBpZiAoam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKQorCQl0cmFuc2FjdGlvbiA9IGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbjsKKworCWlmICghdHJhbnNhY3Rpb24pIHsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCXJldHVybiAwOwkvKiBOb3RoaW5nIHRvIHJldHJ5ICovCisJfQorCisJdGlkID0gdHJhbnNhY3Rpb24tPnRfdGlkOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWxvZ193YWl0X2NvbW1pdChqb3VybmFsLCB0aWQpOworCXJldHVybiAxOworfQorCisvKgorICogU3RhcnQgYSBjb21taXQgb2YgdGhlIGN1cnJlbnQgcnVubmluZyB0cmFuc2FjdGlvbiAoaWYgYW55KS4gIFJldHVybnMgdHJ1ZQorICogaWYgYSB0cmFuc2FjdGlvbiB3YXMgc3RhcnRlZCwgYW5kIGZpbGxzIGl0cyB0aWQgaW4gYXQgKnB0aWQKKyAqLworaW50IGpvdXJuYWxfc3RhcnRfY29tbWl0KGpvdXJuYWxfdCAqam91cm5hbCwgdGlkX3QgKnB0aWQpCit7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJaWYgKGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbikgeworCQl0aWRfdCB0aWQgPSBqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24tPnRfdGlkOworCisJCXJldCA9IF9fbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsLCB0aWQpOworCQlpZiAocmV0ICYmIHB0aWQpCisJCQkqcHRpZCA9IHRpZDsKKwl9IGVsc2UgaWYgKGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbiAmJiBwdGlkKSB7CisJCS8qCisJCSAqIElmIGV4dDNfd3JpdGVfc3VwZXIoKSByZWNlbnRseSBzdGFydGVkIGEgY29tbWl0LCB0aGVuIHdlCisJCSAqIGhhdmUgdG8gd2FpdCBmb3IgY29tcGxldGlvbiBvZiB0aGF0IHRyYW5zYWN0aW9uCisJCSAqLworCQkqcHRpZCA9IGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbi0+dF90aWQ7CisJCXJldCA9IDE7CisJfQorCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBXYWl0IGZvciBhIHNwZWNpZmllZCBjb21taXQgdG8gY29tcGxldGUuCisgKiBUaGUgY2FsbGVyIG1heSBub3QgaG9sZCB0aGUgam91cm5hbCBsb2NrLgorICovCitpbnQgbG9nX3dhaXRfY29tbWl0KGpvdXJuYWxfdCAqam91cm5hbCwgdGlkX3QgdGlkKQoreworCWludCBlcnIgPSAwOworCisjaWZkZWYgQ09ORklHX0pCRF9ERUJVRworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlpZiAoIXRpZF9nZXEoam91cm5hbC0+al9jb21taXRfcmVxdWVzdCwgdGlkKSkgeworCQlwcmludGsoS0VSTl9FTUVSRworCQkgICAgICAgIiVzOiBlcnJvcjogal9jb21taXRfcmVxdWVzdD0lZCwgdGlkPSVkXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBqb3VybmFsLT5qX2NvbW1pdF9yZXF1ZXN0LCB0aWQpOworCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKyNlbmRpZgorCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwl3aGlsZSAodGlkX2d0KHRpZCwgam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UpKSB7CisJCWpiZF9kZWJ1ZygxLCAiSkJEOiB3YW50ICVkLCBqX2NvbW1pdF9zZXF1ZW5jZT0lZFxuIiwKKwkJCQkgIHRpZCwgam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UpOworCQl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfY29tbWl0KTsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCXdhaXRfZXZlbnQoam91cm5hbC0+al93YWl0X2RvbmVfY29tbWl0LAorCQkJCSF0aWRfZ3QodGlkLCBqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSkpOworCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCisJaWYgKHVubGlrZWx5KGlzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgImpvdXJuYWwgY29tbWl0IEkvTyBlcnJvclxuIik7CisJCWVyciA9IC1FSU87CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBMb2cgYnVmZmVyIGFsbG9jYXRpb24gcm91dGluZXM6CisgKi8KKworaW50IGpvdXJuYWxfbmV4dF9sb2dfYmxvY2soam91cm5hbF90ICpqb3VybmFsLCB1bnNpZ25lZCBsb25nICpyZXRwKQoreworCXVuc2lnbmVkIGxvbmcgYmxvY2tucjsKKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlKX0FTU0VSVChqb3VybmFsLT5qX2ZyZWUgPiAxKTsKKworCWJsb2NrbnIgPSBqb3VybmFsLT5qX2hlYWQ7CisJam91cm5hbC0+al9oZWFkKys7CisJam91cm5hbC0+al9mcmVlLS07CisJaWYgKGpvdXJuYWwtPmpfaGVhZCA9PSBqb3VybmFsLT5qX2xhc3QpCisJCWpvdXJuYWwtPmpfaGVhZCA9IGpvdXJuYWwtPmpfZmlyc3Q7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJcmV0dXJuIGpvdXJuYWxfYm1hcChqb3VybmFsLCBibG9ja25yLCByZXRwKTsKK30KKworLyoKKyAqIENvbnZlcnNpb24gb2YgbG9naWNhbCB0byBwaHlzaWNhbCBibG9jayBudW1iZXJzIGZvciB0aGUgam91cm5hbAorICoKKyAqIE9uIGV4dGVybmFsIGpvdXJuYWxzIHRoZSBqb3VybmFsIGJsb2NrcyBhcmUgaWRlbnRpdHktbWFwcGVkLCBzbworICogdGhpcyBpcyBhIG5vLW9wLiAgSWYgbmVlZGVkLCB3ZSBjYW4gdXNlIGpfYmxrX29mZnNldCAtIGV2ZXJ5dGhpbmcgaXMKKyAqIHJlYWR5LgorICovCitpbnQgam91cm5hbF9ibWFwKGpvdXJuYWxfdCAqam91cm5hbCwgdW5zaWduZWQgbG9uZyBibG9ja25yLCAKKwkJIHVuc2lnbmVkIGxvbmcgKnJldHApCit7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKwlpZiAoam91cm5hbC0+al9pbm9kZSkgeworCQlyZXQgPSBibWFwKGpvdXJuYWwtPmpfaW5vZGUsIGJsb2NrbnIpOworCQlpZiAocmV0KQorCQkJKnJldHAgPSByZXQ7CisJCWVsc2UgeworCQkJY2hhciBiW0JERVZOQU1FX1NJWkVdOworCisJCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IGpvdXJuYWwgYmxvY2sgbm90IGZvdW5kICIKKwkJCQkJImF0IG9mZnNldCAlbHUgb24gJXNcbiIsCisJCQkJX19GVU5DVElPTl9fLAorCQkJCWJsb2NrbnIsCisJCQkJYmRldm5hbWUoam91cm5hbC0+al9kZXYsIGIpKTsKKwkJCWVyciA9IC1FSU87CisJCQlfX2pvdXJuYWxfYWJvcnRfc29mdChqb3VybmFsLCBlcnIpOworCQl9CisJfSBlbHNlIHsKKwkJKnJldHAgPSBibG9ja25yOyAvKiAram91cm5hbC0+al9ibGtfb2Zmc2V0ICovCisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBXZSBwbGF5IGJ1ZmZlcl9oZWFkIGFsaWFzaW5nIHRyaWNrcyB0byB3cml0ZSBkYXRhL21ldGFkYXRhIGJsb2NrcyB0bworICogdGhlIGpvdXJuYWwgd2l0aG91dCBjb3B5aW5nIHRoZWlyIGNvbnRlbnRzLCBidXQgZm9yIGpvdXJuYWwKKyAqIGRlc2NyaXB0b3IgYmxvY2tzIHdlIGRvIG5lZWQgdG8gZ2VuZXJhdGUgYm9uYSBmaWRlIGJ1ZmZlcnMuCisgKgorICogQWZ0ZXIgdGhlIGNhbGxlciBvZiBqb3VybmFsX2dldF9kZXNjcmlwdG9yX2J1ZmZlcigpIGhhcyBmaW5pc2hlZCBtb2RpZnlpbmcKKyAqIHRoZSBidWZmZXIncyBjb250ZW50cyB0aGV5IHJlYWxseSBzaG91bGQgcnVuIGZsdXNoX2RjYWNoZV9wYWdlKGJoLT5iX3BhZ2UpLgorICogQnV0IHdlIGRvbid0IGJvdGhlciBkb2luZyB0aGF0LCBzbyB0aGVyZSB3aWxsIGJlIGNvaGVyZW5jeSBwcm9ibGVtcyB3aXRoCisgKiBtbWFwcyBvZiBibG9ja2RldnMgd2hpY2ggaG9sZCBsaXZlIEpCRC1jb250cm9sbGVkIGZpbGVzeXN0ZW1zLgorICovCitzdHJ1Y3Qgam91cm5hbF9oZWFkICpqb3VybmFsX2dldF9kZXNjcmlwdG9yX2J1ZmZlcihqb3VybmFsX3QgKmpvdXJuYWwpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwl1bnNpZ25lZCBsb25nIGJsb2NrbnI7CisJaW50IGVycjsKKworCWVyciA9IGpvdXJuYWxfbmV4dF9sb2dfYmxvY2soam91cm5hbCwgJmJsb2NrbnIpOworCisJaWYgKGVycikKKwkJcmV0dXJuIE5VTEw7CisKKwliaCA9IF9fZ2V0YmxrKGpvdXJuYWwtPmpfZGV2LCBibG9ja25yLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJbG9ja19idWZmZXIoYmgpOworCW1lbXNldChiaC0+Yl9kYXRhLCAwLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJdW5sb2NrX2J1ZmZlcihiaCk7CisJQlVGRkVSX1RSQUNFKGJoLCAicmV0dXJuIHRoaXMgYnVmZmVyIik7CisJcmV0dXJuIGpvdXJuYWxfYWRkX2pvdXJuYWxfaGVhZChiaCk7Cit9CisKKy8qCisgKiBNYW5hZ2VtZW50IGZvciBqb3VybmFsIGNvbnRyb2wgYmxvY2tzOiBmdW5jdGlvbnMgdG8gY3JlYXRlIGFuZAorICogZGVzdHJveSBqb3VybmFsX3Qgc3RydWN0dXJlcywgYW5kIHRvIGluaXRpYWxpc2UgYW5kIHJlYWQgZXhpc3RpbmcKKyAqIGpvdXJuYWwgYmxvY2tzIGZyb20gZGlzay4gICovCisKKy8qIEZpcnN0OiBjcmVhdGUgYW5kIHNldHVwIGEgam91cm5hbF90IG9iamVjdCBpbiBtZW1vcnkuICBXZSBpbml0aWFsaXNlCisgKiB2ZXJ5IGZldyBmaWVsZHMgeWV0OiB0aGF0IGhhcyB0byB3YWl0IHVudGlsIHdlIGhhdmUgY3JlYXRlZCB0aGUKKyAqIGpvdXJuYWwgc3RydWN0dXJlcyBmcm9tIGZyb20gc2NyYXRjaCwgb3IgbG9hZGVkIHRoZW0gZnJvbSBkaXNrLiAqLworCitzdGF0aWMgam91cm5hbF90ICogam91cm5hbF9pbml0X2NvbW1vbiAodm9pZCkKK3sKKwlqb3VybmFsX3QgKmpvdXJuYWw7CisJaW50IGVycjsKKworCWpvdXJuYWwgPSBqYmRfa21hbGxvYyhzaXplb2YoKmpvdXJuYWwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWpvdXJuYWwpCisJCWdvdG8gZmFpbDsKKwltZW1zZXQoam91cm5hbCwgMCwgc2l6ZW9mKCpqb3VybmFsKSk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZqb3VybmFsLT5qX3dhaXRfdHJhbnNhY3Rpb25fbG9ja2VkKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZqb3VybmFsLT5qX3dhaXRfbG9nc3BhY2UpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmpvdXJuYWwtPmpfd2FpdF9kb25lX2NvbW1pdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmam91cm5hbC0+al93YWl0X2NoZWNrcG9pbnQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmpvdXJuYWwtPmpfd2FpdF9jb21taXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmpvdXJuYWwtPmpfd2FpdF91cGRhdGVzKTsKKwlpbml0X01VVEVYKCZqb3VybmFsLT5qX2JhcnJpZXIpOworCWluaXRfTVVURVgoJmpvdXJuYWwtPmpfY2hlY2twb2ludF9zZW0pOworCXNwaW5fbG9ja19pbml0KCZqb3VybmFsLT5qX3Jldm9rZV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmam91cm5hbC0+al9saXN0X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCisJam91cm5hbC0+al9jb21taXRfaW50ZXJ2YWwgPSAoSFogKiBKQkRfREVGQVVMVF9NQVhfQ09NTUlUX0FHRSk7CisKKwkvKiBUaGUgam91cm5hbCBpcyBtYXJrZWQgZm9yIGVycm9yIHVudGlsIHdlIHN1Y2NlZWQgd2l0aCByZWNvdmVyeSEgKi8KKwlqb3VybmFsLT5qX2ZsYWdzID0gSkZTX0FCT1JUOworCisJLyogU2V0IHVwIGEgZGVmYXVsdC1zaXplZCByZXZva2UgdGFibGUgZm9yIHRoZSBuZXcgbW91bnQuICovCisJZXJyID0gam91cm5hbF9pbml0X3Jldm9rZShqb3VybmFsLCBKT1VSTkFMX1JFVk9LRV9ERUZBVUxUX0hBU0gpOworCWlmIChlcnIpIHsKKwkJa2ZyZWUoam91cm5hbCk7CisJCWdvdG8gZmFpbDsKKwl9CisJcmV0dXJuIGpvdXJuYWw7CitmYWlsOgorCXJldHVybiBOVUxMOworfQorCisvKiBqb3VybmFsX2luaXRfZGV2IGFuZCBqb3VybmFsX2luaXRfaW5vZGU6CisgKgorICogQ3JlYXRlIGEgam91cm5hbCBzdHJ1Y3R1cmUgYXNzaWduZWQgc29tZSBmaXhlZCBzZXQgb2YgZGlzayBibG9ja3MgdG8KKyAqIHRoZSBqb3VybmFsLiAgV2UgZG9uJ3QgYWN0dWFsbHkgdG91Y2ggdGhvc2UgZGlzayBibG9ja3MgeWV0LCBidXQgd2UKKyAqIG5lZWQgdG8gc2V0IHVwIGFsbCBvZiB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiB0byB0ZWxsIHRoZSBqb3VybmFsaW5nCisgKiBzeXN0ZW0gd2hlcmUgdGhlIGpvdXJuYWwgYmxvY2tzIGFyZS4KKyAqCisgKi8KKworLyoqCisgKiAgam91cm5hbF90ICogam91cm5hbF9pbml0X2RldigpIC0gY3JlYXRlcyBhbiBpbml0aWFsaXNlcyBhIGpvdXJuYWwgc3RydWN0dXJlCisgKiAgQGJkZXY6IEJsb2NrIGRldmljZSBvbiB3aGljaCB0byBjcmVhdGUgdGhlIGpvdXJuYWwKKyAqICBAZnNfZGV2OiBEZXZpY2Ugd2hpY2ggaG9sZCBqb3VybmFsbGVkIGZpbGVzeXN0ZW0gZm9yIHRoaXMgam91cm5hbC4KKyAqICBAc3RhcnQ6IEJsb2NrIG5yIFN0YXJ0IG9mIGpvdXJuYWwuCisgKiAgQGxlbjogIExlbmdodCBvZiB0aGUgam91cm5hbCBpbiBibG9ja3MuCisgKiAgQGJsb2Nrc2l6ZTogYmxvY2tzaXplIG9mIGpvdXJuYWxsaW5nIGRldmljZQorICogIEByZXR1cm5zOiBhIG5ld2x5IGNyZWF0ZWQgam91cm5hbF90ICoKKyAqICAKKyAqICBqb3VybmFsX2luaXRfZGV2IGNyZWF0ZXMgYSBqb3VybmFsIHdoaWNoIG1hcHMgYSBmaXhlZCBjb250aWd1b3VzCisgKiAgcmFuZ2Ugb2YgYmxvY2tzIG9uIGFuIGFyYml0cmFyeSBibG9jayBkZXZpY2UuCisgKiAKKyAqLworam91cm5hbF90ICogam91cm5hbF9pbml0X2RldihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJc3RydWN0IGJsb2NrX2RldmljZSAqZnNfZGV2LAorCQkJaW50IHN0YXJ0LCBpbnQgbGVuLCBpbnQgYmxvY2tzaXplKQoreworCWpvdXJuYWxfdCAqam91cm5hbCA9IGpvdXJuYWxfaW5pdF9jb21tb24oKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBuOworCisJaWYgKCFqb3VybmFsKQorCQlyZXR1cm4gTlVMTDsKKworCWpvdXJuYWwtPmpfZGV2ID0gYmRldjsKKwlqb3VybmFsLT5qX2ZzX2RldiA9IGZzX2RldjsKKwlqb3VybmFsLT5qX2Jsa19vZmZzZXQgPSBzdGFydDsKKwlqb3VybmFsLT5qX21heGxlbiA9IGxlbjsKKwlqb3VybmFsLT5qX2Jsb2Nrc2l6ZSA9IGJsb2Nrc2l6ZTsKKworCWJoID0gX19nZXRibGsoam91cm5hbC0+al9kZXYsIHN0YXJ0LCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJSl9BU1NFUlQoYmggIT0gTlVMTCk7CisJam91cm5hbC0+al9zYl9idWZmZXIgPSBiaDsKKwlqb3VybmFsLT5qX3N1cGVyYmxvY2sgPSAoam91cm5hbF9zdXBlcmJsb2NrX3QgKiliaC0+Yl9kYXRhOworCisJLyogam91cm5hbCBkZXNjcmlwdG9yIGNhbiBzdG9yZSB1cCB0byBuIGJsb2NrcyAtYnp6eiAqLworCW4gPSBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSAvIHNpemVvZihqb3VybmFsX2Jsb2NrX3RhZ190KTsKKwlqb3VybmFsLT5qX3didWZzaXplID0gbjsKKwlqb3VybmFsLT5qX3didWYgPSBrbWFsbG9jKG4gKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkKiksIEdGUF9LRVJORUwpOworCWlmICgham91cm5hbC0+al93YnVmKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbnQgYWxsb2NhdGUgYmhzIGZvciBjb21taXQgdGhyZWFkXG4iLAorCQkJX19GVU5DVElPTl9fKTsKKwkJa2ZyZWUoam91cm5hbCk7CisJCWpvdXJuYWwgPSBOVUxMOworCX0KKworCXJldHVybiBqb3VybmFsOworfQorIAorLyoqIAorICogIGpvdXJuYWxfdCAqIGpvdXJuYWxfaW5pdF9pbm9kZSAoKSAtIGNyZWF0ZXMgYSBqb3VybmFsIHdoaWNoIG1hcHMgdG8gYSBpbm9kZS4KKyAqICBAaW5vZGU6IEFuIGlub2RlIHRvIGNyZWF0ZSB0aGUgam91cm5hbCBpbgorICogIAorICogam91cm5hbF9pbml0X2lub2RlIGNyZWF0ZXMgYSBqb3VybmFsIHdoaWNoIG1hcHMgYW4gb24tZGlzayBpbm9kZSBhcworICogdGhlIGpvdXJuYWwuICBUaGUgaW5vZGUgbXVzdCBleGlzdCBhbHJlYWR5LCBtdXN0IHN1cHBvcnQgYm1hcCgpIGFuZAorICogbXVzdCBoYXZlIGFsbCBkYXRhIGJsb2NrcyBwcmVhbGxvY2F0ZWQuCisgKi8KK2pvdXJuYWxfdCAqIGpvdXJuYWxfaW5pdF9pbm9kZSAoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWpvdXJuYWxfdCAqam91cm5hbCA9IGpvdXJuYWxfaW5pdF9jb21tb24oKTsKKwlpbnQgZXJyOworCWludCBuOworCXVuc2lnbmVkIGxvbmcgYmxvY2tucjsKKworCWlmICgham91cm5hbCkKKwkJcmV0dXJuIE5VTEw7CisKKwlqb3VybmFsLT5qX2RldiA9IGpvdXJuYWwtPmpfZnNfZGV2ID0gaW5vZGUtPmlfc2ItPnNfYmRldjsKKwlqb3VybmFsLT5qX2lub2RlID0gaW5vZGU7CisJamJkX2RlYnVnKDEsCisJCSAgImpvdXJuYWwgJXA6IGlub2RlICVzLyVsZCwgc2l6ZSAlTGQsIGJpdHMgJWQsIGJsa3NpemUgJWxkXG4iLAorCQkgIGpvdXJuYWwsIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sIAorCQkgIChsb25nIGxvbmcpIGlub2RlLT5pX3NpemUsCisJCSAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisKKwlqb3VybmFsLT5qX21heGxlbiA9IGlub2RlLT5pX3NpemUgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJam91cm5hbC0+al9ibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisKKwkvKiBqb3VybmFsIGRlc2NyaXB0b3IgY2FuIHN0b3JlIHVwIHRvIG4gYmxvY2tzIC1ienp6ICovCisJbiA9IGpvdXJuYWwtPmpfYmxvY2tzaXplIC8gc2l6ZW9mKGpvdXJuYWxfYmxvY2tfdGFnX3QpOworCWpvdXJuYWwtPmpfd2J1ZnNpemUgPSBuOworCWpvdXJuYWwtPmpfd2J1ZiA9IGttYWxsb2MobiAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFqb3VybmFsLT5qX3didWYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FudCBhbGxvY2F0ZSBiaHMgZm9yIGNvbW1pdCB0aHJlYWRcbiIsCisJCQlfX0ZVTkNUSU9OX18pOworCQlrZnJlZShqb3VybmFsKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZXJyID0gam91cm5hbF9ibWFwKGpvdXJuYWwsIDAsICZibG9ja25yKTsKKwkvKiBJZiB0aGF0IGZhaWxlZCwgZ2l2ZSB1cCAqLworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm5vdCBsb2NhdGUgam91cm5hbCBzdXBlcmJsb2NrXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJa2ZyZWUoam91cm5hbCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWJoID0gX19nZXRibGsoam91cm5hbC0+al9kZXYsIGJsb2NrbnIsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwlKX0FTU0VSVChiaCAhPSBOVUxMKTsKKwlqb3VybmFsLT5qX3NiX2J1ZmZlciA9IGJoOworCWpvdXJuYWwtPmpfc3VwZXJibG9jayA9IChqb3VybmFsX3N1cGVyYmxvY2tfdCAqKWJoLT5iX2RhdGE7CisKKwlyZXR1cm4gam91cm5hbDsKK30KKworLyogCisgKiBJZiB0aGUgam91cm5hbCBpbml0IG9yIGNyZWF0ZSBhYm9ydHMsIHdlIG5lZWQgdG8gbWFyayB0aGUgam91cm5hbAorICogc3VwZXJibG9jayBhcyBiZWluZyBOVUxMIHRvIHByZXZlbnQgdGhlIGpvdXJuYWwgZGVzdHJveSBmcm9tIHdyaXRpbmcKKyAqIGJhY2sgYSBib2d1cyBzdXBlcmJsb2NrLiAKKyAqLworc3RhdGljIHZvaWQgam91cm5hbF9mYWlsX3N1cGVyYmxvY2sgKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gam91cm5hbC0+al9zYl9idWZmZXI7CisJYnJlbHNlKGJoKTsKKwlqb3VybmFsLT5qX3NiX2J1ZmZlciA9IE5VTEw7Cit9CisKKy8qCisgKiBHaXZlbiBhIGpvdXJuYWxfdCBzdHJ1Y3R1cmUsIGluaXRpYWxpc2UgdGhlIHZhcmlvdXMgZmllbGRzIGZvcgorICogc3RhcnR1cCBvZiBhIG5ldyBqb3VybmFsaW5nIHNlc3Npb24uICBXZSB1c2UgdGhpcyBib3RoIHdoZW4gY3JlYXRpbmcKKyAqIGEgam91cm5hbCwgYW5kIGFmdGVyIHJlY292ZXJpbmcgYW4gb2xkIGpvdXJuYWwgdG8gcmVzZXQgaXQgZm9yCisgKiBzdWJzZXF1ZW50IHVzZS4KKyAqLworCitzdGF0aWMgaW50IGpvdXJuYWxfcmVzZXQoam91cm5hbF90ICpqb3VybmFsKQoreworCWpvdXJuYWxfc3VwZXJibG9ja190ICpzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKwl1bnNpZ25lZCBpbnQgZmlyc3QsIGxhc3Q7CisKKwlmaXJzdCA9IGJlMzJfdG9fY3B1KHNiLT5zX2ZpcnN0KTsKKwlsYXN0ID0gYmUzMl90b19jcHUoc2ItPnNfbWF4bGVuKTsKKworCWpvdXJuYWwtPmpfZmlyc3QgPSBmaXJzdDsKKwlqb3VybmFsLT5qX2xhc3QgPSBsYXN0OworCisJam91cm5hbC0+al9oZWFkID0gZmlyc3Q7CisJam91cm5hbC0+al90YWlsID0gZmlyc3Q7CisJam91cm5hbC0+al9mcmVlID0gbGFzdCAtIGZpcnN0OworCisJam91cm5hbC0+al90YWlsX3NlcXVlbmNlID0gam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZTsKKwlqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSA9IGpvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2UgLSAxOworCWpvdXJuYWwtPmpfY29tbWl0X3JlcXVlc3QgPSBqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZTsKKworCWpvdXJuYWwtPmpfbWF4X3RyYW5zYWN0aW9uX2J1ZmZlcnMgPSBqb3VybmFsLT5qX21heGxlbiAvIDQ7CisKKwkvKiBBZGQgdGhlIGR5bmFtaWMgZmllbGRzIGFuZCB3cml0ZSBpdCB0byBkaXNrLiAqLworCWpvdXJuYWxfdXBkYXRlX3N1cGVyYmxvY2soam91cm5hbCwgMSk7CisJam91cm5hbF9zdGFydF90aHJlYWQoam91cm5hbCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKiAKKyAqIGludCBqb3VybmFsX2NyZWF0ZSgpIC0gSW5pdGlhbGlzZSB0aGUgbmV3IGpvdXJuYWwgZmlsZQorICogQGpvdXJuYWw6IEpvdXJuYWwgdG8gY3JlYXRlLiBUaGlzIHN0cnVjdHVyZSBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXNlZAorICogCisgKiBHaXZlbiBhIGpvdXJuYWxfdCBzdHJ1Y3R1cmUgd2hpY2ggdGVsbHMgdXMgd2hpY2ggZGlzayBibG9ja3Mgd2UgY2FuCisgKiB1c2UsIGNyZWF0ZSBhIG5ldyBqb3VybmFsIHN1cGVyYmxvY2sgYW5kIGluaXRpYWxpc2UgYWxsIG9mIHRoZQorICogam91cm5hbCBmaWVsZHMgZnJvbSBzY3JhdGNoLiAgCisgKiovCitpbnQgam91cm5hbF9jcmVhdGUoam91cm5hbF90ICpqb3VybmFsKQoreworCXVuc2lnbmVkIGxvbmcgYmxvY2tucjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWpvdXJuYWxfc3VwZXJibG9ja190ICpzYjsKKwlpbnQgaSwgZXJyOworCisJaWYgKGpvdXJuYWwtPmpfbWF4bGVuIDwgSkZTX01JTl9KT1VSTkFMX0JMT0NLUykgeworCQlwcmludGsgKEtFUk5fRVJSICJKb3VybmFsIGxlbmd0aCAoJWQgYmxvY2tzKSB0b28gc2hvcnQuXG4iLAorCQkJam91cm5hbC0+al9tYXhsZW4pOworCQlqb3VybmFsX2ZhaWxfc3VwZXJibG9jayhqb3VybmFsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGpvdXJuYWwtPmpfaW5vZGUgPT0gTlVMTCkgeworCQkvKgorCQkgKiBXZSBkb24ndCBrbm93IHdoYXQgYmxvY2sgdG8gc3RhcnQgYXQhCisJCSAqLworCQlwcmludGsoS0VSTl9FTUVSRworCQkgICAgICAgIiVzOiBjcmVhdGlvbiBvZiBqb3VybmFsIG9uIGV4dGVybmFsIGRldmljZSFcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlCVUcoKTsKKwl9CisKKwkvKiBaZXJvIG91dCB0aGUgZW50aXJlIGpvdXJuYWwgb24gZGlzay4gIFdlIGNhbm5vdCBhZmZvcmQgdG8KKwkgICBoYXZlIGFueSBibG9ja3Mgb24gZGlzayBiZWdpbm5pbmcgd2l0aCBKRlNfTUFHSUNfTlVNQkVSLiAqLworCWpiZF9kZWJ1ZygxLCAiSkJEOiBaZXJvaW5nIG91dCBqb3VybmFsIGJsb2Nrcy4uLlxuIik7CisJZm9yIChpID0gMDsgaSA8IGpvdXJuYWwtPmpfbWF4bGVuOyBpKyspIHsKKwkJZXJyID0gam91cm5hbF9ibWFwKGpvdXJuYWwsIGksICZibG9ja25yKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWJoID0gX19nZXRibGsoam91cm5hbC0+al9kZXYsIGJsb2NrbnIsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1zZXQgKGJoLT5iX2RhdGEsIDAsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwkJQlVGRkVSX1RSQUNFKGJoLCAibWFya2luZyBkaXJ0eSIpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCUJVRkZFUl9UUkFDRShiaCwgIm1hcmtpbmcgdXB0b2RhdGUiKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCXVubG9ja19idWZmZXIoYmgpOworCQlfX2JyZWxzZShiaCk7CisJfQorCisJc3luY19ibG9ja2Rldihqb3VybmFsLT5qX2Rldik7CisJamJkX2RlYnVnKDEsICJKQkQ6IGpvdXJuYWwgY2xlYXJlZC5cbiIpOworCisJLyogT0ssIGZpbGwgaW4gdGhlIGluaXRpYWwgc3RhdGljIGZpZWxkcyBpbiB0aGUgbmV3IHN1cGVyYmxvY2sgKi8KKwlzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKworCXNiLT5zX2hlYWRlci5oX21hZ2ljCSA9IGNwdV90b19iZTMyKEpGU19NQUdJQ19OVU1CRVIpOworCXNiLT5zX2hlYWRlci5oX2Jsb2NrdHlwZSA9IGNwdV90b19iZTMyKEpGU19TVVBFUkJMT0NLX1YyKTsKKworCXNiLT5zX2Jsb2Nrc2l6ZQk9IGNwdV90b19iZTMyKGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwlzYi0+c19tYXhsZW4JPSBjcHVfdG9fYmUzMihqb3VybmFsLT5qX21heGxlbik7CisJc2ItPnNfZmlyc3QJPSBjcHVfdG9fYmUzMigxKTsKKworCWpvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2UgPSAxOworCisJam91cm5hbC0+al9mbGFncyAmPSB+SkZTX0FCT1JUOworCWpvdXJuYWwtPmpfZm9ybWF0X3ZlcnNpb24gPSAyOworCisJcmV0dXJuIGpvdXJuYWxfcmVzZXQoam91cm5hbCk7Cit9CisKKy8qKiAKKyAqIHZvaWQgam91cm5hbF91cGRhdGVfc3VwZXJibG9jaygpIC0gVXBkYXRlIGpvdXJuYWwgc2Igb24gZGlzay4KKyAqIEBqb3VybmFsOiBUaGUgam91cm5hbCB0byB1cGRhdGUuCisgKiBAd2FpdDogU2V0IHRvICcwJyBpZiB5b3UgZG9uJ3Qgd2FudCB0byB3YWl0IGZvciBJTyBjb21wbGV0aW9uLgorICoKKyAqIFVwZGF0ZSBhIGpvdXJuYWwncyBkeW5hbWljIHN1cGVyYmxvY2sgZmllbGRzIGFuZCB3cml0ZSBpdCB0byBkaXNrLAorICogb3B0aW9uYWxseSB3YWl0aW5nIGZvciB0aGUgSU8gdG8gY29tcGxldGUuCisgKi8KK3ZvaWQgam91cm5hbF91cGRhdGVfc3VwZXJibG9jayhqb3VybmFsX3QgKmpvdXJuYWwsIGludCB3YWl0KQoreworCWpvdXJuYWxfc3VwZXJibG9ja190ICpzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gam91cm5hbC0+al9zYl9idWZmZXI7CisKKwkvKgorCSAqIEFzIGEgc3BlY2lhbCBjYXNlLCBpZiB0aGUgb24tZGlzayBjb3B5IGlzIGFscmVhZHkgbWFya2VkIGFzIG5lZWRpbmcKKwkgKiBubyByZWNvdmVyeSAoc19zdGFydCA9PSAwKSBhbmQgdGhlcmUgYXJlIG5vIG91dHN0YW5kaW5nIHRyYW5zYWN0aW9ucworCSAqIGluIHRoZSBmaWxlc3lzdGVtLCB0aGVuIHdlIGNhbiBzYWZlbHkgZGVmZXIgdGhlIHN1cGVyYmxvY2sgdXBkYXRlCisJICogdW50aWwgdGhlIG5leHQgY29tbWl0IGJ5IHNldHRpbmcgSkZTX0ZMVVNIRUQuICBUaGlzIGF2b2lkcworCSAqIGF0dGVtcHRpbmcgYSB3cml0ZSB0byBhIHBvdGVudGlhbC1yZWFkb25seSBkZXZpY2UuCisJICovCisJaWYgKHNiLT5zX3N0YXJ0ID09IDAgJiYgam91cm5hbC0+al90YWlsX3NlcXVlbmNlID09CisJCQkJam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSkgeworCQlqYmRfZGVidWcoMSwiSkJEOiBTa2lwcGluZyBzdXBlcmJsb2NrIHVwZGF0ZSBvbiByZWNvdmVyZWQgc2IgIgorCQkJIihzdGFydCAlbGQsIHNlcSAlZCwgZXJybm8gJWQpXG4iLAorCQkJam91cm5hbC0+al90YWlsLCBqb3VybmFsLT5qX3RhaWxfc2VxdWVuY2UsIAorCQkJam91cm5hbC0+al9lcnJubyk7CisJCWdvdG8gb3V0OworCX0KKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlqYmRfZGVidWcoMSwiSkJEOiB1cGRhdGluZyBzdXBlcmJsb2NrIChzdGFydCAlbGQsIHNlcSAlZCwgZXJybm8gJWQpXG4iLAorCQkgIGpvdXJuYWwtPmpfdGFpbCwgam91cm5hbC0+al90YWlsX3NlcXVlbmNlLCBqb3VybmFsLT5qX2Vycm5vKTsKKworCXNiLT5zX3NlcXVlbmNlID0gY3B1X3RvX2JlMzIoam91cm5hbC0+al90YWlsX3NlcXVlbmNlKTsKKwlzYi0+c19zdGFydCAgICA9IGNwdV90b19iZTMyKGpvdXJuYWwtPmpfdGFpbCk7CisJc2ItPnNfZXJybm8gICAgPSBjcHVfdG9fYmUzMihqb3VybmFsLT5qX2Vycm5vKTsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCUJVRkZFUl9UUkFDRShiaCwgIm1hcmtpbmcgZGlydHkiKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKHdhaXQpCisJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwllbHNlCisJCWxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmYmgpOworCitvdXQ6CisJLyogSWYgd2UgaGF2ZSBqdXN0IGZsdXNoZWQgdGhlIGxvZyAoYnkgbWFya2luZyBzX3N0YXJ0PT0wKSwgdGhlbgorCSAqIGFueSBmdXR1cmUgY29tbWl0IHdpbGwgaGF2ZSB0byBiZSBjYXJlZnVsIHRvIHVwZGF0ZSB0aGUKKwkgKiBzdXBlcmJsb2NrIGFnYWluIHRvIHJlLXJlY29yZCB0aGUgdHJ1ZSBzdGFydCBvZiB0aGUgbG9nLiAqLworCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWlmIChzYi0+c19zdGFydCkKKwkJam91cm5hbC0+al9mbGFncyAmPSB+SkZTX0ZMVVNIRUQ7CisJZWxzZQorCQlqb3VybmFsLT5qX2ZsYWdzIHw9IEpGU19GTFVTSEVEOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworfQorCisvKgorICogUmVhZCB0aGUgc3VwZXJibG9jayBmb3IgYSBnaXZlbiBqb3VybmFsLCBwZXJmb3JtaW5nIGluaXRpYWwKKyAqIHZhbGlkYXRpb24gb2YgdGhlIGZvcm1hdC4KKyAqLworCitzdGF0aWMgaW50IGpvdXJuYWxfZ2V0X3N1cGVyYmxvY2soam91cm5hbF90ICpqb3VybmFsKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKnNiOworCWludCBlcnIgPSAtRUlPOworCisJYmggPSBqb3VybmFsLT5qX3NiX2J1ZmZlcjsKKworCUpfQVNTRVJUKGJoICE9IE5VTEwpOworCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOworCQl3YWl0X29uX2J1ZmZlcihiaCk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJcHJpbnRrIChLRVJOX0VSUgorCQkJCSJKQkQ6IElPIGVycm9yIHJlYWRpbmcgam91cm5hbCBzdXBlcmJsb2NrXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJc2IgPSBqb3VybmFsLT5qX3N1cGVyYmxvY2s7CisKKwllcnIgPSAtRUlOVkFMOworCisJaWYgKHNiLT5zX2hlYWRlci5oX21hZ2ljICE9IGNwdV90b19iZTMyKEpGU19NQUdJQ19OVU1CRVIpIHx8CisJICAgIHNiLT5zX2Jsb2Nrc2l6ZSAhPSBjcHVfdG9fYmUzMihqb3VybmFsLT5qX2Jsb2Nrc2l6ZSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkJEOiBubyB2YWxpZCBqb3VybmFsIHN1cGVyYmxvY2sgZm91bmRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2goYmUzMl90b19jcHUoc2ItPnNfaGVhZGVyLmhfYmxvY2t0eXBlKSkgeworCWNhc2UgSkZTX1NVUEVSQkxPQ0tfVjE6CisJCWpvdXJuYWwtPmpfZm9ybWF0X3ZlcnNpb24gPSAxOworCQlicmVhazsKKwljYXNlIEpGU19TVVBFUkJMT0NLX1YyOgorCQlqb3VybmFsLT5qX2Zvcm1hdF92ZXJzaW9uID0gMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkJEOiB1bnJlY29nbmlzZWQgc3VwZXJibG9jayBmb3JtYXQgSURcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYmUzMl90b19jcHUoc2ItPnNfbWF4bGVuKSA8IGpvdXJuYWwtPmpfbWF4bGVuKQorCQlqb3VybmFsLT5qX21heGxlbiA9IGJlMzJfdG9fY3B1KHNiLT5zX21heGxlbik7CisJZWxzZSBpZiAoYmUzMl90b19jcHUoc2ItPnNfbWF4bGVuKSA+IGpvdXJuYWwtPmpfbWF4bGVuKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJKQkQ6IGpvdXJuYWwgZmlsZSB0b28gc2hvcnRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0OgorCWpvdXJuYWxfZmFpbF9zdXBlcmJsb2NrKGpvdXJuYWwpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBMb2FkIHRoZSBvbi1kaXNrIGpvdXJuYWwgc3VwZXJibG9jayBhbmQgcmVhZCB0aGUga2V5IGZpZWxkcyBpbnRvIHRoZQorICogam91cm5hbF90LgorICovCisKK3N0YXRpYyBpbnQgbG9hZF9zdXBlcmJsb2NrKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlpbnQgZXJyOworCWpvdXJuYWxfc3VwZXJibG9ja190ICpzYjsKKworCWVyciA9IGpvdXJuYWxfZ2V0X3N1cGVyYmxvY2soam91cm5hbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXNiID0gam91cm5hbC0+al9zdXBlcmJsb2NrOworCisJam91cm5hbC0+al90YWlsX3NlcXVlbmNlID0gYmUzMl90b19jcHUoc2ItPnNfc2VxdWVuY2UpOworCWpvdXJuYWwtPmpfdGFpbCA9IGJlMzJfdG9fY3B1KHNiLT5zX3N0YXJ0KTsKKwlqb3VybmFsLT5qX2ZpcnN0ID0gYmUzMl90b19jcHUoc2ItPnNfZmlyc3QpOworCWpvdXJuYWwtPmpfbGFzdCA9IGJlMzJfdG9fY3B1KHNiLT5zX21heGxlbik7CisJam91cm5hbC0+al9lcnJubyA9IGJlMzJfdG9fY3B1KHNiLT5zX2Vycm5vKTsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICogaW50IGpvdXJuYWxfbG9hZCgpIC0gUmVhZCBqb3VybmFsIGZyb20gZGlzay4KKyAqIEBqb3VybmFsOiBKb3VybmFsIHRvIGFjdCBvbi4KKyAqIAorICogR2l2ZW4gYSBqb3VybmFsX3Qgc3RydWN0dXJlIHdoaWNoIHRlbGxzIHVzIHdoaWNoIGRpc2sgYmxvY2tzIGNvbnRhaW4KKyAqIGEgam91cm5hbCwgcmVhZCB0aGUgam91cm5hbCBmcm9tIGRpc2sgdG8gaW5pdGlhbGlzZSB0aGUgaW4tbWVtb3J5CisgKiBzdHJ1Y3R1cmVzLgorICovCitpbnQgam91cm5hbF9sb2FkKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gbG9hZF9zdXBlcmJsb2NrKGpvdXJuYWwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBJZiB0aGlzIGlzIGEgVjIgc3VwZXJibG9jaywgdGhlbiB3ZSBoYXZlIHRvIGNoZWNrIHRoZQorCSAqIGZlYXR1cmVzIGZsYWdzIG9uIGl0LiAqLworCisJaWYgKGpvdXJuYWwtPmpfZm9ybWF0X3ZlcnNpb24gPj0gMikgeworCQlqb3VybmFsX3N1cGVyYmxvY2tfdCAqc2IgPSBqb3VybmFsLT5qX3N1cGVyYmxvY2s7CisKKwkJaWYgKChzYi0+c19mZWF0dXJlX3JvX2NvbXBhdCAmCisJCSAgICAgfmNwdV90b19iZTMyKEpGU19LTk9XTl9ST0NPTVBBVF9GRUFUVVJFUykpIHx8CisJCSAgICAoc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCAmCisJCSAgICAgfmNwdV90b19iZTMyKEpGU19LTk9XTl9JTkNPTVBBVF9GRUFUVVJFUykpKSB7CisJCQlwcmludGsgKEtFUk5fV0FSTklORworCQkJCSJKQkQ6IFVucmVjb2duaXNlZCBmZWF0dXJlcyBvbiBqb3VybmFsXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJLyogTGV0IHRoZSByZWNvdmVyeSBjb2RlIGNoZWNrIHdoZXRoZXIgaXQgbmVlZHMgdG8gcmVjb3ZlciBhbnkKKwkgKiBkYXRhIGZyb20gdGhlIGpvdXJuYWwuICovCisJaWYgKGpvdXJuYWxfcmVjb3Zlcihqb3VybmFsKSkKKwkJZ290byByZWNvdmVyeV9lcnJvcjsKKworCS8qIE9LLCB3ZSd2ZSBmaW5pc2hlZCB3aXRoIHRoZSBkeW5hbWljIGpvdXJuYWwgYml0czoKKwkgKiByZWluaXRpYWxpc2UgdGhlIGR5bmFtaWMgY29udGVudHMgb2YgdGhlIHN1cGVyYmxvY2sgaW4gbWVtb3J5CisJICogYW5kIHJlc2V0IHRoZW0gb24gZGlzay4gKi8KKwlpZiAoam91cm5hbF9yZXNldChqb3VybmFsKSkKKwkJZ290byByZWNvdmVyeV9lcnJvcjsKKworCWpvdXJuYWwtPmpfZmxhZ3MgJj0gfkpGU19BQk9SVDsKKwlqb3VybmFsLT5qX2ZsYWdzIHw9IEpGU19MT0FERUQ7CisJcmV0dXJuIDA7CisKK3JlY292ZXJ5X2Vycm9yOgorCXByaW50ayAoS0VSTl9XQVJOSU5HICJKQkQ6IHJlY292ZXJ5IGZhaWxlZFxuIik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qKgorICogdm9pZCBqb3VybmFsX2Rlc3Ryb3koKSAtIFJlbGVhc2UgYSBqb3VybmFsX3Qgc3RydWN0dXJlLgorICogQGpvdXJuYWw6IEpvdXJuYWwgdG8gYWN0IG9uLgorICoKKyAqIFJlbGVhc2UgYSBqb3VybmFsX3Qgc3RydWN0dXJlIG9uY2UgaXQgaXMgbm8gbG9uZ2VyIGluIHVzZSBieSB0aGUKKyAqIGpvdXJuYWxlZCBvYmplY3QuCisgKi8KK3ZvaWQgam91cm5hbF9kZXN0cm95KGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwkvKiBXYWl0IGZvciB0aGUgY29tbWl0IHRocmVhZCB0byB3YWtlIHVwIGFuZCBkaWUuICovCisJam91cm5hbF9raWxsX3RocmVhZChqb3VybmFsKTsKKworCS8qIEZvcmNlIGEgZmluYWwgbG9nIGNvbW1pdCAqLworCWlmIChqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24pCisJCWpvdXJuYWxfY29tbWl0X3RyYW5zYWN0aW9uKGpvdXJuYWwpOworCisJLyogRm9yY2UgYW55IG9sZCB0cmFuc2FjdGlvbnMgdG8gZGlzayAqLworCisJLyogVG90YWxseSBhbmFsIGxvY2tpbmcgaGVyZS4uLiAqLworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCXdoaWxlIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zICE9IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJbG9nX2RvX2NoZWNrcG9pbnQoam91cm5hbCk7CisJCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCX0KKworCUpfQVNTRVJUKGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbiA9PSBOVUxMKTsKKwlKX0FTU0VSVChqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24gPT0gTlVMTCk7CisJSl9BU1NFUlQoam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyA9PSBOVUxMKTsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCisJLyogV2UgY2FuIG5vdyBtYXJrIHRoZSBqb3VybmFsIGFzIGVtcHR5LiAqLworCWpvdXJuYWwtPmpfdGFpbCA9IDA7CisJam91cm5hbC0+al90YWlsX3NlcXVlbmNlID0gKytqb3VybmFsLT5qX3RyYW5zYWN0aW9uX3NlcXVlbmNlOworCWlmIChqb3VybmFsLT5qX3NiX2J1ZmZlcikgeworCQlqb3VybmFsX3VwZGF0ZV9zdXBlcmJsb2NrKGpvdXJuYWwsIDEpOworCQlicmVsc2Uoam91cm5hbC0+al9zYl9idWZmZXIpOworCX0KKworCWlmIChqb3VybmFsLT5qX2lub2RlKQorCQlpcHV0KGpvdXJuYWwtPmpfaW5vZGUpOworCWlmIChqb3VybmFsLT5qX3Jldm9rZSkKKwkJam91cm5hbF9kZXN0cm95X3Jldm9rZShqb3VybmFsKTsKKwlrZnJlZShqb3VybmFsLT5qX3didWYpOworCWtmcmVlKGpvdXJuYWwpOworfQorCisKKy8qKgorICppbnQgam91cm5hbF9jaGVja191c2VkX2ZlYXR1cmVzICgpIC0gQ2hlY2sgaWYgZmVhdHVyZXMgc3BlY2lmaWVkIGFyZSB1c2VkLgorICogQGpvdXJuYWw6IEpvdXJuYWwgdG8gY2hlY2suCisgKiBAY29tcGF0OiBiaXRtYXNrIG9mIGNvbXBhdGlibGUgZmVhdHVyZXMKKyAqIEBybzogYml0bWFzayBvZiBmZWF0dXJlcyB0aGF0IGZvcmNlIHJlYWQtb25seSBtb3VudAorICogQGluY29tcGF0OiBiaXRtYXNrIG9mIGluY29tcGF0aWJsZSBmZWF0dXJlcworICogCisgKiBDaGVjayB3aGV0aGVyIHRoZSBqb3VybmFsIHVzZXMgYWxsIG9mIGEgZ2l2ZW4gc2V0IG9mCisgKiBmZWF0dXJlcy4gIFJldHVybiB0cnVlIChub24temVybykgaWYgaXQgZG9lcy4gCisgKiovCisKK2ludCBqb3VybmFsX2NoZWNrX3VzZWRfZmVhdHVyZXMgKGpvdXJuYWxfdCAqam91cm5hbCwgdW5zaWduZWQgbG9uZyBjb21wYXQsCisJCQkJIHVuc2lnbmVkIGxvbmcgcm8sIHVuc2lnbmVkIGxvbmcgaW5jb21wYXQpCit7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKnNiOworCisJaWYgKCFjb21wYXQgJiYgIXJvICYmICFpbmNvbXBhdCkKKwkJcmV0dXJuIDE7CisJaWYgKGpvdXJuYWwtPmpfZm9ybWF0X3ZlcnNpb24gPT0gMSkKKwkJcmV0dXJuIDA7CisKKwlzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKworCWlmICgoKGJlMzJfdG9fY3B1KHNiLT5zX2ZlYXR1cmVfY29tcGF0KSAmIGNvbXBhdCkgPT0gY29tcGF0KSAmJgorCSAgICAoKGJlMzJfdG9fY3B1KHNiLT5zX2ZlYXR1cmVfcm9fY29tcGF0KSAmIHJvKSA9PSBybykgJiYKKwkgICAgKChiZTMyX3RvX2NwdShzYi0+c19mZWF0dXJlX2luY29tcGF0KSAmIGluY29tcGF0KSA9PSBpbmNvbXBhdCkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW50IGpvdXJuYWxfY2hlY2tfYXZhaWxhYmxlX2ZlYXR1cmVzKCkgLSBDaGVjayBmZWF0dXJlIHNldCBpbiBqb3VybmFsbGluZyBsYXllcgorICogQGpvdXJuYWw6IEpvdXJuYWwgdG8gY2hlY2suCisgKiBAY29tcGF0OiBiaXRtYXNrIG9mIGNvbXBhdGlibGUgZmVhdHVyZXMKKyAqIEBybzogYml0bWFzayBvZiBmZWF0dXJlcyB0aGF0IGZvcmNlIHJlYWQtb25seSBtb3VudAorICogQGluY29tcGF0OiBiaXRtYXNrIG9mIGluY29tcGF0aWJsZSBmZWF0dXJlcworICogCisgKiBDaGVjayB3aGV0aGVyIHRoZSBqb3VybmFsaW5nIGNvZGUgc3VwcG9ydHMgdGhlIHVzZSBvZgorICogYWxsIG9mIGEgZ2l2ZW4gc2V0IG9mIGZlYXR1cmVzIG9uIHRoaXMgam91cm5hbC4gIFJldHVybiB0cnVlCisgKiAobm9uLXplcm8pIGlmIGl0IGNhbi4gKi8KKworaW50IGpvdXJuYWxfY2hlY2tfYXZhaWxhYmxlX2ZlYXR1cmVzIChqb3VybmFsX3QgKmpvdXJuYWwsIHVuc2lnbmVkIGxvbmcgY29tcGF0LAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcm8sIHVuc2lnbmVkIGxvbmcgaW5jb21wYXQpCit7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKnNiOworCisJaWYgKCFjb21wYXQgJiYgIXJvICYmICFpbmNvbXBhdCkKKwkJcmV0dXJuIDE7CisKKwlzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKworCS8qIFdlIGNhbiBzdXBwb3J0IGFueSBrbm93biByZXF1ZXN0ZWQgZmVhdHVyZXMgaWZmIHRoZQorCSAqIHN1cGVyYmxvY2sgaXMgaW4gdmVyc2lvbiAyLiAgT3RoZXJ3aXNlIHdlIGZhaWwgdG8gc3VwcG9ydCBhbnkKKwkgKiBleHRlbmRlZCBzYiBmZWF0dXJlcy4gKi8KKworCWlmIChqb3VybmFsLT5qX2Zvcm1hdF92ZXJzaW9uICE9IDIpCisJCXJldHVybiAwOworCisJaWYgKChjb21wYXQgICAmIEpGU19LTk9XTl9DT01QQVRfRkVBVFVSRVMpID09IGNvbXBhdCAmJgorCSAgICAocm8gICAgICAgJiBKRlNfS05PV05fUk9DT01QQVRfRkVBVFVSRVMpID09IHJvICYmCisJICAgIChpbmNvbXBhdCAmIEpGU19LTk9XTl9JTkNPTVBBVF9GRUFUVVJFUykgPT0gaW5jb21wYXQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW50IGpvdXJuYWxfc2V0X2ZlYXR1cmVzICgpIC0gTWFyayBhIGdpdmVuIGpvdXJuYWwgZmVhdHVyZSBpbiB0aGUgc3VwZXJibG9jaworICogQGpvdXJuYWw6IEpvdXJuYWwgdG8gYWN0IG9uLgorICogQGNvbXBhdDogYml0bWFzayBvZiBjb21wYXRpYmxlIGZlYXR1cmVzCisgKiBAcm86IGJpdG1hc2sgb2YgZmVhdHVyZXMgdGhhdCBmb3JjZSByZWFkLW9ubHkgbW91bnQKKyAqIEBpbmNvbXBhdDogYml0bWFzayBvZiBpbmNvbXBhdGlibGUgZmVhdHVyZXMKKyAqCisgKiBNYXJrIGEgZ2l2ZW4gam91cm5hbCBmZWF0dXJlIGFzIHByZXNlbnQgb24gdGhlCisgKiBzdXBlcmJsb2NrLiAgUmV0dXJucyB0cnVlIGlmIHRoZSByZXF1ZXN0ZWQgZmVhdHVyZXMgY291bGQgYmUgc2V0LiAKKyAqCisgKi8KKworaW50IGpvdXJuYWxfc2V0X2ZlYXR1cmVzIChqb3VybmFsX3QgKmpvdXJuYWwsIHVuc2lnbmVkIGxvbmcgY29tcGF0LAorCQkJICB1bnNpZ25lZCBsb25nIHJvLCB1bnNpZ25lZCBsb25nIGluY29tcGF0KQoreworCWpvdXJuYWxfc3VwZXJibG9ja190ICpzYjsKKworCWlmIChqb3VybmFsX2NoZWNrX3VzZWRfZmVhdHVyZXMoam91cm5hbCwgY29tcGF0LCBybywgaW5jb21wYXQpKQorCQlyZXR1cm4gMTsKKworCWlmICgham91cm5hbF9jaGVja19hdmFpbGFibGVfZmVhdHVyZXMoam91cm5hbCwgY29tcGF0LCBybywgaW5jb21wYXQpKQorCQlyZXR1cm4gMDsKKworCWpiZF9kZWJ1ZygxLCAiU2V0dGluZyBuZXcgZmVhdHVyZXMgMHglbHgvMHglbHgvMHglbHhcbiIsCisJCSAgY29tcGF0LCBybywgaW5jb21wYXQpOworCisJc2IgPSBqb3VybmFsLT5qX3N1cGVyYmxvY2s7CisKKwlzYi0+c19mZWF0dXJlX2NvbXBhdCAgICB8PSBjcHVfdG9fYmUzMihjb21wYXQpOworCXNiLT5zX2ZlYXR1cmVfcm9fY29tcGF0IHw9IGNwdV90b19iZTMyKHJvKTsKKwlzYi0+c19mZWF0dXJlX2luY29tcGF0ICB8PSBjcHVfdG9fYmUzMihpbmNvbXBhdCk7CisKKwlyZXR1cm4gMTsKK30KKworCisvKioKKyAqIGludCBqb3VybmFsX3VwZGF0ZV9mb3JtYXQgKCkgLSBVcGRhdGUgb24tZGlzayBqb3VybmFsIHN0cnVjdHVyZS4KKyAqIEBqb3VybmFsOiBKb3VybmFsIHRvIGFjdCBvbi4KKyAqCisgKiBHaXZlbiBhbiBpbml0aWFsaXNlZCBidXQgdW5sb2FkZWQgam91cm5hbCBzdHJ1Y3QsIHBva2UgYWJvdXQgaW4gdGhlCisgKiBvbi1kaXNrIHN0cnVjdHVyZSB0byB1cGRhdGUgaXQgdG8gdGhlIG1vc3QgcmVjZW50IHN1cHBvcnRlZCB2ZXJzaW9uLgorICovCitpbnQgam91cm5hbF91cGRhdGVfZm9ybWF0IChqb3VybmFsX3QgKmpvdXJuYWwpCit7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKnNiOworCWludCBlcnI7CisKKwllcnIgPSBqb3VybmFsX2dldF9zdXBlcmJsb2NrKGpvdXJuYWwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKworCXN3aXRjaCAoYmUzMl90b19jcHUoc2ItPnNfaGVhZGVyLmhfYmxvY2t0eXBlKSkgeworCWNhc2UgSkZTX1NVUEVSQkxPQ0tfVjI6CisJCXJldHVybiAwOworCWNhc2UgSkZTX1NVUEVSQkxPQ0tfVjE6CisJCXJldHVybiBqb3VybmFsX2NvbnZlcnRfc3VwZXJibG9ja192MShqb3VybmFsLCBzYik7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGpvdXJuYWxfY29udmVydF9zdXBlcmJsb2NrX3YxKGpvdXJuYWxfdCAqam91cm5hbCwKKwkJCQkJIGpvdXJuYWxfc3VwZXJibG9ja190ICpzYikKK3sKKwlpbnQgb2Zmc2V0LCBibG9ja3NpemU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJIkpCRDogQ29udmVydGluZyBzdXBlcmJsb2NrIGZyb20gdmVyc2lvbiAxIHRvIDIuXG4iKTsKKworCS8qIFByZS1pbml0aWFsaXNlIG5ldyBmaWVsZHMgdG8gemVybyAqLworCW9mZnNldCA9ICgoY2hhciAqKSAmKHNiLT5zX2ZlYXR1cmVfY29tcGF0KSkgLSAoKGNoYXIgKikgc2IpOworCWJsb2Nrc2l6ZSA9IGJlMzJfdG9fY3B1KHNiLT5zX2Jsb2Nrc2l6ZSk7CisJbWVtc2V0KCZzYi0+c19mZWF0dXJlX2NvbXBhdCwgMCwgYmxvY2tzaXplLW9mZnNldCk7CisKKwlzYi0+c19ucl91c2VycyA9IGNwdV90b19iZTMyKDEpOworCXNiLT5zX2hlYWRlci5oX2Jsb2NrdHlwZSA9IGNwdV90b19iZTMyKEpGU19TVVBFUkJMT0NLX1YyKTsKKwlqb3VybmFsLT5qX2Zvcm1hdF92ZXJzaW9uID0gMjsKKworCWJoID0gam91cm5hbC0+al9zYl9idWZmZXI7CisJQlVGRkVSX1RSQUNFKGJoLCAibWFya2luZyBkaXJ0eSIpOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBpbnQgam91cm5hbF9mbHVzaCAoKSAtIEZsdXNoIGpvdXJuYWwKKyAqIEBqb3VybmFsOiBKb3VybmFsIHRvIGFjdCBvbi4KKyAqIAorICogRmx1c2ggYWxsIGRhdGEgZm9yIGEgZ2l2ZW4gam91cm5hbCB0byBkaXNrIGFuZCBlbXB0eSB0aGUgam91cm5hbC4KKyAqIEZpbGVzeXN0ZW1zIGNhbiB1c2UgdGhpcyB3aGVuIHJlbW91bnRpbmcgcmVhZG9ubHkgdG8gZW5zdXJlIHRoYXQKKyAqIHJlY292ZXJ5IGRvZXMgbm90IG5lZWQgdG8gaGFwcGVuIG9uIHJlbW91bnQuCisgKi8KKworaW50IGpvdXJuYWxfZmx1c2goam91cm5hbF90ICpqb3VybmFsKQoreworCWludCBlcnIgPSAwOworCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIG9sZF90YWlsOworCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCisJLyogRm9yY2UgZXZlcnl0aGluZyBidWZmZXJlZCB0byB0aGUgbG9nLi4uICovCisJaWYgKGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbikgeworCQl0cmFuc2FjdGlvbiA9IGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbjsKKwkJX19sb2dfc3RhcnRfY29tbWl0KGpvdXJuYWwsIHRyYW5zYWN0aW9uLT50X3RpZCk7CisJfSBlbHNlIGlmIChqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24pCisJCXRyYW5zYWN0aW9uID0gam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uOworCisJLyogV2FpdCBmb3IgdGhlIGxvZyBjb21taXQgdG8gY29tcGxldGUuLi4gKi8KKwlpZiAodHJhbnNhY3Rpb24pIHsKKwkJdGlkX3QgdGlkID0gdHJhbnNhY3Rpb24tPnRfdGlkOworCisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQlsb2dfd2FpdF9jb21taXQoam91cm5hbCwgdGlkKTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwl9CisKKwkvKiAuLi5hbmQgZmx1c2ggZXZlcnl0aGluZyBpbiB0aGUgbG9nIG91dCB0byBkaXNrLiAqLworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCXdoaWxlICghZXJyICYmIGpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgIT0gTlVMTCkgeworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQllcnIgPSBsb2dfZG9fY2hlY2twb2ludChqb3VybmFsKTsKKwkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJY2xlYW51cF9qb3VybmFsX3RhaWwoam91cm5hbCk7CisKKwkvKiBGaW5hbGx5LCBtYXJrIHRoZSBqb3VybmFsIGFzIHJlYWxseSBuZWVkaW5nIG5vIHJlY292ZXJ5LgorCSAqIFRoaXMgc2V0cyBzX3N0YXJ0PT0wIGluIHRoZSB1bmRlcmx5aW5nIHN1cGVyYmxvY2ssIHdoaWNoIGlzCisJICogdGhlIG1hZ2ljIGNvZGUgZm9yIGEgZnVsbHktcmVjb3ZlcmVkIHN1cGVyYmxvY2suICBBbnkgZnV0dXJlCisJICogY29tbWl0cyBvZiBkYXRhIHRvIHRoZSBqb3VybmFsIHdpbGwgcmVzdG9yZSB0aGUgY3VycmVudAorCSAqIHNfc3RhcnQgdmFsdWUuICovCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCW9sZF90YWlsID0gam91cm5hbC0+al90YWlsOworCWpvdXJuYWwtPmpfdGFpbCA9IDA7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJam91cm5hbF91cGRhdGVfc3VwZXJibG9jayhqb3VybmFsLCAxKTsKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJam91cm5hbC0+al90YWlsID0gb2xkX3RhaWw7CisKKwlKX0FTU0VSVCgham91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKTsKKwlKX0FTU0VSVCgham91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKTsKKwlKX0FTU0VSVCgham91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyk7CisJSl9BU1NFUlQoam91cm5hbC0+al9oZWFkID09IGpvdXJuYWwtPmpfdGFpbCk7CisJSl9BU1NFUlQoam91cm5hbC0+al90YWlsX3NlcXVlbmNlID09IGpvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2UpOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogaW50IGpvdXJuYWxfd2lwZSgpIC0gV2lwZSBqb3VybmFsIGNvbnRlbnRzCisgKiBAam91cm5hbDogSm91cm5hbCB0byBhY3Qgb24uCisgKiBAd3JpdGU6IGZsYWcgKHNlZSBiZWxvdykKKyAqIAorICogV2lwZSBvdXQgYWxsIG9mIHRoZSBjb250ZW50cyBvZiBhIGpvdXJuYWwsIHNhZmVseS4gIFRoaXMgd2lsbCBwcm9kdWNlCisgKiBhIHdhcm5pbmcgaWYgdGhlIGpvdXJuYWwgY29udGFpbnMgYW55IHZhbGlkIHJlY292ZXJ5IGluZm9ybWF0aW9uLgorICogTXVzdCBiZSBjYWxsZWQgYmV0d2VlbiBqb3VybmFsX2luaXRfKigpIGFuZCBqb3VybmFsX2xvYWQoKS4KKyAqCisgKiBJZiAnd3JpdGUnIGlzIG5vbi16ZXJvLCB0aGVuIHdlIHdpcGUgb3V0IHRoZSBqb3VybmFsIG9uIGRpc2s7IG90aGVyd2lzZQorICogd2UgbWVyZWx5IHN1cHByZXNzIHJlY292ZXJ5LgorICovCisKK2ludCBqb3VybmFsX3dpcGUoam91cm5hbF90ICpqb3VybmFsLCBpbnQgd3JpdGUpCit7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKnNiOworCWludCBlcnIgPSAwOworCisJSl9BU1NFUlQgKCEoam91cm5hbC0+al9mbGFncyAmIEpGU19MT0FERUQpKTsKKworCWVyciA9IGxvYWRfc3VwZXJibG9jayhqb3VybmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJc2IgPSBqb3VybmFsLT5qX3N1cGVyYmxvY2s7CisKKwlpZiAoIWpvdXJuYWwtPmpfdGFpbCkKKwkJZ290byBub19yZWNvdmVyeTsKKworCXByaW50ayAoS0VSTl9XQVJOSU5HICJKQkQ6ICVzIHJlY292ZXJ5IGluZm9ybWF0aW9uIG9uIGpvdXJuYWxcbiIsCisJCXdyaXRlID8gIkNsZWFyaW5nIiA6ICJJZ25vcmluZyIpOworCisJZXJyID0gam91cm5hbF9za2lwX3JlY292ZXJ5KGpvdXJuYWwpOworCWlmICh3cml0ZSkKKwkJam91cm5hbF91cGRhdGVfc3VwZXJibG9jayhqb3VybmFsLCAxKTsKKworIG5vX3JlY292ZXJ5OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBqb3VybmFsX2Rldl9uYW1lOiBmb3JtYXQgYSBjaGFyYWN0ZXIgc3RyaW5nIHRvIGRlc2NyaWJlIG9uIHdoYXQKKyAqIGRldmljZSB0aGlzIGpvdXJuYWwgaXMgcHJlc2VudC4KKyAqLworCitjb25zdCBjaGFyICpqb3VybmFsX2Rldl9uYW1lKGpvdXJuYWxfdCAqam91cm5hbCwgY2hhciAqYnVmZmVyKQoreworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisKKwlpZiAoam91cm5hbC0+al9pbm9kZSkKKwkJYmRldiA9IGpvdXJuYWwtPmpfaW5vZGUtPmlfc2ItPnNfYmRldjsKKwllbHNlCisJCWJkZXYgPSBqb3VybmFsLT5qX2RldjsKKworCXJldHVybiBiZGV2bmFtZShiZGV2LCBidWZmZXIpOworfQorCisvKgorICogSm91cm5hbCBhYm9ydCBoYXMgdmVyeSBzcGVjaWZpYyBzZW1hbnRpY3MsIHdoaWNoIHdlIGRlc2NyaWJlCisgKiBmb3Igam91cm5hbCBhYm9ydC4gCisgKgorICogVHdvIGludGVybmFsIGZ1bmN0aW9uLCB3aGljaCBwcm92aWRlIGFib3J0IHRvIHRlIGpiZCBsYXllcgorICogaXRzZWxmIGFyZSBoZXJlLgorICovCisKKy8qCisgKiBRdWljayB2ZXJzaW9uIGZvciBpbnRlcm5hbCBqb3VybmFsIHVzZSAoZG9lc24ndCBsb2NrIHRoZSBqb3VybmFsKS4KKyAqIEFib3J0cyBoYXJkIC0tLSB3ZSBtYXJrIHRoZSBhYm9ydCBhcyBvY2N1cnJlZCwgYnV0IGRvIF9ub3RoaW5nXyBlbHNlLAorICogYW5kIGRvbid0IGF0dGVtcHQgdG8gbWFrZSBhbnkgb3RoZXIgam91cm5hbCB1cGRhdGVzLgorICovCit2b2lkIF9fam91cm5hbF9hYm9ydF9oYXJkKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbjsKKwljaGFyIGJbQkRFVk5BTUVfU0laRV07CisKKwlpZiAoam91cm5hbC0+al9mbGFncyAmIEpGU19BQk9SVCkKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fRVJSICJBYm9ydGluZyBqb3VybmFsIG9uIGRldmljZSAlcy5cbiIsCisJCWpvdXJuYWxfZGV2X25hbWUoam91cm5hbCwgYikpOworCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWpvdXJuYWwtPmpfZmxhZ3MgfD0gSkZTX0FCT1JUOworCXRyYW5zYWN0aW9uID0gam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uOworCWlmICh0cmFuc2FjdGlvbikKKwkJX19sb2dfc3RhcnRfY29tbWl0KGpvdXJuYWwsIHRyYW5zYWN0aW9uLT50X3RpZCk7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7Cit9CisKKy8qIFNvZnQgYWJvcnQ6IHJlY29yZCB0aGUgYWJvcnQgZXJyb3Igc3RhdHVzIGluIHRoZSBqb3VybmFsIHN1cGVyYmxvY2ssCisgKiBidXQgZG9uJ3QgZG8gYW55IG90aGVyIElPLiAqLwordm9pZCBfX2pvdXJuYWxfYWJvcnRfc29mdCAoam91cm5hbF90ICpqb3VybmFsLCBpbnQgZXJybm8pCit7CisJaWYgKGpvdXJuYWwtPmpfZmxhZ3MgJiBKRlNfQUJPUlQpCisJCXJldHVybjsKKworCWlmICgham91cm5hbC0+al9lcnJubykKKwkJam91cm5hbC0+al9lcnJubyA9IGVycm5vOworCisJX19qb3VybmFsX2Fib3J0X2hhcmQoam91cm5hbCk7CisKKwlpZiAoZXJybm8pCisJCWpvdXJuYWxfdXBkYXRlX3N1cGVyYmxvY2soam91cm5hbCwgMSk7Cit9CisKKy8qKgorICogdm9pZCBqb3VybmFsX2Fib3J0ICgpIC0gU2h1dGRvd24gdGhlIGpvdXJuYWwgaW1tZWRpYXRlbHkuCisgKiBAam91cm5hbDogdGhlIGpvdXJuYWwgdG8gc2h1dGRvd24uCisgKiBAZXJybm86ICAgYW4gZXJyb3IgbnVtYmVyIHRvIHJlY29yZCBpbiB0aGUgam91cm5hbCBpbmRpY2F0aW5nCisgKiAgICAgICAgICAgdGhlIHJlYXNvbiBmb3IgdGhlIHNodXRkb3duLgorICoKKyAqIFBlcmZvcm0gYSBjb21wbGV0ZSwgaW1tZWRpYXRlIHNodXRkb3duIG9mIHRoZSBFTlRJUkUKKyAqIGpvdXJuYWwgKG5vdCBvZiBhIHNpbmdsZSB0cmFuc2FjdGlvbikuICBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUKKyAqIHVuZG9uZSB3aXRob3V0IGNsb3NpbmcgYW5kIHJlb3BlbmluZyB0aGUgam91cm5hbC4KKyAqICAgICAgICAgICAKKyAqIFRoZSBqb3VybmFsX2Fib3J0IGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIHN1cHBvcnQgaGlnaGVyIGxldmVsIGVycm9yCisgKiByZWNvdmVyeSBtZWNoYW5pc21zIHN1Y2ggYXMgdGhlIGV4dDIvZXh0MyByZW1vdW50LXJlYWRvbmx5IGVycm9yCisgKiBtb2RlLgorICoKKyAqIEpvdXJuYWwgYWJvcnQgaGFzIHZlcnkgc3BlY2lmaWMgc2VtYW50aWNzLiAgQW55IGV4aXN0aW5nIGRpcnR5LAorICogdW5qb3VybmFsZWQgYnVmZmVycyBpbiB0aGUgbWFpbiBmaWxlc3lzdGVtIHdpbGwgc3RpbGwgYmUgd3JpdHRlbiB0bworICogZGlzayBieSBiZGZsdXNoLCBidXQgdGhlIGpvdXJuYWxpbmcgbWVjaGFuaXNtIHdpbGwgYmUgc3VzcGVuZGVkCisgKiBpbW1lZGlhdGVseSBhbmQgbm8gZnVydGhlciB0cmFuc2FjdGlvbiBjb21taXRzIHdpbGwgYmUgaG9ub3VyZWQuCisgKgorICogQW55IGRpcnR5LCBqb3VybmFsZWQgYnVmZmVycyB3aWxsIGJlIHdyaXR0ZW4gYmFjayB0byBkaXNrIHdpdGhvdXQKKyAqIGhpdHRpbmcgdGhlIGpvdXJuYWwuICBBdG9taWNpdHkgY2Fubm90IGJlIGd1YXJhbnRlZWQgb24gYW4gYWJvcnRlZAorICogZmlsZXN5c3RlbSwgYnV0IHdlIF9kb18gYXR0ZW1wdCB0byBsZWF2ZSBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUKKyAqIGJlaGluZCBmb3IgZnNjayB0byB1c2UgZm9yIGNsZWFudXAuCisgKgorICogQW55IGF0dGVtcHQgdG8gZ2V0IGEgbmV3IHRyYW5zYWN0aW9uIGhhbmRsZSBvbiBhIGpvdXJuYWwgd2hpY2ggaXMgaW4KKyAqIEFCT1JUIHN0YXRlIHdpbGwganVzdCByZXN1bHQgaW4gYW4gLUVST0ZTIGVycm9yIHJldHVybi4gIEEKKyAqIGpvdXJuYWxfc3RvcCBvbiBhbiBleGlzdGluZyBoYW5kbGUgd2lsbCByZXR1cm4gLUVJTyBpZiB3ZSBoYXZlCisgKiBlbnRlcmVkIGFib3J0IHN0YXRlIGR1cmluZyB0aGUgdXBkYXRlLgorICoKKyAqIFJlY3Vyc2l2ZSB0cmFuc2FjdGlvbnMgYXJlIG5vdCBkaXN0dXJiZWQgYnkgam91cm5hbCBhYm9ydCB1bnRpbCB0aGUKKyAqIGZpbmFsIGpvdXJuYWxfc3RvcCwgd2hpY2ggd2lsbCByZWNlaXZlIHRoZSAtRUlPIGVycm9yLgorICoKKyAqIEZpbmFsbHksIHRoZSBqb3VybmFsX2Fib3J0IGNhbGwgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3VwcGx5IGFuIGVycm5vCisgKiB3aGljaCB3aWxsIGJlIHJlY29yZGVkIChpZiBwb3NzaWJsZSkgaW4gdGhlIGpvdXJuYWwgc3VwZXJibG9jay4gIFRoaXMKKyAqIGFsbG93cyBhIGNsaWVudCB0byByZWNvcmQgZmFpbHVyZSBjb25kaXRpb25zIGluIHRoZSBtaWRkbGUgb2YgYQorICogdHJhbnNhY3Rpb24gd2l0aG91dCBoYXZpbmcgdG8gY29tcGxldGUgdGhlIHRyYW5zYWN0aW9uIHRvIHJlY29yZCB0aGUKKyAqIGZhaWx1cmUgdG8gZGlzay4gIGV4dDNfZXJyb3IsIGZvciBleGFtcGxlLCBub3cgdXNlcyB0aGlzCisgKiBmdW5jdGlvbmFsaXR5LgorICoKKyAqIEVycm9ycyB3aGljaCBvcmlnaW5hdGUgZnJvbSB3aXRoaW4gdGhlIGpvdXJuYWxpbmcgbGF5ZXIgd2lsbCBOT1QKKyAqIHN1cHBseSBhbiBlcnJubzsgYSBudWxsIGVycm5vIGltcGxpZXMgdGhhdCBhYnNvbHV0ZWx5IG5vIGZ1cnRoZXIKKyAqIHdyaXRlcyBhcmUgZG9uZSB0byB0aGUgam91cm5hbCAodW5sZXNzIHRoZXJlIGFyZSBhbnkgYWxyZWFkeSBpbgorICogcHJvZ3Jlc3MpLgorICogCisgKi8KKwordm9pZCBqb3VybmFsX2Fib3J0KGpvdXJuYWxfdCAqam91cm5hbCwgaW50IGVycm5vKQoreworCV9fam91cm5hbF9hYm9ydF9zb2Z0KGpvdXJuYWwsIGVycm5vKTsKK30KKworLyoqIAorICogaW50IGpvdXJuYWxfZXJybm8gKCkgLSByZXR1cm5zIHRoZSBqb3VybmFsJ3MgZXJyb3Igc3RhdGUuCisgKiBAam91cm5hbDogam91cm5hbCB0byBleGFtaW5lLgorICoKKyAqIFRoaXMgaXMgdGhlIGVycm5vIG51bWJldCBzZXQgd2l0aCBqb3VybmFsX2Fib3J0KCksIHRoZSBsYXN0CisgKiB0aW1lIHRoZSBqb3VybmFsIHdhcyBtb3VudGVkIC0gaWYgdGhlIGpvdXJuYWwgd2FzIHN0b3BwZWQKKyAqIHdpdGhvdXQgY2FsbGluZyBhYm9ydCB0aGlzIHdpbGwgYmUgMC4KKyAqCisgKiBJZiB0aGUgam91cm5hbCBoYXMgYmVlbiBhYm9ydGVkIG9uIHRoaXMgbW91bnQgdGltZSAtRVJPRlMgd2lsbAorICogYmUgcmV0dXJuZWQuCisgKi8KK2ludCBqb3VybmFsX2Vycm5vKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWlmIChqb3VybmFsLT5qX2ZsYWdzICYgSkZTX0FCT1JUKQorCQllcnIgPSAtRVJPRlM7CisJZWxzZQorCQllcnIgPSBqb3VybmFsLT5qX2Vycm5vOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCXJldHVybiBlcnI7Cit9CisKKy8qKiAKKyAqIGludCBqb3VybmFsX2NsZWFyX2VyciAoKSAtIGNsZWFycyB0aGUgam91cm5hbCdzIGVycm9yIHN0YXRlCisgKiBAam91cm5hbDogam91cm5hbCB0byBhY3Qgb24uCisgKgorICogQW4gZXJyb3IgbXVzdCBiZSBjbGVhcmVkIG9yIEFja2VkIHRvIHRha2UgYSBGUyBvdXQgb2YgcmVhZG9ubHkKKyAqIG1vZGUuCisgKi8KK2ludCBqb3VybmFsX2NsZWFyX2Vycihqb3VybmFsX3QgKmpvdXJuYWwpCit7CisJaW50IGVyciA9IDA7CisKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJaWYgKGpvdXJuYWwtPmpfZmxhZ3MgJiBKRlNfQUJPUlQpCisJCWVyciA9IC1FUk9GUzsKKwllbHNlCisJCWpvdXJuYWwtPmpfZXJybm8gPSAwOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCXJldHVybiBlcnI7Cit9CisKKy8qKiAKKyAqIHZvaWQgam91cm5hbF9hY2tfZXJyKCkgLSBBY2sgam91cm5hbCBlcnIuCisgKiBAam91cm5hbDogam91cm5hbCB0byBhY3Qgb24uCisgKgorICogQW4gZXJyb3IgbXVzdCBiZSBjbGVhcmVkIG9yIEFja2VkIHRvIHRha2UgYSBGUyBvdXQgb2YgcmVhZG9ubHkKKyAqIG1vZGUuCisgKi8KK3ZvaWQgam91cm5hbF9hY2tfZXJyKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJaWYgKGpvdXJuYWwtPmpfZXJybm8pCisJCWpvdXJuYWwtPmpfZmxhZ3MgfD0gSkZTX0FDS19FUlI7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7Cit9CisKK2ludCBqb3VybmFsX2Jsb2Nrc19wZXJfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiAxIDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworfQorCisvKgorICogU2ltcGxlIHN1cHBvcnQgZm9yIHJldHJ5aW5nIG1lbW9yeSBhbGxvY2F0aW9ucy4gIEludHJvZHVjZWQgdG8gaGVscCB0bworICogZGVidWcgZGlmZmVyZW50IFZNIGRlYWRsb2NrIGF2b2lkYW5jZSBzdHJhdGVnaWVzLiAKKyAqLwordm9pZCAqIF9famJkX2ttYWxsb2MgKGNvbnN0IGNoYXIgKndoZXJlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzLCBpbnQgcmV0cnkpCit7CisJcmV0dXJuIGttYWxsb2Moc2l6ZSwgZmxhZ3MgfCAocmV0cnkgPyBfX0dGUF9OT0ZBSUwgOiAwKSk7Cit9CisKKy8qCisgKiBKb3VybmFsX2hlYWQgc3RvcmFnZSBtYW5hZ2VtZW50CisgKi8KK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmpvdXJuYWxfaGVhZF9jYWNoZTsKKyNpZmRlZiBDT05GSUdfSkJEX0RFQlVHCitzdGF0aWMgYXRvbWljX3QgbnJfam91cm5hbF9oZWFkcyA9IEFUT01JQ19JTklUKDApOworI2VuZGlmCisKK3N0YXRpYyBpbnQgam91cm5hbF9pbml0X2pvdXJuYWxfaGVhZF9jYWNoZSh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlKX0FTU0VSVChqb3VybmFsX2hlYWRfY2FjaGUgPT0gMCk7CisJam91cm5hbF9oZWFkX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImpvdXJuYWxfaGVhZCIsCisJCQkJc2l6ZW9mKHN0cnVjdCBqb3VybmFsX2hlYWQpLAorCQkJCTAsCQkvKiBvZmZzZXQgKi8KKwkJCQkwLAkJLyogZmxhZ3MgKi8KKwkJCQlOVUxMLAkJLyogY3RvciAqLworCQkJCU5VTEwpOwkJLyogZHRvciAqLworCXJldHZhbCA9IDA7CisJaWYgKGpvdXJuYWxfaGVhZF9jYWNoZSA9PSAwKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCXByaW50ayhLRVJOX0VNRVJHICJKQkQ6IG5vIG1lbW9yeSBmb3Igam91cm5hbF9oZWFkIGNhY2hlXG4iKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgam91cm5hbF9kZXN0cm95X2pvdXJuYWxfaGVhZF9jYWNoZSh2b2lkKQoreworCUpfQVNTRVJUKGpvdXJuYWxfaGVhZF9jYWNoZSAhPSBOVUxMKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koam91cm5hbF9oZWFkX2NhY2hlKTsKKwlqb3VybmFsX2hlYWRfY2FjaGUgPSBOVUxMOworfQorCisvKgorICogam91cm5hbF9oZWFkIHNwbGljaW5nIGFuZCBkaWNpbmcKKyAqLworc3RhdGljIHN0cnVjdCBqb3VybmFsX2hlYWQgKmpvdXJuYWxfYWxsb2Nfam91cm5hbF9oZWFkKHZvaWQpCit7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqcmV0OworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3Rfd2FybmluZzsKKworI2lmZGVmIENPTkZJR19KQkRfREVCVUcKKwlhdG9taWNfaW5jKCZucl9qb3VybmFsX2hlYWRzKTsKKyNlbmRpZgorCXJldCA9IGttZW1fY2FjaGVfYWxsb2Moam91cm5hbF9oZWFkX2NhY2hlLCBHRlBfTk9GUyk7CisJaWYgKHJldCA9PSAwKSB7CisJCWpiZF9kZWJ1ZygxLCAib3V0IG9mIG1lbW9yeSBmb3Igam91cm5hbF9oZWFkXG4iKTsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgbGFzdF93YXJuaW5nICsgNSpIWikpIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiRU5PTUVNIGluICVzLCByZXRyeWluZy5cbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJCWxhc3Rfd2FybmluZyA9IGppZmZpZXM7CisJCX0KKwkJd2hpbGUgKHJldCA9PSAwKSB7CisJCQl5aWVsZCgpOworCQkJcmV0ID0ga21lbV9jYWNoZV9hbGxvYyhqb3VybmFsX2hlYWRfY2FjaGUsIEdGUF9OT0ZTKTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBqb3VybmFsX2ZyZWVfam91cm5hbF9oZWFkKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworI2lmZGVmIENPTkZJR19KQkRfREVCVUcKKwlhdG9taWNfZGVjKCZucl9qb3VybmFsX2hlYWRzKTsKKwltZW1zZXQoamgsIDB4NWIsIHNpemVvZigqamgpKTsKKyNlbmRpZgorCWttZW1fY2FjaGVfZnJlZShqb3VybmFsX2hlYWRfY2FjaGUsIGpoKTsKK30KKworLyoKKyAqIEEgam91cm5hbF9oZWFkIGlzIGF0dGFjaGVkIHRvIGEgYnVmZmVyX2hlYWQgd2hlbmV2ZXIgSkJEIGhhcyBhbgorICogaW50ZXJlc3QgaW4gdGhlIGJ1ZmZlci4KKyAqCisgKiBXaGVuZXZlciBhIGJ1ZmZlciBoYXMgYW4gYXR0YWNoZWQgam91cm5hbF9oZWFkLCBpdHMgLT5iX3N0YXRlOkJIX0pCRCBiaXQKKyAqIGlzIHNldC4gIFRoaXMgYml0IGlzIHRlc3RlZCBpbiBjb3JlIGtlcm5lbCBjb2RlIHdoZXJlIHdlIG5lZWQgdG8gdGFrZQorICogSkJELXNwZWNpZmljIGFjdGlvbnMuICBUZXN0aW5nIHRoZSB6ZXJvbmVzcyBvZiAtPmJfcHJpdmF0ZSBpcyBub3QgcmVsaWFibGUKKyAqIHRoZXJlLgorICoKKyAqIFdoZW4gYSBidWZmZXIgaGFzIGl0cyBCSF9KQkQgYml0IHNldCwgaXRzIC0+Yl9jb3VudCBpcyBlbGV2YXRlZCBieSBvbmUuCisgKgorICogV2hlbiBhIGJ1ZmZlciBoYXMgaXRzIEJIX0pCRCBiaXQgc2V0IGl0IGlzIGltbXVuZSBmcm9tIGJlaW5nIHJlbGVhc2VkIGJ5CisgKiBjb3JlIGtlcm5lbCBjb2RlLCBtYWlubHkgdmlhIC0+Yl9jb3VudC4KKyAqCisgKiBBIGpvdXJuYWxfaGVhZCBtYXkgYmUgZGV0YWNoZWQgZnJvbSBpdHMgYnVmZmVyX2hlYWQgd2hlbiB0aGUgam91cm5hbF9oZWFkJ3MKKyAqIGJfdHJhbnNhY3Rpb24sIGJfY3BfdHJhbnNhY3Rpb24gYW5kIGJfbmV4dF90cmFuc2FjdGlvbiBwb2ludGVycyBhcmUgTlVMTC4KKyAqIFZhcmlvdXMgcGxhY2VzIGluIEpCRCBjYWxsIGpvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZCgpIHRvIGluZGljYXRlIHRoYXQgdGhlCisgKiBqb3VybmFsX2hlYWQgY2FuIGJlIGRyb3BwZWQgaWYgbmVlZGVkLgorICoKKyAqIFZhcmlvdXMgcGxhY2VzIGluIHRoZSBrZXJuZWwgd2FudCB0byBhdHRhY2ggYSBqb3VybmFsX2hlYWQgdG8gYSBidWZmZXJfaGVhZAorICogX2JlZm9yZV8gYXR0YWNoaW5nIHRoZSBqb3VybmFsX2hlYWQgdG8gYSB0cmFuc2FjdGlvbi4gIFRvIHByb3RlY3QgdGhlCisgKiBqb3VybmFsX2hlYWQgaW4gdGhpcyBzaXR1YXRpb24sIGpvdXJuYWxfYWRkX2pvdXJuYWxfaGVhZCBlbGV2YXRlcyB0aGUKKyAqIGpvdXJuYWxfaGVhZCdzIGJfamNvdW50IHJlZmNvdW50IGJ5IG9uZS4gIFRoZSBjYWxsZXIgbXVzdCBjYWxsCisgKiBqb3VybmFsX3B1dF9qb3VybmFsX2hlYWQoKSB0byB1bmRvIHRoaXMuCisgKgorICogU28gdGhlIHR5cGljYWwgdXNhZ2Ugd291bGQgYmU6CisgKgorICoJKEF0dGFjaCBhIGpvdXJuYWxfaGVhZCBpZiBuZWVkZWQuICBJbmNyZW1lbnRzIGJfamNvdW50KQorICoJc3RydWN0IGpvdXJuYWxfaGVhZCAqamggPSBqb3VybmFsX2FkZF9qb3VybmFsX2hlYWQoYmgpOworICoJLi4uCisgKglqaC0+Yl90cmFuc2FjdGlvbiA9IHh4eDsKKyAqCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CisgKgorICogTm93LCB0aGUgam91cm5hbF9oZWFkJ3MgYl9qY291bnQgaXMgemVybywgYnV0IGl0IGlzIHNhZmUgZnJvbSBiZWluZyByZWxlYXNlZAorICogYmVjYXVzZSBpdCBoYXMgYSBub24temVybyBiX3RyYW5zYWN0aW9uLgorICovCisKKy8qCisgKiBHaXZlIGEgYnVmZmVyX2hlYWQgYSBqb3VybmFsX2hlYWQuCisgKgorICogRG9lc24ndCBuZWVkIHRoZSBqb3VybmFsIGxvY2suCisgKiBNYXkgc2xlZXAuCisgKi8KK3N0cnVjdCBqb3VybmFsX2hlYWQgKmpvdXJuYWxfYWRkX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoOworCXN0cnVjdCBqb3VybmFsX2hlYWQgKm5ld19qaCA9IE5VTEw7CisKK3JlcGVhdDoKKwlpZiAoIWJ1ZmZlcl9qYmQoYmgpKSB7CisJCW5ld19qaCA9IGpvdXJuYWxfYWxsb2Nfam91cm5hbF9oZWFkKCk7CisJCW1lbXNldChuZXdfamgsIDAsIHNpemVvZigqbmV3X2poKSk7CisJfQorCisJamJkX2xvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKKwlpZiAoYnVmZmVyX2piZChiaCkpIHsKKwkJamggPSBiaDJqaChiaCk7CisJfSBlbHNlIHsKKwkJSl9BU1NFUlRfQkgoYmgsCisJCQkoYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSA+IDApIHx8CisJCQkoYmgtPmJfcGFnZSAmJiBiaC0+Yl9wYWdlLT5tYXBwaW5nKSk7CisKKwkJaWYgKCFuZXdfamgpIHsKKwkJCWpiZF91bmxvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKKwkJCWdvdG8gcmVwZWF0OworCQl9CisKKwkJamggPSBuZXdfamg7CisJCW5ld19qaCA9IE5VTEw7CQkvKiBXZSBjb25zdW1lZCBpdCAqLworCQlzZXRfYnVmZmVyX2piZChiaCk7CisJCWJoLT5iX3ByaXZhdGUgPSBqaDsKKwkJamgtPmJfYmggPSBiaDsKKwkJZ2V0X2JoKGJoKTsKKwkJQlVGRkVSX1RSQUNFKGJoLCAiYWRkZWQgam91cm5hbF9oZWFkIik7CisJfQorCWpoLT5iX2pjb3VudCsrOworCWpiZF91bmxvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKKwlpZiAobmV3X2poKQorCQlqb3VybmFsX2ZyZWVfam91cm5hbF9oZWFkKG5ld19qaCk7CisJcmV0dXJuIGJoLT5iX3ByaXZhdGU7Cit9CisKKy8qCisgKiBHcmFiIGEgcmVmIGFnYWluc3QgdGhpcyBidWZmZXJfaGVhZCdzIGpvdXJuYWxfaGVhZC4gIElmIGl0IGVuZGVkIHVwIG5vdAorICogaGF2aW5nIGEgam91cm5hbF9oZWFkLCByZXR1cm4gTlVMTAorICovCitzdHJ1Y3Qgam91cm5hbF9oZWFkICpqb3VybmFsX2dyYWJfam91cm5hbF9oZWFkKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqamggPSBOVUxMOworCisJamJkX2xvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKKwlpZiAoYnVmZmVyX2piZChiaCkpIHsKKwkJamggPSBiaDJqaChiaCk7CisJCWpoLT5iX2pjb3VudCsrOworCX0KKwlqYmRfdW5sb2NrX2JoX2pvdXJuYWxfaGVhZChiaCk7CisJcmV0dXJuIGpoOworfQorCitzdGF0aWMgdm9pZCBfX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoID0gYmgyamgoYmgpOworCisJSl9BU1NFUlRfSkgoamgsIGpoLT5iX2pjb3VudCA+PSAwKTsKKworCWdldF9iaChiaCk7CisJaWYgKGpoLT5iX2pjb3VudCA9PSAwKSB7CisJCWlmIChqaC0+Yl90cmFuc2FjdGlvbiA9PSBOVUxMICYmCisJCQkJamgtPmJfbmV4dF90cmFuc2FjdGlvbiA9PSBOVUxMICYmCisJCQkJamgtPmJfY3BfdHJhbnNhY3Rpb24gPT0gTlVMTCkgeworCQkJSl9BU1NFUlRfSkgoamgsIGpoLT5iX2psaXN0ID09IEJKX05vbmUpOworCQkJSl9BU1NFUlRfQkgoYmgsIGJ1ZmZlcl9qYmQoYmgpKTsKKwkJCUpfQVNTRVJUX0JIKGJoLCBqaDJiaChqaCkgPT0gYmgpOworCQkJQlVGRkVSX1RSQUNFKGJoLCAicmVtb3ZlIGpvdXJuYWxfaGVhZCIpOworCQkJaWYgKGpoLT5iX2Zyb3plbl9kYXRhKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZyZWVpbmcgIgorCQkJCQkJImJfZnJvemVuX2RhdGFcbiIsCisJCQkJCQlfX0ZVTkNUSU9OX18pOworCQkJCWtmcmVlKGpoLT5iX2Zyb3plbl9kYXRhKTsKKwkJCX0KKwkJCWlmIChqaC0+Yl9jb21taXR0ZWRfZGF0YSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmcmVlaW5nICIKKwkJCQkJCSJiX2NvbW1pdHRlZF9kYXRhXG4iLAorCQkJCQkJX19GVU5DVElPTl9fKTsKKwkJCQlrZnJlZShqaC0+Yl9jb21taXR0ZWRfZGF0YSk7CisJCQl9CisJCQliaC0+Yl9wcml2YXRlID0gTlVMTDsKKwkJCWpoLT5iX2JoID0gTlVMTDsJLyogZGVidWcsIHJlYWxseSAqLworCQkJY2xlYXJfYnVmZmVyX2piZChiaCk7CisJCQlfX2JyZWxzZShiaCk7CisJCQlqb3VybmFsX2ZyZWVfam91cm5hbF9oZWFkKGpoKTsKKwkJfSBlbHNlIHsKKwkJCUJVRkZFUl9UUkFDRShiaCwgImpvdXJuYWxfaGVhZCB3YXMgbG9ja2VkIik7CisJCX0KKwl9Cit9CisKKy8qCisgKiBqb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoKTogaWYgdGhlIGJ1ZmZlciBpc24ndCBhdHRhY2hlZCB0byBhIHRyYW5zYWN0aW9uCisgKiBhbmQgaGFzIGEgemVybyBiX2pjb3VudCB0aGVuIHJlbW92ZSBhbmQgcmVsZWFzZSBpdHMgam91cm5hbF9oZWFkLiAgIElmIHdlIGRpZAorICogc2VlIHRoYXQgdGhlIGJ1ZmZlciBpcyBub3QgdXNlZCBieSBhbnkgdHJhbnNhY3Rpb24gd2UgYWxzbyAibG9naWNhbGx5IgorICogZGVjcmVtZW50IC0+Yl9jb3VudC4KKyAqCisgKiBXZSBpbiBmYWN0IHRha2UgYW4gYWRkaXRpb25hbCBpbmNyZW1lbnQgb24gLT5iX2NvdW50IGFzIGEgY29udmVuaWVuY2UsCisgKiBiZWNhdXNlIHRoZSBjYWxsZXIgdXN1YWxseSB3YW50cyB0byBkbyBhZGRpdGlvbmFsIHRoaW5ncyB3aXRoIHRoZSBiaAorICogYWZ0ZXIgY2FsbGluZyBoZXJlLgorICogVGhlIGNhbGxlciBvZiBqb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoKSAqbXVzdCogcnVuIF9fYnJlbHNlKGJoKSBhdCBzb21lCisgKiB0aW1lLiAgT25jZSB0aGUgY2FsbGVyIGhhcyBydW4gX19icmVsc2UoKSwgdGhlIGJ1ZmZlciBpcyBlbGlnaWJsZSBmb3IKKyAqIHJlYXBpbmcgYnkgdHJ5X3RvX2ZyZWVfYnVmZmVycygpLgorICovCit2b2lkIGpvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWpiZF9sb2NrX2JoX2pvdXJuYWxfaGVhZChiaCk7CisJX19qb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOworCWpiZF91bmxvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKK30KKworLyoKKyAqIERyb3AgYSByZWZlcmVuY2Ugb24gdGhlIHBhc3NlZCBqb3VybmFsX2hlYWQuICBJZiBpdCBmZWxsIHRvIHplcm8gdGhlbiB0cnkgdG8KKyAqIHJlbGVhc2UgdGhlIGpvdXJuYWxfaGVhZCBmcm9tIHRoZSBidWZmZXJfaGVhZC4KKyAqLwordm9pZCBqb3VybmFsX3B1dF9qb3VybmFsX2hlYWQoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKKworCWpiZF9sb2NrX2JoX2pvdXJuYWxfaGVhZChiaCk7CisJSl9BU1NFUlRfSkgoamgsIGpoLT5iX2pjb3VudCA+IDApOworCS0tamgtPmJfamNvdW50OworCWlmICghamgtPmJfamNvdW50ICYmICFqaC0+Yl90cmFuc2FjdGlvbikgeworCQlfX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7CisJCV9fYnJlbHNlKGJoKTsKKwl9CisJamJkX3VubG9ja19iaF9qb3VybmFsX2hlYWQoYmgpOworfQorCisvKgorICogL3Byb2MgdHVuYWJsZXMKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX0pCRF9ERUJVRykKK2ludCBqb3VybmFsX2VuYWJsZV9kZWJ1ZzsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9lbmFibGVfZGVidWcpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19KQkRfREVCVUcpICYmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfamJkX2RlYnVnOworCitpbnQgcmVhZF9qYmRfZGVidWcoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IHJldDsKKworCXJldCA9IHNwcmludGYocGFnZSArIG9mZiwgIiVkXG4iLCBqb3VybmFsX2VuYWJsZV9kZWJ1Zyk7CisJKmVvZiA9IDE7CisJcmV0dXJuIHJldDsKK30KKworaW50IHdyaXRlX2piZF9kZWJ1ZyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJY2hhciBidWZbMzJdOworCisJaWYgKGNvdW50ID4gQVJSQVlfU0laRShidWYpIC0gMSkKKwkJY291bnQgPSBBUlJBWV9TSVpFKGJ1ZikgLSAxOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlidWZbQVJSQVlfU0laRShidWYpIC0gMV0gPSAnXDAnOworCWpvdXJuYWxfZW5hYmxlX2RlYnVnID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIEpCRF9QUk9DX05BTUUgInN5cy9mcy9qYmQtZGVidWciCisKK3N0YXRpYyB2b2lkIF9faW5pdCBjcmVhdGVfamJkX3Byb2NfZW50cnkodm9pZCkKK3sKKwlwcm9jX2piZF9kZWJ1ZyA9IGNyZWF0ZV9wcm9jX2VudHJ5KEpCRF9QUk9DX05BTUUsIDA2NDQsIE5VTEwpOworCWlmIChwcm9jX2piZF9kZWJ1ZykgeworCQkvKiBXaHkgaXMgdGhpcyBzbyBoYXJkPyAqLworCQlwcm9jX2piZF9kZWJ1Zy0+cmVhZF9wcm9jID0gcmVhZF9qYmRfZGVidWc7CisJCXByb2NfamJkX2RlYnVnLT53cml0ZV9wcm9jID0gd3JpdGVfamJkX2RlYnVnOworCX0KK30KKworc3RhdGljIHZvaWQgX19leGl0IHJlbW92ZV9qYmRfcHJvY19lbnRyeSh2b2lkKQoreworCWlmIChwcm9jX2piZF9kZWJ1ZykKKwkJcmVtb3ZlX3Byb2NfZW50cnkoSkJEX1BST0NfTkFNRSwgTlVMTCk7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgY3JlYXRlX2piZF9wcm9jX2VudHJ5KCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIHJlbW92ZV9qYmRfcHJvY19lbnRyeSgpIGRvIHt9IHdoaWxlICgwKQorCisjZW5kaWYKKwora21lbV9jYWNoZV90ICpqYmRfaGFuZGxlX2NhY2hlOworCitzdGF0aWMgaW50IF9faW5pdCBqb3VybmFsX2luaXRfaGFuZGxlX2NhY2hlKHZvaWQpCit7CisJamJkX2hhbmRsZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJqb3VybmFsX2hhbmRsZSIsCisJCQkJc2l6ZW9mKGhhbmRsZV90KSwKKwkJCQkwLAkJLyogb2Zmc2V0ICovCisJCQkJMCwJCS8qIGZsYWdzICovCisJCQkJTlVMTCwJCS8qIGN0b3IgKi8KKwkJCQlOVUxMKTsJCS8qIGR0b3IgKi8KKwlpZiAoamJkX2hhbmRsZV9jYWNoZSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VNRVJHICJKQkQ6IGZhaWxlZCB0byBjcmVhdGUgaGFuZGxlIGNhY2hlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBqb3VybmFsX2Rlc3Ryb3lfaGFuZGxlX2NhY2hlKHZvaWQpCit7CisJaWYgKGpiZF9oYW5kbGVfY2FjaGUpCisJCWttZW1fY2FjaGVfZGVzdHJveShqYmRfaGFuZGxlX2NhY2hlKTsKK30KKworLyoKKyAqIE1vZHVsZSBzdGFydHVwIGFuZCBzaHV0ZG93bgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGpvdXJuYWxfaW5pdF9jYWNoZXModm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gam91cm5hbF9pbml0X3Jldm9rZV9jYWNoZXMoKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGpvdXJuYWxfaW5pdF9qb3VybmFsX2hlYWRfY2FjaGUoKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGpvdXJuYWxfaW5pdF9oYW5kbGVfY2FjaGUoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBqb3VybmFsX2Rlc3Ryb3lfY2FjaGVzKHZvaWQpCit7CisJam91cm5hbF9kZXN0cm95X3Jldm9rZV9jYWNoZXMoKTsKKwlqb3VybmFsX2Rlc3Ryb3lfam91cm5hbF9oZWFkX2NhY2hlKCk7CisJam91cm5hbF9kZXN0cm95X2hhbmRsZV9jYWNoZSgpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBqb3VybmFsX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gam91cm5hbF9pbml0X2NhY2hlcygpOworCWlmIChyZXQgIT0gMCkKKwkJam91cm5hbF9kZXN0cm95X2NhY2hlcygpOworCWNyZWF0ZV9qYmRfcHJvY19lbnRyeSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBqb3VybmFsX2V4aXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfSkJEX0RFQlVHCisJaW50IG4gPSBhdG9taWNfcmVhZCgmbnJfam91cm5hbF9oZWFkcyk7CisJaWYgKG4pCisJCXByaW50ayhLRVJOX0VNRVJHICJKQkQ6IGxlYWtlZCAlZCBqb3VybmFsX2hlYWRzIVxuIiwgbik7CisjZW5kaWYKKwlyZW1vdmVfamJkX3Byb2NfZW50cnkoKTsKKwlqb3VybmFsX2Rlc3Ryb3lfY2FjaGVzKCk7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9pbml0KGpvdXJuYWxfaW5pdCk7Cittb2R1bGVfZXhpdChqb3VybmFsX2V4aXQpOworCmRpZmYgLS1naXQgYS9mcy9qYmQvcmVjb3ZlcnkuYyBiL2ZzL2piZC9yZWNvdmVyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwM2MzNGUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qYmQvcmVjb3ZlcnkuYwpAQCAtMCwwICsxLDU5MSBAQAorLyoKKyAqIGxpbnV4L2ZzL3JlY292ZXJ5LmMKKyAqIAorICogV3JpdHRlbiBieSBTdGVwaGVuIEMuIFR3ZWVkaWUgPHNjdEByZWRoYXQuY29tPiwgMTk5OQorICoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDAgUmVkIEhhdCBTb2Z0d2FyZSAtLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIEpvdXJuYWwgcmVjb3Zlcnkgcm91dGluZXMgZm9yIHRoZSBnZW5lcmljIGZpbGVzeXN0ZW0gam91cm5hbGluZyBjb2RlOworICogcGFydCBvZiB0aGUgZXh0MmZzIGpvdXJuYWxpbmcgc3lzdGVtLiAgCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSAiamZzX3VzZXIuaCIKKyNlbHNlCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamJkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjZW5kaWYKKworLyoKKyAqIE1haW50YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ncmVzcyBvZiB0aGUgcmVjb3Zlcnkgam9iLCBzbyB0aGF0CisgKiB0aGUgZGlmZmVyZW50IHBhc3NlcyBjYW4gY2FycnkgaW5mb3JtYXRpb24gYmV0d2VlbiB0aGVtLiAKKyAqLworc3RydWN0IHJlY292ZXJ5X2luZm8gCit7CisJdGlkX3QJCXN0YXJ0X3RyYW5zYWN0aW9uOworCXRpZF90CQllbmRfdHJhbnNhY3Rpb247CisKKwlpbnQJCW5yX3JlcGxheXM7CisJaW50CQlucl9yZXZva2VzOworCWludAkJbnJfcmV2b2tlX2hpdHM7Cit9OworCitlbnVtIHBhc3N0eXBlIHtQQVNTX1NDQU4sIFBBU1NfUkVWT0tFLCBQQVNTX1JFUExBWX07CitzdGF0aWMgaW50IGRvX29uZV9wYXNzKGpvdXJuYWxfdCAqam91cm5hbCwKKwkJCQlzdHJ1Y3QgcmVjb3ZlcnlfaW5mbyAqaW5mbywgZW51bSBwYXNzdHlwZSBwYXNzKTsKK3N0YXRpYyBpbnQgc2Nhbl9yZXZva2VfcmVjb3Jkcyhqb3VybmFsX3QgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICosCisJCQkJdGlkX3QsIHN0cnVjdCByZWNvdmVyeV9pbmZvICopOworCisjaWZkZWYgX19LRVJORUxfXworCisvKiBSZWxlYXNlIHJlYWRhaGVhZCBidWZmZXJzIGFmdGVyIHVzZSAqLwordm9pZCBqb3VybmFsX2JyZWxzZV9hcnJheShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJbXSwgaW50IG4pCit7CisJd2hpbGUgKC0tbiA+PSAwKQorCQlicmVsc2UgKGJbbl0pOworfQorCisKKy8qCisgKiBXaGVuIHJlYWRpbmcgZnJvbSB0aGUgam91cm5hbCwgd2UgYXJlIGdvaW5nIHRocm91Z2ggdGhlIGJsb2NrIGRldmljZQorICogbGF5ZXIgZGlyZWN0bHkgYW5kIHNvIHRoZXJlIGlzIG5vIHJlYWRhaGVhZCBiZWluZyBkb25lIGZvciB1cy4gIFdlCisgKiBuZWVkIHRvIGltcGxlbWVudCBhbnkgcmVhZGFoZWFkIG91cnNlbHZlcyBpZiB3ZSB3YW50IGl0IHRvIGhhcHBlbiBhdAorICogYWxsLiAgUmVjb3ZlcnkgaXMgYmFzaWNhbGx5IG9uZSBsb25nIHNlcXVlbnRpYWwgcmVhZCwgc28gbWFrZSBzdXJlIHdlCisgKiBkbyB0aGUgSU8gaW4gcmVhc29uYWJseSBsYXJnZSBjaHVua3MuCisgKgorICogVGhpcyBpcyBub3Qgc28gY3JpdGljYWwgdGhhdCB3ZSBuZWVkIHRvIGJlIGVub3Jtb3VzbHkgY2xldmVyIGFib3V0CisgKiB0aGUgcmVhZGFoZWFkIHNpemUsIHRob3VnaC4gIDEyOEsgaXMgYSBwdXJlbHkgYXJiaXRyYXJ5LCBnb29kLWVub3VnaAorICogZml4ZWQgdmFsdWUuCisgKi8KKworI2RlZmluZSBNQVhCVUYgOAorc3RhdGljIGludCBkb19yZWFkYWhlYWQoam91cm5hbF90ICpqb3VybmFsLCB1bnNpZ25lZCBpbnQgc3RhcnQpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgbWF4LCBuYnVmcywgbmV4dDsKKwl1bnNpZ25lZCBsb25nIGJsb2NrbnI7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJ1ZnNbTUFYQlVGXTsKKworCS8qIERvIHVwIHRvIDEyOEsgb2YgcmVhZGFoZWFkICovCisJbWF4ID0gc3RhcnQgKyAoMTI4ICogMTAyNCAvIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwlpZiAobWF4ID4gam91cm5hbC0+al9tYXhsZW4pCisJCW1heCA9IGpvdXJuYWwtPmpfbWF4bGVuOworCisJLyogRG8gdGhlIHJlYWRhaGVhZCBpdHNlbGYuICBXZSdsbCBzdWJtaXQgTUFYQlVGIGJ1ZmZlcl9oZWFkcyBhdAorCSAqIGEgdGltZSB0byB0aGUgYmxvY2sgZGV2aWNlIElPIGxheWVyLiAqLworCisJbmJ1ZnMgPSAwOworCisJZm9yIChuZXh0ID0gc3RhcnQ7IG5leHQgPCBtYXg7IG5leHQrKykgeworCQllcnIgPSBqb3VybmFsX2JtYXAoam91cm5hbCwgbmV4dCwgJmJsb2NrbnIpOworCisJCWlmIChlcnIpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgIkpCRDogYmFkIGJsb2NrIGF0IG9mZnNldCAldVxuIiwKKwkJCQluZXh0KTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisKKwkJYmggPSBfX2dldGJsayhqb3VybmFsLT5qX2RldiwgYmxvY2tuciwgam91cm5hbC0+al9ibG9ja3NpemUpOworCQlpZiAoIWJoKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBmYWlsZWQ7CisJCX0KKworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkgJiYgIWJ1ZmZlcl9sb2NrZWQoYmgpKSB7CisJCQlidWZzW25idWZzKytdID0gYmg7CisJCQlpZiAobmJ1ZnMgPT0gTUFYQlVGKSB7CisJCQkJbGxfcndfYmxvY2soUkVBRCwgbmJ1ZnMsIGJ1ZnMpOworCQkJCWpvdXJuYWxfYnJlbHNlX2FycmF5KGJ1ZnMsIG5idWZzKTsKKwkJCQluYnVmcyA9IDA7CisJCQl9CisJCX0gZWxzZQorCQkJYnJlbHNlKGJoKTsKKwl9CisKKwlpZiAobmJ1ZnMpCisJCWxsX3J3X2Jsb2NrKFJFQUQsIG5idWZzLCBidWZzKTsKKwllcnIgPSAwOworCitmYWlsZWQ6CisJaWYgKG5idWZzKSAKKwkJam91cm5hbF9icmVsc2VfYXJyYXkoYnVmcywgbmJ1ZnMpOworCXJldHVybiBlcnI7Cit9CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKworLyoKKyAqIFJlYWQgYSBibG9jayBmcm9tIHRoZSBqb3VybmFsCisgKi8KKworc3RhdGljIGludCBqcmVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHAsIGpvdXJuYWxfdCAqam91cm5hbCwgCisJCSB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBibG9ja25yOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkqYmhwID0gTlVMTDsKKworCWlmIChvZmZzZXQgPj0gam91cm5hbC0+al9tYXhsZW4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJKQkQ6IGNvcnJ1cHRlZCBqb3VybmFsIHN1cGVyYmxvY2tcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwllcnIgPSBqb3VybmFsX2JtYXAoam91cm5hbCwgb2Zmc2V0LCAmYmxvY2tucik7CisKKwlpZiAoZXJyKSB7CisJCXByaW50ayAoS0VSTl9FUlIgIkpCRDogYmFkIGJsb2NrIGF0IG9mZnNldCAldVxuIiwKKwkJCW9mZnNldCk7CisJCXJldHVybiBlcnI7CisJfQorCisJYmggPSBfX2dldGJsayhqb3VybmFsLT5qX2RldiwgYmxvY2tuciwgam91cm5hbC0+al9ibG9ja3NpemUpOworCWlmICghYmgpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCS8qIElmIHRoaXMgaXMgYSBicmFuZCBuZXcgYnVmZmVyLCBzdGFydCByZWFkYWhlYWQuCisgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB3ZSBhc3N1bWUgd2UgYXJlIGFscmVhZHkgcmVhZGluZyBpdC4gICovCisJCWlmICghYnVmZmVyX3JlcShiaCkpCisJCQlkb19yZWFkYWhlYWQoam91cm5hbCwgb2Zmc2V0KTsKKwkJd2FpdF9vbl9idWZmZXIoYmgpOworCX0KKworCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQlwcmludGsgKEtFUk5fRVJSICJKQkQ6IEZhaWxlZCB0byByZWFkIGJsb2NrIGF0IG9mZnNldCAldVxuIiwKKwkJCW9mZnNldCk7CisJCWJyZWxzZShiaCk7CisJCXJldHVybiAtRUlPOworCX0KKworCSpiaHAgPSBiaDsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogQ291bnQgdGhlIG51bWJlciBvZiBpbi11c2UgdGFncyBpbiBhIGpvdXJuYWwgZGVzY3JpcHRvciBibG9jay4KKyAqLworCitzdGF0aWMgaW50IGNvdW50X3RhZ3Moc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHNpemUpCit7CisJY2hhciAqCQkJdGFncDsKKwlqb3VybmFsX2Jsb2NrX3RhZ190ICoJdGFnOworCWludAkJCW5yID0gMDsKKworCXRhZ3AgPSAmYmgtPmJfZGF0YVtzaXplb2Yoam91cm5hbF9oZWFkZXJfdCldOworCisJd2hpbGUgKCh0YWdwIC0gYmgtPmJfZGF0YSArIHNpemVvZihqb3VybmFsX2Jsb2NrX3RhZ190KSkgPD0gc2l6ZSkgeworCQl0YWcgPSAoam91cm5hbF9ibG9ja190YWdfdCAqKSB0YWdwOworCisJCW5yKys7CisJCXRhZ3AgKz0gc2l6ZW9mKGpvdXJuYWxfYmxvY2tfdGFnX3QpOworCQlpZiAoISh0YWctPnRfZmxhZ3MgJiBjcHVfdG9fYmUzMihKRlNfRkxBR19TQU1FX1VVSUQpKSkKKwkJCXRhZ3AgKz0gMTY7CisKKwkJaWYgKHRhZy0+dF9mbGFncyAmIGNwdV90b19iZTMyKEpGU19GTEFHX0xBU1RfVEFHKSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBucjsKK30KKworCisvKiBNYWtlIHN1cmUgd2Ugd3JhcCBhcm91bmQgdGhlIGxvZyBjb3JyZWN0bHkhICovCisjZGVmaW5lIHdyYXAoam91cm5hbCwgdmFyKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKHZhciA+PSAoam91cm5hbCktPmpfbGFzdCkJCQkJCVwKKwkJdmFyIC09ICgoam91cm5hbCktPmpfbGFzdCAtIChqb3VybmFsKS0+al9maXJzdCk7CVwKK30gd2hpbGUgKDApCisKKy8qKgorICogaW50IGpvdXJuYWxfcmVjb3Zlcihqb3VybmFsX3QgKmpvdXJuYWwpIC0gcmVjb3ZlcnMgYSBvbi1kaXNrIGpvdXJuYWwKKyAqIEBqb3VybmFsOiB0aGUgam91cm5hbCB0byByZWNvdmVyCisgKiAKKyAqIFRoZSBwcmltYXJ5IGZ1bmN0aW9uIGZvciByZWNvdmVyaW5nIHRoZSBsb2cgY29udGVudHMgd2hlbiBtb3VudGluZyBhCisgKiBqb3VybmFsZWQgZGV2aWNlLiAgCisgKgorICogUmVjb3ZlcnkgaXMgZG9uZSBpbiB0aHJlZSBwYXNzZXMuICBJbiB0aGUgZmlyc3QgcGFzcywgd2UgbG9vayBmb3IgdGhlCisgKiBlbmQgb2YgdGhlIGxvZy4gIEluIHRoZSBzZWNvbmQsIHdlIGFzc2VtYmxlIHRoZSBsaXN0IG9mIHJldm9rZQorICogYmxvY2tzLiAgSW4gdGhlIHRoaXJkIGFuZCBmaW5hbCBwYXNzLCB3ZSByZXBsYXkgYW55IHVuLXJldm9rZWQgYmxvY2tzCisgKiBpbiB0aGUgbG9nLiAgCisgKi8KK2ludCBqb3VybmFsX3JlY292ZXIoam91cm5hbF90ICpqb3VybmFsKQoreworCWludAkJCWVycjsKKwlqb3VybmFsX3N1cGVyYmxvY2tfdCAqCXNiOworCisJc3RydWN0IHJlY292ZXJ5X2luZm8JaW5mbzsKKworCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwlzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKworCS8qIAorCSAqIFRoZSBqb3VybmFsIHN1cGVyYmxvY2sncyBzX3N0YXJ0IGZpZWxkICh0aGUgY3VycmVudCBsb2cgaGVhZCkKKwkgKiBpcyBhbHdheXMgemVybyBpZiwgYW5kIG9ubHkgaWYsIHRoZSBqb3VybmFsIHdhcyBjbGVhbmx5CisJICogdW5tb3VudGVkLiAgCisJICovCisKKwlpZiAoIXNiLT5zX3N0YXJ0KSB7CisJCWpiZF9kZWJ1ZygxLCAiTm8gcmVjb3ZlcnkgcmVxdWlyZWQsIGxhc3QgdHJhbnNhY3Rpb24gJWRcbiIsCisJCQkgIGJlMzJfdG9fY3B1KHNiLT5zX3NlcXVlbmNlKSk7CisJCWpvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2UgPSBiZTMyX3RvX2NwdShzYi0+c19zZXF1ZW5jZSkgKyAxOworCQlyZXR1cm4gMDsKKwl9CisKKwllcnIgPSBkb19vbmVfcGFzcyhqb3VybmFsLCAmaW5mbywgUEFTU19TQ0FOKTsKKwlpZiAoIWVycikKKwkJZXJyID0gZG9fb25lX3Bhc3Moam91cm5hbCwgJmluZm8sIFBBU1NfUkVWT0tFKTsKKwlpZiAoIWVycikKKwkJZXJyID0gZG9fb25lX3Bhc3Moam91cm5hbCwgJmluZm8sIFBBU1NfUkVQTEFZKTsKKworCWpiZF9kZWJ1ZygwLCAiSkJEOiByZWNvdmVyeSwgZXhpdCBzdGF0dXMgJWQsICIKKwkJICAicmVjb3ZlcmVkIHRyYW5zYWN0aW9ucyAldSB0byAldVxuIiwKKwkJICBlcnIsIGluZm8uc3RhcnRfdHJhbnNhY3Rpb24sIGluZm8uZW5kX3RyYW5zYWN0aW9uKTsKKwlqYmRfZGVidWcoMCwgIkpCRDogUmVwbGF5ZWQgJWQgYW5kIHJldm9rZWQgJWQvJWQgYmxvY2tzXG4iLCAKKwkJICBpbmZvLm5yX3JlcGxheXMsIGluZm8ubnJfcmV2b2tlX2hpdHMsIGluZm8ubnJfcmV2b2tlcyk7CisKKwkvKiBSZXN0YXJ0IHRoZSBsb2cgYXQgdGhlIG5leHQgdHJhbnNhY3Rpb24gSUQsIHRodXMgaW52YWxpZGF0aW5nCisJICogYW55IGV4aXN0aW5nIGNvbW1pdCByZWNvcmRzIGluIHRoZSBsb2cuICovCisJam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSA9ICsraW5mby5lbmRfdHJhbnNhY3Rpb247CisKKwlqb3VybmFsX2NsZWFyX3Jldm9rZShqb3VybmFsKTsKKwlzeW5jX2Jsb2NrZGV2KGpvdXJuYWwtPmpfZnNfZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGludCBqb3VybmFsX3NraXBfcmVjb3ZlcnkoKSAtIFN0YXJ0IGpvdXJuYWwgYW5kIHdpcGUgZXhpdGluZyByZWNvcmRzIAorICogQGpvdXJuYWw6IGpvdXJuYWwgdG8gc3RhcnR1cAorICogCisgKiBMb2NhdGUgYW55IHZhbGlkIHJlY292ZXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIGpvdXJuYWwgYW5kIHNldCB1cCB0aGUKKyAqIGpvdXJuYWwgc3RydWN0dXJlcyBpbiBtZW1vcnkgdG8gaWdub3JlIGl0IChwcmVzdW1hYmx5IGJlY2F1c2UgdGhlCisgKiBjYWxsZXIgaGFzIGV2aWRlbmNlIHRoYXQgaXQgaXMgb3V0IG9mIGRhdGUpLiAgCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMnbnQgYXBwZWFyIHRvIGJlIGV4b3J0ZWQuLgorICoKKyAqIFdlIHBlcmZvcm0gb25lIHBhc3Mgb3ZlciB0aGUgam91cm5hbCB0byBhbGxvdyB1cyB0byB0ZWxsIHRoZSB1c2VyIGhvdworICogbXVjaCByZWNvdmVyeSBpbmZvcm1hdGlvbiBpcyBiZWluZyBlcmFzZWQsIGFuZCB0byBsZXQgdXMgaW5pdGlhbGlzZQorICogdGhlIGpvdXJuYWwgdHJhbnNhY3Rpb24gc2VxdWVuY2UgbnVtYmVycyB0byB0aGUgbmV4dCB1bnVzZWQgSUQuIAorICovCitpbnQgam91cm5hbF9za2lwX3JlY292ZXJ5KGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlpbnQJCQllcnI7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKglzYjsKKworCXN0cnVjdCByZWNvdmVyeV9pbmZvCWluZm87CisKKwltZW1zZXQgKCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCXNiID0gam91cm5hbC0+al9zdXBlcmJsb2NrOworCisJZXJyID0gZG9fb25lX3Bhc3Moam91cm5hbCwgJmluZm8sIFBBU1NfU0NBTik7CisKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSkJEOiBlcnJvciAlZCBzY2FubmluZyBqb3VybmFsXG4iLCBlcnIpOworCQkrK2pvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2U7CisJfSBlbHNlIHsKKyNpZmRlZiBDT05GSUdfSkJEX0RFQlVHCisJCWludCBkcm9wcGVkID0gaW5mby5lbmRfdHJhbnNhY3Rpb24gLSBiZTMyX3RvX2NwdShzYi0+c19zZXF1ZW5jZSk7CisjZW5kaWYKKwkJamJkX2RlYnVnKDAsIAorCQkJICAiSkJEOiBpZ25vcmluZyAlZCB0cmFuc2FjdGlvbiVzIGZyb20gdGhlIGpvdXJuYWwuXG4iLAorCQkJICBkcm9wcGVkLCAoZHJvcHBlZCA9PSAxKSA/ICIiIDogInMiKTsKKwkJam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSA9ICsraW5mby5lbmRfdHJhbnNhY3Rpb247CisJfQorCisJam91cm5hbC0+al90YWlsID0gMDsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRvX29uZV9wYXNzKGpvdXJuYWxfdCAqam91cm5hbCwKKwkJCXN0cnVjdCByZWNvdmVyeV9pbmZvICppbmZvLCBlbnVtIHBhc3N0eXBlIHBhc3MpCit7CisJdW5zaWduZWQgaW50CQlmaXJzdF9jb21taXRfSUQsIG5leHRfY29tbWl0X0lEOworCXVuc2lnbmVkIGxvbmcJCW5leHRfbG9nX2Jsb2NrOworCWludAkJCWVyciwgc3VjY2VzcyA9IDA7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKglzYjsKKwlqb3VybmFsX2hlYWRlcl90ICogCXRtcDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKgliaDsKKwl1bnNpZ25lZCBpbnQJCXNlcXVlbmNlOworCWludAkJCWJsb2NrdHlwZTsKKworCS8qIFByZWNvbXB1dGUgdGhlIG1heGltdW0gbWV0YWRhdGEgZGVzY3JpcHRvcnMgaW4gYSBkZXNjcmlwdG9yIGJsb2NrICovCisJaW50CQkJTUFYX0JMT0NLU19QRVJfREVTQzsKKwlNQVhfQkxPQ0tTX1BFUl9ERVNDID0gKChqb3VybmFsLT5qX2Jsb2Nrc2l6ZS1zaXplb2Yoam91cm5hbF9oZWFkZXJfdCkpCisJCQkgICAgICAgLyBzaXplb2Yoam91cm5hbF9ibG9ja190YWdfdCkpOworCisJLyogCisJICogRmlyc3QgdGhpbmcgaXMgdG8gZXN0YWJsaXNoIHdoYXQgd2UgZXhwZWN0IHRvIGZpbmQgaW4gdGhlIGxvZworCSAqIChpbiB0ZXJtcyBvZiB0cmFuc2FjdGlvbiBJRHMpLCBhbmQgd2hlcmUgKGluIHRlcm1zIG9mIGxvZworCSAqIGJsb2NrIG9mZnNldHMpOiBxdWVyeSB0aGUgc3VwZXJibG9jay4gIAorCSAqLworCisJc2IgPSBqb3VybmFsLT5qX3N1cGVyYmxvY2s7CisJbmV4dF9jb21taXRfSUQgPSBiZTMyX3RvX2NwdShzYi0+c19zZXF1ZW5jZSk7CisJbmV4dF9sb2dfYmxvY2sgPSBiZTMyX3RvX2NwdShzYi0+c19zdGFydCk7CisKKwlmaXJzdF9jb21taXRfSUQgPSBuZXh0X2NvbW1pdF9JRDsKKwlpZiAocGFzcyA9PSBQQVNTX1NDQU4pCisJCWluZm8tPnN0YXJ0X3RyYW5zYWN0aW9uID0gZmlyc3RfY29tbWl0X0lEOworCisJamJkX2RlYnVnKDEsICJTdGFydGluZyByZWNvdmVyeSBwYXNzICVkXG4iLCBwYXNzKTsKKworCS8qCisJICogTm93IHdlIHdhbGsgdGhyb3VnaCB0aGUgbG9nLCB0cmFuc2FjdGlvbiBieSB0cmFuc2FjdGlvbiwKKwkgKiBtYWtpbmcgc3VyZSB0aGF0IGVhY2ggdHJhbnNhY3Rpb24gaGFzIGEgY29tbWl0IGJsb2NrIGluIHRoZQorCSAqIGV4cGVjdGVkIHBsYWNlLiAgRWFjaCBjb21wbGV0ZSB0cmFuc2FjdGlvbiBnZXRzIHJlcGxheWVkIGJhY2sKKwkgKiBpbnRvIHRoZSBtYWluIGZpbGVzeXN0ZW0uIAorCSAqLworCisJd2hpbGUgKDEpIHsKKwkJaW50CQkJZmxhZ3M7CisJCWNoYXIgKgkJCXRhZ3A7CisJCWpvdXJuYWxfYmxvY2tfdGFnX3QgKgl0YWc7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqCW9iaDsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICoJbmJoOworCisJCWNvbmRfcmVzY2hlZCgpOwkJLyogV2UncmUgdW5kZXIgbG9ja19rZXJuZWwoKSAqLworCisJCS8qIElmIHdlIGFscmVhZHkga25vdyB3aGVyZSB0byBzdG9wIHRoZSBsb2cgdHJhdmVyc2FsLAorCQkgKiBjaGVjayByaWdodCBub3cgdGhhdCB3ZSBoYXZlbid0IGdvbmUgcGFzdCB0aGUgZW5kIG9mCisJCSAqIHRoZSBsb2cuICovCisKKwkJaWYgKHBhc3MgIT0gUEFTU19TQ0FOKQorCQkJaWYgKHRpZF9nZXEobmV4dF9jb21taXRfSUQsIGluZm8tPmVuZF90cmFuc2FjdGlvbikpCisJCQkJYnJlYWs7CisKKwkJamJkX2RlYnVnKDIsICJTY2FubmluZyBmb3Igc2VxdWVuY2UgSUQgJXUgYXQgJWx1LyVsdVxuIiwKKwkJCSAgbmV4dF9jb21taXRfSUQsIG5leHRfbG9nX2Jsb2NrLCBqb3VybmFsLT5qX2xhc3QpOworCisJCS8qIFNraXAgb3ZlciBlYWNoIGNodW5rIG9mIHRoZSB0cmFuc2FjdGlvbiBsb29raW5nCisJCSAqIGVpdGhlciB0aGUgbmV4dCBkZXNjcmlwdG9yIGJsb2NrIG9yIHRoZSBmaW5hbCBjb21taXQKKwkJICogcmVjb3JkLiAqLworCisJCWpiZF9kZWJ1ZygzLCAiSkJEOiBjaGVja2luZyBibG9jayAlbGRcbiIsIG5leHRfbG9nX2Jsb2NrKTsKKwkJZXJyID0ganJlYWQoJmJoLCBqb3VybmFsLCBuZXh0X2xvZ19ibG9jayk7CisJCWlmIChlcnIpCisJCQlnb3RvIGZhaWxlZDsKKworCQluZXh0X2xvZ19ibG9jaysrOworCQl3cmFwKGpvdXJuYWwsIG5leHRfbG9nX2Jsb2NrKTsKKworCQkvKiBXaGF0IGtpbmQgb2YgYnVmZmVyIGlzIGl0PyAKKwkJICogCisJCSAqIElmIGl0IGlzIGEgZGVzY3JpcHRvciBibG9jaywgY2hlY2sgdGhhdCBpdCBoYXMgdGhlCisJCSAqIGV4cGVjdGVkIHNlcXVlbmNlIG51bWJlci4gIE90aGVyd2lzZSwgd2UncmUgYWxsIGRvbmUKKwkJICogaGVyZS4gKi8KKworCQl0bXAgPSAoam91cm5hbF9oZWFkZXJfdCAqKWJoLT5iX2RhdGE7CisKKwkJaWYgKHRtcC0+aF9tYWdpYyAhPSBjcHVfdG9fYmUzMihKRlNfTUFHSUNfTlVNQkVSKSkgeworCQkJYnJlbHNlKGJoKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYmxvY2t0eXBlID0gYmUzMl90b19jcHUodG1wLT5oX2Jsb2NrdHlwZSk7CisJCXNlcXVlbmNlID0gYmUzMl90b19jcHUodG1wLT5oX3NlcXVlbmNlKTsKKwkJamJkX2RlYnVnKDMsICJGb3VuZCBtYWdpYyAlZCwgc2VxdWVuY2UgJWRcbiIsIAorCQkJICBibG9ja3R5cGUsIHNlcXVlbmNlKTsKKworCQlpZiAoc2VxdWVuY2UgIT0gbmV4dF9jb21taXRfSUQpIHsKKwkJCWJyZWxzZShiaCk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIE9LLCB3ZSBoYXZlIGEgdmFsaWQgZGVzY3JpcHRvciBibG9jayB3aGljaCBtYXRjaGVzCisJCSAqIGFsbCBvZiB0aGUgc2VxdWVuY2UgbnVtYmVyIGNoZWNrcy4gIFdoYXQgYXJlIHdlIGdvaW5nCisJCSAqIHRvIGRvIHdpdGggaXQ/ICBUaGF0IGRlcGVuZHMgb24gdGhlIHBhc3MuLi4gKi8KKworCQlzd2l0Y2goYmxvY2t0eXBlKSB7CisJCWNhc2UgSkZTX0RFU0NSSVBUT1JfQkxPQ0s6CisJCQkvKiBJZiBpdCBpcyBhIHZhbGlkIGRlc2NyaXB0b3IgYmxvY2ssIHJlcGxheSBpdAorCQkJICogaW4gcGFzcyBSRVBMQVk7IG90aGVyd2lzZSwganVzdCBza2lwIG92ZXIgdGhlCisJCQkgKiBibG9ja3MgaXQgZGVzY3JpYmVzLiAqLworCQkJaWYgKHBhc3MgIT0gUEFTU19SRVBMQVkpIHsKKwkJCQluZXh0X2xvZ19ibG9jayArPQorCQkJCQljb3VudF90YWdzKGJoLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJCQkJd3JhcChqb3VybmFsLCBuZXh0X2xvZ19ibG9jayk7CisJCQkJYnJlbHNlKGJoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogQSBkZXNjcmlwdG9yIGJsb2NrOiB3ZSBjYW4gbm93IHdyaXRlIGFsbCBvZgorCQkJICogdGhlIGRhdGEgYmxvY2tzLiAgWWF5LCB1c2VmdWwgd29yayBpcyBmaW5hbGx5CisJCQkgKiBnZXR0aW5nIGRvbmUgaGVyZSEgKi8KKworCQkJdGFncCA9ICZiaC0+Yl9kYXRhW3NpemVvZihqb3VybmFsX2hlYWRlcl90KV07CisJCQl3aGlsZSAoKHRhZ3AgLSBiaC0+Yl9kYXRhICtzaXplb2Yoam91cm5hbF9ibG9ja190YWdfdCkpCisJCQkgICAgICAgPD0gam91cm5hbC0+al9ibG9ja3NpemUpIHsKKwkJCQl1bnNpZ25lZCBsb25nIGlvX2Jsb2NrOworCisJCQkJdGFnID0gKGpvdXJuYWxfYmxvY2tfdGFnX3QgKikgdGFncDsKKwkJCQlmbGFncyA9IGJlMzJfdG9fY3B1KHRhZy0+dF9mbGFncyk7CisKKwkJCQlpb19ibG9jayA9IG5leHRfbG9nX2Jsb2NrKys7CisJCQkJd3JhcChqb3VybmFsLCBuZXh0X2xvZ19ibG9jayk7CisJCQkJZXJyID0ganJlYWQoJm9iaCwgam91cm5hbCwgaW9fYmxvY2spOworCQkJCWlmIChlcnIpIHsKKwkJCQkJLyogUmVjb3ZlciB3aGF0IHdlIGNhbiwgYnV0CisJCQkJCSAqIHJlcG9ydCBmYWlsdXJlIGF0IHRoZSBlbmQuICovCisJCQkJCXN1Y2Nlc3MgPSBlcnI7CisJCQkJCXByaW50ayAoS0VSTl9FUlIgCisJCQkJCQkiSkJEOiBJTyBlcnJvciAlZCByZWNvdmVyaW5nICIKKwkJCQkJCSJibG9jayAlbGQgaW4gbG9nXG4iLAorCQkJCQkJZXJyLCBpb19ibG9jayk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdW5zaWduZWQgbG9uZyBibG9ja25yOworCisJCQkJCUpfQVNTRVJUKG9iaCAhPSBOVUxMKTsKKwkJCQkJYmxvY2tuciA9IGJlMzJfdG9fY3B1KHRhZy0+dF9ibG9ja25yKTsKKworCQkJCQkvKiBJZiB0aGUgYmxvY2sgaGFzIGJlZW4KKwkJCQkJICogcmV2b2tlZCwgdGhlbiB3ZSdyZSBhbGwgZG9uZQorCQkJCQkgKiBoZXJlLiAqLworCQkJCQlpZiAoam91cm5hbF90ZXN0X3Jldm9rZQorCQkJCQkgICAgKGpvdXJuYWwsIGJsb2NrbnIsIAorCQkJCQkgICAgIG5leHRfY29tbWl0X0lEKSkgeworCQkJCQkJYnJlbHNlKG9iaCk7CisJCQkJCQkrK2luZm8tPm5yX3Jldm9rZV9oaXRzOworCQkJCQkJZ290byBza2lwX3dyaXRlOworCQkJCQl9CisKKwkJCQkJLyogRmluZCBhIGJ1ZmZlciBmb3IgdGhlIG5ldworCQkJCQkgKiBkYXRhIGJlaW5nIHJlc3RvcmVkICovCisJCQkJCW5iaCA9IF9fZ2V0YmxrKGpvdXJuYWwtPmpfZnNfZGV2LAorCQkJCQkJCWJsb2NrbnIsCisJCQkJCQkJam91cm5hbC0+al9ibG9ja3NpemUpOworCQkJCQlpZiAobmJoID09IE5VTEwpIHsKKwkJCQkJCXByaW50ayhLRVJOX0VSUiAKKwkJCQkJCSAgICAgICAiSkJEOiBPdXQgb2YgbWVtb3J5ICIKKwkJCQkJCSAgICAgICAiZHVyaW5nIHJlY292ZXJ5LlxuIik7CisJCQkJCQllcnIgPSAtRU5PTUVNOworCQkJCQkJYnJlbHNlKGJoKTsKKwkJCQkJCWJyZWxzZShvYmgpOworCQkJCQkJZ290byBmYWlsZWQ7CisJCQkJCX0KKworCQkJCQlsb2NrX2J1ZmZlcihuYmgpOworCQkJCQltZW1jcHkobmJoLT5iX2RhdGEsIG9iaC0+Yl9kYXRhLAorCQkJCQkJCWpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwkJCQkJaWYgKGZsYWdzICYgSkZTX0ZMQUdfRVNDQVBFKSB7CisJCQkJCQkqKChfX2JlMzIgKiliaC0+Yl9kYXRhKSA9CisJCQkJCQljcHVfdG9fYmUzMihKRlNfTUFHSUNfTlVNQkVSKTsKKwkJCQkJfQorCisJCQkJCUJVRkZFUl9UUkFDRShuYmgsICJtYXJraW5nIGRpcnR5Iik7CisJCQkJCXNldF9idWZmZXJfdXB0b2RhdGUobmJoKTsKKwkJCQkJbWFya19idWZmZXJfZGlydHkobmJoKTsKKwkJCQkJQlVGRkVSX1RSQUNFKG5iaCwgIm1hcmtpbmcgdXB0b2RhdGUiKTsKKwkJCQkJKytpbmZvLT5ucl9yZXBsYXlzOworCQkJCQkvKiBsbF9yd19ibG9jayhXUklURSwgMSwgJm5iaCk7ICovCisJCQkJCXVubG9ja19idWZmZXIobmJoKTsKKwkJCQkJYnJlbHNlKG9iaCk7CisJCQkJCWJyZWxzZShuYmgpOworCQkJCX0KKworCQkJc2tpcF93cml0ZToKKwkJCQl0YWdwICs9IHNpemVvZihqb3VybmFsX2Jsb2NrX3RhZ190KTsKKwkJCQlpZiAoIShmbGFncyAmIEpGU19GTEFHX1NBTUVfVVVJRCkpCisJCQkJCXRhZ3AgKz0gMTY7CisKKwkJCQlpZiAoZmxhZ3MgJiBKRlNfRkxBR19MQVNUX1RBRykKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCWJyZWxzZShiaCk7CisJCQljb250aW51ZTsKKworCQljYXNlIEpGU19DT01NSVRfQkxPQ0s6CisJCQkvKiBGb3VuZCBhbiBleHBlY3RlZCBjb21taXQgYmxvY2s6IG5vdCBtdWNoIHRvCisJCQkgKiBkbyBvdGhlciB0aGFuIG1vdmUgb24gdG8gdGhlIG5leHQgc2VxdWVuY2UKKwkJCSAqIG51bWJlci4gKi8KKwkJCWJyZWxzZShiaCk7CisJCQluZXh0X2NvbW1pdF9JRCsrOworCQkJY29udGludWU7CisKKwkJY2FzZSBKRlNfUkVWT0tFX0JMT0NLOgorCQkJLyogSWYgd2UgYXJlbid0IGluIHRoZSBSRVZPS0UgcGFzcywgdGhlbiB3ZSBjYW4KKwkJCSAqIGp1c3Qgc2tpcCBvdmVyIHRoaXMgYmxvY2suICovCisJCQlpZiAocGFzcyAhPSBQQVNTX1JFVk9LRSkgeworCQkJCWJyZWxzZShiaCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWVyciA9IHNjYW5fcmV2b2tlX3JlY29yZHMoam91cm5hbCwgYmgsCisJCQkJCQkgIG5leHRfY29tbWl0X0lELCBpbmZvKTsKKwkJCWJyZWxzZShiaCk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gZmFpbGVkOworCQkJY29udGludWU7CisKKwkJZGVmYXVsdDoKKwkJCWpiZF9kZWJ1ZygzLCAiVW5yZWNvZ25pc2VkIG1hZ2ljICVkLCBlbmQgb2Ygc2Nhbi5cbiIsCisJCQkJICBibG9ja3R5cGUpOworCQkJZ290byBkb25lOworCQl9CisJfQorCisgZG9uZToKKwkvKiAKKwkgKiBXZSBicm9rZSBvdXQgb2YgdGhlIGxvZyBzY2FuIGxvb3A6IGVpdGhlciB3ZSBjYW1lIHRvIHRoZQorCSAqIGtub3duIGVuZCBvZiB0aGUgbG9nIG9yIHdlIGZvdW5kIGFuIHVuZXhwZWN0ZWQgYmxvY2sgaW4gdGhlCisJICogbG9nLiAgSWYgdGhlIGxhdHRlciBoYXBwZW5lZCwgdGhlbiB3ZSBrbm93IHRoYXQgdGhlICJjdXJyZW50IgorCSAqIHRyYW5zYWN0aW9uIG1hcmtzIHRoZSBlbmQgb2YgdGhlIHZhbGlkIGxvZy4KKwkgKi8KKworCWlmIChwYXNzID09IFBBU1NfU0NBTikKKwkJaW5mby0+ZW5kX3RyYW5zYWN0aW9uID0gbmV4dF9jb21taXRfSUQ7CisJZWxzZSB7CisJCS8qIEl0J3MgcmVhbGx5IGJhZCBuZXdzIGlmIGRpZmZlcmVudCBwYXNzZXMgZW5kIHVwIGF0CisJCSAqIGRpZmZlcmVudCBwbGFjZXMgKGJ1dCBwb3NzaWJsZSBkdWUgdG8gSU8gZXJyb3JzKS4gKi8KKwkJaWYgKGluZm8tPmVuZF90cmFuc2FjdGlvbiAhPSBuZXh0X2NvbW1pdF9JRCkgeworCQkJcHJpbnRrIChLRVJOX0VSUiAiSkJEOiByZWNvdmVyeSBwYXNzICVkIGVuZGVkIGF0ICIKKwkJCQkidHJhbnNhY3Rpb24gJXUsIGV4cGVjdGVkICV1XG4iLAorCQkJCXBhc3MsIG5leHRfY29tbWl0X0lELCBpbmZvLT5lbmRfdHJhbnNhY3Rpb24pOworCQkJaWYgKCFzdWNjZXNzKQorCQkJCXN1Y2Nlc3MgPSAtRUlPOworCQl9CisJfQorCisJcmV0dXJuIHN1Y2Nlc3M7CisKKyBmYWlsZWQ6CisJcmV0dXJuIGVycjsKK30KKworCisvKiBTY2FuIGEgcmV2b2tlIHJlY29yZCwgbWFya2luZyBhbGwgYmxvY2tzIG1lbnRpb25lZCBhcyByZXZva2VkLiAqLworCitzdGF0aWMgaW50IHNjYW5fcmV2b2tlX3JlY29yZHMoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAKKwkJCSAgICAgICB0aWRfdCBzZXF1ZW5jZSwgc3RydWN0IHJlY292ZXJ5X2luZm8gKmluZm8pCit7CisJam91cm5hbF9yZXZva2VfaGVhZGVyX3QgKmhlYWRlcjsKKwlpbnQgb2Zmc2V0LCBtYXg7CisKKwloZWFkZXIgPSAoam91cm5hbF9yZXZva2VfaGVhZGVyX3QgKikgYmgtPmJfZGF0YTsKKwlvZmZzZXQgPSBzaXplb2Yoam91cm5hbF9yZXZva2VfaGVhZGVyX3QpOworCW1heCA9IGJlMzJfdG9fY3B1KGhlYWRlci0+cl9jb3VudCk7CisKKwl3aGlsZSAob2Zmc2V0IDwgbWF4KSB7CisJCXVuc2lnbmVkIGxvbmcgYmxvY2tucjsKKwkJaW50IGVycjsKKworCQlibG9ja25yID0gYmUzMl90b19jcHUoKiAoKF9fYmUzMiAqKSAoYmgtPmJfZGF0YStvZmZzZXQpKSk7CisJCW9mZnNldCArPSA0OworCQllcnIgPSBqb3VybmFsX3NldF9yZXZva2Uoam91cm5hbCwgYmxvY2tuciwgc2VxdWVuY2UpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJKytpbmZvLT5ucl9yZXZva2VzOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2piZC9yZXZva2UuYyBiL2ZzL2piZC9yZXZva2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzI3YTU5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvamJkL3Jldm9rZS5jCkBAIC0wLDAgKzEsNzAyIEBACisvKgorICogbGludXgvZnMvcmV2b2tlLmMKKyAqIAorICogV3JpdHRlbiBieSBTdGVwaGVuIEMuIFR3ZWVkaWUgPHNjdEByZWRoYXQuY29tPiwgMjAwMAorICoKKyAqIENvcHlyaWdodCAyMDAwIFJlZCBIYXQgY29ycCAtLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIEpvdXJuYWwgcmV2b2tlIHJvdXRpbmVzIGZvciB0aGUgZ2VuZXJpYyBmaWxlc3lzdGVtIGpvdXJuYWxpbmcgY29kZTsKKyAqIHBhcnQgb2YgdGhlIGV4dDJmcyBqb3VybmFsaW5nIHN5c3RlbS4KKyAqCisgKiBSZXZva2UgaXMgdGhlIG1lY2hhbmlzbSB1c2VkIHRvIHByZXZlbnQgb2xkIGxvZyByZWNvcmRzIGZvciBkZWxldGVkCisgKiBtZXRhZGF0YSBmcm9tIGJlaW5nIHJlcGxheWVkIG9uIHRvcCBvZiBuZXdlciBkYXRhIHVzaW5nIHRoZSBzYW1lCisgKiBibG9ja3MuICBUaGUgcmV2b2tlIG1lY2hhbmlzbSBpcyB1c2VkIGluIHR3byBzZXBhcmF0ZSBwbGFjZXM6CisgKiAKKyAqICsgQ29tbWl0OiBkdXJpbmcgY29tbWl0IHdlIHdyaXRlIHRoZSBlbnRpcmUgbGlzdCBvZiB0aGUgY3VycmVudAorICogICB0cmFuc2FjdGlvbidzIHJldm9rZWQgYmxvY2tzIHRvIHRoZSBqb3VybmFsCisgKiAKKyAqICsgUmVjb3Zlcnk6IGR1cmluZyByZWNvdmVyeSB3ZSByZWNvcmQgdGhlIHRyYW5zYWN0aW9uIElEIG9mIGFsbAorICogICByZXZva2VkIGJsb2Nrcy4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZSByZXZva2UgcmVjb3JkcyBpbiB0aGUgbG9nCisgKiAgIGZvciBhIHNpbmdsZSBibG9jaywgb25seSB0aGUgbGFzdCBvbmUgY291bnRzLCBhbmQgaWYgdGhlcmUgaXMgYSBsb2cKKyAqICAgZW50cnkgZm9yIGEgYmxvY2sgYmV5b25kIHRoZSBsYXN0IHJldm9rZSwgdGhlbiB0aGF0IGxvZyBlbnRyeSBzdGlsbAorICogICBnZXRzIHJlcGxheWVkLgorICoKKyAqIFdlIGNhbiBnZXQgaW50ZXJhY3Rpb25zIGJldHdlZW4gcmV2b2tlcyBhbmQgbmV3IGxvZyBkYXRhIHdpdGhpbiBhCisgKiBzaW5nbGUgdHJhbnNhY3Rpb246CisgKgorICogQmxvY2sgaXMgcmV2b2tlZCBhbmQgdGhlbiBqb3VybmFsZWQ6CisgKiAgIFRoZSBkZXNpcmVkIGVuZCByZXN1bHQgaXMgdGhlIGpvdXJuYWxpbmcgb2YgdGhlIG5ldyBibG9jaywgc28gd2UgCisgKiAgIGNhbmNlbCB0aGUgcmV2b2tlIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cy4KKyAqCisgKiBCbG9jayBpcyBqb3VybmFsZWQgYW5kIHRoZW4gcmV2b2tlZDoKKyAqICAgVGhlIHJldm9rZSBtdXN0IHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSB3cml0ZSBvZiB0aGUgYmxvY2ssIHNvIHdlCisgKiAgIG5lZWQgZWl0aGVyIHRvIGNhbmNlbCB0aGUgam91cm5hbCBlbnRyeSBvciB0byB3cml0ZSB0aGUgcmV2b2tlCisgKiAgIGxhdGVyIGluIHRoZSBsb2cgdGhhbiB0aGUgbG9nIGJsb2NrLiAgSW4gdGhpcyBjYXNlLCB3ZSBjaG9vc2UgdGhlCisgKiAgIGxhdHRlcjogam91cm5hbGluZyBhIGJsb2NrIGNhbmNlbHMgYW55IHJldm9rZSByZWNvcmQgZm9yIHRoYXQgYmxvY2sKKyAqICAgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24sIHNvIGFueSByZXZva2UgZm9yIHRoYXQgYmxvY2sgaW4gdGhlCisgKiAgIHRyYW5zYWN0aW9uIG11c3QgaGF2ZSBoYXBwZW5lZCBhZnRlciB0aGUgYmxvY2sgd2FzIGpvdXJuYWxlZCBhbmQgc28KKyAqICAgdGhlIHJldm9rZSBtdXN0IHRha2UgcHJlY2VkZW5jZS4KKyAqCisgKiBCbG9jayBpcyByZXZva2VkIGFuZCB0aGVuIHdyaXR0ZW4gYXMgZGF0YTogCisgKiAgIFRoZSBkYXRhIHdyaXRlIGlzIGFsbG93ZWQgdG8gc3VjY2VlZCwgYnV0IHRoZSByZXZva2UgaXMgX25vdF8KKyAqICAgY2FuY2VsbGVkLiAgV2Ugc3RpbGwgbmVlZCB0byBwcmV2ZW50IG9sZCBsb2cgcmVjb3JkcyBmcm9tCisgKiAgIG92ZXJ3cml0aW5nIHRoZSBuZXcgZGF0YS4gIFdlIGRvbid0IGV2ZW4gbmVlZCB0byBjbGVhciB0aGUgcmV2b2tlCisgKiAgIGJpdCBoZXJlLgorICoKKyAqIFJldm9rZSBpbmZvcm1hdGlvbiBvbiBidWZmZXJzIGlzIGEgdHJpLXN0YXRlIHZhbHVlOgorICoKKyAqIFJldm9rZVZhbGlkIGNsZWFyOglubyBjYWNoZWQgcmV2b2tlIHN0YXR1cywgbmVlZCB0byBsb29rIGl0IHVwCisgKiBSZXZva2VWYWxpZCBzZXQsIFJldm9rZWQgY2xlYXI6CisgKgkJCWJ1ZmZlciBoYXMgbm90IGJlZW4gcmV2b2tlZCwgYW5kIGNhbmNlbF9yZXZva2UKKyAqCQkJbmVlZCBkbyBub3RoaW5nLgorICogUmV2b2tlVmFsaWQgc2V0LCBSZXZva2VkIHNldDoKKyAqCQkJYnVmZmVyIGhhcyBiZWVuIHJldm9rZWQuICAKKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlICJqZnNfdXNlci5oIgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjZW5kaWYKKworc3RhdGljIGttZW1fY2FjaGVfdCAqcmV2b2tlX3JlY29yZF9jYWNoZTsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKnJldm9rZV90YWJsZV9jYWNoZTsKKworLyogRWFjaCByZXZva2UgcmVjb3JkIHJlcHJlc2VudHMgb25lIHNpbmdsZSByZXZva2VkIGJsb2NrLiAgRHVyaW5nCisgICBqb3VybmFsIHJlcGxheSwgdGhpcyBpbnZvbHZlcyByZWNvcmRpbmcgdGhlIHRyYW5zYWN0aW9uIElEIG9mIHRoZQorICAgbGFzdCB0cmFuc2FjdGlvbiB0byByZXZva2UgdGhpcyBibG9jay4gKi8KKworc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgCit7CisJc3RydWN0IGxpc3RfaGVhZCAgaGFzaDsKKwl0aWRfdAkJICBzZXF1ZW5jZTsJLyogVXNlZCBmb3IgcmVjb3Zlcnkgb25seSAqLworCXVuc2lnbmVkIGxvbmcJICBibG9ja25yOworfTsKKworCisvKiBUaGUgcmV2b2tlIHRhYmxlIGlzIGp1c3QgYSBzaW1wbGUgaGFzaCB0YWJsZSBvZiByZXZva2UgcmVjb3Jkcy4gKi8KK3N0cnVjdCBqYmRfcmV2b2tlX3RhYmxlX3MKK3sKKwkvKiBJdCBpcyBjb25jZWl2YWJsZSB0aGF0IHdlIG1pZ2h0IHdhbnQgYSBsYXJnZXIgaGFzaCB0YWJsZQorCSAqIGZvciByZWNvdmVyeS4gIE11c3QgYmUgYSBwb3dlciBvZiB0d28uICovCisJaW50CQkgIGhhc2hfc2l6ZTsgCisJaW50CQkgIGhhc2hfc2hpZnQ7IAorCXN0cnVjdCBsaXN0X2hlYWQgKmhhc2hfdGFibGU7Cit9OworCisKKyNpZmRlZiBfX0tFUk5FTF9fCitzdGF0aWMgdm9pZCB3cml0ZV9vbmVfcmV2b2tlX3JlY29yZChqb3VybmFsX3QgKiwgdHJhbnNhY3Rpb25fdCAqLAorCQkJCSAgICBzdHJ1Y3Qgam91cm5hbF9oZWFkICoqLCBpbnQgKiwKKwkJCQkgICAgc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgKik7CitzdGF0aWMgdm9pZCBmbHVzaF9kZXNjcmlwdG9yKGpvdXJuYWxfdCAqLCBzdHJ1Y3Qgam91cm5hbF9oZWFkICosIGludCk7CisjZW5kaWYKKworLyogVXRpbGl0eSBmdW5jdGlvbnMgdG8gbWFpbnRhaW4gdGhlIHJldm9rZSB0YWJsZSAqLworCisvKiBCb3Jyb3dlZCBmcm9tIGJ1ZmZlci5jOiB0aGlzIGlzIGEgdHJpZWQgYW5kIHRlc3RlZCBibG9jayBoYXNoIGZ1bmN0aW9uICovCitzdGF0aWMgaW5saW5lIGludCBoYXNoKGpvdXJuYWxfdCAqam91cm5hbCwgdW5zaWduZWQgbG9uZyBibG9jaykKK3sKKwlzdHJ1Y3QgamJkX3Jldm9rZV90YWJsZV9zICp0YWJsZSA9IGpvdXJuYWwtPmpfcmV2b2tlOworCWludCBoYXNoX3NoaWZ0ID0gdGFibGUtPmhhc2hfc2hpZnQ7CisKKwlyZXR1cm4gKChibG9jayA8PCAoaGFzaF9zaGlmdCAtIDYpKSBeCisJCShibG9jayA+PiAxMykgXgorCQkoYmxvY2sgPDwgKGhhc2hfc2hpZnQgLSAxMikpKSAmICh0YWJsZS0+aGFzaF9zaXplIC0gMSk7Cit9CisKK2ludCBpbnNlcnRfcmV2b2tlX2hhc2goam91cm5hbF90ICpqb3VybmFsLCB1bnNpZ25lZCBsb25nIGJsb2NrbnIsIHRpZF90IHNlcSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2xpc3Q7CisJc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgKnJlY29yZDsKKworcmVwZWF0OgorCXJlY29yZCA9IGttZW1fY2FjaGVfYWxsb2MocmV2b2tlX3JlY29yZF9jYWNoZSwgR0ZQX05PRlMpOworCWlmICghcmVjb3JkKQorCQlnb3RvIG9vbTsKKworCXJlY29yZC0+c2VxdWVuY2UgPSBzZXE7CisJcmVjb3JkLT5ibG9ja25yID0gYmxvY2tucjsKKwloYXNoX2xpc3QgPSAmam91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGVbaGFzaChqb3VybmFsLCBibG9ja25yKV07CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3Jldm9rZV9sb2NrKTsKKwlsaXN0X2FkZCgmcmVjb3JkLT5oYXNoLCBoYXNoX2xpc3QpOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3Jldm9rZV9sb2NrKTsKKwlyZXR1cm4gMDsKKworb29tOgorCWlmICgham91cm5hbF9vb21fcmV0cnkpCisJCXJldHVybiAtRU5PTUVNOworCWpiZF9kZWJ1ZygxLCAiRU5PTUVNIGluICVzLCByZXRyeWluZ1xuIiwgX19GVU5DVElPTl9fKTsKKwl5aWVsZCgpOworCWdvdG8gcmVwZWF0OworfQorCisvKiBGaW5kIGEgcmV2b2tlIHJlY29yZCBpbiB0aGUgam91cm5hbCdzIGhhc2ggdGFibGUuICovCisKK3N0YXRpYyBzdHJ1Y3QgamJkX3Jldm9rZV9yZWNvcmRfcyAqZmluZF9yZXZva2VfcmVjb3JkKGpvdXJuYWxfdCAqam91cm5hbCwKKwkJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tucikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2xpc3Q7CisJc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgKnJlY29yZDsKKworCWhhc2hfbGlzdCA9ICZqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF90YWJsZVtoYXNoKGpvdXJuYWwsIGJsb2NrbnIpXTsKKworCXNwaW5fbG9jaygmam91cm5hbC0+al9yZXZva2VfbG9jayk7CisJcmVjb3JkID0gKHN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zICopIGhhc2hfbGlzdC0+bmV4dDsKKwl3aGlsZSAoJihyZWNvcmQtPmhhc2gpICE9IGhhc2hfbGlzdCkgeworCQlpZiAocmVjb3JkLT5ibG9ja25yID09IGJsb2NrbnIpIHsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3Jldm9rZV9sb2NrKTsKKwkJCXJldHVybiByZWNvcmQ7CisJCX0KKwkJcmVjb3JkID0gKHN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zICopIHJlY29yZC0+aGFzaC5uZXh0OworCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9yZXZva2VfbG9jayk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBfX2luaXQgam91cm5hbF9pbml0X3Jldm9rZV9jYWNoZXModm9pZCkKK3sKKwlyZXZva2VfcmVjb3JkX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInJldm9rZV9yZWNvcmQiLAorCQkJCQkgICBzaXplb2Yoc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MpLAorCQkJCQkgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwsIE5VTEwpOworCWlmIChyZXZva2VfcmVjb3JkX2NhY2hlID09IDApCisJCXJldHVybiAtRU5PTUVNOworCisJcmV2b2tlX3RhYmxlX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInJldm9rZV90YWJsZSIsCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgamJkX3Jldm9rZV90YWJsZV9zKSwKKwkJCQkJICAgMCwgMCwgTlVMTCwgTlVMTCk7CisJaWYgKHJldm9rZV90YWJsZV9jYWNoZSA9PSAwKSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShyZXZva2VfcmVjb3JkX2NhY2hlKTsKKwkJcmV2b2tlX3JlY29yZF9jYWNoZSA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBqb3VybmFsX2Rlc3Ryb3lfcmV2b2tlX2NhY2hlcyh2b2lkKQoreworCWttZW1fY2FjaGVfZGVzdHJveShyZXZva2VfcmVjb3JkX2NhY2hlKTsKKwlyZXZva2VfcmVjb3JkX2NhY2hlID0gTlVMTDsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kocmV2b2tlX3RhYmxlX2NhY2hlKTsKKwlyZXZva2VfdGFibGVfY2FjaGUgPSBOVUxMOworfQorCisvKiBJbml0aWFsaXNlIHRoZSByZXZva2UgdGFibGUgZm9yIGEgZ2l2ZW4gam91cm5hbCB0byBhIGdpdmVuIHNpemUuICovCisKK2ludCBqb3VybmFsX2luaXRfcmV2b2tlKGpvdXJuYWxfdCAqam91cm5hbCwgaW50IGhhc2hfc2l6ZSkKK3sKKwlpbnQgc2hpZnQsIHRtcDsKKworCUpfQVNTRVJUIChqb3VybmFsLT5qX3Jldm9rZV90YWJsZVswXSA9PSBOVUxMKTsKKworCXNoaWZ0ID0gMDsKKwl0bXAgPSBoYXNoX3NpemU7CisJd2hpbGUoKHRtcCA+Pj0gMVVMKSAhPSAwVUwpCisJCXNoaWZ0Kys7CisKKwlqb3VybmFsLT5qX3Jldm9rZV90YWJsZVswXSA9IGttZW1fY2FjaGVfYWxsb2MocmV2b2tlX3RhYmxlX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdKQorCQlyZXR1cm4gLUVOT01FTTsKKwlqb3VybmFsLT5qX3Jldm9rZSA9IGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdOworCisJLyogQ2hlY2sgdGhhdCB0aGUgaGFzaF9zaXplIGlzIGEgcG93ZXIgb2YgdHdvICovCisJSl9BU1NFUlQgKChoYXNoX3NpemUgJiAoaGFzaF9zaXplLTEpKSA9PSAwKTsKKworCWpvdXJuYWwtPmpfcmV2b2tlLT5oYXNoX3NpemUgPSBoYXNoX3NpemU7CisKKwlqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF9zaGlmdCA9IHNoaWZ0OworCisJam91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGUgPQorCQlrbWFsbG9jKGhhc2hfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF90YWJsZSkgeworCQlrbWVtX2NhY2hlX2ZyZWUocmV2b2tlX3RhYmxlX2NhY2hlLCBqb3VybmFsLT5qX3Jldm9rZV90YWJsZVswXSk7CisJCWpvdXJuYWwtPmpfcmV2b2tlID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZm9yICh0bXAgPSAwOyB0bXAgPCBoYXNoX3NpemU7IHRtcCsrKQorCQlJTklUX0xJU1RfSEVBRCgmam91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGVbdG1wXSk7CisKKwlqb3VybmFsLT5qX3Jldm9rZV90YWJsZVsxXSA9IGttZW1fY2FjaGVfYWxsb2MocmV2b2tlX3RhYmxlX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzFdKSB7CisJCWtmcmVlKGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdLT5oYXNoX3RhYmxlKTsKKwkJa21lbV9jYWNoZV9mcmVlKHJldm9rZV90YWJsZV9jYWNoZSwgam91cm5hbC0+al9yZXZva2VfdGFibGVbMF0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlqb3VybmFsLT5qX3Jldm9rZSA9IGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzFdOworCisJLyogQ2hlY2sgdGhhdCB0aGUgaGFzaF9zaXplIGlzIGEgcG93ZXIgb2YgdHdvICovCisJSl9BU1NFUlQgKChoYXNoX3NpemUgJiAoaGFzaF9zaXplLTEpKSA9PSAwKTsKKworCWpvdXJuYWwtPmpfcmV2b2tlLT5oYXNoX3NpemUgPSBoYXNoX3NpemU7CisKKwlqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF9zaGlmdCA9IHNoaWZ0OworCisJam91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGUgPQorCQlrbWFsbG9jKGhhc2hfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF90YWJsZSkgeworCQlrZnJlZShqb3VybmFsLT5qX3Jldm9rZV90YWJsZVswXS0+aGFzaF90YWJsZSk7CisJCWttZW1fY2FjaGVfZnJlZShyZXZva2VfdGFibGVfY2FjaGUsIGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdKTsKKwkJa21lbV9jYWNoZV9mcmVlKHJldm9rZV90YWJsZV9jYWNoZSwgam91cm5hbC0+al9yZXZva2VfdGFibGVbMV0pOworCQlqb3VybmFsLT5qX3Jldm9rZSA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAodG1wID0gMDsgdG1wIDwgaGFzaF9zaXplOyB0bXArKykKKwkJSU5JVF9MSVNUX0hFQUQoJmpvdXJuYWwtPmpfcmV2b2tlLT5oYXNoX3RhYmxlW3RtcF0pOworCisJc3Bpbl9sb2NrX2luaXQoJmpvdXJuYWwtPmpfcmV2b2tlX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qIERlc3RveSBhIGpvdXJuYWwncyByZXZva2UgdGFibGUuICBUaGUgdGFibGUgbXVzdCBhbHJlYWR5IGJlIGVtcHR5ISAqLworCit2b2lkIGpvdXJuYWxfZGVzdHJveV9yZXZva2Uoam91cm5hbF90ICpqb3VybmFsKQoreworCXN0cnVjdCBqYmRfcmV2b2tlX3RhYmxlX3MgKnRhYmxlOworCXN0cnVjdCBsaXN0X2hlYWQgKmhhc2hfbGlzdDsKKwlpbnQgaTsKKworCXRhYmxlID0gam91cm5hbC0+al9yZXZva2VfdGFibGVbMF07CisJaWYgKCF0YWJsZSkKKwkJcmV0dXJuOworCisJZm9yIChpPTA7IGk8dGFibGUtPmhhc2hfc2l6ZTsgaSsrKSB7CisJCWhhc2hfbGlzdCA9ICZ0YWJsZS0+aGFzaF90YWJsZVtpXTsKKwkJSl9BU1NFUlQgKGxpc3RfZW1wdHkoaGFzaF9saXN0KSk7CisJfQorCisJa2ZyZWUodGFibGUtPmhhc2hfdGFibGUpOworCWttZW1fY2FjaGVfZnJlZShyZXZva2VfdGFibGVfY2FjaGUsIHRhYmxlKTsKKwlqb3VybmFsLT5qX3Jldm9rZSA9IE5VTEw7CisKKwl0YWJsZSA9IGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzFdOworCWlmICghdGFibGUpCisJCXJldHVybjsKKworCWZvciAoaT0wOyBpPHRhYmxlLT5oYXNoX3NpemU7IGkrKykgeworCQloYXNoX2xpc3QgPSAmdGFibGUtPmhhc2hfdGFibGVbaV07CisJCUpfQVNTRVJUIChsaXN0X2VtcHR5KGhhc2hfbGlzdCkpOworCX0KKworCWtmcmVlKHRhYmxlLT5oYXNoX3RhYmxlKTsKKwlrbWVtX2NhY2hlX2ZyZWUocmV2b2tlX3RhYmxlX2NhY2hlLCB0YWJsZSk7CisJam91cm5hbC0+al9yZXZva2UgPSBOVUxMOworfQorCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qIAorICogam91cm5hbF9yZXZva2U6IHJldm9rZSBhIGdpdmVuIGJ1ZmZlcl9oZWFkIGZyb20gdGhlIGpvdXJuYWwuICBUaGlzCisgKiBwcmV2ZW50cyB0aGUgYmxvY2sgZnJvbSBiZWluZyByZXBsYXllZCBkdXJpbmcgcmVjb3ZlcnkgaWYgd2UgdGFrZSBhCisgKiBjcmFzaCBhZnRlciB0aGlzIGN1cnJlbnQgdHJhbnNhY3Rpb24gY29tbWl0cy4gIEFueSBzdWJzZXF1ZW50CisgKiBtZXRhZGF0YSB3cml0ZXMgb2YgdGhlIGJ1ZmZlciBpbiB0aGlzIHRyYW5zYWN0aW9uIGNhbmNlbCB0aGUKKyAqIHJldm9rZS4gIAorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGNhbGwgbWF5IGJsb2NrIC0tLSBpdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIG1ha2UKKyAqIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gZnVydGhlciBjYWxscyB0byBqb3VybmFsX3dyaXRlX21ldGFkYXRhCisgKiBiZWZvcmUgdGhlIHJldm9rZSBpcyBjb21wbGV0ZS4gIEluIGV4dDMsIHRoaXMgaW1wbGllcyBjYWxsaW5nIHRoZQorICogcmV2b2tlIGJlZm9yZSBjbGVhcmluZyB0aGUgYmxvY2sgYml0bWFwIHdoZW4gd2UgYXJlIGRlbGV0aW5nCisgKiBtZXRhZGF0YS4gCisgKgorICogUmV2b2tlIHBlcmZvcm1zIGEgam91cm5hbF9mb3JnZXQgb24gYW55IGJ1ZmZlcl9oZWFkIHBhc3NlZCBpbiBhcyBhCisgKiBwYXJhbWV0ZXIsIGJ1dCBkb2VzIF9ub3RfIGZvcmdldCB0aGUgYnVmZmVyX2hlYWQgaWYgdGhlIGJoIHdhcyBvbmx5CisgKiBmb3VuZCBpbXBsaWNpdGx5LiAKKyAqCisgKiBiaF9pbiBtYXkgbm90IGJlIGEgam91cm5hbGxlZCBidWZmZXIgLSBpdCBtYXkgaGF2ZSBjb21lIG9mZgorICogdGhlIGhhc2ggdGFibGVzIHdpdGhvdXQgYW4gYXR0YWNoZWQgam91cm5hbF9oZWFkLgorICoKKyAqIElmIGJoX2luIGlzIG5vbi16ZXJvLCBqb3VybmFsX3Jldm9rZSgpIHdpbGwgZGVjcmVtZW50IGl0cyBiX2NvdW50CisgKiBieSBvbmUuCisgKi8KKworaW50IGpvdXJuYWxfcmV2b2tlKGhhbmRsZV90ICpoYW5kbGUsIHVuc2lnbmVkIGxvbmcgYmxvY2tuciwgCisJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfaW4pCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJam91cm5hbF90ICpqb3VybmFsOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisJaW50IGVycjsKKworCW1pZ2h0X3NsZWVwKCk7CisJaWYgKGJoX2luKQorCQlCVUZGRVJfVFJBQ0UoYmhfaW4sICJlbnRlciIpOworCisJam91cm5hbCA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF9qb3VybmFsOworCWlmICgham91cm5hbF9zZXRfZmVhdHVyZXMoam91cm5hbCwgMCwgMCwgSkZTX0ZFQVRVUkVfSU5DT01QQVRfUkVWT0tFKSl7CisJCUpfQVNTRVJUICghIkNhbm5vdCBzZXQgcmV2b2tlIGZlYXR1cmUhIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJkZXYgPSBqb3VybmFsLT5qX2ZzX2RldjsKKwliaCA9IGJoX2luOworCisJaWYgKCFiaCkgeworCQliaCA9IF9fZmluZF9nZXRfYmxvY2soYmRldiwgYmxvY2tuciwgam91cm5hbC0+al9ibG9ja3NpemUpOworCQlpZiAoYmgpCisJCQlCVUZGRVJfVFJBQ0UoYmgsICJmb3VuZCBvbiBoYXNoIik7CisJfQorI2lmZGVmIEpCRF9FWFBFTlNJVkVfQ0hFQ0tJTkcKKwllbHNlIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDI7CisKKwkJLyogSWYgdGhlcmUgaXMgYSBkaWZmZXJlbnQgYnVmZmVyX2hlYWQgbHlpbmcgYXJvdW5kIGluCisJCSAqIG1lbW9yeSBhbnl3aGVyZS4uLiAqLworCQliaDIgPSBfX2ZpbmRfZ2V0X2Jsb2NrKGJkZXYsIGJsb2NrbnIsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwkJaWYgKGJoMikgeworCQkJLyogLi4uIGFuZCBpdCBoYXMgUmV2b2tlVmFsaWQgc3RhdHVzLi4uICovCisJCQlpZiAoYmgyICE9IGJoICYmIGJ1ZmZlcl9yZXZva2V2YWxpZChiaDIpKQorCQkJCS8qIC4uLnRoZW4gaXQgYmV0dGVyIGJlIHJldm9rZWQgdG9vLAorCQkJCSAqIHNpbmNlIGl0J3MgaWxsZWdhbCB0byBjcmVhdGUgYSByZXZva2UKKwkJCQkgKiByZWNvcmQgYWdhaW5zdCBhIGJ1ZmZlcl9oZWFkIHdoaWNoIGlzCisJCQkJICogbm90IG1hcmtlZCByZXZva2VkIC0tLSB0aGF0IHdvdWxkCisJCQkJICogcmlzayBtaXNzaW5nIGEgc3Vic2VxdWVudCByZXZva2UKKwkJCQkgKiBjYW5jZWwuICovCisJCQkJSl9BU1NFUlRfQkgoYmgyLCBidWZmZXJfcmV2b2tlZChiaDIpKTsKKwkJCXB1dF9iaChiaDIpOworCQl9CisJfQorI2VuZGlmCisKKwkvKiBXZSByZWFsbHkgb3VnaHQgbm90IGV2ZXIgdG8gcmV2b2tlIHR3aWNlIGluIGEgcm93IHdpdGhvdXQKKyAgICAgICAgICAgZmlyc3QgaGF2aW5nIHRoZSByZXZva2UgY2FuY2VsbGVkOiBpdCdzIGlsbGVnYWwgdG8gZnJlZSBhCisgICAgICAgICAgIGJsb2NrIHR3aWNlIHdpdGhvdXQgYWxsb2NhdGluZyBpdCBpbiBiZXR3ZWVuISAqLworCWlmIChiaCkgeworCQlpZiAoIUpfRVhQRUNUX0JIKGJoLCAhYnVmZmVyX3Jldm9rZWQoYmgpLAorCQkJCSAiaW5jb25zaXN0ZW50IGRhdGEgb24gZGlzayIpKSB7CisJCQlpZiAoIWJoX2luKQorCQkJCWJyZWxzZShiaCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlzZXRfYnVmZmVyX3Jldm9rZWQoYmgpOworCQlzZXRfYnVmZmVyX3Jldm9rZXZhbGlkKGJoKTsKKwkJaWYgKGJoX2luKSB7CisJCQlCVUZGRVJfVFJBQ0UoYmhfaW4sICJjYWxsIGpvdXJuYWxfZm9yZ2V0Iik7CisJCQlqb3VybmFsX2ZvcmdldChoYW5kbGUsIGJoX2luKTsKKwkJfSBlbHNlIHsKKwkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgYnJlbHNlIik7CisJCQlfX2JyZWxzZShiaCk7CisJCX0KKwl9CisKKwlqYmRfZGVidWcoMiwgImluc2VydCByZXZva2UgZm9yIGJsb2NrICVsdSwgYmhfaW49JXBcbiIsIGJsb2NrbnIsIGJoX2luKTsKKwllcnIgPSBpbnNlcnRfcmV2b2tlX2hhc2goam91cm5hbCwgYmxvY2tuciwKKwkJCQloYW5kbGUtPmhfdHJhbnNhY3Rpb24tPnRfdGlkKTsKKwlCVUZGRVJfVFJBQ0UoYmhfaW4sICJleGl0Iik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIENhbmNlbCBhbiBvdXRzdGFuZGluZyByZXZva2UuICBGb3IgdXNlIG9ubHkgaW50ZXJuYWxseSBieSB0aGUKKyAqIGpvdXJuYWxpbmcgY29kZSAoY2FsbGVkIGZyb20gam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKS4KKyAqCisgKiBXZSB0cnVzdCBidWZmZXJfcmV2b2tlZCgpIG9uIHRoZSBidWZmZXIgaWYgdGhlIGJ1ZmZlciBpcyBhbHJlYWR5CisgKiBiZWluZyBqb3VybmFsZWQ6IGlmIHRoZXJlIGlzIG5vIHJldm9rZSBwZW5kaW5nIG9uIHRoZSBidWZmZXIsIHRoZW4gd2UKKyAqIGRvbid0IGRvIGFueXRoaW5nIGhlcmUuCisgKgorICogVGhpcyB3b3VsZCBicmVhayBpZiBpdCB3ZXJlIHBvc3NpYmxlIGZvciBhIGJ1ZmZlciB0byBiZSByZXZva2VkIGFuZAorICogZGlzY2FyZGVkLCBhbmQgdGhlbiByZWFsbG9jYXRlZCB3aXRoaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24uICBJbiBzdWNoCisgKiBhIGNhc2Ugd2Ugd291bGQgaGF2ZSBsb3N0IHRoZSByZXZva2VkIGJpdCwgYnV0IHdoZW4gd2UgYXJyaXZlZCBoZXJlCisgKiB0aGUgc2Vjb25kIHRpbWUgd2Ugd291bGQgc3RpbGwgaGF2ZSBhIHBlbmRpbmcgcmV2b2tlIHRvIGNhbmNlbC4gIFNvLAorICogZG8gbm90IHRydXN0IHRoZSBSZXZva2VkIGJpdCBvbiBidWZmZXJzIHVubGVzcyBSZXZva2VWYWxpZCBpcyBhbHNvCisgKiBzZXQuCisgKgorICogVGhlIGNhbGxlciBtdXN0IGhhdmUgdGhlIGpvdXJuYWwgbG9ja2VkLgorICovCitpbnQgam91cm5hbF9jYW5jZWxfcmV2b2tlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCXN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zICpyZWNvcmQ7CisJam91cm5hbF90ICpqb3VybmFsID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uLT50X2pvdXJuYWw7CisJaW50IG5lZWRfY2FuY2VsOworCWludCBkaWRfcmV2b2tlID0gMDsJLyogYWtwbTogZGVidWcgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gamgyYmgoamgpOworCisJamJkX2RlYnVnKDQsICJqb3VybmFsX2hlYWQgJXAsIGNhbmNlbGxpbmcgcmV2b2tlXG4iLCBqaCk7CisKKwkvKiBJcyB0aGUgZXhpc3RpbmcgUmV2b2tlIGJpdCB2YWxpZD8gIElmIHNvLCB3ZSB0cnVzdCBpdCwgYW5kCisJICogb25seSBwZXJmb3JtIHRoZSBmdWxsIGNhbmNlbCBpZiB0aGUgcmV2b2tlIGJpdCBpcyBzZXQuICBJZgorCSAqIG5vdCwgd2UgY2FuJ3QgdHJ1c3QgdGhlIHJldm9rZSBiaXQsIGFuZCB3ZSBuZWVkIHRvIGRvIHRoZQorCSAqIGZ1bGwgc2VhcmNoIGZvciBhIHJldm9rZSByZWNvcmQuICovCisJaWYgKHRlc3Rfc2V0X2J1ZmZlcl9yZXZva2V2YWxpZChiaCkpIHsKKwkJbmVlZF9jYW5jZWwgPSB0ZXN0X2NsZWFyX2J1ZmZlcl9yZXZva2VkKGJoKTsKKwl9IGVsc2UgeworCQluZWVkX2NhbmNlbCA9IDE7CisJCWNsZWFyX2J1ZmZlcl9yZXZva2VkKGJoKTsKKwl9CisKKwlpZiAobmVlZF9jYW5jZWwpIHsKKwkJcmVjb3JkID0gZmluZF9yZXZva2VfcmVjb3JkKGpvdXJuYWwsIGJoLT5iX2Jsb2NrbnIpOworCQlpZiAocmVjb3JkKSB7CisJCQlqYmRfZGVidWcoNCwgImNhbmNlbGxlZCBleGlzdGluZyByZXZva2Ugb24gIgorCQkJCSAgImJsb2NrbnIgJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKwkJCXNwaW5fbG9jaygmam91cm5hbC0+al9yZXZva2VfbG9jayk7CisJCQlsaXN0X2RlbCgmcmVjb3JkLT5oYXNoKTsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3Jldm9rZV9sb2NrKTsKKwkJCWttZW1fY2FjaGVfZnJlZShyZXZva2VfcmVjb3JkX2NhY2hlLCByZWNvcmQpOworCQkJZGlkX3Jldm9rZSA9IDE7CisJCX0KKwl9CisKKyNpZmRlZiBKQkRfRVhQRU5TSVZFX0NIRUNLSU5HCisJLyogVGhlcmUgYmV0dGVyIG5vdCBiZSBvbmUgbGVmdCBiZWhpbmQgYnkgbm93ISAqLworCXJlY29yZCA9IGZpbmRfcmV2b2tlX3JlY29yZChqb3VybmFsLCBiaC0+Yl9ibG9ja25yKTsKKwlKX0FTU0VSVF9KSChqaCwgcmVjb3JkID09IE5VTEwpOworI2VuZGlmCisKKwkvKiBGaW5hbGx5LCBoYXZlIHdlIGp1c3QgY2xlYXJlZCByZXZva2Ugb24gYW4gdW5oYXNoZWQKKwkgKiBidWZmZXJfaGVhZD8gIElmIHNvLCB3ZSdkIGJldHRlciBtYWtlIHN1cmUgd2UgY2xlYXIgdGhlCisJICogcmV2b2tlZCBzdGF0dXMgb24gYW55IGhhc2hlZCBhbGlhcyB0b28sIG90aGVyd2lzZSB0aGUgcmV2b2tlCisJICogc3RhdGUgbWFjaGluZSB3aWxsIGdldCB2ZXJ5IHVwc2V0IGxhdGVyIG9uLiAqLworCWlmIChuZWVkX2NhbmNlbCkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMjsKKwkJYmgyID0gX19maW5kX2dldF9ibG9jayhiaC0+Yl9iZGV2LCBiaC0+Yl9ibG9ja25yLCBiaC0+Yl9zaXplKTsKKwkJaWYgKGJoMikgeworCQkJaWYgKGJoMiAhPSBiaCkKKwkJCQljbGVhcl9idWZmZXJfcmV2b2tlZChiaDIpOworCQkJX19icmVsc2UoYmgyKTsKKwkJfQorCX0KKwlyZXR1cm4gZGlkX3Jldm9rZTsKK30KKworLyogam91cm5hbF9zd2l0Y2hfcmV2b2tlIHRhYmxlIHNlbGVjdCBqX3Jldm9rZSBmb3IgbmV4dCB0cmFuc2FjdGlvbgorICogd2UgZG8gbm90IHdhbnQgdG8gc3VzcGVuZCBhbnkgcHJvY2Vzc2luZyB1bnRpbCBhbGwgcmV2b2tlcyBhcmUKKyAqIHdyaXR0ZW4gLWJ6enoKKyAqLwordm9pZCBqb3VybmFsX3N3aXRjaF9yZXZva2VfdGFibGUoam91cm5hbF90ICpqb3VybmFsKQoreworCWludCBpOworCisJaWYgKGpvdXJuYWwtPmpfcmV2b2tlID09IGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdKQorCQlqb3VybmFsLT5qX3Jldm9rZSA9IGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzFdOworCWVsc2UKKwkJam91cm5hbC0+al9yZXZva2UgPSBqb3VybmFsLT5qX3Jldm9rZV90YWJsZVswXTsKKworCWZvciAoaSA9IDA7IGkgPCBqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF9zaXplOyBpKyspIAorCQlJTklUX0xJU1RfSEVBRCgmam91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGVbaV0pOworfQorCisvKgorICogV3JpdGUgcmV2b2tlIHJlY29yZHMgdG8gdGhlIGpvdXJuYWwgZm9yIGFsbCBlbnRyaWVzIGluIHRoZSBjdXJyZW50CisgKiByZXZva2UgaGFzaCwgZGVsZXRpbmcgdGhlIGVudHJpZXMgYXMgd2UgZ28uCisgKgorICogQ2FsbGVkIHdpdGggdGhlIGpvdXJuYWwgbG9jayBoZWxkLgorICovCisKK3ZvaWQgam91cm5hbF93cml0ZV9yZXZva2VfcmVjb3Jkcyhqb3VybmFsX3QgKmpvdXJuYWwsIAorCQkJCSAgdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24pCit7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqZGVzY3JpcHRvcjsKKwlzdHJ1Y3QgamJkX3Jldm9rZV9yZWNvcmRfcyAqcmVjb3JkOworCXN0cnVjdCBqYmRfcmV2b2tlX3RhYmxlX3MgKnJldm9rZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2xpc3Q7CisJaW50IGksIG9mZnNldCwgY291bnQ7CisKKwlkZXNjcmlwdG9yID0gTlVMTDsgCisJb2Zmc2V0ID0gMDsKKwljb3VudCA9IDA7CisKKwkvKiBzZWxlY3QgcmV2b2tlIHRhYmxlIGZvciBjb21taXR0aW5nIHRyYW5zYWN0aW9uICovCisJcmV2b2tlID0gam91cm5hbC0+al9yZXZva2UgPT0gam91cm5hbC0+al9yZXZva2VfdGFibGVbMF0gPworCQlqb3VybmFsLT5qX3Jldm9rZV90YWJsZVsxXSA6IGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdOworCisJZm9yIChpID0gMDsgaSA8IHJldm9rZS0+aGFzaF9zaXplOyBpKyspIHsKKwkJaGFzaF9saXN0ID0gJnJldm9rZS0+aGFzaF90YWJsZVtpXTsKKworCQl3aGlsZSAoIWxpc3RfZW1wdHkoaGFzaF9saXN0KSkgeworCQkJcmVjb3JkID0gKHN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zICopIAorCQkJCWhhc2hfbGlzdC0+bmV4dDsKKwkJCXdyaXRlX29uZV9yZXZva2VfcmVjb3JkKGpvdXJuYWwsIHRyYW5zYWN0aW9uLAorCQkJCQkJJmRlc2NyaXB0b3IsICZvZmZzZXQsIAorCQkJCQkJcmVjb3JkKTsKKwkJCWNvdW50Kys7CisJCQlsaXN0X2RlbCgmcmVjb3JkLT5oYXNoKTsKKwkJCWttZW1fY2FjaGVfZnJlZShyZXZva2VfcmVjb3JkX2NhY2hlLCByZWNvcmQpOworCQl9CisJfQorCWlmIChkZXNjcmlwdG9yKQorCQlmbHVzaF9kZXNjcmlwdG9yKGpvdXJuYWwsIGRlc2NyaXB0b3IsIG9mZnNldCk7CisJamJkX2RlYnVnKDEsICJXcm90ZSAlZCByZXZva2UgcmVjb3Jkc1xuIiwgY291bnQpOworfQorCisvKiAKKyAqIFdyaXRlIG91dCBvbmUgcmV2b2tlIHJlY29yZC4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGRlc2NyaXB0b3IKKyAqIGJsb2NrIGlmIHRoZSBvbGQgb25lIGlzIGZ1bGwgb3IgaWYgd2UgaGF2ZSBub3QgYWxyZWFkeSBjcmVhdGVkIG9uZS4gIAorICovCisKK3N0YXRpYyB2b2lkIHdyaXRlX29uZV9yZXZva2VfcmVjb3JkKGpvdXJuYWxfdCAqam91cm5hbCwgCisJCQkJICAgIHRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uLAorCQkJCSAgICBzdHJ1Y3Qgam91cm5hbF9oZWFkICoqZGVzY3JpcHRvcnAsIAorCQkJCSAgICBpbnQgKm9mZnNldHAsCisJCQkJICAgIHN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zICpyZWNvcmQpCit7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqZGVzY3JpcHRvcjsKKwlpbnQgb2Zmc2V0OworCWpvdXJuYWxfaGVhZGVyX3QgKmhlYWRlcjsKKworCS8qIElmIHdlIGFyZSBhbHJlYWR5IGFib3J0aW5nLCB0aGlzIGFsbCBiZWNvbWVzIGEgbm9vcC4gIFdlCisgICAgICAgICAgIHN0aWxsIG5lZWQgdG8gZ28gcm91bmQgdGhlIGxvb3AgaW4KKyAgICAgICAgICAgam91cm5hbF93cml0ZV9yZXZva2VfcmVjb3JkcyBpbiBvcmRlciB0byBmcmVlIGFsbCBvZiB0aGUKKyAgICAgICAgICAgcmV2b2tlIHJlY29yZHM6IG9ubHkgdGhlIElPIHRvIHRoZSBqb3VybmFsIGlzIG9taXR0ZWQuICovCisJaWYgKGlzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkKKwkJcmV0dXJuOworCisJZGVzY3JpcHRvciA9ICpkZXNjcmlwdG9ycDsKKwlvZmZzZXQgPSAqb2Zmc2V0cDsKKworCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZGVzY3JpcHRvciB3aXRoIHNwYWNlIGxlZnQgZm9yIHRoZSByZWNvcmQgKi8KKwlpZiAoZGVzY3JpcHRvcikgeworCQlpZiAob2Zmc2V0ID09IGpvdXJuYWwtPmpfYmxvY2tzaXplKSB7CisJCQlmbHVzaF9kZXNjcmlwdG9yKGpvdXJuYWwsIGRlc2NyaXB0b3IsIG9mZnNldCk7CisJCQlkZXNjcmlwdG9yID0gTlVMTDsKKwkJfQorCX0KKworCWlmICghZGVzY3JpcHRvcikgeworCQlkZXNjcmlwdG9yID0gam91cm5hbF9nZXRfZGVzY3JpcHRvcl9idWZmZXIoam91cm5hbCk7CisJCWlmICghZGVzY3JpcHRvcikKKwkJCXJldHVybjsKKwkJaGVhZGVyID0gKGpvdXJuYWxfaGVhZGVyX3QgKikgJmpoMmJoKGRlc2NyaXB0b3IpLT5iX2RhdGFbMF07CisJCWhlYWRlci0+aF9tYWdpYyAgICAgPSBjcHVfdG9fYmUzMihKRlNfTUFHSUNfTlVNQkVSKTsKKwkJaGVhZGVyLT5oX2Jsb2NrdHlwZSA9IGNwdV90b19iZTMyKEpGU19SRVZPS0VfQkxPQ0spOworCQloZWFkZXItPmhfc2VxdWVuY2UgID0gY3B1X3RvX2JlMzIodHJhbnNhY3Rpb24tPnRfdGlkKTsKKworCQkvKiBSZWNvcmQgaXQgc28gdGhhdCB3ZSBjYW4gd2FpdCBmb3IgSU8gY29tcGxldGlvbiBsYXRlciAqLworCQlKQlVGRkVSX1RSQUNFKGRlc2NyaXB0b3IsICJmaWxlIGFzIEJKX0xvZ0N0bCIpOworCQlqb3VybmFsX2ZpbGVfYnVmZmVyKGRlc2NyaXB0b3IsIHRyYW5zYWN0aW9uLCBCSl9Mb2dDdGwpOworCisJCW9mZnNldCA9IHNpemVvZihqb3VybmFsX3Jldm9rZV9oZWFkZXJfdCk7CisJCSpkZXNjcmlwdG9ycCA9IGRlc2NyaXB0b3I7CisJfQorCisJKiAoKF9fYmUzMiAqKSgmamgyYmgoZGVzY3JpcHRvciktPmJfZGF0YVtvZmZzZXRdKSkgPSAKKwkJY3B1X3RvX2JlMzIocmVjb3JkLT5ibG9ja25yKTsKKwlvZmZzZXQgKz0gNDsKKwkqb2Zmc2V0cCA9IG9mZnNldDsKK30KKworLyogCisgKiBGbHVzaCBhIHJldm9rZSBkZXNjcmlwdG9yIG91dCB0byB0aGUgam91cm5hbC4gIElmIHdlIGFyZSBhYm9ydGluZywKKyAqIHRoaXMgaXMgYSBub29wOyBvdGhlcndpc2Ugd2UgYXJlIGdlbmVyYXRpbmcgYSBidWZmZXIgd2hpY2ggbmVlZHMgdG8KKyAqIGJlIHdhaXRlZCBmb3IgZHVyaW5nIGNvbW1pdCwgc28gaXQgaGFzIHRvIGdvIG9udG8gdGhlIGFwcHJvcHJpYXRlCisgKiBqb3VybmFsIGJ1ZmZlciBsaXN0LgorICovCisKK3N0YXRpYyB2b2lkIGZsdXNoX2Rlc2NyaXB0b3Ioam91cm5hbF90ICpqb3VybmFsLCAKKwkJCSAgICAgc3RydWN0IGpvdXJuYWxfaGVhZCAqZGVzY3JpcHRvciwgCisJCQkgICAgIGludCBvZmZzZXQpCit7CisJam91cm5hbF9yZXZva2VfaGVhZGVyX3QgKmhlYWRlcjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gamgyYmgoZGVzY3JpcHRvcik7CisKKwlpZiAoaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpKSB7CisJCXB1dF9iaChiaCk7CisJCXJldHVybjsKKwl9CisKKwloZWFkZXIgPSAoam91cm5hbF9yZXZva2VfaGVhZGVyX3QgKikgamgyYmgoZGVzY3JpcHRvciktPmJfZGF0YTsKKwloZWFkZXItPnJfY291bnQgPSBjcHVfdG9fYmUzMihvZmZzZXQpOworCXNldF9idWZmZXJfandyaXRlKGJoKTsKKwlCVUZGRVJfVFJBQ0UoYmgsICJ3cml0ZSIpOworCXNldF9idWZmZXJfZGlydHkoYmgpOworCWxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmYmgpOworfQorI2VuZGlmCisKKy8qIAorICogUmV2b2tlIHN1cHBvcnQgZm9yIHJlY292ZXJ5LgorICoKKyAqIFJlY292ZXJ5IG5lZWRzIHRvIGJlIGFibGUgdG86CisgKgorICogIHJlY29yZCBhbGwgcmV2b2tlIHJlY29yZHMsIGluY2x1ZGluZyB0aGUgdGlkIG9mIHRoZSBsYXRlc3QgaW5zdGFuY2UKKyAqICBvZiBlYWNoIHJldm9rZSBpbiB0aGUgam91cm5hbAorICoKKyAqICBjaGVjayB3aGV0aGVyIGEgZ2l2ZW4gYmxvY2sgaW4gYSBnaXZlbiB0cmFuc2FjdGlvbiBzaG91bGQgYmUgcmVwbGF5ZWQKKyAqICAoaWUuIGhhcyBub3QgYmVlbiByZXZva2VkIGJ5IGEgcmV2b2tlIHJlY29yZCBpbiB0aGF0IG9yIGEgc3Vic2VxdWVudAorICogIHRyYW5zYWN0aW9uKQorICogCisgKiAgZW1wdHkgdGhlIHJldm9rZSB0YWJsZSBhZnRlciByZWNvdmVyeS4KKyAqLworCisvKgorICogRmlyc3QsIHNldHRpbmcgcmV2b2tlIHJlY29yZHMuICBXZSBjcmVhdGUgYSBuZXcgcmV2b2tlIHJlY29yZCBmb3IKKyAqIGV2ZXJ5IGJsb2NrIGV2ZXIgcmV2b2tlZCBpbiB0aGUgbG9nIGFzIHdlIHNjYW4gaXQgZm9yIHJlY292ZXJ5LCBhbmQKKyAqIHdlIHVwZGF0ZSB0aGUgZXhpc3RpbmcgcmVjb3JkcyBpZiB3ZSBmaW5kIG11bHRpcGxlIHJldm9rZXMgZm9yIGEKKyAqIHNpbmdsZSBibG9jay4gCisgKi8KKworaW50IGpvdXJuYWxfc2V0X3Jldm9rZShqb3VybmFsX3QgKmpvdXJuYWwsIAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBibG9ja25yLCAKKwkJICAgICAgIHRpZF90IHNlcXVlbmNlKQoreworCXN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zICpyZWNvcmQ7CisKKwlyZWNvcmQgPSBmaW5kX3Jldm9rZV9yZWNvcmQoam91cm5hbCwgYmxvY2tucik7CisJaWYgKHJlY29yZCkgeworCQkvKiBJZiB3ZSBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzLCBvbmx5IHJlY29yZCB0aGUKKwkJICogbGF0ZXN0IHNlcXVlbmNlIG51bWJlciBpbiB0aGUgaGFzaGVkIHJlY29yZCAqLworCQlpZiAodGlkX2d0KHNlcXVlbmNlLCByZWNvcmQtPnNlcXVlbmNlKSkKKwkJCXJlY29yZC0+c2VxdWVuY2UgPSBzZXF1ZW5jZTsKKwkJcmV0dXJuIDA7CisJfSAKKwlyZXR1cm4gaW5zZXJ0X3Jldm9rZV9oYXNoKGpvdXJuYWwsIGJsb2NrbnIsIHNlcXVlbmNlKTsKK30KKworLyogCisgKiBUZXN0IHJldm9rZSByZWNvcmRzLiAgRm9yIGEgZ2l2ZW4gYmxvY2sgcmVmZXJlbmNlZCBpbiB0aGUgbG9nLCBoYXMKKyAqIHRoYXQgYmxvY2sgYmVlbiByZXZva2VkPyAgQSByZXZva2UgcmVjb3JkIHdpdGggYSBnaXZlbiB0cmFuc2FjdGlvbgorICogc2VxdWVuY2UgbnVtYmVyIHJldm9rZXMgYWxsIGJsb2NrcyBpbiB0aGF0IHRyYW5zYWN0aW9uIGFuZCBlYXJsaWVyCisgKiBvbmVzLCBidXQgbGF0ZXIgdHJhbnNhY3Rpb25zIHN0aWxsIG5lZWQgcmVwbGF5ZWQuCisgKi8KKworaW50IGpvdXJuYWxfdGVzdF9yZXZva2Uoam91cm5hbF90ICpqb3VybmFsLCAKKwkJCXVuc2lnbmVkIGxvbmcgYmxvY2tuciwKKwkJCXRpZF90IHNlcXVlbmNlKQoreworCXN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zICpyZWNvcmQ7CisKKwlyZWNvcmQgPSBmaW5kX3Jldm9rZV9yZWNvcmQoam91cm5hbCwgYmxvY2tucik7CisJaWYgKCFyZWNvcmQpCisJCXJldHVybiAwOworCWlmICh0aWRfZ3Qoc2VxdWVuY2UsIHJlY29yZC0+c2VxdWVuY2UpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEZpbmFsbHksIG9uY2UgcmVjb3ZlcnkgaXMgb3Zlciwgd2UgbmVlZCB0byBjbGVhciB0aGUgcmV2b2tlIHRhYmxlIHNvCisgKiB0aGF0IGl0IGNhbiBiZSByZXVzZWQgYnkgdGhlIHJ1bm5pbmcgZmlsZXN5c3RlbS4KKyAqLworCit2b2lkIGpvdXJuYWxfY2xlYXJfcmV2b2tlKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2xpc3Q7CisJc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgKnJlY29yZDsKKwlzdHJ1Y3QgamJkX3Jldm9rZV90YWJsZV9zICpyZXZva2U7CisKKwlyZXZva2UgPSBqb3VybmFsLT5qX3Jldm9rZTsKKworCWZvciAoaSA9IDA7IGkgPCByZXZva2UtPmhhc2hfc2l6ZTsgaSsrKSB7CisJCWhhc2hfbGlzdCA9ICZyZXZva2UtPmhhc2hfdGFibGVbaV07CisJCXdoaWxlICghbGlzdF9lbXB0eShoYXNoX2xpc3QpKSB7CisJCQlyZWNvcmQgPSAoc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MqKSBoYXNoX2xpc3QtPm5leHQ7CisJCQlsaXN0X2RlbCgmcmVjb3JkLT5oYXNoKTsKKwkJCWttZW1fY2FjaGVfZnJlZShyZXZva2VfcmVjb3JkX2NhY2hlLCByZWNvcmQpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZnMvamJkL3RyYW5zYWN0aW9uLmMgYi9mcy9qYmQvdHJhbnNhY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzJlN2MxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamJkL3RyYW5zYWN0aW9uLmMKQEAgLTAsMCArMSwyMDYyIEBACisvKgorICogbGludXgvZnMvdHJhbnNhY3Rpb24uYworICogCisgKiBXcml0dGVuIGJ5IFN0ZXBoZW4gQy4gVHdlZWRpZSA8c2N0QHJlZGhhdC5jb20+LCAxOTk4CisgKgorICogQ29weXJpZ2h0IDE5OTggUmVkIEhhdCBjb3JwIC0tLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgb3IgYXQgeW91cgorICogb3B0aW9uLCBhbnkgbGF0ZXIgdmVyc2lvbiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogR2VuZXJpYyBmaWxlc3lzdGVtIHRyYW5zYWN0aW9uIGhhbmRsaW5nIGNvZGU7IHBhcnQgb2YgdGhlIGV4dDJmcworICogam91cm5hbGluZyBzeXN0ZW0uICAKKyAqCisgKiBUaGlzIGZpbGUgbWFuYWdlcyB0cmFuc2FjdGlvbnMgKGNvbXBvdW5kIGNvbW1pdHMgbWFuYWdlZCBieSB0aGUKKyAqIGpvdXJuYWxpbmcgY29kZSkgYW5kIGhhbmRsZXMgKGluZGl2aWR1YWwgYXRvbWljIG9wZXJhdGlvbnMgYnkgdGhlCisgKiBmaWxlc3lzdGVtKS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamJkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorCisvKgorICogZ2V0X3RyYW5zYWN0aW9uOiBvYnRhaW4gYSBuZXcgdHJhbnNhY3Rpb25fdCBvYmplY3QuCisgKgorICogU2ltcGx5IGFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIGEgbmV3IHRyYW5zYWN0aW9uLiAgQ3JlYXRlIGl0IGluCisgKiBSVU5OSU5HIHN0YXRlIGFuZCBhZGQgaXQgdG8gdGhlIGN1cnJlbnQgam91cm5hbCAod2hpY2ggc2hvdWxkIG5vdAorICogaGF2ZSBhbiBleGlzdGluZyBydW5uaW5nIHRyYW5zYWN0aW9uOiB3ZSBvbmx5IG1ha2UgYSBuZXcgdHJhbnNhY3Rpb24KKyAqIG9uY2Ugd2UgaGF2ZSBzdGFydGVkIHRvIGNvbW1pdCB0aGUgb2xkIG9uZSkuCisgKgorICogUHJlY29uZGl0aW9uczoKKyAqCVRoZSBqb3VybmFsIE1VU1QgYmUgbG9ja2VkLiAgV2UgZG9uJ3QgcGVyZm9ybSBhdG9taWMgbWFsbG9jcyBvbiB0aGUKKyAqCW5ldyB0cmFuc2FjdGlvbglhbmQgd2UgY2FuJ3QgYmxvY2sgd2l0aG91dCBwcm90ZWN0aW5nIGFnYWluc3Qgb3RoZXIKKyAqCXByb2Nlc3NlcyB0cnlpbmcgdG8gdG91Y2ggdGhlIGpvdXJuYWwgd2hpbGUgaXQgaXMgaW4gdHJhbnNpdGlvbi4KKyAqCisgKiBDYWxsZWQgdW5kZXIgal9zdGF0ZV9sb2NrCisgKi8KKworc3RhdGljIHRyYW5zYWN0aW9uX3QgKgorZ2V0X3RyYW5zYWN0aW9uKGpvdXJuYWxfdCAqam91cm5hbCwgdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24pCit7CisJdHJhbnNhY3Rpb24tPnRfam91cm5hbCA9IGpvdXJuYWw7CisJdHJhbnNhY3Rpb24tPnRfc3RhdGUgPSBUX1JVTk5JTkc7CisJdHJhbnNhY3Rpb24tPnRfdGlkID0gam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSsrOworCXRyYW5zYWN0aW9uLT50X2V4cGlyZXMgPSBqaWZmaWVzICsgam91cm5hbC0+al9jb21taXRfaW50ZXJ2YWw7CisJc3Bpbl9sb2NrX2luaXQoJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKworCS8qIFNldCB1cCB0aGUgY29tbWl0IHRpbWVyIGZvciB0aGUgbmV3IHRyYW5zYWN0aW9uLiAqLworCWpvdXJuYWwtPmpfY29tbWl0X3RpbWVyLT5leHBpcmVzID0gdHJhbnNhY3Rpb24tPnRfZXhwaXJlczsKKwlhZGRfdGltZXIoam91cm5hbC0+al9jb21taXRfdGltZXIpOworCisJSl9BU1NFUlQoam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uID09IE5VTEwpOworCWpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uOworCisJcmV0dXJuIHRyYW5zYWN0aW9uOworfQorCisvKgorICogSGFuZGxlIG1hbmFnZW1lbnQuCisgKgorICogQSBoYW5kbGVfdCBpcyBhbiBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBhIHNpbmdsZSBhdG9taWMgdXBkYXRlIHRvIGEKKyAqIGZpbGVzeXN0ZW0sIGFuZCB3aGljaCB0cmFja3MgYWxsIG9mIHRoZSBtb2RpZmljYXRpb25zIHdoaWNoIGZvcm0gcGFydAorICogb2YgdGhhdCBvbmUgdXBkYXRlLgorICovCisKKy8qCisgKiBzdGFydF90aGlzX2hhbmRsZTogR2l2ZW4gYSBoYW5kbGUsIGRlYWwgd2l0aCBhbnkgbG9ja2luZyBvciBzdGFsbGluZworICogbmVlZGVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzIGVub3VnaCBqb3VybmFsIHNwYWNlIGZvciB0aGUgaGFuZGxlCisgKiB0byBiZWdpbi4gIEF0dGFjaCB0aGUgaGFuZGxlIHRvIGEgdHJhbnNhY3Rpb24gYW5kIHNldCB1cCB0aGUKKyAqIHRyYW5zYWN0aW9uJ3MgYnVmZmVyIGNyZWRpdHMuICAKKyAqLworCitzdGF0aWMgaW50IHN0YXJ0X3RoaXNfaGFuZGxlKGpvdXJuYWxfdCAqam91cm5hbCwgaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbjsKKwlpbnQgbmVlZGVkOworCWludCBuYmxvY2tzID0gaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzOworCXRyYW5zYWN0aW9uX3QgKm5ld190cmFuc2FjdGlvbiA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlpZiAobmJsb2NrcyA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zYWN0aW9uX2J1ZmZlcnMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJKQkQ6ICVzIHdhbnRzIHRvbyBtYW55IGNyZWRpdHMgKCVkID4gJWQpXG4iLAorCQkgICAgICAgY3VycmVudC0+Y29tbSwgbmJsb2NrcywKKwkJICAgICAgIGpvdXJuYWwtPmpfbWF4X3RyYW5zYWN0aW9uX2J1ZmZlcnMpOworCQlyZXQgPSAtRU5PU1BDOworCQlnb3RvIG91dDsKKwl9CisKK2FsbG9jX3RyYW5zYWN0aW9uOgorCWlmICgham91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKSB7CisJCW5ld190cmFuc2FjdGlvbiA9IGpiZF9rbWFsbG9jKHNpemVvZigqbmV3X3RyYW5zYWN0aW9uKSwKKwkJCQkJCUdGUF9OT0ZTKTsKKwkJaWYgKCFuZXdfdHJhbnNhY3Rpb24pIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCQltZW1zZXQobmV3X3RyYW5zYWN0aW9uLCAwLCBzaXplb2YoKm5ld190cmFuc2FjdGlvbikpOworCX0KKworCWpiZF9kZWJ1ZygzLCAiTmV3IGhhbmRsZSAlcCBnb2luZyBsaXZlLlxuIiwgaGFuZGxlKTsKKworcmVwZWF0OgorCisJLyoKKwkgKiBXZSBuZWVkIHRvIGhvbGQgal9zdGF0ZV9sb2NrIHVudGlsIHRfdXBkYXRlcyBoYXMgYmVlbiBpbmNyZW1lbnRlZCwKKwkgKiBmb3IgcHJvcGVyIGpvdXJuYWwgYmFycmllciBoYW5kbGluZworCSAqLworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKK3JlcGVhdF9sb2NrZWQ6CisJaWYgKGlzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSB8fAorCSAgICAoam91cm5hbC0+al9lcnJubyAhPSAwICYmICEoam91cm5hbC0+al9mbGFncyAmIEpGU19BQ0tfRVJSKSkpIHsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCXJldCA9IC1FUk9GUzsgCisJCWdvdG8gb3V0OworCX0KKworCS8qIFdhaXQgb24gdGhlIGpvdXJuYWwncyB0cmFuc2FjdGlvbiBiYXJyaWVyIGlmIG5lY2Vzc2FyeSAqLworCWlmIChqb3VybmFsLT5qX2JhcnJpZXJfY291bnQpIHsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCXdhaXRfZXZlbnQoam91cm5hbC0+al93YWl0X3RyYW5zYWN0aW9uX2xvY2tlZCwKKwkJCQlqb3VybmFsLT5qX2JhcnJpZXJfY291bnQgPT0gMCk7CisJCWdvdG8gcmVwZWF0OworCX0KKworCWlmICgham91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKSB7CisJCWlmICghbmV3X3RyYW5zYWN0aW9uKSB7CisJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJCWdvdG8gYWxsb2NfdHJhbnNhY3Rpb247CisJCX0KKwkJZ2V0X3RyYW5zYWN0aW9uKGpvdXJuYWwsIG5ld190cmFuc2FjdGlvbik7CisJCW5ld190cmFuc2FjdGlvbiA9IE5VTEw7CisJfQorCisJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb247CisKKwkvKgorCSAqIElmIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGlzIGxvY2tlZCBkb3duIGZvciBjb21taXQsIHdhaXQgZm9yIHRoZQorCSAqIGxvY2sgdG8gYmUgcmVsZWFzZWQuCisJICovCisJaWYgKHRyYW5zYWN0aW9uLT50X3N0YXRlID09IFRfTE9DS0VEKSB7CisJCURFRklORV9XQUlUKHdhaXQpOworCisJCXByZXBhcmVfdG9fd2FpdCgmam91cm5hbC0+al93YWl0X3RyYW5zYWN0aW9uX2xvY2tlZCwKKwkJCQkJJndhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCXNjaGVkdWxlKCk7CisJCWZpbmlzaF93YWl0KCZqb3VybmFsLT5qX3dhaXRfdHJhbnNhY3Rpb25fbG9ja2VkLCAmd2FpdCk7CisJCWdvdG8gcmVwZWF0OworCX0KKworCS8qCisJICogSWYgdGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSBsZWZ0IGluIHRoZSBsb2cgdG8gd3JpdGUgYWxsIHBvdGVudGlhbAorCSAqIGJ1ZmZlcnMgcmVxdWVzdGVkIGJ5IHRoaXMgb3BlcmF0aW9uLCB3ZSBuZWVkIHRvIHN0YWxsIHBlbmRpbmcgYSBsb2cKKwkgKiBjaGVja3BvaW50IHRvIGZyZWUgc29tZSBtb3JlIGxvZyBzcGFjZS4KKwkgKi8KKwlzcGluX2xvY2soJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwluZWVkZWQgPSB0cmFuc2FjdGlvbi0+dF9vdXRzdGFuZGluZ19jcmVkaXRzICsgbmJsb2NrczsKKworCWlmIChuZWVkZWQgPiBqb3VybmFsLT5qX21heF90cmFuc2FjdGlvbl9idWZmZXJzKSB7CisJCS8qCisJCSAqIElmIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgdG9vIGxhcmdlLCB0aGVuIHN0YXJ0CisJCSAqIHRvIGNvbW1pdCBpdDogd2UgY2FuIHRoZW4gZ28gYmFjayBhbmQgYXR0YWNoIHRoaXMgaGFuZGxlIHRvCisJCSAqIGEgbmV3IHRyYW5zYWN0aW9uLgorCQkgKi8KKwkJREVGSU5FX1dBSVQod2FpdCk7CisKKwkJamJkX2RlYnVnKDIsICJIYW5kbGUgJXAgc3RhcnRpbmcgbmV3IGNvbW1pdC4uLlxuIiwgaGFuZGxlKTsKKwkJc3Bpbl91bmxvY2soJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwkJcHJlcGFyZV90b193YWl0KCZqb3VybmFsLT5qX3dhaXRfdHJhbnNhY3Rpb25fbG9ja2VkLCAmd2FpdCwKKwkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCV9fbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsLCB0cmFuc2FjdGlvbi0+dF90aWQpOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJc2NoZWR1bGUoKTsKKwkJZmluaXNoX3dhaXQoJmpvdXJuYWwtPmpfd2FpdF90cmFuc2FjdGlvbl9sb2NrZWQsICZ3YWl0KTsKKwkJZ290byByZXBlYXQ7CisJfQorCisJLyogCisJICogVGhlIGNvbW1pdCBjb2RlIGFzc3VtZXMgdGhhdCBpdCBjYW4gZ2V0IGVub3VnaCBsb2cgc3BhY2UKKwkgKiB3aXRob3V0IGZvcmNpbmcgYSBjaGVja3BvaW50LiAgVGhpcyBpcyAqY3JpdGljYWwqIGZvcgorCSAqIGNvcnJlY3RuZXNzOiBhIGNoZWNrcG9pbnQgb2YgYSBidWZmZXIgd2hpY2ggaXMgYWxzbworCSAqIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24gY3JlYXRlcyBhIGRlYWRsb2NrLAorCSAqIHNvIGNvbW1pdCBzaW1wbHkgY2Fubm90IGZvcmNlIHRocm91Z2ggY2hlY2twb2ludHMuCisJICoKKwkgKiBXZSBtdXN0IHRoZXJlZm9yZSBlbnN1cmUgdGhlIG5lY2Vzc2FyeSBzcGFjZSBpbiB0aGUgam91cm5hbAorCSAqICpiZWZvcmUqIHN0YXJ0aW5nIHRvIGRpcnR5IHBvdGVudGlhbGx5IGNoZWNrcG9pbnRlZCBidWZmZXJzCisJICogaW4gdGhlIG5ldyB0cmFuc2FjdGlvbi4gCisJICoKKwkgKiBUaGUgd29yc3QgcGFydCBpcywgYW55IHRyYW5zYWN0aW9uIGN1cnJlbnRseSBjb21taXR0aW5nIGNhbgorCSAqIHJlZHVjZSB0aGUgZnJlZSBzcGFjZSBhcmJpdHJhcmlseS4gIEJlIGNhcmVmdWwgdG8gYWNjb3VudCBmb3IKKwkgKiB0aG9zZSBidWZmZXJzIHdoZW4gY2hlY2twb2ludGluZy4KKwkgKi8KKworCS8qCisJICogQEBAIEFLUE06IFRoaXMgc2VlbXMgcmF0aGVyIG92ZXItZGVmZW5zaXZlLiAgV2UncmUgZ2l2aW5nIGNvbW1pdAorCSAqIGEgX2xvdF8gb2YgaGVhZHJvb206IDEvNCBvZiB0aGUgam91cm5hbCBwbHVzIHRoZSBzaXplIG9mCisJICogdGhlIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24uICBSZWFsbHksIHdlIG9ubHkgbmVlZCB0byBnaXZlIGl0CisJICogY29tbWl0dGluZ190cmFuc2FjdGlvbi0+dF9vdXRzdGFuZGluZ19jcmVkaXRzIHBsdXMgImVub3VnaCIgZm9yCisJICogdGhlIGxvZyBjb250cm9sIGJsb2Nrcy4KKwkgKiBBbHNvLCB0aGlzIHRlc3QgaXMgaW5jb25zaXRlbnQgd2l0aCB0aGUgbWF0Y2hpbmcgb25lIGluCisJICogam91cm5hbF9leHRlbmQoKS4KKwkgKi8KKwlpZiAoX19sb2dfc3BhY2VfbGVmdChqb3VybmFsKSA8IGpiZF9zcGFjZV9uZWVkZWQoam91cm5hbCkpIHsKKwkJamJkX2RlYnVnKDIsICJIYW5kbGUgJXAgd2FpdGluZyBmb3IgY2hlY2twb2ludC4uLlxuIiwgaGFuZGxlKTsKKwkJc3Bpbl91bmxvY2soJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwkJX19sb2dfd2FpdF9mb3Jfc3BhY2Uoam91cm5hbCk7CisJCWdvdG8gcmVwZWF0X2xvY2tlZDsKKwl9CisKKwkvKiBPSywgYWNjb3VudCBmb3IgdGhlIGJ1ZmZlcnMgdGhhdCB0aGlzIG9wZXJhdGlvbiBleHBlY3RzIHRvCisJICogdXNlIGFuZCBhZGQgdGhlIGhhbmRsZSB0byB0aGUgcnVubmluZyB0cmFuc2FjdGlvbi4gKi8KKworCWhhbmRsZS0+aF90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uOworCXRyYW5zYWN0aW9uLT50X291dHN0YW5kaW5nX2NyZWRpdHMgKz0gbmJsb2NrczsKKwl0cmFuc2FjdGlvbi0+dF91cGRhdGVzKys7CisJdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2NvdW50Kys7CisJamJkX2RlYnVnKDQsICJIYW5kbGUgJXAgZ2l2ZW4gJWQgY3JlZGl0cyAodG90YWwgJWQsIGZyZWUgJWQpXG4iLAorCQkgIGhhbmRsZSwgbmJsb2NrcywgdHJhbnNhY3Rpb24tPnRfb3V0c3RhbmRpbmdfY3JlZGl0cywKKwkJICBfX2xvZ19zcGFjZV9sZWZ0KGpvdXJuYWwpKTsKKwlzcGluX3VubG9jaygmdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2xvY2spOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworb3V0OgorCWlmIChuZXdfdHJhbnNhY3Rpb24pCisJCWtmcmVlKG5ld190cmFuc2FjdGlvbik7CisJcmV0dXJuIHJldDsKK30KKworLyogQWxsb2NhdGUgYSBuZXcgaGFuZGxlLiAgVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgaW4gYSBzbGFiLi4uICovCitzdGF0aWMgaGFuZGxlX3QgKm5ld19oYW5kbGUoaW50IG5ibG9ja3MpCit7CisJaGFuZGxlX3QgKmhhbmRsZSA9IGpiZF9hbGxvY19oYW5kbGUoR0ZQX05PRlMpOworCWlmICghaGFuZGxlKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoaGFuZGxlLCAwLCBzaXplb2YoKmhhbmRsZSkpOworCWhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cyA9IG5ibG9ja3M7CisJaGFuZGxlLT5oX3JlZiA9IDE7CisKKwlyZXR1cm4gaGFuZGxlOworfQorCisvKioKKyAqIGhhbmRsZV90ICpqb3VybmFsX3N0YXJ0KCkgLSBPYnRhaW4gYSBuZXcgaGFuZGxlLiAgCisgKiBAam91cm5hbDogSm91cm5hbCB0byBzdGFydCB0cmFuc2FjdGlvbiBvbi4KKyAqIEBuYmxvY2tzOiBudW1iZXIgb2YgYmxvY2sgYnVmZmVyIHdlIG1pZ2h0IG1vZGlmeQorICoKKyAqIFdlIG1ha2Ugc3VyZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBjYW4gZ3VhcmFudGVlIGF0IGxlYXN0IG5ibG9ja3Mgb2YKKyAqIG1vZGlmaWVkIGJ1ZmZlcnMgaW4gdGhlIGxvZy4gIFdlIGJsb2NrIHVudGlsIHRoZSBsb2cgY2FuIGd1YXJhbnRlZQorICogdGhhdCBtdWNoIHNwYWNlLiAgCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB2aXNpYmxlIHRvIGpvdXJuYWwgdXNlcnMgKGxpa2UgZXh0M2ZzKSwgc28gaXMgbm90CisgKiBjYWxsZWQgd2l0aCB0aGUgam91cm5hbCBhbHJlYWR5IGxvY2tlZC4KKyAqCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGhhbmRsZSwgb3IgTlVMTCBvbiBmYWlsdXJlCisgKi8KK2hhbmRsZV90ICpqb3VybmFsX3N0YXJ0KGpvdXJuYWxfdCAqam91cm5hbCwgaW50IG5ibG9ja3MpCit7CisJaGFuZGxlX3QgKmhhbmRsZSA9IGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKTsKKwlpbnQgZXJyOworCisJaWYgKCFqb3VybmFsKQorCQlyZXR1cm4gRVJSX1BUUigtRVJPRlMpOworCisJaWYgKGhhbmRsZSkgeworCQlKX0FTU0VSVChoYW5kbGUtPmhfdHJhbnNhY3Rpb24tPnRfam91cm5hbCA9PSBqb3VybmFsKTsKKwkJaGFuZGxlLT5oX3JlZisrOworCQlyZXR1cm4gaGFuZGxlOworCX0KKworCWhhbmRsZSA9IG5ld19oYW5kbGUobmJsb2Nrcyk7CisJaWYgKCFoYW5kbGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJY3VycmVudC0+am91cm5hbF9pbmZvID0gaGFuZGxlOworCisJZXJyID0gc3RhcnRfdGhpc19oYW5kbGUoam91cm5hbCwgaGFuZGxlKTsKKwlpZiAoZXJyIDwgMCkgeworCQlqYmRfZnJlZV9oYW5kbGUoaGFuZGxlKTsKKwkJY3VycmVudC0+am91cm5hbF9pbmZvID0gTlVMTDsKKwkJaGFuZGxlID0gRVJSX1BUUihlcnIpOworCX0KKwlyZXR1cm4gaGFuZGxlOworfQorCisvKioKKyAqIGludCBqb3VybmFsX2V4dGVuZCgpIC0gZXh0ZW5kIGJ1ZmZlciBjcmVkaXRzLgorICogQGhhbmRsZTogIGhhbmRsZSB0byAnZXh0ZW5kJworICogQG5ibG9ja3M6IG5yIGJsb2NrcyB0byB0cnkgdG8gZXh0ZW5kIGJ5LgorICogCisgKiBTb21lIHRyYW5zYWN0aW9ucywgc3VjaCBhcyBsYXJnZSBleHRlbmRzIGFuZCB0cnVuY2F0ZXMsIGNhbiBiZSBkb25lCisgKiBhdG9taWNhbGx5IGFsbCBhdCBvbmNlIG9yIGluIHNldmVyYWwgc3RhZ2VzLiAgVGhlIG9wZXJhdGlvbiByZXF1ZXN0cworICogYSBjcmVkaXQgZm9yIGEgbnVtYmVyIG9mIGJ1ZmZlciBtb2RpY2F0aW9ucyBpbiBhZHZhbmNlLCBidXQgY2FuCisgKiBleHRlbmQgaXRzIGNyZWRpdCBpZiBpdCBuZWVkcyBtb3JlLiAgCisgKgorICogam91cm5hbF9leHRlbmQgdHJpZXMgdG8gZ2l2ZSB0aGUgcnVubmluZyBoYW5kbGUgbW9yZSBidWZmZXIgY3JlZGl0cy4KKyAqIEl0IGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IGFsbG9jYXRpb24gLSB0aGlzIGlzIGEgYmVzdC1lZmZvcnQgb25seS4KKyAqIFRoZSBjYWxsaW5nIHByb2Nlc3MgTVVTVCBiZSBhYmxlIHRvIGRlYWwgY2xlYW5seSB3aXRoIGEgZmFpbHVyZSB0bworICogZXh0ZW5kIGhlcmUuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZmFpbHVyZS4KKyAqCisgKiByZXR1cm4gY29kZSA8IDAgaW1wbGllcyBhbiBlcnJvcgorICogcmV0dXJuIGNvZGUgPiAwIGltcGxpZXMgbm9ybWFsIHRyYW5zYWN0aW9uLWZ1bGwgc3RhdHVzLgorICovCitpbnQgam91cm5hbF9leHRlbmQoaGFuZGxlX3QgKmhhbmRsZSwgaW50IG5ibG9ja3MpCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb247CisJam91cm5hbF90ICpqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKKwlpbnQgcmVzdWx0OworCWludCB3YW50ZWQ7CisKKwlyZXN1bHQgPSAtRUlPOworCWlmIChpc19oYW5kbGVfYWJvcnRlZChoYW5kbGUpKQorCQlnb3RvIG91dDsKKworCXJlc3VsdCA9IDE7CisKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisKKwkvKiBEb24ndCBleHRlbmQgYSBsb2NrZWQtZG93biB0cmFuc2FjdGlvbiEgKi8KKwlpZiAoaGFuZGxlLT5oX3RyYW5zYWN0aW9uLT50X3N0YXRlICE9IFRfUlVOTklORykgeworCQlqYmRfZGVidWcoMywgImRlbmllZCBoYW5kbGUgJXAgJWQgYmxvY2tzOiAiCisJCQkgICJ0cmFuc2FjdGlvbiBub3QgcnVubmluZ1xuIiwgaGFuZGxlLCBuYmxvY2tzKTsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCisJc3Bpbl9sb2NrKCZ0cmFuc2FjdGlvbi0+dF9oYW5kbGVfbG9jayk7CisJd2FudGVkID0gdHJhbnNhY3Rpb24tPnRfb3V0c3RhbmRpbmdfY3JlZGl0cyArIG5ibG9ja3M7CisKKwlpZiAod2FudGVkID4gam91cm5hbC0+al9tYXhfdHJhbnNhY3Rpb25fYnVmZmVycykgeworCQlqYmRfZGVidWcoMywgImRlbmllZCBoYW5kbGUgJXAgJWQgYmxvY2tzOiAiCisJCQkgICJ0cmFuc2FjdGlvbiB0b28gbGFyZ2VcbiIsIGhhbmRsZSwgbmJsb2Nrcyk7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWlmICh3YW50ZWQgPiBfX2xvZ19zcGFjZV9sZWZ0KGpvdXJuYWwpKSB7CisJCWpiZF9kZWJ1ZygzLCAiZGVuaWVkIGhhbmRsZSAlcCAlZCBibG9ja3M6ICIKKwkJCSAgImluc3VmZmljaWVudCBsb2cgc3BhY2VcbiIsIGhhbmRsZSwgbmJsb2Nrcyk7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cyArPSBuYmxvY2tzOworCXRyYW5zYWN0aW9uLT50X291dHN0YW5kaW5nX2NyZWRpdHMgKz0gbmJsb2NrczsKKwlyZXN1bHQgPSAwOworCisJamJkX2RlYnVnKDMsICJleHRlbmRlZCBoYW5kbGUgJXAgYnkgJWRcbiIsIGhhbmRsZSwgbmJsb2Nrcyk7Cit1bmxvY2s6CisJc3Bpbl91bmxvY2soJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKK2Vycm9yX291dDoKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qKgorICogaW50IGpvdXJuYWxfcmVzdGFydCgpIC0gcmVzdGFydCBhIGhhbmRsZSAuCisgKiBAaGFuZGxlOiAgaGFuZGxlIHRvIHJlc3RhcnQKKyAqIEBuYmxvY2tzOiBuciBjcmVkaXRzIHJlcXVlc3RlZAorICogCisgKiBSZXN0YXJ0IGEgaGFuZGxlIGZvciBhIG11bHRpLXRyYW5zYWN0aW9uIGZpbGVzeXN0ZW0KKyAqIG9wZXJhdGlvbi4KKyAqCisgKiBJZiB0aGUgam91cm5hbF9leHRlbmQoKSBjYWxsIGFib3ZlIGZhaWxzIHRvIGdyYW50IG5ldyBidWZmZXIgY3JlZGl0cworICogdG8gYSBydW5uaW5nIGhhbmRsZSwgYSBjYWxsIHRvIGpvdXJuYWxfcmVzdGFydCB3aWxsIGNvbW1pdCB0aGUKKyAqIGhhbmRsZSdzIHRyYW5zYWN0aW9uIHNvIGZhciBhbmQgcmVhdHRhY2ggdGhlIGhhbmRsZSB0byBhIG5ldworICogdHJhbnNhY3Rpb24gY2FwYWJhYmxlIG9mIGd1YXJhbnRlZWluZyB0aGUgcmVxdWVzdGVkIG51bWJlciBvZgorICogY3JlZGl0cy4KKyAqLworCitpbnQgam91cm5hbF9yZXN0YXJ0KGhhbmRsZV90ICpoYW5kbGUsIGludCBuYmxvY2tzKQoreworCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uOworCWpvdXJuYWxfdCAqam91cm5hbCA9IHRyYW5zYWN0aW9uLT50X2pvdXJuYWw7CisJaW50IHJldDsKKworCS8qIElmIHdlJ3ZlIGhhZCBhbiBhYm9ydCBvZiBhbnkgdHlwZSwgZG9uJ3QgZXZlbiB0aGluayBhYm91dAorCSAqIGFjdHVhbGx5IGRvaW5nIHRoZSByZXN0YXJ0ISAqLworCWlmIChpc19oYW5kbGVfYWJvcnRlZChoYW5kbGUpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogRmlyc3QgdW5saW5rIHRoZSBoYW5kbGUgZnJvbSBpdHMgY3VycmVudCB0cmFuc2FjdGlvbiwgYW5kIHN0YXJ0IHRoZQorCSAqIGNvbW1pdCBvbiB0aGF0LgorCSAqLworCUpfQVNTRVJUKHRyYW5zYWN0aW9uLT50X3VwZGF0ZXMgPiAwKTsKKwlKX0FTU0VSVChqb3VybmFsX2N1cnJlbnRfaGFuZGxlKCkgPT0gaGFuZGxlKTsKKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlzcGluX2xvY2soJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwl0cmFuc2FjdGlvbi0+dF9vdXRzdGFuZGluZ19jcmVkaXRzIC09IGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0czsKKwl0cmFuc2FjdGlvbi0+dF91cGRhdGVzLS07CisKKwlpZiAoIXRyYW5zYWN0aW9uLT50X3VwZGF0ZXMpCisJCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF91cGRhdGVzKTsKKwlzcGluX3VubG9jaygmdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2xvY2spOworCisJamJkX2RlYnVnKDIsICJyZXN0YXJ0aW5nIGhhbmRsZSAlcFxuIiwgaGFuZGxlKTsKKwlfX2xvZ19zdGFydF9jb21taXQoam91cm5hbCwgdHJhbnNhY3Rpb24tPnRfdGlkKTsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCWhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cyA9IG5ibG9ja3M7CisJcmV0ID0gc3RhcnRfdGhpc19oYW5kbGUoam91cm5hbCwgaGFuZGxlKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICogdm9pZCBqb3VybmFsX2xvY2tfdXBkYXRlcyAoKSAtIGVzdGFibGlzaCBhIHRyYW5zYWN0aW9uIGJhcnJpZXIuCisgKiBAam91cm5hbDogIEpvdXJuYWwgdG8gZXN0YWJsaXNoIGEgYmFycmllciBvbi4KKyAqCisgKiBUaGlzIGxvY2tzIG91dCBhbnkgZnVydGhlciB1cGRhdGVzIGZyb20gYmVpbmcgc3RhcnRlZCwgYW5kIGJsb2NrcworICogdW50aWwgYWxsIGV4aXN0aW5nIHVwZGF0ZXMgaGF2ZSBjb21wbGV0ZWQsIHJldHVybmluZyBvbmx5IG9uY2UgdGhlCisgKiBqb3VybmFsIGlzIGluIGEgcXVpZXNjZW50IHN0YXRlIHdpdGggbm8gdXBkYXRlcyBydW5uaW5nLgorICoKKyAqIFRoZSBqb3VybmFsIGxvY2sgc2hvdWxkIG5vdCBiZSBoZWxkIG9uIGVudHJ5LgorICovCit2b2lkIGpvdXJuYWxfbG9ja191cGRhdGVzKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkrK2pvdXJuYWwtPmpfYmFycmllcl9jb3VudDsKKworCS8qIFdhaXQgdW50aWwgdGhlcmUgYXJlIG5vIHJ1bm5pbmcgdXBkYXRlcyAqLworCXdoaWxlICgxKSB7CisJCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uID0gam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uOworCisJCWlmICghdHJhbnNhY3Rpb24pCisJCQlicmVhazsKKworCQlzcGluX2xvY2soJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwkJaWYgKCF0cmFuc2FjdGlvbi0+dF91cGRhdGVzKSB7CisJCQlzcGluX3VubG9jaygmdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2xvY2spOworCQkJYnJlYWs7CisJCX0KKwkJcHJlcGFyZV90b193YWl0KCZqb3VybmFsLT5qX3dhaXRfdXBkYXRlcywgJndhaXQsCisJCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9jaygmdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2xvY2spOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJc2NoZWR1bGUoKTsKKwkJZmluaXNoX3dhaXQoJmpvdXJuYWwtPmpfd2FpdF91cGRhdGVzLCAmd2FpdCk7CisJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisKKwkvKgorCSAqIFdlIGhhdmUgbm93IGVzdGFibGlzaGVkIGEgYmFycmllciBhZ2FpbnN0IG90aGVyIG5vcm1hbCB1cGRhdGVzLCBidXQKKwkgKiB3ZSBhbHNvIG5lZWQgdG8gYmFycmllciBhZ2FpbnN0IG90aGVyIGpvdXJuYWxfbG9ja191cGRhdGVzKCkgY2FsbHMKKwkgKiB0byBtYWtlIHN1cmUgdGhhdCB3ZSBzZXJpYWxpc2Ugc3BlY2lhbCBqb3VybmFsLWxvY2tlZCBvcGVyYXRpb25zCisJICogdG9vLgorCSAqLworCWRvd24oJmpvdXJuYWwtPmpfYmFycmllcik7Cit9CisKKy8qKgorICogdm9pZCBqb3VybmFsX3VubG9ja191cGRhdGVzIChqb3VybmFsX3QqIGpvdXJuYWwpIC0gcmVsZWFzZSBiYXJyaWVyCisgKiBAam91cm5hbDogIEpvdXJuYWwgdG8gcmVsZWFzZSB0aGUgYmFycmllciBvbi4KKyAqIAorICogUmVsZWFzZSBhIHRyYW5zYWN0aW9uIGJhcnJpZXIgb2J0YWluZWQgd2l0aCBqb3VybmFsX2xvY2tfdXBkYXRlcygpLgorICoKKyAqIFNob3VsZCBiZSBjYWxsZWQgd2l0aG91dCB0aGUgam91cm5hbCBsb2NrIGhlbGQuCisgKi8KK3ZvaWQgam91cm5hbF91bmxvY2tfdXBkYXRlcyAoam91cm5hbF90ICpqb3VybmFsKQoreworCUpfQVNTRVJUKGpvdXJuYWwtPmpfYmFycmllcl9jb3VudCAhPSAwKTsKKworCXVwKCZqb3VybmFsLT5qX2JhcnJpZXIpOworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwktLWpvdXJuYWwtPmpfYmFycmllcl9jb3VudDsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfdHJhbnNhY3Rpb25fbG9ja2VkKTsKK30KKworLyoKKyAqIFJlcG9ydCBhbnkgdW5leHBlY3RlZCBkaXJ0eSBidWZmZXJzIHdoaWNoIHR1cm4gdXAuICBOb3JtYWxseSB0aG9zZQorICogaW5kaWNhdGUgYW4gZXJyb3IsIGJ1dCB0aGV5IGNhbiBvY2N1ciBpZiB0aGUgdXNlciBpcyBydW5uaW5nIChzYXkpCisgKiB0dW5lMmZzIHRvIG1vZGlmeSB0aGUgbGl2ZSBmaWxlc3lzdGVtLCBzbyB3ZSBuZWVkIHRoZSBvcHRpb24gb2YKKyAqIGNvbnRpbnVpbmcgYXMgZ3JhY2VmdWxseSBhcyBwb3NzaWJsZS4gICMKKyAqCisgKiBUaGUgY2FsbGVyIHNob3VsZCBhbHJlYWR5IGhvbGQgdGhlIGpvdXJuYWwgbG9jayBhbmQKKyAqIGpfbGlzdF9sb2NrIHNwaW5sb2NrOiBtb3N0IGNhbGxlcnMgd2lsbCBuZWVkIHRob3NlIGFueXdheQorICogaW4gb3JkZXIgdG8gcHJvYmUgdGhlIGJ1ZmZlcidzIGpvdXJuYWxpbmcgc3RhdGUgc2FmZWx5LgorICovCitzdGF0aWMgdm9pZCBqYmRfdW5leHBlY3RlZF9kaXJ0eV9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKKwlpbnQgamxpc3Q7CisKKwlpZiAoYnVmZmVyX2RpcnR5KGJoKSkgeworCQkvKiBJZiB0aGlzIGJ1ZmZlciBpcyBvbmUgd2hpY2ggbWlnaHQgcmVhc29uYWJseSBiZSBkaXJ0eQorCQkgKiAtLS0gaWUuIGRhdGEsIG9yIG5vdCBwYXJ0IG9mIHRoaXMgam91cm5hbCAtLS0gdGhlbgorCQkgKiB3ZSdyZSBPSyB0byBsZWF2ZSBpdCBhbG9uZSwgYnV0IG90aGVyd2lzZSB3ZSBuZWVkIHRvCisJCSAqIG1vdmUgdGhlIGRpcnR5IGJpdCB0byB0aGUgam91cm5hbCdzIG93biBpbnRlcm5hbAorCQkgKiBKQkREaXJ0eSBiaXQuICovCisJCWpsaXN0ID0gamgtPmJfamxpc3Q7CisKKwkJaWYgKGpsaXN0ID09IEJKX01ldGFkYXRhIHx8IGpsaXN0ID09IEJKX1Jlc2VydmVkIHx8IAorCQkgICAgamxpc3QgPT0gQkpfU2hhZG93IHx8IGpsaXN0ID09IEJKX0ZvcmdldCkgeworCQkJaWYgKHRlc3RfY2xlYXJfYnVmZmVyX2RpcnR5KGpoMmJoKGpoKSkpIHsKKwkJCQlzZXRfYml0KEJIX0pCRERpcnR5LCAmamgyYmgoamgpLT5iX3N0YXRlKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAqIElmIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBwYXJ0IG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCB0aGVuIHRoZXJlCisgKiBpcyBub3RoaW5nIHdlIG5lZWQgdG8gZG8uICBJZiBpdCBpcyBhbHJlYWR5IHBhcnQgb2YgYSBwcmlvcgorICogdHJhbnNhY3Rpb24gd2hpY2ggd2UgYXJlIHN0aWxsIGNvbW1pdHRpbmcgdG8gZGlzaywgdGhlbiB3ZSBuZWVkIHRvCisgKiBtYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3Qgb3ZlcndyaXRlIHRoZSBvbGQgY29weTogd2UgZG8gY29weS1vdXQgdG8KKyAqIHByZXNlcnZlIHRoZSBjb3B5IGdvaW5nIHRvIGRpc2suICBXZSBhbHNvIGFjY291bnQgdGhlIGJ1ZmZlciBhZ2FpbnN0CisgKiB0aGUgaGFuZGxlJ3MgbWV0YWRhdGEgYnVmZmVyIGNyZWRpdHMgKHVubGVzcyB0aGUgYnVmZmVyIGlzIGFscmVhZHkKKyAqIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uLCB0aGF0IGlzKS4KKyAqCisgKi8KK3N0YXRpYyBpbnQKK2RvX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGpvdXJuYWxfaGVhZCAqamgsCisJCQlpbnQgZm9yY2VfY29weSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uOworCWpvdXJuYWxfdCAqam91cm5hbDsKKwlpbnQgZXJyb3I7CisJY2hhciAqZnJvemVuX2J1ZmZlciA9IE5VTEw7CisJaW50IG5lZWRfY29weSA9IDA7CisKKwlpZiAoaXNfaGFuZGxlX2Fib3J0ZWQoaGFuZGxlKSkKKwkJcmV0dXJuIC1FUk9GUzsKKworCXRyYW5zYWN0aW9uID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uOworCWpvdXJuYWwgPSB0cmFuc2FjdGlvbi0+dF9qb3VybmFsOworCisJamJkX2RlYnVnKDUsICJidWZmZXJfaGVhZCAlcCwgZm9yY2VfY29weSAlZFxuIiwgamgsIGZvcmNlX2NvcHkpOworCisJSkJVRkZFUl9UUkFDRShqaCwgImVudHJ5Iik7CityZXBlYXQ6CisJYmggPSBqaDJiaChqaCk7CisKKwkvKiBAQEAgTmVlZCB0byBjaGVjayBmb3IgZXJyb3JzIGhlcmUgYXQgc29tZSBwb2ludC4gKi8KKworCWxvY2tfYnVmZmVyKGJoKTsKKwlqYmRfbG9ja19iaF9zdGF0ZShiaCk7CisKKwkvKiBXZSBub3cgaG9sZCB0aGUgYnVmZmVyIGxvY2sgc28gaXQgaXMgc2FmZSB0byBxdWVyeSB0aGUgYnVmZmVyCisJICogc3RhdGUuICBJcyB0aGUgYnVmZmVyIGRpcnR5PyAKKwkgKiAKKwkgKiBJZiBzbywgdGhlcmUgYXJlIHR3byBwb3NzaWJpbGl0aWVzLiAgVGhlIGJ1ZmZlciBtYXkgYmUKKwkgKiBub24tam91cm5hbGVkLCBhbmQgdW5kZXJnb2luZyBhIHF1aXRlIGxlZ2l0aW1hdGUgd3JpdGViYWNrLgorCSAqIE90aGVyd2lzZSwgaXQgaXMgam91cm5hbGVkLCBhbmQgd2UgZG9uJ3QgZXhwZWN0IGRpcnR5IGJ1ZmZlcnMKKwkgKiBpbiB0aGF0IHN0YXRlICh0aGUgYnVmZmVycyBzaG91bGQgYmUgbWFya2VkIEpCRF9EaXJ0eQorCSAqIGluc3RlYWQuKSAgU28gZWl0aGVyIHRoZSBJTyBpcyBiZWluZyBkb25lIHVuZGVyIG91ciBvd24KKwkgKiBjb250cm9sIGFuZCB0aGlzIGlzIGEgYnVnLCBvciBpdCdzIGEgdGhpcmQgcGFydHkgSU8gc3VjaCBhcworCSAqIGR1bXAoOCkgKHdoaWNoIG1heSBsZWF2ZSB0aGUgYnVmZmVyIHNjaGVkdWxlZCBmb3IgcmVhZCAtLS0KKwkgKiBpZS4gbG9ja2VkIGJ1dCBub3QgZGlydHkpIG9yIHR1bmUyZnMgKHdoaWNoIG1heSBhY3R1YWxseSBoYXZlCisJICogdGhlIGJ1ZmZlciBkaXJ0aWVkLCB1Z2guKSAgKi8KKworCWlmIChidWZmZXJfZGlydHkoYmgpKSB7CisJCS8qCisJCSAqIEZpcnN0IHF1ZXN0aW9uOiBpcyB0aGlzIGJ1ZmZlciBhbHJlYWR5IHBhcnQgb2YgdGhlIGN1cnJlbnQKKwkJICogdHJhbnNhY3Rpb24gb3IgdGhlIGV4aXN0aW5nIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24/CisJCSAqLworCQlpZiAoamgtPmJfdHJhbnNhY3Rpb24pIHsKKwkJCUpfQVNTRVJUX0pIKGpoLAorCQkJCWpoLT5iX3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uIHx8IAorCQkJCWpoLT5iX3RyYW5zYWN0aW9uID09CisJCQkJCWpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbik7CisJCQlpZiAoamgtPmJfbmV4dF90cmFuc2FjdGlvbikKKwkJCQlKX0FTU0VSVF9KSChqaCwgamgtPmJfbmV4dF90cmFuc2FjdGlvbiA9PQorCQkJCQkJCXRyYW5zYWN0aW9uKTsKKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJVbmV4cGVjdGVkIGRpcnR5IGJ1ZmZlciIpOworCQkJamJkX3VuZXhwZWN0ZWRfZGlydHlfYnVmZmVyKGpoKTsKKyAJCX0KKyAJfQorCisJdW5sb2NrX2J1ZmZlcihiaCk7CisKKwllcnJvciA9IC1FUk9GUzsKKwlpZiAoaXNfaGFuZGxlX2Fib3J0ZWQoaGFuZGxlKSkgeworCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJZ290byBvdXQ7CisJfQorCWVycm9yID0gMDsKKworCS8qCisJICogVGhlIGJ1ZmZlciBpcyBhbHJlYWR5IHBhcnQgb2YgdGhpcyB0cmFuc2FjdGlvbiBpZiBiX3RyYW5zYWN0aW9uIG9yCisJICogYl9uZXh0X3RyYW5zYWN0aW9uIHBvaW50cyB0byBpdAorCSAqLworCWlmIChqaC0+Yl90cmFuc2FjdGlvbiA9PSB0cmFuc2FjdGlvbiB8fAorCSAgICBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uKQorCQlnb3RvIGRvbmU7CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIGFscmVhZHkgYSBjb3B5LW91dCB2ZXJzaW9uIG9mIHRoaXMgYnVmZmVyLCB0aGVuIHdlIGRvbid0CisJICogbmVlZCB0byBtYWtlIGFub3RoZXIgb25lCisJICovCisJaWYgKGpoLT5iX2Zyb3plbl9kYXRhKSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJoYXMgZnJvemVuIGRhdGEiKTsKKwkJSl9BU1NFUlRfSkgoamgsIGpoLT5iX25leHRfdHJhbnNhY3Rpb24gPT0gTlVMTCk7CisJCWpoLT5iX25leHRfdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjsKKwkJZ290byBkb25lOworCX0KKworCS8qIElzIHRoZXJlIGRhdGEgaGVyZSB3ZSBuZWVkIHRvIHByZXNlcnZlPyAqLworCisJaWYgKGpoLT5iX3RyYW5zYWN0aW9uICYmIGpoLT5iX3RyYW5zYWN0aW9uICE9IHRyYW5zYWN0aW9uKSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJvd25lZCBieSBvbGRlciB0cmFuc2FjdGlvbiIpOworCQlKX0FTU0VSVF9KSChqaCwgamgtPmJfbmV4dF90cmFuc2FjdGlvbiA9PSBOVUxMKTsKKwkJSl9BU1NFUlRfSkgoamgsIGpoLT5iX3RyYW5zYWN0aW9uID09CisJCQkJCWpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbik7CisKKwkJLyogVGhlcmUgaXMgb25lIGNhc2Ugd2UgaGF2ZSB0byBiZSB2ZXJ5IGNhcmVmdWwgYWJvdXQuCisJCSAqIElmIHRoZSBjb21taXR0aW5nIHRyYW5zYWN0aW9uIGlzIGN1cnJlbnRseSB3cml0aW5nCisJCSAqIHRoaXMgYnVmZmVyIG91dCB0byBkaXNrIGFuZCBoYXMgTk9UIG1hZGUgYSBjb3B5LW91dCwKKwkJICogdGhlbiB3ZSBjYW5ub3QgbW9kaWZ5IHRoZSBidWZmZXIgY29udGVudHMgYXQgYWxsCisJCSAqIHJpZ2h0IG5vdy4gIFRoZSBlc3NlbmNlIG9mIGNvcHktb3V0IGlzIHRoYXQgaXQgaXMgdGhlCisJCSAqIGV4dHJhIGNvcHksIG5vdCB0aGUgcHJpbWFyeSBjb3B5LCB3aGljaCBnZXRzCisJCSAqIGpvdXJuYWxlZC4gIElmIHRoZSBwcmltYXJ5IGNvcHkgaXMgYWxyZWFkeSBnb2luZyB0bworCQkgKiBkaXNrIHRoZW4gd2UgY2Fubm90IGRvIGNvcHktb3V0IGhlcmUuICovCisKKwkJaWYgKGpoLT5iX2psaXN0ID09IEJKX1NoYWRvdykgeworCQkJREVGSU5FX1dBSVRfQklUKHdhaXQsICZiaC0+Yl9zdGF0ZSwgQkhfVW5zaGFkb3cpOworCQkJd2FpdF9xdWV1ZV9oZWFkX3QgKndxaDsKKworCQkJd3FoID0gYml0X3dhaXRxdWV1ZSgmYmgtPmJfc3RhdGUsIEJIX1Vuc2hhZG93KTsKKworCQkJSkJVRkZFUl9UUkFDRShqaCwgIm9uIHNoYWRvdzogc2xlZXAiKTsKKwkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQkJLyogY29tbWl0IHdha2VzIHVwIGFsbCBzaGFkb3cgYnVmZmVycyBhZnRlciBJTyAqLworCQkJZm9yICggOyA7ICkgeworCQkJCXByZXBhcmVfdG9fd2FpdCh3cWgsICZ3YWl0LndhaXQsCisJCQkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQkJaWYgKGpoLT5iX2psaXN0ICE9IEJKX1NoYWRvdykKKwkJCQkJYnJlYWs7CisJCQkJc2NoZWR1bGUoKTsKKwkJCX0KKwkJCWZpbmlzaF93YWl0KHdxaCwgJndhaXQud2FpdCk7CisJCQlnb3RvIHJlcGVhdDsKKwkJfQorCisJCS8qIE9ubHkgZG8gdGhlIGNvcHkgaWYgdGhlIGN1cnJlbnRseS1vd25pbmcgdHJhbnNhY3Rpb24KKwkJICogc3RpbGwgbmVlZHMgaXQuICBJZiBpdCBpcyBvbiB0aGUgRm9yZ2V0IGxpc3QsIHRoZQorCQkgKiBjb21taXR0aW5nIHRyYW5zYWN0aW9uIGlzIHBhc3QgdGhhdCBzdGFnZS4gIFRoZQorCQkgKiBidWZmZXIgaGFkIGJldHRlciByZW1haW4gbG9ja2VkIGR1cmluZyB0aGUga21hbGxvYywKKwkJICogYnV0IHRoYXQgc2hvdWxkIGJlIHRydWUgLS0tIHdlIGhvbGQgdGhlIGpvdXJuYWwgbG9jaworCQkgKiBzdGlsbCBhbmQgdGhlIGJ1ZmZlciBpcyBhbHJlYWR5IG9uIHRoZSBCVUZfSk9VUk5BTAorCQkgKiBsaXN0IHNvIHdvbid0IGJlIGZsdXNoZWQuIAorCQkgKgorCQkgKiBTdWJ0bGUgcG9pbnQsIHRob3VnaDogaWYgdGhpcyBpcyBhIGdldF91bmRvX2FjY2VzcywKKwkJICogdGhlbiB3ZSB3aWxsIGJlIHJlbHlpbmcgb24gdGhlIGZyb3plbl9kYXRhIHRvIGNvbnRhaW4KKwkJICogdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY29tbWl0dGVkX2RhdGEgcmVjb3JkIGFmdGVyIHRoZQorCQkgKiB0cmFuc2FjdGlvbiwgc28gd2UgSEFWRSB0byBmb3JjZSB0aGUgZnJvemVuX2RhdGEgY29weQorCQkgKiBpbiB0aGF0IGNhc2UuICovCisKKwkJaWYgKGpoLT5iX2psaXN0ICE9IEJKX0ZvcmdldCB8fCBmb3JjZV9jb3B5KSB7CisJCQlKQlVGRkVSX1RSQUNFKGpoLCAiZ2VuZXJhdGUgZnJvemVuIGRhdGEiKTsKKwkJCWlmICghZnJvemVuX2J1ZmZlcikgeworCQkJCUpCVUZGRVJfVFJBQ0UoamgsICJhbGxvY2F0ZSBtZW1vcnkgZm9yIGJ1ZmZlciIpOworCQkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQkJCWZyb3plbl9idWZmZXIgPSBqYmRfa21hbGxvYyhqaDJiaChqaCktPmJfc2l6ZSwKKwkJCQkJCQkgICAgR0ZQX05PRlMpOworCQkJCWlmICghZnJvemVuX2J1ZmZlcikgeworCQkJCQlwcmludGsoS0VSTl9FTUVSRworCQkJCQkgICAgICAgIiVzOiBPT00gZm9yIGZyb3plbl9idWZmZXJcbiIsCisJCQkJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQkJCQlKQlVGRkVSX1RSQUNFKGpoLCAib29tISIpOworCQkJCQllcnJvciA9IC1FTk9NRU07CisJCQkJCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCQkJZ290byBkb25lOworCQkJCX0KKwkJCQlnb3RvIHJlcGVhdDsKKwkJCX0KKwkJCWpoLT5iX2Zyb3plbl9kYXRhID0gZnJvemVuX2J1ZmZlcjsKKwkJCWZyb3plbl9idWZmZXIgPSBOVUxMOworCQkJbmVlZF9jb3B5ID0gMTsKKwkJfQorCQlqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CisJfQorCisKKwkvKgorCSAqIEZpbmFsbHksIGlmIHRoZSBidWZmZXIgaXMgbm90IGpvdXJuYWxlZCByaWdodCBub3csIHdlIG5lZWQgdG8gbWFrZQorCSAqIHN1cmUgaXQgZG9lc24ndCBnZXQgd3JpdHRlbiB0byBkaXNrIGJlZm9yZSB0aGUgY2FsbGVyIGFjdHVhbGx5CisJICogY29tbWl0cyB0aGUgbmV3IGRhdGEKKwkgKi8KKwlpZiAoIWpoLT5iX3RyYW5zYWN0aW9uKSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJubyB0cmFuc2FjdGlvbiIpOworCQlKX0FTU0VSVF9KSChqaCwgIWpoLT5iX25leHRfdHJhbnNhY3Rpb24pOworCQlqaC0+Yl90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uOworCQlKQlVGRkVSX1RSQUNFKGpoLCAiZmlsZSBhcyBCSl9SZXNlcnZlZCIpOworCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJX19qb3VybmFsX2ZpbGVfYnVmZmVyKGpoLCB0cmFuc2FjdGlvbiwgQkpfUmVzZXJ2ZWQpOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCX0KKworZG9uZToKKwlpZiAobmVlZF9jb3B5KSB7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCQlpbnQgb2Zmc2V0OworCQljaGFyICpzb3VyY2U7CisKKwkJSl9FWFBFQ1RfSkgoamgsIGJ1ZmZlcl91cHRvZGF0ZShqaDJiaChqaCkpLAorCQkJICAgICJQb3NzaWJsZSBJTyBmYWlsdXJlLlxuIik7CisJCXBhZ2UgPSBqaDJiaChqaCktPmJfcGFnZTsKKwkJb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nKSBqaDJiaChqaCktPmJfZGF0YSkgJiB+UEFHRV9NQVNLOworCQlzb3VyY2UgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCW1lbWNweShqaC0+Yl9mcm96ZW5fZGF0YSwgc291cmNlK29mZnNldCwgamgyYmgoamgpLT5iX3NpemUpOworCQlrdW5tYXBfYXRvbWljKHNvdXJjZSwgS01fVVNFUjApOworCX0KKwlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKworCS8qCisJICogSWYgd2UgYXJlIGFib3V0IHRvIGpvdXJuYWwgYSBidWZmZXIsIHRoZW4gYW55IHJldm9rZSBwZW5kaW5nIG9uIGl0IGlzCisJICogbm8gbG9uZ2VyIHZhbGlkCisJICovCisJam91cm5hbF9jYW5jZWxfcmV2b2tlKGhhbmRsZSwgamgpOworCitvdXQ6CisJaWYgKGZyb3plbl9idWZmZXIpCisJCWtmcmVlKGZyb3plbl9idWZmZXIpOworCisJSkJVRkZFUl9UUkFDRShqaCwgImV4aXQiKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogaW50IGpvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcygpIC0gbm90aWZ5IGludGVudCB0byBtb2RpZnkgYSBidWZmZXIgZm9yIG1ldGFkYXRhIChub3QgZGF0YSkgdXBkYXRlLgorICogQGhhbmRsZTogdHJhbnNhY3Rpb24gdG8gYWRkIGJ1ZmZlciBtb2RpZmljYXRpb25zIHRvCisgKiBAYmg6ICAgICBiaCB0byBiZSB1c2VkIGZvciBtZXRhZGF0YSB3cml0ZXMKKyAqIEBjcmVkaXRzOiB2YXJpYWJsZSB0aGF0IHdpbGwgcmVjZWl2ZSBjcmVkaXRzIGZvciB0aGUgYnVmZmVyCisgKgorICogUmV0dXJucyBhbiBlcnJvciBjb2RlIG9yIDAgb24gc3VjY2Vzcy4KKyAqCisgKiBJbiBmdWxsIGRhdGEgam91cm5hbGxpbmcgbW9kZSB0aGUgYnVmZmVyIG1heSBiZSBvZiB0eXBlIEJKX0FzeW5jRGF0YSwKKyAqIGJlY2F1c2Ugd2UncmUgd3JpdGUoKWluZyBhIGJ1ZmZlciB3aGljaCBpcyBhbHNvIHBhcnQgb2YgYSBzaGFyZWQgbWFwcGluZy4KKyAqLworCitpbnQgam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqamggPSBqb3VybmFsX2FkZF9qb3VybmFsX2hlYWQoYmgpOworCWludCByYzsKKworCS8qIFdlIGRvIG5vdCB3YW50IHRvIGdldCBjYXVnaHQgcGxheWluZyB3aXRoIGZpZWxkcyB3aGljaCB0aGUKKwkgKiBsb2cgdGhyZWFkIGFsc28gbWFuaXB1bGF0ZXMuICBNYWtlIHN1cmUgdGhhdCB0aGUgYnVmZmVyCisJICogY29tcGxldGVzIGFueSBvdXRzdGFuZGluZyBJTyBiZWZvcmUgcHJvY2VlZGluZy4gKi8KKwlyYyA9IGRvX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBqaCwgMCk7CisJam91cm5hbF9wdXRfam91cm5hbF9oZWFkKGpoKTsKKwlyZXR1cm4gcmM7Cit9CisKKworLyoKKyAqIFdoZW4gdGhlIHVzZXIgd2FudHMgdG8gam91cm5hbCBhIG5ld2x5IGNyZWF0ZWQgYnVmZmVyX2hlYWQKKyAqIChpZS4gZ2V0YmxrKCkgcmV0dXJuZWQgYSBuZXcgYnVmZmVyIGFuZCB3ZSBhcmUgZ29pbmcgdG8gcG9wdWxhdGUgaXQKKyAqIG1hbnVhbGx5IHJhdGhlciB0aGFuIHJlYWRpbmcgb2ZmIGRpc2spLCB0aGVuIHdlIG5lZWQgdG8ga2VlcCB0aGUKKyAqIGJ1ZmZlcl9oZWFkIGxvY2tlZCB1bnRpbCBpdCBoYXMgYmVlbiBjb21wbGV0ZWx5IGZpbGxlZCB3aXRoIG5ldworICogZGF0YS4gIEluIHRoaXMgY2FzZSwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gbWFrZSB0aGUgYXNzZXJ0aW9uIHRoYXQKKyAqIHRoZSBiaCBpcyBub3QgYWxyZWFkeSBwYXJ0IG9mIGFuIGV4aXN0aW5nIHRyYW5zYWN0aW9uLiAgCisgKiAKKyAqIFRoZSBidWZmZXIgc2hvdWxkIGFscmVhZHkgYmUgbG9ja2VkIGJ5IHRoZSBjYWxsZXIgYnkgdGhpcyBwb2ludC4KKyAqIFRoZXJlIGlzIG5vIGxvY2sgcmFua2luZyB2aW9sYXRpb246IGl0IHdhcyBhIG5ld2x5IGNyZWF0ZWQsCisgKiB1bmxvY2tlZCBidWZmZXIgYmVmb3JlaGFuZC4gKi8KKworLyoqCisgKiBpbnQgam91cm5hbF9nZXRfY3JlYXRlX2FjY2VzcyAoKSAtIG5vdGlmeSBpbnRlbnQgdG8gdXNlIG5ld2x5IGNyZWF0ZWQgYmgKKyAqIEBoYW5kbGU6IHRyYW5zYWN0aW9uIHRvIG5ldyBidWZmZXIgdG8KKyAqIEBiaDogbmV3IGJ1ZmZlci4KKyAqCisgKiBDYWxsIHRoaXMgaWYgeW91IGNyZWF0ZSBhIG5ldyBiaC4KKyAqLworaW50IGpvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb247CisJam91cm5hbF90ICpqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGpvdXJuYWxfYWRkX2pvdXJuYWxfaGVhZChiaCk7CisJaW50IGVycjsKKworCWpiZF9kZWJ1Zyg1LCAiam91cm5hbF9oZWFkICVwXG4iLCBqaCk7CisJZXJyID0gLUVST0ZTOworCWlmIChpc19oYW5kbGVfYWJvcnRlZChoYW5kbGUpKQorCQlnb3RvIG91dDsKKwllcnIgPSAwOworCisJSkJVRkZFUl9UUkFDRShqaCwgImVudHJ5Iik7CisJLyoKKwkgKiBUaGUgYnVmZmVyIG1heSBhbHJlYWR5IGJlbG9uZyB0byB0aGlzIHRyYW5zYWN0aW9uIGR1ZSB0byBwcmUtemVyb2luZworCSAqIGluIHRoZSBmaWxlc3lzdGVtJ3MgbmV3X2Jsb2NrIGNvZGUuICBJdCBtYXkgYWxzbyBiZSBvbiB0aGUgcHJldmlvdXMsCisJICogY29tbWl0dGluZyB0cmFuc2FjdGlvbidzIGxpc3RzLCBidXQgaXQgSEFTIHRvIGJlIGluIEZvcmdldCBzdGF0ZSBpbgorCSAqIHRoYXQgY2FzZTogdGhlIHRyYW5zYWN0aW9uIG11c3QgaGF2ZSBkZWxldGVkIHRoZSBidWZmZXIgZm9yIGl0IHRvIGJlCisJICogcmV1c2VkIGhlcmUuCisJICovCisJamJkX2xvY2tfYmhfc3RhdGUoYmgpOworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCUpfQVNTRVJUX0pIKGpoLCAoamgtPmJfdHJhbnNhY3Rpb24gPT0gdHJhbnNhY3Rpb24gfHwKKwkJamgtPmJfdHJhbnNhY3Rpb24gPT0gTlVMTCB8fAorCQkoamgtPmJfdHJhbnNhY3Rpb24gPT0gam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uICYmCisJCQkgIGpoLT5iX2psaXN0ID09IEJKX0ZvcmdldCkpKTsKKworCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09IE5VTEwpOworCUpfQVNTRVJUX0pIKGpoLCBidWZmZXJfbG9ja2VkKGpoMmJoKGpoKSkpOworCisJaWYgKGpoLT5iX3RyYW5zYWN0aW9uID09IE5VTEwpIHsKKwkJamgtPmJfdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjsKKwkJSkJVRkZFUl9UUkFDRShqaCwgImZpbGUgYXMgQkpfUmVzZXJ2ZWQiKTsKKwkJX19qb3VybmFsX2ZpbGVfYnVmZmVyKGpoLCB0cmFuc2FjdGlvbiwgQkpfUmVzZXJ2ZWQpOworCX0gZWxzZSBpZiAoamgtPmJfdHJhbnNhY3Rpb24gPT0gam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJzZXQgbmV4dCB0cmFuc2FjdGlvbiIpOworCQlqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CisJfQorCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisKKwkvKgorCSAqIGFrcG06IEkgYWRkZWQgdGhpcy4gIGV4dDNfYWxsb2NfYnJhbmNoIGNhbiBwaWNrIHVwIG5ldyBpbmRpcmVjdAorCSAqIGJsb2NrcyB3aGljaCBjb250YWluIGZyZWVkIGJ1dCB0aGVuIHJldm9rZWQgbWV0YWRhdGEuICBXZSBuZWVkCisJICogdG8gY2FuY2VsIHRoZSByZXZva2UgaW4gY2FzZSB3ZSBlbmQgdXAgZnJlZWluZyBpdCB5ZXQgYWdhaW4KKwkgKiBhbmQgdGhlIHJlYWxsb2NhdGluZyBhcyBkYXRhIC0gdGhpcyB3b3VsZCBjYXVzZSBhIHNlY29uZCByZXZva2UsCisJICogd2hpY2ggaGl0cyBhbiBhc3NlcnRpb24gZXJyb3IuCisJICovCisJSkJVRkZFUl9UUkFDRShqaCwgImNhbmNlbGxpbmcgcmV2b2tlIik7CisJam91cm5hbF9jYW5jZWxfcmV2b2tlKGhhbmRsZSwgamgpOworCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBpbnQgam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoKSAtICBOb3RpZnkgaW50ZW50IHRvIG1vZGlmeSBtZXRhZGF0YSB3aXRoCisgKiAgICAgbm9uLXJld2luZGFibGUgY29uc2VxdWVuY2VzCisgKiBAaGFuZGxlOiB0cmFuc2FjdGlvbgorICogQGJoOiBidWZmZXIgdG8gdW5kbworICogQGNyZWRpdHM6IHN0b3JlIHRoZSBudW1iZXIgb2YgdGFrZW4gY3JlZGl0cyBoZXJlIChpZiBub3QgTlVMTCkKKyAqCisgKiBTb21ldGltZXMgdGhlcmUgaXMgYSBuZWVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbWV0YWRhdGEgd2hpY2ggaGFzCisgKiBiZWVuIGNvbW1pdHRlZCB0byBkaXNrIGFuZCB0aGF0IHdoaWNoIGhhcyBub3QuICBUaGUgZXh0M2ZzIGNvZGUgdXNlcworICogdGhpcyBmb3IgZnJlZWluZyBhbmQgYWxsb2NhdGluZyBzcGFjZSwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB3ZQorICogZG8gbm90IHJldXNlIGZyZWVkIHNwYWNlIHVudGlsIHRoZSBkZWFsbG9jYXRpb24gaGFzIGJlZW4gY29tbWl0dGVkLAorICogc2luY2UgaWYgd2Ugb3Zlcndyb3RlIHRoYXQgc3BhY2Ugd2Ugd291bGQgbWFrZSB0aGUgZGVsZXRlCisgKiB1bi1yZXdpbmRhYmxlIGluIGNhc2Ugb2YgYSBjcmFzaC4KKyAqIAorICogVG8gZGVhbCB3aXRoIHRoYXQsIGpvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzIHJlcXVlc3RzIHdyaXRlIGFjY2VzcyB0byBhCisgKiBidWZmZXIgZm9yIHBhcnRzIG9mIG5vbi1yZXdpbmRhYmxlIG9wZXJhdGlvbnMgc3VjaCBhcyBkZWxldGUKKyAqIG9wZXJhdGlvbnMgb24gdGhlIGJpdG1hcHMuICBUaGUgam91cm5hbGluZyBjb2RlIG11c3Qga2VlcCBhIGNvcHkgb2YKKyAqIHRoZSBidWZmZXIncyBjb250ZW50cyBwcmlvciB0byB0aGUgdW5kb19hY2Nlc3MgY2FsbCB1bnRpbCBzdWNoIHRpbWUKKyAqIGFzIHdlIGtub3cgdGhhdCB0aGUgYnVmZmVyIGhhcyBkZWZpbml0ZWx5IGJlZW4gY29tbWl0dGVkIHRvIGRpc2suCisgKiAKKyAqIFdlIG5ldmVyIG5lZWQgdG8ga25vdyB3aGljaCB0cmFuc2FjdGlvbiB0aGUgY29tbWl0dGVkIGRhdGEgaXMgcGFydAorICogb2YsIGJ1ZmZlcnMgdG91Y2hlZCBoZXJlIGFyZSBndWFyYW50ZWVkIHRvIGJlIGRpcnRpZWQgbGF0ZXIgYW5kIHNvCisgKiB3aWxsIGJlIGNvbW1pdHRlZCB0byBhIG5ldyB0cmFuc2FjdGlvbiBpbiBkdWUgY291cnNlLCBhdCB3aGljaCBwb2ludAorICogd2UgY2FuIGRpc2NhcmQgdGhlIG9sZCBjb21taXR0ZWQgZGF0YSBwb2ludGVyLgorICoKKyAqIFJldHVybnMgZXJyb3IgbnVtYmVyIG9yIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IGpvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGpvdXJuYWxfYWRkX2pvdXJuYWxfaGVhZChiaCk7CisJY2hhciAqY29tbWl0dGVkX2RhdGEgPSBOVUxMOworCisJSkJVRkZFUl9UUkFDRShqaCwgImVudHJ5Iik7CisKKwkvKgorCSAqIERvIHRoaXMgZmlyc3QgLS0tIGl0IGNhbiBkcm9wIHRoZSBqb3VybmFsIGxvY2ssIHNvIHdlIHdhbnQgdG8KKwkgKiBtYWtlIHN1cmUgdGhhdCBvYnRhaW5pbmcgdGhlIGNvbW1pdHRlZF9kYXRhIGlzIGRvbmUKKwkgKiBhdG9taWNhbGx5IHdydC4gY29tcGxldGlvbiBvZiBhbnkgb3V0c3RhbmRpbmcgY29tbWl0cy4KKwkgKi8KKwllcnIgPSBkb19nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgamgsIDEpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCityZXBlYXQ6CisJaWYgKCFqaC0+Yl9jb21taXR0ZWRfZGF0YSkgeworCQljb21taXR0ZWRfZGF0YSA9IGpiZF9rbWFsbG9jKGpoMmJoKGpoKS0+Yl9zaXplLCBHRlBfTk9GUyk7CisJCWlmICghY29tbWl0dGVkX2RhdGEpIHsKKwkJCXByaW50ayhLRVJOX0VNRVJHICIlczogTm8gbWVtb3J5IGZvciBjb21taXR0ZWQgZGF0YVxuIiwKKwkJCQlfX0ZVTkNUSU9OX18pOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJamJkX2xvY2tfYmhfc3RhdGUoYmgpOworCWlmICghamgtPmJfY29tbWl0dGVkX2RhdGEpIHsKKwkJLyogQ29weSBvdXQgdGhlIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIGludG8gdGhlCisJCSAqIHByZXNlcnZlZCwgY29tbWl0dGVkIGNvcHkuICovCisJCUpCVUZGRVJfVFJBQ0UoamgsICJnZW5lcmF0ZSBiX2NvbW1pdHRlZCBkYXRhIik7CisJCWlmICghY29tbWl0dGVkX2RhdGEpIHsKKwkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQkJZ290byByZXBlYXQ7CisJCX0KKworCQlqaC0+Yl9jb21taXR0ZWRfZGF0YSA9IGNvbW1pdHRlZF9kYXRhOworCQljb21taXR0ZWRfZGF0YSA9IE5VTEw7CisJCW1lbWNweShqaC0+Yl9jb21taXR0ZWRfZGF0YSwgYmgtPmJfZGF0YSwgYmgtPmJfc2l6ZSk7CisJfQorCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworb3V0OgorCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CisJaWYgKGNvbW1pdHRlZF9kYXRhKQorCQlrZnJlZShjb21taXR0ZWRfZGF0YSk7CisJcmV0dXJuIGVycjsKK30KKworLyoqIAorICogaW50IGpvdXJuYWxfZGlydHlfZGF0YSgpIC0gIG1hcmsgYSBidWZmZXIgYXMgY29udGFpbmluZyBkaXJ0eSBkYXRhIHdoaWNoCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHMgdG8gYmUgZmx1c2hlZCBiZWZvcmUgd2UgY2FuIGNvbW1pdCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHRyYW5zYWN0aW9uLiAgCisgKiBAaGFuZGxlOiB0cmFuc2FjdGlvbgorICogQGJoOiBidWZmZXJoZWFkIHRvIG1hcmsKKyAqIAorICogVGhlIGJ1ZmZlciBpcyBwbGFjZWQgb24gdGhlIHRyYW5zYWN0aW9uJ3MgZGF0YSBsaXN0IGFuZCBpcyBtYXJrZWQgYXMKKyAqIGJlbG9uZ2luZyB0byB0aGUgdHJhbnNhY3Rpb24uCisgKgorICogUmV0dXJucyBlcnJvciBudW1iZXIgb3IgMCBvbiBzdWNjZXNzLgorICoKKyAqIGpvdXJuYWxfZGlydHlfZGF0YSgpIGNhbiBiZSBjYWxsZWQgdmlhIHBhZ2VfbGF1bmRlci0+ZXh0M193cml0ZXBhZ2UKKyAqIGJ5IGtzd2FwZC4KKyAqLworaW50IGpvdXJuYWxfZGlydHlfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWpvdXJuYWxfdCAqam91cm5hbCA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF9qb3VybmFsOworCWludCBuZWVkX2JyZWxzZSA9IDA7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqamg7CisKKwlpZiAoaXNfaGFuZGxlX2Fib3J0ZWQoaGFuZGxlKSkKKwkJcmV0dXJuIDA7CisKKwlqaCA9IGpvdXJuYWxfYWRkX2pvdXJuYWxfaGVhZChiaCk7CisJSkJVRkZFUl9UUkFDRShqaCwgImVudHJ5Iik7CisKKwkvKgorCSAqIFRoZSBidWZmZXIgY291bGQgKmFscmVhZHkqIGJlIGRpcnR5LiAgV3JpdGVvdXQgY2FuIHN0YXJ0CisJICogYXQgYW55IHRpbWUuCisJICovCisJamJkX2RlYnVnKDQsICJqaDogJXAsIHRpZDolZFxuIiwgamgsIGhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF90aWQpOworCisJLyoKKwkgKiBXaGF0IGlmIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBwYXJ0IG9mIGEgcnVubmluZyB0cmFuc2FjdGlvbj8KKwkgKiAKKwkgKiBUaGVyZSBhcmUgdHdvIGNhc2VzOgorCSAqIDEpIEl0IGlzIHBhcnQgb2YgdGhlIGN1cnJlbnQgcnVubmluZyB0cmFuc2FjdGlvbi4gIFJlZmlsZSBpdCwKKwkgKiAgICBqdXN0IGluIGNhc2Ugd2UgaGF2ZSBhbGxvY2F0ZWQgaXQgYXMgbWV0YWRhdGEsIGRlYWxsb2NhdGVkCisJICogICAgaXQsIHRoZW4gcmVhbGxvY2F0ZWQgaXQgYXMgZGF0YS4gCisJICogMikgSXQgaXMgcGFydCBvZiB0aGUgcHJldmlvdXMsIHN0aWxsLWNvbW1pdHRpbmcgdHJhbnNhY3Rpb24uCisJICogICAgSWYgYWxsIHdlIHdhbnQgdG8gZG8gaXMgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGJ1ZmZlciB3aWxsIGJlCisJICogICAgd3JpdHRlbiB0byBkaXNrIGJlZm9yZSB0aGlzIG5ldyB0cmFuc2FjdGlvbiBjb21taXRzLCB0aGVuCisJICogICAgYmVpbmcgc3VyZSB0aGF0IHRoZSAqcHJldmlvdXMqIHRyYW5zYWN0aW9uIGhhcyB0aGlzIHNhbWUgCisJICogICAgcHJvcGVydHkgaXMgc3VmZmljaWVudCBmb3IgdXMhICBKdXN0IGxlYXZlIGl0IG9uIGl0cyBvbGQKKwkgKiAgICB0cmFuc2FjdGlvbi4KKwkgKgorCSAqIEluIGNhc2UgKDIpLCB0aGUgYnVmZmVyIG11c3Qgbm90IGFscmVhZHkgZXhpc3QgYXMgbWV0YWRhdGEKKwkgKiAtLS0gdGhhdCB3b3VsZCB2aW9sYXRlIHdyaXRlIG9yZGVyaW5nIChhIHRyYW5zYWN0aW9uIGlzIGZyZWUKKwkgKiB0byB3cml0ZSBpdHMgZGF0YSBhdCBhbnkgcG9pbnQsIGV2ZW4gYmVmb3JlIHRoZSBwcmV2aW91cworCSAqIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24gaGFzIGNvbW1pdHRlZCkuICBUaGUgY2FsbGVyIG11c3QKKwkgKiBuZXZlciwgZXZlciBhbGxvdyB0aGlzIHRvIGhhcHBlbjogdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbworCSAqIGFib3V0IGl0IGluIHRoaXMgbGF5ZXIuCisJICovCisJamJkX2xvY2tfYmhfc3RhdGUoYmgpOworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCWlmIChqaC0+Yl90cmFuc2FjdGlvbikgeworCQlKQlVGRkVSX1RSQUNFKGpoLCAiaGFzIHRyYW5zYWN0aW9uIik7CisJCWlmIChqaC0+Yl90cmFuc2FjdGlvbiAhPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb24pIHsKKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJiZWxvbmdzIHRvIG9sZGVyIHRyYW5zYWN0aW9uIik7CisJCQlKX0FTU0VSVF9KSChqaCwgamgtPmJfdHJhbnNhY3Rpb24gPT0KKwkJCQkJam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKTsKKworCQkJLyogQEBAIElTIFRISVMgVFJVRSAgPyAqLworCQkJLyoKKwkJCSAqIE5vdCBhbnkgbW9yZS4gIFNjZW5hcmlvOiBzb21lb25lIGRvZXMgYSB3cml0ZSgpCisJCQkgKiBpbiBkYXRhPWpvdXJuYWwgbW9kZS4gIFRoZSBidWZmZXIncyB0cmFuc2FjdGlvbiBoYXMKKwkJCSAqIG1vdmVkIGludG8gY29tbWl0LiAgVGhlbiBzb21lb25lIGRvZXMgYW5vdGhlcgorCQkJICogd3JpdGUoKSB0byB0aGUgZmlsZS4gIFdlIGRvIHRoZSBmcm96ZW4gZGF0YSBjb3B5b3V0CisJCQkgKiBhbmQgc2V0IGJfbmV4dF90cmFuc2FjdGlvbiB0byBwb2ludCB0byBqX3J1bm5pbmdfdC4KKwkJCSAqIEFuZCB3aGlsZSB3ZSdyZSBpbiB0aGF0IHN0YXRlLCBzb21lb25lIGRvZXMgYQorCQkJICogd3JpdGVwYWdlKCkgaW4gYW4gYXR0ZW1wdCB0byBwYWdlb3V0IHRoZSBzYW1lIGFyZWEKKwkJCSAqIG9mIHRoZSBmaWxlIHZpYSBhIHNoYXJlZCBtYXBwaW5nLiAgQXQgcHJlc2VudCB0aGF0CisJCQkgKiBjYWxscyBqb3VybmFsX2RpcnR5X2RhdGEoKSwgYW5kIHdlIGdldCByaWdodCBoZXJlLgorCQkJICogSXQgbWF5IGJlIHRvbyBsYXRlIHRvIGpvdXJuYWwgdGhlIGRhdGEuICBTaW1wbHkKKwkJCSAqIGZhbGxpbmcgdGhyb3VnaCB0byB0aGUgbmV4dCB0ZXN0IHdpbGwgc3VmZmljZTogdGhlCisJCQkgKiBkYXRhIHdpbGwgYmUgZGlydHkgYW5kIHdpbCBiZSBjaGVja3BvaW50ZWQuICBUaGUKKwkJCSAqIG9yZGVyaW5nIGNvbW1lbnRzIGluIHRoZSBuZXh0IGNvbW1lbnQgYmxvY2sgc3RpbGwKKwkJCSAqIGFwcGx5LgorCQkJICovCisJCQkvL0pfQVNTRVJUX0pIKGpoLCBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09IE5VTEwpOworCisJCQkvKgorCQkJICogSWYgd2UncmUgam91cm5hbGxpbmcgZGF0YSwgYW5kIHRoaXMgYnVmZmVyIHdhcworCQkJICogc3ViamVjdCB0byBhIHdyaXRlKCksIGl0IGNvdWxkIGJlIG1ldGFkYXRhLCBmb3JnZXQKKwkJCSAqIG9yIHNoYWRvdyBhZ2FpbnN0IHRoZSBjb21taXR0aW5nIHRyYW5zYWN0aW9uLiAgTm93LAorCQkJICogc29tZW9uZSBoYXMgZGlydGllZCB0aGUgc2FtZSBkYXJuIHBhZ2UgdmlhIGEgbWFwcGluZworCQkJICogYW5kIGl0IGlzIGJlaW5nIHdyaXRlcGFnZSgpJ2QuCisJCQkgKiBXZSAqY291bGQqIGp1c3Qgc3RlYWwgdGhlIHBhZ2UgZnJvbSBjb21taXQsIHdpdGggc29tZQorCQkJICogZmFuY3kgbG9ja2luZyB0aGVyZS4gIEluc3RlYWQsIHdlIGp1c3Qgc2tpcCBpdCAtCisJCQkgKiBkb24ndCB0aWUgdGhlIHBhZ2UncyBidWZmZXJzIHRvIHRoZSBuZXcgdHJhbnNhY3Rpb24KKwkJCSAqIGF0IGFsbC4KKwkJCSAqIEltcGxpY2F0aW9uOiBpZiB3ZSBjcmFzaCBiZWZvcmUgdGhlIHdyaXRlcGFnZSgpIGRhdGEKKwkJCSAqIGlzIHdyaXR0ZW4gaW50byB0aGUgZmlsZXN5c3RlbSwgcmVjb3Zlcnkgd2lsbCByZXBsYXkKKwkJCSAqIHRoZSB3cml0ZSgpIGRhdGEuCisJCQkgKi8KKwkJCWlmIChqaC0+Yl9qbGlzdCAhPSBCSl9Ob25lICYmCisJCQkJCWpoLT5iX2psaXN0ICE9IEJKX1N5bmNEYXRhICYmCisJCQkJCWpoLT5iX2psaXN0ICE9IEJKX0xvY2tlZCkgeworCQkJCUpCVUZGRVJfVFJBQ0UoamgsICJOb3Qgc3RlYWxpbmciKTsKKwkJCQlnb3RvIG5vX2pvdXJuYWw7CisJCQl9CisKKwkJCS8qCisJCQkgKiBUaGlzIGJ1ZmZlciBtYXkgYmUgdW5kZXJnb2luZyB3cml0ZW91dCBpbiBjb21taXQuICBXZQorCQkJICogY2FuJ3QgcmV0dXJuIGZyb20gaGVyZSBhbmQgbGV0IHRoZSBjYWxsZXIgZGlydHkgaXQKKwkJCSAqIGFnYWluIGJlY2F1c2UgdGhhdCBjYW4gY2F1c2UgdGhlIHdyaXRlLW91dCBsb29wIGluCisJCQkgKiBjb21taXQgdG8gbmV2ZXIgdGVybWluYXRlLgorCQkJICovCisJCQlpZiAoYnVmZmVyX2RpcnR5KGJoKSkgeworCQkJCWdldF9iaChiaCk7CisJCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCQluZWVkX2JyZWxzZSA9IDE7CisJCQkJc3luY19kaXJ0eV9idWZmZXIoYmgpOworCQkJCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCQkvKiBUaGUgYnVmZmVyIG1heSBiZWNvbWUgbG9ja2VkIGFnYWluIGF0IGFueQorCQkJCSAgIHRpbWUgaWYgaXQgaXMgcmVkaXJ0aWVkICovCisJCQl9CisKKwkJCS8qIGpvdXJuYWxfY2xlYW5fZGF0YV9saXN0KCkgbWF5IGhhdmUgZ290IHRoZXJlIGZpcnN0ICovCisJCQlpZiAoamgtPmJfdHJhbnNhY3Rpb24gIT0gTlVMTCkgeworCQkJCUpCVUZGRVJfVFJBQ0UoamgsICJ1bmZpbGUgZnJvbSBjb21taXQiKTsKKwkJCQlfX2pvdXJuYWxfdGVtcF91bmxpbmtfYnVmZmVyKGpoKTsKKwkJCQkvKiBJdCBzdGlsbCBwb2ludHMgdG8gdGhlIGNvbW1pdHRpbmcKKwkJCQkgKiB0cmFuc2FjdGlvbjsgbW92ZSBpdCB0byB0aGlzIG9uZSBzbworCQkJCSAqIHRoYXQgdGhlIHJlZmlsZSBhc3NlcnQgY2hlY2tzIGFyZQorCQkJCSAqIGhhcHB5LiAqLworCQkJCWpoLT5iX3RyYW5zYWN0aW9uID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uOworCQkJfQorCQkJLyogVGhlIGJ1ZmZlciB3aWxsIGJlIHJlZmlsZWQgYmVsb3cgKi8KKworCQl9CisJCS8qCisJCSAqIFNwZWNpYWwgY2FzZSAtLS0gdGhlIGJ1ZmZlciBtaWdodCBhY3R1YWxseSBoYXZlIGJlZW4KKwkJICogYWxsb2NhdGVkIGFuZCB0aGVuIGltbWVkaWF0ZWx5IGRlYWxsb2NhdGVkIGluIHRoZSBwcmV2aW91cywKKwkJICogY29tbWl0dGluZyB0cmFuc2FjdGlvbiwgc28gbWlnaHQgc3RpbGwgYmUgbGVmdCBvbiB0aGF0CisJCSAqIHRyYW5zYWN0aW9uJ3MgbWV0YWRhdGEgbGlzdHMuCisJCSAqLworCQlpZiAoamgtPmJfamxpc3QgIT0gQkpfU3luY0RhdGEgJiYgamgtPmJfamxpc3QgIT0gQkpfTG9ja2VkKSB7CisJCQlKQlVGRkVSX1RSQUNFKGpoLCAibm90IG9uIGNvcnJlY3QgZGF0YSBsaXN0OiB1bmZpbGUiKTsKKwkJCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9qbGlzdCAhPSBCSl9TaGFkb3cpOworCQkJX19qb3VybmFsX3RlbXBfdW5saW5rX2J1ZmZlcihqaCk7CisJCQlqaC0+Yl90cmFuc2FjdGlvbiA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbjsKKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJmaWxlIGFzIGRhdGEiKTsKKwkJCV9fam91cm5hbF9maWxlX2J1ZmZlcihqaCwgaGFuZGxlLT5oX3RyYW5zYWN0aW9uLAorCQkJCQkJQkpfU3luY0RhdGEpOworCQl9CisJfSBlbHNlIHsKKwkJSkJVRkZFUl9UUkFDRShqaCwgIm5vdCBvbiBhIHRyYW5zYWN0aW9uIik7CisJCV9fam91cm5hbF9maWxlX2J1ZmZlcihqaCwgaGFuZGxlLT5oX3RyYW5zYWN0aW9uLCBCSl9TeW5jRGF0YSk7CisJfQorbm9fam91cm5hbDoKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCWlmIChuZWVkX2JyZWxzZSkgeworCQlCVUZGRVJfVFJBQ0UoYmgsICJicmVsc2UiKTsKKwkJX19icmVsc2UoYmgpOworCX0KKwlKQlVGRkVSX1RSQUNFKGpoLCAiZXhpdCIpOworCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKiAKKyAqIGludCBqb3VybmFsX2RpcnR5X21ldGFkYXRhKCkgLSAgbWFyayBhIGJ1ZmZlciBhcyBjb250YWluaW5nIGRpcnR5IG1ldGFkYXRhCisgKiBAaGFuZGxlOiB0cmFuc2FjdGlvbiB0byBhZGQgYnVmZmVyIHRvLgorICogQGJoOiBidWZmZXIgdG8gbWFyayAKKyAqIAorICogbWFyayBkaXJ0eSBtZXRhZGF0YSB3aGljaCBuZWVkcyB0byBiZSBqb3VybmFsZWQgYXMgcGFydCBvZiB0aGUgY3VycmVudAorICogdHJhbnNhY3Rpb24uCisgKgorICogVGhlIGJ1ZmZlciBpcyBwbGFjZWQgb24gdGhlIHRyYW5zYWN0aW9uJ3MgbWV0YWRhdGEgbGlzdCBhbmQgaXMgbWFya2VkCisgKiBhcyBiZWxvbmdpbmcgdG8gdGhlIHRyYW5zYWN0aW9uLiAgCisgKgorICogUmV0dXJucyBlcnJvciBudW1iZXIgb3IgMCBvbiBzdWNjZXNzLiAgCisgKgorICogU3BlY2lhbCBjYXJlIG5lZWRzIHRvIGJlIHRha2VuIGlmIHRoZSBidWZmZXIgYWxyZWFkeSBiZWxvbmdzIHRvIHRoZQorICogY3VycmVudCBjb21taXR0aW5nIHRyYW5zYWN0aW9uIChpbiB3aGljaCBjYXNlIHdlIHNob3VsZCBoYXZlIGZyb3plbgorICogZGF0YSBwcmVzZW50IGZvciB0aGF0IGNvbW1pdCkuICBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IHJlbGluayB0aGUKKyAqIGJ1ZmZlcjogdGhhdCBvbmx5IGdldHMgZG9uZSB3aGVuIHRoZSBvbGQgdHJhbnNhY3Rpb24gZmluYWxseQorICogY29tcGxldGVzIGl0cyBjb21taXQuCisgKi8KK2ludCBqb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb247CisJam91cm5hbF90ICpqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGJoMmpoKGJoKTsKKworCWpiZF9kZWJ1Zyg1LCAiam91cm5hbF9oZWFkICVwXG4iLCBqaCk7CisJSkJVRkZFUl9UUkFDRShqaCwgImVudHJ5Iik7CisJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCisJCWdvdG8gb3V0OworCisJamJkX2xvY2tfYmhfc3RhdGUoYmgpOworCisJaWYgKGpoLT5iX21vZGlmaWVkID09IDApIHsKKwkJLyoKKwkJICogVGhpcyBidWZmZXIncyBnb3QgbW9kaWZpZWQgYW5kIGJlY29taW5nIHBhcnQKKwkJICogb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUKKwkJICogb25jZSBhIHRyYW5zYWN0aW9uIC1ienp6CisJCSAqLworCQlqaC0+Yl9tb2RpZmllZCA9IDE7CisJCUpfQVNTRVJUX0pIKGpoLCBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPiAwKTsKKwkJaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzLS07CisJfQorCisJLyoKKwkgKiBmYXN0cGF0aCwgdG8gYXZvaWQgZXhwZW5zaXZlIGxvY2tpbmcuICBJZiB0aGlzIGJ1ZmZlciBpcyBhbHJlYWR5CisJICogb24gdGhlIHJ1bm5pbmcgdHJhbnNhY3Rpb24ncyBtZXRhZGF0YSBsaXN0IHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uCisJICogTm9ib2R5IGNhbiB0YWtlIGl0IG9mZiBhZ2FpbiBiZWNhdXNlIHRoZXJlIGlzIGEgaGFuZGxlIG9wZW4uCisJICogSSBfdGhpbmtfIHdlJ3JlIE9LIGhlcmUgd2l0aCBTTVAgYmFycmllcnMgLSBhIG1pc3Rha2VuIGRlY2lzaW9uIHdpbGwKKwkgKiByZXN1bHQgaW4gdGhpcyB0ZXN0IGJlaW5nIGZhbHNlLCBzbyB3ZSBnbyBpbiBhbmQgdGFrZSB0aGUgbG9ja3MuCisJICovCisJaWYgKGpoLT5iX3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uICYmIGpoLT5iX2psaXN0ID09IEJKX01ldGFkYXRhKSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJmYXN0cGF0aCIpOworCQlKX0FTU0VSVF9KSChqaCwgamgtPmJfdHJhbnNhY3Rpb24gPT0KKwkJCQkJam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKTsKKwkJZ290byBvdXRfdW5sb2NrX2JoOworCX0KKworCXNldF9idWZmZXJfamJkZGlydHkoYmgpOworCisJLyogCisJICogTWV0YWRhdGEgYWxyZWFkeSBvbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBsaXN0IGRvZXNuJ3QKKwkgKiBuZWVkIHRvIGJlIGZpbGVkLiAgTWV0YWRhdGEgb24gYW5vdGhlciB0cmFuc2FjdGlvbidzIGxpc3QgbXVzdAorCSAqIGJlIGNvbW1pdHRpbmcsIGFuZCB3aWxsIGJlIHJlZmlsZWQgb25jZSB0aGUgY29tbWl0IGNvbXBsZXRlczoKKwkgKiBsZWF2ZSBpdCBhbG9uZSBmb3Igbm93LiAKKwkgKi8KKwlpZiAoamgtPmJfdHJhbnNhY3Rpb24gIT0gdHJhbnNhY3Rpb24pIHsKKwkJSkJVRkZFUl9UUkFDRShqaCwgImFscmVhZHkgb24gb3RoZXIgdHJhbnNhY3Rpb24iKTsKKwkJSl9BU1NFUlRfSkgoamgsIGpoLT5iX3RyYW5zYWN0aW9uID09CisJCQkJCWpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbik7CisJCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uKTsKKwkJLyogQW5kIHRoaXMgY2FzZSBpcyBpbGxlZ2FsOiB3ZSBjYW4ndCByZXVzZSBhbm90aGVyCisJCSAqIHRyYW5zYWN0aW9uJ3MgZGF0YSBidWZmZXIsIGV2ZXIuICovCisJCWdvdG8gb3V0X3VubG9ja19iaDsKKwl9CisKKwkvKiBUaGF0IHRlc3Qgc2hvdWxkIGhhdmUgZWxpbWluYXRlZCB0aGUgZm9sbG93aW5nIGNhc2U6ICovCisJSl9BU1NFUlRfSkgoamgsIGpoLT5iX2Zyb3plbl9kYXRhID09IDApOworCisJSkJVRkZFUl9UUkFDRShqaCwgImZpbGUgYXMgQkpfTWV0YWRhdGEiKTsKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwlfX2pvdXJuYWxfZmlsZV9idWZmZXIoamgsIGhhbmRsZS0+aF90cmFuc2FjdGlvbiwgQkpfTWV0YWRhdGEpOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CitvdXRfdW5sb2NrX2JoOgorCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworb3V0OgorCUpCVUZGRVJfVFJBQ0UoamgsICJleGl0Iik7CisJcmV0dXJuIDA7Cit9CisKKy8qIAorICogam91cm5hbF9yZWxlYXNlX2J1ZmZlcjogdW5kbyBhIGdldF93cml0ZV9hY2Nlc3Mgd2l0aG91dCBhbnkgYnVmZmVyCisgKiB1cGRhdGVzLCBpZiB0aGUgdXBkYXRlIGRlY2lkZWQgaW4gdGhlIGVuZCB0aGF0IGl0IGRpZG4ndCBuZWVkIGFjY2Vzcy4KKyAqCisgKi8KK3ZvaWQKK2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlCVUZGRVJfVFJBQ0UoYmgsICJlbnRyeSIpOworfQorCisvKiogCisgKiB2b2lkIGpvdXJuYWxfZm9yZ2V0KCkgLSBiZm9yZ2V0KCkgZm9yIHBvdGVudGlhbGx5LWpvdXJuYWxlZCBidWZmZXJzLgorICogQGhhbmRsZTogdHJhbnNhY3Rpb24gaGFuZGxlCisgKiBAYmg6ICAgICBiaCB0byAnZm9yZ2V0JworICoKKyAqIFdlIGNhbiBvbmx5IGRvIHRoZSBiZm9yZ2V0IGlmIHRoZXJlIGFyZSBubyBjb21taXRzIHBlbmRpbmcgYWdhaW5zdCB0aGUKKyAqIGJ1ZmZlci4gIElmIHRoZSBidWZmZXIgaXMgZGlydHkgaW4gdGhlIGN1cnJlbnQgcnVubmluZyB0cmFuc2FjdGlvbiB3ZQorICogY2FuIHNhZmVseSB1bmxpbmsgaXQuIAorICoKKyAqIGJoIG1heSBub3QgYmUgYSBqb3VybmFsbGVkIGJ1ZmZlciBhdCBhbGwgLSBpdCBtYXkgYmUgYSBub24tSkJECisgKiBidWZmZXIgd2hpY2ggY2FtZSBvZmYgdGhlIGhhc2h0YWJsZS4gIENoZWNrIGZvciB0aGlzLgorICoKKyAqIERlY3JlbWVudHMgYmgtPmJfY291bnQgYnkgb25lLgorICogCisgKiBBbGxvdyB0aGlzIGNhbGwgZXZlbiBpZiB0aGUgaGFuZGxlIGhhcyBhYm9ydGVkIC0tLSBpdCBtYXkgYmUgcGFydCBvZgorICogdGhlIGNhbGxlcidzIGNsZWFudXAgYWZ0ZXIgYW4gYWJvcnQuCisgKi8KK2ludCBqb3VybmFsX2ZvcmdldCAoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbiA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbjsKKwlqb3VybmFsX3QgKmpvdXJuYWwgPSB0cmFuc2FjdGlvbi0+dF9qb3VybmFsOworCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoOworCWludCBkcm9wX3Jlc2VydmUgPSAwOworCWludCBlcnIgPSAwOworCisJQlVGRkVSX1RSQUNFKGJoLCAiZW50cnkiKTsKKworCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKworCWlmICghYnVmZmVyX2piZChiaCkpCisJCWdvdG8gbm90X2piZDsKKwlqaCA9IGJoMmpoKGJoKTsKKworCS8qIENyaXRpY2FsIGVycm9yOiBhdHRlbXB0aW5nIHRvIGRlbGV0ZSBhIGJpdG1hcCBidWZmZXIsIG1heWJlPworCSAqIERvbid0IGRvIGFueSBqYmQgb3BlcmF0aW9ucywgYW5kIHJldHVybiBhbiBlcnJvci4gKi8KKwlpZiAoIUpfRVhQRUNUX0pIKGpoLCAhamgtPmJfY29tbWl0dGVkX2RhdGEsCisJCQkgImluY29uc2lzdGVudCBkYXRhIG9uIGRpc2siKSkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIG5vdF9qYmQ7CisJfQorCisJLyoKKwkgKiBUaGUgYnVmZmVyJ3MgZ29pbmcgZnJvbSB0aGUgdHJhbnNhY3Rpb24sIHdlIG11c3QgZHJvcAorCSAqIGFsbCByZWZlcmVuY2VzIC1ienp6CisJICovCisJamgtPmJfbW9kaWZpZWQgPSAwOworCisJaWYgKGpoLT5iX3RyYW5zYWN0aW9uID09IGhhbmRsZS0+aF90cmFuc2FjdGlvbikgeworCQlKX0FTU0VSVF9KSChqaCwgIWpoLT5iX2Zyb3plbl9kYXRhKTsKKworCQkvKiBJZiB3ZSBhcmUgZm9yZ2V0dGluZyBhIGJ1ZmZlciB3aGljaCBpcyBhbHJlYWR5IHBhcnQKKwkJICogb2YgdGhpcyB0cmFuc2FjdGlvbiwgdGhlbiB3ZSBjYW4ganVzdCBkcm9wIGl0IGZyb20KKwkJICogdGhlIHRyYW5zYWN0aW9uIGltbWVkaWF0ZWx5LiAqLworCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCQljbGVhcl9idWZmZXJfamJkZGlydHkoYmgpOworCisJCUpCVUZGRVJfVFJBQ0UoamgsICJiZWxvbmdzIHRvIGN1cnJlbnQgdHJhbnNhY3Rpb246IHVuZmlsZSIpOworCisJCWRyb3BfcmVzZXJ2ZSA9IDE7CisKKwkJLyogCisJCSAqIFdlIGFyZSBubyBsb25nZXIgZ29pbmcgdG8gam91cm5hbCB0aGlzIGJ1ZmZlci4KKwkJICogSG93ZXZlciwgdGhlIGNvbW1pdCBvZiB0aGlzIHRyYW5zYWN0aW9uIGlzIHN0aWxsCisJCSAqIGltcG9ydGFudCB0byB0aGUgYnVmZmVyOiB0aGUgZGVsZXRlIHRoYXQgd2UgYXJlIG5vdworCQkgKiBwcm9jZXNzaW5nIG1pZ2h0IG9ic29sZXRlIGFuIG9sZCBsb2cgZW50cnksIHNvIGJ5CisJCSAqIGNvbW1pdHRpbmcsIHdlIGNhbiBzYXRpc2Z5IHRoZSBidWZmZXIncyBjaGVja3BvaW50LgorCQkgKgorCQkgKiBTbywgaWYgd2UgaGF2ZSBhIGNoZWNrcG9pbnQgb24gdGhlIGJ1ZmZlciwgd2Ugc2hvdWxkCisJCSAqIG5vdyByZWZpbGUgdGhlIGJ1ZmZlciBvbiBvdXIgQkpfRm9yZ2V0IGxpc3Qgc28gdGhhdAorCQkgKiB3ZSBrbm93IHRvIHJlbW92ZSB0aGUgY2hlY2twb2ludCBhZnRlciB3ZSBjb21taXQuIAorCQkgKi8KKworCQlpZiAoamgtPmJfY3BfdHJhbnNhY3Rpb24pIHsKKwkJCV9fam91cm5hbF90ZW1wX3VubGlua19idWZmZXIoamgpOworCQkJX19qb3VybmFsX2ZpbGVfYnVmZmVyKGpoLCB0cmFuc2FjdGlvbiwgQkpfRm9yZ2V0KTsKKwkJfSBlbHNlIHsKKwkJCV9fam91cm5hbF91bmZpbGVfYnVmZmVyKGpoKTsKKwkJCWpvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7CisJCQlfX2JyZWxzZShiaCk7CisJCQlpZiAoIWJ1ZmZlcl9qYmQoYmgpKSB7CisJCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCQlfX2Jmb3JnZXQoYmgpOworCQkJCWdvdG8gZHJvcDsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoamgtPmJfdHJhbnNhY3Rpb24pIHsKKwkJSl9BU1NFUlRfSkgoamgsIChqaC0+Yl90cmFuc2FjdGlvbiA9PSAKKwkJCQkgam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKSk7CisJCS8qIEhvd2V2ZXIsIGlmIHRoZSBidWZmZXIgaXMgc3RpbGwgb3duZWQgYnkgYSBwcmlvcgorCQkgKiAoY29tbWl0dGluZykgdHJhbnNhY3Rpb24sIHdlIGNhbid0IGRyb3AgaXQgeWV0Li4uICovCisJCUpCVUZGRVJfVFJBQ0UoamgsICJiZWxvbmdzIHRvIG9sZGVyIHRyYW5zYWN0aW9uIik7CisJCS8qIC4uLiBidXQgd2UgQ0FOIGRyb3AgaXQgZnJvbSB0aGUgbmV3IHRyYW5zYWN0aW9uIGlmIHdlCisJCSAqIGhhdmUgYWxzbyBtb2RpZmllZCBpdCBzaW5jZSB0aGUgb3JpZ2luYWwgY29tbWl0LiAqLworCisJCWlmIChqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uKSB7CisJCQlKX0FTU0VSVChqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uKTsKKwkJCWpoLT5iX25leHRfdHJhbnNhY3Rpb24gPSBOVUxMOworCQkJZHJvcF9yZXNlcnZlID0gMTsKKwkJfQorCX0KKworbm90X2piZDoKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCV9fYnJlbHNlKGJoKTsKK2Ryb3A6CisJaWYgKGRyb3BfcmVzZXJ2ZSkgeworCQkvKiBubyBuZWVkIHRvIHJlc2VydmUgbG9nIHNwYWNlIGZvciB0aGlzIGJsb2NrIC1ienp6ICovCisJCWhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cysrOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGludCBqb3VybmFsX3N0b3AoKSAtIGNvbXBsZXRlIGEgdHJhbnNhY3Rpb24KKyAqIEBoYW5kbGU6IHRyYW5hY3Rpb24gdG8gY29tcGxldGUuCisgKiAKKyAqIEFsbCBkb25lIGZvciBhIHBhcnRpY3VsYXIgaGFuZGxlLgorICoKKyAqIFRoZXJlIGlzIG5vdCBtdWNoIGFjdGlvbiBuZWVkZWQgaGVyZS4gIFdlIGp1c3QgcmV0dXJuIGFueSByZW1haW5pbmcKKyAqIGJ1ZmZlciBjcmVkaXRzIHRvIHRoZSB0cmFuc2FjdGlvbiBhbmQgcmVtb3ZlIHRoZSBoYW5kbGUuICBUaGUgb25seQorICogY29tcGxpY2F0aW9uIGlzIHRoYXQgd2UgbmVlZCB0byBzdGFydCBhIGNvbW1pdCBvcGVyYXRpb24gaWYgdGhlCisgKiBmaWxlc3lzdGVtIGlzIG1hcmtlZCBmb3Igc3luY2hyb25vdXMgdXBkYXRlLgorICoKKyAqIGpvdXJuYWxfc3RvcCBpdHNlbGYgd2lsbCBub3QgdXN1YWxseSByZXR1cm4gYW4gZXJyb3IsIGJ1dCBpdCBtYXkKKyAqIGRvIHNvIGluIHVudXN1YWwgY2lyY3Vtc3RhbmNlcy4gIEluIHBhcnRpY3VsYXIsIGV4cGVjdCBpdCB0byAKKyAqIHJldHVybiAtRUlPIGlmIGEgam91cm5hbF9hYm9ydCBoYXMgYmVlbiBleGVjdXRlZCBzaW5jZSB0aGUKKyAqIHRyYW5zYWN0aW9uIGJlZ2FuLgorICovCitpbnQgam91cm5hbF9zdG9wKGhhbmRsZV90ICpoYW5kbGUpCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb247CisJam91cm5hbF90ICpqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKKwlpbnQgb2xkX2hhbmRsZV9jb3VudCwgZXJyOworCisJSl9BU1NFUlQodHJhbnNhY3Rpb24tPnRfdXBkYXRlcyA+IDApOworCUpfQVNTRVJUKGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKSA9PSBoYW5kbGUpOworCisJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCisJCWVyciA9IC1FSU87CisJZWxzZQorCQllcnIgPSAwOworCisJaWYgKC0taGFuZGxlLT5oX3JlZiA+IDApIHsKKwkJamJkX2RlYnVnKDQsICJoX3JlZiAlZCAtPiAlZFxuIiwgaGFuZGxlLT5oX3JlZiArIDEsCisJCQkgIGhhbmRsZS0+aF9yZWYpOworCQlyZXR1cm4gZXJyOworCX0KKworCWpiZF9kZWJ1Zyg0LCAiSGFuZGxlICVwIGdvaW5nIGRvd25cbiIsIGhhbmRsZSk7CisKKwkvKgorCSAqIEltcGxlbWVudCBzeW5jaHJvbm91cyB0cmFuc2FjdGlvbiBiYXRjaGluZy4gIElmIHRoZSBoYW5kbGUKKwkgKiB3YXMgc3luY2hyb25vdXMsIGRvbid0IGZvcmNlIGEgY29tbWl0IGltbWVkaWF0ZWx5LiAgTGV0J3MKKwkgKiB5aWVsZCBhbmQgbGV0IGFub3RoZXIgdGhyZWFkIHBpZ2d5YmFjayBvbnRvIHRoaXMgdHJhbnNhY3Rpb24uCisJICogS2VlcCBkb2luZyB0aGF0IHdoaWxlIG5ldyB0aHJlYWRzIGNvbnRpbnVlIHRvIGFycml2ZS4KKwkgKiBJdCBkb2Vzbid0IGNvc3QgbXVjaCAtIHdlJ3JlIGFib3V0IHRvIHJ1biBhIGNvbW1pdCBhbmQgc2xlZXAKKwkgKiBvbiBJTyBhbnl3YXkuICBTcGVlZHMgdXAgbWFueS10aHJlYWRlZCwgbWFueS1kaXIgb3BlcmF0aW9ucworCSAqIGJ5IDMweCBvciBtb3JlLi4uCisJICovCisJaWYgKGhhbmRsZS0+aF9zeW5jKSB7CisJCWRvIHsKKwkJCW9sZF9oYW5kbGVfY291bnQgPSB0cmFuc2FjdGlvbi0+dF9oYW5kbGVfY291bnQ7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQl9IHdoaWxlIChvbGRfaGFuZGxlX2NvdW50ICE9IHRyYW5zYWN0aW9uLT50X2hhbmRsZV9jb3VudCk7CisJfQorCisJY3VycmVudC0+am91cm5hbF9pbmZvID0gTlVMTDsKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJc3Bpbl9sb2NrKCZ0cmFuc2FjdGlvbi0+dF9oYW5kbGVfbG9jayk7CisJdHJhbnNhY3Rpb24tPnRfb3V0c3RhbmRpbmdfY3JlZGl0cyAtPSBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHM7CisJdHJhbnNhY3Rpb24tPnRfdXBkYXRlcy0tOworCWlmICghdHJhbnNhY3Rpb24tPnRfdXBkYXRlcykgeworCQl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfdXBkYXRlcyk7CisJCWlmIChqb3VybmFsLT5qX2JhcnJpZXJfY291bnQpCisJCQl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfdHJhbnNhY3Rpb25fbG9ja2VkKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBoYW5kbGUgaXMgbWFya2VkIFNZTkMsIHdlIG5lZWQgdG8gc2V0IGFub3RoZXIgY29tbWl0CisJICogZ29pbmchICBXZSBhbHNvIHdhbnQgdG8gZm9yY2UgYSBjb21taXQgaWYgdGhlIGN1cnJlbnQKKwkgKiB0cmFuc2FjdGlvbiBpcyBvY2N1cHlpbmcgdG9vIG11Y2ggb2YgdGhlIGxvZywgb3IgaWYgdGhlCisJICogdHJhbnNhY3Rpb24gaXMgdG9vIG9sZCBub3cuCisJICovCisJaWYgKGhhbmRsZS0+aF9zeW5jIHx8CisJCQl0cmFuc2FjdGlvbi0+dF9vdXRzdGFuZGluZ19jcmVkaXRzID4KKwkJCQlqb3VybmFsLT5qX21heF90cmFuc2FjdGlvbl9idWZmZXJzIHx8CisJICAgIAkJdGltZV9hZnRlcl9lcShqaWZmaWVzLCB0cmFuc2FjdGlvbi0+dF9leHBpcmVzKSkgeworCQkvKiBEbyB0aGlzIGV2ZW4gZm9yIGFib3J0ZWQgam91cm5hbHM6IGFuIGFib3J0IHN0aWxsCisJCSAqIGNvbXBsZXRlcyB0aGUgY29tbWl0IHRocmVhZCwgaXQganVzdCBkb2Vzbid0IHdyaXRlCisJCSAqIGFueXRoaW5nIHRvIGRpc2suICovCisJCXRpZF90IHRpZCA9IHRyYW5zYWN0aW9uLT50X3RpZDsKKworCQlzcGluX3VubG9jaygmdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2xvY2spOworCQlqYmRfZGVidWcoMiwgInRyYW5zYWN0aW9uIHRvbyBvbGQsIHJlcXVlc3RpbmcgY29tbWl0IGZvciAiCisJCQkJCSJoYW5kbGUgJXBcbiIsIGhhbmRsZSk7CisJCS8qIFRoaXMgaXMgbm9uLWJsb2NraW5nICovCisJCV9fbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsLCB0cmFuc2FjdGlvbi0+dF90aWQpOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCQkvKgorCQkgKiBTcGVjaWFsIGNhc2U6IEpGU19TWU5DIHN5bmNocm9ub3VzIHVwZGF0ZXMgcmVxdWlyZSB1cworCQkgKiB0byB3YWl0IGZvciB0aGUgY29tbWl0IHRvIGNvbXBsZXRlLiAgCisJCSAqLworCQlpZiAoaGFuZGxlLT5oX3N5bmMgJiYgIShjdXJyZW50LT5mbGFncyAmIFBGX01FTUFMTE9DKSkKKwkJCWVyciA9IGxvZ193YWl0X2NvbW1pdChqb3VybmFsLCB0aWQpOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrKCZ0cmFuc2FjdGlvbi0+dF9oYW5kbGVfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCX0KKworCWpiZF9mcmVlX2hhbmRsZShoYW5kbGUpOworCXJldHVybiBlcnI7Cit9CisKKy8qKmludCBqb3VybmFsX2ZvcmNlX2NvbW1pdCgpIC0gZm9yY2UgYW55IHVuY29tbWl0dGVkIHRyYW5zYWN0aW9ucworICogQGpvdXJuYWw6IGpvdXJuYWwgdG8gZm9yY2UKKyAqCisgKiBGb3Igc3luY2hyb25vdXMgb3BlcmF0aW9uczogZm9yY2UgYW55IHVuY29tbWl0dGVkIHRyYW5zYWN0aW9ucworICogdG8gZGlzay4gIE1heSBzZWVtIGtsdWRneSwgYnV0IGl0IHJldXNlcyBhbGwgdGhlIGhhbmRsZSBiYXRjaGluZworICogY29kZSBpbiBhIHZlcnkgc2ltcGxlIG1hbm5lci4KKyAqLworaW50IGpvdXJuYWxfZm9yY2VfY29tbWl0KGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwloYW5kbGVfdCAqaGFuZGxlOworCWludCByZXQ7CisKKwloYW5kbGUgPSBqb3VybmFsX3N0YXJ0KGpvdXJuYWwsIDEpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJfSBlbHNlIHsKKwkJaGFuZGxlLT5oX3N5bmMgPSAxOworCQlyZXQgPSBqb3VybmFsX3N0b3AoaGFuZGxlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqCisgKiBMaXN0IG1hbmFnZW1lbnQgY29kZSBzbmlwcGV0czogdmFyaW91cyBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyB0aGUKKyAqIHRyYW5zYWN0aW9uIGJ1ZmZlciBsaXN0cy4KKyAqCisgKi8KKworLyoKKyAqIEFwcGVuZCBhIGJ1ZmZlciB0byBhIHRyYW5zYWN0aW9uIGxpc3QsIGdpdmVuIHRoZSB0cmFuc2FjdGlvbidzIGxpc3QgaGVhZAorICogcG9pbnRlci4KKyAqCisgKiBqX2xpc3RfbG9jayBpcyBoZWxkLgorICoKKyAqIGpiZF9sb2NrX2JoX3N0YXRlKGpoMmJoKGpoKSkgaXMgaGVsZC4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgCitfX2JsaXN0X2FkZF9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqKmxpc3QsIHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCWlmICghKmxpc3QpIHsKKwkJamgtPmJfdG5leHQgPSBqaC0+Yl90cHJldiA9IGpoOworCQkqbGlzdCA9IGpoOworCX0gZWxzZSB7CisJCS8qIEluc2VydCBhdCB0aGUgdGFpbCBvZiB0aGUgbGlzdCB0byBwcmVzZXJ2ZSBvcmRlciAqLworCQlzdHJ1Y3Qgam91cm5hbF9oZWFkICpmaXJzdCA9ICpsaXN0LCAqbGFzdCA9IGZpcnN0LT5iX3RwcmV2OworCQlqaC0+Yl90cHJldiA9IGxhc3Q7CisJCWpoLT5iX3RuZXh0ID0gZmlyc3Q7CisJCWxhc3QtPmJfdG5leHQgPSBmaXJzdC0+Yl90cHJldiA9IGpoOworCX0KK30KKworLyogCisgKiBSZW1vdmUgYSBidWZmZXIgZnJvbSBhIHRyYW5zYWN0aW9uIGxpc3QsIGdpdmVuIHRoZSB0cmFuc2FjdGlvbidzIGxpc3QKKyAqIGhlYWQgcG9pbnRlci4KKyAqCisgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkLCBhbmQgdGhlIGpvdXJuYWwgbWF5IG5vdCBiZSBsb2NrZWQuCisgKgorICogamJkX2xvY2tfYmhfc3RhdGUoamgyYmgoamgpKSBpcyBoZWxkLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19ibGlzdF9kZWxfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKipsaXN0LCBzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKK3sKKwlpZiAoKmxpc3QgPT0gamgpIHsKKwkJKmxpc3QgPSBqaC0+Yl90bmV4dDsKKwkJaWYgKCpsaXN0ID09IGpoKQorCQkJKmxpc3QgPSBOVUxMOworCX0KKwlqaC0+Yl90cHJldi0+Yl90bmV4dCA9IGpoLT5iX3RuZXh0OworCWpoLT5iX3RuZXh0LT5iX3RwcmV2ID0gamgtPmJfdHByZXY7Cit9CisKKy8qIAorICogUmVtb3ZlIGEgYnVmZmVyIGZyb20gdGhlIGFwcHJvcHJpYXRlIHRyYW5zYWN0aW9uIGxpc3QuCisgKgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuICpjaGFuZ2UqIHRoZSB2YWx1ZSBvZgorICogYmgtPmJfdHJhbnNhY3Rpb24tPnRfc3luY19kYXRhbGlzdCwgdF9idWZmZXJzLCB0X2ZvcmdldCwKKyAqIHRfaW9idWZfbGlzdCwgdF9zaGFkb3dfbGlzdCwgdF9sb2dfbGlzdCBvciB0X3Jlc2VydmVkX2xpc3QuICBJZiB0aGUgY2FsbGVyCisgKiBpcyBob2xkaW5nIG9udG8gYSBjb3B5IG9mIG9uZSBvZiB0aGVlIHBvaW50ZXJzLCBpdCBjb3VsZCBnbyBiYWQuCisgKiBHZW5lcmFsbHkgdGhlIGNhbGxlciBuZWVkcyB0byByZS1yZWFkIHRoZSBwb2ludGVyIGZyb20gdGhlIHRyYW5zYWN0aW9uX3QuCisgKgorICogQ2FsbGVkIHVuZGVyIGpfbGlzdF9sb2NrLiAgVGhlIGpvdXJuYWwgbWF5IG5vdCBiZSBsb2NrZWQuCisgKi8KK3ZvaWQgX19qb3VybmFsX3RlbXBfdW5saW5rX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKK3sKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICoqbGlzdCA9IE5VTEw7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb247CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKKworCUpfQVNTRVJUX0pIKGpoLCBqYmRfaXNfbG9ja2VkX2JoX3N0YXRlKGJoKSk7CisJdHJhbnNhY3Rpb24gPSBqaC0+Yl90cmFuc2FjdGlvbjsKKwlpZiAodHJhbnNhY3Rpb24pCisJCWFzc2VydF9zcGluX2xvY2tlZCgmdHJhbnNhY3Rpb24tPnRfam91cm5hbC0+al9saXN0X2xvY2spOworCisJSl9BU1NFUlRfSkgoamgsIGpoLT5iX2psaXN0IDwgQkpfVHlwZXMpOworCWlmIChqaC0+Yl9qbGlzdCAhPSBCSl9Ob25lKQorCQlKX0FTU0VSVF9KSChqaCwgdHJhbnNhY3Rpb24gIT0gMCk7CisKKwlzd2l0Y2ggKGpoLT5iX2psaXN0KSB7CisJY2FzZSBCSl9Ob25lOgorCQlyZXR1cm47CisJY2FzZSBCSl9TeW5jRGF0YToKKwkJbGlzdCA9ICZ0cmFuc2FjdGlvbi0+dF9zeW5jX2RhdGFsaXN0OworCQlicmVhazsKKwljYXNlIEJKX01ldGFkYXRhOgorCQl0cmFuc2FjdGlvbi0+dF9ucl9idWZmZXJzLS07CisJCUpfQVNTRVJUX0pIKGpoLCB0cmFuc2FjdGlvbi0+dF9ucl9idWZmZXJzID49IDApOworCQlsaXN0ID0gJnRyYW5zYWN0aW9uLT50X2J1ZmZlcnM7CisJCWJyZWFrOworCWNhc2UgQkpfRm9yZ2V0OgorCQlsaXN0ID0gJnRyYW5zYWN0aW9uLT50X2ZvcmdldDsKKwkJYnJlYWs7CisJY2FzZSBCSl9JTzoKKwkJbGlzdCA9ICZ0cmFuc2FjdGlvbi0+dF9pb2J1Zl9saXN0OworCQlicmVhazsKKwljYXNlIEJKX1NoYWRvdzoKKwkJbGlzdCA9ICZ0cmFuc2FjdGlvbi0+dF9zaGFkb3dfbGlzdDsKKwkJYnJlYWs7CisJY2FzZSBCSl9Mb2dDdGw6CisJCWxpc3QgPSAmdHJhbnNhY3Rpb24tPnRfbG9nX2xpc3Q7CisJCWJyZWFrOworCWNhc2UgQkpfUmVzZXJ2ZWQ6CisJCWxpc3QgPSAmdHJhbnNhY3Rpb24tPnRfcmVzZXJ2ZWRfbGlzdDsKKwkJYnJlYWs7CisJY2FzZSBCSl9Mb2NrZWQ6CisJCWxpc3QgPSAmdHJhbnNhY3Rpb24tPnRfbG9ja2VkX2xpc3Q7CisJCWJyZWFrOworCX0KKworCV9fYmxpc3RfZGVsX2J1ZmZlcihsaXN0LCBqaCk7CisJamgtPmJfamxpc3QgPSBCSl9Ob25lOworCWlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9qYmRkaXJ0eShiaCkpCisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsJLyogRXhwb3NlIGl0IHRvIHRoZSBWTSAqLworfQorCit2b2lkIF9fam91cm5hbF91bmZpbGVfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCV9fam91cm5hbF90ZW1wX3VubGlua19idWZmZXIoamgpOworCWpoLT5iX3RyYW5zYWN0aW9uID0gTlVMTDsKK30KKwordm9pZCBqb3VybmFsX3VuZmlsZV9idWZmZXIoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKK3sKKwlqYmRfbG9ja19iaF9zdGF0ZShqaDJiaChqaCkpOworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCV9fam91cm5hbF91bmZpbGVfYnVmZmVyKGpoKTsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCWpiZF91bmxvY2tfYmhfc3RhdGUoamgyYmgoamgpKTsKK30KKworLyoKKyAqIENhbGxlZCBmcm9tIGpvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVycygpLgorICoKKyAqIENhbGxlZCB1bmRlciBqYmRfbG9ja19iaF9zdGF0ZShiaCkKKyAqLworc3RhdGljIHZvaWQKK19fam91cm5hbF90cnlfdG9fZnJlZV9idWZmZXIoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoOworCisJamggPSBiaDJqaChiaCk7CisKKwlpZiAoYnVmZmVyX2xvY2tlZChiaCkgfHwgYnVmZmVyX2RpcnR5KGJoKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoamgtPmJfbmV4dF90cmFuc2FjdGlvbiAhPSAwKQorCQlnb3RvIG91dDsKKworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCWlmIChqaC0+Yl90cmFuc2FjdGlvbiAhPSAwICYmIGpoLT5iX2NwX3RyYW5zYWN0aW9uID09IDApIHsKKwkJaWYgKGpoLT5iX2psaXN0ID09IEJKX1N5bmNEYXRhIHx8IGpoLT5iX2psaXN0ID09IEJKX0xvY2tlZCkgeworCQkJLyogQSB3cml0dGVuLWJhY2sgb3JkZXJlZCBkYXRhIGJ1ZmZlciAqLworCQkJSkJVRkZFUl9UUkFDRShqaCwgInJlbGVhc2UgZGF0YSIpOworCQkJX19qb3VybmFsX3VuZmlsZV9idWZmZXIoamgpOworCQkJam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKKwkJCV9fYnJlbHNlKGJoKTsKKwkJfQorCX0gZWxzZSBpZiAoamgtPmJfY3BfdHJhbnNhY3Rpb24gIT0gMCAmJiBqaC0+Yl90cmFuc2FjdGlvbiA9PSAwKSB7CisJCS8qIHdyaXR0ZW4tYmFjayBjaGVja3BvaW50ZWQgbWV0YWRhdGEgYnVmZmVyICovCisJCWlmIChqaC0+Yl9qbGlzdCA9PSBCSl9Ob25lKSB7CisJCQlKQlVGRkVSX1RSQUNFKGpoLCAicmVtb3ZlIGZyb20gY2hlY2twb2ludCBsaXN0Iik7CisJCQlfX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQoamgpOworCQkJam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKKwkJCV9fYnJlbHNlKGJoKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworb3V0OgorCXJldHVybjsKK30KKworCisvKiogCisgKiBpbnQgam91cm5hbF90cnlfdG9fZnJlZV9idWZmZXJzKCkgLSB0cnkgdG8gZnJlZSBwYWdlIGJ1ZmZlcnMuCisgKiBAam91cm5hbDogam91cm5hbCBmb3Igb3BlcmF0aW9uCisgKiBAcGFnZTogdG8gdHJ5IGFuZCBmcmVlCisgKiBAdW51c2VkX2dmcF9tYXNrOiB1bnVzZWQKKyAqCisgKiAKKyAqIEZvciBhbGwgdGhlIGJ1ZmZlcnMgb24gdGhpcyBwYWdlLAorICogaWYgdGhleSBhcmUgZnVsbHkgd3JpdHRlbiBvdXQgb3JkZXJlZCBkYXRhLCBtb3ZlIHRoZW0gb250byBCVUZfQ0xFQU4KKyAqIHNvIHRyeV90b19mcmVlX2J1ZmZlcnMoKSBjYW4gcmVhcCB0aGVtLgorICogCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gaWYgd2Ugd2lzaCB0cnlfdG9fZnJlZV9idWZmZXJzKCkKKyAqIHRvIGJlIGNhbGxlZC4gV2UgZG8gdGhpcyBpZiB0aGUgcGFnZSBpcyByZWxlYXNhYmxlIGJ5IHRyeV90b19mcmVlX2J1ZmZlcnMoKS4KKyAqIFdlIGFsc28gZG8gaXQgaWYgdGhlIHBhZ2UgaGFzIGxvY2tlZCBvciBkaXJ0eSBidWZmZXJzIGFuZCB0aGUgY2FsbGVyIHdhbnRzCisgKiB1cyB0byBwZXJmb3JtIHN5bmMgb3IgYXN5bmMgd3JpdGVvdXQuCisgKgorICogVGhpcyBjb21wbGljYXRlcyBKQkQgbG9ja2luZyBzb21ld2hhdC4gIFdlIGFyZW4ndCBwcm90ZWN0ZWQgYnkgdGhlCisgKiBCS0wgaGVyZS4gIFdlIHdpc2ggdG8gcmVtb3ZlIHRoZSBidWZmZXIgZnJvbSBpdHMgY29tbWl0dGluZyBvcgorICogcnVubmluZyB0cmFuc2FjdGlvbidzIC0+dF9kYXRhbGlzdCB2aWEgX19qb3VybmFsX3VuZmlsZV9idWZmZXIuCisgKgorICogVGhpcyBtYXkgKmNoYW5nZSogdGhlIHZhbHVlIG9mIHRyYW5zYWN0aW9uX3QtPnRfZGF0YWxpc3QsIHNvIGFueW9uZQorICogd2hvIGxvb2tzIGF0IHRfZGF0YWxpc3QgbmVlZHMgdG8gbG9jayBhZ2FpbnN0IHRoaXMgZnVuY3Rpb24uCisgKgorICogRXZlbiB3b3JzZSwgc29tZW9uZSBtYXkgYmUgZG9pbmcgYSBqb3VybmFsX2RpcnR5X2RhdGEgb24gdGhpcworICogYnVmZmVyLiAgU28gd2UgbmVlZCB0byBsb2NrIGFnYWluc3QgdGhhdC4gIGpvdXJuYWxfZGlydHlfZGF0YSgpCisgKiB3aWxsIGNvbWUgb3V0IG9mIHRoZSBsb2NrIHdpdGggdGhlIGJ1ZmZlciBkaXJ0eSwgd2hpY2ggbWFrZXMgaXQKKyAqIGluZWxpZ2libGUgZm9yIHJlbGVhc2UgaGVyZS4KKyAqCisgKiBXaG8gZWxzZSBpcyBhZmZlY3RlZCBieSB0aGlzPyAgaG1tLi4uICBSZWFsbHkgdGhlIG9ubHkgY29udGVuZGVyCisgKiBpcyBkb19nZXRfd3JpdGVfYWNjZXNzKCkgLSBpdCBjb3VsZCBiZSBsb29raW5nIGF0IHRoZSBidWZmZXIgd2hpbGUKKyAqIGpvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVyKCkgaXMgY2hhbmdpbmcgaXRzIHN0YXRlLiAgQnV0IHRoYXQKKyAqIGNhbm5vdCBoYXBwZW4gYmVjYXVzZSB3ZSBuZXZlciByZWFsbG9jYXRlIGZyZWVkIGRhdGEgYXMgbWV0YWRhdGEKKyAqIHdoaWxlIHRoZSBkYXRhIGlzIHBhcnQgb2YgYSB0cmFuc2FjdGlvbi4gIFllcz8KKyAqLworaW50IGpvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVycyhqb3VybmFsX3QgKmpvdXJuYWwsIAorCQkJCXN0cnVjdCBwYWdlICpwYWdlLCBpbnQgdW51c2VkX2dmcF9tYXNrKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCByZXQgPSAwOworCisJSl9BU1NFUlQoUGFnZUxvY2tlZChwYWdlKSk7CisKKwloZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWJoID0gaGVhZDsKKwlkbyB7CisJCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoOworCisJCS8qCisJCSAqIFdlIHRha2Ugb3VyIG93biByZWYgYWdhaW5zdCB0aGUgam91cm5hbF9oZWFkIGhlcmUgdG8gYXZvaWQKKwkJICogaGF2aW5nIHRvIGFkZCB0b25zIG9mIGxvY2tpbmcgYXJvdW5kIGVhY2ggaW5zdGFuY2Ugb2YKKwkJICogam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKCkgYW5kIGpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZCgpLgorCQkgKi8KKwkJamggPSBqb3VybmFsX2dyYWJfam91cm5hbF9oZWFkKGJoKTsKKwkJaWYgKCFqaCkKKwkJCWNvbnRpbnVlOworCisJCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwkJX19qb3VybmFsX3RyeV90b19mcmVlX2J1ZmZlcihqb3VybmFsLCBiaCk7CisJCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CisJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQlpZiAoYnVmZmVyX2piZChiaCkpCisJCQlnb3RvIGJ1c3k7CisJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKwlyZXQgPSB0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpOworYnVzeToKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyBidWZmZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gIElmIGl0IGlzIG9uIGFuIG9sZGVyIHRyYW5zYWN0aW9uJ3MKKyAqIGNoZWNrcG9pbnQgbGlzdCB3ZSBuZWVkIHRvIHJlY29yZCBpdCBvbiB0aGlzIHRyYW5zYWN0aW9uJ3MgZm9yZ2V0IGxpc3QKKyAqIHRvIHBpbiB0aGlzIGJ1ZmZlciAoYW5kIGhlbmNlIGl0cyBjaGVja3BvaW50aW5nIHRyYW5zYWN0aW9uKSBkb3duIHVudGlsCisgKiB0aGlzIHRyYW5zYWN0aW9uIGNvbW1pdHMuICBJZiB0aGUgYnVmZmVyIGlzbid0IG9uIGEgY2hlY2twb2ludCBsaXN0LCB3ZQorICogcmVsZWFzZSBpdC4KKyAqIFJldHVybnMgbm9uLXplcm8gaWYgSkJEIG5vIGxvbmdlciBoYXMgYW4gaW50ZXJlc3QgaW4gdGhlIGJ1ZmZlci4KKyAqCisgKiBDYWxsZWQgdW5kZXIgal9saXN0X2xvY2suCisgKgorICogQ2FsbGVkIHVuZGVyIGpiZF9sb2NrX2JoX3N0YXRlKGJoKS4KKyAqLworc3RhdGljIGludCBfX2Rpc3Bvc2VfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoLCB0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbikKK3sKKwlpbnQgbWF5X2ZyZWUgPSAxOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBqaDJiaChqaCk7CisKKwlfX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihqaCk7CisKKwlpZiAoamgtPmJfY3BfdHJhbnNhY3Rpb24pIHsKKwkJSkJVRkZFUl9UUkFDRShqaCwgIm9uIHJ1bm5pbmcrY3AgdHJhbnNhY3Rpb24iKTsKKwkJX19qb3VybmFsX2ZpbGVfYnVmZmVyKGpoLCB0cmFuc2FjdGlvbiwgQkpfRm9yZ2V0KTsKKwkJY2xlYXJfYnVmZmVyX2piZGRpcnR5KGJoKTsKKwkJbWF5X2ZyZWUgPSAwOworCX0gZWxzZSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJvbiBydW5uaW5nIHRyYW5zYWN0aW9uIik7CisJCWpvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7CisJCV9fYnJlbHNlKGJoKTsKKwl9CisJcmV0dXJuIG1heV9mcmVlOworfQorCisvKgorICogam91cm5hbF9pbnZhbGlkYXRlcGFnZSAKKyAqCisgKiBUaGlzIGNvZGUgaXMgdHJpY2t5LiAgSXQgaGFzIGEgbnVtYmVyIG9mIGNhc2VzIHRvIGRlYWwgd2l0aC4KKyAqCisgKiBUaGVyZSBhcmUgdHdvIGludmFyaWFudHMgd2hpY2ggdGhpcyBjb2RlIHJlbGllcyBvbjoKKyAqCisgKiBpX3NpemUgbXVzdCBiZSB1cGRhdGVkIG9uIGRpc2sgYmVmb3JlIHdlIHN0YXJ0IGNhbGxpbmcgaW52YWxpZGF0ZXBhZ2Ugb24gdGhlCisgKiBkYXRhLgorICogCisgKiAgVGhpcyBpcyBkb25lIGluIGV4dDMgYnkgZGVmaW5pbmcgYW4gZXh0M19zZXRhdHRyIG1ldGhvZCB3aGljaAorICogIHVwZGF0ZXMgaV9zaXplIGJlZm9yZSB0cnVuY2F0ZSBnZXRzIGdvaW5nLiAgQnkgbWFpbnRhaW5pbmcgdGhpcworICogIGludmFyaWFudCwgd2UgY2FuIGJlIHN1cmUgdGhhdCBpdCBpcyBzYWZlIHRvIHRocm93IGF3YXkgYW55IGJ1ZmZlcnMKKyAqICBhdHRhY2hlZCB0byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbjogb25jZSB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cywKKyAqICB3ZSBrbm93IHRoYXQgdGhlIGRhdGEgd2lsbCBub3QgYmUgbmVlZGVkLgorICogCisgKiAgTm90ZSBob3dldmVyIHRoYXQgd2UgY2FuICpub3QqIHRocm93IGF3YXkgZGF0YSBiZWxvbmdpbmcgdG8gdGhlCisgKiAgcHJldmlvdXMsIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24hICAKKyAqCisgKiBBbnkgZGlzayBibG9ja3Mgd2hpY2ggKmFyZSogcGFydCBvZiB0aGUgcHJldmlvdXMsIGNvbW1pdHRpbmcKKyAqIHRyYW5zYWN0aW9uIChhbmQgd2hpY2ggdGhlcmVmb3JlIGNhbm5vdCBiZSBkaXNjYXJkZWQgaW1tZWRpYXRlbHkpIGFyZQorICogbm90IGdvaW5nIHRvIGJlIHJldXNlZCBpbiB0aGUgbmV3IHJ1bm5pbmcgdHJhbnNhY3Rpb24KKyAqCisgKiAgVGhlIGJpdG1hcCBjb21taXR0ZWRfZGF0YSBpbWFnZXMgZ3VhcmFudGVlIHRoaXM6IGFueSBibG9jayB3aGljaCBpcworICogIGFsbG9jYXRlZCBpbiBvbmUgdHJhbnNhY3Rpb24gYW5kIHJlbW92ZWQgaW4gdGhlIG5leHQgd2lsbCBiZSBtYXJrZWQKKyAqICBhcyBpbi11c2UgaW4gdGhlIGNvbW1pdHRlZF9kYXRhIGJpdG1hcCwgc28gY2Fubm90IGJlIHJldXNlZCB1bnRpbAorICogIHRoZSBuZXh0IHRyYW5zYWN0aW9uIHRvIGRlbGV0ZSB0aGUgYmxvY2sgY29tbWl0cy4gIFRoaXMgbWVhbnMgdGhhdAorICogIGxlYXZpbmcgY29tbWl0dGluZyBidWZmZXJzIGRpcnR5IGlzIHF1aXRlIHNhZmU6IHRoZSBkaXNrIGJsb2NrcworICogIGNhbm5vdCBiZSByZWFsbG9jYXRlZCB0byBhIGRpZmZlcmVudCBmaWxlIGFuZCBzbyBidWZmZXIgYWxpYXNpbmcgaXMKKyAqICBub3QgcG9zc2libGUuCisgKgorICoKKyAqIFRoZSBhYm92ZSBhcHBsaWVzIG1haW5seSB0byBvcmRlcmVkIGRhdGEgbW9kZS4gIEluIHdyaXRlYmFjayBtb2RlIHdlCisgKiBkb24ndCBtYWtlIGd1YXJhbnRlZXMgYWJvdXQgdGhlIG9yZGVyIGluIHdoaWNoIGRhdGEgaGl0cyBkaXNrIC0tLSBpbgorICogcGFydGljdWxhciB3ZSBkb24ndCBndWFyYW50ZWUgdGhhdCBuZXcgZGlydHkgZGF0YSBpcyBmbHVzaGVkIGJlZm9yZQorICogdHJhbnNhY3Rpb24gY29tbWl0IC0tLSBzbyBpdCBpcyBhbHdheXMgc2FmZSBqdXN0IHRvIGRpc2NhcmQgZGF0YQorICogaW1tZWRpYXRlbHkgaW4gdGhhdCBtb2RlLiAgLS1zY3QgCisgKi8KKworLyoKKyAqIFRoZSBqb3VybmFsX3VubWFwX2J1ZmZlciBoZWxwZXIgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGlmIHRoZSBidWZmZXIKKyAqIGNvbmNlcm5lZCByZW1haW5zIHBpbm5lZCBhcyBhbiBhbm9ueW1vdXMgYnVmZmVyIGJlbG9uZ2luZyB0byBhbiBvbGRlcgorICogdHJhbnNhY3Rpb24uCisgKgorICogV2UncmUgb3V0c2lkZS10cmFuc2FjdGlvbiBoZXJlLiAgRWl0aGVyIG9yIGJvdGggb2Ygal9ydW5uaW5nX3RyYW5zYWN0aW9uCisgKiBhbmQgal9jb21taXR0aW5nX3RyYW5zYWN0aW9uIG1heSBiZSBOVUxMLgorICovCitzdGF0aWMgaW50IGpvdXJuYWxfdW5tYXBfYnVmZmVyKGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbjsKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaDsKKwlpbnQgbWF5X2ZyZWUgPSAxOworCWludCByZXQ7CisKKwlCVUZGRVJfVFJBQ0UoYmgsICJlbnRyeSIpOworCisJLyoKKwkgKiBJdCBpcyBzYWZlIHRvIHByb2NlZWQgaGVyZSB3aXRob3V0IHRoZSBqX2xpc3RfbG9jayBiZWNhdXNlIHRoZQorCSAqIGJ1ZmZlcnMgY2Fubm90IGJlIHN0b2xlbiBieSB0cnlfdG9fZnJlZV9idWZmZXJzIGFzIGxvbmcgYXMgd2UgYXJlCisJICogaG9sZGluZyB0aGUgcGFnZSBsb2NrLiAtLXNjdAorCSAqLworCisJaWYgKCFidWZmZXJfamJkKGJoKSkKKwkJZ290byB6YXBfYnVmZmVyX3VubG9ja2VkOworCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKworCWpoID0gam91cm5hbF9ncmFiX2pvdXJuYWxfaGVhZChiaCk7CisJaWYgKCFqaCkKKwkJZ290byB6YXBfYnVmZmVyX25vX2poOworCisJdHJhbnNhY3Rpb24gPSBqaC0+Yl90cmFuc2FjdGlvbjsKKwlpZiAodHJhbnNhY3Rpb24gPT0gTlVMTCkgeworCQkvKiBGaXJzdCBjYXNlOiBub3Qgb24gYW55IHRyYW5zYWN0aW9uLiAgSWYgaXQKKwkJICogaGFzIG5vIGNoZWNrcG9pbnQgbGluaywgdGhlbiB3ZSBjYW4gemFwIGl0OgorCQkgKiBpdCdzIGEgd3JpdGViYWNrLW1vZGUgYnVmZmVyIHNvIHdlIGRvbid0IGNhcmUKKwkJICogaWYgaXQgaGl0cyBkaXNrIHNhZmVseS4gKi8KKwkJaWYgKCFqaC0+Yl9jcF90cmFuc2FjdGlvbikgeworCQkJSkJVRkZFUl9UUkFDRShqaCwgIm5vdCBvbiBhbnkgdHJhbnNhY3Rpb246IHphcCIpOworCQkJZ290byB6YXBfYnVmZmVyOworCQl9CisKKwkJaWYgKCFidWZmZXJfZGlydHkoYmgpKSB7CisJCQkvKiBiZGZsdXNoIGhhcyB3cml0dGVuIGl0LiAgV2UgY2FuIGRyb3AgaXQgbm93ICovCisJCQlnb3RvIHphcF9idWZmZXI7CisJCX0KKworCQkvKiBPSywgaXQgbXVzdCBiZSBpbiB0aGUgam91cm5hbCBidXQgc3RpbGwgbm90CisJCSAqIHdyaXR0ZW4gZnVsbHkgdG8gZGlzazogaXQncyBtZXRhZGF0YSBvcgorCQkgKiBqb3VybmFsZWQgZGF0YS4uLiAqLworCisJCWlmIChqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24pIHsKKwkJCS8qIC4uLiBhbmQgb25jZSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBoYXMKKwkJCSAqIGNvbW1pdHRlZCwgdGhlIGJ1ZmZlciB3b24ndCBiZSBuZWVkZWQgYW55CisJCQkgKiBsb25nZXIuICovCisJCQlKQlVGRkVSX1RSQUNFKGpoLCAiY2hlY2twb2ludGVkOiBhZGQgdG8gQkpfRm9yZ2V0Iik7CisJCQlyZXQgPSBfX2Rpc3Bvc2VfYnVmZmVyKGpoLAorCQkJCQlqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24pOworCQkJam91cm5hbF9wdXRfam91cm5hbF9oZWFkKGpoKTsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIHsKKwkJCS8qIFRoZXJlIGlzIG5vIGN1cnJlbnRseS1ydW5uaW5nIHRyYW5zYWN0aW9uLiBTbyB0aGUKKwkJCSAqIG9ycGhhbiByZWNvcmQgd2hpY2ggd2Ugd3JvdGUgZm9yIHRoaXMgZmlsZSBtdXN0IGhhdmUKKwkJCSAqIHBhc3NlZCBpbnRvIGNvbW1pdC4gIFdlIG11c3QgYXR0YWNoIHRoaXMgYnVmZmVyIHRvCisJCQkgKiB0aGUgY29tbWl0dGluZyB0cmFuc2FjdGlvbiwgaWYgaXQgZXhpc3RzLiAqLworCQkJaWYgKGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbikgeworCQkJCUpCVUZGRVJfVFJBQ0UoamgsICJnaXZlIHRvIGNvbW1pdHRpbmcgdHJhbnMiKTsKKwkJCQlyZXQgPSBfX2Rpc3Bvc2VfYnVmZmVyKGpoLAorCQkJCQlqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24pOworCQkJCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CisJCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfSBlbHNlIHsKKwkJCQkvKiBUaGUgb3JwaGFuIHJlY29yZCdzIHRyYW5zYWN0aW9uIGhhcworCQkJCSAqIGNvbW1pdHRlZC4gIFdlIGNhbiBjbGVhbnNlIHRoaXMgYnVmZmVyICovCisJCQkJY2xlYXJfYnVmZmVyX2piZGRpcnR5KGJoKTsKKwkJCQlnb3RvIHphcF9idWZmZXI7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKHRyYW5zYWN0aW9uID09IGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbikgeworCQkvKiBJZiBpdCBpcyBjb21taXR0aW5nLCB3ZSBzaW1wbHkgY2Fubm90IHRvdWNoIGl0LiAgV2UKKwkJICogY2FuIHJlbW92ZSBpdCdzIG5leHRfdHJhbnNhY3Rpb24gcG9pbnRlciBmcm9tIHRoZQorCQkgKiBydW5uaW5nIHRyYW5zYWN0aW9uIGlmIHRoYXQgaXMgc2V0LCBidXQgbm90aGluZworCQkgKiBlbHNlLiAqLworCQlKQlVGRkVSX1RSQUNFKGpoLCAib24gY29tbWl0dGluZyB0cmFuc2FjdGlvbiIpOworCQlzZXRfYnVmZmVyX2ZyZWVkKGJoKTsKKwkJaWYgKGpoLT5iX25leHRfdHJhbnNhY3Rpb24pIHsKKwkJCUpfQVNTRVJUKGpoLT5iX25leHRfdHJhbnNhY3Rpb24gPT0KKwkJCQkJam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKTsKKwkJCWpoLT5iX25leHRfdHJhbnNhY3Rpb24gPSBOVUxMOworCQl9CisJCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogR29vZCwgdGhlIGJ1ZmZlciBiZWxvbmdzIHRvIHRoZSBydW5uaW5nIHRyYW5zYWN0aW9uLgorCQkgKiBXZSBhcmUgd3JpdGluZyBvdXIgb3duIHRyYW5zYWN0aW9uJ3MgZGF0YSwgbm90IGFueQorCQkgKiBwcmV2aW91cyBvbmUncywgc28gaXQgaXMgc2FmZSB0byB0aHJvdyBpdCBhd2F5CisJCSAqIChyZW1lbWJlciB0aGF0IHdlIGV4cGVjdCB0aGUgZmlsZXN5c3RlbSB0byBoYXZlIHNldAorCQkgKiBpX3NpemUgYWxyZWFkeSBmb3IgdGhpcyB0cnVuY2F0ZSBzbyByZWNvdmVyeSB3aWxsIG5vdAorCQkgKiBleHBvc2UgdGhlIGRpc2sgYmxvY2tzIHdlIGFyZSBkaXNjYXJkaW5nIGhlcmUuKSAqLworCQlKX0FTU0VSVF9KSChqaCwgdHJhbnNhY3Rpb24gPT0gam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKTsKKwkJbWF5X2ZyZWUgPSBfX2Rpc3Bvc2VfYnVmZmVyKGpoLCB0cmFuc2FjdGlvbik7CisJfQorCit6YXBfYnVmZmVyOgorCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7Cit6YXBfYnVmZmVyX25vX2poOgorCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7Cit6YXBfYnVmZmVyX3VubG9ja2VkOgorCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJSl9BU1NFUlRfQkgoYmgsICFidWZmZXJfamJkZGlydHkoYmgpKTsKKwljbGVhcl9idWZmZXJfbWFwcGVkKGJoKTsKKwljbGVhcl9idWZmZXJfcmVxKGJoKTsKKwljbGVhcl9idWZmZXJfbmV3KGJoKTsKKwliaC0+Yl9iZGV2ID0gTlVMTDsKKwlyZXR1cm4gbWF5X2ZyZWU7Cit9CisKKy8qKiAKKyAqIGludCBqb3VybmFsX2ludmFsaWRhdGVwYWdlKCkgCisgKiBAam91cm5hbDogam91cm5hbCB0byB1c2UgZm9yIGZsdXNoLi4uIAorICogQHBhZ2U6ICAgIHBhZ2UgdG8gZmx1c2gKKyAqIEBvZmZzZXQ6ICBsZW5ndGggb2YgcGFnZSB0byBpbnZhbGlkYXRlLgorICoKKyAqIFJlYXAgcGFnZSBidWZmZXJzIGNvbnRhaW5pbmcgZGF0YSBhZnRlciBvZmZzZXQgaW4gcGFnZS4KKyAqCisgKiBSZXR1cm4gbm9uLXplcm8gaWYgdGhlIHBhZ2UncyBidWZmZXJzIHdlcmUgc3VjY2Vzc2Z1bGx5IHJlYXBlZC4KKyAqLworaW50IGpvdXJuYWxfaW52YWxpZGF0ZXBhZ2Uoam91cm5hbF90ICpqb3VybmFsLCAKKwkJICAgICAgc3RydWN0IHBhZ2UgKnBhZ2UsIAorCQkgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsICpiaCwgKm5leHQ7CisJdW5zaWduZWQgaW50IGN1cnJfb2ZmID0gMDsKKwlpbnQgbWF5X2ZyZWUgPSAxOworCisJaWYgKCFQYWdlTG9ja2VkKHBhZ2UpKQorCQlCVUcoKTsKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCXJldHVybiAxOworCisJLyogV2Ugd2lsbCBwb3RlbnRpYWxseSBiZSBwbGF5aW5nIHdpdGggbGlzdHMgb3RoZXIgdGhhbiBqdXN0IHRoZQorCSAqIGRhdGEgbGlzdHMgKGVzcGVjaWFsbHkgZm9yIGpvdXJuYWxlZCBkYXRhIG1vZGUpLCBzbyBiZQorCSAqIGNhdXRpb3VzIGluIG91ciBsb2NraW5nLiAqLworCisJaGVhZCA9IGJoID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWRvIHsKKwkJdW5zaWduZWQgaW50IG5leHRfb2ZmID0gY3Vycl9vZmYgKyBiaC0+Yl9zaXplOworCQluZXh0ID0gYmgtPmJfdGhpc19wYWdlOworCisJCS8qIEFLUE06IGRvaW5nIGxvY2tfYnVmZmVyIGhlcmUgbWF5IGJlIG92ZXJseSBwYXJhbm9pZCAqLworCQlpZiAob2Zmc2V0IDw9IGN1cnJfb2ZmKSB7CisJCSAJLyogVGhpcyBibG9jayBpcyB3aG9sbHkgb3V0c2lkZSB0aGUgdHJ1bmNhdGlvbiBwb2ludCAqLworCQkJbG9ja19idWZmZXIoYmgpOworCQkJbWF5X2ZyZWUgJj0gam91cm5hbF91bm1hcF9idWZmZXIoam91cm5hbCwgYmgpOworCQkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCX0KKwkJY3Vycl9vZmYgPSBuZXh0X29mZjsKKwkJYmggPSBuZXh0OworCisJfSB3aGlsZSAoYmggIT0gaGVhZCk7CisKKwlpZiAoIW9mZnNldCkgeworCQlpZiAoIW1heV9mcmVlIHx8ICF0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpKQorCQkJcmV0dXJuIDA7CisJCUpfQVNTRVJUKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qIAorICogRmlsZSBhIGJ1ZmZlciBvbiB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24gbGlzdC4gCisgKi8KK3ZvaWQgX19qb3VybmFsX2ZpbGVfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoLAorCQkJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24sIGludCBqbGlzdCkKK3sKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICoqbGlzdCA9IE5VTEw7CisJaW50IHdhc19kaXJ0eSA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKKworCUpfQVNTRVJUX0pIKGpoLCBqYmRfaXNfbG9ja2VkX2JoX3N0YXRlKGJoKSk7CisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZ0cmFuc2FjdGlvbi0+dF9qb3VybmFsLT5qX2xpc3RfbG9jayk7CisKKwlKX0FTU0VSVF9KSChqaCwgamgtPmJfamxpc3QgPCBCSl9UeXBlcyk7CisJSl9BU1NFUlRfSkgoamgsIGpoLT5iX3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uIHx8CisJCQkJamgtPmJfdHJhbnNhY3Rpb24gPT0gMCk7CisKKwlpZiAoamgtPmJfdHJhbnNhY3Rpb24gJiYgamgtPmJfamxpc3QgPT0gamxpc3QpCisJCXJldHVybjsKKworCS8qIFRoZSBmb2xsb3dpbmcgbGlzdCBvZiBidWZmZXIgc3RhdGVzIG5lZWRzIHRvIGJlIGNvbnNpc3RlbnQKKwkgKiB3aXRoIF9famJkX3VuZXhwZWN0ZWRfZGlydHlfYnVmZmVyKCkncyBoYW5kbGluZyBvZiBkaXJ0eQorCSAqIHN0YXRlLiAqLworCisJaWYgKGpsaXN0ID09IEJKX01ldGFkYXRhIHx8IGpsaXN0ID09IEJKX1Jlc2VydmVkIHx8IAorCSAgICBqbGlzdCA9PSBCSl9TaGFkb3cgfHwgamxpc3QgPT0gQkpfRm9yZ2V0KSB7CisJCWlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaCkgfHwKKwkJICAgIHRlc3RfY2xlYXJfYnVmZmVyX2piZGRpcnR5KGJoKSkKKwkJCXdhc19kaXJ0eSA9IDE7CisJfQorCisJaWYgKGpoLT5iX3RyYW5zYWN0aW9uKQorCQlfX2pvdXJuYWxfdGVtcF91bmxpbmtfYnVmZmVyKGpoKTsKKwlqaC0+Yl90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uOworCisJc3dpdGNoIChqbGlzdCkgeworCWNhc2UgQkpfTm9uZToKKwkJSl9BU1NFUlRfSkgoamgsICFqaC0+Yl9jb21taXR0ZWRfZGF0YSk7CisJCUpfQVNTRVJUX0pIKGpoLCAhamgtPmJfZnJvemVuX2RhdGEpOworCQlyZXR1cm47CisJY2FzZSBCSl9TeW5jRGF0YToKKwkJbGlzdCA9ICZ0cmFuc2FjdGlvbi0+dF9zeW5jX2RhdGFsaXN0OworCQlicmVhazsKKwljYXNlIEJKX01ldGFkYXRhOgorCQl0cmFuc2FjdGlvbi0+dF9ucl9idWZmZXJzKys7CisJCWxpc3QgPSAmdHJhbnNhY3Rpb24tPnRfYnVmZmVyczsKKwkJYnJlYWs7CisJY2FzZSBCSl9Gb3JnZXQ6CisJCWxpc3QgPSAmdHJhbnNhY3Rpb24tPnRfZm9yZ2V0OworCQlicmVhazsKKwljYXNlIEJKX0lPOgorCQlsaXN0ID0gJnRyYW5zYWN0aW9uLT50X2lvYnVmX2xpc3Q7CisJCWJyZWFrOworCWNhc2UgQkpfU2hhZG93OgorCQlsaXN0ID0gJnRyYW5zYWN0aW9uLT50X3NoYWRvd19saXN0OworCQlicmVhazsKKwljYXNlIEJKX0xvZ0N0bDoKKwkJbGlzdCA9ICZ0cmFuc2FjdGlvbi0+dF9sb2dfbGlzdDsKKwkJYnJlYWs7CisJY2FzZSBCSl9SZXNlcnZlZDoKKwkJbGlzdCA9ICZ0cmFuc2FjdGlvbi0+dF9yZXNlcnZlZF9saXN0OworCQlicmVhazsKKwljYXNlIEJKX0xvY2tlZDoKKwkJbGlzdCA9ICAmdHJhbnNhY3Rpb24tPnRfbG9ja2VkX2xpc3Q7CisJCWJyZWFrOworCX0KKworCV9fYmxpc3RfYWRkX2J1ZmZlcihsaXN0LCBqaCk7CisJamgtPmJfamxpc3QgPSBqbGlzdDsKKworCWlmICh3YXNfZGlydHkpCisJCXNldF9idWZmZXJfamJkZGlydHkoYmgpOworfQorCit2b2lkIGpvdXJuYWxfZmlsZV9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgsCisJCQkJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24sIGludCBqbGlzdCkKK3sKKwlqYmRfbG9ja19iaF9zdGF0ZShqaDJiaChqaCkpOworCXNwaW5fbG9jaygmdHJhbnNhY3Rpb24tPnRfam91cm5hbC0+al9saXN0X2xvY2spOworCV9fam91cm5hbF9maWxlX2J1ZmZlcihqaCwgdHJhbnNhY3Rpb24sIGpsaXN0KTsKKwlzcGluX3VubG9jaygmdHJhbnNhY3Rpb24tPnRfam91cm5hbC0+al9saXN0X2xvY2spOworCWpiZF91bmxvY2tfYmhfc3RhdGUoamgyYmgoamgpKTsKK30KKworLyogCisgKiBSZW1vdmUgYSBidWZmZXIgZnJvbSBpdHMgY3VycmVudCBidWZmZXIgbGlzdCBpbiBwcmVwYXJhdGlvbiBmb3IKKyAqIGRyb3BwaW5nIGl0IGZyb20gaXRzIGN1cnJlbnQgdHJhbnNhY3Rpb24gZW50aXJlbHkuICBJZiB0aGUgYnVmZmVyIGhhcworICogYWxyZWFkeSBzdGFydGVkIHRvIGJlIHVzZWQgYnkgYSBzdWJzZXF1ZW50IHRyYW5zYWN0aW9uLCByZWZpbGUgdGhlCisgKiBidWZmZXIgb24gdGhhdCB0cmFuc2FjdGlvbidzIG1ldGFkYXRhIGxpc3QuCisgKgorICogQ2FsbGVkIHVuZGVyIGpvdXJuYWwtPmpfbGlzdF9sb2NrCisgKgorICogQ2FsbGVkIHVuZGVyIGpiZF9sb2NrX2JoX3N0YXRlKGpoMmJoKGpoKSkKKyAqLwordm9pZCBfX2pvdXJuYWxfcmVmaWxlX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKK3sKKwlpbnQgd2FzX2RpcnR5OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBqaDJiaChqaCk7CisKKwlKX0FTU0VSVF9KSChqaCwgamJkX2lzX2xvY2tlZF9iaF9zdGF0ZShiaCkpOworCWlmIChqaC0+Yl90cmFuc2FjdGlvbikKKwkJYXNzZXJ0X3NwaW5fbG9ja2VkKCZqaC0+Yl90cmFuc2FjdGlvbi0+dF9qb3VybmFsLT5qX2xpc3RfbG9jayk7CisKKwkvKiBJZiB0aGUgYnVmZmVyIGlzIG5vdyB1bnVzZWQsIGp1c3QgZHJvcCBpdC4gKi8KKwlpZiAoamgtPmJfbmV4dF90cmFuc2FjdGlvbiA9PSBOVUxMKSB7CisJCV9fam91cm5hbF91bmZpbGVfYnVmZmVyKGpoKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSXQgaGFzIGJlZW4gbW9kaWZpZWQgYnkgYSBsYXRlciB0cmFuc2FjdGlvbjogYWRkIGl0IHRvIHRoZSBuZXcKKwkgKiB0cmFuc2FjdGlvbidzIG1ldGFkYXRhIGxpc3QuCisJICovCisKKwl3YXNfZGlydHkgPSB0ZXN0X2NsZWFyX2J1ZmZlcl9qYmRkaXJ0eShiaCk7CisJX19qb3VybmFsX3RlbXBfdW5saW5rX2J1ZmZlcihqaCk7CisJamgtPmJfdHJhbnNhY3Rpb24gPSBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uOworCWpoLT5iX25leHRfdHJhbnNhY3Rpb24gPSBOVUxMOworCV9fam91cm5hbF9maWxlX2J1ZmZlcihqaCwgamgtPmJfdHJhbnNhY3Rpb24sIEJKX01ldGFkYXRhKTsKKwlKX0FTU0VSVF9KSChqaCwgamgtPmJfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPT0gVF9SVU5OSU5HKTsKKworCWlmICh3YXNfZGlydHkpCisJCXNldF9idWZmZXJfamJkZGlydHkoYmgpOworfQorCisvKgorICogRm9yIHRoZSB1bmxvY2tlZCB2ZXJzaW9uIG9mIHRoaXMgY2FsbCwgYWxzbyBtYWtlIHN1cmUgdGhhdCBhbnkKKyAqIGhhbmdpbmcgam91cm5hbF9oZWFkIGlzIGNsZWFuZWQgdXAgaWYgbmVjZXNzYXJ5LgorICoKKyAqIF9fam91cm5hbF9yZWZpbGVfYnVmZmVyIGlzIHVzdWFsbHkgY2FsbGVkIGFzIHBhcnQgb2YgYSBzaW5nbGUgbG9ja2VkCisgKiBvcGVyYXRpb24gb24gYSBidWZmZXJfaGVhZCwgaW4gd2hpY2ggdGhlIGNhbGxlciBpcyBwcm9iYWJseSBnb2luZyB0bworICogYmUgaG9va2luZyB0aGUgam91cm5hbF9oZWFkIG9udG8gb3RoZXIgbGlzdHMuICBJbiB0aGF0IGNhc2UgaXQgaXMgdXAKKyAqIHRvIHRoZSBjYWxsZXIgdG8gcmVtb3ZlIHRoZSBqb3VybmFsX2hlYWQgaWYgbmVjZXNzYXJ5LiAgRm9yIHRoZQorICogdW5sb2NrZWQgam91cm5hbF9yZWZpbGVfYnVmZmVyIGNhbGwsIHRoZSBjYWxsZXIgaXNuJ3QgZ29pbmcgdG8gYmUKKyAqIGRvaW5nIGFueXRoaW5nIGVsc2UgdG8gdGhlIGJ1ZmZlciBzbyB3ZSBuZWVkIHRvIGRvIHRoZSBjbGVhbnVwCisgKiBvdXJzZWx2ZXMgdG8gYXZvaWQgYSBqaCBsZWFrLiAKKyAqCisgKiAqKiogVGhlIGpvdXJuYWxfaGVhZCBtYXkgYmUgZnJlZWQgYnkgdGhpcyBjYWxsISAqKioKKyAqLwordm9pZCBqb3VybmFsX3JlZmlsZV9idWZmZXIoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gamgyYmgoamgpOworCisJamJkX2xvY2tfYmhfc3RhdGUoYmgpOworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCisJX19qb3VybmFsX3JlZmlsZV9idWZmZXIoamgpOworCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCWpvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7CisKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCV9fYnJlbHNlKGJoKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmZnMvTWFrZWZpbGUgYi9mcy9qZmZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMWMwYmIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTEgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBKb3VybmFsbGluZyBGbGFzaCBGaWxlU3lzdGVtIChKRkZTKSByb3V0aW5lcy4KKyMKKyMgJElkOiBNYWtlZmlsZSx2IDEuMTEgMjAwMS8wOS8yNSAyMDo1OTo0MSBkd213MiBFeHAgJAorIworCitvYmotJChDT05GSUdfSkZGU19GUykgKz0gamZmcy5vCisKK2pmZnMteSAJCQkJOj0gamZmc19mbS5vIGludHJlcC5vIGlub2RlLXYyMy5vCitqZmZzLSQoQ09ORklHX0pGRlNfUFJPQ19GUykJKz0gamZmc19wcm9jLm8KK2pmZnMtb2JqcwkJCTo9ICQoamZmcy15KQpkaWZmIC0tZ2l0IGEvZnMvamZmcy9pbm9kZS12MjMuYyBiL2ZzL2pmZnMvaW5vZGUtdjIzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiZWI0YwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMvaW5vZGUtdjIzLmMKQEAgLTAsMCArMSwxODQ3IEBACisvKgorICogSkZGUyAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgTGludXggaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwICBBeGlzIENvbW11bmljYXRpb25zIEFCLgorICoKKyAqIENyZWF0ZWQgYnkgRmlubiBIYWthbnNzb24gPGZpbm5AYXhpcy5jb20+LgorICoKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICRJZDogaW5vZGUtdjIzLmMsdiAxLjcwIDIwMDEvMTAvMDIgMDk6MTY6MDIgZHdtdzIgRXhwICQKKyAqCisgKiBQb3J0ZWQgdG8gTGludXggMi4zLnggYW5kIE1URDoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAgQWxleGFuZGVyIExhcnNzb24gKGFsZXhAY2VuZGlvLnNlKSwgQ2VuZGlvIFN5c3RlbXMgQUIKKyAqCisgKiBDb3B5cmlnaHQgMjAwMCwgMjAwMSAgUmVkIEhhdCwgSW5jLgorICovCisKKy8qIGlub2RlLmMgLS0gQ29udGFpbnMgdGhlIGNvZGUgdGhhdCBpcyBjYWxsZWQgZnJvbSB0aGUgVkZTLiAgKi8KKworLyogVE9ETy1BTEVYOgorICogdWlkIGFuZCBnaWQgYXJlIGp1c3QgMTYgYml0LgorICogamZmc19maWxlX3dyaXRlIHJlYWRzIGZyb20gdXNlci1zcGFjZSBwb2ludGVycyB3aXRob3V0IHh4X2Zyb21fdXNlcgorICogbWF5YmUgb3RoZXIgc3R1ZmYgZG8gdG8uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2pmZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiamZmc19mbS5oIgorI2luY2x1ZGUgImludHJlcC5oIgorI2lmZGVmIENPTkZJR19KRkZTX1BST0NfRlMKKyNpbmNsdWRlICJqZmZzX3Byb2MuaCIKKyNlbmRpZgorCitzdGF0aWMgaW50IGpmZnNfcmVtb3ZlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCB0eXBlKTsKKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGpmZnNfb3BzOworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgamZmc19maWxlX29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgamZmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBqZmZzX2Rpcl9vcGVyYXRpb25zOworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGpmZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBqZmZzX2FkZHJlc3Nfb3BlcmF0aW9uczsKKwora21lbV9jYWNoZV90ICAgICAqbm9kZV9jYWNoZSA9IE5VTEw7CitrbWVtX2NhY2hlX3QgICAgICpmbV9jYWNoZSA9IE5VTEw7CisKKy8qIENhbGxlZCBieSB0aGUgVkZTIGF0IG1vdW50IHRpbWUgdG8gaW5pdGlhbGl6ZSB0aGUgd2hvbGUgZmlsZSBzeXN0ZW0uICAqLworc3RhdGljIGludCBqZmZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGU7CisJc3RydWN0IGpmZnNfY29udHJvbCAqYzsKKworCXNiLT5zX2ZsYWdzIHw9IE1TX05PRElSQVRJTUU7CisKKwlEMShwcmludGsoS0VSTl9OT1RJQ0UgIkpGRlM6IFRyeWluZyB0byBtb3VudCBkZXZpY2UgJXMuXG4iLAorCQkgIHNiLT5zX2lkKSk7CisKKwlpZiAoTUFKT1Ioc2ItPnNfZGV2KSAhPSBNVERfQkxPQ0tfTUFKT1IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkZGUzogVHJ5aW5nIHRvIG1vdW50IGEgIgorCQkgICAgICAgIm5vbi1tdGQgZGV2aWNlLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNiLT5zX2Jsb2Nrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwlzYi0+c19ibG9ja3NpemVfYml0cyA9IFBBR0VfQ0FDSEVfU0hJRlQ7CisJc2ItPnNfZnNfaW5mbyA9ICh2b2lkICopIDA7CisJc2ItPnNfbWF4Ynl0ZXMgPSAweEZGRkZGRkZGOworCisJLyogQnVpbGQgdGhlIGZpbGUgc3lzdGVtLiAgKi8KKwlpZiAoamZmc19idWlsZF9mcyhzYikgPCAwKSB7CisJCWdvdG8gamZmc19zYl9lcnIxOworCX0KKworCS8qCisJICogc2V0IHVwIGVub3VnaCBzbyB0aGF0IHdlIGNhbiByZWFkIGFuIGlub2RlCisJICovCisJc2ItPnNfbWFnaWMgPSBKRkZTX01BR0lDX1NCX0JJVE1BU0s7CisJc2ItPnNfb3AgPSAmamZmc19vcHM7CisKKwlyb290X2lub2RlID0gaWdldChzYiwgSkZGU19NSU5fSU5PKTsKKwlpZiAoIXJvb3RfaW5vZGUpCisJICAgICAgICBnb3RvIGpmZnNfc2JfZXJyMjsKKworCS8qIEdldCB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBmaWxlIHN5c3RlbS4gICovCisJaWYgKCEoc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKSkpIHsKKwkJZ290byBqZmZzX3NiX2VycjM7CisJfQorCisJYyA9IChzdHJ1Y3QgamZmc19jb250cm9sICopIHNiLT5zX2ZzX2luZm87CisKKyNpZmRlZiBDT05GSUdfSkZGU19QUk9DX0ZTCisJLyogU2V0IHVwIHRoZSBqZmZzIHByb2MgZmlsZSBzeXN0ZW0uICAqLworCWlmIChqZmZzX3JlZ2lzdGVyX2pmZnNfcHJvY19kaXIoTUlOT1Ioc2ItPnNfZGV2KSwgYykgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkpGRlM6IEZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBKRkZTICIKKwkJCSJwcm9jIGZpbGUgc3lzdGVtIGZvciBkZXZpY2UgJXMuXG4iLAorCQkJc2ItPnNfaWQpOworCX0KKyNlbmRpZgorCisJLyogU2V0IHRoZSBHYXJiYWdlIENvbGxlY3Rpb24gdGhyZXNob2xkcyAqLworCisJLyogR0MgaWYgZnJlZSBzcGFjZSBnb2VzIGJlbG93IDUlIG9mIHRoZSB0b3RhbCBzaXplICovCisJYy0+Z2NfbWluZnJlZV90aHJlc2hvbGQgPSBjLT5mbWMtPmZsYXNoX3NpemUgLyAyMDsKKworCWlmIChjLT5nY19taW5mcmVlX3RocmVzaG9sZCA8IGMtPmZtYy0+c2VjdG9yX3NpemUpCisJCWMtPmdjX21pbmZyZWVfdGhyZXNob2xkID0gYy0+Zm1jLT5zZWN0b3Jfc2l6ZTsKKworCS8qIEdDIGlmIGRpcnR5IHNwYWNlIGV4Y2VlZHMgMzMlIG9mIHRoZSB0b3RhbCBzaXplLiAqLworCWMtPmdjX21heGRpcnR5X3RocmVzaG9sZCA9IGMtPmZtYy0+Zmxhc2hfc2l6ZSAvIDM7CisKKwlpZiAoYy0+Z2NfbWF4ZGlydHlfdGhyZXNob2xkIDwgYy0+Zm1jLT5zZWN0b3Jfc2l6ZSkKKwkJYy0+Z2NfbWF4ZGlydHlfdGhyZXNob2xkID0gYy0+Zm1jLT5zZWN0b3Jfc2l6ZTsKKworCisJYy0+dGhyZWFkX3BpZCA9IGtlcm5lbF90aHJlYWQgKGpmZnNfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZCwgCisJCQkJICAgICAgICAodm9pZCAqKSBjLCAKKwkJCQkgICAgICAgIENMT05FX0tFUk5FTCk7CisJRDEocHJpbnRrKEtFUk5fTk9USUNFICJKRkZTOiBHQyB0aHJlYWQgcGlkPSVkLlxuIiwgKGludCkgYy0+dGhyZWFkX3BpZCkpOworCisJRDEocHJpbnRrKEtFUk5fTk9USUNFICJKRkZTOiBTdWNjZXNzZnVsbHkgbW91bnRlZCBkZXZpY2UgJXMuXG4iLAorCSAgICAgICBzYi0+c19pZCkpOworCXJldHVybiAwOworCitqZmZzX3NiX2VycjM6CisJaXB1dChyb290X2lub2RlKTsKK2pmZnNfc2JfZXJyMjoKKwlqZmZzX2NsZWFudXBfY29udHJvbCgoc3RydWN0IGpmZnNfY29udHJvbCAqKXNiLT5zX2ZzX2luZm8pOworamZmc19zYl9lcnIxOgorCXByaW50ayhLRVJOX1dBUk5JTkcgIkpGRlM6IEZhaWxlZCB0byBtb3VudCBkZXZpY2UgJXMuXG4iLAorCSAgICAgICBzYi0+c19pZCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgZmlsZSBzeXN0ZW0gaXMgdW1vdW50ZWQuICAqLworc3RhdGljIHZvaWQKK2pmZnNfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGpmZnNfY29udHJvbCAqYyA9IChzdHJ1Y3QgamZmc19jb250cm9sICopIHNiLT5zX2ZzX2luZm87CisKKwlEMihwcmludGsoImpmZnNfcHV0X3N1cGVyKClcbiIpKTsKKworI2lmZGVmIENPTkZJR19KRkZTX1BST0NfRlMKKwlqZmZzX3VucmVnaXN0ZXJfamZmc19wcm9jX2RpcihjKTsKKyNlbmRpZgorCisJaWYgKGMtPmdjX3Rhc2spIHsKKwkJRDEocHJpbnRrIChLRVJOX05PVElDRSAiamZmc19wdXRfc3VwZXIoKTogVGVsbGluZyBnYyB0aHJlYWQgdG8gZGllLlxuIikpOworCQlzZW5kX3NpZyhTSUdLSUxMLCBjLT5nY190YXNrLCAxKTsKKwl9CisJd2FpdF9mb3JfY29tcGxldGlvbigmYy0+Z2NfdGhyZWFkX2NvbXApOworCisJRDEocHJpbnRrIChLRVJOX05PVElDRSAiamZmc19wdXRfc3VwZXIoKTogU3VjY2Vzc2Z1bGx5IHdhaXRlZCBvbiB0aHJlYWQuXG4iKSk7CisKKwlqZmZzX2NsZWFudXBfY29udHJvbCgoc3RydWN0IGpmZnNfY29udHJvbCAqKXNiLT5zX2ZzX2luZm8pOworCUQxKHByaW50ayhLRVJOX05PVElDRSAiSkZGUzogU3VjY2Vzc2Z1bGx5IHVubW91bnRlZCBkZXZpY2UgJXMuXG4iLAorCSAgICAgICBzYi0+c19pZCkpOworfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdXNlciBjb21tYW5kcyBsaWtlIGNobW9kLCBjaGdycCBhbmQKKyAgIGNob3duIGFyZSBleGVjdXRlZC4gU3lzdGVtIGNhbGxzIGxpa2UgdHJ1bmMoKSByZXN1bHRzIGluIGEgY2FsbAorICAgdG8gdGhpcyBmdW5jdGlvbi4gICovCitzdGF0aWMgaW50CitqZmZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmlhdHRyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGpmZnNfcmF3X2lub2RlIHJhd19pbm9kZTsKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjOworCXN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jOworCXN0cnVjdCBqZmZzX2ZpbGUgKmY7CisJc3RydWN0IGpmZnNfbm9kZSAqbmV3X25vZGU7CisJaW50IHVwZGF0ZV9hbGw7CisJaW50IHJlcyA9IDA7CisJaW50IHJlY292ZXJhYmxlID0gMDsKKworCWxvY2tfa2VybmVsKCk7CisKKwlpZiAoKHJlcyA9IGlub2RlX2NoYW5nZV9vayhpbm9kZSwgaWF0dHIpKSkgCisJCWdvdG8gb3V0OworCisJYyA9IChzdHJ1Y3QgamZmc19jb250cm9sICopaW5vZGUtPmlfc2ItPnNfZnNfaW5mbzsKKwlmbWMgPSBjLT5mbWM7CisKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJub3RpZnlfY2hhbmdlKCk6IGRvd24gYmlnbG9ja1xuIikpOworCWRvd24oJmZtYy0+YmlnbG9jayk7CisKKwlmID0gamZmc19maW5kX2ZpbGUoYywgaW5vZGUtPmlfaW5vKTsKKworCUFTU0VSVChpZiAoIWYpIHsKKwkJcHJpbnRrKCJqZmZzX3NldGF0dHIoKTogSW52YWxpZCBpbm9kZSBudW1iZXI6ICVsdVxuIiwKKwkJICAgICAgIGlub2RlLT5pX2lubyk7CisJCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgIm5vdGlmeV9jaGFuZ2UoKTogdXAgYmlnbG9ja1xuIikpOworCQl1cCgmZm1jLT5iaWdsb2NrKTsKKwkJcmVzID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfSk7CisKKwlEMShwcmludGsoIioqKmpmZnNfc2V0YXR0cigpOiBmaWxlOiBcIiVzXCIsIGlubzogJXVcbiIsCisJCSAgZi0+bmFtZSwgZi0+aW5vKSk7CisKKwl1cGRhdGVfYWxsID0gaWF0dHItPmlhX3ZhbGlkICYgQVRUUl9GT1JDRTsKKworCWlmICggKHVwZGF0ZV9hbGwgfHwgaWF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKQorCSAgICAgJiYgKGlhdHRyLT5pYV9zaXplICsgMTI4IDwgZi0+c2l6ZSkgKSB7CisJCS8qIFdlJ3JlIHNocmlua2luZyB0aGUgZmlsZSBieSBtb3JlIHRoYW4gMTI4IGJ5dGVzLgorCQkgICBXZSdsbCBiZSBhYmxlIHRvIEdDIGFuZCByZWNvdmVyIHRoaXMgc3BhY2UsIHNvCisJCSAgIGFsbG93IGl0IHRvIGdvIGludG8gdGhlIHJlc2VydmVkIHNwYWNlLiAqLworCQlyZWNvdmVyYWJsZSA9IDE7CisgICAgICAgIH0KKworCWlmICghKG5ld19ub2RlID0gamZmc19hbGxvY19ub2RlKCkpKSB7CisJCUQocHJpbnRrKCJqZmZzX3NldGF0dHIoKTogQWxsb2NhdGlvbiBmYWlsZWQhXG4iKSk7CisJCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgIm5vdGlmeV9jaGFuZ2UoKTogdXAgYmlnbG9ja1xuIikpOworCQl1cCgmZm1jLT5iaWdsb2NrKTsKKwkJcmVzID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJbmV3X25vZGUtPmRhdGFfb2Zmc2V0ID0gMDsKKwluZXdfbm9kZS0+cmVtb3ZlZF9zaXplID0gMDsKKwlyYXdfaW5vZGUubWFnaWMgPSBKRkZTX01BR0lDX0JJVE1BU0s7CisJcmF3X2lub2RlLmlubyA9IGYtPmlubzsKKwlyYXdfaW5vZGUucGlubyA9IGYtPnBpbm87CisJcmF3X2lub2RlLm1vZGUgPSBmLT5tb2RlOworCXJhd19pbm9kZS51aWQgPSBmLT51aWQ7CisJcmF3X2lub2RlLmdpZCA9IGYtPmdpZDsKKwlyYXdfaW5vZGUuYXRpbWUgPSBmLT5hdGltZTsKKwlyYXdfaW5vZGUubXRpbWUgPSBmLT5tdGltZTsKKwlyYXdfaW5vZGUuY3RpbWUgPSBmLT5jdGltZTsKKwlyYXdfaW5vZGUuZHNpemUgPSAwOworCXJhd19pbm9kZS5vZmZzZXQgPSAwOworCXJhd19pbm9kZS5yc2l6ZSA9IDA7CisJcmF3X2lub2RlLmRzaXplID0gMDsKKwlyYXdfaW5vZGUubnNpemUgPSBmLT5uc2l6ZTsKKwlyYXdfaW5vZGUubmxpbmsgPSBmLT5ubGluazsKKwlyYXdfaW5vZGUuc3BhcmUgPSAwOworCXJhd19pbm9kZS5yZW5hbWUgPSAwOworCXJhd19pbm9kZS5kZWxldGVkID0gMDsKKworCWlmICh1cGRhdGVfYWxsIHx8IGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgeworCQlyYXdfaW5vZGUubW9kZSA9IGlhdHRyLT5pYV9tb2RlOworCQlpbm9kZS0+aV9tb2RlID0gaWF0dHItPmlhX21vZGU7CisJfQorCWlmICh1cGRhdGVfYWxsIHx8IGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKSB7CisJCXJhd19pbm9kZS51aWQgPSBpYXR0ci0+aWFfdWlkOworCQlpbm9kZS0+aV91aWQgPSBpYXR0ci0+aWFfdWlkOworCX0KKwlpZiAodXBkYXRlX2FsbCB8fCBpYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCkgeworCQlyYXdfaW5vZGUuZ2lkID0gaWF0dHItPmlhX2dpZDsKKwkJaW5vZGUtPmlfZ2lkID0gaWF0dHItPmlhX2dpZDsKKwl9CisJaWYgKHVwZGF0ZV9hbGwgfHwgaWF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CisJCWludCBsZW47CisJCUQxKHByaW50aygiamZmc19ub3RpZnlfY2hhbmdlKCk6IENoYW5naW5nIHNpemUgIgorCQkJICAidG8gJWx1IGJ5dGVzIVxuIiwgKGxvbmcpaWF0dHItPmlhX3NpemUpKTsKKwkJcmF3X2lub2RlLm9mZnNldCA9IGlhdHRyLT5pYV9zaXplOworCisJCS8qIENhbGN1bGF0ZSBob3cgbWFueSBieXRlcyBuZWVkIHRvIGJlIHJlbW92ZWQgZnJvbQorCQkgICB0aGUgZW5kLiAgKi8KKwkJaWYgKGYtPnNpemUgPCBpYXR0ci0+aWFfc2l6ZSkgeworCQkJbGVuID0gMDsKKwkJfQorCQllbHNlIHsKKwkJCWxlbiA9IGYtPnNpemUgLSBpYXR0ci0+aWFfc2l6ZTsKKwkJfQorCisJCXJhd19pbm9kZS5yc2l6ZSA9IGxlbjsKKworCQkvKiBUaGUgdXBkYXRlZCBub2RlIHdpbGwgYmUgYSByZW1vdmFsIG5vZGUsIHdpdGgKKwkJICAgYmFzZSBhdCB0aGUgbmV3IHNpemUgYW5kIHNpemUgb2YgdGhlIG5iciBvZiBieXRlcworCQkgICB0byBiZSByZW1vdmVkLiAgKi8KKwkJbmV3X25vZGUtPmRhdGFfb2Zmc2V0ID0gaWF0dHItPmlhX3NpemU7CisJCW5ld19ub2RlLT5yZW1vdmVkX3NpemUgPSBsZW47CisJCWlub2RlLT5pX3NpemUgPSBpYXR0ci0+aWFfc2l6ZTsKKwkJaW5vZGUtPmlfYmxvY2tzID0gKGlub2RlLT5pX3NpemUgKyA1MTEpID4+IDk7CisKKwkJaWYgKGxlbikgeworCQkJaW52YWxpZGF0ZV9pbm9kZV9wYWdlcyhpbm9kZS0+aV9tYXBwaW5nKTsKKwkJfQorCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWU7CisJfQorCWlmICh1cGRhdGVfYWxsIHx8IGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUUpIHsKKwkJcmF3X2lub2RlLmF0aW1lID0gaWF0dHItPmlhX2F0aW1lLnR2X3NlYzsKKwkJaW5vZGUtPmlfYXRpbWUgPSBpYXR0ci0+aWFfYXRpbWU7CisJfQorCWlmICh1cGRhdGVfYWxsIHx8IGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfTVRJTUUpIHsKKwkJcmF3X2lub2RlLm10aW1lID0gaWF0dHItPmlhX210aW1lLnR2X3NlYzsKKwkJaW5vZGUtPmlfbXRpbWUgPSBpYXR0ci0+aWFfbXRpbWU7CisJfQorCWlmICh1cGRhdGVfYWxsIHx8IGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfQ1RJTUUpIHsKKwkJcmF3X2lub2RlLmN0aW1lID0gaWF0dHItPmlhX2N0aW1lLnR2X3NlYzsKKwkJaW5vZGUtPmlfY3RpbWUgPSBpYXR0ci0+aWFfY3RpbWU7CisJfQorCisJLyogV3JpdGUgdGhpcyBub2RlIHRvIHRoZSBmbGFzaC4gICovCisJaWYgKChyZXMgPSBqZmZzX3dyaXRlX25vZGUoYywgbmV3X25vZGUsICZyYXdfaW5vZGUsIGYtPm5hbWUsIE5VTEwsIHJlY292ZXJhYmxlLCBmKSkgPCAwKSB7CisJCUQocHJpbnRrKCJqZmZzX25vdGlmeV9jaGFuZ2UoKTogVGhlIHdyaXRlIGZhaWxlZCFcbiIpKTsKKwkJamZmc19mcmVlX25vZGUobmV3X25vZGUpOworCQlEMyhwcmludGsgKEtFUk5fTk9USUNFICJuX2MoKTogdXAgYmlnbG9ja1xuIikpOworCQl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKwkJZ290byBvdXQ7CisJfQorCisJamZmc19pbnNlcnRfbm9kZShjLCBmLCAmcmF3X2lub2RlLCBOVUxMLCBuZXdfbm9kZSk7CisKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJuX2MoKTogdXAgYmlnbG9ja1xuIikpOworCXVwKCZjLT5mbWMtPmJpZ2xvY2spOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmVzOworfSAvKiBqZmZzX25vdGlmeV9jaGFuZ2UoKSAgKi8KKworCitzdGF0aWMgc3RydWN0IGlub2RlICoKK2pmZnNfbmV3X2lub2RlKGNvbnN0IHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGpmZnNfcmF3X2lub2RlICpyYXdfaW5vZGUsCisJICAgICAgIGludCAqIGVycikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjOworCXN0cnVjdCBqZmZzX2ZpbGUgKmY7CisKKwlzYiA9IGRpci0+aV9zYjsKKwlpbm9kZSA9IG5ld19pbm9kZShzYik7CisJaWYgKCFpbm9kZSkgeworCQkqZXJyID0gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYyA9IChzdHJ1Y3QgamZmc19jb250cm9sICopc2ItPnNfZnNfaW5mbzsKKworCWlub2RlLT5pX2lubyA9IHJhd19pbm9kZS0+aW5vOworCWlub2RlLT5pX21vZGUgPSByYXdfaW5vZGUtPm1vZGU7CisJaW5vZGUtPmlfbmxpbmsgPSByYXdfaW5vZGUtPm5saW5rOworCWlub2RlLT5pX3VpZCA9IHJhd19pbm9kZS0+dWlkOworCWlub2RlLT5pX2dpZCA9IHJhd19pbm9kZS0+Z2lkOworCWlub2RlLT5pX3NpemUgPSByYXdfaW5vZGUtPmRzaXplOworCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IHJhd19pbm9kZS0+YXRpbWU7CisJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gcmF3X2lub2RlLT5tdGltZTsKKwlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSByYXdfaW5vZGUtPmN0aW1lOworCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOworCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSAwOworCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAwOworCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX1NJWkU7CisJaW5vZGUtPmlfYmxvY2tzID0gKGlub2RlLT5pX3NpemUgKyA1MTEpID4+IDk7CisKKwlmID0gamZmc19maW5kX2ZpbGUoYywgcmF3X2lub2RlLT5pbm8pOworCisJaW5vZGUtPnUuZ2VuZXJpY19pcCA9ICh2b2lkICopZjsKKwlpbnNlcnRfaW5vZGVfaGFzaChpbm9kZSk7CisKKwlyZXR1cm4gaW5vZGU7Cit9CisKKy8qIEdldCBzdGF0aXN0aWNzIG9mIHRoZSBmaWxlIHN5c3RlbS4gICovCitzdGF0aWMgaW50CitqZmZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCXN0cnVjdCBqZmZzX2NvbnRyb2wgKmMgPSAoc3RydWN0IGpmZnNfY29udHJvbCAqKSBzYi0+c19mc19pbmZvOworCXN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jOworCisJbG9ja19rZXJuZWwoKTsKKworCWZtYyA9IGMtPmZtYzsKKworCUQyKHByaW50aygiamZmc19zdGF0ZnMoKVxuIikpOworCisJYnVmLT5mX3R5cGUgPSBKRkZTX01BR0lDX1NCX0JJVE1BU0s7CisJYnVmLT5mX2JzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCWJ1Zi0+Zl9ibG9ja3MgPSAoZm1jLT5mbGFzaF9zaXplIC8gUEFHRV9DQUNIRV9TSVpFKQorCQkgICAgICAgLSAoZm1jLT5taW5fZnJlZV9zaXplIC8gUEFHRV9DQUNIRV9TSVpFKTsKKwlidWYtPmZfYmZyZWUgPSAoamZmc19mcmVlX3NpemUxKGZtYykgKyBqZmZzX2ZyZWVfc2l6ZTIoZm1jKSArCisJCSAgICAgICBmbWMtPmRpcnR5X3NpemUgLSBmbWMtPm1pbl9mcmVlX3NpemUpCisJCQkgICAgICAgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlOworCisJLyogRmluZCBvdXQgaG93IG1hbnkgZmlsZXMgdGhlcmUgYXJlIGluIHRoZSBmaWxlc3lzdGVtLiAgKi8KKwlidWYtPmZfZmlsZXMgPSBqZmZzX2ZvcmVhY2hfZmlsZShjLCBqZmZzX2ZpbGVfY291bnQpOworCWJ1Zi0+Zl9mZnJlZSA9IGJ1Zi0+Zl9iZnJlZTsKKwkvKiBidWYtPmZfZnNpZCA9IDA7ICovCisJYnVmLT5mX25hbWVsZW4gPSBKRkZTX01BWF9OQU1FX0xFTjsKKworCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiAwOworfQorCisKKy8qIFJlbmFtZSBhIGZpbGUuICAqLworc3RhdGljIGludAoramZmc19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorCSAgICBzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisJc3RydWN0IGpmZnNfcmF3X2lub2RlIHJhd19pbm9kZTsKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjOworCXN0cnVjdCBqZmZzX2ZpbGUgKm9sZF9kaXJfZjsKKwlzdHJ1Y3QgamZmc19maWxlICpuZXdfZGlyX2Y7CisJc3RydWN0IGpmZnNfZmlsZSAqZGVsX2Y7CisJc3RydWN0IGpmZnNfZmlsZSAqZjsKKwlzdHJ1Y3QgamZmc19ub2RlICpub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHJlc3VsdCA9IDA7CisJX191MzIgcmVuYW1lX2RhdGEgPSAwOworCisJRDIocHJpbnRrKCIqKipqZmZzX3JlbmFtZSgpXG4iKSk7CisKKwlEKHByaW50aygiamZmc19yZW5hbWUoKTogb2xkX2RpcjogMHglcCwgb2xkIG5hbWU6IDB4JXAsICIKKwkJICJuZXdfZGlyOiAweCVwLCBuZXcgbmFtZTogMHglcFxuIiwKKwkJIG9sZF9kaXIsIG9sZF9kZW50cnktPmRfbmFtZS5uYW1lLAorCQkgbmV3X2RpciwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUpKTsKKworCWxvY2tfa2VybmVsKCk7CisJYyA9IChzdHJ1Y3QgamZmc19jb250cm9sICopb2xkX2Rpci0+aV9zYi0+c19mc19pbmZvOworCUFTU0VSVChpZiAoIWMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJqZmZzX3JlbmFtZSgpOiBUaGUgb2xkX2RpciBpbm9kZSAiCisJCSAgICAgICAiZGlkbid0IGhhdmUgYSByZWZlcmVuY2UgdG8gYSBqZmZzX2ZpbGUgc3RydWN0XG4iKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTzsKKwl9KTsKKworCXJlc3VsdCA9IC1FTk9URElSOworCWlmICghKG9sZF9kaXJfZiA9IChzdHJ1Y3QgamZmc19maWxlICopb2xkX2Rpci0+dS5nZW5lcmljX2lwKSkgeworCQlEKHByaW50aygiamZmc19yZW5hbWUoKTogT2xkIGRpciBpbnZhbGlkLlxuIikpOworCQlnb3RvIGpmZnNfcmVuYW1lX2VuZDsKKwl9CisKKwkvKiBUcnkgdG8gZmluZCB0aGUgZmlsZSB0byBtb3ZlLiAgKi8KKwlyZXN1bHQgPSAtRU5PRU5UOworCWlmICghKGYgPSBqZmZzX2ZpbmRfY2hpbGQob2xkX2Rpcl9mLCBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkgIG9sZF9kZW50cnktPmRfbmFtZS5sZW4pKSkgeworCQlnb3RvIGpmZnNfcmVuYW1lX2VuZDsKKwl9CisKKwkvKiBGaW5kIHRoZSBuZXcgZGlyZWN0b3J5LiAgKi8KKwlyZXN1bHQgPSAtRU5PVERJUjsKKwlpZiAoIShuZXdfZGlyX2YgPSAoc3RydWN0IGpmZnNfZmlsZSAqKW5ld19kaXItPnUuZ2VuZXJpY19pcCkpIHsKKwkJRChwcmludGsoImpmZnNfcmVuYW1lKCk6IE5ldyBkaXIgaW52YWxpZC5cbiIpKTsKKwkJZ290byBqZmZzX3JlbmFtZV9lbmQ7CisJfQorCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgInJlbmFtZSgpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwlkb3duKCZjLT5mbWMtPmJpZ2xvY2spOworCS8qIENyZWF0ZSBhIG5vZGUgYW5kIGluaXRpYWxpemUgYXMgbXVjaCBhcyBuZWVkZWQuICAqLworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEobm9kZSA9IGpmZnNfYWxsb2Nfbm9kZSgpKSkgeworCQlEKHByaW50aygiamZmc19yZW5hbWUoKTogQWxsb2NhdGlvbiBmYWlsZWQ6IG5vZGUgPT0gMFxuIikpOworCQlnb3RvIGpmZnNfcmVuYW1lX2VuZDsKKwl9CisJbm9kZS0+ZGF0YV9vZmZzZXQgPSAwOworCW5vZGUtPnJlbW92ZWRfc2l6ZSA9IDA7CisKKwkvKiBJbml0aWFsaXplIHRoZSByYXcgaW5vZGUuICAqLworCXJhd19pbm9kZS5tYWdpYyA9IEpGRlNfTUFHSUNfQklUTUFTSzsKKwlyYXdfaW5vZGUuaW5vID0gZi0+aW5vOworCXJhd19pbm9kZS5waW5vID0gbmV3X2Rpcl9mLT5pbm87CisvKiAgCXJhd19pbm9kZS52ZXJzaW9uID0gZi0+aGlnaGVzdF92ZXJzaW9uICsgMTsgKi8KKwlyYXdfaW5vZGUubW9kZSA9IGYtPm1vZGU7CisJcmF3X2lub2RlLnVpZCA9IGN1cnJlbnQtPmZzdWlkOworCXJhd19pbm9kZS5naWQgPSBjdXJyZW50LT5mc2dpZDsKKyNpZiAwCisJcmF3X2lub2RlLnVpZCA9IGYtPnVpZDsKKwlyYXdfaW5vZGUuZ2lkID0gZi0+Z2lkOworI2VuZGlmCisJcmF3X2lub2RlLmF0aW1lID0gZ2V0X3NlY29uZHMoKTsKKwlyYXdfaW5vZGUubXRpbWUgPSByYXdfaW5vZGUuYXRpbWU7CisJcmF3X2lub2RlLmN0aW1lID0gZi0+Y3RpbWU7CisJcmF3X2lub2RlLm9mZnNldCA9IDA7CisJcmF3X2lub2RlLmRzaXplID0gMDsKKwlyYXdfaW5vZGUucnNpemUgPSAwOworCXJhd19pbm9kZS5uc2l6ZSA9IG5ld19kZW50cnktPmRfbmFtZS5sZW47CisJcmF3X2lub2RlLm5saW5rID0gZi0+bmxpbms7CisJcmF3X2lub2RlLnNwYXJlID0gMDsKKwlyYXdfaW5vZGUucmVuYW1lID0gMDsKKwlyYXdfaW5vZGUuZGVsZXRlZCA9IDA7CisKKwkvKiBTZWUgaWYgdGhlcmUgYWxyZWFkeSBleGlzdHMgYSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSBhcworCSAgIG5ld19uYW1lLiAgKi8KKwlpZiAoKGRlbF9mID0gamZmc19maW5kX2NoaWxkKG5ld19kaXJfZiwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJICAgICBuZXdfZGVudHJ5LT5kX25hbWUubGVuKSkpIHsKKwkJcmF3X2lub2RlLnJlbmFtZSA9IDE7CisJCXJhd19pbm9kZS5kc2l6ZSA9IHNpemVvZihfX3UzMik7CisJCXJlbmFtZV9kYXRhID0gZGVsX2YtPmlubzsKKwl9CisKKwkvKiBXcml0ZSB0aGUgbmV3IG5vZGUgdG8gdGhlIGZsYXNoIG1lbW9yeS4gICovCisJaWYgKChyZXN1bHQgPSBqZmZzX3dyaXRlX25vZGUoYywgbm9kZSwgJnJhd19pbm9kZSwKKwkJCQkgICAgICBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkgICAgICAodW5zaWduZWQgY2hhciopJnJlbmFtZV9kYXRhLCAwLCBmKSkgPCAwKSB7CisJCUQocHJpbnRrKCJqZmZzX3JlbmFtZSgpOiBGYWlsZWQgdG8gd3JpdGUgbm9kZSB0byBmbGFzaC5cbiIpKTsKKwkJamZmc19mcmVlX25vZGUobm9kZSk7CisJCWdvdG8gamZmc19yZW5hbWVfZW5kOworCX0KKwlyYXdfaW5vZGUuZHNpemUgPSAwOworCisJaWYgKHJhd19pbm9kZS5yZW5hbWUpIHsKKwkJLyogVGhlIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIG11c3QgYmUgZGVsZXRlZC4gICovCisJCS8vRklYTUUgZGVhZGxvY2sJICAgICAgICBkb3duKCZjLT5mbWMtPmdjbG9jayk7CisJCWlmICgocmVzdWx0ID0gamZmc19yZW1vdmUobmV3X2RpciwgbmV3X2RlbnRyeSwKKwkJCQkJICBkZWxfZi0+bW9kZSkpIDwgMCkgeworCQkJLyogVGhpcyBpcyByZWFsbHkgYmFkLiAgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiSkZGUzogQW4gZXJyb3Igb2NjdXJyZWQgaW4gIgorCQkJICAgICAgICJyZW5hbWUoKS5cbiIpOworCQl9CisJCS8vCQl1cCgmYy0+Zm1jLT5nY2xvY2spOworCX0KKworCWlmIChvbGRfZGlyX2YgIT0gbmV3X2Rpcl9mKSB7CisJCS8qIFJlbW92ZSB0aGUgZmlsZSBmcm9tIGl0cyBvbGQgcG9zaXRpb24gaW4gdGhlCisJCSAgIGZpbGVzeXN0ZW0gdHJlZS4gICovCisJCWpmZnNfdW5saW5rX2ZpbGVfZnJvbV90cmVlKGYpOworCX0KKworCS8qIEluc2VydCB0aGUgbmV3IG5vZGUgaW50byB0aGUgZmlsZSBzeXN0ZW0uICAqLworCWlmICgocmVzdWx0ID0gamZmc19pbnNlcnRfbm9kZShjLCBmLCAmcmF3X2lub2RlLAorCQkJCSAgICAgICBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSwgbm9kZSkpIDwgMCkgeworCQlEKHByaW50ayhLRVJOX0VSUiAiamZmc19yZW5hbWUoKTogamZmc19pbnNlcnRfbm9kZSgpICIKKwkJCSAiZmFpbGVkIVxuIikpOworCX0KKworCWlmIChvbGRfZGlyX2YgIT0gbmV3X2Rpcl9mKSB7CisJCS8qIEluc2VydCB0aGUgZmlsZSB0byBpdHMgbmV3IHBvc2l0aW9uIGluIHRoZQorCQkgICBmaWxlIHN5c3RlbS4gICovCisJCWpmZnNfaW5zZXJ0X2ZpbGVfaW50b190cmVlKGYpOworCX0KKworCS8qIFRoaXMgaXMgYSBraW5kIG9mIHVwZGF0ZSBvZiB0aGUgaW5vZGUgd2UncmUgYWJvdXQgdG8gbWFrZQorCSAgIGhlcmUuICBUaGlzIGlzIHdoYXQgdGhleSBkbyBpbiBleHQyZnMuICBLaW5kIG9mLiAgKi8KKwlpZiAoKGlub2RlID0gaWdldChuZXdfZGlyLT5pX3NiLCBmLT5pbm8pKSkgeworCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwl9CisKK2pmZnNfcmVuYW1lX2VuZDoKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJyZW5hbWUoKTogdXAgYmlnbG9ja1xuIikpOworCXVwKCZjLT5mbWMtPmJpZ2xvY2spOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmVzdWx0OworfSAvKiBqZmZzX3JlbmFtZSgpICAqLworCisKKy8qIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgZGlyZWN0b3J5LiAgVXNlZCBieSBwcm9ncmFtcyBsaWtlIGBscycKKyAgIGZvciBpbnN0YW5jZS4gICovCitzdGF0aWMgaW50CitqZmZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGpmZnNfZmlsZSAqZjsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBqZmZzX2NvbnRyb2wgKmMgPSAoc3RydWN0IGpmZnNfY29udHJvbCAqKWlub2RlLT5pX3NiLT5zX2ZzX2luZm87CisJaW50IGo7CisJaW50IGRkaW5vOworCWxvY2tfa2VybmVsKCk7CisJRDMocHJpbnRrIChLRVJOX05PVElDRSAicmVhZGRpcigpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwlkb3duKCZjLT5mbWMtPmJpZ2xvY2spOworCisJRDIocHJpbnRrKCJqZmZzX3JlYWRkaXIoKTogaW5vZGU6IDB4JXAsIGZpbHA6IDB4JXBcbiIsIGlub2RlLCBmaWxwKSk7CisJaWYgKGZpbHAtPmZfcG9zID09IDApIHsKKwkJRDMocHJpbnRrKCJqZmZzX3JlYWRkaXIoKTogXCIuXCIgJWx1XG4iLCBpbm9kZS0+aV9pbm8pKTsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIGZpbHAtPmZfcG9zLCBpbm9kZS0+aV9pbm8sIERUX0RJUikgPCAwKSB7CisJCQlEMyhwcmludGsgKEtFUk5fTk9USUNFICJyZWFkZGlyKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwkJCXVwKCZjLT5mbWMtPmJpZ2xvY2spOworCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZmlscC0+Zl9wb3MgPSAxOworCX0KKwlpZiAoZmlscC0+Zl9wb3MgPT0gMSkgeworCQlpZiAoaW5vZGUtPmlfaW5vID09IEpGRlNfTUlOX0lOTykgeworCQkJZGRpbm8gPSBKRkZTX01JTl9JTk87CisJCX0KKwkJZWxzZSB7CisJCQlkZGlubyA9ICgoc3RydWN0IGpmZnNfZmlsZSAqKQorCQkJCSBpbm9kZS0+dS5nZW5lcmljX2lwKS0+cGlubzsKKwkJfQorCQlEMyhwcmludGsoImpmZnNfcmVhZGRpcigpOiBcIi4uXCIgJXVcbiIsIGRkaW5vKSk7CisJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgZmlscC0+Zl9wb3MsIGRkaW5vLCBEVF9ESVIpIDwgMCkgeworCQkJRDMocHJpbnRrIChLRVJOX05PVElDRSAicmVhZGRpcigpOiB1cCBiaWdsb2NrXG4iKSk7CisJCQl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJCXJldHVybiAwOworCQl9CisJCWZpbHAtPmZfcG9zKys7CisJfQorCWYgPSAoKHN0cnVjdCBqZmZzX2ZpbGUgKilpbm9kZS0+dS5nZW5lcmljX2lwKS0+Y2hpbGRyZW47CisKKwlqID0gMjsKKwl3aGlsZShmICYmIChmLT5kZWxldGVkIHx8IGorKyA8IGZpbHAtPmZfcG9zICkpIHsKKwkJZiA9IGYtPnNpYmxpbmdfbmV4dDsKKwl9CisKKwl3aGlsZSAoZikgeworCQlEMyhwcmludGsoImpmZnNfcmVhZGRpcigpOiBcIiVzXCIgaW5vOiAldVxuIiwKKwkJCSAgKGYtPm5hbWUgPyBmLT5uYW1lIDogIiIpLCBmLT5pbm8pKTsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCBmLT5uYW1lLCBmLT5uc2l6ZSwKKwkJCSAgICBmaWxwLT5mX3BvcyAsIGYtPmlubywgRFRfVU5LTk9XTikgPCAwKSB7CisJCSAgICAgICAgRDMocHJpbnRrIChLRVJOX05PVElDRSAicmVhZGRpcigpOiB1cCBiaWdsb2NrXG4iKSk7CisJCQl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJCXJldHVybiAwOworCQl9CisJCWZpbHAtPmZfcG9zKys7CisJCWRvIHsKKwkJCWYgPSBmLT5zaWJsaW5nX25leHQ7CisJCX0gd2hpbGUoZiAmJiBmLT5kZWxldGVkKTsKKwl9CisJRDMocHJpbnRrIChLRVJOX05PVElDRSAicmVhZGRpcigpOiB1cCBiaWdsb2NrXG4iKSk7CisJdXAoJmMtPmZtYy0+YmlnbG9jayk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBmaWxwLT5mX3BvczsKK30gLyogamZmc19yZWFkZGlyKCkgICovCisKKworLyogRmluZCBhIGZpbGUgaW4gYSBkaXJlY3RvcnkuIElmIHRoZSBmaWxlIGV4aXN0cywgcmV0dXJuIGl0cworICAgY29ycmVzcG9uZGluZyBkZW50cnkuICAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKgoramZmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGpmZnNfZmlsZSAqZDsKKwlzdHJ1Y3QgamZmc19maWxlICpmOworCXN0cnVjdCBqZmZzX2NvbnRyb2wgKmMgPSAoc3RydWN0IGpmZnNfY29udHJvbCAqKWRpci0+aV9zYi0+c19mc19pbmZvOworCWludCBsZW47CisJaW50IHIgPSAwOworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisKKwlsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisKKwlsb2NrX2tlcm5lbCgpOworCisJRDMoeworCQljaGFyICpzID0gKGNoYXIgKilrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOworCQltZW1jcHkocywgbmFtZSwgbGVuKTsKKwkJc1tsZW5dID0gJ1wwJzsKKwkJcHJpbnRrKCJqZmZzX2xvb2t1cCgpOiBkaXI6IDB4JXAsIG5hbWU6IFwiJXNcIlxuIiwgZGlyLCBzKTsKKwkJa2ZyZWUocyk7CisJfSk7CisKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJsb29rdXAoKTogZG93biBiaWdsb2NrXG4iKSk7CisJZG93bigmYy0+Zm1jLT5iaWdsb2NrKTsKKworCXIgPSAtRU5BTUVUT09MT05HOworCWlmIChsZW4gPiBKRkZTX01BWF9OQU1FX0xFTikgeworCQlnb3RvIGpmZnNfbG9va3VwX2VuZDsKKwl9CisKKwlyID0gLUVBQ0NFUzsKKwlpZiAoIShkID0gKHN0cnVjdCBqZmZzX2ZpbGUgKilkaXItPnUuZ2VuZXJpY19pcCkpIHsKKwkJRChwcmludGsoImpmZnNfbG9va3VwKCk6IE5vIHN1Y2ggaW5vZGUhICglbHUpXG4iLAorCQkJIGRpci0+aV9pbm8pKTsKKwkJZ290byBqZmZzX2xvb2t1cF9lbmQ7CisJfQorCisJLyogR2V0IHRoZSBjb3JyZXNwb25kaW5nIGlub2RlIHRvIHRoZSBmaWxlLiAgKi8KKworCS8qIGlnZXQgY2FsbHMgamZmc19yZWFkX2lub2RlLCBzbyB3ZSBuZWVkIHRvIGRyb3AgdGhlIGJpZ2xvY2sKKyAgICAgICAgICAgYmVmb3JlIGNhbGxpbmcgaWdldC4gIFVuZm9ydHVuYXRlbHksIHRoZSBHQyBoYXMgYSB0ZW5kZW5jeQorICAgICAgICAgICB0byBzbmVhayBpbiBoZXJlLCBiZWNhdXNlIGlnZXQgc29tZXRpbWVzIGNhbGxzIHNjaGVkdWxlICgpLgorCSovCisKKwlpZiAoKGxlbiA9PSAxKSAmJiAobmFtZVswXSA9PSAnLicpKSB7CisJCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgImxvb2t1cCgpOiB1cCBiaWdsb2NrXG4iKSk7CisJCXVwKCZjLT5mbWMtPmJpZ2xvY2spOworCQlpZiAoIShpbm9kZSA9IGlnZXQoZGlyLT5pX3NiLCBkLT5pbm8pKSkgeworCQkJRChwcmludGsoImpmZnNfbG9va3VwKCk6IC4gaWdldCgpID09PiBOVUxMXG4iKSk7CisJCQlnb3RvIGpmZnNfbG9va3VwX2VuZF9ub19iaWdsb2NrOworCQl9CisJCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgImxvb2t1cCgpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwkJZG93bigmYy0+Zm1jLT5iaWdsb2NrKTsKKwl9IGVsc2UgaWYgKChsZW4gPT0gMikgJiYgKG5hbWVbMF0gPT0gJy4nKSAmJiAobmFtZVsxXSA9PSAnLicpKSB7CisJICAgICAgICBEMyhwcmludGsgKEtFUk5fTk9USUNFICJsb29rdXAoKTogdXAgYmlnbG9ja1xuIikpOworCQl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKyAJCWlmICghKGlub2RlID0gaWdldChkaXItPmlfc2IsIGQtPnBpbm8pKSkgeworCQkJRChwcmludGsoImpmZnNfbG9va3VwKCk6IC4uIGlnZXQoKSA9PT4gTlVMTFxuIikpOworCQkJZ290byBqZmZzX2xvb2t1cF9lbmRfbm9fYmlnbG9jazsKKwkJfQorCQlEMyhwcmludGsgKEtFUk5fTk9USUNFICJsb29rdXAoKTogZG93biBiaWdsb2NrXG4iKSk7CisJCWRvd24oJmMtPmZtYy0+YmlnbG9jayk7CisJfSBlbHNlIGlmICgoZiA9IGpmZnNfZmluZF9jaGlsZChkLCBuYW1lLCBsZW4pKSkgeworCSAgICAgICAgRDMocHJpbnRrIChLRVJOX05PVElDRSAibG9va3VwKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwkJdXAoJmMtPmZtYy0+YmlnbG9jayk7CisJCWlmICghKGlub2RlID0gaWdldChkaXItPmlfc2IsIGYtPmlubykpKSB7CisJCQlEKHByaW50aygiamZmc19sb29rdXAoKTogaWdldCgpID09PiBOVUxMXG4iKSk7CisJCQlnb3RvIGpmZnNfbG9va3VwX2VuZF9ub19iaWdsb2NrOworCQl9CisJCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgImxvb2t1cCgpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwkJZG93bigmYy0+Zm1jLT5iaWdsb2NrKTsKKwl9IGVsc2UgeworCQlEMyhwcmludGsoImpmZnNfbG9va3VwKCk6IENvdWxkbid0IGZpbmQgdGhlIGZpbGUuICIKKwkJCSAgImYgPSAweCVwLCBuYW1lID0gXCIlc1wiLCBkID0gMHglcCwgZC0+aW5vID0gJXVcbiIsCisJCQkgIGYsIG5hbWUsIGQsIGQtPmlubykpOworCQlpbm9kZSA9IE5VTEw7CisJfQorCisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJRDMocHJpbnRrIChLRVJOX05PVElDRSAibG9va3VwKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIE5VTEw7CisKK2pmZnNfbG9va3VwX2VuZDoKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJsb29rdXAoKTogdXAgYmlnbG9ja1xuIikpOworCXVwKCZjLT5mbWMtPmJpZ2xvY2spOworCitqZmZzX2xvb2t1cF9lbmRfbm9fYmlnbG9jazoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIEVSUl9QVFIocik7Cit9IC8qIGpmZnNfbG9va3VwKCkgICovCisKKworLyogVHJ5IHRvIHJlYWQgYSBwYWdlIG9mIGRhdGEgZnJvbSBhIGZpbGUuICAqLworc3RhdGljIGludAoramZmc19kb19yZWFkcGFnZV9ub2xvY2soc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXZvaWQgKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIHJlYWRfbGVuOworCWludCByZXN1bHQ7CisJc3RydWN0IGlub2RlICppbm9kZSA9IChzdHJ1Y3QgaW5vZGUqKXBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGpmZnNfZmlsZSAqZiA9IChzdHJ1Y3QgamZmc19maWxlICopaW5vZGUtPnUuZ2VuZXJpY19pcDsKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjID0gKHN0cnVjdCBqZmZzX2NvbnRyb2wgKilpbm9kZS0+aV9zYi0+c19mc19pbmZvOworCWludCByOworCWxvZmZfdCBvZmZzZXQ7CisKKwlEMihwcmludGsoIioqKmpmZnNfcmVhZHBhZ2UoKTogZmlsZSA9IFwiJXNcIiwgcGFnZS0+aW5kZXggPSAlbHVcbiIsCisJCSAgKGYtPm5hbWUgPyBmLT5uYW1lIDogIiIpLCAobG9uZylwYWdlLT5pbmRleCkpOworCisJZ2V0X3BhZ2UocGFnZSk7CisJLyogRG9uJ3QgU2V0UGFnZUxvY2tlZChwYWdlKSwgc2hvdWxkIGJlIGxvY2tlZCBhbHJlYWR5ICovCisJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CisJQ2xlYXJQYWdlRXJyb3IocGFnZSk7CisKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJyZWFkcGFnZSgpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwlkb3duKCZjLT5mbWMtPmJpZ2xvY2spOworCisJcmVhZF9sZW4gPSAwOworCXJlc3VsdCA9IDA7CisJb2Zmc2V0ID0gcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKworCWttYXAocGFnZSk7CisJYnVmID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCWlmIChvZmZzZXQgPCBpbm9kZS0+aV9zaXplKSB7CisJCXJlYWRfbGVuID0gbWluX3QobG9uZywgaW5vZGUtPmlfc2l6ZSAtIG9mZnNldCwgUEFHRV9TSVpFKTsKKwkJciA9IGpmZnNfcmVhZF9kYXRhKGYsIGJ1Ziwgb2Zmc2V0LCByZWFkX2xlbik7CisJCWlmIChyICE9IHJlYWRfbGVuKSB7CisJCQlyZXN1bHQgPSAtRUlPOworCQkJRCgKKwkJCSAgICAgICAgcHJpbnRrKCIqKipqZmZzX3JlYWRwYWdlKCk6IFJlYWQgZXJyb3IhICIKKwkJCQkgICAgICAgIldhbnRlZCB0byByZWFkICVsdSBieXRlcyBidXQgb25seSAiCisJCQkJICAgICAgICJyZWFkICVkIGJ5dGVzLlxuIiwgcmVhZF9sZW4sIHIpOworCQkJICApOworCQl9CisKKwl9CisKKwkvKiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugb2YgcGFydGlhbCBvciBubyByZWFkIGluIGFib3ZlICovCisJaWYocmVhZF9sZW4gPCBQQUdFX1NJWkUpCisJICAgICAgICBtZW1zZXQoYnVmICsgcmVhZF9sZW4sIDAsIFBBR0VfU0laRSAtIHJlYWRfbGVuKTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlrdW5tYXAocGFnZSk7CisKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJyZWFkcGFnZSgpOiB1cCBiaWdsb2NrXG4iKSk7CisJdXAoJmMtPmZtYy0+YmlnbG9jayk7CisKKwlpZiAocmVzdWx0KSB7CisJICAgICAgICBTZXRQYWdlRXJyb3IocGFnZSk7CisJfWVsc2UgeworCSAgICAgICAgU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwkgICAgICAgIAorCX0KKworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKworCUQzKHByaW50aygiamZmc19yZWFkcGFnZSgpOiBMZWF2aW5nLi4uXG4iKSk7CisKKwlyZXR1cm4gcmVzdWx0OworfSAvKiBqZmZzX2RvX3JlYWRwYWdlX25vbG9jaygpICAqLworCitzdGF0aWMgaW50IGpmZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCWludCByZXQgPSBqZmZzX2RvX3JlYWRwYWdlX25vbG9jayhmaWxlLCBwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBDcmVhdGUgYSBuZXcgZGlyZWN0b3J5LiAgKi8KK3N0YXRpYyBpbnQKK2pmZnNfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJc3RydWN0IGpmZnNfcmF3X2lub2RlIHJhd19pbm9kZTsKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjOworCXN0cnVjdCBqZmZzX25vZGUgKm5vZGU7CisJc3RydWN0IGpmZnNfZmlsZSAqZGlyX2Y7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgZGlyX21vZGU7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IGVycjsKKworCUQxKHsKKwkgICAgICAgIGludCBsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJCWNoYXIgKl9uYW1lID0gKGNoYXIgKikga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJbWVtY3B5KF9uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLCBsZW4pOworCQlfbmFtZVtsZW5dID0gJ1wwJzsKKwkJcHJpbnRrKCIqKipqZmZzX21rZGlyKCk6IGRpciA9IDB4JXAsIG5hbWUgPSBcIiVzXCIsICIKKwkJICAgICAgICJsZW4gPSAlZCwgbW9kZSA9IDB4JTA4eFxuIiwgZGlyLCBfbmFtZSwgbGVuLCBtb2RlKTsKKwkJa2ZyZWUoX25hbWUpOworCX0pOworCisJbG9ja19rZXJuZWwoKTsKKwlkaXJfZiA9IChzdHJ1Y3QgamZmc19maWxlICopZGlyLT51LmdlbmVyaWNfaXA7CisKKwlBU1NFUlQoaWYgKCFkaXJfZikgeworCQlwcmludGsoS0VSTl9FUlIgImpmZnNfbWtkaXIoKTogTm8gcmVmZXJlbmNlIHRvIGEgIgorCQkgICAgICAgImpmZnNfZmlsZSBzdHJ1Y3QgaW4gaW5vZGUuXG4iKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTzsKKwl9KTsKKworCWMgPSBkaXJfZi0+YzsKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJta2RpcigpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwlkb3duKCZjLT5mbWMtPmJpZ2xvY2spOworCisJZGlyX21vZGUgPSBTX0lGRElSIHwgKG1vZGUgJiAoU19JUldYVUdPfFNfSVNWVFgpCisJCQkgICAgICAmIH5jdXJyZW50LT5mcy0+dW1hc2spOworCWlmIChkaXItPmlfbW9kZSAmIFNfSVNHSUQpIHsKKwkJZGlyX21vZGUgfD0gU19JU0dJRDsKKwl9CisKKwkvKiBDcmVhdGUgYSBub2RlIGFuZCBpbml0aWFsaXplIGl0IGFzIG11Y2ggYXMgbmVlZGVkLiAgKi8KKwlpZiAoIShub2RlID0gamZmc19hbGxvY19ub2RlKCkpKSB7CisJCUQocHJpbnRrKCJqZmZzX21rZGlyKCk6IEFsbG9jYXRpb24gZmFpbGVkOiBub2RlID09IDBcbiIpKTsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBqZmZzX21rZGlyX2VuZDsKKwl9CisJbm9kZS0+ZGF0YV9vZmZzZXQgPSAwOworCW5vZGUtPnJlbW92ZWRfc2l6ZSA9IDA7CisKKwkvKiBJbml0aWFsaXplIHRoZSByYXcgaW5vZGUuICAqLworCXJhd19pbm9kZS5tYWdpYyA9IEpGRlNfTUFHSUNfQklUTUFTSzsKKwlyYXdfaW5vZGUuaW5vID0gYy0+bmV4dF9pbm8rKzsKKwlyYXdfaW5vZGUucGlubyA9IGRpcl9mLT5pbm87CisJcmF3X2lub2RlLnZlcnNpb24gPSAxOworCXJhd19pbm9kZS5tb2RlID0gZGlyX21vZGU7CisJcmF3X2lub2RlLnVpZCA9IGN1cnJlbnQtPmZzdWlkOworCXJhd19pbm9kZS5naWQgPSAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKSA/IGRpci0+aV9naWQgOiBjdXJyZW50LT5mc2dpZDsKKwkvKglyYXdfaW5vZGUuZ2lkID0gY3VycmVudC0+ZnNnaWQ7ICovCisJcmF3X2lub2RlLmF0aW1lID0gZ2V0X3NlY29uZHMoKTsKKwlyYXdfaW5vZGUubXRpbWUgPSByYXdfaW5vZGUuYXRpbWU7CisJcmF3X2lub2RlLmN0aW1lID0gcmF3X2lub2RlLmF0aW1lOworCXJhd19pbm9kZS5vZmZzZXQgPSAwOworCXJhd19pbm9kZS5kc2l6ZSA9IDA7CisJcmF3X2lub2RlLnJzaXplID0gMDsKKwlyYXdfaW5vZGUubnNpemUgPSBkZW50cnktPmRfbmFtZS5sZW47CisJcmF3X2lub2RlLm5saW5rID0gMTsKKwlyYXdfaW5vZGUuc3BhcmUgPSAwOworCXJhd19pbm9kZS5yZW5hbWUgPSAwOworCXJhd19pbm9kZS5kZWxldGVkID0gMDsKKworCS8qIFdyaXRlIHRoZSBuZXcgbm9kZSB0byB0aGUgZmxhc2guICAqLworCWlmICgocmVzdWx0ID0gamZmc193cml0ZV9ub2RlKGMsIG5vZGUsICZyYXdfaW5vZGUsCisJCQkJICAgICBkZW50cnktPmRfbmFtZS5uYW1lLCBOVUxMLCAwLCBOVUxMKSkgPCAwKSB7CisJCUQocHJpbnRrKCJqZmZzX21rZGlyKCk6IGpmZnNfd3JpdGVfbm9kZSgpIGZhaWxlZC5cbiIpKTsKKwkJamZmc19mcmVlX25vZGUobm9kZSk7CisJCWdvdG8gamZmc19ta2Rpcl9lbmQ7CisJfQorCisJLyogSW5zZXJ0IHRoZSBuZXcgbm9kZSBpbnRvIHRoZSBmaWxlIHN5c3RlbS4gICovCisJaWYgKChyZXN1bHQgPSBqZmZzX2luc2VydF9ub2RlKGMsIE5VTEwsICZyYXdfaW5vZGUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJICAgICAgIG5vZGUpKSA8IDApIHsKKwkJZ290byBqZmZzX21rZGlyX2VuZDsKKwl9CisKKwlpbm9kZSA9IGpmZnNfbmV3X2lub2RlKGRpciwgJnJhd19pbm9kZSwgJmVycik7CisJaWYgKGlub2RlID09IE5VTEwpIHsKKwkJcmVzdWx0ID0gZXJyOworCQlnb3RvIGpmZnNfbWtkaXJfZW5kOworCX0KKworCWlub2RlLT5pX29wID0gJmpmZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJmpmZnNfZGlyX29wZXJhdGlvbnM7CisKKwltYXJrX2lub2RlX2RpcnR5KGRpcik7CisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKworCXJlc3VsdCA9IDA7CitqZmZzX21rZGlyX2VuZDoKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJta2RpcigpOiB1cCBiaWdsb2NrXG4iKSk7CisJdXAoJmMtPmZtYy0+YmlnbG9jayk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXN1bHQ7Cit9IC8qIGpmZnNfbWtkaXIoKSAgKi8KKworCisvKiBSZW1vdmUgYSBkaXJlY3RvcnkuICAqLworc3RhdGljIGludAoramZmc19ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBqZmZzX2NvbnRyb2wgKmMgPSAoc3RydWN0IGpmZnNfY29udHJvbCAqKWRpci0+aV9zYi0+c19mc19pbmZvOworCWludCByZXQ7CisJRDMocHJpbnRrKCIqKipqZmZzX3JtZGlyKClcbiIpKTsKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJybWRpcigpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwlsb2NrX2tlcm5lbCgpOworCWRvd24oJmMtPmZtYy0+YmlnbG9jayk7CisJcmV0ID0gamZmc19yZW1vdmUoZGlyLCBkZW50cnksIFNfSUZESVIpOworCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgInJtZGlyKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworCisvKiBSZW1vdmUgYW55IGtpbmQgb2YgZmlsZSBleGNlcHQgZm9yIGRpcmVjdG9yaWVzLiAgKi8KK3N0YXRpYyBpbnQKK2pmZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGpmZnNfY29udHJvbCAqYyA9IChzdHJ1Y3QgamZmc19jb250cm9sICopZGlyLT5pX3NiLT5zX2ZzX2luZm87CisJaW50IHJldDsgCisKKwlsb2NrX2tlcm5lbCgpOworCUQzKHByaW50aygiKioqamZmc191bmxpbmsoKVxuIikpOworCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgInVubGluaygpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwlkb3duKCZjLT5mbWMtPmJpZ2xvY2spOworCXJldCA9IGpmZnNfcmVtb3ZlKGRpciwgZGVudHJ5LCAwKTsKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJ1bmxpbmsoKTogdXAgYmlnbG9ja1xuIikpOworCXVwKCZjLT5mbWMtPmJpZ2xvY2spOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qIFJlbW92ZSBhIEpGRlMgZW50cnksIGkuZS4gcGxhaW4gZmlsZXMsIGRpcmVjdG9yaWVzLCBldGMuICBIZXJlIHdlCisgICBzaG91bGRuJ3QgdGVzdCBmb3IgZnJlZSBzcGFjZSBvbiB0aGUgZGV2aWNlLiAgKi8KK3N0YXRpYyBpbnQKK2pmZnNfcmVtb3ZlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCB0eXBlKQoreworCXN0cnVjdCBqZmZzX3Jhd19pbm9kZSByYXdfaW5vZGU7CisJc3RydWN0IGpmZnNfY29udHJvbCAqYzsKKwlzdHJ1Y3QgamZmc19maWxlICpkaXJfZjsgLyogVGhlIGZpbGUtdG8tcmVtb3ZlJ3MgcGFyZW50LiAgKi8KKwlzdHJ1Y3QgamZmc19maWxlICpkZWxfZjsgLyogVGhlIGZpbGUgdG8gcmVtb3ZlLiAgKi8KKwlzdHJ1Y3QgamZmc19ub2RlICpkZWxfbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCUQxKHsKKwkJaW50IGxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwkJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJCWNoYXIgKl9uYW1lID0gKGNoYXIgKikga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJbWVtY3B5KF9uYW1lLCBuYW1lLCBsZW4pOworCQlfbmFtZVtsZW5dID0gJ1wwJzsKKwkJcHJpbnRrKCIqKipqZmZzX3JlbW92ZSgpOiBmaWxlID0gXCIlc1wiLCBpbm8gPSAlbGRcbiIsIF9uYW1lLCBkZW50cnktPmRfaW5vZGUtPmlfaW5vKTsKKwkJa2ZyZWUoX25hbWUpOworCX0pOworCisJZGlyX2YgPSAoc3RydWN0IGpmZnNfZmlsZSAqKSBkaXItPnUuZ2VuZXJpY19pcDsKKwljID0gZGlyX2YtPmM7CisKKwlyZXN1bHQgPSAtRU5PRU5UOworCWlmICghKGRlbF9mID0gamZmc19maW5kX2NoaWxkKGRpcl9mLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCSAgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbikpKSB7CisJCUQocHJpbnRrKCJqZmZzX3JlbW92ZSgpOiBqZmZzX2ZpbmRfY2hpbGQoKSBmYWlsZWQuXG4iKSk7CisJCWdvdG8gamZmc19yZW1vdmVfZW5kOworCX0KKworCWlmIChTX0lTRElSKHR5cGUpKSB7CisJCXN0cnVjdCBqZmZzX2ZpbGUgKmNoaWxkID0gZGVsX2YtPmNoaWxkcmVuOworCQl3aGlsZShjaGlsZCkgeworCQkJaWYoICFjaGlsZC0+ZGVsZXRlZCApIHsKKwkJCQlyZXN1bHQgPSAtRU5PVEVNUFRZOworCQkJCWdvdG8gamZmc19yZW1vdmVfZW5kOworCQkJfQorCQkJY2hpbGQgPSBjaGlsZC0+c2libGluZ19uZXh0OworCQl9CisJfSAgICAgICAgICAgIAorCWVsc2UgaWYgKFNfSVNESVIoZGVsX2YtPm1vZGUpKSB7CisJCUQocHJpbnRrKCJqZmZzX3JlbW92ZSgpOiBub2RlIGlzIGEgZGlyZWN0b3J5ICIKKwkJCSAiYnV0IGl0IHNob3VsZG4ndCBiZS5cbiIpKTsKKwkJcmVzdWx0ID0gLUVQRVJNOworCQlnb3RvIGpmZnNfcmVtb3ZlX2VuZDsKKwl9CisKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCXJlc3VsdCA9IC1FSU87CisJaWYgKGRlbF9mLT5pbm8gIT0gaW5vZGUtPmlfaW5vKQorCQlnb3RvIGpmZnNfcmVtb3ZlX2VuZDsKKworCWlmICghaW5vZGUtPmlfbmxpbmspIHsKKwkJcHJpbnRrKCJEZWxldGluZyBub25leGlzdGVudCBmaWxlIGlub2RlOiAlbHUsIG5saW5rOiAlZFxuIiwKKwkJICAgICAgIGlub2RlLT5pX2lubywgaW5vZGUtPmlfbmxpbmspOworCQlpbm9kZS0+aV9ubGluaz0xOworCX0KKworCS8qIENyZWF0ZSBhIG5vZGUgZm9yIHRoZSBkZWxldGlvbi4gICovCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpZiAoIShkZWxfbm9kZSA9IGpmZnNfYWxsb2Nfbm9kZSgpKSkgeworCQlEKHByaW50aygiamZmc19yZW1vdmUoKTogQWxsb2NhdGlvbiBmYWlsZWQhXG4iKSk7CisJCWdvdG8gamZmc19yZW1vdmVfZW5kOworCX0KKwlkZWxfbm9kZS0+ZGF0YV9vZmZzZXQgPSAwOworCWRlbF9ub2RlLT5yZW1vdmVkX3NpemUgPSAwOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcmF3IGlub2RlLiAgKi8KKwlyYXdfaW5vZGUubWFnaWMgPSBKRkZTX01BR0lDX0JJVE1BU0s7CisJcmF3X2lub2RlLmlubyA9IGRlbF9mLT5pbm87CisJcmF3X2lub2RlLnBpbm8gPSBkZWxfZi0+cGlubzsKKy8qICAJcmF3X2lub2RlLnZlcnNpb24gPSBkZWxfZi0+aGlnaGVzdF92ZXJzaW9uICsgMTsgKi8KKwlyYXdfaW5vZGUubW9kZSA9IGRlbF9mLT5tb2RlOworCXJhd19pbm9kZS51aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlyYXdfaW5vZGUuZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJcmF3X2lub2RlLmF0aW1lID0gZ2V0X3NlY29uZHMoKTsKKwlyYXdfaW5vZGUubXRpbWUgPSBkZWxfZi0+bXRpbWU7CisJcmF3X2lub2RlLmN0aW1lID0gcmF3X2lub2RlLmF0aW1lOworCXJhd19pbm9kZS5vZmZzZXQgPSAwOworCXJhd19pbm9kZS5kc2l6ZSA9IDA7CisJcmF3X2lub2RlLnJzaXplID0gMDsKKwlyYXdfaW5vZGUubnNpemUgPSAwOworCXJhd19pbm9kZS5ubGluayA9IGRlbF9mLT5ubGluazsKKwlyYXdfaW5vZGUuc3BhcmUgPSAwOworCXJhd19pbm9kZS5yZW5hbWUgPSAwOworCXJhd19pbm9kZS5kZWxldGVkID0gMTsKKworCS8qIFdyaXRlIHRoZSBuZXcgbm9kZSB0byB0aGUgZmxhc2ggbWVtb3J5LiAgKi8KKwlpZiAoamZmc193cml0ZV9ub2RlKGMsIGRlbF9ub2RlLCAmcmF3X2lub2RlLCBOVUxMLCBOVUxMLCAxLCBkZWxfZikgPCAwKSB7CisJCWpmZnNfZnJlZV9ub2RlKGRlbF9ub2RlKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwkJZ290byBqZmZzX3JlbW92ZV9lbmQ7CisJfQorCisJLyogVXBkYXRlIHRoZSBmaWxlLiAgVGhpcyBvcGVyYXRpb24gd2lsbCBtYWtlIHRoZSBmaWxlIGRpc2FwcGVhcgorCSAgIGZyb20gdGhlIGluLW1lbW9yeSBmaWxlIHN5c3RlbSBzdHJ1Y3R1cmVzLiAgKi8KKwlqZmZzX2luc2VydF9ub2RlKGMsIGRlbF9mLCAmcmF3X2lub2RlLCBOVUxMLCBkZWxfbm9kZSk7CisKKwlkaXItPmlfY3RpbWUgPSBkaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKKwlpbm9kZS0+aV9ubGluay0tOworCWlub2RlLT5pX2N0aW1lID0gZGlyLT5pX2N0aW1lOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCisJZF9kZWxldGUoZGVudHJ5KTsJLyogVGhpcyBhbHNvIGZyZWVzIHRoZSBpbm9kZSAqLworCisJcmVzdWx0ID0gMDsKK2pmZnNfcmVtb3ZlX2VuZDoKKwlyZXR1cm4gcmVzdWx0OworfSAvKiBqZmZzX3JlbW92ZSgpICAqLworCisKK3N0YXRpYyBpbnQKK2pmZnNfbWtub2Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIGRldl90IHJkZXYpCit7CisJc3RydWN0IGpmZnNfcmF3X2lub2RlIHJhd19pbm9kZTsKKwlzdHJ1Y3QgamZmc19maWxlICpkaXJfZjsKKwlzdHJ1Y3QgamZmc19ub2RlICpub2RlID0gTlVMTDsKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHJlc3VsdCA9IDA7CisJdTE2IGRhdGEgPSBvbGRfZW5jb2RlX2RldihyZGV2KTsKKwlpbnQgZXJyOworCisJRDEocHJpbnRrKCIqKipqZmZzX21rbm9kKClcbiIpKTsKKworCWlmICghb2xkX3ZhbGlkX2RldihyZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbG9ja19rZXJuZWwoKTsKKwlkaXJfZiA9IChzdHJ1Y3QgamZmc19maWxlICopZGlyLT51LmdlbmVyaWNfaXA7CisJYyA9IGRpcl9mLT5jOworCisJRDMocHJpbnRrIChLRVJOX05PVElDRSAibWtub2QoKTogZG93biBiaWdsb2NrXG4iKSk7CisJZG93bigmYy0+Zm1jLT5iaWdsb2NrKTsKKworCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBub2RlLiAgKi8KKwlpZiAoIShub2RlID0gamZmc19hbGxvY19ub2RlKCkpKSB7CisJCUQocHJpbnRrKCJqZmZzX21rbm9kKCk6IEFsbG9jYXRpb24gZmFpbGVkIVxuIikpOworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGpmZnNfbWtub2RfZXJyOworCX0KKwlub2RlLT5kYXRhX29mZnNldCA9IDA7CisJbm9kZS0+cmVtb3ZlZF9zaXplID0gMDsKKworCS8qIEluaXRpYWxpemUgdGhlIHJhdyBpbm9kZS4gICovCisJcmF3X2lub2RlLm1hZ2ljID0gSkZGU19NQUdJQ19CSVRNQVNLOworCXJhd19pbm9kZS5pbm8gPSBjLT5uZXh0X2lubysrOworCXJhd19pbm9kZS5waW5vID0gZGlyX2YtPmlubzsKKwlyYXdfaW5vZGUudmVyc2lvbiA9IDE7CisJcmF3X2lub2RlLm1vZGUgPSBtb2RlOworCXJhd19pbm9kZS51aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlyYXdfaW5vZGUuZ2lkID0gKGRpci0+aV9tb2RlICYgU19JU0dJRCkgPyBkaXItPmlfZ2lkIDogY3VycmVudC0+ZnNnaWQ7CisJLyoJcmF3X2lub2RlLmdpZCA9IGN1cnJlbnQtPmZzZ2lkOyAqLworCXJhd19pbm9kZS5hdGltZSA9IGdldF9zZWNvbmRzKCk7CisJcmF3X2lub2RlLm10aW1lID0gcmF3X2lub2RlLmF0aW1lOworCXJhd19pbm9kZS5jdGltZSA9IHJhd19pbm9kZS5hdGltZTsKKwlyYXdfaW5vZGUub2Zmc2V0ID0gMDsKKwlyYXdfaW5vZGUuZHNpemUgPSAyOworCXJhd19pbm9kZS5yc2l6ZSA9IDA7CisJcmF3X2lub2RlLm5zaXplID0gZGVudHJ5LT5kX25hbWUubGVuOworCXJhd19pbm9kZS5ubGluayA9IDE7CisJcmF3X2lub2RlLnNwYXJlID0gMDsKKwlyYXdfaW5vZGUucmVuYW1lID0gMDsKKwlyYXdfaW5vZGUuZGVsZXRlZCA9IDA7CisKKwkvKiBXcml0ZSB0aGUgbmV3IG5vZGUgdG8gdGhlIGZsYXNoLiAgKi8KKwlpZiAoKGVyciA9IGpmZnNfd3JpdGVfbm9kZShjLCBub2RlLCAmcmF3X2lub2RlLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCSAgICh1bnNpZ25lZCBjaGFyICopJmRhdGEsIDAsIE5VTEwpKSA8IDApIHsKKwkJRChwcmludGsoImpmZnNfbWtub2QoKTogamZmc193cml0ZV9ub2RlKCkgZmFpbGVkLlxuIikpOworCQlyZXN1bHQgPSBlcnI7CisJCWdvdG8gamZmc19ta25vZF9lcnI7CisJfQorCisJLyogSW5zZXJ0IHRoZSBuZXcgbm9kZSBpbnRvIHRoZSBmaWxlIHN5c3RlbS4gICovCisJaWYgKChlcnIgPSBqZmZzX2luc2VydF9ub2RlKGMsIE5VTEwsICZyYXdfaW5vZGUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJICAgIG5vZGUpKSA8IDApIHsKKwkJcmVzdWx0ID0gZXJyOworCQlnb3RvIGpmZnNfbWtub2RfZW5kOworCX0KKworCWlub2RlID0gamZmc19uZXdfaW5vZGUoZGlyLCAmcmF3X2lub2RlLCAmZXJyKTsKKwlpZiAoaW5vZGUgPT0gTlVMTCkgeworCQlyZXN1bHQgPSBlcnI7CisJCWdvdG8gamZmc19ta25vZF9lbmQ7CisJfQorCisJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBtb2RlLCByZGV2KTsKKworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisKKwlnb3RvIGpmZnNfbWtub2RfZW5kOworCitqZmZzX21rbm9kX2VycjoKKwlpZiAobm9kZSkgeworCQlqZmZzX2ZyZWVfbm9kZShub2RlKTsKKwl9CisKK2pmZnNfbWtub2RfZW5kOgorCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgIm1rbm9kKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJlc3VsdDsKK30gLyogamZmc19ta25vZCgpICAqLworCisKK3N0YXRpYyBpbnQKK2pmZnNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpzeW1uYW1lKQoreworCXN0cnVjdCBqZmZzX3Jhd19pbm9kZSByYXdfaW5vZGU7CisJc3RydWN0IGpmZnNfY29udHJvbCAqYzsKKwlzdHJ1Y3QgamZmc19maWxlICpkaXJfZjsKKwlzdHJ1Y3QgamZmc19ub2RlICpub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlpbnQgc3ltbmFtZV9sZW4gPSBzdHJsZW4oc3ltbmFtZSk7CisJaW50IGVycjsKKworCWxvY2tfa2VybmVsKCk7CisJRDEoeworCQlpbnQgbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOyAKKwkJY2hhciAqX25hbWUgPSAoY2hhciAqKWttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCWNoYXIgKl9zeW1uYW1lID0gKGNoYXIgKilrbWFsbG9jKHN5bW5hbWVfbGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCW1lbWNweShfbmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSwgbGVuKTsKKwkJX25hbWVbbGVuXSA9ICdcMCc7CisJCW1lbWNweShfc3ltbmFtZSwgc3ltbmFtZSwgc3ltbmFtZV9sZW4pOworCQlfc3ltbmFtZVtzeW1uYW1lX2xlbl0gPSAnXDAnOworCQlwcmludGsoIioqKmpmZnNfc3ltbGluaygpOiBkaXIgPSAweCVwLCAiCisJCSAgICAgICAiZGVudHJ5LT5kbmFtZS5uYW1lID0gXCIlc1wiLCAiCisJCSAgICAgICAic3ltbmFtZSA9IFwiJXNcIlxuIiwgZGlyLCBfbmFtZSwgX3N5bW5hbWUpOworCQlrZnJlZShfbmFtZSk7CisJCWtmcmVlKF9zeW1uYW1lKTsKKwl9KTsKKworCWRpcl9mID0gKHN0cnVjdCBqZmZzX2ZpbGUgKilkaXItPnUuZ2VuZXJpY19pcDsKKwlBU1NFUlQoaWYgKCFkaXJfZikgeworCQlwcmludGsoS0VSTl9FUlIgImpmZnNfc3ltbGluaygpOiBObyByZWZlcmVuY2UgdG8gYSAiCisJCSAgICAgICAiamZmc19maWxlIHN0cnVjdCBpbiBpbm9kZS5cbiIpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlPOworCX0pOworCisJYyA9IGRpcl9mLT5jOworCisJLyogQ3JlYXRlIGEgbm9kZSBhbmQgaW5pdGlhbGl6ZSBpdCBhcyBtdWNoIGFzIG5lZWRlZC4gICovCisJaWYgKCEobm9kZSA9IGpmZnNfYWxsb2Nfbm9kZSgpKSkgeworCQlEKHByaW50aygiamZmc19zeW1saW5rKCk6IEFsbG9jYXRpb24gZmFpbGVkOiBub2RlID0gTlVMTFxuIikpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJzeW1saW5rKCk6IGRvd24gYmlnbG9ja1xuIikpOworCWRvd24oJmMtPmZtYy0+YmlnbG9jayk7CisKKwlub2RlLT5kYXRhX29mZnNldCA9IDA7CisJbm9kZS0+cmVtb3ZlZF9zaXplID0gMDsKKworCS8qIEluaXRpYWxpemUgdGhlIHJhdyBpbm9kZS4gICovCisJcmF3X2lub2RlLm1hZ2ljID0gSkZGU19NQUdJQ19CSVRNQVNLOworCXJhd19pbm9kZS5pbm8gPSBjLT5uZXh0X2lubysrOworCXJhd19pbm9kZS5waW5vID0gZGlyX2YtPmlubzsKKwlyYXdfaW5vZGUudmVyc2lvbiA9IDE7CisJcmF3X2lub2RlLm1vZGUgPSBTX0lGTE5LIHwgU19JUldYVUdPOworCXJhd19pbm9kZS51aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlyYXdfaW5vZGUuZ2lkID0gKGRpci0+aV9tb2RlICYgU19JU0dJRCkgPyBkaXItPmlfZ2lkIDogY3VycmVudC0+ZnNnaWQ7CisJcmF3X2lub2RlLmF0aW1lID0gZ2V0X3NlY29uZHMoKTsKKwlyYXdfaW5vZGUubXRpbWUgPSByYXdfaW5vZGUuYXRpbWU7CisJcmF3X2lub2RlLmN0aW1lID0gcmF3X2lub2RlLmF0aW1lOworCXJhd19pbm9kZS5vZmZzZXQgPSAwOworCXJhd19pbm9kZS5kc2l6ZSA9IHN5bW5hbWVfbGVuOworCXJhd19pbm9kZS5yc2l6ZSA9IDA7CisJcmF3X2lub2RlLm5zaXplID0gZGVudHJ5LT5kX25hbWUubGVuOworCXJhd19pbm9kZS5ubGluayA9IDE7CisJcmF3X2lub2RlLnNwYXJlID0gMDsKKwlyYXdfaW5vZGUucmVuYW1lID0gMDsKKwlyYXdfaW5vZGUuZGVsZXRlZCA9IDA7CisKKwkvKiBXcml0ZSB0aGUgbmV3IG5vZGUgdG8gdGhlIGZsYXNoLiAgKi8KKwlpZiAoKGVyciA9IGpmZnNfd3JpdGVfbm9kZShjLCBub2RlLCAmcmF3X2lub2RlLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCSAgIChjb25zdCB1bnNpZ25lZCBjaGFyICopc3ltbmFtZSwgMCwgTlVMTCkpIDwgMCkgeworCQlEKHByaW50aygiamZmc19zeW1saW5rKCk6IGpmZnNfd3JpdGVfbm9kZSgpIGZhaWxlZC5cbiIpKTsKKwkJamZmc19mcmVlX25vZGUobm9kZSk7CisJCWdvdG8gamZmc19zeW1saW5rX2VuZDsKKwl9CisKKwkvKiBJbnNlcnQgdGhlIG5ldyBub2RlIGludG8gdGhlIGZpbGUgc3lzdGVtLiAgKi8KKwlpZiAoKGVyciA9IGpmZnNfaW5zZXJ0X25vZGUoYywgTlVMTCwgJnJhd19pbm9kZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkgICAgbm9kZSkpIDwgMCkgeworCQlnb3RvIGpmZnNfc3ltbGlua19lbmQ7CisJfQorCisJaW5vZGUgPSBqZmZzX25ld19pbm9kZShkaXIsICZyYXdfaW5vZGUsICZlcnIpOworCWlmIChpbm9kZSA9PSBOVUxMKSB7CisJCWdvdG8gamZmc19zeW1saW5rX2VuZDsKKwl9CisJZXJyID0gMDsKKwlpbm9kZS0+aV9vcCA9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZqZmZzX2FkZHJlc3Nfb3BlcmF0aW9uczsKKworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisgamZmc19zeW1saW5rX2VuZDoKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJzeW1saW5rKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycjsKK30gLyogamZmc19zeW1saW5rKCkgICovCisKKworLyogQ3JlYXRlIGFuIGlub2RlIGluc2lkZSBhIEpGRlMgZGlyZWN0b3J5IChkaXIpIGFuZCByZXR1cm4gaXQuCisgKgorICogQnkgdGhlIHRpbWUgdGhpcyBpcyBjYWxsZWQsIHdlIGFscmVhZHkgaGF2ZSBjcmVhdGVkCisgKiB0aGUgZGlyZWN0b3J5IGNhY2hlIGVudHJ5IGZvciB0aGUgbmV3IGZpbGUsIGJ1dCBpdAorICogaXMgc28gZmFyIG5lZ2F0aXZlIC0gaXQgaGFzIG5vIGlub2RlLgorICoKKyAqIElmIHRoZSBjcmVhdGUgc3VjY2VlZHMsIHdlIGZpbGwgaW4gdGhlIGlub2RlIGluZm9ybWF0aW9uCisgKiB3aXRoIGRfaW5zdGFudGlhdGUoKS4KKyAqLworc3RhdGljIGludAoramZmc19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBqZmZzX3Jhd19pbm9kZSByYXdfaW5vZGU7CisJc3RydWN0IGpmZnNfY29udHJvbCAqYzsKKwlzdHJ1Y3QgamZmc19ub2RlICpub2RlOworCXN0cnVjdCBqZmZzX2ZpbGUgKmRpcl9mOyAvKiBKRkZTIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkaXJlY3RvcnkuICAqLworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGVycjsKKworCWxvY2tfa2VybmVsKCk7CisJRDEoeworCQlpbnQgbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCQljaGFyICpzID0gKGNoYXIgKilrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOworCQltZW1jcHkocywgZGVudHJ5LT5kX25hbWUubmFtZSwgbGVuKTsKKwkJc1tsZW5dID0gJ1wwJzsKKwkJcHJpbnRrKCJqZmZzX2NyZWF0ZSgpOiBkaXI6IDB4JXAsIG5hbWU6IFwiJXNcIlxuIiwgZGlyLCBzKTsKKwkJa2ZyZWUocyk7CisJfSk7CisKKwlkaXJfZiA9IChzdHJ1Y3QgamZmc19maWxlICopZGlyLT51LmdlbmVyaWNfaXA7CisJQVNTRVJUKGlmICghZGlyX2YpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJqZmZzX2NyZWF0ZSgpOiBObyByZWZlcmVuY2UgdG8gYSAiCisJCSAgICAgICAiamZmc19maWxlIHN0cnVjdCBpbiBpbm9kZS5cbiIpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlPOworCX0pOworCisJYyA9IGRpcl9mLT5jOworCisJLyogQ3JlYXRlIGEgbm9kZSBhbmQgaW5pdGlhbGl6ZSBhcyBtdWNoIGFzIG5lZWRlZC4gICovCisJaWYgKCEobm9kZSA9IGpmZnNfYWxsb2Nfbm9kZSgpKSkgeworCQlEKHByaW50aygiamZmc19jcmVhdGUoKTogQWxsb2NhdGlvbiBmYWlsZWQ6IG5vZGUgPT0gMFxuIikpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJjcmVhdGUoKTogZG93biBiaWdsb2NrXG4iKSk7CisJZG93bigmYy0+Zm1jLT5iaWdsb2NrKTsKKworCW5vZGUtPmRhdGFfb2Zmc2V0ID0gMDsKKwlub2RlLT5yZW1vdmVkX3NpemUgPSAwOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcmF3IGlub2RlLiAgKi8KKwlyYXdfaW5vZGUubWFnaWMgPSBKRkZTX01BR0lDX0JJVE1BU0s7CisJcmF3X2lub2RlLmlubyA9IGMtPm5leHRfaW5vKys7CisJcmF3X2lub2RlLnBpbm8gPSBkaXJfZi0+aW5vOworCXJhd19pbm9kZS52ZXJzaW9uID0gMTsKKwlyYXdfaW5vZGUubW9kZSA9IG1vZGU7CisJcmF3X2lub2RlLnVpZCA9IGN1cnJlbnQtPmZzdWlkOworCXJhd19pbm9kZS5naWQgPSAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKSA/IGRpci0+aV9naWQgOiBjdXJyZW50LT5mc2dpZDsKKwlyYXdfaW5vZGUuYXRpbWUgPSBnZXRfc2Vjb25kcygpOworCXJhd19pbm9kZS5tdGltZSA9IHJhd19pbm9kZS5hdGltZTsKKwlyYXdfaW5vZGUuY3RpbWUgPSByYXdfaW5vZGUuYXRpbWU7CisJcmF3X2lub2RlLm9mZnNldCA9IDA7CisJcmF3X2lub2RlLmRzaXplID0gMDsKKwlyYXdfaW5vZGUucnNpemUgPSAwOworCXJhd19pbm9kZS5uc2l6ZSA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwlyYXdfaW5vZGUubmxpbmsgPSAxOworCXJhd19pbm9kZS5zcGFyZSA9IDA7CisJcmF3X2lub2RlLnJlbmFtZSA9IDA7CisJcmF3X2lub2RlLmRlbGV0ZWQgPSAwOworCisJLyogV3JpdGUgdGhlIG5ldyBub2RlIHRvIHRoZSBmbGFzaC4gICovCisJaWYgKChlcnIgPSBqZmZzX3dyaXRlX25vZGUoYywgbm9kZSwgJnJhd19pbm9kZSwKKwkJCQkgICBkZW50cnktPmRfbmFtZS5uYW1lLCBOVUxMLCAwLCBOVUxMKSkgPCAwKSB7CisJCUQocHJpbnRrKCJqZmZzX2NyZWF0ZSgpOiBqZmZzX3dyaXRlX25vZGUoKSBmYWlsZWQuXG4iKSk7CisJCWpmZnNfZnJlZV9ub2RlKG5vZGUpOworCQlnb3RvIGpmZnNfY3JlYXRlX2VuZDsKKwl9CisKKwkvKiBJbnNlcnQgdGhlIG5ldyBub2RlIGludG8gdGhlIGZpbGUgc3lzdGVtLiAgKi8KKwlpZiAoKGVyciA9IGpmZnNfaW5zZXJ0X25vZGUoYywgTlVMTCwgJnJhd19pbm9kZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkgICAgbm9kZSkpIDwgMCkgeworCQlnb3RvIGpmZnNfY3JlYXRlX2VuZDsKKwl9CisKKwkvKiBJbml0aWFsaXplIGFuIGlub2RlLiAgKi8KKwlpbm9kZSA9IGpmZnNfbmV3X2lub2RlKGRpciwgJnJhd19pbm9kZSwgJmVycik7CisJaWYgKGlub2RlID09IE5VTEwpIHsKKwkJZ290byBqZmZzX2NyZWF0ZV9lbmQ7CisJfQorCWVyciA9IDA7CisJaW5vZGUtPmlfb3AgPSAmamZmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJmpmZnNfZmlsZV9vcGVyYXRpb25zOworCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmpmZnNfYWRkcmVzc19vcGVyYXRpb25zOworCWlub2RlLT5pX21hcHBpbmctPm5ycGFnZXMgPSAwOworCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKyBqZmZzX2NyZWF0ZV9lbmQ6CisJRDMocHJpbnRrIChLRVJOX05PVElDRSAiY3JlYXRlKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycjsKK30gLyogamZmc19jcmVhdGUoKSAgKi8KKworCisvKiBXcml0ZSwgYXBwZW5kIG9yIHJld3JpdGUgZGF0YSB0byBhbiBleGlzdGluZyBmaWxlLiAgKi8KK3N0YXRpYyBzc2l6ZV90CitqZmZzX2ZpbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQlsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGpmZnNfcmF3X2lub2RlIHJhd19pbm9kZTsKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjOworCXN0cnVjdCBqZmZzX2ZpbGUgKmY7CisJc3RydWN0IGpmZnNfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCByZWNvdmVyYWJsZSA9IDA7CisJc2l6ZV90IHdyaXR0ZW4gPSAwOworCV9fdTMyIHRoaXNjb3VudCA9IGNvdW50OworCWxvZmZfdCBwb3MgPSAqcHBvczsKKwlpbnQgZXJyOworCisJaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKworCUQyKHByaW50aygiKioqamZmc19maWxlX3dyaXRlKCk6IGlub2RlOiAweCVwIChpbm86ICVsdSksICIKKwkJICAiZmlscDogMHglcCwgYnVmOiAweCVwLCBjb3VudDogJWRcbiIsCisJCSAgaW5vZGUsIGlub2RlLT5pX2lubywgZmlscCwgYnVmLCBjb3VudCkpOworCisjaWYgMAorCWlmIChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX1JET05MWSkgeworCQlEKHByaW50aygiamZmc19maWxlX3dyaXRlKCk6IE1TX1JET05MWVxuIikpOworCQllcnIgPSAtRVJPRlM7CisJCWdvdG8gb3V0X2lzZW07CisJfQorI2VuZGlmCQorCWVyciA9IC1FSU5WQUw7CisKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJRChwcmludGsoImpmZnNfZmlsZV93cml0ZSgpOiBpbm9kZS0+aV9tb2RlID09IDB4JTA4eFxuIiwKKwkJCQlpbm9kZS0+aV9tb2RlKSk7CisJCWdvdG8gb3V0X2lzZW07CisJfQorCisJaWYgKCEoZiA9IChzdHJ1Y3QgamZmc19maWxlICopaW5vZGUtPnUuZ2VuZXJpY19pcCkpIHsKKwkJRChwcmludGsoImpmZnNfZmlsZV93cml0ZSgpOiBpbm9kZS0+dS5nZW5lcmljX2lwID0gMHglcFxuIiwKKwkJCQlpbm9kZS0+dS5nZW5lcmljX2lwKSk7CisJCWdvdG8gb3V0X2lzZW07CisJfQorCisJYyA9IGYtPmM7CisKKwkvKgorCSAqIFRoaXMgd2lsbCBuZXZlciB0cmlnZ2VyIHdpdGggc2FuZSBwYWdlIHNpemVzLiAgbGVhdmUgaXQgaW4KKwkgKiBhbnl3YXksIHNpbmNlIEknbSB0aGlua2luZyBhYm91dCBob3cgdG8gbWVyZ2UgbGFyZ2VyIHdyaXRlcworCSAqICh0aGUgY3VycmVudCBpZGVhIGlzIHRvIHBva2UgYSB0aHJlYWQgdGhhdCBkb2VzIHRoZSBhY3R1YWwKKwkgKiBJL08gYW5kIHN0YXJ0cyBieSBkb2luZyBhIGRvd24oJmlub2RlLT5pX3NlbSkuICB0aGVuIHdlCisJICogd291bGQgbmVlZCB0byBnZXQgdGhlIHBhZ2UgY2FjaGUgcGFnZXMgYW5kIGhhdmUgYSBsaXN0IG9mCisJICogSS9PIHJlcXVlc3RzIGFuZCBkbyB3cml0ZS1tZXJnaW5nIGhlcmUuCisJICogLS0gcHJ1bXBmCisJICovCisJdGhpc2NvdW50ID0gbWluKGMtPmZtYy0+bWF4X2NodW5rX3NpemUgLSBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKSwgY291bnQpOworCisJRDMocHJpbnRrIChLRVJOX05PVElDRSAiZmlsZV93cml0ZSgpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwlkb3duKCZjLT5mbWMtPmJpZ2xvY2spOworCisJLyogVXJnaC4gUE9TSVggc2F5cyB3ZSBjYW4gZG8gc2hvcnQgd3JpdGVzIGlmIHdlIGZlZWwgbGlrZSBpdC4gCisJICogSW4gcHJhY3RpY2UsIHdlIGNhbid0LiBOb3RoaW5nIHdpbGwgY29wZS4gU28gd2UgbG9vcCB1bnRpbAorCSAqIHdlJ3JlIGRvbmUuCisJICoKKwkgKiA8X0FuYXJjaHlfPiBwb3NpeCBhbmQgcmVhbGl0eSBhcmUgbm90IGludGVyY29ubmVjdGVkIG9uIHRoaXMgaXNzdWUKKwkgKi8KKwl3aGlsZSAoY291bnQpIHsKKwkJLyogVGhpbmdzIGFyZSBnb2luZyB0byBiZSB3cml0dGVuIHNvIHdlIGNvdWxkIGFsbG9jYXRlIGFuZAorCQkgICBpbml0aWFsaXplIHRoZSBuZWNlc3NhcnkgZGF0YSBzdHJ1Y3R1cmVzIG5vdy4gICovCisJCWlmICghKG5vZGUgPSBqZmZzX2FsbG9jX25vZGUoKSkpIHsKKwkJCUQocHJpbnRrKCJqZmZzX2ZpbGVfd3JpdGUoKTogbm9kZSA9PSAwXG4iKSk7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKworCQlub2RlLT5kYXRhX29mZnNldCA9IHBvczsKKwkJbm9kZS0+cmVtb3ZlZF9zaXplID0gMDsKKworCQkvKiBJbml0aWFsaXplIHRoZSByYXcgaW5vZGUuICAqLworCQlyYXdfaW5vZGUubWFnaWMgPSBKRkZTX01BR0lDX0JJVE1BU0s7CisJCXJhd19pbm9kZS5pbm8gPSBmLT5pbm87CisJCXJhd19pbm9kZS5waW5vID0gZi0+cGlubzsKKworCQlyYXdfaW5vZGUubW9kZSA9IGYtPm1vZGU7CisKKwkJcmF3X2lub2RlLnVpZCA9IGYtPnVpZDsKKwkJcmF3X2lub2RlLmdpZCA9IGYtPmdpZDsKKwkJcmF3X2lub2RlLmF0aW1lID0gZ2V0X3NlY29uZHMoKTsKKwkJcmF3X2lub2RlLm10aW1lID0gcmF3X2lub2RlLmF0aW1lOworCQlyYXdfaW5vZGUuY3RpbWUgPSBmLT5jdGltZTsKKwkJcmF3X2lub2RlLm9mZnNldCA9IHBvczsKKwkJcmF3X2lub2RlLmRzaXplID0gdGhpc2NvdW50OworCQlyYXdfaW5vZGUucnNpemUgPSAwOworCQlyYXdfaW5vZGUubnNpemUgPSBmLT5uc2l6ZTsKKwkJcmF3X2lub2RlLm5saW5rID0gZi0+bmxpbms7CisJCXJhd19pbm9kZS5zcGFyZSA9IDA7CisJCXJhd19pbm9kZS5yZW5hbWUgPSAwOworCQlyYXdfaW5vZGUuZGVsZXRlZCA9IDA7CisKKwkJaWYgKHBvcyA8IGYtPnNpemUpIHsKKwkJCW5vZGUtPnJlbW92ZWRfc2l6ZSA9IHJhd19pbm9kZS5yc2l6ZSA9IG1pbih0aGlzY291bnQsIChfX3UzMikoZi0+c2l6ZSAtIHBvcykpOworCisJCQkvKiBJZiB0aGlzIG5vZGUgaXMgZ29pbmcgZW50aXJlbHkgb3ZlciB0aGUgdG9wIG9mIG9sZCBkYXRhLAorCQkJICAgd2UgY2FuIGFsbG93IGl0IHRvIGdvIGludG8gdGhlIHJlc2VydmVkIHNwYWNlLCBiZWNhdXNlCisJCQkgICB3ZSBrbm93IHRoYXQgR0MgY2FuIHJlY2xhaW0gdGhlIHNwYWNlIGxhdGVyLgorCQkJKi8KKwkJCWlmIChwb3MgKyB0aGlzY291bnQgPCBmLT5zaXplKSB7CisJCQkJLyogSWYgYWxsIHRoZSBkYXRhIHdlJ3JlIG92ZXJ3cml0aW5nIGFyZSBfcmVhbF8sCisJCQkJICAgbm90IGp1c3QgaG9sZXMsIHRoZW46CisJCQkJICAgcmVjb3ZlcmFibGUgPSAxOworCQkJCSovCisJCQl9CisJCX0KKworCQkvKiBXcml0ZSB0aGUgbmV3IG5vZGUgdG8gdGhlIGZsYXNoLiAgKi8KKwkJLyogTk9URTogV2Ugd291bGQgYmUgcXVpdGUgaGFwcHkgaWYgamZmc193cml0ZV9ub2RlKCkgd3JvdGUgYQorCQkgICBzbWFsbGVyIG5vZGUgdGhhbiB3ZSB3ZXJlIGV4cGVjdGluZy4gVGhlcmUncyBubyBuZWVkIGZvciBpdAorCQkgICB0byB3YXN0ZSB0aGUgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgZmxhc2gganVzdCBiZWNhdXNlIGl0J3MKKwkJICAgYSBsaXR0bGUgc21hbGxlciB0aGFuIHdoYXQgd2UgYXNrZWQgZm9yLiBCdXQgdGhhdCdzIGEgd2hvbGUKKwkJICAgbmV3IGNhbiBvZiB3b3JtcyB3aGljaCBJJ20gbm90IGdvaW5nIHRvIG9wZW4gdGhpcyB3ZWVrLiAKKwkJICAgLS0gZHdtdzIuCisJCSovCisJCWlmICgoZXJyID0gamZmc193cml0ZV9ub2RlKGMsIG5vZGUsICZyYXdfaW5vZGUsIGYtPm5hbWUsCisJCQkJCSAgIChjb25zdCB1bnNpZ25lZCBjaGFyICopYnVmLAorCQkJCQkgICByZWNvdmVyYWJsZSwgZikpIDwgMCkgeworCQkJRChwcmludGsoImpmZnNfZmlsZV93cml0ZSgpOiBqZmZzX3dyaXRlX25vZGUoKSBmYWlsZWQuXG4iKSk7CisJCQlqZmZzX2ZyZWVfbm9kZShub2RlKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJd3JpdHRlbiArPSBlcnI7CisJCWJ1ZiArPSBlcnI7CisJCWNvdW50IC09IGVycjsKKwkJcG9zICs9IGVycjsKKworCQkvKiBJbnNlcnQgdGhlIG5ldyBub2RlIGludG8gdGhlIGZpbGUgc3lzdGVtLiAgKi8KKwkJaWYgKChlcnIgPSBqZmZzX2luc2VydF9ub2RlKGMsIGYsICZyYXdfaW5vZGUsIE5VTEwsIG5vZGUpKSA8IDApIHsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJRDMocHJpbnRrKCJqZmZzX2ZpbGVfd3JpdGUoKTogbmV3IGZfcG9zICVsZC5cbiIsIChsb25nKXBvcykpOworCisJCXRoaXNjb3VudCA9IG1pbihjLT5mbWMtPm1heF9jaHVua19zaXplIC0gc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSksIGNvdW50KTsKKwl9Cisgb3V0OgorCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgImZpbGVfd3JpdGUoKTogdXAgYmlnbG9ja1xuIikpOworCXVwKCZjLT5mbWMtPmJpZ2xvY2spOworCisJLyogRml4IHRoaW5ncyBpbiB0aGUgcmVhbCBpbm9kZS4gICovCisJaWYgKHBvcyA+IGlub2RlLT5pX3NpemUpIHsKKwkJaW5vZGUtPmlfc2l6ZSA9IHBvczsKKwkJaW5vZGUtPmlfYmxvY2tzID0gKGlub2RlLT5pX3NpemUgKyA1MTEpID4+IDk7CisJfQorCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCWludmFsaWRhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZyk7CisKKyBvdXRfaXNlbToKKwlyZXR1cm4gZXJyOworfSAvKiBqZmZzX2ZpbGVfd3JpdGUoKSAgKi8KKworc3RhdGljIGludAoramZmc19wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCS8qIEZJWE1FOiB3ZSBzaG91bGQgZGV0ZWN0IHNvbWUgZXJyb3IgY29uZGl0aW9ucyBoZXJlICovCisKKwkvKiBCdWdnZXIgdGhhdC4gV2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGUgcGFnZSBpcyB1cHRvZGF0ZSAqLworCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpICYmIChmcm9tIHx8IHRvIDwgUEFHRV9DQUNIRV9TSVpFKSkKKwkJcmV0dXJuIGpmZnNfZG9fcmVhZHBhZ2Vfbm9sb2NrKGZpbHAsIHBhZ2UpOworCisJcmV0dXJuIDA7Cit9IC8qIGpmZnNfcHJlcGFyZV93cml0ZSgpICovCisKK3N0YXRpYyBpbnQKK2pmZnNfY29tbWl0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisgICAgICAgdm9pZCAqYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKSArIGZyb207CisgICAgICAgLyogWFhYOiBQQUdFX0NBQ0hFX1NISUZUIG9yIFBBR0VfU0hJRlQgKi8KKyAgICAgICBsb2ZmX3QgcG9zID0gKHBhZ2UtPmluZGV4PDxQQUdFX0NBQ0hFX1NISUZUKSArIGZyb207CisKKyAgICAgICByZXR1cm4gamZmc19maWxlX3dyaXRlKGZpbHAsIGFkZHIsIHRvLWZyb20sICZwb3MpOworfSAvKiBqZmZzX2NvbW1pdF93cml0ZSgpICovCisKKy8qIFRoaXMgaXMgb3VyIGlvY3RsKCkgcm91dGluZS4gICovCitzdGF0aWMgaW50CitqZmZzX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBqZmZzX2NvbnRyb2wgKmM7CisJaW50IHJldCA9IDA7CisKKwlEMihwcmludGsoIioqKmpmZnNfaW9jdGwoKTogY21kID0gMHglMDh4LCBhcmcgPSAweCUwOGx4XG4iLAorCQkgIGNtZCwgYXJnKSk7CisKKwlpZiAoIShjID0gKHN0cnVjdCBqZmZzX2NvbnRyb2wgKilpbm9kZS0+aV9zYi0+c19mc19pbmZvKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkpGRlM6IEJhZCBpbm9kZSBpbiBpb2N0bCgpIGNhbGwuICIKKwkJICAgICAgICIoY21kID0gMHglMDh4KVxuIiwgY21kKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgImlvY3RsKCk6IGRvd24gYmlnbG9ja1xuIikpOworCWRvd24oJmMtPmZtYy0+YmlnbG9jayk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSkZGU19QUklOVF9IQVNIOgorCQlqZmZzX3ByaW50X2hhc2hfdGFibGUoYyk7CisJCWJyZWFrOworCWNhc2UgSkZGU19QUklOVF9UUkVFOgorCQlqZmZzX3ByaW50X3RyZWUoYy0+cm9vdCwgMCk7CisJCWJyZWFrOworCWNhc2UgSkZGU19HRVRfU1RBVFVTOgorCQl7CisJCQlzdHJ1Y3QgamZmc19mbGFzaF9zdGF0dXMgZnN0OworCQkJc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMgPSBjLT5mbWM7CisJCQlwcmludGsoIkZsYXNoIHN0YXR1cyAtLSAiKTsKKwkJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwKKwkJCQkgICAgICAgKHN0cnVjdCBqZmZzX2ZsYXNoX3N0YXR1cyBfX3VzZXIgKilhcmcsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgamZmc19mbGFzaF9zdGF0dXMpKSkgeworCQkJCUQocHJpbnRrKCJqZmZzX2lvY3RsKCk6IEJhZCBhcmcgaW4gIgorCQkJCQkgIkpGRlNfR0VUX1NUQVRVUyBpb2N0bCFcbiIpKTsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJZnN0LnNpemUgPSBmbWMtPmZsYXNoX3NpemU7CisJCQlmc3QudXNlZCA9IGZtYy0+dXNlZF9zaXplOworCQkJZnN0LmRpcnR5ID0gZm1jLT5kaXJ0eV9zaXplOworCQkJZnN0LmJlZ2luID0gZm1jLT5oZWFkLT5vZmZzZXQ7CisJCQlmc3QuZW5kID0gZm1jLT50YWlsLT5vZmZzZXQgKyBmbWMtPnRhaWwtPnNpemU7CisJCQlwcmludGsoInNpemU6ICVkLCB1c2VkOiAlZCwgZGlydHk6ICVkLCAiCisJCQkgICAgICAgImJlZ2luOiAlZCwgZW5kOiAlZFxuIiwKKwkJCSAgICAgICBmc3Quc2l6ZSwgZnN0LnVzZWQsIGZzdC5kaXJ0eSwKKwkJCSAgICAgICBmc3QuYmVnaW4sIGZzdC5lbmQpOworCQkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IGpmZnNfZmxhc2hfc3RhdHVzIF9fdXNlciAqKWFyZywKKwkJCQkJICZmc3QsCisJCQkJCSBzaXplb2Yoc3RydWN0IGpmZnNfZmxhc2hfc3RhdHVzKSkpIHsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJfQorCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9UVFk7CisJfQorCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgImlvY3RsKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKwlyZXR1cm4gcmV0OworfSAvKiBqZmZzX2lvY3RsKCkgICovCisKKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgamZmc19hZGRyZXNzX29wZXJhdGlvbnMgPSB7CisJLnJlYWRwYWdlCT0gamZmc19yZWFkcGFnZSwKKwkucHJlcGFyZV93cml0ZQk9IGpmZnNfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gamZmc19jb21taXRfd3JpdGUsCit9OworCitzdGF0aWMgaW50IGpmZnNfZnN5bmMoc3RydWN0IGZpbGUgKmYsIHN0cnVjdCBkZW50cnkgKmQsIGludCBkYXRhc3luYykKK3sKKwkvKiBXZSBjdXJyZW50bHkgaGF2ZSBPX1NZTkMgb3BlcmF0aW9ucyBhdCBhbGwgdGltZXMuCisJICAgRG8gbm90aGluZy4KKwkqLworCXJldHVybiAwOworfQorCisKK2V4dGVybiBpbnQgZ2VuZXJpY19maWxlX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopIF9fYXR0cmlidXRlX18oKHdlYWspKTsKK2V4dGVybiBsb2ZmX3QgZ2VuZXJpY19maWxlX2xsc2VlayhzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGludCkgX19hdHRyaWJ1dGVfXygod2VhaykpOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBqZmZzX2ZpbGVfb3BlcmF0aW9ucyA9Cit7CisJLm9wZW4JCT0gZ2VuZXJpY19maWxlX29wZW4sCisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfZmlsZV9yZWFkLAorCS53cml0ZQkJPSBnZW5lcmljX2ZpbGVfd3JpdGUsCisJLmlvY3RsCQk9IGpmZnNfaW9jdGwsCisJLm1tYXAJCT0gZ2VuZXJpY19maWxlX3JlYWRvbmx5X21tYXAsCisJLmZzeW5jCQk9IGpmZnNfZnN5bmMsCisJLnNlbmRmaWxlCT0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorfTsKKworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgamZmc19maWxlX2lub2RlX29wZXJhdGlvbnMgPQoreworCS5sb29rdXAJCT0gamZmc19sb29rdXAsICAgICAgICAgIC8qIGxvb2t1cCAqLworCS5zZXRhdHRyCT0gamZmc19zZXRhdHRyLAorfTsKKworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBqZmZzX2Rpcl9vcGVyYXRpb25zID0KK3sKKwkucmVhZGRpcgk9IGpmZnNfcmVhZGRpciwKK307CisKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGpmZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPQoreworCS5jcmVhdGUJCT0gamZmc19jcmVhdGUsCisJLmxvb2t1cAkJPSBqZmZzX2xvb2t1cCwKKwkudW5saW5rCQk9IGpmZnNfdW5saW5rLAorCS5zeW1saW5rCT0gamZmc19zeW1saW5rLAorCS5ta2RpcgkJPSBqZmZzX21rZGlyLAorCS5ybWRpcgkJPSBqZmZzX3JtZGlyLAorCS5ta25vZAkJPSBqZmZzX21rbm9kLAorCS5yZW5hbWUJCT0gamZmc19yZW5hbWUsCisJLnNldGF0dHIJPSBqZmZzX3NldGF0dHIsCit9OworCisKKy8qIEluaXRpYWxpemUgYW4gaW5vZGUgZm9yIHRoZSBWRlMuICAqLworc3RhdGljIHZvaWQKK2pmZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBqZmZzX2ZpbGUgKmY7CisJc3RydWN0IGpmZnNfY29udHJvbCAqYzsKKworCUQzKHByaW50aygiamZmc19yZWFkX2lub2RlKCk6IGlub2RlLT5pX2lubyA9PSAlbHVcbiIsIGlub2RlLT5pX2lubykpOworCisJaWYgKCFpbm9kZS0+aV9zYikgeworCQlEKHByaW50aygiamZmc19yZWFkX2lub2RlKCk6ICFpbm9kZS0+aV9zYiA9PT4gIgorCQkJICJObyBzdXBlciBibG9jayFcbiIpKTsKKwkJcmV0dXJuOworCX0KKwljID0gKHN0cnVjdCBqZmZzX2NvbnRyb2wgKilpbm9kZS0+aV9zYi0+c19mc19pbmZvOworCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgInJlYWRfaW5vZGUoKTogZG93biBiaWdsb2NrXG4iKSk7CisJZG93bigmYy0+Zm1jLT5iaWdsb2NrKTsKKwlpZiAoIShmID0gamZmc19maW5kX2ZpbGUoYywgaW5vZGUtPmlfaW5vKSkpIHsKKwkJRChwcmludGsoImpmZnNfcmVhZF9pbm9kZSgpOiBObyBzdWNoIGlub2RlICglbHUpLlxuIiwKKwkJCSBpbm9kZS0+aV9pbm8pKTsKKwkJRDMocHJpbnRrIChLRVJOX05PVElDRSAicmVhZF9pbm9kZSgpOiB1cCBiaWdsb2NrXG4iKSk7CisJCXVwKCZjLT5mbWMtPmJpZ2xvY2spOworCQlyZXR1cm47CisJfQorCWlub2RlLT51LmdlbmVyaWNfaXAgPSAodm9pZCAqKWY7CisJaW5vZGUtPmlfbW9kZSA9IGYtPm1vZGU7CisJaW5vZGUtPmlfbmxpbmsgPSBmLT5ubGluazsKKwlpbm9kZS0+aV91aWQgPSBmLT51aWQ7CisJaW5vZGUtPmlfZ2lkID0gZi0+Z2lkOworCWlub2RlLT5pX3NpemUgPSBmLT5zaXplOworCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IGYtPmF0aW1lOworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGYtPm10aW1lOworCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IGYtPmN0aW1lOworCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gCisJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7CisKKwlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOworCWlub2RlLT5pX2Jsb2NrcyA9IChpbm9kZS0+aV9zaXplICsgNTExKSA+PiA5OworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJmpmZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmamZmc19maWxlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmpmZnNfYWRkcmVzc19vcGVyYXRpb25zOworCX0KKwllbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJmpmZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZqZmZzX2Rpcl9vcGVyYXRpb25zOworCX0KKwllbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZqZmZzX2FkZHJlc3Nfb3BlcmF0aW9uczsKKwl9CisJZWxzZSB7CisJCS8qIElmIHRoZSBub2RlIGlzIGEgZGV2aWNlIG9mIHNvbWUgc29ydCwgdGhlbiB0aGUgbnVtYmVyIG9mCisJCSAgIHRoZSBkZXZpY2Ugc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgZmxhc2ggbWVtb3J5IGFuZCB0aGVuCisJCSAgIGFkZGVkIHRvIHRoZSBpbm9kZSdzIGlfcmRldiBtZW1iZXIuICAqLworCQl1MTYgdmFsOworCQlqZmZzX3JlYWRfZGF0YShmLCAoY2hhciAqKSZ2YWwsIDAsIDIpOworCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCisJCQlvbGRfZGVjb2RlX2Rldih2YWwpKTsKKwl9CisKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJyZWFkX2lub2RlKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKK30KKworCitzdGF0aWMgdm9pZAoramZmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgamZmc19maWxlICpmOworCXN0cnVjdCBqZmZzX2NvbnRyb2wgKmM7CisJRDMocHJpbnRrKCJqZmZzX2RlbGV0ZV9pbm9kZSgpOiBpbm9kZS0+aV9pbm8gPT0gJWx1XG4iLAorCQkgIGlub2RlLT5pX2lubykpOworCisJbG9ja19rZXJuZWwoKTsKKwlpbm9kZS0+aV9zaXplID0gMDsKKwlpbm9kZS0+aV9ibG9ja3MgPSAwOworCWlub2RlLT51LmdlbmVyaWNfaXAgPSBOVUxMOworCWNsZWFyX2lub2RlKGlub2RlKTsKKwlpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCkgeworCQljID0gKHN0cnVjdCBqZmZzX2NvbnRyb2wgKikgaW5vZGUtPmlfc2ItPnNfZnNfaW5mbzsKKwkJZiA9IChzdHJ1Y3QgamZmc19maWxlICopIGpmZnNfZmluZF9maWxlIChjLCBpbm9kZS0+aV9pbm8pOworCQlqZmZzX3Bvc3NpYmx5X2RlbGV0ZV9maWxlKGYpOworCX0KKworCXVubG9ja19rZXJuZWwoKTsKK30KKworCitzdGF0aWMgdm9pZAoramZmc193cml0ZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBqZmZzX2NvbnRyb2wgKmMgPSAoc3RydWN0IGpmZnNfY29udHJvbCAqKXNiLT5zX2ZzX2luZm87CisJbG9ja19rZXJuZWwoKTsKKwlqZmZzX2dhcmJhZ2VfY29sbGVjdF90cmlnZ2VyKGMpOworCXVubG9ja19rZXJuZWwoKTsKK30KKworc3RhdGljIGludCBqZmZzX3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSkKK3sKKwkqZmxhZ3MgfD0gTVNfTk9ESVJBVElNRTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGpmZnNfb3BzID0KK3sKKwkucmVhZF9pbm9kZQk9IGpmZnNfcmVhZF9pbm9kZSwKKwkuZGVsZXRlX2lub2RlIAk9IGpmZnNfZGVsZXRlX2lub2RlLAorCS5wdXRfc3VwZXIJPSBqZmZzX3B1dF9zdXBlciwKKwkud3JpdGVfc3VwZXIJPSBqZmZzX3dyaXRlX3N1cGVyLAorCS5zdGF0ZnMJCT0gamZmc19zdGF0ZnMsCisJLnJlbW91bnRfZnMJPSBqZmZzX3JlbW91bnQsCit9OworCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpqZmZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGpmZnNfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBqZmZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJqZmZzIiwKKwkuZ2V0X3NiCQk9IGpmZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworCitzdGF0aWMgaW50IF9faW5pdAoraW5pdF9qZmZzX2ZzKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiSkZGUyB2ZXJzaW9uICIgSkZGU19WRVJTSU9OX1NUUklORworCQkiLCAoQykgMTk5OSwgMjAwMCAgQXhpcyBDb21tdW5pY2F0aW9ucyBBQlxuIik7CisJCisjaWZkZWYgQ09ORklHX0pGRlNfUFJPQ19GUworCWpmZnNfcHJvY19yb290ID0gcHJvY19ta2RpcigiamZmcyIsIHByb2Nfcm9vdF9mcyk7CisJaWYgKCFqZmZzX3Byb2Nfcm9vdCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjYW5ub3QgY3JlYXRlIC9wcm9jL2pmZnMgZW50cnlcbiIpOworCX0KKyNlbmRpZgorCWZtX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImpmZnNfZm0iLCBzaXplb2Yoc3RydWN0IGpmZnNfZm0pLAorCQkJCSAgICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfUkVDTEFJTV9BQ0NPVU5ULCAKKwkJCQkgICAgIE5VTEwsIE5VTEwpOworCWlmICghZm1fY2FjaGUpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbm9kZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJqZmZzX25vZGUiLHNpemVvZihzdHJ1Y3QgamZmc19ub2RlKSwKKwkJCQkgICAgICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfUkVDTEFJTV9BQ0NPVU5ULCAKKwkJCQkgICAgICAgTlVMTCwgTlVMTCk7CisJaWYgKCFub2RlX2NhY2hlKSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShmbV9jYWNoZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiByZWdpc3Rlcl9maWxlc3lzdGVtKCZqZmZzX2ZzX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2V4aXRfamZmc19mcyh2b2lkKQoreworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmamZmc19mc190eXBlKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koZm1fY2FjaGUpOworCWttZW1fY2FjaGVfZGVzdHJveShub2RlX2NhY2hlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9qZmZzX2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9qZmZzX2ZzKQorCitNT0RVTEVfREVTQ1JJUFRJT04oIlRoZSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSIpOworTU9EVUxFX0FVVEhPUigiQXhpcyBDb21tdW5pY2F0aW9ucyBBQi4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMvaW50cmVwLmMgYi9mcy9qZmZzL2ludHJlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYzY4OTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzL2ludHJlcC5jCkBAIC0wLDAgKzEsMzQ1NyBAQAorLyoKKyAqIEpGRlMgLS0gSm91cm5hbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgTGludXggaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwICBBeGlzIENvbW11bmljYXRpb25zLCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBGaW5uIEhha2Fuc3NvbiA8ZmlubkBheGlzLmNvbT4uCisgKgorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogJElkOiBpbnRyZXAuYyx2IDEuMTAyIDIwMDEvMDkvMjMgMjM6Mjg6MzYgZHdtdzIgRXhwICQKKyAqCisgKiBQb3J0ZWQgdG8gTGludXggMi4zLnggYW5kIE1URDoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAgQWxleGFuZGVyIExhcnNzb24gKGFsZXhAY2VuZGlvLnNlKSwgQ2VuZGlvIFN5c3RlbXMgQUIKKyAqCisgKi8KKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIGZvciB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIG9mIHRoZQorICAgSm91cm5hbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgSkZGUy4gICovCisKKy8qCisgKiBUb2RvIGxpc3Q6CisgKgorICogbWVtY3B5X3RvX2ZsYXNoKCkgYW5kIG1lbWNweV9mcm9tX2ZsYXNoKCkgZnVuY3Rpb25zLgorICoKKyAqIEltcGxlbWVudGF0aW9uIG9mIGhhcmQgbGlua3MuCisgKgorICogT3JnYW5pemUgdGhlIHNvdXJjZSBjb2RlIGluIGEgYmV0dGVyIHdheS4gQWdhaW5zdCB0aGUgVkZTIHdlIGNvdWxkCisgKiBoYXZlIGpmZnNfZXh0LmMsIGFuZCBhZ2FpbnN0IHRoZSBibG9jayBkZXZpY2UgamZmc19pbnQuYy4KKyAqIEEgYmV0dGVyIGZpbGUtaW50ZXJuYWwgb3JnYW5pemF0aW9uIHRvby4KKyAqCisgKiBBIGJldHRlciBjaGVja3N1bSBhbGdvcml0aG0uCisgKgorICogQ29uc2lkZXIgZW5kaWFubmVzcyBzdHVmZi4gbnRvaGwoKSBldGMuCisgKgorICogQXJlIHdlIGhhbmRsaW5nIHRoZSBhdGltZSwgbXRpbWUsIGN0aW1lIG1lbWJlcnMgb2YgdGhlIGlub2RlIHJpZ2h0PworICoKKyAqIFJlbW92ZSBzb21lIGR1cGxpY2F0ZWQgY29kZS4gVGFrZSBhIGxvb2sgYXQgamZmc193cml0ZV9ub2RlKCkgYW5kCisgKiBqZmZzX3Jld3JpdGVfZGF0YSgpIGZvciBpbnN0YW5jZS4KKyAqCisgKiBJbXBsZW1lbnQgbW9yZSBtZWFuaW5nIG9mIHRoZSBubGluayBtZW1iZXIgaW4gdmFyaW91cyBkYXRhIHN0cnVjdHVyZXMuCisgKiBubGluayBjb3VsZCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFyZCBsaW5rcyBmb3IgaW5zdGFuY2UuCisgKgorICogQmV0dGVyIG1lbW9yeSBtYW5hZ2VtZW50LiBBbGxvY2F0ZSBkYXRhIHN0cnVjdHVyZXMgaW4gbGFyZ2VyIGNodW5rcworICogaWYgcG9zc2libGUuCisgKgorICogSWYgdG9vIG11Y2ggbWV0YSBkYXRhIGlzIHN0b3JlZCwgYSBnYXJiYWdlIGNvbGxlY3Qgc2hvdWxkIGJlIGlzc3VlZC4KKyAqIFdlIGhhdmUgZXhwZXJpZW5jZWQgcHJvYmxlbXMgd2l0aCB0b28gbXVjaCBtZXRhIGRhdGEgd2l0aCBmb3IgaW5zdGFuY2UKKyAqIGxvZyBmaWxlcy4KKyAqCisgKiBJbXByb3ZlIHRoZSBjYWxscyB0byBqZmZzX2lvY3RsKCkuIFdlIHdvdWxkIGxpa2UgdG8gcmV0cmlldmUgbW9yZQorICogaW5mb3JtYXRpb24gdG8gYmUgYWJsZSB0byBkZWJ1ZyAob3IgdG8gc3VwZXJ2aXNlKSBKRkZTIGR1cmluZyBydW4tdGltZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2pmZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorCisjaW5jbHVkZSAiaW50cmVwLmgiCisjaW5jbHVkZSAiamZmc19mbS5oIgorCitsb25nIG5vX2pmZnNfbm9kZSA9IDA7CitzdGF0aWMgbG9uZyBub19qZmZzX2ZpbGUgPSAwOworI2lmIGRlZmluZWQoSkZGU19NRU1PUllfREVCVUcpICYmIEpGRlNfTUVNT1JZX0RFQlVHCitsb25nIG5vX2pmZnNfY29udHJvbCA9IDA7Citsb25nIG5vX2pmZnNfcmF3X2lub2RlID0gMDsKK2xvbmcgbm9famZmc19ub2RlX3JlZiA9IDA7Citsb25nIG5vX2pmZnNfZm0gPSAwOworbG9uZyBub19qZmZzX2ZtY29udHJvbCA9IDA7Citsb25nIG5vX2hhc2ggPSAwOworbG9uZyBub19uYW1lID0gMDsKKyNlbmRpZgorCitzdGF0aWMgaW50IGpmZnNfc2Nhbl9mbGFzaChzdHJ1Y3QgamZmc19jb250cm9sICpjKTsKK3N0YXRpYyBpbnQgamZmc191cGRhdGVfZmlsZShzdHJ1Y3QgamZmc19maWxlICpmLCBzdHJ1Y3QgamZmc19ub2RlICpub2RlKTsKK3N0YXRpYyBpbnQgamZmc19idWlsZF9maWxlKHN0cnVjdCBqZmZzX2ZpbGUgKmYpOworc3RhdGljIGludCBqZmZzX2ZyZWVfZmlsZShzdHJ1Y3QgamZmc19maWxlICpmKTsKK3N0YXRpYyBpbnQgamZmc19mcmVlX25vZGVfbGlzdChzdHJ1Y3QgamZmc19maWxlICpmKTsKK3N0YXRpYyBpbnQgamZmc19nYXJiYWdlX2NvbGxlY3Rfbm93KHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMpOworc3RhdGljIGludCBqZmZzX2luc2VydF9maWxlX2ludG9faGFzaChzdHJ1Y3QgamZmc19maWxlICpmKTsKK3N0YXRpYyBpbnQgamZmc19yZW1vdmVfcmVkdW5kYW50X25vZGVzKHN0cnVjdCBqZmZzX2ZpbGUgKmYpOworCisvKiBJcyB0aGVyZSBlbm91Z2ggc3BhY2Ugb24gdGhlIGZsYXNoPyAgKi8KK3N0YXRpYyBpbmxpbmUgaW50IEpGRlNfRU5PVUdIX1NQQUNFKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMsIF9fdTMyIHNwYWNlKQoreworCXN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jID0gYy0+Zm1jOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKChmbWMtPmZsYXNoX3NpemUgLSAoZm1jLT51c2VkX3NpemUgKyBmbWMtPmRpcnR5X3NpemUpKQorCQkJPj0gZm1jLT5taW5fZnJlZV9zaXplICsgc3BhY2UpIHsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChmbWMtPmRpcnR5X3NpemUgPCBmbWMtPnNlY3Rvcl9zaXplKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGpmZnNfZ2FyYmFnZV9jb2xsZWN0X25vdyhjKSkgeworCQkgIEQxKHByaW50aygiSkZGU19FTk9VR0hfU1BBQ0U6IGpmZnNfZ2FyYmFnZV9jb2xsZWN0X25vdygpIGZhaWxlZC5cbiIpKTsKKwkJICByZXR1cm4gMDsKKwkJfQorCX0KK30KKworI2lmIENPTkZJR19KRkZTX0ZTX1ZFUkJPU0UgPiAwCitzdGF0aWMgX191OAorZmxhc2hfcmVhZF91OChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20pCit7CisJc2l6ZV90IHJldGxlbjsKKwlfX3U4IHJldDsKKwlpbnQgcmVzOworCisJcmVzID0gTVREX1JFQUQobXRkLCBmcm9tLCAxLCAmcmV0bGVuLCAmcmV0KTsKKwlpZiAocmV0bGVuICE9IDEpIHsKKwkJcHJpbnRrKCJEaWRuJ3QgcmVhZCBhIGJ5dGUgaW4gZmxhc2hfcmVhZF91OCgpLiBSZXR1cm5lZCAlZFxuIiwgcmVzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2pmZnNfaGV4ZHVtcChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHBvcywgaW50IHNpemUpCit7CisJY2hhciBsaW5lWzE2XTsKKwlpbnQgaiA9IDA7CisKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJaW50IGk7CisKKwkJcHJpbnRrKCIlbGQ6IiwgKGxvbmcpIHBvcyk7CisJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisJCQlsaW5lW2pdID0gZmxhc2hfcmVhZF91OChtdGQsIHBvcysrKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisJCQlpZiAoIShpICYgMSkpIHsKKwkJCQlwcmludGsoIiAlLjJ4IiwgbGluZVtpXSAmIDB4ZmYpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcHJpbnRrKCIlLjJ4IiwgbGluZVtpXSAmIDB4ZmYpOworCQkJfQorCQl9CisKKwkJLyogUHJpbnQgZW1wdHkgc3BhY2UgKi8KKwkJZm9yICg7IGkgPCAxNjsgaSsrKSB7CisJCQlpZiAoIShpICYgMSkpIHsKKwkJCQlwcmludGsoIiAgICIpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcHJpbnRrKCIgICIpOworCQkJfQorCQl9CisJCXByaW50aygiICAiKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisJCQlpZiAoaXNncmFwaChsaW5lW2ldKSkgeworCQkJCXByaW50aygiJWMiLCBsaW5lW2ldKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXByaW50aygiLiIpOworCQkJfQorCQl9CisJCXByaW50aygiXG4iKTsKKwkJc2l6ZSAtPSAxNjsKKwl9Cit9CisKKyNlbmRpZgorCisjZGVmaW5lIGZsYXNoX3NhZmVfYWNxdWlyZShhcmcpCisjZGVmaW5lIGZsYXNoX3NhZmVfcmVsZWFzZShhcmcpCisKKworc3RhdGljIGludAorZmxhc2hfc2FmZV9yZWFkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwKKwkJdV9jaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzaXplX3QgcmV0bGVuOworCWludCByZXM7CisKKwlEMyhwcmludGsoS0VSTl9OT1RJQ0UgImZsYXNoX3NhZmVfcmVhZCglcCwgJTA4eCwgJXAsICUwOHgpXG4iLAorCQkgIG10ZCwgKHVuc2lnbmVkIGludCkgZnJvbSwgYnVmLCBjb3VudCkpOworCisJcmVzID0gTVREX1JFQUQobXRkLCBmcm9tLCBjb3VudCwgJnJldGxlbiwgYnVmKTsKKwlpZiAocmV0bGVuICE9IGNvdW50KSB7CisJCXBhbmljKCJEaWRuJ3QgcmVhZCBhbGwgYnl0ZXMgaW4gZmxhc2hfc2FmZV9yZWFkKCkuIFJldHVybmVkICVkXG4iLCByZXMpOworCX0KKwlyZXR1cm4gcmVzP3JlczpyZXRsZW47Cit9CisKKworc3RhdGljIF9fdTMyCitmbGFzaF9yZWFkX3UzMihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20pCit7CisJc2l6ZV90IHJldGxlbjsKKwlfX3UzMiByZXQ7CisJaW50IHJlczsKKworCXJlcyA9IE1URF9SRUFEKG10ZCwgZnJvbSwgNCwgJnJldGxlbiwgKHVuc2lnbmVkIGNoYXIgKikmcmV0KTsKKwlpZiAocmV0bGVuICE9IDQpIHsKKwkJcHJpbnRrKCJEaWRuJ3QgcmVhZCBhbGwgYnl0ZXMgaW4gZmxhc2hfcmVhZF91MzIoKS4gUmV0dXJuZWQgJWRcbiIsIHJlcyk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludAorZmxhc2hfc2FmZV93cml0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLAorCQkgY29uc3QgdV9jaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzaXplX3QgcmV0bGVuOworCWludCByZXM7CisKKwlEMyhwcmludGsoS0VSTl9OT1RJQ0UgImZsYXNoX3NhZmVfd3JpdGUoJXAsICUwOHgsICVwLCAlMDh4KVxuIiwKKwkJICBtdGQsICh1bnNpZ25lZCBpbnQpIHRvLCBidWYsIGNvdW50KSk7CisKKwlyZXMgPSBNVERfV1JJVEUobXRkLCB0bywgY291bnQsICZyZXRsZW4sIGJ1Zik7CisJaWYgKHJldGxlbiAhPSBjb3VudCkgeworCQlwcmludGsoIkRpZG4ndCB3cml0ZSBhbGwgYnl0ZXMgaW4gZmxhc2hfc2FmZV93cml0ZSgpLiBSZXR1cm5lZCAlZFxuIiwgcmVzKTsKKwl9CisJcmV0dXJuIHJlcz9yZXM6cmV0bGVuOworfQorCisKK3N0YXRpYyBpbnQKK2ZsYXNoX3NhZmVfd3JpdGV2KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCBzdHJ1Y3Qga3ZlYyAqdmVjcywKKwkJCXVuc2lnbmVkIGxvbmcgaW92ZWNfY250LCBsb2ZmX3QgdG8pCit7CisJc2l6ZV90IHJldGxlbiwgcmV0bGVuX2E7CisJaW50IGk7CisJaW50IHJlczsKKworCUQzKHByaW50ayhLRVJOX05PVElDRSAiZmxhc2hfc2FmZV93cml0ZXYoJXAsICUwOHgsICVwKVxuIiwKKwkJICBtdGQsICh1bnNpZ25lZCBpbnQpIHRvLCB2ZWNzKSk7CisJCisJaWYgKG10ZC0+d3JpdGV2KSB7CisJCXJlcyA9IE1URF9XUklURVYobXRkLCB2ZWNzLCBpb3ZlY19jbnQsIHRvLCAmcmV0bGVuKTsKKwkJcmV0dXJuIHJlcyA/IHJlcyA6IHJldGxlbjsKKwl9CisJLyogTm90IGltcGxlbWVudGVkIHdyaXRldi4gUmVwZWF0ZWRseSB1c2Ugd3JpdGUgLSBvbiB0aGUgbm90IHNvCisJICAgdW5yZWFzb25hYmxlIGFzc3VtcHRpb24gdGhhdCB0aGUgbXRkIGRyaXZlciBkb2Vzbid0IGNhcmUgaG93CisJICAgbWFueSB3cml0ZSBjeWNsZXMgd2UgdXNlLiAqLworCXJlcz0wOworCXJldGxlbj0wOworCisJZm9yIChpPTA7ICFyZXMgJiYgaTxpb3ZlY19jbnQ7IGkrKykgeworCQlyZXMgPSBNVERfV1JJVEUobXRkLCB0bywgdmVjc1tpXS5pb3ZfbGVuLCAmcmV0bGVuX2EsIHZlY3NbaV0uaW92X2Jhc2UpOworCQlpZiAocmV0bGVuX2EgIT0gdmVjc1tpXS5pb3ZfbGVuKSB7CisJCQlwcmludGsoIkRpZG4ndCB3cml0ZSBhbGwgYnl0ZXMgaW4gZmxhc2hfc2FmZV93cml0ZXYoKS4gUmV0dXJuZWQgJWRcbiIsIHJlcyk7CisJCQlpZiAoaSAhPSBpb3ZlY19jbnQtMSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQkvKiBJZiByZXMgaXMgbm9uLXplcm8sIHJldGxlbl9hIGlzIHVuZGVmaW5lZCwgYnV0IHdlIGRvbid0CisJCSAgIGNhcmUgYmVjYXVzZSBpbiB0aGF0IGNhc2UgaXQncyBub3QgZ29pbmcgdG8gYmUgCisJCSAgIHJldHVybmVkIGFueXdheS4KKwkJKi8KKwkJdG8gKz0gcmV0bGVuX2E7CisJCXJldGxlbiArPSByZXRsZW5fYTsKKwl9CisJcmV0dXJuIHJlcz9yZXM6cmV0bGVuOworfQorCisKK3N0YXRpYyBpbnQKK2ZsYXNoX21lbXNldChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLAorCSAgICAgY29uc3QgdV9jaGFyIGMsIHNpemVfdCBzaXplKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBhdHRlcm5bNjRdOworCWludCBpOworCisJLyogZmlsbCB1cCBwYXR0ZXJuICovCisKKwlmb3IoaSA9IDA7IGkgPCA2NDsgaSsrKQorCQlwYXR0ZXJuW2ldID0gYzsKKworCS8qIHdyaXRlIGFzIG1hbnkgNjQtYnl0ZSBjaHVua3MgYXMgd2UgY2FuICovCisKKwl3aGlsZSAoc2l6ZSA+PSA2NCkgeworCQlmbGFzaF9zYWZlX3dyaXRlKG10ZCwgdG8sIHBhdHRlcm4sIDY0KTsKKwkJc2l6ZSAtPSA2NDsKKwkJdG8gKz0gNjQ7CisJfQorCisJLyogYW5kIHRoZSByZXN0ICovCisKKwlpZihzaXplKQorCQlmbGFzaF9zYWZlX3dyaXRlKG10ZCwgdG8sIHBhdHRlcm4sIHNpemUpOworCisJcmV0dXJuIHNpemU7Cit9CisKKworc3RhdGljIHZvaWQKK2ludHJlcF9lcmFzZV9jYWxsYmFjayhzdHJ1Y3QgZXJhc2VfaW5mbyAqZG9uZSkKK3sKKwl3YWl0X3F1ZXVlX2hlYWRfdCAqd2FpdF9xOworCisJd2FpdF9xID0gKHdhaXRfcXVldWVfaGVhZF90ICopZG9uZS0+cHJpdjsKKworCXdha2VfdXAod2FpdF9xKTsKK30KKworCitzdGF0aWMgaW50CitmbGFzaF9lcmFzZV9yZWdpb24oc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBzdGFydCwKKwkJICAgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGVyYXNlX2luZm8gKmVyYXNlOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcTsKKworCWVyYXNlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVyYXNlX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVyYXNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndhaXRfcSk7CisKKwllcmFzZS0+bXRkID0gbXRkOworCWVyYXNlLT5jYWxsYmFjayA9IGludHJlcF9lcmFzZV9jYWxsYmFjazsKKwllcmFzZS0+YWRkciA9IHN0YXJ0OworCWVyYXNlLT5sZW4gPSBzaXplOworCWVyYXNlLT5wcml2ID0gKHVfbG9uZykmd2FpdF9xOworCisJLyogRklYTUU6IFVzZSBUQVNLX0lOVEVSUlVQVElCTEUgYW5kIGRlYWwgd2l0aCBiZWluZyBpbnRlcnJ1cHRlZCAqLworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZSgmd2FpdF9xLCAmd2FpdCk7CisKKwlpZiAoTVREX0VSQVNFKG10ZCwgZXJhc2UpIDwgMCkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmd2FpdF9xLCAmd2FpdCk7CisJCWtmcmVlKGVyYXNlKTsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICJmbGFzaDogZXJhc2Ugb2YgcmVnaW9uIFsweCVseCwgMHglbHhdICIKKwkJICAgICAgICJ0b3RhbGx5IGZhaWxlZFxuIiwgKGxvbmcpc3RhcnQsIChsb25nKXN0YXJ0ICsgc2l6ZSk7CisKKwkJcmV0dXJuIC0xOworCX0KKworCXNjaGVkdWxlKCk7IC8qIFdhaXQgZm9yIGZsYXNoIHRvIGZpbmlzaC4gKi8KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmd2FpdF9xLCAmd2FpdCk7CisKKwlrZnJlZShlcmFzZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyByb3V0aW5lIGNhbGN1bGF0ZXMgY2hlY2tzdW1zIGluIEpGRlMuICAqLworc3RhdGljIF9fdTMyCitqZmZzX2NoZWNrc3VtKGNvbnN0IHZvaWQgKmRhdGEsIGludCBzaXplKQoreworCV9fdTMyIHN1bSA9IDA7CisJX191OCAqcHRyID0gKF9fdTggKilkYXRhOworCXdoaWxlIChzaXplLS0gPiAwKSB7CisJCXN1bSArPSAqcHRyKys7CisJfQorCUQzKHByaW50aygiLCByZXN1bHQ6IDB4JTA4eFxuIiwgc3VtKSk7CisJcmV0dXJuIHN1bTsKK30KKworCitzdGF0aWMgaW50CitqZmZzX2NoZWNrc3VtX2ZsYXNoKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgc3RhcnQsIGludCBzaXplLCBfX3UzMiAqcmVzdWx0KQoreworCV9fdTMyIHN1bSA9IDA7CisJbG9mZl90IHB0ciA9IHN0YXJ0OworCV9fdTggKnJlYWRfYnVmOworCWludCBpLCBsZW5ndGg7CisKKwkvKiBBbGxvY2F0ZSByZWFkIGJ1ZmZlciAqLworCXJlYWRfYnVmID0gKF9fdTggKikga21hbGxvYyAoc2l6ZW9mKF9fdTgpICogNDA5NiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZWFkX2J1ZikgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImttYWxsb2MgZmFpbGVkIGluIGpmZnNfY2hlY2tzdW1fZmxhc2goKVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiBMb29wIHVudGlsIGNoZWNrc3VtIGRvbmUgKi8KKwl3aGlsZSAoc2l6ZSkgeworCQkvKiBHZXQgYW1vdW50IG9mIGRhdGEgdG8gcmVhZCAqLworCQlpZiAoc2l6ZSA8IDQwOTYpCisJCQlsZW5ndGggPSBzaXplOworCQllbHNlCisJCQlsZW5ndGggPSA0MDk2OworCisJCS8qIFBlcmZvcm0gZmxhc2ggcmVhZCAqLworCQlEMyhwcmludGsoS0VSTl9OT1RJQ0UgImpmZnNfY2hlY2tzdW1fZmxhc2hcbiIpKTsKKwkJZmxhc2hfc2FmZV9yZWFkKG10ZCwgcHRyLCAmcmVhZF9idWZbMF0sIGxlbmd0aCk7CisKKwkJLyogQ29tcHV0ZSBjaGVja3N1bSAqLworCQlmb3IgKGk9MDsgaSA8IGxlbmd0aCA7IGkrKykKKwkJCXN1bSArPSByZWFkX2J1ZltpXTsKKworCQkvKiBVcGRhdGUgcG9pbnRlciBhbmQgc2l6ZSAqLworCQlzaXplIC09IGxlbmd0aDsKKwkJcHRyICs9IGxlbmd0aDsKKwl9CisKKwkvKiBGcmVlIHJlYWQgYnVmZmVyICovCisJa2ZyZWUgKHJlYWRfYnVmKTsKKworCS8qIFJldHVybiByZXN1bHQgKi8KKwlEMyhwcmludGsoImNoZWNrc3VtIHJlc3VsdDogMHglMDh4XG4iLCBzdW0pKTsKKwkqcmVzdWx0ID0gc3VtOworCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGpmZnNfZm1fd3JpdGVfbG9jayhzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYykKK3sKKyAgLy8JZG93bigmZm1jLT53bG9jayk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgamZmc19mbV93cml0ZV91bmxvY2soc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMpCit7CisgIC8vCXVwKCZmbWMtPndsb2NrKTsKK30KKworCisvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgc3RydWN0IGpmZnNfZmlsZS4gICovCitzdGF0aWMgc3RydWN0IGpmZnNfZmlsZSAqCitqZmZzX2NyZWF0ZV9maWxlKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMsCisJCSBjb25zdCBzdHJ1Y3QgamZmc19yYXdfaW5vZGUgKnJhd19pbm9kZSkKK3sKKwlzdHJ1Y3QgamZmc19maWxlICpmOworCisJaWYgKCEoZiA9IChzdHJ1Y3QgamZmc19maWxlICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGpmZnNfZmlsZSksCisJCQkJCSAgICAgIEdGUF9LRVJORUwpKSkgeworCQlEKHByaW50aygiamZmc19jcmVhdGVfZmlsZSgpOiBGYWlsZWQhXG4iKSk7CisJCXJldHVybiBOVUxMOworCX0KKwlub19qZmZzX2ZpbGUrKzsKKwltZW1zZXQoZiwgMCwgc2l6ZW9mKHN0cnVjdCBqZmZzX2ZpbGUpKTsKKwlmLT5pbm8gPSByYXdfaW5vZGUtPmlubzsKKwlmLT5waW5vID0gcmF3X2lub2RlLT5waW5vOworCWYtPm5saW5rID0gcmF3X2lub2RlLT5ubGluazsKKwlmLT5kZWxldGVkID0gcmF3X2lub2RlLT5kZWxldGVkOworCWYtPmMgPSBjOworCisJcmV0dXJuIGY7Cit9CisKKworLyogQnVpbGQgYSBjb250cm9sIGJsb2NrIGZvciB0aGUgZmlsZSBzeXN0ZW0uICAqLworc3RhdGljIHN0cnVjdCBqZmZzX2NvbnRyb2wgKgoramZmc19jcmVhdGVfY29udHJvbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBqZmZzX2NvbnRyb2wgKmM7CisJcmVnaXN0ZXIgaW50IHMgPSBzaXplb2Yoc3RydWN0IGpmZnNfY29udHJvbCk7CisJaW50IGk7CisJRChjaGFyICp0ID0gMCk7CisKKwlEMihwcmludGsoImpmZnNfY3JlYXRlX2NvbnRyb2woKVxuIikpOworCisJaWYgKCEoYyA9IChzdHJ1Y3QgamZmc19jb250cm9sICopa21hbGxvYyhzLCBHRlBfS0VSTkVMKSkpIHsKKwkJZ290byBmYWlsX2NvbnRyb2w7CisJfQorCURKTShub19qZmZzX2NvbnRyb2wrKyk7CisJYy0+cm9vdCA9IE5VTEw7CisJYy0+Z2NfdGFzayA9IE5VTEw7CisJYy0+aGFzaF9sZW4gPSBKRkZTX0hBU0hfU0laRTsKKwlzID0gc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpICogYy0+aGFzaF9sZW47CisJaWYgKCEoYy0+aGFzaCA9IChzdHJ1Y3QgbGlzdF9oZWFkICopa21hbGxvYyhzLCBHRlBfS0VSTkVMKSkpIHsKKwkJZ290byBmYWlsX2hhc2g7CisJfQorCURKTShub19oYXNoKyspOworCWZvciAoaSA9IDA7IGkgPCBjLT5oYXNoX2xlbjsgaSsrKQorCQlJTklUX0xJU1RfSEVBRCgmYy0+aGFzaFtpXSk7CisJaWYgKCEoYy0+Zm1jID0gamZmc19idWlsZF9iZWdpbihjLCBNSU5PUihzYi0+c19kZXYpKSkpIHsKKwkJZ290byBmYWlsX2ZtaW5pdDsKKwl9CisJYy0+bmV4dF9pbm8gPSBKRkZTX01JTl9JTk8gKyAxOworCWMtPmRlbGV0ZV9saXN0ID0gKHN0cnVjdCBqZmZzX2RlbGV0ZV9saXN0ICopIDA7CisJcmV0dXJuIGM7CisKK2ZhaWxfZm1pbml0OgorCUQodCA9ICJjLT5mbWMiKTsKK2ZhaWxfaGFzaDoKKwlrZnJlZShjKTsKKwlESk0obm9famZmc19jb250cm9sLS0pOworCUQodCA9IHQgPyB0IDogImMtPmhhc2giKTsKK2ZhaWxfY29udHJvbDoKKwlEKHQgPSB0ID8gdCA6ICJjb250cm9sIik7CisJRChwcmludGsoImpmZnNfY3JlYXRlX2NvbnRyb2woKTogQWxsb2NhdGlvbiBmYWlsZWQ6ICglcylcbiIsIHQpKTsKKwlyZXR1cm4gKHN0cnVjdCBqZmZzX2NvbnRyb2wgKikwOworfQorCisKKy8qIENsZWFuIHVwIGFsbCBkYXRhIHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlIHN5c3RlbS4gICovCit2b2lkCitqZmZzX2NsZWFudXBfY29udHJvbChzdHJ1Y3QgamZmc19jb250cm9sICpjKQoreworCUQyKHByaW50aygiamZmc19jbGVhbnVwX2NvbnRyb2woKVxuIikpOworCisJaWYgKCFjKSB7CisJCUQocHJpbnRrKCJqZmZzX2NsZWFudXBfY29udHJvbCgpOiBjID09IE5VTEwgISEhXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoYy0+ZGVsZXRlX2xpc3QpIHsKKwkJc3RydWN0IGpmZnNfZGVsZXRlX2xpc3QgKmRlbGV0ZV9saXN0X2VsZW1lbnQ7CisJCWRlbGV0ZV9saXN0X2VsZW1lbnQgPSBjLT5kZWxldGVfbGlzdDsKKwkJYy0+ZGVsZXRlX2xpc3QgPSBjLT5kZWxldGVfbGlzdC0+bmV4dDsKKwkJa2ZyZWUoZGVsZXRlX2xpc3RfZWxlbWVudCk7CisJfQorCisJLyogRnJlZSBhbGwgZmlsZXMgYW5kIG5vZGVzLiAgKi8KKwlpZiAoYy0+aGFzaCkgeworCQlqZmZzX2ZvcmVhY2hfZmlsZShjLCBqZmZzX2ZyZWVfbm9kZV9saXN0KTsKKwkJamZmc19mb3JlYWNoX2ZpbGUoYywgamZmc19mcmVlX2ZpbGUpOworCQlrZnJlZShjLT5oYXNoKTsKKwkJREpNKG5vX2hhc2gtLSk7CisJfQorCWpmZnNfY2xlYW51cF9mbWNvbnRyb2woYy0+Zm1jKTsKKwlrZnJlZShjKTsKKwlESk0obm9famZmc19jb250cm9sLS0pOworCUQzKHByaW50aygiamZmc19jbGVhbnVwX2NvbnRyb2woKTogTGVhdmluZy4uLlxuIikpOworfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gYWRkcyBhIHZpcnR1YWwgcm9vdCBub2RlIHRvIHRoZSBpbi1SQU0gcmVwcmVzZW50YXRpb24uCisgICBDYWxsZWQgYnkgamZmc19idWlsZF9mcygpLiAgKi8KK3N0YXRpYyBpbnQKK2pmZnNfYWRkX3ZpcnR1YWxfcm9vdChzdHJ1Y3QgamZmc19jb250cm9sICpjKQoreworCXN0cnVjdCBqZmZzX2ZpbGUgKnJvb3Q7CisJc3RydWN0IGpmZnNfbm9kZSAqbm9kZTsKKworCUQyKHByaW50aygiamZmc19hZGRfdmlydHVhbF9yb290KCk6ICIKKwkJICAiQ3JlYXRpbmcgYSB2aXJ0dWFsIHJvb3QgZGlyZWN0b3J5LlxuIikpOworCisJaWYgKCEocm9vdCA9IChzdHJ1Y3QgamZmc19maWxlICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGpmZnNfZmlsZSksCisJCQkJCQkgR0ZQX0tFUk5FTCkpKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlub19qZmZzX2ZpbGUrKzsKKwlpZiAoIShub2RlID0gamZmc19hbGxvY19ub2RlKCkpKSB7CisJCWtmcmVlKHJvb3QpOworCQlub19qZmZzX2ZpbGUtLTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCURKTShub19qZmZzX25vZGUrKyk7CisJbWVtc2V0KG5vZGUsIDAsIHNpemVvZihzdHJ1Y3QgamZmc19ub2RlKSk7CisJbm9kZS0+aW5vID0gSkZGU19NSU5fSU5POworCW1lbXNldChyb290LCAwLCBzaXplb2Yoc3RydWN0IGpmZnNfZmlsZSkpOworCXJvb3QtPmlubyA9IEpGRlNfTUlOX0lOTzsKKwlyb290LT5tb2RlID0gU19JRkRJUiB8IFNfSVJXWFUgfCBTX0lSR1JQCisJCSAgICAgfCBTX0lYR1JQIHwgU19JUk9USCB8IFNfSVhPVEg7CisJcm9vdC0+YXRpbWUgPSByb290LT5tdGltZSA9IHJvb3QtPmN0aW1lID0gZ2V0X3NlY29uZHMoKTsKKwlyb290LT5ubGluayA9IDE7CisJcm9vdC0+YyA9IGM7CisJcm9vdC0+dmVyc2lvbl9oZWFkID0gcm9vdC0+dmVyc2lvbl90YWlsID0gbm9kZTsKKwlqZmZzX2luc2VydF9maWxlX2ludG9faGFzaChyb290KTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBUaGlzIGlzIHdoZXJlIHRoZSBmaWxlIHN5c3RlbSBpcyBidWlsdCBhbmQgaW5pdGlhbGl6ZWQuICAqLworaW50CitqZmZzX2J1aWxkX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGpmZnNfY29udHJvbCAqYzsKKwlpbnQgZXJyID0gMDsKKworCUQyKHByaW50aygiamZmc19idWlsZF9mcygpXG4iKSk7CisKKwlpZiAoIShjID0gamZmc19jcmVhdGVfY29udHJvbChzYikpKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljLT5idWlsZGluZ19mcyA9IDE7CisJYy0+c2IgPSBzYjsKKwlpZiAoKGVyciA9IGpmZnNfc2Nhbl9mbGFzaChjKSkgPCAwKSB7CisJCWlmKGVyciA9PSAtRUFHQUlOKXsKKwkJCS8qIHNjYW5fZmxhc2goKSB3YW50cyB1cyB0byB0cnkgb25jZSBtb3JlLiBBIGZsaXBwaW5nIAorCQkJICAgYml0cyBzZWN0b3Igd2FzIGRldGVjdCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzY2FuIGZsYXNoLgorCQkJICAgQ2xlYW4gdXAgb2xkIGFsbG9jYXRlZCBtZW1vcnkgYmVmb3JlIGdvaW5nIGluLgorCQkJKi8KKwkJCUQxKHByaW50aygiamZmc19idWlsZF9mczogQ2xlYW5pbmcgdXAgYWxsIGNvbnRyb2wgc3RydWN0dXJlcywiCisJCQkJICAiIHJlYWxsb2NhdGluZyB0aGVtIGFuZCB0cnlpbmcgbW91bnQgYWdhaW4uXG4iKSk7CisJCQlqZmZzX2NsZWFudXBfY29udHJvbChjKTsKKwkJCWlmICghKGMgPSBqZmZzX2NyZWF0ZV9jb250cm9sKHNiKSkpIHsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWMtPmJ1aWxkaW5nX2ZzID0gMTsKKwkJCWMtPnNiID0gc2I7CisKKwkJCWlmICgoZXJyID0gamZmc19zY2FuX2ZsYXNoKGMpKSA8IDApIHsKKwkJCQlnb3RvIGpmZnNfYnVpbGRfZnNfZmFpbDsKKwkJCX0JCQkKKwkJfWVsc2V7CisJCQlnb3RvIGpmZnNfYnVpbGRfZnNfZmFpbDsKKwkJfQorCX0KKworCS8qIEFkZCBhIHZpcnR1YWwgcm9vdCBub2RlIGlmIG5vIG9uZSBleGlzdHMuICAqLworCWlmICghamZmc19maW5kX2ZpbGUoYywgSkZGU19NSU5fSU5PKSkgeworCQlpZiAoKGVyciA9IGpmZnNfYWRkX3ZpcnR1YWxfcm9vdChjKSkgPCAwKSB7CisJCQlnb3RvIGpmZnNfYnVpbGRfZnNfZmFpbDsKKwkJfQorCX0KKworCXdoaWxlIChjLT5kZWxldGVfbGlzdCkgeworCQlzdHJ1Y3QgamZmc19maWxlICpmOworCQlzdHJ1Y3QgamZmc19kZWxldGVfbGlzdCAqZGVsZXRlX2xpc3RfZWxlbWVudDsKKworCQlpZiAoKGYgPSBqZmZzX2ZpbmRfZmlsZShjLCBjLT5kZWxldGVfbGlzdC0+aW5vKSkpIHsKKwkJCWYtPmRlbGV0ZWQgPSAxOworCQl9CisJCWRlbGV0ZV9saXN0X2VsZW1lbnQgPSBjLT5kZWxldGVfbGlzdDsKKwkJYy0+ZGVsZXRlX2xpc3QgPSBjLT5kZWxldGVfbGlzdC0+bmV4dDsKKwkJa2ZyZWUoZGVsZXRlX2xpc3RfZWxlbWVudCk7CisJfQorCisJLyogUmVtb3ZlIGRlbGV0ZWQgbm9kZXMuICAqLworCWlmICgoZXJyID0gamZmc19mb3JlYWNoX2ZpbGUoYywgamZmc19wb3NzaWJseV9kZWxldGVfZmlsZSkpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkpGRlM6IEZhaWxlZCB0byByZW1vdmUgZGVsZXRlZCBub2Rlcy5cbiIpOworCQlnb3RvIGpmZnNfYnVpbGRfZnNfZmFpbDsKKwl9CisJLyogUmVtb3ZlIHJlZHVuZGFudCBub2Rlcy4gIChXZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gdGhlCisJICAgcmV0dXJuIHZhbHVlIGluIHRoaXMgY2FzZS4pICAqLworCWpmZnNfZm9yZWFjaF9maWxlKGMsIGpmZnNfcmVtb3ZlX3JlZHVuZGFudF9ub2Rlcyk7CisJLyogVHJ5IHRvIGJ1aWxkIGEgdHJlZSBmcm9tIGFsbCB0aGUgbm9kZXMuICAqLworCWlmICgoZXJyID0gamZmc19mb3JlYWNoX2ZpbGUoYywgamZmc19pbnNlcnRfZmlsZV9pbnRvX3RyZWUpKSA8IDApIHsKKwkJcHJpbnRrKCJKRkZTOiBGYWlsZWQgdG8gYnVpbGQgdHJlZS5cbiIpOworCQlnb3RvIGpmZnNfYnVpbGRfZnNfZmFpbDsKKwl9CisJLyogQ29tcHV0ZSB0aGUgc2l6ZXMgb2YgYWxsIGZpbGVzIGluIHRoZSBmaWxlc3lzdGVtLiAgQWRqdXN0IGlmCisJICAgbmVjZXNzYXJ5LiAgKi8KKwlpZiAoKGVyciA9IGpmZnNfZm9yZWFjaF9maWxlKGMsIGpmZnNfYnVpbGRfZmlsZSkpIDwgMCkgeworCQlwcmludGsoIkpGRlM6IEZhaWxlZCB0byBidWlsZCBmaWxlIHN5c3RlbS5cbiIpOworCQlnb3RvIGpmZnNfYnVpbGRfZnNfZmFpbDsKKwl9CisJc2ItPnNfZnNfaW5mbyA9ICh2b2lkICopYzsKKwljLT5idWlsZGluZ19mcyA9IDA7CisKKwlEMShqZmZzX3ByaW50X2hhc2hfdGFibGUoYykpOworCUQxKGpmZnNfcHJpbnRfdHJlZShjLT5yb290LCAwKSk7CisKKwlyZXR1cm4gMDsKKworamZmc19idWlsZF9mc19mYWlsOgorCWpmZnNfY2xlYW51cF9jb250cm9sKGMpOworCXJldHVybiBlcnI7Cit9IC8qIGpmZnNfYnVpbGRfZnMoKSAgKi8KKworCisvKgorICBUaGlzIGNoZWNrcyBmb3Igc2VjdG9ycyB0aGF0IHdlcmUgYmVpbmcgZXJhc2VkIGluIHRoZWlyIHByZXZpb3VzIAorICBsaWZldGltZXMgYW5kIGZvciBzb21lIHJlYXNvbiBvciB0aGUgb3RoZXIgKHBvd2VyIGZhaWwgZXRjLiksIAorICB0aGUgZXJhc2UgY3ljbGVzIG5ldmVyIGNvbXBsZXRlZC4KKyAgQXMgdGhlIGZsYXNoIGFycmF5IHdvdWxkIGhhdmUgcmV2ZXJ0ZWQgYmFjayB0byByZWFkIHN0YXR1cywgCisgIHRoZXNlIHNlY3RvcnMgYXJlIGRldGVjdGVkIGJ5IHRoZSBzeW1wdG9tIG9mIHRoZSAiZmxpcHBpbmcgYml0cyIsCisgIGkuZS4gYml0cyBiZWluZyByZWFkIGJhY2sgZGlmZmVyZW50bHkgZnJvbSB0aGUgc2FtZSBsb2NhdGlvbiBpbgorICBmbGFzaCBpZiByZWFkIG11bHRpcGxlIHRpbWVzLgorICBUaGUgb25seSBzb2x1dGlvbiB0byB0aGlzIGlzIHRvIHJlLWVyYXNlIHRoZSBlbnRpcmUKKyAgc2VjdG9yLgorICBVbmZvcnR1bmF0ZWx5IGRldGVjdGluZyAiZmxpcHBpbmcgYml0cyIgaXMgbm90IGEgc2ltcGxlIGV4ZXJjaXNlCisgIGFzIGEgYml0IG1heSBiZSByZWFkIGJhY2sgYXQgMSBvciAwIGRlcGVuZGluZyBvbiB0aGUgYWxpZ25tZW50IAorICBvZiB0aGUgc3RhcnMgaW4gdGhlIHVuaXZlcnNlLgorICBUaGUgbGV2ZWwgb2YgY29uZmlkZW5jZSBpcyBpbiBkaXJlY3QgcHJvcG9ydGlvbiB0byB0aGUgbnVtYmVyIG9mIAorICBzY2FucyBkb25lLiBCeSBwb3dlciBmYWlsIHRlc3RpbmcgSSAoVmlwaW4pIGhhdmUgYmVlbiBhYmxlIHRvIAorICBwcm9vdmUgdGhhdCByZWFkaW5nIHR3aWNlIGlzIG5vdCBlbm91Z2guCisgIE1heWJlIDQgdGltZXM/IENoYW5nZSBOVU1fUkVSRUFEUyB0byBhIGhpZ2hlciBudW1iZXIgaWYgeW91IHdhbnQKKyAgYSAoZXZlbikgaGlnaGVyIGRlZ3JlZSBvZiBjb25maWRlbmNlIGluIHlvdXIgbW91bnQgcHJvY2Vzcy4gCisgIEEgaGlnaGVyIG51bWJlciB3b3VsZCBvZiBjb3Vyc2Ugc2xvdyBkb3duIHlvdXIgbW91bnQuCisqLworc3RhdGljIGludCBjaGVja19wYXJ0bHlfZXJhc2VkX3NlY3RvcnMoc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMpeworCisjZGVmaW5lIE5VTV9SRVJFQURTICAgICAgICAgICAgIDQgLyogc2VlIG5vdGUgYWJvdmUgKi8KKyNkZWZpbmUgUkVBRF9BSEVBRF9CWVRFUyAgICAgICAgNDA5NiAvKiBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCwgCisJCQkJCXVzdWFsbHkgc2V0IHRvIGtlcm5lbCBwYWdlIHNpemUgKi8KKworCV9fdTggKnJlYWRfYnVmMTsKKwlfX3U4ICpyZWFkX2J1ZjI7CisKKwlpbnQgZXJyID0gMDsKKwlpbnQgcmV0bGVuOworCWludCBpOworCWludCBjbnQ7CisJX191MzIgb2Zmc2V0OworCWxvZmZfdCBwb3MgPSAwOworCWxvZmZfdCBlbmQgPSBmbWMtPmZsYXNoX3NpemU7CisKKworCS8qIEFsbG9jYXRlIHJlYWQgYnVmZmVycyAqLworCXJlYWRfYnVmMSA9IChfX3U4ICopIGttYWxsb2MgKHNpemVvZihfX3U4KSAqIFJFQURfQUhFQURfQllURVMsIEdGUF9LRVJORUwpOworCWlmICghcmVhZF9idWYxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlYWRfYnVmMiA9IChfX3U4ICopIGttYWxsb2MgKHNpemVvZihfX3U4KSAqIFJFQURfQUhFQURfQllURVMsIEdGUF9LRVJORUwpOworCWlmICghcmVhZF9idWYyKSB7CisJCWtmcmVlKHJlYWRfYnVmMSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworIENIRUNLX05FWFQ6CisJd2hpbGUocG9zIDwgZW5kKXsKKwkJCisJCUQxKHByaW50aygiY2hlY2tfcGFydGx5X2VyYXNlZF9zZWN0b3IoKTpjaGVja2luZyBzZWN0b3Igd2hpY2ggY29udGFpbnMiCisJCQkgICIgb2Zmc2V0IDB4JXggZm9yIGZsaXBwaW5nIGJpdHMuLlxuIiwgKF9fdTMyKXBvcykpOworCQkKKwkJcmV0bGVuID0gZmxhc2hfc2FmZV9yZWFkKGZtYy0+bXRkLCBwb3MsCisJCQkJCSAmcmVhZF9idWYxWzBdLCBSRUFEX0FIRUFEX0JZVEVTKTsKKwkJcmV0bGVuICY9IH4zOworCQkKKwkJZm9yKGNudCA9IDA7IGNudCA8IE5VTV9SRVJFQURTOyBjbnQrKyl7CisJCQkodm9pZClmbGFzaF9zYWZlX3JlYWQoZm1jLT5tdGQsIHBvcywKKwkJCQkJICAgICAgJnJlYWRfYnVmMlswXSwgUkVBRF9BSEVBRF9CWVRFUyk7CisJCQkKKwkJCWZvciAoaT0wIDsgaSA8IHJldGxlbiA7IGkrPTQpIHsKKwkJCQkvKiBidWZmZXJzIE1VU1QgbWF0Y2gsIGRvdWJsZSB3b3JkIGZvciB3b3JkISAqLworCQkJCWlmKCooKF9fdTMyICopICZyZWFkX2J1ZjFbaV0pICE9CisJCQkJICAgKigoX191MzIgKikgJnJlYWRfYnVmMltpXSkKKwkJCQkgICApeworCQkJCSAgICAgICAgLyogZmxpcHBpbmcgYml0cyBkZXRlY3RlZCwgdGltZSB0byBlcmFzZSBzZWN0b3IgKi8KKwkJCQkJLyogVGhpcyB3aWxsIGhlbHAgdXMgbG9nIHNvbWUgc3RhdGlzdGljcyBldGMuICovCisJCQkJCUQxKHByaW50aygiRmxpcHBpbmcgYml0cyBkZXRlY3RlZCBpbiByZS1yZWFkIHJvdW5kOiVpIG9mICVpXG4iLAorCQkJCQkgICAgICAgY250LCBOVU1fUkVSRUFEUykpOworCQkJCQlEMShwcmludGsoImNoZWNrX3BhcnRseV9lcmFzZWRfc2VjdG9yczpmbGlwcGluZyBiaXRzIGRldGVjdGVkIgorCQkJCQkJICAiIEBvZmZzZXQ6MHgleCgweCV4IT0weCV4KVxuIiwKKwkJCQkJCSAgKF9fdTMyKXBvcytpLCAqKChfX3UzMiAqKSAmcmVhZF9idWYxW2ldKSwgCisJCQkJCQkgICooKF9fdTMyICopICZyZWFkX2J1ZjJbaV0pKSk7CisJCQkJCQorCQkJCSAgICAgICAgLyogY2FsY3VsYXRlIHN0YXJ0IG9mIHByZXNlbnQgc2VjdG9yICovCisJCQkJCW9mZnNldCA9ICgoKF9fdTMyKXBvcytpKS8oX191MzIpZm1jLT5zZWN0b3Jfc2l6ZSkgKiAoX191MzIpZm1jLT5zZWN0b3Jfc2l6ZTsKKwkJCQkJCisJCQkJCUQxKHByaW50aygiY2hlY2tfcGFydGx5X2VyYXNlZF9zZWN0b3IoKTplcmFzaW5nIHNlY3RvciBzdGFydGluZyAweCV4LlxuIiwKKwkJCQkJCSAgb2Zmc2V0KSk7CisJCQkJCQorCQkJCQlpZiAoZmxhc2hfZXJhc2VfcmVnaW9uKGZtYy0+bXRkLAorCQkJCQkJCSAgICAgICBvZmZzZXQsIGZtYy0+c2VjdG9yX3NpemUpIDwgMCkgeworCQkJCQkJcHJpbnRrKEtFUk5fRVJSICJKRkZTOiBFcmFzZSBvZiBmbGFzaCBmYWlsZWQuICIKKwkJCQkJCSAgICAgICAib2Zmc2V0ID0gJXUsIGVyYXNlX3NpemUgPSAlZFxuIiwKKwkJCQkJCSAgICAgICBvZmZzZXQgLCBmbWMtPnNlY3Rvcl9zaXplKTsKKwkJCQkJCQorCQkJCQkJZXJyID0gLUVJTzsKKwkJCQkJCWdvdG8gcmV0dXJuQmFjazsKKworCQkJCQl9ZWxzZXsKKwkJCQkJCUQxKHByaW50aygiSkZGUzogRXJhc2Ugb2YgZmxhc2ggc2VjdG9yIEAweCV4IHN1Y2Nlc3NmdWwuXG4iLAorCQkJCQkJICAgICAgIG9mZnNldCkpOworCQkJCQkJLyogc2tpcCBhaGVhZCB0byB0aGUgbmV4dCBzZWN0b3IgKi8KKwkJCQkJCXBvcyA9ICgoKF9fdTMyKXBvcytpKS8oX191MzIpZm1jLT5zZWN0b3Jfc2l6ZSkgKiAoX191MzIpZm1jLT5zZWN0b3Jfc2l6ZTsKKwkJCQkJCXBvcyArPSBmbWMtPnNlY3Rvcl9zaXplOworCQkJCQkJZ290byBDSEVDS19ORVhUOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXBvcyArPSBSRUFEX0FIRUFEX0JZVEVTOworCX0KKworIHJldHVybkJhY2s6CisJa2ZyZWUocmVhZF9idWYxKTsKKwlrZnJlZShyZWFkX2J1ZjIpOworCisJRDIocHJpbnRrKCJjaGVja19wYXJ0bHlfZXJhc2VkX3NlY3RvcigpOkRvbmUgY2hlY2tpbmcgYWxsIHNlY3RvcnMgdGlsbCBvZmZzZXQgMHgleCBmb3IgZmxpcHBpbmcgYml0cy5cbiIsCisJCSAgKF9fdTMyKXBvcykpOworCisJcmV0dXJuIGVycjsKKworfS8qIGVuZCBjaGVja19wYXJ0bHlfZXJhc2VkX3NlY3RvcnMoKSAqLworCisKKworLyogU2NhbiB0aGUgd2hvbGUgZmxhc2ggbWVtb3J5IGluIG9yZGVyIHRvIGZpbmQgYWxsIG5vZGVzIGluIHRoZQorICAgZmlsZSBzeXN0ZW1zLiAgKi8KK3N0YXRpYyBpbnQKK2pmZnNfc2Nhbl9mbGFzaChzdHJ1Y3QgamZmc19jb250cm9sICpjKQoreworCWNoYXIgbmFtZVtKRkZTX01BWF9OQU1FX0xFTiArIDJdOworCXN0cnVjdCBqZmZzX3Jhd19pbm9kZSByYXdfaW5vZGU7CisJc3RydWN0IGpmZnNfbm9kZSAqbm9kZSA9IE5VTEw7CisJc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMgPSBjLT5mbWM7CisJX191MzIgY2hlY2tzdW07CisJX191OCB0bXBfYWNjdXJhdGU7CisJX191MTYgdG1wX2Noa3N1bTsKKwlfX3UzMiBkZWxldGVkX2ZpbGU7CisJbG9mZl90IHBvcyA9IDA7CisJbG9mZl90IHN0YXJ0OworCWxvZmZfdCB0ZXN0X3N0YXJ0OworCWxvZmZfdCBlbmQgPSBmbWMtPmZsYXNoX3NpemU7CisJX191OCAqcmVhZF9idWY7CisJaW50IGksIGxlbiwgcmV0bGVuOworCV9fdTMyIG9mZnNldDsKKworCV9fdTMyIGZyZWVfY2h1bmtfc2l6ZTE7CisJX191MzIgZnJlZV9jaHVua19zaXplMjsKKworCQorI2RlZmluZSBOVU1GUkVFQUxMT1dFRCAgICAgMiAgICAgICAgLyogMiBjaHVua3Mgb2YgYXQgbGVhc3QgZXJhc2Ugc2l6ZSBzcGFjZSBhbGxvd2VkICovCisJaW50IG51bV9mcmVlX3NwYWNlID0gMDsgICAgICAgLyogRmxhZyBlcnIgaWYgbW9yZSB0aGFuIFRXTworCQkJCSAgICAgICBmcmVlIGJsb2NrcyBmb3VuZC4gVGhpcyBpcyBOT1QgYWxsb3dlZAorCQkJCSAgICAgICBieSB0aGUgY3VycmVudCBqZmZzIGRlc2lnbi4KKwkJCQkgICAgKi8KKwlpbnQgbnVtX2ZyZWVfc3BjX25vdF9hY2NwID0gMDsgLyogRm9yIGRlYnVnZ2luZyBwdXJwb3NlZCBrZWVwIGNvdW50IAorCQkJCQlvZiBob3cgbXVjaCBmcmVlIHNwYWNlIHdhcyByZWplY3RlZCBhbmQKKwkJCQkJbWFya2VkIGRpcnR5CisJCQkJICAgICAqLworCisJRDEocHJpbnRrKCJqZmZzX3NjYW5fZmxhc2goKTogc3RhcnQgcG9zID0gMHglbHgsIGVuZCA9IDB4JWx4XG4iLAorCQkgIChsb25nKXBvcywgKGxvbmcpZW5kKSk7CisKKwlmbGFzaF9zYWZlX2FjcXVpcmUoZm1jLT5tdGQpOworCisJLyoKKwkgIGNoZWNrIGFuZCBtYWtlIHN1cmUgdGhhdCBhbnkgc2VjdG9yIGRvZXMgbm90IHN1ZmZlcgorCSAgZnJvbSB0aGUgInBhcnRseSBlcmFzZWQsIGJpdCBmbGlwcGluZyBzeW5kcm9tZSIgKFRNIFZpcGluIDopCisJICBJZiBzbywgb2ZmZW5kaW5nIHNlY3RvcnMgd2lsbCBiZSBlcmFzZWQuCisJKi8KKwlpZihjaGVja19wYXJ0bHlfZXJhc2VkX3NlY3RvcnMoZm1jKSA8IDApeworCisJCWZsYXNoX3NhZmVfcmVsZWFzZShmbWMtPm10ZCk7CisJCXJldHVybiAtRUlPOyAvKiBiYWQsIGJhZCwgYmFkIGVycm9yLiBDYW5ub3QgY29udGludWUuKi8KKwl9CisKKwkvKiBBbGxvY2F0ZSByZWFkIGJ1ZmZlciAqLworCXJlYWRfYnVmID0gKF9fdTggKikga21hbGxvYyAoc2l6ZW9mKF9fdTgpICogNDA5NiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZWFkX2J1ZikgeworCQlmbGFzaF9zYWZlX3JlbGVhc2UoZm1jLT5tdGQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJCQkgICAgICAKKwkvKiBTdGFydCB0aGUgc2Nhbi4gICovCisJd2hpbGUgKHBvcyA8IGVuZCkgeworCQlkZWxldGVkX2ZpbGUgPSAwOworCisJCS8qIFJlbWVtYmVyIHRoZSBwb3NpdGlvbiBmcm9tIHdoZXJlIHdlIHN0YXJ0ZWQgdGhpcyBzY2FuLiAgKi8KKwkJc3RhcnQgPSBwb3M7CisKKwkJc3dpdGNoIChmbGFzaF9yZWFkX3UzMihmbWMtPm10ZCwgcG9zKSkgeworCQljYXNlIEpGRlNfRU1QVFlfQklUTUFTSzoKKwkJCS8qIFdlIGhhdmUgZm91bmQgMHhmZmZmZmZmZiBhdCB0aGlzIHBvc2l0aW9uLiAgV2UgaGF2ZSB0bworCQkJICAgc2NhbiB0aGUgcmVzdCBvZiB0aGUgZmxhc2ggdGlsbCB0aGUgZW5kIG9yIHRpbGwKKwkJCSAgIHNvbWV0aGluZyBlbHNlIHRoYW4gMHhmZmZmZmZmZiBpcyBmb3VuZC4KKwkJICAgICAgICAgICBLZWVwIGdvaW5nIHRpbGwgd2UgZG8gbm90IGZpbmQgSkZGU19FTVBUWV9CSVRNQVNLIAorCQkJICAgYW55bW9yZSAqLworCisJCQlEMShwcmludGsoImpmZnNfc2Nhbl9mbGFzaCgpOiAweGZmZmZmZmZmIGF0IHBvcyAweCVseC5cbiIsCisJCQkJICAobG9uZylwb3MpKTsKKworCQkgICAgICAgIHdoaWxlKHBvcyA8IGVuZCl7CisKKwkJCSAgICAgIGxlbiA9IGVuZCAtIHBvcyA8IDQwOTYgPyBlbmQgLSBwb3MgOiA0MDk2OworCQkJICAgICAgCisJCQkgICAgICByZXRsZW4gPSBmbGFzaF9zYWZlX3JlYWQoZm1jLT5tdGQsIHBvcywKKwkJCQkJCSAmcmVhZF9idWZbMF0sIGxlbik7CisKKwkJCSAgICAgIHJldGxlbiAmPSB+MzsKKwkJCSAgICAgIAorCQkJICAgICAgZm9yIChpPTAgOyBpIDwgcmV0bGVuIDsgaSs9NCwgcG9zICs9IDQpIHsKKwkJCQkgICAgICBpZigqKChfX3UzMiAqKSAmcmVhZF9idWZbaV0pICE9CisJCQkJCSBKRkZTX0VNUFRZX0JJVE1BU0spCisJCQkJCWJyZWFrOworCQkJICAgICAgfQorCQkJICAgICAgaWYgKGkgPT0gcmV0bGVuKQorCQkJCSAgICBjb250aW51ZTsKKwkJCSAgICAgIGVsc2UKKwkJCQkgICAgYnJlYWs7CisJCQl9CisKKwkJCUQxKHByaW50aygiamZmc19zY2FuX2ZsYXNoKCk6MHhmZmZmZmZmZiBlbmRlZCBhdCBwb3MgMHglbHguXG4iLAorCQkJCSAgKGxvbmcpcG9zKSk7CisJCQkKKwkJCS8qIElmIHNvbWUgZnJlZSBzcGFjZSBlbmRzIGluIHRoZSBtaWRkbGUgb2YgYSBzZWN0b3IsCisJCQkgICB0cmVhdCBpdCBhcyBkaXJ0eSByYXRoZXIgdGhhbiBjbGVhbi4KKwkJCSAgIFRoaXMgaXMgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIG9uZSB0aHJlYWQgCisJCQkgICBhbGxvY2F0ZWQgc3BhY2UgZm9yIGEgbm9kZSwgYnV0IGRpZG4ndCBnZXQgdG8KKwkJCSAgIGFjdHVhbGx5IF93cml0ZV8gaXQgYmVmb3JlIHBvd2VyIHdhcyBsb3N0LCBsZWF2aW5nCisJCQkgICBhIGdhcCBpbiB0aGUgbG9nLiBTaGlmdGluZyBhbGwgbm9kZSB3cml0ZXMgaW50bworCQkJICAgYSBzaW5nbGUga2VybmVsIHRocmVhZCB3aWxsIGZpeCB0aGUgb3JpZ2luYWwgcHJvYmxlbS4KKwkJCSovCisJCQlpZiAoKF9fdTMyKSBwb3MgJSBmbWMtPnNlY3Rvcl9zaXplKSB7CisJCQkJLyogSWYgdGhlcmUgd2FzIGZyZWUgc3BhY2UgaW4gcHJldmlvdXMgCisJCQkJICAgc2VjdG9ycywgZG9uJ3QgbWFyayB0aGF0IGRpcnR5IHRvbyAtIAorCQkJCSAgIG9ubHkgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgc2VjdG9yCisJCQkJICAgKG9yIGZyb20gc3RhcnQpIAorCQkJCSovCisKKwkJCSAgICAgICAgdGVzdF9zdGFydCA9IHBvcyAmIH4oZm1jLT5zZWN0b3Jfc2l6ZS0xKTsgLyogZW5kIG9mIGxhc3Qgc2VjdG9yICovCisKKwkJCQlpZiAoc3RhcnQgPCB0ZXN0X3N0YXJ0KSB7CisKKwkJCQkgICAgICAgIC8qIGZyZWUgc3BhY2Ugc3RhcnRlZCBpbiB0aGUgcHJldmlvdXMgc2VjdG9yISAqLworCisJCQkJCWlmKChudW1fZnJlZV9zcGFjZSA8IE5VTUZSRUVBTExPV0VEKSAmJiAKKwkJCQkJICAgKCh1bnNpZ25lZCBpbnQpKHRlc3Rfc3RhcnQgLSBzdGFydCkgPj0gZm1jLT5zZWN0b3Jfc2l6ZSkpeworCisJCQkJICAgICAgICAgICAgICAgIC8qCisJCQkJCQkgIENvdW50IGl0IGluIGlmIHdlIGFyZSBzdGlsbCB1bmRlciBOVU1GUkVFQUxMT1dFRCAqYW5kKiBpdCBpcyAKKwkJCQkJCSAgYXQgbGVhc3QgMSBlcmFzZSBzZWN0b3IgaW4gbGVuZ3RoLiBUaGlzIHdpbGwga2VlcCB1cyBmcm9tIAorCQkJCQkJICBwaWNraW5nIGFueSBsaXR0bGUgb2xlJyBzcGFjZSBhcyAiZnJlZSIuCisJCQkJCQkqLworCQkJCQkgIAorCQkJCQkgICAgICAgIEQxKHByaW50aygiUmVkdWNpbmcgZW5kIG9mIGZyZWUgc3BhY2UgdG8gMHgleCBmcm9tIDB4JXhcbiIsCisJCQkJCQkJICAodW5zaWduZWQgaW50KXRlc3Rfc3RhcnQsICh1bnNpZ25lZCBpbnQpcG9zKSk7CisKKwkJCQkJCUQxKHByaW50aygiRnJlZSBzcGFjZSBhY2NlcHRlZDogU3RhcnRpbmcgMHgleCBmb3IgMHgleCBieXRlc1xuIiwKKwkJCQkJCQkgICh1bnNpZ25lZCBpbnQpIHN0YXJ0LAorCQkJCQkJCSAgKHVuc2lnbmVkIGludCkodGVzdF9zdGFydCAtIHN0YXJ0KSkpOworCisJCQkJCQkvKiBiZWxvdywgc3BhY2UgZnJvbSAic3RhcnQiIHRvICJwb3MiIHdpbGwgYmUgbWFya2VkIGRpcnR5LiAqLworCQkJCQkJc3RhcnQgPSB0ZXN0X3N0YXJ0OyAKKwkJCQkJCQorCQkJCQkJLyogQmVpbmcgaW4gaGVyZSBtZWFucyB0aGF0IHdlIGhhdmUgZm91bmQgYXQgbGVhc3QgYW4gZW50aXJlIAorCQkJCQkJICAgZXJhc2Ugc2VjdG9yIHNpemUgb2YgZnJlZSBzcGFjZSBlbmRpbmcgb24gYSBzZWN0b3IgYm91bmRhcnkuCisJCQkJCQkgICBLZWVwIHRyYWNrIG9mIGZyZWUgc3BhY2VzIGFjY2VwdGVkLgorCQkJCQkJKi8KKwkJCQkJCW51bV9mcmVlX3NwYWNlKys7CisJCQkJCX1lbHNleworCQkJCQkgICAgICAgIG51bV9mcmVlX3NwY19ub3RfYWNjcCsrOworCQkJCQkgICAgICAgIEQxKHByaW50aygiRnJlZSBzcGFjZSAoIyVpKSBmb3VuZCBidXQgKk5vdCogYWNjZXB0ZWQ6IFN0YXJ0aW5nIgorCQkJCQkJCSAgIiAweCV4IGZvciAweCV4IGJ5dGVzXG4iLAorCQkJCQkJCSAgbnVtX2ZyZWVfc3BjX25vdF9hY2NwLCAodW5zaWduZWQgaW50KXN0YXJ0LCAKKwkJCQkJCQkgICh1bnNpZ25lZCBpbnQpKCh1bnNpZ25lZCBpbnQpKHBvcyAmIH4oZm1jLT5zZWN0b3Jfc2l6ZS0xKSkgLSAodW5zaWduZWQgaW50KXN0YXJ0KSkpOworCQkJCQkgICAgICAgIAorCQkJCQl9CisJCQkJCQorCQkJCX0KKwkJCQlpZigoKChfX3UzMikocG9zIC0gc3RhcnQpKSAhPSAwKSl7CisKKwkJCQkgICAgICAgIEQxKHByaW50aygiRGlydHkgc3BhY2U6IFN0YXJ0aW5nIDB4JXggZm9yIDB4JXggYnl0ZXNcbiIsCisJCQkJCQkgICh1bnNpZ25lZCBpbnQpIHN0YXJ0LCAodW5zaWduZWQgaW50KSAocG9zIC0gc3RhcnQpKSk7CisJCQkJCWpmZnNfZm1hbGxvY2VkKGZtYywgKF9fdTMyKSBzdGFydCwKKwkJCQkJCSAgICAgICAoX191MzIpIChwb3MgLSBzdGFydCksIE5VTEwpOworCQkJCX1lbHNleworCQkJCQkvKiAiRmxpcHBpbmcgYml0cyIgZGV0ZWN0ZWQuIFRoaXMgbWVhbnMgdGhhdCBvdXIgc2NhbiBmb3IgdGhlbQorCQkJCQkgICBkaWQgbm90IGNhdGNoIHRoaXMgb2Zmc2V0LiBTZWUgY2hlY2tfcGFydGx5X2VyYXNlZF9zZWN0b3JzKCkgZm9yCisJCQkJCSAgIG1vcmUgaW5mby4KKwkJCQkJKi8KKwkJCQkgICAgICAgIAorCQkJCQlEMShwcmludGsoImpmZnNfc2Nhbl9mbGFzaCgpOndhbnRzIHRvIGFsbG9jYXRlIGRpcnR5IGZsYXNoICIKKwkJCQkJCSAgInNwYWNlIGZvciAwIGJ5dGVzLlxuIikpOworCQkJCQlEMShwcmludGsoImpmZnNfc2Nhbl9mbGFzaCgpOiBGbGlwcGluZyBiaXRzISBXZSB3aWxsIGZyZWUgIgorCQkJCQkJICAiYWxsIGFsbG9jYXRlZCBtZW1vcnksIGVyYXNlIHRoaXMgc2VjdG9yIGFuZCByZW1vdW50XG4iKSk7CisKKwkJCQkJLyogY2FsY3VsYXRlIHN0YXJ0IG9mIHByZXNlbnQgc2VjdG9yICovCisJCQkJCW9mZnNldCA9ICgoKF9fdTMyKXBvcykvKF9fdTMyKWZtYy0+c2VjdG9yX3NpemUpICogKF9fdTMyKWZtYy0+c2VjdG9yX3NpemU7CisJCQkJCQorCQkJCQlEMShwcmludGsoImpmZnNfc2Nhbl9mbGFzaCgpOmVyYXNpbmcgc2VjdG9yIHN0YXJ0aW5nIDB4JXguXG4iLAorCQkJCQkJICBvZmZzZXQpKTsKKwkJCQkJCisJCQkJCWlmIChmbGFzaF9lcmFzZV9yZWdpb24oZm1jLT5tdGQsCisJCQkJCQkJICAgICAgIG9mZnNldCwgZm1jLT5zZWN0b3Jfc2l6ZSkgPCAwKSB7CisJCQkJCQlwcmludGsoS0VSTl9FUlIgIkpGRlM6IEVyYXNlIG9mIGZsYXNoIGZhaWxlZC4gIgorCQkJCQkJICAgICAgICJvZmZzZXQgPSAldSwgZXJhc2Vfc2l6ZSA9ICVkXG4iLAorCQkJCQkJICAgICAgIG9mZnNldCAsIGZtYy0+c2VjdG9yX3NpemUpOworCisJCQkJCQlmbGFzaF9zYWZlX3JlbGVhc2UoZm1jLT5tdGQpOworCQkJCQkJa2ZyZWUgKHJlYWRfYnVmKTsKKwkJCQkJCXJldHVybiAtMTsgLyogYmFkLCBiYWQsIGJhZCEgKi8KKworCQkJCQl9CisJCQkJCWZsYXNoX3NhZmVfcmVsZWFzZShmbWMtPm10ZCk7CisJCQkJCWtmcmVlIChyZWFkX2J1Zik7CisKKwkJCQkJcmV0dXJuIC1FQUdBSU47IC8qIGVyYXNlZCBvZmZlbmRpbmcgc2VjdG9yLiBUcnkgbW91bnQgb25lIG1vcmUgdGltZSBwbGVhc2UuICovCisJCQkJfQorCQkJfWVsc2V7CisJCQkgICAgICAgIC8qIEJlaW5nIGluIGhlcmUgbWVhbnMgdGhhdCB3ZSBoYXZlIGZvdW5kIGZyZWUgc3BhY2UgdGhhdCBlbmRzIG9uIGFuIGVyYXNlIHNlY3RvcgorCQkJCSAgIGJvdW5kYXJ5LgorCQkJCSAgIENvdW50IGl0IGluIGlmIHdlIGFyZSBzdGlsbCB1bmRlciBOVU1GUkVFQUxMT1dFRCAqYW5kKiBpdCBpcyBhdCBsZWFzdCAxIGVyYXNlIAorCQkJCSAgIHNlY3RvciBpbiBsZW5ndGguIFRoaXMgd2lsbCBrZWVwIHVzIGZyb20gcGlja2luZyBhbnkgbGl0dGxlIG9sZScgc3BhY2UgYXMgImZyZWUiLgorCQkJCSAqLworCQkJICAgICAgICAgaWYoKG51bV9mcmVlX3NwYWNlIDwgTlVNRlJFRUFMTE9XRUQpICYmIAorCQkJCSAgICAoKHVuc2lnbmVkIGludCkocG9zIC0gc3RhcnQpID49IGZtYy0+c2VjdG9yX3NpemUpKXsKKwkJCQkgICAgICAgICAgIC8qIFdlIHJlYWxseSBkb24ndCBkbyBhbnl0aGluZyB0byBtYXJrIHNwYWNlIGFzIGZyZWUsIGV4Y2VwdCAqbm90KiAKKwkJCQkJICAgICAgbWFyayBpdCBkaXJ0eSBhbmQganVzdCBhZHZhbmNlIHRoZSAicG9zIiBsb2NhdGlvbiBwb2ludGVyLiAKKwkJCQkJICAgICAgSXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHBpY2tlZCB1cCBhcyBmcmVlIHNwYWNlLgorCQkJCQkgICAgKi8gCisJCQkJICAgICAgICAgICBudW1fZnJlZV9zcGFjZSsrOworCQkJCSAgICAgICAgICAgRDEocHJpbnRrKCJGcmVlIHNwYWNlIGFjY2VwdGVkOiBTdGFydGluZyAweCV4IGZvciAweCV4IGJ5dGVzXG4iLAorCQkJCQkJICAgICAodW5zaWduZWQgaW50KSBzdGFydCwgKHVuc2lnbmVkIGludCkgKHBvcyAtIHN0YXJ0KSkpOworCQkJCSB9ZWxzZXsKKwkJCQkgICAgICAgICBudW1fZnJlZV9zcGNfbm90X2FjY3ArKzsKKwkJCQkJIEQxKHByaW50aygiRnJlZSBzcGFjZSAoIyVpKSBmb3VuZCBidXQgKk5vdCogYWNjZXB0ZWQ6IFN0YXJ0aW5nICIKKwkJCQkJCSAgICIweCV4IGZvciAweCV4IGJ5dGVzXG4iLCBudW1fZnJlZV9zcGNfbm90X2FjY3AsIAorCQkJCQkJICAgKHVuc2lnbmVkIGludCkgc3RhcnQsIAorCQkJCQkJICAgKHVuc2lnbmVkIGludCkgKHBvcyAtIHN0YXJ0KSkpOworCQkJCQkgCisJCQkJCSAvKiBNYXJrIHRoaXMgc3BhY2UgYXMgZGlydHkuIFdlIGFscmVhZHkgaGF2ZSBvdXIgZnJlZSBzcGFjZS4gKi8KKwkJCQkJIEQxKHByaW50aygiRGlydHkgc3BhY2U6IFN0YXJ0aW5nIDB4JXggZm9yIDB4JXggYnl0ZXNcbiIsCisJCQkJCQkgICAodW5zaWduZWQgaW50KSBzdGFydCwgKHVuc2lnbmVkIGludCkgKHBvcyAtIHN0YXJ0KSkpOworCQkJCQkgamZmc19mbWFsbG9jZWQoZm1jLCAoX191MzIpIHN0YXJ0LAorCQkJCQkJCShfX3UzMikgKHBvcyAtIHN0YXJ0KSwgTlVMTCk7CQkJCSAgICAgICAgICAgCisJCQkJIH0KKwkJCQkgCisJCQl9CisJCQlpZihudW1fZnJlZV9zcGFjZSA+IE5VTUZSRUVBTExPV0VEKXsKKwkJCSAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImpmZnNfc2Nhbl9mbGFzaCgpOiBGb3VuZCBmcmVlIHNwYWNlICIKKwkJCQkJIm51bWJlciAlaS4gT25seSAlaSBmcmVlIHNwYWNlIGlzIGFsbG93ZWQuXG4iLAorCQkJCQludW1fZnJlZV9zcGFjZSwgTlVNRlJFRUFMTE9XRUQpOwkJCSAgICAgIAorCQkJfQorCQkJY29udGludWU7CisKKwkJY2FzZSBKRkZTX0RJUlRZX0JJVE1BU0s6CisJCQkvKiBXZSBoYXZlIGZvdW5kIDB4MDAwMDAwMDAgYXQgdGhpcyBwb3NpdGlvbi4gIFNjYW4gYXMgZmFyCisJCQkgICBhcyBwb3NzaWJsZSB0byBmaW5kIG91dCBob3cgbXVjaCBpcyBkaXJ0eS4gICovCisJCQlEMShwcmludGsoImpmZnNfc2Nhbl9mbGFzaCgpOiAweDAwMDAwMDAwIGF0IHBvcyAweCVseC5cbiIsCisJCQkJICAobG9uZylwb3MpKTsKKwkJCWZvciAoOyBwb3MgPCBlbmQKKwkJCSAgICAgICAmJiBKRkZTX0RJUlRZX0JJVE1BU0sgPT0gZmxhc2hfcmVhZF91MzIoZm1jLT5tdGQsIHBvcyk7CisJCQkgICAgIHBvcyArPSA0KTsKKwkJCUQxKHByaW50aygiamZmc19zY2FuX2ZsYXNoKCk6IDB4MDAgZW5kZWQgYXQgIgorCQkJCSAgInBvcyAweCVseC5cbiIsIChsb25nKXBvcykpOworCQkJamZmc19mbWFsbG9jZWQoZm1jLCAoX191MzIpIHN0YXJ0LAorCQkJCSAgICAgICAoX191MzIpIChwb3MgLSBzdGFydCksIE5VTEwpOworCQkJY29udGludWU7CisKKwkJY2FzZSBKRkZTX01BR0lDX0JJVE1BU0s6CisJCQkvKiBXZSBoYXZlIHByb2JhYmx5IGZvdW5kIGEgbmV3IHJhdyBpbm9kZS4gICovCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQliYWRfaW5vZGU6CisJCQkvKiBXZSdyZSBmKmNrZWQuICBUaGlzIGlzIG5vdCBzb2x2ZWQgeWV0LiAgV2UgaGF2ZQorCQkJICAgdG8gc2NhbiBmb3IgdGhlIG1hZ2ljIHBhdHRlcm4uICAqLworCQkJRDEocHJpbnRrKCIqKioqKioqKioqKioqKiogRGlydHkgZmxhc2ggbWVtb3J5IG9yICIKKwkJCQkgICJiYWQgaW5vZGU6ICIKKwkJCQkgICJoZXhkdW1wKHBvcyA9IDB4JWx4LCBsZW4gPSAxMjgpOlxuIiwKKwkJCQkgIChsb25nKXBvcykpOworCQkJRDEoamZmc19oZXhkdW1wKGZtYy0+bXRkLCBwb3MsIDEyOCkpOworCisJCQlmb3IgKHBvcyArPSA0OyBwb3MgPCBlbmQ7IHBvcyArPSA0KSB7CisJCQkJc3dpdGNoIChmbGFzaF9yZWFkX3UzMihmbWMtPm10ZCwgcG9zKSkgeworCQkJCWNhc2UgSkZGU19NQUdJQ19CSVRNQVNLOgorCQkJCWNhc2UgSkZGU19FTVBUWV9CSVRNQVNLOgorCQkJCQkvKiBoYW5kbGUgdGhlc2UgaW4gdGhlIG1haW4gc3dpdGNoKCkgbG9vcCAqLworCQkJCQlnb3RvIGNvbnRfc2NhbjsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJY29udF9zY2FuOgorCQkJLyogRmlyc3QsIG1hcmsgYXMgZGlydHkgdGhlIHJlZ2lvbgorCQkJICAgd2hpY2ggcmVhbGx5IGRvZXMgY29udGFpbiBjcmFwLiAqLworCQkJamZmc19mbWFsbG9jZWQoZm1jLCAoX191MzIpIHN0YXJ0LAorCQkJCSAgICAgICAoX191MzIpIChwb3MgLSBzdGFydCksCisJCQkJICAgICAgIE5VTEwpOworCQkJCisJCQljb250aW51ZTsKKwkJfS8qIHN3aXRjaCAqLworCisJCS8qIFdlIGhhdmUgZm91bmQgdGhlIGJlZ2lubmluZyBvZiBhbiBpbm9kZS4gIENyZWF0ZSBhCisJCSAgIG5vZGUgZm9yIGl0IHVubGVzcyB0aGVyZSBhbHJlYWR5IGlzIG9uZSBhdmFpbGFibGUuICAqLworCQlpZiAoIW5vZGUpIHsKKwkJCWlmICghKG5vZGUgPSBqZmZzX2FsbG9jX25vZGUoKSkpIHsKKwkJCQkvKiBGcmVlIHJlYWQgYnVmZmVyICovCisJCQkJa2ZyZWUgKHJlYWRfYnVmKTsKKworCQkJCS8qIFJlbGVhc2UgdGhlIGZsYXNoIGRldmljZSAqLworCQkJCWZsYXNoX3NhZmVfcmVsZWFzZShmbWMtPm10ZCk7CisJCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlESk0obm9famZmc19ub2RlKyspOworCQl9CisKKwkJLyogUmVhZCB0aGUgbmV4dCByYXcgaW5vZGUuICAqLworCisJCWZsYXNoX3NhZmVfcmVhZChmbWMtPm10ZCwgcG9zLCAodV9jaGFyICopICZyYXdfaW5vZGUsCisJCQkJc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkpOworCisJCS8qIFdoZW4gd2UgY29tcHV0ZSB0aGUgY2hlY2tzdW0gZm9yIHRoZSBpbm9kZSwgd2UgbmV2ZXIKKwkJICAgY291bnQgdGhlICdhY2N1cmF0ZScgb3IgdGhlICdjaGVja3N1bScgZmllbGRzLiAgKi8KKwkJdG1wX2FjY3VyYXRlID0gcmF3X2lub2RlLmFjY3VyYXRlOworCQl0bXBfY2hrc3VtID0gcmF3X2lub2RlLmNoa3N1bTsKKwkJcmF3X2lub2RlLmFjY3VyYXRlID0gMDsKKwkJcmF3X2lub2RlLmNoa3N1bSA9IDA7CisJCWNoZWNrc3VtID0gamZmc19jaGVja3N1bSgmcmF3X2lub2RlLAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkpOworCQlyYXdfaW5vZGUuYWNjdXJhdGUgPSB0bXBfYWNjdXJhdGU7CisJCXJhd19pbm9kZS5jaGtzdW0gPSB0bXBfY2hrc3VtOworCisJCUQzKHByaW50aygiKioqIFdlIGhhdmUgZm91bmQgdGhpcyByYXcgaW5vZGUgYXQgcG9zIDB4JWx4ICIKKwkJCSAgIm9uIHRoZSBmbGFzaDpcbiIsIChsb25nKXBvcykpOworCQlEMyhqZmZzX3ByaW50X3Jhd19pbm9kZSgmcmF3X2lub2RlKSk7CisKKwkJaWYgKGNoZWNrc3VtICE9IHJhd19pbm9kZS5jaGtzdW0pIHsKKwkJCUQxKHByaW50aygiamZmc19zY2FuX2ZsYXNoKCk6IEJhZCBjaGVja3N1bTogIgorCQkJCSAgImNoZWNrc3VtID0gJXUsICIKKwkJCQkgICJyYXdfaW5vZGUuY2hrc3VtID0gJXVcbiIsCisJCQkJICBjaGVja3N1bSwgcmF3X2lub2RlLmNoa3N1bSkpOworCQkJcG9zICs9IHNpemVvZihzdHJ1Y3QgamZmc19yYXdfaW5vZGUpOworCQkJamZmc19mbWFsbG9jZWQoZm1jLCAoX191MzIpIHN0YXJ0LAorCQkJCSAgICAgICAoX191MzIpIChwb3MgLSBzdGFydCksIE5VTEwpOworCQkJLyogUmV1c2UgdGhpcyB1bnVzZWQgc3RydWN0IGpmZnNfbm9kZS4gICovCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIENoZWNrIHRoZSByYXcgaW5vZGUgcmVhZCBzbyBmYXIuICBTdGFydCB3aXRoIHRoZQorCQkgICBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgZmlsZW5hbWUuICAqLworCQlpZiAocmF3X2lub2RlLm5zaXplID4gSkZGU19NQVhfTkFNRV9MRU4pIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnNfc2Nhbl9mbGFzaDogRm91bmQgYSAiCisJCQkgICAgICAgIkpGRlMgbm9kZSB3aXRoIG5hbWUgdG9vIGxhcmdlXG4iKTsKKwkJCWdvdG8gYmFkX2lub2RlOworCQl9CisKKwkJaWYgKHJhd19pbm9kZS5yZW5hbWUgJiYgcmF3X2lub2RlLmRzaXplICE9IHNpemVvZihfX3UzMikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnNfc2Nhbl9mbGFzaDogRm91bmQgYSAiCisJCQkgICAgICAgInJlbmFtZSBub2RlIHdpdGggZHNpemUgJXUuXG4iLAorCQkJICAgICAgIHJhd19pbm9kZS5kc2l6ZSk7CisJCQlqZmZzX3ByaW50X3Jhd19pbm9kZSgmcmF3X2lub2RlKTsKKwkJCWdvdG8gYmFkX2lub2RlOworCQl9CisKKwkJLyogVGhlIG5vZGUncyBkYXRhIHNlZ21lbnQgc2hvdWxkIG5vdCBleGNlZWQgYQorCQkgICBjZXJ0YWluIGxlbmd0aC4gICovCisJCWlmIChyYXdfaW5vZGUuZHNpemUgPiBmbWMtPm1heF9jaHVua19zaXplKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzX3NjYW5fZmxhc2g6IEZvdW5kIGEgIgorCQkJICAgICAgICJKRkZTIG5vZGUgd2l0aCBkc2l6ZSAoMHgleCkgPiBtYXhfY2h1bmtfc2l6ZSAoMHgleClcbiIsCisJCQkgICAgICAgcmF3X2lub2RlLmRzaXplLCBmbWMtPm1heF9jaHVua19zaXplKTsKKwkJCWdvdG8gYmFkX2lub2RlOworCQl9CisKKwkJcG9zICs9IHNpemVvZihzdHJ1Y3QgamZmc19yYXdfaW5vZGUpOworCisJCS8qIFRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSBiZWNhdXNlIGEgbm9kZSB0aGF0CisJCSAgIHZpb2xhdGVzIHRoZSBmbGFzaCBib3VuZGFyaWVzIHNob3VsZG4ndCBiZSB3cml0dGVuCisJCSAgIGluIHRoZSBmaXJzdCBwbGFjZS4gKi8KKwkJaWYgKHBvcyA+PSBlbmQpIHsKKwkJCWdvdG8gY2hlY2tfbm9kZTsKKwkJfQorCisJCS8qIFJlYWQgdGhlIG5hbWUuICAqLworCQkqbmFtZSA9IDA7CisJCWlmIChyYXdfaW5vZGUubnNpemUpIHsKKwkJICAgICAgICBmbGFzaF9zYWZlX3JlYWQoZm1jLT5tdGQsIHBvcywgbmFtZSwgcmF3X2lub2RlLm5zaXplKTsKKwkJCW5hbWVbcmF3X2lub2RlLm5zaXplXSA9ICdcMCc7CisJCQlwb3MgKz0gcmF3X2lub2RlLm5zaXplCisJCQkgICAgICAgKyBKRkZTX0dFVF9QQURfQllURVMocmF3X2lub2RlLm5zaXplKTsKKwkJCUQzKHByaW50aygibmFtZSA9PSBcIiVzXCJcbiIsIG5hbWUpKTsKKwkJCWNoZWNrc3VtID0gamZmc19jaGVja3N1bShuYW1lLCByYXdfaW5vZGUubnNpemUpOworCQkJaWYgKGNoZWNrc3VtICE9IHJhd19pbm9kZS5uY2hrc3VtKSB7CisJCQkJRDEocHJpbnRrKCJqZmZzX3NjYW5fZmxhc2goKTogQmFkIGNoZWNrc3VtOiAiCisJCQkJCSAgImNoZWNrc3VtID0gJXUsICIKKwkJCQkJICAicmF3X2lub2RlLm5jaGtzdW0gPSAldVxuIiwKKwkJCQkJICBjaGVja3N1bSwgcmF3X2lub2RlLm5jaGtzdW0pKTsKKwkJCQlqZmZzX2ZtYWxsb2NlZChmbWMsIChfX3UzMikgc3RhcnQsCisJCQkJCSAgICAgICAoX191MzIpIChwb3MgLSBzdGFydCksIE5VTEwpOworCQkJCS8qIFJldXNlIHRoaXMgdW51c2VkIHN0cnVjdCBqZmZzX25vZGUuICAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHBvcyA+PSBlbmQpIHsKKwkJCQlnb3RvIGNoZWNrX25vZGU7CisJCQl9CisJCX0KKworCQkvKiBSZWFkIHRoZSBkYXRhLCBpZiBpdCBleGlzdHMsIGluIG9yZGVyIHRvIGJlIHN1cmUgaXQKKwkJICAgbWF0Y2hlcyB0aGUgY2hlY2tzdW0uICAqLworCQlpZiAocmF3X2lub2RlLmRzaXplKSB7CisJCQlpZiAocmF3X2lub2RlLnJlbmFtZSkgeworCQkJCWRlbGV0ZWRfZmlsZSA9IGZsYXNoX3JlYWRfdTMyKGZtYy0+bXRkLCBwb3MpOworCQkJfQorCQkJaWYgKGpmZnNfY2hlY2tzdW1fZmxhc2goZm1jLT5tdGQsIHBvcywgcmF3X2lub2RlLmRzaXplLCAmY2hlY2tzdW0pKSB7CisJCQkJcHJpbnRrKCJqZmZzX2NoZWNrc3VtX2ZsYXNoKCkgZmFpbGVkIHRvIGNhbGN1bGF0ZSBhIGNoZWNrc3VtXG4iKTsKKwkJCQlqZmZzX2ZtYWxsb2NlZChmbWMsIChfX3UzMikgc3RhcnQsCisJCQkJCSAgICAgICAoX191MzIpIChwb3MgLSBzdGFydCksIE5VTEwpOworCQkJCS8qIFJldXNlIHRoaXMgdW51c2VkIHN0cnVjdCBqZmZzX25vZGUuICAqLworCQkJCWNvbnRpbnVlOworCQkJfQkJCQkKKwkJCXBvcyArPSByYXdfaW5vZGUuZHNpemUKKwkJCSAgICAgICArIEpGRlNfR0VUX1BBRF9CWVRFUyhyYXdfaW5vZGUuZHNpemUpOworCisJCQlpZiAoY2hlY2tzdW0gIT0gcmF3X2lub2RlLmRjaGtzdW0pIHsKKwkJCQlEMShwcmludGsoImpmZnNfc2Nhbl9mbGFzaCgpOiBCYWQgY2hlY2tzdW06ICIKKwkJCQkJICAiY2hlY2tzdW0gPSAldSwgIgorCQkJCQkgICJyYXdfaW5vZGUuZGNoa3N1bSA9ICV1XG4iLAorCQkJCQkgIGNoZWNrc3VtLCByYXdfaW5vZGUuZGNoa3N1bSkpOworCQkJCWpmZnNfZm1hbGxvY2VkKGZtYywgKF9fdTMyKSBzdGFydCwKKwkJCQkJICAgICAgIChfX3UzMikgKHBvcyAtIHN0YXJ0KSwgTlVMTCk7CisJCQkJLyogUmV1c2UgdGhpcyB1bnVzZWQgc3RydWN0IGpmZnNfbm9kZS4gICovCisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQljaGVja19ub2RlOgorCisJCS8qIFJlbWVtYmVyIHRoZSBoaWdoZXN0IGlub2RlIG51bWJlciBpbiB0aGUgd2hvbGUgZmlsZQorCQkgICBzeXN0ZW0uICBUaGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCB3aGVuIGFzc2lnbmluZworCQkgICBuZXcgZmlsZXMgbmV3IGlub2RlIG51bWJlcnMuICAqLworCQlpZiAoYy0+bmV4dF9pbm8gPD0gcmF3X2lub2RlLmlubykgeworCQkJYy0+bmV4dF9pbm8gPSByYXdfaW5vZGUuaW5vICsgMTsKKwkJfQorCisJCWlmIChyYXdfaW5vZGUuYWNjdXJhdGUpIHsKKwkJCWludCBlcnI7CisJCQlub2RlLT5kYXRhX29mZnNldCA9IHJhd19pbm9kZS5vZmZzZXQ7CisJCQlub2RlLT5kYXRhX3NpemUgPSByYXdfaW5vZGUuZHNpemU7CisJCQlub2RlLT5yZW1vdmVkX3NpemUgPSByYXdfaW5vZGUucnNpemU7CisJCQkvKiBDb21wdXRlIHRoZSBvZmZzZXQgdG8gdGhlIGFjdHVhbCBkYXRhIGluIHRoZQorCQkJICAgb24tZmxhc2ggbm9kZS4gICovCisJCQlub2RlLT5mbV9vZmZzZXQKKwkJCT0gc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkKKwkJCSAgKyByYXdfaW5vZGUubnNpemUKKwkJCSAgKyBKRkZTX0dFVF9QQURfQllURVMocmF3X2lub2RlLm5zaXplKTsKKwkJCW5vZGUtPmZtID0gamZmc19mbWFsbG9jZWQoZm1jLCAoX191MzIpIHN0YXJ0LAorCQkJCQkJICAoX191MzIpIChwb3MgLSBzdGFydCksCisJCQkJCQkgIG5vZGUpOworCQkJaWYgKCFub2RlLT5mbSkgeworCQkJCUQocHJpbnRrKCJqZmZzX3NjYW5fZmxhc2goKTogIW5vZGUtPmZtXG4iKSk7CisJCQkJamZmc19mcmVlX25vZGUobm9kZSk7CisJCQkJREpNKG5vX2pmZnNfbm9kZS0tKTsKKworCQkJCS8qIEZyZWUgcmVhZCBidWZmZXIgKi8KKwkJCQlrZnJlZSAocmVhZF9idWYpOworCisJCQkJLyogUmVsZWFzZSB0aGUgZmxhc2ggZGV2aWNlICovCisJCQkJZmxhc2hfc2FmZV9yZWxlYXNlKGZtYy0+bXRkKTsKKworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJaWYgKChlcnIgPSBqZmZzX2luc2VydF9ub2RlKGMsIE5VTEwsICZyYXdfaW5vZGUsCisJCQkJCQkgICAgbmFtZSwgbm9kZSkpIDwgMCkgeworCQkJCXByaW50aygiSkZGUzogRmFpbGVkIHRvIGhhbmRsZSByYXcgaW5vZGUuICIKKwkJCQkgICAgICAgIihlcnIgPSAlZClcbiIsIGVycik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocmF3X2lub2RlLnJlbmFtZSkgeworCQkJCXN0cnVjdCBqZmZzX2RlbGV0ZV9saXN0ICpkbAorCQkJCT0gKHN0cnVjdCBqZmZzX2RlbGV0ZV9saXN0ICopCisJCQkJICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgamZmc19kZWxldGVfbGlzdCksCisJCQkJCSAgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKCFkbCkgeworCQkJCQlEKHByaW50aygiamZmc19zY2FuX2ZsYXNoOiAhZGxcbiIpKTsKKwkJCQkJamZmc19mcmVlX25vZGUobm9kZSk7CisJCQkJCURKTShub19qZmZzX25vZGUtLSk7CisKKwkJCQkJLyogUmVsZWFzZSB0aGUgZmxhc2ggZGV2aWNlICovCisJCQkJCWZsYXNoX3NhZmVfcmVsZWFzZShmbWMtPmZsYXNoX3BhcnQpOworCisJCQkJCS8qIEZyZWUgcmVhZCBidWZmZXIgKi8KKwkJCQkJa2ZyZWUgKHJlYWRfYnVmKTsKKworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl9CisJCQkJZGwtPmlubyA9IGRlbGV0ZWRfZmlsZTsKKwkJCQlkbC0+bmV4dCA9IGMtPmRlbGV0ZV9saXN0OworCQkJCWMtPmRlbGV0ZV9saXN0ID0gZGw7CisJCQkJbm9kZS0+ZGF0YV9zaXplID0gMDsKKwkJCX0KKwkJCUQzKGpmZnNfcHJpbnRfbm9kZShub2RlKSk7CisJCQlub2RlID0gTlVMTDsgLyogRG9uJ3QgZnJlZSB0aGUgbm9kZSEgICovCisJCX0KKwkJZWxzZSB7CisJCQlqZmZzX2ZtYWxsb2NlZChmbWMsIChfX3UzMikgc3RhcnQsCisJCQkJICAgICAgIChfX3UzMikgKHBvcyAtIHN0YXJ0KSwgTlVMTCk7CisJCQlEMyhwcmludGsoImpmZnNfc2Nhbl9mbGFzaCgpOiBKdXN0IGZvdW5kIGFuIG9ic29sZXRlICIKKwkJCQkgICJyYXdfaW5vZGUuIENvbnRpbnVpbmcgdGhlIHNjYW4uLi5cbiIpKTsKKwkJCS8qIFJldXNlIHRoaXMgdW51c2VkIHN0cnVjdCBqZmZzX25vZGUuICAqLworCQl9CisJfQorCisJaWYgKG5vZGUpIHsKKwkJamZmc19mcmVlX25vZGUobm9kZSk7CisJCURKTShub19qZmZzX25vZGUtLSk7CisJfQorCWpmZnNfYnVpbGRfZW5kKGZtYyk7CisKKwkvKiBGcmVlIHJlYWQgYnVmZmVyICovCisJa2ZyZWUgKHJlYWRfYnVmKTsKKworCWlmKCFudW1fZnJlZV9zcGFjZSl7CisJICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzX3NjYW5fZmxhc2goKTogRGlkIG5vdCBmaW5kIGV2ZW4gYSBzaW5nbGUgIgorCQkgICAgICAgImNodW5rIG9mIGZyZWUgc3BhY2UuIFRoaXMgaXMgQkFEIVxuIik7CisJfQorCisJLyogUmV0dXJuIGhhcHB5ICovCisJRDMocHJpbnRrKCJqZmZzX3NjYW5fZmxhc2goKTogTGVhdmluZy4uLlxuIikpOworCWZsYXNoX3NhZmVfcmVsZWFzZShmbWMtPm10ZCk7CisKKwkvKiBUaGlzIGlzIHRvIHRyYXAgdGhlICJmcmVlIHNpemUgYWNjb3VudGluZyBzY3Jld2VkIGVycm9yLiAqLworCWZyZWVfY2h1bmtfc2l6ZTEgPSBqZmZzX2ZyZWVfc2l6ZTEoZm1jKTsKKwlmcmVlX2NodW5rX3NpemUyID0gamZmc19mcmVlX3NpemUyKGZtYyk7CisKKwlpZiAoZnJlZV9jaHVua19zaXplMSArIGZyZWVfY2h1bmtfc2l6ZTIgIT0gZm1jLT5mcmVlX3NpemUpIHsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzX3NjYW5fZmFsc2goKTpGcmVlIHNpemUgYWNjb3VudGluZyBzY3Jld2VkXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmZnNfc2Nhbl9mbGFzaCgpOmZyZWVfY2h1bmtfc2l6ZTEgPT0gMHgleCwgIgorCQkgICAgICAgImZyZWVfY2h1bmtfc2l6ZTIgPT0gMHgleCwgZm1jLT5mcmVlX3NpemUgPT0gMHgleFxuIiwgCisJCSAgICAgICBmcmVlX2NodW5rX3NpemUxLCBmcmVlX2NodW5rX3NpemUyLCBmbWMtPmZyZWVfc2l6ZSk7CisKKwkJcmV0dXJuIC0xOyAvKiBEbyBOT1QgbW91bnQgZi9zIHNvIHRoYXQgd2UgY2FuIGluc3BlY3Qgd2hhdCBoYXBwZW5lZC4KKwkJCSAgICAgIE1vdW50aW5nIHRoaXMgIHNjcmV3ZWQgdXAgZi9zIHdpbGwgc2NyZXcgdXMgdXAgYW55d2F5LgorCQkJICAgICovCisJfQkKKworCXJldHVybiAwOyAvKiBhcyBmYXIgYXMgd2UgYXJlIGNvbmNlcm5lZCwgd2UgYXJlIGhhcHB5ISAqLworfSAvKiBqZmZzX3NjYW5fZmxhc2goKSAgKi8KKworCisvKiBJbnNlcnQgYW55IGtpbmQgb2Ygbm9kZSBpbnRvIHRoZSBmaWxlIHN5c3RlbS4gIFRha2UgY2FyZSBvZiBkYXRhCisgICBpbnNlcnRpb25zIGFuZCBkZWxldGlvbnMuICBBbHNvIHJlbW92ZSByZWR1bmRhbnQgaW5mb3JtYXRpb24uIFRoZQorICAgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIGBuYW1lJyBpcyByZWdhcmRlZCBhcyAiZ2l2ZW4gYXdheSIgaW4gdGhlCisgICBjYWxsZXIncyBwZXJzcGVjdGl2ZS4gICovCitpbnQKK2pmZnNfaW5zZXJ0X25vZGUoc3RydWN0IGpmZnNfY29udHJvbCAqYywgc3RydWN0IGpmZnNfZmlsZSAqZiwKKwkJIGNvbnN0IHN0cnVjdCBqZmZzX3Jhd19pbm9kZSAqcmF3X2lub2RlLAorCQkgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGpmZnNfbm9kZSAqbm9kZSkKK3sKKwlpbnQgdXBkYXRlX25hbWUgPSAwOworCWludCBpbnNlcnRfaW50b190cmVlID0gMDsKKworCUQyKHByaW50aygiamZmc19pbnNlcnRfbm9kZSgpOiBpbm8gPSAldSwgdmVyc2lvbiA9ICV1LCAiCisJCSAgIm5hbWUgPSBcIiVzXCIsIGRlbGV0ZWQgPSAlZFxuIiwKKwkJICByYXdfaW5vZGUtPmlubywgcmF3X2lub2RlLT52ZXJzaW9uLAorCQkgICgobmFtZSAmJiAqbmFtZSkgPyBuYW1lIDogIiIpLCByYXdfaW5vZGUtPmRlbGV0ZWQpKTsKKworCS8qIElmIHRoZXJlIGRvZXNuJ3QgZXhpc3QgYW4gYXNzb2NpYXRlZCBqZmZzX2ZpbGUsIHRoZW4KKwkgICBjcmVhdGUsIGluaXRpYWxpemUgYW5kIGluc2VydCBvbmUgaW50byB0aGUgZmlsZSBzeXN0ZW0uICAqLworCWlmICghZiAmJiAhKGYgPSBqZmZzX2ZpbmRfZmlsZShjLCByYXdfaW5vZGUtPmlubykpKSB7CisJCWlmICghKGYgPSBqZmZzX2NyZWF0ZV9maWxlKGMsIHJhd19pbm9kZSkpKSB7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlqZmZzX2luc2VydF9maWxlX2ludG9faGFzaChmKTsKKwkJaW5zZXJ0X2ludG9fdHJlZSA9IDE7CisJfQorCW5vZGUtPmlubyA9IHJhd19pbm9kZS0+aW5vOworCW5vZGUtPnZlcnNpb24gPSByYXdfaW5vZGUtPnZlcnNpb247CisJbm9kZS0+ZGF0YV9zaXplID0gcmF3X2lub2RlLT5kc2l6ZTsKKwlub2RlLT5mbV9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKSArIHJhd19pbm9kZS0+bnNpemUKKwkJCSAgKyBKRkZTX0dFVF9QQURfQllURVMocmF3X2lub2RlLT5uc2l6ZSk7CisJbm9kZS0+bmFtZV9zaXplID0gcmF3X2lub2RlLT5uc2l6ZTsKKworCS8qIE5vdyBpbnNlcnQgdGhlIG5vZGUgYXQgdGhlIGNvcnJlY3QgcG9zaXRpb24gaW50byB0aGUgZmlsZSdzCisJICAgdmVyc2lvbiBsaXN0LiAgKi8KKwlpZiAoIWYtPnZlcnNpb25faGVhZCkgeworCQkvKiBUaGlzIGlzIHRoZSBmaXJzdCBub2RlLiAgKi8KKwkJZi0+dmVyc2lvbl9oZWFkID0gbm9kZTsKKwkJZi0+dmVyc2lvbl90YWlsID0gbm9kZTsKKwkJbm9kZS0+dmVyc2lvbl9wcmV2ID0gTlVMTDsKKwkJbm9kZS0+dmVyc2lvbl9uZXh0ID0gTlVMTDsKKwkJZi0+aGlnaGVzdF92ZXJzaW9uID0gbm9kZS0+dmVyc2lvbjsKKwkJdXBkYXRlX25hbWUgPSAxOworCQlmLT5tb2RlID0gcmF3X2lub2RlLT5tb2RlOworCQlmLT51aWQgPSByYXdfaW5vZGUtPnVpZDsKKwkJZi0+Z2lkID0gcmF3X2lub2RlLT5naWQ7CisJCWYtPmF0aW1lID0gcmF3X2lub2RlLT5hdGltZTsKKwkJZi0+bXRpbWUgPSByYXdfaW5vZGUtPm10aW1lOworCQlmLT5jdGltZSA9IHJhd19pbm9kZS0+Y3RpbWU7CisJfQorCWVsc2UgaWYgKChmLT5oaWdoZXN0X3ZlcnNpb24gPCBub2RlLT52ZXJzaW9uKQorCQkgfHwgKG5vZGUtPnZlcnNpb24gPT0gMCkpIHsKKwkJLyogSW5zZXJ0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuICBJLmUuIHRoaXMgbm9kZSBpcyB0aGUKKwkJICAgbmV3ZXN0IG9uZSBzbyBmYXIuICAqLworCQlub2RlLT52ZXJzaW9uX3ByZXYgPSBmLT52ZXJzaW9uX3RhaWw7CisJCW5vZGUtPnZlcnNpb25fbmV4dCA9IE5VTEw7CisJCWYtPnZlcnNpb25fdGFpbC0+dmVyc2lvbl9uZXh0ID0gbm9kZTsKKwkJZi0+dmVyc2lvbl90YWlsID0gbm9kZTsKKwkJZi0+aGlnaGVzdF92ZXJzaW9uID0gbm9kZS0+dmVyc2lvbjsKKwkJdXBkYXRlX25hbWUgPSAxOworCQlmLT5waW5vID0gcmF3X2lub2RlLT5waW5vOworCQlmLT5tb2RlID0gcmF3X2lub2RlLT5tb2RlOworCQlmLT51aWQgPSByYXdfaW5vZGUtPnVpZDsKKwkJZi0+Z2lkID0gcmF3X2lub2RlLT5naWQ7CisJCWYtPmF0aW1lID0gcmF3X2lub2RlLT5hdGltZTsKKwkJZi0+bXRpbWUgPSByYXdfaW5vZGUtPm10aW1lOworCQlmLT5jdGltZSA9IHJhd19pbm9kZS0+Y3RpbWU7CisJfQorCWVsc2UgaWYgKGYtPnZlcnNpb25faGVhZC0+dmVyc2lvbiA+IG5vZGUtPnZlcnNpb24pIHsKKwkJLyogSW5zZXJ0IGF0IHRoZSBib3R0b20gb2YgdGhlIGxpc3QuICAqLworCQlub2RlLT52ZXJzaW9uX3ByZXYgPSBOVUxMOworCQlub2RlLT52ZXJzaW9uX25leHQgPSBmLT52ZXJzaW9uX2hlYWQ7CisJCWYtPnZlcnNpb25faGVhZC0+dmVyc2lvbl9wcmV2ID0gbm9kZTsKKwkJZi0+dmVyc2lvbl9oZWFkID0gbm9kZTsKKwkJaWYgKCFmLT5uYW1lKSB7CisJCQl1cGRhdGVfbmFtZSA9IDE7CisJCX0KKwl9CisJZWxzZSB7CisJCXN0cnVjdCBqZmZzX25vZGUgKm47CisJCWludCBuZXdlcl9uYW1lID0gMDsKKwkJLyogU2VhcmNoIGZvciB0aGUgaW5zZXJ0aW9uIHBvc2l0aW9uIHN0YXJ0aW5nIGZyb20KKwkJICAgdGhlIHRhaWwgKG5ld2VzdCBub2RlKS4gICovCisJCWZvciAobiA9IGYtPnZlcnNpb25fdGFpbDsgbjsgbiA9IG4tPnZlcnNpb25fcHJldikgeworCQkJaWYgKG4tPnZlcnNpb24gPCBub2RlLT52ZXJzaW9uKSB7CisJCQkJbm9kZS0+dmVyc2lvbl9wcmV2ID0gbjsKKwkJCQlub2RlLT52ZXJzaW9uX25leHQgPSBuLT52ZXJzaW9uX25leHQ7CisJCQkJbm9kZS0+dmVyc2lvbl9uZXh0LT52ZXJzaW9uX3ByZXYgPSBub2RlOworCQkJCW4tPnZlcnNpb25fbmV4dCA9IG5vZGU7CisJCQkJaWYgKCFuZXdlcl9uYW1lKSB7CisJCQkJCXVwZGF0ZV9uYW1lID0gMTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAobi0+bmFtZV9zaXplKSB7CisJCQkJbmV3ZXJfbmFtZSA9IDE7CisJCQl9CisJCX0KKwl9CisKKwkvKiBEZWxldGlvbiBpcyBpcnJldmVyc2libGUuIElmIGFueSAnZGVsZXRlZCcgbm9kZSBpcyBldmVyCisJICAgd3JpdHRlbiwgdGhlIGZpbGUgaXMgZGVsZXRlZCAqLworCWlmIChyYXdfaW5vZGUtPmRlbGV0ZWQpCisJCWYtPmRlbGV0ZWQgPSByYXdfaW5vZGUtPmRlbGV0ZWQ7CisKKwkvKiBQZXJoYXBzIHVwZGF0ZSB0aGUgbmFtZS4gICovCisJaWYgKHJhd19pbm9kZS0+bnNpemUgJiYgdXBkYXRlX25hbWUgJiYgbmFtZSAmJiAqbmFtZSAmJiAobmFtZSAhPSBmLT5uYW1lKSkgeworCQlpZiAoZi0+bmFtZSkgeworCQkJa2ZyZWUoZi0+bmFtZSk7CisJCQlESk0obm9fbmFtZS0tKTsKKwkJfQorCQlpZiAoIShmLT5uYW1lID0gKGNoYXIgKikga21hbGxvYyhyYXdfaW5vZGUtPm5zaXplICsgMSwKKwkJCQkJCSBHRlBfS0VSTkVMKSkpIHsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCURKTShub19uYW1lKyspOworCQltZW1jcHkoZi0+bmFtZSwgbmFtZSwgcmF3X2lub2RlLT5uc2l6ZSk7CisJCWYtPm5hbWVbcmF3X2lub2RlLT5uc2l6ZV0gPSAnXDAnOworCQlmLT5uc2l6ZSA9IHJhd19pbm9kZS0+bnNpemU7CisJCUQzKHByaW50aygiamZmc19pbnNlcnRfbm9kZSgpOiBVcGRhdGVkIHRoZSBuYW1lIG9mICIKKwkJCSAgInRoZSBmaWxlIHRvIFwiJXNcIi5cbiIsIG5hbWUpKTsKKwl9CisKKwlpZiAoIWMtPmJ1aWxkaW5nX2ZzKSB7CisJCUQzKHByaW50aygiamZmc19pbnNlcnRfbm9kZSgpOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJCQkgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDFcbiIpKTsKKwkJaWYgKGluc2VydF9pbnRvX3RyZWUpIHsKKwkJCWpmZnNfaW5zZXJ0X2ZpbGVfaW50b190cmVlKGYpOworCQl9CisJCS8qIE9uY2UgdXBvbiBhIHRpbWUsIHdlIHdvdWxkIGNhbGwgamZmc19wb3NzaWJseV9kZWxldGVfZmlsZSgpCisJCSAgIGhlcmUuIFRoYXQgY2F1c2VzIGFuIG9vcHMgaWYgc29tZW9uZSdzIHN0aWxsIGdvdCB0aGUgZmlsZQorCQkgICBvcGVuLCBzbyBub3cgd2Ugb25seSBkbyBpdCBpbiBqZmZzX2RlbGV0ZV9pbm9kZSgpCisJCSAgIC0tIGR3bXcyCisJCSovCisJCWlmIChub2RlLT5kYXRhX3NpemUgfHwgbm9kZS0+cmVtb3ZlZF9zaXplKSB7CisJCQlqZmZzX3VwZGF0ZV9maWxlKGYsIG5vZGUpOworCQl9CisJCWpmZnNfcmVtb3ZlX3JlZHVuZGFudF9ub2RlcyhmKTsKKworCQlqZmZzX2dhcmJhZ2VfY29sbGVjdF90cmlnZ2VyKGMpOworCisJCUQzKHByaW50aygiamZmc19pbnNlcnRfbm9kZSgpOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJCQkgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDJcbiIpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30gLyogamZmc19pbnNlcnRfbm9kZSgpICAqLworCisKKy8qIFVubGluayBhIGpmZnNfbm9kZSBmcm9tIHRoZSB2ZXJzaW9uIGxpc3QgaXQgaXMgaW4uICAqLworc3RhdGljIGlubGluZSB2b2lkCitqZmZzX3VubGlua19ub2RlX2Zyb21fdmVyc2lvbl9saXN0KHN0cnVjdCBqZmZzX2ZpbGUgKmYsCisJCQkJICAgc3RydWN0IGpmZnNfbm9kZSAqbm9kZSkKK3sKKwlpZiAobm9kZS0+dmVyc2lvbl9wcmV2KSB7CisJCW5vZGUtPnZlcnNpb25fcHJldi0+dmVyc2lvbl9uZXh0ID0gbm9kZS0+dmVyc2lvbl9uZXh0OworCX0gZWxzZSB7CisJCWYtPnZlcnNpb25faGVhZCA9IG5vZGUtPnZlcnNpb25fbmV4dDsKKwl9CisJaWYgKG5vZGUtPnZlcnNpb25fbmV4dCkgeworCQlub2RlLT52ZXJzaW9uX25leHQtPnZlcnNpb25fcHJldiA9IG5vZGUtPnZlcnNpb25fcHJldjsKKwl9IGVsc2UgeworCQlmLT52ZXJzaW9uX3RhaWwgPSBub2RlLT52ZXJzaW9uX3ByZXY7CisJfQorfQorCisKKy8qIFVubGluayBhIGpmZnNfbm9kZSBmcm9tIHRoZSByYW5nZSBsaXN0IGl0IGlzIGluLiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAoramZmc191bmxpbmtfbm9kZV9mcm9tX3JhbmdlX2xpc3Qoc3RydWN0IGpmZnNfZmlsZSAqZiwgc3RydWN0IGpmZnNfbm9kZSAqbm9kZSkKK3sKKwlpZiAobm9kZS0+cmFuZ2VfcHJldikgeworCQlub2RlLT5yYW5nZV9wcmV2LT5yYW5nZV9uZXh0ID0gbm9kZS0+cmFuZ2VfbmV4dDsKKwl9CisJZWxzZSB7CisJCWYtPnJhbmdlX2hlYWQgPSBub2RlLT5yYW5nZV9uZXh0OworCX0KKwlpZiAobm9kZS0+cmFuZ2VfbmV4dCkgeworCQlub2RlLT5yYW5nZV9uZXh0LT5yYW5nZV9wcmV2ID0gbm9kZS0+cmFuZ2VfcHJldjsKKwl9CisJZWxzZSB7CisJCWYtPnJhbmdlX3RhaWwgPSBub2RlLT5yYW5nZV9wcmV2OworCX0KK30KKworCisvKiBGdW5jdGlvbiB1c2VkIGJ5IGpmZnNfcmVtb3ZlX3JlZHVuZGFudF9ub2RlcygpIGJlbG93LiAgVGhpcyBmdW5jdGlvbgorICAgY2xhc3NpZmllcyB3aGF0IGtpbmQgb2YgaW5mb3JtYXRpb24gYSBub2RlIGFkZHMgdG8gYSBmaWxlLiAgKi8KK3N0YXRpYyBpbmxpbmUgX191OAoramZmc19jbGFzc2lmeV9ub2RlKHN0cnVjdCBqZmZzX25vZGUgKm5vZGUpCit7CisJX191OCBtb2RfdHlwZSA9IEpGRlNfTU9ESUZZX0lOT0RFOworCisJaWYgKG5vZGUtPm5hbWVfc2l6ZSkgeworCQltb2RfdHlwZSB8PSBKRkZTX01PRElGWV9OQU1FOworCX0KKwlpZiAobm9kZS0+ZGF0YV9zaXplIHx8IG5vZGUtPnJlbW92ZWRfc2l6ZSkgeworCQltb2RfdHlwZSB8PSBKRkZTX01PRElGWV9EQVRBOworCX0KKwlyZXR1cm4gbW9kX3R5cGU7Cit9CisKKworLyogUmVtb3ZlIHJlZHVuZGFudCBub2RlcyBmcm9tIGEgZmlsZS4gIE1hcmsgdGhlIG9uLWZsYXNoIG1lbW9yeQorICAgYXMgZGlydHkuICAqLworc3RhdGljIGludAoramZmc19yZW1vdmVfcmVkdW5kYW50X25vZGVzKHN0cnVjdCBqZmZzX2ZpbGUgKmYpCit7CisJc3RydWN0IGpmZnNfbm9kZSAqbmV3ZXN0X25vZGU7CisJc3RydWN0IGpmZnNfbm9kZSAqY3VyOworCXN0cnVjdCBqZmZzX25vZGUgKnByZXY7CisJX191OCBuZXdlc3RfdHlwZTsKKwlfX3U4IG1vZF90eXBlOworCV9fdTggbm9kZV93aXRoX25hbWVfbGF0ZXIgPSAwOworCisJaWYgKCEobmV3ZXN0X25vZGUgPSBmLT52ZXJzaW9uX3RhaWwpKSB7CisJCXJldHVybiAwOworCX0KKworCS8qIFdoYXQgZG9lcyB0aGUgYG5ld2VzdF9ub2RlJyBtb2RpZnk/ICAqLworCW5ld2VzdF90eXBlID0gamZmc19jbGFzc2lmeV9ub2RlKG5ld2VzdF9ub2RlKTsKKwlub2RlX3dpdGhfbmFtZV9sYXRlciA9IG5ld2VzdF90eXBlICYgSkZGU19NT0RJRllfTkFNRTsKKworCUQzKHByaW50aygiamZmc19yZW1vdmVfcmVkdW5kYW50X25vZGVzKCk6IGlubzogJXUsIG5hbWU6IFwiJXNcIiwgIgorCQkgICJuZXdlc3RfdHlwZTogJXVcbiIsIGYtPmlubywgKGYtPm5hbWUgPyBmLT5uYW1lIDogIiIpLAorCQkgIG5ld2VzdF90eXBlKSk7CisKKwkvKiBUcmF2ZXJzZSB0aGUgZmlsZSdzIG5vZGVzIGFuZCBkZXRlcm1pbmUgd2hpY2ggb2YgdGhlbSB0aGF0IGFyZQorCSAgIHN1cGVyZmx1b3VzLiAgWWVhaCwgdGhpcyBtaWdodCBsb29rIHZlcnkgY29tcGxleCBhdCBmaXJzdAorCSAgIGdsYW5jZSBidXQgaXQgaXMgYWN0dWFsbHkgdmVyeSBzaW1wbGUuICAqLworCWZvciAoY3VyID0gbmV3ZXN0X25vZGUtPnZlcnNpb25fcHJldjsgY3VyOyBjdXIgPSBwcmV2KSB7CisJCXByZXYgPSBjdXItPnZlcnNpb25fcHJldjsKKwkJbW9kX3R5cGUgPSBqZmZzX2NsYXNzaWZ5X25vZGUoY3VyKTsKKwkJaWYgKChtb2RfdHlwZSA8PSBKRkZTX01PRElGWV9JTk9ERSkKKwkJICAgIHx8ICgobmV3ZXN0X3R5cGUgJiBKRkZTX01PRElGWV9OQU1FKQorCQkJJiYgKG1vZF90eXBlCisJCQkgICAgPD0gKEpGRlNfTU9ESUZZX0lOT0RFICsgSkZGU19NT0RJRllfTkFNRSkpKQorCQkgICAgfHwgKGN1ci0+ZGF0YV9zaXplID09IDAgJiYgY3VyLT5yZW1vdmVkX3NpemUKKwkJCSYmICFjdXItPnZlcnNpb25fcHJldiAmJiBub2RlX3dpdGhfbmFtZV9sYXRlcikpIHsKKwkJCS8qIFllcywgdGhpcyBub2RlIGlzIHJlZHVuZGFudC4gUmVtb3ZlIGl0LiAgKi8KKwkJCUQyKHByaW50aygiamZmc19yZW1vdmVfcmVkdW5kYW50X25vZGVzKCk6ICIKKwkJCQkgICJSZW1vdmluZyBub2RlOiBpbm86ICV1LCB2ZXJzaW9uOiAldSwgIgorCQkJCSAgIm1vZF90eXBlOiAldVxuIiwgY3VyLT5pbm8sIGN1ci0+dmVyc2lvbiwKKwkJCQkgIG1vZF90eXBlKSk7CisJCQlqZmZzX3VubGlua19ub2RlX2Zyb21fdmVyc2lvbl9saXN0KGYsIGN1cik7CisJCQlqZmZzX2ZtZnJlZShmLT5jLT5mbWMsIGN1ci0+Zm0sIGN1cik7CisJCQlqZmZzX2ZyZWVfbm9kZShjdXIpOworCQkJREpNKG5vX2pmZnNfbm9kZS0tKTsKKwkJfQorCQllbHNlIHsKKwkJCW5vZGVfd2l0aF9uYW1lX2xhdGVyIHw9IChtb2RfdHlwZSAmIEpGRlNfTU9ESUZZX05BTUUpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyogSW5zZXJ0IGEgZmlsZSBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KK3N0YXRpYyBpbnQKK2pmZnNfaW5zZXJ0X2ZpbGVfaW50b19oYXNoKHN0cnVjdCBqZmZzX2ZpbGUgKmYpCit7CisJaW50IGkgPSBmLT5pbm8gJSBmLT5jLT5oYXNoX2xlbjsKKworCUQzKHByaW50aygiamZmc19pbnNlcnRfZmlsZV9pbnRvX2hhc2goKTogZi0+aW5vOiAldVxuIiwgZi0+aW5vKSk7CisKKwlsaXN0X2FkZCgmZi0+aGFzaCwgJmYtPmMtPmhhc2hbaV0pOworCXJldHVybiAwOworfQorCisKKy8qIEluc2VydCBhIGZpbGUgaW50byB0aGUgZmlsZSBzeXN0ZW0gdHJlZS4gICovCitpbnQKK2pmZnNfaW5zZXJ0X2ZpbGVfaW50b190cmVlKHN0cnVjdCBqZmZzX2ZpbGUgKmYpCit7CisJc3RydWN0IGpmZnNfZmlsZSAqcGFyZW50OworCisJRDMocHJpbnRrKCJqZmZzX2luc2VydF9maWxlX2ludG9fdHJlZSgpOiBuYW1lOiBcIiVzXCJcbiIsCisJCSAgKGYtPm5hbWUgPyBmLT5uYW1lIDogIiIpKSk7CisKKwlpZiAoIShwYXJlbnQgPSBqZmZzX2ZpbmRfZmlsZShmLT5jLCBmLT5waW5vKSkpIHsKKwkJaWYgKGYtPnBpbm8gPT0gMCkgeworCQkJZi0+Yy0+cm9vdCA9IGY7CisJCQlmLT5wYXJlbnQgPSBOVUxMOworCQkJZi0+c2libGluZ19wcmV2ID0gTlVMTDsKKwkJCWYtPnNpYmxpbmdfbmV4dCA9IE5VTEw7CisJCQlyZXR1cm4gMDsKKwkJfQorCQllbHNlIHsKKwkJCUQxKHByaW50aygiamZmc19pbnNlcnRfZmlsZV9pbnRvX3RyZWUoKTogRm91bmQgIgorCQkJCSAgImlub2RlIHdpdGggbm8gcGFyZW50IGFuZCBwaW5vID09ICV1XG4iLAorCQkJCSAgZi0+cGlubykpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCWYtPnBhcmVudCA9IHBhcmVudDsKKwlmLT5zaWJsaW5nX25leHQgPSBwYXJlbnQtPmNoaWxkcmVuOworCWlmIChmLT5zaWJsaW5nX25leHQpIHsKKwkJZi0+c2libGluZ19uZXh0LT5zaWJsaW5nX3ByZXYgPSBmOworCX0KKwlmLT5zaWJsaW5nX3ByZXYgPSBOVUxMOworCXBhcmVudC0+Y2hpbGRyZW4gPSBmOworCXJldHVybiAwOworfQorCisKKy8qIFJlbW92ZSBhIGZpbGUgZnJvbSB0aGUgaGFzaCB0YWJsZS4gICovCitzdGF0aWMgaW50CitqZmZzX3VubGlua19maWxlX2Zyb21faGFzaChzdHJ1Y3QgamZmc19maWxlICpmKQoreworCUQzKHByaW50aygiamZmc191bmxpbmtfZmlsZV9mcm9tX2hhc2goKTogZjogMHglcCwgIgorCQkgICJpbm8gJXVcbiIsIGYsIGYtPmlubykpOworCisJbGlzdF9kZWwoJmYtPmhhc2gpOworCXJldHVybiAwOworfQorCisKKy8qIEp1c3QgcmVtb3ZlIHRoZSBmaWxlIGZyb20gdGhlIHBhcmVudCdzIGNoaWxkcmVuLiAgRG9uJ3QgZnJlZQorICAgYW55IG1lbW9yeS4gICovCitpbnQKK2pmZnNfdW5saW5rX2ZpbGVfZnJvbV90cmVlKHN0cnVjdCBqZmZzX2ZpbGUgKmYpCit7CisJRDMocHJpbnRrKCJqZmZzX3VubGlua19maWxlX2Zyb21fdHJlZSgpOiBpbm86ICVkLCBwaW5vOiAlZCwgbmFtZTogIgorCQkgICJcIiVzXCJcbiIsIGYtPmlubywgZi0+cGlubywgKGYtPm5hbWUgPyBmLT5uYW1lIDogIiIpKSk7CisKKwlpZiAoZi0+c2libGluZ19wcmV2KSB7CisJCWYtPnNpYmxpbmdfcHJldi0+c2libGluZ19uZXh0ID0gZi0+c2libGluZ19uZXh0OworCX0KKwllbHNlIGlmIChmLT5wYXJlbnQpIHsKKwkgICAgICAgIEQzKHByaW50aygiZi0+cGFyZW50PSVwXG4iLCBmLT5wYXJlbnQpKTsKKwkJZi0+cGFyZW50LT5jaGlsZHJlbiA9IGYtPnNpYmxpbmdfbmV4dDsKKwl9CisJaWYgKGYtPnNpYmxpbmdfbmV4dCkgeworCQlmLT5zaWJsaW5nX25leHQtPnNpYmxpbmdfcHJldiA9IGYtPnNpYmxpbmdfcHJldjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogRmluZCBhIGZpbGUgd2l0aCBpdHMgaW5vZGUgbnVtYmVyLiAgKi8KK3N0cnVjdCBqZmZzX2ZpbGUgKgoramZmc19maW5kX2ZpbGUoc3RydWN0IGpmZnNfY29udHJvbCAqYywgX191MzIgaW5vKQoreworCXN0cnVjdCBqZmZzX2ZpbGUgKmY7CisJaW50IGkgPSBpbm8gJSBjLT5oYXNoX2xlbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisKKwlEMyhwcmludGsoImpmZnNfZmluZF9maWxlKCk6IGlubzogJXVcbiIsIGlubykpOworCisJZm9yICh0bXAgPSBjLT5oYXNoW2ldLm5leHQ7IHRtcCAhPSAmYy0+aGFzaFtpXTsgdG1wID0gdG1wLT5uZXh0KSB7CisJCWYgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGpmZnNfZmlsZSwgaGFzaCk7CisJCWlmIChpbm8gIT0gZi0+aW5vKQorCQkJY29udGludWU7CisJCUQzKHByaW50aygiamZmc19maW5kX2ZpbGUoKTogRm91bmQgZmlsZSB3aXRoIGlubyAiCisJCQkgICAgICAgIiV1LiAobmFtZTogXCIlc1wiKVxuIiwKKwkJCSAgICAgICBpbm8sIChmLT5uYW1lID8gZi0+bmFtZSA6ICIiKSk7CisJCSk7CisJCXJldHVybiBmOworCX0KKwlEMyhwcmludGsoImpmZnNfZmluZF9maWxlKCk6IERpZG4ndCBmaW5kIGZpbGUgIgorCQkJICJ3aXRoIGlubyAldS5cbiIsIGlubyk7CisJKTsKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKiBGaW5kIGEgZmlsZSBpbiBhIGRpcmVjdG9yeS4gIFdlIGFyZSBjb21wYXJpbmcgdGhlIG5hbWVzLiAgKi8KK3N0cnVjdCBqZmZzX2ZpbGUgKgoramZmc19maW5kX2NoaWxkKHN0cnVjdCBqZmZzX2ZpbGUgKmRpciwgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgamZmc19maWxlICpmOworCisJRDMocHJpbnRrKCJqZmZzX2ZpbmRfY2hpbGQoKVxuIikpOworCisJZm9yIChmID0gZGlyLT5jaGlsZHJlbjsgZjsgZiA9IGYtPnNpYmxpbmdfbmV4dCkgeworCQlpZiAoIWYtPmRlbGV0ZWQgJiYgZi0+bmFtZQorCQkgICAgJiYgIXN0cm5jbXAoZi0+bmFtZSwgbmFtZSwgbGVuKQorCQkgICAgJiYgZi0+bmFtZVtsZW5dID09ICdcMCcpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJRDMoaWYgKGYpIHsKKwkJcHJpbnRrKCJqZmZzX2ZpbmRfY2hpbGQoKTogRm91bmQgXCIlc1wiLlxuIiwgZi0+bmFtZSk7CisJfQorCWVsc2UgeworCQljaGFyICpjb3B5ID0gKGNoYXIgKikga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGNvcHkpIHsKKwkJCW1lbWNweShjb3B5LCBuYW1lLCBsZW4pOworCQkJY29weVtsZW5dID0gJ1wwJzsKKwkJfQorCQlwcmludGsoImpmZnNfZmluZF9jaGlsZCgpOiBEaWRuJ3QgZmluZCB0aGUgZmlsZSBcIiVzXCIuXG4iLAorCQkgICAgICAgKGNvcHkgPyBjb3B5IDogIiIpKTsKKwkJaWYgKGNvcHkpIHsKKwkJCWtmcmVlKGNvcHkpOworCQl9CisJfSk7CisKKwlyZXR1cm4gZjsKK30KKworCisvKiBXcml0ZSBhIHJhdyBpbm9kZSB0aGF0IHRha2VzIHVwIGEgY2VydGFpbiBhbW91bnQgb2Ygc3BhY2UgaW4gdGhlIGZsYXNoCisgICBtZW1vcnkuICBBdCB0aGUgZW5kIG9mIHRoZSBmbGFzaCBkZXZpY2UsIHRoZXJlIGlzIG9mdGVuIHNwYWNlIHRoYXQgaXMKKyAgIGltcG9zc2libGUgdG8gdXNlLiAgQXQgdGhlc2UgdGltZXMgd2Ugd2FudCB0byBtYXJrIHRoaXMgc3BhY2UgYXMgbm90CisgICB1c2VkLiAgSW4gdGhlIGNhc2VzIHdoZW4gdGhlIGFtb3VudCBvZiBzcGFjZSBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4KKyAgIGEgc3RydWN0IGpmZnNfcmF3X2lub2RlLCB3ZSB3cml0ZSBhICJkdW1teSBub2RlIiB0aGF0IHRha2VzIHVwIHRoaXMKKyAgIHNwYWNlLiAgVGhlIHNwYWNlIGFmdGVyIHRoZSByYXcgaW5vZGUsIGlmIGl0IGV4aXN0cywgaXMgbGVmdCBhcyBpdCBpcy4KKyAgIFNpbmNlIHRoaXMgc3BhY2UgYWZ0ZXIgdGhlIHJhdyBpbm9kZSBjb250YWlucyBKRkZTX0VNUFRZX0JJVE1BU0sgYnl0ZXMsCisgICB3ZSBjYW4gY29tcHV0ZSB0aGUgY2hlY2tzdW0gb2YgaXQ7IHdlIGRvbid0IGhhdmUgdG8gbWFuaXB1bGF0ZSBpdCBhbnkKKyAgIGZ1cnRoZXIuCisKKyAgIElmIHRoZSBzcGFjZSBsZWZ0IG9uIHRoZSBkZXZpY2UgaXMgbGVzcyB0aGFuIHRoZSBzaXplIG9mIGEgc3RydWN0CisgICBqZmZzX3Jhd19pbm9kZSwgdGhpcyBzcGFjZSBpcyBmaWxsZWQgd2l0aCBKRkZTX0RJUlRZX0JJVE1BU0sgYnl0ZXMuCisgICBObyByYXcgaW5vZGUgaXMgd3JpdHRlbiB0aGlzIHRpbWUuICAqLworc3RhdGljIGludAoramZmc193cml0ZV9kdW1teV9ub2RlKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMsIHN0cnVjdCBqZmZzX2ZtICpkaXJ0eV9mbSkKK3sKKwlzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYyA9IGMtPmZtYzsKKwlpbnQgZXJyOworCisJRDEocHJpbnRrKCJqZmZzX3dyaXRlX2R1bW15X25vZGUoKTogZGlydHlfZm0tPm9mZnNldCA9IDB4JTA4eCwgIgorCQkgICJkaXJ0eV9mbS0+c2l6ZSA9ICV1XG4iLAorCQkgIGRpcnR5X2ZtLT5vZmZzZXQsIGRpcnR5X2ZtLT5zaXplKSk7CisKKwlpZiAoZGlydHlfZm0tPnNpemUgPj0gc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkpIHsKKwkJc3RydWN0IGpmZnNfcmF3X2lub2RlIHJhd19pbm9kZTsKKwkJbWVtc2V0KCZyYXdfaW5vZGUsIDAsIHNpemVvZihzdHJ1Y3QgamZmc19yYXdfaW5vZGUpKTsKKwkJcmF3X2lub2RlLm1hZ2ljID0gSkZGU19NQUdJQ19CSVRNQVNLOworCQlyYXdfaW5vZGUuZHNpemUgPSBkaXJ0eV9mbS0+c2l6ZQorCQkJCSAgLSBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKTsKKwkJcmF3X2lub2RlLmRjaGtzdW0gPSByYXdfaW5vZGUuZHNpemUgKiAweGZmOworCQlyYXdfaW5vZGUuY2hrc3VtCisJCT0gamZmc19jaGVja3N1bSgmcmF3X2lub2RlLCBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKSk7CisKKwkJaWYgKChlcnIgPSBmbGFzaF9zYWZlX3dyaXRlKGZtYy0+bXRkLAorCQkJCQkgICAgZGlydHlfZm0tPm9mZnNldCwKKwkJCQkJICAgICh1X2NoYXIgKikmcmF3X2lub2RlLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkpKQorCQkgICAgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkpGRlM6IGpmZnNfd3JpdGVfZHVtbXlfbm9kZTogIgorCQkJICAgICAgICJmbGFzaF9zYWZlX3dyaXRlIGZhaWxlZCFcbiIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwllbHNlIHsKKwkJZmxhc2hfc2FmZV9hY3F1aXJlKGZtYy0+bXRkKTsKKwkJZmxhc2hfbWVtc2V0KGZtYy0+bXRkLCBkaXJ0eV9mbS0+b2Zmc2V0LCAwLCBkaXJ0eV9mbS0+c2l6ZSk7CisJCWZsYXNoX3NhZmVfcmVsZWFzZShmbWMtPm10ZCk7CisJfQorCisJRDMocHJpbnRrKCJqZmZzX3dyaXRlX2R1bW15X25vZGUoKTogTGVhdmluZy4uLlxuIikpOworCXJldHVybiAwOworfQorCisKKy8qIFdyaXRlIGEgcmF3IGlub2RlLCBwb3NzaWJseSBpdHMgbmFtZSBhbmQgcG9zc2libHkgc29tZSBkYXRhLiAgKi8KK2ludAoramZmc193cml0ZV9ub2RlKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMsIHN0cnVjdCBqZmZzX25vZGUgKm5vZGUsCisJCXN0cnVjdCBqZmZzX3Jhd19pbm9kZSAqcmF3X2lub2RlLAorCQljb25zdCBjaGFyICpuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQlpbnQgcmVjb3ZlcmFibGUsCisJCXN0cnVjdCBqZmZzX2ZpbGUgKmYpCit7CisJc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMgPSBjLT5mbWM7CisJc3RydWN0IGpmZnNfZm0gKmZtOworCXN0cnVjdCBrdmVjIG5vZGVfaW92ZWNbNF07CisJdW5zaWduZWQgbG9uZyBpb3ZlY19jbnQ7CisKKwlfX3UzMiBwb3M7CisJaW50IGVycjsKKwlfX3UzMiBzbGFjayA9IDA7CisKKwlfX3UzMiB0b3RhbF9uYW1lX3NpemUgPSByYXdfaW5vZGUtPm5zaXplCisJCQkJKyBKRkZTX0dFVF9QQURfQllURVMocmF3X2lub2RlLT5uc2l6ZSk7CisJX191MzIgdG90YWxfZGF0YV9zaXplID0gcmF3X2lub2RlLT5kc2l6ZQorCQkJCSsgSkZGU19HRVRfUEFEX0JZVEVTKHJhd19pbm9kZS0+ZHNpemUpOworCV9fdTMyIHRvdGFsX3NpemUgPSBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKQorCQkJICAgKyB0b3RhbF9uYW1lX3NpemUgKyB0b3RhbF9kYXRhX3NpemU7CisJCisJLyogSWYgdGhpcyBub2RlIGlzbid0IHNvbWV0aGluZyB0aGF0IHdpbGwgZXZlbnR1YWxseSBsZXQKKwkgICBHQyBmcmVlIGV2ZW4gbW9yZSBzcGFjZSwgdGhlbiBkb24ndCBhbGxvdyBpdCB1bmxlc3MKKwkgICB0aGVyZSdzIGF0IGxlYXN0IG1heF9jaHVua19zaXplIHNwYWNlIHN0aWxsIGF2YWlsYWJsZQorCSovCisJaWYgKCFyZWNvdmVyYWJsZSkKKwkJc2xhY2sgPSBmbWMtPm1heF9jaHVua19zaXplOworCQkKKworCS8qIEZpcmUgdGhlIHJldHJvcm9ja2V0cyBhbmQgc2hvb3QgdGhlIGZydWl0b24gdG9ycGVkb2VzLCBzaXIhICAqLworCisJQVNTRVJUKGlmICghbm9kZSkgeworCQlwcmludGsoImpmZnNfd3JpdGVfbm9kZSgpOiBub2RlID09IE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9KTsKKwlBU1NFUlQoaWYgKHJhd19pbm9kZSAmJiByYXdfaW5vZGUtPm5zaXplICYmICFuYW1lKSB7CisJCXByaW50aygiKioqIGpmZnNfd3JpdGVfbm9kZSgpOiBuc2l6ZSA9ICV1IGJ1dCBuYW1lID09IE5VTExcbiIsCisJCSAgICAgICByYXdfaW5vZGUtPm5zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSk7CisKKwlEMShwcmludGsoImpmZnNfd3JpdGVfbm9kZSgpOiBmaWxlbmFtZSA9IFwiJXNcIiwgaW5vID0gJXUsICIKKwkJICAidG90YWxfc2l6ZSA9ICV1XG4iLAorCQkgIChuYW1lID8gbmFtZSA6ICIiKSwgcmF3X2lub2RlLT5pbm8sCisJCSAgdG90YWxfc2l6ZSkpOworCisJamZmc19mbV93cml0ZV9sb2NrKGZtYyk7CisKK3JldHJ5OgorCWZtID0gTlVMTDsKKwllcnIgPSAwOworCXdoaWxlICghZm0pIHsKKworCQkvKiBEZWFkbG9ja3Mgc3Vjay4gKi8KKwkJd2hpbGUoZm1jLT5mcmVlX3NpemUgPCBmbWMtPm1pbl9mcmVlX3NpemUgKyB0b3RhbF9zaXplICsgc2xhY2spIHsKKwkJCWpmZnNfZm1fd3JpdGVfdW5sb2NrKGZtYyk7CisJCQlpZiAoIUpGRlNfRU5PVUdIX1NQQUNFKGMsIHRvdGFsX3NpemUgKyBzbGFjaykpCisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQlqZmZzX2ZtX3dyaXRlX2xvY2soZm1jKTsKKwkJfQorCisJCS8qIEZpcnN0IHRyeSB0byBhbGxvY2F0ZSBzb21lIGZsYXNoIG1lbW9yeS4gICovCisJCWVyciA9IGpmZnNfZm1hbGxvYyhmbWMsIHRvdGFsX3NpemUsIG5vZGUsICZmbSk7CisJCQorCQlpZiAoZXJyID09IC1FTk9TUEMpIHsKKwkJCS8qIEp1c3Qgb3V0IG9mIHNwYWNlLiBHQyBhbmQgdHJ5IGFnYWluICovCisJCQlpZiAoZm1jLT5kaXJ0eV9zaXplIDwgZm1jLT5zZWN0b3Jfc2l6ZSkgeworCQkJCUQocHJpbnRrKCJqZmZzX3dyaXRlX25vZGUoKTogamZmc19mbWFsbG9jKDB4JXAsICV1KSAiCisJCQkJCSAiZmFpbGVkLCBubyBkaXJ0eSBzcGFjZSB0byBHQ1xuIiwgZm1jLAorCQkJCQkgdG90YWxfc2l6ZSkpOworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCQkKKwkJCUQxKHByaW50ayhLRVJOX0lORk8gImpmZnNfd3JpdGVfbm9kZSgpOiBDYWxsaW5nIGpmZnNfZ2FyYmFnZV9jb2xsZWN0X25vdygpXG4iKSk7CisJCQlqZmZzX2ZtX3dyaXRlX3VubG9jayhmbWMpOworCQkJaWYgKChlcnIgPSBqZmZzX2dhcmJhZ2VfY29sbGVjdF9ub3coYykpKSB7CisJCQkJRChwcmludGsoImpmZnNfd3JpdGVfbm9kZSgpOiBqZmZzX2dhcmJhZ2VfY29sbGVjdF9ub3coKSBmYWlsZWRcbiIpKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQkJamZmc19mbV93cml0ZV9sb2NrKGZtYyk7CisJCQljb250aW51ZTsKKwkJfSAKKworCQlpZiAoZXJyIDwgMCkgeworCQkJamZmc19mbV93cml0ZV91bmxvY2soZm1jKTsKKworCQkJRChwcmludGsoImpmZnNfd3JpdGVfbm9kZSgpOiBqZmZzX2ZtYWxsb2MoMHglcCwgJXUpICIKKwkJCQkgImZhaWxlZCFcbiIsIGZtYywgdG90YWxfc2l6ZSkpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWlmICghZm0tPm5vZGVzKSB7CisJCQkvKiBUaGUgamZmc19mbSBzdHJ1Y3QgdGhhdCB3ZSBnb3QgaXMgbm90IGdvb2QgZW5vdWdoLgorCQkJICAgTWFrZSB0aGF0IHNwYWNlIGRpcnR5IGFuZCB0cnkgYWdhaW4gICovCisJCQlpZiAoKGVyciA9IGpmZnNfd3JpdGVfZHVtbXlfbm9kZShjLCBmbSkpIDwgMCkgeworCQkJCWtmcmVlKGZtKTsKKwkJCQlESk0obm9famZmc19mbS0tKTsKKwkJCQlqZmZzX2ZtX3dyaXRlX3VubG9jayhmbWMpOworCQkJCUQocHJpbnRrKCJqZmZzX3dyaXRlX25vZGUoKTogIgorCQkJCQkgImpmZnNfd3JpdGVfZHVtbXlfbm9kZSgpOiBGYWlsZWQhXG4iKSk7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJCWZtID0gTlVMTDsKKwkJfQorCX0gLyogd2hpbGUoIWZtKSAqLworCW5vZGUtPmZtID0gZm07CisKKwlBU1NFUlQoaWYgKGZtLT5ub2RlcyA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiamZmc193cml0ZV9ub2RlKCk6IGZtLT5ub2RlcyA9PSAwXG4iKTsKKwl9KTsKKworCXBvcyA9IG5vZGUtPmZtLT5vZmZzZXQ7CisKKwkvKiBJbmNyZW1lbnQgdGhlIHZlcnNpb24gbnVtYmVyIGhlcmUuIFdlIGNhbid0IGxldCB0aGUgY2FsbGVyCisJICAgc2V0IGl0IGJlZm9yZWhhbmQsIGJlY2F1c2Ugd2UgbWlnaHQgaGF2ZSBoYWQgdG8gZG8gR0Mgb24gYSBub2RlCisJICAgb2YgdGhpcyBmaWxlIC0gYW5kIHdlJ2QgZW5kIHVwIHJldXNpbmcgdmVyc2lvbiBudW1iZXJzLgorCSovCisJaWYgKGYpIHsKKwkJcmF3X2lub2RlLT52ZXJzaW9uID0gZi0+aGlnaGVzdF92ZXJzaW9uICsgMTsKKwkJRDEocHJpbnRrIChLRVJOX05PVElDRSAiamZmc193cml0ZV9ub2RlKCk6IHNldHRpbmcgdmVyc2lvbiBvZiAlcyB0byAlZFxuIiwgZi0+bmFtZSwgcmF3X2lub2RlLT52ZXJzaW9uKSk7CisKKwkJLyogaWYgdGhlIGZpbGUgd2FzIGRlbGV0ZWQsIHNldCB0aGUgZGVsZXRlZCBiaXQgaW4gdGhlIHJhdyBpbm9kZSAqLworCQlpZiAoZi0+ZGVsZXRlZCkKKwkJCXJhd19pbm9kZS0+ZGVsZXRlZCA9IDE7CisJfQorCisJLyogQ29tcHV0ZSB0aGUgY2hlY2tzdW0gZm9yIHRoZSBkYXRhIGFuZCBuYW1lIGNodW5rcy4gICovCisJcmF3X2lub2RlLT5kY2hrc3VtID0gamZmc19jaGVja3N1bShkYXRhLCByYXdfaW5vZGUtPmRzaXplKTsKKwlyYXdfaW5vZGUtPm5jaGtzdW0gPSBqZmZzX2NoZWNrc3VtKG5hbWUsIHJhd19pbm9kZS0+bnNpemUpOworCisJLyogVGhlIGNoZWNrc3VtIGlzIGNhbGN1bGF0ZWQgd2l0aG91dCB0aGUgY2hrc3VtIGFuZCBhY2N1cmF0ZQorCSAgIGZpZWxkcyBzbyBzZXQgdGhlbSB0byB6ZXJvIGZpcnN0LiAgKi8KKwlyYXdfaW5vZGUtPmFjY3VyYXRlID0gMDsKKwlyYXdfaW5vZGUtPmNoa3N1bSA9IDA7CisJcmF3X2lub2RlLT5jaGtzdW0gPSBqZmZzX2NoZWNrc3VtKHJhd19pbm9kZSwKKwkJCQkJICBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKSk7CisJcmF3X2lub2RlLT5hY2N1cmF0ZSA9IDB4ZmY7CisKKwlEMyhwcmludGsoImpmZnNfd3JpdGVfbm9kZSgpOiBBYm91dCB0byB3cml0ZSB0aGlzIHJhdyBpbm9kZSB0byB0aGUgIgorCQkgICJmbGFzaCBhdCBwb3MgMHglbHg6XG4iLCAobG9uZylwb3MpKTsKKwlEMyhqZmZzX3ByaW50X3Jhd19pbm9kZShyYXdfaW5vZGUpKTsKKworCS8qIFRoZSBhY3R1YWwgcmF3IEpGRlMgbm9kZSAqLworCW5vZGVfaW92ZWNbMF0uaW92X2Jhc2UgPSAodm9pZCAqKSByYXdfaW5vZGU7CisJbm9kZV9pb3ZlY1swXS5pb3ZfbGVuID0gKHNpemVfdCkgc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSk7CisJaW92ZWNfY250ID0gMTsKKworCS8qIEdldCBuYW1lIGFuZCBzaXplIGlmIHRoZXJlIGlzIG9uZSAqLworCWlmIChyYXdfaW5vZGUtPm5zaXplKSB7CisJCW5vZGVfaW92ZWNbaW92ZWNfY250XS5pb3ZfYmFzZSA9ICh2b2lkICopIG5hbWU7CisJCW5vZGVfaW92ZWNbaW92ZWNfY250XS5pb3ZfbGVuID0gKHNpemVfdCkgcmF3X2lub2RlLT5uc2l6ZTsKKwkJaW92ZWNfY250Kys7CisKKwkJaWYgKEpGRlNfR0VUX1BBRF9CWVRFUyhyYXdfaW5vZGUtPm5zaXplKSkgeworCQkJc3RhdGljIGNoYXIgYWxsZmZbM109ezI1NSwyNTUsMjU1fTsKKwkJCS8qIEFkZCBzb21lIGV4dHJhIHBhZGRpbmcgaWYgbmVjZXNzYXJ5ICovCisJCQlub2RlX2lvdmVjW2lvdmVjX2NudF0uaW92X2Jhc2UgPSBhbGxmZjsKKwkJCW5vZGVfaW92ZWNbaW92ZWNfY250XS5pb3ZfbGVuID0KKwkJCQlKRkZTX0dFVF9QQURfQllURVMocmF3X2lub2RlLT5uc2l6ZSk7CisJCQlpb3ZlY19jbnQrKzsKKwkJfQorCX0KKworCS8qIEdldCBkYXRhIGFuZCBzaXplIGlmIHRoZXJlIGlzIGFueSAqLworCWlmIChyYXdfaW5vZGUtPmRzaXplKSB7CisJCW5vZGVfaW92ZWNbaW92ZWNfY250XS5pb3ZfYmFzZSA9ICh2b2lkICopIGRhdGE7CisJCW5vZGVfaW92ZWNbaW92ZWNfY250XS5pb3ZfbGVuID0gKHNpemVfdCkgcmF3X2lub2RlLT5kc2l6ZTsKKwkJaW92ZWNfY250Kys7CisJCS8qIE5vIG5lZWQgdG8gcGFkIHRoaXMgYmVjYXVzZSB3ZSdyZSBub3QgYWN0dWFsbHkgcHV0dGluZworCQkgICBhbnl0aGluZyBhZnRlciBpdC4KKwkJKi8KKwl9CisKKwlpZiAoKGVyciA9IGZsYXNoX3NhZmVfd3JpdGV2KGZtYy0+bXRkLCBub2RlX2lvdmVjLCBpb3ZlY19jbnQsCisJCQkJICAgIHBvcykpIDwgMCkgeworCQlqZmZzX2ZtZnJlZV9wYXJ0bHkoZm1jLCBmbSwgMCk7CisJCWpmZnNfZm1fd3JpdGVfdW5sb2NrKGZtYyk7CisJCXByaW50ayhLRVJOX0VSUiAiSkZGUzogamZmc193cml0ZV9ub2RlOiBGYWlsZWQgdG8gd3JpdGUsICIKKwkJICAgICAgICJyZXF1ZXN0ZWQgJWksIHdyb3RlICVpXG4iLCB0b3RhbF9zaXplLCBlcnIpOworCQlnb3RvIHJldHJ5OworCX0KKwlpZiAocmF3X2lub2RlLT5kZWxldGVkKQorCQlmLT5kZWxldGVkID0gMTsKKworCWpmZnNfZm1fd3JpdGVfdW5sb2NrKGZtYyk7CisJRDMocHJpbnRrKCJqZmZzX3dyaXRlX25vZGUoKTogTGVhdmluZy4uLlxuIikpOworCXJldHVybiByYXdfaW5vZGUtPmRzaXplOworfSAvKiBqZmZzX3dyaXRlX25vZGUoKSAgKi8KKworCisvKiBSZWFkIGRhdGEgZnJvbSB0aGUgbm9kZSBhbmQgd3JpdGUgaXQgdG8gdGhlIGJ1ZmZlci4gICdub2RlX29mZnNldCcKKyAgIGlzIGhvdyBtdWNoIHdlIGhhdmUgcmVhZCBmcm9tIHRoaXMgcGFydGljdWxhciBub2RlIGJlZm9yZSBhbmQgd2hpY2gKKyAgIHNob3VsZG4ndCBiZSByZWFkIGFnYWluLiAgJ21heF9zaXplJyBpcyBob3cgbXVjaCBzcGFjZSB0aGVyZSBpcyBpbgorICAgdGhlIGJ1ZmZlci4gICovCitzdGF0aWMgaW50CitqZmZzX2dldF9ub2RlX2RhdGEoc3RydWN0IGpmZnNfZmlsZSAqZiwgc3RydWN0IGpmZnNfbm9kZSAqbm9kZSwgCisJCSAgIHVuc2lnbmVkIGNoYXIgKmJ1ZixfX3UzMiBub2RlX29mZnNldCwgX191MzIgbWF4X3NpemUpCit7CisJc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMgPSBmLT5jLT5mbWM7CisJX191MzIgcG9zID0gbm9kZS0+Zm0tPm9mZnNldCArIG5vZGUtPmZtX29mZnNldCArIG5vZGVfb2Zmc2V0OworCV9fdTMyIGF2YWlsID0gbm9kZS0+ZGF0YV9zaXplIC0gbm9kZV9vZmZzZXQ7CisJX191MzIgcjsKKworCUQyKHByaW50aygiICBqZmZzX2dldF9ub2RlX2RhdGEoKTogZmlsZTogXCIlc1wiLCBpbm86ICV1LCAiCisJCSAgInZlcnNpb246ICV1LCBub2RlX29mZnNldDogJXVcbiIsCisJCSAgZi0+bmFtZSwgbm9kZS0+aW5vLCBub2RlLT52ZXJzaW9uLCBub2RlX29mZnNldCkpOworCisJciA9IG1pbihhdmFpbCwgbWF4X3NpemUpOworCUQzKHByaW50ayhLRVJOX05PVElDRSAiamZmc19nZXRfbm9kZV9kYXRhXG4iKSk7CisJZmxhc2hfc2FmZV9yZWFkKGZtYy0+bXRkLCBwb3MsIGJ1Ziwgcik7CisKKwlEMyhwcmludGsoIiAgamZmc19nZXRfbm9kZV9kYXRhKCk6IFJlYWQgJXUgYnl0ZSVzLlxuIiwKKwkJICByLCAociA9PSAxID8gIiIgOiAicyIpKSk7CisKKwlyZXR1cm4gcjsKK30KKworCisvKiBSZWFkIGRhdGEgZnJvbSB0aGUgZmlsZSdzIG5vZGVzLiAgV3JpdGUgdGhlIGRhdGEgdG8gdGhlIGJ1ZmZlcgorICAgJ2J1ZicuICAncmVhZF9vZmZzZXQnIHRlbGxzIGhvdyBtdWNoIGRhdGEgd2Ugc2hvdWxkIHNraXAuICAqLworaW50CitqZmZzX3JlYWRfZGF0YShzdHJ1Y3QgamZmc19maWxlICpmLCB1bnNpZ25lZCBjaGFyICpidWYsIF9fdTMyIHJlYWRfb2Zmc2V0LAorCSAgICAgICBfX3UzMiBzaXplKQoreworCXN0cnVjdCBqZmZzX25vZGUgKm5vZGU7CisJX191MzIgcmVhZF9kYXRhID0gMDsgLyogVG90YWwgYW1vdW50IG9mIHJlYWQgZGF0YS4gICovCisJX191MzIgbm9kZV9vZmZzZXQgPSAwOworCV9fdTMyIHBvcyA9IDA7IC8qIE51bWJlciBvZiBieXRlcyB0cmF2ZXJzZWQuICAqLworCisJRDIocHJpbnRrKCJqZmZzX3JlYWRfZGF0YSgpOiBmaWxlID0gXCIlc1wiLCByZWFkX29mZnNldCA9ICVkLCAiCisJCSAgInNpemUgPSAldVxuIiwKKwkJICAoZi0+bmFtZSA/IGYtPm5hbWUgOiAiIiksIHJlYWRfb2Zmc2V0LCBzaXplKSk7CisKKwlpZiAocmVhZF9vZmZzZXQgPj0gZi0+c2l6ZSkgeworCQlEKHByaW50aygiICBmLT5zaXplOiAlZFxuIiwgZi0+c2l6ZSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBGaXJzdCBmaW5kIHRoZSBub2RlIHRvIHJlYWQgZGF0YSBmcm9tLiAgKi8KKwlub2RlID0gZi0+cmFuZ2VfaGVhZDsKKwl3aGlsZSAocG9zIDw9IHJlYWRfb2Zmc2V0KSB7CisJCW5vZGVfb2Zmc2V0ID0gcmVhZF9vZmZzZXQgLSBwb3M7CisJCWlmIChub2RlX29mZnNldCA+PSBub2RlLT5kYXRhX3NpemUpIHsKKwkJCXBvcyArPSBub2RlLT5kYXRhX3NpemU7CisJCQlub2RlID0gbm9kZS0+cmFuZ2VfbmV4dDsKKwkJfQorCQllbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogIkNhdHMgYXJlIGxpdmluZyBwcm9vZiB0aGF0IG5vdCBldmVyeXRoaW5nIGluIG5hdHVyZQorCSAgIGhhcyB0byBiZSB1c2VmdWwuIgorCSAgIC0gR2Fycmlzb24gS2VpbG9yICgnOTcpICAqLworCisJLyogRmlsbCB0aGUgYnVmZmVyLiAgKi8KKwl3aGlsZSAobm9kZSAmJiAocmVhZF9kYXRhIDwgc2l6ZSkpIHsKKwkJaW50IHI7CisJCWlmICghbm9kZS0+Zm0pIHsKKwkJCS8qIFRoaXMgbm9kZSBkb2VzIG5vdCByZWZlciB0byByZWFsIGRhdGEuICAqLworCQkJciA9IG1pbihzaXplIC0gcmVhZF9kYXRhLAorCQkJCSAgICAgbm9kZS0+ZGF0YV9zaXplIC0gbm9kZV9vZmZzZXQpOworCQkJbWVtc2V0KCZidWZbcmVhZF9kYXRhXSwgMCwgcik7CisJCX0KKwkJZWxzZSBpZiAoKHIgPSBqZmZzX2dldF9ub2RlX2RhdGEoZiwgbm9kZSwgJmJ1ZltyZWFkX2RhdGFdLAorCQkJCQkJIG5vZGVfb2Zmc2V0LAorCQkJCQkJIHNpemUgLSByZWFkX2RhdGEpKSA8IDApIHsKKwkJCXJldHVybiByOworCQl9CisJCXJlYWRfZGF0YSArPSByOworCQlub2RlX29mZnNldCA9IDA7CisJCW5vZGUgPSBub2RlLT5yYW5nZV9uZXh0OworCX0KKwlEMyhwcmludGsoIiAgamZmc19yZWFkX2RhdGEoKTogUmVhZCAldSBieXRlcy5cbiIsIHJlYWRfZGF0YSkpOworCXJldHVybiByZWFkX2RhdGE7Cit9CisKKworLyogVXNlZCBmb3IgdHJhdmVyc2luZyBhbGwgbm9kZXMgaW4gdGhlIGhhc2ggdGFibGUuICAqLworaW50CitqZmZzX2ZvcmVhY2hfZmlsZShzdHJ1Y3QgamZmc19jb250cm9sICpjLCBpbnQgKCpmdW5jKShzdHJ1Y3QgamZmc19maWxlICopKQoreworCWludCBwb3M7CisJaW50IHI7CisJaW50IHJlc3VsdCA9IDA7CisKKwlmb3IgKHBvcyA9IDA7IHBvcyA8IGMtPmhhc2hfbGVuOyBwb3MrKykgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbmV4dDsKKwkJZm9yIChwID0gYy0+aGFzaFtwb3NdLm5leHQ7IHAgIT0gJmMtPmhhc2hbcG9zXTsgcCA9IG5leHQpIHsKKwkJCS8qIFdlIG5lZWQgYSByZWZlcmVuY2UgdG8gdGhlIG5leHQgZmlsZSBpbiB0aGUKKwkJCSAgIGxpc3QgYmVjYXVzZSBgZnVuYycgbWlnaHQgcmVtb3ZlIHRoZSBjdXJyZW50CisJCQkgICBmaWxlIGBmJy4gICovCisJCQluZXh0ID0gcC0+bmV4dDsKKwkJCXIgPSBmdW5jKGxpc3RfZW50cnkocCwgc3RydWN0IGpmZnNfZmlsZSwgaGFzaCkpOworCQkJaWYgKHIgPCAwKQorCQkJCXJldHVybiByOworCQkJcmVzdWx0ICs9IHI7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qIEZyZWUgYWxsIG5vZGVzIGFzc29jaWF0ZWQgd2l0aCBhIGZpbGUuICAqLworc3RhdGljIGludAoramZmc19mcmVlX25vZGVfbGlzdChzdHJ1Y3QgamZmc19maWxlICpmKQoreworCXN0cnVjdCBqZmZzX25vZGUgKm5vZGU7CisJc3RydWN0IGpmZnNfbm9kZSAqcDsKKworCUQzKHByaW50aygiamZmc19mcmVlX25vZGVfbGlzdCgpOiBmICMldSwgXCIlc1wiXG4iLAorCQkgIGYtPmlubywgKGYtPm5hbWUgPyBmLT5uYW1lIDogIiIpKSk7CisJbm9kZSA9IGYtPnZlcnNpb25faGVhZDsKKwl3aGlsZSAobm9kZSkgeworCQlwID0gbm9kZTsKKwkJbm9kZSA9IG5vZGUtPnZlcnNpb25fbmV4dDsKKwkJamZmc19mcmVlX25vZGUocCk7CisJCURKTShub19qZmZzX25vZGUtLSk7CisJfQorCXJldHVybiAwOworfQorCisKKy8qIEZyZWUgYSBmaWxlIGFuZCBpdHMgbmFtZS4gICovCitzdGF0aWMgaW50CitqZmZzX2ZyZWVfZmlsZShzdHJ1Y3QgamZmc19maWxlICpmKQoreworCUQzKHByaW50aygiamZmc19mcmVlX2ZpbGU6IGYgIyV1LCBcIiVzXCJcbiIsCisJCSAgZi0+aW5vLCAoZi0+bmFtZSA/IGYtPm5hbWUgOiAiIikpKTsKKworCWlmIChmLT5uYW1lKSB7CisJCWtmcmVlKGYtPm5hbWUpOworCQlESk0obm9fbmFtZS0tKTsKKwl9CisJa2ZyZWUoZik7CisJbm9famZmc19maWxlLS07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nCitqZmZzX2dldF9maWxlX2NvdW50KHZvaWQpCit7CisJcmV0dXJuIG5vX2pmZnNfZmlsZTsKK30KKworLyogU2VlIGlmIGEgZmlsZSBpcyBkZWxldGVkLiBJZiBzbywgbWFyayB0aGF0IGZpbGUncyBub2RlcyBhcyBvYnNvbGV0ZS4gICovCitpbnQKK2pmZnNfcG9zc2libHlfZGVsZXRlX2ZpbGUoc3RydWN0IGpmZnNfZmlsZSAqZikKK3sKKwlzdHJ1Y3QgamZmc19ub2RlICpuOworCisJRDMocHJpbnRrKCJqZmZzX3Bvc3NpYmx5X2RlbGV0ZV9maWxlKCk6IGlubzogJXVcbiIsCisJCSAgZi0+aW5vKSk7CisKKwlBU1NFUlQoaWYgKCFmKSB7CisJCXByaW50ayhLRVJOX0VSUiAiamZmc19wb3NzaWJseV9kZWxldGVfZmlsZSgpOiBmID09IE5VTExcbiIpOworCQlyZXR1cm4gLTE7CisJfSk7CisKKwlpZiAoZi0+ZGVsZXRlZCkgeworCQkvKiBGaXJzdCB0cnkgdG8gcmVtb3ZlIGFsbCBvbGRlciB2ZXJzaW9ucy4gIENvbW1lbmNlIHdpdGgKKwkJICAgdGhlIG9sZGVzdCBub2RlLiAgKi8KKwkJZm9yIChuID0gZi0+dmVyc2lvbl9oZWFkOyBuOyBuID0gbi0+dmVyc2lvbl9uZXh0KSB7CisJCQlpZiAoIW4tPmZtKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoamZmc19mbWZyZWUoZi0+Yy0+Zm1jLCBuLT5mbSwgbikgPCAwKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogVW5saW5rIHRoZSBmaWxlIGZyb20gdGhlIGZpbGVzeXN0ZW0uICAqLworCQlpZiAoIWYtPmMtPmJ1aWxkaW5nX2ZzKSB7CisJCQlqZmZzX3VubGlua19maWxlX2Zyb21fdHJlZShmKTsKKwkJfQorCQlqZmZzX3VubGlua19maWxlX2Zyb21faGFzaChmKTsKKwkJamZmc19mcmVlX25vZGVfbGlzdChmKTsKKwkJamZmc19mcmVlX2ZpbGUoZik7CisJfQorCXJldHVybiAwOworfQorCisKKy8qIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBqZmZzX2ZvcmVhY2hfZmlsZSgpIHRvIGNvdW50IHRoZSBudW1iZXIKKyAgIG9mIGZpbGVzIGluIHRoZSBmaWxlIHN5c3RlbS4gICovCitpbnQKK2pmZnNfZmlsZV9jb3VudChzdHJ1Y3QgamZmc19maWxlICpmKQoreworCXJldHVybiAxOworfQorCisKKy8qIEJ1aWxkIHVwIGEgZmlsZSdzIHJhbmdlIGxpc3QgZnJvbSBzY3JhdGNoIGJ5IGdvaW5nIHRocm91Z2ggdGhlCisgICB2ZXJzaW9uIGxpc3QuICAqLworc3RhdGljIGludAoramZmc19idWlsZF9maWxlKHN0cnVjdCBqZmZzX2ZpbGUgKmYpCit7CisJc3RydWN0IGpmZnNfbm9kZSAqbjsKKworCUQzKHByaW50aygiamZmc19idWlsZF9maWxlKCk6IGlubzogJXUsIG5hbWU6IFwiJXNcIlxuIiwKKwkJICBmLT5pbm8sIChmLT5uYW1lID8gZi0+bmFtZSA6ICIiKSkpOworCisJZm9yIChuID0gZi0+dmVyc2lvbl9oZWFkOyBuOyBuID0gbi0+dmVyc2lvbl9uZXh0KSB7CisJCWpmZnNfdXBkYXRlX2ZpbGUoZiwgbik7CisJfQorCXJldHVybiAwOworfQorCisKKy8qIFJlbW92ZSBhbiBhbW91bnQgb2YgZGF0YSBmcm9tIGEgZmlsZS4gSWYgdGhpcyBhbW91bnQgb2YgZGF0YSBpcworICAgemVybywgdGhhdCBjb3VsZCBtZWFuIHRoYXQgYSBub2RlIHNob3VsZCBiZSBzcGxpdCBpbiB0d28gcGFydHMuCisgICBXZSByZW1vdmUgb3IgY2hhbmdlIHRoZSBhcHByb3ByaWF0ZSBub2RlcyBpbiB0aGUgbGlzdHMuCisKKyAgIFN0YXJ0aW5nIG9mZnNldCBvZiBhcmVhIHRvIGJlIHJlbW92ZWQgaXMgbm9kZS0+ZGF0YV9vZmZzZXQsCisgICBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgYXJlYSBpcyBpbiBub2RlLT5yZW1vdmVkX3NpemUuICAgKi8KK3N0YXRpYyBpbnQKK2pmZnNfZGVsZXRlX2RhdGEoc3RydWN0IGpmZnNfZmlsZSAqZiwgc3RydWN0IGpmZnNfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgamZmc19ub2RlICpuOworCV9fdTMyIG9mZnNldCA9IG5vZGUtPmRhdGFfb2Zmc2V0OworCV9fdTMyIHJlbW92ZV9zaXplID0gbm9kZS0+cmVtb3ZlZF9zaXplOworCisJRDMocHJpbnRrKCJqZmZzX2RlbGV0ZV9kYXRhKCk6IG9mZnNldCA9ICV1LCByZW1vdmVfc2l6ZSA9ICV1XG4iLAorCQkgIG9mZnNldCwgcmVtb3ZlX3NpemUpKTsKKworCWlmIChyZW1vdmVfc2l6ZSA9PSAwCisJICAgICYmIGYtPnJhbmdlX3RhaWwKKwkgICAgJiYgZi0+cmFuZ2VfdGFpbC0+ZGF0YV9vZmZzZXQgKyBmLT5yYW5nZV90YWlsLT5kYXRhX3NpemUKKwkgICAgICAgPT0gb2Zmc2V0KSB7CisJCS8qIEEgc2ltcGxlIGFwcGVuZDsgbm90aGluZyB0byByZW1vdmUgb3Igbm8gbm9kZSB0byBzcGxpdC4gICovCisJCXJldHVybiAwOworCX0KKworCS8qIEZpbmQgdGhlIG5vZGUgd2hlcmUgd2Ugc2hvdWxkIGJlZ2luIHRoZSByZW1vdmFsLiAgKi8KKwlmb3IgKG4gPSBmLT5yYW5nZV9oZWFkOyBuOyBuID0gbi0+cmFuZ2VfbmV4dCkgeworCQlpZiAobi0+ZGF0YV9vZmZzZXQgKyBuLT5kYXRhX3NpemUgPiBvZmZzZXQpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghbikgeworCQkvKiBJZiB0aGVyZSdzIG5vIGRhdGEgaW4gdGhlIGZpbGUgdGhlcmUncyBubyBkYXRhIHRvCisJCSAgIHJlbW92ZSBlaXRoZXIuICAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobi0+ZGF0YV9vZmZzZXQgPiBvZmZzZXQpIHsKKwkJLyogWFhYOiBOb3QgaW1wbGVtZW50ZWQgeWV0LiAgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkZGUzogQW4gdW5leHBlY3RlZCBzaXR1YXRpb24gIgorCQkgICAgICAgIm9jY3VycmVkIGluIGpmZnNfZGVsZXRlX2RhdGEuXG4iKTsKKwl9CisJZWxzZSBpZiAobi0+ZGF0YV9vZmZzZXQgPCBvZmZzZXQpIHsKKwkJLyogU2VlIGlmIHRoZSBub2RlIGhhcyB0byBiZSBzcGxpdCBpbnRvIHR3byBwYXJ0cy4gICovCisJCWlmIChuLT5kYXRhX29mZnNldCArIG4tPmRhdGFfc2l6ZSA+IG9mZnNldCArIHJlbW92ZV9zaXplKSB7CisJCQkvKiBEbyB0aGUgc3BsaXQuICAqLworCQkJc3RydWN0IGpmZnNfbm9kZSAqbmV3X25vZGU7CisJCQlEMyhwcmludGsoImpmZnNfZGVsZXRlX2RhdGEoKTogU3BsaXQgbm9kZSB3aXRoICIKKwkJCQkgICJ2ZXJzaW9uIG51bWJlciAldS5cbiIsIG4tPnZlcnNpb24pKTsKKworCQkJaWYgKCEobmV3X25vZGUgPSBqZmZzX2FsbG9jX25vZGUoKSkpIHsKKwkJCQlEKHByaW50aygiamZmc19kZWxldGVfZGF0YSgpOiAtRU5PTUVNXG4iKSk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlESk0obm9famZmc19ub2RlKyspOworCisJCQluZXdfbm9kZS0+aW5vID0gbi0+aW5vOworCQkJbmV3X25vZGUtPnZlcnNpb24gPSBuLT52ZXJzaW9uOworCQkJbmV3X25vZGUtPmRhdGFfb2Zmc2V0ID0gb2Zmc2V0OworCQkJbmV3X25vZGUtPmRhdGFfc2l6ZSA9IG4tPmRhdGFfc2l6ZSAtIChyZW1vdmVfc2l6ZSArIChvZmZzZXQgLSBuLT5kYXRhX29mZnNldCkpOworCQkJbmV3X25vZGUtPmZtX29mZnNldCA9IG4tPmZtX29mZnNldCArIChyZW1vdmVfc2l6ZSArIChvZmZzZXQgLSBuLT5kYXRhX29mZnNldCkpOworCQkJbmV3X25vZGUtPm5hbWVfc2l6ZSA9IG4tPm5hbWVfc2l6ZTsKKwkJCW5ld19ub2RlLT5mbSA9IG4tPmZtOworCQkJbmV3X25vZGUtPnZlcnNpb25fcHJldiA9IG47CisJCQluZXdfbm9kZS0+dmVyc2lvbl9uZXh0ID0gbi0+dmVyc2lvbl9uZXh0OworCQkJaWYgKG5ld19ub2RlLT52ZXJzaW9uX25leHQpIHsKKwkJCQluZXdfbm9kZS0+dmVyc2lvbl9uZXh0LT52ZXJzaW9uX3ByZXYKKwkJCQk9IG5ld19ub2RlOworCQkJfQorCQkJZWxzZSB7CisJCQkJZi0+dmVyc2lvbl90YWlsID0gbmV3X25vZGU7CisJCQl9CisJCQluLT52ZXJzaW9uX25leHQgPSBuZXdfbm9kZTsKKwkJCW5ld19ub2RlLT5yYW5nZV9wcmV2ID0gbjsKKwkJCW5ld19ub2RlLT5yYW5nZV9uZXh0ID0gbi0+cmFuZ2VfbmV4dDsKKwkJCWlmIChuZXdfbm9kZS0+cmFuZ2VfbmV4dCkgeworCQkJCW5ld19ub2RlLT5yYW5nZV9uZXh0LT5yYW5nZV9wcmV2ID0gbmV3X25vZGU7CisJCQl9CisJCQllbHNlIHsKKwkJCQlmLT5yYW5nZV90YWlsID0gbmV3X25vZGU7CisJCQl9CisJCQkvKiBBIHZlcnkgaW50ZXJlc3RpbmcgY2FuIG9mIHdvcm1zLiAgKi8KKwkJCW4tPnJhbmdlX25leHQgPSBuZXdfbm9kZTsKKwkJCW4tPmRhdGFfc2l6ZSA9IG9mZnNldCAtIG4tPmRhdGFfb2Zmc2V0OworCQkJaWYgKG5ld19ub2RlLT5mbSkKKwkJCQlqZmZzX2FkZF9ub2RlKG5ld19ub2RlKTsKKwkJCWVsc2UgeworCQkJCUQxKHByaW50ayhLRVJOX1dBUk5JTkcgImpmZnNfZGVsZXRlX2RhdGEoKTogU3BsaXR0aW5nIGFuIGVtcHR5IG5vZGUgKGZpbGUgaG9sZCkuXG4hIikpOworCQkJCUQxKHByaW50ayhLRVJOX1dBUk5JTkcgIkZJWE1FOiBEaWQgZHdtdzIgZG8gdGhlIHJpZ2h0IHRoaW5nIGhlcmU/XG4iKSk7CisJCQl9CisJCQluID0gbmV3X25vZGUtPnJhbmdlX25leHQ7CisJCQlyZW1vdmVfc2l6ZSA9IDA7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBOby4gIE5vIG5lZWQgdG8gc3BsaXQgdGhlIG5vZGUuICBKdXN0IHJlbW92ZQorCQkJICAgdGhlIGVuZCBvZiB0aGUgbm9kZS4gICovCisJCQlpbnQgciA9IG1pbihuLT5kYXRhX29mZnNldCArIG4tPmRhdGFfc2l6ZQorCQkJCQkgLSBvZmZzZXQsIHJlbW92ZV9zaXplKTsKKwkJCW4tPmRhdGFfc2l6ZSAtPSByOworCQkJcmVtb3ZlX3NpemUgLT0gcjsKKwkJCW4gPSBuLT5yYW5nZV9uZXh0OworCQl9CisJfQorCisJLyogUmVtb3ZlIGFzIG1hbnkgbm9kZXMgYXMgbmVjZXNzYXJ5LiAgKi8KKwl3aGlsZSAobiAmJiByZW1vdmVfc2l6ZSkgeworCQlpZiAobi0+ZGF0YV9zaXplIDw9IHJlbW92ZV9zaXplKSB7CisJCQlzdHJ1Y3QgamZmc19ub2RlICpwID0gbjsKKwkJCXJlbW92ZV9zaXplIC09IG4tPmRhdGFfc2l6ZTsKKwkJCW4gPSBuLT5yYW5nZV9uZXh0OworCQkJRDMocHJpbnRrKCJqZmZzX2RlbGV0ZV9kYXRhKCk6IFJlbW92aW5nIG5vZGU6ICIKKwkJCQkgICJpbm86ICV1LCB2ZXJzaW9uOiAldSVzXG4iLAorCQkJCSAgcC0+aW5vLCBwLT52ZXJzaW9uLAorCQkJCSAgKHAtPmZtID8gIiIgOiAiICh2aXJ0dWFsKSIpKSk7CisJCQlpZiAocC0+Zm0pIHsKKwkJCQlqZmZzX2ZtZnJlZShmLT5jLT5mbWMsIHAtPmZtLCBwKTsKKwkJCX0KKwkJCWpmZnNfdW5saW5rX25vZGVfZnJvbV9yYW5nZV9saXN0KGYsIHApOworCQkJamZmc191bmxpbmtfbm9kZV9mcm9tX3ZlcnNpb25fbGlzdChmLCBwKTsKKwkJCWpmZnNfZnJlZV9ub2RlKHApOworCQkJREpNKG5vX2pmZnNfbm9kZS0tKTsKKwkJfQorCQllbHNlIHsKKwkJCW4tPmRhdGFfc2l6ZSAtPSByZW1vdmVfc2l6ZTsKKwkJCW4tPmZtX29mZnNldCArPSByZW1vdmVfc2l6ZTsKKwkJCW4tPmRhdGFfb2Zmc2V0IC09IChub2RlLT5yZW1vdmVkX3NpemUgLSByZW1vdmVfc2l6ZSk7CisJCQluID0gbi0+cmFuZ2VfbmV4dDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogQWRqdXN0IHRoZSBmb2xsb3dpbmcgbm9kZXMnIGluZm9ybWF0aW9uIGFib3V0IG9mZnNldHMgZXRjLiAgKi8KKwl3aGlsZSAobiAmJiBub2RlLT5yZW1vdmVkX3NpemUpIHsKKwkJbi0+ZGF0YV9vZmZzZXQgLT0gbm9kZS0+cmVtb3ZlZF9zaXplOworCQluID0gbi0+cmFuZ2VfbmV4dDsKKwl9CisKKwlpZiAobm9kZS0+cmVtb3ZlZF9zaXplID4gKGYtPnNpemUgLSBub2RlLT5kYXRhX29mZnNldCkpIHsKKwkJLyogSXQncyBwb3NzaWJsZSB0aGF0IHRoZSByZW1vdmVkX3NpemUgaXMgaW4gZmFjdAorCQkgKiBncmVhdGVyIHRoYW4gdGhlIGFtb3VudCBvZiBkYXRhIHdlIGFjdHVhbGx5IHRob3VnaHQKKwkJICogd2VyZSBwcmVzZW50IGluIHRoZSBmaXJzdCBwbGFjZSAtIHNvbWUgb2YgdGhlIG5vZGVzIAorCQkgKiB3aGljaCB0aGlzIG5vZGUgb3JpZ2luYWxseSBvYnNvbGV0ZWQgbWF5IGFscmVhZHkgaGF2ZQorCQkgKiBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgZmxhc2ggYnkgc3Vic2VxdWVudCBnYXJiYWdlIAorCQkgKiBjb2xsZWN0aW9uLgorCQkgKgorCQkgKiBJZiB0aGlzIGlzIHRoZSBjYXNlLCBkb24ndCBsZXQgZi0+c2l6ZSBnbyBuZWdhdGl2ZS4KKwkJICogQmFkIHRoaW5ncyB3b3VsZCBoYXBwZW4gOikKKwkJICovCisJCWYtPnNpemUgPSBub2RlLT5kYXRhX29mZnNldDsKKwl9IGVsc2UgeworCQlmLT5zaXplIC09IG5vZGUtPnJlbW92ZWRfc2l6ZTsKKwl9CisJRDMocHJpbnRrKCJqZmZzX2RlbGV0ZV9kYXRhKCk6IGYtPnNpemUgPSAlZFxuIiwgZi0+c2l6ZSkpOworCXJldHVybiAwOworfSAvKiBqZmZzX2RlbGV0ZV9kYXRhKCkgICovCisKKworLyogSW5zZXJ0IHNvbWUgZGF0YSBpbnRvIGEgZmlsZS4gIFByaW9yIHRvIHRoZSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24sCisgICBqZmZzX2RlbGV0ZV9kYXRhIHNob3VsZCBiZSBjYWxsZWQuICAqLworc3RhdGljIGludAoramZmc19pbnNlcnRfZGF0YShzdHJ1Y3QgamZmc19maWxlICpmLCBzdHJ1Y3QgamZmc19ub2RlICpub2RlKQoreworCUQzKHByaW50aygiamZmc19pbnNlcnRfZGF0YSgpOiBub2RlLT5kYXRhX29mZnNldCA9ICV1LCAiCisJCSAgIm5vZGUtPmRhdGFfc2l6ZSA9ICV1LCBmLT5zaXplID0gJXVcbiIsCisJCSAgbm9kZS0+ZGF0YV9vZmZzZXQsIG5vZGUtPmRhdGFfc2l6ZSwgZi0+c2l6ZSkpOworCisJLyogRmluZCB0aGUgcG9zaXRpb24gd2hlcmUgd2Ugc2hvdWxkIGluc2VydCBkYXRhLiAgKi8KKwlyZXRyeToKKwlpZiAobm9kZS0+ZGF0YV9vZmZzZXQgPT0gZi0+c2l6ZSkgeworCQkvKiBBIHNpbXBsZSBhcHBlbmQuICBUaGlzIGlzIHRoZSBtb3N0IGNvbW1vbiBvcGVyYXRpb24uICAqLworCQlub2RlLT5yYW5nZV9uZXh0ID0gTlVMTDsKKwkJbm9kZS0+cmFuZ2VfcHJldiA9IGYtPnJhbmdlX3RhaWw7CisJCWlmIChub2RlLT5yYW5nZV9wcmV2KSB7CisJCQlub2RlLT5yYW5nZV9wcmV2LT5yYW5nZV9uZXh0ID0gbm9kZTsKKwkJfQorCQlmLT5yYW5nZV90YWlsID0gbm9kZTsKKwkJZi0+c2l6ZSArPSBub2RlLT5kYXRhX3NpemU7CisJCWlmICghZi0+cmFuZ2VfaGVhZCkgeworCQkJZi0+cmFuZ2VfaGVhZCA9IG5vZGU7CisJCX0KKwl9CisJZWxzZSBpZiAobm9kZS0+ZGF0YV9vZmZzZXQgPCBmLT5zaXplKSB7CisJCS8qIFRyeWluZyB0byBpbnNlcnQgZGF0YSBpbnRvIHRoZSBtaWRkbGUgb2YgdGhlIGZpbGUuICBUaGlzCisJCSAgIG1lYW5zIG5vIHByb2JsZW0gYmVjYXVzZSBqZmZzX2RlbGV0ZV9kYXRhKCkgaGFzIGFscmVhZHkKKwkJICAgcHJlcGFyZWQgdGhlIHJhbmdlIGxpc3QgZm9yIHVzLiAgKi8KKwkJc3RydWN0IGpmZnNfbm9kZSAqbjsKKworCQkvKiBGaW5kIHRoZSBjb3JyZWN0IHBsYWNlIGZvciB0aGUgaW5zZXJ0aW9uIGFuZCB0aGVuIGluc2VydAorCQkgICB0aGUgbm9kZS4gICovCisJCWZvciAobiA9IGYtPnJhbmdlX2hlYWQ7IG47IG4gPSBuLT5yYW5nZV9uZXh0KSB7CisJCQlEMihwcmludGsoIkNvb2wgc3R1ZmYncyBoYXBwZW5pbmchXG4iKSk7CisKKwkJCWlmIChuLT5kYXRhX29mZnNldCA9PSBub2RlLT5kYXRhX29mZnNldCkgeworCQkJCW5vZGUtPnJhbmdlX3ByZXYgPSBuLT5yYW5nZV9wcmV2OworCQkJCWlmIChub2RlLT5yYW5nZV9wcmV2KSB7CisJCQkJCW5vZGUtPnJhbmdlX3ByZXYtPnJhbmdlX25leHQgPSBub2RlOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJZi0+cmFuZ2VfaGVhZCA9IG5vZGU7CisJCQkJfQorCQkJCW5vZGUtPnJhbmdlX25leHQgPSBuOworCQkJCW4tPnJhbmdlX3ByZXYgPSBub2RlOworCQkJCWJyZWFrOworCQkJfQorCQkJQVNTRVJUKGVsc2UgaWYgKG4tPmRhdGFfb2Zmc2V0ICsgbi0+ZGF0YV9zaXplID4KKwkJCQkJbm9kZS0+ZGF0YV9vZmZzZXQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImpmZnNfaW5zZXJ0X2RhdGEoKTogIgorCQkJCSAgICAgICAiQ291bGRuJ3QgZmluZCBhIHBsYWNlIHRvIGluc2VydCAiCisJCQkJICAgICAgICJ0aGUgZGF0YSFcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0pOworCQl9CisKKwkJLyogQWRqdXN0IGxhdGVyIG5vZGVzJyBvZmZzZXRzIGV0Yy4gICovCisJCW4gPSBub2RlLT5yYW5nZV9uZXh0OworCQl3aGlsZSAobikgeworCQkJbi0+ZGF0YV9vZmZzZXQgKz0gbm9kZS0+ZGF0YV9zaXplOworCQkJbiA9IG4tPnJhbmdlX25leHQ7CisJCX0KKwkJZi0+c2l6ZSArPSBub2RlLT5kYXRhX3NpemU7CisJfQorCWVsc2UgaWYgKG5vZGUtPmRhdGFfb2Zmc2V0ID4gZi0+c2l6ZSkgeworCQkvKiBPa2F5LiAgVGhpcyBpcyB0cmlja3kuICBUaGlzIG1lYW5zIHRoYXQgd2Ugd2FudCB0byBpbnNlcnQKKwkJICAgZGF0YSBhdCBhIHBsYWNlIHRoYXQgaXMgYmV5b25kIHRoZSBsaW1pdHMgb2YgdGhlIGZpbGUgYXMKKwkJICAgaXQgaXMgY29uc3RydWN0ZWQgcmlnaHQgbm93LiAgVGhpcyBpcyBhY3R1YWxseSBhIGNvbW1vbgorCQkgICBldmVudCB0aGF0IGZvciBpbnN0YW5jZSBjb3VsZCBvY2N1ciBkdXJpbmcgdGhlIG1vdW50aW5nCisJCSAgIG9mIHRoZSBmaWxlIHN5c3RlbSBpZiBhIGxhcmdlIGZpbGUgaGF2ZSBiZWVuIHRydW5jYXRlZCwKKwkJICAgcmV3cml0dGVuIGFuZCB0aGVuIG9ubHkgcGFydGlhbGx5IGdhcmJhZ2UgY29sbGVjdGVkLiAgKi8KKworCQlzdHJ1Y3QgamZmc19ub2RlICpuOworCisJCS8qIFdlIG5lZWQgYSBwbGFjZSBob2xkZXIgZm9yIHRoZSBkYXRhIHRoYXQgaXMgbWlzc2luZyBpbgorCQkgICBmcm9udCBvZiB0aGlzIGluc2VydGlvbi4gIFRoaXMgInZpcnR1YWwgbm9kZSIgd2lsbCBub3QKKwkJICAgYmUgYXNzb2NpYXRlZCB3aXRoIGFueSBzcGFjZSBvbiB0aGUgZmxhc2ggZGV2aWNlLiAgKi8KKwkJc3RydWN0IGpmZnNfbm9kZSAqdmlydHVhbF9ub2RlOworCQlpZiAoISh2aXJ0dWFsX25vZGUgPSBqZmZzX2FsbG9jX25vZGUoKSkpIHsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJRChwcmludGsoImpmZnNfaW5zZXJ0X2RhdGE6IEluc2VydGluZyBhIHZpcnR1YWwgbm9kZS5cbiIpKTsKKwkJRChwcmludGsoIiAgbm9kZS0+ZGF0YV9vZmZzZXQgPSAldVxuIiwgbm9kZS0+ZGF0YV9vZmZzZXQpKTsKKwkJRChwcmludGsoIiAgZi0+c2l6ZSA9ICV1XG4iLCBmLT5zaXplKSk7CisKKwkJdmlydHVhbF9ub2RlLT5pbm8gPSBub2RlLT5pbm87CisJCXZpcnR1YWxfbm9kZS0+dmVyc2lvbiA9IG5vZGUtPnZlcnNpb247CisJCXZpcnR1YWxfbm9kZS0+cmVtb3ZlZF9zaXplID0gMDsKKwkJdmlydHVhbF9ub2RlLT5mbV9vZmZzZXQgPSAwOworCQl2aXJ0dWFsX25vZGUtPm5hbWVfc2l6ZSA9IDA7CisJCXZpcnR1YWxfbm9kZS0+Zm0gPSBOVUxMOyAvKiBUaGlzIGlzIGEgdmlydHVhbCBkYXRhIGhvbGRlci4gICovCisJCXZpcnR1YWxfbm9kZS0+dmVyc2lvbl9wcmV2ID0gTlVMTDsKKwkJdmlydHVhbF9ub2RlLT52ZXJzaW9uX25leHQgPSBOVUxMOworCQl2aXJ0dWFsX25vZGUtPnJhbmdlX25leHQgPSBOVUxMOworCisJCS8qIEFyZSB0aGVyZSBhbnkgZGF0YSBhdCBhbGwgaW4gdGhlIGZpbGUgeWV0PyAgKi8KKwkJaWYgKGYtPnJhbmdlX2hlYWQpIHsKKwkJCXZpcnR1YWxfbm9kZS0+ZGF0YV9vZmZzZXQKKwkJCT0gZi0+cmFuZ2VfdGFpbC0+ZGF0YV9vZmZzZXQKKwkJCSAgKyBmLT5yYW5nZV90YWlsLT5kYXRhX3NpemU7CisJCQl2aXJ0dWFsX25vZGUtPmRhdGFfc2l6ZQorCQkJPSBub2RlLT5kYXRhX29mZnNldCAtIHZpcnR1YWxfbm9kZS0+ZGF0YV9vZmZzZXQ7CisJCQl2aXJ0dWFsX25vZGUtPnJhbmdlX3ByZXYgPSBmLT5yYW5nZV90YWlsOworCQkJZi0+cmFuZ2VfdGFpbC0+cmFuZ2VfbmV4dCA9IHZpcnR1YWxfbm9kZTsKKwkJfQorCQllbHNlIHsKKwkJCXZpcnR1YWxfbm9kZS0+ZGF0YV9vZmZzZXQgPSAwOworCQkJdmlydHVhbF9ub2RlLT5kYXRhX3NpemUgPSBub2RlLT5kYXRhX29mZnNldDsKKwkJCXZpcnR1YWxfbm9kZS0+cmFuZ2VfcHJldiA9IE5VTEw7CisJCQlmLT5yYW5nZV9oZWFkID0gdmlydHVhbF9ub2RlOworCQl9CisKKwkJZi0+cmFuZ2VfdGFpbCA9IHZpcnR1YWxfbm9kZTsKKwkJZi0+c2l6ZSArPSB2aXJ0dWFsX25vZGUtPmRhdGFfc2l6ZTsKKworCQkvKiBJbnNlcnQgdGhpcyB2aXJ0dWFsIG5vZGUgaW4gdGhlIHZlcnNpb24gbGlzdCBhcyB3ZWxsLiAgKi8KKwkJZm9yIChuID0gZi0+dmVyc2lvbl9oZWFkOyBuIDsgbiA9IG4tPnZlcnNpb25fbmV4dCkgeworCQkJaWYgKG4tPnZlcnNpb24gPT0gdmlydHVhbF9ub2RlLT52ZXJzaW9uKSB7CisJCQkJdmlydHVhbF9ub2RlLT52ZXJzaW9uX3ByZXYgPSBuLT52ZXJzaW9uX3ByZXY7CisJCQkJbi0+dmVyc2lvbl9wcmV2ID0gdmlydHVhbF9ub2RlOworCQkJCWlmICh2aXJ0dWFsX25vZGUtPnZlcnNpb25fcHJldikgeworCQkJCQl2aXJ0dWFsX25vZGUtPnZlcnNpb25fcHJldgorCQkJCQktPnZlcnNpb25fbmV4dCA9IHZpcnR1YWxfbm9kZTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWYtPnZlcnNpb25faGVhZCA9IHZpcnR1YWxfbm9kZTsKKwkJCQl9CisJCQkJdmlydHVhbF9ub2RlLT52ZXJzaW9uX25leHQgPSBuOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJRChqZmZzX3ByaW50X25vZGUodmlydHVhbF9ub2RlKSk7CisKKwkJLyogTWFrZSBhIG5ldyB0cnkgdG8gaW5zZXJ0IHRoZSBub2RlLiAgKi8KKwkJZ290byByZXRyeTsKKwl9CisKKwlEMyhwcmludGsoImpmZnNfaW5zZXJ0X2RhdGEoKTogZi0+c2l6ZSA9ICVkXG4iLCBmLT5zaXplKSk7CisJcmV0dXJuIDA7Cit9CisKKworLyogQSBuZXcgbm9kZSAod2l0aCBkYXRhKSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgZmlsZSBhbmQgbm93IHRoZSByYW5nZQorICAgbGlzdCBoYXMgdG8gYmUgbW9kaWZpZWQuICAqLworc3RhdGljIGludAoramZmc191cGRhdGVfZmlsZShzdHJ1Y3QgamZmc19maWxlICpmLCBzdHJ1Y3QgamZmc19ub2RlICpub2RlKQoreworCWludCBlcnI7CisKKwlEMyhwcmludGsoImpmZnNfdXBkYXRlX2ZpbGUoKTogaW5vOiAldSwgdmVyc2lvbjogJXVcbiIsCisJCSAgZi0+aW5vLCBub2RlLT52ZXJzaW9uKSk7CisKKwlpZiAobm9kZS0+ZGF0YV9zaXplID09IDApIHsKKwkJaWYgKG5vZGUtPnJlbW92ZWRfc2l6ZSA9PSAwKSB7CisJCQkvKiBkYXRhX29mZnNldCA9PSBYICAqLworCQkJLyogZGF0YV9zaXplID09IDAgICovCisJCQkvKiByZW1vdmVfc2l6ZSA9PSAwICAqLworCQl9CisJCWVsc2UgeworCQkJLyogZGF0YV9vZmZzZXQgPT0gWCAgKi8KKwkJCS8qIGRhdGFfc2l6ZSA9PSAwICAqLworCQkJLyogcmVtb3ZlX3NpemUgIT0gMCAgKi8KKwkJCWlmICgoZXJyID0gamZmc19kZWxldGVfZGF0YShmLCBub2RlKSkgPCAwKSB7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJfQorCX0KKwllbHNlIHsKKwkJLyogZGF0YV9vZmZzZXQgPT0gWCAgKi8KKwkJLyogZGF0YV9zaXplICE9IDAgICovCisJCS8qIHJlbW92ZV9zaXplID09IFkgICovCisJCWlmICgoZXJyID0gamZmc19kZWxldGVfZGF0YShmLCBub2RlKSkgPCAwKSB7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWlmICgoZXJyID0gamZmc19pbnNlcnRfZGF0YShmLCBub2RlKSkgPCAwKSB7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBQcmludCB0aGUgY29udGVudHMgb2YgYSBub2RlLiAgKi8KK3ZvaWQKK2pmZnNfcHJpbnRfbm9kZShzdHJ1Y3QgamZmc19ub2RlICpuKQoreworCUQocHJpbnRrKCJqZmZzX25vZGU6IDB4JXBcbiIsIG4pKTsKKwlEKHByaW50aygie1xuIikpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogdmVyc2lvbiAgKi9cbiIsIG4tPnZlcnNpb24pKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIGRhdGFfb2Zmc2V0ICAqL1xuIiwgbi0+ZGF0YV9vZmZzZXQpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIGRhdGFfc2l6ZSAgKi9cbiIsIG4tPmRhdGFfc2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogcmVtb3ZlZF9zaXplICAqL1xuIiwgbi0+cmVtb3ZlZF9zaXplKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBmbV9vZmZzZXQgICovXG4iLCBuLT5mbV9vZmZzZXQpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwMngsICAgICAgIC8qIG5hbWVfc2l6ZSAgKi9cbiIsIG4tPm5hbWVfc2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIGZtLCAgZm0tPm9mZnNldDogJXUgICovXG4iLAorCQkgbi0+Zm0sIChuLT5mbSA/IG4tPmZtLT5vZmZzZXQgOiAwKSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIHZlcnNpb25fcHJldiAgKi9cbiIsIG4tPnZlcnNpb25fcHJldikpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIHZlcnNpb25fbmV4dCAgKi9cbiIsIG4tPnZlcnNpb25fbmV4dCkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIHJhbmdlX3ByZXYgICovXG4iLCBuLT5yYW5nZV9wcmV2KSk7CisJRChwcmludGsoIiAgICAgICAgMHglcCwgLyogcmFuZ2VfbmV4dCAgKi9cbiIsIG4tPnJhbmdlX25leHQpKTsKKwlEKHByaW50aygifVxuIikpOworfQorCisKKy8qIFByaW50IHRoZSBjb250ZW50cyBvZiBhIHJhdyBpbm9kZS4gICovCit2b2lkCitqZmZzX3ByaW50X3Jhd19pbm9kZShzdHJ1Y3QgamZmc19yYXdfaW5vZGUgKnJhd19pbm9kZSkKK3sKKwlEKHByaW50aygiamZmc19yYXdfaW5vZGU6IGlub2RlIG51bWJlcjogJXVcbiIsIHJhd19pbm9kZS0+aW5vKSk7CisJRChwcmludGsoIntcbiIpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIG1hZ2ljICAqL1xuIiwgcmF3X2lub2RlLT5tYWdpYykpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogaW5vICAqL1xuIiwgcmF3X2lub2RlLT5pbm8pKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIHBpbm8gICovXG4iLCByYXdfaW5vZGUtPnBpbm8pKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIHZlcnNpb24gICovXG4iLCByYXdfaW5vZGUtPnZlcnNpb24pKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIG1vZGUgICovXG4iLCByYXdfaW5vZGUtPm1vZGUpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwNHgsICAgICAvKiB1aWQgICovXG4iLCByYXdfaW5vZGUtPnVpZCkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA0eCwgICAgIC8qIGdpZCAgKi9cbiIsIHJhd19pbm9kZS0+Z2lkKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBhdGltZSAgKi9cbiIsIHJhd19pbm9kZS0+YXRpbWUpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIG10aW1lICAqL1xuIiwgcmF3X2lub2RlLT5tdGltZSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogY3RpbWUgICovXG4iLCByYXdfaW5vZGUtPmN0aW1lKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBvZmZzZXQgICovXG4iLCByYXdfaW5vZGUtPm9mZnNldCkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogZHNpemUgICovXG4iLCByYXdfaW5vZGUtPmRzaXplKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiByc2l6ZSAgKi9cbiIsIHJhd19pbm9kZS0+cnNpemUpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwMngsICAgICAgIC8qIG5zaXplICAqL1xuIiwgcmF3X2lub2RlLT5uc2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTAyeCwgICAgICAgLyogbmxpbmsgICovXG4iLCByYXdfaW5vZGUtPm5saW5rKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDJ4LCAgICAgICAvKiBzcGFyZSAgKi9cbiIsCisJCSByYXdfaW5vZGUtPnNwYXJlKSk7CisJRChwcmludGsoIiAgICAgICAgJXUsICAgICAgICAgIC8qIHJlbmFtZSAgKi9cbiIsCisJCSByYXdfaW5vZGUtPnJlbmFtZSkpOworCUQocHJpbnRrKCIgICAgICAgICV1LCAgICAgICAgICAvKiBkZWxldGVkICAqL1xuIiwKKwkJIHJhd19pbm9kZS0+ZGVsZXRlZCkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTAyeCwgICAgICAgLyogYWNjdXJhdGUgICovXG4iLAorCQkgcmF3X2lub2RlLT5hY2N1cmF0ZSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogZGNoa3N1bSAgKi9cbiIsIHJhd19pbm9kZS0+ZGNoa3N1bSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA0eCwgICAgIC8qIG5jaGtzdW0gICovXG4iLCByYXdfaW5vZGUtPm5jaGtzdW0pKTsKKwlEKHByaW50aygiICAgICAgICAweCUwNHgsICAgICAvKiBjaGtzdW0gICovXG4iLCByYXdfaW5vZGUtPmNoa3N1bSkpOworCUQocHJpbnRrKCJ9XG4iKSk7Cit9CisKKworLyogUHJpbnQgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZS4gICovCisjaWYgMAoraW50CitqZmZzX3ByaW50X2ZpbGUoc3RydWN0IGpmZnNfZmlsZSAqZikKK3sKKwlEKGludCBpKTsKKwlEKHByaW50aygiamZmc19maWxlOiAweCVwXG4iLCBmKSk7CisJRChwcmludGsoIntcbiIpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIGlubyAgKi9cbiIsIGYtPmlubykpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogcGlubyAgKi9cbiIsIGYtPnBpbm8pKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIG1vZGUgICovXG4iLCBmLT5tb2RlKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDR4LCAgICAgLyogdWlkICAqL1xuIiwgZi0+dWlkKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDR4LCAgICAgLyogZ2lkICAqL1xuIiwgZi0+Z2lkKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBhdGltZSAgKi9cbiIsIGYtPmF0aW1lKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBtdGltZSAgKi9cbiIsIGYtPm10aW1lKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBjdGltZSAgKi9cbiIsIGYtPmN0aW1lKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDJ4LCAgICAgICAvKiBuc2l6ZSAgKi9cbiIsIGYtPm5zaXplKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDJ4LCAgICAgICAvKiBubGluayAgKi9cbiIsIGYtPm5saW5rKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDJ4LCAgICAgICAvKiBkZWxldGVkICAqL1xuIiwgZi0+ZGVsZXRlZCkpOworCUQocHJpbnRrKCIgICAgICAgIFwiJXNcIiwgIiwgKGYtPm5hbWUgPyBmLT5uYW1lIDogIiIpKSk7CisJRChmb3IgKGkgPSBzdHJsZW4oZi0+bmFtZSA/IGYtPm5hbWUgOiAiIik7IGkgPCA4OyArK2kpIHsKKwkJcHJpbnRrKCIgIik7CisJfSk7CisJRChwcmludGsoIi8qIG5hbWUgICovXG4iKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBzaXplICAqL1xuIiwgZi0+c2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogaGlnaGVzdF92ZXJzaW9uICAqL1xuIiwKKwkJIGYtPmhpZ2hlc3RfdmVyc2lvbikpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIGMgICovXG4iLCBmLT5jKSk7CisJRChwcmludGsoIiAgICAgICAgMHglcCwgLyogcGFyZW50ICAqL1xuIiwgZi0+cGFyZW50KSk7CisJRChwcmludGsoIiAgICAgICAgMHglcCwgLyogY2hpbGRyZW4gICovXG4iLCBmLT5jaGlsZHJlbikpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIHNpYmxpbmdfcHJldiAgKi9cbiIsIGYtPnNpYmxpbmdfcHJldikpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIHNpYmxpbmdfbmV4dCAgKi9cbiIsIGYtPnNpYmxpbmdfbmV4dCkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIGhhc2hfcHJldiAgKi9cbiIsIGYtPmhhc2gucHJldikpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIGhhc2hfbmV4dCAgKi9cbiIsIGYtPmhhc2gubmV4dCkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIHJhbmdlX2hlYWQgICovXG4iLCBmLT5yYW5nZV9oZWFkKSk7CisJRChwcmludGsoIiAgICAgICAgMHglcCwgLyogcmFuZ2VfdGFpbCAgKi9cbiIsIGYtPnJhbmdlX3RhaWwpKTsKKwlEKHByaW50aygiICAgICAgICAweCVwLCAvKiB2ZXJzaW9uX2hlYWQgICovXG4iLCBmLT52ZXJzaW9uX2hlYWQpKTsKKwlEKHByaW50aygiICAgICAgICAweCVwLCAvKiB2ZXJzaW9uX3RhaWwgICovXG4iLCBmLT52ZXJzaW9uX3RhaWwpKTsKKwlEKHByaW50aygifVxuIikpOworCXJldHVybiAwOworfQorI2VuZGlmICAvKiAgMCAgKi8KKwordm9pZAoramZmc19wcmludF9oYXNoX3RhYmxlKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMpCit7CisJaW50IGk7CisKKwlwcmludGsoIkpGRlM6IER1bXBpbmcgdGhlIGZpbGUgc3lzdGVtJ3MgaGFzaCB0YWJsZS4uLlxuIik7CisJZm9yIChpID0gMDsgaSA8IGMtPmhhc2hfbGVuOyBpKyspIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwkJZm9yIChwID0gYy0+aGFzaFtpXS5uZXh0OyBwICE9ICZjLT5oYXNoW2ldOyBwID0gcC0+bmV4dCkgeworCQkJc3RydWN0IGpmZnNfZmlsZSAqZj1saXN0X2VudHJ5KHAsc3RydWN0IGpmZnNfZmlsZSxoYXNoKTsKKwkJCXByaW50aygiKioqIGMtPmhhc2hbJXVdOiBcIiVzXCIgIgorCQkJICAgICAgICIoaW5vOiAldSwgcGlubzogJXUpXG4iLAorCQkJICAgICAgIGksIChmLT5uYW1lID8gZi0+bmFtZSA6ICIiKSwKKwkJCSAgICAgICBmLT5pbm8sIGYtPnBpbm8pOworCQl9CisJfQorfQorCisKK3ZvaWQKK2pmZnNfcHJpbnRfdHJlZShzdHJ1Y3QgamZmc19maWxlICpmaXJzdF9maWxlLCBpbnQgaW5kZW50KQoreworCXN0cnVjdCBqZmZzX2ZpbGUgKmY7CisJY2hhciAqc3BhY2U7CisJaW50IGRpcjsKKworCWlmICghZmlyc3RfZmlsZSkgeworCQlyZXR1cm47CisJfQorCisJaWYgKCEoc3BhY2UgPSAoY2hhciAqKSBrbWFsbG9jKGluZGVudCArIDEsIEdGUF9LRVJORUwpKSkgeworCQlwcmludGsoImpmZnNfcHJpbnRfdHJlZSgpOiBPdXQgb2YgbWVtb3J5IVxuIik7CisJCXJldHVybjsKKwl9CisKKwltZW1zZXQoc3BhY2UsICcgJywgaW5kZW50KTsKKwlzcGFjZVtpbmRlbnRdID0gJ1wwJzsKKworCWZvciAoZiA9IGZpcnN0X2ZpbGU7IGY7IGYgPSBmLT5zaWJsaW5nX25leHQpIHsKKwkJZGlyID0gU19JU0RJUihmLT5tb2RlKTsKKwkJcHJpbnRrKCIlcyVzJXMgKGlubzogJXUsIGhpZ2hlc3RfdmVyc2lvbjogJXUsIHNpemU6ICV1KVxuIiwKKwkJICAgICAgIHNwYWNlLCAoZi0+bmFtZSA/IGYtPm5hbWUgOiAiIiksIChkaXIgPyAiLyIgOiAiIiksCisJCSAgICAgICBmLT5pbm8sIGYtPmhpZ2hlc3RfdmVyc2lvbiwgZi0+c2l6ZSk7CisJCWlmIChkaXIpIHsKKwkJCWpmZnNfcHJpbnRfdHJlZShmLT5jaGlsZHJlbiwgaW5kZW50ICsgMik7CisJCX0KKwl9CisKKwlrZnJlZShzcGFjZSk7Cit9CisKKworI2lmIGRlZmluZWQoSkZGU19NRU1PUllfREVCVUcpICYmIEpGRlNfTUVNT1JZX0RFQlVHCit2b2lkCitqZmZzX3ByaW50X21lbW9yeV9hbGxvY2F0aW9uX3N0YXRpc3RpY3Modm9pZCkKK3sKKwlzdGF0aWMgbG9uZyBwcmludG91dDsKKwlwcmludGsoIl9fX19fX19fIE1lbW9yeSBwcmludG91dCAjJWxkIF9fX19fX19fXG4iLCArK3ByaW50b3V0KTsKKwlwcmludGsoIm5vX2pmZnNfZmlsZSA9ICVsZFxuIiwgbm9famZmc19maWxlKTsKKwlwcmludGsoIm5vX2pmZnNfbm9kZSA9ICVsZFxuIiwgbm9famZmc19ub2RlKTsKKwlwcmludGsoIm5vX2pmZnNfY29udHJvbCA9ICVsZFxuIiwgbm9famZmc19jb250cm9sKTsKKwlwcmludGsoIm5vX2pmZnNfcmF3X2lub2RlID0gJWxkXG4iLCBub19qZmZzX3Jhd19pbm9kZSk7CisJcHJpbnRrKCJub19qZmZzX25vZGVfcmVmID0gJWxkXG4iLCBub19qZmZzX25vZGVfcmVmKTsKKwlwcmludGsoIm5vX2pmZnNfZm0gPSAlbGRcbiIsIG5vX2pmZnNfZm0pOworCXByaW50aygibm9famZmc19mbWNvbnRyb2wgPSAlbGRcbiIsIG5vX2pmZnNfZm1jb250cm9sKTsKKwlwcmludGsoIm5vX2hhc2ggPSAlbGRcbiIsIG5vX2hhc2gpOworCXByaW50aygibm9fbmFtZSA9ICVsZFxuIiwgbm9fbmFtZSk7CisJcHJpbnRrKCJcbiIpOworfQorI2VuZGlmCisKKworLyogUmV3cml0ZSBgc2l6ZScgYnl0ZXMsIGFuZCBiZWdpbiBhdCBgbm9kZScuICAqLworc3RhdGljIGludAoramZmc19yZXdyaXRlX2RhdGEoc3RydWN0IGpmZnNfZmlsZSAqZiwgc3RydWN0IGpmZnNfbm9kZSAqbm9kZSwgX191MzIgc2l6ZSkKK3sKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjID0gZi0+YzsKKwlzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYyA9IGMtPmZtYzsKKwlzdHJ1Y3QgamZmc19yYXdfaW5vZGUgcmF3X2lub2RlOworCXN0cnVjdCBqZmZzX25vZGUgKm5ld19ub2RlOworCXN0cnVjdCBqZmZzX2ZtICpmbTsKKwlfX3UzMiBwb3M7CisJX191MzIgcG9zX2RjaGtzdW07CisJX191MzIgdG90YWxfbmFtZV9zaXplOworCV9fdTMyIHRvdGFsX2RhdGFfc2l6ZTsKKwlfX3UzMiB0b3RhbF9zaXplOworCWludCBlcnI7CisKKwlEMShwcmludGsoIioqKmpmZnNfcmV3cml0ZV9kYXRhKCk6IG5vZGU6ICV1LCBuYW1lOiBcIiVzXCIsIHNpemU6ICV1XG4iLAorCQkgIGYtPmlubywgKGYtPm5hbWUgPyBmLT5uYW1lIDogIihudWxsKSIpLCBzaXplKSk7CisKKwkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIG5ldyBub2RlLiAgKi8KKwlpZiAoIShuZXdfbm9kZSA9IGpmZnNfYWxsb2Nfbm9kZSgpKSkgeworCQlEKHByaW50aygiamZmc19yZXdyaXRlX2RhdGEoKTogIgorCQkJICJGYWlsZWQgdG8gYWxsb2NhdGUgbm9kZS5cbiIpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCURKTShub19qZmZzX25vZGUrKyk7CisJbmV3X25vZGUtPmRhdGFfb2Zmc2V0ID0gbm9kZS0+ZGF0YV9vZmZzZXQ7CisJbmV3X25vZGUtPnJlbW92ZWRfc2l6ZSA9IHNpemU7CisJdG90YWxfbmFtZV9zaXplID0gSkZGU19QQUQoZi0+bnNpemUpOworCXRvdGFsX2RhdGFfc2l6ZSA9IEpGRlNfUEFEKHNpemUpOworCXRvdGFsX3NpemUgPSBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKQorCQkgICAgICsgdG90YWxfbmFtZV9zaXplICsgdG90YWxfZGF0YV9zaXplOworCW5ld19ub2RlLT5mbV9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKQorCQkJICAgICAgKyB0b3RhbF9uYW1lX3NpemU7CisKK3JldHJ5OgorCWpmZnNfZm1fd3JpdGVfbG9jayhmbWMpOworCWVyciA9IDA7CisKKwlpZiAoKGVyciA9IGpmZnNfZm1hbGxvYyhmbWMsIHRvdGFsX3NpemUsIG5ld19ub2RlLCAmZm0pKSA8IDApIHsKKwkJREpNKG5vX2pmZnNfbm9kZS0tKTsKKwkJamZmc19mbV93cml0ZV91bmxvY2soZm1jKTsKKwkJRChwcmludGsoImpmZnNfcmV3cml0ZV9kYXRhKCk6IEZhaWxlZCB0byBhbGxvY2F0ZSBmbS5cbiIpKTsKKwkJamZmc19mcmVlX25vZGUobmV3X25vZGUpOworCQlyZXR1cm4gZXJyOworCX0KKwllbHNlIGlmICghZm0tPm5vZGVzKSB7CisJCS8qIFRoZSBqZmZzX2ZtIHN0cnVjdCB0aGF0IHdlIGdvdCBpcyBub3QgYmlnIGVub3VnaC4gICovCisJCS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYmVjYXVzZSB3ZSBkZWFsIHdpdGggdGhpcyBjYXNlCisJCSAgIGluIGpmZnNfZ2FyYmFnZV9jb2xsZWN0X25leHQoKS4qLworCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzX3Jld3JpdGVfZGF0YSgpOiBBbGxvY2F0ZWQgbm9kZSBpcyB0b28gc21hbGwgKCVkIGJ5dGVzIG9mICVkKVxuIiwgZm0tPnNpemUsIHRvdGFsX3NpemUpOworCQlpZiAoKGVyciA9IGpmZnNfd3JpdGVfZHVtbXlfbm9kZShjLCBmbSkpIDwgMCkgeworCQkJRChwcmludGsoImpmZnNfcmV3cml0ZV9kYXRhKCk6ICIKKwkJCQkgImpmZnNfd3JpdGVfZHVtbXlfbm9kZSgpIEZhaWxlZCFcbiIpKTsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IC1FTk9TUEM7CisJCX0KKwkJREpNKG5vX2pmZnNfZm0tLSk7CisJCWpmZnNfZm1fd3JpdGVfdW5sb2NrKGZtYyk7CisJCWtmcmVlKGZtKTsKKwkJCisJCXJldHVybiBlcnI7CisJfQorCW5ld19ub2RlLT5mbSA9IGZtOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcmF3IGlub2RlLiAgKi8KKwlyYXdfaW5vZGUubWFnaWMgPSBKRkZTX01BR0lDX0JJVE1BU0s7CisJcmF3X2lub2RlLmlubyA9IGYtPmlubzsKKwlyYXdfaW5vZGUucGlubyA9IGYtPnBpbm87CisJcmF3X2lub2RlLnZlcnNpb24gPSBmLT5oaWdoZXN0X3ZlcnNpb24gKyAxOworCXJhd19pbm9kZS5tb2RlID0gZi0+bW9kZTsKKwlyYXdfaW5vZGUudWlkID0gZi0+dWlkOworCXJhd19pbm9kZS5naWQgPSBmLT5naWQ7CisJcmF3X2lub2RlLmF0aW1lID0gZi0+YXRpbWU7CisJcmF3X2lub2RlLm10aW1lID0gZi0+bXRpbWU7CisJcmF3X2lub2RlLmN0aW1lID0gZi0+Y3RpbWU7CisJcmF3X2lub2RlLm9mZnNldCA9IG5vZGUtPmRhdGFfb2Zmc2V0OworCXJhd19pbm9kZS5kc2l6ZSA9IHNpemU7CisJcmF3X2lub2RlLnJzaXplID0gc2l6ZTsKKwlyYXdfaW5vZGUubnNpemUgPSBmLT5uc2l6ZTsKKwlyYXdfaW5vZGUubmxpbmsgPSBmLT5ubGluazsKKwlyYXdfaW5vZGUuc3BhcmUgPSAwOworCXJhd19pbm9kZS5yZW5hbWUgPSAwOworCXJhd19pbm9kZS5kZWxldGVkID0gZi0+ZGVsZXRlZDsKKwlyYXdfaW5vZGUuYWNjdXJhdGUgPSAweGZmOworCXJhd19pbm9kZS5kY2hrc3VtID0gMDsKKwlyYXdfaW5vZGUubmNoa3N1bSA9IDA7CisKKwlwb3MgPSBuZXdfbm9kZS0+Zm0tPm9mZnNldDsKKwlwb3NfZGNoa3N1bSA9IHBvcyArSkZGU19SQVdfSU5PREVfRENIS1NVTV9PRkZTRVQ7CisKKwlEMyhwcmludGsoImpmZnNfcmV3cml0ZV9kYXRhKCk6IFdyaXRpbmcgdGhpcyByYXcgaW5vZGUgIgorCQkgICJ0byBwb3MgMHgldWwuXG4iLCBwb3MpKTsKKwlEMyhqZmZzX3ByaW50X3Jhd19pbm9kZSgmcmF3X2lub2RlKSk7CisKKwlpZiAoKGVyciA9IGZsYXNoX3NhZmVfd3JpdGUoZm1jLT5tdGQsIHBvcywKKwkJCQkgICAgKHVfY2hhciAqKSAmcmF3X2lub2RlLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKQorCQkJCSAgICAtIHNpemVvZihfX3UzMikKKwkJCQkgICAgLSBzaXplb2YoX191MTYpIC0gc2l6ZW9mKF9fdTE2KSkpIDwgMCkgeworCQlqZmZzX2ZtZnJlZV9wYXJ0bHkoZm1jLCBmbSwKKwkJCQkgICB0b3RhbF9uYW1lX3NpemUgKyB0b3RhbF9kYXRhX3NpemUpOworCQlqZmZzX2ZtX3dyaXRlX3VubG9jayhmbWMpOworCQlwcmludGsoS0VSTl9FUlIgIkpGRlM6IGpmZnNfcmV3cml0ZV9kYXRhOiBXcml0ZSBlcnJvciBkdXJpbmcgIgorCQkJInJld3JpdGUuIChyYXcgaW5vZGUpXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJKRkZTOiBqZmZzX3Jld3JpdGVfZGF0YTogTm93IHJldHJ5aW5nICIKKwkJCSJyZXdyaXRlLiAocmF3IGlub2RlKVxuIik7CisJCWdvdG8gcmV0cnk7CisJfQorCXBvcyArPSBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKTsKKworCS8qIFdyaXRlIHRoZSBuYW1lIHRvIHRoZSBmbGFzaCBtZW1vcnkuICAqLworCWlmIChmLT5uc2l6ZSkgeworCQlEMyhwcmludGsoImpmZnNfcmV3cml0ZV9kYXRhKCk6IFdyaXRpbmcgbmFtZSBcIiVzXCIgdG8gIgorCQkJICAicG9zIDB4JXVsLlxuIiwgZi0+bmFtZSwgKHVuc2lnbmVkIGludCkgcG9zKSk7CisJCWlmICgoZXJyID0gZmxhc2hfc2FmZV93cml0ZShmbWMtPm10ZCwgcG9zLAorCQkJCQkgICAgKHVfY2hhciAqKWYtPm5hbWUsCisJCQkJCSAgICBmLT5uc2l6ZSkpIDwgMCkgeworCQkJamZmc19mbWZyZWVfcGFydGx5KGZtYywgZm0sIHRvdGFsX2RhdGFfc2l6ZSk7CisJCQlqZmZzX2ZtX3dyaXRlX3VubG9jayhmbWMpOworCQkJcHJpbnRrKEtFUk5fRVJSICJKRkZTOiBqZmZzX3Jld3JpdGVfZGF0YTogV3JpdGUgIgorCQkJCSJlcnJvciBkdXJpbmcgcmV3cml0ZS4gKG5hbWUpXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiSkZGUzogamZmc19yZXdyaXRlX2RhdGE6IE5vdyByZXRyeWluZyAiCisJCQkJInJld3JpdGUuIChuYW1lKVxuIik7CisJCQlnb3RvIHJldHJ5OworCQl9CisJCXBvcyArPSB0b3RhbF9uYW1lX3NpemU7CisJCXJhd19pbm9kZS5uY2hrc3VtID0gamZmc19jaGVja3N1bShmLT5uYW1lLCBmLT5uc2l6ZSk7CisJfQorCisJLyogV3JpdGUgdGhlIGRhdGEuICAqLworCWlmIChzaXplKSB7CisJCWludCByOworCQl1bnNpZ25lZCBjaGFyICpwYWdlOworCQlfX3UzMiBvZmZzZXQgPSBub2RlLT5kYXRhX29mZnNldDsKKworCQlpZiAoIShwYWdlID0gKHVuc2lnbmVkIGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCkpKSB7CisJCQlqZmZzX2ZtZnJlZV9wYXJ0bHkoZm1jLCBmbSwgMCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQl3aGlsZSAoc2l6ZSkgeworCQkJX191MzIgcyA9IG1pbihzaXplLCAoX191MzIpUEFHRV9TSVpFKTsKKwkJCWlmICgociA9IGpmZnNfcmVhZF9kYXRhKGYsIChjaGFyICopcGFnZSwKKwkJCQkJCW9mZnNldCwgcykpIDwgcykgeworCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKKwkJCQlqZmZzX2ZtZnJlZV9wYXJ0bHkoZm1jLCBmbSwgMCk7CisJCQkJamZmc19mbV93cml0ZV91bmxvY2soZm1jKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkpGRlM6IGpmZnNfcmV3cml0ZV9kYXRhOiAiCisJCQkJCSAiamZmc19yZWFkX2RhdGEoKSAiCisJCQkJCSAiZmFpbGVkISAociA9ICVkKVxuIiwgcik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKChlcnIgPSBmbGFzaF9zYWZlX3dyaXRlKGZtYy0+bXRkLAorCQkJCQkJICAgIHBvcywgcGFnZSwgcikpIDwgMCkgeworCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKKwkJCQlqZmZzX2ZtZnJlZV9wYXJ0bHkoZm1jLCBmbSwgMCk7CisJCQkJamZmc19mbV93cml0ZV91bmxvY2soZm1jKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkpGRlM6IGpmZnNfcmV3cml0ZV9kYXRhOiAiCisJCQkJICAgICAgICJXcml0ZSBlcnJvciBkdXJpbmcgcmV3cml0ZS4gIgorCQkJCSAgICAgICAiKGRhdGEpXG4iKTsKKwkJCQlnb3RvIHJldHJ5OworCQkJfQorCQkJcG9zICs9IHI7CisJCQlzaXplIC09IHI7CisJCQlvZmZzZXQgKz0gcjsKKwkJCXJhd19pbm9kZS5kY2hrc3VtICs9IGpmZnNfY2hlY2tzdW0ocGFnZSwgcik7CisJCX0KKworCSAgICAgICAgZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOworCX0KKworCXJhd19pbm9kZS5hY2N1cmF0ZSA9IDA7CisJcmF3X2lub2RlLmNoa3N1bSA9IGpmZnNfY2hlY2tzdW0oJnJhd19pbm9kZSwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgamZmc19yYXdfaW5vZGUpCisJCQkJCSAtIHNpemVvZihfX3UxNikpOworCisJLyogQWRkIHRoZSBjaGVja3N1bS4gICovCisJaWYgKChlcnIKKwkgICAgID0gZmxhc2hfc2FmZV93cml0ZShmbWMtPm10ZCwgcG9zX2RjaGtzdW0sCisJCQkJJigodV9jaGFyICopCisJCQkJJnJhd19pbm9kZSlbSkZGU19SQVdfSU5PREVfRENIS1NVTV9PRkZTRVRdLAorCQkJCXNpemVvZihfX3UzMikgKyBzaXplb2YoX191MTYpCisJCQkJKyBzaXplb2YoX191MTYpKSkgPCAwKSB7CisJCWpmZnNfZm1mcmVlX3BhcnRseShmbWMsIGZtLCAwKTsKKwkJamZmc19mbV93cml0ZV91bmxvY2soZm1jKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJKRkZTOiBqZmZzX3Jld3JpdGVfZGF0YTogV3JpdGUgZXJyb3IgZHVyaW5nICIKKwkJICAgICAgICJyZXdyaXRlLiAoY2hlY2tzdW0pXG4iKTsKKwkJZ290byByZXRyeTsKKwl9CisKKwkvKiBOb3cgbWFrZSB0aGUgZmlsZSBzeXN0ZW0gYXdhcmUgb2YgdGhlIG5ld2x5IHdyaXR0ZW4gbm9kZS4gICovCisJamZmc19pbnNlcnRfbm9kZShjLCBmLCAmcmF3X2lub2RlLCBmLT5uYW1lLCBuZXdfbm9kZSk7CisJamZmc19mbV93cml0ZV91bmxvY2soZm1jKTsKKworCUQzKHByaW50aygiamZmc19yZXdyaXRlX2RhdGEoKTogTGVhdmluZy4uLlxuIikpOworCXJldHVybiAwOworfSAvKiBqZmZzX3Jld3JpdGVfZGF0YSgpICAqLworCisKKy8qIGpmZnNfZ2FyYmFnZV9jb2xsZWN0X25leHQgaW1wbGVtZW50cyBvbmUgc3RlcCBpbiB0aGUgZ2FyYmFnZSBjb2xsZWN0CisgICBwcm9jZXNzIGFuZCBpcyBvZnRlbiBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXQgZWFjaCBvY2Nhc2lvbiBvZiBhCisgICBnYXJiYWdlIGNvbGxlY3QuICAqLworCitzdGF0aWMgaW50CitqZmZzX2dhcmJhZ2VfY29sbGVjdF9uZXh0KHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMpCit7CisJc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMgPSBjLT5mbWM7CisJc3RydWN0IGpmZnNfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgamZmc19maWxlICpmOworCWludCBlcnIgPSAwOworCV9fdTMyIHNpemU7CisJX191MzIgZGF0YV9zaXplOworCV9fdTMyIHRvdGFsX25hbWVfc2l6ZTsKKwlfX3UzMiBleHRyYV9hdmFpbGFibGU7CisJX191MzIgc3BhY2VfbmVlZGVkOworCV9fdTMyIGZyZWVfY2h1bmtfc2l6ZTEgPSBqZmZzX2ZyZWVfc2l6ZTEoZm1jKTsKKwlEMihfX3UzMiBmcmVlX2NodW5rX3NpemUyID0gamZmc19mcmVlX3NpemUyKGZtYykpOworCisJLyogR2V0IHRoZSBvbGRlc3Qgbm9kZSBpbiB0aGUgZmxhc2guICAqLworCW5vZGUgPSBqZmZzX2dldF9vbGRlc3Rfbm9kZShmbWMpOworCUFTU0VSVChpZiAoIW5vZGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJKRkZTOiBqZmZzX2dhcmJhZ2VfY29sbGVjdF9uZXh0OiAiCisJCSAgICAgICAiTm8gb2xkZXN0IG5vZGUgZm91bmQhXG4iKTsKKyAgICAgICAgICAgICAgICBlcnIgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGpmZnNfZ2FyYmFnZV9jb2xsZWN0X25leHRfZW5kOworCQkKKworCX0pOworCisJLyogRmluZCBpdHMgY29ycmVzcG9uZGluZyBmaWxlIHRvby4gICovCisJZiA9IGpmZnNfZmluZF9maWxlKGMsIG5vZGUtPmlubyk7CisKKwlpZiAoIWYpIHsKKwkgIHByaW50ayAoS0VSTl9FUlIgIkpGRlM6IGpmZnNfZ2FyYmFnZV9jb2xsZWN0X25leHQ6ICIKKyAgICAgICAgICAgICAgICAgICJObyBmaWxlIHRvIGdhcmJhZ2UgY29sbGVjdCEgIgorCQkgICIoaW5vID0gMHglMDh4KVxuIiwgbm9kZS0+aW5vKTsKKyAgICAgICAgICAvKiBGSVhNRTogRnJlZSB0aGUgb2ZmZW5kaW5nIG5vZGUgYW5kIHJlY292ZXIuICovCisgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgICAgZ290byBqZmZzX2dhcmJhZ2VfY29sbGVjdF9uZXh0X2VuZDsKKwl9CisKKwkvKiBXZSBhbHdheXMgd3JpdGUgb3V0IHRoZSBuYW1lLiBUaGVvcmV0aWNhbGx5LCB3ZSBkb24ndCBuZWVkCisJICAgdG8sIGJ1dCBmb3Igbm93IGl0J3MgZWFzaWVyIC0gYmVjYXVzZSBvdGhlcndpc2Ugd2UnZCBoYXZlCisJICAgdG8ga2VlcCB0cmFjayBvZiBob3cgbWFueSB0aW1lcyB0aGUgY3VycmVudCBuYW1lIGV4aXN0cyBvbgorCSAgIHRoZSBmbGFzaCBhbmQgbWFrZSBzdXJlIGl0IG5ldmVyIHJlYWNoZXMgemVyby4KKworCSAgIFRoZSBjdXJyZW50IGFwcHJvYWNoIG1lYW5zIHRoYXQgd291bGQgYmUgcG9zc2libGUgdG8gY2F1c2UKKwkgICB0aGUgR0MgdG8gZW5kIHVwIGVhdGluZyBpdHMgdGFpbCBieSB3cml0aW5nIGxvdHMgb2Ygbm9kZXMKKwkgICB3aXRoIG5vIG5hbWUgZm9yIGl0IHRvIGdhcmJhZ2UtY29sbGVjdC4gSGVuY2UgdGhlIGNoYW5nZSBpbgorCSAgIGlub2RlLmMgdG8gd3JpdGUgbmFtZXMgd2l0aCBfZXZlcnlfIG5vZGUuCisKKwkgICBJdCBzdWNrcywgYnV0IGl0IF9zaG91bGRfIHdvcmsuCisJKi8KKwl0b3RhbF9uYW1lX3NpemUgPSBKRkZTX1BBRChmLT5uc2l6ZSk7CisKKwlEMShwcmludGsoImpmZnNfZ2FyYmFnZV9jb2xsZWN0X25leHQoKTogXCIlc1wiLCAiCisJCSAgImlubzogJXUsIHZlcnNpb246ICV1LCBsb2NhdGlvbiAweCV4LCBkc2l6ZSAldVxuIiwKKwkJICAoZi0+bmFtZSA/IGYtPm5hbWUgOiAiIiksIG5vZGUtPmlubywgbm9kZS0+dmVyc2lvbiwgCisJCSAgbm9kZS0+Zm0tPm9mZnNldCwgbm9kZS0+ZGF0YV9zaXplKSk7CisKKwkvKiBDb21wdXRlIGhvdyBtYW55IGRhdGEgaXQncyBwb3NzaWJsZSB0byByZXdyaXRlIGF0IHRoZSBtb21lbnQuICAqLworCWRhdGFfc2l6ZSA9IGYtPnNpemUgLSBub2RlLT5kYXRhX29mZnNldDsKKworCS8qIEFuZCBmcm9tIHRoYXQsIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBjaHVuayB3ZSB3YW50IHRvIHdyaXRlICovCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgamZmc19yYXdfaW5vZGUpICsgdG90YWxfbmFtZV9zaXplCisJICAgICAgICsgZGF0YV9zaXplICsgSkZGU19HRVRfUEFEX0JZVEVTKGRhdGFfc2l6ZSk7CisKKwkvKiBJZiB0aGF0J3MgbW9yZSB0aGFuIG1heF9jaHVua19zaXplLCByZWR1Y2UgaXQgYWNjb3JkaW5nbHkgKi8KKwlpZiAoc2l6ZSA+IGZtYy0+bWF4X2NodW5rX3NpemUpIHsKKwkJc2l6ZSA9IGZtYy0+bWF4X2NodW5rX3NpemU7CisJCWRhdGFfc2l6ZSA9IHNpemUgLSBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKQorCQkJICAgIC0gdG90YWxfbmFtZV9zaXplOworCX0KKworCS8qIElmIHdlJ3JlIGFza2luZyB0byB0YWtlIHVwIG1vcmUgc3BhY2UgdGhhbiBmcmVlX2NodW5rX3NpemUxCisJICAgYnV0IHdlIF9jb3VsZF8gZml0IGluIGl0LCBzaHJpbmsgYWNjb3JkaW5nbHkuCisJKi8KKwlpZiAoc2l6ZSA+IGZyZWVfY2h1bmtfc2l6ZTEpIHsKKworCQlpZiAoZnJlZV9jaHVua19zaXplMSA8CisJCSAgICAoc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkgKyB0b3RhbF9uYW1lX3NpemUgKyBCTE9DS19TSVpFKSl7CisJCQkvKiBUaGUgc3BhY2UgbGVmdCBpcyB0b28gc21hbGwgdG8gYmUgb2YgYW55CisJCQkgICB1c2UgcmVhbGx5LiAgKi8KKwkJCXN0cnVjdCBqZmZzX2ZtICpkaXJ0eV9mbQorCQkJPSBqZmZzX2ZtYWxsb2NlZChmbWMsCisJCQkJCSBmbWMtPnRhaWwtPm9mZnNldCArIGZtYy0+dGFpbC0+c2l6ZSwKKwkJCQkJIGZyZWVfY2h1bmtfc2l6ZTEsIE5VTEwpOworCQkJaWYgKCFkaXJ0eV9mbSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiSkZGUzogIgorCQkJCSAgICAgICAiamZmc19nYXJiYWdlX2NvbGxlY3RfbmV4dDogIgorCQkJCSAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGBkaXJ0eScgIgorCQkJCSAgICAgICAiZmxhc2ggbWVtb3J5IVxuIik7CisJCQkJZXJyID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gamZmc19nYXJiYWdlX2NvbGxlY3RfbmV4dF9lbmQ7CisJCQl9CisJCQlEMShwcmludGsoIkRpcnR5aW5nIGVuZCBvZiBmbGFzaCAtIHRvbyBzbWFsbFxuIikpOworCQkJamZmc193cml0ZV9kdW1teV9ub2RlKGMsIGRpcnR5X2ZtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IDA7CisJCQlnb3RvIGpmZnNfZ2FyYmFnZV9jb2xsZWN0X25leHRfZW5kOworCQl9CisJCUQxKHByaW50aygiUmVkdWNpbmcgc2l6ZSBvZiBuZXcgbm9kZSBmcm9tICVkIHRvICVkIHRvIGF2b2lkICIKKwkJCSAgIiBleGNlZWRpbmcgZnJlZV9jaHVua19zaXplMVxuIiwKKwkJCSAgc2l6ZSwgZnJlZV9jaHVua19zaXplMSkpOworCisJCXNpemUgPSBmcmVlX2NodW5rX3NpemUxOworCQlkYXRhX3NpemUgPSBzaXplIC0gc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkKKwkJCSAgICAtIHRvdGFsX25hbWVfc2l6ZTsKKwl9CisKKworCS8qIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCB0byBob2xkIHRoZSBub2RlcworCSAgIHdoaWNoIGFyZSByZW1haW5pbmcgaW4gdGhlIHRhaWwgKi8KKwlzcGFjZV9uZWVkZWQgPSBmbWMtPm1pbl9mcmVlX3NpemUgLSAobm9kZS0+Zm0tPm9mZnNldCAlIGZtYy0+c2VjdG9yX3NpemUpOworCisJLyogRnJvbSB0aGF0LCBjYWxjdWxhdGUgaG93IG11Y2ggJ2V4dHJhJyBzcGFjZSB3ZSBjYW4gdXNlIHRvCisJICAgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIG5vZGUgd2UncmUgd3JpdGluZyBmcm9tIHRoZSBzaXplCisJICAgb2YgdGhlIG5vZGUgd2UncmUgb2Jzb2xldGluZworCSovCisJaWYgKHNwYWNlX25lZWRlZCA+IGZtYy0+ZnJlZV9zaXplKSB7CisJCS8qIElmIHdlJ3ZlIGdvbmUgYmVsb3cgbWluX2ZyZWVfc2l6ZSBmb3Igc29tZSByZWFzb24sCisJCSAgIGRvbid0IGZ1Y2sgdXAuIFRoaXMgaXMgd2h5IHdlIGhhdmUgCisJCSAgIG1pbl9mcmVlX3NpemUgPiBzZWN0b3Jfc2l6ZS4gV2hpbmdlIGFib3V0IGl0IHRob3VnaCwKKwkJICAganVzdCBzbyBJIGNhbiBjb252aW5jZSBteXNlbGYgbXkgbWF0aHMgaXMgcmlnaHQuCisJCSovCisJCUQxKHByaW50ayhLRVJOX1dBUk5JTkcgImpmZnNfZ2FyYmFnZV9jb2xsZWN0X25leHQoKTogIgorCQkJICAic3BhY2VfbmVlZGVkICVkIGV4Y2VlZGVkIGZyZWVfc2l6ZSAlZFxuIiwKKwkJCSAgc3BhY2VfbmVlZGVkLCBmbWMtPmZyZWVfc2l6ZSkpOworCQlleHRyYV9hdmFpbGFibGUgPSAwOworCX0gZWxzZSB7CisJCWV4dHJhX2F2YWlsYWJsZSA9IGZtYy0+ZnJlZV9zaXplIC0gc3BhY2VfbmVlZGVkOworCX0KKworCS8qIENoZWNrIHRoYXQgd2UgZG9uJ3QgdXNlIHVwIGFueSBtb3JlICdleHRyYScgc3BhY2UgdGhhbgorCSAgIHdoYXQncyBhdmFpbGFibGUgKi8KKwlpZiAoc2l6ZSA+IEpGRlNfUEFEKG5vZGUtPmRhdGFfc2l6ZSkgKyB0b3RhbF9uYW1lX3NpemUgKyAKKwkgICAgc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkgKyBleHRyYV9hdmFpbGFibGUpIHsKKwkJRDEocHJpbnRrKCJSZWR1Y2luZyBzaXplIG9mIG5ldyBub2RlIGZyb20gJWQgdG8gJWxkIHRvIGF2b2lkICIKKwkJICAgICAgICJjYXRjaGluZyBvdXIgdGFpbFxuIiwgc2l6ZSwgCisJCQkgIChsb25nKSAoSkZGU19QQUQobm9kZS0+ZGF0YV9zaXplKSArIEpGRlNfUEFEKG5vZGUtPm5hbWVfc2l6ZSkgKyAKKwkJCSAgc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkgKyBleHRyYV9hdmFpbGFibGUpKSk7CisJCUQxKHByaW50aygic3BhY2VfbmVlZGVkID0gJWQsIGV4dHJhX2F2YWlsYWJsZSA9ICVkXG4iLCAKKwkJCSAgc3BhY2VfbmVlZGVkLCBleHRyYV9hdmFpbGFibGUpKTsKKworCQlzaXplID0gSkZGU19QQUQobm9kZS0+ZGF0YV9zaXplKSArIHRvdGFsX25hbWVfc2l6ZSArIAorCQkgIHNpemVvZihzdHJ1Y3QgamZmc19yYXdfaW5vZGUpICsgZXh0cmFfYXZhaWxhYmxlOworCQlkYXRhX3NpemUgPSBzaXplIC0gc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkKKwkJCS0gdG90YWxfbmFtZV9zaXplOworCX07CisKKwlEMihwcmludGsoIiAgdG90YWxfbmFtZV9zaXplOiAldVxuIiwgdG90YWxfbmFtZV9zaXplKSk7CisJRDIocHJpbnRrKCIgIGRhdGFfc2l6ZTogJXVcbiIsIGRhdGFfc2l6ZSkpOworCUQyKHByaW50aygiICBzaXplOiAldVxuIiwgc2l6ZSkpOworCUQyKHByaW50aygiICBmLT5uc2l6ZTogJXVcbiIsIGYtPm5zaXplKSk7CisJRDIocHJpbnRrKCIgIGYtPnNpemU6ICV1XG4iLCBmLT5zaXplKSk7CisJRDIocHJpbnRrKCIgIG5vZGUtPmRhdGFfb2Zmc2V0OiAldVxuIiwgbm9kZS0+ZGF0YV9vZmZzZXQpKTsKKwlEMihwcmludGsoIiAgZnJlZV9jaHVua19zaXplMTogJXVcbiIsIGZyZWVfY2h1bmtfc2l6ZTEpKTsKKwlEMihwcmludGsoIiAgZnJlZV9jaHVua19zaXplMjogJXVcbiIsIGZyZWVfY2h1bmtfc2l6ZTIpKTsKKwlEMihwcmludGsoIiAgbm9kZS0+Zm0tPm9mZnNldDogMHglMDh4XG4iLCBub2RlLT5mbS0+b2Zmc2V0KSk7CisKKwlpZiAoKGVyciA9IGpmZnNfcmV3cml0ZV9kYXRhKGYsIG5vZGUsIGRhdGFfc2l6ZSkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnNfcmV3cml0ZV9kYXRhKCkgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJICAKK2pmZnNfZ2FyYmFnZV9jb2xsZWN0X25leHRfZW5kOgorCUQzKHByaW50aygiamZmc19nYXJiYWdlX2NvbGxlY3RfbmV4dDogTGVhdmluZy4uLlxuIikpOworCXJldHVybiBlcnI7Cit9IC8qIGpmZnNfZ2FyYmFnZV9jb2xsZWN0X25leHQgKi8KKworCisvKiBJZiBhbiBvYnNvbGV0ZSBub2RlIGlzIHBhcnRseSBnb2luZyB0byBiZSBlcmFzZWQgZHVlIHRvIGdhcmJhZ2UKKyAgIGNvbGxlY3Rpb24sIHRoZSBwYXJ0IHRoYXQgaXNuJ3QgZ29pbmcgdG8gYmUgZXJhc2VkIG11c3QgYmUgZmlsbGVkCisgICB3aXRoIHplcm9lcyBzbyB0aGF0IHRoZSBzY2FuIG9mIHRoZSBmbGFzaCB3aWxsIHdvcmsgc21vb3RobHkgbmV4dAorICAgdGltZS4gIChUaGUgZGF0YSBpbiB0aGUgZmlsZSBjb3VsZCBmb3IgaW5zdGFuY2UgYmUgYSBKRkZTIGltYWdlCisgICB3aGljaCBjb3VsZCBjYXVzZSBlbm9ybW91cyBjb25mdXNpb24gZHVyaW5nIGEgc2NhbiBvZiB0aGUgZmxhc2gKKyAgIGRldmljZSBpZiB3ZSBkaWRuJ3QgZG8gdGhpcy4pCisgICAgIFRoZXJlIGFyZSB0d28gcGhhc2VzIGluIHRoaXMgcHJvY2VkdXJlOiBGaXJzdCwgdGhlIGNsZWFyaW5nIG9mCisgICB0aGUgbmFtZSBhbmQgZGF0YSBwYXJ0cyBvZiB0aGUgbm9kZS4gU2Vjb25kLCBwb3NzaWJseSBhbHNvIGNsZWFyaW5nCisgICBhIHBhcnQgb2YgdGhlIHJhdyBpbm9kZSBhcyB3ZWxsLiAgSWYgdGhlIGJveCBpcyBwb3dlciBjeWNsZWQgZHVyaW5nCisgICB0aGUgZmlyc3QgcGhhc2UsIG9ubHkgdGhlIGNoZWNrc3VtIG9mIHRoaXMgbm9kZS10by1iZS1jbGVhcmVkLWF0LQorICAgdGhlLWVuZCB3aWxsIGJlIHdyb25nLiAgSWYgdGhlIGJveCBpcyBwb3dlciBjeWNsZWQgZHVyaW5nLCBvciBhZnRlciwKKyAgIHRoZSBjbGVhcmluZyBvZiB0aGUgcmF3IGlub2RlLCB0aGUgaW5mb3JtYXRpb24gbGlrZSB0aGUgbGVuZ3RoIG9mCisgICB0aGUgbmFtZSBhbmQgZGF0YSBwYXJ0cyBhcmUgemVyb2VkLiAgVGhlIG5leHQgdGltZSB0aGUgYm94IGlzCisgICBwb3dlcmVkIHVwLCB0aGUgc2Nhbm5pbmcgYWxnb3JpdGhtIG1hbmFnZXMgdGhpcyBmYXVsdHkgZGF0YSB0b28KKyAgIGJlY2F1c2U6CisKKyAgIC0gVGhlIGNoZWNrc3VtIGlzIGludmFsaWQgYW5kIHRodXMgdGhlIHJhdyBpbm9kZSBtdXN0IGJlIGRpc2NhcmRlZAorICAgICBpbiBhbnkgY2FzZS4KKyAgIC0gSWYgdGhlIGxlbmd0aHMgb2YgdGhlIGRhdGEgcGFydCBvciB0aGUgbmFtZSBwYXJ0IGFyZSB6ZXJvZWQsIHRoZQorICAgICBzY2FubmluZyBqdXN0IGNvbnRpbnVlcyBhZnRlciB0aGUgcmF3IGlub2RlLiAgQnV0IGFmdGVyIHRoZSBpbm9kZQorICAgICB0aGUgc2Nhbm5pbmcgcHJvY2VkdXJlIGp1c3QgZmluZHMgemVyb2VzIHdoaWNoIGlzIHRoZSBzYW1lIGFzCisgICAgIGRpcnQuCisKKyAgIFNvLCBpbiB0aGUgZW5kLCB0aGlzIGNvdWxkIG5ldmVyIGZhaWwuIDotKSAgRXZlbiBpZiBpdCBkb2VzIGZhaWwsCisgICB0aGUgc2Nhbm5pbmcgYWxnb3JpdGhtIHNob3VsZCBtYW5hZ2UgdGhhdCB0b28uICAqLworCitzdGF0aWMgaW50CitqZmZzX2NsZWFyX2VuZF9vZl9ub2RlKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMsIF9fdTMyIGVyYXNlX3NpemUpCit7CisJc3RydWN0IGpmZnNfZm0gKmZtOworCXN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jID0gYy0+Zm1jOworCV9fdTMyIHplcm9fb2Zmc2V0OworCV9fdTMyIHplcm9fc2l6ZTsKKwlfX3UzMiB6ZXJvX29mZnNldF9kYXRhOworCV9fdTMyIHplcm9fc2l6ZV9kYXRhOworCV9fdTMyIGN1dHRpbmdfcmF3X2lub2RlID0gMDsKKworCWlmICghKGZtID0gamZmc19jdXRfbm9kZShmbWMsIGVyYXNlX3NpemUpKSkgeworCQlEMyhwcmludGsoImpmZnNfY2xlYXJfZW5kX29mX25vZGUoKTogZm0gPT0gTlVMTFxuIikpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBXaGVyZSBhbmQgaG93IG11Y2ggc2hhbGwgd2UgY2xlYXI/ICAqLworCXplcm9fb2Zmc2V0ID0gZm1jLT5oZWFkLT5vZmZzZXQgKyBlcmFzZV9zaXplOworCXplcm9fc2l6ZSA9IGZtLT5vZmZzZXQgKyBmbS0+c2l6ZSAtIHplcm9fb2Zmc2V0OworCisJLyogRG8gd2UgaGF2ZSB0byBjbGVhciB0aGUgcmF3X2lub2RlIGV4cGxpY2l0bHk/ICAqLworCWlmIChmbS0+c2l6ZSAtIHplcm9fc2l6ZSA8IHNpemVvZihzdHJ1Y3QgamZmc19yYXdfaW5vZGUpKSB7CisJCWN1dHRpbmdfcmF3X2lub2RlID0gc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkKKwkJCQkgICAgLSAoZm0tPnNpemUgLSB6ZXJvX3NpemUpOworCX0KKworCS8qIEZpcnN0LCBjbGVhciB0aGUgbmFtZSBhbmQgZGF0YSBmaWVsZHMuICAqLworCXplcm9fb2Zmc2V0X2RhdGEgPSB6ZXJvX29mZnNldCArIGN1dHRpbmdfcmF3X2lub2RlOworCXplcm9fc2l6ZV9kYXRhID0gemVyb19zaXplIC0gY3V0dGluZ19yYXdfaW5vZGU7CisJZmxhc2hfc2FmZV9hY3F1aXJlKGZtYy0+bXRkKTsKKwlmbGFzaF9tZW1zZXQoZm1jLT5tdGQsIHplcm9fb2Zmc2V0X2RhdGEsIDAsIHplcm9fc2l6ZV9kYXRhKTsKKwlmbGFzaF9zYWZlX3JlbGVhc2UoZm1jLT5tdGQpOworCisJLyogU2hvdWxkIHdlIGNsZWFyIGEgcGFydCBvZiB0aGUgcmF3IGlub2RlPyAgKi8KKwlpZiAoY3V0dGluZ19yYXdfaW5vZGUpIHsKKwkJLyogSSBndWVzcyBpdCBpcyBvayB0byBjbGVhciB0aGUgcmF3IGlub2RlIGluIHRoaXMgb3JkZXIuICAqLworCQlmbGFzaF9zYWZlX2FjcXVpcmUoZm1jLT5tdGQpOworCQlmbGFzaF9tZW1zZXQoZm1jLT5tdGQsIHplcm9fb2Zmc2V0LCAwLAorCQkJICAgICBjdXR0aW5nX3Jhd19pbm9kZSk7CisJCWZsYXNoX3NhZmVfcmVsZWFzZShmbWMtPm10ZCk7CisJfQorCisJcmV0dXJuIDA7Cit9IC8qIGpmZnNfY2xlYXJfZW5kX29mX25vZGUoKSAgKi8KKworLyogVHJ5IHRvIGVyYXNlIGFzIG11Y2ggYXMgcG9zc2libGUgb2YgdGhlIGRpcnQgaW4gdGhlIGZsYXNoIG1lbW9yeS4gICovCitzdGF0aWMgbG9uZworamZmc190cnlfdG9fZXJhc2Uoc3RydWN0IGpmZnNfY29udHJvbCAqYykKK3sKKwlzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYyA9IGMtPmZtYzsKKwlsb25nIGVyYXNlX3NpemU7CisJaW50IGVycjsKKwlfX3UzMiBvZmZzZXQ7CisKKwlEMyhwcmludGsoImpmZnNfdHJ5X3RvX2VyYXNlKClcbiIpKTsKKworCWVyYXNlX3NpemUgPSBqZmZzX2VyYXNhYmxlX3NpemUoZm1jKTsKKworCUQyKHByaW50aygiamZmc190cnlfdG9fZXJhc2UoKTogZXJhc2Vfc2l6ZSA9ICVsZFxuIiwgZXJhc2Vfc2l6ZSkpOworCisJaWYgKGVyYXNlX3NpemUgPT0gMCkgeworCQlyZXR1cm4gMDsKKwl9CisJZWxzZSBpZiAoZXJhc2Vfc2l6ZSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJKRkZTOiBqZmZzX3RyeV90b19lcmFzZTogIgorCQkgICAgICAgImpmZnNfZXJhc2FibGVfc2l6ZSByZXR1cm5lZCAlbGQuXG4iLCBlcmFzZV9zaXplKTsKKwkJcmV0dXJuIGVyYXNlX3NpemU7CisJfQorCisJaWYgKChlcnIgPSBqZmZzX2NsZWFyX2VuZF9vZl9ub2RlKGMsIGVyYXNlX3NpemUpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJKRkZTOiBqZmZzX3RyeV90b19lcmFzZTogIgorCQkgICAgICAgIkNsZWFyaW5nIG9mIG5vZGUgZmFpbGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJb2Zmc2V0ID0gZm1jLT5oZWFkLT5vZmZzZXQ7CisKKwkvKiBOb3csIGxldCdzIHRyeSB0byBkbyB0aGUgZXJhc2UuICAqLworCWlmICgoZXJyID0gZmxhc2hfZXJhc2VfcmVnaW9uKGZtYy0+bXRkLAorCQkJCSAgICAgIG9mZnNldCwgZXJhc2Vfc2l6ZSkpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkpGRlM6IEVyYXNlIG9mIGZsYXNoIGZhaWxlZC4gIgorCQkgICAgICAgIm9mZnNldCA9ICV1LCBlcmFzZV9zaXplID0gJWxkXG4iLAorCQkgICAgICAgb2Zmc2V0LCBlcmFzZV9zaXplKTsKKwkJLyogWFhYOiBIZXJlIHdlIHNob3VsZCBhbGxvY2F0ZSB0aGlzIGFyZWEgYXMgZGlydHkKKwkJICAgd2l0aCBqZmZzX2ZtYWxsb2NlZCBvciBzb21ldGhpbmcgc2ltaWxhci4gIE5vdworCQkgICB3ZSBqdXN0IHJlcG9ydCB0aGUgZXJyb3IuICAqLworCQlyZXR1cm4gZXJyOworCX0KKworI2lmIDAKKwkvKiBDaGVjayBpZiB0aGUgZXJhc2VkIHNlY3RvcnMgcmVhbGx5IGdvdCBlcmFzZWQuICAqLworCXsKKwkJX191MzIgcG9zOworCQlfX3UzMiBlbmQ7CisKKwkJcG9zID0gKF9fdTMyKWZsYXNoX2dldF9kaXJlY3RfcG9pbnRlcih0b19rZGV2X3QoYy0+c2ItPnNfZGV2KSwgb2Zmc2V0KTsKKwkJZW5kID0gcG9zICsgZXJhc2Vfc2l6ZTsKKworCQlEMihwcmludGsoIkpGRlM6IENoZWNraW5nIGVyYXNlZCBzZWN0b3IocykuLi5cbiIpKTsKKworCQlmbGFzaF9zYWZlX2FjcXVpcmUoZm1jLT5tdGQpOworCisJCWZvciAoOyBwb3MgPCBlbmQ7IHBvcyArPSA0KSB7CisJCQlpZiAoKihfX3UzMiAqKXBvcyAhPSBKRkZTX0VNUFRZX0JJVE1BU0spIHsKKwkJCQlwcmludGsoIkpGRlM6IEVyYXNlIGZhaWxlZCEgcG9zID0gMHglbHhcbiIsCisJCQkJICAgICAgIChsb25nKXBvcyk7CisJCQkJamZmc19oZXhkdW1wKGZtYy0+bXRkLCBwb3MsCisJCQkJCSAgICAgamZmc19taW4oMjU2LCBlbmQgLSBwb3MpKTsKKwkJCQllcnIgPSAtMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWZsYXNoX3NhZmVfcmVsZWFzZShmbWMtPm10ZCk7CisKKwkJaWYgKCFlcnIpIHsKKwkJCUQyKHByaW50aygiSkZGUzogRXJhc2Ugc3VjY2VlZGVkLlxuIikpOworCQl9CisJCWVsc2UgeworCQkJLyogWFhYOiBIZXJlIHdlIHNob3VsZCBhbGxvY2F0ZSB0aGUgbWVtb3J5CisJCQkgICB3aXRoIGpmZnNfZm1hbGxvY2VkKCkgaW4gb3JkZXIgdG8gcHJldmVudAorCQkJICAgSkZGUyBmcm9tIHVzaW5nIHRoaXMgYXJlYSBhY2NpZGVudGFsbHkuICAqLworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogVXBkYXRlIHRoZSBmbGFzaCBtZW1vcnkgZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KKwlqZmZzX3N5bmNfZXJhc2UoZm1jLCBlcmFzZV9zaXplKTsKKworCXJldHVybiBlcmFzZV9zaXplOworfQorCisKKy8qIFRoZXJlIGFyZSBkaWZmZXJlbnQgY3JpdGVyaWEgdGhhdCBzaG91bGQgdHJpZ2dlciBhIGdhcmJhZ2UgY29sbGVjdDoKKworICAgMS4gVGhlcmUgaXMgdG9vIG11Y2ggZGlydCBpbiB0aGUgbWVtb3J5LgorICAgMi4gVGhlIGZyZWUgc3BhY2UgaXMgYmVjb21pbmcgc21hbGwuCisgICAzLiBUaGVyZSBhcmUgbWFueSB2ZXJzaW9ucyBvZiBhIG5vZGUuCisKKyAgIFRoZSBnYXJiYWdlIGNvbGxlY3Qgc2hvdWxkIGFsd2F5cyBiZSBkb25lIGluIGEgbWFubmVyIHRoYXQgZ3VhcmFudGVlcworICAgdGhhdCBmdXR1cmUgZ2FyYmFnZSBjb2xsZWN0cyBjYW5ub3QgYmUgbG9ja2VkLiAgRS5nLiBSZXdyaXR0ZW4gY2h1bmtzCisgICBzaG91bGQgbm90IGJlIHRvbyBsYXJnZSAoc3BhbiBtb3JlIHRoYW4gb25lIHNlY3RvciBpbiB0aGUgZmxhc2ggbWVtb3J5CisgICBmb3IgZXhlbXBsZSkuICBPZiBjb3Vyc2UgdGhlcmUgaXMgYSBsaW1pdCBvbiBob3cgaW50ZWxsaWdlbnQgdGhpcyBnYXJiYWdlCisgICBjb2xsZWN0aW9uIGNhbiBiZS4gICovCisKKworc3RhdGljIGludAoramZmc19nYXJiYWdlX2NvbGxlY3Rfbm93KHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMpCit7CisJc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMgPSBjLT5mbWM7CisJbG9uZyBlcmFzZWQgPSAwOworCWludCByZXN1bHQgPSAwOworCUQxKGludCBpID0gMSk7CisJRDIocHJpbnRrKCIqKipqZmZzX2dhcmJhZ2VfY29sbGVjdF9ub3coKTogZm1jLT5kaXJ0eV9zaXplID0gJXUsIGZtYy0+ZnJlZV9zaXplID0gMHgleFxuLCBmY3MxPTB4JXgsIGZjczI9MHgleCIsCisJCSAgZm1jLT5kaXJ0eV9zaXplLCBmbWMtPmZyZWVfc2l6ZSwgamZmc19mcmVlX3NpemUxKGZtYyksIGpmZnNfZnJlZV9zaXplMihmbWMpKSk7CisJRDIoamZmc19wcmludF9mbWNvbnRyb2woZm1jKSk7CisKKwkvLwlkb3duKCZmbWMtPmdjbG9jayk7CisKKwkvKiBJZiBpdCBpcyBwb3NzaWJsZSB0byBnYXJiYWdlIGNvbGxlY3QsIGRvIHNvLiAgKi8KKwkKKwl3aGlsZSAoZXJhc2VkID09IDApIHsKKwkJRDEocHJpbnRrKCIqKipqZmZzX2dhcmJhZ2VfY29sbGVjdF9ub3coKTogcm91bmQgIyV1LCAiCisJCQkgICJmbWMtPmRpcnR5X3NpemUgPSAldVxuIiwgaSsrLCBmbWMtPmRpcnR5X3NpemUpKTsKKwkJRDIoamZmc19wcmludF9mbWNvbnRyb2woZm1jKSk7CisKKwkJaWYgKChlcmFzZWQgPSBqZmZzX3RyeV90b19lcmFzZShjKSkgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJKRkZTOiBFcnJvciBpbiAiCisJCQkgICAgICAgImdhcmJhZ2UgY29sbGVjdG9yLlxuIik7CisJCQlyZXN1bHQgPSBlcmFzZWQ7CisJCQlnb3RvIGdjX2VuZDsKKwkJfQorCQlpZiAoZXJhc2VkKQorCQkJYnJlYWs7CisJCQorCQlpZiAoZm1jLT5mcmVlX3NpemUgPT0gMCkgeworCQkJLyogQXJnaCAqLworCQkJcHJpbnRrKEtFUk5fRVJSICJqZmZzX2dhcmJhZ2VfY29sbGVjdF9ub3coKTogZnJlZV9zaXplID09IDAuIFRoaXMgaXMgQkFELlxuIik7CisJCQlyZXN1bHQgPSAtRU5PU1BDOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZm1jLT5kaXJ0eV9zaXplIDwgZm1jLT5zZWN0b3Jfc2l6ZSkgeworCQkJLyogQWN0dWFsbHksIHdlIF9tYXlfIGhhdmUgYmVlbiBhYmxlIHRvIGZyZWUgc29tZSwgCisJCQkgKiBpZiB0aGVyZSBhcmUgbWFueSBvdmVybGFwcGluZyBub2RlcyB3aGljaCBhcmVuJ3QKKwkJCSAqIGFjdHVhbGx5IG1hcmtlZCBkaXJ0eSBiZWNhdXNlIHRoZXkgc3RpbGwgaGF2ZQorCQkJICogc29tZSB2YWxpZCBkYXRhIGluIGVhY2guCisJCQkgKi8KKwkJCXJlc3VsdCA9IC1FTk9TUEM7CisJCQlicmVhazsKKwkJfQorCisJCS8qIExldCdzIGRhcmUgdG8gbWFrZSBhIGdhcmJhZ2UgY29sbGVjdC4gICovCisJCWlmICgocmVzdWx0ID0gamZmc19nYXJiYWdlX2NvbGxlY3RfbmV4dChjKSkgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkpGRlM6IFNvbWV0aGluZyAiCisJCQkgICAgICAgImhhcyBnb25lIHNlcmlvdXNseSB3cm9uZyAiCisJCQkgICAgICAgIndpdGggYSBnYXJiYWdlIGNvbGxlY3QuXG4iKTsKKwkJCWdvdG8gZ2NfZW5kOworCQl9CisKKwkJRDEocHJpbnRrKCIgICBqZmZzX2dhcmJhZ2VfY29sbGVjdF9ub3coKTogZXJhc2VkOiAlbGRcbiIsIGVyYXNlZCkpOworCQlESk0oamZmc19wcmludF9tZW1vcnlfYWxsb2NhdGlvbl9zdGF0aXN0aWNzKCkpOworCX0KKwkKK2djX2VuZDoKKwkvLwl1cCgmZm1jLT5nY2xvY2spOworCisJRDMocHJpbnRrKCIgICBqZmZzX2dhcmJhZ2VfY29sbGVjdF9ub3coKTogTGVhdmluZy4uLlxuIikpOworCUQxKGlmIChlcmFzZWQpIHsKKwkJcHJpbnRrKCJqZmZzX2dfY19ub3coKTogZXJhc2VkID0gJWxkXG4iLCBlcmFzZWQpOworCQlqZmZzX3ByaW50X2ZtY29udHJvbChmbWMpOworCX0pOworCisJaWYgKCFlcmFzZWQgJiYgIXJlc3VsdCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlyZXR1cm4gcmVzdWx0OworfSAvKiBqZmZzX2dhcmJhZ2VfY29sbGVjdF9ub3coKSAqLworCisKKy8qIERldGVybWluZSBpZiBpdCBpcyByZWFzb25hYmxlIHRvIHN0YXJ0IGdhcmJhZ2UgY29sbGVjdGlvbi4KKyAgIFdlIHN0YXJ0IGEgZ2MgcGFzcyBpZiBlaXRoZXI6CisgICAtIFRoZSBudW1iZXIgb2YgZnJlZSBieXRlcyA8IE1JTl9GUkVFX0JZVEVTICYmIGF0IGxlYXN0IG9uZQorICAgICBibG9jayBpcyBkaXJ0eSwgT1IKKyAgIC0gVGhlIG51bWJlciBvZiBkaXJ0eSBieXRlcyA+IE1BWF9ESVJUWV9CWVRFUworKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRocmVhZF9zaG91bGRfd2FrZSAoc3RydWN0IGpmZnNfY29udHJvbCAqYykKK3sKKwlEMShwcmludGsgKEtFUk5fTk9USUNFICJ0aHJlYWRfc2hvdWxkX3dha2UoKTogZnJlZT0lZCwgZGlydHk9JWQsIGJsb2Nrc2l6ZT0lZC5cbiIsCisJCSAgIGMtPmZtYy0+ZnJlZV9zaXplLCBjLT5mbWMtPmRpcnR5X3NpemUsIGMtPmZtYy0+c2VjdG9yX3NpemUpKTsKKworCS8qIElmIHRoZXJlJ3Mgbm90IGVub3VnaCBkaXJ0eSBzcGFjZSB0byBmcmVlIGEgYmxvY2ssIHRoZXJlJ3Mgbm8gcG9pbnQuICovCisJaWYgKGMtPmZtYy0+ZGlydHlfc2l6ZSA8IGMtPmZtYy0+c2VjdG9yX3NpemUpIHsKKwkJRDIocHJpbnRrKEtFUk5fTk9USUNFICJ0aHJlYWRfc2hvdWxkX3dha2UoKTogTm90IHdha2luZy4gSW5zdWZmaWNpZW50IGRpcnR5IHNwYWNlXG4iKSk7CisJCXJldHVybiAwOworCX0KKyNpZiAxCisJLyogSWYgdGhlcmUgaXMgdG9vIG11Y2ggUkFNIHVzZWQgYnkgdGhlIHZhcmlvdXMgc3RydWN0dXJlcywgR0MgKi8KKwlpZiAoamZmc19nZXRfbm9kZV9pbnVzZSgpID4gKGMtPmZtYy0+dXNlZF9zaXplL2MtPmZtYy0+bWF4X2NodW5rX3NpemUgKiA1ICsgamZmc19nZXRfZmlsZV9jb3VudCgpICogMiArIDUwKSkgeworCQkvKiBGSVhNRTogUHJvdmlkZSBwcm9vZiB0aGF0IHRoaXMgdGVzdCBjYW4gYmUgc2F0aXNmaWVkLiBXZQorCQkgICBkb24ndCB3YW50IGEgZmlsZXN5c3RlbSBkb2luZyBlbmRsZXNzIEdDIGp1c3QgYmVjYXVzZSB0aGlzCisJCSAgIGNvbmRpdGlvbiBjYW5ub3QgZXZlciBiZSBmYWxzZS4KKwkJKi8KKwkJRDIocHJpbnRrKEtFUk5fTk9USUNFICJ0aHJlYWRfc2hvdWxkX3dha2UoKTogV2FraW5nIGR1ZSB0byBudW1iZXIgb2Ygbm9kZXNcbiIpKTsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJLyogSWYgdGhlcmUgYXJlIGZld2VyIGZyZWUgYnl0ZXMgdGhhbiB0aGUgdGhyZXNob2xkLCBHQyAqLworCWlmIChjLT5mbWMtPmZyZWVfc2l6ZSA8IGMtPmdjX21pbmZyZWVfdGhyZXNob2xkKSB7CisJCUQyKHByaW50ayhLRVJOX05PVElDRSAidGhyZWFkX3Nob3VsZF93YWtlKCk6IFdha2luZyBkdWUgdG8gaW5zdWZmaWNlbnQgZnJlZSBzcGFjZVxuIikpOworCQlyZXR1cm4gMTsKKwl9CisJLyogSWYgdGhlcmUgYXJlIG1vcmUgZGlydHkgYnl0ZXMgdGhhbiB0aGUgdGhyZXNob2xkLCBHQyAqLworCWlmIChjLT5mbWMtPmRpcnR5X3NpemUgPiBjLT5nY19tYXhkaXJ0eV90aHJlc2hvbGQpIHsKKwkJRDIocHJpbnRrKEtFUk5fTk9USUNFICJ0aHJlYWRfc2hvdWxkX3dha2UoKTogV2FraW5nIGR1ZSB0byBleGNlc3NpdmUgZGlydHkgc3BhY2VcbiIpKTsKKwkJcmV0dXJuIDE7CisJfQkKKwkvKiBGSVhNRTogV2hhdCBhYm91dCB0aGUgIlRoZXJlIGFyZSBtYW55IHZlcnNpb25zIG9mIGEgbm9kZSIgY29uZGl0aW9uPyAqLworCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBqZmZzX2dhcmJhZ2VfY29sbGVjdF90cmlnZ2VyKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMpCit7CisJLyogTk9URTogV2UgcmVseSBvbiB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgdGhlIEJLTCBoZXJlLgorCSAqIE90aGVyd2lzZSwgdGhlIGdjX3Rhc2sgY291bGQgZ28gYXdheSBiZXR3ZWVuIHRoZSBjaGVjaworCSAqIGFuZCB0aGUgd2FrZV91cF9wcm9jZXNzKCkKKwkgKi8KKwlpZiAoYy0+Z2NfdGFzayAmJiB0aHJlYWRfc2hvdWxkX3dha2UoYykpCisJCXNlbmRfc2lnKFNJR0hVUCwgYy0+Z2NfdGFzaywgMSk7Cit9CisgIAorCisvKiBLZXJuZWwgdGhyZWFkcyAgdGFrZSAodm9pZCAqKSBhcyBhcmd1bWVudHMuICAgVGh1cyB3ZSBwYXNzCisgICB0aGUgamZmc19jb250cm9sIGRhdGEgYXMgYSAodm9pZCAqKSBhbmQgdGhlbiBjYXN0IGl0LiAqLworaW50CitqZmZzX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQodm9pZCAqcHRyKQoreworICAgICAgICBzdHJ1Y3QgamZmc19jb250cm9sICpjID0gKHN0cnVjdCBqZmZzX2NvbnRyb2wgKikgcHRyOworCXN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jID0gYy0+Zm1jOworCWxvbmcgZXJhc2VkOworCWludCByZXN1bHQgPSAwOworCUQxKGludCBpID0gMSk7CisKKwlkYWVtb25pemUoImpmZnNfZ2NkIik7CisKKwljLT5nY190YXNrID0gY3VycmVudDsKKworCWxvY2tfa2VybmVsKCk7CisJaW5pdF9jb21wbGV0aW9uKCZjLT5nY190aHJlYWRfY29tcCk7IC8qIGJhcnJpZXIgKi8gCisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJc2lnaW5pdHNldGludiAoJmN1cnJlbnQtPmJsb2NrZWQsIHNpZ21hc2soU0lHSFVQKSB8IHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR1NUT1ApIHwgc2lnbWFzayhTSUdDT05UKSk7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJRDEocHJpbnRrIChLRVJOX05PVElDRSAiamZmc19nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKCk6IFN0YXJ0aW5nIGluZmluaXRlIGxvb3AuXG4iKSk7CisKKwlmb3IgKDs7KSB7CisKKwkJLyogU2VlIGlmIHdlIG5lZWQgdG8gc3RhcnQgZ2MuICBJZiB3ZSBkb24ndCwgZ28gdG8gc2xlZXAuCisJCSAgIAorCQkgICBDdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIGEgQkFEIFRISU5HKHRtKS4gIElmIHdlIHRyeSAKKwkJICAgdG8gdW5tb3VudCB0aGUgRlMsIHRoZSB1bm1vdW50IG9wZXJhdGlvbiB3aWxsIHNsZWVwIHdhaXRpbmcKKwkJICAgZm9yIHRoaXMgdGhyZWFkIHRvIGV4aXQuICBXZSBuZWVkIHRvIGFycmFuZ2UgdG8gc2VuZCBpdCBhCisJCSAgIHNpZyBiZWZvcmUgdGhlIHVtb3VudCBwcm9jZXNzIHNsZWVwcy4KKwkJKi8KKworCQlpZiAoIXRocmVhZF9zaG91bGRfd2FrZShjKSkKKwkJCXNldF9jdXJyZW50X3N0YXRlIChUQVNLX0lOVEVSUlVQVElCTEUpOworCQkKKwkJc2NoZWR1bGUoKTsgLyogWWVzLCB3ZSBkbyB0aGlzIGV2ZW4gaWYgd2Ugd2FudCB0byBnbworCQkJCSAgICAgICBvbiBpbW1lZGlhdGVseSAtIHdlJ3JlIGEgbG93IHByaW9yaXR5IAorCQkJCSAgICAgICBiYWNrZ3JvdW5kIHRhc2suICovCisKKwkJLyogUHV0X3N1cGVyIHdpbGwgc2VuZCBhIFNJR0tJTEwgYW5kIHRoZW4gd2FpdCBvbiB0aGUgc2VtLiAKKwkJICovCisJCXdoaWxlIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJc2lnaW5mb190IGluZm87CisJCQl1bnNpZ25lZCBsb25nIHNpZ25yID0gMDsKKworCQkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJCQlzaWduciA9IGRlcXVldWVfc2lnbmFsKGN1cnJlbnQsICZjdXJyZW50LT5ibG9ja2VkLCAmaW5mbyk7CisJCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJCQlzd2l0Y2goc2lnbnIpIHsKKwkJCWNhc2UgU0lHU1RPUDoKKwkJCQlEMShwcmludGsoImpmZnNfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZCgpOiBTSUdTVE9QIHJlY2VpdmVkLlxuIikpOworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfU1RPUFBFRCk7CisJCQkJc2NoZWR1bGUoKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTSUdLSUxMOgorCQkJCUQxKHByaW50aygiamZmc19nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKCk6IFNJR0tJTEwgcmVjZWl2ZWQuXG4iKSk7CisJCQkJYy0+Z2NfdGFzayA9IE5VTEw7CisJCQkJY29tcGxldGVfYW5kX2V4aXQoJmMtPmdjX3RocmVhZF9jb21wLCAwKTsKKwkJCX0KKwkJfQorCisKKwkJRDEocHJpbnRrIChLRVJOX05PVElDRSAiamZmc19nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKCk6IGNvbGxlY3RpbmcuXG4iKSk7CisKKwkJRDMocHJpbnRrIChLRVJOX05PVElDRSAiZ19jX3RocmVhZCgpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwkJZG93bigmZm1jLT5iaWdsb2NrKTsKKwkJCisJCUQxKHByaW50aygiKioqamZmc19nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKCk6IHJvdW5kICMldSwgIgorCQkJICAiZm1jLT5kaXJ0eV9zaXplID0gJXVcbiIsIGkrKywgZm1jLT5kaXJ0eV9zaXplKSk7CisJCUQyKGpmZnNfcHJpbnRfZm1jb250cm9sKGZtYykpOworCisJCWlmICgoZXJhc2VkID0gamZmc190cnlfdG9fZXJhc2UoYykpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkZGUzogRXJyb3IgaW4gIgorCQkJICAgICAgICJnYXJiYWdlIGNvbGxlY3RvcjogJWxkLlxuIiwgZXJhc2VkKTsKKwkJfQorCisJCWlmIChlcmFzZWQpCisJCQlnb3RvIGdjX2VuZDsKKworCQlpZiAoZm1jLT5mcmVlX3NpemUgPT0gMCkgeworCQkJLyogQXJnaC4gTWlnaHQgYXMgd2VsbCBjb21taXQgc3VpY2lkZS4gKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiamZmc19nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKCk6IGZyZWVfc2l6ZSA9PSAwLiBUaGlzIGlzIEJBRC5cbiIpOworCQkJc2VuZF9zaWcoU0lHUVVJVCwgYy0+Z2NfdGFzaywgMSk7CisJCQkvLyBwYW5pYygpCisJCQlnb3RvIGdjX2VuZDsKKwkJfQorCQkKKwkJLyogTGV0J3MgZGFyZSB0byBtYWtlIGEgZ2FyYmFnZSBjb2xsZWN0LiAgKi8KKwkJaWYgKChyZXN1bHQgPSBqZmZzX2dhcmJhZ2VfY29sbGVjdF9uZXh0KGMpKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiSkZGUzogU29tZXRoaW5nICIKKwkJCSAgICAgICAiaGFzIGdvbmUgc2VyaW91c2x5IHdyb25nICIKKwkJCSAgICAgICAid2l0aCBhIGdhcmJhZ2UgY29sbGVjdDogJWRcbiIsIHJlc3VsdCk7CisJCX0KKwkJCisJZ2NfZW5kOgorCQlEMyhwcmludGsgKEtFUk5fTk9USUNFICJnX2NfdGhyZWFkKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwkJdXAoJmZtYy0+YmlnbG9jayk7CisJfSAvKiBmb3IgKDs7KSAqLworfSAvKiBqZmZzX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQoKSAqLwpkaWZmIC0tZ2l0IGEvZnMvamZmcy9pbnRyZXAuaCBiL2ZzL2pmZnMvaW50cmVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlOTdiMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMvaW50cmVwLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIEpGRlMgLS0gSm91cm5hbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgTGludXggaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwICBBeGlzIENvbW11bmljYXRpb25zIEFCLgorICoKKyAqIENyZWF0ZWQgYnkgRmlubiBIYWthbnNzb24gPGZpbm5AYXhpcy5jb20+LgorICoKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICRJZDogaW50cmVwLmgsdiAxLjE0IDIwMDEvMDkvMjMgMjM6Mjg6MzcgZHdtdzIgRXhwICQKKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0pGRlNfSU5UUkVQX0hfXworI2RlZmluZSBfX0xJTlVYX0pGRlNfSU5UUkVQX0hfXworI2luY2x1ZGUgImpmZnNfZm0uaCIKK3N0cnVjdCBqZmZzX25vZGUgKmpmZnNfYWxsb2Nfbm9kZSh2b2lkKTsKK3ZvaWQgamZmc19mcmVlX25vZGUoc3RydWN0IGpmZnNfbm9kZSAqbik7CitpbnQgamZmc19nZXRfbm9kZV9pbnVzZSh2b2lkKTsKKwordm9pZCBqZmZzX2NsZWFudXBfY29udHJvbChzdHJ1Y3QgamZmc19jb250cm9sICpjKTsKK2ludCBqZmZzX2J1aWxkX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworCitpbnQgamZmc19pbnNlcnRfbm9kZShzdHJ1Y3QgamZmc19jb250cm9sICpjLCBzdHJ1Y3QgamZmc19maWxlICpmLAorCQkgICAgIGNvbnN0IHN0cnVjdCBqZmZzX3Jhd19pbm9kZSAqcmF3X2lub2RlLAorCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBqZmZzX25vZGUgKm5vZGUpOworc3RydWN0IGpmZnNfZmlsZSAqamZmc19maW5kX2ZpbGUoc3RydWN0IGpmZnNfY29udHJvbCAqYywgX191MzIgaW5vKTsKK3N0cnVjdCBqZmZzX2ZpbGUgKmpmZnNfZmluZF9jaGlsZChzdHJ1Y3QgamZmc19maWxlICpkaXIsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pOworCit2b2lkIGpmZnNfZnJlZV9ub2RlKHN0cnVjdCBqZmZzX25vZGUgKm5vZGUpOworCitpbnQgamZmc19mb3JlYWNoX2ZpbGUoc3RydWN0IGpmZnNfY29udHJvbCAqYywgaW50ICgqZnVuYykoc3RydWN0IGpmZnNfZmlsZSAqKSk7CitpbnQgamZmc19wb3NzaWJseV9kZWxldGVfZmlsZShzdHJ1Y3QgamZmc19maWxlICpmKTsKK2ludCBqZmZzX2luc2VydF9maWxlX2ludG9fdHJlZShzdHJ1Y3QgamZmc19maWxlICpmKTsKK2ludCBqZmZzX3VubGlua19maWxlX2Zyb21fdHJlZShzdHJ1Y3QgamZmc19maWxlICpmKTsKK2ludCBqZmZzX2ZpbGVfY291bnQoc3RydWN0IGpmZnNfZmlsZSAqZik7CisKK2ludCBqZmZzX3dyaXRlX25vZGUoc3RydWN0IGpmZnNfY29udHJvbCAqYywgc3RydWN0IGpmZnNfbm9kZSAqbm9kZSwKKwkJICAgIHN0cnVjdCBqZmZzX3Jhd19pbm9kZSAqcmF3X2lub2RlLAorCQkgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCQkgICAgaW50IHJlY292ZXJhYmxlLCBzdHJ1Y3QgamZmc19maWxlICpmKTsKK2ludCBqZmZzX3JlYWRfZGF0YShzdHJ1Y3QgamZmc19maWxlICpmLCB1bnNpZ25lZCBjaGFyICpidWYsIF9fdTMyIHJlYWRfb2Zmc2V0LCBfX3UzMiBzaXplKTsKKworLyogR2FyYmFnZSBjb2xsZWN0aW9uIHN0dWZmLiAgKi8KK2ludCBqZmZzX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQodm9pZCAqYyk7Cit2b2lkIGpmZnNfZ2FyYmFnZV9jb2xsZWN0X3RyaWdnZXIoc3RydWN0IGpmZnNfY29udHJvbCAqYyk7CisKKy8qIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuICAqLwordm9pZCBqZmZzX3ByaW50X25vZGUoc3RydWN0IGpmZnNfbm9kZSAqbik7Cit2b2lkIGpmZnNfcHJpbnRfcmF3X2lub2RlKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSAqcmF3X2lub2RlKTsKKyNpZiAwCitpbnQgamZmc19wcmludF9maWxlKHN0cnVjdCBqZmZzX2ZpbGUgKmYpOworI2VuZGlmICAvKiAgMCAgKi8KK3ZvaWQgamZmc19wcmludF9oYXNoX3RhYmxlKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMpOwordm9pZCBqZmZzX3ByaW50X3RyZWUoc3RydWN0IGpmZnNfZmlsZSAqZmlyc3RfZmlsZSwgaW50IGluZGVudCk7CisKKyNlbmRpZiAvKiBfX0xJTlVYX0pGRlNfSU5UUkVQX0hfXyAgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmZnMvamZmc19mbS5jIGIvZnMvamZmcy9qZmZzX2ZtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhYjhkYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMvamZmc19mbS5jCkBAIC0wLDAgKzEsNzk1IEBACisvKgorICogSkZGUyAtLSBKb3VybmFsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBMaW51eCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIuCisgKgorICogQ3JlYXRlZCBieSBGaW5uIEhha2Fuc3NvbiA8ZmlubkBheGlzLmNvbT4uCisgKgorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogJElkOiBqZmZzX2ZtLmMsdiAxLjI3IDIwMDEvMDkvMjAgMTI6Mjk6NDcgZHdtdzIgRXhwICQKKyAqCisgKiBQb3J0ZWQgdG8gTGludXggMi4zLnggYW5kIE1URDoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAgQWxleGFuZGVyIExhcnNzb24gKGFsZXhAY2VuZGlvLnNlKSwgQ2VuZGlvIFN5c3RlbXMgQUIKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvamZmcy5oPgorI2luY2x1ZGUgImpmZnNfZm0uaCIKKworI2lmIGRlZmluZWQoSkZGU19NQVJLX09CU09MRVRFKSAmJiBKRkZTX01BUktfT0JTT0xFVEUKK3N0YXRpYyBpbnQgamZmc19tYXJrX29ic29sZXRlKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jLCBfX3UzMiBmbV9vZmZzZXQpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgamZmc19mbSAqamZmc19hbGxvY19mbSh2b2lkKTsKK3N0YXRpYyB2b2lkIGpmZnNfZnJlZV9mbShzdHJ1Y3QgamZmc19mbSAqbik7CisKK2V4dGVybiBrbWVtX2NhY2hlX3QgICAgICpmbV9jYWNoZTsKK2V4dGVybiBrbWVtX2NhY2hlX3QgICAgICpub2RlX2NhY2hlOworCisvKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBuZXcgc2hpbnkgZmxhc2ggbWVtb3J5IGNvbnRyb2wgc3RydWN0dXJlLiAgKi8KK3N0cnVjdCBqZmZzX2ZtY29udHJvbCAqCitqZmZzX2J1aWxkX2JlZ2luKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMsIGludCB1bml0KQoreworCXN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jOworCXN0cnVjdCBtdGRfaW5mbyAqbXRkOworCQorCUQzKHByaW50aygiamZmc19idWlsZF9iZWdpbigpXG4iKSk7CisJZm1jID0gKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBqZmZzX2ZtY29udHJvbCksCisJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWZtYykgeworCQlEKHByaW50aygiamZmc19idWlsZF9iZWdpbigpOiBBbGxvY2F0aW9uIG9mICIKKwkJCSAic3RydWN0IGpmZnNfZm1jb250cm9sIGZhaWxlZCFcbiIpKTsKKwkJcmV0dXJuIChzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKikwOworCX0KKwlESk0obm9famZmc19mbWNvbnRyb2wrKyk7CisKKwltdGQgPSBnZXRfbXRkX2RldmljZShOVUxMLCB1bml0KTsKKworCWlmICghbXRkKSB7CisJCWtmcmVlKGZtYyk7CisJCURKTShub19qZmZzX2ZtY29udHJvbC0tKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQorCS8qIFJldHJpZXZlIHRoZSBzaXplIG9mIHRoZSBmbGFzaCBtZW1vcnkuICAqLworCWZtYy0+Zmxhc2hfc2l6ZSA9IG10ZC0+c2l6ZTsKKwlEMyhwcmludGsoIiAgZm1jLT5mbGFzaF9zaXplID0gJWQgYnl0ZXNcbiIsIGZtYy0+Zmxhc2hfc2l6ZSkpOworCisJZm1jLT51c2VkX3NpemUgPSAwOworCWZtYy0+ZGlydHlfc2l6ZSA9IDA7CisJZm1jLT5mcmVlX3NpemUgPSBtdGQtPnNpemU7CisJZm1jLT5zZWN0b3Jfc2l6ZSA9IG10ZC0+ZXJhc2VzaXplOworCWZtYy0+bWF4X2NodW5rX3NpemUgPSBmbWMtPnNlY3Rvcl9zaXplID4+IDE7CisJLyogbWluX2ZyZWVfc2l6ZToKKwkgICAxIHNlY3Rvciwgb2J2aW91c2x5LgorCSAgICsgMSB4IG1heF9jaHVua19zaXplLCBmb3Igd2hlbiBhIG5vZGVzIG92ZXJsYXBzIHRoZSBlbmQgb2YgYSBzZWN0b3IKKwkgICArIDEgeCBtYXhfY2h1bmtfc2l6ZSBhZ2Fpbiwgd2hpY2ggb3VnaHQgdG8gYmUgZW5vdWdoIHRvIGhhbmRsZSAKKwkJICAgdGhlIGNhc2Ugd2hlcmUgYSByZW5hbWUgY2F1c2VzIGEgbmFtZSB0byBncm93LCBhbmQgR0MgaGFzCisJCSAgIHRvIHdyaXRlIG91dCBsYXJnZXIgbm9kZXMgdGhhbiB0aGUgb25lcyBpdCdzIG9ic29sZXRpbmcuCisJCSAgIFdlIHNob3VsZCBmaXggaXQgc28gaXQgZG9lc24ndCBoYXZlIHRvIHdyaXRlIHRoZSBuYW1lCisJCSAgIF9ldmVyeV8gdGltZS4gTGF0ZXIuCisJICAgKyBhbm90aGVyIDIgc2VjdG9ycyBiZWNhdXNlIHBlb3BsZSBrZWVwIGdldHRpbmcgR0Mgc3R1Y2sgYW5kCisJICAgICAgICAgICB3ZSBkb24ndCBrbm93IHdoeS4gVGhpcyBzY2FyZXMgbWUgLSBJIHdhbnQgZm9ybWFsIHByb29mCisJCSAgIG9mIGNvcnJlY3RuZXNzIG9mIHdoYXRldmVyIG51bWJlciB3ZSBwdXQgaGVyZS4gZHdtdzIuCisJKi8KKwlmbWMtPm1pbl9mcmVlX3NpemUgPSBmbWMtPnNlY3Rvcl9zaXplIDw8IDI7CisJZm1jLT5tdGQgPSBtdGQ7CisJZm1jLT5jID0gYzsKKwlmbWMtPmhlYWQgPSBOVUxMOworCWZtYy0+dGFpbCA9IE5VTEw7CisJZm1jLT5oZWFkX2V4dHJhID0gTlVMTDsKKwlmbWMtPnRhaWxfZXh0cmEgPSBOVUxMOworCWluaXRfTVVURVgoJmZtYy0+YmlnbG9jayk7CisJcmV0dXJuIGZtYzsKK30KKworCisvKiBXaGVuIHRoZSBmbGFzaCBtZW1vcnkgc2NhbiBoYXMgY29tcGxldGVkLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQKKyAgIGJlZm9yZSB1c2Ugb2YgdGhlIGNvbnRyb2wgc3RydWN0dXJlLiAgKi8KK3ZvaWQKK2pmZnNfYnVpbGRfZW5kKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jKQoreworCUQzKHByaW50aygiamZmc19idWlsZF9lbmQoKVxuIikpOworCisJaWYgKCFmbWMtPmhlYWQpIHsKKwkJZm1jLT5oZWFkID0gZm1jLT5oZWFkX2V4dHJhOworCQlmbWMtPnRhaWwgPSBmbWMtPnRhaWxfZXh0cmE7CisJfQorCWVsc2UgaWYgKGZtYy0+aGVhZF9leHRyYSkgeworCQlmbWMtPnRhaWxfZXh0cmEtPm5leHQgPSBmbWMtPmhlYWQ7CisJCWZtYy0+aGVhZC0+cHJldiA9IGZtYy0+dGFpbF9leHRyYTsKKwkJZm1jLT5oZWFkID0gZm1jLT5oZWFkX2V4dHJhOworCX0KKwlmbWMtPmhlYWRfZXh0cmEgPSBOVUxMOyAvKiBUaGVzZSB0d28gaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBvbWl0dGVkLiAgKi8KKwlmbWMtPnRhaWxfZXh0cmEgPSBOVUxMOworCUQzKGpmZnNfcHJpbnRfZm1jb250cm9sKGZtYykpOworfQorCisKKy8qIENhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSBmaWxlIHN5c3RlbSBpcyB1bm1vdW50ZWQuICBUaGlzIGZ1bmN0aW9uCisgICBmcmVlcyBhbGwgbWVtb3J5IHVzZWQgYnkgdGhpcyBtb2R1bGUuICAqLwordm9pZAoramZmc19jbGVhbnVwX2ZtY29udHJvbChzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYykKK3sKKwlpZiAoZm1jKSB7CisJCXN0cnVjdCBqZmZzX2ZtICpuZXh0ID0gZm1jLT5oZWFkOworCQl3aGlsZSAobmV4dCkgeworCQkJc3RydWN0IGpmZnNfZm0gKmN1ciA9IG5leHQ7CisJCQluZXh0ID0gbmV4dC0+bmV4dDsKKwkJCWpmZnNfZnJlZV9mbShjdXIpOworCQl9CisJCXB1dF9tdGRfZGV2aWNlKGZtYy0+bXRkKTsKKwkJa2ZyZWUoZm1jKTsKKwkJREpNKG5vX2pmZnNfZm1jb250cm9sLS0pOworCX0KK30KKworCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGZpcnN0IGNodW5rIG9mIGZyZWUgc3BhY2Ugb24gdGhlCisgICBmbGFzaCBtZW1vcnkuICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHNvbWV0aGluZyBub256ZXJvIGlmIHRoZSBmbGFzaAorICAgbWVtb3J5IGNvbnRhaW5zIGFueSBmcmVlIHNwYWNlLiAgKi8KK19fdTMyCitqZmZzX2ZyZWVfc2l6ZTEoc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMpCit7CisJX191MzIgaGVhZDsKKwlfX3UzMiB0YWlsOworCV9fdTMyIGVuZCA9IGZtYy0+Zmxhc2hfc2l6ZTsKKworCWlmICghZm1jLT5oZWFkKSB7CisJCS8qIFRoZXJlIGlzIG5vdGhpbmcgb24gdGhlIGZsYXNoLiAgKi8KKwkJcmV0dXJuIGZtYy0+Zmxhc2hfc2l6ZTsKKwl9CisKKwkvKiBDb21wdXRlIHRoZSBiZWdpbm5pbmcgYW5kIGVuZGluZyBvZiB0aGUgY29udGVudHMgb2YgdGhlIGZsYXNoLiAgKi8KKwloZWFkID0gZm1jLT5oZWFkLT5vZmZzZXQ7CisJdGFpbCA9IGZtYy0+dGFpbC0+b2Zmc2V0ICsgZm1jLT50YWlsLT5zaXplOworCWlmICh0YWlsID09IGVuZCkgeworCQl0YWlsID0gMDsKKwl9CisJQVNTRVJUKGVsc2UgaWYgKHRhaWwgPiBlbmQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmc19mcmVlX3NpemUxKCk6IHRhaWwgPiBlbmRcbiIpOworCQl0YWlsID0gMDsKKwl9KTsKKworCWlmIChoZWFkIDw9IHRhaWwpIHsKKwkJcmV0dXJuIGVuZCAtIHRhaWw7CisJfQorCWVsc2UgeworCQlyZXR1cm4gaGVhZCAtIHRhaWw7CisJfQorfQorCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHNvbWV0aGluZyBub256ZXJvIGluIGNhc2UgdGhlcmUgYXJlIHR3byBmcmVlCisgICBhcmVhcyBvbiB0aGUgZmxhc2guICBMaWtlIHRoaXM6CisKKyAgICAgKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgICAgIHwgICAgIEZSRUUgMSAgICAgfCAgIFVTRUQgLyBESVJUWSAgIHwgICAgIEZSRUUgMiAgICAgfAorICAgICArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICBmbWMtPmhlYWQgLS0tLS1eCisgICAgICAgZm1jLT50YWlsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLV4KKworICAgVGhlIHZhbHVlIHJldHVybmVkLCB3aWxsIGJlIHRoZSBzaXplIG9mIHRoZSBmaXJzdCBlbXB0eSBhcmVhIG9uIHRoZQorICAgZmxhc2gsIGluIHRoaXMgY2FzZSBtYXJrZWQgIkZSRUUgMSIuICAqLworX191MzIKK2pmZnNfZnJlZV9zaXplMihzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYykKK3sKKwlpZiAoZm1jLT5oZWFkKSB7CisJCV9fdTMyIGhlYWQgPSBmbWMtPmhlYWQtPm9mZnNldDsKKwkJX191MzIgdGFpbCA9IGZtYy0+dGFpbC0+b2Zmc2V0ICsgZm1jLT50YWlsLT5zaXplOworCQlpZiAodGFpbCA9PSBmbWMtPmZsYXNoX3NpemUpIHsKKwkJCXRhaWwgPSAwOworCQl9CisKKwkJaWYgKHRhaWwgPj0gaGVhZCkgeworCQkJcmV0dXJuIGhlYWQ7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogQWxsb2NhdGUgYSBjaHVuayBvZiBmbGFzaCBtZW1vcnkuICBJZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2Ugb24gdGhlCisgICBkZXZpY2UsIGEgcmVmZXJlbmNlIHRvIHRoZSBhc3NvY2lhdGVkIG5vZGUgaXMgc3RvcmVkIGluIHRoZSBqZmZzX2ZtCisgICBzdHJ1Y3QuICAqLworaW50CitqZmZzX2ZtYWxsb2Moc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMsIF9fdTMyIHNpemUsIHN0cnVjdCBqZmZzX25vZGUgKm5vZGUsCisJICAgICBzdHJ1Y3QgamZmc19mbSAqKnJlc3VsdCkKK3sKKwlzdHJ1Y3QgamZmc19mbSAqZm07CisJX191MzIgZnJlZV9jaHVua19zaXplMTsKKwlfX3UzMiBmcmVlX2NodW5rX3NpemUyOworCisJRDIocHJpbnRrKCJqZmZzX2ZtYWxsb2MoKTogZm1jID0gMHglcCwgc2l6ZSA9ICVkLCAiCisJCSAgIm5vZGUgPSAweCVwXG4iLCBmbWMsIHNpemUsIG5vZGUpKTsKKworCSpyZXN1bHQgPSBOVUxMOworCisJaWYgKCEoZm0gPSBqZmZzX2FsbG9jX2ZtKCkpKSB7CisJCUQocHJpbnRrKCJqZmZzX2ZtYWxsb2MoKToga21hbGxvYygpIGZhaWxlZCEgKGZtKVxuIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmcmVlX2NodW5rX3NpemUxID0gamZmc19mcmVlX3NpemUxKGZtYyk7CisJZnJlZV9jaHVua19zaXplMiA9IGpmZnNfZnJlZV9zaXplMihmbWMpOworCWlmIChmcmVlX2NodW5rX3NpemUxICsgZnJlZV9jaHVua19zaXplMiAhPSBmbWMtPmZyZWVfc2l6ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJGcmVlIHNpemUgYWNjb3VudGluZyBzY3Jld2VkXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZnJlZV9jaHVua19zaXplMSA9PSAweCV4LCBmcmVlX2NodW5rX3NpemUyID09IDB4JXgsIGZtYy0+ZnJlZV9zaXplID09IDB4JXhcbiIsIGZyZWVfY2h1bmtfc2l6ZTEsIGZyZWVfY2h1bmtfc2l6ZTIsIGZtYy0+ZnJlZV9zaXplKTsKKwl9CisKKwlEMyhwcmludGsoImpmZnNfZm1hbGxvYygpOiBmcmVlX2NodW5rX3NpemUxID0gJXUsICIKKwkJICAiZnJlZV9jaHVua19zaXplMiA9ICV1XG4iLAorCQkgIGZyZWVfY2h1bmtfc2l6ZTEsIGZyZWVfY2h1bmtfc2l6ZTIpKTsKKworCWlmIChzaXplIDw9IGZyZWVfY2h1bmtfc2l6ZTEpIHsKKwkJaWYgKCEoZm0tPm5vZGVzID0gKHN0cnVjdCBqZmZzX25vZGVfcmVmICopCisJCQkJICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgamZmc19ub2RlX3JlZiksCisJCQkJCSAgR0ZQX0tFUk5FTCkpKSB7CisJCQlEKHByaW50aygiamZmc19mbWFsbG9jKCk6IGttYWxsb2MoKSBmYWlsZWQhICIKKwkJCQkgIihub2RlX3JlZilcbiIpKTsKKwkJCWpmZnNfZnJlZV9mbShmbSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlESk0obm9famZmc19ub2RlX3JlZisrKTsKKwkJZm0tPm5vZGVzLT5ub2RlID0gbm9kZTsKKwkJZm0tPm5vZGVzLT5uZXh0ID0gTlVMTDsKKwkJaWYgKGZtYy0+dGFpbCkgeworCQkJZm0tPm9mZnNldCA9IGZtYy0+dGFpbC0+b2Zmc2V0ICsgZm1jLT50YWlsLT5zaXplOworCQkJaWYgKGZtLT5vZmZzZXQgPT0gZm1jLT5mbGFzaF9zaXplKSB7CisJCQkJZm0tPm9mZnNldCA9IDA7CisJCQl9CisJCQlBU1NFUlQoZWxzZSBpZiAoZm0tPm9mZnNldCA+IGZtYy0+Zmxhc2hfc2l6ZSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnNfZm1hbGxvYygpOiAiCisJCQkJICAgICAgICJvZmZzZXQgPiBmbGFzaF9lbmRcbiIpOworCQkJCWZtLT5vZmZzZXQgPSAwOworCQkJfSk7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBUaGVyZSBkb24ndCBoYXZlIHRvIGJlIGZpbGVzIGluIHRoZSBmaWxlCisJCQkgICBzeXN0ZW0geWV0LiAgKi8KKwkJCWZtLT5vZmZzZXQgPSAwOworCQl9CisJCWZtLT5zaXplID0gc2l6ZTsKKwkJZm1jLT5mcmVlX3NpemUgLT0gc2l6ZTsKKwkJZm1jLT51c2VkX3NpemUgKz0gc2l6ZTsKKwl9CisJZWxzZSBpZiAoc2l6ZSA+IGZyZWVfY2h1bmtfc2l6ZTIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkZGUzogVHJpZWQgdG8gYWxsb2NhdGUgYSB0b28gIgorCQkgICAgICAgImxhcmdlIGZsYXNoIG1lbW9yeSBjaHVuay4gKHNpemUgPSAldSlcbiIsIHNpemUpOworCQlqZmZzX2ZyZWVfZm0oZm0pOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisJZWxzZSB7CisJCWZtLT5vZmZzZXQgPSBmbWMtPnRhaWwtPm9mZnNldCArIGZtYy0+dGFpbC0+c2l6ZTsKKwkJZm0tPnNpemUgPSBmcmVlX2NodW5rX3NpemUxOworCQlmbS0+bm9kZXMgPSBOVUxMOworCQlmbWMtPmZyZWVfc2l6ZSAtPSBmbS0+c2l6ZTsKKwkJZm1jLT5kaXJ0eV9zaXplICs9IGZtLT5zaXplOyAvKiBDaGFuZ2VkIGJ5IHNpbW9uay4gVGhpcyBzZWVtaW5nbHkgZml4ZXMgYSAKKwkJCQkJCWJ1ZyB0aGF0IGNhdXNlZCBpbmZpbml0ZSBnYXJiYWdlIGNvbGxlY3Rpb24uCisJCQkJCQlJdCBwcmV2aW91c2x5IHNldCBmbWMtPmRpcnR5X3NpemUgdG8gc2l6ZSAod2hpY2ggaXMgdGhlCisJCQkJCQlzaXplIG9mIHRoZSByZXF1ZXN0ZWQgY2h1bmspLgorCQkJCQkgICAgICovCisJfQorCisJZm0tPm5leHQgPSBOVUxMOworCWlmICghZm1jLT5oZWFkKSB7CisJCWZtLT5wcmV2ID0gTlVMTDsKKwkJZm1jLT5oZWFkID0gZm07CisJCWZtYy0+dGFpbCA9IGZtOworCX0KKwllbHNlIHsKKwkJZm0tPnByZXYgPSBmbWMtPnRhaWw7CisJCWZtYy0+dGFpbC0+bmV4dCA9IGZtOworCQlmbWMtPnRhaWwgPSBmbTsKKwl9CisKKwlEMyhqZmZzX3ByaW50X2ZtY29udHJvbChmbWMpKTsKKwlEMyhqZmZzX3ByaW50X2ZtKGZtKSk7CisJKnJlc3VsdCA9IGZtOworCXJldHVybiAwOworfQorCisKKy8qIFRoZSBvbi1mbGFzaCBzcGFjZSBpcyBub3QgbmVlZGVkIGFueW1vcmUgYnkgdGhlIHBhc3NlZCBub2RlLiAgUmVtb3ZlCisgICB0aGUgcmVmZXJlbmNlIHRvIHRoZSBub2RlIGZyb20gdGhlIG5vZGUgbGlzdC4gIElmIHRoZSBkYXRhIGNodW5rIGluCisgICB0aGUgZmxhc2ggbWVtb3J5IGlzbid0IHVzZWQgYnkgYW55IG1vcmUgbm9kZXMgYW55bW9yZSAoZm0tPm5vZGVzID09IDApLAorICAgdGhlbiBtYXJrIHRoYXQgY2h1bmsgYXMgZGlydHkuICAqLworaW50CitqZmZzX2ZtZnJlZShzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYywgc3RydWN0IGpmZnNfZm0gKmZtLCBzdHJ1Y3QgamZmc19ub2RlICpub2RlKQoreworCXN0cnVjdCBqZmZzX25vZGVfcmVmICpyZWY7CisJc3RydWN0IGpmZnNfbm9kZV9yZWYgKnByZXY7CisJQVNTRVJUKGludCBkZWwgPSAwKTsKKworCUQyKHByaW50aygiamZmc19mbWZyZWUoKTogbm9kZS0+aW5vID0gJXUsIG5vZGUtPnZlcnNpb24gPSAldVxuIiwKKwkJIG5vZGUtPmlubywgbm9kZS0+dmVyc2lvbikpOworCisJQVNTRVJUKGlmICghZm1jIHx8ICFmbSB8fCAhZm0tPm5vZGVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiamZmc19mbWZyZWUoKTogZm1jOiAweCVwLCBmbTogMHglcCwgIgorCQkgICAgICAgImZtLT5ub2RlczogMHglcFxuIiwKKwkJICAgICAgIGZtYywgZm0sIChmbSA/IGZtLT5ub2RlcyA6IE5VTEwpKTsKKwkJcmV0dXJuIC0xOworCX0pOworCisJLyogRmluZCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBub2RlIHRoYXQgaXMgZ29pbmcgdG8gYmUgcmVtb3ZlZAorCSAgIGFuZCByZW1vdmUgaXQuICAqLworCWZvciAocmVmID0gZm0tPm5vZGVzLCBwcmV2ID0gTlVMTDsgcmVmOyByZWYgPSByZWYtPm5leHQpIHsKKwkJaWYgKHJlZi0+bm9kZSA9PSBub2RlKSB7CisJCQlpZiAocHJldikgeworCQkJCXByZXYtPm5leHQgPSByZWYtPm5leHQ7CisJCQl9CisJCQllbHNlIHsKKwkJCQlmbS0+bm9kZXMgPSByZWYtPm5leHQ7CisJCQl9CisJCQlrZnJlZShyZWYpOworCQkJREpNKG5vX2pmZnNfbm9kZV9yZWYtLSk7CisJCQlBU1NFUlQoZGVsID0gMSk7CisJCQlicmVhazsKKwkJfQorCQlwcmV2ID0gcmVmOworCX0KKworCS8qIElmIHRoZSBkYXRhIGNodW5rIGluIHRoZSBmbGFzaCBtZW1vcnkgaXNuJ3QgdXNlZCBhbnltb3JlCisJICAganVzdCBtYXJrIGl0IGFzIG9ic29sZXRlLiAgKi8KKwlpZiAoIWZtLT5ub2RlcykgeworCQkvKiBObyBub2RlIHVzZXMgdGhpcyBjaHVuayBzbyBsZXQncyByZW1vdmUgaXQuICAqLworCQlmbWMtPnVzZWRfc2l6ZSAtPSBmbS0+c2l6ZTsKKwkJZm1jLT5kaXJ0eV9zaXplICs9IGZtLT5zaXplOworI2lmIGRlZmluZWQoSkZGU19NQVJLX09CU09MRVRFKSAmJiBKRkZTX01BUktfT0JTT0xFVEUKKwkJaWYgKGpmZnNfbWFya19vYnNvbGV0ZShmbWMsIGZtLT5vZmZzZXQpIDwgMCkgeworCQkJRDEocHJpbnRrKCJqZmZzX2ZtZnJlZSgpOiBGYWlsZWQgdG8gbWFyayBhbiBvbi1mbGFzaCAiCisJCQkJICAibm9kZSBvYnNvbGV0ZSFcbiIpKTsKKwkJCXJldHVybiAtMTsKKwkJfQorI2VuZGlmCisJfQorCisJQVNTRVJUKGlmICghZGVsKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIioqKmpmZnNfZm1mcmVlKCk6ICIKKwkJICAgICAgICJEaWRuJ3QgZGVsZXRlIGFueSBub2RlIHJlZmVyZW5jZSFcbiIpOworCX0pOworCisJcmV0dXJuIDA7Cit9CisKKworLyogVGhpcyBhbGxvY2F0aW9uIGZ1bmN0aW9uIGlzIHVzZWQgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBvZgorICAgdGhlIGZpbGUgc3lzdGVtLiAgKi8KK3N0cnVjdCBqZmZzX2ZtICoKK2pmZnNfZm1hbGxvY2VkKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jLCBfX3UzMiBvZmZzZXQsIF9fdTMyIHNpemUsCisJICAgICAgIHN0cnVjdCBqZmZzX25vZGUgKm5vZGUpCit7CisJc3RydWN0IGpmZnNfZm0gKmZtOworCisJRDMocHJpbnRrKCJqZmZzX2ZtYWxsb2NlZCgpXG4iKSk7CisKKwlpZiAoIShmbSA9IGpmZnNfYWxsb2NfZm0oKSkpIHsKKwkJRChwcmludGsoImpmZnNfZm1hbGxvY2VkKDB4JXAsICV1LCAldSwgMHglcCk6IGZhaWxlZCFcbiIsCisJCQkgZm1jLCBvZmZzZXQsIHNpemUsIG5vZGUpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWZtLT5vZmZzZXQgPSBvZmZzZXQ7CisJZm0tPnNpemUgPSBzaXplOworCWZtLT5wcmV2ID0gTlVMTDsKKwlmbS0+bmV4dCA9IE5VTEw7CisJZm0tPm5vZGVzID0gTlVMTDsKKwlpZiAobm9kZSkgeworCQkvKiBgbm9kZScgZXhpc3RzIGFuZCBpdCBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZQorCQkgICAgamZmc19mbSBzdHJ1Y3R1cmUgYGZtJy4gICovCisJCWlmICghKGZtLT5ub2RlcyA9IChzdHJ1Y3QgamZmc19ub2RlX3JlZiAqKQorCQkJCSAga21hbGxvYyhzaXplb2Yoc3RydWN0IGpmZnNfbm9kZV9yZWYpLAorCQkJCQkgIEdGUF9LRVJORUwpKSkgeworCQkJRChwcmludGsoImpmZnNfZm1hbGxvY2VkKCk6ICFmbS0+bm9kZXNcbiIpKTsKKwkJCWpmZnNfZnJlZV9mbShmbSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlESk0obm9famZmc19ub2RlX3JlZisrKTsKKwkJZm0tPm5vZGVzLT5ub2RlID0gbm9kZTsKKwkJZm0tPm5vZGVzLT5uZXh0ID0gTlVMTDsKKwkJZm1jLT51c2VkX3NpemUgKz0gc2l6ZTsKKwkJZm1jLT5mcmVlX3NpemUgLT0gc2l6ZTsKKwl9CisJZWxzZSB7CisJCS8qIElmIHRoZXJlIGlzIG5vIG5vZGUsIHRoZW4gdGhpcyBpcyBqdXN0IGEgY2h1bmsgb2YgZGlydC4gICovCisJCWZtYy0+ZGlydHlfc2l6ZSArPSBzaXplOworCQlmbWMtPmZyZWVfc2l6ZSAtPSBzaXplOworCX0KKworCWlmIChmbWMtPmhlYWRfZXh0cmEpIHsKKwkJZm0tPnByZXYgPSBmbWMtPnRhaWxfZXh0cmE7CisJCWZtYy0+dGFpbF9leHRyYS0+bmV4dCA9IGZtOworCQlmbWMtPnRhaWxfZXh0cmEgPSBmbTsKKwl9CisJZWxzZSBpZiAoIWZtYy0+aGVhZCkgeworCQlmbWMtPmhlYWQgPSBmbTsKKwkJZm1jLT50YWlsID0gZm07CisJfQorCWVsc2UgaWYgKGZtYy0+dGFpbC0+b2Zmc2V0ICsgZm1jLT50YWlsLT5zaXplIDwgb2Zmc2V0KSB7CisJCWZtYy0+aGVhZF9leHRyYSA9IGZtOworCQlmbWMtPnRhaWxfZXh0cmEgPSBmbTsKKwl9CisJZWxzZSB7CisJCWZtLT5wcmV2ID0gZm1jLT50YWlsOworCQlmbWMtPnRhaWwtPm5leHQgPSBmbTsKKwkJZm1jLT50YWlsID0gZm07CisJfQorCUQzKGpmZnNfcHJpbnRfZm1jb250cm9sKGZtYykpOworCUQzKGpmZnNfcHJpbnRfZm0oZm0pKTsKKwlyZXR1cm4gZm07Cit9CisKKworLyogQWRkIGEgbmV3IG5vZGUgdG8gYW4gYWxyZWFkeSBleGlzdGluZyBqZmZzX2ZtIHN0cnVjdC4gICovCitpbnQKK2pmZnNfYWRkX25vZGUoc3RydWN0IGpmZnNfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgamZmc19ub2RlX3JlZiAqcmVmOworCisJRDMocHJpbnRrKCJqZmZzX2FkZF9ub2RlKCk6IGlubyA9ICV1XG4iLCBub2RlLT5pbm8pKTsKKworCXJlZiA9IChzdHJ1Y3QgamZmc19ub2RlX3JlZiAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBqZmZzX25vZGVfcmVmKSwKKwkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZWYpCisJCXJldHVybiAtRU5PTUVNOworCisJREpNKG5vX2pmZnNfbm9kZV9yZWYrKyk7CisJcmVmLT5ub2RlID0gbm9kZTsKKwlyZWYtPm5leHQgPSBub2RlLT5mbS0+bm9kZXM7CisJbm9kZS0+Zm0tPm5vZGVzID0gcmVmOworCXJldHVybiAwOworfQorCisKKy8qIEZyZWUgYSBwYXJ0IG9mIHNvbWUgYWxsb2NhdGVkIHNwYWNlLiAgKi8KK3ZvaWQKK2pmZnNfZm1mcmVlX3BhcnRseShzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYywgc3RydWN0IGpmZnNfZm0gKmZtLCBfX3UzMiBzaXplKQoreworCUQxKHByaW50aygiKioqamZmc19mbWZyZWVfcGFydGx5KCk6IGZtID0gMHglcCwgZm0tPm5vZGVzID0gMHglcCwgIgorCQkgICJmbS0+bm9kZXMtPm5vZGUtPmlubyA9ICV1LCBzaXplID0gJXVcbiIsCisJCSAgZm0sIChmbSA/IGZtLT5ub2RlcyA6IDApLAorCQkgICghZm0gPyAwIDogKCFmbS0+bm9kZXMgPyAwIDogZm0tPm5vZGVzLT5ub2RlLT5pbm8pKSwgc2l6ZSkpOworCisJaWYgKGZtLT5ub2RlcykgeworCQlrZnJlZShmbS0+bm9kZXMpOworCQlESk0obm9famZmc19ub2RlX3JlZi0tKTsKKwkJZm0tPm5vZGVzID0gTlVMTDsKKwl9CisJZm1jLT51c2VkX3NpemUgLT0gZm0tPnNpemU7CisJaWYgKGZtID09IGZtYy0+dGFpbCkgeworCQlmbS0+c2l6ZSAtPSBzaXplOworCQlmbWMtPmZyZWVfc2l6ZSArPSBzaXplOworCX0KKwlmbWMtPmRpcnR5X3NpemUgKz0gZm0tPnNpemU7Cit9CisKKworLyogRmluZCB0aGUgamZmc19mbSBzdHJ1Y3QgdGhhdCBjb250YWlucyB0aGUgZW5kIG9mIHRoZSBkYXRhIGNodW5rIHRoYXQKKyAgIGJlZ2lucyBhdCB0aGUgbG9naWNhbCBiZWdpbm5pbmcgb2YgdGhlIGZsYXNoIG1lbW9yeSBhbmQgc3BhbnMgYHNpemUnCisgICBieXRlcy4gIElmIHdlIHdhbnQgdG8gZXJhc2UgYSBzZWN0b3Igb2YgdGhlIGZsYXNoIG1lbW9yeSwgd2UgdXNlIHRoaXMKKyAgIGZ1bmN0aW9uIHRvIGZpbmQgd2hlcmUgdGhlIHNlY3RvciBsaW1pdCBjdXRzIGEgY2h1bmsgb2YgZGF0YS4gICovCitzdHJ1Y3QgamZmc19mbSAqCitqZmZzX2N1dF9ub2RlKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jLCBfX3UzMiBzaXplKQoreworCXN0cnVjdCBqZmZzX2ZtICpmbTsKKwlfX3UzMiBwb3MgPSAwOworCisJaWYgKHNpemUgPT0gMCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlBU1NFUlQoaWYgKCFmbWMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJqZmZzX2N1dF9ub2RlKCk6IGZtYyA9PSBOVUxMXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfSk7CisKKwlmbSA9IGZtYy0+aGVhZDsKKworCXdoaWxlIChmbSkgeworCQlwb3MgKz0gZm0tPnNpemU7CisJCWlmIChwb3MgPCBzaXplKSB7CisJCQlmbSA9IGZtLT5uZXh0OworCQl9CisJCWVsc2UgaWYgKHBvcyA+IHNpemUpIHsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UgeworCQkJZm0gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gZm07Cit9CisKKworLyogTW92ZSB0aGUgaGVhZCBvZiB0aGUgZm1jIHN0cnVjdHVyZXMgYW5kIGRlbGV0ZSB0aGUgb2Jzb2xldGUgcGFydHMuICAqLwordm9pZAoramZmc19zeW5jX2VyYXNlKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jLCBpbnQgZXJhc2VkX3NpemUpCit7CisJc3RydWN0IGpmZnNfZm0gKmZtOworCXN0cnVjdCBqZmZzX2ZtICpkZWw7CisKKwlBU1NFUlQoaWYgKCFmbWMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJqZmZzX3N5bmNfZXJhc2UoKTogZm1jID09IE5VTExcbiIpOworCQlyZXR1cm47CisJfSk7CisKKwlmbWMtPmRpcnR5X3NpemUgLT0gZXJhc2VkX3NpemU7CisJZm1jLT5mcmVlX3NpemUgKz0gZXJhc2VkX3NpemU7CisKKwlmb3IgKGZtID0gZm1jLT5oZWFkOyBmbSAmJiAoZXJhc2VkX3NpemUgPiAwKTspIHsKKwkJaWYgKGVyYXNlZF9zaXplID49IGZtLT5zaXplKSB7CisJCQllcmFzZWRfc2l6ZSAtPSBmbS0+c2l6ZTsKKwkJCWRlbCA9IGZtOworCQkJZm0gPSBmbS0+bmV4dDsKKwkJCWZtLT5wcmV2ID0gTlVMTDsKKwkJCWZtYy0+aGVhZCA9IGZtOworCQkJamZmc19mcmVlX2ZtKGRlbCk7CisJCX0KKwkJZWxzZSB7CisJCQlmbS0+c2l6ZSAtPSBlcmFzZWRfc2l6ZTsKKwkJCWZtLT5vZmZzZXQgKz0gZXJhc2VkX3NpemU7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworCisvKiBSZXR1cm4gdGhlIG9sZGVzdCB1c2VkIG5vZGUgaW4gdGhlIGZsYXNoIG1lbW9yeS4gICovCitzdHJ1Y3QgamZmc19ub2RlICoKK2pmZnNfZ2V0X29sZGVzdF9ub2RlKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jKQoreworCXN0cnVjdCBqZmZzX2ZtICpmbTsKKwlzdHJ1Y3QgamZmc19ub2RlX3JlZiAqbnJlZjsKKwlzdHJ1Y3QgamZmc19ub2RlICpub2RlID0gTlVMTDsKKworCUFTU0VSVChpZiAoIWZtYykgeworCQlwcmludGsoS0VSTl9FUlIgImpmZnNfZ2V0X29sZGVzdF9ub2RlKCk6IGZtYyA9PSBOVUxMXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfSk7CisKKwlmb3IgKGZtID0gZm1jLT5oZWFkOyBmbSAmJiAhZm0tPm5vZGVzOyBmbSA9IGZtLT5uZXh0KTsKKworCWlmICghZm0pIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogVGhlIG9sZGVzdCBub2RlIGlzIHRoZSBsYXN0IG9uZSBpbiB0aGUgcmVmZXJlbmNlIGxpc3QuICBUaGlzIGxpc3QKKwkgICBzaG91bGRuJ3QgYmUgdG9vIGxvbmc7IGp1c3Qgb25lIG9yIHBlcmhhcHMgdHdvIGVsZW1lbnRzLiAgKi8KKwlmb3IgKG5yZWYgPSBmbS0+bm9kZXM7IG5yZWY7IG5yZWYgPSBucmVmLT5uZXh0KSB7CisJCW5vZGUgPSBucmVmLT5ub2RlOworCX0KKworCUQyKHByaW50aygiamZmc19nZXRfb2xkZXN0X25vZGUoKTogaW5vID0gJXUsIHZlcnNpb24gPSAldVxuIiwKKwkJICAobm9kZSA/IG5vZGUtPmlubyA6IDApLCAobm9kZSA/IG5vZGUtPnZlcnNpb24gOiAwKSkpOworCisJcmV0dXJuIG5vZGU7Cit9CisKKworI2lmIGRlZmluZWQoSkZGU19NQVJLX09CU09MRVRFKSAmJiBKRkZTX01BUktfT0JTT0xFVEUKKworLyogTWFyayBhbiBvbi1mbGFzaCBub2RlIGFzIG9ic29sZXRlLgorCisgICBOb3RlIHRoYXQgdGhpcyBpcyBqdXN0IGFuIG9wdGltaXphdGlvbiB0aGF0IGlzbid0IG5lY2Vzc2FyeSBmb3IgdGhlCisgICBmaWxlc3lzdGVtIHRvIHdvcmsuICAqLworCitzdGF0aWMgaW50CitqZmZzX21hcmtfb2Jzb2xldGUoc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMsIF9fdTMyIGZtX29mZnNldCkKK3sKKwkvKiBUaGUgYGFjY3VyYXRlX3BvcycgaG9sZHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBhY2N1cmF0ZSBieXRlCisJICAgaW4gdGhlIGpmZnNfcmF3X2lub2RlIHN0cnVjdHVyZSB0aGF0IHdlIGFyZSBnb2luZyB0byBtYXJrCisJICAgYXMgb2Jzb2xldGUuICAqLworCV9fdTMyIGFjY3VyYXRlX3BvcyA9IGZtX29mZnNldCArIEpGRlNfUkFXX0lOT0RFX0FDQ1VSQVRFX09GRlNFVDsKKwl1bnNpZ25lZCBjaGFyIHplcm8gPSAweDAwOworCXNpemVfdCBsZW47CisKKwlEMyhwcmludGsoImpmZnNfbWFya19vYnNvbGV0ZSgpOiBhY2N1cmF0ZV9wb3MgPSAldVxuIiwgYWNjdXJhdGVfcG9zKSk7CisJQVNTRVJUKGlmICghZm1jKSB7CisJCXByaW50ayhLRVJOX0VSUiAiamZmc19tYXJrX29ic29sZXRlKCk6IGZtYyA9PSBOVUxMXG4iKTsKKwkJcmV0dXJuIC0xOworCX0pOworCisJLyogV3JpdGUgMHgwMCB0byB0aGUgcmF3IGlub2RlJ3MgYWNjdXJhdGUgbWVtYmVyLiAgRG9uJ3QgY2FyZQorCSAgIGFib3V0IHRoZSByZXR1cm4gdmFsdWUuICAqLworCU1URF9XUklURShmbWMtPm10ZCwgYWNjdXJhdGVfcG9zLCAxLCAmbGVuLCAmemVybyk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBKRkZTX01BUktfT0JTT0xFVEUgICovCisKKy8qIGNoZWNrIGlmIGl0J3MgcG9zc2libGUgdG8gZXJhc2UgdGhlIHdhbnRlZCByYW5nZSwgYW5kIGlmIG5vdCwgcmV0dXJuCisgKiB0aGUgcmFuZ2UgdGhhdCBJUyBlcmFzYWJsZSwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgbG9uZworamZmc19mbGFzaF9lcmFzYWJsZV9zaXplKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBfX3UzMiBvZmZzZXQsIF9fdTMyIHNpemUpCit7CisgICAgICAgICB1X2xvbmcgc3NpemU7CisKKwkvKiBhc3N1bWUgdGhhdCBzZWN0b3Igc2l6ZSBmb3IgYSBwYXJ0aXRpb24gaXMgY29uc3RhbnQgZXZlbgorCSAqIGlmIGl0IHNwYW5zIG1vcmUgdGhhbiBvbmUgY2hpcCAoeW91IHVzdWFsbHkgcHV0IHRoZSBzYW1lCisJICogdHlwZSBvZiBjaGlwcyBpbiBhIHN5c3RlbSkKKwkgKi8KKworICAgICAgICBzc2l6ZSA9IG10ZC0+ZXJhc2VzaXplOworCisJaWYgKG9mZnNldCAlIHNzaXplKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnNfZmxhc2hfZXJhc2FibGVfc2l6ZSgpIGdpdmVuIG5vbi1hbGlnbmVkIG9mZnNldCAleCAoZXJhc2VzaXplICVseClcbiIsIG9mZnNldCwgc3NpemUpOworCQkvKiBUaGUgb2Zmc2V0IGlzIG5vdCBzZWN0b3Igc2l6ZSBhbGlnbmVkLiAgKi8KKwkJcmV0dXJuIC0xOworCX0KKwllbHNlIGlmIChvZmZzZXQgPiBtdGQtPnNpemUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmc19mbGFzaF9lcmFzYWJsZV9zaXplIGdpdmVuIG9mZnNldCBvZmYgdGhlIGVuZCBvZiBkZXZpY2UgKCV4ID4gJXgpXG4iLCBvZmZzZXQsIG10ZC0+c2l6ZSk7CisJCXJldHVybiAtMjsKKwl9CisJZWxzZSBpZiAob2Zmc2V0ICsgc2l6ZSA+IG10ZC0+c2l6ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzX2ZsYXNoX2VyYXNhYmxlX3NpemUoKSBnaXZlbiBsZW5ndGggd2hpY2ggcnVucyBvZmYgdGhlIGVuZCBvZiBkZXZpY2UgKG9mcyAleCArIGxlbiAleCA9ICV4LCA+ICV4KVxuIiwgb2Zmc2V0LHNpemUsIG9mZnNldCtzaXplLCBtdGQtPnNpemUpOworCQlyZXR1cm4gLTM7CisJfQorCisJcmV0dXJuIChzaXplIC8gc3NpemUpICogc3NpemU7Cit9CisKKworLyogSG93IG11Y2ggZGlydHkgZmxhc2ggbWVtb3J5IGlzIHBvc3NpYmxlIHRvIGVyYXNlIGF0IHRoZSBtb21lbnQ/ICAqLworbG9uZworamZmc19lcmFzYWJsZV9zaXplKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jKQoreworCXN0cnVjdCBqZmZzX2ZtICpmbTsKKwlfX3UzMiBzaXplID0gMDsKKwlsb25nIHJldDsKKworCUFTU0VSVChpZiAoIWZtYykgeworCQlwcmludGsoS0VSTl9FUlIgImpmZnNfZXJhc2FibGVfc2l6ZSgpOiBmbWMgPSBOVUxMXG4iKTsKKwkJcmV0dXJuIC0xOworCX0pOworCisJaWYgKCFmbWMtPmhlYWQpIHsKKwkJLyogVGhlIGZsYXNoIG1lbW9yeSBpcyB0b3RhbGx5IGVtcHR5LiBObyBub2Rlcy4gTm8gZGlydC4KKwkJICAgSnVzdCByZXR1cm4uICAqLworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDYWxjdWxhdGUgaG93IG11Y2ggc3BhY2UgdGhhdCBpcyBkaXJ0eS4gICovCisJZm9yIChmbSA9IGZtYy0+aGVhZDsgZm0gJiYgIWZtLT5ub2RlczsgZm0gPSBmbS0+bmV4dCkgeworCQlpZiAoc2l6ZSAmJiBmbS0+b2Zmc2V0ID09IDApIHsKKwkJCS8qIFdlIGhhdmUgcmVhY2hlZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmbGFzaC4gICovCisJCQlicmVhazsKKwkJfQorCQlzaXplICs9IGZtLT5zaXplOworCX0KKworCS8qIFNvbWVvbmUncyBzaWduYXR1cmUgY29udGFpbmVkIHRoaXM6CisJICAgVGhlcmUncyBhIGZpbmUgbGluZSBiZXR3ZWVuIGZpc2hpbmcgYW5kIGp1c3Qgc3RhbmRpbmcgb24KKwkgICB0aGUgc2hvcmUgbGlrZSBhbiBpZGlvdC4uLiAgKi8KKwlyZXQgPSBqZmZzX2ZsYXNoX2VyYXNhYmxlX3NpemUoZm1jLT5tdGQsIGZtYy0+aGVhZC0+b2Zmc2V0LCBzaXplKTsKKworCUFTU0VSVChpZiAocmV0IDwgMCkgeworCQlwcmludGsoImpmZnNfZXJhc2FibGVfc2l6ZTogZmxhc2hfZXJhc2FibGVfc2l6ZSgpICIKKwkJICAgICAgICJyZXR1cm5lZCBzb21ldGhpbmcgbGVzcyB0aGFuIHplcm8gKCVsZCkuXG4iLCByZXQpOworCQlwcmludGsoImpmZnNfZXJhc2FibGVfc2l6ZTogb2Zmc2V0ID0gMHglMDh4XG4iLAorCQkgICAgICAgZm1jLT5oZWFkLT5vZmZzZXQpOworCX0pOworCisJLyogSWYgdGhlcmUgaXMgZGlydCBvbiB0aGUgZmxhc2ggKHdoaWNoIGlzIHRoZSByZWFzb24gdG8gd2h5CisJICAgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkIGluIHRoZSBmaXJzdCBwbGFjZSkgYnV0IG5vIHNwYWNlIGlzCisJICAgcG9zc2libGUgdG8gZXJhc2UgcmlnaHQgbm93LCB0aGUgaW5pdGlhbCBwYXJ0IG9mIHRoZSBsaXN0IG9mCisJICAgamZmc19mbSBzdHJ1Y3RzLCB0aGF0IGhvbGQgcGxhY2UgZm9yIGRpcnR5IHNwYWNlLCBjb3VsZCBwZXJoYXBzCisJICAgYmUgc2hvcnRlbmVkLiAgVGhlIGxpc3QncyBpbml0aWFsICJkaXJ0eSIgZWxlbWVudHMgYXJlIG1lcmdlZAorCSAgIGludG8ganVzdCBvbmUgbGFyZ2UgZGlydHkgamZmc19mbSBzdHJ1Y3QuICBUaGlzIG9wZXJhdGlvbiBtdXN0CisJICAgb25seSBiZSBwZXJmb3JtZWQgaWYgbm90aGluZyBpcyBwb3NzaWJsZSB0byBlcmFzZS4gIE90aGVyd2lzZSwKKwkgICBqZmZzX2NsZWFyX2VuZF9vZl9ub2RlKCkgd29uJ3Qgd29yayBhcyBleHBlY3RlZC4gICovCisJaWYgKHJldCA9PSAwKSB7CisJCXN0cnVjdCBqZmZzX2ZtICpoZWFkID0gZm1jLT5oZWFkOworCQlzdHJ1Y3QgamZmc19mbSAqZGVsOworCQkvKiBXaGlsZSB0aGVyZSBhcmUgdHdvIGRpcnR5IG5vZGVzIGJlc2lkZSBlYWNoIG90aGVyLiovCisJCXdoaWxlIChoZWFkLT5ub2RlcyA9PSAwCisJCSAgICAgICAmJiBoZWFkLT5uZXh0CisJCSAgICAgICAmJiBoZWFkLT5uZXh0LT5ub2RlcyA9PSAwKSB7CisJCQlkZWwgPSBoZWFkLT5uZXh0OworCQkJaGVhZC0+c2l6ZSArPSBkZWwtPnNpemU7CisJCQloZWFkLT5uZXh0ID0gZGVsLT5uZXh0OworCQkJaWYgKGRlbC0+bmV4dCkgeworCQkJCWRlbC0+bmV4dC0+cHJldiA9IGhlYWQ7CisJCQl9CisJCQlqZmZzX2ZyZWVfZm0oZGVsKTsKKwkJfQorCX0KKworCXJldHVybiAocmV0ID49IDAgPyByZXQgOiAwKTsKK30KKworc3RhdGljIHN0cnVjdCBqZmZzX2ZtICpqZmZzX2FsbG9jX2ZtKHZvaWQpCit7CisJc3RydWN0IGpmZnNfZm0gKmZtOworCisJZm0gPSBrbWVtX2NhY2hlX2FsbG9jKGZtX2NhY2hlLEdGUF9LRVJORUwpOworCURKTShpZiAoZm0pIG5vX2pmZnNfZm0rKzspOworCQorCXJldHVybiBmbTsKK30KKworc3RhdGljIHZvaWQgamZmc19mcmVlX2ZtKHN0cnVjdCBqZmZzX2ZtICpuKQoreworCWttZW1fY2FjaGVfZnJlZShmbV9jYWNoZSxuKTsKKwlESk0obm9famZmc19mbS0tKTsKK30KKworCisKK3N0cnVjdCBqZmZzX25vZGUgKmpmZnNfYWxsb2Nfbm9kZSh2b2lkKQoreworCXN0cnVjdCBqZmZzX25vZGUgKm47CisKKwluID0gKHN0cnVjdCBqZmZzX25vZGUgKilrbWVtX2NhY2hlX2FsbG9jKG5vZGVfY2FjaGUsR0ZQX0tFUk5FTCk7CisJaWYobiAhPSBOVUxMKQorCQlub19qZmZzX25vZGUrKzsKKwlyZXR1cm4gbjsKK30KKwordm9pZCBqZmZzX2ZyZWVfbm9kZShzdHJ1Y3QgamZmc19ub2RlICpuKQoreworCWttZW1fY2FjaGVfZnJlZShub2RlX2NhY2hlLG4pOworCW5vX2pmZnNfbm9kZS0tOworfQorCisKK2ludCBqZmZzX2dldF9ub2RlX2ludXNlKHZvaWQpCit7CisJcmV0dXJuIG5vX2pmZnNfbm9kZTsKK30KKwordm9pZAoramZmc19wcmludF9mbWNvbnRyb2woc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMpCit7CisJRChwcmludGsoInN0cnVjdCBqZmZzX2ZtY29udHJvbDogMHglcFxuIiwgZm1jKSk7CisJRChwcmludGsoIntcbiIpKTsKKwlEKHByaW50aygiICAgICAgICAldSwgLyogZmxhc2hfc2l6ZSAgKi9cbiIsIGZtYy0+Zmxhc2hfc2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgICV1LCAvKiB1c2VkX3NpemUgICovXG4iLCBmbWMtPnVzZWRfc2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgICV1LCAvKiBkaXJ0eV9zaXplICAqL1xuIiwgZm1jLT5kaXJ0eV9zaXplKSk7CisJRChwcmludGsoIiAgICAgICAgJXUsIC8qIGZyZWVfc2l6ZSAgKi9cbiIsIGZtYy0+ZnJlZV9zaXplKSk7CisJRChwcmludGsoIiAgICAgICAgJXUsIC8qIHNlY3Rvcl9zaXplICAqL1xuIiwgZm1jLT5zZWN0b3Jfc2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgICV1LCAvKiBtaW5fZnJlZV9zaXplICAqL1xuIiwgZm1jLT5taW5fZnJlZV9zaXplKSk7CisJRChwcmludGsoIiAgICAgICAgJXUsIC8qIG1heF9jaHVua19zaXplICAqL1xuIiwgZm1jLT5tYXhfY2h1bmtfc2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIG10ZCAgKi9cbiIsIGZtYy0+bXRkKSk7CisJRChwcmludGsoIiAgICAgICAgMHglcCwgLyogaGVhZCAgKi8gICAgIgorCQkgIihoZWFkLT5vZmZzZXQgPSAweCUwOHgpXG4iLAorCQkgZm1jLT5oZWFkLCAoZm1jLT5oZWFkID8gZm1jLT5oZWFkLT5vZmZzZXQgOiAwKSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIHRhaWwgICovICAgICIKKwkJICIodGFpbC0+b2Zmc2V0ICsgdGFpbC0+c2l6ZSA9IDB4JTA4eClcbiIsCisJCSBmbWMtPnRhaWwsCisJCSAoZm1jLT50YWlsID8gZm1jLT50YWlsLT5vZmZzZXQgKyBmbWMtPnRhaWwtPnNpemUgOiAwKSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIGhlYWRfZXh0cmEgICovXG4iLCBmbWMtPmhlYWRfZXh0cmEpKTsKKwlEKHByaW50aygiICAgICAgICAweCVwLCAvKiB0YWlsX2V4dHJhICAqL1xuIiwgZm1jLT50YWlsX2V4dHJhKSk7CisJRChwcmludGsoIn1cbiIpKTsKK30KKwordm9pZAoramZmc19wcmludF9mbShzdHJ1Y3QgamZmc19mbSAqZm0pCit7CisJRChwcmludGsoInN0cnVjdCBqZmZzX2ZtOiAweCVwXG4iLCBmbSkpOworCUQocHJpbnRrKCJ7XG4iKSk7CisJRChwcmludGsoIiAgICAgICAweCUwOHgsIC8qIG9mZnNldCAgKi9cbiIsIGZtLT5vZmZzZXQpKTsKKwlEKHByaW50aygiICAgICAgICV1LCAvKiBzaXplICAqL1xuIiwgZm0tPnNpemUpKTsKKwlEKHByaW50aygiICAgICAgIDB4JXAsIC8qIHByZXYgICovXG4iLCBmbS0+cHJldikpOworCUQocHJpbnRrKCIgICAgICAgMHglcCwgLyogbmV4dCAgKi9cbiIsIGZtLT5uZXh0KSk7CisJRChwcmludGsoIiAgICAgICAweCVwLCAvKiBub2RlcyAgKi9cbiIsIGZtLT5ub2RlcykpOworCUQocHJpbnRrKCJ9XG4iKSk7Cit9CisKKyNpZiAwCit2b2lkCitqZmZzX3ByaW50X25vZGVfcmVmKHN0cnVjdCBqZmZzX25vZGVfcmVmICpyZWYpCit7CisJRChwcmludGsoInN0cnVjdCBqZmZzX25vZGVfcmVmOiAweCVwXG4iLCByZWYpKTsKKwlEKHByaW50aygie1xuIikpOworCUQocHJpbnRrKCIgICAgICAgMHglcCwgLyogbm9kZSAgKi9cbiIsIHJlZi0+bm9kZSkpOworCUQocHJpbnRrKCIgICAgICAgMHglcCwgLyogbmV4dCAgKi9cbiIsIHJlZi0+bmV4dCkpOworCUQocHJpbnRrKCJ9XG4iKSk7Cit9CisjZW5kaWYgIC8qICAwICAqLworCmRpZmYgLS1naXQgYS9mcy9qZmZzL2pmZnNfZm0uaCBiL2ZzL2pmZnMvamZmc19mbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMjkxYzQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzL2pmZnNfZm0uaApAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIEpGRlMgLS0gSm91cm5hbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgTGludXggaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwICBBeGlzIENvbW11bmljYXRpb25zIEFCLgorICoKKyAqIENyZWF0ZWQgYnkgRmlubiBIYWthbnNzb24gPGZpbm5AYXhpcy5jb20+LgorICoKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICRJZDogamZmc19mbS5oLHYgMS4xMyAyMDAxLzAxLzExIDEyOjAzOjI1IGR3bXcyIEV4cCAkCisgKgorICogUG9ydGVkIHRvIExpbnV4IDIuMy54IGFuZCBNVEQ6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgIEFsZXhhbmRlciBMYXJzc29uIChhbGV4QGNlbmRpby5zZSksIENlbmRpbyBTeXN0ZW1zIEFCCisgKgorICovCisKKyNpZm5kZWYgX19MSU5VWF9KRkZTX0ZNX0hfXworI2RlZmluZSBfX0xJTlVYX0pGRlNfRk1fSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2pmZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKy8qIFRoZSBhbGlnbm1lbnQgYmV0d2VlbiB0d28gbm9kZXMgaW4gdGhlIGZsYXNoIG1lbW9yeS4gICovCisjZGVmaW5lIEpGRlNfQUxJR05fU0laRSA0CisKKy8qIE1hcmsgdGhlIG9uLWZsYXNoIHNwYWNlIGFzIG9ic29sZXRlIHdoZW4gYXBwcm9wcmlhdGUuICAqLworI2RlZmluZSBKRkZTX01BUktfT0JTT0xFVEUgMAorCisjaWZuZGVmIENPTkZJR19KRkZTX0ZTX1ZFUkJPU0UKKyNkZWZpbmUgQ09ORklHX0pGRlNfRlNfVkVSQk9TRSAxCisjZW5kaWYKKworI2lmIENPTkZJR19KRkZTX0ZTX1ZFUkJPU0UgPiAwCisjZGVmaW5lIEQoeCkgeAorI2RlZmluZSBEMSh4KSBEKHgpCisjZWxzZQorI2RlZmluZSBEKHgpCisjZGVmaW5lIEQxKHgpCisjZW5kaWYKKworI2lmIENPTkZJR19KRkZTX0ZTX1ZFUkJPU0UgPiAxCisjZGVmaW5lIEQyKHgpIEQoeCkKKyNlbHNlCisjZGVmaW5lIEQyKHgpCisjZW5kaWYKKworI2lmIENPTkZJR19KRkZTX0ZTX1ZFUkJPU0UgPiAyCisjZGVmaW5lIEQzKHgpIEQoeCkKKyNlbHNlCisjZGVmaW5lIEQzKHgpCisjZW5kaWYKKworI2RlZmluZSBBU1NFUlQoeCkgeAorCisvKiBIb3cgbWFueSBwYWRkaW5nIGJ5dGVzIHNob3VsZCBiZSBpbnNlcnRlZCBiZXR3ZWVuIHR3byBjaHVua3Mgb2YgZGF0YQorICAgb24gdGhlIGZsYXNoPyAgKi8KKyNkZWZpbmUgSkZGU19HRVRfUEFEX0JZVEVTKHNpemUpICggKEpGRlNfQUxJR05fU0laRS0xKSAmIC0oX191MzIpKHNpemUpICkKKyNkZWZpbmUgSkZGU19QQUQoc2l6ZSkgKCAoc2l6ZSArIChKRkZTX0FMSUdOX1NJWkUtMSkpICYgfihKRkZTX0FMSUdOX1NJWkUtMSkgKQorCisKKworc3RydWN0IGpmZnNfbm9kZV9yZWYKK3sKKwlzdHJ1Y3QgamZmc19ub2RlICpub2RlOworCXN0cnVjdCBqZmZzX25vZGVfcmVmICpuZXh0OworfTsKKworCisvKiBUaGUgc3RydWN0IGpmZnNfZm0gcmVwcmVzZW50cyBhIGNodW5rIG9mIGRhdGEgaW4gdGhlIGZsYXNoIG1lbW9yeS4gICovCitzdHJ1Y3QgamZmc19mbQoreworCV9fdTMyIG9mZnNldDsKKwlfX3UzMiBzaXplOworCXN0cnVjdCBqZmZzX2ZtICpwcmV2OworCXN0cnVjdCBqZmZzX2ZtICpuZXh0OworCXN0cnVjdCBqZmZzX25vZGVfcmVmICpub2RlczsgLyogVVNFRCBpZiAhPSAwLiAgKi8KK307CisKK3N0cnVjdCBqZmZzX2ZtY29udHJvbAoreworCV9fdTMyIGZsYXNoX3NpemU7CisJX191MzIgdXNlZF9zaXplOworCV9fdTMyIGRpcnR5X3NpemU7CisJX191MzIgZnJlZV9zaXplOworCV9fdTMyIHNlY3Rvcl9zaXplOworCV9fdTMyIG1pbl9mcmVlX3NpemU7ICAvKiBUaGUgbWluaW11bSBmcmVlIHNwYWNlIG5lZWRlZCB0byBiZSBhYmxlCisJCQkJIHRvIHBlcmZvcm0gZ2FyYmFnZSBjb2xsZWN0aW9ucy4gICovCisJX191MzIgbWF4X2NodW5rX3NpemU7IC8qIFRoZSBtYXhpbXVtIHNpemUgb2YgYSBjaHVuayBvZiBkYXRhLiAgKi8KKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjOworCXN0cnVjdCBqZmZzX2ZtICpoZWFkOworCXN0cnVjdCBqZmZzX2ZtICp0YWlsOworCXN0cnVjdCBqZmZzX2ZtICpoZWFkX2V4dHJhOworCXN0cnVjdCBqZmZzX2ZtICp0YWlsX2V4dHJhOworCXN0cnVjdCBzZW1hcGhvcmUgYmlnbG9jazsKK307CisKKy8qIE5vdGljZSB0aGUgdHdvIG1lbWJlcnMgaGVhZF9leHRyYSBhbmQgdGFpbF9leHRyYSBpbiB0aGUgamZmc19jb250cm9sCisgICBzdHJ1Y3R1cmUgYWJvdmUuIFRob3NlIGFyZSBvbmx5IHVzZWQgZHVyaW5nIHRoZSBzY2FubmluZyBvZiB0aGUgZmxhc2gKKyAgIG1lbW9yeTsgd2hpbGUgdGhlIGZpbGUgc3lzdGVtIGlzIGJlaW5nIGJ1aWx0LiBJZiB0aGUgZGF0YSBpbiB0aGUgZmxhc2gKKyAgIG1lbW9yeSBpcyBvcmdhbml6ZWQgbGlrZQorCisgICAgICArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgIHwgIFVTRUQgLyBESVJUWSAgfCAgICAgICBGUkVFICAgICAgIHwgIFVTRUQgLyBESVJUWSAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisKKyAgIHRoZW4gdGhlIHNjYW4gaXMgc3BsaXQgaW4gdHdvIHBhcnRzLiBUaGUgZmlyc3Qgc2Nhbm5lZCBwYXJ0IG9mIHRoZQorICAgZmxhc2ggbWVtb3J5IGlzIG9yZ2FuaXplZCB0aHJvdWdoIHRoZSBtZW1iZXJzIGhlYWQgYW5kIHRhaWwuIFRoZQorICAgc2Vjb25kIHNjYW5uZWQgcGFydCBpcyBvcmdhbml6ZWQgd2l0aCBoZWFkX2V4dHJhIGFuZCB0YWlsX2V4dHJhLiBXaGVuCisgICB0aGUgc2NhbiBpcyBjb21wbGV0ZWQsIHRoZSB0d28gbGlzdHMgYXJlIG1lcmdlZCB0b2dldGhlci4gVGhlIGpmZnNfZm0KKyAgIHN0cnVjdCB0aGF0IGhlYWRfZXh0cmEgcmVmZXJlbmNlcyBpcyB0aGUgbG9naWNhbCBiZWdpbm5pbmcgb2YgdGhlCisgICBmbGFzaCBtZW1vcnkgc28gaXQgd2lsbCBiZSByZWZlcmVuY2VkIGJ5IHRoZSBoZWFkIG1lbWJlci4gICovCisKKworCitzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmpmZnNfYnVpbGRfYmVnaW4oc3RydWN0IGpmZnNfY29udHJvbCAqYywgaW50IHVuaXQpOwordm9pZCBqZmZzX2J1aWxkX2VuZChzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYyk7Cit2b2lkIGpmZnNfY2xlYW51cF9mbWNvbnRyb2woc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMpOworCitpbnQgamZmc19mbWFsbG9jKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jLCBfX3UzMiBzaXplLAorCQkgc3RydWN0IGpmZnNfbm9kZSAqbm9kZSwgc3RydWN0IGpmZnNfZm0gKipyZXN1bHQpOworaW50IGpmZnNfZm1mcmVlKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jLCBzdHJ1Y3QgamZmc19mbSAqZm0sCisJCXN0cnVjdCBqZmZzX25vZGUgKm5vZGUpOworCitfX3UzMiBqZmZzX2ZyZWVfc2l6ZTEoc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMpOworX191MzIgamZmc19mcmVlX3NpemUyKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jKTsKK3ZvaWQgamZmc19zeW5jX2VyYXNlKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jLCBpbnQgZXJhc2VkX3NpemUpOworc3RydWN0IGpmZnNfZm0gKmpmZnNfY3V0X25vZGUoc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMsIF9fdTMyIHNpemUpOworc3RydWN0IGpmZnNfbm9kZSAqamZmc19nZXRfb2xkZXN0X25vZGUoc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMpOworbG9uZyBqZmZzX2VyYXNhYmxlX3NpemUoc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMpOworc3RydWN0IGpmZnNfZm0gKmpmZnNfZm1hbGxvY2VkKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jLCBfX3UzMiBvZmZzZXQsCisJCQkgICAgICAgX191MzIgc2l6ZSwgc3RydWN0IGpmZnNfbm9kZSAqbm9kZSk7CitpbnQgamZmc19hZGRfbm9kZShzdHJ1Y3QgamZmc19ub2RlICpub2RlKTsKK3ZvaWQgamZmc19mbWZyZWVfcGFydGx5KHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jLCBzdHJ1Y3QgamZmc19mbSAqZm0sCisJCQlfX3UzMiBzaXplKTsKKwordm9pZCBqZmZzX3ByaW50X2ZtY29udHJvbChzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYyk7Cit2b2lkIGpmZnNfcHJpbnRfZm0oc3RydWN0IGpmZnNfZm0gKmZtKTsKKyNpZiAwCit2b2lkIGpmZnNfcHJpbnRfbm9kZV9yZWYoc3RydWN0IGpmZnNfbm9kZV9yZWYgKnJlZik7CisjZW5kaWYgIC8qICAwICAqLworCisjZW5kaWYgLyogX19MSU5VWF9KRkZTX0ZNX0hfXyAgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmZnMvamZmc19wcm9jLmMgYi9mcy9qZmZzL2pmZnNfcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZGQ5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzL2pmZnNfcHJvYy5jCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogSkZGUyAtLSBKb3VybmFsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBMaW51eCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIuCisgKgorICogQ3JlYXRlZCBieSBTaW1vbiBLYWdzdHJvbSA8c2ltb25rQGF4aXMuY29tPi4KKyAqCisgKiAkSWQ6IGpmZnNfcHJvYy5jLHYgMS41IDIwMDEvMDYvMDIgMTQ6MzQ6NTUgZHdtdzIgRXhwICQKKyAqCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgT3ZlcnZpZXc6CisgKiAgIFRoaXMgZmlsZSBkZWZpbmVzIEpGRlMgcGFydGl0aW9uIGVudHJpZXMgaW4gdGhlIHByb2MgZmlsZSBzeXN0ZW0uCisgKgorICogIFRPRE86CisgKiAgIENyZWF0ZSBzb21lIG1vcmUgcHJvYyBmaWxlcyBmb3IgZGlmZmVyZW50IGtpbmRzIG9mIGluZm8sIGkuZS4gc3RhdGlzdGljcworICogICBhYm91dCB3cml0dGVuIGFuZCByZWFkIGJ5dGVzLCBudW1iZXIgb2YgY2FsbHMgdG8gZGlmZmVyZW50IHJvdXRpbmVzLAorICogICByZXBvcnRzIGFib3V0IGZhaWx1cmVzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamZmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSAiamZmc19mbS5oIgorI2luY2x1ZGUgImpmZnNfcHJvYy5oIgorCisvKgorICogU3RydWN0dXJlIGZvciBhIEpGRlMgcGFydGl0aW9uIGluIHRoZSBzeXN0ZW0KKyAqLworc3RydWN0IGpmZnNfcGFydGl0aW9uX2RpciB7CisJc3RydWN0IGpmZnNfY29udHJvbCAqYzsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcnRfcm9vdDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcnRfaW5mbzsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcnRfbGF5b3V0OworCXN0cnVjdCBqZmZzX3BhcnRpdGlvbl9kaXIgKm5leHQ7Cit9OworCisvKgorICogU3RydWN0dXJlIGZvciB0b3AtbGV2ZWwgZW50cnkgaW4gJy9wcm9jL2ZzJyBkaXJlY3RvcnkKKyAqLworc3RydWN0IHByb2NfZGlyX2VudHJ5ICpqZmZzX3Byb2Nfcm9vdDsKKworLyoKKyAqIExpbmtlZCBsaXN0IG9mICdqZmZzX3BhcnRpdGlvbl9kaXJzJyB0byBoZWxwIHVzIHRyYWNrCisgKiB0aGUgbW91bnRlZCBKRkZTIHBhcnRpdGlvbnMgaW4gdGhlIHN5c3RlbQorICovCitzdGF0aWMgc3RydWN0IGpmZnNfcGFydGl0aW9uX2RpciAqamZmc19wYXJ0X2RpcnM7CisKKy8qCisgKiBSZWFkIGZ1bmN0aW9ucyBmb3IgZW50cmllcworICovCitzdGF0aWMgaW50IGpmZnNfcHJvY19pbmZvX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworc3RhdGljIGludCBqZmZzX3Byb2NfbGF5b3V0X3JlYWQgKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQlpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKTsKKworCisvKgorICogUmVnaXN0ZXIgYSBKRkZTIHBhcnRpdGlvbiBkaXJlY3RvcnkgKGNhbGxlZCB1cG9uIG1vdW50KQorICovCitpbnQgamZmc19yZWdpc3Rlcl9qZmZzX3Byb2NfZGlyKGludCBtdGQsIHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMpCit7CisJc3RydWN0IGpmZnNfcGFydGl0aW9uX2RpciAqcGFydF9kaXI7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJ0X2luZm8gPSBOVUxMOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFydF9sYXlvdXQgPSBOVUxMOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFydF9yb290ID0gTlVMTDsKKwljaGFyIG5hbWVbMTBdOworCisJc3ByaW50ZihuYW1lLCAiJWQiLCBtdGQpOworCS8qIEFsbG9jYXRlIHN0cnVjdHVyZSBmb3IgbG9jYWwgSkZGUyBwYXJ0aXRpb24gdGFibGUgKi8KKwlwYXJ0X2RpciA9IChzdHJ1Y3QgamZmc19wYXJ0aXRpb25fZGlyICopCisJCWttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgamZmc19wYXJ0aXRpb25fZGlyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXJ0X2RpcikKKwkJZ290byBvdXQ7CisKKwkvKiBDcmVhdGUgZW50cnkgZm9yIHRoaXMgcGFydGl0aW9uICovCisJcGFydF9yb290ID0gcHJvY19ta2RpcihuYW1lLCBqZmZzX3Byb2Nfcm9vdCk7CisJaWYgKCFwYXJ0X3Jvb3QpCisJCWdvdG8gb3V0MTsKKworCS8qIENyZWF0ZSBlbnRyeSBmb3IgJ2luZm8nIGZpbGUgKi8KKwlwYXJ0X2luZm8gPSBjcmVhdGVfcHJvY19lbnRyeSAoImluZm8iLCAwLCBwYXJ0X3Jvb3QpOworCWlmICghcGFydF9pbmZvKQorCQlnb3RvIG91dDI7CisJcGFydF9pbmZvLT5yZWFkX3Byb2MgPSBqZmZzX3Byb2NfaW5mb19yZWFkOworCXBhcnRfaW5mby0+ZGF0YSA9ICh2b2lkICopIGM7CisKKwkvKiBDcmVhdGUgZW50cnkgZm9yICdsYXlvdXQnIGZpbGUgKi8KKwlwYXJ0X2xheW91dCA9IGNyZWF0ZV9wcm9jX2VudHJ5ICgibGF5b3V0IiwgMCwgcGFydF9yb290KTsKKwlpZiAoIXBhcnRfbGF5b3V0KQorCQlnb3RvIG91dDM7CisJcGFydF9sYXlvdXQtPnJlYWRfcHJvYyA9IGpmZnNfcHJvY19sYXlvdXRfcmVhZDsKKwlwYXJ0X2xheW91dC0+ZGF0YSA9ICh2b2lkICopIGM7CisKKwkvKiBGaWxsIGluIHN0cnVjdHVyZSBmb3IgdGFibGUgYW5kIGluc2VydCBpbiB0aGUgbGlzdCAqLworCXBhcnRfZGlyLT5jID0gYzsKKwlwYXJ0X2Rpci0+cGFydF9yb290ID0gcGFydF9yb290OworCXBhcnRfZGlyLT5wYXJ0X2luZm8gPSBwYXJ0X2luZm87CisJcGFydF9kaXItPnBhcnRfbGF5b3V0ID0gcGFydF9sYXlvdXQ7CisJcGFydF9kaXItPm5leHQgPSBqZmZzX3BhcnRfZGlyczsKKwlqZmZzX3BhcnRfZGlycyA9IHBhcnRfZGlyOworCisJLyogUmV0dXJuIGhhcHB5ICovCisJcmV0dXJuIDA7CisKK291dDM6CisJcmVtb3ZlX3Byb2NfZW50cnkoImluZm8iLCBwYXJ0X3Jvb3QpOworb3V0MjoKKwlyZW1vdmVfcHJvY19lbnRyeShuYW1lLCBqZmZzX3Byb2Nfcm9vdCk7CitvdXQxOgorCWtmcmVlKHBhcnRfZGlyKTsKK291dDoKKwlyZXR1cm4gLUVOT01FTTsKK30KKworCisvKgorICogVW5yZWdpc3RlciBhIEpGRlMgcGFydGl0aW9uIGRpcmVjdG9yeSAoY2FsbGVkIGF0IHVtb3VudCkKKyAqLworaW50IGpmZnNfdW5yZWdpc3Rlcl9qZmZzX3Byb2NfZGlyKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMpCit7CisJc3RydWN0IGpmZnNfcGFydGl0aW9uX2RpciAqcGFydF9kaXIgPSBqZmZzX3BhcnRfZGlyczsKKwlzdHJ1Y3QgamZmc19wYXJ0aXRpb25fZGlyICpwcmV2X3BhcnRfZGlyID0gTlVMTDsKKworCXdoaWxlIChwYXJ0X2RpcikgeworCQlpZiAocGFydF9kaXItPmMgPT0gYykgeworCQkJLyogUmVtb3ZlIGVudHJpZXMgZm9yIHBhcnRpdGlvbiAqLworCQkJcmVtb3ZlX3Byb2NfZW50cnkgKHBhcnRfZGlyLT5wYXJ0X2luZm8tPm5hbWUsCisJCQkJcGFydF9kaXItPnBhcnRfcm9vdCk7CisJCQlyZW1vdmVfcHJvY19lbnRyeSAocGFydF9kaXItPnBhcnRfbGF5b3V0LT5uYW1lLAorCQkJCXBhcnRfZGlyLT5wYXJ0X3Jvb3QpOworCQkJcmVtb3ZlX3Byb2NfZW50cnkgKHBhcnRfZGlyLT5wYXJ0X3Jvb3QtPm5hbWUsCisJCQkJamZmc19wcm9jX3Jvb3QpOworCisJCQkvKiBSZW1vdmUgZW50cnkgZnJvbSBsaXN0ICovCisJCQlpZiAocHJldl9wYXJ0X2RpcikKKwkJCQlwcmV2X3BhcnRfZGlyLT5uZXh0ID0gcGFydF9kaXItPm5leHQ7CisJCQllbHNlCisJCQkJamZmc19wYXJ0X2RpcnMgPSBwYXJ0X2Rpci0+bmV4dDsKKworCQkJLyoKKwkJCSAqIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIHRoZSBsYXN0IG9uZQorCQkJICogYW5kIHJlbW92ZSB0aGUgZW50cnkgZnJvbSAnL3Byb2MvZnMnCisJCQkgKiBpZiBpdCBpcy4KKwkJCSAqLworCQkJaWYgKGpmZnNfcGFydF9kaXJzID09IHBhcnRfZGlyLT5uZXh0KQorCQkJCXJlbW92ZV9wcm9jX2VudHJ5ICgiamZmcyIsIHByb2Nfcm9vdF9mcyk7CisKKwkJCS8qIEZyZWUgbWVtb3J5IGZvciBlbnRyeSAqLworCQkJa2ZyZWUocGFydF9kaXIpOworCisJCQkvKiBSZXR1cm4gaGFwcHkgKi8KKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogTW92ZSB0byBuZXh0IGVudHJ5ICovCisJCXByZXZfcGFydF9kaXIgPSBwYXJ0X2RpcjsKKwkJcGFydF9kaXIgPSBwYXJ0X2Rpci0+bmV4dDsKKwl9CisKKwkvKiBSZXR1cm4gdW5oYXBweSAqLworCXJldHVybiAtMTsKK30KKworCisvKgorICogUmVhZCBhIEpGRlMgcGFydGl0aW9uJ3MgYGluZm8nIGZpbGUKKyAqLworc3RhdGljIGludCBqZmZzX3Byb2NfaW5mb19yZWFkIChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjID0gKHN0cnVjdCBqZmZzX2NvbnRyb2wgKikgZGF0YTsKKwlpbnQgbGVuID0gMDsKKworCS8qIEdldCBpbmZvcm1hdGlvbiBvbiB0aGUgcGFyaXRpb24gKi8KKwlsZW4gKz0gc3ByaW50ZiAocGFnZSwKKwkJInBhcnRpdGlvbiBzaXplOiAgICAgJTA4bFggKCV1KVxuIgorCQkic2VjdG9yIHNpemU6ICAgICAgICAlMDhsWCAoJXUpXG4iCisJCSJ1c2VkIHNpemU6ICAgICAgICAgICUwOGxYICgldSlcbiIKKwkJImRpcnR5IHNpemU6ICAgICAgICAgJTA4bFggKCV1KVxuIgorCQkiZnJlZSBzaXplOiAgICAgICAgICAlMDhsWCAoJXUpXG5cbiIsCisJCSh1bnNpZ25lZCBsb25nKSBjLT5mbWMtPmZsYXNoX3NpemUsIGMtPmZtYy0+Zmxhc2hfc2l6ZSwKKwkJKHVuc2lnbmVkIGxvbmcpIGMtPmZtYy0+c2VjdG9yX3NpemUsIGMtPmZtYy0+c2VjdG9yX3NpemUsCisJCSh1bnNpZ25lZCBsb25nKSBjLT5mbWMtPnVzZWRfc2l6ZSwgYy0+Zm1jLT51c2VkX3NpemUsCisJCSh1bnNpZ25lZCBsb25nKSBjLT5mbWMtPmRpcnR5X3NpemUsIGMtPmZtYy0+ZGlydHlfc2l6ZSwKKwkJKHVuc2lnbmVkIGxvbmcpIChjLT5mbWMtPmZsYXNoX3NpemUgLQorCQkJKGMtPmZtYy0+dXNlZF9zaXplICsgYy0+Zm1jLT5kaXJ0eV9zaXplKSksCisJCWMtPmZtYy0+Zmxhc2hfc2l6ZSAtIChjLT5mbWMtPnVzZWRfc2l6ZSArIGMtPmZtYy0+ZGlydHlfc2l6ZSkpOworCisJLyogV2UncmUgZG9uZSAqLworCSplb2YgPSAxOworCisJLyogUmV0dXJuIGxlbmd0aCAqLworCXJldHVybiBsZW47Cit9CisKKworLyoKKyAqIFJlYWQgYSBKRkZTIHBhcnRpdGlvbidzIGBsYXlvdXQnIGZpbGUKKyAqLworc3RhdGljIGludCBqZmZzX3Byb2NfbGF5b3V0X3JlYWQgKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQlpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBqZmZzX2NvbnRyb2wgKmMgPSAoc3RydWN0IGpmZnNfY29udHJvbCAqKSBkYXRhOworCXN0cnVjdCBqZmZzX2ZtICpmbSA9IE5VTEw7CisJc3RydWN0IGpmZnNfZm0gKmxhc3RfZm0gPSBOVUxMOworCWludCBsZW4gPSAwOworCisJLyogR2V0IHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0ICovCisgCWZtID0gYy0+Zm1jLT5oZWFkOworCisJLyogUHJpbnQgZnJlZSBzcGFjZSAqLworCWlmIChmbSAmJiBmbS0+b2Zmc2V0KSB7CisJCWxlbiArPSBzcHJpbnRmIChwYWdlLCAiMDAwMDAwMDAgJTA4bFggZnJlZVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKSBmbS0+b2Zmc2V0KTsKKwl9CisKKwkvKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBmbGFzaCBjb250cm9sIHN0cnVjdHVyZXMgKi8KKwl3aGlsZSAoZm0gJiYgKGxlbiA8IChvZmYgKyBjb3VudCkpKSB7CisJCWlmIChmbS0+bm9kZXMpIHsKKwkJCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLAorCQkJCSIlMDhsWCAlMDhsWCBpbm89JTA4bFgsIHZlcj0lMDhsWFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZykgZm0tPm9mZnNldCwKKwkJCQkodW5zaWduZWQgbG9uZykgZm0tPnNpemUsCisJCQkJKHVuc2lnbmVkIGxvbmcpIGZtLT5ub2Rlcy0+bm9kZS0+aW5vLAorCQkJCSh1bnNpZ25lZCBsb25nKSBmbS0+bm9kZXMtPm5vZGUtPnZlcnNpb24pOworCQl9CisJCWVsc2UgeworCQkJbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sCisJCQkJIiUwOGxYICUwOGxYIGRpcnR5XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKSBmbS0+b2Zmc2V0LAorCQkJCSh1bnNpZ25lZCBsb25nKSBmbS0+c2l6ZSk7CisJCX0KKwkJbGFzdF9mbSA9IGZtOworCQlmbSA9IGZtLT5uZXh0OworCX0KKworCS8qIFByaW50IGZyZWUgc3BhY2UgKi8KKwlpZiAoKGxlbiA8IChvZmYgKyBjb3VudCkpICYmIGxhc3RfZm0KKwkgICAgJiYgKGxhc3RfZm0tPm9mZnNldCA8IGMtPmZtYy0+Zmxhc2hfc2l6ZSkpIHsKKwkJbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sCisJCQkgICAgICAgIiUwOGxYICUwOGxYIGZyZWVcbiIsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGxhc3RfZm0tPm9mZnNldCArIAorCQkJCWxhc3RfZm0tPnNpemUsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChjLT5mbWMtPmZsYXNoX3NpemUgLQorCQkJCQkJICAgIChsYXN0X2ZtLT5vZmZzZXQgKyBsYXN0X2ZtLT5zaXplKSkpOworCX0KKworCS8qIFdlJ3JlIGRvbmUgKi8KKwkqZW9mID0gMTsKKworCS8qIFJldHVybiBsZW5ndGggKi8KKwlyZXR1cm4gbGVuOworfQpkaWZmIC0tZ2l0IGEvZnMvamZmcy9qZmZzX3Byb2MuaCBiL2ZzL2pmZnMvamZmc19wcm9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlhMWM1ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMvamZmc19wcm9jLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIEpGRlMgLS0gSm91cm5hbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgTGludXggaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwICBBeGlzIENvbW11bmljYXRpb25zIEFCLgorICoKKyAqIENyZWF0ZWQgYnkgU2ltb24gS2Fnc3Ryb20gPHNpbW9ua0BheGlzLmNvbT4uCisgKgorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogJElkOiBqZmZzX3Byb2MuaCx2IDEuMiAyMDAwLzExLzE1IDIyOjA0OjEyIHNqaGlsbCBFeHAgJAorICovCisKKy8qIGpmZnNfcHJvYy5oIGRlZmluZXMgYSBzdHJ1Y3R1cmUgZm9yIGluY2x1c2lvbiBpbiB0aGUgcHJvYy1maWxlIHN5c3RlbS4gICovCisjaWZuZGVmIF9fTElOVVhfSkZGU19QUk9DX0hfXworI2RlZmluZSBfX0xJTlVYX0pGRlNfUFJPQ19IX18KKworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworLyogVGhlIHByb2NfZGlyX2VudHJ5IGZvciBqZmZzIChkZWZpbmVkIGluIGpmZnNfcHJvYy5jKS4gICovCitleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpqZmZzX3Byb2Nfcm9vdDsKKworaW50IGpmZnNfcmVnaXN0ZXJfamZmc19wcm9jX2RpcihpbnQgbXRkLCBzdHJ1Y3QgamZmc19jb250cm9sICpjKTsKK2ludCBqZmZzX3VucmVnaXN0ZXJfamZmc19wcm9jX2RpcihzdHJ1Y3QgamZmc19jb250cm9sICpjKTsKKworI2VuZGlmIC8qIF9fTElOVVhfSkZGU19QUk9DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvTElDRU5DRSBiL2ZzL2pmZnMyL0xJQ0VOQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4MWQ4MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL0xJQ0VOQ0UKQEAgLTAsMCArMSwzNSBAQAorVGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFuZCBlbHNld2hlcmUgd2hpY2ggcmVmZXIgdG8gdGhpcyBMSUNFTkNFCitmaWxlIGFyZSBwYXJ0IG9mIEpGRlMyLCB0aGUgSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0gdjIuCisKKwlDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorCitKRkZTMiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciAKK3ZlcnNpb24uCisKK0pGRlMyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCitBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggSkZGUzI7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorCitBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiBvdGhlciBmaWxlcyBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMgb3IgdXNlCittYWNyb3Mgb3IgaW5saW5lIGZ1bmN0aW9ucyBmcm9tIHRoZXNlIGZpbGVzLCBvciB5b3UgY29tcGlsZSB0aGVzZQorZmlsZXMgYW5kIGxpbmsgdGhlbSB3aXRoIG90aGVyIHdvcmtzIHRvIHByb2R1Y2UgYSB3b3JrIGJhc2VkIG9uIHRoZXNlCitmaWxlcywgdGhlc2UgZmlsZXMgZG8gbm90IGJ5IHRoZW1zZWx2ZXMgY2F1c2UgdGhlIHJlc3VsdGluZyB3b3JrIHRvIGJlCitjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gSG93ZXZlciB0aGUgc291cmNlIGNvZGUgZm9yCit0aGVzZSBmaWxlcyBtdXN0IHN0aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCBzZWN0aW9uICgzKQorb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCitUaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeSBhIHdvcmsgYmFzZWQgb24KK3RoaXMgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworRm9yIGluZm9ybWF0aW9uIG9uIG9idGFpbmluZyBhbHRlcm5hdGl2ZSBsaWNlbmNlcyBmb3IgSkZGUzIsIHNlZSAKK2h0dHA6Ly9zb3VyY2VzLnJlZGhhdC5jb20vamZmczIvamZmczItbGljZW5jZS5odG1sCisKKworCSRJZDogTElDRU5DRSx2IDEuMSAyMDAyLzA1LzIwIDE0OjU2OjM3IGR3bXcyIEV4cCAkCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9NYWtlZmlsZSBiL2ZzL2pmZnMyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYzM4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9NYWtlZmlsZQpAQCAtMCwwICsxLDE4IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0gdjIgKEpGRlMyKQorIworIyAkSWQ6IE1ha2VmaWxlLmNvbW1vbix2IDEuNyAyMDA0LzExLzAzIDEyOjU3OjM4IGp3Ym95ZXIgRXhwICQKKyMKKworb2JqLSQoQ09ORklHX0pGRlMyX0ZTKSArPSBqZmZzMi5vCisKK2pmZnMyLXkJOj0gY29tcHIubyBkaXIubyBmaWxlLm8gaW9jdGwubyBub2RlbGlzdC5vIG1hbGxvYy5vCitqZmZzMi15CSs9IHJlYWQubyBub2RlbWdtdC5vIHJlYWRpbm9kZS5vIHdyaXRlLm8gc2Nhbi5vIGdjLm8KK2pmZnMyLXkJKz0gc3ltbGluay5vIGJ1aWxkLm8gZXJhc2UubyBiYWNrZ3JvdW5kLm8gZnMubyB3cml0ZXYubworamZmczIteQkrPSBzdXBlci5vCisKK2pmZnMyLSQoQ09ORklHX0pGRlMyX0ZTX05BTkQpCSs9IHdidWYubworamZmczItJChDT05GSUdfSkZGUzJfRlNfTk9SX0VDQykgKz0gd2J1Zi5vCitqZmZzMi0kKENPTkZJR19KRkZTMl9SVUJJTikJKz0gY29tcHJfcnViaW4ubworamZmczItJChDT05GSUdfSkZGUzJfUlRJTUUpCSs9IGNvbXByX3J0aW1lLm8KK2pmZnMyLSQoQ09ORklHX0pGRlMyX1pMSUIpCSs9IGNvbXByX3psaWIubwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvUkVBRE1FLkxvY2tpbmcgYi9mcy9qZmZzMi9SRUFETUUuTG9ja2luZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTc3MWNmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZmczIvUkVBRE1FLkxvY2tpbmcKQEAgLTAsMCArMSwxNDggQEAKKwkkSWQ6IFJFQURNRS5Mb2NraW5nLHYgMS45IDIwMDQvMTEvMjAgMTA6MzU6NDAgZHdtdzIgRXhwICQKKworCUpGRlMyIExPQ0tJTkcgRE9DVU1FTlRBVElPTgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBdCBsZWFzdCB0aGVvcmV0aWNhbGx5LCBKRkZTMiBkb2VzIG5vdCByZXF1aXJlIHRoZSBCaWcgS2VybmVsIExvY2sKKyhCS0wpLCB3aGljaCB3YXMgYWx3YXlzIGhlbHBmdWxseSBvYnRhaW5lZCBmb3IgaXQgYnkgTGludXggMi40IFZGUworY29kZS4gSXQgaGFzIGl0cyBvd24gbG9ja2luZywgYXMgZGVzY3JpYmVkIGJlbG93LgorCitUaGlzIGRvY3VtZW50IGF0dGVtcHRzIHRvIGRlc2NyaWJlIHRoZSBleGlzdGluZyBsb2NraW5nIHJ1bGVzIGZvcgorSkZGUzIuIEl0IGlzIG5vdCBleHBlY3RlZCB0byByZW1haW4gcGVyZmVjdGx5IHVwIHRvIGRhdGUsIGJ1dCBvdWdodCB0bworYmUgZmFpcmx5IGNsb3NlLgorCisKKwlhbGxvY19zZW0KKwktLS0tLS0tLS0KKworVGhlIGFsbG9jX3NlbSBpcyBhIHBlci1maWxlc3lzdGVtIHNlbWFwaG9yZSwgdXNlZCBwcmltYXJpbHkgdG8gZW5zdXJlCitjb250aWd1b3VzIGFsbG9jYXRpb24gb2Ygc3BhY2Ugb24gdGhlIG1lZGl1bS4gSXQgaXMgYXV0b21hdGljYWxseQorb2J0YWluZWQgZHVyaW5nIHNwYWNlIGFsbG9jYXRpb25zIChqZmZzMl9yZXNlcnZlX3NwYWNlKCkpIGFuZCBmcmVlZAordXBvbiB3cml0ZSBjb21wbGV0aW9uIChqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbigpKS4gTm90ZSB0aGF0Cit0aGUgZ2FyYmFnZSBjb2xsZWN0b3Igd2lsbCBvYnRhaW4gdGhpcyByaWdodCBhdCB0aGUgYmVnaW5uaW5nIG9mCitqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcygpIGFuZCByZWxlYXNlIGl0IGF0IHRoZSBlbmQsIHRoZXJlYnkKK3ByZXZlbnRpbmcgYW55IG90aGVyIHdyaXRlIGFjdGl2aXR5IG9uIHRoZSBmaWxlIHN5c3RlbSBkdXJpbmcgYQorZ2FyYmFnZSBjb2xsZWN0IHBhc3MuCisKK1doZW4gd3JpdGluZyBuZXcgbm9kZXMsIHRoZSBhbGxvY19zZW0gbXVzdCBiZSBoZWxkIHVudGlsIHRoZSBuZXcgbm9kZXMKK2hhdmUgYmVlbiBwcm9wZXJseSBsaW5rZWQgaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgaW5vZGUgdG8KK3doaWNoIHRoZXkgYmVsb25nLiBUaGlzIGlzIGZvciB0aGUgYmVuZWZpdCBvZiBOQU5EIGZsYXNoIC0gYWRkaW5nIG5ldworbm9kZXMgdG8gYW4gaW5vZGUgbWF5IG9ic29sZXRlIG9sZCBvbmVzLCBhbmQgYnkgaG9sZGluZyB0aGUgYWxsb2Nfc2VtCit1bnRpbCB0aGlzIGhhcHBlbnMgd2UgZW5zdXJlIHRoYXQgYW55IGRhdGEgaW4gdGhlIHdyaXRlLWJ1ZmZlciBhdCB0aGUKK3RpbWUgdGhpcyBoYXBwZW5zIGFyZSBwYXJ0IG9mIHRoZSBuZXcgbm9kZSwgbm90IGp1c3Qgc29tZXRoaW5nIHRoYXQKK3dhcyB3cml0dGVuIGFmdGVyd2FyZHMuIEhlbmNlLCB3ZSBjYW4gZW5zdXJlIHRoZSBuZXdseS1vYnNvbGV0ZWQgbm9kZXMKK2Rvbid0IGFjdHVhbGx5IGdldCBlcmFzZWQgdW50aWwgdGhlIHdyaXRlLWJ1ZmZlciBoYXMgYmVlbiBmbHVzaGVkIHRvCit0aGUgbWVkaXVtLgorCitXaXRoIHRoZSBpbnRyb2R1Y3Rpb24gb2YgTkFORCBmbGFzaCBzdXBwb3J0IGFuZCB0aGUgd3JpdGUtYnVmZmVyLCAKK3RoZSBhbGxvY19zZW0gaXMgYWxzbyB1c2VkIHRvIHByb3RlY3QgdGhlIHdidWYtcmVsYXRlZCBtZW1iZXJzIG9mIHRoZQoramZmczJfc2JfaW5mbyBzdHJ1Y3R1cmUuIEF0b21pY2FsbHkgcmVhZGluZyB0aGUgd2J1Zl9sZW4gbWVtYmVyIHRvIHNlZQoraWYgdGhlIHdidWYgaXMgY3VycmVudGx5IGhvbGRpbmcgYW55IGRhdGEgaXMgcGVybWl0dGVkLCB0aG91Z2guCisKK09yZGVyaW5nIGNvbnN0cmFpbnRzOiBTZWUgZi0+c2VtLgorCisKKwlGaWxlIFNlbWFwaG9yZSBmLT5zZW0KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBpcyB0aGUgSkZGUzItaW50ZXJuYWwgZXF1aXZhbGVudCBvZiB0aGUgaW5vZGUgc2VtYXBob3JlIGktPmlfc2VtLgorSXQgcHJvdGVjdHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBqZmZzMl9pbm9kZV9pbmZvIHByaXZhdGUgaW5vZGUgZGF0YSwKK2luY2x1ZGluZyB0aGUgbGlua2VkIGxpc3Qgb2Ygbm9kZSBmcmFnbWVudHMgKGJ1dCBzZWUgdGhlIG5vdGVzIGJlbG93IG9uCitlcmFzZV9jb21wbGV0aW9uX2xvY2spLCBldGMuCisKK1RoZSByZWFzb24gdGhhdCB0aGUgaV9zZW0gaXRzZWxmIGlzbid0IHVzZWQgZm9yIHRoaXMgcHVycG9zZSBpcyB0bworYXZvaWQgZGVhZGxvY2tzIHdpdGggZ2FyYmFnZSBjb2xsZWN0aW9uIC0tIHRoZSBWRlMgd2lsbCBsb2NrIHRoZSBpX3NlbQorYmVmb3JlIGNhbGxpbmcgYSBmdW5jdGlvbiB3aGljaCBtYXkgbmVlZCB0byBhbGxvY2F0ZSBzcGFjZS4gVGhlCithbGxvY2F0aW9uIG1heSB0cmlnZ2VyIGdhcmJhZ2UtY29sbGVjdGlvbiwgd2hpY2ggbWF5IG5lZWQgdG8gbW92ZSBhCitub2RlIGJlbG9uZ2luZyB0byB0aGUgaW5vZGUgd2hpY2ggd2FzIGxvY2tlZCBpbiB0aGUgZmlyc3QgcGxhY2UgYnkgdGhlCitWRlMuIElmIHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gY29kZSB3ZXJlIHRvIGF0dGVtcHQgdG8gbG9jayB0aGUgaV9zZW0KK29mIHRoZSBpbm9kZSBmcm9tIHdoaWNoIGl0J3MgZ2FyYmFnZS1jb2xsZWN0aW5nIGEgcGh5c2ljYWwgbm9kZSwgdGhpcworbGVhZCB0byBkZWFkbG9jaywgdW5sZXNzIHdlIHBsYXllZCBnYW1lcyB3aXRoIHVubG9ja2luZyB0aGUgaV9zZW0KK2JlZm9yZSBjYWxsaW5nIHRoZSBzcGFjZSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KKworSW5zdGVhZCBvZiBwbGF5aW5nIHN1Y2ggZ2FtZXMsIHdlIGp1c3QgaGF2ZSBhbiBleHRyYSBpbnRlcm5hbAorc2VtYXBob3JlLCB3aGljaCBpcyBvYnRhaW5lZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0aW9uIGNvZGUgYW5kIGFsc28KK2J5IHRoZSBub3JtYWwgZmlsZSBzeXN0ZW0gY29kZSBfYWZ0ZXJfIGFsbG9jYXRpb24gb2Ygc3BhY2UuCisKK09yZGVyaW5nIGNvbnN0cmFpbnRzOiAKKworCTEuIE5ldmVyIGF0dGVtcHQgdG8gYWxsb2NhdGUgc3BhY2Ugb3IgbG9jayBhbGxvY19zZW0gd2l0aCAKKwkgICBhbnkgZi0+c2VtIGhlbGQuCisJMi4gTmV2ZXIgYXR0ZW1wdCB0byBsb2NrIHR3byBmaWxlIHNlbWFwaG9yZXMgaW4gb25lIHRocmVhZC4KKwkgICBObyBvcmRlcmluZyBydWxlcyBoYXZlIGJlZW4gbWFkZSBmb3IgZG9pbmcgc28uCisKKworCWVyYXNlX2NvbXBsZXRpb25fbG9jayBzcGlubG9jaworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGlzIHVzZWQgdG8gc2VyaWFsaXNlIGFjY2VzcyB0byB0aGUgZXJhc2VibG9jayBsaXN0cywgdG8gdGhlCitwZXItZXJhc2VibG9jayBsaXN0cyBvZiBwaHlzaWNhbCBqZmZzMl9yYXdfbm9kZV9yZWYgc3RydWN0dXJlcywgYW5kCisoTkIpIHRoZSBwZXItaW5vZGUgbGlzdCBvZiBwaHlzaWNhbCBub2Rlcy4gVGhlIGxhdHRlciBpcyBhIHNwZWNpYWwKK2Nhc2UgLSBzZWUgYmVsb3cuCisKK0FzIHRoZSBNVEQgQVBJIG5vIGxvbmdlciBwZXJtaXRzIGVyYXNlLWNvbXBsZXRpb24gY2FsbGJhY2sgZnVuY3Rpb25zCit0byBiZSBjYWxsZWQgZnJvbSBib3R0b20taGFsZiAodGltZXIpIGNvbnRleHQgKG9uIHRoZSBiYXNpcyB0aGF0IG5vYm9keQorZXZlciBhY3R1YWxseSBpbXBsZW1lbnRlZCBzdWNoIGEgdGhpbmcpLCBpdCdzIG5vdyBzdWZmaWNpZW50IHRvIHVzZQorYSBzaW1wbGUgc3Bpbl9sb2NrKCkgcmF0aGVyIHRoYW4gc3Bpbl9sb2NrX2JoKCkuCisKK05vdGUgdGhhdCB0aGUgcGVyLWlub2RlIGxpc3Qgb2YgcGh5c2ljYWwgbm9kZXMgKGYtPm5vZGVzKSBpcyBhIHNwZWNpYWwKK2Nhc2UuIEFueSBjaGFuZ2VzIHRvIF92YWxpZF8gbm9kZXMgKGkuZS4gLT5mbGFzaF9vZmZzZXQgJiAxID09IDApIGluCit0aGUgbGlzdCBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBmaWxlIHNlbWFwaG9yZSBmLT5zZW0uIEJ1dCB0aGUgZXJhc2UKK2NvZGUgbWF5IHJlbW92ZSBfb2Jzb2xldGVfIG5vZGVzIGZyb20gdGhlIGxpc3Qgd2hpbGUgaG9sZGluZyBvbmx5IHRoZQorZXJhc2VfY29tcGxldGlvbl9sb2NrLiBTbyB5b3UgY2FuIHdhbGsgdGhlIGxpc3Qgb25seSB3aGlsZSBob2xkaW5nIHRoZQorZXJhc2VfY29tcGxldGlvbl9sb2NrLCBhbmQgY2FuIGRyb3AgdGhlIGxvY2sgdGVtcG9yYXJpbHkgbWlkLXdhbGsgYXMKK2xvbmcgYXMgdGhlIHBvaW50ZXIgeW91J3JlIGhvbGRpbmcgaXMgdG8gYSBfdmFsaWRfIG5vZGUsIG5vdCBhbgorb2Jzb2xldGUgb25lLgorCitUaGUgZXJhc2VfY29tcGxldGlvbl9sb2NrIGlzIGFsc28gdXNlZCB0byBwcm90ZWN0IHRoZSBjLT5nY190YXNrCitwb2ludGVyIHdoZW4gdGhlIGdhcmJhZ2UgY29sbGVjdGlvbiB0aHJlYWQgZXhpdHMuIFRoZSBjb2RlIHRvIGtpbGwgdGhlCitHQyB0aHJlYWQgbG9ja3MgaXQsIHNlbmRzIHRoZSBzaWduYWwsIHRoZW4gdW5sb2NrcyBpdCAtIHdoaWxlIHRoZSBHQwordGhyZWFkIGl0c2VsZiBsb2NrcyBpdCwgemVyb2VzIGMtPmdjX3Rhc2ssIHRoZW4gdW5sb2NrcyBvbiB0aGUgZXhpdCBwYXRoLgorCisKKwlpbm9jYWNoZV9sb2NrIHNwaW5sb2NrCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHNwaW5sb2NrIHByb3RlY3RzIHRoZSBoYXNoZWQgbGlzdCAoYy0+aW5vY2FjaGVfbGlzdCkgb2YgdGhlCitpbi1jb3JlIGpmZnMyX2lub2RlX2NhY2hlIG9iamVjdHMgKGVhY2ggaW5vZGUgaW4gSkZGUzIgaGFzIHRoZQorY29ycmVzcG9uZGVudCBqZmZzMl9pbm9kZV9jYWNoZSBvYmplY3QpLiBTbywgdGhlIGlub2NhY2hlX2xvY2sKK2hhcyB0byBiZSBsb2NrZWQgd2hpbGUgd2Fsa2luZyB0aGUgYy0+aW5vY2FjaGVfbGlzdCBoYXNoIGJ1Y2tldHMuCisKK05vdGUsIHRoZSBmLT5zZW0gZ3VhcmFudGVlcyB0aGF0IHRoZSBjb3JyZXNwb25kZW50IGpmZnMyX2lub2RlX2NhY2hlCit3aWxsIG5vdCBiZSByZW1vdmVkLiBTbywgaXQgaXMgYWxsb3dlZCB0byBhY2Nlc3MgaXQgd2l0aG91dCBsb2NraW5nCit0aGUgaW5vY2FjaGVfbG9jayBzcGlubG9jay4gCisKK09yZGVyaW5nIGNvbnN0cmFpbnRzOiAKKworCUlmIGJvdGggZXJhc2VfY29tcGxldGlvbl9sb2NrIGFuZCBpbm9jYWNoZV9sb2NrIGFyZSBuZWVkZWQsIHRoZQorCWMtPmVyYXNlX2NvbXBsZXRpb24gaGFzIHRvIGJlIGFjcXVpcmVkIGZpcnN0LgorCisKKwllcmFzZV9mcmVlX3NlbQorCS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgc2VtYXBob3JlIGlzIG9ubHkgdXNlZCBieSB0aGUgZXJhc2UgY29kZSB3aGljaCBmcmVlcyBvYnNvbGV0ZQorbm9kZSByZWZlcmVuY2VzIGFuZCB0aGUgamZmczJfZ2FyYmFnZV9jb2xsZWN0X2RlbGV0aW9uX2RpcmVudCgpCitmdW5jdGlvbi4gVGhlIGxhdHRlciBmdW5jdGlvbiBvbiBOQU5EIGZsYXNoIG11c3QgcmVhZCBfb2Jzb2xldGVfIG5vZGVzCit0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgJ2RlbGV0aW9uIGRpcmVudCcgdW5kZXIgY29uc2lkZXJhdGlvbiBjYW4gYmUKK2Rpc2NhcmRlZCBvciB3aGV0aGVyIGl0IGlzIHN0aWxsIHJlcXVpcmVkIHRvIHNob3cgdGhhdCBhbiBpbm9kZSBoYXMKK2JlZW4gdW5saW5rZWQuIEJlY2F1c2UgcmVhZGluZyBmcm9tIHRoZSBmbGFzaCBtYXkgc2xlZXAsIHRoZQorZXJhc2VfY29tcGxldGlvbl9sb2NrIGNhbm5vdCBiZSBoZWxkLCBzbyBhbiBhbHRlcm5hdGl2ZSwgbW9yZQoraGVhdnl3ZWlnaHQgbG9jayB3YXMgcmVxdWlyZWQgdG8gcHJldmVudCB0aGUgZXJhc2UgY29kZSBmcm9tIGZyZWVpbmcKK3RoZSBqZmZzMl9yYXdfbm9kZV9yZWYgc3RydWN0dXJlcyBpbiBxdWVzdGlvbiB3aGlsZSB0aGUgZ2FyYmFnZQorY29sbGVjdGlvbiBjb2RlIGlzIGxvb2tpbmcgYXQgdGhlbS4KKworU3VnZ2VzdGlvbnMgZm9yIGFsdGVybmF0aXZlIHNvbHV0aW9ucyB0byB0aGlzIHByb2JsZW0gd291bGQgYmUgd2VsY29tZWQuCisKKworCXdidWZfc2VtCisJLS0tLS0tLS0KKworVGhpcyByZWFkL3dyaXRlIHNlbWFwaG9yZSBwcm90ZWN0cyBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzIHRvIHRoZQord3JpdGUtYmVoaW5kIGJ1ZmZlciAoJ3didWYnKSB1c2VkIGZvciBmbGFzaCBjaGlwcyB3aGVyZSB3ZSBtdXN0IHdyaXRlCitpbiBibG9ja3MuIEl0IHByb3RlY3RzIGJvdGggdGhlIGNvbnRlbnRzIG9mIHRoZSB3YnVmIGFuZCB0aGUgbWV0YWRhdGEKK3doaWNoIGluZGljYXRlcyB3aGljaCBmbGFzaCByZWdpb24gKGlmIGFueSkgaXMgY3VycmVudGx5IGNvdmVyZWQgYnkgCit0aGUgYnVmZmVyLgorCitPcmRlcmluZyBjb25zdHJhaW50czoKKwlMb2NrIHdidWZfc2VtIGxhc3QsIGFmdGVyIHRoZSBhbGxvY19zZW0gb3IgYW5kIGYtPnNlbS4KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL1RPRE8gYi9mcy9qZmZzMi9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZmY4MmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9UT0RPCkBAIC0wLDAgKzEsNDAgQEAKKyRJZDogVE9ETyx2IDEuMTAgMjAwMi8wOS8wOSAxNjozMToyMSBkd213MiBFeHAgJAorCisgLSBkaXNhYmxlIGNvbXByZXNzaW9uIGluIGNvbW1pdF93cml0ZSgpPworIC0gZmluZS10dW5lIHRoZSBhbGxvY2F0aW9uIC8gR0MgdGhyZXNob2xkcworIC0gY2hhdHRyIHN1cHBvcnQgLSB0dXJuaW5nIG9uL29mZiBhbmQgdHVuaW5nIGNvbXByZXNzaW9uIHBlci1pbm9kZQorIC0gY2hlY2twb2ludGluZyAoZG8gd2UgbmVlZCB0aGlzPyBzY2FuIGlzIHF1aXRlIGZhc3QpCisgLSBtYWtlIHRoZSBzY2FuIGNvZGUgcG9wdWxhdGUgcmVhbCBpbm9kZXMgc28gcmVhZF9pbm9kZSBqdXN0IGFmdGVyIAorCW1vdW50IGRvZXNuJ3QgaGF2ZSB0byByZWFkIHRoZSBmbGFzaCB0d2ljZSBmb3IgbGFyZ2UgZmlsZXMuCisJTWFrZSB0aGlzIGEgcGVyLWlub2RlIG9wdGlvbiwgY2hhbmdhYmxlIHdpdGggY2hhdHRyLCBzbyB5b3UgY2FuCisJZGVjaWRlIHdoaWNoIGlub2RlcyBzaG91bGQgYmUgaW4tY29yZSBpbW1lZGlhdGVseSBhZnRlciBtb3VudC4KKyAtIHRlc3QsIHRlc3QsIHRlc3QKKworIC0gTkFORCBmbGFzaCBzdXBwb3J0OgorCS0gZmx1c2hfd2J1ZiB1c2luZyBHQyB0byBmaWxsIGl0LCBkb24ndCBqdXN0IHBhZC4KKwktIERlYWwgd2l0aCB3cml0ZSBlcnJvcnMuIERhdGEgZG9uJ3QgZ2V0IGxvc3QgLSB3ZSBqdXN0IGhhdmUgdG8gd3JpdGUgCisJICB0aGUgYWZmZWN0ZWQgbm9kZShzKSBvdXQgYWdhaW4gc29tZXdoZXJlIGVsc2UuCisJLSBtYWtlIGZzeW5jIGZsdXNoIG9ubHkgaWYgYWN0dWFsbHkgcmVxdWlyZWQKKwktIG1ha2Ugc3lzX3N5bmMoKSB3b3JrLgorCS0gcmVib290IG5vdGlmaWVyCisJLSB0aW1lZCBmbHVzaCBvZiBvbGQgd2J1ZgorCS0gZml4IG1hZ2ljYWwgc2Vjb25kIGFyZyBvZiBqZmZzMl9mbHVzaF93YnVmKCkuIFNwbGl0IGludG8gdHdvIG9yIG1vcmUgZnVuY3Rpb25zIGluc3RlYWQuCisKKworIC0gT3B0aW1pc2F0aW9uczoKKyAgIC0gU3RvcCBHQyBmcm9tIGRlY29tcHJlc3NpbmcgYW5kIGltbWVkaWF0ZWx5IHJlY29tcHJlc3Npbmcgbm9kZXMgd2hpY2ggY291bGQKKyAgICAganVzdCBiZSBjb3BpZWQgaW50YWN0LiAoV2Ugbm93IGtlZXAgdHJhY2sgb2YgUkVGX1BSSVNUSU5FIGZsYWcuIEVhc3kgbm93LikKKyAgIC0gRnVydGhlcm1vcmUsIGluIHRoZSBjYXNlIHdoZXJlIGl0IGNvdWxkIGJlIGNvcGllZCBpbnRhY3Qgd2UgZG9uJ3QgZXZlbiBuZWVkCisgICAgIHRvIGNhbGwgaWdldCgpIGZvciBpdCAtLSBpZiB3ZSB1c2UgKHJhd19ub2RlX3Jhdy0+Zmxhc2hfb2Zmc2V0ICYgMikgYXMgYSBmbGFnCisgICAgIHRvIHNob3cgYSBub2RlIGNhbiBiZSBjb3BpZWQgaW50YWN0IGFuZCBpdCdzIF9ub3RfIGluIGljYWNoZSwgd2UgY291bGQganVzdCBkbworICAgICBpdCwgZml4IHVwIHRoZSBuZXh0X2luX2lubyBsaXN0IGFuZCBtb3ZlIG9uLiBXZSB3b3VsZCBuZWVkIGEgd2F5IHRvIGZpbmQgb3V0CisgICAgIF93aGV0aGVyXyBpdCdzIGluIGljYWNoZSB0aG91Z2ggLS0gaWYgaXQncyBpbiBpY2FjaGUgd2UgYWxzbyBuZWVkIHRvIGRvIHRoZSAKKyAgICAgZnJhZ21lbnQgbGlzdHMsIGV0Yy4gUCdyYXBzIGEgZmxhZyBvciBwb2ludGVyIGluIHRoZSBqZmZzMl9pbm9kZV9jYWNoZSBjb3VsZAorICAgICBoZWxwLiAoV2UgaGF2ZSBoYWxmIG9mIHRoaXMgbm93LikKKyAgIC0gU3RvcCBrZWVwaW5nIG5hbWUgaW4tY29yZSB3aXRoIHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudC4gSWYgd2Uga2VlcCB0aGUgaGFzaCBpbiAKKyAgICAgdGhlIGZ1bGwgZGlyZW50LCB3ZSBvbmx5IG5lZWQgdG8gZ28gdG8gdGhlIGZsYXNoIGluIGxvb2t1cCgpIHdoZW4gd2UgdGhpbmsgd2UndmUKKyAgICAgZ290IGEgbWF0Y2gsIGFuZCBpbiByZWFkZGlyKCkuIAorICAgLSBEb3VibHktbGlua2VkIG5leHRfaW5faW5vIGxpc3QgdG8gYWxsb3cgdXMgdG8gZnJlZSBvYnNvbGV0ZWQgcmF3X25vZGVfcmVmcyBpbW1lZGlhdGVseT8KKyAgIC0gUmVtb3ZlIHRvdGxlbiBmcm9tIGpmZnMyX3Jhd19ub2RlX3JlZj8gTmVlZCB0byBoYXZlIHRvdGxlbiBwYXNzZWQgaW50bworCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZSgpLiBDYW4gYWxsIGNhbGxlcnMgd29yayBpdCBvdXQ/CisgICAtIFJlbW92ZSBzaXplIGZyb20gamZmczJfcmF3X25vZGVfZnJhZy4gCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9iYWNrZ3JvdW5kLmMgYi9mcy9qZmZzMi9iYWNrZ3JvdW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlNmRlMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL2JhY2tncm91bmQuYwpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIENyZWF0ZWQgYnkgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICoKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCisgKgorICogJElkOiBiYWNrZ3JvdW5kLmMsdiAxLjUwIDIwMDQvMTEvMTYgMjA6MzY6MTAgZHdtdzIgRXhwICQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2pmZnMyLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlICJub2RlbGlzdC5oIgorCisKK3N0YXRpYyBpbnQgamZmczJfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZCh2b2lkICopOworCit2b2lkIGpmZnMyX2dhcmJhZ2VfY29sbGVjdF90cmlnZ2VyKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKyAgICAgICAgaWYgKGMtPmdjX3Rhc2sgJiYgamZmczJfdGhyZWFkX3Nob3VsZF93YWtlKGMpKQorICAgICAgICAgICAgICAgIHNlbmRfc2lnKFNJR0hVUCwgYy0+Z2NfdGFzaywgMSk7CisJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7Cit9CisKKy8qIFRoaXMgbXVzdCBvbmx5IGV2ZXIgYmUgY2FsbGVkIHdoZW4gbm8gR0MgdGhyZWFkIGlzIGN1cnJlbnRseSBydW5uaW5nICovCitpbnQgamZmczJfc3RhcnRfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlwaWRfdCBwaWQ7CisJaW50IHJldCA9IDA7CisKKwlpZiAoYy0+Z2NfdGFzaykKKwkJQlVHKCk7CisKKwlpbml0X01VVEVYX0xPQ0tFRCgmYy0+Z2NfdGhyZWFkX3N0YXJ0KTsKKwlpbml0X2NvbXBsZXRpb24oJmMtPmdjX3RocmVhZF9leGl0KTsKKworCXBpZCA9IGtlcm5lbF90aHJlYWQoamZmczJfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZCwgYywgQ0xPTkVfRlN8Q0xPTkVfRklMRVMpOworCWlmIChwaWQgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImZvcmsgZmFpbGVkIGZvciBKRkZTMiBnYXJiYWdlIGNvbGxlY3QgdGhyZWFkOiAlZFxuIiwgLXBpZCk7CisJCWNvbXBsZXRlKCZjLT5nY190aHJlYWRfZXhpdCk7CisJCXJldCA9IHBpZDsKKwl9IGVsc2UgeworCQkvKiBXYWl0IGZvciBpdC4uLiAqLworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiSkZGUzI6IEdhcmJhZ2UgY29sbGVjdCB0aHJlYWQgaXMgcGlkICVkXG4iLCBwaWQpKTsKKwkJZG93bigmYy0+Z2NfdGhyZWFkX3N0YXJ0KTsKKwl9CisgCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBqZmZzMl9zdG9wX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpCit7CisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCWlmIChjLT5nY190YXNrKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMjogS2lsbGluZyBHQyB0YXNrICVkXG4iLCBjLT5nY190YXNrLT5waWQpKTsKKwkJc2VuZF9zaWcoU0lHS0lMTCwgYy0+Z2NfdGFzaywgMSk7CisJfQorCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmMtPmdjX3RocmVhZF9leGl0KTsKK30KKworc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKHZvaWQgKl9jKQoreworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjID0gX2M7CisKKwlkYWVtb25pemUoImpmZnMyX2djZF9tdGQlZCIsIGMtPm10ZC0+aW5kZXgpOworCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKKwlhbGxvd19zaWduYWwoU0lHU1RPUCk7CisJYWxsb3dfc2lnbmFsKFNJR0NPTlQpOworCisJYy0+Z2NfdGFzayA9IGN1cnJlbnQ7CisJdXAoJmMtPmdjX3RocmVhZF9zdGFydCk7CisKKwlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIDEwKTsKKworCWZvciAoOzspIHsKKwkJYWxsb3dfc2lnbmFsKFNJR0hVUCk7CisKKwkJaWYgKCFqZmZzMl90aHJlYWRfc2hvdWxkX3dha2UoYykpIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlIChUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQgc2xlZXBpbmcuLi5cbiIpKTsKKwkJCS8qIFllcywgdGhlcmUncyBhIHJhY2UgaGVyZTsgd2UgY2hlY2tlZCBqZmZzMl90aHJlYWRfc2hvdWxkX3dha2UoKQorCQkJICAgYmVmb3JlIHNldHRpbmcgY3VycmVudC0+c3RhdGUgdG8gVEFTS19JTlRFUlJVUFRJQkxFLiBCdXQgaXQgZG9lc24ndAorCQkJICAgbWF0dGVyIC0gV2UgZG9uJ3QgY2FyZSBpZiB3ZSBtaXNzIGEgd2FrZXVwLCBiZWNhdXNlIHRoZSBHQyB0aHJlYWQKKwkJCSAgIGlzIG9ubHkgYW4gb3B0aW1pc2F0aW9uIGFueXdheS4gKi8KKwkJCXNjaGVkdWxlKCk7CisJCX0KKworCQlpZiAodHJ5X3RvX2ZyZWV6ZSgwKSkKKwkJCWNvbnRpbnVlOworCisJCWNvbmRfcmVzY2hlZCgpOworCisJCS8qIFB1dF9zdXBlciB3aWxsIHNlbmQgYSBTSUdLSUxMIGFuZCB0aGVuIHdhaXQgb24gdGhlIHNlbS4gCisJCSAqLworCQl3aGlsZSAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXNpZ2luZm9fdCBpbmZvOworCQkJdW5zaWduZWQgbG9uZyBzaWducjsKKworCQkJc2lnbnIgPSBkZXF1ZXVlX3NpZ25hbF9sb2NrKGN1cnJlbnQsICZjdXJyZW50LT5ibG9ja2VkLCAmaW5mbyk7CisKKwkJCXN3aXRjaChzaWducikgeworCQkJY2FzZSBTSUdTVE9QOgorCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKCk6IFNJR1NUT1AgcmVjZWl2ZWQuXG4iKSk7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19TVE9QUEVEKTsKKwkJCQlzY2hlZHVsZSgpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNJR0tJTEw6CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQoKTogU0lHS0lMTCByZWNlaXZlZC5cbiIpKTsKKwkJCQlnb3RvIGRpZTsKKworCQkJY2FzZSBTSUdIVVA6CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQoKTogU0lHSFVQIHJlY2VpdmVkLlxuIikpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZCgpOiBzaWduYWwgJWxkIHJlY2VpdmVkXG4iLCBzaWducikpOworCQkJfQorCQl9CisJCS8qIFdlIGRvbid0IHdhbnQgU0lHSFVQIHRvIGludGVycnVwdCB1cy4gU1RPUCBhbmQgS0lMTCBhcmUgT0sgdGhvdWdoLiAqLworCQlkaXNhbGxvd19zaWduYWwoU0lHSFVQKTsKKworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZCgpOiBwYXNzXG4iKSk7CisJCWlmIChqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcyhjKSA9PSAtRU5PU1BDKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5vIHNwYWNlIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24uIEFib3J0aW5nIEdDIHRocmVhZFxuIik7CisJCQlnb3RvIGRpZTsKKwkJfQorCX0KKyBkaWU6CisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCWMtPmdjX3Rhc2sgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCWNvbXBsZXRlX2FuZF9leGl0KCZjLT5nY190aHJlYWRfZXhpdCwgMCk7Cit9CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9idWlsZC5jIGIvZnMvamZmczIvYnVpbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDFkZDVmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZmczIvYnVpbGQuYwpAQCAtMCwwICsxLDM3MSBAQAorLyoKKyAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIENyZWF0ZWQgYnkgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICoKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCisgKgorICogJElkOiBidWlsZC5jLHYgMS42OSAyMDA0LzEyLzE2IDIwOjIyOjE4IGRtYXJsaW4gRXhwICQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSAibm9kZWxpc3QuaCIKKworc3RhdGljIHZvaWQgamZmczJfYnVpbGRfcmVtb3ZlX3VubGlua2VkX2lub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICosIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqLCBzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKiopOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqCitmaXJzdF9pbm9kZV9jaGFpbihpbnQgKmksIHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCWZvciAoOyAqaSA8IElOT0NBQ0hFX0hBU0hTSVpFOyAoKmkpKyspIHsKKwkJaWYgKGMtPmlub2NhY2hlX2xpc3RbKmldKQorCQkJcmV0dXJuIGMtPmlub2NhY2hlX2xpc3RbKmldOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKgorbmV4dF9pbm9kZShpbnQgKmksIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqaWMsIHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCS8qIE1vcmUgaW4gdGhpcyBjaGFpbj8gKi8KKwlpZiAoaWMtPm5leHQpCisJCXJldHVybiBpYy0+bmV4dDsKKwkoKmkpKys7CisJcmV0dXJuIGZpcnN0X2lub2RlX2NoYWluKGksIGMpOworfQorCisjZGVmaW5lIGZvcl9lYWNoX2lub2RlKGksIGMsIGljKQkJCVwKKwlmb3IgKGkgPSAwLCBpYyA9IGZpcnN0X2lub2RlX2NoYWluKCZpLCAoYykpOwlcCisJICAgICBpYzsJCQkJCVwKKwkgICAgIGljID0gbmV4dF9pbm9kZSgmaSwgaWMsIChjKSkpCisKKworc3RhdGljIGlubGluZSB2b2lkIGpmZnMyX2J1aWxkX2lub2RlX3Bhc3MxKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKmljKQoreworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQ7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfYnVpbGRfaW5vZGUgYnVpbGRpbmcgZGlyZWN0b3J5IGlub2RlICMldVxuIiwgaWMtPmlubykpOworCisJLyogRm9yIGVhY2ggY2hpbGQsIGluY3JlYXNlIG5saW5rICovCisJZm9yKGZkID0gaWMtPnNjYW5fZGVudHM7IGZkOyBmZCA9IGZkLT5uZXh0KSB7CisJCXN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqY2hpbGRfaWM7CisJCWlmICghZmQtPmlubykKKwkJCWNvbnRpbnVlOworCisJCS8qIFhYWDogQ2FuIGdldCBoaWdoIGxhdGVuY3kgaGVyZSB3aXRoIGh1Z2UgZGlyZWN0b3JpZXMgKi8KKworCQljaGlsZF9pYyA9IGpmZnMyX2dldF9pbm9fY2FjaGUoYywgZmQtPmlubyk7CisJCWlmICghY2hpbGRfaWMpIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiRWVwLiBDaGlsZCBcIiVzXCIgKGlubyAjJXUpIG9mIGRpciBpbm8gIyV1IGRvZXNuJ3QgZXhpc3QhXG4iLAorCQkJCSAgZmQtPm5hbWUsIGZkLT5pbm8sIGljLT5pbm8pOworCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGZkLT5yYXcpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoY2hpbGRfaWMtPm5saW5rKysgJiYgZmQtPnR5cGUgPT0gRFRfRElSKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkNoaWxkIGRpciBcIiVzXCIgKGlubyAjJXUpIG9mIGRpciBpbm8gIyV1IGFwcGVhcnMgdG8gYmUgYSBoYXJkIGxpbmtcbiIsIGZkLT5uYW1lLCBmZC0+aW5vLCBpYy0+aW5vKTsKKwkJCWlmIChmZC0+aW5vID09IDEgJiYgaWMtPmlubyA9PSAxKSB7CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJUaGlzIGlzIG1vc3RseSBoYXJtbGVzcywgYW5kIHByb2JhYmx5IGNhdXNlZCBieSBjcmVhdGluZyBhIEpGRlMyIGltYWdlXG4iKTsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgInVzaW5nIGEgYnVnZ3kgdmVyc2lvbiBvZiBta2ZzLmpmZnMyLiBVc2UgYXQgbGVhc3QgdjEuMTcuXG4iKTsKKwkJCX0KKwkJCS8qIFdoYXQgZG8gd2UgZG8gYWJvdXQgaXQ/ICovCisJCX0KKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkluY3JlYXNlZCBubGluayBmb3IgY2hpbGQgXCIlc1wiIChpbm8gIyV1KVxuIiwgZmQtPm5hbWUsIGZkLT5pbm8pKTsKKwkJLyogQ2FuJ3QgZnJlZSB0aGVtLiBXZSBtaWdodCBuZWVkIHRoZW0gaW4gcGFzcyAyICovCisJfQorfQorCisvKiBTY2FuIHBsYW46CisgLSBTY2FuIHBoeXNpY2FsIG5vZGVzLiBCdWlsZCBtYXAgb2YgaW5vZGVzL2RpcmVudHMuIEFsbG9jYXRlIGlub2NhY2hlcyBhcyB3ZSBnbworIC0gU2NhbiBkaXJlY3RvcnkgdHJlZSBmcm9tIHRvcCBkb3duLCBzZXR0aW5nIG5saW5rIGluIGlub2NhY2hlcworIC0gU2NhbiBpbm9jYWNoZXMgZm9yIGlub2RlcyB3aXRoIG5saW5rPT0wCisqLworc3RhdGljIGludCBqZmZzMl9idWlsZF9maWxlc3lzdGVtKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCWludCByZXQ7CisJaW50IGk7CisJc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICppYzsKKwlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkOworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZGVhZF9mZHMgPSBOVUxMOworCisJLyogRmlyc3QsIHNjYW4gdGhlIG1lZGl1bSBhbmQgYnVpbGQgYWxsIHRoZSBpbm9kZSBjYWNoZXMgd2l0aAorCSAgIGxpc3RzIG9mIHBoeXNpY2FsIG5vZGVzICovCisKKwljLT5mbGFncyB8PSBKRkZTMl9TQl9GTEFHX01PVU5USU5HOworCXJldCA9IGpmZnMyX3NjYW5fbWVkaXVtKGMpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdDsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJTY2FubmVkIGZsYXNoIGNvbXBsZXRlbHlcbiIpKTsKKwlEMihqZmZzMl9kdW1wX2Jsb2NrX2xpc3RzKGMpKTsKKworCS8qIE5vdyBzY2FuIHRoZSBkaXJlY3RvcnkgdHJlZSwgaW5jcmVhc2luZyBubGluayBhY2NvcmRpbmcgdG8gZXZlcnkgZGlyZW50IGZvdW5kLiAqLworCWZvcl9lYWNoX2lub2RlKGksIGMsIGljKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJQYXNzIDE6IGlubyAjJXVcbiIsIGljLT5pbm8pKTsKKworCQlEMShCVUdfT04oaWMtPmlubyA+IGMtPmhpZ2hlc3RfaW5vKSk7CisKKwkJaWYgKGljLT5zY2FuX2RlbnRzKSB7CisJCQlqZmZzMl9idWlsZF9pbm9kZV9wYXNzMShjLCBpYyk7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJfQorCX0KKwljLT5mbGFncyAmPSB+SkZGUzJfU0JfRkxBR19NT1VOVElORzsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJQYXNzIDEgY29tcGxldGVcbiIpKTsKKworCS8qIE5leHQsIHNjYW4gZm9yIGlub2RlcyB3aXRoIG5saW5rID09IDAgYW5kIHJlbW92ZSB0aGVtLiBJZgorCSAgIHRoZXkgd2VyZSBkaXJlY3RvcmllcywgdGhlbiBkZWNyZW1lbnQgdGhlIG5saW5rIG9mIHRoZWlyCisJICAgY2hpbGRyZW4gdG9vLCBhbmQgcmVwZWF0IHRoZSBzY2FuLiBBcyB0aGF0J3MgZ29pbmcgdG8gYmUKKwkgICBhIGZhaXJseSB1bmNvbW1vbiBvY2N1cnJlbmNlLCBpdCdzIG5vdCBzbyBldmlsIHRvIGRvIGl0IHRoaXMKKwkgICB3YXkuIFJlY3Vyc2lvbiBiYWQuICovCisJRDEocHJpbnRrKEtFUk5fREVCVUcgIlBhc3MgMiBzdGFydGluZ1xuIikpOworCisJZm9yX2VhY2hfaW5vZGUoaSwgYywgaWMpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlBhc3MgMjogaW5vICMldSwgbmxpbmsgJWQsIGljICVwLCBub2RlcyAlcFxuIiwgaWMtPmlubywgaWMtPm5saW5rLCBpYywgaWMtPm5vZGVzKSk7CisJCWlmIChpYy0+bmxpbmspCisJCQljb250aW51ZTsKKwkJCQorCQlqZmZzMl9idWlsZF9yZW1vdmVfdW5saW5rZWRfaW5vZGUoYywgaWMsICZkZWFkX2Zkcyk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0gCisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiUGFzcyAyYSBzdGFydGluZ1xuIikpOworCisJd2hpbGUgKGRlYWRfZmRzKSB7CisJCWZkID0gZGVhZF9mZHM7CisJCWRlYWRfZmRzID0gZmQtPm5leHQ7CisKKwkJaWMgPSBqZmZzMl9nZXRfaW5vX2NhY2hlKGMsIGZkLT5pbm8pOworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUmVtb3ZpbmcgZGVhZF9mZCBpbm8gIyV1IChcIiVzXCIpLCBpYyBhdCAlcFxuIiwgZmQtPmlubywgZmQtPm5hbWUsIGljKSk7CisKKwkJaWYgKGljKQorCQkJamZmczJfYnVpbGRfcmVtb3ZlX3VubGlua2VkX2lub2RlKGMsIGljLCAmZGVhZF9mZHMpOworCQlqZmZzMl9mcmVlX2Z1bGxfZGlyZW50KGZkKTsKKwl9CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiUGFzcyAyIGNvbXBsZXRlXG4iKSk7CisJCisJLyogRmluYWxseSwgd2UgY2FuIHNjYW4gYWdhaW4gYW5kIGZyZWUgdGhlIGRpcmVudCBzdHJ1Y3RzICovCisJZm9yX2VhY2hfaW5vZGUoaSwgYywgaWMpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlBhc3MgMzogaW5vICMldSwgaWMgJXAsIG5vZGVzICVwXG4iLCBpYy0+aW5vLCBpYywgaWMtPm5vZGVzKSk7CisKKwkJd2hpbGUoaWMtPnNjYW5fZGVudHMpIHsKKwkJCWZkID0gaWMtPnNjYW5fZGVudHM7CisJCQlpYy0+c2Nhbl9kZW50cyA9IGZkLT5uZXh0OworCQkJamZmczJfZnJlZV9mdWxsX2RpcmVudChmZCk7CisJCX0KKwkJaWMtPnNjYW5fZGVudHMgPSBOVUxMOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJRDEocHJpbnRrKEtFUk5fREVCVUcgIlBhc3MgMyBjb21wbGV0ZVxuIikpOworCUQyKGpmZnMyX2R1bXBfYmxvY2tfbGlzdHMoYykpOworCisJLyogUm90YXRlIHRoZSBsaXN0cyBieSBzb21lIG51bWJlciB0byBlbnN1cmUgd2VhciBsZXZlbGxpbmcgKi8KKwlqZmZzMl9yb3RhdGVfbGlzdHMoYyk7CisKKwlyZXQgPSAwOworCitleGl0OgorCWlmIChyZXQpIHsKKwkJZm9yX2VhY2hfaW5vZGUoaSwgYywgaWMpIHsKKwkJCXdoaWxlKGljLT5zY2FuX2RlbnRzKSB7CisJCQkJZmQgPSBpYy0+c2Nhbl9kZW50czsKKwkJCQlpYy0+c2Nhbl9kZW50cyA9IGZkLT5uZXh0OworCQkJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoZmQpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgamZmczJfYnVpbGRfcmVtb3ZlX3VubGlua2VkX2lub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKmljLCBzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKipkZWFkX2ZkcykKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpyYXc7CisJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZDsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJKRkZTMjogUmVtb3ZpbmcgaW5vICMldSB3aXRoIG5saW5rID09IHplcm8uXG4iLCBpYy0+aW5vKSk7CisJCisJcmF3ID0gaWMtPm5vZGVzOworCXdoaWxlIChyYXcgIT0gKHZvaWQgKilpYykgeworCQlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpuZXh0ID0gcmF3LT5uZXh0X2luX2lubzsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIm9ic29sZXRpbmcgbm9kZSBhdCAweCUwOHhcbiIsIHJlZl9vZmZzZXQocmF3KSkpOworCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgcmF3KTsKKwkJcmF3ID0gbmV4dDsKKwl9CisKKwlpZiAoaWMtPnNjYW5fZGVudHMpIHsKKwkJaW50IHdoaW5nZWQgPSAwOworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiSW5vZGUgIyV1IHdhcyBhIGRpcmVjdG9yeSB3aGljaCBtYXkgaGF2ZSBjaGlsZHJlbi4uLlxuIiwgaWMtPmlubykpOworCisJCXdoaWxlKGljLT5zY2FuX2RlbnRzKSB7CisJCQlzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKmNoaWxkX2ljOworCisJCQlmZCA9IGljLT5zY2FuX2RlbnRzOworCQkJaWMtPnNjYW5fZGVudHMgPSBmZC0+bmV4dDsKKworCQkJaWYgKCFmZC0+aW5vKSB7CisJCQkJLyogSXQncyBhIGRlbGV0aW9uIGRpcmVudC4gSWdub3JlIGl0ICovCisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkNoaWxkIFwiJXNcIiBpcyBhIGRlbGV0aW9uIGRpcmVudCwgc2tpcHBpbmcuLi5cbiIsIGZkLT5uYW1lKSk7CisJCQkJamZmczJfZnJlZV9mdWxsX2RpcmVudChmZCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXdoaW5nZWQpIHsKKwkJCQl3aGluZ2VkID0gMTsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIklub2RlICMldSB3YXMgYSBkaXJlY3Rvcnkgd2l0aCBjaGlsZHJlbiAtIHJlbW92aW5nIHRob3NlIHRvby4uLlxuIiwgaWMtPmlubyk7CisJCQl9CisKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJSZW1vdmluZyBjaGlsZCBcIiVzXCIsIGlubyAjJXVcbiIsCisJCQkJICBmZC0+bmFtZSwgZmQtPmlubykpOworCQkJCisJCQljaGlsZF9pYyA9IGpmZnMyX2dldF9pbm9fY2FjaGUoYywgZmQtPmlubyk7CisJCQlpZiAoIWNoaWxkX2ljKSB7CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJDYW5ub3QgcmVtb3ZlIGNoaWxkIFwiJXNcIiwgaW5vICMldSwgYmVjYXVzZSBpdCBkb2Vzbid0IGV4aXN0XG4iLCBmZC0+bmFtZSwgZmQtPmlubyk7CisJCQkJamZmczJfZnJlZV9mdWxsX2RpcmVudChmZCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIFJlZHVjZSBubGluayBvZiB0aGUgY2hpbGQuIElmIGl0J3Mgbm93IHplcm8sIHN0aWNrIGl0IG9uIHRoZSAKKwkJCSAgIGRlYWRfZmRzIGxpc3QgdG8gYmUgY2xlYW5lZCB1cCBsYXRlci4gRWxzZSBqdXN0IGZyZWUgdGhlIGZkICovCisKKwkJCWNoaWxkX2ljLT5ubGluay0tOworCQkJCisJCQlpZiAoIWNoaWxkX2ljLT5ubGluaykgeworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJJbm9kZSAjJXUgKFwiJXNcIikgaGFzIG5vdyBnb3QgemVybyBubGluay4gQWRkaW5nIHRvIGRlYWRfZmRzIGxpc3QuXG4iLAorCQkJCQkgIGZkLT5pbm8sIGZkLT5uYW1lKSk7CisJCQkJZmQtPm5leHQgPSAqZGVhZF9mZHM7CisJCQkJKmRlYWRfZmRzID0gZmQ7CisJCQl9IGVsc2UgeworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJJbm9kZSAjJXUgKFwiJXNcIikgaGFzIG5vdyBnb3QgbmxpbmsgJWQuIElnbm9yaW5nLlxuIiwKKwkJCQkJICBmZC0+aW5vLCBmZC0+bmFtZSwgY2hpbGRfaWMtPm5saW5rKSk7CisJCQkJamZmczJfZnJlZV9mdWxsX2RpcmVudChmZCk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAgIFdlIGRvbid0IGRlbGV0ZSB0aGUgaW5vY2FjaGUgZnJvbSB0aGUgaGFzaCBsaXN0IGFuZCBmcmVlIGl0IHlldC4gCisJICAgVGhlIGVyYXNlIGNvZGUgd2lsbCBkbyB0aGF0LCB3aGVuIGFsbCB0aGUgbm9kZXMgYXJlIGNvbXBsZXRlbHkgZ29uZS4KKwkqLworfQorCitzdGF0aWMgdm9pZCBqZmZzMl9jYWxjX3RyaWdnZXJfbGV2ZWxzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCXVpbnQzMl90IHNpemU7CisKKwkvKiBEZWxldGlvbiBzaG91bGQgYWxtb3N0IF9hbHdheXNfIGJlIGFsbG93ZWQuIFdlJ3JlIGZhaXJseQorCSAgIGJ1Z2dlcmVkIG9uY2Ugd2Ugc3RvcCBhbGxvd2luZyBwZW9wbGUgdG8gZGVsZXRlIHN0dWZmCisJICAgYmVjYXVzZSB0aGVyZSdzIG5vdCBlbm91Z2ggZnJlZSBzcGFjZS4uLiAqLworCWMtPnJlc3ZfYmxvY2tzX2RlbGV0aW9uID0gMjsKKworCS8qIEJlIGNvbnNlcnZhdGl2ZSBhYm91dCBob3cgbXVjaCBzcGFjZSB3ZSBuZWVkIGJlZm9yZSB3ZSBhbGxvdyB3cml0ZXMuIAorCSAgIE9uIHRvcCBvZiB0aGF0IHdoaWNoIGlzIHJlcXVpcmVkIGZvciBkZWxldGlhLCByZXF1aXJlIGFuIGV4dHJhIDIlCisJICAgb2YgdGhlIG1lZGl1bSB0byBiZSBhdmFpbGFibGUsIGZvciBvdmVyaGVhZCBjYXVzZWQgYnkgbm9kZXMgYmVpbmcKKwkgICBzcGxpdCBhY3Jvc3MgYmxvY2tzLCBldGMuICovCisKKwlzaXplID0gYy0+Zmxhc2hfc2l6ZSAvIDUwOyAvKiAyJSBvZiBmbGFzaCBzaXplICovCisJc2l6ZSArPSBjLT5ucl9ibG9ja3MgKiAxMDA7IC8qIEFuZCAxMDAgYnl0ZXMgcGVyIGVyYXNlYmxvY2sgKi8KKwlzaXplICs9IGMtPnNlY3Rvcl9zaXplIC0gMTsgLyogLi4uIGFuZCByb3VuZCB1cCAqLworCisJYy0+cmVzdl9ibG9ja3Nfd3JpdGUgPSBjLT5yZXN2X2Jsb2Nrc19kZWxldGlvbiArIChzaXplIC8gYy0+c2VjdG9yX3NpemUpOworCisJLyogV2hlbiBkbyB3ZSBsZXQgdGhlIEdDIHRocmVhZCBydW4gaW4gdGhlIGJhY2tncm91bmQgKi8KKworCWMtPnJlc3ZfYmxvY2tzX2djdHJpZ2dlciA9IGMtPnJlc3ZfYmxvY2tzX3dyaXRlICsgMTsKKworCS8qIFdoZW4gZG8gd2UgYWxsb3cgZ2FyYmFnZSBjb2xsZWN0aW9uIHRvIG1lcmdlIG5vZGVzIHRvIG1ha2UgCisJICAgbG9uZy10ZXJtIHByb2dyZXNzIGF0IHRoZSBleHBlbnNlIG9mIHNob3J0LXRlcm0gc3BhY2UgZXhoYXVzdGlvbj8gKi8KKwljLT5yZXN2X2Jsb2Nrc19nY21lcmdlID0gYy0+cmVzdl9ibG9ja3NfZGVsZXRpb24gKyAxOworCisJLyogV2hlbiBkbyB3ZSBhbGxvdyBnYXJiYWdlIGNvbGxlY3Rpb24gdG8gZWF0IGZyb20gYmFkIGJsb2NrcyByYXRoZXIKKwkgICB0aGFuIGFjdHVhbGx5IG1ha2luZyBwcm9ncmVzcz8gKi8KKwljLT5yZXN2X2Jsb2Nrc19nY2JhZCA9IDA7Ly9jLT5yZXN2X2Jsb2Nrc19kZWxldGlvbiArIDI7CisKKwkvKiBJZiB0aGVyZSdzIGxlc3MgdGhhbiB0aGlzIGFtb3VudCBvZiBkaXJ0eSBzcGFjZSwgZG9uJ3QgYm90aGVyCisJICAgdHJ5aW5nIHRvIEdDIHRvIG1ha2UgbW9yZSBzcGFjZS4gSXQnbGwgYmUgYSBmcnVpdGxlc3MgdGFzayAqLworCWMtPm5vc3BjX2RpcnR5X3NpemUgPSBjLT5zZWN0b3Jfc2l6ZSArIChjLT5mbGFzaF9zaXplIC8gMTAwKTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJKRkZTMiB0cmlnZ2VyIGxldmVscyAoc2l6ZSAlZCBLaUIsIGJsb2NrIHNpemUgJWQgS2lCLCAlZCBibG9ja3MpXG4iLAorCQkgIGMtPmZsYXNoX3NpemUgLyAxMDI0LCBjLT5zZWN0b3Jfc2l6ZSAvIDEwMjQsIGMtPm5yX2Jsb2NrcykpOworCUQxKHByaW50ayhLRVJOX0RFQlVHICJCbG9ja3MgcmVxdWlyZWQgdG8gYWxsb3cgZGVsZXRpb246ICAgICVkICglZCBLaUIpXG4iLAorCQkgIGMtPnJlc3ZfYmxvY2tzX2RlbGV0aW9uLCBjLT5yZXN2X2Jsb2Nrc19kZWxldGlvbipjLT5zZWN0b3Jfc2l6ZS8xMDI0KSk7CisJRDEocHJpbnRrKEtFUk5fREVCVUcgIkJsb2NrcyByZXF1aXJlZCB0byBhbGxvdyB3cml0ZXM6ICAgICAgJWQgKCVkIEtpQilcbiIsCisJCSAgYy0+cmVzdl9ibG9ja3Nfd3JpdGUsIGMtPnJlc3ZfYmxvY2tzX3dyaXRlKmMtPnNlY3Rvcl9zaXplLzEwMjQpKTsKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiQmxvY2tzIHJlcXVpcmVkIHRvIHF1aWVzY2UgR0MgdGhyZWFkOiAlZCAoJWQgS2lCKVxuIiwKKwkJICBjLT5yZXN2X2Jsb2Nrc19nY3RyaWdnZXIsIGMtPnJlc3ZfYmxvY2tzX2djdHJpZ2dlcipjLT5zZWN0b3Jfc2l6ZS8xMDI0KSk7CisJRDEocHJpbnRrKEtFUk5fREVCVUcgIkJsb2NrcyByZXF1aXJlZCB0byBhbGxvdyBHQyBtZXJnZXM6ICAgJWQgKCVkIEtpQilcbiIsCisJCSAgYy0+cmVzdl9ibG9ja3NfZ2NtZXJnZSwgYy0+cmVzdl9ibG9ja3NfZ2NtZXJnZSpjLT5zZWN0b3Jfc2l6ZS8xMDI0KSk7CisJRDEocHJpbnRrKEtFUk5fREVCVUcgIkJsb2NrcyByZXF1aXJlZCB0byBHQyBiYWQgYmxvY2tzOiAgICAgJWQgKCVkIEtpQilcbiIsCisJCSAgYy0+cmVzdl9ibG9ja3NfZ2NiYWQsIGMtPnJlc3ZfYmxvY2tzX2djYmFkKmMtPnNlY3Rvcl9zaXplLzEwMjQpKTsKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiQW1vdW50IG9mIGRpcnR5IHNwYWNlIHJlcXVpcmVkIHRvIEdDOiAlZCBieXRlc1xuIiwKKwkJICBjLT5ub3NwY19kaXJ0eV9zaXplKSk7Cit9IAorCitpbnQgamZmczJfZG9fbW91bnRfZnMoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpCit7CisJaW50IGk7CisKKwljLT5mcmVlX3NpemUgPSBjLT5mbGFzaF9zaXplOworCWMtPm5yX2Jsb2NrcyA9IGMtPmZsYXNoX3NpemUgLyBjLT5zZWN0b3Jfc2l6ZTsKKyAJaWYgKGMtPm10ZC0+ZmxhZ3MgJiBNVERfTk9fVklSVEJMT0NLUykKKwkJYy0+YmxvY2tzID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGpmZnMyX2VyYXNlYmxvY2spICogYy0+bnJfYmxvY2tzKTsKKwllbHNlCisJCWMtPmJsb2NrcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrKSAqIGMtPm5yX2Jsb2NrcywgR0ZQX0tFUk5FTCk7CisJaWYgKCFjLT5ibG9ja3MpCisJCXJldHVybiAtRU5PTUVNOworCWZvciAoaT0wOyBpPGMtPm5yX2Jsb2NrczsgaSsrKSB7CisJCUlOSVRfTElTVF9IRUFEKCZjLT5ibG9ja3NbaV0ubGlzdCk7CisJCWMtPmJsb2Nrc1tpXS5vZmZzZXQgPSBpICogYy0+c2VjdG9yX3NpemU7CisJCWMtPmJsb2Nrc1tpXS5mcmVlX3NpemUgPSBjLT5zZWN0b3Jfc2l6ZTsKKwkJYy0+YmxvY2tzW2ldLmRpcnR5X3NpemUgPSAwOworCQljLT5ibG9ja3NbaV0ud2FzdGVkX3NpemUgPSAwOworCQljLT5ibG9ja3NbaV0udW5jaGVja2VkX3NpemUgPSAwOworCQljLT5ibG9ja3NbaV0udXNlZF9zaXplID0gMDsKKwkJYy0+YmxvY2tzW2ldLmZpcnN0X25vZGUgPSBOVUxMOworCQljLT5ibG9ja3NbaV0ubGFzdF9ub2RlID0gTlVMTDsKKwkJYy0+YmxvY2tzW2ldLmJhZF9jb3VudCA9IDA7CisJfQorCisJaW5pdF9NVVRFWCgmYy0+YWxsb2Nfc2VtKTsKKwlpbml0X01VVEVYKCZjLT5lcmFzZV9mcmVlX3NlbSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYy0+ZXJhc2Vfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYy0+aW5vY2FjaGVfd3EpOworCXNwaW5fbG9ja19pbml0KCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZjLT5pbm9jYWNoZV9sb2NrKTsKKworCUlOSVRfTElTVF9IRUFEKCZjLT5jbGVhbl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmYy0+dmVyeV9kaXJ0eV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmYy0+ZGlydHlfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmMtPmVyYXNhYmxlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjLT5lcmFzaW5nX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjLT5lcmFzYWJsZV9wZW5kaW5nX3didWZfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmMtPmVyYXNlX2NvbXBsZXRlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjLT5mcmVlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjLT5iYWRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmMtPmJhZF91c2VkX2xpc3QpOworCWMtPmhpZ2hlc3RfaW5vID0gMTsKKworCWlmIChqZmZzMl9idWlsZF9maWxlc3lzdGVtKGMpKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJidWlsZF9mcyBmYWlsZWRcbiIpKTsKKwkJamZmczJfZnJlZV9pbm9fY2FjaGVzKGMpOworCQlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZnMoYyk7CisJCWlmIChjLT5tdGQtPmZsYWdzICYgTVREX05PX1ZJUlRCTE9DS1MpIHsKKwkJCXZmcmVlKGMtPmJsb2Nrcyk7CisJCX0gZWxzZSB7CisJCQlrZnJlZShjLT5ibG9ja3MpOworCQl9CisJCXJldHVybiAtRUlPOworCX0KKworCWpmZnMyX2NhbGNfdHJpZ2dlcl9sZXZlbHMoYyk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXByLmMgYi9mcy9qZmZzMi9jb21wci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOTIyYTkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9jb21wci5jCkBAIC0wLDAgKzEsNDY5IEBACisvKgorICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKiBDcmVhdGVkIGJ5IEFyamFuIHZhbiBkZSBWZW4gPGFyamFudkByZWRoYXQuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBGZXJlbmMgSGF2YXNpIDxoYXZhc2lAaW5mLnUtc3plZ2VkLmh1PiwKKyAqICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IG9mIFN6ZWdlZCwgSHVuZ2FyeQorICoKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCisgKgorICogJElkOiBjb21wci5jLHYgMS40MiAyMDA0LzA4LzA3IDIxOjU2OjA4IGR3bXcyIEV4cCAkCisgKgorICovCisKKyNpbmNsdWRlICJjb21wci5oIgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKworLyogQXZhaWxhYmxlIGNvbXByZXNzb3JzIGFyZSBvbiB0aGlzIGxpc3QgKi8KK3N0YXRpYyBMSVNUX0hFQUQoamZmczJfY29tcHJlc3Nvcl9saXN0KTsKKworLyogQWN0dWFsIGNvbXByZXNzaW9uIG1vZGUgKi8KK3N0YXRpYyBpbnQgamZmczJfY29tcHJlc3Npb25fbW9kZSA9IEpGRlMyX0NPTVBSX01PREVfUFJJT1JJVFk7CisKKy8qIFN0YXRpc3RpY3MgZm9yIGJsb2NrcyBzdG9yZWQgd2l0aG91dCBjb21wcmVzc2lvbiAqLworc3RhdGljIHVpbnQzMl90IG5vbmVfc3RhdF9jb21wcl9ibG9ja3M9MCxub25lX3N0YXRfZGVjb21wcl9ibG9ja3M9MCxub25lX3N0YXRfY29tcHJfc2l6ZT0wOworCisvKiBqZmZzMl9jb21wcmVzczoKKyAqIEBkYXRhOiBQb2ludGVyIHRvIHVuY29tcHJlc3NlZCBkYXRhCisgKiBAY2RhdGE6IFBvaW50ZXIgdG8gcmV0dXJuZWQgcG9pbnRlciB0byBidWZmZXIgZm9yIGNvbXByZXNzZWQgZGF0YQorICogQGRhdGFsZW46IE9uIGVudHJ5LCBob2xkcyB0aGUgYW1vdW50IG9mIGRhdGEgYXZhaWxhYmxlIGZvciBjb21wcmVzc2lvbi4KKyAqCU9uIGV4aXQsIGV4cGVjdGVkIHRvIGhvbGQgdGhlIGFtb3VudCBvZiBkYXRhIGFjdHVhbGx5IGNvbXByZXNzZWQuCisgKiBAY2RhdGFsZW46IE9uIGVudHJ5LCBob2xkcyB0aGUgYW1vdW50IG9mIHNwYWNlIGF2YWlsYWJsZSBmb3IgY29tcHJlc3NlZAorICoJZGF0YS4gT24gZXhpdCwgZXhwZWN0ZWQgdG8gaG9sZCB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQKKyAqCWRhdGEuCisgKgorICogUmV0dXJuczogTG93ZXIgYnl0ZSB0byBiZSBzdG9yZWQgd2l0aCBkYXRhIGluZGljYXRpbmcgY29tcHJlc3Npb24gdHlwZSB1c2VkLgorICogWmVybyBpcyB1c2VkIHRvIHNob3cgdGhhdCB0aGUgZGF0YSBjb3VsZCBub3QgYmUgY29tcHJlc3NlZCAtIHRoZSAKKyAqIGNvbXByZXNzZWQgdmVyc2lvbiB3YXMgYWN0dWFsbHkgbGFyZ2VyIHRoYW4gdGhlIG9yaWdpbmFsLgorICogVXBwZXIgYnl0ZSB3aWxsIGJlIHVzZWQgbGF0ZXIuIChzb29uKQorICoKKyAqIElmIHRoZSBjZGF0YSBidWZmZXIgaXNuJ3QgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIHRoZSB1bmNvbXByZXNzZWQgZGF0YSwKKyAqIGpmZnMyX2NvbXByZXNzIHNob3VsZCBjb21wcmVzcyBhcyBtdWNoIGFzIHdpbGwgZml0LCBhbmQgc2hvdWxkIHNldCAKKyAqICpkYXRhbGVuIGFjY29yZGluZ2x5IHRvIHNob3cgdGhlIGFtb3VudCBvZiBkYXRhIHdoaWNoIHdlcmUgY29tcHJlc3NlZC4KKyAqLwordWludDE2X3QgamZmczJfY29tcHJlc3Moc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLAorCQkJICAgICB1bnNpZ25lZCBjaGFyICpkYXRhX2luLCB1bnNpZ25lZCBjaGFyICoqY3BhZ2Vfb3V0LCAKKwkJCSAgICAgdWludDMyX3QgKmRhdGFsZW4sIHVpbnQzMl90ICpjZGF0YWxlbikKK3sKKwlpbnQgcmV0ID0gSkZGUzJfQ09NUFJfTk9ORTsKKyAgICAgICAgaW50IGNvbXByX3JldDsKKyAgICAgICAgc3RydWN0IGpmZnMyX2NvbXByZXNzb3IgKnRoaXMsICpiZXN0PU5VTEw7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9idWYgPSBOVUxMLCAqdG1wX2J1ZjsKKyAgICAgICAgdWludDMyX3Qgb3JpZ19zbGVuLCBvcmlnX2RsZW47CisgICAgICAgIHVpbnQzMl90IGJlc3Rfc2xlbj0wLCBiZXN0X2RsZW49MDsKKworICAgICAgICBzd2l0Y2ggKGpmZnMyX2NvbXByZXNzaW9uX21vZGUpIHsKKyAgICAgICAgY2FzZSBKRkZTMl9DT01QUl9NT0RFX05PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSkZGUzJfQ09NUFJfTU9ERV9QUklPUklUWToKKyAgICAgICAgICAgICAgICBvdXRwdXRfYnVmID0ga21hbGxvYygqY2RhdGFsZW4sR0ZQX0tFUk5FTCk7CisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXRfYnVmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJKRkZTMjogTm8gbWVtb3J5IGZvciBjb21wcmVzc29yIGFsbG9jYXRpb24uIENvbXByZXNzaW9uIGZhaWxlZC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9yaWdfc2xlbiA9ICpkYXRhbGVuOworICAgICAgICAgICAgICAgIG9yaWdfZGxlbiA9ICpjZGF0YWxlbjsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKyAgICAgICAgICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KHRoaXMsICZqZmZzMl9jb21wcmVzc29yX2xpc3QsIGxpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgZGVjb21wcmVzcy1vbmx5IGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGFuZCBkaXNhYmxlZCBtb2R1bGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCF0aGlzLT5jb21wcmVzcyl8fCh0aGlzLT5kaXNhYmxlZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51c2Vjb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhbGVuICA9IG9yaWdfc2xlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpjZGF0YWxlbiA9IG9yaWdfZGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByX3JldCA9IHRoaXMtPmNvbXByZXNzKGRhdGFfaW4sIG91dHB1dF9idWYsIGRhdGFsZW4sIGNkYXRhbGVuLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dXNlY291bnQtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29tcHJfcmV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHRoaXMtPmNvbXByOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zdGF0X2NvbXByX2Jsb2NrcysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zdGF0X2NvbXByX29yaWdfc2l6ZSArPSAqZGF0YWxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+c3RhdF9jb21wcl9uZXdfc2l6ZSAgKz0gKmNkYXRhbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IEpGRlMyX0NPTVBSX05PTkUpIGtmcmVlKG91dHB1dF9idWYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEpGRlMyX0NPTVBSX01PREVfU0laRToKKyAgICAgICAgICAgICAgICBvcmlnX3NsZW4gPSAqZGF0YWxlbjsKKyAgICAgICAgICAgICAgICBvcmlnX2RsZW4gPSAqY2RhdGFsZW47CisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7CisgICAgICAgICAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeSh0aGlzLCAmamZmczJfY29tcHJlc3Nvcl9saXN0LCBsaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBTa2lwIGRlY29tcHJlc3Mtb25seSBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBhbmQgZGlzYWJsZWQgbW9kdWxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghdGhpcy0+Y29tcHJlc3MpfHwodGhpcy0+ZGlzYWJsZWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRpbmcgbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT5jb21wcl9idWZfc2l6ZTxvcmlnX2RsZW4pJiYodGhpcy0+Y29tcHJfYnVmKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZSh0aGlzLT5jb21wcl9idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX2xvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+Y29tcHJfYnVmX3NpemU9MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+Y29tcHJfYnVmPU5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMtPmNvbXByX2J1ZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfYnVmID0ga21hbGxvYyhvcmlnX2RsZW4sR0ZQX0tFUk5FTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRtcF9idWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJKRkZTMjogTm8gbWVtb3J5IGZvciBjb21wcmVzc29yIGFsbG9jYXRpb24uICglZCBieXRlcylcbiIsb3JpZ19kbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5jb21wcl9idWYgPSB0bXBfYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmNvbXByX2J1Zl9zaXplID0gb3JpZ19kbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51c2Vjb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhbGVuICA9IG9yaWdfc2xlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpjZGF0YWxlbiA9IG9yaWdfZGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByX3JldCA9IHRoaXMtPmNvbXByZXNzKGRhdGFfaW4sIHRoaXMtPmNvbXByX2J1ZiwgZGF0YWxlbiwgY2RhdGFsZW4sIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51c2Vjb3VudC0tOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wcl9yZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghYmVzdF9kbGVuKXx8KGJlc3RfZGxlbj4qY2RhdGFsZW4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9kbGVuID0gKmNkYXRhbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3Rfc2xlbiA9ICpkYXRhbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QgPSB0aGlzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChiZXN0X2RsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpjZGF0YWxlbiA9IGJlc3RfZGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhbGVuICA9IGJlc3Rfc2xlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9idWYgPSBiZXN0LT5jb21wcl9idWY7CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0LT5jb21wcl9idWYgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdC0+Y29tcHJfYnVmX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdC0+c3RhdF9jb21wcl9ibG9ja3MrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QtPnN0YXRfY29tcHJfb3JpZ19zaXplICs9IGJlc3Rfc2xlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QtPnN0YXRfY29tcHJfbmV3X3NpemUgICs9IGJlc3RfZGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGJlc3QtPmNvbXByOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiSkZGUzI6IHVua25vdyBjb21wcmVzc2lvbiBtb2RlLlxuIik7CisgICAgICAgIH0KKyBvdXQ6CisgICAgICAgIGlmIChyZXQgPT0gSkZGUzJfQ09NUFJfTk9ORSkgeworCSAgICAgICAgKmNwYWdlX291dCA9IGRhdGFfaW47CisJICAgICAgICAqZGF0YWxlbiA9ICpjZGF0YWxlbjsKKyAgICAgICAgICAgICAgICBub25lX3N0YXRfY29tcHJfYmxvY2tzKys7CisgICAgICAgICAgICAgICAgbm9uZV9zdGF0X2NvbXByX3NpemUgKz0gKmRhdGFsZW47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgKmNwYWdlX291dCA9IG91dHB1dF9idWY7CisgICAgICAgIH0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgamZmczJfZGVjb21wcmVzcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsCisJCSAgICAgdWludDE2X3QgY29tcHJ0eXBlLCB1bnNpZ25lZCBjaGFyICpjZGF0YV9pbiwgCisJCSAgICAgdW5zaWduZWQgY2hhciAqZGF0YV9vdXQsIHVpbnQzMl90IGNkYXRhbGVuLCB1aW50MzJfdCBkYXRhbGVuKQoreworICAgICAgICBzdHJ1Y3QgamZmczJfY29tcHJlc3NvciAqdGhpczsKKyAgICAgICAgaW50IHJldDsKKworCS8qIE9sZGVyIGNvZGUgaGFkIGEgYnVnIHdoZXJlIGl0IHdvdWxkIHdyaXRlIG5vbi16ZXJvICd1c2VyY29tcHInCisJICAgZmllbGRzLiBEZWFsIHdpdGggaXQuICovCisJaWYgKChjb21wcnR5cGUgJiAweGZmKSA8PSBKRkZTMl9DT01QUl9aTElCKQorCQljb21wcnR5cGUgJj0gMHhmZjsKKworCXN3aXRjaCAoY29tcHJ0eXBlICYgMHhmZikgeworCWNhc2UgSkZGUzJfQ09NUFJfTk9ORToKKwkJLyogVGhpcyBzaG91bGQgYmUgc3BlY2lhbC1jYXNlZCBlbHNld2hlcmUsIGJ1dCB3ZSBtaWdodCBhcyB3ZWxsIGRlYWwgd2l0aCBpdCAqLworCQltZW1jcHkoZGF0YV9vdXQsIGNkYXRhX2luLCBkYXRhbGVuKTsKKyAgICAgICAgICAgICAgICBub25lX3N0YXRfZGVjb21wcl9ibG9ja3MrKzsKKwkJYnJlYWs7CisJY2FzZSBKRkZTMl9DT01QUl9aRVJPOgorCQltZW1zZXQoZGF0YV9vdXQsIDAsIGRhdGFsZW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorICAgICAgICAgICAgICAgIHNwaW5fbG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICAgICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnkodGhpcywgJmpmZnMyX2NvbXByZXNzb3JfbGlzdCwgbGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBydHlwZSA9PSB0aGlzLT5jb21wcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51c2Vjb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLT5kZWNvbXByZXNzKGNkYXRhX2luLCBkYXRhX291dCwgY2RhdGFsZW4sIGRhdGFsZW4sIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX2xvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIkRlY29tcHJlc3NvciBcIiVzXCIgcmV0dXJuZWQgJWRcbiIsIHRoaXMtPm5hbWUsIHJldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+c3RhdF9kZWNvbXByX2Jsb2NrcysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnVzZWNvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJKRkZTMiBjb21wcmVzc2lvbiB0eXBlIDB4JTAyeCBub3QgYXZhaWxhYmxlLlxuIiwgY29tcHJ0eXBlKTsKKyAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBqZmZzMl9yZWdpc3Rlcl9jb21wcmVzc29yKHN0cnVjdCBqZmZzMl9jb21wcmVzc29yICpjb21wKQoreworICAgICAgICBzdHJ1Y3QgamZmczJfY29tcHJlc3NvciAqdGhpczsKKworICAgICAgICBpZiAoIWNvbXAtPm5hbWUpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJOVUxMIGNvbXByZXNzb3IgbmFtZSBhdCByZWdpc3RlcmluZyBKRkZTMiBjb21wcmVzc29yLiBGYWlsZWQuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgY29tcC0+Y29tcHJfYnVmX3NpemU9MDsKKyAgICAgICAgY29tcC0+Y29tcHJfYnVmPU5VTEw7CisgICAgICAgIGNvbXAtPnVzZWNvdW50PTA7CisgICAgICAgIGNvbXAtPnN0YXRfY29tcHJfb3JpZ19zaXplPTA7CisgICAgICAgIGNvbXAtPnN0YXRfY29tcHJfbmV3X3NpemU9MDsKKyAgICAgICAgY29tcC0+c3RhdF9jb21wcl9ibG9ja3M9MDsKKyAgICAgICAgY29tcC0+c3RhdF9kZWNvbXByX2Jsb2Nrcz0wOworICAgICAgICBEMShwcmludGsoS0VSTl9ERUJVRyAiUmVnaXN0ZXJpbmcgSkZGUzIgY29tcHJlc3NvciBcIiVzXCJcbiIsIGNvbXAtPm5hbWUpKTsKKworICAgICAgICBzcGluX2xvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKworICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KHRoaXMsICZqZmZzMl9jb21wcmVzc29yX2xpc3QsIGxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+cHJpb3JpdHkgPCBjb21wLT5wcmlvcml0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9hZGQoJmNvbXAtPmxpc3QsIHRoaXMtPmxpc3QucHJldik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbGlzdF9hZGRfdGFpbCgmY29tcC0+bGlzdCwgJmpmZnMyX2NvbXByZXNzb3JfbGlzdCk7CitvdXQ6CisgICAgICAgIEQyKGxpc3RfZm9yX2VhY2hfZW50cnkodGhpcywgJmpmZnMyX2NvbXByZXNzb3JfbGlzdCwgbGlzdCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJDb21wcmVzc29yIFwiJXNcIiwgcHJpbyAlZFxuIiwgdGhpcy0+bmFtZSwgdGhpcy0+cHJpb3JpdHkpOworICAgICAgICB9KQorCisgICAgICAgIHNwaW5fdW5sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBqZmZzMl91bnJlZ2lzdGVyX2NvbXByZXNzb3Ioc3RydWN0IGpmZnMyX2NvbXByZXNzb3IgKmNvbXApCit7CisgICAgICAgIEQyKHN0cnVjdCBqZmZzMl9jb21wcmVzc29yICp0aGlzOykKKworICAgICAgICBEMShwcmludGsoS0VSTl9ERUJVRyAiVW5yZWdpc3RlcmluZyBKRkZTMiBjb21wcmVzc29yIFwiJXNcIlxuIiwgY29tcC0+bmFtZSkpOworCisgICAgICAgIHNwaW5fbG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworCisgICAgICAgIGlmIChjb21wLT51c2Vjb3VudCkgeworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiSkZGUzI6IENvbXByZXNzb3IgbW9kdWwgaXMgaW4gdXNlLiBVbnJlZ2lzdGVyIGZhaWxlZC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBsaXN0X2RlbCgmY29tcC0+bGlzdCk7CisKKyAgICAgICAgRDIobGlzdF9mb3JfZWFjaF9lbnRyeSh0aGlzLCAmamZmczJfY29tcHJlc3Nvcl9saXN0LCBsaXN0KSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIkNvbXByZXNzb3IgXCIlc1wiLCBwcmlvICVkXG4iLCB0aGlzLT5uYW1lLCB0aGlzLT5wcmlvcml0eSk7CisgICAgICAgIH0pCisgICAgICAgIHNwaW5fdW5sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7CisgICAgICAgIHJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0pGRlMyX1BST0MKKworI2RlZmluZSBKRkZTMl9TVEFUX0JVRl9TSVpFIDE2MDAwCisKK2NoYXIgKmpmZnMyX2xpc3RfY29tcHJlc3NvcnModm9pZCkKK3sKKyAgICAgICAgc3RydWN0IGpmZnMyX2NvbXByZXNzb3IgKnRoaXM7CisgICAgICAgIGNoYXIgKmJ1ZiwgKmFjdF9idWY7CisKKyAgICAgICAgYWN0X2J1ZiA9IGJ1ZiA9IGttYWxsb2MoSkZGUzJfU1RBVF9CVUZfU0laRSxHRlBfS0VSTkVMKTsKKyAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeSh0aGlzLCAmamZmczJfY29tcHJlc3Nvcl9saXN0LCBsaXN0KSB7CisgICAgICAgICAgICAgICAgYWN0X2J1ZiArPSBzcHJpbnRmKGFjdF9idWYsICIlMTBzIHByaW9yaXR5OiVkICIsIHRoaXMtPm5hbWUsIHRoaXMtPnByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPmRpc2FibGVkKXx8KCF0aGlzLT5jb21wcmVzcykpCisgICAgICAgICAgICAgICAgICAgICAgICBhY3RfYnVmICs9IHNwcmludGYoYWN0X2J1ZiwiZGlzYWJsZWQiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBhY3RfYnVmICs9IHNwcmludGYoYWN0X2J1ZiwiZW5hYmxlZCIpOworICAgICAgICAgICAgICAgIGFjdF9idWYgKz0gc3ByaW50ZihhY3RfYnVmLCJcbiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWY7Cit9CisKK2NoYXIgKmpmZnMyX3N0YXRzKHZvaWQpCit7CisgICAgICAgIHN0cnVjdCBqZmZzMl9jb21wcmVzc29yICp0aGlzOworICAgICAgICBjaGFyICpidWYsICphY3RfYnVmOworCisgICAgICAgIGFjdF9idWYgPSBidWYgPSBrbWFsbG9jKEpGRlMyX1NUQVRfQlVGX1NJWkUsR0ZQX0tFUk5FTCk7CisKKyAgICAgICAgYWN0X2J1ZiArPSBzcHJpbnRmKGFjdF9idWYsIkpGRlMyIGNvbXByZXNzb3Igc3RhdGlzdGljczpcbiIpOworICAgICAgICBhY3RfYnVmICs9IHNwcmludGYoYWN0X2J1ZiwiJTEwcyAgICIsIm5vbmUiKTsKKyAgICAgICAgYWN0X2J1ZiArPSBzcHJpbnRmKGFjdF9idWYsImNvbXByOiAlZCBibG9ja3MgKCVkKSAgZGVjb21wcjogJWQgYmxvY2tzXG4iLCBub25lX3N0YXRfY29tcHJfYmxvY2tzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmVfc3RhdF9jb21wcl9zaXplLCBub25lX3N0YXRfZGVjb21wcl9ibG9ja3MpOworICAgICAgICBzcGluX2xvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKyAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeSh0aGlzLCAmamZmczJfY29tcHJlc3Nvcl9saXN0LCBsaXN0KSB7CisgICAgICAgICAgICAgICAgYWN0X2J1ZiArPSBzcHJpbnRmKGFjdF9idWYsIiUxMHMgIix0aGlzLT5uYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPmRpc2FibGVkKXx8KCF0aGlzLT5jb21wcmVzcykpCisgICAgICAgICAgICAgICAgICAgICAgICBhY3RfYnVmICs9IHNwcmludGYoYWN0X2J1ZiwiLSAiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBhY3RfYnVmICs9IHNwcmludGYoYWN0X2J1ZiwiKyAiKTsKKyAgICAgICAgICAgICAgICBhY3RfYnVmICs9IHNwcmludGYoYWN0X2J1ZiwiY29tcHI6ICVkIGJsb2NrcyAoJWQvJWQpICBkZWNvbXByOiAlZCBibG9ja3MgIiwgdGhpcy0+c3RhdF9jb21wcl9ibG9ja3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zdGF0X2NvbXByX25ld19zaXplLCB0aGlzLT5zdGF0X2NvbXByX29yaWdfc2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnN0YXRfZGVjb21wcl9ibG9ja3MpOworICAgICAgICAgICAgICAgIGFjdF9idWYgKz0gc3ByaW50ZihhY3RfYnVmLCJcbiIpOworICAgICAgICB9CisgICAgICAgIHNwaW5fdW5sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7CisKKyAgICAgICAgcmV0dXJuIGJ1ZjsKK30KKworY2hhciAqamZmczJfZ2V0X2NvbXByZXNzaW9uX21vZGVfbmFtZSh2b2lkKSAKK3sKKyAgICAgICAgc3dpdGNoIChqZmZzMl9jb21wcmVzc2lvbl9tb2RlKSB7CisgICAgICAgIGNhc2UgSkZGUzJfQ09NUFJfTU9ERV9OT05FOgorICAgICAgICAgICAgICAgIHJldHVybiAibm9uZSI7CisgICAgICAgIGNhc2UgSkZGUzJfQ09NUFJfTU9ERV9QUklPUklUWToKKyAgICAgICAgICAgICAgICByZXR1cm4gInByaW9yaXR5IjsKKyAgICAgICAgY2FzZSBKRkZTMl9DT01QUl9NT0RFX1NJWkU6CisgICAgICAgICAgICAgICAgcmV0dXJuICJzaXplIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gInVua293biI7Cit9CisKK2ludCBqZmZzMl9zZXRfY29tcHJlc3Npb25fbW9kZV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpIAoreworICAgICAgICBpZiAoIXN0cmNtcCgibm9uZSIsbmFtZSkpIHsKKyAgICAgICAgICAgICAgICBqZmZzMl9jb21wcmVzc2lvbl9tb2RlID0gSkZGUzJfQ09NUFJfTU9ERV9OT05FOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICghc3RyY21wKCJwcmlvcml0eSIsbmFtZSkpIHsKKyAgICAgICAgICAgICAgICBqZmZzMl9jb21wcmVzc2lvbl9tb2RlID0gSkZGUzJfQ09NUFJfTU9ERV9QUklPUklUWTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN0cmNtcCgic2l6ZSIsbmFtZSkpIHsKKyAgICAgICAgICAgICAgICBqZmZzMl9jb21wcmVzc2lvbl9tb2RlID0gSkZGUzJfQ09NUFJfTU9ERV9TSVpFOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGpmZnMyX2NvbXByZXNzb3JfWGFibGUoY29uc3QgY2hhciAqbmFtZSwgaW50IGRpc2FibGVkKQoreworICAgICAgICBzdHJ1Y3QgamZmczJfY29tcHJlc3NvciAqdGhpczsKKyAgICAgICAgc3Bpbl9sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7CisgICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnkodGhpcywgJmpmZnMyX2NvbXByZXNzb3JfbGlzdCwgbGlzdCkgeworICAgICAgICAgICAgICAgIGlmICghc3RyY21wKHRoaXMtPm5hbWUsIG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5kaXNhYmxlZCA9IGRpc2FibGVkOworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzcGluX3VubG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJKRkZTMjogY29tcHJlc3NvciAlcyBub3QgZm91bmQuXG4iLG5hbWUpOworICAgICAgICByZXR1cm4gMTsKK30KKworaW50IGpmZnMyX2VuYWJsZV9jb21wcmVzc29yX25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICAgICAgcmV0dXJuIGpmZnMyX2NvbXByZXNzb3JfWGFibGUobmFtZSwgMCk7Cit9CisKK2ludCBqZmZzMl9kaXNhYmxlX2NvbXByZXNzb3JfbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworICAgICAgICByZXR1cm4gamZmczJfY29tcHJlc3Nvcl9YYWJsZShuYW1lLCAxKTsKK30KKworaW50IGpmZnMyX3NldF9jb21wcmVzc29yX3ByaW9yaXR5KGNvbnN0IGNoYXIgKm5hbWUsIGludCBwcmlvcml0eSkKK3sKKyAgICAgICAgc3RydWN0IGpmZnMyX2NvbXByZXNzb3IgKnRoaXMsKmNvbXA7CisgICAgICAgIHNwaW5fbG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KHRoaXMsICZqZmZzMl9jb21wcmVzc29yX2xpc3QsIGxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCh0aGlzLT5uYW1lLCBuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+cHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPSB0aGlzOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZWluc2VydDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3Bpbl91bmxvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKyAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiSkZGUzI6IGNvbXByZXNzb3IgJXMgbm90IGZvdW5kLlxuIixuYW1lKTsgICAgICAgIAorICAgICAgICByZXR1cm4gMTsKK3JlaW5zZXJ0OgorICAgICAgICAvKiBsaXN0IGlzIHNvcnRlZCBpbiB0aGUgb3JkZXIgb2YgcHJpb3JpdHksIHNvIGlmCisgICAgICAgICAgIHdlIGNoYW5nZSBpdCB3ZSBoYXZlIHRvIHJlaW5zZXJ0IGl0IGludG8gdGhlCisgICAgICAgICAgIGdvb2QgcGxhY2UgKi8KKyAgICAgICAgbGlzdF9kZWwoJmNvbXAtPmxpc3QpOworICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KHRoaXMsICZqZmZzMl9jb21wcmVzc29yX2xpc3QsIGxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+cHJpb3JpdHkgPCBjb21wLT5wcmlvcml0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9hZGQoJmNvbXAtPmxpc3QsIHRoaXMtPmxpc3QucHJldik7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxpc3RfYWRkX3RhaWwoJmNvbXAtPmxpc3QsICZqZmZzMl9jb21wcmVzc29yX2xpc3QpOworICAgICAgICBzcGluX3VubG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCisKK3ZvaWQgamZmczJfZnJlZV9jb21wcmJ1Zih1bnNpZ25lZCBjaGFyICpjb21wcmJ1ZiwgdW5zaWduZWQgY2hhciAqb3JpZykKK3sKKyAgICAgICAgaWYgKG9yaWcgIT0gY29tcHJidWYpCisgICAgICAgICAgICAgICAga2ZyZWUoY29tcHJidWYpOworfQorCitpbnQgamZmczJfY29tcHJlc3NvcnNfaW5pdCh2b2lkKSAKK3sKKy8qIFJlZ2lzdGVyaW5nIGNvbXByZXNzb3JzICovCisjaWZkZWYgQ09ORklHX0pGRlMyX1pMSUIKKyAgICAgICAgamZmczJfemxpYl9pbml0KCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSkZGUzJfUlRJTUUKKyAgICAgICAgamZmczJfcnRpbWVfaW5pdCgpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0pGRlMyX1JVQklOCisgICAgICAgIGpmZnMyX3J1YmlubWlwc19pbml0KCk7CisgICAgICAgIGpmZnMyX2R5bnJ1YmluX2luaXQoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19KRkZTMl9MWkFSSQorICAgICAgICBqZmZzMl9semFyaV9pbml0KCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSkZGUzJfTFpPCisgICAgICAgIGpmZnMyX2x6b19pbml0KCk7CisjZW5kaWYKKy8qIFNldHRpbmcgZGVmYXVsdCBjb21wcmVzc2lvbiBtb2RlICovCisjaWZkZWYgQ09ORklHX0pGRlMyX0NNT0RFX05PTkUKKyAgICAgICAgamZmczJfY29tcHJlc3Npb25fbW9kZSA9IEpGRlMyX0NPTVBSX01PREVfTk9ORTsKKyAgICAgICAgRDEocHJpbnRrKEtFUk5fSU5GTyAiSkZGUzI6IGRlZmF1bHQgY29tcHJlc3Npb24gbW9kZTogbm9uZVxuIik7KQorI2Vsc2UKKyNpZmRlZiBDT05GSUdfSkZGUzJfQ01PREVfU0laRQorICAgICAgICBqZmZzMl9jb21wcmVzc2lvbl9tb2RlID0gSkZGUzJfQ09NUFJfTU9ERV9TSVpFOworICAgICAgICBEMShwcmludGsoS0VSTl9JTkZPICJKRkZTMjogZGVmYXVsdCBjb21wcmVzc2lvbiBtb2RlOiBzaXplXG4iKTspCisjZWxzZQorICAgICAgICBEMShwcmludGsoS0VSTl9JTkZPICJKRkZTMjogZGVmYXVsdCBjb21wcmVzc2lvbiBtb2RlOiBwcmlvcml0eVxuIik7KQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBqZmZzMl9jb21wcmVzc29yc19leGl0KHZvaWQpIAoreworLyogVW5yZWdpc3RlcmluZyBjb21wcmVzc29ycyAqLworI2lmZGVmIENPTkZJR19KRkZTMl9MWk8KKyAgICAgICAgamZmczJfbHpvX2V4aXQoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19KRkZTMl9MWkFSSQorICAgICAgICBqZmZzMl9semFyaV9leGl0KCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSkZGUzJfUlVCSU4KKyAgICAgICAgamZmczJfZHlucnViaW5fZXhpdCgpOworICAgICAgICBqZmZzMl9ydWJpbm1pcHNfZXhpdCgpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0pGRlMyX1JUSU1FCisgICAgICAgIGpmZnMyX3J0aW1lX2V4aXQoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19KRkZTMl9aTElCCisgICAgICAgIGpmZnMyX3psaWJfZXhpdCgpOworI2VuZGlmCisgICAgICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvY29tcHIuaCBiL2ZzL2pmZnMyL2NvbXByLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODljZWVlZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL2NvbXByLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBGZXJlbmMgSGF2YXNpIDxoYXZhc2lAaW5mLnUtc3plZ2VkLmh1PiwKKyAqICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IG9mIFN6ZWdlZCwgSHVuZ2FyeQorICoKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhlIAorICogamZmczIgZGlyZWN0b3J5LgorICoKKyAqICRJZDogY29tcHIuaCx2IDEuNiAyMDA0LzA3LzE2IDE1OjE3OjU3IGR3bXcyIEV4cCAkCisgKgorICovCisKKyNpZm5kZWYgX19KRkZTMl9DT01QUl9IX18KKyNkZWZpbmUgX19KRkZTMl9DT01QUl9IX18KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2pmZnMyLmg+CisjaW5jbHVkZSA8bGludXgvamZmczJfZnNfaS5oPgorI2luY2x1ZGUgPGxpbnV4L2pmZnMyX2ZzX3NiLmg+CisjaW5jbHVkZSAibm9kZWxpc3QuaCIKKworI2RlZmluZSBKRkZTMl9SVUJJTk1JUFNfUFJJT1JJVFkgMTAKKyNkZWZpbmUgSkZGUzJfRFlOUlVCSU5fUFJJT1JJVFkgIDIwCisjZGVmaW5lIEpGRlMyX0xaQVJJX1BSSU9SSVRZICAgICAzMAorI2RlZmluZSBKRkZTMl9MWk9fUFJJT1JJVFkgICAgICAgNDAKKyNkZWZpbmUgSkZGUzJfUlRJTUVfUFJJT1JJVFkgICAgIDUwCisjZGVmaW5lIEpGRlMyX1pMSUJfUFJJT1JJVFkgICAgICA2MAorCisjZGVmaW5lIEpGRlMyX1JVQklOTUlQU19ESVNBQkxFRCAvKiBSVUJJTnMgd2lsbCBiZSB1c2VkIG9ubHkgKi8KKyNkZWZpbmUgSkZGUzJfRFlOUlVCSU5fRElTQUJMRUQgIC8qICAgICAgICBmb3IgZGVjb21wcmVzc2lvbiAqLworCisjZGVmaW5lIEpGRlMyX0NPTVBSX01PREVfTk9ORSAgICAgICAwCisjZGVmaW5lIEpGRlMyX0NPTVBSX01PREVfUFJJT1JJVFkgICAxCisjZGVmaW5lIEpGRlMyX0NPTVBSX01PREVfU0laRSAgICAgICAyCisKK3N0cnVjdCBqZmZzMl9jb21wcmVzc29yIHsKKyAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBsaXN0OworICAgICAgICBpbnQgcHJpb3JpdHk7ICAgICAgICAgICAgICAvKiB1c2VkIGJ5IHByaXJvcml0eSBjb21yLiBtb2RlICovCisgICAgICAgIGNoYXIgKm5hbWU7CisgICAgICAgIGNoYXIgY29tcHI7ICAgICAgICAgICAgICAgIC8qIEpGRlMyX0NPTVBSX1hYWCAqLworICAgICAgICBpbnQgKCpjb21wcmVzcykodW5zaWduZWQgY2hhciAqZGF0YV9pbiwgdW5zaWduZWQgY2hhciAqY3BhZ2Vfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnNyY2xlbiwgdWludDMyX3QgKmRlc3RsZW4sIHZvaWQgKm1vZGVsKTsKKyAgICAgICAgaW50ICgqZGVjb21wcmVzcykodW5zaWduZWQgY2hhciAqY2RhdGFfaW4sIHVuc2lnbmVkIGNoYXIgKmRhdGFfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2RhdGFsZW4sIHVpbnQzMl90IGRhdGFsZW4sIHZvaWQgKm1vZGVsKTsKKyAgICAgICAgaW50IHVzZWNvdW50OworICAgICAgICBpbnQgZGlzYWJsZWQ7ICAgICAgICAgICAgICAvKiBpZiBzZXRlZCB0aGUgY29tcHJlc3NvciB3b24ndCBjb21wcmVzcyAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICpjb21wcl9idWY7ICAvKiB1c2VkIGJ5IHNpemUgY29tcHIuIG1vZGUgKi8KKyAgICAgICAgdWludDMyX3QgY29tcHJfYnVmX3NpemU7ICAgLyogdXNlZCBieSBzaXplIGNvbXByLiBtb2RlICovCisgICAgICAgIHVpbnQzMl90IHN0YXRfY29tcHJfb3JpZ19zaXplOworICAgICAgICB1aW50MzJfdCBzdGF0X2NvbXByX25ld19zaXplOworICAgICAgICB1aW50MzJfdCBzdGF0X2NvbXByX2Jsb2NrczsKKyAgICAgICAgdWludDMyX3Qgc3RhdF9kZWNvbXByX2Jsb2NrczsKK307CisKK2ludCBqZmZzMl9yZWdpc3Rlcl9jb21wcmVzc29yKHN0cnVjdCBqZmZzMl9jb21wcmVzc29yICpjb21wKTsKK2ludCBqZmZzMl91bnJlZ2lzdGVyX2NvbXByZXNzb3Ioc3RydWN0IGpmZnMyX2NvbXByZXNzb3IgKmNvbXApOworCitpbnQgamZmczJfY29tcHJlc3NvcnNfaW5pdCh2b2lkKTsKK2ludCBqZmZzMl9jb21wcmVzc29yc19leGl0KHZvaWQpOworCit1aW50MTZfdCBqZmZzMl9jb21wcmVzcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGFfaW4sIHVuc2lnbmVkIGNoYXIgKipjcGFnZV9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkYXRhbGVuLCB1aW50MzJfdCAqY2RhdGFsZW4pOworCitpbnQgamZmczJfZGVjb21wcmVzcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsCisgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb21wcnR5cGUsIHVuc2lnbmVkIGNoYXIgKmNkYXRhX2luLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YV9vdXQsIHVpbnQzMl90IGNkYXRhbGVuLCB1aW50MzJfdCBkYXRhbGVuKTsKKwordm9pZCBqZmZzMl9mcmVlX2NvbXByYnVmKHVuc2lnbmVkIGNoYXIgKmNvbXByYnVmLCB1bnNpZ25lZCBjaGFyICpvcmlnKTsKKworI2lmZGVmIENPTkZJR19KRkZTMl9QUk9DCitpbnQgamZmczJfZW5hYmxlX2NvbXByZXNzb3JfbmFtZShjb25zdCBjaGFyICpuYW1lKTsKK2ludCBqZmZzMl9kaXNhYmxlX2NvbXByZXNzb3JfbmFtZShjb25zdCBjaGFyICpuYW1lKTsKK2ludCBqZmZzMl9zZXRfY29tcHJlc3Npb25fbW9kZV9uYW1lKGNvbnN0IGNoYXIgKm1vZGVfbmFtZSk7CitjaGFyICpqZmZzMl9nZXRfY29tcHJlc3Npb25fbW9kZV9uYW1lKHZvaWQpOworaW50IGpmZnMyX3NldF9jb21wcmVzc29yX3ByaW9yaXR5KGNvbnN0IGNoYXIgKm1vZGVfbmFtZSwgaW50IHByaW9yaXR5KTsKK2NoYXIgKmpmZnMyX2xpc3RfY29tcHJlc3NvcnModm9pZCk7CitjaGFyICpqZmZzMl9zdGF0cyh2b2lkKTsKKyNlbmRpZgorCisvKiBDb21wcmVzc29yIG1vZHVsZXMgKi8KKy8qIFRoZXNlIGZ1bmN0aW9ucyB3aWxsIGJlIGNhbGxlZCBieSBqZmZzMl9jb21wcmVzc29yc19pbml0L2V4aXQgKi8KKworI2lmZGVmIENPTkZJR19KRkZTMl9SVUJJTgoraW50IGpmZnMyX3J1YmlubWlwc19pbml0KHZvaWQpOwordm9pZCBqZmZzMl9ydWJpbm1pcHNfZXhpdCh2b2lkKTsKK2ludCBqZmZzMl9keW5ydWJpbl9pbml0KHZvaWQpOwordm9pZCBqZmZzMl9keW5ydWJpbl9leGl0KHZvaWQpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0pGRlMyX1JUSU1FCitpbnQgamZmczJfcnRpbWVfaW5pdCh2b2lkKTsKK3ZvaWQgamZmczJfcnRpbWVfZXhpdCh2b2lkKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19KRkZTMl9aTElCCitpbnQgamZmczJfemxpYl9pbml0KHZvaWQpOwordm9pZCBqZmZzMl96bGliX2V4aXQodm9pZCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSkZGUzJfTFpBUkkKK2ludCBqZmZzMl9semFyaV9pbml0KHZvaWQpOwordm9pZCBqZmZzMl9semFyaV9leGl0KHZvaWQpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0pGRlMyX0xaTworaW50IGpmZnMyX2x6b19pbml0KHZvaWQpOwordm9pZCBqZmZzMl9sem9fZXhpdCh2b2lkKTsKKyNlbmRpZgorCisjZW5kaWYgLyogX19KRkZTMl9DT01QUl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXByX3J0aW1lLmMgYi9mcy9qZmZzMi9jb21wcl9ydGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MzEyOTQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9jb21wcl9ydGltZS5jCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBBcmphbiB2YW4gZGUgVmVuIDxhcmphbnZAcmVkaGF0LmNvbT4KKyAqCisgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgorICoKKyAqICRJZDogY29tcHJfcnRpbWUuYyx2IDEuMTQgMjAwNC8wNi8yMyAxNjozNDo0MCBoYXZhc2kgRXhwICQKKyAqCisgKgorICogVmVyeSBzaW1wbGUgbHo3Ny1pc2ggZW5jb2Rlci4KKyAqCisgKiBUaGVvcnkgb2Ygb3BlcmF0aW9uOiBCb3RoIGVuY29kZXIgYW5kIGRlY29kZXIgaGF2ZSBhIGxpc3Qgb2YgImxhc3QKKyAqIG9jY3VycmVuY2VzIiBmb3IgZXZlcnkgcG9zc2libGUgc291cmNlLXZhbHVlOyBhZnRlciBzZW5kaW5nIHRoZQorICogZmlyc3Qgc291cmNlLWJ5dGUsIHRoZSBzZWNvbmQgYnl0ZSBpbmRpY2F0ZWQgdGhlICJydW4iIGxlbmd0aCBvZgorICogbWF0Y2hlcworICoKKyAqIFRoZSBhbGdvcml0aG0gaXMgaW50ZW5kZWQgdG8gb25seSBzZW5kICJ3aG9sZSBieXRlcyIsIG5vIGJpdC1tZXNzaW5nLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPiAKKyNpbmNsdWRlIDxsaW51eC9qZmZzMi5oPiAKKyNpbmNsdWRlICJjb21wci5oIgorCisvKiBfY29tcHJlc3MgcmV0dXJucyB0aGUgY29tcHJlc3NlZCBzaXplLCAtMSBpZiBiaWdnZXIgKi8KK3N0YXRpYyBpbnQgamZmczJfcnRpbWVfY29tcHJlc3ModW5zaWduZWQgY2hhciAqZGF0YV9pbiwKKwkJCQl1bnNpZ25lZCBjaGFyICpjcGFnZV9vdXQsCisJCQkJdWludDMyX3QgKnNvdXJjZWxlbiwgdWludDMyX3QgKmRzdGxlbiwKKwkJCQl2b2lkICptb2RlbCkKK3sKKwlzaG9ydCBwb3NpdGlvbnNbMjU2XTsKKwlpbnQgb3V0cG9zID0gMDsKKwlpbnQgcG9zPTA7CisKKwltZW1zZXQocG9zaXRpb25zLDAsc2l6ZW9mKHBvc2l0aW9ucykpOyAKKwkKKwl3aGlsZSAocG9zIDwgKCpzb3VyY2VsZW4pICYmIG91dHBvcyA8PSAoKmRzdGxlbiktMikgeworCQlpbnQgYmFja3BvcywgcnVubGVuPTA7CisJCXVuc2lnbmVkIGNoYXIgdmFsdWU7CisJCQorCQl2YWx1ZSA9IGRhdGFfaW5bcG9zXTsKKworCQljcGFnZV9vdXRbb3V0cG9zKytdID0gZGF0YV9pbltwb3MrK107CisJCQorCQliYWNrcG9zID0gcG9zaXRpb25zW3ZhbHVlXTsKKwkJcG9zaXRpb25zW3ZhbHVlXT1wb3M7CisJCQorCQl3aGlsZSAoKGJhY2twb3MgPCBwb3MpICYmIChwb3MgPCAoKnNvdXJjZWxlbikpICYmCisJCSAgICAgICAoZGF0YV9pbltwb3NdPT1kYXRhX2luW2JhY2twb3MrK10pICYmIChydW5sZW48MjU1KSkgeworCQkJcG9zKys7CisJCQlydW5sZW4rKzsKKwkJfQorCQljcGFnZV9vdXRbb3V0cG9zKytdID0gcnVubGVuOworCX0KKworCWlmIChvdXRwb3MgPj0gcG9zKSB7CisJCS8qIFdlIGZhaWxlZCAqLworCQlyZXR1cm4gLTE7CisJfQorCQorCS8qIFRlbGwgdGhlIGNhbGxlciBob3cgbXVjaCB3ZSBtYW5hZ2VkIHRvIGNvbXByZXNzLCBhbmQgaG93IG11Y2ggc3BhY2UgaXQgdG9vayAqLworCSpzb3VyY2VsZW4gPSBwb3M7CisJKmRzdGxlbiA9IG91dHBvczsKKwlyZXR1cm4gMDsKK30JCSAgIAorCisKK3N0YXRpYyBpbnQgamZmczJfcnRpbWVfZGVjb21wcmVzcyh1bnNpZ25lZCBjaGFyICpkYXRhX2luLAorCQkJCSAgdW5zaWduZWQgY2hhciAqY3BhZ2Vfb3V0LAorCQkJCSAgdWludDMyX3Qgc3JjbGVuLCB1aW50MzJfdCBkZXN0bGVuLAorCQkJCSAgdm9pZCAqbW9kZWwpCit7CisJc2hvcnQgcG9zaXRpb25zWzI1Nl07CisJaW50IG91dHBvcyA9IDA7CisJaW50IHBvcz0wOworCQorCW1lbXNldChwb3NpdGlvbnMsMCxzaXplb2YocG9zaXRpb25zKSk7IAorCQorCXdoaWxlIChvdXRwb3M8ZGVzdGxlbikgeworCQl1bnNpZ25lZCBjaGFyIHZhbHVlOworCQlpbnQgYmFja29mZnM7CisJCWludCByZXBlYXQ7CisJCQorCQl2YWx1ZSA9IGRhdGFfaW5bcG9zKytdOworCQljcGFnZV9vdXRbb3V0cG9zKytdID0gdmFsdWU7IC8qIGZpcnN0IHRoZSB2ZXJiYXRpbSBjb3BpZWQgYnl0ZSAqLworCQlyZXBlYXQgPSBkYXRhX2luW3BvcysrXTsKKwkJYmFja29mZnMgPSBwb3NpdGlvbnNbdmFsdWVdOworCQkKKwkJcG9zaXRpb25zW3ZhbHVlXT1vdXRwb3M7CisJCWlmIChyZXBlYXQpIHsKKwkJCWlmIChiYWNrb2ZmcyArIHJlcGVhdCA+PSBvdXRwb3MpIHsKKwkJCQl3aGlsZShyZXBlYXQpIHsKKwkJCQkJY3BhZ2Vfb3V0W291dHBvcysrXSA9IGNwYWdlX291dFtiYWNrb2ZmcysrXTsKKwkJCQkJcmVwZWF0LS07CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQltZW1jcHkoJmNwYWdlX291dFtvdXRwb3NdLCZjcGFnZV9vdXRbYmFja29mZnNdLHJlcGVhdCk7CisJCQkJb3V0cG9zKz1yZXBlYXQ7CQkKKwkJCX0KKwkJfQorCX0KKyAgICAgICAgcmV0dXJuIDA7Cit9CQkgICAKKworc3RhdGljIHN0cnVjdCBqZmZzMl9jb21wcmVzc29yIGpmZnMyX3J0aW1lX2NvbXAgPSB7CisgICAgLnByaW9yaXR5ID0gSkZGUzJfUlRJTUVfUFJJT1JJVFksCisgICAgLm5hbWUgPSAicnRpbWUiLAorICAgIC5jb21wciA9IEpGRlMyX0NPTVBSX1JUSU1FLAorICAgIC5jb21wcmVzcyA9ICZqZmZzMl9ydGltZV9jb21wcmVzcywKKyAgICAuZGVjb21wcmVzcyA9ICZqZmZzMl9ydGltZV9kZWNvbXByZXNzLAorI2lmZGVmIEpGRlMyX1JUSU1FX0RJU0FCTEVECisgICAgLmRpc2FibGVkID0gMSwKKyNlbHNlCisgICAgLmRpc2FibGVkID0gMCwKKyNlbmRpZgorfTsKKworaW50IGpmZnMyX3J0aW1lX2luaXQodm9pZCkKK3sKKyAgICByZXR1cm4gamZmczJfcmVnaXN0ZXJfY29tcHJlc3NvcigmamZmczJfcnRpbWVfY29tcCk7Cit9CisKK3ZvaWQgamZmczJfcnRpbWVfZXhpdCh2b2lkKQoreworICAgIGpmZnMyX3VucmVnaXN0ZXJfY29tcHJlc3NvcigmamZmczJfcnRpbWVfY29tcCk7Cit9CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9jb21wcl9ydWJpbi5jIGIvZnMvamZmczIvY29tcHJfcnViaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTBkNjYyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZmczIvY29tcHJfcnViaW4uYwpAQCAtMCwwICsxLDM3MyBAQAorLyoKKyAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAqCisgKiBDcmVhdGVkIGJ5IEFyamFuIHZhbiBkZSBWZW4gPGFyamFudkByZWRoYXQuY29tPgorICoKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCisgKgorICogJElkOiBjb21wcl9ydWJpbi5jLHYgMS4yMCAyMDA0LzA2LzIzIDE2OjM0OjQwIGhhdmFzaSBFeHAgJAorICoKKyAqLworCisgCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9qZmZzMi5oPgorI2luY2x1ZGUgImNvbXByX3J1YmluLmgiCisjaW5jbHVkZSAiaGlzdG9fbWlwcy5oIgorI2luY2x1ZGUgImNvbXByLmgiCisKK3N0YXRpYyB2b2lkIGluaXRfcnViaW4oc3RydWN0IHJ1YmluX3N0YXRlICpycywgaW50IGRpdiwgaW50ICpiaXRzKQorewkKKwlpbnQgYzsKKworCXJzLT5xID0gMDsKKwlycy0+cCA9IChsb25nKSAoMiAqIFVQUEVSX0JJVF9SVUJJTik7CisJcnMtPmJpdF9udW1iZXIgPSAobG9uZykgMDsKKwlycy0+Yml0X2RpdmlkZXIgPSBkaXY7CisJZm9yIChjPTA7IGM8ODsgYysrKQorCQlycy0+Yml0c1tjXSA9IGJpdHNbY107Cit9CisKKworc3RhdGljIGludCBlbmNvZGUoc3RydWN0IHJ1YmluX3N0YXRlICpycywgbG9uZyBBLCBsb25nIEIsIGludCBzeW1ib2wpCit7CisKKwlsb25nIGkwLCBpMTsKKwlpbnQgcmV0OworCisJd2hpbGUgKChycy0+cSA+PSBVUFBFUl9CSVRfUlVCSU4pIHx8ICgocnMtPnAgKyBycy0+cSkgPD0gVVBQRVJfQklUX1JVQklOKSkgeworCQlycy0+Yml0X251bWJlcisrOworCQkKKwkJcmV0ID0gcHVzaGJpdCgmcnMtPnBwLCAocnMtPnEgJiBVUFBFUl9CSVRfUlVCSU4pID8gMSA6IDAsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcnMtPnEgJj0gTE9XRVJfQklUU19SVUJJTjsKKwkJcnMtPnEgPDw9IDE7CisJCXJzLT5wIDw8PSAxOworCX0KKwlpMCA9IEEgKiBycy0+cCAvIChBICsgQik7CisJaWYgKGkwIDw9IDApIHsKKwkJaTAgPSAxOworCX0KKwlpZiAoaTAgPj0gcnMtPnApIHsKKwkJaTAgPSBycy0+cCAtIDE7CisJfQorCWkxID0gcnMtPnAgLSBpMDsKKworCWlmIChzeW1ib2wgPT0gMCkKKwkJcnMtPnAgPSBpMDsKKwllbHNlIHsKKwkJcnMtPnAgPSBpMTsKKwkJcnMtPnEgKz0gaTA7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGVuZF9ydWJpbihzdHJ1Y3QgcnViaW5fc3RhdGUgKnJzKQorewkJCQkKKworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFJVQklOX1JFR19TSVpFOyBpKyspIHsKKwkJcHVzaGJpdCgmcnMtPnBwLCAoVVBQRVJfQklUX1JVQklOICYgcnMtPnEpID8gMSA6IDAsIDEpOworCQlycy0+cSAmPSBMT1dFUl9CSVRTX1JVQklOOworCQlycy0+cSA8PD0gMTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgaW5pdF9kZWNvZGUoc3RydWN0IHJ1YmluX3N0YXRlICpycywgaW50IGRpdiwgaW50ICpiaXRzKQoreworCWluaXRfcnViaW4ocnMsIGRpdiwgYml0cyk7CQkKKworCS8qIGJlaGFsdmUgbG93ZXIgKi8KKwlycy0+cmVjX3EgPSAwOworCisJZm9yIChycy0+Yml0X251bWJlciA9IDA7IHJzLT5iaXRfbnVtYmVyKysgPCBSVUJJTl9SRUdfU0laRTsgcnMtPnJlY19xID0gcnMtPnJlY19xICogMiArIChsb25nKSAocHVsbGJpdCgmcnMtPnBwKSkpCisJCTsKK30KKworc3RhdGljIHZvaWQgX19kb19kZWNvZGUoc3RydWN0IHJ1YmluX3N0YXRlICpycywgdW5zaWduZWQgbG9uZyBwLCB1bnNpZ25lZCBsb25nIHEpCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBsb3dlcl9iaXRzX3J1YmluID0gTE9XRVJfQklUU19SVUJJTjsKKwl1bnNpZ25lZCBsb25nIHJlY19xOworCWludCBjLCBiaXRzID0gMDsKKworCS8qCisJICogRmlyc3QsIHdvcmsgb3V0IGhvdyBtYW55IGJpdHMgd2UgbmVlZCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uCisJICogTm90ZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBkb25lIHRoZSBpbml0aWFsIGNoZWNrIG9uIHRoaXMKKwkgKiBsb29wIHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKwkgKi8KKwlkbyB7CisJCWJpdHMrKzsKKwkJcSAmPSBsb3dlcl9iaXRzX3J1YmluOworCQlxIDw8PSAxOworCQlwIDw8PSAxOworCX0gd2hpbGUgKChxID49IFVQUEVSX0JJVF9SVUJJTikgfHwgKChwICsgcSkgPD0gVVBQRVJfQklUX1JVQklOKSk7CisKKwlycy0+cCA9IHA7CisJcnMtPnEgPSBxOworCisJcnMtPmJpdF9udW1iZXIgKz0gYml0czsKKworCS8qCisJICogTm93IGdldCB0aGUgYml0cy4gIFdlIHJlYWxseSB3YW50IHRoaXMgdG8gYmUgImdldCBuIGJpdHMiLgorCSAqLworCXJlY19xID0gcnMtPnJlY19xOworCWRvIHsKKwkJYyA9IHB1bGxiaXQoJnJzLT5wcCk7CisJCXJlY19xICY9IGxvd2VyX2JpdHNfcnViaW47CisJCXJlY19xIDw8PSAxOworCQlyZWNfcSArPSBjOworCX0gd2hpbGUgKC0tYml0cyk7CisJcnMtPnJlY19xID0gcmVjX3E7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlKHN0cnVjdCBydWJpbl9zdGF0ZSAqcnMsIGxvbmcgQSwgbG9uZyBCKQoreworCXVuc2lnbmVkIGxvbmcgcCA9IHJzLT5wLCBxID0gcnMtPnE7CisJbG9uZyBpMCwgdGhyZXNob2xkOworCWludCBzeW1ib2w7CisKKwlpZiAocSA+PSBVUFBFUl9CSVRfUlVCSU4gfHwgKChwICsgcSkgPD0gVVBQRVJfQklUX1JVQklOKSkKKwkJX19kb19kZWNvZGUocnMsIHAsIHEpOworCisJaTAgPSBBICogcnMtPnAgLyAoQSArIEIpOworCWlmIChpMCA8PSAwKSB7CisJCWkwID0gMTsKKwl9CisJaWYgKGkwID49IHJzLT5wKSB7CisJCWkwID0gcnMtPnAgLSAxOworCX0KKworCXRocmVzaG9sZCA9IHJzLT5xICsgaTA7CisJc3ltYm9sID0gcnMtPnJlY19xID49IHRocmVzaG9sZDsKKwlpZiAocnMtPnJlY19xID49IHRocmVzaG9sZCkgeworCQlycy0+cSArPSBpMDsKKwkJaTAgPSBycy0+cCAtIGkwOworCX0KKworCXJzLT5wID0gaTA7CisKKwlyZXR1cm4gc3ltYm9sOworfQorCisKKworc3RhdGljIGludCBvdXRfYnl0ZShzdHJ1Y3QgcnViaW5fc3RhdGUgKnJzLCB1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisJaW50IGksIHJldDsKKwlzdHJ1Y3QgcnViaW5fc3RhdGUgcnNfY29weTsKKwlyc19jb3B5ID0gKnJzOworCisJZm9yIChpPTA7aTw4O2krKykgeworCQlyZXQgPSBlbmNvZGUocnMsIHJzLT5iaXRfZGl2aWRlci1ycy0+Yml0c1tpXSxycy0+Yml0c1tpXSxieXRlJjEpOworCQlpZiAocmV0KSB7CisJCQkvKiBGYWlsZWQuIFJlc3RvcmUgb2xkIHN0YXRlICovCisJCQkqcnMgPSByc19jb3B5OworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlieXRlPWJ5dGU+PjE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluX2J5dGUoc3RydWN0IHJ1YmluX3N0YXRlICpycykKK3sKKwlpbnQgaSwgcmVzdWx0ID0gMCwgYml0X2RpdmlkZXIgPSBycy0+Yml0X2RpdmlkZXI7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlyZXN1bHQgfD0gZGVjb2RlKHJzLCBiaXRfZGl2aWRlciAtIHJzLT5iaXRzW2ldLCBycy0+Yml0c1tpXSkgPDwgaTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKworCitzdGF0aWMgaW50IHJ1YmluX2RvX2NvbXByZXNzKGludCBiaXRfZGl2aWRlciwgaW50ICpiaXRzLCB1bnNpZ25lZCBjaGFyICpkYXRhX2luLCAKKwkJICAgICAgdW5zaWduZWQgY2hhciAqY3BhZ2Vfb3V0LCB1aW50MzJfdCAqc291cmNlbGVuLCB1aW50MzJfdCAqZHN0bGVuKQorCXsKKwlpbnQgb3V0cG9zID0gMDsKKwlpbnQgcG9zPTA7CisJc3RydWN0IHJ1YmluX3N0YXRlIHJzOworCisJaW5pdF9wdXNocHVsbCgmcnMucHAsIGNwYWdlX291dCwgKmRzdGxlbiAqIDgsIDAsIDMyKTsKKworCWluaXRfcnViaW4oJnJzLCBiaXRfZGl2aWRlciwgYml0cyk7CisJCisJd2hpbGUgKHBvcyA8ICgqc291cmNlbGVuKSAmJiAhb3V0X2J5dGUoJnJzLCBkYXRhX2luW3Bvc10pKQorCQlwb3MrKzsKKwkKKwllbmRfcnViaW4oJnJzKTsKKworCWlmIChvdXRwb3MgPiBwb3MpIHsKKwkJLyogV2UgZmFpbGVkICovCisJCXJldHVybiAtMTsKKwl9CisJCisJLyogVGVsbCB0aGUgY2FsbGVyIGhvdyBtdWNoIHdlIG1hbmFnZWQgdG8gY29tcHJlc3MsIAorCSAqIGFuZCBob3cgbXVjaCBzcGFjZSBpdCB0b29rICovCisJCisJb3V0cG9zID0gKHB1c2hlZGJpdHMoJnJzLnBwKSs3KS84OworCQorCWlmIChvdXRwb3MgPj0gcG9zKQorCQlyZXR1cm4gLTE7IC8qIFdlIGRpZG4ndCBhY3R1YWxseSBjb21wcmVzcyAqLworCSpzb3VyY2VsZW4gPSBwb3M7CisJKmRzdGxlbiA9IG91dHBvczsKKwlyZXR1cm4gMDsKK30JCSAgIAorI2lmIDAKKy8qIF9jb21wcmVzcyByZXR1cm5zIHRoZSBjb21wcmVzc2VkIHNpemUsIC0xIGlmIGJpZ2dlciAqLworaW50IGpmZnMyX3J1YmlubWlwc19jb21wcmVzcyh1bnNpZ25lZCBjaGFyICpkYXRhX2luLCB1bnNpZ25lZCBjaGFyICpjcGFnZV9vdXQsIAorCQkgICB1aW50MzJfdCAqc291cmNlbGVuLCB1aW50MzJfdCAqZHN0bGVuLCB2b2lkICptb2RlbCkKK3sKKwlyZXR1cm4gcnViaW5fZG9fY29tcHJlc3MoQklUX0RJVklERVJfTUlQUywgYml0c19taXBzLCBkYXRhX2luLCBjcGFnZV9vdXQsIHNvdXJjZWxlbiwgZHN0bGVuKTsKK30KKyNlbmRpZgoraW50IGpmZnMyX2R5bnJ1YmluX2NvbXByZXNzKHVuc2lnbmVkIGNoYXIgKmRhdGFfaW4sIHVuc2lnbmVkIGNoYXIgKmNwYWdlX291dCwgCisJCSAgIHVpbnQzMl90ICpzb3VyY2VsZW4sIHVpbnQzMl90ICpkc3RsZW4sIHZvaWQgKm1vZGVsKQoreworCWludCBiaXRzWzhdOworCXVuc2lnbmVkIGNoYXIgaGlzdG9bMjU2XTsKKwlpbnQgaTsKKwlpbnQgcmV0OworCXVpbnQzMl90IG15c3JjbGVuLCBteWRzdGxlbjsKKworCW15c3JjbGVuID0gKnNvdXJjZWxlbjsKKwlteWRzdGxlbiA9ICpkc3RsZW4gLSA4OworCisJaWYgKCpkc3RsZW4gPD0gMTIpCisJCXJldHVybiAtMTsKKworCW1lbXNldChoaXN0bywgMCwgMjU2KTsKKwlmb3IgKGk9MDsgaTxteXNyY2xlbjsgaSsrKSB7CisJCWhpc3RvW2RhdGFfaW5baV1dKys7CisJfQorCW1lbXNldChiaXRzLCAwLCBzaXplb2YoaW50KSo4KTsKKwlmb3IgKGk9MDsgaTwyNTY7IGkrKykgeworCQlpZiAoaSYxMjgpCisJCQliaXRzWzddICs9IGhpc3RvW2ldOworCQlpZiAoaSY2NCkKKwkJCWJpdHNbNl0gKz0gaGlzdG9baV07CisJCWlmIChpJjMyKQorCQkJYml0c1s1XSArPSBoaXN0b1tpXTsKKwkJaWYgKGkmMTYpCisJCQliaXRzWzRdICs9IGhpc3RvW2ldOworCQlpZiAoaSY4KQorCQkJYml0c1szXSArPSBoaXN0b1tpXTsKKwkJaWYgKGkmNCkKKwkJCWJpdHNbMl0gKz0gaGlzdG9baV07CisJCWlmIChpJjIpCisJCQliaXRzWzFdICs9IGhpc3RvW2ldOworCQlpZiAoaSYxKQorCQkJYml0c1swXSArPSBoaXN0b1tpXTsKKwl9CisKKwlmb3IgKGk9MDsgaTw4OyBpKyspIHsKKwkJYml0c1tpXSA9IChiaXRzW2ldICogMjU2KSAvIG15c3JjbGVuOworCQlpZiAoIWJpdHNbaV0pIGJpdHNbaV0gPSAxOworCQlpZiAoYml0c1tpXSA+IDI1NSkgYml0c1tpXSA9IDI1NTsKKwkJY3BhZ2Vfb3V0W2ldID0gYml0c1tpXTsKKwl9CisKKwlyZXQgPSBydWJpbl9kb19jb21wcmVzcygyNTYsIGJpdHMsIGRhdGFfaW4sIGNwYWdlX291dCs4LCAmbXlzcmNsZW4sICZteWRzdGxlbik7CisJaWYgKHJldCkgCisJCXJldHVybiByZXQ7CisKKwkvKiBBZGQgYmFjayB0aGUgOCBieXRlcyB3ZSB0b29rIGZvciB0aGUgcHJvYmFiaWxpdGllcyAqLworCW15ZHN0bGVuICs9IDg7CisKKwlpZiAobXlzcmNsZW4gPD0gbXlkc3RsZW4pIHsKKwkJLyogV2UgY29tcHJlc3NlZCAqLworCQlyZXR1cm4gLTE7CisJfQorCisJKnNvdXJjZWxlbiA9IG15c3JjbGVuOworCSpkc3RsZW4gPSBteWRzdGxlbjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcnViaW5fZG9fZGVjb21wcmVzcyhpbnQgYml0X2RpdmlkZXIsIGludCAqYml0cywgdW5zaWduZWQgY2hhciAqY2RhdGFfaW4sIAorCQkJIHVuc2lnbmVkIGNoYXIgKnBhZ2Vfb3V0LCB1aW50MzJfdCBzcmNsZW4sIHVpbnQzMl90IGRlc3RsZW4pCit7CisJaW50IG91dHBvcyA9IDA7CisJc3RydWN0IHJ1YmluX3N0YXRlIHJzOworCQorCWluaXRfcHVzaHB1bGwoJnJzLnBwLCBjZGF0YV9pbiwgc3JjbGVuLCAwLCAwKTsKKwlpbml0X2RlY29kZSgmcnMsIGJpdF9kaXZpZGVyLCBiaXRzKTsKKwkKKwl3aGlsZSAob3V0cG9zIDwgZGVzdGxlbikgeworCQlwYWdlX291dFtvdXRwb3MrK10gPSBpbl9ieXRlKCZycyk7CisJfQorfQkJICAgCisKKworaW50IGpmZnMyX3J1YmlubWlwc19kZWNvbXByZXNzKHVuc2lnbmVkIGNoYXIgKmRhdGFfaW4sIHVuc2lnbmVkIGNoYXIgKmNwYWdlX291dCwgCisJCSAgIHVpbnQzMl90IHNvdXJjZWxlbiwgdWludDMyX3QgZHN0bGVuLCB2b2lkICptb2RlbCkKK3sKKwlydWJpbl9kb19kZWNvbXByZXNzKEJJVF9ESVZJREVSX01JUFMsIGJpdHNfbWlwcywgZGF0YV9pbiwgY3BhZ2Vfb3V0LCBzb3VyY2VsZW4sIGRzdGxlbik7CisgICAgICAgIHJldHVybiAwOworfQorCitpbnQgamZmczJfZHlucnViaW5fZGVjb21wcmVzcyh1bnNpZ25lZCBjaGFyICpkYXRhX2luLCB1bnNpZ25lZCBjaGFyICpjcGFnZV9vdXQsIAorCQkgICB1aW50MzJfdCBzb3VyY2VsZW4sIHVpbnQzMl90IGRzdGxlbiwgdm9pZCAqbW9kZWwpCit7CisJaW50IGJpdHNbOF07CisJaW50IGM7CisKKwlmb3IgKGM9MDsgYzw4OyBjKyspCisJCWJpdHNbY10gPSBkYXRhX2luW2NdOworCisJcnViaW5fZG9fZGVjb21wcmVzcygyNTYsIGJpdHMsIGRhdGFfaW4rOCwgY3BhZ2Vfb3V0LCBzb3VyY2VsZW4tOCwgZHN0bGVuKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgamZmczJfY29tcHJlc3NvciBqZmZzMl9ydWJpbm1pcHNfY29tcCA9IHsKKyAgICAucHJpb3JpdHkgPSBKRkZTMl9SVUJJTk1JUFNfUFJJT1JJVFksCisgICAgLm5hbWUgPSAicnViaW5taXBzIiwKKyAgICAuY29tcHIgPSBKRkZTMl9DT01QUl9EWU5SVUJJTiwKKyAgICAuY29tcHJlc3MgPSBOVUxMLCAvKiZqZmZzMl9ydWJpbm1pcHNfY29tcHJlc3MsKi8KKyAgICAuZGVjb21wcmVzcyA9ICZqZmZzMl9ydWJpbm1pcHNfZGVjb21wcmVzcywKKyNpZmRlZiBKRkZTMl9SVUJJTk1JUFNfRElTQUJMRUQKKyAgICAuZGlzYWJsZWQgPSAxLAorI2Vsc2UKKyAgICAuZGlzYWJsZWQgPSAwLAorI2VuZGlmCit9OworCitpbnQgamZmczJfcnViaW5taXBzX2luaXQodm9pZCkKK3sKKyAgICByZXR1cm4gamZmczJfcmVnaXN0ZXJfY29tcHJlc3NvcigmamZmczJfcnViaW5taXBzX2NvbXApOworfQorCit2b2lkIGpmZnMyX3J1YmlubWlwc19leGl0KHZvaWQpCit7CisgICAgamZmczJfdW5yZWdpc3Rlcl9jb21wcmVzc29yKCZqZmZzMl9ydWJpbm1pcHNfY29tcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgamZmczJfY29tcHJlc3NvciBqZmZzMl9keW5ydWJpbl9jb21wID0geworICAgIC5wcmlvcml0eSA9IEpGRlMyX0RZTlJVQklOX1BSSU9SSVRZLAorICAgIC5uYW1lID0gImR5bnJ1YmluIiwKKyAgICAuY29tcHIgPSBKRkZTMl9DT01QUl9SVUJJTk1JUFMsCisgICAgLmNvbXByZXNzID0gamZmczJfZHlucnViaW5fY29tcHJlc3MsCisgICAgLmRlY29tcHJlc3MgPSAmamZmczJfZHlucnViaW5fZGVjb21wcmVzcywKKyNpZmRlZiBKRkZTMl9EWU5SVUJJTl9ESVNBQkxFRAorICAgIC5kaXNhYmxlZCA9IDEsCisjZWxzZQorICAgIC5kaXNhYmxlZCA9IDAsCisjZW5kaWYKK307CisKK2ludCBqZmZzMl9keW5ydWJpbl9pbml0KHZvaWQpCit7CisgICAgcmV0dXJuIGpmZnMyX3JlZ2lzdGVyX2NvbXByZXNzb3IoJmpmZnMyX2R5bnJ1YmluX2NvbXApOworfQorCit2b2lkIGpmZnMyX2R5bnJ1YmluX2V4aXQodm9pZCkKK3sKKyAgICBqZmZzMl91bnJlZ2lzdGVyX2NvbXByZXNzb3IoJmpmZnMyX2R5bnJ1YmluX2NvbXApOworfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvY29tcHJfcnViaW4uaCBiL2ZzL2pmZnMyL2NvbXByX3J1YmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y1MWUzNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL2NvbXByX3J1YmluLmgKQEAgLTAsMCArMSwyMSBAQAorLyogUnViaW4gZW5jb2Rlci9kZWNvZGVyIGhlYWRlciAgICAgICAqLworLyogd29yayBzdGFydGVkIGF0ICAgOiBhdWcgICAzLCAxOTk0ICAqLworLyogbGFzdCBtb2RpZmljYXRpb24gOiBhdWcgIDE1LCAxOTk0ICAqLworLyogJElkOiBjb21wcl9ydWJpbi5oLHYgMS42IDIwMDIvMDEvMjUgMDE6NDk6MjYgZHdtdzIgRXhwICQgKi8KKworI2luY2x1ZGUgInB1c2hwdWxsLmgiCisKKyNkZWZpbmUgUlVCSU5fUkVHX1NJWkUgICAxNgorI2RlZmluZSBVUFBFUl9CSVRfUlVCSU4gICAgKCgobG9uZykgMSk8PChSVUJJTl9SRUdfU0laRS0xKSkKKyNkZWZpbmUgTE9XRVJfQklUU19SVUJJTiAgICgoKChsb25nKSAxKTw8KFJVQklOX1JFR19TSVpFLTEpKS0xKQorCisKK3N0cnVjdCBydWJpbl9zdGF0ZSB7CisJdW5zaWduZWQgbG9uZyBwOwkJCisJdW5zaWduZWQgbG9uZyBxOwkKKwl1bnNpZ25lZCBsb25nIHJlY19xOworCWxvbmcgYml0X251bWJlcjsKKwlzdHJ1Y3QgcHVzaHB1bGwgcHA7CisJaW50IGJpdF9kaXZpZGVyOworCWludCBiaXRzWzhdOworfTsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXByX3psaWIuYyBiL2ZzL2pmZnMyL2NvbXByX3psaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjk5MzJjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZmczIvY29tcHJfemxpYi5jCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiAkSWQ6IGNvbXByX3psaWIuYyx2IDEuMjkgMjAwNC8xMS8xNiAyMDozNjoxMSBkd213MiBFeHAgJAorICoKKyAqLworCisjaWYgIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19FQ09TKQorI2Vycm9yICJUaGUgdXNlcnNwYWNlIHN1cHBvcnQgZ290IHRvbyBtZXNzeSBhbmQgd2FzIHJlbW92ZWQuIFVwZGF0ZSB5b3VyIG1rZnMuamZmczIiCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC96bGliLmg+CisjaW5jbHVkZSA8bGludXgvenV0aWwuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSAibm9kZWxpc3QuaCIKKyNpbmNsdWRlICJjb21wci5oIgorCisJLyogUGxhbjogY2FsbCBkZWZsYXRlKCkgd2l0aCBhdmFpbF9pbiA9PSAqc291cmNlbGVuLCAKKwkJYXZhaWxfb3V0ID0gKmRzdGxlbiAtIDEyIGFuZCBmbHVzaCA9PSBaX0ZJTklTSC4gCisJCUlmIGl0IGRvZXNuJ3QgbWFuYWdlIHRvIGZpbmlzaCwJY2FsbCBpdCBhZ2FpbiB3aXRoCisJCWF2YWlsX2luID09IDAgYW5kIGF2YWlsX291dCBzZXQgdG8gdGhlIHJlbWFpbmluZyAxMgorCQlieXRlcyBmb3IgaXQgdG8gY2xlYW4gdXAuIAorCSAgIFE6IElzIDEyIGJ5dGVzIHN1ZmZpY2llbnQ/CisJKi8KKyNkZWZpbmUgU1RSRUFNX0VORF9TUEFDRSAxMgorCitzdGF0aWMgREVDTEFSRV9NVVRFWChkZWZsYXRlX3NlbSk7CitzdGF0aWMgREVDTEFSRV9NVVRFWChpbmZsYXRlX3NlbSk7CitzdGF0aWMgel9zdHJlYW0gaW5mX3N0cm0sIGRlZl9zdHJtOworCisjaWZkZWYgX19LRVJORUxfXyAvKiBMaW51eC1vbmx5ICovCisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworc3RhdGljIGludCBfX2luaXQgYWxsb2Nfd29ya3NwYWNlcyh2b2lkKQoreworCWRlZl9zdHJtLndvcmtzcGFjZSA9IHZtYWxsb2MoemxpYl9kZWZsYXRlX3dvcmtzcGFjZXNpemUoKSk7CisJaWYgKCFkZWZfc3RybS53b3Jrc3BhY2UpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBkZWZsYXRlIHdvcmtzcGFjZVxuIiwgemxpYl9kZWZsYXRlX3dvcmtzcGFjZXNpemUoKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlEMShwcmludGsoS0VSTl9ERUJVRyAiQWxsb2NhdGVkICVkIGJ5dGVzIGZvciBkZWZsYXRlIHdvcmtzcGFjZVxuIiwgemxpYl9kZWZsYXRlX3dvcmtzcGFjZXNpemUoKSkpOworCWluZl9zdHJtLndvcmtzcGFjZSA9IHZtYWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSk7CisJaWYgKCFpbmZfc3RybS53b3Jrc3BhY2UpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBpbmZsYXRlIHdvcmtzcGFjZVxuIiwgemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSk7CisJCXZmcmVlKGRlZl9zdHJtLndvcmtzcGFjZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlEMShwcmludGsoS0VSTl9ERUJVRyAiQWxsb2NhdGVkICVkIGJ5dGVzIGZvciBpbmZsYXRlIHdvcmtzcGFjZVxuIiwgemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3dvcmtzcGFjZXModm9pZCkKK3sKKwl2ZnJlZShkZWZfc3RybS53b3Jrc3BhY2UpOworCXZmcmVlKGluZl9zdHJtLndvcmtzcGFjZSk7Cit9CisjZWxzZQorI2RlZmluZSBhbGxvY193b3Jrc3BhY2VzKCkgKDApCisjZGVmaW5lIGZyZWVfd29ya3NwYWNlcygpIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworaW50IGpmZnMyX3psaWJfY29tcHJlc3ModW5zaWduZWQgY2hhciAqZGF0YV9pbiwgdW5zaWduZWQgY2hhciAqY3BhZ2Vfb3V0LCAKKwkJICAgdWludDMyX3QgKnNvdXJjZWxlbiwgdWludDMyX3QgKmRzdGxlbiwgdm9pZCAqbW9kZWwpCit7CisJaW50IHJldDsKKworCWlmICgqZHN0bGVuIDw9IFNUUkVBTV9FTkRfU1BBQ0UpCisJCXJldHVybiAtMTsKKworCWRvd24oJmRlZmxhdGVfc2VtKTsKKworCWlmIChaX09LICE9IHpsaWJfZGVmbGF0ZUluaXQoJmRlZl9zdHJtLCAzKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJkZWZsYXRlSW5pdCBmYWlsZWRcbiIpOworCQl1cCgmZGVmbGF0ZV9zZW0pOworCQlyZXR1cm4gLTE7CisJfQorCisJZGVmX3N0cm0ubmV4dF9pbiA9IGRhdGFfaW47CisJZGVmX3N0cm0udG90YWxfaW4gPSAwOworCQorCWRlZl9zdHJtLm5leHRfb3V0ID0gY3BhZ2Vfb3V0OworCWRlZl9zdHJtLnRvdGFsX291dCA9IDA7CisKKwl3aGlsZSAoZGVmX3N0cm0udG90YWxfb3V0IDwgKmRzdGxlbiAtIFNUUkVBTV9FTkRfU1BBQ0UgJiYgZGVmX3N0cm0udG90YWxfaW4gPCAqc291cmNlbGVuKSB7CisJCWRlZl9zdHJtLmF2YWlsX291dCA9ICpkc3RsZW4gLSAoZGVmX3N0cm0udG90YWxfb3V0ICsgU1RSRUFNX0VORF9TUEFDRSk7CisJCWRlZl9zdHJtLmF2YWlsX2luID0gbWluKCh1bnNpZ25lZCkoKnNvdXJjZWxlbi1kZWZfc3RybS50b3RhbF9pbiksIGRlZl9zdHJtLmF2YWlsX291dCk7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJjYWxsaW5nIGRlZmxhdGUgd2l0aCBhdmFpbF9pbiAlZCwgYXZhaWxfb3V0ICVkXG4iLAorCQkJICBkZWZfc3RybS5hdmFpbF9pbiwgZGVmX3N0cm0uYXZhaWxfb3V0KSk7CisJCXJldCA9IHpsaWJfZGVmbGF0ZSgmZGVmX3N0cm0sIFpfUEFSVElBTF9GTFVTSCk7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJkZWZsYXRlIHJldHVybmVkIHdpdGggYXZhaWxfaW4gJWQsIGF2YWlsX291dCAlZCwgdG90YWxfaW4gJWxkLCB0b3RhbF9vdXQgJWxkXG4iLCAKKwkJCSAgZGVmX3N0cm0uYXZhaWxfaW4sIGRlZl9zdHJtLmF2YWlsX291dCwgZGVmX3N0cm0udG90YWxfaW4sIGRlZl9zdHJtLnRvdGFsX291dCkpOworCQlpZiAocmV0ICE9IFpfT0spIHsKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJkZWZsYXRlIGluIGxvb3AgcmV0dXJuZWQgJWRcbiIsIHJldCkpOworCQkJemxpYl9kZWZsYXRlRW5kKCZkZWZfc3RybSk7CisJCQl1cCgmZGVmbGF0ZV9zZW0pOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCWRlZl9zdHJtLmF2YWlsX291dCArPSBTVFJFQU1fRU5EX1NQQUNFOworCWRlZl9zdHJtLmF2YWlsX2luID0gMDsKKwlyZXQgPSB6bGliX2RlZmxhdGUoJmRlZl9zdHJtLCBaX0ZJTklTSCk7CisJemxpYl9kZWZsYXRlRW5kKCZkZWZfc3RybSk7CisKKwlpZiAocmV0ICE9IFpfU1RSRUFNX0VORCkgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiZmluYWwgZGVmbGF0ZSByZXR1cm5lZCAlZFxuIiwgcmV0KSk7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZGVmX3N0cm0udG90YWxfb3V0ID49IGRlZl9zdHJtLnRvdGFsX2luKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJ6bGliIGNvbXByZXNzZWQgJWxkIGJ5dGVzIGludG8gJWxkOyBmYWlsaW5nXG4iLAorCQkJICBkZWZfc3RybS50b3RhbF9pbiwgZGVmX3N0cm0udG90YWxfb3V0KSk7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiemxpYiBjb21wcmVzc2VkICVsZCBieXRlcyBpbnRvICVsZFxuIiwKKwkJICBkZWZfc3RybS50b3RhbF9pbiwgZGVmX3N0cm0udG90YWxfb3V0KSk7CisKKwkqZHN0bGVuID0gZGVmX3N0cm0udG90YWxfb3V0OworCSpzb3VyY2VsZW4gPSBkZWZfc3RybS50b3RhbF9pbjsKKwlyZXQgPSAwOworIG91dDoKKwl1cCgmZGVmbGF0ZV9zZW0pOworCXJldHVybiByZXQ7Cit9CisKK2ludCBqZmZzMl96bGliX2RlY29tcHJlc3ModW5zaWduZWQgY2hhciAqZGF0YV9pbiwgdW5zaWduZWQgY2hhciAqY3BhZ2Vfb3V0LAorCQkgICAgICB1aW50MzJfdCBzcmNsZW4sIHVpbnQzMl90IGRlc3RsZW4sIHZvaWQgKm1vZGVsKQoreworCWludCByZXQ7CisJaW50IHdiaXRzID0gTUFYX1dCSVRTOworCisJZG93bigmaW5mbGF0ZV9zZW0pOworCisJaW5mX3N0cm0ubmV4dF9pbiA9IGRhdGFfaW47CisJaW5mX3N0cm0uYXZhaWxfaW4gPSBzcmNsZW47CisJaW5mX3N0cm0udG90YWxfaW4gPSAwOworCQorCWluZl9zdHJtLm5leHRfb3V0ID0gY3BhZ2Vfb3V0OworCWluZl9zdHJtLmF2YWlsX291dCA9IGRlc3RsZW47CisJaW5mX3N0cm0udG90YWxfb3V0ID0gMDsKKworCS8qIElmIGl0J3MgZGVmbGF0ZSwgYW5kIGl0J3MgZ290IG5vIHByZXNldCBkaWN0aW9uYXJ5LCB0aGVuCisJICAgd2UgY2FuIHRlbGwgemxpYiB0byBza2lwIHRoZSBhZGxlcjMyIGNoZWNrLiAqLworCWlmIChzcmNsZW4gPiAyICYmICEoZGF0YV9pblsxXSAmIFBSRVNFVF9ESUNUKSAmJgorCSAgICAoKGRhdGFfaW5bMF0gJiAweDBmKSA9PSBaX0RFRkxBVEVEKSAmJgorCSAgICAhKCgoZGF0YV9pblswXTw8OCkgKyBkYXRhX2luWzFdKSAlIDMxKSkgeworCisJCUQyKHByaW50ayhLRVJOX0RFQlVHICJpbmZsYXRlIHNraXBwaW5nIGFkbGVyMzJcbiIpKTsKKwkJd2JpdHMgPSAtKChkYXRhX2luWzBdID4+IDQpICsgOCk7CisJCWluZl9zdHJtLm5leHRfaW4gKz0gMjsKKwkJaW5mX3N0cm0uYXZhaWxfaW4gLT0gMjsKKwl9IGVsc2UgeworCQkvKiBMZXQgdGhpcyByZW1haW4gRDEgZm9yIG5vdyAtLSBpdCBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJpbmZsYXRlIG5vdCBza2lwcGluZyBhZGxlcjMyXG4iKSk7CisJfQorCisKKwlpZiAoWl9PSyAhPSB6bGliX2luZmxhdGVJbml0MigmaW5mX3N0cm0sIHdiaXRzKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpbmZsYXRlSW5pdCBmYWlsZWRcbiIpOworCQl1cCgmaW5mbGF0ZV9zZW0pOworCQlyZXR1cm4gMTsKKwl9CisKKwl3aGlsZSgocmV0ID0gemxpYl9pbmZsYXRlKCZpbmZfc3RybSwgWl9GSU5JU0gpKSA9PSBaX09LKQorCQk7CisJaWYgKHJldCAhPSBaX1NUUkVBTV9FTkQpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJpbmZsYXRlIHJldHVybmVkICVkXG4iLCByZXQpOworCX0KKwl6bGliX2luZmxhdGVFbmQoJmluZl9zdHJtKTsKKwl1cCgmaW5mbGF0ZV9zZW0pOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBqZmZzMl9jb21wcmVzc29yIGpmZnMyX3psaWJfY29tcCA9IHsKKyAgICAucHJpb3JpdHkgPSBKRkZTMl9aTElCX1BSSU9SSVRZLAorICAgIC5uYW1lID0gInpsaWIiLAorICAgIC5jb21wciA9IEpGRlMyX0NPTVBSX1pMSUIsCisgICAgLmNvbXByZXNzID0gJmpmZnMyX3psaWJfY29tcHJlc3MsCisgICAgLmRlY29tcHJlc3MgPSAmamZmczJfemxpYl9kZWNvbXByZXNzLAorI2lmZGVmIEpGRlMyX1pMSUJfRElTQUJMRUQKKyAgICAuZGlzYWJsZWQgPSAxLAorI2Vsc2UKKyAgICAuZGlzYWJsZWQgPSAwLAorI2VuZGlmCit9OworCitpbnQgX19pbml0IGpmZnMyX3psaWJfaW5pdCh2b2lkKQoreworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBhbGxvY193b3Jrc3BhY2VzKCk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGpmZnMyX3JlZ2lzdGVyX2NvbXByZXNzb3IoJmpmZnMyX3psaWJfY29tcCk7CisgICAgaWYgKHJldCkKKyAgICAgICAgZnJlZV93b3Jrc3BhY2VzKCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIGpmZnMyX3psaWJfZXhpdCh2b2lkKQoreworICAgIGpmZnMyX3VucmVnaXN0ZXJfY29tcHJlc3NvcigmamZmczJfemxpYl9jb21wKTsKKyAgICBmcmVlX3dvcmtzcGFjZXMoKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXBydGVzdC5jIGIvZnMvamZmczIvY29tcHJ0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y1MWYwOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL2NvbXBydGVzdC5jCkBAIC0wLDAgKzEsMzA3IEBACisvKiAkSWQ6IGNvbXBydGVzdC5jLHYgMS41IDIwMDIvMDEvMDMgMTU6MjA6NDQgZHdtdzIgRXhwICQgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2lmIDAKKyNkZWZpbmUgVEVTVERBVEFfTEVOIDUxMgorc3RhdGljIHVuc2lnbmVkIGNoYXIgdGVzdGRhdGFbVEVTVERBVEFfTEVOXSA9IHsKKyAweDdmLCAweDQ1LCAweDRjLCAweDQ2LCAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDIsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjAsIDB4ODMsIDB4MDQsIDB4MDgsIDB4MzQsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHhiMCwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzNCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgyOCwgMHgwMCwKKyAweDFlLCAweDAwLCAweDFiLCAweDAwLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDM0LCAweDAwLCAweDAwLCAweDAwLCAweDM0LCAweDgwLCAweDA0LCAweDA4LAorIDB4MzQsIDB4ODAsIDB4MDQsIDB4MDgsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmNCwgMHg4MCwgMHgwNCwgMHgwOCwKKyAweGY0LCAweDgwLCAweDA0LCAweDA4LCAweDEzLCAweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLAorIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDQsIDB4MDgsCisgMHgwMCwgMHg4MCwgMHgwNCwgMHgwOCwgMHgwZCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwZCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDA1LCAweDAwLCAweDAwLCAweDEwLCAweDk1LCAweDA0LCAweDA4LAorIDB4MTAsIDB4OTUsIDB4MDQsIDB4MDgsIDB4ZTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1OCwgMHgwNSwgMHgwMCwgMHgwMCwgMHg1OCwgMHg5NSwgMHgwNCwgMHgwOCwKKyAweDU4LCAweDk1LCAweDA0LCAweDA4LCAweGEwLCAweDAwLCAweDAwLCAweDAwLCAweGEwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDAwLCAweDAwLAorIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDgsIDB4ODEsIDB4MDQsIDB4MDgsCisgMHgwOCwgMHg4MSwgMHgwNCwgMHgwOCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDJmLCAweDZjLCAweDY5LCAweDYyLCAweDJmLCAweDZjLCAweDY0LCAweDJkLCAweDZjLCAweDY5LCAweDZlLCAweDc1LAorIDB4NzgsIDB4MmUsIDB4NzMsIDB4NmYsIDB4MmUsIDB4MzIsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NywgMHg0ZSwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLAorIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjksIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwYywgMHg4MywgMHgwNCwgMHgwOCwgMHg4MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDFjLCAweDgzLCAweDA0LCAweDA4LCAweGFjLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDU3LCAweDAwLCAweDAwLCAweDAwLAorIDB4MmMsIDB4ODMsIDB4MDQsIDB4MDgsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MWEsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgzYywgMHg4MywgMHgwNCwgMHgwOCwgMHgyZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDRjLCAweDgzLCAweDA0LCAweDA4LCAweDdkLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4ODUsIDB4MDQsIDB4MDgsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1ZiwgMHg1ZiwgMHg2NywKKyAweDZkLCAweDZmLCAweDZlLCAweDVmLCAweDczLCAweDc0LCAweDYxLCAweDcyLCAweDc0LCAweDVmLCAweDVmLCAweDAwLCAweDZjLCAweDY5LCAweDYyLCAweDYzLAorIDB4MmUsIDB4NzMsIDB4NmYsIDB4MmUsIDB4MzYsIDB4MDAsIDB4NzAsIDB4NzIsIDB4NjksIDB4NmUsIDB4NzQsIDB4NjYsIDB4MDAsIDB4NWYsIDB4NWYsIDB4NjN9OworI2Vsc2UKKyNkZWZpbmUgVEVTVERBVEFfTEVOIDM0ODEKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHRlc3RkYXRhW1RFU1REQVRBX0xFTl0gPSB7CisgMHgyMywgMHg2OSwgMHg2ZSwgMHg2MywgMHg2YywgMHg3NSwgMHg2NCwgMHg2NSwgMHgyMCwgMHgyMiwgMHg2NCwgMHg2MiwgMHg2NSwgMHg2ZSwgMHg2MywgMHg2OCwKKyAweDJlLCAweDY4LCAweDIyLCAweDBhLCAweDBhLCAweDIzLCAweDY0LCAweDY1LCAweDY2LCAweDY5LCAweDZlLCAweDY1LCAweDIwLCAweDRkLCAweDQxLCAweDU4LAorIDB4NWYsIDB4NDYsIDB4NDksIDB4NGMsIDB4NDUsIDB4NTMsIDB4MjAsIDB4MzEsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MGEsIDB4MGEsIDB4NzMsIDB4NzQsIDB4NjEsCisgMHg3NCwgMHg2OSwgMHg2MywgMHgyMCwgMHg2MywgMHg2OCwgMHg2MSwgMHg3MiwgMHgyMCwgMHg2MiwgMHg3NSwgMHg2NiwgMHg1YiwgMHgzNywgMHgzMCwgMHgzMCwKKyAweDMwLCAweDMwLCAweDVkLCAweDNiLCAweDBhLCAweDY1LCAweDc4LCAweDc0LCAweDY1LCAweDcyLCAweDZlLCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLAorIDB4NmMsIDB4NjksIDB4NmUsIDB4NjUsIDB4NWYsIDB4NjMsIDB4NmYsIDB4NzUsIDB4NmUsIDB4NzQsIDB4M2IsIDB4MGEsIDB4MGEsIDB4NzMsIDB4NzQsIDB4NjEsCisgMHg3NCwgMHg2OSwgMHg2MywgMHgyMCwgMHg3MywgMHg3NCwgMHg3MiwgMHg3NSwgMHg2MywgMHg3NCwgMHgyMCwgMHg3YiwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2ZSwKKyAweDc0LCAweDIwLCAweDY2LCAweDY0LCAweDNiLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLAorIDB4NjUsIDB4M2IsIDB4MGEsIDB4N2QsIDB4MjAsIDB4NjYsIDB4NzQsIDB4NjEsIDB4NjIsIDB4NmMsIDB4NjUsIDB4NWIsIDB4NGQsIDB4NDEsIDB4NTgsIDB4NWYsCisgMHg0NiwgMHg0OSwgMHg0YywgMHg0NSwgMHg1MywgMHg1ZCwgMHgzYiwgMHgwYSwgMHgwYSwgMHg3NiwgMHg2ZiwgMHg2OSwgMHg2NCwgMHgyMCwgMHg2NCwgMHg2ZiwKKyAweDVmLCAweDc1LCAweDZlLCAweDZjLCAweDY5LCAweDZlLCAweDZiLCAweDI4LCAweDYzLCAweDY4LCAweDYxLCAweDcyLCAweDIwLCAweDJhLCAweDY2LCAweDZlLAorIDB4NjEsIDB4NmQsIDB4NjUsIDB4MjksIDB4MGEsIDB4N2IsIDB4MGEsIDB4MDksIDB4NzMsIDB4NzQsIDB4NzIsIDB4NzUsIDB4NzAsIDB4NzAsIDB4NjUsIDB4NzIsCisgMHgyOCwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg3NSwKKyAweDZlLCAweDZjLCAweDY5LCAweDZlLCAweDZiLCAweDI4LCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDI5LCAweDIwLCAweDIxLCAweDNkLCAweDIwLAorIDB4MzAsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NzAsIDB4NzIsIDB4NjksIDB4NmUsIDB4NzQsIDB4NjYsIDB4MjgsIDB4MjIsIDB4MjgsCisgMHgyNSwgMHg2NCwgMHgyOSwgMHgyMCwgMHg3NSwgMHg2ZSwgMHg2YywgMHg2OSwgMHg2ZSwgMHg2YiwgMHgyMCwgMHgyNSwgMHg3MywgMHgyMCwgMHg2NiwgMHg2MSwKKyAweDY5LCAweDZjLCAweDY1LCAweDY0LCAweDIwLCAweDI4LCAweDI1LCAweDczLCAweDI5LCAweDVjLCAweDZlLCAweDIyLCAweDJjLCAweDIwLCAweDBhLCAweDA5LAorIDB4MDksIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4NmMsIDB4NjksIDB4NmUsIDB4NjUsIDB4NWYsIDB4NjMsIDB4NmYsIDB4NzUsCisgMHg2ZSwgMHg3NCwgMHgyYywgMHgyMCwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyYywgMHgyMCwgMHg3MywgMHg3NCwgMHg3MiwgMHg2NSwgMHg3MiwKKyAweDcyLCAweDZmLCAweDcyLCAweDI4LCAweDY1LCAweDcyLCAweDcyLCAweDZlLCAweDZmLCAweDI5LCAweDI5LCAweDNiLCAweDBhLCAweDA5LCAweDdkLCAweDBhLAorIDB4N2QsIDB4MGEsIDB4MGEsIDB4NzYsIDB4NmYsIDB4NjksIDB4NjQsIDB4MjAsIDB4NjUsIDB4NzgsIDB4NzAsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NWYsIDB4NjYsCisgMHg2OSwgMHg2YywgMHg2NSwgMHgyOCwgMHg2OSwgMHg2ZSwgMHg3NCwgMHgyMCwgMHg2NiwgMHg2NCwgMHgyYywgMHgyMCwgMHg2OSwgMHg2ZSwgMHg3NCwgMHgyMCwKKyAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDBhLCAweDdiLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDczLCAweDNiLCAweDBhLAorIDB4MDksIDB4NzcsIDB4NjgsIDB4NjksIDB4NmMsIDB4NjUsIDB4MjAsIDB4MjgsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsCisgMHgwOSwgMHgwOSwgMHg3MywgMHgyMCwgMHgzZCwgMHgyMCwgMHg0ZCwgMHg0OSwgMHg0ZSwgMHgyOCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHg2ZiwgMHg2NiwKKyAweDI4LCAweDYyLCAweDc1LCAweDY2LCAweDI5LCAweDJjLCAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDNiLCAweDBhLCAweDA5LCAweDA5LAorIDB4NzcsIDB4NzIsIDB4NjksIDB4NzQsIDB4NjUsIDB4MjgsIDB4NjYsIDB4NjQsIDB4MmMsIDB4MjAsIDB4NjIsIDB4NzUsIDB4NjYsIDB4MmMsIDB4MjAsIDB4NzMsCisgMHgyOSwgMHgzYiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyMCwgMHgyZCwgMHgzZCwgMHgyMCwgMHg3MywgMHgzYiwgMHgwYSwKKyAweDA5LCAweDdkLCAweDBhLCAweDdkLCAweDBhLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY0LCAweDZmLCAweDVmLCAweDZmLCAweDcwLAorIDB4NjUsIDB4NmUsIDB4MjgsIDB4NjMsIDB4NjgsIDB4NjEsIDB4NzIsIDB4MjAsIDB4MmEsIDB4NjYsIDB4NmUsIDB4NjEsIDB4NmQsIDB4NjUsIDB4MmMsIDB4MjAsCisgMHg2OSwgMHg2ZSwgMHg3NCwgMHgyMCwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyYywgMHgyMCwgMHg2OSwgMHg2ZSwgMHg3NCwgMHgyMCwKKyAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDBhLCAweDdiLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY2LCAweDY0LCAweDJjLAorIDB4MjAsIDB4NjksIDB4M2IsIDB4MGEsIDB4MDksIDB4NjksIDB4NmUsIDB4NzQsIDB4MjAsIDB4NjYsIDB4NmMsIDB4NjEsIDB4NjcsIDB4NzMsIDB4MjAsIDB4M2QsCisgMHgyMCwgMHg0ZiwgMHg1ZiwgMHg1MiwgMHg0NCwgMHg1NywgMHg1MiwgMHg3YywgMHg0ZiwgMHg1ZiwgMHg0MywgMHg1MiwgMHg0NSwgMHg0MSwgMHg1NCwgMHgzYiwKKyAweDBhLCAweDA5LCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDIwLCAweDczLCAweDc0LAorIDB4M2IsIDB4MGEsIDB4MDksIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NjksIDB4NjMsIDB4MjAsIDB4NjksIDB4NmUsIDB4NzQsIDB4MjAsIDB4NjMsIDB4NmYsCisgMHg3NSwgMHg2ZSwgMHg3NCwgMHgzYiwgMHgwYSwgMHgwYSwgMHgwOSwgMHg3MywgMHg3NCwgMHg3MiwgMHg3NSwgMHg3MCwgMHg3MCwgMHg2NSwgMHg3MiwgMHgyOCwKKyAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDI5LCAweDNiLCAweDBhLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDczLCAweDY5LAorIDB4N2EsIDB4NjUsIDB4MjAsIDB4M2QsIDB4M2QsIDB4MjAsIDB4MzAsIDB4MjksIDB4MjAsIDB4NjYsIDB4NmMsIDB4NjEsIDB4NjcsIDB4NzMsIDB4MjAsIDB4N2MsCisgMHgzZCwgMHgyMCwgMHg0ZiwgMHg1ZiwgMHg1NCwgMHg1MiwgMHg1NSwgMHg0ZSwgMHg0MywgMHgzYiwgMHgwYSwgMHgwYSwgMHgwOSwgMHg2NiwgMHg2NCwgMHgyMCwKKyAweDNkLCAweDIwLCAweDZmLCAweDcwLCAweDY1LCAweDZlLCAweDI4LCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDJjLCAweDIwLCAweDY2LCAweDZjLAorIDB4NjEsIDB4NjcsIDB4NzMsIDB4MmMsIDB4MjAsIDB4MzAsIDB4MzYsIDB4MzAsIDB4MzAsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsCisgMHgyOCwgMHg2NiwgMHg2NCwgMHgyMCwgMHgzZCwgMHgzZCwgMHgyMCwgMHgyZCwgMHgzMSwgMHgyOSwgMHgyMCwgMHg3YiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg3MCwKKyAweDcyLCAweDY5LCAweDZlLCAweDc0LCAweDY2LCAweDI4LCAweDIyLCAweDI4LCAweDI1LCAweDY0LCAweDI5LCAweDIwLCAweDZmLCAweDcwLCAweDY1LCAweDZlLAorIDB4MjAsIDB4MjUsIDB4NzMsIDB4MjAsIDB4NjYsIDB4NjEsIDB4NjksIDB4NmMsIDB4NjUsIDB4NjQsIDB4MjAsIDB4NjYsIDB4NmYsIDB4NzIsIDB4MjAsIDB4NjgsCisgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyMCwgMHgyNSwgMHg2NCwgMHgyMCwgMHgyOCwgMHgyNSwgMHg3MywgMHgyOSwgMHg1YywgMHg2ZSwgMHgyMiwKKyAweDJjLCAweDIwLCAweDBhLCAweDA5LCAweDA5LCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDZjLCAweDY5LCAweDZlLCAweDY1LAorIDB4NWYsIDB4NjMsIDB4NmYsIDB4NzUsIDB4NmUsIDB4NzQsIDB4MmMsIDB4MjAsIDB4NjYsIDB4NmUsIDB4NjEsIDB4NmQsIDB4NjUsIDB4MmMsIDB4MjAsIDB4NjgsCisgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyYywgMHgyMCwgMHg3MywgMHg3NCwgMHg3MiwgMHg2NSwgMHg3MiwgMHg3MiwgMHg2ZiwgMHg3MiwgMHgyOCwKKyAweDY1LCAweDcyLCAweDcyLCAweDZlLCAweDZmLCAweDI5LCAweDI5LCAweDNiLCAweDBhLCAweDA5LCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLAorIDB4NmUsIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsIDB4MDksIDB4NjYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4MjgsIDB4NjYsIDB4NjQsIDB4MmMsCisgMHgyMCwgMHgyNiwgMHg3MywgMHg3NCwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwKKyAweDIwLCAweDNlLCAweDIwLCAweDczLCAweDc0LCAweDJlLCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDIwLCAweDdiLAorIDB4MGEsIDB4MjMsIDB4NjksIDB4NjYsIDB4MjAsIDB4NDQsIDB4NDUsIDB4NDIsIDB4NTUsIDB4NDcsIDB4MGEsIDB4MDksIDB4MDksIDB4NzAsIDB4NzIsIDB4NjksCisgMHg2ZSwgMHg3NCwgMHg2NiwgMHgyOCwgMHgyMiwgMHgyOCwgMHgyNSwgMHg2NCwgMHgyOSwgMHgyMCwgMHg2NSwgMHg3OCwgMHg3MCwgMHg2MSwgMHg2ZSwgMHg2NCwKKyAweDY5LCAweDZlLCAweDY3LCAweDIwLCAweDI1LCAweDczLCAweDIwLCAweDc0LCAweDZmLCAweDIwLCAweDI1LCAweDY0LCAweDIwLCAweDY2LCAweDcyLCAweDZmLAorIDB4NmQsIDB4MjAsIDB4MjUsIDB4NjQsIDB4NWMsIDB4NmUsIDB4MjIsIDB4MmMsIDB4MjAsIDB4MGEsIDB4MDksIDB4MDksIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisgMHgyMCwgMHgyMCwgMHgyMCwgMHg2YywgMHg2OSwgMHg2ZSwgMHg2NSwgMHg1ZiwgMHg2MywgMHg2ZiwgMHg3NSwgMHg2ZSwgMHg3NCwgMHgyYywgMHgyMCwgMHg2NiwKKyAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDJjLCAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDJjLCAweDIwLCAweDI4LCAweDY5LCAweDZlLCAweDc0LAorIDB4MjksIDB4NzMsIDB4NzQsIDB4MmUsIDB4NzMsIDB4NzQsIDB4NWYsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjksIDB4M2IsIDB4MGEsIDB4MjMsIDB4NjUsCisgMHg2ZSwgMHg2NCwgMHg2OSwgMHg2NiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg2NSwgMHg3OCwgMHg3MCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg1ZiwgMHg2NiwgMHg2OSwKKyAweDZjLCAweDY1LCAweDI4LCAweDY2LCAweDY0LCAweDJjLCAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDIwLCAweDJkLCAweDIwLCAweDczLCAweDc0LAorIDB4MmUsIDB4NzMsIDB4NzQsIDB4NWYsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MjAsIDB4NjUsIDB4NmMsCisgMHg3MywgMHg2NSwgMHgyMCwgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyMCwgMHgzYywgMHgyMCwgMHg3MywgMHg3NCwKKyAweDJlLCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDIwLCAweDdiLCAweDBhLCAweDA5LCAweDA5LCAweDcwLCAweDcyLAorIDB4NjksIDB4NmUsIDB4NzQsIDB4NjYsIDB4MjgsIDB4MjIsIDB4NzQsIDB4NzIsIDB4NzUsIDB4NmUsIDB4NjMsIDB4NjEsIDB4NzQsIDB4NjksIDB4NmUsIDB4NjcsCisgMHgyMCwgMHgyNSwgMHg3MywgMHgyMCwgMHg3NCwgMHg2ZiwgMHgyMCwgMHgyNSwgMHg2NCwgMHgyMCwgMHg2NiwgMHg3MiwgMHg2ZiwgMHg2ZCwgMHgyMCwgMHgyNSwKKyAweDY0LCAweDVjLCAweDZlLCAweDIyLCAweDJjLCAweDIwLCAweDBhLCAweDA5LCAweDA5LCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorIDB4NjYsIDB4NmUsIDB4NjEsIDB4NmQsIDB4NjUsIDB4MmMsIDB4MjAsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MmMsIDB4MjAsIDB4MjgsIDB4NjksIDB4NmUsCisgMHg3NCwgMHgyOSwgMHg3MywgMHg3NCwgMHgyZSwgMHg3MywgMHg3NCwgMHg1ZiwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwOSwKKyAweDA5LCAweDY2LCAweDc0LCAweDcyLCAweDc1LCAweDZlLCAweDYzLCAweDYxLCAweDc0LCAweDY1LCAweDI4LCAweDY2LCAweDY0LCAweDJjLCAweDIwLCAweDczLAorIDB4NjksIDB4N2EsIDB4NjUsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsIDB4MDksIDB4NjYsIDB4NmYsIDB4NzIsIDB4MjAsIDB4MjgsIDB4NjksCisgMHgzZCwgMHgzMCwgMHgzYiwgMHg2OSwgMHgzYywgMHg0ZCwgMHg0MSwgMHg1OCwgMHg1ZiwgMHg0NiwgMHg0OSwgMHg0YywgMHg0NSwgMHg1MywgMHgzYiwgMHg2OSwKKyAweDJiLCAweDJiLCAweDI5LCAweDIwLCAweDdiLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDY2LCAweDc0LCAweDYxLCAweDYyLAorIDB4NmMsIDB4NjUsIDB4NWIsIDB4NjksIDB4NWQsIDB4MmUsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjAsIDB4M2QsIDB4M2QsIDB4MjAsCisgMHgzMCwgMHgyOSwgMHgyMCwgMHg2MiwgMHg3MiwgMHg2NSwgMHg2MSwgMHg2YiwgMHgzYiwgMHgwYSwgMHgwOSwgMHg3ZCwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2NiwKKyAweDIwLCAweDI4LCAweDY5LCAweDIwLCAweDNkLCAweDNkLCAweDIwLCAweDRkLCAweDQxLCAweDU4LCAweDVmLCAweDQ2LCAweDQ5LCAweDRjLCAweDQ1LCAweDUzLAorIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NzAsIDB4NzIsIDB4NjksIDB4NmUsIDB4NzQsIDB4NjYsIDB4MjgsIDB4MjIsIDB4NjYsIDB4NjksCisgMHg2YywgMHg2NSwgMHgyMCwgMHg3NCwgMHg2MSwgMHg2MiwgMHg2YywgMHg2NSwgMHgyMCwgMHg2NiwgMHg3NSwgMHg2YywgMHg2YywgMHgyMCwgMHg2NiwgMHg2ZiwKKyAweDcyLCAweDIwLCAweDI1LCAweDczLCAweDVjLCAweDZlLCAweDIyLCAweDJjLCAweDIwLCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDI5LCAweDNiLAorIDB4MGEsIDB4MDksIDB4MDksIDB4NjUsIDB4NzgsIDB4NjksIDB4NzQsIDB4MjgsIDB4MzEsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsIDB4MDksCisgMHg2NiwgMHg3NCwgMHg2MSwgMHg2MiwgMHg2YywgMHg2NSwgMHg1YiwgMHg2OSwgMHg1ZCwgMHgyZSwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwKKyAweDIwLCAweDNkLCAweDIwLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDNiLCAweDBhLCAweDA5LCAweDY2LCAweDc0LCAweDYxLCAweDYyLAorIDB4NmMsIDB4NjUsIDB4NWIsIDB4NjksIDB4NWQsIDB4MmUsIDB4NjYsIDB4NjQsIDB4MjAsIDB4M2QsIDB4MjAsIDB4NjYsIDB4NjQsIDB4M2IsIDB4MGEsIDB4MDksCisgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg2MywgMHg2ZiwgMHg3NSwgMHg2ZSwgMHg3NCwgMHgyYiwgMHgyYiwgMHgyMCwgMHgyNSwgMHgyMCwgMHgzMSwgMHgzMCwKKyAweDMwLCAweDIwLCAweDNkLCAweDNkLCAweDIwLCAweDMwLCAweDI5LCAweDIwLCAweDdiLCAweDBhLCAweDA5LCAweDA5LCAweDcwLCAweDcyLCAweDY5LCAweDZlLAorIDB4NzQsIDB4NjYsIDB4MjgsIDB4MjIsIDB4MmUsIDB4MjIsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsIDB4N2QsIDB4MGEsIDB4MGEsIDB4NzYsCisgMHg2ZiwgMHg2OSwgMHg2NCwgMHgyMCwgMHg2NCwgMHg2ZiwgMHg1ZiwgMHg3NywgMHg3MiwgMHg2OSwgMHg3NCwgMHg2NSwgMHgyOCwgMHg2OSwgMHg2ZSwgMHg3NCwKKyAweDIwLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDJjLCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDczLCAweDY5LCAweDdhLAorIDB4NjUsIDB4MmMsIDB4MjAsIDB4NjksIDB4NmUsIDB4NzQsIDB4MjAsIDB4NmYsIDB4NjYsIDB4NjYsIDB4NzMsIDB4NjUsIDB4NzQsIDB4MjksIDB4MGEsIDB4N2IsCisgMHgwYSwgMHgwOSwgMHg2OSwgMHg2ZSwgMHg3NCwgMHgyMCwgMHg2OSwgMHgzYiwgMHgwYSwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg2MiwKKyAweDc1LCAweDY2LCAweDViLCAweDMwLCAweDVkLCAweDIwLCAweDNkLCAweDNkLCAweDIwLCAweDMwLCAweDI5LCAweDIwLCAweDZkLCAweDY1LCAweDZkLCAweDczLAorIDB4NjUsIDB4NzQsIDB4MjgsIDB4NjIsIDB4NzUsIDB4NjYsIDB4MmMsIDB4MjAsIDB4MzEsIDB4MmMsIDB4MjAsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4NmYsCisgMHg2NiwgMHgyOCwgMHg2MiwgMHg3NSwgMHg2NiwgMHgyOSwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwYSwgMHgwOSwgMHg2NiwgMHg2ZiwgMHg3MiwgMHgyMCwgMHgyOCwKKyAweDY5LCAweDNkLCAweDMwLCAweDNiLCAweDY5LCAweDNjLCAweDRkLCAweDQxLCAweDU4LCAweDVmLCAweDQ2LCAweDQ5LCAweDRjLCAweDQ1LCAweDUzLCAweDNiLAorIDB4NjksIDB4MmIsIDB4MmIsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsIDB4MjgsIDB4NjYsIDB4NzQsIDB4NjEsCisgMHg2MiwgMHg2YywgMHg2NSwgMHg1YiwgMHg2OSwgMHg1ZCwgMHgyZSwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyMCwgMHgzZCwgMHgzZCwKKyAweDIwLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDI5LCAweDIwLCAweDYyLCAweDcyLCAweDY1LCAweDYxLCAweDZiLCAweDNiLCAweDBhLAorIDB4MDksIDB4N2QsIDB4MGEsIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsIDB4MjgsIDB4NjksIDB4MjAsIDB4M2QsIDB4M2QsIDB4MjAsIDB4NGQsIDB4NDEsIDB4NTgsCisgMHg1ZiwgMHg0NiwgMHg0OSwgMHg0YywgMHg0NSwgMHg1MywgMHgyOSwgMHgyMCwgMHg3YiwgMHgwYSwgMHgyMywgMHg2OSwgMHg2NiwgMHgyMCwgMHgzMSwgMHgwYSwKKyAweDA5LCAweDA5LCAweDcwLCAweDcyLCAweDY5LCAweDZlLCAweDc0LCAweDY2LCAweDI4LCAweDIyLCAweDI4LCAweDI1LCAweDY0LCAweDI5LCAweDIwLCAweDY0LAorIDB4NmYsIDB4NWYsIDB4NzcsIDB4NzIsIDB4NjksIDB4NzQsIDB4NjUsIDB4M2EsIDB4MjAsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjAsCisgMHgyNSwgMHg2NCwgMHgyMCwgMHg3NywgMHg2MSwgMHg3MywgMHgyMCwgMHg2ZSwgMHg2ZiwgMHg3NCwgMHgyMCwgMHg2ZiwgMHg3MCwgMHg2NSwgMHg2ZSwgMHgyMCwKKyAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDNkLCAweDI1LCAweDY0LCAweDIwLCAweDZmLCAweDY2LCAweDczLCAweDNkLCAweDI1LCAweDY0LCAweDVjLCAweDZlLAorIDB4MjIsIDB4MmMsIDB4MjAsIDB4MGEsIDB4MDksIDB4MDksIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4NmMsIDB4NjksIDB4NmUsCisgMHg2NSwgMHg1ZiwgMHg2MywgMHg2ZiwgMHg3NSwgMHg2ZSwgMHg3NCwgMHgyYywgMHgyMCwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyYywKKyAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDJjLCAweDIwLCAweDZmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDI5LCAweDNiLCAweDBhLAorIDB4MjMsIDB4NjUsIDB4NmUsIDB4NjQsIDB4NjksIDB4NjYsIDB4MGEsIDB4MDksIDB4MDksIDB4NzIsIDB4NjUsIDB4NzQsIDB4NzUsIDB4NzIsIDB4NmUsIDB4M2IsCisgMHgwYSwgMHgwOSwgMHg3ZCwgMHgwYSwgMHgwOSwgMHg2YywgMHg3MywgMHg2NSwgMHg2NSwgMHg2YiwgMHgyOCwgMHg2NiwgMHg3NCwgMHg2MSwgMHg2MiwgMHg2YywKKyAweDY1LCAweDViLCAweDY5LCAweDVkLCAweDJlLCAweDY2LCAweDY0LCAweDJjLCAweDIwLCAweDZmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLAorIDB4MjAsIDB4NTMsIDB4NDUsIDB4NDUsIDB4NGIsIDB4NWYsIDB4NTMsIDB4NDUsIDB4NTQsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsCisgMHgyOCwgMHg3NywgMHg3MiwgMHg2OSwgMHg3NCwgMHg2NSwgMHgyOCwgMHg2NiwgMHg3NCwgMHg2MSwgMHg2MiwgMHg2YywgMHg2NSwgMHg1YiwgMHg2OSwgMHg1ZCwKKyAweDJlLCAweDY2LCAweDY0LCAweDJjLCAweDIwLCAweDYyLCAweDc1LCAweDY2LCAweDJjLCAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDIwLAorIDB4MjEsIDB4M2QsIDB4MjAsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NzAsIDB4NzIsIDB4NjksCisgMHg2ZSwgMHg3NCwgMHg2NiwgMHgyOCwgMHgyMiwgMHg3NywgMHg3MiwgMHg2OSwgMHg3NCwgMHg2NSwgMHgyMCwgMHg2NiwgMHg2MSwgMHg2OSwgMHg2YywgMHg2NSwKKyAweDY0LCAweDIwLCAweDZmLCAweDZlLCAweDIwLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDIwLCAweDI1LCAweDY0LCAweDVjLCAweDZlLAorIDB4MjIsIDB4MmMsIDB4MjAsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsIDB4N2QsCisgMHgwYSwgMHgwYSwgMHg3NiwgMHg2ZiwgMHg2OSwgMHg2NCwgMHgyMCwgMHg2NCwgMHg2ZiwgMHg1ZiwgMHg3MiwgMHg2NSwgMHg2MSwgMHg2NCwgMHgyOCwgMHg2OSwKKyAweDZlLCAweDc0LCAweDIwLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDJjLCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDczLAorIDB4NjksIDB4N2EsIDB4NjUsIDB4MmMsIDB4MjAsIDB4NjksIDB4NmUsIDB4NzQsIDB4MjAsIDB4NmYsIDB4NjYsIDB4NjYsIDB4NzMsIDB4NjUsIDB4NzQsIDB4MjksCisgMHgwYSwgMHg3YiwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2ZSwgMHg3NCwgMHgyMCwgMHg2OSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg2NiwgMHg2ZiwgMHg3MiwgMHgyMCwKKyAweDI4LCAweDY5LCAweDNkLCAweDMwLCAweDNiLCAweDY5LCAweDNjLCAweDRkLCAweDQxLCAweDU4LCAweDVmLCAweDQ2LCAweDQ5LCAweDRjLCAweDQ1LCAweDUzLAorIDB4M2IsIDB4NjksIDB4MmIsIDB4MmIsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsIDB4MjgsIDB4NjYsIDB4NzQsCisgMHg2MSwgMHg2MiwgMHg2YywgMHg2NSwgMHg1YiwgMHg2OSwgMHg1ZCwgMHgyZSwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyMCwgMHgzZCwKKyAweDNkLCAweDIwLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDI5LCAweDIwLCAweDYyLCAweDcyLCAweDY1LCAweDYxLCAweDZiLCAweDNiLAorIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsIDB4MjgsIDB4NjksIDB4MjAsIDB4M2QsIDB4M2QsIDB4MjAsIDB4NGQsIDB4NDEsCisgMHg1OCwgMHg1ZiwgMHg0NiwgMHg0OSwgMHg0YywgMHg0NSwgMHg1MywgMHgyOSwgMHgyMCwgMHg3YiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg3MCwgMHg3MiwgMHg2OSwKKyAweDZlLCAweDc0LCAweDY2LCAweDI4LCAweDIyLCAweDI4LCAweDI1LCAweDY0LCAweDI5LCAweDIwLCAweDY0LCAweDZmLCAweDVmLCAweDcyLCAweDY1LCAweDYxLAorIDB4NjQsIDB4M2EsIDB4MjAsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjAsIDB4MjUsIDB4NjQsIDB4MjAsIDB4NzcsIDB4NjEsIDB4NzMsCisgMHgyMCwgMHg2ZSwgMHg2ZiwgMHg3NCwgMHgyMCwgMHg2ZiwgMHg3MCwgMHg2NSwgMHg2ZSwgMHgyMCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgzZCwgMHgyNSwKKyAweDY0LCAweDIwLCAweDZmLCAweDY2LCAweDczLCAweDNkLCAweDI1LCAweDY0LCAweDVjLCAweDZlLCAweDIyLCAweDJjLCAweDIwLCAweDBhLCAweDA5LCAweDA5LAorIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4NmMsIDB4NjksIDB4NmUsIDB4NjUsIDB4NWYsIDB4NjMsIDB4NmYsIDB4NzUsIDB4NmUsCisgMHg3NCwgMHgyYywgMHgyMCwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyYywgMHgyMCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyYywKKyAweDIwLCAweDZmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDI5LCAweDNiLCAweDBhLCAweDA5LCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LAorIDB4NzIsIDB4NmUsIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsIDB4MDksIDB4NmMsIDB4NzMsIDB4NjUsIDB4NjUsIDB4NmIsIDB4MjgsIDB4NjYsIDB4NzQsCisgMHg2MSwgMHg2MiwgMHg2YywgMHg2NSwgMHg1YiwgMHg2OSwgMHg1ZCwgMHgyZSwgMHg2NiwgMHg2NCwgMHgyYywgMHgyMCwgMHg2ZiwgMHg2NiwgMHg2NiwgMHg3MywKKyAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDUzLCAweDQ1LCAweDQ1LCAweDRiLCAweDVmLCAweDUzLCAweDQ1LCAweDU0LCAweDI5LCAweDNiLCAweDBhLCAweDA5LAorIDB4NzIsIDB4NjUsIDB4NjEsIDB4NjQsIDB4MjgsIDB4NjYsIDB4NzQsIDB4NjEsIDB4NjIsIDB4NmMsIDB4NjUsIDB4NWIsIDB4NjksIDB4NWQsIDB4MmUsIDB4NjYsCisgMHg2NCwgMHgyYywgMHgyMCwgMHg2MiwgMHg3NSwgMHg2NiwgMHgyYywgMHgyMCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyOSwgMHgzYiwgMHgwYSwgMHg3ZCwKKyAweDBhLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY0LCAweDZmLCAweDVmLCAweDYzLCAweDZjLCAweDZmLCAweDczLCAweDY1LCAweDI4LAorIDB4NjksIDB4NmUsIDB4NzQsIDB4MjAsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjksIDB4MGEsIDB4N2IsIDB4MGEsIDB4MDksIDB4NjksCisgMHg2ZSwgMHg3NCwgMHgyMCwgMHg2OSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg2NiwgMHg2ZiwgMHg3MiwgMHgyMCwgMHgyOCwgMHg2OSwgMHgzZCwgMHgzMCwgMHgzYiwKKyAweDY5LCAweDNjLCAweDRkLCAweDQxLCAweDU4LCAweDVmLCAweDQ2LCAweDQ5LCAweDRjLCAweDQ1LCAweDUzLCAweDNiLCAweDY5LCAweDJiLCAweDJiLCAweDI5LAorIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsIDB4MjgsIDB4NjYsIDB4NzQsIDB4NjEsIDB4NjIsIDB4NmMsIDB4NjUsIDB4NWIsCisgMHg2OSwgMHg1ZCwgMHgyZSwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyMCwgMHgzZCwgMHgzZCwgMHgyMCwgMHg2OCwgMHg2MSwgMHg2ZSwKKyAweDY0LCAweDZjLCAweDY1LCAweDI5LCAweDIwLCAweDYyLCAweDcyLCAweDY1LCAweDYxLCAweDZiLCAweDNiLCAweDBhLCAweDA5LCAweDdkLCAweDBhLCAweDA5LAorIDB4NjksIDB4NjYsIDB4MjAsIDB4MjgsIDB4NjksIDB4MjAsIDB4M2QsIDB4M2QsIDB4MjAsIDB4NGQsIDB4NDEsIDB4NTgsIDB4NWYsIDB4NDYsIDB4NDksIDB4NGMsCisgMHg0NSwgMHg1MywgMHgyOSwgMHgyMCwgMHg3YiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg3MCwgMHg3MiwgMHg2OSwgMHg2ZSwgMHg3NCwgMHg2NiwgMHgyOCwgMHgyMiwKKyAweDI4LCAweDI1LCAweDY0LCAweDI5LCAweDIwLCAweDY0LCAweDZmLCAweDVmLCAweDYzLCAweDZjLCAweDZmLCAweDczLCAweDY1LCAweDNhLCAweDIwLCAweDY4LAorIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjAsIDB4MjUsIDB4NjQsIDB4MjAsIDB4NzcsIDB4NjEsIDB4NzMsIDB4MjAsIDB4NmUsIDB4NmYsIDB4NzQsCisgMHgyMCwgMHg2ZiwgMHg3MCwgMHg2NSwgMHg2ZSwgMHg1YywgMHg2ZSwgMHgyMiwgMHgyYywgMHgyMCwgMHgwYSwgMHgwOSwgMHgwOSwgMHgyMCwgMHgyMCwgMHgyMCwKKyAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDZjLCAweDY5LCAweDZlLCAweDY1LCAweDVmLCAweDYzLCAweDZmLCAweDc1LCAweDZlLCAweDc0LCAweDJjLCAweDIwLAorIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NzIsIDB4NjUsIDB4NzQsIDB4NzUsIDB4NzIsCisgMHg2ZSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg3ZCwgMHgwYSwgMHgwOSwgMHg2MywgMHg2YywgMHg2ZiwgMHg3MywgMHg2NSwgMHgyOCwgMHg2NiwgMHg3NCwgMHg2MSwKKyAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDY5LCAweDVkLCAweDJlLCAweDY2LCAweDY0LCAweDI5LCAweDNiLCAweDBhLCAweDA5LCAweDY2LCAweDc0LCAweDYxLAorIDB4NjIsIDB4NmMsIDB4NjUsIDB4NWIsIDB4NjksIDB4NWQsIDB4MmUsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjAsIDB4M2QsIDB4MjAsCisgMHgzMCwgMHgzYiwgMHgwYSwgMHg3ZCwgMHgwYSwgMHgwYSwgMHg3NiwgMHg2ZiwgMHg2OSwgMHg2NCwgMHgyMCwgMHg2NCwgMHg2ZiwgMHg1ZiwgMHg2ZCwgMHg2YiwKKyAweDY0LCAweDY5LCAweDcyLCAweDI4LCAweDYzLCAweDY4LCAweDYxLCAweDcyLCAweDIwLCAweDJhLCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDI5LAorIDB4MGEsIDB4N2IsIDB4MGEsIDB4MDksIDB4NzMsIDB4NzQsIDB4NzIsIDB4NzUsIDB4NzAsIDB4NzAsIDB4NjUsIDB4NzIsIDB4MjgsIDB4NjYsIDB4NmUsIDB4NjEsCisgMHg2ZCwgMHg2NSwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg2ZCwgMHg2YiwgMHg2NCwgMHg2OSwgMHg3MiwKKyAweDI4LCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDJjLCAweDIwLCAweDMwLCAweDM3LCAweDMwLCAweDMwLCAweDI5LCAweDIwLCAweDIxLCAweDNkLAorIDB4MjAsIDB4MzAsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MjMsIDB4NjksIDB4NjYsIDB4MjAsIDB4NDQsIDB4NDUsIDB4NDIsIDB4NTUsIDB4NDcsIDB4MGEsCisgMHgwOSwgMHgwOSwgMHg3MCwgMHg3MiwgMHg2OSwgMHg2ZSwgMHg3NCwgMHg2NiwgMHgyOCwgMHgyMiwgMHg2ZCwgMHg2YiwgMHg2NCwgMHg2OSwgMHg3MiwgMHgyMCwKKyAweDI1LCAweDczLCAweDIwLCAweDY2LCAweDYxLCAweDY5LCAweDZjLCAweDY1LCAweDY0LCAweDIwLCAweDI4LCAweDI1LCAweDczLCAweDI5LCAweDVjLCAweDZlLAorIDB4MjIsIDB4MmMsIDB4MjAsIDB4MGEsIDB4MDksIDB4MDksIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4NjYsIDB4NmUsIDB4NjEsCisgMHg2ZCwgMHg2NSwgMHgyYywgMHgyMCwgMHg3MywgMHg3NCwgMHg3MiwgMHg2NSwgMHg3MiwgMHg3MiwgMHg2ZiwgMHg3MiwgMHgyOCwgMHg2NSwgMHg3MiwgMHg3MiwKKyAweDZlLCAweDZmLCAweDI5LCAweDI5LCAweDNiLCAweDBhLCAweDIzLCAweDY1LCAweDZlLCAweDY0LCAweDY5LCAweDY2LCAweDBhLCAweDA5LCAweDdkLCAweDBhLAorIDB4N2QsIDB4MGEsIDB4MGEsIDB4NzYsIDB4NmYsIDB4NjksIDB4NjQsIDB4MjAsIDB4NjQsIDB4NmYsIDB4NWYsIDB4NzIsIDB4NmQsIDB4NjQsIDB4NjksIDB4NzIsCisgMHgyOCwgMHg2MywgMHg2OCwgMHg2MSwgMHg3MiwgMHgyMCwgMHgyYSwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyOSwgMHgwYSwgMHg3YiwgMHgwYSwKKyAweDA5LCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDcwLCAweDcwLCAweDY1LCAweDcyLCAweDI4LCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDI5LAorIDB4M2IsIDB4MGEsIDB4MGEsIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsIDB4MjgsIDB4NzIsIDB4NmQsIDB4NjQsIDB4NjksIDB4NzIsIDB4MjgsIDB4NjYsIDB4NmUsCisgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyOSwgMHgyMCwgMHgyMSwgMHgzZCwgMHgyMCwgMHgzMCwgMHgyOSwgMHgyMCwgMHg3YiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg3MCwKKyAweDcyLCAweDY5LCAweDZlLCAweDc0LCAweDY2LCAweDI4LCAweDIyLCAweDcyLCAweDZkLCAweDY0LCAweDY5LCAweDcyLCAweDIwLCAweDI1LCAweDczLCAweDIwLAorIDB4NjYsIDB4NjEsIDB4NjksIDB4NmMsIDB4NjUsIDB4NjQsIDB4MjAsIDB4MjgsIDB4MjUsIDB4NzMsIDB4MjksIDB4NWMsIDB4NmUsIDB4MjIsIDB4MmMsIDB4MjAsCisgMHgwYSwgMHgwOSwgMHgwOSwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyYywKKyAweDIwLCAweDczLCAweDc0LCAweDcyLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDI4LCAweDY1LCAweDcyLCAweDcyLCAweDZlLCAweDZmLCAweDI5LAorIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsIDB4N2QsIDB4MGEsIDB4MGEsIDB4NzYsIDB4NmYsIDB4NjksIDB4NjQsIDB4MjAsIDB4NjQsIDB4NmYsCisgMHg1ZiwgMHg3MiwgMHg2NSwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyOCwgMHg2MywgMHg2OCwgMHg2MSwgMHg3MiwgMHgyMCwgMHgyYSwgMHg2ZiwgMHg2YywKKyAweDY0LCAweDJjLCAweDIwLCAweDYzLCAweDY4LCAweDYxLCAweDcyLCAweDIwLCAweDJhLCAweDZlLCAweDY1LCAweDc3LCAweDI5LCAweDBhLCAweDdiLCAweDBhLAorIDB4MDksIDB4NzMsIDB4NzQsIDB4NzIsIDB4NzUsIDB4NzAsIDB4NzAsIDB4NjUsIDB4NzIsIDB4MjgsIDB4NmYsIDB4NmMsIDB4NjQsIDB4MjksIDB4M2IsIDB4MGEsCisgMHgwOSwgMHg3MywgMHg3NCwgMHg3MiwgMHg3NSwgMHg3MCwgMHg3MCwgMHg2NSwgMHg3MiwgMHgyOCwgMHg2ZSwgMHg2NSwgMHg3NywgMHgyOSwgMHgzYiwgMHgwYSwKKyAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDcyLCAweDY1LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDI4LCAweDZmLCAweDZjLCAweDY0LAorIDB4MmMsIDB4MjAsIDB4NmUsIDB4NjUsIDB4NzcsIDB4MjksIDB4MjAsIDB4MjEsIDB4M2QsIDB4MjAsIDB4MzAsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksCisgMHgwOSwgMHg3MCwgMHg3MiwgMHg2OSwgMHg2ZSwgMHg3NCwgMHg2NiwgMHgyOCwgMHgyMiwgMHg3MiwgMHg2NSwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyMCwKKyAweDI1LCAweDczLCAweDIwLCAweDI1LCAweDczLCAweDIwLCAweDY2LCAweDYxLCAweDY5LCAweDZjLCAweDY1LCAweDY0LCAweDIwLCAweDI4LCAweDI1LCAweDczLAorIDB4MjksIDB4NWMsIDB4NmUsIDB4MjIsIDB4MmMsIDB4MjAsIDB4MGEsIDB4MDksIDB4MDksIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisgMHg2ZiwgMHg2YywgMHg2NCwgMHgyYywgMHgyMCwgMHg2ZSwgMHg2NSwgMHg3NywgMHgyYywgMHgyMCwgMHg3MywgMHg3NCwgMHg3MiwgMHg2NSwgMHg3MiwgMHg3MiwKKyAweDZmLCAweDcyLCAweDI4LCAweDY1LCAweDcyLCAweDcyLCAweDZlLCAweDZmLCAweDI5LCAweDI5LCAweDNiLCAweDBhLCAweDA5LCAweDdkLCAweDBhLCAweDdkLAorIDB4MGEsIDB4MGEsIDB4MGEsIDB4NzYsIDB4NmYsIDB4NjksIDB4NjQsIDB4MjAsIDB4NjQsIDB4NmYsIDB4NWYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4MjgsCisgMHg2MywgMHg2OCwgMHg2MSwgMHg3MiwgMHgyMCwgMHgyYSwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyYywgMHgyMCwgMHg2OSwgMHg2ZSwgMHg3NCwKKyAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDBhLCAweDdiLCAweDBhLCAweDA5LCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LAorIDB4MjAsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4MjAsIDB4NzMsIDB4NzQsIDB4M2IsIDB4MGEsIDB4MGEsIDB4MDksIDB4NzMsIDB4NzQsIDB4NzIsIDB4NzUsCisgMHg3MCwgMHg3MCwgMHg2NSwgMHg3MiwgMHgyOCwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwYSwgMHgwOSwgMHg2OSwKKyAweDY2LCAweDIwLCAweDI4LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDI4LCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDJjLCAweDIwLCAweDI2LAorIDB4NzMsIDB4NzQsIDB4MjksIDB4MjAsIDB4MjEsIDB4M2QsIDB4MjAsIDB4MzAsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NzAsIDB4NzIsCisgMHg2OSwgMHg2ZSwgMHg3NCwgMHg2NiwgMHgyOCwgMHgyMiwgMHgyOCwgMHgyNSwgMHg2NCwgMHgyOSwgMHgyMCwgMHg2NCwgMHg2ZiwgMHg1ZiwgMHg3MywgMHg3NCwKKyAweDYxLCAweDc0LCAweDNhLCAweDIwLCAweDI1LCAweDczLCAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDNkLCAweDI1LCAweDY0LCAweDIwLCAweDI1LAorIDB4NzMsIDB4NWMsIDB4NmUsIDB4MjIsIDB4MmMsIDB4MjAsIDB4MGEsIDB4MDksIDB4MDksIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisgMHg2YywgMHg2OSwgMHg2ZSwgMHg2NSwgMHg1ZiwgMHg2MywgMHg2ZiwgMHg3NSwgMHg2ZSwgMHg3NCwgMHgyYywgMHgyMCwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwKKyAweDY1LCAweDJjLCAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDJjLCAweDIwLCAweDczLCAweDc0LCAweDcyLCAweDY1LCAweDcyLCAweDcyLCAweDZmLAorIDB4NzIsIDB4MjgsIDB4NjUsIDB4NzIsIDB4NzIsIDB4NmUsIDB4NmYsIDB4MjksIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NzIsIDB4NjUsIDB4NzQsCisgMHg3NSwgMHg3MiwgMHg2ZSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg3ZCwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg1MywgMHg1ZiwgMHg0OSwKKyAweDUzLCAweDQ0LCAweDQ5LCAweDUyLCAweDI4LCAweDczLCAweDc0LCAweDJlLCAweDczLCAweDc0LCAweDVmLCAweDZkLCAweDZmLCAweDY0LCAweDY1LCAweDI5LAorIDB4MjksIDB4MjAsIDB4NzIsIDB4NjUsIDB4NzQsIDB4NzUsIDB4NzIsIDB4NmUsIDB4M2IsIDB4MGEsIDB4MGEsIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsIDB4MjgsCisgMHg3MywgMHg3NCwgMHgyZSwgMHg3MywgMHg3NCwgMHg1ZiwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyMCwgMHgyMSwgMHgzZCwgMHgyMCwgMHg3MywgMHg2OSwKKyAweDdhLCAweDY1LCAweDI5LCAweDIwLCAweDdiLCAweDBhLCAweDA5LCAweDA5LCAweDcwLCAweDcyLCAweDY5LCAweDZlLCAweDc0LCAweDY2LCAweDI4LCAweDIyLAorIDB4MjgsIDB4MjUsIDB4NjQsIDB4MjksIDB4MjAsIDB4NjQsIDB4NmYsIDB4NWYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4M2EsIDB4MjAsIDB4MjUsIDB4NzMsCisgMHgyMCwgMHg3NywgMHg3MiwgMHg2ZiwgMHg2ZSwgMHg2NywgMHgyMCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyMCwgMHgyNSwgMHg2NCwgMHgyMCwgMHgyNSwKKyAweDY0LCAweDVjLCAweDZlLCAweDIyLCAweDJjLCAweDIwLCAweDBhLCAweDA5LCAweDA5LCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorIDB4NmMsIDB4NjksIDB4NmUsIDB4NjUsIDB4NWYsIDB4NjMsIDB4NmYsIDB4NzUsIDB4NmUsIDB4NzQsIDB4MmMsIDB4MjAsIDB4NjYsIDB4NmUsIDB4NjEsIDB4NmQsCisgMHg2NSwgMHgyYywgMHgyMCwgMHgyOCwgMHg2OSwgMHg2ZSwgMHg3NCwgMHgyOSwgMHg3MywgMHg3NCwgMHgyZSwgMHg3MywgMHg3NCwgMHg1ZiwgMHg3MywgMHg2OSwKKyAweDdhLCAweDY1LCAweDJjLCAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDNiLCAweDBhLCAweDA5LCAweDdkLCAweDBhLCAweDdkLCAweDBhLAorIDB4MGEsIDB4NzYsIDB4NmYsIDB4NjksIDB4NjQsIDB4MjAsIDB4NjQsIDB4NmYsIDB4NWYsIDB4NjMsIDB4NzIsIDB4NjUsIDB4NjEsIDB4NzQsIDB4NjUsIDB4MjgsCisgMHg2MywgMHg2OCwgMHg2MSwgMHg3MiwgMHgyMCwgMHgyYSwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyYywgMHgyMCwgMHg2OSwgMHg2ZSwgMHg3NCwKKyAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDBhLCAweDdiLCAweDBhLCAweDA5LCAweDY0LCAweDZmLCAweDVmLCAweDZmLCAweDcwLCAweDY1LAorIDB4NmUsIDB4MjgsIDB4NjYsIDB4NmUsIDB4NjEsIDB4NmQsIDB4NjUsIDB4MmMsIDB4MjAsIDB4MzUsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MmMsIDB4MjAsIDB4NzMsCisgMHg2OSwgMHg3YSwgMHg2NSwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg2NCwgMHg2ZiwgMHg1ZiwgMHg2MywgMHg2YywgMHg2ZiwgMHg3MywgMHg2NSwgMHgyOCwKKyAweDM1LCAweDMwLCAweDMwLCAweDMwLCAweDI5LCAweDNiLCAweDBhLCAweDdkLCAweDBhCit9OworI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgY2hhciBjb21wcmJ1ZltURVNUREFUQV9MRU5dOworc3RhdGljIHVuc2lnbmVkIGNoYXIgZGVjb21wcmJ1ZltURVNUREFUQV9MRU5dOworCitpbnQgamZmczJfZGVjb21wcmVzcyh1bnNpZ25lZCBjaGFyIGNvbXBydHlwZSwgdW5zaWduZWQgY2hhciAqY2RhdGFfaW4sIAorCQkgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGFfb3V0LCB1aW50MzJfdCBjZGF0YWxlbiwgdWludDMyX3QgZGF0YWxlbik7Cit1bnNpZ25lZCBjaGFyIGpmZnMyX2NvbXByZXNzKHVuc2lnbmVkIGNoYXIgKmRhdGFfaW4sIHVuc2lnbmVkIGNoYXIgKmNwYWdlX291dCwgCisJCQkgICAgIHVpbnQzMl90ICpkYXRhbGVuLCB1aW50MzJfdCAqY2RhdGFsZW4pOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCApIHsKKwl1bnNpZ25lZCBjaGFyIGNvbXBydHlwZTsKKwl1aW50MzJfdCBjLCBkOworCWludCByZXQ7CisKKwlwcmludGsoIk9yaWdpbmFsIGRhdGE6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJICAgICAgIHRlc3RkYXRhWzBdLHRlc3RkYXRhWzFdLHRlc3RkYXRhWzJdLHRlc3RkYXRhWzNdLCAKKwkgICAgICAgdGVzdGRhdGFbNF0sdGVzdGRhdGFbNV0sdGVzdGRhdGFbNl0sdGVzdGRhdGFbN10sIAorCSAgICAgICB0ZXN0ZGF0YVs4XSx0ZXN0ZGF0YVs5XSx0ZXN0ZGF0YVsxMF0sdGVzdGRhdGFbMTFdLCAKKwkgICAgICAgdGVzdGRhdGFbMTJdLHRlc3RkYXRhWzEzXSx0ZXN0ZGF0YVsxNF0sdGVzdGRhdGFbMTVdKTsgCisJZCA9IFRFU1REQVRBX0xFTjsKKwljID0gVEVTVERBVEFfTEVOOworCWNvbXBydHlwZSA9IGpmZnMyX2NvbXByZXNzKHRlc3RkYXRhLCBjb21wcmJ1ZiwgJmQsICZjKTsKKworCXByaW50aygiamZmczJfY29tcHJlc3MgdXNlZCBjb21wcmVzc2lvbiB0eXBlICVkLiBDb21wcmVzc2VkIHNpemUgJWQsIHVuY29tcHJlc3NlZCBzaXplICVkXG4iLAorCSAgICAgICBjb21wcnR5cGUsIGMsIGQpOworCXByaW50aygiQ29tcHJlc3NlZCBkYXRhOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCSAgICAgICBjb21wcmJ1ZlswXSxjb21wcmJ1ZlsxXSxjb21wcmJ1ZlsyXSxjb21wcmJ1ZlszXSwgCisJICAgICAgIGNvbXByYnVmWzRdLGNvbXByYnVmWzVdLGNvbXByYnVmWzZdLGNvbXByYnVmWzddLCAKKwkgICAgICAgY29tcHJidWZbOF0sY29tcHJidWZbOV0sY29tcHJidWZbMTBdLGNvbXByYnVmWzExXSwgCisJICAgICAgIGNvbXByYnVmWzEyXSxjb21wcmJ1ZlsxM10sY29tcHJidWZbMTRdLGNvbXByYnVmWzE1XSk7IAorCisJcmV0ID0gamZmczJfZGVjb21wcmVzcyhjb21wcnR5cGUsIGNvbXByYnVmLCBkZWNvbXByYnVmLCBjLCBkKTsKKwlwcmludGsoImpmZnMyX2RlY29tcHJlc3MgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisJcHJpbnRrKCJEZWNvbXByZXNzZWQgZGF0YTogICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJICAgICAgIGRlY29tcHJidWZbMF0sZGVjb21wcmJ1ZlsxXSxkZWNvbXByYnVmWzJdLGRlY29tcHJidWZbM10sIAorCSAgICAgICBkZWNvbXByYnVmWzRdLGRlY29tcHJidWZbNV0sZGVjb21wcmJ1Zls2XSxkZWNvbXByYnVmWzddLCAKKwkgICAgICAgZGVjb21wcmJ1Zls4XSxkZWNvbXByYnVmWzldLGRlY29tcHJidWZbMTBdLGRlY29tcHJidWZbMTFdLCAKKwkgICAgICAgZGVjb21wcmJ1ZlsxMl0sZGVjb21wcmJ1ZlsxM10sZGVjb21wcmJ1ZlsxNF0sZGVjb21wcmJ1ZlsxNV0pOyAKKwlpZiAobWVtY21wKGRlY29tcHJidWYsIHRlc3RkYXRhLCBkKSkKKwkJcHJpbnRrKCJDb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBjb3JydXB0ZWQgZGF0YVxuIik7CisJZWxzZQorCQlwcmludGsoIkNvbXByZXNzaW9uIGdvb2QgZm9yICVkIGJ5dGVzXG4iLCBkKTsKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2Rpci5jIGIvZnMvamZmczIvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3MzA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL2Rpci5jCkBAIC0wLDAgKzEsNzk5IEBACisvKgorICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiAkSWQ6IGRpci5jLHYgMS44NCAyMDA0LzExLzE2IDIwOjM2OjExIGR3bXcyIEV4cCAkCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvamZmczIuaD4KKyNpbmNsdWRlIDxsaW51eC9qZmZzMl9mc19pLmg+CisjaW5jbHVkZSA8bGludXgvamZmczJfZnNfc2IuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSAibm9kZWxpc3QuaCIKKworLyogVXJnaC4gUGxlYXNlIHRlbGwgbWUgdGhlcmUncyBhIG5pY2VyIHdheSBvZiBkb2luZyB0aGVzZS4gKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDQ4KQordHlwZWRlZiBpbnQgbWtub2RfYXJnX3Q7CisjZGVmaW5lIE5BTUVJX0NPTVBBVCh4KSAoKHZvaWQgKil4KQorI2Vsc2UKK3R5cGVkZWYgZGV2X3QgbWtub2RfYXJnX3Q7CisjZGVmaW5lIE5BTUVJX0NPTVBBVCh4KSAoeCkKKyNlbmRpZgorCitzdGF0aWMgaW50IGpmZnMyX3JlYWRkaXIgKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKKworc3RhdGljIGludCBqZmZzMl9jcmVhdGUgKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKixpbnQsCisJCQkgc3RydWN0IG5hbWVpZGF0YSAqKTsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpqZmZzMl9sb29rdXAgKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKiwKKwkJCQkgICAgc3RydWN0IG5hbWVpZGF0YSAqKTsKK3N0YXRpYyBpbnQgamZmczJfbGluayAoc3RydWN0IGRlbnRyeSAqLHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKik7CitzdGF0aWMgaW50IGpmZnMyX3VubGluayAoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqKTsKK3N0YXRpYyBpbnQgamZmczJfc3ltbGluayAoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqLGNvbnN0IGNoYXIgKik7CitzdGF0aWMgaW50IGpmZnMyX21rZGlyIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosaW50KTsKK3N0YXRpYyBpbnQgamZmczJfcm1kaXIgKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKik7CitzdGF0aWMgaW50IGpmZnMyX21rbm9kIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosaW50LG1rbm9kX2FyZ190KTsKK3N0YXRpYyBpbnQgamZmczJfcmVuYW1lIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKik7CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgamZmczJfZGlyX29wZXJhdGlvbnMgPQoreworCS5yZWFkID0JCWdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIgPQlqZmZzMl9yZWFkZGlyLAorCS5pb2N0bCA9CWpmZnMyX2lvY3RsLAorCS5mc3luYyA9CWpmZnMyX2ZzeW5jCit9OworCisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGpmZnMyX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0KK3sKKwkuY3JlYXRlID0JTkFNRUlfQ09NUEFUKGpmZnMyX2NyZWF0ZSksCisJLmxvb2t1cCA9CU5BTUVJX0NPTVBBVChqZmZzMl9sb29rdXApLAorCS5saW5rID0JCWpmZnMyX2xpbmssCisJLnVubGluayA9CWpmZnMyX3VubGluaywKKwkuc3ltbGluayA9CWpmZnMyX3N5bWxpbmssCisJLm1rZGlyID0JamZmczJfbWtkaXIsCisJLnJtZGlyID0JamZmczJfcm1kaXIsCisJLm1rbm9kID0JamZmczJfbWtub2QsCisJLnJlbmFtZSA9CWpmZnMyX3JlbmFtZSwKKwkuc2V0YXR0ciA9CWpmZnMyX3NldGF0dHIsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogV2Uga2VlcCB0aGUgZGlyZW50IGxpc3Qgc29ydGVkIGluIGluY3JlYXNpbmcgb3JkZXIgb2YgbmFtZSBoYXNoLAorICAgYW5kIHdlIHVzZSB0aGUgc2FtZSBoYXNoIGZ1bmN0aW9uIGFzIHRoZSBkZW50cmllcy4gTWFrZXMgdGhpcyAKKyAgIG5pY2UgYW5kIHNpbXBsZQorKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpqZmZzMl9sb29rdXAoc3RydWN0IGlub2RlICpkaXJfaSwgc3RydWN0IGRlbnRyeSAqdGFyZ2V0LAorCQkJCSAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpkaXJfZjsKKwlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYzsKKwlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkID0gTlVMTCwgKmZkX2xpc3Q7CisJdWludDMyX3QgaW5vID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9sb29rdXAoKVxuIikpOworCisJZGlyX2YgPSBKRkZTMl9JTk9ERV9JTkZPKGRpcl9pKTsKKwljID0gSkZGUzJfU0JfSU5GTyhkaXJfaS0+aV9zYik7CisKKwlkb3duKCZkaXJfZi0+c2VtKTsKKworCS8qIE5COiBUaGUgMi4yIGJhY2twb3J0IHdpbGwgbmVlZCB0byBleHBsaWNpdGx5IGNoZWNrIGZvciAnLicgYW5kICcuLicgaGVyZSAqLworCWZvciAoZmRfbGlzdCA9IGRpcl9mLT5kZW50czsgZmRfbGlzdCAmJiBmZF9saXN0LT5uaGFzaCA8PSB0YXJnZXQtPmRfbmFtZS5oYXNoOyBmZF9saXN0ID0gZmRfbGlzdC0+bmV4dCkgeworCQlpZiAoZmRfbGlzdC0+bmhhc2ggPT0gdGFyZ2V0LT5kX25hbWUuaGFzaCAmJiAKKwkJICAgICghZmQgfHwgZmRfbGlzdC0+dmVyc2lvbiA+IGZkLT52ZXJzaW9uKSAmJgorCQkgICAgc3RybGVuKGZkX2xpc3QtPm5hbWUpID09IHRhcmdldC0+ZF9uYW1lLmxlbiAmJgorCQkgICAgIXN0cm5jbXAoZmRfbGlzdC0+bmFtZSwgdGFyZ2V0LT5kX25hbWUubmFtZSwgdGFyZ2V0LT5kX25hbWUubGVuKSkgeworCQkJZmQgPSBmZF9saXN0OworCQl9CisJfQorCWlmIChmZCkKKwkJaW5vID0gZmQtPmlubzsKKwl1cCgmZGlyX2YtPnNlbSk7CisJaWYgKGlubykgeworCQlpbm9kZSA9IGlnZXQoZGlyX2ktPmlfc2IsIGlubyk7CisJCWlmICghaW5vZGUpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImlnZXQoKSBmYWlsZWQgZm9yIGlubyAjJXVcbiIsIGlubyk7CisJCQlyZXR1cm4gKEVSUl9QVFIoLUVJTykpOworCQl9CisJfQorCisJZF9hZGQodGFyZ2V0LCBpbm9kZSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyBpbnQgamZmczJfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZjsKKwlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgY3Vyb2ZzOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3JlYWRkaXIoKSBmb3IgZGlyX2kgIyVsdVxuIiwgZmlscC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfaW5vKSk7CisKKwlmID0gSkZGUzJfSU5PREVfSU5GTyhpbm9kZSk7CisJYyA9IEpGRlMyX1NCX0lORk8oaW5vZGUtPmlfc2IpOworCisJb2Zmc2V0ID0gZmlscC0+Zl9wb3M7CisKKwlpZiAob2Zmc2V0ID09IDApIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkRpcmVudCAwOiBcIi5cIiwgaW5vICMlbHVcbiIsIGlub2RlLT5pX2lubykpOworCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgMCwgaW5vZGUtPmlfaW5vLCBEVF9ESVIpIDwgMCkKKwkJCWdvdG8gb3V0OworCQlvZmZzZXQrKzsKKwl9CisJaWYgKG9mZnNldCA9PSAxKSB7CisJCXVuc2lnbmVkIGxvbmcgcGlubyA9IHBhcmVudF9pbm8oZmlscC0+Zl9kZW50cnkpOworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRGlyZW50IDE6IFwiLi5cIiwgaW5vICMlbHVcbiIsIHBpbm8pKTsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLi4iLCAyLCAxLCBwaW5vLCBEVF9ESVIpIDwgMCkKKwkJCWdvdG8gb3V0OworCQlvZmZzZXQrKzsKKwl9CisKKwljdXJvZnM9MTsKKwlkb3duKCZmLT5zZW0pOworCWZvciAoZmQgPSBmLT5kZW50czsgZmQ7IGZkID0gZmQtPm5leHQpIHsKKworCQljdXJvZnMrKzsKKwkJLyogRmlyc3QgbG9vcDogY3Vyb2ZzID0gMjsgb2Zmc2V0ID0gMiAqLworCQlpZiAoY3Vyb2ZzIDwgb2Zmc2V0KSB7CisJCQlEMihwcmludGsoS0VSTl9ERUJVRyAiU2tpcHBpbmcgZGlyZW50OiBcIiVzXCIsIGlubyAjJXUsIHR5cGUgJWQsIGJlY2F1c2UgY3Vyb2ZzICVsZCA8IG9mZnNldCAlbGRcbiIsIAorCQkJCSAgZmQtPm5hbWUsIGZkLT5pbm8sIGZkLT50eXBlLCBjdXJvZnMsIG9mZnNldCkpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFmZC0+aW5vKSB7CisJCQlEMihwcmludGsoS0VSTl9ERUJVRyAiU2tpcHBpbmcgZGVsZXRpb24gZGlyZW50IFwiJXNcIlxuIiwgZmQtPm5hbWUpKTsKKwkJCW9mZnNldCsrOworCQkJY29udGludWU7CisJCX0KKwkJRDIocHJpbnRrKEtFUk5fREVCVUcgIkRpcmVudCAlbGQ6IFwiJXNcIiwgaW5vICMldSwgdHlwZSAlZFxuIiwgb2Zmc2V0LCBmZC0+bmFtZSwgZmQtPmlubywgZmQtPnR5cGUpKTsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCBmZC0+bmFtZSwgc3RybGVuKGZkLT5uYW1lKSwgb2Zmc2V0LCBmZC0+aW5vLCBmZC0+dHlwZSkgPCAwKQorCQkJYnJlYWs7CisJCW9mZnNldCsrOworCX0KKwl1cCgmZi0+c2VtKTsKKyBvdXQ6CisJZmlscC0+Zl9wb3MgPSBvZmZzZXQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgaW50IGpmZnMyX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpcl9pLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQkJc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqcmk7CisJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsICpkaXJfZjsKKwlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCByZXQ7CisKKwlyaSA9IGpmZnMyX2FsbG9jX3Jhd19pbm9kZSgpOworCWlmICghcmkpCisJCXJldHVybiAtRU5PTUVNOworCQorCWMgPSBKRkZTMl9TQl9JTkZPKGRpcl9pLT5pX3NiKTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9jcmVhdGUoKVxuIikpOworCisJaW5vZGUgPSBqZmZzMl9uZXdfaW5vZGUoZGlyX2ksIG1vZGUsIHJpKTsKKworCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9uZXdfaW5vZGUoKSBmYWlsZWRcbiIpKTsKKwkJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOworCQlyZXR1cm4gUFRSX0VSUihpbm9kZSk7CisJfQorCisJaW5vZGUtPmlfb3AgPSAmamZmczJfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT5pX2ZvcCA9ICZqZmZzMl9maWxlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmamZmczJfZmlsZV9hZGRyZXNzX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfbWFwcGluZy0+bnJwYWdlcyA9IDA7CisKKwlmID0gSkZGUzJfSU5PREVfSU5GTyhpbm9kZSk7CisJZGlyX2YgPSBKRkZTMl9JTk9ERV9JTkZPKGRpcl9pKTsKKworCXJldCA9IGpmZnMyX2RvX2NyZWF0ZShjLCBkaXJfZiwgZiwgcmksIAorCQkJICAgICAgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuKTsKKworCWlmIChyZXQpIHsKKwkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwkJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRpcl9pLT5pX210aW1lID0gZGlyX2ktPmlfY3RpbWUgPSBJVElNRShqZTMyX3RvX2NwdShyaS0+Y3RpbWUpKTsKKworCWpmZnMyX2ZyZWVfcmF3X2lub2RlKHJpKTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2NyZWF0ZTogQ3JlYXRlZCBpbm8gIyVsdSB3aXRoIG1vZGUgJW8sIG5saW5rICVkKCVkKS4gbnJwYWdlcyAlbGRcbiIsCisJCSAgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9ubGluaywgZi0+aW5vY2FjaGUtPm5saW5rLCBpbm9kZS0+aV9tYXBwaW5nLT5ucnBhZ2VzKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgaW50IGpmZnMyX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpcl9pLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmMgPSBKRkZTMl9TQl9JTkZPKGRpcl9pLT5pX3NiKTsKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZGlyX2YgPSBKRkZTMl9JTk9ERV9JTkZPKGRpcl9pKTsKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZGVhZF9mID0gSkZGUzJfSU5PREVfSU5GTyhkZW50cnktPmRfaW5vZGUpOworCWludCByZXQ7CisKKwlyZXQgPSBqZmZzMl9kb191bmxpbmsoYywgZGlyX2YsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIAorCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVhZF9mKTsKKwlpZiAoZGVhZF9mLT5pbm9jYWNoZSkKKwkJZGVudHJ5LT5kX2lub2RlLT5pX25saW5rID0gZGVhZF9mLT5pbm9jYWNoZS0+bmxpbms7CisJcmV0dXJuIHJldDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgaW50IGpmZnMyX2xpbmsgKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqZGlyX2ksIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyA9IEpGRlMyX1NCX0lORk8ob2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYik7CisJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYgPSBKRkZTMl9JTk9ERV9JTkZPKG9sZF9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpkaXJfZiA9IEpGRlMyX0lOT0RFX0lORk8oZGlyX2kpOworCWludCByZXQ7CisJdWludDhfdCB0eXBlOworCisJLyogRG9uJ3QgbGV0IHBlb3BsZSBtYWtlIGhhcmQgbGlua3MgdG8gYmFkIGlub2Rlcy4gKi8KKwlpZiAoIWYtPmlub2NhY2hlKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChTX0lTRElSKG9sZF9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRVBFUk07CisKKwkvKiBYWFg6IFRoaXMgaXMgdWdseSAqLworCXR5cGUgPSAob2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlICYgU19JRk1UKSA+PiAxMjsKKwlpZiAoIXR5cGUpIHR5cGUgPSBEVF9SRUc7CisKKwlyZXQgPSBqZmZzMl9kb19saW5rKGMsIGRpcl9mLCBmLT5pbm9jYWNoZS0+aW5vLCB0eXBlLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4pOworCisJaWYgKCFyZXQpIHsKKwkJZG93bigmZi0+c2VtKTsKKwkJb2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9ubGluayA9ICsrZi0+aW5vY2FjaGUtPm5saW5rOworCQl1cCgmZi0+c2VtKTsKKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIG9sZF9kZW50cnktPmRfaW5vZGUpOworCQlhdG9taWNfaW5jKCZvbGRfZGVudHJ5LT5kX2lub2RlLT5pX2NvdW50KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGpmZnMyX3N5bWxpbmsgKHN0cnVjdCBpbm9kZSAqZGlyX2ksIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqdGFyZ2V0KQoreworCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCAqZGlyX2Y7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmM7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaTsKKwlzdHJ1Y3QgamZmczJfcmF3X2RpcmVudCAqcmQ7CisJc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmZuOworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQ7CisJaW50IG5hbWVsZW47CisJdWludDMyX3QgYWxsb2NsZW4sIHBoeXNfb2ZzOworCWludCByZXQ7CisKKwkvKiBGSVhNRTogSWYgeW91IGNhcmUuIFdlJ2QgbmVlZCB0byB1c2UgZnJhZ3MgZm9yIHRoZSB0YXJnZXQKKwkgICBpZiBpdCBncm93cyBtdWNoIG1vcmUgdGhhbiB0aGlzICovCisJaWYgKHN0cmxlbih0YXJnZXQpID4gMjU0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJpID0gamZmczJfYWxsb2NfcmF3X2lub2RlKCk7CisKKwlpZiAoIXJpKQorCQlyZXR1cm4gLUVOT01FTTsKKwkKKwljID0gSkZGUzJfU0JfSU5GTyhkaXJfaS0+aV9zYik7CisJCisJLyogVHJ5IHRvIHJlc2VydmUgZW5vdWdoIHNwYWNlIGZvciBib3RoIG5vZGUgYW5kIGRpcmVudC4gCisJICogSnVzdCB0aGUgbm9kZSB3aWxsIGRvIGZvciBub3csIHRob3VnaCAKKwkgKi8KKwluYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXJldCA9IGpmZnMyX3Jlc2VydmVfc3BhY2UoYywgc2l6ZW9mKCpyaSkgKyBzdHJsZW4odGFyZ2V0KSwgJnBoeXNfb2ZzLCAmYWxsb2NsZW4sIEFMTE9DX05PUk1BTCk7CisKKwlpZiAocmV0KSB7CisJCWpmZnMyX2ZyZWVfcmF3X2lub2RlKHJpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbm9kZSA9IGpmZnMyX25ld19pbm9kZShkaXJfaSwgU19JRkxOSyB8IFNfSVJXWFVHTywgcmkpOworCisJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOworCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJcmV0dXJuIFBUUl9FUlIoaW5vZGUpOworCX0KKworCWlub2RlLT5pX29wID0gJmpmZnMyX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKworCWYgPSBKRkZTMl9JTk9ERV9JTkZPKGlub2RlKTsKKworCWlub2RlLT5pX3NpemUgPSBzdHJsZW4odGFyZ2V0KTsKKwlyaS0+aXNpemUgPSByaS0+ZHNpemUgPSByaS0+Y3NpemUgPSBjcHVfdG9famUzMihpbm9kZS0+aV9zaXplKTsKKwlyaS0+dG90bGVuID0gY3B1X3RvX2plMzIoc2l6ZW9mKCpyaSkgKyBpbm9kZS0+aV9zaXplKTsKKwlyaS0+aGRyX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIHJpLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSktNCkpOworCisJcmktPmNvbXByID0gSkZGUzJfQ09NUFJfTk9ORTsKKwlyaS0+ZGF0YV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCB0YXJnZXQsIHN0cmxlbih0YXJnZXQpKSk7CisJcmktPm5vZGVfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmksIHNpemVvZigqcmkpLTgpKTsKKwkKKwlmbiA9IGpmZnMyX3dyaXRlX2Rub2RlKGMsIGYsIHJpLCB0YXJnZXQsIHN0cmxlbih0YXJnZXQpLCBwaHlzX29mcywgQUxMT0NfTk9STUFMKTsKKworCWpmZnMyX2ZyZWVfcmF3X2lub2RlKHJpKTsKKworCWlmIChJU19FUlIoZm4pKSB7CisJCS8qIEVlZWsuIFdhdmUgYnllIGJ5ZSAqLworCQl1cCgmZi0+c2VtKTsKKwkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisJCWpmZnMyX2NsZWFyX2lub2RlKGlub2RlKTsKKwkJcmV0dXJuIFBUUl9FUlIoZm4pOworCX0KKwkvKiBObyBkYXRhIGhlcmUuIE9ubHkgYSBtZXRhZGF0YSBub2RlLCB3aGljaCB3aWxsIGJlIAorCSAgIG9ic29sZXRlZCBieSB0aGUgZmlyc3QgZGF0YSB3cml0ZQorCSovCisJZi0+bWV0YWRhdGEgPSBmbjsKKwl1cCgmZi0+c2VtKTsKKworCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOworCXJldCA9IGpmZnMyX3Jlc2VydmVfc3BhY2UoYywgc2l6ZW9mKCpyZCkrbmFtZWxlbiwgJnBoeXNfb2ZzLCAmYWxsb2NsZW4sIEFMTE9DX05PUk1BTCk7CisJaWYgKHJldCkgeworCQkvKiBFZXAuICovCisJCWpmZnMyX2NsZWFyX2lub2RlKGlub2RlKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZCA9IGpmZnMyX2FsbG9jX3Jhd19kaXJlbnQoKTsKKwlpZiAoIXJkKSB7CisJCS8qIEFyZ2guIE5vdyB3ZSB0cmVhdCBpdCBsaWtlIGEgbm9ybWFsIGRlbGV0ZSAqLworCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJamZmczJfY2xlYXJfaW5vZGUoaW5vZGUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkaXJfZiA9IEpGRlMyX0lOT0RFX0lORk8oZGlyX2kpOworCWRvd24oJmRpcl9mLT5zZW0pOworCisJcmQtPm1hZ2ljID0gY3B1X3RvX2plMTYoSkZGUzJfTUFHSUNfQklUTUFTSyk7CisJcmQtPm5vZGV0eXBlID0gY3B1X3RvX2plMTYoSkZGUzJfTk9ERVRZUEVfRElSRU5UKTsKKwlyZC0+dG90bGVuID0gY3B1X3RvX2plMzIoc2l6ZW9mKCpyZCkgKyBuYW1lbGVuKTsKKwlyZC0+aGRyX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIHJkLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSktNCkpOworCisJcmQtPnBpbm8gPSBjcHVfdG9famUzMihkaXJfaS0+aV9pbm8pOworCXJkLT52ZXJzaW9uID0gY3B1X3RvX2plMzIoKytkaXJfZi0+aGlnaGVzdF92ZXJzaW9uKTsKKwlyZC0+aW5vID0gY3B1X3RvX2plMzIoaW5vZGUtPmlfaW5vKTsKKwlyZC0+bWN0aW1lID0gY3B1X3RvX2plMzIoZ2V0X3NlY29uZHMoKSk7CisJcmQtPm5zaXplID0gbmFtZWxlbjsKKwlyZC0+dHlwZSA9IERUX0xOSzsKKwlyZC0+bm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByZCwgc2l6ZW9mKCpyZCktOCkpOworCXJkLT5uYW1lX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIG5hbWVsZW4pKTsKKworCWZkID0gamZmczJfd3JpdGVfZGlyZW50KGMsIGRpcl9mLCByZCwgZGVudHJ5LT5kX25hbWUubmFtZSwgbmFtZWxlbiwgcGh5c19vZnMsIEFMTE9DX05PUk1BTCk7CisKKwlpZiAoSVNfRVJSKGZkKSkgeworCQkvKiBkaXJlbnQgZmFpbGVkIHRvIHdyaXRlLiBEZWxldGUgdGhlIGlub2RlIG5vcm1hbGx5IAorCQkgICBhcyBpZiBpdCB3ZXJlIHRoZSBmaW5hbCB1bmxpbmsoKSAqLworCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJamZmczJfZnJlZV9yYXdfZGlyZW50KHJkKTsKKwkJdXAoJmRpcl9mLT5zZW0pOworCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CisJCXJldHVybiBQVFJfRVJSKGZkKTsKKwl9CisKKwlkaXJfaS0+aV9tdGltZSA9IGRpcl9pLT5pX2N0aW1lID0gSVRJTUUoamUzMl90b19jcHUocmQtPm1jdGltZSkpOworCisJamZmczJfZnJlZV9yYXdfZGlyZW50KHJkKTsKKworCS8qIExpbmsgdGhlIGZkIGludG8gdGhlIGlub2RlJ3MgbGlzdCwgb2Jzb2xldGluZyBhbiBvbGQKKwkgICBvbmUgaWYgbmVjZXNzYXJ5LiAqLworCWpmZnMyX2FkZF9mZF90b19saXN0KGMsIGZkLCAmZGlyX2YtPmRlbnRzKTsKKworCXVwKCZkaXJfZi0+c2VtKTsKKwlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBqZmZzMl9ta2RpciAoc3RydWN0IGlub2RlICpkaXJfaSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwgKmRpcl9mOworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqcmk7CisJc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgKnJkOworCXN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpmbjsKKwlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkOworCWludCBuYW1lbGVuOworCXVpbnQzMl90IGFsbG9jbGVuLCBwaHlzX29mczsKKwlpbnQgcmV0OworCisJbW9kZSB8PSBTX0lGRElSOworCisJcmkgPSBqZmZzMl9hbGxvY19yYXdfaW5vZGUoKTsKKwlpZiAoIXJpKQorCQlyZXR1cm4gLUVOT01FTTsKKwkKKwljID0gSkZGUzJfU0JfSU5GTyhkaXJfaS0+aV9zYik7CisKKwkvKiBUcnkgdG8gcmVzZXJ2ZSBlbm91Z2ggc3BhY2UgZm9yIGJvdGggbm9kZSBhbmQgZGlyZW50LiAKKwkgKiBKdXN0IHRoZSBub2RlIHdpbGwgZG8gZm9yIG5vdywgdGhvdWdoIAorCSAqLworCW5hbWVsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJcmV0ID0gamZmczJfcmVzZXJ2ZV9zcGFjZShjLCBzaXplb2YoKnJpKSwgJnBoeXNfb2ZzLCAmYWxsb2NsZW4sIEFMTE9DX05PUk1BTCk7CisKKwlpZiAocmV0KSB7CisJCWpmZnMyX2ZyZWVfcmF3X2lub2RlKHJpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbm9kZSA9IGpmZnMyX25ld19pbm9kZShkaXJfaSwgbW9kZSwgcmkpOworCisJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOworCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJcmV0dXJuIFBUUl9FUlIoaW5vZGUpOworCX0KKworCWlub2RlLT5pX29wID0gJmpmZnMyX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT5pX2ZvcCA9ICZqZmZzMl9kaXJfb3BlcmF0aW9uczsKKwkvKiBEaXJlY3RvcmllcyBnZXQgbmxpbmsgMiBhdCBzdGFydCAqLworCWlub2RlLT5pX25saW5rID0gMjsKKworCWYgPSBKRkZTMl9JTk9ERV9JTkZPKGlub2RlKTsKKworCXJpLT5kYXRhX2NyYyA9IGNwdV90b19qZTMyKDApOworCXJpLT5ub2RlX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIHJpLCBzaXplb2YoKnJpKS04KSk7CisJCisJZm4gPSBqZmZzMl93cml0ZV9kbm9kZShjLCBmLCByaSwgTlVMTCwgMCwgcGh5c19vZnMsIEFMTE9DX05PUk1BTCk7CisKKwlqZmZzMl9mcmVlX3Jhd19pbm9kZShyaSk7CisKKwlpZiAoSVNfRVJSKGZuKSkgeworCQkvKiBFZWVrLiBXYXZlIGJ5ZSBieWUgKi8KKwkJdXAoJmYtPnNlbSk7CisJCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOworCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CisJCXJldHVybiBQVFJfRVJSKGZuKTsKKwl9CisJLyogTm8gZGF0YSBoZXJlLiBPbmx5IGEgbWV0YWRhdGEgbm9kZSwgd2hpY2ggd2lsbCBiZSAKKwkgICBvYnNvbGV0ZWQgYnkgdGhlIGZpcnN0IGRhdGEgd3JpdGUKKwkqLworCWYtPm1ldGFkYXRhID0gZm47CisJdXAoJmYtPnNlbSk7CisKKwlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlKGMsIHNpemVvZigqcmQpK25hbWVsZW4sICZwaHlzX29mcywgJmFsbG9jbGVuLCBBTExPQ19OT1JNQUwpOworCWlmIChyZXQpIHsKKwkJLyogRWVwLiAqLworCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CisJCXJldHVybiByZXQ7CisJfQorCQorCXJkID0gamZmczJfYWxsb2NfcmF3X2RpcmVudCgpOworCWlmICghcmQpIHsKKwkJLyogQXJnaC4gTm93IHdlIHRyZWF0IGl0IGxpa2UgYSBub3JtYWwgZGVsZXRlICovCisJCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOworCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRpcl9mID0gSkZGUzJfSU5PREVfSU5GTyhkaXJfaSk7CisJZG93bigmZGlyX2YtPnNlbSk7CisKKwlyZC0+bWFnaWMgPSBjcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKTsKKwlyZC0+bm9kZXR5cGUgPSBjcHVfdG9famUxNihKRkZTMl9OT0RFVFlQRV9ESVJFTlQpOworCXJkLT50b3RsZW4gPSBjcHVfdG9famUzMihzaXplb2YoKnJkKSArIG5hbWVsZW4pOworCXJkLT5oZHJfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmQsIHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKS00KSk7CisKKwlyZC0+cGlubyA9IGNwdV90b19qZTMyKGRpcl9pLT5pX2lubyk7CisJcmQtPnZlcnNpb24gPSBjcHVfdG9famUzMigrK2Rpcl9mLT5oaWdoZXN0X3ZlcnNpb24pOworCXJkLT5pbm8gPSBjcHVfdG9famUzMihpbm9kZS0+aV9pbm8pOworCXJkLT5tY3RpbWUgPSBjcHVfdG9famUzMihnZXRfc2Vjb25kcygpKTsKKwlyZC0+bnNpemUgPSBuYW1lbGVuOworCXJkLT50eXBlID0gRFRfRElSOworCXJkLT5ub2RlX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIHJkLCBzaXplb2YoKnJkKS04KSk7CisJcmQtPm5hbWVfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgZGVudHJ5LT5kX25hbWUubmFtZSwgbmFtZWxlbikpOworCisJZmQgPSBqZmZzMl93cml0ZV9kaXJlbnQoYywgZGlyX2YsIHJkLCBkZW50cnktPmRfbmFtZS5uYW1lLCBuYW1lbGVuLCBwaHlzX29mcywgQUxMT0NfTk9STUFMKTsKKwkKKwlpZiAoSVNfRVJSKGZkKSkgeworCQkvKiBkaXJlbnQgZmFpbGVkIHRvIHdyaXRlLiBEZWxldGUgdGhlIGlub2RlIG5vcm1hbGx5IAorCQkgICBhcyBpZiBpdCB3ZXJlIHRoZSBmaW5hbCB1bmxpbmsoKSAqLworCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJamZmczJfZnJlZV9yYXdfZGlyZW50KHJkKTsKKwkJdXAoJmRpcl9mLT5zZW0pOworCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CisJCXJldHVybiBQVFJfRVJSKGZkKTsKKwl9CisKKwlkaXJfaS0+aV9tdGltZSA9IGRpcl9pLT5pX2N0aW1lID0gSVRJTUUoamUzMl90b19jcHUocmQtPm1jdGltZSkpOworCWRpcl9pLT5pX25saW5rKys7CisKKwlqZmZzMl9mcmVlX3Jhd19kaXJlbnQocmQpOworCisJLyogTGluayB0aGUgZmQgaW50byB0aGUgaW5vZGUncyBsaXN0LCBvYnNvbGV0aW5nIGFuIG9sZAorCSAgIG9uZSBpZiBuZWNlc3NhcnkuICovCisJamZmczJfYWRkX2ZkX3RvX2xpc3QoYywgZmQsICZkaXJfZi0+ZGVudHMpOworCisJdXAoJmRpcl9mLT5zZW0pOworCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOworCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqZmZzMl9ybWRpciAoc3RydWN0IGlub2RlICpkaXJfaSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmID0gSkZGUzJfSU5PREVfSU5GTyhkZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQ7CisJaW50IHJldDsKKworCWZvciAoZmQgPSBmLT5kZW50cyA7IGZkOyBmZCA9IGZkLT5uZXh0KSB7CisJCWlmIChmZC0+aW5vKQorCQkJcmV0dXJuIC1FTk9URU1QVFk7CisJfQorCXJldCA9IGpmZnMyX3VubGluayhkaXJfaSwgZGVudHJ5KTsKKwlpZiAoIXJldCkKKwkJZGlyX2ktPmlfbmxpbmstLTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGpmZnMyX21rbm9kIChzdHJ1Y3QgaW5vZGUgKmRpcl9pLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLCBta25vZF9hcmdfdCByZGV2KQoreworCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCAqZGlyX2Y7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmM7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaTsKKwlzdHJ1Y3QgamZmczJfcmF3X2RpcmVudCAqcmQ7CisJc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmZuOworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQ7CisJaW50IG5hbWVsZW47CisJamludDE2X3QgZGV2OworCWludCBkZXZsZW4gPSAwOworCXVpbnQzMl90IGFsbG9jbGVuLCBwaHlzX29mczsKKwlpbnQgcmV0OworCisJaWYgKCFvbGRfdmFsaWRfZGV2KHJkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJpID0gamZmczJfYWxsb2NfcmF3X2lub2RlKCk7CisJaWYgKCFyaSkKKwkJcmV0dXJuIC1FTk9NRU07CisJCisJYyA9IEpGRlMyX1NCX0lORk8oZGlyX2ktPmlfc2IpOworCQorCWlmIChTX0lTQkxLKG1vZGUpIHx8IFNfSVNDSFIobW9kZSkpIHsKKwkJZGV2ID0gY3B1X3RvX2plMTYob2xkX2VuY29kZV9kZXYocmRldikpOworCQlkZXZsZW4gPSBzaXplb2YoZGV2KTsKKwl9CisJCisJLyogVHJ5IHRvIHJlc2VydmUgZW5vdWdoIHNwYWNlIGZvciBib3RoIG5vZGUgYW5kIGRpcmVudC4gCisJICogSnVzdCB0aGUgbm9kZSB3aWxsIGRvIGZvciBub3csIHRob3VnaCAKKwkgKi8KKwluYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXJldCA9IGpmZnMyX3Jlc2VydmVfc3BhY2UoYywgc2l6ZW9mKCpyaSkgKyBkZXZsZW4sICZwaHlzX29mcywgJmFsbG9jbGVuLCBBTExPQ19OT1JNQUwpOworCisJaWYgKHJldCkgeworCQlqZmZzMl9mcmVlX3Jhd19pbm9kZShyaSk7CisJCXJldHVybiByZXQ7CisJfQorCisJaW5vZGUgPSBqZmZzMl9uZXdfaW5vZGUoZGlyX2ksIG1vZGUsIHJpKTsKKworCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCWpmZnMyX2ZyZWVfcmF3X2lub2RlKHJpKTsKKwkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisJCXJldHVybiBQVFJfRVJSKGlub2RlKTsKKwl9CisJaW5vZGUtPmlfb3AgPSAmamZmczJfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgcmRldik7CisKKwlmID0gSkZGUzJfSU5PREVfSU5GTyhpbm9kZSk7CisKKwlyaS0+ZHNpemUgPSByaS0+Y3NpemUgPSBjcHVfdG9famUzMihkZXZsZW4pOworCXJpLT50b3RsZW4gPSBjcHVfdG9famUzMihzaXplb2YoKnJpKSArIGRldmxlbik7CisJcmktPmhkcl9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByaSwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpLTQpKTsKKworCXJpLT5jb21wciA9IEpGRlMyX0NPTVBSX05PTkU7CisJcmktPmRhdGFfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgJmRldiwgZGV2bGVuKSk7CisJcmktPm5vZGVfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmksIHNpemVvZigqcmkpLTgpKTsKKwkKKwlmbiA9IGpmZnMyX3dyaXRlX2Rub2RlKGMsIGYsIHJpLCAoY2hhciAqKSZkZXYsIGRldmxlbiwgcGh5c19vZnMsIEFMTE9DX05PUk1BTCk7CisKKwlqZmZzMl9mcmVlX3Jhd19pbm9kZShyaSk7CisKKwlpZiAoSVNfRVJSKGZuKSkgeworCQkvKiBFZWVrLiBXYXZlIGJ5ZSBieWUgKi8KKwkJdXAoJmYtPnNlbSk7CisJCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOworCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CisJCXJldHVybiBQVFJfRVJSKGZuKTsKKwl9CisJLyogTm8gZGF0YSBoZXJlLiBPbmx5IGEgbWV0YWRhdGEgbm9kZSwgd2hpY2ggd2lsbCBiZSAKKwkgICBvYnNvbGV0ZWQgYnkgdGhlIGZpcnN0IGRhdGEgd3JpdGUKKwkqLworCWYtPm1ldGFkYXRhID0gZm47CisJdXAoJmYtPnNlbSk7CisKKwlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlKGMsIHNpemVvZigqcmQpK25hbWVsZW4sICZwaHlzX29mcywgJmFsbG9jbGVuLCBBTExPQ19OT1JNQUwpOworCWlmIChyZXQpIHsKKwkJLyogRWVwLiAqLworCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmQgPSBqZmZzMl9hbGxvY19yYXdfZGlyZW50KCk7CisJaWYgKCFyZCkgeworCQkvKiBBcmdoLiBOb3cgd2UgdHJlYXQgaXQgbGlrZSBhIG5vcm1hbCBkZWxldGUgKi8KKwkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisJCWpmZnMyX2NsZWFyX2lub2RlKGlub2RlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGlyX2YgPSBKRkZTMl9JTk9ERV9JTkZPKGRpcl9pKTsKKwlkb3duKCZkaXJfZi0+c2VtKTsKKworCXJkLT5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOworCXJkLT5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0RJUkVOVCk7CisJcmQtPnRvdGxlbiA9IGNwdV90b19qZTMyKHNpemVvZigqcmQpICsgbmFtZWxlbik7CisJcmQtPmhkcl9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByZCwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpLTQpKTsKKworCXJkLT5waW5vID0gY3B1X3RvX2plMzIoZGlyX2ktPmlfaW5vKTsKKwlyZC0+dmVyc2lvbiA9IGNwdV90b19qZTMyKCsrZGlyX2YtPmhpZ2hlc3RfdmVyc2lvbik7CisJcmQtPmlubyA9IGNwdV90b19qZTMyKGlub2RlLT5pX2lubyk7CisJcmQtPm1jdGltZSA9IGNwdV90b19qZTMyKGdldF9zZWNvbmRzKCkpOworCXJkLT5uc2l6ZSA9IG5hbWVsZW47CisKKwkvKiBYWFg6IFRoaXMgaXMgdWdseS4gKi8KKwlyZC0+dHlwZSA9IChtb2RlICYgU19JRk1UKSA+PiAxMjsKKworCXJkLT5ub2RlX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIHJkLCBzaXplb2YoKnJkKS04KSk7CisJcmQtPm5hbWVfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgZGVudHJ5LT5kX25hbWUubmFtZSwgbmFtZWxlbikpOworCisJZmQgPSBqZmZzMl93cml0ZV9kaXJlbnQoYywgZGlyX2YsIHJkLCBkZW50cnktPmRfbmFtZS5uYW1lLCBuYW1lbGVuLCBwaHlzX29mcywgQUxMT0NfTk9STUFMKTsKKwkKKwlpZiAoSVNfRVJSKGZkKSkgeworCQkvKiBkaXJlbnQgZmFpbGVkIHRvIHdyaXRlLiBEZWxldGUgdGhlIGlub2RlIG5vcm1hbGx5IAorCQkgICBhcyBpZiBpdCB3ZXJlIHRoZSBmaW5hbCB1bmxpbmsoKSAqLworCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJamZmczJfZnJlZV9yYXdfZGlyZW50KHJkKTsKKwkJdXAoJmRpcl9mLT5zZW0pOworCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CisJCXJldHVybiBQVFJfRVJSKGZkKTsKKwl9CisKKwlkaXJfaS0+aV9tdGltZSA9IGRpcl9pLT5pX2N0aW1lID0gSVRJTUUoamUzMl90b19jcHUocmQtPm1jdGltZSkpOworCisJamZmczJfZnJlZV9yYXdfZGlyZW50KHJkKTsKKworCS8qIExpbmsgdGhlIGZkIGludG8gdGhlIGlub2RlJ3MgbGlzdCwgb2Jzb2xldGluZyBhbiBvbGQKKwkgICBvbmUgaWYgbmVjZXNzYXJ5LiAqLworCWpmZnMyX2FkZF9mZF90b19saXN0KGMsIGZkLCAmZGlyX2YtPmRlbnRzKTsKKworCXVwKCZkaXJfZi0+c2VtKTsKKwlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqZmZzMl9yZW5hbWUgKHN0cnVjdCBpbm9kZSAqb2xkX2Rpcl9pLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlub2RlICpuZXdfZGlyX2ksIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyA9IEpGRlMyX1NCX0lORk8ob2xkX2Rpcl9pLT5pX3NiKTsKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqdmljdGltX2YgPSBOVUxMOworCXVpbnQ4X3QgdHlwZTsKKworCS8qIFRoZSBWRlMgd2lsbCBjaGVjayBmb3IgdXMgYW5kIHByZXZlbnQgdHJ5aW5nIHRvIHJlbmFtZSBhIAorCSAqIGZpbGUgb3ZlciBhIGRpcmVjdG9yeSBhbmQgdmljZSB2ZXJzYSwgYnV0IGlmIGl0J3MgYSBkaXJlY3RvcnksCisJICogdGhlIFZGUyBjYW4ndCBjaGVjayB3aGV0aGVyIHRoZSB2aWN0aW0gaXMgZW1wdHkuIFRoZSBmaWxlc3lzdGVtCisJICogbmVlZHMgdG8gZG8gdGhhdCBmb3IgaXRzZWxmLgorCSAqLworCWlmIChuZXdfZGVudHJ5LT5kX2lub2RlKSB7CisJCXZpY3RpbV9mID0gSkZGUzJfSU5PREVfSU5GTyhuZXdfZGVudHJ5LT5kX2lub2RlKTsKKwkJaWYgKFNfSVNESVIobmV3X2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkgeworCQkJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZDsKKworCQkJZG93bigmdmljdGltX2YtPnNlbSk7CisJCQlmb3IgKGZkID0gdmljdGltX2YtPmRlbnRzOyBmZDsgZmQgPSBmZC0+bmV4dCkgeworCQkJCWlmIChmZC0+aW5vKSB7CisJCQkJCXVwKCZ2aWN0aW1fZi0+c2VtKTsKKwkJCQkJcmV0dXJuIC1FTk9URU1QVFk7CisJCQkJfQorCQkJfQorCQkJdXAoJnZpY3RpbV9mLT5zZW0pOworCQl9CisJfQorCisJLyogWFhYOiBXZSBwcm9iYWJseSBvdWdodCB0byBhbGxvYyBlbm91Z2ggc3BhY2UgZm9yCisJICAgYm90aCBub2RlcyBhdCB0aGUgc2FtZSB0aW1lLiBXcml0aW5nIHRoZSBuZXcgbGluaywgCisJICAgdGhlbiBnZXR0aW5nIC1FTk9TUEMsIGlzIHF1aXRlIGJhZCA6KQorCSovCisKKwkvKiBNYWtlIGEgaGFyZCBsaW5rICovCisJCisJLyogWFhYOiBUaGlzIGlzIHVnbHkgKi8KKwl0eXBlID0gKG9sZF9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgPj4gMTI7CisJaWYgKCF0eXBlKSB0eXBlID0gRFRfUkVHOworCisJcmV0ID0gamZmczJfZG9fbGluayhjLCBKRkZTMl9JTk9ERV9JTkZPKG5ld19kaXJfaSksIAorCQkJICAgIG9sZF9kZW50cnktPmRfaW5vZGUtPmlfaW5vLCB0eXBlLAorCQkJICAgIG5ld19kZW50cnktPmRfbmFtZS5uYW1lLCBuZXdfZGVudHJ5LT5kX25hbWUubGVuKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAodmljdGltX2YpIHsKKwkJLyogVGhlcmUgd2FzIGEgdmljdGltLiBLaWxsIGl0IG9mZiBuaWNlbHkgKi8KKwkJbmV3X2RlbnRyeS0+ZF9pbm9kZS0+aV9ubGluay0tOworCQkvKiBEb24ndCBvb3BzIGlmIHRoZSB2aWN0aW0gd2FzIGEgZGlyZW50IHBvaW50aW5nIHRvIGFuCisJCSAgIGlub2RlIHdoaWNoIGRpZG4ndCBleGlzdC4gKi8KKwkJaWYgKHZpY3RpbV9mLT5pbm9jYWNoZSkgeworCQkJZG93bigmdmljdGltX2YtPnNlbSk7CisJCQl2aWN0aW1fZi0+aW5vY2FjaGUtPm5saW5rLS07CisJCQl1cCgmdmljdGltX2YtPnNlbSk7CisJCX0KKwl9CisKKwkvKiBJZiBpdCB3YXMgYSBkaXJlY3Rvcnkgd2UgbW92ZWQsIGFuZCB0aGVyZSB3YXMgbm8gdmljdGltLCAKKwkgICBpbmNyZWFzZSBpX25saW5rIG9uIGl0cyBuZXcgcGFyZW50ICovCisJaWYgKFNfSVNESVIob2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSAmJiAhdmljdGltX2YpCisJCW5ld19kaXJfaS0+aV9ubGluaysrOworCisJLyogVW5saW5rIHRoZSBvcmlnaW5hbCAqLworCXJldCA9IGpmZnMyX2RvX3VubGluayhjLCBKRkZTMl9JTk9ERV9JTkZPKG9sZF9kaXJfaSksIAorCQkgICAgICBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwgb2xkX2RlbnRyeS0+ZF9uYW1lLmxlbiwgTlVMTCk7CisKKwkvKiBXZSBkb24ndCB0b3VjaCBpbm9kZS0+aV9ubGluayAqLworCisJaWYgKHJldCkgeworCQkvKiBPaCBzaGl0LiBXZSByZWFsbHkgb3VnaHQgdG8gbWFrZSBhIHNpbmdsZSBub2RlIHdoaWNoIGNhbiBkbyBib3RoIGF0b21pY2FsbHkgKi8KKwkJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYgPSBKRkZTMl9JTk9ERV9JTkZPKG9sZF9kZW50cnktPmRfaW5vZGUpOworCQlkb3duKCZmLT5zZW0pOworCQlvbGRfZGVudHJ5LT5kX2lub2RlLT5pX25saW5rKys7CisJCWlmIChmLT5pbm9jYWNoZSkKKwkJCWYtPmlub2NhY2hlLT5ubGluaysrOworCQl1cCgmZi0+c2VtKTsKKworCQlwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX3JlbmFtZSgpOiBMaW5rIHN1Y2NlZWRlZCwgdW5saW5rIGZhaWxlZCAoZXJyICVkKS4gWW91IG5vdyBoYXZlIGEgaGFyZCBsaW5rXG4iLCByZXQpOworCQkvKiBNaWdodCBhcyB3ZWxsIGxldCB0aGUgVkZTIGtub3cgKi8KKwkJZF9pbnN0YW50aWF0ZShuZXdfZGVudHJ5LCBvbGRfZGVudHJ5LT5kX2lub2RlKTsKKwkJYXRvbWljX2luYygmb2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9jb3VudCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKFNfSVNESVIob2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJb2xkX2Rpcl9pLT5pX25saW5rLS07CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZXJhc2UuYyBiL2ZzL2pmZnMyL2VyYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0NTFlOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL2VyYXNlLmMKQEAgLTAsMCArMSw0NDIgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgorICoKKyAqICRJZDogZXJhc2UuYyx2IDEuNjYgMjAwNC8xMS8xNiAyMDozNjoxMSBkd213MiBFeHAgJAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSAibm9kZWxpc3QuaCIKKworc3RydWN0IGVyYXNlX3ByaXZfc3RydWN0IHsKKwlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViOworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjOworfTsKKyAgICAgIAorI2lmbmRlZiBfX0VDT1MKK3N0YXRpYyB2b2lkIGpmZnMyX2VyYXNlX2NhbGxiYWNrKHN0cnVjdCBlcmFzZV9pbmZvICopOworI2VuZGlmCitzdGF0aWMgdm9pZCBqZmZzMl9lcmFzZV9mYWlsZWQoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIsIHVpbnQzMl90IGJhZF9vZmZzZXQpOworc3RhdGljIHZvaWQgamZmczJfZXJhc2Vfc3VjY2VlZGVkKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViKTsKK3N0YXRpYyB2b2lkIGpmZnMyX2ZyZWVfYWxsX25vZGVfcmVmcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYik7CitzdGF0aWMgdm9pZCBqZmZzMl9tYXJrX2VyYXNlZF9ibG9jayhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYik7CisKK3N0YXRpYyB2b2lkIGpmZnMyX2VyYXNlX2Jsb2NrKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLAorCQkJICAgICAgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYikKK3sKKwlpbnQgcmV0OworCXVpbnQzMl90IGJhZF9vZmZzZXQ7CisjaWZkZWYgX19FQ09TCisgICAgICAgcmV0ID0gamZmczJfZmxhc2hfZXJhc2UoYywgamViKTsKKyAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgICAgICAgamZmczJfZXJhc2Vfc3VjY2VlZGVkKGMsIGplYik7CisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgfQorICAgICAgIGJhZF9vZmZzZXQgPSBqZWItPm9mZnNldDsKKyNlbHNlIC8qIExpbnV4ICovCisJc3RydWN0IGVyYXNlX2luZm8gKmluc3RyOworCisJaW5zdHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXJhc2VfaW5mbykgKyBzaXplb2Yoc3RydWN0IGVyYXNlX3ByaXZfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbnN0cikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJrbWFsbG9jIGZvciBzdHJ1Y3QgZXJhc2VfaW5mbyBpbiBqZmZzMl9lcmFzZV9ibG9jayBmYWlsZWQuIFJlZmlsaW5nIGJsb2NrIGZvciBsYXRlclxuIik7CisJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJbGlzdF9kZWwoJmplYi0+bGlzdCk7CisJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpOworCQljLT5lcmFzaW5nX3NpemUgLT0gYy0+c2VjdG9yX3NpemU7CisJCWMtPmRpcnR5X3NpemUgKz0gYy0+c2VjdG9yX3NpemU7CisJCWplYi0+ZGlydHlfc2l6ZSA9IGMtPnNlY3Rvcl9zaXplOworCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCW1lbXNldChpbnN0ciwgMCwgc2l6ZW9mKCppbnN0cikpOworCisJaW5zdHItPm10ZCA9IGMtPm10ZDsKKwlpbnN0ci0+YWRkciA9IGplYi0+b2Zmc2V0OworCWluc3RyLT5sZW4gPSBjLT5zZWN0b3Jfc2l6ZTsKKwlpbnN0ci0+Y2FsbGJhY2sgPSBqZmZzMl9lcmFzZV9jYWxsYmFjazsKKwlpbnN0ci0+cHJpdiA9ICh1bnNpZ25lZCBsb25nKSgmaW5zdHJbMV0pOworCWluc3RyLT5mYWlsX2FkZHIgPSAweGZmZmZmZmZmOworCQorCSgoc3RydWN0IGVyYXNlX3ByaXZfc3RydWN0ICopaW5zdHItPnByaXYpLT5qZWIgPSBqZWI7CisJKChzdHJ1Y3QgZXJhc2VfcHJpdl9zdHJ1Y3QgKilpbnN0ci0+cHJpdiktPmMgPSBjOworCisJcmV0ID0gYy0+bXRkLT5lcmFzZShjLT5tdGQsIGluc3RyKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuOworCisJYmFkX29mZnNldCA9IGluc3RyLT5mYWlsX2FkZHI7CisJa2ZyZWUoaW5zdHIpOworI2VuZGlmIC8qIF9fRUNPUyAqLworCisJaWYgKHJldCA9PSAtRU5PTUVNIHx8IHJldCA9PSAtRUFHQUlOKSB7CisJCS8qIEVyYXNlIGZhaWxlZCBpbW1lZGlhdGVseS4gUmVmaWxlIGl0IG9uIHRoZSBsaXN0ICovCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFcmFzZSBhdCAweCUwOHggZmFpbGVkOiAlZC4gUmVmaWxpbmcgb24gZXJhc2VfcGVuZGluZ19saXN0XG4iLCBqZWItPm9mZnNldCwgcmV0KSk7CisJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJbGlzdF9kZWwoJmplYi0+bGlzdCk7CisJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpOworCQljLT5lcmFzaW5nX3NpemUgLT0gYy0+c2VjdG9yX3NpemU7CisJCWMtPmRpcnR5X3NpemUgKz0gYy0+c2VjdG9yX3NpemU7CisJCWplYi0+ZGlydHlfc2l6ZSA9IGMtPnNlY3Rvcl9zaXplOworCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChyZXQgPT0gLUVST0ZTKSAKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXJhc2UgYXQgMHglMDh4IGZhaWxlZCBpbW1lZGlhdGVseTogLUVST0ZTLiBJcyB0aGUgc2VjdG9yIGxvY2tlZD9cbiIsIGplYi0+b2Zmc2V0KTsKKwllbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVyYXNlIGF0IDB4JTA4eCBmYWlsZWQgaW1tZWRpYXRlbHk6IGVycm5vICVkXG4iLCBqZWItPm9mZnNldCwgcmV0KTsKKworCWpmZnMyX2VyYXNlX2ZhaWxlZChjLCBqZWIsIGJhZF9vZmZzZXQpOworfQorCit2b2lkIGpmZnMyX2VyYXNlX3BlbmRpbmdfYmxvY2tzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBpbnQgY291bnQpCit7CisJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYjsKKworCWRvd24oJmMtPmVyYXNlX2ZyZWVfc2VtKTsKKworCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmYy0+ZXJhc2VfY29tcGxldGVfbGlzdCkgfHwKKwkgICAgICAgIWxpc3RfZW1wdHkoJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCkpIHsKKworCQlpZiAoIWxpc3RfZW1wdHkoJmMtPmVyYXNlX2NvbXBsZXRlX2xpc3QpKSB7CisJCQlqZWIgPSBsaXN0X2VudHJ5KGMtPmVyYXNlX2NvbXBsZXRlX2xpc3QubmV4dCwgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2ssIGxpc3QpOworCQkJbGlzdF9kZWwoJmplYi0+bGlzdCk7CisJCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJCWpmZnMyX21hcmtfZXJhc2VkX2Jsb2NrKGMsIGplYik7CisKKwkJCWlmICghLS1jb3VudCkgeworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJDb3VudCByZWFjaGVkLiBqZmZzMl9lcmFzZV9wZW5kaW5nX2Jsb2NrcyBsZWF2aW5nXG4iKSk7CisJCQkJZ290byBkb25lOworCQkJfQorCisJCX0gZWxzZSBpZiAoIWxpc3RfZW1wdHkoJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCkpIHsKKwkJCWplYiA9IGxpc3RfZW50cnkoYy0+ZXJhc2VfcGVuZGluZ19saXN0Lm5leHQsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrLCBsaXN0KTsKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJTdGFydGluZyBlcmFzZSBvZiBwZW5kaW5nIGJsb2NrIDB4JTA4eFxuIiwgamViLT5vZmZzZXQpKTsKKwkJCWxpc3RfZGVsKCZqZWItPmxpc3QpOworCQkJYy0+ZXJhc2luZ19zaXplICs9IGMtPnNlY3Rvcl9zaXplOworCQkJYy0+d2FzdGVkX3NpemUgLT0gamViLT53YXN0ZWRfc2l6ZTsKKwkJCWMtPmZyZWVfc2l6ZSAtPSBqZWItPmZyZWVfc2l6ZTsKKwkJCWMtPnVzZWRfc2l6ZSAtPSBqZWItPnVzZWRfc2l6ZTsKKwkJCWMtPmRpcnR5X3NpemUgLT0gamViLT5kaXJ0eV9zaXplOworCQkJamViLT53YXN0ZWRfc2l6ZSA9IGplYi0+dXNlZF9zaXplID0gamViLT5kaXJ0eV9zaXplID0gamViLT5mcmVlX3NpemUgPSAwOworCQkJamZmczJfZnJlZV9hbGxfbm9kZV9yZWZzKGMsIGplYik7CisJCQlsaXN0X2FkZCgmamViLT5saXN0LCAmYy0+ZXJhc2luZ19saXN0KTsKKwkJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJCQlqZmZzMl9lcmFzZV9ibG9jayhjLCBqZWIpOworCisJCX0gZWxzZSB7CisJCQlCVUcoKTsKKwkJfQorCisJCS8qIEJlIG5pY2UgKi8KKwkJY29uZF9yZXNjaGVkKCk7CisJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwl9CisKKwlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKyBkb25lOgorCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9lcmFzZV9wZW5kaW5nX2Jsb2NrcyBjb21wbGV0ZWRcbiIpKTsKKworCXVwKCZjLT5lcmFzZV9mcmVlX3NlbSk7Cit9CisKK3N0YXRpYyB2b2lkIGpmZnMyX2VyYXNlX3N1Y2NlZWRlZChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYikKK3sKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiRXJhc2UgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhdCAweCUwOHhcbiIsIGplYi0+b2Zmc2V0KSk7CisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCWxpc3RfZGVsKCZqZWItPmxpc3QpOworCWxpc3RfYWRkX3RhaWwoJmplYi0+bGlzdCwgJmMtPmVyYXNlX2NvbXBsZXRlX2xpc3QpOworCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCS8qIEVuc3VyZSB0aGF0IGt1cGRhdGVkIGNhbGxzIHVzIGFnYWluIHRvIG1hcmsgdGhlbSBjbGVhbiAqLworCWpmZnMyX2VyYXNlX3BlbmRpbmdfdHJpZ2dlcihjKTsKK30KKworc3RhdGljIHZvaWQgamZmczJfZXJhc2VfZmFpbGVkKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLCB1aW50MzJfdCBiYWRfb2Zmc2V0KQoreworCS8qIEZvciBOQU5ELCBpZiB0aGUgZmFpbHVyZSBkaWQgbm90IG9jY3VyIGF0IHRoZSBkZXZpY2UgbGV2ZWwgZm9yIGEKKwkgICBzcGVjaWZpYyBwaHlzaWNhbCBwYWdlLCBkb24ndCBib3RoZXIgdXBkYXRpbmcgdGhlIGJhZCBibG9jayB0YWJsZS4gKi8KKwlpZiAoamZmczJfY2xlYW5tYXJrZXJfb29iKGMpICYmIChiYWRfb2Zmc2V0ICE9IDB4ZmZmZmZmZmYpKSB7CisJCS8qIFdlIGhhZCBhIGRldmljZS1sZXZlbCBmYWlsdXJlIHRvIGVyYXNlLiAgTGV0J3Mgc2VlIGlmIHdlJ3ZlCisJCSAgIGZhaWxlZCB0b28gbWFueSB0aW1lcy4gKi8KKwkJaWYgKCFqZmZzMl93cml0ZV9uYW5kX2JhZGJsb2NrKGMsIGplYiwgYmFkX29mZnNldCkpIHsKKwkJCS8qIFdlJ2QgbGlrZSB0byBnaXZlIHRoaXMgYmxvY2sgYW5vdGhlciB0cnkuICovCisJCQlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQlsaXN0X2RlbCgmamViLT5saXN0KTsKKwkJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpOworCQkJYy0+ZXJhc2luZ19zaXplIC09IGMtPnNlY3Rvcl9zaXplOworCQkJYy0+ZGlydHlfc2l6ZSArPSBjLT5zZWN0b3Jfc2l6ZTsKKwkJCWplYi0+ZGlydHlfc2l6ZSA9IGMtPnNlY3Rvcl9zaXplOworCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJYy0+ZXJhc2luZ19zaXplIC09IGMtPnNlY3Rvcl9zaXplOworCWMtPmJhZF9zaXplICs9IGMtPnNlY3Rvcl9zaXplOworCWxpc3RfZGVsKCZqZWItPmxpc3QpOworCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5iYWRfbGlzdCk7CisJYy0+bnJfZXJhc2luZ19ibG9ja3MtLTsKKwlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwl3YWtlX3VwKCZjLT5lcmFzZV93YWl0KTsKK30JIAorCisjaWZuZGVmIF9fRUNPUworc3RhdGljIHZvaWQgamZmczJfZXJhc2VfY2FsbGJhY2soc3RydWN0IGVyYXNlX2luZm8gKmluc3RyKQoreworCXN0cnVjdCBlcmFzZV9wcml2X3N0cnVjdCAqcHJpdiA9ICh2b2lkICopaW5zdHItPnByaXY7CisKKwlpZihpbnN0ci0+c3RhdGUgIT0gTVREX0VSQVNFX0RPTkUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXJhc2UgYXQgMHglMDh4IGZpbmlzaGVkLCBidXQgc3RhdGUgIT0gTVREX0VSQVNFX0RPTkUuIFN0YXRlIGlzIDB4JXggaW5zdGVhZC5cbiIsIGluc3RyLT5hZGRyLCBpbnN0ci0+c3RhdGUpOworCQlqZmZzMl9lcmFzZV9mYWlsZWQocHJpdi0+YywgcHJpdi0+amViLCBpbnN0ci0+ZmFpbF9hZGRyKTsKKwl9IGVsc2UgeworCQlqZmZzMl9lcmFzZV9zdWNjZWVkZWQocHJpdi0+YywgcHJpdi0+amViKTsKKwl9CQorCWtmcmVlKGluc3RyKTsKK30KKyNlbmRpZiAvKiAhX19FQ09TICovCisKKy8qIEhtbW0uIE1heWJlIHdlIHNob3VsZCBhY2NlcHQgdGhlIGV4dHJhIHNwYWNlIGl0IHRha2VzIGFuZCBtYWtlCisgICB0aGlzIGEgc3RhbmRhcmQgZG91Ymx5LWxpbmtlZCBsaXN0PyAqLworc3RhdGljIGlubGluZSB2b2lkIGpmZnMyX3JlbW92ZV9ub2RlX3JlZnNfZnJvbV9pbm9fbGlzdChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywKKwkJCXN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnJlZiwgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYikKK3sKKwlzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKmljID0gTlVMTDsKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICoqcHJldjsKKworCXByZXYgPSAmcmVmLT5uZXh0X2luX2lubzsKKworCS8qIFdhbGsgdGhlIGlub2RlJ3MgbGlzdCBvbmNlLCByZW1vdmluZyBhbnkgbm9kZXMgZnJvbSB0aGlzIGVyYXNlYmxvY2sgKi8KKwl3aGlsZSAoMSkgeworCQlpZiAoISgqcHJldiktPm5leHRfaW5faW5vKSB7CisJCQkvKiBXZSdyZSBsb29raW5nIGF0IHRoZSBqZmZzMl9pbm9kZV9jYWNoZSwgd2hpY2ggaXMgCisJCQkgICBhdCB0aGUgZW5kIG9mIHRoZSBsaW5rZWQgbGlzdC4gU3Rhc2ggaXQgYW5kIGNvbnRpbnVlCisJCQkgICBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QgKi8KKwkJCWljID0gKHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqKSgqcHJldik7CisJCQlwcmV2ID0gJmljLT5ub2RlczsKKwkJCWNvbnRpbnVlOworCQl9IAorCisJCWlmICgoKCpwcmV2KS0+Zmxhc2hfb2Zmc2V0ICYgfihjLT5zZWN0b3Jfc2l6ZSAtMSkpID09IGplYi0+b2Zmc2V0KSB7CisJCQkvKiBJdCdzIGluIHRoZSBibG9jayB3ZSdyZSBlcmFzaW5nICovCisJCQlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICp0aGlzOworCisJCQl0aGlzID0gKnByZXY7CisJCQkqcHJldiA9IHRoaXMtPm5leHRfaW5faW5vOworCQkJdGhpcy0+bmV4dF9pbl9pbm8gPSBOVUxMOworCisJCQlpZiAodGhpcyA9PSByZWYpCisJCQkJYnJlYWs7CisKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIE5vdCB0byBiZSBkZWxldGVkLiBTa2lwICovCisJCXByZXYgPSAmKCgqcHJldiktPm5leHRfaW5faW5vKTsKKwl9CisKKwkvKiBQQVJBTk9JQSAqLworCWlmICghaWMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaW5vZGVfY2FjaGUgbm90IGZvdW5kIGluIHJlbW92ZV9ub2RlX3JlZnMoKSEhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJSZW1vdmVkIG5vZGVzIGluIHJhbmdlIDB4JTA4eC0weCUwOHggZnJvbSBpbm8gIyV1XG4iLAorCQkgIGplYi0+b2Zmc2V0LCBqZWItPm9mZnNldCArIGMtPnNlY3Rvcl9zaXplLCBpYy0+aW5vKSk7CisKKwlEMih7CisJCWludCBpPTA7CisJCXN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnRoaXM7CisJCXByaW50ayhLRVJOX0RFQlVHICJBZnRlciByZW1vdmVfbm9kZV9yZWZzX2Zyb21faW5vX2xpc3Q6IFxuIiBLRVJOX0RFQlVHKTsKKworCQl0aGlzID0gaWMtPm5vZGVzOworCSAgIAorCQl3aGlsZSh0aGlzKSB7CisJCQlwcmludGsoICIweCUwOHgoJWQpLT4iLCByZWZfb2Zmc2V0KHRoaXMpLCByZWZfZmxhZ3ModGhpcykpOworCQkJaWYgKCsraSA9PSA1KSB7CisJCQkJcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyk7CisJCQkJaT0wOworCQkJfQorCQkJdGhpcyA9IHRoaXMtPm5leHRfaW5faW5vOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9KTsKKworCWlmIChpYy0+bm9kZXMgPT0gKHZvaWQgKilpYykgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiaW5vY2FjaGUgZm9yIGlubyAjJXUgaXMgYWxsIGdvbmUgbm93LiBGcmVlaW5nXG4iLCBpYy0+aW5vKSk7CisJCWpmZnMyX2RlbF9pbm9fY2FjaGUoYywgaWMpOworCQlqZmZzMl9mcmVlX2lub2RlX2NhY2hlKGljKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGpmZnMyX2ZyZWVfYWxsX25vZGVfcmVmcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYikKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpyZWY7CisJRDEocHJpbnRrKEtFUk5fREVCVUcgIkZyZWVpbmcgYWxsIG5vZGUgcmVmcyBmb3IgZXJhc2VibG9jayBvZmZzZXQgMHglMDh4XG4iLCBqZWItPm9mZnNldCkpOworCXdoaWxlKGplYi0+Zmlyc3Rfbm9kZSkgeworCQlyZWYgPSBqZWItPmZpcnN0X25vZGU7CisJCWplYi0+Zmlyc3Rfbm9kZSA9IHJlZi0+bmV4dF9waHlzOworCQkKKwkJLyogUmVtb3ZlIGZyb20gdGhlIGlub2RlLWxpc3QgKi8KKwkJaWYgKHJlZi0+bmV4dF9pbl9pbm8pCisJCQlqZmZzMl9yZW1vdmVfbm9kZV9yZWZzX2Zyb21faW5vX2xpc3QoYywgcmVmLCBqZWIpOworCQkvKiBlbHNlIGl0IHdhcyBhIG5vbi1pbm9kZSBub2RlIG9yIGFscmVhZHkgcmVtb3ZlZCwgc28gZG9uJ3QgYm90aGVyICovCisKKwkJamZmczJfZnJlZV9yYXdfbm9kZV9yZWYocmVmKTsKKwl9CisJamViLT5sYXN0X25vZGUgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBqZmZzMl9tYXJrX2VyYXNlZF9ibG9jayhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYikKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICptYXJrZXJfcmVmID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICplYnVmOworCXNpemVfdCByZXRsZW47CisJaW50IHJldDsKKwl1aW50MzJfdCBiYWRfb2Zmc2V0OworCisJaWYgKCFqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpIHsKKwkJbWFya2VyX3JlZiA9IGpmZnMyX2FsbG9jX3Jhd19ub2RlX3JlZigpOworCQlpZiAoIW1hcmtlcl9yZWYpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhaWxlZCB0byBhbGxvY2F0ZSByYXcgbm9kZSByZWYgZm9yIGNsZWFuIG1hcmtlclxuIik7CisJCQkvKiBTdGljayBpdCBiYWNrIG9uIHRoZSBsaXN0IGZyb20gd2hlbmNlIGl0IGNhbWUgYW5kIGNvbWUgYmFjayBsYXRlciAqLworCQkJamZmczJfZXJhc2VfcGVuZGluZ190cmlnZ2VyKGMpOworCQkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQkJbGlzdF9hZGQoJmplYi0+bGlzdCwgJmMtPmVyYXNlX2NvbXBsZXRlX2xpc3QpOworCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZWJ1ZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVidWYpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIGFsbG9jYXRlIHBhZ2UgYnVmZmVyIGZvciB2ZXJpZnlpbmcgZXJhc2UgYXQgMHglMDh4LiBBc3N1bWluZyBpdCB3b3JrZWRcbiIsIGplYi0+b2Zmc2V0KTsKKwl9IGVsc2UgeworCQl1aW50MzJfdCBvZnMgPSBqZWItPm9mZnNldDsKKworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiVmVyaWZ5aW5nIGVyYXNlIGF0IDB4JTA4eFxuIiwgamViLT5vZmZzZXQpKTsKKwkJd2hpbGUob2ZzIDwgamViLT5vZmZzZXQgKyBjLT5zZWN0b3Jfc2l6ZSkgeworCQkJdWludDMyX3QgcmVhZGxlbiA9IG1pbigodWludDMyX3QpUEFHRV9TSVpFLCBqZWItPm9mZnNldCArIGMtPnNlY3Rvcl9zaXplIC0gb2ZzKTsKKwkJCWludCBpOworCisJCQliYWRfb2Zmc2V0ID0gb2ZzOworCisJCQlyZXQgPSBqZmZzMl9mbGFzaF9yZWFkKGMsIG9mcywgcmVhZGxlbiwgJnJldGxlbiwgZWJ1Zik7CisJCQlpZiAocmV0KSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmVhZCBvZiBuZXdseS1lcmFzZWQgYmxvY2sgYXQgMHglMDh4IGZhaWxlZDogJWQuIFB1dHRpbmcgb24gYmFkX2xpc3RcbiIsIG9mcywgcmV0KTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChyZXRsZW4gIT0gcmVhZGxlbikgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNob3J0IHJlYWQgZnJvbSBuZXdseS1lcmFzZWQgYmxvY2sgYXQgMHglMDh4LiBXYW50ZWQgJWQsIGdvdCAlemRcbiIsIG9mcywgcmVhZGxlbiwgcmV0bGVuKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWZvciAoaT0wOyBpPHJlYWRsZW47IGkgKz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSB7CisJCQkJLyogSXQncyBPSy4gV2Uga25vdyBpdCdzIHByb3Blcmx5IGFsaWduZWQgKi8KKwkJCQl1bnNpZ25lZCBsb25nIGRhdHVtID0gKih1bnNpZ25lZCBsb25nICopKCZlYnVmW2ldKTsKKwkJCQlpZiAoZGF0dW0gKyAxKSB7CisJCQkJCWJhZF9vZmZzZXQgKz0gaTsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTmV3bHktZXJhc2VkIGJsb2NrIGNvbnRhaW5lZCB3b3JkIDB4JWx4IGF0IG9mZnNldCAweCUwOHhcbiIsIGRhdHVtLCBiYWRfb2Zmc2V0KTsKKwkJCQliYWQ6IAorCQkJCQlpZiAoIWpmZnMyX2NsZWFubWFya2VyX29vYihjKSkKKwkJCQkJCWpmZnMyX2ZyZWVfcmF3X25vZGVfcmVmKG1hcmtlcl9yZWYpOworCQkJCQlrZnJlZShlYnVmKTsKKwkJCQliYWQyOgorCQkJCQlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQkJCS8qIFN0aWNrIGl0IG9uIGEgbGlzdCAoYW55IGxpc3QpIHNvCisJCQkJCSAgIGVyYXNlX2ZhaWxlZCBjYW4gdGFrZSBpdCByaWdodCBvZmYKKwkJCQkJICAgYWdhaW4uICBTaWxseSwgYnV0IHNob3VsZG4ndCBoYXBwZW4KKwkJCQkJICAgb2Z0ZW4uICovCisJCQkJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5lcmFzaW5nX2xpc3QpOworCQkJCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJCQkJamZmczJfZXJhc2VfZmFpbGVkKGMsIGplYiwgYmFkX29mZnNldCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQlvZnMgKz0gcmVhZGxlbjsKKwkJCWNvbmRfcmVzY2hlZCgpOworCQl9CisJCWtmcmVlKGVidWYpOworCX0KKworCWJhZF9vZmZzZXQgPSBqZWItPm9mZnNldDsKKworCS8qIFdyaXRlIHRoZSBlcmFzZSBjb21wbGV0ZSBtYXJrZXIgKi8JCisJRDEocHJpbnRrKEtFUk5fREVCVUcgIldyaXRpbmcgZXJhc2VkIG1hcmtlciB0byBibG9jayBhdCAweCUwOHhcbiIsIGplYi0+b2Zmc2V0KSk7CisJaWYgKGpmZnMyX2NsZWFubWFya2VyX29vYihjKSkgeworCisJCWlmIChqZmZzMl93cml0ZV9uYW5kX2NsZWFubWFya2VyKGMsIGplYikpCisJCQlnb3RvIGJhZDI7CisJCQkKKwkJamViLT5maXJzdF9ub2RlID0gamViLT5sYXN0X25vZGUgPSBOVUxMOworCisJCWplYi0+ZnJlZV9zaXplID0gYy0+c2VjdG9yX3NpemU7CisJCWplYi0+dXNlZF9zaXplID0gMDsKKwkJamViLT5kaXJ0eV9zaXplID0gMDsKKwkJamViLT53YXN0ZWRfc2l6ZSA9IDA7CisJfSBlbHNlIHsKKwkJc3RydWN0IGt2ZWMgdmVjc1sxXTsKKwkJc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSBtYXJrZXIgPSB7CisJCQkubWFnaWMgPQljcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKSwKKwkJCS5ub2RldHlwZSA9CWNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0NMRUFOTUFSS0VSKSwKKwkJCS50b3RsZW4gPQljcHVfdG9famUzMihjLT5jbGVhbm1hcmtlcl9zaXplKQorCQl9OworCisJCW1hcmtlci5oZHJfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgJm1hcmtlciwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpLTQpKTsKKworCQl2ZWNzWzBdLmlvdl9iYXNlID0gKHVuc2lnbmVkIGNoYXIgKikgJm1hcmtlcjsKKwkJdmVjc1swXS5pb3ZfbGVuID0gc2l6ZW9mKG1hcmtlcik7CisJCXJldCA9IGpmZnMyX2ZsYXNoX2RpcmVjdF93cml0ZXYoYywgdmVjcywgMSwgamViLT5vZmZzZXQsICZyZXRsZW4pOworCQkKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiV3JpdGUgY2xlYW4gbWFya2VyIHRvIGJsb2NrIGF0IDB4JTA4eCBmYWlsZWQ6ICVkXG4iLAorCQkJICAgICAgIGplYi0+b2Zmc2V0LCByZXQpOworCQkJZ290byBiYWQyOworCQl9CisJCWlmIChyZXRsZW4gIT0gc2l6ZW9mKG1hcmtlcikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNob3J0IHdyaXRlIHRvIG5ld2x5LWVyYXNlZCBibG9jayBhdCAweCUwOHg6IFdhbnRlZCAlemQsIGdvdCAlemRcbiIsCisJCQkgICAgICAgamViLT5vZmZzZXQsIHNpemVvZihtYXJrZXIpLCByZXRsZW4pOworCQkJZ290byBiYWQyOworCQl9CisKKwkJbWFya2VyX3JlZi0+bmV4dF9pbl9pbm8gPSBOVUxMOworCQltYXJrZXJfcmVmLT5uZXh0X3BoeXMgPSBOVUxMOworCQltYXJrZXJfcmVmLT5mbGFzaF9vZmZzZXQgPSBqZWItPm9mZnNldCB8IFJFRl9OT1JNQUw7CisJCW1hcmtlcl9yZWYtPl9fdG90bGVuID0gYy0+Y2xlYW5tYXJrZXJfc2l6ZTsKKwkJCQorCQlqZWItPmZpcnN0X25vZGUgPSBqZWItPmxhc3Rfbm9kZSA9IG1hcmtlcl9yZWY7CisJCQkKKwkJamViLT5mcmVlX3NpemUgPSBjLT5zZWN0b3Jfc2l6ZSAtIGMtPmNsZWFubWFya2VyX3NpemU7CisJCWplYi0+dXNlZF9zaXplID0gYy0+Y2xlYW5tYXJrZXJfc2l6ZTsKKwkJamViLT5kaXJ0eV9zaXplID0gMDsKKwkJamViLT53YXN0ZWRfc2l6ZSA9IDA7CisJfQorCisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCWMtPmVyYXNpbmdfc2l6ZSAtPSBjLT5zZWN0b3Jfc2l6ZTsKKwljLT5mcmVlX3NpemUgKz0gamViLT5mcmVlX3NpemU7CisJYy0+dXNlZF9zaXplICs9IGplYi0+dXNlZF9zaXplOworCisJQUNDVF9TQU5JVFlfQ0hFQ0soYyxqZWIpOworCUQxKEFDQ1RfUEFSQU5PSUFfQ0hFQ0soamViKSk7CisKKwlsaXN0X2FkZF90YWlsKCZqZWItPmxpc3QsICZjLT5mcmVlX2xpc3QpOworCWMtPm5yX2VyYXNpbmdfYmxvY2tzLS07CisJYy0+bnJfZnJlZV9ibG9ja3MrKzsKKwlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwl3YWtlX3VwKCZjLT5lcmFzZV93YWl0KTsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZmlsZS5jIGIvZnMvamZmczIvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNjA3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9maWxlLmMKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgorICoKKyAqICRJZDogZmlsZS5jLHYgMS45OSAyMDA0LzExLzE2IDIwOjM2OjExIGR3bXcyIEV4cCAkCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9qZmZzMi5oPgorI2luY2x1ZGUgIm5vZGVsaXN0LmgiCisKK2V4dGVybiBpbnQgZ2VuZXJpY19maWxlX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopIF9fYXR0cmlidXRlX18oKHdlYWspKTsKK2V4dGVybiBsb2ZmX3QgZ2VuZXJpY19maWxlX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikgX19hdHRyaWJ1dGVfXygod2VhaykpOworCitzdGF0aWMgaW50IGpmZnMyX2NvbW1pdF93cml0ZSAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwYWdlICpwZywKKwkJCSAgICAgICB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5kKTsKK3N0YXRpYyBpbnQgamZmczJfcHJlcGFyZV93cml0ZSAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwYWdlICpwZywKKwkJCQl1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5kKTsKK3N0YXRpYyBpbnQgamZmczJfcmVhZHBhZ2UgKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcGFnZSAqcGcpOworCitpbnQgamZmczJfZnN5bmMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmMgPSBKRkZTMl9TQl9JTkZPKGlub2RlLT5pX3NiKTsKKworCS8qIFRyaWdnZXIgR0MgdG8gZmx1c2ggYW55IHBlbmRpbmcgd3JpdGVzIGZvciB0aGlzIGlub2RlICovCisJamZmczJfZmx1c2hfd2J1Zl9nYyhjLCBpbm9kZS0+aV9pbm8pOworCQkJCisJcmV0dXJuIDA7CQorfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGpmZnMyX2ZpbGVfb3BlcmF0aW9ucyA9Cit7CisJLmxsc2VlayA9CWdlbmVyaWNfZmlsZV9sbHNlZWssCisJLm9wZW4gPQkJZ2VuZXJpY19maWxlX29wZW4sCisJLnJlYWQgPQkJZ2VuZXJpY19maWxlX3JlYWQsCisJLndyaXRlID0JZ2VuZXJpY19maWxlX3dyaXRlLAorCS5pb2N0bCA9CWpmZnMyX2lvY3RsLAorCS5tbWFwID0JCWdlbmVyaWNfZmlsZV9yZWFkb25seV9tbWFwLAorCS5mc3luYyA9CWpmZnMyX2ZzeW5jLAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMjkpCisJLnNlbmRmaWxlID0JZ2VuZXJpY19maWxlX3NlbmRmaWxlCisjZW5kaWYKK307CisKKy8qIGpmZnMyX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyAqLworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBqZmZzMl9maWxlX2lub2RlX29wZXJhdGlvbnMgPQoreworCS5zZXRhdHRyID0JamZmczJfc2V0YXR0cgorfTsKKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBqZmZzMl9maWxlX2FkZHJlc3Nfb3BlcmF0aW9ucyA9Cit7CisJLnJlYWRwYWdlID0JamZmczJfcmVhZHBhZ2UsCisJLnByZXBhcmVfd3JpdGUgPWpmZnMyX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZSA9CWpmZnMyX2NvbW1pdF93cml0ZQorfTsKKworc3RhdGljIGludCBqZmZzMl9kb19yZWFkcGFnZV9ub2xvY2sgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwZykKK3sKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiA9IEpGRlMyX0lOT0RFX0lORk8oaW5vZGUpOworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjID0gSkZGUzJfU0JfSU5GTyhpbm9kZS0+aV9zYik7CisJdW5zaWduZWQgY2hhciAqcGdfYnVmOworCWludCByZXQ7CisKKwlEMihwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZG9fcmVhZHBhZ2Vfbm9sb2NrKCk6IGlubyAjJWx1LCBwYWdlIGF0IG9mZnNldCAweCVseFxuIiwgaW5vZGUtPmlfaW5vLCBwZy0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkpOworCisJaWYgKCFQYWdlTG9ja2VkKHBnKSkKKyAgICAgICAgICAgICAgICBQQUdFX0JVRyhwZyk7CisKKwlwZ19idWYgPSBrbWFwKHBnKTsKKwkvKiBGSVhNRTogQ2FuIGttYXAgZmFpbD8gKi8KKworCXJldCA9IGpmZnMyX3JlYWRfaW5vZGVfcmFuZ2UoYywgZiwgcGdfYnVmLCBwZy0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCwgUEFHRV9DQUNIRV9TSVpFKTsKKworCWlmIChyZXQpIHsKKwkJQ2xlYXJQYWdlVXB0b2RhdGUocGcpOworCQlTZXRQYWdlRXJyb3IocGcpOworCX0gZWxzZSB7CisJCVNldFBhZ2VVcHRvZGF0ZShwZyk7CisJCUNsZWFyUGFnZUVycm9yKHBnKTsKKwl9CisKKwlmbHVzaF9kY2FjaGVfcGFnZShwZyk7CisJa3VubWFwKHBnKTsKKworCUQyKHByaW50ayhLRVJOX0RFQlVHICJyZWFkcGFnZSBmaW5pc2hlZFxuIikpOworCXJldHVybiAwOworfQorCitpbnQgamZmczJfZG9fcmVhZHBhZ2VfdW5sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwZykKK3sKKwlpbnQgcmV0ID0gamZmczJfZG9fcmVhZHBhZ2Vfbm9sb2NrKGlub2RlLCBwZyk7CisJdW5sb2NrX3BhZ2UocGcpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBqZmZzMl9yZWFkcGFnZSAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwYWdlICpwZykKK3sKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiA9IEpGRlMyX0lOT0RFX0lORk8ocGctPm1hcHBpbmctPmhvc3QpOworCWludCByZXQ7CisJCisJZG93bigmZi0+c2VtKTsKKwlyZXQgPSBqZmZzMl9kb19yZWFkcGFnZV91bmxvY2socGctPm1hcHBpbmctPmhvc3QsIHBnKTsKKwl1cCgmZi0+c2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGpmZnMyX3ByZXBhcmVfd3JpdGUgKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcGFnZSAqcGcsCisJCQkJdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGctPm1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYgPSBKRkZTMl9JTk9ERV9JTkZPKGlub2RlKTsKKwl1aW50MzJfdCBwYWdlb2ZzID0gcGctPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaW50IHJldCA9IDA7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfcHJlcGFyZV93cml0ZSgpXG4iKSk7CisKKwlpZiAocGFnZW9mcyA+IGlub2RlLT5pX3NpemUpIHsKKwkJLyogTWFrZSBuZXcgaG9sZSBmcmFnIGZyb20gb2xkIEVPRiB0byBuZXcgcGFnZSAqLworCQlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyA9IEpGRlMyX1NCX0lORk8oaW5vZGUtPmlfc2IpOworCQlzdHJ1Y3QgamZmczJfcmF3X2lub2RlIHJpOworCQlzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZm47CisJCXVpbnQzMl90IHBoeXNfb2ZzLCBhbGxvY19sZW47CisJCQorCQlEMShwcmludGsoS0VSTl9ERUJVRyAiV3JpdGluZyBuZXcgaG9sZSBmcmFnIDB4JXgtMHgleCBiZXR3ZWVuIGN1cnJlbnQgRU9GIGFuZCBuZXcgcGFnZVxuIiwKKwkJCSAgKHVuc2lnbmVkIGludClpbm9kZS0+aV9zaXplLCBwYWdlb2ZzKSk7CisKKwkJcmV0ID0gamZmczJfcmVzZXJ2ZV9zcGFjZShjLCBzaXplb2YocmkpLCAmcGh5c19vZnMsICZhbGxvY19sZW4sIEFMTE9DX05PUk1BTCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWRvd24oJmYtPnNlbSk7CisJCW1lbXNldCgmcmksIDAsIHNpemVvZihyaSkpOworCisJCXJpLm1hZ2ljID0gY3B1X3RvX2plMTYoSkZGUzJfTUFHSUNfQklUTUFTSyk7CisJCXJpLm5vZGV0eXBlID0gY3B1X3RvX2plMTYoSkZGUzJfTk9ERVRZUEVfSU5PREUpOworCQlyaS50b3RsZW4gPSBjcHVfdG9famUzMihzaXplb2YocmkpKTsKKwkJcmkuaGRyX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsICZyaSwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpLTQpKTsKKworCQlyaS5pbm8gPSBjcHVfdG9famUzMihmLT5pbm9jYWNoZS0+aW5vKTsKKwkJcmkudmVyc2lvbiA9IGNwdV90b19qZTMyKCsrZi0+aGlnaGVzdF92ZXJzaW9uKTsKKwkJcmkubW9kZSA9IGNwdV90b19qZW1vZGUoaW5vZGUtPmlfbW9kZSk7CisJCXJpLnVpZCA9IGNwdV90b19qZTE2KGlub2RlLT5pX3VpZCk7CisJCXJpLmdpZCA9IGNwdV90b19qZTE2KGlub2RlLT5pX2dpZCk7CisJCXJpLmlzaXplID0gY3B1X3RvX2plMzIobWF4KCh1aW50MzJfdClpbm9kZS0+aV9zaXplLCBwYWdlb2ZzKSk7CisJCXJpLmF0aW1lID0gcmkuY3RpbWUgPSByaS5tdGltZSA9IGNwdV90b19qZTMyKGdldF9zZWNvbmRzKCkpOworCQlyaS5vZmZzZXQgPSBjcHVfdG9famUzMihpbm9kZS0+aV9zaXplKTsKKwkJcmkuZHNpemUgPSBjcHVfdG9famUzMihwYWdlb2ZzIC0gaW5vZGUtPmlfc2l6ZSk7CisJCXJpLmNzaXplID0gY3B1X3RvX2plMzIoMCk7CisJCXJpLmNvbXByID0gSkZGUzJfQ09NUFJfWkVSTzsKKwkJcmkubm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCAmcmksIHNpemVvZihyaSktOCkpOworCQlyaS5kYXRhX2NyYyA9IGNwdV90b19qZTMyKDApOworCQkKKwkJZm4gPSBqZmZzMl93cml0ZV9kbm9kZShjLCBmLCAmcmksIE5VTEwsIDAsIHBoeXNfb2ZzLCBBTExPQ19OT1JNQUwpOworCisJCWlmIChJU19FUlIoZm4pKSB7CisJCQlyZXQgPSBQVFJfRVJSKGZuKTsKKwkJCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOworCQkJdXAoJmYtPnNlbSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldCA9IGpmZnMyX2FkZF9mdWxsX2Rub2RlX3RvX2lub2RlKGMsIGYsIGZuKTsKKwkJaWYgKGYtPm1ldGFkYXRhKSB7CisJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgZi0+bWV0YWRhdGEtPnJhdyk7CisJCQlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUoZi0+bWV0YWRhdGEpOworCQkJZi0+bWV0YWRhdGEgPSBOVUxMOworCQl9CisJCWlmIChyZXQpIHsKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFZXAuIGFkZF9mdWxsX2Rub2RlX3RvX2lub2RlKCkgZmFpbGVkIGluIHByZXBhcmVfd3JpdGUsIHJldHVybmVkICVkXG4iLCByZXQpKTsKKwkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCBmbi0+cmF3KTsKKwkJCWpmZnMyX2ZyZWVfZnVsbF9kbm9kZShmbik7CisJCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJCXVwKCZmLT5zZW0pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJaW5vZGUtPmlfc2l6ZSA9IHBhZ2VvZnM7CisJCXVwKCZmLT5zZW0pOworCX0KKwkKKwkvKiBSZWFkIGluIHRoZSBwYWdlIGlmIGl0IHdhc24ndCBhbHJlYWR5IHByZXNlbnQsIHVubGVzcyBpdCdzIGEgd2hvbGUgcGFnZSAqLworCWlmICghUGFnZVVwdG9kYXRlKHBnKSAmJiAoc3RhcnQgfHwgZW5kIDwgUEFHRV9DQUNIRV9TSVpFKSkgeworCQlkb3duKCZmLT5zZW0pOworCQlyZXQgPSBqZmZzMl9kb19yZWFkcGFnZV9ub2xvY2soaW5vZGUsIHBnKTsKKwkJdXAoJmYtPnNlbSk7CisJfQorCUQxKHByaW50ayhLRVJOX0RFQlVHICJlbmQgcHJlcGFyZV93cml0ZSgpLiBwZy0+ZmxhZ3MgJWx4XG4iLCBwZy0+ZmxhZ3MpKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGpmZnMyX2NvbW1pdF93cml0ZSAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwYWdlICpwZywKKwkJCSAgICAgICB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5kKQoreworCS8qIEFjdHVhbGx5IGNvbW1pdCB0aGUgd3JpdGUgZnJvbSB0aGUgcGFnZSBjYWNoZSBwYWdlIHdlJ3JlIGxvb2tpbmcgYXQuCisJICogRm9yIG5vdywgd2Ugd3JpdGUgdGhlIGZ1bGwgcGFnZSBvdXQgZWFjaCB0aW1lLiBJdCBzdWNrcywgYnV0IGl0J3Mgc2ltcGxlCisJICovCisJc3RydWN0IGlub2RlICppbm9kZSA9IHBnLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmID0gSkZGUzJfSU5PREVfSU5GTyhpbm9kZSk7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmMgPSBKRkZTMl9TQl9JTkZPKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaTsKKwl1bnNpZ25lZCBhbGlnbmVkX3N0YXJ0ID0gc3RhcnQgJiB+MzsKKwlpbnQgcmV0ID0gMDsKKwl1aW50MzJfdCB3cml0dGVubGVuID0gMDsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9jb21taXRfd3JpdGUoKTogaW5vICMlbHUsIHBhZ2UgYXQgMHglbHgsIHJhbmdlICVkLSVkLCBmbGFncyAlbHhcbiIsCisJCSAgaW5vZGUtPmlfaW5vLCBwZy0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCwgc3RhcnQsIGVuZCwgcGctPmZsYWdzKSk7CisKKwlpZiAoIXN0YXJ0ICYmIGVuZCA9PSBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJLyogV2UgbmVlZCB0byBhdm9pZCBkZWFkbG9jayB3aXRoIHBhZ2VfY2FjaGVfcmVhZCgpIGluCisJCSAgIGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9wYXNzKCkuIFNvIHdlIGhhdmUgdG8gbWFyayB0aGUKKwkJICAgcGFnZSB1cCB0byBkYXRlLCB0byBwcmV2ZW50IHBhZ2VfY2FjaGVfcmVhZCgpIGZyb20gCisJCSAgIHRyeWluZyB0byByZS1sb2NrIGl0LiAqLworCQlTZXRQYWdlVXB0b2RhdGUocGcpOworCX0KKworCXJpID0gamZmczJfYWxsb2NfcmF3X2lub2RlKCk7CisKKwlpZiAoIXJpKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9jb21taXRfd3JpdGUoKTogQWxsb2NhdGlvbiBvZiByYXcgaW5vZGUgZmFpbGVkXG4iKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFNldCB0aGUgZmllbGRzIHRoYXQgdGhlIGdlbmVyaWMgamZmczJfd3JpdGVfaW5vZGVfcmFuZ2UoKSBjb2RlIGNhbid0IGZpbmQgKi8KKwlyaS0+aW5vID0gY3B1X3RvX2plMzIoaW5vZGUtPmlfaW5vKTsKKwlyaS0+bW9kZSA9IGNwdV90b19qZW1vZGUoaW5vZGUtPmlfbW9kZSk7CisJcmktPnVpZCA9IGNwdV90b19qZTE2KGlub2RlLT5pX3VpZCk7CisJcmktPmdpZCA9IGNwdV90b19qZTE2KGlub2RlLT5pX2dpZCk7CisJcmktPmlzaXplID0gY3B1X3RvX2plMzIoKHVpbnQzMl90KWlub2RlLT5pX3NpemUpOworCXJpLT5hdGltZSA9IHJpLT5jdGltZSA9IHJpLT5tdGltZSA9IGNwdV90b19qZTMyKGdldF9zZWNvbmRzKCkpOworCisJLyogSW4gMi40LCBpdCB3YXMgYWxyZWFkeSBrbWFwcGVkIGJ5IGdlbmVyaWNfZmlsZV93cml0ZSgpLiBEb2Vzbid0CisJICAgaHVydCB0byBkbyBpdCBhZ2Fpbi4gVGhlIGFsdGVybmF0aXZlIGlzIGlmZGVmcywgd2hpY2ggYXJlIHVnbHkuICovCisJa21hcChwZyk7CisKKwlyZXQgPSBqZmZzMl93cml0ZV9pbm9kZV9yYW5nZShjLCBmLCByaSwgcGFnZV9hZGRyZXNzKHBnKSArIGFsaWduZWRfc3RhcnQsCisJCQkJICAgICAgKHBnLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIGFsaWduZWRfc3RhcnQsCisJCQkJICAgICAgZW5kIC0gYWxpZ25lZF9zdGFydCwgJndyaXR0ZW5sZW4pOworCisJa3VubWFwKHBnKTsKKworCWlmIChyZXQpIHsKKwkJLyogVGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcuICovCisJCVNldFBhZ2VFcnJvcihwZyk7CisJfQorCQorCS8qIEFkanVzdCB3cml0dGVubGVuIGZvciB0aGUgcGFkZGluZyB3ZSBkaWQsIHNvIHdlIGRvbid0IGNvbmZ1c2Ugb3VyIGNhbGxlciAqLworCWlmICh3cml0dGVubGVuIDwgKHN0YXJ0JjMpKQorCQl3cml0dGVubGVuID0gMDsKKwllbHNlCisJCXdyaXR0ZW5sZW4gLT0gKHN0YXJ0JjMpOworCisJaWYgKHdyaXR0ZW5sZW4pIHsKKwkJaWYgKGlub2RlLT5pX3NpemUgPCAocGctPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgc3RhcnQgKyB3cml0dGVubGVuKSB7CisJCQlpbm9kZS0+aV9zaXplID0gKHBnLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIHN0YXJ0ICsgd3JpdHRlbmxlbjsKKwkJCWlub2RlLT5pX2Jsb2NrcyA9IChpbm9kZS0+aV9zaXplICsgNTExKSA+PiA5OworCQkJCisJCQlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0gSVRJTUUoamUzMl90b19jcHUocmktPmN0aW1lKSk7CisJCX0KKwl9CisKKwlqZmZzMl9mcmVlX3Jhd19pbm9kZShyaSk7CisKKwlpZiAoc3RhcnQrd3JpdHRlbmxlbiA8IGVuZCkgeworCQkvKiBnZW5lcmljX2ZpbGVfd3JpdGUgaGFzIHdyaXR0ZW4gbW9yZSB0byB0aGUgcGFnZSBjYWNoZSB0aGFuIHdlJ3ZlCisJCSAgIGFjdHVhbGx5IHdyaXR0ZW4gdG8gdGhlIG1lZGl1bS4gTWFyayB0aGUgcGFnZSAhVXB0b2RhdGUgc28gdGhhdCAKKwkJICAgaXQgZ2V0cyByZXJlYWQgKi8KKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2NvbW1pdF93cml0ZSgpOiBOb3QgYWxsIGJ5dGVzIHdyaXR0ZW4uIE1hcmtpbmcgcGFnZSAhdXB0b2RhdGVcbiIpKTsKKwkJU2V0UGFnZUVycm9yKHBnKTsKKwkJQ2xlYXJQYWdlVXB0b2RhdGUocGcpOworCX0KKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9jb21taXRfd3JpdGUoKSByZXR1cm5pbmcgJWRcbiIsd3JpdHRlbmxlbj93cml0dGVubGVuOnJldCkpOworCXJldHVybiB3cml0dGVubGVuP3dyaXR0ZW5sZW46cmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZnMuYyBiL2ZzL2pmZnMyL2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhYjIzMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL2ZzLmMKQEAgLTAsMCArMSw2NzcgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgorICoKKyAqICRJZDogZnMuYyx2IDEuNTEgMjAwNC8xMS8yOCAxMjoxOTozNyBkZWRla2luZCBFeHAgJAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSAibm9kZWxpc3QuaCIKKworc3RhdGljIGludCBqZmZzMl9mbGFzaF9zZXR1cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CisKK3N0YXRpYyBpbnQgamZmczJfZG9fc2V0YXR0ciAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICppYXR0cikKK3sKKwlzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqb2xkX21ldGFkYXRhLCAqbmV3X21ldGFkYXRhOworCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmID0gSkZGUzJfSU5PREVfSU5GTyhpbm9kZSk7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmMgPSBKRkZTMl9TQl9JTkZPKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaTsKKwl1bnNpZ25lZCBzaG9ydCBkZXY7CisJdW5zaWduZWQgY2hhciAqbWRhdGEgPSBOVUxMOworCWludCBtZGF0YWxlbiA9IDA7CisJdW5zaWduZWQgaW50IGl2YWxpZDsKKwl1aW50MzJfdCBwaHlzX29mcywgYWxsb2NsZW47CisJaW50IHJldDsKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfc2V0YXR0cigpOiBpbm8gIyVsdVxuIiwgaW5vZGUtPmlfaW5vKSk7CisJcmV0ID0gaW5vZGVfY2hhbmdlX29rKGlub2RlLCBpYXR0cik7CisJaWYgKHJldCkgCisJCXJldHVybiByZXQ7CisKKwkvKiBTcGVjaWFsIGNhc2VzIC0gd2UgZG9uJ3Qgd2FudCBtb3JlIHRoYW4gb25lIGRhdGEgbm9kZQorCSAgIGZvciB0aGVzZSB0eXBlcyBvbiB0aGUgbWVkaXVtIGF0IGFueSB0aW1lLiBTbyBzZXRhdHRyCisJICAgbXVzdCByZWFkIHRoZSBvcmlnaW5hbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9kZQorCSAgIChpLmUuIHRoZSBkZXZpY2UgbnVtYmVycyBvciB0aGUgdGFyZ2V0IG5hbWUpIGFuZCB3cml0ZQorCSAgIGl0IG91dCBhZ2FpbiB3aXRoIHRoZSBhcHByb3ByaWF0ZSBkYXRhIGF0dGFjaGVkICovCisJaWYgKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0NIUihpbm9kZS0+aV9tb2RlKSkgeworCQkvKiBGb3IgdGhlc2UsIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gcmVhZCB0aGUgb2xkIG5vZGUgKi8KKwkJZGV2ID0gb2xkX2VuY29kZV9kZXYoaW5vZGUtPmlfcmRldik7CisJCW1kYXRhID0gKGNoYXIgKikmZGV2OworCQltZGF0YWxlbiA9IHNpemVvZihkZXYpOworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfc2V0YXR0cigpOiBXcml0aW5nICVkIGJ5dGVzIG9mIGtkZXZfdFxuIiwgbWRhdGFsZW4pKTsKKwl9IGVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKKwkJbWRhdGFsZW4gPSBmLT5tZXRhZGF0YS0+c2l6ZTsKKwkJbWRhdGEgPSBrbWFsbG9jKGYtPm1ldGFkYXRhLT5zaXplLCBHRlBfVVNFUik7CisJCWlmICghbWRhdGEpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0ID0gamZmczJfcmVhZF9kbm9kZShjLCBmLCBmLT5tZXRhZGF0YSwgbWRhdGEsIDAsIG1kYXRhbGVuKTsKKwkJaWYgKHJldCkgeworCQkJa2ZyZWUobWRhdGEpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfc2V0YXR0cigpOiBXcml0aW5nICVkIGJ5dGVzIG9mIHN5bWxpbmsgdGFyZ2V0XG4iLCBtZGF0YWxlbikpOworCX0KKworCXJpID0gamZmczJfYWxsb2NfcmF3X2lub2RlKCk7CisJaWYgKCFyaSkgeworCQlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJCWtmcmVlKG1kYXRhKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCQkKKwlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlKGMsIHNpemVvZigqcmkpICsgbWRhdGFsZW4sICZwaHlzX29mcywgJmFsbG9jbGVuLCBBTExPQ19OT1JNQUwpOworCWlmIChyZXQpIHsKKwkJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOworCQlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlICYgU19JRk1UKSkKKwkJCSBrZnJlZShtZGF0YSk7CisJCXJldHVybiByZXQ7CisJfQorCWRvd24oJmYtPnNlbSk7CisJaXZhbGlkID0gaWF0dHItPmlhX3ZhbGlkOworCQorCXJpLT5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOworCXJpLT5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0lOT0RFKTsKKwlyaS0+dG90bGVuID0gY3B1X3RvX2plMzIoc2l6ZW9mKCpyaSkgKyBtZGF0YWxlbik7CisJcmktPmhkcl9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByaSwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpLTQpKTsKKworCXJpLT5pbm8gPSBjcHVfdG9famUzMihpbm9kZS0+aV9pbm8pOworCXJpLT52ZXJzaW9uID0gY3B1X3RvX2plMzIoKytmLT5oaWdoZXN0X3ZlcnNpb24pOworCisJcmktPnVpZCA9IGNwdV90b19qZTE2KChpdmFsaWQgJiBBVFRSX1VJRCk/aWF0dHItPmlhX3VpZDppbm9kZS0+aV91aWQpOworCXJpLT5naWQgPSBjcHVfdG9famUxNigoaXZhbGlkICYgQVRUUl9HSUQpP2lhdHRyLT5pYV9naWQ6aW5vZGUtPmlfZ2lkKTsKKworCWlmIChpdmFsaWQgJiBBVFRSX01PREUpCisJCWlmIChpYXR0ci0+aWFfbW9kZSAmIFNfSVNHSUQgJiYKKwkJICAgICFpbl9ncm91cF9wKGplMTZfdG9fY3B1KHJpLT5naWQpKSAmJiAhY2FwYWJsZShDQVBfRlNFVElEKSkKKwkJCXJpLT5tb2RlID0gY3B1X3RvX2plbW9kZShpYXR0ci0+aWFfbW9kZSAmIH5TX0lTR0lEKTsKKwkJZWxzZSAKKwkJCXJpLT5tb2RlID0gY3B1X3RvX2plbW9kZShpYXR0ci0+aWFfbW9kZSk7CisJZWxzZQorCQlyaS0+bW9kZSA9IGNwdV90b19qZW1vZGUoaW5vZGUtPmlfbW9kZSk7CisKKworCXJpLT5pc2l6ZSA9IGNwdV90b19qZTMyKChpdmFsaWQgJiBBVFRSX1NJWkUpP2lhdHRyLT5pYV9zaXplOmlub2RlLT5pX3NpemUpOworCXJpLT5hdGltZSA9IGNwdV90b19qZTMyKElfU0VDKChpdmFsaWQgJiBBVFRSX0FUSU1FKT9pYXR0ci0+aWFfYXRpbWU6aW5vZGUtPmlfYXRpbWUpKTsKKwlyaS0+bXRpbWUgPSBjcHVfdG9famUzMihJX1NFQygoaXZhbGlkICYgQVRUUl9NVElNRSk/aWF0dHItPmlhX210aW1lOmlub2RlLT5pX210aW1lKSk7CisJcmktPmN0aW1lID0gY3B1X3RvX2plMzIoSV9TRUMoKGl2YWxpZCAmIEFUVFJfQ1RJTUUpP2lhdHRyLT5pYV9jdGltZTppbm9kZS0+aV9jdGltZSkpOworCisJcmktPm9mZnNldCA9IGNwdV90b19qZTMyKDApOworCXJpLT5jc2l6ZSA9IHJpLT5kc2l6ZSA9IGNwdV90b19qZTMyKG1kYXRhbGVuKTsKKwlyaS0+Y29tcHIgPSBKRkZTMl9DT01QUl9OT05FOworCWlmIChpdmFsaWQgJiBBVFRSX1NJWkUgJiYgaW5vZGUtPmlfc2l6ZSA8IGlhdHRyLT5pYV9zaXplKSB7CisJCS8qIEl0J3MgYW4gZXh0ZW5zaW9uLiBNYWtlIGl0IGEgaG9sZSBub2RlICovCisJCXJpLT5jb21wciA9IEpGRlMyX0NPTVBSX1pFUk87CisJCXJpLT5kc2l6ZSA9IGNwdV90b19qZTMyKGlhdHRyLT5pYV9zaXplIC0gaW5vZGUtPmlfc2l6ZSk7CisJCXJpLT5vZmZzZXQgPSBjcHVfdG9famUzMihpbm9kZS0+aV9zaXplKTsKKwl9CisJcmktPm5vZGVfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmksIHNpemVvZigqcmkpLTgpKTsKKwlpZiAobWRhdGFsZW4pCisJCXJpLT5kYXRhX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIG1kYXRhLCBtZGF0YWxlbikpOworCWVsc2UKKwkJcmktPmRhdGFfY3JjID0gY3B1X3RvX2plMzIoMCk7CisKKwluZXdfbWV0YWRhdGEgPSBqZmZzMl93cml0ZV9kbm9kZShjLCBmLCByaSwgbWRhdGEsIG1kYXRhbGVuLCBwaHlzX29mcywgQUxMT0NfTk9STUFMKTsKKwlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJa2ZyZWUobWRhdGEpOworCQorCWlmIChJU19FUlIobmV3X21ldGFkYXRhKSkgeworCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOworCQl1cCgmZi0+c2VtKTsKKwkJcmV0dXJuIFBUUl9FUlIobmV3X21ldGFkYXRhKTsKKwl9CisJLyogSXQgd29ya2VkLiBVcGRhdGUgdGhlIGlub2RlICovCisJaW5vZGUtPmlfYXRpbWUgPSBJVElNRShqZTMyX3RvX2NwdShyaS0+YXRpbWUpKTsKKwlpbm9kZS0+aV9jdGltZSA9IElUSU1FKGplMzJfdG9fY3B1KHJpLT5jdGltZSkpOworCWlub2RlLT5pX210aW1lID0gSVRJTUUoamUzMl90b19jcHUocmktPm10aW1lKSk7CisJaW5vZGUtPmlfbW9kZSA9IGplbW9kZV90b19jcHUocmktPm1vZGUpOworCWlub2RlLT5pX3VpZCA9IGplMTZfdG9fY3B1KHJpLT51aWQpOworCWlub2RlLT5pX2dpZCA9IGplMTZfdG9fY3B1KHJpLT5naWQpOworCisKKwlvbGRfbWV0YWRhdGEgPSBmLT5tZXRhZGF0YTsKKworCWlmIChpdmFsaWQgJiBBVFRSX1NJWkUgJiYgaW5vZGUtPmlfc2l6ZSA+IGlhdHRyLT5pYV9zaXplKQorCQlqZmZzMl90cnVuY2F0ZV9mcmFnbGlzdCAoYywgJmYtPmZyYWd0cmVlLCBpYXR0ci0+aWFfc2l6ZSk7CisKKwlpZiAoaXZhbGlkICYgQVRUUl9TSVpFICYmIGlub2RlLT5pX3NpemUgPCBpYXR0ci0+aWFfc2l6ZSkgeworCQlqZmZzMl9hZGRfZnVsbF9kbm9kZV90b19pbm9kZShjLCBmLCBuZXdfbWV0YWRhdGEpOworCQlpbm9kZS0+aV9zaXplID0gaWF0dHItPmlhX3NpemU7CisJCWYtPm1ldGFkYXRhID0gTlVMTDsKKwl9IGVsc2UgeworCQlmLT5tZXRhZGF0YSA9IG5ld19tZXRhZGF0YTsKKwl9CisJaWYgKG9sZF9tZXRhZGF0YSkgeworCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgb2xkX21ldGFkYXRhLT5yYXcpOworCQlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUob2xkX21ldGFkYXRhKTsKKwl9CisJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOworCisJdXAoJmYtPnNlbSk7CisJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisKKwkvKiBXZSBoYXZlIHRvIGRvIHRoZSB2bXRydW5jYXRlKCkgd2l0aG91dCBmLT5zZW0gaGVsZCwgc2luY2UKKwkgICBzb21lIHBhZ2VzIG1heSBiZSBsb2NrZWQgYW5kIHdhaXRpbmcgZm9yIGl0IGluIHJlYWRwYWdlKCkuIAorCSAgIFdlIGFyZSBwcm90ZWN0ZWQgZnJvbSBhIHNpbXVsdGFuZW91cyB3cml0ZSgpIGV4dGVuZGluZyBpX3NpemUKKwkgICBiYWNrIHBhc3QgaWF0dHItPmlhX3NpemUsIGJlY2F1c2UgZG9fdHJ1bmNhdGUoKSBob2xkcyB0aGUKKwkgICBnZW5lcmljIGlub2RlIHNlbWFwaG9yZS4gKi8KKwlpZiAoaXZhbGlkICYgQVRUUl9TSVpFICYmIGlub2RlLT5pX3NpemUgPiBpYXR0ci0+aWFfc2l6ZSkKKwkJdm10cnVuY2F0ZShpbm9kZSwgaWF0dHItPmlhX3NpemUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBqZmZzMl9zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICppYXR0cikKK3sKKwlyZXR1cm4gamZmczJfZG9fc2V0YXR0cihkZW50cnktPmRfaW5vZGUsIGlhdHRyKTsKK30KKworaW50IGpmZnMyX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjID0gSkZGUzJfU0JfSU5GTyhzYik7CisJdW5zaWduZWQgbG9uZyBhdmFpbDsKKworCWJ1Zi0+Zl90eXBlID0gSkZGUzJfU1VQRVJfTUFHSUM7CisJYnVmLT5mX2JzaXplID0gMSA8PCBQQUdFX1NISUZUOworCWJ1Zi0+Zl9ibG9ja3MgPSBjLT5mbGFzaF9zaXplID4+IFBBR0VfU0hJRlQ7CisJYnVmLT5mX2ZpbGVzID0gMDsKKwlidWYtPmZfZmZyZWUgPSAwOworCWJ1Zi0+Zl9uYW1lbGVuID0gSkZGUzJfTUFYX05BTUVfTEVOOworCisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJYXZhaWwgPSBjLT5kaXJ0eV9zaXplICsgYy0+ZnJlZV9zaXplOworCWlmIChhdmFpbCA+IGMtPnNlY3Rvcl9zaXplICogYy0+cmVzdl9ibG9ja3Nfd3JpdGUpCisJCWF2YWlsIC09IGMtPnNlY3Rvcl9zaXplICogYy0+cmVzdl9ibG9ja3Nfd3JpdGU7CisJZWxzZQorCQlhdmFpbCA9IDA7CisKKwlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlID0gYXZhaWwgPj4gUEFHRV9TSElGVDsKKworCUQyKGpmZnMyX2R1bXBfYmxvY2tfbGlzdHMoYykpOworCisJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGpmZnMyX2NsZWFyX2lub2RlIChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCS8qIFdlIGNhbiBmb3JnZXQgYWJvdXQgdGhpcyBpbm9kZSBmb3Igbm93IC0gZHJvcCBhbGwgCisJICogIHRoZSBub2RlbGlzdHMgYXNzb2NpYXRlZCB3aXRoIGl0LCBldGMuCisJICovCisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmMgPSBKRkZTMl9TQl9JTkZPKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiA9IEpGRlMyX0lOT0RFX0lORk8oaW5vZGUpOworCQorCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9jbGVhcl9pbm9kZSgpOiBpbm8gIyVsdSBtb2RlICVvXG4iLCBpbm9kZS0+aV9pbm8sIGlub2RlLT5pX21vZGUpKTsKKworCWpmZnMyX2RvX2NsZWFyX2lub2RlKGMsIGYpOworfQorCit2b2lkIGpmZnMyX3JlYWRfaW5vZGUgKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmY7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmM7CisJc3RydWN0IGpmZnMyX3Jhd19pbm9kZSBsYXRlc3Rfbm9kZTsKKwlpbnQgcmV0OworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3JlYWRfaW5vZGUoKTogaW5vZGUtPmlfaW5vID09ICVsdVxuIiwgaW5vZGUtPmlfaW5vKSk7CisKKwlmID0gSkZGUzJfSU5PREVfSU5GTyhpbm9kZSk7CisJYyA9IEpGRlMyX1NCX0lORk8oaW5vZGUtPmlfc2IpOworCisJamZmczJfaW5pdF9pbm9kZV9pbmZvKGYpOworCQorCXJldCA9IGpmZnMyX2RvX3JlYWRfaW5vZGUoYywgZiwgaW5vZGUtPmlfaW5vLCAmbGF0ZXN0X25vZGUpOworCisJaWYgKHJldCkgeworCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCXVwKCZmLT5zZW0pOworCQlyZXR1cm47CisJfQorCWlub2RlLT5pX21vZGUgPSBqZW1vZGVfdG9fY3B1KGxhdGVzdF9ub2RlLm1vZGUpOworCWlub2RlLT5pX3VpZCA9IGplMTZfdG9fY3B1KGxhdGVzdF9ub2RlLnVpZCk7CisJaW5vZGUtPmlfZ2lkID0gamUxNl90b19jcHUobGF0ZXN0X25vZGUuZ2lkKTsKKwlpbm9kZS0+aV9zaXplID0gamUzMl90b19jcHUobGF0ZXN0X25vZGUuaXNpemUpOworCWlub2RlLT5pX2F0aW1lID0gSVRJTUUoamUzMl90b19jcHUobGF0ZXN0X25vZGUuYXRpbWUpKTsKKwlpbm9kZS0+aV9tdGltZSA9IElUSU1FKGplMzJfdG9fY3B1KGxhdGVzdF9ub2RlLm10aW1lKSk7CisJaW5vZGUtPmlfY3RpbWUgPSBJVElNRShqZTMyX3RvX2NwdShsYXRlc3Rfbm9kZS5jdGltZSkpOworCisJaW5vZGUtPmlfbmxpbmsgPSBmLT5pbm9jYWNoZS0+bmxpbms7CisKKwlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOworCWlub2RlLT5pX2Jsb2NrcyA9IChpbm9kZS0+aV9zaXplICsgNTExKSA+PiA5OworCQorCXN3aXRjaCAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgeworCQlqaW50MTZfdCByZGV2OworCisJY2FzZSBTX0lGTE5LOgorCQlpbm9kZS0+aV9vcCA9ICZqZmZzMl9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWJyZWFrOworCQkKKwljYXNlIFNfSUZESVI6CisJeworCQlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkOworCisJCWZvciAoZmQ9Zi0+ZGVudHM7IGZkOyBmZCA9IGZkLT5uZXh0KSB7CisJCQlpZiAoZmQtPnR5cGUgPT0gRFRfRElSICYmIGZkLT5pbm8pCisJCQkJaW5vZGUtPmlfbmxpbmsrKzsKKwkJfQorCQkvKiBhbmQgJy4uJyAqLworCQlpbm9kZS0+aV9ubGluaysrOworCQkvKiBSb290IGRpciBnZXRzIGlfbmxpbmsgMyBmb3Igc29tZSByZWFzb24gKi8KKwkJaWYgKGlub2RlLT5pX2lubyA9PSAxKQorCQkJaW5vZGUtPmlfbmxpbmsrKzsKKworCQlpbm9kZS0+aV9vcCA9ICZqZmZzMl9kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmpmZnMyX2Rpcl9vcGVyYXRpb25zOworCQlicmVhazsKKwl9CisJY2FzZSBTX0lGUkVHOgorCQlpbm9kZS0+aV9vcCA9ICZqZmZzMl9maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZqZmZzMl9maWxlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmpmZnMyX2ZpbGVfYWRkcmVzc19vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5ucnBhZ2VzID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFNfSUZCTEs6CisJY2FzZSBTX0lGQ0hSOgorCQkvKiBSZWFkIHRoZSBkZXZpY2UgbnVtYmVycyBmcm9tIHRoZSBtZWRpYSAqLworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUmVhZGluZyBkZXZpY2UgbnVtYmVycyBmcm9tIGZsYXNoXG4iKSk7CisJCWlmIChqZmZzMl9yZWFkX2Rub2RlKGMsIGYsIGYtPm1ldGFkYXRhLCAoY2hhciAqKSZyZGV2LCAwLCBzaXplb2YocmRldikpIDwgMCkgeworCQkJLyogRWVwICovCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIlJlYWQgZGV2aWNlIG51bWJlcnMgZm9yIGlub2RlICVsdSBmYWlsZWRcbiIsICh1bnNpZ25lZCBsb25nKWlub2RlLT5pX2lubyk7CisJCQl1cCgmZi0+c2VtKTsKKwkJCWpmZnMyX2RvX2NsZWFyX2lub2RlKGMsIGYpOworCQkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQkJcmV0dXJuOworCQl9CQkJCisKKwljYXNlIFNfSUZTT0NLOgorCWNhc2UgU19JRklGTzoKKwkJaW5vZGUtPmlfb3AgPSAmamZmczJfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCisJCQkJICAgb2xkX2RlY29kZV9kZXYoKGplMTZfdG9fY3B1KHJkZXYpKSkpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX3JlYWRfaW5vZGUoKTogQm9ndXMgaW1vZGUgJW8gZm9yIGlubyAlbHVcbiIsIGlub2RlLT5pX21vZGUsICh1bnNpZ25lZCBsb25nKWlub2RlLT5pX2lubyk7CisJfQorCisJdXAoJmYtPnNlbSk7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfcmVhZF9pbm9kZSgpIHJldHVybmluZ1xuIikpOworfQorCit2b2lkIGpmZnMyX2RpcnR5X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGlhdHRyIGlhdHRyOworCisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX0RJUlRZX0RBVEFTWU5DKSkgeworCQlEMihwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZGlydHlfaW5vZGUoKSBub3QgY2FsbGluZyBzZXRhdHRyKCkgZm9yIGlubyAjJWx1XG4iLCBpbm9kZS0+aV9pbm8pKTsKKwkJcmV0dXJuOworCX0KKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9kaXJ0eV9pbm9kZSgpIGNhbGxpbmcgc2V0YXR0cigpIGZvciBpbm8gIyVsdVxuIiwgaW5vZGUtPmlfaW5vKSk7CisKKwlpYXR0ci5pYV92YWxpZCA9IEFUVFJfTU9ERXxBVFRSX1VJRHxBVFRSX0dJRHxBVFRSX0FUSU1FfEFUVFJfTVRJTUV8QVRUUl9DVElNRTsKKwlpYXR0ci5pYV9tb2RlID0gaW5vZGUtPmlfbW9kZTsKKwlpYXR0ci5pYV91aWQgPSBpbm9kZS0+aV91aWQ7CisJaWF0dHIuaWFfZ2lkID0gaW5vZGUtPmlfZ2lkOworCWlhdHRyLmlhX2F0aW1lID0gaW5vZGUtPmlfYXRpbWU7CisJaWF0dHIuaWFfbXRpbWUgPSBpbm9kZS0+aV9tdGltZTsKKwlpYXR0ci5pYV9jdGltZSA9IGlub2RlLT5pX2N0aW1lOworCisJamZmczJfZG9fc2V0YXR0cihpbm9kZSwgJmlhdHRyKTsKK30KKworaW50IGpmZnMyX3JlbW91bnRfZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmMgPSBKRkZTMl9TQl9JTkZPKHNiKTsKKworCWlmIChjLT5mbGFncyAmIEpGRlMyX1NCX0ZMQUdfUk8gJiYgIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCisJCXJldHVybiAtRVJPRlM7CisKKwkvKiBXZSBzdG9wIGlmIGl0IHdhcyBydW5uaW5nLCB0aGVuIHJlc3RhcnQgaWYgaXQgbmVlZHMgdG8uCisJICAgVGhpcyBhbHNvIGNhdGNoZXMgdGhlIGNhc2Ugd2hlcmUgaXQgd2FzIHN0b3BwZWQgYW5kIHRoaXMKKwkgICBpcyBqdXN0IGEgcmVtb3VudCB0byByZXN0YXJ0IGl0LgorCSAgIEZsdXNoIHRoZSB3cml0ZWJ1ZmZlciwgaWYgbmVjY2VjYXJ5LCBlbHNlIHdlIGxvb3NlIGl0ICovCisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCWpmZnMyX3N0b3BfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZChjKTsKKwkJZG93bigmYy0+YWxsb2Nfc2VtKTsKKwkJamZmczJfZmx1c2hfd2J1Zl9wYWQoYyk7CisJCXVwKCZjLT5hbGxvY19zZW0pOworCX0JCisKKwlpZiAoISgqZmxhZ3MgJiBNU19SRE9OTFkpKQorCQlqZmZzMl9zdGFydF9nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKGMpOworCQorCSpmbGFncyB8PSBNU19OT0FUSU1FOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgamZmczJfd3JpdGVfc3VwZXIgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmMgPSBKRkZTMl9TQl9JTkZPKHNiKTsKKwlzYi0+c19kaXJ0ID0gMDsKKworCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkKKwkJcmV0dXJuOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3dyaXRlX3N1cGVyKClcbiIpKTsKKwlqZmZzMl9nYXJiYWdlX2NvbGxlY3RfdHJpZ2dlcihjKTsKKwlqZmZzMl9lcmFzZV9wZW5kaW5nX2Jsb2NrcyhjLCAwKTsKKwlqZmZzMl9mbHVzaF93YnVmX2djKGMsIDApOworfQorCisKKy8qIGpmZnMyX25ld19pbm9kZTogYWxsb2NhdGUgYSBuZXcgaW5vZGUgYW5kIGlub2NhY2hlLCBhZGQgaXQgdG8gdGhlIGhhc2gsCisgICBmaWxsIGluIHRoZSByYXdfaW5vZGUgd2hpbGUgeW91J3JlIGF0IGl0LiAqLworc3RydWN0IGlub2RlICpqZmZzMl9uZXdfaW5vZGUgKHN0cnVjdCBpbm9kZSAqZGlyX2ksIGludCBtb2RlLCBzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXJfaS0+aV9zYjsKKwlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYzsKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZjsKKwlpbnQgcmV0OworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX25ld19pbm9kZSgpOiBkaXJfaSAlbGQsIG1vZGUgMHgleFxuIiwgZGlyX2ktPmlfaW5vLCBtb2RlKSk7CisKKwljID0gSkZGUzJfU0JfSU5GTyhzYik7CisJCisJaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCQorCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZiA9IEpGRlMyX0lOT0RFX0lORk8oaW5vZGUpOworCWpmZnMyX2luaXRfaW5vZGVfaW5mbyhmKTsKKworCW1lbXNldChyaSwgMCwgc2l6ZW9mKCpyaSkpOworCS8qIFNldCBPUy1zcGVjaWZpYyBkZWZhdWx0cyBmb3IgbmV3IGlub2RlcyAqLworCXJpLT51aWQgPSBjcHVfdG9famUxNihjdXJyZW50LT5mc3VpZCk7CisKKwlpZiAoZGlyX2ktPmlfbW9kZSAmIFNfSVNHSUQpIHsKKwkJcmktPmdpZCA9IGNwdV90b19qZTE2KGRpcl9pLT5pX2dpZCk7CisJCWlmIChTX0lTRElSKG1vZGUpKQorCQkJbW9kZSB8PSBTX0lTR0lEOworCX0gZWxzZSB7CisJCXJpLT5naWQgPSBjcHVfdG9famUxNihjdXJyZW50LT5mc2dpZCk7CisJfQorCXJpLT5tb2RlID0gIGNwdV90b19qZW1vZGUobW9kZSk7CisJcmV0ID0gamZmczJfZG9fbmV3X2lub2RlIChjLCBmLCBtb2RlLCByaSk7CisJaWYgKHJldCkgeworCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKwlpbm9kZS0+aV9ubGluayA9IDE7CisJaW5vZGUtPmlfaW5vID0gamUzMl90b19jcHUocmktPmlubyk7CisJaW5vZGUtPmlfbW9kZSA9IGplbW9kZV90b19jcHUocmktPm1vZGUpOworCWlub2RlLT5pX2dpZCA9IGplMTZfdG9fY3B1KHJpLT5naWQpOworCWlub2RlLT5pX3VpZCA9IGplMTZfdG9fY3B1KHJpLT51aWQpOworCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJcmktPmF0aW1lID0gcmktPm10aW1lID0gcmktPmN0aW1lID0gY3B1X3RvX2plMzIoSV9TRUMoaW5vZGUtPmlfbXRpbWUpKTsKKworCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX1NJWkU7CisJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwlpbm9kZS0+aV9zaXplID0gMDsKKworCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKKworCXJldHVybiBpbm9kZTsKK30KKworCitpbnQgamZmczJfZG9fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjOworCXN0cnVjdCBpbm9kZSAqcm9vdF9pOworCWludCByZXQ7CisJc2l6ZV90IGJsb2NrczsKKworCWMgPSBKRkZTMl9TQl9JTkZPKHNiKTsKKworI2lmbmRlZiBDT05GSUdfSkZGUzJfRlNfTkFORAorCWlmIChjLT5tdGQtPnR5cGUgPT0gTVREX05BTkRGTEFTSCkgeworCQlwcmludGsoS0VSTl9FUlIgImpmZnMyOiBDYW5ub3Qgb3BlcmF0ZSBvbiBOQU5EIGZsYXNoIHVubGVzcyBqZmZzMiBOQU5EIHN1cHBvcnQgaXMgY29tcGlsZWQgaW4uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2VuZGlmCisKKwljLT5mbGFzaF9zaXplID0gYy0+bXRkLT5zaXplOworCisJLyogCisJICogQ2hlY2ssIGlmIHdlIGhhdmUgdG8gY29uY2F0ZW5hdGUgcGh5c2ljYWwgYmxvY2tzIHRvIGxhcmdlciB2aXJ0dWFsIGJsb2NrcworCSAqIHRvIHJlZHVjZSB0aGUgbWVtb3J5c2l6ZSBmb3IgYy0+YmxvY2tzLiAoa21hbGxvYyBhbGxvd3MgbWF4LiAxMjhLIGFsbG9jYXRpb24pCisJICovCisJYy0+c2VjdG9yX3NpemUgPSBjLT5tdGQtPmVyYXNlc2l6ZTsgCisJYmxvY2tzID0gYy0+Zmxhc2hfc2l6ZSAvIGMtPnNlY3Rvcl9zaXplOworCWlmICghKGMtPm10ZC0+ZmxhZ3MgJiBNVERfTk9fVklSVEJMT0NLUykpIHsKKwkJd2hpbGUgKChibG9ja3MgKiBzaXplb2YgKHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrKSkgPiAoMTI4ICogMTAyNCkpIHsKKwkJCWJsb2NrcyA+Pj0gMTsKKwkJCWMtPnNlY3Rvcl9zaXplIDw8PSAxOworCQl9CQorCX0KKworCS8qCisJICogU2l6ZSBhbGlnbm1lbnQgY2hlY2sKKwkgKi8KKwlpZiAoKGMtPnNlY3Rvcl9zaXplICogYmxvY2tzKSAhPSBjLT5mbGFzaF9zaXplKSB7CisJCWMtPmZsYXNoX3NpemUgPSBjLT5zZWN0b3Jfc2l6ZSAqIGJsb2NrczsJCQorCQlwcmludGsoS0VSTl9JTkZPICJqZmZzMjogRmxhc2ggc2l6ZSBub3QgYWxpZ25lZCB0byBlcmFzZXNpemUsIHJlZHVjaW5nIHRvICVkS2lCXG4iLAorCQkJYy0+Zmxhc2hfc2l6ZSAvIDEwMjQpOworCX0KKworCWlmIChjLT5zZWN0b3Jfc2l6ZSAhPSBjLT5tdGQtPmVyYXNlc2l6ZSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiamZmczI6IEVyYXNlIGJsb2NrIHNpemUgdG9vIHNtYWxsICglZEtpQikuIFVzaW5nIHZpcnR1YWwgYmxvY2tzIHNpemUgKCVkS2lCKSBpbnN0ZWFkXG4iLCAKKwkJCWMtPm10ZC0+ZXJhc2VzaXplIC8gMTAyNCwgYy0+c2VjdG9yX3NpemUgLyAxMDI0KTsKKworCWlmIChjLT5mbGFzaF9zaXplIDwgNSpjLT5zZWN0b3Jfc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIgImpmZnMyOiBUb28gZmV3IGVyYXNlIGJsb2NrcyAoJWQpXG4iLCBjLT5mbGFzaF9zaXplIC8gYy0+c2VjdG9yX3NpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljLT5jbGVhbm1hcmtlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpOworCS8qIEpvZXJuIC0tIHN0aWNrIGFsaWdubWVudCBmb3Igd2VpcmQgOC1ieXRlLXBhZ2UgZmxhc2ggaGVyZSAqLworCisJLyogTkFORCAob3Igb3RoZXIgYml6YXJyZSkgZmxhc2guLi4gZG8gc2V0dXAgYWNjb3JkaW5nbHkgKi8KKwlyZXQgPSBqZmZzMl9mbGFzaF9zZXR1cChjKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJYy0+aW5vY2FjaGVfbGlzdCA9IGttYWxsb2MoSU5PQ0FDSEVfSEFTSFNJWkUgKiBzaXplb2Yoc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWMtPmlub2NhY2hlX2xpc3QpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfd2J1ZjsKKwl9CisJbWVtc2V0KGMtPmlub2NhY2hlX2xpc3QsIDAsIElOT0NBQ0hFX0hBU0hTSVpFICogc2l6ZW9mKHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqKSk7CisKKwlpZiAoKHJldCA9IGpmZnMyX2RvX21vdW50X2ZzKGMpKSkKKwkJZ290byBvdXRfaW5vaGFzaDsKKworCXJldCA9IC1FSU5WQUw7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZG9fZmlsbF9zdXBlcigpOiBHZXR0aW5nIHJvb3QgaW5vZGVcbiIpKTsKKwlyb290X2kgPSBpZ2V0KHNiLCAxKTsKKwlpZiAoaXNfYmFkX2lub2RlKHJvb3RfaSkpIHsKKwkJRDEocHJpbnRrKEtFUk5fV0FSTklORyAiZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKSk7CisJCWdvdG8gb3V0X25vZGVzOworCX0KKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9kb19maWxsX3N1cGVyKCk6IGRfYWxsb2Nfcm9vdCgpXG4iKSk7CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2kpOworCWlmICghc2ItPnNfcm9vdCkKKwkJZ290byBvdXRfcm9vdF9pOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IDB4MjA0MDMKKwlzYi0+c19tYXhieXRlcyA9IDB4RkZGRkZGRkY7CisjZW5kaWYKKwlzYi0+c19ibG9ja3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBQQUdFX0NBQ0hFX1NISUZUOworCXNiLT5zX21hZ2ljID0gSkZGUzJfU1VQRVJfTUFHSUM7CisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQorCQlqZmZzMl9zdGFydF9nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKGMpOworCXJldHVybiAwOworCisgb3V0X3Jvb3RfaToKKwlpcHV0KHJvb3RfaSk7Cisgb3V0X25vZGVzOgorCWpmZnMyX2ZyZWVfaW5vX2NhY2hlcyhjKTsKKwlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZnMoYyk7CisJaWYgKGMtPm10ZC0+ZmxhZ3MgJiBNVERfTk9fVklSVEJMT0NLUykKKwkJdmZyZWUoYy0+YmxvY2tzKTsKKwllbHNlCisJCWtmcmVlKGMtPmJsb2Nrcyk7Cisgb3V0X2lub2hhc2g6CisJa2ZyZWUoYy0+aW5vY2FjaGVfbGlzdCk7Cisgb3V0X3didWY6CisJamZmczJfZmxhc2hfY2xlYW51cChjKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgamZmczJfZ2NfcmVsZWFzZV9pbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywKKwkJCQkgICBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZikKK3sKKwlpcHV0KE9GTklfRURPTklfMlNGRkooZikpOworfQorCitzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqamZmczJfZ2NfZmV0Y2hfaW5vZGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsCisJCQkJCQkgICAgIGludCBpbnVtLCBpbnQgbmxpbmspCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKmljOworCWlmICghbmxpbmspIHsKKwkJLyogVGhlIGlub2RlIGhhcyB6ZXJvIG5saW5rIGJ1dCBpdHMgbm9kZXMgd2VyZW4ndCB5ZXQgbWFya2VkCisJCSAgIG9ic29sZXRlLiBUaGlzIGhhcyB0byBiZSBiZWNhdXNlIHdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIAorCQkgICB0aGUgZmluYWwgKGNsb3NlKCkgYW5kKSBpcHV0KCkgdG8gaGFwcGVuLgorCisJCSAgIFRoZXJlJ3MgYSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBmaW5hbCBpcHV0KCkgY291bGQgaGF2ZSAKKwkJICAgaGFwcGVuZWQgd2hpbGUgd2Ugd2VyZSBjb250ZW1wbGF0aW5nLiBJbiBvcmRlciB0byBlbnN1cmUKKwkJICAgdGhhdCB3ZSBkb24ndCBjYXVzZSBhIG5ldyByZWFkX2lub2RlKCkgKHdoaWNoIHdvdWxkIGZhaWwpCisJCSAgIGZvciB0aGUgaW5vZGUgaW4gcXVlc3Rpb24sIHdlIHVzZSBpbG9va3VwKCkgaW4gdGhpcyBjYXNlCisJCSAgIGluc3RlYWQgb2YgaWdldCgpLgorCisJCSAgIFRoZSBubGluayBjYW4ndCBfYmVjb21lXyB6ZXJvIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSB3ZSdyZSAKKwkJICAgaG9sZGluZyB0aGUgYWxsb2Nfc2VtLCBhbmQgamZmczJfZG9fdW5saW5rKCkgd291bGQgYWxzbworCQkgICBuZWVkIHRoYXQgd2hpbGUgZGVjcmVtZW50aW5nIG5saW5rIG9uIGFueSBpbm9kZS4KKwkJKi8KKwkJaW5vZGUgPSBpbG9va3VwKE9GTklfQlNfMlNGRkooYyksIGludW0pOworCQlpZiAoIWlub2RlKSB7CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiaWxvb2t1cCgpIGZhaWxlZCBmb3IgaW5vICMldTsgaW5vZGUgaXMgcHJvYmFibHkgZGVsZXRlZC5cbiIsCisJCQkJICBpbnVtKSk7CisKKwkJCXNwaW5fbG9jaygmYy0+aW5vY2FjaGVfbG9jayk7CisJCQlpYyA9IGpmZnMyX2dldF9pbm9fY2FjaGUoYywgaW51bSk7CisJCQlpZiAoIWljKSB7CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIklub2RlIGNhY2hlIGZvciBpbm8gIyV1IGlzIGdvbmUuXG4iLCBpbnVtKSk7CisJCQkJc3Bpbl91bmxvY2soJmMtPmlub2NhY2hlX2xvY2spOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJaWYgKGljLT5zdGF0ZSAhPSBJTk9fU1RBVEVfQ0hFQ0tFREFCU0VOVCkgeworCQkJCS8qIFdhaXQgZm9yIHByb2dyZXNzLiBEb24ndCBqdXN0IGxvb3AgKi8KKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiV2FpdGluZyBmb3IgaW5vICMldSBpbiBzdGF0ZSAlZFxuIiwKKwkJCQkJICBpYy0+aW5vLCBpYy0+c3RhdGUpKTsKKwkJCQlzbGVlcF9vbl9zcGludW5sb2NrKCZjLT5pbm9jYWNoZV93cSwgJmMtPmlub2NhY2hlX2xvY2spOworCQkJfSBlbHNlIHsKKwkJCQlzcGluX3VubG9jaygmYy0+aW5vY2FjaGVfbG9jayk7CisJCQl9CisKKwkJCXJldHVybiBOVUxMOworCQl9CisJfSBlbHNlIHsKKwkJLyogSW5vZGUgaGFzIGxpbmtzIHRvIGl0IHN0aWxsOyB0aGV5J3JlIG5vdCBnb2luZyBhd2F5IGJlY2F1c2UKKwkJICAgamZmczJfZG9fdW5saW5rKCkgd291bGQgbmVlZCB0aGUgYWxsb2Nfc2VtIGFuZCB3ZSBoYXZlIGl0LgorCQkgICBKdXN0IGlnZXQoKSBpdCwgYW5kIGlmIHJlYWRfaW5vZGUoKSBpcyBuZWNlc3NhcnkgdGhhdCdzIE9LLgorCQkqLworCQlpbm9kZSA9IGlnZXQoT0ZOSV9CU18yU0ZGSihjKSwgaW51bSk7CisJCWlmICghaW5vZGUpCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJFZXAuIHJlYWRfaW5vZGUoKSBmYWlsZWQgZm9yIGlubyAjJXUuIG5saW5rICVkXG4iLAorCQkgICAgICAgaW51bSwgbmxpbmspOworCQkvKiBOQi4gVGhpcyB3aWxsIGhhcHBlbiBhZ2Fpbi4gV2UgbmVlZCB0byBkbyBzb21ldGhpbmcgYXBwcm9wcmlhdGUgaGVyZS4gKi8KKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOworCX0KKworCXJldHVybiBKRkZTMl9JTk9ERV9JTkZPKGlub2RlKTsKK30KKwordW5zaWduZWQgY2hhciAqamZmczJfZ2NfZmV0Y2hfcGFnZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgCisJCQkJICAgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgKnByaXYpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE9GTklfRURPTklfMlNGRkooZik7CisJc3RydWN0IHBhZ2UgKnBnOworCisJcGcgPSByZWFkX2NhY2hlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgb2Zmc2V0ID4+IFBBR0VfQ0FDSEVfU0hJRlQsIAorCQkJICAgICAodm9pZCAqKWpmZnMyX2RvX3JlYWRwYWdlX3VubG9jaywgaW5vZGUpOworCWlmIChJU19FUlIocGcpKQorCQlyZXR1cm4gKHZvaWQgKilwZzsKKwkKKwkqcHJpdiA9ICh1bnNpZ25lZCBsb25nKXBnOworCXJldHVybiBrbWFwKHBnKTsKK30KKwordm9pZCBqZmZzMl9nY19yZWxlYXNlX3BhZ2Uoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsCisJCQkgICB1bnNpZ25lZCBjaGFyICpwdHIsCisJCQkgICB1bnNpZ25lZCBsb25nICpwcml2KQoreworCXN0cnVjdCBwYWdlICpwZyA9ICh2b2lkICopKnByaXY7CisKKwlrdW5tYXAocGcpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwZyk7Cit9CisKK3N0YXRpYyBpbnQgamZmczJfZmxhc2hfc2V0dXAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpIHsKKwlpbnQgcmV0ID0gMDsKKwkKKwlpZiAoamZmczJfY2xlYW5tYXJrZXJfb29iKGMpKSB7CisJCS8qIE5BTkQgZmxhc2guLi4gZG8gc2V0dXAgYWNjb3JkaW5nbHkgKi8KKwkJcmV0ID0gamZmczJfbmFuZF9mbGFzaF9zZXR1cChjKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogYWRkIHNldHVwcyBmb3Igb3RoZXIgYml6YXJyZSBmbGFzaGVzIGhlcmUuLi4gKi8KKwlpZiAoamZmczJfbm9yX2VjYyhjKSkgeworCQlyZXQgPSBqZmZzMl9ub3JfZWNjX2ZsYXNoX3NldHVwKGMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBqZmZzMl9mbGFzaF9jbGVhbnVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKSB7CisKKwlpZiAoamZmczJfY2xlYW5tYXJrZXJfb29iKGMpKSB7CisJCWpmZnMyX25hbmRfZmxhc2hfY2xlYW51cChjKTsKKwl9CisKKwkvKiBhZGQgY2xlYW51cHMgZm9yIG90aGVyIGJpemFycmUgZmxhc2hlcyBoZXJlLi4uICovCisJaWYgKGpmZnMyX25vcl9lY2MoYykpIHsKKwkJamZmczJfbm9yX2VjY19mbGFzaF9jbGVhbnVwKGMpOworCX0KK30KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2djLmMgYi9mcy9qZmZzMi9nYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZWM3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9nYy5jCkBAIC0wLDAgKzEsMTI0NiBAQAorLyoKKyAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIENyZWF0ZWQgYnkgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICoKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCisgKgorICogJElkOiBnYy5jLHYgMS4xNDQgMjAwNC8xMi8yMSAxMToxODo1MCBkd213MiBFeHAgJAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlICJub2RlbGlzdC5oIgorI2luY2x1ZGUgImNvbXByLmgiCisKK3N0YXRpYyBpbnQgamZmczJfZ2FyYmFnZV9jb2xsZWN0X3ByaXN0aW5lKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCAKKwkJCQkJICBzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKmljLAorCQkJCQkgIHN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnJhdyk7CitzdGF0aWMgaW50IGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9tZXRhZGF0YShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwgCisJCQkJCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCBzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZmQpOworc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfZGlyZW50KHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLCAKKwkJCQkJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQpOworc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfZGVsZXRpb25fZGlyZW50KHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLCAKKwkJCQkJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQpOworc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfaG9sZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwKKwkJCQkgICAgICBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwgc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmZuLAorCQkJCSAgICAgIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBlbmQpOworc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfZG5vZGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIsCisJCQkJICAgICAgIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCBzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZm4sCisJCQkJICAgICAgIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBlbmQpOworc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfbGl2ZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIsCisJCQkgICAgICAgc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmF3LCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZik7CisKKy8qIENhbGxlZCB3aXRoIGVyYXNlX2NvbXBsZXRpb25fbG9jayBoZWxkICovCitzdGF0aWMgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmpmZnMyX2ZpbmRfZ2NfYmxvY2soc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpCit7CisJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKnJldDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0bGlzdCA9IE5VTEw7CisJaW50IG4gPSBqaWZmaWVzICUgMTI4OworCisJLyogUGljayBhbiBlcmFzZWJsb2NrIHRvIGdhcmJhZ2UgY29sbGVjdCBuZXh0LiBUaGlzIGlzIHdoZXJlIHdlJ2xsCisJICAgcHV0IHRoZSBjbGV2ZXIgd2Vhci1sZXZlbGxpbmcgYWxnb3JpdGhtcy4gRXZlbnR1YWxseS4gICovCisJLyogV2UgcG9zc2libHkgd2FudCB0byBmYXZvdXIgdGhlIGRpcnRpZXIgYmxvY2tzIG1vcmUgd2hlbiB0aGUKKwkgICBudW1iZXIgb2YgZnJlZSBibG9ja3MgaXMgbG93LiAqLworCWlmICghbGlzdF9lbXB0eSgmYy0+YmFkX3VzZWRfbGlzdCkgJiYgYy0+bnJfZnJlZV9ibG9ja3MgPiBjLT5yZXN2X2Jsb2Nrc19nY2JhZCkgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUGlja2luZyBibG9jayBmcm9tIGJhZF91c2VkX2xpc3QgdG8gR0MgbmV4dFxuIikpOworCQluZXh0bGlzdCA9ICZjLT5iYWRfdXNlZF9saXN0OworCX0gZWxzZSBpZiAobiA8IDUwICYmICFsaXN0X2VtcHR5KCZjLT5lcmFzYWJsZV9saXN0KSkgeworCQkvKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGVtIHdpbGwgaGF2ZSBnb25lIGRpcmVjdGx5IHRvIGJlIGVyYXNlZC4gCisJCSAgIFNvIGRvbid0IGZhdm91ciB0aGUgZXJhc2FibGVfbGlzdCBfdG9vXyBtdWNoLiAqLworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUGlja2luZyBibG9jayBmcm9tIGVyYXNhYmxlX2xpc3QgdG8gR0MgbmV4dFxuIikpOworCQluZXh0bGlzdCA9ICZjLT5lcmFzYWJsZV9saXN0OworCX0gZWxzZSBpZiAobiA8IDExMCAmJiAhbGlzdF9lbXB0eSgmYy0+dmVyeV9kaXJ0eV9saXN0KSkgeworCQkvKiBNb3N0IG9mIHRoZSB0aW1lLCBwaWNrIG9uZSBvZmYgdGhlIHZlcnlfZGlydHkgbGlzdCAqLworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUGlja2luZyBibG9jayBmcm9tIHZlcnlfZGlydHlfbGlzdCB0byBHQyBuZXh0XG4iKSk7CisJCW5leHRsaXN0ID0gJmMtPnZlcnlfZGlydHlfbGlzdDsKKwl9IGVsc2UgaWYgKG4gPCAxMjYgJiYgIWxpc3RfZW1wdHkoJmMtPmRpcnR5X2xpc3QpKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJQaWNraW5nIGJsb2NrIGZyb20gZGlydHlfbGlzdCB0byBHQyBuZXh0XG4iKSk7CisJCW5leHRsaXN0ID0gJmMtPmRpcnR5X2xpc3Q7CisJfSBlbHNlIGlmICghbGlzdF9lbXB0eSgmYy0+Y2xlYW5fbGlzdCkpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlBpY2tpbmcgYmxvY2sgZnJvbSBjbGVhbl9saXN0IHRvIEdDIG5leHRcbiIpKTsKKwkJbmV4dGxpc3QgPSAmYy0+Y2xlYW5fbGlzdDsKKwl9IGVsc2UgaWYgKCFsaXN0X2VtcHR5KCZjLT5kaXJ0eV9saXN0KSkgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUGlja2luZyBibG9jayBmcm9tIGRpcnR5X2xpc3QgdG8gR0MgbmV4dCAoY2xlYW5fbGlzdCB3YXMgZW1wdHkpXG4iKSk7CisKKwkJbmV4dGxpc3QgPSAmYy0+ZGlydHlfbGlzdDsKKwl9IGVsc2UgaWYgKCFsaXN0X2VtcHR5KCZjLT52ZXJ5X2RpcnR5X2xpc3QpKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJQaWNraW5nIGJsb2NrIGZyb20gdmVyeV9kaXJ0eV9saXN0IHRvIEdDIG5leHQgKGNsZWFuX2xpc3QgYW5kIGRpcnR5X2xpc3Qgd2VyZSBlbXB0eSlcbiIpKTsKKwkJbmV4dGxpc3QgPSAmYy0+dmVyeV9kaXJ0eV9saXN0OworCX0gZWxzZSBpZiAoIWxpc3RfZW1wdHkoJmMtPmVyYXNhYmxlX2xpc3QpKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJQaWNraW5nIGJsb2NrIGZyb20gZXJhc2FibGVfbGlzdCB0byBHQyBuZXh0IChjbGVhbl9saXN0IGFuZCB7dmVyeV8sfWRpcnR5X2xpc3Qgd2VyZSBlbXB0eSlcbiIpKTsKKworCQluZXh0bGlzdCA9ICZjLT5lcmFzYWJsZV9saXN0OworCX0gZWxzZSB7CisJCS8qIEVlcC4gQWxsIHdlcmUgZW1wdHkgKi8KKwkJRDEocHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMjogTm8gY2xlYW4sIGRpcnR5IF9vcl8gZXJhc2FibGUgYmxvY2tzIHRvIEdDIGZyb20hIFdoZXJlIGFyZSB0aGV5IGFsbD9cbiIpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0ID0gbGlzdF9lbnRyeShuZXh0bGlzdC0+bmV4dCwgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2ssIGxpc3QpOworCWxpc3RfZGVsKCZyZXQtPmxpc3QpOworCWMtPmdjYmxvY2sgPSByZXQ7CisJcmV0LT5nY19ub2RlID0gcmV0LT5maXJzdF9ub2RlOworCWlmICghcmV0LT5nY19ub2RlKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVlcC4gcmV0LT5nY19ub2RlIGZvciBibG9jayBhdCAweCUwOHggaXMgTlVMTFxuIiwgcmV0LT5vZmZzZXQpOworCQlCVUcoKTsKKwl9CisJCisJLyogSGF2ZSB3ZSBhY2NpZGVudGFsbHkgcGlja2VkIGEgY2xlYW4gYmxvY2sgd2l0aCB3YXN0ZWQgc3BhY2UgPyAqLworCWlmIChyZXQtPndhc3RlZF9zaXplKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJDb252ZXJ0aW5nIHdhc3RlZF9zaXplICUwOHggdG8gZGlydHlfc2l6ZVxuIiwgcmV0LT53YXN0ZWRfc2l6ZSkpOworCQlyZXQtPmRpcnR5X3NpemUgKz0gcmV0LT53YXN0ZWRfc2l6ZTsKKwkJYy0+d2FzdGVkX3NpemUgLT0gcmV0LT53YXN0ZWRfc2l6ZTsKKwkJYy0+ZGlydHlfc2l6ZSArPSByZXQtPndhc3RlZF9zaXplOworCQlyZXQtPndhc3RlZF9zaXplID0gMDsKKwl9CisKKwlEMihqZmZzMl9kdW1wX2Jsb2NrX2xpc3RzKGMpKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcworICogTWFrZSBhIHNpbmdsZSBhdHRlbXB0IHRvIHByb2dyZXNzIEdDLiBNb3ZlIG9uZSBub2RlLCBhbmQgcG9zc2libHkKKyAqIHN0YXJ0IGVyYXNpbmcgb25lIGVyYXNlYmxvY2suCisgKi8KK2ludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZjsKKwlzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKmljOworCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWI7CisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmF3OworCWludCByZXQgPSAwLCBpbnVtLCBubGluazsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmMtPmFsbG9jX3NlbSkpCisJCXJldHVybiAtRUlOVFI7CisKKwlmb3IgKDs7KSB7CisJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJaWYgKCFjLT51bmNoZWNrZWRfc2l6ZSkKKwkJCWJyZWFrOworCisJCS8qIFdlIGNhbid0IHN0YXJ0IGRvaW5nIEdDIHlldC4gV2UgaGF2ZW4ndCBmaW5pc2hlZCBjaGVja2luZworCQkgICB0aGUgbm9kZSBDUkNzIGV0Yy4gRG8gaXQgbm93LiAqLworCQkKKwkJLyogY2hlY2tlZF9pbm8gaXMgcHJvdGVjdGVkIGJ5IHRoZSBhbGxvY19zZW0gKi8KKwkJaWYgKGMtPmNoZWNrZWRfaW5vID4gYy0+aGlnaGVzdF9pbm8pIHsKKwkJCXByaW50ayhLRVJOX0NSSVQgIkNoZWNrZWQgYWxsIGlub2RlcyBidXQgc3RpbGwgMHgleCBieXRlcyBvZiB1bmNoZWNrZWQgc3BhY2U/XG4iLAorCQkJICAgICAgIGMtPnVuY2hlY2tlZF9zaXplKTsKKwkJCUQyKGpmZnMyX2R1bXBfYmxvY2tfbGlzdHMoYykpOworCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQlCVUcoKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJCXNwaW5fbG9jaygmYy0+aW5vY2FjaGVfbG9jayk7CisKKwkJaWMgPSBqZmZzMl9nZXRfaW5vX2NhY2hlKGMsIGMtPmNoZWNrZWRfaW5vKyspOworCisJCWlmICghaWMpIHsKKwkJCXNwaW5fdW5sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFpYy0+bmxpbmspIHsKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJTa2lwcGluZyBjaGVjayBvZiBpbm8gIyVkIHdpdGggbmxpbmsgemVyb1xuIiwKKwkJCQkgIGljLT5pbm8pKTsKKwkJCXNwaW5fdW5sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN3aXRjaChpYy0+c3RhdGUpIHsKKwkJY2FzZSBJTk9fU1RBVEVfQ0hFQ0tFREFCU0VOVDoKKwkJY2FzZSBJTk9fU1RBVEVfUFJFU0VOVDoKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJTa2lwcGluZyBpbm8gIyV1IGFscmVhZHkgY2hlY2tlZFxuIiwgaWMtPmlubykpOworCQkJc3Bpbl91bmxvY2soJmMtPmlub2NhY2hlX2xvY2spOworCQkJY29udGludWU7CisKKwkJY2FzZSBJTk9fU1RBVEVfR0M6CisJCWNhc2UgSU5PX1NUQVRFX0NIRUNLSU5HOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSW5vZGUgIyV1IGlzIGluIHN0YXRlICVkIGR1cmluZyBDUkMgY2hlY2sgcGhhc2UhXG4iLCBpYy0+aW5vLCBpYy0+c3RhdGUpOworCQkJc3Bpbl91bmxvY2soJmMtPmlub2NhY2hlX2xvY2spOworCQkJQlVHKCk7CisKKwkJY2FzZSBJTk9fU1RBVEVfUkVBRElORzoKKwkJCS8qIFdlIG5lZWQgdG8gd2FpdCBmb3IgaXQgdG8gZmluaXNoLCBsZXN0IHdlIG1vdmUgb24KKwkJCSAgIGFuZCB0cmlnZ2VyIHRoZSBCVUcoKSBhYm92ZSB3aGlsZSB3ZSBoYXZlbid0IHlldCAKKwkJCSAgIGZpbmlzaGVkIGNoZWNraW5nIGFsbCBpdHMgbm9kZXMgKi8KKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJXYWl0aW5nIGZvciBpbm8gIyV1IHRvIGZpbmlzaCByZWFkaW5nXG4iLCBpYy0+aW5vKSk7CisJCQl1cCgmYy0+YWxsb2Nfc2VtKTsKKwkJCXNsZWVwX29uX3NwaW51bmxvY2soJmMtPmlub2NhY2hlX3dxLCAmYy0+aW5vY2FjaGVfbG9jayk7CisJCQlyZXR1cm4gMDsKKworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisKKwkJY2FzZSBJTk9fU1RBVEVfVU5DSEVDS0VEOgorCQkJOworCQl9CisJCWljLT5zdGF0ZSA9IElOT19TVEFURV9DSEVDS0lORzsKKwkJc3Bpbl91bmxvY2soJmMtPmlub2NhY2hlX2xvY2spOworCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcygpIHRyaWdnZXJpbmcgaW5vZGUgc2NhbiBvZiBpbm8jJXVcbiIsIGljLT5pbm8pKTsKKworCQlyZXQgPSBqZmZzMl9kb19jcmNjaGVja19pbm9kZShjLCBpYyk7CisJCWlmIChyZXQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJSZXR1cm5lZCBlcnJvciBmb3IgY3JjY2hlY2sgb2YgaW5vICMldS4gRXhwZWN0IGJhZG5lc3MuLi5cbiIsIGljLT5pbm8pOworCisJCWpmZnMyX3NldF9pbm9jYWNoZV9zdGF0ZShjLCBpYywgSU5PX1NUQVRFX0NIRUNLRURBQlNFTlQpOworCQl1cCgmYy0+YWxsb2Nfc2VtKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBGaXJzdCwgd29yayBvdXQgd2hpY2ggYmxvY2sgd2UncmUgZ2FyYmFnZS1jb2xsZWN0aW5nICovCisJamViID0gYy0+Z2NibG9jazsKKworCWlmICghamViKQorCQlqZWIgPSBqZmZzMl9maW5kX2djX2Jsb2NrKGMpOworCisJaWYgKCFqZWIpIHsKKwkJRDEgKHByaW50ayhLRVJOX05PVElDRSAiamZmczI6IENvdWxkbid0IGZpbmQgZXJhc2UgYmxvY2sgdG8gZ2FyYmFnZSBjb2xsZWN0IVxuIikpOworCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJdXAoJmMtPmFsbG9jX3NlbSk7CisJCXJldHVybiAtRUlPOworCX0KKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJHQyBmcm9tIGJsb2NrICUwOHgsIHVzZWRfc2l6ZSAlMDh4LCBkaXJ0eV9zaXplICUwOHgsIGZyZWVfc2l6ZSAlMDh4XG4iLCBqZWItPm9mZnNldCwgamViLT51c2VkX3NpemUsIGplYi0+ZGlydHlfc2l6ZSwgamViLT5mcmVlX3NpemUpKTsKKwlEMShpZiAoYy0+bmV4dGJsb2NrKQorCSAgIHByaW50ayhLRVJOX0RFQlVHICJOZXh0YmxvY2sgYXQgICUwOHgsIHVzZWRfc2l6ZSAlMDh4LCBkaXJ0eV9zaXplICUwOHgsIHdhc3RlZF9zaXplICUwOHgsIGZyZWVfc2l6ZSAlMDh4XG4iLCBjLT5uZXh0YmxvY2stPm9mZnNldCwgYy0+bmV4dGJsb2NrLT51c2VkX3NpemUsIGMtPm5leHRibG9jay0+ZGlydHlfc2l6ZSwgYy0+bmV4dGJsb2NrLT53YXN0ZWRfc2l6ZSwgYy0+bmV4dGJsb2NrLT5mcmVlX3NpemUpKTsKKworCWlmICghamViLT51c2VkX3NpemUpIHsKKwkJdXAoJmMtPmFsbG9jX3NlbSk7CisJCWdvdG8gZXJhc2VpdDsKKwl9CisKKwlyYXcgPSBqZWItPmdjX25vZGU7CisJCQkKKwl3aGlsZShyZWZfb2Jzb2xldGUocmF3KSkgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiTm9kZSBhdCAweCUwOHggaXMgb2Jzb2xldGUuLi4gc2tpcHBpbmdcbiIsIHJlZl9vZmZzZXQocmF3KSkpOworCQlyYXcgPSByYXctPm5leHRfcGh5czsKKwkJaWYgKHVubGlrZWx5KCFyYXcpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJlZXAuIEVuZCBvZiByYXcgbGlzdCB3aGlsZSBzdGlsbCBzdXBwb3NlZGx5IG5vZGVzIHRvIEdDXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImVyYXNlIGJsb2NrIGF0IDB4JTA4eC4gZnJlZV9zaXplIDB4JTA4eCwgZGlydHlfc2l6ZSAweCUwOHgsIHVzZWRfc2l6ZSAweCUwOHhcbiIsIAorCQkJICAgICAgIGplYi0+b2Zmc2V0LCBqZWItPmZyZWVfc2l6ZSwgamViLT5kaXJ0eV9zaXplLCBqZWItPnVzZWRfc2l6ZSk7CisJCQlqZWItPmdjX25vZGUgPSByYXc7CisJCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJCXVwKCZjLT5hbGxvY19zZW0pOworCQkJQlVHKCk7CisJCX0KKwl9CisJamViLT5nY19ub2RlID0gcmF3OworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgIkdvaW5nIHRvIGdhcmJhZ2UgY29sbGVjdCBub2RlIGF0IDB4JTA4eFxuIiwgcmVmX29mZnNldChyYXcpKSk7CisKKwlpZiAoIXJhdy0+bmV4dF9pbl9pbm8pIHsKKwkJLyogSW5vZGUtbGVzcyBub2RlLiBDbGVhbiBtYXJrZXIsIHNuYXBzaG90IG9yIHNvbWV0aGluZyBsaWtlIHRoYXQgKi8KKwkJLyogRklYTUU6IElmIGl0J3Mgc29tZXRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgY29waWVkLCBpbmNsdWRpbmcgc29tZXRoaW5nCisJCSAgIHdlIGRvbid0IGdyb2sgdGhhdCBoYXMgSkZGUzJfTk9ERVRZUEVfUldDT01QQVRfQ09QWSwgd2Ugc2hvdWxkIGRvIHNvICovCisJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgcmF3KTsKKwkJdXAoJmMtPmFsbG9jX3NlbSk7CisJCWdvdG8gZXJhc2VpdF9sb2NrOworCX0KKworCWljID0gamZmczJfcmF3X3JlZl90b19pYyhyYXcpOworCisJLyogV2UgbmVlZCB0byBob2xkIHRoZSBpbm9jYWNoZS4gRWl0aGVyIHRoZSBlcmFzZV9jb21wbGV0aW9uX2xvY2sgb3IKKwkgICB0aGUgaW5vY2FjaGVfbG9jayBhcmUgc3VmZmljaWVudDsgd2UgdHJhZGUgZG93biBzaW5jZSB0aGUgaW5vY2FjaGVfbG9jayAKKwkgICBjYXVzZXMgbGVzcyBjb250ZW50aW9uLiAqLworCXNwaW5fbG9jaygmYy0+aW5vY2FjaGVfbG9jayk7CisKKwlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcyBjb2xsZWN0aW5nIGZyb20gYmxvY2sgQDB4JTA4eC4gTm9kZSBAMHglMDh4KCVkKSwgaW5vICMldVxuIiwgamViLT5vZmZzZXQsIHJlZl9vZmZzZXQocmF3KSwgcmVmX2ZsYWdzKHJhdyksIGljLT5pbm8pKTsKKworCS8qIFRocmVlIHBvc3NpYmlsaXRpZXM6CisJICAgMS4gSW5vZGUgaXMgYWxyZWFkeSBpbi1jb3JlLiBXZSBtdXN0IGlnZXQgaXQgYW5kIGRvIHByb3BlcgorCSAgICAgIHVwZGF0aW5nIHRvIGl0cyBmcmFndHJlZSwgZXRjLgorCSAgIDIuIElub2RlIGlzIG5vdCBpbi1jb3JlLCBub2RlIGlzIFJFRl9QUklTVElORS4gV2UgbG9jayB0aGUKKwkgICAgICBpbm9jYWNoZSB0byBwcmV2ZW50IGEgcmVhZF9pbm9kZSgpLCBjb3B5IHRoZSBub2RlIGludGFjdC4KKwkgICAzLiBJbm9kZSBpcyBub3QgaW4tY29yZSwgbm9kZSBpcyBub3QgcHJpc3RpbmUuIFdlIG11c3QgaWdldCgpCisJICAgICAgYW5kIHRha2UgdGhlIHNsb3cgcGF0aC4KKwkqLworCisJc3dpdGNoKGljLT5zdGF0ZSkgeworCWNhc2UgSU5PX1NUQVRFX0NIRUNLRURBQlNFTlQ6CisJCS8qIEl0J3MgYmVlbiBjaGVja2VkLCBidXQgaXQncyBub3QgY3VycmVudGx5IGluLWNvcmUuIAorCQkgICBXZSBjYW4ganVzdCBjb3B5IGFueSBwcmlzdGluZSBub2RlcywgYnV0IGhhdmUKKwkJICAgdG8gcHJldmVudCBhbnlvbmUgZWxzZSBmcm9tIGRvaW5nIHJlYWRfaW5vZGUoKSB3aGlsZQorCQkgICB3ZSdyZSBhdCBpdCwgc28gd2Ugc2V0IHRoZSBzdGF0ZSBhY2NvcmRpbmdseSAqLworCQlpZiAocmVmX2ZsYWdzKHJhdykgPT0gUkVGX1BSSVNUSU5FKQorCQkJaWMtPnN0YXRlID0gSU5PX1NUQVRFX0dDOworCQllbHNlIHsKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJJbm8gIyV1IGlzIGFic2VudCBidXQgbm9kZSBub3QgUkVGX1BSSVNUSU5FLiBSZWFkaW5nLlxuIiwgCisJCQkJICBpYy0+aW5vKSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElOT19TVEFURV9QUkVTRU5UOgorCQkvKiBJdCdzIGluLWNvcmUuIEdDIG11c3QgaWdldCgpIGl0LiAqLworCQlicmVhazsKKworCWNhc2UgSU5PX1NUQVRFX1VOQ0hFQ0tFRDoKKwljYXNlIElOT19TVEFURV9DSEVDS0lORzoKKwljYXNlIElOT19TVEFURV9HQzoKKwkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbi4gV2Ugc2hvdWxkIGhhdmUgZmluaXNoZWQgY2hlY2tpbmcKKwkJICAgYnkgdGhlIHRpbWUgd2UgYWN0dWFsbHkgc3RhcnQgZG9pbmcgYW55IEdDLCBhbmQgc2luY2UgCisJCSAgIHdlJ3JlIGhvbGRpbmcgdGhlIGFsbG9jX3NlbSwgbm8gb3RoZXIgZ2FyYmFnZSBjb2xsZWN0aW9uIAorCQkgICBjYW4gaGFwcGVuLgorCQkqLworCQlwcmludGsoS0VSTl9DUklUICJJbm9kZSAjJXUgYWxyZWFkeSBpbiBzdGF0ZSAlZCBpbiBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcygpIVxuIiwKKwkJICAgICAgIGljLT5pbm8sIGljLT5zdGF0ZSk7CisJCXVwKCZjLT5hbGxvY19zZW0pOworCQlzcGluX3VubG9jaygmYy0+aW5vY2FjaGVfbG9jayk7CisJCUJVRygpOworCisJY2FzZSBJTk9fU1RBVEVfUkVBRElORzoKKwkJLyogU29tZW9uZSdzIGN1cnJlbnRseSB0cnlpbmcgdG8gcmVhZCBpdC4gV2UgbXVzdCB3YWl0IGZvcgorCQkgICB0aGVtIHRvIGZpbmlzaCBhbmQgdGhlbiBnbyB0aHJvdWdoIHRoZSBmdWxsIGlnZXQoKSByb3V0ZQorCQkgICB0byBkbyB0aGUgR0MuIEhvd2V2ZXIsIHNvbWV0aW1lcyByZWFkX2lub2RlKCkgbmVlZHMgdG8gZ2V0CisJCSAgIHRoZSBhbGxvY19zZW0oKSAoZm9yIG1hcmtpbmcgbm9kZXMgaW52YWxpZCkgc28gd2UgbXVzdAorCQkgICBkcm9wIHRoZSBhbGxvY19zZW0gYmVmb3JlIHNsZWVwaW5nLiAqLworCisJCXVwKCZjLT5hbGxvY19zZW0pOworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZ2FyYmFnZV9jb2xsZWN0X3Bhc3MoKSB3YWl0aW5nIGZvciBpbm8gIyV1IGluIHN0YXRlICVkXG4iLAorCQkJICBpYy0+aW5vLCBpYy0+c3RhdGUpKTsKKwkJc2xlZXBfb25fc3BpbnVubG9jaygmYy0+aW5vY2FjaGVfd3EsICZjLT5pbm9jYWNoZV9sb2NrKTsKKwkJLyogQW5kIGJlY2F1c2Ugd2UgZHJvcHBlZCB0aGUgYWxsb2Nfc2VtIHdlIG11c3Qgc3RhcnQgYWdhaW4gZnJvbSB0aGUgCisJCSAgIGJlZ2lubmluZy4gUG9uZGVyIGNoYW5jZSBvZiBsaXZlbG9jayBoZXJlIC0tIHdlJ3JlIHJldHVybmluZyBzdWNjZXNzCisJCSAgIHdpdGhvdXQgYWN0dWFsbHkgbWFraW5nIGFueSBwcm9ncmVzcy4KKworCQkgICBROiBXaGF0IGFyZSB0aGUgY2hhbmNlcyB0aGF0IHRoZSBpbm9kZSBpcyBiYWNrIGluIElOT19TVEFURV9SRUFESU5HIAorCQkgICBhZ2FpbiBieSB0aGUgdGltZSB3ZSBuZXh0IGVudGVyIHRoaXMgZnVuY3Rpb24/IEFuZCB0aGF0IHRoaXMgaGFwcGVucworCQkgICBlbm91Z2ggdGltZXMgdG8gY2F1c2UgYSByZWFsIGRlbGF5PworCisJCSAgIEE6IFNtYWxsIGVub3VnaCB0aGF0IEkgZG9uJ3QgY2FyZSA6KSAKKwkJKi8KKwkJcmV0dXJuIDA7CisJfQorCisJLyogT0suIE5vdyBpZiB0aGUgaW5vZGUgaXMgaW4gc3RhdGUgSU5PX1NUQVRFX0dDLCB3ZSBhcmUgZ29pbmcgdG8gY29weSB0aGUKKwkgICBub2RlIGludGFjdCwgYW5kIHdlIGRvbid0IGhhdmUgdG8gbXVjayBhYm91dCB3aXRoIHRoZSBmcmFndHJlZSBldGMuIAorCSAgIGJlY2F1c2Ugd2Uga25vdyBpdCdzIG5vdCBpbi1jb3JlLiBJZiBpdCBfd2FzXyBpbi1jb3JlLCB3ZSBnbyB0aHJvdWdoCisJICAgYWxsIHRoZSBpZ2V0KCkgY3JhcCBhbnl3YXkgKi8KKworCWlmIChpYy0+c3RhdGUgPT0gSU5PX1NUQVRFX0dDKSB7CisJCXNwaW5fdW5sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKKworCQlyZXQgPSBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcHJpc3RpbmUoYywgaWMsIHJhdyk7CisKKwkJc3Bpbl9sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKKwkJaWMtPnN0YXRlID0gSU5PX1NUQVRFX0NIRUNLRURBQlNFTlQ7CisJCXdha2VfdXAoJmMtPmlub2NhY2hlX3dxKTsKKworCQlpZiAocmV0ICE9IC1FQkFERkQpIHsKKwkJCXNwaW5fdW5sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKKwkJCWdvdG8gcmVsZWFzZV9zZW07CisJCX0KKworCQkvKiBGYWxsIHRocm91Z2ggaWYgaXQgd2FudGVkIHVzIHRvLCB3aXRoIGlub2NhY2hlX2xvY2sgaGVsZCAqLworCX0KKworCS8qIFByZXZlbnQgdGhlIGZhaXJseSB1bmxpa2VseSByYWNlIHdoZXJlIHRoZSBnY2Jsb2NrIGlzCisJICAgZW50aXJlbHkgb2Jzb2xldGVkIGJ5IHRoZSBmaW5hbCBjbG9zZSBvZiBhIGZpbGUgd2hpY2ggaGFkCisJICAgdGhlIG9ubHkgdmFsaWQgbm9kZXMgaW4gdGhlIGJsb2NrLCBmb2xsb3dlZCBieSBlcmFzdXJlLAorCSAgIGZvbGxvd2VkIGJ5IGZyZWVpbmcgb2YgdGhlIGljIGJlY2F1c2UgdGhlIGVyYXNlZCBibG9jayhzKQorCSAgIGhlbGQgX2FsbF8gdGhlIG5vZGVzIG9mIHRoYXQgaW5vZGUuLi4uIG5ldmVyIGJlZW4gc2VlbiBidXQKKwkgICBpdCdzIHZhZ3VlbHkgcG9zc2libGUuICovCisKKwlpbnVtID0gaWMtPmlubzsKKwlubGluayA9IGljLT5ubGluazsKKwlzcGluX3VubG9jaygmYy0+aW5vY2FjaGVfbG9jayk7CisKKwlmID0gamZmczJfZ2NfZmV0Y2hfaW5vZGUoYywgaW51bSwgbmxpbmspOworCWlmIChJU19FUlIoZikpIHsKKwkJcmV0ID0gUFRSX0VSUihmKTsKKwkJZ290byByZWxlYXNlX3NlbTsKKwl9CisJaWYgKCFmKSB7CisJCXJldCA9IDA7CisJCWdvdG8gcmVsZWFzZV9zZW07CisJfQorCisJcmV0ID0gamZmczJfZ2FyYmFnZV9jb2xsZWN0X2xpdmUoYywgamViLCByYXcsIGYpOworCisJamZmczJfZ2NfcmVsZWFzZV9pbm9kZShjLCBmKTsKKworIHJlbGVhc2Vfc2VtOgorCXVwKCZjLT5hbGxvY19zZW0pOworCisgZXJhc2VpdF9sb2NrOgorCS8qIElmIHdlJ3ZlIGZpbmlzaGVkIHRoaXMgYmxvY2ssIHN0YXJ0IGl0IGVyYXNpbmcgKi8KKwlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisKKyBlcmFzZWl0OgorCWlmIChjLT5nY2Jsb2NrICYmICFjLT5nY2Jsb2NrLT51c2VkX3NpemUpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkJsb2NrIGF0IDB4JTA4eCBjb21wbGV0ZWx5IG9ic29sZXRlZCBieSBHQy4gTW92aW5nIHRvIGVyYXNlX3BlbmRpbmdfbGlzdFxuIiwgYy0+Z2NibG9jay0+b2Zmc2V0KSk7CisJCS8qIFdlJ3JlIEdDJ2luZyBhbiBlbXB0eSBibG9jaz8gKi8KKwkJbGlzdF9hZGRfdGFpbCgmYy0+Z2NibG9jay0+bGlzdCwgJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCk7CisJCWMtPmdjYmxvY2sgPSBOVUxMOworCQljLT5ucl9lcmFzaW5nX2Jsb2NrcysrOworCQlqZmZzMl9lcmFzZV9wZW5kaW5nX3RyaWdnZXIoYyk7CisJfQorCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfbGl2ZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIsCisJCQkJICAgICAgc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmF3LCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZikKK3sKKwlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpmcmFnOworCXN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpmbiA9IE5VTEw7CisJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZDsKKwl1aW50MzJfdCBzdGFydCA9IDAsIGVuZCA9IDAsIG5yZnJhZ3MgPSAwOworCWludCByZXQgPSAwOworCisJZG93bigmZi0+c2VtKTsKKworCS8qIE5vdyB3ZSBoYXZlIHRoZSBsb2NrIGZvciB0aGlzIGlub2RlLiBDaGVjayB0aGF0IGl0J3Mgc3RpbGwgdGhlIG9uZSBhdCB0aGUgaGVhZAorCSAgIG9mIHRoZSBsaXN0LiAqLworCisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJaWYgKGMtPmdjYmxvY2sgIT0gamViKSB7CisJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiR0MgYmxvY2sgaXMgbm8gbG9uZ2VyIGdjYmxvY2suIFJlc3RhcnRcbiIpKTsKKwkJZ290byB1cG5vdXQ7CisJfQorCWlmIChyZWZfb2Jzb2xldGUocmF3KSkgeworCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIm5vZGUgdG8gYmUgR0MnZCB3YXMgb2Jzb2xldGVkIGluIHRoZSBtZWFudGltZS5cbiIpKTsKKwkJLyogVGhleSdsbCBjYWxsIGFnYWluICovCisJCWdvdG8gdXBub3V0OworCX0KKwlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCS8qIE9LLiBMb29rcyBzYWZlLiBBbmQgbm9ib2R5IGNhbiBnZXQgdXMgbm93IGJlY2F1c2Ugd2UgaGF2ZSB0aGUgc2VtYXBob3JlLiBNb3ZlIHRoZSBibG9jayAqLworCWlmIChmLT5tZXRhZGF0YSAmJiBmLT5tZXRhZGF0YS0+cmF3ID09IHJhdykgeworCQlmbiA9IGYtPm1ldGFkYXRhOworCQlyZXQgPSBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfbWV0YWRhdGEoYywgamViLCBmLCBmbik7CisJCWdvdG8gdXBub3V0OworCX0KKworCS8qIEZJWE1FLiBSZWFkIG5vZGUgYW5kIGRvIGxvb2t1cD8gKi8KKwlmb3IgKGZyYWcgPSBmcmFnX2ZpcnN0KCZmLT5mcmFndHJlZSk7IGZyYWc7IGZyYWcgPSBmcmFnX25leHQoZnJhZykpIHsKKwkJaWYgKGZyYWctPm5vZGUgJiYgZnJhZy0+bm9kZS0+cmF3ID09IHJhdykgeworCQkJZm4gPSBmcmFnLT5ub2RlOworCQkJZW5kID0gZnJhZy0+b2ZzICsgZnJhZy0+c2l6ZTsKKwkJCWlmICghbnJmcmFncysrKQorCQkJCXN0YXJ0ID0gZnJhZy0+b2ZzOworCQkJaWYgKG5yZnJhZ3MgPT0gZnJhZy0+bm9kZS0+ZnJhZ3MpCisJCQkJYnJlYWs7IC8qIFdlJ3ZlIGZvdW5kIHRoZW0gYWxsICovCisJCX0KKwl9CisJaWYgKGZuKSB7CisJCWlmIChyZWZfZmxhZ3MocmF3KSA9PSBSRUZfUFJJU1RJTkUpIHsKKwkJCXJldCA9IGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9wcmlzdGluZShjLCBmLT5pbm9jYWNoZSwgcmF3KTsKKwkJCWlmICghcmV0KSB7CisJCQkJLyogVXJnaC4gUmV0dXJuIGl0IHNlbnNpYmx5LiAqLworCQkJCWZyYWctPm5vZGUtPnJhdyA9IGYtPmlub2NhY2hlLT5ub2RlczsKKwkJCX0JCisJCQlpZiAocmV0ICE9IC1FQkFERkQpCisJCQkJZ290byB1cG5vdXQ7CisJCX0KKwkJLyogV2UgZm91bmQgYSBkYXRhbm9kZS4gRG8gdGhlIEdDICovCisJCWlmKChzdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUKSA8ICgoZW5kLTEpID4+IFBBR0VfQ0FDSEVfU0hJRlQpKSB7CisJCQkvKiBJdCBjcm9zc2VzIGEgcGFnZSBib3VuZGFyeS4gVGhlcmVmb3JlLCBpdCBtdXN0IGJlIGEgaG9sZS4gKi8KKwkJCXJldCA9IGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9ob2xlKGMsIGplYiwgZiwgZm4sIHN0YXJ0LCBlbmQpOworCQl9IGVsc2UgeworCQkJLyogSXQgY291bGQgc3RpbGwgYmUgYSBob2xlLiBCdXQgd2UgR0MgdGhlIHBhZ2UgdGhpcyB3YXkgYW55d2F5ICovCisJCQlyZXQgPSBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfZG5vZGUoYywgamViLCBmLCBmbiwgc3RhcnQsIGVuZCk7CisJCX0KKwkJZ290byB1cG5vdXQ7CisJfQorCQorCS8qIFdhc24ndCBhIGRub2RlLiBUcnkgZGlyZW50ICovCisJZm9yIChmZCA9IGYtPmRlbnRzOyBmZDsgZmQ9ZmQtPm5leHQpIHsKKwkJaWYgKGZkLT5yYXcgPT0gcmF3KQorCQkJYnJlYWs7CisJfQorCisJaWYgKGZkICYmIGZkLT5pbm8pIHsKKwkJcmV0ID0gamZmczJfZ2FyYmFnZV9jb2xsZWN0X2RpcmVudChjLCBqZWIsIGYsIGZkKTsKKwl9IGVsc2UgaWYgKGZkKSB7CisJCXJldCA9IGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9kZWxldGlvbl9kaXJlbnQoYywgamViLCBmLCBmZCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmF3IG5vZGUgYXQgMHglMDh4IHdhc24ndCBpbiBub2RlIGxpc3RzIGZvciBpbm8gIyV1XG4iLAorCQkgICAgICAgcmVmX29mZnNldChyYXcpLCBmLT5pbm9jYWNoZS0+aW5vKTsKKwkJaWYgKHJlZl9vYnNvbGV0ZShyYXcpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJCdXQgaXQncyBvYnNvbGV0ZSBzbyB3ZSBkb24ndCBtaW5kIHRvbyBtdWNoXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FSU87CisJCX0KKwl9CisgdXBub3V0OgorCXVwKCZmLT5zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcHJpc3RpbmUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIAorCQkJCQkgIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqaWMsCisJCQkJCSAgc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmF3KQoreworCXVuaW9uIGpmZnMyX25vZGVfdW5pb24gKm5vZGU7CisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqbnJhdzsKKwlzaXplX3QgcmV0bGVuOworCWludCByZXQ7CisJdWludDMyX3QgcGh5c19vZnMsIGFsbG9jbGVuOworCXVpbnQzMl90IGNyYywgcmF3bGVuOworCWludCByZXRyaWVkID0gMDsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJHb2luZyB0byBHQyBSRUZfUFJJU1RJTkUgbm9kZSBhdCAweCUwOHhcbiIsIHJlZl9vZmZzZXQocmF3KSkpOworCisJcmF3bGVuID0gcmVmX3RvdGxlbihjLCBjLT5nY2Jsb2NrLCByYXcpOworCisJLyogQXNrIGZvciBhIHNtYWxsIGFtb3VudCBvZiBzcGFjZSAob3IgdGhlIHRvdGxlbiBpZiBzbWFsbGVyKSBiZWNhdXNlIHdlCisJICAgZG9uJ3Qgd2FudCB0byBmb3JjZSB3YXN0YWdlIG9mIHRoZSBlbmQgb2YgYSBibG9jayBpZiBzcGxpdHRpbmcgd291bGQKKwkgICB3b3JrLiAqLworCXJldCA9IGpmZnMyX3Jlc2VydmVfc3BhY2VfZ2MoYywgbWluX3QodWludDMyX3QsIHNpemVvZihzdHJ1Y3QgamZmczJfcmF3X2lub2RlKSArIEpGRlMyX01JTl9EQVRBX0xFTiwgCisJCQkJCSAgICAgIHJhd2xlbiksICZwaHlzX29mcywgJmFsbG9jbGVuKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGFsbG9jbGVuIDwgcmF3bGVuKSB7CisJCS8qIERvZXNuJ3QgZml0IHVudG91Y2hlZC4gV2UnbGwgZ28gdGhlIG9sZCByb3V0ZSBhbmQgc3BsaXQgaXQgKi8KKwkJcmV0dXJuIC1FQkFERkQ7CisJfQorCisJbm9kZSA9IGttYWxsb2MocmF3bGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5vZGUpCisgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGpmZnMyX2ZsYXNoX3JlYWQoYywgcmVmX29mZnNldChyYXcpLCByYXdsZW4sICZyZXRsZW4sIChjaGFyICopbm9kZSk7CisJaWYgKCFyZXQgJiYgcmV0bGVuICE9IHJhd2xlbikKKwkJcmV0ID0gLUVJTzsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9ub2RlOworCisJY3JjID0gY3JjMzIoMCwgbm9kZSwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpLTQpOworCWlmIChqZTMyX3RvX2NwdShub2RlLT51Lmhkcl9jcmMpICE9IGNyYykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJIZWFkZXIgQ1JDIGZhaWxlZCBvbiBSRUZfUFJJU1RJTkUgbm9kZSBhdCAweCUwOHg6IFJlYWQgMHglMDh4LCBjYWxjdWxhdGVkIDB4JTA4eFxuIiwKKwkJICAgICAgIHJlZl9vZmZzZXQocmF3KSwgamUzMl90b19jcHUobm9kZS0+dS5oZHJfY3JjKSwgY3JjKTsKKwkJZ290byBiYWlsOworCX0KKworCXN3aXRjaChqZTE2X3RvX2NwdShub2RlLT51Lm5vZGV0eXBlKSkgeworCWNhc2UgSkZGUzJfTk9ERVRZUEVfSU5PREU6CisJCWNyYyA9IGNyYzMyKDAsIG5vZGUsIHNpemVvZihub2RlLT5pKS04KTsKKwkJaWYgKGplMzJfdG9fY3B1KG5vZGUtPmkubm9kZV9jcmMpICE9IGNyYykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm9kZSBDUkMgZmFpbGVkIG9uIFJFRl9QUklTVElORSBkYXRhIG5vZGUgYXQgMHglMDh4OiBSZWFkIDB4JTA4eCwgY2FsY3VsYXRlZCAweCUwOHhcbiIsCisJCQkgICAgICAgcmVmX29mZnNldChyYXcpLCBqZTMyX3RvX2NwdShub2RlLT5pLm5vZGVfY3JjKSwgY3JjKTsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCisJCWlmIChqZTMyX3RvX2NwdShub2RlLT5pLmRzaXplKSkgeworCQkJY3JjID0gY3JjMzIoMCwgbm9kZS0+aS5kYXRhLCBqZTMyX3RvX2NwdShub2RlLT5pLmNzaXplKSk7CisJCQlpZiAoamUzMl90b19jcHUobm9kZS0+aS5kYXRhX2NyYykgIT0gY3JjKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGF0YSBDUkMgZmFpbGVkIG9uIFJFRl9QUklTVElORSBkYXRhIG5vZGUgYXQgMHglMDh4OiBSZWFkIDB4JTA4eCwgY2FsY3VsYXRlZCAweCUwOHhcbiIsCisJCQkJICAgICAgIHJlZl9vZmZzZXQocmF3KSwgamUzMl90b19jcHUobm9kZS0+aS5kYXRhX2NyYyksIGNyYyk7CisJCQkJZ290byBiYWlsOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBKRkZTMl9OT0RFVFlQRV9ESVJFTlQ6CisJCWNyYyA9IGNyYzMyKDAsIG5vZGUsIHNpemVvZihub2RlLT5kKS04KTsKKwkJaWYgKGplMzJfdG9fY3B1KG5vZGUtPmQubm9kZV9jcmMpICE9IGNyYykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm9kZSBDUkMgZmFpbGVkIG9uIFJFRl9QUklTVElORSBkaXJlbnQgbm9kZSBhdCAweCUwOHg6IFJlYWQgMHglMDh4LCBjYWxjdWxhdGVkIDB4JTA4eFxuIiwKKwkJCSAgICAgICByZWZfb2Zmc2V0KHJhdyksIGplMzJfdG9fY3B1KG5vZGUtPmQubm9kZV9jcmMpLCBjcmMpOworCQkJZ290byBiYWlsOworCQl9CisKKwkJaWYgKG5vZGUtPmQubnNpemUpIHsKKwkJCWNyYyA9IGNyYzMyKDAsIG5vZGUtPmQubmFtZSwgbm9kZS0+ZC5uc2l6ZSk7CisJCQlpZiAoamUzMl90b19jcHUobm9kZS0+ZC5uYW1lX2NyYykgIT0gY3JjKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTmFtZSBDUkMgZmFpbGVkIG9uIFJFRl9QUklTVElORSBkaXJlbnQgb2RlIGF0IDB4JTA4eDogUmVhZCAweCUwOHgsIGNhbGN1bGF0ZWQgMHglMDh4XG4iLAorCQkJCSAgICAgICByZWZfb2Zmc2V0KHJhdyksIGplMzJfdG9fY3B1KG5vZGUtPmQubmFtZV9jcmMpLCBjcmMpOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbmtub3duIG5vZGUgdHlwZSBmb3IgUkVGX1BSSVNUSU5FIG5vZGUgYXQgMHglMDh4OiAweCUwNHhcbiIsIAorCQkgICAgICAgcmVmX29mZnNldChyYXcpLCBqZTE2X3RvX2NwdShub2RlLT51Lm5vZGV0eXBlKSk7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlucmF3ID0gamZmczJfYWxsb2NfcmF3X25vZGVfcmVmKCk7CisJaWYgKCFucmF3KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vZGU7CisJfQorCisJLyogT0ssIGFsbCB0aGUgQ1JDcyBhcmUgZ29vZDsgdGhpcyBub2RlIGNhbiBqdXN0IGJlIGNvcGllZCBhcy1pcy4gKi8KKyByZXRyeToKKwlucmF3LT5mbGFzaF9vZmZzZXQgPSBwaHlzX29mczsKKwlucmF3LT5fX3RvdGxlbiA9IHJhd2xlbjsKKwlucmF3LT5uZXh0X3BoeXMgPSBOVUxMOworCisJcmV0ID0gamZmczJfZmxhc2hfd3JpdGUoYywgcGh5c19vZnMsIHJhd2xlbiwgJnJldGxlbiwgKGNoYXIgKilub2RlKTsKKworCWlmIChyZXQgfHwgKHJldGxlbiAhPSByYXdsZW4pKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiV3JpdGUgb2YgJWQgYnl0ZXMgYXQgMHglMDh4IGZhaWxlZC4gcmV0dXJuZWQgJWQsIHJldGxlbiAlemRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHJhd2xlbiwgcGh5c19vZnMsIHJldCwgcmV0bGVuKTsKKwkJaWYgKHJldGxlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9lc24ndCBiZWxvbmcgdG8gYW55IGlub2RlICovCisJCQlucmF3LT5uZXh0X2luX2lubyA9IE5VTEw7CisKKwkJCW5yYXctPmZsYXNoX29mZnNldCB8PSBSRUZfT0JTT0xFVEU7CisJCQlqZmZzMl9hZGRfcGh5c2ljYWxfbm9kZV9yZWYoYywgbnJhdyk7CisJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgbnJhdyk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5vdCBtYXJraW5nIHRoZSBzcGFjZSBhdCAweCUwOHggYXMgZGlydHkgYmVjYXVzZSB0aGUgZmxhc2ggZHJpdmVyIHJldHVybmVkIHJldGxlbiB6ZXJvXG4iLCBucmF3LT5mbGFzaF9vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgamZmczJfZnJlZV9yYXdfbm9kZV9yZWYobnJhdyk7CisJCX0KKwkJaWYgKCFyZXRyaWVkICYmIChucmF3ID0gamZmczJfYWxsb2NfcmF3X25vZGVfcmVmKCkpKSB7CisJCQkvKiBUcnkgdG8gcmVhbGxvY2F0ZSBzcGFjZSBhbmQgcmV0cnkgKi8KKwkJCXVpbnQzMl90IGR1bW15OworCQkJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiA9ICZjLT5ibG9ja3NbcGh5c19vZnMgLyBjLT5zZWN0b3Jfc2l6ZV07CisKKwkJCXJldHJpZWQgPSAxOworCisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUmV0cnlpbmcgZmFpbGVkIHdyaXRlIG9mIFJFRl9QUklTVElORSBub2RlLlxuIikpOworCQkJCisJCQlBQ0NUX1NBTklUWV9DSEVDSyhjLGplYik7CisJCQlEMShBQ0NUX1BBUkFOT0lBX0NIRUNLKGplYikpOworCisJCQlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlX2djKGMsIHJhd2xlbiwgJnBoeXNfb2ZzLCAmZHVtbXkpOworCisJCQlpZiAoIXJldCkgeworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJBbGxvY2F0ZWQgc3BhY2UgYXQgMHglMDh4IHRvIHJldHJ5IGZhaWxlZCB3cml0ZS5cbiIsIHBoeXNfb2ZzKSk7CisKKwkJCQlBQ0NUX1NBTklUWV9DSEVDSyhjLGplYik7CisJCQkJRDEoQUNDVF9QQVJBTk9JQV9DSEVDSyhqZWIpKTsKKworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIHRvIHJldHJ5IGZhaWxlZCB3cml0ZTogJWQhXG4iLCByZXQpKTsKKwkJCWpmZnMyX2ZyZWVfcmF3X25vZGVfcmVmKG5yYXcpOworCQl9CisKKwkJamZmczJfZnJlZV9yYXdfbm9kZV9yZWYobnJhdyk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXRfbm9kZTsKKwl9CisJbnJhdy0+Zmxhc2hfb2Zmc2V0IHw9IFJFRl9QUklTVElORTsKKwlqZmZzMl9hZGRfcGh5c2ljYWxfbm9kZV9yZWYoYywgbnJhdyk7CisKKwkvKiBMaW5rIGludG8gcGVyLWlub2RlIGxpc3QuIFRoaXMgaXMgc2FmZSBiZWNhdXNlIG9mIHRoZSBpYworCSAgIHN0YXRlIGJlaW5nIElOT19TVEFURV9HQy4gTm90ZSB0aGF0IGlmIHdlJ3JlIGRvaW5nIHRoaXMKKwkgICBmb3IgYW4gaW5vZGUgd2hpY2ggaXMgaW4tY29yZSwgdGhlICducmF3JyBwb2ludGVyIGlzIHRoZW4KKwkgICBnb2luZyB0byBiZSBmZXRjaGVkIGZyb20gaWMtPm5vZGVzIGJ5IG91ciBjYWxsZXIuICovCisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworICAgICAgICBucmF3LT5uZXh0X2luX2lubyA9IGljLT5ub2RlczsKKyAgICAgICAgaWMtPm5vZGVzID0gbnJhdzsKKwlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCByYXcpOworCUQxKHByaW50ayhLRVJOX0RFQlVHICJXSEVFRSEgR0MgUkVGX1BSSVNUSU5FIG5vZGUgYXQgMHglMDh4IHN1Y2NlZWRlZFxuIiwgcmVmX29mZnNldChyYXcpKSk7CisKKyBvdXRfbm9kZToKKwlrZnJlZShub2RlKTsKKwlyZXR1cm4gcmV0OworIGJhaWw6CisJcmV0ID0gLUVCQURGRDsKKwlnb3RvIG91dF9ub2RlOworfQorCitzdGF0aWMgaW50IGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9tZXRhZGF0YShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwgCisJCQkJCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCBzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZm4pCit7CisJc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKm5ld19mbjsKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlIHJpOworCWppbnQxNl90IGRldjsKKwljaGFyICptZGF0YSA9IE5VTEwsIG1kYXRhbGVuID0gMDsKKwl1aW50MzJfdCBhbGxvY2xlbiwgcGh5c19vZnM7CisJaW50IHJldDsKKworCWlmIChTX0lTQkxLKEpGRlMyX0ZfSV9NT0RFKGYpKSB8fAorCSAgICBTX0lTQ0hSKEpGRlMyX0ZfSV9NT0RFKGYpKSApIHsKKwkJLyogRm9yIHRoZXNlLCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIHJlYWQgdGhlIG9sZCBub2RlICovCisJCS8qIEZJWE1FOiBmb3IgbWlub3Igb3IgbWFqb3IgPiAyNTUuICovCisJCWRldiA9IGNwdV90b19qZTE2KCgoSkZGUzJfRl9JX1JERVZfTUFKKGYpIDw8IDgpIHwgCisJCQlKRkZTMl9GX0lfUkRFVl9NSU4oZikpKTsKKwkJbWRhdGEgPSAoY2hhciAqKSZkZXY7CisJCW1kYXRhbGVuID0gc2l6ZW9mKGRldik7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nYXJiYWdlX2NvbGxlY3RfbWV0YWRhdGEoKTogV3JpdGluZyAlZCBieXRlcyBvZiBrZGV2X3RcbiIsIG1kYXRhbGVuKSk7CisJfSBlbHNlIGlmIChTX0lTTE5LKEpGRlMyX0ZfSV9NT0RFKGYpKSkgeworCQltZGF0YWxlbiA9IGZuLT5zaXplOworCQltZGF0YSA9IGttYWxsb2MoZm4tPnNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIW1kYXRhKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJrbWFsbG9jIG9mIG1kYXRhIGZhaWxlZCBpbiBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfbWV0YWRhdGEoKVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlyZXQgPSBqZmZzMl9yZWFkX2Rub2RlKGMsIGYsIGZuLCBtZGF0YSwgMCwgbWRhdGFsZW4pOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJyZWFkIG9mIG9sZCBtZXRhZGF0YSBmYWlsZWQgaW4gamZmczJfZ2FyYmFnZV9jb2xsZWN0X21ldGFkYXRhKCk6ICVkXG4iLCByZXQpOworCQkJa2ZyZWUobWRhdGEpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZ2FyYmFnZV9jb2xsZWN0X21ldGFkYXRhKCk6IFdyaXRpbmcgJWQgYml0ZXMgb2Ygc3ltbGluayB0YXJnZXRcbiIsIG1kYXRhbGVuKSk7CisKKwl9CisJCisJcmV0ID0gamZmczJfcmVzZXJ2ZV9zcGFjZV9nYyhjLCBzaXplb2YocmkpICsgbWRhdGFsZW4sICZwaHlzX29mcywgJmFsbG9jbGVuKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX3Jlc2VydmVfc3BhY2VfZ2Mgb2YgJXpkIGJ5dGVzIGZvciBnYXJiYWdlX2NvbGxlY3RfbWV0YWRhdGEgZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIHNpemVvZihyaSkrIG1kYXRhbGVuLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisJCisJbWVtc2V0KCZyaSwgMCwgc2l6ZW9mKHJpKSk7CisJcmkubWFnaWMgPSBjcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKTsKKwlyaS5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0lOT0RFKTsKKwlyaS50b3RsZW4gPSBjcHVfdG9famUzMihzaXplb2YocmkpICsgbWRhdGFsZW4pOworCXJpLmhkcl9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCAmcmksIHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKS00KSk7CisKKwlyaS5pbm8gPSBjcHVfdG9famUzMihmLT5pbm9jYWNoZS0+aW5vKTsKKwlyaS52ZXJzaW9uID0gY3B1X3RvX2plMzIoKytmLT5oaWdoZXN0X3ZlcnNpb24pOworCXJpLm1vZGUgPSBjcHVfdG9famVtb2RlKEpGRlMyX0ZfSV9NT0RFKGYpKTsKKwlyaS51aWQgPSBjcHVfdG9famUxNihKRkZTMl9GX0lfVUlEKGYpKTsKKwlyaS5naWQgPSBjcHVfdG9famUxNihKRkZTMl9GX0lfR0lEKGYpKTsKKwlyaS5pc2l6ZSA9IGNwdV90b19qZTMyKEpGRlMyX0ZfSV9TSVpFKGYpKTsKKwlyaS5hdGltZSA9IGNwdV90b19qZTMyKEpGRlMyX0ZfSV9BVElNRShmKSk7CisJcmkuY3RpbWUgPSBjcHVfdG9famUzMihKRkZTMl9GX0lfQ1RJTUUoZikpOworCXJpLm10aW1lID0gY3B1X3RvX2plMzIoSkZGUzJfRl9JX01USU1FKGYpKTsKKwlyaS5vZmZzZXQgPSBjcHVfdG9famUzMigwKTsKKwlyaS5jc2l6ZSA9IGNwdV90b19qZTMyKG1kYXRhbGVuKTsKKwlyaS5kc2l6ZSA9IGNwdV90b19qZTMyKG1kYXRhbGVuKTsKKwlyaS5jb21wciA9IEpGRlMyX0NPTVBSX05PTkU7CisJcmkubm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCAmcmksIHNpemVvZihyaSktOCkpOworCXJpLmRhdGFfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgbWRhdGEsIG1kYXRhbGVuKSk7CisKKwluZXdfZm4gPSBqZmZzMl93cml0ZV9kbm9kZShjLCBmLCAmcmksIG1kYXRhLCBtZGF0YWxlbiwgcGh5c19vZnMsIEFMTE9DX0dDKTsKKworCWlmIChJU19FUlIobmV3X2ZuKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFcnJvciB3cml0aW5nIG5ldyBkbm9kZTogJWxkXG4iLCBQVFJfRVJSKG5ld19mbikpOworCQlyZXQgPSBQVFJfRVJSKG5ld19mbik7CisJCWdvdG8gb3V0OworCX0KKwlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgZm4tPnJhdyk7CisJamZmczJfZnJlZV9mdWxsX2Rub2RlKGZuKTsKKwlmLT5tZXRhZGF0YSA9IG5ld19mbjsKKyBvdXQ6CisJaWYgKFNfSVNMTksoSkZGUzJfRl9JX01PREUoZikpKQorCQlrZnJlZShtZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfZGlyZW50KHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLCAKKwkJCQkJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQpCit7CisJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpuZXdfZmQ7CisJc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgcmQ7CisJdWludDMyX3QgYWxsb2NsZW4sIHBoeXNfb2ZzOworCWludCByZXQ7CisKKwlyZC5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOworCXJkLm5vZGV0eXBlID0gY3B1X3RvX2plMTYoSkZGUzJfTk9ERVRZUEVfRElSRU5UKTsKKwlyZC5uc2l6ZSA9IHN0cmxlbihmZC0+bmFtZSk7CisJcmQudG90bGVuID0gY3B1X3RvX2plMzIoc2l6ZW9mKHJkKSArIHJkLm5zaXplKTsKKwlyZC5oZHJfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgJnJkLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSktNCkpOworCisJcmQucGlubyA9IGNwdV90b19qZTMyKGYtPmlub2NhY2hlLT5pbm8pOworCXJkLnZlcnNpb24gPSBjcHVfdG9famUzMigrK2YtPmhpZ2hlc3RfdmVyc2lvbik7CisJcmQuaW5vID0gY3B1X3RvX2plMzIoZmQtPmlubyk7CisJcmQubWN0aW1lID0gY3B1X3RvX2plMzIobWF4KEpGRlMyX0ZfSV9NVElNRShmKSwgSkZGUzJfRl9JX0NUSU1FKGYpKSk7CisJcmQudHlwZSA9IGZkLT50eXBlOworCXJkLm5vZGVfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgJnJkLCBzaXplb2YocmQpLTgpKTsKKwlyZC5uYW1lX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIGZkLT5uYW1lLCByZC5uc2l6ZSkpOworCQorCXJldCA9IGpmZnMyX3Jlc2VydmVfc3BhY2VfZ2MoYywgc2l6ZW9mKHJkKStyZC5uc2l6ZSwgJnBoeXNfb2ZzLCAmYWxsb2NsZW4pOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfcmVzZXJ2ZV9zcGFjZV9nYyBvZiAlemQgYnl0ZXMgZm9yIGdhcmJhZ2VfY29sbGVjdF9kaXJlbnQgZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIHNpemVvZihyZCkrcmQubnNpemUsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCW5ld19mZCA9IGpmZnMyX3dyaXRlX2RpcmVudChjLCBmLCAmcmQsIGZkLT5uYW1lLCByZC5uc2l6ZSwgcGh5c19vZnMsIEFMTE9DX0dDKTsKKworCWlmIChJU19FUlIobmV3X2ZkKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl93cml0ZV9kaXJlbnQgaW4gZ2FyYmFnZV9jb2xsZWN0X2RpcmVudCBmYWlsZWQ6ICVsZFxuIiwgUFRSX0VSUihuZXdfZmQpKTsKKwkJcmV0dXJuIFBUUl9FUlIobmV3X2ZkKTsKKwl9CisJamZmczJfYWRkX2ZkX3RvX2xpc3QoYywgbmV3X2ZkLCAmZi0+ZGVudHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9kZWxldGlvbl9kaXJlbnQoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIsIAorCQkJCQlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwgc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZCkKK3sKKwlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKipmZHAgPSAmZi0+ZGVudHM7CisJaW50IGZvdW5kID0gMDsKKworCS8qIE9uIGEgbWVkaXVtIHdoZXJlIHdlIGNhbid0IGFjdHVhbGx5IG1hcmsgbm9kZXMgb2Jzb2xldGUKKwkgICBwZXJuYW1lbnRseSwgc3VjaCBhcyBOQU5EIGZsYXNoLCB3ZSBuZWVkIHRvIHdvcmsgb3V0CisJICAgd2hldGhlciB0aGlzIGRlbGV0aW9uIGRpcmVudCBpcyBzdGlsbCBuZWVkZWQgdG8gYWN0aXZlbHkKKwkgICBkZWxldGUgYSAncmVhbCcgZGlyZW50IHdpdGggdGhlIHNhbWUgbmFtZSB0aGF0J3Mgc3RpbGwKKwkgICBzb21ld2hlcmUgZWxzZSBvbiB0aGUgZmxhc2guICovCisJaWYgKCFqZmZzMl9jYW5fbWFya19vYnNvbGV0ZShjKSkgeworCQlzdHJ1Y3QgamZmczJfcmF3X2RpcmVudCAqcmQ7CisJCXN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnJhdzsKKwkJaW50IHJldDsKKwkJc2l6ZV90IHJldGxlbjsKKwkJaW50IG5hbWVfbGVuID0gc3RybGVuKGZkLT5uYW1lKTsKKwkJdWludDMyX3QgbmFtZV9jcmMgPSBjcmMzMigwLCBmZC0+bmFtZSwgbmFtZV9sZW4pOworCQl1aW50MzJfdCByYXdsZW4gPSByZWZfdG90bGVuKGMsIGplYiwgZmQtPnJhdyk7CisKKwkJcmQgPSBrbWFsbG9jKHJhd2xlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghcmQpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQkvKiBQcmV2ZW50IHRoZSBlcmFzZSBjb2RlIGZyb20gbmlja2luZyB0aGUgb2Jzb2xldGUgbm9kZSByZWZzIHdoaWxlCisJCSAgIHdlJ3JlIGxvb2tpbmcgYXQgdGhlbS4gSSByZWFsbHkgZG9uJ3QgbGlrZSB0aGlzIGV4dHJhIGxvY2sgYnV0CisJCSAgIGNhbid0IHNlZSBhbnkgYWx0ZXJuYXRpdmUuIFN1Z2dlc3Rpb25zIG9uIGEgcG9zdGNhcmQgdG8uLi4gKi8KKwkJZG93bigmYy0+ZXJhc2VfZnJlZV9zZW0pOworCisJCWZvciAocmF3ID0gZi0+aW5vY2FjaGUtPm5vZGVzOyByYXcgIT0gKHZvaWQgKilmLT5pbm9jYWNoZTsgcmF3ID0gcmF3LT5uZXh0X2luX2lubykgeworCisJCQkvKiBXZSBvbmx5IGNhcmUgYWJvdXQgb2Jzb2xldGUgb25lcyAqLworCQkJaWYgKCEocmVmX29ic29sZXRlKHJhdykpKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBBbnkgZGlyZW50IHdpdGggdGhlIHNhbWUgbmFtZSBpcyBnb2luZyB0byBoYXZlIHRoZSBzYW1lIGxlbmd0aC4uLiAqLworCQkJaWYgKHJlZl90b3RsZW4oYywgTlVMTCwgcmF3KSAhPSByYXdsZW4pCisJCQkJY29udGludWU7CisKKwkJCS8qIERvZXNuJ3QgbWF0dGVyIGlmIHRoZXJlJ3Mgb25lIGluIHRoZSBzYW1lIGVyYXNlIGJsb2NrLiBXZSdyZSBnb2luZyB0byAKKwkJCSAgIGRlbGV0ZSBpdCB0b28gYXQgdGhlIHNhbWUgdGltZS4gKi8KKwkJCWlmICgocmF3LT5mbGFzaF9vZmZzZXQgJiB+KGMtPnNlY3Rvcl9zaXplLTEpKSA9PQorCQkJICAgIChmZC0+cmF3LT5mbGFzaF9vZmZzZXQgJiB+KGMtPnNlY3Rvcl9zaXplLTEpKSkKKwkJCQljb250aW51ZTsKKworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkNoZWNrIHBvdGVudGlhbCBkZWxldGlvbiBkaXJlbnQgYXQgJTA4eFxuIiwgcmVmX29mZnNldChyYXcpKSk7CisKKwkJCS8qIFRoaXMgaXMgYW4gb2Jzb2xldGUgbm9kZSBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgZGlyZWN0b3J5LCBhbmQgaXQncyBvZiB0aGUgcmlnaHQKKwkJCSAgIGxlbmd0aC4gV2UgbmVlZCB0byB0YWtlIGEgY2xvc2VyIGxvb2suLi4qLworCQkJcmV0ID0gamZmczJfZmxhc2hfcmVhZChjLCByZWZfb2Zmc2V0KHJhdyksIHJhd2xlbiwgJnJldGxlbiwgKGNoYXIgKilyZCk7CisJCQlpZiAocmV0KSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfZ19jX2RlbGV0aW9uX2RpcmVudCgpOiBSZWFkIGVycm9yICglZCkgcmVhZGluZyBvYnNvbGV0ZSBub2RlIGF0ICUwOHhcbiIsIHJldCwgcmVmX29mZnNldChyYXcpKTsKKwkJCQkvKiBJZiB3ZSBjYW4ndCByZWFkIGl0LCB3ZSBkb24ndCBuZWVkIHRvIGNvbnRpbnVlIHRvIG9ic29sZXRlIGl0LiBDb250aW51ZSAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHJldGxlbiAhPSByYXdsZW4pIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl9nX2NfZGVsZXRpb25fZGlyZW50KCk6IFNob3J0IHJlYWQgKCV6ZCBub3QgJXUpIHJlYWRpbmcgaGVhZGVyIGZyb20gb2Jzb2xldGUgbm9kZSBhdCAlMDh4XG4iLAorCQkJCSAgICAgICByZXRsZW4sIHJhd2xlbiwgcmVmX29mZnNldChyYXcpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGplMTZfdG9fY3B1KHJkLT5ub2RldHlwZSkgIT0gSkZGUzJfTk9ERVRZUEVfRElSRU5UKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBJZiB0aGUgbmFtZSBDUkMgZG9lc24ndCBtYXRjaCwgc2tpcCAqLworCQkJaWYgKGplMzJfdG9fY3B1KHJkLT5uYW1lX2NyYykgIT0gbmFtZV9jcmMpCisJCQkJY29udGludWU7CisKKwkJCS8qIElmIHRoZSBuYW1lIGxlbmd0aCBkb2Vzbid0IG1hdGNoLCBvciBpdCdzIGFub3RoZXIgZGVsZXRpb24gZGlyZW50LCBza2lwICovCisJCQlpZiAocmQtPm5zaXplICE9IG5hbWVfbGVuIHx8ICFqZTMyX3RvX2NwdShyZC0+aW5vKSkKKwkJCQljb250aW51ZTsKKworCQkJLyogT0ssIGNoZWNrIHRoZSBhY3R1YWwgbmFtZSBub3cgKi8KKwkJCWlmIChtZW1jbXAocmQtPm5hbWUsIGZkLT5uYW1lLCBuYW1lX2xlbikpCisJCQkJY29udGludWU7CisKKwkJCS8qIE9LLiBUaGUgbmFtZSByZWFsbHkgZG9lcyBtYXRjaC4gVGhlcmUgcmVhbGx5IGlzIHN0aWxsIGFuIG9sZGVyIG5vZGUgb24KKwkJCSAgIHRoZSBmbGFzaCB3aGljaCBvdXIgZGVsZXRpb24gZGlyZW50IG9ic29sZXRlcy4gU28gd2UgaGF2ZSB0byB3cml0ZSBvdXQKKwkJCSAgIGEgbmV3IGRlbGV0aW9uIGRpcmVudCB0byByZXBsYWNlIGl0ICovCisJCQl1cCgmYy0+ZXJhc2VfZnJlZV9zZW0pOworCisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRGVsZXRpb24gZGlyZW50IGF0ICUwOHggc3RpbGwgb2Jzb2xldGVzIHJlYWwgZGlyZW50IFwiJXNcIiBhdCAlMDh4IGZvciBpbm8gIyV1XG4iLAorCQkJCSAgcmVmX29mZnNldChmZC0+cmF3KSwgZmQtPm5hbWUsIHJlZl9vZmZzZXQocmF3KSwgamUzMl90b19jcHUocmQtPmlubykpKTsKKwkJCWtmcmVlKHJkKTsKKworCQkJcmV0dXJuIGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9kaXJlbnQoYywgamViLCBmLCBmZCk7CisJCX0KKworCQl1cCgmYy0+ZXJhc2VfZnJlZV9zZW0pOworCQlrZnJlZShyZCk7CisJfQorCisJLyogTm8gbmVlZCBmb3IgaXQgYW55IG1vcmUuIEp1c3QgbWFyayBpdCBvYnNvbGV0ZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3QgKi8KKwl3aGlsZSAoKmZkcCkgeworCQlpZiAoKCpmZHApID09IGZkKSB7CisJCQlmb3VuZCA9IDE7CisJCQkqZmRwID0gZmQtPm5leHQ7CisJCQlicmVhazsKKwkJfQorCQlmZHAgPSAmKCpmZHApLT5uZXh0OworCX0KKwlpZiAoIWZvdW5kKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRlbGV0aW9uIGRpcmVudCBcIiVzXCIgbm90IGZvdW5kIGluIGxpc3QgZm9yIGlubyAjJXVcbiIsIGZkLT5uYW1lLCBmLT5pbm9jYWNoZS0+aW5vKTsKKwl9CisJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGZkLT5yYXcpOworCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoZmQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9ob2xlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLAorCQkJCSAgICAgIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCBzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZm4sCisJCQkJICAgICAgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGVuZCkKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlIHJpOworCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKmZyYWc7CisJc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKm5ld19mbjsKKwl1aW50MzJfdCBhbGxvY2xlbiwgcGh5c19vZnM7CisJaW50IHJldDsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJXcml0aW5nIHJlcGxhY2VtZW50IGhvbGUgbm9kZSBmb3IgaW5vICMldSBmcm9tIG9mZnNldCAweCV4IHRvIDB4JXhcbiIsCisJCSAgZi0+aW5vY2FjaGUtPmlubywgc3RhcnQsIGVuZCkpOworCQorCW1lbXNldCgmcmksIDAsIHNpemVvZihyaSkpOworCisJaWYoZm4tPmZyYWdzID4gMSkgeworCQlzaXplX3QgcmVhZGxlbjsKKwkJdWludDMyX3QgY3JjOworCQkvKiBJdCdzIHBhcnRpYWxseSBvYnNvbGV0ZWQgYnkgYSBsYXRlciB3cml0ZS4gU28gd2UgaGF2ZSB0byAKKwkJICAgd3JpdGUgaXQgb3V0IGFnYWluIHdpdGggdGhlIF9zYW1lXyB2ZXJzaW9uIGFzIGJlZm9yZSAqLworCQlyZXQgPSBqZmZzMl9mbGFzaF9yZWFkKGMsIHJlZl9vZmZzZXQoZm4tPnJhdyksIHNpemVvZihyaSksICZyZWFkbGVuLCAoY2hhciAqKSZyaSk7CisJCWlmIChyZWFkbGVuICE9IHNpemVvZihyaSkgfHwgcmV0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJOb2RlIHJlYWQgZmFpbGVkIGluIGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9ob2xlLiBSZXQgJWQsIHJldGxlbiAlemQuIERhdGEgd2lsbCBiZSBsb3N0IGJ5IHdyaXRpbmcgbmV3IGhvbGUgbm9kZVxuIiwgcmV0LCByZWFkbGVuKTsKKwkJCWdvdG8gZmlsbDsKKwkJfQorCQlpZiAoamUxNl90b19jcHUocmkubm9kZXR5cGUpICE9IEpGRlMyX05PREVUWVBFX0lOT0RFKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl9nYXJiYWdlX2NvbGxlY3RfaG9sZTogTm9kZSBhdCAweCUwOHggaGFkIG5vZGUgdHlwZSAweCUwNHggaW5zdGVhZCBvZiBKRkZTMl9OT0RFVFlQRV9JTk9ERSgweCUwNHgpXG4iLAorCQkJICAgICAgIHJlZl9vZmZzZXQoZm4tPnJhdyksCisJCQkgICAgICAgamUxNl90b19jcHUocmkubm9kZXR5cGUpLCBKRkZTMl9OT0RFVFlQRV9JTk9ERSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpZiAoamUzMl90b19jcHUocmkudG90bGVuKSAhPSBzaXplb2YocmkpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl9nYXJiYWdlX2NvbGxlY3RfaG9sZTogTm9kZSBhdCAweCUwOHggaGFkIHRvdGxlbiAweCV4IGluc3RlYWQgb2YgZXhwZWN0ZWQgMHglenhcbiIsCisJCQkgICAgICAgcmVmX29mZnNldChmbi0+cmF3KSwKKwkJCSAgICAgICBqZTMyX3RvX2NwdShyaS50b3RsZW4pLCBzaXplb2YocmkpKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWNyYyA9IGNyYzMyKDAsICZyaSwgc2l6ZW9mKHJpKS04KTsKKwkJaWYgKGNyYyAhPSBqZTMyX3RvX2NwdShyaS5ub2RlX2NyYykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX2dhcmJhZ2VfY29sbGVjdF9ob2xlOiBOb2RlIGF0IDB4JTA4eCBoYWQgQ1JDIDB4JTA4eCB3aGljaCBkb2Vzbid0IG1hdGNoIGNhbGN1bGF0ZWQgQ1JDIDB4JTA4eFxuIiwKKwkJCSAgICAgICByZWZfb2Zmc2V0KGZuLT5yYXcpLCAKKwkJCSAgICAgICBqZTMyX3RvX2NwdShyaS5ub2RlX2NyYyksIGNyYyk7CisJCQkvKiBGSVhNRTogV2UgY291bGQgcG9zc2libHkgZGVhbCB3aXRoIHRoaXMgYnkgd3JpdGluZyBuZXcgaG9sZXMgZm9yIGVhY2ggZnJhZyAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGF0YSBpbiB0aGUgcmFuZ2UgMHglMDh4IHRvIDB4JTA4eCBvZiBpbm9kZSAjJXUgd2lsbCBiZSBsb3N0XG4iLCAKKwkJCSAgICAgICBzdGFydCwgZW5kLCBmLT5pbm9jYWNoZS0+aW5vKTsKKwkJCWdvdG8gZmlsbDsKKwkJfQorCQlpZiAocmkuY29tcHIgIT0gSkZGUzJfQ09NUFJfWkVSTykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfZ2FyYmFnZV9jb2xsZWN0X2hvbGU6IE5vZGUgMHglMDh4IHdhc24ndCBhIGhvbGUgbm9kZSFcbiIsIHJlZl9vZmZzZXQoZm4tPnJhdykpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGF0YSBpbiB0aGUgcmFuZ2UgMHglMDh4IHRvIDB4JTA4eCBvZiBpbm9kZSAjJXUgd2lsbCBiZSBsb3N0XG4iLCAKKwkJCSAgICAgICBzdGFydCwgZW5kLCBmLT5pbm9jYWNoZS0+aW5vKTsKKwkJCWdvdG8gZmlsbDsKKwkJfQorCX0gZWxzZSB7CisJZmlsbDoKKwkJcmkubWFnaWMgPSBjcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKTsKKwkJcmkubm9kZXR5cGUgPSBjcHVfdG9famUxNihKRkZTMl9OT0RFVFlQRV9JTk9ERSk7CisJCXJpLnRvdGxlbiA9IGNwdV90b19qZTMyKHNpemVvZihyaSkpOworCQlyaS5oZHJfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgJnJpLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSktNCkpOworCisJCXJpLmlubyA9IGNwdV90b19qZTMyKGYtPmlub2NhY2hlLT5pbm8pOworCQlyaS52ZXJzaW9uID0gY3B1X3RvX2plMzIoKytmLT5oaWdoZXN0X3ZlcnNpb24pOworCQlyaS5vZmZzZXQgPSBjcHVfdG9famUzMihzdGFydCk7CisJCXJpLmRzaXplID0gY3B1X3RvX2plMzIoZW5kIC0gc3RhcnQpOworCQlyaS5jc2l6ZSA9IGNwdV90b19qZTMyKDApOworCQlyaS5jb21wciA9IEpGRlMyX0NPTVBSX1pFUk87CisJfQorCXJpLm1vZGUgPSBjcHVfdG9famVtb2RlKEpGRlMyX0ZfSV9NT0RFKGYpKTsKKwlyaS51aWQgPSBjcHVfdG9famUxNihKRkZTMl9GX0lfVUlEKGYpKTsKKwlyaS5naWQgPSBjcHVfdG9famUxNihKRkZTMl9GX0lfR0lEKGYpKTsKKwlyaS5pc2l6ZSA9IGNwdV90b19qZTMyKEpGRlMyX0ZfSV9TSVpFKGYpKTsKKwlyaS5hdGltZSA9IGNwdV90b19qZTMyKEpGRlMyX0ZfSV9BVElNRShmKSk7CisJcmkuY3RpbWUgPSBjcHVfdG9famUzMihKRkZTMl9GX0lfQ1RJTUUoZikpOworCXJpLm10aW1lID0gY3B1X3RvX2plMzIoSkZGUzJfRl9JX01USU1FKGYpKTsKKwlyaS5kYXRhX2NyYyA9IGNwdV90b19qZTMyKDApOworCXJpLm5vZGVfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgJnJpLCBzaXplb2YocmkpLTgpKTsKKworCXJldCA9IGpmZnMyX3Jlc2VydmVfc3BhY2VfZ2MoYywgc2l6ZW9mKHJpKSwgJnBoeXNfb2ZzLCAmYWxsb2NsZW4pOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfcmVzZXJ2ZV9zcGFjZV9nYyBvZiAlemQgYnl0ZXMgZm9yIGdhcmJhZ2VfY29sbGVjdF9ob2xlIGZhaWxlZDogJWRcbiIsCisJCSAgICAgICBzaXplb2YocmkpLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwluZXdfZm4gPSBqZmZzMl93cml0ZV9kbm9kZShjLCBmLCAmcmksIE5VTEwsIDAsIHBoeXNfb2ZzLCBBTExPQ19HQyk7CisKKwlpZiAoSVNfRVJSKG5ld19mbikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXJyb3Igd3JpdGluZyBuZXcgaG9sZSBub2RlOiAlbGRcbiIsIFBUUl9FUlIobmV3X2ZuKSk7CisJCXJldHVybiBQVFJfRVJSKG5ld19mbik7CisJfQorCWlmIChqZTMyX3RvX2NwdShyaS52ZXJzaW9uKSA9PSBmLT5oaWdoZXN0X3ZlcnNpb24pIHsKKwkJamZmczJfYWRkX2Z1bGxfZG5vZGVfdG9faW5vZGUoYywgZiwgbmV3X2ZuKTsKKwkJaWYgKGYtPm1ldGFkYXRhKSB7CisJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgZi0+bWV0YWRhdGEtPnJhdyk7CisJCQlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUoZi0+bWV0YWRhdGEpOworCQkJZi0+bWV0YWRhdGEgPSBOVUxMOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qIAorCSAqIFdlIHNob3VsZCBvbmx5IGdldCBoZXJlIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBub2RlIHdlIGFyZQorCSAqIHJlcGxhY2luZyBoYWQgbW9yZSB0aGFuIG9uZSBmcmFnLCBzbyB3ZSBrZXB0IHRoZSBzYW1lIHZlcnNpb24KKwkgKiBudW1iZXIgYXMgYmVmb3JlLiAoRXhjZXB0IGluIGNhc2Ugb2YgZXJyb3IgLS0gc2VlICdnb3RvIGZpbGw7JyAKKwkgKiBhYm92ZS4pCisJICovCisJRDEoaWYodW5saWtlbHkoZm4tPmZyYWdzIDw9IDEpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX2dhcmJhZ2VfY29sbGVjdF9ob2xlOiBSZXBsYWNpbmcgZm4gd2l0aCAlZCBmcmFnKHMpIGJ1dCBuZXcgdmVyICVkICE9IGhpZ2hlc3RfdmVyc2lvbiAlZCBvZiBpbm8gIyVkXG4iLAorCQkgICAgICAgZm4tPmZyYWdzLCBqZTMyX3RvX2NwdShyaS52ZXJzaW9uKSwgZi0+aGlnaGVzdF92ZXJzaW9uLAorCQkgICAgICAgamUzMl90b19jcHUocmkuaW5vKSk7CisJfSk7CisKKwkvKiBUaGlzIGlzIGEgcGFydGlhbGx5LW92ZXJsYXBwZWQgaG9sZSBub2RlLiBNYXJrIGl0IFJFRl9OT1JNQUwgbm90IFJFRl9QUklTVElORSAqLworCW1hcmtfcmVmX25vcm1hbChuZXdfZm4tPnJhdyk7CisKKwlmb3IgKGZyYWcgPSBqZmZzMl9sb29rdXBfbm9kZV9mcmFnKCZmLT5mcmFndHJlZSwgZm4tPm9mcyk7IAorCSAgICAgZnJhZzsgZnJhZyA9IGZyYWdfbmV4dChmcmFnKSkgeworCQlpZiAoZnJhZy0+b2ZzID4gZm4tPnNpemUgKyBmbi0+b2ZzKQorCQkJYnJlYWs7CisJCWlmIChmcmFnLT5ub2RlID09IGZuKSB7CisJCQlmcmFnLT5ub2RlID0gbmV3X2ZuOworCQkJbmV3X2ZuLT5mcmFncysrOworCQkJZm4tPmZyYWdzLS07CisJCX0KKwl9CisJaWYgKGZuLT5mcmFncykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl9nYXJiYWdlX2NvbGxlY3RfaG9sZTogT2xkIG5vZGUgc3RpbGwgaGFzIGZyYWdzIVxuIik7CisJCUJVRygpOworCX0KKwlpZiAoIW5ld19mbi0+ZnJhZ3MpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfZ2FyYmFnZV9jb2xsZWN0X2hvbGU6IE5ldyBub2RlIGhhcyBubyBmcmFncyFcbiIpOworCQlCVUcoKTsKKwl9CisJCQorCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCBmbi0+cmF3KTsKKwlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUoZm4pOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9kbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwKKwkJCQkgICAgICAgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpmbiwKKwkJCQkgICAgICAgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGVuZCkKK3sKKwlzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqbmV3X2ZuOworCXN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgcmk7CisJdWludDMyX3QgYWxsb2NsZW4sIHBoeXNfb2ZzLCBvZmZzZXQsIG9yaWdfZW5kLCBvcmlnX3N0YXJ0OwkKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBjaGFyICpjb21wcmJ1ZiA9IE5VTEwsICp3cml0ZWJ1ZjsKKwl1bnNpZ25lZCBsb25nIHBnOworCXVuc2lnbmVkIGNoYXIgKnBnX3B0cjsKKyAKKwltZW1zZXQoJnJpLCAwLCBzaXplb2YocmkpKTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJXcml0aW5nIHJlcGxhY2VtZW50IGRub2RlIGZvciBpbm8gIyV1IGZyb20gb2Zmc2V0IDB4JXggdG8gMHgleFxuIiwKKwkJICBmLT5pbm9jYWNoZS0+aW5vLCBzdGFydCwgZW5kKSk7CisKKwlvcmlnX2VuZCA9IGVuZDsKKwlvcmlnX3N0YXJ0ID0gc3RhcnQ7CisKKwlpZiAoYy0+bnJfZnJlZV9ibG9ja3MgKyBjLT5ucl9lcmFzaW5nX2Jsb2NrcyA+IGMtPnJlc3ZfYmxvY2tzX2djbWVyZ2UpIHsKKwkJLyogQXR0ZW1wdCB0byBkbyBzb21lIG1lcmdpbmcuIEJ1dCBvbmx5IGV4cGFuZCB0byBjb3ZlciBsb2dpY2FsbHkKKwkJICAgYWRqYWNlbnQgZnJhZ3MgaWYgdGhlIGJsb2NrIGNvbnRhaW5pbmcgdGhlbSBpcyBhbHJlYWR5IGNvbnNpZGVyZWQKKwkJICAgdG8gYmUgZGlydHkuIE90aGVyd2lzZSB3ZSBlbmQgdXAgd2l0aCBHQyBqdXN0IGdvaW5nIHJvdW5kIGluIAorCQkgICBjaXJjbGVzIGRpcnR5aW5nIHRoZSBub2RlcyBpdCBhbHJlYWR5IHdyb3RlIG91dCwgZXNwZWNpYWxseSAKKwkJICAgb24gTkFORCB3aGVyZSB3ZSBoYXZlIHNtYWxsIGVyYXNlYmxvY2tzIGFuZCBoZW5jZSBhIG11Y2ggaGlnaGVyCisJCSAgIGNoYW5jZSBvZiBub2RlcyBoYXZpbmcgdG8gYmUgc3BsaXQgdG8gY3Jvc3MgYm91bmRhcmllcy4gKi8KKworCQlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpmcmFnOworCQl1aW50MzJfdCBtaW4sIG1heDsKKworCQltaW4gPSBzdGFydCAmIH4oUEFHRV9DQUNIRV9TSVpFLTEpOworCQltYXggPSBtaW4gKyBQQUdFX0NBQ0hFX1NJWkU7CisKKwkJZnJhZyA9IGpmZnMyX2xvb2t1cF9ub2RlX2ZyYWcoJmYtPmZyYWd0cmVlLCBzdGFydCk7CisKKwkJLyogQlVHX09OKCFmcmFnKSBidXQgdGhhdCdsbCBoYXBwZW4gYW55d2F5Li4uICovCisKKwkJQlVHX09OKGZyYWctPm9mcyAhPSBzdGFydCk7CisKKwkJLyogRmlyc3QgZ3JvdyBkb3duLi4uICovCisJCXdoaWxlKChmcmFnID0gZnJhZ19wcmV2KGZyYWcpKSAmJiBmcmFnLT5vZnMgPj0gbWluKSB7CisKKwkJCS8qIElmIHRoZSBwcmV2aW91cyBmcmFnIGRvZXNuJ3QgZXZlbiByZWFjaCB0aGUgYmVnaW5uaW5nLCB0aGVyZSdzCisJCQkgICBleGNlc3NpdmUgZnJhZ21lbnRhdGlvbi4gSnVzdCBtZXJnZS4gKi8KKwkJCWlmIChmcmFnLT5vZnMgPiBtaW4pIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRXhwYW5kaW5nIGRvd24gdG8gY292ZXIgcGFydGlhbCBmcmFnICgweCV4LTB4JXgpXG4iLAorCQkJCQkgIGZyYWctPm9mcywgZnJhZy0+b2ZzK2ZyYWctPnNpemUpKTsKKwkJCQlzdGFydCA9IGZyYWctPm9mczsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIE9LLiBUaGlzIGZyYWcgaG9sZHMgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHBhZ2UuICovCisJCQlpZiAoIWZyYWctPm5vZGUgfHwgIWZyYWctPm5vZGUtPnJhdykgeworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJGaXJzdCBmcmFnIGluIHBhZ2UgaXMgaG9sZSAoMHgleC0weCV4KS4gTm90IGV4cGFuZGluZyBkb3duLlxuIiwKKwkJCQkJICBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplKSk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCisJCQkJLyogT0ssIGl0J3MgYSBmcmFnIHdoaWNoIGV4dGVuZHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFnZS4gRG9lcyBpdCBsaXZlIAorCQkJCSAgIGluIGEgYmxvY2sgd2hpY2ggaXMgc3RpbGwgY29uc2lkZXJlZCBjbGVhbj8gSWYgc28sIGRvbid0IG9ic29sZXRlIGl0LgorCQkJCSAgIElmIG5vdCwgY292ZXIgaXQgYW55d2F5LiAqLworCisJCQkJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmF3ID0gZnJhZy0+bm9kZS0+cmF3OworCQkJCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWI7CisKKwkJCQlqZWIgPSAmYy0+YmxvY2tzW3Jhdy0+Zmxhc2hfb2Zmc2V0IC8gYy0+c2VjdG9yX3NpemVdOworCisJCQkJaWYgKGplYiA9PSBjLT5nY2Jsb2NrKSB7CisJCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFeHBhbmRpbmcgZG93biB0byBjb3ZlciBmcmFnICgweCV4LTB4JXgpIGluIGdjYmxvY2sgYXQgJTA4eFxuIiwKKwkJCQkJCSAgZnJhZy0+b2ZzLCBmcmFnLT5vZnMrZnJhZy0+c2l6ZSwgcmVmX29mZnNldChyYXcpKSk7CisJCQkJCXN0YXJ0ID0gZnJhZy0+b2ZzOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKCFJU0RJUlRZKGplYi0+ZGlydHlfc2l6ZSArIGplYi0+d2FzdGVkX3NpemUpKSB7CisJCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJOb3QgZXhwYW5kaW5nIGRvd24gdG8gY292ZXIgZnJhZyAoMHgleC0weCV4KSBpbiBjbGVhbiBibG9jayAlMDh4XG4iLAorCQkJCQkJICBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplLCBqZWItPm9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRXhwYW5kaW5nIGRvd24gdG8gY292ZXIgZnJhZyAoMHgleC0weCV4KSBpbiBkaXJ0eSBibG9jayAlMDh4XG4iLAorCQkJCQkJICBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplLCBqZWItPm9mZnNldCkpOworCQkJCXN0YXJ0ID0gZnJhZy0+b2ZzOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogLi4uIHRoZW4gdXAgKi8KKworCQkvKiBGaW5kIGxhc3QgZnJhZyB3aGljaCBpcyBhY3R1YWxseSBwYXJ0IG9mIHRoZSBub2RlIHdlJ3JlIHRvIEdDLiAqLworCQlmcmFnID0gamZmczJfbG9va3VwX25vZGVfZnJhZygmZi0+ZnJhZ3RyZWUsIGVuZC0xKTsKKworCQl3aGlsZSgoZnJhZyA9IGZyYWdfbmV4dChmcmFnKSkgJiYgZnJhZy0+b2ZzK2ZyYWctPnNpemUgPD0gbWF4KSB7CisKKwkJCS8qIElmIHRoZSBwcmV2aW91cyBmcmFnIGRvZXNuJ3QgZXZlbiByZWFjaCB0aGUgYmVnaW5uaW5nLCB0aGVyZSdzIGxvdHMKKwkJCSAgIG9mIGZyYWdtZW50YXRpb24uIEp1c3QgbWVyZ2UuICovCisJCQlpZiAoZnJhZy0+b2ZzK2ZyYWctPnNpemUgPCBtYXgpIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRXhwYW5kaW5nIHVwIHRvIGNvdmVyIHBhcnRpYWwgZnJhZyAoMHgleC0weCV4KVxuIiwKKwkJCQkJICBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplKSk7CisJCQkJZW5kID0gZnJhZy0+b2ZzICsgZnJhZy0+c2l6ZTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKCFmcmFnLT5ub2RlIHx8ICFmcmFnLT5ub2RlLT5yYXcpIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiTGFzdCBmcmFnIGluIHBhZ2UgaXMgaG9sZSAoMHgleC0weCV4KS4gTm90IGV4cGFuZGluZyB1cC5cbiIsCisJCQkJCSAgZnJhZy0+b2ZzLCBmcmFnLT5vZnMrZnJhZy0+c2l6ZSkpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKworCQkJCS8qIE9LLCBpdCdzIGEgZnJhZyB3aGljaCBleHRlbmRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhZ2UuIERvZXMgaXQgbGl2ZSAKKwkJCQkgICBpbiBhIGJsb2NrIHdoaWNoIGlzIHN0aWxsIGNvbnNpZGVyZWQgY2xlYW4/IElmIHNvLCBkb24ndCBvYnNvbGV0ZSBpdC4KKwkJCQkgICBJZiBub3QsIGNvdmVyIGl0IGFueXdheS4gKi8KKworCQkJCXN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnJhdyA9IGZyYWctPm5vZGUtPnJhdzsKKwkJCQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViOworCisJCQkJamViID0gJmMtPmJsb2Nrc1tyYXctPmZsYXNoX29mZnNldCAvIGMtPnNlY3Rvcl9zaXplXTsKKworCQkJCWlmIChqZWIgPT0gYy0+Z2NibG9jaykgeworCQkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRXhwYW5kaW5nIHVwIHRvIGNvdmVyIGZyYWcgKDB4JXgtMHgleCkgaW4gZ2NibG9jayBhdCAlMDh4XG4iLAorCQkJCQkJICBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplLCByZWZfb2Zmc2V0KHJhdykpKTsKKwkJCQkJZW5kID0gZnJhZy0+b2ZzICsgZnJhZy0+c2l6ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICghSVNESVJUWShqZWItPmRpcnR5X3NpemUgKyBqZWItPndhc3RlZF9zaXplKSkgeworCQkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiTm90IGV4cGFuZGluZyB1cCB0byBjb3ZlciBmcmFnICgweCV4LTB4JXgpIGluIGNsZWFuIGJsb2NrICUwOHhcbiIsCisJCQkJCQkgIGZyYWctPm9mcywgZnJhZy0+b2ZzK2ZyYWctPnNpemUsIGplYi0+b2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFeHBhbmRpbmcgdXAgdG8gY292ZXIgZnJhZyAoMHgleC0weCV4KSBpbiBkaXJ0eSBibG9jayAlMDh4XG4iLAorCQkJCQkJICBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplLCBqZWItPm9mZnNldCkpOworCQkJCWVuZCA9IGZyYWctPm9mcyArIGZyYWctPnNpemU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkV4cGFuZGVkIGRub2RlIHRvIHdyaXRlIGZyb20gKDB4JXgtMHgleCkgdG8gKDB4JXgtMHgleClcbiIsIAorCQkJICBvcmlnX3N0YXJ0LCBvcmlnX2VuZCwgc3RhcnQsIGVuZCkpOworCisJCUJVR19PTihlbmQgPiBKRkZTMl9GX0lfU0laRShmKSk7CisJCUJVR19PTihlbmQgPCBvcmlnX2VuZCk7CisJCUJVR19PTihzdGFydCA+IG9yaWdfc3RhcnQpOworCX0KKwkKKwkvKiBGaXJzdCwgdXNlIHJlYWRwYWdlKCkgdG8gcmVhZCB0aGUgYXBwcm9wcmlhdGUgcGFnZSBpbnRvIHRoZSBwYWdlIGNhY2hlICovCisJLyogUTogV2hhdCBoYXBwZW5zIGlmIHdlIGFjdHVhbGx5IHRyeSB0byBHQyB0aGUgX3NhbWVfIHBhZ2UgZm9yIHdoaWNoIGNvbW1pdF93cml0ZSgpCisJICogICAgdHJpZ2dlcmVkIGdhcmJhZ2UgY29sbGVjdGlvbiBpbiB0aGUgZmlyc3QgcGxhY2U/CisJICogQTogSSBfdGhpbmtfIGl0J3MgT0suIHJlYWRfY2FjaGVfcGFnZSBzaG91bGRuJ3QgZGVhZGxvY2ssIHdlJ2xsIHdyaXRlIG91dCB0aGUKKwkgKiAgICBwYWdlIE9LLiBXZSdsbCBhY3R1YWxseSB3cml0ZSBpdCBvdXQgYWdhaW4gaW4gY29tbWl0X3dyaXRlLCB3aGljaCBpcyBhIGxpdHRsZQorCSAqICAgIHN1Ym9wdGltYWwsIGJ1dCBhdCBsZWFzdCB3ZSdyZSBjb3JyZWN0LgorCSAqLworCXBnX3B0ciA9IGpmZnMyX2djX2ZldGNoX3BhZ2UoYywgZiwgc3RhcnQsICZwZyk7CisKKwlpZiAoSVNfRVJSKHBnX3B0cikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicmVhZF9jYWNoZV9wYWdlKCkgcmV0dXJuZWQgZXJyb3I6ICVsZFxuIiwgUFRSX0VSUihwZ19wdHIpKTsKKwkJcmV0dXJuIFBUUl9FUlIocGdfcHRyKTsKKwl9CisKKwlvZmZzZXQgPSBzdGFydDsKKwl3aGlsZShvZmZzZXQgPCBvcmlnX2VuZCkgeworCQl1aW50MzJfdCBkYXRhbGVuOworCQl1aW50MzJfdCBjZGF0YWxlbjsKKwkJdWludDE2X3QgY29tcHJ0eXBlID0gSkZGUzJfQ09NUFJfTk9ORTsKKworCQlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlX2djKGMsIHNpemVvZihyaSkgKyBKRkZTMl9NSU5fREFUQV9MRU4sICZwaHlzX29mcywgJmFsbG9jbGVuKTsKKworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl9yZXNlcnZlX3NwYWNlX2djIG9mICV6ZCBieXRlcyBmb3IgZ2FyYmFnZV9jb2xsZWN0X2Rub2RlIGZhaWxlZDogJWRcbiIsCisJCQkgICAgICAgc2l6ZW9mKHJpKSsgSkZGUzJfTUlOX0RBVEFfTEVOLCByZXQpOworCQkJYnJlYWs7CisJCX0KKwkJY2RhdGFsZW4gPSBtaW5fdCh1aW50MzJfdCwgYWxsb2NsZW4gLSBzaXplb2YocmkpLCBlbmQgLSBvZmZzZXQpOworCQlkYXRhbGVuID0gZW5kIC0gb2Zmc2V0OworCisJCXdyaXRlYnVmID0gcGdfcHRyICsgKG9mZnNldCAmIChQQUdFX0NBQ0hFX1NJWkUgLTEpKTsKKworCQljb21wcnR5cGUgPSBqZmZzMl9jb21wcmVzcyhjLCBmLCB3cml0ZWJ1ZiwgJmNvbXByYnVmLCAmZGF0YWxlbiwgJmNkYXRhbGVuKTsKKworCQlyaS5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOworCQlyaS5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0lOT0RFKTsKKwkJcmkudG90bGVuID0gY3B1X3RvX2plMzIoc2l6ZW9mKHJpKSArIGNkYXRhbGVuKTsKKwkJcmkuaGRyX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsICZyaSwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpLTQpKTsKKworCQlyaS5pbm8gPSBjcHVfdG9famUzMihmLT5pbm9jYWNoZS0+aW5vKTsKKwkJcmkudmVyc2lvbiA9IGNwdV90b19qZTMyKCsrZi0+aGlnaGVzdF92ZXJzaW9uKTsKKwkJcmkubW9kZSA9IGNwdV90b19qZW1vZGUoSkZGUzJfRl9JX01PREUoZikpOworCQlyaS51aWQgPSBjcHVfdG9famUxNihKRkZTMl9GX0lfVUlEKGYpKTsKKwkJcmkuZ2lkID0gY3B1X3RvX2plMTYoSkZGUzJfRl9JX0dJRChmKSk7CisJCXJpLmlzaXplID0gY3B1X3RvX2plMzIoSkZGUzJfRl9JX1NJWkUoZikpOworCQlyaS5hdGltZSA9IGNwdV90b19qZTMyKEpGRlMyX0ZfSV9BVElNRShmKSk7CisJCXJpLmN0aW1lID0gY3B1X3RvX2plMzIoSkZGUzJfRl9JX0NUSU1FKGYpKTsKKwkJcmkubXRpbWUgPSBjcHVfdG9famUzMihKRkZTMl9GX0lfTVRJTUUoZikpOworCQlyaS5vZmZzZXQgPSBjcHVfdG9famUzMihvZmZzZXQpOworCQlyaS5jc2l6ZSA9IGNwdV90b19qZTMyKGNkYXRhbGVuKTsKKwkJcmkuZHNpemUgPSBjcHVfdG9famUzMihkYXRhbGVuKTsKKwkJcmkuY29tcHIgPSBjb21wcnR5cGUgJiAweGZmOworCQlyaS51c2VyY29tcHIgPSAoY29tcHJ0eXBlID4+IDgpICYgMHhmZjsKKwkJcmkubm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCAmcmksIHNpemVvZihyaSktOCkpOworCQlyaS5kYXRhX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIGNvbXByYnVmLCBjZGF0YWxlbikpOworCQorCQluZXdfZm4gPSBqZmZzMl93cml0ZV9kbm9kZShjLCBmLCAmcmksIGNvbXByYnVmLCBjZGF0YWxlbiwgcGh5c19vZnMsIEFMTE9DX0dDKTsKKworCQlqZmZzMl9mcmVlX2NvbXByYnVmKGNvbXByYnVmLCB3cml0ZWJ1Zik7CisKKwkJaWYgKElTX0VSUihuZXdfZm4pKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFcnJvciB3cml0aW5nIG5ldyBkbm9kZTogJWxkXG4iLCBQVFJfRVJSKG5ld19mbikpOworCQkJcmV0ID0gUFRSX0VSUihuZXdfZm4pOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gamZmczJfYWRkX2Z1bGxfZG5vZGVfdG9faW5vZGUoYywgZiwgbmV3X2ZuKTsKKwkJb2Zmc2V0ICs9IGRhdGFsZW47CisJCWlmIChmLT5tZXRhZGF0YSkgeworCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGYtPm1ldGFkYXRhLT5yYXcpOworCQkJamZmczJfZnJlZV9mdWxsX2Rub2RlKGYtPm1ldGFkYXRhKTsKKwkJCWYtPm1ldGFkYXRhID0gTlVMTDsKKwkJfQorCX0KKworCWpmZnMyX2djX3JlbGVhc2VfcGFnZShjLCBwZ19wdHIsICZwZyk7CisJcmV0dXJuIHJldDsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvaGlzdG8uaCBiL2ZzL2pmZnMyL2hpc3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRmMTg0ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL2hpc3RvLmgKQEAgLTAsMCArMSwzIEBACisvKiBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIGJpdC1wcm9iYWJpbGl0aWVzIGZvciB0aGUgaW5wdXQgZmlsZSAqLworI2RlZmluZSBCSVRfRElWSURFUiA2MjkgCitzdGF0aWMgaW50IGJpdHNbOV0gPSB7IDE3OSwxNjcsMTgzLDE2NSwxNTksMTk4LDE3OCwxMTksfTsgLyogaWEzMiAuc28gZmlsZXMgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2hpc3RvX21pcHMuaCBiL2ZzL2pmZnMyL2hpc3RvX21pcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQ0MzI2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvamZmczIvaGlzdG9fbWlwcy5oCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSBCSVRfRElWSURFUl9NSVBTIDEwNDMgCitzdGF0aWMgaW50IGJpdHNfbWlwc1s4XSA9IHsgMjc3LDI0OSwyOTAsMjY3LDIyOSwzNDEsMjEyLDI0MX07IC8qIG1pcHMzMiAqLwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvaW9jdGwuYyBiL2ZzL2pmZnMyL2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4Yzc5OQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL2lvY3RsLmMKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIENyZWF0ZWQgYnkgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICoKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCisgKgorICogJElkOiBpb2N0bC5jLHYgMS45IDIwMDQvMTEvMTYgMjA6MzY6MTEgZHdtdzIgRXhwICQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKK2ludCBqZmZzMl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgCisJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCS8qIExhdGVyLCB0aGlzIHdpbGwgcHJvdmlkZSBmb3IgbHNhdHRyLmpmZnMyIGFuZCBjaGF0dHIuamZmczIsIHdoaWNoCisJICAgd2lsbCBpbmNsdWRlIGNvbXByZXNzaW9uIHN1cHBvcnQgZXRjLiAqLworCXJldHVybiAtRU5PVFRZOworfQorCQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvbWFsbG9jLmMgYi9mcy9qZmZzMi9tYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWJiNDMxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZmczIvbWFsbG9jLmMKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgorICoKKyAqICRJZDogbWFsbG9jLmMsdiAxLjI4IDIwMDQvMTEvMTYgMjA6MzY6MTEgZHdtdzIgRXhwICQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvamZmczIuaD4KKyNpbmNsdWRlICJub2RlbGlzdC5oIgorCisjaWYgMAorI2RlZmluZSBKRkZTMl9TTEFCX1BPSVNPTiBTTEFCX1BPSVNPTgorI2Vsc2UKKyNkZWZpbmUgSkZGUzJfU0xBQl9QT0lTT04gMAorI2VuZGlmCisKKy8vIHJlcGxhY2UgdGhpcyBieSAjZGVmaW5lIEQzICh4KSB4IGZvciBjYWNoZSBkZWJ1Z2dpbmcKKyNkZWZpbmUgRDMoeCkKKworLyogVGhlc2UgYXJlIGluaXRpYWxpc2VkIHRvIE5VTEwgaW4gdGhlIGtlcm5lbCBzdGFydHVwIGNvZGUuCisgICBJZiB5b3UncmUgcG9ydGluZyB0byBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcywgYmV3YXJlICovCitzdGF0aWMga21lbV9jYWNoZV90ICpmdWxsX2Rub2RlX3NsYWI7CitzdGF0aWMga21lbV9jYWNoZV90ICpyYXdfZGlyZW50X3NsYWI7CitzdGF0aWMga21lbV9jYWNoZV90ICpyYXdfaW5vZGVfc2xhYjsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKnRtcF9kbm9kZV9pbmZvX3NsYWI7CitzdGF0aWMga21lbV9jYWNoZV90ICpyYXdfbm9kZV9yZWZfc2xhYjsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKm5vZGVfZnJhZ19zbGFiOworc3RhdGljIGttZW1fY2FjaGVfdCAqaW5vZGVfY2FjaGVfc2xhYjsKKworaW50IF9faW5pdCBqZmZzMl9jcmVhdGVfc2xhYl9jYWNoZXModm9pZCkKK3sKKwlmdWxsX2Rub2RlX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiamZmczJfZnVsbF9kbm9kZSIsIAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlKSwKKwkJCQkJICAgIDAsIEpGRlMyX1NMQUJfUE9JU09OLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWZ1bGxfZG5vZGVfc2xhYikKKwkJZ290byBlcnI7CisKKwlyYXdfZGlyZW50X3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiamZmczJfcmF3X2RpcmVudCIsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQpLAorCQkJCQkgICAgMCwgSkZGUzJfU0xBQl9QT0lTT04sIE5VTEwsIE5VTEwpOworCWlmICghcmF3X2RpcmVudF9zbGFiKQorCQlnb3RvIGVycjsKKworCXJhd19pbm9kZV9zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUoImpmZnMyX3Jhd19pbm9kZSIsCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgamZmczJfcmF3X2lub2RlKSwKKwkJCQkJICAgMCwgSkZGUzJfU0xBQl9QT0lTT04sIE5VTEwsIE5VTEwpOworCWlmICghcmF3X2lub2RlX3NsYWIpCisJCWdvdG8gZXJyOworCisJdG1wX2Rub2RlX2luZm9fc2xhYiA9IGttZW1fY2FjaGVfY3JlYXRlKCJqZmZzMl90bXBfZG5vZGUiLAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyksCisJCQkJCQkwLCBKRkZTMl9TTEFCX1BPSVNPTiwgTlVMTCwgTlVMTCk7CisJaWYgKCF0bXBfZG5vZGVfaW5mb19zbGFiKQorCQlnb3RvIGVycjsKKworCXJhd19ub2RlX3JlZl9zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUoImpmZnMyX3Jhd19ub2RlX3JlZiIsCisJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmKSwKKwkJCQkJICAgICAgMCwgSkZGUzJfU0xBQl9QT0lTT04sIE5VTEwsIE5VTEwpOworCWlmICghcmF3X25vZGVfcmVmX3NsYWIpCisJCWdvdG8gZXJyOworCisJbm9kZV9mcmFnX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiamZmczJfbm9kZV9mcmFnIiwKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcpLAorCQkJCQkgICAwLCBKRkZTMl9TTEFCX1BPSVNPTiwgTlVMTCwgTlVMTCk7CisJaWYgKCFub2RlX2ZyYWdfc2xhYikKKwkJZ290byBlcnI7CisKKwlpbm9kZV9jYWNoZV9zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUoImpmZnMyX2lub2RlX2NhY2hlIiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlKSwKKwkJCQkJICAgICAwLCBKRkZTMl9TTEFCX1BPSVNPTiwgTlVMTCwgTlVMTCk7CisJaWYgKGlub2RlX2NhY2hlX3NsYWIpCisJCXJldHVybiAwOworIGVycjoKKwlqZmZzMl9kZXN0cm95X3NsYWJfY2FjaGVzKCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3ZvaWQgamZmczJfZGVzdHJveV9zbGFiX2NhY2hlcyh2b2lkKQoreworCWlmKGZ1bGxfZG5vZGVfc2xhYikKKwkJa21lbV9jYWNoZV9kZXN0cm95KGZ1bGxfZG5vZGVfc2xhYik7CisJaWYocmF3X2RpcmVudF9zbGFiKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3kocmF3X2RpcmVudF9zbGFiKTsKKwlpZihyYXdfaW5vZGVfc2xhYikKKwkJa21lbV9jYWNoZV9kZXN0cm95KHJhd19pbm9kZV9zbGFiKTsKKwlpZih0bXBfZG5vZGVfaW5mb19zbGFiKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3kodG1wX2Rub2RlX2luZm9fc2xhYik7CisJaWYocmF3X25vZGVfcmVmX3NsYWIpCisJCWttZW1fY2FjaGVfZGVzdHJveShyYXdfbm9kZV9yZWZfc2xhYik7CisJaWYobm9kZV9mcmFnX3NsYWIpCisJCWttZW1fY2FjaGVfZGVzdHJveShub2RlX2ZyYWdfc2xhYik7CisJaWYoaW5vZGVfY2FjaGVfc2xhYikKKwkJa21lbV9jYWNoZV9kZXN0cm95KGlub2RlX2NhY2hlX3NsYWIpOworfQorCitzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmpmZnMyX2FsbG9jX2Z1bGxfZGlyZW50KGludCBuYW1lc2l6ZSkKK3sKKwlyZXR1cm4ga21hbGxvYyhzaXplb2Yoc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50KSArIG5hbWVzaXplLCBHRlBfS0VSTkVMKTsKK30KKwordm9pZCBqZmZzMl9mcmVlX2Z1bGxfZGlyZW50KHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqeCkKK3sKKwlrZnJlZSh4KTsKK30KKworc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmpmZnMyX2FsbG9jX2Z1bGxfZG5vZGUodm9pZCkKK3sKKwlzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqcmV0ID0ga21lbV9jYWNoZV9hbGxvYyhmdWxsX2Rub2RlX3NsYWIsIEdGUF9LRVJORUwpOworCUQzIChwcmludGsgKEtFUk5fREVCVUcgImFsbG9jX2Z1bGxfZG5vZGUgYXQgJXBcbiIsIHJldCkpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgamZmczJfZnJlZV9mdWxsX2Rub2RlKHN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICp4KQoreworCUQzIChwcmludGsgKEtFUk5fREVCVUcgImZyZWUgZnVsbF9kbm9kZSBhdCAlcFxuIiwgeCkpOworCWttZW1fY2FjaGVfZnJlZShmdWxsX2Rub2RlX3NsYWIsIHgpOworfQorCitzdHJ1Y3QgamZmczJfcmF3X2RpcmVudCAqamZmczJfYWxsb2NfcmF3X2RpcmVudCh2b2lkKQoreworCXN0cnVjdCBqZmZzMl9yYXdfZGlyZW50ICpyZXQgPSBrbWVtX2NhY2hlX2FsbG9jKHJhd19kaXJlbnRfc2xhYiwgR0ZQX0tFUk5FTCk7CisJRDMgKHByaW50ayAoS0VSTl9ERUJVRyAiYWxsb2NfcmF3X2RpcmVudFxuIiwgcmV0KSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBqZmZzMl9mcmVlX3Jhd19kaXJlbnQoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgKngpCit7CisJRDMgKHByaW50ayAoS0VSTl9ERUJVRyAiZnJlZV9yYXdfZGlyZW50IGF0ICVwXG4iLCB4KSk7CisJa21lbV9jYWNoZV9mcmVlKHJhd19kaXJlbnRfc2xhYiwgeCk7Cit9CisKK3N0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKmpmZnMyX2FsbG9jX3Jhd19pbm9kZSh2b2lkKQoreworCXN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJldCA9IGttZW1fY2FjaGVfYWxsb2MocmF3X2lub2RlX3NsYWIsIEdGUF9LRVJORUwpOworCUQzIChwcmludGsgKEtFUk5fREVCVUcgImFsbG9jX3Jhd19pbm9kZSBhdCAlcFxuIiwgcmV0KSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBqZmZzMl9mcmVlX3Jhd19pbm9kZShzdHJ1Y3QgamZmczJfcmF3X2lub2RlICp4KQoreworCUQzIChwcmludGsgKEtFUk5fREVCVUcgImZyZWVfcmF3X2lub2RlIGF0ICVwXG4iLCB4KSk7CisJa21lbV9jYWNoZV9mcmVlKHJhd19pbm9kZV9zbGFiLCB4KTsKK30KKworc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICpqZmZzMl9hbGxvY190bXBfZG5vZGVfaW5mbyh2b2lkKQoreworCXN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqcmV0ID0ga21lbV9jYWNoZV9hbGxvYyh0bXBfZG5vZGVfaW5mb19zbGFiLCBHRlBfS0VSTkVMKTsKKwlEMyAocHJpbnRrIChLRVJOX0RFQlVHICJhbGxvY190bXBfZG5vZGVfaW5mbyBhdCAlcFxuIiwgcmV0KSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvKHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqeCkKK3sKKwlEMyAocHJpbnRrIChLRVJOX0RFQlVHICJmcmVlX3RtcF9kbm9kZV9pbmZvIGF0ICVwXG4iLCB4KSk7CisJa21lbV9jYWNoZV9mcmVlKHRtcF9kbm9kZV9pbmZvX3NsYWIsIHgpOworfQorCitzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpqZmZzMl9hbGxvY19yYXdfbm9kZV9yZWYodm9pZCkKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpyZXQgPSBrbWVtX2NhY2hlX2FsbG9jKHJhd19ub2RlX3JlZl9zbGFiLCBHRlBfS0VSTkVMKTsKKwlEMyAocHJpbnRrIChLRVJOX0RFQlVHICJhbGxvY19yYXdfbm9kZV9yZWYgYXQgJXBcbiIsIHJldCkpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgamZmczJfZnJlZV9yYXdfbm9kZV9yZWYoc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqeCkKK3sKKwlEMyAocHJpbnRrIChLRVJOX0RFQlVHICJmcmVlX3Jhd19ub2RlX3JlZiBhdCAlcFxuIiwgeCkpOworCWttZW1fY2FjaGVfZnJlZShyYXdfbm9kZV9yZWZfc2xhYiwgeCk7Cit9CisKK3N0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKmpmZnMyX2FsbG9jX25vZGVfZnJhZyh2b2lkKQoreworCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKnJldCA9IGttZW1fY2FjaGVfYWxsb2Mobm9kZV9mcmFnX3NsYWIsIEdGUF9LRVJORUwpOworCUQzIChwcmludGsgKEtFUk5fREVCVUcgImFsbG9jX25vZGVfZnJhZyBhdCAlcFxuIiwgcmV0KSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBqZmZzMl9mcmVlX25vZGVfZnJhZyhzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICp4KQoreworCUQzIChwcmludGsgKEtFUk5fREVCVUcgImZyZWVfbm9kZV9mcmFnIGF0ICVwXG4iLCB4KSk7CisJa21lbV9jYWNoZV9mcmVlKG5vZGVfZnJhZ19zbGFiLCB4KTsKK30KKworc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICpqZmZzMl9hbGxvY19pbm9kZV9jYWNoZSh2b2lkKQoreworCXN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqcmV0ID0ga21lbV9jYWNoZV9hbGxvYyhpbm9kZV9jYWNoZV9zbGFiLCBHRlBfS0VSTkVMKTsKKwlEMyAocHJpbnRrKEtFUk5fREVCVUcgIkFsbG9jYXRlZCBpbm9jYWNoZSBhdCAlcFxuIiwgcmV0KSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBqZmZzMl9mcmVlX2lub2RlX2NhY2hlKHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqeCkKK3sKKwlEMyAocHJpbnRrKEtFUk5fREVCVUcgIkZyZWVpbmcgaW5vY2FjaGUgYXQgJXBcbiIsIHgpKTsKKwlrbWVtX2NhY2hlX2ZyZWUoaW5vZGVfY2FjaGVfc2xhYiwgeCk7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL25vZGVsaXN0LmMgYi9mcy9qZmZzMi9ub2RlbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNmE4YmQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9ub2RlbGlzdC5jCkBAIC0wLDAgKzEsNjgxIEBACisvKgorICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiAkSWQ6IG5vZGVsaXN0LmMsdiAxLjkwIDIwMDQvMTIvMDggMTc6NTk6MjAgZHdtdzIgRXhwICQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgIm5vZGVsaXN0LmgiCisKK3ZvaWQgamZmczJfYWRkX2ZkX3RvX2xpc3Qoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqbmV3LCBzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKipsaXN0KQoreworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqKnByZXYgPSBsaXN0OworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9hZGRfZmRfdG9fbGlzdCggJXAsICVwICgtPiVwKSlcbiIsIG5ldywgbGlzdCwgKmxpc3QpKTsKKworCXdoaWxlICgoKnByZXYpICYmICgqcHJldiktPm5oYXNoIDw9IG5ldy0+bmhhc2gpIHsKKwkJaWYgKCgqcHJldiktPm5oYXNoID09IG5ldy0+bmhhc2ggJiYgIXN0cmNtcCgoKnByZXYpLT5uYW1lLCBuZXctPm5hbWUpKSB7CisJCQkvKiBEdXBsaWNhdGUuIEZyZWUgb25lICovCisJCQlpZiAobmV3LT52ZXJzaW9uIDwgKCpwcmV2KS0+dmVyc2lvbikgeworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFZXAhIE1hcmtpbmcgbmV3IGRpcmVudCBub2RlIG9ic29sZXRlXG4iKSk7CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk5ldyBkaXJlbnQgaXMgXCIlc1wiLT5pbm8gIyV1LiBPbGQgaXMgXCIlc1wiLT5pbm8gIyV1XG4iLCBuZXctPm5hbWUsIG5ldy0+aW5vLCAoKnByZXYpLT5uYW1lLCAoKnByZXYpLT5pbm8pKTsKKwkJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgbmV3LT5yYXcpOworCQkJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQobmV3KTsKKwkJCX0gZWxzZSB7CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk1hcmtpbmcgb2xkIGRpcmVudCBub2RlIChpbm8gIyV1KSBvYnNvbGV0ZVxuIiwgKCpwcmV2KS0+aW5vKSk7CisJCQkJbmV3LT5uZXh0ID0gKCpwcmV2KS0+bmV4dDsKKwkJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgKCgqcHJldiktPnJhdykpOworCQkJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoKnByZXYpOworCQkJCSpwcmV2ID0gbmV3OworCQkJfQorCQkJZ290byBvdXQ7CisJCX0KKwkJcHJldiA9ICYoKCpwcmV2KS0+bmV4dCk7CisJfQorCW5ldy0+bmV4dCA9ICpwcmV2OworCSpwcmV2ID0gbmV3OworCisgb3V0OgorCUQyKHdoaWxlKCpsaXN0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJEaXJlbnQgXCIlc1wiIChoYXNoIDB4JTA4eCwgaW5vICMldVxuIiwgKCpsaXN0KS0+bmFtZSwgKCpsaXN0KS0+bmhhc2gsICgqbGlzdCktPmlubyk7CisJCWxpc3QgPSAmKCpsaXN0KS0+bmV4dDsKKwl9KTsKK30KKworLyogUHV0IGEgbmV3IHRtcF9kbm9kZV9pbmZvIGludG8gdGhlIGxpc3QsIGtlZXBpbmcgdGhlIGxpc3QgaW4gCisgICBvcmRlciBvZiBpbmNyZWFzaW5nIHZlcnNpb24KKyovCitzdGF0aWMgdm9pZCBqZmZzMl9hZGRfdG5fdG9fbGlzdChzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRuLCBzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKipsaXN0KQoreworCXN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqKnByZXYgPSBsaXN0OworCQorCXdoaWxlICgoKnByZXYpICYmICgqcHJldiktPnZlcnNpb24gPCB0bi0+dmVyc2lvbikgeworCQlwcmV2ID0gJigoKnByZXYpLT5uZXh0KTsKKwl9CisJdG4tPm5leHQgPSAoKnByZXYpOworICAgICAgICAqcHJldiA9IHRuOworfQorCitzdGF0aWMgdm9pZCBqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvX2xpc3Qoc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICp0bikKK3sKKwlzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKm5leHQ7CisKKwl3aGlsZSAodG4pIHsKKwkJbmV4dCA9IHRuOworCQl0biA9IHRuLT5uZXh0OworCQlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUobmV4dC0+Zm4pOworCQlqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvKG5leHQpOworCX0KK30KKworc3RhdGljIHZvaWQgamZmczJfZnJlZV9mdWxsX2RpcmVudF9saXN0KHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQpCit7CisJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpuZXh0OworCisJd2hpbGUgKGZkKSB7CisJCW5leHQgPSBmZC0+bmV4dDsKKwkJamZmczJfZnJlZV9mdWxsX2RpcmVudChmZCk7CisJCWZkID0gbmV4dDsKKwl9Cit9CisKKy8qIFJldHVybnMgZmlyc3QgdmFsaWQgbm9kZSBhZnRlciAncmVmJy4gTWF5IHJldHVybiAncmVmJyAqLworc3RhdGljIHN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKmpmZnMyX2ZpcnN0X3ZhbGlkX25vZGUoc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmVmKQoreworCXdoaWxlIChyZWYgJiYgcmVmLT5uZXh0X2luX2lubykgeworCQlpZiAoIXJlZl9vYnNvbGV0ZShyZWYpKQorCQkJcmV0dXJuIHJlZjsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIm5vZGUgYXQgMHglMDh4IGlzIG9ic29sZXRlZC4gSWdub3JpbmcuXG4iLCByZWZfb2Zmc2V0KHJlZikpKTsKKwkJcmVmID0gcmVmLT5uZXh0X2luX2lubzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEdldCB0bXBfZG5vZGVfaW5mbyBhbmQgZnVsbF9kaXJlbnQgZm9yIGFsbCBub24tb2Jzb2xldGUgbm9kZXMgYXNzb2NpYXRlZAorICAgd2l0aCB0aGlzIGlubywgcmV0dXJuaW5nIHRoZSBmb3JtZXIgaW4gb3JkZXIgb2YgdmVyc2lvbiAqLworCitpbnQgamZmczJfZ2V0X2lub2RlX25vZGVzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwKKwkJCSAgc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICoqdG5wLCBzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKipmZHAsCisJCQkgIHVpbnQzMl90ICpoaWdoZXN0X3ZlcnNpb24sIHVpbnQzMl90ICpsYXRlc3RfbWN0aW1lLAorCQkJICB1aW50MzJfdCAqbWN0aW1lX3ZlcikKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpyZWYsICp2YWxpZF9yZWY7CisJc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICp0biwgKnJldF90biA9IE5VTEw7CisJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZCwgKnJldF9mZCA9IE5VTEw7CisJdW5pb24gamZmczJfbm9kZV91bmlvbiBub2RlOworCXNpemVfdCByZXRsZW47CisJaW50IGVycjsKKworCSptY3RpbWVfdmVyID0gMDsKKwkKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZ2V0X2lub2RlX25vZGVzKCk6IGlubyAjJXVcbiIsIGYtPmlub2NhY2hlLT5pbm8pKTsKKworCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCXZhbGlkX3JlZiA9IGpmZnMyX2ZpcnN0X3ZhbGlkX25vZGUoZi0+aW5vY2FjaGUtPm5vZGVzKTsKKworCWlmICghdmFsaWRfcmVmKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJFZXAuIE5vIHZhbGlkIG5vZGVzIGZvciBpbm8gIyV1XG4iLCBmLT5pbm9jYWNoZS0+aW5vKTsKKworCXdoaWxlICh2YWxpZF9yZWYpIHsKKwkJLyogV2UgY2FuIGhvbGQgYSBwb2ludGVyIHRvIGEgbm9uLW9ic29sZXRlIG5vZGUgd2l0aG91dCB0aGUgc3BpbmxvY2ssCisJCSAgIGJ1dCBfb2Jzb2xldGVfIG5vZGVzIG1heSBkaXNhcHBlYXIgYXQgYW55IHRpbWUsIGlmIHRoZSBibG9jaworCQkgICB0aGV5J3JlIGluIGdldHMgZXJhc2VkLiBTbyBpZiB3ZSBtYXJrICdyZWYnIG9ic29sZXRlIHdoaWxlIHdlJ3JlCisJCSAgIG5vdCBob2xkaW5nIHRoZSBsb2NrLCBpdCBjYW4gZ28gYXdheSBpbW1lZGlhdGVseS4gRm9yIHRoYXQgcmVhc29uLAorCQkgICB3ZSBmaW5kIHRoZSBuZXh0IHZhbGlkIG5vZGUgZmlyc3QsIGJlZm9yZSBwcm9jZXNzaW5nICdyZWYnLgorCQkqLworCQlyZWYgPSB2YWxpZF9yZWY7CisJCXZhbGlkX3JlZiA9IGpmZnMyX2ZpcnN0X3ZhbGlkX25vZGUocmVmLT5uZXh0X2luX2lubyk7CisJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJCWNvbmRfcmVzY2hlZCgpOworCisJCS8qIEZJWE1FOiBwb2ludCgpICovCisJCWVyciA9IGpmZnMyX2ZsYXNoX3JlYWQoYywgKHJlZl9vZmZzZXQocmVmKSksIAorCQkJCSAgICAgICBtaW5fdCh1aW50MzJfdCwgcmVmX3RvdGxlbihjLCBOVUxMLCByZWYpLCBzaXplb2Yobm9kZSkpLAorCQkJCSAgICAgICAmcmV0bGVuLCAodm9pZCAqKSZub2RlKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZXJyb3IgJWQgcmVhZGluZyBub2RlIGF0IDB4JTA4eCBpbiBnZXRfaW5vZGVfbm9kZXMoKVxuIiwgZXJyLCByZWZfb2Zmc2V0KHJlZikpOworCQkJZ290byBmcmVlX291dDsKKwkJfQorCQkJCisKKwkJCS8qIENoZWNrIHdlJ3ZlIG1hbmFnZWQgdG8gcmVhZCBhdCBsZWFzdCB0aGUgY29tbW9uIG5vZGUgaGVhZGVyICovCisJCWlmIChyZXRsZW4gPCBtaW5fdCh1aW50MzJfdCwgcmVmX3RvdGxlbihjLCBOVUxMLCByZWYpLCBzaXplb2Yobm9kZS51KSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNob3J0IHJlYWQgaW4gZ2V0X2lub2RlX25vZGVzKClcbiIpOworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gZnJlZV9vdXQ7CisJCX0KKwkJCQorCQlzd2l0Y2ggKGplMTZfdG9fY3B1KG5vZGUudS5ub2RldHlwZSkpIHsKKwkJY2FzZSBKRkZTMl9OT0RFVFlQRV9ESVJFTlQ6CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiTm9kZSBhdCAlMDh4ICglZCkgaXMgYSBkaXJlbnQgbm9kZVxuIiwgcmVmX29mZnNldChyZWYpLCByZWZfZmxhZ3MocmVmKSkpOworCQkJaWYgKHJlZl9mbGFncyhyZWYpID09IFJFRl9VTkNIRUNLRUQpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVUc6IERpcmVudCBub2RlIGF0IDB4JTA4eCBuZXZlciBnb3QgY2hlY2tlZD8gSG93P1xuIiwgcmVmX29mZnNldChyZWYpKTsKKwkJCQlCVUcoKTsKKwkJCX0KKwkJCWlmIChyZXRsZW4gPCBzaXplb2Yobm9kZS5kKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNob3J0IHJlYWQgaW4gZ2V0X2lub2RlX25vZGVzKClcbiIpOworCQkJCWVyciA9IC1FSU87CisJCQkJZ290byBmcmVlX291dDsKKwkJCX0KKwkJCS8qIHNhbml0eSBjaGVjayAqLworCQkJaWYgKFBBRCgobm9kZS5kLm5zaXplICsgc2l6ZW9mIChub2RlLmQpKSkgIT0gUEFEKGplMzJfdG9fY3B1IChub2RlLmQudG90bGVuKSkpIHsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX2dldF9pbm9kZV9ub2RlcygpOiBJbGxlZ2FsIG5zaXplIGluIG5vZGUgYXQgMHglMDh4OiBuc2l6ZSAweCUwMngsIHRvdGxlbiAlMDR4XG4iLAorCQkJCSAgICAgICByZWZfb2Zmc2V0KHJlZiksIG5vZGUuZC5uc2l6ZSwgamUzMl90b19jcHUobm9kZS5kLnRvdGxlbikpOworCQkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCByZWYpOworCQkJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChqZTMyX3RvX2NwdShub2RlLmQudmVyc2lvbikgPiAqaGlnaGVzdF92ZXJzaW9uKQorCQkJCSpoaWdoZXN0X3ZlcnNpb24gPSBqZTMyX3RvX2NwdShub2RlLmQudmVyc2lvbik7CisJCQlpZiAocmVmX29ic29sZXRlKHJlZikpIHsKKwkJCQkvKiBPYnNvbGV0ZWQuIFRoaXMgY2Fubm90IGhhcHBlbiwgc3VyZWx5PyBkd213MiAyMDAyMDMwOCAqLworCQkJCXByaW50ayhLRVJOX0VSUiAiRGlyZW50IG5vZGUgYXQgMHglMDh4IGJlY2FtZSBvYnNvbGV0ZSB3aGlsZSB3ZSB3ZXJlbid0IGxvb2tpbmdcbiIsCisJCQkJICAgICAgIHJlZl9vZmZzZXQocmVmKSk7CisJCQkJQlVHKCk7CisJCQl9CisJCQkKKwkJCWZkID0gamZmczJfYWxsb2NfZnVsbF9kaXJlbnQobm9kZS5kLm5zaXplKzEpOworCQkJaWYgKCFmZCkgeworCQkJCWVyciA9IC1FTk9NRU07CisJCQkJZ290byBmcmVlX291dDsKKwkJCX0KKwkJCWZkLT5yYXcgPSByZWY7CisJCQlmZC0+dmVyc2lvbiA9IGplMzJfdG9fY3B1KG5vZGUuZC52ZXJzaW9uKTsKKwkJCWZkLT5pbm8gPSBqZTMyX3RvX2NwdShub2RlLmQuaW5vKTsKKwkJCWZkLT50eXBlID0gbm9kZS5kLnR5cGU7CisKKwkJCS8qIFBpY2sgb3V0IHRoZSBtY3RpbWUgb2YgdGhlIGxhdGVzdCBkaXJlbnQgKi8KKwkJCWlmKGZkLT52ZXJzaW9uID4gKm1jdGltZV92ZXIpIHsKKwkJCQkqbWN0aW1lX3ZlciA9IGZkLT52ZXJzaW9uOworCQkJCSpsYXRlc3RfbWN0aW1lID0gamUzMl90b19jcHUobm9kZS5kLm1jdGltZSk7CisJCQl9CisKKwkJCS8qIG1lbWNweSBhcyBtdWNoIG9mIHRoZSBuYW1lIGFzIHBvc3NpYmxlIGZyb20gdGhlIHJhdworCQkJICAgZGlyZW50IHdlJ3ZlIGFscmVhZHkgcmVhZCBmcm9tIHRoZSBmbGFzaAorCQkJKi8KKwkJCWlmIChyZXRsZW4gPiBzaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQpKQorCQkJCW1lbWNweSgmZmQtPm5hbWVbMF0sICZub2RlLmQubmFtZVswXSwgbWluX3QodWludDMyX3QsIG5vZGUuZC5uc2l6ZSwgKHJldGxlbi1zaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQpKSkpOworCQkJCQorCQkJLyogRG8gd2UgbmVlZCB0byBjb3B5IGFueSBtb3JlIG9mIHRoZSBuYW1lIGRpcmVjdGx5CisJCQkgICBmcm9tIHRoZSBmbGFzaD8KKwkJCSovCisJCQlpZiAobm9kZS5kLm5zaXplICsgc2l6ZW9mKHN0cnVjdCBqZmZzMl9yYXdfZGlyZW50KSA+IHJldGxlbikgeworCQkJCS8qIEZJWE1FOiBwb2ludCgpICovCisJCQkJaW50IGFscmVhZHkgPSByZXRsZW4gLSBzaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQpOworCQkJCQkKKwkJCQllcnIgPSBqZmZzMl9mbGFzaF9yZWFkKGMsIChyZWZfb2Zmc2V0KHJlZikpICsgcmV0bGVuLCAKKwkJCQkJCSAgIG5vZGUuZC5uc2l6ZSAtIGFscmVhZHksICZyZXRsZW4sICZmZC0+bmFtZVthbHJlYWR5XSk7CisJCQkJaWYgKCFlcnIgJiYgcmV0bGVuICE9IG5vZGUuZC5uc2l6ZSAtIGFscmVhZHkpCisJCQkJCWVyciA9IC1FSU87CisJCQkJCQorCQkJCWlmIChlcnIpIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmVhZCByZW1haW5kZXIgb2YgbmFtZSBpbiBqZmZzMl9nZXRfaW5vZGVfbm9kZXMoKTogZXJyb3IgJWRcbiIsIGVycik7CisJCQkJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoZmQpOworCQkJCQlnb3RvIGZyZWVfb3V0OworCQkJCX0KKwkJCX0KKwkJCWZkLT5uaGFzaCA9IGZ1bGxfbmFtZV9oYXNoKGZkLT5uYW1lLCBub2RlLmQubnNpemUpOworCQkJZmQtPm5leHQgPSBOVUxMOworCQkJZmQtPm5hbWVbbm9kZS5kLm5zaXplXSA9ICdcMCc7CisJCQkJLyogV2hlZWUuIFdlIG5vdyBoYXZlIGEgY29tcGxldGUgamZmczJfZnVsbF9kaXJlbnQgc3RydWN0dXJlLCB3aXRoCisJCQkJICAgdGhlIG5hbWUgaW4gaXQgYW5kIGV2ZXJ5dGhpbmcuIExpbmsgaXQgaW50byB0aGUgbGlzdCAKKwkJCQkqLworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkFkZGluZyBmZCBcIiVzXCIsIGlubyAjJXVcbiIsIGZkLT5uYW1lLCBmZC0+aW5vKSk7CisJCQlqZmZzMl9hZGRfZmRfdG9fbGlzdChjLCBmZCwgJnJldF9mZCk7CisJCQlicmVhazsKKworCQljYXNlIEpGRlMyX05PREVUWVBFX0lOT0RFOgorCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk5vZGUgYXQgJTA4eCAoJWQpIGlzIGEgZGF0YSBub2RlXG4iLCByZWZfb2Zmc2V0KHJlZiksIHJlZl9mbGFncyhyZWYpKSk7CisJCQlpZiAocmV0bGVuIDwgc2l6ZW9mKG5vZGUuaSkpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJyZWFkIHRvbyBzaG9ydCBmb3IgZG5vZGVcbiIpOworCQkJCWVyciA9IC1FSU87CisJCQkJZ290byBmcmVlX291dDsKKwkJCX0KKwkJCWlmIChqZTMyX3RvX2NwdShub2RlLmkudmVyc2lvbikgPiAqaGlnaGVzdF92ZXJzaW9uKQorCQkJCSpoaWdoZXN0X3ZlcnNpb24gPSBqZTMyX3RvX2NwdShub2RlLmkudmVyc2lvbik7CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAidmVyc2lvbiAlZCwgaGlnaGVzdF92ZXJzaW9uIG5vdyAlZFxuIiwgamUzMl90b19jcHUobm9kZS5pLnZlcnNpb24pLCAqaGlnaGVzdF92ZXJzaW9uKSk7CisKKwkJCWlmIChyZWZfb2Jzb2xldGUocmVmKSkgeworCQkJCS8qIE9ic29sZXRlZC4gVGhpcyBjYW5ub3QgaGFwcGVuLCBzdXJlbHk/IGR3bXcyIDIwMDIwMzA4ICovCisJCQkJcHJpbnRrKEtFUk5fRVJSICJJbm9kZSBub2RlIGF0IDB4JTA4eCBiZWNhbWUgb2Jzb2xldGUgd2hpbGUgd2Ugd2VyZW4ndCBsb29raW5nXG4iLAorCQkJCSAgICAgICByZWZfb2Zmc2V0KHJlZikpOworCQkJCUJVRygpOworCQkJfQorCisJCQkvKiBJZiB3ZSd2ZSBuZXZlciBjaGVja2VkIHRoZSBDUkNzIG9uIHRoaXMgbm9kZSwgY2hlY2sgdGhlbSBub3cuICovCisJCQlpZiAocmVmX2ZsYWdzKHJlZikgPT0gUkVGX1VOQ0hFQ0tFRCkgeworCQkJCXVpbnQzMl90IGNyYywgbGVuOworCQkJCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWI7CisKKwkJCQljcmMgPSBjcmMzMigwLCAmbm9kZSwgc2l6ZW9mKG5vZGUuaSktOCk7CisJCQkJaWYgKGNyYyAhPSBqZTMyX3RvX2NwdShub2RlLmkubm9kZV9jcmMpKSB7CisJCQkJCXByaW50ayhLRVJOX05PVElDRSAiamZmczJfZ2V0X2lub2RlX25vZGVzKCk6IENSQyBmYWlsZWQgb24gbm9kZSBhdCAweCUwOHg6IFJlYWQgMHglMDh4LCBjYWxjdWxhdGVkIDB4JTA4eFxuIiwKKwkJCQkJICAgICAgIHJlZl9vZmZzZXQocmVmKSwgamUzMl90b19jcHUobm9kZS5pLm5vZGVfY3JjKSwgY3JjKTsKKwkJCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIHJlZik7CisJCQkJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCQorCQkJCS8qIHNhbml0eSBjaGVja3MgKi8KKwkJCQlpZiAoIGplMzJfdG9fY3B1KG5vZGUuaS5vZmZzZXQpID4gamUzMl90b19jcHUobm9kZS5pLmlzaXplKSB8fAorCQkJCSAgICAgUEFEKGplMzJfdG9fY3B1KG5vZGUuaS5jc2l6ZSkgKyBzaXplb2YgKG5vZGUuaSkpICE9IFBBRChqZTMyX3RvX2NwdShub2RlLmkudG90bGVuKSkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMl9nZXRfaW5vZGVfbm9kZXMoKTogSW5vZGUgY29ycnVwdGVkIGF0IDB4JTA4eCwgdG90bGVuICVkLCAjaW5vICAlZCwgdmVyc2lvbiAlZCwgaXNpemUgJWQsIGNzaXplICVkLCBkc2l6ZSAlZCBcbiIsCisJCQkJCQlyZWZfb2Zmc2V0KHJlZiksICBqZTMyX3RvX2NwdShub2RlLmkudG90bGVuKSwgIGplMzJfdG9fY3B1KG5vZGUuaS5pbm8pLAorCQkJCQkJamUzMl90b19jcHUobm9kZS5pLnZlcnNpb24pLCAgamUzMl90b19jcHUobm9kZS5pLmlzaXplKSwgCisJCQkJCQlqZTMyX3RvX2NwdShub2RlLmkuY3NpemUpLCBqZTMyX3RvX2NwdShub2RlLmkuZHNpemUpKTsKKwkJCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIHJlZik7CisJCQkJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJaWYgKG5vZGUuaS5jb21wciAhPSBKRkZTMl9DT01QUl9aRVJPICYmIGplMzJfdG9fY3B1KG5vZGUuaS5jc2l6ZSkpIHsKKwkJCQkJdW5zaWduZWQgY2hhciAqYnVmPU5VTEw7CisJCQkJCXVpbnQzMl90IHBvaW50ZWQgPSAwOworI2lmbmRlZiBfX0VDT1MKKwkJCQkJaWYgKGMtPm10ZC0+cG9pbnQpIHsKKwkJCQkJCWVyciA9IGMtPm10ZC0+cG9pbnQgKGMtPm10ZCwgcmVmX29mZnNldChyZWYpICsgc2l6ZW9mKG5vZGUuaSksIGplMzJfdG9fY3B1KG5vZGUuaS5jc2l6ZSksCisJCQkJCQkJCSAgICAgJnJldGxlbiwgJmJ1Zik7CisJCQkJCQlpZiAoIWVyciAmJiByZXRsZW4gPCBqZTMyX3RvX2NwdShub2RlLmkuY3NpemUpKSB7CisJCQkJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk1URCBwb2ludCByZXR1cm5lZCBsZW4gdG9vIHNob3J0OiAweCV6eFxuIiwgcmV0bGVuKSk7CisJCQkJCQkJYy0+bXRkLT51bnBvaW50KGMtPm10ZCwgYnVmLCByZWZfb2Zmc2V0KHJlZikgKyBzaXplb2Yobm9kZS5pKSwgamUzMl90b19jcHUobm9kZS5pLmNzaXplKSk7CisJCQkJCQl9IGVsc2UgaWYgKGVycil7CisJCQkJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk1URCBwb2ludCBmYWlsZWQgJWRcbiIsIGVycikpOworCQkJCQkJfSBlbHNlCisJCQkJCQkJcG9pbnRlZCA9IDE7IC8qIHN1Y2NlZnVsbHkgcG9pbnRlZCB0byBkZXZpY2UgKi8KKwkJCQkJfQorI2VuZGlmCQkJCQkKKwkJCQkJaWYoIXBvaW50ZWQpeworCQkJCQkJYnVmID0ga21hbGxvYyhqZTMyX3RvX2NwdShub2RlLmkuY3NpemUpLCBHRlBfS0VSTkVMKTsKKwkJCQkJCWlmICghYnVmKQorCQkJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCQkJCisJCQkJCQllcnIgPSBqZmZzMl9mbGFzaF9yZWFkKGMsIHJlZl9vZmZzZXQocmVmKSArIHNpemVvZihub2RlLmkpLCBqZTMyX3RvX2NwdShub2RlLmkuY3NpemUpLAorCQkJCQkJCQkgICAgICAgJnJldGxlbiwgYnVmKTsKKwkJCQkJCWlmICghZXJyICYmIHJldGxlbiAhPSBqZTMyX3RvX2NwdShub2RlLmkuY3NpemUpKQorCQkJCQkJCWVyciA9IC1FSU87CisJCQkJCQlpZiAoZXJyKSB7CisJCQkJCQkJa2ZyZWUoYnVmKTsKKwkJCQkJCQlyZXR1cm4gZXJyOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWNyYyA9IGNyYzMyKDAsIGJ1ZiwgamUzMl90b19jcHUobm9kZS5pLmNzaXplKSk7CisJCQkJCWlmKCFwb2ludGVkKQorCQkJCQkJa2ZyZWUoYnVmKTsKKyNpZm5kZWYgX19FQ09TCisJCQkJCWVsc2UKKwkJCQkJCWMtPm10ZC0+dW5wb2ludChjLT5tdGQsIGJ1ZiwgcmVmX29mZnNldChyZWYpICsgc2l6ZW9mKG5vZGUuaSksIGplMzJfdG9fY3B1KG5vZGUuaS5jc2l6ZSkpOworI2VuZGlmCisKKwkJCQkJaWYgKGNyYyAhPSBqZTMyX3RvX2NwdShub2RlLmkuZGF0YV9jcmMpKSB7CisJCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX2dldF9pbm9kZV9ub2RlcygpOiBEYXRhIENSQyBmYWlsZWQgb24gbm9kZSBhdCAweCUwOHg6IFJlYWQgMHglMDh4LCBjYWxjdWxhdGVkIDB4JTA4eFxuIiwKKwkJCQkJCSAgICAgICByZWZfb2Zmc2V0KHJlZiksIGplMzJfdG9fY3B1KG5vZGUuaS5kYXRhX2NyYyksIGNyYyk7CisJCQkJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgcmVmKTsKKwkJCQkJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCQorCQkJCX0KKworCQkJCS8qIE1hcmsgdGhlIG5vZGUgYXMgaGF2aW5nIGJlZW4gY2hlY2tlZCBhbmQgZml4IHRoZSBhY2NvdW50aW5nIGFjY29yZGluZ2x5ICovCisJCQkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQkJCWplYiA9ICZjLT5ibG9ja3NbcmVmLT5mbGFzaF9vZmZzZXQgLyBjLT5zZWN0b3Jfc2l6ZV07CisJCQkJbGVuID0gcmVmX3RvdGxlbihjLCBqZWIsIHJlZik7CisKKwkJCQlqZWItPnVzZWRfc2l6ZSArPSBsZW47CisJCQkJamViLT51bmNoZWNrZWRfc2l6ZSAtPSBsZW47CisJCQkJYy0+dXNlZF9zaXplICs9IGxlbjsKKwkJCQljLT51bmNoZWNrZWRfc2l6ZSAtPSBsZW47CisKKwkJCQkvKiBJZiBub2RlIGNvdmVycyBhdCBsZWFzdCBhIHdob2xlIHBhZ2UsIG9yIGlmIGl0IHN0YXJ0cyBhdCB0aGUgCisJCQkJICAgYmVnaW5uaW5nIG9mIGEgcGFnZSBhbmQgcnVucyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBvciBpZiAKKwkJCQkgICBpdCdzIGEgaG9sZSBub2RlLCBtYXJrIGl0IFJFRl9QUklTVElORSwgZWxzZSBSRUZfTk9STUFMLiAKKworCQkJCSAgIElmIGl0J3MgYWN0dWFsbHkgb3ZlcmxhcHBlZCwgaXQnbGwgZ2V0IG1hZGUgTk9STUFMIChvciBPQlNPTEVURSkgCisJCQkJICAgd2hlbiB0aGUgb3ZlcmxhcHBpbmcgbm9kZShzKSBnZXQgYWRkZWQgdG8gdGhlIHRyZWUgYW55d2F5LiAKKwkJCQkqLworCQkJCWlmICgoamUzMl90b19jcHUobm9kZS5pLmRzaXplKSA+PSBQQUdFX0NBQ0hFX1NJWkUpIHx8CisJCQkJICAgICggKChqZTMyX3RvX2NwdShub2RlLmkub2Zmc2V0KSYoUEFHRV9DQUNIRV9TSVpFLTEpKT09MCkgJiYKKwkJCQkgICAgICAoamUzMl90b19jcHUobm9kZS5pLmRzaXplKStqZTMyX3RvX2NwdShub2RlLmkub2Zmc2V0KSA9PSAgamUzMl90b19jcHUobm9kZS5pLmlzaXplKSkpKSB7CisJCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJNYXJraW5nIG5vZGUgYXQgMHglMDh4IFJFRl9QUklTVElORVxuIiwgcmVmX29mZnNldChyZWYpKSk7CisJCQkJCXJlZi0+Zmxhc2hfb2Zmc2V0ID0gcmVmX29mZnNldChyZWYpIHwgUkVGX1BSSVNUSU5FOworCQkJCX0gZWxzZSB7CisJCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJNYXJraW5nIG5vZGUgYXQgMHglMDh4IFJFRl9OT1JNQUxcbiIsIHJlZl9vZmZzZXQocmVmKSkpOworCQkJCQlyZWYtPmZsYXNoX29mZnNldCA9IHJlZl9vZmZzZXQocmVmKSB8IFJFRl9OT1JNQUw7CisJCQkJfQorCQkJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQkJfQorCisJCQl0biA9IGpmZnMyX2FsbG9jX3RtcF9kbm9kZV9pbmZvKCk7CisJCQlpZiAoIXRuKSB7CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgImFsbG9jIHRuIGZhaWxlZFxuIikpOworCQkJCWVyciA9IC1FTk9NRU07CisJCQkJZ290byBmcmVlX291dDsKKwkJCX0KKworCQkJdG4tPmZuID0gamZmczJfYWxsb2NfZnVsbF9kbm9kZSgpOworCQkJaWYgKCF0bi0+Zm4pIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiYWxsb2MgZm4gZmFpbGVkXG4iKSk7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvKHRuKTsKKwkJCQlnb3RvIGZyZWVfb3V0OworCQkJfQorCQkJdG4tPnZlcnNpb24gPSBqZTMyX3RvX2NwdShub2RlLmkudmVyc2lvbik7CisJCQl0bi0+Zm4tPm9mcyA9IGplMzJfdG9fY3B1KG5vZGUuaS5vZmZzZXQpOworCQkJLyogVGhlcmUgd2FzIGEgYnVnIHdoZXJlIHdlIHdyb3RlIGhvbGUgbm9kZXMgb3V0IHdpdGgKKwkJCSAgIGNzaXplL2RzaXplIHN3YXBwZWQuIERlYWwgd2l0aCBpdCAqLworCQkJaWYgKG5vZGUuaS5jb21wciA9PSBKRkZTMl9DT01QUl9aRVJPICYmICFqZTMyX3RvX2NwdShub2RlLmkuZHNpemUpICYmIGplMzJfdG9fY3B1KG5vZGUuaS5jc2l6ZSkpCisJCQkJdG4tPmZuLT5zaXplID0gamUzMl90b19jcHUobm9kZS5pLmNzaXplKTsKKwkJCWVsc2UgLy8gbm9ybWFsIGNhc2UuLi4KKwkJCQl0bi0+Zm4tPnNpemUgPSBqZTMyX3RvX2NwdShub2RlLmkuZHNpemUpOworCQkJdG4tPmZuLT5yYXcgPSByZWY7CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiZG5vZGUgQCUwOHg6IHZlciAldSwgb2Zmc2V0ICUwNHgsIGRzaXplICUwNHhcbiIsCisJCQkJICByZWZfb2Zmc2V0KHJlZiksIGplMzJfdG9fY3B1KG5vZGUuaS52ZXJzaW9uKSwKKwkJCQkgIGplMzJfdG9fY3B1KG5vZGUuaS5vZmZzZXQpLCBqZTMyX3RvX2NwdShub2RlLmkuZHNpemUpKSk7CisJCQlqZmZzMl9hZGRfdG5fdG9fbGlzdCh0biwgJnJldF90bik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJaWYgKHJlZl9mbGFncyhyZWYpID09IFJFRl9VTkNIRUNLRUQpIHsKKwkJCQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViOworCQkJCXVpbnQzMl90IGxlbjsKKworCQkJCXByaW50ayhLRVJOX0VSUiAiRWVwLiBVbmtub3duIG5vZGUgdHlwZSAlMDR4IGF0ICUwOHggd2FzIG1hcmtlZCBSRUZfVU5DSEVDS0VEXG4iLAorCQkJCSAgICAgICBqZTE2X3RvX2NwdShub2RlLnUubm9kZXR5cGUpLCByZWZfb2Zmc2V0KHJlZikpOworCisJCQkJLyogTWFyayB0aGUgbm9kZSBhcyBoYXZpbmcgYmVlbiBjaGVja2VkIGFuZCBmaXggdGhlIGFjY291bnRpbmcgYWNjb3JkaW5nbHkgKi8KKwkJCQlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQkJamViID0gJmMtPmJsb2Nrc1tyZWYtPmZsYXNoX29mZnNldCAvIGMtPnNlY3Rvcl9zaXplXTsKKwkJCQlsZW4gPSByZWZfdG90bGVuKGMsIGplYiwgcmVmKTsKKworCQkJCWplYi0+dXNlZF9zaXplICs9IGxlbjsKKwkJCQlqZWItPnVuY2hlY2tlZF9zaXplIC09IGxlbjsKKwkJCQljLT51c2VkX3NpemUgKz0gbGVuOworCQkJCWMtPnVuY2hlY2tlZF9zaXplIC09IGxlbjsKKworCQkJCW1hcmtfcmVmX25vcm1hbChyZWYpOworCQkJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQkJfQorCQkJbm9kZS51Lm5vZGV0eXBlID0gY3B1X3RvX2plMTYoSkZGUzJfTk9ERV9BQ0NVUkFURSB8IGplMTZfdG9fY3B1KG5vZGUudS5ub2RldHlwZSkpOworCQkJaWYgKGNyYzMyKDAsICZub2RlLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSktNCkgIT0gamUzMl90b19jcHUobm9kZS51Lmhkcl9jcmMpKSB7CisJCQkJLyogSG1tbS4gVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGNhdWdodCBhdCBzY2FuIHRpbWUuICovCisJCQkJcHJpbnRrKEtFUk5fRVJSICJOb2RlIGhlYWRlciBDUkMgZmFpbGVkIGF0ICUwOHguIEJ1dCBpdCBtdXN0IGhhdmUgYmVlbiBPSyBlYXJsaWVyLlxuIiwKKwkJCQkgICAgICAgcmVmX29mZnNldChyZWYpKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIk5vZGUgd2FzOiB7ICUwNHgsICUwNHgsICUwOHgsICUwOHggfVxuIiwgCisJCQkJICAgICAgIGplMTZfdG9fY3B1KG5vZGUudS5tYWdpYyksIGplMTZfdG9fY3B1KG5vZGUudS5ub2RldHlwZSksIGplMzJfdG9fY3B1KG5vZGUudS50b3RsZW4pLAorCQkJCSAgICAgICBqZTMyX3RvX2NwdShub2RlLnUuaGRyX2NyYykpOworCQkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCByZWYpOworCQkJfSBlbHNlIHN3aXRjaChqZTE2X3RvX2NwdShub2RlLnUubm9kZXR5cGUpICYgSkZGUzJfQ09NUEFUX01BU0spIHsKKwkJCWNhc2UgSkZGUzJfRkVBVFVSRV9JTkNPTVBBVDoKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIlVua25vd24gSU5DT01QQVQgbm9kZXR5cGUgJTA0WCBhdCAlMDh4XG4iLCBqZTE2X3RvX2NwdShub2RlLnUubm9kZXR5cGUpLCByZWZfb2Zmc2V0KHJlZikpOworCQkJCS8qIEVFUCAqLworCQkJCUJVRygpOworCQkJCWJyZWFrOworCQkJY2FzZSBKRkZTMl9GRUFUVVJFX1JPQ09NUEFUOgorCQkJCXByaW50ayhLRVJOX05PVElDRSAiVW5rbm93biBST0NPTVBBVCBub2RldHlwZSAlMDRYIGF0ICUwOHhcbiIsIGplMTZfdG9fY3B1KG5vZGUudS5ub2RldHlwZSksIHJlZl9vZmZzZXQocmVmKSk7CisJCQkJaWYgKCEoYy0+ZmxhZ3MgJiBKRkZTMl9TQl9GTEFHX1JPKSkKKwkJCQkJQlVHKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEpGRlMyX0ZFQVRVUkVfUldDT01QQVRfQ09QWToKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIlVua25vd24gUldDT01QQVRfQ09QWSBub2RldHlwZSAlMDRYIGF0ICUwOHhcbiIsIGplMTZfdG9fY3B1KG5vZGUudS5ub2RldHlwZSksIHJlZl9vZmZzZXQocmVmKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEpGRlMyX0ZFQVRVUkVfUldDT01QQVRfREVMRVRFOgorCQkJCXByaW50ayhLRVJOX05PVElDRSAiVW5rbm93biBSV0NPTVBBVF9ERUxFVEUgbm9kZXR5cGUgJTA0WCBhdCAlMDh4XG4iLCBqZTE2X3RvX2NwdShub2RlLnUubm9kZXR5cGUpLCByZWZfb2Zmc2V0KHJlZikpOworCQkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCByZWYpOworCQkJCWJyZWFrOworCQkJfQorCisJCX0KKwkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJfQorCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCSp0bnAgPSByZXRfdG47CisJKmZkcCA9IHJldF9mZDsKKworCXJldHVybiAwOworCisgZnJlZV9vdXQ6CisJamZmczJfZnJlZV90bXBfZG5vZGVfaW5mb19saXN0KHJldF90bik7CisJamZmczJfZnJlZV9mdWxsX2RpcmVudF9saXN0KHJldF9mZCk7CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBqZmZzMl9zZXRfaW5vY2FjaGVfc3RhdGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqaWMsIGludCBzdGF0ZSkKK3sKKwlzcGluX2xvY2soJmMtPmlub2NhY2hlX2xvY2spOworCWljLT5zdGF0ZSA9IHN0YXRlOworCXdha2VfdXAoJmMtPmlub2NhY2hlX3dxKTsKKwlzcGluX3VubG9jaygmYy0+aW5vY2FjaGVfbG9jayk7Cit9CisKKy8qIER1cmluZyBtb3VudCwgdGhpcyBuZWVkcyBubyBsb2NraW5nLiBEdXJpbmcgbm9ybWFsIG9wZXJhdGlvbiwgaXRzCisgICBjYWxsZXJzIHdhbnQgdG8gZG8gb3RoZXIgc3R1ZmYgd2hpbGUgc3RpbGwgaG9sZGluZyB0aGUgaW5vY2FjaGVfbG9jay4KKyAgIFJhdGhlciB0aGFuIGludHJvZHVjaW5nIHNwZWNpYWwgY2FzZSBnZXRfaW5vX2NhY2hlIGZ1bmN0aW9ucyBvciAKKyAgIGNhbGxiYWNrcywgd2UganVzdCBsZXQgdGhlIGNhbGxlciBkbyB0aGUgbG9ja2luZyBpdHNlbGYuICovCisgICAKK3N0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqamZmczJfZ2V0X2lub19jYWNoZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgdWludDMyX3QgaW5vKQoreworCXN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqcmV0OworCisJRDIocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2dldF9pbm9fY2FjaGUoKTogaW5vICV1XG4iLCBpbm8pKTsKKworCXJldCA9IGMtPmlub2NhY2hlX2xpc3RbaW5vICUgSU5PQ0FDSEVfSEFTSFNJWkVdOworCXdoaWxlIChyZXQgJiYgcmV0LT5pbm8gPCBpbm8pIHsKKwkJcmV0ID0gcmV0LT5uZXh0OworCX0KKwkKKwlpZiAocmV0ICYmIHJldC0+aW5vICE9IGlubykKKwkJcmV0ID0gTlVMTDsKKworCUQyKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nZXRfaW5vX2NhY2hlIGZvdW5kICVwIGZvciBpbm8gJXVcbiIsIHJldCwgaW5vKSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBqZmZzMl9hZGRfaW5vX2NhY2hlIChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICpuZXcpCit7CisJc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICoqcHJldjsKKwlEMihwcmludGsoS0VSTl9ERUJVRyAiamZmczJfYWRkX2lub19jYWNoZTogQWRkICVwIChpbm8gIyV1KVxuIiwgbmV3LCBuZXctPmlubykpOworCXNwaW5fbG9jaygmYy0+aW5vY2FjaGVfbG9jayk7CisJCisJcHJldiA9ICZjLT5pbm9jYWNoZV9saXN0W25ldy0+aW5vICUgSU5PQ0FDSEVfSEFTSFNJWkVdOworCisJd2hpbGUgKCgqcHJldikgJiYgKCpwcmV2KS0+aW5vIDwgbmV3LT5pbm8pIHsKKwkJcHJldiA9ICYoKnByZXYpLT5uZXh0OworCX0KKwluZXctPm5leHQgPSAqcHJldjsKKwkqcHJldiA9IG5ldzsKKworCXNwaW5fdW5sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKK30KKwordm9pZCBqZmZzMl9kZWxfaW5vX2NhY2hlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKm9sZCkKK3sKKwlzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKipwcmV2OworCUQyKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9kZWxfaW5vX2NhY2hlOiBEZWwgJXAgKGlubyAjJXUpXG4iLCBvbGQsIG9sZC0+aW5vKSk7CisJc3Bpbl9sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKKwkKKwlwcmV2ID0gJmMtPmlub2NhY2hlX2xpc3Rbb2xkLT5pbm8gJSBJTk9DQUNIRV9IQVNIU0laRV07CisJCisJd2hpbGUgKCgqcHJldikgJiYgKCpwcmV2KS0+aW5vIDwgb2xkLT5pbm8pIHsKKwkJcHJldiA9ICYoKnByZXYpLT5uZXh0OworCX0KKwlpZiAoKCpwcmV2KSA9PSBvbGQpIHsKKwkJKnByZXYgPSBvbGQtPm5leHQ7CisJfQorCisJc3Bpbl91bmxvY2soJmMtPmlub2NhY2hlX2xvY2spOworfQorCit2b2lkIGpmZnMyX2ZyZWVfaW5vX2NhY2hlcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKnRoaXMsICpuZXh0OworCQorCWZvciAoaT0wOyBpPElOT0NBQ0hFX0hBU0hTSVpFOyBpKyspIHsKKwkJdGhpcyA9IGMtPmlub2NhY2hlX2xpc3RbaV07CisJCXdoaWxlICh0aGlzKSB7CisJCQluZXh0ID0gdGhpcy0+bmV4dDsKKwkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9mcmVlX2lub19jYWNoZXM6IEZyZWVpbmcgaW5vICMldSBhdCAlcFxuIiwgdGhpcy0+aW5vLCB0aGlzKSk7CisJCQlqZmZzMl9mcmVlX2lub2RlX2NhY2hlKHRoaXMpOworCQkJdGhpcyA9IG5leHQ7CisJCX0KKwkJYy0+aW5vY2FjaGVfbGlzdFtpXSA9IE5VTEw7CisJfQorfQorCit2b2lkIGpmZnMyX2ZyZWVfcmF3X25vZGVfcmVmcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICp0aGlzLCAqbmV4dDsKKworCWZvciAoaT0wOyBpPGMtPm5yX2Jsb2NrczsgaSsrKSB7CisJCXRoaXMgPSBjLT5ibG9ja3NbaV0uZmlyc3Rfbm9kZTsKKwkJd2hpbGUodGhpcykgeworCQkJbmV4dCA9IHRoaXMtPm5leHRfcGh5czsKKwkJCWpmZnMyX2ZyZWVfcmF3X25vZGVfcmVmKHRoaXMpOworCQkJdGhpcyA9IG5leHQ7CisJCX0KKwkJYy0+YmxvY2tzW2ldLmZpcnN0X25vZGUgPSBjLT5ibG9ja3NbaV0ubGFzdF9ub2RlID0gTlVMTDsKKwl9Cit9CisJCitzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpqZmZzMl9sb29rdXBfbm9kZV9mcmFnKHN0cnVjdCByYl9yb290ICpmcmFndHJlZSwgdWludDMyX3Qgb2Zmc2V0KQoreworCS8qIFRoZSBjb21tb24gY2FzZSBpbiBsb29rdXAgaXMgdGhhdCB0aGVyZSB3aWxsIGJlIGEgbm9kZSAKKwkgICB3aGljaCBwcmVjaXNlbHkgbWF0Y2hlcy4gU28gd2UgZ28gbG9va2luZyBmb3IgdGhhdCBmaXJzdCAqLworCXN0cnVjdCByYl9ub2RlICpuZXh0OworCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKnByZXYgPSBOVUxMOworCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKmZyYWcgPSBOVUxMOworCisJRDIocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2xvb2t1cF9ub2RlX2ZyYWcoJXAsICVkKVxuIiwgZnJhZ3RyZWUsIG9mZnNldCkpOworCisJbmV4dCA9IGZyYWd0cmVlLT5yYl9ub2RlOworCisJd2hpbGUobmV4dCkgeworCQlmcmFnID0gcmJfZW50cnkobmV4dCwgc3RydWN0IGpmZnMyX25vZGVfZnJhZywgcmIpOworCisJCUQyKHByaW50ayhLRVJOX0RFQlVHICJDb25zaWRlcmluZyBmcmFnICVkLSVkICglcCkuIGxlZnQgJXAsIHJpZ2h0ICVwXG4iLAorCQkJICBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplLCBmcmFnLCBmcmFnLT5yYi5yYl9sZWZ0LCBmcmFnLT5yYi5yYl9yaWdodCkpOworCQlpZiAoZnJhZy0+b2ZzICsgZnJhZy0+c2l6ZSA8PSBvZmZzZXQpIHsKKwkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJHb2luZyByaWdodCBmcm9tIGZyYWcgJWQtJWQsIGJlZm9yZSB0aGUgcmVnaW9uIHdlIGNhcmUgYWJvdXRcbiIsCisJCQkJICBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplKSk7CisJCQkvKiBSZW1lbWJlciB0aGUgY2xvc2VzdCBzbWFsbGVyIG1hdGNoIG9uIHRoZSB3YXkgZG93biAqLworCQkJaWYgKCFwcmV2IHx8IGZyYWctPm9mcyA+IHByZXYtPm9mcykKKwkJCQlwcmV2ID0gZnJhZzsKKwkJCW5leHQgPSBmcmFnLT5yYi5yYl9yaWdodDsKKwkJfSBlbHNlIGlmIChmcmFnLT5vZnMgPiBvZmZzZXQpIHsKKwkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJHb2luZyBsZWZ0IGZyb20gZnJhZyAlZC0lZCwgYWZ0ZXIgdGhlIHJlZ2lvbiB3ZSBjYXJlIGFib3V0XG4iLAorCQkJCSAgZnJhZy0+b2ZzLCBmcmFnLT5vZnMrZnJhZy0+c2l6ZSkpOworCQkJbmV4dCA9IGZyYWctPnJiLnJiX2xlZnQ7CisJCX0gZWxzZSB7CisJCQlEMihwcmludGsoS0VSTl9ERUJVRyAiUmV0dXJuaW5nIGZyYWcgJWQsJWQsIG1hdGNoZWRcbiIsCisJCQkJICBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplKSk7CisJCQlyZXR1cm4gZnJhZzsKKwkJfQorCX0KKworCS8qIEV4YWN0IG1hdGNoIG5vdCBmb3VuZC4gR28gYmFjayB1cCBsb29raW5nIGF0IGVhY2ggcGFyZW50LAorCSAgIGFuZCByZXR1cm4gdGhlIGNsb3Nlc3Qgc21hbGxlciBvbmUgKi8KKworCWlmIChwcmV2KQorCQlEMihwcmludGsoS0VSTl9ERUJVRyAiTm8gbWF0Y2guIFJldHVybmluZyBmcmFnICVkLCVkLCBjbG9zZXN0IHByZXZpb3VzXG4iLAorCQkJICBwcmV2LT5vZnMsIHByZXYtPm9mcytwcmV2LT5zaXplKSk7CisJZWxzZSAKKwkJRDIocHJpbnRrKEtFUk5fREVCVUcgIlJldHVybmluZyBOVUxMLCBlbXB0eSBmcmFndHJlZVxuIikpOworCQorCXJldHVybiBwcmV2OworfQorCisvKiBQYXNzICdjJyBhcmd1bWVudCB0byBpbmRpY2F0ZSB0aGF0IG5vZGVzIHNob3VsZCBiZSBtYXJrZWQgb2Jzb2xldGUgYXMKKyAgIHRoZXkncmUga2lsbGVkLiAqLwordm9pZCBqZmZzMl9raWxsX2ZyYWd0cmVlKHN0cnVjdCByYl9yb290ICpyb290LCBzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpmcmFnOworCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKnBhcmVudDsKKworCWlmICghcm9vdC0+cmJfbm9kZSkKKwkJcmV0dXJuOworCisJZnJhZyA9IChyYl9lbnRyeShyb290LT5yYl9ub2RlLCBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnLCByYikpOworCisJd2hpbGUoZnJhZykgeworCQlpZiAoZnJhZy0+cmIucmJfbGVmdCkgeworCQkJRDIocHJpbnRrKEtFUk5fREVCVUcgIkdvaW5nIGxlZnQgZnJvbSBmcmFnICglcCkgJWQtJWRcbiIsIAorCQkJCSAgZnJhZywgZnJhZy0+b2ZzLCBmcmFnLT5vZnMrZnJhZy0+c2l6ZSkpOworCQkJZnJhZyA9IGZyYWdfbGVmdChmcmFnKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChmcmFnLT5yYi5yYl9yaWdodCkgeworCQkJRDIocHJpbnRrKEtFUk5fREVCVUcgIkdvaW5nIHJpZ2h0IGZyb20gZnJhZyAoJXApICVkLSVkXG4iLCAKKwkJCQkgIGZyYWcsIGZyYWctPm9mcywgZnJhZy0+b2ZzK2ZyYWctPnNpemUpKTsKKwkJCWZyYWcgPSBmcmFnX3JpZ2h0KGZyYWcpOworCQkJY29udGludWU7CisJCX0KKworCQlEMihwcmludGsoS0VSTl9ERUJVRyAiamZmczJfa2lsbF9mcmFndHJlZTogZnJhZyBhdCAweCV4LTB4JXg6IG5vZGUgJXAsIGZyYWdzICVkLS1cbiIsCisJCQkgIGZyYWctPm9mcywgZnJhZy0+b2ZzK2ZyYWctPnNpemUsIGZyYWctPm5vZGUsCisJCQkgIGZyYWctPm5vZGU/ZnJhZy0+bm9kZS0+ZnJhZ3M6MCkpOworCQkJCisJCWlmIChmcmFnLT5ub2RlICYmICEoLS1mcmFnLT5ub2RlLT5mcmFncykpIHsKKwkJCS8qIE5vdCBhIGhvbGUsIGFuZCBpdCdzIHRoZSBmaW5hbCByZW1haW5pbmcgZnJhZyAKKwkJCSAgIG9mIHRoaXMgbm9kZS4gRnJlZSB0aGUgbm9kZSAqLworCQkJaWYgKGMpCisJCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGZyYWctPm5vZGUtPnJhdyk7CisJCQkKKwkJCWpmZnMyX2ZyZWVfZnVsbF9kbm9kZShmcmFnLT5ub2RlKTsKKwkJfQorCQlwYXJlbnQgPSBmcmFnX3BhcmVudChmcmFnKTsKKwkJaWYgKHBhcmVudCkgeworCQkJaWYgKGZyYWdfbGVmdChwYXJlbnQpID09IGZyYWcpCisJCQkJcGFyZW50LT5yYi5yYl9sZWZ0ID0gTlVMTDsKKwkJCWVsc2UgCisJCQkJcGFyZW50LT5yYi5yYl9yaWdodCA9IE5VTEw7CisJCX0KKworCQlqZmZzMl9mcmVlX25vZGVfZnJhZyhmcmFnKTsKKwkJZnJhZyA9IHBhcmVudDsKKworCQljb25kX3Jlc2NoZWQoKTsKKwl9Cit9CisKK3ZvaWQgamZmczJfZnJhZ3RyZWVfaW5zZXJ0KHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKm5ld2ZyYWcsIHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKmJhc2UpCit7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9ICZiYXNlLT5yYjsKKwlzdHJ1Y3QgcmJfbm9kZSAqKmxpbmsgPSAmcGFyZW50OworCisJRDIocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2ZyYWd0cmVlX2luc2VydCglcDsgJWQtJWQsICVwKVxuIiwgbmV3ZnJhZywgCisJCSAgbmV3ZnJhZy0+b2ZzLCBuZXdmcmFnLT5vZnMrbmV3ZnJhZy0+c2l6ZSwgYmFzZSkpOworCisJd2hpbGUgKCpsaW5rKSB7CisJCXBhcmVudCA9ICpsaW5rOworCQliYXNlID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnLCByYik7CisJCisJCUQyKHByaW50ayhLRVJOX0RFQlVHICJmcmFndHJlZV9pbnNlcnQgY29uc2lkZXJpbmcgZnJhZyBhdCAweCV4XG4iLCBiYXNlLT5vZnMpKTsKKwkJaWYgKG5ld2ZyYWctPm9mcyA+IGJhc2UtPm9mcykKKwkJCWxpbmsgPSAmYmFzZS0+cmIucmJfcmlnaHQ7CisJCWVsc2UgaWYgKG5ld2ZyYWctPm9mcyA8IGJhc2UtPm9mcykKKwkJCWxpbmsgPSAmYmFzZS0+cmIucmJfbGVmdDsKKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9DUklUICJEdXBsaWNhdGUgZnJhZyBhdCAlMDh4ICglcCwlcClcbiIsIG5ld2ZyYWctPm9mcywgbmV3ZnJhZywgYmFzZSk7CisJCQlCVUcoKTsKKwkJfQorCX0KKworCXJiX2xpbmtfbm9kZSgmbmV3ZnJhZy0+cmIsICZiYXNlLT5yYiwgbGluayk7Cit9CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9ub2RlbGlzdC5oIGIvZnMvamZmczIvbm9kZWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDg2NGQwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZmczIvbm9kZWxpc3QuaApAQCAtMCwwICsxLDQ3MyBAQAorLyoKKyAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIENyZWF0ZWQgYnkgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICoKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCisgKgorICogJElkOiBub2RlbGlzdC5oLHYgMS4xMjYgMjAwNC8xMS8xOSAxNTowNjoyOSBkZWRla2luZCBFeHAgJAorICoKKyAqLworCisjaWZuZGVmIF9fSkZGUzJfTk9ERUxJU1RfSF9fCisjZGVmaW5lIF9fSkZGUzJfTk9ERUxJU1RfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvamZmczIuaD4KKyNpbmNsdWRlIDxsaW51eC9qZmZzMl9mc19zYi5oPgorI2luY2x1ZGUgPGxpbnV4L2pmZnMyX2ZzX2kuaD4KKworI2lmZGVmIF9fRUNPUworI2luY2x1ZGUgIm9zLWVjb3MuaCIKKyNlbHNlCisjaW5jbHVkZSA8bGludXgvbXRkL2NvbXBhdG1hYy5oPiAvKiBGb3IgbWluL21heCBpbiBvbGRlciBrZXJuZWxzICovCisjaW5jbHVkZSAib3MtbGludXguaCIKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19KRkZTMl9GU19ERUJVRworI2RlZmluZSBDT05GSUdfSkZGUzJfRlNfREVCVUcgMQorI2VuZGlmCisKKyNpZiBDT05GSUdfSkZGUzJfRlNfREVCVUcgPiAwCisjZGVmaW5lIEQxKHgpIHgKKyNlbHNlCisjZGVmaW5lIEQxKHgpCisjZW5kaWYKKworI2lmIENPTkZJR19KRkZTMl9GU19ERUJVRyA+IDEKKyNkZWZpbmUgRDIoeCkgeAorI2Vsc2UKKyNkZWZpbmUgRDIoeCkKKyNlbmRpZgorCisjZGVmaW5lIEpGRlMyX05BVElWRV9FTkRJQU4KKworLyogTm90ZSB3ZSBoYW5kbGUgbW9kZSBiaXRzIGNvbnZlcnNpb24gZnJvbSBKRkZTMiAoaS5lLiBMaW51eCkgdG8vZnJvbQorICAgd2hhdGV2ZXIgT1Mgd2UncmUgYWN0dWFsbHkgcnVubmluZyBvbiBoZXJlIHRvby4gKi8KKworI2lmIGRlZmluZWQoSkZGUzJfTkFUSVZFX0VORElBTikKKyNkZWZpbmUgY3B1X3RvX2plMTYoeCkgKChqaW50MTZfdCl7eH0pCisjZGVmaW5lIGNwdV90b19qZTMyKHgpICgoamludDMyX3Qpe3h9KQorI2RlZmluZSBjcHVfdG9famVtb2RlKHgpICgoam1vZGVfdCl7b3NfdG9famZmczJfbW9kZSh4KX0pCisKKyNkZWZpbmUgamUxNl90b19jcHUoeCkgKCh4KS52MTYpCisjZGVmaW5lIGplMzJfdG9fY3B1KHgpICgoeCkudjMyKQorI2RlZmluZSBqZW1vZGVfdG9fY3B1KHgpIChqZmZzMl90b19vc19tb2RlKCh4KS5tKSkKKyNlbGlmIGRlZmluZWQoSkZGUzJfQklHX0VORElBTikKKyNkZWZpbmUgY3B1X3RvX2plMTYoeCkgKChqaW50MTZfdCl7Y3B1X3RvX2JlMTYoeCl9KQorI2RlZmluZSBjcHVfdG9famUzMih4KSAoKGppbnQzMl90KXtjcHVfdG9fYmUzMih4KX0pCisjZGVmaW5lIGNwdV90b19qZW1vZGUoeCkgKChqbW9kZV90KXtjcHVfdG9fYmUzMihvc190b19qZmZzMl9tb2RlKHgpKX0pCisKKyNkZWZpbmUgamUxNl90b19jcHUoeCkgKGJlMTZfdG9fY3B1KHgudjE2KSkKKyNkZWZpbmUgamUzMl90b19jcHUoeCkgKGJlMzJfdG9fY3B1KHgudjMyKSkKKyNkZWZpbmUgamVtb2RlX3RvX2NwdSh4KSAoYmUzMl90b19jcHUoamZmczJfdG9fb3NfbW9kZSgoeCkubSkpKQorI2VsaWYgZGVmaW5lZChKRkZTMl9MSVRUTEVfRU5ESUFOKQorI2RlZmluZSBjcHVfdG9famUxNih4KSAoKGppbnQxNl90KXtjcHVfdG9fbGUxNih4KX0pCisjZGVmaW5lIGNwdV90b19qZTMyKHgpICgoamludDMyX3Qpe2NwdV90b19sZTMyKHgpfSkKKyNkZWZpbmUgY3B1X3RvX2plbW9kZSh4KSAoKGptb2RlX3Qpe2NwdV90b19sZTMyKG9zX3RvX2pmZnMyX21vZGUoeCkpfSkKKworI2RlZmluZSBqZTE2X3RvX2NwdSh4KSAobGUxNl90b19jcHUoeC52MTYpKQorI2RlZmluZSBqZTMyX3RvX2NwdSh4KSAobGUzMl90b19jcHUoeC52MzIpKQorI2RlZmluZSBqZW1vZGVfdG9fY3B1KHgpIChsZTMyX3RvX2NwdShqZmZzMl90b19vc19tb2RlKCh4KS5tKSkpCisjZWxzZSAKKyNlcnJvciB3aWJibGUKKyNlbmRpZgorCisvKgorICBUaGlzIGlzIGFsbCB3ZSBuZWVkIHRvIGtlZXAgaW4tY29yZSBmb3IgZWFjaCByYXcgbm9kZSBkdXJpbmcgbm9ybWFsCisgIG9wZXJhdGlvbi4gQXMgYW5kIHdoZW4gd2UgZG8gcmVhZF9pbm9kZSBvbiBhIHBhcnRpY3VsYXIgaW5vZGUsIHdlIGNhbgorICBzY2FuIHRoZSBub2RlcyB3aGljaCBhcmUgbGlzdGVkIGZvciBpdCBhbmQgYnVpbGQgdXAgYSBwcm9wZXIgbWFwIG9mIAorICB3aGljaCBub2RlcyBhcmUgY3VycmVudGx5IHZhbGlkLiBKRkZTdjEgYWx3YXlzIHVzZWQgdG8ga2VlcCB0aGF0IHdob2xlCisgIG1hcCBpbiBjb3JlIGZvciBlYWNoIGlub2RlLgorKi8KK3N0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpuZXh0X2luX2lubzsgLyogUG9pbnRzIHRvIHRoZSBuZXh0IHJhd19ub2RlX3JlZgorCQlmb3IgdGhpcyBpbm9kZS4gSWYgdGhpcyBpcyB0aGUgbGFzdCwgaXQgcG9pbnRzIHRvIHRoZSBpbm9kZV9jYWNoZQorCQlmb3IgdGhpcyBpbm9kZSBpbnN0ZWFkLiBUaGUgaW5vZGVfY2FjaGUgd2lsbCBoYXZlIE5VTEwgaW4gdGhlIGZpcnN0CisJCXdvcmQgc28geW91IGtub3cgd2hlbiB5b3UndmUgZ290IHRoZXJlIDopICovCisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqbmV4dF9waHlzOworCXVpbnQzMl90IGZsYXNoX29mZnNldDsKKwl1aW50MzJfdCBfX3RvdGxlbjsgLyogVGhpcyBtYXkgZGllOyB1c2UgcmVmX3RvdGxlbihjLCBqZWIsICkgYmVsb3cgKi8KK307CisKKyAgICAgICAgLyogZmxhc2hfb2Zmc2V0ICYgMyBhbHdheXMgaGFzIHRvIGJlIHplcm8sIGJlY2F1c2Ugbm9kZXMgYXJlCisJICAgYWx3YXlzIGFsaWduZWQgYXQgNCBieXRlcy4gU28gd2UgaGF2ZSBhIGNvdXBsZSBvZiBleHRyYSBiaXRzCisJICAgdG8gcGxheSB3aXRoLCB3aGljaCBpbmRpY2F0ZSB0aGUgbm9kZSdzIHN0YXR1czsgc2VlIGJlbG93OiAqLyAKKyNkZWZpbmUgUkVGX1VOQ0hFQ0tFRAkwCS8qIFdlIGhhdmVuJ3QgeWV0IGNoZWNrZWQgdGhlIENSQyBvciBidWlsdCBpdHMgaW5vZGUgKi8KKyNkZWZpbmUgUkVGX09CU09MRVRFCTEJLyogT2Jzb2xldGUsIGNhbiBiZSBjb21wbGV0ZWx5IGlnbm9yZWQgKi8KKyNkZWZpbmUgUkVGX1BSSVNUSU5FCTIJLyogQ29tcGxldGVseSBjbGVhbi4gR0Mgd2l0aG91dCBsb29raW5nICovCisjZGVmaW5lIFJFRl9OT1JNQUwJMwkvKiBQb3NzaWJseSBvdmVybGFwcGVkLiBSZWFkIHRoZSBwYWdlIGFuZCB3cml0ZSBhZ2FpbiBvbiBHQyAqLworI2RlZmluZSByZWZfZmxhZ3MocmVmKQkJKChyZWYpLT5mbGFzaF9vZmZzZXQgJiAzKQorI2RlZmluZSByZWZfb2Zmc2V0KHJlZikJCSgocmVmKS0+Zmxhc2hfb2Zmc2V0ICYgfjMpCisjZGVmaW5lIHJlZl9vYnNvbGV0ZShyZWYpCSgoKHJlZiktPmZsYXNoX29mZnNldCAmIDMpID09IFJFRl9PQlNPTEVURSkKKyNkZWZpbmUgbWFya19yZWZfbm9ybWFsKHJlZikgICAgZG8geyAocmVmKS0+Zmxhc2hfb2Zmc2V0ID0gcmVmX29mZnNldChyZWYpIHwgUkVGX05PUk1BTDsgfSB3aGlsZSgwKQorCisvKiBGb3IgZWFjaCBpbm9kZSBpbiB0aGUgZmlsZXN5c3RlbSwgd2UgbmVlZCB0byBrZWVwIGEgcmVjb3JkIG9mCisgICBubGluaywgYmVjYXVzZSBpdCB3b3VsZCBiZSBhIFBJVEEgdG8gc2NhbiB0aGUgd2hvbGUgZGlyZWN0b3J5IHRyZWUKKyAgIGF0IHJlYWRfaW5vZGUoKSB0aW1lIHRvIGNhbGN1bGF0ZSBpdCwgYW5kIHRvIGtlZXAgc3VmZmljaWVudCBpbmZvcm1hdGlvbgorICAgaW4gdGhlIHJhd19ub2RlX3JlZiAoYmFzaWNhbGx5IGJvdGggcGFyZW50IGFuZCBjaGlsZCBpbm9kZSBudW1iZXIgZm9yIAorICAgZGlyZW50IG5vZGVzKSB3b3VsZCB0YWtlIG1vcmUgc3BhY2UgdGhhbiB0aGlzIGRvZXMuIFdlIGFsc28ga2VlcAorICAgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBwaHlzaWNhbCBub2RlIHdoaWNoIGlzIHBhcnQgb2YgdGhpcyBpbm9kZSwgdG9vLgorKi8KK3N0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSB7CisJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpzY2FuX2RlbnRzOyAvKiBVc2VkIGR1cmluZyBzY2FuIHRvIGhvbGQKKwkJdGVtcG9yYXJ5IGxpc3RzIG9mIGRpcmVudHMsIGFuZCBsYXRlciBtdXN0IGJlIHNldCB0bworCQlOVUxMIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgcmF3X25vZGVfcmVmLT5uZXh0X2luX2lubworCQljaGFpbi4gKi8KKwlzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKm5leHQ7CisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqbm9kZXM7CisJdWludDMyX3QgaW5vOworCWludCBubGluazsKKwlpbnQgc3RhdGU7Cit9OworCisvKiBJbm9kZSBzdGF0ZXMgZm9yICdzdGF0ZScgYWJvdmUuIFdlIG5lZWQgdGhlICdHQycgc3RhdGUgdG8gcHJldmVudAorICAgc29tZW9uZSBmcm9tIGRvaW5nIGEgcmVhZF9pbm9kZSgpIHdoaWxlIHdlJ3JlIG1vdmluZyBhICdSRUZfUFJJU1RJTkUnCisgICBub2RlIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCBhbGwgdGhlIGlnZXQoKSBub25zZW5zZSAqLworI2RlZmluZSBJTk9fU1RBVEVfVU5DSEVDS0VECTAJLyogQ1JDIGNoZWNrcyBub3QgeWV0IGRvbmUgKi8KKyNkZWZpbmUgSU5PX1NUQVRFX0NIRUNLSU5HCTEJLyogQ1JDIGNoZWNrcyBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBJTk9fU1RBVEVfUFJFU0VOVAkyCS8qIEluIGNvcmUgKi8KKyNkZWZpbmUgSU5PX1NUQVRFX0NIRUNLRURBQlNFTlQJMwkvKiBDaGVja2VkLCBjbGVhcmVkIGFnYWluICovCisjZGVmaW5lIElOT19TVEFURV9HQwkJNAkvKiBHQ2luZyBhICdwcmlzdGluZScgbm9kZSAqLworI2RlZmluZSBJTk9fU1RBVEVfUkVBRElORwk1CS8qIEluIHJlYWRfaW5vZGUoKSAqLworCisjZGVmaW5lIElOT0NBQ0hFX0hBU0hTSVpFIDEyOAorCisvKgorICBMYXJnZXIgcmVwcmVzZW50YXRpb24gb2YgYSByYXcgbm9kZSwga2VwdCBpbi1jb3JlIG9ubHkgd2hlbiB0aGUgCisgIHN0cnVjdCBpbm9kZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIGlubyBpcyBpbnN0YW50aWF0ZWQuCisqLworCitzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZQoreworCXN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnJhdzsKKwl1aW50MzJfdCBvZnM7IC8qIFRoZSBvZmZzZXQgdG8gd2hpY2ggdGhlIGRhdGEgb2YgdGhpcyBub2RlIGJlbG9uZ3MgKi8KKwl1aW50MzJfdCBzaXplOworCXVpbnQzMl90IGZyYWdzOyAvKiBOdW1iZXIgb2YgZnJhZ21lbnRzIHdoaWNoIGN1cnJlbnRseSByZWZlcgorCQkJdG8gdGhpcyBub2RlLiBXaGVuIHRoaXMgcmVhY2hlcyB6ZXJvLCAKKwkJCXRoZSBub2RlIGlzIG9ic29sZXRlLiAgKi8KK307CisKKy8qIAorICAgRXZlbiBsYXJnZXIgcmVwcmVzZW50YXRpb24gb2YgYSByYXcgbm9kZSwga2VwdCBpbi1jb3JlIG9ubHkgd2hpbGUKKyAgIHdlJ3JlIGFjdHVhbGx5IGJ1aWxkaW5nIHVwIHRoZSBvcmlnaW5hbCBtYXAgb2Ygd2hpY2ggbm9kZXMgZ28gd2hlcmUsCisgICBpbiByZWFkX2lub2RlKCkKKyovCitzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8KK3sKKwlzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKm5leHQ7CisJc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmZuOworCXVpbnQzMl90IHZlcnNpb247Cit9OyAgICAgICAKKworc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50Cit7CisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmF3OworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqbmV4dDsKKwl1aW50MzJfdCB2ZXJzaW9uOworCXVpbnQzMl90IGlubzsgLyogPT0gemVybyBmb3IgdW5saW5rICovCisJdW5zaWduZWQgaW50IG5oYXNoOworCXVuc2lnbmVkIGNoYXIgdHlwZTsKKwl1bnNpZ25lZCBjaGFyIG5hbWVbMF07Cit9OworCisvKgorICBGcmFnbWVudHMgLSB1c2VkIHRvIGJ1aWxkIGEgbWFwIG9mIHdoaWNoIHJhdyBub2RlIHRvIG9idGFpbiAKKyAgZGF0YSBmcm9tIGZvciBlYWNoIHBhcnQgb2YgdGhlIGlubworKi8KK3N0cnVjdCBqZmZzMl9ub2RlX2ZyYWcKK3sKKwlzdHJ1Y3QgcmJfbm9kZSByYjsKKwlzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqbm9kZTsgLyogTlVMTCBmb3IgaG9sZXMgKi8KKwl1aW50MzJfdCBzaXplOworCXVpbnQzMl90IG9mczsgLyogVGhlIG9mZnNldCB0byB3aGljaCB0aGlzIGZyYWdtZW50IGJlbG9uZ3MgKi8KK307CisKK3N0cnVjdCBqZmZzMl9lcmFzZWJsb2NrCit7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWludCBiYWRfY291bnQ7CisJdWludDMyX3Qgb2Zmc2V0OwkJLyogb2YgdGhpcyBibG9jayBpbiB0aGUgTVREICovCisKKwl1aW50MzJfdCB1bmNoZWNrZWRfc2l6ZTsKKwl1aW50MzJfdCB1c2VkX3NpemU7CisJdWludDMyX3QgZGlydHlfc2l6ZTsKKwl1aW50MzJfdCB3YXN0ZWRfc2l6ZTsKKwl1aW50MzJfdCBmcmVlX3NpemU7CS8qIE5vdGUgdGhhdCBzZWN0b3Jfc2l6ZSAtIGZyZWVfc2l6ZQorCQkJCSAgIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBmcmVlIHNwYWNlICovCisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqZmlyc3Rfbm9kZTsKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpsYXN0X25vZGU7CisKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpnY19ub2RlOwkvKiBOZXh0IG5vZGUgdG8gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQgKi8KK307CisKKyNkZWZpbmUgQUNDVF9TQU5JVFlfQ0hFQ0soYywgamViKSBkbyB7IFwKKwkJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKl9fX2ogPSBqZWI7IFwKKwkJaWYgKChfX19qKSAmJiBfX19qLT51c2VkX3NpemUgKyBfX19qLT5kaXJ0eV9zaXplICsgX19fai0+ZnJlZV9zaXplICsgX19fai0+d2FzdGVkX3NpemUgKyBfX19qLT51bmNoZWNrZWRfc2l6ZSAhPSBjLT5zZWN0b3Jfc2l6ZSkgeyBcCisJCXByaW50ayhLRVJOX05PVElDRSAiRWVlcC4gU3BhY2UgYWNjb3VudGluZyBmb3IgYmxvY2sgYXQgMHglMDh4IGlzIHNjcmV3ZWRcbiIsIF9fX2otPm9mZnNldCk7IFwKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJmcmVlIDB4JTA4eCArIGRpcnR5IDB4JTA4eCArIHVzZWQgJTA4eCArIHdhc3RlZCAlMDh4ICsgdW5jaGVja2VkICUwOHggIT0gdG90YWwgJTA4eFxuIiwgXAorCQlfX19qLT5mcmVlX3NpemUsIF9fX2otPmRpcnR5X3NpemUsIF9fX2otPnVzZWRfc2l6ZSwgX19fai0+d2FzdGVkX3NpemUsIF9fX2otPnVuY2hlY2tlZF9zaXplLCBjLT5zZWN0b3Jfc2l6ZSk7IFwKKwkJQlVHKCk7IFwKKwl9IFwKKwlpZiAoYy0+dXNlZF9zaXplICsgYy0+ZGlydHlfc2l6ZSArIGMtPmZyZWVfc2l6ZSArIGMtPmVyYXNpbmdfc2l6ZSArIGMtPmJhZF9zaXplICsgYy0+d2FzdGVkX3NpemUgKyBjLT51bmNoZWNrZWRfc2l6ZSAhPSBjLT5mbGFzaF9zaXplKSB7IFwKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJFZWVwLiBTcGFjZSBhY2NvdW50aW5nIHN1cGVyYmxvY2sgaW5mbyBpcyBzY3Jld2VkXG4iKTsgXAorCQlwcmludGsoS0VSTl9OT1RJQ0UgImZyZWUgMHglMDh4ICsgZGlydHkgMHglMDh4ICsgdXNlZCAlMDh4ICsgZXJhc2luZyAlMDh4ICsgYmFkICUwOHggKyB3YXN0ZWQgJTA4eCArIHVuY2hlY2tlZCAlMDh4ICE9IHRvdGFsICUwOHhcbiIsIFwKKwkJYy0+ZnJlZV9zaXplLCBjLT5kaXJ0eV9zaXplLCBjLT51c2VkX3NpemUsIGMtPmVyYXNpbmdfc2l6ZSwgYy0+YmFkX3NpemUsIGMtPndhc3RlZF9zaXplLCBjLT51bmNoZWNrZWRfc2l6ZSwgYy0+Zmxhc2hfc2l6ZSk7IFwKKwkJQlVHKCk7IFwKKwl9IFwKK30gd2hpbGUoMCkKKworc3RhdGljIGlubGluZSB2b2lkIHBhcmFub2lhX2ZhaWxlZF9kdW1wKHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIpCit7CisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmVmOworCWludCBpPTA7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UpOworCWZvciAocmVmID0gamViLT5maXJzdF9ub2RlOyByZWY7IHJlZiA9IHJlZi0+bmV4dF9waHlzKSB7CisJCXByaW50aygiJTA4eC0+IiwgcmVmX29mZnNldChyZWYpKTsKKwkJaWYgKCsraSA9PSA4KSB7CisJCQlpID0gMDsKKwkJCXByaW50aygiXG4iIEtFUk5fTk9USUNFKTsKKwkJfQorCX0KKwlwcmludGsoIlxuIik7Cit9CisKKworI2RlZmluZSBBQ0NUX1BBUkFOT0lBX0NIRUNLKGplYikgZG8geyBcCisJCXVpbnQzMl90IG15X3VzZWRfc2l6ZSA9IDA7IFwKKwkJdWludDMyX3QgbXlfdW5jaGVja2VkX3NpemUgPSAwOyBcCisJCXN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnJlZjIgPSBqZWItPmZpcnN0X25vZGU7IFwKKwkJd2hpbGUgKHJlZjIpIHsgXAorCQkJaWYgKHVubGlrZWx5KHJlZjItPmZsYXNoX29mZnNldCA8IGplYi0+b2Zmc2V0IHx8IFwKKwkJCQkgICAgIHJlZjItPmZsYXNoX29mZnNldCA+IGplYi0+b2Zmc2V0ICsgYy0+c2VjdG9yX3NpemUpKSB7IFwKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5vZGUgJTA4eCBzaG91bGRuJ3QgYmUgaW4gYmxvY2sgYXQgJTA4eCFcbiIsIFwKKwkJCQkgICAgICAgcmVmX29mZnNldChyZWYyKSwgamViLT5vZmZzZXQpOyBcCisJCQkJcGFyYW5vaWFfZmFpbGVkX2R1bXAoamViKTsgXAorCQkJCUJVRygpOyBcCisJCQl9IFwKKwkJCWlmIChyZWZfZmxhZ3MocmVmMikgPT0gUkVGX1VOQ0hFQ0tFRCkgXAorCQkJCW15X3VuY2hlY2tlZF9zaXplICs9IHJlZl90b3RsZW4oYywgamViLCByZWYyKTsgXAorCQkJZWxzZSBpZiAoIXJlZl9vYnNvbGV0ZShyZWYyKSkgXAorCQkJCW15X3VzZWRfc2l6ZSArPSByZWZfdG90bGVuKGMsIGplYiwgcmVmMik7IFwKKwkJCWlmICh1bmxpa2VseSgoIXJlZjItPm5leHRfcGh5cykgIT0gKHJlZjIgPT0gamViLT5sYXN0X25vZGUpKSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVmMi0+bmV4dF9waHlzKSBcCisJCQkJICAgICAgIHByaW50aygicmVmIGZvciBub2RlIGF0ICVwIChwaHlzICUwOHgpIGhhcyBuZXh0X3BoeXMtPiVwICgtLS0tKSwgbGFzdF9ub2RlLT4lcCAocGh5cyAlMDh4KVxuIiwgXAorCQkJCSAgICAgICAgICAgICByZWYyLCByZWZfb2Zmc2V0KHJlZjIpLCByZWYyLT5uZXh0X3BoeXMsIFwKKwkJCQkgICAgICAgICAgICAgamViLT5sYXN0X25vZGUsIHJlZl9vZmZzZXQoamViLT5sYXN0X25vZGUpKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygicmVmIGZvciBub2RlIGF0ICVwIChwaHlzICUwOHgpIGhhcyBuZXh0X3BoeXMtPiVwICglMDh4KSwgbGFzdF9ub2RlLT4lcCAocGh5cyAlMDh4KVxuIiwgXAorCQkJCSAgICAgICAgICAgICByZWYyLCByZWZfb2Zmc2V0KHJlZjIpLCByZWYyLT5uZXh0X3BoeXMsIHJlZl9vZmZzZXQocmVmMi0+bmV4dF9waHlzKSwgXAorCQkJCSAgICAgICAgICAgICBqZWItPmxhc3Rfbm9kZSwgcmVmX29mZnNldChqZWItPmxhc3Rfbm9kZSkpOyBcCisJCQkJcGFyYW5vaWFfZmFpbGVkX2R1bXAoamViKTsgXAorCQkJCUJVRygpOyBcCisJCQl9IFwKKwkJCXJlZjIgPSByZWYyLT5uZXh0X3BoeXM7IFwKKwkJfSBcCisJCWlmIChteV91c2VkX3NpemUgIT0gamViLT51c2VkX3NpemUpIHsgXAorCQkJcHJpbnRrKEtFUk5fTk9USUNFICJDYWxjdWxhdGVkIHVzZWQgc2l6ZSAlMDh4ICE9IHN0b3JlZCB1c2VkIHNpemUgJTA4eFxuIiwgbXlfdXNlZF9zaXplLCBqZWItPnVzZWRfc2l6ZSk7IFwKKwkJCUJVRygpOyBcCisJCX0gXAorCQlpZiAobXlfdW5jaGVja2VkX3NpemUgIT0gamViLT51bmNoZWNrZWRfc2l6ZSkgeyBcCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkNhbGN1bGF0ZWQgdW5jaGVja2VkIHNpemUgJTA4eCAhPSBzdG9yZWQgdW5jaGVja2VkIHNpemUgJTA4eFxuIiwgbXlfdW5jaGVja2VkX3NpemUsIGplYi0+dW5jaGVja2VkX3NpemUpOyBcCisJCQlCVUcoKTsgXAorCQl9IFwKKwl9IHdoaWxlKDApCisKKy8qIENhbGN1bGF0ZSB0b3RsZW4gZnJvbSBzdXJyb3VuZGluZyBub2RlcyBvciBlcmFzZWJsb2NrICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IF9fcmVmX3RvdGxlbihzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywKKwkJCQkgICAgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwKKwkJCQkgICAgc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmVmKQoreworCXVpbnQzMl90IHJlZl9lbmQ7CisJCisJaWYgKHJlZi0+bmV4dF9waHlzKQorCQlyZWZfZW5kID0gcmVmX29mZnNldChyZWYtPm5leHRfcGh5cyk7CisJZWxzZSB7CisJCWlmICghamViKQorCQkJamViID0gJmMtPmJsb2Nrc1tyZWYtPmZsYXNoX29mZnNldCAvIGMtPnNlY3Rvcl9zaXplXTsKKworCQkvKiBMYXN0IG5vZGUgaW4gYmxvY2suIFVzZSBmcmVlX3NwYWNlICovCisJCUJVR19PTihyZWYgIT0gamViLT5sYXN0X25vZGUpOworCQlyZWZfZW5kID0gamViLT5vZmZzZXQgKyBjLT5zZWN0b3Jfc2l6ZSAtIGplYi0+ZnJlZV9zaXplOworCX0KKwlyZXR1cm4gcmVmX2VuZCAtIHJlZl9vZmZzZXQocmVmKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCByZWZfdG90bGVuKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLAorCQkJCSAgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwKKwkJCQkgIHN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnJlZikKK3sKKwl1aW50MzJfdCByZXQ7CisKKwlEMShpZiAoamViICYmIGplYiAhPSAmYy0+YmxvY2tzW3JlZi0+Zmxhc2hfb2Zmc2V0IC8gYy0+c2VjdG9yX3NpemVdKSB7CisJCXByaW50ayhLRVJOX0NSSVQgInJlZl90b3RsZW4gY2FsbGVkIHdpdGggd3JvbmcgYmxvY2sgLS0gYXQgMHglMDh4IGluc3RlYWQgb2YgMHglMDh4OyByZWYgMHglMDh4XG4iLAorCQkgICAgICAgamViLT5vZmZzZXQsIGMtPmJsb2Nrc1tyZWYtPmZsYXNoX29mZnNldCAvIGMtPnNlY3Rvcl9zaXplXS5vZmZzZXQsIHJlZl9vZmZzZXQocmVmKSk7CisJCUJVRygpOworCX0pCisKKyNpZiAxCisJcmV0ID0gcmVmLT5fX3RvdGxlbjsKKyNlbHNlCisJLyogVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHdvcmsgeWV0ICovCisJcmV0ID0gX19yZWZfdG90bGVuKGMsIGplYiwgcmVmKTsKKwlpZiAocmV0ICE9IHJlZi0+X190b3RsZW4pIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiVG90bGVuIGZvciByZWYgYXQgJXAgKDB4JTA4eC0weCUwOHgpIG1pc2NhbGN1bGF0ZWQgYXMgMHgleCBpbnN0ZWFkIG9mICV4XG4iLAorCQkgICAgICAgcmVmLCByZWZfb2Zmc2V0KHJlZiksIHJlZl9vZmZzZXQocmVmKStyZWYtPl9fdG90bGVuLAorCQkgICAgICAgcmV0LCByZWYtPl9fdG90bGVuKTsKKwkJaWYgKCFqZWIpCisJCQlqZWIgPSAmYy0+YmxvY2tzW3JlZi0+Zmxhc2hfb2Zmc2V0IC8gYy0+c2VjdG9yX3NpemVdOworCQlwYXJhbm9pYV9mYWlsZWRfZHVtcChqZWIpOworCQlCVUcoKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCisKKyNkZWZpbmUgQUxMT0NfTk9STUFMCTAJLyogTm9ybWFsIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgQUxMT0NfREVMRVRJT04JMQkvKiBEZWxldGlvbiBub2RlLiBCZXN0IHRvIGFsbG93IGl0ICovCisjZGVmaW5lIEFMTE9DX0dDCTIJLyogU3BhY2UgcmVxdWVzdGVkIGZvciBHQy4gR2l2ZSBpdCBvciBkaWUgKi8KKyNkZWZpbmUgQUxMT0NfTk9SRVRSWQkzCS8qIEZvciBqZmZzMl93cml0ZV9kbm9kZTogT24gZmFpbHVyZSwgcmV0dXJuIC1FQUdBSU4gaW5zdGVhZCBvZiByZXRyeWluZyAqLworCisvKiBIb3cgbXVjaCBkaXJ0eSBzcGFjZSBiZWZvcmUgaXQgZ29lcyBvbiB0aGUgdmVyeV9kaXJ0eV9saXN0ICovCisjZGVmaW5lIFZFUllESVJUWShjLCBzaXplKSAoKHNpemUpID49ICgoYyktPnNlY3Rvcl9zaXplIC8gMikpCisKKy8qIGNoZWNrIGlmIGRpcnR5IHNwYWNlIGlzIG1vcmUgdGhhbiAyNTUgQnl0ZSAqLworI2RlZmluZSBJU0RJUlRZKHNpemUpICgoc2l6ZSkgPiAgc2l6ZW9mIChzdHJ1Y3QgamZmczJfcmF3X2lub2RlKSArIEpGRlMyX01JTl9EQVRBX0xFTikgCisKKyNkZWZpbmUgUEFEKHgpICgoKHgpKzMpJn4zKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqamZmczJfcmF3X3JlZl90b19pYyhzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpyYXcpCit7CisJd2hpbGUocmF3LT5uZXh0X2luX2lubykgeworCQlyYXcgPSByYXctPm5leHRfaW5faW5vOworCX0KKworCXJldHVybiAoKHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqKXJhdyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqZnJhZ19maXJzdChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHJvb3QtPnJiX25vZGU7CisKKwlpZiAoIW5vZGUpCisJCXJldHVybiBOVUxMOworCXdoaWxlKG5vZGUtPnJiX2xlZnQpCisJCW5vZGUgPSBub2RlLT5yYl9sZWZ0OworCXJldHVybiByYl9lbnRyeShub2RlLCBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnLCByYik7Cit9CisjZGVmaW5lIHJiX3BhcmVudChyYikgKChyYiktPnJiX3BhcmVudCkKKyNkZWZpbmUgZnJhZ19uZXh0KGZyYWcpIHJiX2VudHJ5KHJiX25leHQoJihmcmFnKS0+cmIpLCBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnLCByYikKKyNkZWZpbmUgZnJhZ19wcmV2KGZyYWcpIHJiX2VudHJ5KHJiX3ByZXYoJihmcmFnKS0+cmIpLCBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnLCByYikKKyNkZWZpbmUgZnJhZ19wYXJlbnQoZnJhZykgcmJfZW50cnkocmJfcGFyZW50KCYoZnJhZyktPnJiKSwgc3RydWN0IGpmZnMyX25vZGVfZnJhZywgcmIpCisjZGVmaW5lIGZyYWdfbGVmdChmcmFnKSByYl9lbnRyeSgoZnJhZyktPnJiLnJiX2xlZnQsIHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcsIHJiKQorI2RlZmluZSBmcmFnX3JpZ2h0KGZyYWcpIHJiX2VudHJ5KChmcmFnKS0+cmIucmJfcmlnaHQsIHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcsIHJiKQorI2RlZmluZSBmcmFnX2VyYXNlKGZyYWcsIGxpc3QpIHJiX2VyYXNlKCZmcmFnLT5yYiwgbGlzdCk7CisKKy8qIG5vZGVsaXN0LmMgKi8KK0QyKHZvaWQgamZmczJfcHJpbnRfZnJhZ19saXN0KHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmKSk7Cit2b2lkIGpmZnMyX2FkZF9mZF90b19saXN0KHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKm5ldywgc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICoqbGlzdCk7CitpbnQgamZmczJfZ2V0X2lub2RlX25vZGVzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwKKwkJCSAgc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICoqdG5wLCBzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKipmZHAsCisJCQkgIHVpbnQzMl90ICpoaWdoZXN0X3ZlcnNpb24sIHVpbnQzMl90ICpsYXRlc3RfbWN0aW1lLAorCQkJICB1aW50MzJfdCAqbWN0aW1lX3Zlcik7Cit2b2lkIGpmZnMyX3NldF9pbm9jYWNoZV9zdGF0ZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICppYywgaW50IHN0YXRlKTsKK3N0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqamZmczJfZ2V0X2lub19jYWNoZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgdWludDMyX3QgaW5vKTsKK3ZvaWQgamZmczJfYWRkX2lub19jYWNoZSAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqbmV3KTsKK3ZvaWQgamZmczJfZGVsX2lub19jYWNoZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICpvbGQpOwordm9pZCBqZmZzMl9mcmVlX2lub19jYWNoZXMoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOwordm9pZCBqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZnMoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOworc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqamZmczJfbG9va3VwX25vZGVfZnJhZyhzdHJ1Y3QgcmJfcm9vdCAqZnJhZ3RyZWUsIHVpbnQzMl90IG9mZnNldCk7Cit2b2lkIGpmZnMyX2tpbGxfZnJhZ3RyZWUoc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjX2RlbGV0ZSk7Cit2b2lkIGpmZnMyX2ZyYWd0cmVlX2luc2VydChzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpuZXdmcmFnLCBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpiYXNlKTsKK3N0cnVjdCByYl9ub2RlICpyYl9uZXh0KHN0cnVjdCByYl9ub2RlICopOworc3RydWN0IHJiX25vZGUgKnJiX3ByZXYoc3RydWN0IHJiX25vZGUgKik7Cit2b2lkIHJiX3JlcGxhY2Vfbm9kZShzdHJ1Y3QgcmJfbm9kZSAqdmljdGltLCBzdHJ1Y3QgcmJfbm9kZSAqbmV3LCBzdHJ1Y3QgcmJfcm9vdCAqcm9vdCk7CisKKy8qIG5vZGVtZ210LmMgKi8KK2ludCBqZmZzMl90aHJlYWRfc2hvdWxkX3dha2Uoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOworaW50IGpmZnMyX3Jlc2VydmVfc3BhY2Uoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHVpbnQzMl90IG1pbnNpemUsIHVpbnQzMl90ICpvZnMsIHVpbnQzMl90ICpsZW4sIGludCBwcmlvKTsKK2ludCBqZmZzMl9yZXNlcnZlX3NwYWNlX2djKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCB1aW50MzJfdCBtaW5zaXplLCB1aW50MzJfdCAqb2ZzLCB1aW50MzJfdCAqbGVuKTsKK2ludCBqZmZzMl9hZGRfcGh5c2ljYWxfbm9kZV9yZWYoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKm5ldyk7Cit2b2lkIGpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKTsKK3ZvaWQgamZmczJfbWFya19ub2RlX29ic29sZXRlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpyYXcpOwordm9pZCBqZmZzMl9kdW1wX2Jsb2NrX2xpc3RzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKTsKKworLyogd3JpdGUuYyAqLworaW50IGpmZnMyX2RvX25ld19pbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHVpbnQzMl90IG1vZGUsIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJpKTsKKworc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmpmZnMyX3dyaXRlX2Rub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwgc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqcmksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVpbnQzMl90IGRhdGFsZW4sIHVpbnQzMl90IGZsYXNoX29mcywgaW50IGFsbG9jX21vZGUpOworc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpqZmZzMl93cml0ZV9kaXJlbnQoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCBzdHJ1Y3QgamZmczJfcmF3X2RpcmVudCAqcmQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUsIHVpbnQzMl90IG5hbWVsZW4sIHVpbnQzMl90IGZsYXNoX29mcywgaW50IGFsbG9jX21vZGUpOworaW50IGpmZnMyX3dyaXRlX2lub2RlX3JhbmdlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwKKwkJCSAgICBzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaSwgdW5zaWduZWQgY2hhciAqYnVmLCAKKwkJCSAgICB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHdyaXRlbGVuLCB1aW50MzJfdCAqcmV0bGVuKTsKK2ludCBqZmZzMl9kb19jcmVhdGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpkaXJfZiwgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJpLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7CitpbnQgamZmczJfZG9fdW5saW5rKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZGlyX2YsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZGVhZF9mKTsKK2ludCBqZmZzMl9kb19saW5rIChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmRpcl9mLCB1aW50MzJfdCBpbm8sIHVpbnQ4X3QgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pOworCisKKy8qIHJlYWRpbm9kZS5jICovCit2b2lkIGpmZnMyX3RydW5jYXRlX2ZyYWdsaXN0IChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IHJiX3Jvb3QgKmxpc3QsIHVpbnQzMl90IHNpemUpOworaW50IGpmZnMyX2FkZF9mdWxsX2Rub2RlX3RvX2lub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwgc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmZuKTsKK2ludCBqZmZzMl9kb19yZWFkX2lub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwgCisJCQl1aW50MzJfdCBpbm8sIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKmxhdGVzdF9ub2RlKTsKK2ludCBqZmZzMl9kb19jcmNjaGVja19pbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICppYyk7Cit2b2lkIGpmZnMyX2RvX2NsZWFyX2lub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZik7CisKKy8qIG1hbGxvYy5jICovCitpbnQgamZmczJfY3JlYXRlX3NsYWJfY2FjaGVzKHZvaWQpOwordm9pZCBqZmZzMl9kZXN0cm95X3NsYWJfY2FjaGVzKHZvaWQpOworCitzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmpmZnMyX2FsbG9jX2Z1bGxfZGlyZW50KGludCBuYW1lc2l6ZSk7Cit2b2lkIGpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICopOworc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmpmZnMyX2FsbG9jX2Z1bGxfZG5vZGUodm9pZCk7Cit2b2lkIGpmZnMyX2ZyZWVfZnVsbF9kbm9kZShzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqKTsKK3N0cnVjdCBqZmZzMl9yYXdfZGlyZW50ICpqZmZzMl9hbGxvY19yYXdfZGlyZW50KHZvaWQpOwordm9pZCBqZmZzMl9mcmVlX3Jhd19kaXJlbnQoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgKik7CitzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpqZmZzMl9hbGxvY19yYXdfaW5vZGUodm9pZCk7Cit2b2lkIGpmZnMyX2ZyZWVfcmF3X2lub2RlKHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKik7CitzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKmpmZnMyX2FsbG9jX3RtcF9kbm9kZV9pbmZvKHZvaWQpOwordm9pZCBqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvKHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqKTsKK3N0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKmpmZnMyX2FsbG9jX3Jhd19ub2RlX3JlZih2b2lkKTsKK3ZvaWQgamZmczJfZnJlZV9yYXdfbm9kZV9yZWYoc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqKTsKK3N0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKmpmZnMyX2FsbG9jX25vZGVfZnJhZyh2b2lkKTsKK3ZvaWQgamZmczJfZnJlZV9ub2RlX2ZyYWcoc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqKTsKK3N0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqamZmczJfYWxsb2NfaW5vZGVfY2FjaGUodm9pZCk7Cit2b2lkIGpmZnMyX2ZyZWVfaW5vZGVfY2FjaGUoc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICopOworCisvKiBnYy5jICovCitpbnQgamZmczJfZ2FyYmFnZV9jb2xsZWN0X3Bhc3Moc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOworCisvKiByZWFkLmMgKi8KK2ludCBqZmZzMl9yZWFkX2Rub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwKKwkJICAgICBzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZmQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJICAgICBpbnQgb2ZzLCBpbnQgbGVuKTsKK2ludCBqZmZzMl9yZWFkX2lub2RlX3JhbmdlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBsZW4pOworY2hhciAqamZmczJfZ2V0bGluayhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYpOworCisvKiBzY2FuLmMgKi8KK2ludCBqZmZzMl9zY2FuX21lZGl1bShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7Cit2b2lkIGpmZnMyX3JvdGF0ZV9saXN0cyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CisKKy8qIGJ1aWxkLmMgKi8KK2ludCBqZmZzMl9kb19tb3VudF9mcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CisKKy8qIGVyYXNlLmMgKi8KK3ZvaWQgamZmczJfZXJhc2VfcGVuZGluZ19ibG9ja3Moc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIGludCBjb3VudCk7CisKKyNpZmRlZiBDT05GSUdfSkZGUzJfRlNfTkFORAorLyogd2J1Zi5jICovCitpbnQgamZmczJfZmx1c2hfd2J1Zl9nYyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgdWludDMyX3QgaW5vKTsKK2ludCBqZmZzMl9mbHVzaF93YnVmX3BhZChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CitpbnQgamZmczJfY2hlY2tfbmFuZF9jbGVhbm1hcmtlcihzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYik7CitpbnQgamZmczJfd3JpdGVfbmFuZF9jbGVhbm1hcmtlcihzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYik7CisjZW5kaWYKKworI2VuZGlmIC8qIF9fSkZGUzJfTk9ERUxJU1RfSF9fICovCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9ub2RlbWdtdC5jIGIvZnMvamZmczIvbm9kZW1nbXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjUxMTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvamZmczIvbm9kZW1nbXQuYwpAQCAtMCwwICsxLDgzOCBAQAorLyoKKyAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIENyZWF0ZWQgYnkgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICoKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCisgKgorICogJElkOiBub2RlbWdtdC5jLHYgMS4xMTUgMjAwNC8xMS8yMiAxMTowNzoyMSBkd213MiBFeHAgJAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+IC8qIEZvciBjb25kX3Jlc2NoZWQoKSAqLworI2luY2x1ZGUgIm5vZGVsaXN0LmgiCisKKy8qKgorICoJamZmczJfcmVzZXJ2ZV9zcGFjZSAtIHJlcXVlc3QgcGh5c2ljYWwgc3BhY2UgdG8gd3JpdGUgbm9kZXMgdG8gZmxhc2gKKyAqCUBjOiBzdXBlcmJsb2NrIGluZm8KKyAqCUBtaW5zaXplOiBNaW5pbXVtIGFjY2VwdGFibGUgc2l6ZSBvZiBhbGxvY2F0aW9uCisgKglAb2ZzOiBSZXR1cm5lZCB2YWx1ZSBvZiBub2RlIG9mZnNldAorICoJQGxlbjogUmV0dXJuZWQgdmFsdWUgb2YgYWxsb2NhdGlvbiBsZW5ndGgKKyAqCUBwcmlvOiBBbGxvY2F0aW9uIHR5cGUgLSBBTExPQ197Tk9STUFMLERFTEVUSU9OfQorICoKKyAqCVJlcXVlc3RzIGEgYmxvY2sgb2YgcGh5c2ljYWwgc3BhY2Ugb24gdGhlIGZsYXNoLiBSZXR1cm5zIHplcm8gZm9yIHN1Y2Nlc3MKKyAqCWFuZCBwdXRzICdvZnMnIGFuZCAnbGVuJyBpbnRvIHRoZSBhcHByaW9wcmlhdGUgcGxhY2UsIG9yIHJldHVybnMgLUVOT1NQQworICoJb3Igb3RoZXIgZXJyb3IgaWYgYXBwcm9wcmlhdGUuCisgKgorICoJSWYgaXQgcmV0dXJucyB6ZXJvLCBqZmZzMl9yZXNlcnZlX3NwYWNlKCkgYWxzbyBkb3ducyB0aGUgcGVyLWZpbGVzeXN0ZW0KKyAqCWFsbG9jYXRpb24gc2VtYXBob3JlLCB0byBwcmV2ZW50IG1vcmUgdGhhbiBvbmUgYWxsb2NhdGlvbiBmcm9tIGJlaW5nCisgKglhY3RpdmUgYXQgYW55IHRpbWUuIFRoZSBzZW1hcGhvcmUgaXMgbGF0ZXIgcmVsZWFzZWQgYnkgamZmczJfY29tbWl0X2FsbG9jYXRpb24oKQorICoKKyAqCWpmZnMyX3Jlc2VydmVfc3BhY2UoKSBtYXkgdHJpZ2dlciBnYXJiYWdlIGNvbGxlY3Rpb24gaW4gb3JkZXIgdG8gbWFrZSByb29tCisgKglmb3IgdGhlIHJlcXVlc3RlZCBhbGxvY2F0aW9uLgorICovCisKK3N0YXRpYyBpbnQgamZmczJfZG9fcmVzZXJ2ZV9zcGFjZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgIHVpbnQzMl90IG1pbnNpemUsIHVpbnQzMl90ICpvZnMsIHVpbnQzMl90ICpsZW4pOworCitpbnQgamZmczJfcmVzZXJ2ZV9zcGFjZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgdWludDMyX3QgbWluc2l6ZSwgdWludDMyX3QgKm9mcywgdWludDMyX3QgKmxlbiwgaW50IHByaW8pCit7CisJaW50IHJldCA9IC1FQUdBSU47CisJaW50IGJsb2Nrc25lZWRlZCA9IGMtPnJlc3ZfYmxvY2tzX3dyaXRlOworCS8qIGFsaWduIGl0ICovCisJbWluc2l6ZSA9IFBBRChtaW5zaXplKTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9yZXNlcnZlX3NwYWNlKCk6IFJlcXVlc3RlZCAweCV4IGJ5dGVzXG4iLCBtaW5zaXplKSk7CisJZG93bigmYy0+YWxsb2Nfc2VtKTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9yZXNlcnZlX3NwYWNlKCk6IGFsbG9jIHNlbSBnb3RcbiIpKTsKKworCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCS8qIHRoaXMgbmVlZHMgYSBsaXR0bGUgbW9yZSB0aG91Z2h0ICh0cnVlIDx0Z2x4PiA6KSkgKi8KKwl3aGlsZShyZXQgPT0gLUVBR0FJTikgeworCQl3aGlsZShjLT5ucl9mcmVlX2Jsb2NrcyArIGMtPm5yX2VyYXNpbmdfYmxvY2tzIDwgYmxvY2tzbmVlZGVkKSB7CisJCQlpbnQgcmV0OworCQkJdWludDMyX3QgZGlydHksIGF2YWlsOworCisJCQkvKiBjYWxjdWxhdGUgcmVhbCBkaXJ0eSBzaXplCisJCQkgKiBkaXJ0eV9zaXplIGNvbnRhaW5zIGJsb2NrcyBvbiBlcmFzZV9wZW5kaW5nX2xpc3QKKwkJCSAqIHRob3NlIGJsb2NrcyBhcmUgY291bnRlZCBpbiBjLT5ucl9lcmFzaW5nX2Jsb2Nrcy4KKwkJCSAqIElmIG9uZSBibG9jayBpcyBhY3R1YWxseSBlcmFzZWQsIGl0IGlzIG5vdCBsb25nZXIgY291bnRlZCBhcyBkaXJ0eV9zcGFjZQorCQkJICogYnV0IGl0IGlzIGNvdW50ZWQgaW4gYy0+bnJfZXJhc2luZ19ibG9ja3MsIHNvIHdlIGFkZCBpdCBhbmQgc3VidHJhY3QgaXQKKwkJCSAqIHdpdGggYy0+bnJfZXJhc2luZ19ibG9ja3MgKiBjLT5zZWN0b3Jfc2l6ZSBhZ2Fpbi4KKwkJCSAqIEJsb2NrcyBvbiBlcmFzYWJsZV9saXN0IGFyZSBjb3VudGVkIGFzIGRpcnR5X3NpemUsIGJ1dCBub3QgaW4gYy0+bnJfZXJhc2luZ19ibG9ja3MKKwkJCSAqIFRoaXMgaGVscHMgdXMgdG8gZm9yY2UgZ2MgYW5kIHBpY2sgZXZlbnR1YWxseSBhIGNsZWFuIGJsb2NrIHRvIHNwcmVhZCB0aGUgbG9hZC4KKwkJCSAqIFdlIGFkZCB1bmNoZWNrZWRfc2l6ZSBoZXJlLCBhcyB3ZSBob3BlZnVsbHkgd2lsbCBmaW5kIHNvbWUgc3BhY2UgdG8gdXNlLgorCQkJICogVGhpcyB3aWxsIGFmZmVjdCB0aGUgc3VtIG9ubHkgb25jZSwgYXMgZ2MgZmlyc3QgZmluaXNoZXMgY2hlY2tpbmcKKwkJCSAqIG9mIG5vZGVzLgorCQkJICovCisJCQlkaXJ0eSA9IGMtPmRpcnR5X3NpemUgKyBjLT5lcmFzaW5nX3NpemUgLSBjLT5ucl9lcmFzaW5nX2Jsb2NrcyAqIGMtPnNlY3Rvcl9zaXplICsgYy0+dW5jaGVja2VkX3NpemU7CisJCQlpZiAoZGlydHkgPCBjLT5ub3NwY19kaXJ0eV9zaXplKSB7CisJCQkJaWYgKHByaW8gPT0gQUxMT0NfREVMRVRJT04gJiYgYy0+bnJfZnJlZV9ibG9ja3MgKyBjLT5ucl9lcmFzaW5nX2Jsb2NrcyA+PSBjLT5yZXN2X2Jsb2Nrc19kZWxldGlvbikgeworCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX3Jlc2VydmVfc3BhY2UoKTogTG93IG9uIGRpcnR5IHNwYWNlIHRvIEdDLCBidXQgaXQncyBhIGRlbGV0aW9uLiBBbGxvd2luZy4uLlxuIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiZGlydHkgc2l6ZSAweCUwOHggKyB1bmNoZWNrZWRfc2l6ZSAweCUwOHggPCBub3NwY19kaXJ0eV9zaXplIDB4JTA4eCwgcmV0dXJuaW5nIC1FTk9TUENcbiIsCisJCQkJCSAgZGlydHksIGMtPnVuY2hlY2tlZF9zaXplLCBjLT5zZWN0b3Jfc2l6ZSkpOworCisJCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQkJdXAoJmMtPmFsbG9jX3NlbSk7CisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQl9CisJCQkKKwkJCS8qIENhbGMgcG9zc2libHkgYXZhaWxhYmxlIHNwYWNlLiBQb3NzaWJseSBhdmFpbGFibGUgbWVhbnMgdGhhdCB3ZQorCQkJICogZG9uJ3Qga25vdywgaWYgdW5jaGVja2VkIHNpemUgY29udGFpbnMgb2Jzb2xldGVkIG5vZGVzLCB3aGljaCBjb3VsZCBnaXZlIHVzIHNvbWUKKwkJCSAqIG1vcmUgdXNhYmxlIHNwYWNlLiBUaGlzIHdpbGwgYWZmZWN0IHRoZSBzdW0gb25seSBvbmNlLCBhcyBnYyBmaXJzdCBmaW5pc2hlcyBjaGVja2luZworCQkJICogb2Ygbm9kZXMuCisJCQkgKyBSZXR1cm4gLUVOT1NQQywgaWYgdGhlIG1heGltdW0gcG9zc2libHkgYXZhaWxhYmxlIHNwYWNlIGlzIGxlc3Mgb3IgZXF1YWwgdGhhbiAKKwkJCSAqIGJsb2Nrc25lZWRlZCAqIHNlY3Rvcl9zaXplLgorCQkJICogVGhpcyBibG9ja3MgZW5kbGVzcyBnYyBsb29waW5nIG9uIGEgZmlsZXN5c3RlbSwgd2hpY2ggaXMgbmVhcmx5IGZ1bGwsIGV2ZW4gaWYKKwkJCSAqIHRoZSBjaGVjayBhYm92ZSBwYXNzZXMuCisJCQkgKi8KKwkJCWF2YWlsID0gYy0+ZnJlZV9zaXplICsgYy0+ZGlydHlfc2l6ZSArIGMtPmVyYXNpbmdfc2l6ZSArIGMtPnVuY2hlY2tlZF9zaXplOworCQkJaWYgKCAoYXZhaWwgLyBjLT5zZWN0b3Jfc2l6ZSkgPD0gYmxvY2tzbmVlZGVkKSB7CisJCQkJaWYgKHByaW8gPT0gQUxMT0NfREVMRVRJT04gJiYgYy0+bnJfZnJlZV9ibG9ja3MgKyBjLT5ucl9lcmFzaW5nX2Jsb2NrcyA+PSBjLT5yZXN2X2Jsb2Nrc19kZWxldGlvbikgeworCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX3Jlc2VydmVfc3BhY2UoKTogTG93IG9uIHBvc3NpYmx5IGF2YWlsYWJsZSBzcGFjZSwgYnV0IGl0J3MgYSBkZWxldGlvbi4gQWxsb3dpbmcuLi5cbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAibWF4LiBhdmFpbGFibGUgc2l6ZSAweCUwOHggIDwgYmxvY2tzbmVlZGVkICogc2VjdG9yX3NpemUgMHglMDh4LCByZXR1cm5pbmcgLUVOT1NQQ1xuIiwKKwkJCQkJICBhdmFpbCwgYmxvY2tzbmVlZGVkICogYy0+c2VjdG9yX3NpemUpKTsKKwkJCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJCQl1cCgmYy0+YWxsb2Nfc2VtKTsKKwkJCQlyZXR1cm4gLUVOT1NQQzsKKwkJCX0KKworCQkJdXAoJmMtPmFsbG9jX3NlbSk7CisKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJUcmlnZ2VyaW5nIEdDIHBhc3MuIG5yX2ZyZWVfYmxvY2tzICVkLCBucl9lcmFzaW5nX2Jsb2NrcyAlZCwgZnJlZV9zaXplIDB4JTA4eCwgZGlydHlfc2l6ZSAweCUwOHgsIHdhc3RlZF9zaXplIDB4JTA4eCwgdXNlZF9zaXplIDB4JTA4eCwgZXJhc2luZ19zaXplIDB4JTA4eCwgYmFkX3NpemUgMHglMDh4ICh0b3RhbCAweCUwOHggb2YgMHglMDh4KVxuIiwKKwkJCQkgIGMtPm5yX2ZyZWVfYmxvY2tzLCBjLT5ucl9lcmFzaW5nX2Jsb2NrcywgYy0+ZnJlZV9zaXplLCBjLT5kaXJ0eV9zaXplLCBjLT53YXN0ZWRfc2l6ZSwgYy0+dXNlZF9zaXplLCBjLT5lcmFzaW5nX3NpemUsIGMtPmJhZF9zaXplLAorCQkJCSAgYy0+ZnJlZV9zaXplICsgYy0+ZGlydHlfc2l6ZSArIGMtPndhc3RlZF9zaXplICsgYy0+dXNlZF9zaXplICsgYy0+ZXJhc2luZ19zaXplICsgYy0+YmFkX3NpemUsIGMtPmZsYXNoX3NpemUpKTsKKwkJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQkJCisJCQlyZXQgPSBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcyhjKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKworCQkJY29uZF9yZXNjaGVkKCk7CisKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXR1cm4gLUVJTlRSOworCisJCQlkb3duKCZjLT5hbGxvY19zZW0pOworCQkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQl9CisKKwkJcmV0ID0gamZmczJfZG9fcmVzZXJ2ZV9zcGFjZShjLCBtaW5zaXplLCBvZnMsIGxlbik7CisJCWlmIChyZXQpIHsKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9yZXNlcnZlX3NwYWNlOiByZXQgaXMgJWRcbiIsIHJldCkpOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCWlmIChyZXQpCisJCXVwKCZjLT5hbGxvY19zZW0pOworCXJldHVybiByZXQ7Cit9CisKK2ludCBqZmZzMl9yZXNlcnZlX3NwYWNlX2djKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCB1aW50MzJfdCBtaW5zaXplLCB1aW50MzJfdCAqb2ZzLCB1aW50MzJfdCAqbGVuKQoreworCWludCByZXQgPSAtRUFHQUlOOworCW1pbnNpemUgPSBQQUQobWluc2l6ZSk7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfcmVzZXJ2ZV9zcGFjZV9nYygpOiBSZXF1ZXN0ZWQgMHgleCBieXRlc1xuIiwgbWluc2l6ZSkpOworCisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCXdoaWxlKHJldCA9PSAtRUFHQUlOKSB7CisJCXJldCA9IGpmZnMyX2RvX3Jlc2VydmVfc3BhY2UoYywgbWluc2l6ZSwgb2ZzLCBsZW4pOworCQlpZiAocmV0KSB7CisJCSAgICAgICAgRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3Jlc2VydmVfc3BhY2VfZ2M6IGxvb3BpbmcsIHJldCBpcyAlZFxuIiwgcmV0KSk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyogQ2FsbGVkIHdpdGggYWxsb2Mgc2VtIF9hbmRfIGVyYXNlX2NvbXBsZXRpb25fbG9jayAqLworc3RhdGljIGludCBqZmZzMl9kb19yZXNlcnZlX3NwYWNlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCAgdWludDMyX3QgbWluc2l6ZSwgdWludDMyX3QgKm9mcywgdWludDMyX3QgKmxlbikKK3sKKwlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViID0gYy0+bmV4dGJsb2NrOworCQorIHJlc3RhcnQ6CisJaWYgKGplYiAmJiBtaW5zaXplID4gamViLT5mcmVlX3NpemUpIHsKKwkJLyogU2tpcCB0aGUgZW5kIG9mIHRoaXMgYmxvY2sgYW5kIGZpbGUgaXQgYXMgaGF2aW5nIHNvbWUgZGlydHkgc3BhY2UgKi8KKwkJLyogSWYgdGhlcmUncyBhIHBlbmRpbmcgd3JpdGUgdG8gaXQsIGZsdXNoIG5vdyAqLworCQlpZiAoamZmczJfd2J1Zl9kaXJ0eShjKSkgeworCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZG9fcmVzZXJ2ZV9zcGFjZTogRmx1c2hpbmcgd3JpdGUgYnVmZmVyXG4iKSk7CQkJICAgIAorCQkJamZmczJfZmx1c2hfd2J1Zl9wYWQoYyk7CisJCQlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQlqZWIgPSBjLT5uZXh0YmxvY2s7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKwkJYy0+d2FzdGVkX3NpemUgKz0gamViLT5mcmVlX3NpemU7CisJCWMtPmZyZWVfc2l6ZSAtPSBqZWItPmZyZWVfc2l6ZTsKKwkJamViLT53YXN0ZWRfc2l6ZSArPSBqZWItPmZyZWVfc2l6ZTsKKwkJamViLT5mcmVlX3NpemUgPSAwOworCQkKKwkJLyogQ2hlY2ssIGlmIHdlIGhhdmUgYSBkaXJ0eSBibG9jayBub3csIG9yIGlmIGl0IHdhcyBkaXJ0eSBhbHJlYWR5ICovCisJCWlmIChJU0RJUlRZIChqZWItPndhc3RlZF9zaXplICsgamViLT5kaXJ0eV9zaXplKSkgeworCQkJYy0+ZGlydHlfc2l6ZSArPSBqZWItPndhc3RlZF9zaXplOworCQkJYy0+d2FzdGVkX3NpemUgLT0gamViLT53YXN0ZWRfc2l6ZTsKKwkJCWplYi0+ZGlydHlfc2l6ZSArPSBqZWItPndhc3RlZF9zaXplOworCQkJamViLT53YXN0ZWRfc2l6ZSA9IDA7CisJCQlpZiAoVkVSWURJUlRZKGMsIGplYi0+ZGlydHlfc2l6ZSkpIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiQWRkaW5nIGZ1bGwgZXJhc2UgYmxvY2sgYXQgMHglMDh4IHRvIHZlcnlfZGlydHlfbGlzdCAoZnJlZSAweCUwOHgsIGRpcnR5IDB4JTA4eCwgdXNlZCAweCUwOHhcbiIsCisJCQkJICBqZWItPm9mZnNldCwgamViLT5mcmVlX3NpemUsIGplYi0+ZGlydHlfc2l6ZSwgamViLT51c2VkX3NpemUpKTsKKwkJCQlsaXN0X2FkZF90YWlsKCZqZWItPmxpc3QsICZjLT52ZXJ5X2RpcnR5X2xpc3QpOworCQkJfSBlbHNlIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiQWRkaW5nIGZ1bGwgZXJhc2UgYmxvY2sgYXQgMHglMDh4IHRvIGRpcnR5X2xpc3QgKGZyZWUgMHglMDh4LCBkaXJ0eSAweCUwOHgsIHVzZWQgMHglMDh4XG4iLAorCQkJCSAgamViLT5vZmZzZXQsIGplYi0+ZnJlZV9zaXplLCBqZWItPmRpcnR5X3NpemUsIGplYi0+dXNlZF9zaXplKSk7CisJCQkJbGlzdF9hZGRfdGFpbCgmamViLT5saXN0LCAmYy0+ZGlydHlfbGlzdCk7CisJCQl9CisJCX0gZWxzZSB7IAorCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkFkZGluZyBmdWxsIGVyYXNlIGJsb2NrIGF0IDB4JTA4eCB0byBjbGVhbl9saXN0IChmcmVlIDB4JTA4eCwgZGlydHkgMHglMDh4LCB1c2VkIDB4JTA4eFxuIiwKKwkJCSAgamViLT5vZmZzZXQsIGplYi0+ZnJlZV9zaXplLCBqZWItPmRpcnR5X3NpemUsIGplYi0+dXNlZF9zaXplKSk7CisJCQlsaXN0X2FkZF90YWlsKCZqZWItPmxpc3QsICZjLT5jbGVhbl9saXN0KTsKKwkJfQorCQljLT5uZXh0YmxvY2sgPSBqZWIgPSBOVUxMOworCX0KKwkKKwlpZiAoIWplYikgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0OworCQkvKiBUYWtlIHRoZSBuZXh0IGJsb2NrIG9mZiB0aGUgJ2ZyZWUnIGxpc3QgKi8KKworCQlpZiAobGlzdF9lbXB0eSgmYy0+ZnJlZV9saXN0KSkgeworCisJCQlpZiAoIWMtPm5yX2VyYXNpbmdfYmxvY2tzICYmIAorCQkJICAgICFsaXN0X2VtcHR5KCZjLT5lcmFzYWJsZV9saXN0KSkgeworCQkJCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICplamViOworCisJCQkJZWplYiA9IGxpc3RfZW50cnkoYy0+ZXJhc2FibGVfbGlzdC5uZXh0LCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCk7CisJCQkJbGlzdF9kZWwoJmVqZWItPmxpc3QpOworCQkJCWxpc3RfYWRkX3RhaWwoJmVqZWItPmxpc3QsICZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpOworCQkJCWMtPm5yX2VyYXNpbmdfYmxvY2tzKys7CisJCQkJamZmczJfZXJhc2VfcGVuZGluZ190cmlnZ2VyKGMpOworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9kb19yZXNlcnZlX3NwYWNlOiBUcmlnZ2VyaW5nIGVyYXNlIG9mIGVyYXNhYmxlIGJsb2NrIGF0IDB4JTA4eFxuIiwKKwkJCQkJICBlamViLT5vZmZzZXQpKTsKKwkJCX0KKworCQkJaWYgKCFjLT5ucl9lcmFzaW5nX2Jsb2NrcyAmJiAKKwkJCSAgICAhbGlzdF9lbXB0eSgmYy0+ZXJhc2FibGVfcGVuZGluZ193YnVmX2xpc3QpKSB7CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2RvX3Jlc2VydmVfc3BhY2U6IEZsdXNoaW5nIHdyaXRlIGJ1ZmZlclxuIikpOworCQkJCS8qIGMtPm5leHRibG9jayBpcyBOVUxMLCBubyB1cGRhdGUgdG8gYy0+bmV4dGJsb2NrIGFsbG93ZWQgKi8JCQkgICAgCisJCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQkJamZmczJfZmx1c2hfd2J1Zl9wYWQoYyk7CisJCQkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQkJCS8qIEhhdmUgYW5vdGhlciBnby4gSXQnbGwgYmUgb24gdGhlIGVyYXNhYmxlX2xpc3Qgbm93ICovCisJCQkJcmV0dXJuIC1FQUdBSU47CisJCQl9CisKKwkJCWlmICghYy0+bnJfZXJhc2luZ19ibG9ja3MpIHsKKwkJCQkvKiBPdWNoLiBXZSdyZSBpbiBHQywgb3Igd2Ugd291bGRuJ3QgaGF2ZSBnb3QgaGVyZS4KKwkJCQkgICBBbmQgdGhlcmUncyBubyBzcGFjZSBsZWZ0LiBBdCBhbGwuICovCisJCQkJcHJpbnRrKEtFUk5fQ1JJVCAiQXJnaC4gTm8gZnJlZSBzcGFjZSBsZWZ0IGZvciBHQy4gbnJfZXJhc2luZ19ibG9ja3MgaXMgJWQuIG5yX2ZyZWVfYmxvY2tzIGlzICVkLiAoZXJhc2FibGVlbXB0eTogJXMsIGVyYXNpbmdlbXB0eTogJXMsIGVyYXNlcGVuZGluZ2VtcHR5OiAlcylcbiIsIAorCQkJCSAgICAgICBjLT5ucl9lcmFzaW5nX2Jsb2NrcywgYy0+bnJfZnJlZV9ibG9ja3MsIGxpc3RfZW1wdHkoJmMtPmVyYXNhYmxlX2xpc3QpPyJ5ZXMiOiJubyIsIAorCQkJCSAgICAgICBsaXN0X2VtcHR5KCZjLT5lcmFzaW5nX2xpc3QpPyJ5ZXMiOiJubyIsIGxpc3RfZW1wdHkoJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCk/InllcyI6Im5vIik7CisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQl9CisKKwkJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQkJLyogRG9uJ3Qgd2FpdCBmb3IgaXQ7IGp1c3QgZXJhc2Ugb25lIHJpZ2h0IG5vdyAqLworCQkJamZmczJfZXJhc2VfcGVuZGluZ19ibG9ja3MoYywgMSk7CisJCQlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisKKwkJCS8qIEFuIGVyYXNlIG1heSBoYXZlIGZhaWxlZCwgZGVjcmVhc2luZyB0aGUKKwkJCSAgIGFtb3VudCBvZiBmcmVlIHNwYWNlIGF2YWlsYWJsZS4gU28gd2UgbXVzdAorCQkJICAgcmVzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgKi8KKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisKKwkJbmV4dCA9IGMtPmZyZWVfbGlzdC5uZXh0OworCQlsaXN0X2RlbChuZXh0KTsKKwkJYy0+bmV4dGJsb2NrID0gamViID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCk7CisJCWMtPm5yX2ZyZWVfYmxvY2tzLS07CisKKwkJaWYgKGplYi0+ZnJlZV9zaXplICE9IGMtPnNlY3Rvcl9zaXplIC0gYy0+Y2xlYW5tYXJrZXJfc2l6ZSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRWVwLiBCbG9jayAweCUwOHggdGFrZW4gZnJvbSBmcmVlX2xpc3QgaGFkIGZyZWVfc2l6ZSBvZiAweCUwOHghIVxuIiwgamViLT5vZmZzZXQsIGplYi0+ZnJlZV9zaXplKTsKKwkJCWdvdG8gcmVzdGFydDsKKwkJfQorCX0KKwkvKiBPSywgamViICg9PWMtPm5leHRibG9jaykgaXMgbm93IHBvaW50aW5nIGF0IGEgYmxvY2sgd2hpY2ggZGVmaW5pdGVseSBoYXMKKwkgICBlbm91Z2ggc3BhY2UgKi8KKwkqb2ZzID0gamViLT5vZmZzZXQgKyAoYy0+c2VjdG9yX3NpemUgLSBqZWItPmZyZWVfc2l6ZSk7CisJKmxlbiA9IGplYi0+ZnJlZV9zaXplOworCisJaWYgKGMtPmNsZWFubWFya2VyX3NpemUgJiYgamViLT51c2VkX3NpemUgPT0gYy0+Y2xlYW5tYXJrZXJfc2l6ZSAmJgorCSAgICAhamViLT5maXJzdF9ub2RlLT5uZXh0X2luX2lubykgeworCQkvKiBPbmx5IG5vZGUgaW4gaXQgYmVmb3JlaGFuZCB3YXMgYSBDTEVBTk1BUktFUiBub2RlICh3ZSB0aGluaykuIAorCQkgICBTbyBtYXJrIGl0IG9ic29sZXRlIG5vdyB0aGF0IHRoZXJlJ3MgZ29pbmcgdG8gYmUgYW5vdGhlciBub2RlCisJCSAgIGluIHRoZSBibG9jay4gVGhpcyB3aWxsIHJlZHVjZSB1c2VkX3NpemUgdG8gemVybyBidXQgV2UndmUgCisJCSAgIGFscmVhZHkgc2V0IGMtPm5leHRibG9jayBzbyB0aGF0IGpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZSgpCisJCSAgIHdvbid0IHRyeSB0byByZWZpbGUgaXQgdG8gdGhlIGRpcnR5X2xpc3QuCisJCSovCisJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgamViLT5maXJzdF9ub2RlKTsKKwkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCX0KKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9kb19yZXNlcnZlX3NwYWNlKCk6IEdpdmluZyAweCV4IGJ5dGVzIGF0IDB4JXhcbiIsICpsZW4sICpvZnMpKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglqZmZzMl9hZGRfcGh5c2ljYWxfbm9kZV9yZWYgLSBhZGQgYSBwaHlzaWNhbCBub2RlIHJlZmVyZW5jZSB0byB0aGUgbGlzdAorICoJQGM6IHN1cGVyYmxvY2sgaW5mbworICoJQG5ldzogbmV3IG5vZGUgcmVmZXJlbmNlIHRvIGFkZAorICoJQGxlbjogbGVuZ3RoIG9mIHRoaXMgcGh5c2ljYWwgbm9kZQorICoJQGRpcnR5OiBkaXJ0eSBmbGFnIGZvciBuZXcgbm9kZQorICoKKyAqCVNob3VsZCBvbmx5IGJlIHVzZWQgdG8gcmVwb3J0IG5vZGVzIGZvciB3aGljaCBzcGFjZSBoYXMgYmVlbiBhbGxvY2F0ZWQgCisgKglieSBqZmZzMl9yZXNlcnZlX3NwYWNlLgorICoKKyAqCU11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGFsbG9jX3NlbSBoZWxkLgorICovCisgCitpbnQgamZmczJfYWRkX3BoeXNpY2FsX25vZGVfcmVmKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpuZXcpCit7CisJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYjsKKwl1aW50MzJfdCBsZW47CisKKwlqZWIgPSAmYy0+YmxvY2tzW25ldy0+Zmxhc2hfb2Zmc2V0IC8gYy0+c2VjdG9yX3NpemVdOworCWxlbiA9IHJlZl90b3RsZW4oYywgamViLCBuZXcpOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2FkZF9waHlzaWNhbF9ub2RlX3JlZigpOiBOb2RlIGF0IDB4JXgoJWQpLCBzaXplIDB4JXhcbiIsIHJlZl9vZmZzZXQobmV3KSwgcmVmX2ZsYWdzKG5ldyksIGxlbikpOworI2lmIDEKKwlpZiAoamViICE9IGMtPm5leHRibG9jayB8fCAocmVmX29mZnNldChuZXcpKSAhPSBqZWItPm9mZnNldCArIChjLT5zZWN0b3Jfc2l6ZSAtIGplYi0+ZnJlZV9zaXplKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhcmdoLiBub2RlIGFkZGVkIGluIHdyb25nIHBsYWNlXG4iKTsKKwkJamZmczJfZnJlZV9yYXdfbm9kZV9yZWYobmV3KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2VuZGlmCisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJaWYgKCFqZWItPmZpcnN0X25vZGUpCisJCWplYi0+Zmlyc3Rfbm9kZSA9IG5ldzsKKwlpZiAoamViLT5sYXN0X25vZGUpCisJCWplYi0+bGFzdF9ub2RlLT5uZXh0X3BoeXMgPSBuZXc7CisJamViLT5sYXN0X25vZGUgPSBuZXc7CisKKwlqZWItPmZyZWVfc2l6ZSAtPSBsZW47CisJYy0+ZnJlZV9zaXplIC09IGxlbjsKKwlpZiAocmVmX29ic29sZXRlKG5ldykpIHsKKwkJamViLT5kaXJ0eV9zaXplICs9IGxlbjsKKwkJYy0+ZGlydHlfc2l6ZSArPSBsZW47CisJfSBlbHNlIHsKKwkJamViLT51c2VkX3NpemUgKz0gbGVuOworCQljLT51c2VkX3NpemUgKz0gbGVuOworCX0KKworCWlmICghamViLT5mcmVlX3NpemUgJiYgIWplYi0+ZGlydHlfc2l6ZSkgeworCQkvKiBJZiBpdCBsaXZlcyBvbiB0aGUgZGlydHlfbGlzdCwgamZmczJfcmVzZXJ2ZV9zcGFjZSB3aWxsIHB1dCBpdCB0aGVyZSAqLworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiQWRkaW5nIGZ1bGwgZXJhc2UgYmxvY2sgYXQgMHglMDh4IHRvIGNsZWFuX2xpc3QgKGZyZWUgMHglMDh4LCBkaXJ0eSAweCUwOHgsIHVzZWQgMHglMDh4XG4iLAorCQkJICBqZWItPm9mZnNldCwgamViLT5mcmVlX3NpemUsIGplYi0+ZGlydHlfc2l6ZSwgamViLT51c2VkX3NpemUpKTsKKwkJaWYgKGpmZnMyX3didWZfZGlydHkoYykpIHsKKwkJCS8qIEZsdXNoIHRoZSBsYXN0IHdyaXRlIGluIHRoZSBibG9jayBpZiBpdCdzIG91dHN0YW5kaW5nICovCisJCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJCWpmZnMyX2ZsdXNoX3didWZfcGFkKGMpOworCQkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQl9CisKKwkJbGlzdF9hZGRfdGFpbCgmamViLT5saXN0LCAmYy0+Y2xlYW5fbGlzdCk7CisJCWMtPm5leHRibG9jayA9IE5VTEw7CisJfQorCUFDQ1RfU0FOSVRZX0NIRUNLKGMsamViKTsKKwlEMShBQ0NUX1BBUkFOT0lBX0NIRUNLKGplYikpOworCisJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbigpXG4iKSk7CisJamZmczJfZ2FyYmFnZV9jb2xsZWN0X3RyaWdnZXIoYyk7CisJdXAoJmMtPmFsbG9jX3NlbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG9uX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqb2JqLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnRoaXM7CisKKwlsaXN0X2Zvcl9lYWNoKHRoaXMsIGhlYWQpIHsKKwkJaWYgKHRoaXMgPT0gb2JqKSB7CisJCQlEMShwcmludGsoIiVwIGlzIG9uIGxpc3QgYXQgJXBcbiIsIG9iaiwgaGVhZCkpOworCQkJcmV0dXJuIDE7CisKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnJlZikKK3sKKwlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViOworCWludCBibG9ja25yOworCXN0cnVjdCBqZmZzMl91bmtub3duX25vZGUgbjsKKwlpbnQgcmV0LCBhZGRlZHNpemU7CisJc2l6ZV90IHJldGxlbjsKKworCWlmKCFyZWYpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJFRUVFRUsuIGpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZSBjYWxsZWQgd2l0aCBOVUxMIG5vZGVcbiIpOworCQlyZXR1cm47CisJfQorCWlmIChyZWZfb2Jzb2xldGUocmVmKSkgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfbWFya19ub2RlX29ic29sZXRlIGNhbGxlZCB3aXRoIGFscmVhZHkgb2Jzb2xldGUgbm9kZSBhdCAweCUwOHhcbiIsIHJlZl9vZmZzZXQocmVmKSkpOworCQlyZXR1cm47CisJfQorCWJsb2NrbnIgPSByZWYtPmZsYXNoX29mZnNldCAvIGMtPnNlY3Rvcl9zaXplOworCWlmIChibG9ja25yID49IGMtPm5yX2Jsb2NrcykgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgInJhdyBub2RlIGF0IDB4JTA4eCBpcyBvZmYgdGhlIGVuZCBvZiBkZXZpY2UhXG4iLCByZWYtPmZsYXNoX29mZnNldCk7CisJCUJVRygpOworCX0KKwlqZWIgPSAmYy0+YmxvY2tzW2Jsb2NrbnJdOworCisJaWYgKGpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKGMpICYmICFqZmZzMl9pc19yZWFkb25seShjKSAmJgorCSAgICAhKGMtPmZsYWdzICYgSkZGUzJfU0JfRkxBR19NT1VOVElORykpIHsKKwkJLyogSG0uIFRoaXMgbWF5IGNvbmZ1c2Ugc3RhdGljIGxvY2sgYW5hbHlzaXMuIElmIGFueSBvZiB0aGUgYWJvdmUgCisJCSAgIHRocmVlIGNvbmRpdGlvbnMgaXMgZmFsc2UsIHdlJ3JlIGdvaW5nIHRvIHJldHVybiBmcm9tIHRoaXMgCisJCSAgIGZ1bmN0aW9uIHdpdGhvdXQgYWN0dWFsbHkgb2JsaXRlcmF0aW5nIGFueSBub2RlcyBvciBmcmVlaW5nCisJCSAgIGFueSBqZmZzMl9yYXdfbm9kZV9yZWZzLiBTbyB3ZSBkb24ndCBuZWVkIHRvIHN0b3AgZXJhc2VzIGZyb20KKwkJICAgaGFwcGVuaW5nLCBvciBwcm90ZWN0IGFnYWluc3QgcGVvcGxlIGhvbGRpbmcgYW4gb2Jzb2xldGUKKwkJICAgamZmczJfcmF3X25vZGVfcmVmIHdpdGhvdXQgdGhlIGVyYXNlX2NvbXBsZXRpb25fbG9jay4gKi8KKwkJZG93bigmYy0+ZXJhc2VfZnJlZV9zZW0pOworCX0KKworCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCWlmIChyZWZfZmxhZ3MocmVmKSA9PSBSRUZfVU5DSEVDS0VEKSB7CisJCUQxKGlmICh1bmxpa2VseShqZWItPnVuY2hlY2tlZF9zaXplIDwgcmVmX3RvdGxlbihjLCBqZWIsIHJlZikpKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgInJhdyB1bmNoZWNrZWQgbm9kZSBvZiBzaXplIDB4JTA4eCBmcmVlZCBmcm9tIGVyYXNlIGJsb2NrICVkIGF0IDB4JTA4eCwgYnV0IHVuY2hlY2tlZF9zaXplIHdhcyBhbHJlYWR5IDB4JTA4eFxuIiwKKwkJCSAgICAgICByZWZfdG90bGVuKGMsIGplYiwgcmVmKSwgYmxvY2tuciwgcmVmLT5mbGFzaF9vZmZzZXQsIGplYi0+dXNlZF9zaXplKTsKKwkJCUJVRygpOworCQl9KQorCQlEMShwcmludGsoS0VSTl9ERUJVRyAiT2Jzb2xldGluZyBwcmV2aW91c2x5IHVuY2hlY2tlZCBub2RlIGF0IDB4JTA4eCBvZiBsZW4gJXg6ICIsIHJlZl9vZmZzZXQocmVmKSwgcmVmX3RvdGxlbihjLCBqZWIsIHJlZikpKTsKKwkJamViLT51bmNoZWNrZWRfc2l6ZSAtPSByZWZfdG90bGVuKGMsIGplYiwgcmVmKTsKKwkJYy0+dW5jaGVja2VkX3NpemUgLT0gcmVmX3RvdGxlbihjLCBqZWIsIHJlZik7CisJfSBlbHNlIHsKKwkJRDEoaWYgKHVubGlrZWx5KGplYi0+dXNlZF9zaXplIDwgcmVmX3RvdGxlbihjLCBqZWIsIHJlZikpKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgInJhdyBub2RlIG9mIHNpemUgMHglMDh4IGZyZWVkIGZyb20gZXJhc2UgYmxvY2sgJWQgYXQgMHglMDh4LCBidXQgdXNlZF9zaXplIHdhcyBhbHJlYWR5IDB4JTA4eFxuIiwKKwkJCSAgICAgICByZWZfdG90bGVuKGMsIGplYiwgcmVmKSwgYmxvY2tuciwgcmVmLT5mbGFzaF9vZmZzZXQsIGplYi0+dXNlZF9zaXplKTsKKwkJCUJVRygpOworCQl9KQorCQlEMShwcmludGsoS0VSTl9ERUJVRyAiT2Jzb2xldGluZyBub2RlIGF0IDB4JTA4eCBvZiBsZW4gJXg6ICIsIHJlZl9vZmZzZXQocmVmKSwgcmVmX3RvdGxlbihjLCBqZWIsIHJlZikpKTsKKwkJamViLT51c2VkX3NpemUgLT0gcmVmX3RvdGxlbihjLCBqZWIsIHJlZik7CisJCWMtPnVzZWRfc2l6ZSAtPSByZWZfdG90bGVuKGMsIGplYiwgcmVmKTsKKwl9CisKKwkvLyBUYWtlIGNhcmUsIHRoYXQgd2FzdGVkIHNpemUgaXMgdGFrZW4gaW50byBjb25jZXJuCisJaWYgKChqZWItPmRpcnR5X3NpemUgfHwgSVNESVJUWShqZWItPndhc3RlZF9zaXplICsgcmVmX3RvdGxlbihjLCBqZWIsIHJlZikpKSAmJiBqZWIgIT0gYy0+bmV4dGJsb2NrKSB7CisJCUQxKHByaW50aygiRGlydHlpbmdcbiIpKTsKKwkJYWRkZWRzaXplID0gcmVmX3RvdGxlbihjLCBqZWIsIHJlZik7CisJCWplYi0+ZGlydHlfc2l6ZSArPSByZWZfdG90bGVuKGMsIGplYiwgcmVmKTsKKwkJYy0+ZGlydHlfc2l6ZSArPSByZWZfdG90bGVuKGMsIGplYiwgcmVmKTsKKworCQkvKiBDb252ZXJ0IHdhc3RlZCBzcGFjZSB0byBkaXJ0eSwgaWYgbm90IGEgYmFkIGJsb2NrICovCisJCWlmIChqZWItPndhc3RlZF9zaXplKSB7CisJCQlpZiAob25fbGlzdCgmamViLT5saXN0LCAmYy0+YmFkX3VzZWRfbGlzdCkpIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiTGVhdmluZyBibG9jayBhdCAlMDh4IG9uIHRoZSBiYWRfdXNlZF9saXN0XG4iLAorCQkJCQkgIGplYi0+b2Zmc2V0KSk7CisJCQkJYWRkZWRzaXplID0gMDsgLyogVG8gZm9vbCB0aGUgcmVmaWxpbmcgY29kZSBsYXRlciAqLworCQkJfSBlbHNlIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiQ29udmVydGluZyAlZCBieXRlcyBvZiB3YXN0ZWQgc3BhY2UgdG8gZGlydHkgaW4gYmxvY2sgYXQgJTA4eFxuIiwKKwkJCQkJICBqZWItPndhc3RlZF9zaXplLCBqZWItPm9mZnNldCkpOworCQkJCWFkZGVkc2l6ZSArPSBqZWItPndhc3RlZF9zaXplOworCQkJCWplYi0+ZGlydHlfc2l6ZSArPSBqZWItPndhc3RlZF9zaXplOworCQkJCWMtPmRpcnR5X3NpemUgKz0gamViLT53YXN0ZWRfc2l6ZTsKKwkJCQljLT53YXN0ZWRfc2l6ZSAtPSBqZWItPndhc3RlZF9zaXplOworCQkJCWplYi0+d2FzdGVkX3NpemUgPSAwOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJRDEocHJpbnRrKCJXYXN0aW5nXG4iKSk7CisJCWFkZGVkc2l6ZSA9IDA7CisJCWplYi0+d2FzdGVkX3NpemUgKz0gcmVmX3RvdGxlbihjLCBqZWIsIHJlZik7CisJCWMtPndhc3RlZF9zaXplICs9IHJlZl90b3RsZW4oYywgamViLCByZWYpOwkKKwl9CisJcmVmLT5mbGFzaF9vZmZzZXQgPSByZWZfb2Zmc2V0KHJlZikgfCBSRUZfT0JTT0xFVEU7CisJCisJQUNDVF9TQU5JVFlfQ0hFQ0soYywgamViKTsKKworCUQxKEFDQ1RfUEFSQU5PSUFfQ0hFQ0soamViKSk7CisKKwlpZiAoYy0+ZmxhZ3MgJiBKRkZTMl9TQl9GTEFHX01PVU5USU5HKSB7CisJCS8qIE1vdW50IGluIHByb2dyZXNzLiBEb24ndCBtdWNrIGFib3V0IHdpdGggdGhlIGJsb2NrCisJCSAgIGxpc3RzIGJlY2F1c2UgdGhleSdyZSBub3QgcmVhZHkgeWV0LCBhbmQgZG9uJ3QgYWN0dWFsbHkKKwkJICAgb2JsaXRlcmF0ZSBub2RlcyB0aGF0IGxvb2sgb2Jzb2xldGUuIElmIHRoZXkgd2VyZW4ndCAKKwkJICAgbWFya2VkIG9ic29sZXRlIG9uIHRoZSBmbGFzaCBhdCB0aGUgdGltZSB0aGV5IF9iZWNhbWVfCisJCSAgIG9ic29sZXRlLCB0aGVyZSB3YXMgcHJvYmFibHkgYSByZWFzb24gZm9yIHRoYXQuICovCisJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQkvKiBXZSBkaWRuJ3QgbG9jayB0aGUgZXJhc2VfZnJlZV9zZW0gKi8KKwkJcmV0dXJuOworCX0KKworCWlmIChqZWIgPT0gYy0+bmV4dGJsb2NrKSB7CisJCUQyKHByaW50ayhLRVJOX0RFQlVHICJOb3QgbW92aW5nIG5leHRibG9jayAweCUwOHggdG8gZGlydHkvZXJhc2VfcGVuZGluZyBsaXN0XG4iLCBqZWItPm9mZnNldCkpOworCX0gZWxzZSBpZiAoIWplYi0+dXNlZF9zaXplICYmICFqZWItPnVuY2hlY2tlZF9zaXplKSB7CisJCWlmIChqZWIgPT0gYy0+Z2NibG9jaykgeworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgImdjYmxvY2sgYXQgMHglMDh4IGNvbXBsZXRlbHkgZGlydGllZC4gQ2xlYXJpbmcgZ2NibG9jay4uLlxuIiwgamViLT5vZmZzZXQpKTsKKwkJCWMtPmdjYmxvY2sgPSBOVUxMOworCQl9IGVsc2UgeworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkVyYXNlYmxvY2sgYXQgMHglMDh4IGNvbXBsZXRlbHkgZGlydGllZC4gUmVtb3ZpbmcgZnJvbSAoZGlydHk/KSBsaXN0Li4uXG4iLCBqZWItPm9mZnNldCkpOworCQkJbGlzdF9kZWwoJmplYi0+bGlzdCk7CisJCX0KKwkJaWYgKGpmZnMyX3didWZfZGlydHkoYykpIHsKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICIuLi5hbmQgYWRkaW5nIHRvIGVyYXNhYmxlX3BlbmRpbmdfd2J1Zl9saXN0XG4iKSk7CisJCQlsaXN0X2FkZF90YWlsKCZqZWItPmxpc3QsICZjLT5lcmFzYWJsZV9wZW5kaW5nX3didWZfbGlzdCk7CisJCX0gZWxzZSB7CisJCQlpZiAoamlmZmllcyAmIDEyNykgeworCQkJCS8qIE1vc3Qgb2YgdGhlIHRpbWUsIHdlIGp1c3QgZXJhc2UgaXQgaW1tZWRpYXRlbHkuIE90aGVyd2lzZSB3ZQorCQkJCSAgIHNwZW5kIGFnZXMgc2Nhbm5pbmcgaXQgb24gbW91bnQsIGV0Yy4gKi8KKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiLi4uYW5kIGFkZGluZyB0byBlcmFzZV9wZW5kaW5nX2xpc3RcbiIpKTsKKwkJCQlsaXN0X2FkZF90YWlsKCZqZWItPmxpc3QsICZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpOworCQkJCWMtPm5yX2VyYXNpbmdfYmxvY2tzKys7CisJCQkJamZmczJfZXJhc2VfcGVuZGluZ190cmlnZ2VyKGMpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBTb21ldGltZXMsIGhvd2V2ZXIsIHdlIGxlYXZlIGl0IGVsc2V3aGVyZSBzbyBpdCBkb2Vzbid0IGdldAorCQkJCSAgIGltbWVkaWF0ZWx5IHJldXNlZCwgYW5kIHdlIHNwcmVhZCB0aGUgbG9hZCBhIGJpdC4gKi8KKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiLi4uYW5kIGFkZGluZyB0byBlcmFzYWJsZV9saXN0XG4iKSk7CisJCQkJbGlzdF9hZGRfdGFpbCgmamViLT5saXN0LCAmYy0+ZXJhc2FibGVfbGlzdCk7CisJCQl9CQkJCQorCQl9CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJEb25lIE9LXG4iKSk7CisJfSBlbHNlIGlmIChqZWIgPT0gYy0+Z2NibG9jaykgeworCQlEMihwcmludGsoS0VSTl9ERUJVRyAiTm90IG1vdmluZyBnY2Jsb2NrIDB4JTA4eCB0byBkaXJ0eV9saXN0XG4iLCBqZWItPm9mZnNldCkpOworCX0gZWxzZSBpZiAoSVNESVJUWShqZWItPmRpcnR5X3NpemUpICYmICFJU0RJUlRZKGplYi0+ZGlydHlfc2l6ZSAtIGFkZGVkc2l6ZSkpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkVyYXNlYmxvY2sgYXQgMHglMDh4IGlzIGZyZXNobHkgZGlydGllZC4gUmVtb3ZpbmcgZnJvbSBjbGVhbiBsaXN0Li4uXG4iLCBqZWItPm9mZnNldCkpOworCQlsaXN0X2RlbCgmamViLT5saXN0KTsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIi4uLmFuZCBhZGRpbmcgdG8gZGlydHlfbGlzdFxuIikpOworCQlsaXN0X2FkZF90YWlsKCZqZWItPmxpc3QsICZjLT5kaXJ0eV9saXN0KTsKKwl9IGVsc2UgaWYgKFZFUllESVJUWShjLCBqZWItPmRpcnR5X3NpemUpICYmCisJCSAgICFWRVJZRElSVFkoYywgamViLT5kaXJ0eV9zaXplIC0gYWRkZWRzaXplKSkgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRXJhc2VibG9jayBhdCAweCUwOHggaXMgbm93IHZlcnkgZGlydHkuIFJlbW92aW5nIGZyb20gZGlydHkgbGlzdC4uLlxuIiwgamViLT5vZmZzZXQpKTsKKwkJbGlzdF9kZWwoJmplYi0+bGlzdCk7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICIuLi5hbmQgYWRkaW5nIHRvIHZlcnlfZGlydHlfbGlzdFxuIikpOworCQlsaXN0X2FkZF90YWlsKCZqZWItPmxpc3QsICZjLT52ZXJ5X2RpcnR5X2xpc3QpOworCX0gZWxzZSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFcmFzZWJsb2NrIGF0IDB4JTA4eCBub3QgbW92ZWQgYW55d2hlcmUuIChmcmVlIDB4JTA4eCwgZGlydHkgMHglMDh4LCB1c2VkIDB4JTA4eClcbiIsCisJCQkgIGplYi0+b2Zmc2V0LCBqZWItPmZyZWVfc2l6ZSwgamViLT5kaXJ0eV9zaXplLCBqZWItPnVzZWRfc2l6ZSkpOyAKKwl9CQkJICAJCisKKwlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCWlmICghamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykgfHwgamZmczJfaXNfcmVhZG9ubHkoYykpIHsKKwkJLyogV2UgZGlkbid0IGxvY2sgdGhlIGVyYXNlX2ZyZWVfc2VtICovCisJCXJldHVybjsKKwl9CisKKwkvKiBUaGUgZXJhc2VfZnJlZV9zZW0gaXMgbG9ja2VkLCBhbmQgaGFzIGJlZW4gc2luY2UgYmVmb3JlIHdlIG1hcmtlZCB0aGUgbm9kZSBvYnNvbGV0ZQorCSAgIGFuZCBwb3RlbnRpYWxseSBwdXQgaXRzIGVyYXNlYmxvY2sgb250byB0aGUgZXJhc2VfcGVuZGluZ19saXN0LiBUaHVzLCB3ZSBrbm93IHRoYXQKKwkgICB0aGUgYmxvY2sgaGFzbid0IF9hbHJlYWR5XyBiZWVuIGVyYXNlZCwgYW5kIHRoYXQgJ3JlZicgaXRzZWxmIGhhc24ndCBiZWVuIGZyZWVkIHlldAorCSAgIGJ5IGpmZnMyX2ZyZWVfYWxsX25vZGVfcmVmcygpIGluIGVyYXNlLmMuIFdoaWNoIGlzIG5pY2UuICovCisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAib2JsaXRlcmF0aW5nIG9ic29sZXRlZCBub2RlIGF0IDB4JTA4eFxuIiwgcmVmX29mZnNldChyZWYpKSk7CisJcmV0ID0gamZmczJfZmxhc2hfcmVhZChjLCByZWZfb2Zmc2V0KHJlZiksIHNpemVvZihuKSwgJnJldGxlbiwgKGNoYXIgKikmbik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJSZWFkIGVycm9yIHJlYWRpbmcgZnJvbSBvYnNvbGV0ZWQgbm9kZSBhdCAweCUwOHg6ICVkXG4iLCByZWZfb2Zmc2V0KHJlZiksIHJldCk7CisJCWdvdG8gb3V0X2VyYXNlX3NlbTsKKwl9CisJaWYgKHJldGxlbiAhPSBzaXplb2YobikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU2hvcnQgcmVhZCBmcm9tIG9ic29sZXRlZCBub2RlIGF0IDB4JTA4eDogJXpkXG4iLCByZWZfb2Zmc2V0KHJlZiksIHJldGxlbik7CisJCWdvdG8gb3V0X2VyYXNlX3NlbTsKKwl9CisJaWYgKFBBRChqZTMyX3RvX2NwdShuLnRvdGxlbikpICE9IFBBRChyZWZfdG90bGVuKGMsIGplYiwgcmVmKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm9kZSB0b3RsZW4gb24gZmxhc2ggKDB4JTA4eCkgIT0gdG90bGVuIGZyb20gbm9kZSByZWYgKDB4JTA4eClcbiIsIGplMzJfdG9fY3B1KG4udG90bGVuKSwgcmVmX3RvdGxlbihjLCBqZWIsIHJlZikpOworCQlnb3RvIG91dF9lcmFzZV9zZW07CisJfQorCWlmICghKGplMTZfdG9fY3B1KG4ubm9kZXR5cGUpICYgSkZGUzJfTk9ERV9BQ0NVUkFURSkpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk5vZGUgYXQgMHglMDh4IHdhcyBhbHJlYWR5IG1hcmtlZCBvYnNvbGV0ZSAobm9kZXR5cGUgMHglMDR4KVxuIiwgcmVmX29mZnNldChyZWYpLCBqZTE2X3RvX2NwdShuLm5vZGV0eXBlKSkpOworCQlnb3RvIG91dF9lcmFzZV9zZW07CisJfQorCS8qIFhYWCBGSVhNRTogVGhpcyBpcyB1Z2x5IG5vdyAqLworCW4ubm9kZXR5cGUgPSBjcHVfdG9famUxNihqZTE2X3RvX2NwdShuLm5vZGV0eXBlKSAmIH5KRkZTMl9OT0RFX0FDQ1VSQVRFKTsKKwlyZXQgPSBqZmZzMl9mbGFzaF93cml0ZShjLCByZWZfb2Zmc2V0KHJlZiksIHNpemVvZihuKSwgJnJldGxlbiwgKGNoYXIgKikmbik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJXcml0ZSBlcnJvciBpbiBvYmxpdGVyYXRpbmcgb2Jzb2xldGVkIG5vZGUgYXQgMHglMDh4OiAlZFxuIiwgcmVmX29mZnNldChyZWYpLCByZXQpOworCQlnb3RvIG91dF9lcmFzZV9zZW07CisJfQorCWlmIChyZXRsZW4gIT0gc2l6ZW9mKG4pKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNob3J0IHdyaXRlIGluIG9ibGl0ZXJhdGluZyBvYnNvbGV0ZWQgbm9kZSBhdCAweCUwOHg6ICV6ZFxuIiwgcmVmX29mZnNldChyZWYpLCByZXRsZW4pOworCQlnb3RvIG91dF9lcmFzZV9zZW07CisJfQorCisJLyogTm9kZXMgd2hpY2ggaGF2ZSBiZWVuIG1hcmtlZCBvYnNvbGV0ZSBubyBsb25nZXIgbmVlZCB0byBiZQorCSAgIGFzc29jaWF0ZWQgd2l0aCBhbnkgaW5vZGUuIFJlbW92ZSB0aGVtIGZyb20gdGhlIHBlci1pbm9kZSBsaXN0LgorCSAgIAorCSAgIE5vdGUgd2UgY2FuJ3QgZG8gdGhpcyBmb3IgTkFORCBhdCB0aGUgbW9tZW50IGJlY2F1c2Ugd2UgbmVlZCAKKwkgICBvYnNvbGV0ZSBkaXJlbnQgbm9kZXMgdG8gc3RheSBvbiB0aGUgbGlzdHMsIGJlY2F1c2Ugb2YgdGhlCisJICAgaG9ycmlkbmVzcyBpbiBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfZGVsZXRpb25fZGlyZW50KCkuIEFsc28KKwkgICBiZWNhdXNlIHdlIGRlbGV0ZSB0aGUgaW5vY2FjaGUsIGFuZCBvbiBOQU5EIHdlIG5lZWQgdGhhdCB0byAKKwkgICBzdGF5IGFyb3VuZCB1bnRpbCBhbGwgdGhlIG5vZGVzIGFyZSBhY3R1YWxseSBlcmFzZWQsIGluIG9yZGVyCisJICAgdG8gc3RvcCB1cyBmcm9tIGdpdmluZyB0aGUgc2FtZSBpbm9kZSBudW1iZXIgdG8gYW5vdGhlciBuZXdseQorCSAgIGNyZWF0ZWQgaW5vZGUuICovCisJaWYgKHJlZi0+bmV4dF9pbl9pbm8pIHsKKwkJc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICppYzsKKwkJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqKnA7CisKKwkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJCWljID0gamZmczJfcmF3X3JlZl90b19pYyhyZWYpOworCQlmb3IgKHAgPSAmaWMtPm5vZGVzOyAoKnApICE9IHJlZjsgcCA9ICYoKCpwKS0+bmV4dF9pbl9pbm8pKQorCQkJOworCisJCSpwID0gcmVmLT5uZXh0X2luX2lubzsKKwkJcmVmLT5uZXh0X2luX2lubyA9IE5VTEw7CisKKwkJaWYgKGljLT5ub2RlcyA9PSAodm9pZCAqKWljKSB7CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiaW5vY2FjaGUgZm9yIGlubyAjJXUgaXMgYWxsIGdvbmUgbm93LiBGcmVlaW5nXG4iLCBpYy0+aW5vKSk7CisJCQlqZmZzMl9kZWxfaW5vX2NhY2hlKGMsIGljKTsKKwkJCWpmZnMyX2ZyZWVfaW5vZGVfY2FjaGUoaWMpOworCQl9CisKKwkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJfQorCisKKwkvKiBNZXJnZSB3aXRoIHRoZSBuZXh0IG5vZGUgaW4gdGhlIHBoeXNpY2FsIGxpc3QsIGlmIHRoZXJlIGlzIG9uZQorCSAgIGFuZCBpZiBpdCdzIGFsc28gb2Jzb2xldGUgYW5kIGlmIGl0IGRvZXNuJ3QgYmVsb25nIHRvIGFueSBpbm9kZSAqLworCWlmIChyZWYtPm5leHRfcGh5cyAmJiByZWZfb2Jzb2xldGUocmVmLT5uZXh0X3BoeXMpICYmCisJICAgICFyZWYtPm5leHRfcGh5cy0+bmV4dF9pbl9pbm8pIHsKKwkJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqbiA9IHJlZi0+bmV4dF9waHlzOworCQkKKwkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJCXJlZi0+X190b3RsZW4gKz0gbi0+X190b3RsZW47CisJCXJlZi0+bmV4dF9waHlzID0gbi0+bmV4dF9waHlzOworICAgICAgICAgICAgICAgIGlmIChqZWItPmxhc3Rfbm9kZSA9PSBuKSBqZWItPmxhc3Rfbm9kZSA9IHJlZjsKKwkJaWYgKGplYi0+Z2Nfbm9kZSA9PSBuKSB7CisJCQkvKiBnYyB3aWxsIGJlIGhhcHB5IGNvbnRpbnVpbmcgZ2Mgb24gdGhpcyBub2RlICovCisJCQlqZWItPmdjX25vZGU9cmVmOworCQl9CisJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJCWpmZnMyX2ZyZWVfcmF3X25vZGVfcmVmKG4pOworCX0KKwkKKwkvKiBBbHNvIG1lcmdlIHdpdGggdGhlIHByZXZpb3VzIG5vZGUgaW4gdGhlIGxpc3QsIGlmIHRoZXJlIGlzIG9uZQorCSAgIGFuZCB0aGF0IG9uZSBpcyBvYnNvbGV0ZSAqLworCWlmIChyZWYgIT0gamViLT5maXJzdF9ub2RlICkgeworCQlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpwID0gamViLT5maXJzdF9ub2RlOworCisJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCQl3aGlsZSAocC0+bmV4dF9waHlzICE9IHJlZikKKwkJCXAgPSBwLT5uZXh0X3BoeXM7CisJCQorCQlpZiAocmVmX29ic29sZXRlKHApICYmICFyZWYtPm5leHRfaW5faW5vKSB7CisJCQlwLT5fX3RvdGxlbiArPSByZWYtPl9fdG90bGVuOworCQkJaWYgKGplYi0+bGFzdF9ub2RlID09IHJlZikgeworCQkJCWplYi0+bGFzdF9ub2RlID0gcDsKKwkJCX0KKwkJCWlmIChqZWItPmdjX25vZGUgPT0gcmVmKSB7CisJCQkJLyogZ2Mgd2lsbCBiZSBoYXBweSBjb250aW51aW5nIGdjIG9uIHRoaXMgbm9kZSAqLworCQkJCWplYi0+Z2Nfbm9kZT1wOworCQkJfQorCQkJcC0+bmV4dF9waHlzID0gcmVmLT5uZXh0X3BoeXM7CisJCQlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZihyZWYpOworCQl9CisJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCX0KKyBvdXRfZXJhc2Vfc2VtOgorCXVwKCZjLT5lcmFzZV9mcmVlX3NlbSk7Cit9CisKKyNpZiBDT05GSUdfSkZGUzJfRlNfREVCVUcgPj0gMgordm9pZCBqZmZzMl9kdW1wX2Jsb2NrX2xpc3RzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCisKKwlwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZHVtcF9ibG9ja19saXN0czpcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJmbGFzaF9zaXplOiAlMDh4XG4iLCBjLT5mbGFzaF9zaXplKTsKKwlwcmludGsoS0VSTl9ERUJVRyAidXNlZF9zaXplOiAlMDh4XG4iLCBjLT51c2VkX3NpemUpOworCXByaW50ayhLRVJOX0RFQlVHICJkaXJ0eV9zaXplOiAlMDh4XG4iLCBjLT5kaXJ0eV9zaXplKTsKKwlwcmludGsoS0VSTl9ERUJVRyAid2FzdGVkX3NpemU6ICUwOHhcbiIsIGMtPndhc3RlZF9zaXplKTsKKwlwcmludGsoS0VSTl9ERUJVRyAidW5jaGVja2VkX3NpemU6ICUwOHhcbiIsIGMtPnVuY2hlY2tlZF9zaXplKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiZnJlZV9zaXplOiAlMDh4XG4iLCBjLT5mcmVlX3NpemUpOworCXByaW50ayhLRVJOX0RFQlVHICJlcmFzaW5nX3NpemU6ICUwOHhcbiIsIGMtPmVyYXNpbmdfc2l6ZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgImJhZF9zaXplOiAlMDh4XG4iLCBjLT5iYWRfc2l6ZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgInNlY3Rvcl9zaXplOiAlMDh4XG4iLCBjLT5zZWN0b3Jfc2l6ZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3Jlc2VydmVkX2Jsb2NrcyBzaXplOiAlMDh4XG4iLGMtPnNlY3Rvcl9zaXplICogYy0+cmVzdl9ibG9ja3Nfd3JpdGUpOworCisJaWYgKGMtPm5leHRibG9jaykgeworCQlwcmludGsoS0VSTl9ERUJVRyAibmV4dGJsb2NrOiAlMDh4ICh1c2VkICUwOHgsIGRpcnR5ICUwOHgsIHdhc3RlZCAlMDh4LCB1bmNoZWNrZWQgJTA4eCwgZnJlZSAlMDh4KVxuIiwKKwkJICAgICAgIGMtPm5leHRibG9jay0+b2Zmc2V0LCBjLT5uZXh0YmxvY2stPnVzZWRfc2l6ZSwgYy0+bmV4dGJsb2NrLT5kaXJ0eV9zaXplLCBjLT5uZXh0YmxvY2stPndhc3RlZF9zaXplLCBjLT5uZXh0YmxvY2stPnVuY2hlY2tlZF9zaXplLCBjLT5uZXh0YmxvY2stPmZyZWVfc2l6ZSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIm5leHRibG9jazogTlVMTFxuIik7CisJfQorCWlmIChjLT5nY2Jsb2NrKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJnY2Jsb2NrOiAlMDh4ICh1c2VkICUwOHgsIGRpcnR5ICUwOHgsIHdhc3RlZCAlMDh4LCB1bmNoZWNrZWQgJTA4eCwgZnJlZSAlMDh4KVxuIiwKKwkJICAgICAgIGMtPmdjYmxvY2stPm9mZnNldCwgYy0+Z2NibG9jay0+dXNlZF9zaXplLCBjLT5nY2Jsb2NrLT5kaXJ0eV9zaXplLCBjLT5nY2Jsb2NrLT53YXN0ZWRfc2l6ZSwgYy0+Z2NibG9jay0+dW5jaGVja2VkX3NpemUsIGMtPmdjYmxvY2stPmZyZWVfc2l6ZSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImdjYmxvY2s6IE5VTExcbiIpOworCX0KKwlpZiAobGlzdF9lbXB0eSgmYy0+Y2xlYW5fbGlzdCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImNsZWFuX2xpc3Q6IGVtcHR5XG4iKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICp0aGlzOworCQlpbnQJbnVtYmxvY2tzID0gMDsKKwkJdWludDMyX3QgZGlydHkgPSAwOworCisJCWxpc3RfZm9yX2VhY2godGhpcywgJmMtPmNsZWFuX2xpc3QpIHsKKwkJCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIgPSBsaXN0X2VudHJ5KHRoaXMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrLCBsaXN0KTsKKwkJCW51bWJsb2NrcyArKzsKKwkJCWRpcnR5ICs9IGplYi0+d2FzdGVkX3NpemU7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiY2xlYW5fbGlzdDogJTA4eCAodXNlZCAlMDh4LCBkaXJ0eSAlMDh4LCB3YXN0ZWQgJTA4eCwgdW5jaGVja2VkICUwOHgsIGZyZWUgJTA4eClcbiIsIGplYi0+b2Zmc2V0LCBqZWItPnVzZWRfc2l6ZSwgamViLT5kaXJ0eV9zaXplLCBqZWItPndhc3RlZF9zaXplLCBqZWItPnVuY2hlY2tlZF9zaXplLCBqZWItPmZyZWVfc2l6ZSk7CisJCX0KKwkJcHJpbnRrIChLRVJOX0RFQlVHICJDb250YWlucyAlZCBibG9ja3Mgd2l0aCB0b3RhbCB3YXN0ZWQgc2l6ZSAldSwgYXZlcmFnZSB3YXN0ZWQgc2l6ZTogJXVcbiIsIG51bWJsb2NrcywgZGlydHksIGRpcnR5IC8gbnVtYmxvY2tzKTsKKwl9CisJaWYgKGxpc3RfZW1wdHkoJmMtPnZlcnlfZGlydHlfbGlzdCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInZlcnlfZGlydHlfbGlzdDogZW1wdHlcbiIpOworCX0gZWxzZSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnRoaXM7CisJCWludAludW1ibG9ja3MgPSAwOworCQl1aW50MzJfdCBkaXJ0eSA9IDA7CisKKwkJbGlzdF9mb3JfZWFjaCh0aGlzLCAmYy0+dmVyeV9kaXJ0eV9saXN0KSB7CisJCQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViID0gbGlzdF9lbnRyeSh0aGlzLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCk7CisJCQludW1ibG9ja3MgKys7CisJCQlkaXJ0eSArPSBqZWItPmRpcnR5X3NpemU7CisJCQlwcmludGsoS0VSTl9ERUJVRyAidmVyeV9kaXJ0eV9saXN0OiAlMDh4ICh1c2VkICUwOHgsIGRpcnR5ICUwOHgsIHdhc3RlZCAlMDh4LCB1bmNoZWNrZWQgJTA4eCwgZnJlZSAlMDh4KVxuIiwKKwkJCSAgICAgICBqZWItPm9mZnNldCwgamViLT51c2VkX3NpemUsIGplYi0+ZGlydHlfc2l6ZSwgamViLT53YXN0ZWRfc2l6ZSwgamViLT51bmNoZWNrZWRfc2l6ZSwgamViLT5mcmVlX3NpemUpOworCQl9CisJCXByaW50ayAoS0VSTl9ERUJVRyAiQ29udGFpbnMgJWQgYmxvY2tzIHdpdGggdG90YWwgZGlydHkgc2l6ZSAldSwgYXZlcmFnZSBkaXJ0eSBzaXplOiAldVxuIiwKKwkJCW51bWJsb2NrcywgZGlydHksIGRpcnR5IC8gbnVtYmxvY2tzKTsKKwl9CisJaWYgKGxpc3RfZW1wdHkoJmMtPmRpcnR5X2xpc3QpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJkaXJ0eV9saXN0OiBlbXB0eVxuIik7CisJfSBlbHNlIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqdGhpczsKKwkJaW50CW51bWJsb2NrcyA9IDA7CisJCXVpbnQzMl90IGRpcnR5ID0gMDsKKworCQlsaXN0X2Zvcl9lYWNoKHRoaXMsICZjLT5kaXJ0eV9saXN0KSB7CisJCQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViID0gbGlzdF9lbnRyeSh0aGlzLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCk7CisJCQludW1ibG9ja3MgKys7CisJCQlkaXJ0eSArPSBqZWItPmRpcnR5X3NpemU7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiZGlydHlfbGlzdDogJTA4eCAodXNlZCAlMDh4LCBkaXJ0eSAlMDh4LCB3YXN0ZWQgJTA4eCwgdW5jaGVja2VkICUwOHgsIGZyZWUgJTA4eClcbiIsCisJCQkgICAgICAgamViLT5vZmZzZXQsIGplYi0+dXNlZF9zaXplLCBqZWItPmRpcnR5X3NpemUsIGplYi0+d2FzdGVkX3NpemUsIGplYi0+dW5jaGVja2VkX3NpemUsIGplYi0+ZnJlZV9zaXplKTsKKwkJfQorCQlwcmludGsgKEtFUk5fREVCVUcgIkNvbnRhaW5zICVkIGJsb2NrcyB3aXRoIHRvdGFsIGRpcnR5IHNpemUgJXUsIGF2ZXJhZ2UgZGlydHkgc2l6ZTogJXVcbiIsCisJCQludW1ibG9ja3MsIGRpcnR5LCBkaXJ0eSAvIG51bWJsb2Nrcyk7CisJfQorCWlmIChsaXN0X2VtcHR5KCZjLT5lcmFzYWJsZV9saXN0KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiZXJhc2FibGVfbGlzdDogZW1wdHlcbiIpOworCX0gZWxzZSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnRoaXM7CisKKwkJbGlzdF9mb3JfZWFjaCh0aGlzLCAmYy0+ZXJhc2FibGVfbGlzdCkgeworCQkJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiA9IGxpc3RfZW50cnkodGhpcywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2ssIGxpc3QpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgImVyYXNhYmxlX2xpc3Q6ICUwOHggKHVzZWQgJTA4eCwgZGlydHkgJTA4eCwgd2FzdGVkICUwOHgsIHVuY2hlY2tlZCAlMDh4LCBmcmVlICUwOHgpXG4iLAorCQkJICAgICAgIGplYi0+b2Zmc2V0LCBqZWItPnVzZWRfc2l6ZSwgamViLT5kaXJ0eV9zaXplLCBqZWItPndhc3RlZF9zaXplLCBqZWItPnVuY2hlY2tlZF9zaXplLCBqZWItPmZyZWVfc2l6ZSk7CisJCX0KKwl9CisJaWYgKGxpc3RfZW1wdHkoJmMtPmVyYXNpbmdfbGlzdCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImVyYXNpbmdfbGlzdDogZW1wdHlcbiIpOworCX0gZWxzZSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnRoaXM7CisKKwkJbGlzdF9mb3JfZWFjaCh0aGlzLCAmYy0+ZXJhc2luZ19saXN0KSB7CisJCQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViID0gbGlzdF9lbnRyeSh0aGlzLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiZXJhc2luZ19saXN0OiAlMDh4ICh1c2VkICUwOHgsIGRpcnR5ICUwOHgsIHdhc3RlZCAlMDh4LCB1bmNoZWNrZWQgJTA4eCwgZnJlZSAlMDh4KVxuIiwKKwkJCSAgICAgICBqZWItPm9mZnNldCwgamViLT51c2VkX3NpemUsIGplYi0+ZGlydHlfc2l6ZSwgamViLT53YXN0ZWRfc2l6ZSwgamViLT51bmNoZWNrZWRfc2l6ZSwgamViLT5mcmVlX3NpemUpOworCQl9CisJfQorCWlmIChsaXN0X2VtcHR5KCZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJlcmFzZV9wZW5kaW5nX2xpc3Q6IGVtcHR5XG4iKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICp0aGlzOworCisJCWxpc3RfZm9yX2VhY2godGhpcywgJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCkgeworCQkJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiA9IGxpc3RfZW50cnkodGhpcywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2ssIGxpc3QpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgImVyYXNlX3BlbmRpbmdfbGlzdDogJTA4eCAodXNlZCAlMDh4LCBkaXJ0eSAlMDh4LCB3YXN0ZWQgJTA4eCwgdW5jaGVja2VkICUwOHgsIGZyZWUgJTA4eClcbiIsCisJCQkgICAgICAgamViLT5vZmZzZXQsIGplYi0+dXNlZF9zaXplLCBqZWItPmRpcnR5X3NpemUsIGplYi0+d2FzdGVkX3NpemUsIGplYi0+dW5jaGVja2VkX3NpemUsIGplYi0+ZnJlZV9zaXplKTsKKwkJfQorCX0KKwlpZiAobGlzdF9lbXB0eSgmYy0+ZXJhc2FibGVfcGVuZGluZ193YnVmX2xpc3QpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJlcmFzYWJsZV9wZW5kaW5nX3didWZfbGlzdDogZW1wdHlcbiIpOworCX0gZWxzZSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnRoaXM7CisKKwkJbGlzdF9mb3JfZWFjaCh0aGlzLCAmYy0+ZXJhc2FibGVfcGVuZGluZ193YnVmX2xpc3QpIHsKKwkJCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIgPSBsaXN0X2VudHJ5KHRoaXMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrLCBsaXN0KTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJlcmFzYWJsZV9wZW5kaW5nX3didWZfbGlzdDogJTA4eCAodXNlZCAlMDh4LCBkaXJ0eSAlMDh4LCB3YXN0ZWQgJTA4eCwgdW5jaGVja2VkICUwOHgsIGZyZWUgJTA4eClcbiIsCisJCQkgICAgICAgamViLT5vZmZzZXQsIGplYi0+dXNlZF9zaXplLCBqZWItPmRpcnR5X3NpemUsIGplYi0+d2FzdGVkX3NpemUsIGplYi0+dW5jaGVja2VkX3NpemUsIGplYi0+ZnJlZV9zaXplKTsKKwkJfQorCX0KKwlpZiAobGlzdF9lbXB0eSgmYy0+ZnJlZV9saXN0KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiZnJlZV9saXN0OiBlbXB0eVxuIik7CisJfSBlbHNlIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqdGhpczsKKworCQlsaXN0X2Zvcl9lYWNoKHRoaXMsICZjLT5mcmVlX2xpc3QpIHsKKwkJCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIgPSBsaXN0X2VudHJ5KHRoaXMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrLCBsaXN0KTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJmcmVlX2xpc3Q6ICUwOHggKHVzZWQgJTA4eCwgZGlydHkgJTA4eCwgd2FzdGVkICUwOHgsIHVuY2hlY2tlZCAlMDh4LCBmcmVlICUwOHgpXG4iLAorCQkJICAgICAgIGplYi0+b2Zmc2V0LCBqZWItPnVzZWRfc2l6ZSwgamViLT5kaXJ0eV9zaXplLCBqZWItPndhc3RlZF9zaXplLCBqZWItPnVuY2hlY2tlZF9zaXplLCBqZWItPmZyZWVfc2l6ZSk7CisJCX0KKwl9CisJaWYgKGxpc3RfZW1wdHkoJmMtPmJhZF9saXN0KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiYmFkX2xpc3Q6IGVtcHR5XG4iKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICp0aGlzOworCisJCWxpc3RfZm9yX2VhY2godGhpcywgJmMtPmJhZF9saXN0KSB7CisJCQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViID0gbGlzdF9lbnRyeSh0aGlzLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiYmFkX2xpc3Q6ICUwOHggKHVzZWQgJTA4eCwgZGlydHkgJTA4eCwgd2FzdGVkICUwOHgsIHVuY2hlY2tlZCAlMDh4LCBmcmVlICUwOHgpXG4iLAorCQkJICAgICAgIGplYi0+b2Zmc2V0LCBqZWItPnVzZWRfc2l6ZSwgamViLT5kaXJ0eV9zaXplLCBqZWItPndhc3RlZF9zaXplLCBqZWItPnVuY2hlY2tlZF9zaXplLCBqZWItPmZyZWVfc2l6ZSk7CisJCX0KKwl9CisJaWYgKGxpc3RfZW1wdHkoJmMtPmJhZF91c2VkX2xpc3QpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJiYWRfdXNlZF9saXN0OiBlbXB0eVxuIik7CisJfSBlbHNlIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqdGhpczsKKworCQlsaXN0X2Zvcl9lYWNoKHRoaXMsICZjLT5iYWRfdXNlZF9saXN0KSB7CisJCQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViID0gbGlzdF9lbnRyeSh0aGlzLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiYmFkX3VzZWRfbGlzdDogJTA4eCAodXNlZCAlMDh4LCBkaXJ0eSAlMDh4LCB3YXN0ZWQgJTA4eCwgdW5jaGVja2VkICUwOHgsIGZyZWUgJTA4eClcbiIsCisJCQkgICAgICAgamViLT5vZmZzZXQsIGplYi0+dXNlZF9zaXplLCBqZWItPmRpcnR5X3NpemUsIGplYi0+d2FzdGVkX3NpemUsIGplYi0+dW5jaGVja2VkX3NpemUsIGplYi0+ZnJlZV9zaXplKTsKKwkJfQorCX0KK30KKyNlbmRpZiAvKiBDT05GSUdfSkZGUzJfRlNfREVCVUcgKi8KKworaW50IGpmZnMyX3RocmVhZF9zaG91bGRfd2FrZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlpbnQgcmV0ID0gMDsKKwl1aW50MzJfdCBkaXJ0eTsKKworCWlmIChjLT51bmNoZWNrZWRfc2l6ZSkgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfdGhyZWFkX3Nob3VsZF93YWtlKCk6IHVuY2hlY2tlZF9zaXplICVkLCBjaGVja2VkX2lubyAjJWRcbiIsCisJCQkgIGMtPnVuY2hlY2tlZF9zaXplLCBjLT5jaGVja2VkX2lubykpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBkaXJ0eV9zaXplIGNvbnRhaW5zIGJsb2NrcyBvbiBlcmFzZV9wZW5kaW5nX2xpc3QKKwkgKiB0aG9zZSBibG9ja3MgYXJlIGNvdW50ZWQgaW4gYy0+bnJfZXJhc2luZ19ibG9ja3MuCisJICogSWYgb25lIGJsb2NrIGlzIGFjdHVhbGx5IGVyYXNlZCwgaXQgaXMgbm90IGxvbmdlciBjb3VudGVkIGFzIGRpcnR5X3NwYWNlCisJICogYnV0IGl0IGlzIGNvdW50ZWQgaW4gYy0+bnJfZXJhc2luZ19ibG9ja3MsIHNvIHdlIGFkZCBpdCBhbmQgc3VidHJhY3QgaXQKKwkgKiB3aXRoIGMtPm5yX2VyYXNpbmdfYmxvY2tzICogYy0+c2VjdG9yX3NpemUgYWdhaW4uCisJICogQmxvY2tzIG9uIGVyYXNhYmxlX2xpc3QgYXJlIGNvdW50ZWQgYXMgZGlydHlfc2l6ZSwgYnV0IG5vdCBpbiBjLT5ucl9lcmFzaW5nX2Jsb2NrcworCSAqIFRoaXMgaGVscHMgdXMgdG8gZm9yY2UgZ2MgYW5kIHBpY2sgZXZlbnR1YWxseSBhIGNsZWFuIGJsb2NrIHRvIHNwcmVhZCB0aGUgbG9hZC4KKwkgKi8KKwlkaXJ0eSA9IGMtPmRpcnR5X3NpemUgKyBjLT5lcmFzaW5nX3NpemUgLSBjLT5ucl9lcmFzaW5nX2Jsb2NrcyAqIGMtPnNlY3Rvcl9zaXplOworCisJaWYgKGMtPm5yX2ZyZWVfYmxvY2tzICsgYy0+bnJfZXJhc2luZ19ibG9ja3MgPCBjLT5yZXN2X2Jsb2Nrc19nY3RyaWdnZXIgJiYgCisJCQkoZGlydHkgPiBjLT5ub3NwY19kaXJ0eV9zaXplKSkgCisJCXJldCA9IDE7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfdGhyZWFkX3Nob3VsZF93YWtlKCk6IG5yX2ZyZWVfYmxvY2tzICVkLCBucl9lcmFzaW5nX2Jsb2NrcyAlZCwgZGlydHlfc2l6ZSAweCV4OiAlc1xuIiwgCisJCSAgYy0+bnJfZnJlZV9ibG9ja3MsIGMtPm5yX2VyYXNpbmdfYmxvY2tzLCBjLT5kaXJ0eV9zaXplLCByZXQ/InllcyI6Im5vIikpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL29zLWxpbnV4LmggYi9mcy9qZmZzMi9vcy1saW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYjBhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9vcy1saW51eC5oCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiAkSWQ6IG9zLWxpbnV4LmgsdiAxLjUxIDIwMDQvMTEvMTYgMjA6MzY6MTEgZHdtdzIgRXhwICQKKyAqCisgKi8KKworI2lmbmRlZiBfX0pGRlMyX09TX0xJTlVYX0hfXworI2RlZmluZSBfX0pGRlMyX09TX0xJTlVYX0hfXworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworLyogSkZGUzIgdXNlcyBMaW51eCBtb2RlIGJpdHMgbmF0aXZlbHkgLS0gbm8gbmVlZCBmb3IgY29udmVyc2lvbiAqLworI2RlZmluZSBvc190b19qZmZzMl9tb2RlKHgpICh4KQorI2RlZmluZSBqZmZzMl90b19vc19tb2RlKHgpICh4KQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDczKQorI2RlZmluZSBrc3RhdGZzIHN0YXRmcworI2VuZGlmCisKK3N0cnVjdCBrc3RhdGZzOworc3RydWN0IGt2ZWM7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMikKKyNkZWZpbmUgSkZGUzJfSU5PREVfSU5GTyhpKSAobGlzdF9lbnRyeShpLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbywgdmZzX2lub2RlKSkKKyNkZWZpbmUgT0ZOSV9FRE9OSV8yU0ZGSihmKSAgKCYoZiktPnZmc19pbm9kZSkKKyNkZWZpbmUgSkZGUzJfU0JfSU5GTyhzYikgKHNiLT5zX2ZzX2luZm8pCisjZGVmaW5lIE9GTklfQlNfMlNGRkooYykgICgoc3RydWN0IHN1cGVyX2Jsb2NrICopYy0+b3NfcHJpdikKKyNlbGlmIGRlZmluZWQoSkZGUzJfT1VUX09GX0tFUk5FTCkKKyNkZWZpbmUgSkZGUzJfSU5PREVfSU5GTyhpKSAoKHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICopICYoaSktPnUpCisjZGVmaW5lIE9GTklfRURPTklfMlNGRkooZikgICgoc3RydWN0IGlub2RlICopICggKChjaGFyICopZikgLSAoKGNoYXIgKikoJigoc3RydWN0IGlub2RlICopTlVMTCktPnUpKSApICkKKyNkZWZpbmUgSkZGUzJfU0JfSU5GTyhzYikgKChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqKSAmKHNiKS0+dSkKKyNkZWZpbmUgT0ZOSV9CU18yU0ZGSihjKSAgKChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKikgKCAoKGNoYXIgKiljKSAtICgoY2hhciAqKSgmKChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKilOVUxMKS0+dSkpICkgKQorI2Vsc2UKKyNkZWZpbmUgSkZGUzJfSU5PREVfSU5GTyhpKSAoJmktPnUuamZmczJfaSkKKyNkZWZpbmUgT0ZOSV9FRE9OSV8yU0ZGSihmKSAgKChzdHJ1Y3QgaW5vZGUgKikgKCAoKGNoYXIgKilmKSAtICgoY2hhciAqKSgmKChzdHJ1Y3QgaW5vZGUgKilOVUxMKS0+dSkpICkgKQorI2RlZmluZSBKRkZTMl9TQl9JTkZPKHNiKSAoJnNiLT51LmpmZnMyX3NiKQorI2RlZmluZSBPRk5JX0JTXzJTRkZKKGMpICAoKHN0cnVjdCBzdXBlcl9ibG9jayAqKSAoICgoY2hhciAqKWMpIC0gKChjaGFyICopKCYoKHN0cnVjdCBzdXBlcl9ibG9jayAqKU5VTEwpLT51KSkgKSApCisjZW5kaWYKKworCisjZGVmaW5lIEpGRlMyX0ZfSV9TSVpFKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX3NpemUpCisjZGVmaW5lIEpGRlMyX0ZfSV9NT0RFKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX21vZGUpCisjZGVmaW5lIEpGRlMyX0ZfSV9VSUQoZikgKE9GTklfRURPTklfMlNGRkooZiktPmlfdWlkKQorI2RlZmluZSBKRkZTMl9GX0lfR0lEKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX2dpZCkKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwxKQorI2RlZmluZSBKRkZTMl9GX0lfUkRFVl9NSU4oZikgKGltaW5vcihPRk5JX0VET05JXzJTRkZKKGYpKSkKKyNkZWZpbmUgSkZGUzJfRl9JX1JERVZfTUFKKGYpIChpbWFqb3IoT0ZOSV9FRE9OSV8yU0ZGSihmKSkpCisjZWxzZQorI2RlZmluZSBKRkZTMl9GX0lfUkRFVl9NSU4oZikgKE1JTk9SKHRvX2tkZXZfdChPRk5JX0VET05JXzJTRkZKKGYpLT5pX3JkZXYpKSkKKyNkZWZpbmUgSkZGUzJfRl9JX1JERVZfTUFKKGYpIChNQUpPUih0b19rZGV2X3QoT0ZOSV9FRE9OSV8yU0ZGSihmKS0+aV9yZGV2KSkpCisjZW5kaWYKKworLyogVXJnaC4gVGhlIHRoaW5ncyB3ZSBkbyB0byBrZWVwIHRoZSAyLjQgYnVpbGQgd29ya2luZyAqLworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw0NykKKyNkZWZpbmUgSVRJTUUoc2VjKSAoKHN0cnVjdCB0aW1lc3BlYyl7c2VjLCAwfSkKKyNkZWZpbmUgSV9TRUModHYpICgodHYpLnR2X3NlYykKKyNkZWZpbmUgSkZGUzJfRl9JX0NUSU1FKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX2N0aW1lLnR2X3NlYykKKyNkZWZpbmUgSkZGUzJfRl9JX01USU1FKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX210aW1lLnR2X3NlYykKKyNkZWZpbmUgSkZGUzJfRl9JX0FUSU1FKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX2F0aW1lLnR2X3NlYykKKyNlbHNlCisjZGVmaW5lIElUSU1FKHgpICh4KQorI2RlZmluZSBJX1NFQyh4KSAoeCkKKyNkZWZpbmUgSkZGUzJfRl9JX0NUSU1FKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX2N0aW1lKQorI2RlZmluZSBKRkZTMl9GX0lfTVRJTUUoZikgKE9GTklfRURPTklfMlNGRkooZiktPmlfbXRpbWUpCisjZGVmaW5lIEpGRlMyX0ZfSV9BVElNRShmKSAoT0ZOSV9FRE9OSV8yU0ZGSihmKS0+aV9hdGltZSkKKyNlbmRpZgorCisjZGVmaW5lIHNsZWVwX29uX3NwaW51bmxvY2sod3EsIHMpCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJREVDTEFSRV9XQUlUUVVFVUUoX193YWl0LCBjdXJyZW50KTsJCVwKKwkJYWRkX3dhaXRfcXVldWUoKHdxKSwgJl9fd2FpdCk7CQkJXAorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CVwKKwkJc3Bpbl91bmxvY2socyk7CQkJCQlcCisJCXNjaGVkdWxlKCk7CQkJCQlcCisJCXJlbW92ZV93YWl0X3F1ZXVlKCh3cSksICZfX3dhaXQpOwkJXAorCX0gd2hpbGUoMCkKKworc3RhdGljIGlubGluZSB2b2lkIGpmZnMyX2luaXRfaW5vZGVfaW5mbyhzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZikKK3sKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMikKKwlmLT5oaWdoZXN0X3ZlcnNpb24gPSAwOworCWYtPmZyYWd0cmVlID0gUkJfUk9PVDsKKwlmLT5tZXRhZGF0YSA9IE5VTEw7CisJZi0+ZGVudHMgPSBOVUxMOworCWYtPmZsYWdzID0gMDsKKwlmLT51c2VyY29tcHIgPSAwOworI2Vsc2UKKwltZW1zZXQoZiwgMCwgc2l6ZW9mKCpmKSk7CisJaW5pdF9NVVRFWF9MT0NLRUQoJmYtPnNlbSk7CisjZW5kaWYKK30KKworI2RlZmluZSBqZmZzMl9pc19yZWFkb25seShjKSAoT0ZOSV9CU18yU0ZGSihjKS0+c19mbGFncyAmIE1TX1JET05MWSkKKworI2lmICghZGVmaW5lZCBDT05GSUdfSkZGUzJfRlNfTkFORCAmJiAhZGVmaW5lZCBDT05GSUdfSkZGUzJfRlNfTk9SX0VDQykKKyNkZWZpbmUgamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykgKDEpCisjZGVmaW5lIGpmZnMyX2NsZWFubWFya2VyX29vYihjKSAoMCkKKyNkZWZpbmUgamZmczJfd3JpdGVfbmFuZF9jbGVhbm1hcmtlcihjLGplYikgKC1FSU8pCisKKyNkZWZpbmUgamZmczJfZmxhc2hfd3JpdGUoYywgb2ZzLCBsZW4sIHJldGxlbiwgYnVmKSAoKGMpLT5tdGQtPndyaXRlKChjKS0+bXRkLCBvZnMsIGxlbiwgcmV0bGVuLCBidWYpKQorI2RlZmluZSBqZmZzMl9mbGFzaF9yZWFkKGMsIG9mcywgbGVuLCByZXRsZW4sIGJ1ZikgKChjKS0+bXRkLT5yZWFkKChjKS0+bXRkLCBvZnMsIGxlbiwgcmV0bGVuLCBidWYpKQorI2RlZmluZSBqZmZzMl9mbHVzaF93YnVmX3BhZChjKSAoeyAodm9pZCkoYyksIDA7IH0pCisjZGVmaW5lIGpmZnMyX2ZsdXNoX3didWZfZ2MoYywgaSkgKHsgKHZvaWQpKGMpLCAodm9pZCkgaSwgMDsgfSkKKyNkZWZpbmUgamZmczJfd3JpdGVfbmFuZF9iYWRibG9jayhjLGplYixiYWRfb2Zmc2V0KSAoMSkKKyNkZWZpbmUgamZmczJfbmFuZF9mbGFzaF9zZXR1cChjKSAoMCkKKyNkZWZpbmUgamZmczJfbmFuZF9mbGFzaF9jbGVhbnVwKGMpIGRvIHt9IHdoaWxlKDApCisjZGVmaW5lIGpmZnMyX3didWZfZGlydHkoYykgKDApCisjZGVmaW5lIGpmZnMyX2ZsYXNoX3dyaXRldihhLGIsYyxkLGUsZikgamZmczJfZmxhc2hfZGlyZWN0X3dyaXRldihhLGIsYyxkLGUpCisjZGVmaW5lIGpmZnMyX3didWZfdGltZW91dCBOVUxMCisjZGVmaW5lIGpmZnMyX3didWZfcHJvY2VzcyBOVUxMCisjZGVmaW5lIGpmZnMyX25vcl9lY2MoYykgKDApCisjZGVmaW5lIGpmZnMyX25vcl9lY2NfZmxhc2hfc2V0dXAoYykgKDApCisjZGVmaW5lIGpmZnMyX25vcl9lY2NfZmxhc2hfY2xlYW51cChjKSBkbyB7fSB3aGlsZSAoMCkKKworI2Vsc2UgLyogTkFORCBhbmQvb3IgRUNDJ2QgTk9SIHN1cHBvcnQgcHJlc2VudCAqLworCisjZGVmaW5lIGpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKGMpICgoYy0+bXRkLT50eXBlID09IE1URF9OT1JGTEFTSCAmJiAhKGMtPm10ZC0+ZmxhZ3MgJiBNVERfRUNDKSkgfHwgYy0+bXRkLT50eXBlID09IE1URF9SQU0pCisjZGVmaW5lIGpmZnMyX2NsZWFubWFya2VyX29vYihjKSAoYy0+bXRkLT50eXBlID09IE1URF9OQU5ERkxBU0gpCisKKyNkZWZpbmUgamZmczJfZmxhc2hfd3JpdGVfb29iKGMsIG9mcywgbGVuLCByZXRsZW4sIGJ1ZikgKChjKS0+bXRkLT53cml0ZV9vb2IoKGMpLT5tdGQsIG9mcywgbGVuLCByZXRsZW4sIGJ1ZikpCisjZGVmaW5lIGpmZnMyX2ZsYXNoX3JlYWRfb29iKGMsIG9mcywgbGVuLCByZXRsZW4sIGJ1ZikgKChjKS0+bXRkLT5yZWFkX29vYigoYyktPm10ZCwgb2ZzLCBsZW4sIHJldGxlbiwgYnVmKSkKKyNkZWZpbmUgamZmczJfd2J1Zl9kaXJ0eShjKSAoISEoYyktPndidWZfbGVuKQorCisvKiB3YnVmLmMgKi8KK2ludCBqZmZzMl9mbGFzaF93cml0ZXYoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIGNvbnN0IHN0cnVjdCBrdmVjICp2ZWNzLCB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgdG8sIHNpemVfdCAqcmV0bGVuLCB1aW50MzJfdCBpbm8pOworaW50IGpmZnMyX2ZsYXNoX3dyaXRlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBsb2ZmX3Qgb2ZzLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgY29uc3QgdV9jaGFyICpidWYpOworaW50IGpmZnMyX2ZsYXNoX3JlYWQoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7CitpbnQgamZmczJfY2hlY2tfb29iX2VtcHR5KHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLGludCBtb2RlKTsKK2ludCBqZmZzMl9jaGVja19uYW5kX2NsZWFubWFya2VyKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViKTsKK2ludCBqZmZzMl93cml0ZV9uYW5kX2NsZWFubWFya2VyKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViKTsKK2ludCBqZmZzMl93cml0ZV9uYW5kX2JhZGJsb2NrKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLCB1aW50MzJfdCBiYWRfb2Zmc2V0KTsKK3ZvaWQgamZmczJfd2J1Zl90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Cit2b2lkIGpmZnMyX3didWZfcHJvY2Vzcyh2b2lkICpkYXRhKTsKK2ludCBqZmZzMl9mbHVzaF93YnVmX2djKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCB1aW50MzJfdCBpbm8pOworaW50IGpmZnMyX2ZsdXNoX3didWZfcGFkKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKTsKK2ludCBqZmZzMl9uYW5kX2ZsYXNoX3NldHVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKTsKK3ZvaWQgamZmczJfbmFuZF9mbGFzaF9jbGVhbnVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKTsKKyNpZmRlZiBDT05GSUdfSkZGUzJfRlNfTk9SX0VDQworI2RlZmluZSBqZmZzMl9ub3JfZWNjKGMpIChjLT5tdGQtPnR5cGUgPT0gTVREX05PUkZMQVNIICYmIChjLT5tdGQtPmZsYWdzICYgTVREX0VDQykpCitpbnQgamZmczJfbm9yX2VjY19mbGFzaF9zZXR1cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7Cit2b2lkIGpmZnMyX25vcl9lY2NfZmxhc2hfY2xlYW51cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CisjZWxzZQorI2RlZmluZSBqZmZzMl9ub3JfZWNjKGMpICgwKQorI2RlZmluZSBqZmZzMl9ub3JfZWNjX2ZsYXNoX3NldHVwKGMpICgwKQorI2RlZmluZSBqZmZzMl9ub3JfZWNjX2ZsYXNoX2NsZWFudXAoYykgZG8ge30gd2hpbGUgKDApCisjZW5kaWYgLyogTk9SIEVDQyAqLworI2VuZGlmIC8qIE5BTkQgKi8KKworLyogZXJhc2UuYyAqLworc3RhdGljIGlubGluZSB2b2lkIGpmZnMyX2VyYXNlX3BlbmRpbmdfdHJpZ2dlcihzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlPRk5JX0JTXzJTRkZKKGMpLT5zX2RpcnQgPSAxOworfQorCisvKiBiYWNrZ3JvdW5kLmMgKi8KK2ludCBqZmZzMl9zdGFydF9nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKTsKK3ZvaWQgamZmczJfc3RvcF9nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKTsKK3ZvaWQgamZmczJfZ2FyYmFnZV9jb2xsZWN0X3RyaWdnZXIoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOworCisvKiBkaXIuYyAqLworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgamZmczJfZGlyX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgamZmczJfZGlyX2lub2RlX29wZXJhdGlvbnM7CisKKy8qIGZpbGUuYyAqLworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgamZmczJfZmlsZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGpmZnMyX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGpmZnMyX2ZpbGVfYWRkcmVzc19vcGVyYXRpb25zOworaW50IGpmZnMyX2ZzeW5jKHN0cnVjdCBmaWxlICosIHN0cnVjdCBkZW50cnkgKiwgaW50KTsKK2ludCBqZmZzMl9kb19yZWFkcGFnZV91bmxvY2sgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwZyk7CisKKy8qIGlvY3RsLmMgKi8KK2ludCBqZmZzMl9pb2N0bChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKKworLyogc3ltbGluay5jICovCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgamZmczJfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCisvKiBmcy5jICovCitpbnQgamZmczJfc2V0YXR0ciAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaWF0dHIgKik7Cit2b2lkIGpmZnMyX3JlYWRfaW5vZGUgKHN0cnVjdCBpbm9kZSAqKTsKK3ZvaWQgamZmczJfY2xlYXJfaW5vZGUgKHN0cnVjdCBpbm9kZSAqKTsKK3ZvaWQgamZmczJfZGlydHlfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CitzdHJ1Y3QgaW5vZGUgKmpmZnMyX25ld19pbm9kZSAoc3RydWN0IGlub2RlICpkaXJfaSwgaW50IG1vZGUsCisJCQkgICAgICAgc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqcmkpOworaW50IGpmZnMyX3N0YXRmcyAoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBrc3RhdGZzICopOwordm9pZCBqZmZzMl93cml0ZV9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICopOworaW50IGpmZnMyX3JlbW91bnRfZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQgKiwgY2hhciAqKTsKK2ludCBqZmZzMl9kb19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpOwordm9pZCBqZmZzMl9nY19yZWxlYXNlX2lub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLAorCQkJICAgIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmKTsKK3N0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpqZmZzMl9nY19mZXRjaF9pbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywKKwkJCQkJICAgICAgaW50IGludW0sIGludCBubGluayk7CisKK3Vuc2lnbmVkIGNoYXIgKmpmZnMyX2djX2ZldGNoX3BhZ2Uoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIAorCQkJCSAgIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCAKKwkJCQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgICB1bnNpZ25lZCBsb25nICpwcml2KTsKK3ZvaWQgamZmczJfZ2NfcmVsZWFzZV9wYWdlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLAorCQkJICAgdW5zaWduZWQgY2hhciAqcGcsCisJCQkgICB1bnNpZ25lZCBsb25nICpwcml2KTsKK3ZvaWQgamZmczJfZmxhc2hfY2xlYW51cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CisgICAgIAorCisvKiB3cml0ZXYuYyAqLworaW50IGpmZnMyX2ZsYXNoX2RpcmVjdF93cml0ZXYoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIGNvbnN0IHN0cnVjdCBrdmVjICp2ZWNzLCAKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCB0bywgc2l6ZV90ICpyZXRsZW4pOworCisKKyNlbmRpZiAvKiBfX0pGRlMyX09TX0xJTlVYX0hfXyAqLworCisKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3B1c2hwdWxsLmggYi9mcy9qZmZzMi9wdXNocHVsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYzJhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9wdXNocHVsbC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiAkSWQ6IHB1c2hwdWxsLmgsdiAxLjEwIDIwMDQvMTEvMTYgMjA6MzY6MTEgZHdtdzIgRXhwICQKKyAqCisgKi8KKworI2lmbmRlZiBfX1BVU0hQVUxMX0hfXworI2RlZmluZSBfX1BVU0hQVUxMX0hfXworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RydWN0IHB1c2hwdWxsIHsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdW5zaWduZWQgaW50IGJ1ZmxlbjsKKwl1bnNpZ25lZCBpbnQgb2ZzOworCXVuc2lnbmVkIGludCByZXNlcnZlOworfTsKKworCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9wdXNocHVsbChzdHJ1Y3QgcHVzaHB1bGwgKnBwLCBjaGFyICpidWYsIHVuc2lnbmVkIGJ1ZmxlbiwgdW5zaWduZWQgb2ZzLCB1bnNpZ25lZCByZXNlcnZlKQoreworCXBwLT5idWYgPSBidWY7CisJcHAtPmJ1ZmxlbiA9IGJ1ZmxlbjsKKwlwcC0+b2ZzID0gb2ZzOworCXBwLT5yZXNlcnZlID0gcmVzZXJ2ZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHVzaGJpdChzdHJ1Y3QgcHVzaHB1bGwgKnBwLCBpbnQgYml0LCBpbnQgdXNlX3Jlc2VydmVkKQoreworCWlmIChwcC0+b2ZzID49IHBwLT5idWZsZW4gLSAodXNlX3Jlc2VydmVkPzA6cHAtPnJlc2VydmUpKSB7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCWlmIChiaXQpIHsKKwkJcHAtPmJ1ZltwcC0+b2ZzID4+IDNdIHw9ICgxPDwoNy0ocHAtPm9mcyAmNykpKTsKKwl9CisJZWxzZSB7CisJCXBwLT5idWZbcHAtPm9mcyA+PiAzXSAmPSB+KDE8PCg3LShwcC0+b2ZzICY3KSkpOworCX0KKwlwcC0+b2ZzKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHVzaGVkYml0cyhzdHJ1Y3QgcHVzaHB1bGwgKnBwKQoreworCXJldHVybiBwcC0+b2ZzOworfQorCitzdGF0aWMgaW5saW5lIGludCBwdWxsYml0KHN0cnVjdCBwdXNocHVsbCAqcHApCit7CisJaW50IGJpdDsKKworCWJpdCA9IChwcC0+YnVmW3BwLT5vZnMgPj4gM10gPj4gKDctKHBwLT5vZnMgJiA3KSkpICYgMTsKKworCXBwLT5vZnMrKzsKKwlyZXR1cm4gYml0OworfQorCitzdGF0aWMgaW5saW5lIGludCBwdWxsZWRiaXRzKHN0cnVjdCBwdXNocHVsbCAqcHApCit7CisJcmV0dXJuIHBwLT5vZnM7Cit9CisKKyNlbmRpZiAvKiBfX1BVU0hQVUxMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvcmVhZC5jIGIvZnMvamZmczIvcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNDkzZGMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9yZWFkLmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgorICoKKyAqICRJZDogcmVhZC5jLHYgMS4zOCAyMDA0LzExLzE2IDIwOjM2OjEyIGR3bXcyIEV4cCAkCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSAibm9kZWxpc3QuaCIKKyNpbmNsdWRlICJjb21wci5oIgorCitpbnQgamZmczJfcmVhZF9kbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsCisJCSAgICAgc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmZkLCB1bnNpZ25lZCBjaGFyICpidWYsCisJCSAgICAgaW50IG9mcywgaW50IGxlbikKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaTsKKwlzaXplX3QgcmVhZGxlbjsKKwl1aW50MzJfdCBjcmM7CisJdW5zaWduZWQgY2hhciAqZGVjb21wcmJ1ZiA9IE5VTEw7CisJdW5zaWduZWQgY2hhciAqcmVhZGJ1ZiA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlyaSA9IGpmZnMyX2FsbG9jX3Jhd19pbm9kZSgpOworCWlmICghcmkpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gamZmczJfZmxhc2hfcmVhZChjLCByZWZfb2Zmc2V0KGZkLT5yYXcpLCBzaXplb2YoKnJpKSwgJnJlYWRsZW4sIChjaGFyICopcmkpOworCWlmIChyZXQpIHsKKwkJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFcnJvciByZWFkaW5nIG5vZGUgZnJvbSAweCUwOHg6ICVkXG4iLCByZWZfb2Zmc2V0KGZkLT5yYXcpLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAocmVhZGxlbiAhPSBzaXplb2YoKnJpKSkgeworCQlqZmZzMl9mcmVlX3Jhd19pbm9kZShyaSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNob3J0IHJlYWQgZnJvbSAweCUwOHg6IHdhbnRlZCAweCV6eCBieXRlcywgZ290IDB4JXp4XG4iLCAKKwkJICAgICAgIHJlZl9vZmZzZXQoZmQtPnJhdyksIHNpemVvZigqcmkpLCByZWFkbGVuKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWNyYyA9IGNyYzMyKDAsIHJpLCBzaXplb2YoKnJpKS04KTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJOb2RlIHJlYWQgZnJvbSAlMDh4OiBub2RlX2NyYyAlMDh4LCBjYWxjdWxhdGVkIENSQyAlMDh4LiBkc2l6ZSAleCwgY3NpemUgJXgsIG9mZnNldCAleCwgYnVmICVwXG4iLAorCQkgIHJlZl9vZmZzZXQoZmQtPnJhdyksIGplMzJfdG9fY3B1KHJpLT5ub2RlX2NyYyksCisJCSAgY3JjLCBqZTMyX3RvX2NwdShyaS0+ZHNpemUpLCBqZTMyX3RvX2NwdShyaS0+Y3NpemUpLAorCQkgIGplMzJfdG9fY3B1KHJpLT5vZmZzZXQpLCBidWYpKTsKKwlpZiAoY3JjICE9IGplMzJfdG9fY3B1KHJpLT5ub2RlX2NyYykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm9kZSBDUkMgJTA4eCAhPSBjYWxjdWxhdGVkIENSQyAlMDh4IGZvciBub2RlIGF0ICUwOHhcbiIsCisJCSAgICAgICBqZTMyX3RvX2NwdShyaS0+bm9kZV9jcmMpLCBjcmMsIHJlZl9vZmZzZXQoZmQtPnJhdykpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dF9yaTsKKwl9CisJLyogVGhlcmUgd2FzIGEgYnVnIHdoZXJlIHdlIHdyb3RlIGhvbGUgbm9kZXMgb3V0IHdpdGggY3NpemUvZHNpemUKKwkgICBzd2FwcGVkLiBEZWFsIHdpdGggaXQgKi8KKwlpZiAocmktPmNvbXByID09IEpGRlMyX0NPTVBSX1pFUk8gJiYgIWplMzJfdG9fY3B1KHJpLT5kc2l6ZSkgJiYgCisJICAgIGplMzJfdG9fY3B1KHJpLT5jc2l6ZSkpIHsKKwkJcmktPmRzaXplID0gcmktPmNzaXplOworCQlyaS0+Y3NpemUgPSBjcHVfdG9famUzMigwKTsKKwl9CisKKwlEMShpZihvZnMgKyBsZW4gPiBqZTMyX3RvX2NwdShyaS0+ZHNpemUpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX3JlYWRfZG5vZGUoKSBhc2tlZCBmb3IgJWQgYnl0ZXMgYXQgJWQgZnJvbSAlZC1ieXRlIG5vZGVcbiIsCisJCSAgICAgICBsZW4sIG9mcywgamUzMl90b19jcHUocmktPmRzaXplKSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3JpOworCX0pOworCisJCisJaWYgKHJpLT5jb21wciA9PSBKRkZTMl9DT01QUl9aRVJPKSB7CisJCW1lbXNldChidWYsIDAsIGxlbik7CisJCWdvdG8gb3V0X3JpOworCX0KKworCS8qIENhc2VzOgorCSAgIFJlYWRpbmcgd2hvbGUgbm9kZSBhbmQgaXQncyB1bmNvbXByZXNzZWQgLSByZWFkIGRpcmVjdGx5IHRvIGJ1ZmZlciBwcm92aWRlZCwgY2hlY2sgQ1JDLgorCSAgIFJlYWRpbmcgd2hvbGUgbm9kZSBhbmQgaXQncyBjb21wcmVzc2VkIC0gcmVhZCBpbnRvIGNvbXByYnVmLCBjaGVjayBDUkMgYW5kIGRlY29tcHJlc3MgdG8gYnVmZmVyIHByb3ZpZGVkIAorCSAgIFJlYWRpbmcgcGFydGlhbCBub2RlIGFuZCBpdCdzIHVuY29tcHJlc3NlZCAtIHJlYWQgaW50byByZWFkYnVmLCBjaGVjayBDUkMsIGFuZCBjb3B5IAorCSAgIFJlYWRpbmcgcGFydGlhbCBub2RlIGFuZCBpdCdzIGNvbXByZXNzZWQgLSByZWFkIGludG8gcmVhZGJ1ZiwgY2hlY2sgY2hlY2tzdW0sIGRlY29tcHJlc3MgdG8gZGVjb21wcmJ1ZiBhbmQgY29weQorCSovCisJaWYgKHJpLT5jb21wciA9PSBKRkZTMl9DT01QUl9OT05FICYmIGxlbiA9PSBqZTMyX3RvX2NwdShyaS0+ZHNpemUpKSB7CisJCXJlYWRidWYgPSBidWY7CisJfSBlbHNlIHsKKwkJcmVhZGJ1ZiA9IGttYWxsb2MoamUzMl90b19jcHUocmktPmNzaXplKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcmVhZGJ1ZikgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X3JpOworCQl9CisJfQorCWlmIChyaS0+Y29tcHIgIT0gSkZGUzJfQ09NUFJfTk9ORSkgeworCQlpZiAobGVuIDwgamUzMl90b19jcHUocmktPmRzaXplKSkgeworCQkJZGVjb21wcmJ1ZiA9IGttYWxsb2MoamUzMl90b19jcHUocmktPmRzaXplKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWRlY29tcHJidWYpIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0X3JlYWRidWY7CisJCQl9CisJCX0gZWxzZSB7CisJCQlkZWNvbXByYnVmID0gYnVmOworCQl9CisJfSBlbHNlIHsKKwkJZGVjb21wcmJ1ZiA9IHJlYWRidWY7CisJfQorCisJRDIocHJpbnRrKEtFUk5fREVCVUcgIlJlYWQgJWQgYnl0ZXMgdG8gJXBcbiIsIGplMzJfdG9fY3B1KHJpLT5jc2l6ZSksCisJCSAgcmVhZGJ1ZikpOworCXJldCA9IGpmZnMyX2ZsYXNoX3JlYWQoYywgKHJlZl9vZmZzZXQoZmQtPnJhdykpICsgc2l6ZW9mKCpyaSksCisJCQkgICAgICAgamUzMl90b19jcHUocmktPmNzaXplKSwgJnJlYWRsZW4sIHJlYWRidWYpOworCisJaWYgKCFyZXQgJiYgcmVhZGxlbiAhPSBqZTMyX3RvX2NwdShyaS0+Y3NpemUpKQorCQlyZXQgPSAtRUlPOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2RlY29tcHJidWY7CisKKwljcmMgPSBjcmMzMigwLCByZWFkYnVmLCBqZTMyX3RvX2NwdShyaS0+Y3NpemUpKTsKKwlpZiAoY3JjICE9IGplMzJfdG9fY3B1KHJpLT5kYXRhX2NyYykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGF0YSBDUkMgJTA4eCAhPSBjYWxjdWxhdGVkIENSQyAlMDh4IGZvciBub2RlIGF0ICUwOHhcbiIsCisJCSAgICAgICBqZTMyX3RvX2NwdShyaS0+ZGF0YV9jcmMpLCBjcmMsIHJlZl9vZmZzZXQoZmQtPnJhdykpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dF9kZWNvbXByYnVmOworCX0KKwlEMihwcmludGsoS0VSTl9ERUJVRyAiRGF0YSBDUkMgbWF0Y2hlcyBjYWxjdWxhdGVkIENSQyAlMDh4XG4iLCBjcmMpKTsKKwlpZiAocmktPmNvbXByICE9IEpGRlMyX0NPTVBSX05PTkUpIHsKKwkJRDIocHJpbnRrKEtFUk5fREVCVUcgIkRlY29tcHJlc3MgJWQgYnl0ZXMgZnJvbSAlcCB0byAlZCBieXRlcyBhdCAlcFxuIiwKKwkJCSAgamUzMl90b19jcHUocmktPmNzaXplKSwgcmVhZGJ1ZiwgamUzMl90b19jcHUocmktPmRzaXplKSwgZGVjb21wcmJ1ZikpOyAKKwkJcmV0ID0gamZmczJfZGVjb21wcmVzcyhjLCBmLCByaS0+Y29tcHIgfCAocmktPnVzZXJjb21wciA8PCA4KSwgcmVhZGJ1ZiwgZGVjb21wcmJ1ZiwgamUzMl90b19jcHUocmktPmNzaXplKSwgamUzMl90b19jcHUocmktPmRzaXplKSk7CisJCWlmIChyZXQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVycm9yOiBqZmZzMl9kZWNvbXByZXNzIHJldHVybmVkICVkXG4iLCByZXQpOworCQkJZ290byBvdXRfZGVjb21wcmJ1ZjsKKwkJfQorCX0KKworCWlmIChsZW4gPCBqZTMyX3RvX2NwdShyaS0+ZHNpemUpKSB7CisJCW1lbWNweShidWYsIGRlY29tcHJidWYrb2ZzLCBsZW4pOworCX0KKyBvdXRfZGVjb21wcmJ1ZjoKKwlpZihkZWNvbXByYnVmICE9IGJ1ZiAmJiBkZWNvbXByYnVmICE9IHJlYWRidWYpCisJCWtmcmVlKGRlY29tcHJidWYpOworIG91dF9yZWFkYnVmOgorCWlmKHJlYWRidWYgIT0gYnVmKQorCQlrZnJlZShyZWFkYnVmKTsKKyBvdXRfcmk6CisJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGpmZnMyX3JlYWRfaW5vZGVfcmFuZ2Uoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLAorCQkJICAgdW5zaWduZWQgY2hhciAqYnVmLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGxlbikKK3sKKwl1aW50MzJfdCBlbmQgPSBvZmZzZXQgKyBsZW47CisJc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqZnJhZzsKKwlpbnQgcmV0OworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3JlYWRfaW5vZGVfcmFuZ2U6IGlubyAjJXUsIHJhbmdlIDB4JTA4eC0weCUwOHhcbiIsCisJCSAgZi0+aW5vY2FjaGUtPmlubywgb2Zmc2V0LCBvZmZzZXQrbGVuKSk7CisKKwlmcmFnID0gamZmczJfbG9va3VwX25vZGVfZnJhZygmZi0+ZnJhZ3RyZWUsIG9mZnNldCk7CisKKwkvKiBYWFggRklYTUU6IFdoZXJlIGEgc2luZ2xlIHBoeXNpY2FsIG5vZGUgYWN0dWFsbHkgc2hvd3MgdXAgaW4gdHdvCisJICAgZnJhZ3MsIHdlIHJlYWQgaXQgdHdpY2UuIERvbid0IGRvIHRoYXQuICovCisJLyogTm93IHdlJ3JlIHBvaW50aW5nIGF0IHRoZSBmaXJzdCBmcmFnIHdoaWNoIG92ZXJsYXBzIG91ciBwYWdlICovCisJd2hpbGUob2Zmc2V0IDwgZW5kKSB7CisJCUQyKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9yZWFkX2lub2RlX3JhbmdlOiBvZmZzZXQgJWQsIGVuZCAlZFxuIiwgb2Zmc2V0LCBlbmQpKTsKKwkJaWYgKHVubGlrZWx5KCFmcmFnIHx8IGZyYWctPm9mcyA+IG9mZnNldCkpIHsKKwkJCXVpbnQzMl90IGhvbGVzaXplID0gZW5kIC0gb2Zmc2V0OworCQkJaWYgKGZyYWcpIHsKKwkJCQlEMShwcmludGsoS0VSTl9OT1RJQ0UgIkVlcC4gSG9sZSBpbiBpbm8gIyV1IGZyYWdsaXN0LiBmcmFnLT5vZnMgPSAweCUwOHgsIG9mZnNldCA9IDB4JTA4eFxuIiwgZi0+aW5vY2FjaGUtPmlubywgZnJhZy0+b2ZzLCBvZmZzZXQpKTsKKwkJCQlob2xlc2l6ZSA9IG1pbihob2xlc2l6ZSwgZnJhZy0+b2ZzIC0gb2Zmc2V0KTsKKwkJCQlEMihqZmZzMl9wcmludF9mcmFnX2xpc3QoZikpOworCQkJfQorCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkZpbGxpbmcgbm9uLWZyYWcgaG9sZSBmcm9tICVkLSVkXG4iLCBvZmZzZXQsIG9mZnNldCtob2xlc2l6ZSkpOworCQkJbWVtc2V0KGJ1ZiwgMCwgaG9sZXNpemUpOworCQkJYnVmICs9IGhvbGVzaXplOworCQkJb2Zmc2V0ICs9IGhvbGVzaXplOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAodW5saWtlbHkoIWZyYWctPm5vZGUpKSB7CisJCQl1aW50MzJfdCBob2xlZW5kID0gbWluKGVuZCwgZnJhZy0+b2ZzICsgZnJhZy0+c2l6ZSk7CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRmlsbGluZyBmcmFnIGhvbGUgZnJvbSAlZC0lZCAoZnJhZyAweCV4IDB4JXgpXG4iLCBvZmZzZXQsIGhvbGVlbmQsIGZyYWctPm9mcywgZnJhZy0+b2ZzICsgZnJhZy0+c2l6ZSkpOworCQkJbWVtc2V0KGJ1ZiwgMCwgaG9sZWVuZCAtIG9mZnNldCk7CisJCQlidWYgKz0gaG9sZWVuZCAtIG9mZnNldDsKKwkJCW9mZnNldCA9IGhvbGVlbmQ7CisJCQlmcmFnID0gZnJhZ19uZXh0KGZyYWcpOworCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQl1aW50MzJfdCByZWFkbGVuOworCQkJdWludDMyX3QgZnJhZ29mczsgLyogb2Zmc2V0IHdpdGhpbiB0aGUgZnJhZyB0byBzdGFydCByZWFkaW5nICovCisJCQkKKwkJCWZyYWdvZnMgPSBvZmZzZXQgLSBmcmFnLT5vZnM7CisJCQlyZWFkbGVuID0gbWluKGZyYWctPnNpemUgLSBmcmFnb2ZzLCBlbmQgLSBvZmZzZXQpOworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJlYWRpbmcgJWQtJWQgZnJvbSBub2RlIGF0IDB4JTA4eCAoJWQpXG4iLAorCQkJCSAgZnJhZy0+b2ZzK2ZyYWdvZnMsIGZyYWctPm9mcytmcmFnb2ZzK3JlYWRsZW4sCisJCQkJICByZWZfb2Zmc2V0KGZyYWctPm5vZGUtPnJhdyksIHJlZl9mbGFncyhmcmFnLT5ub2RlLT5yYXcpKSk7CisJCQlyZXQgPSBqZmZzMl9yZWFkX2Rub2RlKGMsIGYsIGZyYWctPm5vZGUsIGJ1ZiwgZnJhZ29mcyArIGZyYWctPm9mcyAtIGZyYWctPm5vZGUtPm9mcywgcmVhZGxlbik7CisJCQlEMihwcmludGsoS0VSTl9ERUJVRyAibm9kZSByZWFkIGRvbmVcbiIpKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyJqZmZzMl9yZWFkX2lub2RlX3JhbmdlIGVycm9yICVkXG4iLHJldCkpOworCQkJCW1lbXNldChidWYsIDAsIHJlYWRsZW4pOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQlidWYgKz0gcmVhZGxlbjsKKwkJCW9mZnNldCArPSByZWFkbGVuOworCQkJZnJhZyA9IGZyYWdfbmV4dChmcmFnKTsKKwkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJub2RlIHJlYWQgd2FzIE9LLiBMb29waW5nXG4iKSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENvcmUgZnVuY3Rpb24gdG8gcmVhZCBzeW1saW5rIHRhcmdldC4gKi8KK2NoYXIgKmpmZnMyX2dldGxpbmsoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmKQoreworCWNoYXIgKmJ1ZjsKKwlpbnQgcmV0OworCisJZG93bigmZi0+c2VtKTsKKworCWlmICghZi0+bWV0YWRhdGEpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJObyBtZXRhZGF0YSBmb3Igc3ltbGluayBpbm9kZSAjJXVcbiIsIGYtPmlub2NhY2hlLT5pbm8pOworCQl1cCgmZi0+c2VtKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCWJ1ZiA9IGttYWxsb2MoZi0+bWV0YWRhdGEtPnNpemUrMSwgR0ZQX1VTRVIpOworCWlmICghYnVmKSB7CisJCXVwKCZmLT5zZW0pOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJYnVmW2YtPm1ldGFkYXRhLT5zaXplXT0wOworCisJcmV0ID0gamZmczJfcmVhZF9kbm9kZShjLCBmLCBmLT5tZXRhZGF0YSwgYnVmLCAwLCBmLT5tZXRhZGF0YS0+c2l6ZSk7CisKKwl1cCgmZi0+c2VtKTsKKworCWlmIChyZXQpIHsKKwkJa2ZyZWUoYnVmKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3JlYWRpbm9kZS5jIGIvZnMvamZmczIvcmVhZGlub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhNGEwYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL3JlYWRpbm9kZS5jCkBAIC0wLDAgKzEsNjk1IEBACisvKgorICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiAkSWQ6IHJlYWRpbm9kZS5jLHYgMS4xMTcgMjAwNC8xMS8yMCAxODowNjo1NCBkd213MiBFeHAgJAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSAibm9kZWxpc3QuaCIKKworc3RhdGljIGludCBqZmZzMl9hZGRfZnJhZ190b19mcmFndHJlZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IHJiX3Jvb3QgKmxpc3QsIHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKm5ld2ZyYWcpOworCisjaWYgQ09ORklHX0pGRlMyX0ZTX0RFQlVHID49IDIKK3N0YXRpYyB2b2lkIGpmZnMyX3ByaW50X2ZyYWd0cmVlKHN0cnVjdCByYl9yb290ICpsaXN0LCBpbnQgcGVybWl0YnVnKQoreworCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKnRoaXMgPSBmcmFnX2ZpcnN0KGxpc3QpOworCXVpbnQzMl90IGxhc3RvZnMgPSAwOworCWludCBidWdneSA9IDA7CisKKwl3aGlsZSh0aGlzKSB7CisJCWlmICh0aGlzLT5ub2RlKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImZyYWcgJTA0eC0lMDR4OiAweCUwOHgoJWQpIG9uIGZsYXNoICgqJXApLiBsZWZ0ICglcCksIHJpZ2h0ICglcCksIHBhcmVudCAoJXApXG4iLAorCQkJICAgICAgIHRoaXMtPm9mcywgdGhpcy0+b2ZzK3RoaXMtPnNpemUsIHJlZl9vZmZzZXQodGhpcy0+bm9kZS0+cmF3KSwgcmVmX2ZsYWdzKHRoaXMtPm5vZGUtPnJhdyksCisJCQkgICAgICAgdGhpcywgZnJhZ19sZWZ0KHRoaXMpLCBmcmFnX3JpZ2h0KHRoaXMpLCBmcmFnX3BhcmVudCh0aGlzKSk7CisJCWVsc2UgCisJCQlwcmludGsoS0VSTl9ERUJVRyAiZnJhZyAlMDR4LSUwNHg6IGhvbGUgKColcCkuIGxlZnQgKCVwfSByaWdodCAoJXApLCBwYXJlbnQgKCVwKVxuIiwgdGhpcy0+b2ZzLCAKKwkJCSAgICAgICB0aGlzLT5vZnMrdGhpcy0+c2l6ZSwgdGhpcywgZnJhZ19sZWZ0KHRoaXMpLCBmcmFnX3JpZ2h0KHRoaXMpLCBmcmFnX3BhcmVudCh0aGlzKSk7CisJCWlmICh0aGlzLT5vZnMgIT0gbGFzdG9mcykKKwkJCWJ1Z2d5ID0gMTsKKwkJbGFzdG9mcyA9IHRoaXMtPm9mcyt0aGlzLT5zaXplOworCQl0aGlzID0gZnJhZ19uZXh0KHRoaXMpOworCX0KKwlpZiAoYnVnZ3kgJiYgIXBlcm1pdGJ1ZykgeworCQlwcmludGsoS0VSTl9DUklUICJGcmFnIHRyZWUgZ290IGEgaG9sZSBpbiBpdFxuIik7CisJCUJVRygpOworCX0KK30KKwordm9pZCBqZmZzMl9wcmludF9mcmFnX2xpc3Qoc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYpCit7CisJamZmczJfcHJpbnRfZnJhZ3RyZWUoJmYtPmZyYWd0cmVlLCAwKTsKKworCWlmIChmLT5tZXRhZGF0YSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAibWV0YWRhdGEgYXQgMHglMDh4XG4iLCByZWZfb2Zmc2V0KGYtPm1ldGFkYXRhLT5yYXcpKTsKKwl9Cit9CisjZW5kaWYKKworI2lmIENPTkZJR19KRkZTMl9GU19ERUJVRyA+PSAxCitzdGF0aWMgaW50IGpmZnMyX3Nhbml0eWNoZWNrX2ZyYWd0cmVlKHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmKQoreworCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKmZyYWc7CisJaW50IGJpdGNoZWQgPSAwOworCisJZm9yIChmcmFnID0gZnJhZ19maXJzdCgmZi0+ZnJhZ3RyZWUpOyBmcmFnOyBmcmFnID0gZnJhZ19uZXh0KGZyYWcpKSB7CisKKwkJc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmZuID0gZnJhZy0+bm9kZTsKKwkJaWYgKCFmbiB8fCAhZm4tPnJhdykKKwkJCWNvbnRpbnVlOworCisJCWlmIChyZWZfZmxhZ3MoZm4tPnJhdykgPT0gUkVGX1BSSVNUSU5FKSB7CisKKwkJCWlmIChmbi0+ZnJhZ3MgPiAxKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUkVGX1BSSVNUSU5FIG5vZGUgYXQgMHglMDh4IGhhZCAlZCBmcmFncy4gVGVsbCBkd213MlxuIiwgcmVmX29mZnNldChmbi0+cmF3KSwgZm4tPmZyYWdzKTsKKwkJCQliaXRjaGVkID0gMTsKKwkJCX0KKwkJCS8qIEEgaG9sZSBub2RlIHdoaWNoIGlzbid0IG11bHRpLXBhZ2Ugc2hvdWxkIGJlIGdhcmJhZ2UtY29sbGVjdGVkCisJCQkgICBhbmQgbWVyZ2VkIGFueXdheSwgc28gd2UganVzdCBjaGVjayBmb3IgdGhlIGZyYWcgc2l6ZSBoZXJlLAorCQkJICAgcmF0aGVyIHRoYW4gbXVja2luZyBhcm91bmQgd2l0aCBhY3R1YWxseSByZWFkaW5nIHRoZSBub2RlCisJCQkgICBhbmQgY2hlY2tpbmcgdGhlIGNvbXByZXNzaW9uIHR5cGUsIHdoaWNoIGlzIHRoZSByZWFsIHdheQorCQkJICAgdG8gdGVsbCBhIGhvbGUgbm9kZS4gKi8KKwkJCWlmIChmcmFnLT5vZnMgJiAoUEFHRV9DQUNIRV9TSVpFLTEpICYmIGZyYWdfcHJldihmcmFnKSAmJiBmcmFnX3ByZXYoZnJhZyktPnNpemUgPCBQQUdFX0NBQ0hFX1NJWkUgJiYgZnJhZ19wcmV2KGZyYWcpLT5ub2RlKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUkVGX1BSSVNUSU5FIG5vZGUgYXQgMHglMDh4IGhhZCBhIHByZXZpb3VzIG5vbi1ob2xlIGZyYWcgaW4gdGhlIHNhbWUgcGFnZS4gVGVsbCBkd213MlxuIiwKKwkJCQkgICAgICAgcmVmX29mZnNldChmbi0+cmF3KSk7CisJCQkJYml0Y2hlZCA9IDE7CisJCQl9CisKKwkJCWlmICgoZnJhZy0+b2ZzK2ZyYWctPnNpemUpICYgKFBBR0VfQ0FDSEVfU0laRS0xKSAmJiBmcmFnX25leHQoZnJhZykgJiYgZnJhZ19uZXh0KGZyYWcpLT5zaXplIDwgUEFHRV9DQUNIRV9TSVpFICYmIGZyYWdfbmV4dChmcmFnKS0+bm9kZSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJFRl9QUklTVElORSBub2RlIGF0IDB4JTA4eCAoJTA4eC0lMDh4KSBoYWQgYSBmb2xsb3dpbmcgbm9uLWhvbGUgZnJhZyBpbiB0aGUgc2FtZSBwYWdlLiBUZWxsIGR3bXcyXG4iLAorCQkJCSAgICAgICByZWZfb2Zmc2V0KGZuLT5yYXcpLCBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplKTsKKwkJCQliaXRjaGVkID0gMTsKKwkJCX0KKwkJfQorCX0KKwkKKwlpZiAoYml0Y2hlZCkgeworCQlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICp0aGlzZnJhZzsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICJJbm9kZSBpcyAjJXVcbiIsIGYtPmlub2NhY2hlLT5pbm8pOworCQl0aGlzZnJhZyA9IGZyYWdfZmlyc3QoJmYtPmZyYWd0cmVlKTsKKwkJd2hpbGUgKHRoaXNmcmFnKSB7CisJCQlpZiAoIXRoaXNmcmFnLT5ub2RlKSB7CisJCQkJcHJpbnRrKCJGcmFnIEAweCV4LTB4JXg7IG5vZGUtbGVzcyBob2xlXG4iLAorCQkJCSAgICAgICB0aGlzZnJhZy0+b2ZzLCB0aGlzZnJhZy0+c2l6ZSArIHRoaXNmcmFnLT5vZnMpOworCQkJfSBlbHNlIGlmICghdGhpc2ZyYWctPm5vZGUtPnJhdykgeworCQkJCXByaW50aygiRnJhZyBAMHgleC0weCV4OyByYXctbGVzcyBob2xlXG4iLAorCQkJCSAgICAgICB0aGlzZnJhZy0+b2ZzLCB0aGlzZnJhZy0+c2l6ZSArIHRoaXNmcmFnLT5vZnMpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoIkZyYWcgQDB4JXgtMHgleDsgcmF3IGF0IDB4JTA4eCglZCkgKDB4JXgtMHgleClcbiIsCisJCQkJICAgICAgIHRoaXNmcmFnLT5vZnMsIHRoaXNmcmFnLT5zaXplICsgdGhpc2ZyYWctPm9mcywKKwkJCQkgICAgICAgcmVmX29mZnNldCh0aGlzZnJhZy0+bm9kZS0+cmF3KSwgcmVmX2ZsYWdzKHRoaXNmcmFnLT5ub2RlLT5yYXcpLAorCQkJCSAgICAgICB0aGlzZnJhZy0+bm9kZS0+b2ZzLCB0aGlzZnJhZy0+bm9kZS0+b2ZzK3RoaXNmcmFnLT5ub2RlLT5zaXplKTsKKwkJCX0KKwkJCXRoaXNmcmFnID0gZnJhZ19uZXh0KHRoaXNmcmFnKTsKKwkJfQorCX0KKwlyZXR1cm4gYml0Y2hlZDsKK30KKyNlbmRpZiAvKiBEMSAqLworCitzdGF0aWMgdm9pZCBqZmZzMl9vYnNvbGV0ZV9ub2RlX2ZyYWcoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKnRoaXMpCit7CisJaWYgKHRoaXMtPm5vZGUpIHsKKwkJdGhpcy0+bm9kZS0+ZnJhZ3MtLTsKKwkJaWYgKCF0aGlzLT5ub2RlLT5mcmFncykgeworCQkJLyogVGhlIG5vZGUgaGFzIG5vIHZhbGlkIGZyYWdzIGxlZnQuIEl0J3MgdG90YWxseSBvYnNvbGV0ZWQgKi8KKwkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJNYXJraW5nIG9sZCBub2RlIEAweCUwOHggKDB4JTA0eC0weCUwNHgpIG9ic29sZXRlXG4iLAorCQkJCSAgcmVmX29mZnNldCh0aGlzLT5ub2RlLT5yYXcpLCB0aGlzLT5ub2RlLT5vZnMsIHRoaXMtPm5vZGUtPm9mcyt0aGlzLT5ub2RlLT5zaXplKSk7CisJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgdGhpcy0+bm9kZS0+cmF3KTsKKwkJCWpmZnMyX2ZyZWVfZnVsbF9kbm9kZSh0aGlzLT5ub2RlKTsKKwkJfSBlbHNlIHsKKwkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJNYXJraW5nIG9sZCBub2RlIEAweCUwOHggKDB4JTA0eC0weCUwNHgpIFJFRl9OT1JNQUwuIGZyYWdzIGlzICVkXG4iLAorCQkJCSAgcmVmX29mZnNldCh0aGlzLT5ub2RlLT5yYXcpLCB0aGlzLT5ub2RlLT5vZnMsIHRoaXMtPm5vZGUtPm9mcyt0aGlzLT5ub2RlLT5zaXplLAorCQkJCSAgdGhpcy0+bm9kZS0+ZnJhZ3MpKTsKKwkJCW1hcmtfcmVmX25vcm1hbCh0aGlzLT5ub2RlLT5yYXcpOworCQl9CisJCQorCX0KKwlqZmZzMl9mcmVlX25vZGVfZnJhZyh0aGlzKTsKK30KKworLyogR2l2ZW4gYW4gaW5vZGUsIHByb2JhYmx5IHdpdGggZXhpc3RpbmcgbGlzdCBvZiBmcmFnbWVudHMsIGFkZCB0aGUgbmV3IG5vZGUKKyAqIHRvIHRoZSBmcmFnbWVudCBsaXN0LgorICovCitpbnQgamZmczJfYWRkX2Z1bGxfZG5vZGVfdG9faW5vZGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCBzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZm4pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpuZXdmcmFnOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2FkZF9mdWxsX2Rub2RlX3RvX2lub2RlKGlubyAjJXUsIGYgJXAsIGZuICVwKVxuIiwgZi0+aW5vY2FjaGUtPmlubywgZiwgZm4pKTsKKworCW5ld2ZyYWcgPSBqZmZzMl9hbGxvY19ub2RlX2ZyYWcoKTsKKwlpZiAodW5saWtlbHkoIW5ld2ZyYWcpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCUQyKHByaW50ayhLRVJOX0RFQlVHICJhZGRpbmcgbm9kZSAlMDR4LSUwNHggQDB4JTA4eCBvbiBmbGFzaCwgbmV3ZnJhZyAqJXBcbiIsCisJCSAgZm4tPm9mcywgZm4tPm9mcytmbi0+c2l6ZSwgcmVmX29mZnNldChmbi0+cmF3KSwgbmV3ZnJhZykpOworCQorCWlmICh1bmxpa2VseSghZm4tPnNpemUpKSB7CisJCWpmZnMyX2ZyZWVfbm9kZV9mcmFnKG5ld2ZyYWcpOworCQlyZXR1cm4gMDsKKwl9CisKKwluZXdmcmFnLT5vZnMgPSBmbi0+b2ZzOworCW5ld2ZyYWctPnNpemUgPSBmbi0+c2l6ZTsKKwluZXdmcmFnLT5ub2RlID0gZm47CisJbmV3ZnJhZy0+bm9kZS0+ZnJhZ3MgPSAxOworCisJcmV0ID0gamZmczJfYWRkX2ZyYWdfdG9fZnJhZ3RyZWUoYywgJmYtPmZyYWd0cmVlLCBuZXdmcmFnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogSWYgd2Ugbm93IHNoYXJlIGEgcGFnZSB3aXRoIG90aGVyIG5vZGVzLCBtYXJrIGVpdGhlciBwcmV2aW91cworCSAgIG9yIG5leHQgbm9kZSBSRUZfTk9STUFMLCBhcyBhcHByb3ByaWF0ZS4gICovCisJaWYgKG5ld2ZyYWctPm9mcyAmIChQQUdFX0NBQ0hFX1NJWkUtMSkpIHsKKwkJc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqcHJldiA9IGZyYWdfcHJldihuZXdmcmFnKTsKKworCQltYXJrX3JlZl9ub3JtYWwoZm4tPnJhdyk7CisJCS8qIElmIHdlIGRvbid0IHN0YXJ0IGF0IHplcm8gdGhlcmUncyBfYWx3YXlzXyBhIHByZXZpb3VzICovCQorCQlpZiAocHJldi0+bm9kZSkKKwkJCW1hcmtfcmVmX25vcm1hbChwcmV2LT5ub2RlLT5yYXcpOworCX0KKworCWlmICgobmV3ZnJhZy0+b2ZzK25ld2ZyYWctPnNpemUpICYgKFBBR0VfQ0FDSEVfU0laRS0xKSkgeworCQlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpuZXh0ID0gZnJhZ19uZXh0KG5ld2ZyYWcpOworCQkKKwkJaWYgKG5leHQpIHsKKwkJCW1hcmtfcmVmX25vcm1hbChmbi0+cmF3KTsKKwkJCWlmIChuZXh0LT5ub2RlKQorCQkJCW1hcmtfcmVmX25vcm1hbChuZXh0LT5ub2RlLT5yYXcpOworCQl9CisJfQorCUQyKGlmIChqZmZzMl9zYW5pdHljaGVja19mcmFndHJlZShmKSkgeworCQkgICBwcmludGsoS0VSTl9XQVJOSU5HICJKdXN0IGFkZGVkIG5vZGUgJTA0eC0lMDR4IEAweCUwOHggb24gZmxhc2gsIG5ld2ZyYWcgKiVwXG4iLAorCQkJICBmbi0+b2ZzLCBmbi0+b2ZzK2ZuLT5zaXplLCByZWZfb2Zmc2V0KGZuLT5yYXcpLCBuZXdmcmFnKTsKKwkJICAgcmV0dXJuIDA7CisJICAgfSkKKwlEMihqZmZzMl9wcmludF9mcmFnX2xpc3QoZikpOworCXJldHVybiAwOworfQorCisvKiBEb2Vzbid0IHNldCBpbm9kZS0+aV9zaXplICovCitzdGF0aWMgaW50IGpmZnMyX2FkZF9mcmFnX3RvX2ZyYWd0cmVlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgcmJfcm9vdCAqbGlzdCwgc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqbmV3ZnJhZykKK3sKKwlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICp0aGlzOworCXVpbnQzMl90IGxhc3RlbmQ7CisKKwkvKiBTa2lwIGFsbCB0aGUgbm9kZXMgd2hpY2ggYXJlIGNvbXBsZXRlZCBiZWZvcmUgdGhpcyBvbmUgc3RhcnRzICovCisJdGhpcyA9IGpmZnMyX2xvb2t1cF9ub2RlX2ZyYWcobGlzdCwgbmV3ZnJhZy0+bm9kZS0+b2ZzKTsKKworCWlmICh0aGlzKSB7CisJCUQyKHByaW50ayhLRVJOX0RFQlVHICJqX2FfZl9kX3RfZjogTG9va3VwIGdhdmUgZnJhZyAweCUwNHgtMHglMDR4OyBwaHlzIDB4JTA4eCAoKiVwKVxuIiwKKwkJCSAgdGhpcy0+b2ZzLCB0aGlzLT5vZnMrdGhpcy0+c2l6ZSwgdGhpcy0+bm9kZT8ocmVmX29mZnNldCh0aGlzLT5ub2RlLT5yYXcpKToweGZmZmZmZmZmLCB0aGlzKSk7CisJCWxhc3RlbmQgPSB0aGlzLT5vZnMgKyB0aGlzLT5zaXplOworCX0gZWxzZSB7CisJCUQyKHByaW50ayhLRVJOX0RFQlVHICJqX2FfZl9kX3RfZjogTG9va3VwIGdhdmUgbm8gZnJhZ1xuIikpOworCQlsYXN0ZW5kID0gMDsKKwl9CisJCQkgIAorCS8qIFNlZSBpZiB3ZSByYW4gb2ZmIHRoZSBlbmQgb2YgdGhlIGxpc3QgKi8KKwlpZiAobGFzdGVuZCA8PSBuZXdmcmFnLT5vZnMpIHsKKwkJLyogV2UgZGlkICovCisKKwkJLyogQ2hlY2sgaWYgJ3RoaXMnIG5vZGUgd2FzIG9uIHRoZSBzYW1lIHBhZ2UgYXMgdGhlIG5ldyBub2RlLgorCQkgICBJZiBzbywgYm90aCAndGhpcycgYW5kIHRoZSBuZXcgbm9kZSBnZXQgbWFya2VkIFJFRl9OT1JNQUwgc28KKwkJICAgdGhlIEdDIGNhbiB0YWtlIGEgbG9vay4KKwkJKi8KKwkJaWYgKGxhc3RlbmQgJiYgKGxhc3RlbmQtMSkgPj4gUEFHRV9DQUNIRV9TSElGVCA9PSBuZXdmcmFnLT5vZnMgPj4gUEFHRV9DQUNIRV9TSElGVCkgeworCQkJaWYgKHRoaXMtPm5vZGUpCisJCQkJbWFya19yZWZfbm9ybWFsKHRoaXMtPm5vZGUtPnJhdyk7CisJCQltYXJrX3JlZl9ub3JtYWwobmV3ZnJhZy0+bm9kZS0+cmF3KTsKKwkJfQorCisJCWlmIChsYXN0ZW5kIDwgbmV3ZnJhZy0+bm9kZS0+b2ZzKSB7CisJCQkvKiAuLi4gYW5kIHdlIG5lZWQgdG8gcHV0IGEgaG9sZSBpbiBiZWZvcmUgdGhlIG5ldyBub2RlICovCisJCQlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpob2xlZnJhZyA9IGpmZnMyX2FsbG9jX25vZGVfZnJhZygpOworCQkJaWYgKCFob2xlZnJhZykgeworCQkJCWpmZnMyX2ZyZWVfbm9kZV9mcmFnKG5ld2ZyYWcpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJaG9sZWZyYWctPm9mcyA9IGxhc3RlbmQ7CisJCQlob2xlZnJhZy0+c2l6ZSA9IG5ld2ZyYWctPm5vZGUtPm9mcyAtIGxhc3RlbmQ7CisJCQlob2xlZnJhZy0+bm9kZSA9IE5VTEw7CisJCQlpZiAodGhpcykgeworCQkJCS8qIEJ5IGRlZmluaXRpb24sIHRoZSAndGhpcycgbm9kZSBoYXMgbm8gcmlnaHQtaGFuZCBjaGlsZCwgCisJCQkJICAgYmVjYXVzZSB0aGVyZSBhcmUgbm8gZnJhZ3Mgd2l0aCBvZmZzZXQgZ3JlYXRlciB0aGFuIGl0LgorCQkJCSAgIFNvIHRoYXQncyB3aGVyZSB3ZSB3YW50IHRvIHB1dCB0aGUgaG9sZSAqLworCQkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJBZGRpbmcgaG9sZSBmcmFnICglcCkgb24gcmlnaHQgb2Ygbm9kZSBhdCAoJXApXG4iLCBob2xlZnJhZywgdGhpcykpOworCQkJCXJiX2xpbmtfbm9kZSgmaG9sZWZyYWctPnJiLCAmdGhpcy0+cmIsICZ0aGlzLT5yYi5yYl9yaWdodCk7CisJCQl9IGVsc2UgeworCQkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJBZGRpbmcgaG9sZSBmcmFnICglcCkgYXQgcm9vdCBvZiB0cmVlXG4iLCBob2xlZnJhZykpOworCQkJCXJiX2xpbmtfbm9kZSgmaG9sZWZyYWctPnJiLCBOVUxMLCAmbGlzdC0+cmJfbm9kZSk7CisJCQl9CisJCQlyYl9pbnNlcnRfY29sb3IoJmhvbGVmcmFnLT5yYiwgbGlzdCk7CisJCQl0aGlzID0gaG9sZWZyYWc7CisJCX0KKwkJaWYgKHRoaXMpIHsKKwkJCS8qIEJ5IGRlZmluaXRpb24sIHRoZSAndGhpcycgbm9kZSBoYXMgbm8gcmlnaHQtaGFuZCBjaGlsZCwgCisJCQkgICBiZWNhdXNlIHRoZXJlIGFyZSBubyBmcmFncyB3aXRoIG9mZnNldCBncmVhdGVyIHRoYW4gaXQuCisJCQkgICBTbyB0aGF0J3Mgd2hlcmUgd2Ugd2FudCB0byBwdXQgdGhlIGhvbGUgKi8KKwkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJBZGRpbmcgbmV3IGZyYWcgKCVwKSBvbiByaWdodCBvZiBub2RlIGF0ICglcClcbiIsIG5ld2ZyYWcsIHRoaXMpKTsKKwkJCXJiX2xpbmtfbm9kZSgmbmV3ZnJhZy0+cmIsICZ0aGlzLT5yYiwgJnRoaXMtPnJiLnJiX3JpZ2h0KTsJCQkKKwkJfSBlbHNlIHsKKwkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJBZGRpbmcgbmV3IGZyYWcgKCVwKSBhdCByb290IG9mIHRyZWVcbiIsIG5ld2ZyYWcpKTsKKwkJCXJiX2xpbmtfbm9kZSgmbmV3ZnJhZy0+cmIsIE5VTEwsICZsaXN0LT5yYl9ub2RlKTsKKwkJfQorCQlyYl9pbnNlcnRfY29sb3IoJm5ld2ZyYWctPnJiLCBsaXN0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJRDIocHJpbnRrKEtFUk5fREVCVUcgImpfYV9mX2RfdF9mOiBkZWFsaW5nIHdpdGggZnJhZyAweCUwNHgtMHglMDR4OyBwaHlzIDB4JTA4eCAoKiVwKVxuIiwgCisJCSAgdGhpcy0+b2ZzLCB0aGlzLT5vZnMrdGhpcy0+c2l6ZSwgdGhpcy0+bm9kZT8ocmVmX29mZnNldCh0aGlzLT5ub2RlLT5yYXcpKToweGZmZmZmZmZmLCB0aGlzKSk7CisKKwkvKiBPSy4gJ3RoaXMnIGlzIHBvaW50aW5nIGF0IHRoZSBmaXJzdCBmcmFnIHRoYXQgbmV3ZnJhZy0+b2ZzIGF0IGxlYXN0IHBhcnRpYWxseSBvYnNvbGV0ZXMsCisJICogLSBpLmUuIG5ld2ZyYWctPm9mcyA8IHRoaXMtPm9mcyt0aGlzLT5zaXplICYmIG5ld2ZyYWctPm9mcyA+PSB0aGlzLT5vZnMgIAorCSAqLworCWlmIChuZXdmcmFnLT5vZnMgPiB0aGlzLT5vZnMpIHsKKwkJLyogVGhpcyBub2RlIGlzbid0IGNvbXBsZXRlbHkgb2Jzb2xldGVkLiBUaGUgc3RhcnQgb2YgaXQgcmVtYWlucyB2YWxpZCAqLworCisJCS8qIE1hcmsgdGhlIG5ldyBub2RlIGFuZCB0aGUgcGFydGlhbGx5IGNvdmVyZWQgbm9kZSBSRUZfTk9STUFMIC0tIGxldAorCQkgICB0aGUgR0MgdGFrZSBhIGxvb2sgYXQgdGhlbSAqLworCQltYXJrX3JlZl9ub3JtYWwobmV3ZnJhZy0+bm9kZS0+cmF3KTsKKwkJaWYgKHRoaXMtPm5vZGUpCisJCQltYXJrX3JlZl9ub3JtYWwodGhpcy0+bm9kZS0+cmF3KTsKKworCQlpZiAodGhpcy0+b2ZzICsgdGhpcy0+c2l6ZSA+IG5ld2ZyYWctPm9mcyArIG5ld2ZyYWctPnNpemUpIHsKKwkJCS8qIFRoZSBuZXcgbm9kZSBzcGxpdHMgJ3RoaXMnIGZyYWcgaW50byB0d28gKi8KKwkJCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKm5ld2ZyYWcyID0gamZmczJfYWxsb2Nfbm9kZV9mcmFnKCk7CisJCQlpZiAoIW5ld2ZyYWcyKSB7CisJCQkJamZmczJfZnJlZV9ub2RlX2ZyYWcobmV3ZnJhZyk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlEMihwcmludGsoS0VSTl9ERUJVRyAic3BsaXQgb2xkIGZyYWcgMHglMDR4LTB4JTA0eCAtLT4iLCB0aGlzLT5vZnMsIHRoaXMtPm9mcyt0aGlzLT5zaXplKTsKKwkJCWlmICh0aGlzLT5ub2RlKQorCQkJCXByaW50aygicGh5cyAweCUwOHhcbiIsIHJlZl9vZmZzZXQodGhpcy0+bm9kZS0+cmF3KSk7CisJCQllbHNlIAorCQkJCXByaW50aygiaG9sZVxuIik7CisJCQkgICApCisJCQkKKwkJCS8qIE5ldyBzZWNvbmQgZnJhZyBwb2ludGluZyB0byB0aGlzJ3Mgbm9kZSAqLworCQkJbmV3ZnJhZzItPm9mcyA9IG5ld2ZyYWctPm9mcyArIG5ld2ZyYWctPnNpemU7CisJCQluZXdmcmFnMi0+c2l6ZSA9ICh0aGlzLT5vZnMrdGhpcy0+c2l6ZSkgLSBuZXdmcmFnMi0+b2ZzOworCQkJbmV3ZnJhZzItPm5vZGUgPSB0aGlzLT5ub2RlOworCQkJaWYgKHRoaXMtPm5vZGUpCisJCQkJdGhpcy0+bm9kZS0+ZnJhZ3MrKzsKKworCQkJLyogQWRqdXN0IHNpemUgb2Ygb3JpZ2luYWwgJ3RoaXMnICovCisJCQl0aGlzLT5zaXplID0gbmV3ZnJhZy0+b2ZzIC0gdGhpcy0+b2ZzOworCisJCQkvKiBOb3csIHdlIGtub3cgdGhlcmUncyBubyBub2RlIHdpdGggb2Zmc2V0CisJCQkgICBncmVhdGVyIHRoYW4gdGhpcy0+b2ZzIGJ1dCBzbWFsbGVyIHRoYW4KKwkJCSAgIG5ld2ZyYWcyLT5vZnMgb3IgbmV3ZnJhZy0+b2ZzLCBmb3Igb2J2aW91cworCQkJICAgcmVhc29ucy4gU28gd2UgY2FuIGRvIGEgdHJlZSBpbnNlcnQgZnJvbQorCQkJICAgJ3RoaXMnIHRvIGluc2VydCBuZXdmcmFnLCBhbmQgYSB0cmVlIGluc2VydAorCQkJICAgZnJvbSBuZXdmcmFnIHRvIGluc2VydCBuZXdmcmFnMi4gKi8KKwkJCWpmZnMyX2ZyYWd0cmVlX2luc2VydChuZXdmcmFnLCB0aGlzKTsKKwkJCXJiX2luc2VydF9jb2xvcigmbmV3ZnJhZy0+cmIsIGxpc3QpOworCQkJCisJCQlqZmZzMl9mcmFndHJlZV9pbnNlcnQobmV3ZnJhZzIsIG5ld2ZyYWcpOworCQkJcmJfaW5zZXJ0X2NvbG9yKCZuZXdmcmFnMi0+cmIsIGxpc3QpOworCQkJCisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBOZXcgbm9kZSBqdXN0IHJlZHVjZXMgJ3RoaXMnIGZyYWcgaW4gc2l6ZSwgZG9lc24ndCBzcGxpdCBpdCAqLworCQl0aGlzLT5zaXplID0gbmV3ZnJhZy0+b2ZzIC0gdGhpcy0+b2ZzOworCisJCS8qIEFnYWluLCB3ZSBrbm93IGl0IGxpdmVzIGRvd24gaGVyZSBpbiB0aGUgdHJlZSAqLworCQlqZmZzMl9mcmFndHJlZV9pbnNlcnQobmV3ZnJhZywgdGhpcyk7CisJCXJiX2luc2VydF9jb2xvcigmbmV3ZnJhZy0+cmIsIGxpc3QpOworCX0gZWxzZSB7CisJCS8qIE5ldyBmcmFnIHN0YXJ0cyBhdCB0aGUgc2FtZSBwb2ludCBhcyAndGhpcycgdXNlZCB0by4gUmVwbGFjZSAKKwkJICAgaXQgaW4gdGhlIHRyZWUgd2l0aG91dCBkb2luZyBhIGRlbGV0ZSBhbmQgaW5zZXJ0aW9uICovCisJCUQyKHByaW50ayhLRVJOX0RFQlVHICJJbnNlcnRpbmcgbmV3ZnJhZyAoKiVwKSwlZC0lZCBpbiBiZWZvcmUgJ3RoaXMnICgqJXApLCVkLSVkXG4iLAorCQkJICBuZXdmcmFnLCBuZXdmcmFnLT5vZnMsIG5ld2ZyYWctPm9mcytuZXdmcmFnLT5zaXplLAorCQkJICB0aGlzLCB0aGlzLT5vZnMsIHRoaXMtPm9mcyt0aGlzLT5zaXplKSk7CisJCisJCXJiX3JlcGxhY2Vfbm9kZSgmdGhpcy0+cmIsICZuZXdmcmFnLT5yYiwgbGlzdCk7CisJCQorCQlpZiAobmV3ZnJhZy0+b2ZzICsgbmV3ZnJhZy0+c2l6ZSA+PSB0aGlzLT5vZnMrdGhpcy0+c2l6ZSkgeworCQkJRDIocHJpbnRrKEtFUk5fREVCVUcgIk9ic29sZXRpbmcgbm9kZSBmcmFnICVwICgleC0leClcbiIsIHRoaXMsIHRoaXMtPm9mcywgdGhpcy0+b2ZzK3RoaXMtPnNpemUpKTsKKwkJCWpmZnMyX29ic29sZXRlX25vZGVfZnJhZyhjLCB0aGlzKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMtPm9mcyArPSBuZXdmcmFnLT5zaXplOworCQkJdGhpcy0+c2l6ZSAtPSBuZXdmcmFnLT5zaXplOworCisJCQlqZmZzMl9mcmFndHJlZV9pbnNlcnQodGhpcywgbmV3ZnJhZyk7CisJCQlyYl9pbnNlcnRfY29sb3IoJnRoaXMtPnJiLCBsaXN0KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCS8qIE9LLCBub3cgd2UgaGF2ZSBuZXdmcmFnIGFkZGVkIGluIHRoZSBjb3JyZWN0IHBsYWNlIGluIHRoZSB0cmVlLCBidXQKKwkgICBmcmFnX25leHQobmV3ZnJhZykgbWF5IGJlIGEgZnJhZ21lbnQgd2hpY2ggaXMgb3ZlcmxhcHBlZCBieSBpdCAKKwkqLworCXdoaWxlICgodGhpcyA9IGZyYWdfbmV4dChuZXdmcmFnKSkgJiYgbmV3ZnJhZy0+b2ZzICsgbmV3ZnJhZy0+c2l6ZSA+PSB0aGlzLT5vZnMgKyB0aGlzLT5zaXplKSB7CisJCS8qICd0aGlzJyBmcmFnIGlzIG9ic29sZXRlZCBjb21wbGV0ZWx5LiAqLworCQlEMihwcmludGsoS0VSTl9ERUJVRyAiT2Jzb2xldGluZyBub2RlIGZyYWcgJXAgKCV4LSV4KSBhbmQgcmVtb3ZpbmcgZnJvbSB0cmVlXG4iLCB0aGlzLCB0aGlzLT5vZnMsIHRoaXMtPm9mcyt0aGlzLT5zaXplKSk7CisJCXJiX2VyYXNlKCZ0aGlzLT5yYiwgbGlzdCk7CisJCWpmZnMyX29ic29sZXRlX25vZGVfZnJhZyhjLCB0aGlzKTsKKwl9CisJLyogTm93IHdlJ3JlIHBvaW50aW5nIGF0IHRoZSBmaXJzdCBmcmFnIHdoaWNoIGlzbid0IHRvdGFsbHkgb2Jzb2xldGVkIGJ5IAorCSAgIHRoZSBuZXcgZnJhZyAqLworCisJaWYgKCF0aGlzIHx8IG5ld2ZyYWctPm9mcyArIG5ld2ZyYWctPnNpemUgPT0gdGhpcy0+b2ZzKSB7CisJCXJldHVybiAwOworCX0KKwkvKiBTdGlsbCBzb21lIG92ZXJsYXAgYnV0IHdlIGRvbid0IG5lZWQgdG8gbW92ZSBpdCBpbiB0aGUgdHJlZSAqLworCXRoaXMtPnNpemUgPSAodGhpcy0+b2ZzICsgdGhpcy0+c2l6ZSkgLSAobmV3ZnJhZy0+b2ZzICsgbmV3ZnJhZy0+c2l6ZSk7CisJdGhpcy0+b2ZzID0gbmV3ZnJhZy0+b2ZzICsgbmV3ZnJhZy0+c2l6ZTsKKworCS8qIEFuZCBtYXJrIHRoZW0gUkVGX05PUk1BTCBzbyB0aGUgR0MgdGFrZXMgYSBsb29rIGF0IHRoZW0gKi8KKwlpZiAodGhpcy0+bm9kZSkKKwkJbWFya19yZWZfbm9ybWFsKHRoaXMtPm5vZGUtPnJhdyk7CisJbWFya19yZWZfbm9ybWFsKG5ld2ZyYWctPm5vZGUtPnJhdyk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBqZmZzMl90cnVuY2F0ZV9mcmFnbGlzdCAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCByYl9yb290ICpsaXN0LCB1aW50MzJfdCBzaXplKQoreworCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKmZyYWcgPSBqZmZzMl9sb29rdXBfbm9kZV9mcmFnKGxpc3QsIHNpemUpOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgIlRydW5jYXRpbmcgZnJhZ2xpc3QgdG8gMHglMDh4IGJ5dGVzXG4iLCBzaXplKSk7CisKKwkvKiBXZSBrbm93IGZyYWctPm9mcyA8PSBzaXplLiBUaGF0J3Mgd2hhdCBsb29rdXAgZG9lcyBmb3IgdXMgKi8KKwlpZiAoZnJhZyAmJiBmcmFnLT5vZnMgIT0gc2l6ZSkgeworCQlpZiAoZnJhZy0+b2ZzK2ZyYWctPnNpemUgPj0gc2l6ZSkgeworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlRydW5jYXRpbmcgZnJhZyAweCUwOHgtMHglMDh4XG4iLCBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplKSk7CisJCQlmcmFnLT5zaXplID0gc2l6ZSAtIGZyYWctPm9mczsKKwkJfQorCQlmcmFnID0gZnJhZ19uZXh0KGZyYWcpOworCX0KKwl3aGlsZSAoZnJhZyAmJiBmcmFnLT5vZnMgPj0gc2l6ZSkgeworCQlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpuZXh0ID0gZnJhZ19uZXh0KGZyYWcpOworCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJSZW1vdmluZyBmcmFnIDB4JTA4eC0weCUwOHhcbiIsIGZyYWctPm9mcywgZnJhZy0+b2ZzK2ZyYWctPnNpemUpKTsKKwkJZnJhZ19lcmFzZShmcmFnLCBsaXN0KTsKKwkJamZmczJfb2Jzb2xldGVfbm9kZV9mcmFnKGMsIGZyYWcpOworCQlmcmFnID0gbmV4dDsKKwl9Cit9CisKKy8qIFNjYW4gdGhlIGxpc3Qgb2YgYWxsIG5vZGVzIHByZXNlbnQgZm9yIHRoaXMgaW5vLCBidWlsZCBtYXAgb2YgdmVyc2lvbnMsIGV0Yy4gKi8KKworc3RhdGljIGludCBqZmZzMl9kb19yZWFkX2lub2RlX2ludGVybmFsKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCAKKwkJCQkJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsCisJCQkJCXN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKmxhdGVzdF9ub2RlKTsKKworaW50IGpmZnMyX2RvX3JlYWRfaW5vZGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCAKKwkJCXVpbnQzMl90IGlubywgc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqbGF0ZXN0X25vZGUpCit7CisJRDIocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2RvX3JlYWRfaW5vZGUoKTogZ2V0dGluZyBpbm9jYWNoZVxuIikpOworCisgcmV0cnlfaW5vY2FjaGU6CisJc3Bpbl9sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKKwlmLT5pbm9jYWNoZSA9IGpmZnMyX2dldF9pbm9fY2FjaGUoYywgaW5vKTsKKworCUQyKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9kb19yZWFkX2lub2RlKCk6IEdvdCBpbm9jYWNoZSBhdCAlcFxuIiwgZi0+aW5vY2FjaGUpKTsKKworCWlmIChmLT5pbm9jYWNoZSkgeworCQkvKiBDaGVjayBpdHMgc3RhdGUuIFdlIG1heSBuZWVkIHRvIHdhaXQgYmVmb3JlIHdlIGNhbiB1c2UgaXQgKi8KKwkJc3dpdGNoKGYtPmlub2NhY2hlLT5zdGF0ZSkgeworCQljYXNlIElOT19TVEFURV9VTkNIRUNLRUQ6CisJCWNhc2UgSU5PX1NUQVRFX0NIRUNLRURBQlNFTlQ6CisJCQlmLT5pbm9jYWNoZS0+c3RhdGUgPSBJTk9fU1RBVEVfUkVBRElORzsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgSU5PX1NUQVRFX0NIRUNLSU5HOgorCQljYXNlIElOT19TVEFURV9HQzoKKwkJCS8qIElmIGl0J3MgaW4gZWl0aGVyIG9mIHRoZXNlIHN0YXRlcywgd2UgbmVlZAorCQkJICAgdG8gd2FpdCBmb3Igd2hvZXZlcidzIGdvdCBpdCB0byBmaW5pc2ggYW5kCisJCQkgICBwdXQgaXQgYmFjay4gKi8KKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nZXRfaW5vX2NhY2hlX3JlYWQgd2FpdGluZyBmb3IgaW5vICMldSBpbiBzdGF0ZSAlZFxuIiwKKwkJCQkgIGlubywgZi0+aW5vY2FjaGUtPnN0YXRlKSk7CisJCQlzbGVlcF9vbl9zcGludW5sb2NrKCZjLT5pbm9jYWNoZV93cSwgJmMtPmlub2NhY2hlX2xvY2spOworCQkJZ290byByZXRyeV9pbm9jYWNoZTsKKworCQljYXNlIElOT19TVEFURV9SRUFESU5HOgorCQljYXNlIElOT19TVEFURV9QUkVTRU5UOgorCQkJLyogRWVwLiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uIEl0IGNhbgorCQkJaGFwcGVuIGlmIExpbnV4IGNhbGxzIHJlYWRfaW5vZGUoKSBhZ2FpbgorCQkJYmVmb3JlIGNsZWFyX2lub2RlKCkgaGFzIGZpbmlzaGVkIHRob3VnaC4gKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVlcC4gVHJ5aW5nIHRvIHJlYWRfaW5vZGUgIyV1IHdoZW4gaXQncyBhbHJlYWR5IGluIHN0YXRlICVkIVxuIiwgaW5vLCBmLT5pbm9jYWNoZS0+c3RhdGUpOworCQkJLyogRmFpbC4gVGhhdCdzIHByb2JhYmx5IGJldHRlciB0aGFuIGFsbG93aW5nIGl0IHRvIHN1Y2NlZWQgKi8KKwkJCWYtPmlub2NhY2hlID0gTlVMTDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmYy0+aW5vY2FjaGVfbG9jayk7CisKKwlpZiAoIWYtPmlub2NhY2hlICYmIGlubyA9PSAxKSB7CisJCS8qIFNwZWNpYWwgY2FzZSAtIG5vIHJvb3QgaW5vZGUgb24gbWVkaXVtICovCisJCWYtPmlub2NhY2hlID0gamZmczJfYWxsb2NfaW5vZGVfY2FjaGUoKTsKKwkJaWYgKCFmLT5pbm9jYWNoZSkgeworCQkJcHJpbnRrKEtFUk5fQ1JJVCAiamZmczJfZG9fcmVhZF9pbm9kZSgpOiBDYW5ub3QgYWxsb2NhdGUgaW5vY2FjaGUgZm9yIHJvb3QgaW5vZGVcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2RvX3JlYWRfaW5vZGUoKTogQ3JlYXRpbmcgaW5vY2FjaGUgZm9yIHJvb3QgaW5vZGVcbiIpKTsKKwkJbWVtc2V0KGYtPmlub2NhY2hlLCAwLCBzaXplb2Yoc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlKSk7CisJCWYtPmlub2NhY2hlLT5pbm8gPSBmLT5pbm9jYWNoZS0+bmxpbmsgPSAxOworCQlmLT5pbm9jYWNoZS0+bm9kZXMgPSAoc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqKWYtPmlub2NhY2hlOworCQlmLT5pbm9jYWNoZS0+c3RhdGUgPSBJTk9fU1RBVEVfUkVBRElORzsKKwkJamZmczJfYWRkX2lub19jYWNoZShjLCBmLT5pbm9jYWNoZSk7CisJfQorCWlmICghZi0+aW5vY2FjaGUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfZG9fcmVhZF9pbm9kZSgpIG9uIG5vbmV4aXN0ZW50IGlubyAldVxuIiwgaW5vKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcmV0dXJuIGpmZnMyX2RvX3JlYWRfaW5vZGVfaW50ZXJuYWwoYywgZiwgbGF0ZXN0X25vZGUpOworfQorCitpbnQgamZmczJfZG9fY3JjY2hlY2tfaW5vZGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqaWMpCit7CisJc3RydWN0IGpmZnMyX3Jhd19pbm9kZSBuOworCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmID0ga21hbGxvYyhzaXplb2YoKmYpLCBHRlBfS0VSTkVMKTsKKwlpbnQgcmV0OworCisJaWYgKCFmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChmLCAwLCBzaXplb2YoKmYpKTsKKwlpbml0X01VVEVYX0xPQ0tFRCgmZi0+c2VtKTsKKwlmLT5pbm9jYWNoZSA9IGljOworCisJcmV0ID0gamZmczJfZG9fcmVhZF9pbm9kZV9pbnRlcm5hbChjLCBmLCAmbik7CisJaWYgKCFyZXQpIHsKKwkJdXAoJmYtPnNlbSk7CisJCWpmZnMyX2RvX2NsZWFyX2lub2RlKGMsIGYpOworCX0KKwlrZnJlZSAoZik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBqZmZzMl9kb19yZWFkX2lub2RlX2ludGVybmFsKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCAKKwkJCQkJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsCisJCQkJCXN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKmxhdGVzdF9ub2RlKQoreworCXN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqdG5fbGlzdCwgKnRuOworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmRfbGlzdDsKKwlzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZm4gPSBOVUxMOworCXVpbnQzMl90IGNyYzsKKwl1aW50MzJfdCBsYXRlc3RfbWN0aW1lLCBtY3RpbWVfdmVyOworCXVpbnQzMl90IG1kYXRhX3ZlciA9IDA7CisJc2l6ZV90IHJldGxlbjsKKwlpbnQgcmV0OworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2RvX3JlYWRfaW5vZGVfaW50ZXJuYWwoKTogaW5vICMldSBubGluayBpcyAlZFxuIiwgZi0+aW5vY2FjaGUtPmlubywgZi0+aW5vY2FjaGUtPm5saW5rKSk7CisKKwkvKiBHcmFiIGFsbCBub2RlcyByZWxldmFudCB0byB0aGlzIGlubyAqLworCXJldCA9IGpmZnMyX2dldF9pbm9kZV9ub2RlcyhjLCBmLCAmdG5fbGlzdCwgJmZkX2xpc3QsICZmLT5oaWdoZXN0X3ZlcnNpb24sICZsYXRlc3RfbWN0aW1lLCAmbWN0aW1lX3Zlcik7CisKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0NSSVQgImpmZnMyX2dldF9pbm9kZV9ub2RlcygpIGZvciBpbm8gJXUgcmV0dXJuZWQgJWRcbiIsIGYtPmlub2NhY2hlLT5pbm8sIHJldCk7CisJCWlmIChmLT5pbm9jYWNoZS0+c3RhdGUgPT0gSU5PX1NUQVRFX1JFQURJTkcpCisJCQlqZmZzMl9zZXRfaW5vY2FjaGVfc3RhdGUoYywgZi0+aW5vY2FjaGUsIElOT19TVEFURV9DSEVDS0VEQUJTRU5UKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJZi0+ZGVudHMgPSBmZF9saXN0OworCisJd2hpbGUgKHRuX2xpc3QpIHsKKwkJdG4gPSB0bl9saXN0OworCisJCWZuID0gdG4tPmZuOworCisJCWlmIChmLT5tZXRhZGF0YSkgeworCQkJaWYgKGxpa2VseSh0bi0+dmVyc2lvbiA+PSBtZGF0YV92ZXIpKSB7CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk9ic29sZXRpbmcgb2xkIG1ldGFkYXRhIGF0IDB4JTA4eFxuIiwgcmVmX29mZnNldChmLT5tZXRhZGF0YS0+cmF3KSkpOworCQkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCBmLT5tZXRhZGF0YS0+cmF3KTsKKwkJCQlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUoZi0+bWV0YWRhdGEpOworCQkJCWYtPm1ldGFkYXRhID0gTlVMTDsKKwkJCQkKKwkJCQltZGF0YV92ZXIgPSAwOworCQkJfSBlbHNlIHsKKwkJCQkvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICovCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXIuIE5ldyBtZXRhZGF0YSBhdCAweCUwOHggd2l0aCB2ZXIgJWQgaXMgYWN0dWFsbHkgb2xkZXIgdGhhbiBwcmV2aW91cyB2ZXIgJWQgYXQgMHglMDh4XG4iLAorCQkJCQkgIHJlZl9vZmZzZXQoZm4tPnJhdyksIHRuLT52ZXJzaW9uLCBtZGF0YV92ZXIsIHJlZl9vZmZzZXQoZi0+bWV0YWRhdGEtPnJhdykpOworCQkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCBmbi0+cmF3KTsKKwkJCQlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUoZm4pOworCQkJCS8qIEZpbGwgaW4gbGF0ZXN0X25vZGUgZnJvbSB0aGUgbWV0YWRhdGEsIG5vdCB0aGlzIG9uZSB3ZSdyZSBhYm91dCB0byBmcmVlLi4uICovCisJCQkJZm4gPSBmLT5tZXRhZGF0YTsKKwkJCQlnb3RvIG5leHRfdG47CisJCQl9CisJCX0KKworCQlpZiAoZm4tPnNpemUpIHsKKwkJCWpmZnMyX2FkZF9mdWxsX2Rub2RlX3RvX2lub2RlKGMsIGYsIGZuKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFplcm8tc2l6ZWQgbm9kZSBhdCBlbmQgb2YgdmVyc2lvbiBsaXN0LiBKdXN0IGEgbWV0YWRhdGEgdXBkYXRlICovCisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAibWV0YWRhdGEgQCUwOHg6IHZlciAlZFxuIiwgcmVmX29mZnNldChmbi0+cmF3KSwgdG4tPnZlcnNpb24pKTsKKwkJCWYtPm1ldGFkYXRhID0gZm47CisJCQltZGF0YV92ZXIgPSB0bi0+dmVyc2lvbjsKKwkJfQorCW5leHRfdG46CisJCXRuX2xpc3QgPSB0bi0+bmV4dDsKKwkJamZmczJfZnJlZV90bXBfZG5vZGVfaW5mbyh0bik7CisJfQorCUQxKGpmZnMyX3Nhbml0eWNoZWNrX2ZyYWd0cmVlKGYpKTsKKworCWlmICghZm4pIHsKKwkJLyogTm8gZGF0YSBub2RlcyBmb3IgdGhpcyBpbm9kZS4gKi8KKwkJaWYgKGYtPmlub2NhY2hlLT5pbm8gIT0gMSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfZG9fcmVhZF9pbm9kZSgpOiBObyBkYXRhIG5vZGVzIGZvdW5kIGZvciBpbm8gIyV1XG4iLCBmLT5pbm9jYWNoZS0+aW5vKTsKKwkJCWlmICghZmRfbGlzdCkgeworCQkJCWlmIChmLT5pbm9jYWNoZS0+c3RhdGUgPT0gSU5PX1NUQVRFX1JFQURJTkcpCisJCQkJCWpmZnMyX3NldF9pbm9jYWNoZV9zdGF0ZShjLCBmLT5pbm9jYWNoZSwgSU5PX1NUQVRFX0NIRUNLRURBQlNFTlQpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfZG9fcmVhZF9pbm9kZSgpOiBCdXQgaXQgaGFzIGNoaWxkcmVuIHNvIHdlIGZha2Ugc29tZSBtb2RlcyBmb3IgaXRcbiIpOworCQl9CisJCWxhdGVzdF9ub2RlLT5tb2RlID0gY3B1X3RvX2plbW9kZShTX0lGRElSfFNfSVJVR098U19JV1VTUnxTX0lYVUdPKTsKKwkJbGF0ZXN0X25vZGUtPnZlcnNpb24gPSBjcHVfdG9famUzMigwKTsKKwkJbGF0ZXN0X25vZGUtPmF0aW1lID0gbGF0ZXN0X25vZGUtPmN0aW1lID0gbGF0ZXN0X25vZGUtPm10aW1lID0gY3B1X3RvX2plMzIoMCk7CisJCWxhdGVzdF9ub2RlLT5pc2l6ZSA9IGNwdV90b19qZTMyKDApOworCQlsYXRlc3Rfbm9kZS0+Z2lkID0gY3B1X3RvX2plMTYoMCk7CisJCWxhdGVzdF9ub2RlLT51aWQgPSBjcHVfdG9famUxNigwKTsKKwkJaWYgKGYtPmlub2NhY2hlLT5zdGF0ZSA9PSBJTk9fU1RBVEVfUkVBRElORykKKwkJCWpmZnMyX3NldF9pbm9jYWNoZV9zdGF0ZShjLCBmLT5pbm9jYWNoZSwgSU5PX1NUQVRFX1BSRVNFTlQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBqZmZzMl9mbGFzaF9yZWFkKGMsIHJlZl9vZmZzZXQoZm4tPnJhdyksIHNpemVvZigqbGF0ZXN0X25vZGUpLCAmcmV0bGVuLCAodm9pZCAqKWxhdGVzdF9ub2RlKTsKKwlpZiAocmV0IHx8IHJldGxlbiAhPSBzaXplb2YoKmxhdGVzdF9ub2RlKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIk1URCByZWFkIGluIGpmZnMyX2RvX3JlYWRfaW5vZGUoKSBmYWlsZWQ6IFJldHVybmVkICVkLCAlemQgb2YgJXpkIGJ5dGVzIHJlYWRcbiIsCisJCSAgICAgICByZXQsIHJldGxlbiwgc2l6ZW9mKCpsYXRlc3Rfbm9kZSkpOworCQkvKiBGSVhNRTogSWYgdGhpcyBmYWlscywgdGhlcmUgc2VlbXMgdG8gYmUgYSBtZW1vcnkgbGVhay4gRmluZCBpdC4gKi8KKwkJdXAoJmYtPnNlbSk7CisJCWpmZnMyX2RvX2NsZWFyX2lub2RlKGMsIGYpOworCQlyZXR1cm4gcmV0P3JldDotRUlPOworCX0KKworCWNyYyA9IGNyYzMyKDAsIGxhdGVzdF9ub2RlLCBzaXplb2YoKmxhdGVzdF9ub2RlKS04KTsKKwlpZiAoY3JjICE9IGplMzJfdG9fY3B1KGxhdGVzdF9ub2RlLT5ub2RlX2NyYykpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJDUkMgZmFpbGVkIGZvciByZWFkX2lub2RlIG9mIGlub2RlICV1IGF0IHBoeXNpY2FsIGxvY2F0aW9uIDB4JXhcbiIsIGYtPmlub2NhY2hlLT5pbm8sIHJlZl9vZmZzZXQoZm4tPnJhdykpOworCQl1cCgmZi0+c2VtKTsKKwkJamZmczJfZG9fY2xlYXJfaW5vZGUoYywgZik7CisJCXJldHVybiAtRUlPOworCX0KKworCXN3aXRjaChqZW1vZGVfdG9fY3B1KGxhdGVzdF9ub2RlLT5tb2RlKSAmIFNfSUZNVCkgeworCWNhc2UgU19JRkRJUjoKKwkJaWYgKG1jdGltZV92ZXIgPiBqZTMyX3RvX2NwdShsYXRlc3Rfbm9kZS0+dmVyc2lvbikpIHsKKwkJCS8qIFRoZSB0aW1lcyBpbiB0aGUgbGF0ZXN0X25vZGUgYXJlIGFjdHVhbGx5IG9sZGVyIHRoYW4KKwkJCSAgIG1jdGltZSBpbiB0aGUgbGF0ZXN0IGRpcmVudC4gQ2hlYXQuICovCisJCQlsYXRlc3Rfbm9kZS0+Y3RpbWUgPSBsYXRlc3Rfbm9kZS0+bXRpbWUgPSBjcHVfdG9famUzMihsYXRlc3RfbWN0aW1lKTsKKwkJfQorCQlicmVhazsKKworCQkJCisJY2FzZSBTX0lGUkVHOgorCQkvKiBJZiBpdCB3YXMgYSByZWd1bGFyIGZpbGUsIHRydW5jYXRlIGl0IHRvIHRoZSBsYXRlc3Qgbm9kZSdzIGlzaXplICovCisJCWpmZnMyX3RydW5jYXRlX2ZyYWdsaXN0KGMsICZmLT5mcmFndHJlZSwgamUzMl90b19jcHUobGF0ZXN0X25vZGUtPmlzaXplKSk7CisJCWJyZWFrOworCisJY2FzZSBTX0lGTE5LOgorCQkvKiBIYWNrIHRvIHdvcmsgYXJvdW5kIGJyb2tlbiBpc2l6ZSBpbiBvbGQgc3ltbGluayBjb2RlLgorCQkgICBSZW1vdmUgdGhpcyB3aGVuIGR3bXcyIGNvbWVzIHRvIGhpcyBzZW5zZXMgYW5kIHN0b3BzCisJCSAgIHN5bWxpbmtzIGZyb20gYmVpbmcgYW4gZW50aXJlbHkgZ3JhdHVpdG91cyBzcGVjaWFsCisJCSAgIGNhc2UuICovCisJCWlmICghamUzMl90b19jcHUobGF0ZXN0X25vZGUtPmlzaXplKSkKKwkJCWxhdGVzdF9ub2RlLT5pc2l6ZSA9IGxhdGVzdF9ub2RlLT5kc2l6ZTsKKwkJLyogZmFsbCB0aHJvdWdoLi4uICovCisKKwljYXNlIFNfSUZCTEs6CisJY2FzZSBTX0lGQ0hSOgorCQkvKiBDZXJ0YWluIGlub2RlIHR5cGVzIHNob3VsZCBoYXZlIG9ubHkgb25lIGRhdGEgbm9kZSwgYW5kIGl0J3MKKwkJICAga2VwdCBhcyB0aGUgbWV0YWRhdGEgbm9kZSAqLworCQlpZiAoZi0+bWV0YWRhdGEpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFyZ2guIFNwZWNpYWwgaW5vZGUgIyV1IHdpdGggbW9kZSAwJW8gaGFkIG1ldGFkYXRhIG5vZGVcbiIsCisJCQkgICAgICAgZi0+aW5vY2FjaGUtPmlubywgamVtb2RlX3RvX2NwdShsYXRlc3Rfbm9kZS0+bW9kZSkpOworCQkJdXAoJmYtPnNlbSk7CisJCQlqZmZzMl9kb19jbGVhcl9pbm9kZShjLCBmKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWlmICghZnJhZ19maXJzdCgmZi0+ZnJhZ3RyZWUpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJBcmdoLiBTcGVjaWFsIGlub2RlICMldSB3aXRoIG1vZGUgMCVvIGhhcyBubyBmcmFnbWVudHNcbiIsCisJCQkgICAgICAgZi0+aW5vY2FjaGUtPmlubywgamVtb2RlX3RvX2NwdShsYXRlc3Rfbm9kZS0+bW9kZSkpOworCQkJdXAoJmYtPnNlbSk7CisJCQlqZmZzMl9kb19jbGVhcl9pbm9kZShjLCBmKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCS8qIEFTU0VSVDogZi0+ZnJhZ2xpc3QgIT0gTlVMTCAqLworCQlpZiAoZnJhZ19uZXh0KGZyYWdfZmlyc3QoJmYtPmZyYWd0cmVlKSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFyZ2guIFNwZWNpYWwgaW5vZGUgIyV1IHdpdGggbW9kZSAweCV4IGhhZCBtb3JlIHRoYW4gb25lIG5vZGVcbiIsCisJCQkgICAgICAgZi0+aW5vY2FjaGUtPmlubywgamVtb2RlX3RvX2NwdShsYXRlc3Rfbm9kZS0+bW9kZSkpOworCQkJLyogRklYTUU6IERlYWwgd2l0aCBpdCAtIGNoZWNrIGNyYzMyLCBjaGVjayBmb3IgZHVwbGljYXRlIG5vZGUsIGNoZWNrIHRpbWVzIGFuZCBkaXNjYXJkIHRoZSBvbGRlciBvbmUgKi8KKwkJCXVwKCZmLT5zZW0pOworCQkJamZmczJfZG9fY2xlYXJfaW5vZGUoYywgZik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQkvKiBPSy4gV2UncmUgaGFwcHkgKi8KKwkJZi0+bWV0YWRhdGEgPSBmcmFnX2ZpcnN0KCZmLT5mcmFndHJlZSktPm5vZGU7CisJCWpmZnMyX2ZyZWVfbm9kZV9mcmFnKGZyYWdfZmlyc3QoJmYtPmZyYWd0cmVlKSk7CisJCWYtPmZyYWd0cmVlID0gUkJfUk9PVDsKKwkJYnJlYWs7CisJfQorCWlmIChmLT5pbm9jYWNoZS0+c3RhdGUgPT0gSU5PX1NUQVRFX1JFQURJTkcpCisJCWpmZnMyX3NldF9pbm9jYWNoZV9zdGF0ZShjLCBmLT5pbm9jYWNoZSwgSU5PX1NUQVRFX1BSRVNFTlQpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgamZmczJfZG9fY2xlYXJfaW5vZGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmKQoreworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQsICpmZHM7CisJaW50IGRlbGV0ZWQ7CisKKwlkb3duKCZmLT5zZW0pOworCWRlbGV0ZWQgPSBmLT5pbm9jYWNoZSAmJiAhZi0+aW5vY2FjaGUtPm5saW5rOworCisJaWYgKGYtPm1ldGFkYXRhKSB7CisJCWlmIChkZWxldGVkKQorCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGYtPm1ldGFkYXRhLT5yYXcpOworCQlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUoZi0+bWV0YWRhdGEpOworCX0KKworCWpmZnMyX2tpbGxfZnJhZ3RyZWUoJmYtPmZyYWd0cmVlLCBkZWxldGVkP2M6TlVMTCk7CisKKwlmZHMgPSBmLT5kZW50czsKKworCXdoaWxlKGZkcykgeworCQlmZCA9IGZkczsKKwkJZmRzID0gZmQtPm5leHQ7CisJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoZmQpOworCX0KKworCWlmIChmLT5pbm9jYWNoZSAmJiBmLT5pbm9jYWNoZS0+c3RhdGUgIT0gSU5PX1NUQVRFX0NIRUNLSU5HKQorCQlqZmZzMl9zZXRfaW5vY2FjaGVfc3RhdGUoYywgZi0+aW5vY2FjaGUsIElOT19TVEFURV9DSEVDS0VEQUJTRU5UKTsKKworCXVwKCZmLT5zZW0pOworfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvc2Nhbi5jIGIvZnMvamZmczIvc2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZDUzNTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9zY2FuLmMKQEAgLTAsMCArMSw5MTYgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgorICoKKyAqICRJZDogc2Nhbi5jLHYgMS4xMTUgMjAwNC8xMS8xNyAxMjo1OTowOCBkZWRla2luZCBFeHAgJAorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgIm5vZGVsaXN0LmgiCisKKyNkZWZpbmUgRU1QVFlfU0NBTl9TSVpFIDEwMjQKKworI2RlZmluZSBESVJUWV9TUEFDRSh4KSBkbyB7IHR5cGVvZih4KSBfeCA9ICh4KTsgXAorCQljLT5mcmVlX3NpemUgLT0gX3g7IGMtPmRpcnR5X3NpemUgKz0gX3g7IFwKKwkJamViLT5mcmVlX3NpemUgLT0gX3ggOyBqZWItPmRpcnR5X3NpemUgKz0gX3g7IFwKKwkJfXdoaWxlKDApCisjZGVmaW5lIFVTRURfU1BBQ0UoeCkgZG8geyB0eXBlb2YoeCkgX3ggPSAoeCk7IFwKKwkJYy0+ZnJlZV9zaXplIC09IF94OyBjLT51c2VkX3NpemUgKz0gX3g7IFwKKwkJamViLT5mcmVlX3NpemUgLT0gX3ggOyBqZWItPnVzZWRfc2l6ZSArPSBfeDsgXAorCQl9d2hpbGUoMCkKKyNkZWZpbmUgVU5DSEVDS0VEX1NQQUNFKHgpIGRvIHsgdHlwZW9mKHgpIF94ID0gKHgpOyBcCisJCWMtPmZyZWVfc2l6ZSAtPSBfeDsgYy0+dW5jaGVja2VkX3NpemUgKz0gX3g7IFwKKwkJamViLT5mcmVlX3NpemUgLT0gX3ggOyBqZWItPnVuY2hlY2tlZF9zaXplICs9IF94OyBcCisJCX13aGlsZSgwKQorCisjZGVmaW5lIG5vaXN5X3ByaW50ayhub2lzZSwgYXJncy4uLikgZG8geyBcCisJaWYgKCoobm9pc2UpKSB7IFwKKwkJcHJpbnRrKEtFUk5fTk9USUNFIGFyZ3MpOyBcCisJCSAoKihub2lzZSkpLS07IFwKKwkJIGlmICghKCoobm9pc2UpKSkgeyBcCisJCQkgcHJpbnRrKEtFUk5fTk9USUNFICJGdXJ0aGVyIHN1Y2ggZXZlbnRzIGZvciB0aGlzIGVyYXNlIGJsb2NrIHdpbGwgbm90IGJlIHByaW50ZWRcbiIpOyBcCisJCSB9IFwKKwl9IFwKK30gd2hpbGUoMCkKKworc3RhdGljIHVpbnQzMl90IHBzZXVkb19yYW5kb207CisKK3N0YXRpYyBpbnQgamZmczJfc2Nhbl9lcmFzZWJsb2NrIChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwKKwkJCQkgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdWludDMyX3QgYnVmX3NpemUpOworCisvKiBUaGVzZSBoZWxwZXIgZnVuY3Rpb25zIF9tdXN0XyBpbmNyZWFzZSBvZnMgYW5kIGFsc28gZG8gdGhlIGRpcnR5L3VzZWQgc3BhY2UgYWNjb3VudGluZy4gCisgKiBSZXR1cm5pbmcgYW4gZXJyb3Igd2lsbCBhYm9ydCB0aGUgbW91bnQgLSBiYWQgY2hlY2tzdW1zIGV0Yy4gc2hvdWxkIGp1c3QgbWFyayB0aGUgc3BhY2UKKyAqIGFzIGRpcnR5LgorICovCitzdGF0aWMgaW50IGpmZnMyX3NjYW5faW5vZGVfbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwgCisJCQkJIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJpLCB1aW50MzJfdCBvZnMpOworc3RhdGljIGludCBqZmZzMl9zY2FuX2RpcmVudF9ub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLAorCQkJCSBzdHJ1Y3QgamZmczJfcmF3X2RpcmVudCAqcmQsIHVpbnQzMl90IG9mcyk7CisKKyNkZWZpbmUgQkxLX1NUQVRFX0FMTEZGCQkwCisjZGVmaW5lIEJMS19TVEFURV9DTEVBTgkJMQorI2RlZmluZSBCTEtfU1RBVEVfUEFSVERJUlRZCTIKKyNkZWZpbmUgQkxLX1NUQVRFX0NMRUFOTUFSS0VSCTMKKyNkZWZpbmUgQkxLX1NUQVRFX0FMTERJUlRZCTQKKyNkZWZpbmUgQkxLX1NUQVRFX0JBREJMT0NLCTUKKworc3RhdGljIGlubGluZSBpbnQgbWluX2ZyZWUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpCit7CisJdWludDMyX3QgbWluID0gMiAqIHNpemVvZihzdHJ1Y3QgamZmczJfcmF3X2lub2RlKTsKKyNpZiBkZWZpbmVkIENPTkZJR19KRkZTMl9GU19OQU5EIHx8IGRlZmluZWQgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MKKwlpZiAoIWpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKGMpICYmIG1pbiA8IGMtPndidWZfcGFnZXNpemUpCisJCXJldHVybiBjLT53YnVmX3BhZ2VzaXplOworI2VuZGlmCisJcmV0dXJuIG1pbjsKKworfQoraW50IGpmZnMyX3NjYW5fbWVkaXVtKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCWludCBpLCByZXQ7CisJdWludDMyX3QgZW1wdHlfYmxvY2tzID0gMCwgYmFkX2Jsb2NrcyA9IDA7CisJdW5zaWduZWQgY2hhciAqZmxhc2hidWYgPSBOVUxMOworCXVpbnQzMl90IGJ1Zl9zaXplID0gMDsKKyNpZm5kZWYgX19FQ09TCisJc2l6ZV90IHBvaW50bGVuOworCisJaWYgKGMtPm10ZC0+cG9pbnQpIHsKKwkJcmV0ID0gYy0+bXRkLT5wb2ludCAoYy0+bXRkLCAwLCBjLT5tdGQtPnNpemUsICZwb2ludGxlbiwgJmZsYXNoYnVmKTsKKwkJaWYgKCFyZXQgJiYgcG9pbnRsZW4gPCBjLT5tdGQtPnNpemUpIHsKKwkJCS8qIERvbid0IG11Y2sgYWJvdXQgaWYgaXQgd29uJ3QgbGV0IHVzIHBvaW50IHRvIHRoZSB3aG9sZSBmbGFzaCAqLworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk1URCBwb2ludCByZXR1cm5lZCBsZW4gdG9vIHNob3J0OiAweCV6eFxuIiwgcG9pbnRsZW4pKTsKKwkJCWMtPm10ZC0+dW5wb2ludChjLT5tdGQsIGZsYXNoYnVmLCAwLCBjLT5tdGQtPnNpemUpOworCQkJZmxhc2hidWYgPSBOVUxMOworCQl9CisJCWlmIChyZXQpCisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiTVREIHBvaW50IGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJfQorI2VuZGlmCisJaWYgKCFmbGFzaGJ1ZikgeworCQkvKiBGb3IgTkFORCBpdCdzIHF1aWNrZXIgdG8gcmVhZCBhIHdob2xlIGVyYXNlYmxvY2sgYXQgYSB0aW1lLAorCQkgICBhcHBhcmVudGx5ICovCisJCWlmIChqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpCisJCQlidWZfc2l6ZSA9IGMtPnNlY3Rvcl9zaXplOworCQllbHNlCisJCQlidWZfc2l6ZSA9IFBBR0VfU0laRTsKKworCQkvKiBSZXNwZWN0IGttYWxsb2MgbGltaXRhdGlvbnMgKi8KKwkJaWYgKGJ1Zl9zaXplID4gMTI4KjEwMjQpCisJCQlidWZfc2l6ZSA9IDEyOCoxMDI0OworCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJBbGxvY2F0aW5nIHJlYWRidWYgb2YgJWQgYnl0ZXNcbiIsIGJ1Zl9zaXplKSk7CisJCWZsYXNoYnVmID0ga21hbGxvYyhidWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZmxhc2hidWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGk9MDsgaTxjLT5ucl9ibG9ja3M7IGkrKykgeworCQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViID0gJmMtPmJsb2Nrc1tpXTsKKworCQlyZXQgPSBqZmZzMl9zY2FuX2VyYXNlYmxvY2soYywgamViLCBidWZfc2l6ZT9mbGFzaGJ1ZjooZmxhc2hidWYramViLT5vZmZzZXQpLCBidWZfc2l6ZSk7CisKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKworCQlBQ0NUX1BBUkFOT0lBX0NIRUNLKGplYik7CisKKwkJLyogTm93IGRlY2lkZSB3aGljaCBsaXN0IHRvIHB1dCBpdCBvbiAqLworCQlzd2l0Y2gocmV0KSB7CisJCWNhc2UgQkxLX1NUQVRFX0FMTEZGOgorCQkJLyogCisJCQkgKiBFbXB0eSBibG9jay4gICBTaW5jZSB3ZSBjYW4ndCBiZSBzdXJlIGl0IAorCQkJICogd2FzIGVudGlyZWx5IGVyYXNlZCwgd2UganVzdCBxdWV1ZSBpdCBmb3IgZXJhc2UKKwkJCSAqIGFnYWluLiAgSXQgd2lsbCBiZSBtYXJrZWQgYXMgc3VjaCB3aGVuIHRoZSBlcmFzZQorCQkJICogaXMgY29tcGxldGUuICBNZWFud2hpbGUgd2Ugc3RpbGwgY291bnQgaXQgYXMgZW1wdHkKKwkJCSAqIGZvciBsYXRlciBjaGVja3MuCisJCQkgKi8KKwkJCWVtcHR5X2Jsb2NrcysrOworCQkJbGlzdF9hZGQoJmplYi0+bGlzdCwgJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCk7CisJCQljLT5ucl9lcmFzaW5nX2Jsb2NrcysrOworCQkJYnJlYWs7CisKKwkJY2FzZSBCTEtfU1RBVEVfQ0xFQU5NQVJLRVI6CisJCQkvKiBPbmx5IGEgQ0xFQU5NQVJLRVIgbm9kZSBpcyB2YWxpZCAqLworCQkJaWYgKCFqZWItPmRpcnR5X3NpemUpIHsKKwkJCQkvKiBJdCdzIGFjdHVhbGx5IGZyZWUgKi8KKwkJCQlsaXN0X2FkZCgmamViLT5saXN0LCAmYy0+ZnJlZV9saXN0KTsKKwkJCQljLT5ucl9mcmVlX2Jsb2NrcysrOworCQkJfSBlbHNlIHsKKwkJCQkvKiBEaXJ0ICovCisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkFkZGluZyBhbGwtZGlydHkgYmxvY2sgYXQgMHglMDh4IHRvIGVyYXNlX3BlbmRpbmdfbGlzdFxuIiwgamViLT5vZmZzZXQpKTsKKwkJCQlsaXN0X2FkZCgmamViLT5saXN0LCAmYy0+ZXJhc2VfcGVuZGluZ19saXN0KTsKKwkJCQljLT5ucl9lcmFzaW5nX2Jsb2NrcysrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBCTEtfU1RBVEVfQ0xFQU46CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBGdWxsIChvciBhbG1vc3QgZnVsbCkgb2YgY2xlYW4gZGF0YS4gQ2xlYW4gbGlzdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9hZGQoJmplYi0+bGlzdCwgJmMtPmNsZWFuX2xpc3QpOworCQkJYnJlYWs7CisKKwkJY2FzZSBCTEtfU1RBVEVfUEFSVERJUlRZOgorICAgICAgICAgICAgICAgICAgICAgICAgLyogU29tZSBkYXRhLCBidXQgbm90IGZ1bGwuIERpcnR5IGxpc3QuICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSB3YW50IHRvIHJlbWVtYmVyIHRoZSBibG9jayB3aXRoIG1vc3QgZnJlZSBzcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHN0aWNrIGl0IGluIHRoZSAnbmV4dGJsb2NrJyBwb3NpdGlvbiB0byBzdGFydCB3cml0aW5nIHRvIGl0LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGplYi0+ZnJlZV9zaXplID4gbWluX2ZyZWUoYykgJiYgCisJCQkgICAgKCFjLT5uZXh0YmxvY2sgfHwgYy0+bmV4dGJsb2NrLT5mcmVlX3NpemUgPCBqZWItPmZyZWVfc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQmV0dGVyIGNhbmRpZGF0ZSBmb3IgdGhlIG5leHQgd3JpdGVzIHRvIGdvIHRvICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLT5uZXh0YmxvY2spIHsKKwkJCQkJYy0+bmV4dGJsb2NrLT5kaXJ0eV9zaXplICs9IGMtPm5leHRibG9jay0+ZnJlZV9zaXplICsgYy0+bmV4dGJsb2NrLT53YXN0ZWRfc2l6ZTsKKwkJCQkJYy0+ZGlydHlfc2l6ZSArPSBjLT5uZXh0YmxvY2stPmZyZWVfc2l6ZSArIGMtPm5leHRibG9jay0+d2FzdGVkX3NpemU7CisJCQkJCWMtPmZyZWVfc2l6ZSAtPSBjLT5uZXh0YmxvY2stPmZyZWVfc2l6ZTsKKwkJCQkJYy0+d2FzdGVkX3NpemUgLT0gYy0+bmV4dGJsb2NrLT53YXN0ZWRfc2l6ZTsKKwkJCQkJYy0+bmV4dGJsb2NrLT5mcmVlX3NpemUgPSBjLT5uZXh0YmxvY2stPndhc3RlZF9zaXplID0gMDsKKwkJCQkJaWYgKFZFUllESVJUWShjLCBjLT5uZXh0YmxvY2stPmRpcnR5X3NpemUpKSB7CisJCQkJCQlsaXN0X2FkZCgmYy0+bmV4dGJsb2NrLT5saXN0LCAmYy0+dmVyeV9kaXJ0eV9saXN0KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxpc3RfYWRkKCZjLT5uZXh0YmxvY2stPmxpc3QsICZjLT5kaXJ0eV9saXN0KTsKKwkJCQkJfQorCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+bmV4dGJsb2NrID0gamViOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCQlqZWItPmRpcnR5X3NpemUgKz0gamViLT5mcmVlX3NpemUgKyBqZWItPndhc3RlZF9zaXplOworCQkJCWMtPmRpcnR5X3NpemUgKz0gamViLT5mcmVlX3NpemUgKyBqZWItPndhc3RlZF9zaXplOworCQkJCWMtPmZyZWVfc2l6ZSAtPSBqZWItPmZyZWVfc2l6ZTsKKwkJCQljLT53YXN0ZWRfc2l6ZSAtPSBqZWItPndhc3RlZF9zaXplOworCQkJCWplYi0+ZnJlZV9zaXplID0gamViLT53YXN0ZWRfc2l6ZSA9IDA7CisJCQkJaWYgKFZFUllESVJUWShjLCBqZWItPmRpcnR5X3NpemUpKSB7CisJCQkJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT52ZXJ5X2RpcnR5X2xpc3QpOworCQkJCX0gZWxzZSB7CisJCQkJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5kaXJ0eV9saXN0KTsKKwkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQlicmVhazsKKworCQljYXNlIEJMS19TVEFURV9BTExESVJUWToKKwkJCS8qIE5vdGhpbmcgdmFsaWQgLSBub3QgZXZlbiBhIGNsZWFuIG1hcmtlci4gTmVlZHMgZXJhc2luZy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBub3cgd2UganVzdCBwdXQgaXQgb24gdGhlIGVyYXNpbmcgbGlzdC4gV2UnbGwgc3RhcnQgdGhlIGVyYXNlcyBsYXRlciAqLworCQkJRDEocHJpbnRrKEtFUk5fTk9USUNFICJKRkZTMjogRXJhc2UgYmxvY2sgYXQgMHglMDh4IGlzIG5vdCBmb3JtYXR0ZWQuIEl0IHdpbGwgYmUgZXJhc2VkXG4iLCBqZWItPm9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9hZGQoJmplYi0+bGlzdCwgJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCk7CisJCQljLT5ucl9lcmFzaW5nX2Jsb2NrcysrOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBCTEtfU1RBVEVfQkFEQkxPQ0s6CisJCQlEMShwcmludGsoS0VSTl9OT1RJQ0UgIkpGRlMyOiBCbG9jayBhdCAweCUwOHggaXMgYmFkXG4iLCBqZWItPm9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9hZGQoJmplYi0+bGlzdCwgJmMtPmJhZF9saXN0KTsKKwkJCWMtPmJhZF9zaXplICs9IGMtPnNlY3Rvcl9zaXplOworCQkJYy0+ZnJlZV9zaXplIC09IGMtPnNlY3Rvcl9zaXplOworCQkJYmFkX2Jsb2NrcysrOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl9zY2FuX21lZGl1bSgpOiB1bmtub3duIGJsb2NrIHN0YXRlXG4iKTsKKwkJCUJVRygpOwkKKwkJfQorCX0KKwkKKwkvKiBOZXh0YmxvY2sgZGlydHkgaXMgYWx3YXlzIHNlZW4gYXMgd2FzdGVkLCBiZWNhdXNlIHdlIGNhbm5vdCByZWN5Y2xlIGl0IG5vdyAqLworCWlmIChjLT5uZXh0YmxvY2sgJiYgKGMtPm5leHRibG9jay0+ZGlydHlfc2l6ZSkpIHsKKwkJYy0+bmV4dGJsb2NrLT53YXN0ZWRfc2l6ZSArPSBjLT5uZXh0YmxvY2stPmRpcnR5X3NpemU7CisJCWMtPndhc3RlZF9zaXplICs9IGMtPm5leHRibG9jay0+ZGlydHlfc2l6ZTsKKwkJYy0+ZGlydHlfc2l6ZSAtPSBjLT5uZXh0YmxvY2stPmRpcnR5X3NpemU7CisJCWMtPm5leHRibG9jay0+ZGlydHlfc2l6ZSA9IDA7CisJfQorI2lmIGRlZmluZWQgQ09ORklHX0pGRlMyX0ZTX05BTkQgfHwgZGVmaW5lZCBDT05GSUdfSkZGUzJfRlNfTk9SX0VDQworCWlmICghamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykgJiYgYy0+bmV4dGJsb2NrICYmIChjLT5uZXh0YmxvY2stPmZyZWVfc2l6ZSAmIChjLT53YnVmX3BhZ2VzaXplLTEpKSkgeworCQkvKiBJZiB3ZSdyZSBnb2luZyB0byBzdGFydCB3cml0aW5nIGludG8gYSBibG9jayB3aGljaCBhbHJlYWR5IAorCQkgICBjb250YWlucyBkYXRhLCBhbmQgdGhlIGVuZCBvZiB0aGUgZGF0YSBpc24ndCBwYWdlLWFsaWduZWQsCisJCSAgIHNraXAgYSBsaXR0bGUgYW5kIGFsaWduIGl0LiAqLworCisJCXVpbnQzMl90IHNraXAgPSBjLT5uZXh0YmxvY2stPmZyZWVfc2l6ZSAmIChjLT53YnVmX3BhZ2VzaXplLTEpOworCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9zY2FuX21lZGl1bSgpOiBTa2lwcGluZyAlZCBieXRlcyBpbiBuZXh0YmxvY2sgdG8gZW5zdXJlIHBhZ2UgYWxpZ25tZW50XG4iLAorCQkJICBza2lwKSk7CisJCWMtPm5leHRibG9jay0+d2FzdGVkX3NpemUgKz0gc2tpcDsKKwkJYy0+d2FzdGVkX3NpemUgKz0gc2tpcDsKKworCQljLT5uZXh0YmxvY2stPmZyZWVfc2l6ZSAtPSBza2lwOworCQljLT5mcmVlX3NpemUgLT0gc2tpcDsKKwl9CisjZW5kaWYKKwlpZiAoYy0+bnJfZXJhc2luZ19ibG9ja3MpIHsKKwkJaWYgKCAhYy0+dXNlZF9zaXplICYmICgoYy0+bnJfZnJlZV9ibG9ja3MrZW1wdHlfYmxvY2tzK2JhZF9ibG9ja3MpIT0gYy0+bnJfYmxvY2tzIHx8IGJhZF9ibG9ja3MgPT0gYy0+bnJfYmxvY2tzKSApIHsgCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkNvd2FyZGx5IHJlZnVzaW5nIHRvIGVyYXNlIGJsb2NrcyBvbiBmaWxlc3lzdGVtIHdpdGggbm8gdmFsaWQgSkZGUzIgbm9kZXNcbiIpOworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJlbXB0eV9ibG9ja3MgJWQsIGJhZF9ibG9ja3MgJWQsIGMtPm5yX2Jsb2NrcyAlZFxuIixlbXB0eV9ibG9ja3MsYmFkX2Jsb2NrcyxjLT5ucl9ibG9ja3MpOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWpmZnMyX2VyYXNlX3BlbmRpbmdfdHJpZ2dlcihjKTsKKwl9CisJcmV0ID0gMDsKKyBvdXQ6CisJaWYgKGJ1Zl9zaXplKQorCQlrZnJlZShmbGFzaGJ1Zik7CisjaWZuZGVmIF9fRUNPUworCWVsc2UgCisJCWMtPm10ZC0+dW5wb2ludChjLT5tdGQsIGZsYXNoYnVmLCAwLCBjLT5tdGQtPnNpemUpOworI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBqZmZzMl9maWxsX3NjYW5fYnVmIChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJCXVpbnQzMl90IG9mcywgdWludDMyX3QgbGVuKQoreworCWludCByZXQ7CisJc2l6ZV90IHJldGxlbjsKKworCXJldCA9IGpmZnMyX2ZsYXNoX3JlYWQoYywgb2ZzLCBsZW4sICZyZXRsZW4sIGJ1Zik7CisJaWYgKHJldCkgeworCQlEMShwcmludGsoS0VSTl9XQVJOSU5HICJtdGQtPnJlYWQoMHgleCBieXRlcyBmcm9tIDB4JXgpIHJldHVybmVkICVkXG4iLCBsZW4sIG9mcywgcmV0KSk7CisJCXJldHVybiByZXQ7CisJfQorCWlmIChyZXRsZW4gPCBsZW4pIHsKKwkJRDEocHJpbnRrKEtFUk5fV0FSTklORyAiUmVhZCBhdCAweCV4IGdhdmUgb25seSAweCV6eCBieXRlc1xuIiwgb2ZzLCByZXRsZW4pKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCUQyKHByaW50ayhLRVJOX0RFQlVHICJSZWFkIDB4JXggYnl0ZXMgZnJvbSAweCUwOHggaW50byBidWZcbiIsIGxlbiwgb2ZzKSk7CisJRDIocHJpbnRrKEtFUk5fREVCVUcgIjAwMDogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJICBidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sIGJ1Zls0XSwgYnVmWzVdLCBidWZbNl0sIGJ1Zls3XSwgYnVmWzhdLCBidWZbOV0sIGJ1ZlsxMF0sIGJ1ZlsxMV0sIGJ1ZlsxMl0sIGJ1ZlsxM10sIGJ1ZlsxNF0sIGJ1ZlsxNV0pKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqZmZzMl9zY2FuX2VyYXNlYmxvY2sgKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLAorCQkJCSAgdW5zaWduZWQgY2hhciAqYnVmLCB1aW50MzJfdCBidWZfc2l6ZSkgeworCXN0cnVjdCBqZmZzMl91bmtub3duX25vZGUgKm5vZGU7CisJc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSBjcmNub2RlOworCXVpbnQzMl90IG9mcywgcHJldm9mczsKKwl1aW50MzJfdCBoZHJfY3JjLCBidWZfb2ZzLCBidWZfbGVuOworCWludCBlcnI7CisJaW50IG5vaXNlID0gMDsKKyNpZmRlZiBDT05GSUdfSkZGUzJfRlNfTkFORAorCWludCBjbGVhbm1hcmtlcmZvdW5kID0gMDsKKyNlbmRpZgorCisJb2ZzID0gamViLT5vZmZzZXQ7CisJcHJldm9mcyA9IGplYi0+b2Zmc2V0IC0gMTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9zY2FuX2VyYXNlYmxvY2soKTogU2Nhbm5pbmcgYmxvY2sgYXQgMHgleFxuIiwgb2ZzKSk7CisKKyNpZmRlZiBDT05GSUdfSkZGUzJfRlNfTkFORAorCWlmIChqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpIHsKKwkJaW50IHJldCA9IGpmZnMyX2NoZWNrX25hbmRfY2xlYW5tYXJrZXIoYywgamViKTsKKwkJRDIocHJpbnRrKEtFUk5fTk9USUNFICJqZmZzX2NoZWNrX25hbmRfY2xlYW5tYXJrZXIgcmV0dXJuZWQgJWRcbiIscmV0KSk7CisJCS8qIEV2ZW4gaWYgaXQncyBub3QgZm91bmQsIHdlIHN0aWxsIHNjYW4gdG8gc2VlCisJCSAgIGlmIHRoZSBibG9jayBpcyBlbXB0eS4gV2UgdXNlIHRoaXMgaW5mb3JtYXRpb24KKwkJICAgdG8gZGVjaWRlIHdoZXRoZXIgdG8gZXJhc2UgaXQgb3Igbm90LiAqLworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIDA6CQljbGVhbm1hcmtlcmZvdW5kID0gMTsgYnJlYWs7CisJCWNhc2UgMTogCWJyZWFrOworCQljYXNlIDI6IAlyZXR1cm4gQkxLX1NUQVRFX0JBREJMT0NLOworCQljYXNlIDM6CQlyZXR1cm4gQkxLX1NUQVRFX0FMTERJUlRZOyAvKiBCbG9jayBoYXMgZmFpbGVkIHRvIGVyYXNlIG1pbi4gb25jZSAqLworCQlkZWZhdWx0OiAJcmV0dXJuIHJldDsKKwkJfQorCX0KKyNlbmRpZgorCWJ1Zl9vZnMgPSBqZWItPm9mZnNldDsKKworCWlmICghYnVmX3NpemUpIHsKKwkJYnVmX2xlbiA9IGMtPnNlY3Rvcl9zaXplOworCX0gZWxzZSB7CisJCWJ1Zl9sZW4gPSBFTVBUWV9TQ0FOX1NJWkU7CisJCWVyciA9IGpmZnMyX2ZpbGxfc2Nhbl9idWYoYywgYnVmLCBidWZfb2ZzLCBidWZfbGVuKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCQorCS8qIFdlIHRlbXBvcmFyaWx5IHVzZSAnb2ZzJyBhcyBhIHBvaW50ZXIgaW50byB0aGUgYnVmZmVyL2plYiAqLworCW9mcyA9IDA7CisKKwkvKiBTY2FuIG9ubHkgNEtpQiBvZiAweEZGIGJlZm9yZSBkZWNsYXJpbmcgaXQncyBlbXB0eSAqLworCXdoaWxlKG9mcyA8IEVNUFRZX1NDQU5fU0laRSAmJiAqKHVpbnQzMl90ICopKCZidWZbb2ZzXSkgPT0gMHhGRkZGRkZGRikKKwkJb2ZzICs9IDQ7CisKKwlpZiAob2ZzID09IEVNUFRZX1NDQU5fU0laRSkgeworI2lmZGVmIENPTkZJR19KRkZTMl9GU19OQU5ECisJCWlmIChqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpIHsKKwkJCS8qIHNjYW4gb29iLCB0YWtlIGNhcmUgb2YgY2xlYW5tYXJrZXIgKi8KKwkJCWludCByZXQgPSBqZmZzMl9jaGVja19vb2JfZW1wdHkoYywgamViLCBjbGVhbm1hcmtlcmZvdW5kKTsKKwkJCUQyKHByaW50ayhLRVJOX05PVElDRSAiamZmczJfY2hlY2tfb29iX2VtcHR5IHJldHVybmVkICVkXG4iLHJldCkpOworCQkJc3dpdGNoIChyZXQpIHsKKwkJCWNhc2UgMDoJCXJldHVybiBjbGVhbm1hcmtlcmZvdW5kID8gQkxLX1NUQVRFX0NMRUFOTUFSS0VSIDogQkxLX1NUQVRFX0FMTEZGOworCQkJY2FzZSAxOiAJcmV0dXJuIEJMS19TVEFURV9BTExESVJUWTsKKwkJCWRlZmF1bHQ6IAlyZXR1cm4gcmV0OworCQkJfQorCQl9CisjZW5kaWYKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkJsb2NrIGF0IDB4JTA4eCBpcyBlbXB0eSAoZXJhc2VkKVxuIiwgamViLT5vZmZzZXQpKTsKKwkJcmV0dXJuIEJMS19TVEFURV9BTExGRjsJLyogT0sgdG8gZXJhc2UgaWYgYWxsIGJsb2NrcyBhcmUgbGlrZSB0aGlzICovCisJfQorCWlmIChvZnMpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkZyZWUgc3BhY2UgYXQgJTA4eCBlbmRzIGF0ICUwOHhcbiIsIGplYi0+b2Zmc2V0LAorCQkJICBqZWItPm9mZnNldCArIG9mcykpOworCQlESVJUWV9TUEFDRShvZnMpOworCX0KKworCS8qIE5vdyBvZnMgaXMgYSBjb21wbGV0ZSBwaHlzaWNhbCBmbGFzaCBvZmZzZXQgYXMgaXQgYWx3YXlzIHdhcy4uLiAqLworCW9mcyArPSBqZWItPm9mZnNldDsKKworCW5vaXNlID0gMTA7CisKK3NjYW5fbW9yZToJCisJd2hpbGUob2ZzIDwgamViLT5vZmZzZXQgKyBjLT5zZWN0b3Jfc2l6ZSkgeworCisJCUQxKEFDQ1RfUEFSQU5PSUFfQ0hFQ0soamViKSk7CisKKwkJY29uZF9yZXNjaGVkKCk7CisKKwkJaWYgKG9mcyAmIDMpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVlcC4gb2ZzIDB4JTA4eCBub3Qgd29yZC1hbGlnbmVkIVxuIiwgb2ZzKTsKKwkJCW9mcyA9IFBBRChvZnMpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG9mcyA9PSBwcmV2b2ZzKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJvZnMgMHglMDh4IGhhcyBhbHJlYWR5IGJlZW4gc2Vlbi4gU2tpcHBpbmdcbiIsIG9mcyk7CisJCQlESVJUWV9TUEFDRSg0KTsKKwkJCW9mcyArPSA0OworCQkJY29udGludWU7CisJCX0KKwkJcHJldm9mcyA9IG9mczsKKworCQlpZiAoamViLT5vZmZzZXQgKyBjLT5zZWN0b3Jfc2l6ZSA8IG9mcyArIHNpemVvZigqbm9kZSkpIHsKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJGZXdlciB0aGFuICV6ZCBieXRlcyBsZWZ0IHRvIGVuZCBvZiBibG9jay4gKCV4KyV4PCV4KyV6eCkgTm90IHJlYWRpbmdcbiIsIHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKSwKKwkJCQkgIGplYi0+b2Zmc2V0LCBjLT5zZWN0b3Jfc2l6ZSwgb2ZzLCBzaXplb2YoKm5vZGUpKSk7CisJCQlESVJUWV9TUEFDRSgoamViLT5vZmZzZXQgKyBjLT5zZWN0b3Jfc2l6ZSktb2ZzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGJ1Zl9vZnMgKyBidWZfbGVuIDwgb2ZzICsgc2l6ZW9mKCpub2RlKSkgeworCQkJYnVmX2xlbiA9IG1pbl90KHVpbnQzMl90LCBidWZfc2l6ZSwgamViLT5vZmZzZXQgKyBjLT5zZWN0b3Jfc2l6ZSAtIG9mcyk7CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRmV3ZXIgdGhhbiAlemQgYnl0ZXMgKG5vZGUgaGVhZGVyKSBsZWZ0IHRvIGVuZCBvZiBidWYuIFJlYWRpbmcgMHgleCBhdCAweCUwOHhcbiIsCisJCQkJICBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSksIGJ1Zl9sZW4sIG9mcykpOworCQkJZXJyID0gamZmczJfZmlsbF9zY2FuX2J1ZihjLCBidWYsIG9mcywgYnVmX2xlbik7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCQlidWZfb2ZzID0gb2ZzOworCQl9CisKKwkJbm9kZSA9IChzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlICopJmJ1ZltvZnMtYnVmX29mc107CisKKwkJaWYgKCoodWludDMyX3QgKikoJmJ1ZltvZnMtYnVmX29mc10pID09IDB4ZmZmZmZmZmYpIHsKKwkJCXVpbnQzMl90IGluYnVmX29mczsKKwkJCXVpbnQzMl90IGVtcHR5X3N0YXJ0OworCisJCQllbXB0eV9zdGFydCA9IG9mczsKKwkJCW9mcyArPSA0OworCisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRm91bmQgZW1wdHkgZmxhc2ggYXQgMHglMDh4XG4iLCBvZnMpKTsKKwkJbW9yZV9lbXB0eToKKwkJCWluYnVmX29mcyA9IG9mcyAtIGJ1Zl9vZnM7CisJCQl3aGlsZSAoaW5idWZfb2ZzIDwgYnVmX2xlbikgeworCQkJCWlmICgqKHVpbnQzMl90ICopKCZidWZbaW5idWZfb2ZzXSkgIT0gMHhmZmZmZmZmZikgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFbXB0eSBmbGFzaCBhdCAweCUwOHggZW5kcyBhdCAweCUwOHhcbiIsCisJCQkJCSAgICAgICBlbXB0eV9zdGFydCwgb2ZzKTsKKwkJCQkJRElSVFlfU1BBQ0Uob2ZzLWVtcHR5X3N0YXJ0KTsKKwkJCQkJZ290byBzY2FuX21vcmU7CisJCQkJfQorCisJCQkJaW5idWZfb2ZzKz00OworCQkJCW9mcyArPSA0OworCQkJfQorCQkJLyogUmFuIG9mZiBlbmQuICovCisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRW1wdHkgZmxhc2ggdG8gZW5kIG9mIGJ1ZmZlciBhdCAweCUwOHhcbiIsIG9mcykpOworCisJCQkvKiBJZiB3ZSdyZSBvbmx5IGNoZWNraW5nIHRoZSBiZWdpbm5pbmcgb2YgYSBibG9jayB3aXRoIGEgY2xlYW5tYXJrZXIsCisJCQkgICBiYWlsIG5vdyAqLworCQkJaWYgKGJ1Zl9vZnMgPT0gamViLT5vZmZzZXQgJiYgamViLT51c2VkX3NpemUgPT0gUEFEKGMtPmNsZWFubWFya2VyX3NpemUpICYmIAorCQkJICAgIGMtPmNsZWFubWFya2VyX3NpemUgJiYgIWplYi0+ZGlydHlfc2l6ZSAmJiAhamViLT5maXJzdF9ub2RlLT5uZXh0X2luX2lubykgeworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICIlZCBieXRlcyBhdCBzdGFydCBvZiBibG9jayBzZWVtcyBjbGVhbi4uLiBhc3N1bWluZyBhbGwgY2xlYW5cbiIsIEVNUFRZX1NDQU5fU0laRSkpOworCQkJCXJldHVybiBCTEtfU1RBVEVfQ0xFQU5NQVJLRVI7CisJCQl9CisKKwkJCS8qIFNlZSBob3cgbXVjaCBtb3JlIHRoZXJlIGlzIHRvIHJlYWQgaW4gdGhpcyBlcmFzZWJsb2NrLi4uICovCisJCQlidWZfbGVuID0gbWluX3QodWludDMyX3QsIGJ1Zl9zaXplLCBqZWItPm9mZnNldCArIGMtPnNlY3Rvcl9zaXplIC0gb2ZzKTsKKwkJCWlmICghYnVmX2xlbikgeworCQkJCS8qIE5vIG1vcmUgdG8gcmVhZC4gQnJlYWsgb3V0IG9mIG1haW4gbG9vcCB3aXRob3V0IG1hcmtpbmcgCisJCQkJICAgdGhpcyByYW5nZSBvZiBlbXB0eSBzcGFjZSBhcyBkaXJ0eSAoYmVjYXVzZSBpdCdzIG5vdCkgKi8KKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRW1wdHkgZmxhc2ggYXQgJTA4eCBydW5zIHRvIGVuZCBvZiBibG9jay4gVHJlYXRpbmcgYXMgZnJlZV9zcGFjZVxuIiwKKwkJCQkJICBlbXB0eV9zdGFydCkpOworCQkJCWJyZWFrOworCQkJfQorCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJlYWRpbmcgYW5vdGhlciAweCV4IGF0IDB4JTA4eFxuIiwgYnVmX2xlbiwgb2ZzKSk7CisJCQllcnIgPSBqZmZzMl9maWxsX3NjYW5fYnVmKGMsIGJ1Ziwgb2ZzLCBidWZfbGVuKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJCWJ1Zl9vZnMgPSBvZnM7CisJCQlnb3RvIG1vcmVfZW1wdHk7CisJCX0KKworCQlpZiAob2ZzID09IGplYi0+b2Zmc2V0ICYmIGplMTZfdG9fY3B1KG5vZGUtPm1hZ2ljKSA9PSBLU0FNVElCX0NJR0FNXzJTRkZKKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJNYWdpYyBiaXRtYXNrIGlzIGJhY2t3YXJkcyBhdCBvZmZzZXQgMHglMDh4LiBXcm9uZyBlbmRpYW4gZmlsZXN5c3RlbT9cbiIsIG9mcyk7CisJCQlESVJUWV9TUEFDRSg0KTsKKwkJCW9mcyArPSA0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGplMTZfdG9fY3B1KG5vZGUtPm1hZ2ljKSA9PSBKRkZTMl9ESVJUWV9CSVRNQVNLKSB7CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRGlydHkgYml0bWFzayBhdCAweCUwOHhcbiIsIG9mcykpOworCQkJRElSVFlfU1BBQ0UoNCk7CisJCQlvZnMgKz0gNDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChqZTE2X3RvX2NwdShub2RlLT5tYWdpYykgPT0gSkZGUzJfT0xEX01BR0lDX0JJVE1BU0spIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk9sZCBKRkZTMiBiaXRtYXNrIGZvdW5kIGF0IDB4JTA4eFxuIiwgb2ZzKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIllvdSBjYW5ub3QgdXNlIG9sZGVyIEpGRlMyIGZpbGVzeXN0ZW1zIHdpdGggbmV3ZXIga2VybmVsc1xuIik7CisJCQlESVJUWV9TUEFDRSg0KTsKKwkJCW9mcyArPSA0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGplMTZfdG9fY3B1KG5vZGUtPm1hZ2ljKSAhPSBKRkZTMl9NQUdJQ19CSVRNQVNLKSB7CisJCQkvKiBPSy4gV2UncmUgb3V0IG9mIHBvc3NpYmlsaXRpZXMuIFdoaW5nZSBhbmQgbW92ZSBvbiAqLworCQkJbm9pc3lfcHJpbnRrKCZub2lzZSwgImpmZnMyX3NjYW5fZXJhc2VibG9jaygpOiBNYWdpYyBiaXRtYXNrIDB4JTA0eCBub3QgZm91bmQgYXQgMHglMDh4OiAweCUwNHggaW5zdGVhZFxuIiwgCisJCQkJICAgICBKRkZTMl9NQUdJQ19CSVRNQVNLLCBvZnMsIAorCQkJCSAgICAgamUxNl90b19jcHUobm9kZS0+bWFnaWMpKTsKKwkJCURJUlRZX1NQQUNFKDQpOworCQkJb2ZzICs9IDQ7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBXZSBzZWVtIHRvIGhhdmUgYSBub2RlIG9mIHNvcnRzLiBDaGVjayB0aGUgQ1JDICovCisJCWNyY25vZGUubWFnaWMgPSBub2RlLT5tYWdpYzsKKwkJY3Jjbm9kZS5ub2RldHlwZSA9IGNwdV90b19qZTE2KCBqZTE2X3RvX2NwdShub2RlLT5ub2RldHlwZSkgfCBKRkZTMl9OT0RFX0FDQ1VSQVRFKTsKKwkJY3Jjbm9kZS50b3RsZW4gPSBub2RlLT50b3RsZW47CisJCWhkcl9jcmMgPSBjcmMzMigwLCAmY3Jjbm9kZSwgc2l6ZW9mKGNyY25vZGUpLTQpOworCisJCWlmIChoZHJfY3JjICE9IGplMzJfdG9fY3B1KG5vZGUtPmhkcl9jcmMpKSB7CisJCQlub2lzeV9wcmludGsoJm5vaXNlLCAiamZmczJfc2Nhbl9lcmFzZWJsb2NrKCk6IE5vZGUgYXQgMHglMDh4IHsweCUwNHgsIDB4JTA0eCwgMHglMDh4KSBoYXMgaW52YWxpZCBDUkMgMHglMDh4IChjYWxjdWxhdGVkIDB4JTA4eClcbiIsCisJCQkJICAgICBvZnMsIGplMTZfdG9fY3B1KG5vZGUtPm1hZ2ljKSwKKwkJCQkgICAgIGplMTZfdG9fY3B1KG5vZGUtPm5vZGV0eXBlKSwgCisJCQkJICAgICBqZTMyX3RvX2NwdShub2RlLT50b3RsZW4pLAorCQkJCSAgICAgamUzMl90b19jcHUobm9kZS0+aGRyX2NyYyksCisJCQkJICAgICBoZHJfY3JjKTsKKwkJCURJUlRZX1NQQUNFKDQpOworCQkJb2ZzICs9IDQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChvZnMgKyBqZTMyX3RvX2NwdShub2RlLT50b3RsZW4pID4gCisJCSAgICBqZWItPm9mZnNldCArIGMtPnNlY3Rvcl9zaXplKSB7CisJCQkvKiBFZXAuIE5vZGUgZ29lcyBvdmVyIHRoZSBlbmQgb2YgdGhlIGVyYXNlIGJsb2NrLiAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm9kZSBhdCAweCUwOHggd2l0aCBsZW5ndGggMHglMDh4IHdvdWxkIHJ1biBvdmVyIHRoZSBlbmQgb2YgdGhlIGVyYXNlIGJsb2NrXG4iLAorCQkJICAgICAgIG9mcywgamUzMl90b19jcHUobm9kZS0+dG90bGVuKSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJQZXJoYXBzIHRoZSBmaWxlIHN5c3RlbSB3YXMgY3JlYXRlZCB3aXRoIHRoZSB3cm9uZyBlcmFzZSBzaXplP1xuIik7CisJCQlESVJUWV9TUEFDRSg0KTsKKwkJCW9mcyArPSA0OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIShqZTE2X3RvX2NwdShub2RlLT5ub2RldHlwZSkgJiBKRkZTMl9OT0RFX0FDQ1VSQVRFKSkgeworCQkJLyogV2hlZWUuIFRoaXMgaXMgYW4gb2Jzb2xldGVkIG5vZGUgKi8KKwkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJOb2RlIGF0IDB4JTA4eCBpcyBvYnNvbGV0ZS4gU2tpcHBpbmdcbiIsIG9mcykpOworCQkJRElSVFlfU1BBQ0UoUEFEKGplMzJfdG9fY3B1KG5vZGUtPnRvdGxlbikpKTsKKwkJCW9mcyArPSBQQUQoamUzMl90b19jcHUobm9kZS0+dG90bGVuKSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3aXRjaChqZTE2X3RvX2NwdShub2RlLT5ub2RldHlwZSkpIHsKKwkJY2FzZSBKRkZTMl9OT0RFVFlQRV9JTk9ERToKKwkJCWlmIChidWZfb2ZzICsgYnVmX2xlbiA8IG9mcyArIHNpemVvZihzdHJ1Y3QgamZmczJfcmF3X2lub2RlKSkgeworCQkJCWJ1Zl9sZW4gPSBtaW5fdCh1aW50MzJfdCwgYnVmX3NpemUsIGplYi0+b2Zmc2V0ICsgYy0+c2VjdG9yX3NpemUgLSBvZnMpOworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJGZXdlciB0aGFuICV6ZCBieXRlcyAoaW5vZGUgbm9kZSkgbGVmdCB0byBlbmQgb2YgYnVmLiBSZWFkaW5nIDB4JXggYXQgMHglMDh4XG4iLAorCQkJCQkgIHNpemVvZihzdHJ1Y3QgamZmczJfcmF3X2lub2RlKSwgYnVmX2xlbiwgb2ZzKSk7CisJCQkJZXJyID0gamZmczJfZmlsbF9zY2FuX2J1ZihjLCBidWYsIG9mcywgYnVmX2xlbik7CisJCQkJaWYgKGVycikKKwkJCQkJcmV0dXJuIGVycjsKKwkJCQlidWZfb2ZzID0gb2ZzOworCQkJCW5vZGUgPSAodm9pZCAqKWJ1ZjsKKwkJCX0KKwkJCWVyciA9IGpmZnMyX3NjYW5faW5vZGVfbm9kZShjLCBqZWIsICh2b2lkICopbm9kZSwgb2ZzKTsKKwkJCWlmIChlcnIpIHJldHVybiBlcnI7CisJCQlvZnMgKz0gUEFEKGplMzJfdG9fY3B1KG5vZGUtPnRvdGxlbikpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBKRkZTMl9OT0RFVFlQRV9ESVJFTlQ6CisJCQlpZiAoYnVmX29mcyArIGJ1Zl9sZW4gPCBvZnMgKyBqZTMyX3RvX2NwdShub2RlLT50b3RsZW4pKSB7CisJCQkJYnVmX2xlbiA9IG1pbl90KHVpbnQzMl90LCBidWZfc2l6ZSwgamViLT5vZmZzZXQgKyBjLT5zZWN0b3Jfc2l6ZSAtIG9mcyk7CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkZld2VyIHRoYW4gJWQgYnl0ZXMgKGRpcmVudCBub2RlKSBsZWZ0IHRvIGVuZCBvZiBidWYuIFJlYWRpbmcgMHgleCBhdCAweCUwOHhcbiIsCisJCQkJCSAgamUzMl90b19jcHUobm9kZS0+dG90bGVuKSwgYnVmX2xlbiwgb2ZzKSk7CisJCQkJZXJyID0gamZmczJfZmlsbF9zY2FuX2J1ZihjLCBidWYsIG9mcywgYnVmX2xlbik7CisJCQkJaWYgKGVycikKKwkJCQkJcmV0dXJuIGVycjsKKwkJCQlidWZfb2ZzID0gb2ZzOworCQkJCW5vZGUgPSAodm9pZCAqKWJ1ZjsKKwkJCX0KKwkJCWVyciA9IGpmZnMyX3NjYW5fZGlyZW50X25vZGUoYywgamViLCAodm9pZCAqKW5vZGUsIG9mcyk7CisJCQlpZiAoZXJyKSByZXR1cm4gZXJyOworCQkJb2ZzICs9IFBBRChqZTMyX3RvX2NwdShub2RlLT50b3RsZW4pKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSkZGUzJfTk9ERVRZUEVfQ0xFQU5NQVJLRVI6CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiQ0xFQU5NQVJLRVIgbm9kZSBmb3VuZCBhdCAweCUwOHhcbiIsIG9mcykpOworCQkJaWYgKGplMzJfdG9fY3B1KG5vZGUtPnRvdGxlbikgIT0gYy0+Y2xlYW5tYXJrZXJfc2l6ZSkgeworCQkJCXByaW50ayhLRVJOX05PVElDRSAiQ0xFQU5NQVJLRVIgbm9kZSBmb3VuZCBhdCAweCUwOHggaGFzIHRvdGxlbiAweCV4ICE9IG5vcm1hbCAweCV4XG4iLCAKKwkJCQkgICAgICAgb2ZzLCBqZTMyX3RvX2NwdShub2RlLT50b3RsZW4pLCBjLT5jbGVhbm1hcmtlcl9zaXplKTsKKwkJCQlESVJUWV9TUEFDRShQQUQoc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpKSk7CisJCQkJb2ZzICs9IFBBRChzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSkpOworCQkJfSBlbHNlIGlmIChqZWItPmZpcnN0X25vZGUpIHsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkNMRUFOTUFSS0VSIG5vZGUgZm91bmQgYXQgMHglMDh4LCBub3QgZmlyc3Qgbm9kZSBpbiBibG9jayAoMHglMDh4KVxuIiwgb2ZzLCBqZWItPm9mZnNldCk7CisJCQkJRElSVFlfU1BBQ0UoUEFEKHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKSkpOworCQkJCW9mcyArPSBQQUQoc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqbWFya2VyX3JlZiA9IGpmZnMyX2FsbG9jX3Jhd19ub2RlX3JlZigpOworCQkJCWlmICghbWFya2VyX3JlZikgeworCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkZhaWxlZCB0byBhbGxvY2F0ZSBub2RlIHJlZiBmb3IgY2xlYW4gbWFya2VyXG4iKTsKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJfQorCQkJCW1hcmtlcl9yZWYtPm5leHRfaW5faW5vID0gTlVMTDsKKwkJCQltYXJrZXJfcmVmLT5uZXh0X3BoeXMgPSBOVUxMOworCQkJCW1hcmtlcl9yZWYtPmZsYXNoX29mZnNldCA9IG9mcyB8IFJFRl9OT1JNQUw7CisJCQkJbWFya2VyX3JlZi0+X190b3RsZW4gPSBjLT5jbGVhbm1hcmtlcl9zaXplOworCQkJCWplYi0+Zmlyc3Rfbm9kZSA9IGplYi0+bGFzdF9ub2RlID0gbWFya2VyX3JlZjsKKwkJCSAgICAgCisJCQkJVVNFRF9TUEFDRShQQUQoYy0+Y2xlYW5tYXJrZXJfc2l6ZSkpOworCQkJCW9mcyArPSBQQUQoYy0+Y2xlYW5tYXJrZXJfc2l6ZSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEpGRlMyX05PREVUWVBFX1BBRERJTkc6CisJCQlESVJUWV9TUEFDRShQQUQoamUzMl90b19jcHUobm9kZS0+dG90bGVuKSkpOworCQkJb2ZzICs9IFBBRChqZTMyX3RvX2NwdShub2RlLT50b3RsZW4pKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlzd2l0Y2ggKGplMTZfdG9fY3B1KG5vZGUtPm5vZGV0eXBlKSAmIEpGRlMyX0NPTVBBVF9NQVNLKSB7CisJCQljYXNlIEpGRlMyX0ZFQVRVUkVfUk9DT01QQVQ6CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJSZWFkLW9ubHkgY29tcGF0aWJsZSBmZWF0dXJlIG5vZGUgKDB4JTA0eCkgZm91bmQgYXQgb2Zmc2V0IDB4JTA4eFxuIiwgamUxNl90b19jcHUobm9kZS0+bm9kZXR5cGUpLCBvZnMpOworCQkJICAgICAgICBjLT5mbGFncyB8PSBKRkZTMl9TQl9GTEFHX1JPOworCQkJCWlmICghKGpmZnMyX2lzX3JlYWRvbmx5KGMpKSkKKwkJCQkJcmV0dXJuIC1FUk9GUzsKKwkJCQlESVJUWV9TUEFDRShQQUQoamUzMl90b19jcHUobm9kZS0+dG90bGVuKSkpOworCQkJCW9mcyArPSBQQUQoamUzMl90b19jcHUobm9kZS0+dG90bGVuKSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSkZGUzJfRkVBVFVSRV9JTkNPTVBBVDoKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkluY29tcGF0aWJsZSBmZWF0dXJlIG5vZGUgKDB4JTA0eCkgZm91bmQgYXQgb2Zmc2V0IDB4JTA4eFxuIiwgamUxNl90b19jcHUobm9kZS0+bm9kZXR5cGUpLCBvZnMpOworCQkJCXJldHVybiAtRUlOVkFMOworCisJCQljYXNlIEpGRlMyX0ZFQVRVUkVfUldDT01QQVRfREVMRVRFOgorCQkJCUQxKHByaW50ayhLRVJOX05PVElDRSAiVW5rbm93biBidXQgY29tcGF0aWJsZSBmZWF0dXJlIG5vZGUgKDB4JTA0eCkgZm91bmQgYXQgb2Zmc2V0IDB4JTA4eFxuIiwgamUxNl90b19jcHUobm9kZS0+bm9kZXR5cGUpLCBvZnMpKTsKKwkJCQlESVJUWV9TUEFDRShQQUQoamUzMl90b19jcHUobm9kZS0+dG90bGVuKSkpOworCQkJCW9mcyArPSBQQUQoamUzMl90b19jcHUobm9kZS0+dG90bGVuKSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSkZGUzJfRkVBVFVSRV9SV0NPTVBBVF9DT1BZOgorCQkJCUQxKHByaW50ayhLRVJOX05PVElDRSAiVW5rbm93biBidXQgY29tcGF0aWJsZSBmZWF0dXJlIG5vZGUgKDB4JTA0eCkgZm91bmQgYXQgb2Zmc2V0IDB4JTA4eFxuIiwgamUxNl90b19jcHUobm9kZS0+bm9kZXR5cGUpLCBvZnMpKTsKKwkJCQlVU0VEX1NQQUNFKFBBRChqZTMyX3RvX2NwdShub2RlLT50b3RsZW4pKSk7CisJCQkJb2ZzICs9IFBBRChqZTMyX3RvX2NwdShub2RlLT50b3RsZW4pKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgIkJsb2NrIGF0IDB4JTA4eDogZnJlZSAweCUwOHgsIGRpcnR5IDB4JTA4eCwgdW5jaGVja2VkIDB4JTA4eCwgdXNlZCAweCUwOHhcbiIsIGplYi0+b2Zmc2V0LCAKKwkJICBqZWItPmZyZWVfc2l6ZSwgamViLT5kaXJ0eV9zaXplLCBqZWItPnVuY2hlY2tlZF9zaXplLCBqZWItPnVzZWRfc2l6ZSkpOworCisJLyogbWFya19ub2RlX29ic29sZXRlIGNhbiBhZGQgdG8gd2FzdGVkICEhICovCisJaWYgKGplYi0+d2FzdGVkX3NpemUpIHsKKwkJamViLT5kaXJ0eV9zaXplICs9IGplYi0+d2FzdGVkX3NpemU7CisJCWMtPmRpcnR5X3NpemUgKz0gamViLT53YXN0ZWRfc2l6ZTsKKwkJYy0+d2FzdGVkX3NpemUgLT0gamViLT53YXN0ZWRfc2l6ZTsKKwkJamViLT53YXN0ZWRfc2l6ZSA9IDA7CisJfQorCisJaWYgKChqZWItPnVzZWRfc2l6ZSArIGplYi0+dW5jaGVja2VkX3NpemUpID09IFBBRChjLT5jbGVhbm1hcmtlcl9zaXplKSAmJiAhamViLT5kaXJ0eV9zaXplIAorCQkmJiAoIWplYi0+Zmlyc3Rfbm9kZSB8fCAhamViLT5maXJzdF9ub2RlLT5uZXh0X2luX2lubykgKQorCQlyZXR1cm4gQkxLX1NUQVRFX0NMRUFOTUFSS0VSOworCQkKKwkvKiBtb3ZlIGJsb2NrcyB3aXRoIG1heCA0IGJ5dGUgZGlydHkgc3BhY2UgdG8gY2xlYW5saXN0ICovCQorCWVsc2UgaWYgKCFJU0RJUlRZKGMtPnNlY3Rvcl9zaXplIC0gKGplYi0+dXNlZF9zaXplICsgamViLT51bmNoZWNrZWRfc2l6ZSkpKSB7CisJCWMtPmRpcnR5X3NpemUgLT0gamViLT5kaXJ0eV9zaXplOworCQljLT53YXN0ZWRfc2l6ZSArPSBqZWItPmRpcnR5X3NpemU7IAorCQlqZWItPndhc3RlZF9zaXplICs9IGplYi0+ZGlydHlfc2l6ZTsKKwkJamViLT5kaXJ0eV9zaXplID0gMDsKKwkJcmV0dXJuIEJMS19TVEFURV9DTEVBTjsKKwl9IGVsc2UgaWYgKGplYi0+dXNlZF9zaXplIHx8IGplYi0+dW5jaGVja2VkX3NpemUpCisJCXJldHVybiBCTEtfU1RBVEVfUEFSVERJUlRZOworCWVsc2UKKwkJcmV0dXJuIEJMS19TVEFURV9BTExESVJUWTsKK30KKworc3RhdGljIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqamZmczJfc2Nhbl9tYWtlX2lub19jYWNoZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgdWludDMyX3QgaW5vKQoreworCXN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqaWM7CisKKwlpYyA9IGpmZnMyX2dldF9pbm9fY2FjaGUoYywgaW5vKTsKKwlpZiAoaWMpCisJCXJldHVybiBpYzsKKworCWlmIChpbm8gPiBjLT5oaWdoZXN0X2lubykKKwkJYy0+aGlnaGVzdF9pbm8gPSBpbm87CisKKwlpYyA9IGpmZnMyX2FsbG9jX2lub2RlX2NhY2hlKCk7CisJaWYgKCFpYykgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX3NjYW5fbWFrZV9pbm9kZV9jYWNoZSgpOiBhbGxvY2F0aW9uIG9mIGlub2RlIGNhY2hlIGZhaWxlZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQoaWMsIDAsIHNpemVvZigqaWMpKTsKKworCWljLT5pbm8gPSBpbm87CisJaWMtPm5vZGVzID0gKHZvaWQgKilpYzsKKwlqZmZzMl9hZGRfaW5vX2NhY2hlKGMsIGljKTsKKwlpZiAoaW5vID09IDEpCisJCWljLT5ubGluayA9IDE7CisJcmV0dXJuIGljOworfQorCitzdGF0aWMgaW50IGpmZnMyX3NjYW5faW5vZGVfbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwgCisJCQkJIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJpLCB1aW50MzJfdCBvZnMpCit7CisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmF3OworCXN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqaWM7CisJdWludDMyX3QgaW5vID0gamUzMl90b19jcHUocmktPmlubyk7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfc2Nhbl9pbm9kZV9ub2RlKCk6IE5vZGUgYXQgMHglMDh4XG4iLCBvZnMpKTsKKworCS8qIFdlIGRvIHZlcnkgbGl0dGxlIGhlcmUgbm93LiBKdXN0IGNoZWNrIHRoZSBpbm8jIHRvIHdoaWNoIHdlIHNob3VsZCBhdHRyaWJ1dGUKKwkgICB0aGlzIG5vZGU7IHdlIGNhbiBkbyBhbGwgdGhlIENSQyBjaGVja2luZyBldGMuIGxhdGVyLiBUaGVyZSdzIGEgdHJhZGVvZmYgaGVyZSAtLSAKKwkgICB3ZSB1c2VkIHRvIHNjYW4gdGhlIGZsYXNoIG9uY2Ugb25seSwgcmVhZGluZyBldmVyeXRoaW5nIHdlIHdhbnQgZnJvbSBpdCBpbnRvCisJICAgbWVtb3J5LCB0aGVuIGJ1aWxkaW5nIGFsbCBvdXIgaW4tY29yZSBkYXRhIHN0cnVjdHVyZXMgYW5kIGZyZWVpbmcgdGhlIGV4dHJhCisJICAgaW5mb3JtYXRpb24uIE5vdyB3ZSBhbGxvdyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgbW91bnQgdG8gY29tcGxldGUgYSBsb3QgcXVpY2tlciwKKwkgICBidXQgd2UgaGF2ZSB0byBnbyBfYmFja18gdG8gdGhlIGZsYXNoIGluIG9yZGVyIHRvIGZpbmlzaCB0aGUgQ1JDIGNoZWNraW5nLCBldGMuIAorCSAgIFdoaWNoIG1lYW5zIHRoYXQgdGhlIF9mdWxsXyBhbW91bnQgb2YgdGltZSB0byBnZXQgdG8gcHJvcGVyIHdyaXRlIG1vZGUgd2l0aCBHQworCSAgIG9wZXJhdGlvbmFsIG1heSBhY3R1YWxseSBiZSBfbG9uZ2VyXyB0aGFuIGJlZm9yZS4gU3Vja3MgdG8gYmUgbWUuICovCisKKwlyYXcgPSBqZmZzMl9hbGxvY19yYXdfbm9kZV9yZWYoKTsKKwlpZiAoIXJhdykgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX3NjYW5faW5vZGVfbm9kZSgpOiBhbGxvY2F0aW9uIG9mIG5vZGUgcmVmZXJlbmNlIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWljID0gamZmczJfZ2V0X2lub19jYWNoZShjLCBpbm8pOworCWlmICghaWMpIHsKKwkJLyogSW5vY2FjaGUgZ2V0IGZhaWxlZC4gRWl0aGVyIHdlIHJlYWQgYSBib2d1cyBpbm8jIG9yIGl0J3MganVzdCBnZW51aW5lbHkgdGhlCisJCSAgIGZpcnN0IG5vZGUgd2UgZm91bmQgZm9yIHRoaXMgaW5vZGUuIERvIGEgQ1JDIGNoZWNrIHRvIHByb3RlY3QgYWdhaW5zdCB0aGUgZm9ybWVyCisJCSAgIGNhc2UgKi8KKwkJdWludDMyX3QgY3JjID0gY3JjMzIoMCwgcmksIHNpemVvZigqcmkpLTgpOworCisJCWlmIChjcmMgIT0gamUzMl90b19jcHUocmktPm5vZGVfY3JjKSkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMl9zY2FuX2lub2RlX25vZGUoKTogQ1JDIGZhaWxlZCBvbiBub2RlIGF0IDB4JTA4eDogUmVhZCAweCUwOHgsIGNhbGN1bGF0ZWQgMHglMDh4XG4iLAorCQkJICAgICAgIG9mcywgamUzMl90b19jcHUocmktPm5vZGVfY3JjKSwgY3JjKTsKKwkJCS8qIFdlIGJlbGlldmUgdG90bGVuIGJlY2F1c2UgdGhlIENSQyBvbiB0aGUgbm9kZSBfaGVhZGVyXyB3YXMgT0ssIGp1c3QgdGhlIG5vZGUgaXRzZWxmIGZhaWxlZC4gKi8KKwkJCURJUlRZX1NQQUNFKFBBRChqZTMyX3RvX2NwdShyaS0+dG90bGVuKSkpOworCQkJamZmczJfZnJlZV9yYXdfbm9kZV9yZWYocmF3KTsKKwkJCXJldHVybiAwOworCQl9CisJCWljID0gamZmczJfc2Nhbl9tYWtlX2lub19jYWNoZShjLCBpbm8pOworCQlpZiAoIWljKSB7CisJCQlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZihyYXcpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwkvKiBXaGVlZS4gSXQgd29ya2VkICovCisKKwlyYXctPmZsYXNoX29mZnNldCA9IG9mcyB8IFJFRl9VTkNIRUNLRUQ7CisJcmF3LT5fX3RvdGxlbiA9IFBBRChqZTMyX3RvX2NwdShyaS0+dG90bGVuKSk7CisJcmF3LT5uZXh0X3BoeXMgPSBOVUxMOworCXJhdy0+bmV4dF9pbl9pbm8gPSBpYy0+bm9kZXM7CisKKwlpYy0+bm9kZXMgPSByYXc7CisJaWYgKCFqZWItPmZpcnN0X25vZGUpCisJCWplYi0+Zmlyc3Rfbm9kZSA9IHJhdzsKKwlpZiAoamViLT5sYXN0X25vZGUpCisJCWplYi0+bGFzdF9ub2RlLT5uZXh0X3BoeXMgPSByYXc7CisJamViLT5sYXN0X25vZGUgPSByYXc7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiTm9kZSBpcyBpbm8gIyV1LCB2ZXJzaW9uICVkLiBSYW5nZSAweCV4LTB4JXhcbiIsIAorCQkgIGplMzJfdG9fY3B1KHJpLT5pbm8pLCBqZTMyX3RvX2NwdShyaS0+dmVyc2lvbiksCisJCSAgamUzMl90b19jcHUocmktPm9mZnNldCksCisJCSAgamUzMl90b19jcHUocmktPm9mZnNldCkramUzMl90b19jcHUocmktPmRzaXplKSkpOworCisJcHNldWRvX3JhbmRvbSArPSBqZTMyX3RvX2NwdShyaS0+dmVyc2lvbik7CisKKwlVTkNIRUNLRURfU1BBQ0UoUEFEKGplMzJfdG9fY3B1KHJpLT50b3RsZW4pKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgamZmczJfc2Nhbl9kaXJlbnRfbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwgCisJCQkJICBzdHJ1Y3QgamZmczJfcmF3X2RpcmVudCAqcmQsIHVpbnQzMl90IG9mcykKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpyYXc7CisJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZDsKKwlzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKmljOworCXVpbnQzMl90IGNyYzsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9zY2FuX2RpcmVudF9ub2RlKCk6IE5vZGUgYXQgMHglMDh4XG4iLCBvZnMpKTsKKworCS8qIFdlIGRvbid0IGdldCBoZXJlIHVubGVzcyB0aGUgbm9kZSBpcyBzdGlsbCB2YWxpZCwgc28gd2UgZG9uJ3QgaGF2ZSB0bworCSAgIG1hc2sgaW4gdGhlIEFDQ1VSQVRFIGJpdCBhbnkgbW9yZS4gKi8KKwljcmMgPSBjcmMzMigwLCByZCwgc2l6ZW9mKCpyZCktOCk7CisKKwlpZiAoY3JjICE9IGplMzJfdG9fY3B1KHJkLT5ub2RlX2NyYykpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMl9zY2FuX2RpcmVudF9ub2RlKCk6IE5vZGUgQ1JDIGZhaWxlZCBvbiBub2RlIGF0IDB4JTA4eDogUmVhZCAweCUwOHgsIGNhbGN1bGF0ZWQgMHglMDh4XG4iLAorCQkgICAgICAgb2ZzLCBqZTMyX3RvX2NwdShyZC0+bm9kZV9jcmMpLCBjcmMpOworCQkvKiBXZSBiZWxpZXZlIHRvdGxlbiBiZWNhdXNlIHRoZSBDUkMgb24gdGhlIG5vZGUgX2hlYWRlcl8gd2FzIE9LLCBqdXN0IHRoZSBub2RlIGl0c2VsZiBmYWlsZWQuICovCisJCURJUlRZX1NQQUNFKFBBRChqZTMyX3RvX2NwdShyZC0+dG90bGVuKSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwc2V1ZG9fcmFuZG9tICs9IGplMzJfdG9fY3B1KHJkLT52ZXJzaW9uKTsKKworCWZkID0gamZmczJfYWxsb2NfZnVsbF9kaXJlbnQocmQtPm5zaXplKzEpOworCWlmICghZmQpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbWNweSgmZmQtPm5hbWUsIHJkLT5uYW1lLCByZC0+bnNpemUpOworCWZkLT5uYW1lW3JkLT5uc2l6ZV0gPSAwOworCisJY3JjID0gY3JjMzIoMCwgZmQtPm5hbWUsIHJkLT5uc2l6ZSk7CisJaWYgKGNyYyAhPSBqZTMyX3RvX2NwdShyZC0+bmFtZV9jcmMpKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiamZmczJfc2Nhbl9kaXJlbnRfbm9kZSgpOiBOYW1lIENSQyBmYWlsZWQgb24gbm9kZSBhdCAweCUwOHg6IFJlYWQgMHglMDh4LCBjYWxjdWxhdGVkIDB4JTA4eFxuIiwKKwkJICAgICAgIG9mcywgamUzMl90b19jcHUocmQtPm5hbWVfY3JjKSwgY3JjKTsJCisJCUQxKHByaW50ayhLRVJOX05PVElDRSAiTmFtZSBmb3Igd2hpY2ggQ1JDIGZhaWxlZCBpcyAobm93KSAnJXMnLCBpbm8gIyVkXG4iLCBmZC0+bmFtZSwgamUzMl90b19jcHUocmQtPmlubykpKTsKKwkJamZmczJfZnJlZV9mdWxsX2RpcmVudChmZCk7CisJCS8qIEZJWE1FOiBXaHkgZG8gd2UgYmVsaWV2ZSB0b3RsZW4/ICovCisJCS8qIFdlIGJlbGlldmUgdG90bGVuIGJlY2F1c2UgdGhlIENSQyBvbiB0aGUgbm9kZSBfaGVhZGVyXyB3YXMgT0ssIGp1c3QgdGhlIG5hbWUgZmFpbGVkLiAqLworCQlESVJUWV9TUEFDRShQQUQoamUzMl90b19jcHUocmQtPnRvdGxlbikpKTsKKwkJcmV0dXJuIDA7CisJfQorCXJhdyA9IGpmZnMyX2FsbG9jX3Jhd19ub2RlX3JlZigpOworCWlmICghcmF3KSB7CisJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoZmQpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX3NjYW5fZGlyZW50X25vZGUoKTogYWxsb2NhdGlvbiBvZiBub2RlIHJlZmVyZW5jZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWMgPSBqZmZzMl9zY2FuX21ha2VfaW5vX2NhY2hlKGMsIGplMzJfdG9fY3B1KHJkLT5waW5vKSk7CisJaWYgKCFpYykgeworCQlqZmZzMl9mcmVlX2Z1bGxfZGlyZW50KGZkKTsKKwkJamZmczJfZnJlZV9yYXdfbm9kZV9yZWYocmF3KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCQorCXJhdy0+X190b3RsZW4gPSBQQUQoamUzMl90b19jcHUocmQtPnRvdGxlbikpOworCXJhdy0+Zmxhc2hfb2Zmc2V0ID0gb2ZzIHwgUkVGX1BSSVNUSU5FOworCXJhdy0+bmV4dF9waHlzID0gTlVMTDsKKwlyYXctPm5leHRfaW5faW5vID0gaWMtPm5vZGVzOworCWljLT5ub2RlcyA9IHJhdzsKKwlpZiAoIWplYi0+Zmlyc3Rfbm9kZSkKKwkJamViLT5maXJzdF9ub2RlID0gcmF3OworCWlmIChqZWItPmxhc3Rfbm9kZSkKKwkJamViLT5sYXN0X25vZGUtPm5leHRfcGh5cyA9IHJhdzsKKwlqZWItPmxhc3Rfbm9kZSA9IHJhdzsKKworCWZkLT5yYXcgPSByYXc7CisJZmQtPm5leHQgPSBOVUxMOworCWZkLT52ZXJzaW9uID0gamUzMl90b19jcHUocmQtPnZlcnNpb24pOworCWZkLT5pbm8gPSBqZTMyX3RvX2NwdShyZC0+aW5vKTsKKwlmZC0+bmhhc2ggPSBmdWxsX25hbWVfaGFzaChmZC0+bmFtZSwgcmQtPm5zaXplKTsKKwlmZC0+dHlwZSA9IHJkLT50eXBlOworCVVTRURfU1BBQ0UoUEFEKGplMzJfdG9fY3B1KHJkLT50b3RsZW4pKSk7CisJamZmczJfYWRkX2ZkX3RvX2xpc3QoYywgZmQsICZpYy0+c2Nhbl9kZW50cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb3VudF9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmwpCit7CisJdWludDMyX3QgY291bnQgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKworCWxpc3RfZm9yX2VhY2godG1wLCBsKSB7CisJCWNvdW50Kys7CisJfQorCXJldHVybiBjb3VudDsKK30KKworLyogTm90ZTogVGhpcyBicmVha3MgaWYgbGlzdF9lbXB0eShoZWFkKS4gSSBkb24ndCBjYXJlLiBZb3UKKyAgIG1pZ2h0LCBpZiB5b3UgY29weSB0aGlzIGNvZGUgYW5kIHVzZSBpdCBlbHNld2hlcmUgOikgKi8KK3N0YXRpYyB2b2lkIHJvdGF0ZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHVpbnQzMl90IGNvdW50KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKm4gPSBoZWFkLT5uZXh0OworCisJbGlzdF9kZWwoaGVhZCk7CisJd2hpbGUoY291bnQtLSkgeworCQluID0gbi0+bmV4dDsKKwl9CisJbGlzdF9hZGQoaGVhZCwgbik7Cit9CisKK3ZvaWQgamZmczJfcm90YXRlX2xpc3RzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCXVpbnQzMl90IHg7CisJdWludDMyX3Qgcm90YXRlYnk7CisKKwl4ID0gY291bnRfbGlzdCgmYy0+Y2xlYW5fbGlzdCk7CisJaWYgKHgpIHsKKwkJcm90YXRlYnkgPSBwc2V1ZG9fcmFuZG9tICUgeDsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJvdGF0aW5nIGNsZWFuX2xpc3QgYnkgJWRcbiIsIHJvdGF0ZWJ5KSk7CisKKwkJcm90YXRlX2xpc3QoKCZjLT5jbGVhbl9saXN0KSwgcm90YXRlYnkpOworCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFcmFzZSBibG9jayBhdCBmcm9udCBvZiBjbGVhbl9saXN0IGlzIGF0ICUwOHhcbiIsCisJCQkgIGxpc3RfZW50cnkoYy0+Y2xlYW5fbGlzdC5uZXh0LCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCktPm9mZnNldCkpOworCX0gZWxzZSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJOb3Qgcm90YXRpbmcgZW1wdHkgY2xlYW5fbGlzdFxuIikpOworCX0KKworCXggPSBjb3VudF9saXN0KCZjLT52ZXJ5X2RpcnR5X2xpc3QpOworCWlmICh4KSB7CisJCXJvdGF0ZWJ5ID0gcHNldWRvX3JhbmRvbSAlIHg7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJSb3RhdGluZyB2ZXJ5X2RpcnR5X2xpc3QgYnkgJWRcbiIsIHJvdGF0ZWJ5KSk7CisKKwkJcm90YXRlX2xpc3QoKCZjLT52ZXJ5X2RpcnR5X2xpc3QpLCByb3RhdGVieSk7CisKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkVyYXNlIGJsb2NrIGF0IGZyb250IG9mIHZlcnlfZGlydHlfbGlzdCBpcyBhdCAlMDh4XG4iLAorCQkJICBsaXN0X2VudHJ5KGMtPnZlcnlfZGlydHlfbGlzdC5uZXh0LCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCktPm9mZnNldCkpOworCX0gZWxzZSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJOb3Qgcm90YXRpbmcgZW1wdHkgdmVyeV9kaXJ0eV9saXN0XG4iKSk7CisJfQorCisJeCA9IGNvdW50X2xpc3QoJmMtPmRpcnR5X2xpc3QpOworCWlmICh4KSB7CisJCXJvdGF0ZWJ5ID0gcHNldWRvX3JhbmRvbSAlIHg7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJSb3RhdGluZyBkaXJ0eV9saXN0IGJ5ICVkXG4iLCByb3RhdGVieSkpOworCisJCXJvdGF0ZV9saXN0KCgmYy0+ZGlydHlfbGlzdCksIHJvdGF0ZWJ5KTsKKworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRXJhc2UgYmxvY2sgYXQgZnJvbnQgb2YgZGlydHlfbGlzdCBpcyBhdCAlMDh4XG4iLAorCQkJICBsaXN0X2VudHJ5KGMtPmRpcnR5X2xpc3QubmV4dCwgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2ssIGxpc3QpLT5vZmZzZXQpKTsKKwl9IGVsc2UgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiTm90IHJvdGF0aW5nIGVtcHR5IGRpcnR5X2xpc3RcbiIpKTsKKwl9CisKKwl4ID0gY291bnRfbGlzdCgmYy0+ZXJhc2FibGVfbGlzdCk7CisJaWYgKHgpIHsKKwkJcm90YXRlYnkgPSBwc2V1ZG9fcmFuZG9tICUgeDsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJvdGF0aW5nIGVyYXNhYmxlX2xpc3QgYnkgJWRcbiIsIHJvdGF0ZWJ5KSk7CisKKwkJcm90YXRlX2xpc3QoKCZjLT5lcmFzYWJsZV9saXN0KSwgcm90YXRlYnkpOworCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFcmFzZSBibG9jayBhdCBmcm9udCBvZiBlcmFzYWJsZV9saXN0IGlzIGF0ICUwOHhcbiIsCisJCQkgIGxpc3RfZW50cnkoYy0+ZXJhc2FibGVfbGlzdC5uZXh0LCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCktPm9mZnNldCkpOworCX0gZWxzZSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJOb3Qgcm90YXRpbmcgZW1wdHkgZXJhc2FibGVfbGlzdFxuIikpOworCX0KKworCWlmIChjLT5ucl9lcmFzaW5nX2Jsb2NrcykgeworCQlyb3RhdGVieSA9IHBzZXVkb19yYW5kb20gJSBjLT5ucl9lcmFzaW5nX2Jsb2NrczsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJvdGF0aW5nIGVyYXNlX3BlbmRpbmdfbGlzdCBieSAlZFxuIiwgcm90YXRlYnkpKTsKKworCQlyb3RhdGVfbGlzdCgoJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCksIHJvdGF0ZWJ5KTsKKworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRXJhc2UgYmxvY2sgYXQgZnJvbnQgb2YgZXJhc2VfcGVuZGluZ19saXN0IGlzIGF0ICUwOHhcbiIsCisJCQkgIGxpc3RfZW50cnkoYy0+ZXJhc2VfcGVuZGluZ19saXN0Lm5leHQsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrLCBsaXN0KS0+b2Zmc2V0KSk7CisJfSBlbHNlIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk5vdCByb3RhdGluZyBlbXB0eSBlcmFzZV9wZW5kaW5nX2xpc3RcbiIpKTsKKwl9CisKKwlpZiAoYy0+bnJfZnJlZV9ibG9ja3MpIHsKKwkJcm90YXRlYnkgPSBwc2V1ZG9fcmFuZG9tICUgYy0+bnJfZnJlZV9ibG9ja3M7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJSb3RhdGluZyBmcmVlX2xpc3QgYnkgJWRcbiIsIHJvdGF0ZWJ5KSk7CisKKwkJcm90YXRlX2xpc3QoKCZjLT5mcmVlX2xpc3QpLCByb3RhdGVieSk7CisKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkVyYXNlIGJsb2NrIGF0IGZyb250IG9mIGZyZWVfbGlzdCBpcyBhdCAlMDh4XG4iLAorCQkJICBsaXN0X2VudHJ5KGMtPmZyZWVfbGlzdC5uZXh0LCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCktPm9mZnNldCkpOworCX0gZWxzZSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJOb3Qgcm90YXRpbmcgZW1wdHkgZnJlZV9saXN0XG4iKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvc3VwZXIuYyBiL2ZzL2pmZnMyL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyYTQ0MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL3N1cGVyLmMKQEAgLTAsMCArMSwzNjUgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgorICoKKyAqICRJZDogc3VwZXIuYyx2IDEuMTA0IDIwMDQvMTEvMjMgMTU6Mzc6MzEgZ2xlaXhuZXIgRXhwICQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9qZmZzMi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgImNvbXByLmgiCisjaW5jbHVkZSAibm9kZWxpc3QuaCIKKworc3RhdGljIHZvaWQgamZmczJfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKworc3RhdGljIGttZW1fY2FjaGVfdCAqamZmczJfaW5vZGVfY2FjaGVwOworCitzdGF0aWMgc3RydWN0IGlub2RlICpqZmZzMl9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICplaTsKKwllaSA9IChzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2MoamZmczJfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBqZmZzMl9kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJa21lbV9jYWNoZV9mcmVlKGpmZnMyX2lub2RlX2NhY2hlcCwgSkZGUzJfSU5PREVfSU5GTyhpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBqZmZzMl9pX2luaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICopIGZvbzsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQorCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpIHsKKwkJaW5pdF9NVVRFWF9MT0NLRUQoJmVpLT5zZW0pOworCQlpbm9kZV9pbml0X29uY2UoJmVpLT52ZnNfaW5vZGUpOworCX0KK30KKworc3RhdGljIGludCBqZmZzMl9zeW5jX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB3YWl0KQoreworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjID0gSkZGUzJfU0JfSU5GTyhzYik7CisKKwlkb3duKCZjLT5hbGxvY19zZW0pOworCWpmZnMyX2ZsdXNoX3didWZfcGFkKGMpOworCXVwKCZjLT5hbGxvY19zZW0pOwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGpmZnMyX3N1cGVyX29wZXJhdGlvbnMgPQoreworCS5hbGxvY19pbm9kZSA9CWpmZnMyX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlID1qZmZzMl9kZXN0cm95X2lub2RlLAorCS5yZWFkX2lub2RlID0JamZmczJfcmVhZF9pbm9kZSwKKwkucHV0X3N1cGVyID0JamZmczJfcHV0X3N1cGVyLAorCS53cml0ZV9zdXBlciA9CWpmZnMyX3dyaXRlX3N1cGVyLAorCS5zdGF0ZnMgPQlqZmZzMl9zdGF0ZnMsCisJLnJlbW91bnRfZnMgPQlqZmZzMl9yZW1vdW50X2ZzLAorCS5jbGVhcl9pbm9kZSA9CWpmZnMyX2NsZWFyX2lub2RlLAorCS5kaXJ0eV9pbm9kZSA9CWpmZnMyX2RpcnR5X2lub2RlLAorCS5zeW5jX2ZzID0JamZmczJfc3luY19mcywKK307CisKK3N0YXRpYyBpbnQgamZmczJfc2JfY29tcGFyZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpwID0gZGF0YTsKKwlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyA9IEpGRlMyX1NCX0lORk8oc2IpOworCisJLyogVGhlIHN1cGVyYmxvY2tzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGVxdWl2YWxlbnQgaWYgdGhlIHVuZGVybHlpbmcgTVRECisJICAgZGV2aWNlIGlzIHRoZSBzYW1lIG9uZSAqLworCWlmIChjLT5tdGQgPT0gcC0+bXRkKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9zYl9jb21wYXJlOiBtYXRjaCBvbiBkZXZpY2UgJWQgKFwiJXNcIilcbiIsIHAtPm10ZC0+aW5kZXgsIHAtPm10ZC0+bmFtZSkpOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfc2JfY29tcGFyZTogTm8gbWF0Y2gsIGRldmljZSAlZCAoXCIlc1wiKSwgZGV2aWNlICVkIChcIiVzXCIpXG4iLAorCQkJICBjLT5tdGQtPmluZGV4LCBjLT5tdGQtPm5hbWUsIHAtPm10ZC0+aW5kZXgsIHAtPm10ZC0+bmFtZSkpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgamZmczJfc2Jfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKnAgPSBkYXRhOworCisJLyogRm9yIHBlcnNpc3RlbmNlIG9mIE5GUyBleHBvcnRzIGV0Yy4gd2UgdXNlIHRoZSBzYW1lIHNfZGV2CisJICAgZWFjaCB0aW1lIHdlIG1vdW50IHRoZSBkZXZpY2UsIGRvbid0IGp1c3QgdXNlIGFuIGFub255bW91cworCSAgIGRldmljZSAqLworCXNiLT5zX2ZzX2luZm8gPSBwOworCXAtPm9zX3ByaXYgPSBzYjsKKwlzYi0+c19kZXYgPSBNS0RFVihNVERfQkxPQ0tfTUFKT1IsIHAtPm10ZC0+aW5kZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmpmZnMyX2dldF9zYl9tdGQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkJCSAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIAorCQkJCQkgICAgICB2b2lkICpkYXRhLCBzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjOworCWludCByZXQ7CisKKwljID0ga21hbGxvYyhzaXplb2YoKmMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWMpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCW1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKKwljLT5tdGQgPSBtdGQ7CisKKwlzYiA9IHNnZXQoZnNfdHlwZSwgamZmczJfc2JfY29tcGFyZSwgamZmczJfc2Jfc2V0LCBjKTsKKworCWlmIChJU19FUlIoc2IpKQorCQlnb3RvIG91dF9wdXQ7CisKKwlpZiAoc2ItPnNfcm9vdCkgeworCQkvKiBOZXcgbW91bnRwb2ludCBmb3IgSkZGUzIgd2hpY2ggaXMgYWxyZWFkeSBtb3VudGVkICovCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nZXRfc2JfbXRkKCk6IERldmljZSAlZCAoXCIlc1wiKSBpcyBhbHJlYWR5IG1vdW50ZWRcbiIsCisJCQkgIG10ZC0+aW5kZXgsIG10ZC0+bmFtZSkpOworCQlnb3RvIG91dF9wdXQ7CisJfQorCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2dldF9zYl9tdGQoKTogTmV3IHN1cGVyYmxvY2sgZm9yIGRldmljZSAlZCAoXCIlc1wiKVxuIiwKKwkJICBtdGQtPmluZGV4LCBtdGQtPm5hbWUpKTsKKworCXNiLT5zX29wID0gJmpmZnMyX3N1cGVyX29wZXJhdGlvbnM7CisJc2ItPnNfZmxhZ3MgPSBmbGFncyB8IE1TX05PQVRJTUU7CisKKwlyZXQgPSBqZmZzMl9kb19maWxsX3N1cGVyKHNiLCBkYXRhLCAoZmxhZ3MmTVNfVkVSQk9TRSk/MTowKTsKKworCWlmIChyZXQpIHsKKwkJLyogRmFpbHVyZSBjYXNlLi4uICovCisJCXVwX3dyaXRlKCZzYi0+c191bW91bnQpOworCQlkZWFjdGl2YXRlX3N1cGVyKHNiKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwlzYi0+c19mbGFncyB8PSBNU19BQ1RJVkU7CisJcmV0dXJuIHNiOworCisgb3V0X3B1dDoKKwlrZnJlZShjKTsKKwlwdXRfbXRkX2RldmljZShtdGQpOworCisJcmV0dXJuIHNiOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpqZmZzMl9nZXRfc2JfbXRkbnIoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkJCSAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIAorCQkJCQkgICAgICB2b2lkICpkYXRhLCBpbnQgbXRkbnIpCit7CisJc3RydWN0IG10ZF9pbmZvICptdGQ7CisKKwltdGQgPSBnZXRfbXRkX2RldmljZShOVUxMLCBtdGRucik7CisJaWYgKCFtdGQpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyOiBNVEQgZGV2aWNlICMldSBkb2Vzbid0IGFwcGVhciB0byBleGlzdFxuIiwgbXRkbnIpKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJcmV0dXJuIGpmZnMyX2dldF9zYl9tdGQoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBtdGQpOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpqZmZzMl9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkJCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJCXZvaWQgKmRhdGEpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCBtdGRucjsKKworCWlmICghZGV2X25hbWUpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2dldF9zYigpOiBkZXZfbmFtZSBcIiVzXCJcbiIsIGRldl9uYW1lKSk7CisKKwkvKiBUaGUgcHJlZmVycmVkIHdheSBvZiBtb3VudGluZyBpbiBmdXR1cmU7IGVzcGVjaWFsbHkgd2hlbgorCSAgIENPTkZJR19CTEtfREVWIGlzIGltcGxlbWVudGVkIC0gd2Ugc3BlY2lmeSB0aGUgdW5kZXJseWluZworCSAgIE1URCBkZXZpY2UgYnkgbnVtYmVyIG9yIGJ5IG5hbWUsIHNvIHRoYXQgd2UgZG9uJ3QgcmVxdWlyZSAKKwkgICBibG9jayBkZXZpY2Ugc3VwcG9ydCB0byBiZSBwcmVzZW50IGluIHRoZSBrZXJuZWwuICovCisKKwkvKiBGSVhNRTogSG93IHRvIGRvIHRoZSByb290IGZzIHRoaXMgd2F5PyAqLworCisJaWYgKGRldl9uYW1lWzBdID09ICdtJyAmJiBkZXZfbmFtZVsxXSA9PSAndCcgJiYgZGV2X25hbWVbMl0gPT0gJ2QnKSB7CisJCS8qIFByb2JhYmx5IG1vdW50aW5nIHdpdGhvdXQgdGhlIGJsa2RldiBjcmFwICovCisJCWlmIChkZXZfbmFtZVszXSA9PSAnOicpIHsKKwkJCXN0cnVjdCBtdGRfaW5mbyAqbXRkOworCisJCQkvKiBNb3VudCBieSBNVEQgZGV2aWNlIG5hbWUgKi8KKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nZXRfc2IoKTogbXRkOiUlcywgbmFtZSBcIiVzXCJcbiIsIGRldl9uYW1lKzQpKTsKKwkJCWZvciAobXRkbnIgPSAwOyBtdGRuciA8IE1BWF9NVERfREVWSUNFUzsgbXRkbnIrKykgeworCQkJCW10ZCA9IGdldF9tdGRfZGV2aWNlKE5VTEwsIG10ZG5yKTsKKwkJCQlpZiAobXRkKSB7CisJCQkJCWlmICghc3RyY21wKG10ZC0+bmFtZSwgZGV2X25hbWUrNCkpCisJCQkJCQlyZXR1cm4gamZmczJfZ2V0X3NiX210ZChmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIG10ZCk7CisJCQkJCXB1dF9tdGRfZGV2aWNlKG10ZCk7CisJCQkJfQorCQkJfQorCQkJcHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMl9nZXRfc2IoKTogTVREIGRldmljZSB3aXRoIG5hbWUgXCIlc1wiIG5vdCBmb3VuZC5cbiIsIGRldl9uYW1lKzQpOworCQl9IGVsc2UgaWYgKGlzZGlnaXQoZGV2X25hbWVbM10pKSB7CisJCQkvKiBNb3VudCBieSBNVEQgZGV2aWNlIG51bWJlciBuYW1lICovCisJCQljaGFyICplbmRwdHI7CisJCQkKKwkJCW10ZG5yID0gc2ltcGxlX3N0cnRvdWwoZGV2X25hbWUrMywgJmVuZHB0ciwgMCk7CisJCQlpZiAoISplbmRwdHIpIHsKKwkJCQkvKiBJdCB3YXMgYSB2YWxpZCBudW1iZXIgKi8KKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZ2V0X3NiKCk6IG10ZCUlZCwgbXRkbnIgJWRcbiIsIG10ZG5yKSk7CisJCQkJcmV0dXJuIGpmZnMyX2dldF9zYl9tdGRucihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIG10ZG5yKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFRyeSB0aGUgb2xkIHdheSAtIHRoZSBoYWNrIHdoZXJlIHdlIGFsbG93ZWQgdXNlcnMgdG8gbW91bnQgCisJICAgL2Rldi9tdGRibG9jayQobikgYnV0IGRpZG4ndCBhY3R1YWxseSBfdXNlXyB0aGUgYmxrZGV2ICovCisKKwllcnIgPSBwYXRoX2xvb2t1cChkZXZfbmFtZSwgTE9PS1VQX0ZPTExPVywgJm5kKTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nZXRfc2IoKTogcGF0aF9sb29rdXAoKSByZXR1cm5lZCAlZCwgaW5vZGUgJXBcbiIsCisJCSAgZXJyLCBuZC5kZW50cnktPmRfaW5vZGUpKTsKKworCWlmIChlcnIpCisJCXJldHVybiBFUlJfUFRSKGVycik7CisKKwllcnIgPSAtRUlOVkFMOworCisJaWYgKCFTX0lTQkxLKG5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJZ290byBvdXQ7CisKKwlpZiAobmQubW50LT5tbnRfZmxhZ3MgJiBNTlRfTk9ERVYpIHsKKwkJZXJyID0gLUVBQ0NFUzsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGltYWpvcihuZC5kZW50cnktPmRfaW5vZGUpICE9IE1URF9CTE9DS19NQUpPUikgeworCQlpZiAoIShmbGFncyAmIE1TX1ZFUkJPU0UpKSAvKiBZZXMgSSBtZWFuIHRoaXMuIFN0cmFuZ2VseSAqLworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJBdHRlbXB0IHRvIG1vdW50IG5vbi1NVEQgZGV2aWNlIFwiJXNcIiBhcyBKRkZTMlxuIiwKKwkJCSAgICAgICBkZXZfbmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCW10ZG5yID0gaW1pbm9yKG5kLmRlbnRyeS0+ZF9pbm9kZSk7CisJcGF0aF9yZWxlYXNlKCZuZCk7CisKKwlyZXR1cm4gamZmczJfZ2V0X3NiX210ZG5yKGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgbXRkbnIpOworCitvdXQ6CisJcGF0aF9yZWxlYXNlKCZuZCk7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIHZvaWQgamZmczJfcHV0X3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjID0gSkZGUzJfU0JfSU5GTyhzYik7CisKKwlEMihwcmludGsoS0VSTl9ERUJVRyAiamZmczI6IGpmZnMyX3B1dF9zdXBlcigpXG4iKSk7CisKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCisJCWpmZnMyX3N0b3BfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZChjKTsKKwlkb3duKCZjLT5hbGxvY19zZW0pOworCWpmZnMyX2ZsdXNoX3didWZfcGFkKGMpOworCXVwKCZjLT5hbGxvY19zZW0pOworCWpmZnMyX2ZyZWVfaW5vX2NhY2hlcyhjKTsKKwlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZnMoYyk7CisJaWYgKGMtPm10ZC0+ZmxhZ3MgJiBNVERfTk9fVklSVEJMT0NLUykKKwkJdmZyZWUoYy0+YmxvY2tzKTsKKwllbHNlCisJCWtmcmVlKGMtPmJsb2Nrcyk7CisJamZmczJfZmxhc2hfY2xlYW51cChjKTsKKwlrZnJlZShjLT5pbm9jYWNoZV9saXN0KTsKKwlpZiAoYy0+bXRkLT5zeW5jKQorCQljLT5tdGQtPnN5bmMoYy0+bXRkKTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9wdXRfc3VwZXIgcmV0dXJuaW5nXG4iKSk7Cit9CisKK3N0YXRpYyB2b2lkIGpmZnMyX2tpbGxfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyA9IEpGRlMyX1NCX0lORk8oc2IpOworCWdlbmVyaWNfc2h1dGRvd25fc3VwZXIoc2IpOworCXB1dF9tdGRfZGV2aWNlKGMtPm10ZCk7CisJa2ZyZWUoYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBqZmZzMl9mc190eXBlID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5uYW1lID0JCSJqZmZzMiIsCisJLmdldF9zYiA9CWpmZnMyX2dldF9zYiwKKwkua2lsbF9zYiA9CWpmZnMyX2tpbGxfc2IsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2pmZnMyX2ZzKHZvaWQpCit7CisJaW50IHJldDsKKworCXByaW50ayhLRVJOX0lORk8gIkpGRlMyIHZlcnNpb24gMi4yLiIKKyNpZmRlZiBDT05GSUdfSkZGUzJfRlNfTkFORAorCSAgICAgICAiIChOQU5EKSIKKyNlbmRpZgorCSAgICAgICAiIChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLlxuIik7CisKKwlqZmZzMl9pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiamZmczJfaSIsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvKSwKKwkJCQkJICAgICAwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQkJICAgICBqZmZzMl9pX2luaXRfb25jZSwgTlVMTCk7CisJaWYgKCFqZmZzMl9pbm9kZV9jYWNoZXApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJKRkZTMiBlcnJvcjogRmFpbGVkIHRvIGluaXRpYWxpc2UgaW5vZGUgY2FjaGVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0ID0gamZmczJfY29tcHJlc3NvcnNfaW5pdCgpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJKRkZTMiBlcnJvcjogRmFpbGVkIHRvIGluaXRpYWxpc2UgY29tcHJlc3NvcnNcbiIpOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gamZmczJfY3JlYXRlX3NsYWJfY2FjaGVzKCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIkpGRlMyIGVycm9yOiBGYWlsZWQgdG8gaW5pdGlhbGlzZSBzbGFiIGNhY2hlc1xuIik7CisJCWdvdG8gb3V0X2NvbXByZXNzb3JzOworCX0KKwlyZXQgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZqZmZzMl9mc190eXBlKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiSkZGUzIgZXJyb3I6IEZhaWxlZCB0byByZWdpc3RlciBmaWxlc3lzdGVtXG4iKTsKKwkJZ290byBvdXRfc2xhYjsKKwl9CisJcmV0dXJuIDA7CisKKyBvdXRfc2xhYjoKKwlqZmZzMl9kZXN0cm95X3NsYWJfY2FjaGVzKCk7Cisgb3V0X2NvbXByZXNzb3JzOgorCWpmZnMyX2NvbXByZXNzb3JzX2V4aXQoKTsKKyBvdXQ6CisJa21lbV9jYWNoZV9kZXN0cm95KGpmZnMyX2lub2RlX2NhY2hlcCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfamZmczJfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmpmZnMyX2ZzX3R5cGUpOworCWpmZnMyX2Rlc3Ryb3lfc2xhYl9jYWNoZXMoKTsKKwlqZmZzMl9jb21wcmVzc29yc19leGl0KCk7CisJa21lbV9jYWNoZV9kZXN0cm95KGpmZnMyX2lub2RlX2NhY2hlcCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfamZmczJfZnMpOworbW9kdWxlX2V4aXQoZXhpdF9qZmZzMl9mcyk7CisKK01PRFVMRV9ERVNDUklQVElPTigiVGhlIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCB2MiIpOworTU9EVUxFX0FVVEhPUigiUmVkIEhhdCwgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOyAvLyBBY3R1YWxseSBkdWFsLWxpY2Vuc2VkLCBidXQgaXQgZG9lc24ndCBtYXR0ZXIgZm9yIAorCQkgICAgICAgLy8gdGhlIHNha2Ugb2YgdGhpcyB0YWcuIEl0J3MgRnJlZSBTb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3N5bWxpbmsuYyBiL2ZzL2pmZnMyL3N5bWxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjE4MjBkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZmczIvc3ltbGluay5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiAkSWQ6IHN5bWxpbmsuYyx2IDEuMTQgMjAwNC8xMS8xNiAyMDozNjoxMiBkd213MiBFeHAgJAorICoKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgIm5vZGVsaXN0LmgiCisKK3N0YXRpYyBpbnQgamZmczJfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CitzdGF0aWMgdm9pZCBqZmZzMl9wdXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgamZmczJfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zID0KK3sJCisJLnJlYWRsaW5rID0JZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsgPQlqZmZzMl9mb2xsb3dfbGluaywKKwkucHV0X2xpbmsgPQlqZmZzMl9wdXRfbGluaywKKwkuc2V0YXR0ciA9CWpmZnMyX3NldGF0dHIKK307CisKK3N0YXRpYyBpbnQgamZmczJfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJYnVmID0gamZmczJfZ2V0bGluayhKRkZTMl9TQl9JTkZPKGRlbnRyeS0+ZF9pbm9kZS0+aV9zYiksIEpGRlMyX0lOT0RFX0lORk8oZGVudHJ5LT5kX2lub2RlKSk7CisJbmRfc2V0X2xpbmsobmQsIGJ1Zik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGpmZnMyX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJY2hhciAqcyA9IG5kX2dldF9saW5rKG5kKTsKKwlpZiAoIUlTX0VSUihzKSkKKwkJa2ZyZWUocyk7Cit9CmRpZmYgLS1naXQgYS9mcy9qZmZzMi93YnVmLmMgYi9mcy9qZmZzMi93YnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgxMjgwNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL3didWYuYwpAQCAtMCwwICsxLDExODQgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqCisgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAqIE1vZGlmaWVkIGRlYnVnZ2VkIGFuZCBlbmhhbmNlZCBieSBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqCisgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgorICoKKyAqICRJZDogd2J1Zi5jLHYgMS44MiAyMDA0LzExLzIwIDIyOjA4OjMxIGR3bXcyIEV4cCAkCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlICJub2RlbGlzdC5oIgorCisvKiBGb3IgdGVzdGluZyB3cml0ZSBmYWlsdXJlcyAqLworI3VuZGVmIEJSRUFLTUUKKyN1bmRlZiBCUkVBS01FSEVBREVSCisKKyNpZmRlZiBCUkVBS01FCitzdGF0aWMgdW5zaWduZWQgY2hhciAqYnJva2VuYnVmOworI2VuZGlmCisKKy8qIG1heC4gZXJhc2UgZmFpbHVyZXMgYmVmb3JlIHdlIG1hcmsgYSBibG9jayBiYWQgKi8KKyNkZWZpbmUgTUFYX0VSQVNFX0ZBSUxVUkVTIAkyCisKKy8qIHR3byBzZWNvbmRzIHRpbWVvdXQgZm9yIHRpbWVkIHdidWYtZmx1c2hpbmcgKi8KKyNkZWZpbmUgV0JVRl9GTFVTSF9USU1FT1VUCTIgKiBIWgorCitzdHJ1Y3QgamZmczJfaW5vZGlydHkgeworCXVpbnQzMl90IGlubzsKKwlzdHJ1Y3QgamZmczJfaW5vZGlydHkgKm5leHQ7Cit9OworCitzdGF0aWMgc3RydWN0IGpmZnMyX2lub2RpcnR5IGlub2RpcnR5X25vbWVtOworCitzdGF0aWMgaW50IGpmZnMyX3didWZfcGVuZGluZ19mb3JfaW5vKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCB1aW50MzJfdCBpbm8pCit7CisJc3RydWN0IGpmZnMyX2lub2RpcnR5ICp0aGlzID0gYy0+d2J1Zl9pbm9kZXM7CisKKwkvKiBJZiBhIG1hbGxvYyBmYWlsZWQsIGNvbnNpZGVyIF9ldmVyeXRoaW5nXyBkaXJ0eSAqLworCWlmICh0aGlzID09ICZpbm9kaXJ0eV9ub21lbSkKKwkJcmV0dXJuIDE7CisKKwkvKiBJZiBpbm8gPT0gMCwgX2FueV8gbm9uLUdDIHdyaXRlcyBtZWFuICd5ZXMnICovCisJaWYgKHRoaXMgJiYgIWlubykKKwkJcmV0dXJuIDE7CisKKwkvKiBMb29rIHRvIHNlZSBpZiB0aGUgaW5vZGUgaW4gcXVlc3Rpb24gaXMgcGVuZGluZyBpbiB0aGUgd2J1ZiAqLworCXdoaWxlICh0aGlzKSB7CisJCWlmICh0aGlzLT5pbm8gPT0gaW5vKQorCQkJcmV0dXJuIDE7CisJCXRoaXMgPSB0aGlzLT5uZXh0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgamZmczJfY2xlYXJfd2J1Zl9pbm9fbGlzdChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlzdHJ1Y3QgamZmczJfaW5vZGlydHkgKnRoaXM7CisKKwl0aGlzID0gYy0+d2J1Zl9pbm9kZXM7CisKKwlpZiAodGhpcyAhPSAmaW5vZGlydHlfbm9tZW0pIHsKKwkJd2hpbGUgKHRoaXMpIHsKKwkJCXN0cnVjdCBqZmZzMl9pbm9kaXJ0eSAqbmV4dCA9IHRoaXMtPm5leHQ7CisJCQlrZnJlZSh0aGlzKTsKKwkJCXRoaXMgPSBuZXh0OworCQl9CisJfQorCWMtPndidWZfaW5vZGVzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgamZmczJfd2J1Zl9kaXJ0aWVzX2lub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCB1aW50MzJfdCBpbm8pCit7CisJc3RydWN0IGpmZnMyX2lub2RpcnR5ICpuZXc7CisKKwkvKiBNYXJrIHRoZSBzdXBlcmJsb2NrIGRpcnR5IHNvIHRoYXQga3VwZGF0ZWQgd2lsbCBmbHVzaC4uLiAqLworCU9GTklfQlNfMlNGRkooYyktPnNfZGlydCA9IDE7CisKKwlpZiAoamZmczJfd2J1Zl9wZW5kaW5nX2Zvcl9pbm8oYywgaW5vKSkKKwkJcmV0dXJuOworCisJbmV3ID0ga21hbGxvYyhzaXplb2YoKm5ldyksIEdGUF9LRVJORUwpOworCWlmICghbmV3KSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJObyBtZW1vcnkgdG8gYWxsb2NhdGUgaW5vZGlydHkuIEZhbGxiYWNrIHRvIGFsbCBjb25zaWRlcmVkIGRpcnR5XG4iKSk7CisJCWpmZnMyX2NsZWFyX3didWZfaW5vX2xpc3QoYyk7CisJCWMtPndidWZfaW5vZGVzID0gJmlub2RpcnR5X25vbWVtOworCQlyZXR1cm47CisJfQorCW5ldy0+aW5vID0gaW5vOworCW5ldy0+bmV4dCA9IGMtPndidWZfaW5vZGVzOworCWMtPndidWZfaW5vZGVzID0gbmV3OworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGpmZnMyX3JlZmlsZV93YnVmX2Jsb2NrcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0aGlzLCAqbmV4dDsKKwlzdGF0aWMgaW50IG47CisKKwlpZiAobGlzdF9lbXB0eSgmYy0+ZXJhc2FibGVfcGVuZGluZ193YnVmX2xpc3QpKQorCQlyZXR1cm47CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUodGhpcywgbmV4dCwgJmMtPmVyYXNhYmxlX3BlbmRpbmdfd2J1Zl9saXN0KSB7CisJCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIgPSBsaXN0X2VudHJ5KHRoaXMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrLCBsaXN0KTsKKworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUmVtb3ZpbmcgZXJhc2VibG9jayBhdCAweCUwOHggZnJvbSBlcmFzYWJsZV9wZW5kaW5nX3didWZfbGlzdC4uLlxuIiwgamViLT5vZmZzZXQpKTsKKwkJbGlzdF9kZWwodGhpcyk7CisJCWlmICgoamlmZmllcyArIChuKyspKSAmIDEyNykgeworCQkJLyogTW9zdCBvZiB0aGUgdGltZSwgd2UganVzdCBlcmFzZSBpdCBpbW1lZGlhdGVseS4gT3RoZXJ3aXNlIHdlCisJCQkgICBzcGVuZCBhZ2VzIHNjYW5uaW5nIGl0IG9uIG1vdW50LCBldGMuICovCisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiLi4uYW5kIGFkZGluZyB0byBlcmFzZV9wZW5kaW5nX2xpc3RcbiIpKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmplYi0+bGlzdCwgJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCk7CisJCQljLT5ucl9lcmFzaW5nX2Jsb2NrcysrOworCQkJamZmczJfZXJhc2VfcGVuZGluZ190cmlnZ2VyKGMpOworCQl9IGVsc2UgeworCQkJLyogU29tZXRpbWVzLCBob3dldmVyLCB3ZSBsZWF2ZSBpdCBlbHNld2hlcmUgc28gaXQgZG9lc24ndCBnZXQKKwkJCSAgIGltbWVkaWF0ZWx5IHJldXNlZCwgYW5kIHdlIHNwcmVhZCB0aGUgbG9hZCBhIGJpdC4gKi8KKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICIuLi5hbmQgYWRkaW5nIHRvIGVyYXNhYmxlX2xpc3RcbiIpKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmplYi0+bGlzdCwgJmMtPmVyYXNhYmxlX2xpc3QpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBqZmZzMl9ibG9ja19yZWZpbGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIpCit7CisJRDEocHJpbnRrKCJBYm91dCB0byByZWZpbGUgYmFkIGJsb2NrIGF0ICUwOHhcbiIsIGplYi0+b2Zmc2V0KSk7CisKKwlEMihqZmZzMl9kdW1wX2Jsb2NrX2xpc3RzKGMpKTsKKwkvKiBGaWxlIHRoZSBleGlzdGluZyBibG9jayBvbiB0aGUgYmFkX3VzZWRfbGlzdC4uLi4gKi8KKwlpZiAoYy0+bmV4dGJsb2NrID09IGplYikKKwkJYy0+bmV4dGJsb2NrID0gTlVMTDsKKwllbHNlIC8qIE5vdCBzdXJlIHRoaXMgc2hvdWxkIGV2ZXIgaGFwcGVuLi4uIG5lZWQgbW9yZSBjb2ZmZWUgKi8KKwkJbGlzdF9kZWwoJmplYi0+bGlzdCk7CisJaWYgKGplYi0+Zmlyc3Rfbm9kZSkgeworCQlEMShwcmludGsoIlJlZmlsaW5nIGJsb2NrIGF0ICUwOHggdG8gYmFkX3VzZWRfbGlzdFxuIiwgamViLT5vZmZzZXQpKTsKKwkJbGlzdF9hZGQoJmplYi0+bGlzdCwgJmMtPmJhZF91c2VkX2xpc3QpOworCX0gZWxzZSB7CisJCUJVRygpOworCQkvKiBJdCBoYXMgdG8gaGF2ZSBoYWQgc29tZSBub2RlcyBvciB3ZSBjb3VsZG4ndCBiZSBoZXJlICovCisJCUQxKHByaW50aygiUmVmaWxpbmcgYmxvY2sgYXQgJTA4eCB0byBlcmFzZV9wZW5kaW5nX2xpc3RcbiIsIGplYi0+b2Zmc2V0KSk7CisJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpOworCQljLT5ucl9lcmFzaW5nX2Jsb2NrcysrOworCQlqZmZzMl9lcmFzZV9wZW5kaW5nX3RyaWdnZXIoYyk7CisJfQorCUQyKGpmZnMyX2R1bXBfYmxvY2tfbGlzdHMoYykpOworCisJLyogQWRqdXN0IGl0cyBzaXplIGNvdW50cyBhY2NvcmRpbmdseSAqLworCWMtPndhc3RlZF9zaXplICs9IGplYi0+ZnJlZV9zaXplOworCWMtPmZyZWVfc2l6ZSAtPSBqZWItPmZyZWVfc2l6ZTsKKwlqZWItPndhc3RlZF9zaXplICs9IGplYi0+ZnJlZV9zaXplOworCWplYi0+ZnJlZV9zaXplID0gMDsKKworCUFDQ1RfU0FOSVRZX0NIRUNLKGMsamViKTsKKwlEMShBQ0NUX1BBUkFOT0lBX0NIRUNLKGplYikpOworfQorCisvKiBSZWNvdmVyIGZyb20gZmFpbHVyZSB0byB3cml0ZSB3YnVmLiBSZWNvdmVyIHRoZSBub2RlcyB1cCB0byB0aGUKKyAqIHdidWYsIG5vdCB0aGUgb25lIHdoaWNoIHdlIHdlcmUgc3RhcnRpbmcgdG8gdHJ5IHRvIHdyaXRlLiAqLworCitzdGF0aWMgdm9pZCBqZmZzMl93YnVmX3JlY292ZXIoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpCit7CisJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwgKm5ld19qZWI7CisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqKmZpcnN0X3JhdywgKipyYXc7CisJc2l6ZV90IHJldGxlbjsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl1aW50MzJfdCBzdGFydCwgZW5kLCBvZnMsIGxlbjsKKworCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCWplYiA9ICZjLT5ibG9ja3NbYy0+d2J1Zl9vZnMgLyBjLT5zZWN0b3Jfc2l6ZV07CisKKwlqZmZzMl9ibG9ja19yZWZpbGUoYywgamViKTsKKworCS8qIEZpbmQgdGhlIGZpcnN0IG5vZGUgdG8gYmUgcmVjb3ZlcmVkLCBieSBza2lwcGluZyBvdmVyIGV2ZXJ5CisJICAgbm9kZSB3aGljaCBlbmRzIGJlZm9yZSB0aGUgd2J1ZiBzdGFydHMsIG9yIHdoaWNoIGlzIG9ic29sZXRlLiAqLworCWZpcnN0X3JhdyA9ICZqZWItPmZpcnN0X25vZGU7CisJd2hpbGUgKCpmaXJzdF9yYXcgJiYgCisJICAgICAgIChyZWZfb2Jzb2xldGUoKmZpcnN0X3JhdykgfHwKKwkJKHJlZl9vZmZzZXQoKmZpcnN0X3JhdykrcmVmX3RvdGxlbihjLCBqZWIsICpmaXJzdF9yYXcpKSA8IGMtPndidWZfb2ZzKSkgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiU2tpcHBpbmcgbm9kZSBhdCAweCUwOHgoJWQpLTB4JTA4eCB3aGljaCBpcyBlaXRoZXIgYmVmb3JlIDB4JTA4eCBvciBvYnNvbGV0ZVxuIiwKKwkJCSAgcmVmX29mZnNldCgqZmlyc3RfcmF3KSwgcmVmX2ZsYWdzKCpmaXJzdF9yYXcpLAorCQkJICAocmVmX29mZnNldCgqZmlyc3RfcmF3KSArIHJlZl90b3RsZW4oYywgamViLCAqZmlyc3RfcmF3KSksCisJCQkgIGMtPndidWZfb2ZzKSk7CisJCWZpcnN0X3JhdyA9ICYoKmZpcnN0X3JhdyktPm5leHRfcGh5czsKKwl9CisKKwlpZiAoISpmaXJzdF9yYXcpIHsKKwkJLyogQWxsIG5vZGVzIHdlcmUgb2Jzb2xldGUuIE5vdGhpbmcgdG8gcmVjb3Zlci4gKi8KKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk5vIG5vbi1vYnNvbGV0ZSBub2RlcyB0byBiZSByZWNvdmVyZWQuIEp1c3QgZmlsaW5nIGJsb2NrIGJhZFxuIikpOworCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCXN0YXJ0ID0gcmVmX29mZnNldCgqZmlyc3RfcmF3KTsKKwllbmQgPSByZWZfb2Zmc2V0KCpmaXJzdF9yYXcpICsgcmVmX3RvdGxlbihjLCBqZWIsICpmaXJzdF9yYXcpOworCisJLyogRmluZCB0aGUgbGFzdCBub2RlIHRvIGJlIHJlY292ZXJlZCAqLworCXJhdyA9IGZpcnN0X3JhdzsKKwl3aGlsZSAoKCpyYXcpKSB7CisJCWlmICghcmVmX29ic29sZXRlKCpyYXcpKQorCQkJZW5kID0gcmVmX29mZnNldCgqcmF3KSArIHJlZl90b3RsZW4oYywgamViLCAqcmF3KTsKKworCQlyYXcgPSAmKCpyYXcpLT5uZXh0X3BoeXM7CisJfQorCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgIndidWYgcmVjb3ZlciAlMDh4LSUwOHhcbiIsIHN0YXJ0LCBlbmQpKTsKKworCWJ1ZiA9IE5VTEw7CisJaWYgKHN0YXJ0IDwgYy0+d2J1Zl9vZnMpIHsKKwkJLyogRmlyc3QgYWZmZWN0ZWQgbm9kZSB3YXMgYWxyZWFkeSBwYXJ0aWFsbHkgd3JpdHRlbi4KKwkJICogQXR0ZW1wdCB0byByZXJlYWQgdGhlIG9sZCBkYXRhIGludG8gb3VyIGJ1ZmZlci4gKi8KKworCQlidWYgPSBrbWFsbG9jKGVuZCAtIHN0YXJ0LCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFidWYpIHsKKwkJCXByaW50ayhLRVJOX0NSSVQgIk1hbGxvYyBmYWlsdXJlIGluIHdidWYgcmVjb3ZlcnkuIERhdGEgbG9zcyBlbnN1ZXMuXG4iKTsKKworCQkJZ290byByZWFkX2ZhaWxlZDsKKwkJfQorCisJCS8qIERvIHRoZSByZWFkLi4uICovCisJCWlmIChqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpCisJCQlyZXQgPSBjLT5tdGQtPnJlYWRfZWNjKGMtPm10ZCwgc3RhcnQsIGMtPndidWZfb2ZzIC0gc3RhcnQsICZyZXRsZW4sIGJ1ZiwgTlVMTCwgYy0+b29iaW5mbyk7CisJCWVsc2UKKwkJCXJldCA9IGMtPm10ZC0+cmVhZChjLT5tdGQsIHN0YXJ0LCBjLT53YnVmX29mcyAtIHN0YXJ0LCAmcmV0bGVuLCBidWYpOworCQkKKwkJaWYgKHJldCA9PSAtRUJBRE1TRyAmJiByZXRsZW4gPT0gYy0+d2J1Zl9vZnMgLSBzdGFydCkgeworCQkJLyogRUNDIHJlY292ZXJlZCAqLworCQkJcmV0ID0gMDsKKwkJfQorCQlpZiAocmV0IHx8IHJldGxlbiAhPSBjLT53YnVmX29mcyAtIHN0YXJ0KSB7CisJCQlwcmludGsoS0VSTl9DUklUICJPbGQgZGF0YSBhcmUgYWxyZWFkeSBsb3N0IGluIHdidWYgcmVjb3ZlcnkuIERhdGEgbG9zcyBlbnN1ZXMuXG4iKTsKKworCQkJa2ZyZWUoYnVmKTsKKwkJCWJ1ZiA9IE5VTEw7CisJCXJlYWRfZmFpbGVkOgorCQkJZmlyc3RfcmF3ID0gJigqZmlyc3RfcmF3KS0+bmV4dF9waHlzOworCQkJLyogSWYgdGhpcyB3YXMgdGhlIG9ubHkgbm9kZSB0byBiZSByZWNvdmVyZWQsIGdpdmUgdXAgKi8KKwkJCWlmICghKCpmaXJzdF9yYXcpKQorCQkJCXJldHVybjsKKworCQkJLyogSXQgd2Fzbid0LiBHbyBvbiBhbmQgdHJ5IHRvIHJlY292ZXIgbm9kZXMgY29tcGxldGUgaW4gdGhlIHdidWYgKi8KKwkJCXN0YXJ0ID0gcmVmX29mZnNldCgqZmlyc3RfcmF3KTsKKwkJfSBlbHNlIHsKKwkJCS8qIFJlYWQgc3VjY2VlZGVkLiBDb3B5IHRoZSByZW1haW5pbmcgZGF0YSBmcm9tIHRoZSB3YnVmICovCisJCQltZW1jcHkoYnVmICsgKGMtPndidWZfb2ZzIC0gc3RhcnQpLCBjLT53YnVmLCBlbmQgLSBjLT53YnVmX29mcyk7CisJCX0KKwl9CisJLyogT0suLi4gd2UncmUgdG8gcmV3cml0ZSAoZW5kLXN0YXJ0KSBieXRlcyBvZiBkYXRhIGZyb20gZmlyc3RfcmF3IG9ud2FyZHMuCisJICAgRWl0aGVyICdidWYnIGNvbnRhaW5zIHRoZSBkYXRhLCBvciB3ZSBmaW5kIGl0IGluIHRoZSB3YnVmICovCisKKworCS8qIC4uLiBhbmQgZ2V0IGFuIGFsbG9jYXRpb24gb2Ygc3BhY2UgZnJvbSBhIHNoaW55IG5ldyBibG9jayBpbnN0ZWFkICovCisJcmV0ID0gamZmczJfcmVzZXJ2ZV9zcGFjZV9nYyhjLCBlbmQtc3RhcnQsICZvZnMsICZsZW4pOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciB3YnVmIHJlY292ZXJ5LiBEYXRhIGxvc3MgZW5zdWVzLlxuIik7CisJCWlmIChidWYpCisJCQlrZnJlZShidWYpOworCQlyZXR1cm47CisJfQorCWlmIChlbmQtc3RhcnQgPj0gYy0+d2J1Zl9wYWdlc2l6ZSkgeworCQkvKiBOZWVkIHRvIGRvIGFub3RoZXIgd3JpdGUgaW1tZWRpYXRlbHkuIFRoaXMsIGJ0dywKKwkJIG1lYW5zIHRoYXQgd2UnbGwgYmUgd3JpdGluZyBmcm9tICdidWYnIGFuZCBub3QgZnJvbQorCQkgdGhlIHdidWYuIFNpbmNlIGlmIHdlJ3JlIHdyaXRpbmcgZnJvbSB0aGUgd2J1ZiB0aGVyZQorCQkgd29uJ3QgYmUgbW9yZSB0aGFuIGEgd2J1ZiBmdWxsIG9mIGRhdGEsIG5vdyB3aWxsCisJCSB0aGVyZT8gOikgKi8KKworCQl1aW50MzJfdCB0b3dyaXRlID0gKGVuZC1zdGFydCkgLSAoKGVuZC1zdGFydCklYy0+d2J1Zl9wYWdlc2l6ZSk7CisKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIldyaXRlIDB4JXggYnl0ZXMgYXQgMHglMDh4IGluIHdidWYgcmVjb3ZlclxuIiwKKwkJCSAgdG93cml0ZSwgb2ZzKSk7CisJICAKKyNpZmRlZiBCUkVBS01FSEVBREVSCisJCXN0YXRpYyBpbnQgYnJlYWttZTsKKwkJaWYgKGJyZWFrbWUrKyA9PSAyMCkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJGYWtpbmcgd3JpdGUgZXJyb3IgYXQgMHglMDh4XG4iLCBvZnMpOworCQkJYnJlYWttZSA9IDA7CisJCQljLT5tdGQtPndyaXRlX2VjYyhjLT5tdGQsIG9mcywgdG93cml0ZSwgJnJldGxlbiwKKwkJCQkJICBicm9rZW5idWYsIE5VTEwsIGMtPm9vYmluZm8pOworCQkJcmV0ID0gLUVJTzsKKwkJfSBlbHNlCisjZW5kaWYKKwkJaWYgKGpmZnMyX2NsZWFubWFya2VyX29vYihjKSkKKwkJCXJldCA9IGMtPm10ZC0+d3JpdGVfZWNjKGMtPm10ZCwgb2ZzLCB0b3dyaXRlLCAmcmV0bGVuLAorCQkJCQkJYnVmLCBOVUxMLCBjLT5vb2JpbmZvKTsKKwkJZWxzZQorCQkJcmV0ID0gYy0+bXRkLT53cml0ZShjLT5tdGQsIG9mcywgdG93cml0ZSwgJnJldGxlbiwgYnVmKTsKKworCQlpZiAocmV0IHx8IHJldGxlbiAhPSB0b3dyaXRlKSB7CisJCQkvKiBBcmdoLiBXZSB0cmllZC4gUmVhbGx5IHdlIGRpZC4gKi8KKwkJCXByaW50ayhLRVJOX0NSSVQgIlJlY292ZXJ5IG9mIHdidWYgZmFpbGVkIGR1ZSB0byBhIHNlY29uZCB3cml0ZSBlcnJvclxuIik7CisJCQlrZnJlZShidWYpOworCisJCQlpZiAocmV0bGVuKSB7CisJCQkJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmF3MjsKKworCQkJCXJhdzIgPSBqZmZzMl9hbGxvY19yYXdfbm9kZV9yZWYoKTsKKwkJCQlpZiAoIXJhdzIpCisJCQkJCXJldHVybjsKKworCQkJCXJhdzItPmZsYXNoX29mZnNldCA9IG9mcyB8IFJFRl9PQlNPTEVURTsKKwkJCQlyYXcyLT5fX3RvdGxlbiA9IHJlZl90b3RsZW4oYywgamViLCAqZmlyc3RfcmF3KTsKKwkJCQlyYXcyLT5uZXh0X3BoeXMgPSBOVUxMOworCQkJCXJhdzItPm5leHRfaW5faW5vID0gTlVMTDsKKworCQkJCWpmZnMyX2FkZF9waHlzaWNhbF9ub2RlX3JlZihjLCByYXcyKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIlJlY292ZXJ5IG9mIHdidWYgc3VjY2VlZGVkIHRvICUwOHhcbiIsIG9mcyk7CisKKwkJYy0+d2J1Zl9sZW4gPSAoZW5kIC0gc3RhcnQpIC0gdG93cml0ZTsKKwkJYy0+d2J1Zl9vZnMgPSBvZnMgKyB0b3dyaXRlOworCQltZW1jcHkoYy0+d2J1ZiwgYnVmICsgdG93cml0ZSwgYy0+d2J1Zl9sZW4pOworCQkvKiBEb24ndCBtdWNrIGFib3V0IHdpdGggYy0+d2J1Zl9pbm9kZXMuIEZhbHNlIHBvc2l0aXZlcyBhcmUgaGFybWxlc3MuICovCisKKwkJa2ZyZWUoYnVmKTsKKwl9IGVsc2UgeworCQkvKiBPSywgbm93IHdlJ3JlIGxlZnQgd2l0aCB0aGUgZHJlZ3MgaW4gd2hpY2hldmVyIGJ1ZmZlciB3ZSdyZSB1c2luZyAqLworCQlpZiAoYnVmKSB7CisJCQltZW1jcHkoYy0+d2J1ZiwgYnVmLCBlbmQtc3RhcnQpOworCQkJa2ZyZWUoYnVmKTsKKwkJfSBlbHNlIHsKKwkJCW1lbW1vdmUoYy0+d2J1ZiwgYy0+d2J1ZiArIChzdGFydCAtIGMtPndidWZfb2ZzKSwgZW5kIC0gc3RhcnQpOworCQl9CisJCWMtPndidWZfb2ZzID0gb2ZzOworCQljLT53YnVmX2xlbiA9IGVuZCAtIHN0YXJ0OworCX0KKworCS8qIE5vdyBzb3J0IG91dCB0aGUgamZmczJfcmF3X25vZGVfcmVmcywgbW92aW5nIHRoZW0gZnJvbSB0aGUgb2xkIHRvIHRoZSBuZXh0IGJsb2NrICovCisJbmV3X2plYiA9ICZjLT5ibG9ja3Nbb2ZzIC8gYy0+c2VjdG9yX3NpemVdOworCisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCWlmIChuZXdfamViLT5maXJzdF9ub2RlKSB7CisJCS8qIE9kZCwgYnV0IHBvc3NpYmxlIHdpdGggU1QgZmxhc2ggbGF0ZXIgbWF5YmUgKi8KKwkJbmV3X2plYi0+bGFzdF9ub2RlLT5uZXh0X3BoeXMgPSAqZmlyc3RfcmF3OworCX0gZWxzZSB7CisJCW5ld19qZWItPmZpcnN0X25vZGUgPSAqZmlyc3RfcmF3OworCX0KKworCXJhdyA9IGZpcnN0X3JhdzsKKwl3aGlsZSAoKnJhdykgeworCQl1aW50MzJfdCByYXdsZW4gPSByZWZfdG90bGVuKGMsIGplYiwgKnJhdyk7CisKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJlZmlsaW5nIGJsb2NrIG9mICUwOHggYXQgJTA4eCglZCkgdG8gJTA4eFxuIiwKKwkJCSAgcmF3bGVuLCByZWZfb2Zmc2V0KCpyYXcpLCByZWZfZmxhZ3MoKnJhdyksIG9mcykpOworCisJCWlmIChyZWZfb2Jzb2xldGUoKnJhdykpIHsKKwkJCS8qIFNob3VsZG4ndCByZWFsbHkgaGFwcGVuIG11Y2ggKi8KKwkJCW5ld19qZWItPmRpcnR5X3NpemUgKz0gcmF3bGVuOworCQkJbmV3X2plYi0+ZnJlZV9zaXplIC09IHJhd2xlbjsKKwkJCWMtPmRpcnR5X3NpemUgKz0gcmF3bGVuOworCQl9IGVsc2UgeworCQkJbmV3X2plYi0+dXNlZF9zaXplICs9IHJhd2xlbjsKKwkJCW5ld19qZWItPmZyZWVfc2l6ZSAtPSByYXdsZW47CisJCQlqZWItPmRpcnR5X3NpemUgKz0gcmF3bGVuOworCQkJamViLT51c2VkX3NpemUgIC09IHJhd2xlbjsKKwkJCWMtPmRpcnR5X3NpemUgKz0gcmF3bGVuOworCQl9CisJCWMtPmZyZWVfc2l6ZSAtPSByYXdsZW47CisJCSgqcmF3KS0+Zmxhc2hfb2Zmc2V0ID0gb2ZzIHwgcmVmX2ZsYWdzKCpyYXcpOworCQlvZnMgKz0gcmF3bGVuOworCQluZXdfamViLT5sYXN0X25vZGUgPSAqcmF3OworCisJCXJhdyA9ICYoKnJhdyktPm5leHRfcGh5czsKKwl9CisKKwkvKiBGaXggdXAgdGhlIG9yaWdpbmFsIGplYiBub3cgaXQncyBvbiB0aGUgYmFkX2xpc3QgKi8KKwkqZmlyc3RfcmF3ID0gTlVMTDsKKwlpZiAoZmlyc3RfcmF3ID09ICZqZWItPmZpcnN0X25vZGUpIHsKKwkJamViLT5sYXN0X25vZGUgPSBOVUxMOworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRmFpbGluZyBibG9jayBhdCAlMDh4IGlzIG5vdyBlbXB0eS4gTW92aW5nIHRvIGVyYXNlX3BlbmRpbmdfbGlzdFxuIiwgamViLT5vZmZzZXQpKTsKKwkJbGlzdF9kZWwoJmplYi0+bGlzdCk7CisJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpOworCQljLT5ucl9lcmFzaW5nX2Jsb2NrcysrOworCQlqZmZzMl9lcmFzZV9wZW5kaW5nX3RyaWdnZXIoYyk7CisJfQorCWVsc2UKKwkJamViLT5sYXN0X25vZGUgPSBjb250YWluZXJfb2YoZmlyc3RfcmF3LCBzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmLCBuZXh0X3BoeXMpOworCisJQUNDVF9TQU5JVFlfQ0hFQ0soYyxqZWIpOworICAgICAgICBEMShBQ0NUX1BBUkFOT0lBX0NIRUNLKGplYikpOworCisJQUNDVF9TQU5JVFlfQ0hFQ0soYyxuZXdfamViKTsKKyAgICAgICAgRDEoQUNDVF9QQVJBTk9JQV9DSEVDSyhuZXdfamViKSk7CisKKwlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJ3YnVmIHJlY292ZXJ5IGNvbXBsZXRlZCBPS1xuIikpOworfQorCisvKiBNZWFuaW5nIG9mIHBhZCBhcmd1bWVudDoKKyAgIDA6IERvIG5vdCBwYWQuIFByb2JhYmx5IHBvaW50bGVzcyAtIHdlIG9ubHkgZXZlciB1c2UgdGhpcyB3aGVuIHdlIGNhbid0IHBhZCBhbnl3YXkuCisgICAxOiBQYWQsIGRvIG5vdCBhZGp1c3QgbmV4dGJsb2NrIGZyZWVfc2l6ZQorICAgMjogUGFkLCBhZGp1c3QgbmV4dGJsb2NrIGZyZWVfc2l6ZQorKi8KKyNkZWZpbmUgTk9QQUQJCTAKKyNkZWZpbmUgUEFEX05PQUNDT1VOVAkxCisjZGVmaW5lIFBBRF9BQ0NPVU5USU5HCTIKKworc3RhdGljIGludCBfX2pmZnMyX2ZsdXNoX3didWYoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIGludCBwYWQpCit7CisJaW50IHJldDsKKwlzaXplX3QgcmV0bGVuOworCisJLyogTm90aGluZyB0byBkbyBpZiBub3QgTkFORCBmbGFzaC4gSW4gcGFydGljdWxhciwgd2Ugc2hvdWxkbid0CisJICAgZGVsX3RpbWVyKCkgdGhlIHRpbWVyIHdlIG5ldmVyIGluaXRpYWxpc2VkLiAqLworCWlmIChqZmZzMl9jYW5fbWFya19vYnNvbGV0ZShjKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWRvd25fdHJ5bG9jaygmYy0+YWxsb2Nfc2VtKSkgeworCQl1cCgmYy0+YWxsb2Nfc2VtKTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiamZmczJfZmx1c2hfd2J1ZigpIGNhbGxlZCB3aXRoIGFsbG9jX3NlbSBub3QgbG9ja2VkIVxuIik7CisJCUJVRygpOworCX0KKworCWlmKCFjLT53YnVmIHx8ICFjLT53YnVmX2xlbikKKwkJcmV0dXJuIDA7CisKKwkvKiBjbGFpbSByZW1haW5pbmcgc3BhY2Ugb24gdGhlIHBhZ2UKKwkgICB0aGlzIGhhcHBlbnMsIGlmIHdlIGhhdmUgYSBjaGFuZ2UgdG8gYSBuZXcgYmxvY2ssCisJICAgb3IgaWYgZnN5bmMgZm9yY2VzIHVzIHRvIGZsdXNoIHRoZSB3cml0ZWJ1ZmZlci4KKwkgICBpZiB3ZSBoYXZlIGEgc3dpdGNoIHRvIG5leHQgcGFnZSwgd2Ugd2lsbCBub3QgaGF2ZQorCSAgIGVub3VnaCByZW1haW5pbmcgc3BhY2UgZm9yIHRoaXMuIAorCSovCisJaWYgKHBhZCkgeworCQljLT53YnVmX2xlbiA9IFBBRChjLT53YnVmX2xlbik7CisKKwkJLyogUGFkIHdpdGggSkZGUzJfRElSVFlfQklUTUFTSyBpbml0aWFsbHkuICB0aGlzIGhlbHBzIG91dCBFQ0MnZCBOT1IKKwkJICAgd2l0aCA4IGJ5dGUgcGFnZSBzaXplICovCisJCW1lbXNldChjLT53YnVmICsgYy0+d2J1Zl9sZW4sIDAsIGMtPndidWZfcGFnZXNpemUgLSBjLT53YnVmX2xlbik7CisJCQorCQlpZiAoIGMtPndidWZfbGVuICsgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpIDwgYy0+d2J1Zl9wYWdlc2l6ZSkgeworCQkJc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSAqcGFkbm9kZSA9ICh2b2lkICopKGMtPndidWYgKyBjLT53YnVmX2xlbik7CisJCQlwYWRub2RlLT5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOworCQkJcGFkbm9kZS0+bm9kZXR5cGUgPSBjcHVfdG9famUxNihKRkZTMl9OT0RFVFlQRV9QQURESU5HKTsKKwkJCXBhZG5vZGUtPnRvdGxlbiA9IGNwdV90b19qZTMyKGMtPndidWZfcGFnZXNpemUgLSBjLT53YnVmX2xlbik7CisJCQlwYWRub2RlLT5oZHJfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcGFkbm9kZSwgc2l6ZW9mKCpwYWRub2RlKS00KSk7CisJCX0KKwl9CisJLyogZWxzZSBqZmZzMl9mbGFzaF93cml0ZXYgaGFzIGFjdHVhbGx5IGZpbGxlZCBpbiB0aGUgcmVzdCBvZiB0aGUKKwkgICBidWZmZXIgZm9yIHVzLCBhbmQgd2lsbCBkZWFsIHdpdGggdGhlIG5vZGUgcmVmcyBldGMuIGxhdGVyLiAqLworCQorI2lmZGVmIEJSRUFLTUUKKwlzdGF0aWMgaW50IGJyZWFrbWU7CisJaWYgKGJyZWFrbWUrKyA9PSAyMCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIkZha2luZyB3cml0ZSBlcnJvciBhdCAweCUwOHhcbiIsIGMtPndidWZfb2ZzKTsKKwkJYnJlYWttZSA9IDA7CisJCWMtPm10ZC0+d3JpdGVfZWNjKGMtPm10ZCwgYy0+d2J1Zl9vZnMsIGMtPndidWZfcGFnZXNpemUsCisJCQkJCSZyZXRsZW4sIGJyb2tlbmJ1ZiwgTlVMTCwgYy0+b29iaW5mbyk7CisJCXJldCA9IC1FSU87CisJfSBlbHNlIAorI2VuZGlmCisJCisJaWYgKGpmZnMyX2NsZWFubWFya2VyX29vYihjKSkKKwkJcmV0ID0gYy0+bXRkLT53cml0ZV9lY2MoYy0+bXRkLCBjLT53YnVmX29mcywgYy0+d2J1Zl9wYWdlc2l6ZSwgJnJldGxlbiwgYy0+d2J1ZiwgTlVMTCwgYy0+b29iaW5mbyk7CisJZWxzZQorCQlyZXQgPSBjLT5tdGQtPndyaXRlKGMtPm10ZCwgYy0+d2J1Zl9vZnMsIGMtPndidWZfcGFnZXNpemUsICZyZXRsZW4sIGMtPndidWYpOworCisJaWYgKHJldCB8fCByZXRsZW4gIT0gYy0+d2J1Zl9wYWdlc2l6ZSkgeworCQlpZiAocmV0KQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfZmx1c2hfd2J1ZigpOiBXcml0ZSBmYWlsZWQgd2l0aCAlZFxuIixyZXQpOworCQllbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX2ZsdXNoX3didWYoKTogV3JpdGUgd2FzIHNob3J0OiAlemQgaW5zdGVhZCBvZiAlZFxuIiwKKwkJCQlyZXRsZW4sIGMtPndidWZfcGFnZXNpemUpOworCQkJcmV0ID0gLUVJTzsKKwkJfQorCisJCWpmZnMyX3didWZfcmVjb3ZlcihjKTsKKworCQlyZXR1cm4gcmV0OworCX0KKworCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCS8qIEFkanVzdCBmcmVlIHNpemUgb2YgdGhlIGJsb2NrIGlmIHdlIHBhZGRlZC4gKi8KKwlpZiAocGFkKSB7CisJCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWI7CisKKwkJamViID0gJmMtPmJsb2Nrc1tjLT53YnVmX29mcyAvIGMtPnNlY3Rvcl9zaXplXTsKKworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZmx1c2hfd2J1ZigpIGFkanVzdGluZyBmcmVlX3NpemUgb2YgJXNibG9jayBhdCAlMDh4XG4iLAorCQkJICAoamViPT1jLT5uZXh0YmxvY2spPyJuZXh0IjoiIiwgamViLT5vZmZzZXQpKTsKKworCQkvKiB3YnVmX3BhZ2VzaXplIC0gd2J1Zl9sZW4gaXMgdGhlIGFtb3VudCBvZiBzcGFjZSB0aGF0J3MgdG8gYmUgCisJCSAgIHBhZGRlZC4gSWYgdGhlcmUgaXMgbGVzcyBmcmVlIHNwYWNlIGluIHRoZSBibG9jayB0aGFuIHRoYXQsCisJCSAgIHNvbWV0aGluZyBzY3Jld2VkIHVwICovCisJCWlmIChqZWItPmZyZWVfc2l6ZSA8IChjLT53YnVmX3BhZ2VzaXplIC0gYy0+d2J1Zl9sZW4pKSB7CisJCQlwcmludGsoS0VSTl9DUklUICJqZmZzMl9mbHVzaF93YnVmKCk6IEFjY291bnRpbmcgZXJyb3IuIHdidWYgYXQgMHglMDh4IGhhcyAweCUwM3ggYnl0ZXMsIDB4JTAzeCBsZWZ0LlxuIiwKKwkJCSAgICAgICBjLT53YnVmX29mcywgYy0+d2J1Zl9sZW4sIGMtPndidWZfcGFnZXNpemUtYy0+d2J1Zl9sZW4pOworCQkJcHJpbnRrKEtFUk5fQ1JJVCAiamZmczJfZmx1c2hfd2J1ZigpOiBCdXQgZnJlZV9zaXplIGZvciBibG9jayBhdCAweCUwOHggaXMgb25seSAweCUwOHhcbiIsCisJCQkgICAgICAgamViLT5vZmZzZXQsIGplYi0+ZnJlZV9zaXplKTsKKwkJCUJVRygpOworCQl9CisJCWplYi0+ZnJlZV9zaXplIC09IChjLT53YnVmX3BhZ2VzaXplIC0gYy0+d2J1Zl9sZW4pOworCQljLT5mcmVlX3NpemUgLT0gKGMtPndidWZfcGFnZXNpemUgLSBjLT53YnVmX2xlbik7CisJCWplYi0+d2FzdGVkX3NpemUgKz0gKGMtPndidWZfcGFnZXNpemUgLSBjLT53YnVmX2xlbik7CisJCWMtPndhc3RlZF9zaXplICs9IChjLT53YnVmX3BhZ2VzaXplIC0gYy0+d2J1Zl9sZW4pOworCX0KKworCS8qIFN0aWNrIGFueSBub3ctb2Jzb2xldGVkIGJsb2NrcyBvbiB0aGUgZXJhc2VfcGVuZGluZ19saXN0ICovCisJamZmczJfcmVmaWxlX3didWZfYmxvY2tzKGMpOworCWpmZnMyX2NsZWFyX3didWZfaW5vX2xpc3QoYyk7CisJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisKKwltZW1zZXQoYy0+d2J1ZiwweGZmLGMtPndidWZfcGFnZXNpemUpOworCS8qIGFkanVzdCB3cml0ZSBidWZmZXIgb2Zmc2V0LCBlbHNlIHdlIGdldCBhIG5vbiBjb250aWd1b3VzIHdyaXRlIGJ1ZyAqLworCWMtPndidWZfb2ZzICs9IGMtPndidWZfcGFnZXNpemU7CisJYy0+d2J1Zl9sZW4gPSAwOworCXJldHVybiAwOworfQorCisvKiBUcmlnZ2VyIGdhcmJhZ2UgY29sbGVjdGlvbiB0byBmbHVzaCB0aGUgd3JpdGUtYnVmZmVyLiAKKyAgIElmIGlubyBhcmcgaXMgemVybywgZG8gaXQgaWYgX2FueV8gcmVhbCAoaS5lLiBub3QgR0MpIHdyaXRlcyBhcmUKKyAgIG91dHN0YW5kaW5nLiBJZiBpbm8gYXJnIG5vbi16ZXJvLCBkbyBpdCBvbmx5IGlmIGEgd3JpdGUgZm9yIHRoZSAKKyAgIGdpdmVuIGlub2RlIGlzIG91dHN0YW5kaW5nLiAqLworaW50IGpmZnMyX2ZsdXNoX3didWZfZ2Moc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHVpbnQzMl90IGlubykKK3sKKwl1aW50MzJfdCBvbGRfd2J1Zl9vZnM7CisJdWludDMyX3Qgb2xkX3didWZfbGVuOworCWludCByZXQgPSAwOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2ZsdXNoX3didWZfZ2MoKSBjYWxsZWQgZm9yIGlubyAjJXUuLi5cbiIsIGlubykpOworCisJZG93bigmYy0+YWxsb2Nfc2VtKTsKKwlpZiAoIWpmZnMyX3didWZfcGVuZGluZ19mb3JfaW5vKGMsIGlubykpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIklubyAjJWQgbm90IHBlbmRpbmcgaW4gd2J1Zi4gUmV0dXJuaW5nXG4iLCBpbm8pKTsKKwkJdXAoJmMtPmFsbG9jX3NlbSk7CisJCXJldHVybiAwOworCX0KKworCW9sZF93YnVmX29mcyA9IGMtPndidWZfb2ZzOworCW9sZF93YnVmX2xlbiA9IGMtPndidWZfbGVuOworCisJaWYgKGMtPnVuY2hlY2tlZF9zaXplKSB7CisJCS8qIEdDIHdvbid0IG1ha2UgYW55IHByb2dyZXNzIGZvciBhIHdoaWxlICovCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9mbHVzaF93YnVmX2djKCkgcGFkZGluZy4gTm90IGZpbmlzaGVkIGNoZWNraW5nXG4iKSk7CisJCWRvd25fd3JpdGUoJmMtPndidWZfc2VtKTsKKwkJcmV0ID0gX19qZmZzMl9mbHVzaF93YnVmKGMsIFBBRF9BQ0NPVU5USU5HKTsKKwkJdXBfd3JpdGUoJmMtPndidWZfc2VtKTsKKwl9IGVsc2Ugd2hpbGUgKG9sZF93YnVmX2xlbiAmJgorCQkgICAgICBvbGRfd2J1Zl9vZnMgPT0gYy0+d2J1Zl9vZnMpIHsKKworCQl1cCgmYy0+YWxsb2Nfc2VtKTsKKworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZmx1c2hfd2J1Zl9nYygpIGNhbGxzIGdjIHBhc3NcbiIpKTsKKworCQlyZXQgPSBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcyhjKTsKKwkJaWYgKHJldCkgeworCQkJLyogR0MgZmFpbGVkLiBGbHVzaCBpdCB3aXRoIHBhZGRpbmcgaW5zdGVhZCAqLworCQkJZG93bigmYy0+YWxsb2Nfc2VtKTsKKwkJCWRvd25fd3JpdGUoJmMtPndidWZfc2VtKTsKKwkJCXJldCA9IF9famZmczJfZmx1c2hfd2J1ZihjLCBQQURfQUNDT1VOVElORyk7CisJCQl1cF93cml0ZSgmYy0+d2J1Zl9zZW0pOworCQkJYnJlYWs7CisJCX0KKwkJZG93bigmYy0+YWxsb2Nfc2VtKTsKKwl9CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZmx1c2hfd2J1Zl9nYygpIGVuZHMuLi5cbiIpKTsKKworCXVwKCZjLT5hbGxvY19zZW0pOworCXJldHVybiByZXQ7Cit9CisKKy8qIFBhZCB3cml0ZS1idWZmZXIgdG8gZW5kIGFuZCB3cml0ZSBpdCwgd2FzdGluZyBzcGFjZS4gKi8KK2ludCBqZmZzMl9mbHVzaF93YnVmX3BhZChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlpbnQgcmV0OworCisJZG93bl93cml0ZSgmYy0+d2J1Zl9zZW0pOworCXJldCA9IF9famZmczJfZmx1c2hfd2J1ZihjLCBQQURfTk9BQ0NPVU5UKTsKKwl1cF93cml0ZSgmYy0+d2J1Zl9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBQQUdFX0RJVih4KSAoICh4KSAmICh+KGMtPndidWZfcGFnZXNpemUgLSAxKSkgKQorI2RlZmluZSBQQUdFX01PRCh4KSAoICh4KSAmIChjLT53YnVmX3BhZ2VzaXplIC0gMSkgKQoraW50IGpmZnMyX2ZsYXNoX3dyaXRldihzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgY29uc3Qgc3RydWN0IGt2ZWMgKmludmVjcywgdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90IHRvLCBzaXplX3QgKnJldGxlbiwgdWludDMyX3QgaW5vKQoreworCXN0cnVjdCBrdmVjIG91dHZlY3NbM107CisJdWludDMyX3QgdG90bGVuID0gMDsKKwl1aW50MzJfdCBzcGxpdF9vZnMgPSAwOworCXVpbnQzMl90IG9sZF90b3RsZW47CisJaW50IHJldCwgc3BsaXR2ZWMgPSAtMTsKKwlpbnQgaW52ZWMsIG91dHZlYzsKKwlzaXplX3Qgd2J1Zl9yZXRsZW47CisJdW5zaWduZWQgY2hhciAqd2J1Zl9wdHI7CisJc2l6ZV90IGRvbmVsZW4gPSAwOworCXVpbnQzMl90IG91dHZlY190byA9IHRvOworCisJLyogSWYgbm90IE5BTkQgZmxhc2gsIGRvbid0IGJvdGhlciAqLworCWlmICghYy0+d2J1ZikKKwkJcmV0dXJuIGpmZnMyX2ZsYXNoX2RpcmVjdF93cml0ZXYoYywgaW52ZWNzLCBjb3VudCwgdG8sIHJldGxlbik7CisJCisJZG93bl93cml0ZSgmYy0+d2J1Zl9zZW0pOworCisJLyogSWYgd2J1Zl9vZnMgaXMgbm90IGluaXRpYWxpemVkLCBzZXQgaXQgdG8gdGFyZ2V0IGFkZHJlc3MgKi8KKwlpZiAoYy0+d2J1Zl9vZnMgPT0gMHhGRkZGRkZGRikgeworCQljLT53YnVmX29mcyA9IFBBR0VfRElWKHRvKTsKKwkJYy0+d2J1Zl9sZW4gPSBQQUdFX01PRCh0byk7CQkJCisJCW1lbXNldChjLT53YnVmLDB4ZmYsYy0+d2J1Zl9wYWdlc2l6ZSk7CisJfQorCisJLyogRml4dXAgdGhlIHdidWYgaWYgd2UgYXJlIG1vdmluZyB0byBhIG5ldyBlcmFzZWJsb2NrLiAgVGhlIGNoZWNrcyBiZWxvdworCSAgIGZhaWwgZm9yIEVDQydkIE5PUiBiZWNhdXNlIGNsZWFubWFya2VyID09IDE2LCBzbyBhIGJsb2NrIHN0YXJ0cyBhdAorCSAgIHh4eDAwMTAuICAqLworCWlmIChqZmZzMl9ub3JfZWNjKGMpKSB7CisJCWlmICgoKGMtPndidWZfb2ZzICUgYy0+c2VjdG9yX3NpemUpID09IDApICYmICFjLT53YnVmX2xlbikgeworCQkJYy0+d2J1Zl9vZnMgPSBQQUdFX0RJVih0byk7CisJCQljLT53YnVmX2xlbiA9IFBBR0VfTU9EKHRvKTsKKwkJCW1lbXNldChjLT53YnVmLDB4ZmYsYy0+d2J1Zl9wYWdlc2l6ZSk7CisJCX0KKwl9CisJCisJLyogU2FuaXR5IGNoZWNrcyBvbiB0YXJnZXQgYWRkcmVzcy4gCisJICAgSXQncyBwZXJtaXR0ZWQgdG8gd3JpdGUgYXQgUEFEKGMtPndidWZfbGVuK2MtPndidWZfb2ZzKSwgCisJICAgYW5kIGl0J3MgcGVybWl0dGVkIHRvIHdyaXRlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgCisJICAgZXJhc2UgYmxvY2suIEFueXRoaW5nIGVsc2UsIGFuZCB5b3UgZGllLgorCSAgIE5ldyBibG9jayBzdGFydHMgYXQgeHh4MDAwYyAoMC1iID0gYmxvY2sgaGVhZGVyKQorCSovCisJaWYgKCAodG8gJiB+KGMtPnNlY3Rvcl9zaXplLTEpKSAhPSAoYy0+d2J1Zl9vZnMgJiB+KGMtPnNlY3Rvcl9zaXplLTEpKSApIHsKKwkJLyogSXQncyBhIHdyaXRlIHRvIGEgbmV3IGJsb2NrICovCisJCWlmIChjLT53YnVmX2xlbikgeworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2ZsYXNoX3dyaXRldigpIHRvIDB4JWx4IGNhdXNlcyBmbHVzaCBvZiB3YnVmIGF0IDB4JTA4eFxuIiwgKHVuc2lnbmVkIGxvbmcpdG8sIGMtPndidWZfb2ZzKSk7CisJCQlyZXQgPSBfX2pmZnMyX2ZsdXNoX3didWYoYywgUEFEX05PQUNDT1VOVCk7CisJCQlpZiAocmV0KSB7CisJCQkJLyogdGhlIHVuZGVybHlpbmcgbGF5ZXIgaGFzIHRvIGNoZWNrIHdidWZfbGVuIHRvIGRvIHRoZSBjbGVhbnVwICovCisJCQkJRDEocHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfZmx1c2hfd2J1ZigpIGNhbGxlZCBmcm9tIGpmZnMyX2ZsYXNoX3dyaXRldigpIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJCQkJKnJldGxlbiA9IDA7CisJCQkJZ290byBleGl0OworCQkJfQorCQl9CisJCS8qIHNldCBwb2ludGVyIHRvIG5ldyBibG9jayAqLworCQljLT53YnVmX29mcyA9IFBBR0VfRElWKHRvKTsKKwkJYy0+d2J1Zl9sZW4gPSBQQUdFX01PRCh0byk7CQkJCisJfSAKKworCWlmICh0byAhPSBQQUQoYy0+d2J1Zl9vZnMgKyBjLT53YnVmX2xlbikpIHsKKwkJLyogV2UncmUgbm90IHdyaXRpbmcgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHdyaXRlYnVmZmVyLiBCYWQuICovCisJCXByaW50ayhLRVJOX0NSSVQgImpmZnMyX2ZsYXNoX3dyaXRldigpOiBOb24tY29udGlndW91cyB3cml0ZSB0byAlMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpdG8pOworCQlpZiAoYy0+d2J1Zl9sZW4pCisJCQlwcmludGsoS0VSTl9DUklUICJ3YnVmIHdhcyBwcmV2aW91c2x5ICUwOHgtJTA4eFxuIiwKKwkJCQkJICBjLT53YnVmX29mcywgYy0+d2J1Zl9vZnMrYy0+d2J1Zl9sZW4pOworCQlCVUcoKTsKKwl9CisKKwkvKiBOb3RlIG91dHZlY3NbM10gYWJvdmUuIFdlIGtub3cgY291bnQgaXMgbmV2ZXIgZ3JlYXRlciB0aGFuIDIgKi8KKwlpZiAoY291bnQgPiAyKSB7CisJCXByaW50ayhLRVJOX0NSSVQgImpmZnMyX2ZsYXNoX3dyaXRldigpOiBjb3VudCBpcyAlbGRcbiIsIGNvdW50KTsKKwkJQlVHKCk7CisJfQorCisJaW52ZWMgPSAwOworCW91dHZlYyA9IDA7CisKKwkvKiBGaWxsIHdyaXRlYnVmZmVyIGZpcnN0LCBpZiBhbHJlYWR5IGluIHVzZSAqLwkKKwlpZiAoYy0+d2J1Zl9sZW4pIHsKKwkJdWludDMyX3QgaW52ZWNfb2ZzID0gMDsKKworCQkvKiBhZGp1c3QgYWxpZ25tZW50IG9mZnNldCAqLyAKKwkJaWYgKGMtPndidWZfbGVuICE9IFBBR0VfTU9EKHRvKSkgeworCQkJYy0+d2J1Zl9sZW4gPSBQQUdFX01PRCh0byk7CisJCQkvKiB0YWtlIGNhcmUgb2YgYWxpZ25tZW50IHRvIG5leHQgcGFnZSAqLworCQkJaWYgKCFjLT53YnVmX2xlbikKKwkJCQljLT53YnVmX2xlbiA9IGMtPndidWZfcGFnZXNpemU7CisJCX0KKwkJCisJCXdoaWxlKGMtPndidWZfbGVuIDwgYy0+d2J1Zl9wYWdlc2l6ZSkgeworCQkJdWludDMyX3QgdGhpc2xlbjsKKwkJCQorCQkJaWYgKGludmVjID09IGNvdW50KQorCQkJCWdvdG8gYWxsZG9uZTsKKworCQkJdGhpc2xlbiA9IGMtPndidWZfcGFnZXNpemUgLSBjLT53YnVmX2xlbjsKKworCQkJaWYgKHRoaXNsZW4gPj0gaW52ZWNzW2ludmVjXS5pb3ZfbGVuKQorCQkJCXRoaXNsZW4gPSBpbnZlY3NbaW52ZWNdLmlvdl9sZW47CisJCisJCQlpbnZlY19vZnMgPSB0aGlzbGVuOworCisJCQltZW1jcHkoYy0+d2J1ZiArIGMtPndidWZfbGVuLCBpbnZlY3NbaW52ZWNdLmlvdl9iYXNlLCB0aGlzbGVuKTsKKwkJCWMtPndidWZfbGVuICs9IHRoaXNsZW47CisJCQlkb25lbGVuICs9IHRoaXNsZW47CisJCQkvKiBHZXQgbmV4dCBpbnZlYywgaWYgYWN0dWFsIGRpZCBub3QgZmlsbCB0aGUgYnVmZmVyICovCisJCQlpZiAoYy0+d2J1Zl9sZW4gPCBjLT53YnVmX3BhZ2VzaXplKSAKKwkJCQlpbnZlYysrOworCQl9CQkJCisJCQorCQkvKiB3cml0ZSBidWZmZXIgaXMgZnVsbCwgZmx1c2ggYnVmZmVyICovCisJCXJldCA9IF9famZmczJfZmx1c2hfd2J1ZihjLCBOT1BBRCk7CisJCWlmIChyZXQpIHsKKwkJCS8qIHRoZSB1bmRlcmx5aW5nIGxheWVyIGhhcyB0byBjaGVjayB3YnVmX2xlbiB0byBkbyB0aGUgY2xlYW51cCAqLworCQkJRDEocHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfZmx1c2hfd2J1ZigpIGNhbGxlZCBmcm9tIGpmZnMyX2ZsYXNoX3dyaXRldigpIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJCQkvKiBSZXRsZW4gemVybyB0byBtYWtlIHN1cmUgb3VyIGNhbGxlciBkb2Vzbid0IG1hcmsgdGhlIHNwYWNlIGRpcnR5LgorCQkJICAgV2UndmUgYWxyZWFkeSBkb25lIGV2ZXJ5dGhpbmcgdGhhdCdzIG5lY2Vzc2FyeSAqLworCQkJKnJldGxlbiA9IDA7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJb3V0dmVjX3RvICs9IGRvbmVsZW47CisJCWMtPndidWZfb2ZzID0gb3V0dmVjX3RvOworCisJCS8qIEFsbCBpbnZlY3MgZG9uZSA/ICovCisJCWlmIChpbnZlYyA9PSBjb3VudCkKKwkJCWdvdG8gYWxsZG9uZTsKKworCQkvKiBTZXQgdXAgdGhlIGZpcnN0IG91dHZlYywgY29udGFpbmluZyB0aGUgcmVtYWluZGVyIG9mIHRoZQorCQkgICBpbnZlYyB3ZSBwYXJ0aWFsbHkgdXNlZCAqLworCQlpZiAoaW52ZWNzW2ludmVjXS5pb3ZfbGVuID4gaW52ZWNfb2ZzKSB7CisJCQlvdXR2ZWNzWzBdLmlvdl9iYXNlID0gaW52ZWNzW2ludmVjXS5pb3ZfYmFzZStpbnZlY19vZnM7CisJCQl0b3RsZW4gPSBvdXR2ZWNzWzBdLmlvdl9sZW4gPSBpbnZlY3NbaW52ZWNdLmlvdl9sZW4taW52ZWNfb2ZzOworCQkJaWYgKHRvdGxlbiA+IGMtPndidWZfcGFnZXNpemUpIHsKKwkJCQlzcGxpdHZlYyA9IG91dHZlYzsKKwkJCQlzcGxpdF9vZnMgPSBvdXR2ZWNzWzBdLmlvdl9sZW4gLSBQQUdFX01PRCh0b3RsZW4pOworCQkJfQorCQkJb3V0dmVjKys7CisJCX0KKwkJaW52ZWMrKzsKKwl9CisKKwkvKiBPSywgbm93IHdlJ3ZlIGZsdXNoZWQgdGhlIHdidWYgYW5kIHRoZSBzdGFydCBvZiB0aGUgYml0cworCSAgIHdlIGhhdmUgYmVlbiBhc2tlZCB0byB3cml0ZSwgbm93IHRvIHdyaXRlIHRoZSByZXN0Li4uLiAqLworCisJLyogdG90bGVuIGhvbGRzIHRoZSBhbW91bnQgb2YgZGF0YSBzdGlsbCB0byBiZSB3cml0dGVuICovCisJb2xkX3RvdGxlbiA9IHRvdGxlbjsKKwlmb3IgKCA7IGludmVjIDwgY291bnQ7IGludmVjKyssb3V0dmVjKysgKSB7CisJCW91dHZlY3Nbb3V0dmVjXS5pb3ZfYmFzZSA9IGludmVjc1tpbnZlY10uaW92X2Jhc2U7CisJCXRvdGxlbiArPSBvdXR2ZWNzW291dHZlY10uaW92X2xlbiA9IGludmVjc1tpbnZlY10uaW92X2xlbjsKKwkJaWYgKFBBR0VfRElWKHRvdGxlbikgIT0gUEFHRV9ESVYob2xkX3RvdGxlbikpIHsKKwkJCXNwbGl0dmVjID0gb3V0dmVjOworCQkJc3BsaXRfb2ZzID0gb3V0dmVjc1tvdXR2ZWNdLmlvdl9sZW4gLSBQQUdFX01PRCh0b3RsZW4pOworCQkJb2xkX3RvdGxlbiA9IHRvdGxlbjsKKwkJfQorCX0KKworCS8qIE5vdyB0aGUgb3V0dmVjcyBhcnJheSBob2xkcyBhbGwgdGhlIHJlbWFpbmluZyBkYXRhIHRvIHdyaXRlICovCisJLyogVXAgdG8gc3BsaXR2ZWMsc3BsaXRfb2ZzIGlzIHRvIGJlIHdyaXR0ZW4gaW1tZWRpYXRlbHkuIFRoZSByZXN0CisJICAgZ29lcyBpbnRvIHRoZSAobm93LWVtcHR5KSB3YnVmICovCisKKwlpZiAoc3BsaXR2ZWMgIT0gLTEpIHsKKwkJdWludDMyX3QgcmVtYWluZGVyOworCisJCXJlbWFpbmRlciA9IG91dHZlY3Nbc3BsaXR2ZWNdLmlvdl9sZW4gLSBzcGxpdF9vZnM7CisJCW91dHZlY3Nbc3BsaXR2ZWNdLmlvdl9sZW4gPSBzcGxpdF9vZnM7CisKKwkJLyogV2UgZGlkIGNyb3NzIGEgcGFnZSBib3VuZGFyeSwgc28gd2Ugd3JpdGUgc29tZSBub3cgKi8KKwkJaWYgKGpmZnMyX2NsZWFubWFya2VyX29vYihjKSkKKwkJCXJldCA9IGMtPm10ZC0+d3JpdGV2X2VjYyhjLT5tdGQsIG91dHZlY3MsIHNwbGl0dmVjKzEsIG91dHZlY190bywgJndidWZfcmV0bGVuLCBOVUxMLCBjLT5vb2JpbmZvKTsgCisJCWVsc2UKKwkJCXJldCA9IGpmZnMyX2ZsYXNoX2RpcmVjdF93cml0ZXYoYywgb3V0dmVjcywgc3BsaXR2ZWMrMSwgb3V0dmVjX3RvLCAmd2J1Zl9yZXRsZW4pOworCQkKKwkJaWYgKHJldCA8IDAgfHwgd2J1Zl9yZXRsZW4gIT0gUEFHRV9ESVYodG90bGVuKSkgeworCQkJLyogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIG5vIHByb2JsZW0sCisJCQkgICBjLT53YnVmIGlzIGVtcHR5LiAKKwkJCSovCisJCQkqcmV0bGVuID0gZG9uZWxlbjsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQkKKwkJZG9uZWxlbiArPSB3YnVmX3JldGxlbjsKKwkJYy0+d2J1Zl9vZnMgPSBQQUdFX0RJVihvdXR2ZWNfdG8pICsgUEFHRV9ESVYodG90bGVuKTsKKworCQlpZiAocmVtYWluZGVyKSB7CisJCQlvdXR2ZWNzW3NwbGl0dmVjXS5pb3ZfYmFzZSArPSBzcGxpdF9vZnM7CisJCQlvdXR2ZWNzW3NwbGl0dmVjXS5pb3ZfbGVuID0gcmVtYWluZGVyOworCQl9IGVsc2UgeworCQkJc3BsaXR2ZWMrKzsKKwkJfQorCisJfSBlbHNlIHsKKwkJc3BsaXR2ZWMgPSAwOworCX0KKworCS8qIE5vdyBzcGxpdHZlYyBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBiaXRzIHdlIGhhdmUgdG8gY29weQorCSAgIGludG8gdGhlIHdidWYgKi8KKwl3YnVmX3B0ciA9IGMtPndidWY7CisKKwlmb3IgKCA7IHNwbGl0dmVjIDwgb3V0dmVjOyBzcGxpdHZlYysrKSB7CisJCS8qIERvbid0IGNvcHkgdGhlIHdidWYgaW50byBpdHNlbGYgKi8KKwkJaWYgKG91dHZlY3Nbc3BsaXR2ZWNdLmlvdl9iYXNlID09IGMtPndidWYpCisJCQljb250aW51ZTsKKwkJbWVtY3B5KHdidWZfcHRyLCBvdXR2ZWNzW3NwbGl0dmVjXS5pb3ZfYmFzZSwgb3V0dmVjc1tzcGxpdHZlY10uaW92X2xlbik7CisJCXdidWZfcHRyICs9IG91dHZlY3Nbc3BsaXR2ZWNdLmlvdl9sZW47CisJCWRvbmVsZW4gKz0gb3V0dmVjc1tzcGxpdHZlY10uaW92X2xlbjsKKwl9CisJYy0+d2J1Zl9sZW4gPSB3YnVmX3B0ciAtIGMtPndidWY7CisKKwkvKiBJZiB0aGVyZSdzIGEgcmVtYWluZGVyIGluIHRoZSB3YnVmIGFuZCBpdCdzIGEgbm9uLUdDIHdyaXRlLAorCSAgIHJlbWVtYmVyIHRoYXQgdGhlIHdidWYgYWZmZWN0cyB0aGlzIGlubyAqLworYWxsZG9uZToKKwkqcmV0bGVuID0gZG9uZWxlbjsKKworCWlmIChjLT53YnVmX2xlbiAmJiBpbm8pCisJCWpmZnMyX3didWZfZGlydGllc19pbm9kZShjLCBpbm8pOworCisJcmV0ID0gMDsKKwkKK2V4aXQ6CisJdXBfd3JpdGUoJmMtPndidWZfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICoJVGhpcyBpcyB0aGUgZW50cnkgZm9yIGZsYXNoIHdyaXRlLgorICoJQ2hlY2ssIGlmIHdlIHdvcmsgb24gTkFORCBGTEFTSCwgaWYgc28gYnVpbGQgYW4ga3ZlYyBhbmQgd3JpdGUgaXQgdmlhIHZyaXRldgorKi8KK2ludCBqZmZzMl9mbGFzaF93cml0ZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgbG9mZl90IG9mcywgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmKQoreworCXN0cnVjdCBrdmVjIHZlY3NbMV07CisKKwlpZiAoamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykpCisJCXJldHVybiBjLT5tdGQtPndyaXRlKGMtPm10ZCwgb2ZzLCBsZW4sIHJldGxlbiwgYnVmKTsKKworCXZlY3NbMF0uaW92X2Jhc2UgPSAodW5zaWduZWQgY2hhciAqKSBidWY7CisJdmVjc1swXS5pb3ZfbGVuID0gbGVuOworCXJldHVybiBqZmZzMl9mbGFzaF93cml0ZXYoYywgdmVjcywgMSwgb2ZzLCByZXRsZW4sIDApOworfQorCisvKgorCUhhbmRsZSByZWFkYmFjayBmcm9tIHdyaXRlYnVmZmVyIGFuZCBFQ0MgZmFpbHVyZSByZXR1cm4KKyovCitpbnQgamZmczJfZmxhc2hfcmVhZChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgbG9mZl90IG9mcywgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKQoreworCWxvZmZfdAlvcmJmID0gMCwgb3diZiA9IDAsIGx3YmYgPSAwOworCWludAlyZXQ7CisKKwkvKiBSZWFkIGZsYXNoICovCisJaWYgKCFqZmZzMl9jYW5fbWFya19vYnNvbGV0ZShjKSkgeworCQlkb3duX3JlYWQoJmMtPndidWZfc2VtKTsKKworCQlpZiAoamZmczJfY2xlYW5tYXJrZXJfb29iKGMpKQorCQkJcmV0ID0gYy0+bXRkLT5yZWFkX2VjYyhjLT5tdGQsIG9mcywgbGVuLCByZXRsZW4sIGJ1ZiwgTlVMTCwgYy0+b29iaW5mbyk7CisJCWVsc2UKKwkJCXJldCA9IGMtPm10ZC0+cmVhZChjLT5tdGQsIG9mcywgbGVuLCByZXRsZW4sIGJ1Zik7CisKKwkJaWYgKCAocmV0ID09IC1FQkFETVNHKSAmJiAoKnJldGxlbiA9PSBsZW4pICkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRkLT5yZWFkKDB4JXp4IGJ5dGVzIGZyb20gMHglbGx4KSByZXR1cm5lZCBFQ0MgZXJyb3JcbiIsCisJCQkgICAgICAgbGVuLCBvZnMpOworCQkJLyogCisJCQkgKiBXZSBoYXZlIHRoZSByYXcgZGF0YSB3aXRob3V0IEVDQyBjb3JyZWN0aW9uIGluIHRoZSBidWZmZXIsIG1heWJlIAorCQkJICogd2UgYXJlIGx1Y2t5IGFuZCBhbGwgZGF0YSBvciBwYXJ0cyBhcmUgY29ycmVjdC4gV2UgY2hlY2sgdGhlIG5vZGUuCisJCQkgKiBJZiBkYXRhIGFyZSBjb3JydXB0ZWQgbm9kZSBjaGVjayB3aWxsIHNvcnQgaXQgb3V0LgorCQkJICogV2Uga2VlcCB0aGlzIGJsb2NrLCBpdCB3aWxsIGZhaWwgb24gd3JpdGUgb3IgZXJhc2UgYW5kIHRoZSB3ZQorCQkJICogbWFyayBpdCBiYWQuIE9yIHNob3VsZCB3ZSBkbyB0aGF0IG5vdz8gQnV0IHdlIHNob3VsZCBnaXZlIGhpbSBhIGNoYW5jZS4KKwkJCSAqIE1heWJlIHdlIGhhZCBhIHN5c3RlbSBjcmFzaCBvciBwb3dlciBsb3NzIGJlZm9yZSB0aGUgZWNjIHdyaXRlIG9yICAKKwkJCSAqIGEgZXJhc2Ugd2FzIGNvbXBsZXRlZC4KKwkJCSAqIFNvIHdlIHJldHVybiBzdWNjZXNzLiA6KQorCQkJICovCisJCSAJcmV0ID0gMDsKKwkJIH0JCisJfSBlbHNlCisJCXJldHVybiBjLT5tdGQtPnJlYWQoYy0+bXRkLCBvZnMsIGxlbiwgcmV0bGVuLCBidWYpOworCisJLyogaWYgbm8gd3JpdGVidWZmZXIgYXZhaWxhYmxlIG9yIHdyaXRlIGJ1ZmZlciBlbXB0eSwgcmV0dXJuICovCisJaWYgKCFjLT53YnVmX3BhZ2VzaXplIHx8ICFjLT53YnVmX2xlbikKKwkJZ290byBleGl0OworCisJLyogaWYgd2UgcmVhZCBpbiBhIGRpZmZlcmVudCBibG9jaywgcmV0dXJuICovCisJaWYgKCAob2ZzICYgfihjLT5zZWN0b3Jfc2l6ZS0xKSkgIT0gKGMtPndidWZfb2ZzICYgfihjLT5zZWN0b3Jfc2l6ZS0xKSkgKSAKKwkJZ290byBleGl0OworCisJaWYgKG9mcyA+PSBjLT53YnVmX29mcykgeworCQlvd2JmID0gKG9mcyAtIGMtPndidWZfb2ZzKTsJLyogb2Zmc2V0IGluIHdyaXRlIGJ1ZmZlciAqLworCQlpZiAob3diZiA+IGMtPndidWZfbGVuKQkJLyogaXMgcmVhZCBiZXlvbmQgd3JpdGUgYnVmZmVyID8gKi8KKwkJCWdvdG8gZXhpdDsKKwkJbHdiZiA9IGMtPndidWZfbGVuIC0gb3diZjsJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgKi8KKwkJaWYgKGx3YmYgPiBsZW4pCQorCQkJbHdiZiA9IGxlbjsKKwl9IGVsc2UgewkKKwkJb3JiZiA9IChjLT53YnVmX29mcyAtIG9mcyk7CS8qIG9mZnNldCBpbiByZWFkIGJ1ZmZlciAqLworCQlpZiAob3JiZiA+IGxlbikJCQkvKiBpcyB3cml0ZSBiZXlvbmQgd3JpdGUgYnVmZmVyID8gKi8KKwkJCWdvdG8gZXhpdDsKKwkJbHdiZiA9IGxlbiAtIG9yYmY7IAkJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgKi8KKwkJaWYgKGx3YmYgPiBjLT53YnVmX2xlbikJCisJCQlsd2JmID0gYy0+d2J1Zl9sZW47CisJfQkKKwlpZiAobHdiZiA+IDApCisJCW1lbWNweShidWYrb3JiZixjLT53YnVmK293YmYsbHdiZik7CisKK2V4aXQ6CisJdXBfcmVhZCgmYy0+d2J1Zl9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKglDaGVjaywgaWYgdGhlIG91dCBvZiBiYW5kIGFyZWEgaXMgZW1wdHkKKyAqLworaW50IGpmZnMyX2NoZWNrX29vYl9lbXB0eSggc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIsIGludCBtb2RlKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpbnQgCXJldCA9IDA7CisJaW50CWksbGVuLHBhZ2U7CisJc2l6ZV90ICByZXRsZW47CisJaW50CW9vYl9zaXplOworCisJLyogYWxsb2NhdGUgYSBidWZmZXIgZm9yIGFsbCBvb2IgZGF0YSBpbiB0aGlzIHNlY3RvciAqLworCW9vYl9zaXplID0gYy0+bXRkLT5vb2JzaXplOworCWxlbiA9IDQgKiBvb2Jfc2l6ZTsKKwlidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMl9jaGVja19vb2JfZW1wdHkoKTogYWxsb2NhdGlvbiBvZiB0ZW1wb3JhcnkgZGF0YSBidWZmZXIgZm9yIG9vYiBjaGVjayBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogCisJICogaWYgbW9kZSA9IDAsIHdlIHNjYW4gZm9yIGEgdG90YWwgZW1wdHkgb29iIGFyZWEsIGVsc2Ugd2UgaGF2ZQorCSAqIHRvIHRha2UgY2FyZSBvZiB0aGUgY2xlYW5tYXJrZXIgaW4gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGJsb2NrCisJKi8KKwlyZXQgPSBqZmZzMl9mbGFzaF9yZWFkX29vYihjLCBqZWItPm9mZnNldCwgbGVuICwgJnJldGxlbiwgYnVmKTsKKwlpZiAocmV0KSB7CisJCUQxKHByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX2NoZWNrX29vYl9lbXB0eSgpOiBSZWFkIE9PQiBmYWlsZWQgJWQgZm9yIGJsb2NrIGF0ICUwOHhcbiIsIHJldCwgamViLT5vZmZzZXQpKTsKKwkJZ290byBvdXQ7CisJfQorCQorCWlmIChyZXRsZW4gPCBsZW4pIHsKKwkJRDEocHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfY2hlY2tfb29iX2VtcHR5KCk6IFJlYWQgT09CIHJldHVybiBzaG9ydCByZWFkICIKKwkJCSAgIiglemQgYnl0ZXMgbm90ICVkKSBmb3IgYmxvY2sgYXQgJTA4eFxuIiwgcmV0bGVuLCBsZW4sIGplYi0+b2Zmc2V0KSk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKwkKKwkvKiBTcGVjaWFsIGNoZWNrIGZvciBmaXJzdCBwYWdlICovCisJZm9yKGkgPSAwOyBpIDwgb29iX3NpemUgOyBpKyspIHsKKwkJLyogWWVhaCwgd2Uga25vdyBhYm91dCB0aGUgY2xlYW5tYXJrZXIuICovCisJCWlmIChtb2RlICYmIGkgPj0gYy0+ZnNkYXRhX3BvcyAmJiAKKwkJICAgIGkgPCBjLT5mc2RhdGFfcG9zICsgYy0+ZnNkYXRhX2xlbikKKwkJCWNvbnRpbnVlOworCisJCWlmIChidWZbaV0gIT0gMHhGRikgeworCQkJRDIocHJpbnRrKEtFUk5fREVCVUcgIkZvdW5kICUwMnggYXQgJXggaW4gT09CIGZvciAlMDh4XG4iLAorCQkJCSAgYnVmW3BhZ2UraV0sIHBhZ2UraSwgamViLT5vZmZzZXQpKTsKKwkJCXJldCA9IDE7IAorCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiB3ZSBrbm93LCB3ZSBhcmUgYWxpZ25lZCA6KSAqLwkKKwlmb3IgKHBhZ2UgPSBvb2Jfc2l6ZTsgcGFnZSA8IGxlbjsgcGFnZSArPSBzaXplb2YobG9uZykpIHsKKwkJdW5zaWduZWQgbG9uZyBkYXQgPSAqKHVuc2lnbmVkIGxvbmcgKikoJmJ1ZltwYWdlXSk7CisJCWlmKGRhdCAhPSAtMSkgeworCQkJcmV0ID0gMTsgCisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworb3V0OgorCWtmcmVlKGJ1Zik7CQorCQorCXJldHVybiByZXQ7Cit9CisKKy8qCisqCVNjYW4gZm9yIGEgdmFsaWQgY2xlYW5tYXJrZXIgYW5kIGZvciBiYWQgYmxvY2tzCisqCUZvciB2aXJ0dWFsIGJsb2NrcyAoY29uY2F0ZW5hdGVkIHBoeXNpY2FsIGJsb2NrcykgY2hlY2sgdGhlIGNsZWFubWFya2VyCisqCW9ubHkgaW4gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGZpcnN0IHBoeXNpY2FsIGJsb2NrLCBidXQgc2NhbiBmb3IgYmFkIGJsb2NrcyBpbiBhbGwKKyoJcGh5c2ljYWwgYmxvY2tzCisqLworaW50IGpmZnMyX2NoZWNrX25hbmRfY2xlYW5tYXJrZXIgKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViKQoreworCXN0cnVjdCBqZmZzMl91bmtub3duX25vZGUgbjsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyICogTkFORF9NQVhfT09CU0laRV07CisJdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgcmV0LCBpLCBjbnQsIHJldHZhbCA9IDA7CisJc2l6ZV90IHJldGxlbiwgb2Zmc2V0OworCWludCBvb2Jfc2l6ZTsKKworCW9mZnNldCA9IGplYi0+b2Zmc2V0OworCW9vYl9zaXplID0gYy0+bXRkLT5vb2JzaXplOworCisJLyogTG9vcCB0aHJvdWdoIHRoZSBwaHlzaWNhbCBibG9ja3MgKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IChjLT5zZWN0b3Jfc2l6ZSAvIGMtPm10ZC0+ZXJhc2VzaXplKTsgY250KyspIHsKKwkJLyogQ2hlY2sgZmlyc3QgaWYgdGhlIGJsb2NrIGlzIGJhZC4gKi8KKwkJaWYgKGMtPm10ZC0+YmxvY2tfaXNiYWQgKGMtPm10ZCwgb2Zmc2V0KSkgeworCQkJRDEgKHByaW50ayAoS0VSTl9XQVJOSU5HICJqZmZzMl9jaGVja19uYW5kX2NsZWFubWFya2VyKCk6IEJhZCBibG9jayBhdCAlMDh4XG4iLCBqZWItPm9mZnNldCkpOworCQkJcmV0dXJuIDI7CisJCX0KKwkJLyoKKwkJICAgKiAgICBXZSByZWFkIG9vYiBkYXRhIGZyb20gcGFnZSAwIGFuZCAxIG9mIHRoZSBibG9jay4KKwkJICAgKiAgICBwYWdlIDAgY29udGFpbnMgY2xlYW5tYXJrZXIgYW5kIGJhZGJsb2NrIGluZm8KKwkJICAgKiAgICBwYWdlIDEgY29udGFpbnMgZmFpbHVyZSBjb3VudCBvZiB0aGlzIGJsb2NrCisJCSAqLworCQlyZXQgPSBjLT5tdGQtPnJlYWRfb29iIChjLT5tdGQsIG9mZnNldCwgb29iX3NpemUgPDwgMSwgJnJldGxlbiwgYnVmKTsKKworCQlpZiAocmV0KSB7CisJCQlEMSAocHJpbnRrIChLRVJOX1dBUk5JTkcgImpmZnMyX2NoZWNrX25hbmRfY2xlYW5tYXJrZXIoKTogUmVhZCBPT0IgZmFpbGVkICVkIGZvciBibG9jayBhdCAlMDh4XG4iLCByZXQsIGplYi0+b2Zmc2V0KSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWlmIChyZXRsZW4gPCAob29iX3NpemUgPDwgMSkpIHsKKwkJCUQxIChwcmludGsgKEtFUk5fV0FSTklORyAiamZmczJfY2hlY2tfbmFuZF9jbGVhbm1hcmtlcigpOiBSZWFkIE9PQiByZXR1cm4gc2hvcnQgcmVhZCAoJXpkIGJ5dGVzIG5vdCAlZCkgZm9yIGJsb2NrIGF0ICUwOHhcbiIsIHJldGxlbiwgb29iX3NpemUgPDwgMSwgamViLT5vZmZzZXQpKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJLyogQ2hlY2sgY2xlYW5tYXJrZXIgb25seSBvbiB0aGUgZmlyc3QgcGh5c2ljYWwgYmxvY2sgKi8KKwkJaWYgKCFjbnQpIHsKKwkJCW4ubWFnaWMgPSBjcHVfdG9famUxNiAoSkZGUzJfTUFHSUNfQklUTUFTSyk7CisJCQluLm5vZGV0eXBlID0gY3B1X3RvX2plMTYgKEpGRlMyX05PREVUWVBFX0NMRUFOTUFSS0VSKTsKKwkJCW4udG90bGVuID0gY3B1X3RvX2plMzIgKDgpOworCQkJcCA9ICh1bnNpZ25lZCBjaGFyICopICZuOworCisJCQlmb3IgKGkgPSAwOyBpIDwgYy0+ZnNkYXRhX2xlbjsgaSsrKSB7CisJCQkJaWYgKGJ1ZltjLT5mc2RhdGFfcG9zICsgaV0gIT0gcFtpXSkgeworCQkJCQlyZXR2YWwgPSAxOworCQkJCX0KKwkJCX0KKwkJCUQxKGlmIChyZXR2YWwgPT0gMSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX2NoZWNrX25hbmRfY2xlYW5tYXJrZXIoKTogQ2xlYW5tYXJrZXIgbm9kZSBub3QgZGV0ZWN0ZWQgaW4gYmxvY2sgYXQgJTA4eFxuIiwgamViLT5vZmZzZXQpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk9PQiBhdCAlMDh4IHdhcyAiLCBvZmZzZXQpOworCQkJCWZvciAoaT0wOyBpIDwgb29iX3NpemU7IGkrKykgeworCQkJCQlwcmludGsoIiUwMnggIiwgYnVmW2ldKTsKKwkJCQl9CisJCQkJcHJpbnRrKCJcbiIpOworCQkJfSkKKwkJfQorCQlvZmZzZXQgKz0gYy0+bXRkLT5lcmFzZXNpemU7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBqZmZzMl93cml0ZV9uYW5kX2NsZWFubWFya2VyKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViKQoreworCXN0cnVjdCAJamZmczJfdW5rbm93bl9ub2RlIG47CisJaW50IAlyZXQ7CisJc2l6ZV90IAlyZXRsZW47CisKKwluLm1hZ2ljID0gY3B1X3RvX2plMTYoSkZGUzJfTUFHSUNfQklUTUFTSyk7CisJbi5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0NMRUFOTUFSS0VSKTsKKwluLnRvdGxlbiA9IGNwdV90b19qZTMyKDgpOworCisJcmV0ID0gamZmczJfZmxhc2hfd3JpdGVfb29iKGMsIGplYi0+b2Zmc2V0ICsgYy0+ZnNkYXRhX3BvcywgYy0+ZnNkYXRhX2xlbiwgJnJldGxlbiwgKHVuc2lnbmVkIGNoYXIgKikmbik7CisJCisJaWYgKHJldCkgeworCQlEMShwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl93cml0ZV9uYW5kX2NsZWFubWFya2VyKCk6IFdyaXRlIGZhaWxlZCBmb3IgYmxvY2sgYXQgJTA4eDogZXJyb3IgJWRcbiIsIGplYi0+b2Zmc2V0LCByZXQpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKHJldGxlbiAhPSBjLT5mc2RhdGFfbGVuKSB7CisJCUQxKHByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX3dyaXRlX25hbmRfY2xlYW5tYXJrZXIoKTogU2hvcnQgd3JpdGUgZm9yIGJsb2NrIGF0ICUwOHg6ICV6ZCBub3QgJWRcbiIsIGplYi0+b2Zmc2V0LCByZXRsZW4sIGMtPmZzZGF0YV9sZW4pKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIAorICogT24gTkFORCB3ZSB0cnkgdG8gbWFyayB0aGlzIGJsb2NrIGJhZC4gSWYgdGhlIGJsb2NrIHdhcyBlcmFzZWQgbW9yZQorICogdGhhbiBNQVhfRVJBU0VfRkFJTFVSRVMgd2UgbWFyayBpdCBmaW5hbHkgYmFkLgorICogRG9uJ3QgY2FyZSBhYm91dCBmYWlsdXJlcy4gVGhpcyBibG9jayByZW1haW5zIG9uIHRoZSBlcmFzZS1wZW5kaW5nCisgKiBvciBiYWRibG9jayBsaXN0IGFzIGxvbmcgYXMgbm9ib2R5IG1hbmlwdWxhdGVzIHRoZSBmbGFzaCB3aXRoCisgKiBhIGJvb3Rsb2FkZXIgb3Igc29tZXRoaW5nIGxpa2UgdGhhdC4KKyAqLworCitpbnQgamZmczJfd3JpdGVfbmFuZF9iYWRibG9jayhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwgdWludDMyX3QgYmFkX29mZnNldCkKK3sKKwlpbnQgCXJldDsKKworCS8qIGlmIHRoZSBjb3VudCBpcyA8IG1heCwgd2UgdHJ5IHRvIHdyaXRlIHRoZSBjb3VudGVyIHRvIHRoZSAybmQgcGFnZSBvb2IgYXJlYSAqLworCWlmKCArK2plYi0+YmFkX2NvdW50IDwgTUFYX0VSQVNFX0ZBSUxVUkVTKQorCQlyZXR1cm4gMDsKKworCWlmICghYy0+bXRkLT5ibG9ja19tYXJrYmFkKQorCQlyZXR1cm4gMTsgLy8gV2hhdCBlbHNlIGNhbiB3ZSBkbz8KKworCUQxKHByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX3dyaXRlX25hbmRfYmFkYmxvY2soKTogTWFya2luZyBiYWQgYmxvY2sgYXQgJTA4eFxuIiwgYmFkX29mZnNldCkpOworCXJldCA9IGMtPm10ZC0+YmxvY2tfbWFya2JhZChjLT5tdGQsIGJhZF9vZmZzZXQpOworCQorCWlmIChyZXQpIHsKKwkJRDEocHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfd3JpdGVfbmFuZF9iYWRibG9jaygpOiBXcml0ZSBmYWlsZWQgZm9yIGJsb2NrIGF0ICUwOHg6IGVycm9yICVkXG4iLCBqZWItPm9mZnNldCwgcmV0KSk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAxOworfQorCisjZGVmaW5lIE5BTkRfSkZGUzJfT09CMTZfRlNEQUxFTgk4CisKK3N0YXRpYyBzdHJ1Y3QgbmFuZF9vb2JpbmZvIGpmZnMyX29vYmluZm9fZG9jZWNjID0geworCS51c2VlY2MgPSBNVERfTkFOREVDQ19QTEFDRSwKKwkuZWNjYnl0ZXMgPSA2LAorCS5lY2Nwb3MgPSB7MCwxLDIsMyw0LDV9Cit9OworCisKK3N0YXRpYyBpbnQgamZmczJfbmFuZF9zZXRfb29iaW5mbyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlzdHJ1Y3QgbmFuZF9vb2JpbmZvICpvaW5mbyA9ICZjLT5tdGQtPm9vYmluZm87CisKKwkvKiBEbyB0aGlzIG9ubHksIGlmIHdlIGhhdmUgYW4gb29iIGJ1ZmZlciAqLworCWlmICghYy0+bXRkLT5vb2JzaXplKQorCQlyZXR1cm4gMDsKKwkKKwkvKiBDbGVhbm1hcmtlciBpcyBvdXQtb2YtYmFuZCwgc28gaW5saW5lIHNpemUgemVybyAqLworCWMtPmNsZWFubWFya2VyX3NpemUgPSAwOworCisJLyogU2hvdWxkIHdlIHVzZSBhdXRvcGxhY2VtZW50ID8gKi8KKwlpZiAob2luZm8gJiYgb2luZm8tPnVzZWVjYyA9PSBNVERfTkFOREVDQ19BVVRPUExBQ0UpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkpGRlMyIHVzaW5nIGF1dG9wbGFjZSBvbiBOQU5EXG4iKSk7CisJCS8qIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGZyZWUgYnl0ZXMgKi8KKwkJaWYgKCFvaW5mby0+b29iZnJlZVswXVsxXSkgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgImpmZnMyX25hbmRfc2V0X29vYmluZm8oKTogRWVlcC4gQXV0b3BsYWNlbWVudCBzZWxlY3RlZCBhbmQgbm8gZW1wdHkgc3BhY2UgaW4gb29iXG4iKTsKKwkJCXJldHVybiAtRU5PU1BDOworCQl9CisJCWMtPmZzZGF0YV9wb3MgPSBvaW5mby0+b29iZnJlZVswXVswXTsKKwkJYy0+ZnNkYXRhX2xlbiA9IG9pbmZvLT5vb2JmcmVlWzBdWzFdOworCQlpZiAoYy0+ZnNkYXRhX2xlbiA+IDgpCisJCQljLT5mc2RhdGFfbGVuID0gODsKKwl9IGVsc2UgeworCQkvKiBUaGlzIGlzIGp1c3QgYSBsZWdhY3kgZmFsbGJhY2sgYW5kIHNob3VsZCBnbyBhd2F5IHNvb24gKi8KKwkJc3dpdGNoKGMtPm10ZC0+ZWNjdHlwZSkgeworCQljYXNlIE1URF9FQ0NfUlNfRGlza09uQ2hpcDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkpGRlMyIHVzaW5nIERpc2tPbkNoaXAgaGFyZHdhcmUgRUNDIHdpdGhvdXQgYXV0b3BsYWNlbWVudC4gRml4IGl0IVxuIik7CisJCQljLT5vb2JpbmZvID0gJmpmZnMyX29vYmluZm9fZG9jZWNjOworCQkJYy0+ZnNkYXRhX3BvcyA9IDY7CisJCQljLT5mc2RhdGFfbGVuID0gTkFORF9KRkZTMl9PT0IxNl9GU0RBTEVOOworCQkJYy0+YmFkYmxvY2tfcG9zID0gMTU7CisJCQlicmVhazsKKwkKKwkJZGVmYXVsdDoKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJKRkZTMiBvbiBOQU5ELiBObyBhdXRvcGxhY21lbnQgaW5mbyBmb3VuZFxuIikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBqZmZzMl9uYW5kX2ZsYXNoX3NldHVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCWludCByZXM7CisKKwkvKiBJbml0aWFsaXNlIHdyaXRlIGJ1ZmZlciAqLworCWluaXRfcndzZW0oJmMtPndidWZfc2VtKTsKKwljLT53YnVmX3BhZ2VzaXplID0gYy0+bXRkLT5vb2JibG9jazsKKwljLT53YnVmX29mcyA9IDB4RkZGRkZGRkY7CisJCisJYy0+d2J1ZiA9IGttYWxsb2MoYy0+d2J1Zl9wYWdlc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjLT53YnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcyA9IGpmZnMyX25hbmRfc2V0X29vYmluZm8oYyk7CisKKyNpZmRlZiBCUkVBS01FCisJaWYgKCFicm9rZW5idWYpCisJCWJyb2tlbmJ1ZiA9IGttYWxsb2MoYy0+d2J1Zl9wYWdlc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFicm9rZW5idWYpIHsKKwkJa2ZyZWUoYy0+d2J1Zik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoYnJva2VuYnVmLCAweGRiLCBjLT53YnVmX3BhZ2VzaXplKTsKKyNlbmRpZgorCXJldHVybiByZXM7Cit9CisKK3ZvaWQgamZmczJfbmFuZF9mbGFzaF9jbGVhbnVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCWtmcmVlKGMtPndidWYpOworfQorCisjaWZkZWYgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MKK2ludCBqZmZzMl9ub3JfZWNjX2ZsYXNoX3NldHVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKSB7CisJLyogQ2xlYW5tYXJrZXIgaXMgYWN0dWFsbHkgbGFyZ2VyIG9uIHRoZSBmbGFzaGVzICovCisJYy0+Y2xlYW5tYXJrZXJfc2l6ZSA9IDE2OworCisJLyogSW5pdGlhbGl6ZSB3cml0ZSBidWZmZXIgKi8KKwlpbml0X3J3c2VtKCZjLT53YnVmX3NlbSk7CisJYy0+d2J1Zl9wYWdlc2l6ZSA9IGMtPm10ZC0+ZWNjc2l6ZTsKKwljLT53YnVmX29mcyA9IDB4RkZGRkZGRkY7CisKKwljLT53YnVmID0ga21hbGxvYyhjLT53YnVmX3BhZ2VzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWMtPndidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgamZmczJfbm9yX2VjY19mbGFzaF9jbGVhbnVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKSB7CisJa2ZyZWUoYy0+d2J1Zik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3dyaXRlLmMgYi9mcy9qZmZzMi93cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYTVkYjUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi93cml0ZS5jCkBAIC0wLDAgKzEsNzA4IEBACisvKgorICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiAkSWQ6IHdyaXRlLmMsdiAxLjg3IDIwMDQvMTEvMTYgMjA6MzY6MTIgZHdtdzIgRXhwICQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlICJub2RlbGlzdC5oIgorI2luY2x1ZGUgImNvbXByLmgiCisKKworaW50IGpmZnMyX2RvX25ld19pbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHVpbnQzMl90IG1vZGUsIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJpKQoreworCXN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqaWM7CisKKwlpYyA9IGpmZnMyX2FsbG9jX2lub2RlX2NhY2hlKCk7CisJaWYgKCFpYykgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoaWMsIDAsIHNpemVvZigqaWMpKTsKKworCWYtPmlub2NhY2hlID0gaWM7CisJZi0+aW5vY2FjaGUtPm5saW5rID0gMTsKKwlmLT5pbm9jYWNoZS0+bm9kZXMgPSAoc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqKWYtPmlub2NhY2hlOworCWYtPmlub2NhY2hlLT5pbm8gPSArK2MtPmhpZ2hlc3RfaW5vOworCWYtPmlub2NhY2hlLT5zdGF0ZSA9IElOT19TVEFURV9QUkVTRU5UOworCisJcmktPmlubyA9IGNwdV90b19qZTMyKGYtPmlub2NhY2hlLT5pbm8pOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2RvX25ld19pbm9kZSgpOiBBc3NpZ25lZCBpbm8jICVkXG4iLCBmLT5pbm9jYWNoZS0+aW5vKSk7CisJamZmczJfYWRkX2lub19jYWNoZShjLCBmLT5pbm9jYWNoZSk7CisKKwlyaS0+bWFnaWMgPSBjcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKTsKKwlyaS0+bm9kZXR5cGUgPSBjcHVfdG9famUxNihKRkZTMl9OT0RFVFlQRV9JTk9ERSk7CisJcmktPnRvdGxlbiA9IGNwdV90b19qZTMyKFBBRChzaXplb2YoKnJpKSkpOworCXJpLT5oZHJfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmksIHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKS00KSk7CisJcmktPm1vZGUgPSBjcHVfdG9famVtb2RlKG1vZGUpOworCisJZi0+aGlnaGVzdF92ZXJzaW9uID0gMTsKKwlyaS0+dmVyc2lvbiA9IGNwdV90b19qZTMyKGYtPmhpZ2hlc3RfdmVyc2lvbik7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIENPTkZJR19KRkZTMl9GU19ERUJVRyA+IDAKK3N0YXRpYyB2b2lkIHdyaXRlY2hlY2soc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHVpbnQzMl90IG9mcykKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxNl07CisJc2l6ZV90IHJldGxlbjsKKwlpbnQgcmV0LCBpOworCisJcmV0ID0gamZmczJfZmxhc2hfcmVhZChjLCBvZnMsIDE2LCAmcmV0bGVuLCBidWYpOworCWlmIChyZXQgfHwgKHJldGxlbiAhPSAxNikpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgInJlYWQgZmFpbGVkIG9yIHNob3J0IGluIHdyaXRlY2hlY2soKS4gcmV0ICVkLCByZXRsZW4gJXpkXG4iLCByZXQsIHJldGxlbikpOworCQlyZXR1cm47CisJfQorCXJldCA9IDA7CisJZm9yIChpPTA7IGk8MTY7IGkrKykgeworCQlpZiAoYnVmW2ldICE9IDB4ZmYpCisJCQlyZXQgPSAxOworCX0KKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFSR0guIEFib3V0IHRvIHdyaXRlIG5vZGUgdG8gMHglMDh4IG9uIGZsYXNoLCBidXQgdGhlcmUgYXJlIGRhdGEgYWxyZWFkeSB0aGVyZTpcbiIsIG9mcyk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjB4JTA4eDogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgCisJCSAgICAgICBvZnMsCisJCSAgICAgICBidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sIGJ1Zls0XSwgYnVmWzVdLCBidWZbNl0sIGJ1Zls3XSwKKwkJICAgICAgIGJ1Zls4XSwgYnVmWzldLCBidWZbMTBdLCBidWZbMTFdLCBidWZbMTJdLCBidWZbMTNdLCBidWZbMTRdLCBidWZbMTVdKTsKKwl9Cit9CisjZW5kaWYKKworCisvKiBqZmZzMl93cml0ZV9kbm9kZSAtIGdpdmVuIGEgcmF3X2lub2RlLCBhbGxvY2F0ZSBhIGZ1bGxfZG5vZGUgZm9yIGl0LCAKKyAgIHdyaXRlIGl0IHRvIHRoZSBmbGFzaCwgbGluayBpdCBpbnRvIHRoZSBleGlzdGluZyBpbm9kZS9mcmFnbWVudCBsaXN0ICovCisKK3N0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpqZmZzMl93cml0ZV9kbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJpLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1aW50MzJfdCBkYXRhbGVuLCB1aW50MzJfdCBmbGFzaF9vZnMsIGludCBhbGxvY19tb2RlKQorCit7CisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmF3OworCXN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpmbjsKKwlzaXplX3QgcmV0bGVuOworCXN0cnVjdCBrdmVjIHZlY3NbMl07CisJaW50IHJldDsKKwlpbnQgcmV0cmllZCA9IDA7CisJdW5zaWduZWQgbG9uZyBjbnQgPSAyOworCisJRDEoaWYoamUzMl90b19jcHUocmktPmhkcl9jcmMpICE9IGNyYzMyKDAsIHJpLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSktNCkpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiRWVwLiBDUkMgbm90IGNvcnJlY3QgaW4gamZmczJfd3JpdGVfZG5vZGUoKVxuIik7CisJCUJVRygpOworCX0KKwkgICApOworCXZlY3NbMF0uaW92X2Jhc2UgPSByaTsKKwl2ZWNzWzBdLmlvdl9sZW4gPSBzaXplb2YoKnJpKTsKKwl2ZWNzWzFdLmlvdl9iYXNlID0gKHVuc2lnbmVkIGNoYXIgKilkYXRhOworCXZlY3NbMV0uaW92X2xlbiA9IGRhdGFsZW47CisKKwlEMSh3cml0ZWNoZWNrKGMsIGZsYXNoX29mcykpOworCisJaWYgKGplMzJfdG9fY3B1KHJpLT50b3RsZW4pICE9IHNpemVvZigqcmkpICsgZGF0YWxlbikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl93cml0ZV9kbm9kZTogcmktPnRvdGxlbiAoMHglMDh4KSAhPSBzaXplb2YoKnJpKSAoMHglMDh6eCkgKyBkYXRhbGVuICgweCUwOHgpXG4iLCBqZTMyX3RvX2NwdShyaS0+dG90bGVuKSwgc2l6ZW9mKCpyaSksIGRhdGFsZW4pOworCX0KKwlyYXcgPSBqZmZzMl9hbGxvY19yYXdfbm9kZV9yZWYoKTsKKwlpZiAoIXJhdykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCisJZm4gPSBqZmZzMl9hbGxvY19mdWxsX2Rub2RlKCk7CisJaWYgKCFmbikgeworCQlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZihyYXcpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlmbi0+b2ZzID0gamUzMl90b19jcHUocmktPm9mZnNldCk7CisJZm4tPnNpemUgPSBqZTMyX3RvX2NwdShyaS0+ZHNpemUpOworCWZuLT5mcmFncyA9IDA7CisKKwkvKiBjaGVjayBudW1iZXIgb2YgdmFsaWQgdmVjcyAqLworCWlmICghZGF0YWxlbiB8fCAhZGF0YSkKKwkJY250ID0gMTsKKyByZXRyeToKKwlmbi0+cmF3ID0gcmF3OworCisJcmF3LT5mbGFzaF9vZmZzZXQgPSBmbGFzaF9vZnM7CisJcmF3LT5fX3RvdGxlbiA9IFBBRChzaXplb2YoKnJpKStkYXRhbGVuKTsKKwlyYXctPm5leHRfcGh5cyA9IE5VTEw7CisKKwlyZXQgPSBqZmZzMl9mbGFzaF93cml0ZXYoYywgdmVjcywgY250LCBmbGFzaF9vZnMsICZyZXRsZW4sCisJCQkJIChhbGxvY19tb2RlPT1BTExPQ19HQyk/MDpmLT5pbm9jYWNoZS0+aW5vKTsKKworCWlmIChyZXQgfHwgKHJldGxlbiAhPSBzaXplb2YoKnJpKSArIGRhdGFsZW4pKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiV3JpdGUgb2YgJXpkIGJ5dGVzIGF0IDB4JTA4eCBmYWlsZWQuIHJldHVybmVkICVkLCByZXRsZW4gJXpkXG4iLCAKKwkJICAgICAgIHNpemVvZigqcmkpK2RhdGFsZW4sIGZsYXNoX29mcywgcmV0LCByZXRsZW4pOworCisJCS8qIE1hcmsgdGhlIHNwYWNlIGFzIGRpcnRpZWQgKi8KKwkJaWYgKHJldGxlbikgeworCQkJLyogRG9lc24ndCBiZWxvbmcgdG8gYW55IGlub2RlICovCisJCQlyYXctPm5leHRfaW5faW5vID0gTlVMTDsKKworCQkJLyogRG9uJ3QgY2hhbmdlIHJhdy0+c2l6ZSB0byBtYXRjaCByZXRsZW4uIFdlIG1heSBoYXZlIAorCQkJICAgd3JpdHRlbiB0aGUgbm9kZSBoZWFkZXIgYWxyZWFkeSwgYW5kIG9ubHkgdGhlIGRhdGEgd2lsbAorCQkJICAgc2VlbSBjb3JydXB0ZWQsIGluIHdoaWNoIGNhc2UgdGhlIHNjYW4gd291bGQgc2tpcCBvdmVyCisJCQkgICBhbnkgbm9kZSB3ZSB3cml0ZSBiZWZvcmUgdGhlIG9yaWdpbmFsIGludGVuZGVkIGVuZCBvZiAKKwkJCSAgIHRoaXMgbm9kZSAqLworCQkJcmF3LT5mbGFzaF9vZmZzZXQgfD0gUkVGX09CU09MRVRFOworCQkJamZmczJfYWRkX3BoeXNpY2FsX25vZGVfcmVmKGMsIHJhdyk7CisJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgcmF3KTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiTm90IG1hcmtpbmcgdGhlIHNwYWNlIGF0IDB4JTA4eCBhcyBkaXJ0eSBiZWNhdXNlIHRoZSBmbGFzaCBkcml2ZXIgcmV0dXJuZWQgcmV0bGVuIHplcm9cbiIsIHJhdy0+Zmxhc2hfb2Zmc2V0KTsKKwkJCWpmZnMyX2ZyZWVfcmF3X25vZGVfcmVmKHJhdyk7CisJCX0KKwkJaWYgKCFyZXRyaWVkICYmIGFsbG9jX21vZGUgIT0gQUxMT0NfTk9SRVRSWSAmJiAocmF3ID0gamZmczJfYWxsb2NfcmF3X25vZGVfcmVmKCkpKSB7CisJCQkvKiBUcnkgdG8gcmVhbGxvY2F0ZSBzcGFjZSBhbmQgcmV0cnkgKi8KKwkJCXVpbnQzMl90IGR1bW15OworCQkJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiA9ICZjLT5ibG9ja3NbZmxhc2hfb2ZzIC8gYy0+c2VjdG9yX3NpemVdOworCisJCQlyZXRyaWVkID0gMTsKKworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJldHJ5aW5nIGZhaWxlZCB3cml0ZS5cbiIpKTsKKwkJCQorCQkJQUNDVF9TQU5JVFlfQ0hFQ0soYyxqZWIpOworCQkJRDEoQUNDVF9QQVJBTk9JQV9DSEVDSyhqZWIpKTsKKworCQkJaWYgKGFsbG9jX21vZGUgPT0gQUxMT0NfR0MpIHsKKwkJCQlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlX2djKGMsIHNpemVvZigqcmkpICsgZGF0YWxlbiwgJmZsYXNoX29mcywgJmR1bW15KTsKKwkJCX0gZWxzZSB7CisJCQkJLyogTG9ja2luZyBwYWluICovCisJCQkJdXAoJmYtPnNlbSk7CisJCQkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisJCQkKKwkJCQlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlKGMsIHNpemVvZigqcmkpICsgZGF0YWxlbiwgJmZsYXNoX29mcywgJmR1bW15LCBhbGxvY19tb2RlKTsKKwkJCQlkb3duKCZmLT5zZW0pOworCQkJfQorCisJCQlpZiAoIXJldCkgeworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJBbGxvY2F0ZWQgc3BhY2UgYXQgMHglMDh4IHRvIHJldHJ5IGZhaWxlZCB3cml0ZS5cbiIsIGZsYXNoX29mcykpOworCisJCQkJQUNDVF9TQU5JVFlfQ0hFQ0soYyxqZWIpOworCQkJCUQxKEFDQ1RfUEFSQU5PSUFfQ0hFQ0soamViKSk7CisKKwkJCQlnb3RvIHJldHJ5OworCQkJfQorCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkZhaWxlZCB0byBhbGxvY2F0ZSBzcGFjZSB0byByZXRyeSBmYWlsZWQgd3JpdGU6ICVkIVxuIiwgcmV0KSk7CisJCQlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZihyYXcpOworCQl9CisJCS8qIFJlbGVhc2UgdGhlIGZ1bGxfZG5vZGUgd2hpY2ggaXMgbm93IHVzZWxlc3MsIGFuZCByZXR1cm4gKi8KKwkJamZmczJfZnJlZV9mdWxsX2Rub2RlKGZuKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0P3JldDotRUlPKTsKKwl9CisJLyogTWFyayB0aGUgc3BhY2UgdXNlZCAqLworCS8qIElmIG5vZGUgY292ZXJzIGF0IGxlYXN0IGEgd2hvbGUgcGFnZSwgb3IgaWYgaXQgc3RhcnRzIGF0IHRoZSAKKwkgICBiZWdpbm5pbmcgb2YgYSBwYWdlIGFuZCBydW5zIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIG9yIGlmIAorCSAgIGl0J3MgYSBob2xlIG5vZGUsIG1hcmsgaXQgUkVGX1BSSVNUSU5FLCBlbHNlIFJFRl9OT1JNQUwuIAorCSovCisJaWYgKChqZTMyX3RvX2NwdShyaS0+ZHNpemUpID49IFBBR0VfQ0FDSEVfU0laRSkgfHwKKwkgICAgKCAoKGplMzJfdG9fY3B1KHJpLT5vZmZzZXQpJihQQUdFX0NBQ0hFX1NJWkUtMSkpPT0wKSAmJgorCSAgICAgIChqZTMyX3RvX2NwdShyaS0+ZHNpemUpK2plMzJfdG9fY3B1KHJpLT5vZmZzZXQpID09ICBqZTMyX3RvX2NwdShyaS0+aXNpemUpKSkpIHsKKwkJcmF3LT5mbGFzaF9vZmZzZXQgfD0gUkVGX1BSSVNUSU5FOworCX0gZWxzZSB7CisJCXJhdy0+Zmxhc2hfb2Zmc2V0IHw9IFJFRl9OT1JNQUw7CisJfQorCWpmZnMyX2FkZF9waHlzaWNhbF9ub2RlX3JlZihjLCByYXcpOworCisJLyogTGluayBpbnRvIHBlci1pbm9kZSBsaXN0ICovCisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCXJhdy0+bmV4dF9pbl9pbm8gPSBmLT5pbm9jYWNoZS0+bm9kZXM7CisJZi0+aW5vY2FjaGUtPm5vZGVzID0gcmF3OworCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3dyaXRlX2Rub2RlIHdyb3RlIG5vZGUgYXQgMHglMDh4KCVkKSB3aXRoIGRzaXplIDB4JXgsIGNzaXplIDB4JXgsIG5vZGVfY3JjIDB4JTA4eCwgZGF0YV9jcmMgMHglMDh4LCB0b3RsZW4gMHglMDh4XG4iLAorCQkgIGZsYXNoX29mcywgcmVmX2ZsYWdzKHJhdyksIGplMzJfdG9fY3B1KHJpLT5kc2l6ZSksIAorCQkgIGplMzJfdG9fY3B1KHJpLT5jc2l6ZSksIGplMzJfdG9fY3B1KHJpLT5ub2RlX2NyYyksCisJCSAgamUzMl90b19jcHUocmktPmRhdGFfY3JjKSwgamUzMl90b19jcHUocmktPnRvdGxlbikpKTsKKworCWlmIChyZXRyaWVkKSB7CisJCUFDQ1RfU0FOSVRZX0NIRUNLKGMsTlVMTCk7CisJfQorCisJcmV0dXJuIGZuOworfQorCitzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmpmZnMyX3dyaXRlX2RpcmVudChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHN0cnVjdCBqZmZzMl9yYXdfZGlyZW50ICpyZCwgY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSwgdWludDMyX3QgbmFtZWxlbiwgdWludDMyX3QgZmxhc2hfb2ZzLCBpbnQgYWxsb2NfbW9kZSkKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpyYXc7CisJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZDsKKwlzaXplX3QgcmV0bGVuOworCXN0cnVjdCBrdmVjIHZlY3NbMl07CisJaW50IHJldHJpZWQgPSAwOworCWludCByZXQ7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfd3JpdGVfZGlyZW50KGlubyAjJXUsIG5hbWUgYXQgKjB4JXAgXCIlc1wiLT5pbm8gIyV1LCBuYW1lX2NyYyAweCUwOHgpXG4iLCAKKwkJICBqZTMyX3RvX2NwdShyZC0+cGlubyksIG5hbWUsIG5hbWUsIGplMzJfdG9fY3B1KHJkLT5pbm8pLAorCQkgIGplMzJfdG9fY3B1KHJkLT5uYW1lX2NyYykpKTsKKwlEMSh3cml0ZWNoZWNrKGMsIGZsYXNoX29mcykpOworCisJRDEoaWYoamUzMl90b19jcHUocmQtPmhkcl9jcmMpICE9IGNyYzMyKDAsIHJkLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSktNCkpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiRWVwLiBDUkMgbm90IGNvcnJlY3QgaW4gamZmczJfd3JpdGVfZGlyZW50KClcbiIpOworCQlCVUcoKTsKKwl9CisJICAgKTsKKworCXZlY3NbMF0uaW92X2Jhc2UgPSByZDsKKwl2ZWNzWzBdLmlvdl9sZW4gPSBzaXplb2YoKnJkKTsKKwl2ZWNzWzFdLmlvdl9iYXNlID0gKHVuc2lnbmVkIGNoYXIgKiluYW1lOworCXZlY3NbMV0uaW92X2xlbiA9IG5hbWVsZW47CisJCisJcmF3ID0gamZmczJfYWxsb2NfcmF3X25vZGVfcmVmKCk7CisKKwlpZiAoIXJhdykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlmZCA9IGpmZnMyX2FsbG9jX2Z1bGxfZGlyZW50KG5hbWVsZW4rMSk7CisJaWYgKCFmZCkgeworCQlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZihyYXcpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlmZC0+dmVyc2lvbiA9IGplMzJfdG9fY3B1KHJkLT52ZXJzaW9uKTsKKwlmZC0+aW5vID0gamUzMl90b19jcHUocmQtPmlubyk7CisJZmQtPm5oYXNoID0gZnVsbF9uYW1lX2hhc2gobmFtZSwgc3RybGVuKG5hbWUpKTsKKwlmZC0+dHlwZSA9IHJkLT50eXBlOworCW1lbWNweShmZC0+bmFtZSwgbmFtZSwgbmFtZWxlbik7CisJZmQtPm5hbWVbbmFtZWxlbl09MDsKKworIHJldHJ5OgorCWZkLT5yYXcgPSByYXc7CisKKwlyYXctPmZsYXNoX29mZnNldCA9IGZsYXNoX29mczsKKwlyYXctPl9fdG90bGVuID0gUEFEKHNpemVvZigqcmQpK25hbWVsZW4pOworCXJhdy0+bmV4dF9waHlzID0gTlVMTDsKKworCXJldCA9IGpmZnMyX2ZsYXNoX3dyaXRldihjLCB2ZWNzLCAyLCBmbGFzaF9vZnMsICZyZXRsZW4sCisJCQkJIChhbGxvY19tb2RlPT1BTExPQ19HQyk/MDpqZTMyX3RvX2NwdShyZC0+cGlubykpOworCWlmIChyZXQgfHwgKHJldGxlbiAhPSBzaXplb2YoKnJkKSArIG5hbWVsZW4pKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiV3JpdGUgb2YgJXpkIGJ5dGVzIGF0IDB4JTA4eCBmYWlsZWQuIHJldHVybmVkICVkLCByZXRsZW4gJXpkXG4iLCAKKwkJCSAgICAgICBzaXplb2YoKnJkKStuYW1lbGVuLCBmbGFzaF9vZnMsIHJldCwgcmV0bGVuKTsKKwkJLyogTWFyayB0aGUgc3BhY2UgYXMgZGlydGllZCAqLworCQlpZiAocmV0bGVuKSB7CisJCQlyYXctPm5leHRfaW5faW5vID0gTlVMTDsKKwkJCXJhdy0+Zmxhc2hfb2Zmc2V0IHw9IFJFRl9PQlNPTEVURTsKKwkJCWpmZnMyX2FkZF9waHlzaWNhbF9ub2RlX3JlZihjLCByYXcpOworCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIHJhdyk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5vdCBtYXJraW5nIHRoZSBzcGFjZSBhdCAweCUwOHggYXMgZGlydHkgYmVjYXVzZSB0aGUgZmxhc2ggZHJpdmVyIHJldHVybmVkIHJldGxlbiB6ZXJvXG4iLCByYXctPmZsYXNoX29mZnNldCk7CisJCQlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZihyYXcpOworCQl9CisJCWlmICghcmV0cmllZCAmJiAocmF3ID0gamZmczJfYWxsb2NfcmF3X25vZGVfcmVmKCkpKSB7CisJCQkvKiBUcnkgdG8gcmVhbGxvY2F0ZSBzcGFjZSBhbmQgcmV0cnkgKi8KKwkJCXVpbnQzMl90IGR1bW15OworCQkJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiA9ICZjLT5ibG9ja3NbZmxhc2hfb2ZzIC8gYy0+c2VjdG9yX3NpemVdOworCisJCQlyZXRyaWVkID0gMTsKKworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJldHJ5aW5nIGZhaWxlZCB3cml0ZS5cbiIpKTsKKworCQkJQUNDVF9TQU5JVFlfQ0hFQ0soYyxqZWIpOworCQkJRDEoQUNDVF9QQVJBTk9JQV9DSEVDSyhqZWIpKTsKKworCQkJaWYgKGFsbG9jX21vZGUgPT0gQUxMT0NfR0MpIHsKKwkJCQlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlX2djKGMsIHNpemVvZigqcmQpICsgbmFtZWxlbiwgJmZsYXNoX29mcywgJmR1bW15KTsKKwkJCX0gZWxzZSB7CisJCQkJLyogTG9ja2luZyBwYWluICovCisJCQkJdXAoJmYtPnNlbSk7CisJCQkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisJCQkKKwkJCQlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlKGMsIHNpemVvZigqcmQpICsgbmFtZWxlbiwgJmZsYXNoX29mcywgJmR1bW15LCBhbGxvY19tb2RlKTsKKwkJCQlkb3duKCZmLT5zZW0pOworCQkJfQorCisJCQlpZiAoIXJldCkgeworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJBbGxvY2F0ZWQgc3BhY2UgYXQgMHglMDh4IHRvIHJldHJ5IGZhaWxlZCB3cml0ZS5cbiIsIGZsYXNoX29mcykpOworCQkJCUFDQ1RfU0FOSVRZX0NIRUNLKGMsamViKTsKKwkJCQlEMShBQ0NUX1BBUkFOT0lBX0NIRUNLKGplYikpOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIHRvIHJldHJ5IGZhaWxlZCB3cml0ZTogJWQhXG4iLCByZXQpKTsKKwkJCWpmZnMyX2ZyZWVfcmF3X25vZGVfcmVmKHJhdyk7CisJCX0KKwkJLyogUmVsZWFzZSB0aGUgZnVsbF9kbm9kZSB3aGljaCBpcyBub3cgdXNlbGVzcywgYW5kIHJldHVybiAqLworCQlqZmZzMl9mcmVlX2Z1bGxfZGlyZW50KGZkKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0P3JldDotRUlPKTsKKwl9CisJLyogTWFyayB0aGUgc3BhY2UgdXNlZCAqLworCXJhdy0+Zmxhc2hfb2Zmc2V0IHw9IFJFRl9QUklTVElORTsKKwlqZmZzMl9hZGRfcGh5c2ljYWxfbm9kZV9yZWYoYywgcmF3KTsKKworCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwlyYXctPm5leHRfaW5faW5vID0gZi0+aW5vY2FjaGUtPm5vZGVzOworCWYtPmlub2NhY2hlLT5ub2RlcyA9IHJhdzsKKwlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCWlmIChyZXRyaWVkKSB7CisJCUFDQ1RfU0FOSVRZX0NIRUNLKGMsTlVMTCk7CisJfQorCisJcmV0dXJuIGZkOworfQorCisvKiBUaGUgT1Mtc3BlY2lmaWMgY29kZSBmaWxscyBpbiB0aGUgbWV0YWRhdGEgaW4gdGhlIGpmZnMyX3Jhd19pbm9kZSBmb3IgdXMsIHNvIHRoYXQKKyAgIHdlIGRvbid0IGhhdmUgdG8gZ28gZGlnZ2luZyBpbiBzdHJ1Y3QgaW5vZGUgb3IgaXRzIGVxdWl2YWxlbnQuIEl0IHNob3VsZCBzZXQ6CisgICBtb2RlLCB1aWQsIGdpZCwgKHN0YXJ0aW5nKWlzaXplLCBhdGltZSwgY3RpbWUsIG10aW1lICovCitpbnQgamZmczJfd3JpdGVfaW5vZGVfcmFuZ2Uoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLAorCQkJICAgIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJpLCB1bnNpZ25lZCBjaGFyICpidWYsIAorCQkJICAgIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgd3JpdGVsZW4sIHVpbnQzMl90ICpyZXRsZW4pCit7CisJaW50IHJldCA9IDA7CisJdWludDMyX3Qgd3JpdHRlbmxlbiA9IDA7CisKKyAgICAgICAJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3dyaXRlX2lub2RlX3JhbmdlKCk6IElubyAjJXUsIG9mcyAweCV4LCBsZW4gMHgleFxuIiwKKwkJICBmLT5pbm9jYWNoZS0+aW5vLCBvZmZzZXQsIHdyaXRlbGVuKSk7CisJCQorCXdoaWxlKHdyaXRlbGVuKSB7CisJCXN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpmbjsKKwkJdW5zaWduZWQgY2hhciAqY29tcHJidWYgPSBOVUxMOworCQl1aW50MTZfdCBjb21wcnR5cGUgPSBKRkZTMl9DT01QUl9OT05FOworCQl1aW50MzJfdCBwaHlzX29mcywgYWxsb2NsZW47CisJCXVpbnQzMl90IGRhdGFsZW4sIGNkYXRhbGVuOworCQlpbnQgcmV0cmllZCA9IDA7CisKKwlyZXRyeToKKwkJRDIocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2NvbW1pdF93cml0ZSgpIGxvb3A6IDB4JXggdG8gd3JpdGUgdG8gMHgleFxuIiwgd3JpdGVsZW4sIG9mZnNldCkpOworCisJCXJldCA9IGpmZnMyX3Jlc2VydmVfc3BhY2UoYywgc2l6ZW9mKCpyaSkgKyBKRkZTMl9NSU5fREFUQV9MRU4sICZwaHlzX29mcywgJmFsbG9jbGVuLCBBTExPQ19OT1JNQUwpOworCQlpZiAocmV0KSB7CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfcmVzZXJ2ZV9zcGFjZSByZXR1cm5lZCAlZFxuIiwgcmV0KSk7CisJCQlicmVhazsKKwkJfQorCQlkb3duKCZmLT5zZW0pOworCQlkYXRhbGVuID0gbWluX3QodWludDMyX3QsIHdyaXRlbGVuLCBQQUdFX0NBQ0hFX1NJWkUgLSAob2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRS0xKSkpOworCQljZGF0YWxlbiA9IG1pbl90KHVpbnQzMl90LCBhbGxvY2xlbiAtIHNpemVvZigqcmkpLCBkYXRhbGVuKTsKKworCQljb21wcnR5cGUgPSBqZmZzMl9jb21wcmVzcyhjLCBmLCBidWYsICZjb21wcmJ1ZiwgJmRhdGFsZW4sICZjZGF0YWxlbik7CisKKwkJcmktPm1hZ2ljID0gY3B1X3RvX2plMTYoSkZGUzJfTUFHSUNfQklUTUFTSyk7CisJCXJpLT5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0lOT0RFKTsKKwkJcmktPnRvdGxlbiA9IGNwdV90b19qZTMyKHNpemVvZigqcmkpICsgY2RhdGFsZW4pOworCQlyaS0+aGRyX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIHJpLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSktNCkpOworCisJCXJpLT5pbm8gPSBjcHVfdG9famUzMihmLT5pbm9jYWNoZS0+aW5vKTsKKwkJcmktPnZlcnNpb24gPSBjcHVfdG9famUzMigrK2YtPmhpZ2hlc3RfdmVyc2lvbik7CisJCXJpLT5pc2l6ZSA9IGNwdV90b19qZTMyKG1heChqZTMyX3RvX2NwdShyaS0+aXNpemUpLCBvZmZzZXQgKyBkYXRhbGVuKSk7CisJCXJpLT5vZmZzZXQgPSBjcHVfdG9famUzMihvZmZzZXQpOworCQlyaS0+Y3NpemUgPSBjcHVfdG9famUzMihjZGF0YWxlbik7CisJCXJpLT5kc2l6ZSA9IGNwdV90b19qZTMyKGRhdGFsZW4pOworCQlyaS0+Y29tcHIgPSBjb21wcnR5cGUgJiAweGZmOworCQlyaS0+dXNlcmNvbXByID0gKGNvbXBydHlwZSA+PiA4ICkgJiAweGZmOworCQlyaS0+bm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByaSwgc2l6ZW9mKCpyaSktOCkpOworCQlyaS0+ZGF0YV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCBjb21wcmJ1ZiwgY2RhdGFsZW4pKTsKKworCQlmbiA9IGpmZnMyX3dyaXRlX2Rub2RlKGMsIGYsIHJpLCBjb21wcmJ1ZiwgY2RhdGFsZW4sIHBoeXNfb2ZzLCBBTExPQ19OT1JFVFJZKTsKKworCQlqZmZzMl9mcmVlX2NvbXByYnVmKGNvbXByYnVmLCBidWYpOworCisJCWlmIChJU19FUlIoZm4pKSB7CisJCQlyZXQgPSBQVFJfRVJSKGZuKTsKKwkJCXVwKCZmLT5zZW0pOworCQkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisJCQlpZiAoIXJldHJpZWQpIHsKKwkJCQkvKiBXcml0ZSBlcnJvciB0byBiZSByZXRyaWVkICovCisJCQkJcmV0cmllZCA9IDE7CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJldHJ5aW5nIG5vZGUgd3JpdGUgaW4gamZmczJfd3JpdGVfaW5vZGVfcmFuZ2UoKVxuIikpOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSBqZmZzMl9hZGRfZnVsbF9kbm9kZV90b19pbm9kZShjLCBmLCBmbik7CisJCWlmIChmLT5tZXRhZGF0YSkgeworCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGYtPm1ldGFkYXRhLT5yYXcpOworCQkJamZmczJfZnJlZV9mdWxsX2Rub2RlKGYtPm1ldGFkYXRhKTsKKwkJCWYtPm1ldGFkYXRhID0gTlVMTDsKKwkJfQorCQlpZiAocmV0KSB7CisJCQkvKiBFZXAgKi8KKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFZXAuIGFkZF9mdWxsX2Rub2RlX3RvX2lub2RlKCkgZmFpbGVkIGluIGNvbW1pdF93cml0ZSwgcmV0dXJuZWQgJWRcbiIsIHJldCkpOworCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGZuLT5yYXcpOworCQkJamZmczJfZnJlZV9mdWxsX2Rub2RlKGZuKTsKKworCQkJdXAoJmYtPnNlbSk7CisJCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJCWJyZWFrOworCQl9CisJCXVwKCZmLT5zZW0pOworCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJaWYgKCFkYXRhbGVuKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFZXAuIFdlIGRpZG4ndCBhY3R1YWxseSB3cml0ZSBhbnkgZGF0YSBpbiBqZmZzMl93cml0ZV9pbm9kZV9yYW5nZSgpXG4iKTsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlEMShwcmludGsoS0VSTl9ERUJVRyAiaW5jcmVhc2luZyB3cml0dGVubGVuIGJ5ICVkXG4iLCBkYXRhbGVuKSk7CisJCXdyaXR0ZW5sZW4gKz0gZGF0YWxlbjsKKwkJb2Zmc2V0ICs9IGRhdGFsZW47CisJCXdyaXRlbGVuIC09IGRhdGFsZW47CisJCWJ1ZiArPSBkYXRhbGVuOworCX0KKwkqcmV0bGVuID0gd3JpdHRlbmxlbjsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgamZmczJfZG9fY3JlYXRlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZGlyX2YsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCBzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pCit7CisJc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgKnJkOworCXN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpmbjsKKwlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkOworCXVpbnQzMl90IGFsbG9jbGVuLCBwaHlzX29mczsKKwlpbnQgcmV0OworCisJLyogVHJ5IHRvIHJlc2VydmUgZW5vdWdoIHNwYWNlIGZvciBib3RoIG5vZGUgYW5kIGRpcmVudC4gCisJICogSnVzdCB0aGUgbm9kZSB3aWxsIGRvIGZvciBub3csIHRob3VnaCAKKwkgKi8KKwlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlKGMsIHNpemVvZigqcmkpLCAmcGh5c19vZnMsICZhbGxvY2xlbiwgQUxMT0NfTk9STUFMKTsKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZG9fY3JlYXRlKCk6IHJlc2VydmVkIDB4JXggYnl0ZXNcbiIsIGFsbG9jbGVuKSk7CisJaWYgKHJldCkgeworCQl1cCgmZi0+c2VtKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyaS0+ZGF0YV9jcmMgPSBjcHVfdG9famUzMigwKTsKKwlyaS0+bm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByaSwgc2l6ZW9mKCpyaSktOCkpOworCisJZm4gPSBqZmZzMl93cml0ZV9kbm9kZShjLCBmLCByaSwgTlVMTCwgMCwgcGh5c19vZnMsIEFMTE9DX05PUk1BTCk7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZG9fY3JlYXRlIGNyZWF0ZWQgZmlsZSB3aXRoIG1vZGUgMHgleFxuIiwKKwkJICBqZW1vZGVfdG9fY3B1KHJpLT5tb2RlKSkpOworCisJaWYgKElTX0VSUihmbikpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3dyaXRlX2Rub2RlKCkgZmFpbGVkXG4iKSk7CisJCS8qIEVlZWsuIFdhdmUgYnllIGJ5ZSAqLworCQl1cCgmZi0+c2VtKTsKKwkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisJCXJldHVybiBQVFJfRVJSKGZuKTsKKwl9CisJLyogTm8gZGF0YSBoZXJlLiBPbmx5IGEgbWV0YWRhdGEgbm9kZSwgd2hpY2ggd2lsbCBiZSAKKwkgICBvYnNvbGV0ZWQgYnkgdGhlIGZpcnN0IGRhdGEgd3JpdGUKKwkqLworCWYtPm1ldGFkYXRhID0gZm47CisKKwl1cCgmZi0+c2VtKTsKKwlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlKGMsIHNpemVvZigqcmQpK25hbWVsZW4sICZwaHlzX29mcywgJmFsbG9jbGVuLCBBTExPQ19OT1JNQUwpOworCQkKKwlpZiAocmV0KSB7CisJCS8qIEVlcC4gKi8KKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3Jlc2VydmVfc3BhY2UoKSBmb3IgZGlyZW50IGZhaWxlZFxuIikpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJkID0gamZmczJfYWxsb2NfcmF3X2RpcmVudCgpOworCWlmICghcmQpIHsKKwkJLyogQXJnaC4gTm93IHdlIHRyZWF0IGl0IGxpa2UgYSBub3JtYWwgZGVsZXRlICovCisJCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkb3duKCZkaXJfZi0+c2VtKTsKKworCXJkLT5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOworCXJkLT5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0RJUkVOVCk7CisJcmQtPnRvdGxlbiA9IGNwdV90b19qZTMyKHNpemVvZigqcmQpICsgbmFtZWxlbik7CisJcmQtPmhkcl9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByZCwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpLTQpKTsKKworCXJkLT5waW5vID0gY3B1X3RvX2plMzIoZGlyX2YtPmlub2NhY2hlLT5pbm8pOworCXJkLT52ZXJzaW9uID0gY3B1X3RvX2plMzIoKytkaXJfZi0+aGlnaGVzdF92ZXJzaW9uKTsKKwlyZC0+aW5vID0gcmktPmlubzsKKwlyZC0+bWN0aW1lID0gcmktPmN0aW1lOworCXJkLT5uc2l6ZSA9IG5hbWVsZW47CisJcmQtPnR5cGUgPSBEVF9SRUc7CisJcmQtPm5vZGVfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmQsIHNpemVvZigqcmQpLTgpKTsKKwlyZC0+bmFtZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCBuYW1lLCBuYW1lbGVuKSk7CisKKwlmZCA9IGpmZnMyX3dyaXRlX2RpcmVudChjLCBkaXJfZiwgcmQsIG5hbWUsIG5hbWVsZW4sIHBoeXNfb2ZzLCBBTExPQ19OT1JNQUwpOworCisJamZmczJfZnJlZV9yYXdfZGlyZW50KHJkKTsKKwkKKwlpZiAoSVNfRVJSKGZkKSkgeworCQkvKiBkaXJlbnQgZmFpbGVkIHRvIHdyaXRlLiBEZWxldGUgdGhlIGlub2RlIG5vcm1hbGx5IAorCQkgICBhcyBpZiBpdCB3ZXJlIHRoZSBmaW5hbCB1bmxpbmsoKSAqLworCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJdXAoJmRpcl9mLT5zZW0pOworCQlyZXR1cm4gUFRSX0VSUihmZCk7CisJfQorCisJLyogTGluayB0aGUgZmQgaW50byB0aGUgaW5vZGUncyBsaXN0LCBvYnNvbGV0aW5nIGFuIG9sZAorCSAgIG9uZSBpZiBuZWNlc3NhcnkuICovCisJamZmczJfYWRkX2ZkX3RvX2xpc3QoYywgZmQsICZkaXJfZi0+ZGVudHMpOworCisJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisJdXAoJmRpcl9mLT5zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKworaW50IGpmZnMyX2RvX3VubGluayhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmRpcl9mLAorCQkgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpkZWFkX2YpCit7CisJc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgKnJkOworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQ7CisJdWludDMyX3QgYWxsb2NsZW4sIHBoeXNfb2ZzOworCWludCByZXQ7CisKKwlpZiAoMSAvKiBhbHRlcm5hdGl2ZSBicmFuY2ggbmVlZHMgdGVzdGluZyAqLyB8fCAKKwkgICAgIWpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKGMpKSB7CisJCS8qIFdlIGNhbid0IG1hcmsgc3R1ZmYgb2Jzb2xldGUgb24gdGhlIG1lZGl1bS4gV2UgbmVlZCB0byB3cml0ZSBhIGRlbGV0aW9uIGRpcmVudCAqLworCisJCXJkID0gamZmczJfYWxsb2NfcmF3X2RpcmVudCgpOworCQlpZiAoIXJkKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcmV0ID0gamZmczJfcmVzZXJ2ZV9zcGFjZShjLCBzaXplb2YoKnJkKStuYW1lbGVuLCAmcGh5c19vZnMsICZhbGxvY2xlbiwgQUxMT0NfREVMRVRJT04pOworCQlpZiAocmV0KSB7CisJCQlqZmZzMl9mcmVlX3Jhd19kaXJlbnQocmQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWRvd24oJmRpcl9mLT5zZW0pOworCisJCS8qIEJ1aWxkIGEgZGVsZXRpb24gbm9kZSAqLworCQlyZC0+bWFnaWMgPSBjcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKTsKKwkJcmQtPm5vZGV0eXBlID0gY3B1X3RvX2plMTYoSkZGUzJfTk9ERVRZUEVfRElSRU5UKTsKKwkJcmQtPnRvdGxlbiA9IGNwdV90b19qZTMyKHNpemVvZigqcmQpICsgbmFtZWxlbik7CisJCXJkLT5oZHJfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmQsIHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKS00KSk7CisJCQorCQlyZC0+cGlubyA9IGNwdV90b19qZTMyKGRpcl9mLT5pbm9jYWNoZS0+aW5vKTsKKwkJcmQtPnZlcnNpb24gPSBjcHVfdG9famUzMigrK2Rpcl9mLT5oaWdoZXN0X3ZlcnNpb24pOworCQlyZC0+aW5vID0gY3B1X3RvX2plMzIoMCk7CisJCXJkLT5tY3RpbWUgPSBjcHVfdG9famUzMihnZXRfc2Vjb25kcygpKTsKKwkJcmQtPm5zaXplID0gbmFtZWxlbjsKKwkJcmQtPnR5cGUgPSBEVF9VTktOT1dOOworCQlyZC0+bm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByZCwgc2l6ZW9mKCpyZCktOCkpOworCQlyZC0+bmFtZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCBuYW1lLCBuYW1lbGVuKSk7CisKKwkJZmQgPSBqZmZzMl93cml0ZV9kaXJlbnQoYywgZGlyX2YsIHJkLCBuYW1lLCBuYW1lbGVuLCBwaHlzX29mcywgQUxMT0NfREVMRVRJT04pOworCQkKKwkJamZmczJfZnJlZV9yYXdfZGlyZW50KHJkKTsKKworCQlpZiAoSVNfRVJSKGZkKSkgeworCQkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisJCQl1cCgmZGlyX2YtPnNlbSk7CisJCQlyZXR1cm4gUFRSX0VSUihmZCk7CisJCX0KKworCQkvKiBGaWxlIGl0LiBUaGlzIHdpbGwgbWFyayB0aGUgb2xkIG9uZSBvYnNvbGV0ZS4gKi8KKwkJamZmczJfYWRkX2ZkX3RvX2xpc3QoYywgZmQsICZkaXJfZi0+ZGVudHMpOworCQl1cCgmZGlyX2YtPnNlbSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICoqcHJldiA9ICZkaXJfZi0+ZGVudHM7CisJCXVpbnQzMl90IG5oYXNoID0gZnVsbF9uYW1lX2hhc2gobmFtZSwgbmFtZWxlbik7CisKKwkJZG93bigmZGlyX2YtPnNlbSk7CisKKwkJd2hpbGUgKCgqcHJldikgJiYgKCpwcmV2KS0+bmhhc2ggPD0gbmhhc2gpIHsKKwkJCWlmICgoKnByZXYpLT5uaGFzaCA9PSBuaGFzaCAmJiAKKwkJCSAgICAhbWVtY21wKCgqcHJldiktPm5hbWUsIG5hbWUsIG5hbWVsZW4pICYmCisJCQkgICAgISgqcHJldiktPm5hbWVbbmFtZWxlbl0pIHsKKwkJCQlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKnRoaXMgPSAqcHJldjsKKworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJNYXJraW5nIG9sZCBkaXJlbnQgbm9kZSAoaW5vICMldSkgQCUwOHggb2Jzb2xldGVcbiIsCisJCQkJCSAgdGhpcy0+aW5vLCByZWZfb2Zmc2V0KHRoaXMtPnJhdykpKTsKKworCQkJCSpwcmV2ID0gdGhpcy0+bmV4dDsKKwkJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgKHRoaXMtPnJhdykpOworCQkJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQodGhpcyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwcmV2ID0gJigoKnByZXYpLT5uZXh0KTsKKwkJfQorCQl1cCgmZGlyX2YtPnNlbSk7CisJfQorCisJLyogZGVhZF9mIGlzIE5VTEwgaWYgdGhpcyB3YXMgYSByZW5hbWUgbm90IGEgcmVhbCB1bmxpbmsgKi8KKwkvKiBBbHNvIGNhdGNoIHRoZSAhZi0+aW5vY2FjaGUgY2FzZSwgd2hlcmUgdGhlcmUgd2FzIGEgZGlyZW50CisJICAgcG9pbnRpbmcgdG8gYW4gaW5vZGUgd2hpY2ggZGlkbid0IGV4aXN0LiAqLworCWlmIChkZWFkX2YgJiYgZGVhZF9mLT5pbm9jYWNoZSkgeyAKKworCQlkb3duKCZkZWFkX2YtPnNlbSk7CisKKwkJd2hpbGUgKGRlYWRfZi0+ZGVudHMpIHsKKwkJCS8qIFRoZXJlIGNhbiBiZSBvbmx5IGRlbGV0ZWQgb25lcyAqLworCQkJZmQgPSBkZWFkX2YtPmRlbnRzOworCQkJCisJCQlkZWFkX2YtPmRlbnRzID0gZmQtPm5leHQ7CisJCQkKKwkJCWlmIChmZC0+aW5vKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGVsZXRpbmcgaW5vZGUgIyV1IHdpdGggYWN0aXZlIGRlbnRyeSBcIiVzXCItPmlubyAjJXVcbiIsCisJCQkJICAgICAgIGRlYWRfZi0+aW5vY2FjaGUtPmlubywgZmQtPm5hbWUsIGZkLT5pbm8pOworCQkJfSBlbHNlIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUmVtb3ZpbmcgZGVsZXRpb24gZGlyZW50IGZvciBcIiVzXCIgZnJvbSBkaXIgaW5vICMldVxuIiwgZmQtPm5hbWUsIGRlYWRfZi0+aW5vY2FjaGUtPmlubykpOworCQkJfQorCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGZkLT5yYXcpOworCQkJamZmczJfZnJlZV9mdWxsX2RpcmVudChmZCk7CisJCX0KKworCQlkZWFkX2YtPmlub2NhY2hlLT5ubGluay0tOworCQkvKiBOQjogQ2FsbGVyIG11c3Qgc2V0IGlub2RlIG5saW5rIGlmIGFwcHJvcHJpYXRlICovCisJCXVwKCZkZWFkX2YtPnNlbSk7CisJfQorCisJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgamZmczJfZG9fbGluayAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpkaXJfZiwgdWludDMyX3QgaW5vLCB1aW50OF90IHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQoreworCXN0cnVjdCBqZmZzMl9yYXdfZGlyZW50ICpyZDsKKwlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkOworCXVpbnQzMl90IGFsbG9jbGVuLCBwaHlzX29mczsKKwlpbnQgcmV0OworCisJcmQgPSBqZmZzMl9hbGxvY19yYXdfZGlyZW50KCk7CisJaWYgKCFyZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlKGMsIHNpemVvZigqcmQpK25hbWVsZW4sICZwaHlzX29mcywgJmFsbG9jbGVuLCBBTExPQ19OT1JNQUwpOworCWlmIChyZXQpIHsKKwkJamZmczJfZnJlZV9yYXdfZGlyZW50KHJkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJCisJZG93bigmZGlyX2YtPnNlbSk7CisKKwkvKiBCdWlsZCBhIGRlbGV0aW9uIG5vZGUgKi8KKwlyZC0+bWFnaWMgPSBjcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKTsKKwlyZC0+bm9kZXR5cGUgPSBjcHVfdG9famUxNihKRkZTMl9OT0RFVFlQRV9ESVJFTlQpOworCXJkLT50b3RsZW4gPSBjcHVfdG9famUzMihzaXplb2YoKnJkKSArIG5hbWVsZW4pOworCXJkLT5oZHJfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmQsIHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKS00KSk7CisKKwlyZC0+cGlubyA9IGNwdV90b19qZTMyKGRpcl9mLT5pbm9jYWNoZS0+aW5vKTsKKwlyZC0+dmVyc2lvbiA9IGNwdV90b19qZTMyKCsrZGlyX2YtPmhpZ2hlc3RfdmVyc2lvbik7CisJcmQtPmlubyA9IGNwdV90b19qZTMyKGlubyk7CisJcmQtPm1jdGltZSA9IGNwdV90b19qZTMyKGdldF9zZWNvbmRzKCkpOworCXJkLT5uc2l6ZSA9IG5hbWVsZW47CisKKwlyZC0+dHlwZSA9IHR5cGU7CisKKwlyZC0+bm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByZCwgc2l6ZW9mKCpyZCktOCkpOworCXJkLT5uYW1lX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIG5hbWUsIG5hbWVsZW4pKTsKKworCWZkID0gamZmczJfd3JpdGVfZGlyZW50KGMsIGRpcl9mLCByZCwgbmFtZSwgbmFtZWxlbiwgcGh5c19vZnMsIEFMTE9DX05PUk1BTCk7CisJCisJamZmczJfZnJlZV9yYXdfZGlyZW50KHJkKTsKKworCWlmIChJU19FUlIoZmQpKSB7CisJCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOworCQl1cCgmZGlyX2YtPnNlbSk7CisJCXJldHVybiBQVFJfRVJSKGZkKTsKKwl9CisKKwkvKiBGaWxlIGl0LiBUaGlzIHdpbGwgbWFyayB0aGUgb2xkIG9uZSBvYnNvbGV0ZS4gKi8KKwlqZmZzMl9hZGRfZmRfdG9fbGlzdChjLCBmZCwgJmRpcl9mLT5kZW50cyk7CisKKwlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwl1cCgmZGlyX2YtPnNlbSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3dyaXRldi5jIGIvZnMvamZmczIvd3JpdGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA3OWY4MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL3dyaXRldi5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiAkSWQ6IHdyaXRldi5jLHYgMS42IDIwMDQvMTEvMTYgMjA6MzY6MTIgZHdtdzIgRXhwICQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlICJub2RlbGlzdC5oIgorCisvKiBUaGlzIG91Z2h0IHRvIGJlIGluIGNvcmUgTVREIGNvZGUuIEFsbCByZWdpc3RlcmVkIE1URCBkZXZpY2VzCisgICB3aXRob3V0IHdyaXRldiBzaG91bGQgaGF2ZSB0aGlzIHB1dCBpbiBwbGFjZS4gQnVnIHRoZSBNVEQKKyAgIG1haW50YWluZXIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG10ZF9mYWtlX3dyaXRldihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3Qgc3RydWN0IGt2ZWMgKnZlY3MsCisJCQkJICB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgdG8sIHNpemVfdCAqcmV0bGVuKQoreworCXVuc2lnbmVkIGxvbmcgaTsKKwlzaXplX3QgdG90bGVuID0gMCwgdGhpc2xlbjsKKwlpbnQgcmV0ID0gMDsKKworCWZvciAoaT0wOyBpPGNvdW50OyBpKyspIHsKKwkJaWYgKCF2ZWNzW2ldLmlvdl9sZW4pCisJCQljb250aW51ZTsKKwkJcmV0ID0gbXRkLT53cml0ZShtdGQsIHRvLCB2ZWNzW2ldLmlvdl9sZW4sICZ0aGlzbGVuLCB2ZWNzW2ldLmlvdl9iYXNlKTsKKwkJdG90bGVuICs9IHRoaXNsZW47CisJCWlmIChyZXQgfHwgdGhpc2xlbiAhPSB2ZWNzW2ldLmlvdl9sZW4pCisJCQlicmVhazsKKwkJdG8gKz0gdmVjc1tpXS5pb3ZfbGVuOworCX0KKwlpZiAocmV0bGVuKQorCQkqcmV0bGVuID0gdG90bGVuOworCXJldHVybiByZXQ7Cit9CisKK2ludCBqZmZzMl9mbGFzaF9kaXJlY3Rfd3JpdGV2KHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBjb25zdCBzdHJ1Y3Qga3ZlYyAqdmVjcywKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCB0bywgc2l6ZV90ICpyZXRsZW4pCit7CisJaWYgKGMtPm10ZC0+d3JpdGV2KQorCQlyZXR1cm4gYy0+bXRkLT53cml0ZXYoYy0+bXRkLCB2ZWNzLCBjb3VudCwgdG8sIHJldGxlbik7CisJZWxzZQorCQlyZXR1cm4gbXRkX2Zha2Vfd3JpdGV2KGMtPm10ZCwgdmVjcywgY291bnQsIHRvLCByZXRsZW4pOworfQorCmRpZmYgLS1naXQgYS9mcy9qZnMvTWFrZWZpbGUgYi9mcy9qZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYxZTBlOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggSkZTIGZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19KRlNfRlMpICs9IGpmcy5vCisKK2pmcy15ICAgIDo9IHN1cGVyLm8gZmlsZS5vIGlub2RlLm8gbmFtZWkubyBqZnNfbW91bnQubyBqZnNfdW1vdW50Lm8gXAorCSAgICBqZnNfeHRyZWUubyBqZnNfaW1hcC5vIGpmc19kZWJ1Zy5vIGpmc19kbWFwLm8gXAorCSAgICBqZnNfdW5pY29kZS5vIGpmc19kdHJlZS5vIGpmc19pbm9kZS5vIFwKKwkgICAgamZzX2V4dGVudC5vIHN5bWxpbmsubyBqZnNfbWV0YXBhZ2UubyBcCisJICAgIGpmc19sb2dtZ3IubyBqZnNfdHhubWdyLm8gamZzX3VuaXVwci5vIHJlc2l6ZS5vIHhhdHRyLm8KKworamZzLSQoQ09ORklHX0pGU19QT1NJWF9BQ0wpICs9IGFjbC5vCisKK0VYVFJBX0NGTEFHUyArPSAtRF9KRlNfNEsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9hY2wuYyBiL2ZzL2pmcy9hY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDJhOWFiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2FjbC5jCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgIENvcnAuLCAyMDAyLTIwMDQKKyAqICAgQ29weXJpZ2h0IChDKSBBbmRyZWFzIEdydWVuYmFjaGVyLCAyMDAxCisgKiAgIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDE5OTEsIDE5OTIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSAiamZzX2luY29yZS5oIgorI2luY2x1ZGUgImpmc194YXR0ci5oIgorI2luY2x1ZGUgImpmc19hY2wuaCIKKworc3RhdGljIHN0cnVjdCBwb3NpeF9hY2wgKmpmc19nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwljaGFyICplYV9uYW1lOworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamkgPSBKRlNfSVAoaW5vZGUpOworCXN0cnVjdCBwb3NpeF9hY2wgKipwX2FjbDsKKwlpbnQgc2l6ZTsKKwljaGFyICp2YWx1ZSA9IE5VTEw7CisKKwlzd2l0Y2godHlwZSkgeworCQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKKwkJCWVhX25hbWUgPSBYQVRUUl9OQU1FX0FDTF9BQ0NFU1M7CisJCQlwX2FjbCA9ICZqaS0+aV9hY2w7CisJCQlicmVhazsKKwkJY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgorCQkJZWFfbmFtZSA9IFhBVFRSX05BTUVfQUNMX0RFRkFVTFQ7CisJCQlwX2FjbCA9ICZqaS0+aV9kZWZhdWx0X2FjbDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJaWYgKCpwX2FjbCAhPSBKRlNfQUNMX05PVF9DQUNIRUQpCisJCXJldHVybiBwb3NpeF9hY2xfZHVwKCpwX2FjbCk7CisKKwlzaXplID0gX19qZnNfZ2V0eGF0dHIoaW5vZGUsIGVhX25hbWUsIE5VTEwsIDApOworCisJaWYgKHNpemUgPiAwKSB7CisJCXZhbHVlID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCQlzaXplID0gX19qZnNfZ2V0eGF0dHIoaW5vZGUsIGVhX25hbWUsIHZhbHVlLCBzaXplKTsKKwl9CisKKwlpZiAoc2l6ZSA8IDApIHsKKwkJaWYgKHNpemUgPT0gLUVOT0RBVEEpIHsKKwkJCSpwX2FjbCA9IE5VTEw7CisJCQlhY2wgPSBOVUxMOworCQl9IGVsc2UKKwkJCWFjbCA9IEVSUl9QVFIoc2l6ZSk7CisJfSBlbHNlIHsKKwkJYWNsID0gcG9zaXhfYWNsX2Zyb21feGF0dHIodmFsdWUsIHNpemUpOworCQlpZiAoIUlTX0VSUihhY2wpKQorCQkJKnBfYWNsID0gcG9zaXhfYWNsX2R1cChhY2wpOworCX0KKwlpZiAodmFsdWUpCisJCWtmcmVlKHZhbHVlKTsKKwlyZXR1cm4gYWNsOworfQorCitzdGF0aWMgaW50IGpmc19zZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wpCit7CisJY2hhciAqZWFfbmFtZTsKKwlzdHJ1Y3QgamZzX2lub2RlX2luZm8gKmppID0gSkZTX0lQKGlub2RlKTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICoqcF9hY2w7CisJaW50IHJjOworCWludCBzaXplID0gMDsKKwljaGFyICp2YWx1ZSA9IE5VTEw7CisKKwlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJc3dpdGNoKHR5cGUpIHsKKwkJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6CisJCQllYV9uYW1lID0gWEFUVFJfTkFNRV9BQ0xfQUNDRVNTOworCQkJcF9hY2wgPSAmamktPmlfYWNsOworCQkJYnJlYWs7CisJCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKKwkJCWVhX25hbWUgPSBYQVRUUl9OQU1FX0FDTF9ERUZBVUxUOworCQkJcF9hY2wgPSAmamktPmlfZGVmYXVsdF9hY2w7CisJCQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCQkJcmV0dXJuIGFjbCA/IC1FQUNDRVMgOiAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGFjbCkgeworCQlzaXplID0geGF0dHJfYWNsX3NpemUoYWNsLT5hX2NvdW50KTsKKwkJdmFsdWUgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJjID0gcG9zaXhfYWNsX3RvX3hhdHRyKGFjbCwgdmFsdWUsIHNpemUpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCXJjID0gX19qZnNfc2V0eGF0dHIoaW5vZGUsIGVhX25hbWUsIHZhbHVlLCBzaXplLCAwKTsKK291dDoKKwlpZiAodmFsdWUpCisJCWtmcmVlKHZhbHVlKTsKKworCWlmICghcmMpIHsKKwkJaWYgKCpwX2FjbCAmJiAoKnBfYWNsICE9IEpGU19BQ0xfTk9UX0NBQ0hFRCkpCisJCQlwb3NpeF9hY2xfcmVsZWFzZSgqcF9hY2wpOworCQkqcF9hY2wgPSBwb3NpeF9hY2xfZHVwKGFjbCk7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBqZnNfY2hlY2tfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQoreworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamkgPSBKRlNfSVAoaW5vZGUpOworCisJaWYgKGppLT5pX2FjbCA9PSBKRlNfQUNMX05PVF9DQUNIRUQpIHsKKwkJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0gamZzX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7CisJCWlmIChJU19FUlIoYWNsKSkKKwkJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJfQorCisJaWYgKGppLT5pX2FjbCkKKwkJcmV0dXJuIHBvc2l4X2FjbF9wZXJtaXNzaW9uKGlub2RlLCBqaS0+aV9hY2wsIG1hc2spOworCXJldHVybiAtRUFHQUlOOworfQorCitpbnQgamZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXJldHVybiBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIGpmc19jaGVja19hY2wpOworfQorCitpbnQgamZzX2luaXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IE5VTEw7CisJc3RydWN0IHBvc2l4X2FjbCAqY2xvbmU7CisJbW9kZV90IG1vZGU7CisJaW50IHJjID0gMDsKKworCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gMDsKKworCWFjbCA9IGpmc19nZXRfYWNsKGRpciwgQUNMX1RZUEVfREVGQVVMVCk7CisJaWYgKElTX0VSUihhY2wpKQorCQlyZXR1cm4gUFRSX0VSUihhY2wpOworCisJaWYgKGFjbCkgeworCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQkJcmMgPSBqZnNfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgYWNsKTsKKwkJCWlmIChyYykKKwkJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjbG9uZSkgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCW1vZGUgPSBpbm9kZS0+aV9tb2RlOworCQlyYyA9IHBvc2l4X2FjbF9jcmVhdGVfbWFzcShjbG9uZSwgJm1vZGUpOworCQlpZiAocmMgPj0gMCkgeworCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCQlpZiAocmMgPiAwKQorCQkJCXJjID0gamZzX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgY2xvbmUpOworCQl9CisJCXBvc2l4X2FjbF9yZWxlYXNlKGNsb25lKTsKK2NsZWFudXA6CisJCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJfSBlbHNlCisJCWlub2RlLT5pX21vZGUgJj0gfmN1cnJlbnQtPmZzLT51bWFzazsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBqZnNfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsLCAqY2xvbmU7CisJaW50IHJjOworCisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWFjbCA9IGpmc19nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MpOworCWlmIChJU19FUlIoYWNsKSB8fCAhYWNsKQorCQlyZXR1cm4gUFRSX0VSUihhY2wpOworCisJY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfS0VSTkVMKTsKKwlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCWlmICghY2xvbmUpCisJCXJldHVybiAtRU5PTUVNOworCisJcmMgPSBwb3NpeF9hY2xfY2htb2RfbWFzcShjbG9uZSwgaW5vZGUtPmlfbW9kZSk7CisJaWYgKCFyYykKKwkJcmMgPSBqZnNfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBjbG9uZSk7CisKKwlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CisJcmV0dXJuIHJjOworfQorCitpbnQgamZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmlhdHRyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IHJjOworCisJcmMgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGlhdHRyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmICgoaWF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQgJiYgaWF0dHItPmlhX3VpZCAhPSBpbm9kZS0+aV91aWQpIHx8CisJICAgIChpYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCAmJiBpYXR0ci0+aWFfZ2lkICE9IGlub2RlLT5pX2dpZCkpIHsKKwkJaWYgKERRVU9UX1RSQU5TRkVSKGlub2RlLCBpYXR0cikpCisJCQlyZXR1cm4gLUVEUVVPVDsKKwl9CisKKwlyYyA9IGlub2RlX3NldGF0dHIoaW5vZGUsIGlhdHRyKTsKKworCWlmICghcmMgJiYgKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkpCisJCXJjID0gamZzX2FjbF9jaG1vZChpbm9kZSk7CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9mcy9qZnMvZW5kaWFuMjQuaCBiL2ZzL2pmcy9lbmRpYW4yNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiN2NkMDUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvZW5kaWFuMjQuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDEKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfSF9FTkRJQU4yNAorI2RlZmluZQlfSF9FTkRJQU4yNAorCisvKgorICoJZW5kaWFuMjQuaDoKKyAqCisgKiBFbmRpYW4gY29udmVyc2lvbiBmb3IgMjQtYnl0ZSBkYXRhCisgKgorICovCisjZGVmaW5lIF9fc3dhYjI0KHgpIFwKKyh7IFwKKwlfX3UzMiBfX3ggPSAoeCk7IFwKKwkoKF9fdTMyKSggXAorCQkoKF9feCAmIChfX3UzMikweDAwMDAwMGZmVUwpIDw8IDE2KSB8IFwKKwkJIChfX3ggJiAoX191MzIpMHgwMDAwZmYwMFVMKSAgICAgICAgfCBcCisJCSgoX194ICYgKF9fdTMyKTB4MDBmZjAwMDBVTCkgPj4gMTYpICkpOyBcCit9KQorCisjaWYgKGRlZmluZWQoX19LRVJORUxfXykgJiYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pKSB8fCAoZGVmaW5lZChfX0JZVEVfT1JERVIpICYmIChfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOKSkKKwkjZGVmaW5lIF9fY3B1X3RvX2xlMjQoeCkgKChfX3UzMikoeCkpCisJI2RlZmluZSBfX2xlMjRfdG9fY3B1KHgpICgoX191MzIpKHgpKQorI2Vsc2UKKwkjZGVmaW5lIF9fY3B1X3RvX2xlMjQoeCkgX19zd2FiMjQoeCkKKwkjZGVmaW5lIF9fbGUyNF90b19jcHUoeCkgX19zd2FiMjQoeCkKKyNlbmRpZgorCisjaWZkZWYgX19LRVJORUxfXworCSNkZWZpbmUgY3B1X3RvX2xlMjQgX19jcHVfdG9fbGUyNAorCSNkZWZpbmUgbGUyNF90b19jcHUgX19sZTI0X3RvX2NwdQorI2VuZGlmCisKKyNlbmRpZgkJCQkvKiAhX0hfRU5ESUFOMjQgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9maWxlLmMgYi9mcy9qZnMvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4N2IwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvZmlsZS5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwMgorICogICBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIENocmlzdG9waCBIZWxsd2lnLCAyMDAxLTIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlICJqZnNfaW5jb3JlLmgiCisjaW5jbHVkZSAiamZzX2RtYXAuaCIKKyNpbmNsdWRlICJqZnNfdHhubWdyLmgiCisjaW5jbHVkZSAiamZzX3hhdHRyLmgiCisjaW5jbHVkZSAiamZzX2FjbC5oIgorI2luY2x1ZGUgImpmc19kZWJ1Zy5oIgorCisKK2V4dGVybiBpbnQgamZzX2NvbW1pdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKK2V4dGVybiB2b2lkIGpmc190cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKik7CisKK2ludCBqZnNfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IHJjID0gMDsKKworCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWSkgfHwKKwkgICAgKGRhdGFzeW5jICYmICEoaW5vZGUtPmlfc3RhdGUgJiBJX0RJUlRZX0RBVEFTWU5DKSkpIHsKKwkJLyogTWFrZSBzdXJlIGNvbW1pdHRlZCBjaGFuZ2VzIGhpdCB0aGUgZGlzayAqLworCQlqZnNfZmx1c2hfam91cm5hbChKRlNfU0JJKGlub2RlLT5pX3NiKS0+bG9nLCAxKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjIHw9IGpmc19jb21taXRfaW5vZGUoaW5vZGUsIDEpOworCisJcmV0dXJuIHJjID8gLUVJTyA6IDA7Cit9CisKK3N0YXRpYyBpbnQgamZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJjOworCisJaWYgKChyYyA9IGdlbmVyaWNfZmlsZV9vcGVuKGlub2RlLCBmaWxlKSkpCisJCXJldHVybiByYzsKKworCS8qCisJICogV2UgYXR0ZW1wdCB0byBhbGxvdyBvbmx5IG9uZSAiYWN0aXZlIiBmaWxlIG9wZW4gcGVyIGFnZ3JlZ2F0ZQorCSAqIGdyb3VwLiAgT3RoZXJ3aXNlLCBhcHBlbmRpbmcgdG8gZmlsZXMgaW4gcGFyYWxsZWwgY2FuIGNhdXNlCisJICogZnJhZ21lbnRhdGlvbiB3aXRoaW4gdGhlIGZpbGVzLgorCSAqCisJICogSWYgdGhlIGZpbGUgaXMgZW1wdHksIGl0IHdhcyBwcm9iYWJseSBqdXN0IGNyZWF0ZWQgYW5kIGdvaW5nCisJICogdG8gYmUgd3JpdHRlbiB0by4gIElmIGl0IGhhcyBhIHNpemUsIHdlJ2xsIGhvbGQgb2ZmIHVudGlsIHRoZQorCSAqIGZpbGUgaXMgYWN0dWFsbHkgZ3Jvd24uCisJICovCisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYKKwkgICAgKGlub2RlLT5pX3NpemUgPT0gMCkpIHsKKwkJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqaSA9IEpGU19JUChpbm9kZSk7CisJCXNwaW5fbG9ja19pcnEoJmppLT5hZ19sb2NrKTsKKwkJaWYgKGppLT5hY3RpdmVfYWcgPT0gLTEpIHsKKwkJCWppLT5hY3RpdmVfYWcgPSBqaS0+YWdubzsKKwkJCWF0b21pY19pbmMoCisJCQkgICAgJkpGU19TQkkoaW5vZGUtPmlfc2IpLT5ibWFwLT5kYl9hY3RpdmVbamktPmFnbm9dKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnEoJmppLT5hZ19sb2NrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgamZzX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqaSA9IEpGU19JUChpbm9kZSk7CisKKwlzcGluX2xvY2tfaXJxKCZqaS0+YWdfbG9jayk7CisJaWYgKGppLT5hY3RpdmVfYWcgIT0gLTEpIHsKKwkJc3RydWN0IGJtYXAgKmJtYXAgPSBKRlNfU0JJKGlub2RlLT5pX3NiKS0+Ym1hcDsKKwkJYXRvbWljX2RlYygmYm1hcC0+ZGJfYWN0aXZlW2ppLT5hY3RpdmVfYWddKTsKKwkJamktPmFjdGl2ZV9hZyA9IC0xOworCX0KKwlzcGluX3VubG9ja19pcnEoJmppLT5hZ19sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBqZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0geworCS50cnVuY2F0ZQk9IGpmc190cnVuY2F0ZSwKKwkuc2V0eGF0dHIJPSBqZnNfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gamZzX2dldHhhdHRyLAorCS5saXN0eGF0dHIJPSBqZnNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGpmc19yZW1vdmV4YXR0ciwKKyNpZmRlZiBDT05GSUdfSkZTX1BPU0lYX0FDTAorCS5zZXRhdHRyCT0gamZzX3NldGF0dHIsCisJLnBlcm1pc3Npb24JPSBqZnNfcGVybWlzc2lvbiwKKyNlbmRpZgorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBqZnNfZmlsZV9vcGVyYXRpb25zID0geworCS5vcGVuCQk9IGpmc19vcGVuLAorCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkud3JpdGUJCT0gZ2VuZXJpY19maWxlX3dyaXRlLAorCS5yZWFkCQk9IGdlbmVyaWNfZmlsZV9yZWFkLAorCS5haW9fcmVhZAk9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKKwkuYWlvX3dyaXRlCT0gZ2VuZXJpY19maWxlX2Fpb193cml0ZSwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkucmVhZHYJCT0gZ2VuZXJpY19maWxlX3JlYWR2LAorCS53cml0ZXYJCT0gZ2VuZXJpY19maWxlX3dyaXRldiwKKyAJLnNlbmRmaWxlCT0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorCS5mc3luYwkJPSBqZnNfZnN5bmMsCisJLnJlbGVhc2UJPSBqZnNfcmVsZWFzZSwKK307CmRpZmYgLS1naXQgYS9mcy9qZnMvaW5vZGUuYyBiL2ZzL2pmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzkwNjYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvaW5vZGUuYwpAQCAtMCwwICsxLDM4NCBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAwLTIwMDQKKyAqICAgUG9ydGlvbnMgQ29weXJpZ2h0IChDKSBDaHJpc3RvcGggSGVsbHdpZywgMjAwMS0yMDAyCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKKyNpbmNsdWRlICJqZnNfZmlsc3lzLmgiCisjaW5jbHVkZSAiamZzX2ltYXAuaCIKKyNpbmNsdWRlICJqZnNfZXh0ZW50LmgiCisjaW5jbHVkZSAiamZzX3VuaWNvZGUuaCIKKyNpbmNsdWRlICJqZnNfZGVidWcuaCIKKworCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgamZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGpmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgamZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGpmc19kaXJfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGpmc19maWxlX29wZXJhdGlvbnM7CitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGpmc19hb3BzOworZXh0ZXJuIGludCBmcmVlWmVyb0xpbmsoc3RydWN0IGlub2RlICopOworCit2b2lkIGpmc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKGRpUmVhZChpbm9kZSkpIHsgCisJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJmpmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZqZnNfZmlsZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZqZnNfYW9wczsKKwl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmamZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmamZzX2Rpcl9vcGVyYXRpb25zOworCX0gZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgeworCQlpZiAoaW5vZGUtPmlfc2l6ZSA+PSBJREFUQVNJWkUpIHsKKwkJCWlub2RlLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmamZzX2FvcHM7CisJCX0gZWxzZQorCQkJaW5vZGUtPmlfb3AgPSAmamZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwl9IGVsc2UgeworCQlpbm9kZS0+aV9vcCA9ICZqZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsIGlub2RlLT5pX3JkZXYpOworCX0KK30KKworLyoKKyAqIFdvcmtob3JzZSBvZiBib3RoIGZzeW5jICYgd3JpdGVfaW5vZGUKKyAqLworaW50IGpmc19jb21taXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHdhaXQpCit7CisJaW50IHJjID0gMDsKKwl0aWRfdCB0aWQ7CisJc3RhdGljIGludCBub2lzeSA9IDU7CisKKwlqZnNfaW5mbygiSW4gamZzX2NvbW1pdF9pbm9kZSwgaW5vZGUgPSAweCVwIiwgaW5vZGUpOworCisJLyoKKwkgKiBEb24ndCBjb21taXQgaWYgaW5vZGUgaGFzIGJlZW4gY29tbWl0dGVkIHNpbmNlIGxhc3QgYmVpbmcKKwkgKiBtYXJrZWQgZGlydHksIG9yIGlmIGl0IGhhcyBiZWVuIGRlbGV0ZWQuCisJICovCisJaWYgKGlub2RlLT5pX25saW5rID09IDAgfHwgIXRlc3RfY2ZsYWcoQ09NTUlUX0RpcnR5LCBpbm9kZSkpCisJCXJldHVybiAwOworCisJaWYgKGlzUmVhZE9ubHkoaW5vZGUpKSB7CisJCS8qIGtlcm5lbCBhbGxvd3Mgd3JpdGVzIHRvIGRldmljZXMgb24gcmVhZC1vbmx5CisJCSAqIHBhcnRpdGlvbnMgYW5kIG1heSB0aGluayBpbm9kZSBpcyBkaXJ0eQorCQkgKi8KKwkJaWYgKCFzcGVjaWFsX2ZpbGUoaW5vZGUtPmlfbW9kZSkgJiYgbm9pc3kpIHsKKwkJCWpmc19lcnIoImpmc19jb21taXRfaW5vZGUoMHglcCkgY2FsbGVkIG9uICIKKwkJCQkgICAicmVhZC1vbmx5IHZvbHVtZSIsIGlub2RlKTsKKwkJCWpmc19lcnIoIklzIHJlbW91bnQgcmFjeT8iKTsKKwkJCW5vaXN5LS07CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJdGlkID0gdHhCZWdpbihpbm9kZS0+aV9zYiwgQ09NTUlUX0lOT0RFKTsKKwlkb3duKCZKRlNfSVAoaW5vZGUpLT5jb21taXRfc2VtKTsKKworCS8qCisJICogUmV0ZXN0IGlub2RlIHN0YXRlIGFmdGVyIHRha2luZyBjb21taXRfc2VtCisJICovCisJaWYgKGlub2RlLT5pX25saW5rICYmIHRlc3RfY2ZsYWcoQ09NTUlUX0RpcnR5LCBpbm9kZSkpCisJCXJjID0gdHhDb21taXQodGlkLCAxLCAmaW5vZGUsIHdhaXQgPyBDT01NSVRfU1lOQyA6IDApOworCisJdHhFbmQodGlkKTsKKwl1cCgmSkZTX0lQKGlub2RlKS0+Y29tbWl0X3NlbSk7CisJcmV0dXJuIHJjOworfQorCitpbnQgamZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB3YWl0KQoreworCWlmICh0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlub2RlKSkKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBJZiBDT01NSVRfRElSVFkgaXMgbm90IHNldCwgdGhlIGlub2RlIGlzbid0IHJlYWxseSBkaXJ0eS4KKwkgKiBJdCBoYXMgYmVlbiBjb21taXR0ZWQgc2luY2UgdGhlIGxhc3QgY2hhbmdlLCBidXQgd2FzIHN0aWxsCisJICogb24gdGhlIGRpcnR5IGlub2RlIGxpc3QuCisJICovCisJIGlmICghdGVzdF9jZmxhZyhDT01NSVRfRGlydHksIGlub2RlKSkgeworCQkvKiBNYWtlIHN1cmUgY29tbWl0dGVkIGNoYW5nZXMgaGl0IHRoZSBkaXNrICovCisJCWpmc19mbHVzaF9qb3VybmFsKEpGU19TQkkoaW5vZGUtPmlfc2IpLT5sb2csIHdhaXQpOworCQlyZXR1cm4gMDsKKwkgfQorCisJaWYgKGpmc19jb21taXRfaW5vZGUoaW5vZGUsIHdhaXQpKSB7CisJCWpmc19lcnIoImpmc193cml0ZV9pbm9kZTogamZzX2NvbW1pdF9pbm9kZSBmYWlsZWQhIik7CisJCXJldHVybiAtRUlPOworCX0gZWxzZQorCQlyZXR1cm4gMDsKK30KKwordm9pZCBqZnNfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJamZzX2luZm8oIkluIGpmc19kZWxldGVfaW5vZGUsIGlub2RlID0gMHglcCIsIGlub2RlKTsKKworCWlmICh0ZXN0X2NmbGFnKENPTU1JVF9GcmVld21hcCwgaW5vZGUpKQorCQlmcmVlWmVyb0xpbmsoaW5vZGUpOworCisJZGlGcmVlKGlub2RlKTsKKworCS8qCisJICogRnJlZSB0aGUgaW5vZGUgZnJvbSB0aGUgcXVvdGEgYWxsb2NhdGlvbi4KKwkgKi8KKwlEUVVPVF9JTklUKGlub2RlKTsKKwlEUVVPVF9GUkVFX0lOT0RFKGlub2RlKTsKKwlEUVVPVF9EUk9QKGlub2RlKTsKKworCWNsZWFyX2lub2RlKGlub2RlKTsKK30KKwordm9pZCBqZnNfZGlydHlfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdGF0aWMgaW50IG5vaXN5ID0gNTsKKworCWlmIChpc1JlYWRPbmx5KGlub2RlKSkgeworCQlpZiAoIXNwZWNpYWxfZmlsZShpbm9kZS0+aV9tb2RlKSAmJiBub2lzeSkgeworCQkJLyoga2VybmVsIGFsbG93cyB3cml0ZXMgdG8gZGV2aWNlcyBvbiByZWFkLW9ubHkKKwkJCSAqIHBhcnRpdGlvbnMgYW5kIG1heSB0cnkgdG8gbWFyayBpbm9kZSBkaXJ0eQorCQkJICovCisJCQlqZnNfZXJyKCJqZnNfZGlydHlfaW5vZGUgY2FsbGVkIG9uIHJlYWQtb25seSB2b2x1bWUiKTsKKwkJCWpmc19lcnIoIklzIHJlbW91bnQgcmFjeT8iKTsKKwkJCW5vaXN5LS07CisJCX0KKwkJcmV0dXJuOworCX0KKworCXNldF9jZmxhZyhDT01NSVRfRGlydHksIGlub2RlKTsKK30KKworc3RhdGljIGludAoramZzX2dldF9ibG9ja3Moc3RydWN0IGlub2RlICppcCwgc2VjdG9yX3QgbGJsb2NrLCB1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MsCisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK3sKKwlzNjQgbGJsb2NrNjQgPSBsYmxvY2s7CisJaW50IHJjID0gMDsKKwlpbnQgdGFrZV9sb2NrczsKKwl4YWRfdCB4YWQ7CisJczY0IHhhZGRyOworCWludCB4ZmxhZzsKKwlzMzIgeGxlbjsKKworCS8qCisJICogSWYgdGhpcyBpcyBhIHNwZWNpYWwgaW5vZGUgKGltYXAsIGRtYXApCisJICogdGhlIGxvY2sgc2hvdWxkIGFscmVhZHkgYmUgdGFrZW4KKwkgKi8KKwl0YWtlX2xvY2tzID0gKEpGU19JUChpcCktPmZpbGVzZXQgIT0gQUdHUkVHQVRFX0kpOworCisJLyoKKwkgKiBUYWtlIGFwcHJvcHJpYXRlIGxvY2sgb24gaW5vZGUKKwkgKi8KKwlpZiAodGFrZV9sb2NrcykgeworCQlpZiAoY3JlYXRlKQorCQkJSVdSSVRFX0xPQ0soaXApOworCQllbHNlCisJCQlJUkVBRF9MT0NLKGlwKTsKKwl9CisKKwlpZiAoKChsYmxvY2s2NCA8PCBpcC0+aV9zYi0+c19ibG9ja3NpemVfYml0cykgPCBpcC0+aV9zaXplKSAmJgorCSAgICAoeHRMb29rdXAoaXAsIGxibG9jazY0LCBtYXhfYmxvY2tzLCAmeGZsYWcsICZ4YWRkciwgJnhsZW4sIDApCisJICAgICA9PSAwKSAmJiB4bGVuKSB7CisJCWlmICh4ZmxhZyAmIFhBRF9OT1RSRUNPUkRFRCkgeworCQkJaWYgKCFjcmVhdGUpCisJCQkJLyoKKwkJCQkgKiBBbGxvY2F0ZWQgYnV0IG5vdCByZWNvcmRlZCwgcmVhZCB0cmVhdHMKKwkJCQkgKiB0aGlzIGFzIGEgaG9sZQorCQkJCSAqLworCQkJCWdvdG8gdW5sb2NrOworI2lmZGVmIF9KRlNfNEsKKwkJCVhBRG9mZnNldCgmeGFkLCBsYmxvY2s2NCk7CisJCQlYQURsZW5ndGgoJnhhZCwgeGxlbik7CisJCQlYQURhZGRyZXNzKCZ4YWQsIHhhZGRyKTsKKyNlbHNlCQkJCS8qIF9KRlNfNEsgKi8KKwkJCS8qCisJCQkgKiBBcyBsb25nIGFzIGJsb2NrIHNpemUgPSA0SywgdGhpcyBpc24ndCBhIHByb2JsZW0uCisJCQkgKiBXZSBzaG91bGQgbWFyayB0aGUgd2hvbGUgcGFnZSBub3QgQUJOUiwgYnV0IGhvdworCQkJICogd2lsbCB3ZSBrbm93IHRvIG1hcmsgdGhlIG90aGVyIGJsb2NrcyBCSF9OZXc/CisJCQkgKi8KKwkJCUJVRygpOworI2VuZGlmCQkJCS8qIF9KRlNfNEsgKi8KKwkJCXJjID0gZXh0UmVjb3JkKGlwLCAmeGFkKTsKKwkJCWlmIChyYykKKwkJCQlnb3RvIHVubG9jazsKKwkJCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJCX0KKworCQltYXBfYmgoYmhfcmVzdWx0LCBpcC0+aV9zYiwgeGFkZHIpOworCQliaF9yZXN1bHQtPmJfc2l6ZSA9IHhsZW4gPDwgaXAtPmlfYmxrYml0czsKKwkJZ290byB1bmxvY2s7CisJfQorCWlmICghY3JlYXRlKQorCQlnb3RvIHVubG9jazsKKworCS8qCisJICogQWxsb2NhdGUgYSBuZXcgYmxvY2sKKwkgKi8KKyNpZmRlZiBfSkZTXzRLCisJaWYgKChyYyA9IGV4dEhpbnQoaXAsIGxibG9jazY0IDw8IGlwLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzLCAmeGFkKSkpCisJCWdvdG8gdW5sb2NrOworCXJjID0gZXh0QWxsb2MoaXAsIG1heF9ibG9ja3MsIGxibG9jazY0LCAmeGFkLCBGQUxTRSk7CisJaWYgKHJjKQorCQlnb3RvIHVubG9jazsKKworCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJbWFwX2JoKGJoX3Jlc3VsdCwgaXAtPmlfc2IsIGFkZHJlc3NYQUQoJnhhZCkpOworCWJoX3Jlc3VsdC0+Yl9zaXplID0gbGVuZ3RoWEFEKCZ4YWQpIDw8IGlwLT5pX2Jsa2JpdHM7CisKKyNlbHNlCQkJCS8qIF9KRlNfNEsgKi8KKwkvKgorCSAqIFdlIG5lZWQgdG8gZG8gd2hhdGV2ZXIgaXQgdGFrZXMgdG8ga2VlcCBhbGwgYnV0IHRoZSBsYXN0IGJ1ZmZlcnMKKwkgKiBpbiA0SyBwYWdlcyAtIHNlZSBqZnNfd3JpdGUuYworCSAqLworCUJVRygpOworI2VuZGlmCQkJCS8qIF9KRlNfNEsgKi8KKworICAgICAgdW5sb2NrOgorCS8qCisJICogUmVsZWFzZSBsb2NrIG9uIGlub2RlCisJICovCisJaWYgKHRha2VfbG9ja3MpIHsKKwkJaWYgKGNyZWF0ZSkKKwkJCUlXUklURV9VTkxPQ0soaXApOworCQllbHNlCisJCQlJUkVBRF9VTkxPQ0soaXApOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgamZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlwLCBzZWN0b3JfdCBsYmxvY2ssCisJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJcmV0dXJuIGpmc19nZXRfYmxvY2tzKGlwLCBsYmxvY2ssIDEsIGJoX3Jlc3VsdCwgY3JlYXRlKTsKK30KKworc3RhdGljIGludCBqZnNfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlyZXR1cm4gbm9iaF93cml0ZXBhZ2UocGFnZSwgamZzX2dldF9ibG9jaywgd2JjKTsKK30KKworc3RhdGljIGludCBqZnNfd3JpdGVwYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXJldHVybiBtcGFnZV93cml0ZXBhZ2VzKG1hcHBpbmcsIHdiYywgamZzX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgamZzX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gbXBhZ2VfcmVhZHBhZ2UocGFnZSwgamZzX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgamZzX3JlYWRwYWdlcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCXN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzLCB1bnNpZ25lZCBucl9wYWdlcykKK3sKKwlyZXR1cm4gbXBhZ2VfcmVhZHBhZ2VzKG1hcHBpbmcsIHBhZ2VzLCBucl9wYWdlcywgamZzX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgamZzX3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlyZXR1cm4gbm9iaF9wcmVwYXJlX3dyaXRlKHBhZ2UsIGZyb20sIHRvLCBqZnNfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIHNlY3Rvcl90IGpmc19ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jaykKK3sKKwlyZXR1cm4gZ2VuZXJpY19ibG9ja19ibWFwKG1hcHBpbmcsIGJsb2NrLCBqZnNfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIHNzaXplX3QgamZzX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwKKwljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCisJcmV0dXJuIGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlub2RlLT5pX3NiLT5zX2JkZXYsIGlvdiwKKwkJCQlvZmZzZXQsIG5yX3NlZ3MsIGpmc19nZXRfYmxvY2tzLCBOVUxMKTsKK30KKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBqZnNfYW9wcyA9IHsKKwkucmVhZHBhZ2UJPSBqZnNfcmVhZHBhZ2UsCisJLnJlYWRwYWdlcwk9IGpmc19yZWFkcGFnZXMsCisJLndyaXRlcGFnZQk9IGpmc193cml0ZXBhZ2UsCisJLndyaXRlcGFnZXMJPSBqZnNfd3JpdGVwYWdlcywKKwkuc3luY19wYWdlCT0gYmxvY2tfc3luY19wYWdlLAorCS5wcmVwYXJlX3dyaXRlCT0gamZzX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZQk9IG5vYmhfY29tbWl0X3dyaXRlLAorCS5ibWFwCQk9IGpmc19ibWFwLAorCS5kaXJlY3RfSU8JPSBqZnNfZGlyZWN0X0lPLAorfTsKKworLyoKKyAqIEd1dHMgb2YgamZzX3RydW5jYXRlLiAgQ2FsbGVkIHdpdGggbG9ja3MgYWxyZWFkeSBoZWxkLiAgQ2FuIGJlIGNhbGxlZAorICogd2l0aCBkaXJlY3RvcnkgZm9yIHRydW5jYXRpbmcgZGlyZWN0b3J5IGluZGV4IHRhYmxlLgorICovCit2b2lkIGpmc190cnVuY2F0ZV9ub2xvY2soc3RydWN0IGlub2RlICppcCwgbG9mZl90IGxlbmd0aCkKK3sKKwlsb2ZmX3QgbmV3c2l6ZTsKKwl0aWRfdCB0aWQ7CisKKwlBU1NFUlQobGVuZ3RoID49IDApOworCisJaWYgKHRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCXh0VHJ1bmNhdGUoMCwgaXAsIGxlbmd0aCwgQ09NTUlUX1dNQVApOworCQlyZXR1cm47CisJfQorCisJZG8geworCQl0aWQgPSB0eEJlZ2luKGlwLT5pX3NiLCAwKTsKKworCQkvKgorCQkgKiBUaGUgY29tbWl0X3NlbSBjYW5ub3QgYmUgdGFrZW4gYmVmb3JlIHR4QmVnaW4uCisJCSAqIHR4QmVnaW4gbWF5IGJsb2NrIGFuZCB0aGVyZSBpcyBhIGNoYW5jZSB0aGUgaW5vZGUKKwkJICogY291bGQgYmUgbWFya2VkIGRpcnR5IGFuZCBuZWVkIHRvIGJlIGNvbW1pdHRlZAorCQkgKiBiZWZvcmUgdHhCZWdpbiB1bmJsb2NrcworCQkgKi8KKwkJZG93bigmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisKKwkJbmV3c2l6ZSA9IHh0VHJ1bmNhdGUodGlkLCBpcCwgbGVuZ3RoLAorCQkJCSAgICAgQ09NTUlUX1RSVU5DQVRFIHwgQ09NTUlUX1BXTUFQKTsKKwkJaWYgKG5ld3NpemUgPCAwKSB7CisJCQl0eEVuZCh0aWQpOworCQkJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCQkJYnJlYWs7CisJCX0KKworCQlpcC0+aV9tdGltZSA9IGlwLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCQltYXJrX2lub2RlX2RpcnR5KGlwKTsKKworCQl0eENvbW1pdCh0aWQsIDEsICZpcCwgMCk7CisJCXR4RW5kKHRpZCk7CisJCXVwKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKwl9IHdoaWxlIChuZXdzaXplID4gbGVuZ3RoKTsJLyogVHJ1bmNhdGUgaXNuJ3QgYWx3YXlzIGF0b21pYyAqLworfQorCit2b2lkIGpmc190cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlwKQoreworCWpmc19pbmZvKCJqZnNfdHJ1bmNhdGU6IHNpemUgPSAweCVseCIsICh1bG9uZykgaXAtPmlfc2l6ZSk7CisKKwlub2JoX3RydW5jYXRlX3BhZ2UoaXAtPmlfbWFwcGluZywgaXAtPmlfc2l6ZSk7CisKKwlJV1JJVEVfTE9DSyhpcCk7CisJamZzX3RydW5jYXRlX25vbG9jayhpcCwgaXAtPmlfc2l6ZSk7CisJSVdSSVRFX1VOTE9DSyhpcCk7Cit9CmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2FjbC5oIGIvZnMvamZzL2pmc19hY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmFlNDMwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19hY2wuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgIENvcnAuLCAyMDAyCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYgX0hfSkZTX0FDTAorI2RlZmluZSBfSF9KRlNfQUNMCisKKyNpZmRlZiBDT05GSUdfSkZTX1BPU0lYX0FDTAorCisjaW5jbHVkZSA8bGludXgveGF0dHJfYWNsLmg+CisKK2ludCBqZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKiwgaW50LCBzdHJ1Y3QgbmFtZWlkYXRhICopOworaW50IGpmc19pbml0X2FjbChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlub2RlICopOworaW50IGpmc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlhdHRyICopOworCisjZW5kaWYJCS8qIENPTkZJR19KRlNfUE9TSVhfQUNMICovCisjZW5kaWYJCS8qIF9IX0pGU19BQ0wgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfYnRyZWUuaCBiL2ZzL2pmcy9qZnNfYnRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjNlOWFjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19idHJlZS5oCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwNAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmCV9IX0pGU19CVFJFRQorI2RlZmluZSBfSF9KRlNfQlRSRUUKKworLyoKKyAqCWpmc19idHJlZS5oOiBCKy10cmVlCisgKgorICogSkZTIEIrLXRyZWUgKGR0cmVlIGFuZCB4dHJlZSkgY29tbW9uIGRlZmluaXRpb25zCisgKi8KKworLyoKKyAqCWJhc2ljIGJ0cmVlIHBhZ2UgLSBidHBhZ2UKKyAqCitzdHJ1Y3QgYnRwYWdlIHsKKwlzNjQgbmV4dDsJCXJpZ2h0IHNpYmxpbmcgYm4KKwlzNjQgcHJldjsJCWxlZnQgc2libGluZyBibgorCisJdTggZmxhZzsKKwl1OCByc3J2ZFs3XTsJCXR5cGUgc3BlY2lmaWMKKwlzNjQgc2VsZjsJCXNlbGYgYWRkcmVzcworCisJdTggZW50cnlbNDA2NF07Cit9OwkJCQkJCSovCisKKy8qIGJ0cGFnZXRfdCBmbGFnICovCisjZGVmaW5lIEJUX1RZUEUJCTB4MDcJLyogQistdHJlZSBpbmRleCAqLworI2RlZmluZQlCVF9ST09UCQkweDAxCS8qIHJvb3QgcGFnZSAqLworI2RlZmluZQlCVF9MRUFGCQkweDAyCS8qIGxlYWYgcGFnZSAqLworI2RlZmluZQlCVF9JTlRFUk5BTAkweDA0CS8qIGludGVybmFsIHBhZ2UgKi8KKyNkZWZpbmUJQlRfUklHSFRNT1NUCTB4MTAJLyogcmlnaHRtb3N0IHBhZ2UgKi8KKyNkZWZpbmUJQlRfTEVGVE1PU1QJMHgyMAkvKiBsZWZ0bW9zdCBwYWdlICovCisjZGVmaW5lCUJUX1NXQVBQRUQJMHg4MAkvKiB1c2VkIGJ5IGZzY2sgZm9yIGVuZGlhbiBzd2FwcGluZyAqLworCisvKiBidG9yZGVyIChpbiBpbm9kZSkgKi8KKyNkZWZpbmUJQlRfUkFORE9NCQkweDAwMDAKKyNkZWZpbmUJQlRfU0VRVUVOVElBTAkJMHgwMDAxCisjZGVmaW5lCUJUX0xPT0tVUAkJMHgwMDEwCisjZGVmaW5lCUJUX0lOU0VSVAkJMHgwMDIwCisjZGVmaW5lCUJUX0RFTEVURQkJMHgwMDQwCisKKy8qCisgKglidHJlZSBwYWdlIGJ1ZmZlciBjYWNoZSBhY2Nlc3MKKyAqLworI2RlZmluZSBCVF9JU19ST09UKE1QKSAoKChNUCktPnhmbGFnICYgQ09NTUlUX1BBR0UpID09IDApCisKKy8qIGdldCBwYWdlIGZyb20gYnVmZmVyIHBhZ2UgKi8KKyNkZWZpbmUgQlRfUEFHRShJUCwgTVAsIFRZUEUsIFJPT1QpXAorCShCVF9JU19ST09UKE1QKSA/IChUWVBFICopJkpGU19JUChJUCktPlJPT1QgOiAoVFlQRSAqKShNUCktPmRhdGEpCisKKy8qIGdldCB0aGUgcGFnZSBidWZmZXIgYW5kIHRoZSBwYWdlIGZvciBzcGVjaWZpZWQgYmxvY2sgYWRkcmVzcyAqLworI2RlZmluZSBCVF9HRVRQQUdFKElQLCBCTiwgTVAsIFRZUEUsIFNJWkUsIFAsIFJDLCBST09UKVwKK3tcCisJaWYgKChCTikgPT0gMClcCisJe1wKKwkJTVAgPSAoc3RydWN0IG1ldGFwYWdlICopJkpGU19JUChJUCktPmJ4ZmxhZztcCisJCVAgPSAoVFlQRSAqKSZKRlNfSVAoSVApLT5ST09UO1wKKwkJUkMgPSAwO1wKKwl9XAorCWVsc2VcCisJe1wKKwkJTVAgPSByZWFkX21ldGFwYWdlKChJUCksIEJOLCBTSVpFLCAxKTtcCisJCWlmIChNUCkge1wKKwkJCVJDID0gMDtcCisJCQlQID0gKE1QKS0+ZGF0YTtcCisJCX0gZWxzZSB7XAorCQkJUCA9IE5VTEw7XAorCQkJamZzX2VycigiYnJlYWQgZmFpbGVkISIpO1wKKwkJCVJDID0gLUVJTztcCisJCX1cCisJfVwKK30KKworI2RlZmluZSBCVF9NQVJLX0RJUlRZKE1QLCBJUClcCit7XAorCWlmIChCVF9JU19ST09UKE1QKSlcCisJCW1hcmtfaW5vZGVfZGlydHkoSVApO1wKKwllbHNlXAorCQltYXJrX21ldGFwYWdlX2RpcnR5KE1QKTtcCit9CisKKy8qIHB1dCB0aGUgcGFnZSBidWZmZXIgKi8KKyNkZWZpbmUgQlRfUFVUUEFHRShNUClcCit7XAorCWlmICghIEJUX0lTX1JPT1QoTVApKSBcCisJCXJlbGVhc2VfbWV0YXBhZ2UoTVApOyBcCit9CisKKworLyoKKyAqCWJ0cmVlIHRyYXZlcnNhbCBzdGFjaworICoKKyAqIHJlY29yZCB0aGUgcGF0aCB0cmF2ZXJzZWQgZHVyaW5nIHRoZSBzZWFyY2g7CisgKiB0b3AgZnJhbWUgcmVjb3JkIHRoZSBsZWFmIHBhZ2UvZW50cnkgc2VsZWN0ZWQuCisgKi8KK3N0cnVjdCBidGZyYW1lIHsJLyogc3RhY2sgZnJhbWUgKi8KKwlzNjQgYm47CQkJLyogODogKi8KKwlzMTYgaW5kZXg7CQkvKiAyOiAqLworCXMxNiBsYXN0aW5kZXg7CQkvKiAyOiB1bnVzZWQgKi8KKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOwkvKiA0Lzg6ICovCit9OwkJCQkvKiAoMTYvMjQpICovCisKK3N0cnVjdCBidHN0YWNrIHsKKwlzdHJ1Y3QgYnRmcmFtZSAqdG9wOworCWludCBuc3BsaXQ7CisJc3RydWN0IGJ0ZnJhbWUgc3RhY2tbTUFYVFJFRUhFSUdIVF07Cit9OworCisjZGVmaW5lIEJUX0NMUihidHN0YWNrKVwKKwkoYnRzdGFjayktPnRvcCA9IChidHN0YWNrKS0+c3RhY2sKKworI2RlZmluZSBCVF9TVEFDS19GVUxMKGJ0c3RhY2spXAorCSggKGJ0c3RhY2spLT50b3AgPT0gJigoYnRzdGFjayktPnN0YWNrW01BWFRSRUVIRUlHSFQtMV0pKQorCisjZGVmaW5lIEJUX1BVU0goQlRTVEFDSywgQk4sIElOREVYKVwKK3tcCisJYXNzZXJ0KCFCVF9TVEFDS19GVUxMKEJUU1RBQ0spKTtcCisJKEJUU1RBQ0spLT50b3AtPmJuID0gQk47XAorCShCVFNUQUNLKS0+dG9wLT5pbmRleCA9IElOREVYO1wKKwkrKyhCVFNUQUNLKS0+dG9wO1wKK30KKworI2RlZmluZSBCVF9QT1AoYnRzdGFjaylcCisJKCAoYnRzdGFjayktPnRvcCA9PSAoYnRzdGFjayktPnN0YWNrID8gTlVMTCA6IC0tKGJ0c3RhY2spLT50b3AgKQorCisjZGVmaW5lIEJUX1NUQUNLKGJ0c3RhY2spXAorCSggKGJ0c3RhY2spLT50b3AgPT0gKGJ0c3RhY2spLT5zdGFjayA/IE5VTEwgOiAoYnRzdGFjayktPnRvcCApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBCVF9TVEFDS19EVU1QKHN0cnVjdCBidHN0YWNrICpidHN0YWNrKQoreworCWludCBpOworCXByaW50aygiYnRzdGFjayBkdW1wOlxuIik7CisJZm9yIChpID0gMDsgaSA8IE1BWFRSRUVIRUlHSFQ7IGkrKykKKwkJcHJpbnRrKEtFUk5fRVJSICJibiA9ICVMeCwgaW5kZXggPSAlZFxuIiwKKwkJICAgICAgIChsb25nIGxvbmcpYnRzdGFjay0+c3RhY2tbaV0uYm4sCisJCSAgICAgICBidHN0YWNrLT5zdGFja1tpXS5pbmRleCk7Cit9CisKKy8qIHJldHJpZXZlIHNlYXJjaCByZXN1bHRzICovCisjZGVmaW5lIEJUX0dFVFNFQVJDSChJUCwgTEVBRiwgQk4sIE1QLCBUWVBFLCBQLCBJTkRFWCwgUk9PVClcCit7XAorCUJOID0gKExFQUYpLT5ibjtcCisJTVAgPSAoTEVBRiktPm1wO1wKKwlpZiAoQk4pXAorCQlQID0gKFRZUEUgKilNUC0+ZGF0YTtcCisJZWxzZVwKKwkJUCA9IChUWVBFICopJkpGU19JUChJUCktPlJPT1Q7XAorCUlOREVYID0gKExFQUYpLT5pbmRleDtcCit9CisKKy8qIHB1dCB0aGUgcGFnZSBidWZmZXIgb2Ygc2VhcmNoICovCisjZGVmaW5lIEJUX1BVVFNFQVJDSChCVFNUQUNLKVwKK3tcCisJaWYgKCEgQlRfSVNfUk9PVCgoQlRTVEFDSyktPnRvcC0+bXApKVwKKwkJcmVsZWFzZV9tZXRhcGFnZSgoQlRTVEFDSyktPnRvcC0+bXApO1wKK30KKyNlbmRpZgkJCQkvKiBfSF9KRlNfQlRSRUUgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfZGVidWcuYyBiL2ZzL2pmcy9qZnNfZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWEwYTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19kZWJ1Zy5jCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwNAorICogICBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIENocmlzdG9waCBIZWxsd2lnLCAyMDAxLTIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKKyNpbmNsdWRlICJqZnNfZmlsc3lzLmgiCisjaW5jbHVkZSAiamZzX2RlYnVnLmgiCisKKyNpZmRlZiBDT05GSUdfSkZTX0RFQlVHCit2b2lkIGR1bXBfbWVtKGNoYXIgKmxhYmVsLCB2b2lkICpkYXRhLCBpbnQgbGVuZ3RoKQoreworCWludCBpLCBqOworCWludCAqaW50cHRyID0gZGF0YTsKKwljaGFyICpjaGFycHRyID0gZGF0YTsKKwljaGFyIGJ1ZlsxMF0sIGxpbmVbODBdOworCisJcHJpbnRrKCIlczogZHVtcCBvZiAlZCBieXRlcyBvZiBkYXRhIGF0IDB4JXBcblxuIiwgbGFiZWwsIGxlbmd0aCwKKwkgICAgICAgZGF0YSk7CisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxNikgeworCQlsaW5lWzBdID0gMDsKKwkJZm9yIChqID0gMDsgKGogPCA0KSAmJiAoaSArIGogKiA0IDwgbGVuZ3RoKTsgaisrKSB7CisJCQlzcHJpbnRmKGJ1ZiwgIiAlMDh4IiwgaW50cHRyW2kgLyA0ICsgal0pOworCQkJc3RyY2F0KGxpbmUsIGJ1Zik7CisJCX0KKwkJYnVmWzBdID0gJyAnOworCQlidWZbMl0gPSAwOworCQlmb3IgKGogPSAwOyAoaiA8IDE2KSAmJiAoaSArIGogPCBsZW5ndGgpOyBqKyspIHsKKwkJCWJ1ZlsxXSA9CisJCQkgICAgaXNwcmludChjaGFycHRyW2kgKyBqXSkgPyBjaGFycHRyW2kgKyBqXSA6ICcuJzsKKwkJCXN0cmNhdChsaW5lLCBidWYpOworCQl9CisJCXByaW50aygiJXNcbiIsIGxpbmUpOworCX0KK30KKyNlbmRpZgorCisjaWZkZWYgUFJPQ19GU19KRlMgLyogc2VlIGpmc19kZWJ1Zy5oICovCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmJhc2U7CisjaWZkZWYgQ09ORklHX0pGU19ERUJVRworZXh0ZXJuIHJlYWRfcHJvY190IGpmc190eGFuY2hvcl9yZWFkOworCitzdGF0aWMgaW50IGxvZ2xldmVsX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuOworCisJbGVuID0gc3ByaW50ZihwYWdlLCAiJWRcbiIsIGpmc2xvZ2xldmVsKTsKKworCWxlbiAtPSBvZmY7CisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKworCWlmIChsZW4gPiBjb3VudCkKKwkJbGVuID0gY291bnQ7CisJZWxzZQorCQkqZW9mID0gMTsKKworCWlmIChsZW4gPCAwKQorCQlsZW4gPSAwOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBsb2dsZXZlbF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCXVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJY2hhciBjOworCisJaWYgKGdldF91c2VyKGMsIGJ1ZmZlcikpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogeWVzLCBJIGtub3cgdGhpcyBpcyBhbiBBU0NJSWlzbS4gIC0taGNoICovCisJaWYgKGMgPCAnMCcgfHwgYyA+ICc5JykKKwkJcmV0dXJuIC1FSU5WQUw7CisJamZzbG9nbGV2ZWwgPSBjIC0gJzAnOworCXJldHVybiBjb3VudDsKK30KKyNlbmRpZgorCisKKyNpZmRlZiBDT05GSUdfSkZTX1NUQVRJU1RJQ1MKK2V4dGVybiByZWFkX3Byb2NfdCBqZnNfbG1zdGF0c19yZWFkOworZXh0ZXJuIHJlYWRfcHJvY190IGpmc190eHN0YXRzX3JlYWQ7CitleHRlcm4gcmVhZF9wcm9jX3QgamZzX3h0c3RhdF9yZWFkOworZXh0ZXJuIHJlYWRfcHJvY190IGpmc19tcHN0YXRfcmVhZDsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHsKKwljb25zdCBjaGFyCSpuYW1lOworCXJlYWRfcHJvY190CSpyZWFkX2ZuOworCXdyaXRlX3Byb2NfdAkqd3JpdGVfZm47Cit9IEVudHJpZXNbXSA9IHsKKyNpZmRlZiBDT05GSUdfSkZTX1NUQVRJU1RJQ1MKKwl7ICJsbXN0YXRzIiwJamZzX2xtc3RhdHNfcmVhZCwgfSwKKwl7ICJ0eHN0YXRzIiwJamZzX3R4c3RhdHNfcmVhZCwgfSwKKwl7ICJ4dHN0YXQiLAlqZnNfeHRzdGF0X3JlYWQsIH0sCisJeyAibXBzdGF0IiwJamZzX21wc3RhdF9yZWFkLCB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0pGU19ERUJVRworCXsgIlR4QW5jaG9yIiwJamZzX3R4YW5jaG9yX3JlYWQsIH0sCisJeyAibG9nbGV2ZWwiLAlsb2dsZXZlbF9yZWFkLCBsb2dsZXZlbF93cml0ZSB9CisjZW5kaWYKK307CisjZGVmaW5lIE5QUk9DRU5UCShzaXplb2YoRW50cmllcykvc2l6ZW9mKEVudHJpZXNbMF0pKQorCit2b2lkIGpmc19wcm9jX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmICghKGJhc2UgPSBwcm9jX21rZGlyKCJqZnMiLCBwcm9jX3Jvb3RfZnMpKSkKKwkJcmV0dXJuOworCWJhc2UtPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlBST0NFTlQ7IGkrKykgeworCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnA7CisJCWlmICgocCA9IGNyZWF0ZV9wcm9jX2VudHJ5KEVudHJpZXNbaV0ubmFtZSwgMCwgYmFzZSkpKSB7CisJCQlwLT5yZWFkX3Byb2MgPSBFbnRyaWVzW2ldLnJlYWRfZm47CisJCQlwLT53cml0ZV9wcm9jID0gRW50cmllc1tpXS53cml0ZV9mbjsKKwkJfQorCX0KK30KKwordm9pZCBqZnNfcHJvY19jbGVhbih2b2lkKQoreworCWludCBpOworCisJaWYgKGJhc2UpIHsKKwkJZm9yIChpID0gMDsgaSA8IE5QUk9DRU5UOyBpKyspCisJCQlyZW1vdmVfcHJvY19lbnRyeShFbnRyaWVzW2ldLm5hbWUsIGJhc2UpOworCQlyZW1vdmVfcHJvY19lbnRyeSgiamZzIiwgcHJvY19yb290X2ZzKTsKKwl9Cit9CisKKyNlbmRpZiAvKiBQUk9DX0ZTX0pGUyAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19kZWJ1Zy5oIGIvZnMvamZzL2pmc19kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzODA3OWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX2RlYnVnLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDAyCisgKiAgIFBvcnRpb25zIENvcHlyaWdodCAoYykgQ2hyaXN0b3BoIEhlbGx3aWcsIDIwMDEtMjAwMgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9IX0pGU19ERUJVRworI2RlZmluZSBfSF9KRlNfREVCVUcKKworLyoKKyAqCWpmc19kZWJ1Zy5oCisgKgorICogZ2xvYmFsIGRlYnVnIG1lc3NhZ2UsIGRhdGEgc3RydWN0dXJlL21hY3JvIGRlZmluaXRpb25zCisgKiB1bmRlciBjb250cm9sIG9mIENPTkZJR19KRlNfREVCVUcsIENPTkZJR19KRlNfU1RBVElTVElDUzsKKyAqLworCisvKgorICogQ3JlYXRlIC9wcm9jL2ZzL2pmcyBpZiBwcm9jZnMgaXMgZW5hYmxlZCBhbmRlaXRoZXIKKyAqIENPTkZJR19KRlNfREVCVUcgb3IgQ09ORklHX0pGU19TVEFUSVNUSUNTIGlzIGRlZmluZWQKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIChkZWZpbmVkKENPTkZJR19KRlNfREVCVUcpIHx8IGRlZmluZWQoQ09ORklHX0pGU19TVEFUSVNUSUNTKSkKKwkjZGVmaW5lIFBST0NfRlNfSkZTCisjZW5kaWYKKworLyoKKyAqCWFzc2VydCB3aXRoIHRyYWRpdGlvbmFsIHByaW50Zi9wYW5pYworICovCisjaWZkZWYgQ09ORklHX0tFUk5FTF9BU1NFUlRTCisvKiBrZ2RiIHN0dWZmICovCisjZGVmaW5lIGFzc2VydChwKSBLRVJORUxfQVNTRVJUKCNwLCBwKQorI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0KHApIGRvIHsJXAorCWlmICghKHApKSB7CVwKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQlVHIGF0ICVzOiVkIGFzc2VydCglcylcbiIsCVwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgI3ApOwkJCVwKKwkJQlVHKCk7CVwKKwl9CQlcCit9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qCisgKglkZWJ1ZyBPTgorICoJLS0tLS0tLS0KKyAqLworI2lmZGVmIENPTkZJR19KRlNfREVCVUcKKyNkZWZpbmUgQVNTRVJUKHApIGFzc2VydChwKQorCisvKiBwcmludGsgdmVyYm9zaXR5ICovCisjZGVmaW5lIEpGU19MT0dMRVZFTF9FUlIgMQorI2RlZmluZSBKRlNfTE9HTEVWRUxfV0FSTiAyCisjZGVmaW5lIEpGU19MT0dMRVZFTF9ERUJVRyAzCisjZGVmaW5lIEpGU19MT0dMRVZFTF9JTkZPIDQKKworZXh0ZXJuIGludCBqZnNsb2dsZXZlbDsKKworLyogZHVtcCBtZW1vcnkgY29udGVudHMgKi8KK2V4dGVybiB2b2lkIGR1bXBfbWVtKGNoYXIgKmxhYmVsLCB2b2lkICpkYXRhLCBpbnQgbGVuZ3RoKTsKKworLyogaW5mb3JtYXRpb24gbWVzc2FnZTogZS5nLiwgY29uZmlndXJhdGlvbiwgbWFqb3IgZXZlbnQgKi8KKyNkZWZpbmUgamZzX2luZm8oZm10LCBhcmcuLi4pIGRvIHsJCQlcCisJaWYgKGpmc2xvZ2xldmVsID49IEpGU19MT0dMRVZFTF9JTkZPKQkJXAorCQlwcmludGsoS0VSTl9JTkZPIGZtdCAiXG4iLCAjIyBhcmcpOwlcCit9IHdoaWxlICgwKQorCisvKiBkZWJ1ZyBtZXNzYWdlOiBhZCBob2MgKi8KKyNkZWZpbmUgamZzX2RlYnVnKGZtdCwgYXJnLi4uKSBkbyB7CQkJXAorCWlmIChqZnNsb2dsZXZlbCA+PSBKRlNfTE9HTEVWRUxfREVCVUcpCQlcCisJCXByaW50ayhLRVJOX0RFQlVHIGZtdCAiXG4iLCAjIyBhcmcpOwlcCit9IHdoaWxlICgwKQorCisvKiB3YXJuIG1lc3NhZ2U6ICovCisjZGVmaW5lIGpmc193YXJuKGZtdCwgYXJnLi4uKSBkbyB7CQkJXAorCWlmIChqZnNsb2dsZXZlbCA+PSBKRlNfTE9HTEVWRUxfV0FSTikJCVwKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBmbXQgIlxuIiwgIyMgYXJnKTsJXAorfSB3aGlsZSAoMCkKKworLyogZXJyb3IgZXZlbnQgbWVzc2FnZTogZS5nLiwgaS9vIGVycm9yICovCisjZGVmaW5lIGpmc19lcnIoZm10LCBhcmcuLi4pIGRvIHsJCQlcCisJaWYgKGpmc2xvZ2xldmVsID49IEpGU19MT0dMRVZFTF9FUlIpCQlcCisJCXByaW50ayhLRVJOX0VSUiBmbXQgIlxuIiwgIyMgYXJnKTsJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqCWRlYnVnIE9GRgorICoJLS0tLS0tLS0tCisgKi8KKyNlbHNlCQkJCS8qIENPTkZJR19KRlNfREVCVUcgKi8KKyNkZWZpbmUgZHVtcF9tZW0obGFiZWwsZGF0YSxsZW5ndGgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBBU1NFUlQocCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGpmc19pbmZvKGZtdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgamZzX2RlYnVnKGZtdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgamZzX3dhcm4oZm10LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBqZnNfZXJyKGZtdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgkJCQkvKiBDT05GSUdfSkZTX0RFQlVHICovCisKKy8qCisgKglzdGF0aXN0aWNzCisgKgktLS0tLS0tLS0tCisgKi8KKyNpZmRlZglDT05GSUdfSkZTX1NUQVRJU1RJQ1MKKyNkZWZpbmUJSU5DUkVNRU5UKHgpCQkoKHgpKyspCisjZGVmaW5lCURFQ1JFTUVOVCh4KQkJKCh4KS0tKQorI2RlZmluZQlISUdIV0FURVJNQVJLKHgseSkJKCh4KSA9IG1heCgoeCksICh5KSkpCisjZWxzZQorI2RlZmluZQlJTkNSRU1FTlQoeCkKKyNkZWZpbmUJREVDUkVNRU5UKHgpCisjZGVmaW5lCUhJR0hXQVRFUk1BUksoeCx5KQorI2VuZGlmCQkJCS8qIENPTkZJR19KRlNfU1RBVElTVElDUyAqLworCisjZW5kaWYJCQkJLyogX0hfSkZTX0RFQlVHICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2Rpbm9kZS5oIGIvZnMvamZzL2pmc19kaW5vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODBhMzI1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19kaW5vZGUuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAwLTIwMDEKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfSF9KRlNfRElOT0RFCisjZGVmaW5lIF9IX0pGU19ESU5PREUKKworLyoKKyAqICAgICAgamZzX2Rpbm9kZS5oOiBvbi1kaXNrIGlub2RlIG1hbmFnZXIKKyAqLworCisjZGVmaW5lIElOT0RFU0xPVFNJWkUgICAgICAgICAgIDEyOAorI2RlZmluZSBMMklOT0RFU0xPVFNJWkUgICAgICAgICA3CisjZGVmaW5lIGxvZzJJTk9ERVNJWkUgICAgICAgICAgIDkJLyogbG9nMihieXRlcyBwZXIgZGlub2RlKSAqLworCisKKy8qCisgKiAgICAgIG9uLWRpc2sgaW5vZGUgOiA1MTIgYnl0ZXMKKyAqCisgKiBub3RlOiBhbGlnbiA2NC1iaXQgZmllbGRzIG9uIDgtYnl0ZSBib3VuZGFyeS4KKyAqLworc3RydWN0IGRpbm9kZSB7CisJLyoKKwkgKiAgICAgIEkuIGJhc2UgYXJlYSAoMTI4IGJ5dGVzKQorCSAqICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICoKKwkgKiBkZWZpbmUgZ2VuZXJpYy9QT1NJWCBhdHRyaWJ1dGVzCisJICovCisJX19sZTMyIGRpX2lub3N0YW1wOwkvKiA0OiBzdGFtcCB0byBzaG93IGlub2RlIGJlbG9uZ3MgdG8gZmlsZXNldCAqLworCV9fbGUzMiBkaV9maWxlc2V0OwkvKiA0OiBmaWxlc2V0IG51bWJlciAqLworCV9fbGUzMiBkaV9udW1iZXI7CS8qIDQ6IGlub2RlIG51bWJlciwgYWthIGZpbGUgc2VyaWFsIG51bWJlciAqLworCV9fbGUzMiBkaV9nZW47CQkvKiA0OiBpbm9kZSBnZW5lcmF0aW9uIG51bWJlciAqLworCisJcHhkX3QgZGlfaXhweGQ7CQkvKiA4OiBpbm9kZSBleHRlbnQgZGVzY3JpcHRvciAqLworCisJX19sZTY0IGRpX3NpemU7CQkvKiA4OiBzaXplICovCisJX19sZTY0IGRpX25ibG9ja3M7CS8qIDg6IG51bWJlciBvZiBibG9ja3MgYWxsb2NhdGVkICovCisKKwlfX2xlMzIgZGlfbmxpbms7CS8qIDQ6IG51bWJlciBvZiBsaW5rcyB0byB0aGUgb2JqZWN0ICovCisKKwlfX2xlMzIgZGlfdWlkOwkJLyogNDogdXNlciBpZCBvZiBvd25lciAqLworCV9fbGUzMiBkaV9naWQ7CQkvKiA0OiBncm91cCBpZCBvZiBvd25lciAqLworCisJX19sZTMyIGRpX21vZGU7CQkvKiA0OiBhdHRyaWJ1dGUsIGZvcm1hdCBhbmQgcGVybWlzc2lvbiAqLworCisJc3RydWN0IHRpbWVzdHJ1Y190IGRpX2F0aW1lOwkvKiA4OiB0aW1lIGxhc3QgZGF0YSBhY2Nlc3NlZCAqLworCXN0cnVjdCB0aW1lc3RydWNfdCBkaV9jdGltZTsJLyogODogdGltZSBsYXN0IHN0YXR1cyBjaGFuZ2VkICovCisJc3RydWN0IHRpbWVzdHJ1Y190IGRpX210aW1lOwkvKiA4OiB0aW1lIGxhc3QgZGF0YSBtb2RpZmllZCAqLworCXN0cnVjdCB0aW1lc3RydWNfdCBkaV9vdGltZTsJLyogODogdGltZSBjcmVhdGVkICovCisKKwlkeGRfdCBkaV9hY2w7CQkvKiAxNjogYWNsIGRlc2NyaXB0b3IgKi8KKworCWR4ZF90IGRpX2VhOwkJLyogMTY6IGVhIGRlc2NyaXB0b3IgKi8KKworCV9fbGUzMiBkaV9uZXh0X2luZGV4OwkvKiA0OiBOZXh0IGF2YWlsYWJsZSBkaXJfdGFibGUgaW5kZXggKi8KKworCV9fbGUzMiBkaV9hY2x0eXBlOwkvKiA0OiBUeXBlIG9mIEFDTCAqLworCisJLyoKKwkgKiAgICAgIEV4dGVuc2lvbiBBcmVhcy4KKwkgKgorCSAqICAgICAgSGlzdG9yaWNhbGx5LCB0aGUgaW5vZGUgd2FzIHBhcnRpdGlvbmVkIGludG8gNCAxMjgtYnl0ZSBhcmVhcywKKwkgKiAgICAgIHRoZSBsYXN0IDMgYmVpbmcgZGVmaW5lZCBhcyB1bmlvbnMgd2hpY2ggY291bGQgaGF2ZSBtdWx0aXBsZQorCSAqICAgICAgdXNlcy4gIFRoZSBmaXJzdCA5NiBieXRlcyBoYWQgYmVlbiBjb21wbGV0ZWx5IHVudXNlZCB1bnRpbAorCSAqICAgICAgYW4gaW5kZXggdGFibGUgd2FzIGFkZGVkIHRvIHRoZSBkaXJlY3RvcnkuICBJdCBpcyBub3cgbW9yZQorCSAqICAgICAgdXNlZnVsIHRvIGRlc2NyaWJlIHRoZSBsYXN0IDMvNCBvZiB0aGUgaW5vZGUgYXMgYSBzaW5nbGUKKwkgKiAgICAgIHVuaW9uLiAgV2Ugd291bGQgcHJvYmFibHkgYmUgYmV0dGVyIG9mZiByZWRlc2lnbmluZyB0aGUKKwkgKiAgICAgIGVudGlyZSBzdHJ1Y3R1cmUgZnJvbSBzY3JhdGNoLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBicmVhaworCSAqICAgICAgY29tbW9uYWxpdHkgd2l0aCBPUy8yJ3MgSkZTIGF0IHRoaXMgdGltZS4KKwkgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQkvKgorCQkJICogVGhpcyB0YWJsZSBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvCisJCQkgKiBmaW5kIGEgZGlyZWN0b3J5IGVudHJ5IGZyb20gYSAzMi1iaXQgaW5kZXguCisJCQkgKiBJZiB0aGUgaW5kZXggaXMgc21hbGwgZW5vdWdoLCB0aGUgdGFibGUgaXMgaW5saW5lLAorCQkJICogb3RoZXJ3aXNlLCBhbiB4LXRyZWUgcm9vdCBvdmVybGF5cyB0aGlzIHRhYmxlCisJCQkgKi8KKwkJCXN0cnVjdCBkaXJfdGFibGVfc2xvdCBfdGFibGVbMTJdOyAvKiA5NjogaW5saW5lICovCisKKwkJCWR0cm9vdF90IF9kdHJvb3Q7CQkvKiAyODg6IGR0cmVlIHJvb3QgKi8KKwkJfSBfZGlyOwkJCQkJLyogKDM4NCkgKi8KKyNkZWZpbmUgZGlfZGlydGFibGUJdS5fZGlyLl90YWJsZQorI2RlZmluZSBkaV9kdHJvb3QJdS5fZGlyLl9kdHJvb3QKKyNkZWZpbmUgZGlfcGFyZW50ICAgICAgIGRpX2R0cm9vdC5oZWFkZXIuaWRvdGRvdAorI2RlZmluZSBkaV9EQVNECQlkaV9kdHJvb3QuaGVhZGVyLkRBU0QKKworCQlzdHJ1Y3QgeworCQkJdW5pb24geworCQkJCXU4IF9kYXRhWzk2XTsJCS8qIDk2OiB1bnVzZWQgKi8KKwkJCQlzdHJ1Y3QgeworCQkJCQl2b2lkICpfaW1hcDsJLyogNDogdW51c2VkICovCisJCQkJCV9fbGUzMiBfZ2VuZ2VuOwkvKiA0OiBnZW5lcmF0b3IgKi8KKwkJCQl9IF9pbWFwOworCQkJfSBfdTE7CQkJCS8qIDk2OiAqLworI2RlZmluZSBkaV9nZW5nZW4JdS5fZmlsZS5fdTEuX2ltYXAuX2dlbmdlbgorCisJCQl1bmlvbiB7CisJCQkJeHRwYWdlX3QgX3h0cm9vdDsKKwkJCQlzdHJ1Y3QgeworCQkJCQl1OCB1bnVzZWRbMTZdOwkvKiAxNjogKi8KKwkJCQkJZHhkX3QgX2R4ZDsJLyogMTY6ICovCisJCQkJCXVuaW9uIHsKKwkJCQkJCV9fbGUzMiBfcmRldjsJLyogNDogKi8KKwkJCQkJCXU4IF9mYXN0c3ltbGlua1sxMjhdOworCQkJCQl9IF91OworCQkJCQl1OCBfaW5saW5lZWFbMTI4XTsKKwkJCQl9IF9zcGVjaWFsOworCQkJfSBfdTI7CisJCX0gX2ZpbGU7CisjZGVmaW5lIGRpX3h0cm9vdAl1Ll9maWxlLl91Mi5feHRyb290CisjZGVmaW5lIGRpX2R4ZAkJdS5fZmlsZS5fdTIuX3NwZWNpYWwuX2R4ZAorI2RlZmluZSBkaV9idHJvb3QJZGlfeHRyb290CisjZGVmaW5lIGRpX2lubGluZWRhdGEJdS5fZmlsZS5fdTIuX3NwZWNpYWwuX3UKKyNkZWZpbmUgZGlfcmRldgkJdS5fZmlsZS5fdTIuX3NwZWNpYWwuX3UuX3JkZXYKKyNkZWZpbmUgZGlfZmFzdHN5bWxpbmsJdS5fZmlsZS5fdTIuX3NwZWNpYWwuX3UuX2Zhc3RzeW1saW5rCisjZGVmaW5lIGRpX2lubGluZWVhICAgICB1Ll9maWxlLl91Mi5fc3BlY2lhbC5faW5saW5lZWEKKwl9IHU7Cit9OworCisvKiBleHRlbmRlZCBtb2RlIGJpdHMgKG9uLWRpc2sgaW5vZGUgZGlfbW9kZSkgKi8KKyNkZWZpbmUgSUZKT1VSTkFMICAgICAgIDB4MDAwMTAwMDAJLyogam91cm5hbGxlZCBmaWxlICovCisjZGVmaW5lIElTUEFSU0UgICAgICAgICAweDAwMDIwMDAwCS8qIHNwYXJzZSBmaWxlIGVuYWJsZWQgKi8KKyNkZWZpbmUgSU5MSU5FRUEgICAgICAgIDB4MDAwNDAwMDAJLyogaW5saW5lIEVBIGFyZWEgZnJlZSAqLworI2RlZmluZSBJU1dBUEZJTEUJMHgwMDgwMDAwMAkvKiBmaWxlIG9wZW4gZm9yIHBhZ2VyIHN3YXAgc3BhY2UgKi8KKworLyogbW9yZSBleHRlbmRlZCBtb2RlIGJpdHM6IGF0dHJpYnV0ZXMgZm9yIE9TLzIgKi8KKyNkZWZpbmUgSVJFQURPTkxZCTB4MDIwMDAwMDAJLyogbm8gd3JpdGUgYWNjZXNzIHRvIGZpbGUgKi8KKyNkZWZpbmUgSUFSQ0hJVkUJMHg0MDAwMDAwMAkvKiBmaWxlIGFyY2hpdmUgYml0ICovCisjZGVmaW5lIElTWVNURU0JCTB4MDgwMDAwMDAJLyogc3lzdGVtIGZpbGUgKi8KKyNkZWZpbmUgSUhJRERFTgkJMHgwNDAwMDAwMAkvKiBoaWRkZW4gZmlsZSAqLworI2RlZmluZSBJUkFTSAkJMHg0RTAwMDAwMAkvKiBtYXNrIGZvciBjaGFuZ2VhYmxlIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgSU5FV05BTUUJMHg4MDAwMDAwMAkvKiBub24tOC4zIGZpbGVuYW1lIGZvcm1hdCAqLworI2RlZmluZSBJRElSRUNUT1JZCTB4MjAwMDAwMDAJLyogZGlyZWN0b3J5IChzaGFkb3cgb2YgcmVhbCBiaXQpICovCisjZGVmaW5lIEFUVFJTSElGVAkyNQkvKiBiaXRzIHRvIHNoaWZ0IHRvIG1vdmUgYXR0cmlidXRlCisJCQkJICAgc3BlY2lmaWNhdGlvbiB0byBtb2RlIHBvc2l0aW9uICovCisKKyNlbmRpZiAvKl9IX0pGU19ESU5PREUgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfZG1hcC5jIGIvZnMvamZzL2pmc19kbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2ZTQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfZG1hcC5jCkBAIC0wLDAgKzEsNDI3MiBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAwLTIwMDQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlICJqZnNfaW5jb3JlLmgiCisjaW5jbHVkZSAiamZzX3N1cGVyYmxvY2suaCIKKyNpbmNsdWRlICJqZnNfZG1hcC5oIgorI2luY2x1ZGUgImpmc19pbWFwLmgiCisjaW5jbHVkZSAiamZzX2xvY2suaCIKKyNpbmNsdWRlICJqZnNfbWV0YXBhZ2UuaCIKKyNpbmNsdWRlICJqZnNfZGVidWcuaCIKKworLyoKKyAqCURlYnVnIGNvZGUgZm9yIGRvdWJsZS1jaGVja2luZyBibG9jayBtYXAKKyAqLworLyogI2RlZmluZQlfSkZTX0RFQlVHX0RNQVAJMSAqLworCisjaWZkZWYJX0pGU19ERUJVR19ETUFQCisjZGVmaW5lIERCSU5JVE1BUChzaXplLGlwYm1hcCxyZXN1bHRzKSBcCisJREJpbml0bWFwKHNpemUsaXBibWFwLHJlc3VsdHMpCisjZGVmaW5lIERCQUxMT0MoZGJtYXAsbWFwc2l6ZSxibGtubyxuYmxvY2tzKSBcCisJREJBbGxvYyhkYm1hcCxtYXBzaXplLGJsa25vLG5ibG9ja3MpCisjZGVmaW5lIERCRlJFRShkYm1hcCxtYXBzaXplLGJsa25vLG5ibG9ja3MpIFwKKwlEQkZyZWUoZGJtYXAsbWFwc2l6ZSxibGtubyxuYmxvY2tzKQorI2RlZmluZSBEQkFMTE9DQ0soZGJtYXAsbWFwc2l6ZSxibGtubyxuYmxvY2tzKSBcCisJREJBbGxvY0NLKGRibWFwLG1hcHNpemUsYmxrbm8sbmJsb2NrcykKKyNkZWZpbmUgREJGUkVFQ0soZGJtYXAsbWFwc2l6ZSxibGtubyxuYmxvY2tzKSBcCisJREJGcmVlQ0soZGJtYXAsbWFwc2l6ZSxibGtubyxuYmxvY2tzKQorCitzdGF0aWMgdm9pZCBEQmluaXRtYXAoczY0LCBzdHJ1Y3QgaW5vZGUgKiwgdTMyICoqKTsKK3N0YXRpYyB2b2lkIERCQWxsb2ModWludCAqLCBzNjQsIHM2NCwgczY0KTsKK3N0YXRpYyB2b2lkIERCRnJlZSh1aW50ICosIHM2NCwgczY0LCBzNjQpOworc3RhdGljIHZvaWQgREJBbGxvY0NLKHVpbnQgKiwgczY0LCBzNjQsIHM2NCk7CitzdGF0aWMgdm9pZCBEQkZyZWVDSyh1aW50ICosIHM2NCwgczY0LCBzNjQpOworI2Vsc2UKKyNkZWZpbmUgREJJTklUTUFQKHNpemUsaXBibWFwLHJlc3VsdHMpCisjZGVmaW5lIERCQUxMT0MoZGJtYXAsIG1hcHNpemUsIGJsa25vLCBuYmxvY2tzKQorI2RlZmluZSBEQkZSRUUoZGJtYXAsIG1hcHNpemUsIGJsa25vLCBuYmxvY2tzKQorI2RlZmluZSBEQkFMTE9DQ0soZGJtYXAsIG1hcHNpemUsIGJsa25vLCBuYmxvY2tzKQorI2RlZmluZSBEQkZSRUVDSyhkYm1hcCwgbWFwc2l6ZSwgYmxrbm8sIG5ibG9ja3MpCisjZW5kaWYJCQkJLyogX0pGU19ERUJVR19ETUFQICovCisKKy8qCisgKglTRVJJQUxJWkFUSU9OIG9mIHRoZSBCbG9jayBBbGxvY2F0aW9uIE1hcC4KKyAqCisgKgl0aGUgd29ya2luZyBzdGF0ZSBvZiB0aGUgYmxvY2sgYWxsb2NhdGlvbiBtYXAgaXMgYWNjZXNzZWQgaW4KKyAqCXR3byBkaXJlY3Rpb25zOgorICoJCisgKgkxKSBhbGxvY2F0aW9uIGFuZCBmcmVlIHJlcXVlc3RzIHRoYXQgc3RhcnQgYXQgdGhlIGRtYXAKKyAqCSAgIGxldmVsIGFuZCBtb3ZlIHVwIHRocm91Z2ggdGhlIGRtYXAgY29udHJvbCBwYWdlcyAoaS5lLgorICoJICAgdGhlIHZhc3QgbWFqb3JpdHkgb2YgcmVxdWVzdHMpLgorICogCisgKiAJMikgYWxsb2NhdGlvbiByZXF1ZXN0cyB0aGF0IHN0YXJ0IGF0IGRtYXAgY29udHJvbCBwYWdlCisgKgkgICBsZXZlbCBhbmQgd29yayBkb3duIHRvd2FyZHMgdGhlIGRtYXBzLgorICoJCisgKgl0aGUgc2VyaWFsaXphdGlvbiBzY2hlbWUgdXNlZCBoZXJlIGlzIGFzIGZvbGxvd3MuIAorICoKKyAqCXJlcXVlc3RzIHdoaWNoIHN0YXJ0IGF0IHRoZSBib3R0b20gYXJlIHNlcmlhbGl6ZWQgYWdhaW5zdCBlYWNoIAorICoJb3RoZXIgdGhyb3VnaCBidWZmZXJzIGFuZCBlYWNoIHJlcXVlc3RzIGhvbGRzIG9udG8gaXRzIGJ1ZmZlcnMgCisgKglhcyBpdCB3b3JrcyBpdCB3YXkgdXAgZnJvbSBhIHNpbmdsZSBkbWFwIHRvIHRoZSByZXF1aXJlZCBsZXZlbCAKKyAqCW9mIGRtYXAgY29udHJvbCBwYWdlLgorICoJcmVxdWVzdHMgdGhhdCBzdGFydCBhdCB0aGUgdG9wIGFyZSBzZXJpYWxpemVkIGFnYWluc3QgZWFjaCBvdGhlcgorICoJYW5kIHJlcXVlc3QgdGhhdCBzdGFydCBmcm9tIHRoZSBib3R0b20gYnkgdGhlIG11bHRpcGxlIHJlYWQvc2luZ2xlCisgKgl3cml0ZSBpbm9kZSBsb2NrIG9mIHRoZSBibWFwIGlub2RlLiByZXF1ZXN0cyBzdGFydGluZyBhdCB0aGUgdG9wCisgKgl0YWtlIHRoaXMgbG9jayBpbiB3cml0ZSBtb2RlIHdoaWxlIHJlcXVlc3Qgc3RhcnRpbmcgYXQgdGhlIGJvdHRvbQorICoJdGFrZSB0aGUgbG9jayBpbiByZWFkIG1vZGUuICBhIHNpbmdsZSB0b3AtZG93biByZXF1ZXN0IG1heSBwcm9jZWVkCisgKglleGNsdXNpdmVseSB3aGlsZSBtdWx0aXBsZSBib3R0b21zLXVwIHJlcXVlc3RzIG1heSBwcm9jZWVkIAorICogCXNpbXVsdGFuZW91c2x5ICh1bmRlciB0aGUgcHJvdGVjdGlvbiBvZiBidXN5IGJ1ZmZlcnMpLgorICoJCisgKglpbiBhZGRpdGlvbiB0byBpbmZvcm1hdGlvbiBmb3VuZCBpbiBkbWFwcyBhbmQgZG1hcCBjb250cm9sIHBhZ2VzLAorICoJdGhlIHdvcmtpbmcgc3RhdGUgb2YgdGhlIGJsb2NrIGFsbG9jYXRpb24gbWFwIGFsc28gaW5jbHVkZXMgcmVhZC8KKyAqCXdyaXRlIGluZm9ybWF0aW9uIG1haW50YWluZWQgaW4gdGhlIGJtYXAgZGVzY3JpcHRvciAoaS5lLiB0b3RhbAorICoJZnJlZSBibG9jayBjb3VudCwgYWxsb2NhdGlvbiBncm91cCBsZXZlbCBmcmVlIGJsb2NrIGNvdW50cykuCisgKglhIHNpbmdsZSBleGNsdXNpdmUgbG9jayAoQk1BUF9MT0NLKSBpcyB1c2VkIHRvIGd1YXJkIHRoaXMgaW5mb3JtYXRpb24KKyAqCWluIHRoZSBmYWNlIG9mIG11bHRpcGxlLWJvdHRvbXMgdXAgcmVxdWVzdHMuCisgKgkobG9jayBvcmRlcmluZzogSVJFQURfTE9DSywgQk1BUF9MT0NLKTsKKyAqCQorICoJYWNjZXNzZXMgdG8gdGhlIHBlcnNpc3RlbnQgc3RhdGUgb2YgdGhlIGJsb2NrIGFsbG9jYXRpb24gbWFwIChsaW1pdGVkCisgKgl0byB0aGUgcGVyc2lzdGVudCBiaXRtYXBzIGluIGRtYXBzKSBpcyBndWFyZGVkIGJ5IChidXN5KSBidWZmZXJzLgorICovCisKKyNkZWZpbmUgQk1BUF9MT0NLX0lOSVQoYm1wKQlpbml0X01VVEVYKCZibXAtPmRiX2JtYXBsb2NrKQorI2RlZmluZSBCTUFQX0xPQ0soYm1wKQkJZG93bigmYm1wLT5kYl9ibWFwbG9jaykKKyNkZWZpbmUgQk1BUF9VTkxPQ0soYm1wKQl1cCgmYm1wLT5kYl9ibWFwbG9jaykKKworLyoKKyAqIGZvcndhcmQgcmVmZXJlbmNlcworICovCitzdGF0aWMgdm9pZCBkYkFsbG9jQml0cyhzdHJ1Y3QgYm1hcCAqIGJtcCwgc3RydWN0IGRtYXAgKiBkcCwgczY0IGJsa25vLAorCQkJaW50IG5ibG9ja3MpOworc3RhdGljIHZvaWQgZGJTcGxpdChkbXRyZWVfdCAqIHRwLCBpbnQgbGVhZm5vLCBpbnQgc3BsaXRzeiwgaW50IG5ld3ZhbCk7CitzdGF0aWMgdm9pZCBkYkJhY2tTcGxpdChkbXRyZWVfdCAqIHRwLCBpbnQgbGVhZm5vKTsKK3N0YXRpYyB2b2lkIGRiSm9pbihkbXRyZWVfdCAqIHRwLCBpbnQgbGVhZm5vLCBpbnQgbmV3dmFsKTsKK3N0YXRpYyB2b2lkIGRiQWRqVHJlZShkbXRyZWVfdCAqIHRwLCBpbnQgbGVhZm5vLCBpbnQgbmV3dmFsKTsKK3N0YXRpYyBpbnQgZGJBZGpDdGwoc3RydWN0IGJtYXAgKiBibXAsIHM2NCBibGtubywgaW50IG5ld3ZhbCwgaW50IGFsbG9jLAorCQkgICAgaW50IGxldmVsKTsKK3N0YXRpYyBpbnQgZGJBbGxvY0FueShzdHJ1Y3QgYm1hcCAqIGJtcCwgczY0IG5ibG9ja3MsIGludCBsMm5iLCBzNjQgKiByZXN1bHRzKTsKK3N0YXRpYyBpbnQgZGJBbGxvY05leHQoc3RydWN0IGJtYXAgKiBibXAsIHN0cnVjdCBkbWFwICogZHAsIHM2NCBibGtubywKKwkJICAgICAgIGludCBuYmxvY2tzKTsKK3N0YXRpYyBpbnQgZGJBbGxvY05lYXIoc3RydWN0IGJtYXAgKiBibXAsIHN0cnVjdCBkbWFwICogZHAsIHM2NCBibGtubywKKwkJICAgICAgIGludCBuYmxvY2tzLAorCQkgICAgICAgaW50IGwybmIsIHM2NCAqIHJlc3VsdHMpOworc3RhdGljIGludCBkYkFsbG9jRG1hcChzdHJ1Y3QgYm1hcCAqIGJtcCwgc3RydWN0IGRtYXAgKiBkcCwgczY0IGJsa25vLAorCQkgICAgICAgaW50IG5ibG9ja3MpOworc3RhdGljIGludCBkYkFsbG9jRG1hcExldihzdHJ1Y3QgYm1hcCAqIGJtcCwgc3RydWN0IGRtYXAgKiBkcCwgaW50IG5ibG9ja3MsCisJCQkgIGludCBsMm5iLAorCQkJICBzNjQgKiByZXN1bHRzKTsKK3N0YXRpYyBpbnQgZGJBbGxvY0FHKHN0cnVjdCBibWFwICogYm1wLCBpbnQgYWdubywgczY0IG5ibG9ja3MsIGludCBsMm5iLAorCQkgICAgIHM2NCAqIHJlc3VsdHMpOworc3RhdGljIGludCBkYkFsbG9jQ3RsKHN0cnVjdCBibWFwICogYm1wLCBzNjQgbmJsb2NrcywgaW50IGwybmIsIHM2NCBibGtubywKKwkJICAgICAgczY0ICogcmVzdWx0cyk7CitzdGF0aWMgaW50IGRiRXh0ZW5kKHN0cnVjdCBpbm9kZSAqaXAsIHM2NCBibGtubywgczY0IG5ibG9ja3MsIHM2NCBhZGRuYmxvY2tzKTsKK3N0YXRpYyBpbnQgZGJGaW5kQml0cyh1MzIgd29yZCwgaW50IGwybmIpOworc3RhdGljIGludCBkYkZpbmRDdGwoc3RydWN0IGJtYXAgKiBibXAsIGludCBsMm5iLCBpbnQgbGV2ZWwsIHM2NCAqIGJsa25vKTsKK3N0YXRpYyBpbnQgZGJGaW5kTGVhZihkbXRyZWVfdCAqIHRwLCBpbnQgbDJuYiwgaW50ICpsZWFmaWR4KTsKK3N0YXRpYyB2b2lkIGRiRnJlZUJpdHMoc3RydWN0IGJtYXAgKiBibXAsIHN0cnVjdCBkbWFwICogZHAsIHM2NCBibGtubywKKwkJICAgICAgIGludCBuYmxvY2tzKTsKK3N0YXRpYyBpbnQgZGJGcmVlRG1hcChzdHJ1Y3QgYm1hcCAqIGJtcCwgc3RydWN0IGRtYXAgKiBkcCwgczY0IGJsa25vLAorCQkgICAgICBpbnQgbmJsb2Nrcyk7CitzdGF0aWMgaW50IGRiTWF4QnVkKHU4ICogY3ApOworczY0IGRiTWFwRmlsZVNpemVUb01hcFNpemUoc3RydWN0IGlub2RlICppcGJtYXApOworc3RhdGljIGludCBibGtzdG9sMihzNjQgbmIpOworCitzdGF0aWMgaW50IGNudGx6KHUzMiB2YWx1ZSk7CitzdGF0aWMgaW50IGNudHR6KHUzMiB3b3JkKTsKKworc3RhdGljIGludCBkYkFsbG9jRG1hcEJVKHN0cnVjdCBibWFwICogYm1wLCBzdHJ1Y3QgZG1hcCAqIGRwLCBzNjQgYmxrbm8sCisJCQkgaW50IG5ibG9ja3MpOworc3RhdGljIGludCBkYkluaXREbWFwKHN0cnVjdCBkbWFwICogZHAsIHM2NCBibGtubywgaW50IG5ibG9ja3MpOworc3RhdGljIGludCBkYkluaXREbWFwVHJlZShzdHJ1Y3QgZG1hcCAqIGRwKTsKK3N0YXRpYyBpbnQgZGJJbml0VHJlZShzdHJ1Y3QgZG1hcHRyZWUgKiBkdHApOworc3RhdGljIGludCBkYkluaXREbWFwQ3RsKHN0cnVjdCBkbWFwY3RsICogZGNwLCBpbnQgbGV2ZWwsIGludCBpKTsKK3N0YXRpYyBpbnQgZGJHZXRMMkFHU2l6ZShzNjQgbmJsb2Nrcyk7CisKKy8qCisgKglidWRkeSB0YWJsZQorICoKKyAqIHRhYmxlIHVzZWQgZm9yIGRldGVybWluaW5nIGJ1ZGR5IHNpemVzIHdpdGhpbiBjaGFyYWN0ZXJzIG9mIAorICogZG1hcCBiaXRtYXAgd29yZHMuICB0aGUgY2hhcmFjdGVycyB0aGVtc2VsdmVzIHNlcnZlIGFzIGluZGV4ZXMKKyAqIGludG8gdGhlIHRhYmxlLCB3aXRoIHRoZSB0YWJsZSBlbGVtZW50cyB5aWVsZGluZyB0aGUgbWF4aW11bQorICogYmluYXJ5IGJ1ZGR5IG9mIGZyZWUgYml0cyB3aXRoaW4gdGhlIGNoYXJhY3Rlci4KKyAqLworc3RhdGljIHM4IGJ1ZHRhYlsyNTZdID0geworCTMsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisJMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKwkyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCTIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisJMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKwkyLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLAorCTIsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsCisJMiwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwKKwkyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCTIsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsCisJMiwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwKKwkyLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLAorCTIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisJMiwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwKKwkyLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLAorCTIsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIC0xCit9OworCisKKy8qCisgKiBOQU1FOiAgICAJZGJNb3VudCgpCisgKgorICogRlVOQ1RJT046CWluaXRpYWxpemF0ZSB0aGUgYmxvY2sgYWxsb2NhdGlvbiBtYXAuCisgKgorICoJCW1lbW9yeSBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBpbi1jb3JlIGJtYXAgZGVzY3JpcHRvciBhbmQKKyAqCQl0aGUgaW4tY29yZSBkZXNjcmlwdG9yIGlzIGluaXRpYWxpemVkIGZyb20gZGlzay4KKyAqCisgKiBQQVJBTUVURVJTOgorICogICAgICBpcGJtYXAJLSAgcG9pbnRlciB0byBpbi1jb3JlIGlub2RlIGZvciB0aGUgYmxvY2sgbWFwLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAJLSBzdWNjZXNzCisgKiAgICAgIC1FTk9NRU0JLSBpbnN1ZmZpY2llbnQgbWVtb3J5CisgKiAgICAgIC1FSU8JLSBpL28gZXJyb3IKKyAqLworaW50IGRiTW91bnQoc3RydWN0IGlub2RlICppcGJtYXApCit7CisJc3RydWN0IGJtYXAgKmJtcDsKKwlzdHJ1Y3QgZGJtYXBfZGlzayAqZGJtcF9sZTsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCWludCBpOworCisJLyoKKwkgKiBhbGxvY2F0ZS9pbml0aWFsaXplIHRoZSBpbi1tZW1vcnkgYm1hcCBkZXNjcmlwdG9yCisJICovCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW4tbWVtb3J5IGJtYXAgZGVzY3JpcHRvciAqLworCWJtcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBibWFwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJtcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHJlYWQgdGhlIG9uLWRpc2sgYm1hcCBkZXNjcmlwdG9yLiAqLworCW1wID0gcmVhZF9tZXRhcGFnZShpcGJtYXAsCisJCQkgICBCTUFQQkxLTk8gPDwgSkZTX1NCSShpcGJtYXAtPmlfc2IpLT5sMm5icGVycGFnZSwKKwkJCSAgIFBTSVpFLCAwKTsKKwlpZiAobXAgPT0gTlVMTCkgeworCQlrZnJlZShibXApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBjb3B5IHRoZSBvbi1kaXNrIGJtYXAgZGVzY3JpcHRvciB0byBpdHMgaW4tbWVtb3J5IHZlcnNpb24uICovCisJZGJtcF9sZSA9IChzdHJ1Y3QgZGJtYXBfZGlzayAqKSBtcC0+ZGF0YTsKKwlibXAtPmRiX21hcHNpemUgPSBsZTY0X3RvX2NwdShkYm1wX2xlLT5kbl9tYXBzaXplKTsKKwlibXAtPmRiX25mcmVlID0gbGU2NF90b19jcHUoZGJtcF9sZS0+ZG5fbmZyZWUpOworCWJtcC0+ZGJfbDJuYnBlcnBhZ2UgPSBsZTMyX3RvX2NwdShkYm1wX2xlLT5kbl9sMm5icGVycGFnZSk7CisJYm1wLT5kYl9udW1hZyA9IGxlMzJfdG9fY3B1KGRibXBfbGUtPmRuX251bWFnKTsKKwlibXAtPmRiX21heGxldmVsID0gbGUzMl90b19jcHUoZGJtcF9sZS0+ZG5fbWF4bGV2ZWwpOworCWJtcC0+ZGJfbWF4YWcgPSBsZTMyX3RvX2NwdShkYm1wX2xlLT5kbl9tYXhhZyk7CisJYm1wLT5kYl9hZ3ByZWYgPSBsZTMyX3RvX2NwdShkYm1wX2xlLT5kbl9hZ3ByZWYpOworCWJtcC0+ZGJfYWdsZXZlbCA9IGxlMzJfdG9fY3B1KGRibXBfbGUtPmRuX2FnbGV2ZWwpOworCWJtcC0+ZGJfYWdoZWlndGggPSBsZTMyX3RvX2NwdShkYm1wX2xlLT5kbl9hZ2hlaWd0aCk7CisJYm1wLT5kYl9hZ3dpZHRoID0gbGUzMl90b19jcHUoZGJtcF9sZS0+ZG5fYWd3aWR0aCk7CisJYm1wLT5kYl9hZ3N0YXJ0ID0gbGUzMl90b19jcHUoZGJtcF9sZS0+ZG5fYWdzdGFydCk7CisJYm1wLT5kYl9hZ2wyc2l6ZSA9IGxlMzJfdG9fY3B1KGRibXBfbGUtPmRuX2FnbDJzaXplKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYQUc7IGkrKykKKwkJYm1wLT5kYl9hZ2ZyZWVbaV0gPSBsZTY0X3RvX2NwdShkYm1wX2xlLT5kbl9hZ2ZyZWVbaV0pOworCWJtcC0+ZGJfYWdzaXplID0gbGU2NF90b19jcHUoZGJtcF9sZS0+ZG5fYWdzaXplKTsKKwlibXAtPmRiX21heGZyZWVidWQgPSBkYm1wX2xlLT5kbl9tYXhmcmVlYnVkOworCisJLyogcmVsZWFzZSB0aGUgYnVmZmVyLiAqLworCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCisJLyogYmluZCB0aGUgYm1hcCBpbm9kZSBhbmQgdGhlIGJtYXAgZGVzY3JpcHRvciB0byBlYWNoIG90aGVyLiAqLworCWJtcC0+ZGJfaXBibWFwID0gaXBibWFwOworCUpGU19TQkkoaXBibWFwLT5pX3NiKS0+Ym1hcCA9IGJtcDsKKworCW1lbXNldChibXAtPmRiX2FjdGl2ZSwgMCwgc2l6ZW9mKGJtcC0+ZGJfYWN0aXZlKSk7CisJREJJTklUTUFQKGJtcC0+ZGJfbWFwc2l6ZSwgaXBibWFwLCAmYm1wLT5kYl9EQm1hcCk7CisKKwkvKgorCSAqIGFsbG9jYXRlL2luaXRpYWxpemUgdGhlIGJtYXAgbG9jaworCSAqLworCUJNQVBfTE9DS19JTklUKGJtcCk7CisKKwlyZXR1cm4gKDApOworfQorCisKKy8qCisgKiBOQU1FOiAgICAJZGJVbm1vdW50KCkKKyAqCisgKiBGVU5DVElPTjoJdGVybWluYXRlIHRoZSBibG9jayBhbGxvY2F0aW9uIG1hcCBpbiBwcmVwYXJhdGlvbiBmb3IKKyAqCQlmaWxlIHN5c3RlbSB1bm1vdW50LgorICoKKyAqIAkJdGhlIGluLWNvcmUgYm1hcCBkZXNjcmlwdG9yIGlzIHdyaXR0ZW4gdG8gZGlzayBhbmQKKyAqCQl0aGUgbWVtb3J5IGZvciB0aGlzIGRlc2NyaXB0b3IgaXMgZnJlZWQuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgaXBibWFwCS0gIHBvaW50ZXIgdG8gaW4tY29yZSBpbm9kZSBmb3IgdGhlIGJsb2NrIG1hcC4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwCS0gc3VjY2VzcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKi8KK2ludCBkYlVubW91bnQoc3RydWN0IGlub2RlICppcGJtYXAsIGludCBtb3VudGVycm9yKQoreworCXN0cnVjdCBibWFwICpibXAgPSBKRlNfU0JJKGlwYm1hcC0+aV9zYiktPmJtYXA7CisJaW50IGk7CisKKwlpZiAoIShtb3VudGVycm9yIHx8IGlzUmVhZE9ubHkoaXBibWFwKSkpCisJCWRiU3luYyhpcGJtYXApOworCisJLyoKKwkgKiBJbnZhbGlkYXRlIHRoZSBwYWdlIGNhY2hlIGJ1ZmZlcnMKKwkgKi8KKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhpcGJtYXAtPmlfbWFwcGluZywgMCk7CisKKwkvKgorCSAqIFNhbml0eSBDaGVjaworCSAqLworCWZvciAoaSA9IDA7IGkgPCBibXAtPmRiX251bWFnOyBpKyspCisJCWlmIChhdG9taWNfcmVhZCgmYm1wLT5kYl9hY3RpdmVbaV0pKQorCQkJcHJpbnRrKEtFUk5fRVJSICJkYlVubW91bnQ6IGRiX2FjdGl2ZVslZF0gPSAlZFxuIiwKKwkJCSAgICAgICBpLCBhdG9taWNfcmVhZCgmYm1wLT5kYl9hY3RpdmVbaV0pKTsKKworCS8qIGZyZWUgdGhlIG1lbW9yeSBmb3IgdGhlIGluLW1lbW9yeSBibWFwLiAqLworCWtmcmVlKGJtcCk7CisKKwlyZXR1cm4gKDApOworfQorCisvKgorICoJZGJTeW5jKCkKKyAqLworaW50IGRiU3luYyhzdHJ1Y3QgaW5vZGUgKmlwYm1hcCkKK3sKKwlzdHJ1Y3QgZGJtYXBfZGlzayAqZGJtcF9sZTsKKwlzdHJ1Y3QgYm1hcCAqYm1wID0gSkZTX1NCSShpcGJtYXAtPmlfc2IpLT5ibWFwOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJaW50IGk7CisKKwkvKgorCSAqIHdyaXRlIGJtYXAgZ2xvYmFsIGNvbnRyb2wgcGFnZQorCSAqLworCS8qIGdldCB0aGUgYnVmZmVyIGZvciB0aGUgb24tZGlzayBibWFwIGRlc2NyaXB0b3IuICovCisJbXAgPSByZWFkX21ldGFwYWdlKGlwYm1hcCwKKwkJCSAgIEJNQVBCTEtOTyA8PCBKRlNfU0JJKGlwYm1hcC0+aV9zYiktPmwybmJwZXJwYWdlLAorCQkJICAgUFNJWkUsIDApOworCWlmIChtcCA9PSBOVUxMKSB7CisJCWpmc19lcnIoImRiU3luYzogcmVhZF9tZXRhcGFnZSBmYWlsZWQhIik7CisJCXJldHVybiAtRUlPOworCX0KKwkvKiBjb3B5IHRoZSBpbi1tZW1vcnkgdmVyc2lvbiBvZiB0aGUgYm1hcCB0byB0aGUgb24tZGlzayB2ZXJzaW9uICovCisJZGJtcF9sZSA9IChzdHJ1Y3QgZGJtYXBfZGlzayAqKSBtcC0+ZGF0YTsKKwlkYm1wX2xlLT5kbl9tYXBzaXplID0gY3B1X3RvX2xlNjQoYm1wLT5kYl9tYXBzaXplKTsKKwlkYm1wX2xlLT5kbl9uZnJlZSA9IGNwdV90b19sZTY0KGJtcC0+ZGJfbmZyZWUpOworCWRibXBfbGUtPmRuX2wybmJwZXJwYWdlID0gY3B1X3RvX2xlMzIoYm1wLT5kYl9sMm5icGVycGFnZSk7CisJZGJtcF9sZS0+ZG5fbnVtYWcgPSBjcHVfdG9fbGUzMihibXAtPmRiX251bWFnKTsKKwlkYm1wX2xlLT5kbl9tYXhsZXZlbCA9IGNwdV90b19sZTMyKGJtcC0+ZGJfbWF4bGV2ZWwpOworCWRibXBfbGUtPmRuX21heGFnID0gY3B1X3RvX2xlMzIoYm1wLT5kYl9tYXhhZyk7CisJZGJtcF9sZS0+ZG5fYWdwcmVmID0gY3B1X3RvX2xlMzIoYm1wLT5kYl9hZ3ByZWYpOworCWRibXBfbGUtPmRuX2FnbGV2ZWwgPSBjcHVfdG9fbGUzMihibXAtPmRiX2FnbGV2ZWwpOworCWRibXBfbGUtPmRuX2FnaGVpZ3RoID0gY3B1X3RvX2xlMzIoYm1wLT5kYl9hZ2hlaWd0aCk7CisJZGJtcF9sZS0+ZG5fYWd3aWR0aCA9IGNwdV90b19sZTMyKGJtcC0+ZGJfYWd3aWR0aCk7CisJZGJtcF9sZS0+ZG5fYWdzdGFydCA9IGNwdV90b19sZTMyKGJtcC0+ZGJfYWdzdGFydCk7CisJZGJtcF9sZS0+ZG5fYWdsMnNpemUgPSBjcHVfdG9fbGUzMihibXAtPmRiX2FnbDJzaXplKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYQUc7IGkrKykKKwkJZGJtcF9sZS0+ZG5fYWdmcmVlW2ldID0gY3B1X3RvX2xlNjQoYm1wLT5kYl9hZ2ZyZWVbaV0pOworCWRibXBfbGUtPmRuX2Fnc2l6ZSA9IGNwdV90b19sZTY0KGJtcC0+ZGJfYWdzaXplKTsKKwlkYm1wX2xlLT5kbl9tYXhmcmVlYnVkID0gYm1wLT5kYl9tYXhmcmVlYnVkOworCisJLyogd3JpdGUgdGhlIGJ1ZmZlciAqLworCXdyaXRlX21ldGFwYWdlKG1wKTsKKworCS8qCisJICogd3JpdGUgb3V0IGRpcnR5IHBhZ2VzIG9mIGJtYXAKKwkgKi8KKwlmaWxlbWFwX2ZkYXRhd3JpdGUoaXBibWFwLT5pX21hcHBpbmcpOworCWZpbGVtYXBfZmRhdGF3YWl0KGlwYm1hcC0+aV9tYXBwaW5nKTsKKworCWlwYm1hcC0+aV9zdGF0ZSB8PSBJX0RJUlRZOworCWRpV3JpdGVTcGVjaWFsKGlwYm1hcCwgMCk7CisKKwlyZXR1cm4gKDApOworfQorCisKKy8qCisgKiBOQU1FOiAgICAJZGJGcmVlKCkKKyAqCisgKiBGVU5DVElPTjoJZnJlZSB0aGUgc3BlY2lmaWVkIGJsb2NrIHJhbmdlIGZyb20gdGhlIHdvcmtpbmcgYmxvY2sKKyAqCQlhbGxvY2F0aW9uIG1hcC4KKyAqCisgKgkJdGhlIGJsb2NrcyB3aWxsIGJlIGZyZWUgZnJvbSB0aGUgd29ya2luZyBtYXAgb25lIGRtYXAKKyAqCQlhdCBhIHRpbWUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgaXAJLSAgcG9pbnRlciB0byBpbi1jb3JlIGlub2RlOworICogICAgICBibGtubwktICBzdGFydGluZyBibG9jayBudW1iZXIgdG8gYmUgZnJlZWQuCisgKiAgICAgIG5ibG9ja3MJLSAgbnVtYmVyIG9mIGJsb2NrcyB0byBiZSBmcmVlZC4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwCS0gc3VjY2VzcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKi8KK2ludCBkYkZyZWUoc3RydWN0IGlub2RlICppcCwgczY0IGJsa25vLCBzNjQgbmJsb2NrcykKK3sKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXN0cnVjdCBkbWFwICpkcDsKKwlpbnQgbmIsIHJjOworCXM2NCBsYmxrbm8sIHJlbTsKKwlzdHJ1Y3QgaW5vZGUgKmlwYm1hcCA9IEpGU19TQkkoaXAtPmlfc2IpLT5pcGJtYXA7CisJc3RydWN0IGJtYXAgKmJtcCA9IEpGU19TQkkoaXAtPmlfc2IpLT5ibWFwOworCisJSVJFQURfTE9DSyhpcGJtYXApOworCisJLyogYmxvY2sgdG8gYmUgZnJlZWQgYmV0dGVyIGJlIHdpdGhpbiB0aGUgbWFwc2l6ZS4gKi8KKwlpZiAodW5saWtlbHkoKGJsa25vID09IDApIHx8IChibGtubyArIG5ibG9ja3MgPiBibXAtPmRiX21hcHNpemUpKSkgeworCQlJUkVBRF9VTkxPQ0soaXBibWFwKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJibGtubyA9ICVMeCwgbmJsb2NrcyA9ICVMeFxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGJsa25vLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbmJsb2Nrcyk7CisJCWpmc19lcnJvcihpcC0+aV9zYiwKKwkJCSAgImRiRnJlZTogYmxvY2sgdG8gYmUgZnJlZWQgaXMgb3V0c2lkZSB0aGUgbWFwIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qCisJICogZnJlZSB0aGUgYmxvY2tzIGEgZG1hcCBhdCBhIHRpbWUuCisJICovCisJbXAgPSBOVUxMOworCWZvciAocmVtID0gbmJsb2NrczsgcmVtID4gMDsgcmVtIC09IG5iLCBibGtubyArPSBuYikgeworCQkvKiByZWxlYXNlIHByZXZpb3VzIGRtYXAgaWYgYW55ICovCisJCWlmIChtcCkgeworCQkJd3JpdGVfbWV0YXBhZ2UobXApOworCQl9CisKKwkJLyogZ2V0IHRoZSBidWZmZXIgZm9yIHRoZSBjdXJyZW50IGRtYXAuICovCisJCWxibGtubyA9IEJMS1RPRE1BUChibGtubywgYm1wLT5kYl9sMm5icGVycGFnZSk7CisJCW1wID0gcmVhZF9tZXRhcGFnZShpcGJtYXAsIGxibGtubywgUFNJWkUsIDApOworCQlpZiAobXAgPT0gTlVMTCkgeworCQkJSVJFQURfVU5MT0NLKGlwYm1hcCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlkcCA9IChzdHJ1Y3QgZG1hcCAqKSBtcC0+ZGF0YTsKKworCQkvKiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBibG9ja3MgdG8gYmUgZnJlZWQgZnJvbQorCQkgKiB0aGlzIGRtYXAuCisJCSAqLworCQluYiA9IG1pbihyZW0sIEJQRVJETUFQIC0gKGJsa25vICYgKEJQRVJETUFQIC0gMSkpKTsKKworCQlEQkFMTE9DQ0soYm1wLT5kYl9EQm1hcCwgYm1wLT5kYl9tYXBzaXplLCBibGtubywgbmIpOworCisJCS8qIGZyZWUgdGhlIGJsb2Nrcy4gKi8KKwkJaWYgKChyYyA9IGRiRnJlZURtYXAoYm1wLCBkcCwgYmxrbm8sIG5iKSkpIHsKKwkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQkJSVJFQURfVU5MT0NLKGlwYm1hcCk7CisJCQlyZXR1cm4gKHJjKTsKKwkJfQorCisJCURCRlJFRShibXAtPmRiX0RCbWFwLCBibXAtPmRiX21hcHNpemUsIGJsa25vLCBuYik7CisJfQorCisJLyogd3JpdGUgdGhlIGxhc3QgYnVmZmVyLiAqLworCXdyaXRlX21ldGFwYWdlKG1wKTsKKworCUlSRUFEX1VOTE9DSyhpcGJtYXApOworCisJcmV0dXJuICgwKTsKK30KKworCisvKgorICogTkFNRToJZGJVcGRhdGVQTWFwKCkKKyAqCisgKiBGVU5DVElPTjogICAgdXBkYXRlIHRoZSBhbGxvY2F0aW9uIHN0YXRlIChmcmVlIG9yIGFsbG9jYXRlKSBvZiB0aGUKKyAqCQlzcGVjaWZpZWQgYmxvY2sgcmFuZ2UgaW4gdGhlIHBlcnNpc3RlbnQgYmxvY2sgYWxsb2NhdGlvbiBtYXAuCisgKgkJCisgKgkJdGhlIGJsb2NrcyB3aWxsIGJlIHVwZGF0ZWQgaW4gdGhlIHBlcnNpc3RlbnQgbWFwIG9uZQorICoJCWRtYXAgYXQgYSB0aW1lLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGlwYm1hcAktICBwb2ludGVyIHRvIGluLWNvcmUgaW5vZGUgZm9yIHRoZSBibG9jayBtYXAuCisgKiAgICAgIGZyZWUJLSBUUlVFIGlmIGJsb2NrIHJhbmdlIGlzIHRvIGJlIGZyZWVkIGZyb20gdGhlIHBlcnNpc3RlbnQKKyAqCQkgIG1hcDsgRkFMU0UgaWYgaXQgaXMgdG8gICBiZSBhbGxvY2F0ZWQuCisgKiAgICAgIGJsa25vCS0gIHN0YXJ0aW5nIGJsb2NrIG51bWJlciBvZiB0aGUgcmFuZ2UuCisgKiAgICAgIG5ibG9ja3MJLSAgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgYmxvY2tzIGluIHRoZSByYW5nZS4KKyAqICAgICAgdGJsawktICB0cmFuc2FjdGlvbiBibG9jazsKKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwCS0gc3VjY2VzcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKi8KK2ludAorZGJVcGRhdGVQTWFwKHN0cnVjdCBpbm9kZSAqaXBibWFwLAorCSAgICAgaW50IGZyZWUsIHM2NCBibGtubywgczY0IG5ibG9ja3MsIHN0cnVjdCB0YmxvY2sgKiB0YmxrKQoreworCWludCBuYmxrcywgZGJpdG5vLCB3Yml0bm8sIHJiaXRzOworCWludCB3b3JkLCBuYml0cywgbndvcmRzOworCXN0cnVjdCBibWFwICpibXAgPSBKRlNfU0JJKGlwYm1hcC0+aV9zYiktPmJtYXA7CisJczY0IGxibGtubywgcmVtLCBsYXN0bGJsa25vOworCXUzMiBtYXNrOworCXN0cnVjdCBkbWFwICpkcDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXN0cnVjdCBqZnNfbG9nICpsb2c7CisJaW50IGxzbiwgZGlmZnQsIGRpZmZwOworCisJLyogdGhlIGJsb2NrcyBiZXR0ZXIgYmUgd2l0aGluIHRoZSBtYXBzaXplLiAqLworCWlmIChibGtubyArIG5ibG9ja3MgPiBibXAtPmRiX21hcHNpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJibGtubyA9ICVMeCwgbmJsb2NrcyA9ICVMeFxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGJsa25vLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbmJsb2Nrcyk7CisJCWpmc19lcnJvcihpcGJtYXAtPmlfc2IsCisJCQkgICJkYlVwZGF0ZVBNYXA6IGJsb2NrcyBhcmUgb3V0c2lkZSB0aGUgbWFwIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGNvbXB1dGUgZGVsdGEgb2YgdHJhbnNhY3Rpb24gbHNuIGZyb20gbG9nIHN5bmNwdCAqLworCWxzbiA9IHRibGstPmxzbjsKKwlsb2cgPSAoc3RydWN0IGpmc19sb2cgKikgSkZTX1NCSSh0YmxrLT5zYiktPmxvZzsKKwlsb2dkaWZmKGRpZmZ0LCBsc24sIGxvZyk7CisKKwkvKgorCSAqIHVwZGF0ZSB0aGUgYmxvY2sgc3RhdGUgYSBkbWFwIGF0IGEgdGltZS4KKwkgKi8KKwltcCA9IE5VTEw7CisJbGFzdGxibGtubyA9IDA7CisJZm9yIChyZW0gPSBuYmxvY2tzOyByZW0gPiAwOyByZW0gLT0gbmJsa3MsIGJsa25vICs9IG5ibGtzKSB7CisJCS8qIGdldCB0aGUgYnVmZmVyIGZvciB0aGUgY3VycmVudCBkbWFwLiAqLworCQlsYmxrbm8gPSBCTEtUT0RNQVAoYmxrbm8sIGJtcC0+ZGJfbDJuYnBlcnBhZ2UpOworCQlpZiAobGJsa25vICE9IGxhc3RsYmxrbm8pIHsKKwkJCWlmIChtcCkgeworCQkJCXdyaXRlX21ldGFwYWdlKG1wKTsKKwkJCX0KKworCQkJbXAgPSByZWFkX21ldGFwYWdlKGJtcC0+ZGJfaXBibWFwLCBsYmxrbm8sIFBTSVpFLAorCQkJCQkgICAwKTsKKwkJCWlmIChtcCA9PSBOVUxMKQorCQkJCXJldHVybiAtRUlPOworCQl9CisJCWRwID0gKHN0cnVjdCBkbWFwICopIG1wLT5kYXRhOworCisJCS8qIGRldGVybWluZSB0aGUgYml0IG51bWJlciBhbmQgd29yZCB3aXRoaW4gdGhlIGRtYXAgb2YKKwkJICogdGhlIHN0YXJ0aW5nIGJsb2NrLiAgYWxzbyBkZXRlcm1pbmUgaG93IG1hbnkgYmxvY2tzCisJCSAqIGFyZSB0byBiZSB1cGRhdGVkIHdpdGhpbiB0aGlzIGRtYXAuCisJCSAqLworCQlkYml0bm8gPSBibGtubyAmIChCUEVSRE1BUCAtIDEpOworCQl3b3JkID0gZGJpdG5vID4+IEwyREJXT1JEOworCQluYmxrcyA9IG1pbihyZW0sIChzNjQpQlBFUkRNQVAgLSBkYml0bm8pOworCisJCS8qIHVwZGF0ZSB0aGUgYml0cyBvZiB0aGUgZG1hcCB3b3Jkcy4gdGhlIGZpcnN0IGFuZCBsYXN0CisJCSAqIHdvcmRzIG1heSBvbmx5IGhhdmUgYSBzdWJzZXQgb2YgdGhlaXIgYml0cyB1cGRhdGVkLiBpZgorCQkgKiB0aGlzIGlzIHRoZSBjYXNlLCB3ZSdsbCB3b3JrIGFnYWluc3QgdGhhdCB3b3JkIChpLmUuCisJCSAqIHBhcnRpYWwgZmlyc3QgYW5kL29yIGxhc3QpIG9ubHkgaW4gYSBzaW5nbGUgcGFzcy4gIGEgCisJCSAqIHNpbmdsZSBwYXNzIHdpbGwgYWxzbyBiZSB1c2VkIHRvIHVwZGF0ZSBhbGwgd29yZHMgdGhhdAorCQkgKiBhcmUgdG8gaGF2ZSBhbGwgdGhlaXIgYml0cyB1cGRhdGVkLgorCQkgKi8KKwkJZm9yIChyYml0cyA9IG5ibGtzOyByYml0cyA+IDA7CisJCSAgICAgcmJpdHMgLT0gbmJpdHMsIGRiaXRubyArPSBuYml0cykgeworCQkJLyogZGV0ZXJtaW5lIHRoZSBiaXQgbnVtYmVyIHdpdGhpbiB0aGUgd29yZCBhbmQKKwkJCSAqIHRoZSBudW1iZXIgb2YgYml0cyB3aXRoaW4gdGhlIHdvcmQuCisJCQkgKi8KKwkJCXdiaXRubyA9IGRiaXRubyAmIChEQldPUkQgLSAxKTsKKwkJCW5iaXRzID0gbWluKHJiaXRzLCBEQldPUkQgLSB3Yml0bm8pOworCisJCQkvKiBjaGVjayBpZiBvbmx5IHBhcnQgb2YgdGhlIHdvcmQgaXMgdG8gYmUgdXBkYXRlZC4gKi8KKwkJCWlmIChuYml0cyA8IERCV09SRCkgeworCQkJCS8qIHVwZGF0ZSAoZnJlZSBvciBhbGxvY2F0ZSkgdGhlIGJpdHMKKwkJCQkgKiBpbiB0aGlzIHdvcmQuCisJCQkJICovCisJCQkJbWFzayA9CisJCQkJICAgIChPTkVTIDw8IChEQldPUkQgLSBuYml0cykgPj4gd2JpdG5vKTsKKwkJCQlpZiAoZnJlZSkKKwkJCQkJZHAtPnBtYXBbd29yZF0gJj0KKwkJCQkJICAgIGNwdV90b19sZTMyKH5tYXNrKTsKKwkJCQllbHNlCisJCQkJCWRwLT5wbWFwW3dvcmRdIHw9CisJCQkJCSAgICBjcHVfdG9fbGUzMihtYXNrKTsKKworCQkJCXdvcmQgKz0gMTsKKwkJCX0gZWxzZSB7CisJCQkJLyogb25lIG9yIG1vcmUgd29yZHMgYXJlIHRvIGhhdmUgYWxsCisJCQkJICogdGhlaXIgYml0cyB1cGRhdGVkLiAgZGV0ZXJtaW5lIGhvdworCQkJCSAqIG1hbnkgd29yZHMgYW5kIGhvdyBtYW55IGJpdHMuCisJCQkJICovCisJCQkJbndvcmRzID0gcmJpdHMgPj4gTDJEQldPUkQ7CisJCQkJbmJpdHMgPSBud29yZHMgPDwgTDJEQldPUkQ7CisKKwkJCQkvKiB1cGRhdGUgKGZyZWUgb3IgYWxsb2NhdGUpIHRoZSBiaXRzCisJCQkJICogaW4gdGhlc2Ugd29yZHMuCisJCQkJICovCisJCQkJaWYgKGZyZWUpCisJCQkJCW1lbXNldCgmZHAtPnBtYXBbd29yZF0sIDAsCisJCQkJCSAgICAgICBud29yZHMgKiA0KTsKKwkJCQllbHNlCisJCQkJCW1lbXNldCgmZHAtPnBtYXBbd29yZF0sIChpbnQpIE9ORVMsCisJCQkJCSAgICAgICBud29yZHMgKiA0KTsKKworCQkJCXdvcmQgKz0gbndvcmRzOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogdXBkYXRlIGRtYXAgbHNuCisJCSAqLworCQlpZiAobGJsa25vID09IGxhc3RsYmxrbm8pCisJCQljb250aW51ZTsKKworCQlsYXN0bGJsa25vID0gbGJsa25vOworCisJCWlmIChtcC0+bHNuICE9IDApIHsKKwkJCS8qIGluaGVyaXQgb2xkZXIvc21hbGxlciBsc24gKi8KKwkJCWxvZ2RpZmYoZGlmZnAsIG1wLT5sc24sIGxvZyk7CisJCQlpZiAoZGlmZnQgPCBkaWZmcCkgeworCQkJCW1wLT5sc24gPSBsc247CisKKwkJCQkvKiBtb3ZlIGJwIGFmdGVyIHRibG9jayBpbiBsb2dzeW5jIGxpc3QgKi8KKwkJCQlMT0dTWU5DX0xPQ0sobG9nKTsKKwkJCQlsaXN0X21vdmUoJm1wLT5zeW5jbGlzdCwgJnRibGstPnN5bmNsaXN0KTsKKwkJCQlMT0dTWU5DX1VOTE9DSyhsb2cpOworCQkJfQorCisJCQkvKiBpbmhlcml0IHlvdW5nZXIvbGFyZ2VyIGNsc24gKi8KKwkJCUxPR1NZTkNfTE9DSyhsb2cpOworCQkJbG9nZGlmZihkaWZmdCwgdGJsay0+Y2xzbiwgbG9nKTsKKwkJCWxvZ2RpZmYoZGlmZnAsIG1wLT5jbHNuLCBsb2cpOworCQkJaWYgKGRpZmZ0ID4gZGlmZnApCisJCQkJbXAtPmNsc24gPSB0YmxrLT5jbHNuOworCQkJTE9HU1lOQ19VTkxPQ0sobG9nKTsKKwkJfSBlbHNlIHsKKwkJCW1wLT5sb2cgPSBsb2c7CisJCQltcC0+bHNuID0gbHNuOworCisJCQkvKiBpbnNlcnQgYnAgYWZ0ZXIgdGJsb2NrIGluIGxvZ3N5bmMgbGlzdCAqLworCQkJTE9HU1lOQ19MT0NLKGxvZyk7CisKKwkJCWxvZy0+Y291bnQrKzsKKwkJCWxpc3RfYWRkKCZtcC0+c3luY2xpc3QsICZ0YmxrLT5zeW5jbGlzdCk7CisKKwkJCW1wLT5jbHNuID0gdGJsay0+Y2xzbjsKKwkJCUxPR1NZTkNfVU5MT0NLKGxvZyk7CisJCX0KKwl9CisKKwkvKiB3cml0ZSB0aGUgbGFzdCBidWZmZXIuICovCisJaWYgKG1wKSB7CisJCXdyaXRlX21ldGFwYWdlKG1wKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCisKKy8qCisgKiBOQU1FOglkYk5leHRBRygpCisgKgorICogRlVOQ1RJT046ICAgIGZpbmQgdGhlIHByZWZlcnJlZCBhbGxvY2F0aW9uIGdyb3VwIGZvciBuZXcgYWxsb2NhdGlvbnMuCisgKgorICoJCVdpdGhpbiB0aGUgYWxsb2NhdGlvbiBncm91cHMsIHdlIG1haW50YWluIGEgcHJlZmVycmVkCisgKgkJYWxsb2NhdGlvbiBncm91cCB3aGljaCBjb25zaXN0cyBvZiBhIGdyb3VwIHdpdGggYXQgbGVhc3QKKyAqCQlhdmVyYWdlIGZyZWUgc3BhY2UuICBJdCBpcyB0aGUgcHJlZmVycmVkIGdyb3VwIHRoYXQgd2UgdGFyZ2V0CisgKgkJbmV3IGlub2RlIGFsbG9jYXRpb24gdG93YXJkcy4gIFRoZSB0aWUtaW4gYmV0d2VlbiBpbm9kZQorICoJCWFsbG9jYXRpb24gYW5kIGJsb2NrIGFsbG9jYXRpb24gb2NjdXJzIGFzIHdlIGFsbG9jYXRlIHRoZQorICoJCWZpcnN0IChkYXRhKSBibG9jayBvZiBhbiBpbm9kZSBhbmQgc3BlY2lmeSB0aGUgaW5vZGUgKGJsb2NrKQorICoJCWFzIHRoZSBhbGxvY2F0aW9uIGhpbnQgZm9yIHRoaXMgYmxvY2suCisgKgorICoJCVdlIHRyeSB0byBhdm9pZCBoYXZpbmcgbW9yZSB0aGFuIG9uZSBvcGVuIGZpbGUgZ3Jvd2luZyBpbgorICoJCWFuIGFsbG9jYXRpb24gZ3JvdXAsIGFzIHRoaXMgd2lsbCBsZWFkIHRvIGZyYWdtZW50YXRpb24uCisgKgkJVGhpcyBkaWZmZXJzIGZyb20gdGhlIG9sZCBPUy8yIG1ldGhvZCBvZiB0cnlpbmcgdG8ga2VlcAorICoJCWVtcHR5IGFncyBhcm91bmQgZm9yIGxhcmdlIGFsbG9jYXRpb25zLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGlwYm1hcAktICBwb2ludGVyIHRvIGluLWNvcmUgaW5vZGUgZm9yIHRoZSBibG9jayBtYXAuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgdGhlIHByZWZlcnJlZCBhbGxvY2F0aW9uIGdyb3VwIG51bWJlci4KKyAqLworaW50IGRiTmV4dEFHKHN0cnVjdCBpbm9kZSAqaXBibWFwKQoreworCXM2NCBhdmdmcmVlOworCWludCBhZ3ByZWY7CisJczY0IGh3bSA9IDA7CisJaW50IGk7CisJaW50IG5leHRfYmVzdCA9IC0xOworCXN0cnVjdCBibWFwICpibXAgPSBKRlNfU0JJKGlwYm1hcC0+aV9zYiktPmJtYXA7CisKKwlCTUFQX0xPQ0soYm1wKTsKKworCS8qIGRldGVybWluZSB0aGUgYXZlcmFnZSBudW1iZXIgb2YgZnJlZSBibG9ja3Mgd2l0aGluIHRoZSBhZ3MuICovCisJYXZnZnJlZSA9ICh1MzIpYm1wLT5kYl9uZnJlZSAvIGJtcC0+ZGJfbnVtYWc7CisKKwkvKgorCSAqIGlmIHRoZSBjdXJyZW50IHByZWZlcnJlZCBhZyBkb2VzIG5vdCBoYXZlIGFuIGFjdGl2ZSBhbGxvY2F0b3IKKwkgKiBhbmQgaGFzIGF0IGxlYXN0IGF2ZXJhZ2UgZnJlZXNwYWNlLCByZXR1cm4gaXQKKwkgKi8KKwlhZ3ByZWYgPSBibXAtPmRiX2FncHJlZjsKKwlpZiAoKGF0b21pY19yZWFkKCZibXAtPmRiX2FjdGl2ZVthZ3ByZWZdKSA9PSAwKSAmJgorCSAgICAoYm1wLT5kYl9hZ2ZyZWVbYWdwcmVmXSA+PSBhdmdmcmVlKSkKKwkJZ290byB1bmxvY2s7CisKKwkvKiBGcm9tIHRoZSBsYXN0IHByZWZlcnJlZCBhZywgZmluZCB0aGUgbmV4dCBvbmUgd2l0aCBhdCBsZWFzdAorCSAqIGF2ZXJhZ2UgZnJlZSBzcGFjZS4KKwkgKi8KKwlmb3IgKGkgPSAwIDsgaSA8IGJtcC0+ZGJfbnVtYWc7IGkrKywgYWdwcmVmKyspIHsKKwkJaWYgKGFncHJlZiA9PSBibXAtPmRiX251bWFnKQorCQkJYWdwcmVmID0gMDsKKworCQlpZiAoYXRvbWljX3JlYWQoJmJtcC0+ZGJfYWN0aXZlW2FncHJlZl0pKQorCQkJLyogb3BlbiBmaWxlIGlzIGN1cnJlbnRseSBncm93aW5nIGluIHRoaXMgYWcgKi8KKwkJCWNvbnRpbnVlOworCQlpZiAoYm1wLT5kYl9hZ2ZyZWVbYWdwcmVmXSA+PSBhdmdmcmVlKSB7CisJCQkvKiBSZXR1cm4gdGhpcyBvbmUgKi8KKwkJCWJtcC0+ZGJfYWdwcmVmID0gYWdwcmVmOworCQkJZ290byB1bmxvY2s7CisJCX0gZWxzZSBpZiAoYm1wLT5kYl9hZ2ZyZWVbYWdwcmVmXSA+IGh3bSkgeworCQkJLyogTGVzcyB0aGFuIGF2Zy4gZnJlZXNwYWNlLCBidXQgYmVzdCBzbyBmYXIgKi8KKwkJCWh3bSA9IGJtcC0+ZGJfYWdmcmVlW2FncHJlZl07CisJCQluZXh0X2Jlc3QgPSBhZ3ByZWY7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIG5vIGluYWN0aXZlIGFnIHdhcyBmb3VuZCB3aXRoIGF2ZXJhZ2UgZnJlZXNwYWNlLCB1c2UgdGhlCisJICogbmV4dCBiZXN0CisJICovCisJaWYgKG5leHRfYmVzdCAhPSAtMSkKKwkJYm1wLT5kYl9hZ3ByZWYgPSBuZXh0X2Jlc3Q7CisJLyogZWxzZSBsZWF2ZSBkYl9hZ3ByZWYgdW5jaGFuZ2VkICovCit1bmxvY2s6CisJQk1BUF9VTkxPQ0soYm1wKTsKKworCS8qIHJldHVybiB0aGUgcHJlZmVycmVkIGdyb3VwLgorCSAqLworCXJldHVybiAoYm1wLT5kYl9hZ3ByZWYpOworfQorCisvKgorICogTkFNRToJZGJBbGxvYygpCisgKgorICogRlVOQ1RJT046ICAgIGF0dGVtcHQgdG8gYWxsb2NhdGUgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgZnJlZQorICoJCWJsb2NrcyBmcm9tIHRoZSB3b3JraW5nIGFsbG9jYXRpb24gYmxvY2sgbWFwLgorICoKKyAqCQl0aGUgYmxvY2sgYWxsb2NhdGlvbiBwb2xpY3kgdXNlcyBoaW50cyBhbmQgYSBtdWx0aS1zdGVwCisgKgkJYXBwcm9hY2guCisgKgorICoJICAJZm9yIGFsbG9jYXRpb24gcmVxdWVzdHMgc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2YgYmxvY2tzCisgKgkJcGVyIGRtYXAsIHdlIGZpcnN0IHRyeSB0byBhbGxvY2F0ZSB0aGUgbmV3IGJsb2NrcworICoJCWltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgaGludC4gIGlmIHRoZXNlIGJsb2NrcyBhcmUgbm90CisgKgkJYXZhaWxhYmxlLCB3ZSB0cnkgdG8gYWxsb2NhdGUgYmxvY2tzIG5lYXIgdGhlIGhpbnQuICBpZgorICoJCW5vIGJsb2NrcyBuZWFyIHRoZSBoaW50IGFyZSBhdmFpbGFibGUsIHdlIG5leHQgdHJ5IHRvIAorICoJCWFsbG9jYXRlIHdpdGhpbiB0aGUgc2FtZSBkbWFwIGFzIGNvbnRhaW5zIHRoZSBoaW50LgorICoKKyAqCQlpZiBubyBibG9ja3MgYXJlIGF2YWlsYWJsZSBpbiB0aGUgZG1hcCBvciB0aGUgYWxsb2NhdGlvbgorICoJCXJlcXVlc3QgaXMgbGFyZ2VyIHRoYW4gdGhlIGRtYXAgc2l6ZSwgd2UgdHJ5IHRvIGFsbG9jYXRlCisgKgkJd2l0aGluIHRoZSBzYW1lIGFsbG9jYXRpb24gZ3JvdXAgYXMgY29udGFpbnMgdGhlIGhpbnQuIGlmCisgKgkJdGhpcyBkb2VzIG5vdCBzdWNjZWVkLCB3ZSBmaW5hbGx5IHRyeSB0byBhbGxvY2F0ZSBhbnl3aGVyZQorICoJCXdpdGhpbiB0aGUgYWdncmVnYXRlLgorICoKKyAqCQl3ZSBhbHNvIHRyeSB0byBhbGxvY2F0ZSBhbnl3aGVyZSB3aXRoaW4gdGhlIGFnZ3JlZ2F0ZSBmb3IKKyAqCQlmb3IgYWxsb2NhdGlvbiByZXF1ZXN0cyBsYXJnZXIgdGhhbiB0aGUgYWxsb2NhdGlvbiBncm91cAorICoJCXNpemUgb3IgcmVxdWVzdHMgdGhhdCBzcGVjaWZ5IG5vIGhpbnQgdmFsdWUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgaXAJLSAgcG9pbnRlciB0byBpbi1jb3JlIGlub2RlOworICogICAgICBoaW50CS0gYWxsb2NhdGlvbiBoaW50LgorICogICAgICBuYmxvY2tzCS0gbnVtYmVyIG9mIGNvbnRpZ3VvdXMgYmxvY2tzIGluIHRoZSByYW5nZS4KKyAqICAgICAgcmVzdWx0cwktIG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBzZXQgdG8gdGhlIHN0YXJ0aW5nIGJsb2NrIG51bWJlcgorICoJCSAgb2YgdGhlIG5ld2x5IGFsbG9jYXRlZCBjb250aWd1b3VzIHJhbmdlLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAJLSBzdWNjZXNzCisgKiAgICAgIC1FTk9TUEMJLSBpbnN1ZmZpY2llbnQgZGlzayByZXNvdXJjZXMKKyAqICAgICAgLUVJTwktIGkvbyBlcnJvcgorICovCitpbnQgZGJBbGxvYyhzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgaGludCwgczY0IG5ibG9ja3MsIHM2NCAqIHJlc3VsdHMpCit7CisJaW50IHJjLCBhZ25vOworCXN0cnVjdCBpbm9kZSAqaXBibWFwID0gSkZTX1NCSShpcC0+aV9zYiktPmlwYm1hcDsKKwlzdHJ1Y3QgYm1hcCAqYm1wOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJczY0IGxibGtubywgYmxrbm87CisJc3RydWN0IGRtYXAgKmRwOworCWludCBsMm5iOworCXM2NCBtYXBTaXplOworCWludCB3cml0ZXJzOworCisJLyogYXNzZXJ0IHRoYXQgbmJsb2NrcyBpcyB2YWxpZCAqLworCWFzc2VydChuYmxvY2tzID4gMCk7CisKKyNpZmRlZiBfU1RJTExfVE9fUE9SVAorCS8qIERBU0QgbGltaXQgY2hlY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRjIyNjk0MSAqLworCWlmIChPVkVSX0xJTUlUKGlwLCBuYmxvY2tzKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisjZW5kaWYJCQkJLyogX1NUSUxMX1RPX1BPUlQgKi8KKworCS8qIGdldCB0aGUgbG9nMiBudW1iZXIgb2YgYmxvY2tzIHRvIGJlIGFsbG9jYXRlZC4KKwkgKiBpZiB0aGUgbnVtYmVyIG9mIGJsb2NrcyBpcyBub3QgYSBsb2cyIG11bHRpcGxlLCAKKwkgKiBpdCB3aWxsIGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgbG9nMiBtdWx0aXBsZS4KKwkgKi8KKwlsMm5iID0gQkxLU1RPTDIobmJsb2Nrcyk7CisKKwlibXAgPSBKRlNfU0JJKGlwLT5pX3NiKS0+Ym1hcDsKKworLy9yZXRyeTogICAgICAgIC8qIHNlcmlhbGl6ZSB3LnIudC5leHRlbmRmcygpICovCisJbWFwU2l6ZSA9IGJtcC0+ZGJfbWFwc2l6ZTsKKworCS8qIHRoZSBoaW50IHNob3VsZCBiZSB3aXRoaW4gdGhlIG1hcCAqLworCWlmIChoaW50ID49IG1hcFNpemUpIHsKKwkJamZzX2Vycm9yKGlwLT5pX3NiLCAiZGJBbGxvYzogdGhlIGhpbnQgaXMgb3V0c2lkZSB0aGUgbWFwIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGlmIHRoZSBudW1iZXIgb2YgYmxvY2tzIHRvIGJlIGFsbG9jYXRlZCBpcyBncmVhdGVyIHRoYW4gdGhlCisJICogYWxsb2NhdGlvbiBncm91cCBzaXplLCB0cnkgdG8gYWxsb2NhdGUgYW55d2hlcmUuCisJICovCisJaWYgKGwybmIgPiBibXAtPmRiX2FnbDJzaXplKSB7CisJCUlXUklURV9MT0NLKGlwYm1hcCk7CisKKwkJcmMgPSBkYkFsbG9jQW55KGJtcCwgbmJsb2NrcywgbDJuYiwgcmVzdWx0cyk7CisJCWlmIChyYyA9PSAwKSB7CisJCQlEQkFMTE9DKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwgKnJlc3VsdHMsCisJCQkJbmJsb2Nrcyk7CisJCX0KKworCQlnb3RvIHdyaXRlX3VubG9jazsKKwl9CisKKwkvKgorCSAqIElmIG5vIGhpbnQsIGxldCBkYk5leHRBRyByZWNvbW1lbmQgYW4gYWxsb2NhdGlvbiBncm91cAorCSAqLworCWlmIChoaW50ID09IDApCisJCWdvdG8gcHJlZl9hZzsKKworCS8qIHdlIHdvdWxkIGxpa2UgdG8gYWxsb2NhdGUgY2xvc2UgdG8gdGhlIGhpbnQuICBhZGp1c3QgdGhlCisJICogaGludCB0byB0aGUgYmxvY2sgZm9sbG93aW5nIHRoZSBoaW50IHNpbmNlIHRoZSBhbGxvY2F0b3JzCisJICogd2lsbCBzdGFydCBsb29raW5nIGZvciBmcmVlIHNwYWNlIHN0YXJ0aW5nIGF0IHRoaXMgcG9pbnQuCisJICovCisJYmxrbm8gPSBoaW50ICsgMTsKKworCWlmIChibGtubyA+PSBibXAtPmRiX21hcHNpemUpCisJCWdvdG8gcHJlZl9hZzsKKworCWFnbm8gPSBibGtubyA+PiBibXAtPmRiX2FnbDJzaXplOworCisJLyogY2hlY2sgaWYgYmxrbm8gY3Jvc3NlcyBvdmVyIGludG8gYSBuZXcgYWxsb2NhdGlvbiBncm91cC4KKwkgKiBpZiBzbywgY2hlY2sgaWYgd2Ugc2hvdWxkIGFsbG93IGFsbG9jYXRpb25zIHdpdGhpbiB0aGlzCisJICogYWxsb2NhdGlvbiBncm91cC4KKwkgKi8KKwlpZiAoKGJsa25vICYgKGJtcC0+ZGJfYWdzaXplIC0gMSkpID09IDApCisJCS8qIGNoZWNrIGlmIHRoZSBBRyBpcyBjdXJyZW5seSBiZWluZyB3cml0dGVuIHRvLgorCQkgKiBpZiBzbywgY2FsbCBkYk5leHRBRygpIHRvIGZpbmQgYSBub24tYnVzeQorCQkgKiBBRyB3aXRoIHN1ZmZpY2llbnQgZnJlZSBzcGFjZS4KKwkJICovCisJCWlmIChhdG9taWNfcmVhZCgmYm1wLT5kYl9hY3RpdmVbYWdub10pKQorCQkJZ290byBwcmVmX2FnOworCisJLyogY2hlY2sgaWYgdGhlIGFsbG9jYXRpb24gcmVxdWVzdCBzaXplIGNhbiBiZSBzYXRpc2ZpZWQgZnJvbSBhCisJICogc2luZ2xlIGRtYXAuICBpZiBzbywgdHJ5IHRvIGFsbG9jYXRlIGZyb20gdGhlIGRtYXAgY29udGFpbmluZworCSAqIHRoZSBoaW50IHVzaW5nIGEgdGllcmVkIHN0cmF0ZWd5LgorCSAqLworCWlmIChuYmxvY2tzIDw9IEJQRVJETUFQKSB7CisJCUlSRUFEX0xPQ0soaXBibWFwKTsKKworCQkvKiBnZXQgdGhlIGJ1ZmZlciBmb3IgdGhlIGRtYXAgY29udGFpbmluZyB0aGUgaGludC4KKwkJICovCisJCXJjID0gLUVJTzsKKwkJbGJsa25vID0gQkxLVE9ETUFQKGJsa25vLCBibXAtPmRiX2wybmJwZXJwYWdlKTsKKwkJbXAgPSByZWFkX21ldGFwYWdlKGlwYm1hcCwgbGJsa25vLCBQU0laRSwgMCk7CisJCWlmIChtcCA9PSBOVUxMKQorCQkJZ290byByZWFkX3VubG9jazsKKworCQlkcCA9IChzdHJ1Y3QgZG1hcCAqKSBtcC0+ZGF0YTsKKworCQkvKiBmaXJzdCwgdHJ5IHRvIHNhdGlzZnkgdGhlIGFsbG9jYXRpb24gcmVxdWVzdCB3aXRoIHRoZQorCQkgKiBibG9ja3MgYmVnaW5uaW5nIGF0IHRoZSBoaW50LgorCQkgKi8KKwkJaWYgKChyYyA9IGRiQWxsb2NOZXh0KGJtcCwgZHAsIGJsa25vLCAoaW50KSBuYmxvY2tzKSkKKwkJICAgICE9IC1FTk9TUEMpIHsKKwkJCWlmIChyYyA9PSAwKSB7CisJCQkJKnJlc3VsdHMgPSBibGtubzsKKwkJCQlEQkFMTE9DKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwKKwkJCQkJKnJlc3VsdHMsIG5ibG9ja3MpOworCQkJCW1hcmtfbWV0YXBhZ2VfZGlydHkobXApOworCQkJfQorCisJCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJCWdvdG8gcmVhZF91bmxvY2s7CisJCX0KKworCQl3cml0ZXJzID0gYXRvbWljX3JlYWQoJmJtcC0+ZGJfYWN0aXZlW2Fnbm9dKTsKKwkJaWYgKCh3cml0ZXJzID4gMSkgfHwKKwkJICAgICgod3JpdGVycyA9PSAxKSAmJiAoSkZTX0lQKGlwKS0+YWN0aXZlX2FnICE9IGFnbm8pKSkgeworCQkJLyoKKwkJCSAqIFNvbWVvbmUgZWxzZSBpcyB3cml0aW5nIGluIHRoaXMgYWxsb2NhdGlvbgorCQkJICogZ3JvdXAuICBUbyBhdm9pZCBmcmFnbWVudGluZywgdHJ5IGFub3RoZXIgYWcKKwkJCSAqLworCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQlJUkVBRF9VTkxPQ0soaXBibWFwKTsKKwkJCWdvdG8gcHJlZl9hZzsKKwkJfQorCisJCS8qIG5leHQsIHRyeSB0byBzYXRpc2Z5IHRoZSBhbGxvY2F0aW9uIHJlcXVlc3Qgd2l0aCBibG9ja3MKKwkJICogbmVhciB0aGUgaGludC4KKwkJICovCisJCWlmICgocmMgPQorCQkgICAgIGRiQWxsb2NOZWFyKGJtcCwgZHAsIGJsa25vLCAoaW50KSBuYmxvY2tzLCBsMm5iLCByZXN1bHRzKSkKKwkJICAgICE9IC1FTk9TUEMpIHsKKwkJCWlmIChyYyA9PSAwKSB7CisJCQkJREJBTExPQyhibXAtPmRiX0RCbWFwLCBibXAtPmRiX21hcHNpemUsCisJCQkJCSpyZXN1bHRzLCBuYmxvY2tzKTsKKwkJCQltYXJrX21ldGFwYWdlX2RpcnR5KG1wKTsKKwkJCX0KKworCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQlnb3RvIHJlYWRfdW5sb2NrOworCQl9CisKKwkJLyogdHJ5IHRvIHNhdGlzZnkgdGhlIGFsbG9jYXRpb24gcmVxdWVzdCB3aXRoIGJsb2NrcyB3aXRoaW4KKwkJICogdGhlIHNhbWUgZG1hcCBhcyB0aGUgaGludC4KKwkJICovCisJCWlmICgocmMgPSBkYkFsbG9jRG1hcExldihibXAsIGRwLCAoaW50KSBuYmxvY2tzLCBsMm5iLCByZXN1bHRzKSkKKwkJICAgICE9IC1FTk9TUEMpIHsKKwkJCWlmIChyYyA9PSAwKSB7CisJCQkJREJBTExPQyhibXAtPmRiX0RCbWFwLCBibXAtPmRiX21hcHNpemUsCisJCQkJCSpyZXN1bHRzLCBuYmxvY2tzKTsKKwkJCQltYXJrX21ldGFwYWdlX2RpcnR5KG1wKTsKKwkJCX0KKworCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQlnb3RvIHJlYWRfdW5sb2NrOworCQl9CisKKwkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCUlSRUFEX1VOTE9DSyhpcGJtYXApOworCX0KKworCS8qIHRyeSB0byBzYXRpc2Z5IHRoZSBhbGxvY2F0aW9uIHJlcXVlc3Qgd2l0aCBibG9ja3Mgd2l0aGluCisJICogdGhlIHNhbWUgYWxsb2NhdGlvbiBncm91cCBhcyB0aGUgaGludC4KKwkgKi8KKwlJV1JJVEVfTE9DSyhpcGJtYXApOworCWlmICgocmMgPSBkYkFsbG9jQUcoYm1wLCBhZ25vLCBuYmxvY2tzLCBsMm5iLCByZXN1bHRzKSkKKwkgICAgIT0gLUVOT1NQQykgeworCQlpZiAocmMgPT0gMCkKKwkJCURCQUxMT0MoYm1wLT5kYl9EQm1hcCwgYm1wLT5kYl9tYXBzaXplLAorCQkJCSpyZXN1bHRzLCBuYmxvY2tzKTsKKwkJZ290byB3cml0ZV91bmxvY2s7CisJfQorCUlXUklURV9VTkxPQ0soaXBibWFwKTsKKworCisgICAgICBwcmVmX2FnOgorCS8qCisJICogTGV0IGRiTmV4dEFHIHJlY29tbWVuZCBhIHByZWZlcnJlZCBhbGxvY2F0aW9uIGdyb3VwCisJICovCisJYWdubyA9IGRiTmV4dEFHKGlwYm1hcCk7CisJSVdSSVRFX0xPQ0soaXBibWFwKTsKKworCS8qIFRyeSB0byBhbGxvY2F0ZSB3aXRoaW4gdGhpcyBhbGxvY2F0aW9uIGdyb3VwLiAgaWYgdGhhdCBmYWlscywgdHJ5IHRvCisJICogYWxsb2NhdGUgYW55d2hlcmUgaW4gdGhlIG1hcC4KKwkgKi8KKwlpZiAoKHJjID0gZGJBbGxvY0FHKGJtcCwgYWdubywgbmJsb2NrcywgbDJuYiwgcmVzdWx0cykpID09IC1FTk9TUEMpCisJCXJjID0gZGJBbGxvY0FueShibXAsIG5ibG9ja3MsIGwybmIsIHJlc3VsdHMpOworCWlmIChyYyA9PSAwKSB7CisJCURCQUxMT0MoYm1wLT5kYl9EQm1hcCwgYm1wLT5kYl9tYXBzaXplLCAqcmVzdWx0cywgbmJsb2Nrcyk7CisJfQorCisgICAgICB3cml0ZV91bmxvY2s6CisJSVdSSVRFX1VOTE9DSyhpcGJtYXApOworCisJcmV0dXJuIChyYyk7CisKKyAgICAgIHJlYWRfdW5sb2NrOgorCUlSRUFEX1VOTE9DSyhpcGJtYXApOworCisJcmV0dXJuIChyYyk7Cit9CisKKyNpZmRlZiBfTk9UWUVUCisvKgorICogTkFNRToJZGJBbGxvY0V4YWN0KCkKKyAqCisgKiBGVU5DVElPTjogICAgdHJ5IHRvIGFsbG9jYXRlIHRoZSByZXF1ZXN0ZWQgZXh0ZW50OworICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGlwCS0gcG9pbnRlciB0byBpbi1jb3JlIGlub2RlOworICogICAgICBibGtubwktIGV4dGVudCBhZGRyZXNzOworICogICAgICBuYmxvY2tzCS0gZXh0ZW50IGxlbmd0aDsKKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwCS0gc3VjY2VzcworICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzCisgKiAgICAgIC1FSU8JLSBpL28gZXJyb3IKKyAqLworaW50IGRiQWxsb2NFeGFjdChzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgYmxrbm8sIGludCBuYmxvY2tzKQoreworCWludCByYzsKKwlzdHJ1Y3QgaW5vZGUgKmlwYm1hcCA9IEpGU19TQkkoaXAtPmlfc2IpLT5pcGJtYXA7CisJc3RydWN0IGJtYXAgKmJtcCA9IEpGU19TQkkoaXAtPmlfc2IpLT5ibWFwOworCXN0cnVjdCBkbWFwICpkcDsKKwlzNjQgbGJsa25vOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisKKwlJUkVBRF9MT0NLKGlwYm1hcCk7CisKKwkvKgorCSAqIHZhbGlkYXRlIGV4dGVudCByZXF1ZXN0OgorCSAqCisJICogbm90ZTogZGVmcmFnZnMgcG9saWN5OgorCSAqICBtYXggNjQgYmxvY2tzIHdpbGwgYmUgbW92ZWQuICAKKwkgKiAgYWxsb2NhdGlvbiByZXF1ZXN0IHNpemUgbXVzdCBiZSBzYXRpc2ZpZWQgZnJvbSBhIHNpbmdsZSBkbWFwLgorCSAqLworCWlmIChuYmxvY2tzIDw9IDAgfHwgbmJsb2NrcyA+IEJQRVJETUFQIHx8IGJsa25vID49IGJtcC0+ZGJfbWFwc2l6ZSkgeworCQlJUkVBRF9VTkxPQ0soaXBibWFwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG5ibG9ja3MgPiAoKHM2NCkgMSA8PCBibXAtPmRiX21heGZyZWVidWQpKSB7CisJCS8qIHRoZSBmcmVlIHNwYWNlIGlzIG5vIGxvbmdlciBhdmFpbGFibGUgKi8KKwkJSVJFQURfVU5MT0NLKGlwYm1hcCk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCS8qIHJlYWQgaW4gdGhlIGRtYXAgY292ZXJpbmcgdGhlIGV4dGVudCAqLworCWxibGtubyA9IEJMS1RPRE1BUChibGtubywgYm1wLT5kYl9sMm5icGVycGFnZSk7CisJbXAgPSByZWFkX21ldGFwYWdlKGlwYm1hcCwgbGJsa25vLCBQU0laRSwgMCk7CisJaWYgKG1wID09IE5VTEwpIHsKKwkJSVJFQURfVU5MT0NLKGlwYm1hcCk7CisJCXJldHVybiAtRUlPOworCX0KKwlkcCA9IChzdHJ1Y3QgZG1hcCAqKSBtcC0+ZGF0YTsKKworCS8qIHRyeSB0byBhbGxvY2F0ZSB0aGUgcmVxdWVzdGVkIGV4dGVudCAqLworCXJjID0gZGJBbGxvY05leHQoYm1wLCBkcCwgYmxrbm8sIG5ibG9ja3MpOworCisJSVJFQURfVU5MT0NLKGlwYm1hcCk7CisKKwlpZiAocmMgPT0gMCkgeworCQlEQkFMTE9DKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwgYmxrbm8sIG5ibG9ja3MpOworCQltYXJrX21ldGFwYWdlX2RpcnR5KG1wKTsKKwl9CisJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisKKwlyZXR1cm4gKHJjKTsKK30KKyNlbmRpZiAvKiBfTk9UWUVUICovCisKKy8qCisgKiBOQU1FOglkYlJlQWxsb2MoKQorICoKKyAqIEZVTkNUSU9OOiAgICBhdHRlbXB0IHRvIGV4dGVuZCBhIGN1cnJlbnQgYWxsb2NhdGlvbiBieSBhIHNwZWNpZmllZAorICoJCW51bWJlciBvZiBibG9ja3MuCisgKgorICoJCXRoaXMgcm91dGluZSBhdHRlbXB0cyB0byBzYXRpc2Z5IHRoZSBhbGxvY2F0aW9uIHJlcXVlc3QKKyAqCQlieSBmaXJzdCB0cnlpbmcgdG8gZXh0ZW5kIHRoZSBleGlzdGluZyBhbGxvY2F0aW9uIGluCisgKgkJcGxhY2UgYnkgYWxsb2NhdGluZyB0aGUgYWRkaXRpb25hbCBibG9ja3MgYXMgdGhlIGJsb2NrcworICoJCWltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgY3VycmVudCBhbGxvY2F0aW9uLiAgaWYgdGhlc2UKKyAqCQlibG9ja3MgYXJlIG5vdCBhdmFpbGFibGUsIHRoaXMgcm91dGluZSB3aWxsIGF0dGVtcHQgdG8KKyAqCQlhbGxvY2F0ZSBhIG5ldyBzZXQgb2YgY29udGlndW91cyBibG9ja3MgbGFyZ2UgZW5vdWdoCisgKgkJdG8gY292ZXIgdGhlIGV4aXN0aW5nIGFsbG9jYXRpb24gcGx1cyB0aGUgYWRkaXRpb25hbAorICoJCW51bWJlciBvZiBibG9ja3MgcmVxdWlyZWQuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgaXAJICAgIC0gIHBvaW50ZXIgdG8gaW4tY29yZSBpbm9kZSByZXF1aXJpbmcgYWxsb2NhdGlvbi4KKyAqICAgICAgYmxrbm8JICAgIC0gIHN0YXJ0aW5nIGJsb2NrIG9mIHRoZSBjdXJyZW50IGFsbG9jYXRpb24uCisgKiAgICAgIG5ibG9ja3MJICAgIC0gIG51bWJlciBvZiBjb250aWd1b3VzIGJsb2NrcyB3aXRoaW4gdGhlIGN1cnJlbnQKKyAqCQkgICAgICAgYWxsb2NhdGlvbi4KKyAqICAgICAgYWRkbmJsb2NrcyAgLSAgbnVtYmVyIG9mIGJsb2NrcyB0byBhZGQgdG8gdGhlIGFsbG9jYXRpb24uCisgKiAgICAgIHJlc3VsdHMJLSAgICAgIG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBzZXQgdG8gdGhlIHN0YXJ0aW5nIGJsb2NrIG51bWJlcgorICoJCSAgICAgICBvZiB0aGUgZXhpc3RpbmcgYWxsb2NhdGlvbiBpZiB0aGUgZXhpc3RpbmcgYWxsb2NhdGlvbgorICoJCSAgICAgICB3YXMgZXh0ZW5kZWQgaW4gcGxhY2Ugb3IgdG8gYSBuZXdseSBhbGxvY2F0ZWQgY29udGlndW91cworICoJCSAgICAgICByYW5nZSBpZiB0aGUgZXhpc3RpbmcgYWxsb2NhdGlvbiBjb3VsZCBub3QgYmUgZXh0ZW5kZWQKKyAqCQkgICAgICAgaW4gcGxhY2UuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMAktIHN1Y2Nlc3MKKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBkaXNrIHJlc291cmNlcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKi8KK2ludAorZGJSZUFsbG9jKHN0cnVjdCBpbm9kZSAqaXAsCisJICBzNjQgYmxrbm8sIHM2NCBuYmxvY2tzLCBzNjQgYWRkbmJsb2NrcywgczY0ICogcmVzdWx0cykKK3sKKwlpbnQgcmM7CisKKwkvKiB0cnkgdG8gZXh0ZW5kIHRoZSBhbGxvY2F0aW9uIGluIHBsYWNlLgorCSAqLworCWlmICgocmMgPSBkYkV4dGVuZChpcCwgYmxrbm8sIG5ibG9ja3MsIGFkZG5ibG9ja3MpKSA9PSAwKSB7CisJCSpyZXN1bHRzID0gYmxrbm87CisJCXJldHVybiAoMCk7CisJfSBlbHNlIHsKKwkJaWYgKHJjICE9IC1FTk9TUEMpCisJCQlyZXR1cm4gKHJjKTsKKwl9CisKKwkvKiBjb3VsZCBub3QgZXh0ZW5kIHRoZSBhbGxvY2F0aW9uIGluIHBsYWNlLCBzbyBhbGxvY2F0ZSBhCisJICogbmV3IHNldCBvZiBibG9ja3MgZm9yIHRoZSBlbnRpcmUgcmVxdWVzdCAoaS5lLiB0cnkgdG8gZ2V0CisJICogYSByYW5nZSBvZiBjb250aWd1b3VzIGJsb2NrcyBsYXJnZSBlbm91Z2ggdG8gY292ZXIgdGhlCisJICogZXhpc3RpbmcgYWxsb2NhdGlvbiBwbHVzIHRoZSBhZGRpdGlvbmFsIGJsb2Nrcy4pCisJICovCisJcmV0dXJuIChkYkFsbG9jCisJCShpcCwgYmxrbm8gKyBuYmxvY2tzIC0gMSwgYWRkbmJsb2NrcyArIG5ibG9ja3MsIHJlc3VsdHMpKTsKK30KKworCisvKgorICogTkFNRToJZGJFeHRlbmQoKQorICoKKyAqIEZVTkNUSU9OOiAgICBhdHRlbXB0IHRvIGV4dGVuZCBhIGN1cnJlbnQgYWxsb2NhdGlvbiBieSBhIHNwZWNpZmllZAorICoJCW51bWJlciBvZiBibG9ja3MuCisgKgorICoJCXRoaXMgcm91dGluZSBhdHRlbXB0cyB0byBzYXRpc2Z5IHRoZSBhbGxvY2F0aW9uIHJlcXVlc3QKKyAqCQlieSBmaXJzdCB0cnlpbmcgdG8gZXh0ZW5kIHRoZSBleGlzdGluZyBhbGxvY2F0aW9uIGluCisgKgkJcGxhY2UgYnkgYWxsb2NhdGluZyB0aGUgYWRkaXRpb25hbCBibG9ja3MgYXMgdGhlIGJsb2NrcworICoJCWltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgY3VycmVudCBhbGxvY2F0aW9uLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGlwCSAgICAtICBwb2ludGVyIHRvIGluLWNvcmUgaW5vZGUgcmVxdWlyaW5nIGFsbG9jYXRpb24uCisgKiAgICAgIGJsa25vCSAgICAtICBzdGFydGluZyBibG9jayBvZiB0aGUgY3VycmVudCBhbGxvY2F0aW9uLgorICogICAgICBuYmxvY2tzCSAgICAtICBudW1iZXIgb2YgY29udGlndW91cyBibG9ja3Mgd2l0aGluIHRoZSBjdXJyZW50CisgKgkJICAgICAgIGFsbG9jYXRpb24uCisgKiAgICAgIGFkZG5ibG9ja3MgIC0gIG51bWJlciBvZiBibG9ja3MgdG8gYWRkIHRvIHRoZSBhbGxvY2F0aW9uLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAJLSBzdWNjZXNzCisgKiAgICAgIC1FTk9TUEMJLSBpbnN1ZmZpY2llbnQgZGlzayByZXNvdXJjZXMKKyAqICAgICAgLUVJTwktIGkvbyBlcnJvcgorICovCitzdGF0aWMgaW50IGRiRXh0ZW5kKHN0cnVjdCBpbm9kZSAqaXAsIHM2NCBibGtubywgczY0IG5ibG9ja3MsIHM2NCBhZGRuYmxvY2tzKQoreworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShpcC0+aV9zYik7CisJczY0IGxibGtubywgbGFzdGJsa25vLCBleHRibGtubzsKKwl1aW50IHJlbF9ibG9jazsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXN0cnVjdCBkbWFwICpkcDsKKwlpbnQgcmM7CisJc3RydWN0IGlub2RlICppcGJtYXAgPSBzYmktPmlwYm1hcDsKKwlzdHJ1Y3QgYm1hcCAqYm1wOworCisJLyoKKwkgKiBXZSBkb24ndCB3YW50IGEgbm9uLWFsaWduZWQgZXh0ZW50IHRvIGNyb3NzIGEgcGFnZSBib3VuZGFyeQorCSAqLworCWlmICgoKHJlbF9ibG9jayA9IGJsa25vICYgKHNiaS0+bmJwZXJwYWdlIC0gMSkpKSAmJgorCSAgICAocmVsX2Jsb2NrICsgbmJsb2NrcyArIGFkZG5ibG9ja3MgPiBzYmktPm5icGVycGFnZSkpCisJCXJldHVybiAtRU5PU1BDOworCisJLyogZ2V0IHRoZSBsYXN0IGJsb2NrIG9mIHRoZSBjdXJyZW50IGFsbG9jYXRpb24gKi8KKwlsYXN0Ymxrbm8gPSBibGtubyArIG5ibG9ja3MgLSAxOworCisJLyogZGV0ZXJtaW5lIHRoZSBibG9jayBudW1iZXIgb2YgdGhlIGJsb2NrIGZvbGxvd2luZworCSAqIHRoZSBleGlzdGluZyBhbGxvY2F0aW9uLgorCSAqLworCWV4dGJsa25vID0gbGFzdGJsa25vICsgMTsKKworCUlSRUFEX0xPQ0soaXBibWFwKTsKKworCS8qIGJldHRlciBiZSB3aXRoaW4gdGhlIGZpbGUgc3lzdGVtICovCisJYm1wID0gc2JpLT5ibWFwOworCWlmIChsYXN0Ymxrbm8gPCAwIHx8IGxhc3RibGtubyA+PSBibXAtPmRiX21hcHNpemUpIHsKKwkJSVJFQURfVU5MT0NLKGlwYm1hcCk7CisJCWpmc19lcnJvcihpcC0+aV9zYiwKKwkJCSAgImRiRXh0ZW5kOiB0aGUgYmxvY2sgaXMgb3V0c2lkZSB0aGUgZmlsZXN5c3RlbSIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiB3ZSdsbCBhdHRlbXB0IHRvIGV4dGVuZCB0aGUgY3VycmVudCBhbGxvY2F0aW9uIGluIHBsYWNlIGJ5CisJICogYWxsb2NhdGluZyB0aGUgYWRkaXRpb25hbCBibG9ja3MgYXMgdGhlIGJsb2NrcyBpbW1lZGlhdGVseQorCSAqIGZvbGxvd2luZyB0aGUgY3VycmVudCBhbGxvY2F0aW9uLiAgd2Ugb25seSB0cnkgdG8gZXh0ZW5kIHRoZQorCSAqIGN1cnJlbnQgYWxsb2NhdGlvbiBpbiBwbGFjZSBpZiB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgYmxvY2tzCisJICogY2FuIGZpdCBpbnRvIGEgZG1hcCwgdGhlIGxhc3QgYmxvY2sgb2YgdGhlIGN1cnJlbnQgYWxsb2NhdGlvbgorCSAqIGlzIG5vdCB0aGUgbGFzdCBibG9jayBvZiB0aGUgZmlsZSBzeXN0ZW0sIGFuZCB0aGUgc3RhcnQgb2YgdGhlCisJICogaW5wbGFjZSBleHRlbnNpb24gaXMgbm90IG9uIGFuIGFsbG9jYXRpb24gZ3JvdXAgYm91bmRhcnkuCisJICovCisJaWYgKGFkZG5ibG9ja3MgPiBCUEVSRE1BUCB8fCBleHRibGtubyA+PSBibXAtPmRiX21hcHNpemUgfHwKKwkgICAgKGV4dGJsa25vICYgKGJtcC0+ZGJfYWdzaXplIC0gMSkpID09IDApIHsKKwkJSVJFQURfVU5MT0NLKGlwYm1hcCk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCS8qIGdldCB0aGUgYnVmZmVyIGZvciB0aGUgZG1hcCBjb250YWluaW5nIHRoZSBmaXJzdCBibG9jaworCSAqIG9mIHRoZSBleHRlbnNpb24uCisJICovCisJbGJsa25vID0gQkxLVE9ETUFQKGV4dGJsa25vLCBibXAtPmRiX2wybmJwZXJwYWdlKTsKKwltcCA9IHJlYWRfbWV0YXBhZ2UoaXBibWFwLCBsYmxrbm8sIFBTSVpFLCAwKTsKKwlpZiAobXAgPT0gTlVMTCkgeworCQlJUkVBRF9VTkxPQ0soaXBibWFwKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJREJBTExPQ0NLKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwgYmxrbm8sIG5ibG9ja3MpOworCWRwID0gKHN0cnVjdCBkbWFwICopIG1wLT5kYXRhOworCisJLyogdHJ5IHRvIGFsbG9jYXRlIHRoZSBibG9ja3MgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZQorCSAqIGN1cnJlbnQgYWxsb2NhdGlvbi4KKwkgKi8KKwlyYyA9IGRiQWxsb2NOZXh0KGJtcCwgZHAsIGV4dGJsa25vLCAoaW50KSBhZGRuYmxvY2tzKTsKKworCUlSRUFEX1VOTE9DSyhpcGJtYXApOworCisJLyogd2VyZSB3ZSBzdWNjZXNzZnVsID8gKi8KKwlpZiAocmMgPT0gMCkgeworCQlEQkFMTE9DKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwgZXh0Ymxrbm8sCisJCQlhZGRuYmxvY2tzKTsKKwkJd3JpdGVfbWV0YXBhZ2UobXApOworCX0gZWxzZQorCQkvKiB3ZSB3ZXJlIG5vdCBzdWNjZXNzZnVsICovCisJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCisKKwlyZXR1cm4gKHJjKTsKK30KKworCisvKgorICogTkFNRToJZGJBbGxvY05leHQoKQorICoKKyAqIEZVTkNUSU9OOiAgICBhdHRlbXB0IHRvIGFsbG9jYXRlIHRoZSBibG9ja3Mgb2YgdGhlIHNwZWNpZmllZCBibG9jaworICoJCXJhbmdlIHdpdGhpbiBhIGRtYXAuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgYm1wCS0gIHBvaW50ZXIgdG8gYm1hcCBkZXNjcmlwdG9yCisgKiAgICAgIGRwCS0gIHBvaW50ZXIgdG8gZG1hcC4KKyAqICAgICAgYmxrbm8JLSAgc3RhcnRpbmcgYmxvY2sgbnVtYmVyIG9mIHRoZSByYW5nZS4KKyAqICAgICAgbmJsb2NrcwktICBudW1iZXIgb2YgY29udGlndW91cyBmcmVlIGJsb2NrcyBvZiB0aGUgcmFuZ2UuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMAktIHN1Y2Nlc3MKKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBkaXNrIHJlc291cmNlcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKgorICogc2VyaWFsaXphdGlvbjogSVJFQURfTE9DSyhpcGJtYXApIGhlbGQgb24gZW50cnkvZXhpdDsKKyAqLworc3RhdGljIGludCBkYkFsbG9jTmV4dChzdHJ1Y3QgYm1hcCAqIGJtcCwgc3RydWN0IGRtYXAgKiBkcCwgczY0IGJsa25vLAorCQkgICAgICAgaW50IG5ibG9ja3MpCit7CisJaW50IGRiaXRubywgd29yZCwgcmVtYml0cywgbmIsIG53b3Jkcywgd2JpdG5vLCBudzsKKwlpbnQgbDJzaXplOworCXM4ICpsZWFmOworCXUzMiBtYXNrOworCisJaWYgKGRwLT50cmVlLmxlYWZpZHggIT0gY3B1X3RvX2xlMzIoTEVBRklORCkpIHsKKwkJamZzX2Vycm9yKGJtcC0+ZGJfaXBibWFwLT5pX3NiLAorCQkJICAiZGJBbGxvY05leHQ6IENvcnJ1cHQgZG1hcCBwYWdlIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHBpY2sgdXAgYSBwb2ludGVyIHRvIHRoZSBsZWF2ZXMgb2YgdGhlIGRtYXAgdHJlZS4KKwkgKi8KKwlsZWFmID0gZHAtPnRyZWUuc3RyZWUgKyBsZTMyX3RvX2NwdShkcC0+dHJlZS5sZWFmaWR4KTsKKworCS8qIGRldGVybWluZSB0aGUgYml0IG51bWJlciBhbmQgd29yZCB3aXRoaW4gdGhlIGRtYXAgb2YgdGhlCisJICogc3RhcnRpbmcgYmxvY2suCisJICovCisJZGJpdG5vID0gYmxrbm8gJiAoQlBFUkRNQVAgLSAxKTsKKwl3b3JkID0gZGJpdG5vID4+IEwyREJXT1JEOworCisJLyogY2hlY2sgaWYgdGhlIHNwZWNpZmllZCBibG9jayByYW5nZSBpcyBjb250YWluZWQgd2l0aGluCisJICogdGhpcyBkbWFwLgorCSAqLworCWlmIChkYml0bm8gKyBuYmxvY2tzID4gQlBFUkRNQVApCisJCXJldHVybiAtRU5PU1BDOworCisJLyogY2hlY2sgaWYgdGhlIHN0YXJ0aW5nIGxlYWYgaW5kaWNhdGVzIHRoYXQgYW55dGhpbmcKKwkgKiBpcyBmcmVlLgorCSAqLworCWlmIChsZWFmW3dvcmRdID09IE5PRlJFRSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwkvKiBjaGVjayB0aGUgZG1hcHMgd29yZHMgY29ycmVzcG9uZGluZyB0byBibG9jayByYW5nZSB0byBzZWUKKwkgKiBpZiB0aGUgYmxvY2sgcmFuZ2UgaXMgZnJlZS4gIG5vdCBhbGwgYml0cyBvZiB0aGUgZmlyc3QgYW5kCisJICogbGFzdCB3b3JkcyBtYXkgYmUgY29udGFpbmVkIHdpdGhpbiB0aGUgYmxvY2sgcmFuZ2UuICBpZiB0aGlzCisJICogaXMgdGhlIGNhc2UsIHdlJ2xsIHdvcmsgYWdhaW5zdCB0aG9zZSB3b3JkcyAoaS5lLiBwYXJ0aWFsIGZpcnN0CisJICogYW5kL29yIGxhc3QpIG9uIGFuIGluZGl2aWR1YWwgYmFzaXMgKGEgc2luZ2xlIHBhc3MpIGFuZCBleGFtaW5lCisJICogdGhlIGFjdHVhbCBiaXRzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBmcmVlLiAgYSBzaW5nbGUgcGFzcworCSAqIHdpbGwgYmUgdXNlZCBmb3IgYWxsIGRtYXAgd29yZHMgZnVsbHkgY29udGFpbmVkIHdpdGhpbiB0aGUKKwkgKiBzcGVjaWZpZWQgcmFuZ2UuICB3aXRoaW4gdGhpcyBwYXNzLCB0aGUgbGVhdmVzIG9mIHRoZSBkbWFwCisJICogdHJlZSB3aWxsIGJlIGV4YW1pbmVkIHRvIGRldGVybWluZSBpZiB0aGUgYmxvY2tzIGFyZSBmcmVlLiBhCisJICogc2luZ2xlIGxlYWYgbWF5IGRlc2NyaWJlIHRoZSBmcmVlIHNwYWNlIG9mIG11bHRpcGxlIGRtYXAKKwkgKiB3b3Jkcywgc28gd2UgbWF5IHZpc2l0IG9ubHkgYSBzdWJzZXQgb2YgdGhlIGFjdHVhbCBsZWF2ZXMKKwkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBkbWFwIHdvcmRzIG9mIHRoZSBibG9jayByYW5nZS4KKwkgKi8KKwlmb3IgKHJlbWJpdHMgPSBuYmxvY2tzOyByZW1iaXRzID4gMDsgcmVtYml0cyAtPSBuYiwgZGJpdG5vICs9IG5iKSB7CisJCS8qIGRldGVybWluZSB0aGUgYml0IG51bWJlciB3aXRoaW4gdGhlIHdvcmQgYW5kCisJCSAqIHRoZSBudW1iZXIgb2YgYml0cyB3aXRoaW4gdGhlIHdvcmQuCisJCSAqLworCQl3Yml0bm8gPSBkYml0bm8gJiAoREJXT1JEIC0gMSk7CisJCW5iID0gbWluKHJlbWJpdHMsIERCV09SRCAtIHdiaXRubyk7CisKKwkJLyogY2hlY2sgaWYgb25seSBwYXJ0IG9mIHRoZSB3b3JkIGlzIHRvIGJlIGV4YW1pbmVkLgorCQkgKi8KKwkJaWYgKG5iIDwgREJXT1JEKSB7CisJCQkvKiBjaGVjayBpZiB0aGUgYml0cyBhcmUgZnJlZS4KKwkJCSAqLworCQkJbWFzayA9IChPTkVTIDw8IChEQldPUkQgLSBuYikgPj4gd2JpdG5vKTsKKwkJCWlmICgobWFzayAmIH5sZTMyX3RvX2NwdShkcC0+d21hcFt3b3JkXSkpICE9IG1hc2spCisJCQkJcmV0dXJuIC1FTk9TUEM7CisKKwkJCXdvcmQgKz0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIG9uZSBvciBtb3JlIGRtYXAgd29yZHMgYXJlIGZ1bGx5IGNvbnRhaW5lZAorCQkJICogd2l0aGluIHRoZSBibG9jayByYW5nZS4gIGRldGVybWluZSBob3cgbWFueQorCQkJICogd29yZHMgYW5kIGhvdyBtYW55IGJpdHMuCisJCQkgKi8KKwkJCW53b3JkcyA9IHJlbWJpdHMgPj4gTDJEQldPUkQ7CisJCQluYiA9IG53b3JkcyA8PCBMMkRCV09SRDsKKworCQkJLyogbm93IGV4YW1pbmUgdGhlIGFwcHJvcHJpYXRlIGxlYXZlcyB0byBkZXRlcm1pbmUKKwkJCSAqIGlmIHRoZSBibG9ja3MgYXJlIGZyZWUuCisJCQkgKi8KKwkJCXdoaWxlIChud29yZHMgPiAwKSB7CisJCQkJLyogZG9lcyB0aGUgbGVhZiBkZXNjcmliZSBhbnkgZnJlZSBzcGFjZSA/CisJCQkJICovCisJCQkJaWYgKGxlYWZbd29yZF0gPCBCVURNSU4pCisJCQkJCXJldHVybiAtRU5PU1BDOworCisJCQkJLyogZGV0ZXJtaW5lIHRoZSBsMiBudW1iZXIgb2YgYml0cyBwcm92aWRlZAorCQkJCSAqIGJ5IHRoaXMgbGVhZi4KKwkJCQkgKi8KKwkJCQlsMnNpemUgPQorCQkJCSAgICBtaW4oKGludClsZWFmW3dvcmRdLCBOTFNUT0wyQlNaKG53b3JkcykpOworCisJCQkJLyogZGV0ZXJtaW5lIGhvdyBtYW55IHdvcmRzIHdlcmUgaGFuZGxlZC4KKwkJCQkgKi8KKwkJCQludyA9IEJVRFNJWkUobDJzaXplLCBCVURNSU4pOworCisJCQkJbndvcmRzIC09IG53OworCQkJCXdvcmQgKz0gbnc7CisJCQl9CisJCX0KKwl9CisKKwkvKiBhbGxvY2F0ZSB0aGUgYmxvY2tzLgorCSAqLworCXJldHVybiAoZGJBbGxvY0RtYXAoYm1wLCBkcCwgYmxrbm8sIG5ibG9ja3MpKTsKK30KKworCisvKgorICogTkFNRToJZGJBbGxvY05lYXIoKQorICoKKyAqIEZVTkNUSU9OOiAgICBhdHRlbXB0IHRvIGFsbG9jYXRlIGEgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgZnJlZSBibG9ja3MgbmVhcgorICoJCWEgc3BlY2lmaWVkIGJsb2NrIChoaW50KSB3aXRoaW4gYSBkbWFwLgorICoKKyAqCQlzdGFydGluZyB3aXRoIHRoZSBkbWFwIGxlYWYgdGhhdCBjb3ZlcnMgdGhlIGhpbnQsIHdlJ2xsCisgKgkJY2hlY2sgdGhlIG5leHQgZm91ciBjb250aWd1b3VzIGxlYXZlcyBmb3Igc3VmZmljaWVudCBmcmVlCisgKgkJc3BhY2UuICBpZiBzdWZmaWNpZW50IGZyZWUgc3BhY2UgaXMgZm91bmQsIHdlJ2xsIGFsbG9jYXRlCisgKgkJdGhlIGRlc2lyZWQgZnJlZSBzcGFjZS4KKyAqCisgKiBQQVJBTUVURVJTOgorICogICAgICBibXAJLSAgcG9pbnRlciB0byBibWFwIGRlc2NyaXB0b3IKKyAqICAgICAgZHAJLSAgcG9pbnRlciB0byBkbWFwLgorICogICAgICBibGtubwktICBibG9jayBudW1iZXIgdG8gYWxsb2NhdGUgbmVhci4KKyAqICAgICAgbmJsb2NrcwktICBhY3R1YWwgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgZnJlZSBibG9ja3MgZGVzaXJlZC4KKyAqICAgICAgbDJuYgktICBsb2cyIG51bWJlciBvZiBjb250aWd1b3VzIGZyZWUgYmxvY2tzIGRlc2lyZWQuCisgKiAgICAgIHJlc3VsdHMJLSAgb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHNldCB0byB0aGUgc3RhcnRpbmcgYmxvY2sgbnVtYmVyCisgKgkJICAgb2YgdGhlIG5ld2x5IGFsbG9jYXRlZCByYW5nZS4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwCS0gc3VjY2VzcworICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzCisgKiAgICAgIC1FSU8JLSBpL28gZXJyb3IKKyAqCisgKiBzZXJpYWxpemF0aW9uOiBJUkVBRF9MT0NLKGlwYm1hcCkgaGVsZCBvbiBlbnRyeS9leGl0OworICovCitzdGF0aWMgaW50CitkYkFsbG9jTmVhcihzdHJ1Y3QgYm1hcCAqIGJtcCwKKwkgICAgc3RydWN0IGRtYXAgKiBkcCwgczY0IGJsa25vLCBpbnQgbmJsb2NrcywgaW50IGwybmIsIHM2NCAqIHJlc3VsdHMpCit7CisJaW50IHdvcmQsIGx3b3JkLCByYzsKKwlzOCAqbGVhZjsKKworCWlmIChkcC0+dHJlZS5sZWFmaWR4ICE9IGNwdV90b19sZTMyKExFQUZJTkQpKSB7CisJCWpmc19lcnJvcihibXAtPmRiX2lwYm1hcC0+aV9zYiwKKwkJCSAgImRiQWxsb2NOZWFyOiBDb3JydXB0IGRtYXAgcGFnZSIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlsZWFmID0gZHAtPnRyZWUuc3RyZWUgKyBsZTMyX3RvX2NwdShkcC0+dHJlZS5sZWFmaWR4KTsKKworCS8qIGRldGVybWluZSB0aGUgd29yZCB3aXRoaW4gdGhlIGRtYXAgdGhhdCBob2xkcyB0aGUgaGludAorCSAqIChpLmUuIGJsa25vKS4gIGFsc28sIGRldGVybWluZSB0aGUgbGFzdCB3b3JkIGluIHRoZSBkbWFwCisJICogdGhhdCB3ZSdsbCBpbmNsdWRlIGluIG91ciBleGFtaW5hdGlvbi4KKwkgKi8KKwl3b3JkID0gKGJsa25vICYgKEJQRVJETUFQIC0gMSkpID4+IEwyREJXT1JEOworCWx3b3JkID0gbWluKHdvcmQgKyA0LCBMUEVSRE1BUCk7CisKKwkvKiBleGFtaW5lIHRoZSBsZWF2ZXMgZm9yIHN1ZmZpY2llbnQgZnJlZSBzcGFjZS4KKwkgKi8KKwlmb3IgKDsgd29yZCA8IGx3b3JkOyB3b3JkKyspIHsKKwkJLyogZG9lcyB0aGUgbGVhZiBkZXNjcmliZSBzdWZmaWNpZW50IGZyZWUgc3BhY2UgPworCQkgKi8KKwkJaWYgKGxlYWZbd29yZF0gPCBsMm5iKQorCQkJY29udGludWU7CisKKwkJLyogZGV0ZXJtaW5lIHRoZSBibG9jayBudW1iZXIgd2l0aGluIHRoZSBmaWxlIHN5c3RlbQorCQkgKiBvZiB0aGUgZmlyc3QgYmxvY2sgZGVzY3JpYmVkIGJ5IHRoaXMgZG1hcCB3b3JkLgorCQkgKi8KKwkJYmxrbm8gPSBsZTY0X3RvX2NwdShkcC0+c3RhcnQpICsgKHdvcmQgPDwgTDJEQldPUkQpOworCisJCS8qIGlmIG5vdCBhbGwgYml0cyBvZiB0aGUgZG1hcCB3b3JkIGFyZSBmcmVlLCBnZXQgdGhlCisJCSAqIHN0YXJ0aW5nIGJpdCBudW1iZXIgd2l0aGluIHRoZSBkbWFwIHdvcmQgb2YgdGhlIHJlcXVpcmVkCisJCSAqIHN0cmluZyBvZiBmcmVlIGJpdHMgYW5kIGFkanVzdCB0aGUgYmxvY2sgbnVtYmVyIHdpdGggdGhlCisJCSAqIHZhbHVlLgorCQkgKi8KKwkJaWYgKGxlYWZbd29yZF0gPCBCVURNSU4pCisJCQlibGtubyArPQorCQkJICAgIGRiRmluZEJpdHMobGUzMl90b19jcHUoZHAtPndtYXBbd29yZF0pLCBsMm5iKTsKKworCQkvKiBhbGxvY2F0ZSB0aGUgYmxvY2tzLgorCQkgKi8KKwkJaWYgKChyYyA9IGRiQWxsb2NEbWFwKGJtcCwgZHAsIGJsa25vLCBuYmxvY2tzKSkgPT0gMCkKKwkJCSpyZXN1bHRzID0gYmxrbm87CisKKwkJcmV0dXJuIChyYyk7CisJfQorCisJcmV0dXJuIC1FTk9TUEM7Cit9CisKKworLyoKKyAqIE5BTUU6CWRiQWxsb2NBRygpCisgKgorICogRlVOQ1RJT046ICAgIGF0dGVtcHQgdG8gYWxsb2NhdGUgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY29udGlndW91cworICoJCWZyZWUgYmxvY2tzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGFsbG9jYXRpb24gZ3JvdXAuCisgKgorICoJCXVubGVzcyB0aGUgYWxsb2NhdGlvbiBncm91cCBzaXplIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIKKyAqCQlvZiBibG9ja3MgcGVyIGRtYXAsIHRoZSBkbWFwIGNvbnRyb2wgcGFnZXMgd2lsbCBiZSB1c2VkIHRvCisgKgkJZmluZCB0aGUgcmVxdWlyZWQgZnJlZSBzcGFjZSwgaWYgYXZhaWxhYmxlLiAgd2Ugc3RhcnQgdGhlCisgKgkJc2VhcmNoIGF0IHRoZSBoaWdoZXN0IGRtYXAgY29udHJvbCBwYWdlIGxldmVsIHdoaWNoCisgKgkJZGlzdGluY3RseSBkZXNjcmliZXMgdGhlIGFsbG9jYXRpb24gZ3JvdXAncyBmcmVlIHNwYWNlCisgKgkJKGkuZS4gdGhlIGhpZ2hlc3QgbGV2ZWwgYXQgd2hpY2ggdGhlIGFsbG9jYXRpb24gZ3JvdXAncworICoJCWZyZWUgc3BhY2UgaXMgbm90IG1peGVkIGluIHdpdGggdGhhdCBvZiBhbnkgb3RoZXIgZ3JvdXApLgorICoJCWluIGFkZGl0aW9uLCB3ZSBzdGFydCB0aGUgc2VhcmNoIHdpdGhpbiB0aGlzIGxldmVsIGF0IGEKKyAqCQloZWlnaHQgb2YgdGhlIGRtYXBjdGwgZG10cmVlIGF0IHdoaWNoIHRoZSBub2RlcyBkaXN0aW5jdGx5CisgKgkJZGVzY3JpYmUgdGhlIGFsbG9jYXRpb24gZ3JvdXAncyBmcmVlIHNwYWNlLiAgYXQgdGhpcyBoZWlnaHQsCisgKgkJdGhlIGFsbG9jYXRpb24gZ3JvdXAncyBmcmVlIHNwYWNlIG1heSBiZSByZXByZXNlbnRlZCBieSAxCisgKgkJb3IgdHdvIHN1Yi10cmVlcywgZGVwZW5kaW5nIG9uIHRoZSBhbGxvY2F0aW9uIGdyb3VwIHNpemUuCisgKgkJd2Ugc2VhcmNoIHRoZSB0b3Agbm9kZXMgb2YgdGhlc2Ugc3VidHJlZXMgbGVmdCB0byByaWdodCBmb3IKKyAqCQlzdWZmaWNpZW50IGZyZWUgc3BhY2UuICBpZiBzdWZmaWNpZW50IGZyZWUgc3BhY2UgaXMgZm91bmQsCisgKgkJdGhlIHN1YnRyZWUgaXMgc2VhcmNoZWQgdG8gZmluZCB0aGUgbGVmdG1vc3QgbGVhZiB0aGF0IAorICoJCWhhcyBmcmVlIHNwYWNlLiAgb25jZSB3ZSBoYXZlIG1hZGUgaXQgdG8gdGhlIGxlYWYsIHdlCisgKgkJbW92ZSB0aGUgc2VhcmNoIHRvIHRoZSBuZXh0IGxvd2VyIGxldmVsIGRtYXAgY29udHJvbCBwYWdlCisgKgkJY29ycmVzcG9uZGluZyB0byB0aGlzIGxlYWYuICB3ZSBjb250aW51ZSBkb3duIHRoZSBkbWFwIGNvbnRyb2wKKyAqCQlwYWdlcyB1bnRpbCB3ZSBmaW5kIHRoZSBkbWFwIHRoYXQgY29udGFpbnMgb3Igc3RhcnRzIHRoZQorICoJCXN1ZmZpY2llbnQgZnJlZSBzcGFjZSBhbmQgd2UgYWxsb2NhdGUgYXQgdGhpcyBkbWFwLgorICoKKyAqCQlpZiB0aGUgYWxsb2NhdGlvbiBncm91cCBzaXplIGlzIGVxdWFsIHRvIHRoZSBkbWFwIHNpemUsCisgKgkJd2UnbGwgc3RhcnQgYXQgdGhlIGRtYXAgY29ycmVzcG9uZGluZyB0byB0aGUgYWxsb2NhdGlvbgorICoJCWdyb3VwIGFuZCBhdHRlbXB0IHRoZSBhbGxvY2F0aW9uIGF0IHRoaXMgbGV2ZWwuCisgKgorICoJCXRoZSBkbWFwIGNvbnRyb2wgcGFnZSBzZWFyY2ggaXMgYWxzbyBub3QgcGVyZm9ybWVkIGlmIHRoZQorICoJCWFsbG9jYXRpb24gZ3JvdXAgaXMgY29tcGxldGVseSBmcmVlIGFuZCB3ZSBnbyB0byB0aGUgZmlyc3QKKyAqCQlkbWFwIG9mIHRoZSBhbGxvY2F0aW9uIGdyb3VwIHRvIGRvIHRoZSBhbGxvY2F0aW9uLiAgdGhpcyBpcworICoJCWRvbmUgYmVjYXVzZSB0aGUgYWxsb2NhdGlvbiBncm91cCBtYXkgYmUgcGFydCAobm90IHRoZSBmaXJzdAorICoJCXBhcnQpIG9mIGEgbGFyZ2VyIGJpbmFyeSBidWRkeSBzeXN0ZW0sIGNhdXNpbmcgdGhlIGRtYXAKKyAqCQljb250cm9sIHBhZ2VzIHRvIGluZGljYXRlIG5vIGZyZWUgc3BhY2UgKE5PRlJFRSkgd2l0aGluCisgKgkJdGhlIGFsbG9jYXRpb24gZ3JvdXAuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgYm1wCS0gIHBvaW50ZXIgdG8gYm1hcCBkZXNjcmlwdG9yCisgKglhZ25vCS0gYWxsb2NhdGlvbiBncm91cCBudW1iZXIuCisgKiAgICAgIG5ibG9ja3MJLSAgYWN0dWFsIG51bWJlciBvZiBjb250aWd1b3VzIGZyZWUgYmxvY2tzIGRlc2lyZWQuCisgKiAgICAgIGwybmIJLSAgbG9nMiBudW1iZXIgb2YgY29udGlndW91cyBmcmVlIGJsb2NrcyBkZXNpcmVkLgorICogICAgICByZXN1bHRzCS0gIG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBzZXQgdG8gdGhlIHN0YXJ0aW5nIGJsb2NrIG51bWJlcgorICoJCSAgIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgcmFuZ2UuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMAktIHN1Y2Nlc3MKKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBkaXNrIHJlc291cmNlcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKgorICogbm90ZTogSVdSSVRFX0xPQ0soaXBtYXApIGhlbGQgb24gZW50cnkvZXhpdDsKKyAqLworc3RhdGljIGludAorZGJBbGxvY0FHKHN0cnVjdCBibWFwICogYm1wLCBpbnQgYWdubywgczY0IG5ibG9ja3MsIGludCBsMm5iLCBzNjQgKiByZXN1bHRzKQoreworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJc3RydWN0IGRtYXBjdGwgKmRjcDsKKwlpbnQgcmMsIHRpLCBpLCBrLCBtLCBuLCBhZ3BlcmxldjsKKwlzNjQgYmxrbm8sIGxibGtubzsKKwlpbnQgYnVkbWluOworCisJLyogYWxsb2NhdGlvbiByZXF1ZXN0IHNob3VsZCBub3QgYmUgZm9yIG1vcmUgdGhhbiB0aGUKKwkgKiBhbGxvY2F0aW9uIGdyb3VwIHNpemUuCisJICovCisJaWYgKGwybmIgPiBibXAtPmRiX2FnbDJzaXplKSB7CisJCWpmc19lcnJvcihibXAtPmRiX2lwYm1hcC0+aV9zYiwKKwkJCSAgImRiQWxsb2NBRzogYWxsb2NhdGlvbiByZXF1ZXN0IGlzIGxhcmdlciB0aGFuIHRoZSAiCisJCQkgICJhbGxvY2F0aW9uIGdyb3VwIHNpemUiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogZGV0ZXJtaW5lIHRoZSBzdGFydGluZyBibG9jayBudW1iZXIgb2YgdGhlIGFsbG9jYXRpb24KKwkgKiBncm91cC4KKwkgKi8KKwlibGtubyA9IChzNjQpIGFnbm8gPDwgYm1wLT5kYl9hZ2wyc2l6ZTsKKworCS8qIGNoZWNrIGlmIHRoZSBhbGxvY2F0aW9uIGdyb3VwIHNpemUgaXMgdGhlIG1pbmltdW0gYWxsb2NhdGlvbgorCSAqIGdyb3VwIHNpemUgb3IgaWYgdGhlIGFsbG9jYXRpb24gZ3JvdXAgaXMgY29tcGxldGVseSBmcmVlLiBpZgorCSAqIHRoZSBhbGxvY2F0aW9uIGdyb3VwIHNpemUgaXMgdGhlIG1pbmltdW0gc2l6ZSBvZiBCUEVSRE1BUCAoaS5lLgorCSAqIDEgZG1hcCksIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2VhcmNoIHRoZSBkbWFwIGNvbnRyb2wgcGFnZSAoYmVsb3cpCisJICogdGhhdCBmdWxseSBkZXNjcmliZXMgdGhlIGFsbG9jYXRpb24gZ3JvdXAgc2luY2UgdGhlIGFsbG9jYXRpb24KKwkgKiBncm91cCBpcyBhbHJlYWR5IGZ1bGx5IGRlc2NyaWJlZCBieSBhIGRtYXAuICBpbiB0aGlzIGNhc2UsIHdlCisJICoganVzdCBjYWxsIGRiQWxsb2NDdGwoKSB0byBzZWFyY2ggdGhlIGRtYXAgdHJlZSBhbmQgYWxsb2NhdGUgdGhlCisJICogcmVxdWlyZWQgc3BhY2UgaWYgYXZhaWxhYmxlLiAgCisJICoKKwkgKiBpZiB0aGUgYWxsb2NhdGlvbiBncm91cCBpcyBjb21wbGV0ZWx5IGZyZWUsIGRiQWxsb2NDdGwoKSBpcworCSAqIGFsc28gY2FsbGVkIHRvIGFsbG9jYXRlIHRoZSByZXF1aXJlZCBzcGFjZS4gIHRoaXMgaXMgZG9uZSBmb3IKKwkgKiB0d28gcmVhc29ucy4gIGZpcnN0LCBpdCBtYWtlcyBubyBzZW5zZSBzZWFyY2hpbmcgdGhlIGRtYXAgY29udHJvbAorCSAqIHBhZ2VzIGZvciBmcmVlIHNwYWNlIHdoZW4gd2Uga25vdyB0aGF0IGZyZWUgc3BhY2UgZXhpc3RzLiAgc2Vjb25kLAorCSAqIHRoZSBkbWFwIGNvbnRyb2wgcGFnZXMgbWF5IGluZGljYXRlIHRoYXQgdGhlIGFsbG9jYXRpb24gZ3JvdXAKKwkgKiBoYXMgbm8gZnJlZSBzcGFjZSBpZiB0aGUgYWxsb2NhdGlvbiBncm91cCBpcyBwYXJ0IChub3QgdGhlIGZpcnN0CisJICogcGFydCkgb2YgYSBsYXJnZXIgYmluYXJ5IGJ1ZGR5IHN5c3RlbS4KKwkgKi8KKwlpZiAoYm1wLT5kYl9hZ3NpemUgPT0gQlBFUkRNQVAKKwkgICAgfHwgYm1wLT5kYl9hZ2ZyZWVbYWdub10gPT0gYm1wLT5kYl9hZ3NpemUpIHsKKwkJcmMgPSBkYkFsbG9jQ3RsKGJtcCwgbmJsb2NrcywgbDJuYiwgYmxrbm8sIHJlc3VsdHMpOworCQlpZiAoKHJjID09IC1FTk9TUEMpICYmCisJCSAgICAoYm1wLT5kYl9hZ2ZyZWVbYWdub10gPT0gYm1wLT5kYl9hZ3NpemUpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImJsa25vID0gJUx4LCBibG9ja3MgPSAlTHhcbiIsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYmxrbm8sCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbmJsb2Nrcyk7CisJCQlqZnNfZXJyb3IoYm1wLT5kYl9pcGJtYXAtPmlfc2IsCisJCQkJICAiZGJBbGxvY0FHOiBkYkFsbG9jQ3RsIGZhaWxlZCBpbiBmcmVlIEFHIik7CisJCX0KKwkJcmV0dXJuIChyYyk7CisJfQorCisJLyogdGhlIGJ1ZmZlciBmb3IgdGhlIGRtYXAgY29udHJvbCBwYWdlIHRoYXQgZnVsbHkgZGVzY3JpYmVzIHRoZQorCSAqIGFsbG9jYXRpb24gZ3JvdXAuCisJICovCisJbGJsa25vID0gQkxLVE9DVEwoYmxrbm8sIGJtcC0+ZGJfbDJuYnBlcnBhZ2UsIGJtcC0+ZGJfYWdsZXZlbCk7CisJbXAgPSByZWFkX21ldGFwYWdlKGJtcC0+ZGJfaXBibWFwLCBsYmxrbm8sIFBTSVpFLCAwKTsKKwlpZiAobXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisJZGNwID0gKHN0cnVjdCBkbWFwY3RsICopIG1wLT5kYXRhOworCWJ1ZG1pbiA9IGRjcC0+YnVkbWluOworCisJaWYgKGRjcC0+bGVhZmlkeCAhPSBjcHVfdG9fbGUzMihDVExMRUFGSU5EKSkgeworCQlqZnNfZXJyb3IoYm1wLT5kYl9pcGJtYXAtPmlfc2IsCisJCQkgICJkYkFsbG9jQUc6IENvcnJ1cHQgZG1hcGN0bCBwYWdlIik7CisJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBzZWFyY2ggdGhlIHN1YnRyZWUocykgb2YgdGhlIGRtYXAgY29udHJvbCBwYWdlIHRoYXQgZGVzY3JpYmVzCisJICogdGhlIGFsbG9jYXRpb24gZ3JvdXAsIGxvb2tpbmcgZm9yIHN1ZmZpY2llbnQgZnJlZSBzcGFjZS4gIHRvIGJlZ2luLAorCSAqIGRldGVybWluZSBob3cgbWFueSBhbGxvY2F0aW9uIGdyb3VwcyBhcmUgcmVwcmVzZW50ZWQgaW4gYSBkbWFwCisJICogY29udHJvbCBwYWdlIGF0IHRoZSBjb250cm9sIHBhZ2UgbGV2ZWwgKGkuZS4gTDAsIEwxLCBMMikgdGhhdAorCSAqIGZ1bGx5IGRlc2NyaWJlcyBhbiBhbGxvY2F0aW9uIGdyb3VwLiBuZXh0LCBkZXRlcm1pbmUgdGhlIHN0YXJ0aW5nCisJICogdHJlZSBpbmRleCBvZiB0aGlzIGFsbG9jYXRpb24gZ3JvdXAgd2l0aGluIHRoZSBjb250cm9sIHBhZ2UuCisJICovCisJYWdwZXJsZXYgPQorCSAgICAoMSA8PCAoTDJMUEVSQ1RMIC0gKGJtcC0+ZGJfYWdoZWlndGggPDwgMSkpKSAvIGJtcC0+ZGJfYWd3aWR0aDsKKwl0aSA9IGJtcC0+ZGJfYWdzdGFydCArIGJtcC0+ZGJfYWd3aWR0aCAqIChhZ25vICYgKGFncGVybGV2IC0gMSkpOworCisJLyogZG1hcCBjb250cm9sIHBhZ2UgdHJlZXMgZmFuLW91dCBieSA0IGFuZCBhIHNpbmdsZSBhbGxvY2F0aW9uIAorCSAqIGdyb3VwIG1heSBiZSBkZXNjcmliZWQgYnkgMSBvciAyIHN1YnRyZWVzIHdpdGhpbiB0aGUgYWcgbGV2ZWwKKwkgKiBkbWFwIGNvbnRyb2wgcGFnZSwgZGVwZW5kaW5nIHVwb24gdGhlIGFnIHNpemUuIGV4YW1pbmUgdGhlIGFnJ3MKKwkgKiBzdWJ0cmVlcyBmb3Igc3VmZmljaWVudCBmcmVlIHNwYWNlLCBzdGFydGluZyB3aXRoIHRoZSBsZWZ0bW9zdAorCSAqIHN1YnRyZWUuCisJICovCisJZm9yIChpID0gMDsgaSA8IGJtcC0+ZGJfYWd3aWR0aDsgaSsrLCB0aSsrKSB7CisJCS8qIGlzIHRoZXJlIHN1ZmZpY2llbnQgZnJlZSBzcGFjZSA/CisJCSAqLworCQlpZiAobDJuYiA+IGRjcC0+c3RyZWVbdGldKQorCQkJY29udGludWU7CisKKwkJLyogc3VmZmljaWVudCBmcmVlIHNwYWNlIGZvdW5kIGluIGEgc3VidHJlZS4gbm93IHNlYXJjaCBkb3duCisJCSAqIHRoZSBzdWJ0cmVlIHRvIGZpbmQgdGhlIGxlZnRtb3N0IGxlYWYgdGhhdCBkZXNjcmliZXMgdGhpcworCQkgKiBmcmVlIHNwYWNlLgorCQkgKi8KKwkJZm9yIChrID0gYm1wLT5kYl9hZ2hlaWd0aDsgayA+IDA7IGstLSkgeworCQkJZm9yIChuID0gMCwgbSA9ICh0aSA8PCAyKSArIDE7IG4gPCA0OyBuKyspIHsKKwkJCQlpZiAobDJuYiA8PSBkY3AtPnN0cmVlW20gKyBuXSkgeworCQkJCQl0aSA9IG0gKyBuOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAobiA9PSA0KSB7CisJCQkJamZzX2Vycm9yKGJtcC0+ZGJfaXBibWFwLT5pX3NiLAorCQkJCQkgICJkYkFsbG9jQUc6IGZhaWxlZCBkZXNjZW5kaW5nIHN0cmVlIik7CisJCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0KKworCQkvKiBkZXRlcm1pbmUgdGhlIGJsb2NrIG51bWJlciB3aXRoaW4gdGhlIGZpbGUgc3lzdGVtCisJCSAqIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBsZWFmLgorCQkgKi8KKwkJaWYgKGJtcC0+ZGJfYWdsZXZlbCA9PSAyKQorCQkJYmxrbm8gPSAwOworCQllbHNlIGlmIChibXAtPmRiX2FnbGV2ZWwgPT0gMSkKKwkJCWJsa25vICY9IH4oTUFYTDFTSVpFIC0gMSk7CisJCWVsc2UJCS8qIGJtcC0+ZGJfYWdsZXZlbCA9PSAwICovCisJCQlibGtubyAmPSB+KE1BWEwwU0laRSAtIDEpOworCisJCWJsa25vICs9CisJCSAgICAoKHM2NCkgKHRpIC0gbGUzMl90b19jcHUoZGNwLT5sZWFmaWR4KSkpIDw8IGJ1ZG1pbjsKKworCQkvKiByZWxlYXNlIHRoZSBidWZmZXIgaW4gcHJlcGFyYXRpb24gZm9yIGdvaW5nIGRvd24KKwkJICogdGhlIG5leHQgbGV2ZWwgb2YgZG1hcCBjb250cm9sIHBhZ2VzLgorCQkgKi8KKwkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisKKwkJLyogY2hlY2sgaWYgd2UgbmVlZCB0byBjb250aW51ZSB0byBzZWFyY2ggZG93biB0aGUgbG93ZXIKKwkJICogbGV2ZWwgZG1hcCBjb250cm9sIHBhZ2VzLiAgd2UgbmVlZCB0byBpZiB0aGUgbnVtYmVyIG9mCisJCSAqIGJsb2NrcyByZXF1aXJlZCBpcyBsZXNzIHRoYW4gbWF4aW11bSBudW1iZXIgb2YgYmxvY2tzCisJCSAqIGRlc2NyaWJlZCBhdCB0aGUgbmV4dCBsb3dlciBsZXZlbC4KKwkJICovCisJCWlmIChsMm5iIDwgYnVkbWluKSB7CisKKwkJCS8qIHNlYXJjaCB0aGUgbG93ZXIgbGV2ZWwgZG1hcCBjb250cm9sIHBhZ2VzIHRvIGdldAorCQkJICogdGhlIHN0YXJ0aW5nIGJsb2NrIG51bWJlciBvZiB0aGUgdGhlIGRtYXAgdGhhdAorCQkJICogY29udGFpbnMgb3Igc3RhcnRzIG9mZiB0aGUgZnJlZSBzcGFjZS4KKwkJCSAqLworCQkJaWYgKChyYyA9CisJCQkgICAgIGRiRmluZEN0bChibXAsIGwybmIsIGJtcC0+ZGJfYWdsZXZlbCAtIDEsCisJCQkJICAgICAgICZibGtubykpKSB7CisJCQkJaWYgKHJjID09IC1FTk9TUEMpIHsKKwkJCQkJamZzX2Vycm9yKGJtcC0+ZGJfaXBibWFwLT5pX3NiLAorCQkJCQkJICAiZGJBbGxvY0FHOiBjb250cm9sIHBhZ2UgIgorCQkJCQkJICAiaW5jb25zaXN0ZW50Iik7CisJCQkJCXJldHVybiAtRUlPOworCQkJCX0KKwkJCQlyZXR1cm4gKHJjKTsKKwkJCX0KKwkJfQorCisJCS8qIGFsbG9jYXRlIHRoZSBibG9ja3MuCisJCSAqLworCQlyYyA9IGRiQWxsb2NDdGwoYm1wLCBuYmxvY2tzLCBsMm5iLCBibGtubywgcmVzdWx0cyk7CisJCWlmIChyYyA9PSAtRU5PU1BDKSB7CisJCQlqZnNfZXJyb3IoYm1wLT5kYl9pcGJtYXAtPmlfc2IsCisJCQkJICAiZGJBbGxvY0FHOiB1bmFibGUgdG8gYWxsb2NhdGUgYmxvY2tzIik7CisJCQlyYyA9IC1FSU87CisJCX0KKwkJcmV0dXJuIChyYyk7CisJfQorCisJLyogbm8gc3BhY2UgaW4gdGhlIGFsbG9jYXRpb24gZ3JvdXAuICByZWxlYXNlIHRoZSBidWZmZXIgYW5kCisJICogcmV0dXJuIC1FTk9TUEMuCisJICovCisJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisKKwlyZXR1cm4gLUVOT1NQQzsKK30KKworCisvKgorICogTkFNRToJZGJBbGxvY0FueSgpCisgKgorICogRlVOQ1RJT046ICAgIGF0dGVtcHQgdG8gYWxsb2NhdGUgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY29udGlndW91cworICoJCWZyZWUgYmxvY2tzIGFueXdoZXJlIGluIHRoZSBmaWxlIHN5c3RlbS4KKyAqCisgKgkJZGJBbGxvY0FueSgpIGF0dGVtcHRzIHRvIGZpbmQgdGhlIHN1ZmZpY2llbnQgZnJlZSBzcGFjZSBieQorICoJCXNlYXJjaGluZyBkb3duIHRoZSBkbWFwIGNvbnRyb2wgcGFnZXMsIHN0YXJ0aW5nIHdpdGggdGhlCisgKgkJaGlnaGVzdCBsZXZlbCAoaS5lLiBMMCwgTDEsIEwyKSBjb250cm9sIHBhZ2UuICBpZiBmcmVlIHNwYWNlCisgKgkJbGFyZ2UgZW5vdWdoIHRvIHNhdGlzZnkgdGhlIGRlc2lyZWQgZnJlZSBzcGFjZSBpcyBmb3VuZCwgdGhlCisgKgkJZGVzaXJlZCBmcmVlIHNwYWNlIGlzIGFsbG9jYXRlZC4KKyAqCisgKiBQQVJBTUVURVJTOgorICogICAgICBibXAJLSAgcG9pbnRlciB0byBibWFwIGRlc2NyaXB0b3IKKyAqICAgICAgbmJsb2NrcwkgLSAgYWN0dWFsIG51bWJlciBvZiBjb250aWd1b3VzIGZyZWUgYmxvY2tzIGRlc2lyZWQuCisgKiAgICAgIGwybmIJIC0gIGxvZzIgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgZnJlZSBibG9ja3MgZGVzaXJlZC4KKyAqICAgICAgcmVzdWx0cwktICBvbiBzdWNjZXNzZnVsIHJldHVybiwgc2V0IHRvIHRoZSBzdGFydGluZyBibG9jayBudW1iZXIKKyAqCQkgICBvZiB0aGUgbmV3bHkgYWxsb2NhdGVkIHJhbmdlLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAJLSBzdWNjZXNzCisgKiAgICAgIC1FTk9TUEMJLSBpbnN1ZmZpY2llbnQgZGlzayByZXNvdXJjZXMKKyAqICAgICAgLUVJTwktIGkvbyBlcnJvcgorICoKKyAqIHNlcmlhbGl6YXRpb246IElXUklURV9MT0NLKGlwYm1hcCkgaGVsZCBvbiBlbnRyeS9leGl0OworICovCitzdGF0aWMgaW50IGRiQWxsb2NBbnkoc3RydWN0IGJtYXAgKiBibXAsIHM2NCBuYmxvY2tzLCBpbnQgbDJuYiwgczY0ICogcmVzdWx0cykKK3sKKwlpbnQgcmM7CisJczY0IGJsa25vID0gMDsKKworCS8qIHN0YXJ0aW5nIHdpdGggdGhlIHRvcCBsZXZlbCBkbWFwIGNvbnRyb2wgcGFnZSwgc2VhcmNoCisJICogZG93biB0aGUgZG1hcCBjb250cm9sIGxldmVscyBmb3Igc3VmZmljaWVudCBmcmVlIHNwYWNlLgorCSAqIGlmIGZyZWUgc3BhY2UgaXMgZm91bmQsIGRiRmluZEN0bCgpIHJldHVybnMgdGhlIHN0YXJ0aW5nCisJICogYmxvY2sgbnVtYmVyIG9mIHRoZSBkbWFwIHRoYXQgY29udGFpbnMgb3Igc3RhcnRzIG9mZiB0aGUKKwkgKiByYW5nZSBvZiBmcmVlIHNwYWNlLgorCSAqLworCWlmICgocmMgPSBkYkZpbmRDdGwoYm1wLCBsMm5iLCBibXAtPmRiX21heGxldmVsLCAmYmxrbm8pKSkKKwkJcmV0dXJuIChyYyk7CisKKwkvKiBhbGxvY2F0ZSB0aGUgYmxvY2tzLgorCSAqLworCXJjID0gZGJBbGxvY0N0bChibXAsIG5ibG9ja3MsIGwybmIsIGJsa25vLCByZXN1bHRzKTsKKwlpZiAocmMgPT0gLUVOT1NQQykgeworCQlqZnNfZXJyb3IoYm1wLT5kYl9pcGJtYXAtPmlfc2IsCisJCQkgICJkYkFsbG9jQW55OiB1bmFibGUgdG8gYWxsb2NhdGUgYmxvY2tzIik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gKHJjKTsKK30KKworCisvKgorICogTkFNRToJZGJGaW5kQ3RsKCkKKyAqCisgKiBGVU5DVElPTjogICAgc3RhcnRpbmcgYXQgYSBzcGVjaWZpZWQgZG1hcCBjb250cm9sIHBhZ2UgbGV2ZWwgYW5kIGJsb2NrCisgKgkJbnVtYmVyLCBzZWFyY2ggZG93biB0aGUgZG1hcCBjb250cm9sIGxldmVscyBmb3IgYSByYW5nZSBvZgorICoJICAgICAgICBjb250aWd1b3VzIGZyZWUgYmxvY2tzIGxhcmdlIGVub3VnaCB0byBzYXRpc2Z5IGFuIGFsbG9jYXRpb24KKyAqCQlyZXF1ZXN0IGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBmcmVlIGJsb2Nrcy4KKyAqCisgKgkJaWYgc3VmZmljaWVudCBjb250aWd1b3VzIGZyZWUgYmxvY2tzIGFyZSBmb3VuZCwgdGhpcyByb3V0aW5lCisgKgkJcmV0dXJucyB0aGUgc3RhcnRpbmcgYmxvY2sgbnVtYmVyIHdpdGhpbiBhIGRtYXAgcGFnZSB0aGF0CisgKgkJY29udGFpbnMgb3Igc3RhcnRzIGEgcmFuZ2Ugb2YgY29udGlxaW91cyBmcmVlIGJsb2NrcyB0aGF0CisgKgkJaXMgc3VmZmljaWVudCBpbiBzaXplLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGJtcAktICBwb2ludGVyIHRvIGJtYXAgZGVzY3JpcHRvcgorICogICAgICBsZXZlbAktICBzdGFydGluZyBkbWFwIGNvbnRyb2wgcGFnZSBsZXZlbC4KKyAqICAgICAgbDJuYgktICBsb2cyIG51bWJlciBvZiBjb250aWd1b3VzIGZyZWUgYmxvY2tzIGRlc2lyZWQuCisgKiAgICAgICpibGtubwktICBvbiBlbnRyeSwgc3RhcnRpbmcgYmxvY2sgbnVtYmVyIGZvciBjb25kdWN0aW5nIHRoZSBzZWFyY2guCisgKgkJICAgb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBmaXJzdCBibG9jayB3aXRoaW4gYSBkbWFwIHBhZ2UKKyAqCQkgICB0aGF0IGNvbnRhaW5zIG9yIHN0YXJ0cyBhIHJhbmdlIG9mIGNvbnRpZ3VvdXMgZnJlZSBibG9ja3MuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMAktIHN1Y2Nlc3MKKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBkaXNrIHJlc291cmNlcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKgorICogc2VyaWFsaXphdGlvbjogSVdSSVRFX0xPQ0soaXBibWFwKSBoZWxkIG9uIGVudHJ5L2V4aXQ7CisgKi8KK3N0YXRpYyBpbnQgZGJGaW5kQ3RsKHN0cnVjdCBibWFwICogYm1wLCBpbnQgbDJuYiwgaW50IGxldmVsLCBzNjQgKiBibGtubykKK3sKKwlpbnQgcmMsIGxlYWZpZHgsIGxldjsKKwlzNjQgYiwgbGJsa25vOworCXN0cnVjdCBkbWFwY3RsICpkY3A7CisJaW50IGJ1ZG1pbjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCisJLyogc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBkbWFwIGNvbnRyb2wgcGFnZSBsZXZlbCBhbmQgYmxvY2sKKwkgKiBudW1iZXIsIHNlYXJjaCBkb3duIHRoZSBkbWFwIGNvbnRyb2wgbGV2ZWxzIGZvciB0aGUgc3RhcnRpbmcKKwkgKiBibG9jayBudW1iZXIgb2YgYSBkbWFwIHBhZ2UgdGhhdCBjb250YWlucyBvciBzdGFydHMgb2ZmIAorCSAqIHN1ZmZpY2llbnQgZnJlZSBibG9ja3MuCisJICovCisJZm9yIChsZXYgPSBsZXZlbCwgYiA9ICpibGtubzsgbGV2ID49IDA7IGxldi0tKSB7CisJCS8qIGdldCB0aGUgYnVmZmVyIG9mIHRoZSBkbWFwIGNvbnRyb2wgcGFnZSBmb3IgdGhlIGJsb2NrCisJCSAqIG51bWJlciBhbmQgbGV2ZWwgKGkuZS4gTDAsIEwxLCBMMikuCisJCSAqLworCQlsYmxrbm8gPSBCTEtUT0NUTChiLCBibXAtPmRiX2wybmJwZXJwYWdlLCBsZXYpOworCQltcCA9IHJlYWRfbWV0YXBhZ2UoYm1wLT5kYl9pcGJtYXAsIGxibGtubywgUFNJWkUsIDApOworCQlpZiAobXAgPT0gTlVMTCkKKwkJCXJldHVybiAtRUlPOworCQlkY3AgPSAoc3RydWN0IGRtYXBjdGwgKikgbXAtPmRhdGE7CisJCWJ1ZG1pbiA9IGRjcC0+YnVkbWluOworCisJCWlmIChkY3AtPmxlYWZpZHggIT0gY3B1X3RvX2xlMzIoQ1RMTEVBRklORCkpIHsKKwkJCWpmc19lcnJvcihibXAtPmRiX2lwYm1hcC0+aV9zYiwKKwkJCQkgICJkYkZpbmRDdGw6IENvcnJ1cHQgZG1hcGN0bCBwYWdlIik7CisJCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJLyogc2VhcmNoIHRoZSB0cmVlIHdpdGhpbiB0aGUgZG1hcCBjb250cm9sIHBhZ2UgZm9yCisJCSAqIHN1ZmZpY2VudCBmcmVlIHNwYWNlLiAgaWYgc3VmZmljaWVudCBmcmVlIHNwYWNlIGlzIGZvdW5kLAorCQkgKiBkYkZpbmRMZWFmKCkgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxlYWYgYXQgd2hpY2gKKwkJICogZnJlZSBzcGFjZSB3YXMgZm91bmQuCisJCSAqLworCQlyYyA9IGRiRmluZExlYWYoKGRtdHJlZV90ICopIGRjcCwgbDJuYiwgJmxlYWZpZHgpOworCisJCS8qIHJlbGVhc2UgdGhlIGJ1ZmZlci4KKwkJICovCisJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCisJCS8qIHNwYWNlIGZvdW5kID8KKwkJICovCisJCWlmIChyYykgeworCQkJaWYgKGxldiAhPSBsZXZlbCkgeworCQkJCWpmc19lcnJvcihibXAtPmRiX2lwYm1hcC0+aV9zYiwKKwkJCQkJICAiZGJGaW5kQ3RsOiBkbWFwIGluY29uc2lzdGVudCIpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJcmV0dXJuIC1FTk9TUEM7CisJCX0KKworCQkvKiBhZGp1c3QgdGhlIGJsb2NrIG51bWJlciB0byByZWZsZWN0IHRoZSBsb2NhdGlvbiB3aXRoaW4KKwkJICogdGhlIGRtYXAgY29udHJvbCBwYWdlIChpLmUuIHRoZSBsZWFmKSBhdCB3aGljaCBmcmVlIAorCQkgKiBzcGFjZSB3YXMgZm91bmQuCisJCSAqLworCQliICs9ICgoKHM2NCkgbGVhZmlkeCkgPDwgYnVkbWluKTsKKworCQkvKiB3ZSBzdG9wIHRoZSBzZWFyY2ggYXQgdGhpcyBkbWFwIGNvbnRyb2wgcGFnZSBsZXZlbCBpZgorCQkgKiB0aGUgbnVtYmVyIG9mIGJsb2NrcyByZXF1aXJlZCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwKKwkJICogdG8gdGhlIG1heGltdW0gbnVtYmVyIG9mIGJsb2NrcyBkZXNjcmliZWQgYXQgdGhlIG5leHQKKwkJICogKGxvd2VyKSBsZXZlbC4KKwkJICovCisJCWlmIChsMm5iID49IGJ1ZG1pbikKKwkJCWJyZWFrOworCX0KKworCSpibGtubyA9IGI7CisJcmV0dXJuICgwKTsKK30KKworCisvKgorICogTkFNRToJZGJBbGxvY0N0bCgpCisgKgorICogRlVOQ1RJT046ICAgIGF0dGVtcHQgdG8gYWxsb2NhdGUgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNvbnRpZ3VvdXMKKyAqCQlibG9ja3Mgc3RhcnRpbmcgd2l0aGluIGEgc3BlY2lmaWMgZG1hcC4gIAorICoJCQorICoJCXRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgaGlnaGVyIGxldmVsIHJvdXRpbmVzIHRoYXQgc2VhcmNoCisgKgkJdGhlIGRtYXAgY29udHJvbCBwYWdlcyBhYm92ZSB0aGUgYWN0dWFsIGRtYXBzIGZvciBjb250aWd1b3VzCisgKgkJZnJlZSBzcGFjZS4gIHRoZSByZXN1bHQgb2Ygc3VjY2Vzc2Z1bCBzZWFyY2hlcyBieSB0aGVzZQorICogCQlyb3V0aW5lcyBhcmUgdGhlIHN0YXJ0aW5nIGJsb2NrIG51bWJlcnMgd2l0aGluIGRtYXBzLCB3aXRoCisgKgkJdGhlIGRtYXBzIHRoZW1zZWx2ZXMgY29udGFpbmluZyB0aGUgZGVzaXJlZCBjb250aWd1b3VzIGZyZWUKKyAqCQlzcGFjZSBvciBzdGFydGluZyBhIGNvbnRpZ3VvdXMgZnJlZSBzcGFjZSBvZiBkZXNpcmVkIHNpemUKKyAqCQl0aGF0IGlzIG1hZGUgdXAgb2YgdGhlIGJsb2NrcyBvZiBvbmUgb3IgbW9yZSBkbWFwcy4gdGhlc2UKKyAqCQljYWxscyBzaG91bGQgbm90IGZhaWwgZHVlIHRvIGluc3VmZmljZW50IHJlc291cmNlcy4KKyAqCisgKgkJdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBpbiBzb21lIGNhc2VzIHdoZXJlIGl0IGlzIG5vdCBrbm93bgorICoJCXdoZXRoZXIgaXQgd2lsbCBmYWlsIGR1ZSB0byBpbnN1ZmZpY2llbnQgcmVzb3VyY2VzLiAgbW9yZQorICoJCXNwZWNpZmljYWxseSwgdGhpcyBvY2N1cnMgd2hlbiBhbGxvY2F0aW5nIGZyb20gYW4gYWxsb2NhdGlvbgorICoJCWdyb3VwIHdob3NlIHNpemUgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBibG9ja3MgcGVyIGRtYXAuCisgKgkJaW4gdGhpcyBjYXNlLCB0aGUgZG1hcCBjb250cm9sIHBhZ2VzIGFyZSBub3QgZXhhbWluZWQgcHJpb3IKKyAqCQl0byBjYWxsaW5nIHRoaXMgcm91dGluZSAodG8gc2F2ZSBwYXRobGVuZ3RoKSBhbmQgdGhlIGNhbGwKKyAqCQltaWdodCBmYWlsLgorICoKKyAqCQlmb3IgYSByZXF1ZXN0IHNpemUgdGhhdCBmaXRzIHdpdGhpbiBhIGRtYXAsIHRoaXMgcm91dGluZSByZWxpZXMKKyAqCQl1cG9uIHRoZSBkbWFwJ3MgZG10cmVlIHRvIGZpbmQgdGhlIHJlcXVlc3RlZCBjb250aWd1b3VzIGZyZWUKKyAqCQlzcGFjZS4gIGZvciByZXF1ZXN0IHNpemVzIHRoYXQgYXJlIGxhcmdlciB0aGFuIGEgZG1hcCwgdGhlCisgKgkJcmVxdWVzdGVkIGZyZWUgc3BhY2Ugd2lsbCBzdGFydCBhdCB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlCisgKgkJZmlyc3QgZG1hcCAoaS5lLiBibGtubykuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgYm1wCS0gIHBvaW50ZXIgdG8gYm1hcCBkZXNjcmlwdG9yCisgKiAgICAgIG5ibG9ja3MJIC0gIGFjdHVhbCBudW1iZXIgb2YgY29udGlndW91cyBmcmVlIGJsb2NrcyB0byBhbGxvY2F0ZS4KKyAqICAgICAgbDJuYgkgLSAgbG9nMiBudW1iZXIgb2YgY29udGlndW91cyBmcmVlIGJsb2NrcyB0byBhbGxvY2F0ZS4KKyAqICAgICAgYmxrbm8JIC0gIHN0YXJ0aW5nIGJsb2NrIG51bWJlciBvZiB0aGUgZG1hcCB0byBzdGFydCB0aGUgYWxsb2NhdGlvbgorICoJCSAgICBmcm9tLgorICogICAgICByZXN1bHRzCS0gIG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBzZXQgdG8gdGhlIHN0YXJ0aW5nIGJsb2NrIG51bWJlcgorICoJCSAgIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgcmFuZ2UuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMAktIHN1Y2Nlc3MKKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBkaXNrIHJlc291cmNlcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKgorICogc2VyaWFsaXphdGlvbjogSVdSSVRFX0xPQ0soaXBibWFwKSBoZWxkIG9uIGVudHJ5L2V4aXQ7CisgKi8KK3N0YXRpYyBpbnQKK2RiQWxsb2NDdGwoc3RydWN0IGJtYXAgKiBibXAsIHM2NCBuYmxvY2tzLCBpbnQgbDJuYiwgczY0IGJsa25vLCBzNjQgKiByZXN1bHRzKQoreworCWludCByYywgbmI7CisJczY0IGIsIGxibGtubywgbjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXN0cnVjdCBkbWFwICpkcDsKKworCS8qIGNoZWNrIGlmIHRoZSBhbGxvY2F0aW9uIHJlcXVlc3QgaXMgY29uZmluZWQgdG8gYSBzaW5nbGUgZG1hcC4KKwkgKi8KKwlpZiAobDJuYiA8PSBMMkJQRVJETUFQKSB7CisJCS8qIGdldCB0aGUgYnVmZmVyIGZvciB0aGUgZG1hcC4KKwkJICovCisJCWxibGtubyA9IEJMS1RPRE1BUChibGtubywgYm1wLT5kYl9sMm5icGVycGFnZSk7CisJCW1wID0gcmVhZF9tZXRhcGFnZShibXAtPmRiX2lwYm1hcCwgbGJsa25vLCBQU0laRSwgMCk7CisJCWlmIChtcCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FSU87CisJCWRwID0gKHN0cnVjdCBkbWFwICopIG1wLT5kYXRhOworCisJCS8qIHRyeSB0byBhbGxvY2F0ZSB0aGUgYmxvY2tzLgorCQkgKi8KKwkJcmMgPSBkYkFsbG9jRG1hcExldihibXAsIGRwLCAoaW50KSBuYmxvY2tzLCBsMm5iLCByZXN1bHRzKTsKKwkJaWYgKHJjID09IDApCisJCQltYXJrX21ldGFwYWdlX2RpcnR5KG1wKTsKKworCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKworCQlyZXR1cm4gKHJjKTsKKwl9CisKKwkvKiBhbGxvY2F0aW9uIHJlcXVlc3QgaW52b2x2aW5nIG11bHRpcGxlIGRtYXBzLiBpdCBtdXN0IHN0YXJ0IG9uCisJICogYSBkbWFwIGJvdW5kYXJ5LgorCSAqLworCWFzc2VydCgoYmxrbm8gJiAoQlBFUkRNQVAgLSAxKSkgPT0gMCk7CisKKwkvKiBhbGxvY2F0ZSB0aGUgYmxvY2tzIGRtYXAgYnkgZG1hcC4KKwkgKi8KKwlmb3IgKG4gPSBuYmxvY2tzLCBiID0gYmxrbm87IG4gPiAwOyBuIC09IG5iLCBiICs9IG5iKSB7CisJCS8qIGdldCB0aGUgYnVmZmVyIGZvciB0aGUgZG1hcC4KKwkJICovCisJCWxibGtubyA9IEJMS1RPRE1BUChiLCBibXAtPmRiX2wybmJwZXJwYWdlKTsKKwkJbXAgPSByZWFkX21ldGFwYWdlKGJtcC0+ZGJfaXBibWFwLCBsYmxrbm8sIFBTSVpFLCAwKTsKKwkJaWYgKG1wID09IE5VTEwpIHsKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gYmFja291dDsKKwkJfQorCQlkcCA9IChzdHJ1Y3QgZG1hcCAqKSBtcC0+ZGF0YTsKKworCQkvKiB0aGUgZG1hcCBiZXR0ZXIgYmUgYWxsIGZyZWUuCisJCSAqLworCQlpZiAoZHAtPnRyZWUuc3RyZWVbUk9PVF0gIT0gTDJCUEVSRE1BUCkgeworCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQlqZnNfZXJyb3IoYm1wLT5kYl9pcGJtYXAtPmlfc2IsCisJCQkJICAiZGJBbGxvY0N0bDogdGhlIGRtYXAgaXMgbm90IGFsbCBmcmVlIik7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIGJhY2tvdXQ7CisJCX0KKworCQkvKiBkZXRlcm1pbmUgaG93IG1hbnkgYmxvY2tzIHRvIGFsbG9jYXRlIGZyb20gdGhpcyBkbWFwLgorCQkgKi8KKwkJbmIgPSBtaW4obiwgKHM2NClCUEVSRE1BUCk7CisKKwkJLyogYWxsb2NhdGUgdGhlIGJsb2NrcyBmcm9tIHRoZSBkbWFwLgorCQkgKi8KKwkJaWYgKChyYyA9IGRiQWxsb2NEbWFwKGJtcCwgZHAsIGIsIG5iKSkpIHsKKwkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQkJZ290byBiYWNrb3V0OworCQl9CisKKwkJLyogd3JpdGUgdGhlIGJ1ZmZlci4KKwkJICovCisJCXdyaXRlX21ldGFwYWdlKG1wKTsKKwl9CisKKwkvKiBzZXQgdGhlIHJlc3VsdHMgKHN0YXJ0aW5nIGJsb2NrIG51bWJlcikgYW5kIHJldHVybi4KKwkgKi8KKwkqcmVzdWx0cyA9IGJsa25vOworCXJldHVybiAoMCk7CisKKwkvKiBzb21ldGhpbmcgZmFpbGVkIGluIGhhbmRsaW5nIGFuIGFsbG9jYXRpb24gcmVxdWVzdCBpbnZvbHZpbmcKKwkgKiBtdWx0aXBsZSBkbWFwcy4gIHdlJ2xsIHRyeSB0byBjbGVhbiB1cCBieSBiYWNraW5nIG91dCBhbnkKKwkgKiBhbGxvY2F0aW9uIHRoYXQgaGFzIGFscmVhZHkgaGFwcGVuZWQgZm9yIHRoaXMgcmVxdWVzdC4gIGlmCisJICogd2UgZmFpbCBpbiBiYWNraW5nIG91dCB0aGUgYWxsb2NhdGlvbiwgd2UnbGwgbWFyayB0aGUgZmlsZQorCSAqIHN5c3RlbSB0byBpbmRpY2F0ZSB0aGF0IGJsb2NrcyBoYXZlIGJlZW4gbGVha2VkLgorCSAqLworICAgICAgYmFja291dDoKKworCS8qIHRyeSB0byBiYWNrb3V0IHRoZSBhbGxvY2F0aW9ucyBkbWFwIGJ5IGRtYXAuCisJICovCisJZm9yIChuID0gbmJsb2NrcyAtIG4sIGIgPSBibGtubzsgbiA+IDA7CisJICAgICBuIC09IEJQRVJETUFQLCBiICs9IEJQRVJETUFQKSB7CisJCS8qIGdldCB0aGUgYnVmZmVyIGZvciB0aGlzIGRtYXAuCisJCSAqLworCQlsYmxrbm8gPSBCTEtUT0RNQVAoYiwgYm1wLT5kYl9sMm5icGVycGFnZSk7CisJCW1wID0gcmVhZF9tZXRhcGFnZShibXAtPmRiX2lwYm1hcCwgbGJsa25vLCBQU0laRSwgMCk7CisJCWlmIChtcCA9PSBOVUxMKSB7CisJCQkvKiBjb3VsZCBub3QgYmFjayBvdXQuICBtYXJrIHRoZSBmaWxlIHN5c3RlbQorCQkJICogdG8gaW5kaWNhdGUgdGhhdCB3ZSBoYXZlIGxlYWtlZCBibG9ja3MuCisJCQkgKi8KKwkJCWpmc19lcnJvcihibXAtPmRiX2lwYm1hcC0+aV9zYiwKKwkJCQkgICJkYkFsbG9jQ3RsOiBJL08gRXJyb3I6IEJsb2NrIExlYWthZ2UuIik7CisJCQljb250aW51ZTsKKwkJfQorCQlkcCA9IChzdHJ1Y3QgZG1hcCAqKSBtcC0+ZGF0YTsKKworCQkvKiBmcmVlIHRoZSBibG9ja3MgaXMgdGhpcyBkbWFwLgorCQkgKi8KKwkJaWYgKGRiRnJlZURtYXAoYm1wLCBkcCwgYiwgQlBFUkRNQVApKSB7CisJCQkvKiBjb3VsZCBub3QgYmFjayBvdXQuICBtYXJrIHRoZSBmaWxlIHN5c3RlbQorCQkJICogdG8gaW5kaWNhdGUgdGhhdCB3ZSBoYXZlIGxlYWtlZCBibG9ja3MuCisJCQkgKi8KKwkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQkJamZzX2Vycm9yKGJtcC0+ZGJfaXBibWFwLT5pX3NiLAorCQkJCSAgImRiQWxsb2NDdGw6IEJsb2NrIExlYWthZ2UuIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHdyaXRlIHRoZSBidWZmZXIuCisJCSAqLworCQl3cml0ZV9tZXRhcGFnZShtcCk7CisJfQorCisJcmV0dXJuIChyYyk7Cit9CisKKworLyoKKyAqIE5BTUU6CWRiQWxsb2NEbWFwTGV2KCkKKyAqCisgKiBGVU5DVElPTjogICAgYXR0ZW1wdCB0byBhbGxvY2F0ZSBhIHNwZWNpZmllZCBudW1iZXIgb2YgY29udGlndW91cyBibG9ja3MKKyAqCQlmcm9tIGEgc3BlY2lmaWVkIGRtYXAuCisgKgkJCisgKgkJdGhpcyByb3V0aW5lIGNoZWNrcyBpZiB0aGUgY29udGlndW91cyBibG9ja3MgYXJlIGF2YWlsYWJsZS4KKyAqCQlpZiBzbywgbmJsb2NrcyBvZiBibG9ja3MgYXJlIGFsbG9jYXRlZDsgb3RoZXJ3aXNlLCBFTk9TUEMgaXMKKyAqCQlyZXR1cm5lZC4KKyAqCisgKiBQQVJBTUVURVJTOgorICogICAgICBtcAktICBwb2ludGVyIHRvIGJtYXAgZGVzY3JpcHRvcgorICogICAgICBkcAktICBwb2ludGVyIHRvIGRtYXAgdG8gYXR0ZW1wdCB0byBhbGxvY2F0ZSBibG9ja3MgZnJvbS4gCisgKiAgICAgIGwybmIJLSAgbG9nMiBudW1iZXIgb2YgY29udGlndW91cyBibG9jayBkZXNpcmVkLgorICogICAgICBuYmxvY2tzCS0gIGFjdHVhbCBudW1iZXIgb2YgY29udGlndW91cyBibG9jayBkZXNpcmVkLgorICogICAgICByZXN1bHRzCS0gIG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBzZXQgdG8gdGhlIHN0YXJ0aW5nIGJsb2NrIG51bWJlcgorICoJCSAgIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgcmFuZ2UuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMAktIHN1Y2Nlc3MKKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBkaXNrIHJlc291cmNlcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKgorICogc2VyaWFsaXphdGlvbjogSVJFQURfTE9DSyhpcGJtYXApLCBlLmcuLCBmcm9tIGRiQWxsb2MoKSwgb3IgCisgKglJV1JJVEVfTE9DSyhpcGJtYXApLCBlLmcuLCBkYkFsbG9jQ3RsKCksIGhlbGQgb24gZW50cnkvZXhpdDsKKyAqLworc3RhdGljIGludAorZGJBbGxvY0RtYXBMZXYoc3RydWN0IGJtYXAgKiBibXAsCisJICAgICAgIHN0cnVjdCBkbWFwICogZHAsIGludCBuYmxvY2tzLCBpbnQgbDJuYiwgczY0ICogcmVzdWx0cykKK3sKKwlzNjQgYmxrbm87CisJaW50IGxlYWZpZHgsIHJjOworCisJLyogY2FuJ3QgYmUgbW9yZSB0aGFuIGEgZG1hcHMgd29ydGggb2YgYmxvY2tzICovCisJYXNzZXJ0KGwybmIgPD0gTDJCUEVSRE1BUCk7CisKKwkvKiBzZWFyY2ggdGhlIHRyZWUgd2l0aGluIHRoZSBkbWFwIHBhZ2UgZm9yIHN1ZmZpY2llbnQKKwkgKiBmcmVlIHNwYWNlLiAgaWYgc3VmZmljaWVudCBmcmVlIHNwYWNlIGlzIGZvdW5kLCBkYkZpbmRMZWFmKCkKKwkgKiByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGVhZiBhdCB3aGljaCBmcmVlIHNwYWNlIHdhcyBmb3VuZC4KKwkgKi8KKwlpZiAoZGJGaW5kTGVhZigoZG10cmVlX3QgKikgJiBkcC0+dHJlZSwgbDJuYiwgJmxlYWZpZHgpKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCS8qIGRldGVybWluZSB0aGUgYmxvY2sgbnVtYmVyIHdpdGhpbiB0aGUgZmlsZSBzeXN0ZW0gY29ycmVzcG9uZGluZworCSAqIHRvIHRoZSBsZWFmIGF0IHdoaWNoIGZyZWUgc3BhY2Ugd2FzIGZvdW5kLgorCSAqLworCWJsa25vID0gbGU2NF90b19jcHUoZHAtPnN0YXJ0KSArIChsZWFmaWR4IDw8IEwyREJXT1JEKTsKKworCS8qIGlmIG5vdCBhbGwgYml0cyBvZiB0aGUgZG1hcCB3b3JkIGFyZSBmcmVlLCBnZXQgdGhlIHN0YXJ0aW5nCisJICogYml0IG51bWJlciB3aXRoaW4gdGhlIGRtYXAgd29yZCBvZiB0aGUgcmVxdWlyZWQgc3RyaW5nIG9mIGZyZWUKKwkgKiBiaXRzIGFuZCBhZGp1c3QgdGhlIGJsb2NrIG51bWJlciB3aXRoIHRoaXMgdmFsdWUuCisJICovCisJaWYgKGRwLT50cmVlLnN0cmVlW2xlYWZpZHggKyBMRUFGSU5EXSA8IEJVRE1JTikKKwkJYmxrbm8gKz0gZGJGaW5kQml0cyhsZTMyX3RvX2NwdShkcC0+d21hcFtsZWFmaWR4XSksIGwybmIpOworCisJLyogYWxsb2NhdGUgdGhlIGJsb2NrcyAqLworCWlmICgocmMgPSBkYkFsbG9jRG1hcChibXAsIGRwLCBibGtubywgbmJsb2NrcykpID09IDApCisJCSpyZXN1bHRzID0gYmxrbm87CisKKwlyZXR1cm4gKHJjKTsKK30KKworCisvKgorICogTkFNRToJZGJBbGxvY0RtYXAoKQorICoKKyAqIEZVTkNUSU9OOiAgICBhZGp1c3QgdGhlIGRpc2sgYWxsb2NhdGlvbiBtYXAgdG8gcmVmbGVjdCB0aGUgYWxsb2NhdGlvbgorICoJCW9mIGEgc3BlY2lmaWVkIGJsb2NrIHJhbmdlIHdpdGhpbiBhIGRtYXAuCisgKgorICoJCXRoaXMgcm91dGluZSBhbGxvY2F0ZXMgdGhlIHNwZWNpZmllZCBibG9ja3MgZnJvbSB0aGUgZG1hcAorICoJCXRocm91Z2ggYSBjYWxsIHRvIGRiQWxsb2NCaXRzKCkuIGlmIHRoZSBhbGxvY2F0aW9uIG9mIHRoZQorICoJCWJsb2NrIHJhbmdlIGNhdXNlcyB0aGUgbWF4aW11bSBzdHJpbmcgb2YgZnJlZSBibG9ja3Mgd2l0aGluCisgKgkJdGhlIGRtYXAgdG8gY2hhbmdlIChpLmUuIHRoZSB2YWx1ZSBvZiB0aGUgcm9vdCBvZiB0aGUgZG1hcCdzCisgKgkJZG10cmVlKSwgdGhpcyByb3V0aW5lIHdpbGwgY2F1c2UgdGhpcyBjaGFuZ2UgdG8gYmUgcmVmbGVjdGVkCisgKgkJdXAgdGhyb3VnaCB0aGUgYXBwcm9wcmlhdGUgbGV2ZWxzIG9mIHRoZSBkbWFwIGNvbnRyb2wgcGFnZXMKKyAqCQlieSBhIGNhbGwgdG8gZGJBZGpDdGwoKSBmb3IgdGhlIEwwIGRtYXAgY29udHJvbCBwYWdlIHRoYXQKKyAqCQljb3ZlcnMgdGhpcyBkbWFwLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGJtcAktICBwb2ludGVyIHRvIGJtYXAgZGVzY3JpcHRvcgorICogICAgICBkcAktICBwb2ludGVyIHRvIGRtYXAgdG8gYWxsb2NhdGUgdGhlIGJsb2NrIHJhbmdlIGZyb20uCisgKiAgICAgIGJsa25vCS0gIHN0YXJ0aW5nIGJsb2NrIG51bWJlciBvZiB0aGUgYmxvY2sgdG8gYmUgYWxsb2NhdGVkLgorICogICAgICBuYmxvY2tzCS0gIG51bWJlciBvZiBibG9ja3MgdG8gYmUgYWxsb2NhdGVkLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAJLSBzdWNjZXNzCisgKiAgICAgIC1FSU8JLSBpL28gZXJyb3IKKyAqCisgKiBzZXJpYWxpemF0aW9uOiBJUkVBRF9MT0NLKGlwYm1hcCkgb3IgSVdSSVRFX0xPQ0soaXBibWFwKSBoZWxkIG9uIGVudHJ5L2V4aXQ7CisgKi8KK3N0YXRpYyBpbnQgZGJBbGxvY0RtYXAoc3RydWN0IGJtYXAgKiBibXAsIHN0cnVjdCBkbWFwICogZHAsIHM2NCBibGtubywKKwkJICAgICAgIGludCBuYmxvY2tzKQoreworCXM4IG9sZHJvb3Q7CisJaW50IHJjOworCisJLyogc2F2ZSB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcm9vdCAoaS5lLiBtYXhpbXVtIGZyZWUgc3RyaW5nKQorCSAqIG9mIHRoZSBkbWFwIHRyZWUuCisJICovCisJb2xkcm9vdCA9IGRwLT50cmVlLnN0cmVlW1JPT1RdOworCisJLyogYWxsb2NhdGUgdGhlIHNwZWNpZmllZCAoYmxvY2tzKSBiaXRzICovCisJZGJBbGxvY0JpdHMoYm1wLCBkcCwgYmxrbm8sIG5ibG9ja3MpOworCisJLyogaWYgdGhlIHJvb3QgaGFzIG5vdCBjaGFuZ2VkLCBkb25lLiAqLworCWlmIChkcC0+dHJlZS5zdHJlZVtST09UXSA9PSBvbGRyb290KQorCQlyZXR1cm4gKDApOworCisJLyogcm9vdCBjaGFuZ2VkLiBidWJibGUgdGhlIGNoYW5nZSB1cCB0byB0aGUgZG1hcCBjb250cm9sIHBhZ2VzLgorCSAqIGlmIHRoZSBhZGp1c3RtZW50IG9mIHRoZSB1cHBlciBsZXZlbCBjb250cm9sIHBhZ2VzIGZhaWxzLAorCSAqIGJhY2tvdXQgdGhlIGJpdCBhbGxvY2F0aW9uICh0aHVzIG1ha2luZyBldmVyeXRoaW5nIGNvbnNpc3RlbnQpLgorCSAqLworCWlmICgocmMgPSBkYkFkakN0bChibXAsIGJsa25vLCBkcC0+dHJlZS5zdHJlZVtST09UXSwgMSwgMCkpKQorCQlkYkZyZWVCaXRzKGJtcCwgZHAsIGJsa25vLCBuYmxvY2tzKTsKKworCXJldHVybiAocmMpOworfQorCisKKy8qCisgKiBOQU1FOglkYkZyZWVEbWFwKCkKKyAqCisgKiBGVU5DVElPTjogICAgYWRqdXN0IHRoZSBkaXNrIGFsbG9jYXRpb24gbWFwIHRvIHJlZmxlY3QgdGhlIGFsbG9jYXRpb24KKyAqCQlvZiBhIHNwZWNpZmllZCBibG9jayByYW5nZSB3aXRoaW4gYSBkbWFwLgorICoKKyAqCQl0aGlzIHJvdXRpbmUgZnJlZXMgdGhlIHNwZWNpZmllZCBibG9ja3MgZnJvbSB0aGUgZG1hcCB0aHJvdWdoCisgKgkJYSBjYWxsIHRvIGRiRnJlZUJpdHMoKS4gaWYgdGhlIGRlYWxsb2NhdGlvbiBvZiB0aGUgYmxvY2sgcmFuZ2UKKyAqCQljYXVzZXMgdGhlIG1heGltdW0gc3RyaW5nIG9mIGZyZWUgYmxvY2tzIHdpdGhpbiB0aGUgZG1hcCB0bworICoJCWNoYW5nZSAoaS5lLiB0aGUgdmFsdWUgb2YgdGhlIHJvb3Qgb2YgdGhlIGRtYXAncyBkbXRyZWUpLCB0aGlzCisgKgkJcm91dGluZSB3aWxsIGNhdXNlIHRoaXMgY2hhbmdlIHRvIGJlIHJlZmxlY3RlZCB1cCB0aHJvdWdoIHRoZQorICoJICAgICAgICBhcHByb3ByaWF0ZSBsZXZlbHMgb2YgdGhlIGRtYXAgY29udHJvbCBwYWdlcyBieSBhIGNhbGwgdG8KKyAqCQlkYkFkakN0bCgpIGZvciB0aGUgTDAgZG1hcCBjb250cm9sIHBhZ2UgdGhhdCBjb3ZlcnMgdGhpcyBkbWFwLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGJtcAktICBwb2ludGVyIHRvIGJtYXAgZGVzY3JpcHRvcgorICogICAgICBkcAktICBwb2ludGVyIHRvIGRtYXAgdG8gZnJlZSB0aGUgYmxvY2sgcmFuZ2UgZnJvbS4KKyAqICAgICAgYmxrbm8JLSAgc3RhcnRpbmcgYmxvY2sgbnVtYmVyIG9mIHRoZSBibG9jayB0byBiZSBmcmVlZC4KKyAqICAgICAgbmJsb2NrcwktICBudW1iZXIgb2YgYmxvY2tzIHRvIGJlIGZyZWVkLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAJLSBzdWNjZXNzCisgKiAgICAgIC1FSU8JLSBpL28gZXJyb3IKKyAqCisgKiBzZXJpYWxpemF0aW9uOiBJUkVBRF9MT0NLKGlwYm1hcCkgb3IgSVdSSVRFX0xPQ0soaXBibWFwKSBoZWxkIG9uIGVudHJ5L2V4aXQ7CisgKi8KK3N0YXRpYyBpbnQgZGJGcmVlRG1hcChzdHJ1Y3QgYm1hcCAqIGJtcCwgc3RydWN0IGRtYXAgKiBkcCwgczY0IGJsa25vLAorCQkgICAgICBpbnQgbmJsb2NrcykKK3sKKwlzOCBvbGRyb290OworCWludCByYywgd29yZDsKKworCS8qIHNhdmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHJvb3QgKGkuZS4gbWF4aW11bSBmcmVlIHN0cmluZykKKwkgKiBvZiB0aGUgZG1hcCB0cmVlLgorCSAqLworCW9sZHJvb3QgPSBkcC0+dHJlZS5zdHJlZVtST09UXTsKKworCS8qIGZyZWUgdGhlIHNwZWNpZmllZCAoYmxvY2tzKSBiaXRzICovCisJZGJGcmVlQml0cyhibXAsIGRwLCBibGtubywgbmJsb2Nrcyk7CisKKwkvKiBpZiB0aGUgcm9vdCBoYXMgbm90IGNoYW5nZWQsIGRvbmUuICovCisJaWYgKGRwLT50cmVlLnN0cmVlW1JPT1RdID09IG9sZHJvb3QpCisJCXJldHVybiAoMCk7CisKKwkvKiByb290IGNoYW5nZWQuIGJ1YmJsZSB0aGUgY2hhbmdlIHVwIHRvIHRoZSBkbWFwIGNvbnRyb2wgcGFnZXMuCisJICogaWYgdGhlIGFkanVzdG1lbnQgb2YgdGhlIHVwcGVyIGxldmVsIGNvbnRyb2wgcGFnZXMgZmFpbHMsCisJICogYmFja291dCB0aGUgZGVhbGxvY2F0aW9uLiAKKwkgKi8KKwlpZiAoKHJjID0gZGJBZGpDdGwoYm1wLCBibGtubywgZHAtPnRyZWUuc3RyZWVbUk9PVF0sIDAsIDApKSkgeworCQl3b3JkID0gKGJsa25vICYgKEJQRVJETUFQIC0gMSkpID4+IEwyREJXT1JEOworCisJCS8qIGFzIHBhcnQgb2YgYmFja2luZyBvdXQgdGhlIGRlYWxsb2NhdGlvbiwgd2Ugd2lsbCBoYXZlCisJCSAqIHRvIGJhY2sgc3BsaXQgdGhlIGRtYXAgdHJlZSBpZiB0aGUgZGVhbGxvY2F0aW9uIGNhdXNlZAorCQkgKiB0aGUgZnJlZWQgYmxvY2tzIHRvIGJlY29tZSBwYXJ0IG9mIGEgbGFyZ2VyIGJpbmFyeSBidWRkeQorCQkgKiBzeXN0ZW0uCisJCSAqLworCQlpZiAoZHAtPnRyZWUuc3RyZWVbd29yZF0gPT0gTk9GUkVFKQorCQkJZGJCYWNrU3BsaXQoKGRtdHJlZV90ICopICYgZHAtPnRyZWUsIHdvcmQpOworCisJCWRiQWxsb2NCaXRzKGJtcCwgZHAsIGJsa25vLCBuYmxvY2tzKTsKKwl9CisKKwlyZXR1cm4gKHJjKTsKK30KKworCisvKgorICogTkFNRToJZGJBbGxvY0JpdHMoKQorICoKKyAqIEZVTkNUSU9OOiAgICBhbGxvY2F0ZSBhIHNwZWNpZmllZCBibG9jayByYW5nZSBmcm9tIGEgZG1hcC4KKyAqCisgKgkJdGhpcyByb3V0aW5lIHVwZGF0ZXMgdGhlIGRtYXAgdG8gcmVmbGVjdCB0aGUgd29ya2luZworICoJCXN0YXRlIGFsbG9jYXRpb24gb2YgdGhlIHNwZWNpZmllZCBibG9jayByYW5nZS4gaXQgZGlyZWN0bHkKKyAqCQl1cGRhdGVzIHRoZSBiaXRzIG9mIHRoZSB3b3JraW5nIG1hcCBhbmQgY2F1c2VzIHRoZSBhZGp1c3RtZW50CisgKgkJb2YgdGhlIGJpbmFyeSBidWRkeSBzeXN0ZW0gZGVzY3JpYmVkIGJ5IHRoZSBkbWFwJ3MgZG10cmVlCisgKgkJbGVhdmVzIHRvIHJlZmxlY3QgdGhlIGJpdHMgYWxsb2NhdGVkLiAgaXQgYWxzbyBjYXVzZXMgdGhlCisgKgkJZG1hcCdzIGRtdHJlZSwgYXMgYSB3aG9sZSwgdG8gcmVmbGVjdCB0aGUgYWxsb2NhdGVkIHJhbmdlLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGJtcAktICBwb2ludGVyIHRvIGJtYXAgZGVzY3JpcHRvcgorICogICAgICBkcAktICBwb2ludGVyIHRvIGRtYXAgdG8gYWxsb2NhdGUgYml0cyBmcm9tLgorICogICAgICBibGtubwktICBzdGFydGluZyBibG9jayBudW1iZXIgb2YgdGhlIGJpdHMgdG8gYmUgYWxsb2NhdGVkLgorICogICAgICBuYmxvY2tzCS0gIG51bWJlciBvZiBiaXRzIHRvIGJlIGFsbG9jYXRlZC4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOiBub25lCisgKgorICogc2VyaWFsaXphdGlvbjogSVJFQURfTE9DSyhpcGJtYXApIG9yIElXUklURV9MT0NLKGlwYm1hcCkgaGVsZCBvbiBlbnRyeS9leGl0OworICovCitzdGF0aWMgdm9pZCBkYkFsbG9jQml0cyhzdHJ1Y3QgYm1hcCAqIGJtcCwgc3RydWN0IGRtYXAgKiBkcCwgczY0IGJsa25vLAorCQkJaW50IG5ibG9ja3MpCit7CisJaW50IGRiaXRubywgd29yZCwgcmVtYml0cywgbmIsIG53b3Jkcywgd2JpdG5vLCBudywgYWdubzsKKwlkbXRyZWVfdCAqdHAgPSAoZG10cmVlX3QgKikgJiBkcC0+dHJlZTsKKwlpbnQgc2l6ZTsKKwlzOCAqbGVhZjsKKworCS8qIHBpY2sgdXAgYSBwb2ludGVyIHRvIHRoZSBsZWF2ZXMgb2YgdGhlIGRtYXAgdHJlZSAqLworCWxlYWYgPSBkcC0+dHJlZS5zdHJlZSArIExFQUZJTkQ7CisKKwkvKiBkZXRlcm1pbmUgdGhlIGJpdCBudW1iZXIgYW5kIHdvcmQgd2l0aGluIHRoZSBkbWFwIG9mIHRoZQorCSAqIHN0YXJ0aW5nIGJsb2NrLgorCSAqLworCWRiaXRubyA9IGJsa25vICYgKEJQRVJETUFQIC0gMSk7CisJd29yZCA9IGRiaXRubyA+PiBMMkRCV09SRDsKKworCS8qIGJsb2NrIHJhbmdlIGJldHRlciBiZSB3aXRoaW4gdGhlIGRtYXAgKi8KKwlhc3NlcnQoZGJpdG5vICsgbmJsb2NrcyA8PSBCUEVSRE1BUCk7CisKKwkvKiBhbGxvY2F0ZSB0aGUgYml0cyBvZiB0aGUgZG1hcCdzIHdvcmRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJsb2NrCisJICogcmFuZ2UuIG5vdCBhbGwgYml0cyBvZiB0aGUgZmlyc3QgYW5kIGxhc3Qgd29yZHMgbWF5IGJlIGNvbnRhaW5lZAorCSAqIHdpdGhpbiB0aGUgYmxvY2sgcmFuZ2UuICBpZiB0aGlzIGlzIHRoZSBjYXNlLCB3ZSdsbCB3b3JrIGFnYWluc3QKKwkgKiB0aG9zZSB3b3JkcyAoaS5lLiBwYXJ0aWFsIGZpcnN0IGFuZC9vciBsYXN0KSBvbiBhbiBpbmRpdmlkdWFsIGJhc2lzCisJICogKGEgc2luZ2xlIHBhc3MpLCBhbGxvY2F0aW5nIHRoZSBiaXRzIG9mIGludGVyZXN0IGJ5IGhhbmQgYW5kCisJICogdXBkYXRpbmcgdGhlIGxlYWYgY29ycmVzcG9uZGluZyB0byB0aGUgZG1hcCB3b3JkLiBhIHNpbmdsZSBwYXNzCisJICogd2lsbCBiZSB1c2VkIGZvciBhbGwgZG1hcCB3b3JkcyBmdWxseSBjb250YWluZWQgd2l0aGluIHRoZQorCSAqIHNwZWNpZmllZCByYW5nZS4gIHdpdGhpbiB0aGlzIHBhc3MsIHRoZSBiaXRzIG9mIGFsbCBmdWxseSBjb250YWluZWQKKwkgKiBkbWFwIHdvcmRzIHdpbGwgYmUgbWFya2VkIGFzIGZyZWUgaW4gYSBzaW5nbGUgc2hvdCBhbmQgdGhlIGxlYXZlcworCSAqIHdpbGwgYmUgdXBkYXRlZC4gYSBzaW5nbGUgbGVhZiBtYXkgZGVzY3JpYmUgdGhlIGZyZWUgc3BhY2Ugb2YKKwkgKiBtdWx0aXBsZSBkbWFwIHdvcmRzLCBzbyB3ZSBtYXkgdXBkYXRlIG9ubHkgYSBzdWJzZXQgb2YgdGhlIGFjdHVhbAorCSAqIGxlYXZlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBkbWFwIHdvcmRzIG9mIHRoZSBibG9jayByYW5nZS4KKwkgKi8KKwlmb3IgKHJlbWJpdHMgPSBuYmxvY2tzOyByZW1iaXRzID4gMDsgcmVtYml0cyAtPSBuYiwgZGJpdG5vICs9IG5iKSB7CisJCS8qIGRldGVybWluZSB0aGUgYml0IG51bWJlciB3aXRoaW4gdGhlIHdvcmQgYW5kCisJCSAqIHRoZSBudW1iZXIgb2YgYml0cyB3aXRoaW4gdGhlIHdvcmQuCisJCSAqLworCQl3Yml0bm8gPSBkYml0bm8gJiAoREJXT1JEIC0gMSk7CisJCW5iID0gbWluKHJlbWJpdHMsIERCV09SRCAtIHdiaXRubyk7CisKKwkJLyogY2hlY2sgaWYgb25seSBwYXJ0IG9mIGEgd29yZCBpcyB0byBiZSBhbGxvY2F0ZWQuCisJCSAqLworCQlpZiAobmIgPCBEQldPUkQpIHsKKwkJCS8qIGFsbG9jYXRlIChzZXQgdG8gMSkgdGhlIGFwcHJvcHJpYXRlIGJpdHMgd2l0aGluCisJCQkgKiB0aGlzIGRtYXAgd29yZC4KKwkJCSAqLworCQkJZHAtPndtYXBbd29yZF0gfD0gY3B1X3RvX2xlMzIoT05FUyA8PCAoREJXT1JEIC0gbmIpCisJCQkJCQkgICAgICA+PiB3Yml0bm8pOworCisJCQkvKiB1cGRhdGUgdGhlIGxlYWYgZm9yIHRoaXMgZG1hcCB3b3JkLiBpbiBhZGRpdGlvbgorCQkJICogdG8gc2V0dGluZyB0aGUgbGVhZiB2YWx1ZSB0byB0aGUgYmluYXJ5IGJ1ZGR5IG1heAorCQkJICogb2YgdGhlIHVwZGF0ZWQgZG1hcCB3b3JkLCBkYlNwbGl0KCkgd2lsbCBzcGxpdAorCQkJICogdGhlIGJpbmFyeSBzeXN0ZW0gb2YgdGhlIGxlYXZlcyBpZiBuZWVkIGJlLgorCQkJICovCisJCQlkYlNwbGl0KHRwLCB3b3JkLCBCVURNSU4sCisJCQkJZGJNYXhCdWQoKHU4ICopICYgZHAtPndtYXBbd29yZF0pKTsKKworCQkJd29yZCArPSAxOworCQl9IGVsc2UgeworCQkJLyogb25lIG9yIG1vcmUgZG1hcCB3b3JkcyBhcmUgZnVsbHkgY29udGFpbmVkCisJCQkgKiB3aXRoaW4gdGhlIGJsb2NrIHJhbmdlLiAgZGV0ZXJtaW5lIGhvdyBtYW55CisJCQkgKiB3b3JkcyBhbmQgYWxsb2NhdGUgKHNldCB0byAxKSB0aGUgYml0cyBvZiB0aGVzZQorCQkJICogd29yZHMuCisJCQkgKi8KKwkJCW53b3JkcyA9IHJlbWJpdHMgPj4gTDJEQldPUkQ7CisJCQltZW1zZXQoJmRwLT53bWFwW3dvcmRdLCAoaW50KSBPTkVTLCBud29yZHMgKiA0KTsKKworCQkJLyogZGV0ZXJtaW5lIGhvdyBtYW55IGJpdHMuCisJCQkgKi8KKwkJCW5iID0gbndvcmRzIDw8IEwyREJXT1JEOworCisJCQkvKiBub3cgdXBkYXRlIHRoZSBhcHByb3ByaWF0ZSBsZWF2ZXMgdG8gcmVmbGVjdAorCQkJICogdGhlIGFsbG9jYXRlZCB3b3Jkcy4KKwkJCSAqLworCQkJZm9yICg7IG53b3JkcyA+IDA7IG53b3JkcyAtPSBudykgeworCQkJICAgICAgICBpZiAobGVhZlt3b3JkXSA8IEJVRE1JTikgeworCQkJCQlqZnNfZXJyb3IoYm1wLT5kYl9pcGJtYXAtPmlfc2IsCisJCQkJCQkgICJkYkFsbG9jQml0czogbGVhZiBwYWdlICIKKwkJCQkJCSAgImNvcnJ1cHQiKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogZGV0ZXJtaW5lIHdoYXQgdGhlIGxlYWYgdmFsdWUgc2hvdWxkIGJlCisJCQkJICogdXBkYXRlZCB0byBhcyB0aGUgbWluaW11bSBvZiB0aGUgbDIgbnVtYmVyCisJCQkJICogb2YgYml0cyBiZWluZyBhbGxvY2F0ZWQgYW5kIHRoZSBsMiBudW1iZXIKKwkJCQkgKiBvZiBiaXRzIGN1cnJlbnRseSBkZXNjcmliZWQgYnkgdGhpcyBsZWFmLgorCQkJCSAqLworCQkJCXNpemUgPSBtaW4oKGludClsZWFmW3dvcmRdLCBOTFNUT0wyQlNaKG53b3JkcykpOworCisJCQkJLyogdXBkYXRlIHRoZSBsZWFmIHRvIHJlZmxlY3QgdGhlIGFsbG9jYXRpb24uCisJCQkJICogaW4gYWRkaXRpb24gdG8gc2V0dGluZyB0aGUgbGVhZiB2YWx1ZSB0bworCQkJCSAqIE5PRlJFRSwgZGJTcGxpdCgpIHdpbGwgc3BsaXQgdGhlIGJpbmFyeQorCQkJCSAqIHN5c3RlbSBvZiB0aGUgbGVhdmVzIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQKKwkJCQkgKiBhbGxvY2F0aW9uIChzaXplKS4KKwkJCQkgKi8KKwkJCQlkYlNwbGl0KHRwLCB3b3JkLCBzaXplLCBOT0ZSRUUpOworCisJCQkJLyogZ2V0IHRoZSBudW1iZXIgb2YgZG1hcCB3b3JkcyBoYW5kbGVkICovCisJCQkJbncgPSBCVURTSVpFKHNpemUsIEJVRE1JTik7CisJCQkJd29yZCArPSBudzsKKwkJCX0KKwkJfQorCX0KKworCS8qIHVwZGF0ZSB0aGUgZnJlZSBjb3VudCBmb3IgdGhpcyBkbWFwICovCisJZHAtPm5mcmVlID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoZHAtPm5mcmVlKSAtIG5ibG9ja3MpOworCisJQk1BUF9MT0NLKGJtcCk7CisKKwkvKiBpZiB0aGlzIGFsbG9jYXRpb24gZ3JvdXAgaXMgY29tcGxldGVseSBmcmVlLAorCSAqIHVwZGF0ZSB0aGUgbWF4aW11bSBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciBpZiB0aGlzIGFsbG9jYXRpb24KKwkgKiBncm91cCBpcyB0aGUgbmV3IG1heC4KKwkgKi8KKwlhZ25vID0gYmxrbm8gPj4gYm1wLT5kYl9hZ2wyc2l6ZTsKKwlpZiAoYWdubyA+IGJtcC0+ZGJfbWF4YWcpCisJCWJtcC0+ZGJfbWF4YWcgPSBhZ25vOworCisJLyogdXBkYXRlIHRoZSBmcmVlIGNvdW50IGZvciB0aGUgYWxsb2NhdGlvbiBncm91cCBhbmQgbWFwICovCisJYm1wLT5kYl9hZ2ZyZWVbYWdub10gLT0gbmJsb2NrczsKKwlibXAtPmRiX25mcmVlIC09IG5ibG9ja3M7CisKKwlCTUFQX1VOTE9DSyhibXApOworfQorCisKKy8qCisgKiBOQU1FOglkYkZyZWVCaXRzKCkKKyAqCisgKiBGVU5DVElPTjogICAgZnJlZSBhIHNwZWNpZmllZCBibG9jayByYW5nZSBmcm9tIGEgZG1hcC4KKyAqCisgKgkJdGhpcyByb3V0aW5lIHVwZGF0ZXMgdGhlIGRtYXAgdG8gcmVmbGVjdCB0aGUgd29ya2luZworICoJCXN0YXRlIGFsbG9jYXRpb24gb2YgdGhlIHNwZWNpZmllZCBibG9jayByYW5nZS4gaXQgZGlyZWN0bHkKKyAqCQl1cGRhdGVzIHRoZSBiaXRzIG9mIHRoZSB3b3JraW5nIG1hcCBhbmQgY2F1c2VzIHRoZSBhZGp1c3RtZW50CisgKgkJb2YgdGhlIGJpbmFyeSBidWRkeSBzeXN0ZW0gZGVzY3JpYmVkIGJ5IHRoZSBkbWFwJ3MgZG10cmVlCisgKgkJbGVhdmVzIHRvIHJlZmxlY3QgdGhlIGJpdHMgZnJlZWQuICBpdCBhbHNvIGNhdXNlcyB0aGUgZG1hcCdzCisgKgkJZG10cmVlLCBhcyBhIHdob2xlLCB0byByZWZsZWN0IHRoZSBkZWFsbG9jYXRlZCByYW5nZS4KKyAqCisgKiBQQVJBTUVURVJTOgorICogICAgICBibXAJLSAgcG9pbnRlciB0byBibWFwIGRlc2NyaXB0b3IKKyAqICAgICAgZHAJLSAgcG9pbnRlciB0byBkbWFwIHRvIGZyZWUgYml0cyBmcm9tLgorICogICAgICBibGtubwktICBzdGFydGluZyBibG9jayBudW1iZXIgb2YgdGhlIGJpdHMgdG8gYmUgZnJlZWQuCisgKiAgICAgIG5ibG9ja3MJLSAgbnVtYmVyIG9mIGJpdHMgdG8gYmUgZnJlZWQuCisgKgorICogUkVUVVJOIFZBTFVFUzogbm9uZQorICoKKyAqIHNlcmlhbGl6YXRpb246IElSRUFEX0xPQ0soaXBibWFwKSBvciBJV1JJVEVfTE9DSyhpcGJtYXApIGhlbGQgb24gZW50cnkvZXhpdDsKKyAqLworc3RhdGljIHZvaWQgZGJGcmVlQml0cyhzdHJ1Y3QgYm1hcCAqIGJtcCwgc3RydWN0IGRtYXAgKiBkcCwgczY0IGJsa25vLAorCQkgICAgICAgaW50IG5ibG9ja3MpCit7CisJaW50IGRiaXRubywgd29yZCwgcmVtYml0cywgbmIsIG53b3Jkcywgd2JpdG5vLCBudywgYWdubzsKKwlkbXRyZWVfdCAqdHAgPSAoZG10cmVlX3QgKikgJiBkcC0+dHJlZTsKKwlpbnQgc2l6ZTsKKworCS8qIGRldGVybWluZSB0aGUgYml0IG51bWJlciBhbmQgd29yZCB3aXRoaW4gdGhlIGRtYXAgb2YgdGhlCisJICogc3RhcnRpbmcgYmxvY2suCisJICovCisJZGJpdG5vID0gYmxrbm8gJiAoQlBFUkRNQVAgLSAxKTsKKwl3b3JkID0gZGJpdG5vID4+IEwyREJXT1JEOworCisJLyogYmxvY2sgcmFuZ2UgYmV0dGVyIGJlIHdpdGhpbiB0aGUgZG1hcC4KKwkgKi8KKwlhc3NlcnQoZGJpdG5vICsgbmJsb2NrcyA8PSBCUEVSRE1BUCk7CisKKwkvKiBmcmVlIHRoZSBiaXRzIG9mIHRoZSBkbWFwcyB3b3JkcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBibG9jayByYW5nZS4KKwkgKiBub3QgYWxsIGJpdHMgb2YgdGhlIGZpcnN0IGFuZCBsYXN0IHdvcmRzIG1heSBiZSBjb250YWluZWQgd2l0aGluCisJICogdGhlIGJsb2NrIHJhbmdlLiAgaWYgdGhpcyBpcyB0aGUgY2FzZSwgd2UnbGwgd29yayBhZ2FpbnN0IHRob3NlCisJICogd29yZHMgKGkuZS4gcGFydGlhbCBmaXJzdCBhbmQvb3IgbGFzdCkgb24gYW4gaW5kaXZpZHVhbCBiYXNpcworCSAqIChhIHNpbmdsZSBwYXNzKSwgZnJlZWluZyB0aGUgYml0cyBvZiBpbnRlcmVzdCBieSBoYW5kIGFuZCB1cGRhdGluZworCSAqIHRoZSBsZWFmIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRtYXAgd29yZC4gYSBzaW5nbGUgcGFzcyB3aWxsIGJlIHVzZWQKKwkgKiBmb3IgYWxsIGRtYXAgd29yZHMgZnVsbHkgY29udGFpbmVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLiAgCisJICogd2l0aGluIHRoaXMgcGFzcywgdGhlIGJpdHMgb2YgYWxsIGZ1bGx5IGNvbnRhaW5lZCBkbWFwIHdvcmRzIHdpbGwKKwkgKiBiZSBtYXJrZWQgYXMgZnJlZSBpbiBhIHNpbmdsZSBzaG90IGFuZCB0aGUgbGVhdmVzIHdpbGwgYmUgdXBkYXRlZC4gYQorCSAqIHNpbmdsZSBsZWFmIG1heSBkZXNjcmliZSB0aGUgZnJlZSBzcGFjZSBvZiBtdWx0aXBsZSBkbWFwIHdvcmRzLAorCSAqIHNvIHdlIG1heSB1cGRhdGUgb25seSBhIHN1YnNldCBvZiB0aGUgYWN0dWFsIGxlYXZlcyBjb3JyZXNwb25kaW5nCisJICogdG8gdGhlIGRtYXAgd29yZHMgb2YgdGhlIGJsb2NrIHJhbmdlLgorCSAqCisJICogZGJKb2luKCkgaXMgdXNlZCB0byB1cGRhdGUgbGVhZiB2YWx1ZXMgYW5kIHdpbGwgam9pbiB0aGUgYmluYXJ5CisJICogYnVkZHkgc3lzdGVtIG9mIHRoZSBsZWF2ZXMgaWYgdGhlIG5ldyBsZWFmIHZhbHVlcyBpbmRpY2F0ZSB0aGlzCisJICogc2hvdWxkIGJlIGRvbmUuCisJICovCisJZm9yIChyZW1iaXRzID0gbmJsb2NrczsgcmVtYml0cyA+IDA7IHJlbWJpdHMgLT0gbmIsIGRiaXRubyArPSBuYikgeworCQkvKiBkZXRlcm1pbmUgdGhlIGJpdCBudW1iZXIgd2l0aGluIHRoZSB3b3JkIGFuZAorCQkgKiB0aGUgbnVtYmVyIG9mIGJpdHMgd2l0aGluIHRoZSB3b3JkLgorCQkgKi8KKwkJd2JpdG5vID0gZGJpdG5vICYgKERCV09SRCAtIDEpOworCQluYiA9IG1pbihyZW1iaXRzLCBEQldPUkQgLSB3Yml0bm8pOworCisJCS8qIGNoZWNrIGlmIG9ubHkgcGFydCBvZiBhIHdvcmQgaXMgdG8gYmUgZnJlZWQuCisJCSAqLworCQlpZiAobmIgPCBEQldPUkQpIHsKKwkJCS8qIGZyZWUgKHplcm8pIHRoZSBhcHByb3ByaWF0ZSBiaXRzIHdpdGhpbiB0aGlzCisJCQkgKiBkbWFwIHdvcmQuIAorCQkJICovCisJCQlkcC0+d21hcFt3b3JkXSAmPQorCQkJICAgIGNwdV90b19sZTMyKH4oT05FUyA8PCAoREJXT1JEIC0gbmIpCisJCQkJCSAgPj4gd2JpdG5vKSk7CisKKwkJCS8qIHVwZGF0ZSB0aGUgbGVhZiBmb3IgdGhpcyBkbWFwIHdvcmQuCisJCQkgKi8KKwkJCWRiSm9pbih0cCwgd29yZCwKKwkJCSAgICAgICBkYk1heEJ1ZCgodTggKikgJiBkcC0+d21hcFt3b3JkXSkpOworCisJCQl3b3JkICs9IDE7CisJCX0gZWxzZSB7CisJCQkvKiBvbmUgb3IgbW9yZSBkbWFwIHdvcmRzIGFyZSBmdWxseSBjb250YWluZWQKKwkJCSAqIHdpdGhpbiB0aGUgYmxvY2sgcmFuZ2UuICBkZXRlcm1pbmUgaG93IG1hbnkKKwkJCSAqIHdvcmRzIGFuZCBmcmVlICh6ZXJvKSB0aGUgYml0cyBvZiB0aGVzZSB3b3Jkcy4KKwkJCSAqLworCQkJbndvcmRzID0gcmVtYml0cyA+PiBMMkRCV09SRDsKKwkJCW1lbXNldCgmZHAtPndtYXBbd29yZF0sIDAsIG53b3JkcyAqIDQpOworCisJCQkvKiBkZXRlcm1pbmUgaG93IG1hbnkgYml0cy4KKwkJCSAqLworCQkJbmIgPSBud29yZHMgPDwgTDJEQldPUkQ7CisKKwkJCS8qIG5vdyB1cGRhdGUgdGhlIGFwcHJvcHJpYXRlIGxlYXZlcyB0byByZWZsZWN0CisJCQkgKiB0aGUgZnJlZWQgd29yZHMuCisJCQkgKi8KKwkJCWZvciAoOyBud29yZHMgPiAwOyBud29yZHMgLT0gbncpIHsKKwkJCQkvKiBkZXRlcm1pbmUgd2hhdCB0aGUgbGVhZiB2YWx1ZSBzaG91bGQgYmUKKwkJCQkgKiB1cGRhdGVkIHRvIGFzIHRoZSBtaW5pbXVtIG9mIHRoZSBsMiBudW1iZXIKKwkJCQkgKiBvZiBiaXRzIGJlaW5nIGZyZWVkIGFuZCB0aGUgbDIgKG1heCkgbnVtYmVyCisJCQkJICogb2YgYml0cyB0aGF0IGNhbiBiZSBkZXNjcmliZWQgYnkgdGhpcyBsZWFmLgorCQkJCSAqLworCQkJCXNpemUgPQorCQkJCSAgICBtaW4oTElUT0wyQlNaCisJCQkJCSh3b3JkLCBMMkxQRVJETUFQLCBCVURNSU4pLAorCQkJCQlOTFNUT0wyQlNaKG53b3JkcykpOworCisJCQkJLyogdXBkYXRlIHRoZSBsZWFmLgorCQkJCSAqLworCQkJCWRiSm9pbih0cCwgd29yZCwgc2l6ZSk7CisKKwkJCQkvKiBnZXQgdGhlIG51bWJlciBvZiBkbWFwIHdvcmRzIGhhbmRsZWQuCisJCQkJICovCisJCQkJbncgPSBCVURTSVpFKHNpemUsIEJVRE1JTik7CisJCQkJd29yZCArPSBudzsKKwkJCX0KKwkJfQorCX0KKworCS8qIHVwZGF0ZSB0aGUgZnJlZSBjb3VudCBmb3IgdGhpcyBkbWFwLgorCSAqLworCWRwLT5uZnJlZSA9IGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KGRwLT5uZnJlZSkgKyBuYmxvY2tzKTsKKworCUJNQVBfTE9DSyhibXApOworCisJLyogdXBkYXRlIHRoZSBmcmVlIGNvdW50IGZvciB0aGUgYWxsb2NhdGlvbiBncm91cCBhbmQgCisJICogbWFwLgorCSAqLworCWFnbm8gPSBibGtubyA+PiBibXAtPmRiX2FnbDJzaXplOworCWJtcC0+ZGJfbmZyZWUgKz0gbmJsb2NrczsKKwlibXAtPmRiX2FnZnJlZVthZ25vXSArPSBuYmxvY2tzOworCisJLyogY2hlY2sgaWYgdGhpcyBhbGxvY2F0aW9uIGdyb3VwIGlzIG5vdCBjb21wbGV0ZWx5IGZyZWUgYW5kCisJICogaWYgaXQgaXMgY3VycmVudGx5IHRoZSBtYXhpbXVtIChyaWdodG1vc3QpIGFsbG9jYXRpb24gZ3JvdXAuCisJICogaWYgc28sIGVzdGFibGlzaCB0aGUgbmV3IG1heGltdW0gYWxsb2NhdGlvbiBncm91cCBudW1iZXIgYnkKKwkgKiBzZWFyY2hpbmcgbGVmdCBmb3IgdGhlIGZpcnN0IGFsbG9jYXRpb24gZ3JvdXAgd2l0aCBhbGxvY2F0aW9uLgorCSAqLworCWlmICgoYm1wLT5kYl9hZ2ZyZWVbYWdub10gPT0gYm1wLT5kYl9hZ3NpemUgJiYgYWdubyA9PSBibXAtPmRiX21heGFnKSB8fAorCSAgICAoYWdubyA9PSBibXAtPmRiX251bWFnIC0gMSAmJgorCSAgICAgYm1wLT5kYl9hZ2ZyZWVbYWdub10gPT0gKGJtcC0+IGRiX21hcHNpemUgJiAoQlBFUkRNQVAgLSAxKSkpKSB7CisJCXdoaWxlIChibXAtPmRiX21heGFnID4gMCkgeworCQkJYm1wLT5kYl9tYXhhZyAtPSAxOworCQkJaWYgKGJtcC0+ZGJfYWdmcmVlW2JtcC0+ZGJfbWF4YWddICE9CisJCQkgICAgYm1wLT5kYl9hZ3NpemUpCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiByZS1lc3RhYmxpc2ggdGhlIGFsbG9jYXRpb24gZ3JvdXAgcHJlZmVyZW5jZSBpZiB0aGUKKwkJICogY3VycmVudCBwcmVmZXJlbmNlIGlzIHJpZ2h0IG9mIHRoZSBtYXhpbXVtIGFsbG9jYXRpb24KKwkJICogZ3JvdXAuCisJCSAqLworCQlpZiAoYm1wLT5kYl9hZ3ByZWYgPiBibXAtPmRiX21heGFnKQorCQkJYm1wLT5kYl9hZ3ByZWYgPSBibXAtPmRiX21heGFnOworCX0KKworCUJNQVBfVU5MT0NLKGJtcCk7Cit9CisKKworLyoKKyAqIE5BTUU6CWRiQWRqQ3RsKCkKKyAqCisgKiBGVU5DVElPTjoJYWRqdXN0IGEgZG1hcCBjb250cm9sIHBhZ2UgYXQgYSBzcGVjaWZpZWQgbGV2ZWwgdG8gcmVmbGVjdAorICoJCXRoZSBjaGFuZ2UgaW4gYSBsb3dlciBsZXZlbCBkbWFwIG9yIGRtYXAgY29udHJvbCBwYWdlJ3MKKyAqCQltYXhpbXVtIHN0cmluZyBvZiBmcmVlIGJsb2NrcyAoaS5lLiBhIGNoYW5nZSBpbiB0aGUgcm9vdAorICoJCW9mIHRoZSBsb3dlciBsZXZlbCBvYmplY3QncyBkbXRyZWUpIGR1ZSB0byB0aGUgYWxsb2NhdGlvbgorICoJCW9yIGRlYWxsb2NhdGlvbiBvZiBhIHJhbmdlIG9mIGJsb2NrcyB3aXRoIGEgc2luZ2xlIGRtYXAuCisgKgorICoJCW9uIGVudHJ5LCB0aGlzIHJvdXRpbmUgaXMgcHJvdmlkZWQgd2l0aCB0aGUgbmV3IHZhbHVlIG9mCisgKgkJdGhlIGxvd2VyIGxldmVsIGRtYXAgb3IgZG1hcCBjb250cm9sIHBhZ2Ugcm9vdCBhbmQgdGhlCisgKgkJc3RhcnRpbmcgYmxvY2sgbnVtYmVyIG9mIHRoZSBibG9jayByYW5nZSB3aG9zZSBhbGxvY2F0aW9uCisgKgkJb3IgZGVhbGxvY2F0aW9uIHJlc3VsdGVkIGluIHRoZSByb290IGNoYW5nZS4gIHRoaXMgcmFuZ2UKKyAqCQlpcyByZXNwcmVzZW50ZWQgYnkgYSBzaW5nbGUgbGVhZiBvZiB0aGUgY3VycmVudCBkbWFwY3RsCisgKgkJYW5kIHRoZSBsZWFmIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoaXMgdmFsdWUsIHBvc3NpYmx5CisgKgkJY2F1c2luZyBhIGJpbmFyeSBidWRkeSBzeXN0ZW0gd2l0aGluIHRoZSBsZWF2ZXMgdG8gYmUgCisgKgkJc3BsaXQgb3Igam9pbmVkLiAgdGhlIHVwZGF0ZSBtYXkgYWxzbyBjYXVzZSB0aGUgZG1hcGN0bCdzCisgKgkJZG10cmVlIHRvIGJlIHVwZGF0ZWQuCisgKgorICoJCWlmIHRoZSBhZGp1c3RtZW50IG9mIHRoZSBkbWFwIGNvbnRyb2wgcGFnZSwgaXRzZWxmLCBjYXVzZXMgaXRzCisgKgkJcm9vdCB0byBjaGFuZ2UsIHRoaXMgY2hhbmdlIHdpbGwgYmUgYnViYmxlZCB1cCB0byB0aGUgbmV4dCBkbWFwCisgKgkJY29udHJvbCBsZXZlbCBieSBhIHJlY3Vyc2l2ZSBjYWxsIHRvIHRoaXMgcm91dGluZSwgc3BlY2lmeWluZworICoJCXRoZSBuZXcgcm9vdCB2YWx1ZSBhbmQgdGhlIG5leHQgZG1hcCBjb250cm9sIHBhZ2UgbGV2ZWwgdG8KKyAqCQliZSBhZGp1c3RlZC4KKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGJtcAktICBwb2ludGVyIHRvIGJtYXAgZGVzY3JpcHRvcgorICogICAgICBibGtubwktICB0aGUgZmlyc3QgYmxvY2sgb2YgYSBibG9jayByYW5nZSB3aXRoaW4gYSBkbWFwLiAgaXQgaXMKKyAqCQkgICB0aGUgYWxsb2NhdGlvbiBvciBkZWFsbG9jYXRpb24gb2YgdGhpcyBibG9jayByYW5nZSB0aGF0CisgKgkJICAgcmVxdWlyZXMgdGhlIGRtYXAgY29udHJvbCBwYWdlIHRvIGJlIGFkanVzdGVkLgorICogICAgICBuZXd2YWwJLSAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgbG93ZXIgbGV2ZWwgZG1hcCBvciBkbWFwIGNvbnRyb2wKKyAqCQkgICBwYWdlIHJvb3QuCisgKiAgICAgIGFsbG9jCS0gIFRSVUUgaWYgYWRqdXN0bWVudCBpcyBkdWUgdG8gYW4gYWxsb2NhdGlvbi4KKyAqICAgICAgbGV2ZWwJLSAgY3VycmVudCBsZXZlbCBvZiBkbWFwIGNvbnRyb2wgcGFnZSAoaS5lLiBMMCwgTDEsIEwyKSB0bworICoJCSAgIGJlIGFkanVzdGVkLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAJLSBzdWNjZXNzCisgKiAgICAgIC1FSU8JLSBpL28gZXJyb3IKKyAqCisgKiBzZXJpYWxpemF0aW9uOiBJUkVBRF9MT0NLKGlwYm1hcCkgb3IgSVdSSVRFX0xPQ0soaXBibWFwKSBoZWxkIG9uIGVudHJ5L2V4aXQ7CisgKi8KK3N0YXRpYyBpbnQKK2RiQWRqQ3RsKHN0cnVjdCBibWFwICogYm1wLCBzNjQgYmxrbm8sIGludCBuZXd2YWwsIGludCBhbGxvYywgaW50IGxldmVsKQoreworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJczggb2xkcm9vdDsKKwlpbnQgb2xkdmFsOworCXM2NCBsYmxrbm87CisJc3RydWN0IGRtYXBjdGwgKmRjcDsKKwlpbnQgcmMsIGxlYWZubywgdGk7CisKKwkvKiBnZXQgdGhlIGJ1ZmZlciBmb3IgdGhlIGRtYXAgY29udHJvbCBwYWdlIGZvciB0aGUgc3BlY2lmaWVkCisJICogYmxvY2sgbnVtYmVyIGFuZCBjb250cm9sIHBhZ2UgbGV2ZWwuCisJICovCisJbGJsa25vID0gQkxLVE9DVEwoYmxrbm8sIGJtcC0+ZGJfbDJuYnBlcnBhZ2UsIGxldmVsKTsKKwltcCA9IHJlYWRfbWV0YXBhZ2UoYm1wLT5kYl9pcGJtYXAsIGxibGtubywgUFNJWkUsIDApOworCWlmIChtcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKwlkY3AgPSAoc3RydWN0IGRtYXBjdGwgKikgbXAtPmRhdGE7CisKKwlpZiAoZGNwLT5sZWFmaWR4ICE9IGNwdV90b19sZTMyKENUTExFQUZJTkQpKSB7CisJCWpmc19lcnJvcihibXAtPmRiX2lwYm1hcC0+aV9zYiwKKwkJCSAgImRiQWRqQ3RsOiBDb3JydXB0IGRtYXBjdGwgcGFnZSIpOworCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogZGV0ZXJtaW5lIHRoZSBsZWFmIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBibG9jayBhbmQKKwkgKiB0aGUgaW5kZXggd2l0aGluIHRoZSBkbWFwIGNvbnRyb2wgdHJlZS4KKwkgKi8KKwlsZWFmbm8gPSBCTEtUT0NUTExFQUYoYmxrbm8sIGRjcC0+YnVkbWluKTsKKwl0aSA9IGxlYWZubyArIGxlMzJfdG9fY3B1KGRjcC0+bGVhZmlkeCk7CisKKwkvKiBzYXZlIHRoZSBjdXJyZW50IGxlYWYgdmFsdWUgYW5kIHRoZSBjdXJyZW50IHJvb3QgbGV2ZWwgKGkuZS4KKwkgKiBtYXhpbXVtIGwyIGZyZWUgc3RyaW5nIGRlc2NyaWJlZCBieSB0aGlzIGRtYXBjdGwpLgorCSAqLworCW9sZHZhbCA9IGRjcC0+c3RyZWVbdGldOworCW9sZHJvb3QgPSBkY3AtPnN0cmVlW1JPT1RdOworCisJLyogY2hlY2sgaWYgdGhpcyBpcyBhIGNvbnRyb2wgcGFnZSB1cGRhdGUgZm9yIGFuIGFsbG9jYXRpb24uCisJICogaWYgc28sIHVwZGF0ZSB0aGUgbGVhZiB0byByZWZsZWN0IHRoZSBuZXcgbGVhZiB2YWx1ZSB1c2luZworCSAqIGRiU3BsaXQoKTsgb3RoZXJ3aXNlIChkZWFsbG9jYXRpb24pLCB1c2UgZGJKb2luKCkgdG8gdWRwYXRlCisJICogdGhlIGxlYWYgd2l0aCB0aGUgbmV3IHZhbHVlLiAgaW4gYWRkaXRpb24gdG8gdXBkYXRpbmcgdGhlCisJICogbGVhZiwgZGJTcGxpdCgpIHdpbGwgYWxzbyBzcGxpdCB0aGUgYmluYXJ5IGJ1ZGR5IHN5c3RlbSBvZgorCSAqIHRoZSBsZWF2ZXMsIGlmIHJlcXVpcmVkLCBhbmQgYnViYmxlIG5ldyB2YWx1ZXMgd2l0aGluIHRoZQorCSAqIGRtYXBjdGwgdHJlZSwgaWYgcmVxdWlyZWQuICBzaW1pbGFybHksIGRiSm9pbigpIHdpbGwgam9pbgorCSAqIHRoZSBiaW5hcnkgYnVkZHkgc3lzdGVtIG9mIGxlYXZlcyBhbmQgYnViYmxlIG5ldyB2YWx1ZXMgdXAKKwkgKiB0aGUgZG1hcGN0bCB0cmVlIGFzIHJlcXVpcmVkIGJ5IHRoZSBuZXcgbGVhZiB2YWx1ZS4KKwkgKi8KKwlpZiAoYWxsb2MpIHsKKwkJLyogY2hlY2sgaWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBiaW5hcnkgYnVkZHkKKwkJICogc3lzdGVtLiAgdGhpcyBoYXBwZW5zIHdoZW4gd2UgYXJlIHBlcmZvcm1pbmcgdGhlCisJCSAqIGZpcnN0IGFsbG9jYXRpb24gb3V0IG9mIGFuIGFsbG9jYXRpb24gZ3JvdXAgdGhhdAorCQkgKiBpcyBwYXJ0IChub3QgdGhlIGZpcnN0IHBhcnQpIG9mIGEgbGFyZ2VyIGJpbmFyeQorCQkgKiBidWRkeSBzeXN0ZW0uICBpZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSwgYmFjayBzcGxpdAorCQkgKiB0aGUgc3lzdGVtIHByaW9yIHRvIGNhbGxpbmcgZGJTcGxpdCgpIHdoaWNoIGFzc3VtZXMKKwkJICogdGhhdCBpdCBpcyBhdCB0aGUgZnJvbnQgb2YgYSBiaW5hcnkgYnVkZHkgc3lzdGVtLgorCQkgKi8KKwkJaWYgKG9sZHZhbCA9PSBOT0ZSRUUpIHsKKwkJCWRiQmFja1NwbGl0KChkbXRyZWVfdCAqKSBkY3AsIGxlYWZubyk7CisJCQlvbGR2YWwgPSBkY3AtPnN0cmVlW3RpXTsKKwkJfQorCQlkYlNwbGl0KChkbXRyZWVfdCAqKSBkY3AsIGxlYWZubywgZGNwLT5idWRtaW4sIG5ld3ZhbCk7CisJfSBlbHNlIHsKKwkJZGJKb2luKChkbXRyZWVfdCAqKSBkY3AsIGxlYWZubywgbmV3dmFsKTsKKwl9CisKKwkvKiBjaGVjayBpZiB0aGUgcm9vdCBvZiB0aGUgY3VycmVudCBkbWFwIGNvbnRyb2wgcGFnZSBjaGFuZ2VkIGR1ZQorCSAqIHRvIHRoZSB1cGRhdGUgYW5kIGlmIHRoZSBjdXJyZW50IGRtYXAgY29udHJvbCBwYWdlIGlzIG5vdCBhdAorCSAqIHRoZSBjdXJyZW50IHRvcCBsZXZlbCAoaS5lLiBMMCwgTDEsIEwyKSBvZiB0aGUgbWFwLiAgaWYgc28gKGkuZS4KKwkgKiByb290IGNoYW5nZWQgYW5kIHRoaXMgaXMgbm90IHRoZSB0b3AgbGV2ZWwpLCBjYWxsIHRoaXMgcm91dGluZQorCSAqIGFnYWluIChyZWN1cnNpb24pIGZvciB0aGUgbmV4dCBoaWdoZXIgbGV2ZWwgb2YgdGhlIG1hcHBpbmcgdG8KKwkgKiByZWZsZWN0IHRoZSBjaGFuZ2UgaW4gcm9vdCBmb3IgdGhlIGN1cnJlbnQgZG1hcCBjb250cm9sIHBhZ2UuCisJICovCisJaWYgKGRjcC0+c3RyZWVbUk9PVF0gIT0gb2xkcm9vdCkgeworCQkvKiBhcmUgd2UgYmVsb3cgdGhlIHRvcCBsZXZlbCBvZiB0aGUgbWFwLiAgaWYgc28sCisJCSAqIGJ1YmJsZSB0aGUgcm9vdCB1cCB0byB0aGUgbmV4dCBoaWdoZXIgbGV2ZWwuCisJCSAqLworCQlpZiAobGV2ZWwgPCBibXAtPmRiX21heGxldmVsKSB7CisJCQkvKiBidWJibGUgdXAgdGhlIG5ldyByb290IG9mIHRoaXMgZG1hcCBjb250cm9sIHBhZ2UgdG8KKwkJCSAqIHRoZSBuZXh0IGxldmVsLgorCQkJICovCisJCQlpZiAoKHJjID0KKwkJCSAgICAgZGJBZGpDdGwoYm1wLCBibGtubywgZGNwLT5zdHJlZVtST09UXSwgYWxsb2MsCisJCQkJICAgICAgbGV2ZWwgKyAxKSkpIHsKKwkJCQkvKiBzb21ldGhpbmcgd2VudCB3cm9uZyBpbiBidWJibGluZyB1cCB0aGUgbmV3CisJCQkJICogcm9vdCB2YWx1ZSwgc28gYmFja291dCB0aGUgY2hhbmdlcyB0byB0aGUKKwkJCQkgKiBjdXJyZW50IGRtYXAgY29udHJvbCBwYWdlLgorCQkJCSAqLworCQkJCWlmIChhbGxvYykgeworCQkJCQlkYkpvaW4oKGRtdHJlZV90ICopIGRjcCwgbGVhZm5vLAorCQkJCQkgICAgICAgb2xkdmFsKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiB0aGUgZGJKb2luKCkgYWJvdmUgbWlnaHQgaGF2ZQorCQkJCQkgKiBjYXVzZWQgYSBsYXJnZXIgYmluYXJ5IGJ1ZGR5IHN5c3RlbQorCQkJCQkgKiB0byBmb3JtIGFuZCB3ZSBtYXkgbm93IGJlIGluIHRoZQorCQkJCQkgKiBtaWRkbGUgb2YgaXQuICBpZiB0aGlzIGlzIHRoZSBjYXNlLAorCQkJCQkgKiBiYWNrIHNwbGl0IHRoZSBidWRkaWVzLgorCQkJCQkgKi8KKwkJCQkJaWYgKGRjcC0+c3RyZWVbdGldID09IE5PRlJFRSkKKwkJCQkJCWRiQmFja1NwbGl0KChkbXRyZWVfdCAqKQorCQkJCQkJCSAgICBkY3AsIGxlYWZubyk7CisJCQkJCWRiU3BsaXQoKGRtdHJlZV90ICopIGRjcCwgbGVhZm5vLAorCQkJCQkJZGNwLT5idWRtaW4sIG9sZHZhbCk7CisJCQkJfQorCisJCQkJLyogcmVsZWFzZSB0aGUgYnVmZmVyIGFuZCByZXR1cm4gdGhlIGVycm9yLgorCQkJCSAqLworCQkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQkJCXJldHVybiAocmMpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogd2UncmUgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgbWFwLiB1cGRhdGUKKwkJCSAqIHRoZSBibWFwIGNvbnRyb2wgcGFnZSB0byByZWZsZWN0IHRoZSBzaXplCisJCQkgKiBvZiB0aGUgbWF4aW11bSBmcmVlIGJ1ZGR5IHN5c3RlbS4KKwkJCSAqLworCQkJYXNzZXJ0KGxldmVsID09IGJtcC0+ZGJfbWF4bGV2ZWwpOworCQkJaWYgKGJtcC0+ZGJfbWF4ZnJlZWJ1ZCAhPSBvbGRyb290KSB7CisJCQkJamZzX2Vycm9yKGJtcC0+ZGJfaXBibWFwLT5pX3NiLAorCQkJCQkgICJkYkFkakN0bDogdGhlIG1heGltdW0gZnJlZSBidWRkeSBpcyAiCisJCQkJCSAgIm5vdCB0aGUgb2xkIHJvb3QiKTsKKwkJCX0KKwkJCWJtcC0+ZGJfbWF4ZnJlZWJ1ZCA9IGRjcC0+c3RyZWVbUk9PVF07CisJCX0KKwl9CisKKwkvKiB3cml0ZSB0aGUgYnVmZmVyLgorCSAqLworCXdyaXRlX21ldGFwYWdlKG1wKTsKKworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqIE5BTUU6CWRiU3BsaXQoKQorICoKKyAqIEZVTkNUSU9OOiAgICB1cGRhdGUgdGhlIGxlYWYgb2YgYSBkbXRyZWUgd2l0aCBhIG5ldyB2YWx1ZSwgc3BsaXR0aW5nCisgKgkJdGhlIGxlYWYgZnJvbSB0aGUgYmluYXJ5IGJ1ZGR5IHN5c3RlbSBvZiB0aGUgZG10cmVlJ3MKKyAqCQlsZWF2ZXMsIGFzIHJlcXVpcmVkLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIHRwCS0gcG9pbnRlciB0byB0aGUgdHJlZSBjb250YWluaW5nIHRoZSBsZWFmLgorICogICAgICBsZWFmbm8JLSB0aGUgbnVtYmVyIG9mIHRoZSBsZWFmIHRvIGJlIHVwZGF0ZWQuCisgKiAgICAgIHNwbGl0c3oJLSB0aGUgc2l6ZSB0aGUgYmluYXJ5IGJ1ZGR5IHN5c3RlbSBzdGFydGluZyBhdCB0aGUgbGVhZgorICoJCSAgbXVzdCBiZSBzcGxpdCB0bywgc3BlY2lmaWVkIGFzIHRoZSBsb2cyIG51bWJlciBvZiBibG9ja3MuCisgKiAgICAgIG5ld3ZhbAktIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBsZWFmLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6IG5vbmUKKyAqCisgKiBzZXJpYWxpemF0aW9uOiBJUkVBRF9MT0NLKGlwYm1hcCkgb3IgSVdSSVRFX0xPQ0soaXBibWFwKSBoZWxkIG9uIGVudHJ5L2V4aXQ7CisgKi8KK3N0YXRpYyB2b2lkIGRiU3BsaXQoZG10cmVlX3QgKiB0cCwgaW50IGxlYWZubywgaW50IHNwbGl0c3osIGludCBuZXd2YWwpCit7CisJaW50IGJ1ZHN6OworCWludCBjdXJzejsKKwlzOCAqbGVhZiA9IHRwLT5kbXRfc3RyZWUgKyBsZTMyX3RvX2NwdSh0cC0+ZG10X2xlYWZpZHgpOworCisJLyogY2hlY2sgaWYgdGhlIGxlYWYgbmVlZHMgdG8gYmUgc3BsaXQuCisJICovCisJaWYgKGxlYWZbbGVhZm5vXSA+IHRwLT5kbXRfYnVkbWluKSB7CisJCS8qIHRoZSBzcGxpdCBvY2N1cnMgYnkgY3V0dGluZyB0aGUgYnVkZHkgc3lzdGVtIGluIGhhbGYKKwkJICogYXQgdGhlIHNwZWNpZmllZCBsZWFmIHVudGlsIHdlIHJlYWNoIHRoZSBzcGVjaWZpZWQKKwkJICogc2l6ZS4gIHBpY2sgdXAgdGhlIHN0YXJ0aW5nIHNwbGl0IHNpemUgKGN1cnJlbnQgc2l6ZQorCQkgKiAtIDEgaW4gbDIpIGFuZCB0aGUgY29ycmVzcG9uZGluZyBidWRkeSBzaXplLgorCQkgKi8KKwkJY3Vyc3ogPSBsZWFmW2xlYWZub10gLSAxOworCQlidWRzeiA9IEJVRFNJWkUoY3Vyc3osIHRwLT5kbXRfYnVkbWluKTsKKworCQkvKiBzcGxpdCB1bnRpbCB3ZSByZWFjaCB0aGUgc3BlY2lmaWVkIHNpemUuCisJCSAqLworCQl3aGlsZSAoY3Vyc3ogPj0gc3BsaXRzeikgeworCQkJLyogdXBkYXRlIHRoZSBidWRkeSdzIGxlYWYgd2l0aCBpdHMgbmV3IHZhbHVlLgorCQkJICovCisJCQlkYkFkalRyZWUodHAsIGxlYWZubyBeIGJ1ZHN6LCBjdXJzeik7CisKKwkJCS8qIG9uIHRvIHRoZSBuZXh0IHNpemUgYW5kIGJ1ZGR5LgorCQkJICovCisJCQljdXJzeiAtPSAxOworCQkJYnVkc3ogPj49IDE7CisJCX0KKwl9CisKKwkvKiBhZGp1c3QgdGhlIGRtYXAgdHJlZSB0byByZWZsZWN0IHRoZSBzcGVjaWZpZWQgbGVhZidzIG5ldyAKKwkgKiB2YWx1ZS4KKwkgKi8KKwlkYkFkalRyZWUodHAsIGxlYWZubywgbmV3dmFsKTsKK30KKworCisvKgorICogTkFNRToJZGJCYWNrU3BsaXQoKQorICoKKyAqIEZVTkNUSU9OOiAgICBiYWNrIHNwbGl0IHRoZSBiaW5hcnkgYnVkZHkgc3lzdGVtIG9mIGRtdHJlZSBsZWF2ZXMKKyAqCQl0aGF0IGhvbGQgYSBzcGVjaWZpZWQgbGVhZiB1bnRpbCB0aGUgc3BlY2lmaWVkIGxlYWYKKyAqCQlzdGFydHMgaXRzIG93biBiaW5hcnkgYnVkZHkgc3lzdGVtLgorICoKKyAqCQl0aGUgYWxsb2NhdG9ycyB0eXBpY2FsbHkgcGVyZm9ybSBhbGxvY2F0aW9ucyBhdCB0aGUgc3RhcnQKKyAqCQlvZiBiaW5hcnkgYnVkZHkgc3lzdGVtcyBhbmQgZGJTcGxpdCgpIGlzIHVzZWQgdG8gYWNjb21wbGlzaAorICoJCWFueSByZXF1aXJlZCBzcGxpdHMuICBpbiBzb21lIGNhc2VzLCBob3dldmVyLCBhbGxvY2F0aW9uCisgKgkJbWF5IG9jY3VyIGluIHRoZSBtaWRkbGUgb2YgYSBiaW5hcnkgc3lzdGVtIGFuZCByZXF1aXJlcyBhCisgKgkJYmFjayBzcGxpdCwgd2l0aCB0aGUgc3BsaXQgcHJvY2VlZGluZyBvdXQgZnJvbSB0aGUgbWlkZGxlIG9mCisgKgkJdGhlIHN5c3RlbSAobGVzcyBlZmZpY2llbnQpIHJhdGhlciB0aGFuIHRoZSBzdGFydCBvZiB0aGUKKyAqCQlzeXN0ZW0gKG1vcmUgZWZmaWNpZW50KS4gIHRoZSBjYXNlcyBpbiB3aGljaCBhIGJhY2sgc3BsaXQKKyAqCQlpcyByZXF1aXJlZCBhcmUgcmFyZSBhbmQgYXJlIGxpbWl0ZWQgdG8gdGhlIGZpcnN0IGFsbG9jYXRpb24KKyAqCQl3aXRoaW4gYW4gYWxsb2NhdGlvbiBncm91cCB3aGljaCBpcyBhIHBhcnQgKG5vdCBmaXJzdCBwYXJ0KQorICoJCW9mIGEgbGFyZ2VyIGJpbmFyeSBidWRkeSBzeXN0ZW0gYW5kIGEgZmV3IGV4Y2VwdGlvbiBjYXNlcworICoJCWluIHdoaWNoIGEgcHJldmlvdXMgam9pbiBvcGVyYXRpb24gbXVzdCBiZSBiYWNrZWQgb3V0LgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIHRwCS0gcG9pbnRlciB0byB0aGUgdHJlZSBjb250YWluaW5nIHRoZSBsZWFmLgorICogICAgICBsZWFmbm8JLSB0aGUgbnVtYmVyIG9mIHRoZSBsZWFmIHRvIGJlIHVwZGF0ZWQuCisgKgorICogUkVUVVJOIFZBTFVFUzogbm9uZQorICoKKyAqIHNlcmlhbGl6YXRpb246IElSRUFEX0xPQ0soaXBibWFwKSBvciBJV1JJVEVfTE9DSyhpcGJtYXApIGhlbGQgb24gZW50cnkvZXhpdDsKKyAqLworc3RhdGljIHZvaWQgZGJCYWNrU3BsaXQoZG10cmVlX3QgKiB0cCwgaW50IGxlYWZubykKK3sKKwlpbnQgYnVkc3osIGJ1ZCwgdywgYnN6LCBzaXplOworCWludCBjdXJzejsKKwlzOCAqbGVhZiA9IHRwLT5kbXRfc3RyZWUgKyBsZTMyX3RvX2NwdSh0cC0+ZG10X2xlYWZpZHgpOworCisJLyogbGVhZiBzaG91bGQgYmUgcGFydCAobm90IGZpcnN0IHBhcnQpIG9mIGEgYmluYXJ5CisJICogYnVkZHkgc3lzdGVtLgorCSAqLworCWFzc2VydChsZWFmW2xlYWZub10gPT0gTk9GUkVFKTsKKworCS8qIHRoZSBiYWNrIHNwbGl0IGlzIGFjY29tcGxpc2hlZCBieSBpdGVyYXRpdmVseSBmaW5kaW5nIHRoZSBsZWFmCisJICogdGhhdCBzdGFydHMgdGhlIGJ1ZGR5IHN5c3RlbSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgbGVhZiBhbmQKKwkgKiBzcGxpdHRpbmcgdGhhdCBzeXN0ZW0gaW4gdHdvLiAgdGhpcyBpdGVyYXRpb24gY29udGludWVzIHVudGlsCisJICogdGhlIHNwZWNpZmllZCBsZWFmIGJlY29tZXMgdGhlIHN0YXJ0IG9mIGEgYnVkZHkgc3lzdGVtLiAKKwkgKgorCSAqIGRldGVybWluZSBtYXhpbXVtIHBvc3NpYmxlIGwyIHNpemUgZm9yIHRoZSBzcGVjaWZpZWQgbGVhZi4KKwkgKi8KKwlzaXplID0KKwkgICAgTElUT0wyQlNaKGxlYWZubywgbGUzMl90b19jcHUodHAtPmRtdF9sMm5sZWFmcyksCisJCSAgICAgIHRwLT5kbXRfYnVkbWluKTsKKworCS8qIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGxlYXZlcyBjb3ZlcmVkIGJ5IHRoaXMgc2l6ZS4gIHRoaXMKKwkgKiBpcyB0aGUgYnVkZHkgc2l6ZSB0aGF0IHdlIHdpbGwgc3RhcnQgd2l0aCBhcyB3ZSBzZWFyY2ggZm9yCisJICogdGhlIGJ1ZGR5IHN5c3RlbSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgbGVhZi4KKwkgKi8KKwlidWRzeiA9IEJVRFNJWkUoc2l6ZSwgdHAtPmRtdF9idWRtaW4pOworCisJLyogYmFjayBzcGxpdC4KKwkgKi8KKwl3aGlsZSAobGVhZltsZWFmbm9dID09IE5PRlJFRSkgeworCQkvKiBmaW5kIHRoZSBsZWZ0bW9zdCBidWRkeSBsZWFmLgorCQkgKi8KKwkJZm9yICh3ID0gbGVhZm5vLCBic3ogPSBidWRzejs7IGJzeiA8PD0gMSwKKwkJICAgICB3ID0gKHcgPCBidWQpID8gdyA6IGJ1ZCkgeworCQkJYXNzZXJ0KGJzeiA8IGxlMzJfdG9fY3B1KHRwLT5kbXRfbmxlYWZzKSk7CisKKwkJCS8qIGRldGVybWluZSB0aGUgYnVkZHkuCisJCQkgKi8KKwkJCWJ1ZCA9IHcgXiBic3o7CisKKwkJCS8qIGNoZWNrIGlmIHRoaXMgYnVkZHkgaXMgdGhlIHN0YXJ0IG9mIHRoZSBzeXN0ZW0uCisJCQkgKi8KKwkJCWlmIChsZWFmW2J1ZF0gIT0gTk9GUkVFKSB7CisJCQkJLyogc3BsaXQgdGhlIGxlYWYgYXQgdGhlIHN0YXJ0IG9mIHRoZQorCQkJCSAqIHN5c3RlbSBpbiB0d28uCisJCQkJICovCisJCQkJY3Vyc3ogPSBsZWFmW2J1ZF0gLSAxOworCQkJCWRiU3BsaXQodHAsIGJ1ZCwgY3Vyc3osIGN1cnN6KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWFzc2VydChsZWFmW2xlYWZub10gPT0gc2l6ZSk7Cit9CisKKworLyoKKyAqIE5BTUU6CWRiSm9pbigpCisgKgorICogRlVOQ1RJT046ICAgIHVwZGF0ZSB0aGUgbGVhZiBvZiBhIGRtdHJlZSB3aXRoIGEgbmV3IHZhbHVlLCBqb2luaW5nCisgKgkJdGhlIGxlYWYgd2l0aCBvdGhlciBsZWF2ZXMgb2YgdGhlIGRtdHJlZSBpbnRvIGEgbXVsdGktbGVhZgorICoJCWJpbmFyeSBidWRkeSBzeXN0ZW0sIGFzIHJlcXVpcmVkLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIHRwCS0gcG9pbnRlciB0byB0aGUgdHJlZSBjb250YWluaW5nIHRoZSBsZWFmLgorICogICAgICBsZWFmbm8JLSB0aGUgbnVtYmVyIG9mIHRoZSBsZWFmIHRvIGJlIHVwZGF0ZWQuCisgKiAgICAgIG5ld3ZhbAktIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBsZWFmLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6IG5vbmUKKyAqLworc3RhdGljIHZvaWQgZGJKb2luKGRtdHJlZV90ICogdHAsIGludCBsZWFmbm8sIGludCBuZXd2YWwpCit7CisJaW50IGJ1ZHN6LCBidWRkeTsKKwlzOCAqbGVhZjsKKworCS8qIGNhbiB0aGUgbmV3IGxlYWYgdmFsdWUgcmVxdWlyZSBhIGpvaW4gd2l0aCBvdGhlciBsZWF2ZXMgPworCSAqLworCWlmIChuZXd2YWwgPj0gdHAtPmRtdF9idWRtaW4pIHsKKwkJLyogcGlja3VwIGEgcG9pbnRlciB0byB0aGUgbGVhdmVzIG9mIHRoZSB0cmVlLgorCQkgKi8KKwkJbGVhZiA9IHRwLT5kbXRfc3RyZWUgKyBsZTMyX3RvX2NwdSh0cC0+ZG10X2xlYWZpZHgpOworCisJCS8qIHRyeSB0byBqb2luIHRoZSBzcGVjaWZpZWQgbGVhZiBpbnRvIGEgbGFyZ2UgYmluYXJ5CisJCSAqIGJ1ZGR5IHN5c3RlbS4gIHRoZSBqb2luIHByb2NlZWRzIGJ5IGF0dGVtcHRpbmcgdG8gam9pbgorCQkgKiB0aGUgc3BlY2lmaWVkIGxlYWZubyB3aXRoIGl0cyBidWRkeSAobGVhZikgYXQgbmV3IHZhbHVlLgorCQkgKiBpZiB0aGUgam9pbiBvY2N1cnMsIHdlIGF0dGVtcHQgdG8gam9pbiB0aGUgbGVmdCBsZWFmCisJCSAqIG9mIHRoZSBqb2luZWQgYnVkZGllcyB3aXRoIGl0cyBidWRkeSBhdCBuZXcgdmFsdWUgKyAxLgorCQkgKiB3ZSBjb250aW51ZSB0byBqb2luIHVudGlsIHdlIGZpbmQgYSBidWRkeSB0aGF0IGNhbm5vdCBiZQorCQkgKiBqb2luZWQgKGRvZXMgbm90IGhhdmUgYSB2YWx1ZSBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUKKwkJICogbGFzdCBqb2luKSBvciB1bnRpbCBhbGwgbGVhdmVzIGhhdmUgYmVlbiBqb2luZWQgaW50byBhCisJCSAqIHNpbmdsZSBzeXN0ZW0uCisJCSAqCisJCSAqIGdldCB0aGUgYnVkZHkgc2l6ZSAobnVtYmVyIG9mIHdvcmRzIGNvdmVyZWQpIG9mCisJCSAqIHRoZSBuZXcgdmFsdWUuCisJCSAqLworCQlidWRzeiA9IEJVRFNJWkUobmV3dmFsLCB0cC0+ZG10X2J1ZG1pbik7CisKKwkJLyogdHJ5IHRvIGpvaW4uCisJCSAqLworCQl3aGlsZSAoYnVkc3ogPCBsZTMyX3RvX2NwdSh0cC0+ZG10X25sZWFmcykpIHsKKwkJCS8qIGdldCB0aGUgYnVkZHkgbGVhZi4KKwkJCSAqLworCQkJYnVkZHkgPSBsZWFmbm8gXiBidWRzejsKKworCQkJLyogaWYgdGhlIGxlYWYncyBuZXcgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIGl0cworCQkJICogYnVkZHkncyB2YWx1ZSwgd2Ugam9pbiBubyBtb3JlLgorCQkJICovCisJCQlpZiAobmV3dmFsID4gbGVhZltidWRkeV0pCisJCQkJYnJlYWs7CisKKwkJCWFzc2VydChuZXd2YWwgPT0gbGVhZltidWRkeV0pOworCisJCQkvKiBjaGVjayB3aGljaCAobGVhZm5vIG9yIGJ1ZGR5KSBpcyB0aGUgbGVmdCBidWRkeS4KKwkJCSAqIHRoZSBsZWZ0IGJ1ZGR5IGdldHMgdG8gY2xhaW0gdGhlIGJsb2NrcyByZXN1bHRpbmcKKwkJCSAqIGZyb20gdGhlIGpvaW4gd2hpbGUgdGhlIHJpZ2h0IGdldHMgdG8gY2xhaW0gbm9uZS4KKwkJCSAqIHRoZSBsZWZ0IGJ1ZGR5IGlzIGFsc28gZWxpZ2FibGUgdG8gcGFydGljaXBhdGUgaW4KKwkJCSAqIGEgam9pbiBhdCB0aGUgbmV4dCBoaWdoZXIgbGV2ZWwgd2hpbGUgdGhlIHJpZ2h0CisJCQkgKiBpcyBub3QuCisJCQkgKgorCQkJICovCisJCQlpZiAobGVhZm5vIDwgYnVkZHkpIHsKKwkJCQkvKiBsZWFmbm8gaXMgdGhlIGxlZnQgYnVkZHkuCisJCQkJICovCisJCQkJZGJBZGpUcmVlKHRwLCBidWRkeSwgTk9GUkVFKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogYnVkZHkgaXMgdGhlIGxlZnQgYnVkZHkgYW5kIGJlY29tZXMKKwkJCQkgKiBsZWFmbm8uCisJCQkJICovCisJCQkJZGJBZGpUcmVlKHRwLCBsZWFmbm8sIE5PRlJFRSk7CisJCQkJbGVhZm5vID0gYnVkZHk7CisJCQl9CisKKwkJCS8qIG9uIHRvIHRyeSB0aGUgbmV4dCBqb2luLgorCQkJICovCisJCQluZXd2YWwgKz0gMTsKKwkJCWJ1ZHN6IDw8PSAxOworCQl9CisJfQorCisJLyogdXBkYXRlIHRoZSBsZWFmIHZhbHVlLgorCSAqLworCWRiQWRqVHJlZSh0cCwgbGVhZm5vLCBuZXd2YWwpOworfQorCisKKy8qCisgKiBOQU1FOglkYkFkalRyZWUoKQorICoKKyAqIEZVTkNUSU9OOiAgICB1cGRhdGUgYSBsZWFmIG9mIGEgZG10cmVlIHdpdGggYSBuZXcgdmFsdWUsIGFkanVzdGluZworICoJCXRoZSBkbXRyZWUsIGFzIHJlcXVpcmVkLCB0byByZWZsZWN0IHRoZSBuZXcgbGVhZiB2YWx1ZS4KKyAqCQl0aGUgY29tYmluYXRpb24gb2YgYW55IGJ1ZGRpZXMgbXVzdCBhbHJlYWR5IGJlIGRvbmUgYmVmb3JlCisgKgkJdGhpcyBpcyBjYWxsZWQuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgdHAJLSBwb2ludGVyIHRvIHRoZSB0cmVlIHRvIGJlIGFkanVzdGVkLgorICogICAgICBsZWFmbm8JLSB0aGUgbnVtYmVyIG9mIHRoZSBsZWFmIHRvIGJlIHVwZGF0ZWQuCisgKiAgICAgIG5ld3ZhbAktIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBsZWFmLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6IG5vbmUKKyAqLworc3RhdGljIHZvaWQgZGJBZGpUcmVlKGRtdHJlZV90ICogdHAsIGludCBsZWFmbm8sIGludCBuZXd2YWwpCit7CisJaW50IGxwLCBwcCwgazsKKwlpbnQgbWF4OworCisJLyogcGljayB1cCB0aGUgaW5kZXggb2YgdGhlIGxlYWYgZm9yIHRoaXMgbGVhZm5vLgorCSAqLworCWxwID0gbGVhZm5vICsgbGUzMl90b19jcHUodHAtPmRtdF9sZWFmaWR4KTsKKworCS8qIGlzIHRoZSBjdXJyZW50IHZhbHVlIHRoZSBzYW1lIGFzIHRoZSBvbGQgdmFsdWUgPyAgaWYgc28sCisJICogdGhlcmUgaXMgbm90aGluZyB0byBkby4KKwkgKi8KKwlpZiAodHAtPmRtdF9zdHJlZVtscF0gPT0gbmV3dmFsKQorCQlyZXR1cm47CisKKwkvKiBzZXQgdGhlIG5ldyB2YWx1ZS4KKwkgKi8KKwl0cC0+ZG10X3N0cmVlW2xwXSA9IG5ld3ZhbDsKKworCS8qIGJ1YmJsZSB0aGUgbmV3IHZhbHVlIHVwIHRoZSB0cmVlIGFzIHJlcXVpcmVkLgorCSAqLworCWZvciAoayA9IDA7IGsgPCBsZTMyX3RvX2NwdSh0cC0+ZG10X2hlaWdodCk7IGsrKykgeworCQkvKiBnZXQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBsZWFmIG9mIHRoZSA0IGxlYWYKKwkJICogZ3JvdXAgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGxlYWYgKGxlYWZubykuCisJCSAqLworCQlscCA9ICgobHAgLSAxKSAmIH4weDAzKSArIDE7CisKKwkJLyogZ2V0IHRoZSBpbmRleCBvZiB0aGUgcGFyZW50IG9mIHRoaXMgNCBsZWFmIGdyb3VwLgorCQkgKi8KKwkJcHAgPSAobHAgLSAxKSA+PiAyOworCisJCS8qIGRldGVybWluZSB0aGUgbWF4aW11bSBvZiB0aGUgNCBsZWF2ZXMuCisJCSAqLworCQltYXggPSBUUkVFTUFYKCZ0cC0+ZG10X3N0cmVlW2xwXSk7CisKKwkJLyogaWYgdGhlIG1heGltdW0gb2YgdGhlIDQgaXMgdGhlIHNhbWUgYXMgdGhlCisJCSAqIHBhcmVudCdzIHZhbHVlLCB3ZSdyZSBkb25lLgorCQkgKi8KKwkJaWYgKHRwLT5kbXRfc3RyZWVbcHBdID09IG1heCkKKwkJCWJyZWFrOworCisJCS8qIHBhcmVudCBnZXRzIG5ldyB2YWx1ZS4KKwkJICovCisJCXRwLT5kbXRfc3RyZWVbcHBdID0gbWF4OworCisJCS8qIHBhcmVudCBiZWNvbWVzIGxlYWYgZm9yIG5leHQgZ28tcm91bmQuCisJCSAqLworCQlscCA9IHBwOworCX0KK30KKworCisvKgorICogTkFNRToJZGJGaW5kTGVhZigpCisgKgorICogRlVOQ1RJT046ICAgIHNlYXJjaCBhIGRtdHJlZV90IGZvciBzdWZmaWNpZW50IGZyZWUgYmxvY2tzLCByZXR1cm5pbmcKKyAqCQl0aGUgaW5kZXggb2YgYSBsZWFmIGRlc2NyaWJpbmcgdGhlIGZyZWUgYmxvY2tzIGlmIAorICoJCXN1ZmZpY2llbnQgZnJlZSBibG9ja3MgYXJlIGZvdW5kLgorICoKKyAqCQl0aGUgc2VhcmNoIHN0YXJ0cyBhdCB0aGUgdG9wIG9mIHRoZSBkbXRyZWVfdCB0cmVlIGFuZAorICoJCXByb2NlZWRzIGRvd24gdGhlIHRyZWUgdG8gdGhlIGxlZnRtb3N0IGxlYWYgd2l0aCBzdWZmaWNpZW50CisgKgkJZnJlZSBzcGFjZS4KKyAqCisgKiBQQVJBTUVURVJTOgorICogICAgICB0cAktIHBvaW50ZXIgdG8gdGhlIHRyZWUgdG8gYmUgc2VhcmNoZWQuCisgKiAgICAgIGwybmIJLSBsb2cyIG51bWJlciBvZiBmcmVlIGJsb2NrcyB0byBzZWFyY2ggZm9yLgorICoJbGVhZmlkeAktIHJldHVybiBwb2ludGVyIHRvIGJlIHNldCB0byB0aGUgaW5kZXggb2YgdGhlIGxlYWYKKyAqCQkgIGRlc2NyaWJpbmcgYXQgbGVhc3QgbDJuYiBmcmVlIGJsb2NrcyBpZiBzdWZmaWNpZW50CisgKgkJICBmcmVlIGJsb2NrcyBhcmUgZm91bmQuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMAktIHN1Y2Nlc3MKKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBmcmVlIGJsb2Nrcy4gCisgKi8KK3N0YXRpYyBpbnQgZGJGaW5kTGVhZihkbXRyZWVfdCAqIHRwLCBpbnQgbDJuYiwgaW50ICpsZWFmaWR4KQoreworCWludCB0aSwgbiA9IDAsIGssIHggPSAwOworCisJLyogZmlyc3QgY2hlY2sgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgdG8gc2VlIGlmIHRoZXJlIGlzCisJICogc3VmZmljaWVudCBmcmVlIHNwYWNlLgorCSAqLworCWlmIChsMm5iID4gdHAtPmRtdF9zdHJlZVtST09UXSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwkvKiBzdWZmaWNpZW50IGZyZWUgc3BhY2UgYXZhaWxhYmxlLiBub3cgc2VhcmNoIGRvd24gdGhlIHRyZWUKKwkgKiBzdGFydGluZyBhdCB0aGUgbmV4dCBsZXZlbCBmb3IgdGhlIGxlZnRtb3N0IGxlYWYgdGhhdAorCSAqIGRlc2NyaWJlcyBzdWZmaWNpZW50IGZyZWUgc3BhY2UuCisJICovCisJZm9yIChrID0gbGUzMl90b19jcHUodHAtPmRtdF9oZWlnaHQpLCB0aSA9IDE7CisJICAgICBrID4gMDsgay0tLCB0aSA9ICgodGkgKyBuKSA8PCAyKSArIDEpIHsKKwkJLyogc2VhcmNoIHRoZSBmb3VyIG5vZGVzIGF0IHRoaXMgbGV2ZWwsIHN0YXJ0aW5nIGZyb20KKwkJICogdGhlIGxlZnQuCisJCSAqLworCQlmb3IgKHggPSB0aSwgbiA9IDA7IG4gPCA0OyBuKyspIHsKKwkJCS8qIHN1ZmZpY2llbnQgZnJlZSBzcGFjZSBmb3VuZC4gIG1vdmUgdG8gdGhlIG5leHQKKwkJCSAqIGxldmVsIChvciBxdWl0IGlmIHRoaXMgaXMgdGhlIGxhc3QgbGV2ZWwpLgorCQkJICovCisJCQlpZiAobDJuYiA8PSB0cC0+ZG10X3N0cmVlW3ggKyBuXSkKKwkJCQlicmVhazsKKwkJfQorCisJCS8qIGJldHRlciBoYXZlIGZvdW5kIHNvbWV0aGluZyBzaW5jZSB0aGUgaGlnaGVyCisJCSAqIGxldmVscyBvZiB0aGUgdHJlZSBzYWlkIGl0IHdhcyBoZXJlLgorCQkgKi8KKwkJYXNzZXJ0KG4gPCA0KTsKKwl9CisKKwkvKiBzZXQgdGhlIHJldHVybiB0byB0aGUgbGVmdG1vc3QgbGVhZiBkZXNjcmliaW5nIHN1ZmZpY2llbnQKKwkgKiBmcmVlIHNwYWNlLgorCSAqLworCSpsZWFmaWR4ID0geCArIG4gLSBsZTMyX3RvX2NwdSh0cC0+ZG10X2xlYWZpZHgpOworCisJcmV0dXJuICgwKTsKK30KKworCisvKgorICogTkFNRToJZGJGaW5kQml0cygpCisgKgorICogRlVOQ1RJT046ICAgIGZpbmQgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJpbmFyeSBidWRkeSBmcmVlIGJpdHMgd2l0aGluIGEKKyAqCQlkbWFwIGJpdG1hcCB3b3JkIHZhbHVlLgorICoKKyAqCQl0aGlzIHJvdXRpbmUgc2VhcmNoZXMgdGhlIGJpdG1hcCB2YWx1ZSBmb3IgKDEgPDwgbDJuYikgZnJlZQorICoJCWJpdHMgYXQgKDEgPDwgbDJuYikgYWxpZ25tZW50cyB3aXRoaW4gdGhlIHZhbHVlLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIHdvcmQJLSAgZG1hcCBiaXRtYXAgd29yZCB2YWx1ZS4KKyAqICAgICAgbDJuYgktICBudW1iZXIgb2YgZnJlZSBiaXRzIHNwZWNpZmllZCBhcyBhIGxvZzIgbnVtYmVyLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIHN0YXJ0aW5nIGJpdCBudW1iZXIgb2YgZnJlZSBiaXRzLgorICovCitzdGF0aWMgaW50IGRiRmluZEJpdHModTMyIHdvcmQsIGludCBsMm5iKQoreworCWludCBiaXRubywgbmI7CisJdTMyIG1hc2s7CisKKwkvKiBnZXQgdGhlIG51bWJlciBvZiBiaXRzLgorCSAqLworCW5iID0gMSA8PCBsMm5iOworCWFzc2VydChuYiA8PSBEQldPUkQpOworCisJLyogY29tcGxlbWVudCB0aGUgd29yZCBzbyB3ZSBjYW4gdXNlIGEgbWFzayAoaS5lLiAwcyByZXByZXNlbnQKKwkgKiBmcmVlIGJpdHMpIGFuZCBjb21wdXRlIHRoZSBtYXNrLgorCSAqLworCXdvcmQgPSB+d29yZDsKKwltYXNrID0gT05FUyA8PCAoREJXT1JEIC0gbmIpOworCisJLyogc2NhbiB0aGUgd29yZCBmb3IgbmIgZnJlZSBiaXRzIGF0IG5iIGFsaWdubWVudHMuCisJICovCisJZm9yIChiaXRubyA9IDA7IG1hc2sgIT0gMDsgYml0bm8gKz0gbmIsIG1hc2sgPj49IG5iKSB7CisJCWlmICgobWFzayAmIHdvcmQpID09IG1hc2spCisJCQlicmVhazsKKwl9CisKKwlBU1NFUlQoYml0bm8gPCAzMik7CisKKwkvKiByZXR1cm4gdGhlIGJpdCBudW1iZXIuCisJICovCisJcmV0dXJuIChiaXRubyk7Cit9CisKKworLyoKKyAqIE5BTUU6CWRiTWF4QnVkKHU4ICpjcCkKKyAqCisgKiBGVU5DVElPTjogICAgZGV0ZXJtaW5lIHRoZSBsYXJnZXN0IGJpbmFyeSBidWRkeSBzdHJpbmcgb2YgZnJlZQorICoJCWJpdHMgd2l0aGluIDMyLWJpdHMgb2YgdGhlIG1hcC4KKyAqCisgKiBQQVJBTUVURVJTOgorICogICAgICBjcAktICBwb2ludGVyIHRvIHRoZSAzMi1iaXQgdmFsdWUuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgbGFyZ2VzdCBiaW5hcnkgYnVkZHkgb2YgZnJlZSBiaXRzIHdpdGhpbiBhIGRtYXAgd29yZC4KKyAqLworc3RhdGljIGludCBkYk1heEJ1ZCh1OCAqIGNwKQoreworCXNpZ25lZCBjaGFyIHRtcDEsIHRtcDI7CisKKwkvKiBjaGVjayBpZiB0aGUgd21hcCB3b3JkIGlzIGFsbCBmcmVlLiBpZiBzbywgdGhlCisJICogZnJlZSBidWRkeSBzaXplIGlzIEJVRE1JTi4KKwkgKi8KKwlpZiAoKigodWludCAqKSBjcCkgPT0gMCkKKwkJcmV0dXJuIChCVURNSU4pOworCisJLyogY2hlY2sgaWYgdGhlIHdtYXAgd29yZCBpcyBoYWxmIGZyZWUuIGlmIHNvLCB0aGUKKwkgKiBmcmVlIGJ1ZGR5IHNpemUgaXMgQlVETUlOLTEuCisJICovCisJaWYgKCooKHUxNiAqKSBjcCkgPT0gMCB8fCAqKCh1MTYgKikgY3AgKyAxKSA9PSAwKQorCQlyZXR1cm4gKEJVRE1JTiAtIDEpOworCisJLyogbm90IGFsbCBmcmVlIG9yIGhhbGYgZnJlZS4gZGV0ZXJtaW5lIHRoZSBmcmVlIGJ1ZGR5CisJICogc2l6ZSB0aHJ1IHRhYmxlIGxvb2t1cCB1c2luZyBxdWFydGVycyBvZiB0aGUgd21hcCB3b3JkLgorCSAqLworCXRtcDEgPSBtYXgoYnVkdGFiW2NwWzJdXSwgYnVkdGFiW2NwWzNdXSk7CisJdG1wMiA9IG1heChidWR0YWJbY3BbMF1dLCBidWR0YWJbY3BbMV1dKTsKKwlyZXR1cm4gKG1heCh0bXAxLCB0bXAyKSk7Cit9CisKKworLyoKKyAqIE5BTUU6CWNudHR6KHVpbnQgd29yZCkKKyAqCisgKiBGVU5DVElPTjogICAgZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgdHJhaWxpbmcgemVyb3Mgd2l0aGluIGEgMzItYml0CisgKgkJdmFsdWUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgdmFsdWUJLSAgMzItYml0IHZhbHVlIHRvIGJlIGV4YW1pbmVkLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIGNvdW50IG9mIHRyYWlsaW5nIHplcm9zCisgKi8KK3N0YXRpYyBpbnQgY250dHoodTMyIHdvcmQpCit7CisJaW50IG47CisKKwlmb3IgKG4gPSAwOyBuIDwgMzI7IG4rKywgd29yZCA+Pj0gMSkgeworCQlpZiAod29yZCAmIDB4MDEpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKG4pOworfQorCisKKy8qCisgKiBOQU1FOgljbnRseih1MzIgdmFsdWUpCisgKgorICogRlVOQ1RJT046ICAgIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgemVyb3Mgd2l0aGluIGEgMzItYml0CisgKgkJdmFsdWUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgdmFsdWUJLSAgMzItYml0IHZhbHVlIHRvIGJlIGV4YW1pbmVkLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIGNvdW50IG9mIGxlYWRpbmcgemVyb3MKKyAqLworc3RhdGljIGludCBjbnRseih1MzIgdmFsdWUpCit7CisJaW50IG47CisKKwlmb3IgKG4gPSAwOyBuIDwgMzI7IG4rKywgdmFsdWUgPDw9IDEpIHsKKwkJaWYgKHZhbHVlICYgSElHSE9SREVSKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAobik7Cit9CisKKworLyoKKyAqIE5BTUU6CWJsa3N0b2wyKHM2NCBuYikKKyAqCisgKiBGVU5DVElPTjoJY29udmVydCBhIGJsb2NrIGNvdW50IHRvIGl0cyBsb2cyIHZhbHVlLiBpZiB0aGUgYmxvY2sKKyAqCSAgICAgICAgY291bnQgaXMgbm90IGEgbDIgbXVsdGlwbGUsIGl0IGlzIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQKKyAqCQlsYXJnZXIgbDIgbXVsdGlwbGUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgbmIJLSAgbnVtYmVyIG9mIGJsb2NrcworICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIGxvZzIgbnVtYmVyIG9mIGJsb2NrcworICovCitpbnQgYmxrc3RvbDIoczY0IG5iKQoreworCWludCBsMm5iOworCXM2NCBtYXNrOwkJLyogbWVhbnQgdG8gYmUgc2lnbmVkICovCisKKwltYXNrID0gKHM2NCkgMSA8PCAoNjQgLSAxKTsKKworCS8qIGNvdW50IHRoZSBsZWFkaW5nIGJpdHMuCisJICovCisJZm9yIChsMm5iID0gMDsgbDJuYiA8IDY0OyBsMm5iKyssIG1hc2sgPj49IDEpIHsKKwkJLyogbGVhZGluZyBiaXQgZm91bmQuCisJCSAqLworCQlpZiAobmIgJiBtYXNrKSB7CisJCQkvKiBkZXRlcm1pbmUgdGhlIGwyIHZhbHVlLgorCQkJICovCisJCQlsMm5iID0gKDY0IC0gMSkgLSBsMm5iOworCisJCQkvKiBjaGVjayBpZiB3ZSBuZWVkIHRvIHJvdW5kIHVwLgorCQkJICovCisJCQlpZiAofm1hc2sgJiBuYikKKwkJCQlsMm5iKys7CisKKwkJCXJldHVybiAobDJuYik7CisJCX0KKwl9CisJYXNzZXJ0KDApOworCXJldHVybiAwOwkJLyogZml4IGNvbXBpbGVyIHdhcm5pbmcgKi8KK30KKworCisvKgorICogTkFNRTogICAgCWRiQWxsb2NCb3R0b21VcCgpCisgKgorICogRlVOQ1RJT046CWFsbG9jIHRoZSBzcGVjaWZpZWQgYmxvY2sgcmFuZ2UgZnJvbSB0aGUgd29ya2luZyBibG9jaworICoJCWFsbG9jYXRpb24gbWFwLgorICoKKyAqCQl0aGUgYmxvY2tzIHdpbGwgYmUgYWxsb2MgZnJvbSB0aGUgd29ya2luZyBtYXAgb25lIGRtYXAKKyAqCQlhdCBhIHRpbWUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgaXAJLSAgcG9pbnRlciB0byBpbi1jb3JlIGlub2RlOworICogICAgICBibGtubwktICBzdGFydGluZyBibG9jayBudW1iZXIgdG8gYmUgZnJlZWQuCisgKiAgICAgIG5ibG9ja3MJLSAgbnVtYmVyIG9mIGJsb2NrcyB0byBiZSBmcmVlZC4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwCS0gc3VjY2VzcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKi8KK2ludCBkYkFsbG9jQm90dG9tVXAoc3RydWN0IGlub2RlICppcCwgczY0IGJsa25vLCBzNjQgbmJsb2NrcykKK3sKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXN0cnVjdCBkbWFwICpkcDsKKwlpbnQgbmIsIHJjOworCXM2NCBsYmxrbm8sIHJlbTsKKwlzdHJ1Y3QgaW5vZGUgKmlwYm1hcCA9IEpGU19TQkkoaXAtPmlfc2IpLT5pcGJtYXA7CisJc3RydWN0IGJtYXAgKmJtcCA9IEpGU19TQkkoaXAtPmlfc2IpLT5ibWFwOworCisJSVJFQURfTE9DSyhpcGJtYXApOworCisJLyogYmxvY2sgdG8gYmUgYWxsb2NhdGVkIGJldHRlciBiZSB3aXRoaW4gdGhlIG1hcHNpemUuICovCisJQVNTRVJUKG5ibG9ja3MgPD0gYm1wLT5kYl9tYXBzaXplIC0gYmxrbm8pOworCisJLyoKKwkgKiBhbGxvY2F0ZSB0aGUgYmxvY2tzIGEgZG1hcCBhdCBhIHRpbWUuCisJICovCisJbXAgPSBOVUxMOworCWZvciAocmVtID0gbmJsb2NrczsgcmVtID4gMDsgcmVtIC09IG5iLCBibGtubyArPSBuYikgeworCQkvKiByZWxlYXNlIHByZXZpb3VzIGRtYXAgaWYgYW55ICovCisJCWlmIChtcCkgeworCQkJd3JpdGVfbWV0YXBhZ2UobXApOworCQl9CisKKwkJLyogZ2V0IHRoZSBidWZmZXIgZm9yIHRoZSBjdXJyZW50IGRtYXAuICovCisJCWxibGtubyA9IEJMS1RPRE1BUChibGtubywgYm1wLT5kYl9sMm5icGVycGFnZSk7CisJCW1wID0gcmVhZF9tZXRhcGFnZShpcGJtYXAsIGxibGtubywgUFNJWkUsIDApOworCQlpZiAobXAgPT0gTlVMTCkgeworCQkJSVJFQURfVU5MT0NLKGlwYm1hcCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlkcCA9IChzdHJ1Y3QgZG1hcCAqKSBtcC0+ZGF0YTsKKworCQkvKiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBibG9ja3MgdG8gYmUgYWxsb2NhdGVkIGZyb20KKwkJICogdGhpcyBkbWFwLgorCQkgKi8KKwkJbmIgPSBtaW4ocmVtLCBCUEVSRE1BUCAtIChibGtubyAmIChCUEVSRE1BUCAtIDEpKSk7CisKKwkJREJGUkVFQ0soYm1wLT5kYl9EQm1hcCwgYm1wLT5kYl9tYXBzaXplLCBibGtubywgbmIpOworCisJCS8qIGFsbG9jYXRlIHRoZSBibG9ja3MuICovCisJCWlmICgocmMgPSBkYkFsbG9jRG1hcEJVKGJtcCwgZHAsIGJsa25vLCBuYikpKSB7CisJCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJCUlSRUFEX1VOTE9DSyhpcGJtYXApOworCQkJcmV0dXJuIChyYyk7CisJCX0KKworCQlEQkFMTE9DKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwgYmxrbm8sIG5iKTsKKwl9CisKKwkvKiB3cml0ZSB0aGUgbGFzdCBidWZmZXIuICovCisJd3JpdGVfbWV0YXBhZ2UobXApOworCisJSVJFQURfVU5MT0NLKGlwYm1hcCk7CisKKwlyZXR1cm4gKDApOworfQorCisKK3N0YXRpYyBpbnQgZGJBbGxvY0RtYXBCVShzdHJ1Y3QgYm1hcCAqIGJtcCwgc3RydWN0IGRtYXAgKiBkcCwgczY0IGJsa25vLAorCQkJIGludCBuYmxvY2tzKQoreworCWludCByYzsKKwlpbnQgZGJpdG5vLCB3b3JkLCByZW1iaXRzLCBuYiwgbndvcmRzLCB3Yml0bm8sIGFnbm87CisJczggb2xkcm9vdCwgKmxlYWY7CisJc3RydWN0IGRtYXB0cmVlICp0cCA9IChzdHJ1Y3QgZG1hcHRyZWUgKikgJiBkcC0+dHJlZTsKKworCS8qIHNhdmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHJvb3QgKGkuZS4gbWF4aW11bSBmcmVlIHN0cmluZykKKwkgKiBvZiB0aGUgZG1hcCB0cmVlLgorCSAqLworCW9sZHJvb3QgPSB0cC0+c3RyZWVbUk9PVF07CisKKwkvKiBwaWNrIHVwIGEgcG9pbnRlciB0byB0aGUgbGVhdmVzIG9mIHRoZSBkbWFwIHRyZWUgKi8KKwlsZWFmID0gdHAtPnN0cmVlICsgTEVBRklORDsKKworCS8qIGRldGVybWluZSB0aGUgYml0IG51bWJlciBhbmQgd29yZCB3aXRoaW4gdGhlIGRtYXAgb2YgdGhlCisJICogc3RhcnRpbmcgYmxvY2suCisJICovCisJZGJpdG5vID0gYmxrbm8gJiAoQlBFUkRNQVAgLSAxKTsKKwl3b3JkID0gZGJpdG5vID4+IEwyREJXT1JEOworCisJLyogYmxvY2sgcmFuZ2UgYmV0dGVyIGJlIHdpdGhpbiB0aGUgZG1hcCAqLworCWFzc2VydChkYml0bm8gKyBuYmxvY2tzIDw9IEJQRVJETUFQKTsKKworCS8qIGFsbG9jYXRlIHRoZSBiaXRzIG9mIHRoZSBkbWFwJ3Mgd29yZHMgY29ycmVzcG9uZGluZyB0byB0aGUgYmxvY2sKKwkgKiByYW5nZS4gbm90IGFsbCBiaXRzIG9mIHRoZSBmaXJzdCBhbmQgbGFzdCB3b3JkcyBtYXkgYmUgY29udGFpbmVkCisJICogd2l0aGluIHRoZSBibG9jayByYW5nZS4gIGlmIHRoaXMgaXMgdGhlIGNhc2UsIHdlJ2xsIHdvcmsgYWdhaW5zdAorCSAqIHRob3NlIHdvcmRzIChpLmUuIHBhcnRpYWwgZmlyc3QgYW5kL29yIGxhc3QpIG9uIGFuIGluZGl2aWR1YWwgYmFzaXMKKwkgKiAoYSBzaW5nbGUgcGFzcyksIGFsbG9jYXRpbmcgdGhlIGJpdHMgb2YgaW50ZXJlc3QgYnkgaGFuZCBhbmQKKwkgKiB1cGRhdGluZyB0aGUgbGVhZiBjb3JyZXNwb25kaW5nIHRvIHRoZSBkbWFwIHdvcmQuIGEgc2luZ2xlIHBhc3MKKwkgKiB3aWxsIGJlIHVzZWQgZm9yIGFsbCBkbWFwIHdvcmRzIGZ1bGx5IGNvbnRhaW5lZCB3aXRoaW4gdGhlCisJICogc3BlY2lmaWVkIHJhbmdlLiAgd2l0aGluIHRoaXMgcGFzcywgdGhlIGJpdHMgb2YgYWxsIGZ1bGx5IGNvbnRhaW5lZAorCSAqIGRtYXAgd29yZHMgd2lsbCBiZSBtYXJrZWQgYXMgZnJlZSBpbiBhIHNpbmdsZSBzaG90IGFuZCB0aGUgbGVhdmVzCisJICogd2lsbCBiZSB1cGRhdGVkLiBhIHNpbmdsZSBsZWFmIG1heSBkZXNjcmliZSB0aGUgZnJlZSBzcGFjZSBvZgorCSAqIG11bHRpcGxlIGRtYXAgd29yZHMsIHNvIHdlIG1heSB1cGRhdGUgb25seSBhIHN1YnNldCBvZiB0aGUgYWN0dWFsCisJICogbGVhdmVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRtYXAgd29yZHMgb2YgdGhlIGJsb2NrIHJhbmdlLgorCSAqLworCWZvciAocmVtYml0cyA9IG5ibG9ja3M7IHJlbWJpdHMgPiAwOyByZW1iaXRzIC09IG5iLCBkYml0bm8gKz0gbmIpIHsKKwkJLyogZGV0ZXJtaW5lIHRoZSBiaXQgbnVtYmVyIHdpdGhpbiB0aGUgd29yZCBhbmQKKwkJICogdGhlIG51bWJlciBvZiBiaXRzIHdpdGhpbiB0aGUgd29yZC4KKwkJICovCisJCXdiaXRubyA9IGRiaXRubyAmIChEQldPUkQgLSAxKTsKKwkJbmIgPSBtaW4ocmVtYml0cywgREJXT1JEIC0gd2JpdG5vKTsKKworCQkvKiBjaGVjayBpZiBvbmx5IHBhcnQgb2YgYSB3b3JkIGlzIHRvIGJlIGFsbG9jYXRlZC4KKwkJICovCisJCWlmIChuYiA8IERCV09SRCkgeworCQkJLyogYWxsb2NhdGUgKHNldCB0byAxKSB0aGUgYXBwcm9wcmlhdGUgYml0cyB3aXRoaW4KKwkJCSAqIHRoaXMgZG1hcCB3b3JkLgorCQkJICovCisJCQlkcC0+d21hcFt3b3JkXSB8PSBjcHVfdG9fbGUzMihPTkVTIDw8IChEQldPUkQgLSBuYikKKwkJCQkJCSAgICAgID4+IHdiaXRubyk7CisKKwkJCXdvcmQrKzsKKwkJfSBlbHNlIHsKKwkJCS8qIG9uZSBvciBtb3JlIGRtYXAgd29yZHMgYXJlIGZ1bGx5IGNvbnRhaW5lZAorCQkJICogd2l0aGluIHRoZSBibG9jayByYW5nZS4gIGRldGVybWluZSBob3cgbWFueQorCQkJICogd29yZHMgYW5kIGFsbG9jYXRlIChzZXQgdG8gMSkgdGhlIGJpdHMgb2YgdGhlc2UKKwkJCSAqIHdvcmRzLgorCQkJICovCisJCQlud29yZHMgPSByZW1iaXRzID4+IEwyREJXT1JEOworCQkJbWVtc2V0KCZkcC0+d21hcFt3b3JkXSwgKGludCkgT05FUywgbndvcmRzICogNCk7CisKKwkJCS8qIGRldGVybWluZSBob3cgbWFueSBiaXRzICovCisJCQluYiA9IG53b3JkcyA8PCBMMkRCV09SRDsKKwkJCXdvcmQgKz0gbndvcmRzOworCQl9CisJfQorCisJLyogdXBkYXRlIHRoZSBmcmVlIGNvdW50IGZvciB0aGlzIGRtYXAgKi8KKwlkcC0+bmZyZWUgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdShkcC0+bmZyZWUpIC0gbmJsb2Nrcyk7CisKKwkvKiByZWNvbnN0cnVjdCBzdW1tYXJ5IHRyZWUgKi8KKwlkYkluaXREbWFwVHJlZShkcCk7CisKKwlCTUFQX0xPQ0soYm1wKTsKKworCS8qIGlmIHRoaXMgYWxsb2NhdGlvbiBncm91cCBpcyBjb21wbGV0ZWx5IGZyZWUsCisJICogdXBkYXRlIHRoZSBoaWdoZXN0IGFjdGl2ZSBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAKKwkgKiBpZiB0aGlzIGFsbG9jYXRpb24gZ3JvdXAgaXMgdGhlIG5ldyBtYXguCisJICovCisJYWdubyA9IGJsa25vID4+IGJtcC0+ZGJfYWdsMnNpemU7CisJaWYgKGFnbm8gPiBibXAtPmRiX21heGFnKQorCQlibXAtPmRiX21heGFnID0gYWdubzsKKworCS8qIHVwZGF0ZSB0aGUgZnJlZSBjb3VudCBmb3IgdGhlIGFsbG9jYXRpb24gZ3JvdXAgYW5kIG1hcCAqLworCWJtcC0+ZGJfYWdmcmVlW2Fnbm9dIC09IG5ibG9ja3M7CisJYm1wLT5kYl9uZnJlZSAtPSBuYmxvY2tzOworCisJQk1BUF9VTkxPQ0soYm1wKTsKKworCS8qIGlmIHRoZSByb290IGhhcyBub3QgY2hhbmdlZCwgZG9uZS4gKi8KKwlpZiAodHAtPnN0cmVlW1JPT1RdID09IG9sZHJvb3QpCisJCXJldHVybiAoMCk7CisKKwkvKiByb290IGNoYW5nZWQuIGJ1YmJsZSB0aGUgY2hhbmdlIHVwIHRvIHRoZSBkbWFwIGNvbnRyb2wgcGFnZXMuCisJICogaWYgdGhlIGFkanVzdG1lbnQgb2YgdGhlIHVwcGVyIGxldmVsIGNvbnRyb2wgcGFnZXMgZmFpbHMsCisJICogYmFja291dCB0aGUgYml0IGFsbG9jYXRpb24gKHRodXMgbWFraW5nIGV2ZXJ5dGhpbmcgY29uc2lzdGVudCkuCisJICovCisJaWYgKChyYyA9IGRiQWRqQ3RsKGJtcCwgYmxrbm8sIHRwLT5zdHJlZVtST09UXSwgMSwgMCkpKQorCQlkYkZyZWVCaXRzKGJtcCwgZHAsIGJsa25vLCBuYmxvY2tzKTsKKworCXJldHVybiAocmMpOworfQorCisKKy8qCisgKiBOQU1FOglkYkV4dGVuZEZTKCkKKyAqCisgKiBGVU5DVElPTjoJZXh0ZW5kIGJtYXAgZnJvbSBibGtubyBmb3IgbmJsb2NrczsKKyAqIAkJZGJFeHRlbmRGUygpIHVwZGF0ZXMgYm1hcCByZWFkeSBmb3IgZGJBbGxvY0JvdHRvbVVwKCk7CisgKgorICogTDIKKyAqICB8CisgKiAgIEwxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTDEKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgIEwwLS0tLS0tLS0tTDAtLS0tLS0tLS1MMCAgICAgICAgICAgTDAtLS0tLS0tLS1MMC0tLS0tLS0tLUwwCisgKiAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAqICAgICAgIGQwLC4uLixkbiAgZDAsLi4uLGRuICBkMCwuLi4sZG4gICAgZDAsLi4uLGRuICBkMCwuLi4sZG4gIGQwLC4sZG07CisgKiBMMkwxTDBkMCwuLi4sZG5MMGQwLC4uLixkbkwwZDAsLi4uLGRuTDFMMGQwLC4uLixkbkwwZDAsLi4uLGRuTDBkMCwuLmRtCisgKgorICogPC0tLW9sZC0tLT48LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLWV4dGVuZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiAgIAorICovCitpbnQgZGJFeHRlbmRGUyhzdHJ1Y3QgaW5vZGUgKmlwYm1hcCwgczY0IGJsa25vLAlzNjQgbmJsb2NrcykKK3sKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoaXBibWFwLT5pX3NiKTsKKwlpbnQgbmJwZXJwYWdlID0gc2JpLT5uYnBlcnBhZ2U7CisJaW50IGksIGkwID0gVFJVRSwgaiwgajAgPSBUUlVFLCBrLCBuOworCXM2NCBuZXdzaXplOworCXM2NCBwOworCXN0cnVjdCBtZXRhcGFnZSAqbXAsICpsMm1wLCAqbDFtcCA9IE5VTEwsICpsMG1wID0gTlVMTDsKKwlzdHJ1Y3QgZG1hcGN0bCAqbDJkY3AsICpsMWRjcCwgKmwwZGNwOworCXN0cnVjdCBkbWFwICpkcDsKKwlzOCAqbDBsZWFmLCAqbDFsZWFmLCAqbDJsZWFmOworCXN0cnVjdCBibWFwICpibXAgPSBzYmktPmJtYXA7CisJaW50IGFnbm8sIGwyYWdzaXplLCBvbGRsMmFnc2l6ZTsKKwlzNjQgYWdfcmVtOworCisJbmV3c2l6ZSA9IGJsa25vICsgbmJsb2NrczsKKworCWpmc19pbmZvKCJkYkV4dGVuZEZTOiBibGtubzolTGQgbmJsb2NrczolTGQgbmV3c2l6ZTolTGQiLAorCQkgKGxvbmcgbG9uZykgYmxrbm8sIChsb25nIGxvbmcpIG5ibG9ja3MsIChsb25nIGxvbmcpIG5ld3NpemUpOworCisJLyoKKwkgKiAgICAgIGluaXRpYWxpemUgYm1hcCBjb250cm9sIHBhZ2UuCisJICoKKwkgKiBhbGwgdGhlIGRhdGEgaW4gYm1hcCBjb250cm9sIHBhZ2Ugc2hvdWxkIGV4Y2x1ZGUKKwkgKiB0aGUgbWtmcyBoaWRkZW4gZG1hcCBwYWdlLgorCSAqLworCisJLyogdXBkYXRlIG1hcHNpemUgKi8KKwlibXAtPmRiX21hcHNpemUgPSBuZXdzaXplOworCWJtcC0+ZGJfbWF4bGV2ZWwgPSBCTUFQU1pUT0xFVihibXAtPmRiX21hcHNpemUpOworCisJLyogY29tcHV0ZSBuZXcgQUcgc2l6ZSAqLworCWwyYWdzaXplID0gZGJHZXRMMkFHU2l6ZShuZXdzaXplKTsKKwlvbGRsMmFnc2l6ZSA9IGJtcC0+ZGJfYWdsMnNpemU7CisKKwlibXAtPmRiX2FnbDJzaXplID0gbDJhZ3NpemU7CisJYm1wLT5kYl9hZ3NpemUgPSAxIDw8IGwyYWdzaXplOworCisJLyogY29tcHV0ZSBuZXcgbnVtYmVyIG9mIEFHICovCisJYWdubyA9IGJtcC0+ZGJfbnVtYWc7CisJYm1wLT5kYl9udW1hZyA9IG5ld3NpemUgPj4gbDJhZ3NpemU7CisJYm1wLT5kYl9udW1hZyArPSAoKHUzMikgbmV3c2l6ZSAlICh1MzIpIGJtcC0+ZGJfYWdzaXplKSA/IDEgOiAwOworCisJLyoKKwkgKiAgICAgIHJlY29uZmlndXJlIGRiX2FnZnJlZVtdIAorCSAqIGZyb20gb2xkIEFHIGNvbmZpZ3VyYXRpb24gdG8gbmV3IEFHIGNvbmZpZ3VyYXRpb247CisJICoKKwkgKiBjb2FsZXNjZSBjb250aWd1b3VzIGsgKG5ld0FHU2l6ZS9vbGRBR1NpemUpIEFHczsKKwkgKiBpLmUuLCAoQUdpLCAuLi4sIEFHaikgd2hlcmUgaSA9IGsqbiBhbmQgaiA9IGsqKG4rMSkgLSAxIHRvIEFHbjsKKwkgKiBub3RlOiBuZXcgQUcgc2l6ZSA9IG9sZCBBRyBzaXplICogKDIqKngpLgorCSAqLworCWlmIChsMmFnc2l6ZSA9PSBvbGRsMmFnc2l6ZSkKKwkJZ290byBleHRlbmQ7CisJayA9IDEgPDwgKGwyYWdzaXplIC0gb2xkbDJhZ3NpemUpOworCWFnX3JlbSA9IGJtcC0+ZGJfYWdmcmVlWzBdOwkvKiBzYXZlIGFnZnJlZVswXSAqLworCWZvciAoaSA9IDAsIG4gPSAwOyBpIDwgYWdubzsgbisrKSB7CisJCWJtcC0+ZGJfYWdmcmVlW25dID0gMDsJLyogaW5pdCBjb2xsZWN0aW9uIHBvaW50ICovCisKKwkJLyogY29hbGVzY2UgY290aWd1b3VzIGsgQUdzOyAqLworCQlmb3IgKGogPSAwOyBqIDwgayAmJiBpIDwgYWdubzsgaisrLCBpKyspIHsKKwkJCS8qIG1lcmdlIEFHaSB0byBBR24gKi8KKwkJCWJtcC0+ZGJfYWdmcmVlW25dICs9IGJtcC0+ZGJfYWdmcmVlW2ldOworCQl9CisJfQorCWJtcC0+ZGJfYWdmcmVlWzBdICs9IGFnX3JlbTsJLyogcmVzdG9yZSBhZ2ZyZWVbMF0gKi8KKworCWZvciAoOyBuIDwgTUFYQUc7IG4rKykKKwkJYm1wLT5kYl9hZ2ZyZWVbbl0gPSAwOworCisJLyoKKwkgKiB1cGRhdGUgaGlnaGVzdCBhY3RpdmUgYWcgbnVtYmVyCisJICovCisKKwlibXAtPmRiX21heGFnID0gYm1wLT5kYl9tYXhhZyAvIGs7CisKKwkvKgorCSAqICAgICAgZXh0ZW5kIGJtYXAKKwkgKgorCSAqIHVwZGF0ZSBiaXQgbWFwcyBhbmQgY29ycmVzcG9uZGluZyBsZXZlbCBjb250cm9sIHBhZ2VzOworCSAqIGdsb2JhbCBjb250cm9sIHBhZ2UgZGJfbmZyZWUsIGRiX2FnZnJlZVthZ25vXSwgZGJfbWF4ZnJlZWJ1ZDsKKwkgKi8KKyAgICAgIGV4dGVuZDoKKwkvKiBnZXQgTDIgcGFnZSAqLworCXAgPSBCTUFQQkxLTk8gKyBuYnBlcnBhZ2U7CS8qIEwyIHBhZ2UgKi8KKwlsMm1wID0gcmVhZF9tZXRhcGFnZShpcGJtYXAsIHAsIFBTSVpFLCAwKTsKKwlpZiAoIWwybXApIHsKKwkJamZzX2Vycm9yKGlwYm1hcC0+aV9zYiwgImRiRXh0ZW5kRlM6IEwyIHBhZ2UgY291bGQgbm90IGJlIHJlYWQiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWwyZGNwID0gKHN0cnVjdCBkbWFwY3RsICopIGwybXAtPmRhdGE7CisKKwkvKiBjb21wdXRlIHN0YXJ0IEwxICovCisJayA9IGJsa25vID4+IEwyTUFYTDFTSVpFOworCWwybGVhZiA9IGwyZGNwLT5zdHJlZSArIENUTExFQUZJTkQgKyBrOworCXAgPSBCTEtUT0wxKGJsa25vLCBzYmktPmwybmJwZXJwYWdlKTsJLyogTDEgcGFnZSAqLworCisJLyoKKwkgKiBleHRlbmQgZWFjaCBMMSBpbiBMMgorCSAqLworCWZvciAoOyBrIDwgTFBFUkNUTDsgaysrLCBwICs9IG5icGVycGFnZSkgeworCQkvKiBnZXQgTDEgcGFnZSAqLworCQlpZiAoajApIHsKKwkJCS8qIHJlYWQgaW4gTDEgcGFnZTogKGJsa25vICYgKE1BWEwxU0laRSAtIDEpKSAqLworCQkJbDFtcCA9IHJlYWRfbWV0YXBhZ2UoaXBibWFwLCBwLCBQU0laRSwgMCk7CisJCQlpZiAobDFtcCA9PSBOVUxMKQorCQkJCWdvdG8gZXJyb3V0OworCQkJbDFkY3AgPSAoc3RydWN0IGRtYXBjdGwgKikgbDFtcC0+ZGF0YTsKKworCQkJLyogY29tcHV0ZSBzdGFydCBMMCAqLworCQkJaiA9IChibGtubyAmIChNQVhMMVNJWkUgLSAxKSkgPj4gTDJNQVhMMFNJWkU7CisJCQlsMWxlYWYgPSBsMWRjcC0+c3RyZWUgKyBDVExMRUFGSU5EICsgajsKKwkJCXAgPSBCTEtUT0wwKGJsa25vLCBzYmktPmwybmJwZXJwYWdlKTsKKwkJCWowID0gRkFMU0U7CisJCX0gZWxzZSB7CisJCQkvKiBhc3NpZ24vaW5pdCBMMSBwYWdlICovCisJCQlsMW1wID0gZ2V0X21ldGFwYWdlKGlwYm1hcCwgcCwgUFNJWkUsIDApOworCQkJaWYgKGwxbXAgPT0gTlVMTCkKKwkJCQlnb3RvIGVycm91dDsKKworCQkJbDFkY3AgPSAoc3RydWN0IGRtYXBjdGwgKikgbDFtcC0+ZGF0YTsKKworCQkJLyogY29tcHV0ZSBzdGFydCBMMCAqLworCQkJaiA9IDA7CisJCQlsMWxlYWYgPSBsMWRjcC0+c3RyZWUgKyBDVExMRUFGSU5EOworCQkJcCArPSBuYnBlcnBhZ2U7CS8qIDFzdCBMMCBvZiBMMS5rICAqLworCQl9CisKKwkJLyoKKwkJICogZXh0ZW5kIGVhY2ggTDAgaW4gTDEKKwkJICovCisJCWZvciAoOyBqIDwgTFBFUkNUTDsgaisrKSB7CisJCQkvKiBnZXQgTDAgcGFnZSAqLworCQkJaWYgKGkwKSB7CisJCQkJLyogcmVhZCBpbiBMMCBwYWdlOiAoYmxrbm8gJiAoTUFYTDBTSVpFIC0gMSkpICovCisKKwkJCQlsMG1wID0gcmVhZF9tZXRhcGFnZShpcGJtYXAsIHAsIFBTSVpFLCAwKTsKKwkJCQlpZiAobDBtcCA9PSBOVUxMKQorCQkJCQlnb3RvIGVycm91dDsKKwkJCQlsMGRjcCA9IChzdHJ1Y3QgZG1hcGN0bCAqKSBsMG1wLT5kYXRhOworCisJCQkJLyogY29tcHV0ZSBzdGFydCBkbWFwICovCisJCQkJaSA9IChibGtubyAmIChNQVhMMFNJWkUgLSAxKSkgPj4KKwkJCQkgICAgTDJCUEVSRE1BUDsKKwkJCQlsMGxlYWYgPSBsMGRjcC0+c3RyZWUgKyBDVExMRUFGSU5EICsgaTsKKwkJCQlwID0gQkxLVE9ETUFQKGJsa25vLAorCQkJCQkgICAgICBzYmktPmwybmJwZXJwYWdlKTsKKwkJCQlpMCA9IEZBTFNFOworCQkJfSBlbHNlIHsKKwkJCQkvKiBhc3NpZ24vaW5pdCBMMCBwYWdlICovCisJCQkJbDBtcCA9IGdldF9tZXRhcGFnZShpcGJtYXAsIHAsIFBTSVpFLCAwKTsKKwkJCQlpZiAobDBtcCA9PSBOVUxMKQorCQkJCQlnb3RvIGVycm91dDsKKworCQkJCWwwZGNwID0gKHN0cnVjdCBkbWFwY3RsICopIGwwbXAtPmRhdGE7CisKKwkJCQkvKiBjb21wdXRlIHN0YXJ0IGRtYXAgKi8KKwkJCQlpID0gMDsKKwkJCQlsMGxlYWYgPSBsMGRjcC0+c3RyZWUgKyBDVExMRUFGSU5EOworCQkJCXAgKz0gbmJwZXJwYWdlOwkvKiAxc3QgZG1hcCBvZiBMMC5qICovCisJCQl9CisKKwkJCS8qCisJCQkgKiBleHRlbmQgZWFjaCBkbWFwIGluIEwwCisJCQkgKi8KKwkJCWZvciAoOyBpIDwgTFBFUkNUTDsgaSsrKSB7CisJCQkJLyoKKwkJCQkgKiByZWNvbnN0cnVjdCB0aGUgZG1hcCBwYWdlLCBhbmQKKwkJCQkgKiBpbml0aWFsaXplIGNvcnJlc3BvbmRpbmcgcGFyZW50IEwwIGxlYWYKKwkJCQkgKi8KKwkJCQlpZiAoKG4gPSBibGtubyAmIChCUEVSRE1BUCAtIDEpKSkgeworCQkJCQkvKiByZWFkIGluIGRtYXAgcGFnZTogKi8KKwkJCQkJbXAgPSByZWFkX21ldGFwYWdlKGlwYm1hcCwgcCwKKwkJCQkJCQkgICBQU0laRSwgMCk7CisJCQkJCWlmIChtcCA9PSBOVUxMKQorCQkJCQkJZ290byBlcnJvdXQ7CisJCQkJCW4gPSBtaW4obmJsb2NrcywgKHM2NClCUEVSRE1BUCAtIG4pOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIGFzc2lnbi9pbml0IGRtYXAgcGFnZSAqLworCQkJCQltcCA9IHJlYWRfbWV0YXBhZ2UoaXBibWFwLCBwLAorCQkJCQkJCSAgIFBTSVpFLCAwKTsKKwkJCQkJaWYgKG1wID09IE5VTEwpCisJCQkJCQlnb3RvIGVycm91dDsKKworCQkJCQluID0gbWluKG5ibG9ja3MsIChzNjQpQlBFUkRNQVApOworCQkJCX0KKworCQkJCWRwID0gKHN0cnVjdCBkbWFwICopIG1wLT5kYXRhOworCQkJCSpsMGxlYWYgPSBkYkluaXREbWFwKGRwLCBibGtubywgbik7CisKKwkJCQlibXAtPmRiX25mcmVlICs9IG47CisJCQkJYWdubyA9IGxlNjRfdG9fY3B1KGRwLT5zdGFydCkgPj4gbDJhZ3NpemU7CisJCQkJYm1wLT5kYl9hZ2ZyZWVbYWdub10gKz0gbjsKKworCQkJCXdyaXRlX21ldGFwYWdlKG1wKTsKKworCQkJCWwwbGVhZisrOworCQkJCXAgKz0gbmJwZXJwYWdlOworCisJCQkJYmxrbm8gKz0gbjsKKwkJCQluYmxvY2tzIC09IG47CisJCQkJaWYgKG5ibG9ja3MgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CS8qIGZvciBlYWNoIGRtYXAgaW4gYSBMMCAqLworCisJCQkvKgorCQkJICogYnVpbGQgY3VycmVudCBMMCBwYWdlIGZyb20gaXRzIGxlYXZlcywgYW5kIAorCQkJICogaW5pdGlhbGl6ZSBjb3JyZXNwb25kaW5nIHBhcmVudCBMMSBsZWFmCisJCQkgKi8KKwkJCSpsMWxlYWYgPSBkYkluaXREbWFwQ3RsKGwwZGNwLCAwLCArK2kpOworCQkJd3JpdGVfbWV0YXBhZ2UobDBtcCk7CisJCQlsMG1wID0gTlVMTDsKKworCQkJaWYgKG5ibG9ja3MpCisJCQkJbDFsZWFmKys7CS8qIGNvbnRpbnVlIGZvciBuZXh0IEwwICovCisJCQllbHNlIHsKKwkJCQkvKiBtb3JlIHRoYW4gMSBMMCA/ICovCisJCQkJaWYgKGogPiAwKQorCQkJCQlicmVhazsJLyogYnVpbGQgTDEgcGFnZSAqLworCQkJCWVsc2UgeworCQkJCQkvKiBzdW1tYXJpemUgaW4gZ2xvYmFsIGJtYXAgcGFnZSAqLworCQkJCQlibXAtPmRiX21heGZyZWVidWQgPSAqbDFsZWFmOworCQkJCQlyZWxlYXNlX21ldGFwYWdlKGwxbXApOworCQkJCQlyZWxlYXNlX21ldGFwYWdlKGwybXApOworCQkJCQlnb3RvIGZpbmFsaXplOworCQkJCX0KKwkJCX0KKwkJfQkJLyogZm9yIGVhY2ggTDAgaW4gYSBMMSAqLworCisJCS8qCisJCSAqIGJ1aWxkIGN1cnJlbnQgTDEgcGFnZSBmcm9tIGl0cyBsZWF2ZXMsIGFuZCAKKwkJICogaW5pdGlhbGl6ZSBjb3JyZXNwb25kaW5nIHBhcmVudCBMMiBsZWFmCisJCSAqLworCQkqbDJsZWFmID0gZGJJbml0RG1hcEN0bChsMWRjcCwgMSwgKytqKTsKKwkJd3JpdGVfbWV0YXBhZ2UobDFtcCk7CisJCWwxbXAgPSBOVUxMOworCisJCWlmIChuYmxvY2tzKQorCQkJbDJsZWFmKys7CS8qIGNvbnRpbnVlIGZvciBuZXh0IEwxICovCisJCWVsc2UgeworCQkJLyogbW9yZSB0aGFuIDEgTDEgPyAqLworCQkJaWYgKGsgPiAwKQorCQkJCWJyZWFrOwkvKiBidWlsZCBMMiBwYWdlICovCisJCQllbHNlIHsKKwkJCQkvKiBzdW1tYXJpemUgaW4gZ2xvYmFsIGJtYXAgcGFnZSAqLworCQkJCWJtcC0+ZGJfbWF4ZnJlZWJ1ZCA9ICpsMmxlYWY7CisJCQkJcmVsZWFzZV9tZXRhcGFnZShsMm1wKTsKKwkJCQlnb3RvIGZpbmFsaXplOworCQkJfQorCQl9CisJfQkJCS8qIGZvciBlYWNoIEwxIGluIGEgTDIgKi8KKworCWpmc19lcnJvcihpcGJtYXAtPmlfc2IsCisJCSAgImRiRXh0ZW5kRlM6IGZ1bmN0aW9uIGhhcyBub3QgcmV0dXJuZWQgYXMgZXhwZWN0ZWQiKTsKK2Vycm91dDoKKwlpZiAobDBtcCkKKwkJcmVsZWFzZV9tZXRhcGFnZShsMG1wKTsKKwlpZiAobDFtcCkKKwkJcmVsZWFzZV9tZXRhcGFnZShsMW1wKTsKKwlyZWxlYXNlX21ldGFwYWdlKGwybXApOworCXJldHVybiAtRUlPOworCisJLyoKKwkgKiAgICAgIGZpbmFsaXplIGJtYXAgY29udHJvbCBwYWdlCisJICovCitmaW5hbGl6ZToKKworCXJldHVybiAwOworfQorCisKKy8qCisgKglkYkZpbmFsaXplQm1hcCgpCisgKi8KK3ZvaWQgZGJGaW5hbGl6ZUJtYXAoc3RydWN0IGlub2RlICppcGJtYXApCit7CisJc3RydWN0IGJtYXAgKmJtcCA9IEpGU19TQkkoaXBibWFwLT5pX3NiKS0+Ym1hcDsKKwlpbnQgYWN0YWdzLCBpbmFjdGFncywgbDJubDsKKwlzNjQgYWdfcmVtLCBhY3RmcmVlLCBpbmFjdGZyZWUsIGF2Z2ZyZWU7CisJaW50IGksIG47CisKKwkvKgorCSAqICAgICAgZmluYWxpemUgYm1hcCBjb250cm9sIHBhZ2UKKwkgKi8KKy8vZmluYWxpemU6CisJLyogCisJICogY29tcHV0ZSBkYl9hZ3ByZWY6IHByZWZlcnJlZCBhZyB0byBhbGxvY2F0ZSBmcm9tCisJICogKHRoZSBsZWZ0bW9zdCBhZyB3aXRoIGF2ZXJhZ2UgZnJlZSBzcGFjZSBpbiBpdCk7CisJICovCisvL2FncHJlZjoKKwkvKiBnZXQgdGhlIG51bWJlciBvZiBhY3RpdmUgYWdzIGFuZCBpbmFjaXR2ZSBhZ3MgKi8KKwlhY3RhZ3MgPSBibXAtPmRiX21heGFnICsgMTsKKwlpbmFjdGFncyA9IGJtcC0+ZGJfbnVtYWcgLSBhY3RhZ3M7CisJYWdfcmVtID0gYm1wLT5kYl9tYXBzaXplICYgKGJtcC0+ZGJfYWdzaXplIC0gMSk7CS8qID8/PyAqLworCisJLyogZGV0ZXJtaW5lIGhvdyBtYW55IGJsb2NrcyBhcmUgaW4gdGhlIGluYWN0aXZlIGFsbG9jYXRpb24KKwkgKiBncm91cHMuIGluIGRvaW5nIHRoaXMsIHdlIG11c3QgYWNjb3VudCBmb3IgdGhlIGZhY3QgdGhhdAorCSAqIHRoZSByaWdodG1vc3QgZ3JvdXAgbWlnaHQgYmUgYSBwYXJ0aWFsIGdyb3VwIChpLmUuIGZpbGUKKwkgKiBzeXN0ZW0gc2l6ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgZ3JvdXAgc2l6ZSkuCisJICovCisJaW5hY3RmcmVlID0gKGluYWN0YWdzICYmIGFnX3JlbSkgPworCSAgICAoKGluYWN0YWdzIC0gMSkgPDwgYm1wLT5kYl9hZ2wyc2l6ZSkgKyBhZ19yZW0KKwkgICAgOiBpbmFjdGFncyA8PCBibXAtPmRiX2FnbDJzaXplOworCisJLyogZGV0ZXJtaW5lIGhvdyBtYW55IGZyZWUgYmxvY2tzIGFyZSBpbiB0aGUgYWN0aXZlCisJICogYWxsb2NhdGlvbiBncm91cHMgcGx1cyB0aGUgYXZlcmFnZSBudW1iZXIgb2YgZnJlZSBibG9ja3MKKwkgKiB3aXRoaW4gdGhlIGFjdGl2ZSBhZ3MuCisJICovCisJYWN0ZnJlZSA9IGJtcC0+ZGJfbmZyZWUgLSBpbmFjdGZyZWU7CisJYXZnZnJlZSA9ICh1MzIpIGFjdGZyZWUgLyAodTMyKSBhY3RhZ3M7CisKKwkvKiBpZiB0aGUgcHJlZmVycmVkIGFsbG9jYXRpb24gZ3JvdXAgaGFzIG5vdCBhdmVyYWdlIGZyZWUgc3BhY2UuCisJICogcmUtZXN0YWJsaXNoIHRoZSBwcmVmZXJyZWQgZ3JvdXAgYXMgdGhlIGxlZnRtb3N0CisJICogZ3JvdXAgd2l0aCBhdmVyYWdlIGZyZWUgc3BhY2UuCisJICovCisJaWYgKGJtcC0+ZGJfYWdmcmVlW2JtcC0+ZGJfYWdwcmVmXSA8IGF2Z2ZyZWUpIHsKKwkJZm9yIChibXAtPmRiX2FncHJlZiA9IDA7IGJtcC0+ZGJfYWdwcmVmIDwgYWN0YWdzOworCQkgICAgIGJtcC0+ZGJfYWdwcmVmKyspIHsKKwkJCWlmIChibXAtPmRiX2FnZnJlZVtibXAtPmRiX2FncHJlZl0gPj0gYXZnZnJlZSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoYm1wLT5kYl9hZ3ByZWYgPj0gYm1wLT5kYl9udW1hZykgeworCQkJamZzX2Vycm9yKGlwYm1hcC0+aV9zYiwKKwkJCQkgICJjYW5ub3QgZmluZCBhZyB3aXRoIGF2ZXJhZ2UgZnJlZXNwYWNlIik7CisJCX0KKwl9CisKKwkvKgorCSAqIGNvbXB1dGUgZGJfYWdsZXZlbCwgZGJfYWdoZWlndGgsIGRiX3dpZHRoLCBkYl9hZ3N0YXJ0OgorCSAqIGFuIGFnIGlzIGNvdmVyZWQgaW4gYWdsZXZlbCBkbWFwY3RsIHN1bW1hcnkgdHJlZSwgCisJICogYXQgYWdoZWlnaHQgbGV2ZWwgaGVpZ2h0IChmcm9tIGxlYWYpIHdpdGggYWd3aWR0aCBudW1iZXIgb2Ygbm9kZXMgCisJICogZWFjaCwgd2hpY2ggc3RhcnRzIGF0IGFnc3RhcnQgaW5kZXggbm9kZSBvZiB0aGUgc21tYXJ5IHRyZWUgbm9kZSAKKwkgKiBhcnJheTsKKwkgKi8KKwlibXAtPmRiX2FnbGV2ZWwgPSBCTUFQU1pUT0xFVihibXAtPmRiX2Fnc2l6ZSk7CisJbDJubCA9CisJICAgIGJtcC0+ZGJfYWdsMnNpemUgLSAoTDJCUEVSRE1BUCArIGJtcC0+ZGJfYWdsZXZlbCAqIEwyTFBFUkNUTCk7CisJYm1wLT5kYl9hZ2hlaWd0aCA9IGwybmwgPj4gMTsKKwlibXAtPmRiX2Fnd2lkdGggPSAxIDw8IChsMm5sIC0gKGJtcC0+ZGJfYWdoZWlndGggPDwgMSkpOworCWZvciAoaSA9IDUgLSBibXAtPmRiX2FnaGVpZ3RoLCBibXAtPmRiX2Fnc3RhcnQgPSAwLCBuID0gMTsgaSA+IDA7CisJICAgICBpLS0pIHsKKwkJYm1wLT5kYl9hZ3N0YXJ0ICs9IG47CisJCW4gPDw9IDI7CisJfQorCit9CisKKworLyoKKyAqIE5BTUU6CWRiSW5pdERtYXAoKS91amZzX2lkbWFwX3BhZ2UoKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogRlVOQ1RJT046CWluaXRpYWxpemUgd29ya2luZy9wZXJzaXN0ZW50IGJpdG1hcCBvZiB0aGUgZG1hcCBwYWdlCisgKgkJZm9yIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJsb2NrczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqCQlhdCBlbnRyeSwgdGhlIGJpdG1hcHMgaGFkIGJlZW4gaW5pdGlhbGl6ZWQgYXMgZnJlZSAoWkVST1MpOworICoJCVRoZSBudW1iZXIgb2YgYmxvY2tzIHdpbGwgb25seSBhY2NvdW50IGZvciB0aGUgYWN0dWFsbHkgCisgKgkJZXhpc3RpbmcgYmxvY2tzLiBCbG9ja3Mgd2hpY2ggZG9uJ3QgYWN0dWFsbHkgZXhpc3QgaW4gCisgKgkJdGhlIGFnZ3JlZ2F0ZSB3aWxsIGJlIG1hcmtlZCBhcyBhbGxvY2F0ZWQgKE9ORVMpOworICoKKyAqIFBBUkFNRVRFUlM6CisgKglkcAktIHBvaW50ZXIgdG8gcGFnZSBvZiBtYXAKKyAqCW5ibG9ja3MJLSBudW1iZXIgb2YgYmxvY2tzIHRoaXMgcGFnZQorICoKKyAqIFJFVFVSTlM6IE5PTkUKKyAqLworc3RhdGljIGludCBkYkluaXREbWFwKHN0cnVjdCBkbWFwICogZHAsIHM2NCBCbGtubywgaW50IG5ibG9ja3MpCit7CisJaW50IGJsa25vLCB3LCBiLCByLCBudywgbmIsIGk7CisKKwkvKiBzdGFydGluZyBibG9jayBudW1iZXIgd2l0aGluIHRoZSBkbWFwICovCisJYmxrbm8gPSBCbGtubyAmIChCUEVSRE1BUCAtIDEpOworCisJaWYgKGJsa25vID09IDApIHsKKwkJZHAtPm5ibG9ja3MgPSBkcC0+bmZyZWUgPSBjcHVfdG9fbGUzMihuYmxvY2tzKTsKKwkJZHAtPnN0YXJ0ID0gY3B1X3RvX2xlNjQoQmxrbm8pOworCisJCWlmIChuYmxvY2tzID09IEJQRVJETUFQKSB7CisJCQltZW1zZXQoJmRwLT53bWFwWzBdLCAwLCBMUEVSRE1BUCAqIDQpOworCQkJbWVtc2V0KCZkcC0+cG1hcFswXSwgMCwgTFBFUkRNQVAgKiA0KTsKKwkJCWdvdG8gaW5pdFRyZWU7CisJCX0KKwl9IGVsc2UgeworCQlkcC0+bmJsb2NrcyA9CisJCSAgICBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdShkcC0+bmJsb2NrcykgKyBuYmxvY2tzKTsKKwkJZHAtPm5mcmVlID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoZHAtPm5mcmVlKSArIG5ibG9ja3MpOworCX0KKworCS8qIHdvcmQgbnVtYmVyIGNvbnRhaW5pbmcgc3RhcnQgYmxvY2sgbnVtYmVyICovCisJdyA9IGJsa25vID4+IEwyREJXT1JEOworCisJLyoKKwkgKiBmcmVlIHRoZSBiaXRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJsb2NrIHJhbmdlIChaRVJPUyk6CisJICogbm90ZTogbm90IGFsbCBiaXRzIG9mIHRoZSBmaXJzdCBhbmQgbGFzdCB3b3JkcyBtYXkgYmUgY29udGFpbmVkIAorCSAqIHdpdGhpbiB0aGUgYmxvY2sgcmFuZ2UuCisJICovCisJZm9yIChyID0gbmJsb2NrczsgciA+IDA7IHIgLT0gbmIsIGJsa25vICs9IG5iKSB7CisJCS8qIG51bWJlciBvZiBiaXRzIHByZWNlZGluZyByYW5nZSB0byBiZSBmcmVlZCBpbiB0aGUgd29yZCAqLworCQliID0gYmxrbm8gJiAoREJXT1JEIC0gMSk7CisJCS8qIG51bWJlciBvZiBiaXRzIHRvIGZyZWUgaW4gdGhlIHdvcmQgKi8KKwkJbmIgPSBtaW4ociwgREJXT1JEIC0gYik7CisKKwkJLyogaXMgcGFydGlhbCB3b3JkIHRvIGJlIGZyZWVkID8gKi8KKwkJaWYgKG5iIDwgREJXT1JEKSB7CisJCQkvKiBmcmVlIChzZXQgdG8gMCkgZnJvbSB0aGUgYml0bWFwIHdvcmQgKi8KKwkJCWRwLT53bWFwW3ddICY9IGNwdV90b19sZTMyKH4oT05FUyA8PCAoREJXT1JEIC0gbmIpCisJCQkJCQkgICAgID4+IGIpKTsKKwkJCWRwLT5wbWFwW3ddICY9IGNwdV90b19sZTMyKH4oT05FUyA8PCAoREJXT1JEIC0gbmIpCisJCQkJCQkgICAgID4+IGIpKTsKKworCQkJLyogc2tpcCB0aGUgd29yZCBmcmVlZCAqLworCQkJdysrOworCQl9IGVsc2UgeworCQkJLyogZnJlZSAoc2V0IHRvIDApIGNvbnRpZ3VvdXMgYml0bWFwIHdvcmRzICovCisJCQludyA9IHIgPj4gTDJEQldPUkQ7CisJCQltZW1zZXQoJmRwLT53bWFwW3ddLCAwLCBudyAqIDQpOworCQkJbWVtc2V0KCZkcC0+cG1hcFt3XSwgMCwgbncgKiA0KTsKKworCQkJLyogc2tpcCB0aGUgd29yZHMgZnJlZWQgKi8KKwkJCW5iID0gbncgPDwgTDJEQldPUkQ7CisJCQl3ICs9IG53OworCQl9CisJfQorCisJLyoKKwkgKiBtYXJrIGJpdHMgZm9sbG93aW5nIHRoZSByYW5nZSB0byBiZSBmcmVlZCAobm9uLWV4aXN0aW5nIAorCSAqIGJsb2NrcykgYXMgYWxsb2NhdGVkIChPTkVTKQorCSAqLworCisJaWYgKGJsa25vID09IEJQRVJETUFQKQorCQlnb3RvIGluaXRUcmVlOworCisJLyogdGhlIGZpcnN0IHdvcmQgYmV5b25kIHRoZSBlbmQgb2YgZXhpc3RpbmcgYmxvY2tzICovCisJdyA9IGJsa25vID4+IEwyREJXT1JEOworCisJLyogZG9lcyBuYmxvY2tzIGZhbGwgb24gYSAzMi1iaXQgYm91bmRhcnkgPyAqLworCWIgPSBibGtubyAmIChEQldPUkQgLSAxKTsKKwlpZiAoYikgeworCQkvKiBtYXJrIGEgcGFydGlhbCB3b3JkIGFsbG9jYXRlZCAqLworCQlkcC0+d21hcFt3XSA9IGRwLT5wbWFwW3ddID0gY3B1X3RvX2xlMzIoT05FUyA+PiBiKTsKKwkJdysrOworCX0KKworCS8qIHNldCB0aGUgcmVzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHBhZ2UgdG8gYWxsb2NhdGVkIChPTkVTKSAqLworCWZvciAoaSA9IHc7IGkgPCBMUEVSRE1BUDsgaSsrKQorCQlkcC0+cG1hcFtpXSA9IGRwLT53bWFwW2ldID0gY3B1X3RvX2xlMzIoT05FUyk7CisKKwkvKgorCSAqIGluaXQgdHJlZQorCSAqLworICAgICAgaW5pdFRyZWU6CisJcmV0dXJuIChkYkluaXREbWFwVHJlZShkcCkpOworfQorCisKKy8qCisgKiBOQU1FOglkYkluaXREbWFwVHJlZSgpL3VqZnNfY29tcGxldGVfZG1hcCgpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBGVU5DVElPTjoJaW5pdGlhbGl6ZSBzdW1tYXJ5IHRyZWUgb2YgdGhlIHNwZWNpZmllZCBkbWFwOgorICoKKyAqCQlhdCBlbnRyeSwgYml0bWFwIG9mIHRoZSBkbWFwIGhhcyBiZWVuIGluaXRpYWxpemVkOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogUEFSQU1FVEVSUzoKKyAqCWRwCS0gZG1hcCB0byBjb21wbGV0ZQorICoJYmxrbm8JLSBzdGFydGluZyBibG9jayBudW1iZXIgZm9yIHRoaXMgZG1hcAorICoJdHJlZW1heAktIHdpbGwgYmUgZmlsbGVkIGluIHdpdGggbWF4IGZyZWUgZm9yIHRoaXMgZG1hcAorICoKKyAqIFJFVFVSTlM6CW1heCBmcmVlIHN0cmluZyBhdCB0aGUgcm9vdCBvZiB0aGUgdHJlZQorICovCitzdGF0aWMgaW50IGRiSW5pdERtYXBUcmVlKHN0cnVjdCBkbWFwICogZHApCit7CisJc3RydWN0IGRtYXB0cmVlICp0cDsKKwlzOCAqY3A7CisJaW50IGk7CisKKwkvKiBpbml0IGZpeGVkIGluZm8gb2YgdHJlZSAqLworCXRwID0gJmRwLT50cmVlOworCXRwLT5ubGVhZnMgPSBjcHVfdG9fbGUzMihMUEVSRE1BUCk7CisJdHAtPmwybmxlYWZzID0gY3B1X3RvX2xlMzIoTDJMUEVSRE1BUCk7CisJdHAtPmxlYWZpZHggPSBjcHVfdG9fbGUzMihMRUFGSU5EKTsKKwl0cC0+aGVpZ2h0ID0gY3B1X3RvX2xlMzIoNCk7CisJdHAtPmJ1ZG1pbiA9IEJVRE1JTjsKKworCS8qIGluaXQgZWFjaCBsZWFmIGZyb20gY29ycmVzcG9uZGluZyB3bWFwIHdvcmQ6CisJICogbm90ZTogbGVhZiBpcyBzZXQgdG8gTk9GUkVFKC0xKSBpZiBhbGwgYmxvY2tzIG9mIGNvcnJlc3BvbmRpbmcKKwkgKiBiaXRtYXAgd29yZCBhcmUgYWxsb2NhdGVkLiAKKwkgKi8KKwljcCA9IHRwLT5zdHJlZSArIGxlMzJfdG9fY3B1KHRwLT5sZWFmaWR4KTsKKwlmb3IgKGkgPSAwOyBpIDwgTFBFUkRNQVA7IGkrKykKKwkJKmNwKysgPSBkYk1heEJ1ZCgodTggKikgJiBkcC0+d21hcFtpXSk7CisKKwkvKiBidWlsZCB0aGUgZG1hcCdzIGJpbmFyeSBidWRkeSBzdW1tYXJ5IHRyZWUgKi8KKwlyZXR1cm4gKGRiSW5pdFRyZWUodHApKTsKK30KKworCisvKgorICogTkFNRToJZGJJbml0VHJlZSgpL3VqZnNfYWRqdHJlZSgpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBGVU5DVElPTjoJaW5pdGlhbGl6ZSBiaW5hcnkgYnVkZHkgc3VtbWFyeSB0cmVlIG9mIGEgZG1hcCBvciBkbWFwY3RsLgorICoKKyAqCQlhdCBlbnRyeSwgdGhlIGxlYXZlcyBvZiB0aGUgdHJlZSBoYXMgYmVlbiBpbml0aWFsaXplZCAKKyAqCQlmcm9tIGNvcnJlc3BvbmRpbmcgYml0bWFwIHdvcmQgb3Igcm9vdCBvZiBzdW1tYXJ5IHRyZWUKKyAqCQlvZiB0aGUgY2hpbGQgY29udHJvbCBwYWdlOworICoJCWNvbmZpZ3VyZSBiaW5hcnkgYnVkZHkgc3lzdGVtIGF0IHRoZSBsZWFmIGxldmVsLCB0aGVuCisgKgkJYnViYmxlIHVwIHRoZSB2YWx1ZXMgb2YgdGhlIGxlYWYgbm9kZXMgdXAgdGhlIHRyZWUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqCWNwCS0gUG9pbnRlciB0byB0aGUgcm9vdCBvZiB0aGUgdHJlZQorICoJbDJsZWF2ZXMtIE51bWJlciBvZiBsZWFmIG5vZGVzIGFzIGEgcG93ZXIgb2YgMgorICoJbDJtaW4JLSBOdW1iZXIgb2YgYmxvY2tzIHRoYXQgY2FuIGJlIGNvdmVyZWQgYnkgYSBsZWFmCisgKgkJICBhcyBhIHBvd2VyIG9mIDIKKyAqCisgKiBSRVRVUk5TOiBtYXggZnJlZSBzdHJpbmcgYXQgdGhlIHJvb3Qgb2YgdGhlIHRyZWUKKyAqLworc3RhdGljIGludCBkYkluaXRUcmVlKHN0cnVjdCBkbWFwdHJlZSAqIGR0cCkKK3sKKwlpbnQgbDJtYXgsIGwyZnJlZSwgYnNpemUsIG5leHRiLCBpOworCWludCBjaGlsZCwgcGFyZW50LCBucGFyZW50OworCXM4ICp0cCwgKmNwLCAqY3AxOworCisJdHAgPSBkdHAtPnN0cmVlOworCisJLyogRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIGZyZWUgc3RyaW5nIHBvc3NpYmxlIGZvciB0aGUgbGVhdmVzICovCisJbDJtYXggPSBsZTMyX3RvX2NwdShkdHAtPmwybmxlYWZzKSArIGR0cC0+YnVkbWluOworCisJLyoKKwkgKiBjb25maWd1cmUgdGhlIGxlYWYgbGV2ZXZsIGludG8gYmluYXJ5IGJ1ZGR5IHN5c3RlbQorCSAqCisJICogVHJ5IHRvIGNvbWJpbmUgYnVkZGllcyBzdGFydGluZyB3aXRoIGEgYnVkZHkgc2l6ZSBvZiAxIAorCSAqIChpLmUuIHR3byBsZWF2ZXMpLiBBdCBhIGJ1ZGR5IHNpemUgb2YgMSB0d28gYnVkZHkgbGVhdmVzIAorCSAqIGNhbiBiZSBjb21iaW5lZCBpZiBib3RoIGJ1ZGRpZXMgaGF2ZSBhIG1heGltdW0gZnJlZSBvZiBsMm1pbjsgCisJICogdGhlIGNvbWJpbmF0aW9uIHdpbGwgcmVzdWx0IGluIHRoZSBsZWZ0LW1vc3QgYnVkZHkgbGVhZiBoYXZpbmcgCisJICogYSBtYXhpbXVtIGZyZWUgb2YgbDJtaW4rMS4gIAorCSAqIEFmdGVyIHByb2Nlc3NpbmcgYWxsIGJ1ZGRpZXMgZm9yIGEgZ2l2ZW4gc2l6ZSwgcHJvY2VzcyBidWRkaWVzIAorCSAqIGF0IHRoZSBuZXh0IGhpZ2hlciBidWRkeSBzaXplIChpLmUuIGN1cnJlbnQgc2l6ZSAqIDIpIGFuZCAKKwkgKiB0aGUgbmV4dCBtYXhpbXVtIGZyZWUgKGN1cnJlbnQgZnJlZSArIDEpLiAgCisJICogVGhpcyBjb250aW51ZXMgdW50aWwgdGhlIG1heGltdW0gcG9zc2libGUgYnVkZHkgY29tYmluYXRpb24gCisJICogeWllbGRzIG1heGltdW0gZnJlZS4KKwkgKi8KKwlmb3IgKGwyZnJlZSA9IGR0cC0+YnVkbWluLCBic2l6ZSA9IDE7IGwyZnJlZSA8IGwybWF4OworCSAgICAgbDJmcmVlKyssIGJzaXplID0gbmV4dGIpIHsKKwkJLyogZ2V0IG5leHQgYnVkZHkgc2l6ZSA9PSBjdXJyZW50IGJ1ZGR5IHBhaXIgc2l6ZSAqLworCQluZXh0YiA9IGJzaXplIDw8IDE7CisKKwkJLyogc2NhbiBlYWNoIGFkamFjZW50IGJ1ZGR5IHBhaXIgYXQgY3VycmVudCBidWRkeSBzaXplICovCisJCWZvciAoaSA9IDAsIGNwID0gdHAgKyBsZTMyX3RvX2NwdShkdHAtPmxlYWZpZHgpOworCQkgICAgIGkgPCBsZTMyX3RvX2NwdShkdHAtPm5sZWFmcyk7CisJCSAgICAgaSArPSBuZXh0YiwgY3AgKz0gbmV4dGIpIHsKKwkJCS8qIGNvYWxlc2NlIGlmIGJvdGggYWRqYWNlbnQgYnVkZGllcyBhcmUgbWF4IGZyZWUgKi8KKwkJCWlmICgqY3AgPT0gbDJmcmVlICYmICooY3AgKyBic2l6ZSkgPT0gbDJmcmVlKSB7CisJCQkJKmNwID0gbDJmcmVlICsgMTsJLyogbGVmdCB0YWtlIHJpZ2h0ICovCisJCQkJKihjcCArIGJzaXplKSA9IC0xOwkvKiByaWdodCBnaXZlIGxlZnQgKi8KKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogYnViYmxlIHN1bW1hcnkgaW5mb3JtYXRpb24gb2YgbGVhdmVzIHVwIHRoZSB0cmVlLgorCSAqCisJICogU3RhcnRpbmcgYXQgdGhlIGxlYWYgbm9kZSBsZXZlbCwgdGhlIGZvdXIgbm9kZXMgZGVzY3JpYmVkIGJ5CisJICogdGhlIGhpZ2hlciBsZXZlbCBwYXJlbnQgbm9kZSBhcmUgY29tcGFyZWQgZm9yIGEgbWF4aW11bSBmcmVlIGFuZCAKKwkgKiB0aGlzIG1heGltdW0gYmVjb21lcyB0aGUgdmFsdWUgb2YgdGhlIHBhcmVudCBub2RlLiAgCisJICogd2hlbiBhbGwgbG93ZXIgbGV2ZWwgbm9kZXMgYXJlIHByb2Nlc3NlZCBpbiB0aGlzIGZhc2hpb24gdGhlbiAKKwkgKiBtb3ZlIHVwIHRvIHRoZSBuZXh0IGxldmVsIChwYXJlbnQgYmVjb21lcyBhIGxvd2VyIGxldmVsIG5vZGUpIGFuZCAKKwkgKiBjb250aW51ZSB0aGUgcHJvY2VzcyBmb3IgdGhhdCBsZXZlbC4KKwkgKi8KKwlmb3IgKGNoaWxkID0gbGUzMl90b19jcHUoZHRwLT5sZWFmaWR4KSwKKwkgICAgIG5wYXJlbnQgPSBsZTMyX3RvX2NwdShkdHAtPm5sZWFmcykgPj4gMjsKKwkgICAgIG5wYXJlbnQgPiAwOyBucGFyZW50ID4+PSAyLCBjaGlsZCA9IHBhcmVudCkgeworCQkvKiBnZXQgaW5kZXggb2YgMXN0IG5vZGUgb2YgcGFyZW50IGxldmVsICovCisJCXBhcmVudCA9IChjaGlsZCAtIDEpID4+IDI7CisKKwkJLyogc2V0IHRoZSB2YWx1ZSBvZiB0aGUgcGFyZW50IG5vZGUgYXMgdGhlIG1heGltdW0gCisJCSAqIG9mIHRoZSBmb3VyIG5vZGVzIG9mIHRoZSBjdXJyZW50IGxldmVsLgorCQkgKi8KKwkJZm9yIChpID0gMCwgY3AgPSB0cCArIGNoaWxkLCBjcDEgPSB0cCArIHBhcmVudDsKKwkJICAgICBpIDwgbnBhcmVudDsgaSsrLCBjcCArPSA0LCBjcDErKykKKwkJCSpjcDEgPSBUUkVFTUFYKGNwKTsKKwl9CisKKwlyZXR1cm4gKCp0cCk7Cit9CisKKworLyoKKyAqCWRiSW5pdERtYXBDdGwoKQorICoKKyAqIGZ1bmN0aW9uOiBpbml0aWFsaXplIGRtYXBjdGwgcGFnZQorICovCitzdGF0aWMgaW50IGRiSW5pdERtYXBDdGwoc3RydWN0IGRtYXBjdGwgKiBkY3AsIGludCBsZXZlbCwgaW50IGkpCit7CQkJCS8qIHN0YXJ0IGxlYWYgaW5kZXggbm90IGNvdmVyZWQgYnkgcmFuZ2UgKi8KKwlzOCAqY3A7CisKKwlkY3AtPm5sZWFmcyA9IGNwdV90b19sZTMyKExQRVJDVEwpOworCWRjcC0+bDJubGVhZnMgPSBjcHVfdG9fbGUzMihMMkxQRVJDVEwpOworCWRjcC0+bGVhZmlkeCA9IGNwdV90b19sZTMyKENUTExFQUZJTkQpOworCWRjcC0+aGVpZ2h0ID0gY3B1X3RvX2xlMzIoNSk7CisJZGNwLT5idWRtaW4gPSBMMkJQRVJETUFQICsgTDJMUEVSQ1RMICogbGV2ZWw7CisKKwkvKgorCSAqIGluaXRpYWxpemUgdGhlIGxlYXZlcyBvZiBjdXJyZW50IGxldmVsIHRoYXQgd2VyZSBub3QgY292ZXJlZCAKKwkgKiBieSB0aGUgc3BlY2lmaWVkIGlucHV0IGJsb2NrIHJhbmdlIChpLmUuIHRoZSBsZWF2ZXMgaGF2ZSBubyAKKwkgKiBsb3cgbGV2ZWwgZG1hcGN0bCBvciBkbWFwKS4KKwkgKi8KKwljcCA9ICZkY3AtPnN0cmVlW0NUTExFQUZJTkQgKyBpXTsKKwlmb3IgKDsgaSA8IExQRVJDVEw7IGkrKykKKwkJKmNwKysgPSBOT0ZSRUU7CisKKwkvKiBidWlsZCB0aGUgZG1hcCdzIGJpbmFyeSBidWRkeSBzdW1tYXJ5IHRyZWUgKi8KKwlyZXR1cm4gKGRiSW5pdFRyZWUoKHN0cnVjdCBkbWFwdHJlZSAqKSBkY3ApKTsKK30KKworCisvKgorICogTkFNRToJZGJHZXRMMkFHU2l6ZSgpL3VqZnNfZ2V0YWdsMnNpemUoKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogRlVOQ1RJT046CURldGVybWluZSBsb2cyKGFsbG9jYXRpb24gZ3JvdXAgc2l6ZSkgZnJvbSBhZ2dyZWdhdGUgc2l6ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogUEFSQU1FVEVSUzoKKyAqCW5ibG9ja3MJLSBOdW1iZXIgb2YgYmxvY2tzIGluIGFnZ3JlZ2F0ZQorICoKKyAqIFJFVFVSTlM6IGxvZzIoYWxsb2NhdGlvbiBncm91cCBzaXplKSBpbiBhZ2dyZWdhdGUgYmxvY2tzCisgKi8KK3N0YXRpYyBpbnQgZGJHZXRMMkFHU2l6ZShzNjQgbmJsb2NrcykKK3sKKwlzNjQgc3o7CisJczY0IG07CisJaW50IGwyc3o7CisKKwlpZiAobmJsb2NrcyA8IEJQRVJETUFQICogTUFYQUcpCisJCXJldHVybiAoTDJCUEVSRE1BUCk7CisKKwkvKiByb3VuZCB1cCBhZ2dyZWdhdGUgc2l6ZSB0byBwb3dlciBvZiAyICovCisJbSA9ICgodTY0KSAxIDw8ICg2NCAtIDEpKTsKKwlmb3IgKGwyc3ogPSA2NDsgbDJzeiA+PSAwOyBsMnN6LS0sIG0gPj49IDEpIHsKKwkJaWYgKG0gJiBuYmxvY2tzKQorCQkJYnJlYWs7CisJfQorCisJc3ogPSAoczY0KSAxIDw8IGwyc3o7CisJaWYgKHN6IDwgbmJsb2NrcykKKwkJbDJzeiArPSAxOworCisJLyogYWdzaXplID0gcm91bmR1cFNpemUvbWF4X251bWJlcl9vZl9hZyAqLworCXJldHVybiAobDJzeiAtIEwyTUFYQUcpOworfQorCisKKy8qCisgKiBOQU1FOglkYk1hcEZpbGVTaXplVG9NYXBTaXplKCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEZVTkNUSU9OOgljb21wdXRlIG51bWJlciBvZiBibG9ja3MgdGhlIGJsb2NrIGFsbG9jYXRpb24gbWFwIGZpbGUgCisgKgkJY2FuIGNvdmVyIGZyb20gdGhlIG1hcCBmaWxlIHNpemU7CisgKgorICogUkVUVVJOUzoJTnVtYmVyIG9mIGJsb2NrcyB3aGljaCBjYW4gYmUgY292ZXJlZCBieSB0aGlzIGJsb2NrIG1hcCBmaWxlOworICovCisKKy8qCisgKiBtYXhpbXVtIG51bWJlciBvZiBtYXAgcGFnZXMgYXQgZWFjaCBsZXZlbCBpbmNsdWRpbmcgY29udHJvbCBwYWdlcworICovCisjZGVmaW5lIE1BWEwwUEFHRVMJKDEgKyBMUEVSQ1RMKQorI2RlZmluZSBNQVhMMVBBR0VTCSgxICsgTFBFUkNUTCAqIE1BWEwwUEFHRVMpCisjZGVmaW5lIE1BWEwyUEFHRVMJKDEgKyBMUEVSQ1RMICogTUFYTDFQQUdFUykKKworLyoKKyAqIGNvbnZlcnQgbnVtYmVyIG9mIG1hcCBwYWdlcyB0byB0aGUgemVybyBvcmlnaW4gdG9wIGRtYXBjdGwgbGV2ZWwKKyAqLworI2RlZmluZSBCTUFQUEdUT0xFVihucGFnZXMpCVwKKwkoKChucGFnZXMpIDw9IDMgKyBNQVhMMFBBR0VTKSA/IDAgXAorICAgICAgIDogKChucGFnZXMpIDw9IDIgKyBNQVhMMVBBR0VTKSA/IDEgOiAyKQorCitzNjQgZGJNYXBGaWxlU2l6ZVRvTWFwU2l6ZShzdHJ1Y3QgaW5vZGUgKiBpcGJtYXApCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlwYm1hcC0+aV9zYjsKKwlzNjQgbmJsb2NrczsKKwlzNjQgbnBhZ2VzLCBuZG1hcHM7CisJaW50IGxldmVsLCBpOworCWludCBjb21wbGV0ZSwgZmFjdG9yOworCisJbmJsb2NrcyA9IGlwYm1hcC0+aV9zaXplID4+IEpGU19TQkkoc2IpLT5sMmJzaXplOworCW5wYWdlcyA9IG5ibG9ja3MgPj4gSkZTX1NCSShzYiktPmwybmJwZXJwYWdlOworCWxldmVsID0gQk1BUFBHVE9MRVYobnBhZ2VzKTsKKworCS8qIEF0IGVhY2ggbGV2ZWwsIGFjY3VtdWxhdGUgdGhlIG51bWJlciBvZiBkbWFwIHBhZ2VzIGNvdmVyZWQgYnkgCisJICogdGhlIG51bWJlciBvZiBmdWxsIGNoaWxkIGxldmVscyBiZWxvdyBpdDsKKwkgKiByZXBlYXQgZm9yIHRoZSBsYXN0IGluY29tcGxldGUgY2hpbGQgbGV2ZWwuCisJICovCisJbmRtYXBzID0gMDsKKwlucGFnZXMtLTsJCS8qIHNraXAgdGhlIGZpcnN0IGdsb2JhbCBjb250cm9sIHBhZ2UgKi8KKwkvKiBza2lwIGhpZ2hlciBsZXZlbCBjb250cm9sIHBhZ2VzIGFib3ZlIHRvcCBsZXZlbCBjb3ZlcmVkIGJ5IG1hcCAqLworCW5wYWdlcyAtPSAoMiAtIGxldmVsKTsKKwlucGFnZXMtLTsJCS8qIHNraXAgdG9wIGxldmVsJ3MgY29udHJvbCBwYWdlICovCisJZm9yIChpID0gbGV2ZWw7IGkgPj0gMDsgaS0tKSB7CisJCWZhY3RvciA9CisJCSAgICAoaSA9PSAyKSA/IE1BWEwxUEFHRVMgOiAoKGkgPT0gMSkgPyBNQVhMMFBBR0VTIDogMSk7CisJCWNvbXBsZXRlID0gKHUzMikgbnBhZ2VzIC8gZmFjdG9yOworCQluZG1hcHMgKz0gY29tcGxldGUgKiAoKGkgPT0gMikgPyBMUEVSQ1RMICogTFBFUkNUTAorCQkJCSAgICAgIDogKChpID09IDEpID8gTFBFUkNUTCA6IDEpKTsKKworCQkvKiBwYWdlcyBpbiBsYXN0L2luY29tcGxldGUgY2hpbGQgKi8KKwkJbnBhZ2VzID0gKHUzMikgbnBhZ2VzICUgZmFjdG9yOworCQkvKiBza2lwIGluY29tcGxldGUgY2hpbGQncyBsZXZlbCBjb250cm9sIHBhZ2UgKi8KKwkJbnBhZ2VzLS07CisJfQorCisJLyogY29udmVydCB0aGUgbnVtYmVyIG9mIGRtYXBzIGludG8gdGhlIG51bWJlciBvZiBibG9ja3MgCisJICogd2hpY2ggY2FuIGJlIGNvdmVyZWQgYnkgdGhlIGRtYXBzOworCSAqLworCW5ibG9ja3MgPSBuZG1hcHMgPDwgTDJCUEVSRE1BUDsKKworCXJldHVybiAobmJsb2Nrcyk7Cit9CisKKworI2lmZGVmCV9KRlNfREVCVUdfRE1BUAorLyoKKyAqCURCaW5pdG1hcCgpCisgKi8KK3N0YXRpYyB2b2lkIERCaW5pdG1hcChzNjQgc2l6ZSwgc3RydWN0IGlub2RlICppcGJtYXAsIHUzMiAqKiByZXN1bHRzKQoreworCWludCBucGFnZXM7CisJdTMyICpkYm1hcCwgKmQ7CisJaW50IG47CisJczY0IGxibGtubywgY3VyX2Jsb2NrOworCXN0cnVjdCBkbWFwICpkcDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCisJbnBhZ2VzID0gc2l6ZSAvIDMyNzY4OworCW5wYWdlcyArPSAoc2l6ZSAlIDMyNzY4KSA/IDEgOiAwOworCisJZGJtYXAgPSAodTMyICopIHhtYWxsb2MobnBhZ2VzICogNDA5NiwgTDJQU0laRSwga2VybmVsX2hlYXApOworCWlmIChkYm1hcCA9PSBOVUxMKQorCQlCVUcoKTsJLyogTm90IHJvYnVzdCBzaW5jZSB0aGlzIGlzIG9ubHkgdW51c2VkIGRlYnVnIGNvZGUgKi8KKworCWZvciAobiA9IDAsIGQgPSBkYm1hcDsgbiA8IG5wYWdlczsgbisrLCBkICs9IDEwMjQpCisJCWJ6ZXJvKGQsIDQwOTYpOworCisJLyogTmVlZCB0byBpbml0aWFsaXplIGZyb20gZGlzayBtYXAgcGFnZXMKKwkgKi8KKwlmb3IgKGQgPSBkYm1hcCwgY3VyX2Jsb2NrID0gMDsgY3VyX2Jsb2NrIDwgc2l6ZTsKKwkgICAgIGN1cl9ibG9jayArPSBCUEVSRE1BUCwgZCArPSBMUEVSRE1BUCkgeworCQlsYmxrbm8gPSBCTEtUT0RNQVAoY3VyX2Jsb2NrLAorCQkJCSAgIEpGU19TQkkoaXBibWFwLT5pX3NiKS0+Ym1hcC0+CisJCQkJICAgZGJfbDJuYnBlcnBhZ2UpOworCQltcCA9IHJlYWRfbWV0YXBhZ2UoaXBibWFwLCBsYmxrbm8sIFBTSVpFLCAwKTsKKwkJaWYgKG1wID09IE5VTEwpIHsKKwkJCWpmc19lcnJvcihpcGJtYXAtPmlfc2IsCisJCQkJICAiREJpbml0bWFwOiBjb3VsZCBub3QgcmVhZCBkaXNrIG1hcCBwYWdlIik7CisJCQljb250aW51ZTsKKwkJfQorCQlkcCA9IChzdHJ1Y3QgZG1hcCAqKSBtcC0+ZGF0YTsKKworCQlmb3IgKG4gPSAwOyBuIDwgTFBFUkRNQVA7IG4rKykKKwkJCWRbbl0gPSBsZTMyX3RvX2NwdShkcC0+d21hcFtuXSk7CisKKwkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJfQorCisJKnJlc3VsdHMgPSBkYm1hcDsKK30KKworCisvKgorICoJREJBbGxvYygpCisgKi8KK3ZvaWQgREJBbGxvYyh1aW50ICogZGJtYXAsIHM2NCBtYXBzaXplLCBzNjQgYmxrbm8sIHM2NCBuYmxvY2tzKQoreworCWludCB3b3JkLCBuYiwgYml0bm87CisJdTMyIG1hc2s7CisKKwlhc3NlcnQoYmxrbm8gPiAwICYmIGJsa25vIDwgbWFwc2l6ZSk7CisJYXNzZXJ0KG5ibG9ja3MgPiAwICYmIG5ibG9ja3MgPD0gbWFwc2l6ZSk7CisKKwlhc3NlcnQoYmxrbm8gKyBuYmxvY2tzIDw9IG1hcHNpemUpOworCisJZGJtYXAgKz0gKGJsa25vIC8gMzIpOworCXdoaWxlIChuYmxvY2tzID4gMCkgeworCQliaXRubyA9IGJsa25vICYgKDMyIC0gMSk7CisJCW5iID0gbWluKG5ibG9ja3MsIDMyIC0gYml0bm8pOworCisJCW1hc2sgPSAoMHhmZmZmZmZmZiA8PCAoMzIgLSBuYikgPj4gYml0bm8pOworCQlhc3NlcnQoKG1hc2sgJiAqZGJtYXApID09IDApOworCQkqZGJtYXAgfD0gbWFzazsKKworCQlkYm1hcCsrOworCQlibGtubyArPSBuYjsKKwkJbmJsb2NrcyAtPSBuYjsKKwl9Cit9CisKKworLyoKKyAqCURCRnJlZSgpCisgKi8KK3N0YXRpYyB2b2lkIERCRnJlZSh1aW50ICogZGJtYXAsIHM2NCBtYXBzaXplLCBzNjQgYmxrbm8sIHM2NCBuYmxvY2tzKQoreworCWludCB3b3JkLCBuYiwgYml0bm87CisJdTMyIG1hc2s7CisKKwlhc3NlcnQoYmxrbm8gPiAwICYmIGJsa25vIDwgbWFwc2l6ZSk7CisJYXNzZXJ0KG5ibG9ja3MgPiAwICYmIG5ibG9ja3MgPD0gbWFwc2l6ZSk7CisKKwlhc3NlcnQoYmxrbm8gKyBuYmxvY2tzIDw9IG1hcHNpemUpOworCisJZGJtYXAgKz0gKGJsa25vIC8gMzIpOworCXdoaWxlIChuYmxvY2tzID4gMCkgeworCQliaXRubyA9IGJsa25vICYgKDMyIC0gMSk7CisJCW5iID0gbWluKG5ibG9ja3MsIDMyIC0gYml0bm8pOworCisJCW1hc2sgPSAoMHhmZmZmZmZmZiA8PCAoMzIgLSBuYikgPj4gYml0bm8pOworCQlhc3NlcnQoKG1hc2sgJiAqZGJtYXApID09IG1hc2spOworCQkqZGJtYXAgJj0gfm1hc2s7CisKKwkJZGJtYXArKzsKKwkJYmxrbm8gKz0gbmI7CisJCW5ibG9ja3MgLT0gbmI7CisJfQorfQorCisKKy8qCisgKglEQkFsbG9jQ0soKQorICovCitzdGF0aWMgdm9pZCBEQkFsbG9jQ0sodWludCAqIGRibWFwLCBzNjQgbWFwc2l6ZSwgczY0IGJsa25vLCBzNjQgbmJsb2NrcykKK3sKKwlpbnQgd29yZCwgbmIsIGJpdG5vOworCXUzMiBtYXNrOworCisJYXNzZXJ0KGJsa25vID4gMCAmJiBibGtubyA8IG1hcHNpemUpOworCWFzc2VydChuYmxvY2tzID4gMCAmJiBuYmxvY2tzIDw9IG1hcHNpemUpOworCisJYXNzZXJ0KGJsa25vICsgbmJsb2NrcyA8PSBtYXBzaXplKTsKKworCWRibWFwICs9IChibGtubyAvIDMyKTsKKwl3aGlsZSAobmJsb2NrcyA+IDApIHsKKwkJYml0bm8gPSBibGtubyAmICgzMiAtIDEpOworCQluYiA9IG1pbihuYmxvY2tzLCAzMiAtIGJpdG5vKTsKKworCQltYXNrID0gKDB4ZmZmZmZmZmYgPDwgKDMyIC0gbmIpID4+IGJpdG5vKTsKKwkJYXNzZXJ0KChtYXNrICYgKmRibWFwKSA9PSBtYXNrKTsKKworCQlkYm1hcCsrOworCQlibGtubyArPSBuYjsKKwkJbmJsb2NrcyAtPSBuYjsKKwl9Cit9CisKKworLyoKKyAqCURCRnJlZUNLKCkKKyAqLworc3RhdGljIHZvaWQgREJGcmVlQ0sodWludCAqIGRibWFwLCBzNjQgbWFwc2l6ZSwgczY0IGJsa25vLCBzNjQgbmJsb2NrcykKK3sKKwlpbnQgd29yZCwgbmIsIGJpdG5vOworCXUzMiBtYXNrOworCisJYXNzZXJ0KGJsa25vID4gMCAmJiBibGtubyA8IG1hcHNpemUpOworCWFzc2VydChuYmxvY2tzID4gMCAmJiBuYmxvY2tzIDw9IG1hcHNpemUpOworCisJYXNzZXJ0KGJsa25vICsgbmJsb2NrcyA8PSBtYXBzaXplKTsKKworCWRibWFwICs9IChibGtubyAvIDMyKTsKKwl3aGlsZSAobmJsb2NrcyA+IDApIHsKKwkJYml0bm8gPSBibGtubyAmICgzMiAtIDEpOworCQluYiA9IG1pbihuYmxvY2tzLCAzMiAtIGJpdG5vKTsKKworCQltYXNrID0gKDB4ZmZmZmZmZmYgPDwgKDMyIC0gbmIpID4+IGJpdG5vKTsKKwkJYXNzZXJ0KChtYXNrICYgKmRibWFwKSA9PSAwKTsKKworCQlkYm1hcCsrOworCQlibGtubyArPSBuYjsKKwkJbmJsb2NrcyAtPSBuYjsKKwl9Cit9CisKKworLyoKKyAqCWRiUHJ0TWFwKCkKKyAqLworc3RhdGljIHZvaWQgZGJQcnRNYXAoc3RydWN0IGJtYXAgKiBibXApCit7CisJcHJpbnRrKCIgICBtYXBzaXplOiAgICVkJWRcbiIsIGJtcC0+ZGJfbWFwc2l6ZSk7CisJcHJpbnRrKCIgICBuZnJlZTogICAgICVkJWRcbiIsIGJtcC0+ZGJfbmZyZWUpOworCXByaW50aygiICAgbnVtYWc6ICAgICAlZFxuIiwgYm1wLT5kYl9udW1hZyk7CisJcHJpbnRrKCIgICBhZ3NpemU6ICAgICVkJWRcbiIsIGJtcC0+ZGJfYWdzaXplKTsKKwlwcmludGsoIiAgIGFnbDJzaXplOiAgJWRcbiIsIGJtcC0+ZGJfYWdsMnNpemUpOworCXByaW50aygiICAgYWd3aWR0aDogICAlZFxuIiwgYm1wLT5kYl9hZ3dpZHRoKTsKKwlwcmludGsoIiAgIGFnc3RhcnQ6ICAgJWRcbiIsIGJtcC0+ZGJfYWdzdGFydCk7CisJcHJpbnRrKCIgICBhZ2hlaWd0aDogICVkXG4iLCBibXAtPmRiX2FnaGVpZ3RoKTsKKwlwcmludGsoIiAgIGFnbGV2ZWw6ICAgJWRcbiIsIGJtcC0+ZGJfYWdsZXZlbCk7CisJcHJpbnRrKCIgICBtYXhsZXZlbDogICVkXG4iLCBibXAtPmRiX21heGxldmVsKTsKKwlwcmludGsoIiAgIG1heGFnOiAgICAgJWRcbiIsIGJtcC0+ZGJfbWF4YWcpOworCXByaW50aygiICAgYWdwcmVmOiAgICAlZFxuIiwgYm1wLT5kYl9hZ3ByZWYpOworCXByaW50aygiICAgbDJuYnBwZzogICAlZFxuIiwgYm1wLT5kYl9sMm5icGVycGFnZSk7Cit9CisKKworLyoKKyAqCWRiUHJ0Q3RsKCkKKyAqLworc3RhdGljIHZvaWQgZGJQcnRDdGwoc3RydWN0IGRtYXBjdGwgKiBkY3ApCit7CisJaW50IGksIGosIG47CisKKwlwcmludGsoIiAgIGhlaWdodDogICAgJTA4eFxuIiwgbGUzMl90b19jcHUoZGNwLT5oZWlnaHQpKTsKKwlwcmludGsoIiAgIGxlYWZpZHg6ICAgJTA4eFxuIiwgbGUzMl90b19jcHUoZGNwLT5sZWFmaWR4KSk7CisJcHJpbnRrKCIgICBidWRtaW46ICAgICUwOHhcbiIsIGRjcC0+YnVkbWluKTsKKwlwcmludGsoIiAgIG5sZWFmczogICAgJTA4eFxuIiwgbGUzMl90b19jcHUoZGNwLT5ubGVhZnMpKTsKKwlwcmludGsoIiAgIGwybmxlYWZzOiAgJTA4eFxuIiwgbGUzMl90b19jcHUoZGNwLT5sMm5sZWFmcykpOworCisJcHJpbnRrKCJcbiBUcmVlOlxuIik7CisJZm9yIChpID0gMDsgaSA8IENUTExFQUZJTkQ7IGkgKz0gOCkgeworCQluID0gbWluKDgsIENUTExFQUZJTkQgLSBpKTsKKworCQlmb3IgKGogPSAwOyBqIDwgbjsgaisrKQorCQkJcHJpbnRmKCIgIFslMDN4XTogJTAyeCIsIGkgKyBqLAorCQkJICAgICAgIChjaGFyKSBkY3AtPnN0cmVlW2kgKyBqXSk7CisJCXByaW50ZigiXG4iKTsKKwl9CisKKwlwcmludGsoIlxuIFRyZWUgTGVhdmVzOlxuIik7CisJZm9yIChpID0gMDsgaSA8IExQRVJDVEw7IGkgKz0gOCkgeworCQluID0gbWluKDgsIExQRVJDVEwgLSBpKTsKKworCQlmb3IgKGogPSAwOyBqIDwgbjsgaisrKQorCQkJcHJpbnRmKCIgIFslMDN4XTogJTAyeCIsCisJCQkgICAgICAgaSArIGosCisJCQkgICAgICAgKGNoYXIpIGRjcC0+c3RyZWVbaSArIGogKyBDVExMRUFGSU5EXSk7CisJCXByaW50ZigiXG4iKTsKKwl9Cit9CisjZW5kaWYJCQkJLyogX0pGU19ERUJVR19ETUFQICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2RtYXAuaCBiL2ZzL2pmcy9qZnNfZG1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZTI1ODgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX2RtYXAuaApAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAwLTIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZglfSF9KRlNfRE1BUAorI2RlZmluZSBfSF9KRlNfRE1BUAorCisjaW5jbHVkZSAiamZzX3R4bm1nci5oIgorCisjZGVmaW5lIEJNQVBWRVJTSU9OCTEJLyogdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUJVFJFRVNJWkUJKDI1Nis2NCsxNis0KzEpCS8qIHNpemUgb2YgYSBkbWFwIHRyZWUgKi8KKyNkZWZpbmUJTEVBRklORAkJKDY0KzE2KzQrMSkJLyogaW5kZXggb2YgMXN0IGxlYWYgb2YgYSBkbWFwIHRyZWUgKi8KKyNkZWZpbmUgTFBFUkRNQVAJMjU2CS8qIG51bSBsZWF2ZXMgcGVyIGRtYXAgdHJlZSAqLworI2RlZmluZSBMMkxQRVJETUFQCTgJLyogbDIgbnVtYmVyIG9mIGxlYXZlcyBwZXIgZG1hcCB0cmVlICovCisjZGVmaW5lCURCV09SRAkJMzIJLyogIyBvZiBibGtzIGNvdmVyZWQgYnkgYSBtYXAgd29yZCAqLworI2RlZmluZQlMMkRCV09SRAk1CS8qIGwyICMgb2YgYmxrcyBjb3ZlcmVkIGJ5IGEgbXdvcmQgKi8KKyNkZWZpbmUgQlVETUlOICAJTDJEQldPUkQJLyogbWF4IGZyZWUgc3RyaW5nIGluIGEgbWFwIHdvcmQgKi8KKyNkZWZpbmUgQlBFUkRNQVAJKExQRVJETUFQICogREJXT1JEKQkvKiBudW0gb2YgYmxrcyBwZXIgZG1hcCAqLworI2RlZmluZSBMMkJQRVJETUFQCTEzCS8qIGwyIG51bSBvZiBibGtzIHBlciBkbWFwICovCisjZGVmaW5lIENUTFRSRUVTSVpFCSgxMDI0KzI1Nis2NCsxNis0KzEpCS8qIHNpemUgb2YgYSBkbWFwY3RsIHRyZWUgKi8KKyNkZWZpbmUgQ1RMTEVBRklORAkoMjU2KzY0KzE2KzQrMSkJLyogaWR4IG9mIDFzdCBsZWFmIG9mIGEgZG1hcGN0bCB0cmVlICovCisjZGVmaW5lIExQRVJDVEwJCTEwMjQJLyogbnVtIG9mIGxlYXZlcyBwZXIgZG1hcGN0bCB0cmVlICovCisjZGVmaW5lIEwyTFBFUkNUTAkxMAkvKiBsMiBudW0gb2YgbGVhdmVzIHBlciBkbWFwY3RsIHRyZWUgKi8KKyNkZWZpbmUJUk9PVAkJMAkvKiBpbmRleCBvZiB0aGUgcm9vdCBvZiBhIHRyZWUgKi8KKyNkZWZpbmUJTk9GUkVFCQkoKHM4KSAtMSkJLyogbm8gYmxvY2tzIGZyZWUgKi8KKyNkZWZpbmUJTUFYQUcJCTEyOAkvKiBtYXggbnVtYmVyIG9mIGFsbG9jYXRpb24gZ3JvdXBzICovCisjZGVmaW5lIEwyTUFYQUcJCTcJLyogbDIgbWF4IG51bSBvZiBBRyAqLworI2RlZmluZSBMMk1JTkFHU1oJMjUJLyogbDIgb2YgbWluaW11bSBBRyBzaXplIGluIGJ5dGVzICovCisjZGVmaW5lCUJNQVBCTEtOTwkwCS8qIGxibGtubyBvZiBibWFwIHdpdGhpbiB0aGUgbWFwICovCisKKy8qCisgKiBtYXhpbXVtIGwyIG51bWJlciBvZiBkaXNrIGJsb2NrcyBhdCB0aGUgdmFyaW91cyBkbWFwY3RsIGxldmVscy4KKyAqLworI2RlZmluZQlMMk1BWEwwU0laRQkoTDJCUEVSRE1BUCArIDEgKiBMMkxQRVJDVEwpCisjZGVmaW5lCUwyTUFYTDFTSVpFCShMMkJQRVJETUFQICsgMiAqIEwyTFBFUkNUTCkKKyNkZWZpbmUJTDJNQVhMMlNJWkUJKEwyQlBFUkRNQVAgKyAzICogTDJMUEVSQ1RMKQorCisvKgorICogbWF4aW11bSBudW1iZXIgb2YgZGlzayBibG9ja3MgYXQgdGhlIHZhcmlvdXMgZG1hcGN0bCBsZXZlbHMuCisgKi8KKyNkZWZpbmUJTUFYTDBTSVpFCSgoczY0KTEgPDwgTDJNQVhMMFNJWkUpCisjZGVmaW5lCU1BWEwxU0laRQkoKHM2NCkxIDw8IEwyTUFYTDFTSVpFKQorI2RlZmluZQlNQVhMMlNJWkUJKChzNjQpMSA8PCBMMk1BWEwyU0laRSkKKworI2RlZmluZQlNQVhNQVBTSVpFCU1BWEwyU0laRQkvKiBtYXhpbXVtIGFnZ3JlZ2F0ZSBtYXAgc2l6ZSAqLworCisvKiAKKyAqIGRldGVybWluZSB0aGUgbWF4aW11bSBmcmVlIHN0cmluZyBmb3IgZm91ciAobG93ZXIgbGV2ZWwpIG5vZGVzCisgKiBvZiB0aGUgdHJlZS4KKyAqLworc3RhdGljIF9faW5saW5lIHNpZ25lZCBjaGFyIFRSRUVNQVgoc2lnbmVkIGNoYXIgKmNwKQoreworCXNpZ25lZCBjaGFyIHRtcDEsIHRtcDI7CisKKwl0bXAxID0gbWF4KCooY3ArMiksICooY3ArMykpOworCXRtcDIgPSBtYXgoKihjcCksICooY3ArMSkpOworCisJcmV0dXJuIG1heCh0bXAxLCB0bXAyKTsKK30KKworLyoKKyAqIGNvbnZlcnQgZGlzayBibG9jayBudW1iZXIgdG8gdGhlIGxvZ2ljYWwgYmxvY2sgbnVtYmVyIG9mIHRoZSBkbWFwCisgKiBkZXNjcmliaW5nIHRoZSBkaXNrIGJsb2NrLiAgcyBpcyB0aGUgbG9nMihudW1iZXIgb2YgbG9naWNhbCBibG9ja3MgcGVyIHBhZ2UpCisgKgorICogVGhlIGNhbGN1bGF0aW9uIGZpZ3VyZXMgb3V0IGhvdyBtYW55IGxvZ2ljYWwgcGFnZXMgYXJlIGluIGZyb250IG9mIHRoZSBkbWFwLgorICoJLSB0aGUgbnVtYmVyIG9mIGRtYXBzIHByZWNlZGluZyBpdAorICoJLSB0aGUgbnVtYmVyIG9mIEwwIHBhZ2VzIHByZWNlZGluZyBpdHMgTDAgcGFnZQorICoJLSB0aGUgbnVtYmVyIG9mIEwxIHBhZ2VzIHByZWNlZGluZyBpdHMgTDEgcGFnZQorICoJLSAzIGlzIGFkZGVkIHRvIGFjY291bnQgZm9yIHRoZSBMMiwgTDEsIGFuZCBMMCBwYWdlIGZvciB0aGlzIGRtYXAKKyAqCS0gMSBpcyBhZGRlZCB0byBhY2NvdW50IGZvciB0aGUgY29udHJvbCBwYWdlIG9mIHRoZSBtYXAuCisgKi8KKyNkZWZpbmUgQkxLVE9ETUFQKGIscykgICAgXAorICAgICAgICAoKCgoYikgPj4gMTMpICsgKChiKSA+PiAyMykgKyAoKGIpID4+IDMzKSArIDMgKyAxKSA8PCAocykpCisKKy8qCisgKiBjb252ZXJ0IGRpc2sgYmxvY2sgbnVtYmVyIHRvIHRoZSBsb2dpY2FsIGJsb2NrIG51bWJlciBvZiB0aGUgTEVWRUwgMAorICogZG1hcGN0bCBkZXNjcmliaW5nIHRoZSBkaXNrIGJsb2NrLiAgcyBpcyB0aGUgbG9nMihudW1iZXIgb2YgbG9naWNhbCBibG9ja3MKKyAqIHBlciBwYWdlKQorICoKKyAqIFRoZSBjYWxjdWxhdGlvbiBmaWd1cmVzIG91dCBob3cgbWFueSBsb2dpY2FsIHBhZ2VzIGFyZSBpbiBmcm9udCBvZiB0aGUgTDAuCisgKgktIHRoZSBudW1iZXIgb2YgZG1hcCBwYWdlcyBwcmVjZWRpbmcgaXQKKyAqCS0gdGhlIG51bWJlciBvZiBMMCBwYWdlcyBwcmVjZWRpbmcgaXQKKyAqCS0gdGhlIG51bWJlciBvZiBMMSBwYWdlcyBwcmVjZWRpbmcgaXRzIEwxIHBhZ2UKKyAqCS0gMiBpcyBhZGRlZCB0byBhY2NvdW50IGZvciB0aGUgTDIsIGFuZCBMMSBwYWdlIGZvciB0aGlzIEwwCisgKgktIDEgaXMgYWRkZWQgdG8gYWNjb3VudCBmb3IgdGhlIGNvbnRyb2wgcGFnZSBvZiB0aGUgbWFwLgorICovCisjZGVmaW5lIEJMS1RPTDAoYixzKSAgICAgIFwKKyAgICAgICAgKCgoKChiKSA+PiAyMykgPDwgMTApICsgKChiKSA+PiAyMykgKyAoKGIpID4+IDMzKSArIDIgKyAxKSA8PCAocykpCisKKy8qCisgKiBjb252ZXJ0IGRpc2sgYmxvY2sgbnVtYmVyIHRvIHRoZSBsb2dpY2FsIGJsb2NrIG51bWJlciBvZiB0aGUgTEVWRUwgMQorICogZG1hcGN0bCBkZXNjcmliaW5nIHRoZSBkaXNrIGJsb2NrLiAgcyBpcyB0aGUgbG9nMihudW1iZXIgb2YgbG9naWNhbCBibG9ja3MKKyAqIHBlciBwYWdlKQorICoKKyAqIFRoZSBjYWxjdWxhdGlvbiBmaWd1cmVzIG91dCBob3cgbWFueSBsb2dpY2FsIHBhZ2VzIGFyZSBpbiBmcm9udCBvZiB0aGUgTDEuCisgKgktIHRoZSBudW1iZXIgb2YgZG1hcCBwYWdlcyBwcmVjZWRpbmcgaXQKKyAqCS0gdGhlIG51bWJlciBvZiBMMCBwYWdlcyBwcmVjZWRpbmcgaXQKKyAqCS0gdGhlIG51bWJlciBvZiBMMSBwYWdlcyBwcmVjZWRpbmcgaXQKKyAqCS0gMSBpcyBhZGRlZCB0byBhY2NvdW50IGZvciB0aGUgTDIgcGFnZQorICoJLSAxIGlzIGFkZGVkIHRvIGFjY291bnQgZm9yIHRoZSBjb250cm9sIHBhZ2Ugb2YgdGhlIG1hcC4KKyAqLworI2RlZmluZSBCTEtUT0wxKGIscykgICAgICBcCisgICAgICgoKCgoYikgPj4gMzMpIDw8IDIwKSArICgoKGIpID4+IDMzKSA8PCAxMCkgKyAoKGIpID4+IDMzKSArIDEgKyAxKSA8PCAocykpCisKKy8qCisgKiBjb252ZXJ0IGRpc2sgYmxvY2sgbnVtYmVyIHRvIHRoZSBsb2dpY2FsIGJsb2NrIG51bWJlciBvZiB0aGUgZG1hcGN0bAorICogYXQgdGhlIHNwZWNpZmllZCBsZXZlbCB3aGljaCBkZXNjcmliZXMgdGhlIGRpc2sgYmxvY2suCisgKi8KKyNkZWZpbmUgQkxLVE9DVEwoYixzLGwpICAgXAorICAgICAgICAoKChsKSA9PSAyKSA/IDEgOiAoKGwpID09IDEpID8gQkxLVE9MMSgoYiksKHMpKSA6IEJMS1RPTDAoKGIpLChzKSkpCisKKy8qIAorICogY29udmVydCBhZ2dyZWdhdGUgbWFwIHNpemUgdG8gdGhlIHplcm8gb3JpZ2luIGRtYXBjdGwgbGV2ZWwgb2YgdGhlCisgKiB0b3AgZG1hcGN0bC4KKyAqLworI2RlZmluZQlCTUFQU1pUT0xFVihzaXplKQlcCisJKCgoc2l6ZSkgPD0gTUFYTDBTSVpFKSA/IDAgOiAoKHNpemUpIDw9IE1BWEwxU0laRSkgPyAxIDogMikKKworLyogY29udmVydCBkaXNrIGJsb2NrIG51bWJlciB0byBhbGxvY2F0aW9uIGdyb3VwIG51bWJlci4KKyAqLworI2RlZmluZSBCTEtUT0FHKGIsc2JpKQkoKGIpID4+ICgoc2JpKS0+Ym1hcC0+ZGJfYWdsMnNpemUpKQorCisvKiBjb252ZXJ0IGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyIHRvIHN0YXJ0aW5nIGRpc2sgYmxvY2sKKyAqIG51bWJlci4KKyAqLworI2RlZmluZSBBR1RPQkxLKGEsaXApCVwKKwkoKHM2NCkoYSkgPDwgKEpGU19TQkkoKGlwKS0+aV9zYiktPmJtYXAtPmRiX2FnbDJzaXplKSkKKworLyoKKyAqCWRtYXAgc3VtbWFyeSB0cmVlCisgKgorICogZG1hcHRyZWUgbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggZG1hcGN0bC4KKyAqLworc3RydWN0IGRtYXB0cmVlIHsKKwlfX2xlMzIgbmxlYWZzOwkJLyogNDogbnVtYmVyIG9mIHRyZWUgbGVhZnMgICAgICAqLworCV9fbGUzMiBsMm5sZWFmczsJLyogNDogbDIgbnVtYmVyIG9mIHRyZWUgbGVhZnMgICAqLworCV9fbGUzMiBsZWFmaWR4OwkJLyogNDogaW5kZXggb2YgZmlyc3QgdHJlZSBsZWFmICAqLworCV9fbGUzMiBoZWlnaHQ7CQkvKiA0OiBoZWlnaHQgb2YgdGhlIHRyZWUgICAgICAgICovCisJczggYnVkbWluOwkJLyogMTogbWluIGwyIHRyZWUgbGVhZiB2YWx1ZSB0byBjb21iaW5lICovCisJczggc3RyZWVbVFJFRVNJWkVdOwkvKiBUUkVFU0laRTogdHJlZSAgICAgICAgICAgICAgICovCisJdTggcGFkWzJdOwkJLyogMjogcGFkIHRvIHdvcmQgYm91bmRhcnkgICAgICAqLworfTsJCQkJLyogLSAzNjAgLSAgICAgICAgICAgICAgICAgICAgICAqLworCisvKgorICoJZG1hcCBwYWdlIHBlciA4SyBibG9ja3MgYml0bWFwCisgKi8KK3N0cnVjdCBkbWFwIHsKKwlfX2xlMzIgbmJsb2NrczsJCS8qIDQ6IG51bSBibGtzIGNvdmVyZWQgYnkgdGhpcyBkbWFwICAgICAqLworCV9fbGUzMiBuZnJlZTsJCS8qIDQ6IG51bSBvZiBmcmVlIGJsa3MgaW4gdGhpcyBkbWFwICAgICAqLworCV9fbGU2NCBzdGFydDsJCS8qIDg6IHN0YXJ0aW5nIGJsa25vIGZvciB0aGlzIGRtYXAgICAgICAqLworCXN0cnVjdCBkbWFwdHJlZSB0cmVlOwkvKiAzNjA6IGRtYXAgdHJlZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1OCBwYWRbMTY3Ml07CQkvKiAxNjcyOiBwYWQgdG8gMjA0OCBieXRlcyAgICAgICAgICAgICAgKi8KKwlfX2xlMzIgd21hcFtMUEVSRE1BUF07CS8qIDEwMjQ6IGJpdHMgb2YgdGhlIHdvcmtpbmcgbWFwICAgICAgICAqLworCV9fbGUzMiBwbWFwW0xQRVJETUFQXTsJLyogMTAyNDogYml0cyBvZiB0aGUgcGVyc2lzdGVudCBtYXAgICAgICovCit9OwkJCQkvKiAtIDQwOTYgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoKKyAqCWRpc2sgbWFwIGNvbnRyb2wgcGFnZSBwZXIgbGV2ZWwuCisgKgorICogZG1hcGN0bCBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCBkbWFwdHJlZS4KKyAqLworc3RydWN0IGRtYXBjdGwgeworCV9fbGUzMiBubGVhZnM7CQkvKiA0OiBudW1iZXIgb2YgdHJlZSBsZWFmcyAgICAgICovCisJX19sZTMyIGwybmxlYWZzOwkvKiA0OiBsMiBudW1iZXIgb2YgdHJlZSBsZWFmcyAgICovCisJX19sZTMyIGxlYWZpZHg7CQkvKiA0OiBpbmRleCBvZiB0aGUgZmlyc3QgdHJlZSBsZWFmICAgICAgKi8KKwlfX2xlMzIgaGVpZ2h0OwkJLyogNDogaGVpZ2h0IG9mIHRyZWUgICAgICAgICAgICAqLworCXM4IGJ1ZG1pbjsJCS8qIDE6IG1pbmltdW0gbDIgdHJlZSBsZWFmIHZhbHVlICAgICAgICAqLworCXM4IHN0cmVlW0NUTFRSRUVTSVpFXTsJLyogQ1RMVFJFRVNJWkU6IGRtYXBjdGwgdHJlZSAgICAqLworCXU4IHBhZFsyNzE0XTsJCS8qIDI3MTQ6IHBhZCB0byA0MDk2ICAgICAgICAgICAgKi8KK307CQkJCS8qIC0gNDA5NiAtICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoKKyAqCWNvbW1vbiBkZWZpbml0aW9uIGZvciBkbWFwdHJlZSB3aXRoaW4gZG1hcCBhbmQgZG1hcGN0bAorICovCit0eXBlZGVmIHVuaW9uIGRtdHJlZSB7CisJc3RydWN0IGRtYXB0cmVlIHQxOworCXN0cnVjdCBkbWFwY3RsIHQyOworfSBkbXRyZWVfdDsKKworLyogbWFjcm9zIGZvciBhY2Nlc3NpbmcgZmllbGRzIHdpdGhpbiBkbXRyZWUgKi8KKyNkZWZpbmUJZG10X25sZWFmcwl0MS5ubGVhZnMKKyNkZWZpbmUJZG10X2wybmxlYWZzIAl0MS5sMm5sZWFmcworI2RlZmluZQlkbXRfbGVhZmlkeCAJdDEubGVhZmlkeAorI2RlZmluZQlkbXRfaGVpZ2h0IAl0MS5oZWlnaHQKKyNkZWZpbmUJZG10X2J1ZG1pbiAJdDEuYnVkbWluCisjZGVmaW5lCWRtdF9zdHJlZSAJdDEuc3RyZWUKKworLyogCisgKglvbi1kaXNrIGFnZ3JlZ2F0ZSBkaXNrIGFsbG9jYXRpb24gbWFwIGRlc2NyaXB0b3IuCisgKi8KK3N0cnVjdCBkYm1hcF9kaXNrIHsKKwlfX2xlNjQgZG5fbWFwc2l6ZTsJLyogODogbnVtYmVyIG9mIGJsb2NrcyBpbiBhZ2dyZWdhdGUgICAgICovCisJX19sZTY0IGRuX25mcmVlOwkvKiA4OiBudW0gZnJlZSBibGtzIGluIGFnZ3JlZ2F0ZSBtYXAgICAgKi8KKwlfX2xlMzIgZG5fbDJuYnBlcnBhZ2U7CS8qIDQ6IG51bWJlciBvZiBibGtzIHBlciBwYWdlICAgICAgICAgICAqLworCV9fbGUzMiBkbl9udW1hZzsJLyogNDogdG90YWwgbnVtYmVyIG9mIGFncyAgICAgICAgICAgICAgICovCisJX19sZTMyIGRuX21heGxldmVsOwkvKiA0OiBudW1iZXIgb2YgYWN0aXZlIGFncyAgICAgICAgICAgICAgKi8KKwlfX2xlMzIgZG5fbWF4YWc7CS8qIDQ6IG1heCBhY3RpdmUgYWxsb2MgZ3JvdXAgbnVtYmVyICAgICAqLworCV9fbGUzMiBkbl9hZ3ByZWY7CS8qIDQ6IHByZWZlcnJlZCBhbGxvYyBncm91cCAoaGludCkgICAgICAqLworCV9fbGUzMiBkbl9hZ2xldmVsOwkvKiA0OiBkbWFwY3RsIGxldmVsIGhvbGRpbmcgdGhlIEFHICAgICAgKi8KKwlfX2xlMzIgZG5fYWdoZWlndGg7CS8qIDQ6IGhlaWdodCBpbiBkbWFwY3RsIG9mIHRoZSBBRyAgICAgICAqLworCV9fbGUzMiBkbl9hZ3dpZHRoOwkvKiA0OiB3aWR0aCBpbiBkbWFwY3RsIG9mIHRoZSBBRyAgICAgICAgKi8KKwlfX2xlMzIgZG5fYWdzdGFydDsJLyogNDogc3RhcnQgdHJlZSBpbmRleCBhdCBBRyBoZWlnaHQgICAgICovCisJX19sZTMyIGRuX2FnbDJzaXplOwkvKiA0OiBsMiBudW0gb2YgYmxrcyBwZXIgYWxsb2MgZ3JvdXAgICAgKi8KKwlfX2xlNjQgZG5fYWdmcmVlW01BWEFHXTsvKiA4Kk1BWEFHOiBwZXIgQUcgZnJlZSBjb3VudCAgICAgICAgICAgKi8KKwlfX2xlNjQgZG5fYWdzaXplOwkvKiA4OiBudW0gb2YgYmxrcyBwZXIgYWxsb2MgZ3JvdXAgICAgICAgKi8KKwlzOCBkbl9tYXhmcmVlYnVkOwkvKiAxOiBtYXggZnJlZSBidWRkeSBzeXN0ZW0gICAgICAgICAgICAgKi8KKwl1OCBwYWRbMzAwN107CQkvKiAzMDA3OiBwYWQgdG8gNDA5NiAgICAgICAgICAgICAgICAgICAgKi8KK307CQkJCS8qIC0gNDA5NiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdHJ1Y3QgZGJtYXAgeworCXM2NCBkbl9tYXBzaXplOwkJLyogbnVtYmVyIG9mIGJsb2NrcyBpbiBhZ2dyZWdhdGUgICAgICovCisJczY0IGRuX25mcmVlOwkJLyogbnVtIGZyZWUgYmxrcyBpbiBhZ2dyZWdhdGUgbWFwICAgICovCisJaW50IGRuX2wybmJwZXJwYWdlOwkvKiBudW1iZXIgb2YgYmxrcyBwZXIgcGFnZSAgICAgICAgICAgKi8KKwlpbnQgZG5fbnVtYWc7CQkvKiB0b3RhbCBudW1iZXIgb2YgYWdzICAgICAgICAgICAgICAgKi8KKwlpbnQgZG5fbWF4bGV2ZWw7CS8qIG51bWJlciBvZiBhY3RpdmUgYWdzICAgICAgICAgICAgICAqLworCWludCBkbl9tYXhhZzsJCS8qIG1heCBhY3RpdmUgYWxsb2MgZ3JvdXAgbnVtYmVyICAgICAqLworCWludCBkbl9hZ3ByZWY7CQkvKiBwcmVmZXJyZWQgYWxsb2MgZ3JvdXAgKGhpbnQpICAgICAgKi8KKwlpbnQgZG5fYWdsZXZlbDsJCS8qIGRtYXBjdGwgbGV2ZWwgaG9sZGluZyB0aGUgQUcgICAgICAqLworCWludCBkbl9hZ2hlaWd0aDsJLyogaGVpZ2h0IGluIGRtYXBjdGwgb2YgdGhlIEFHICAgICAgICovCisJaW50IGRuX2Fnd2lkdGg7CQkvKiB3aWR0aCBpbiBkbWFwY3RsIG9mIHRoZSBBRyAgICAgICAgKi8KKwlpbnQgZG5fYWdzdGFydDsJCS8qIHN0YXJ0IHRyZWUgaW5kZXggYXQgQUcgaGVpZ2h0ICAgICAqLworCWludCBkbl9hZ2wyc2l6ZTsJLyogbDIgbnVtIG9mIGJsa3MgcGVyIGFsbG9jIGdyb3VwICAgICovCisJczY0IGRuX2FnZnJlZVtNQVhBR107CS8qIHBlciBBRyBmcmVlIGNvdW50ICAgICAgICAgICAqLworCXM2NCBkbl9hZ3NpemU7CQkvKiBudW0gb2YgYmxrcyBwZXIgYWxsb2MgZ3JvdXAgICAgICAgKi8KKwlzaWduZWQgY2hhciBkbl9tYXhmcmVlYnVkOwkvKiBtYXggZnJlZSBidWRkeSBzeXN0ZW0gICAgICAgICAgICAgKi8KK307CQkJCS8qIC0gNDA5NiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogCisgKglpbi1tZW1vcnkgYWdncmVnYXRlIGRpc2sgYWxsb2NhdGlvbiBtYXAgZGVzY3JpcHRvci4KKyAqLworc3RydWN0IGJtYXAgeworCXN0cnVjdCBkYm1hcCBkYl9ibWFwOwkJLyogb24tZGlzayBhZ2dyZWdhdGUgbWFwIGRlc2NyaXB0b3IgKi8KKwlzdHJ1Y3QgaW5vZGUgKmRiX2lwYm1hcDsJLyogcHRyIHRvIGFnZ3JlZ2F0ZSBtYXAgaW5jb3JlIGlub2RlICovCisJc3RydWN0IHNlbWFwaG9yZSBkYl9ibWFwbG9jazsJLyogYWdncmVnYXRlIG1hcCBsb2NrICovCisJYXRvbWljX3QgZGJfYWN0aXZlW01BWEFHXTsJLyogY291bnQgb2YgYWN0aXZlLCBvcGVuIGZpbGVzIGluIEFHICovCisJdTMyICpkYl9EQm1hcDsKK307CisKKy8qIG1hY3JvcyBmb3IgYWNjZXNzaW5nIGZpZWxkcyB3aXRoaW4gaW4tbWVtb3J5IGFnZ3JlZ2F0ZSBtYXAgZGVzY3JpcHRvciAqLworI2RlZmluZQlkYl9tYXBzaXplCWRiX2JtYXAuZG5fbWFwc2l6ZQorI2RlZmluZQlkYl9uZnJlZQlkYl9ibWFwLmRuX25mcmVlCisjZGVmaW5lCWRiX2FnZnJlZQlkYl9ibWFwLmRuX2FnZnJlZQorI2RlZmluZQlkYl9hZ3NpemUJZGJfYm1hcC5kbl9hZ3NpemUKKyNkZWZpbmUJZGJfYWdsMnNpemUJZGJfYm1hcC5kbl9hZ2wyc2l6ZQorI2RlZmluZQlkYl9hZ3dpZHRoCWRiX2JtYXAuZG5fYWd3aWR0aAorI2RlZmluZQlkYl9hZ2hlaWd0aAlkYl9ibWFwLmRuX2FnaGVpZ3RoCisjZGVmaW5lCWRiX2Fnc3RhcnQJZGJfYm1hcC5kbl9hZ3N0YXJ0CisjZGVmaW5lCWRiX251bWFnCWRiX2JtYXAuZG5fbnVtYWcKKyNkZWZpbmUJZGJfbWF4bGV2ZWwJZGJfYm1hcC5kbl9tYXhsZXZlbAorI2RlZmluZQlkYl9hZ2xldmVsCWRiX2JtYXAuZG5fYWdsZXZlbAorI2RlZmluZQlkYl9hZ3ByZWYJZGJfYm1hcC5kbl9hZ3ByZWYKKyNkZWZpbmUJZGJfbWF4YWcJZGJfYm1hcC5kbl9tYXhhZworI2RlZmluZQlkYl9tYXhmcmVlYnVkCWRiX2JtYXAuZG5fbWF4ZnJlZWJ1ZAorI2RlZmluZQlkYl9sMm5icGVycGFnZQlkYl9ibWFwLmRuX2wybmJwZXJwYWdlCisKKy8qCisgKiBtYWNyb3MgZm9yIHZhcmlvdXMgY29udmVyc2lvbnMgbmVlZGVkIGJ5IHRoZSBhbGxvY2F0b3JzLgorICogYmxrc3RvbDIoKSwgY250bHooKSwgYW5kIGNudHR6KCkgYXJlIG9wZXJhdGluZyBzeXN0ZW0gZGVwZW5kZW50IGZ1bmN0aW9ucy4KKyAqLworLyogY29udmVydCBudW1iZXIgb2YgYmxvY2tzIHRvIGxvZzIgbnVtYmVyIG9mIGJsb2Nrcywgcm91bmRpbmcgdXAgdG8KKyAqIHRoZSBuZXh0IGxvZzIgdmFsdWUgaWYgYmxvY2tzIGlzIG5vdCBhIGwyIG11bHRpcGxlLgorICovCisjZGVmaW5lCUJMS1NUT0wyKGQpCQkoYmxrc3RvbDIoZCkpCisKKy8qIGNvbnZlcnQgbnVtYmVyIG9mIGxlYWZzIHRvIGxvZzIgbGVhZiB2YWx1ZSAqLworI2RlZmluZQlOTFNUT0wyQlNaKG4pCQkoMzEgLSBjbnRseigobikpICsgQlVETUlOKQorCisvKiBjb252ZXJ0IGxlYWYgaW5kZXggdG8gbG9nMiBsZWFmIHZhbHVlICovCisjZGVmaW5lCUxJVE9MMkJTWihuLG0sYikJKCgoKG4pID09IDApID8gKG0pIDogY250dHooKG4pKSkgKyAoYikpCisKKy8qIGNvbnZlcnQgYSBibG9jayBudW1iZXIgdG8gYSBkbWFwIGNvbnRyb2wgbGVhZiBpbmRleCAqLworI2RlZmluZSBCTEtUT0NUTExFQUYoYixtKQlcCisJKCgoYikgJiAoKChzNjQpMSA8PCAoKG0pICsgTDJMUEVSQ1RMKSkgLSAxKSkgPj4gKG0pKQorCisvKiBjb252ZXJ0IGxvZzIgbGVhZiB2YWx1ZSB0byBidWRkeSBzaXplICovCisjZGVmaW5lCUJVRFNJWkUocyxtKQkJKDEgPDwgKChzKSAtIChtKSkpCisKKy8qCisgKglleHRlcm5hbCByZWZlcmVuY2VzLgorICovCitleHRlcm4gaW50IGRiTW91bnQoc3RydWN0IGlub2RlICppcGJtYXApOworCitleHRlcm4gaW50IGRiVW5tb3VudChzdHJ1Y3QgaW5vZGUgKmlwYm1hcCwgaW50IG1vdW50ZXJyb3IpOworCitleHRlcm4gaW50IGRiRnJlZShzdHJ1Y3QgaW5vZGUgKmlwYm1hcCwgczY0IGJsa25vLCBzNjQgbmJsb2Nrcyk7CisKK2V4dGVybiBpbnQgZGJVcGRhdGVQTWFwKHN0cnVjdCBpbm9kZSAqaXBibWFwLAorCQkJaW50IGZyZWUsIHM2NCBibGtubywgczY0IG5ibG9ja3MsIHN0cnVjdCB0YmxvY2sgKiB0YmxrKTsKKworZXh0ZXJuIGludCBkYk5leHRBRyhzdHJ1Y3QgaW5vZGUgKmlwYm1hcCk7CisKK2V4dGVybiBpbnQgZGJBbGxvYyhzdHJ1Y3QgaW5vZGUgKmlwYm1hcCwgczY0IGhpbnQsIHM2NCBuYmxvY2tzLCBzNjQgKiByZXN1bHRzKTsKKworZXh0ZXJuIGludCBkYlJlQWxsb2Moc3RydWN0IGlub2RlICppcGJtYXAsCisJCSAgICAgczY0IGJsa25vLCBzNjQgbmJsb2NrcywgczY0IGFkZG5ibG9ja3MsIHM2NCAqIHJlc3VsdHMpOworCitleHRlcm4gaW50IGRiU3luYyhzdHJ1Y3QgaW5vZGUgKmlwYm1hcCk7CitleHRlcm4gaW50IGRiQWxsb2NCb3R0b21VcChzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgYmxrbm8sIHM2NCBuYmxvY2tzKTsKK2V4dGVybiBpbnQgZGJFeHRlbmRGUyhzdHJ1Y3QgaW5vZGUgKmlwYm1hcCwgczY0IGJsa25vLCBzNjQgbmJsb2Nrcyk7CitleHRlcm4gdm9pZCBkYkZpbmFsaXplQm1hcChzdHJ1Y3QgaW5vZGUgKmlwYm1hcCk7CitleHRlcm4gczY0IGRiTWFwRmlsZVNpemVUb01hcFNpemUoc3RydWN0IGlub2RlICppcGJtYXApOworI2VuZGlmCQkJCS8qIF9IX0pGU19ETUFQICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2R0cmVlLmMgYi9mcy9qZnMvamZzX2R0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM1Nzg5MAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfZHRyZWUuYwpAQCAtMCwwICsxLDQ3NTIgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDA0CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqCWpmc19kdHJlZS5jOiBkaXJlY3RvcnkgQistdHJlZSBtYW5hZ2VyCisgKgorICogQistdHJlZSB3aXRoIHZhcmlhYmxlIGxlbmd0aCBrZXkgZGlyZWN0b3J5OgorICoKKyAqIGVhY2ggZGlyZWN0b3J5IHBhZ2UgaXMgc3RydWN0dXJlZCBhcyBhbiBhcnJheSBvZiAzMi1ieXRlCisgKiBkaXJlY3RvcnkgZW50cnkgc2xvdHMgaW5pdGlhbGl6ZWQgYXMgYSBmcmVlbGlzdAorICogdG8gYXZvaWQgc2VhcmNoL2NvbXBhY3Rpb24gb2YgZnJlZSBzcGFjZSBhdCBpbnNlcnRpb24uCisgKiB3aGVuIGFuIGVudHJ5IGlzIGluc2VydGVkLCBhIG51bWJlciBvZiBzbG90cyBhcmUgYWxsb2NhdGVkCisgKiBmcm9tIHRoZSBmcmVlbGlzdCBhcyByZXF1aXJlZCB0byBzdG9yZSB2YXJpYWJsZSBsZW5ndGggZGF0YQorICogb2YgdGhlIGVudHJ5OyB3aGVuIHRoZSBlbnRyeSBpcyBkZWxldGVkLCBzbG90cyBvZiB0aGUgZW50cnkKKyAqIGFyZSByZXR1cm5lZCB0byBmcmVlbGlzdC4KKyAqCisgKiBsZWFmIGVudHJ5IHN0b3JlcyBmdWxsIG5hbWUgYXMga2V5IGFuZCBmaWxlIHNlcmlhbCBudW1iZXIKKyAqIChha2EgaW5vZGUgbnVtYmVyKSBhcyBkYXRhLgorICogaW50ZXJuYWwvcm91dGVyIGVudHJ5IHN0b3JlcyBzdWZmZml4IGNvbXByZXNzZWQgbmFtZQorICogYXMga2V5IGFuZCBzaW1wbGUgZXh0ZW50IGRlc2NyaXB0b3IgYXMgZGF0YS4KKyAqCisgKiBlYWNoIGRpcmVjdG9yeSBwYWdlIG1haW50YWlucyBhIHNvcnRlZCBlbnRyeSBpbmRleCB0YWJsZQorICogd2hpY2ggc3RvcmVzIHRoZSBzdGFydCBzbG90IGluZGV4IG9mIHNvcnRlZCBlbnRyaWVzCisgKiB0byBhbGxvdyBiaW5hcnkgc2VhcmNoIG9uIHRoZSB0YWJsZS4KKyAqCisgKiBkaXJlY3Rvcnkgc3RhcnRzIGFzIGEgcm9vdC9sZWFmIHBhZ2UgaW4gb24tZGlzayBpbm9kZQorICogaW5saW5lIGRhdGEgYXJlYS4KKyAqIHdoZW4gaXQgYmVjb21lcyBmdWxsLCBpdCBzdGFydHMgYSBsZWFmIG9mIGEgZXh0ZXJuYWwgZXh0ZW50CisgKiBvZiBsZW5ndGggb2YgMSBibG9jay4gZWFjaCB0aW1lIHRoZSBmaXJzdCBsZWFmIGJlY29tZXMgZnVsbCwKKyAqIGl0IGlzIGV4dGVuZGVkIHJhdGhlciB0aGFuIHNwbGl0IChpdHMgc2l6ZSBpcyBkb3VibGVkKSwKKyAqIHVudGlsIGl0cyBsZW5ndGggYmVjb21zIDQgS0J5dGVzLCBmcm9tIHRoZW4gdGhlIGV4dGVudCBpcyBzcGxpdAorICogd2l0aCBuZXcgNCBLYnl0ZSBleHRlbnQgd2hlbiBpdCBiZWNvbWVzIGZ1bGwKKyAqIHRvIHJlZHVjZSBleHRlcm5hbCBmcmFnbWVudGF0aW9uIG9mIHNtYWxsIGRpcmVjdG9yaWVzLgorICoKKyAqIGJsYWgsIGJsYWgsIGJsYWgsIGZvciBsaW5lYXIgc2NhbiBvZiBkaXJlY3RvcnkgaW4gcGllY2VzIGJ5CisgKiByZWFkZGlyKCkuCisgKgorICoKKyAqCWNhc2UtaW5zZW5zaXRpdmUgZGlyZWN0b3J5IGZpbGUgc3lzdGVtCisgKgorICogbmFtZXMgYXJlIHN0b3JlZCBpbiBjYXNlLXNlbnNpdGl2ZSB3YXkgaW4gbGVhZiBlbnRyeS4KKyAqIGJ1dCBzdG9yZWQsIHNlYXJjaGVkIGFuZCBjb21wYXJlZCBpbiBjYXNlLWluc2Vuc2l0aXZlICh1cHBlcmNhc2UpIG9yZGVyCisgKiAoaS5lLiwgYm90aCBzZWFyY2gga2V5IGFuZCBlbnRyeSBrZXkgYXJlIGZvbGRlZCBmb3Igc2VhcmNoL2NvbXBhcmUpOgorICogKG5vdGUgdGhhdCBjYXNlLXNlbnNpdGl2ZSBvcmRlciBpcyBCUk9LRU4gaW4gc3RvcmFnZSwgZS5nLiwKKyAqICBzZW5zaXRpdmU6IEFkLCBhQiwgYUMsIGFEIC0+IGluc2Vuc2l0aXZlOiBhQiwgYUMsIGFELCBBZAorICoKKyAqICBlbnRyaWVzIHdoaWNoIGZvbGRzIHRvIHRoZSBzYW1lIGtleSBtYWtlcyB1cCBhIGVxdWl2YWxlbnQgY2xhc3MKKyAqICB3aG9zZSBtZW1iZXJzIGFyZSBzdG9yZWQgYXMgY29udGlndW91cyBjbHVzdGVyIChtYXkgY3Jvc3MgcGFnZSBib3VuZGFyeSkKKyAqICBidXQgd2hvc2Ugb3JkZXIgaXMgYXJiaXRyYXJ5IGFuZCBhY3RzIGFzIGR1cGxpY2F0ZSwgZS5nLiwKKyAqICBhYmMsIEFiYywgYUJjLCBhYkMpCisgKgorICogb25jZSBtYXRjaCBpcyBmb3VuZCBhdCBsZWFmLCByZXF1aXJlcyBzY2FuIGZvcndhcmQvYmFja3dhcmQKKyAqIGVpdGhlciBmb3IsIGluIGNhc2UtaW5zZW5zaXRpdmUgc2VhcmNoLCBkdXBsaWNhdGUKKyAqIG9yIGZvciwgaW4gY2FzZS1zZW5zaXRpdmUgc2VhcmNoLCBmb3IgZXhhY3QgbWF0Y2gKKyAqCisgKiByb3V0ZXIgZW50cnkgbXVzdCBiZSBjcmVhdGVkL3N0b3JlZCBpbiBjYXNlLWluc2Vuc2l0aXZlIHdheQorICogaW4gaW50ZXJuYWwgZW50cnk6CisgKiAocmlnaHQgbW9zdCBrZXkgb2YgbGVmdCBwYWdlIGFuZCBsZWZ0IG1vc3Qga2V5IG9mIHJpZ2h0IHBhZ2UKKyAqIGFyZSBmb2xkZWQsIGFuZCBpdHMgc3VmZml4IGNvbXByZXNzaW9uIGlzIHByb3BhZ2F0ZWQgYXMgcm91dGVyCisgKiBrZXkgaW4gcGFyZW50KQorICogKGUuZy4sIGlmIHNwbGl0IG9jY3VycyA8YWJjPiBhbmQgPGFCZD4sIDxBQkQ+IHRyYXRoZXIgdGhhbiA8YUI+CisgKiBzaG91bGQgYmUgbWFkZSB0aGUgcm91dGVyIGtleSBmb3IgdGhlIHNwbGl0KQorICoKKyAqIGNhc2UtaW5zZW5zaXRpdmUgc2VhcmNoOgorICoKKyAqIAlmb2xkIHNlYXJjaCBrZXk7CisgKgorICoJY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2ggb2YgQi10cmVlOgorICoJZm9yIGludGVybmFsIGVudHJ5LCByb3V0ZXIga2V5IGlzIGFscmVhZHkgZm9sZGVkOworICoJZm9yIGxlYWYgZW50cnksIGZvbGQgdGhlIGVudHJ5IGtleSBiZWZvcmUgY29tcGFyaXNvbi4KKyAqCisgKglpZiAobGVhZiBlbnRyeSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvdW5kKQorICoJCWlmIChuZXh0IGVudHJ5IHNhdGlzZmllcyBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoKQorICoJCQlyZXR1cm4gRURVUExJQ0FURTsKKyAqCQlpZiAocHJldiBlbnRyeSBzYXRpc2ZpZXMgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCkKKyAqCQkJcmV0dXJuIEVEVVBMSUNBVEU7CisgKgkJcmV0dXJuIG1hdGNoOworICoJZWxzZQorICoJCXJldHVybiBubyBtYXRjaDsKKyAqCisgKiAJc2VyaWFsaXphdGlvbjoKKyAqIHRhcmdldCBkaXJlY3RvcnkgaW5vZGUgbG9jayBpcyBiZWluZyBoZWxkIG9uIGVudHJ5L2V4aXQKKyAqIG9mIGFsbCBtYWluIGRpcmVjdG9yeSBzZXJ2aWNlIHJvdXRpbmVzLgorICoKKyAqCWxvZyBiYXNlZCByZWNvdmVyeToKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKKyNpbmNsdWRlICJqZnNfc3VwZXJibG9jay5oIgorI2luY2x1ZGUgImpmc19maWxzeXMuaCIKKyNpbmNsdWRlICJqZnNfbWV0YXBhZ2UuaCIKKyNpbmNsdWRlICJqZnNfZG1hcC5oIgorI2luY2x1ZGUgImpmc191bmljb2RlLmgiCisjaW5jbHVkZSAiamZzX2RlYnVnLmgiCisKKy8qIGR0cmVlIHNwbGl0IHBhcmFtZXRlciAqLworc3RydWN0IGR0c3BsaXQgeworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJczE2IGluZGV4OworCXMxNiBuc2xvdDsKKwlzdHJ1Y3QgY29tcG9uZW50X25hbWUgKmtleTsKKwlkZGF0YV90ICpkYXRhOworCXN0cnVjdCBweGRsaXN0ICpweGRsaXN0OworfTsKKworI2RlZmluZSBEVF9QQUdFKElQLCBNUCkgQlRfUEFHRShJUCwgTVAsIGR0cGFnZV90LCBpX2R0cm9vdCkKKworLyogZ2V0IHBhZ2UgYnVmZmVyIGZvciBzcGVjaWZpZWQgYmxvY2sgYWRkcmVzcyAqLworI2RlZmluZSBEVF9HRVRQQUdFKElQLCBCTiwgTVAsIFNJWkUsIFAsIFJDKVwKK3tcCisJQlRfR0VUUEFHRShJUCwgQk4sIE1QLCBkdHBhZ2VfdCwgU0laRSwgUCwgUkMsIGlfZHRyb290KVwKKwlpZiAoIShSQykpXAorCXtcCisJCWlmICgoKFApLT5oZWFkZXIubmV4dGluZGV4ID4gKCgoQk4pPT0wKT9EVFJPT1RNQVhTTE9UOihQKS0+aGVhZGVyLm1heHNsb3QpKSB8fFwKKwkJICAgICgoQk4pICYmICgoUCktPmhlYWRlci5tYXhzbG90ID4gRFRQQUdFTUFYU0xPVCkpKVwKKwkJe1wKKwkJCUJUX1BVVFBBR0UoTVApO1wKKwkJCWpmc19lcnJvcigoSVApLT5pX3NiLCAiRFRfR0VUUEFHRTogZHRyZWUgcGFnZSBjb3JydXB0Iik7XAorCQkJTVAgPSBOVUxMO1wKKwkJCVJDID0gLUVJTztcCisJCX1cCisJfVwKK30KKworLyogZm9yIGNvbnNpc3RlbmN5ICovCisjZGVmaW5lIERUX1BVVFBBR0UoTVApIEJUX1BVVFBBR0UoTVApCisKKyNkZWZpbmUgRFRfR0VUU0VBUkNIKElQLCBMRUFGLCBCTiwgTVAsIFAsIElOREVYKSBcCisJQlRfR0VUU0VBUkNIKElQLCBMRUFGLCBCTiwgTVAsIGR0cGFnZV90LCBQLCBJTkRFWCwgaV9kdHJvb3QpCisKKy8qCisgKiBmb3J3YXJkIHJlZmVyZW5jZXMKKyAqLworc3RhdGljIGludCBkdFNwbGl0VXAodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLAorCQkgICAgIHN0cnVjdCBkdHNwbGl0ICogc3BsaXQsIHN0cnVjdCBidHN0YWNrICogYnRzdGFjayk7CisKK3N0YXRpYyBpbnQgZHRTcGxpdFBhZ2UodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZHRzcGxpdCAqIHNwbGl0LAorCQkgICAgICAgc3RydWN0IG1ldGFwYWdlICoqIHJtcHAsIGR0cGFnZV90ICoqIHJwcCwgcHhkX3QgKiByeGRwKTsKKworc3RhdGljIGludCBkdEV4dGVuZFBhZ2UodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLAorCQkJc3RydWN0IGR0c3BsaXQgKiBzcGxpdCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrKTsKKworc3RhdGljIGludCBkdFNwbGl0Um9vdCh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsCisJCSAgICAgICBzdHJ1Y3QgZHRzcGxpdCAqIHNwbGl0LCBzdHJ1Y3QgbWV0YXBhZ2UgKiogcm1wcCk7CisKK3N0YXRpYyBpbnQgZHREZWxldGVVcCh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBtZXRhcGFnZSAqIGZtcCwKKwkJICAgICAgZHRwYWdlX3QgKiBmcCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrKTsKKworc3RhdGljIGludCBkdFJlbGluayh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIGR0cGFnZV90ICogcCk7CisKK3N0YXRpYyBpbnQgZHRSZWFkRmlyc3Qoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrKTsKKworc3RhdGljIGludCBkdFJlYWROZXh0KHN0cnVjdCBpbm9kZSAqaXAsCisJCSAgICAgIGxvZmZfdCAqIG9mZnNldCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrKTsKKworc3RhdGljIGludCBkdENvbXBhcmUoc3RydWN0IGNvbXBvbmVudF9uYW1lICoga2V5LCBkdHBhZ2VfdCAqIHAsIGludCBzaSk7CisKK3N0YXRpYyBpbnQgY2lDb21wYXJlKHN0cnVjdCBjb21wb25lbnRfbmFtZSAqIGtleSwgZHRwYWdlX3QgKiBwLCBpbnQgc2ksCisJCSAgICAgaW50IGZsYWcpOworCitzdGF0aWMgdm9pZCBkdEdldEtleShkdHBhZ2VfdCAqIHAsIGludCBpLCBzdHJ1Y3QgY29tcG9uZW50X25hbWUgKiBrZXksCisJCSAgICAgaW50IGZsYWcpOworCitzdGF0aWMgaW50IGNpR2V0TGVhZlByZWZpeEtleShkdHBhZ2VfdCAqIGxwLCBpbnQgbGksIGR0cGFnZV90ICogcnAsCisJCQkgICAgICBpbnQgcmksIHN0cnVjdCBjb21wb25lbnRfbmFtZSAqIGtleSwgaW50IGZsYWcpOworCitzdGF0aWMgdm9pZCBkdEluc2VydEVudHJ5KGR0cGFnZV90ICogcCwgaW50IGluZGV4LCBzdHJ1Y3QgY29tcG9uZW50X25hbWUgKiBrZXksCisJCQkgIGRkYXRhX3QgKiBkYXRhLCBzdHJ1Y3QgZHRfbG9jayAqKik7CisKK3N0YXRpYyB2b2lkIGR0TW92ZUVudHJ5KGR0cGFnZV90ICogc3AsIGludCBzaSwgZHRwYWdlX3QgKiBkcCwKKwkJCXN0cnVjdCBkdF9sb2NrICoqIHNkdGxvY2ssIHN0cnVjdCBkdF9sb2NrICoqIGRkdGxvY2ssCisJCQlpbnQgZG9faW5kZXgpOworCitzdGF0aWMgdm9pZCBkdERlbGV0ZUVudHJ5KGR0cGFnZV90ICogcCwgaW50IGZpLCBzdHJ1Y3QgZHRfbG9jayAqKiBkdGxvY2spOworCitzdGF0aWMgdm9pZCBkdFRydW5jYXRlRW50cnkoZHRwYWdlX3QgKiBwLCBpbnQgdGksIHN0cnVjdCBkdF9sb2NrICoqIGR0bG9jayk7CisKK3N0YXRpYyB2b2lkIGR0TGluZWxvY2tGcmVlbGlzdChkdHBhZ2VfdCAqIHAsIGludCBtLCBzdHJ1Y3QgZHRfbG9jayAqKiBkdGxvY2spOworCisjZGVmaW5lIGNpVG9VcHBlcihjKQlVbmlTdHJ1cHIoKGMpLT5uYW1lKQorCisvKgorICoJcmVhZF9pbmRleF9wYWdlKCkKKyAqCisgKglSZWFkcyBhIHBhZ2Ugb2YgYSBkaXJlY3RvcnkncyBpbmRleCB0YWJsZS4KKyAqCUhhdmluZyBtZXRhZGF0YSBtYXBwZWQgaW50byB0aGUgZGlyZWN0b3J5IGlub2RlJ3MgYWRkcmVzcyBzcGFjZQorICoJcHJlc2VudHMgYSBtdWx0aXR1ZGUgb2YgcHJvYmxlbXMuICBXZSBhdm9pZCB0aGlzIGJ5IG1hcHBpbmcgdG8KKyAqCXRoZSBhYnNvbHV0ZSBhZGRyZXNzIHNwYWNlIG91dHNpZGUgb2YgdGhlICpfbWV0YXBhZ2Ugcm91dGluZXMKKyAqLworc3RhdGljIHN0cnVjdCBtZXRhcGFnZSAqcmVhZF9pbmRleF9wYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHM2NCBibGtubykKK3sKKwlpbnQgcmM7CisJczY0IHhhZGRyOworCWludCB4ZmxhZzsKKwlzMzIgeGxlbjsKKworCXJjID0geHRMb29rdXAoaW5vZGUsIGJsa25vLCAxLCAmeGZsYWcsICZ4YWRkciwgJnhsZW4sIDEpOworCWlmIChyYyB8fCAoeGxlbiA9PSAwKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gcmVhZF9tZXRhcGFnZShpbm9kZSwgeGFkZHIsIFBTSVpFLCAxKTsKK30KKworLyoKKyAqCWdldF9pbmRleF9wYWdlKCkKKyAqCisgKglTYW1lIGFzIGdldF9pbmRleF9wYWdlKCksIGJ1dCBnZXQncyBhIG5ldyBwYWdlIHdpdGhvdXQgcmVhZGluZworICovCitzdGF0aWMgc3RydWN0IG1ldGFwYWdlICpnZXRfaW5kZXhfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzNjQgYmxrbm8pCit7CisJaW50IHJjOworCXM2NCB4YWRkcjsKKwlpbnQgeGZsYWc7CisJczMyIHhsZW47CisKKwlyYyA9IHh0TG9va3VwKGlub2RlLCBibGtubywgMSwgJnhmbGFnLCAmeGFkZHIsICZ4bGVuLCAxKTsKKwlpZiAocmMgfHwgKHhsZW4gPT0gMCkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGdldF9tZXRhcGFnZShpbm9kZSwgeGFkZHIsIFBTSVpFLCAxKTsKK30KKworLyoKKyAqCWZpbmRfaW5kZXgoKQorICoKKyAqCVJldHVybnMgZHRyZWUgcGFnZSBjb250YWluaW5nIGRpcmVjdG9yeSB0YWJsZSBlbnRyeSBmb3Igc3BlY2lmaWVkCisgKglpbmRleCBhbmQgcG9pbnRlciB0byBpdHMgZW50cnkuCisgKgorICoJbXAgbXVzdCBiZSByZWxlYXNlZCBieSBjYWxsZXIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGlyX3RhYmxlX3Nsb3QgKmZpbmRfaW5kZXgoc3RydWN0IGlub2RlICppcCwgdTMyIGluZGV4LAorCQkJCQkgc3RydWN0IG1ldGFwYWdlICoqIG1wLCBzNjQgKmxibG9jaykKK3sKKwlzdHJ1Y3QgamZzX2lub2RlX2luZm8gKmpmc19pcCA9IEpGU19JUChpcCk7CisJczY0IGJsa25vOworCXM2NCBvZmZzZXQ7CisJaW50IHBhZ2Vfb2Zmc2V0OworCXN0cnVjdCBkaXJfdGFibGVfc2xvdCAqc2xvdDsKKwlzdGF0aWMgaW50IG1heFdhcm5pbmdzID0gMTA7CisKKwlpZiAoaW5kZXggPCAyKSB7CisJCWlmIChtYXhXYXJuaW5ncykgeworCQkJamZzX3dhcm4oImZpbmRfZW50cnkgY2FsbGVkIHdpdGggaW5kZXggPSAlZCIsIGluZGV4KTsKKwkJCW1heFdhcm5pbmdzLS07CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGluZGV4ID49IGpmc19pcC0+bmV4dF9pbmRleCkgeworCQlqZnNfd2FybigiZmluZF9lbnRyeSBjYWxsZWQgd2l0aCBpbmRleCA+PSBuZXh0X2luZGV4Iik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChqZnNfZGlydGFibGVfaW5saW5lKGlwKSkgeworCQkvKgorCQkgKiBJbmxpbmUgZGlyZWN0b3J5IHRhYmxlCisJCSAqLworCQkqbXAgPSBOVUxMOworCQlzbG90ID0gJmpmc19pcC0+aV9kaXJ0YWJsZVtpbmRleCAtIDJdOworCX0gZWxzZSB7CisJCW9mZnNldCA9IChpbmRleCAtIDIpICogc2l6ZW9mKHN0cnVjdCBkaXJfdGFibGVfc2xvdCk7CisJCXBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0ICYgKFBTSVpFIC0gMSk7CisJCWJsa25vID0gKChvZmZzZXQgKyAxKSA+PiBMMlBTSVpFKSA8PAorCQkgICAgSkZTX1NCSShpcC0+aV9zYiktPmwybmJwZXJwYWdlOworCisJCWlmICgqbXAgJiYgKCpsYmxvY2sgIT0gYmxrbm8pKSB7CisJCQlyZWxlYXNlX21ldGFwYWdlKCptcCk7CisJCQkqbXAgPSBOVUxMOworCQl9CisJCWlmICgqbXAgPT0gMCkgeworCQkJKmxibG9jayA9IGJsa25vOworCQkJKm1wID0gcmVhZF9pbmRleF9wYWdlKGlwLCBibGtubyk7CisJCX0KKwkJaWYgKCptcCA9PSAwKSB7CisJCQlqZnNfZXJyKCJmcmVlX2luZGV4OiBlcnJvciByZWFkaW5nIGRpcmVjdG9yeSB0YWJsZSIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlzbG90ID0KKwkJICAgIChzdHJ1Y3QgZGlyX3RhYmxlX3Nsb3QgKikgKChjaGFyICopICgqbXApLT5kYXRhICsKKwkJCQkJICAgICAgIHBhZ2Vfb2Zmc2V0KTsKKwl9CisJcmV0dXJuIHNsb3Q7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2NrX2luZGV4KHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwgc3RydWN0IG1ldGFwYWdlICogbXAsCisJCQkgICAgICB1MzIgaW5kZXgpCit7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBsaW5lbG9jayAqbGxjazsKKwlzdHJ1Y3QgbHYgKmx2OworCisJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja0RBVEEpOworCWxsY2sgPSAoc3RydWN0IGxpbmVsb2NrICopIHRsY2stPmxvY2s7CisKKwlpZiAobGxjay0+aW5kZXggPj0gbGxjay0+bWF4Y250KQorCQlsbGNrID0gdHhMaW5lbG9jayhsbGNrKTsKKwlsdiA9ICZsbGNrLT5sdltsbGNrLT5pbmRleF07CisKKwkvKgorCSAqICAgICAgTGluZWxvY2sgc2xvdCBzaXplIGlzIHR3aWNlIHRoZSBzaXplIG9mIGRpcmVjdG9yeSB0YWJsZQorCSAqICAgICAgc2xvdCBzaXplLiAgNTEyIGVudHJpZXMgcGVyIHBhZ2UuCisJICovCisJbHYtPm9mZnNldCA9ICgoaW5kZXggLSAyKSAmIDUxMSkgPj4gMTsKKwlsdi0+bGVuZ3RoID0gMTsKKwlsbGNrLT5pbmRleCsrOworfQorCisvKgorICoJYWRkX2luZGV4KCkKKyAqCisgKglBZGRzIGFuIGVudHJ5IHRvIHRoZSBkaXJlY3RvcnkgaW5kZXggdGFibGUuICBUaGlzIGlzIHVzZWQgdG8gcHJvdmlkZQorICoJZWFjaCBkaXJlY3RvcnkgZW50cnkgd2l0aCBhIHBlcnNpc3RlbnQgaW5kZXggaW4gd2hpY2ggdG8gcmVzdW1lCisgKglkaXJlY3RvcnkgdHJhdmVyc2FscworICovCitzdGF0aWMgdTMyIGFkZF9pbmRleCh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIHM2NCBibiwgaW50IHNsb3QpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlwLT5pX3NiOworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShzYik7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqZnNfaXAgPSBKRlNfSVAoaXApOworCXU2NCBibGtubzsKKwlzdHJ1Y3QgZGlyX3RhYmxlX3Nsb3QgKmRpcnRhYl9zbG90OworCXUzMiBpbmRleDsKKwlzdHJ1Y3QgbGluZWxvY2sgKmxsY2s7CisJc3RydWN0IGx2ICpsdjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXM2NCBvZmZzZXQ7CisJdWludCBwYWdlX29mZnNldDsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJczY0IHhhZGRyOworCisJQVNTRVJUKERPX0lOREVYKGlwKSk7CisKKwlpZiAoamZzX2lwLT5uZXh0X2luZGV4IDwgMikgeworCQlqZnNfd2FybigiYWRkX2luZGV4OiBuZXh0X2luZGV4ID0gJWQuICBSZXNldHRpbmchIiwKKwkJCSAgIGpmc19pcC0+bmV4dF9pbmRleCk7CisJCWpmc19pcC0+bmV4dF9pbmRleCA9IDI7CisJfQorCisJaW5kZXggPSBqZnNfaXAtPm5leHRfaW5kZXgrKzsKKworCWlmIChpbmRleCA8PSBNQVhfSU5MSU5FX0RJUlRBQkxFX0VOVFJZKSB7CisJCS8qCisJCSAqIGlfc2l6ZSByZWZsZWN0cyBzaXplIG9mIGluZGV4IHRhYmxlLCBvciA4IGJ5dGVzIHBlciBlbnRyeS4KKwkJICovCisJCWlwLT5pX3NpemUgPSAobG9mZl90KSAoaW5kZXggLSAxKSA8PCAzOworCisJCS8qCisJCSAqIGRpciB0YWJsZSBmaXRzIGlubGluZSB3aXRoaW4gaW5vZGUKKwkJICovCisJCWRpcnRhYl9zbG90ID0gJmpmc19pcC0+aV9kaXJ0YWJsZVtpbmRleC0yXTsKKwkJZGlydGFiX3Nsb3QtPmZsYWcgPSBESVJfSU5ERVhfVkFMSUQ7CisJCWRpcnRhYl9zbG90LT5zbG90ID0gc2xvdDsKKwkJRFRTYWRkcmVzcyhkaXJ0YWJfc2xvdCwgYm4pOworCisJCXNldF9jZmxhZyhDT01NSVRfRGlydGFibGUsIGlwKTsKKworCQlyZXR1cm4gaW5kZXg7CisJfQorCWlmIChpbmRleCA9PSAoTUFYX0lOTElORV9ESVJUQUJMRV9FTlRSWSArIDEpKSB7CisJCXN0cnVjdCBkaXJfdGFibGVfc2xvdCB0ZW1wX3RhYmxlWzEyXTsKKworCQkvKgorCQkgKiBJdCdzIHRpbWUgdG8gbW92ZSB0aGUgaW5saW5lIHRhYmxlIHRvIGFuIGV4dGVybmFsCisJCSAqIHBhZ2UgYW5kIGJlZ2luIHRvIGJ1aWxkIHRoZSB4dHJlZQorCQkgKi8KKwkJaWYgKERRVU9UX0FMTE9DX0JMT0NLKGlwLCBzYmktPm5icGVycGFnZSkgfHwKKwkJICAgIGRiQWxsb2MoaXAsIDAsIHNiaS0+bmJwZXJwYWdlLCAmeGFkZHIpKQorCQkJZ290byBjbGVhbl91cDsJLyogTm8gc3BhY2UgKi8KKworCQkvKgorCQkgKiBTYXZlIHRoZSB0YWJsZSwgd2UncmUgZ29pbmcgdG8gb3ZlcndyaXRlIGl0IHdpdGggdGhlCisJCSAqIHh0cmVlIHJvb3QKKwkJICovCisJCW1lbWNweSh0ZW1wX3RhYmxlLCAmamZzX2lwLT5pX2RpcnRhYmxlLCBzaXplb2YodGVtcF90YWJsZSkpOworCisJCS8qCisJCSAqIEluaXRpYWxpemUgZW1wdHkgeC10cmVlCisJCSAqLworCQl4dEluaXRSb290KHRpZCwgaXApOworCisJCS8qCisJCSAqIEFsbG9jYXRlIHRoZSBmaXJzdCBibG9jayAmIGFkZCBpdCB0byB0aGUgeHRyZWUKKwkJICovCisJCWlmICh4dEluc2VydCh0aWQsIGlwLCAwLCAwLCBzYmktPm5icGVycGFnZSwgJnhhZGRyLCAwKSkgeworCQkJLyogVGhpcyByZWFsbHkgc2hvdWxkbid0IGZhaWwgKi8KKwkJCWpmc193YXJuKCJhZGRfaW5kZXg6IHh0SW5zZXJ0IGZhaWxlZCEiKTsKKwkJCW1lbWNweSgmamZzX2lwLT5pX2RpcnRhYmxlLCB0ZW1wX3RhYmxlLAorCQkJICAgICAgIHNpemVvZiAodGVtcF90YWJsZSkpOworCQkJZ290byBjbGVhbl91cDsKKwkJfQorCQlpcC0+aV9zaXplID0gUFNJWkU7CisKKwkJaWYgKChtcCA9IGdldF9pbmRleF9wYWdlKGlwLCAwKSkgPT0gMCkgeworCQkJamZzX2VycigiYWRkX2luZGV4OiBnZXRfbWV0YXBhZ2UgZmFpbGVkISIpOworCQkJeHRUcnVuY2F0ZSh0aWQsIGlwLCAwLCBDT01NSVRfUFdNQVApOworCQkJbWVtY3B5KCZqZnNfaXAtPmlfZGlydGFibGUsIHRlbXBfdGFibGUsCisJCQkgICAgICAgc2l6ZW9mICh0ZW1wX3RhYmxlKSk7CisJCQlnb3RvIGNsZWFuX3VwOworCQl9CisJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tEQVRBKTsKKwkJbGxjayA9IChzdHJ1Y3QgbGluZWxvY2sgKikgJiB0bGNrLT5sb2NrOworCQlBU1NFUlQobGxjay0+aW5kZXggPT0gMCk7CisJCWx2ID0gJmxsY2stPmx2WzBdOworCisJCWx2LT5vZmZzZXQgPSAwOworCQlsdi0+bGVuZ3RoID0gNjsJLyogdGxja0RBVEEgc2xvdCBzaXplIGlzIDE2IGJ5dGVzICovCisJCWxsY2stPmluZGV4Kys7CisKKwkJbWVtY3B5KG1wLT5kYXRhLCB0ZW1wX3RhYmxlLCBzaXplb2YodGVtcF90YWJsZSkpOworCisJCW1hcmtfbWV0YXBhZ2VfZGlydHkobXApOworCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKworCQkvKgorCQkgKiBMb2dnaW5nIGlzIG5vdyBkaXJlY3RlZCBieSB4dHJlZSB0bG9ja3MKKwkJICovCisJCWNsZWFyX2NmbGFnKENPTU1JVF9EaXJ0YWJsZSwgaXApOworCX0KKworCW9mZnNldCA9IChpbmRleCAtIDIpICogc2l6ZW9mKHN0cnVjdCBkaXJfdGFibGVfc2xvdCk7CisJcGFnZV9vZmZzZXQgPSBvZmZzZXQgJiAoUFNJWkUgLSAxKTsKKwlibGtubyA9ICgob2Zmc2V0ICsgMSkgPj4gTDJQU0laRSkgPDwgc2JpLT5sMm5icGVycGFnZTsKKwlpZiAocGFnZV9vZmZzZXQgPT0gMCkgeworCQkvKgorCQkgKiBUaGlzIHdpbGwgYmUgdGhlIGJlZ2lubmluZyBvZiBhIG5ldyBwYWdlCisJCSAqLworCQl4YWRkciA9IDA7CisJCWlmICh4dEluc2VydCh0aWQsIGlwLCAwLCBibGtubywgc2JpLT5uYnBlcnBhZ2UsICZ4YWRkciwgMCkpIHsKKwkJCWpmc193YXJuKCJhZGRfaW5kZXg6IHh0SW5zZXJ0IGZhaWxlZCEiKTsKKwkJCWdvdG8gY2xlYW5fdXA7CisJCX0KKwkJaXAtPmlfc2l6ZSArPSBQU0laRTsKKworCQlpZiAoKG1wID0gZ2V0X2luZGV4X3BhZ2UoaXAsIGJsa25vKSkpCisJCQltZW1zZXQobXAtPmRhdGEsIDAsIFBTSVpFKTsJLyogSnVzdCBsb29rcyBiZXR0ZXIgKi8KKwkJZWxzZQorCQkJeHRUcnVuY2F0ZSh0aWQsIGlwLCBvZmZzZXQsIENPTU1JVF9QV01BUCk7CisJfSBlbHNlCisJCW1wID0gcmVhZF9pbmRleF9wYWdlKGlwLCBibGtubyk7CisKKwlpZiAobXAgPT0gMCkgeworCQlqZnNfZXJyKCJhZGRfaW5kZXg6IGdldC9yZWFkX21ldGFwYWdlIGZhaWxlZCEiKTsKKwkJZ290byBjbGVhbl91cDsKKwl9CisKKwlsb2NrX2luZGV4KHRpZCwgaXAsIG1wLCBpbmRleCk7CisKKwlkaXJ0YWJfc2xvdCA9CisJICAgIChzdHJ1Y3QgZGlyX3RhYmxlX3Nsb3QgKikgKChjaGFyICopIG1wLT5kYXRhICsgcGFnZV9vZmZzZXQpOworCWRpcnRhYl9zbG90LT5mbGFnID0gRElSX0lOREVYX1ZBTElEOworCWRpcnRhYl9zbG90LT5zbG90ID0gc2xvdDsKKwlEVFNhZGRyZXNzKGRpcnRhYl9zbG90LCBibik7CisKKwltYXJrX21ldGFwYWdlX2RpcnR5KG1wKTsKKwlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKworCXJldHVybiBpbmRleDsKKworICAgICAgY2xlYW5fdXA6CisKKwlqZnNfaXAtPm5leHRfaW5kZXgtLTsKKworCXJldHVybiAwOworfQorCisvKgorICoJZnJlZV9pbmRleCgpCisgKgorICoJTWFya3MgYW4gZW50cnkgdG8gdGhlIGRpcmVjdG9yeSBpbmRleCB0YWJsZSBhcyBmcmVlLgorICovCitzdGF0aWMgdm9pZCBmcmVlX2luZGV4KHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwgdTMyIGluZGV4LCB1MzIgbmV4dCkKK3sKKwlzdHJ1Y3QgZGlyX3RhYmxlX3Nsb3QgKmRpcnRhYl9zbG90OworCXM2NCBsYmxvY2s7CisJc3RydWN0IG1ldGFwYWdlICptcCA9IE5VTEw7CisKKwlkaXJ0YWJfc2xvdCA9IGZpbmRfaW5kZXgoaXAsIGluZGV4LCAmbXAsICZsYmxvY2spOworCisJaWYgKGRpcnRhYl9zbG90ID09IDApCisJCXJldHVybjsKKworCWRpcnRhYl9zbG90LT5mbGFnID0gRElSX0lOREVYX0ZSRUU7CisJZGlydGFiX3Nsb3QtPnNsb3QgPSBkaXJ0YWJfc2xvdC0+YWRkcjEgPSAwOworCWRpcnRhYl9zbG90LT5hZGRyMiA9IGNwdV90b19sZTMyKG5leHQpOworCisJaWYgKG1wKSB7CisJCWxvY2tfaW5kZXgodGlkLCBpcCwgbXAsIGluZGV4KTsKKwkJbWFya19tZXRhcGFnZV9kaXJ0eShtcCk7CisJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCX0gZWxzZQorCQlzZXRfY2ZsYWcoQ09NTUlUX0RpcnRhYmxlLCBpcCk7Cit9CisKKy8qCisgKgltb2RpZnlfaW5kZXgoKQorICoKKyAqCUNoYW5nZXMgYW4gZW50cnkgaW4gdGhlIGRpcmVjdG9yeSBpbmRleCB0YWJsZQorICovCitzdGF0aWMgdm9pZCBtb2RpZnlfaW5kZXgodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCB1MzIgaW5kZXgsIHM2NCBibiwKKwkJCSBpbnQgc2xvdCwgc3RydWN0IG1ldGFwYWdlICoqIG1wLCB1NjQgKmxibG9jaykKK3sKKwlzdHJ1Y3QgZGlyX3RhYmxlX3Nsb3QgKmRpcnRhYl9zbG90OworCisJZGlydGFiX3Nsb3QgPSBmaW5kX2luZGV4KGlwLCBpbmRleCwgbXAsIGxibG9jayk7CisKKwlpZiAoZGlydGFiX3Nsb3QgPT0gMCkKKwkJcmV0dXJuOworCisJRFRTYWRkcmVzcyhkaXJ0YWJfc2xvdCwgYm4pOworCWRpcnRhYl9zbG90LT5zbG90ID0gc2xvdDsKKworCWlmICgqbXApIHsKKwkJbG9ja19pbmRleCh0aWQsIGlwLCAqbXAsIGluZGV4KTsKKwkJbWFya19tZXRhcGFnZV9kaXJ0eSgqbXApOworCX0gZWxzZQorCQlzZXRfY2ZsYWcoQ09NTUlUX0RpcnRhYmxlLCBpcCk7Cit9CisKKy8qCisgKglyZWFkX2luZGV4KCkKKyAqCisgKglyZWFkcyBhIGRpcmVjdG9yeSB0YWJsZSBzbG90CisgKi8KK3N0YXRpYyBpbnQgcmVhZF9pbmRleChzdHJ1Y3QgaW5vZGUgKmlwLCB1MzIgaW5kZXgsCisJCSAgICAgc3RydWN0IGRpcl90YWJsZV9zbG90ICogZGlydGFiX3Nsb3QpCit7CisJczY0IGxibG9jazsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wID0gTlVMTDsKKwlzdHJ1Y3QgZGlyX3RhYmxlX3Nsb3QgKnNsb3Q7CisKKwlzbG90ID0gZmluZF9pbmRleChpcCwgaW5kZXgsICZtcCwgJmxibG9jayk7CisJaWYgKHNsb3QgPT0gMCkgeworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltZW1jcHkoZGlydGFiX3Nsb3QsIHNsb3QsIHNpemVvZihzdHJ1Y3QgZGlyX3RhYmxlX3Nsb3QpKTsKKworCWlmIChtcCkKKwkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCWR0U2VhcmNoKCkKKyAqCisgKiBmdW5jdGlvbjoKKyAqCVNlYXJjaCBmb3IgdGhlIGVudHJ5IHdpdGggc3BlY2lmaWVkIGtleQorICoKKyAqIHBhcmFtZXRlcjoKKyAqCisgKiByZXR1cm46IDAgLSBzZWFyY2ggcmVzdWx0IG9uIHN0YWNrLCBsZWFmIHBhZ2UgcGlubmVkOworICoJICAgZXJybm8gLSBJL08gZXJyb3IKKyAqLworaW50IGR0U2VhcmNoKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBjb21wb25lbnRfbmFtZSAqIGtleSwgaW5vX3QgKiBkYXRhLAorCSAgICAgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrLCBpbnQgZmxhZykKK3sKKwlpbnQgcmMgPSAwOworCWludCBjbXAgPSAxOwkJLyogaW5pdCBmb3IgZW1wdHkgcGFnZSAqLworCXM2NCBibjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCWR0cGFnZV90ICpwOworCXM4ICpzdGJsOworCWludCBiYXNlLCBpbmRleCwgbGltOworCXN0cnVjdCBidGZyYW1lICpidHNwOworCXB4ZF90ICpweGQ7CisJaW50IHBzaXplID0gMjg4OwkvKiBpbml0aWFsIGluLWxpbmUgZGlyZWN0b3J5ICovCisJaW5vX3QgaW51bWJlcjsKKwlzdHJ1Y3QgY29tcG9uZW50X25hbWUgY2lLZXk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlwLT5pX3NiOworCisJY2lLZXkubmFtZSA9CisJICAgICh3Y2hhcl90ICopIGttYWxsb2MoKEpGU19OQU1FX01BWCArIDEpICogc2l6ZW9mKHdjaGFyX3QpLAorCQkJCUdGUF9OT0ZTKTsKKwlpZiAoY2lLZXkubmFtZSA9PSAwKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBkdFNlYXJjaF9FeGl0MjsKKwl9CisKKworCS8qIHVwcGVyY2FzZSBzZWFyY2gga2V5IGZvciBjLWkgZGlyZWN0b3J5ICovCisJVW5pU3RyY3B5KGNpS2V5Lm5hbWUsIGtleS0+bmFtZSk7CisJY2lLZXkubmFtbGVuID0ga2V5LT5uYW1sZW47CisKKwkvKiBvbmx5IHVwcGVyY2FzZSBpZiBjYXNlLWluc2Vuc2l0aXZlIHN1cHBvcnQgaXMgb24gKi8KKwlpZiAoKEpGU19TQkkoc2IpLT5tbnRmbGFnICYgSkZTX09TMikgPT0gSkZTX09TMikgeworCQljaVRvVXBwZXIoJmNpS2V5KTsKKwl9CisJQlRfQ0xSKGJ0c3RhY2spOwkvKiByZXNldCBzdGFjayAqLworCisJLyogaW5pdCBsZXZlbCBjb3VudCBmb3IgbWF4IHBhZ2VzIHRvIHNwbGl0ICovCisJYnRzdGFjay0+bnNwbGl0ID0gMTsKKworCS8qCisJICogICAgICBzZWFyY2ggZG93biB0cmVlIGZyb20gcm9vdDoKKwkgKgorCSAqIGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIGVudHJpZXMgb2YgPEtpLCBQaT4gYW5kIDxLaiwgUGo+IG9mCisJICogaW50ZXJuYWwgcGFnZSwgY2hpbGQgcGFnZSBQaSBjb250YWlucyBlbnRyeSB3aXRoIGssIEtpIDw9IEsgPCBLai4KKwkgKgorCSAqIGlmIGVudHJ5IHdpdGggc2VhcmNoIGtleSBLIGlzIG5vdCBmb3VuZAorCSAqIGludGVybmFsIHBhZ2Ugc2VhcmNoIGZpbmQgdGhlIGVudHJ5IHdpdGggbGFyZ2VzdCBrZXkgS2kKKwkgKiBsZXNzIHRoYW4gSyB3aGljaCBwb2ludCB0byB0aGUgY2hpbGQgcGFnZSB0byBzZWFyY2g7CisJICogbGVhZiBwYWdlIHNlYXJjaCBmaW5kIHRoZSBlbnRyeSB3aXRoIHNtYWxsZXN0IGtleSBLagorCSAqIGdyZWF0ZXIgdGhhbiBLIHNvIHRoYXQgdGhlIHJldHVybmVkIGluZGV4IGlzIHRoZSBwb3NpdGlvbiBvZgorCSAqIHRoZSBlbnRyeSB0byBiZSBzaGlmdGVkIHJpZ2h0IGZvciBpbnNlcnRpb24gb2YgbmV3IGVudHJ5LgorCSAqIGZvciBlbXB0eSB0cmVlLCBzZWFyY2gga2V5IGlzIGdyZWF0ZXIgdGhhbiBhbnkga2V5IG9mIHRoZSB0cmVlLgorCSAqCisJICogYnkgY29udmVudGlvbiwgcm9vdCBibiA9IDAuCisJICovCisJZm9yIChibiA9IDA7OykgeworCQkvKiBnZXQvcGluIHRoZSBwYWdlIHRvIHNlYXJjaCAqLworCQlEVF9HRVRQQUdFKGlwLCBibiwgbXAsIHBzaXplLCBwLCByYyk7CisJCWlmIChyYykKKwkJCWdvdG8gZHRTZWFyY2hfRXhpdDE7CisKKwkJLyogZ2V0IHNvcnRlZCBlbnRyeSB0YWJsZSBvZiB0aGUgcGFnZSAqLworCQlzdGJsID0gRFRfR0VUU1RCTChwKTsKKworCQkvKgorCQkgKiBiaW5hcnkgc2VhcmNoIHdpdGggc2VhcmNoIGtleSBLIG9uIHRoZSBjdXJyZW50IHBhZ2UuCisJCSAqLworCQlmb3IgKGJhc2UgPSAwLCBsaW0gPSBwLT5oZWFkZXIubmV4dGluZGV4OyBsaW07IGxpbSA+Pj0gMSkgeworCQkJaW5kZXggPSBiYXNlICsgKGxpbSA+PiAxKTsKKworCQkJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfTEVBRikgeworCQkJCS8qIHVwcGVyY2FzZSBsZWFmIG5hbWUgdG8gY29tcGFyZSAqLworCQkJCWNtcCA9CisJCQkJICAgIGNpQ29tcGFyZSgmY2lLZXksIHAsIHN0YmxbaW5kZXhdLAorCQkJCQkgICAgICBKRlNfU0JJKHNiKS0+bW50ZmxhZyk7CisJCQl9IGVsc2UgeworCQkJCS8qIHJvdXRlciBrZXkgaXMgaW4gdXBwZXJjYXNlICovCisKKwkJCQljbXAgPSBkdENvbXBhcmUoJmNpS2V5LCBwLCBzdGJsW2luZGV4XSk7CisKKworCQkJfQorCQkJaWYgKGNtcCA9PSAwKSB7CisJCQkJLyoKKwkJCQkgKiAgICAgIHNlYXJjaCBoaXQKKwkJCQkgKi8KKwkJCQkvKiBzZWFyY2ggaGl0IC0gbGVhZiBwYWdlOgorCQkJCSAqIHJldHVybiB0aGUgZW50cnkgZm91bmQKKwkJCQkgKi8KKwkJCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSB7CisJCQkJCWludW1iZXIgPSBsZTMyX3RvX2NwdSgKKwkJCSgoc3RydWN0IGxkdGVudHJ5ICopICYgcC0+c2xvdFtzdGJsW2luZGV4XV0pLT5pbnVtYmVyKTsKKworCQkJCQkvKgorCQkJCQkgKiBzZWFyY2ggZm9yIEpGU19MT09LVVAKKwkJCQkJICovCisJCQkJCWlmIChmbGFnID09IEpGU19MT09LVVApIHsKKwkJCQkJCSpkYXRhID0gaW51bWJlcjsKKwkJCQkJCXJjID0gMDsKKwkJCQkJCWdvdG8gb3V0OworCQkJCQl9CisKKwkJCQkJLyoKKwkJCQkJICogc2VhcmNoIGZvciBKRlNfQ1JFQVRFCisJCQkJCSAqLworCQkJCQlpZiAoZmxhZyA9PSBKRlNfQ1JFQVRFKSB7CisJCQkJCQkqZGF0YSA9IGludW1iZXI7CisJCQkJCQlyYyA9IC1FRVhJU1Q7CisJCQkJCQlnb3RvIG91dDsKKwkJCQkJfQorCisJCQkJCS8qCisJCQkJCSAqIHNlYXJjaCBmb3IgSkZTX1JFTU9WRSBvciBKRlNfUkVOQU1FCisJCQkJCSAqLworCQkJCQlpZiAoKGZsYWcgPT0gSkZTX1JFTU9WRSB8fAorCQkJCQkgICAgIGZsYWcgPT0gSkZTX1JFTkFNRSkgJiYKKwkJCQkJICAgICpkYXRhICE9IGludW1iZXIpIHsKKwkJCQkJCXJjID0gLUVTVEFMRTsKKwkJCQkJCWdvdG8gb3V0OworCQkJCQl9CisKKwkJCQkJLyoKKwkJCQkJICogSkZTX1JFTU9WRXxKRlNfRklORERJUnxKRlNfUkVOQU1FCisJCQkJCSAqLworCQkJCQkvKiBzYXZlIHNlYXJjaCByZXN1bHQgKi8KKwkJCQkJKmRhdGEgPSBpbnVtYmVyOworCQkJCQlidHNwID0gYnRzdGFjay0+dG9wOworCQkJCQlidHNwLT5ibiA9IGJuOworCQkJCQlidHNwLT5pbmRleCA9IGluZGV4OworCQkJCQlidHNwLT5tcCA9IG1wOworCisJCQkJCXJjID0gMDsKKwkJCQkJZ290byBkdFNlYXJjaF9FeGl0MTsKKwkJCQl9CisKKwkJCQkvKiBzZWFyY2ggaGl0IC0gaW50ZXJuYWwgcGFnZToKKwkJCQkgKiBkZXNjZW5kL3NlYXJjaCBpdHMgY2hpbGQgcGFnZQorCQkJCSAqLworCQkJCWdvdG8gZ2V0Q2hpbGQ7CisJCQl9CisKKwkJCWlmIChjbXAgPiAwKSB7CisJCQkJYmFzZSA9IGluZGV4ICsgMTsKKwkJCQktLWxpbTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqICAgICAgc2VhcmNoIG1pc3MKKwkJICoKKwkJICogYmFzZSBpcyB0aGUgc21hbGxlc3QgaW5kZXggd2l0aCBrZXkgKEtqKSBncmVhdGVyIHRoYW4KKwkJICogc2VhcmNoIGtleSAoSykgYW5kIG1heSBiZSB6ZXJvIG9yIChtYXhpbmRleCArIDEpIGluZGV4LgorCQkgKi8KKwkJLyoKKwkJICogc2VhcmNoIG1pc3MgLSBsZWFmIHBhZ2UKKwkJICoKKwkJICogcmV0dXJuIGxvY2F0aW9uIG9mIGVudHJ5IChiYXNlKSB3aGVyZSBuZXcgZW50cnkgd2l0aAorCQkgKiBzZWFyY2gga2V5IEsgaXMgdG8gYmUgaW5zZXJ0ZWQuCisJCSAqLworCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSB7CisJCQkvKgorCQkJICogc2VhcmNoIGZvciBKRlNfTE9PS1VQLCBKRlNfUkVNT1ZFLCBvciBKRlNfUkVOQU1FCisJCQkgKi8KKwkJCWlmIChmbGFnID09IEpGU19MT09LVVAgfHwgZmxhZyA9PSBKRlNfUkVNT1ZFIHx8CisJCQkgICAgZmxhZyA9PSBKRlNfUkVOQU1FKSB7CisJCQkJcmMgPSAtRU5PRU5UOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQkvKgorCQkJICogc2VhcmNoIGZvciBKRlNfQ1JFQVRFfEpGU19GSU5ERElSOgorCQkJICoKKwkJCSAqIHNhdmUgc2VhcmNoIHJlc3VsdAorCQkJICovCisJCQkqZGF0YSA9IDA7CisJCQlidHNwID0gYnRzdGFjay0+dG9wOworCQkJYnRzcC0+Ym4gPSBibjsKKwkJCWJ0c3AtPmluZGV4ID0gYmFzZTsKKwkJCWJ0c3AtPm1wID0gbXA7CisKKwkJCXJjID0gMDsKKwkJCWdvdG8gZHRTZWFyY2hfRXhpdDE7CisJCX0KKworCQkvKgorCQkgKiBzZWFyY2ggbWlzcyAtIGludGVybmFsIHBhZ2UKKwkJICoKKwkJICogaWYgYmFzZSBpcyBub24temVybywgZGVjcmVtZW50IGJhc2UgYnkgb25lIHRvIGdldCB0aGUgcGFyZW50CisJCSAqIGVudHJ5IG9mIHRoZSBjaGlsZCBwYWdlIHRvIHNlYXJjaC4KKwkJICovCisJCWluZGV4ID0gYmFzZSA/IGJhc2UgLSAxIDogYmFzZTsKKworCQkvKgorCQkgKiBnbyBkb3duIHRvIGNoaWxkIHBhZ2UKKwkJICovCisJICAgICAgZ2V0Q2hpbGQ6CisJCS8qIHVwZGF0ZSBtYXguIG51bWJlciBvZiBwYWdlcyB0byBzcGxpdCAqLworCQlpZiAoQlRfU1RBQ0tfRlVMTChidHN0YWNrKSkgeworCQkJLyogU29tZXRoaW5nJ3MgY29ycnVwdGVkLCBtYXJrIGZpbGVzeXRlbSBkaXJ0eSBzbworCQkJICogY2hrZHNrIHdpbGwgZml4IGl0LgorCQkJICovCisJCQlqZnNfZXJyb3Ioc2IsICJzdGFjayBvdmVycnVuIGluIGR0U2VhcmNoISIpOworCQkJQlRfU1RBQ0tfRFVNUChidHN0YWNrKTsKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWJ0c3RhY2stPm5zcGxpdCsrOworCisJCS8qIHB1c2ggKGJuLCBpbmRleCkgb2YgdGhlIHBhcmVudCBwYWdlL2VudHJ5ICovCisJCUJUX1BVU0goYnRzdGFjaywgYm4sIGluZGV4KTsKKworCQkvKiBnZXQgdGhlIGNoaWxkIHBhZ2UgYmxvY2sgbnVtYmVyICovCisJCXB4ZCA9IChweGRfdCAqKSAmIHAtPnNsb3Rbc3RibFtpbmRleF1dOworCQlibiA9IGFkZHJlc3NQWEQocHhkKTsKKwkJcHNpemUgPSBsZW5ndGhQWEQocHhkKSA8PCBKRlNfU0JJKGlwLT5pX3NiKS0+bDJic2l6ZTsKKworCQkvKiB1bnBpbiB0aGUgcGFyZW50IHBhZ2UgKi8KKwkJRFRfUFVUUEFHRShtcCk7CisJfQorCisgICAgICBvdXQ6CisJRFRfUFVUUEFHRShtcCk7CisKKyAgICAgIGR0U2VhcmNoX0V4aXQxOgorCisJa2ZyZWUoY2lLZXkubmFtZSk7CisKKyAgICAgIGR0U2VhcmNoX0V4aXQyOgorCisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKglkdEluc2VydCgpCisgKgorICogZnVuY3Rpb246IGluc2VydCBhbiBlbnRyeSB0byBkaXJlY3RvcnkgdHJlZQorICoKKyAqIHBhcmFtZXRlcjoKKyAqCisgKiByZXR1cm46IDAgLSBzdWNjZXNzOworICoJICAgZXJybm8gLSBmYWlsdXJlOworICovCitpbnQgZHRJbnNlcnQodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLAorCSBzdHJ1Y3QgY29tcG9uZW50X25hbWUgKiBuYW1lLCBpbm9fdCAqIGZzbiwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrKQoreworCWludCByYyA9IDA7CisJc3RydWN0IG1ldGFwYWdlICptcDsJLyogbWV0YS1wYWdlIGJ1ZmZlciAqLworCWR0cGFnZV90ICpwOwkJLyogYmFzZSBCKy10cmVlIGluZGV4IHBhZ2UgKi8KKwlzNjQgYm47CisJaW50IGluZGV4OworCXN0cnVjdCBkdHNwbGl0IHNwbGl0OwkvKiBzcGxpdCBpbmZvcm1hdGlvbiAqLworCWRkYXRhX3QgZGF0YTsKKwlzdHJ1Y3QgZHRfbG9jayAqZHRsY2s7CisJaW50IG47CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBsdiAqbHY7CisKKwkvKgorCSAqICAgICAgcmV0cmlldmUgc2VhcmNoIHJlc3VsdAorCSAqCisJICogZHRTZWFyY2goKSByZXR1cm5zIChsZWFmIHBhZ2UgcGlubmVkLCBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQpLgorCSAqIG4uYi4gZHRTZWFyY2goKSBtYXkgcmV0dXJuIGluZGV4IG9mIChtYXhpbmRleCArIDEpIG9mCisJICogdGhlIGZ1bGwgcGFnZS4KKwkgKi8KKwlEVF9HRVRTRUFSQ0goaXAsIGJ0c3RhY2stPnRvcCwgYm4sIG1wLCBwLCBpbmRleCk7CisKKwkvKgorCSAqICAgICAgaW5zZXJ0IGVudHJ5IGZvciBuZXcga2V5CisJICovCisJaWYgKERPX0lOREVYKGlwKSkgeworCQlpZiAoSkZTX0lQKGlwKS0+bmV4dF9pbmRleCA9PSBESVJFTkQpIHsKKwkJCURUX1BVVFBBR0UobXApOworCQkJcmV0dXJuIC1FTUxJTks7CisJCX0KKwkJbiA9IE5EVExFQUYobmFtZS0+bmFtbGVuKTsKKwkJZGF0YS5sZWFmLnRpZCA9IHRpZDsKKwkJZGF0YS5sZWFmLmlwID0gaXA7CisJfSBlbHNlIHsKKwkJbiA9IE5EVExFQUZfTEVHQUNZKG5hbWUtPm5hbWxlbik7CisJCWRhdGEubGVhZi5pcCA9IE5VTEw7CS8qIHNpZ25pZmllcyBsZWdhY3kgZGlyZWN0b3J5IGZvcm1hdCAqLworCX0KKwlkYXRhLmxlYWYuaW5vID0gKmZzbjsKKworCS8qCisJICogICAgICBsZWFmIHBhZ2UgZG9lcyBub3QgaGF2ZSBlbm91Z2ggcm9vbSBmb3IgbmV3IGVudHJ5OgorCSAqCisJICogICAgICBleHRlbmQvc3BsaXQgdGhlIGxlYWYgcGFnZTsKKwkgKgorCSAqIGR0U3BsaXRVcCgpIHdpbGwgaW5zZXJ0IHRoZSBlbnRyeSBhbmQgdW5waW4gdGhlIGxlYWYgcGFnZS4KKwkgKi8KKwlpZiAobiA+IHAtPmhlYWRlci5mcmVlY250KSB7CisJCXNwbGl0Lm1wID0gbXA7CisJCXNwbGl0LmluZGV4ID0gaW5kZXg7CisJCXNwbGl0Lm5zbG90ID0gbjsKKwkJc3BsaXQua2V5ID0gbmFtZTsKKwkJc3BsaXQuZGF0YSA9ICZkYXRhOworCQlyYyA9IGR0U3BsaXRVcCh0aWQsIGlwLCAmc3BsaXQsIGJ0c3RhY2spOworCQlyZXR1cm4gcmM7CisJfQorCisJLyoKKwkgKiAgICAgIGxlYWYgcGFnZSBkb2VzIGhhdmUgZW5vdWdoIHJvb20gZm9yIG5ldyBlbnRyeToKKwkgKgorCSAqICAgICAgaW5zZXJ0IHRoZSBuZXcgZGF0YSBlbnRyeSBpbnRvIHRoZSBsZWFmIHBhZ2U7CisJICovCisJQlRfTUFSS19ESVJUWShtcCwgaXApOworCS8qCisJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIGxlYWYgcGFnZQorCSAqLworCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tEVFJFRSB8IHRsY2tFTlRSWSk7CisJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCUFTU0VSVChkdGxjay0+aW5kZXggPT0gMCk7CisJbHYgPSAmIGR0bGNrLT5sdlswXTsKKworCS8qIGxpbmVsb2NrIGhlYWRlciAqLworCWx2LT5vZmZzZXQgPSAwOworCWx2LT5sZW5ndGggPSAxOworCWR0bGNrLT5pbmRleCsrOworCisJZHRJbnNlcnRFbnRyeShwLCBpbmRleCwgbmFtZSwgJmRhdGEsICZkdGxjayk7CisKKwkvKiBsaW5lbG9jayBzdGJsIG9mIG5vbi1yb290IGxlYWYgcGFnZSAqLworCWlmICghKHAtPmhlYWRlci5mbGFnICYgQlRfUk9PVCkpIHsKKwkJaWYgKGR0bGNrLT5pbmRleCA+PSBkdGxjay0+bWF4Y250KQorCQkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgdHhMaW5lbG9jayhkdGxjayk7CisJCWx2ID0gJiBkdGxjay0+bHZbZHRsY2stPmluZGV4XTsKKwkJbiA9IGluZGV4ID4+IEwyRFRTTE9UU0laRTsKKwkJbHYtPm9mZnNldCA9IHAtPmhlYWRlci5zdGJsaW5kZXggKyBuOworCQlsdi0+bGVuZ3RoID0KKwkJICAgICgocC0+aGVhZGVyLm5leHRpbmRleCAtIDEpID4+IEwyRFRTTE9UU0laRSkgLSBuICsgMTsKKwkJZHRsY2stPmluZGV4Kys7CisJfQorCisJLyogdW5waW4gdGhlIGxlYWYgcGFnZSAqLworCURUX1BVVFBBR0UobXApOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCWR0U3BsaXRVcCgpCisgKgorICogZnVuY3Rpb246IHByb3BhZ2F0ZSBpbnNlcnRpb24gYm90dG9tIHVwOworICoKKyAqIHBhcmFtZXRlcjoKKyAqCisgKiByZXR1cm46IDAgLSBzdWNjZXNzOworICoJICAgZXJybm8gLSBmYWlsdXJlOworICogCWxlYWYgcGFnZSB1bnBpbm5lZDsKKyAqLworc3RhdGljIGludCBkdFNwbGl0VXAodGlkX3QgdGlkLAorCSAgc3RydWN0IGlub2RlICppcCwgc3RydWN0IGR0c3BsaXQgKiBzcGxpdCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrKQoreworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShpcC0+aV9zYik7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKnNtcDsKKwlkdHBhZ2VfdCAqc3A7CQkvKiBzcGxpdCBwYWdlICovCisJc3RydWN0IG1ldGFwYWdlICpybXA7CisJZHRwYWdlX3QgKnJwOwkJLyogbmV3IHJpZ2h0IHBhZ2Ugc3BsaXQgZnJvbSBzcCAqLworCXB4ZF90IHJweGQ7CQkvKiBuZXcgcmlnaHQgcGFnZSBleHRlbnQgZGVzY3JpcHRvciAqLworCXN0cnVjdCBtZXRhcGFnZSAqbG1wOworCWR0cGFnZV90ICpscDsJCS8qIGxlZnQgY2hpbGQgcGFnZSAqLworCWludCBza2lwOwkJLyogaW5kZXggb2YgZW50cnkgb2YgaW5zZXJ0aW9uICovCisJc3RydWN0IGJ0ZnJhbWUgKnBhcmVudDsJLyogcGFyZW50IHBhZ2UgZW50cnkgb24gdHJhdmVyc2Ugc3RhY2sgKi8KKwlzNjQgeGFkZHIsIG54YWRkcjsKKwlpbnQgeGxlbiwgeHNpemU7CisJc3RydWN0IHB4ZGxpc3QgcHhkbGlzdDsKKwlweGRfdCAqcHhkOworCXN0cnVjdCBjb21wb25lbnRfbmFtZSBrZXkgPSB7IDAsIE5VTEwgfTsKKwlkZGF0YV90ICpkYXRhID0gc3BsaXQtPmRhdGE7CisJaW50IG47CisJc3RydWN0IGR0X2xvY2sgKmR0bGNrOworCXN0cnVjdCB0bG9jayAqdGxjazsKKwlzdHJ1Y3QgbHYgKmx2OworCWludCBxdW90YV9hbGxvY2F0aW9uID0gMDsKKworCS8qIGdldCBzcGxpdCBwYWdlICovCisJc21wID0gc3BsaXQtPm1wOworCXNwID0gRFRfUEFHRShpcCwgc21wKTsKKworCWtleS5uYW1lID0KKwkgICAgKHdjaGFyX3QgKikga21hbGxvYygoSkZTX05BTUVfTUFYICsgMikgKiBzaXplb2Yod2NoYXJfdCksCisJCQkJR0ZQX05PRlMpOworCWlmIChrZXkubmFtZSA9PSAwKSB7CisJCURUX1BVVFBBR0Uoc21wKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGR0U3BsaXRVcF9FeGl0OworCX0KKworCS8qCisJICogICAgICBzcGxpdCBsZWFmIHBhZ2UKKwkgKgorCSAqIFRoZSBzcGxpdCByb3V0aW5lcyBpbnNlcnQgdGhlIG5ldyBlbnRyeSwgYW5kCisJICogYWNxdWlyZSB0eExvY2sgYXMgYXBwcm9wcmlhdGUuCisJICovCisJLyoKKwkgKiAgICAgIHNwbGl0IHJvb3QgbGVhZiBwYWdlOgorCSAqLworCWlmIChzcC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSB7CisJCS8qCisJCSAqIGFsbG9jYXRlIGEgc2luZ2xlIGV4dGVudCBjaGlsZCBwYWdlCisJCSAqLworCQl4bGVuID0gMTsKKwkJbiA9IHNiaS0+YnNpemUgPj4gTDJEVFNMT1RTSVpFOworCQluIC09IChuICsgMzEpID4+IEwyRFRTTE9UU0laRTsJLyogc3RibCBzaXplICovCisJCW4gLT0gRFRST09UTUFYU0xPVCAtIHNwLT5oZWFkZXIuZnJlZWNudDsgLyogaGVhZGVyICsgZW50cmllcyAqLworCQlpZiAobiA8PSBzcGxpdC0+bnNsb3QpCisJCQl4bGVuKys7CisJCWlmICgocmMgPSBkYkFsbG9jKGlwLCAwLCAoczY0KSB4bGVuLCAmeGFkZHIpKSkgeworCQkJRFRfUFVUUEFHRShzbXApOworCQkJZ290byBmcmVlS2V5TmFtZTsKKwkJfQorCisJCXB4ZGxpc3QubWF4bnB4ZCA9IDE7CisJCXB4ZGxpc3QubnB4ZCA9IDA7CisJCXB4ZCA9ICZweGRsaXN0LnB4ZFswXTsKKwkJUFhEYWRkcmVzcyhweGQsIHhhZGRyKTsKKwkJUFhEbGVuZ3RoKHB4ZCwgeGxlbik7CisJCXNwbGl0LT5weGRsaXN0ID0gJnB4ZGxpc3Q7CisJCXJjID0gZHRTcGxpdFJvb3QodGlkLCBpcCwgc3BsaXQsICZybXApOworCisJCWlmIChyYykKKwkJCWRiRnJlZShpcCwgeGFkZHIsIHhsZW4pOworCQllbHNlCisJCQlEVF9QVVRQQUdFKHJtcCk7CisKKwkJRFRfUFVUUEFHRShzbXApOworCisJCWdvdG8gZnJlZUtleU5hbWU7CisJfQorCisJLyoKKwkgKiAgICAgIGV4dGVuZCBmaXJzdCBsZWFmIHBhZ2UKKwkgKgorCSAqIGV4dGVuZCB0aGUgMXN0IGV4dGVudCBpZiBsZXNzIHRoYW4gYnVmZmVyIHBhZ2Ugc2l6ZQorCSAqIChkdEV4dGVuZFBhZ2UoKSByZXVybnMgbGVhZiBwYWdlIHVucGlubmVkKQorCSAqLworCXB4ZCA9ICZzcC0+aGVhZGVyLnNlbGY7CisJeGxlbiA9IGxlbmd0aFBYRChweGQpOworCXhzaXplID0geGxlbiA8PCBzYmktPmwyYnNpemU7CisJaWYgKHhzaXplIDwgUFNJWkUpIHsKKwkJeGFkZHIgPSBhZGRyZXNzUFhEKHB4ZCk7CisJCW4gPSB4c2l6ZSA+PiBMMkRUU0xPVFNJWkU7CisJCW4gLT0gKG4gKyAzMSkgPj4gTDJEVFNMT1RTSVpFOwkvKiBzdGJsIHNpemUgKi8KKwkJaWYgKChuICsgc3AtPmhlYWRlci5mcmVlY250KSA8PSBzcGxpdC0+bnNsb3QpCisJCQluID0geGxlbiArICh4bGVuIDw8IDEpOworCQllbHNlCisJCQluID0geGxlbjsKKworCQkvKiBBbGxvY2F0ZSBibG9ja3MgdG8gcXVvdGEuICovCisJCWlmIChEUVVPVF9BTExPQ19CTE9DSyhpcCwgbikpIHsKKwkJCXJjID0gLUVEUVVPVDsKKwkJCWdvdG8gZXh0ZW5kT3V0OworCQl9CisJCXF1b3RhX2FsbG9jYXRpb24gKz0gbjsKKworCQlpZiAoKHJjID0gZGJSZUFsbG9jKHNiaS0+aXBibWFwLCB4YWRkciwgKHM2NCkgeGxlbiwKKwkJCQkgICAgKHM2NCkgbiwgJm54YWRkcikpKQorCQkJZ290byBleHRlbmRPdXQ7CisKKwkJcHhkbGlzdC5tYXhucHhkID0gMTsKKwkJcHhkbGlzdC5ucHhkID0gMDsKKwkJcHhkID0gJnB4ZGxpc3QucHhkWzBdOworCQlQWERhZGRyZXNzKHB4ZCwgbnhhZGRyKQorCQkgICAgUFhEbGVuZ3RoKHB4ZCwgeGxlbiArIG4pOworCQlzcGxpdC0+cHhkbGlzdCA9ICZweGRsaXN0OworCQlpZiAoKHJjID0gZHRFeHRlbmRQYWdlKHRpZCwgaXAsIHNwbGl0LCBidHN0YWNrKSkpIHsKKwkJCW54YWRkciA9IGFkZHJlc3NQWEQocHhkKTsKKwkJCWlmICh4YWRkciAhPSBueGFkZHIpIHsKKwkJCQkvKiBmcmVlIHJlbG9jYXRlZCBleHRlbnQgKi8KKwkJCQl4bGVuID0gbGVuZ3RoUFhEKHB4ZCk7CisJCQkJZGJGcmVlKGlwLCBueGFkZHIsIChzNjQpIHhsZW4pOworCQkJfSBlbHNlIHsKKwkJCQkvKiBmcmVlIGV4dGVuZGVkIGRlbHRhICovCisJCQkJeGxlbiA9IGxlbmd0aFBYRChweGQpIC0gbjsKKwkJCQl4YWRkciA9IGFkZHJlc3NQWEQocHhkKSArIHhsZW47CisJCQkJZGJGcmVlKGlwLCB4YWRkciwgKHM2NCkgbik7CisJCQl9CisJCX0KKworCSAgICAgIGV4dGVuZE91dDoKKwkJRFRfUFVUUEFHRShzbXApOworCQlnb3RvIGZyZWVLZXlOYW1lOworCX0KKworCS8qCisJICogICAgICBzcGxpdCBsZWFmIHBhZ2UgPHNwPiBpbnRvIDxzcD4gYW5kIGEgbmV3IHJpZ2h0IHBhZ2UgPHJwPi4KKwkgKgorCSAqIHJldHVybiA8cnA+IHBpbm5lZCBhbmQgaXRzIGV4dGVudCBkZXNjcmlwdG9yIDxycHhkPgorCSAqLworCS8qCisJICogYWxsb2NhdGUgbmV3IGRpcmVjdG9yeSBwYWdlIGV4dGVudCBhbmQKKwkgKiBuZXcgaW5kZXggcGFnZShzKSB0byBjb3ZlciBwYWdlIHNwbGl0KHMpCisJICoKKwkgKiBhbGxvY2F0aW9uIGhpbnQ6ID8KKwkgKi8KKwluID0gYnRzdGFjay0+bnNwbGl0OworCXB4ZGxpc3QubWF4bnB4ZCA9IHB4ZGxpc3QubnB4ZCA9IDA7CisJeGxlbiA9IHNiaS0+bmJwZXJwYWdlOworCWZvciAocHhkID0gcHhkbGlzdC5weGQ7IG4gPiAwOyBuLS0sIHB4ZCsrKSB7CisJCWlmICgocmMgPSBkYkFsbG9jKGlwLCAwLCAoczY0KSB4bGVuLCAmeGFkZHIpKSA9PSAwKSB7CisJCQlQWERhZGRyZXNzKHB4ZCwgeGFkZHIpOworCQkJUFhEbGVuZ3RoKHB4ZCwgeGxlbik7CisJCQlweGRsaXN0Lm1heG5weGQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJRFRfUFVUUEFHRShzbXApOworCisJCS8qIHVuZG8gYWxsb2NhdGlvbiAqLworCQlnb3RvIHNwbGl0T3V0OworCX0KKworCXNwbGl0LT5weGRsaXN0ID0gJnB4ZGxpc3Q7CisJaWYgKChyYyA9IGR0U3BsaXRQYWdlKHRpZCwgaXAsIHNwbGl0LCAmcm1wLCAmcnAsICZycHhkKSkpIHsKKwkJRFRfUFVUUEFHRShzbXApOworCisJCS8qIHVuZG8gYWxsb2NhdGlvbiAqLworCQlnb3RvIHNwbGl0T3V0OworCX0KKworCS8qCisJICogcHJvcGFnYXRlIHVwIHRoZSByb3V0ZXIgZW50cnkgZm9yIHRoZSBsZWFmIHBhZ2UganVzdCBzcGxpdAorCSAqCisJICogaW5zZXJ0IGEgcm91dGVyIGVudHJ5IGZvciB0aGUgbmV3IHBhZ2UgaW50byB0aGUgcGFyZW50IHBhZ2UsCisJICogcHJvcGFnYXRlIHRoZSBpbnNlcnQvc3BsaXQgdXAgdGhlIHRyZWUgYnkgd2Fsa2luZyBiYWNrIHRoZSBzdGFjaworCSAqIG9mIChibiBvZiBwYXJlbnQgcGFnZSwgaW5kZXggb2YgY2hpbGQgcGFnZSBlbnRyeSBpbiBwYXJlbnQgcGFnZSkKKwkgKiB0aGF0IHdlcmUgdHJhdmVyc2VkIGR1cmluZyB0aGUgc2VhcmNoIGZvciB0aGUgcGFnZSB0aGF0IHNwbGl0LgorCSAqCisJICogdGhlIHByb3BhZ2F0aW9uIG9mIGluc2VydC9zcGxpdCB1cCB0aGUgdHJlZSBzdG9wcyBpZiB0aGUgcm9vdAorCSAqIHNwbGl0cyBvciB0aGUgcGFnZSBpbnNlcnRlZCBpbnRvIGRvZXNuJ3QgaGF2ZSB0byBzcGxpdCB0byBob2xkCisJICogdGhlIG5ldyBlbnRyeS4KKwkgKgorCSAqIHRoZSBwYXJlbnQgZW50cnkgZm9yIHRoZSBzcGxpdCBwYWdlIHJlbWFpbnMgdGhlIHNhbWUsIGFuZAorCSAqIGEgbmV3IGVudHJ5IGlzIGluc2VydGVkIGF0IGl0cyByaWdodCB3aXRoIHRoZSBmaXJzdCBrZXkgYW5kCisJICogYmxvY2sgbnVtYmVyIG9mIHRoZSBuZXcgcmlnaHQgcGFnZS4KKwkgKgorCSAqIFRoZXJlIGFyZSBhIG1heGltdW0gb2YgNCBwYWdlcyBwaW5uZWQgYXQgYW55IHRpbWU6CisJICogdHdvIGNoaWxkcmVuLCBsZWZ0IHBhcmVudCBhbmQgcmlnaHQgcGFyZW50ICh3aGVuIHRoZSBwYXJlbnQgc3BsaXRzKS4KKwkgKiBrZWVwIHRoZSBjaGlsZCBwYWdlcyBwaW5uZWQgd2hpbGUgd29ya2luZyBvbiB0aGUgcGFyZW50LgorCSAqIG1ha2Ugc3VyZSB0aGF0IGFsbCBwaW5zIGFyZSByZWxlYXNlZCBhdCBleGl0LgorCSAqLworCXdoaWxlICgocGFyZW50ID0gQlRfUE9QKGJ0c3RhY2spKSAhPSBOVUxMKSB7CisJCS8qIHBhcmVudCBwYWdlIHNwZWNpZmllZCBieSBzdGFjayBmcmFtZSA8cGFyZW50PiAqLworCisJCS8qIGtlZXAgY3VycmVudCBjaGlsZCBwYWdlcyAoPGxwPiwgPHJwPikgcGlubmVkICovCisJCWxtcCA9IHNtcDsKKwkJbHAgPSBzcDsKKworCQkvKgorCQkgKiBpbnNlcnQgcm91dGVyIGVudHJ5IGluIHBhcmVudCBmb3IgbmV3IHJpZ2h0IGNoaWxkIHBhZ2UgPHJwPgorCQkgKi8KKwkJLyogZ2V0IHRoZSBwYXJlbnQgcGFnZSA8c3A+ICovCisJCURUX0dFVFBBR0UoaXAsIHBhcmVudC0+Ym4sIHNtcCwgUFNJWkUsIHNwLCByYyk7CisJCWlmIChyYykgeworCQkJRFRfUFVUUEFHRShsbXApOworCQkJRFRfUFVUUEFHRShybXApOworCQkJZ290byBzcGxpdE91dDsKKwkJfQorCisJCS8qCisJCSAqIFRoZSBuZXcga2V5IGVudHJ5IGdvZXMgT05FIEFGVEVSIHRoZSBpbmRleCBvZiBwYXJlbnQgZW50cnksCisJCSAqIGJlY2F1c2UgdGhlIHNwbGl0IHdhcyB0byB0aGUgcmlnaHQuCisJCSAqLworCQlza2lwID0gcGFyZW50LT5pbmRleCArIDE7CisKKwkJLyoKKwkJICogY29tcHV0ZSB0aGUga2V5IGZvciB0aGUgcm91dGVyIGVudHJ5CisJCSAqCisJCSAqIGtleSBzdWZmaXggY29tcHJlc3Npb246CisJCSAqIGZvciBpbnRlcm5hbCBwYWdlcyB0aGF0IGhhdmUgbGVhZiBwYWdlcyBhcyBjaGlsZHJlbiwKKwkJICogcmV0YWluIG9ubHkgd2hhdCdzIG5lZWRlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCisJCSAqIHRoZSBuZXcgZW50cnkgYW5kIHRoZSBlbnRyeSBvbiB0aGUgcGFnZSB0byBpdHMgbGVmdC4KKwkJICogSWYgdGhlIGtleXMgY29tcGFyZSBlcXVhbCwgcmV0YWluIHRoZSBlbnRpcmUga2V5LgorCQkgKgorCQkgKiBub3RlIHRoYXQgY29tcHJlc3Npb24gaXMgcGVyZm9ybWVkIG9ubHkgYXQgY29tcHV0aW5nCisJCSAqIHJvdXRlciBrZXkgYXQgdGhlIGxvd2VzdCBpbnRlcm5hbCBsZXZlbC4KKwkJICogZnVydGhlciBjb21wcmVzc2lvbiBvZiB0aGUga2V5IGJldHdlZW4gcGFpcnMgb2YgaGlnaGVyCisJCSAqIGxldmVsIGludGVybmFsIHBhZ2VzIGxvc2VzIHRvbyBtdWNoIGluZm9ybWF0aW9uIGFuZAorCQkgKiB0aGUgc2VhcmNoIG1heSBmYWlsLgorCQkgKiAoZS5nLiwgdHdvIGFkamFjZW50IGxlYWYgcGFnZXMgb2Yge2EsIC4uLiwgeH0ge3h4LCAuLi4sfQorCQkgKiByZXN1bHRzIGluIHR3byBhZGphY2VudCBwYXJlbnQgZW50cmllcyAoYSkoeHgpLgorCQkgKiBpZiBzcGxpdCBvY2N1cnMgYmV0d2VlbiB0aGVzZSB0d28gZW50cmllcywgYW5kCisJCSAqIGlmIGNvbXByZXNzaW9uIGlzIGFwcGxpZWQsIHRoZSByb3V0ZXIga2V5IG9mIHBhcmVudCBlbnRyeQorCQkgKiBvZiByaWdodCBwYWdlICh4KSB3aWxsIGRpdmVydCBzZWFyY2ggZm9yIHggaW50byByaWdodAorCQkgKiBzdWJ0cmVlIGFuZCBtaXNzIHggaW4gdGhlIGxlZnQgc3VidHJlZS4pCisJCSAqCisJCSAqIHRoZSBlbnRpcmUga2V5IG11c3QgYmUgcmV0YWluZWQgZm9yIHRoZSBuZXh0LXRvLWxlZnRtb3N0CisJCSAqIGludGVybmFsIGtleSBhdCBhbnkgbGV2ZWwgb2YgdGhlIHRyZWUsIG9yIHNlYXJjaCBtYXkgZmFpbAorCQkgKiAoZS5nLiwgPykKKwkJICovCisJCXN3aXRjaCAocnAtPmhlYWRlci5mbGFnICYgQlRfVFlQRSkgeworCQljYXNlIEJUX0xFQUY6CisJCQkvKgorCQkJICogY29tcHV0ZSB0aGUgbGVuZ3RoIG9mIHByZWZpeCBmb3Igc3VmZml4IGNvbXByZXNzaW9uCisJCQkgKiBiZXR3ZWVuIGxhc3QgZW50cnkgb2YgbGVmdCBwYWdlIGFuZCBmaXJzdCBlbnRyeQorCQkJICogb2YgcmlnaHQgcGFnZQorCQkJICovCisJCQlpZiAoKHNwLT5oZWFkZXIuZmxhZyAmIEJUX1JPT1QgJiYgc2tpcCA+IDEpIHx8CisJCQkgICAgc3AtPmhlYWRlci5wcmV2ICE9IDAgfHwgc2tpcCA+IDEpIHsKKwkJCQkvKiBjb21wdXRlIHVwcGVyY2FzZSByb3V0ZXIgcHJlZml4IGtleSAqLworCQkJCXJjID0gY2lHZXRMZWFmUHJlZml4S2V5KGxwLAorCQkJCQkJCWxwLT5oZWFkZXIubmV4dGluZGV4LTEsCisJCQkJCQkJcnAsIDAsICZrZXksCisJCQkJCQkJc2JpLT5tbnRmbGFnKTsKKwkJCQlpZiAocmMpIHsKKwkJCQkJRFRfUFVUUEFHRShsbXApOworCQkJCQlEVF9QVVRQQUdFKHJtcCk7CisJCQkJCURUX1BVVFBBR0Uoc21wKTsKKwkJCQkJZ290byBzcGxpdE91dDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIG5leHQgdG8gbGVmdG1vc3QgZW50cnkgb2YKKwkJCQkgICBsb3dlc3QgaW50ZXJuYWwgbGV2ZWwgKi8KKworCQkJCS8qIGNvbXB1dGUgdXBwZXJjYXNlIHJvdXRlciBrZXkgKi8KKwkJCQlkdEdldEtleShycCwgMCwgJmtleSwgc2JpLT5tbnRmbGFnKTsKKwkJCQlrZXkubmFtZVtrZXkubmFtbGVuXSA9IDA7CisKKwkJCQlpZiAoKHNiaS0+bW50ZmxhZyAmIEpGU19PUzIpID09IEpGU19PUzIpCisJCQkJCWNpVG9VcHBlcigma2V5KTsKKwkJCX0KKworCQkJbiA9IE5EVElOVEVSTkFMKGtleS5uYW1sZW4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBCVF9JTlRFUk5BTDoKKwkJCWR0R2V0S2V5KHJwLCAwLCAma2V5LCBzYmktPm1udGZsYWcpOworCQkJbiA9IE5EVElOVEVSTkFMKGtleS5uYW1sZW4pOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWpmc19lcnIoImR0U3BsaXRVcCgpOiBVRk8hIik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIHVucGluIGxlZnQgY2hpbGQgcGFnZSAqLworCQlEVF9QVVRQQUdFKGxtcCk7CisKKwkJLyoKKwkJICogY29tcHV0ZSB0aGUgZGF0YSBmb3IgdGhlIHJvdXRlciBlbnRyeQorCQkgKi8KKwkJZGF0YS0+eGQgPSBycHhkOwkvKiBjaGlsZCBwYWdlIHhkICovCisKKwkJLyoKKwkJICogcGFyZW50IHBhZ2UgaXMgZnVsbCAtIHNwbGl0IHRoZSBwYXJlbnQgcGFnZQorCQkgKi8KKwkJaWYgKG4gPiBzcC0+aGVhZGVyLmZyZWVjbnQpIHsKKwkJCS8qIGluaXQgZm9yIHBhcmVudCBwYWdlIHNwbGl0ICovCisJCQlzcGxpdC0+bXAgPSBzbXA7CisJCQlzcGxpdC0+aW5kZXggPSBza2lwOwkvKiBpbmRleCBhdCBpbnNlcnQgKi8KKwkJCXNwbGl0LT5uc2xvdCA9IG47CisJCQlzcGxpdC0+a2V5ID0gJmtleTsKKwkJCS8qIHNwbGl0LT5kYXRhID0gZGF0YTsgKi8KKworCQkJLyogdW5waW4gcmlnaHQgY2hpbGQgcGFnZSAqLworCQkJRFRfUFVUUEFHRShybXApOworCisJCQkvKiBUaGUgc3BsaXQgcm91dGluZXMgaW5zZXJ0IHRoZSBuZXcgZW50cnksCisJCQkgKiBhY3F1aXJlIHR4TG9jayBhcyBhcHByb3ByaWF0ZS4KKwkJCSAqIHJldHVybiA8cnA+IHBpbm5lZCBhbmQgaXRzIGJsb2NrIG51bWJlciA8cmJuPi4KKwkJCSAqLworCQkJcmMgPSAoc3AtPmhlYWRlci5mbGFnICYgQlRfUk9PVCkgPworCQkJICAgIGR0U3BsaXRSb290KHRpZCwgaXAsIHNwbGl0LCAmcm1wKSA6CisJCQkgICAgZHRTcGxpdFBhZ2UodGlkLCBpcCwgc3BsaXQsICZybXAsICZycCwgJnJweGQpOworCQkJaWYgKHJjKSB7CisJCQkJRFRfUFVUUEFHRShzbXApOworCQkJCWdvdG8gc3BsaXRPdXQ7CisJCQl9CisKKwkJCS8qIHNtcCBhbmQgcm1wIGFyZSBwaW5uZWQgKi8KKwkJfQorCQkvKgorCQkgKiBwYXJlbnQgcGFnZSBpcyBub3QgZnVsbCAtIGluc2VydCByb3V0ZXIgZW50cnkgaW4gcGFyZW50IHBhZ2UKKwkJICovCisJCWVsc2UgeworCQkJQlRfTUFSS19ESVJUWShzbXAsIGlwKTsKKwkJCS8qCisJCQkgKiBhY3F1aXJlIGEgdHJhbnNhY3Rpb24gbG9jayBvbiB0aGUgcGFyZW50IHBhZ2UKKwkJCSAqLworCQkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBzbXAsIHRsY2tEVFJFRSB8IHRsY2tFTlRSWSk7CisJCQlkdGxjayA9IChzdHJ1Y3QgZHRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisJCQlBU1NFUlQoZHRsY2stPmluZGV4ID09IDApOworCQkJbHYgPSAmIGR0bGNrLT5sdlswXTsKKworCQkJLyogbGluZWxvY2sgaGVhZGVyICovCisJCQlsdi0+b2Zmc2V0ID0gMDsKKwkJCWx2LT5sZW5ndGggPSAxOworCQkJZHRsY2stPmluZGV4Kys7CisKKwkJCS8qIGxpbmVsb2NrIHN0Ymwgb2Ygbm9uLXJvb3QgcGFyZW50IHBhZ2UgKi8KKwkJCWlmICghKHNwLT5oZWFkZXIuZmxhZyAmIEJUX1JPT1QpKSB7CisJCQkJbHYrKzsKKwkJCQluID0gc2tpcCA+PiBMMkRUU0xPVFNJWkU7CisJCQkJbHYtPm9mZnNldCA9IHNwLT5oZWFkZXIuc3RibGluZGV4ICsgbjsKKwkJCQlsdi0+bGVuZ3RoID0KKwkJCQkgICAgKChzcC0+aGVhZGVyLm5leHRpbmRleCAtCisJCQkJICAgICAgMSkgPj4gTDJEVFNMT1RTSVpFKSAtIG4gKyAxOworCQkJCWR0bGNrLT5pbmRleCsrOworCQkJfQorCisJCQlkdEluc2VydEVudHJ5KHNwLCBza2lwLCAma2V5LCBkYXRhLCAmZHRsY2spOworCisJCQkvKiBleGl0IHByb3BhZ2F0ZSB1cCAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiB1bnBpbiBjdXJyZW50IHNwbGl0IGFuZCBpdHMgcmlnaHQgcGFnZSAqLworCURUX1BVVFBBR0Uoc21wKTsKKwlEVF9QVVRQQUdFKHJtcCk7CisKKwkvKgorCSAqIGZyZWUgcmVtYWluaW5nIGV4dGVudHMgYWxsb2NhdGVkIGZvciBzcGxpdAorCSAqLworICAgICAgc3BsaXRPdXQ6CisJbiA9IHB4ZGxpc3QubnB4ZDsKKwlweGQgPSAmcHhkbGlzdC5weGRbbl07CisJZm9yICg7IG4gPCBweGRsaXN0Lm1heG5weGQ7IG4rKywgcHhkKyspCisJCWRiRnJlZShpcCwgYWRkcmVzc1BYRChweGQpLCAoczY0KSBsZW5ndGhQWEQocHhkKSk7CisKKyAgICAgIGZyZWVLZXlOYW1lOgorCWtmcmVlKGtleS5uYW1lKTsKKworCS8qIFJvbGxiYWNrIHF1b3RhIGFsbG9jYXRpb24gKi8KKwlpZiAocmMgJiYgcXVvdGFfYWxsb2NhdGlvbikKKwkJRFFVT1RfRlJFRV9CTE9DSyhpcCwgcXVvdGFfYWxsb2NhdGlvbik7CisKKyAgICAgIGR0U3BsaXRVcF9FeGl0OgorCisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKglkdFNwbGl0UGFnZSgpCisgKgorICogZnVuY3Rpb246IFNwbGl0IGEgbm9uLXJvb3QgcGFnZSBvZiBhIGJ0cmVlLgorICoKKyAqIHBhcmFtZXRlcjoKKyAqCisgKiByZXR1cm46IDAgLSBzdWNjZXNzOworICoJICAgZXJybm8gLSBmYWlsdXJlOworICoJcmV0dXJuIHNwbGl0IGFuZCBuZXcgcGFnZSBwaW5uZWQ7CisgKi8KK3N0YXRpYyBpbnQgZHRTcGxpdFBhZ2UodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZHRzcGxpdCAqIHNwbGl0LAorCSAgICBzdHJ1Y3QgbWV0YXBhZ2UgKiogcm1wcCwgZHRwYWdlX3QgKiogcnBwLCBweGRfdCAqIHJweGRwKQoreworCWludCByYyA9IDA7CisJc3RydWN0IG1ldGFwYWdlICpzbXA7CisJZHRwYWdlX3QgKnNwOworCXN0cnVjdCBtZXRhcGFnZSAqcm1wOworCWR0cGFnZV90ICpycDsJCS8qIG5ldyByaWdodCBwYWdlIGFsbG9jYXRlZCAqLworCXM2NCByYm47CQkvKiBuZXcgcmlnaHQgcGFnZSBibG9jayBudW1iZXIgKi8KKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCWR0cGFnZV90ICpwOworCXM2NCBuZXh0Ym47CisJc3RydWN0IHB4ZGxpc3QgKnB4ZGxpc3Q7CisJcHhkX3QgKnB4ZDsKKwlpbnQgc2tpcCwgbmV4dGluZGV4LCBoYWxmLCBsZWZ0LCBueHQsIG9mZiwgc2k7CisJc3RydWN0IGxkdGVudHJ5ICpsZHRlbnRyeTsKKwlzdHJ1Y3QgaWR0ZW50cnkgKmlkdGVudHJ5OworCXU4ICpzdGJsOworCXN0cnVjdCBkdHNsb3QgKmY7CisJaW50IGZzaSwgc3RibHNpemU7CisJaW50IG47CisJc3RydWN0IGR0X2xvY2sgKnNkdGxjaywgKnJkdGxjazsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJc3RydWN0IGR0X2xvY2sgKmR0bGNrOworCXN0cnVjdCBsdiAqc2x2LCAqcmx2LCAqbHY7CisKKwkvKiBnZXQgc3BsaXQgcGFnZSAqLworCXNtcCA9IHNwbGl0LT5tcDsKKwlzcCA9IERUX1BBR0UoaXAsIHNtcCk7CisKKwkvKgorCSAqIGFsbG9jYXRlIHRoZSBuZXcgcmlnaHQgcGFnZSBmb3IgdGhlIHNwbGl0CisJICovCisJcHhkbGlzdCA9IHNwbGl0LT5weGRsaXN0OworCXB4ZCA9ICZweGRsaXN0LT5weGRbcHhkbGlzdC0+bnB4ZF07CisJcHhkbGlzdC0+bnB4ZCsrOworCXJibiA9IGFkZHJlc3NQWEQocHhkKTsKKwlybXAgPSBnZXRfbWV0YXBhZ2UoaXAsIHJibiwgUFNJWkUsIDEpOworCWlmIChybXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBBbGxvY2F0ZSBibG9ja3MgdG8gcXVvdGEuICovCisJaWYgKERRVU9UX0FMTE9DX0JMT0NLKGlwLCBsZW5ndGhQWEQocHhkKSkpIHsKKwkJcmVsZWFzZV9tZXRhcGFnZShybXApOworCQlyZXR1cm4gLUVEUVVPVDsKKwl9CisKKwlqZnNfaW5mbygiZHRTcGxpdFBhZ2U6IGlwOjB4JXAgc21wOjB4JXAgcm1wOjB4JXAiLCBpcCwgc21wLCBybXApOworCisJQlRfTUFSS19ESVJUWShybXAsIGlwKTsKKwkvKgorCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBuZXcgcmlnaHQgcGFnZQorCSAqLworCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgcm1wLCB0bGNrRFRSRUUgfCB0bGNrTkVXKTsKKwlyZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCisJcnAgPSAoZHRwYWdlX3QgKikgcm1wLT5kYXRhOworCSpycHAgPSBycDsKKwlycC0+aGVhZGVyLnNlbGYgPSAqcHhkOworCisJQlRfTUFSS19ESVJUWShzbXAsIGlwKTsKKwkvKgorCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBzcGxpdCBwYWdlCisJICoKKwkgKiBhY3Rpb246CisJICovCisJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBzbXAsIHRsY2tEVFJFRSB8IHRsY2tFTlRSWSk7CisJc2R0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopICYgdGxjay0+bG9jazsKKworCS8qIGxpbmVsb2NrIGhlYWRlciBvZiBzcGxpdCBwYWdlICovCisJQVNTRVJUKHNkdGxjay0+aW5kZXggPT0gMCk7CisJc2x2ID0gJiBzZHRsY2stPmx2WzBdOworCXNsdi0+b2Zmc2V0ID0gMDsKKwlzbHYtPmxlbmd0aCA9IDE7CisJc2R0bGNrLT5pbmRleCsrOworCisJLyoKKwkgKiBpbml0aWFsaXplL3VwZGF0ZSBzaWJsaW5nIHBvaW50ZXJzIGJldHdlZW4gc3AgYW5kIHJwCisJICovCisJbmV4dGJuID0gbGU2NF90b19jcHUoc3AtPmhlYWRlci5uZXh0KTsKKwlycC0+aGVhZGVyLm5leHQgPSBjcHVfdG9fbGU2NChuZXh0Ym4pOworCXJwLT5oZWFkZXIucHJldiA9IGNwdV90b19sZTY0KGFkZHJlc3NQWEQoJnNwLT5oZWFkZXIuc2VsZikpOworCXNwLT5oZWFkZXIubmV4dCA9IGNwdV90b19sZTY0KHJibik7CisKKwkvKgorCSAqIGluaXRpYWxpemUgbmV3IHJpZ2h0IHBhZ2UKKwkgKi8KKwlycC0+aGVhZGVyLmZsYWcgPSBzcC0+aGVhZGVyLmZsYWc7CisKKwkvKiBjb21wdXRlIHNvcnRlZCBlbnRyeSB0YWJsZSBhdCBzdGFydCBvZiBleHRlbnQgZGF0YSBhcmVhICovCisJcnAtPmhlYWRlci5uZXh0aW5kZXggPSAwOworCXJwLT5oZWFkZXIuc3RibGluZGV4ID0gMTsKKworCW4gPSBQU0laRSA+PiBMMkRUU0xPVFNJWkU7CisJcnAtPmhlYWRlci5tYXhzbG90ID0gbjsKKwlzdGJsc2l6ZSA9IChuICsgMzEpID4+IEwyRFRTTE9UU0laRTsJLyogaW4gdW5pdCBvZiBzbG90ICovCisKKwkvKiBpbml0IGZyZWVsaXN0ICovCisJZnNpID0gcnAtPmhlYWRlci5zdGJsaW5kZXggKyBzdGJsc2l6ZTsKKwlycC0+aGVhZGVyLmZyZWVsaXN0ID0gZnNpOworCXJwLT5oZWFkZXIuZnJlZWNudCA9IHJwLT5oZWFkZXIubWF4c2xvdCAtIGZzaTsKKworCS8qCisJICogICAgICBzZXF1ZW50aWFsIGFwcGVuZCBhdCB0YWlsOiBhcHBlbmQgd2l0aG91dCBzcGxpdAorCSAqCisJICogSWYgc3BsaXR0aW5nIHRoZSBsYXN0IHBhZ2Ugb24gYSBsZXZlbCBiZWNhdXNlIG9mIGFwcGVuZGluZworCSAqIGEgZW50cnkgdG8gaXQgKHNraXAgaXMgbWF4ZW50cnkpLCBpdCdzIGxpa2VseSB0aGF0IHRoZSBhY2Nlc3MgaXMKKwkgKiBzZXF1ZW50aWFsLiBBZGRpbmcgYW4gZW1wdHkgcGFnZSBvbiB0aGUgc2lkZSBvZiB0aGUgbGV2ZWwgaXMgbGVzcworCSAqIHdvcmsgYW5kIGNhbiBwdXNoIHRoZSBmaWxsIGZhY3RvciBtdWNoIGhpZ2hlciB0aGFuIG5vcm1hbC4KKwkgKiBJZiB3ZSdyZSB3cm9uZyBpdCdzIG5vIGJpZyBkZWFsLCB3ZSdsbCBqdXN0IGRvIHRoZSBzcGxpdCB0aGUgcmlnaHQKKwkgKiB3YXkgbmV4dCB0aW1lLgorCSAqIChJdCBtYXkgbG9vayBsaWtlIGl0J3MgZXF1YWxseSBlYXN5IHRvIGRvIGEgc2ltaWxhciBoYWNrIGZvcgorCSAqIHJldmVyc2Ugc29ydGVkIGRhdGEsIHRoYXQgaXMsIHNwbGl0IHRoZSB0cmVlIGxlZnQsCisJICogYnV0IGl0J3Mgbm90LiBCZSBteSBndWVzdC4pCisJICovCisJaWYgKG5leHRibiA9PSAwICYmIHNwbGl0LT5pbmRleCA9PSBzcC0+aGVhZGVyLm5leHRpbmRleCkgeworCQkvKiBsaW5lbG9jayBoZWFkZXIgKyBzdGJsIChmaXJzdCBzbG90KSBvZiBuZXcgcGFnZSAqLworCQlybHYgPSAmIHJkdGxjay0+bHZbcmR0bGNrLT5pbmRleF07CisJCXJsdi0+b2Zmc2V0ID0gMDsKKwkJcmx2LT5sZW5ndGggPSAyOworCQlyZHRsY2stPmluZGV4Kys7CisKKwkJLyoKKwkJICogaW5pdGlhbGl6ZSBmcmVlbGlzdCBvZiBuZXcgcmlnaHQgcGFnZQorCQkgKi8KKwkJZiA9ICZycC0+c2xvdFtmc2ldOworCQlmb3IgKGZzaSsrOyBmc2kgPCBycC0+aGVhZGVyLm1heHNsb3Q7IGYrKywgZnNpKyspCisJCQlmLT5uZXh0ID0gZnNpOworCQlmLT5uZXh0ID0gLTE7CisKKwkJLyogaW5zZXJ0IGVudHJ5IGF0IHRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgbmV3IHJpZ2h0IHBhZ2UgKi8KKwkJZHRJbnNlcnRFbnRyeShycCwgMCwgc3BsaXQtPmtleSwgc3BsaXQtPmRhdGEsICZyZHRsY2spOworCisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogICAgICBub24tc2VxdWVudGlhbCBpbnNlcnQgKGF0IHBvc3NpYmx5IG1pZGRsZSBwYWdlKQorCSAqLworCisJLyoKKwkgKiB1cGRhdGUgcHJldiBwb2ludGVyIG9mIHByZXZpb3VzIHJpZ2h0IHNpYmxpbmcgcGFnZTsKKwkgKi8KKwlpZiAobmV4dGJuICE9IDApIHsKKwkJRFRfR0VUUEFHRShpcCwgbmV4dGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJaWYgKHJjKSB7CisJCQlkaXNjYXJkX21ldGFwYWdlKHJtcCk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisJCS8qCisJCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBuZXh0IHBhZ2UKKwkJICovCisJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tEVFJFRSB8IHRsY2tSRUxJTkspOworCQlqZnNfaW5mbygiZHRTcGxpdFBhZ2U6IHRsY2sgPSAweCVwLCBpcCA9IDB4JXAsIG1wPTB4JXAiLAorCQkJdGxjaywgaXAsIG1wKTsKKwkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCisJCS8qIGxpbmVsb2NrIGhlYWRlciBvZiBwcmV2aW91cyByaWdodCBzaWJsaW5nIHBhZ2UgKi8KKwkJbHYgPSAmIGR0bGNrLT5sdltkdGxjay0+aW5kZXhdOworCQlsdi0+b2Zmc2V0ID0gMDsKKwkJbHYtPmxlbmd0aCA9IDE7CisJCWR0bGNrLT5pbmRleCsrOworCisJCXAtPmhlYWRlci5wcmV2ID0gY3B1X3RvX2xlNjQocmJuKTsKKworCQlEVF9QVVRQQUdFKG1wKTsKKwl9CisKKwkvKgorCSAqIHNwbGl0IHRoZSBkYXRhIGJldHdlZW4gdGhlIHNwbGl0IGFuZCByaWdodCBwYWdlcy4KKwkgKi8KKwlza2lwID0gc3BsaXQtPmluZGV4OworCWhhbGYgPSAoUFNJWkUgPj4gTDJEVFNMT1RTSVpFKSA+PiAxOwkvKiBzd2FnICovCisJbGVmdCA9IDA7CisKKwkvKgorCSAqICAgICAgY29tcHV0ZSBmaWxsIGZhY3RvciBmb3Igc3BsaXQgcGFnZXMKKwkgKgorCSAqIDxueHQ+IHRyYWNlcyB0aGUgbmV4dCBlbnRyeSB0byBtb3ZlIHRvIHJwCisJICogPG9mZj4gdHJhY2VzIHRoZSBuZXh0IGVudHJ5IHRvIHN0YXkgaW4gc3AKKwkgKi8KKwlzdGJsID0gKHU4ICopICYgc3AtPnNsb3Rbc3AtPmhlYWRlci5zdGJsaW5kZXhdOworCW5leHRpbmRleCA9IHNwLT5oZWFkZXIubmV4dGluZGV4OworCWZvciAobnh0ID0gb2ZmID0gMDsgbnh0IDwgbmV4dGluZGV4OyArK29mZikgeworCQlpZiAob2ZmID09IHNraXApCisJCQkvKiBjaGVjayBmb3IgZmlsbCBmYWN0b3Igd2l0aCBuZXcgZW50cnkgc2l6ZSAqLworCQkJbiA9IHNwbGl0LT5uc2xvdDsKKwkJZWxzZSB7CisJCQlzaSA9IHN0Ymxbbnh0XTsKKwkJCXN3aXRjaCAoc3AtPmhlYWRlci5mbGFnICYgQlRfVFlQRSkgeworCQkJY2FzZSBCVF9MRUFGOgorCQkJCWxkdGVudHJ5ID0gKHN0cnVjdCBsZHRlbnRyeSAqKSAmIHNwLT5zbG90W3NpXTsKKwkJCQlpZiAoRE9fSU5ERVgoaXApKQorCQkJCQluID0gTkRUTEVBRihsZHRlbnRyeS0+bmFtbGVuKTsKKwkJCQllbHNlCisJCQkJCW4gPSBORFRMRUFGX0xFR0FDWShsZHRlbnRyeS0+CisJCQkJCQkJICAgbmFtbGVuKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBCVF9JTlRFUk5BTDoKKwkJCQlpZHRlbnRyeSA9IChzdHJ1Y3QgaWR0ZW50cnkgKikgJiBzcC0+c2xvdFtzaV07CisJCQkJbiA9IE5EVElOVEVSTkFMKGlkdGVudHJ5LT5uYW1sZW4pOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCisJCQkrK254dDsJLyogYWR2YW5jZSB0byBuZXh0IGVudHJ5IHRvIG1vdmUgaW4gc3AgKi8KKwkJfQorCisJCWxlZnQgKz0gbjsKKwkJaWYgKGxlZnQgPj0gaGFsZikKKwkJCWJyZWFrOworCX0KKworCS8qIDxueHQ+IHBvaW5zIHRvIHRoZSAxc3QgZW50cnkgdG8gbW92ZSAqLworCisJLyoKKwkgKiAgICAgIG1vdmUgZW50cmllcyB0byByaWdodCBwYWdlCisJICoKKwkgKiBkdE1vdmVFbnRyeSgpIGluaXRpYWxpemVzIHJwIGFuZCByZXNlcnZlcyBlbnRyeSBmb3IgaW5zZXJ0aW9uCisJICoKKwkgKiBzcGxpdCBwYWdlIG1vdmVkIG91dCBlbnRyaWVzIGFyZSBsaW5lbG9ja2VkOworCSAqIG5ldy9yaWdodCBwYWdlIG1vdmVkIGluIGVudHJpZXMgYXJlIGxpbmVsb2NrZWQ7CisJICovCisJLyogbGluZWxvY2sgaGVhZGVyICsgc3RibCBvZiBuZXcgcmlnaHQgcGFnZSAqLworCXJsdiA9ICYgcmR0bGNrLT5sdltyZHRsY2stPmluZGV4XTsKKwlybHYtPm9mZnNldCA9IDA7CisJcmx2LT5sZW5ndGggPSA1OworCXJkdGxjay0+aW5kZXgrKzsKKworCWR0TW92ZUVudHJ5KHNwLCBueHQsIHJwLCAmc2R0bGNrLCAmcmR0bGNrLCBET19JTkRFWChpcCkpOworCisJc3AtPmhlYWRlci5uZXh0aW5kZXggPSBueHQ7CisKKwkvKgorCSAqIGZpbmFsaXplIGZyZWVsaXN0IG9mIG5ldyByaWdodCBwYWdlCisJICovCisJZnNpID0gcnAtPmhlYWRlci5mcmVlbGlzdDsKKwlmID0gJnJwLT5zbG90W2ZzaV07CisJZm9yIChmc2krKzsgZnNpIDwgcnAtPmhlYWRlci5tYXhzbG90OyBmKyssIGZzaSsrKQorCQlmLT5uZXh0ID0gZnNpOworCWYtPm5leHQgPSAtMTsKKworCS8qCisJICogVXBkYXRlIGRpcmVjdG9yeSBpbmRleCB0YWJsZSBmb3IgZW50cmllcyBub3cgaW4gcmlnaHQgcGFnZQorCSAqLworCWlmICgocnAtPmhlYWRlci5mbGFnICYgQlRfTEVBRikgJiYgRE9fSU5ERVgoaXApKSB7CisJCXM2NCBsYmxvY2s7CisKKwkJbXAgPSBOVUxMOworCQlzdGJsID0gRFRfR0VUU1RCTChycCk7CisJCWZvciAobiA9IDA7IG4gPCBycC0+aGVhZGVyLm5leHRpbmRleDsgbisrKSB7CisJCQlsZHRlbnRyeSA9IChzdHJ1Y3QgbGR0ZW50cnkgKikgJiBycC0+c2xvdFtzdGJsW25dXTsKKwkJCW1vZGlmeV9pbmRleCh0aWQsIGlwLCBsZTMyX3RvX2NwdShsZHRlbnRyeS0+aW5kZXgpLAorCQkJCSAgICAgcmJuLCBuLCAmbXAsICZsYmxvY2spOworCQl9CisJCWlmIChtcCkKKwkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCX0KKworCS8qCisJICogdGhlIHNraXBwZWQgaW5kZXggd2FzIG9uIHRoZSBsZWZ0IHBhZ2UsCisJICovCisJaWYgKHNraXAgPD0gb2ZmKSB7CisJCS8qIGluc2VydCB0aGUgbmV3IGVudHJ5IGluIHRoZSBzcGxpdCBwYWdlICovCisJCWR0SW5zZXJ0RW50cnkoc3AsIHNraXAsIHNwbGl0LT5rZXksIHNwbGl0LT5kYXRhLCAmc2R0bGNrKTsKKworCQkvKiBsaW5lbG9jayBzdGJsIG9mIHNwbGl0IHBhZ2UgKi8KKwkJaWYgKHNkdGxjay0+aW5kZXggPj0gc2R0bGNrLT5tYXhjbnQpCisJCQlzZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgdHhMaW5lbG9jayhzZHRsY2spOworCQlzbHYgPSAmIHNkdGxjay0+bHZbc2R0bGNrLT5pbmRleF07CisJCW4gPSBza2lwID4+IEwyRFRTTE9UU0laRTsKKwkJc2x2LT5vZmZzZXQgPSBzcC0+aGVhZGVyLnN0YmxpbmRleCArIG47CisJCXNsdi0+bGVuZ3RoID0KKwkJICAgICgoc3AtPmhlYWRlci5uZXh0aW5kZXggLSAxKSA+PiBMMkRUU0xPVFNJWkUpIC0gbiArIDE7CisJCXNkdGxjay0+aW5kZXgrKzsKKwl9CisJLyoKKwkgKiB0aGUgc2tpcHBlZCBpbmRleCB3YXMgb24gdGhlIHJpZ2h0IHBhZ2UsCisJICovCisJZWxzZSB7CisJCS8qIGFkanVzdCB0aGUgc2tpcCBpbmRleCB0byByZWZsZWN0IHRoZSBuZXcgcG9zaXRpb24gKi8KKwkJc2tpcCAtPSBueHQ7CisKKwkJLyogaW5zZXJ0IHRoZSBuZXcgZW50cnkgaW4gdGhlIHJpZ2h0IHBhZ2UgKi8KKwkJZHRJbnNlcnRFbnRyeShycCwgc2tpcCwgc3BsaXQtPmtleSwgc3BsaXQtPmRhdGEsICZyZHRsY2spOworCX0KKworICAgICAgb3V0OgorCSpybXBwID0gcm1wOworCSpycHhkcCA9ICpweGQ7CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyoKKyAqCWR0RXh0ZW5kUGFnZSgpCisgKgorICogZnVuY3Rpb246IGV4dGVuZCAxc3Qvb25seSBkaXJlY3RvcnkgbGVhZiBwYWdlCisgKgorICogcGFyYW1ldGVyOgorICoKKyAqIHJldHVybjogMCAtIHN1Y2Nlc3M7CisgKgkgICBlcnJubyAtIGZhaWx1cmU7CisgKglyZXR1cm4gZXh0ZW5kZWQgcGFnZSBwaW5uZWQ7CisgKi8KK3N0YXRpYyBpbnQgZHRFeHRlbmRQYWdlKHRpZF90IHRpZCwKKwkgICAgIHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBkdHNwbGl0ICogc3BsaXQsIHN0cnVjdCBidHN0YWNrICogYnRzdGFjaykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaXAtPmlfc2I7CisJaW50IHJjOworCXN0cnVjdCBtZXRhcGFnZSAqc21wLCAqcG1wLCAqbXA7CisJZHRwYWdlX3QgKnNwLCAqcHA7CisJc3RydWN0IHB4ZGxpc3QgKnB4ZGxpc3Q7CisJcHhkX3QgKnB4ZCwgKnRweGQ7CisJaW50IHhsZW4sIHhzaXplOworCWludCBuZXdzdGJsaW5kZXgsIG5ld3N0YmxzaXplOworCWludCBvbGRzdGJsaW5kZXgsIG9sZHN0YmxzaXplOworCWludCBmc2ksIGxhc3Q7CisJc3RydWN0IGR0c2xvdCAqZjsKKwlzdHJ1Y3QgYnRmcmFtZSAqcGFyZW50OworCWludCBuOworCXN0cnVjdCBkdF9sb2NrICpkdGxjazsKKwlzNjQgeGFkZHIsIHR4YWRkcjsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJc3RydWN0IHB4ZF9sb2NrICpweGRsb2NrOworCXN0cnVjdCBsdiAqbHY7CisJdWludCB0eXBlOworCXN0cnVjdCBsZHRlbnRyeSAqbGR0ZW50cnk7CisJdTggKnN0Ymw7CisKKwkvKiBnZXQgcGFnZSB0byBleHRlbmQgKi8KKwlzbXAgPSBzcGxpdC0+bXA7CisJc3AgPSBEVF9QQUdFKGlwLCBzbXApOworCisJLyogZ2V0IHBhcmVudC9yb290IHBhZ2UgKi8KKwlwYXJlbnQgPSBCVF9QT1AoYnRzdGFjayk7CisJRFRfR0VUUEFHRShpcCwgcGFyZW50LT5ibiwgcG1wLCBQU0laRSwgcHAsIHJjKTsKKwlpZiAocmMpCisJCXJldHVybiAocmMpOworCisJLyoKKwkgKiAgICAgIGV4dGVuZCB0aGUgZXh0ZW50CisJICovCisJcHhkbGlzdCA9IHNwbGl0LT5weGRsaXN0OworCXB4ZCA9ICZweGRsaXN0LT5weGRbcHhkbGlzdC0+bnB4ZF07CisJcHhkbGlzdC0+bnB4ZCsrOworCisJeGFkZHIgPSBhZGRyZXNzUFhEKHB4ZCk7CisJdHB4ZCA9ICZzcC0+aGVhZGVyLnNlbGY7CisJdHhhZGRyID0gYWRkcmVzc1BYRCh0cHhkKTsKKwkvKiBpbi1wbGFjZSBleHRlbnNpb24gKi8KKwlpZiAoeGFkZHIgPT0gdHhhZGRyKSB7CisJCXR5cGUgPSB0bGNrRVhURU5EOworCX0KKwkvKiByZWxvY2F0aW9uICovCisJZWxzZSB7CisJCXR5cGUgPSB0bGNrTkVXOworCisJCS8qIHNhdmUgbW92ZWQgZXh0ZW50IGRlc2NyaXB0b3IgZm9yIGxhdGVyIGZyZWUgKi8KKwkJdGxjayA9IHR4TWFwbG9jayh0aWQsIGlwLCB0bGNrRFRSRUUgfCB0bGNrUkVMT0NBVEUpOworCQlweGRsb2NrID0gKHN0cnVjdCBweGRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisJCXB4ZGxvY2stPmZsYWcgPSBtbGNrRlJFRVBYRDsKKwkJcHhkbG9jay0+cHhkID0gc3AtPmhlYWRlci5zZWxmOworCQlweGRsb2NrLT5pbmRleCA9IDE7CisKKwkJLyoKKwkJICogVXBkYXRlIGRpcmVjdG9yeSBpbmRleCB0YWJsZSB0byByZWZsZWN0IG5ldyBwYWdlIGFkZHJlc3MKKwkJICovCisJCWlmIChET19JTkRFWChpcCkpIHsKKwkJCXM2NCBsYmxvY2s7CisKKwkJCW1wID0gTlVMTDsKKwkJCXN0YmwgPSBEVF9HRVRTVEJMKHNwKTsKKwkJCWZvciAobiA9IDA7IG4gPCBzcC0+aGVhZGVyLm5leHRpbmRleDsgbisrKSB7CisJCQkJbGR0ZW50cnkgPQorCQkJCSAgICAoc3RydWN0IGxkdGVudHJ5ICopICYgc3AtPnNsb3Rbc3RibFtuXV07CisJCQkJbW9kaWZ5X2luZGV4KHRpZCwgaXAsCisJCQkJCSAgICAgbGUzMl90b19jcHUobGR0ZW50cnktPmluZGV4KSwKKwkJCQkJICAgICB4YWRkciwgbiwgJm1wLCAmbGJsb2NrKTsKKwkJCX0KKwkJCWlmIChtcCkKKwkJCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJfQorCX0KKworCS8qCisJICogICAgICBleHRlbmQgdGhlIHBhZ2UKKwkgKi8KKwlzcC0+aGVhZGVyLnNlbGYgPSAqcHhkOworCisJamZzX2luZm8oImR0RXh0ZW5kUGFnZTogaXA6MHglcCBzbXA6MHglcCBzcDoweCVwIiwgaXAsIHNtcCwgc3ApOworCisJQlRfTUFSS19ESVJUWShzbXAsIGlwKTsKKwkvKgorCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBleHRlbmRlZC9sZWFmIHBhZ2UKKwkgKi8KKwl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIHNtcCwgdGxja0RUUkVFIHwgdHlwZSk7CisJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCWx2ID0gJiBkdGxjay0+bHZbMF07CisKKwkvKiB1cGRhdGUgYnVmZmVyIGV4dGVudCBkZXNjcmlwdG9yIG9mIGV4dGVuZGVkIHBhZ2UgKi8KKwl4bGVuID0gbGVuZ3RoUFhEKHB4ZCk7CisJeHNpemUgPSB4bGVuIDw8IEpGU19TQkkoc2IpLT5sMmJzaXplOworI2lmZGVmIF9TVElMTF9UT19QT1JUCisJYm1TZXRYRChzbXAsIHhhZGRyLCB4c2l6ZSk7CisjZW5kaWYJCQkJLyogIF9TVElMTF9UT19QT1JUICovCisKKwkvKgorCSAqIGNvcHkgb2xkIHN0YmwgdG8gbmV3IHN0YmwgYXQgc3RhcnQgb2YgZXh0ZW5kZWQgYXJlYQorCSAqLworCW9sZHN0YmxpbmRleCA9IHNwLT5oZWFkZXIuc3RibGluZGV4OworCW9sZHN0YmxzaXplID0gKHNwLT5oZWFkZXIubWF4c2xvdCArIDMxKSA+PiBMMkRUU0xPVFNJWkU7CisJbmV3c3RibGluZGV4ID0gc3AtPmhlYWRlci5tYXhzbG90OworCW4gPSB4c2l6ZSA+PiBMMkRUU0xPVFNJWkU7CisJbmV3c3RibHNpemUgPSAobiArIDMxKSA+PiBMMkRUU0xPVFNJWkU7CisJbWVtY3B5KCZzcC0+c2xvdFtuZXdzdGJsaW5kZXhdLCAmc3AtPnNsb3Rbb2xkc3RibGluZGV4XSwKKwkgICAgICAgc3AtPmhlYWRlci5uZXh0aW5kZXgpOworCisJLyoKKwkgKiBpbi1saW5lIGV4dGVuc2lvbjogbGluZWxvY2sgb2xkIGFyZWEgb2YgZXh0ZW5kZWQgcGFnZQorCSAqLworCWlmICh0eXBlID09IHRsY2tFWFRFTkQpIHsKKwkJLyogbGluZWxvY2sgaGVhZGVyICovCisJCWx2LT5vZmZzZXQgPSAwOworCQlsdi0+bGVuZ3RoID0gMTsKKwkJZHRsY2stPmluZGV4Kys7CisJCWx2Kys7CisKKwkJLyogbGluZWxvY2sgbmV3IHN0Ymwgb2YgZXh0ZW5kZWQgcGFnZSAqLworCQlsdi0+b2Zmc2V0ID0gbmV3c3RibGluZGV4OworCQlsdi0+bGVuZ3RoID0gbmV3c3RibHNpemU7CisJfQorCS8qCisJICogcmVsb2NhdGlvbjogbGluZWxvY2sgd2hvbGUgcmVsb2NhdGVkIGFyZWEKKwkgKi8KKwllbHNlIHsKKwkJbHYtPm9mZnNldCA9IDA7CisJCWx2LT5sZW5ndGggPSBzcC0+aGVhZGVyLm1heHNsb3QgKyBuZXdzdGJsc2l6ZTsKKwl9CisKKwlkdGxjay0+aW5kZXgrKzsKKworCXNwLT5oZWFkZXIubWF4c2xvdCA9IG47CisJc3AtPmhlYWRlci5zdGJsaW5kZXggPSBuZXdzdGJsaW5kZXg7CisJLyogc3AtPmhlYWRlci5uZXh0aW5kZXggcmVtYWlucyB0aGUgc2FtZSAqLworCisJLyoKKwkgKiBhZGQgb2xkIHN0YmwgcmVnaW9uIGF0IGhlYWQgb2YgZnJlZWxpc3QKKwkgKi8KKwlmc2kgPSBvbGRzdGJsaW5kZXg7CisJZiA9ICZzcC0+c2xvdFtmc2ldOworCWxhc3QgPSBzcC0+aGVhZGVyLmZyZWVsaXN0OworCWZvciAobiA9IDA7IG4gPCBvbGRzdGJsc2l6ZTsgbisrLCBmc2krKywgZisrKSB7CisJCWYtPm5leHQgPSBsYXN0OworCQlsYXN0ID0gZnNpOworCX0KKwlzcC0+aGVhZGVyLmZyZWVsaXN0ID0gbGFzdDsKKwlzcC0+aGVhZGVyLmZyZWVjbnQgKz0gb2xkc3RibHNpemU7CisKKwkvKgorCSAqIGFwcGVuZCBmcmVlIHJlZ2lvbiBvZiBuZXdseSBleHRlbmRlZCBhcmVhIGF0IHRhaWwgb2YgZnJlZWxpc3QKKwkgKi8KKwkvKiBpbml0IGZyZWUgcmVnaW9uIG9mIG5ld2x5IGV4dGVuZGVkIGFyZWEgKi8KKwlmc2kgPSBuID0gbmV3c3RibGluZGV4ICsgbmV3c3RibHNpemU7CisJZiA9ICZzcC0+c2xvdFtmc2ldOworCWZvciAoZnNpKys7IGZzaSA8IHNwLT5oZWFkZXIubWF4c2xvdDsgZisrLCBmc2krKykKKwkJZi0+bmV4dCA9IGZzaTsKKwlmLT5uZXh0ID0gLTE7CisKKwkvKiBhcHBlbmQgbmV3IGZyZWUgcmVnaW9uIGF0IHRhaWwgb2Ygb2xkIGZyZWVsaXN0ICovCisJZnNpID0gc3AtPmhlYWRlci5mcmVlbGlzdDsKKwlpZiAoZnNpID09IC0xKQorCQlzcC0+aGVhZGVyLmZyZWVsaXN0ID0gbjsKKwllbHNlIHsKKwkJZG8geworCQkJZiA9ICZzcC0+c2xvdFtmc2ldOworCQkJZnNpID0gZi0+bmV4dDsKKwkJfSB3aGlsZSAoZnNpICE9IC0xKTsKKworCQlmLT5uZXh0ID0gbjsKKwl9CisKKwlzcC0+aGVhZGVyLmZyZWVjbnQgKz0gc3AtPmhlYWRlci5tYXhzbG90IC0gbjsKKworCS8qCisJICogaW5zZXJ0IHRoZSBuZXcgZW50cnkKKwkgKi8KKwlkdEluc2VydEVudHJ5KHNwLCBzcGxpdC0+aW5kZXgsIHNwbGl0LT5rZXksIHNwbGl0LT5kYXRhLCAmZHRsY2spOworCisJQlRfTUFSS19ESVJUWShwbXAsIGlwKTsKKwkvKgorCSAqIGxpbmVsb2NrIGFueSBmcmVlc2xvdHMgcmVzaWRpbmcgaW4gb2xkIGV4dGVudAorCSAqLworCWlmICh0eXBlID09IHRsY2tFWFRFTkQpIHsKKwkJbiA9IHNwLT5oZWFkZXIubWF4c2xvdCA+PiAyOworCQlpZiAoc3AtPmhlYWRlci5mcmVlbGlzdCA8IG4pCisJCQlkdExpbmVsb2NrRnJlZWxpc3Qoc3AsIG4sICZkdGxjayk7CisJfQorCisJLyoKKwkgKiAgICAgIHVwZGF0ZSBwYXJlbnQgZW50cnkgb24gdGhlIHBhcmVudC9yb290IHBhZ2UKKwkgKi8KKwkvKgorCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBwYXJlbnQvcm9vdCBwYWdlCisJICovCisJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBwbXAsIHRsY2tEVFJFRSB8IHRsY2tFTlRSWSk7CisJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCWx2ID0gJiBkdGxjay0+bHZbZHRsY2stPmluZGV4XTsKKworCS8qIGxpbmVsb2NrIHBhcmVudCBlbnRyeSAtIDFzdCBzbG90ICovCisJbHYtPm9mZnNldCA9IDE7CisJbHYtPmxlbmd0aCA9IDE7CisJZHRsY2stPmluZGV4Kys7CisKKwkvKiB1cGRhdGUgdGhlIHBhcmVudCBweGQgZm9yIHBhZ2UgZXh0ZW5zaW9uICovCisJdHB4ZCA9IChweGRfdCAqKSAmIHBwLT5zbG90WzFdOworCSp0cHhkID0gKnB4ZDsKKworCURUX1BVVFBBR0UocG1wKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJZHRTcGxpdFJvb3QoKQorICoKKyAqIGZ1bmN0aW9uOgorICoJc3BsaXQgdGhlIGZ1bGwgcm9vdCBwYWdlIGludG8KKyAqCW9yaWdpbmFsL3Jvb3Qvc3BsaXQgcGFnZSBhbmQgbmV3IHJpZ2h0IHBhZ2UKKyAqCWkuZS4sIHJvb3QgcmVtYWlucyBmaXhlZCBpbiB0cmVlIGFuY2hvciAoaW5vZGUpIGFuZAorICoJdGhlIHJvb3QgaXMgY29waWVkIHRvIGEgc2luZ2xlIG5ldyByaWdodCBjaGlsZCBwYWdlCisgKglzaW5jZSByb290IHBhZ2UgPDwgbm9uLXJvb3QgcGFnZSwgYW5kCisgKgl0aGUgc3BsaXQgcm9vdCBwYWdlIGNvbnRhaW5zIGEgc2luZ2xlIGVudHJ5IGZvciB0aGUKKyAqCW5ldyByaWdodCBjaGlsZCBwYWdlLgorICoKKyAqIHBhcmFtZXRlcjoKKyAqCisgKiByZXR1cm46IDAgLSBzdWNjZXNzOworICoJICAgZXJybm8gLSBmYWlsdXJlOworICoJcmV0dXJuIG5ldyBwYWdlIHBpbm5lZDsKKyAqLworc3RhdGljIGludCBkdFNwbGl0Um9vdCh0aWRfdCB0aWQsCisJICAgIHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBkdHNwbGl0ICogc3BsaXQsIHN0cnVjdCBtZXRhcGFnZSAqKiBybXBwKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpcC0+aV9zYjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKnNtcDsKKwlkdHJvb3RfdCAqc3A7CisJc3RydWN0IG1ldGFwYWdlICpybXA7CisJZHRwYWdlX3QgKnJwOworCXM2NCByYm47CisJaW50IHhsZW47CisJaW50IHhzaXplOworCXN0cnVjdCBkdHNsb3QgKmY7CisJczggKnN0Ymw7CisJaW50IGZzaSwgc3RibHNpemUsIG47CisJc3RydWN0IGlkdGVudHJ5ICpzOworCXB4ZF90ICpwcHhkOworCXN0cnVjdCBweGRsaXN0ICpweGRsaXN0OworCXB4ZF90ICpweGQ7CisJc3RydWN0IGR0X2xvY2sgKmR0bGNrOworCXN0cnVjdCB0bG9jayAqdGxjazsKKwlzdHJ1Y3QgbHYgKmx2OworCisJLyogZ2V0IHNwbGl0IHJvb3QgcGFnZSAqLworCXNtcCA9IHNwbGl0LT5tcDsKKwlzcCA9ICZKRlNfSVAoaXApLT5pX2R0cm9vdDsKKworCS8qCisJICogICAgICBhbGxvY2F0ZS9pbml0aWFsaXplIGEgc2luZ2xlIChyaWdodCkgY2hpbGQgcGFnZQorCSAqCisJICogTi5CLiBhdCBmaXJzdCBzcGxpdCwgYSBvbmUgKG9yIHR3bykgYmxvY2sgdG8gZml0IG5ldyBlbnRyeQorCSAqIGlzIGFsbG9jYXRlZDsgYXQgc3Vic2VxdWVudCBzcGxpdCwgYSBmdWxsIHBhZ2UgaXMgYWxsb2NhdGVkOworCSAqLworCXB4ZGxpc3QgPSBzcGxpdC0+cHhkbGlzdDsKKwlweGQgPSAmcHhkbGlzdC0+cHhkW3B4ZGxpc3QtPm5weGRdOworCXB4ZGxpc3QtPm5weGQrKzsKKwlyYm4gPSBhZGRyZXNzUFhEKHB4ZCk7CisJeGxlbiA9IGxlbmd0aFBYRChweGQpOworCXhzaXplID0geGxlbiA8PCBKRlNfU0JJKHNiKS0+bDJic2l6ZTsKKwlybXAgPSBnZXRfbWV0YXBhZ2UoaXAsIHJibiwgeHNpemUsIDEpOworCWlmICghcm1wKQorCQlyZXR1cm4gLUVJTzsKKworCXJwID0gcm1wLT5kYXRhOworCisJLyogQWxsb2NhdGUgYmxvY2tzIHRvIHF1b3RhLiAqLworCWlmIChEUVVPVF9BTExPQ19CTE9DSyhpcCwgbGVuZ3RoUFhEKHB4ZCkpKSB7CisJCXJlbGVhc2VfbWV0YXBhZ2Uocm1wKTsKKwkJcmV0dXJuIC1FRFFVT1Q7CisJfQorCisJQlRfTUFSS19ESVJUWShybXAsIGlwKTsKKwkvKgorCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBuZXcgcmlnaHQgcGFnZQorCSAqLworCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgcm1wLCB0bGNrRFRSRUUgfCB0bGNrTkVXKTsKKwlkdGxjayA9IChzdHJ1Y3QgZHRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisKKwlycC0+aGVhZGVyLmZsYWcgPQorCSAgICAoc3AtPmhlYWRlci5mbGFnICYgQlRfTEVBRikgPyBCVF9MRUFGIDogQlRfSU5URVJOQUw7CisJcnAtPmhlYWRlci5zZWxmID0gKnB4ZDsKKworCS8qIGluaXRpYWxpemUgc2libGluZyBwb2ludGVycyAqLworCXJwLT5oZWFkZXIubmV4dCA9IDA7CisJcnAtPmhlYWRlci5wcmV2ID0gMDsKKworCS8qCisJICogICAgICBtb3ZlIGluLWxpbmUgcm9vdCBwYWdlIGludG8gbmV3IHJpZ2h0IHBhZ2UgZXh0ZW50CisJICovCisJLyogbGluZWxvY2sgaGVhZGVyICsgY29waWVkIGVudHJpZXMgKyBuZXcgc3RibCAoMXN0IHNsb3QpIGluIG5ldyBwYWdlICovCisJQVNTRVJUKGR0bGNrLT5pbmRleCA9PSAwKTsKKwlsdiA9ICYgZHRsY2stPmx2WzBdOworCWx2LT5vZmZzZXQgPSAwOworCWx2LT5sZW5ndGggPSAxMDsJLyogMSArIDggKyAxICovCisJZHRsY2stPmluZGV4Kys7CisKKwluID0geHNpemUgPj4gTDJEVFNMT1RTSVpFOworCXJwLT5oZWFkZXIubWF4c2xvdCA9IG47CisJc3RibHNpemUgPSAobiArIDMxKSA+PiBMMkRUU0xPVFNJWkU7CisKKwkvKiBjb3B5IG9sZCBzdGJsIHRvIG5ldyBzdGJsIGF0IHN0YXJ0IG9mIGV4dGVuZGVkIGFyZWEgKi8KKwlycC0+aGVhZGVyLnN0YmxpbmRleCA9IERUUk9PVE1BWFNMT1Q7CisJc3RibCA9IChzOCAqKSAmIHJwLT5zbG90W0RUUk9PVE1BWFNMT1RdOworCW1lbWNweShzdGJsLCBzcC0+aGVhZGVyLnN0YmwsIHNwLT5oZWFkZXIubmV4dGluZGV4KTsKKwlycC0+aGVhZGVyLm5leHRpbmRleCA9IHNwLT5oZWFkZXIubmV4dGluZGV4OworCisJLyogY29weSBvbGQgZGF0YSBhcmVhIHRvIHN0YXJ0IG9mIG5ldyBkYXRhIGFyZWEgKi8KKwltZW1jcHkoJnJwLT5zbG90WzFdLCAmc3AtPnNsb3RbMV0sIElEQVRBU0laRSk7CisKKwkvKgorCSAqIGFwcGVuZCBmcmVlIHJlZ2lvbiBvZiBuZXdseSBleHRlbmRlZCBhcmVhIGF0IHRhaWwgb2YgZnJlZWxpc3QKKwkgKi8KKwkvKiBpbml0IGZyZWUgcmVnaW9uIG9mIG5ld2x5IGV4dGVuZGVkIGFyZWEgKi8KKwlmc2kgPSBuID0gRFRST09UTUFYU0xPVCArIHN0YmxzaXplOworCWYgPSAmcnAtPnNsb3RbZnNpXTsKKwlmb3IgKGZzaSsrOyBmc2kgPCBycC0+aGVhZGVyLm1heHNsb3Q7IGYrKywgZnNpKyspCisJCWYtPm5leHQgPSBmc2k7CisJZi0+bmV4dCA9IC0xOworCisJLyogYXBwZW5kIG5ldyBmcmVlIHJlZ2lvbiBhdCB0YWlsIG9mIG9sZCBmcmVlbGlzdCAqLworCWZzaSA9IHNwLT5oZWFkZXIuZnJlZWxpc3Q7CisJaWYgKGZzaSA9PSAtMSkKKwkJcnAtPmhlYWRlci5mcmVlbGlzdCA9IG47CisJZWxzZSB7CisJCXJwLT5oZWFkZXIuZnJlZWxpc3QgPSBmc2k7CisKKwkJZG8geworCQkJZiA9ICZycC0+c2xvdFtmc2ldOworCQkJZnNpID0gZi0+bmV4dDsKKwkJfSB3aGlsZSAoZnNpICE9IC0xKTsKKworCQlmLT5uZXh0ID0gbjsKKwl9CisKKwlycC0+aGVhZGVyLmZyZWVjbnQgPSBzcC0+aGVhZGVyLmZyZWVjbnQgKyBycC0+aGVhZGVyLm1heHNsb3QgLSBuOworCisJLyoKKwkgKiBVcGRhdGUgZGlyZWN0b3J5IGluZGV4IHRhYmxlIGZvciBlbnRyaWVzIG5vdyBpbiByaWdodCBwYWdlCisJICovCisJaWYgKChycC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSAmJiBET19JTkRFWChpcCkpIHsKKwkJczY0IGxibG9jazsKKwkJc3RydWN0IG1ldGFwYWdlICptcCA9IE5VTEw7CisJCXN0cnVjdCBsZHRlbnRyeSAqbGR0ZW50cnk7CisKKwkJc3RibCA9IERUX0dFVFNUQkwocnApOworCQlmb3IgKG4gPSAwOyBuIDwgcnAtPmhlYWRlci5uZXh0aW5kZXg7IG4rKykgeworCQkJbGR0ZW50cnkgPSAoc3RydWN0IGxkdGVudHJ5ICopICYgcnAtPnNsb3Rbc3RibFtuXV07CisJCQltb2RpZnlfaW5kZXgodGlkLCBpcCwgbGUzMl90b19jcHUobGR0ZW50cnktPmluZGV4KSwKKwkJCQkgICAgIHJibiwgbiwgJm1wLCAmbGJsb2NrKTsKKwkJfQorCQlpZiAobXApCisJCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwl9CisJLyoKKwkgKiBpbnNlcnQgdGhlIG5ldyBlbnRyeSBpbnRvIHRoZSBuZXcgcmlnaHQvY2hpbGQgcGFnZQorCSAqIChza2lwIGluZGV4IGluIHRoZSBuZXcgcmlnaHQgcGFnZSB3aWxsIG5vdCBjaGFuZ2UpCisJICovCisJZHRJbnNlcnRFbnRyeShycCwgc3BsaXQtPmluZGV4LCBzcGxpdC0+a2V5LCBzcGxpdC0+ZGF0YSwgJmR0bGNrKTsKKworCS8qCisJICogICAgICByZXNldCBwYXJlbnQvcm9vdCBwYWdlCisJICoKKwkgKiBzZXQgdGhlIDFzdCBlbnRyeSBvZmZzZXQgdG8gMCwgd2hpY2ggZm9yY2UgdGhlIGxlZnQtbW9zdCBrZXkKKwkgKiBhdCBhbnkgbGV2ZWwgb2YgdGhlIHRyZWUgdG8gYmUgbGVzcyB0aGFuIGFueSBzZWFyY2gga2V5LgorCSAqCisJICogVGhlIGJ0cmVlIGNvbXBhcmlzb24gY29kZSBndWFyYW50ZWVzIHRoYXQgdGhlIGxlZnQtbW9zdCBrZXkgb24gYW55CisJICogbGV2ZWwgb2YgdGhlIHRyZWUgaXMgbmV2ZXIgdXNlZCwgc28gaXQgZG9lc24ndCBuZWVkIHRvIGJlIGZpbGxlZCBpbi4KKwkgKi8KKwlCVF9NQVJLX0RJUlRZKHNtcCwgaXApOworCS8qCisJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIHJvb3QgcGFnZSAoaW4tbWVtb3J5IGlub2RlKQorCSAqLworCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgc21wLCB0bGNrRFRSRUUgfCB0bGNrTkVXIHwgdGxja0JUUk9PVCk7CisJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCisJLyogbGluZWxvY2sgcm9vdCAqLworCUFTU0VSVChkdGxjay0+aW5kZXggPT0gMCk7CisJbHYgPSAmIGR0bGNrLT5sdlswXTsKKwlsdi0+b2Zmc2V0ID0gMDsKKwlsdi0+bGVuZ3RoID0gRFRST09UTUFYU0xPVDsKKwlkdGxjay0+aW5kZXgrKzsKKworCS8qIHVwZGF0ZSBwYWdlIGhlYWRlciBvZiByb290ICovCisJaWYgKHNwLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpIHsKKwkJc3AtPmhlYWRlci5mbGFnICY9IH5CVF9MRUFGOworCQlzcC0+aGVhZGVyLmZsYWcgfD0gQlRfSU5URVJOQUw7CisJfQorCisJLyogaW5pdCB0aGUgZmlyc3QgZW50cnkgKi8KKwlzID0gKHN0cnVjdCBpZHRlbnRyeSAqKSAmIHNwLT5zbG90W0RURU5UUllTVEFSVF07CisJcHB4ZCA9IChweGRfdCAqKSBzOworCSpwcHhkID0gKnB4ZDsKKwlzLT5uZXh0ID0gLTE7CisJcy0+bmFtbGVuID0gMDsKKworCXN0YmwgPSBzcC0+aGVhZGVyLnN0Ymw7CisJc3RibFswXSA9IERURU5UUllTVEFSVDsKKwlzcC0+aGVhZGVyLm5leHRpbmRleCA9IDE7CisKKwkvKiBpbml0IGZyZWVsaXN0ICovCisJZnNpID0gRFRFTlRSWVNUQVJUICsgMTsKKwlmID0gJnNwLT5zbG90W2ZzaV07CisKKwkvKiBpbml0IGZyZWUgcmVnaW9uIG9mIHJlbWFpbmluZyBhcmVhICovCisJZm9yIChmc2krKzsgZnNpIDwgRFRST09UTUFYU0xPVDsgZisrLCBmc2krKykKKwkJZi0+bmV4dCA9IGZzaTsKKwlmLT5uZXh0ID0gLTE7CisKKwlzcC0+aGVhZGVyLmZyZWVsaXN0ID0gRFRFTlRSWVNUQVJUICsgMTsKKwlzcC0+aGVhZGVyLmZyZWVjbnQgPSBEVFJPT1RNQVhTTE9UIC0gKERURU5UUllTVEFSVCArIDEpOworCisJKnJtcHAgPSBybXA7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJZHREZWxldGUoKQorICoKKyAqIGZ1bmN0aW9uOiBkZWxldGUgdGhlIGVudHJ5KHMpIHJlZmVyZW5jZWQgYnkgYSBrZXkuCisgKgorICogcGFyYW1ldGVyOgorICoKKyAqIHJldHVybjoKKyAqLworaW50IGR0RGVsZXRlKHRpZF90IHRpZCwKKwkgc3RydWN0IGlub2RlICppcCwgc3RydWN0IGNvbXBvbmVudF9uYW1lICoga2V5LCBpbm9fdCAqIGlubywgaW50IGZsYWcpCit7CisJaW50IHJjID0gMDsKKwlzNjQgYm47CisJc3RydWN0IG1ldGFwYWdlICptcCwgKmltcDsKKwlkdHBhZ2VfdCAqcDsKKwlpbnQgaW5kZXg7CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsKKwlzdHJ1Y3QgZHRfbG9jayAqZHRsY2s7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBsdiAqbHY7CisJaW50IGk7CisJc3RydWN0IGxkdGVudHJ5ICpsZHRlbnRyeTsKKwl1OCAqc3RibDsKKwl1MzIgdGFibGVfaW5kZXgsIG5leHRfaW5kZXg7CisJc3RydWN0IG1ldGFwYWdlICpubXA7CisJZHRwYWdlX3QgKm5wOworCisJLyoKKwkgKiAgICAgIHNlYXJjaCBmb3IgdGhlIGVudHJ5IHRvIGRlbGV0ZToKKwkgKgorCSAqIGR0U2VhcmNoKCkgcmV0dXJucyAobGVhZiBwYWdlIHBpbm5lZCwgaW5kZXggYXQgd2hpY2ggdG8gZGVsZXRlKS4KKwkgKi8KKwlpZiAoKHJjID0gZHRTZWFyY2goaXAsIGtleSwgaW5vLCAmYnRzdGFjaywgZmxhZykpKQorCQlyZXR1cm4gcmM7CisKKwkvKiByZXRyaWV2ZSBzZWFyY2ggcmVzdWx0ICovCisJRFRfR0VUU0VBUkNIKGlwLCBidHN0YWNrLnRvcCwgYm4sIG1wLCBwLCBpbmRleCk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gZmluZCBwdXQgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGVudHJ5IGludG8gdGhlCisJICogZGlyZWN0b3J5IGluZGV4IHRhYmxlIGluIG9yZGVyIHRvIHJlc3VtZSBhIHJlYWRkaXIgZnJvbSB0aGlzCisJICogZW50cnkuCisJICovCisJaWYgKERPX0lOREVYKGlwKSkgeworCQlzdGJsID0gRFRfR0VUU1RCTChwKTsKKwkJbGR0ZW50cnkgPSAoc3RydWN0IGxkdGVudHJ5ICopICYgcC0+c2xvdFtzdGJsW2luZGV4XV07CisJCXRhYmxlX2luZGV4ID0gbGUzMl90b19jcHUobGR0ZW50cnktPmluZGV4KTsKKwkJaWYgKGluZGV4ID09IChwLT5oZWFkZXIubmV4dGluZGV4IC0gMSkpIHsKKwkJCS8qCisJCQkgKiBMYXN0IGVudHJ5IGluIHRoaXMgbGVhZiBwYWdlCisJCQkgKi8KKwkJCWlmICgocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKQorCQkJICAgIHx8IChwLT5oZWFkZXIubmV4dCA9PSAwKSkKKwkJCQluZXh0X2luZGV4ID0gLTE7CisJCQllbHNlIHsKKwkJCQkvKiBSZWFkIG5leHQgbGVhZiBwYWdlICovCisJCQkJRFRfR0VUUEFHRShpcCwgbGU2NF90b19jcHUocC0+aGVhZGVyLm5leHQpLAorCQkJCQkgICBubXAsIFBTSVpFLCBucCwgcmMpOworCQkJCWlmIChyYykKKwkJCQkJbmV4dF9pbmRleCA9IC0xOworCQkJCWVsc2UgeworCQkJCQlzdGJsID0gRFRfR0VUU1RCTChucCk7CisJCQkJCWxkdGVudHJ5ID0KKwkJCQkJICAgIChzdHJ1Y3QgbGR0ZW50cnkgKikgJiBucC0+CisJCQkJCSAgICBzbG90W3N0YmxbMF1dOworCQkJCQluZXh0X2luZGV4ID0KKwkJCQkJICAgIGxlMzJfdG9fY3B1KGxkdGVudHJ5LT5pbmRleCk7CisJCQkJCURUX1BVVFBBR0Uobm1wKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlsZHRlbnRyeSA9CisJCQkgICAgKHN0cnVjdCBsZHRlbnRyeSAqKSAmIHAtPnNsb3Rbc3RibFtpbmRleCArIDFdXTsKKwkJCW5leHRfaW5kZXggPSBsZTMyX3RvX2NwdShsZHRlbnRyeS0+aW5kZXgpOworCQl9CisJCWZyZWVfaW5kZXgodGlkLCBpcCwgdGFibGVfaW5kZXgsIG5leHRfaW5kZXgpOworCX0KKwkvKgorCSAqIHRoZSBsZWFmIHBhZ2UgYmVjb21lcyBlbXB0eSwgZGVsZXRlIHRoZSBwYWdlCisJICovCisJaWYgKHAtPmhlYWRlci5uZXh0aW5kZXggPT0gMSkgeworCQkvKiBkZWxldGUgZW1wdHkgcGFnZSAqLworCQlyYyA9IGR0RGVsZXRlVXAodGlkLCBpcCwgbXAsIHAsICZidHN0YWNrKTsKKwl9CisJLyoKKwkgKiB0aGUgbGVhZiBwYWdlIGhhcyBvdGhlciBlbnRyaWVzIHJlbWFpbmluZzoKKwkgKgorCSAqIGRlbGV0ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGVhZiBwYWdlLgorCSAqLworCWVsc2UgeworCQlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisJCS8qCisJCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBsZWFmIHBhZ2UKKwkJICovCisJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tEVFJFRSB8IHRsY2tFTlRSWSk7CisJCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopICYgdGxjay0+bG9jazsKKworCQkvKgorCQkgKiBEbyBub3QgYXNzdW1lIHRoYXQgZHRsY2stPmluZGV4IHdpbGwgYmUgemVyby4gIER1cmluZyBhCisJCSAqIHJlbmFtZSB3aXRoaW4gYSBkaXJlY3RvcnksIHRoaXMgdHJhbnNhY3Rpb24gbWF5IGhhdmUKKwkJICogbW9kaWZpZWQgdGhpcyBwYWdlIGFscmVhZHkgd2hlbiBhZGRpbmcgdGhlIG5ldyBlbnRyeS4KKwkJICovCisKKwkJLyogbGluZWxvY2sgaGVhZGVyICovCisJCWlmIChkdGxjay0+aW5kZXggPj0gZHRsY2stPm1heGNudCkKKwkJCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopIHR4TGluZWxvY2soZHRsY2spOworCQlsdiA9ICYgZHRsY2stPmx2W2R0bGNrLT5pbmRleF07CisJCWx2LT5vZmZzZXQgPSAwOworCQlsdi0+bGVuZ3RoID0gMTsKKwkJZHRsY2stPmluZGV4Kys7CisKKwkJLyogbGluZWxvY2sgc3RibCBvZiBub24tcm9vdCBsZWFmIHBhZ2UgKi8KKwkJaWYgKCEocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSkgeworCQkJaWYgKGR0bGNrLT5pbmRleCA+PSBkdGxjay0+bWF4Y250KQorCQkJCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopIHR4TGluZWxvY2soZHRsY2spOworCQkJbHYgPSAmIGR0bGNrLT5sdltkdGxjay0+aW5kZXhdOworCQkJaSA9IGluZGV4ID4+IEwyRFRTTE9UU0laRTsKKwkJCWx2LT5vZmZzZXQgPSBwLT5oZWFkZXIuc3RibGluZGV4ICsgaTsKKwkJCWx2LT5sZW5ndGggPQorCQkJICAgICgocC0+aGVhZGVyLm5leHRpbmRleCAtIDEpID4+IEwyRFRTTE9UU0laRSkgLQorCQkJICAgIGkgKyAxOworCQkJZHRsY2stPmluZGV4Kys7CisJCX0KKworCQkvKiBmcmVlIHRoZSBsZWFmIGVudHJ5ICovCisJCWR0RGVsZXRlRW50cnkocCwgaW5kZXgsICZkdGxjayk7CisKKwkJLyoKKwkJICogVXBkYXRlIGRpcmVjdG9yeSBpbmRleCB0YWJsZSBmb3IgZW50cmllcyBtb3ZlZCBpbiBzdGJsCisJCSAqLworCQlpZiAoRE9fSU5ERVgoaXApICYmIGluZGV4IDwgcC0+aGVhZGVyLm5leHRpbmRleCkgeworCQkJczY0IGxibG9jazsKKworCQkJaW1wID0gTlVMTDsKKwkJCXN0YmwgPSBEVF9HRVRTVEJMKHApOworCQkJZm9yIChpID0gaW5kZXg7IGkgPCBwLT5oZWFkZXIubmV4dGluZGV4OyBpKyspIHsKKwkJCQlsZHRlbnRyeSA9CisJCQkJICAgIChzdHJ1Y3QgbGR0ZW50cnkgKikgJiBwLT5zbG90W3N0YmxbaV1dOworCQkJCW1vZGlmeV9pbmRleCh0aWQsIGlwLAorCQkJCQkgICAgIGxlMzJfdG9fY3B1KGxkdGVudHJ5LT5pbmRleCksCisJCQkJCSAgICAgYm4sIGksICZpbXAsICZsYmxvY2spOworCQkJfQorCQkJaWYgKGltcCkKKwkJCQlyZWxlYXNlX21ldGFwYWdlKGltcCk7CisJCX0KKworCQlEVF9QVVRQQUdFKG1wKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyoKKyAqCWR0RGVsZXRlVXAoKQorICoKKyAqIGZ1bmN0aW9uOgorICoJZnJlZSBlbXB0eSBwYWdlcyBhcyBwcm9wYWdhdGluZyBkZWxldGlvbiB1cCB0aGUgdHJlZQorICoKKyAqIHBhcmFtZXRlcjoKKyAqCisgKiByZXR1cm46CisgKi8KK3N0YXRpYyBpbnQgZHREZWxldGVVcCh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsCisJICAgc3RydWN0IG1ldGFwYWdlICogZm1wLCBkdHBhZ2VfdCAqIGZwLCBzdHJ1Y3QgYnRzdGFjayAqIGJ0c3RhY2spCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCWR0cGFnZV90ICpwOworCWludCBpbmRleCwgbmV4dGluZGV4OworCWludCB4bGVuOworCXN0cnVjdCBidGZyYW1lICpwYXJlbnQ7CisJc3RydWN0IGR0X2xvY2sgKmR0bGNrOworCXN0cnVjdCB0bG9jayAqdGxjazsKKwlzdHJ1Y3QgbHYgKmx2OworCXN0cnVjdCBweGRfbG9jayAqcHhkbG9jazsKKwlpbnQgaTsKKworCS8qCisJICogICAgICBrZWVwIHRoZSByb290IGxlYWYgcGFnZSB3aGljaCBoYXMgYmVjb21lIGVtcHR5CisJICovCisJaWYgKEJUX0lTX1JPT1QoZm1wKSkgeworCQkvKgorCQkgKiByZXNldCB0aGUgcm9vdAorCQkgKgorCQkgKiBkdEluaXRSb290KCkgYWNxdWlyZXMgdHhsb2NrIG9uIHRoZSByb290CisJCSAqLworCQlkdEluaXRSb290KHRpZCwgaXAsIFBBUkVOVChpcCkpOworCisJCURUX1BVVFBBR0UoZm1wKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqICAgICAgZnJlZSB0aGUgbm9uLXJvb3QgbGVhZiBwYWdlCisJICovCisJLyoKKwkgKiBhY3F1aXJlIGEgdHJhbnNhY3Rpb24gbG9jayBvbiB0aGUgcGFnZQorCSAqCisJICogd3JpdGUgRlJFRVhURU5UfE5PUkVET1BBR0UgbG9nIHJlY29yZAorCSAqIE4uQi4gbGluZWxvY2sgaXMgb3ZlcmxhaWQgYXMgZnJlZWQgZXh0ZW50IGRlc2NyaXB0b3IsIGFuZAorCSAqIHRoZSBidWZmZXIgcGFnZSBpcyBmcmVlZDsKKwkgKi8KKwl0bGNrID0gdHhNYXBsb2NrKHRpZCwgaXAsIHRsY2tEVFJFRSB8IHRsY2tGUkVFKTsKKwlweGRsb2NrID0gKHN0cnVjdCBweGRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisJcHhkbG9jay0+ZmxhZyA9IG1sY2tGUkVFUFhEOworCXB4ZGxvY2stPnB4ZCA9IGZwLT5oZWFkZXIuc2VsZjsKKwlweGRsb2NrLT5pbmRleCA9IDE7CisKKwkvKiB1cGRhdGUgc2libGluZyBwb2ludGVycyAqLworCWlmICgocmMgPSBkdFJlbGluayh0aWQsIGlwLCBmcCkpKSB7CisJCUJUX1BVVFBBR0UoZm1wKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXhsZW4gPSBsZW5ndGhQWEQoJmZwLT5oZWFkZXIuc2VsZik7CisKKwkvKiBGcmVlIHF1b3RhIGFsbG9jYXRpb24uICovCisJRFFVT1RfRlJFRV9CTE9DSyhpcCwgeGxlbik7CisKKwkvKiBmcmVlL2ludmFsaWRhdGUgaXRzIGJ1ZmZlciBwYWdlICovCisJZGlzY2FyZF9tZXRhcGFnZShmbXApOworCisJLyoKKwkgKiAgICAgIHByb3BhZ2F0ZSBwYWdlIGRlbGV0aW9uIHVwIHRoZSBkaXJlY3RvcnkgdHJlZQorCSAqCisJICogSWYgdGhlIGRlbGV0ZSBmcm9tIHRoZSBwYXJlbnQgcGFnZSBtYWtlcyBpdCBlbXB0eSwKKwkgKiBjb250aW51ZSBhbGwgdGhlIHdheSB1cCB0aGUgdHJlZS4KKwkgKiBzdG9wIGlmIHRoZSByb290IHBhZ2UgaXMgcmVhY2hlZCAod2hpY2ggaXMgbmV2ZXIgZGVsZXRlZCkgb3IKKwkgKiBpZiB0aGUgZW50cnkgZGVsZXRpb24gZG9lcyBub3QgZW1wdHkgdGhlIHBhZ2UuCisJICovCisJd2hpbGUgKChwYXJlbnQgPSBCVF9QT1AoYnRzdGFjaykpICE9IE5VTEwpIHsKKwkJLyogcGluIHRoZSBwYXJlbnQgcGFnZSA8c3A+ICovCisJCURUX0dFVFBBR0UoaXAsIHBhcmVudC0+Ym4sIG1wLCBQU0laRSwgcCwgcmMpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJLyoKKwkJICogZnJlZSB0aGUgZXh0ZW50IG9mIHRoZSBjaGlsZCBwYWdlIGRlbGV0ZWQKKwkJICovCisJCWluZGV4ID0gcGFyZW50LT5pbmRleDsKKworCQkvKgorCQkgKiBkZWxldGUgdGhlIGVudHJ5IGZvciB0aGUgY2hpbGQgcGFnZSBmcm9tIHBhcmVudAorCQkgKi8KKwkJbmV4dGluZGV4ID0gcC0+aGVhZGVyLm5leHRpbmRleDsKKworCQkvKgorCQkgKiB0aGUgcGFyZW50IGhhcyB0aGUgc2luZ2xlIGVudHJ5IGJlaW5nIGRlbGV0ZWQ6CisJCSAqCisJCSAqIGZyZWUgdGhlIHBhcmVudCBwYWdlIHdoaWNoIGhhcyBiZWNvbWUgZW1wdHkuCisJCSAqLworCQlpZiAobmV4dGluZGV4ID09IDEpIHsKKwkJCS8qCisJCQkgKiBrZWVwIHRoZSByb290IGludGVybmFsIHBhZ2Ugd2hpY2ggaGFzIGJlY29tZSBlbXB0eQorCQkJICovCisJCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSB7CisJCQkJLyoKKwkJCQkgKiByZXNldCB0aGUgcm9vdAorCQkJCSAqCisJCQkJICogZHRJbml0Um9vdCgpIGFjcXVpcmVzIHR4bG9jayBvbiB0aGUgcm9vdAorCQkJCSAqLworCQkJCWR0SW5pdFJvb3QodGlkLCBpcCwgUEFSRU5UKGlwKSk7CisKKwkJCQlEVF9QVVRQQUdFKG1wKTsKKworCQkJCXJldHVybiAwOworCQkJfQorCQkJLyoKKwkJCSAqIGZyZWUgdGhlIHBhcmVudCBwYWdlCisJCQkgKi8KKwkJCWVsc2UgeworCQkJCS8qCisJCQkJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIHBhZ2UKKwkJCQkgKgorCQkJCSAqIHdyaXRlIEZSRUVYVEVOVHxOT1JFRE9QQUdFIGxvZyByZWNvcmQKKwkJCQkgKi8KKwkJCQl0bGNrID0KKwkJCQkgICAgdHhNYXBsb2NrKHRpZCwgaXAsCisJCQkJCSAgICAgIHRsY2tEVFJFRSB8IHRsY2tGUkVFKTsKKwkJCQlweGRsb2NrID0gKHN0cnVjdCBweGRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisJCQkJcHhkbG9jay0+ZmxhZyA9IG1sY2tGUkVFUFhEOworCQkJCXB4ZGxvY2stPnB4ZCA9IHAtPmhlYWRlci5zZWxmOworCQkJCXB4ZGxvY2stPmluZGV4ID0gMTsKKworCQkJCS8qIHVwZGF0ZSBzaWJsaW5nIHBvaW50ZXJzICovCisJCQkJaWYgKChyYyA9IGR0UmVsaW5rKHRpZCwgaXAsIHApKSkgeworCQkJCQlEVF9QVVRQQUdFKG1wKTsKKwkJCQkJcmV0dXJuIHJjOworCQkJCX0KKworCQkJCXhsZW4gPSBsZW5ndGhQWEQoJnAtPmhlYWRlci5zZWxmKTsKKworCQkJCS8qIEZyZWUgcXVvdGEgYWxsb2NhdGlvbiAqLworCQkJCURRVU9UX0ZSRUVfQkxPQ0soaXAsIHhsZW4pOworCisJCQkJLyogZnJlZS9pbnZhbGlkYXRlIGl0cyBidWZmZXIgcGFnZSAqLworCQkJCWRpc2NhcmRfbWV0YXBhZ2UobXApOworCisJCQkJLyogcHJvcGFnYXRlIHVwICovCisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiB0aGUgcGFyZW50IGhhcyBvdGhlciBlbnRyaWVzIHJlbWFpbmluZzoKKwkJICoKKwkJICogZGVsZXRlIHRoZSByb3V0ZXIgZW50cnkgZnJvbSB0aGUgcGFyZW50IHBhZ2UuCisJCSAqLworCQlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisJCS8qCisJCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBwYWdlCisJCSAqCisJCSAqIGFjdGlvbjogcm91dGVyIGVudHJ5IGRlbGV0aW9uCisJCSAqLworCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIG1wLCB0bGNrRFRSRUUgfCB0bGNrRU5UUlkpOworCQlkdGxjayA9IChzdHJ1Y3QgZHRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisKKwkJLyogbGluZWxvY2sgaGVhZGVyICovCisJCWlmIChkdGxjay0+aW5kZXggPj0gZHRsY2stPm1heGNudCkKKwkJCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopIHR4TGluZWxvY2soZHRsY2spOworCQlsdiA9ICYgZHRsY2stPmx2W2R0bGNrLT5pbmRleF07CisJCWx2LT5vZmZzZXQgPSAwOworCQlsdi0+bGVuZ3RoID0gMTsKKwkJZHRsY2stPmluZGV4Kys7CisKKwkJLyogbGluZWxvY2sgc3RibCBvZiBub24tcm9vdCBsZWFmIHBhZ2UgKi8KKwkJaWYgKCEocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSkgeworCQkJaWYgKGR0bGNrLT5pbmRleCA8IGR0bGNrLT5tYXhjbnQpCisJCQkJbHYrKzsKKwkJCWVsc2UgeworCQkJCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopIHR4TGluZWxvY2soZHRsY2spOworCQkJCWx2ID0gJiBkdGxjay0+bHZbMF07CisJCQl9CisJCQlpID0gaW5kZXggPj4gTDJEVFNMT1RTSVpFOworCQkJbHYtPm9mZnNldCA9IHAtPmhlYWRlci5zdGJsaW5kZXggKyBpOworCQkJbHYtPmxlbmd0aCA9CisJCQkgICAgKChwLT5oZWFkZXIubmV4dGluZGV4IC0gMSkgPj4gTDJEVFNMT1RTSVpFKSAtCisJCQkgICAgaSArIDE7CisJCQlkdGxjay0+aW5kZXgrKzsKKwkJfQorCisJCS8qIGZyZWUgdGhlIHJvdXRlciBlbnRyeSAqLworCQlkdERlbGV0ZUVudHJ5KHAsIGluZGV4LCAmZHRsY2spOworCisJCS8qIHJlc2V0IGtleSBvZiBuZXcgbGVmdG1vc3QgZW50cnkgb2YgbGV2ZWwgKGZvciBjb25zaXN0ZW5jeSkgKi8KKwkJaWYgKGluZGV4ID09IDAgJiYKKwkJICAgICgocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSB8fCBwLT5oZWFkZXIucHJldiA9PSAwKSkKKwkJCWR0VHJ1bmNhdGVFbnRyeShwLCAwLCAmZHRsY2spOworCisJCS8qIHVucGluIHRoZSBwYXJlbnQgcGFnZSAqLworCQlEVF9QVVRQQUdFKG1wKTsKKworCQkvKiBleGl0IHByb3BhZ2F0aW9uIHVwICovCisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgX05PVFlFVAorLyoKKyAqIE5BTUU6ICAgICAgICBkdFJlbG9jYXRlKCkKKyAqCisgKiBGVU5DVElPTjogICAgcmVsb2NhdGUgZHRwYWdlIChpbnRlcm5hbCBvciBsZWFmKSBvZiBkaXJlY3Rvcnk7CisgKiAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBtYWlubHkgdXNlZCBieSBkZWZyYWdmcyB1dGlsaXR5LgorICovCitpbnQgZHRSZWxvY2F0ZSh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIHM2NCBsbXhhZGRyLCBweGRfdCAqIG9weGQsCisJICAgICAgIHM2NCBueGFkZHIpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wLCAqcG1wLCAqbG1wLCAqcm1wOworCWR0cGFnZV90ICpwLCAqcHAsICpycCA9IDAsICpscD0gMDsKKwlzNjQgYm47CisJaW50IGluZGV4OworCXN0cnVjdCBidHN0YWNrIGJ0c3RhY2s7CisJcHhkX3QgKnB4ZDsKKwlzNjQgb3hhZGRyLCBuZXh0Ym4sIHByZXZibjsKKwlpbnQgeGxlbiwgeHNpemU7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBkdF9sb2NrICpkdGxjazsKKwlzdHJ1Y3QgcHhkX2xvY2sgKnB4ZGxvY2s7CisJczggKnN0Ymw7CisJc3RydWN0IGx2ICpsdjsKKworCW94YWRkciA9IGFkZHJlc3NQWEQob3B4ZCk7CisJeGxlbiA9IGxlbmd0aFBYRChvcHhkKTsKKworCWpmc19pbmZvKCJkdFJlbG9jYXRlOiBsbXhhZGRyOiVMZCB4YWRkcjolTGQ6JUxkIHhsZW46JWQiLAorCQkgICAobG9uZyBsb25nKWxteGFkZHIsIChsb25nIGxvbmcpb3hhZGRyLCAobG9uZyBsb25nKW54YWRkciwKKwkJICAgeGxlbik7CisKKwkvKgorCSAqICAgICAgMS4gZ2V0IHRoZSBpbnRlcm5hbCBwYXJlbnQgZHRwYWdlIGNvdmVyaW5nCisJICogICAgICByb3V0ZXIgZW50cnkgZm9yIHRoZSB0YXJ0Z2V0IHBhZ2UgdG8gYmUgcmVsb2NhdGVkOworCSAqLworCXJjID0gZHRTZWFyY2hOb2RlKGlwLCBsbXhhZGRyLCBvcHhkLCAmYnRzdGFjayk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiByZXRyaWV2ZSBzZWFyY2ggcmVzdWx0ICovCisJRFRfR0VUU0VBUkNIKGlwLCBidHN0YWNrLnRvcCwgYm4sIHBtcCwgcHAsIGluZGV4KTsKKwlqZnNfaW5mbygiZHRSZWxvY2F0ZTogcGFyZW50IHJvdXRlciBlbnRyeSB2YWxpZGF0ZWQuIik7CisKKwkvKgorCSAqICAgICAgMi4gcmVsb2NhdGUgdGhlIHRhcmdldCBkdHBhZ2UKKwkgKi8KKwkvKiByZWFkIGluIHRoZSB0YXJnZXQgcGFnZSBmcm9tIHNyYyBleHRlbnQgKi8KKwlEVF9HRVRQQUdFKGlwLCBveGFkZHIsIG1wLCBQU0laRSwgcCwgcmMpOworCWlmIChyYykgeworCQkvKiByZWxlYXNlIHRoZSBwaW5uZWQgcGFyZW50IHBhZ2UgKi8KKwkJRFRfUFVUUEFHRShwbXApOworCQlyZXR1cm4gcmM7CisJfQorCisJLyoKKwkgKiByZWFkIGluIHNpYmxpbmcgcGFnZXMgaWYgYW55IHRvIHVwZGF0ZSBzaWJsaW5nIHBvaW50ZXJzOworCSAqLworCXJtcCA9IE5VTEw7CisJaWYgKHAtPmhlYWRlci5uZXh0KSB7CisJCW5leHRibiA9IGxlNjRfdG9fY3B1KHAtPmhlYWRlci5uZXh0KTsKKwkJRFRfR0VUUEFHRShpcCwgbmV4dGJuLCBybXAsIFBTSVpFLCBycCwgcmMpOworCQlpZiAocmMpIHsKKwkJCURUX1BVVFBBR0UobXApOworCQkJRFRfUFVUUEFHRShwbXApOworCQkJcmV0dXJuIChyYyk7CisJCX0KKwl9CisKKwlsbXAgPSBOVUxMOworCWlmIChwLT5oZWFkZXIucHJldikgeworCQlwcmV2Ym4gPSBsZTY0X3RvX2NwdShwLT5oZWFkZXIucHJldik7CisJCURUX0dFVFBBR0UoaXAsIHByZXZibiwgbG1wLCBQU0laRSwgbHAsIHJjKTsKKwkJaWYgKHJjKSB7CisJCQlEVF9QVVRQQUdFKG1wKTsKKwkJCURUX1BVVFBBR0UocG1wKTsKKwkJCWlmIChybXApCisJCQkJRFRfUFVUUEFHRShybXApOworCQkJcmV0dXJuIChyYyk7CisJCX0KKwl9CisKKwkvKiBhdCB0aGlzIHBvaW50LCBhbGwgeHRwYWdlcyB0byBiZSB1cGRhdGVkIGFyZSBpbiBtZW1vcnkgKi8KKworCS8qCisJICogdXBkYXRlIHNpYmxpbmcgcG9pbnRlcnMgb2Ygc2libGluZyBkdHBhZ2VzIGlmIGFueTsKKwkgKi8KKwlpZiAobG1wKSB7CisJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbG1wLCB0bGNrRFRSRUUgfCB0bGNrUkVMSU5LKTsKKwkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCQkvKiBsaW5lbG9jayBoZWFkZXIgKi8KKwkJQVNTRVJUKGR0bGNrLT5pbmRleCA9PSAwKTsKKwkJbHYgPSAmIGR0bGNrLT5sdlswXTsKKwkJbHYtPm9mZnNldCA9IDA7CisJCWx2LT5sZW5ndGggPSAxOworCQlkdGxjay0+aW5kZXgrKzsKKworCQlscC0+aGVhZGVyLm5leHQgPSBjcHVfdG9fbGU2NChueGFkZHIpOworCQlEVF9QVVRQQUdFKGxtcCk7CisJfQorCisJaWYgKHJtcCkgeworCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIHJtcCwgdGxja0RUUkVFIHwgdGxja1JFTElOSyk7CisJCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopICYgdGxjay0+bG9jazsKKwkJLyogbGluZWxvY2sgaGVhZGVyICovCisJCUFTU0VSVChkdGxjay0+aW5kZXggPT0gMCk7CisJCWx2ID0gJiBkdGxjay0+bHZbMF07CisJCWx2LT5vZmZzZXQgPSAwOworCQlsdi0+bGVuZ3RoID0gMTsKKwkJZHRsY2stPmluZGV4Kys7CisKKwkJcnAtPmhlYWRlci5wcmV2ID0gY3B1X3RvX2xlNjQobnhhZGRyKTsKKwkJRFRfUFVUUEFHRShybXApOworCX0KKworCS8qCisJICogdXBkYXRlIHRoZSB0YXJnZXQgZHRwYWdlIHRvIGJlIHJlbG9jYXRlZAorCSAqCisJICogd3JpdGUgTE9HX1JFRE9QQUdFIG9mIExPR19ORVcgdHlwZSBmb3IgZHN0IHBhZ2UKKwkgKiBmb3IgdGhlIHdob2xlIHRhcmdldCBwYWdlIChsb2dyZWRvKCkgd2lsbCBhcHBseQorCSAqIGFmdGVyIGltYWdlIGFuZCB1cGRhdGUgYm1hcCBmb3IgYWxsb2NhdGlvbiBvZiB0aGUKKwkgKiBkc3QgZXh0ZW50KSwgYW5kIHVwZGF0ZSBibWFwIGZvciBhbGxvY2F0aW9uIG9mCisJICogdGhlIGRzdCBleHRlbnQ7CisJICovCisJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja0RUUkVFIHwgdGxja05FVyk7CisJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCS8qIGxpbmVsb2NrIGhlYWRlciAqLworCUFTU0VSVChkdGxjay0+aW5kZXggPT0gMCk7CisJbHYgPSAmIGR0bGNrLT5sdlswXTsKKworCS8qIHVwZGF0ZSB0aGUgc2VsZiBhZGRyZXNzIGluIHRoZSBkdHBhZ2UgaGVhZGVyICovCisJcHhkID0gJnAtPmhlYWRlci5zZWxmOworCVBYRGFkZHJlc3MocHhkLCBueGFkZHIpOworCisJLyogdGhlIGRzdCBwYWdlIGlzIHRoZSBzYW1lIGFzIHRoZSBzcmMgcGFnZSwgaS5lLiwKKwkgKiBsaW5lbG9jayBmb3IgYWZ0ZXJpbWFnZSBvZiB0aGUgd2hvbGUgcGFnZTsKKwkgKi8KKwlsdi0+b2Zmc2V0ID0gMDsKKwlsdi0+bGVuZ3RoID0gcC0+aGVhZGVyLm1heHNsb3Q7CisJZHRsY2stPmluZGV4Kys7CisKKwkvKiB1cGRhdGUgdGhlIGJ1ZmZlciBleHRlbnQgZGVzY3JpcHRvciBvZiB0aGUgZHRwYWdlICovCisJeHNpemUgPSB4bGVuIDw8IEpGU19TQkkoaXAtPmlfc2IpLT5sMmJzaXplOworI2lmZGVmIF9TVElMTF9UT19QT1JUCisJYm1TZXRYRChtcCwgbnhhZGRyLCB4c2l6ZSk7CisjZW5kaWYgLyogX1NUSUxMX1RPX1BPUlQgKi8KKwkvKiB1bnBpbiB0aGUgcmVsb2NhdGVkIHBhZ2UgKi8KKwlEVF9QVVRQQUdFKG1wKTsKKwlqZnNfaW5mbygiZHRSZWxvY2F0ZTogdGFyZ2V0IGR0cGFnZSByZWxvY2F0ZWQuIik7CisKKwkvKiB0aGUgbW92ZWQgZXh0ZW50IGlzIGR0cGFnZSwgdGhlbiBhIExPR19OT1JFRE9QQUdFIGxvZyByZWMKKwkgKiBuZWVkcyB0byBiZSB3cml0dGVuIChpbiBsb2dyZWRvKCksIHRoZSBMT0dfTk9SRURPUEFHRSBsb2cgcmVjCisJICogd2lsbCBhbHNvIGZvcmNlIGEgYm1hcCB1cGRhdGUgKS4KKwkgKi8KKworCS8qCisJICogICAgICAzLiBhY3F1aXJlIG1hcGxvY2sgZm9yIHRoZSBzb3VyY2UgZXh0ZW50IHRvIGJlIGZyZWVkOworCSAqLworCS8qIGZvciBkdHBhZ2UgcmVsb2NhdGlvbiwgd3JpdGUgYSBMT0dfTk9SRURPUEFHRSByZWNvcmQKKwkgKiBmb3IgdGhlIHNvdXJjZSBkdHBhZ2UgKGxvZ3JlZG8oKSB3aWxsIGluaXQgTm9SZWRvUGFnZQorCSAqIGZpbHRlciBhbmQgd2lsbCBhbHNvIHVwZGF0ZSBibWFwIGZvciBmcmVlIG9mIHRoZSBzb3VyY2UKKwkgKiBkdHBhZ2UpLCBhbmQgdXBhZHRlIGJtYXAgZm9yIGZyZWUgb2YgdGhlIHNvdXJjZSBkdHBhZ2U7CisJICovCisJdGxjayA9IHR4TWFwbG9jayh0aWQsIGlwLCB0bGNrRFRSRUUgfCB0bGNrRlJFRSk7CisJcHhkbG9jayA9IChzdHJ1Y3QgcHhkX2xvY2sgKikgJiB0bGNrLT5sb2NrOworCXB4ZGxvY2stPmZsYWcgPSBtbGNrRlJFRVBYRDsKKwlQWERhZGRyZXNzKCZweGRsb2NrLT5weGQsIG94YWRkcik7CisJUFhEbGVuZ3RoKCZweGRsb2NrLT5weGQsIHhsZW4pOworCXB4ZGxvY2stPmluZGV4ID0gMTsKKworCS8qCisJICogICAgICA0LiB1cGRhdGUgdGhlIHBhcmVudCByb3V0ZXIgZW50cnkgZm9yIHJlbG9jYXRpb247CisJICoKKwkgKiBhY3F1aXJlIHRsY2sgZm9yIHRoZSBwYXJlbnQgZW50cnkgY292ZXJpbmcgdGhlIHRhcmdldCBkdHBhZ2U7CisJICogd3JpdGUgTE9HX1JFRE9QQUdFIHRvIGFwcGx5IGFmdGVyIGltYWdlIG9ubHk7CisJICovCisJamZzX2luZm8oImR0UmVsb2NhdGU6IHVwZGF0ZSBwYXJlbnQgcm91dGVyIGVudHJ5LiIpOworCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgcG1wLCB0bGNrRFRSRUUgfCB0bGNrRU5UUlkpOworCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopICYgdGxjay0+bG9jazsKKwlsdiA9ICYgZHRsY2stPmx2W2R0bGNrLT5pbmRleF07CisKKwkvKiB1cGRhdGUgdGhlIFBYRCB3aXRoIHRoZSBuZXcgYWRkcmVzcyAqLworCXN0YmwgPSBEVF9HRVRTVEJMKHBwKTsKKwlweGQgPSAocHhkX3QgKikgJiBwcC0+c2xvdFtzdGJsW2luZGV4XV07CisJUFhEYWRkcmVzcyhweGQsIG54YWRkcik7CisJbHYtPm9mZnNldCA9IHN0YmxbaW5kZXhdOworCWx2LT5sZW5ndGggPSAxOworCWR0bGNrLT5pbmRleCsrOworCisJLyogdW5waW4gdGhlIHBhcmVudCBkdHBhZ2UgKi8KKwlEVF9QVVRQQUdFKHBtcCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBOQU1FOglkdFNlYXJjaE5vZGUoKQorICoKKyAqIEZVTkNUSU9OOglTZWFyY2ggZm9yIGFuIGR0cGFnZSBjb250YWluaW5nIGEgc3BlY2lmaWVkIGFkZHJlc3MKKyAqICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG1haW5seSB1c2VkIGJ5IGRlZnJhZ2ZzIHV0aWxpdHkuCisgKgorICogTk9URToJU2VhcmNoIHJlc3VsdCBvbiBzdGFjaywgdGhlIGZvdW5kIHBhZ2UgaXMgcGlubmVkIGF0IGV4aXQuCisgKgkJVGhlIHJlc3VsdCBwYWdlIG11c3QgYmUgYW4gaW50ZXJuYWwgZHRwYWdlLgorICoJCWxteGFkZHIgZ2l2ZSB0aGUgYWRkcmVzcyBvZiB0aGUgbGVmdCBtb3N0IHBhZ2Ugb2YgdGhlCisgKgkJZHRyZWUgbGV2ZWwsIGluIHdoaWNoIHRoZSByZXF1aXJlZCBkdHBhZ2UgcmVzaWRlcy4KKyAqLworc3RhdGljIGludCBkdFNlYXJjaE5vZGUoc3RydWN0IGlub2RlICppcCwgczY0IGxteGFkZHIsIHB4ZF90ICoga3B4ZCwKKwkJCXN0cnVjdCBidHN0YWNrICogYnRzdGFjaykKK3sKKwlpbnQgcmMgPSAwOworCXM2NCBibjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCWR0cGFnZV90ICpwOworCWludCBwc2l6ZSA9IDI4ODsJLyogaW5pdGlhbCBpbi1saW5lIGRpcmVjdG9yeSAqLworCXM4ICpzdGJsOworCWludCBpOworCXB4ZF90ICpweGQ7CisJc3RydWN0IGJ0ZnJhbWUgKmJ0c3A7CisKKwlCVF9DTFIoYnRzdGFjayk7CS8qIHJlc2V0IHN0YWNrICovCisKKwkvKgorCSAqICAgICAgZGVzY2VuZCB0cmVlIHRvIHRoZSBsZXZlbCB3aXRoIHNwZWNpZmllZCBsZWZ0bW9zdCBwYWdlCisJICoKKwkgKiAgYnkgY29udmVudGlvbiwgcm9vdCBibiA9IDAuCisJICovCisJZm9yIChibiA9IDA7OykgeworCQkvKiBnZXQvcGluIHRoZSBwYWdlIHRvIHNlYXJjaCAqLworCQlEVF9HRVRQQUdFKGlwLCBibiwgbXAsIHBzaXplLCBwLCByYyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQkvKiBkb2VzIHRoZSB4YWRkciBvZiBsZWZ0bW9zdCBwYWdlIG9mIHRoZSBsZXZldmwKKwkJICogbWF0Y2hlcyBsZXZldmwgc2VhcmNoIGtleSA/CisJCSAqLworCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSB7CisJCQlpZiAobG14YWRkciA9PSAwKQorCQkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGFkZHJlc3NQWEQoJnAtPmhlYWRlci5zZWxmKSA9PSBsbXhhZGRyKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogZGVzY2VuZCBkb3duIHRvIGxlZnRtb3N0IGNoaWxkIHBhZ2UKKwkJICovCisJCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpIHsKKwkJCURUX1BVVFBBR0UobXApOworCQkJcmV0dXJuIC1FU1RBTEU7CisJCX0KKworCQkvKiBnZXQgdGhlIGxlZnRtb3N0IGVudHJ5ICovCisJCXN0YmwgPSBEVF9HRVRTVEJMKHApOworCQlweGQgPSAocHhkX3QgKikgJiBwLT5zbG90W3N0YmxbMF1dOworCisJCS8qIGdldCB0aGUgY2hpbGQgcGFnZSBibG9jayBhZGRyZXNzICovCisJCWJuID0gYWRkcmVzc1BYRChweGQpOworCQlwc2l6ZSA9IGxlbmd0aFBYRChweGQpIDw8IEpGU19TQkkoaXAtPmlfc2IpLT5sMmJzaXplOworCQkvKiB1bnBpbiB0aGUgcGFyZW50IHBhZ2UgKi8KKwkJRFRfUFVUUEFHRShtcCk7CisJfQorCisJLyoKKwkgKiAgICAgIHNlYXJjaCBlYWNoIHBhZ2UgYXQgdGhlIGN1cnJlbnQgbGV2ZXZsCisJICovCisgICAgICBsb29wOgorCXN0YmwgPSBEVF9HRVRTVEJMKHApOworCWZvciAoaSA9IDA7IGkgPCBwLT5oZWFkZXIubmV4dGluZGV4OyBpKyspIHsKKwkJcHhkID0gKHB4ZF90ICopICYgcC0+c2xvdFtzdGJsW2ldXTsKKworCQkvKiBmb3VuZCB0aGUgc3BlY2lmaWVkIHJvdXRlciBlbnRyeSAqLworCQlpZiAoYWRkcmVzc1BYRChweGQpID09IGFkZHJlc3NQWEQoa3B4ZCkgJiYKKwkJICAgIGxlbmd0aFBYRChweGQpID09IGxlbmd0aFBYRChrcHhkKSkgeworCQkJYnRzcCA9IGJ0c3RhY2stPnRvcDsKKwkJCWJ0c3AtPmJuID0gYm47CisJCQlidHNwLT5pbmRleCA9IGk7CisJCQlidHNwLT5tcCA9IG1wOworCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qIGdldCB0aGUgcmlnaHQgc2libGluZyBwYWdlIGlmIGFueSAqLworCWlmIChwLT5oZWFkZXIubmV4dCkKKwkJYm4gPSBsZTY0X3RvX2NwdShwLT5oZWFkZXIubmV4dCk7CisJZWxzZSB7CisJCURUX1BVVFBBR0UobXApOworCQlyZXR1cm4gLUVTVEFMRTsKKwl9CisKKwkvKiB1bnBpbiBjdXJyZW50IHBhZ2UgKi8KKwlEVF9QVVRQQUdFKG1wKTsKKworCS8qIGdldCB0aGUgcmlnaHQgc2libGluZyBwYWdlICovCisJRFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJZ290byBsb29wOworfQorI2VuZGlmIC8qIF9OT1RZRVQgKi8KKworLyoKKyAqCWR0UmVsaW5rKCkKKyAqCisgKiBmdW5jdGlvbjoKKyAqCWxpbmsgYXJvdW5kIGEgZnJlZWQgcGFnZS4KKyAqCisgKiBwYXJhbWV0ZXI6CisgKglmcDoJcGFnZSB0byBiZSBmcmVlZAorICoKKyAqIHJldHVybjoKKyAqLworc3RhdGljIGludCBkdFJlbGluayh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIGR0cGFnZV90ICogcCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwlzNjQgbmV4dGJuLCBwcmV2Ym47CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBkdF9sb2NrICpkdGxjazsKKwlzdHJ1Y3QgbHYgKmx2OworCisJbmV4dGJuID0gbGU2NF90b19jcHUocC0+aGVhZGVyLm5leHQpOworCXByZXZibiA9IGxlNjRfdG9fY3B1KHAtPmhlYWRlci5wcmV2KTsKKworCS8qIHVwZGF0ZSBwcmV2IHBvaW50ZXIgb2YgdGhlIG5leHQgcGFnZSAqLworCWlmIChuZXh0Ym4gIT0gMCkgeworCQlEVF9HRVRQQUdFKGlwLCBuZXh0Ym4sIG1wLCBQU0laRSwgcCwgcmMpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJQlRfTUFSS19ESVJUWShtcCwgaXApOworCQkvKgorCQkgKiBhY3F1aXJlIGEgdHJhbnNhY3Rpb24gbG9jayBvbiB0aGUgbmV4dCBwYWdlCisJCSAqCisJCSAqIGFjdGlvbjogdXBkYXRlIHByZXYgcG9pbnRlcjsKKwkJICovCisJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tEVFJFRSB8IHRsY2tSRUxJTkspOworCQlqZnNfaW5mbygiZHRSZWxpbmsgbmV4dGJuOiB0bGNrID0gMHglcCwgaXAgPSAweCVwLCBtcD0weCVwIiwKKwkJCXRsY2ssIGlwLCBtcCk7CisJCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopICYgdGxjay0+bG9jazsKKworCQkvKiBsaW5lbG9jayBoZWFkZXIgKi8KKwkJaWYgKGR0bGNrLT5pbmRleCA+PSBkdGxjay0+bWF4Y250KQorCQkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgdHhMaW5lbG9jayhkdGxjayk7CisJCWx2ID0gJiBkdGxjay0+bHZbZHRsY2stPmluZGV4XTsKKwkJbHYtPm9mZnNldCA9IDA7CisJCWx2LT5sZW5ndGggPSAxOworCQlkdGxjay0+aW5kZXgrKzsKKworCQlwLT5oZWFkZXIucHJldiA9IGNwdV90b19sZTY0KHByZXZibik7CisJCURUX1BVVFBBR0UobXApOworCX0KKworCS8qIHVwZGF0ZSBuZXh0IHBvaW50ZXIgb2YgdGhlIHByZXZpb3VzIHBhZ2UgKi8KKwlpZiAocHJldmJuICE9IDApIHsKKwkJRFRfR0VUUEFHRShpcCwgcHJldmJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCUJUX01BUktfRElSVFkobXAsIGlwKTsKKwkJLyoKKwkJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIHByZXYgcGFnZQorCQkgKgorCQkgKiBhY3Rpb246IHVwZGF0ZSBuZXh0IHBvaW50ZXI7CisJCSAqLworCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIG1wLCB0bGNrRFRSRUUgfCB0bGNrUkVMSU5LKTsKKwkJamZzX2luZm8oImR0UmVsaW5rIHByZXZibjogdGxjayA9IDB4JXAsIGlwID0gMHglcCwgbXA9MHglcCIsCisJCQl0bGNrLCBpcCwgbXApOworCQlkdGxjayA9IChzdHJ1Y3QgZHRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisKKwkJLyogbGluZWxvY2sgaGVhZGVyICovCisJCWlmIChkdGxjay0+aW5kZXggPj0gZHRsY2stPm1heGNudCkKKwkJCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopIHR4TGluZWxvY2soZHRsY2spOworCQlsdiA9ICYgZHRsY2stPmx2W2R0bGNrLT5pbmRleF07CisJCWx2LT5vZmZzZXQgPSAwOworCQlsdi0+bGVuZ3RoID0gMTsKKwkJZHRsY2stPmluZGV4Kys7CisKKwkJcC0+aGVhZGVyLm5leHQgPSBjcHVfdG9fbGU2NChuZXh0Ym4pOworCQlEVF9QVVRQQUdFKG1wKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJZHRJbml0Um9vdCgpCisgKgorICogaW5pdGlhbGl6ZSBkaXJlY3Rvcnkgcm9vdCAoaW5saW5lIGluIGlub2RlKQorICovCit2b2lkIGR0SW5pdFJvb3QodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCB1MzIgaWRvdGRvdCkKK3sKKwlzdHJ1Y3QgamZzX2lub2RlX2luZm8gKmpmc19pcCA9IEpGU19JUChpcCk7CisJZHRyb290X3QgKnA7CisJaW50IGZzaTsKKwlzdHJ1Y3QgZHRzbG90ICpmOworCXN0cnVjdCB0bG9jayAqdGxjazsKKwlzdHJ1Y3QgZHRfbG9jayAqZHRsY2s7CisJc3RydWN0IGx2ICpsdjsKKwl1MTYgeGZsYWdfc2F2ZTsKKworCS8qCisJICogSWYgdGhpcyB3YXMgcHJldmlvdXNseSBhbiBub24tZW1wdHkgZGlyZWN0b3J5LCB3ZSBuZWVkIHRvIHJlbW92ZQorCSAqIHRoZSBvbGQgZGlyZWN0b3J5IHRhYmxlLgorCSAqLworCWlmIChET19JTkRFWChpcCkpIHsKKwkJaWYgKCFqZnNfZGlydGFibGVfaW5saW5lKGlwKSkgeworCQkJc3RydWN0IHRibG9jayAqdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKKwkJCS8qCisJCQkgKiBXZSdyZSBwbGF5aW5nIGdhbWVzIHdpdGggdGhlIHRpZCdzIHhmbGFnLiAgSWYKKwkJCSAqIHdlJ3JlIHJlbW92aW5nIGEgcmVndWxhciBmaWxlLCB0aGUgZmlsZSdzIHh0cmVlCisJCQkgKiBpcyBjb21taXR0ZWQgd2l0aCBDT01NSVRfUE1BUCwgYnV0IHdlIGFsd2F5cworCQkJICogY29tbWl0IHRoZSBkaXJlY3RvcmllcyB4dHJlZSB3aXRoIENPTU1JVF9QV01BUC4KKwkJCSAqLworCQkJeGZsYWdfc2F2ZSA9IHRibGstPnhmbGFnOworCQkJdGJsay0+eGZsYWcgPSAwOworCQkJLyoKKwkJCSAqIHh0VHJ1bmNhdGUgaXNuJ3QgZ3VhcmFudGVlZCB0byBmdWxseSB0cnVuY2F0ZQorCQkJICogdGhlIHh0cmVlLiAgVGhlIGNhbGxlciBuZWVkcyB0byBjaGVjayBpX3NpemUKKwkJCSAqIGFmdGVyIGNvbW1pdHRpbmcgdGhlIHRyYW5zYWN0aW9uIHRvIHNlZSBpZgorCQkJICogYWRkaXRpb25hbCB0cnVuY2F0aW9uIGlzIG5lZWRlZC4gIFRoZQorCQkJICogQ09NTUlUX1N0YWxlIGZsYWcgdGVsbHMgY2FsbGVyIHRoYXQgd2UKKwkJCSAqIGluaXRpYXRlZCB0aGUgdHJ1bmNhdGlvbi4KKwkJCSAqLworCQkJeHRUcnVuY2F0ZSh0aWQsIGlwLCAwLCBDT01NSVRfUFdNQVApOworCQkJc2V0X2NmbGFnKENPTU1JVF9TdGFsZSwgaXApOworCisJCQl0YmxrLT54ZmxhZyA9IHhmbGFnX3NhdmU7CisJCX0gZWxzZQorCQkJaXAtPmlfc2l6ZSA9IDE7CisKKwkJamZzX2lwLT5uZXh0X2luZGV4ID0gMjsKKwl9IGVsc2UKKwkJaXAtPmlfc2l6ZSA9IElEQVRBU0laRTsKKworCS8qCisJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIHJvb3QKKwkgKgorCSAqIGFjdGlvbjogZGlyZWN0b3J5IGluaXRpYWxpemF0aW9uOworCSAqLworCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgKHN0cnVjdCBtZXRhcGFnZSAqKSAmIGpmc19pcC0+YnhmbGFnLAorCQkgICAgICB0bGNrRFRSRUUgfCB0bGNrRU5UUlkgfCB0bGNrQlRST09UKTsKKwlkdGxjayA9IChzdHJ1Y3QgZHRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisKKwkvKiBsaW5lbG9jayByb290ICovCisJQVNTRVJUKGR0bGNrLT5pbmRleCA9PSAwKTsKKwlsdiA9ICYgZHRsY2stPmx2WzBdOworCWx2LT5vZmZzZXQgPSAwOworCWx2LT5sZW5ndGggPSBEVFJPT1RNQVhTTE9UOworCWR0bGNrLT5pbmRleCsrOworCisJcCA9ICZqZnNfaXAtPmlfZHRyb290OworCisJcC0+aGVhZGVyLmZsYWcgPSBEWERfSU5ERVggfCBCVF9ST09UIHwgQlRfTEVBRjsKKworCXAtPmhlYWRlci5uZXh0aW5kZXggPSAwOworCisJLyogaW5pdCBmcmVlbGlzdCAqLworCWZzaSA9IDE7CisJZiA9ICZwLT5zbG90W2ZzaV07CisKKwkvKiBpbml0IGRhdGEgYXJlYSBvZiByb290ICovCisJZm9yIChmc2krKzsgZnNpIDwgRFRST09UTUFYU0xPVDsgZisrLCBmc2krKykKKwkJZi0+bmV4dCA9IGZzaTsKKwlmLT5uZXh0ID0gLTE7CisKKwlwLT5oZWFkZXIuZnJlZWxpc3QgPSAxOworCXAtPmhlYWRlci5mcmVlY250ID0gODsKKworCS8qIGluaXQgJy4uJyBlbnRyeSAqLworCXAtPmhlYWRlci5pZG90ZG90ID0gY3B1X3RvX2xlMzIoaWRvdGRvdCk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKglhZGRfbWlzc2luZ19pbmRpY2VzKCkKKyAqCisgKiBmdW5jdGlvbjogRml4IGR0cmVlIHBhZ2UgaW4gd2hpY2ggb25lIG9yIG1vcmUgZW50cmllcyBoYXMgYW4gaW52YWxpZCBpbmRleC4KKyAqCSAgICAgZnNjay5qZnMgc2hvdWxkIHJlYWxseSBmaXggdGhpcywgYnV0IGl0IGN1cnJlbnRseSBkb2VzIG5vdC4KKyAqCSAgICAgQ2FsbGVkIGZyb20gamZzX3JlYWRkaXIgd2hlbiBiYWQgaW5kZXggaXMgZGV0ZWN0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIGFkZF9taXNzaW5nX2luZGljZXMoc3RydWN0IGlub2RlICppbm9kZSwgczY0IGJuKQoreworCXN0cnVjdCBsZHRlbnRyeSAqZDsKKwlzdHJ1Y3QgZHRfbG9jayAqZHRsY2s7CisJaW50IGk7CisJdWludCBpbmRleDsKKwlzdHJ1Y3QgbHYgKmx2OworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJZHRwYWdlX3QgKnA7CisJaW50IHJjOworCXM4ICpzdGJsOworCXRpZF90IHRpZDsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisKKwl0aWQgPSB0eEJlZ2luKGlub2RlLT5pX3NiLCAwKTsKKworCURUX0dFVFBBR0UoaW5vZGUsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIkRUX0dFVFBBR0UgZmFpbGVkIVxuIik7CisJCWdvdG8gZW5kOworCX0KKwlCVF9NQVJLX0RJUlRZKG1wLCBpbm9kZSk7CisKKwlBU1NFUlQocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKTsKKworCXRsY2sgPSB0eExvY2sodGlkLCBpbm9kZSwgbXAsIHRsY2tEVFJFRSB8IHRsY2tFTlRSWSk7CisJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJnRsY2stPmxvY2s7CisKKwlzdGJsID0gRFRfR0VUU1RCTChwKTsKKwlmb3IgKGkgPSAwOyBpIDwgcC0+aGVhZGVyLm5leHRpbmRleDsgaSsrKSB7CisJCWQgPSAoc3RydWN0IGxkdGVudHJ5ICopICZwLT5zbG90W3N0YmxbaV1dOworCQlpbmRleCA9IGxlMzJfdG9fY3B1KGQtPmluZGV4KTsKKwkJaWYgKChpbmRleCA8IDIpIHx8IChpbmRleCA+PSBKRlNfSVAoaW5vZGUpLT5uZXh0X2luZGV4KSkgeworCQkJZC0+aW5kZXggPSBjcHVfdG9fbGUzMihhZGRfaW5kZXgodGlkLCBpbm9kZSwgYm4sIGkpKTsKKwkJCWlmIChkdGxjay0+aW5kZXggPj0gZHRsY2stPm1heGNudCkKKwkJCQlkdGxjayA9IChzdHJ1Y3QgZHRfbG9jayAqKSB0eExpbmVsb2NrKGR0bGNrKTsKKwkJCWx2ID0gJmR0bGNrLT5sdltkdGxjay0+aW5kZXhdOworCQkJbHYtPm9mZnNldCA9IHN0YmxbaV07CisJCQlsdi0+bGVuZ3RoID0gMTsKKwkJCWR0bGNrLT5pbmRleCsrOworCQl9CisJfQorCisJRFRfUFVUUEFHRShtcCk7CisJKHZvaWQpIHR4Q29tbWl0KHRpZCwgMSwgJmlub2RlLCAwKTsKK2VuZDoKKwl0eEVuZCh0aWQpOworfQorCisvKgorICogQnVmZmVyIHRvIGhvbGQgZGlyZWN0b3J5IGVudHJ5IGluZm8gd2hpbGUgdHJhdmVyc2luZyBhIGR0cmVlIHBhZ2UKKyAqIGJlZm9yZSBiZWluZyBmZWQgdG8gdGhlIGZpbGxkaXIgZnVuY3Rpb24KKyAqLworc3RydWN0IGpmc19kaXJlbnQgeworCWxvZmZfdCBwb3NpdGlvbjsKKwlpbnQgaW5vOworCXUxNiBuYW1lX2xlbjsKKwljaGFyIG5hbWVbMF07Cit9OworCisvKgorICogZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIG5leHQgdmFyaWFibGUtc2l6ZWQgamZzX2RpcmVudCBpbiBidWZmZXIKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgamZzX2RpcmVudCAqbmV4dF9qZnNfZGlyZW50KHN0cnVjdCBqZnNfZGlyZW50ICpkaXJlbnQpCit7CisJcmV0dXJuIChzdHJ1Y3QgamZzX2RpcmVudCAqKQorCQkoKGNoYXIgKilkaXJlbnQgKworCQkgKChzaXplb2YgKHN0cnVjdCBqZnNfZGlyZW50KSArIGRpcmVudC0+bmFtZV9sZW4gKyAxICsKKwkJICAgc2l6ZW9mIChsb2ZmX3QpIC0gMSkgJgorCQkgIH4oc2l6ZW9mIChsb2ZmX3QpIC0gMSkpKTsKK30KKworLyoKKyAqCWpmc19yZWFkZGlyKCkKKyAqCisgKiBmdW5jdGlvbjogcmVhZCBkaXJlY3RvcnkgZW50cmllcyBzZXF1ZW50aWFsbHkKKyAqCWZyb20gdGhlIHNwZWNpZmllZCBlbnRyeSBvZmZzZXQKKyAqCisgKiBwYXJhbWV0ZXI6CisgKgorICogcmV0dXJuOiBvZmZzZXQgPSAocG4sIGluZGV4KSBvZiBzdGFydCBlbnRyeQorICoJb2YgbmV4dCBqZnNfcmVhZGRpcigpL2R0UmVhZCgpCisgKi8KK2ludCBqZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlwID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5sc190YWJsZSAqY29kZXBhZ2UgPSBKRlNfU0JJKGlwLT5pX3NiKS0+bmxzX3RhYjsKKwlpbnQgcmMgPSAwOworCWxvZmZfdCBkdHBvczsJLyogbGVnYWN5IE9TLzIgc3R5bGUgcG9zaXRpb24gKi8KKwlzdHJ1Y3QgZHRvZmZzZXQgeworCQlzMTYgcG47CisJCXMxNiBpbmRleDsKKwkJczMyIHVudXNlZDsKKwl9ICpkdG9mZnNldCA9IChzdHJ1Y3QgZHRvZmZzZXQgKikgJmR0cG9zOworCXM2NCBibjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCWR0cGFnZV90ICpwOworCWludCBpbmRleDsKKwlzOCAqc3RibDsKKwlzdHJ1Y3QgYnRzdGFjayBidHN0YWNrOworCWludCBpLCBuZXh0OworCXN0cnVjdCBsZHRlbnRyeSAqZDsKKwlzdHJ1Y3QgZHRzbG90ICp0OworCWludCBkX25hbWxlZnQsIGxlbiwgb3V0bGVuOworCXVuc2lnbmVkIGxvbmcgZGlyZW50X2J1ZjsKKwljaGFyICpuYW1lX3B0cjsKKwl1MzIgZGlyX2luZGV4OworCWludCBkb19pbmRleCA9IDA7CisJdWludCBsb29wX2NvdW50ID0gMDsKKwlzdHJ1Y3QgamZzX2RpcmVudCAqamZzX2RpcmVudDsKKwlpbnQgamZzX2RpcmVudHM7CisJaW50IG92ZXJmbG93LCBmaXhfcGFnZSwgcGFnZV9maXhlZCA9IDA7CisJc3RhdGljIGludCB1bmlxdWVfcG9zID0gMjsJLyogSWYgd2UgY2FuJ3QgZml4IGJyb2tlbiBpbmRleCAqLworCisJaWYgKGZpbHAtPmZfcG9zID09IERJUkVORCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoRE9fSU5ERVgoaXApKSB7CisJCS8qCisJCSAqIHBlcnNpc3RlbnQgaW5kZXggaXMgc3RvcmVkIGluIGRpcmVjdG9yeSBlbnRyaWVzLgorCQkgKiBTcGVjaWFsIGNhc2VzOiAgICAgICAgMCA9IC4KKwkJICogICAgICAgICAgICAgICAgICAgICAgIDEgPSAuLgorCQkgKiAgICAgICAgICAgICAgICAgICAgICAtMSA9IEVuZCBvZiBkaXJlY3RvcnkKKwkJICovCisJCWRvX2luZGV4ID0gMTsKKworCQlkaXJfaW5kZXggPSAodTMyKSBmaWxwLT5mX3BvczsKKworCQlpZiAoZGlyX2luZGV4ID4gMSkgeworCQkJc3RydWN0IGRpcl90YWJsZV9zbG90IGRpcnRhYl9zbG90OworCisJCQlpZiAoZHRFbXB0eShpcCkgfHwKKwkJCSAgICAoZGlyX2luZGV4ID49IEpGU19JUChpcCktPm5leHRfaW5kZXgpKSB7CisJCQkJLyogU3RhbGUgcG9zaXRpb24uICBEaXJlY3RvcnkgaGFzIHNocnVuayAqLworCQkJCWZpbHAtPmZfcG9zID0gRElSRU5EOworCQkJCXJldHVybiAwOworCQkJfQorCQkgICAgICByZXBlYXQ6CisJCQlyYyA9IHJlYWRfaW5kZXgoaXAsIGRpcl9pbmRleCwgJmRpcnRhYl9zbG90KTsKKwkJCWlmIChyYykgeworCQkJCWZpbHAtPmZfcG9zID0gRElSRU5EOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJCWlmIChkaXJ0YWJfc2xvdC5mbGFnID09IERJUl9JTkRFWF9GUkVFKSB7CisJCQkJaWYgKGxvb3BfY291bnQrKyA+IEpGU19JUChpcCktPm5leHRfaW5kZXgpIHsKKwkJCQkJamZzX2VycigiamZzX3JlYWRkaXIgZGV0ZWN0ZWQgIgorCQkJCQkJICAgImluZmluaXRlIGxvb3AhIik7CisJCQkJCWZpbHAtPmZfcG9zID0gRElSRU5EOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJZGlyX2luZGV4ID0gbGUzMl90b19jcHUoZGlydGFiX3Nsb3QuYWRkcjIpOworCQkJCWlmIChkaXJfaW5kZXggPT0gLTEpIHsKKwkJCQkJZmlscC0+Zl9wb3MgPSBESVJFTkQ7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlnb3RvIHJlcGVhdDsKKwkJCX0KKwkJCWJuID0gYWRkcmVzc0RUUygmZGlydGFiX3Nsb3QpOworCQkJaW5kZXggPSBkaXJ0YWJfc2xvdC5zbG90OworCQkJRFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOworCQkJaWYgKHJjKSB7CisJCQkJZmlscC0+Zl9wb3MgPSBESVJFTkQ7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9JTlRFUk5BTCkgeworCQkJCWpmc19lcnIoImpmc19yZWFkZGlyOiBiYWQgaW5kZXggdGFibGUiKTsKKwkJCQlEVF9QVVRQQUdFKG1wKTsKKwkJCQlmaWxwLT5mX3BvcyA9IC0xOworCQkJCXJldHVybiAwOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGRpcl9pbmRleCA9PSAwKSB7CisJCQkJLyoKKwkJCQkgKiBzZWxmICIuIgorCQkJCSAqLworCQkJCWZpbHAtPmZfcG9zID0gMDsKKwkJCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgMCwgaXAtPmlfaW5vLAorCQkJCQkgICAgRFRfRElSKSkKKwkJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkvKgorCQkJICogcGFyZW50ICIuLiIKKwkJCSAqLworCQkJZmlscC0+Zl9wb3MgPSAxOworCQkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLi4iLCAyLCAxLCBQQVJFTlQoaXApLCBEVF9ESVIpKQorCQkJCXJldHVybiAwOworCisJCQkvKgorCQkJICogRmluZCBmaXJzdCBlbnRyeSBvZiBsZWZ0LW1vc3QgbGVhZgorCQkJICovCisJCQlpZiAoZHRFbXB0eShpcCkpIHsKKwkJCQlmaWxwLT5mX3BvcyA9IERJUkVORDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJaWYgKChyYyA9IGR0UmVhZEZpcnN0KGlwLCAmYnRzdGFjaykpKQorCQkJCXJldHVybiByYzsKKworCQkJRFRfR0VUU0VBUkNIKGlwLCBidHN0YWNrLnRvcCwgYm4sIG1wLCBwLCBpbmRleCk7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBMZWdhY3kgZmlsZXN5c3RlbSAtIE9TLzIgJiBMaW51eCBKRlMgPCAwLjMuNgorCQkgKgorCQkgKiBwbiA9IGluZGV4ID0gMDogICAgICBGaXJzdCBlbnRyeSAiLiIKKwkJICogcG4gPSAwOyBpbmRleCA9IDE6ICAgU2Vjb25kIGVudHJ5ICIuLiIKKwkJICogcG4gPiAwOiAgICAgICAgICAgICAgUmVhbCBlbnRyaWVzLCBwbj0xIC0+IGxlZnRtb3N0IHBhZ2UKKwkJICogcG4gPSBpbmRleCA9IC0xOiAgICAgTm8gbW9yZSBlbnRyaWVzCisJCSAqLworCQlkdHBvcyA9IGZpbHAtPmZfcG9zOworCQlpZiAoZHRwb3MgPT0gMCkgeworCQkJLyogYnVpbGQgIi4iIGVudHJ5ICovCisKKwkJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4iLCAxLCBmaWxwLT5mX3BvcywgaXAtPmlfaW5vLAorCQkJCSAgICBEVF9ESVIpKQorCQkJCXJldHVybiAwOworCQkJZHRvZmZzZXQtPmluZGV4ID0gMTsKKwkJCWZpbHAtPmZfcG9zID0gZHRwb3M7CisJCX0KKworCQlpZiAoZHRvZmZzZXQtPnBuID09IDApIHsKKwkJCWlmIChkdG9mZnNldC0+aW5kZXggPT0gMSkgeworCQkJCS8qIGJ1aWxkICIuLiIgZW50cnkgKi8KKworCQkJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgZmlscC0+Zl9wb3MsCisJCQkJCSAgICBQQVJFTlQoaXApLCBEVF9ESVIpKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSB7CisJCQkJamZzX2VycigiamZzX3JlYWRkaXIgY2FsbGVkIHdpdGggIgorCQkJCQkiaW52YWxpZCBvZmZzZXQhIik7CisJCQl9CisJCQlkdG9mZnNldC0+cG4gPSAxOworCQkJZHRvZmZzZXQtPmluZGV4ID0gMDsKKwkJCWZpbHAtPmZfcG9zID0gZHRwb3M7CisJCX0KKworCQlpZiAoZHRFbXB0eShpcCkpIHsKKwkJCWZpbHAtPmZfcG9zID0gRElSRU5EOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoKHJjID0gZHRSZWFkTmV4dChpcCwgJmZpbHAtPmZfcG9zLCAmYnRzdGFjaykpKSB7CisJCQlqZnNfZXJyKCJqZnNfcmVhZGRpcjogdW5leHBlY3RlZCByYyA9ICVkICIKKwkJCQkiZnJvbSBkdFJlYWROZXh0IiwgcmMpOworCQkJZmlscC0+Zl9wb3MgPSBESVJFTkQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBnZXQgc3RhcnQgbGVhZiBwYWdlIGFuZCBpbmRleCAqLworCQlEVF9HRVRTRUFSQ0goaXAsIGJ0c3RhY2sudG9wLCBibiwgbXAsIHAsIGluZGV4KTsKKworCQkvKiBvZmZzZXQgYmV5b25kIGRpcmVjdG9yeSBlb2YgPyAqLworCQlpZiAoYm4gPCAwKSB7CisJCQlmaWxwLT5mX3BvcyA9IERJUkVORDsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJZGlyZW50X2J1ZiA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoZGlyZW50X2J1ZiA9PSAwKSB7CisJCURUX1BVVFBBR0UobXApOworCQlqZnNfd2FybigiamZzX3JlYWRkaXI6IF9fZ2V0X2ZyZWVfcGFnZSBmYWlsZWQhIik7CisJCWZpbHAtPmZfcG9zID0gRElSRU5EOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlqZnNfZGlyZW50ID0gKHN0cnVjdCBqZnNfZGlyZW50ICopIGRpcmVudF9idWY7CisJCWpmc19kaXJlbnRzID0gMDsKKwkJb3ZlcmZsb3cgPSBmaXhfcGFnZSA9IDA7CisKKwkJc3RibCA9IERUX0dFVFNUQkwocCk7CisKKwkJZm9yIChpID0gaW5kZXg7IGkgPCBwLT5oZWFkZXIubmV4dGluZGV4OyBpKyspIHsKKwkJCWQgPSAoc3RydWN0IGxkdGVudHJ5ICopICYgcC0+c2xvdFtzdGJsW2ldXTsKKworCQkJaWYgKCgobG9uZykgamZzX2RpcmVudCArIGQtPm5hbWxlbiArIDEpID4KKwkJCSAgICAoZGlyZW50X2J1ZiArIFBTSVpFKSkgeworCQkJCS8qIERCQ1MgY29kZXBhZ2VzIGNvdWxkIG92ZXJydW4gZGlyZW50X2J1ZiAqLworCQkJCWluZGV4ID0gaTsKKwkJCQlvdmVyZmxvdyA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRfbmFtbGVmdCA9IGQtPm5hbWxlbjsKKwkJCW5hbWVfcHRyID0gamZzX2RpcmVudC0+bmFtZTsKKwkJCWpmc19kaXJlbnQtPmlubyA9IGxlMzJfdG9fY3B1KGQtPmludW1iZXIpOworCisJCQlpZiAoZG9faW5kZXgpIHsKKwkJCQlsZW4gPSBtaW4oZF9uYW1sZWZ0LCBEVExIRFJEQVRBTEVOKTsKKwkJCQlqZnNfZGlyZW50LT5wb3NpdGlvbiA9IGxlMzJfdG9fY3B1KGQtPmluZGV4KTsKKwkJCQkvKgorCQkJCSAqIGQtPmluZGV4IHNob3VsZCBhbHdheXMgYmUgdmFsaWQsIGJ1dCBpdAorCQkJCSAqIGlzbid0LiAgZnNjay5qZnMgZG9lc24ndCBjcmVhdGUgdGhlCisJCQkJICogZGlyZWN0b3J5IGluZGV4IGZvciB0aGUgbG9zdCtmb3VuZAorCQkJCSAqIGRpcmVjdG9yeS4gIFJhdGhlciB0aGFuIGxldCBpdCBnbywKKwkJCQkgKiB3ZSBjYW4gdHJ5IHRvIGZpeCBpdC4KKwkJCQkgKi8KKwkJCQlpZiAoKGpmc19kaXJlbnQtPnBvc2l0aW9uIDwgMikgfHwKKwkJCQkgICAgKGpmc19kaXJlbnQtPnBvc2l0aW9uID49CisJCQkJICAgICBKRlNfSVAoaXApLT5uZXh0X2luZGV4KSkgeworCQkJCQlpZiAoIXBhZ2VfZml4ZWQgJiYgIWlzUmVhZE9ubHkoaXApKSB7CisJCQkJCQlmaXhfcGFnZSA9IDE7CisJCQkJCQkvKgorCQkJCQkJICogc2V0dGluZyBvdmVyZmxvdyBhbmQgc2V0dGluZworCQkJCQkJICogaW5kZXggdG8gaSB3aWxsIGNhdXNlIHRoZQorCQkJCQkJICogc2FtZSBwYWdlIHRvIGJlIHByb2Nlc3NlZAorCQkJCQkJICogYWdhaW4gc3RhcnRpbmcgaGVyZQorCQkJCQkJICovCisJCQkJCQlvdmVyZmxvdyA9IDE7CisJCQkJCQlpbmRleCA9IGk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlqZnNfZGlyZW50LT5wb3NpdGlvbiA9IHVuaXF1ZV9wb3MrKzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWpmc19kaXJlbnQtPnBvc2l0aW9uID0gZHRwb3M7CisJCQkJbGVuID0gbWluKGRfbmFtbGVmdCwgRFRMSERSREFUQUxFTl9MRUdBQ1kpOworCQkJfQorCisJCQkvKiBjb3B5IHRoZSBuYW1lIG9mIGhlYWQvb25seSBzZWdtZW50ICovCisJCQlvdXRsZW4gPSBqZnNfc3RyZnJvbVVDU19sZShuYW1lX3B0ciwgZC0+bmFtZSwgbGVuLAorCQkJCQkJICAgY29kZXBhZ2UpOworCQkJamZzX2RpcmVudC0+bmFtZV9sZW4gPSBvdXRsZW47CisKKwkJCS8qIGNvcHkgbmFtZSBpbiB0aGUgYWRkaXRpb25hbCBzZWdtZW50KHMpICovCisJCQluZXh0ID0gZC0+bmV4dDsKKwkJCXdoaWxlIChuZXh0ID49IDApIHsKKwkJCQl0ID0gKHN0cnVjdCBkdHNsb3QgKikgJiBwLT5zbG90W25leHRdOworCQkJCW5hbWVfcHRyICs9IG91dGxlbjsKKwkJCQlkX25hbWxlZnQgLT0gbGVuOworCQkJCS8qIFNhbml0eSBDaGVjayAqLworCQkJCWlmIChkX25hbWxlZnQgPT0gMCkgeworCQkJCQlqZnNfZXJyb3IoaXAtPmlfc2IsCisJCQkJCQkgICJKRlM6RHRyZWUgZXJyb3I6IGlubyA9ICIKKwkJCQkJCSAgIiVsZCwgYm49JUxkLCBpbmRleCA9ICVkIiwKKwkJCQkJCSAgKGxvbmcpaXAtPmlfaW5vLAorCQkJCQkJICAobG9uZyBsb25nKWJuLAorCQkJCQkJICBpKTsKKwkJCQkJZ290byBza2lwX29uZTsKKwkJCQl9CisJCQkJbGVuID0gbWluKGRfbmFtbGVmdCwgRFRTTE9UREFUQUxFTik7CisJCQkJb3V0bGVuID0gamZzX3N0cmZyb21VQ1NfbGUobmFtZV9wdHIsIHQtPm5hbWUsCisJCQkJCQkJICAgbGVuLCBjb2RlcGFnZSk7CisJCQkJamZzX2RpcmVudC0+bmFtZV9sZW4gKz0gb3V0bGVuOworCisJCQkJbmV4dCA9IHQtPm5leHQ7CisJCQl9CisKKwkJCWpmc19kaXJlbnRzKys7CisJCQlqZnNfZGlyZW50ID0gbmV4dF9qZnNfZGlyZW50KGpmc19kaXJlbnQpOworc2tpcF9vbmU6CisJCQlpZiAoIWRvX2luZGV4KQorCQkJCWR0b2Zmc2V0LT5pbmRleCsrOworCQl9CisKKwkJaWYgKCFvdmVyZmxvdykgeworCQkJLyogUG9pbnQgdG8gbmV4dCBsZWFmIHBhZ2UgKi8KKwkJCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX1JPT1QpCisJCQkJYm4gPSAwOworCQkJZWxzZSB7CisJCQkJYm4gPSBsZTY0X3RvX2NwdShwLT5oZWFkZXIubmV4dCk7CisJCQkJaW5kZXggPSAwOworCQkJCS8qIHVwZGF0ZSBvZmZzZXQgKHBuOmluZGV4KSBmb3IgbmV3IHBhZ2UgKi8KKwkJCQlpZiAoIWRvX2luZGV4KSB7CisJCQkJCWR0b2Zmc2V0LT5wbisrOworCQkJCQlkdG9mZnNldC0+aW5kZXggPSAwOworCQkJCX0KKwkJCX0KKwkJCXBhZ2VfZml4ZWQgPSAwOworCQl9CisKKwkJLyogdW5waW4gcHJldmlvdXMgbGVhZiBwYWdlICovCisJCURUX1BVVFBBR0UobXApOworCisJCWpmc19kaXJlbnQgPSAoc3RydWN0IGpmc19kaXJlbnQgKikgZGlyZW50X2J1ZjsKKwkJd2hpbGUgKGpmc19kaXJlbnRzLS0pIHsKKwkJCWZpbHAtPmZfcG9zID0gamZzX2RpcmVudC0+cG9zaXRpb247CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsIGpmc19kaXJlbnQtPm5hbWUsCisJCQkJICAgIGpmc19kaXJlbnQtPm5hbWVfbGVuLCBmaWxwLT5mX3BvcywKKwkJCQkgICAgamZzX2RpcmVudC0+aW5vLCBEVF9VTktOT1dOKSkKKwkJCQlnb3RvIG91dDsKKwkJCWpmc19kaXJlbnQgPSBuZXh0X2pmc19kaXJlbnQoamZzX2RpcmVudCk7CisJCX0KKworCQlpZiAoZml4X3BhZ2UpIHsKKwkJCWFkZF9taXNzaW5nX2luZGljZXMoaXAsIGJuKTsKKwkJCXBhZ2VfZml4ZWQgPSAxOworCQl9CisKKwkJaWYgKCFvdmVyZmxvdyAmJiAoYm4gPT0gMCkpIHsKKwkJCWZpbHAtPmZfcG9zID0gRElSRU5EOworCQkJYnJlYWs7CisJCX0KKworCQlEVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJCWlmIChyYykgeworCQkJZnJlZV9wYWdlKGRpcmVudF9idWYpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisgICAgICBvdXQ6CisJZnJlZV9wYWdlKGRpcmVudF9idWYpOworCisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKglkdFJlYWRGaXJzdCgpCisgKgorICogZnVuY3Rpb246IGdldCB0aGUgbGVmdG1vc3QgcGFnZSBvZiB0aGUgZGlyZWN0b3J5CisgKi8KK3N0YXRpYyBpbnQgZHRSZWFkRmlyc3Qoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrKQoreworCWludCByYyA9IDA7CisJczY0IGJuOworCWludCBwc2l6ZSA9IDI4ODsJLyogaW5pdGlhbCBpbi1saW5lIGRpcmVjdG9yeSAqLworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJZHRwYWdlX3QgKnA7CisJczggKnN0Ymw7CisJc3RydWN0IGJ0ZnJhbWUgKmJ0c3A7CisJcHhkX3QgKnhkOworCisJQlRfQ0xSKGJ0c3RhY2spOwkvKiByZXNldCBzdGFjayAqLworCisJLyoKKwkgKiAgICAgIGRlc2NlbmQgbGVmdG1vc3QgcGF0aCBvZiB0aGUgdHJlZQorCSAqCisJICogYnkgY29udmVudGlvbiwgcm9vdCBibiA9IDAuCisJICovCisJZm9yIChibiA9IDA7OykgeworCQlEVF9HRVRQQUdFKGlwLCBibiwgbXAsIHBzaXplLCBwLCByYyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQkvKgorCQkgKiBsZWZ0bW9zdCBsZWFmIHBhZ2UKKwkJICovCisJCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpIHsKKwkJCS8qIHJldHVybiBsZWZ0bW9zdCBlbnRyeSAqLworCQkJYnRzcCA9IGJ0c3RhY2stPnRvcDsKKwkJCWJ0c3AtPmJuID0gYm47CisJCQlidHNwLT5pbmRleCA9IDA7CisJCQlidHNwLT5tcCA9IG1wOworCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qCisJCSAqIGRlc2NlbmQgZG93biB0byBsZWZ0bW9zdCBjaGlsZCBwYWdlCisJCSAqLworCQlpZiAoQlRfU1RBQ0tfRlVMTChidHN0YWNrKSkgeworCQkJRFRfUFVUUEFHRShtcCk7CisJCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJkdFJlYWRGaXJzdDogYnRzdGFjayBvdmVycnVuIik7CisJCQlCVF9TVEFDS19EVU1QKGJ0c3RhY2spOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJLyogcHVzaCAoYm4sIGluZGV4KSBvZiB0aGUgcGFyZW50IHBhZ2UvZW50cnkgKi8KKwkJQlRfUFVTSChidHN0YWNrLCBibiwgMCk7CisKKwkJLyogZ2V0IHRoZSBsZWZ0bW9zdCBlbnRyeSAqLworCQlzdGJsID0gRFRfR0VUU1RCTChwKTsKKwkJeGQgPSAocHhkX3QgKikgJiBwLT5zbG90W3N0YmxbMF1dOworCisJCS8qIGdldCB0aGUgY2hpbGQgcGFnZSBibG9jayBhZGRyZXNzICovCisJCWJuID0gYWRkcmVzc1BYRCh4ZCk7CisJCXBzaXplID0gbGVuZ3RoUFhEKHhkKSA8PCBKRlNfU0JJKGlwLT5pX3NiKS0+bDJic2l6ZTsKKworCQkvKiB1bnBpbiB0aGUgcGFyZW50IHBhZ2UgKi8KKwkJRFRfUFVUUEFHRShtcCk7CisJfQorfQorCisKKy8qCisgKglkdFJlYWROZXh0KCkKKyAqCisgKiBmdW5jdGlvbjogZ2V0IHRoZSBwYWdlIG9mIHRoZSBzcGVjaWZpZWQgb2Zmc2V0IChwbjppbmRleCkKKyAqCisgKiByZXR1cm46IGlmIChvZmZzZXQgPiBlb2YpLCBibiA9IC0xOworICoKKyAqIG5vdGU6IGlmIGluZGV4ID4gbmV4dGluZGV4IG9mIHRoZSB0YXJnZXQgbGVhZiBwYWdlLAorICogc3RhcnQgd2l0aCAxc3QgZW50cnkgb2YgbmV4dCBsZWFmIHBhZ2U7CisgKi8KK3N0YXRpYyBpbnQgZHRSZWFkTmV4dChzdHJ1Y3QgaW5vZGUgKmlwLCBsb2ZmX3QgKiBvZmZzZXQsCisJCSAgICAgIHN0cnVjdCBidHN0YWNrICogYnRzdGFjaykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBkdG9mZnNldCB7CisJCXMxNiBwbjsKKwkJczE2IGluZGV4OworCQlzMzIgdW51c2VkOworCX0gKmR0b2Zmc2V0ID0gKHN0cnVjdCBkdG9mZnNldCAqKSBvZmZzZXQ7CisJczY0IGJuOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJZHRwYWdlX3QgKnA7CisJaW50IGluZGV4OworCWludCBwbjsKKwlzOCAqc3RibDsKKwlzdHJ1Y3QgYnRmcmFtZSAqYnRzcCwgKnBhcmVudDsKKwlweGRfdCAqeGQ7CisKKwkvKgorCSAqIGdldCBsZWZ0bW9zdCBsZWFmIHBhZ2UgcGlubmVkCisJICovCisJaWYgKChyYyA9IGR0UmVhZEZpcnN0KGlwLCBidHN0YWNrKSkpCisJCXJldHVybiByYzsKKworCS8qIGdldCBsZWFmIHBhZ2UgKi8KKwlEVF9HRVRTRUFSQ0goaXAsIGJ0c3RhY2stPnRvcCwgYm4sIG1wLCBwLCBpbmRleCk7CisKKwkvKiBnZXQgdGhlIHN0YXJ0IG9mZnNldCAocG46aW5kZXgpICovCisJcG4gPSBkdG9mZnNldC0+cG4gLSAxOwkvKiBOb3cgcG4gPSAwIHJlcHJlc2VudHMgbGVmdG1vc3QgbGVhZiAqLworCWluZGV4ID0gZHRvZmZzZXQtPmluZGV4OworCisJLyogc3RhcnQgYXQgbGVmdG1vc3QgcGFnZSA/ICovCisJaWYgKHBuID09IDApIHsKKwkJLyogb2Zmc2V0IGJleW9uZCBlb2YgPyAqLworCQlpZiAoaW5kZXggPCBwLT5oZWFkZXIubmV4dGluZGV4KQorCQkJZ290byBvdXQ7CisKKwkJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfUk9PVCkgeworCQkJYm4gPSAtMTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogc3RhcnQgd2l0aCAxc3QgZW50cnkgb2YgbmV4dCBsZWFmIHBhZ2UgKi8KKwkJZHRvZmZzZXQtPnBuKys7CisJCWR0b2Zmc2V0LT5pbmRleCA9IGluZGV4ID0gMDsKKwkJZ290byBhOworCX0KKworCS8qIHN0YXJ0IGF0IG5vbi1sZWZ0bW9zdCBwYWdlOiBzY2FuIHBhcmVudCBwYWdlcyBmb3IgbGFyZ2UgcG4gKi8KKwlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSB7CisJCWJuID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCS8qIHN0YXJ0IGFmdGVyIG5leHQgbGVhZiBwYWdlID8gKi8KKwlpZiAocG4gPiAxKQorCQlnb3RvIGI7CisKKwkvKiBnZXQgbGVhZiBwYWdlIHBuID0gMSAqLworICAgICAgYToKKwlibiA9IGxlNjRfdG9fY3B1KHAtPmhlYWRlci5uZXh0KTsKKworCS8qIHVucGluIGxlYWYgcGFnZSAqLworCURUX1BVVFBBR0UobXApOworCisJLyogb2Zmc2V0IGJleW9uZCBlb2YgPyAqLworCWlmIChibiA9PSAwKSB7CisJCWJuID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCWdvdG8gYzsKKworCS8qCisJICogc2NhbiBsYXN0IGludGVybmFsIHBhZ2UgbGV2ZWwgdG8gZ2V0IHRhcmdldCBsZWFmIHBhZ2UKKwkgKi8KKyAgICAgIGI6CisJLyogdW5waW4gbGVmdG1vc3QgbGVhZiBwYWdlICovCisJRFRfUFVUUEFHRShtcCk7CisKKwkvKiBnZXQgbGVmdCBtb3N0IHBhcmVudCBwYWdlICovCisJYnRzcCA9IGJ0c3RhY2stPnRvcDsKKwlwYXJlbnQgPSBidHNwIC0gMTsKKwlibiA9IHBhcmVudC0+Ym47CisJRFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogc2NhbiBwYXJlbnQgcGFnZXMgYXQgbGFzdCBpbnRlcm5hbCBwYWdlIGxldmVsICovCisJd2hpbGUgKHBuID49IHAtPmhlYWRlci5uZXh0aW5kZXgpIHsKKwkJcG4gLT0gcC0+aGVhZGVyLm5leHRpbmRleDsKKworCQkvKiBnZXQgbmV4dCBwYXJlbnQgcGFnZSBhZGRyZXNzICovCisJCWJuID0gbGU2NF90b19jcHUocC0+aGVhZGVyLm5leHQpOworCisJCS8qIHVucGluIGN1cnJlbnQgcGFyZW50IHBhZ2UgKi8KKwkJRFRfUFVUUEFHRShtcCk7CisKKwkJLyogb2Zmc2V0IGJleW9uZCBlb2YgPyAqLworCQlpZiAoYm4gPT0gMCkgeworCQkJYm4gPSAtMTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogZ2V0IG5leHQgcGFyZW50IHBhZ2UgKi8KKwkJRFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJLyogdXBkYXRlIHBhcmVudCBwYWdlIHN0YWNrIGZyYW1lICovCisJCXBhcmVudC0+Ym4gPSBibjsKKwl9CisKKwkvKiBnZXQgbGVhZiBwYWdlIGFkZHJlc3MgKi8KKwlzdGJsID0gRFRfR0VUU1RCTChwKTsKKwl4ZCA9IChweGRfdCAqKSAmIHAtPnNsb3Rbc3RibFtwbl1dOworCWJuID0gYWRkcmVzc1BYRCh4ZCk7CisKKwkvKiB1bnBpbiBwYXJlbnQgcGFnZSAqLworCURUX1BVVFBBR0UobXApOworCisJLyoKKwkgKiBnZXQgdGFyZ2V0IGxlYWYgcGFnZQorCSAqLworICAgICAgYzoKKwlEVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKgorCSAqIGxlYWYgcGFnZSBoYXMgYmVlbiBjb21wbGV0ZWQ6CisJICogc3RhcnQgd2l0aCAxc3QgZW50cnkgb2YgbmV4dCBsZWFmIHBhZ2UKKwkgKi8KKwlpZiAoaW5kZXggPj0gcC0+aGVhZGVyLm5leHRpbmRleCkgeworCQlibiA9IGxlNjRfdG9fY3B1KHAtPmhlYWRlci5uZXh0KTsKKworCQkvKiB1bnBpbiBsZWFmIHBhZ2UgKi8KKwkJRFRfUFVUUEFHRShtcCk7CisKKwkJLyogb2Zmc2V0IGJleW9uZCBlb2YgPyAqLworCQlpZiAoYm4gPT0gMCkgeworCQkJYm4gPSAtMTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogZ2V0IG5leHQgbGVhZiBwYWdlICovCisJCURUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCS8qIHN0YXJ0IHdpdGggMXN0IGVudHJ5IG9mIG5leHQgbGVhZiBwYWdlICovCisJCWR0b2Zmc2V0LT5wbisrOworCQlkdG9mZnNldC0+aW5kZXggPSAwOworCX0KKworICAgICAgb3V0OgorCS8qIHJldHVybiB0YXJnZXQgbGVhZiBwYWdlIHBpbm5lZCAqLworCWJ0c3AgPSBidHN0YWNrLT50b3A7CisJYnRzcC0+Ym4gPSBibjsKKwlidHNwLT5pbmRleCA9IGR0b2Zmc2V0LT5pbmRleDsKKwlidHNwLT5tcCA9IG1wOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCWR0Q29tcGFyZSgpCisgKgorICogZnVuY3Rpb246IGNvbXBhcmUgc2VhcmNoIGtleSB3aXRoIGFuIGludGVybmFsIGVudHJ5CisgKgorICogcmV0dXJuOgorICoJPCAwIGlmIGsgaXMgPCByZWNvcmQKKyAqCT0gMCBpZiBrIGlzID0gcmVjb3JkCisgKgk+IDAgaWYgayBpcyA+IHJlY29yZAorICovCitzdGF0aWMgaW50IGR0Q29tcGFyZShzdHJ1Y3QgY29tcG9uZW50X25hbWUgKiBrZXksCS8qIHNlYXJjaCBrZXkgKi8KKwkJICAgICBkdHBhZ2VfdCAqIHAsCS8qIGRpcmVjdG9yeSBwYWdlICovCisJCSAgICAgaW50IHNpKQorewkJCQkvKiBlbnRyeSBzbG90IGluZGV4ICovCisJd2NoYXJfdCAqa25hbWU7CisJX19sZTE2ICpuYW1lOworCWludCBrbGVuLCBuYW1sZW4sIGxlbiwgcmM7CisJc3RydWN0IGlkdGVudHJ5ICppaDsKKwlzdHJ1Y3QgZHRzbG90ICp0OworCisJLyoKKwkgKiBmb3JjZSB0aGUgbGVmdC1tb3N0IGtleSBvbiBpbnRlcm5hbCBwYWdlcywgYXQgYW55IGxldmVsIG9mCisJICogdGhlIHRyZWUsIHRvIGJlIGxlc3MgdGhhbiBhbnkgc2VhcmNoIGtleS4KKwkgKiB0aGlzIG9idmlhdGVzIGhhdmluZyB0byB1cGRhdGUgdGhlIGxlZnRtb3N0IGtleSBvbiBhbiBpbnRlcm5hbAorCSAqIHBhZ2Ugd2hlbiB0aGUgdXNlciBpbnNlcnRzIGEgbmV3IGtleSBpbiB0aGUgdHJlZSBzbWFsbGVyIHRoYW4KKwkgKiBhbnl0aGluZyB0aGF0IGhhcyBiZWVuIHN0b3JlZC4KKwkgKgorCSAqICg/IGlmL3doZW4gZHRTZWFyY2goKSBuYXJyb3dzIGRvd24gdG8gMXN0IGVudHJ5IChpbmRleCA9IDApLAorCSAqIGF0IGFueSBpbnRlcm5hbCBwYWdlIGF0IGFueSBsZXZlbCBvZiB0aGUgdHJlZSwKKwkgKiBpdCBkZXNjZW5kcyB0byBjaGlsZCBvZiB0aGUgZW50cnkgYW55d2F5IC0KKwkgKiA/IG1ha2UgdGhlIGVudHJ5IGFzIG1pbiBzaXplIGR1bW15IGVudHJ5KQorCSAqCisJICogaWYgKGUtPmluZGV4ID09IDAgJiYgaC0+cHJldnBnID09IFBfSU5WQUxJRCAmJiAhKGgtPmZsYWdzICYgQlRfTEVBRikpCisJICogcmV0dXJuICgxKTsKKwkgKi8KKworCWtuYW1lID0ga2V5LT5uYW1lOworCWtsZW4gPSBrZXktPm5hbWxlbjsKKworCWloID0gKHN0cnVjdCBpZHRlbnRyeSAqKSAmIHAtPnNsb3Rbc2ldOworCXNpID0gaWgtPm5leHQ7CisJbmFtZSA9IGloLT5uYW1lOworCW5hbWxlbiA9IGloLT5uYW1sZW47CisJbGVuID0gbWluKG5hbWxlbiwgRFRJSERSREFUQUxFTik7CisKKwkvKiBjb21wYXJlIHdpdGggaGVhZC9vbmx5IHNlZ21lbnQgKi8KKwlsZW4gPSBtaW4oa2xlbiwgbGVuKTsKKwlpZiAoKHJjID0gVW5pU3RybmNtcF9sZShrbmFtZSwgbmFtZSwgbGVuKSkpCisJCXJldHVybiByYzsKKworCWtsZW4gLT0gbGVuOworCW5hbWxlbiAtPSBsZW47CisKKwkvKiBjb21wYXJlIHdpdGggYWRkaXRpb25hbCBzZWdtZW50KHMpICovCisJa25hbWUgKz0gbGVuOworCXdoaWxlIChrbGVuID4gMCAmJiBuYW1sZW4gPiAwKSB7CisJCS8qIGNvbXBhcmUgd2l0aCBuZXh0IG5hbWUgc2VnbWVudCAqLworCQl0ID0gKHN0cnVjdCBkdHNsb3QgKikgJiBwLT5zbG90W3NpXTsKKwkJbGVuID0gbWluKG5hbWxlbiwgRFRTTE9UREFUQUxFTik7CisJCWxlbiA9IG1pbihrbGVuLCBsZW4pOworCQluYW1lID0gdC0+bmFtZTsKKwkJaWYgKChyYyA9IFVuaVN0cm5jbXBfbGUoa25hbWUsIG5hbWUsIGxlbikpKQorCQkJcmV0dXJuIHJjOworCisJCWtsZW4gLT0gbGVuOworCQluYW1sZW4gLT0gbGVuOworCQlrbmFtZSArPSBsZW47CisJCXNpID0gdC0+bmV4dDsKKwl9CisKKwlyZXR1cm4gKGtsZW4gLSBuYW1sZW4pOworfQorCisKKworCisvKgorICoJY2lDb21wYXJlKCkKKyAqCisgKiBmdW5jdGlvbjogY29tcGFyZSBzZWFyY2gga2V5IHdpdGggYW4gKGxlYWYvaW50ZXJuYWwpIGVudHJ5CisgKgorICogcmV0dXJuOgorICoJPCAwIGlmIGsgaXMgPCByZWNvcmQKKyAqCT0gMCBpZiBrIGlzID0gcmVjb3JkCisgKgk+IDAgaWYgayBpcyA+IHJlY29yZAorICovCitzdGF0aWMgaW50IGNpQ29tcGFyZShzdHJ1Y3QgY29tcG9uZW50X25hbWUgKiBrZXksCS8qIHNlYXJjaCBrZXkgKi8KKwkJICAgICBkdHBhZ2VfdCAqIHAsCS8qIGRpcmVjdG9yeSBwYWdlICovCisJCSAgICAgaW50IHNpLAkvKiBlbnRyeSBzbG90IGluZGV4ICovCisJCSAgICAgaW50IGZsYWcpCit7CisJd2NoYXJfdCAqa25hbWUsIHg7CisJX19sZTE2ICpuYW1lOworCWludCBrbGVuLCBuYW1sZW4sIGxlbiwgcmM7CisJc3RydWN0IGxkdGVudHJ5ICpsaDsKKwlzdHJ1Y3QgaWR0ZW50cnkgKmloOworCXN0cnVjdCBkdHNsb3QgKnQ7CisJaW50IGk7CisKKwkvKgorCSAqIGZvcmNlIHRoZSBsZWZ0LW1vc3Qga2V5IG9uIGludGVybmFsIHBhZ2VzLCBhdCBhbnkgbGV2ZWwgb2YKKwkgKiB0aGUgdHJlZSwgdG8gYmUgbGVzcyB0aGFuIGFueSBzZWFyY2gga2V5LgorCSAqIHRoaXMgb2J2aWF0ZXMgaGF2aW5nIHRvIHVwZGF0ZSB0aGUgbGVmdG1vc3Qga2V5IG9uIGFuIGludGVybmFsCisJICogcGFnZSB3aGVuIHRoZSB1c2VyIGluc2VydHMgYSBuZXcga2V5IGluIHRoZSB0cmVlIHNtYWxsZXIgdGhhbgorCSAqIGFueXRoaW5nIHRoYXQgaGFzIGJlZW4gc3RvcmVkLgorCSAqCisJICogKD8gaWYvd2hlbiBkdFNlYXJjaCgpIG5hcnJvd3MgZG93biB0byAxc3QgZW50cnkgKGluZGV4ID0gMCksCisJICogYXQgYW55IGludGVybmFsIHBhZ2UgYXQgYW55IGxldmVsIG9mIHRoZSB0cmVlLAorCSAqIGl0IGRlc2NlbmRzIHRvIGNoaWxkIG9mIHRoZSBlbnRyeSBhbnl3YXkgLQorCSAqID8gbWFrZSB0aGUgZW50cnkgYXMgbWluIHNpemUgZHVtbXkgZW50cnkpCisJICoKKwkgKiBpZiAoZS0+aW5kZXggPT0gMCAmJiBoLT5wcmV2cGcgPT0gUF9JTlZBTElEICYmICEoaC0+ZmxhZ3MgJiBCVF9MRUFGKSkKKwkgKiByZXR1cm4gKDEpOworCSAqLworCisJa25hbWUgPSBrZXktPm5hbWU7CisJa2xlbiA9IGtleS0+bmFtbGVuOworCisJLyoKKwkgKiBsZWFmIHBhZ2UgZW50cnkKKwkgKi8KKwlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSB7CisJCWxoID0gKHN0cnVjdCBsZHRlbnRyeSAqKSAmIHAtPnNsb3Rbc2ldOworCQlzaSA9IGxoLT5uZXh0OworCQluYW1lID0gbGgtPm5hbWU7CisJCW5hbWxlbiA9IGxoLT5uYW1sZW47CisJCWlmIChmbGFnICYgSkZTX0RJUl9JTkRFWCkKKwkJCWxlbiA9IG1pbihuYW1sZW4sIERUTEhEUkRBVEFMRU4pOworCQllbHNlCisJCQlsZW4gPSBtaW4obmFtbGVuLCBEVExIRFJEQVRBTEVOX0xFR0FDWSk7CisJfQorCS8qCisJICogaW50ZXJuYWwgcGFnZSBlbnRyeQorCSAqLworCWVsc2UgeworCQlpaCA9IChzdHJ1Y3QgaWR0ZW50cnkgKikgJiBwLT5zbG90W3NpXTsKKwkJc2kgPSBpaC0+bmV4dDsKKwkJbmFtZSA9IGloLT5uYW1lOworCQluYW1sZW4gPSBpaC0+bmFtbGVuOworCQlsZW4gPSBtaW4obmFtbGVuLCBEVElIRFJEQVRBTEVOKTsKKwl9CisKKwkvKiBjb21wYXJlIHdpdGggaGVhZC9vbmx5IHNlZ21lbnQgKi8KKwlsZW4gPSBtaW4oa2xlbiwgbGVuKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyssIGtuYW1lKyssIG5hbWUrKykgeworCQkvKiBvbmx5IHVwcGVyY2FzZSBpZiBjYXNlLWluc2Vuc2l0aXZlIHN1cHBvcnQgaXMgb24gKi8KKwkJaWYgKChmbGFnICYgSkZTX09TMikgPT0gSkZTX09TMikKKwkJCXggPSBVbmlUb3VwcGVyKGxlMTZfdG9fY3B1KCpuYW1lKSk7CisJCWVsc2UKKwkJCXggPSBsZTE2X3RvX2NwdSgqbmFtZSk7CisJCWlmICgocmMgPSAqa25hbWUgLSB4KSkKKwkJCXJldHVybiByYzsKKwl9CisKKwlrbGVuIC09IGxlbjsKKwluYW1sZW4gLT0gbGVuOworCisJLyogY29tcGFyZSB3aXRoIGFkZGl0aW9uYWwgc2VnbWVudChzKSAqLworCXdoaWxlIChrbGVuID4gMCAmJiBuYW1sZW4gPiAwKSB7CisJCS8qIGNvbXBhcmUgd2l0aCBuZXh0IG5hbWUgc2VnbWVudCAqLworCQl0ID0gKHN0cnVjdCBkdHNsb3QgKikgJiBwLT5zbG90W3NpXTsKKwkJbGVuID0gbWluKG5hbWxlbiwgRFRTTE9UREFUQUxFTik7CisJCWxlbiA9IG1pbihrbGVuLCBsZW4pOworCQluYW1lID0gdC0+bmFtZTsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrLCBrbmFtZSsrLCBuYW1lKyspIHsKKwkJCS8qIG9ubHkgdXBwZXJjYXNlIGlmIGNhc2UtaW5zZW5zaXRpdmUgc3VwcG9ydCBpcyBvbiAqLworCQkJaWYgKChmbGFnICYgSkZTX09TMikgPT0gSkZTX09TMikKKwkJCQl4ID0gVW5pVG91cHBlcihsZTE2X3RvX2NwdSgqbmFtZSkpOworCQkJZWxzZQorCQkJCXggPSBsZTE2X3RvX2NwdSgqbmFtZSk7CisKKwkJCWlmICgocmMgPSAqa25hbWUgLSB4KSkKKwkJCQlyZXR1cm4gcmM7CisJCX0KKworCQlrbGVuIC09IGxlbjsKKwkJbmFtbGVuIC09IGxlbjsKKwkJc2kgPSB0LT5uZXh0OworCX0KKworCXJldHVybiAoa2xlbiAtIG5hbWxlbik7Cit9CisKKworLyoKKyAqCWNpR2V0TGVhZlByZWZpeEtleSgpCisgKgorICogZnVuY3Rpb246IGNvbXB1dGUgcHJlZml4IG9mIHN1ZmZpeCBjb21wcmVzc2lvbgorICoJICAgICBmcm9tIHR3byBhZGphY2VudCBsZWFmIGVudHJpZXMKKyAqCSAgICAgYWNyb3NzIHBhZ2UgYm91bmRhcnkKKyAqCisgKiByZXR1cm46IG5vbi16ZXJvIG9uIGVycm9yCisgKgkKKyAqLworc3RhdGljIGludCBjaUdldExlYWZQcmVmaXhLZXkoZHRwYWdlX3QgKiBscCwgaW50IGxpLCBkdHBhZ2VfdCAqIHJwLAorCQkJICAgICAgIGludCByaSwgc3RydWN0IGNvbXBvbmVudF9uYW1lICoga2V5LCBpbnQgZmxhZykKK3sKKwlpbnQga2xlbiwgbmFtbGVuOworCXdjaGFyX3QgKnBsLCAqcHIsICprbmFtZTsKKwlzdHJ1Y3QgY29tcG9uZW50X25hbWUgbGtleTsKKwlzdHJ1Y3QgY29tcG9uZW50X25hbWUgcmtleTsKKworCWxrZXkubmFtZSA9ICh3Y2hhcl90ICopIGttYWxsb2MoKEpGU19OQU1FX01BWCArIDEpICogc2l6ZW9mKHdjaGFyX3QpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAobGtleS5uYW1lID09IE5VTEwpCisJCXJldHVybiAtRU5PU1BDOworCisJcmtleS5uYW1lID0gKHdjaGFyX3QgKikga21hbGxvYygoSkZTX05BTUVfTUFYICsgMSkgKiBzaXplb2Yod2NoYXJfdCksCisJCQkJCUdGUF9LRVJORUwpOworCWlmIChya2V5Lm5hbWUgPT0gTlVMTCkgeworCQlrZnJlZShsa2V5Lm5hbWUpOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwkvKiBnZXQgbGVmdCBhbmQgcmlnaHQga2V5ICovCisJZHRHZXRLZXkobHAsIGxpLCAmbGtleSwgZmxhZyk7CisJbGtleS5uYW1lW2xrZXkubmFtbGVuXSA9IDA7CisKKwlpZiAoKGZsYWcgJiBKRlNfT1MyKSA9PSBKRlNfT1MyKQorCQljaVRvVXBwZXIoJmxrZXkpOworCisJZHRHZXRLZXkocnAsIHJpLCAmcmtleSwgZmxhZyk7CisJcmtleS5uYW1lW3JrZXkubmFtbGVuXSA9IDA7CisKKworCWlmICgoZmxhZyAmIEpGU19PUzIpID09IEpGU19PUzIpCisJCWNpVG9VcHBlcigmcmtleSk7CisKKwkvKiBjb21wdXRlIHByZWZpeCAqLworCWtsZW4gPSAwOworCWtuYW1lID0ga2V5LT5uYW1lOworCW5hbWxlbiA9IG1pbihsa2V5Lm5hbWxlbiwgcmtleS5uYW1sZW4pOworCWZvciAocGwgPSBsa2V5Lm5hbWUsIHByID0gcmtleS5uYW1lOworCSAgICAgbmFtbGVuOyBwbCsrLCBwcisrLCBuYW1sZW4tLSwga2xlbisrLCBrbmFtZSsrKSB7CisJCSprbmFtZSA9ICpwcjsKKwkJaWYgKCpwbCAhPSAqcHIpIHsKKwkJCWtleS0+bmFtbGVuID0ga2xlbiArIDE7CisJCQlnb3RvIGZyZWVfbmFtZXM7CisJCX0KKwl9CisKKwkvKiBsLT5uYW1sZW4gPD0gci0+bmFtbGVuIHNpbmNlIGwgPD0gciAqLworCWlmIChsa2V5Lm5hbWxlbiA8IHJrZXkubmFtbGVuKSB7CisJCSprbmFtZSA9ICpwcjsKKwkJa2V5LT5uYW1sZW4gPSBrbGVuICsgMTsKKwl9IGVsc2UJCQkvKiBsLT5uYW1lbGVuID09IHItPm5hbWVsZW4gKi8KKwkJa2V5LT5uYW1sZW4gPSBrbGVuOworCitmcmVlX25hbWVzOgorCWtmcmVlKGxrZXkubmFtZSk7CisJa2ZyZWUocmtleS5uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworCisKKy8qCisgKglkdEdldEtleSgpCisgKgorICogZnVuY3Rpb246IGdldCBrZXkgb2YgdGhlIGVudHJ5CisgKi8KK3N0YXRpYyB2b2lkIGR0R2V0S2V5KGR0cGFnZV90ICogcCwgaW50IGksCS8qIGVudHJ5IGluZGV4ICovCisJCSAgICAgc3RydWN0IGNvbXBvbmVudF9uYW1lICoga2V5LCBpbnQgZmxhZykKK3sKKwlpbnQgc2k7CisJczggKnN0Ymw7CisJc3RydWN0IGxkdGVudHJ5ICpsaDsKKwlzdHJ1Y3QgaWR0ZW50cnkgKmloOworCXN0cnVjdCBkdHNsb3QgKnQ7CisJaW50IG5hbWxlbiwgbGVuOworCXdjaGFyX3QgKmtuYW1lOworCV9fbGUxNiAqbmFtZTsKKworCS8qIGdldCBlbnRyeSAqLworCXN0YmwgPSBEVF9HRVRTVEJMKHApOworCXNpID0gc3RibFtpXTsKKwlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSB7CisJCWxoID0gKHN0cnVjdCBsZHRlbnRyeSAqKSAmIHAtPnNsb3Rbc2ldOworCQlzaSA9IGxoLT5uZXh0OworCQluYW1sZW4gPSBsaC0+bmFtbGVuOworCQluYW1lID0gbGgtPm5hbWU7CisJCWlmIChmbGFnICYgSkZTX0RJUl9JTkRFWCkKKwkJCWxlbiA9IG1pbihuYW1sZW4sIERUTEhEUkRBVEFMRU4pOworCQllbHNlCisJCQlsZW4gPSBtaW4obmFtbGVuLCBEVExIRFJEQVRBTEVOX0xFR0FDWSk7CisJfSBlbHNlIHsKKwkJaWggPSAoc3RydWN0IGlkdGVudHJ5ICopICYgcC0+c2xvdFtzaV07CisJCXNpID0gaWgtPm5leHQ7CisJCW5hbWxlbiA9IGloLT5uYW1sZW47CisJCW5hbWUgPSBpaC0+bmFtZTsKKwkJbGVuID0gbWluKG5hbWxlbiwgRFRJSERSREFUQUxFTik7CisJfQorCisJa2V5LT5uYW1sZW4gPSBuYW1sZW47CisJa25hbWUgPSBrZXktPm5hbWU7CisKKwkvKgorCSAqIG1vdmUgaGVhZC9vbmx5IHNlZ21lbnQKKwkgKi8KKwlVbmlTdHJuY3B5X2Zyb21fbGUoa25hbWUsIG5hbWUsIGxlbik7CisKKwkvKgorCSAqIG1vdmUgYWRkaXRpb25hbCBzZWdtZW50KHMpCisJICovCisJd2hpbGUgKHNpID49IDApIHsKKwkJLyogZ2V0IG5leHQgc2VnbWVudCAqLworCQl0ID0gJnAtPnNsb3Rbc2ldOworCQlrbmFtZSArPSBsZW47CisJCW5hbWxlbiAtPSBsZW47CisJCWxlbiA9IG1pbihuYW1sZW4sIERUU0xPVERBVEFMRU4pOworCQlVbmlTdHJuY3B5X2Zyb21fbGUoa25hbWUsIHQtPm5hbWUsIGxlbik7CisKKwkJc2kgPSB0LT5uZXh0OworCX0KK30KKworCisvKgorICoJZHRJbnNlcnRFbnRyeSgpCisgKgorICogZnVuY3Rpb246IGFsbG9jYXRlIGZyZWUgc2xvdChzKSBhbmQKKyAqCSAgICAgd3JpdGUgYSBsZWFmL2ludGVybmFsIGVudHJ5CisgKgorICogcmV0dXJuOiBlbnRyeSBzbG90IGluZGV4CisgKi8KK3N0YXRpYyB2b2lkIGR0SW5zZXJ0RW50cnkoZHRwYWdlX3QgKiBwLCBpbnQgaW5kZXgsIHN0cnVjdCBjb21wb25lbnRfbmFtZSAqIGtleSwKKwkJCSAgZGRhdGFfdCAqIGRhdGEsIHN0cnVjdCBkdF9sb2NrICoqIGR0bG9jaykKK3sKKwlzdHJ1Y3QgZHRzbG90ICpoLCAqdDsKKwlzdHJ1Y3QgbGR0ZW50cnkgKmxoID0gTlVMTDsKKwlzdHJ1Y3QgaWR0ZW50cnkgKmloID0gTlVMTDsKKwlpbnQgaHNpLCBmc2ksIGtsZW4sIGxlbiwgbmV4dGluZGV4OworCXdjaGFyX3QgKmtuYW1lOworCV9fbGUxNiAqbmFtZTsKKwlzOCAqc3RibDsKKwlweGRfdCAqeGQ7CisJc3RydWN0IGR0X2xvY2sgKmR0bGNrID0gKmR0bG9jazsKKwlzdHJ1Y3QgbHYgKmx2OworCWludCB4c2ksIG47CisJczY0IGJuID0gMDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wID0gTlVMTDsKKworCWtsZW4gPSBrZXktPm5hbWxlbjsKKwlrbmFtZSA9IGtleS0+bmFtZTsKKworCS8qIGFsbG9jYXRlIGEgZnJlZSBzbG90ICovCisJaHNpID0gZnNpID0gcC0+aGVhZGVyLmZyZWVsaXN0OworCWggPSAmcC0+c2xvdFtmc2ldOworCXAtPmhlYWRlci5mcmVlbGlzdCA9IGgtPm5leHQ7CisJLS1wLT5oZWFkZXIuZnJlZWNudDsKKworCS8qIG9wZW4gbmV3IGxpbmVsb2NrICovCisJaWYgKGR0bGNrLT5pbmRleCA+PSBkdGxjay0+bWF4Y250KQorCQlkdGxjayA9IChzdHJ1Y3QgZHRfbG9jayAqKSB0eExpbmVsb2NrKGR0bGNrKTsKKworCWx2ID0gJiBkdGxjay0+bHZbZHRsY2stPmluZGV4XTsKKwlsdi0+b2Zmc2V0ID0gaHNpOworCisJLyogd3JpdGUgaGVhZC9vbmx5IHNlZ21lbnQgKi8KKwlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSB7CisJCWxoID0gKHN0cnVjdCBsZHRlbnRyeSAqKSBoOworCQlsaC0+bmV4dCA9IGgtPm5leHQ7CisJCWxoLT5pbnVtYmVyID0gY3B1X3RvX2xlMzIoZGF0YS0+bGVhZi5pbm8pOworCQlsaC0+bmFtbGVuID0ga2xlbjsKKwkJbmFtZSA9IGxoLT5uYW1lOworCQlpZiAoZGF0YS0+bGVhZi5pcCkgeworCQkJbGVuID0gbWluKGtsZW4sIERUTEhEUkRBVEFMRU4pOworCQkJaWYgKCEocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSkKKwkJCQlibiA9IGFkZHJlc3NQWEQoJnAtPmhlYWRlci5zZWxmKTsKKwkJCWxoLT5pbmRleCA9IGNwdV90b19sZTMyKGFkZF9pbmRleChkYXRhLT5sZWFmLnRpZCwKKwkJCQkJCQkgIGRhdGEtPmxlYWYuaXAsCisJCQkJCQkJICBibiwgaW5kZXgpKTsKKwkJfSBlbHNlCisJCQlsZW4gPSBtaW4oa2xlbiwgRFRMSERSREFUQUxFTl9MRUdBQ1kpOworCX0gZWxzZSB7CisJCWloID0gKHN0cnVjdCBpZHRlbnRyeSAqKSBoOworCQlpaC0+bmV4dCA9IGgtPm5leHQ7CisJCXhkID0gKHB4ZF90ICopIGloOworCQkqeGQgPSBkYXRhLT54ZDsKKwkJaWgtPm5hbWxlbiA9IGtsZW47CisJCW5hbWUgPSBpaC0+bmFtZTsKKwkJbGVuID0gbWluKGtsZW4sIERUSUhEUkRBVEFMRU4pOworCX0KKworCVVuaVN0cm5jcHlfdG9fbGUobmFtZSwga25hbWUsIGxlbik7CisKKwluID0gMTsKKwl4c2kgPSBoc2k7CisKKwkvKiB3cml0ZSBhZGRpdGlvbmFsIHNlZ21lbnQocykgKi8KKwl0ID0gaDsKKwlrbGVuIC09IGxlbjsKKwl3aGlsZSAoa2xlbikgeworCQkvKiBnZXQgZnJlZSBzbG90ICovCisJCWZzaSA9IHAtPmhlYWRlci5mcmVlbGlzdDsKKwkJdCA9ICZwLT5zbG90W2ZzaV07CisJCXAtPmhlYWRlci5mcmVlbGlzdCA9IHQtPm5leHQ7CisJCS0tcC0+aGVhZGVyLmZyZWVjbnQ7CisKKwkJLyogaXMgbmV4dCBzbG90IGNvbnRpZ3VvdXMgPyAqLworCQlpZiAoZnNpICE9IHhzaSArIDEpIHsKKwkJCS8qIGNsb3NlIGN1cnJlbnQgbGluZWxvY2sgKi8KKwkJCWx2LT5sZW5ndGggPSBuOworCQkJZHRsY2stPmluZGV4Kys7CisKKwkJCS8qIG9wZW4gbmV3IGxpbmVsb2NrICovCisJCQlpZiAoZHRsY2stPmluZGV4IDwgZHRsY2stPm1heGNudCkKKwkJCQlsdisrOworCQkJZWxzZSB7CisJCQkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgdHhMaW5lbG9jayhkdGxjayk7CisJCQkJbHYgPSAmIGR0bGNrLT5sdlswXTsKKwkJCX0KKworCQkJbHYtPm9mZnNldCA9IGZzaTsKKwkJCW4gPSAwOworCQl9CisKKwkJa25hbWUgKz0gbGVuOworCQlsZW4gPSBtaW4oa2xlbiwgRFRTTE9UREFUQUxFTik7CisJCVVuaVN0cm5jcHlfdG9fbGUodC0+bmFtZSwga25hbWUsIGxlbik7CisKKwkJbisrOworCQl4c2kgPSBmc2k7CisJCWtsZW4gLT0gbGVuOworCX0KKworCS8qIGNsb3NlIGN1cnJlbnQgbGluZWxvY2sgKi8KKwlsdi0+bGVuZ3RoID0gbjsKKwlkdGxjay0+aW5kZXgrKzsKKworCSpkdGxvY2sgPSBkdGxjazsKKworCS8qIHRlcm1pbmF0ZSBsYXN0L29ubHkgc2VnbWVudCAqLworCWlmIChoID09IHQpIHsKKwkJLyogc2luZ2xlIHNlZ21lbnQgZW50cnkgKi8KKwkJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfTEVBRikKKwkJCWxoLT5uZXh0ID0gLTE7CisJCWVsc2UKKwkJCWloLT5uZXh0ID0gLTE7CisJfSBlbHNlCisJCS8qIG11bHRpLXNlZ21lbnQgZW50cnkgKi8KKwkJdC0+bmV4dCA9IC0xOworCisJLyogaWYgaW5zZXJ0IGludG8gbWlkZGxlLCBzaGlmdCByaWdodCBzdWNjZWVkaW5nIGVudHJpZXMgaW4gc3RibCAqLworCXN0YmwgPSBEVF9HRVRTVEJMKHApOworCW5leHRpbmRleCA9IHAtPmhlYWRlci5uZXh0aW5kZXg7CisJaWYgKGluZGV4IDwgbmV4dGluZGV4KSB7CisJCW1lbW1vdmUoc3RibCArIGluZGV4ICsgMSwgc3RibCArIGluZGV4LCBuZXh0aW5kZXggLSBpbmRleCk7CisKKwkJaWYgKChwLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpICYmIGRhdGEtPmxlYWYuaXApIHsKKwkJCXM2NCBsYmxvY2s7CisKKwkJCS8qCisJCQkgKiBOZWVkIHRvIHVwZGF0ZSBzbG90IG51bWJlciBmb3IgZW50cmllcyB0aGF0IG1vdmVkCisJCQkgKiBpbiB0aGUgc3RibAorCQkJICovCisJCQltcCA9IE5VTEw7CisJCQlmb3IgKG4gPSBpbmRleCArIDE7IG4gPD0gbmV4dGluZGV4OyBuKyspIHsKKwkJCQlsaCA9IChzdHJ1Y3QgbGR0ZW50cnkgKikgJiAocC0+c2xvdFtzdGJsW25dXSk7CisJCQkJbW9kaWZ5X2luZGV4KGRhdGEtPmxlYWYudGlkLCBkYXRhLT5sZWFmLmlwLAorCQkJCQkgICAgIGxlMzJfdG9fY3B1KGxoLT5pbmRleCksIGJuLCBuLAorCQkJCQkgICAgICZtcCwgJmxibG9jayk7CisJCQl9CisJCQlpZiAobXApCisJCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCX0KKwl9CisKKwlzdGJsW2luZGV4XSA9IGhzaTsKKworCS8qIGFkdmFuY2UgbmV4dCBhdmFpbGFibGUgZW50cnkgaW5kZXggb2Ygc3RibCAqLworCSsrcC0+aGVhZGVyLm5leHRpbmRleDsKK30KKworCisvKgorICoJZHRNb3ZlRW50cnkoKQorICoKKyAqIGZ1bmN0aW9uOiBtb3ZlIGVudHJpZXMgZnJvbSBzcGxpdC9sZWZ0IHBhZ2UgdG8gbmV3L3JpZ2h0IHBhZ2UKKyAqCisgKgluZXh0aW5kZXggb2YgZHN0IHBhZ2UgYW5kIGZyZWVsaXN0L2ZyZWVjbnQgb2YgYm90aCBwYWdlcworICoJYXJlIHVwZGF0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIGR0TW92ZUVudHJ5KGR0cGFnZV90ICogc3AsIGludCBzaSwgZHRwYWdlX3QgKiBkcCwKKwkJCXN0cnVjdCBkdF9sb2NrICoqIHNkdGxvY2ssIHN0cnVjdCBkdF9sb2NrICoqIGRkdGxvY2ssCisJCQlpbnQgZG9faW5kZXgpCit7CisJaW50IHNzaSwgbmV4dDsJCS8qIHNyYyBzbG90IGluZGV4ICovCisJaW50IGRpOwkJCS8qIGRzdCBlbnRyeSBpbmRleCAqLworCWludCBkc2k7CQkvKiBkc3Qgc2xvdCBpbmRleCAqLworCXM4ICpzc3RibCwgKmRzdGJsOwkvKiBzb3J0ZWQgZW50cnkgdGFibGUgKi8KKwlpbnQgc25hbWxlbiwgbGVuOworCXN0cnVjdCBsZHRlbnRyeSAqc2xoLCAqZGxoID0gTlVMTDsKKwlzdHJ1Y3QgaWR0ZW50cnkgKnNpaCwgKmRpaCA9IE5VTEw7CisJc3RydWN0IGR0c2xvdCAqaCwgKnMsICpkOworCXN0cnVjdCBkdF9sb2NrICpzZHRsY2sgPSAqc2R0bG9jaywgKmRkdGxjayA9ICpkZHRsb2NrOworCXN0cnVjdCBsdiAqc2x2LCAqZGx2OworCWludCB4c3NpLCBucywgbmQ7CisJaW50IHNmc2k7CisKKwlzc3RibCA9IChzOCAqKSAmIHNwLT5zbG90W3NwLT5oZWFkZXIuc3RibGluZGV4XTsKKwlkc3RibCA9IChzOCAqKSAmIGRwLT5zbG90W2RwLT5oZWFkZXIuc3RibGluZGV4XTsKKworCWRzaSA9IGRwLT5oZWFkZXIuZnJlZWxpc3Q7CS8qIGZpcnN0ICh3aG9sZSBwYWdlKSBmcmVlIHNsb3QgKi8KKwlzZnNpID0gc3AtPmhlYWRlci5mcmVlbGlzdDsKKworCS8qIGxpbmVsb2NrIGRlc3RpbmF0aW9uIGVudHJ5IHNsb3QgKi8KKwlkbHYgPSAmIGRkdGxjay0+bHZbZGR0bGNrLT5pbmRleF07CisJZGx2LT5vZmZzZXQgPSBkc2k7CisKKwkvKiBsaW5lbG9jayBzb3VyY2UgZW50cnkgc2xvdCAqLworCXNsdiA9ICYgc2R0bGNrLT5sdltzZHRsY2stPmluZGV4XTsKKwlzbHYtPm9mZnNldCA9IHNzdGJsW3NpXTsKKwl4c3NpID0gc2x2LT5vZmZzZXQgLSAxOworCisJLyoKKwkgKiBtb3ZlIGVudHJpZXMKKwkgKi8KKwlucyA9IG5kID0gMDsKKwlmb3IgKGRpID0gMDsgc2kgPCBzcC0+aGVhZGVyLm5leHRpbmRleDsgc2krKywgZGkrKykgeworCQlzc2kgPSBzc3RibFtzaV07CisJCWRzdGJsW2RpXSA9IGRzaTsKKworCQkvKiBpcyBuZXh0IHNsb3QgY29udGlndW91cyA/ICovCisJCWlmIChzc2kgIT0geHNzaSArIDEpIHsKKwkJCS8qIGNsb3NlIGN1cnJlbnQgbGluZWxvY2sgKi8KKwkJCXNsdi0+bGVuZ3RoID0gbnM7CisJCQlzZHRsY2stPmluZGV4Kys7CisKKwkJCS8qIG9wZW4gbmV3IGxpbmVsb2NrICovCisJCQlpZiAoc2R0bGNrLT5pbmRleCA8IHNkdGxjay0+bWF4Y250KQorCQkJCXNsdisrOworCQkJZWxzZSB7CisJCQkJc2R0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopIHR4TGluZWxvY2soc2R0bGNrKTsKKwkJCQlzbHYgPSAmIHNkdGxjay0+bHZbMF07CisJCQl9CisKKwkJCXNsdi0+b2Zmc2V0ID0gc3NpOworCQkJbnMgPSAwOworCQl9CisKKwkJLyoKKwkJICogbW92ZSBoZWFkL29ubHkgc2VnbWVudCBvZiBhbiBlbnRyeQorCQkgKi8KKwkJLyogZ2V0IGRzdCBzbG90ICovCisJCWggPSBkID0gJmRwLT5zbG90W2RzaV07CisKKwkJLyogZ2V0IHNyYyBzbG90IGFuZCBtb3ZlICovCisJCXMgPSAmc3AtPnNsb3Rbc3NpXTsKKwkJaWYgKHNwLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpIHsKKwkJCS8qIGdldCBzb3VyY2UgZW50cnkgKi8KKwkJCXNsaCA9IChzdHJ1Y3QgbGR0ZW50cnkgKikgczsKKwkJCWRsaCA9IChzdHJ1Y3QgbGR0ZW50cnkgKikgaDsKKwkJCXNuYW1sZW4gPSBzbGgtPm5hbWxlbjsKKworCQkJaWYgKGRvX2luZGV4KSB7CisJCQkJbGVuID0gbWluKHNuYW1sZW4sIERUTEhEUkRBVEFMRU4pOworCQkJCWRsaC0+aW5kZXggPSBzbGgtPmluZGV4OyAvKiBsaXR0bGUtZW5kaWFuICovCisJCQl9IGVsc2UKKwkJCQlsZW4gPSBtaW4oc25hbWxlbiwgRFRMSERSREFUQUxFTl9MRUdBQ1kpOworCisJCQltZW1jcHkoZGxoLCBzbGgsIDYgKyBsZW4gKiAyKTsKKworCQkJbmV4dCA9IHNsaC0+bmV4dDsKKworCQkJLyogdXBkYXRlIGRzdCBoZWFkL29ubHkgc2VnbWVudCBuZXh0IGZpZWxkICovCisJCQlkc2krKzsKKwkJCWRsaC0+bmV4dCA9IGRzaTsKKwkJfSBlbHNlIHsKKwkJCXNpaCA9IChzdHJ1Y3QgaWR0ZW50cnkgKikgczsKKwkJCXNuYW1sZW4gPSBzaWgtPm5hbWxlbjsKKworCQkJbGVuID0gbWluKHNuYW1sZW4sIERUSUhEUkRBVEFMRU4pOworCQkJZGloID0gKHN0cnVjdCBpZHRlbnRyeSAqKSBoOworCQkJbWVtY3B5KGRpaCwgc2loLCAxMCArIGxlbiAqIDIpOworCQkJbmV4dCA9IHNpaC0+bmV4dDsKKworCQkJZHNpKys7CisJCQlkaWgtPm5leHQgPSBkc2k7CisJCX0KKworCQkvKiBmcmVlIHNyYyBoZWFkL29ubHkgc2VnbWVudCAqLworCQlzLT5uZXh0ID0gc2ZzaTsKKwkJcy0+Y250ID0gMTsKKwkJc2ZzaSA9IHNzaTsKKworCQlucysrOworCQluZCsrOworCQl4c3NpID0gc3NpOworCisJCS8qCisJCSAqIG1vdmUgYWRkaXRpb25hbCBzZWdtZW50KHMpIG9mIHRoZSBlbnRyeQorCQkgKi8KKwkJc25hbWxlbiAtPSBsZW47CisJCXdoaWxlICgoc3NpID0gbmV4dCkgPj0gMCkgeworCQkJLyogaXMgbmV4dCBzbG90IGNvbnRpZ3VvdXMgPyAqLworCQkJaWYgKHNzaSAhPSB4c3NpICsgMSkgeworCQkJCS8qIGNsb3NlIGN1cnJlbnQgbGluZWxvY2sgKi8KKwkJCQlzbHYtPmxlbmd0aCA9IG5zOworCQkJCXNkdGxjay0+aW5kZXgrKzsKKworCQkJCS8qIG9wZW4gbmV3IGxpbmVsb2NrICovCisJCQkJaWYgKHNkdGxjay0+aW5kZXggPCBzZHRsY2stPm1heGNudCkKKwkJCQkJc2x2Kys7CisJCQkJZWxzZSB7CisJCQkJCXNkdGxjayA9CisJCQkJCSAgICAoc3RydWN0IGR0X2xvY2sgKikKKwkJCQkJICAgIHR4TGluZWxvY2soc2R0bGNrKTsKKwkJCQkJc2x2ID0gJiBzZHRsY2stPmx2WzBdOworCQkJCX0KKworCQkJCXNsdi0+b2Zmc2V0ID0gc3NpOworCQkJCW5zID0gMDsKKwkJCX0KKworCQkJLyogZ2V0IG5leHQgc291cmNlIHNlZ21lbnQgKi8KKwkJCXMgPSAmc3AtPnNsb3Rbc3NpXTsKKworCQkJLyogZ2V0IG5leHQgZGVzdGluYXRpb24gZnJlZSBzbG90ICovCisJCQlkKys7CisKKwkJCWxlbiA9IG1pbihzbmFtbGVuLCBEVFNMT1REQVRBTEVOKTsKKwkJCVVuaVN0cm5jcHlfbGUoZC0+bmFtZSwgcy0+bmFtZSwgbGVuKTsKKworCQkJbnMrKzsKKwkJCW5kKys7CisJCQl4c3NpID0gc3NpOworCisJCQlkc2krKzsKKwkJCWQtPm5leHQgPSBkc2k7CisKKwkJCS8qIGZyZWUgc291cmNlIHNlZ21lbnQgKi8KKwkJCW5leHQgPSBzLT5uZXh0OworCQkJcy0+bmV4dCA9IHNmc2k7CisJCQlzLT5jbnQgPSAxOworCQkJc2ZzaSA9IHNzaTsKKworCQkJc25hbWxlbiAtPSBsZW47CisJCX0JCS8qIGVuZCB3aGlsZSAqLworCisJCS8qIHRlcm1pbmF0ZSBkc3QgbGFzdC9vbmx5IHNlZ21lbnQgKi8KKwkJaWYgKGggPT0gZCkgeworCQkJLyogc2luZ2xlIHNlZ21lbnQgZW50cnkgKi8KKwkJCWlmIChkcC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKQorCQkJCWRsaC0+bmV4dCA9IC0xOworCQkJZWxzZQorCQkJCWRpaC0+bmV4dCA9IC0xOworCQl9IGVsc2UKKwkJCS8qIG11bHRpLXNlZ21lbnQgZW50cnkgKi8KKwkJCWQtPm5leHQgPSAtMTsKKwl9CQkJLyogZW5kIGZvciAqLworCisJLyogY2xvc2UgY3VycmVudCBsaW5lbG9jayAqLworCXNsdi0+bGVuZ3RoID0gbnM7CisJc2R0bGNrLT5pbmRleCsrOworCSpzZHRsb2NrID0gc2R0bGNrOworCisJZGx2LT5sZW5ndGggPSBuZDsKKwlkZHRsY2stPmluZGV4Kys7CisJKmRkdGxvY2sgPSBkZHRsY2s7CisKKwkvKiB1cGRhdGUgc291cmNlIGhlYWRlciAqLworCXNwLT5oZWFkZXIuZnJlZWxpc3QgPSBzZnNpOworCXNwLT5oZWFkZXIuZnJlZWNudCArPSBuZDsKKworCS8qIHVwZGF0ZSBkZXN0aW5hdGlvbiBoZWFkZXIgKi8KKwlkcC0+aGVhZGVyLm5leHRpbmRleCA9IGRpOworCisJZHAtPmhlYWRlci5mcmVlbGlzdCA9IGRzaTsKKwlkcC0+aGVhZGVyLmZyZWVjbnQgLT0gbmQ7Cit9CisKKworLyoKKyAqCWR0RGVsZXRlRW50cnkoKQorICoKKyAqIGZ1bmN0aW9uOiBmcmVlIGEgKGxlYWYvaW50ZXJuYWwpIGVudHJ5CisgKgorICogbG9nIGZyZWVsaXN0IGhlYWRlciwgc3RibCwgYW5kIGVhY2ggc2VnbWVudCBzbG90IG9mIGVudHJ5CisgKiAoZXZlbiB0aG91Z2ggbGFzdC9vbmx5IHNlZ21lbnQgbmV4dCBmaWVsZCBpcyBtb2RpZmllZCwKKyAqIHBoeXNpY2FsIGltYWdlIGxvZ2dpbmcgcmVxdWlyZXMgYWxsIHNlZ21lbnQgc2xvdHMgb2YKKyAqIHRoZSBlbnRyeSBsb2dnZWQgdG8gYXZvaWQgYXBwbHlpbmcgcHJldmlvdXMgdXBkYXRlcworICogdG8gdGhlIHNhbWUgc2xvdHMpCisgKi8KK3N0YXRpYyB2b2lkIGR0RGVsZXRlRW50cnkoZHRwYWdlX3QgKiBwLCBpbnQgZmksIHN0cnVjdCBkdF9sb2NrICoqIGR0bG9jaykKK3sKKwlpbnQgZnNpOwkJLyogZnJlZSBlbnRyeSBzbG90IGluZGV4ICovCisJczggKnN0Ymw7CisJc3RydWN0IGR0c2xvdCAqdDsKKwlpbnQgc2ksIGZyZWVjbnQ7CisJc3RydWN0IGR0X2xvY2sgKmR0bGNrID0gKmR0bG9jazsKKwlzdHJ1Y3QgbHYgKmx2OworCWludCB4c2ksIG47CisKKwkvKiBnZXQgZnJlZSBlbnRyeSBzbG90IGluZGV4ICovCisJc3RibCA9IERUX0dFVFNUQkwocCk7CisJZnNpID0gc3RibFtmaV07CisKKwkvKiBvcGVuIG5ldyBsaW5lbG9jayAqLworCWlmIChkdGxjay0+aW5kZXggPj0gZHRsY2stPm1heGNudCkKKwkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgdHhMaW5lbG9jayhkdGxjayk7CisJbHYgPSAmIGR0bGNrLT5sdltkdGxjay0+aW5kZXhdOworCisJbHYtPm9mZnNldCA9IGZzaTsKKworCS8qIGdldCB0aGUgaGVhZC9vbmx5IHNlZ21lbnQgKi8KKwl0ID0gJnAtPnNsb3RbZnNpXTsKKwlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKQorCQlzaSA9ICgoc3RydWN0IGxkdGVudHJ5ICopIHQpLT5uZXh0OworCWVsc2UKKwkJc2kgPSAoKHN0cnVjdCBpZHRlbnRyeSAqKSB0KS0+bmV4dDsKKwl0LT5uZXh0ID0gc2k7CisJdC0+Y250ID0gMTsKKworCW4gPSBmcmVlY250ID0gMTsKKwl4c2kgPSBmc2k7CisKKwkvKiBmaW5kIHRoZSBsYXN0L29ubHkgc2VnbWVudCAqLworCXdoaWxlIChzaSA+PSAwKSB7CisJCS8qIGlzIG5leHQgc2xvdCBjb250aWd1b3VzID8gKi8KKwkJaWYgKHNpICE9IHhzaSArIDEpIHsKKwkJCS8qIGNsb3NlIGN1cnJlbnQgbGluZWxvY2sgKi8KKwkJCWx2LT5sZW5ndGggPSBuOworCQkJZHRsY2stPmluZGV4Kys7CisKKwkJCS8qIG9wZW4gbmV3IGxpbmVsb2NrICovCisJCQlpZiAoZHRsY2stPmluZGV4IDwgZHRsY2stPm1heGNudCkKKwkJCQlsdisrOworCQkJZWxzZSB7CisJCQkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgdHhMaW5lbG9jayhkdGxjayk7CisJCQkJbHYgPSAmIGR0bGNrLT5sdlswXTsKKwkJCX0KKworCQkJbHYtPm9mZnNldCA9IHNpOworCQkJbiA9IDA7CisJCX0KKworCQluKys7CisJCXhzaSA9IHNpOworCQlmcmVlY250Kys7CisKKwkJdCA9ICZwLT5zbG90W3NpXTsKKwkJdC0+Y250ID0gMTsKKwkJc2kgPSB0LT5uZXh0OworCX0KKworCS8qIGNsb3NlIGN1cnJlbnQgbGluZWxvY2sgKi8KKwlsdi0+bGVuZ3RoID0gbjsKKwlkdGxjay0+aW5kZXgrKzsKKworCSpkdGxvY2sgPSBkdGxjazsKKworCS8qIHVwZGF0ZSBmcmVlbGlzdCAqLworCXQtPm5leHQgPSBwLT5oZWFkZXIuZnJlZWxpc3Q7CisJcC0+aGVhZGVyLmZyZWVsaXN0ID0gZnNpOworCXAtPmhlYWRlci5mcmVlY250ICs9IGZyZWVjbnQ7CisKKwkvKiBpZiBkZWxldGUgZnJvbSBtaWRkbGUsCisJICogc2hpZnQgbGVmdCB0aGUgc3VjY2VkZGluZyBlbnRyaWVzIGluIHRoZSBzdGJsCisJICovCisJc2kgPSBwLT5oZWFkZXIubmV4dGluZGV4OworCWlmIChmaSA8IHNpIC0gMSkKKwkJbWVtbW92ZSgmc3RibFtmaV0sICZzdGJsW2ZpICsgMV0sIHNpIC0gZmkgLSAxKTsKKworCXAtPmhlYWRlci5uZXh0aW5kZXgtLTsKK30KKworCisvKgorICoJZHRUcnVuY2F0ZUVudHJ5KCkKKyAqCisgKiBmdW5jdGlvbjogdHJ1bmNhdGUgYSAobGVhZi9pbnRlcm5hbCkgZW50cnkKKyAqCisgKiBsb2cgZnJlZWxpc3QgaGVhZGVyLCBzdGJsLCBhbmQgZWFjaCBzZWdtZW50IHNsb3Qgb2YgZW50cnkKKyAqIChldmVuIHRob3VnaCBsYXN0L29ubHkgc2VnbWVudCBuZXh0IGZpZWxkIGlzIG1vZGlmaWVkLAorICogcGh5c2ljYWwgaW1hZ2UgbG9nZ2luZyByZXF1aXJlcyBhbGwgc2VnbWVudCBzbG90cyBvZgorICogdGhlIGVudHJ5IGxvZ2dlZCB0byBhdm9pZCBhcHBseWluZyBwcmV2aW91cyB1cGRhdGVzCisgKiB0byB0aGUgc2FtZSBzbG90cykKKyAqLworc3RhdGljIHZvaWQgZHRUcnVuY2F0ZUVudHJ5KGR0cGFnZV90ICogcCwgaW50IHRpLCBzdHJ1Y3QgZHRfbG9jayAqKiBkdGxvY2spCit7CisJaW50IHRzaTsJCS8qIHRydW5jYXRlIGVudHJ5IHNsb3QgaW5kZXggKi8KKwlzOCAqc3RibDsKKwlzdHJ1Y3QgZHRzbG90ICp0OworCWludCBzaSwgZnJlZWNudDsKKwlzdHJ1Y3QgZHRfbG9jayAqZHRsY2sgPSAqZHRsb2NrOworCXN0cnVjdCBsdiAqbHY7CisJaW50IGZzaSwgeHNpLCBuOworCisJLyogZ2V0IGZyZWUgZW50cnkgc2xvdCBpbmRleCAqLworCXN0YmwgPSBEVF9HRVRTVEJMKHApOworCXRzaSA9IHN0YmxbdGldOworCisJLyogb3BlbiBuZXcgbGluZWxvY2sgKi8KKwlpZiAoZHRsY2stPmluZGV4ID49IGR0bGNrLT5tYXhjbnQpCisJCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopIHR4TGluZWxvY2soZHRsY2spOworCWx2ID0gJiBkdGxjay0+bHZbZHRsY2stPmluZGV4XTsKKworCWx2LT5vZmZzZXQgPSB0c2k7CisKKwkvKiBnZXQgdGhlIGhlYWQvb25seSBzZWdtZW50ICovCisJdCA9ICZwLT5zbG90W3RzaV07CisJQVNTRVJUKHAtPmhlYWRlci5mbGFnICYgQlRfSU5URVJOQUwpOworCSgoc3RydWN0IGlkdGVudHJ5ICopIHQpLT5uYW1sZW4gPSAwOworCXNpID0gKChzdHJ1Y3QgaWR0ZW50cnkgKikgdCktPm5leHQ7CisJKChzdHJ1Y3QgaWR0ZW50cnkgKikgdCktPm5leHQgPSAtMTsKKworCW4gPSAxOworCWZyZWVjbnQgPSAwOworCWZzaSA9IHNpOworCXhzaSA9IHRzaTsKKworCS8qIGZpbmQgdGhlIGxhc3Qvb25seSBzZWdtZW50ICovCisJd2hpbGUgKHNpID49IDApIHsKKwkJLyogaXMgbmV4dCBzbG90IGNvbnRpZ3VvdXMgPyAqLworCQlpZiAoc2kgIT0geHNpICsgMSkgeworCQkJLyogY2xvc2UgY3VycmVudCBsaW5lbG9jayAqLworCQkJbHYtPmxlbmd0aCA9IG47CisJCQlkdGxjay0+aW5kZXgrKzsKKworCQkJLyogb3BlbiBuZXcgbGluZWxvY2sgKi8KKwkJCWlmIChkdGxjay0+aW5kZXggPCBkdGxjay0+bWF4Y250KQorCQkJCWx2Kys7CisJCQllbHNlIHsKKwkJCQlkdGxjayA9IChzdHJ1Y3QgZHRfbG9jayAqKSB0eExpbmVsb2NrKGR0bGNrKTsKKwkJCQlsdiA9ICYgZHRsY2stPmx2WzBdOworCQkJfQorCisJCQlsdi0+b2Zmc2V0ID0gc2k7CisJCQluID0gMDsKKwkJfQorCisJCW4rKzsKKwkJeHNpID0gc2k7CisJCWZyZWVjbnQrKzsKKworCQl0ID0gJnAtPnNsb3Rbc2ldOworCQl0LT5jbnQgPSAxOworCQlzaSA9IHQtPm5leHQ7CisJfQorCisJLyogY2xvc2UgY3VycmVudCBsaW5lbG9jayAqLworCWx2LT5sZW5ndGggPSBuOworCWR0bGNrLT5pbmRleCsrOworCisJKmR0bG9jayA9IGR0bGNrOworCisJLyogdXBkYXRlIGZyZWVsaXN0ICovCisJaWYgKGZyZWVjbnQgPT0gMCkKKwkJcmV0dXJuOworCXQtPm5leHQgPSBwLT5oZWFkZXIuZnJlZWxpc3Q7CisJcC0+aGVhZGVyLmZyZWVsaXN0ID0gZnNpOworCXAtPmhlYWRlci5mcmVlY250ICs9IGZyZWVjbnQ7Cit9CisKKworLyoKKyAqCWR0TGluZWxvY2tGcmVlbGlzdCgpCisgKi8KK3N0YXRpYyB2b2lkIGR0TGluZWxvY2tGcmVlbGlzdChkdHBhZ2VfdCAqIHAsCS8qIGRpcmVjdG9yeSBwYWdlICovCisJCQkgICAgICAgaW50IG0sCS8qIG1heCBzbG90IGluZGV4ICovCisJCQkgICAgICAgc3RydWN0IGR0X2xvY2sgKiogZHRsb2NrKQoreworCWludCBmc2k7CQkvKiBmcmVlIGVudHJ5IHNsb3QgaW5kZXggKi8KKwlzdHJ1Y3QgZHRzbG90ICp0OworCWludCBzaTsKKwlzdHJ1Y3QgZHRfbG9jayAqZHRsY2sgPSAqZHRsb2NrOworCXN0cnVjdCBsdiAqbHY7CisJaW50IHhzaSwgbjsKKworCS8qIGdldCBmcmVlIGVudHJ5IHNsb3QgaW5kZXggKi8KKwlmc2kgPSBwLT5oZWFkZXIuZnJlZWxpc3Q7CisKKwkvKiBvcGVuIG5ldyBsaW5lbG9jayAqLworCWlmIChkdGxjay0+aW5kZXggPj0gZHRsY2stPm1heGNudCkKKwkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgdHhMaW5lbG9jayhkdGxjayk7CisJbHYgPSAmIGR0bGNrLT5sdltkdGxjay0+aW5kZXhdOworCisJbHYtPm9mZnNldCA9IGZzaTsKKworCW4gPSAxOworCXhzaSA9IGZzaTsKKworCXQgPSAmcC0+c2xvdFtmc2ldOworCXNpID0gdC0+bmV4dDsKKworCS8qIGZpbmQgdGhlIGxhc3Qvb25seSBzZWdtZW50ICovCisJd2hpbGUgKHNpIDwgbSAmJiBzaSA+PSAwKSB7CisJCS8qIGlzIG5leHQgc2xvdCBjb250aWd1b3VzID8gKi8KKwkJaWYgKHNpICE9IHhzaSArIDEpIHsKKwkJCS8qIGNsb3NlIGN1cnJlbnQgbGluZWxvY2sgKi8KKwkJCWx2LT5sZW5ndGggPSBuOworCQkJZHRsY2stPmluZGV4Kys7CisKKwkJCS8qIG9wZW4gbmV3IGxpbmVsb2NrICovCisJCQlpZiAoZHRsY2stPmluZGV4IDwgZHRsY2stPm1heGNudCkKKwkJCQlsdisrOworCQkJZWxzZSB7CisJCQkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgdHhMaW5lbG9jayhkdGxjayk7CisJCQkJbHYgPSAmIGR0bGNrLT5sdlswXTsKKwkJCX0KKworCQkJbHYtPm9mZnNldCA9IHNpOworCQkJbiA9IDA7CisJCX0KKworCQluKys7CisJCXhzaSA9IHNpOworCisJCXQgPSAmcC0+c2xvdFtzaV07CisJCXNpID0gdC0+bmV4dDsKKwl9CisKKwkvKiBjbG9zZSBjdXJyZW50IGxpbmVsb2NrICovCisJbHYtPmxlbmd0aCA9IG47CisJZHRsY2stPmluZGV4Kys7CisKKwkqZHRsb2NrID0gZHRsY2s7Cit9CisKKworLyoKKyAqIE5BTUU6IGR0TW9kaWZ5CisgKgorICogRlVOQ1RJT046IE1vZGlmeSB0aGUgaW5vZGUgbnVtYmVyIHBhcnQgb2YgYSBkaXJlY3RvcnkgZW50cnkKKyAqCisgKiBQQVJBTUVURVJTOgorICoJdGlkCS0gVHJhbnNhY3Rpb24gaWQKKyAqCWlwCS0gSW5vZGUgb2YgcGFyZW50IGRpcmVjdG9yeQorICoJa2V5CS0gTmFtZSBvZiBlbnRyeSB0byBiZSBtb2RpZmllZAorICoJb3JpZ19pbm8JLSBPcmlnaW5hbCBpbm9kZSBudW1iZXIgZXhwZWN0ZWQgaW4gZW50cnkKKyAqCW5ld19pbm8JLSBOZXcgaW5vZGUgbnVtYmVyIHRvIHB1dCBpbnRvIGVudHJ5CisgKglmbGFnCS0gSkZTX1JFTkFNRQorICoKKyAqIFJFVFVSTlM6CisgKgktRVNUQUxFCS0gSWYgZW50cnkgZm91bmQgZG9lcyBub3QgbWF0Y2ggb3JpZ19pbm8gcGFzc2VkIGluCisgKgktRU5PRU5UCS0gSWYgbm8gZW50cnkgY2FuIGJlIGZvdW5kIHRvIG1hdGNoIGtleQorICoJMAktIElmIHN1Y2Nlc3NmdWxseSBtb2RpZmllZCBlbnRyeQorICovCitpbnQgZHRNb2RpZnkodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLAorCSBzdHJ1Y3QgY29tcG9uZW50X25hbWUgKiBrZXksIGlub190ICogb3JpZ19pbm8sIGlub190IG5ld19pbm8sIGludCBmbGFnKQoreworCWludCByYzsKKwlzNjQgYm47CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwlkdHBhZ2VfdCAqcDsKKwlpbnQgaW5kZXg7CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJc3RydWN0IGR0X2xvY2sgKmR0bGNrOworCXN0cnVjdCBsdiAqbHY7CisJczggKnN0Ymw7CisJaW50IGVudHJ5X3NpOwkJLyogZW50cnkgc2xvdCBpbmRleCAqLworCXN0cnVjdCBsZHRlbnRyeSAqZW50cnk7CisKKwkvKgorCSAqICAgICAgc2VhcmNoIGZvciB0aGUgZW50cnkgdG8gbW9kaWZ5OgorCSAqCisJICogZHRTZWFyY2goKSByZXR1cm5zIChsZWFmIHBhZ2UgcGlubmVkLCBpbmRleCBhdCB3aGljaCB0byBtb2RpZnkpLgorCSAqLworCWlmICgocmMgPSBkdFNlYXJjaChpcCwga2V5LCBvcmlnX2lubywgJmJ0c3RhY2ssIGZsYWcpKSkKKwkJcmV0dXJuIHJjOworCisJLyogcmV0cmlldmUgc2VhcmNoIHJlc3VsdCAqLworCURUX0dFVFNFQVJDSChpcCwgYnRzdGFjay50b3AsIGJuLCBtcCwgcCwgaW5kZXgpOworCisJQlRfTUFSS19ESVJUWShtcCwgaXApOworCS8qCisJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIGxlYWYgcGFnZSBvZiBuYW1lZCBlbnRyeQorCSAqLworCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tEVFJFRSB8IHRsY2tFTlRSWSk7CisJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCisJLyogZ2V0IHNsb3QgaW5kZXggb2YgdGhlIGVudHJ5ICovCisJc3RibCA9IERUX0dFVFNUQkwocCk7CisJZW50cnlfc2kgPSBzdGJsW2luZGV4XTsKKworCS8qIGxpbmVsb2NrIGVudHJ5ICovCisJQVNTRVJUKGR0bGNrLT5pbmRleCA9PSAwKTsKKwlsdiA9ICYgZHRsY2stPmx2WzBdOworCWx2LT5vZmZzZXQgPSBlbnRyeV9zaTsKKwlsdi0+bGVuZ3RoID0gMTsKKwlkdGxjay0+aW5kZXgrKzsKKworCS8qIGdldCB0aGUgaGVhZC9vbmx5IHNlZ21lbnQgKi8KKwllbnRyeSA9IChzdHJ1Y3QgbGR0ZW50cnkgKikgJiBwLT5zbG90W2VudHJ5X3NpXTsKKworCS8qIHN1YnN0aXR1dGUgdGhlIGlub2RlIG51bWJlciBvZiB0aGUgZW50cnkgKi8KKwllbnRyeS0+aW51bWJlciA9IGNwdV90b19sZTMyKG5ld19pbm8pOworCisJLyogdW5waW4gdGhlIGxlYWYgcGFnZSAqLworCURUX1BVVFBBR0UobXApOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBfSkZTX0RFQlVHX0RUUkVFCisvKgorICoJZHREaXNwbGF5VHJlZSgpCisgKgorICogZnVuY3Rpb246IHRyYXZlcnNlIGZvcndhcmQKKyAqLworaW50IGR0RGlzcGxheVRyZWUoc3RydWN0IGlub2RlICppcCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwlkdHBhZ2VfdCAqcDsKKwlzNjQgYm4sIHBibjsKKwlpbnQgaW5kZXgsIGxhc3RpbmRleCwgdiwgaDsKKwlweGRfdCAqeGQ7CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsKKwlzdHJ1Y3QgYnRmcmFtZSAqYnRzcDsKKwlzdHJ1Y3QgYnRmcmFtZSAqcGFyZW50OworCXU4ICpzdGJsOworCWludCBwc2l6ZSA9IDI1NjsKKworCXByaW50aygiZGlzcGxheSBCKy10cmVlLlxuIik7CisKKwkvKiBjbGVhciBzdGFjayAqLworCWJ0c3AgPSBidHN0YWNrLnN0YWNrOworCisJLyoKKwkgKiBzdGFydCB3aXRoIHJvb3QKKwkgKgorCSAqIHJvb3QgcmVzaWRlcyBpbiB0aGUgaW5vZGUKKwkgKi8KKwlibiA9IDA7CisJdiA9IGggPSAwOworCisJLyoKKwkgKiBmaXJzdCBhY2Nlc3Mgb2YgZWFjaCBwYWdlOgorCSAqLworICAgICAgbmV3UGFnZToKKwlEVF9HRVRQQUdFKGlwLCBibiwgbXAsIHBzaXplLCBwLCByYyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiBwcm9jZXNzIGVudHJpZXMgZm9yd2FyZCBmcm9tIGZpcnN0IGluZGV4ICovCisJaW5kZXggPSAwOworCWxhc3RpbmRleCA9IHAtPmhlYWRlci5uZXh0aW5kZXggLSAxOworCisJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfSU5URVJOQUwpIHsKKwkJLyoKKwkJICogZmlyc3QgYWNjZXNzIG9mIGVhY2ggaW50ZXJuYWwgcGFnZQorCQkgKi8KKwkJcHJpbnRmKCJpbnRlcm5hbCBwYWdlICIpOworCQlkdERpc3BsYXlQYWdlKGlwLCBibiwgcCk7CisKKwkJZ290byBnZXRDaGlsZDsKKwl9IGVsc2UgewkJLyogKHAtPmhlYWRlci5mbGFnICYgQlRfTEVBRikgKi8KKworCQkvKgorCQkgKiBmaXJzdCBhY2Nlc3Mgb2YgZWFjaCBsZWFmIHBhZ2UKKwkJICovCisJCXByaW50ZigibGVhZiBwYWdlICIpOworCQlkdERpc3BsYXlQYWdlKGlwLCBibiwgcCk7CisKKwkJLyoKKwkJICogcHJvY2VzcyBsZWFmIHBhZ2UgZW50cmllcworCQkgKgorCQkgZm9yICggOyBpbmRleCA8PSBsYXN0aW5kZXg7IGluZGV4KyspCisJCSB7CisJCSB9CisJCSAqLworCisJCS8qIHVucGluIHRoZSBsZWFmIHBhZ2UgKi8KKwkJRFRfUFVUUEFHRShtcCk7CisJfQorCisJLyoKKwkgKiBnbyBiYWNrIHVwIHRvIHRoZSBwYXJlbnQgcGFnZQorCSAqLworICAgICAgZ2V0UGFyZW50OgorCS8qIHBvcC9yZXN0b3JlIHBhcmVudCBlbnRyeSBmb3IgdGhlIGN1cnJlbnQgY2hpbGQgcGFnZSAqLworCWlmICgocGFyZW50ID0gKGJ0c3AgPT0gYnRzdGFjay5zdGFjayA/IE5VTEwgOiAtLWJ0c3ApKSA9PSBOVUxMKQorCQkvKiBjdXJyZW50IHBhZ2UgbXVzdCBoYXZlIGJlZW4gcm9vdCAqLworCQlyZXR1cm47CisKKwkvKgorCSAqIHBhcmVudCBwYWdlIHNjYW4gY29tcGxldGVkCisJICovCisJaWYgKChpbmRleCA9IHBhcmVudC0+aW5kZXgpID09IChsYXN0aW5kZXggPSBwYXJlbnQtPmxhc3RpbmRleCkpIHsKKwkJLyogZ28gYmFjayB1cCB0byB0aGUgcGFyZW50IHBhZ2UgKi8KKwkJZ290byBnZXRQYXJlbnQ7CisJfQorCisJLyoKKwkgKiBwYXJlbnQgcGFnZSBoYXMgZW50cmllcyByZW1haW5pbmcKKwkgKi8KKwkvKiBnZXQgYmFjayB0aGUgcGFyZW50IHBhZ2UgKi8KKwlibiA9IHBhcmVudC0+Ym47CisJLyogdiA9IHBhcmVudC0+bGV2ZWw7ICovCisJRFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogZ2V0IG5leHQgcGFyZW50IGVudHJ5ICovCisJaW5kZXgrKzsKKworCS8qCisJICogaW50ZXJuYWwgcGFnZTogZ28gZG93biB0byBjaGlsZCBwYWdlIG9mIGN1cnJlbnQgZW50cnkKKwkgKi8KKyAgICAgIGdldENoaWxkOgorCS8qIHB1c2gvc2F2ZSBjdXJyZW50IHBhcmVudCBlbnRyeSBmb3IgdGhlIGNoaWxkIHBhZ2UgKi8KKwlidHNwLT5ibiA9IHBibiA9IGJuOworCWJ0c3AtPmluZGV4ID0gaW5kZXg7CisJYnRzcC0+bGFzdGluZGV4ID0gbGFzdGluZGV4OworCS8qIGJ0c3AtPmxldmVsID0gdjsgKi8KKwkvKiBidHNwLT5ub2RlID0gaDsgKi8KKwkrK2J0c3A7CisKKwkvKiBnZXQgY3VycmVudCBlbnRyeSBmb3IgdGhlIGNoaWxkIHBhZ2UgKi8KKwlzdGJsID0gRFRfR0VUU1RCTChwKTsKKwl4ZCA9IChweGRfdCAqKSAmIHAtPnNsb3Rbc3RibFtpbmRleF1dOworCisJLyoKKwkgKiBmaXJzdCBhY2Nlc3Mgb2YgZWFjaCBpbnRlcm5hbCBlbnRyeToKKwkgKi8KKworCS8qIGdldCBjaGlsZCBwYWdlICovCisJYm4gPSBhZGRyZXNzUFhEKHhkKTsKKwlwc2l6ZSA9IGxlbmd0aFBYRCh4ZCkgPDwgaXAtPmlfaXBtbnQtPmlfbDJic2l6ZTsKKworCXByaW50aygidHJhdmVyc2UgZG93biAweCVMeFslZF0tPjB4JUx4XG4iLCBwYm4sIGluZGV4LCBibik7CisJdisrOworCWggPSBpbmRleDsKKworCS8qIHJlbGVhc2UgcGFyZW50IHBhZ2UgKi8KKwlEVF9QVVRQQUdFKG1wKTsKKworCS8qIHByb2Nlc3MgdGhlIGNoaWxkIHBhZ2UgKi8KKwlnb3RvIG5ld1BhZ2U7Cit9CisKKworLyoKKyAqCWR0RGlzcGxheVBhZ2UoKQorICoKKyAqIGZ1bmN0aW9uOiBkaXNwbGF5IHBhZ2UKKyAqLworaW50IGR0RGlzcGxheVBhZ2Uoc3RydWN0IGlub2RlICppcCwgczY0IGJuLCBkdHBhZ2VfdCAqIHApCit7CisJaW50IHJjOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJc3RydWN0IGxkdGVudHJ5ICpsaDsKKwlzdHJ1Y3QgaWR0ZW50cnkgKmloOworCXB4ZF90ICp4ZDsKKwlpbnQgaSwgajsKKwl1OCAqc3RibDsKKwl3Y2hhcl90IG5hbWVbSkZTX05BTUVfTUFYICsgMV07CisJc3RydWN0IGNvbXBvbmVudF9uYW1lIGtleSA9IHsgMCwgbmFtZSB9OworCWludCBmcmVlcGFnZSA9IDA7CisKKwlpZiAocCA9PSBOVUxMKSB7CisJCWZyZWVwYWdlID0gMTsKKwkJRFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCisJLyogZGlzcGxheSBwYWdlIGNvbnRyb2wgKi8KKwlwcmludGsoImJuOjB4JUx4IGZsYWc6MHglMDh4IG5leHRpbmRleDolZFxuIiwKKwkgICAgICAgYm4sIHAtPmhlYWRlci5mbGFnLCBwLT5oZWFkZXIubmV4dGluZGV4KTsKKworCS8qIGRpc3BsYXkgZW50cmllcyAqLworCXN0YmwgPSBEVF9HRVRTVEJMKHApOworCWZvciAoaSA9IDAsIGogPSAxOyBpIDwgcC0+aGVhZGVyLm5leHRpbmRleDsgaSsrLCBqKyspIHsKKwkJZHRHZXRLZXkocCwgaSwgJmtleSwgSkZTX1NCSShpcC0+aV9zYiktPm1udGZsYWcpOworCQlrZXkubmFtZVtrZXkubmFtbGVuXSA9ICdcMCc7CisJCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpIHsKKwkJCWxoID0gKHN0cnVjdCBsZHRlbnRyeSAqKSAmIHAtPnNsb3Rbc3RibFtpXV07CisJCQlwcmludGYoIlx0WyVkXSAlczolZCIsIGksIGtleS5uYW1lLAorCQkJICAgICAgIGxlMzJfdG9fY3B1KGxoLT5pbnVtYmVyKSk7CisJCX0gZWxzZSB7CisJCQlpaCA9IChzdHJ1Y3QgaWR0ZW50cnkgKikgJiBwLT5zbG90W3N0YmxbaV1dOworCQkJeGQgPSAocHhkX3QgKikgaWg7CisJCQlibiA9IGFkZHJlc3NQWEQoeGQpOworCQkJcHJpbnRmKCJcdFslZF0gJXM6MHglTHgiLCBpLCBrZXkubmFtZSwgYm4pOworCQl9CisKKwkJaWYgKGogPT0gNCkgeworCQkJcHJpbnRmKCJcbiIpOworCQkJaiA9IDA7CisJCX0KKwl9CisKKwlwcmludGYoIlxuIik7CisKKwlpZiAoZnJlZXBhZ2UpCisJCURUX1BVVFBBR0UobXApOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYJCQkJLyogX0pGU19ERUJVR19EVFJFRSAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19kdHJlZS5oIGIvZnMvamZzL2pmc19kdHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3M2E4MDEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX2R0cmVlLmgKQEAgLTAsMCArMSwyNzkgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDAyCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYgX0hfSkZTX0RUUkVFCisjZGVmaW5lCV9IX0pGU19EVFJFRQorCisvKgorICoJamZzX2R0cmVlLmg6IGRpcmVjdG9yeSBCKy10cmVlIG1hbmFnZXIKKyAqLworCisjaW5jbHVkZSAiamZzX2J0cmVlLmgiCisKK3R5cGVkZWYgdW5pb24geworCXN0cnVjdCB7CisJCXRpZF90IHRpZDsKKwkJc3RydWN0IGlub2RlICppcDsKKwkJdTMyIGlubzsKKwl9IGxlYWY7CisJcHhkX3QgeGQ7Cit9IGRkYXRhX3Q7CisKKworLyoKKyAqICAgICAgZW50cnkgc2VnbWVudC9zbG90CisgKgorICogYW4gZW50cnkgY29uc2lzdHMgb2YgdHlwZSBkZXBlbmRlbnQgaGVhZC9vbmx5IHNlZ21lbnQvc2xvdCBhbmQKKyAqIGFkZGl0aW9uYWwgc2VnbWVudHMvc2xvdHMgbGlua2VkIHZpIG5leHQgZmllbGQ7CisgKiBOLkIuIGxhc3Qvb25seSBzZWdtZW50IG9mIGVudHJ5IGlzIHRlcm1pbmF0ZWQgYnkgbmV4dCA9IC0xOworICovCisvKgorICoJZGlyZWN0b3J5IHBhZ2Ugc2xvdAorICovCitzdHJ1Y3QgZHRzbG90IHsKKwlzOCBuZXh0OwkJLyogMTogKi8KKwlzOCBjbnQ7CQkJLyogMTogKi8KKwlfX2xlMTYgbmFtZVsxNV07CS8qIDMwOiAqLworfTsJCQkJLyogKDMyKSAqLworCisKKyNkZWZpbmUgREFUQVNMT1RTSVpFCTE2CisjZGVmaW5lIEwyREFUQVNMT1RTSVpFCTQKKyNkZWZpbmUJRFRTTE9UU0laRQkzMgorI2RlZmluZQlMMkRUU0xPVFNJWkUJNQorI2RlZmluZSBEVFNMT1RIRFJTSVpFCTIKKyNkZWZpbmUgRFRTTE9UREFUQVNJWkUJMzAKKyNkZWZpbmUgRFRTTE9UREFUQUxFTgkxNQorCisvKgorICoJIGludGVybmFsIG5vZGUgZW50cnkgaGVhZC9vbmx5IHNlZ21lbnQKKyAqLworc3RydWN0IGlkdGVudHJ5IHsKKwlweGRfdCB4ZDsJCS8qIDg6IGNoaWxkIGV4dGVudCBkZXNjcmlwdG9yICovCisKKwlzOCBuZXh0OwkJLyogMTogKi8KKwl1OCBuYW1sZW47CQkvKiAxOiAqLworCV9fbGUxNiBuYW1lWzExXTsJLyogMjI6IDItYnl0ZSBhbGlnbmVkICovCit9OwkJCQkvKiAoMzIpICovCisKKyNkZWZpbmUgRFRJSERSU0laRQkxMAorI2RlZmluZSBEVElIRFJEQVRBTEVOCTExCisKKy8qIGNvbXB1dGUgbnVtYmVyIG9mIHNsb3RzIGZvciBlbnRyeSAqLworI2RlZmluZQlORFRJTlRFUk5BTChrbGVuKSAoICgoNCArIChrbGVuKSkgKyAoMTUgLSAxKSkgLyAxNSApCisKKworLyoKKyAqCWxlYWYgbm9kZSBlbnRyeSBoZWFkL29ubHkgc2VnbWVudAorICoKKyAqIAlGb3IgbGVnYWN5IGZpbGVzeXN0ZW1zLCBuYW1lIGNvbnRhaW5zIDEzIHdjaGFycyAtLSBubyBpbmRleCBmaWVsZAorICovCitzdHJ1Y3QgbGR0ZW50cnkgeworCV9fbGUzMiBpbnVtYmVyOwkJLyogNDogNC1ieXRlIGFsaWduZWQgKi8KKwlzOCBuZXh0OwkJLyogMTogKi8KKwl1OCBuYW1sZW47CQkvKiAxOiAqLworCV9fbGUxNiBuYW1lWzExXTsJLyogMjI6IDItYnl0ZSBhbGlnbmVkICovCisJX19sZTMyIGluZGV4OwkJLyogNDogaW5kZXggaW50byBkaXJfdGFibGUgKi8KK307CQkJCS8qICgzMikgKi8KKworI2RlZmluZSBEVExIRFJTSVpFCTYKKyNkZWZpbmUgRFRMSERSREFUQUxFTl9MRUdBQ1kJMTMJLyogT2xkIChPUy8yKSBmb3JtYXQgKi8KKyNkZWZpbmUgRFRMSERSREFUQUxFTgkxMQorCisvKgorICogZGlyX3RhYmxlIHVzZWQgZm9yIGRpcmVjdG9yeSB0cmF2ZXJzYWwgZHVyaW5nIHJlYWRkaXIKKyAqLworCisvKgorICogS2VlcCBwZXJzaXN0ZW50IGluZGV4IGZvciBkaXJlY3RvcnkgZW50cmllcworICovCisjZGVmaW5lIERPX0lOREVYKElOT0RFKSAoSkZTX1NCSSgoSU5PREUpLT5pX3NiKS0+bW50ZmxhZyAmIEpGU19ESVJfSU5ERVgpCisKKy8qCisgKiBNYXhpbXVtIGVudHJ5IGluIGlubGluZSBkaXJlY3RvcnkgdGFibGUKKyAqLworI2RlZmluZSBNQVhfSU5MSU5FX0RJUlRBQkxFX0VOVFJZIDEzCisKK3N0cnVjdCBkaXJfdGFibGVfc2xvdCB7CisJdTggcnNydmQ7CQkvKiAxOiAqLworCXU4IGZsYWc7CQkvKiAxOiAwIGlmIGZyZWUgKi8KKwl1OCBzbG90OwkJLyogMTogc2xvdCB3aXRoaW4gbGVhZiBwYWdlIG9mIGVudHJ5ICovCisJdTggYWRkcjE7CQkvKiAxOiB1cHBlciA4IGJpdHMgb2YgbGVhZiBwYWdlIGFkZHJlc3MgKi8KKwlfX2xlMzIgYWRkcjI7CQkvKiA0OiBsb3dlciAzMiBiaXRzIG9mIGxlYWYgcGFnZSBhZGRyZXNzIC1PUi0KKwkJCQkgICBpbmRleCBvZiBuZXh0IGVudHJ5IHdoZW4gdGhpcyBlbnRyeSB3YXMgZGVsZXRlZCAqLworfTsJCQkJLyogKDgpICovCisKKy8qCisgKiBmbGFnIHZhbHVlcworICovCisjZGVmaW5lIERJUl9JTkRFWF9WQUxJRCAxCisjZGVmaW5lIERJUl9JTkRFWF9GUkVFIDAKKworI2RlZmluZSBEVFNhZGRyZXNzKGRpcl90YWJsZV9zbG90LCBhZGRyZXNzNjQpXAore1wKKwkoZGlyX3RhYmxlX3Nsb3QpLT5hZGRyMSA9ICgodTY0KWFkZHJlc3M2NCkgPj4gMzI7XAorCShkaXJfdGFibGVfc2xvdCktPmFkZHIyID0gX19jcHVfdG9fbGUzMigoYWRkcmVzczY0KSAmIDB4ZmZmZmZmZmYpO1wKK30KKworI2RlZmluZSBhZGRyZXNzRFRTKGR0cylcCisJKCAoKHM2NCkoKGR0cyktPmFkZHIxKSkgPDwgMzIgfCBfX2xlMzJfdG9fY3B1KChkdHMpLT5hZGRyMikgKQorCisvKiBjb21wdXRlIG51bWJlciBvZiBzbG90cyBmb3IgZW50cnkgKi8KKyNkZWZpbmUJTkRUTEVBRl9MRUdBQ1koa2xlbikJKCAoKDIgKyAoa2xlbikpICsgKDE1IC0gMSkpIC8gMTUgKQorI2RlZmluZQlORFRMRUFGCU5EVElOVEVSTkFMCisKKworLyoKKyAqCWRpcmVjdG9yeSByb290IHBhZ2UgKGluLWxpbmUgaW4gb24tZGlzayBpbm9kZSk6CisgKgorICogY2YuIGR0cGFnZV90IGJlbG93LgorICovCit0eXBlZGVmIHVuaW9uIHsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgZGFzZCBEQVNEOyAvKiAxNjogREFTRCBsaW1pdC91c2FnZSBpbmZvICovCisKKwkJdTggZmxhZzsJLyogMTogKi8KKwkJdTggbmV4dGluZGV4OwkvKiAxOiBuZXh0IGZyZWUgZW50cnkgaW4gc3RibCAqLworCQlzOCBmcmVlY250OwkvKiAxOiBmcmVlIGNvdW50ICovCisJCXM4IGZyZWVsaXN0OwkvKiAxOiBmcmVlbGlzdCBoZWFkZXIgKi8KKworCQlfX2xlMzIgaWRvdGRvdDsJLyogNDogcGFyZW50IGlub2RlIG51bWJlciAqLworCisJCXM4IHN0YmxbOF07CS8qIDg6IHNvcnRlZCBlbnRyeSBpbmRleCB0YWJsZSAqLworCX0gaGVhZGVyOwkJLyogKDMyKSAqLworCisJc3RydWN0IGR0c2xvdCBzbG90WzldOworfSBkdHJvb3RfdDsKKworI2RlZmluZSBQQVJFTlQoSVApIFwKKwkobGUzMl90b19jcHUoSkZTX0lQKElQKS0+aV9kdHJvb3QuaGVhZGVyLmlkb3Rkb3QpKQorCisjZGVmaW5lIERUUk9PVE1BWFNMT1QJOQorCisjZGVmaW5lCWR0RW1wdHkoSVApIChKRlNfSVAoSVApLT5pX2R0cm9vdC5oZWFkZXIubmV4dGluZGV4ID09IDApCisKKworLyoKKyAqCWRpcmVjdG9yeSByZWd1bGFyIHBhZ2U6CisgKgorICoJZW50cnkgc2xvdCBhcnJheSBvZiAzMiBieXRlIHNsb3QKKyAqCisgKiBzb3J0ZWQgZW50cnkgc2xvdCBpbmRleCB0YWJsZSAoc3RibCk6CisgKiBjb250aWd1b3VzIHNsb3RzIGF0IHNsb3Qgc3BlY2lmaWVkIGJ5IHN0YmxpbmRleCwKKyAqIDEtYnl0ZSBwZXIgZW50cnkKKyAqICAgNTEyIGJ5dGUgYmxvY2s6ICAxNiBlbnRyeSB0YmwgKDEgc2xvdCkKKyAqICAxMDI0IGJ5dGUgYmxvY2s6ICAzMiBlbnRyeSB0YmwgKDEgc2xvdCkKKyAqICAyMDQ4IGJ5dGUgYmxvY2s6ICA2NCBlbnRyeSB0YmwgKDIgc2xvdCkKKyAqICA0MDk2IGJ5dGUgYmxvY2s6IDEyOCBlbnRyeSB0YmwgKDQgc2xvdCkKKyAqCisgKiBkYXRhIGFyZWE6CisgKiAgIDUxMiBieXRlIGJsb2NrOiAgMTYgLSAyID0gIDE0IHNsb3QKKyAqICAxMDI0IGJ5dGUgYmxvY2s6ICAzMiAtIDIgPSAgMzAgc2xvdAorICogIDIwNDggYnl0ZSBibG9jazogIDY0IC0gMyA9ICA2MSBzbG90CisgKiAgNDA5NiBieXRlIGJsb2NrOiAxMjggLSA1ID0gMTIzIHNsb3QKKyAqCisgKiBOLkIuIGluZGV4IGlzIDAtYmFzZWQ7IGluZGV4IGZpZWxkcyByZWZlciB0byBzbG90IGluZGV4CisgKiBleGNlcHQgbmV4dGluZGV4IHdoaWNoIHJlZmVycyB0byBlbnRyeSBpbmRleCBpbiBzdGJsOworICogZW5kIG9mIGVudHJ5IHN0b3QgbGlzdCBvciBmcmVlbGlzdCBpcyBtYXJrZWQgd2l0aCAtMS4KKyAqLwordHlwZWRlZiB1bmlvbiB7CisJc3RydWN0IHsKKwkJX19sZTY0IG5leHQ7CS8qIDg6IG5leHQgc2libGluZyAqLworCQlfX2xlNjQgcHJldjsJLyogODogcHJldmlvdXMgc2libGluZyAqLworCisJCXU4IGZsYWc7CS8qIDE6ICovCisJCXU4IG5leHRpbmRleDsJLyogMTogbmV4dCBlbnRyeSBpbmRleCBpbiBzdGJsICovCisJCXM4IGZyZWVjbnQ7CS8qIDE6ICovCisJCXM4IGZyZWVsaXN0OwkvKiAxOiBzbG90IGluZGV4IG9mIGhlYWQgb2YgZnJlZWxpc3QgKi8KKworCQl1OCBtYXhzbG90OwkvKiAxOiBudW1iZXIgb2Ygc2xvdHMgaW4gcGFnZSBzbG90W10gKi8KKwkJdTggc3RibGluZGV4OwkvKiAxOiBzbG90IGluZGV4IG9mIHN0YXJ0IG9mIHN0YmwgKi8KKwkJdTggcnNydmRbMl07CS8qIDI6ICovCisKKwkJcHhkX3Qgc2VsZjsJLyogODogc2VsZiBweGQgKi8KKwl9IGhlYWRlcjsJCS8qICgzMikgKi8KKworCXN0cnVjdCBkdHNsb3Qgc2xvdFsxMjhdOworfSBkdHBhZ2VfdDsKKworI2RlZmluZSBEVFBBR0VNQVhTTE9UICAgICAgICAxMjgKKworI2RlZmluZSBEVDhUSFBHTk9ERUJZVEVTICAgICA1MTIKKyNkZWZpbmUgRFQ4VEhQR05PREVUU0xPVFMgICAgICAxCisjZGVmaW5lIERUOFRIUEdOT0RFU0xPVFMgICAgICAxNgorCisjZGVmaW5lIERUUVRSUEdOT0RFQllURVMgICAgMTAyNAorI2RlZmluZSBEVFFUUlBHTk9ERVRTTE9UUyAgICAgIDEKKyNkZWZpbmUgRFRRVFJQR05PREVTTE9UUyAgICAgIDMyCisKKyNkZWZpbmUgRFRIQUxGUEdOT0RFQllURVMgICAyMDQ4CisjZGVmaW5lIERUSEFMRlBHTk9ERVRTTE9UUyAgICAgMgorI2RlZmluZSBEVEhBTEZQR05PREVTTE9UUyAgICAgNjQKKworI2RlZmluZSBEVEZVTExQR05PREVCWVRFUyAgIDQwOTYKKyNkZWZpbmUgRFRGVUxMUEdOT0RFVFNMT1RTICAgICA0CisjZGVmaW5lIERURlVMTFBHTk9ERVNMT1RTICAgIDEyOAorCisjZGVmaW5lIERURU5UUllTVEFSVAkxCisKKy8qIGdldCBzb3J0ZWQgZW50cnkgdGFibGUgb2YgdGhlIHBhZ2UgKi8KKyNkZWZpbmUgRFRfR0VUU1RCTChwKSAoICgocCktPmhlYWRlci5mbGFnICYgQlRfUk9PVCkgP1wKKwkoKGR0cm9vdF90ICopKHApKS0+aGVhZGVyLnN0YmwgOiBcCisJKHM4ICopJihwKS0+c2xvdFsocCktPmhlYWRlci5zdGJsaW5kZXhdICkKKworLyoKKyAqIEZsYWdzIGZvciBkdFNlYXJjaAorICovCisjZGVmaW5lIEpGU19DUkVBVEUgMQorI2RlZmluZSBKRlNfTE9PS1VQIDIKKyNkZWZpbmUgSkZTX1JFTU9WRSAzCisjZGVmaW5lIEpGU19SRU5BTUUgNAorCisjZGVmaW5lIERJUkVOVFNJWihuYW1sZW4pIFwKKyAgICAoIChzaXplb2Yoc3RydWN0IGRpcmVudCkgLSAyKihKRlNfTkFNRV9NQVgrMSkgKyAyKigobmFtbGVuKSsxKSArIDMpICZ+IDMgKQorCisvKgorICogTWF4aW11bSBmaWxlIG9mZnNldCBmb3IgZGlyZWN0b3JpZXMuCisgKi8KKyNkZWZpbmUgRElSRU5ECUlOVF9NQVgKKworLyoKKyAqCWV4dGVybmFsIGRlY2xhcmF0aW9ucworICovCitleHRlcm4gdm9pZCBkdEluaXRSb290KHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwgdTMyIGlkb3Rkb3QpOworCitleHRlcm4gaW50IGR0U2VhcmNoKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBjb21wb25lbnRfbmFtZSAqIGtleSwKKwkJICAgIGlub190ICogZGF0YSwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrLCBpbnQgZmxhZyk7CisKK2V4dGVybiBpbnQgZHRJbnNlcnQodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgY29tcG9uZW50X25hbWUgKiBrZXksCisJCSAgICBpbm9fdCAqIGlubywgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrKTsKKworZXh0ZXJuIGludCBkdERlbGV0ZSh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBjb21wb25lbnRfbmFtZSAqIGtleSwKKwkJICAgIGlub190ICogZGF0YSwgaW50IGZsYWcpOworCitleHRlcm4gaW50IGR0TW9kaWZ5KHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwgc3RydWN0IGNvbXBvbmVudF9uYW1lICoga2V5LAorCQkgICAgaW5vX3QgKiBvcmlnX2lubywgaW5vX3QgbmV3X2lubywgaW50IGZsYWcpOworCitleHRlcm4gaW50IGpmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKTsKKworI2lmZGVmICBfSkZTX0RFQlVHX0RUUkVFCitleHRlcm4gaW50IGR0RGlzcGxheVRyZWUoc3RydWN0IGlub2RlICppcCk7CisKK2V4dGVybiBpbnQgZHREaXNwbGF5UGFnZShzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgYm4sIGR0cGFnZV90ICogcCk7CisjZW5kaWYJCQkJLyogX0pGU19ERUJVR19EVFJFRSAqLworCisjZW5kaWYJCQkJLyogIV9IX0pGU19EVFJFRSAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19leHRlbnQuYyBiL2ZzL2pmcy9qZnNfZXh0ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1M2FjYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfZXh0ZW50LmMKQEAgLTAsMCArMSw2NjggQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDA0CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlICJqZnNfaW5jb3JlLmgiCisjaW5jbHVkZSAiamZzX3N1cGVyYmxvY2suaCIKKyNpbmNsdWRlICJqZnNfZG1hcC5oIgorI2luY2x1ZGUgImpmc19leHRlbnQuaCIKKyNpbmNsdWRlICJqZnNfZGVidWcuaCIKKworLyoKKyAqIGZvcndhcmQgcmVmZXJlbmNlcworICovCitzdGF0aWMgaW50IGV4dEJhbGxvYyhzdHJ1Y3QgaW5vZGUgKiwgczY0LCBzNjQgKiwgczY0ICopOworI2lmZGVmIF9OT1RZRVQKK3N0YXRpYyBpbnQgZXh0QnJlYWxsb2Moc3RydWN0IGlub2RlICosIHM2NCwgczY0LCBzNjQgKiwgczY0ICopOworI2VuZGlmCitzdGF0aWMgczY0IGV4dFJvdW5kRG93bihzNjQgbmIpOworCisvKgorICogZXh0ZXJuYWwgcmVmZXJlbmNlcworICovCitleHRlcm4gaW50IGpmc19jb21taXRfaW5vZGUoc3RydWN0IGlub2RlICosIGludCk7CisKKworI2RlZmluZSBEUEQoYSkgICAgICAgICAgKHByaW50aygiKGEpOiAlZFxuIiwoYSkpKQorI2RlZmluZSBEUEMoYSkgICAgICAgICAgKHByaW50aygiKGEpOiAlY1xuIiwoYSkpKQorI2RlZmluZSBEUEwxKGEpCQkJCQlcCit7CQkJCQkJXAorCWlmICgoYSkgPj4gMzIpCQkJCVwKKwkJcHJpbnRrKCIoYSk6ICV4JTA4eCAgIiwoYSkpOwlcCisJZWxzZQkJCQkJXAorCQlwcmludGsoIihhKTogJXggICIsKGEpIDw8IDMyKTsJXAorfQorI2RlZmluZSBEUEwoYSkJCQkJCVwKK3sJCQkJCQlcCisJaWYgKChhKSA+PiAzMikJCQkJXAorCQlwcmludGsoIihhKTogJXglMDh4XG4iLChhKSk7CVwKKwllbHNlCQkJCQlcCisJCXByaW50aygiKGEpOiAleFxuIiwoYSkgPDwgMzIpOwlcCit9CisKKyNkZWZpbmUgRFBEMShhKSAgICAgICAgIChwcmludGsoIihhKTogJWQgICIsKGEpKSkKKyNkZWZpbmUgRFBYKGEpICAgICAgICAgIChwcmludGsoIihhKTogJTA4eFxuIiwoYSkpKQorI2RlZmluZSBEUFgxKGEpICAgICAgICAgKHByaW50aygiKGEpOiAlMDh4ICAiLChhKSkpCisjZGVmaW5lIERQUyhhKSAgICAgICAgICAocHJpbnRrKCIlc1xuIiwoYSkpKQorI2RlZmluZSBEUEUoYSkgICAgICAgICAgKHByaW50aygiXG5FTlRFUklORzogJXNcbiIsKGEpKSkKKyNkZWZpbmUgRFBFMShhKSAgICAgICAgICAocHJpbnRrKCJcbkVOVEVSSU5HOiAlcyIsKGEpKSkKKyNkZWZpbmUgRFBTMShhKSAgICAgICAgIChwcmludGsoIiAgJXMgICIsKGEpKSkKKworCisvKgorICogTkFNRToJZXh0QWxsb2MoKQorICoKKyAqIEZVTkNUSU9OOiAgICBhbGxvY2F0ZSBhbiBleHRlbnQgZm9yIGEgc3BlY2lmaWVkIHBhZ2UgcmFuZ2Ugd2l0aGluIGEKKyAqCQlmaWxlLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKglpcAktIHRoZSBpbm9kZSBvZiB0aGUgZmlsZS4KKyAqCXhsZW4JLSByZXF1ZXN0ZWQgZXh0ZW50IGxlbmd0aC4KKyAqCXBubwktIHRoZSBzdGFydGluZyBwYWdlIG51bWJlciB3aXRoIHRoZSBmaWxlLgorICoJeHAJLSBwb2ludGVyIHRvIGFuIHhhZC4gIG9uIGVudHJ5LCB4YWQgZGVzY3JpYmVzIGFuCisgKgkJICBleHRlbnQgdGhhdCBpcyB1c2VkIGFzIGFuIGFsbG9jYXRpb24gaGludCBpZiB0aGUKKyAqCQkgIHhhZGRyIG9mIHRoZSB4YWQgaXMgbm9uLXplcm8uICBvbiBzdWNjZXNzZnVsIGV4aXQsCisgKgkJICB0aGUgeGFkIGRlc2NyaWJlcyB0aGUgbmV3bHkgYWxsb2NhdGVkIGV4dGVudC4KKyAqCWFibnIJLSBib29sZWFuX3QgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBuZXdseSBhbGxvY2F0ZWQgZXh0ZW50CisgKgkJICBzaG91bGQgYmUgbWFya2VkIGFzIGFsbG9jYXRlZCBidXQgbm90IHJlY29yZGVkLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzCisgKiAgICAgIC1FSU8JLSBpL28gZXJyb3IuCisgKiAgICAgIC1FTk9TUEMJLSBpbnN1ZmZpY2llbnQgZGlzayByZXNvdXJjZXMuCisgKi8KK2ludAorZXh0QWxsb2Moc3RydWN0IGlub2RlICppcCwgczY0IHhsZW4sIHM2NCBwbm8sIHhhZF90ICogeHAsIGJvb2xlYW5fdCBhYm5yKQoreworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShpcC0+aV9zYik7CisJczY0IG54bGVuLCBueGFkZHIsIHhvZmYsIGhpbnQsIHhhZGRyID0gMDsKKwlpbnQgcmM7CisJaW50IHhmbGFnOworCisJLyogVGhpcyBibG9ja3MgaWYgd2UgYXJlIGxvdyBvbiByZXNvdXJjZXMgKi8KKwl0eEJlZ2luQW5vbihpcC0+aV9zYik7CisKKwkvKiBBdm9pZCByYWNlIHdpdGggamZzX2NvbW1pdF9pbm9kZSgpICovCisJZG93bigmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisKKwkvKiB2YWxpZGF0ZSBleHRlbnQgbGVuZ3RoICovCisJaWYgKHhsZW4gPiBNQVhYTEVOKQorCQl4bGVuID0gTUFYWExFTjsKKworCS8qIGdldCB0aGUgcGFnZSdzIHN0YXJ0aW5nIGV4dGVudCBvZmZzZXQgKi8KKwl4b2ZmID0gcG5vIDw8IHNiaS0+bDJuYnBlcnBhZ2U7CisKKwkvKiBjaGVjayBpZiBhbiBhbGxvY2F0aW9uIGhpbnQgd2FzIHByb3ZpZGVkICovCisJaWYgKChoaW50ID0gYWRkcmVzc1hBRCh4cCkpKSB7CisJCS8qIGdldCB0aGUgc2l6ZSBvZiB0aGUgZXh0ZW50IGRlc2NyaWJlZCBieSB0aGUgaGludCAqLworCQlueGxlbiA9IGxlbmd0aFhBRCh4cCk7CisKKwkJLyogY2hlY2sgaWYgdGhlIGhpbnQgaXMgZm9yIHRoZSBwb3J0aW9uIG9mIHRoZSBmaWxlCisJCSAqIGltbWVkaWF0ZWx5IHByZXZpb3VzIHRvIHRoZSBjdXJyZW50IGFsbG9jYXRpb24KKwkJICogcmVxdWVzdCBhbmQgaWYgaGludCBleHRlbnQgaGFzIHRoZSBzYW1lIGFibnIKKwkJICogdmFsdWUgYXMgdGhlIGN1cnJlbnQgcmVxdWVzdC4gIGlmIHNvLCB3ZSBjYW4KKwkJICogZXh0ZW5kIHRoZSBoaW50IGV4dGVudCB0byBpbmNsdWRlIHRoZSBjdXJyZW50CisJCSAqIGV4dGVudCBpZiB3ZSBjYW4gYWxsb2NhdGUgdGhlIGJsb2NrcyBpbW1lZGlhdGVseQorCQkgKiBmb2xsb3dpbmcgdGhlIGhpbnQgZXh0ZW50LgorCQkgKi8KKwkJaWYgKG9mZnNldFhBRCh4cCkgKyBueGxlbiA9PSB4b2ZmICYmCisJCSAgICBhYm5yID09ICgoeHAtPmZsYWcgJiBYQURfTk9UUkVDT1JERUQpID8gVFJVRSA6IEZBTFNFKSkKKwkJCXhhZGRyID0gaGludCArIG54bGVuOworCisJCS8qIGFkanVzdCB0aGUgaGludCB0byB0aGUgbGFzdCBibG9jayBvZiB0aGUgZXh0ZW50ICovCisJCWhpbnQgKz0gKG54bGVuIC0gMSk7CisJfQorCisJLyogYWxsb2NhdGUgdGhlIGRpc2sgYmxvY2tzIGZvciB0aGUgZXh0ZW50LiAgaW5pdGlhbGx5LCBleHRCYWxsb2MoKQorCSAqIHdpbGwgdHJ5IHRvIGFsbG9jYXRlIGRpc2sgYmxvY2tzIGZvciB0aGUgcmVxdWVzdGVkIHNpemUgKHhsZW4pLiAKKwkgKiBpZiB0aGlzIGZhaWxzICh4bGVuIGNvbnRpZ2lvdXMgZnJlZSBibG9ja3Mgbm90IGF2YWxpYWJsZSksIGl0J2xsCisJICogdHJ5IHRvIGFsbG9jYXRlIGEgc21hbGxlciBudW1iZXIgb2YgYmxvY2tzIChwcm9kdWNpbmcgYSBzbWFsbGVyCisJICogZXh0ZW50KSwgd2l0aCB0aGlzIHNtYWxsZXIgbnVtYmVyIG9mIGJsb2NrcyBjb25zaXN0aW5nIG9mIHRoZQorCSAqIHJlcXVlc3RlZCBudW1iZXIgb2YgYmxvY2tzIHJvdW5kZWQgZG93biB0byB0aGUgbmV4dCBzbWFsbGVyCisJICogcG93ZXIgb2YgMiBudW1iZXIgKGkuZS4gMTYgLT4gOCkuICBpdCdsbCBjb250aW51ZSB0byByb3VuZCBkb3duCisJICogYW5kIHJldHJ5IHRoZSBhbGxvY2F0aW9uIHVudGlsIHRoZSBudW1iZXIgb2YgYmxvY2tzIHRvIGFsbG9jYXRlCisJICogaXMgc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2YgYmxvY2tzIHBlciBwYWdlLgorCSAqLworCW54bGVuID0geGxlbjsKKwlpZiAoKHJjID0gZXh0QmFsbG9jKGlwLCBoaW50ID8gaGludCA6IElOT0hJTlQoaXApLCAmbnhsZW4sICZueGFkZHIpKSkgeworCQl1cCgmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisJCXJldHVybiAocmMpOworCX0KKworCS8qIEFsbG9jYXRlIGJsb2NrcyB0byBxdW90YS4gKi8KKwlpZiAoRFFVT1RfQUxMT0NfQkxPQ0soaXAsIG54bGVuKSkgeworCQlkYkZyZWUoaXAsIG54YWRkciwgKHM2NCkgbnhsZW4pOworCQl1cCgmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisJCXJldHVybiAtRURRVU9UOworCX0KKworCS8qIGRldGVybWluZSB0aGUgdmFsdWUgb2YgdGhlIGV4dGVudCBmbGFnICovCisJeGZsYWcgPSAoYWJuciA9PSBUUlVFKSA/IFhBRF9OT1RSRUNPUkRFRCA6IDA7CisKKwkvKiBpZiB3ZSBjYW4gZXh0ZW5kIHRoZSBoaW50IGV4dGVudCB0byBjb3ZlciB0aGUgY3VycmVudCByZXF1ZXN0LCAKKwkgKiBleHRlbmQgaXQuICBvdGhlcndpc2UsIGluc2VydCBhIG5ldyBleHRlbnQgdG8KKwkgKiBjb3ZlciB0aGUgY3VycmVudCByZXF1ZXN0LgorCSAqLworCWlmICh4YWRkciAmJiB4YWRkciA9PSBueGFkZHIpCisJCXJjID0geHRFeHRlbmQoMCwgaXAsIHhvZmYsIChpbnQpIG54bGVuLCAwKTsKKwllbHNlCisJCXJjID0geHRJbnNlcnQoMCwgaXAsIHhmbGFnLCB4b2ZmLCAoaW50KSBueGxlbiwgJm54YWRkciwgMCk7CisKKwkvKiBpZiB0aGUgZXh0ZW5kIG9yIGluc2VydCBmYWlsZWQsIAorCSAqIGZyZWUgdGhlIG5ld2x5IGFsbG9jYXRlZCBibG9ja3MgYW5kIHJldHVybiB0aGUgZXJyb3IuCisJICovCisJaWYgKHJjKSB7CisJCWRiRnJlZShpcCwgbnhhZGRyLCBueGxlbik7CisJCURRVU9UX0ZSRUVfQkxPQ0soaXAsIG54bGVuKTsKKwkJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCQlyZXR1cm4gKHJjKTsKKwl9CisKKwkvKiBzZXQgdGhlIHJlc3VsdHMgb2YgdGhlIGV4dGVudCBhbGxvY2F0aW9uICovCisJWEFEYWRkcmVzcyh4cCwgbnhhZGRyKTsKKwlYQURsZW5ndGgoeHAsIG54bGVuKTsKKwlYQURvZmZzZXQoeHAsIHhvZmYpOworCXhwLT5mbGFnID0geGZsYWc7CisKKwltYXJrX2lub2RlX2RpcnR5KGlwKTsKKworCXVwKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKwkvKgorCSAqIENPTU1JVF9TeW5jTGlzdCBmbGFncyBhbiBhbm9ueW1vdXMgdGxvY2sgb24gcGFnZSB0aGF0IGlzIG9uCisJICogc3luYyBsaXN0LgorCSAqIFdlIG5lZWQgdG8gY29tbWl0IHRoZSBpbm9kZSB0byBnZXQgdGhlIHBhZ2Ugd3JpdHRlbiBkaXNrLgorCSAqLworCWlmICh0ZXN0X2FuZF9jbGVhcl9jZmxhZyhDT01NSVRfU3luY2xpc3QsaXApKQorCQlqZnNfY29tbWl0X2lub2RlKGlwLCAwKTsKKworCXJldHVybiAoMCk7Cit9CisKKworI2lmZGVmIF9OT1RZRVQKKy8qCisgKiBOQU1FOiAgICAgICAgZXh0UmVhbGxvYygpCisgKgorICogRlVOQ1RJT046ICAgIGV4dGVuZCB0aGUgYWxsb2NhdGlvbiBvZiBhIGZpbGUgZXh0ZW50IGNvbnRhaW5pbmcgYQorICoJCXBhcnRpYWwgYmFjayBsYXN0IHBhZ2UuCisgKgorICogUEFSQU1FVEVSUzoKKyAqCWlwCS0gdGhlIGlub2RlIG9mIHRoZSBmaWxlLgorICoJY3AJLSBjYnVmIGZvciB0aGUgcGFydGlhbCBiYWNrZWQgbGFzdCBwYWdlLgorICoJeGxlbgktIHJlcXVlc3Qgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIGV4dGVudC4KKyAqCXhwCS0gcG9pbnRlciB0byBhbiB4YWQuIG9uIHN1Y2Nlc3NmdWwgZXhpdCwgdGhlIHhhZAorICoJCSAgZGVzY3JpYmVzIHRoZSBuZXdseSBhbGxvY2F0ZWQgZXh0ZW50LgorICoJYWJucgktIGJvb2xlYW5fdCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG5ld2x5IGFsbG9jYXRlZCBleHRlbnQKKyAqCQkgIHNob3VsZCBiZSBtYXJrZWQgYXMgYWxsb2NhdGVkIGJ1dCBub3QgcmVjb3JkZWQuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMCAgICAgICAtIHN1Y2Nlc3MKKyAqICAgICAgLUVJTwktIGkvbyBlcnJvci4KKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBkaXNrIHJlc291cmNlcy4KKyAqLworaW50IGV4dFJlYWxsb2Moc3RydWN0IGlub2RlICppcCwgczY0IG54bGVuLCB4YWRfdCAqIHhwLCBib29sZWFuX3QgYWJucikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaXAtPmlfc2I7CisJczY0IHhhZGRyLCB4bGVuLCBueGFkZHIsIGRlbHRhLCB4b2ZmOworCXM2NCBudGFpbCwgbmV4dGVuZCwgbmluc2VydDsKKwlpbnQgcmMsIG5icGVycGFnZSA9IEpGU19TQkkoc2IpLT5uYnBlcnBhZ2U7CisJaW50IHhmbGFnOworCisJLyogVGhpcyBibG9ja3MgaWYgd2UgYXJlIGxvdyBvbiByZXNvdXJjZXMgKi8KKwl0eEJlZ2luQW5vbihpcC0+aV9zYik7CisKKwlkb3duKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKwkvKiB2YWxpZGF0ZSBleHRlbnQgbGVuZ3RoICovCisJaWYgKG54bGVuID4gTUFYWExFTikKKwkJbnhsZW4gPSBNQVhYTEVOOworCisJLyogZ2V0IHRoZSBleHRlbmQgKHBhcnRpYWwpIHBhZ2UncyBkaXNrIGJsb2NrIGFkZHJlc3MgYW5kCisJICogbnVtYmVyIG9mIGJsb2Nrcy4KKwkgKi8KKwl4YWRkciA9IGFkZHJlc3NYQUQoeHApOworCXhsZW4gPSBsZW5ndGhYQUQoeHApOworCXhvZmYgPSBvZmZzZXRYQUQoeHApOworCisJLyogaWYgdGhlIGV4dGVuZCBwYWdlIGlzIGFibnIgYW5kIGlmIHRoZSByZXF1ZXN0IGlzIGZvcgorCSAqIHRoZSBleHRlbnQgdG8gYmUgYWxsb2NhdGVkIGFuZCByZWNvcmRlZCwgCisJICogbWFrZSB0aGUgcGFnZSBhbGxvY2F0ZWQgYW5kIHJlY29yZGVkLgorCSAqLworCWlmICgoeHAtPmZsYWcgJiBYQURfTk9UUkVDT1JERUQpICYmICFhYm5yKSB7CisJCXhwLT5mbGFnID0gMDsKKwkJaWYgKChyYyA9IHh0VXBkYXRlKDAsIGlwLCB4cCkpKQorCQkJZ290byBleGl0OworCX0KKworCS8qIHRyeSB0byBhbGxvY2F0ZWQgdGhlIHJlcXVlc3QgbnVtYmVyIG9mIGJsb2NrcyBmb3IgdGhlCisJICogZXh0ZW50LiAgZGJSZWFsbG9jKCkgZmlyc3QgdHJpZXMgdG8gc2F0aXNmeSB0aGUgcmVxdWVzdAorCSAqIGJ5IGV4dGVuZGluZyB0aGUgYWxsb2NhdGlvbiBpbiBwbGFjZS4gb3RoZXJ3aXNlLCBpdCB3aWxsCisJICogdHJ5IHRvIGFsbG9jYXRlIGEgbmV3IHNldCBvZiBibG9ja3MgbGFyZ2UgZW5vdWdoIGZvciB0aGUKKwkgKiByZXF1ZXN0LiAgaW4gc2F0aXNmeWluZyBhIHJlcXVlc3QsIGRiUmVBbGxvYygpIG1heSBhbGxvY2F0ZQorCSAqIGxlc3MgdGhhbiB3aGF0IHdhcyByZXF1ZXN0IGJ1dCB3aWxsIGFsd2F5cyBhbGxvY2F0ZSBlbm91Z2gKKwkgKiBzcGFjZSBhcyB0byBzYXRpc2Z5IHRoZSBleHRlbmQgcGFnZS4KKwkgKi8KKwlpZiAoKHJjID0gZXh0QnJlYWxsb2MoaXAsIHhhZGRyLCB4bGVuLCAmbnhsZW4sICZueGFkZHIpKSkKKwkJZ290byBleGl0OworCisJLyogQWxsb2NhdCBibG9ja3MgdG8gcXVvdGEuICovCisJaWYgKERRVU9UX0FMTE9DX0JMT0NLKGlwLCBueGxlbikpIHsKKwkJZGJGcmVlKGlwLCBueGFkZHIsIChzNjQpIG54bGVuKTsKKwkJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCQlyZXR1cm4gLUVEUVVPVDsKKwl9CisKKwlkZWx0YSA9IG54bGVuIC0geGxlbjsKKworCS8qIGNoZWNrIGlmIHRoZSBleHRlbmQgcGFnZSBpcyBub3QgYWJuciBidXQgdGhlIHJlcXVlc3QgaXMgYWJucgorCSAqIGFuZCB0aGUgYWxsb2NhdGVkIGRpc2sgc3BhY2UgaXMgZm9yIG1vcmUgdGhhbiBvbmUgcGFnZS4gIGlmIHRoaXMKKwkgKiBpcyB0aGUgY2FzZSwgdGhlcmUgaXMgYSBtaXNzIG1hdGNoIG9mIGFibnIgYmV0d2VlbiB0aGUgZXh0ZW5kIHBhZ2UKKwkgKiBhbmQgdGhlIG9uZSBvciBtb3JlIHBhZ2VzIGZvbGxvd2luZyB0aGUgZXh0ZW5kIHBhZ2UuICBhcyBhIHJlc3VsdCwKKwkgKiB0d28gZXh0ZW50cyB3aWxsIGhhdmUgdG8gYmUgbWFuaXB1bGF0ZWQuIHRoZSBmaXJzdCB3aWxsIGJlIHRoYXQKKwkgKiBvZiB0aGUgZXh0ZW50IG9mIHRoZSBleHRlbmQgcGFnZSBhbmQgd2lsbCBiZSBtYW5pcHVsYXRlZCB0aHJ1CisJICogYW4geHRFeHRlbmQoKSBvciBhbiB4dFRhaWxnYXRlKCksIGRlcGVuZGluZyB1cG9uIHdoZXRoZXIgdGhlCisJICogZGlzayBhbGxvY2F0aW9uIG9jY3VycmVkIGFzIGFuIGlucGxhY2UgZXh0ZW5zaW9uLiAgdGhlIHNlY29uZAorCSAqIGV4dGVudCB3aWxsIGJlIG1hbmlwdWxhdGVkIChjcmVhdGVkKSB0aHJvdWdoIGFuIHh0SW5zZXJ0KCkgYW5kCisJICogd2lsbCBiZSBmb3IgdGhlIHBhZ2VzIGZvbGxvd2luZyB0aGUgZXh0ZW5kIHBhZ2UuCisJICovCisJaWYgKGFibnIgJiYgKCEoeHAtPmZsYWcgJiBYQURfTk9UUkVDT1JERUQpKSAmJiAobnhsZW4gPiBuYnBlcnBhZ2UpKSB7CisJCW50YWlsID0gbmJwZXJwYWdlOworCQluZXh0ZW5kID0gbnRhaWwgLSB4bGVuOworCQluaW5zZXJ0ID0gbnhsZW4gLSBuYnBlcnBhZ2U7CisKKwkJeGZsYWcgPSBYQURfTk9UUkVDT1JERUQ7CisJfSBlbHNlIHsKKwkJbnRhaWwgPSBueGxlbjsKKwkJbmV4dGVuZCA9IGRlbHRhOworCQluaW5zZXJ0ID0gMDsKKworCQl4ZmxhZyA9IHhwLT5mbGFnOworCX0KKworCS8qIGlmIHdlIHdlcmUgYWJsZSB0byBleHRlbmQgdGhlIGRpc2sgYWxsb2NhdGlvbiBpbiBwbGFjZSwKKwkgKiBleHRlbmQgdGhlIGV4dGVudC4gIG90aGVyd2lzZSwgbW92ZSB0aGUgZXh0ZW50IHRvIGEKKwkgKiBuZXcgZGlzayBsb2NhdGlvbi4KKwkgKi8KKwlpZiAoeGFkZHIgPT0gbnhhZGRyKSB7CisJCS8qIGV4dGVuZCB0aGUgZXh0ZW50ICovCisJCWlmICgocmMgPSB4dEV4dGVuZCgwLCBpcCwgeG9mZiArIHhsZW4sIChpbnQpIG5leHRlbmQsIDApKSkgeworCQkJZGJGcmVlKGlwLCB4YWRkciArIHhsZW4sIGRlbHRhKTsKKwkJCURRVU9UX0ZSRUVfQkxPQ0soaXAsIG54bGVuKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIG1vdmUgdGhlIGV4dGVudCB0byBhIG5ldyBsb2NhdGlvbjoKKwkJICoKKwkJICogeHRUYWlsZ2F0ZSgpIGFjY291bnRzIGZvciByZWxvY2F0ZWQgdGFpbCBleHRlbnQ7CisJCSAqLworCQlpZiAoKHJjID0geHRUYWlsZ2F0ZSgwLCBpcCwgeG9mZiwgKGludCkgbnRhaWwsIG54YWRkciwgMCkpKSB7CisJCQlkYkZyZWUoaXAsIG54YWRkciwgbnhsZW4pOworCQkJRFFVT1RfRlJFRV9CTE9DSyhpcCwgbnhsZW4pOworCQkJZ290byBleGl0OworCQl9CisJfQorCisKKwkvKiBjaGVjayBpZiB3ZSBuZWVkIHRvIGFsc28gaW5zZXJ0IGEgbmV3IGV4dGVudCAqLworCWlmIChuaW5zZXJ0KSB7CisJCS8qIHBlcmZvcm0gdGhlIGluc2VydC4gIGlmIGl0IGZhaWxzLCBmcmVlIHRoZSBibG9ja3MKKwkJICogdG8gYmUgaW5zZXJ0ZWQgYW5kIG1ha2UgaXQgYXBwZWFyIHRoYXQgd2Ugb25seSBkaWQKKwkJICogdGhlIHh0RXh0ZW5kKCkgb3IgeHRUYWlsZ2F0ZSgpIGFib3ZlLgorCQkgKi8KKwkJeGFkZHIgPSBueGFkZHIgKyBudGFpbDsKKwkJaWYgKHh0SW5zZXJ0ICgwLCBpcCwgeGZsYWcsIHhvZmYgKyBudGFpbCwgKGludCkgbmluc2VydCwKKwkJCSAgICAgICZ4YWRkciwgMCkpIHsKKwkJCWRiRnJlZShpcCwgeGFkZHIsIChzNjQpIG5pbnNlcnQpOworCQkJZGVsdGEgPSBuZXh0ZW5kOworCQkJbnhsZW4gPSBudGFpbDsKKwkJCXhmbGFnID0gMDsKKwkJfQorCX0KKworCS8qIHNldCB0aGUgcmV0dXJuIHJlc3VsdHMgKi8KKwlYQURhZGRyZXNzKHhwLCBueGFkZHIpOworCVhBRGxlbmd0aCh4cCwgbnhsZW4pOworCVhBRG9mZnNldCh4cCwgeG9mZik7CisJeHAtPmZsYWcgPSB4ZmxhZzsKKworCW1hcmtfaW5vZGVfZGlydHkoaXApOworZXhpdDoKKwl1cCgmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisJcmV0dXJuIChyYyk7Cit9CisjZW5kaWYJCQkvKiBfTk9UWUVUICovCisKKworLyoKKyAqIE5BTUU6ICAgICAgICBleHRIaW50KCkKKyAqCisgKiBGVU5DVElPTjogICAgcHJvZHVjZSBhbiBleHRlbnQgYWxsb2NhdGlvbiBoaW50IGZvciBhIGZpbGUgb2Zmc2V0LgorICoKKyAqIFBBUkFNRVRFUlM6CisgKglpcAktIHRoZSBpbm9kZSBvZiB0aGUgZmlsZS4KKyAqCW9mZnNldCAgLSBmaWxlIG9mZnNldCBmb3Igd2hpY2ggdGhlIGhpbnQgaXMgbmVlZGVkLgorICoJeHAJLSBwb2ludGVyIHRvIHRoZSB4YWQgdGhhdCBpcyB0byBiZSBmaWxsZWQgaW4gd2l0aAorICoJCSAgdGhlIGhpbnQuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMCAgICAgICAtIHN1Y2Nlc3MKKyAqICAgICAgLUVJTwktIGkvbyBlcnJvci4KKyAqLworaW50IGV4dEhpbnQoc3RydWN0IGlub2RlICppcCwgczY0IG9mZnNldCwgeGFkX3QgKiB4cCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaXAtPmlfc2I7CisJc3RydWN0IHhhZGxpc3QgeGFkbDsKKwlzdHJ1Y3QgbHhkbGlzdCBseGRsOworCWx4ZF90IGx4ZDsKKwlzNjQgcHJldjsKKwlpbnQgcmMsIG5icGVycGFnZSA9IEpGU19TQkkoc2IpLT5uYnBlcnBhZ2U7CisKKwkvKiBpbml0IHRoZSBoaW50IGFzICJubyBoaW50IHByb3ZpZGVkIiAqLworCVhBRGFkZHJlc3MoeHAsIDApOworCisJLyogZGV0ZXJtaW5lIHRoZSBzdGFydGluZyBleHRlbnQgb2Zmc2V0IG9mIHRoZSBwYWdlIHByZXZpb3VzCisJICogdG8gdGhlIHBhZ2UgY29udGFpbmluZyB0aGUgb2Zmc2V0LgorCSAqLworCXByZXYgPSAoKG9mZnNldCAmIH5QT0ZGU0VUKSA+PiBKRlNfU0JJKHNiKS0+bDJic2l6ZSkgLSBuYnBlcnBhZ2U7CisKKwkvKiBpZiB0aGUgb2Zmc2V0cyBpbiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgZmlsZSwKKwkgKiBubyBoaW50IHByb3ZpZGVkLgorCSAqLworCWlmIChwcmV2IDwgMCkKKwkJcmV0dXJuICgwKTsKKworCS8qIHByZXBhcmUgdG8gbG9va3VwIHRoZSBwcmV2aW91cyBwYWdlJ3MgZXh0ZW50IGluZm8gKi8KKwlseGRsLm1heG5seGQgPSAxOworCWx4ZGwubmx4ZCA9IDE7CisJbHhkbC5seGQgPSAmbHhkOworCUxYRG9mZnNldCgmbHhkLCBwcmV2KQorCSAgICBMWERsZW5ndGgoJmx4ZCwgbmJwZXJwYWdlKTsKKworCXhhZGwubWF4bnhhZCA9IDE7CisJeGFkbC5ueGFkID0gMDsKKwl4YWRsLnhhZCA9IHhwOworCisJLyogcGVyZm9ybSB0aGUgbG9va3VwICovCisJaWYgKChyYyA9IHh0TG9va3VwTGlzdChpcCwgJmx4ZGwsICZ4YWRsLCAwKSkpCisJCXJldHVybiAocmMpOworCisJLyogY2hlY2sgaWYgbm90IGV4dGVudCBleGlzdHMgZm9yIHRoZSBwcmV2aW91cyBwYWdlLiAgCisJICogdGhpcyBpcyBwb3NzaWJsZSBmb3Igc3BhcnNlIGZpbGVzLgorCSAqLworCWlmICh4YWRsLm54YWQgPT0gMCkgeworLy8gICAgICAgICAgICAgIGFzc2VydChJU1NQQVJTRShpcCkpOworCQlyZXR1cm4gKDApOworCX0KKworCS8qIG9ubHkgcHJlc2VydmUgdGhlIGFibnIgZmxhZyB3aXRoaW4gdGhlIHhhZCBmbGFncworCSAqIG9mIHRoZSByZXR1cm5lZCBoaW50LgorCSAqLworCXhwLT5mbGFnICY9IFhBRF9OT1RSRUNPUkRFRDsKKworICAgICAgICBpZih4YWRsLm54YWQgIT0gMSB8fCBsZW5ndGhYQUQoeHApICE9IG5icGVycGFnZSkgeyAgICAgICAgICAKKwkJamZzX2Vycm9yKGlwLT5pX3NiLCAiZXh0SGludDogY29ycnVwdCB4dHJlZSIpOworCQlyZXR1cm4gLUVJTzsKKyAgICAgICAgfQorCisJcmV0dXJuICgwKTsKK30KKworCisvKgorICogTkFNRTogICAgICAgIGV4dFJlY29yZCgpCisgKgorICogRlVOQ1RJT046ICAgIGNoYW5nZSBhIHBhZ2Ugd2l0aCBhIGZpbGUgZnJvbSBub3QgcmVjb3JkZWQgdG8gcmVjb3JkZWQuCisgKgorICogUEFSQU1FVEVSUzoKKyAqCWlwCS0gaW5vZGUgb2YgdGhlIGZpbGUuCisgKgljcAktIGNidWYgb2YgdGhlIGZpbGUgcGFnZS4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwICAgICAgIC0gc3VjY2VzcworICogICAgICAtRUlPCS0gaS9vIGVycm9yLgorICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzLgorICovCitpbnQgZXh0UmVjb3JkKHN0cnVjdCBpbm9kZSAqaXAsIHhhZF90ICogeHApCit7CisJaW50IHJjOworCisJdHhCZWdpbkFub24oaXAtPmlfc2IpOworCisJZG93bigmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisKKwkvKiB1cGRhdGUgdGhlIGV4dGVudCAqLworCXJjID0geHRVcGRhdGUoMCwgaXAsIHhwKTsKKworCXVwKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKwlyZXR1cm4gcmM7Cit9CisKKworI2lmZGVmIF9OT1RZRVQKKy8qCisgKiBOQU1FOiAgICAgICAgZXh0RmlsbCgpCisgKgorICogRlVOQ1RJT046ICAgIGFsbG9jYXRlIGRpc2sgc3BhY2UgZm9yIGEgZmlsZSBwYWdlIHRoYXQgcmVwcmVzZW50cworICoJCWEgZmlsZSBob2xlLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKglpcAktIHRoZSBpbm9kZSBvZiB0aGUgZmlsZS4KKyAqCWNwCS0gY2J1ZiBvZiB0aGUgZmlsZSBwYWdlIHJlcHJlc2VudCB0aGUgaG9sZS4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwICAgICAgIC0gc3VjY2VzcworICogICAgICAtRUlPCS0gaS9vIGVycm9yLgorICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzLgorICovCitpbnQgZXh0RmlsbChzdHJ1Y3QgaW5vZGUgKmlwLCB4YWRfdCAqIHhwKQoreworCWludCByYywgbmJwZXJwYWdlID0gSkZTX1NCSShpcC0+aV9zYiktPm5icGVycGFnZTsKKwlzNjQgYmxrbm8gPSBvZmZzZXRYQUQoeHApID4+IGlwLT5pX2Jsa3NpemU7CisKKy8vICAgICAgYXNzZXJ0KElTU1BBUlNFKGlwKSk7CisKKwkvKiBpbml0aWFsaXplIHRoZSBleHRlbnQgYWxsb2NhdGlvbiBoaW50ICovCisJWEFEYWRkcmVzcyh4cCwgMCk7CisKKwkvKiBhbGxvY2F0ZSBhbiBleHRlbnQgdG8gZmlsbCB0aGUgaG9sZSAqLworCWlmICgocmMgPSBleHRBbGxvYyhpcCwgbmJwZXJwYWdlLCBibGtubywgeHAsIEZBTFNFKSkpCisJCXJldHVybiAocmMpOworCisJYXNzZXJ0KGxlbmd0aFBYRCh4cCkgPT0gbmJwZXJwYWdlKTsKKworCXJldHVybiAoMCk7Cit9CisjZW5kaWYJCQkvKiBfTk9UWUVUICovCisKKworLyoKKyAqIE5BTUU6CWV4dEJhbGxvYygpCisgKgorICogRlVOQ1RJT046ICAgIGFsbG9jYXRlIGRpc2sgYmxvY2tzIHRvIGZvcm0gYW4gZXh0ZW50LgorICoKKyAqCQlpbml0aWFsbHksIHdlIHdpbGwgdHJ5IHRvIGFsbG9jYXRlIGRpc2sgYmxvY2tzIGZvciB0aGUKKyAqCQlyZXF1ZXN0ZWQgc2l6ZSAobmJsb2NrcykuICBpZiB0aGlzIGZhaWxzIChuYmxvY2tzIAorICoJCWNvbnRpZ2lvdXMgZnJlZSBibG9ja3Mgbm90IGF2YWxpYWJsZSksIHdlJ2xsIHRyeSB0byBhbGxvY2F0ZQorICoJCWEgc21hbGxlciBudW1iZXIgb2YgYmxvY2tzIChwcm9kdWNpbmcgYSBzbWFsbGVyIGV4dGVudCksIHdpdGgKKyAqCQl0aGlzIHNtYWxsZXIgbnVtYmVyIG9mIGJsb2NrcyBjb25zaXN0aW5nIG9mIHRoZSByZXF1ZXN0ZWQKKyAqCQludW1iZXIgb2YgYmxvY2tzIHJvdW5kZWQgZG93biB0byB0aGUgbmV4dCBzbWFsbGVyIHBvd2VyIG9mIDIKKyAqCQludW1iZXIgKGkuZS4gMTYgLT4gOCkuICB3ZSdsbCBjb250aW51ZSB0byByb3VuZCBkb3duIGFuZAorICoJCXJldHJ5IHRoZSBhbGxvY2F0aW9uIHVudGlsIHRoZSBudW1iZXIgb2YgYmxvY2tzIHRvIGFsbG9jYXRlCisgKgkJaXMgc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2YgYmxvY2tzIHBlciBwYWdlLgorICoJCQorICogUEFSQU1FVEVSUzoKKyAqCWlwCSAtIHRoZSBpbm9kZSBvZiB0aGUgZmlsZS4KKyAqCWhpbnQJIC0gZGlzayBibG9jayBudW1iZXIgdG8gYmUgdXNlZCBhcyBhbiBhbGxvY2F0aW9uIGhpbnQuCisgKgkqbmJsb2NrcyAtIHBvaW50ZXIgdG8gYW4gczY0IHZhbHVlLiAgb24gZW50cnksIHRoaXMgdmFsdWUgc3BlY2lmaWVzCisgKgkJICAgdGhlIGRlc2lyZWQgbnVtYmVyIG9mIGJsb2NrIHRvIGJlIGFsbG9jYXRlZC4gb24gc3VjY2Vzc2Z1bAorICoJCSAgIGV4aXQsIHRoaXMgdmFsdWUgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgYmxvY2tzIGFjdHVhbGx5CisgKgkJICAgYWxsb2NhdGVkLgorICoJYmxrbm8JIC0gcG9pbnRlciB0byBhIGJsb2NrIGFkZHJlc3MgdGhhdCBpcyBmaWxsZWQgaW4gb24gc3VjY2Vzc2Z1bAorICoJCSAgIHJldHVybiB3aXRoIHRoZSBzdGFydGluZyBibG9jayBudW1iZXIgb2YgdGhlIG5ld2x5IAorICoJCSAgIGFsbG9jYXRlZCBibG9jayByYW5nZS4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwICAgICAgIC0gc3VjY2VzcworICogICAgICAtRUlPCS0gaS9vIGVycm9yLgorICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzLgorICovCitzdGF0aWMgaW50CitleHRCYWxsb2Moc3RydWN0IGlub2RlICppcCwgczY0IGhpbnQsIHM2NCAqIG5ibG9ja3MsIHM2NCAqIGJsa25vKQoreworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamkgPSBKRlNfSVAoaXApOworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShpcC0+aV9zYik7CisJczY0IG5iLCBuYmxrcywgZGFkZHIsIG1heDsKKwlpbnQgcmMsIG5icGVycGFnZSA9IHNiaS0+bmJwZXJwYWdlOworCXN0cnVjdCBibWFwICpibXAgPSBzYmktPmJtYXA7CisJaW50IGFnOworCisJLyogZ2V0IHRoZSBudW1iZXIgb2YgYmxvY2tzIHRvIGluaXRpYWxseSBhdHRlbXB0IHRvIGFsbG9jYXRlLgorCSAqIHdlJ2xsIGZpcnN0IHRyeSB0aGUgbnVtYmVyIG9mIGJsb2NrcyByZXF1ZXN0ZWQgdW5sZXNzIHRoaXMKKwkgKiBudW1iZXIgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb250aWdpb3VzIGZyZWUKKwkgKiBibG9ja3MgaW4gdGhlIG1hcC4gaW4gdGhhdCBjYXNlLCB3ZSdsbCBzdGFydCBvZmYgd2l0aCB0aGUgCisJICogbWF4aW11bSBmcmVlLgorCSAqLworCW1heCA9IChzNjQpIDEgPDwgYm1wLT5kYl9tYXhmcmVlYnVkOworCWlmICgqbmJsb2NrcyA+PSBtYXggJiYgKm5ibG9ja3MgPiBuYnBlcnBhZ2UpCisJCW5iID0gbmJsa3MgPSAobWF4ID4gbmJwZXJwYWdlKSA/IG1heCA6IG5icGVycGFnZTsKKwllbHNlCisJCW5iID0gbmJsa3MgPSAqbmJsb2NrczsKKworCS8qIHRyeSB0byBhbGxvY2F0ZSBibG9ja3MgKi8KKwl3aGlsZSAoKHJjID0gZGJBbGxvYyhpcCwgaGludCwgbmIsICZkYWRkcikpICE9IDApIHsKKwkJLyogaWYgc29tZXRoaW5nIG90aGVyIHRoYW4gYW4gb3V0IG9mIHNwYWNlIGVycm9yLAorCQkgKiBzdG9wIGFuZCByZXR1cm4gdGhpcyBlcnJvci4KKwkJICovCisJCWlmIChyYyAhPSAtRU5PU1BDKQorCQkJcmV0dXJuIChyYyk7CisKKwkJLyogZGVjcmVhc2UgdGhlIGFsbG9jYXRpb24gcmVxdWVzdCBzaXplICovCisJCW5iID0gbWluKG5ibGtzLCBleHRSb3VuZERvd24obmIpKTsKKworCQkvKiBnaXZlIHVwIGlmIHdlIGNhbm5vdCBjb3ZlciBhIHBhZ2UgKi8KKwkJaWYgKG5iIDwgbmJwZXJwYWdlKQorCQkJcmV0dXJuIChyYyk7CisJfQorCisJKm5ibG9ja3MgPSBuYjsKKwkqYmxrbm8gPSBkYWRkcjsKKworCWlmIChTX0lTUkVHKGlwLT5pX21vZGUpICYmIChqaS0+ZmlsZXNldCA9PSBGSUxFU1lTVEVNX0kpKSB7CisJCWFnID0gQkxLVE9BRyhkYWRkciwgc2JpKTsKKwkJc3Bpbl9sb2NrX2lycSgmamktPmFnX2xvY2spOworCQlpZiAoamktPmFjdGl2ZV9hZyA9PSAtMSkgeworCQkJYXRvbWljX2luYygmYm1wLT5kYl9hY3RpdmVbYWddKTsKKwkJCWppLT5hY3RpdmVfYWcgPSBhZzsKKwkJfSBlbHNlIGlmIChqaS0+YWN0aXZlX2FnICE9IGFnKSB7CisJCQlhdG9taWNfZGVjKCZibXAtPmRiX2FjdGl2ZVtqaS0+YWN0aXZlX2FnXSk7CisJCQlhdG9taWNfaW5jKCZibXAtPmRiX2FjdGl2ZVthZ10pOworCQkJamktPmFjdGl2ZV9hZyA9IGFnOworCQl9CisJCXNwaW5fdW5sb2NrX2lycSgmamktPmFnX2xvY2spOworCX0KKworCXJldHVybiAoMCk7Cit9CisKKworI2lmZGVmIF9OT1RZRVQKKy8qCisgKiBOQU1FOglleHRCcmVhbGxvYygpCisgKgorICogRlVOQ1RJT046ICAgIGF0dGVtcHQgdG8gZXh0ZW5kIGFuIGV4dGVudCdzIGFsbG9jYXRpb24uCisgKgorICoJCWluaXRpYWxseSwgd2Ugd2lsbCB0cnkgdG8gZXh0ZW5kIHRoZSBleHRlbnQncyBhbGxvY2F0aW9uCisgKgkJaW4gcGxhY2UuICBpZiB0aGlzIGZhaWxzLCB3ZSdsbCB0cnkgdG8gbW92ZSB0aGUgZXh0ZW50CisgKgkJdG8gYSBuZXcgc2V0IG9mIGJsb2Nrcy4gaWYgbW92aW5nIHRoZSBleHRlbnQsIHdlIGluaXRpYWxseQorICoJCXdpbGwgdHJ5IHRvIGFsbG9jYXRlIGRpc2sgYmxvY2tzIGZvciB0aGUgcmVxdWVzdGVkIHNpemUKKyAqCQkobm5ldykuICBpZiB0aGlzIGZhaWxzIAkobm5ldyBjb250aWdpb3VzIGZyZWUgYmxvY2tzIG5vdAorICoJCWF2YWxpYWJsZSksIHdlJ2xsIHRyeSAgdG8gYWxsb2NhdGUgYSBzbWFsbGVyIG51bWJlciBvZgorICoJCWJsb2NrcyAocHJvZHVjaW5nIGEgc21hbGxlciBleHRlbnQpLCB3aXRoIHRoaXMgc21hbGxlcgorICoJCW51bWJlciBvZiBibG9ja3MgY29uc2lzdGluZyBvZiB0aGUgcmVxdWVzdGVkIG51bWJlciBvZgorICoJCWJsb2NrcyByb3VuZGVkIGRvd24gdG8gdGhlIG5leHQgc21hbGxlciBwb3dlciBvZiAyCisgKgkJbnVtYmVyIChpLmUuIDE2IC0+IDgpLiAgd2UnbGwgY29udGludWUgdG8gcm91bmQgZG93biBhbmQKKyAqCQlyZXRyeSB0aGUgYWxsb2NhdGlvbiB1bnRpbCB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0byBhbGxvY2F0ZQorICoJCWlzIHNtYWxsZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJsb2NrcyBwZXIgcGFnZS4KKyAqCQkKKyAqIFBBUkFNRVRFUlM6CisgKglpcAkgLSB0aGUgaW5vZGUgb2YgdGhlIGZpbGUuCisgKglibGtubyAgICAtIHN0YXJ0aW5nIGJsb2NrIG51bWJlciBvZiB0aGUgZXh0ZW50cyBjdXJyZW50IGFsbG9jYXRpb24uCisgKgluYmxrcyAgICAtIG51bWJlciBvZiBibG9ja3Mgd2l0aGluIHRoZSBleHRlbnRzIGN1cnJlbnQgYWxsb2NhdGlvbi4KKyAqCW5ld25ibGtzIC0gcG9pbnRlciB0byBhIHM2NCB2YWx1ZS4gIG9uIGVudHJ5LCB0aGlzIHZhbHVlIGlzIHRoZQorICoJCSAgIHRoZSBuZXcgZGVzaXJlZCBleHRlbnQgc2l6ZSAobnVtYmVyIG9mIGJsb2NrcykuICBvbgorICoJCSAgIHN1Y2Nlc3NmdWwgZXhpdCwgdGhpcyB2YWx1ZSBpcyBzZXQgdG8gdGhlIGV4dGVudCdzIGFjdHVhbAorICoJCSAgIG5ldyBzaXplIChuZXcgbnVtYmVyIG9mIGJsb2NrcykuCisgKgluZXdibGtubyAtIHRoZSBzdGFydGluZyBibG9jayBudW1iZXIgb2YgdGhlIGV4dGVudHMgbmV3IGFsbG9jYXRpb24uCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMCAgICAgICAtIHN1Y2Nlc3MKKyAqICAgICAgLUVJTwktIGkvbyBlcnJvci4KKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBkaXNrIHJlc291cmNlcy4KKyAqLworc3RhdGljIGludAorZXh0QnJlYWxsb2Moc3RydWN0IGlub2RlICppcCwKKwkgICAgczY0IGJsa25vLCBzNjQgbmJsa3MsIHM2NCAqIG5ld25ibGtzLCBzNjQgKiBuZXdibGtubykKK3sKKwlpbnQgcmM7CisKKwkvKiB0cnkgdG8gZXh0ZW5kIGluIHBsYWNlICovCisJaWYgKChyYyA9IGRiRXh0ZW5kKGlwLCBibGtubywgbmJsa3MsICpuZXduYmxrcyAtIG5ibGtzKSkgPT0gMCkgeworCQkqbmV3Ymxrbm8gPSBibGtubzsKKwkJcmV0dXJuICgwKTsKKwl9IGVsc2UgeworCQlpZiAocmMgIT0gLUVOT1NQQykKKwkJCXJldHVybiAocmMpOworCX0KKworCS8qIGluIHBsYWNlIGV4dGVuc2lvbiBub3QgcG9zc2libGUuICAKKwkgKiB0cnkgdG8gbW92ZSB0aGUgZXh0ZW50IHRvIGEgbmV3IHNldCBvZiBibG9ja3MuCisJICovCisJcmV0dXJuIChleHRCYWxsb2MoaXAsIGJsa25vLCBuZXduYmxrcywgbmV3Ymxrbm8pKTsKK30KKyNlbmRpZgkJCS8qIF9OT1RZRVQgKi8KKworCisvKgorICogTkFNRTogICAgICAgIGV4dFJvdW5kRG93bigpCisgKgorICogRlVOQ1RJT046ICAgIHJvdW5kIGRvd24gYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJsb2NrcyB0byB0aGUgbmV4dAorICoJCXNtYWxsZXN0IHBvd2VyIG9mIDIgbnVtYmVyLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKgluYgktIHRoZSBpbm9kZSBvZiB0aGUgZmlsZS4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICBuZXh0IHNtYWxsZXN0IHBvd2VyIG9mIDIgbnVtYmVyLgorICovCitzdGF0aWMgczY0IGV4dFJvdW5kRG93bihzNjQgbmIpCit7CisJaW50IGk7CisJdTY0IG0sIGs7CisKKwlmb3IgKGkgPSAwLCBtID0gKHU2NCkgMSA8PCA2MzsgaSA8IDY0OyBpKyssIG0gPj49IDEpIHsKKwkJaWYgKG0gJiBuYikKKwkJCWJyZWFrOworCX0KKworCWkgPSA2MyAtIGk7CisJayA9ICh1NjQpIDEgPDwgaTsKKwlrID0gKChrIC0gMSkgJiBuYikgPyBrIDogayA+PiAxOworCisJcmV0dXJuIChrKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfZXh0ZW50LmggYi9mcy9qZnMvamZzX2V4dGVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MGZjN2MKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX2V4dGVudC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDAxCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYJX0hfSkZTX0VYVEVOVAorI2RlZmluZSBfSF9KRlNfRVhURU5UCisKKy8qICBnZXQgYmxvY2sgYWxsb2NhdGlvbiBhbGxvY2F0aW9uIGhpbnQgYXMgbG9jYXRpb24gb2YgZGlzayBpbm9kZSAqLworI2RlZmluZQlJTk9ISU5UKGlwKQlcCisJKGFkZHJlc3NQWEQoJihKRlNfSVAoaXApLT5peHB4ZCkpICsgbGVuZ3RoUFhEKCYoSkZTX0lQKGlwKS0+aXhweGQpKSAtIDEpCisKK2V4dGVybiBpbnQJZXh0QWxsb2Moc3RydWN0IGlub2RlICosIHM2NCwgczY0LCB4YWRfdCAqLCBib29sZWFuX3QpOworZXh0ZXJuIGludAlleHRGaWxsKHN0cnVjdCBpbm9kZSAqLCB4YWRfdCAqKTsKK2V4dGVybiBpbnQJZXh0SGludChzdHJ1Y3QgaW5vZGUgKiwgczY0LCB4YWRfdCAqKTsKK2V4dGVybiBpbnQJZXh0UmVhbGxvYyhzdHJ1Y3QgaW5vZGUgKiwgczY0LCB4YWRfdCAqLCBib29sZWFuX3QpOworZXh0ZXJuIGludAlleHRSZWNvcmQoc3RydWN0IGlub2RlICosIHhhZF90ICopOworCisjZW5kaWYJLyogX0hfSkZTX0VYVEVOVCAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19maWxzeXMuaCBiL2ZzL2pmcy9qZnNfZmlsc3lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjY2FjOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfZmlsc3lzLmgKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDAzCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYgX0hfSkZTX0ZJTFNZUworI2RlZmluZSBfSF9KRlNfRklMU1lTCisKKy8qCisgKglqZnNfZmlsc3lzLmgKKyAqCisgKiBmaWxlIHN5c3RlbSAoaW1wbGVtZW50YXRpb24tZGVwZW5kZW50KSBjb25zdGFudHMgCisgKgorICogcmVmZXIgdG8gPGxpbWl0cy5oPiBmb3Igc3lzdGVtIHdpZGUgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50IGNvbnN0YW50cyAKKyAqLworCisvKgorICoJIGZpbGUgc3lzdGVtIG9wdGlvbiAoc3VwZXJibG9jayBmbGFnKQorICovCisvKiBtb3VudCB0aW1lIGZsYWcgdG8gZGlzYWJsZSBqb3VybmFsaW5nIHRvIGRpc2sgKi8KKyNkZWZpbmUgSkZTX05PSU5URUdSSVRZIDB4MDAwMDAwMTAKKworLyogbW91bnQgdGltZSBmbGFncyBmb3IgZXJyb3IgaGFuZGxpbmcgKi8KKyNkZWZpbmUgSkZTX0VSUl9SRU1PVU5UX1JPIDB4MDAwMDAwMDIgICAvKiByZW1vdW50IHJlYWQtb25seSAqLworI2RlZmluZSBKRlNfRVJSX0NPTlRJTlVFICAgMHgwMDAwMDAwNCAgIC8qIGNvbnRpbnVlICovCisjZGVmaW5lIEpGU19FUlJfUEFOSUMgICAgICAweDAwMDAwMDA4ICAgLyogcGFuaWMgKi8KKworLyogcGxhdGZvcm0gb3B0aW9uIChjb25kaXRpb25hbCBjb21waWxhdGlvbikgKi8KKyNkZWZpbmUgSkZTX0FJWAkJMHg4MDAwMDAwMAkvKiBBSVggc3VwcG9ydCAqLworLyoJUE9TSVggbmFtZS9kaXJlY3RvcnkgIHN1cHBvcnQgKi8KKworI2RlZmluZSBKRlNfT1MyCQkweDQwMDAwMDAwCS8qIE9TLzIgc3VwcG9ydCAqLworLyoJY2FzZS1pbnNlbnNpdGl2ZSBuYW1lL2RpcmVjdG9yeSBzdXBwb3J0ICovCisKKyNkZWZpbmUgSkZTX0RGUwkJMHgyMDAwMDAwMAkvKiBEQ0UgREZTIExGUyBzdXBwb3J0ICovCisKKyNkZWZpbmUgSkZTX0xJTlVYICAgICAgCTB4MTAwMDAwMDAJLyogTGludXggc3VwcG9ydCAqLworLyoJY2FzZS1zZW5zaXRpdmUgbmFtZS9kaXJlY3Rvcnkgc3VwcG9ydCAqLworCisvKiBkaXJlY3Rvcnkgb3B0aW9uICovCisjZGVmaW5lIEpGU19VTklDT0RFCTB4MDAwMDAwMDEJLyogdW5pY29kZSBuYW1lICovCisKKy8qIGNvbW1pdCBvcHRpb24gKi8KKyNkZWZpbmUJSkZTX0NPTU1JVAkweDAwMDAwZjAwCS8qIGNvbW1pdCBvcHRpb24gbWFzayAqLworI2RlZmluZQlKRlNfR1JPVVBDT01NSVQJMHgwMDAwMDEwMAkvKiBncm91cCAob2YgMSkgY29tbWl0ICovCisjZGVmaW5lCUpGU19MQVpZQ09NTUlUCTB4MDAwMDAyMDAJLyogbGF6eSBjb21taXQgKi8KKyNkZWZpbmUJSkZTX1RNUEZTCTB4MDAwMDA0MDAJLyogdGVtcG9yYXJ5IGZpbGUgc3lzdGVtIC0gCisJCQkJCSAqIGRvIG5vdCBsb2cvY29tbWl0OgorCQkJCQkgKi8KKworLyogbG9nIGxvZ2ljYWwgdm9sdW1lIG9wdGlvbiAqLworI2RlZmluZQlKRlNfSU5MSU5FTE9HCTB4MDAwMDA4MDAJLyogaW5saW5lIGxvZyB3aXRoaW4gZmlsZSBzeXN0ZW0gKi8KKyNkZWZpbmUgSkZTX0lOTElORU1PVkUJMHgwMDAwMTAwMAkvKiBpbmxpbmUgbG9nIGJlaW5nIG1vdmVkICovCisKKy8qIFNlY29uZGFyeSBhZ2dyZWdhdGUgaW5vZGUgdGFibGUgKi8KKyNkZWZpbmUgSkZTX0JBRF9TQUlUCTB4MDAwMTAwMDAJLyogY3VycmVudCBzZWNvbmRhcnkgYWl0IGlzIGJhZCAqLworCisvKiBzcGFyc2UgcmVndWxhciBmaWxlIHN1cHBvcnQgKi8KKyNkZWZpbmUgSkZTX1NQQVJTRQkweDAwMDIwMDAwCS8qIHNwYXJzZSByZWd1bGFyIGZpbGUgKi8KKworLyogREFTRCBMaW1pdHMJCUYyMjY5NDEgKi8KKyNkZWZpbmUgSkZTX0RBU0RfRU5BQkxFRAkweDAwMDQwMDAwCS8qIERBU0QgbGltaXRzIGVuYWJsZWQgKi8KKyNkZWZpbmUJSkZTX0RBU0RfUFJJTUUJCTB4MDAwODAwMDAJLyogUHJpbWUgREFTRCB1c2FnZSBvbiBib290ICovCisKKy8qIGJpZyBlbmRpYW4gZmxhZyAqLworI2RlZmluZQlKRlNfU1dBUF9CWVRFUwkJMHgwMDEwMDAwMAkvKiBydW5uaW5nIG9uIGJpZyBlbmRpYW4gY29tcHV0ZXIgKi8KKworLyogRGlyZWN0b3J5IGluZGV4ICovCisjZGVmaW5lIEpGU19ESVJfSU5ERVgJCTB4MDAyMDAwMDAJLyogUGVyc2lzdGFudCBpbmRleCBmb3IgKi8KKwkJCQkJCS8qIGRpcmVjdG9yeSBlbnRyaWVzICAgICovCisKKworLyoKKyAqCWJ1ZmZlciBjYWNoZSBjb25maWd1cmF0aW9uCisgKi8KKy8qIHBhZ2Ugc2l6ZSAqLworI2lmZGVmIFBTSVpFCisjdW5kZWYgUFNJWkUKKyNlbmRpZgorI2RlZmluZQlQU0laRQkJNDA5NgkvKiBwYWdlIHNpemUgKGluIGJ5dGUpICovCisjZGVmaW5lCUwyUFNJWkUJCTEyCS8qIGxvZzIoUFNJWkUpICovCisjZGVmaW5lCVBPRkZTRVQJCTQwOTUJLyogb2Zmc2V0IHdpdGhpbiBwYWdlICovCisKKy8qIGJ1ZmZlciBwYWdlIHNpemUgKi8KKyNkZWZpbmUgQlBTSVpFCVBTSVpFCisKKy8qCisgKglmcyBmdW5kYW1lbnRhbCBzaXplCisgKgorICogUFNJWkUgPj0gZmlsZSBzeXN0ZW0gYmxvY2sgc2l6ZSA+PSBQQlNJWkUgPj0gRElTSVpFCisgKi8KKyNkZWZpbmUJUEJTSVpFCQk1MTIJLyogcGh5c2ljYWwgYmxvY2sgc2l6ZSAoaW4gYnl0ZSkgKi8KKyNkZWZpbmUJTDJQQlNJWkUJOQkvKiBsb2cyKFBCU0laRSkgKi8KKworI2RlZmluZSBESVNJWkUJCTUxMgkvKiBvbi1kaXNrIGlub2RlIHNpemUgKGluIGJ5dGUpICovCisjZGVmaW5lIEwyRElTSVpFCTkJLyogbG9nMihESVNJWkUpICovCisKKyNkZWZpbmUgSURBVEFTSVpFCTI1NgkvKiBpbm9kZSBpbmxpbmUgZGF0YSBzaXplICovCisjZGVmaW5lCUlYQVRUUlNJWkUJMTI4CS8qIGlub2RlIGlubGluZSBleHRlbmRlZCBhdHRyaWJ1dGUgc2l6ZSAqLworCisjZGVmaW5lIFhUUEFHRV9TSVpFICAgICA0MDk2CisjZGVmaW5lIGxvZzJfUEFHRVNJWkUgICAgIDEyCisKKyNkZWZpbmUgSUFHX1NJWkUgICAgICAgIDQwOTYKKyNkZWZpbmUgSUFHX0VYVEVOVF9TSVpFIDQwOTYKKyNkZWZpbmUJSU5PU1BFUklBRwk0MDk2CS8qIG51bWJlciBvZiBkaXNrIGlub2RlcyBwZXIgaWFnICovCisjZGVmaW5lCUwySU5PU1BFUklBRwkxMgkvKiBsMiBudW1iZXIgb2YgZGlzayBpbm9kZXMgcGVyIGlhZyAqLworI2RlZmluZSBJTk9TUEVSRVhUCTMyCS8qIG51bWJlciBvZiBkaXNrIGlub2RlIHBlciBleHRlbnQgKi8KKyNkZWZpbmUgTDJJTk9TUEVSRVhUCTUJLyogbDIgbnVtYmVyIG9mIGRpc2sgaW5vZGUgcGVyIGV4dGVudCAqLworI2RlZmluZQlJWFNJWkUJCShESVNJWkUgKiBJTk9TUEVSRVhUKQkvKiBpbm9kZSBleHRlbnQgc2l6ZSAqLworI2RlZmluZQlJTk9TUEVSUEFHRQk4CS8qIG51bWJlciBvZiBkaXNrIGlub2RlcyBwZXIgNEsgcGFnZSAqLworI2RlZmluZQlMMklOT1NQRVJQQUdFCTMJLyogbG9nMihJTk9TUEVSUEFHRSkgKi8KKworI2RlZmluZQlJQUdGUkVFTElTVF9MV00JNjQKKworI2RlZmluZSBJTk9ERV9FWFRFTlRfU0laRQlJWFNJWkUJLyogaW5vZGUgZXh0ZW50IHNpemUgKi8KKyNkZWZpbmUgTlVNX0lOT0RFX1BFUl9FWFRFTlQJSU5PU1BFUkVYVAorI2RlZmluZSBOVU1fSU5PREVfUEVSX0lBRwlJTk9TUEVSSUFHCisKKyNkZWZpbmUgTUlOQkxPQ0tTSVpFCQk1MTIKKyNkZWZpbmUgTUFYQkxPQ0tTSVpFCQk0MDk2CisjZGVmaW5lCU1BWEZJTEVTSVpFCQkoKHM2NCkxIDw8IDUyKQorCisjZGVmaW5lIEpGU19MSU5LX01BWAkJMHhmZmZmZmZmZgorCisvKiBNaW5pbXVtIG51bWJlciBvZiBieXRlcyBzdXBwb3J0ZWQgZm9yIGEgSkZTIHBhcnRpdGlvbiAqLworI2RlZmluZSBNSU5KRlMJCQkoMHgxMDAwMDAwKQorI2RlZmluZSBNSU5KRlNURVhUCQkiMTYiCisKKy8qCisgKiBmaWxlIHN5c3RlbSBibG9jayBzaXplIC0+IHBoeXNpY2FsIGJsb2NrIHNpemUKKyAqLworI2RlZmluZSBMQk9GRlNFVCh4KQkoKHgpICYgKFBCU0laRSAtIDEpKQorI2RlZmluZSBMQk5VTUJFUih4KQkoKHgpID4+IEwyUEJTSVpFKQorI2RlZmluZQlMQkxLMlBCTEsoc2IsYikJKChiKSA8PCAoc2ItPnNfYmxvY2tzaXplX2JpdHMgLSBMMlBCU0laRSkpCisjZGVmaW5lCVBCTEsyTEJMSyhzYixiKQkoKGIpID4+IChzYi0+c19ibG9ja3NpemVfYml0cyAtIEwyUEJTSVpFKSkKKy8qIHNpemUgaW4gYnl0ZSAtPiBsYXN0IHBhZ2UgbnVtYmVyICovCisjZGVmaW5lCVNJWkUyUE4oc2l6ZSkJKCAoKHM2NCkoKHNpemUpIC0gMSkpID4+IChMMlBTSVpFKSApCisvKiBzaXplIGluIGJ5dGUgLT4gbGFzdCBmaWxlIHN5c3RlbSBibG9jayBudW1iZXIgKi8KKyNkZWZpbmUJU0laRTJCTihzaXplLCBsMmJzaXplKSAoICgoczY0KSgoc2l6ZSkgLSAxKSkgPj4gKGwyYnNpemUpICkKKworLyoKKyAqIGZpeGVkIHBoeXNpY2FsIGJsb2NrIGFkZHJlc3MgKHBoeXNpY2FsIGJsb2NrIHNpemUgPSA1MTIgYnl0ZSkKKyAqCisgKiBOT1RFOiBzaW5jZSB3ZSBjYW4ndCBndWFyYW50ZWUgYSBwaHlzaWNhbCBibG9jayBzaXplIG9mIDUxMiBieXRlcyB0aGUgdXNlIG9mCisgKgkgdGhlc2UgbWFjcm9zIHNob3VsZCBiZSByZW1vdmVkIGFuZCB0aGUgYnl0ZSBvZmZzZXQgbWFjcm9zIHVzZWQgaW5zdGVhZC4KKyAqLworI2RlZmluZSBTVVBFUjFfQgk2NAkvKiBwcmltYXJ5IHN1cGVyYmxvY2sgKi8KKyNkZWZpbmUJQUlNQVBfQgkJKFNVUEVSMV9CICsgOCkJLyogMXN0IGV4dGVudCBvZiBhZ2dyZWdhdGUgaW5vZGUgbWFwICovCisjZGVmaW5lCUFJVEJMX0IJCShBSU1BUF9CICsgMTYpCS8qCisJCQkJCSAqIDFzdCBleHRlbnQgb2YgYWdncmVnYXRlIGlub2RlIHRhYmxlCisJCQkJCSAqLworI2RlZmluZQlTVVBFUjJfQgkoQUlUQkxfQiArIDMyKQkvKiAybmRhcnkgc3VwZXJibG9jayBwYm4gKi8KKyNkZWZpbmUJQk1BUF9CCQkoU1VQRVIyX0IgKyA4KQkvKiBibG9jayBhbGxvY2F0aW9uIG1hcCAqLworCisvKgorICogU0laRV9PRl9TVVBFUiBkZWZpbmVzIHRoZSB0b3RhbCBhbW91bnQgb2Ygc3BhY2UgcmVzZXJ2ZWQgb24gZGlzayBmb3IgdGhlCisgKiBzdXBlcmJsb2NrLiAgVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHN1cGVyYmxvY2sgc3RydWN0dXJlLCBzaW5jZSBhbGwgb2YKKyAqIHRoaXMgc3BhY2UgaXMgbm90IGN1cnJlbnRseSBiZWluZyB1c2VkLgorICovCisjZGVmaW5lIFNJWkVfT0ZfU1VQRVIJUFNJWkUKKworLyoKKyAqIFNJWkVfT0ZfQUdfVEFCTEUgZGVmaW5lcyB0aGUgYW1vdW50IG9mIHNwYWNlIHJlc2VydmVkIHRvIGhvbGQgdGhlIEFHIHRhYmxlCisgKi8KKyNkZWZpbmUgU0laRV9PRl9BR19UQUJMRQlQU0laRQorCisvKgorICogU0laRV9PRl9NQVBfUEFHRSBkZWZpbmVzIHRoZSBhbW91bnQgb2YgZGlzayBzcGFjZSByZXNlcnZlZCBmb3IgZWFjaCBwYWdlIG9mCisgKiB0aGUgaW5vZGUgYWxsb2NhdGlvbiBtYXAgKHRvIGhvbGQgaWFnKQorICovCisjZGVmaW5lIFNJWkVfT0ZfTUFQX1BBR0UJUFNJWkUKKworLyoKKyAqIGZpeGVkIGJ5dGUgb2Zmc2V0IGFkZHJlc3MKKyAqLworI2RlZmluZSBTVVBFUjFfT0ZGCTB4ODAwMAkvKiBwcmltYXJ5IHN1cGVyYmxvY2sgKi8KKyNkZWZpbmUgQUlNQVBfT0ZGCShTVVBFUjFfT0ZGICsgU0laRV9PRl9TVVBFUikKKwkJCQkJLyoKKwkJCQkJICogQ29udHJvbCBwYWdlIG9mIGFnZ3JlZ2F0ZSBpbm9kZSBtYXAKKwkJCQkJICogZm9sbG93ZWQgYnkgMXN0IGV4dGVudCBvZiBtYXAKKwkJCQkJICovCisjZGVmaW5lIEFJVEJMX09GRgkoQUlNQVBfT0ZGICsgKFNJWkVfT0ZfTUFQX1BBR0UgPDwgMSkpCisJCQkJCS8qIAorCQkJCQkgKiAxc3QgZXh0ZW50IG9mIGFnZ3JlZ2F0ZSBpbm9kZSB0YWJsZQorCQkJCQkgKi8KKyNkZWZpbmUgU1VQRVIyX09GRgkoQUlUQkxfT0ZGICsgSU5PREVfRVhURU5UX1NJWkUpCisJCQkJCS8qCisJCQkJCSAqIHNlY29uZGFyeSBzdXBlcmJsb2NrCisJCQkJCSAqLworI2RlZmluZSBCTUFQX09GRgkoU1VQRVIyX09GRiArIFNJWkVfT0ZfU1VQRVIpCisJCQkJCS8qCisJCQkJCSAqIGJsb2NrIGFsbG9jYXRpb24gbWFwCisJCQkJCSAqLworCisvKgorICogVGhlIGZvbGxvd2luZyBtYWNybyBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBudW1iZXIgb2YgcmVzZXJ2ZWQgZGlzayBibG9ja3MgYXQKKyAqIHRoZSBmcm9udCBvZiBhbiBhZ2dyZWdhdGUsIGluIHRlcm1zIG9mIHBoeXNpY2FsIGJsb2Nrcy4gIFRoaXMgdmFsdWUgaXMKKyAqIGN1cnJlbnRseSBkZWZpbmVkIHRvIGJlIDMySy4gIFRoaXMgdHVybnMgb3V0IHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBwcmltYXJ5CisgKiBzdXBlcmJsb2NrJ3MgYWRkcmVzcywgc2luY2UgaXQgZGlyZWN0bHkgZm9sbG93cyB0aGUgcmVzZXJ2ZWQgYmxvY2tzLgorICovCisjZGVmaW5lIEFHR1JfUlNWRF9CTE9DS1MJU1VQRVIxX0IKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIHJlc2VydmVkIGJ5dGVzIGF0IHRoZQorICogZnJvbnQgb2YgYW4gYWdncmVnYXRlLiAgVGhpcyB2YWx1ZSBpcyBjdXJyZW50bHkgZGVmaW5lZCB0byBiZSAzMksuICBUaGlzCisgKiB0dXJucyBvdXQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHByaW1hcnkgc3VwZXJibG9jaydzIGJ5dGUgb2Zmc2V0LCBzaW5jZSBpdAorICogZGlyZWN0bHkgZm9sbG93cyB0aGUgcmVzZXJ2ZWQgYmxvY2tzLgorICovCisjZGVmaW5lIEFHR1JfUlNWRF9CWVRFUwlTVVBFUjFfT0ZGCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIG1hY3JvIGRlZmluZXMgdGhlIGJ5dGUgb2Zmc2V0IGZvciB0aGUgZmlyc3QgaW5vZGUgZXh0ZW50IGluCisgKiB0aGUgYWdncmVnYXRlIGlub2RlIHRhYmxlLiAgVGhpcyBhbGxvd3MgdXMgdG8gZmluZCB0aGUgc2VsZiBpbm9kZSB0byBmaW5kIHRoZQorICogcmVzdCBvZiB0aGUgdGFibGUuICBDdXJyZW50bHkgdGhpcyB2YWx1ZSBpcyA0NEsuCisgKi8KKyNkZWZpbmUgQUdHUl9JTk9ERV9UQUJMRV9TVEFSVAlBSVRCTF9PRkYKKworLyoKKyAqCWZpeGVkIHJlc2VydmVkIGlub2RlIG51bWJlcgorICovCisvKiBhZ2dyZWdhdGUgaW5vZGUgKi8KKyNkZWZpbmUgQUdHUl9SRVNFUlZFRF9JCTAJLyogYWdncmVnYXRlIGlub2RlIChyZXNlcnZlZCkgKi8KKyNkZWZpbmUJQUdHUkVHQVRFX0kJMQkvKiBhZ2dyZWdhdGUgaW5vZGUgbWFwIGlub2RlICovCisjZGVmaW5lCUJNQVBfSQkJMgkvKiBhZ2dyZWdhdGUgYmxvY2sgYWxsb2NhdGlvbiBtYXAgaW5vZGUgKi8KKyNkZWZpbmUJTE9HX0kJCTMJLyogYWdncmVnYXRlIGlubGluZSBsb2cgaW5vZGUgKi8KKyNkZWZpbmUgQkFEQkxPQ0tfSQk0CS8qIGFnZ3JlZ2F0ZSBiYWQgYmxvY2sgaW5vZGUgKi8KKyNkZWZpbmUJRklMRVNZU1RFTV9JCTE2CS8qIDFzdC9vbmx5IGZpbGVzZXQgaW5vZGUgaW4gYWl0OgorCQkJCSAqIGZpbGVzZXQgaW5vZGUgbWFwIGlub2RlCisJCQkJICovCisKKy8qIHBlciBmaWxlc2V0IGlub2RlICovCisjZGVmaW5lIEZJTEVTRVRfUlNWRF9JCTAJLyogZmlsZXNldCBpbm9kZSAocmVzZXJ2ZWQpICovCisjZGVmaW5lIEZJTEVTRVRfRVhUX0kJMQkvKiBmaWxlc2V0IGlub2RlIGV4dGVuc2lvbiAqLworI2RlZmluZQlST09UX0kJCTIJLyogZmlsZXNldCByb290IGlub2RlICovCisjZGVmaW5lIEFDTF9JCQkzCS8qIGZpbGVzZXQgQUNMIGlub2RlICovCisKKyNkZWZpbmUgRklMRVNFVF9PQkpFQ1RfSSA0CS8qIHRoZSBmaXJzdCBmaWxlc2V0IGlub2RlIGF2YWlsYWJsZSBmb3IgYSBmaWxlCisJCQkJICogb3IgZGlyZWN0b3J5IG9yIGxpbmsuLi4KKwkJCQkgKi8KKyNkZWZpbmUgRklSU1RfRklMRVNFVF9JTk8gMTYJLyogdGhlIGZpcnN0IGFnZ3JlZ2F0ZSBpbm9kZSB3aGljaCBkZXNjcmliZXMKKwkJCQkgKiBhbiBpbm9kZS4gIChUbyBmc2NrIHRoaXMgaXMgYWxzbyB0aGUgZmlyc3QKKwkJCQkgKiBpbm9kZSBpbiBwYXJ0IDIgb2YgdGhlIGFnZyBpbm9kZSB0YWJsZS4pCisJCQkJICovCisKKy8qCisgKglkaXJlY3RvcnkgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIEpGU19OQU1FX01BWAkyNTUKKyNkZWZpbmUgSkZTX1BBVEhfTUFYCUJQU0laRQorCisKKy8qCisgKglmaWxlIHN5c3RlbSBzdGF0ZSAoc3VwZXJibG9jayBzdGF0ZSkKKyAqLworI2RlZmluZSBGTV9DTEVBTiAweDAwMDAwMDAwCS8qIGZpbGUgc3lzdGVtIGlzIHVubW91bnRlZCBhbmQgY2xlYW4gKi8KKyNkZWZpbmUgRk1fTU9VTlQgMHgwMDAwMDAwMQkvKiBmaWxlIHN5c3RlbSBpcyBtb3VudGVkIGNsZWFubHkgKi8KKyNkZWZpbmUgRk1fRElSVFkgMHgwMDAwMDAwMgkvKiBmaWxlIHN5c3RlbSB3YXMgbm90IHVubW91bnRlZCBhbmQgY2xlYW4gCisJCQkJICogd2hlbiBtb3VudGVkIG9yIAorCQkJCSAqIGNvbW1pdCBmYWlsdXJlIG9jY3VycmVkIHdoaWxlIGJlaW5nIG1vdW50ZWQ6CisJCQkJICogZnNjaygpIG11c3QgYmUgcnVuIHRvIHJlcGFpciAKKwkJCQkgKi8KKyNkZWZpbmUJRk1fTE9HUkVETyAweDAwMDAwMDA0CS8qIGxvZyBiYXNlZCByZWNvdmVyeSAobG9ncmVkbygpKSBmYWlsZWQ6CisJCQkJICogZnNjaygpIG11c3QgYmUgcnVuIHRvIHJlcGFpciAKKwkJCQkgKi8KKyNkZWZpbmUJRk1fRVhURU5ERlMgMHgwMDAwMDAwOAkvKiBmaWxlIHN5c3RlbSBleHRlbmRmcygpIGluIHByb2dyZXNzICovCisKKyNlbmRpZgkJCQkvKiBfSF9KRlNfRklMU1lTICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2ltYXAuYyBiL2ZzL2pmcy9qZnNfaW1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MzgzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX2ltYXAuYwpAQCAtMCwwICsxLDMyNzAgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDA0CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqCWpmc19pbWFwLmM6IGlub2RlIGFsbG9jYXRpb24gbWFwIG1hbmFnZXIKKyAqCisgKiBTZXJpYWxpemF0aW9uOgorICogICBFYWNoIEFHIGhhcyBhIHNpbXBsZSBsb2NrIHdoaWNoIGlzIHVzZWQgdG8gY29udHJvbCB0aGUgc2VyaWFsaXphdGlvbiBvZgorICoJdGhlIEFHIGxldmVsIGxpc3RzLiAgVGhpcyBsb2NrIHNob3VsZCBiZSB0YWtlbiBmaXJzdCB3aGVuZXZlciBhbiBBRworICoJbGV2ZWwgbGlzdCB3aWxsIGJlIG1vZGlmaWVkIG9yIGFjY2Vzc2VkLgorICoKKyAqICAgRWFjaCBJQUcgaXMgbG9ja2VkIGJ5IG9idGFpbmluZyB0aGUgYnVmZmVyIGZvciB0aGUgSUFHIHBhZ2UuCisgKgorICogICBUaGVyZSBpcyBhbHNvIGEgaW5vZGUgbG9jayBmb3IgdGhlIGlub2RlIG1hcCBpbm9kZS4gIEEgcmVhZCBsb2NrIG5lZWRzIHRvCisgKgliZSB0YWtlbiB3aGVuZXZlciBhbiBJQUcgaXMgcmVhZCBmcm9tIHRoZSBtYXAgb3IgdGhlIGdsb2JhbCBsZXZlbAorICoJaW5mb3JtYXRpb24gaXMgcmVhZC4gIEEgd3JpdGUgbG9jayBuZWVkcyB0byBiZSB0YWtlbiB3aGVuZXZlciB0aGUgZ2xvYmFsCisgKglsZXZlbCBpbmZvcm1hdGlvbiBpcyBtb2RpZmllZCBvciBhbiBhdG9taWMgb3BlcmF0aW9uIG5lZWRzIHRvIGJlIHVzZWQuCisgKgorICoJSWYgbW9yZSB0aGFuIG9uZSBJQUcgaXMgcmVhZCBhdCBvbmUgdGltZSwgdGhlIHJlYWQgbG9jayBtYXkgbm90CisgKgliZSBnaXZlbiB1cCB1bnRpbCBhbGwgb2YgdGhlIElBRydzIGFyZSByZWFkLiAgT3RoZXJ3aXNlLCBhIGRlYWRsb2NrCisgKgltYXkgb2NjdXIgd2hlbiB0cnlpbmcgdG8gb2J0YWluIHRoZSByZWFkIGxvY2sgd2hpbGUgYW5vdGhlciB0aHJlYWQKKyAqCWhvbGRpbmcgdGhlIHJlYWQgbG9jayBpcyB3YWl0aW5nIG9uIHRoZSBJQUcgYWxyZWFkeSBiZWluZyBoZWxkLgorICoKKyAqICAgVGhlIGNvbnRyb2wgcGFnZSBvZiB0aGUgaW5vZGUgbWFwIGlzIHJlYWQgaW50byBtZW1vcnkgYnkgZGlNb3VudCgpLgorICoJVGhlcmVhZnRlciBpdCBzaG91bGQgb25seSBiZSBtb2RpZmllZCBpbiBtZW1vcnkgYW5kIHRoZW4gaXQgd2lsbCBiZQorICoJd3JpdHRlbiBvdXQgd2hlbiB0aGUgZmlsZXN5c3RlbSBpcyB1bm1vdW50ZWQgYnkgZGlVbm1vdW50KCkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKworI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKKyNpbmNsdWRlICJqZnNfZmlsc3lzLmgiCisjaW5jbHVkZSAiamZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgImpmc19kbWFwLmgiCisjaW5jbHVkZSAiamZzX2ltYXAuaCIKKyNpbmNsdWRlICJqZnNfbWV0YXBhZ2UuaCIKKyNpbmNsdWRlICJqZnNfc3VwZXJibG9jay5oIgorI2luY2x1ZGUgImpmc19kZWJ1Zy5oIgorCisvKgorICogaW1hcCBsb2NrcworICovCisvKiBpYWcgZnJlZSBsaXN0IGxvY2sgKi8KKyNkZWZpbmUgSUFHRlJFRV9MT0NLX0lOSVQoaW1hcCkJCWluaXRfTVVURVgoJmltYXAtPmltX2ZyZWVsb2NrKQorI2RlZmluZSBJQUdGUkVFX0xPQ0soaW1hcCkJCWRvd24oJmltYXAtPmltX2ZyZWVsb2NrKQorI2RlZmluZSBJQUdGUkVFX1VOTE9DSyhpbWFwKQkJdXAoJmltYXAtPmltX2ZyZWVsb2NrKQorCisvKiBwZXIgYWcgaWFnIGxpc3QgbG9ja3MgKi8KKyNkZWZpbmUgQUdfTE9DS19JTklUKGltYXAsaW5kZXgpCWluaXRfTVVURVgoJihpbWFwLT5pbV9hZ2xvY2tbaW5kZXhdKSkKKyNkZWZpbmUgQUdfTE9DSyhpbWFwLGFnbm8pCQlkb3duKCZpbWFwLT5pbV9hZ2xvY2tbYWdub10pCisjZGVmaW5lIEFHX1VOTE9DSyhpbWFwLGFnbm8pCQl1cCgmaW1hcC0+aW1fYWdsb2NrW2Fnbm9dKQorCisvKgorICogZXh0ZXJuYWwgcmVmZXJlbmNlcworICovCitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBqZnNfYW9wczsKKworLyoKKyAqIGZvcndhcmQgcmVmZXJlbmNlcworICovCitzdGF0aWMgaW50IGRpQWxsb2NBRyhzdHJ1Y3QgaW5vbWFwICosIGludCwgYm9vbGVhbl90LCBzdHJ1Y3QgaW5vZGUgKik7CitzdGF0aWMgaW50IGRpQWxsb2NBbnkoc3RydWN0IGlub21hcCAqLCBpbnQsIGJvb2xlYW5fdCwgc3RydWN0IGlub2RlICopOworc3RhdGljIGludCBkaUFsbG9jQml0KHN0cnVjdCBpbm9tYXAgKiwgc3RydWN0IGlhZyAqLCBpbnQpOworc3RhdGljIGludCBkaUFsbG9jRXh0KHN0cnVjdCBpbm9tYXAgKiwgaW50LCBzdHJ1Y3QgaW5vZGUgKik7CitzdGF0aWMgaW50IGRpQWxsb2NJbm8oc3RydWN0IGlub21hcCAqLCBpbnQsIHN0cnVjdCBpbm9kZSAqKTsKK3N0YXRpYyBpbnQgZGlGaW5kRnJlZSh1MzIsIGludCk7CitzdGF0aWMgaW50IGRpTmV3RXh0KHN0cnVjdCBpbm9tYXAgKiwgc3RydWN0IGlhZyAqLCBpbnQpOworc3RhdGljIGludCBkaU5ld0lBRyhzdHJ1Y3QgaW5vbWFwICosIGludCAqLCBpbnQsIHN0cnVjdCBtZXRhcGFnZSAqKik7CitzdGF0aWMgdm9pZCBkdXBsaWNhdGVJWHRyZWUoc3RydWN0IHN1cGVyX2Jsb2NrICosIHM2NCwgaW50LCBzNjQgKik7CisKK3N0YXRpYyBpbnQgZGlJQUdSZWFkKHN0cnVjdCBpbm9tYXAgKiBpbWFwLCBpbnQsIHN0cnVjdCBtZXRhcGFnZSAqKik7CitzdGF0aWMgaW50IGNvcHlfZnJvbV9kaW5vZGUoc3RydWN0IGRpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CitzdGF0aWMgdm9pZCBjb3B5X3RvX2Rpbm9kZShzdHJ1Y3QgZGlub2RlICosIHN0cnVjdCBpbm9kZSAqKTsKKworLyoKKyAqCWRlYnVnIGNvZGUgZm9yIGRvdWJsZS1jaGVja2luZyBpbm9kZSBtYXAKKyAqLworLyogI2RlZmluZQlfSkZTX0RFQlVHX0lNQVAJMSAqLworCisjaWZkZWYJX0pGU19ERUJVR19JTUFQCisjZGVmaW5lIERCR19ESUlOSVQoaW1hcCkJREJHZGlJbml0KGltYXApCisjZGVmaW5lIERCR19ESUFMTE9DKGltYXAsIGlubykJREJHZGlBbGxvYyhpbWFwLCBpbm8pCisjZGVmaW5lIERCR19ESUZSRUUoaW1hcCwgaW5vKQlEQkdkaUZyZWUoaW1hcCwgaW5vKQorCitzdGF0aWMgdm9pZCAqREJHZGlJbml0KHN0cnVjdCBpbm9tYXAgKiBpbWFwKTsKK3N0YXRpYyB2b2lkIERCR2RpQWxsb2Moc3RydWN0IGlub21hcCAqIGltYXAsIGlub190IGlubyk7CitzdGF0aWMgdm9pZCBEQkdkaUZyZWUoc3RydWN0IGlub21hcCAqIGltYXAsIGlub190IGlubyk7CisjZWxzZQorI2RlZmluZSBEQkdfRElJTklUKGltYXApCisjZGVmaW5lIERCR19ESUFMTE9DKGltYXAsIGlubykKKyNkZWZpbmUgREJHX0RJRlJFRShpbWFwLCBpbm8pCisjZW5kaWYJCQkJLyogX0pGU19ERUJVR19JTUFQICovCisKKy8qCisgKiBOQU1FOiAgICAgICAgZGlNb3VudCgpCisgKgorICogRlVOQ1RJT046ICAgIGluaXRpYWxpemUgdGhlIGluY29yZSBpbm9kZSBtYXAgY29udHJvbCBzdHJ1Y3R1cmVzIGZvcgorICoJCWEgZmlsZXNldCBvciBhZ2dyZWdhdGUgaW5pdCB0aW1lLgorICoKKyAqICAgICAgICAgICAgICB0aGUgaW5vZGUgbWFwJ3MgY29udHJvbCBzdHJ1Y3R1cmUgKGRpbm9tYXApIGlzIAorICogICAgICAgICAgICAgIGJyb3VnaHQgaW4gZnJvbSBkaXNrIGFuZCBwbGFjZWQgaW4gdmlydHVhbCBtZW1vcnkuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgaXBpbWFwICAtIHBvaW50ZXIgdG8gaW5vZGUgbWFwIGlub2RlIGZvciB0aGUgYWdncmVnYXRlIG9yIGZpbGVzZXQuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMCAgICAgICAtIHN1Y2Nlc3MKKyAqICAgICAgLUVOT01FTSAgLSBpbnN1ZmZpY2llbnQgZnJlZSB2aXJ0dWFsIG1lbW9yeS4KKyAqICAgICAgLUVJTyAgCS0gaS9vIGVycm9yLgorICovCitpbnQgZGlNb3VudChzdHJ1Y3QgaW5vZGUgKmlwaW1hcCkKK3sKKwlzdHJ1Y3QgaW5vbWFwICppbWFwOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJaW50IGluZGV4OworCXN0cnVjdCBkaW5vbWFwX2Rpc2sgKmRpbm9tX2xlOworCisJLyoKKwkgKiBhbGxvY2F0ZS9pbml0aWFsaXplIHRoZSBpbi1tZW1vcnkgaW5vZGUgbWFwIGNvbnRyb2wgc3RydWN0dXJlCisJICovCisJLyogYWxsb2NhdGUgdGhlIGluLW1lbW9yeSBpbm9kZSBtYXAgY29udHJvbCBzdHJ1Y3R1cmUuICovCisJaW1hcCA9IChzdHJ1Y3QgaW5vbWFwICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbm9tYXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoaW1hcCA9PSBOVUxMKSB7CisJCWpmc19lcnIoImRpTW91bnQ6IGttYWxsb2MgcmV0dXJuZWQgTlVMTCEiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogcmVhZCB0aGUgb24tZGlzayBpbm9kZSBtYXAgY29udHJvbCBzdHJ1Y3R1cmUuICovCisKKwltcCA9IHJlYWRfbWV0YXBhZ2UoaXBpbWFwLAorCQkJICAgSU1BUEJMS05PIDw8IEpGU19TQkkoaXBpbWFwLT5pX3NiKS0+bDJuYnBlcnBhZ2UsCisJCQkgICBQU0laRSwgMCk7CisJaWYgKG1wID09IE5VTEwpIHsKKwkJa2ZyZWUoaW1hcCk7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGNvcHkgdGhlIG9uLWRpc2sgdmVyc2lvbiB0byB0aGUgaW4tbWVtb3J5IHZlcnNpb24uICovCisJZGlub21fbGUgPSAoc3RydWN0IGRpbm9tYXBfZGlzayAqKSBtcC0+ZGF0YTsKKwlpbWFwLT5pbV9mcmVlaWFnID0gbGUzMl90b19jcHUoZGlub21fbGUtPmluX2ZyZWVpYWcpOworCWltYXAtPmltX25leHRpYWcgPSBsZTMyX3RvX2NwdShkaW5vbV9sZS0+aW5fbmV4dGlhZyk7CisJYXRvbWljX3NldCgmaW1hcC0+aW1fbnVtaW5vcywgbGUzMl90b19jcHUoZGlub21fbGUtPmluX251bWlub3MpKTsKKwlhdG9taWNfc2V0KCZpbWFwLT5pbV9udW1mcmVlLCBsZTMyX3RvX2NwdShkaW5vbV9sZS0+aW5fbnVtZnJlZSkpOworCWltYXAtPmltX25icGVyaWV4dCA9IGxlMzJfdG9fY3B1KGRpbm9tX2xlLT5pbl9uYnBlcmlleHQpOworCWltYXAtPmltX2wybmJwZXJpZXh0ID0gbGUzMl90b19jcHUoZGlub21fbGUtPmluX2wybmJwZXJpZXh0KTsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhBRzsgaW5kZXgrKykgeworCQlpbWFwLT5pbV9hZ2N0bFtpbmRleF0uaW5vZnJlZSA9CisJCSAgICBsZTMyX3RvX2NwdShkaW5vbV9sZS0+aW5fYWdjdGxbaW5kZXhdLmlub2ZyZWUpOworCQlpbWFwLT5pbV9hZ2N0bFtpbmRleF0uZXh0ZnJlZSA9CisJCSAgICBsZTMyX3RvX2NwdShkaW5vbV9sZS0+aW5fYWdjdGxbaW5kZXhdLmV4dGZyZWUpOworCQlpbWFwLT5pbV9hZ2N0bFtpbmRleF0ubnVtaW5vcyA9CisJCSAgICBsZTMyX3RvX2NwdShkaW5vbV9sZS0+aW5fYWdjdGxbaW5kZXhdLm51bWlub3MpOworCQlpbWFwLT5pbV9hZ2N0bFtpbmRleF0ubnVtZnJlZSA9CisJCSAgICBsZTMyX3RvX2NwdShkaW5vbV9sZS0+aW5fYWdjdGxbaW5kZXhdLm51bWZyZWUpOworCX0KKworCS8qIHJlbGVhc2UgdGhlIGJ1ZmZlci4gKi8KKwlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKworCS8qCisJICogYWxsb2NhdGUvaW5pdGlhbGl6ZSBpbm9kZSBhbGxvY2F0aW9uIG1hcCBsb2NrcworCSAqLworCS8qIGFsbG9jYXRlIGFuZCBpbml0IGlhZyBmcmVlIGxpc3QgbG9jayAqLworCUlBR0ZSRUVfTE9DS19JTklUKGltYXApOworCisJLyogYWxsb2NhdGUgYW5kIGluaXQgYWcgbGlzdCBsb2NrcyAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWEFHOyBpbmRleCsrKSB7CisJCUFHX0xPQ0tfSU5JVChpbWFwLCBpbmRleCk7CisJfQorCisJLyogYmluZCB0aGUgaW5vZGUgbWFwIGlub2RlIGFuZCBpbm9kZSBtYXAgY29udHJvbCBzdHJ1Y3R1cmUKKwkgKiB0byBlYWNoIG90aGVyLgorCSAqLworCWltYXAtPmltX2lwaW1hcCA9IGlwaW1hcDsKKwlKRlNfSVAoaXBpbWFwKS0+aV9pbWFwID0gaW1hcDsKKworLy8gICAgICBEQkdfRElJTklUKGltYXApOworCisJcmV0dXJuICgwKTsKK30KKworCisvKgorICogTkFNRTogICAgICAgIGRpVW5tb3VudCgpCisgKgorICogRlVOQ1RJT046ICAgIHdyaXRlIHRvIGRpc2sgdGhlIGluY29yZSBpbm9kZSBtYXAgY29udHJvbCBzdHJ1Y3R1cmVzIGZvcgorICoJCWEgZmlsZXNldCBvciBhZ2dyZWdhdGUgYXQgdW5tb3VudCB0aW1lLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGlwaW1hcCAgLSBwb2ludGVyIHRvIGlub2RlIG1hcCBpbm9kZSBmb3IgdGhlIGFnZ3JlZ2F0ZSBvciBmaWxlc2V0LgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzCisgKiAgICAgIC1FTk9NRU0gIC0gaW5zdWZmaWNpZW50IGZyZWUgdmlydHVhbCBtZW1vcnkuCisgKiAgICAgIC1FSU8gIAktIGkvbyBlcnJvci4KKyAqLworaW50IGRpVW5tb3VudChzdHJ1Y3QgaW5vZGUgKmlwaW1hcCwgaW50IG1vdW50ZXJyb3IpCit7CisJc3RydWN0IGlub21hcCAqaW1hcCA9IEpGU19JUChpcGltYXApLT5pX2ltYXA7CisKKwkvKgorCSAqIHVwZGF0ZSB0aGUgb24tZGlzayBpbm9kZSBtYXAgY29udHJvbCBzdHJ1Y3R1cmUKKwkgKi8KKworCWlmICghKG1vdW50ZXJyb3IgfHwgaXNSZWFkT25seShpcGltYXApKSkKKwkJZGlTeW5jKGlwaW1hcCk7CisKKwkvKgorCSAqIEludmFsaWRhdGUgdGhlIHBhZ2UgY2FjaGUgYnVmZmVycworCSAqLworCXRydW5jYXRlX2lub2RlX3BhZ2VzKGlwaW1hcC0+aV9tYXBwaW5nLCAwKTsKKworCS8qCisJICogZnJlZSBpbi1tZW1vcnkgY29udHJvbCBzdHJ1Y3R1cmUKKwkgKi8KKwlrZnJlZShpbWFwKTsKKworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqCWRpU3luYygpCisgKi8KK2ludCBkaVN5bmMoc3RydWN0IGlub2RlICppcGltYXApCit7CisJc3RydWN0IGRpbm9tYXBfZGlzayAqZGlub21fbGU7CisJc3RydWN0IGlub21hcCAqaW1wID0gSkZTX0lQKGlwaW1hcCktPmlfaW1hcDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCWludCBpbmRleDsKKworCS8qCisJICogd3JpdGUgaW1hcCBnbG9iYWwgY29ucm9sIHBhZ2UKKwkgKi8KKwkvKiByZWFkIHRoZSBvbi1kaXNrIGlub2RlIG1hcCBjb250cm9sIHN0cnVjdHVyZSAqLworCW1wID0gZ2V0X21ldGFwYWdlKGlwaW1hcCwKKwkJCSAgSU1BUEJMS05PIDw8IEpGU19TQkkoaXBpbWFwLT5pX3NiKS0+bDJuYnBlcnBhZ2UsCisJCQkgIFBTSVpFLCAwKTsKKwlpZiAobXAgPT0gTlVMTCkgeworCQlqZnNfZXJyKCJkaVN5bmM6IGdldF9tZXRhcGFnZSBmYWlsZWQhIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGNvcHkgdGhlIGluLW1lbW9yeSB2ZXJzaW9uIHRvIHRoZSBvbi1kaXNrIHZlcnNpb24gKi8KKwlkaW5vbV9sZSA9IChzdHJ1Y3QgZGlub21hcF9kaXNrICopIG1wLT5kYXRhOworCWRpbm9tX2xlLT5pbl9mcmVlaWFnID0gY3B1X3RvX2xlMzIoaW1wLT5pbV9mcmVlaWFnKTsKKwlkaW5vbV9sZS0+aW5fbmV4dGlhZyA9IGNwdV90b19sZTMyKGltcC0+aW1fbmV4dGlhZyk7CisJZGlub21fbGUtPmluX251bWlub3MgPSBjcHVfdG9fbGUzMihhdG9taWNfcmVhZCgmaW1wLT5pbV9udW1pbm9zKSk7CisJZGlub21fbGUtPmluX251bWZyZWUgPSBjcHVfdG9fbGUzMihhdG9taWNfcmVhZCgmaW1wLT5pbV9udW1mcmVlKSk7CisJZGlub21fbGUtPmluX25icGVyaWV4dCA9IGNwdV90b19sZTMyKGltcC0+aW1fbmJwZXJpZXh0KTsKKwlkaW5vbV9sZS0+aW5fbDJuYnBlcmlleHQgPSBjcHVfdG9fbGUzMihpbXAtPmltX2wybmJwZXJpZXh0KTsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhBRzsgaW5kZXgrKykgeworCQlkaW5vbV9sZS0+aW5fYWdjdGxbaW5kZXhdLmlub2ZyZWUgPQorCQkgICAgY3B1X3RvX2xlMzIoaW1wLT5pbV9hZ2N0bFtpbmRleF0uaW5vZnJlZSk7CisJCWRpbm9tX2xlLT5pbl9hZ2N0bFtpbmRleF0uZXh0ZnJlZSA9CisJCSAgICBjcHVfdG9fbGUzMihpbXAtPmltX2FnY3RsW2luZGV4XS5leHRmcmVlKTsKKwkJZGlub21fbGUtPmluX2FnY3RsW2luZGV4XS5udW1pbm9zID0KKwkJICAgIGNwdV90b19sZTMyKGltcC0+aW1fYWdjdGxbaW5kZXhdLm51bWlub3MpOworCQlkaW5vbV9sZS0+aW5fYWdjdGxbaW5kZXhdLm51bWZyZWUgPQorCQkgICAgY3B1X3RvX2xlMzIoaW1wLT5pbV9hZ2N0bFtpbmRleF0ubnVtZnJlZSk7CisJfQorCisJLyogd3JpdGUgb3V0IHRoZSBjb250cm9sIHN0cnVjdHVyZSAqLworCXdyaXRlX21ldGFwYWdlKG1wKTsKKworCS8qCisJICogd3JpdGUgb3V0IGRpcnR5IHBhZ2VzIG9mIGltYXAKKwkgKi8KKwlmaWxlbWFwX2ZkYXRhd3JpdGUoaXBpbWFwLT5pX21hcHBpbmcpOworCWZpbGVtYXBfZmRhdGF3YWl0KGlwaW1hcC0+aV9tYXBwaW5nKTsKKworCWRpV3JpdGVTcGVjaWFsKGlwaW1hcCwgMCk7CisKKwlyZXR1cm4gKDApOworfQorCisKKy8qCisgKiBOQU1FOiAgICAgICAgZGlSZWFkKCkKKyAqCisgKiBGVU5DVElPTjogICAgaW5pdGlhbGl6ZSBhbiBpbmNvcmUgaW5vZGUgZnJvbSBkaXNrLgorICoKKyAqCQlvbiBlbnRyeSwgdGhlIHNwZWNpZmVkIGluY29yZSBpbm9kZSBzaG91bGQgaXRzZWxmCisgKgkJc3BlY2lmeSB0aGUgZGlzayBpbm9kZSBudW1iZXIgY29ycmVzcG9uZGluZyB0byB0aGUKKyAqCQlpbmNvcmUgaW5vZGUgKGkuZS4gaV9udW1iZXIgc2hvdWxkIGJlIGluaXRpYWxpemVkKS4KKyAqCQkKKyAqCQl0aGlzIHJvdXRpbmUgaGFuZGxlcyBpbmNvcmUgaW5vZGUgaW5pdGlhbGl6YXRpb24gZm9yCisgKgkJYm90aCAic3BlY2lhbCIgYW5kICJyZWd1bGFyIiBpbm9kZXMuICBzcGVjaWFsIGlub2RlcworICoJCWFyZSB0aG9zZSByZXF1aXJlZCBlYXJseSBpbiB0aGUgbW91bnQgcHJvY2VzcyBhbmQKKyAqCSAgICAgICAgcmVxdWlyZSBzcGVjaWFsIGhhbmRsaW5nIHNpbmNlIG11Y2ggb2YgdGhlIGZpbGUgc3lzdGVtCisgKgkJaXMgbm90IHlldCBpbml0aWFsaXplZC4gIHRoZXNlICJzcGVjaWFsIiBpbm9kZXMgYXJlCisgKgkJaWRlbnRpZmllZCBieSBhIE5VTEwgaW5vZGUgbWFwIGlub2RlIHBvaW50ZXIgYW5kIGFyZQorICoJCWFjdHVhbGx5IGluaXRpYWxpemVkIGJ5IGEgY2FsbCB0byBkaVJlYWRTcGVjaWFsKCkuCisgKgkJCisgKgkJZm9yIHJlZ3VsYXIgaW5vZGVzLCB0aGUgaWFnIGRlc2NyaWJpbmcgdGhlIGRpc2sgaW5vZGUKKyAqCQlpcyByZWFkIGZyb20gZGlzayB0byBkZXRlcm1pbmUgdGhlIGlub2RlIGV4dGVudCBhZGRyZXNzCisgKgkJZm9yIHRoZSBkaXNrIGlub2RlLiAgd2l0aCB0aGUgaW5vZGUgZXh0ZW50IGFkZHJlc3MgaW4KKyAqCQloYW5kLCB0aGUgcGFnZSBvZiB0aGUgZXh0ZW50IHRoYXQgY29udGFpbnMgdGhlIGRpc2sKKyAqCQlpbm9kZSBpcyByZWFkIGFuZCB0aGUgZGlzayBpbm9kZSBpcyBjb3BpZWQgdG8gdGhlCisgKgkJaW5jb3JlIGlub2RlLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGlwICAtICBwb2ludGVyIHRvIGluY29yZSBpbm9kZSB0byBiZSBpbml0aWFsaXplZCBmcm9tIGRpc2suCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMCAgICAgICAtIHN1Y2Nlc3MKKyAqICAgICAgLUVJTyAgCS0gaS9vIGVycm9yLgorICogICAgICAtRU5PTUVNCS0gaW5zdWZmaWNpZW50IG1lbW9yeQorICogICAgICAKKyAqLworaW50IGRpUmVhZChzdHJ1Y3QgaW5vZGUgKmlwKQoreworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShpcC0+aV9zYik7CisJaW50IGlhZ25vLCBpbm8sIGV4dG5vLCByYzsKKwlzdHJ1Y3QgaW5vZGUgKmlwaW1hcDsKKwlzdHJ1Y3QgZGlub2RlICpkcDsKKwlzdHJ1Y3QgaWFnICppYWdwOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJczY0IGJsa25vLCBhZ3N0YXJ0OworCXN0cnVjdCBpbm9tYXAgKmltYXA7CisJaW50IGJsb2NrX29mZnNldDsKKwlpbnQgaW5vZGVzX2xlZnQ7CisJdWludCBwYWdlbm87CisJaW50IHJlbF9pbm9kZTsKKworCWpmc19pbmZvKCJkaVJlYWQ6IGlubyA9ICVsZCIsIGlwLT5pX2lubyk7CisKKwlpcGltYXAgPSBzYmktPmlwaW1hcDsKKwlKRlNfSVAoaXApLT5pcGltYXAgPSBpcGltYXA7CisKKwkvKiBkZXRlcm1pbmUgdGhlIGlhZyBudW1iZXIgZm9yIHRoaXMgaW5vZGUgKG51bWJlcikgKi8KKwlpYWdubyA9IElOT1RPSUFHKGlwLT5pX2lubyk7CisKKwkvKiByZWFkIHRoZSBpYWcgKi8KKwlpbWFwID0gSkZTX0lQKGlwaW1hcCktPmlfaW1hcDsKKwlJUkVBRF9MT0NLKGlwaW1hcCk7CisJcmMgPSBkaUlBR1JlYWQoaW1hcCwgaWFnbm8sICZtcCk7CisJSVJFQURfVU5MT0NLKGlwaW1hcCk7CisJaWYgKHJjKSB7CisJCWpmc19lcnIoImRpUmVhZDogZGlJQUdSZWFkIHJldHVybmVkICVkIiwgcmMpOworCQlyZXR1cm4gKHJjKTsKKwl9CisKKwlpYWdwID0gKHN0cnVjdCBpYWcgKikgbXAtPmRhdGE7CisKKwkvKiBkZXRlcm1pbmUgaW5vZGUgZXh0ZW50IHRoYXQgaG9sZHMgdGhlIGRpc2sgaW5vZGUgKi8KKwlpbm8gPSBpcC0+aV9pbm8gJiAoSU5PU1BFUklBRyAtIDEpOworCWV4dG5vID0gaW5vID4+IEwySU5PU1BFUkVYVDsKKworCWlmICgobGVuZ3RoUFhEKCZpYWdwLT5pbm9leHRbZXh0bm9dKSAhPSBpbWFwLT5pbV9uYnBlcmlleHQpIHx8CisJICAgIChhZGRyZXNzUFhEKCZpYWdwLT5pbm9leHRbZXh0bm9dKSA9PSAwKSkgeworCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJcmV0dXJuIC1FU1RBTEU7CisJfQorCisJLyogZ2V0IGRpc2sgYmxvY2sgbnVtYmVyIG9mIHRoZSBwYWdlIHdpdGhpbiB0aGUgaW5vZGUgZXh0ZW50CisJICogdGhhdCBob2xkcyB0aGUgZGlzayBpbm9kZS4KKwkgKi8KKwlibGtubyA9IElOT1BCTEsoJmlhZ3AtPmlub2V4dFtleHRub10sIGlubywgc2JpLT5sMm5icGVycGFnZSk7CisKKwkvKiBnZXQgdGhlIGFnIGZvciB0aGUgaWFnICovCisJYWdzdGFydCA9IGxlNjRfdG9fY3B1KGlhZ3AtPmFnc3RhcnQpOworCisJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisKKwlyZWxfaW5vZGUgPSAoaW5vICYgKElOT1NQRVJQQUdFIC0gMSkpOworCXBhZ2VubyA9IGJsa25vID4+IHNiaS0+bDJuYnBlcnBhZ2U7CisKKwlpZiAoKGJsb2NrX29mZnNldCA9ICgodTMyKSBibGtubyAmIChzYmktPm5icGVycGFnZSAtIDEpKSkpIHsKKwkJLyoKKwkJICogT1MvMiBkaWRuJ3QgYWx3YXlzIGFsaWduIGlub2RlIGV4dGVudHMgb24gcGFnZSBib3VuZGFyaWVzCisJCSAqLworCQlpbm9kZXNfbGVmdCA9CisJCSAgICAgKHNiaS0+bmJwZXJwYWdlIC0gYmxvY2tfb2Zmc2V0KSA8PCBzYmktPmwybmlwZXJibGs7CisKKwkJaWYgKHJlbF9pbm9kZSA8IGlub2Rlc19sZWZ0KQorCQkJcmVsX2lub2RlICs9IGJsb2NrX29mZnNldCA8PCBzYmktPmwybmlwZXJibGs7CisJCWVsc2UgeworCQkJcGFnZW5vICs9IDE7CisJCQlyZWxfaW5vZGUgLT0gaW5vZGVzX2xlZnQ7CisJCX0KKwl9CisKKwkvKiByZWFkIHRoZSBwYWdlIG9mIGRpc2sgaW5vZGUgKi8KKwltcCA9IHJlYWRfbWV0YXBhZ2UoaXBpbWFwLCBwYWdlbm8gPDwgc2JpLT5sMm5icGVycGFnZSwgUFNJWkUsIDEpOworCWlmIChtcCA9PSAwKSB7CisJCWpmc19lcnIoImRpUmVhZDogcmVhZF9tZXRhcGFnZSBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogbG9jYXRlIHRoZSB0aGUgZGlzayBpbm9kZSByZXF1ZXN0ZWQgKi8KKwlkcCA9IChzdHJ1Y3QgZGlub2RlICopIG1wLT5kYXRhOworCWRwICs9IHJlbF9pbm9kZTsKKworCWlmIChpcC0+aV9pbm8gIT0gbGUzMl90b19jcHUoZHAtPmRpX251bWJlcikpIHsKKwkJamZzX2Vycm9yKGlwLT5pX3NiLCAiZGlSZWFkOiBpX2lubyAhPSBkaV9udW1iZXIiKTsKKwkJcmMgPSAtRUlPOworCX0gZWxzZSBpZiAobGUzMl90b19jcHUoZHAtPmRpX25saW5rKSA9PSAwKQorCQlyYyA9IC1FU1RBTEU7CisJZWxzZQorCQkvKiBjb3B5IHRoZSBkaXNrIGlub2RlIHRvIHRoZSBpbi1tZW1vcnkgaW5vZGUgKi8KKwkJcmMgPSBjb3B5X2Zyb21fZGlub2RlKGRwLCBpcCk7CisKKwlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKworCS8qIHNldCB0aGUgYWcgZm9yIHRoZSBpbm9kZSAqLworCUpGU19JUChpcCktPmFnbm8gPSBCTEtUT0FHKGFnc3RhcnQsIHNiaSk7CisJSkZTX0lQKGlwKS0+YWN0aXZlX2FnID0gLTE7CisKKwlyZXR1cm4gKHJjKTsKK30KKworCisvKgorICogTkFNRTogICAgICAgIGRpUmVhZFNwZWNpYWwoKQorICoKKyAqIEZVTkNUSU9OOiAgICBpbml0aWFsaXplIGEgJ3NwZWNpYWwnIGlub2RlIGZyb20gZGlzay4KKyAqCisgKgkJdGhpcyByb3V0aW5lcyBoYW5kbGVzIGFnZ3JlZ2F0ZSBsZXZlbCBpbm9kZXMuICBUaGUKKyAqCQlpbm9kZSBjYWNoZSBjYW5ub3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZQorICoJCWFnZ3JlZ2F0ZSBpbm9kZXMgYW5kIHRoZSBmaWxlc3lzdGVtIGlub2Rlcywgc28gd2UKKyAqCQloYW5kbGUgdGhlc2UgaGVyZS4gIFdlIGRvbid0IGFjdHVhbGx5IHVzZSB0aGUgYWdncmVnYXRlCisgKgkgICAgICAgIGlub2RlIG1hcCwgc2luY2UgdGhlc2UgaW5vZGVzIGFyZSBhdCBhIGZpeGVkIGxvY2F0aW9uCisgKgkJYW5kIGluIHNvbWUgY2FzZXMgdGhlIGFnZ3JlZ2F0ZSBpbm9kZSBtYXAgaXNuJ3QgaW5pdGlhbGl6ZWQKKyAqCQl5ZXQuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgc2IgLSBmaWxlc3lzdGVtIHN1cGVyYmxvY2sKKyAqCWludW0gLSBhZ2dyZWdhdGUgaW5vZGUgbnVtYmVyCisgKglzZWNvbmRhcnkgLSAxIGlmIHNlY29uZGFyeSBhZ2dyZWdhdGUgaW5vZGUgdGFibGUKKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICBuZXcgaW5vZGUJLSBzdWNjZXNzCisgKiAgICAgIE5VTEwJCS0gaS9vIGVycm9yLgorICovCitzdHJ1Y3QgaW5vZGUgKmRpUmVhZFNwZWNpYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW5vX3QgaW51bSwgaW50IHNlY29uZGFyeSkKK3sKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoc2IpOworCXVpbnQgYWRkcmVzczsKKwlzdHJ1Y3QgZGlub2RlICpkcDsKKwlzdHJ1Y3QgaW5vZGUgKmlwOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisKKwlpcCA9IG5ld19pbm9kZShzYik7CisJaWYgKGlwID09IE5VTEwpIHsKKwkJamZzX2VycigiZGlSZWFkU3BlY2lhbDogbmV3X2lub2RlIHJldHVybmVkIE5VTEwhIik7CisJCXJldHVybiBpcDsKKwl9CisKKwlpZiAoc2Vjb25kYXJ5KSB7CisJCWFkZHJlc3MgPSBhZGRyZXNzUFhEKCZzYmktPmFpdDIpID4+IHNiaS0+bDJuYnBlcnBhZ2U7CisJCUpGU19JUChpcCktPmlwaW1hcCA9IHNiaS0+aXBhaW1hcDI7CisJfSBlbHNlIHsKKwkJYWRkcmVzcyA9IEFJVEJMX09GRiA+PiBMMlBTSVpFOworCQlKRlNfSVAoaXApLT5pcGltYXAgPSBzYmktPmlwYWltYXA7CisJfQorCisJQVNTRVJUKGludW0gPCBJTk9TUEVSRVhUKTsKKworCWlwLT5pX2lubyA9IGludW07CisKKwlhZGRyZXNzICs9IGludW0gPj4gMzsJLyogOCBpbm9kZXMgcGVyIDRLIHBhZ2UgKi8KKworCS8qIHJlYWQgdGhlIHBhZ2Ugb2YgZml4ZWQgZGlzayBpbm9kZSAoQUlUKSBpbiByYXcgbW9kZSAqLworCW1wID0gcmVhZF9tZXRhcGFnZShpcCwgYWRkcmVzcyA8PCBzYmktPmwybmJwZXJwYWdlLCBQU0laRSwgMSk7CisJaWYgKG1wID09IE5VTEwpIHsKKwkJaXAtPmlfbmxpbmsgPSAxOwkvKiBEb24ndCB3YW50IGlwdXQoKSBkZWxldGluZyBpdCAqLworCQlpcHV0KGlwKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwkvKiBnZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGRpc2sgaW5vZGUgb2YgaW50ZXJlc3QgKi8KKwlkcCA9IChzdHJ1Y3QgZGlub2RlICopIChtcC0+ZGF0YSk7CisJZHAgKz0gaW51bSAlIDg7CQkvKiA4IGlub2RlcyBwZXIgNEsgcGFnZSAqLworCisJLyogY29weSBvbi1kaXNrIGlub2RlIHRvIGluLW1lbW9yeSBpbm9kZSAqLworCWlmICgoY29weV9mcm9tX2Rpbm9kZShkcCwgaXApKSAhPSAwKSB7CisJCS8qIGhhbmRsZSBiYWQgcmV0dXJuIGJ5IHJldHVybmluZyBOVUxMIGZvciBpcCAqLworCQlpcC0+aV9ubGluayA9IDE7CS8qIERvbid0IHdhbnQgaXB1dCgpIGRlbGV0aW5nIGl0ICovCisJCWlwdXQoaXApOworCQkvKiByZWxlYXNlIHRoZSBwYWdlICovCisJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQlyZXR1cm4gKE5VTEwpOworCisJfQorCisJaXAtPmlfbWFwcGluZy0+YV9vcHMgPSAmamZzX2FvcHM7CisJbWFwcGluZ19zZXRfZ2ZwX21hc2soaXAtPmlfbWFwcGluZywgR0ZQX05PRlMpOworCisJLyogQWxsb2NhdGlvbnMgdG8gbWV0YWRhdGEgaW5vZGVzIHNob3VsZCBub3QgYWZmZWN0IHF1b3RhcyAqLworCWlwLT5pX2ZsYWdzIHw9IFNfTk9RVU9UQTsKKworCWlmICgoaW51bSA9PSBGSUxFU1lTVEVNX0kpICYmIChKRlNfSVAoaXApLT5pcGltYXAgPT0gc2JpLT5pcGFpbWFwKSkgeworCQlzYmktPmdlbmdlbiA9IGxlMzJfdG9fY3B1KGRwLT5kaV9nZW5nZW4pOworCQlzYmktPmlub3N0YW1wID0gbGUzMl90b19jcHUoZHAtPmRpX2lub3N0YW1wKTsKKwl9CisKKwkvKiByZWxlYXNlIHRoZSBwYWdlICovCisJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisKKwlyZXR1cm4gKGlwKTsKK30KKworLyoKKyAqIE5BTUU6ICAgICAgICBkaVdyaXRlU3BlY2lhbCgpCisgKgorICogRlVOQ1RJT046ICAgIFdyaXRlIHRoZSBzcGVjaWFsIGlub2RlIHRvIGRpc2sKKyAqCisgKiBQQVJBTUVURVJTOgorICogICAgICBpcCAtIHNwZWNpYWwgaW5vZGUKKyAqCXNlY29uZGFyeSAtIDEgaWYgc2Vjb25kYXJ5IGFnZ3JlZ2F0ZSBpbm9kZSB0YWJsZQorICoKKyAqIFJFVFVSTiBWQUxVRVM6IG5vbmUKKyAqLworCit2b2lkIGRpV3JpdGVTcGVjaWFsKHN0cnVjdCBpbm9kZSAqaXAsIGludCBzZWNvbmRhcnkpCit7CisJc3RydWN0IGpmc19zYl9pbmZvICpzYmkgPSBKRlNfU0JJKGlwLT5pX3NiKTsKKwl1aW50IGFkZHJlc3M7CisJc3RydWN0IGRpbm9kZSAqZHA7CisJaW5vX3QgaW51bSA9IGlwLT5pX2lubzsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCisJaXAtPmlfc3RhdGUgJj0gfklfRElSVFk7CisKKwlpZiAoc2Vjb25kYXJ5KQorCQlhZGRyZXNzID0gYWRkcmVzc1BYRCgmc2JpLT5haXQyKSA+PiBzYmktPmwybmJwZXJwYWdlOworCWVsc2UKKwkJYWRkcmVzcyA9IEFJVEJMX09GRiA+PiBMMlBTSVpFOworCisJQVNTRVJUKGludW0gPCBJTk9TUEVSRVhUKTsKKworCWFkZHJlc3MgKz0gaW51bSA+PiAzOwkvKiA4IGlub2RlcyBwZXIgNEsgcGFnZSAqLworCisJLyogcmVhZCB0aGUgcGFnZSBvZiBmaXhlZCBkaXNrIGlub2RlIChBSVQpIGluIHJhdyBtb2RlICovCisJbXAgPSByZWFkX21ldGFwYWdlKGlwLCBhZGRyZXNzIDw8IHNiaS0+bDJuYnBlcnBhZ2UsIFBTSVpFLCAxKTsKKwlpZiAobXAgPT0gTlVMTCkgeworCQlqZnNfZXJyKCJkaVdyaXRlU3BlY2lhbDogZmFpbGVkIHRvIHJlYWQgYWdncmVnYXRlIGlub2RlICIKKwkJCSJleHRlbnQhIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBnZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGRpc2sgaW5vZGUgb2YgaW50ZXJlc3QgKi8KKwlkcCA9IChzdHJ1Y3QgZGlub2RlICopIChtcC0+ZGF0YSk7CisJZHAgKz0gaW51bSAlIDg7CQkvKiA4IGlub2RlcyBwZXIgNEsgcGFnZSAqLworCisJLyogY29weSBvbi1kaXNrIGlub2RlIHRvIGluLW1lbW9yeSBpbm9kZSAqLworCWNvcHlfdG9fZGlub2RlKGRwLCBpcCk7CisJbWVtY3B5KCZkcC0+ZGlfeHRyb290LCAmSkZTX0lQKGlwKS0+aV94dHJvb3QsIDI4OCk7CisKKwlpZiAoaW51bSA9PSBGSUxFU1lTVEVNX0kpCisJCWRwLT5kaV9nZW5nZW4gPSBjcHVfdG9fbGUzMihzYmktPmdlbmdlbik7CisKKwkvKiB3cml0ZSB0aGUgcGFnZSAqLworCXdyaXRlX21ldGFwYWdlKG1wKTsKK30KKworLyoKKyAqIE5BTUU6ICAgICAgICBkaUZyZWVTcGVjaWFsKCkKKyAqCisgKiBGVU5DVElPTjogICAgRnJlZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHNwZWNpYWwgaW5vZGUKKyAqLwordm9pZCBkaUZyZWVTcGVjaWFsKHN0cnVjdCBpbm9kZSAqaXApCit7CisJaWYgKGlwID09IE5VTEwpIHsKKwkJamZzX2VycigiZGlGcmVlU3BlY2lhbCBjYWxsZWQgd2l0aCBOVUxMIGlwISIpOworCQlyZXR1cm47CisJfQorCWZpbGVtYXBfZmRhdGF3cml0ZShpcC0+aV9tYXBwaW5nKTsKKwlmaWxlbWFwX2ZkYXRhd2FpdChpcC0+aV9tYXBwaW5nKTsKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhpcC0+aV9tYXBwaW5nLCAwKTsKKwlpcHV0KGlwKTsKK30KKworCisKKy8qCisgKiBOQU1FOiAgICAgICAgZGlXcml0ZSgpCisgKgorICogRlVOQ1RJT046ICAgIHdyaXRlIHRoZSBvbi1kaXNrIGlub2RlIHBvcnRpb24gb2YgdGhlIGluLW1lbW9yeSBpbm9kZQorICoJCXRvIGl0cyBjb3JyZXNwb25kaW5nIG9uLWRpc2sgaW5vZGUuCisgKgorICoJCW9uIGVudHJ5LCB0aGUgc3BlY2lmZWQgaW5jb3JlIGlub2RlIHNob3VsZCBpdHNlbGYKKyAqCQlzcGVjaWZ5IHRoZSBkaXNrIGlub2RlIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIHRoZQorICoJCWluY29yZSBpbm9kZSAoaS5lLiBpX251bWJlciBzaG91bGQgYmUgaW5pdGlhbGl6ZWQpLgorICoKKyAqCQl0aGUgaW5vZGUgY29udGFpbnMgdGhlIGlub2RlIGV4dGVudCBhZGRyZXNzIGZvciB0aGUgZGlzaworICoJCWlub2RlLiAgd2l0aCB0aGUgaW5vZGUgZXh0ZW50IGFkZHJlc3MgaW4gaGFuZCwgdGhlCisgKgkJcGFnZSBvZiB0aGUgZXh0ZW50IHRoYXQgY29udGFpbnMgdGhlIGRpc2sgaW5vZGUgaXMKKyAqCQlyZWFkIGFuZCB0aGUgZGlzayBpbm9kZSBwb3J0aW9uIG9mIHRoZSBpbmNvcmUgaW5vZGUKKyAqCQlpcyBjb3BpZWQgdG8gdGhlIGRpc2sgaW5vZGUuCisgKgkJCisgKiBQQVJBTUVURVJTOgorICoJdGlkIC0gIHRyYW5zYWNhdGlvbiBpZAorICogICAgICBpcCAgLSAgcG9pbnRlciB0byBpbmNvcmUgaW5vZGUgdG8gYmUgd3JpdHRlbiB0byB0aGUgaW5vZGUgZXh0ZW50LgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzCisgKiAgICAgIC1FSU8gIAktIGkvbyBlcnJvci4KKyAqLworaW50IGRpV3JpdGUodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwKQoreworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShpcC0+aV9zYik7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqZnNfaXAgPSBKRlNfSVAoaXApOworCWludCByYyA9IDA7CisJczMyIGlubzsKKwlzdHJ1Y3QgZGlub2RlICpkcDsKKwlzNjQgYmxrbm87CisJaW50IGJsb2NrX29mZnNldDsKKwlpbnQgaW5vZGVzX2xlZnQ7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwl1aW50IHBhZ2VubzsKKwlpbnQgcmVsX2lub2RlOworCWludCBkaW9mZnNldDsKKwlzdHJ1Y3QgaW5vZGUgKmlwaW1hcDsKKwl1aW50IHR5cGU7CisJbGlkX3QgbGlkOworCXN0cnVjdCB0bG9jayAqZGl0bGNrLCAqdGxjazsKKwlzdHJ1Y3QgbGluZWxvY2sgKmRpbGluZWxvY2ssICppbGluZWxvY2s7CisJc3RydWN0IGx2ICpsdjsKKwlpbnQgbjsKKworCWlwaW1hcCA9IGpmc19pcC0+aXBpbWFwOworCisJaW5vID0gaXAtPmlfaW5vICYgKElOT1NQRVJJQUcgLSAxKTsKKworCWlmICghYWRkcmVzc1BYRCgmKGpmc19pcC0+aXhweGQpKSB8fAorCSAgICAobGVuZ3RoUFhEKCYoamZzX2lwLT5peHB4ZCkpICE9CisJICAgICBKRlNfSVAoaXBpbWFwKS0+aV9pbWFwLT5pbV9uYnBlcmlleHQpKSB7CisJCWpmc19lcnJvcihpcC0+aV9zYiwgImRpV3JpdGU6IGl4cHhkIGludmFsaWQiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyoKKwkgKiByZWFkIHRoZSBwYWdlIG9mIGRpc2sgaW5vZGUgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGlub2RlOgorCSAqLworCS8qIGNvbXB1dGUgdGhlIGJsb2NrIGFkZHJlc3Mgb2YgdGhlIHBhZ2UgKi8KKwlibGtubyA9IElOT1BCTEsoJihqZnNfaXAtPml4cHhkKSwgaW5vLCBzYmktPmwybmJwZXJwYWdlKTsKKworCXJlbF9pbm9kZSA9IChpbm8gJiAoSU5PU1BFUlBBR0UgLSAxKSk7CisJcGFnZW5vID0gYmxrbm8gPj4gc2JpLT5sMm5icGVycGFnZTsKKworCWlmICgoYmxvY2tfb2Zmc2V0ID0gKCh1MzIpIGJsa25vICYgKHNiaS0+bmJwZXJwYWdlIC0gMSkpKSkgeworCQkvKgorCQkgKiBPUy8yIGRpZG4ndCBhbHdheXMgYWxpZ24gaW5vZGUgZXh0ZW50cyBvbiBwYWdlIGJvdW5kYXJpZXMKKwkJICovCisJCWlub2Rlc19sZWZ0ID0KKwkJICAgIChzYmktPm5icGVycGFnZSAtIGJsb2NrX29mZnNldCkgPDwgc2JpLT5sMm5pcGVyYmxrOworCisJCWlmIChyZWxfaW5vZGUgPCBpbm9kZXNfbGVmdCkKKwkJCXJlbF9pbm9kZSArPSBibG9ja19vZmZzZXQgPDwgc2JpLT5sMm5pcGVyYmxrOworCQllbHNlIHsKKwkJCXBhZ2VubyArPSAxOworCQkJcmVsX2lub2RlIC09IGlub2Rlc19sZWZ0OworCQl9CisJfQorCS8qIHJlYWQgdGhlIHBhZ2Ugb2YgZGlzayBpbm9kZSAqLworICAgICAgcmV0cnk6CisJbXAgPSByZWFkX21ldGFwYWdlKGlwaW1hcCwgcGFnZW5vIDw8IHNiaS0+bDJuYnBlcnBhZ2UsIFBTSVpFLCAxKTsKKwlpZiAobXAgPT0gMCkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBnZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGRpc2sgaW5vZGUgKi8KKwlkcCA9IChzdHJ1Y3QgZGlub2RlICopIG1wLT5kYXRhOworCWRwICs9IHJlbF9pbm9kZTsKKworCWRpb2Zmc2V0ID0gKGlubyAmIChJTk9TUEVSUEFHRSAtIDEpKSA8PCBMMkRJU0laRTsKKworCS8qCisJICogYWNxdWlyZSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBvbi1kaXNrIGlub2RlOworCSAqIE4uQi4gdGxvY2sgaXMgYWNxdWlyZWQgb24gaXBpbWFwIG5vdCBpcDsKKwkgKi8KKwlpZiAoKGRpdGxjayA9CisJICAgICB0eExvY2sodGlkLCBpcGltYXAsIG1wLCB0bGNrSU5PREUgfCB0bGNrRU5UUlkpKSA9PSBOVUxMKQorCQlnb3RvIHJldHJ5OworCWRpbGluZWxvY2sgPSAoc3RydWN0IGxpbmVsb2NrICopICYgZGl0bGNrLT5sb2NrOworCisJLyoKKwkgKiBjb3B5IGJ0cmVlIHJvb3QgZnJvbSBpbi1tZW1vcnkgaW5vZGUgdG8gb24tZGlzayBpbm9kZQorCSAqCisJICogKHRsb2NrIGlzIHRha2VuIGZyb20gaW5saW5lIEIrLXRyZWUgcm9vdCBpbiBpbi1tZW1vcnkKKwkgKiBpbm9kZSB3aGVuIHRoZSBCKy10cmVlIHJvb3QgaXMgdXBkYXRlZCwgd2hpY2ggaXMgcG9pbnRlZCAKKwkgKiBieSBqZnNfaXAtPmJsaWQgYXMgd2VsbCBhcyBiZWluZyBvbiB0eCB0bG9jayBsaXN0KQorCSAqCisJICogZnVydGhlciBwcm9jZXNzaW5nIG9mIGJ0cmVlIHJvb3QgaXMgYmFzZWQgb24gdGhlIGNvcHkgCisJICogaW4gaW4tbWVtb3J5IGlub2RlLCB3aGVyZSB0eExvZygpIHdpbGwgbG9nIGZyb20sIGFuZCwgCisJICogZm9yIHh0cmVlIHJvb3QsIHR4VXBkYXRlTWFwKCkgd2lsbCB1cGRhdGUgbWFwIGFuZCByZXNldAorCSAqIFhBRF9ORVcgYml0OworCSAqLworCisJaWYgKFNfSVNESVIoaXAtPmlfbW9kZSkgJiYgKGxpZCA9IGpmc19pcC0+eHRsaWQpKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgdGhlIHNwZWNpYWwgeHRyZWUgaW5zaWRlIHRoZSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcKKwkJICogdGhlIGRpcmVjdG9yeSB0YWJsZQorCQkgKi8KKwkJeHRwYWdlX3QgKnAsICp4cDsKKwkJeGFkX3QgKnhhZDsKKworCQlqZnNfaXAtPnh0bGlkID0gMDsKKwkJdGxjayA9IGxpZF90b190bG9jayhsaWQpOworCQlhc3NlcnQodGxjay0+dHlwZSAmIHRsY2tYVFJFRSk7CisJCXRsY2stPnR5cGUgfD0gdGxja0JUUk9PVDsKKwkJdGxjay0+bXAgPSBtcDsKKwkJaWxpbmVsb2NrID0gKHN0cnVjdCBsaW5lbG9jayAqKSAmIHRsY2stPmxvY2s7CisKKwkJLyoKKwkJICogY29weSB4dHJlZSByb290IGZyb20gaW5vZGUgdG8gZGlub2RlOgorCQkgKi8KKwkJcCA9ICZqZnNfaXAtPmlfeHRyb290OworCQl4cCA9ICh4dHBhZ2VfdCAqKSAmZHAtPmRpX2RpcnRhYmxlOworCQlsdiA9IGlsaW5lbG9jay0+bHY7CisJCWZvciAobiA9IDA7IG4gPCBpbGluZWxvY2stPmluZGV4OyBuKyssIGx2KyspIHsKKwkJCW1lbWNweSgmeHAtPnhhZFtsdi0+b2Zmc2V0XSwgJnAtPnhhZFtsdi0+b2Zmc2V0XSwKKwkJCSAgICAgICBsdi0+bGVuZ3RoIDw8IEwyWFRTTE9UU0laRSk7CisJCX0KKworCQkvKiByZXNldCBvbi1kaXNrIChtZXRhZGF0YSBwYWdlKSB4dHJlZSBYQURfTkVXIGJpdCAqLworCQl4YWQgPSAmeHAtPnhhZFtYVEVOVFJZU1RBUlRdOworCQlmb3IgKG4gPSBYVEVOVFJZU1RBUlQ7CisJCSAgICAgbiA8IGxlMTZfdG9fY3B1KHhwLT5oZWFkZXIubmV4dGluZGV4KTsgbisrLCB4YWQrKykKKwkJCWlmICh4YWQtPmZsYWcgJiAoWEFEX05FVyB8IFhBRF9FWFRFTkRFRCkpCisJCQkJeGFkLT5mbGFnICY9IH4oWEFEX05FVyB8IFhBRF9FWFRFTkRFRCk7CisJfQorCisJaWYgKChsaWQgPSBqZnNfaXAtPmJsaWQpID09IDApCisJCWdvdG8gaW5saW5lRGF0YTsKKwlqZnNfaXAtPmJsaWQgPSAwOworCisJdGxjayA9IGxpZF90b190bG9jayhsaWQpOworCXR5cGUgPSB0bGNrLT50eXBlOworCXRsY2stPnR5cGUgfD0gdGxja0JUUk9PVDsKKwl0bGNrLT5tcCA9IG1wOworCWlsaW5lbG9jayA9IChzdHJ1Y3QgbGluZWxvY2sgKikgJiB0bGNrLT5sb2NrOworCisJLyoKKwkgKiAgICAgIHJlZ3VsYXIgZmlsZTogMTYgYnl0ZSAoWEFEIHNsb3QpIGdyYW51bGFyaXR5CisJICovCisJaWYgKHR5cGUgJiB0bGNrWFRSRUUpIHsKKwkJeHRwYWdlX3QgKnAsICp4cDsKKwkJeGFkX3QgKnhhZDsKKworCQkvKgorCQkgKiBjb3B5IHh0cmVlIHJvb3QgZnJvbSBpbm9kZSB0byBkaW5vZGU6CisJCSAqLworCQlwID0gJmpmc19pcC0+aV94dHJvb3Q7CisJCXhwID0gJmRwLT5kaV94dHJvb3Q7CisJCWx2ID0gaWxpbmVsb2NrLT5sdjsKKwkJZm9yIChuID0gMDsgbiA8IGlsaW5lbG9jay0+aW5kZXg7IG4rKywgbHYrKykgeworCQkJbWVtY3B5KCZ4cC0+eGFkW2x2LT5vZmZzZXRdLCAmcC0+eGFkW2x2LT5vZmZzZXRdLAorCQkJICAgICAgIGx2LT5sZW5ndGggPDwgTDJYVFNMT1RTSVpFKTsKKwkJfQorCisJCS8qIHJlc2V0IG9uLWRpc2sgKG1ldGFkYXRhIHBhZ2UpIHh0cmVlIFhBRF9ORVcgYml0ICovCisJCXhhZCA9ICZ4cC0+eGFkW1hURU5UUllTVEFSVF07CisJCWZvciAobiA9IFhURU5UUllTVEFSVDsKKwkJICAgICBuIDwgbGUxNl90b19jcHUoeHAtPmhlYWRlci5uZXh0aW5kZXgpOyBuKyssIHhhZCsrKQorCQkJaWYgKHhhZC0+ZmxhZyAmIChYQURfTkVXIHwgWEFEX0VYVEVOREVEKSkKKwkJCQl4YWQtPmZsYWcgJj0gfihYQURfTkVXIHwgWEFEX0VYVEVOREVEKTsKKwl9CisJLyoKKwkgKiAgICAgIGRpcmVjdG9yeTogMzIgYnl0ZSAoZGlyZWN0b3J5IGVudHJ5IHNsb3QpIGdyYW51bGFyaXR5CisJICovCisJZWxzZSBpZiAodHlwZSAmIHRsY2tEVFJFRSkgeworCQlkdHBhZ2VfdCAqcCwgKnhwOworCisJCS8qCisJCSAqIGNvcHkgZHRyZWUgcm9vdCBmcm9tIGlub2RlIHRvIGRpbm9kZToKKwkJICovCisJCXAgPSAoZHRwYWdlX3QgKikgJmpmc19pcC0+aV9kdHJvb3Q7CisJCXhwID0gKGR0cGFnZV90ICopICYgZHAtPmRpX2R0cm9vdDsKKwkJbHYgPSBpbGluZWxvY2stPmx2OworCQlmb3IgKG4gPSAwOyBuIDwgaWxpbmVsb2NrLT5pbmRleDsgbisrLCBsdisrKSB7CisJCQltZW1jcHkoJnhwLT5zbG90W2x2LT5vZmZzZXRdLCAmcC0+c2xvdFtsdi0+b2Zmc2V0XSwKKwkJCSAgICAgICBsdi0+bGVuZ3RoIDw8IEwyRFRTTE9UU0laRSk7CisJCX0KKwl9IGVsc2UgeworCQlqZnNfZXJyKCJkaVdyaXRlOiBVRk8gdGxvY2siKTsKKwl9CisKKyAgICAgIGlubGluZURhdGE6CisJLyoKKwkgKiBjb3B5IGlubGluZSBzeW1saW5rIGZyb20gaW4tbWVtb3J5IGlub2RlIHRvIG9uLWRpc2sgaW5vZGUKKwkgKi8KKwlpZiAoU19JU0xOSyhpcC0+aV9tb2RlKSAmJiBpcC0+aV9zaXplIDwgSURBVEFTSVpFKSB7CisJCWx2ID0gJiBkaWxpbmVsb2NrLT5sdltkaWxpbmVsb2NrLT5pbmRleF07CisJCWx2LT5vZmZzZXQgPSAoZGlvZmZzZXQgKyAyICogMTI4KSA+PiBMMklOT0RFU0xPVFNJWkU7CisJCWx2LT5sZW5ndGggPSAyOworCQltZW1jcHkoJmRwLT5kaV9mYXN0c3ltbGluaywgamZzX2lwLT5pX2lubGluZSwgSURBVEFTSVpFKTsKKwkJZGlsaW5lbG9jay0+aW5kZXgrKzsKKwl9CisJLyoKKwkgKiBjb3B5IGlubGluZSBkYXRhIGZyb20gaW4tbWVtb3J5IGlub2RlIHRvIG9uLWRpc2sgaW5vZGU6CisJICogMTI4IGJ5dGUgc2xvdCBncmFudWxhcml0eQorCSAqLworCWlmICh0ZXN0X2NmbGFnKENPTU1JVF9JbmxpbmVlYSwgaXApKSB7CisJCWx2ID0gJiBkaWxpbmVsb2NrLT5sdltkaWxpbmVsb2NrLT5pbmRleF07CisJCWx2LT5vZmZzZXQgPSAoZGlvZmZzZXQgKyAzICogMTI4KSA+PiBMMklOT0RFU0xPVFNJWkU7CisJCWx2LT5sZW5ndGggPSAxOworCQltZW1jcHkoJmRwLT5kaV9pbmxpbmVlYSwgamZzX2lwLT5pX2lubGluZV9lYSwgSU5PREVTTE9UU0laRSk7CisJCWRpbGluZWxvY2stPmluZGV4Kys7CisKKwkJY2xlYXJfY2ZsYWcoQ09NTUlUX0lubGluZWVhLCBpcCk7CisJfQorCisJLyoKKwkgKiAgICAgIGxvY2svY29weSBpbm9kZSBiYXNlOiAxMjggYnl0ZSBzbG90IGdyYW51bGFyaXR5CisJICovCisvLyBiYXNlRGlub2RlOgorCWx2ID0gJiBkaWxpbmVsb2NrLT5sdltkaWxpbmVsb2NrLT5pbmRleF07CisJbHYtPm9mZnNldCA9IGRpb2Zmc2V0ID4+IEwySU5PREVTTE9UU0laRTsKKwljb3B5X3RvX2Rpbm9kZShkcCwgaXApOworCWlmICh0ZXN0X2FuZF9jbGVhcl9jZmxhZyhDT01NSVRfRGlydGFibGUsIGlwKSkgeworCQlsdi0+bGVuZ3RoID0gMjsKKwkJbWVtY3B5KCZkcC0+ZGlfZGlydGFibGUsICZqZnNfaXAtPmlfZGlydGFibGUsIDk2KTsKKwl9IGVsc2UKKwkJbHYtPmxlbmd0aCA9IDE7CisJZGlsaW5lbG9jay0+aW5kZXgrKzsKKworI2lmZGVmIF9KRlNfRkFTVERBU0QKKwkvKgorCSAqIFdlIGFyZW4ndCBsb2dnaW5nIGNoYW5nZXMgdG8gdGhlIERBU0QgdXNlZCBpbiBkaXJlY3RvcnkgaW5vZGVzLAorCSAqIGJ1dCB3ZSBuZWVkIHRvIHdyaXRlIHRoZW0gdG8gZGlzay4gIElmIHdlIGRvbid0IHVubW91bnQgY2xlYW5seSwKKwkgKiBtb3VudCB3aWxsIHJlY2FsY3VsYXRlIHRoZSBEQVNEIHVzZWQuCisJICovCisJaWYgKFNfSVNESVIoaXAtPmlfbW9kZSkKKwkgICAgJiYgKGlwLT5pX2lwbW50LT5pX21udGZsYWcgJiBKRlNfREFTRF9FTkFCTEVEKSkKKwkJbWVtY3B5KCZkcC0+ZGlfREFTRCwgJmlwLT5pX0RBU0QsIHNpemVvZihzdHJ1Y3QgZGFzZCkpOworI2VuZGlmCQkJCS8qICBfSkZTX0ZBU1REQVNEICovCisKKwkvKiByZWxlYXNlIHRoZSBidWZmZXIgaG9sZGluZyB0aGUgdXBkYXRlZCBvbi1kaXNrIGlub2RlLiAKKwkgKiB0aGUgYnVmZmVyIHdpbGwgYmUgbGF0ZXIgd3JpdHRlbiBieSBjb21taXQgcHJvY2Vzc2luZy4KKwkgKi8KKwl3cml0ZV9tZXRhcGFnZShtcCk7CisKKwlyZXR1cm4gKHJjKTsKK30KKworCisvKgorICogTkFNRTogICAgICAgIGRpRnJlZShpcCkKKyAqCisgKiBGVU5DVElPTjogICAgZnJlZSBhIHNwZWNpZmllZCBpbm9kZSBmcm9tIHRoZSBpbm9kZSB3b3JraW5nIG1hcAorICoJCWZvciBhIGZpbGVzZXQgb3IgYWdncmVnYXRlLgorICoKKyAqCQlpZiB0aGUgaW5vZGUgdG8gYmUgZnJlZWQgcmVwcmVzZW50cyB0aGUgZmlyc3QgKG9ubHkpCisgKgkJZnJlZSBpbm9kZSB3aXRoaW4gdGhlIGlhZywgdGhlIGlhZyB3aWxsIGJlIHBsYWNlZCBvbgorICoJCXRoZSBhZyBmcmVlIGlub2RlIGxpc3QuCisgKgkKKyAqCQlmcmVlaW5nIHRoZSBpbm9kZSB3aWxsIGNhdXNlIHRoZSBpbm9kZSBleHRlbnQgdG8gYmUKKyAqCQlmcmVlZCBpZiB0aGUgaW5vZGUgaXMgdGhlIG9ubHkgYWxsb2NhdGVkIGlub2RlIHdpdGhpbgorICoJCXRoZSBleHRlbnQuICBpbiB0aGlzIGNhc2UgYWxsIHRoZSBkaXNrIHJlc291cmNlIGJhY2tpbmcKKyAqCQl1cCB0aGUgaW5vZGUgZXh0ZW50IHdpbGwgYmUgZnJlZWQuIGluIGFkZGl0aW9uLCB0aGUgaWFnCisgKgkJd2lsbCBiZSBwbGFjZWQgb24gdGhlIGFnIGV4dGVudCBmcmVlIGxpc3QgaWYgdGhlIGV4dGVudAorICoJCWlzIHRoZSBmaXJzdCBmcmVlIGV4dGVudCBpbiB0aGUgaWFnLiAgaWYgZnJlZWluZyB0aGUKKyAqCQlleHRlbnQgYWxzbyBtZWFucyB0aGF0IG5vIGZyZWUgaW5vZGVzIHdpbGwgZXhpc3QgZm9yCisgKgkJdGhlIGlhZywgdGhlIGlhZyB3aWxsIGFsc28gYmUgcmVtb3ZlZCBmcm9tIHRoZSBhZyBmcmVlCisgKgkJaW5vZGUgbGlzdC4KKyAqCisgKgkJdGhlIGlhZyBkZXNjcmliaW5nIHRoZSBpbm9kZSB3aWxsIGJlIGZyZWVkIGlmIHRoZSBleHRlbnQKKyAqCQlpcyB0byBiZSBmcmVlZCBhbmQgaXQgaXMgdGhlIG9ubHkgYmFja2VkIGV4dGVudCB3aXRoaW4KKyAqCQl0aGUgaWFnLiAgaW4gdGhpcyBjYXNlLCB0aGUgaWFnIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZQorICoJCWFnIGZyZWUgZXh0ZW50IGxpc3QgYW5kIGFnIGZyZWUgaW5vZGUgbGlzdCBhbmQgcGxhY2VkIG9uCisgKgkJdGhlIGlub2RlIG1hcCdzIGZyZWUgaWFnIGxpc3QuCisgKgorICoJCWEgY2FyZWZ1bCB1cGRhdGUgYXBwcm9hY2ggaXMgdXNlZCB0byBwcm92aWRlIGNvbnNpc3RlbmN5CisgKgkJaW4gdGhlIGZhY2Ugb2YgdXBkYXRlcyB0byBtdWx0aXBsZSBidWZmZXJzLiAgdW5kZXIgdGhpcworICoJCWFwcHJvYWNoLCBhbGwgcmVxdWlyZWQgYnVmZmVycyBhcmUgb2J0YWluZWQgYmVmb3JlIG1ha2luZworICoJCWFueSB1cGRhdGVzIGFuZCBhcmUgaGVsZCB1bnRpbCBhbGwgdXBkYXRlcyBhcmUgY29tcGxldGUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgaXAgIAktIGlub2RlIHRvIGJlIGZyZWVkLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzCisgKiAgICAgIC1FSU8gIAktIGkvbyBlcnJvci4KKyAqLworaW50IGRpRnJlZShzdHJ1Y3QgaW5vZGUgKmlwKQoreworCWludCByYzsKKwlpbm9fdCBpbnVtID0gaXAtPmlfaW5vOworCXN0cnVjdCBpYWcgKmlhZ3AsICphaWFncCwgKmJpYWdwLCAqY2lhZ3AsICpkaWFncDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wLCAqYW1wLCAqYm1wLCAqY21wLCAqZG1wOworCWludCBpYWdubywgaW5vLCBleHRubywgYml0bm8sIHN3b3JkLCBhZ25vOworCWludCBiYWNrLCBmd2Q7CisJdTMyIGJpdG1hcCwgbWFzazsKKwlzdHJ1Y3QgaW5vZGUgKmlwaW1hcCA9IEpGU19TQkkoaXAtPmlfc2IpLT5pcGltYXA7CisJc3RydWN0IGlub21hcCAqaW1hcCA9IEpGU19JUChpcGltYXApLT5pX2ltYXA7CisJcHhkX3QgZnJlZXB4ZDsKKwl0aWRfdCB0aWQ7CisJc3RydWN0IGlub2RlICppcGxpc3RbM107CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBweGRfbG9jayAqcHhkbG9jazsKKworCS8qCisJICogVGhpcyBpcyBqdXN0IHRvIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmdzLiAgVGhlIHNhbWUgbG9naWMgdGhhdAorCSAqIHJlZmVyZW5jZXMgdGhlc2UgdmFyaWFibGVzIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGVtLgorCSAqLworCWFpYWdwID0gYmlhZ3AgPSBjaWFncCA9IGRpYWdwID0gTlVMTDsKKworCS8qIGdldCB0aGUgaWFnIG51bWJlciBjb250YWluaW5nIHRoZSBpbm9kZS4KKwkgKi8KKwlpYWdubyA9IElOT1RPSUFHKGludW0pOworCisJLyogbWFrZSBzdXJlIHRoYXQgdGhlIGlhZyBpcyBjb250YWluZWQgd2l0aGluIAorCSAqIHRoZSBtYXAuCisJICovCisJaWYgKGlhZ25vID49IGltYXAtPmltX25leHRpYWcpIHsKKwkJZHVtcF9tZW0oImltYXAiLCBpbWFwLCAzMik7CisJCWpmc19lcnJvcihpcC0+aV9zYiwKKwkJCSAgImRpRnJlZTogaW51bSA9ICVkLCBpYWdubyA9ICVkLCBuZXh0aWFnID0gJWQiLAorCQkJICAodWludCkgaW51bSwgaWFnbm8sIGltYXAtPmltX25leHRpYWcpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBnZXQgdGhlIGFsbG9jYXRpb24gZ3JvdXAgZm9yIHRoaXMgaW5vLgorCSAqLworCWFnbm8gPSBKRlNfSVAoaXApLT5hZ25vOworCisJLyogTG9jayB0aGUgQUcgc3BlY2lmaWMgaW5vZGUgbWFwIGluZm9ybWF0aW9uCisJICovCisJQUdfTE9DSyhpbWFwLCBhZ25vKTsKKworCS8qIE9idGFpbiByZWFkIGxvY2sgaW4gaW1hcCBpbm9kZS4gIERvbid0IHJlbGVhc2UgaXQgdW50aWwgd2UgaGF2ZQorCSAqIHJlYWQgYWxsIG9mIHRoZSBJQUcncyB0aGF0IHdlIGFyZSBnb2luZyB0by4KKwkgKi8KKwlJUkVBRF9MT0NLKGlwaW1hcCk7CisKKwkvKiByZWFkIHRoZSBpYWcuCisJICovCisJaWYgKChyYyA9IGRpSUFHUmVhZChpbWFwLCBpYWdubywgJm1wKSkpIHsKKwkJSVJFQURfVU5MT0NLKGlwaW1hcCk7CisJCUFHX1VOTE9DSyhpbWFwLCBhZ25vKTsKKwkJcmV0dXJuIChyYyk7CisJfQorCWlhZ3AgPSAoc3RydWN0IGlhZyAqKSBtcC0+ZGF0YTsKKworCS8qIGdldCB0aGUgaW5vZGUgbnVtYmVyIGFuZCBleHRlbnQgbnVtYmVyIG9mIHRoZSBpbm9kZSB3aXRoaW4KKwkgKiB0aGUgaWFnIGFuZCB0aGUgaW5vZGUgbnVtYmVyIHdpdGhpbiB0aGUgZXh0ZW50LgorCSAqLworCWlubyA9IGludW0gJiAoSU5PU1BFUklBRyAtIDEpOworCWV4dG5vID0gaW5vID4+IEwySU5PU1BFUkVYVDsKKwliaXRubyA9IGlubyAmIChJTk9TUEVSRVhUIC0gMSk7CisJbWFzayA9IEhJR0hPUkRFUiA+PiBiaXRubzsKKworCWlmICghKGxlMzJfdG9fY3B1KGlhZ3AtPndtYXBbZXh0bm9dKSAmIG1hc2spKSB7CisJCWpmc19lcnJvcihpcC0+aV9zYiwKKwkJCSAgImRpRnJlZTogd21hcCBzaG93cyBpbm9kZSBhbHJlYWR5IGZyZWUiKTsKKwl9CisKKwlpZiAoIWFkZHJlc3NQWEQoJmlhZ3AtPmlub2V4dFtleHRub10pKSB7CisJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQlJUkVBRF9VTkxPQ0soaXBpbWFwKTsKKwkJQUdfVU5MT0NLKGltYXAsIGFnbm8pOworCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJkaUZyZWU6IGludmFsaWQgaW5vZXh0Iik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGNvbXB1dGUgdGhlIGJpdG1hcCBmb3IgdGhlIGV4dGVudCByZWZsZWN0aW5nIHRoZSBmcmVlZCBpbm9kZS4KKwkgKi8KKwliaXRtYXAgPSBsZTMyX3RvX2NwdShpYWdwLT53bWFwW2V4dG5vXSkgJiB+bWFzazsKKworCWlmIChpbWFwLT5pbV9hZ2N0bFthZ25vXS5udW1mcmVlID4gaW1hcC0+aW1fYWdjdGxbYWdub10ubnVtaW5vcykgeworCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJSVJFQURfVU5MT0NLKGlwaW1hcCk7CisJCUFHX1VOTE9DSyhpbWFwLCBhZ25vKTsKKwkJamZzX2Vycm9yKGlwLT5pX3NiLCAiZGlGcmVlOiBudW1mcmVlID4gbnVtaW5vcyIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJLyoKKwkgKiAgICAgIGlub2RlIGV4dGVudCBzdGlsbCBoYXMgc29tZSBpbm9kZXMgb3IgYmVsb3cgbG93IHdhdGVyIG1hcms6CisJICogICAgICBrZWVwIHRoZSBpbm9kZSBleHRlbnQ7CisJICovCisJaWYgKGJpdG1hcCB8fAorCSAgICBpbWFwLT5pbV9hZ2N0bFthZ25vXS5udW1mcmVlIDwgOTYgfHwKKwkgICAgKGltYXAtPmltX2FnY3RsW2Fnbm9dLm51bWZyZWUgPCAyODggJiYKKwkgICAgICgoKGltYXAtPmltX2FnY3RsW2Fnbm9dLm51bWZyZWUgKiAxMDApIC8KKwkgICAgICAgaW1hcC0+aW1fYWdjdGxbYWdub10ubnVtaW5vcykgPD0gMjUpKSkgeworCQkvKiBpZiB0aGUgaWFnIGN1cnJlbnRseSBoYXMgbm8gZnJlZSBpbm9kZXMgKGkuZS4sCisJCSAqIHRoZSBpbm9kZSBiZWluZyBmcmVlZCBpcyB0aGUgZmlyc3QgZnJlZSBpbm9kZSBvZiBpYWcpLAorCQkgKiBpbnNlcnQgdGhlIGlhZyBhdCBoZWFkIG9mIHRoZSBpbm9kZSBmcmVlIGxpc3QgZm9yIHRoZSBhZy4KKwkJICovCisJCWlmIChpYWdwLT5uZnJlZWlub3MgPT0gMCkgeworCQkJLyogY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpYWdzIG9uIHRoZSBhZyBpbm9kZQorCQkJICogZnJlZSBsaXN0LiAgaWYgc28sIHJlYWQgdGhlIGZpcnN0IG9uZSBzbyB0aGF0CisJCQkgKiB3ZSBjYW4gbGluayB0aGUgY3VycmVudCBpYWcgb250byB0aGUgbGlzdCBhdAorCQkJICogdGhlIGhlYWQuCisJCQkgKi8KKwkJCWlmICgoZndkID0gaW1hcC0+aW1fYWdjdGxbYWdub10uaW5vZnJlZSkgPj0gMCkgeworCQkJCS8qIHJlYWQgdGhlIGlhZyB0aGF0IGN1cnJlbnRseSBpcyB0aGUgaGVhZAorCQkJCSAqIG9mIHRoZSBsaXN0LgorCQkJCSAqLworCQkJCWlmICgocmMgPSBkaUlBR1JlYWQoaW1hcCwgZndkLCAmYW1wKSkpIHsKKwkJCQkJSVJFQURfVU5MT0NLKGlwaW1hcCk7CisJCQkJCUFHX1VOTE9DSyhpbWFwLCBhZ25vKTsKKwkJCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQkJCXJldHVybiAocmMpOworCQkJCX0KKwkJCQlhaWFncCA9IChzdHJ1Y3QgaWFnICopIGFtcC0+ZGF0YTsKKworCQkJCS8qIG1ha2UgY3VycmVudCBoZWFkIHBvaW50IGJhY2sgdG8gdGhlIGlhZy4KKwkJCQkgKi8KKwkJCQlhaWFncC0+aW5vZnJlZWJhY2sgPSBjcHVfdG9fbGUzMihpYWdubyk7CisKKwkJCQl3cml0ZV9tZXRhcGFnZShhbXApOworCQkJfQorCisJCQkvKiBpYWcgcG9pbnRzIGZvcndhcmQgdG8gY3VycmVudCBoZWFkIGFuZCBpYWcKKwkJCSAqIGJlY29tZXMgdGhlIG5ldyBoZWFkIG9mIHRoZSBsaXN0LgorCQkJICovCisJCQlpYWdwLT5pbm9mcmVlZndkID0KKwkJCSAgICBjcHVfdG9fbGUzMihpbWFwLT5pbV9hZ2N0bFthZ25vXS5pbm9mcmVlKTsKKwkJCWlhZ3AtPmlub2ZyZWViYWNrID0gY3B1X3RvX2xlMzIoLTEpOworCQkJaW1hcC0+aW1fYWdjdGxbYWdub10uaW5vZnJlZSA9IGlhZ25vOworCQl9CisJCUlSRUFEX1VOTE9DSyhpcGltYXApOworCisJCS8qIHVwZGF0ZSB0aGUgZnJlZSBpbm9kZSBzdW1tYXJ5IG1hcCBmb3IgdGhlIGV4dGVudCBpZgorCQkgKiBmcmVlaW5nIHRoZSBpbm9kZSBtZWFucyB0aGUgZXh0ZW50IHdpbGwgbm93IGhhdmUgZnJlZQorCQkgKiBpbm9kZXMgKGkuZS4sIHRoZSBpbm9kZSBiZWluZyBmcmVlZCBpcyB0aGUgZmlyc3QgZnJlZSAKKwkJICogaW5vZGUgb2YgZXh0ZW50KSwKKwkJICovCisJCWlmIChpYWdwLT53bWFwW2V4dG5vXSA9PSBjcHVfdG9fbGUzMihPTkVTKSkgeworCQkJc3dvcmQgPSBleHRubyA+PiBMMkVYVFNQRVJTVU07CisJCQliaXRubyA9IGV4dG5vICYgKEVYVFNQRVJTVU0gLSAxKTsKKwkJCWlhZ3AtPmlub3NtYXBbc3dvcmRdICY9CisJCQkgICAgY3B1X3RvX2xlMzIofihISUdIT1JERVIgPj4gYml0bm8pKTsKKwkJfQorCisJCS8qIHVwZGF0ZSB0aGUgYml0bWFwLgorCQkgKi8KKwkJaWFncC0+d21hcFtleHRub10gPSBjcHVfdG9fbGUzMihiaXRtYXApOworCQlEQkdfRElGUkVFKGltYXAsIGludW0pOworCisJCS8qIHVwZGF0ZSB0aGUgZnJlZSBpbm9kZSBjb3VudHMgYXQgdGhlIGlhZywgYWcgYW5kCisJCSAqIG1hcCBsZXZlbC4KKwkJICovCisJCWlhZ3AtPm5mcmVlaW5vcyA9CisJCSAgICBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdShpYWdwLT5uZnJlZWlub3MpICsgMSk7CisJCWltYXAtPmltX2FnY3RsW2Fnbm9dLm51bWZyZWUgKz0gMTsKKwkJYXRvbWljX2luYygmaW1hcC0+aW1fbnVtZnJlZSk7CisKKwkJLyogcmVsZWFzZSB0aGUgQUcgaW5vZGUgbWFwIGxvY2sKKwkJICovCisJCUFHX1VOTE9DSyhpbWFwLCBhZ25vKTsKKworCQkvKiB3cml0ZSB0aGUgaWFnICovCisJCXdyaXRlX21ldGFwYWdlKG1wKTsKKworCQlyZXR1cm4gKDApOworCX0KKworCisJLyoKKwkgKiAgICAgIGlub2RlIGV4dGVudCBoYXMgYmVjb21lIGZyZWUgYW5kIGFib3ZlIGxvdyB3YXRlciBtYXJrOgorCSAqICAgICAgZnJlZSB0aGUgaW5vZGUgZXh0ZW50OworCSAqLworCisJLyoKKwkgKiAgICAgIHByZXBhcmUgdG8gdXBkYXRlIGlhZyBsaXN0KHMpIChjYXJlZnVsIHVwZGF0ZSBzdGVwIDEpCisJICovCisJYW1wID0gYm1wID0gY21wID0gZG1wID0gTlVMTDsKKwlmd2QgPSBiYWNrID0gLTE7CisKKwkvKiBjaGVjayBpZiB0aGUgaWFnIGN1cnJlbnRseSBoYXMgbm8gZnJlZSBleHRlbnRzLiAgaWYgc28sCisJICogaXQgd2lsbCBiZSBwbGFjZWQgb24gdGhlIGhlYWQgb2YgdGhlIGFnIGV4dGVudCBmcmVlIGxpc3QuCisJICovCisJaWYgKGlhZ3AtPm5mcmVlZXh0cyA9PSAwKSB7CisJCS8qIGNoZWNrIGlmIHRoZSBhZyBleHRlbnQgZnJlZSBsaXN0IGhhcyBhbnkgaWFncy4KKwkJICogaWYgc28sIHJlYWQgdGhlIGlhZyBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCBub3cuCisJCSAqIHRoaXMgKGhlYWQpIGlhZyB3aWxsIGJlIHVwZGF0ZWQgbGF0ZXIgdG8gcmVmbGVjdAorCQkgKiB0aGUgYWRkaXRpb24gb2YgdGhlIGN1cnJlbnQgaWFnIGF0IHRoZSBoZWFkIG9mCisJCSAqIHRoZSBsaXN0LgorCQkgKi8KKwkJaWYgKChmd2QgPSBpbWFwLT5pbV9hZ2N0bFthZ25vXS5leHRmcmVlKSA+PSAwKSB7CisJCQlpZiAoKHJjID0gZGlJQUdSZWFkKGltYXAsIGZ3ZCwgJmFtcCkpKQorCQkJCWdvdG8gZXJyb3Jfb3V0OworCQkJYWlhZ3AgPSAoc3RydWN0IGlhZyAqKSBhbXAtPmRhdGE7CisJCX0KKwl9IGVsc2UgeworCQkvKiBpYWcgaGFzIGZyZWUgZXh0ZW50cy4gY2hlY2sgaWYgdGhlIGFkZGl0aW9uIG9mIGEgZnJlZQorCQkgKiBleHRlbnQgd2lsbCBjYXVzZSBhbGwgZXh0ZW50cyB0byBiZSBmcmVlIHdpdGhpbiB0aGlzCisJCSAqIGlhZy4gIGlmIHNvLCB0aGUgaWFnIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBhZyBleHRlbnQKKwkJICogZnJlZSBsaXN0IGFuZCBwbGFjZWQgb24gdGhlIGlub2RlIG1hcCdzIGZyZWUgaWFnIGxpc3QuCisJCSAqLworCQlpZiAoaWFncC0+bmZyZWVleHRzID09IGNwdV90b19sZTMyKEVYVFNQRVJJQUcgLSAxKSkgeworCQkJLyogaW4gcHJlcGFyYXRpb24gZm9yIHJlbW92aW5nIHRoZSBpYWcgZnJvbSB0aGUKKwkJCSAqIGFnIGV4dGVudCBmcmVlIGxpc3QsIHJlYWQgdGhlIGlhZ3MgcHJlY2VlZGluZworCQkJICogYW5kIGZvbGxvd2luZyB0aGUgaWFnIG9uIHRoZSBhZyBleHRlbnQgZnJlZQorCQkJICogbGlzdC4KKwkJCSAqLworCQkJaWYgKChmd2QgPSBsZTMyX3RvX2NwdShpYWdwLT5leHRmcmVlZndkKSkgPj0gMCkgeworCQkJCWlmICgocmMgPSBkaUlBR1JlYWQoaW1hcCwgZndkLCAmYW1wKSkpCisJCQkJCWdvdG8gZXJyb3Jfb3V0OworCQkJCWFpYWdwID0gKHN0cnVjdCBpYWcgKikgYW1wLT5kYXRhOworCQkJfQorCisJCQlpZiAoKGJhY2sgPSBsZTMyX3RvX2NwdShpYWdwLT5leHRmcmVlYmFjaykpID49IDApIHsKKwkJCQlpZiAoKHJjID0gZGlJQUdSZWFkKGltYXAsIGJhY2ssICZibXApKSkKKwkJCQkJZ290byBlcnJvcl9vdXQ7CisJCQkJYmlhZ3AgPSAoc3RydWN0IGlhZyAqKSBibXAtPmRhdGE7CisJCQl9CisJCX0KKwl9CisKKwkvKiByZW1vdmUgdGhlIGlhZyBmcm9tIHRoZSBhZyBpbm9kZSBmcmVlIGxpc3QgaWYgZnJlZWluZworCSAqIHRoaXMgZXh0ZW50IGNhdXNlIHRoZSBpYWcgdG8gaGF2ZSBubyBmcmVlIGlub2Rlcy4KKwkgKi8KKwlpZiAoaWFncC0+bmZyZWVpbm9zID09IGNwdV90b19sZTMyKElOT1NQRVJFWFQgLSAxKSkgeworCQlpbnQgaW5vZnJlZWJhY2sgPSBsZTMyX3RvX2NwdShpYWdwLT5pbm9mcmVlYmFjayk7CisJCWludCBpbm9mcmVlZndkID0gbGUzMl90b19jcHUoaWFncC0+aW5vZnJlZWZ3ZCk7CisKKwkJLyogaW4gcHJlcGFyYXRpb24gZm9yIHJlbW92aW5nIHRoZSBpYWcgZnJvbSB0aGUKKwkJICogYWcgaW5vZGUgZnJlZSBsaXN0LCByZWFkIHRoZSBpYWdzIHByZWNlZWRpbmcKKwkJICogYW5kIGZvbGxvd2luZyB0aGUgaWFnIG9uIHRoZSBhZyBpbm9kZSBmcmVlCisJCSAqIGxpc3QuICBiZWZvcmUgcmVhZGluZyB0aGVzZSBpYWdzLCB3ZSBtdXN0IG1ha2UKKwkJICogc3VyZSB0aGF0IHdlIGFscmVhZHkgZG9uJ3QgaGF2ZSB0aGVtIGluIGhhbmQKKwkJICogZnJvbSB1cCBhYm92ZSwgc2luY2UgcmUtcmVhZGluZyBhbiBpYWcgKGJ1ZmZlcikKKwkJICogd2UgYXJlIGN1cnJlbnRseSBob2xkaW5nIHdvdWxkIGNhdXNlIGEgZGVhZGxvY2suCisJCSAqLworCQlpZiAoaW5vZnJlZWZ3ZCA+PSAwKSB7CisKKwkJCWlmIChpbm9mcmVlZndkID09IGZ3ZCkKKwkJCQljaWFncCA9IChzdHJ1Y3QgaWFnICopIGFtcC0+ZGF0YTsKKwkJCWVsc2UgaWYgKGlub2ZyZWVmd2QgPT0gYmFjaykKKwkJCQljaWFncCA9IChzdHJ1Y3QgaWFnICopIGJtcC0+ZGF0YTsKKwkJCWVsc2UgeworCQkJCWlmICgocmMgPQorCQkJCSAgICAgZGlJQUdSZWFkKGltYXAsIGlub2ZyZWVmd2QsICZjbXApKSkKKwkJCQkJZ290byBlcnJvcl9vdXQ7CisJCQkJY2lhZ3AgPSAoc3RydWN0IGlhZyAqKSBjbXAtPmRhdGE7CisJCQl9CisJCQlhc3NlcnQoY2lhZ3AgIT0gTlVMTCk7CisJCX0KKworCQlpZiAoaW5vZnJlZWJhY2sgPj0gMCkgeworCQkJaWYgKGlub2ZyZWViYWNrID09IGZ3ZCkKKwkJCQlkaWFncCA9IChzdHJ1Y3QgaWFnICopIGFtcC0+ZGF0YTsKKwkJCWVsc2UgaWYgKGlub2ZyZWViYWNrID09IGJhY2spCisJCQkJZGlhZ3AgPSAoc3RydWN0IGlhZyAqKSBibXAtPmRhdGE7CisJCQllbHNlIHsKKwkJCQlpZiAoKHJjID0KKwkJCQkgICAgIGRpSUFHUmVhZChpbWFwLCBpbm9mcmVlYmFjaywgJmRtcCkpKQorCQkJCQlnb3RvIGVycm9yX291dDsKKwkJCQlkaWFncCA9IChzdHJ1Y3QgaWFnICopIGRtcC0+ZGF0YTsKKwkJCX0KKwkJCWFzc2VydChkaWFncCAhPSBOVUxMKTsKKwkJfQorCX0KKworCUlSRUFEX1VOTE9DSyhpcGltYXApOworCisJLyoKKwkgKiBpbnZhbGlkYXRlIGFueSBwYWdlIG9mIHRoZSBpbm9kZSBleHRlbnQgZnJlZWQgZnJvbSBidWZmZXIgY2FjaGU7CisJICovCisJZnJlZXB4ZCA9IGlhZ3AtPmlub2V4dFtleHRub107CisJaW52YWxpZGF0ZV9weGRfbWV0YXBhZ2VzKGlwLCBmcmVlcHhkKTsKKworCS8qCisJICogICAgICB1cGRhdGUgaWFnIGxpc3QocykgKGNhcmVmdWwgdXBkYXRlIHN0ZXAgMikKKwkgKi8KKwkvKiBhZGQgdGhlIGlhZyB0byB0aGUgYWcgZXh0ZW50IGZyZWUgbGlzdCBpZiB0aGlzIGlzIHRoZQorCSAqIGZpcnN0IGZyZWUgZXh0ZW50IGZvciB0aGUgaWFnLgorCSAqLworCWlmIChpYWdwLT5uZnJlZWV4dHMgPT0gMCkgeworCQlpZiAoZndkID49IDApCisJCQlhaWFncC0+ZXh0ZnJlZWJhY2sgPSBjcHVfdG9fbGUzMihpYWdubyk7CisKKwkJaWFncC0+ZXh0ZnJlZWZ3ZCA9CisJCSAgICBjcHVfdG9fbGUzMihpbWFwLT5pbV9hZ2N0bFthZ25vXS5leHRmcmVlKTsKKwkJaWFncC0+ZXh0ZnJlZWJhY2sgPSBjcHVfdG9fbGUzMigtMSk7CisJCWltYXAtPmltX2FnY3RsW2Fnbm9dLmV4dGZyZWUgPSBpYWdubzsKKwl9IGVsc2UgeworCQkvKiByZW1vdmUgdGhlIGlhZyBmcm9tIHRoZSBhZyBleHRlbnQgbGlzdCBpZiBhbGwgZXh0ZW50cworCQkgKiBhcmUgbm93IGZyZWUgYW5kIHBsYWNlIGl0IG9uIHRoZSBpbm9kZSBtYXAgaWFnIGZyZWUgbGlzdC4KKwkJICovCisJCWlmIChpYWdwLT5uZnJlZWV4dHMgPT0gY3B1X3RvX2xlMzIoRVhUU1BFUklBRyAtIDEpKSB7CisJCQlpZiAoZndkID49IDApCisJCQkJYWlhZ3AtPmV4dGZyZWViYWNrID0gaWFncC0+ZXh0ZnJlZWJhY2s7CisKKwkJCWlmIChiYWNrID49IDApCisJCQkJYmlhZ3AtPmV4dGZyZWVmd2QgPSBpYWdwLT5leHRmcmVlZndkOworCQkJZWxzZQorCQkJCWltYXAtPmltX2FnY3RsW2Fnbm9dLmV4dGZyZWUgPQorCQkJCSAgICBsZTMyX3RvX2NwdShpYWdwLT5leHRmcmVlZndkKTsKKworCQkJaWFncC0+ZXh0ZnJlZWZ3ZCA9IGlhZ3AtPmV4dGZyZWViYWNrID0gY3B1X3RvX2xlMzIoLTEpOworCisJCQlJQUdGUkVFX0xPQ0soaW1hcCk7CisJCQlpYWdwLT5pYWdmcmVlID0gY3B1X3RvX2xlMzIoaW1hcC0+aW1fZnJlZWlhZyk7CisJCQlpbWFwLT5pbV9mcmVlaWFnID0gaWFnbm87CisJCQlJQUdGUkVFX1VOTE9DSyhpbWFwKTsKKwkJfQorCX0KKworCS8qIHJlbW92ZSB0aGUgaWFnIGZyb20gdGhlIGFnIGlub2RlIGZyZWUgbGlzdCBpZiBmcmVlaW5nCisJICogdGhpcyBleHRlbnQgY2F1c2VzIHRoZSBpYWcgdG8gaGF2ZSBubyBmcmVlIGlub2Rlcy4KKwkgKi8KKwlpZiAoaWFncC0+bmZyZWVpbm9zID09IGNwdV90b19sZTMyKElOT1NQRVJFWFQgLSAxKSkgeworCQlpZiAoKGludCkgbGUzMl90b19jcHUoaWFncC0+aW5vZnJlZWZ3ZCkgPj0gMCkKKwkJCWNpYWdwLT5pbm9mcmVlYmFjayA9IGlhZ3AtPmlub2ZyZWViYWNrOworCisJCWlmICgoaW50KSBsZTMyX3RvX2NwdShpYWdwLT5pbm9mcmVlYmFjaykgPj0gMCkKKwkJCWRpYWdwLT5pbm9mcmVlZndkID0gaWFncC0+aW5vZnJlZWZ3ZDsKKwkJZWxzZQorCQkJaW1hcC0+aW1fYWdjdGxbYWdub10uaW5vZnJlZSA9CisJCQkgICAgbGUzMl90b19jcHUoaWFncC0+aW5vZnJlZWZ3ZCk7CisKKwkJaWFncC0+aW5vZnJlZWZ3ZCA9IGlhZ3AtPmlub2ZyZWViYWNrID0gY3B1X3RvX2xlMzIoLTEpOworCX0KKworCS8qIHVwZGF0ZSB0aGUgaW5vZGUgZXh0ZW50IGFkZHJlc3MgYW5kIHdvcmtpbmcgbWFwIAorCSAqIHRvIHJlZmxlY3QgdGhlIGZyZWUgZXh0ZW50LgorCSAqIHRoZSBwZXJtYW5lbnQgbWFwIHNob3VsZCBoYXZlIGJlZW4gdXBkYXRlZCBhbHJlYWR5IAorCSAqIGZvciB0aGUgaW5vZGUgYmVpbmcgZnJlZWQuCisJICovCisJaWYgKGlhZ3AtPnBtYXBbZXh0bm9dICE9IDApIHsKKwkJamZzX2Vycm9yKGlwLT5pX3NiLCAiZGlGcmVlOiB0aGUgcG1hcCBkb2VzIG5vdCBzaG93IGlub2RlIGZyZWUiKTsKKwl9CisJaWFncC0+d21hcFtleHRub10gPSAwOworCURCR19ESUZSRUUoaW1hcCwgaW51bSk7CisJUFhEbGVuZ3RoKCZpYWdwLT5pbm9leHRbZXh0bm9dLCAwKTsKKwlQWERhZGRyZXNzKCZpYWdwLT5pbm9leHRbZXh0bm9dLCAwKTsKKworCS8qIHVwZGF0ZSB0aGUgZnJlZSBleHRlbnQgYW5kIGZyZWUgaW5vZGUgc3VtbWFyeSBtYXBzCisJICogdG8gcmVmbGVjdCB0aGUgZnJlZWQgZXh0ZW50LgorCSAqIHRoZSBpbm9kZSBzdW1tYXJ5IG1hcCBpcyBtYXJrZWQgdG8gaW5kaWNhdGUgbm8gaW5vZGVzIAorCSAqIGF2YWlsYWJsZSBmb3IgdGhlIGZyZWVkIGV4dGVudC4KKwkgKi8KKwlzd29yZCA9IGV4dG5vID4+IEwyRVhUU1BFUlNVTTsKKwliaXRubyA9IGV4dG5vICYgKEVYVFNQRVJTVU0gLSAxKTsKKwltYXNrID0gSElHSE9SREVSID4+IGJpdG5vOworCWlhZ3AtPmlub3NtYXBbc3dvcmRdIHw9IGNwdV90b19sZTMyKG1hc2spOworCWlhZ3AtPmV4dHNtYXBbc3dvcmRdICY9IGNwdV90b19sZTMyKH5tYXNrKTsKKworCS8qIHVwZGF0ZSB0aGUgbnVtYmVyIG9mIGZyZWUgaW5vZGVzIGFuZCBudW1iZXIgb2YgZnJlZSBleHRlbnRzCisJICogZm9yIHRoZSBpYWcuCisJICovCisJaWFncC0+bmZyZWVpbm9zID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoaWFncC0+bmZyZWVpbm9zKSAtCisJCQkJICAgICAgKElOT1NQRVJFWFQgLSAxKSk7CisJaWFncC0+bmZyZWVleHRzID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoaWFncC0+bmZyZWVleHRzKSArIDEpOworCisJLyogdXBkYXRlIHRoZSBudW1iZXIgb2YgZnJlZSBpbm9kZXMgYW5kIGJhY2tlZCBpbm9kZXMKKwkgKiBhdCB0aGUgYWcgYW5kIGlub2RlIG1hcCBsZXZlbC4KKwkgKi8KKwlpbWFwLT5pbV9hZ2N0bFthZ25vXS5udW1mcmVlIC09IChJTk9TUEVSRVhUIC0gMSk7CisJaW1hcC0+aW1fYWdjdGxbYWdub10ubnVtaW5vcyAtPSBJTk9TUEVSRVhUOworCWF0b21pY19zdWIoSU5PU1BFUkVYVCAtIDEsICZpbWFwLT5pbV9udW1mcmVlKTsKKwlhdG9taWNfc3ViKElOT1NQRVJFWFQsICZpbWFwLT5pbV9udW1pbm9zKTsKKworCWlmIChhbXApCisJCXdyaXRlX21ldGFwYWdlKGFtcCk7CisJaWYgKGJtcCkKKwkJd3JpdGVfbWV0YXBhZ2UoYm1wKTsKKwlpZiAoY21wKQorCQl3cml0ZV9tZXRhcGFnZShjbXApOworCWlmIChkbXApCisJCXdyaXRlX21ldGFwYWdlKGRtcCk7CisKKwkvKgorCSAqIHN0YXJ0IHRyYW5zYWN0aW9uIHRvIHVwZGF0ZSBibG9jayBhbGxvY2F0aW9uIG1hcAorCSAqIGZvciB0aGUgaW5vZGUgZXh0ZW50IGZyZWVkOworCSAqCisJICogTi5CLiBBR19MT0NLIGlzIHJlbGVhc2VkIGFuZCBpYWcgd2lsbCBiZSByZWxlYXNlZCBiZWxvdywgYW5kIAorCSAqIG90aGVyIHRocmVhZCBtYXkgYWxsb2NhdGUgaW5vZGUgZnJvbS9yZXVzaW5nIHRoZSBpeGFkIGZyZWVkCisJICogQlVUIHdpdGggbmV3L2RpZmZlcmVudCBiYWNraW5nIGlub2RlIGV4dGVudCBmcm9tIHRoZSBleHRlbnQgCisJICogdG8gYmUgZnJlZWQgYnkgdGhlIHRyYW5zYWN0aW9uOyAgCisJICovCisJdGlkID0gdHhCZWdpbihpcGltYXAtPmlfc2IsIENPTU1JVF9GT1JDRSk7CisJZG93bigmSkZTX0lQKGlwaW1hcCktPmNvbW1pdF9zZW0pOworCisJLyogYWNxdWlyZSB0bG9jayBvZiB0aGUgaWFnIHBhZ2Ugb2YgdGhlIGZyZWVkIGl4YWQgCisJICogdG8gZm9yY2UgdGhlIHBhZ2UgTk9IT01FT0sgKGV2ZW4gdGhvdWdoIG5vIGRhdGEgaXMKKwkgKiBsb2dnZWQgZnJvbSB0aGUgaWFnIHBhZ2UpIHVudGlsIE5PUkVET1BBR0V8RlJFRVhURU5UIGxvZyAKKwkgKiBmb3IgdGhlIGZyZWUgb2YgdGhlIGV4dGVudCBpcyBjb21taXR0ZWQ7CisJICogd3JpdGUgRlJFRVhURU5UfE5PUkVET1BBR0UgbG9nIHJlY29yZAorCSAqIE4uQi4gbGluZWxvY2sgaXMgb3ZlcmxhaWQgYXMgZnJlZWQgZXh0ZW50IGRlc2NyaXB0b3I7CisJICovCisJdGxjayA9IHR4TG9jayh0aWQsIGlwaW1hcCwgbXAsIHRsY2tJTk9ERSB8IHRsY2tGUkVFKTsKKwlweGRsb2NrID0gKHN0cnVjdCBweGRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisJcHhkbG9jay0+ZmxhZyA9IG1sY2tGUkVFUFhEOworCXB4ZGxvY2stPnB4ZCA9IGZyZWVweGQ7CisJcHhkbG9jay0+aW5kZXggPSAxOworCisJd3JpdGVfbWV0YXBhZ2UobXApOworCisJaXBsaXN0WzBdID0gaXBpbWFwOworCisJLyoKKwkgKiBsb2dyZWRvIG5lZWRzIHRoZSBJQUcgbnVtYmVyIGFuZCBJQUcgZXh0ZW50IGluZGV4IGluIG9yZGVyCisJICogdG8gZW5zdXJlIHRoYXQgdGhlIElNYXAgaXMgY29uc2lzdGVudC4gIFRoZSBsZWFzdCBkaXNydXB0aXZlCisJICogd2F5IHRvIHBhc3MgdGhlc2UgdmFsdWVzIHRocm91Z2ggIHRvIHRoZSB0cmFuc2FjdGlvbiBtYW5hZ2VyCisJICogaXMgaW4gdGhlIGlwbGlzdCBhcnJheS4gIAorCSAqIAorCSAqIEl0J3Mgbm90IHByZXR0eSwgYnV0IGl0IHdvcmtzLgorCSAqLworCWlwbGlzdFsxXSA9IChzdHJ1Y3QgaW5vZGUgKikgKHNpemVfdClpYWdubzsKKwlpcGxpc3RbMl0gPSAoc3RydWN0IGlub2RlICopIChzaXplX3QpZXh0bm87CisKKwlyYyA9IHR4Q29tbWl0KHRpZCwgMSwgJmlwbGlzdFswXSwgQ09NTUlUX0ZPUkNFKTsKKworCXR4RW5kKHRpZCk7CisJdXAoJkpGU19JUChpcGltYXApLT5jb21taXRfc2VtKTsKKworCS8qIHVubG9jayB0aGUgQUcgaW5vZGUgbWFwIGluZm9ybWF0aW9uICovCisJQUdfVU5MT0NLKGltYXAsIGFnbm8pOworCisJcmV0dXJuICgwKTsKKworICAgICAgZXJyb3Jfb3V0OgorCUlSRUFEX1VOTE9DSyhpcGltYXApOworCisJaWYgKGFtcCkKKwkJcmVsZWFzZV9tZXRhcGFnZShhbXApOworCWlmIChibXApCisJCXJlbGVhc2VfbWV0YXBhZ2UoYm1wKTsKKwlpZiAoY21wKQorCQlyZWxlYXNlX21ldGFwYWdlKGNtcCk7CisJaWYgKGRtcCkKKwkJcmVsZWFzZV9tZXRhcGFnZShkbXApOworCisJQUdfVU5MT0NLKGltYXAsIGFnbm8pOworCisJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisKKwlyZXR1cm4gKHJjKTsKK30KKworLyoKKyAqIFRoZXJlIGFyZSBzZXZlcmFsIHBsYWNlcyBpbiB0aGUgZGlBbGxvYyogcm91dGluZXMgd2hlcmUgd2UgaW5pdGlhbGl6ZQorICogdGhlIGlub2RlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2RpSW5pdElub2RlKHN0cnVjdCBpbm9kZSAqaXAsIGludCBpYWdubywgaW50IGlubywgaW50IGV4dG5vLCBzdHJ1Y3QgaWFnICogaWFncCkKK3sKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoaXAtPmlfc2IpOworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamZzX2lwID0gSkZTX0lQKGlwKTsKKworCWlwLT5pX2lubyA9IChpYWdubyA8PCBMMklOT1NQRVJJQUcpICsgaW5vOworCURCR19ESUFMTE9DKEpGU19JUChpcGltYXApLT5pX2ltYXAsIGlwLT5pX2lubyk7CisJamZzX2lwLT5peHB4ZCA9IGlhZ3AtPmlub2V4dFtleHRub107CisJamZzX2lwLT5hZ25vID0gQkxLVE9BRyhsZTY0X3RvX2NwdShpYWdwLT5hZ3N0YXJ0KSwgc2JpKTsKKwlqZnNfaXAtPmFjdGl2ZV9hZyA9IC0xOworfQorCisKKy8qCisgKiBOQU1FOiAgICAgICAgZGlBbGxvYyhwaXAsZGlyLGlwKQorICoKKyAqIEZVTkNUSU9OOiAgICBhbGxvY2F0ZSBhIGRpc2sgaW5vZGUgZnJvbSB0aGUgaW5vZGUgd29ya2luZyBtYXAgCisgKgkJZm9yIGEgZmlsZXNldCBvciBhZ2dyZWdhdGUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgcGlwICAJLSBwb2ludGVyIHRvIGluY29yZSBpbm9kZSBmb3IgdGhlIHBhcmVudCBpbm9kZS4KKyAqICAgICAgZGlyICAJLSBUUlVFIGlmIHRoZSBuZXcgZGlzayBpbm9kZSBpcyBmb3IgYSBkaXJlY3RvcnkuCisgKiAgICAgIGlwICAJLSBwb2ludGVyIHRvIGEgbmV3IGlub2RlCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMCAgICAgICAtIHN1Y2Nlc3MuCisgKiAgICAgIC1FTk9TUEMJLSBpbnN1ZmZpY2llbnQgZGlzayByZXNvdXJjZXMuCisgKiAgICAgIC1FSU8gIAktIGkvbyBlcnJvci4KKyAqLworaW50IGRpQWxsb2Moc3RydWN0IGlub2RlICpwaXAsIGJvb2xlYW5fdCBkaXIsIHN0cnVjdCBpbm9kZSAqaXApCit7CisJaW50IHJjLCBpbm8sIGlhZ25vLCBhZGRleHQsIGV4dG5vLCBiaXRubywgc3dvcmQ7CisJaW50IG53b3JkcywgcmVtLCBpLCBhZ25vOworCXUzMiBtYXNrLCBpbm9zbWFwLCBleHRzbWFwOworCXN0cnVjdCBpbm9kZSAqaXBpbWFwOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJaW5vX3QgaW51bTsKKwlzdHJ1Y3QgaWFnICppYWdwOworCXN0cnVjdCBpbm9tYXAgKmltYXA7CisKKwkvKiBnZXQgdGhlIHBvaW50ZXJzIHRvIHRoZSBpbm9kZSBtYXAgaW5vZGUgYW5kIHRoZQorCSAqIGNvcnJlc3BvbmRpbmcgaW1hcCBjb250cm9sIHN0cnVjdHVyZS4KKwkgKi8KKwlpcGltYXAgPSBKRlNfU0JJKHBpcC0+aV9zYiktPmlwaW1hcDsKKwlpbWFwID0gSkZTX0lQKGlwaW1hcCktPmlfaW1hcDsKKwlKRlNfSVAoaXApLT5pcGltYXAgPSBpcGltYXA7CisJSkZTX0lQKGlwKS0+ZmlsZXNldCA9IEZJTEVTWVNURU1fSTsKKworCS8qIGZvciBhIGRpcmVjdG9yeSwgdGhlIGFsbG9jYXRpb24gcG9saWN5IGlzIHRvIHN0YXJ0IAorCSAqIGF0IHRoZSBhZyBsZXZlbCB1c2luZyB0aGUgcHJlZmVycmVkIGFnLgorCSAqLworCWlmIChkaXIgPT0gVFJVRSkgeworCQlhZ25vID0gZGJOZXh0QUcoSkZTX1NCSShwaXAtPmlfc2IpLT5pcGJtYXApOworCQlBR19MT0NLKGltYXAsIGFnbm8pOworCQlnb3RvIHRyeWFnOworCX0KKworCS8qIGZvciBmaWxlcywgdGhlIHBvbGljeSBzdGFydHMgb2ZmIGJ5IHRyeWluZyB0byBhbGxvY2F0ZSBmcm9tCisJICogdGhlIHNhbWUgaWFnIGNvbnRhaW5pbmcgdGhlIHBhcmVudCBkaXNrIGlub2RlOgorCSAqIHRyeSB0byBhbGxvY2F0ZSB0aGUgbmV3IGRpc2sgaW5vZGUgY2xvc2UgdG8gdGhlIHBhcmVudCBkaXNrCisJICogaW5vZGUsIHVzaW5nIHBhcmVudCBkaXNrIGlub2RlIG51bWJlciArIDEgYXMgdGhlIGFsbG9jYXRpb24KKwkgKiBoaW50LiAgKHdlIHVzZSBhIGxlZnQtdG8tcmlnaHQgcG9saWN5IHRvIGF0dGVtcHQgdG8gYXZvaWQKKwkgKiBtb3ZpbmcgYmFja3dhcmQgb24gdGhlIGRpc2suKSAgY29tcHV0ZSB0aGUgaGludCB3aXRoaW4gdGhlCisJICogZmlsZSBzeXN0ZW0gYW5kIHRoZSBpYWcuCisJICovCisKKwkvKiBnZXQgdGhlIGFnIG51bWJlciBvZiB0aGlzIGlhZyAqLworCWFnbm8gPSBKRlNfSVAocGlwKS0+YWdubzsKKworCWlmIChhdG9taWNfcmVhZCgmSkZTX1NCSShwaXAtPmlfc2IpLT5ibWFwLT5kYl9hY3RpdmVbYWdub10pKSB7CisJCS8qCisJCSAqIFRoZXJlIGlzIGFuIG9wZW4gZmlsZSBhY3RpdmVseSBncm93aW5nLiAgV2Ugd2FudCB0bworCQkgKiBhbGxvY2F0ZSBuZXcgaW5vZGVzIGZyb20gYSBkaWZmZXJlbnQgYWcgdG8gYXZvaWQKKwkJICogZnJhZ21lbnRhdGlvbiBwcm9ibGVtcy4KKwkJICovCisJCWFnbm8gPSBkYk5leHRBRyhKRlNfU0JJKHBpcC0+aV9zYiktPmlwYm1hcCk7CisJCUFHX0xPQ0soaW1hcCwgYWdubyk7CisJCWdvdG8gdHJ5YWc7CisJfQorCisJaW51bSA9IHBpcC0+aV9pbm8gKyAxOworCWlubyA9IGludW0gJiAoSU5PU1BFUklBRyAtIDEpOworCisJLyogYmFjayBvZmYgdGhlIHRoZSBoaW50IGlmIGl0IGlzIG91dHNpZGUgb2YgdGhlIGlhZyAqLworCWlmIChpbm8gPT0gMCkKKwkJaW51bSA9IHBpcC0+aV9pbm87CisKKwkvKiBsb2NrIHRoZSBBRyBpbm9kZSBtYXAgaW5mb3JtYXRpb24gKi8KKwlBR19MT0NLKGltYXAsIGFnbm8pOworCisJLyogR2V0IHJlYWQgbG9jayBvbiBpbWFwIGlub2RlICovCisJSVJFQURfTE9DSyhpcGltYXApOworCisJLyogZ2V0IHRoZSBpYWcgbnVtYmVyIGFuZCByZWFkIHRoZSBpYWcgKi8KKwlpYWdubyA9IElOT1RPSUFHKGludW0pOworCWlmICgocmMgPSBkaUlBR1JlYWQoaW1hcCwgaWFnbm8sICZtcCkpKSB7CisJCUlSRUFEX1VOTE9DSyhpcGltYXApOworCQlBR19VTkxPQ0soaW1hcCwgYWdubyk7CisJCXJldHVybiAocmMpOworCX0KKwlpYWdwID0gKHN0cnVjdCBpYWcgKikgbXAtPmRhdGE7CisKKwkvKiBkZXRlcm1pbmUgaWYgbmV3IGlub2RlIGV4dGVudCBpcyBhbGxvd2VkIHRvIGJlIGFkZGVkIHRvIHRoZSBpYWcuCisJICogbmV3IGlub2RlIGV4dGVudCBjYW4gYmUgYWRkZWQgdG8gdGhlIGlhZyBpZiB0aGUgYWcKKwkgKiBoYXMgbGVzcyB0aGFuIDMyIGZyZWUgZGlzayBpbm9kZXMgYW5kIHRoZSBpYWcgaGFzIGZyZWUgZXh0ZW50cy4KKwkgKi8KKwlhZGRleHQgPSAoaW1hcC0+aW1fYWdjdGxbYWdub10ubnVtZnJlZSA8IDMyICYmIGlhZ3AtPm5mcmVlZXh0cyk7CisKKwkvKgorCSAqICAgICAgdHJ5IHRvIGFsbG9jYXRlIGZyb20gdGhlIElBRworCSAqLworCS8qIGNoZWNrIGlmIHRoZSBpbm9kZSBtYXkgYmUgYWxsb2NhdGVkIGZyb20gdGhlIGlhZyAKKwkgKiAoaS5lLiB0aGUgaW5vZGUgaGFzIGZyZWUgaW5vZGVzIG9yIG5ldyBleHRlbnQgY2FuIGJlIGFkZGVkKS4KKwkgKi8KKwlpZiAoaWFncC0+bmZyZWVpbm9zIHx8IGFkZGV4dCkgeworCQkvKiBkZXRlcm1pbmUgdGhlIGV4dGVudCBudW1iZXIgb2YgdGhlIGhpbnQuCisJCSAqLworCQlleHRubyA9IGlubyA+PiBMMklOT1NQRVJFWFQ7CisKKwkJLyogY2hlY2sgaWYgdGhlIGV4dGVudCBjb250YWluaW5nIHRoZSBoaW50IGhhcyBiYWNrZWQKKwkJICogaW5vZGVzLiAgaWYgc28sIHRyeSB0byBhbGxvY2F0ZSB3aXRoaW4gdGhpcyBleHRlbnQuCisJCSAqLworCQlpZiAoYWRkcmVzc1BYRCgmaWFncC0+aW5vZXh0W2V4dG5vXSkpIHsKKwkJCWJpdG5vID0gaW5vICYgKElOT1NQRVJFWFQgLSAxKTsKKwkJCWlmICgoYml0bm8gPQorCQkJICAgICBkaUZpbmRGcmVlKGxlMzJfdG9fY3B1KGlhZ3AtPndtYXBbZXh0bm9dKSwKKwkJCQkJYml0bm8pKQorCQkJICAgIDwgSU5PU1BFUkVYVCkgeworCQkJCWlubyA9IChleHRubyA8PCBMMklOT1NQRVJFWFQpICsgYml0bm87CisKKwkJCQkvKiBhIGZyZWUgaW5vZGUgKGJpdCkgd2FzIGZvdW5kIHdpdGhpbiB0aGlzCisJCQkJICogZXh0ZW50LCBzbyBhbGxvY2F0ZSBpdC4KKwkJCQkgKi8KKwkJCQlyYyA9IGRpQWxsb2NCaXQoaW1hcCwgaWFncCwgaW5vKTsKKwkJCQlJUkVBRF9VTkxPQ0soaXBpbWFwKTsKKwkJCQlpZiAocmMpIHsKKwkJCQkJYXNzZXJ0KHJjID09IC1FSU8pOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIHNldCB0aGUgcmVzdWx0cyBvZiB0aGUgYWxsb2NhdGlvbgorCQkJCQkgKiBhbmQgd3JpdGUgdGhlIGlhZy4KKwkJCQkJICovCisJCQkJCWRpSW5pdElub2RlKGlwLCBpYWdubywgaW5vLCBleHRubywKKwkJCQkJCSAgICBpYWdwKTsKKwkJCQkJbWFya19tZXRhcGFnZV9kaXJ0eShtcCk7CisJCQkJfQorCQkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCisJCQkJLyogZnJlZSB0aGUgQUcgbG9jayBhbmQgcmV0dXJuLgorCQkJCSAqLworCQkJCUFHX1VOTE9DSyhpbWFwLCBhZ25vKTsKKwkJCQlyZXR1cm4gKHJjKTsKKwkJCX0KKworCQkJaWYgKCFhZGRleHQpCisJCQkJZXh0bm8gPQorCQkJCSAgICAoZXh0bm8gPT0KKwkJCQkgICAgIEVYVFNQRVJJQUcgLSAxKSA/IDAgOiBleHRubyArIDE7CisJCX0KKworCQkvKgorCQkgKiBubyBmcmVlIGlub2RlcyB3aXRoaW4gdGhlIGV4dGVudCBjb250YWluaW5nIHRoZSBoaW50LgorCQkgKgorCQkgKiB0cnkgdG8gYWxsb2NhdGUgZnJvbSB0aGUgYmFja2VkIGV4dGVudHMgZm9sbG93aW5nCisJCSAqIGhpbnQgb3IsIGlmIGFwcHJvcHJpYXRlIChpLmUuIGFkZGV4dCBpcyB0cnVlKSwgYWxsb2NhdGUKKwkJICogYW4gZXh0ZW50IG9mIGZyZWUgaW5vZGVzIGF0IG9yIGZvbGxvd2luZyB0aGUgZXh0ZW50CisJCSAqIGNvbnRhaW5pbmcgdGhlIGhpbnQuCisJCSAqIAorCQkgKiB0aGUgZnJlZSBpbm9kZSBhbmQgZnJlZSBleHRlbnQgc3VtbWFyeSBtYXBzIGFyZSB1c2VkCisJCSAqIGhlcmUsIHNvIGRldGVybWluZSB0aGUgc3RhcnRpbmcgc3VtbWFyeSBtYXAgcG9zaXRpb24KKwkJICogYW5kIHRoZSBudW1iZXIgb2Ygd29yZHMgd2UnbGwgaGF2ZSB0byBleGFtaW5lLiAgYWdhaW4sCisJCSAqIHRoZSBhcHByb2FjaCBpcyB0byBhbGxvY2F0ZSBmb2xsb3dpbmcgdGhlIGhpbnQsIHNvIHdlCisJCSAqIG1pZ2h0IGhhdmUgdG8gaW5pdGlhbGx5IGlnbm9yZSBwcmlvciBiaXRzIG9mIHRoZSBzdW1tYXJ5CisJCSAqIG1hcCB0aGF0IHJlcHJlc2VudCBleHRlbnRzIHByaW9yIHRvIHRoZSBleHRlbnQgY29udGFpbmluZworCQkgKiB0aGUgaGludCBhbmQgbGF0ZXIgcmV2aXNpdCB0aGVzZSBiaXRzLgorCQkgKi8KKwkJYml0bm8gPSBleHRubyAmIChFWFRTUEVSU1VNIC0gMSk7CisJCW53b3JkcyA9IChiaXRubyA9PSAwKSA/IFNNQVBTWiA6IFNNQVBTWiArIDE7CisJCXN3b3JkID0gZXh0bm8gPj4gTDJFWFRTUEVSU1VNOworCisJCS8qIG1hc2sgYW55IHByaW9yIGJpdHMgZm9yIHRoZSBzdGFydGluZyB3b3JkcyBvZiB0aGUKKwkJICogc3VtbWFyeSBtYXAuCisJCSAqLworCQltYXNrID0gT05FUyA8PCAoRVhUU1BFUlNVTSAtIGJpdG5vKTsKKwkJaW5vc21hcCA9IGxlMzJfdG9fY3B1KGlhZ3AtPmlub3NtYXBbc3dvcmRdKSB8IG1hc2s7CisJCWV4dHNtYXAgPSBsZTMyX3RvX2NwdShpYWdwLT5leHRzbWFwW3N3b3JkXSkgfCBtYXNrOworCisJCS8qIHNjYW4gdGhlIGZyZWUgaW5vZGUgYW5kIGZyZWUgZXh0ZW50IHN1bW1hcnkgbWFwcyBmb3IKKwkJICogZnJlZSByZXNvdXJjZXMuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyBpKyspIHsKKwkJCS8qIGNoZWNrIGlmIHRoaXMgd29yZCBvZiB0aGUgZnJlZSBpbm9kZSBzdW1tYXJ5CisJCQkgKiBtYXAgZGVzY3JpYmVzIGFuIGV4dGVudCB3aXRoIGZyZWUgaW5vZGVzLgorCQkJICovCisJCQlpZiAofmlub3NtYXApIHsKKwkJCQkvKiBhbiBleHRlbnQgd2l0aCBmcmVlIGlub2RlcyBoYXMgYmVlbgorCQkJCSAqIGZvdW5kLiBkZXRlcm1pbmUgdGhlIGV4dGVudCBudW1iZXIKKwkJCQkgKiBhbmQgdGhlIGlub2RlIG51bWJlciB3aXRoaW4gdGhlIGV4dGVudC4KKwkJCQkgKi8KKwkJCQlyZW0gPSBkaUZpbmRGcmVlKGlub3NtYXAsIDApOworCQkJCWV4dG5vID0gKHN3b3JkIDw8IEwyRVhUU1BFUlNVTSkgKyByZW07CisJCQkJcmVtID0gZGlGaW5kRnJlZShsZTMyX3RvX2NwdShpYWdwLT53bWFwW2V4dG5vXSksCisJCQkJCQkgMCk7CisJCQkJaWYgKHJlbSA+PSBJTk9TUEVSRVhUKSB7CisJCQkJCUlSRUFEX1VOTE9DSyhpcGltYXApOworCQkJCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJCQkJQUdfVU5MT0NLKGltYXAsIGFnbm8pOworCQkJCQlqZnNfZXJyb3IoaXAtPmlfc2IsCisJCQkJCQkgICJkaUFsbG9jOiBjYW4ndCBmaW5kIGZyZWUgYml0ICIKKwkJCQkJCSAgImluIHdtYXAiKTsKKwkJCQkJcmV0dXJuIEVJTzsKKwkJCQl9CisKKwkJCQkvKiBkZXRlcm1pbmUgdGhlIGlub2RlIG51bWJlciB3aXRoaW4gdGhlCisJCQkJICogaWFnIGFuZCBhbGxvY2F0ZSB0aGUgaW5vZGUgZnJvbSB0aGUKKwkJCQkgKiBtYXAuCisJCQkJICovCisJCQkJaW5vID0gKGV4dG5vIDw8IEwySU5PU1BFUkVYVCkgKyByZW07CisJCQkJcmMgPSBkaUFsbG9jQml0KGltYXAsIGlhZ3AsIGlubyk7CisJCQkJSVJFQURfVU5MT0NLKGlwaW1hcCk7CisJCQkJaWYgKHJjKQorCQkJCQlhc3NlcnQocmMgPT0gLUVJTyk7CisJCQkJZWxzZSB7CisJCQkJCS8qIHNldCB0aGUgcmVzdWx0cyBvZiB0aGUgYWxsb2NhdGlvbgorCQkJCQkgKiBhbmQgd3JpdGUgdGhlIGlhZy4KKwkJCQkJICovCisJCQkJCWRpSW5pdElub2RlKGlwLCBpYWdubywgaW5vLCBleHRubywKKwkJCQkJCSAgICBpYWdwKTsKKwkJCQkJbWFya19tZXRhcGFnZV9kaXJ0eShtcCk7CisJCQkJfQorCQkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCisJCQkJLyogZnJlZSB0aGUgQUcgbG9jayBhbmQgcmV0dXJuLgorCQkJCSAqLworCQkJCUFHX1VOTE9DSyhpbWFwLCBhZ25vKTsKKwkJCQlyZXR1cm4gKHJjKTsKKworCQkJfQorCisJCQkvKiBjaGVjayBpZiB3ZSBtYXkgYWxsb2NhdGUgYW4gZXh0ZW50IG9mIGZyZWUKKwkJCSAqIGlub2RlcyBhbmQgd2hldGhlciB0aGlzIHdvcmQgb2YgdGhlIGZyZWUKKwkJCSAqIGV4dGVudHMgc3VtbWFyeSBtYXAgZGVzY3JpYmVzIGEgZnJlZSBleHRlbnQuCisJCQkgKi8KKwkJCWlmIChhZGRleHQgJiYgfmV4dHNtYXApIHsKKwkJCQkvKiBhIGZyZWUgZXh0ZW50IGhhcyBiZWVuIGZvdW5kLiAgZGV0ZXJtaW5lCisJCQkJICogdGhlIGV4dGVudCBudW1iZXIuCisJCQkJICovCisJCQkJcmVtID0gZGlGaW5kRnJlZShleHRzbWFwLCAwKTsKKwkJCQlleHRubyA9IChzd29yZCA8PCBMMkVYVFNQRVJTVU0pICsgcmVtOworCisJCQkJLyogYWxsb2NhdGUgYW4gZXh0ZW50IG9mIGZyZWUgaW5vZGVzLgorCQkJCSAqLworCQkJCWlmICgocmMgPSBkaU5ld0V4dChpbWFwLCBpYWdwLCBleHRubykpKSB7CisJCQkJCS8qIGlmIHRoZXJlIGlzIG5vIGRpc2sgc3BhY2UgZm9yIGEKKwkJCQkJICogbmV3IGV4dGVudCwgdHJ5IHRvIGFsbG9jYXRlIHRoZQorCQkJCQkgKiBkaXNrIGlub2RlIGZyb20gc29tZXdoZXJlIGVsc2UuCisJCQkJCSAqLworCQkJCQlpZiAocmMgPT0gLUVOT1NQQykKKwkJCQkJCWJyZWFrOworCisJCQkJCWFzc2VydChyYyA9PSAtRUlPKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBzZXQgdGhlIHJlc3VsdHMgb2YgdGhlIGFsbG9jYXRpb24KKwkJCQkJICogYW5kIHdyaXRlIHRoZSBpYWcuCisJCQkJCSAqLworCQkJCQlkaUluaXRJbm9kZShpcCwgaWFnbm8sCisJCQkJCQkgICAgZXh0bm8gPDwgTDJJTk9TUEVSRVhULAorCQkJCQkJICAgIGV4dG5vLCBpYWdwKTsKKwkJCQkJbWFya19tZXRhcGFnZV9kaXJ0eShtcCk7CisJCQkJfQorCQkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQkJCS8qIGZyZWUgdGhlIGltYXAgaW5vZGUgJiB0aGUgQUcgbG9jayAmIHJldHVybi4KKwkJCQkgKi8KKwkJCQlJUkVBRF9VTkxPQ0soaXBpbWFwKTsKKwkJCQlBR19VTkxPQ0soaW1hcCwgYWdubyk7CisJCQkJcmV0dXJuIChyYyk7CisJCQl9CisKKwkJCS8qIG1vdmUgb24gdG8gdGhlIG5leHQgc2V0IG9mIHN1bW1hcnkgbWFwIHdvcmRzLgorCQkJICovCisJCQlzd29yZCA9IChzd29yZCA9PSBTTUFQU1ogLSAxKSA/IDAgOiBzd29yZCArIDE7CisJCQlpbm9zbWFwID0gbGUzMl90b19jcHUoaWFncC0+aW5vc21hcFtzd29yZF0pOworCQkJZXh0c21hcCA9IGxlMzJfdG9fY3B1KGlhZ3AtPmV4dHNtYXBbc3dvcmRdKTsKKwkJfQorCX0KKwkvKiB1bmxvY2sgaW1hcCBpbm9kZSAqLworCUlSRUFEX1VOTE9DSyhpcGltYXApOworCisJLyogbm90aGluZyBkb2luZyBpbiB0aGlzIGlhZywgc28gcmVsZWFzZSBpdC4gKi8KKwlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKworICAgICAgdHJ5YWc6CisJLyoKKwkgKiB0cnkgdG8gYWxsb2NhdGUgYW55d2hlcmUgd2l0aGluIHRoZSBzYW1lIEFHIGFzIHRoZSBwYXJlbnQgaW5vZGUuCisJICovCisJcmMgPSBkaUFsbG9jQUcoaW1hcCwgYWdubywgZGlyLCBpcCk7CisKKwlBR19VTkxPQ0soaW1hcCwgYWdubyk7CisKKwlpZiAocmMgIT0gLUVOT1NQQykKKwkJcmV0dXJuIChyYyk7CisKKwkvKgorCSAqIHRyeSB0byBhbGxvY2F0ZSBpbiBhbnkgQUcuCisJICovCisJcmV0dXJuIChkaUFsbG9jQW55KGltYXAsIGFnbm8sIGRpciwgaXApKTsKK30KKworCisvKgorICogTkFNRTogICAgICAgIGRpQWxsb2NBRyhpbWFwLGFnbm8sZGlyLGlwKQorICoKKyAqIEZVTkNUSU9OOiAgICBhbGxvY2F0ZSBhIGRpc2sgaW5vZGUgZnJvbSB0aGUgYWxsb2NhdGlvbiBncm91cC4KKyAqCisgKgkJdGhpcyByb3V0aW5lIGZpcnN0IGRldGVybWluZXMgaWYgYSBuZXcgZXh0ZW50IG9mIGZyZWUKKyAqCQlpbm9kZXMgc2hvdWxkIGJlIGFkZGVkIGZvciB0aGUgYWxsb2NhdGlvbiBncm91cCwgd2l0aAorICoJCXRoZSBjdXJyZW50IHJlcXVlc3Qgc2F0aXNmaWVkIGZyb20gdGhpcyBleHRlbnQuIGlmIHRoaXMKKyAqCQlpcyB0aGUgY2FzZSwgYW4gYXR0ZW1wdCB3aWxsIGJlIG1hZGUgdG8gZG8ganVzdCB0aGF0LiAgaWYKKyAqCQl0aGlzIGF0dGVtcHQgZmFpbHMgb3IgaXQgaGFzIGJlZW4gZGV0ZXJtaW5lZCB0aGF0IGEgbmV3IAorICoJCWV4dGVudCBzaG91bGQgbm90IGJlIGFkZGVkLCBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gc2F0aXNmeQorICoJCXRoZSByZXF1ZXN0IGJ5IGFsbG9jYXRpbmcgYW4gZXhpc3RpbmcgKGJhY2tlZCkgZnJlZSBpbm9kZQorICoJCWZyb20gdGhlIGFsbG9jYXRpb24gZ3JvdXAuCisgKgorICogUFJFIENPTkRJVElPTjogQWxyZWFkeSBoYXZlIHRoZSBBRyBsb2NrIGZvciB0aGlzIEFHLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGltYXAgIAktIHBvaW50ZXIgdG8gaW5vZGUgbWFwIGNvbnRyb2wgc3RydWN0dXJlLgorICogICAgICBhZ25vICAJLSBhbGxvY2F0aW9uIGdyb3VwIHRvIGFsbG9jYXRlIGZyb20uCisgKiAgICAgIGRpciAgCS0gVFJVRSBpZiB0aGUgbmV3IGRpc2sgaW5vZGUgaXMgZm9yIGEgZGlyZWN0b3J5LgorICogICAgICBpcCAgCS0gcG9pbnRlciB0byB0aGUgbmV3IGlub2RlIHRvIGJlIGZpbGxlZCBpbiBvbiBzdWNjZXNzZnVsIHJldHVybgorICoJCSAgd2l0aCB0aGUgZGlzayBpbm9kZSBudW1iZXIgYWxsb2NhdGVkLCBpdHMgZXh0ZW50IGFkZHJlc3MKKyAqCQkgIGFuZCB0aGUgc3RhcnQgb2YgdGhlIGFnLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzLgorICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzLgorICogICAgICAtRUlPICAJLSBpL28gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQKK2RpQWxsb2NBRyhzdHJ1Y3QgaW5vbWFwICogaW1hcCwgaW50IGFnbm8sIGJvb2xlYW5fdCBkaXIsIHN0cnVjdCBpbm9kZSAqaXApCit7CisJaW50IHJjLCBhZGRleHQsIG51bWZyZWUsIG51bWlub3M7CisKKwkvKiBnZXQgdGhlIG51bWJlciBvZiBmcmVlIGFuZCB0aGUgbnVtYmVyIG9mIGJhY2tlZCBkaXNrIAorCSAqIGlub2RlcyBjdXJyZW50bHkgd2l0aGluIHRoZSBhZy4KKwkgKi8KKwludW1mcmVlID0gaW1hcC0+aW1fYWdjdGxbYWdub10ubnVtZnJlZTsKKwludW1pbm9zID0gaW1hcC0+aW1fYWdjdGxbYWdub10ubnVtaW5vczsKKworCWlmIChudW1mcmVlID4gbnVtaW5vcykgeworCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJkaUFsbG9jQUc6IG51bWZyZWUgPiBudW1pbm9zIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGRldGVybWluZSBpZiB3ZSBzaG91bGQgYWxsb2NhdGUgYSBuZXcgZXh0ZW50IG9mIGZyZWUgaW5vZGVzCisJICogd2l0aGluIHRoZSBhZzogZm9yIGRpcmVjdG9yeSBpbm9kZXMsIGFkZCBhIG5ldyBleHRlbnQKKwkgKiBpZiB0aGVyZSBhcmUgYSBzbWFsbCBudW1iZXIgb2YgZnJlZSBpbm9kZXMgb3IgbnVtYmVyIG9mIGZyZWUKKwkgKiBpbm9kZXMgaXMgYSBzbWFsbCBwZXJjZW50YWdlIG9mIHRoZSBudW1iZXIgb2YgYmFja2VkIGlub2Rlcy4KKwkgKi8KKwlpZiAoZGlyID09IFRSVUUpCisJCWFkZGV4dCA9IChudW1mcmVlIDwgNjQgfHwKKwkJCSAgKG51bWZyZWUgPCAyNTYKKwkJCSAgICYmICgobnVtZnJlZSAqIDEwMCkgLyBudW1pbm9zKSA8PSAyMCkpOworCWVsc2UKKwkJYWRkZXh0ID0gKG51bWZyZWUgPT0gMCk7CisKKwkvKgorCSAqIHRyeSB0byBhbGxvY2F0ZSBhIG5ldyBleHRlbnQgb2YgZnJlZSBpbm9kZXMuCisJICovCisJaWYgKGFkZGV4dCkgeworCQkvKiBpZiBmcmVlIHNwYWNlIGlzIG5vdCBhdmFsaWFibGUgZm9yIHRoaXMgbmV3IGV4dGVudCwgdHJ5CisJCSAqIGJlbG93IHRvIGFsbG9jYXRlIGEgZnJlZSBhbmQgZXhpc3RpbmcgKGFscmVhZHkgYmFja2VkKQorCQkgKiBpbm9kZSBmcm9tIHRoZSBhZy4KKwkJICovCisJCWlmICgocmMgPSBkaUFsbG9jRXh0KGltYXAsIGFnbm8sIGlwKSkgIT0gLUVOT1NQQykKKwkJCXJldHVybiAocmMpOworCX0KKworCS8qCisJICogdHJ5IHRvIGFsbG9jYXRlIGFuIGV4aXN0aW5nIGZyZWUgaW5vZGUgZnJvbSB0aGUgYWcuCisJICovCisJcmV0dXJuIChkaUFsbG9jSW5vKGltYXAsIGFnbm8sIGlwKSk7Cit9CisKKworLyoKKyAqIE5BTUU6ICAgICAgICBkaUFsbG9jQW55KGltYXAsYWdubyxkaXIsaWFwKQorICoKKyAqIEZVTkNUSU9OOiAgICBhbGxvY2F0ZSBhIGRpc2sgaW5vZGUgZnJvbSBhbnkgb3RoZXIgYWxsb2NhdGlvbiBncm91cC4KKyAqCisgKgkJdGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIGFuIGFsbG9jYXRpb24gYXR0ZW1wdCB3aXRoaW4KKyAqCQl0aGUgcHJpbWFyeSBhbGxvY2F0aW9uIGdyb3VwIGhhcyBmYWlsZWQuIGlmIGF0dGVtcHRzIHRvCisgKgkJYWxsb2NhdGUgYW4gaW5vZGUgZnJvbSBhbnkgYWxsb2NhdGlvbiBncm91cCBvdGhlciB0aGFuIHRoZQorICoJCXNwZWNpZmllZCBwcmltYXJ5IGdyb3VwLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGltYXAgIAktIHBvaW50ZXIgdG8gaW5vZGUgbWFwIGNvbnRyb2wgc3RydWN0dXJlLgorICogICAgICBhZ25vICAJLSBwcmltYXJ5IGFsbG9jYXRpb24gZ3JvdXAgKHRvIGF2b2lkKS4KKyAqICAgICAgZGlyICAJLSBUUlVFIGlmIHRoZSBuZXcgZGlzayBpbm9kZSBpcyBmb3IgYSBkaXJlY3RvcnkuCisgKiAgICAgIGlwICAJLSBwb2ludGVyIHRvIGEgbmV3IGlub2RlIHRvIGJlIGZpbGxlZCBpbiBvbiBzdWNjZXNzZnVsIHJldHVybgorICoJCSAgd2l0aCB0aGUgZGlzayBpbm9kZSBudW1iZXIgYWxsb2NhdGVkLCBpdHMgZXh0ZW50IGFkZHJlc3MKKyAqCQkgIGFuZCB0aGUgc3RhcnQgb2YgdGhlIGFnLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzLgorICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzLgorICogICAgICAtRUlPICAJLSBpL28gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQKK2RpQWxsb2NBbnkoc3RydWN0IGlub21hcCAqIGltYXAsIGludCBhZ25vLCBib29sZWFuX3QgZGlyLCBzdHJ1Y3QgaW5vZGUgKmlwKQoreworCWludCBhZywgcmM7CisJaW50IG1heGFnID0gSkZTX1NCSShpbWFwLT5pbV9pcGltYXAtPmlfc2IpLT5ibWFwLT5kYl9tYXhhZzsKKworCisJLyogdHJ5IHRvIGFsbG9jYXRlIGZyb20gdGhlIGFncyBmb2xsb3dpbmcgYWdubyB1cCB0byAKKwkgKiB0aGUgbWF4aW11bSBhZyBudW1iZXIuCisJICovCisJZm9yIChhZyA9IGFnbm8gKyAxOyBhZyA8PSBtYXhhZzsgYWcrKykgeworCQlBR19MT0NLKGltYXAsIGFnKTsKKworCQlyYyA9IGRpQWxsb2NBRyhpbWFwLCBhZywgZGlyLCBpcCk7CisKKwkJQUdfVU5MT0NLKGltYXAsIGFnKTsKKworCQlpZiAocmMgIT0gLUVOT1NQQykKKwkJCXJldHVybiAocmMpOworCX0KKworCS8qIHRyeSB0byBhbGxvY2F0ZSBmcm9tIHRoZSBhZ3MgaW4gZnJvbnQgb2YgYWduby4KKwkgKi8KKwlmb3IgKGFnID0gMDsgYWcgPCBhZ25vOyBhZysrKSB7CisJCUFHX0xPQ0soaW1hcCwgYWcpOworCisJCXJjID0gZGlBbGxvY0FHKGltYXAsIGFnLCBkaXIsIGlwKTsKKworCQlBR19VTkxPQ0soaW1hcCwgYWcpOworCisJCWlmIChyYyAhPSAtRU5PU1BDKQorCQkJcmV0dXJuIChyYyk7CisJfQorCisJLyogbm8gZnJlZSBkaXNrIGlub2Rlcy4KKwkgKi8KKwlyZXR1cm4gLUVOT1NQQzsKK30KKworCisvKgorICogTkFNRTogICAgICAgIGRpQWxsb2NJbm8oaW1hcCxhZ25vLGlwKQorICoKKyAqIEZVTkNUSU9OOiAgICBhbGxvY2F0ZSBhIGRpc2sgaW5vZGUgZnJvbSB0aGUgYWxsb2NhdGlvbiBncm91cCdzIGZyZWUKKyAqCQlpbm9kZSBsaXN0LCByZXR1cm5pbmcgYW4gZXJyb3IgaWYgdGhpcyBmcmVlIGxpc3QgaXMKKyAqCQllbXB0eSAoaS5lLiBubyBpYWdzIG9uIHRoZSBsaXN0KS4KKyAqCisgKgkJYWxsb2NhdGlvbiBvY2N1cnMgZnJvbSB0aGUgZmlyc3QgaWFnIG9uIHRoZSBsaXN0IHVzaW5nCisgKgkJdGhlIGlhZydzIGZyZWUgaW5vZGUgc3VtbWFyeSBtYXAgdG8gZmluZCB0aGUgbGVmdG1vc3QKKyAqCQlmcmVlIGlub2RlIGluIHRoZSBpYWcuIAorICoJCQorICogUFJFIENPTkRJVElPTjogQWxyZWFkeSBoYXZlIEFHIGxvY2sgZm9yIHRoaXMgQUcuCisgKgkJCisgKiBQQVJBTUVURVJTOgorICogICAgICBpbWFwICAJLSBwb2ludGVyIHRvIGlub2RlIG1hcCBjb250cm9sIHN0cnVjdHVyZS4KKyAqICAgICAgYWdubyAgCS0gYWxsb2NhdGlvbiBncm91cC4KKyAqICAgICAgaXAgIAktIHBvaW50ZXIgdG8gbmV3IGlub2RlIHRvIGJlIGZpbGxlZCBpbiBvbiBzdWNjZXNzZnVsIHJldHVybgorICoJCSAgd2l0aCB0aGUgZGlzayBpbm9kZSBudW1iZXIgYWxsb2NhdGVkLCBpdHMgZXh0ZW50IGFkZHJlc3MKKyAqCQkgIGFuZCB0aGUgc3RhcnQgb2YgdGhlIGFnLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzLgorICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzLgorICogICAgICAtRUlPICAJLSBpL28gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgZGlBbGxvY0lubyhzdHJ1Y3QgaW5vbWFwICogaW1hcCwgaW50IGFnbm8sIHN0cnVjdCBpbm9kZSAqaXApCit7CisJaW50IGlhZ25vLCBpbm8sIHJjLCByZW0sIGV4dG5vLCBzd29yZDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXN0cnVjdCBpYWcgKmlhZ3A7CisKKwkvKiBjaGVjayBpZiB0aGVyZSBhcmUgaWFncyBvbiB0aGUgYWcncyBmcmVlIGlub2RlIGxpc3QuCisJICovCisJaWYgKChpYWdubyA9IGltYXAtPmltX2FnY3RsW2Fnbm9dLmlub2ZyZWUpIDwgMCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwkvKiBvYnRhaW4gcmVhZCBsb2NrIG9uIGltYXAgaW5vZGUgKi8KKwlJUkVBRF9MT0NLKGltYXAtPmltX2lwaW1hcCk7CisKKwkvKiByZWFkIHRoZSBpYWcgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisJICovCisJaWYgKChyYyA9IGRpSUFHUmVhZChpbWFwLCBpYWdubywgJm1wKSkpIHsKKwkJSVJFQURfVU5MT0NLKGltYXAtPmltX2lwaW1hcCk7CisJCXJldHVybiAocmMpOworCX0KKwlpYWdwID0gKHN0cnVjdCBpYWcgKikgbXAtPmRhdGE7CisKKwkvKiBiZXR0ZXIgYmUgZnJlZSBpbm9kZXMgaW4gdGhpcyBpYWcgaWYgaXQgaXMgb24gdGhlCisJICogbGlzdC4KKwkgKi8KKwlpZiAoIWlhZ3AtPm5mcmVlaW5vcykgeworCQlJUkVBRF9VTkxPQ0soaW1hcC0+aW1faXBpbWFwKTsKKwkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCWpmc19lcnJvcihpcC0+aV9zYiwKKwkJCSAgImRpQWxsb2NJbm86IG5mcmVlaW5vcyA9IDAsIGJ1dCBpYWcgb24gZnJlZWxpc3QiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogc2NhbiB0aGUgZnJlZSBpbm9kZSBzdW1tYXJ5IG1hcCB0byBmaW5kIGFuIGV4dGVudAorCSAqIHdpdGggZnJlZSBpbm9kZXMuCisJICovCisJZm9yIChzd29yZCA9IDA7OyBzd29yZCsrKSB7CisJCWlmIChzd29yZCA+PSBTTUFQU1opIHsKKwkJCUlSRUFEX1VOTE9DSyhpbWFwLT5pbV9pcGltYXApOworCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQlqZnNfZXJyb3IoaXAtPmlfc2IsCisJCQkJICAiZGlBbGxvY0lubzogZnJlZSBpbm9kZSBub3QgZm91bmQgaW4gc3VtbWFyeSBtYXAiKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJaWYgKH5pYWdwLT5pbm9zbWFwW3N3b3JkXSkKKwkJCWJyZWFrOworCX0KKworCS8qIGZvdW5kIGEgZXh0ZW50IHdpdGggZnJlZSBpbm9kZXMuIGRldGVybWluZQorCSAqIHRoZSBleHRlbnQgbnVtYmVyLgorCSAqLworCXJlbSA9IGRpRmluZEZyZWUobGUzMl90b19jcHUoaWFncC0+aW5vc21hcFtzd29yZF0pLCAwKTsKKwlpZiAocmVtID49IEVYVFNQRVJTVU0pIHsKKwkJSVJFQURfVU5MT0NLKGltYXAtPmltX2lwaW1hcCk7CisJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJkaUFsbG9jSW5vOiBubyBmcmVlIGV4dGVudCBmb3VuZCIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJZXh0bm8gPSAoc3dvcmQgPDwgTDJFWFRTUEVSU1VNKSArIHJlbTsKKworCS8qIGZpbmQgdGhlIGZpcnN0IGZyZWUgaW5vZGUgaW4gdGhlIGV4dGVudC4KKwkgKi8KKwlyZW0gPSBkaUZpbmRGcmVlKGxlMzJfdG9fY3B1KGlhZ3AtPndtYXBbZXh0bm9dKSwgMCk7CisJaWYgKHJlbSA+PSBJTk9TUEVSRVhUKSB7CisJCUlSRUFEX1VOTE9DSyhpbWFwLT5pbV9pcGltYXApOworCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJamZzX2Vycm9yKGlwLT5pX3NiLCAiZGlBbGxvY0lubzogZnJlZSBpbm9kZSBub3QgZm91bmQiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogY29tcHV0ZSB0aGUgaW5vZGUgbnVtYmVyIHdpdGhpbiB0aGUgaWFnLiAKKwkgKi8KKwlpbm8gPSAoZXh0bm8gPDwgTDJJTk9TUEVSRVhUKSArIHJlbTsKKworCS8qIGFsbG9jYXRlIHRoZSBpbm9kZS4KKwkgKi8KKwlyYyA9IGRpQWxsb2NCaXQoaW1hcCwgaWFncCwgaW5vKTsKKwlJUkVBRF9VTkxPQ0soaW1hcC0+aW1faXBpbWFwKTsKKwlpZiAocmMpIHsKKwkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCXJldHVybiAocmMpOworCX0KKworCS8qIHNldCB0aGUgcmVzdWx0cyBvZiB0aGUgYWxsb2NhdGlvbiBhbmQgd3JpdGUgdGhlIGlhZy4KKwkgKi8KKwlkaUluaXRJbm9kZShpcCwgaWFnbm8sIGlubywgZXh0bm8sIGlhZ3ApOworCXdyaXRlX21ldGFwYWdlKG1wKTsKKworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqIE5BTUU6ICAgICAgICBkaUFsbG9jRXh0KGltYXAsYWdubyxpcCkKKyAqCisgKiBGVU5DVElPTjogICAJYWRkIGEgbmV3IGV4dGVudCBvZiBmcmVlIGlub2RlcyB0byBhbiBpYWcsIGFsbG9jYXRpbmcKKyAqCSAgICAgICAJYW4gaW5vZGUgZnJvbSB0aGlzIGV4dGVudCB0byBzYXRpc2Z5IHRoZSBjdXJyZW50IGFsbG9jYXRpb24KKyAqCSAgICAgICAJcmVxdWVzdC4KKyAqCQkKKyAqCQl0aGlzIHJvdXRpbmUgZmlyc3QgdHJpZXMgdG8gZmluZCBhbiBleGlzdGluZyBpYWcgd2l0aCBmcmVlCisgKgkJZXh0ZW50cyB0aHJvdWdoIHRoZSBhZyBmcmVlIGV4dGVudCBsaXN0LiAgaWYgbGlzdCBpcyBub3QKKyAqCQllbXB0eSwgdGhlIGhlYWQgb2YgdGhlIGxpc3Qgd2lsbCBiZSBzZWxlY3RlZCBhcyB0aGUgaG9tZQorICoJCW9mIHRoZSBuZXcgZXh0ZW50IG9mIGZyZWUgaW5vZGVzLiAgb3RoZXJ3aXNlICh0aGUgbGlzdCBpcworICoJCWVtcHR5KSwgYSBuZXcgaWFnIHdpbGwgYmUgYWxsb2NhdGVkIGZvciB0aGUgYWcgdG8gY29udGFpbgorICoJCXRoZSBleHRlbnQuCisgKgkJCisgKgkJb25jZSBhbiBpYWcgaGFzIGJlZW4gc2VsZWN0ZWQsIHRoZSBmcmVlIGV4dGVudCBzdW1tYXJ5IG1hcAorICoJCWlzIHVzZWQgdG8gbG9jYXRlIGEgZnJlZSBleHRlbnQgd2l0aGluIHRoZSBpYWcgYW5kIGRpTmV3RXh0KCkKKyAqCQlpcyBjYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZXh0ZW50LCB3aXRoIGluaXRpYWxpemF0aW9uCisgKgkJaW5jbHVkaW5nIHRoZSBhbGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBpbm9kZSBvZiB0aGUgZXh0ZW50CisgKgkJZm9yIHRoZSBwdXJwb3NlIG9mIHNhdGlzZnlpbmcgdGhpcyByZXF1ZXN0LgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGltYXAgIAktIHBvaW50ZXIgdG8gaW5vZGUgbWFwIGNvbnRyb2wgc3RydWN0dXJlLgorICogICAgICBhZ25vICAJLSBhbGxvY2F0aW9uIGdyb3VwIG51bWJlci4KKyAqICAgICAgaXAgIAktIHBvaW50ZXIgdG8gbmV3IGlub2RlIHRvIGJlIGZpbGxlZCBpbiBvbiBzdWNjZXNzZnVsIHJldHVybgorICoJCSAgd2l0aCB0aGUgZGlzayBpbm9kZSBudW1iZXIgYWxsb2NhdGVkLCBpdHMgZXh0ZW50IGFkZHJlc3MKKyAqCQkgIGFuZCB0aGUgc3RhcnQgb2YgdGhlIGFnLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzLgorICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzLgorICogICAgICAtRUlPICAJLSBpL28gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgZGlBbGxvY0V4dChzdHJ1Y3QgaW5vbWFwICogaW1hcCwgaW50IGFnbm8sIHN0cnVjdCBpbm9kZSAqaXApCit7CisJaW50IHJlbSwgaWFnbm8sIHN3b3JkLCBleHRubywgcmM7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwlzdHJ1Y3QgaWFnICppYWdwOworCisJLyogY2hlY2sgaWYgdGhlIGFnIGhhcyBhbnkgaWFncyB3aXRoIGZyZWUgZXh0ZW50cy4gIGlmIG5vdCwKKwkgKiBhbGxvY2F0ZSBhIG5ldyBpYWcgZm9yIHRoZSBhZy4KKwkgKi8KKwlpZiAoKGlhZ25vID0gaW1hcC0+aW1fYWdjdGxbYWdub10uZXh0ZnJlZSkgPCAwKSB7CisJCS8qIElmIHN1Y2Nlc3NmdWwsIGRpTmV3SUFHIHdpbGwgb2J0YWluIHRoZSByZWFkIGxvY2sgb24gdGhlCisJCSAqIGltYXAgaW5vZGUuCisJCSAqLworCQlpZiAoKHJjID0gZGlOZXdJQUcoaW1hcCwgJmlhZ25vLCBhZ25vLCAmbXApKSkgeworCQkJcmV0dXJuIChyYyk7CisJCX0KKwkJaWFncCA9IChzdHJ1Y3QgaWFnICopIG1wLT5kYXRhOworCisJCS8qIHNldCB0aGUgYWcgbnVtYmVyIGlmIHRoaXMgYSBicmFuZCBuZXcgaWFnCisJCSAqLworCQlpYWdwLT5hZ3N0YXJ0ID0KKwkJICAgIGNwdV90b19sZTY0KEFHVE9CTEsoYWdubywgaW1hcC0+aW1faXBpbWFwKSk7CisJfSBlbHNlIHsKKwkJLyogcmVhZCB0aGUgaWFnLgorCQkgKi8KKwkJSVJFQURfTE9DSyhpbWFwLT5pbV9pcGltYXApOworCQlpZiAoKHJjID0gZGlJQUdSZWFkKGltYXAsIGlhZ25vLCAmbXApKSkgeworCQkJSVJFQURfVU5MT0NLKGltYXAtPmltX2lwaW1hcCk7CisJCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJkaUFsbG9jRXh0OiBlcnJvciByZWFkaW5nIGlhZyIpOworCQkJcmV0dXJuIHJjOworCQl9CisJCWlhZ3AgPSAoc3RydWN0IGlhZyAqKSBtcC0+ZGF0YTsKKwl9CisKKwkvKiB1c2luZyB0aGUgZnJlZSBleHRlbnQgc3VtbWFyeSBtYXAsIGZpbmQgYSBmcmVlIGV4dGVudC4KKwkgKi8KKwlmb3IgKHN3b3JkID0gMDs7IHN3b3JkKyspIHsKKwkJaWYgKHN3b3JkID49IFNNQVBTWikgeworCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQlJUkVBRF9VTkxPQ0soaW1hcC0+aW1faXBpbWFwKTsKKwkJCWpmc19lcnJvcihpcC0+aV9zYiwKKwkJCQkgICJkaUFsbG9jRXh0OiBmcmVlIGV4dCBzdW1tYXJ5IG1hcCBub3QgZm91bmQiKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWlmICh+aWFncC0+ZXh0c21hcFtzd29yZF0pCisJCQlicmVhazsKKwl9CisKKwkvKiBkZXRlcm1pbmUgdGhlIGV4dGVudCBudW1iZXIgb2YgdGhlIGZyZWUgZXh0ZW50LgorCSAqLworCXJlbSA9IGRpRmluZEZyZWUobGUzMl90b19jcHUoaWFncC0+ZXh0c21hcFtzd29yZF0pLCAwKTsKKwlpZiAocmVtID49IEVYVFNQRVJTVU0pIHsKKwkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCUlSRUFEX1VOTE9DSyhpbWFwLT5pbV9pcGltYXApOworCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJkaUFsbG9jRXh0OiBmcmVlIGV4dGVudCBub3QgZm91bmQiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWV4dG5vID0gKHN3b3JkIDw8IEwyRVhUU1BFUlNVTSkgKyByZW07CisKKwkvKiBpbml0aWFsaXplIHRoZSBuZXcgZXh0ZW50LgorCSAqLworCXJjID0gZGlOZXdFeHQoaW1hcCwgaWFncCwgZXh0bm8pOworCUlSRUFEX1VOTE9DSyhpbWFwLT5pbV9pcGltYXApOworCWlmIChyYykgeworCQkvKiBzb21ldGhpbmcgYmFkIGhhcHBlbmVkLiAgaWYgYSBuZXcgaWFnIHdhcyBhbGxvY2F0ZWQsCisJCSAqIHBsYWNlIGl0IGJhY2sgb24gdGhlIGlub2RlIG1hcCdzIGlhZyBmcmVlIGxpc3QsIGFuZAorCQkgKiBjbGVhciB0aGUgYWcgbnVtYmVyIGluZm9ybWF0aW9uLgorCQkgKi8KKwkJaWYgKGlhZ3AtPm5mcmVlZXh0cyA9PSBjcHVfdG9fbGUzMihFWFRTUEVSSUFHKSkgeworCQkJSUFHRlJFRV9MT0NLKGltYXApOworCQkJaWFncC0+aWFnZnJlZSA9IGNwdV90b19sZTMyKGltYXAtPmltX2ZyZWVpYWcpOworCQkJaW1hcC0+aW1fZnJlZWlhZyA9IGlhZ25vOworCQkJSUFHRlJFRV9VTkxPQ0soaW1hcCk7CisJCX0KKwkJd3JpdGVfbWV0YXBhZ2UobXApOworCQlyZXR1cm4gKHJjKTsKKwl9CisKKwkvKiBzZXQgdGhlIHJlc3VsdHMgb2YgdGhlIGFsbG9jYXRpb24gYW5kIHdyaXRlIHRoZSBpYWcuCisJICovCisJZGlJbml0SW5vZGUoaXAsIGlhZ25vLCBleHRubyA8PCBMMklOT1NQRVJFWFQsIGV4dG5vLCBpYWdwKTsKKworCXdyaXRlX21ldGFwYWdlKG1wKTsKKworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqIE5BTUU6ICAgICAgICBkaUFsbG9jQml0KGltYXAsaWFncCxpbm8pCisgKgorICogRlVOQ1RJT046ICAgCWFsbG9jYXRlIGEgYmFja2VkIGlub2RlIGZyb20gYW4gaWFnLgorICoKKyAqCQl0aGlzIHJvdXRpbmUgcGVyZm9ybXMgdGhlIG1lY2hhbmljcyBvZiBhbGxvY2F0aW5nIGEKKyAqCQlzcGVjaWZpZWQgaW5vZGUgZnJvbSBhIGJhY2tlZCBleHRlbnQuCisgKgorICoJCWlmIHRoZSBpbm9kZSB0byBiZSBhbGxvY2F0ZWQgcmVwcmVzZW50cyB0aGUgbGFzdCBmcmVlCisgKgkJaW5vZGUgd2l0aGluIHRoZSBpYWcsIHRoZSBpYWcgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlCisgKgkJYWcgZnJlZSBpbm9kZSBsaXN0LgorICoKKyAqCQlhIGNhcmVmdWwgdXBkYXRlIGFwcHJvYWNoIGlzIHVzZWQgdG8gcHJvdmlkZSBjb25zaXN0ZW5jeQorICoJCWluIHRoZSBmYWNlIG9mIHVwZGF0ZXMgdG8gbXVsdGlwbGUgYnVmZmVycy4gIHVuZGVyIHRoaXMKKyAqCQlhcHByb2FjaCwgYWxsIHJlcXVpcmVkIGJ1ZmZlcnMgYXJlIG9idGFpbmVkIGJlZm9yZSBtYWtpbmcKKyAqCQlhbnkgdXBkYXRlcyBhbmQgYXJlIGhlbGQgYWxsIGFyZSB1cGRhdGVzIGFyZSBjb21wbGV0ZS4KKyAqCQkKKyAqIFBSRSBDT05ESVRJT046IEFscmVhZHkgaGF2ZSBidWZmZXIgbG9jayBvbiBpYWdwLiAgQWxyZWFkeSBoYXZlIEFHIGxvY2sgb24KKyAqCXRoaXMgQUcuICBNdXN0IGhhdmUgcmVhZCBsb2NrIG9uIGltYXAgaW5vZGUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgaW1hcCAgCS0gcG9pbnRlciB0byBpbm9kZSBtYXAgY29udHJvbCBzdHJ1Y3R1cmUuCisgKiAgICAgIGlhZ3AgIAktIHBvaW50ZXIgdG8gaWFnLiAKKyAqICAgICAgaW5vICAgCS0gaW5vZGUgbnVtYmVyIHRvIGJlIGFsbG9jYXRlZCB3aXRoaW4gdGhlIGlhZy4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwICAgICAgIC0gc3VjY2Vzcy4KKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBkaXNrIHJlc291cmNlcy4KKyAqICAgICAgLUVJTyAgCS0gaS9vIGVycm9yLgorICovCitzdGF0aWMgaW50IGRpQWxsb2NCaXQoc3RydWN0IGlub21hcCAqIGltYXAsIHN0cnVjdCBpYWcgKiBpYWdwLCBpbnQgaW5vKQoreworCWludCBleHRubywgYml0bm8sIGFnbm8sIHN3b3JkLCByYzsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKmFtcCA9IE5VTEwsICpibXAgPSBOVUxMOworCXN0cnVjdCBpYWcgKmFpYWdwID0gTlVMTCwgKmJpYWdwID0gTlVMTDsKKwl1MzIgbWFzazsKKworCS8qIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGxhc3QgZnJlZSBpbm9kZSB3aXRoaW4gdGhlIGlhZy4KKwkgKiBpZiBzbywgaXQgd2lsbCBoYXZlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgYWcgZnJlZQorCSAqIGlub2RlIGxpc3QsIHNvIGdldCB0aGUgaWFncyBwcmVjZWVkaW5nIGFuZCBmb2xsb3dpbmcKKwkgKiBpdCBvbiB0aGUgbGlzdC4KKwkgKi8KKwlpZiAoaWFncC0+bmZyZWVpbm9zID09IGNwdV90b19sZTMyKDEpKSB7CisJCWlmICgoaW50KSBsZTMyX3RvX2NwdShpYWdwLT5pbm9mcmVlZndkKSA+PSAwKSB7CisJCQlpZiAoKHJjID0KKwkJCSAgICAgZGlJQUdSZWFkKGltYXAsIGxlMzJfdG9fY3B1KGlhZ3AtPmlub2ZyZWVmd2QpLAorCQkJCSAgICAgICAmYW1wKSkpCisJCQkJcmV0dXJuIChyYyk7CisJCQlhaWFncCA9IChzdHJ1Y3QgaWFnICopIGFtcC0+ZGF0YTsKKwkJfQorCisJCWlmICgoaW50KSBsZTMyX3RvX2NwdShpYWdwLT5pbm9mcmVlYmFjaykgPj0gMCkgeworCQkJaWYgKChyYyA9CisJCQkgICAgIGRpSUFHUmVhZChpbWFwLAorCQkJCSAgICAgICBsZTMyX3RvX2NwdShpYWdwLT5pbm9mcmVlYmFjayksCisJCQkJICAgICAgICZibXApKSkgeworCQkJCWlmIChhbXApCisJCQkJCXJlbGVhc2VfbWV0YXBhZ2UoYW1wKTsKKwkJCQlyZXR1cm4gKHJjKTsKKwkJCX0KKwkJCWJpYWdwID0gKHN0cnVjdCBpYWcgKikgYm1wLT5kYXRhOworCQl9CisJfQorCisJLyogZ2V0IHRoZSBhZyBudW1iZXIsIGV4dGVudCBudW1iZXIsIGlub2RlIG51bWJlciB3aXRoaW4KKwkgKiB0aGUgZXh0ZW50LgorCSAqLworCWFnbm8gPSBCTEtUT0FHKGxlNjRfdG9fY3B1KGlhZ3AtPmFnc3RhcnQpLCBKRlNfU0JJKGltYXAtPmltX2lwaW1hcC0+aV9zYikpOworCWV4dG5vID0gaW5vID4+IEwySU5PU1BFUkVYVDsKKwliaXRubyA9IGlubyAmIChJTk9TUEVSRVhUIC0gMSk7CisKKwkvKiBjb21wdXRlIHRoZSBtYXNrIGZvciBzZXR0aW5nIHRoZSBtYXAuCisJICovCisJbWFzayA9IEhJR0hPUkRFUiA+PiBiaXRubzsKKworCS8qIHRoZSBpbm9kZSBzaG91bGQgYmUgZnJlZSBhbmQgYmFja2VkLgorCSAqLworCWlmICgoKGxlMzJfdG9fY3B1KGlhZ3AtPnBtYXBbZXh0bm9dKSAmIG1hc2spICE9IDApIHx8CisJICAgICgobGUzMl90b19jcHUoaWFncC0+d21hcFtleHRub10pICYgbWFzaykgIT0gMCkgfHwKKwkgICAgKGFkZHJlc3NQWEQoJmlhZ3AtPmlub2V4dFtleHRub10pID09IDApKSB7CisJCWlmIChhbXApCisJCQlyZWxlYXNlX21ldGFwYWdlKGFtcCk7CisJCWlmIChibXApCisJCQlyZWxlYXNlX21ldGFwYWdlKGJtcCk7CisKKwkJamZzX2Vycm9yKGltYXAtPmltX2lwaW1hcC0+aV9zYiwKKwkJCSAgImRpQWxsb2NCaXQ6IGlhZyBpbmNvbnNpc3RlbnQiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogbWFyayB0aGUgaW5vZGUgYXMgYWxsb2NhdGVkIGluIHRoZSB3b3JraW5nIG1hcC4KKwkgKi8KKwlpYWdwLT53bWFwW2V4dG5vXSB8PSBjcHVfdG9fbGUzMihtYXNrKTsKKworCS8qIGNoZWNrIGlmIGFsbCBpbm9kZXMgd2l0aGluIHRoZSBleHRlbnQgYXJlIG5vdworCSAqIGFsbG9jYXRlZC4gIGlmIHNvLCB1cGRhdGUgdGhlIGZyZWUgaW5vZGUgc3VtbWFyeQorCSAqIG1hcCB0byByZWZsZWN0IHRoaXMuCisJICovCisJaWYgKGlhZ3AtPndtYXBbZXh0bm9dID09IGNwdV90b19sZTMyKE9ORVMpKSB7CisJCXN3b3JkID0gZXh0bm8gPj4gTDJFWFRTUEVSU1VNOworCQliaXRubyA9IGV4dG5vICYgKEVYVFNQRVJTVU0gLSAxKTsKKwkJaWFncC0+aW5vc21hcFtzd29yZF0gfD0gY3B1X3RvX2xlMzIoSElHSE9SREVSID4+IGJpdG5vKTsKKwl9CisKKwkvKiBpZiB0aGlzIHdhcyB0aGUgbGFzdCBmcmVlIGlub2RlIGluIHRoZSBpYWcsIHJlbW92ZSB0aGUKKwkgKiBpYWcgZnJvbSB0aGUgYWcgZnJlZSBpbm9kZSBsaXN0LgorCSAqLworCWlmIChpYWdwLT5uZnJlZWlub3MgPT0gY3B1X3RvX2xlMzIoMSkpIHsKKwkJaWYgKGFtcCkgeworCQkJYWlhZ3AtPmlub2ZyZWViYWNrID0gaWFncC0+aW5vZnJlZWJhY2s7CisJCQl3cml0ZV9tZXRhcGFnZShhbXApOworCQl9CisKKwkJaWYgKGJtcCkgeworCQkJYmlhZ3AtPmlub2ZyZWVmd2QgPSBpYWdwLT5pbm9mcmVlZndkOworCQkJd3JpdGVfbWV0YXBhZ2UoYm1wKTsKKwkJfSBlbHNlIHsKKwkJCWltYXAtPmltX2FnY3RsW2Fnbm9dLmlub2ZyZWUgPQorCQkJICAgIGxlMzJfdG9fY3B1KGlhZ3AtPmlub2ZyZWVmd2QpOworCQl9CisJCWlhZ3AtPmlub2ZyZWVmd2QgPSBpYWdwLT5pbm9mcmVlYmFjayA9IGNwdV90b19sZTMyKC0xKTsKKwl9CisKKwkvKiB1cGRhdGUgdGhlIGZyZWUgaW5vZGUgY291bnQgYXQgdGhlIGlhZywgYWcsIGlub2RlCisJICogbWFwIGxldmVscy4KKwkgKi8KKwlpYWdwLT5uZnJlZWlub3MgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdShpYWdwLT5uZnJlZWlub3MpIC0gMSk7CisJaW1hcC0+aW1fYWdjdGxbYWdub10ubnVtZnJlZSAtPSAxOworCWF0b21pY19kZWMoJmltYXAtPmltX251bWZyZWUpOworCisJcmV0dXJuICgwKTsKK30KKworCisvKgorICogTkFNRTogICAgICAgIGRpTmV3RXh0KGltYXAsaWFncCxleHRubykKKyAqCisgKiBGVU5DVElPTjogICAgaW5pdGlhbGl6ZSBhIG5ldyBleHRlbnQgb2YgaW5vZGVzIGZvciBhbiBpYWcsIGFsbG9jYXRpbmcKKyAqCSAgICAgICAgdGhlIGZpcnN0IGlub2RlIG9mIHRoZSBleHRlbnQgZm9yIHVzZSBmb3IgdGhlIGN1cnJlbnQKKyAqCSAgICAgICAgYWxsb2NhdGlvbiByZXF1ZXN0LgorICoKKyAqCQlkaXNrIHJlc291cmNlcyBhcmUgYWxsb2NhdGVkIGZvciB0aGUgbmV3IGV4dGVudCBvZiBpbm9kZXMKKyAqCQlhbmQgdGhlIGlub2RlcyB0aGVtc2VsdmVzIGFyZSBpbml0aWFsaXplZCB0byByZWZsZWN0IHRoZWlyCisgKgkJZXhpc3RlbmNlIHdpdGhpbiB0aGUgZXh0ZW50IChpLmUuIHRoZWlyIGlub2RlIG51bWJlcnMgYW5kCisgKgkJaW5vZGUgZXh0ZW50IGFkZHJlc3NlcyBhcmUgc2V0KSBhbmQgdGhlaXIgaW5pdGlhbCBzdGF0ZQorICoJCShtb2RlIGFuZCBsaW5rIGNvdW50IGFyZSBzZXQgdG8gemVybykuCisgKgorICoJCWlmIHRoZSBpYWcgaXMgbmV3LCBpdCBpcyBub3QgeWV0IG9uIGFuIGFnIGV4dGVudCBmcmVlIGxpc3QKKyAqCQlidXQgd2lsbCBub3cgYmUgcGxhY2VkIG9uIHRoaXMgbGlzdC4KKyAqCisgKgkJaWYgdGhlIGFsbG9jYXRpb24gb2YgdGhlIG5ldyBleHRlbnQgY2F1c2VzIHRoZSBpYWcgdG8KKyAqCQloYXZlIG5vIGZyZWUgZXh0ZW50LCB0aGUgaWFnIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZQorICoJCWFnIGV4dGVudCBmcmVlIGxpc3QuCisgKgorICoJCWlmIHRoZSBpYWcgaGFzIG5vIGZyZWUgYmFja2VkIGlub2RlcywgaXQgd2lsbCBiZSBwbGFjZWQKKyAqCQlvbiB0aGUgYWcgZnJlZSBpbm9kZSBsaXN0LCBzaW5jZSB0aGUgYWRkaXRpb24gb2YgdGhlIG5ldworICoJCWV4dGVudCB3aWxsIG5vdyBjYXVzZSBpdCB0byBoYXZlIGZyZWUgaW5vZGVzLgorICoKKyAqCQlhIGNhcmVmdWwgdXBkYXRlIGFwcHJvYWNoIGlzIHVzZWQgdG8gcHJvdmlkZSBjb25zaXN0ZW5jeQorICoJCShpLmUuIGxpc3QgY29uc2lzdGVuY3kpIGluIHRoZSBmYWNlIG9mIHVwZGF0ZXMgdG8gbXVsdGlwbGUKKyAqCQlidWZmZXJzLiAgdW5kZXIgdGhpcyBhcHByb2FjaCwgYWxsIHJlcXVpcmVkIGJ1ZmZlcnMgYXJlCisgKgkJb2J0YWluZWQgYmVmb3JlIG1ha2luZyBhbnkgdXBkYXRlcyBhbmQgYXJlIGhlbGQgdW50aWwgYWxsCisgKgkJdXBkYXRlcyBhcmUgY29tcGxldGUuCisgKgkJCisgKiBQUkUgQ09ORElUSU9OOiBBbHJlYWR5IGhhdmUgYnVmZmVyIGxvY2sgb24gaWFncC4gIEFscmVhZHkgaGF2ZSBBRyBsb2NrIG9uCisgKgl0aGlzIEFHLiAgTXVzdCBoYXZlIHJlYWQgbG9jayBvbiBpbWFwIGlub2RlLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGltYXAgIAktIHBvaW50ZXIgdG8gaW5vZGUgbWFwIGNvbnRyb2wgc3RydWN0dXJlLgorICogICAgICBpYWdwICAJLSBwb2ludGVyIHRvIGlhZy4gCisgKiAgICAgIGV4dG5vICAJLSBleHRlbnQgbnVtYmVyLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzLgorICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzLgorICogICAgICAtRUlPICAJLSBpL28gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgZGlOZXdFeHQoc3RydWN0IGlub21hcCAqIGltYXAsIHN0cnVjdCBpYWcgKiBpYWdwLCBpbnQgZXh0bm8pCit7CisJaW50IGFnbm8sIGlhZ25vLCBmd2QsIGJhY2ssIGZyZWVpID0gMCwgc3dvcmQsIHJjOworCXN0cnVjdCBpYWcgKmFpYWdwID0gTlVMTCwgKmJpYWdwID0gTlVMTCwgKmNpYWdwID0gTlVMTDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKmFtcCwgKmJtcCwgKmNtcCwgKmRtcDsKKwlzdHJ1Y3QgaW5vZGUgKmlwaW1hcDsKKwlzNjQgYmxrbm8sIGhpbnQ7CisJaW50IGksIGo7CisJdTMyIG1hc2s7CisJaW5vX3QgaW5vOworCXN0cnVjdCBkaW5vZGUgKmRwOworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpOworCisJLyogYmV0dGVyIGhhdmUgZnJlZSBleHRlbnRzLgorCSAqLworCWlmICghaWFncC0+bmZyZWVleHRzKSB7CisJCWpmc19lcnJvcihpbWFwLT5pbV9pcGltYXAtPmlfc2IsICJkaU5ld0V4dDogbm8gZnJlZSBleHRlbnRzIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGdldCB0aGUgaW5vZGUgbWFwIGlub2RlLgorCSAqLworCWlwaW1hcCA9IGltYXAtPmltX2lwaW1hcDsKKwlzYmkgPSBKRlNfU0JJKGlwaW1hcC0+aV9zYik7CisKKwlhbXAgPSBibXAgPSBjbXAgPSBOVUxMOworCisJLyogZ2V0IHRoZSBhZyBhbmQgaWFnIG51bWJlcnMgZm9yIHRoaXMgaWFnLgorCSAqLworCWFnbm8gPSBCTEtUT0FHKGxlNjRfdG9fY3B1KGlhZ3AtPmFnc3RhcnQpLCBzYmkpOworCWlhZ25vID0gbGUzMl90b19jcHUoaWFncC0+aWFnbnVtKTsKKworCS8qIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGxhc3QgZnJlZSBleHRlbnQgd2l0aGluIHRoZQorCSAqIGlhZy4gIGlmIHNvLCB0aGUgaWFnIG11c3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBhZworCSAqIGZyZWUgZXh0ZW50IGxpc3QsIHNvIGdldCB0aGUgaWFncyBwcmVjZWVkaW5nIGFuZAorCSAqIGZvbGxvd2luZyB0aGUgaWFnIG9uIHRoaXMgbGlzdC4KKwkgKi8KKwlpZiAoaWFncC0+bmZyZWVleHRzID09IGNwdV90b19sZTMyKDEpKSB7CisJCWlmICgoZndkID0gbGUzMl90b19jcHUoaWFncC0+ZXh0ZnJlZWZ3ZCkpID49IDApIHsKKwkJCWlmICgocmMgPSBkaUlBR1JlYWQoaW1hcCwgZndkLCAmYW1wKSkpCisJCQkJcmV0dXJuIChyYyk7CisJCQlhaWFncCA9IChzdHJ1Y3QgaWFnICopIGFtcC0+ZGF0YTsKKwkJfQorCisJCWlmICgoYmFjayA9IGxlMzJfdG9fY3B1KGlhZ3AtPmV4dGZyZWViYWNrKSkgPj0gMCkgeworCQkJaWYgKChyYyA9IGRpSUFHUmVhZChpbWFwLCBiYWNrLCAmYm1wKSkpCisJCQkJZ290byBlcnJvcl9vdXQ7CisJCQliaWFncCA9IChzdHJ1Y3QgaWFnICopIGJtcC0+ZGF0YTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHRoZSBpYWcgaGFzIGZyZWUgZXh0ZW50cy4gIGlmIGFsbCBleHRlbnRzIGFyZSBmcmVlCisJCSAqIChhcyBpcyB0aGUgY2FzZSBmb3IgYSBuZXdseSBhbGxvY2F0ZWQgaWFnKSwgdGhlIGlhZworCQkgKiBtdXN0IGJlIGFkZGVkIHRvIHRoZSBhZyBmcmVlIGV4dGVudCBsaXN0LCBzbyBnZXQKKwkJICogdGhlIGlhZyBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCBpbiBwcmVwYXJhdGlvbiBmb3IKKwkJICogYWRkaW5nIHRoaXMgaWFnIHRvIHRoaXMgbGlzdC4KKwkJICovCisJCWZ3ZCA9IGJhY2sgPSAtMTsKKwkJaWYgKGlhZ3AtPm5mcmVlZXh0cyA9PSBjcHVfdG9fbGUzMihFWFRTUEVSSUFHKSkgeworCQkJaWYgKChmd2QgPSBpbWFwLT5pbV9hZ2N0bFthZ25vXS5leHRmcmVlKSA+PSAwKSB7CisJCQkJaWYgKChyYyA9IGRpSUFHUmVhZChpbWFwLCBmd2QsICZhbXApKSkKKwkJCQkJZ290byBlcnJvcl9vdXQ7CisJCQkJYWlhZ3AgPSAoc3RydWN0IGlhZyAqKSBhbXAtPmRhdGE7CisJCQl9CisJCX0KKwl9CisKKwkvKiBjaGVjayBpZiB0aGUgaWFnIGhhcyBubyBmcmVlIGlub2Rlcy4gIGlmIHNvLCB0aGUgaWFnCisJICogd2lsbCBoYXZlIHRvIGJlIGFkZGVkIHRvIHRoZSBhZyBmcmVlIGlub2RlIGxpc3QsIHNvIGdldAorCSAqIHRoZSBpYWcgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QgaW4gcHJlcGFyYXRpb24gZm9yCisJICogYWRkaW5nIHRoaXMgaWFnIHRvIHRoaXMgbGlzdC4gIGluIGRvaW5nIHRoaXMsIHdlIG11c3QKKwkgKiBjaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIGlhZyBhdCB0aGUgaGVhZCBvZgorCSAqIHRoZSBsaXN0IGluIGhhbmQuCisJICovCisJaWYgKGlhZ3AtPm5mcmVlaW5vcyA9PSAwKSB7CisJCWZyZWVpID0gaW1hcC0+aW1fYWdjdGxbYWdub10uaW5vZnJlZTsKKworCQlpZiAoZnJlZWkgPj0gMCkgeworCQkJaWYgKGZyZWVpID09IGZ3ZCkgeworCQkJCWNpYWdwID0gYWlhZ3A7CisJCQl9IGVsc2UgaWYgKGZyZWVpID09IGJhY2spIHsKKwkJCQljaWFncCA9IGJpYWdwOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKHJjID0gZGlJQUdSZWFkKGltYXAsIGZyZWVpLCAmY21wKSkpCisJCQkJCWdvdG8gZXJyb3Jfb3V0OworCQkJCWNpYWdwID0gKHN0cnVjdCBpYWcgKikgY21wLT5kYXRhOworCQkJfQorCQkJaWYgKGNpYWdwID09IE5VTEwpIHsKKwkJCQlqZnNfZXJyb3IoaW1hcC0+aW1faXBpbWFwLT5pX3NiLAorCQkJCQkgICJkaU5ld0V4dDogY2lhZ3AgPT0gTlVMTCIpOworCQkJCXJjID0gLUVJTzsKKwkJCQlnb3RvIGVycm9yX291dDsKKwkJCX0KKwkJfQorCX0KKworCS8qIGFsbG9jYXRlIGRpc2sgc3BhY2UgZm9yIHRoZSBpbm9kZSBleHRlbnQuCisJICovCisJaWYgKChleHRubyA9PSAwKSB8fCAoYWRkcmVzc1BYRCgmaWFncC0+aW5vZXh0W2V4dG5vIC0gMV0pID09IDApKQorCQloaW50ID0gKChzNjQpIGFnbm8gPDwgc2JpLT5ibWFwLT5kYl9hZ2wyc2l6ZSkgLSAxOworCWVsc2UKKwkJaGludCA9IGFkZHJlc3NQWEQoJmlhZ3AtPmlub2V4dFtleHRubyAtIDFdKSArCisJCSAgICBsZW5ndGhQWEQoJmlhZ3AtPmlub2V4dFtleHRubyAtIDFdKSAtIDE7CisKKwlpZiAoKHJjID0gZGJBbGxvYyhpcGltYXAsIGhpbnQsIChzNjQpIGltYXAtPmltX25icGVyaWV4dCwgJmJsa25vKSkpCisJCWdvdG8gZXJyb3Jfb3V0OworCisJLyogY29tcHV0ZSB0aGUgaW5vZGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBpbm9kZSB3aXRoaW4gdGhlCisJICogZXh0ZW50LgorCSAqLworCWlubyA9IChpYWdubyA8PCBMMklOT1NQRVJJQUcpICsgKGV4dG5vIDw8IEwySU5PU1BFUkVYVCk7CisKKwkvKiBpbml0aWFsaXplIHRoZSBpbm9kZXMgd2l0aGluIHRoZSBuZXdseSBhbGxvY2F0ZWQgZXh0ZW50IGEKKwkgKiBwYWdlIGF0IGEgdGltZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW1hcC0+aW1fbmJwZXJpZXh0OyBpICs9IHNiaS0+bmJwZXJwYWdlKSB7CisJCS8qIGdldCBhIGJ1ZmZlciBmb3IgdGhpcyBwYWdlIG9mIGRpc2sgaW5vZGVzLgorCQkgKi8KKwkJZG1wID0gZ2V0X21ldGFwYWdlKGlwaW1hcCwgYmxrbm8gKyBpLCBQU0laRSwgMSk7CisJCWlmIChkbXAgPT0gTlVMTCkgeworCQkJcmMgPSAtRUlPOworCQkJZ290byBlcnJvcl9vdXQ7CisJCX0KKwkJZHAgPSAoc3RydWN0IGRpbm9kZSAqKSBkbXAtPmRhdGE7CisKKwkJLyogaW5pdGlhbGl6ZSB0aGUgaW5vZGUgbnVtYmVyLCBtb2RlLCBsaW5rIGNvdW50IGFuZAorCQkgKiBpbm9kZSBleHRlbnQgYWRkcmVzcy4KKwkJICovCisJCWZvciAoaiA9IDA7IGogPCBJTk9TUEVSUEFHRTsgaisrLCBkcCsrLCBpbm8rKykgeworCQkJZHAtPmRpX2lub3N0YW1wID0gY3B1X3RvX2xlMzIoc2JpLT5pbm9zdGFtcCk7CisJCQlkcC0+ZGlfbnVtYmVyID0gY3B1X3RvX2xlMzIoaW5vKTsKKwkJCWRwLT5kaV9maWxlc2V0ID0gY3B1X3RvX2xlMzIoRklMRVNZU1RFTV9JKTsKKwkJCWRwLT5kaV9tb2RlID0gMDsKKwkJCWRwLT5kaV9ubGluayA9IDA7CisJCQlQWERhZGRyZXNzKCYoZHAtPmRpX2l4cHhkKSwgYmxrbm8pOworCQkJUFhEbGVuZ3RoKCYoZHAtPmRpX2l4cHhkKSwgaW1hcC0+aW1fbmJwZXJpZXh0KTsKKwkJfQorCQl3cml0ZV9tZXRhcGFnZShkbXApOworCX0KKworCS8qIGlmIHRoaXMgaXMgdGhlIGxhc3QgZnJlZSBleHRlbnQgd2l0aGluIHRoZSBpYWcsIHJlbW92ZSB0aGUKKwkgKiBpYWcgZnJvbSB0aGUgYWcgZnJlZSBleHRlbnQgbGlzdC4KKwkgKi8KKwlpZiAoaWFncC0+bmZyZWVleHRzID09IGNwdV90b19sZTMyKDEpKSB7CisJCWlmIChmd2QgPj0gMCkKKwkJCWFpYWdwLT5leHRmcmVlYmFjayA9IGlhZ3AtPmV4dGZyZWViYWNrOworCisJCWlmIChiYWNrID49IDApCisJCQliaWFncC0+ZXh0ZnJlZWZ3ZCA9IGlhZ3AtPmV4dGZyZWVmd2Q7CisJCWVsc2UKKwkJCWltYXAtPmltX2FnY3RsW2Fnbm9dLmV4dGZyZWUgPQorCQkJICAgIGxlMzJfdG9fY3B1KGlhZ3AtPmV4dGZyZWVmd2QpOworCisJCWlhZ3AtPmV4dGZyZWVmd2QgPSBpYWdwLT5leHRmcmVlYmFjayA9IGNwdV90b19sZTMyKC0xKTsKKwl9IGVsc2UgeworCQkvKiBpZiB0aGUgaWFnIGhhcyBhbGwgZnJlZSBleHRlbnRzIChuZXdseSBhbGxvY2F0ZWQgaWFnKSwKKwkJICogYWRkIHRoZSBpYWcgdG8gdGhlIGFnIGZyZWUgZXh0ZW50IGxpc3QuCisJCSAqLworCQlpZiAoaWFncC0+bmZyZWVleHRzID09IGNwdV90b19sZTMyKEVYVFNQRVJJQUcpKSB7CisJCQlpZiAoZndkID49IDApCisJCQkJYWlhZ3AtPmV4dGZyZWViYWNrID0gY3B1X3RvX2xlMzIoaWFnbm8pOworCisJCQlpYWdwLT5leHRmcmVlZndkID0gY3B1X3RvX2xlMzIoZndkKTsKKwkJCWlhZ3AtPmV4dGZyZWViYWNrID0gY3B1X3RvX2xlMzIoLTEpOworCQkJaW1hcC0+aW1fYWdjdGxbYWdub10uZXh0ZnJlZSA9IGlhZ25vOworCQl9CisJfQorCisJLyogaWYgdGhlIGlhZyBoYXMgbm8gZnJlZSBpbm9kZXMsIGFkZCB0aGUgaWFnIHRvIHRoZQorCSAqIGFnIGZyZWUgaW5vZGUgbGlzdC4KKwkgKi8KKwlpZiAoaWFncC0+bmZyZWVpbm9zID09IDApIHsKKwkJaWYgKGZyZWVpID49IDApCisJCQljaWFncC0+aW5vZnJlZWJhY2sgPSBjcHVfdG9fbGUzMihpYWdubyk7CisKKwkJaWFncC0+aW5vZnJlZWZ3ZCA9CisJCSAgICBjcHVfdG9fbGUzMihpbWFwLT5pbV9hZ2N0bFthZ25vXS5pbm9mcmVlKTsKKwkJaWFncC0+aW5vZnJlZWJhY2sgPSBjcHVfdG9fbGUzMigtMSk7CisJCWltYXAtPmltX2FnY3RsW2Fnbm9dLmlub2ZyZWUgPSBpYWdubzsKKwl9CisKKwkvKiBpbml0aWFsaXplIHRoZSBleHRlbnQgZGVzY3JpcHRvciBvZiB0aGUgZXh0ZW50LiAqLworCVBYRGxlbmd0aCgmaWFncC0+aW5vZXh0W2V4dG5vXSwgaW1hcC0+aW1fbmJwZXJpZXh0KTsKKwlQWERhZGRyZXNzKCZpYWdwLT5pbm9leHRbZXh0bm9dLCBibGtubyk7CisKKwkvKiBpbml0aWFsaXplIHRoZSB3b3JraW5nIGFuZCBwZXJzaXN0ZW50IG1hcCBvZiB0aGUgZXh0ZW50LgorCSAqIHRoZSB3b3JraW5nIG1hcCB3aWxsIGJlIGluaXRpYWxpemVkIHN1Y2ggdGhhdAorCSAqIGl0IGluZGljYXRlcyB0aGUgZmlyc3QgaW5vZGUgb2YgdGhlIGV4dGVudCBpcyBhbGxvY2F0ZWQuCisJICovCisJaWFncC0+d21hcFtleHRub10gPSBjcHVfdG9fbGUzMihISUdIT1JERVIpOworCWlhZ3AtPnBtYXBbZXh0bm9dID0gMDsKKworCS8qIHVwZGF0ZSB0aGUgZnJlZSBpbm9kZSBhbmQgZnJlZSBleHRlbnQgc3VtbWFyeSBtYXBzCisJICogZm9yIHRoZSBleHRlbnQgdG8gaW5kaWNhdGUgdGhlIGV4dGVudCBoYXMgZnJlZSBpbm9kZXMKKwkgKiBhbmQgbm8gbG9uZ2VyIHJlcHJlc2VudHMgYSBmcmVlIGV4dGVudC4KKwkgKi8KKwlzd29yZCA9IGV4dG5vID4+IEwyRVhUU1BFUlNVTTsKKwltYXNrID0gSElHSE9SREVSID4+IChleHRubyAmIChFWFRTUEVSU1VNIC0gMSkpOworCWlhZ3AtPmV4dHNtYXBbc3dvcmRdIHw9IGNwdV90b19sZTMyKG1hc2spOworCWlhZ3AtPmlub3NtYXBbc3dvcmRdICY9IGNwdV90b19sZTMyKH5tYXNrKTsKKworCS8qIHVwZGF0ZSB0aGUgZnJlZSBpbm9kZSBhbmQgZnJlZSBleHRlbnQgY291bnRzIGZvciB0aGUKKwkgKiBpYWcuCisJICovCisJaWFncC0+bmZyZWVpbm9zID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoaWFncC0+bmZyZWVpbm9zKSArCisJCQkJICAgICAgKElOT1NQRVJFWFQgLSAxKSk7CisJaWFncC0+bmZyZWVleHRzID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoaWFncC0+bmZyZWVleHRzKSAtIDEpOworCisJLyogdXBkYXRlIHRoZSBmcmVlIGFuZCBiYWNrZWQgaW5vZGUgY291bnRzIGZvciB0aGUgYWcuCisJICovCisJaW1hcC0+aW1fYWdjdGxbYWdub10ubnVtZnJlZSArPSAoSU5PU1BFUkVYVCAtIDEpOworCWltYXAtPmltX2FnY3RsW2Fnbm9dLm51bWlub3MgKz0gSU5PU1BFUkVYVDsKKworCS8qIHVwZGF0ZSB0aGUgZnJlZSBhbmQgYmFja2VkIGlub2RlIGNvdW50cyBmb3IgdGhlIGlub2RlIG1hcC4KKwkgKi8KKwlhdG9taWNfYWRkKElOT1NQRVJFWFQgLSAxLCAmaW1hcC0+aW1fbnVtZnJlZSk7CisJYXRvbWljX2FkZChJTk9TUEVSRVhULCAmaW1hcC0+aW1fbnVtaW5vcyk7CisKKwkvKiB3cml0ZSB0aGUgaWFncy4KKwkgKi8KKwlpZiAoYW1wKQorCQl3cml0ZV9tZXRhcGFnZShhbXApOworCWlmIChibXApCisJCXdyaXRlX21ldGFwYWdlKGJtcCk7CisJaWYgKGNtcCkKKwkJd3JpdGVfbWV0YXBhZ2UoY21wKTsKKworCXJldHVybiAoMCk7CisKKyAgICAgIGVycm9yX291dDoKKworCS8qIHJlbGVhc2UgdGhlIGlhZ3MuCisJICovCisJaWYgKGFtcCkKKwkJcmVsZWFzZV9tZXRhcGFnZShhbXApOworCWlmIChibXApCisJCXJlbGVhc2VfbWV0YXBhZ2UoYm1wKTsKKwlpZiAoY21wKQorCQlyZWxlYXNlX21ldGFwYWdlKGNtcCk7CisKKwlyZXR1cm4gKHJjKTsKK30KKworCisvKgorICogTkFNRTogICAgICAgIGRpTmV3SUFHKGltYXAsaWFnbm9wLGFnbm8pCisgKgorICogRlVOQ1RJT046ICAgCWFsbG9jYXRlIGEgbmV3IGlhZyBmb3IgYW4gYWxsb2NhdGlvbiBncm91cC4KKyAqCQkKKyAqCQlmaXJzdCB0cmllcyB0byBhbGxvY2F0ZSB0aGUgaWFnIGZyb20gdGhlIGlub2RlIG1hcCAKKyAqCQlpYWdmcmVlIGxpc3Q6ICAKKyAqCQlpZiB0aGUgbGlzdCBoYXMgZnJlZSBpYWdzLCB0aGUgaGVhZCBvZiB0aGUgbGlzdCBpcyByZW1vdmVkIAorICoJCWFuZCByZXR1cm5lZCB0byBzYXRpc2Z5IHRoZSByZXF1ZXN0LgorICoJCWlmIHRoZSBpbm9kZSBtYXAncyBpYWcgZnJlZSBsaXN0IGlzIGVtcHR5LCB0aGUgaW5vZGUgbWFwCisgKgkJaXMgZXh0ZW5kZWQgdG8gaG9sZCBhIG5ldyBpYWcuIHRoaXMgbmV3IGlhZyBpcyBpbml0aWFsaXplZAorICoJCWFuZCByZXR1cm5lZCB0byBzYXRpc2Z5IHRoZSByZXF1ZXN0LgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGltYXAgIAktIHBvaW50ZXIgdG8gaW5vZGUgbWFwIGNvbnRyb2wgc3RydWN0dXJlLgorICogICAgICBpYWdub3AgCS0gcG9pbnRlciB0byBhbiBpYWcgbnVtYmVyIHNldCB3aXRoIHRoZSBudW1iZXIgb2YgdGhlCisgKgkJICBuZXdseSBhbGxvY2F0ZWQgaWFnIHVwb24gc3VjY2Vzc2Z1bCByZXR1cm4uCisgKiAgICAgIGFnbm8gIAktIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyLgorICoJYnBwCS0gQnVmZmVyIHBvaW50ZXIgdG8gYmUgZmlsbGVkIGluIHdpdGggbmV3IElBRydzIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzLgorICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzLgorICogICAgICAtRUlPICAJLSBpL28gZXJyb3IuCisgKgorICogc2VyaWFsaXphdGlvbjogCisgKglBRyBsb2NrIGhlbGQgb24gZW50cnkvZXhpdDsKKyAqCXdyaXRlIGxvY2sgb24gdGhlIG1hcCBpcyBoZWxkIGluc2lkZTsKKyAqCXJlYWQgbG9jayBvbiB0aGUgbWFwIGlzIGhlbGQgb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uOworICoKKyAqIG5vdGU6IG5ldyBpYWcgdHJhbnNhY3Rpb246IAorICogLiBzeW5jaHJvbm91c2x5IHdyaXRlIGlhZzsKKyAqIC4gd3JpdGUgbG9nIG9mIHh0cmVlIGFuZCBpbm9kZSAgb2YgaW1hcDsKKyAqIC4gY29tbWl0OworICogLiBzeW5jaHJvbm91cyB3cml0ZSBvZiB4dHJlZSAocmlnaHQgdG8gbGVmdCwgYm90dG9tIHRvIHRvcCk7CisgKiAuIGF0IHN0YXJ0IG9mIGxvZ3JlZG8oKTogaW5pdCBpbi1tZW1vcnkgaW1hcCB3aXRoIG9uZSBhZGRpdGlvbmFsIGlhZyBwYWdlOworICogLiBhdCBlbmQgb2YgbG9ncmVkbygpOiByZS1yZWFkIGltYXAgaW5vZGUgdG8gZGV0ZXJtaW5lCisgKiAgIG5ldyBpbWFwIHNpemU7CisgKi8KK3N0YXRpYyBpbnQKK2RpTmV3SUFHKHN0cnVjdCBpbm9tYXAgKiBpbWFwLCBpbnQgKmlhZ25vcCwgaW50IGFnbm8sIHN0cnVjdCBtZXRhcGFnZSAqKiBtcHApCit7CisJaW50IHJjOworCWludCBpYWdubywgaSwgeGxlbjsKKwlzdHJ1Y3QgaW5vZGUgKmlwaW1hcDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJc3RydWN0IGlhZyAqaWFncDsKKwlzNjQgeGFkZHIgPSAwOworCXM2NCBibGtubzsKKwl0aWRfdCB0aWQ7CisjaWZkZWYgX1NUSUxMX1RPX1BPUlQKKwl4YWRfdCB4YWQ7CisjZW5kaWYJCQkJLyogIF9TVElMTF9UT19QT1JUICovCisJc3RydWN0IGlub2RlICppcGxpc3RbMV07CisKKwkvKiBwaWNrIHVwIHBvaW50ZXJzIHRvIHRoZSBpbm9kZSBtYXAgYW5kIG1vdW50IGlub2RlcyAqLworCWlwaW1hcCA9IGltYXAtPmltX2lwaW1hcDsKKwlzYiA9IGlwaW1hcC0+aV9zYjsKKwlzYmkgPSBKRlNfU0JJKHNiKTsKKworCS8qIGFjcXVpcmUgdGhlIGZyZWUgaWFnIGxvY2sgKi8KKwlJQUdGUkVFX0xPQ0soaW1hcCk7CisKKwkvKiBpZiB0aGVyZSBhcmUgYW55IGlhZ3Mgb24gdGhlIGlub2RlIG1hcCBmcmVlIGlhZyBsaXN0LCAKKwkgKiBhbGxvY2F0ZSB0aGUgaWFnIGZyb20gdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisJICovCisJaWYgKGltYXAtPmltX2ZyZWVpYWcgPj0gMCkgeworCQkvKiBwaWNrIHVwIHRoZSBpYWcgbnVtYmVyIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0ICovCisJCWlhZ25vID0gaW1hcC0+aW1fZnJlZWlhZzsKKworCQkvKiBkZXRlcm1pbmUgdGhlIGxvZ2ljYWwgYmxvY2sgbnVtYmVyIG9mIHRoZSBpYWcgKi8KKwkJYmxrbm8gPSBJQUdUT0xCTEsoaWFnbm8sIHNiaS0+bDJuYnBlcnBhZ2UpOworCX0gZWxzZSB7CisJCS8qIG5vIGZyZWUgaWFncy4gdGhlIGlub2RlIG1hcCB3aWxsIGhhdmUgdG8gYmUgZXh0ZW50ZWQKKwkJICogdG8gaW5jbHVkZSBhIG5ldyBpYWcuCisJCSAqLworCisJCS8qIGFjcXVpcmUgaW5vZGUgbWFwIGxvY2sgKi8KKwkJSVdSSVRFX0xPQ0soaXBpbWFwKTsKKworCQlpZiAoaXBpbWFwLT5pX3NpemUgPj4gTDJQU0laRSAhPSBpbWFwLT5pbV9uZXh0aWFnICsgMSkgeworCQkJSVdSSVRFX1VOTE9DSyhpcGltYXApOworCQkJSUFHRlJFRV9VTkxPQ0soaW1hcCk7CisJCQlqZnNfZXJyb3IoaW1hcC0+aW1faXBpbWFwLT5pX3NiLAorCQkJCSAgImRpTmV3SUFHOiBpcGltYXAtPmlfc2l6ZSBpcyB3cm9uZyIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCisJCS8qIGdldCB0aGUgbmV4dCBhdmFsaWFibGUgaWFnIG51bWJlciAqLworCQlpYWdubyA9IGltYXAtPmltX25leHRpYWc7CisKKwkJLyogbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBub3QgZXhjZWVkZWQgdGhlIG1heGltdW0gaW5vZGUKKwkJICogbnVtYmVyIGxpbWl0LgorCQkgKi8KKwkJaWYgKGlhZ25vID4gKE1BWElBR1MgLSAxKSkgeworCQkJLyogcmVsZWFzZSB0aGUgaW5vZGUgbWFwIGxvY2sgKi8KKwkJCUlXUklURV9VTkxPQ0soaXBpbWFwKTsKKworCQkJcmMgPSAtRU5PU1BDOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKgorCQkgKiBzeW5jaHJvbm91c2x5IGFwcGVuZCBuZXcgaWFnIHBhZ2UuCisJCSAqLworCQkvKiBkZXRlcm1pbmUgdGhlIGxvZ2ljYWwgYWRkcmVzcyBvZiBpYWcgcGFnZSB0byBhcHBlbmQgKi8KKwkJYmxrbm8gPSBJQUdUT0xCTEsoaWFnbm8sIHNiaS0+bDJuYnBlcnBhZ2UpOworCisJCS8qIEFsbG9jYXRlIGV4dGVudCBmb3IgbmV3IGlhZyBwYWdlICovCisJCXhsZW4gPSBzYmktPm5icGVycGFnZTsKKwkJaWYgKChyYyA9IGRiQWxsb2MoaXBpbWFwLCAwLCAoczY0KSB4bGVuLCAmeGFkZHIpKSkgeworCQkJLyogcmVsZWFzZSB0aGUgaW5vZGUgbWFwIGxvY2sgKi8KKwkJCUlXUklURV9VTkxPQ0soaXBpbWFwKTsKKworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBhc3NpZ24gYSBidWZmZXIgZm9yIHRoZSBwYWdlICovCisJCW1wID0gZ2V0X21ldGFwYWdlKGlwaW1hcCwgeGFkZHIsIFBTSVpFLCAxKTsKKwkJaWYgKCFtcCkgeworCQkJLyogRnJlZSB0aGUgYmxvY2tzIGFsbG9jYXRlZCBmb3IgdGhlIGlhZyBzaW5jZSBpdCB3YXMKKwkJCSAqIG5vdCBzdWNjZXNzZnVsbHkgYWRkZWQgdG8gdGhlIGlub2RlIG1hcAorCQkJICovCisJCQlkYkZyZWUoaXBpbWFwLCB4YWRkciwgKHM2NCkgeGxlbik7CisKKwkJCS8qIHJlbGVhc2UgdGhlIGlub2RlIG1hcCBsb2NrICovCisJCQlJV1JJVEVfVU5MT0NLKGlwaW1hcCk7CisKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlhZ3AgPSAoc3RydWN0IGlhZyAqKSBtcC0+ZGF0YTsKKworCQkvKiBpbml0IHRoZSBpYWcgKi8KKwkJbWVtc2V0KGlhZ3AsIDAsIHNpemVvZihzdHJ1Y3QgaWFnKSk7CisJCWlhZ3AtPmlhZ251bSA9IGNwdV90b19sZTMyKGlhZ25vKTsKKwkJaWFncC0+aW5vZnJlZWZ3ZCA9IGlhZ3AtPmlub2ZyZWViYWNrID0gY3B1X3RvX2xlMzIoLTEpOworCQlpYWdwLT5leHRmcmVlZndkID0gaWFncC0+ZXh0ZnJlZWJhY2sgPSBjcHVfdG9fbGUzMigtMSk7CisJCWlhZ3AtPmlhZ2ZyZWUgPSBjcHVfdG9fbGUzMigtMSk7CisJCWlhZ3AtPm5mcmVlaW5vcyA9IDA7CisJCWlhZ3AtPm5mcmVlZXh0cyA9IGNwdV90b19sZTMyKEVYVFNQRVJJQUcpOworCisJCS8qIGluaXRpYWxpemUgdGhlIGZyZWUgaW5vZGUgc3VtbWFyeSBtYXAgKGZyZWUgZXh0ZW50CisJCSAqIHN1bW1hcnkgbWFwIGluaXRpYWxpemF0aW9uIGhhbmRsZWQgYnkgYnplcm8pLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IFNNQVBTWjsgaSsrKQorCQkJaWFncC0+aW5vc21hcFtpXSA9IGNwdV90b19sZTMyKE9ORVMpOworCisJCS8qCisJCSAqIEludmFsaWRhdGUgdGhlIHBhZ2UgYWZ0ZXIgd3JpdGluZyBhbmQgc3luY2luZyBpdC4KKwkJICogQWZ0ZXIgaXQncyBpbml0aWFsaXplZCwgd2UgYWNjZXNzIGl0IGluIGEgZGlmZmVyZW50CisJCSAqIGFkZHJlc3Mgc3BhY2UKKwkJICovCisJCXNldF9iaXQoTUVUQV9kaXNjYXJkLCAmbXAtPmZsYWcpOworCQlmbHVzaF9tZXRhcGFnZShtcCk7CisKKwkJLyoKKwkJICogc3RhcnQgdHlyYW5zYWN0aW9uIG9mIHVwZGF0ZSBvZiB0aGUgaW5vZGUgbWFwCisJCSAqIGFkZHJlc3Npbmcgc3RydWN0dXJlIHBvaW50aW5nIHRvIHRoZSBuZXcgaWFnIHBhZ2U7CisJCSAqLworCQl0aWQgPSB0eEJlZ2luKHNiLCBDT01NSVRfRk9SQ0UpOworCQlkb3duKCZKRlNfSVAoaXBpbWFwKS0+Y29tbWl0X3NlbSk7CisKKwkJLyogdXBkYXRlIHRoZSBpbm9kZSBtYXAgYWRkcmVzc2luZyBzdHJ1Y3R1cmUgdG8gcG9pbnQgdG8gaXQgKi8KKwkJaWYgKChyYyA9CisJCSAgICAgeHRJbnNlcnQodGlkLCBpcGltYXAsIDAsIGJsa25vLCB4bGVuLCAmeGFkZHIsIDApKSkgeworCQkJdHhFbmQodGlkKTsKKwkJCXVwKCZKRlNfSVAoaXBpbWFwKS0+Y29tbWl0X3NlbSk7CisJCQkvKiBGcmVlIHRoZSBibG9ja3MgYWxsb2NhdGVkIGZvciB0aGUgaWFnIHNpbmNlIGl0IHdhcworCQkJICogbm90IHN1Y2Nlc3NmdWxseSBhZGRlZCB0byB0aGUgaW5vZGUgbWFwCisJCQkgKi8KKwkJCWRiRnJlZShpcGltYXAsIHhhZGRyLCAoczY0KSB4bGVuKTsKKworCQkJLyogcmVsZWFzZSB0aGUgaW5vZGUgbWFwIGxvY2sgKi8KKwkJCUlXUklURV9VTkxPQ0soaXBpbWFwKTsKKworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiB1cGRhdGUgdGhlIGlub2RlIG1hcCdzIGlub2RlIHRvIHJlZmxlY3QgdGhlIGV4dGVuc2lvbiAqLworCQlpcGltYXAtPmlfc2l6ZSArPSBQU0laRTsKKwkJaW5vZGVfYWRkX2J5dGVzKGlwaW1hcCwgUFNJWkUpOworCisJCS8qCisJCSAqIHR4Q29tbWl0KENPTU1JVF9GT1JDRSkgd2lsbCBzeW5jaHJvbm91c2x5IHdyaXRlIGFkZHJlc3MgCisJCSAqIGluZGV4IHBhZ2VzIGFuZCBpbm9kZSBhZnRlciBjb21taXQgaW4gY2FyZWZ1bCB1cGRhdGUgb3JkZXIgCisJCSAqIG9mIGFkZHJlc3MgaW5kZXggcGFnZXMgKHJpZ2h0IHRvIGxlZnQsIGJvdHRvbSB1cCk7CisJCSAqLworCQlpcGxpc3RbMF0gPSBpcGltYXA7CisJCXJjID0gdHhDb21taXQodGlkLCAxLCAmaXBsaXN0WzBdLCBDT01NSVRfRk9SQ0UpOworCisJCXR4RW5kKHRpZCk7CisJCXVwKCZKRlNfSVAoaXBpbWFwKS0+Y29tbWl0X3NlbSk7CisKKwkJZHVwbGljYXRlSVh0cmVlKHNiLCBibGtubywgeGxlbiwgJnhhZGRyKTsKKworCQkvKiB1cGRhdGUgdGhlIG5leHQgYXZhbGlhYmxlIGlhZyBudW1iZXIgKi8KKwkJaW1hcC0+aW1fbmV4dGlhZyArPSAxOworCisJCS8qIEFkZCB0aGUgaWFnIHRvIHRoZSBpYWcgZnJlZSBsaXN0IHNvIHdlIGRvbid0IGxvc2UgdGhlIGlhZworCQkgKiBpZiBhIGZhaWx1cmUgaGFwcGVucyBub3cuCisJCSAqLworCQlpbWFwLT5pbV9mcmVlaWFnID0gaWFnbm87CisKKwkJLyogVW50aWwgd2UgaGF2ZSBsb2dyZWRvIHdvcmtpbmcsIHdlIHdhbnQgdGhlIGltYXAgaW5vZGUgJgorCQkgKiBjb250cm9sIHBhZ2UgdG8gYmUgdXAgdG8gZGF0ZS4KKwkJICovCisJCWRpU3luYyhpcGltYXApOworCisJCS8qIHJlbGVhc2UgdGhlIGlub2RlIG1hcCBsb2NrICovCisJCUlXUklURV9VTkxPQ0soaXBpbWFwKTsKKwl9CisKKwkvKiBvYnRhaW4gcmVhZCBsb2NrIG9uIG1hcCAqLworCUlSRUFEX0xPQ0soaXBpbWFwKTsKKworCS8qIHJlYWQgdGhlIGlhZyAqLworCWlmICgocmMgPSBkaUlBR1JlYWQoaW1hcCwgaWFnbm8sICZtcCkpKSB7CisJCUlSRUFEX1VOTE9DSyhpcGltYXApOworCQlyYyA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKwlpYWdwID0gKHN0cnVjdCBpYWcgKikgbXAtPmRhdGE7CisKKwkvKiByZW1vdmUgdGhlIGlhZyBmcm9tIHRoZSBpYWcgZnJlZSBsaXN0ICovCisJaW1hcC0+aW1fZnJlZWlhZyA9IGxlMzJfdG9fY3B1KGlhZ3AtPmlhZ2ZyZWUpOworCWlhZ3AtPmlhZ2ZyZWUgPSBjcHVfdG9fbGUzMigtMSk7CisKKwkvKiBzZXQgdGhlIHJldHVybiBpYWcgbnVtYmVyIGFuZCBidWZmZXIgcG9pbnRlciAqLworCSppYWdub3AgPSBpYWdubzsKKwkqbXBwID0gbXA7CisKKyAgICAgIG91dDoKKwkvKiByZWxlYXNlIHRoZSBpYWcgZnJlZSBsb2NrICovCisJSUFHRlJFRV9VTkxPQ0soaW1hcCk7CisKKwlyZXR1cm4gKHJjKTsKK30KKworLyoKKyAqIE5BTUU6ICAgICAgICBkaUlBR1JlYWQoKQorICoKKyAqIEZVTkNUSU9OOiAgICBnZXQgdGhlIGJ1ZmZlciBmb3IgdGhlIHNwZWNpZmllZCBpYWcgd2l0aGluIGEgZmlsZXNldAorICoJCW9yIGFnZ3JlZ2F0ZSBpbm9kZSBtYXAuCisgKgkJCisgKiBQQVJBTUVURVJTOgorICogICAgICBpbWFwICAJLSBwb2ludGVyIHRvIGlub2RlIG1hcCBjb250cm9sIHN0cnVjdHVyZS4KKyAqICAgICAgaWFnbm8gIAktIGlhZyBudW1iZXIuCisgKiAgICAgIGJwcCAgCS0gcG9pbnQgdG8gYnVmZmVyIHBvaW50ZXIgdG8gYmUgZmlsbGVkIGluIG9uIHN1Y2Nlc3NmdWwKKyAqCQkgIGV4aXQuCisgKgorICogU0VSSUFMSVpBVElPTjoKKyAqCW11c3QgaGF2ZSByZWFkIGxvY2sgb24gaW1hcCBpbm9kZQorICoJKFdoZW4gY2FsbGVkIGJ5IGRpRXh0ZW5kRlMsIHRoZSBmaWxlc3lzdGVtIGlzIHF1aWVzY2VkLCB0aGVyZWZvcmUKKyAqCSB0aGUgcmVhZCBsb2NrIGlzIHVubmVjZXNzYXJ5LikKKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwICAgICAgIC0gc3VjY2Vzcy4KKyAqICAgICAgLUVJTyAgCS0gaS9vIGVycm9yLgorICovCitzdGF0aWMgaW50IGRpSUFHUmVhZChzdHJ1Y3QgaW5vbWFwICogaW1hcCwgaW50IGlhZ25vLCBzdHJ1Y3QgbWV0YXBhZ2UgKiogbXBwKQoreworCXN0cnVjdCBpbm9kZSAqaXBpbWFwID0gaW1hcC0+aW1faXBpbWFwOworCXM2NCBibGtubzsKKworCS8qIGNvbXB1dGUgdGhlIGxvZ2ljYWwgYmxvY2sgbnVtYmVyIG9mIHRoZSBpYWcuICovCisJYmxrbm8gPSBJQUdUT0xCTEsoaWFnbm8sIEpGU19TQkkoaXBpbWFwLT5pX3NiKS0+bDJuYnBlcnBhZ2UpOworCisJLyogcmVhZCB0aGUgaWFnLiAqLworCSptcHAgPSByZWFkX21ldGFwYWdlKGlwaW1hcCwgYmxrbm8sIFBTSVpFLCAwKTsKKwlpZiAoKm1wcCA9PSBOVUxMKSB7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBOQU1FOiAgICAgICAgZGlGaW5kRnJlZSgpCisgKgorICogRlVOQ1RJT046ICAgIGZpbmQgdGhlIGZpcnN0IGZyZWUgYml0IGluIGEgd29yZCBzdGFydGluZyBhdAorICoJCXRoZSBzcGVjaWZpZWQgYml0IHBvc2l0aW9uLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIHdvcmQgIAktIHdvcmQgdG8gYmUgZXhhbWluZWQuCisgKiAgICAgIHN0YXJ0ICAJLSBzdGFydGluZyBiaXQgcG9zaXRpb24uCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgYml0IHBvc2l0aW9uIG9mIGZpcnN0IGZyZWUgYml0IGluIHRoZSB3b3JkIG9yIDMyIGlmCisgKglubyBmcmVlIGJpdHMgd2VyZSBmb3VuZC4KKyAqLworc3RhdGljIGludCBkaUZpbmRGcmVlKHUzMiB3b3JkLCBpbnQgc3RhcnQpCit7CisJaW50IGJpdG5vOworCWFzc2VydChzdGFydCA8IDMyKTsKKwkvKiBzY2FuIHRoZSB3b3JkIGZvciB0aGUgZmlyc3QgZnJlZSBiaXQuICovCisJZm9yICh3b3JkIDw8PSBzdGFydCwgYml0bm8gPSBzdGFydDsgYml0bm8gPCAzMjsKKwkgICAgIGJpdG5vKyssIHdvcmQgPDw9IDEpIHsKKwkJaWYgKCh3b3JkICYgSElHSE9SREVSKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAoYml0bm8pOworfQorCisvKgorICogTkFNRToJZGlVcGRhdGVQTWFwKCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEZVTkNUSU9OOiBVcGRhdGUgdGhlIHBlcnNpc3RlbnQgbWFwIGluIGFuIElBRyBmb3IgdGhlIGFsbG9jYXRpb24gb3IgCisgKglmcmVlaW5nIG9mIHRoZSBzcGVjaWZpZWQgaW5vZGUuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBQUkUgQ09ORElUSU9OUzogV29ya2luZyBtYXAgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkIGZvciBhbGxvY2F0ZS4KKyAqCisgKiBQQVJBTUVURVJTOgorICoJaXBpbWFwCS0gSW5jb3JlIGlub2RlIG1hcCBpbm9kZQorICoJaW51bQktIE51bWJlciBvZiBpbm9kZSB0byBtYXJrIGluIHBlcm1hbmVudCBtYXAKKyAqCWlzX2ZyZWUJLSBJZiBUUlVFIGluZGljYXRlcyBpbm9kZSBzaG91bGQgYmUgbWFya2VkIGZyZWVkLCBvdGhlcndpc2UKKyAqCQkgIGluZGljYXRlcyBpbm9kZSBzaG91bGQgYmUgbWFya2VkIGFsbG9jYXRlZC4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOiAKKyAqCQkwIGZvciBzdWNjZXNzCisgKi8KK2ludAorZGlVcGRhdGVQTWFwKHN0cnVjdCBpbm9kZSAqaXBpbWFwLAorCSAgICAgdW5zaWduZWQgbG9uZyBpbnVtLCBib29sZWFuX3QgaXNfZnJlZSwgc3RydWN0IHRibG9jayAqIHRibGspCit7CisJaW50IHJjOworCXN0cnVjdCBpYWcgKmlhZ3A7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwlpbnQgaWFnbm8sIGlubywgZXh0bm8sIGJpdG5vOworCXN0cnVjdCBpbm9tYXAgKmltYXA7CisJdTMyIG1hc2s7CisJc3RydWN0IGpmc19sb2cgKmxvZzsKKwlpbnQgbHNuLCBkaWZmdCwgZGlmZnA7CisKKwlpbWFwID0gSkZTX0lQKGlwaW1hcCktPmlfaW1hcDsKKwkvKiBnZXQgdGhlIGlhZyBudW1iZXIgY29udGFpbmluZyB0aGUgaW5vZGUgKi8KKwlpYWdubyA9IElOT1RPSUFHKGludW0pOworCS8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBpYWcgaXMgY29udGFpbmVkIHdpdGhpbiB0aGUgbWFwICovCisJaWYgKGlhZ25vID49IGltYXAtPmltX25leHRpYWcpIHsKKwkJamZzX2Vycm9yKGlwaW1hcC0+aV9zYiwKKwkJCSAgImRpVXBkYXRlUE1hcDogdGhlIGlhZyBpcyBvdXRzaWRlIHRoZSBtYXAiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCS8qIHJlYWQgdGhlIGlhZyAqLworCUlSRUFEX0xPQ0soaXBpbWFwKTsKKwlyYyA9IGRpSUFHUmVhZChpbWFwLCBpYWdubywgJm1wKTsKKwlJUkVBRF9VTkxPQ0soaXBpbWFwKTsKKwlpZiAocmMpCisJCXJldHVybiAocmMpOworCWlhZ3AgPSAoc3RydWN0IGlhZyAqKSBtcC0+ZGF0YTsKKwkvKiBnZXQgdGhlIGlub2RlIG51bWJlciBhbmQgZXh0ZW50IG51bWJlciBvZiB0aGUgaW5vZGUgd2l0aGluCisJICogdGhlIGlhZyBhbmQgdGhlIGlub2RlIG51bWJlciB3aXRoaW4gdGhlIGV4dGVudC4KKwkgKi8KKwlpbm8gPSBpbnVtICYgKElOT1NQRVJJQUcgLSAxKTsKKwlleHRubyA9IGlubyA+PiBMMklOT1NQRVJFWFQ7CisJYml0bm8gPSBpbm8gJiAoSU5PU1BFUkVYVCAtIDEpOworCW1hc2sgPSBISUdIT1JERVIgPj4gYml0bm87CisJLyogCisJICogbWFyayB0aGUgaW5vZGUgZnJlZSBpbiBwZXJzaXN0ZW50IG1hcDoKKwkgKi8KKwlpZiAoaXNfZnJlZSA9PSBUUlVFKSB7CisJCS8qIFRoZSBpbm9kZSBzaG91bGQgaGF2ZSBiZWVuIGFsbG9jYXRlZCBib3RoIGluIHdvcmtpbmcKKwkJICogbWFwIGFuZCBpbiBwZXJzaXN0ZW50IG1hcDsKKwkJICogdGhlIGlub2RlIHdpbGwgYmUgZnJlZWQgZnJvbSB3b3JraW5nIG1hcCBhdCB0aGUgcmVsZWFzZQorCQkgKiBvZiBsYXN0IHJlZmVyZW5jZSByZWxlYXNlOworCQkgKi8KKwkJaWYgKCEobGUzMl90b19jcHUoaWFncC0+d21hcFtleHRub10pICYgbWFzaykpIHsKKwkJCWpmc19lcnJvcihpcGltYXAtPmlfc2IsIAorCQkJCSAgImRpVXBkYXRlUE1hcDogaW5vZGUgJWxkIG5vdCBtYXJrZWQgYXMgIgorCQkJCSAgImFsbG9jYXRlZCBpbiB3bWFwISIsIGludW0pOworCQl9CisJCWlmICghKGxlMzJfdG9fY3B1KGlhZ3AtPnBtYXBbZXh0bm9dKSAmIG1hc2spKSB7CisJCQlqZnNfZXJyb3IoaXBpbWFwLT5pX3NiLAorCQkJCSAgImRpVXBkYXRlUE1hcDogaW5vZGUgJWxkIG5vdCBtYXJrZWQgYXMgIgorCQkJCSAgImFsbG9jYXRlZCBpbiBwbWFwISIsIGludW0pOworCQl9CisJCS8qIHVwZGF0ZSB0aGUgYml0bWFwIGZvciB0aGUgZXh0ZW50IG9mIHRoZSBmcmVlZCBpbm9kZSAqLworCQlpYWdwLT5wbWFwW2V4dG5vXSAmPSBjcHVfdG9fbGUzMih+bWFzayk7CisJfQorCS8qCisJICogbWFyayB0aGUgaW5vZGUgYWxsb2NhdGVkIGluIHBlcnNpc3RlbnQgbWFwOgorCSAqLworCWVsc2UgeworCQkvKiBUaGUgaW5vZGUgc2hvdWxkIGJlIGFscmVhZHkgYWxsb2NhdGVkIGluIHRoZSB3b3JraW5nIG1hcAorCQkgKiBhbmQgc2hvdWxkIGJlIGZyZWUgaW4gcGVyc2lzdGVudCBtYXA7CisJCSAqLworCQlpZiAoIShsZTMyX3RvX2NwdShpYWdwLT53bWFwW2V4dG5vXSkgJiBtYXNrKSkgeworCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQlqZnNfZXJyb3IoaXBpbWFwLT5pX3NiLAorCQkJCSAgImRpVXBkYXRlUE1hcDogdGhlIGlub2RlIGlzIG5vdCBhbGxvY2F0ZWQgaW4gIgorCQkJCSAgInRoZSB3b3JraW5nIG1hcCIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJaWYgKChsZTMyX3RvX2NwdShpYWdwLT5wbWFwW2V4dG5vXSkgJiBtYXNrKSAhPSAwKSB7CisJCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJCWpmc19lcnJvcihpcGltYXAtPmlfc2IsCisJCQkJICAiZGlVcGRhdGVQTWFwOiB0aGUgaW5vZGUgaXMgbm90IGZyZWUgaW4gdGhlICIKKwkJCQkgICJwZXJzaXN0ZW50IG1hcCIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJLyogdXBkYXRlIHRoZSBiaXRtYXAgZm9yIHRoZSBleHRlbnQgb2YgdGhlIGFsbG9jYXRlZCBpbm9kZSAqLworCQlpYWdwLT5wbWFwW2V4dG5vXSB8PSBjcHVfdG9fbGUzMihtYXNrKTsKKwl9CisJLyoKKwkgKiB1cGRhdGUgaWFnIGxzbgorCSAqLworCWxzbiA9IHRibGstPmxzbjsKKwlsb2cgPSBKRlNfU0JJKHRibGstPnNiKS0+bG9nOworCWlmIChtcC0+bHNuICE9IDApIHsKKwkJLyogaW5oZXJpdCBvbGRlci9zbWFsbGVyIGxzbiAqLworCQlsb2dkaWZmKGRpZmZ0LCBsc24sIGxvZyk7CisJCWxvZ2RpZmYoZGlmZnAsIG1wLT5sc24sIGxvZyk7CisJCWlmIChkaWZmdCA8IGRpZmZwKSB7CisJCQltcC0+bHNuID0gbHNuOworCQkJLyogbW92ZSBtcCBhZnRlciB0YmxvY2sgaW4gbG9nc3luYyBsaXN0ICovCisJCQlMT0dTWU5DX0xPQ0sobG9nKTsKKwkJCWxpc3RfbW92ZSgmbXAtPnN5bmNsaXN0LCAmdGJsay0+c3luY2xpc3QpOworCQkJTE9HU1lOQ19VTkxPQ0sobG9nKTsKKwkJfQorCQkvKiBpbmhlcml0IHlvdW5nZXIvbGFyZ2VyIGNsc24gKi8KKwkJTE9HU1lOQ19MT0NLKGxvZyk7CisJCWFzc2VydChtcC0+Y2xzbik7CisJCWxvZ2RpZmYoZGlmZnQsIHRibGstPmNsc24sIGxvZyk7CisJCWxvZ2RpZmYoZGlmZnAsIG1wLT5jbHNuLCBsb2cpOworCQlpZiAoZGlmZnQgPiBkaWZmcCkKKwkJCW1wLT5jbHNuID0gdGJsay0+Y2xzbjsKKwkJTE9HU1lOQ19VTkxPQ0sobG9nKTsKKwl9IGVsc2UgeworCQltcC0+bG9nID0gbG9nOworCQltcC0+bHNuID0gbHNuOworCQkvKiBpbnNlcnQgbXAgYWZ0ZXIgdGJsb2NrIGluIGxvZ3N5bmMgbGlzdCAqLworCQlMT0dTWU5DX0xPQ0sobG9nKTsKKwkJbG9nLT5jb3VudCsrOworCQlsaXN0X2FkZCgmbXAtPnN5bmNsaXN0LCAmdGJsay0+c3luY2xpc3QpOworCQltcC0+Y2xzbiA9IHRibGstPmNsc247CisJCUxPR1NZTkNfVU5MT0NLKGxvZyk7CisJfQorCXdyaXRlX21ldGFwYWdlKG1wKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICoJZGlFeHRlbmRGUygpCisgKgorICogZnVuY3Rpb246IHVwZGF0ZSBpbWFwIGZvciBleHRlbmRmcygpOworICogCisgKiBub3RlOiBBRyBzaXplIGhhcyBiZWVuIGluY3JlYXNlZCBzLnQuIGVhY2ggayBvbGQgY29udGlndW91cyBBR3MgYXJlIAorICogY29hbGVzY2VkIGludG8gYSBuZXcgQUc7CisgKi8KK2ludCBkaUV4dGVuZEZTKHN0cnVjdCBpbm9kZSAqaXBpbWFwLCBzdHJ1Y3QgaW5vZGUgKmlwYm1hcCkKK3sKKwlpbnQgcmMsIHJjeCA9IDA7CisJc3RydWN0IGlub21hcCAqaW1hcCA9IEpGU19JUChpcGltYXApLT5pX2ltYXA7CisJc3RydWN0IGlhZyAqaWFncCA9IE5VTEwsICpoaWFncCA9IE5VTEw7CisJc3RydWN0IGJtYXAgKm1wID0gSkZTX1NCSShpcGJtYXAtPmlfc2IpLT5ibWFwOworCXN0cnVjdCBtZXRhcGFnZSAqYnAsICpoYnA7CisJaW50IGksIG4sIGhlYWQ7CisJaW50IG51bWlub3MsIHhudW1pbm9zID0gMCwgeG51bWZyZWUgPSAwOworCXM2NCBhZ3N0YXJ0OworCisJamZzX2luZm8oImRpRXh0ZW5kRlM6IG5leHRpYWc6JWQgbnVtaW5vczolZCBudW1mcmVlOiVkIiwKKwkJICAgaW1hcC0+aW1fbmV4dGlhZywgYXRvbWljX3JlYWQoJmltYXAtPmltX251bWlub3MpLAorCQkgICBhdG9taWNfcmVhZCgmaW1hcC0+aW1fbnVtZnJlZSkpOworCisJLyoKKwkgKiAgICAgIHJlY29uc3RydWN0IGltYXAgCisJICoKKwkgKiBjb2FsZXNjZSBjb250aWd1b3VzIGsgKG5ld0FHU2l6ZS9vbGRBR1NpemUpIEFHczsKKwkgKiBpLmUuLCAoQUdpLCAuLi4sIEFHaikgd2hlcmUgaSA9IGsqbiBhbmQgaiA9IGsqKG4rMSkgLSAxIHRvIEFHbjsKKwkgKiBub3RlOiBuZXcgQUcgc2l6ZSA9IG9sZCBBRyBzaXplICogKDIqKngpLgorCSAqLworCisJLyogaW5pdCBwZXIgQUcgY29udHJvbCBpbmZvcm1hdGlvbiBpbV9hZ2N0bFtdICovCisJZm9yIChpID0gMDsgaSA8IE1BWEFHOyBpKyspIHsKKwkJaW1hcC0+aW1fYWdjdGxbaV0uaW5vZnJlZSA9IC0xOworCQlpbWFwLT5pbV9hZ2N0bFtpXS5leHRmcmVlID0gLTE7CisJCWltYXAtPmltX2FnY3RsW2ldLm51bWlub3MgPSAwOwkvKiBudW1iZXIgb2YgYmFja2VkIGlub2RlcyAqLworCQlpbWFwLT5pbV9hZ2N0bFtpXS5udW1mcmVlID0gMDsJLyogbnVtYmVyIG9mIGZyZWUgYmFja2VkIGlub2RlcyAqLworCX0KKworCS8qCisJICogICAgICBwcm9jZXNzIGVhY2ggaWFnIHBhZ2Ugb2YgdGhlIG1hcC4KKwkgKgorCSAqIHJlYnVpbGQgQUcgRnJlZSBJbm9kZSBMaXN0LCBBRyBGcmVlIElub2RlIEV4dGVudCBMaXN0OworCSAqLworCWZvciAoaSA9IDA7IGkgPCBpbWFwLT5pbV9uZXh0aWFnOyBpKyspIHsKKwkJaWYgKChyYyA9IGRpSUFHUmVhZChpbWFwLCBpLCAmYnApKSkgeworCQkJcmN4ID0gcmM7CisJCQljb250aW51ZTsKKwkJfQorCQlpYWdwID0gKHN0cnVjdCBpYWcgKikgYnAtPmRhdGE7CisJCWlmIChsZTMyX3RvX2NwdShpYWdwLT5pYWdudW0pICE9IGkpIHsKKwkJCXJlbGVhc2VfbWV0YXBhZ2UoYnApOworCQkJamZzX2Vycm9yKGlwaW1hcC0+aV9zYiwKKwkJCQkgICJkaUV4dGVuZEZzOiB1bmV4cGVjdGVkIHZhbHVlIG9mIGlhZ251bSIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQkvKiBsZWF2ZSBmcmVlIGlhZyBpbiB0aGUgZnJlZSBpYWcgbGlzdCAqLworCQlpZiAoaWFncC0+bmZyZWVleHRzID09IGNwdV90b19sZTMyKEVYVFNQRVJJQUcpKSB7ICAKKwkJICAgICAgICByZWxlYXNlX21ldGFwYWdlKGJwKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogYWdzdGFydCB0aGF0IGNvbXB1dGVzIHRvIHRoZSBzYW1lIGFnIGlzIHRyZWF0ZWQgYXMgc2FtZTsgKi8KKwkJYWdzdGFydCA9IGxlNjRfdG9fY3B1KGlhZ3AtPmFnc3RhcnQpOworCQkvKiBpYWdwLT5hZ3N0YXJ0ID0gYWdzdGFydCAmIH4obXAtPmRiX2Fnc2l6ZSAtIDEpOyAqLworCQluID0gYWdzdGFydCA+PiBtcC0+ZGJfYWdsMnNpemU7CisKKwkJLyogY29tcHV0ZSBiYWNrZWQgaW5vZGVzICovCisJCW51bWlub3MgPSAoRVhUU1BFUklBRyAtIGxlMzJfdG9fY3B1KGlhZ3AtPm5mcmVlZXh0cykpCisJCSAgICA8PCBMMklOT1NQRVJFWFQ7CisJCWlmIChudW1pbm9zID4gMCkgeworCQkJLyogbWVyZ2UgQUcgYmFja2VkIGlub2RlcyAqLworCQkJaW1hcC0+aW1fYWdjdGxbbl0ubnVtaW5vcyArPSBudW1pbm9zOworCQkJeG51bWlub3MgKz0gbnVtaW5vczsKKwkJfQorCisJCS8qIGlmIGFueSBiYWNrZWQgZnJlZSBpbm9kZXMsIGluc2VydCBhdCBBRyBmcmVlIGlub2RlIGxpc3QgKi8KKwkJaWYgKChpbnQpIGxlMzJfdG9fY3B1KGlhZ3AtPm5mcmVlaW5vcykgPiAwKSB7CisJCQlpZiAoKGhlYWQgPSBpbWFwLT5pbV9hZ2N0bFtuXS5pbm9mcmVlKSA9PSAtMSkgeworCQkJCWlhZ3AtPmlub2ZyZWVmd2QgPSBjcHVfdG9fbGUzMigtMSk7CisJCQkJaWFncC0+aW5vZnJlZWJhY2sgPSBjcHVfdG9fbGUzMigtMSk7CisJCQl9IGVsc2UgeworCQkJCWlmICgocmMgPSBkaUlBR1JlYWQoaW1hcCwgaGVhZCwgJmhicCkpKSB7CisJCQkJCXJjeCA9IHJjOworCQkJCQlnb3RvIG5leHRpYWc7CisJCQkJfQorCQkJCWhpYWdwID0gKHN0cnVjdCBpYWcgKikgaGJwLT5kYXRhOworCQkJCWhpYWdwLT5pbm9mcmVlYmFjayA9IGlhZ3AtPmlhZ251bTsKKwkJCQlpYWdwLT5pbm9mcmVlZndkID0gY3B1X3RvX2xlMzIoaGVhZCk7CisJCQkJaWFncC0+aW5vZnJlZWJhY2sgPSBjcHVfdG9fbGUzMigtMSk7CisJCQkJd3JpdGVfbWV0YXBhZ2UoaGJwKTsKKwkJCX0KKworCQkJaW1hcC0+aW1fYWdjdGxbbl0uaW5vZnJlZSA9CisJCQkgICAgbGUzMl90b19jcHUoaWFncC0+aWFnbnVtKTsKKworCQkJLyogbWVyZ2UgQUcgYmFja2VkIGZyZWUgaW5vZGVzICovCisJCQlpbWFwLT5pbV9hZ2N0bFtuXS5udW1mcmVlICs9CisJCQkgICAgbGUzMl90b19jcHUoaWFncC0+bmZyZWVpbm9zKTsKKwkJCXhudW1mcmVlICs9IGxlMzJfdG9fY3B1KGlhZ3AtPm5mcmVlaW5vcyk7CisJCX0KKworCQkvKiBpZiBhbnkgZnJlZSBleHRlbnRzLCBpbnNlcnQgYXQgQUcgZnJlZSBleHRlbnQgbGlzdCAqLworCQlpZiAobGUzMl90b19jcHUoaWFncC0+bmZyZWVleHRzKSA+IDApIHsKKwkJCWlmICgoaGVhZCA9IGltYXAtPmltX2FnY3RsW25dLmV4dGZyZWUpID09IC0xKSB7CisJCQkJaWFncC0+ZXh0ZnJlZWZ3ZCA9IGNwdV90b19sZTMyKC0xKTsKKwkJCQlpYWdwLT5leHRmcmVlYmFjayA9IGNwdV90b19sZTMyKC0xKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKChyYyA9IGRpSUFHUmVhZChpbWFwLCBoZWFkLCAmaGJwKSkpIHsKKwkJCQkJcmN4ID0gcmM7CisJCQkJCWdvdG8gbmV4dGlhZzsKKwkJCQl9CisJCQkJaGlhZ3AgPSAoc3RydWN0IGlhZyAqKSBoYnAtPmRhdGE7CisJCQkJaGlhZ3AtPmV4dGZyZWViYWNrID0gaWFncC0+aWFnbnVtOworCQkJCWlhZ3AtPmV4dGZyZWVmd2QgPSBjcHVfdG9fbGUzMihoZWFkKTsKKwkJCQlpYWdwLT5leHRmcmVlYmFjayA9IGNwdV90b19sZTMyKC0xKTsKKwkJCQl3cml0ZV9tZXRhcGFnZShoYnApOworCQkJfQorCisJCQlpbWFwLT5pbV9hZ2N0bFtuXS5leHRmcmVlID0KKwkJCSAgICBsZTMyX3RvX2NwdShpYWdwLT5pYWdudW0pOworCQl9CisKKwkgICAgICBuZXh0aWFnOgorCQl3cml0ZV9tZXRhcGFnZShicCk7CisJfQorCisJaWYgKHhudW1pbm9zICE9IGF0b21pY19yZWFkKCZpbWFwLT5pbV9udW1pbm9zKSB8fAorCSAgICB4bnVtZnJlZSAhPSBhdG9taWNfcmVhZCgmaW1hcC0+aW1fbnVtZnJlZSkpIHsKKwkJamZzX2Vycm9yKGlwaW1hcC0+aV9zYiwKKwkJCSAgImRpRXh0ZW5kRnM6IG51bWlub3Mgb3IgbnVtZnJlZSBpbmNvcnJlY3QiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIHJjeDsKK30KKworCisvKgorICoJZHVwbGljYXRlSVh0cmVlKCkKKyAqCisgKiBzZXJpYWxpemF0aW9uOiBJV1JJVEVfTE9DSyBoZWxkIG9uIGVudHJ5L2V4aXQKKyAqCisgKiBub3RlOiBzaGFkb3cgcGFnZSB3aXRoIHJlZ3VsYXIgaW5vZGUgKHJlbC4yKTsKKyAqLworc3RhdGljIHZvaWQgZHVwbGljYXRlSVh0cmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHM2NCBibGtubywKKwkJCSAgICBpbnQgeGxlbiwgczY0ICp4YWRkcikKK3sKKwlzdHJ1Y3QgamZzX3N1cGVyYmxvY2sgKmpfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgaW5vZGUgKmlwOworCXRpZF90IHRpZDsKKworCS8qIGlmIEFJVDIgaXBtYXAyIGlzIGJhZCwgZG8gbm90IHRyeSB0byB1cGRhdGUgaXQgKi8KKwlpZiAoSkZTX1NCSShzYiktPm1udGZsYWcgJiBKRlNfQkFEX1NBSVQpCS8qIHNfZmxhZyAqLworCQlyZXR1cm47CisJaXAgPSBkaVJlYWRTcGVjaWFsKHNiLCBGSUxFU1lTVEVNX0ksIDEpOworCWlmIChpcCA9PSBOVUxMKSB7CisJCUpGU19TQkkoc2IpLT5tbnRmbGFnIHw9IEpGU19CQURfU0FJVDsKKwkJaWYgKHJlYWRTdXBlcihzYiwgJmJoKSkKKwkJCXJldHVybjsKKwkJal9zYiA9IChzdHJ1Y3QgamZzX3N1cGVyYmxvY2sgKiliaC0+Yl9kYXRhOworCQlqX3NiLT5zX2ZsYWcgfD0gY3B1X3RvX2xlMzIoSkZTX0JBRF9TQUlUKTsKKworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwkJYnJlbHNlKGJoKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHN0YXJ0IHRyYW5zYWN0aW9uICovCisJdGlkID0gdHhCZWdpbihzYiwgQ09NTUlUX0ZPUkNFKTsKKwkvKiB1cGRhdGUgdGhlIGlub2RlIG1hcCBhZGRyZXNzaW5nIHN0cnVjdHVyZSB0byBwb2ludCB0byBpdCAqLworCWlmICh4dEluc2VydCh0aWQsIGlwLCAwLCBibGtubywgeGxlbiwgeGFkZHIsIDApKSB7CisJCUpGU19TQkkoc2IpLT5tbnRmbGFnIHw9IEpGU19CQURfU0FJVDsKKwkJdHhBYm9ydCh0aWQsIDEpOworCQlnb3RvIGNsZWFudXA7CisKKwl9CisJLyogdXBkYXRlIHRoZSBpbm9kZSBtYXAncyBpbm9kZSB0byByZWZsZWN0IHRoZSBleHRlbnNpb24gKi8KKwlpcC0+aV9zaXplICs9IFBTSVpFOworCWlub2RlX2FkZF9ieXRlcyhpcCwgUFNJWkUpOworCXR4Q29tbWl0KHRpZCwgMSwgJmlwLCBDT01NSVRfRk9SQ0UpOworICAgICAgY2xlYW51cDoKKwl0eEVuZCh0aWQpOworCWRpRnJlZVNwZWNpYWwoaXApOworfQorCisvKgorICogTkFNRTogICAgICAgIGNvcHlfZnJvbV9kaW5vZGUoKQorICoKKyAqIEZVTkNUSU9OOiAgICBDb3BpZXMgaW5vZGUgaW5mbyBmcm9tIGRpc2sgaW5vZGUgdG8gaW4tbWVtb3J5IGlub2RlCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMCAgICAgICAtIHN1Y2Nlc3MKKyAqICAgICAgLUVOT01FTQktIGluc3VmZmljaWVudCBtZW1vcnkKKyAqLworc3RhdGljIGludCBjb3B5X2Zyb21fZGlub2RlKHN0cnVjdCBkaW5vZGUgKiBkaXAsIHN0cnVjdCBpbm9kZSAqaXApCit7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqZnNfaXAgPSBKRlNfSVAoaXApOworCisJamZzX2lwLT5maWxlc2V0ID0gbGUzMl90b19jcHUoZGlwLT5kaV9maWxlc2V0KTsKKwlqZnNfaXAtPm1vZGUyID0gbGUzMl90b19jcHUoZGlwLT5kaV9tb2RlKTsKKworCWlwLT5pX21vZGUgPSBsZTMyX3RvX2NwdShkaXAtPmRpX21vZGUpICYgMHhmZmZmOworCWlwLT5pX25saW5rID0gbGUzMl90b19jcHUoZGlwLT5kaV9ubGluayk7CisJaXAtPmlfdWlkID0gbGUzMl90b19jcHUoZGlwLT5kaV91aWQpOworCWlwLT5pX2dpZCA9IGxlMzJfdG9fY3B1KGRpcC0+ZGlfZ2lkKTsKKwlpcC0+aV9zaXplID0gbGU2NF90b19jcHUoZGlwLT5kaV9zaXplKTsKKwlpcC0+aV9hdGltZS50dl9zZWMgPSBsZTMyX3RvX2NwdShkaXAtPmRpX2F0aW1lLnR2X3NlYyk7CisJaXAtPmlfYXRpbWUudHZfbnNlYyA9IGxlMzJfdG9fY3B1KGRpcC0+ZGlfYXRpbWUudHZfbnNlYyk7CisJaXAtPmlfbXRpbWUudHZfc2VjID0gbGUzMl90b19jcHUoZGlwLT5kaV9tdGltZS50dl9zZWMpOworCWlwLT5pX210aW1lLnR2X25zZWMgPSBsZTMyX3RvX2NwdShkaXAtPmRpX210aW1lLnR2X25zZWMpOworCWlwLT5pX2N0aW1lLnR2X3NlYyA9IGxlMzJfdG9fY3B1KGRpcC0+ZGlfY3RpbWUudHZfc2VjKTsKKwlpcC0+aV9jdGltZS50dl9uc2VjID0gbGUzMl90b19jcHUoZGlwLT5kaV9jdGltZS50dl9uc2VjKTsKKwlpcC0+aV9ibGtzaXplID0gaXAtPmlfc2ItPnNfYmxvY2tzaXplOworCWlwLT5pX2Jsb2NrcyA9IExCTEsyUEJMSyhpcC0+aV9zYiwgbGU2NF90b19jcHUoZGlwLT5kaV9uYmxvY2tzKSk7CisJaXAtPmlfZ2VuZXJhdGlvbiA9IGxlMzJfdG9fY3B1KGRpcC0+ZGlfZ2VuKTsKKworCWpmc19pcC0+aXhweGQgPSBkaXAtPmRpX2l4cHhkOwkvKiBpbi1tZW1vcnkgcHhkJ3MgYXJlIGxpdHRsZS1lbmRpYW4gKi8KKwlqZnNfaXAtPmFjbCA9IGRpcC0+ZGlfYWNsOwkvKiBhcyBhcmUgZHhkJ3MgKi8KKwlqZnNfaXAtPmVhID0gZGlwLT5kaV9lYTsKKwlqZnNfaXAtPm5leHRfaW5kZXggPSBsZTMyX3RvX2NwdShkaXAtPmRpX25leHRfaW5kZXgpOworCWpmc19pcC0+b3RpbWUgPSBsZTMyX3RvX2NwdShkaXAtPmRpX290aW1lLnR2X3NlYyk7CisJamZzX2lwLT5hY2x0eXBlID0gbGUzMl90b19jcHUoZGlwLT5kaV9hY2x0eXBlKTsKKworCWlmIChTX0lTQ0hSKGlwLT5pX21vZGUpIHx8IFNfSVNCTEsoaXAtPmlfbW9kZSkpIHsKKwkJamZzX2lwLT5kZXYgPSBsZTMyX3RvX2NwdShkaXAtPmRpX3JkZXYpOworCQlpcC0+aV9yZGV2ID0gbmV3X2RlY29kZV9kZXYoamZzX2lwLT5kZXYpOworCX0KKworCWlmIChTX0lTRElSKGlwLT5pX21vZGUpKSB7CisJCW1lbWNweSgmamZzX2lwLT5pX2RpcnRhYmxlLCAmZGlwLT5kaV9kaXJ0YWJsZSwgMzg0KTsKKwl9IGVsc2UgaWYgKFNfSVNSRUcoaXAtPmlfbW9kZSkgfHwgU19JU0xOSyhpcC0+aV9tb2RlKSkgeworCQltZW1jcHkoJmpmc19pcC0+aV94dHJvb3QsICZkaXAtPmRpX3h0cm9vdCwgMjg4KTsKKwl9IGVsc2UKKwkJbWVtY3B5KCZqZnNfaXAtPmlfaW5saW5lX2VhLCAmZGlwLT5kaV9pbmxpbmVlYSwgMTI4KTsKKworCS8qIFplcm8gdGhlIGluLW1lbW9yeS1vbmx5IHN0dWZmICovCisJamZzX2lwLT5jZmxhZyA9IDA7CisJamZzX2lwLT5idGluZGV4ID0gMDsKKwlqZnNfaXAtPmJ0b3JkZXIgPSAwOworCWpmc19pcC0+YnhmbGFnID0gMDsKKwlqZnNfaXAtPmJsaWQgPSAwOworCWpmc19pcC0+YXRsaGVhZCA9IDA7CisJamZzX2lwLT5hdGx0YWlsID0gMDsKKwlqZnNfaXAtPnh0bGlkID0gMDsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogTkFNRTogICAgICAgIGNvcHlfdG9fZGlub2RlKCkKKyAqCisgKiBGVU5DVElPTjogICAgQ29waWVzIGlub2RlIGluZm8gZnJvbSBpbi1tZW1vcnkgaW5vZGUgdG8gZGlzayBpbm9kZQorICovCitzdGF0aWMgdm9pZCBjb3B5X3RvX2Rpbm9kZShzdHJ1Y3QgZGlub2RlICogZGlwLCBzdHJ1Y3QgaW5vZGUgKmlwKQoreworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamZzX2lwID0gSkZTX0lQKGlwKTsKKworCWRpcC0+ZGlfZmlsZXNldCA9IGNwdV90b19sZTMyKGpmc19pcC0+ZmlsZXNldCk7CisJZGlwLT5kaV9pbm9zdGFtcCA9IGNwdV90b19sZTMyKEpGU19TQkkoaXAtPmlfc2IpLT5pbm9zdGFtcCk7CisJZGlwLT5kaV9udW1iZXIgPSBjcHVfdG9fbGUzMihpcC0+aV9pbm8pOworCWRpcC0+ZGlfZ2VuID0gY3B1X3RvX2xlMzIoaXAtPmlfZ2VuZXJhdGlvbik7CisJZGlwLT5kaV9zaXplID0gY3B1X3RvX2xlNjQoaXAtPmlfc2l6ZSk7CisJZGlwLT5kaV9uYmxvY2tzID0gY3B1X3RvX2xlNjQoUEJMSzJMQkxLKGlwLT5pX3NiLCBpcC0+aV9ibG9ja3MpKTsKKwlkaXAtPmRpX25saW5rID0gY3B1X3RvX2xlMzIoaXAtPmlfbmxpbmspOworCWRpcC0+ZGlfdWlkID0gY3B1X3RvX2xlMzIoaXAtPmlfdWlkKTsKKwlkaXAtPmRpX2dpZCA9IGNwdV90b19sZTMyKGlwLT5pX2dpZCk7CisJLyoKKwkgKiBtb2RlMiBpcyBvbmx5IG5lZWRlZCBmb3Igc3RvcmluZyB0aGUgaGlnaGVyIG9yZGVyIGJpdHMuCisJICogVHJ1c3QgaV9tb2RlIGZvciB0aGUgbG93ZXIgb3JkZXIgb25lcworCSAqLworCWRpcC0+ZGlfbW9kZSA9IGNwdV90b19sZTMyKChqZnNfaXAtPm1vZGUyICYgMHhmZmZmMDAwMCkgfCBpcC0+aV9tb2RlKTsKKwlkaXAtPmRpX2F0aW1lLnR2X3NlYyA9IGNwdV90b19sZTMyKGlwLT5pX2F0aW1lLnR2X3NlYyk7CisJZGlwLT5kaV9hdGltZS50dl9uc2VjID0gY3B1X3RvX2xlMzIoaXAtPmlfYXRpbWUudHZfbnNlYyk7CisJZGlwLT5kaV9jdGltZS50dl9zZWMgPSBjcHVfdG9fbGUzMihpcC0+aV9jdGltZS50dl9zZWMpOworCWRpcC0+ZGlfY3RpbWUudHZfbnNlYyA9IGNwdV90b19sZTMyKGlwLT5pX2N0aW1lLnR2X25zZWMpOworCWRpcC0+ZGlfbXRpbWUudHZfc2VjID0gY3B1X3RvX2xlMzIoaXAtPmlfbXRpbWUudHZfc2VjKTsKKwlkaXAtPmRpX210aW1lLnR2X25zZWMgPSBjcHVfdG9fbGUzMihpcC0+aV9tdGltZS50dl9uc2VjKTsKKwlkaXAtPmRpX2l4cHhkID0gamZzX2lwLT5peHB4ZDsJLyogaW4tbWVtb3J5IHB4ZCdzIGFyZSBsaXR0bGUtZW5kaWFuICovCisJZGlwLT5kaV9hY2wgPSBqZnNfaXAtPmFjbDsJLyogYXMgYXJlIGR4ZCdzICovCisJZGlwLT5kaV9lYSA9IGpmc19pcC0+ZWE7CisJZGlwLT5kaV9uZXh0X2luZGV4ID0gY3B1X3RvX2xlMzIoamZzX2lwLT5uZXh0X2luZGV4KTsKKwlkaXAtPmRpX290aW1lLnR2X3NlYyA9IGNwdV90b19sZTMyKGpmc19pcC0+b3RpbWUpOworCWRpcC0+ZGlfb3RpbWUudHZfbnNlYyA9IDA7CisJZGlwLT5kaV9hY2x0eXBlID0gY3B1X3RvX2xlMzIoamZzX2lwLT5hY2x0eXBlKTsKKwlpZiAoU19JU0NIUihpcC0+aV9tb2RlKSB8fCBTX0lTQkxLKGlwLT5pX21vZGUpKQorCQlkaXAtPmRpX3JkZXYgPSBjcHVfdG9fbGUzMihqZnNfaXAtPmRldik7Cit9CisKKyNpZmRlZglfSkZTX0RFQlVHX0lNQVAKKy8qCisgKglEQkdkaUluaXQoKQorICovCitzdGF0aWMgdm9pZCAqREJHZGlJbml0KHN0cnVjdCBpbm9tYXAgKiBpbWFwKQoreworCXUzMiAqZGltYXA7CisJaW50IHNpemU7CisJc2l6ZSA9IDY0ICogMTAyNDsKKwlpZiAoKGRpbWFwID0gKHUzMiAqKSB4bWFsbG9jKHNpemUsIEwyUFNJWkUsIGtlcm5lbF9oZWFwKSkgPT0gTlVMTCkKKwkJYXNzZXJ0KDApOworCWJ6ZXJvKCh2b2lkICopIGRpbWFwLCBzaXplKTsKKwlpbWFwLT5pbV9EQkdkaW1hcCA9IGRpbWFwOworfQorCisvKgorICoJREJHZGlBbGxvYygpCisgKi8KK3N0YXRpYyB2b2lkIERCR2RpQWxsb2Moc3RydWN0IGlub21hcCAqIGltYXAsIGlub190IGlubykKK3sKKwl1MzIgKmRpbWFwID0gaW1hcC0+aW1fREJHZGltYXA7CisJaW50IHcsIGI7CisJdTMyIG07CisJdyA9IGlubyA+PiA1OworCWIgPSBpbm8gJiAzMTsKKwltID0gMHg4MDAwMDAwMCA+PiBiOworCWFzc2VydCh3IDwgNjQgKiAyNTYpOworCWlmIChkaW1hcFt3XSAmIG0pIHsKKwkJcHJpbnRrKCJERUJVRyBkaUFsbG9jOiBkdXBsaWNhdGUgYWxsb2MgaW5vOjB4JXhcbiIsIGlubyk7CisJfQorCWRpbWFwW3ddIHw9IG07Cit9CisKKy8qCisgKglEQkdkaUZyZWUoKQorICovCitzdGF0aWMgdm9pZCBEQkdkaUZyZWUoc3RydWN0IGlub21hcCAqIGltYXAsIGlub190IGlubykKK3sKKwl1MzIgKmRpbWFwID0gaW1hcC0+aW1fREJHZGltYXA7CisJaW50IHcsIGI7CisJdTMyIG07CisJdyA9IGlubyA+PiA1OworCWIgPSBpbm8gJiAzMTsKKwltID0gMHg4MDAwMDAwMCA+PiBiOworCWFzc2VydCh3IDwgNjQgKiAyNTYpOworCWlmICgoZGltYXBbd10gJiBtKSA9PSAwKSB7CisJCXByaW50aygiREVCVUcgZGlGcmVlOiBkdXBsaWNhdGUgZnJlZSBpbm86MHgleFxuIiwgaW5vKTsKKwl9CisJZGltYXBbd10gJj0gfm07Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfY3Aoc3RydWN0IGlub21hcCAqIGlwaW1hcCwgY2hhciAqZnVuY3Rpb24sIGludCBsaW5lKQoreworCXByaW50aygiXG4qICoqKioqKioqKiAqXG5Db250cm9sIFBhZ2UgJXMgJWRcbiIsIGZ1bmN0aW9uLCBsaW5lKTsKKwlwcmludGsoIkZyZWVJQUcgJWRcdE5leHRJQUcgJWRcbiIsIGlwaW1hcC0+aW1fZnJlZWlhZywKKwkgICAgICAgaXBpbWFwLT5pbV9uZXh0aWFnKTsKKwlwcmludGsoIk51bUlub3MgJWRcdE51bUZyZWUgJWRcbiIsCisJICAgICAgIGF0b21pY19yZWFkKCZpcGltYXAtPmltX251bWlub3MpLAorCSAgICAgICBhdG9taWNfcmVhZCgmaXBpbWFwLT5pbV9udW1mcmVlKSk7CisJcHJpbnRrKCJBRyBJbm9GcmVlICVkXHRBRyBFeHRGcmVlICVkXG4iLAorCSAgICAgICBpcGltYXAtPmltX2FnY3RsWzBdLmlub2ZyZWUsIGlwaW1hcC0+aW1fYWdjdGxbMF0uZXh0ZnJlZSk7CisJcHJpbnRrKCJBRyBOdW1Jbm9zICVkXHRBRyBOdW1GcmVlICVkXG4iLAorCSAgICAgICBpcGltYXAtPmltX2FnY3RsWzBdLm51bWlub3MsIGlwaW1hcC0+aW1fYWdjdGxbMF0ubnVtZnJlZSk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfaWFnKHN0cnVjdCBpYWcgKiBpYWcsIGNoYXIgKmZ1bmN0aW9uLCBpbnQgbGluZSkKK3sKKwlwcmludGsoIlxuKiAqKioqKioqKiogKlxuSUFHICVzICVkXG4iLCBmdW5jdGlvbiwgbGluZSk7CisJcHJpbnRrKCJJYWdOdW0gJWRcdElBRyBGcmVlICVkXG4iLCBsZTMyX3RvX2NwdShpYWctPmlhZ251bSksCisJICAgICAgIGxlMzJfdG9fY3B1KGlhZy0+aWFnZnJlZSkpOworCXByaW50aygiSW5vRnJlZUZ3ZCAlZFx0SW5vRnJlZUJhY2sgJWRcbiIsCisJICAgICAgIGxlMzJfdG9fY3B1KGlhZy0+aW5vZnJlZWZ3ZCksCisJICAgICAgIGxlMzJfdG9fY3B1KGlhZy0+aW5vZnJlZWJhY2spKTsKKwlwcmludGsoIkV4dEZyZWVGd2QgJWRcdEV4dEZyZWVCYWNrICVkXG4iLAorCSAgICAgICBsZTMyX3RvX2NwdShpYWctPmV4dGZyZWVmd2QpLAorCSAgICAgICBsZTMyX3RvX2NwdShpYWctPmV4dGZyZWViYWNrKSk7CisJcHJpbnRrKCJORnJlZUlub3MgJWRcdE5GcmVlRXh0cyAlZFxuIiwgbGUzMl90b19jcHUoaWFnLT5uZnJlZWlub3MpLAorCSAgICAgICBsZTMyX3RvX2NwdShpYWctPm5mcmVlZXh0cykpOworfQorI2VuZGlmCQkJCS8qIF9KRlNfREVCVUdfSU1BUCAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19pbWFwLmggYi9mcy9qZnMvamZzX2ltYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjU5YWRlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19pbWFwLmgKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDAyCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYJX0hfSkZTX0lNQVAKKyNkZWZpbmUgX0hfSkZTX0lNQVAKKworI2luY2x1ZGUgImpmc190eG5tZ3IuaCIKKworLyoKKyAqCWpmc19pbWFwLmg6IGRpc2sgaW5vZGUgbWFuYWdlcgorICovCisKKyNkZWZpbmUJRVhUU1BFUklBRwkxMjgJLyogbnVtYmVyIG9mIGRpc2sgaW5vZGUgZXh0ZW50IHBlciBpYWcgICovCisjZGVmaW5lIElNQVBCTEtOTwkwCS8qIGxibGtubyBvZiBkaW5vbWFwIHdpdGhpbiBpbm9kZSBtYXAgICAqLworI2RlZmluZSBTTUFQU1oJCTQJLyogbnVtYmVyIG9mIHdvcmRzIHBlciBzdW1tYXJ5IG1hcCAgICAgICovCisjZGVmaW5lCUVYVFNQRVJTVU0JMzIJLyogbnVtYmVyIG9mIGV4dGVudHMgcGVyIHN1bW1hcnkgbWFwIGVudHJ5ICovCisjZGVmaW5lCUwyRVhUU1BFUlNVTQk1CS8qIGwyIG51bWJlciBvZiBleHRlbnRzIHBlciBzdW1tYXJ5IG1hcCAqLworI2RlZmluZQlQR1NQRVJJRVhUCTQJLyogbnVtYmVyIG9mIDRLIHBhZ2VzIHBlciBkaW5vZGUgZXh0ZW50ICovCisjZGVmaW5lCU1BWElBR1MJCSgoMTw8MjApLTEpCS8qIG1heGltdW0gbnVtYmVyIG9mIGlhZ3MgICAgICAgKi8KKyNkZWZpbmUJTUFYQUcJCTEyOAkvKiBtYXhpbXVtIG51bWJlciBvZiBhbGxvY2F0aW9uIGdyb3VwcyAgKi8KKworI2RlZmluZSBBTUFQU0laRSAgICAgIDUxMgkvKiBieXRlcyBpbiB0aGUgSUFHIGFsbG9jYXRpb24gbWFwcyAqLworI2RlZmluZSBTTUFQU0laRSAgICAgIDE2CS8qIGJ5dGVzIGluIHRoZSBJQUcgc3VtbWFyeSBtYXBzICovCisKKy8qIGNvbnZlcnQgaW5vZGUgbnVtYmVyIHRvIGlhZyBudW1iZXIgKi8KKyNkZWZpbmUJSU5PVE9JQUcoaW5vKQkoKGlubykgPj4gTDJJTk9TUEVSSUFHKQorCisvKiBjb252ZXJ0IGlhZyBudW1iZXIgdG8gbG9naWNhbCBibG9jayBudW1iZXIgb2YgdGhlIGlhZyBwYWdlICovCisjZGVmaW5lIElBR1RPTEJMSyhpYWdubyxsMm5icGVycGcpCSgoKGlhZ25vKSArIDEpIDw8IChsMm5icGVycGcpKQorCisvKiBnZXQgdGhlIHN0YXJ0aW5nIGJsb2NrIG51bWJlciBvZiB0aGUgNEsgcGFnZSBvZiBhbiBpbm9kZSBleHRlbnQKKyAqIHRoYXQgY29udGFpbnMgaW5vLgorICovCisjZGVmaW5lIElOT1BCTEsocHhkLGlubyxsMm5icGVycGcpICAgIAkoYWRkcmVzc1BYRCgocHhkKSkgKwkJXAorCSgoKChpbm8pICYgKElOT1NQRVJFWFQtMSkpID4+IEwySU5PU1BFUlBBR0UpIDw8IChsMm5icGVycGcpKSkKKworLyoKKyAqCWlub2RlIGFsbG9jYXRpb24gbWFwOgorICogCisgKiBpbm9kZSBhbGxvY2F0aW9uIG1hcCBjb25zaXN0cyBvZiAKKyAqIC4gdGhlIGlub2RlIG1hcCBjb250cm9sIHBhZ2UgYW5kCisgKiAuIGlub2RlIGFsbG9jYXRpb24gZ3JvdXAgcGFnZXMgKHBlciA0MDk2IGlub2RlcykKKyAqIHdoaWNoIGFyZSBhZGRyZXNzZWQgYnkgc3RhbmRhcmQgSkZTIHh0cmVlLgorICovCisvKgorICoJaW5vZGUgYWxsb2NhdGlvbiBncm91cCBwYWdlIChwZXIgNDA5NiBpbm9kZXMgb2YgYW4gQUcpCisgKi8KK3N0cnVjdCBpYWcgeworCV9fbGU2NCBhZ3N0YXJ0OwkJLyogODogc3RhcnRpbmcgYmxvY2sgb2YgYWcgICAgICAgICAgICAgICovCisJX19sZTMyIGlhZ251bTsJCS8qIDQ6IGlub2RlIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICAgICAqLworCV9fbGUzMiBpbm9mcmVlZndkOwkvKiA0OiBhZyBpbm9kZSBmcmVlIGxpc3QgZm9yd2FyZCAgICAgICAgKi8KKwlfX2xlMzIgaW5vZnJlZWJhY2s7CS8qIDQ6IGFnIGlub2RlIGZyZWUgbGlzdCBiYWNrICAgICAgICAgICAqLworCV9fbGUzMiBleHRmcmVlZndkOwkvKiA0OiBhZyBpbm9kZSBleHRlbnQgZnJlZSBsaXN0IGZvcndhcmQgKi8KKwlfX2xlMzIgZXh0ZnJlZWJhY2s7CS8qIDQ6IGFnIGlub2RlIGV4dGVudCBmcmVlIGxpc3QgYmFjayAgICAqLworCV9fbGUzMiBpYWdmcmVlOwkJLyogNDogaWFnIGZyZWUgbGlzdCAgICAgICAgICAgICAgICAgICAgICovCisKKwkvKiBzdW1tYXJ5IG1hcDogMSBiaXQgcGVyIGlub2RlIGV4dGVudCAqLworCV9fbGUzMiBpbm9zbWFwW1NNQVBTWl07CS8qIDE2OiBzdW0gbWFwIG9mIG1hcHdvcmRzIHcvIGZyZWUgaW5vZGVzOworCQkJCSAqICAgICAgbm90ZTogdGhpcyBpbmRpY2F0ZXMgZnJlZSBhbmQgYmFja2VkCisJCQkJICogICAgICBpbm9kZXMsIGlmIHRoZSBleHRlbnQgaXMgbm90IGJhY2tlZCB0aGUKKwkJCQkgKiAgICAgIHZhbHVlIHdpbGwgYmUgMS4gIGlmIHRoZSBleHRlbnQgaXMKKwkJCQkgKiAgICAgIGJhY2tlZCBidXQgYWxsIGlub2RlcyBhcmUgYmVpbmcgdXNlZCB0aGUKKwkJCQkgKiAgICAgIHZhbHVlIHdpbGwgYmUgMS4gIGlmIHRoZSBleHRlbnQgaXMKKwkJCQkgKiAgICAgIGJhY2tlZCBidXQgYXQgbGVhc3Qgb25lIG9mIHRoZSBpbm9kZXMgaXMKKwkJCQkgKiAgICAgIGZyZWUgdGhlIHZhbHVlIHdpbGwgYmUgMC4KKwkJCQkgKi8KKwlfX2xlMzIgZXh0c21hcFtTTUFQU1pdOwkvKiAxNjogc3VtIG1hcCBvZiBtYXB3b3JkcyB3LyBmcmVlIGV4dGVudHMgKi8KKwlfX2xlMzIgbmZyZWVpbm9zOwkJLyogNDogbnVtYmVyIG9mIGZyZWUgaW5vZGVzICAgICAgICAgICAgICovCisJX19sZTMyIG5mcmVlZXh0czsJCS8qIDQ6IG51bWJlciBvZiBmcmVlIGV4dGVudHMgICAgICAgICAgICAqLworCS8qICg3MikgKi8KKwl1OCBwYWRbMTk3Nl07CQkvKiAxOTc2OiBwYWQgdG8gMjA0OCBieXRlcyAqLworCS8qIGFsbG9jYXRpb24gYml0IG1hcDogMSBiaXQgcGVyIGlub2RlICgwIC0gZnJlZSwgMSAtIGFsbG9jYXRlZCkgKi8KKwlfX2xlMzIgd21hcFtFWFRTUEVSSUFHXTsJLyogNTEyOiB3b3JraW5nIGFsbG9jYXRpb24gbWFwICAqLworCV9fbGUzMiBwbWFwW0VYVFNQRVJJQUddOwkvKiA1MTI6IHBlcnNpc3RlbnQgYWxsb2NhdGlvbiBtYXAgKi8KKwlweGRfdCBpbm9leHRbRVhUU1BFUklBR107CS8qIDEwMjQ6IGlub2RlIGV4dGVudCBhZGRyZXNzZXMgKi8KK307CQkJCS8qICg0MDk2KSAqLworCisvKgorICoJcGVyIEFHIGNvbnRyb2wgaW5mb3JtYXRpb24gKGluIGlub2RlIG1hcCBjb250cm9sIHBhZ2UpCisgKi8KK3N0cnVjdCBpYWdjdGxfZGlzayB7CisJX19sZTMyIGlub2ZyZWU7CQkvKiA0OiBmcmVlIGlub2RlIGxpc3QgYW5jaG9yICAgICAgICAgICAgKi8KKwlfX2xlMzIgZXh0ZnJlZTsJCS8qIDQ6IGZyZWUgZXh0ZW50IGxpc3QgYW5jaG9yICAgICAgICAgICAqLworCV9fbGUzMiBudW1pbm9zOwkJLyogNDogbnVtYmVyIG9mIGJhY2tlZCBpbm9kZXMgICAgICAgICAgICovCisJX19sZTMyIG51bWZyZWU7CQkvKiA0OiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgICAgICAgICAgICAgKi8KK307CQkJCS8qICgxNikgKi8KKworc3RydWN0IGlhZ2N0bCB7CisJaW50IGlub2ZyZWU7CQkvKiBmcmVlIGlub2RlIGxpc3QgYW5jaG9yICAgICAgICAgICAgKi8KKwlpbnQgZXh0ZnJlZTsJCS8qIGZyZWUgZXh0ZW50IGxpc3QgYW5jaG9yICAgICAgICAgICAqLworCWludCBudW1pbm9zOwkJLyogbnVtYmVyIG9mIGJhY2tlZCBpbm9kZXMgICAgICAgICAgICovCisJaW50IG51bWZyZWU7CQkvKiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgICAgICAgICAgICAgKi8KK307CisKKy8qCisgKglwZXIgZmlsZXNldC9hZ2dyZWdhdGUgaW5vZGUgbWFwIGNvbnRyb2wgcGFnZQorICovCitzdHJ1Y3QgZGlub21hcF9kaXNrIHsKKwlfX2xlMzIgaW5fZnJlZWlhZzsJLyogNDogZnJlZSBpYWcgbGlzdCBhbmNob3IgICAgICovCisJX19sZTMyIGluX25leHRpYWc7CS8qIDQ6IG5leHQgZnJlZSBpYWcgbnVtYmVyICAgICAqLworCV9fbGUzMiBpbl9udW1pbm9zOwkvKiA0OiBudW0gb2YgYmFja2VkIGlub2RlcyAqLworCV9fbGUzMiBpbl9udW1mcmVlOwkvKiA0OiBudW0gb2YgZnJlZSBiYWNrZWQgaW5vZGVzICovCisJX19sZTMyIGluX25icGVyaWV4dDsJLyogNDogbnVtIG9mIGJsb2NrcyBwZXIgaW5vZGUgZXh0ZW50ICovCisJX19sZTMyIGluX2wybmJwZXJpZXh0OwkvKiA0OiBsMiBvZiBpbl9uYnBlcmlleHQgKi8KKwlfX2xlMzIgaW5fZGlza2Jsb2NrOwkvKiA0OiBmb3Igc3RhbmRhbG9uZSB0ZXN0IGRyaXZlciAgKi8KKwlfX2xlMzIgaW5fbWF4YWc7CS8qIDQ6IGZvciBzdGFuZGFsb25lIHRlc3QgZHJpdmVyICAqLworCXU4IHBhZFsyMDE2XTsJCS8qIDIwMTY6IHBhZCB0byAyMDQ4ICovCisJc3RydWN0IGlhZ2N0bF9kaXNrIGluX2FnY3RsW01BWEFHXTsgLyogMjA0ODogQUcgY29udHJvbCBpbmZvcm1hdGlvbiAqLworfTsJCQkJLyogKDQwOTYpICovCisKK3N0cnVjdCBkaW5vbWFwIHsKKwlpbnQgaW5fZnJlZWlhZzsJCS8qIGZyZWUgaWFnIGxpc3QgYW5jaG9yICAgICAqLworCWludCBpbl9uZXh0aWFnOwkJLyogbmV4dCBmcmVlIGlhZyBudW1iZXIgICAgICovCisJaW50IGluX251bWlub3M7CQkvKiBudW0gb2YgYmFja2VkIGlub2RlcyAqLworCWludCBpbl9udW1mcmVlOwkJLyogbnVtIG9mIGZyZWUgYmFja2VkIGlub2RlcyAqLworCWludCBpbl9uYnBlcmlleHQ7CS8qIG51bSBvZiBibG9ja3MgcGVyIGlub2RlIGV4dGVudCAqLworCWludCBpbl9sMm5icGVyaWV4dDsJLyogbDIgb2YgaW5fbmJwZXJpZXh0ICovCisJaW50IGluX2Rpc2tibG9jazsJLyogZm9yIHN0YW5kYWxvbmUgdGVzdCBkcml2ZXIgICovCisJaW50IGluX21heGFnOwkJLyogZm9yIHN0YW5kYWxvbmUgdGVzdCBkcml2ZXIgICovCisJc3RydWN0IGlhZ2N0bCBpbl9hZ2N0bFtNQVhBR107CS8qIEFHIGNvbnRyb2wgaW5mb3JtYXRpb24gKi8KK307CisKKy8qCisgKglJbi1jb3JlIGlub2RlIG1hcCBjb250cm9sIHBhZ2UKKyAqLworc3RydWN0IGlub21hcCB7CisJc3RydWN0IGRpbm9tYXAgaW1faW1hcDsJCS8qIDQwOTY6IGlub2RlIGFsbG9jYXRpb24gY29udHJvbCAqLworCXN0cnVjdCBpbm9kZSAqaW1faXBpbWFwOwkvKiA0OiBwdHIgdG8gaW5vZGUgZm9yIGltYXAgICAqLworCXN0cnVjdCBzZW1hcGhvcmUgaW1fZnJlZWxvY2s7CS8qIDQ6IGlhZyBmcmVlIGxpc3QgbG9jayAgICAgICovCisJc3RydWN0IHNlbWFwaG9yZSBpbV9hZ2xvY2tbTUFYQUddOwkvKiA1MTI6IHBlciBBRyBsb2NrcyAgICAgICAgICAqLworCXUzMiAqaW1fREJHZGltYXA7CisJYXRvbWljX3QgaW1fbnVtaW5vczsJLyogbnVtIG9mIGJhY2tlZCBpbm9kZXMgKi8KKwlhdG9taWNfdCBpbV9udW1mcmVlOwkvKiBudW0gb2YgZnJlZSBiYWNrZWQgaW5vZGVzICovCit9OworCisjZGVmaW5lCWltX2ZyZWVpYWcJaW1faW1hcC5pbl9mcmVlaWFnCisjZGVmaW5lCWltX25leHRpYWcJaW1faW1hcC5pbl9uZXh0aWFnCisjZGVmaW5lCWltX2FnY3RsCWltX2ltYXAuaW5fYWdjdGwKKyNkZWZpbmUJaW1fbmJwZXJpZXh0CWltX2ltYXAuaW5fbmJwZXJpZXh0CisjZGVmaW5lCWltX2wybmJwZXJpZXh0CWltX2ltYXAuaW5fbDJuYnBlcmlleHQKKworLyogZm9yIHN0YW5kYWxvbmUgdGVzdGRyaXZlcgorICovCisjZGVmaW5lCWltX2Rpc2tibG9jawlpbV9pbWFwLmluX2Rpc2tibG9jaworI2RlZmluZQlpbV9tYXhhZwlpbV9pbWFwLmluX21heGFnCisKK2V4dGVybiBpbnQgZGlGcmVlKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgZGlBbGxvYyhzdHJ1Y3QgaW5vZGUgKiwgYm9vbGVhbl90LCBzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gaW50IGRpU3luYyhzdHJ1Y3QgaW5vZGUgKik7CisvKiBleHRlcm5hbCByZWZlcmVuY2VzICovCitleHRlcm4gaW50IGRpVXBkYXRlUE1hcChzdHJ1Y3QgaW5vZGUgKmlwaW1hcCwgdW5zaWduZWQgbG9uZyBpbnVtLAorCQkJYm9vbGVhbl90IGlzX2ZyZWUsIHN0cnVjdCB0YmxvY2sgKiB0YmxrKTsKK2V4dGVybiBpbnQgZGlFeHRlbmRGUyhzdHJ1Y3QgaW5vZGUgKmlwaW1hcCwgc3RydWN0IGlub2RlICppcGJtYXApOworZXh0ZXJuIGludCBkaU1vdW50KHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgZGlVbm1vdW50KHN0cnVjdCBpbm9kZSAqLCBpbnQpOworZXh0ZXJuIGludCBkaVJlYWQoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqZGlSZWFkU3BlY2lhbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW5vX3QsIGludCk7CitleHRlcm4gdm9pZCBkaVdyaXRlU3BlY2lhbChzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKK2V4dGVybiB2b2lkIGRpRnJlZVNwZWNpYWwoc3RydWN0IGlub2RlICopOworZXh0ZXJuIGludCBkaVdyaXRlKHRpZF90IHRpZCwgc3RydWN0IGlub2RlICopOworI2VuZGlmCQkJCS8qIF9IX0pGU19JTUFQICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2luY29yZS5oIGIvZnMvamZzL2pmc19pbmNvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmQ3N2MxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19pbmNvcmUuaApAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAwLTIwMDQKKyAqICAgUG9ydGlvbnMgQ29weXJpZ2h0IChDKSBDaHJpc3RvcGggSGVsbHdpZywgMjAwMS0yMDAyCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8gCisjaWZuZGVmIF9IX0pGU19JTkNPUkUKKyNkZWZpbmUgX0hfSkZTX0lOQ09SRQorCisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSAiamZzX3R5cGVzLmgiCisjaW5jbHVkZSAiamZzX3h0cmVlLmgiCisjaW5jbHVkZSAiamZzX2R0cmVlLmgiCisKKy8qCisgKiBKRlMgbWFnaWMgbnVtYmVyCisgKi8KKyNkZWZpbmUgSkZTX1NVUEVSX01BR0lDIDB4MzE1MzQ2NGEgLyogIkpGUzEiICovCisKKy8qCisgKiBKRlMtcHJpdmF0ZSBpbm9kZSBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3QgamZzX2lub2RlX2luZm8geworCWludAlmaWxlc2V0OwkvKiBmaWxlc2V0IG51bWJlciAoYWx3YXlzIDE2KSovCisJdWludAltb2RlMjsJCS8qIGpmcy1zcGVjaWZpYyBtb2RlCQkqLworCXB4ZF90ICAgaXhweGQ7CQkvKiBpbm9kZSBleHRlbnQgZGVzY3JpcHRvcgkqLworCWR4ZF90CWFjbDsJCS8qIGR4ZCBkZXNjcmliaW5nIGFjbAkqLworCWR4ZF90CWVhOwkJLyogZHhkIGRlc2NyaWJpbmcgZWEJKi8KKwl0aW1lX3QJb3RpbWU7CQkvKiB0aW1lIGNyZWF0ZWQJKi8KKwl1aW50CW5leHRfaW5kZXg7CS8qIG5leHQgYXZhaWxhYmxlIGRpcmVjdG9yeSBlbnRyeSBpbmRleCAqLworCWludAlhY2x0eXBlOwkvKiBUeXBlIG9mIEFDTAkqLworCXNob3J0CWJ0b3JkZXI7CS8qIGFjY2VzcyBvcmRlcgkqLworCXNob3J0CWJ0aW5kZXg7CS8qIGJ0cGFnZSBlbnRyeSBpbmRleCovCisJc3RydWN0IGlub2RlICppcGltYXA7CS8qIGlub2RlIG1hcAkJCSovCisJbG9uZwljZmxhZzsJCS8qIGNvbW1pdCBmbGFncwkJKi8KKwl1MTYJYnhmbGFnOwkJLyogeGZsYWcgb2YgcHNldWRvIGJ1ZmZlcj8JKi8KKwl1bmNoYXIJYWdubzsJCS8qIGFnIG51bWJlcgkJCSovCisJc2lnbmVkIGNoYXIgYWN0aXZlX2FnOwkvKiBhZyBjdXJyZW50bHkgYWxsb2NhdGluZyBmcm9tCSovCisJbGlkX3QJYmxpZDsJCS8qIGxpZCBvZiBwc2V1ZG8gYnVmZmVyPwkqLworCWxpZF90CWF0bGhlYWQ7CS8qIGFub255bW91cyB0bG9jayBsaXN0IGhlYWQJKi8KKwlsaWRfdAlhdGx0YWlsOwkvKiBhbm9ueW1vdXMgdGxvY2sgbGlzdCB0YWlsCSovCisJc3BpbmxvY2tfdCBhZ19sb2NrOwkvKiBwcm90ZWN0cyBhY3RpdmVfYWcJCSovCisJc3RydWN0IGxpc3RfaGVhZCBhbm9uX2lub2RlX2xpc3Q7IC8qIGlub2RlcyBoYXZpbmcgYW5vbnltb3VzIHR4bnMgKi8KKwkvKgorCSAqIHJkd3Jsb2NrIHNlcmlhbGl6ZXMgeHRyZWUgYmV0d2VlbiByZWFkcyAmIHdyaXRlcyBhbmQgc3luY2hyb25pemVzCisJICogY2hhbmdlcyB0byBzcGVjaWFsIGlub2Rlcy4gIEl0J3MgdXNlIHdvdWxkIGJlIHJlZHVuZGFudCBvbgorCSAqIGRpcmVjdG9yaWVzIHNpbmNlIHRoZSBpX3NlbSB0YWtlbiBpbiB0aGUgVkZTIGlzIHN1ZmZpY2llbnQuCisJICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZSByZHdybG9jazsKKwkvKgorCSAqIGNvbW1pdF9zZW0gc2VyaWFsaXplcyB0cmFuc2FjdGlvbiBwcm9jZXNzaW5nIG9uIGFuIGlub2RlLgorCSAqIEl0IG11c3QgYmUgdGFrZW4gYWZ0ZXIgYmVnaW5uaW5nIGEgdHJhbnNhY3Rpb24gKHR4QmVnaW4pLCBzaW5jZQorCSAqIGRpcnR5IGlub2RlcyBtYXkgYmUgY29tbWl0dGVkIHdoaWxlIGEgbmV3IHRyYW5zYWN0aW9uIG9uIHRoZQorCSAqIGlub2RlIGlzIGJsb2NrZWQgaW4gdHhCZWdpbiBvciBUeEJlZ2luQW5vbgorCSAqLworCXN0cnVjdCBzZW1hcGhvcmUgY29tbWl0X3NlbTsKKwkvKiB4YXR0cl9zZW0gYWxsb3dzIHVzIHRvIGFjY2VzcyB0aGUgeGF0dHJzIHdpdGhvdXQgdGFraW5nIGlfc2VtICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZSB4YXR0cl9zZW07CisJbGlkX3QJeHRsaWQ7CQkvKiBsaWQgb2YgeHRyZWUgbG9jayBvbiBkaXJlY3RvcnkgKi8KKyNpZmRlZiBDT05GSUdfSkZTX1BPU0lYX0FDTAorCXN0cnVjdCBwb3NpeF9hY2wgKmlfYWNsOworCXN0cnVjdCBwb3NpeF9hY2wgKmlfZGVmYXVsdF9hY2w7CisjZW5kaWYKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl4dHBhZ2VfdCBfeHRyb290OwkvKiAyODg6IHh0cmVlIHJvb3QgKi8KKwkJCXN0cnVjdCBpbm9tYXAgKl9pbWFwOwkvKiA0OiBpbm9kZSBtYXAgaGVhZGVyCSovCisJCX0gZmlsZTsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBkaXJfdGFibGVfc2xvdCBfdGFibGVbMTJdOyAvKiA5NjogZGlyIGluZGV4ICovCisJCQlkdHJvb3RfdCBfZHRyb290OwkvKiAyODg6IGR0cmVlIHJvb3QgKi8KKwkJfSBkaXI7CisJCXN0cnVjdCB7CisJCQl1bmNoYXIgX3VudXNlZFsxNl07CS8qIDE2OiAqLworCQkJZHhkX3QgX2R4ZDsJCS8qIDE2OiAqLworCQkJdW5jaGFyIF9pbmxpbmVbMTI4XTsJLyogMTI4OiBpbmxpbmUgc3ltbGluayAqLworCQkJLyogX2lubGluZV9lYSBtYXkgb3ZlcmxheSB0aGUgbGFzdCBwYXJ0IG9mCisJCQkgKiBmaWxlLl94dHJvb3QgaWYgbWF4ZW50cnkgPSBYVFJPT1RJTklUU0xPVAorCQkJICovCisJCQl1bmNoYXIgX2lubGluZV9lYVsxMjhdOwkvKiAxMjg6IGlubGluZSBleHRlbmRlZCBhdHRyICovCisJCX0gbGluazsKKwl9IHU7CisJdTMyIGRldjsJLyogd2lsbCBkaWUgd2hlbiB3ZSBnZXQgd2lkZSBkZXZfdCAqLworCXN0cnVjdCBpbm9kZQl2ZnNfaW5vZGU7Cit9OworI2RlZmluZSBpX3h0cm9vdCB1LmZpbGUuX3h0cm9vdAorI2RlZmluZSBpX2ltYXAgdS5maWxlLl9pbWFwCisjZGVmaW5lIGlfZGlydGFibGUgdS5kaXIuX3RhYmxlCisjZGVmaW5lIGlfZHRyb290IHUuZGlyLl9kdHJvb3QKKyNkZWZpbmUgaV9pbmxpbmUgdS5saW5rLl9pbmxpbmUKKyNkZWZpbmUgaV9pbmxpbmVfZWEgdS5saW5rLl9pbmxpbmVfZWEKKworI2RlZmluZSBKRlNfQUNMX05PVF9DQUNIRUQgKCh2b2lkICopLTEpCisKKyNkZWZpbmUgSVJFQURfTE9DSyhpcCkJCWRvd25fcmVhZCgmSkZTX0lQKGlwKS0+cmR3cmxvY2spCisjZGVmaW5lIElSRUFEX1VOTE9DSyhpcCkJdXBfcmVhZCgmSkZTX0lQKGlwKS0+cmR3cmxvY2spCisjZGVmaW5lIElXUklURV9MT0NLKGlwKQkJZG93bl93cml0ZSgmSkZTX0lQKGlwKS0+cmR3cmxvY2spCisjZGVmaW5lIElXUklURV9VTkxPQ0soaXApCXVwX3dyaXRlKCZKRlNfSVAoaXApLT5yZHdybG9jaykKKworLyoKKyAqIGNmbGFnCisgKi8KK2VudW0gY2ZsYWdzIHsKKwlDT01NSVRfTm9saW5rLAkJLyogaW5vZGUgY29tbWl0dGVkIHdpdGggemVybyBsaW5rIGNvdW50ICovCisJQ09NTUlUX0lubGluZWVhLAkvKiBjb21taXQgaW5vZGUgaW5saW5lIEVBICovCisJQ09NTUlUX0ZyZWV3bWFwLAkvKiBmcmVlIFdNQVAgYXQgaUNsb3NlKCkgKi8KKwlDT01NSVRfRGlydHksCQkvKiBJbm9kZSBpcyByZWFsbHkgZGlydHkgKi8KKwlDT01NSVRfRGlydGFibGUsCS8qIGNvbW1pdCBjaGFuZ2VzIHRvIGRpX2RpcnRhYmxlICovCisJQ09NTUlUX1N0YWxlLAkJLyogZGF0YSBleHRlbnQgaXMgbm8gbG9uZ2VyIHZhbGlkICovCisJQ09NTUlUX1N5bmNsaXN0LAkvKiBtZXRhZGF0YSBwYWdlcyBvbiBncm91cCBjb21taXQgc3luY2xpc3QgKi8KK307CisKKyNkZWZpbmUgc2V0X2NmbGFnKGZsYWcsIGlwKQlzZXRfYml0KGZsYWcsICYoSkZTX0lQKGlwKS0+Y2ZsYWcpKQorI2RlZmluZSBjbGVhcl9jZmxhZyhmbGFnLCBpcCkJY2xlYXJfYml0KGZsYWcsICYoSkZTX0lQKGlwKS0+Y2ZsYWcpKQorI2RlZmluZSB0ZXN0X2NmbGFnKGZsYWcsIGlwKQl0ZXN0X2JpdChmbGFnLCAmKEpGU19JUChpcCktPmNmbGFnKSkKKyNkZWZpbmUgdGVzdF9hbmRfY2xlYXJfY2ZsYWcoZmxhZywgaXApIFwKKwl0ZXN0X2FuZF9jbGVhcl9iaXQoZmxhZywgJihKRlNfSVAoaXApLT5jZmxhZykpCisvKgorICogSkZTLXByaXZhdGUgc3VwZXJibG9jayBpbmZvcm1hdGlvbi4KKyAqLworc3RydWN0IGpmc19zYl9pbmZvIHsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwkJLyogUG9pbnQgYmFjayB0byB2ZnMgc3VwZXIgYmxvY2sgKi8KKwl1bnNpZ25lZCBsb25nCW1udGZsYWc7CS8qIGFnZ3JlZ2F0ZSBhdHRyaWJ1dGVzCSovCisJc3RydWN0IGlub2RlCSppcGJtYXA7CS8qIGJsb2NrIG1hcCBpbm9kZQkJKi8KKwlzdHJ1Y3QgaW5vZGUJKmlwYWltYXA7CS8qIGFnZ3JlZ2F0ZSBpbm9kZSBtYXAgaW5vZGUJKi8KKwlzdHJ1Y3QgaW5vZGUJKmlwYWltYXAyOwkvKiBzZWNvbmRhcnkgYWltYXAgaW5vZGUJKi8KKwlzdHJ1Y3QgaW5vZGUJKmlwaW1hcDsJLyogYWdncmVnYXRlIGlub2RlIG1hcCBpbm9kZQkqLworCXN0cnVjdCBqZnNfbG9nCSpsb2c7CQkvKiBsb2cJCQkqLworCXN0cnVjdCBsaXN0X2hlYWQgbG9nX2xpc3Q7CS8qIHZvbHVtZXMgYXNzb2NpYXRlZCB3aXRoIGEgam91cm5hbCAqLworCXNob3J0CQlic2l6ZTsJCS8qIGxvZ2ljYWwgYmxvY2sgc2l6ZQkqLworCXNob3J0CQlsMmJzaXplOwkvKiBsb2cyIGxvZ2ljYWwgYmxvY2sgc2l6ZQkqLworCXNob3J0CQluYnBlcnBhZ2U7CS8qIGJsb2NrcyBwZXIgcGFnZQkJKi8KKwlzaG9ydAkJbDJuYnBlcnBhZ2U7CS8qIGxvZzIgYmxvY2tzIHBlciBwYWdlCSovCisJc2hvcnQJCWwybmlwZXJibGs7CS8qIGxvZzIgaW5vZGVzIHBlciBwYWdlCSovCisJZGV2X3QJCWxvZ2RldjsJCS8qIGV4dGVybmFsIGxvZyBkZXZpY2UJKi8KKwl1aW50CQlhZ2dyZWdhdGU7CS8qIHZvbHVtZSBpZGVudGlmaWVyIGluIGxvZyByZWNvcmQgKi8KKwlweGRfdAkJbG9ncHhkOwkJLyogcHhkIGRlc2NyaWJpbmcgbG9nCSovCisJcHhkX3QJCWZzY2tweGQ7CS8qIHB4ZCBkZXNjcmliaW5nIGZzY2sgd2tzcGMgKi8KKwlweGRfdAkJYWl0MjsJCS8qIHB4ZCBkZXNjcmliaW5nIEFJVCBjb3B5CSovCisJY2hhcgkJdXVpZFsxNl07CS8qIDEyOC1iaXQgdXVpZCBmb3Igdm9sdW1lCSovCisJY2hhcgkJbG9ndXVpZFsxNl07CS8qIDEyOC1iaXQgdXVpZCBmb3IgbG9nCSovCisJLyoKKwkgKiBjb21taXRfc3RhdGUgaXMgdXNlZCBmb3Igc3luY2hyb25pemF0aW9uIG9mIHRoZSBqZnNfY29tbWl0CisJICogdGhyZWFkcy4gIEl0IGlzIHByb3RlY3RlZCBieSBMQVpZX0xPQ0soKS4KKwkgKi8KKwlpbnQJCWNvbW1pdF9zdGF0ZTsJLyogY29tbWl0IHN0YXRlICovCisJLyogRm9ybWVybHkgaW4gaXBpbWFwICovCisJdWludAkJZ2VuZ2VuOwkJLyogaW5vZGUgZ2VuZXJhdGlvbiBnZW5lcmF0b3IqLworCXVpbnQJCWlub3N0YW1wOwkvKiBzaG93cyBpbm9kZSBiZWxvbmdzIHRvIGZpbGVzZXQqLworCisgICAgICAgIC8qIEZvcm1lcmx5IGluIGlwYm1hcCAqLworCXN0cnVjdCBibWFwCSpibWFwOwkJLyogaW5jb3JlIGJtYXAgZGVzY3JpcHRvcgkqLworCXN0cnVjdCBubHNfdGFibGUgKm5sc190YWI7CS8qIGN1cnJlbnQgY29kZXBhZ2UJCSovCisJdWludAkJc3RhdGU7CQkvKiBtb3VudC9yZWNvdmVyeSBzdGF0ZQkqLworCXVuc2lnbmVkIGxvbmcJZmxhZzsJCS8qIG1vdW50IHRpbWUgZmxhZ3MgKi8KKwl1aW50CQlwX3N0YXRlOwkvKiBzdGF0ZSBwcmlvciB0byBnb2luZyBubyBpbnRlZ3JpdHkgKi8KK307CisKKy8qIGpmc19zYl9pbmZvIGNvbW1pdF9zdGF0ZSAqLworI2RlZmluZSBJTl9MQVpZQ09NTUlUIDEKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgamZzX2lub2RlX2luZm8gKkpGU19JUChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBsaXN0X2VudHJ5KGlub2RlLCBzdHJ1Y3QgamZzX2lub2RlX2luZm8sIHZmc19pbm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGpmc19kaXJ0YWJsZV9pbmxpbmUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gKEpGU19JUChpbm9kZSktPm5leHRfaW5kZXggPD0gKE1BWF9JTkxJTkVfRElSVEFCTEVfRU5UUlkgKyAxKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGpmc19zYl9pbmZvICpKRlNfU0JJKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIHNiLT5zX2ZzX2luZm87Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzUmVhZE9ubHkoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoSkZTX1NCSShpbm9kZS0+aV9zYiktPmxvZykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogX0hfSkZTX0lOQ09SRSAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19pbm9kZS5jIGIvZnMvamZzL2pmc19pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZjI0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX2lub2RlLmMKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDA0CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlICJqZnNfaW5jb3JlLmgiCisjaW5jbHVkZSAiamZzX2ZpbHN5cy5oIgorI2luY2x1ZGUgImpmc19pbWFwLmgiCisjaW5jbHVkZSAiamZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgImpmc19kZWJ1Zy5oIgorCisvKgorICogTkFNRToJaWFsbG9jKCkKKyAqCisgKiBGVU5DVElPTjoJQWxsb2NhdGUgYSBuZXcgaW5vZGUKKyAqCisgKi8KK3N0cnVjdCBpbm9kZSAqaWFsbG9jKHN0cnVjdCBpbm9kZSAqcGFyZW50LCB1bW9kZV90IG1vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHBhcmVudC0+aV9zYjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamZzX2lub2RlOworCWludCByYzsKKworCWlub2RlID0gbmV3X2lub2RlKHNiKTsKKwlpZiAoIWlub2RlKSB7CisJCWpmc193YXJuKCJpYWxsb2M6IG5ld19pbm9kZSByZXR1cm5lZCBOVUxMISIpOworCQlyZXR1cm4gaW5vZGU7CisJfQorCisJamZzX2lub2RlID0gSkZTX0lQKGlub2RlKTsKKworCXJjID0gZGlBbGxvYyhwYXJlbnQsIFNfSVNESVIobW9kZSksIGlub2RlKTsKKwlpZiAocmMpIHsKKwkJamZzX3dhcm4oImlhbGxvYzogZGlBbGxvYyByZXR1cm5lZCAlZCEiLCByYyk7CisJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlub2RlLT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCWlmIChwYXJlbnQtPmlfbW9kZSAmIFNfSVNHSUQpIHsKKwkJaW5vZGUtPmlfZ2lkID0gcGFyZW50LT5pX2dpZDsKKwkJaWYgKFNfSVNESVIobW9kZSkpCisJCQltb2RlIHw9IFNfSVNHSUQ7CisJfSBlbHNlCisJCWlub2RlLT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCisJLyoKKwkgKiBBbGxvY2F0ZSBpbm9kZSB0byBxdW90YS4KKwkgKi8KKwlpZiAoRFFVT1RfQUxMT0NfSU5PREUoaW5vZGUpKSB7CisJCURRVU9UX0RST1AoaW5vZGUpOworCQlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7CisJCWlub2RlLT5pX25saW5rID0gMDsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlub2RlLT5pX21vZGUgPSBtb2RlOworCWlmIChTX0lTRElSKG1vZGUpKQorCQlqZnNfaW5vZGUtPm1vZGUyID0gSURJUkVDVE9SWSB8IG1vZGU7CisJZWxzZQorCQlqZnNfaW5vZGUtPm1vZGUyID0gSU5MSU5FRUEgfCBJU1BBUlNFIHwgbW9kZTsKKwlpbm9kZS0+aV9ibGtzaXplID0gc2ItPnNfYmxvY2tzaXplOworCWlub2RlLT5pX2Jsb2NrcyA9IDA7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCWpmc19pbm9kZS0+b3RpbWUgPSBpbm9kZS0+aV9jdGltZS50dl9zZWM7CisJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IEpGU19TQkkoc2IpLT5nZW5nZW4rKzsKKworCWpmc19pbm9kZS0+Y2ZsYWcgPSAwOworCisJLyogWmVybyByZW1haW5pbmcgZmllbGRzICovCisJbWVtc2V0KCZqZnNfaW5vZGUtPmFjbCwgMCwgc2l6ZW9mKGR4ZF90KSk7CisJbWVtc2V0KCZqZnNfaW5vZGUtPmVhLCAwLCBzaXplb2YoZHhkX3QpKTsKKwlqZnNfaW5vZGUtPm5leHRfaW5kZXggPSAwOworCWpmc19pbm9kZS0+YWNsdHlwZSA9IDA7CisJamZzX2lub2RlLT5idG9yZGVyID0gMDsKKwlqZnNfaW5vZGUtPmJ0aW5kZXggPSAwOworCWpmc19pbm9kZS0+YnhmbGFnID0gMDsKKwlqZnNfaW5vZGUtPmJsaWQgPSAwOworCWpmc19pbm9kZS0+YXRsaGVhZCA9IDA7CisJamZzX2lub2RlLT5hdGx0YWlsID0gMDsKKwlqZnNfaW5vZGUtPnh0bGlkID0gMDsKKworCWpmc19pbmZvKCJpYWxsb2MgcmV0dXJucyBpbm9kZSA9IDB4JXBcbiIsIGlub2RlKTsKKworCXJldHVybiBpbm9kZTsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfaW5vZGUuaCBiL2ZzL2pmcy9qZnNfaW5vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGY5MWZiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19pbm9kZS5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDAxCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYJX0hfSkZTX0lOT0RFCisjZGVmaW5lIF9IX0pGU19JTk9ERQorCitleHRlcm4gc3RydWN0IGlub2RlICppYWxsb2Moc3RydWN0IGlub2RlICosIHVtb2RlX3QpOworCisjZW5kaWYJCQkJLyogX0hfSkZTX0lOT0RFICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2xvY2suaCBiL2ZzL2pmcy9qZnNfbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYWQxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX2xvY2suaApAQCAtMCwwICsxLDUxIEBACisvKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwMQorICogICBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIENocmlzdG9waCBIZWxsd2lnLCAyMDAxLTIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfSF9KRlNfTE9DSworI2RlZmluZSBfSF9KRlNfTE9DSworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisvKgorICoJamZzX2xvY2suaAorICovCisKKy8qCisgKiBDb25kaXRpb25hbCBzbGVlcCB3aGVyZSBjb25kaXRpb24gaXMgcHJvdGVjdGVkIGJ5IHNwaW5sb2NrCisgKgorICogbG9ja19jbWQgYW5kIHVubG9ja19jbWQgdGFrZSBhbmQgcmVsZWFzZSB0aGUgc3BpbmxvY2sKKyAqLworI2RlZmluZSBfX1NMRUVQX0NPTkQod3EsIGNvbmQsIGxvY2tfY21kLCB1bmxvY2tfY21kKQlcCitkbyB7CQkJCQkJCVwKKwlERUNMQVJFX1dBSVRRVUVVRShfX3dhaXQsIGN1cnJlbnQpOwkJXAorCQkJCQkJCVwKKwlhZGRfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOwkJCVwKKwlmb3IgKDs7KSB7CQkJCQlcCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTtcCisJCWlmIChjb25kKQkJCQlcCisJCQlicmVhazsJCQkJXAorCQl1bmxvY2tfY21kOwkJCQlcCisJCXNjaGVkdWxlKCk7CQkJCVwKKwkJbG9ja19jbWQ7CQkJCVwKKwl9CQkJCQkJXAorCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwkJCVwKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOwkJXAorfSB3aGlsZSAoMCkKKworI2VuZGlmCQkJCS8qIF9IX0pGU19MT0NLICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2xvZ21nci5jIGIvZnMvamZzL2pmc19sb2dtZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmE2ODY5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19sb2dtZ3IuYwpAQCAtMCwwICsxLDI1MjQgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDA0CisgKiAgIFBvcnRpb25zIENvcHlyaWdodCAoQykgQ2hyaXN0b3BoIEhlbGx3aWcsIDIwMDEtMjAwMgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKglqZnNfbG9nbWdyLmM6IGxvZyBtYW5hZ2VyCisgKgorICogZm9yIHJlbGF0ZWQgaW5mb3JtYXRpb24sIHNlZSB0cmFuc2FjdGlvbiBtYW5hZ2VyIChqZnNfdHhubWdyLmMpLCBhbmQKKyAqIHJlY292ZXJ5IG1hbmFnZXIgKGpmc19sb2dyZWRvLmMpLgorICoKKyAqIG5vdGU6IGZvciBkZXRhaWwsIFJURlMuCisgKgorICoJbG9nIGJ1ZmZlciBtYW5hZ2VyOgorICogc3BlY2lhbCBwdXJwb3NlIGJ1ZmZlciBtYW5hZ2VyIHN1cHBvcnRpbmcgbG9nIGkvbyByZXF1aXJlbWVudHMuCisgKiBwZXIgbG9nIHNlcmlhbCBwYWdlb3V0IG9mIGxvZ3BhZ2UKKyAqIHF1ZXVpbmcgaS9vIHJlcXVlc3RzIGFuZCByZWRyaXZlIGkvbyBhdCBpb2RvbmUKKyAqIG1haW50YWluIGN1cnJlbnQgbG9ncGFnZSBidWZmZXIKKyAqIG5vIGNhY2hpbmcgc2luY2UgYXBwZW5kIG9ubHkKKyAqIGFwcHJvcHJpYXRlIGpmcyBidWZmZXIgY2FjaGUgYnVmZmVycyBhcyBuZWVkZWQKKyAqCisgKglncm91cCBjb21taXQ6CisgKiB0cmFuc2FjdGlvbnMgd2hpY2ggd3JvdGUgQ09NTUlUIHJlY29yZHMgaW4gdGhlIHNhbWUgaW4tbWVtb3J5CisgKiBsb2cgcGFnZSBkdXJpbmcgdGhlIHBhZ2VvdXQgb2YgcHJldmlvdXMvY3VycmVudCBsb2cgcGFnZShzKSBhcmUKKyAqIGNvbW1pdHRlZCB0b2dldGhlciBieSB0aGUgcGFnZW91dCBvZiB0aGUgcGFnZS4KKyAqCisgKglUQkQgbGF6eSBjb21taXQ6CisgKiB0cmFuc2FjdGlvbnMgYXJlIGNvbW1pdHRlZCBhc3luY2hyb25vdXNseSB3aGVuIHRoZSBsb2cgcGFnZQorICogY29udGFpbmluZyBpdCBDT01NSVQgaXMgcGFnZWQgb3V0IHdoZW4gaXQgYmVjb21lcyBmdWxsOworICoKKyAqCXNlcmlhbGl6YXRpb246CisgKiAuIGEgcGVyIGxvZyBsb2NrIHNlcmlhbGl6ZSBsb2cgd3JpdGUuCisgKiAuIGEgcGVyIGxvZyBsb2NrIHNlcmlhbGl6ZSBncm91cCBjb21taXQuCisgKiAuIGEgcGVyIGxvZyBsb2NrIHNlcmlhbGl6ZSBsb2cgb3Blbi9jbG9zZTsKKyAqCisgKglUQkQgbG9nIGludGVncml0eToKKyAqIGNhcmVmdWwtd3JpdGUgKHBpbmctcG9uZykgb2YgbGFzdCBsb2dwYWdlIHRvIHJlY292ZXIgZnJvbSBjcmFzaAorICogaW4gb3ZlcndyaXRlLgorICogZGV0ZWN0aW9uIG9mIHNwbGl0IChvdXQtb2Ytb3JkZXIpIHdyaXRlIG9mIHBoeXNpY2FsIHNlY3RvcnMKKyAqIG9mIGxhc3QgbG9ncGFnZSB2aWEgdGltZXN0YW1wIGF0IGVuZCBvZiBlYWNoIHNlY3RvcgorICogd2l0aCBpdHMgbWlycm9yIGRhdGEgYXJyYXkgYXQgdHJhaWxlcikuCisgKgorICoJYWx0ZXJuYXRpdmVzOgorICogbHNuIC0gNjQtYml0IG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBpbnRlZ2VyIHZzCisgKiAzMi1iaXQgbHNwbiBhbmQgcGFnZSBlb3IuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4JCS8qIGZvciBzeW5jX2Jsb2NrZGV2KCkgKi8KKyNpbmNsdWRlIDxsaW51eC9iaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJqZnNfaW5jb3JlLmgiCisjaW5jbHVkZSAiamZzX2ZpbHN5cy5oIgorI2luY2x1ZGUgImpmc19tZXRhcGFnZS5oIgorI2luY2x1ZGUgImpmc190eG5tZ3IuaCIKKyNpbmNsdWRlICJqZnNfZGVidWcuaCIKKworCisvKgorICogbGJ1ZidzIHJlYWR5IHRvIGJlIHJlZHJpdmVuLiAgUHJvdGVjdGVkIGJ5IGxvZ19yZWRyaXZlX2xvY2sgKGpmc0lPIHRocmVhZCkKKyAqLworc3RhdGljIHN0cnVjdCBsYnVmICpsb2dfcmVkcml2ZV9saXN0Oworc3RhdGljIERFRklORV9TUElOTE9DSyhsb2dfcmVkcml2ZV9sb2NrKTsKK0RFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGpmc19JT190aHJlYWRfd2FpdCk7CisKKworLyoKKyAqCWxvZyByZWFkL3dyaXRlIHNlcmlhbGl6YXRpb24gKHBlciBsb2cpCisgKi8KKyNkZWZpbmUgTE9HX0xPQ0tfSU5JVChsb2cpCWluaXRfTVVURVgoJihsb2cpLT5sb2dsb2NrKQorI2RlZmluZSBMT0dfTE9DSyhsb2cpCQlkb3duKCYoKGxvZyktPmxvZ2xvY2spKQorI2RlZmluZSBMT0dfVU5MT0NLKGxvZykJCXVwKCYoKGxvZyktPmxvZ2xvY2spKQorCisKKy8qCisgKglsb2cgZ3JvdXAgY29tbWl0IHNlcmlhbGl6YXRpb24gKHBlciBsb2cpCisgKi8KKworI2RlZmluZSBMT0dHQ19MT0NLX0lOSVQobG9nKQlzcGluX2xvY2tfaW5pdCgmKGxvZyktPmdjbG9jaykKKyNkZWZpbmUgTE9HR0NfTE9DSyhsb2cpCQlzcGluX2xvY2tfaXJxKCYobG9nKS0+Z2Nsb2NrKQorI2RlZmluZSBMT0dHQ19VTkxPQ0sobG9nKQlzcGluX3VubG9ja19pcnEoJihsb2cpLT5nY2xvY2spCisjZGVmaW5lIExPR0dDX1dBS0VVUCh0YmxrKQl3YWtlX3VwX2FsbCgmKHRibGspLT5nY3dhaXQpCisKKy8qCisgKglsb2cgc3luYyBzZXJpYWxpemF0aW9uIChwZXIgbG9nKQorICovCisjZGVmaW5lCUxPR1NZTkNfREVMVEEobG9nc2l6ZSkJCW1pbigobG9nc2l6ZSkvOCwgMTI4KkxPR1BTSVpFKQorI2RlZmluZQlMT0dTWU5DX0JBUlJJRVIobG9nc2l6ZSkJKChsb2dzaXplKS80KQorLyoKKyNkZWZpbmUJTE9HU1lOQ19ERUxUQShsb2dzaXplKQkJbWluKChsb2dzaXplKS80LCAyNTYqTE9HUFNJWkUpCisjZGVmaW5lCUxPR1NZTkNfQkFSUklFUihsb2dzaXplKQkoKGxvZ3NpemUpLzIpCisqLworCisKKy8qCisgKglsb2cgYnVmZmVyIGNhY2hlIHN5bmNocm9uaXphdGlvbgorICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGpmc0xDYWNoZUxvY2spOworCisjZGVmaW5lCUxDQUNIRV9MT0NLKGZsYWdzKQlzcGluX2xvY2tfaXJxc2F2ZSgmamZzTENhY2hlTG9jaywgZmxhZ3MpCisjZGVmaW5lCUxDQUNIRV9VTkxPQ0soZmxhZ3MpCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmpmc0xDYWNoZUxvY2ssIGZsYWdzKQorCisvKgorICogU2VlIF9fU0xFRVBfQ09ORCBpbiBqZnNfbG9ja3MuaAorICovCisjZGVmaW5lIExDQUNIRV9TTEVFUF9DT05EKHdxLCBjb25kLCBmbGFncykJXAorZG8gewkJCQkJCVwKKwlpZiAoY29uZCkJCQkJXAorCQlicmVhazsJCQkJXAorCV9fU0xFRVBfQ09ORCh3cSwgY29uZCwgTENBQ0hFX0xPQ0soZmxhZ3MpLCBMQ0FDSEVfVU5MT0NLKGZsYWdzKSk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJTENBQ0hFX1dBS0VVUChldmVudCkJd2FrZV91cChldmVudCkKKworCisvKgorICoJbGJ1ZiBidWZmZXIgY2FjaGUgKGxDYWNoZSkgY29udHJvbAorICovCisvKiBsb2cgYnVmZmVyIG1hbmFnZXIgcGFnZW91dCBjb250cm9sIChjdW11bGF0aXZlLCBpbmNsdXNpdmUpICovCisjZGVmaW5lCWxibVJFQUQJCTB4MDAwMQorI2RlZmluZQlsYm1XUklURQkweDAwMDIJLyogZW5xdWV1ZSBhdCB0YWlsIG9mIHdyaXRlIHF1ZXVlOworCQkJCSAqIGluaXQgcGFnZW91dCBpZiBhdCBoZWFkIG9mIHF1ZXVlOworCQkJCSAqLworI2RlZmluZQlsYm1SRUxFQVNFCTB4MDAwNAkvKiByZW1vdmUgZnJvbSB3cml0ZSBxdWV1ZQorCQkJCSAqIGF0IGNvbXBsZXRpb24gb2YgcGFnZW91dDsKKwkJCQkgKiBkbyBub3QgZnJlZS9yZWN5Y2xlIGl0IHlldDoKKwkJCQkgKiBjYWxsZXIgd2lsbCBmcmVlIGl0OworCQkJCSAqLworI2RlZmluZQlsYm1TWU5DCQkweDAwMDgJLyogZG8gbm90IHJldHVybiB0byBmcmVlbGlzdAorCQkJCSAqIHdoZW4gcmVtb3ZlZCBmcm9tIHdyaXRlIHF1ZXVlOworCQkJCSAqLworI2RlZmluZSBsYm1GUkVFCQkweDAwMTAJLyogcmV0dXJuIHRvIGZyZWVsaXN0CisJCQkJICogYXQgY29tcGxldGlvbiBvZiBwYWdlb3V0OworCQkJCSAqIHRoZSBidWZmZXIgbWF5IGJlIHJlY3ljbGVkOworCQkJCSAqLworI2RlZmluZQlsYm1ET05FCQkweDAwMjAKKyNkZWZpbmUJbGJtRVJST1IJMHgwMDQwCisjZGVmaW5lIGxibUdDCQkweDAwODAJLyogbGJtSU9Eb25lIHRvIHBlcmZvcm0gcG9zdC1HQyBwcm9jZXNzaW5nCisJCQkJICogb2YgbG9nIHBhZ2UKKwkJCQkgKi8KKyNkZWZpbmUgbGJtRElSRUNUCTB4MDEwMAorCisvKgorICogR2xvYmFsIGxpc3Qgb2YgYWN0aXZlIGV4dGVybmFsIGpvdXJuYWxzCisgKi8KK3N0YXRpYyBMSVNUX0hFQUQoamZzX2V4dGVybmFsX2xvZ3MpOworc3RhdGljIHN0cnVjdCBqZnNfbG9nICpkdW1teV9sb2cgPSBOVUxMOworc3RhdGljIERFQ0xBUkVfTVVURVgoamZzX2xvZ19zZW0pOworCisvKgorICogZXh0ZXJuYWwgcmVmZXJlbmNlcworICovCitleHRlcm4gdm9pZCB0eExhenlVbmxvY2soc3RydWN0IHRibG9jayAqIHRibGspOworZXh0ZXJuIGludCBqZnNfc3RvcF90aHJlYWRzOworZXh0ZXJuIHN0cnVjdCBjb21wbGV0aW9uIGpmc0lPd2FpdDsKK2V4dGVybiBpbnQgamZzX3Rsb2Nrc19sb3c7CisKKy8qCisgKiBmb3J3YXJkIHJlZmVyZW5jZXMKKyAqLworc3RhdGljIGludCBsbVdyaXRlUmVjb3JkKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgdGJsb2NrICogdGJsaywKKwkJCSBzdHJ1Y3QgbHJkICogbHJkLCBzdHJ1Y3QgdGxvY2sgKiB0bGNrKTsKKworc3RhdGljIGludCBsbU5leHRQYWdlKHN0cnVjdCBqZnNfbG9nICogbG9nKTsKK3N0YXRpYyBpbnQgbG1Mb2dGaWxlU3lzdGVtKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSwKKwkJCSAgIGludCBhY3RpdmF0ZSk7CisKK3N0YXRpYyBpbnQgb3Blbl9pbmxpbmVfbG9nKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworc3RhdGljIGludCBvcGVuX2R1bW15X2xvZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK3N0YXRpYyBpbnQgbGJtTG9nSW5pdChzdHJ1Y3QgamZzX2xvZyAqIGxvZyk7CitzdGF0aWMgdm9pZCBsYm1Mb2dTaHV0ZG93bihzdHJ1Y3QgamZzX2xvZyAqIGxvZyk7CitzdGF0aWMgc3RydWN0IGxidWYgKmxibUFsbG9jYXRlKHN0cnVjdCBqZnNfbG9nICogbG9nLCBpbnQpOworc3RhdGljIHZvaWQgbGJtRnJlZShzdHJ1Y3QgbGJ1ZiAqIGJwKTsKK3N0YXRpYyB2b2lkIGxibWZyZWUoc3RydWN0IGxidWYgKiBicCk7CitzdGF0aWMgaW50IGxibVJlYWQoc3RydWN0IGpmc19sb2cgKiBsb2csIGludCBwbiwgc3RydWN0IGxidWYgKiogYnBwKTsKK3N0YXRpYyB2b2lkIGxibVdyaXRlKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgbGJ1ZiAqIGJwLCBpbnQgZmxhZywgaW50IGNhbnRfYmxvY2spOworc3RhdGljIHZvaWQgbGJtRGlyZWN0V3JpdGUoc3RydWN0IGpmc19sb2cgKiBsb2csIHN0cnVjdCBsYnVmICogYnAsIGludCBmbGFnKTsKK3N0YXRpYyBpbnQgbGJtSU9XYWl0KHN0cnVjdCBsYnVmICogYnAsIGludCBmbGFnKTsKK3N0YXRpYyBiaW9fZW5kX2lvX3QgbGJtSU9Eb25lOworc3RhdGljIHZvaWQgbGJtU3RhcnRJTyhzdHJ1Y3QgbGJ1ZiAqIGJwKTsKK3N0YXRpYyB2b2lkIGxtR0N3cml0ZShzdHJ1Y3QgamZzX2xvZyAqIGxvZywgaW50IGNhbnRfYmxvY2spOworc3RhdGljIGludCBsbUxvZ1N5bmMoc3RydWN0IGpmc19sb2cgKiBsb2csIGludCBub3N5bmN3YWl0KTsKKworCisKKy8qCisgKglzdGF0aXN0aWNzCisgKi8KKyNpZmRlZiBDT05GSUdfSkZTX1NUQVRJU1RJQ1MKK3N0YXRpYyBzdHJ1Y3QgbG1TdGF0IHsKKwl1aW50IGNvbW1pdDsJCS8qICMgb2YgY29tbWl0ICovCisJdWludCBwYWdlZG9uZTsJCS8qICMgb2YgcGFnZSB3cml0dGVuICovCisJdWludCBzdWJtaXR0ZWQ7CQkvKiAjIG9mIHBhZ2VzIHN1Ym1pdHRlZCAqLworCXVpbnQgZnVsbF9wYWdlOwkJLyogIyBvZiBmdWxsIHBhZ2VzIHN1Ym1pdHRlZCAqLworCXVpbnQgcGFydGlhbF9wYWdlOwkvKiAjIG9mIHBhcnRpYWwgcGFnZXMgc3VibWl0dGVkICovCit9IGxtU3RhdDsKKyNlbmRpZgorCisKKy8qCisgKiBOQU1FOglsbUxvZygpCisgKgorICogRlVOQ1RJT046CXdyaXRlIGEgbG9nIHJlY29yZDsKKyAqCisgKiBQQVJBTUVURVI6CisgKgorICogUkVUVVJOOglsc24gLSBvZmZzZXQgdG8gdGhlIG5leHQgbG9nIHJlY29yZCB0byB3cml0ZSAoZW5kLW9mLWxvZyk7CisgKgkJLTEgIC0gZXJyb3I7CisgKgorICogbm90ZTogdG9kbzogbG9nIGVycm9yIGhhbmRsZXIKKyAqLworaW50IGxtTG9nKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgdGJsb2NrICogdGJsaywgc3RydWN0IGxyZCAqIGxyZCwKKwkgIHN0cnVjdCB0bG9jayAqIHRsY2spCit7CisJaW50IGxzbjsKKwlpbnQgZGlmZnAsIGRpZmZ0OworCXN0cnVjdCBtZXRhcGFnZSAqbXAgPSBOVUxMOworCisJamZzX2luZm8oImxtTG9nOiBsb2c6MHglcCB0YmxrOjB4JXAsIGxyZDoweCVwIHRsY2s6MHglcCIsCisJCSBsb2csIHRibGssIGxyZCwgdGxjayk7CisKKwlMT0dfTE9DSyhsb2cpOworCisJLyogbG9nIGJ5IChvdXQtb2YtdHJhbnNhY3Rpb24pIEpGUyA/ICovCisJaWYgKHRibGsgPT0gTlVMTCkKKwkJZ290byB3cml0ZVJlY29yZDsKKworCS8qIGxvZyBmcm9tIHBhZ2UgPyAqLworCWlmICh0bGNrID09IE5VTEwgfHwKKwkgICAgdGxjay0+dHlwZSAmIHRsY2tCVFJPT1QgfHwgKG1wID0gdGxjay0+bXApID09IE5VTEwpCisJCWdvdG8gd3JpdGVSZWNvcmQ7CisKKwkvKgorCSAqICAgICAgaW5pdGlhbGl6ZS91cGRhdGUgcGFnZS90cmFuc2FjdGlvbiByZWNvdmVyeSBsc24KKwkgKi8KKwlsc24gPSBsb2ctPmxzbjsKKworCUxPR1NZTkNfTE9DSyhsb2cpOworCisJLyoKKwkgKiBpbml0aWFsaXplIHBhZ2UgbHNuIGlmIGZpcnN0IGxvZyB3cml0ZSBvZiB0aGUgcGFnZQorCSAqLworCWlmIChtcC0+bHNuID09IDApIHsKKwkJbXAtPmxvZyA9IGxvZzsKKwkJbXAtPmxzbiA9IGxzbjsKKwkJbG9nLT5jb3VudCsrOworCisJCS8qIGluc2VydCBwYWdlIGF0IHRhaWwgb2YgbG9nc3luY2xpc3QgKi8KKwkJbGlzdF9hZGRfdGFpbCgmbXAtPnN5bmNsaXN0LCAmbG9nLT5zeW5jbGlzdCk7CisJfQorCisJLyoKKwkgKiAgICAgIGluaXRpYWxpemUvdXBkYXRlIGxzbiBvZiB0YmxvY2sgb2YgdGhlIHBhZ2UKKwkgKgorCSAqIHRyYW5zYWN0aW9uIGluaGVyaXRzIG9sZGVzdCBsc24gb2YgcGFnZXMgYXNzb2NpYXRlZAorCSAqIHdpdGggYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gb2YgcmVzb3VyY2VzICh0aGVpcgorCSAqIGxvZyByZWNvcmRzIGFyZSB1c2VkIHRvIHJlY29uc3RydWN0IGFsbG9jYXRpb24gbWFwCisJICogYXQgcmVjb3ZlcnkgdGltZTogaW5vZGUgZm9yIGlub2RlIGFsbG9jYXRpb24gbWFwLAorCSAqIEIrLXRyZWUgaW5kZXggb2YgZXh0ZW50IGRlc2NyaXB0b3JzIGZvciBibG9jaworCSAqIGFsbG9jYXRpb24gbWFwKTsKKwkgKiBhbGxvY2F0aW9uIG1hcCBwYWdlcyBpbmhlcml0IHRyYW5zYWN0aW9uIGxzbiBhdAorCSAqIGNvbW1pdCB0aW1lIHRvIGFsbG93IGZvcndhcmRpbmcgbG9nIHN5bmNwdCBwYXN0IGxvZworCSAqIHJlY29yZHMgYXNzb2NpYXRlZCB3aXRoIGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uIG9mCisJICogcmVzb3VyY2VzIG9ubHkgYWZ0ZXIgcGVyc2lzdGVudCBtYXAgb2YgdGhlc2UgbWFwIHBhZ2VzCisJICogaGF2ZSBiZWVuIHVwZGF0ZWQgYW5kIHByb3BhZ2F0ZWQgdG8gaG9tZS4KKwkgKi8KKwkvKgorCSAqIGluaXRpYWxpemUgdHJhbnNhY3Rpb24gbHNuOgorCSAqLworCWlmICh0YmxrLT5sc24gPT0gMCkgeworCQkvKiBpbmhlcml0IGxzbiBvZiBpdHMgZmlyc3QgcGFnZSBsb2dnZWQgKi8KKwkJdGJsay0+bHNuID0gbXAtPmxzbjsKKwkJbG9nLT5jb3VudCsrOworCisJCS8qIGluc2VydCB0YmxvY2sgYWZ0ZXIgdGhlIHBhZ2Ugb24gbG9nc3luY2xpc3QgKi8KKwkJbGlzdF9hZGQoJnRibGstPnN5bmNsaXN0LCAmbXAtPnN5bmNsaXN0KTsKKwl9CisJLyoKKwkgKiB1cGRhdGUgdHJhbnNhY3Rpb24gbHNuOgorCSAqLworCWVsc2UgeworCQkvKiBpbmhlcml0IG9sZGVzdC9zbWFsbGVzdCBsc24gb2YgcGFnZSAqLworCQlsb2dkaWZmKGRpZmZwLCBtcC0+bHNuLCBsb2cpOworCQlsb2dkaWZmKGRpZmZ0LCB0YmxrLT5sc24sIGxvZyk7CisJCWlmIChkaWZmcCA8IGRpZmZ0KSB7CisJCQkvKiB1cGRhdGUgdGJsb2NrIGxzbiB3aXRoIHBhZ2UgbHNuICovCisJCQl0YmxrLT5sc24gPSBtcC0+bHNuOworCisJCQkvKiBtb3ZlIHRibG9jayBhZnRlciBwYWdlIG9uIGxvZ3N5bmNsaXN0ICovCisJCQlsaXN0X21vdmUoJnRibGstPnN5bmNsaXN0LCAmbXAtPnN5bmNsaXN0KTsKKwkJfQorCX0KKworCUxPR1NZTkNfVU5MT0NLKGxvZyk7CisKKwkvKgorCSAqICAgICAgd3JpdGUgdGhlIGxvZyByZWNvcmQKKwkgKi8KKyAgICAgIHdyaXRlUmVjb3JkOgorCWxzbiA9IGxtV3JpdGVSZWNvcmQobG9nLCB0YmxrLCBscmQsIHRsY2spOworCisJLyoKKwkgKiBmb3J3YXJkIGxvZyBzeW5jcHQgaWYgbG9nIHJlYWNoZWQgbmV4dCBzeW5jcHQgdHJpZ2dlcgorCSAqLworCWxvZ2RpZmYoZGlmZnAsIGxzbiwgbG9nKTsKKwlpZiAoZGlmZnAgPj0gbG9nLT5uZXh0c3luYykKKwkJbHNuID0gbG1Mb2dTeW5jKGxvZywgMCk7CisKKwkvKiB1cGRhdGUgZW5kLW9mLWxvZyBsc24gKi8KKwlsb2ctPmxzbiA9IGxzbjsKKworCUxPR19VTkxPQ0sobG9nKTsKKworCS8qIHJldHVybiBlbmQtb2YtbG9nIGFkZHJlc3MgKi8KKwlyZXR1cm4gbHNuOworfQorCisKKy8qCisgKiBOQU1FOglsbVdyaXRlUmVjb3JkKCkKKyAqCisgKiBGVU5DVElPTjoJbW92ZSB0aGUgbG9nIHJlY29yZCB0byBjdXJyZW50IGxvZyBwYWdlCisgKgorICogUEFSQU1FVEVSOgljZAktIGNvbW1pdCBkZXNjcmlwdG9yCisgKgorICogUkVUVVJOOgllbmQtb2YtbG9nIGFkZHJlc3MKKyAqCQkJCisgKiBzZXJpYWxpemF0aW9uOiBMT0dfTE9DSygpIGhlbGQgb24gZW50cnkvZXhpdAorICovCitzdGF0aWMgaW50CitsbVdyaXRlUmVjb3JkKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgdGJsb2NrICogdGJsaywgc3RydWN0IGxyZCAqIGxyZCwKKwkgICAgICBzdHJ1Y3QgdGxvY2sgKiB0bGNrKQoreworCWludCBsc24gPSAwOwkJLyogZW5kLW9mLWxvZyBhZGRyZXNzICovCisJc3RydWN0IGxidWYgKmJwOwkvKiBkc3QgbG9nIHBhZ2UgYnVmZmVyICovCisJc3RydWN0IGxvZ3BhZ2UgKmxwOwkvKiBkc3QgbG9nIHBhZ2UgKi8KKwljYWRkcl90IGRzdDsJCS8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgaW4gbG9nIHBhZ2UgKi8KKwlpbnQgZHN0b2Zmc2V0OwkJLyogZW5kLW9mLWxvZyBvZmZzZXQgaW4gbG9nIHBhZ2UgKi8KKwlpbnQgZnJlZXNwYWNlOwkJLyogZnJlZSBzcGFjZSBpbiBsb2cgcGFnZSAqLworCWNhZGRyX3QgcDsJCS8qIHNyYyBtZXRhLWRhdGEgcGFnZSAqLworCWNhZGRyX3Qgc3JjOworCWludCBzcmNsZW47CisJaW50IG5ieXRlczsJCS8qIG51bWJlciBvZiBieXRlcyB0byBtb3ZlICovCisJaW50IGk7CisJaW50IGxlbjsKKwlzdHJ1Y3QgbGluZWxvY2sgKmxpbmVsb2NrOworCXN0cnVjdCBsdiAqbHY7CisJc3RydWN0IGx2ZCAqbHZkOworCWludCBsMmxpbmVzaXplOworCisJbGVuID0gMDsKKworCS8qIHJldHJpZXZlIGRlc3RpbmF0aW9uIGxvZyBwYWdlIHRvIHdyaXRlICovCisJYnAgPSAoc3RydWN0IGxidWYgKikgbG9nLT5icDsKKwlscCA9IChzdHJ1Y3QgbG9ncGFnZSAqKSBicC0+bF9sZGF0YTsKKwlkc3RvZmZzZXQgPSBsb2ctPmVvcjsKKworCS8qIGFueSBsb2cgZGF0YSB0byB3cml0ZSA/ICovCisJaWYgKHRsY2sgPT0gTlVMTCkKKwkJZ290byBtb3ZlTHJkOworCisJLyoKKwkgKiAgICAgIG1vdmUgbG9nIHJlY29yZCBkYXRhCisJICovCisJLyogcmV0cmlldmUgc291cmNlIG1ldGEtZGF0YSBwYWdlIHRvIGxvZyAqLworCWlmICh0bGNrLT5mbGFnICYgdGxja1BBR0VMT0NLKSB7CisJCXAgPSAoY2FkZHJfdCkgKHRsY2stPm1wLT5kYXRhKTsKKwkJbGluZWxvY2sgPSAoc3RydWN0IGxpbmVsb2NrICopICYgdGxjay0+bG9jazsKKwl9CisJLyogcmV0cmlldmUgc291cmNlIGluLW1lbW9yeSBpbm9kZSB0byBsb2cgKi8KKwllbHNlIGlmICh0bGNrLT5mbGFnICYgdGxja0lOT0RFTE9DSykgeworCQlpZiAodGxjay0+dHlwZSAmIHRsY2tEVFJFRSkKKwkJCXAgPSAoY2FkZHJfdCkgJkpGU19JUCh0bGNrLT5pcCktPmlfZHRyb290OworCQllbHNlCisJCQlwID0gKGNhZGRyX3QpICZKRlNfSVAodGxjay0+aXApLT5pX3h0cm9vdDsKKwkJbGluZWxvY2sgPSAoc3RydWN0IGxpbmVsb2NrICopICYgdGxjay0+bG9jazsKKwl9CisjaWZkZWYJX0pGU19XSVAKKwllbHNlIGlmICh0bGNrLT5mbGFnICYgdGxja0lOTElORUxPQ0spIHsKKworCQlpbmxpbmVsb2NrID0gKHN0cnVjdCBpbmxpbmVsb2NrICopICYgdGxjazsKKwkJcCA9IChjYWRkcl90KSAmIGlubGluZWxvY2stPnB4ZDsKKwkJbGluZWxvY2sgPSAoc3RydWN0IGxpbmVsb2NrICopICYgdGxjazsKKwl9CisjZW5kaWYJCQkJLyogX0pGU19XSVAgKi8KKwllbHNlIHsKKwkJamZzX2VycigibG1Xcml0ZVJlY29yZDogVUZPIHRsY2s6MHglcCIsIHRsY2spOworCQlyZXR1cm4gMDsJLyogUHJvYmFibHkgc2hvdWxkIHRyYXAgKi8KKwl9CisJbDJsaW5lc2l6ZSA9IGxpbmVsb2NrLT5sMmxpbmVzaXplOworCisgICAgICBtb3ZlRGF0YToKKwlBU1NFUlQobGluZWxvY2stPmluZGV4IDw9IGxpbmVsb2NrLT5tYXhjbnQpOworCisJbHYgPSBsaW5lbG9jay0+bHY7CisJZm9yIChpID0gMDsgaSA8IGxpbmVsb2NrLT5pbmRleDsgaSsrLCBsdisrKSB7CisJCWlmIChsdi0+bGVuZ3RoID09IDApCisJCQljb250aW51ZTsKKworCQkvKiBpcyBwYWdlIGZ1bGwgPyAqLworCQlpZiAoZHN0b2Zmc2V0ID49IExPR1BTSVpFIC0gTE9HUFRMUlNJWkUpIHsKKwkJCS8qIHBhZ2UgYmVjb21lIGZ1bGw6IG1vdmUgb24gdG8gbmV4dCBwYWdlICovCisJCQlsbU5leHRQYWdlKGxvZyk7CisKKwkJCWJwID0gbG9nLT5icDsKKwkJCWxwID0gKHN0cnVjdCBsb2dwYWdlICopIGJwLT5sX2xkYXRhOworCQkJZHN0b2Zmc2V0ID0gTE9HUEhEUlNJWkU7CisJCX0KKworCQkvKgorCQkgKiBtb3ZlIGxvZyB2ZWN0b3IgZGF0YQorCQkgKi8KKwkJc3JjID0gKHU4ICopIHAgKyAobHYtPm9mZnNldCA8PCBsMmxpbmVzaXplKTsKKwkJc3JjbGVuID0gbHYtPmxlbmd0aCA8PCBsMmxpbmVzaXplOworCQlsZW4gKz0gc3JjbGVuOworCQl3aGlsZSAoc3JjbGVuID4gMCkgeworCQkJZnJlZXNwYWNlID0gKExPR1BTSVpFIC0gTE9HUFRMUlNJWkUpIC0gZHN0b2Zmc2V0OworCQkJbmJ5dGVzID0gbWluKGZyZWVzcGFjZSwgc3JjbGVuKTsKKwkJCWRzdCA9IChjYWRkcl90KSBscCArIGRzdG9mZnNldDsKKwkJCW1lbWNweShkc3QsIHNyYywgbmJ5dGVzKTsKKwkJCWRzdG9mZnNldCArPSBuYnl0ZXM7CisKKwkJCS8qIGlzIHBhZ2Ugbm90IGZ1bGwgPyAqLworCQkJaWYgKGRzdG9mZnNldCA8IExPR1BTSVpFIC0gTE9HUFRMUlNJWkUpCisJCQkJYnJlYWs7CisKKwkJCS8qIHBhZ2UgYmVjb21lIGZ1bGw6IG1vdmUgb24gdG8gbmV4dCBwYWdlICovCisJCQlsbU5leHRQYWdlKGxvZyk7CisKKwkJCWJwID0gKHN0cnVjdCBsYnVmICopIGxvZy0+YnA7CisJCQlscCA9IChzdHJ1Y3QgbG9ncGFnZSAqKSBicC0+bF9sZGF0YTsKKwkJCWRzdG9mZnNldCA9IExPR1BIRFJTSVpFOworCisJCQlzcmNsZW4gLT0gbmJ5dGVzOworCQkJc3JjICs9IG5ieXRlczsKKwkJfQorCisJCS8qCisJCSAqIG1vdmUgbG9nIHZlY3RvciBkZXNjcmlwdG9yCisJCSAqLworCQlsZW4gKz0gNDsKKwkJbHZkID0gKHN0cnVjdCBsdmQgKikgKChjYWRkcl90KSBscCArIGRzdG9mZnNldCk7CisJCWx2ZC0+b2Zmc2V0ID0gY3B1X3RvX2xlMTYobHYtPm9mZnNldCk7CisJCWx2ZC0+bGVuZ3RoID0gY3B1X3RvX2xlMTYobHYtPmxlbmd0aCk7CisJCWRzdG9mZnNldCArPSA0OworCQlqZnNfaW5mbygibG1Xcml0ZVJlY29yZDogbHYgb2Zmc2V0OiVkIGxlbmd0aDolZCIsCisJCQkgbHYtPm9mZnNldCwgbHYtPmxlbmd0aCk7CisJfQorCisJaWYgKChpID0gbGluZWxvY2stPm5leHQpKSB7CisJCWxpbmVsb2NrID0gKHN0cnVjdCBsaW5lbG9jayAqKSBsaWRfdG9fdGxvY2soaSk7CisJCWdvdG8gbW92ZURhdGE7CisJfQorCisJLyoKKwkgKiAgICAgIG1vdmUgbG9nIHJlY29yZCBkZXNjcmlwdG9yCisJICovCisgICAgICBtb3ZlTHJkOgorCWxyZC0+bGVuZ3RoID0gY3B1X3RvX2xlMTYobGVuKTsKKworCXNyYyA9IChjYWRkcl90KSBscmQ7CisJc3JjbGVuID0gTE9HUkRTSVpFOworCisJd2hpbGUgKHNyY2xlbiA+IDApIHsKKwkJZnJlZXNwYWNlID0gKExPR1BTSVpFIC0gTE9HUFRMUlNJWkUpIC0gZHN0b2Zmc2V0OworCQluYnl0ZXMgPSBtaW4oZnJlZXNwYWNlLCBzcmNsZW4pOworCQlkc3QgPSAoY2FkZHJfdCkgbHAgKyBkc3RvZmZzZXQ7CisJCW1lbWNweShkc3QsIHNyYywgbmJ5dGVzKTsKKworCQlkc3RvZmZzZXQgKz0gbmJ5dGVzOworCQlzcmNsZW4gLT0gbmJ5dGVzOworCisJCS8qIGFyZSB0aGVyZSBtb3JlIHRvIG1vdmUgdGhhbiBmcmVlc3BhY2Ugb2YgcGFnZSA/ICovCisJCWlmIChzcmNsZW4pCisJCQlnb3RvIHBhZ2VGdWxsOworCisJCS8qCisJCSAqIGVuZCBvZiBsb2cgcmVjb3JkIGRlc2NyaXB0b3IKKwkJICovCisKKwkJLyogdXBkYXRlIGxhc3QgbG9nIHJlY29yZCBlb3IgKi8KKwkJbG9nLT5lb3IgPSBkc3RvZmZzZXQ7CisJCWJwLT5sX2VvciA9IGRzdG9mZnNldDsKKwkJbHNuID0gKGxvZy0+cGFnZSA8PCBMMkxPR1BTSVpFKSArIGRzdG9mZnNldDsKKworCQlpZiAobHJkLT50eXBlICYgY3B1X3RvX2xlMTYoTE9HX0NPTU1JVCkpIHsKKwkJCXRibGstPmNsc24gPSBsc247CisJCQlqZnNfaW5mbygid3I6IHRjbHNuOjB4JXgsIGJlb3I6MHgleCIsIHRibGstPmNsc24sCisJCQkJIGJwLT5sX2Vvcik7CisKKwkJCUlOQ1JFTUVOVChsbVN0YXQuY29tbWl0KTsJLyogIyBvZiBjb21taXQgKi8KKworCQkJLyoKKwkJCSAqIGVucXVldWUgdGJsb2NrIGZvciBncm91cCBjb21taXQ6CisJCQkgKgorCQkJICogZW5xdWV1ZSB0YmxvY2sgb2Ygbm9uLXRyaXZpYWwvc3luY2hyb25vdXMgQ09NTUlUCisJCQkgKiBhdCB0YWlsIG9mIGdyb3VwIGNvbW1pdCBxdWV1ZQorCQkJICogKHRyaXZpYWwvYXN5bmNocm9ub3VzIENPTU1JVHMgYXJlIGlnbm9yZWQgYnkKKwkJCSAqIGdyb3VwIGNvbW1pdC4pCisJCQkgKi8KKwkJCUxPR0dDX0xPQ0sobG9nKTsKKworCQkJLyogaW5pdCB0YmxvY2sgZ2Mgc3RhdGUgKi8KKwkJCXRibGstPmZsYWcgPSB0YmxrR0NfUVVFVUU7CisJCQl0YmxrLT5icCA9IGxvZy0+YnA7CisJCQl0YmxrLT5wbiA9IGxvZy0+cGFnZTsKKwkJCXRibGstPmVvciA9IGxvZy0+ZW9yOworCisJCQkvKiBlbnF1ZXVlIHRyYW5zYWN0aW9uIHRvIGNvbW1pdCBxdWV1ZSAqLworCQkJbGlzdF9hZGRfdGFpbCgmdGJsay0+Y3F1ZXVlLCAmbG9nLT5jcXVldWUpOworCisJCQlMT0dHQ19VTkxPQ0sobG9nKTsKKwkJfQorCisJCWpmc19pbmZvKCJsbVdyaXRlUmVjb3JkOiBscmQ6MHglMDR4IGJwOjB4JXAgcG46JWQgZW9yOjB4JXgiLAorCQkJbGUxNl90b19jcHUobHJkLT50eXBlKSwgbG9nLT5icCwgbG9nLT5wYWdlLCBkc3RvZmZzZXQpOworCisJCS8qIHBhZ2Ugbm90IGZ1bGwgPyAqLworCQlpZiAoZHN0b2Zmc2V0IDwgTE9HUFNJWkUgLSBMT0dQVExSU0laRSkKKwkJCXJldHVybiBsc247CisKKwkgICAgICBwYWdlRnVsbDoKKwkJLyogcGFnZSBiZWNvbWUgZnVsbDogbW92ZSBvbiB0byBuZXh0IHBhZ2UgKi8KKwkJbG1OZXh0UGFnZShsb2cpOworCisJCWJwID0gKHN0cnVjdCBsYnVmICopIGxvZy0+YnA7CisJCWxwID0gKHN0cnVjdCBsb2dwYWdlICopIGJwLT5sX2xkYXRhOworCQlkc3RvZmZzZXQgPSBMT0dQSERSU0laRTsKKwkJc3JjICs9IG5ieXRlczsKKwl9CisKKwlyZXR1cm4gbHNuOworfQorCisKKy8qCisgKiBOQU1FOglsbU5leHRQYWdlKCkKKyAqCisgKiBGVU5DVElPTjoJd3JpdGUgY3VycmVudCBwYWdlIGFuZCBhbGxvY2F0ZSBuZXh0IHBhZ2UuCisgKgorICogUEFSQU1FVEVSOglsb2cKKyAqCisgKiBSRVRVUk46CTAKKyAqCQkJCisgKiBzZXJpYWxpemF0aW9uOiBMT0dfTE9DSygpIGhlbGQgb24gZW50cnkvZXhpdAorICovCitzdGF0aWMgaW50IGxtTmV4dFBhZ2Uoc3RydWN0IGpmc19sb2cgKiBsb2cpCit7CisJc3RydWN0IGxvZ3BhZ2UgKmxwOworCWludCBsc3BuOwkJLyogbG9nIHNlcXVlbmNlIHBhZ2UgbnVtYmVyICovCisJaW50IHBuOwkJCS8qIGN1cnJlbnQgcGFnZSBudW1iZXIgKi8KKwlzdHJ1Y3QgbGJ1ZiAqYnA7CisJc3RydWN0IGxidWYgKm5leHRicDsKKwlzdHJ1Y3QgdGJsb2NrICp0YmxrOworCisJLyogZ2V0IGN1cnJlbnQgbG9nIHBhZ2UgbnVtYmVyIGFuZCBsb2cgc2VxdWVuY2UgcGFnZSBudW1iZXIgKi8KKwlwbiA9IGxvZy0+cGFnZTsKKwlicCA9IGxvZy0+YnA7CisJbHAgPSAoc3RydWN0IGxvZ3BhZ2UgKikgYnAtPmxfbGRhdGE7CisJbHNwbiA9IGxlMzJfdG9fY3B1KGxwLT5oLnBhZ2UpOworCisJTE9HR0NfTE9DSyhsb2cpOworCisJLyoKKwkgKiAgICAgIHdyaXRlIG9yIHF1ZXVlIHRoZSBmdWxsIHBhZ2UgYXQgdGhlIHRhaWwgb2Ygd3JpdGUgcXVldWUKKwkgKi8KKwkvKiBnZXQgdGhlIHRhaWwgdGJsayBvbiBjb21taXQgcXVldWUgKi8KKwlpZiAobGlzdF9lbXB0eSgmbG9nLT5jcXVldWUpKQorCQl0YmxrID0gTlVMTDsKKwllbHNlCisJCXRibGsgPSBsaXN0X2VudHJ5KGxvZy0+Y3F1ZXVlLnByZXYsIHN0cnVjdCB0YmxvY2ssIGNxdWV1ZSk7CisKKwkvKiBldmVyeSB0YmxrIHdobyBoYXMgQ09NTUlUIHJlY29yZCBvbiB0aGUgY3VycmVudCBwYWdlLAorCSAqIGFuZCBoYXMgbm90IGJlZW4gY29tbWl0dGVkLCBtdXN0IGJlIG9uIGNvbW1pdCBxdWV1ZQorCSAqIHNpbmNlIHRibGsgaXMgcXVldWVkIGF0IGNvbW1pdCBxdWV1ZXUgYXQgdGhlIHRpbWUKKwkgKiBvZiB3cml0aW5nIGl0cyBDT01NSVQgcmVjb3JkIG9uIHRoZSBwYWdlIGJlZm9yZQorCSAqIHBhZ2UgYmVjb21lcyBmdWxsIChldmVuIHRob3VnaCB0aGUgdGJsayB0aHJlYWQKKwkgKiB3aG8gd3JvdGUgQ09NTUlUIHJlY29yZCBtYXkgaGF2ZSBiZWVuIHN1c3BlbmRlZAorCSAqIGN1cnJlbnRseSk7CisJICovCisKKwkvKiBpcyBwYWdlIGJvdW5kIHdpdGggb3V0c3RhbmRpbmcgdGFpbCB0YmxrID8gKi8KKwlpZiAodGJsayAmJiB0YmxrLT5wbiA9PSBwbikgeworCQkvKiBtYXJrIHRibGsgZm9yIGVuZC1vZi1wYWdlICovCisJCXRibGstPmZsYWcgfD0gdGJsa0dDX0VPUDsKKworCQlpZiAobG9nLT5jZmxhZyAmIGxvZ0dDX1BBR0VPVVQpIHsKKwkJCS8qIGlmIHBhZ2UgaXMgbm90IGFscmVhZHkgb24gd3JpdGUgcXVldWUsCisJCQkgKiBqdXN0IGVucXVldWUgKG5vIGxibVdSSVRFIHRvIHByZXZlbnQgcmVkcml2ZSkKKwkJCSAqIGJ1ZmZlciB0byB3cXVldWUgdG8gZW5zdXJlIGNvcnJlY3Qgc2VyaWFsIG9yZGVyCisJCQkgKiBvZiB0aGUgcGFnZXMgc2luY2UgbG9nIHBhZ2VzIHdpbGwgYmUgYWRkZWQKKwkJCSAqIGNvbnRpbnVvdXNseQorCQkJICovCisJCQlpZiAoYnAtPmxfd3FuZXh0ID09IE5VTEwpCisJCQkJbGJtV3JpdGUobG9nLCBicCwgMCwgMCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogTm8gY3VycmVudCBHQyBsZWFkZXIsIGluaXRpYXRlIGdyb3VwIGNvbW1pdAorCQkJICovCisJCQlsb2ctPmNmbGFnIHw9IGxvZ0dDX1BBR0VPVVQ7CisJCQlsbUdDd3JpdGUobG9nLCAwKTsKKwkJfQorCX0KKwkvKiBwYWdlIGlzIG5vdCBib3VuZCB3aXRoIG91dHN0YW5kaW5nIHRibGs6CisJICogaW5pdCB3cml0ZSBvciBtYXJrIGl0IHRvIGJlIHJlZHJpdmVuIChsYm1XUklURSkKKwkgKi8KKwllbHNlIHsKKwkJLyogZmluYWxpemUgdGhlIHBhZ2UgKi8KKwkJYnAtPmxfY2VvciA9IGJwLT5sX2VvcjsKKwkJbHAtPmguZW9yID0gbHAtPnQuZW9yID0gY3B1X3RvX2xlMTYoYnAtPmxfY2Vvcik7CisJCWxibVdyaXRlKGxvZywgYnAsIGxibVdSSVRFIHwgbGJtUkVMRUFTRSB8IGxibUZSRUUsIDApOworCX0KKwlMT0dHQ19VTkxPQ0sobG9nKTsKKworCS8qCisJICogICAgICBhbGxvY2F0ZS9pbml0aWFsaXplIG5leHQgcGFnZQorCSAqLworCS8qIGlmIGxvZyB3cmFwcywgdGhlIGZpcnN0IGRhdGEgcGFnZSBvZiBsb2cgaXMgMgorCSAqICgwIG5ldmVyIHVzZWQsIDEgaXMgc3VwZXJibG9jaykuCisJICovCisJbG9nLT5wYWdlID0gKHBuID09IGxvZy0+c2l6ZSAtIDEpID8gMiA6IHBuICsgMTsKKwlsb2ctPmVvciA9IExPR1BIRFJTSVpFOwkvKiA/IHZhbGlkIHBhZ2UgZW1wdHkvZnVsbCBhdCBsb2dSZWRvKCkgKi8KKworCS8qIGFsbG9jYXRlL2luaXRpYWxpemUgbmV4dCBsb2cgcGFnZSBidWZmZXIgKi8KKwluZXh0YnAgPSBsYm1BbGxvY2F0ZShsb2csIGxvZy0+cGFnZSk7CisJbmV4dGJwLT5sX2VvciA9IGxvZy0+ZW9yOworCWxvZy0+YnAgPSBuZXh0YnA7CisKKwkvKiBpbml0aWFsaXplIG5leHQgbG9nIHBhZ2UgKi8KKwlscCA9IChzdHJ1Y3QgbG9ncGFnZSAqKSBuZXh0YnAtPmxfbGRhdGE7CisJbHAtPmgucGFnZSA9IGxwLT50LnBhZ2UgPSBjcHVfdG9fbGUzMihsc3BuICsgMSk7CisJbHAtPmguZW9yID0gbHAtPnQuZW9yID0gY3B1X3RvX2xlMTYoTE9HUEhEUlNJWkUpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIE5BTUU6CWxtR3JvdXBDb21taXQoKQorICoKKyAqIEZVTkNUSU9OOglncm91cCBjb21taXQKKyAqCWluaXRpYXRlIHBhZ2VvdXQgb2YgdGhlIHBhZ2VzIHdpdGggQ09NTUlUIGluIHRoZSBvcmRlciBvZgorICoJcGFnZSBudW1iZXIgLSByZWRyaXZlIHBhZ2VvdXQgb2YgdGhlIHBhZ2UgYXQgdGhlIGhlYWQgb2YKKyAqCXBhZ2VvdXQgcXVldWUgdW50aWwgZnVsbCBwYWdlIGhhcyBiZWVuIHdyaXR0ZW4uCisgKgorICogUkVUVVJOOgkKKyAqCisgKiBOT1RFOgorICoJTE9HR0NfTE9DSyBzZXJpYWxpemVzIGxvZyBncm91cCBjb21taXQgcXVldWUsIGFuZAorICoJdHJhbnNhY3Rpb24gYmxvY2tzIG9uIHRoZSBjb21taXQgcXVldWUuCisgKglOLkIuIExPR19MT0NLIGlzIE5PVCBoZWxkIGR1cmluZyBsbUdyb3VwQ29tbWl0KCkuCisgKi8KK2ludCBsbUdyb3VwQ29tbWl0KHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgdGJsb2NrICogdGJsaykKK3sKKwlpbnQgcmMgPSAwOworCisJTE9HR0NfTE9DSyhsb2cpOworCisJLyogZ3JvdXAgY29tbWl0dGVkIGFscmVhZHkgPyAqLworCWlmICh0YmxrLT5mbGFnICYgdGJsa0dDX0NPTU1JVFRFRCkgeworCQlpZiAodGJsay0+ZmxhZyAmIHRibGtHQ19FUlJPUikKKwkJCXJjID0gLUVJTzsKKworCQlMT0dHQ19VTkxPQ0sobG9nKTsKKwkJcmV0dXJuIHJjOworCX0KKwlqZnNfaW5mbygibG1Hcm91cCBDb21taXQ6IHRibGsgPSAweCVwLCBnY3J0YyA9ICVkIiwgdGJsaywgbG9nLT5nY3J0Yyk7CisKKwlpZiAodGJsay0+eGZsYWcgJiBDT01NSVRfTEFaWSkKKwkJdGJsay0+ZmxhZyB8PSB0YmxrR0NfTEFaWTsKKworCWlmICgoIShsb2ctPmNmbGFnICYgbG9nR0NfUEFHRU9VVCkpICYmICghbGlzdF9lbXB0eSgmbG9nLT5jcXVldWUpKSAmJgorCSAgICAoISh0YmxrLT54ZmxhZyAmIENPTU1JVF9MQVpZKSB8fCB0ZXN0X2JpdChsb2dfRkxVU0gsICZsb2ctPmZsYWcpCisJICAgICB8fCBqZnNfdGxvY2tzX2xvdykpIHsKKwkJLyoKKwkJICogTm8gcGFnZW91dCBpbiBwcm9ncmVzcworCQkgKgorCQkgKiBzdGFydCBncm91cCBjb21taXQgYXMgaXRzIGdyb3VwIGxlYWRlci4KKwkJICovCisJCWxvZy0+Y2ZsYWcgfD0gbG9nR0NfUEFHRU9VVDsKKworCQlsbUdDd3JpdGUobG9nLCAwKTsKKwl9CisKKwlpZiAodGJsay0+eGZsYWcgJiBDT01NSVRfTEFaWSkgeworCQkvKgorCQkgKiBMYXp5IHRyYW5zYWN0aW9ucyBjYW4gbGVhdmUgbm93CisJCSAqLworCQlMT0dHQ19VTkxPQ0sobG9nKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogbG1HQ3dyaXRlIGdpdmVzIHVwIExPR0dDX0xPQ0ssIGNoZWNrIGFnYWluICovCisKKwlpZiAodGJsay0+ZmxhZyAmIHRibGtHQ19DT01NSVRURUQpIHsKKwkJaWYgKHRibGstPmZsYWcgJiB0YmxrR0NfRVJST1IpCisJCQlyYyA9IC1FSU87CisKKwkJTE9HR0NfVU5MT0NLKGxvZyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiB1cGNvdW50IHRyYW5zYWN0aW9uIHdhaXRpbmcgZm9yIGNvbXBsZXRpb24KKwkgKi8KKwlsb2ctPmdjcnRjKys7CisJdGJsay0+ZmxhZyB8PSB0YmxrR0NfUkVBRFk7CisKKwlfX1NMRUVQX0NPTkQodGJsay0+Z2N3YWl0LCAodGJsay0+ZmxhZyAmIHRibGtHQ19DT01NSVRURUQpLAorCQkgICAgIExPR0dDX0xPQ0sobG9nKSwgTE9HR0NfVU5MT0NLKGxvZykpOworCisJLyogcmVtb3ZlZCBmcm9tIGNvbW1pdCBxdWV1ZSAqLworCWlmICh0YmxrLT5mbGFnICYgdGJsa0dDX0VSUk9SKQorCQlyYyA9IC1FSU87CisKKwlMT0dHQ19VTkxPQ0sobG9nKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBOQU1FOglsbUdDd3JpdGUoKQorICoKKyAqIEZVTkNUSU9OOglncm91cCBjb21taXQgd3JpdGUKKyAqCWluaXRpYXRlIHdyaXRlIG9mIGxvZyBwYWdlLCBidWlsZGluZyBhIGdyb3VwIG9mIGFsbCB0cmFuc2FjdGlvbnMKKyAqCXdpdGggY29tbWl0IHJlY29yZHMgb24gdGhhdCBwYWdlLgorICoKKyAqIFJFVFVSTjoJTm9uZQorICoKKyAqIE5PVEU6CisgKglMT0dHQ19MT0NLIG11c3QgYmUgaGVsZCBieSBjYWxsZXIuCisgKglOLkIuIExPR19MT0NLIGlzIE5PVCBoZWxkIGR1cmluZyBsbUdyb3VwQ29tbWl0KCkuCisgKi8KK3N0YXRpYyB2b2lkIGxtR0N3cml0ZShzdHJ1Y3QgamZzX2xvZyAqIGxvZywgaW50IGNhbnRfd3JpdGUpCit7CisJc3RydWN0IGxidWYgKmJwOworCXN0cnVjdCBsb2dwYWdlICpscDsKKwlpbnQgZ2NwbjsJCS8qIGdyb3VwIGNvbW1pdCBwYWdlIG51bWJlciAqLworCXN0cnVjdCB0YmxvY2sgKnRibGs7CisJc3RydWN0IHRibG9jayAqeHRibGsgPSBOVUxMOworCisJLyoKKwkgKiBidWlsZCB0aGUgY29tbWl0IGdyb3VwIG9mIGEgbG9nIHBhZ2UKKwkgKgorCSAqIHNjYW4gY29tbWl0IHF1ZXVlIGFuZCBtYWtlIGEgY29tbWl0IGdyb3VwIG9mIGFsbAorCSAqIHRyYW5zYWN0aW9ucyB3aXRoIENPTU1JVCByZWNvcmRzIG9uIHRoZSBzYW1lIGxvZyBwYWdlLgorCSAqLworCS8qIGdldCB0aGUgaGVhZCB0YmxrIG9uIHRoZSBjb21taXQgcXVldWUgKi8KKwlnY3BuID0gbGlzdF9lbnRyeShsb2ctPmNxdWV1ZS5uZXh0LCBzdHJ1Y3QgdGJsb2NrLCBjcXVldWUpLT5wbjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodGJsaywgJmxvZy0+Y3F1ZXVlLCBjcXVldWUpIHsKKwkJaWYgKHRibGstPnBuICE9IGdjcG4pCisJCQlicmVhazsKKworCQl4dGJsayA9IHRibGs7CisKKwkJLyogc3RhdGUgdHJhbnNpdGlvbjogKFFVRVVFLCBSRUFEWSkgLT4gQ09NTUlUICovCisJCXRibGstPmZsYWcgfD0gdGJsa0dDX0NPTU1JVDsKKwl9CisJdGJsayA9IHh0YmxrOwkJLyogbGFzdCB0YmxrIG9mIHRoZSBwYWdlICovCisKKwkvKgorCSAqIHBhZ2VvdXQgdG8gY29tbWl0IHRyYW5zYWN0aW9ucyBvbiB0aGUgbG9nIHBhZ2UuCisJICovCisJYnAgPSAoc3RydWN0IGxidWYgKikgdGJsay0+YnA7CisJbHAgPSAoc3RydWN0IGxvZ3BhZ2UgKikgYnAtPmxfbGRhdGE7CisJLyogaXMgcGFnZSBhbHJlYWR5IGZ1bGwgPyAqLworCWlmICh0YmxrLT5mbGFnICYgdGJsa0dDX0VPUCkgeworCQkvKiBtYXJrIHBhZ2UgdG8gZnJlZSBhdCBlbmQgb2YgZ3JvdXAgY29tbWl0IG9mIHRoZSBwYWdlICovCisJCXRibGstPmZsYWcgJj0gfnRibGtHQ19FT1A7CisJCXRibGstPmZsYWcgfD0gdGJsa0dDX0ZSRUU7CisJCWJwLT5sX2Nlb3IgPSBicC0+bF9lb3I7CisJCWxwLT5oLmVvciA9IGxwLT50LmVvciA9IGNwdV90b19sZTE2KGJwLT5sX2Nlb3IpOworCQlsYm1Xcml0ZShsb2csIGJwLCBsYm1XUklURSB8IGxibVJFTEVBU0UgfCBsYm1HQywKKwkJCSBjYW50X3dyaXRlKTsKKwkJSU5DUkVNRU5UKGxtU3RhdC5mdWxsX3BhZ2UpOworCX0KKwkvKiBwYWdlIGlzIG5vdCB5ZXQgZnVsbCAqLworCWVsc2UgeworCQlicC0+bF9jZW9yID0gdGJsay0+ZW9yOwkvKiA/IGJwLT5sX2Nlb3IgPSBicC0+bF9lb3I7ICovCisJCWxwLT5oLmVvciA9IGxwLT50LmVvciA9IGNwdV90b19sZTE2KGJwLT5sX2Nlb3IpOworCQlsYm1Xcml0ZShsb2csIGJwLCBsYm1XUklURSB8IGxibUdDLCBjYW50X3dyaXRlKTsKKwkJSU5DUkVNRU5UKGxtU3RhdC5wYXJ0aWFsX3BhZ2UpOworCX0KK30KKworLyoKKyAqIE5BTUU6CWxtUG9zdEdDKCkKKyAqCisgKiBGVU5DVElPTjoJZ3JvdXAgY29tbWl0IHBvc3QtcHJvY2Vzc2luZworICoJUHJvY2Vzc2VzIHRyYW5zYWN0aW9ucyBhZnRlciB0aGVpciBjb21taXQgcmVjb3JkcyBoYXZlIGJlZW4gd3JpdHRlbgorICoJdG8gZGlzaywgcmVkcml2aW5nIGxvZyBJL08gaWYgbmVjZXNzYXJ5LgorICoKKyAqIFJFVFVSTjoJTm9uZQorICoKKyAqIE5PVEU6CisgKglUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGEgaW50ZXJydXB0IHRpbWUgYnkgbGJtSU9Eb25lCisgKi8KK3N0YXRpYyB2b2lkIGxtUG9zdEdDKHN0cnVjdCBsYnVmICogYnApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgamZzX2xvZyAqbG9nID0gYnAtPmxfbG9nOworCXN0cnVjdCBsb2dwYWdlICpscDsKKwlzdHJ1Y3QgdGJsb2NrICp0YmxrLCAqdGVtcDsKKworCS8vTE9HR0NfTE9DSyhsb2cpOworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2ctPmdjbG9jaywgZmxhZ3MpOworCS8qCisJICogY3VycmVudCBwYWdlb3V0IG9mIGdyb3VwIGNvbW1pdCBjb21wbGV0ZWQuCisJICoKKwkgKiByZW1vdmUvd2FrZXVwIHRyYW5zYWN0aW9ucyBmcm9tIGNvbW1pdCBxdWV1ZSB3aG8gd2VyZQorCSAqIGdyb3VwIGNvbW1pdHRlZCB3aXRoIHRoZSBjdXJyZW50IGxvZyBwYWdlCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRibGssIHRlbXAsICZsb2ctPmNxdWV1ZSwgY3F1ZXVlKSB7CisJCWlmICghKHRibGstPmZsYWcgJiB0YmxrR0NfQ09NTUlUKSkKKwkJCWJyZWFrOworCQkvKiBpZiB0cmFuc2FjdGlvbiB3YXMgbWFya2VkIEdDX0NPTU1JVCB0aGVuCisJCSAqIGl0IGhhcyBiZWVuIHNoaXBwZWQgaW4gdGhlIGN1cnJlbnQgcGFnZW91dAorCQkgKiBhbmQgbWFkZSBpdCB0byBkaXNrIC0gaXQgaXMgY29tbWl0dGVkLgorCQkgKi8KKworCQlpZiAoYnAtPmxfZmxhZyAmIGxibUVSUk9SKQorCQkJdGJsay0+ZmxhZyB8PSB0YmxrR0NfRVJST1I7CisKKwkJLyogcmVtb3ZlIGl0IGZyb20gdGhlIGNvbW1pdCBxdWV1ZSAqLworCQlsaXN0X2RlbCgmdGJsay0+Y3F1ZXVlKTsKKwkJdGJsay0+ZmxhZyAmPSB+dGJsa0dDX1FVRVVFOworCisJCWlmICh0YmxrID09IGxvZy0+Zmx1c2hfdGJsaykgeworCQkJLyogd2UgY2FuIHN0b3AgZmx1c2hpbmcgdGhlIGxvZyBub3cgKi8KKwkJCWNsZWFyX2JpdChsb2dfRkxVU0gsICZsb2ctPmZsYWcpOworCQkJbG9nLT5mbHVzaF90YmxrID0gTlVMTDsKKwkJfQorCisJCWpmc19pbmZvKCJsbVBvc3RHQzogdGJsayA9IDB4JXAsIGZsYWcgPSAweCV4IiwgdGJsaywKKwkJCSB0YmxrLT5mbGFnKTsKKworCQlpZiAoISh0YmxrLT54ZmxhZyAmIENPTU1JVF9GT1JDRSkpCisJCQkvKgorCQkJICogSGFuZCB0YmxrIG92ZXIgdG8gbGF6eSBjb21taXQgdGhyZWFkCisJCQkgKi8KKwkJCXR4TGF6eVVubG9jayh0YmxrKTsKKwkJZWxzZSB7CisJCQkvKiBzdGF0ZSB0cmFuc2l0aW9uOiBDT01NSVQgLT4gQ09NTUlUVEVEICovCisJCQl0YmxrLT5mbGFnIHw9IHRibGtHQ19DT01NSVRURUQ7CisKKwkJCWlmICh0YmxrLT5mbGFnICYgdGJsa0dDX1JFQURZKQorCQkJCWxvZy0+Z2NydGMtLTsKKworCQkJTE9HR0NfV0FLRVVQKHRibGspOworCQl9CisKKwkJLyogd2FzIHBhZ2UgZnVsbCBiZWZvcmUgcGFnZW91dCA/CisJCSAqIChhbmQgdGhpcyBpcyB0aGUgbGFzdCB0YmxrIGJvdW5kIHdpdGggdGhlIHBhZ2UpCisJCSAqLworCQlpZiAodGJsay0+ZmxhZyAmIHRibGtHQ19GUkVFKQorCQkJbGJtRnJlZShicCk7CisJCS8qIGRpZCBwYWdlIGJlY29tZSBmdWxsIGFmdGVyIHBhZ2VvdXQgPworCQkgKiAoYW5kIHRoaXMgaXMgdGhlIGxhc3QgdGJsayBib3VuZCB3aXRoIHRoZSBwYWdlKQorCQkgKi8KKwkJZWxzZSBpZiAodGJsay0+ZmxhZyAmIHRibGtHQ19FT1ApIHsKKwkJCS8qIGZpbmFsaXplIHRoZSBwYWdlICovCisJCQlscCA9IChzdHJ1Y3QgbG9ncGFnZSAqKSBicC0+bF9sZGF0YTsKKwkJCWJwLT5sX2Nlb3IgPSBicC0+bF9lb3I7CisJCQlscC0+aC5lb3IgPSBscC0+dC5lb3IgPSBjcHVfdG9fbGUxNihicC0+bF9lb3IpOworCQkJamZzX2luZm8oImxtUG9zdEdDOiBjYWxsaW5nIGxibVdyaXRlIik7CisJCQlsYm1Xcml0ZShsb2csIGJwLCBsYm1XUklURSB8IGxibVJFTEVBU0UgfCBsYm1GUkVFLAorCQkJCSAxKTsKKwkJfQorCisJfQorCisJLyogYXJlIHRoZXJlIGFueSB0cmFuc2FjdGlvbnMgd2hvIGhhdmUgZW50ZXJlZCBsbkdyb3VwQ29tbWl0KCkKKwkgKiAod2hvc2UgQ09NTUlUcyBhcmUgYWZ0ZXIgdGhhdCBvZiB0aGUgbGFzdCBsb2cgcGFnZSB3cml0dGVuLgorCSAqIFRoZXkgYXJlIHdhaXRpbmcgZm9yIG5ldyBncm91cCBjb21taXQgKGFib3ZlIGF0IChTTEVFUCAxKSkKKwkgKiBvciBsYXp5IHRyYW5zYWN0aW9ucyBhcmUgb24gYSBmdWxsIChxdWV1ZWQpIGxvZyBwYWdlLAorCSAqIHNlbGVjdCB0aGUgbGF0ZXN0IHJlYWR5IHRyYW5zYWN0aW9uIGFzIG5ldyBncm91cCBsZWFkZXIgYW5kCisJICogd2FrZSBoZXIgdXAgdG8gbGVhZCBoZXIgZ3JvdXAuCisJICovCisJaWYgKCghbGlzdF9lbXB0eSgmbG9nLT5jcXVldWUpKSAmJgorCSAgICAoKGxvZy0+Z2NydGMgPiAwKSB8fCAodGJsay0+YnAtPmxfd3FuZXh0ICE9IE5VTEwpIHx8CisJICAgICB0ZXN0X2JpdChsb2dfRkxVU0gsICZsb2ctPmZsYWcpIHx8IGpmc190bG9ja3NfbG93KSkKKwkJLyoKKwkJICogQ2FsbCBsbUdDd3JpdGUgd2l0aCBuZXcgZ3JvdXAgbGVhZGVyCisJCSAqLworCQlsbUdDd3JpdGUobG9nLCAxKTsKKworCS8qIG5vIHRyYW5zYWN0aW9uIGFyZSByZWFkeSB5ZXQgKHRyYW5zYWN0aW9ucyBhcmUgb25seSBqdXN0CisJICogcXVldWVkIChHQ19RVUVVRSkgYW5kIG5vdCBlbnRlcmVkIGZvciBncm91cCBjb21taXQgeWV0KS4KKwkgKiB0aGUgZmlyc3QgdHJhbnNhY3Rpb24gZW50ZXJpbmcgZ3JvdXAgY29tbWl0CisJICogd2lsbCBlbGVjdCBoZXJzZWxmIGFzIG5ldyBncm91cCBsZWFkZXIuCisJICovCisJZWxzZQorCQlsb2ctPmNmbGFnICY9IH5sb2dHQ19QQUdFT1VUOworCisJLy9MT0dHQ19VTkxPQ0sobG9nKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2ctPmdjbG9jaywgZmxhZ3MpOworCXJldHVybjsKK30KKworLyoKKyAqIE5BTUU6CWxtTG9nU3luYygpCisgKgorICogRlVOQ1RJT046CXdyaXRlIGxvZyBTWU5DUFQgcmVjb3JkIGZvciBzcGVjaWZpZWQgbG9nCisgKglpZiBuZXcgc3luYyBhZGRyZXNzIGlzIGF2YWlsYWJsZQorICoJKG5vcm1hbGx5IHRoZSBjYXNlIGlmIHN5bmMoKSBpcyBleGVjdXRlZCBieSBiYWNrLWdyb3VuZAorICoJcHJvY2VzcykuCisgKglpZiBub3QsIGV4cGxpY2l0bHkgcnVuIGpmc19ibG9nc3luYygpIHRvIGluaXRpYXRlCisgKglnZXR0aW5nIG9mIG5ldyBzeW5jIGFkZHJlc3MuCisgKgljYWxjdWxhdGUgbmV3IHZhbHVlIG9mIGlfbmV4dHN5bmMgd2hpY2ggZGV0ZXJtaW5lcyB3aGVuCisgKgl0aGlzIGNvZGUgaXMgY2FsbGVkIGFnYWluLgorICoKKyAqCXRoaXMgaXMgY2FsbGVkIG9ubHkgZnJvbSBsbUxvZygpLgorICoKKyAqIFBBUkFNRVRFUjoJaXAJLSBwb2ludGVyIHRvIGxvZ3MgaW5vZGUuCisgKgorICogUkVUVVJOOgkwCisgKgkJCQorICogc2VyaWFsaXphdGlvbjogTE9HX0xPQ0soKSBoZWxkIG9uIGVudHJ5L2V4aXQKKyAqLworc3RhdGljIGludCBsbUxvZ1N5bmMoc3RydWN0IGpmc19sb2cgKiBsb2csIGludCBub3N5bmN3YWl0KQoreworCWludCBsb2dzaXplOworCWludCB3cml0dGVuOwkJLyogd3JpdHRlbiBzaW5jZSBsYXN0IHN5bmNwdCAqLworCWludCBmcmVlOwkJLyogZnJlZSBzcGFjZSBsZWZ0IGF2YWlsYWJsZSAqLworCWludCBkZWx0YTsJCS8qIGFkZGl0aW9uYWwgZGVsdGEgdG8gd3JpdGUgbm9ybWFsbHkgKi8KKwlpbnQgbW9yZTsJCS8qIGFkZGl0aW9uYWwgd3JpdGUgZ3JhbnRlZCAqLworCXN0cnVjdCBscmQgbHJkOworCWludCBsc247CisJc3RydWN0IGxvZ3N5bmNibGsgKmxwOworCisJLyoKKwkgKiAgICAgIGZvcndhcmQgc3luY3B0CisJICovCisJLyogaWYgbGFzdCBzeW5jIGlzIHNhbWUgYXMgbGFzdCBzeW5jcHQsCisJICogaW52b2tlIHN5bmMgcG9pbnQgZm9yd2FyZCBwcm9jZXNzaW5nIHRvIHVwZGF0ZSBzeW5jLgorCSAqLworCisJaWYgKGxvZy0+c3luYyA9PSBsb2ctPnN5bmNwdCkgeworCQlMT0dTWU5DX0xPQ0sobG9nKTsKKwkJLyogVG9EbzogcHVzaCBkaXJ0eSBtZXRhcGFnZXMgb3V0IHRvIGRpc2sgKi8KKy8vICAgICAgICAgICAgICBibUxvZ1N5bmMobG9nKTsKKworCQlpZiAobGlzdF9lbXB0eSgmbG9nLT5zeW5jbGlzdCkpCisJCQlsb2ctPnN5bmMgPSBsb2ctPmxzbjsKKwkJZWxzZSB7CisJCQlscCA9IGxpc3RfZW50cnkobG9nLT5zeW5jbGlzdC5uZXh0LAorCQkJCQlzdHJ1Y3QgbG9nc3luY2Jsaywgc3luY2xpc3QpOworCQkJbG9nLT5zeW5jID0gbHAtPmxzbjsKKwkJfQorCQlMT0dTWU5DX1VOTE9DSyhsb2cpOworCisJfQorCisJLyogaWYgc3luYyBpcyBkaWZmZXJlbnQgZnJvbSBsYXN0IHN5bmNwdCwKKwkgKiB3cml0ZSBhIFNZTkNQVCByZWNvcmQgd2l0aCBzeW5jcHQgPSBzeW5jLgorCSAqIHJlc2V0IHN5bmNwdCA9IHN5bmMKKwkgKi8KKwlpZiAobG9nLT5zeW5jICE9IGxvZy0+c3luY3B0KSB7CisJCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpOworCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gbWFrZSBzdXJlIGFsbCBvZiB0aGUgIndyaXR0ZW4iIG1ldGFwYWdlcworCQkgKiBhY3R1YWxseSBtYWtlIGl0IHRvIGRpc2sKKwkJICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc2JpLCAmbG9nLT5zYl9saXN0LCBsb2dfbGlzdCkgeworCQkJaWYgKHNiaS0+ZmxhZyAmIEpGU19OT0lOVEVHUklUWSkKKwkJCQljb250aW51ZTsKKwkJCWZpbGVtYXBfZmRhdGF3cml0ZShzYmktPmlwYm1hcC0+aV9tYXBwaW5nKTsKKwkJCWZpbGVtYXBfZmRhdGF3cml0ZShzYmktPmlwaW1hcC0+aV9tYXBwaW5nKTsKKwkJCWZpbGVtYXBfZmRhdGF3cml0ZShzYmktPnNiLT5zX2JkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcpOworCQl9CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc2JpLCAmbG9nLT5zYl9saXN0LCBsb2dfbGlzdCkgeworCQkJaWYgKHNiaS0+ZmxhZyAmIEpGU19OT0lOVEVHUklUWSkKKwkJCQljb250aW51ZTsKKwkJCWZpbGVtYXBfZmRhdGF3YWl0KHNiaS0+aXBibWFwLT5pX21hcHBpbmcpOworCQkJZmlsZW1hcF9mZGF0YXdhaXQoc2JpLT5pcGltYXAtPmlfbWFwcGluZyk7CisJCQlmaWxlbWFwX2ZkYXRhd2FpdChzYmktPnNiLT5zX2JkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcpOworCQl9CisKKwkJbHJkLmxvZ3RpZCA9IDA7CisJCWxyZC5iYWNrY2hhaW4gPSAwOworCQlscmQudHlwZSA9IGNwdV90b19sZTE2KExPR19TWU5DUFQpOworCQlscmQubGVuZ3RoID0gMDsKKwkJbHJkLmxvZy5zeW5jcHQuc3luYyA9IGNwdV90b19sZTMyKGxvZy0+c3luYyk7CisJCWxzbiA9IGxtV3JpdGVSZWNvcmQobG9nLCBOVUxMLCAmbHJkLCBOVUxMKTsKKworCQlsb2ctPnN5bmNwdCA9IGxvZy0+c3luYzsKKwl9IGVsc2UKKwkJbHNuID0gbG9nLT5sc247CisKKwkvKgorCSAqICAgICAgc2V0dXAgbmV4dCBzeW5jcHQgdHJpZ2dlciAoU1dBRykKKwkgKi8KKwlsb2dzaXplID0gbG9nLT5sb2dzaXplOworCisJbG9nZGlmZih3cml0dGVuLCBsc24sIGxvZyk7CisJZnJlZSA9IGxvZ3NpemUgLSB3cml0dGVuOworCWRlbHRhID0gTE9HU1lOQ19ERUxUQShsb2dzaXplKTsKKwltb3JlID0gbWluKGZyZWUgLyAyLCBkZWx0YSk7CisJaWYgKG1vcmUgPCAyICogTE9HUFNJWkUpIHsKKwkJamZzX3dhcm4oIlxuIC4uLiBMb2cgV3JhcCAuLi4gTG9nIFdyYXAgLi4uIExvZyBXcmFwIC4uLlxuIik7CisJCS8qCisJCSAqICAgICAgbG9nIHdyYXBwaW5nCisJCSAqCisJCSAqIG9wdGlvbiAxIC0gcGFuaWMgPyBOby4hCisJCSAqIG9wdGlvbiAyIC0gc2h1dGRvd24gZmlsZSBzeXN0ZW1zCisJCSAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGxvZyA/CisJCSAqIG9wdGlvbiAzIC0gZXh0ZW5kIGxvZyA/CisJCSAqLworCQkvKgorCQkgKiBvcHRpb24gNCAtIHNlY29uZCBjaGFuY2UKKwkJICoKKwkJICogbWFyayBsb2cgd3JhcHBlZCwgYW5kIGNvbnRpbnVlLgorCQkgKiB3aGVuIGFsbCBhY3RpdmUgdHJhbnNhY3Rpb25zIGFyZSBjb21wbGV0ZWQsCisJCSAqIG1hcmsgbG9nIHZhaWxkIGZvciByZWNvdmVyeS4KKwkJICogaWYgY3Jhc2hlZCBkdXJpbmcgaW52YWxpZCBzdGF0ZSwgbG9nIHN0YXRlCisJCSAqIGltcGxpZXMgaW52YWxkIGxvZywgZm9yY2luZyBmc2NrKCkuCisJCSAqLworCQkvKiBtYXJrIGxvZyBzdGF0ZSBsb2cgd3JhcCBpbiBsb2cgc3VwZXJibG9jayAqLworCQkvKiBsb2ctPnN0YXRlID0gTE9HV1JBUDsgKi8KKworCQkvKiByZXNldCBzeW5jIHBvaW50IGNvbXB1dGF0aW9uICovCisJCWxvZy0+c3luY3B0ID0gbG9nLT5zeW5jID0gbHNuOworCQlsb2ctPm5leHRzeW5jID0gZGVsdGE7CisJfSBlbHNlCisJCS8qIG5leHQgc3luY3B0IHRyaWdnZXIgPSB3cml0dGVuICsgbW9yZSAqLworCQlsb2ctPm5leHRzeW5jID0gd3JpdHRlbiArIG1vcmU7CisKKwkvKiByZXR1cm4gaWYgbG1Mb2dTeW5jKCkgZnJvbSBvdXRzaWRlIG9mIHRyYW5zYWN0aW9uLCBlLmcuLCBzeW5jKCkgKi8KKwlpZiAobm9zeW5jd2FpdCkKKwkJcmV0dXJuIGxzbjsKKworCS8qIGlmIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGZyb20gbGFzdCBzeW5jIHBvaW50IGlzIG1vcmUKKwkgKiB0aGFuIDEvNCBvZiB0aGUgbG9nIHNpemUsIHN0b3AgbmV3IHRyYW5zYWN0aW9ucyBmcm9tCisJICogc3RhcnRpbmcgdW50aWwgYWxsIGN1cnJlbnQgdHJhbnNhY3Rpb25zIGFyZSBjb21wbGV0ZWQKKwkgKiBieSBzZXR0aW5nIHN5bmNiYXJyaWVyIGZsYWcuCisJICovCisJaWYgKHdyaXR0ZW4gPiBMT0dTWU5DX0JBUlJJRVIobG9nc2l6ZSkgJiYgbG9nc2l6ZSA+IDMyICogTE9HUFNJWkUpIHsKKwkJc2V0X2JpdChsb2dfU1lOQ0JBUlJJRVIsICZsb2ctPmZsYWcpOworCQlqZnNfaW5mbygibG9nIGJhcnJpZXIgb246IGxzbj0weCV4IHN5bmNwdD0weCV4IiwgbHNuLAorCQkJIGxvZy0+c3luY3B0KTsKKwkJLyoKKwkJICogV2UgbWF5IGhhdmUgdG8gaW5pdGlhdGUgZ3JvdXAgY29tbWl0CisJCSAqLworCQlqZnNfZmx1c2hfam91cm5hbChsb2csIDApOworCX0KKworCXJldHVybiBsc247Cit9CisKKworLyoKKyAqIE5BTUU6CWxtTG9nT3BlbigpCisgKgorICogRlVOQ1RJT046ICAgIG9wZW4gdGhlIGxvZyBvbiBmaXJzdCBvcGVuOworICoJaW5zZXJ0IGZpbGVzeXN0ZW0gaW4gdGhlIGFjdGl2ZSBsaXN0IG9mIHRoZSBsb2cuCisgKgorICogUEFSQU1FVEVSOglpcG1udAktIGZpbGUgc3lzdGVtIG1vdW50IGlub2RlCisgKgkJaXBsb2cgCS0gbG9nIGlub2RlIChvdXQpCisgKgorICogUkVUVVJOOgorICoKKyAqIHNlcmlhbGl6YXRpb246CisgKi8KK2ludCBsbUxvZ09wZW4oc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgcmM7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwlzdHJ1Y3QgamZzX2xvZyAqbG9nOworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShzYik7CisKKwlpZiAoc2JpLT5mbGFnICYgSkZTX05PSU5URUdSSVRZKQorCQlyZXR1cm4gb3Blbl9kdW1teV9sb2coc2IpOworCQorCWlmIChzYmktPm1udGZsYWcgJiBKRlNfSU5MSU5FTE9HKQorCQlyZXR1cm4gb3Blbl9pbmxpbmVfbG9nKHNiKTsKKworCWRvd24oJmpmc19sb2dfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvZywgJmpmc19leHRlcm5hbF9sb2dzLCBqb3VybmFsX2xpc3QpIHsKKwkJaWYgKGxvZy0+YmRldi0+YmRfZGV2ID09IHNiaS0+bG9nZGV2KSB7CisJCQlpZiAobWVtY21wKGxvZy0+dXVpZCwgc2JpLT5sb2d1dWlkLAorCQkJCSAgIHNpemVvZihsb2ctPnV1aWQpKSkgeworCQkJCWpmc193YXJuKCJ3cm9uZyB1dWlkIG9uIEpGUyBqb3VybmFsXG4iKTsKKwkJCQl1cCgmamZzX2xvZ19zZW0pOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJLyoKKwkJCSAqIGFkZCBmaWxlIHN5c3RlbSB0byBsb2cgYWN0aXZlIGZpbGUgc3lzdGVtIGxpc3QKKwkJCSAqLworCQkJaWYgKChyYyA9IGxtTG9nRmlsZVN5c3RlbShsb2csIHNiaSwgMSkpKSB7CisJCQkJdXAoJmpmc19sb2dfc2VtKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisJCQlnb3RvIGpvdXJuYWxfZm91bmQ7CisJCX0KKwl9CisKKwlpZiAoIShsb2cgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgamZzX2xvZyksIEdGUF9LRVJORUwpKSkgeworCQl1cCgmamZzX2xvZ19zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGxvZywgMCwgc2l6ZW9mKHN0cnVjdCBqZnNfbG9nKSk7CisJSU5JVF9MSVNUX0hFQUQoJmxvZy0+c2JfbGlzdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbG9nLT5zeW5jd2FpdCk7CisKKwkvKgorCSAqICAgICAgZXh0ZXJuYWwgbG9nIGFzIHNlcGFyYXRlIGxvZ2ljYWwgdm9sdW1lCisJICoKKwkgKiBmaWxlIHN5c3RlbXMgdG8gbG9nIG1heSBoYXZlIG4tdG8tMSByZWxhdGlvbnNoaXA7CisJICovCisKKwliZGV2ID0gb3Blbl9ieV9kZXZudW0oc2JpLT5sb2dkZXYsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOworCWlmIChJU19FUlIoYmRldikpIHsKKwkJcmMgPSAtUFRSX0VSUihiZGV2KTsKKwkJZ290byBmcmVlOworCX0KKworCWlmICgocmMgPSBiZF9jbGFpbShiZGV2LCBsb2cpKSkgeworCQlnb3RvIGNsb3NlOworCX0KKworCWxvZy0+YmRldiA9IGJkZXY7CisJbWVtY3B5KGxvZy0+dXVpZCwgc2JpLT5sb2d1dWlkLCBzaXplb2YobG9nLT51dWlkKSk7CisJCisJLyoKKwkgKiBpbml0aWFsaXplIGxvZzoKKwkgKi8KKwlpZiAoKHJjID0gbG1Mb2dJbml0KGxvZykpKQorCQlnb3RvIHVuY2xhaW07CisKKwlsaXN0X2FkZCgmbG9nLT5qb3VybmFsX2xpc3QsICZqZnNfZXh0ZXJuYWxfbG9ncyk7CisKKwkvKgorCSAqIGFkZCBmaWxlIHN5c3RlbSB0byBsb2cgYWN0aXZlIGZpbGUgc3lzdGVtIGxpc3QKKwkgKi8KKwlpZiAoKHJjID0gbG1Mb2dGaWxlU3lzdGVtKGxvZywgc2JpLCAxKSkpCisJCWdvdG8gc2h1dGRvd247CisKK2pvdXJuYWxfZm91bmQ6CisJTE9HX0xPQ0sobG9nKTsKKwlsaXN0X2FkZCgmc2JpLT5sb2dfbGlzdCwgJmxvZy0+c2JfbGlzdCk7CisJc2JpLT5sb2cgPSBsb2c7CisJTE9HX1VOTE9DSyhsb2cpOworCisJdXAoJmpmc19sb2dfc2VtKTsKKwlyZXR1cm4gMDsKKworCS8qCisJICogICAgICB1bndpbmQgb24gZXJyb3IKKwkgKi8KKyAgICAgIHNodXRkb3duOgkJLyogdW53aW5kIGxibUxvZ0luaXQoKSAqLworCWxpc3RfZGVsKCZsb2ctPmpvdXJuYWxfbGlzdCk7CisJbGJtTG9nU2h1dGRvd24obG9nKTsKKworICAgICAgdW5jbGFpbToKKwliZF9yZWxlYXNlKGJkZXYpOworCisgICAgICBjbG9zZToJCS8qIGNsb3NlIGV4dGVybmFsIGxvZyBkZXZpY2UgKi8KKwlibGtkZXZfcHV0KGJkZXYpOworCisgICAgICBmcmVlOgkJLyogZnJlZSBsb2cgZGVzY3JpcHRvciAqLworCXVwKCZqZnNfbG9nX3NlbSk7CisJa2ZyZWUobG9nKTsKKworCWpmc193YXJuKCJsbUxvZ09wZW46IGV4aXQoJWQpIiwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBvcGVuX2lubGluZV9sb2coc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgamZzX2xvZyAqbG9nOworCWludCByYzsKKworCWlmICghKGxvZyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBqZnNfbG9nKSwgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQobG9nLCAwLCBzaXplb2Yoc3RydWN0IGpmc19sb2cpKTsKKwlJTklUX0xJU1RfSEVBRCgmbG9nLT5zYl9saXN0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZsb2ctPnN5bmN3YWl0KTsKKworCXNldF9iaXQobG9nX0lOTElORUxPRywgJmxvZy0+ZmxhZyk7CisJbG9nLT5iZGV2ID0gc2ItPnNfYmRldjsKKwlsb2ctPmJhc2UgPSBhZGRyZXNzUFhEKCZKRlNfU0JJKHNiKS0+bG9ncHhkKTsKKwlsb2ctPnNpemUgPSBsZW5ndGhQWEQoJkpGU19TQkkoc2IpLT5sb2dweGQpID4+CisJICAgIChMMkxPR1BTSVpFIC0gc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCWxvZy0+bDJic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCUFTU0VSVChMMkxPR1BTSVpFID49IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKworCS8qCisJICogaW5pdGlhbGl6ZSBsb2cuCisJICovCisJaWYgKChyYyA9IGxtTG9nSW5pdChsb2cpKSkgeworCQlrZnJlZShsb2cpOworCQlqZnNfd2FybigibG1Mb2dPcGVuOiBleGl0KCVkKSIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWxpc3RfYWRkKCZKRlNfU0JJKHNiKS0+bG9nX2xpc3QsICZsb2ctPnNiX2xpc3QpOworCUpGU19TQkkoc2IpLT5sb2cgPSBsb2c7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl9kdW1teV9sb2coc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgcmM7CisKKwlkb3duKCZqZnNfbG9nX3NlbSk7CisJaWYgKCFkdW1teV9sb2cpIHsKKwkJZHVtbXlfbG9nID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGpmc19sb2cpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkdW1teV9sb2cpIHsKKwkJCXVwKCZqZnNfbG9nX3NlbSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltZW1zZXQoZHVtbXlfbG9nLCAwLCBzaXplb2Yoc3RydWN0IGpmc19sb2cpKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmR1bW15X2xvZy0+c2JfbGlzdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmR1bW15X2xvZy0+c3luY3dhaXQpOworCQlkdW1teV9sb2ctPm5vX2ludGVncml0eSA9IDE7CisJCS8qIE1ha2UgdXAgc29tZSBzdHVmZiAqLworCQlkdW1teV9sb2ctPmJhc2UgPSAwOworCQlkdW1teV9sb2ctPnNpemUgPSAxMDI0OworCQlyYyA9IGxtTG9nSW5pdChkdW1teV9sb2cpOworCQlpZiAocmMpIHsKKwkJCWtmcmVlKGR1bW15X2xvZyk7CisJCQlkdW1teV9sb2cgPSBOVUxMOworCQkJdXAoJmpmc19sb2dfc2VtKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCUxPR19MT0NLKGR1bW15X2xvZyk7CisJbGlzdF9hZGQoJkpGU19TQkkoc2IpLT5sb2dfbGlzdCwgJmR1bW15X2xvZy0+c2JfbGlzdCk7CisJSkZTX1NCSShzYiktPmxvZyA9IGR1bW15X2xvZzsKKwlMT0dfVU5MT0NLKGR1bW15X2xvZyk7CisJdXAoJmpmc19sb2dfc2VtKTsKKworCXJldHVybiAwOworfQorCisvKgorICogTkFNRToJbG1Mb2dJbml0KCkKKyAqCisgKiBGVU5DVElPTjoJbG9nIGluaXRpYWxpemF0aW9uIGF0IGZpcnN0IGxvZyBvcGVuLgorICoKKyAqCWxvZ3JlZG8oKSAob3IgbG9nZm9ybWF0KCkpIHNob3VsZCBoYXZlIGJlZW4gcnVuIHByZXZpb3VzbHkuCisgKglpbml0aWFsaXplIHRoZSBsb2cgZnJvbSBsb2cgc3VwZXJibG9jay4KKyAqCXNldCB0aGUgbG9nIHN0YXRlIGluIHRoZSBzdXBlcmJsb2NrIHRvIExPR01PVU5UIGFuZAorICoJd3JpdGUgU1lOQ1BUIGxvZyByZWNvcmQuCisgKgkJCisgKiBQQVJBTUVURVI6CWxvZwktIGxvZyBzdHJ1Y3R1cmUKKyAqCisgKiBSRVRVUk46CTAJLSBpZiBvaworICoJCS1FSU5WQUwJLSBiYWQgbG9nIG1hZ2ljIG51bWJlciBvciBzdXBlcmJsb2NrIGRpcnR5CisgKgkJZXJyb3IgcmV0dXJuZWQgZnJvbSBsb2d3YWl0KCkKKyAqCQkJCisgKiBzZXJpYWxpemF0aW9uOiBzaW5nbGUgZmlyc3Qgb3BlbiB0aHJlYWQKKyAqLworaW50IGxtTG9nSW5pdChzdHJ1Y3QgamZzX2xvZyAqIGxvZykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBscmQgbHJkOworCXN0cnVjdCBsb2dzdXBlciAqbG9nc3VwZXI7CisJc3RydWN0IGxidWYgKmJwc3VwZXI7CisJc3RydWN0IGxidWYgKmJwOworCXN0cnVjdCBsb2dwYWdlICpscDsKKwlpbnQgbHNuID0gMDsKKworCWpmc19pbmZvKCJsbUxvZ0luaXQ6IGxvZzoweCVwIiwgbG9nKTsKKworCS8qIGluaXRpYWxpemUgdGhlIGdyb3VwIGNvbW1pdCBzZXJpYWxpemF0aW9uIGxvY2sgKi8KKwlMT0dHQ19MT0NLX0lOSVQobG9nKTsKKworCS8qIGFsbG9jYXRlL2luaXRpYWxpemUgdGhlIGxvZyB3cml0ZSBzZXJpYWxpemF0aW9uIGxvY2sgKi8KKwlMT0dfTE9DS19JTklUKGxvZyk7CisKKwlMT0dTWU5DX0xPQ0tfSU5JVChsb2cpOworCisJSU5JVF9MSVNUX0hFQUQoJmxvZy0+c3luY2xpc3QpOworCisJSU5JVF9MSVNUX0hFQUQoJmxvZy0+Y3F1ZXVlKTsKKwlsb2ctPmZsdXNoX3RibGsgPSBOVUxMOworCisJbG9nLT5jb3VudCA9IDA7CisKKwkvKgorCSAqIGluaXRpYWxpemUgbG9nIGkvbworCSAqLworCWlmICgocmMgPSBsYm1Mb2dJbml0KGxvZykpKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoIXRlc3RfYml0KGxvZ19JTkxJTkVMT0csICZsb2ctPmZsYWcpKQorCQlsb2ctPmwyYnNpemUgPSBMMkxPR1BTSVpFOworCQorCS8qIGNoZWNrIGZvciBkaXNhYmxlZCBqb3VybmFsaW5nIHRvIGRpc2sgKi8KKwlpZiAobG9nLT5ub19pbnRlZ3JpdHkpIHsKKwkJLyoKKwkJICogSm91cm5hbCBwYWdlcyB3aWxsIHN0aWxsIGJlIGZpbGxlZC4gIFdoZW4gdGhlIHRpbWUgY29tZXMKKwkJICogdG8gYWN0dWFsbHkgZG8gdGhlIEkvTywgdGhlIHdyaXRlIGlzIG5vdCBkb25lLCBhbmQgdGhlCisJCSAqIGVuZGlvIHJvdXRpbmUgaXMgY2FsbGVkIGRpcmVjdGx5LgorCQkgKi8KKwkJYnAgPSBsYm1BbGxvY2F0ZShsb2cgLCAwKTsKKwkJbG9nLT5icCA9IGJwOworCQlicC0+bF9wbiA9IGJwLT5sX2VvciA9IDA7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogdmFsaWRhdGUgbG9nIHN1cGVyYmxvY2sKKwkJICovCisJCWlmICgocmMgPSBsYm1SZWFkKGxvZywgMSwgJmJwc3VwZXIpKSkKKwkJCWdvdG8gZXJyb3V0MTA7CisKKwkJbG9nc3VwZXIgPSAoc3RydWN0IGxvZ3N1cGVyICopIGJwc3VwZXItPmxfbGRhdGE7CisKKwkJaWYgKGxvZ3N1cGVyLT5tYWdpYyAhPSBjcHVfdG9fbGUzMihMT0dNQUdJQykpIHsKKwkJCWpmc193YXJuKCIqKiogTG9nIEZvcm1hdCBFcnJvciAhICoqKiIpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBlcnJvdXQyMDsKKwkJfQorCisJCS8qIGxvZ3JlZG8oKSBzaG91bGQgaGF2ZSBiZWVuIHJ1biBzdWNjZXNzZnVsbHkuICovCisJCWlmIChsb2dzdXBlci0+c3RhdGUgIT0gY3B1X3RvX2xlMzIoTE9HUkVET05FKSkgeworCQkJamZzX3dhcm4oIioqKiBMb2cgSXMgRGlydHkgISAqKioiKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3V0MjA7CisJCX0KKworCQkvKiBpbml0aWFsaXplIGxvZyBmcm9tIGxvZyBzdXBlcmJsb2NrICovCisJCWlmICh0ZXN0X2JpdChsb2dfSU5MSU5FTE9HLCZsb2ctPmZsYWcpKSB7CisJCQlpZiAobG9nLT5zaXplICE9IGxlMzJfdG9fY3B1KGxvZ3N1cGVyLT5zaXplKSkgeworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycm91dDIwOworCQkJfQorCQkJamZzX2luZm8oImxtTG9nSW5pdDogaW5saW5lIGxvZzoweCVwIGJhc2U6MHglTHggIgorCQkJCSAic2l6ZToweCV4IiwgbG9nLAorCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBsb2ctPmJhc2UsIGxvZy0+c2l6ZSk7CisJCX0gZWxzZSB7CisJCQlpZiAobWVtY21wKGxvZ3N1cGVyLT51dWlkLCBsb2ctPnV1aWQsIDE2KSkgeworCQkJCWpmc193YXJuKCJ3cm9uZyB1dWlkIG9uIEpGUyBsb2cgZGV2aWNlIik7CisJCQkJZ290byBlcnJvdXQyMDsKKwkJCX0KKwkJCWxvZy0+c2l6ZSA9IGxlMzJfdG9fY3B1KGxvZ3N1cGVyLT5zaXplKTsKKwkJCWxvZy0+bDJic2l6ZSA9IGxlMzJfdG9fY3B1KGxvZ3N1cGVyLT5sMmJzaXplKTsKKwkJCWpmc19pbmZvKCJsbUxvZ0luaXQ6IGV4dGVybmFsIGxvZzoweCVwIGJhc2U6MHglTHggIgorCQkJCSAic2l6ZToweCV4IiwgbG9nLAorCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBsb2ctPmJhc2UsIGxvZy0+c2l6ZSk7CisJCX0KKworCQlsb2ctPnBhZ2UgPSBsZTMyX3RvX2NwdShsb2dzdXBlci0+ZW5kKSAvIExPR1BTSVpFOworCQlsb2ctPmVvciA9IGxlMzJfdG9fY3B1KGxvZ3N1cGVyLT5lbmQpIC0gKExPR1BTSVpFICogbG9nLT5wYWdlKTsKKworCQkvKgorCQkgKiBpbml0aWFsaXplIGZvciBsb2cgYXBwZW5kIHdyaXRlIG1vZGUKKwkJICovCisJCS8qIGVzdGFibGlzaCBjdXJyZW50L2VuZC1vZi1sb2cgcGFnZS9idWZmZXIgKi8KKwkJaWYgKChyYyA9IGxibVJlYWQobG9nLCBsb2ctPnBhZ2UsICZicCkpKQorCQkJZ290byBlcnJvdXQyMDsKKworCQlscCA9IChzdHJ1Y3QgbG9ncGFnZSAqKSBicC0+bF9sZGF0YTsKKworCQlqZnNfaW5mbygibG1Mb2dJbml0OiBsc246MHgleCBwYWdlOiVkIGVvcjolZDolZCIsCisJCQkgbGUzMl90b19jcHUobG9nc3VwZXItPmVuZCksIGxvZy0+cGFnZSwgbG9nLT5lb3IsCisJCQkgbGUxNl90b19jcHUobHAtPmguZW9yKSk7CisKKwkJbG9nLT5icCA9IGJwOworCQlicC0+bF9wbiA9IGxvZy0+cGFnZTsKKwkJYnAtPmxfZW9yID0gbG9nLT5lb3I7CisKKwkJLyogaWYgY3VycmVudCBwYWdlIGlzIGZ1bGwsIG1vdmUgb24gdG8gbmV4dCBwYWdlICovCisJCWlmIChsb2ctPmVvciA+PSBMT0dQU0laRSAtIExPR1BUTFJTSVpFKQorCQkJbG1OZXh0UGFnZShsb2cpOworCisJCS8qCisJCSAqIGluaXRpYWxpemUgbG9nIHN5bmNwb2ludAorCQkgKi8KKwkJLyoKKwkJICogd3JpdGUgdGhlIGZpcnN0IFNZTkNQVCByZWNvcmQgd2l0aCBzeW5jcG9pbnQgPSAwCisJCSAqIChpLmUuLCBsb2cgcmVkbyB1cCB0byBIRVJFICEpOworCQkgKiByZW1vdmUgY3VycmVudCBwYWdlIGZyb20gbGJtIHdyaXRlIHF1ZXVlIGF0IGVuZCBvZiBwYWdlb3V0CisJCSAqICh0byB3cml0ZSBsb2cgc3VwZXJibG9jayB1cGRhdGUpLCBidXQgZG8gbm90IHJlbGVhc2UgdG8KKwkJICogZnJlZWxpc3Q7CisJCSAqLworCQlscmQubG9ndGlkID0gMDsKKwkJbHJkLmJhY2tjaGFpbiA9IDA7CisJCWxyZC50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1NZTkNQVCk7CisJCWxyZC5sZW5ndGggPSAwOworCQlscmQubG9nLnN5bmNwdC5zeW5jID0gMDsKKwkJbHNuID0gbG1Xcml0ZVJlY29yZChsb2csIE5VTEwsICZscmQsIE5VTEwpOworCQlicCA9IGxvZy0+YnA7CisJCWJwLT5sX2Nlb3IgPSBicC0+bF9lb3I7CisJCWxwID0gKHN0cnVjdCBsb2dwYWdlICopIGJwLT5sX2xkYXRhOworCQlscC0+aC5lb3IgPSBscC0+dC5lb3IgPSBjcHVfdG9fbGUxNihicC0+bF9lb3IpOworCQlsYm1Xcml0ZShsb2csIGJwLCBsYm1XUklURSB8IGxibVNZTkMsIDApOworCQlpZiAoKHJjID0gbGJtSU9XYWl0KGJwLCAwKSkpCisJCQlnb3RvIGVycm91dDMwOworCisJCS8qCisJCSAqIHVwZGF0ZS93cml0ZSBzdXBlcmJsb2NrCisJCSAqLworCQlsb2dzdXBlci0+c3RhdGUgPSBjcHVfdG9fbGUzMihMT0dNT1VOVCk7CisJCWxvZy0+c2VyaWFsID0gbGUzMl90b19jcHUobG9nc3VwZXItPnNlcmlhbCkgKyAxOworCQlsb2dzdXBlci0+c2VyaWFsID0gY3B1X3RvX2xlMzIobG9nLT5zZXJpYWwpOworCQlsYm1EaXJlY3RXcml0ZShsb2csIGJwc3VwZXIsIGxibVdSSVRFIHwgbGJtUkVMRUFTRSB8IGxibVNZTkMpOworCQlpZiAoKHJjID0gbGJtSU9XYWl0KGJwc3VwZXIsIGxibUZSRUUpKSkKKwkJCWdvdG8gZXJyb3V0MzA7CisJfQorCisJLyogaW5pdGlhbGl6ZSBsb2dzeW5jIHBhcmFtZXRlcnMgKi8KKwlsb2ctPmxvZ3NpemUgPSAobG9nLT5zaXplIC0gMikgPDwgTDJMT0dQU0laRTsKKwlsb2ctPmxzbiA9IGxzbjsKKwlsb2ctPnN5bmNwdCA9IGxzbjsKKwlsb2ctPnN5bmMgPSBsb2ctPnN5bmNwdDsKKwlsb2ctPm5leHRzeW5jID0gTE9HU1lOQ19ERUxUQShsb2ctPmxvZ3NpemUpOworCisJamZzX2luZm8oImxtTG9nSW5pdDogbHNuOjB4JXggc3luY3B0OjB4JXggc3luYzoweCV4IiwKKwkJIGxvZy0+bHNuLCBsb2ctPnN5bmNwdCwgbG9nLT5zeW5jKTsKKworCS8qCisJICogaW5pdGlhbGl6ZSBmb3IgbGF6eS9ncm91cCBjb21taXQKKwkgKi8KKwlsb2ctPmNsc24gPSBsc247CisKKwlyZXR1cm4gMDsKKworCS8qCisJICogICAgICB1bndpbmQgb24gZXJyb3IKKwkgKi8KKyAgICAgIGVycm91dDMwOgkJLyogcmVsZWFzZSBsb2cgcGFnZSAqLworCWxvZy0+d3F1ZXVlID0gTlVMTDsKKwlicC0+bF93cW5leHQgPSBOVUxMOworCWxibUZyZWUoYnApOworCisgICAgICBlcnJvdXQyMDoJCS8qIHJlbGVhc2UgbG9nIHN1cGVyYmxvY2sgKi8KKwlsYm1GcmVlKGJwc3VwZXIpOworCisgICAgICBlcnJvdXQxMDoJCS8qIHVud2luZCBsYm1Mb2dJbml0KCkgKi8KKwlsYm1Mb2dTaHV0ZG93bihsb2cpOworCisJamZzX3dhcm4oImxtTG9nSW5pdDogZXhpdCglZCkiLCByYyk7CisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKiBOQU1FOglsbUxvZ0Nsb3NlKCkKKyAqCisgKiBGVU5DVElPTjoJcmVtb3ZlIGZpbGUgc3lzdGVtIDxpcG1udD4gZnJvbSBhY3RpdmUgbGlzdCBvZiBsb2cgPGlwbG9nPgorICoJCWFuZCBjbG9zZSBpdCBvbiBsYXN0IGNsb3NlLgorICoKKyAqIFBBUkFNRVRFUjoJc2IJLSBzdXBlcmJsb2NrCisgKgorICogUkVUVVJOOgllcnJvcnMgZnJvbSBzdWJyb3V0aW5lcworICoKKyAqIHNlcmlhbGl6YXRpb246CisgKi8KK2ludCBsbUxvZ0Nsb3NlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGpmc19zYl9pbmZvICpzYmkgPSBKRlNfU0JJKHNiKTsKKwlzdHJ1Y3QgamZzX2xvZyAqbG9nID0gc2JpLT5sb2c7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwlpbnQgcmMgPSAwOworCisJamZzX2luZm8oImxtTG9nQ2xvc2U6IGxvZzoweCVwIiwgbG9nKTsKKworCWRvd24oJmpmc19sb2dfc2VtKTsKKwlMT0dfTE9DSyhsb2cpOworCWxpc3RfZGVsKCZzYmktPmxvZ19saXN0KTsKKwlMT0dfVU5MT0NLKGxvZyk7CisJc2JpLT5sb2cgPSBOVUxMOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSBhbGwgb2YgdGhlICJ3cml0dGVuIiBtZXRhcGFnZXMKKwkgKiBhY3R1YWxseSBtYWtlIGl0IHRvIGRpc2sKKwkgKi8KKwlzeW5jX2Jsb2NrZGV2KHNiLT5zX2JkZXYpOworCisJaWYgKHRlc3RfYml0KGxvZ19JTkxJTkVMT0csICZsb2ctPmZsYWcpKSB7CisJCS8qCisJCSAqICAgICAgaW4tbGluZSBsb2cgaW4gaG9zdCBmaWxlIHN5c3RlbQorCQkgKi8KKwkJcmMgPSBsbUxvZ1NodXRkb3duKGxvZyk7CisJCWtmcmVlKGxvZyk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghbG9nLT5ub19pbnRlZ3JpdHkpCisJCWxtTG9nRmlsZVN5c3RlbShsb2csIHNiaSwgMCk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmxvZy0+c2JfbGlzdCkpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBUT0RPOiBlbnN1cmUgdGhhdCB0aGUgZHVtbXlfbG9nIGlzIGluIGEgc3RhdGUgdG8gYWxsb3cKKwkgKiBsYm1Mb2dTaHV0ZG93biB0byBkZWFsbG9jYXRlIGFsbCB0aGUgYnVmZmVycyBhbmQgY2FsbAorCSAqIGtmcmVlIGFnYWluc3QgZHVtbXlfbG9nLiAgRm9yIG5vdywgbGVhdmUgZHVtbXlfbG9nICYgaXRzCisJICogYnVmZmVycyBpbiBtZW1vcnksIGFuZCByZXN1c2UgaWYgYW5vdGhlciBuby1pbnRlZ3JpdHkgbW91bnQKKwkgKiBpcyByZXF1ZXN0ZWQuCisJICovCisJaWYgKGxvZy0+bm9faW50ZWdyaXR5KQorCQlnb3RvIG91dDsKKworCS8qCisJICogICAgICBleHRlcm5hbCBsb2cgYXMgc2VwYXJhdGUgbG9naWNhbCB2b2x1bWUKKwkgKi8KKwlsaXN0X2RlbCgmbG9nLT5qb3VybmFsX2xpc3QpOworCWJkZXYgPSBsb2ctPmJkZXY7CisJcmMgPSBsbUxvZ1NodXRkb3duKGxvZyk7CisKKwliZF9yZWxlYXNlKGJkZXYpOworCWJsa2Rldl9wdXQoYmRldik7CisKKwlrZnJlZShsb2cpOworCisgICAgICBvdXQ6CisJdXAoJmpmc19sb2dfc2VtKTsKKwlqZnNfaW5mbygibG1Mb2dDbG9zZTogZXhpdCglZCkiLCByYyk7CisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKiBOQU1FOglqZnNfZmx1c2hfam91cm5hbCgpCisgKgorICogRlVOQ1RJT046CWluaXRpYXRlIHdyaXRlIG9mIGFueSBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbnMgdG8gdGhlIGpvdXJuYWwKKyAqCQlhbmQgb3B0aW9uYWxseSB3YWl0IHVudGlsIHRoZXkgYXJlIGFsbCB3cml0dGVuIHRvIGRpc2sKKyAqCisgKgkJd2FpdCA9PSAwICBmbHVzaCB1bnRpbCBsYXRlc3QgdHhuIGlzIGNvbW1pdHRlZCwgZG9uJ3Qgd2FpdAorICoJCXdhaXQgPT0gMSAgZmx1c2ggdW50aWwgbGF0ZXN0IHR4biBpcyBjb21taXR0ZWQsIHdhaXQKKyAqCQl3YWl0ID4gMSAgIGZsdXNoIHVudGlsIGFsbCB0eG4ncyBhcmUgY29tcGxldGUsIHdhaXQKKyAqLwordm9pZCBqZnNfZmx1c2hfam91cm5hbChzdHJ1Y3QgamZzX2xvZyAqbG9nLCBpbnQgd2FpdCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdGJsb2NrICp0YXJnZXQgPSBOVUxMOworCisJLyogamZzX3dyaXRlX2lub2RlIG1heSBjYWxsIHVzIGR1cmluZyByZWFkLW9ubHkgbW91bnQgKi8KKwlpZiAoIWxvZykKKwkJcmV0dXJuOworCisJamZzX2luZm8oImpmc19mbHVzaF9qb3VybmFsOiBsb2c6MHglcCB3YWl0PSVkIiwgbG9nLCB3YWl0KTsKKworCUxPR0dDX0xPQ0sobG9nKTsKKworCWlmICghbGlzdF9lbXB0eSgmbG9nLT5jcXVldWUpKSB7CisJCS8qCisJCSAqIFRoaXMgZW5zdXJlcyB0aGF0IHdlIHdpbGwga2VlcCB3cml0aW5nIHRvIHRoZSBqb3VybmFsIGFzIGxvbmcKKwkJICogYXMgdGhlcmUgYXJlIHVud3JpdHRlbiBjb21taXQgcmVjb3JkcworCQkgKi8KKwkJdGFyZ2V0ID0gbGlzdF9lbnRyeShsb2ctPmNxdWV1ZS5wcmV2LCBzdHJ1Y3QgdGJsb2NrLCBjcXVldWUpOworCisJCWlmICh0ZXN0X2JpdChsb2dfRkxVU0gsICZsb2ctPmZsYWcpKSB7CisJCQkvKgorCQkJICogV2UncmUgYWxyZWFkeSBmbHVzaGluZy4KKwkJCSAqIGlmIGZsdXNoX3RibGsgaXMgTlVMTCwgd2UgYXJlIGZsdXNoaW5nIGV2ZXJ5dGhpbmcsCisJCQkgKiBzbyBsZWF2ZSBpdCB0aGF0IHdheS4gIE90aGVyd2lzZSwgdXBkYXRlIGl0IHRvIHRoZQorCQkJICogbGF0ZXN0IHRyYW5zYWN0aW9uCisJCQkgKi8KKwkJCWlmIChsb2ctPmZsdXNoX3RibGspCisJCQkJbG9nLT5mbHVzaF90YmxrID0gdGFyZ2V0OworCQl9IGVsc2UgeworCQkJLyogT25seSBmbHVzaCB1bnRpbCBsYXRlc3QgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkICovCisJCQlsb2ctPmZsdXNoX3RibGsgPSB0YXJnZXQ7CisJCQlzZXRfYml0KGxvZ19GTFVTSCwgJmxvZy0+ZmxhZyk7CisKKwkJCS8qCisJCQkgKiBJbml0aWF0ZSBJL08gb24gb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb25zCisJCQkgKi8KKwkJCWlmICghKGxvZy0+Y2ZsYWcgJiBsb2dHQ19QQUdFT1VUKSkgeworCQkJCWxvZy0+Y2ZsYWcgfD0gbG9nR0NfUEFHRU9VVDsKKwkJCQlsbUdDd3JpdGUobG9nLCAwKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoKHdhaXQgPiAxKSB8fCB0ZXN0X2JpdChsb2dfU1lOQ0JBUlJJRVIsICZsb2ctPmZsYWcpKSB7CisJCS8qIEZsdXNoIHVudGlsIGFsbCBhY3Rpdml0eSBjb21wbGV0ZSAqLworCQlzZXRfYml0KGxvZ19GTFVTSCwgJmxvZy0+ZmxhZyk7CisJCWxvZy0+Zmx1c2hfdGJsayA9IE5VTEw7CisJfQorCisJaWYgKHdhaXQgJiYgdGFyZ2V0ICYmICEodGFyZ2V0LT5mbGFnICYgdGJsa0dDX0NPTU1JVFRFRCkpIHsKKwkJREVDTEFSRV9XQUlUUVVFVUUoX193YWl0LCBjdXJyZW50KTsKKworCQlhZGRfd2FpdF9xdWV1ZSgmdGFyZ2V0LT5nY3dhaXQsICZfX3dhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCUxPR0dDX1VOTE9DSyhsb2cpOworCQlzY2hlZHVsZSgpOworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJTE9HR0NfTE9DSyhsb2cpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmdGFyZ2V0LT5nY3dhaXQsICZfX3dhaXQpOworCX0KKwlMT0dHQ19VTkxPQ0sobG9nKTsKKworCWlmICh3YWl0IDwgMikKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJZiB0aGVyZSB3YXMgcmVjZW50IGFjdGl2aXR5LCB3ZSBtYXkgbmVlZCB0byB3YWl0CisJICogZm9yIHRoZSBsYXp5Y29tbWl0IHRocmVhZCB0byBjYXRjaCB1cAorCSAqLworCWlmICgoIWxpc3RfZW1wdHkoJmxvZy0+Y3F1ZXVlKSkgfHwgIWxpc3RfZW1wdHkoJmxvZy0+c3luY2xpc3QpKSB7CisJCWZvciAoaSA9IDA7IGkgPCA4MDA7IGkrKykgewkvKiBUb28gbXVjaD8gKi8KKwkJCW1zbGVlcCgyNTApOworCQkJaWYgKGxpc3RfZW1wdHkoJmxvZy0+Y3F1ZXVlKSAmJgorCQkJICAgIGxpc3RfZW1wdHkoJmxvZy0+c3luY2xpc3QpKQorCQkJCWJyZWFrOworCQl9CisJfQorCWFzc2VydChsaXN0X2VtcHR5KCZsb2ctPmNxdWV1ZSkpOworCWFzc2VydChsaXN0X2VtcHR5KCZsb2ctPnN5bmNsaXN0KSk7CisJY2xlYXJfYml0KGxvZ19GTFVTSCwgJmxvZy0+ZmxhZyk7Cit9CisKKy8qCisgKiBOQU1FOglsbUxvZ1NodXRkb3duKCkKKyAqCisgKiBGVU5DVElPTjoJbG9nIHNodXRkb3duIGF0IGxhc3QgTG9nQ2xvc2UoKS4KKyAqCisgKgkJd3JpdGUgbG9nIHN5bmNwdCByZWNvcmQuCisgKgkJdXBkYXRlIHN1cGVyIGJsb2NrIHRvIHNldCByZWRvbmUgZmxhZyB0byAwLgorICoKKyAqIFBBUkFNRVRFUjoJbG9nCS0gbG9nIGlub2RlCisgKgorICogUkVUVVJOOgkwCS0gc3VjY2VzcworICoJCQkKKyAqIHNlcmlhbGl6YXRpb246IHNpbmdsZSBsYXN0IGNsb3NlIHRocmVhZAorICovCitpbnQgbG1Mb2dTaHV0ZG93bihzdHJ1Y3QgamZzX2xvZyAqIGxvZykKK3sKKwlpbnQgcmM7CisJc3RydWN0IGxyZCBscmQ7CisJaW50IGxzbjsKKwlzdHJ1Y3QgbG9nc3VwZXIgKmxvZ3N1cGVyOworCXN0cnVjdCBsYnVmICpicHN1cGVyOworCXN0cnVjdCBsYnVmICpicDsKKwlzdHJ1Y3QgbG9ncGFnZSAqbHA7CisKKwlqZnNfaW5mbygibG1Mb2dTaHV0ZG93bjogbG9nOjB4JXAiLCBsb2cpOworCisJamZzX2ZsdXNoX2pvdXJuYWwobG9nLCAyKTsKKworCS8qCisJICogd3JpdGUgdGhlIGxhc3QgU1lOQ1BUIHJlY29yZCB3aXRoIHN5bmNwb2ludCA9IDAKKwkgKiAoaS5lLiwgbG9nIHJlZG8gdXAgdG8gSEVSRSAhKQorCSAqLworCWxyZC5sb2d0aWQgPSAwOworCWxyZC5iYWNrY2hhaW4gPSAwOworCWxyZC50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1NZTkNQVCk7CisJbHJkLmxlbmd0aCA9IDA7CisJbHJkLmxvZy5zeW5jcHQuc3luYyA9IDA7CisJCisJbHNuID0gbG1Xcml0ZVJlY29yZChsb2csIE5VTEwsICZscmQsIE5VTEwpOworCWJwID0gbG9nLT5icDsKKwlscCA9IChzdHJ1Y3QgbG9ncGFnZSAqKSBicC0+bF9sZGF0YTsKKwlscC0+aC5lb3IgPSBscC0+dC5lb3IgPSBjcHVfdG9fbGUxNihicC0+bF9lb3IpOworCWxibVdyaXRlKGxvZywgbG9nLT5icCwgbGJtV1JJVEUgfCBsYm1SRUxFQVNFIHwgbGJtU1lOQywgMCk7CisJbGJtSU9XYWl0KGxvZy0+YnAsIGxibUZSRUUpOworCisJLyoKKwkgKiBzeW5jaHJvbm91cyB1cGRhdGUgbG9nIHN1cGVyYmxvY2sKKwkgKiBtYXJrIGxvZyBzdGF0ZSBhcyBzaHV0ZG93biBjbGVhbmx5CisJICogKGkuZS4sIExvZyBkb2VzIG5vdCBuZWVkIHRvIGJlIHJlcGxheWVkKS4KKwkgKi8KKwlpZiAoKHJjID0gbGJtUmVhZChsb2csIDEsICZicHN1cGVyKSkpCisJCWdvdG8gb3V0OworCisJbG9nc3VwZXIgPSAoc3RydWN0IGxvZ3N1cGVyICopIGJwc3VwZXItPmxfbGRhdGE7CisJbG9nc3VwZXItPnN0YXRlID0gY3B1X3RvX2xlMzIoTE9HUkVET05FKTsKKwlsb2dzdXBlci0+ZW5kID0gY3B1X3RvX2xlMzIobHNuKTsKKwlsYm1EaXJlY3RXcml0ZShsb2csIGJwc3VwZXIsIGxibVdSSVRFIHwgbGJtUkVMRUFTRSB8IGxibVNZTkMpOworCXJjID0gbGJtSU9XYWl0KGJwc3VwZXIsIGxibUZSRUUpOworCisJamZzX2luZm8oImxtTG9nU2h1dGRvd246IGxzbjoweCV4IHBhZ2U6JWQgZW9yOiVkIiwKKwkJIGxzbiwgbG9nLT5wYWdlLCBsb2ctPmVvcik7CisKKyAgICAgIG91dDogICAgCisJLyoKKwkgKiBzaHV0ZG93biBwZXIgbG9nIGkvbworCSAqLworCWxibUxvZ1NodXRkb3duKGxvZyk7CisKKwlpZiAocmMpIHsKKwkJamZzX3dhcm4oImxtTG9nU2h1dGRvd246IGV4aXQoJWQpIiwgcmMpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKworLyoKKyAqIE5BTUU6CWxtTG9nRmlsZVN5c3RlbSgpCisgKgorICogRlVOQ1RJT046CWluc2VydCAoPGFjdGl2YXRlPiA9IHRydWUpL3JlbW92ZSAoPGFjdGl2YXRlPiA9IGZhbHNlKQorICoJZmlsZSBzeXN0ZW0gaW50by9mcm9tIGxvZyBhY3RpdmUgZmlsZSBzeXN0ZW0gbGlzdC4KKyAqCisgKiBQQVJBTUVURToJbG9nCS0gcG9pbnRlciB0byBsb2dzIGlub2RlLgorICoJCWZzZGV2CS0ga2Rldl90IG9mIGZpbGVzeXN0ZW0uCisgKgkJc2VyaWFsICAtIHBvaW50ZXIgdG8gcmV0dXJuZWQgbG9nIHNlcmlhbCBudW1iZXIKKyAqCQlhY3RpdmF0ZSAtIGluc2VydC9yZW1vdmUgZGV2aWNlIGZyb20gYWN0aXZlIGxpc3QuCisgKgorICogUkVUVVJOOgkwCS0gc3VjY2VzcworICoJCWVycm9ycyByZXR1cm5lZCBieSB2bXNfaW93YWl0KCkuCisgKi8KK3N0YXRpYyBpbnQgbG1Mb2dGaWxlU3lzdGVtKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSwKKwkJCSAgIGludCBhY3RpdmF0ZSkKK3sKKwlpbnQgcmMgPSAwOworCWludCBpOworCXN0cnVjdCBsb2dzdXBlciAqbG9nc3VwZXI7CisJc3RydWN0IGxidWYgKmJwc3VwZXI7CisJY2hhciAqdXVpZCA9IHNiaS0+dXVpZDsKKworCS8qCisJICogaW5zZXJ0L3JlbW92ZSBmaWxlIHN5c3RlbSBkZXZpY2UgdG8gbG9nIGFjdGl2ZSBmaWxlIHN5c3RlbSBsaXN0LgorCSAqLworCWlmICgocmMgPSBsYm1SZWFkKGxvZywgMSwgJmJwc3VwZXIpKSkKKwkJcmV0dXJuIHJjOworCisJbG9nc3VwZXIgPSAoc3RydWN0IGxvZ3N1cGVyICopIGJwc3VwZXItPmxfbGRhdGE7CisJaWYgKGFjdGl2YXRlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQUNUSVZFOyBpKyspCisJCQlpZiAoIW1lbWNtcChsb2dzdXBlci0+YWN0aXZlW2ldLnV1aWQsIE5VTExfVVVJRCwgMTYpKSB7CisJCQkJbWVtY3B5KGxvZ3N1cGVyLT5hY3RpdmVbaV0udXVpZCwgdXVpZCwgMTYpOworCQkJCXNiaS0+YWdncmVnYXRlID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJaWYgKGkgPT0gTUFYX0FDVElWRSkgeworCQkJamZzX3dhcm4oIlRvbyBtYW55IGZpbGUgc3lzdGVtcyBzaGFyaW5nIGpvdXJuYWwhIik7CisJCQlsYm1GcmVlKGJwc3VwZXIpOworCQkJcmV0dXJuIC1FTUZJTEU7CS8qIElzIHRoZXJlIGEgYmV0dGVyIHJjPyAqLworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9BQ1RJVkU7IGkrKykKKwkJCWlmICghbWVtY21wKGxvZ3N1cGVyLT5hY3RpdmVbaV0udXVpZCwgdXVpZCwgMTYpKSB7CisJCQkJbWVtY3B5KGxvZ3N1cGVyLT5hY3RpdmVbaV0udXVpZCwgTlVMTF9VVUlELCAxNik7CisJCQkJYnJlYWs7CisJCQl9CisJCWlmIChpID09IE1BWF9BQ1RJVkUpIHsKKwkJCWpmc193YXJuKCJTb21lYm9keSBzdG9tcGVkIG9uIHRoZSBqb3VybmFsISIpOworCQkJbGJtRnJlZShicHN1cGVyKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCQorCX0KKworCS8qCisJICogc3luY2hyb25vdXMgd3JpdGUgbG9nIHN1cGVyYmxvY2s6CisJICoKKwkgKiB3cml0ZSBzaWRlc3RyZWFtIGJ5cGFzc2luZyB3cml0ZSBxdWV1ZToKKwkgKiBhdCBmaWxlIHN5c3RlbSBtb3VudCwgbG9nIHN1cGVyIGJsb2NrIGlzIHVwZGF0ZWQgZm9yCisJICogYWN0aXZhdGlvbiBvZiB0aGUgZmlsZSBzeXN0ZW0gYmVmb3JlIGFueSBsb2cgcmVjb3JkCisJICogKE1PVU5UIHJlY29yZCkgb2YgdGhlIGZpbGUgc3lzdGVtLCBhbmQgYXQgZmlsZSBzeXN0ZW0KKwkgKiB1bm1vdW50LCBhbGwgbWV0YSBkYXRhIGZvciB0aGUgZmlsZSBzeXN0ZW0gaGFzIGJlZW4KKwkgKiBmbHVzaGVkIGJlZm9yZSBsb2cgc3VwZXIgYmxvY2sgaXMgdXBkYXRlZCBmb3IgZGVhY3RpdmF0aW9uCisJICogb2YgdGhlIGZpbGUgc3lzdGVtLgorCSAqLworCWxibURpcmVjdFdyaXRlKGxvZywgYnBzdXBlciwgbGJtV1JJVEUgfCBsYm1SRUxFQVNFIHwgbGJtU1lOQyk7CisJcmMgPSBsYm1JT1dhaXQoYnBzdXBlciwgbGJtRlJFRSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKgkJbG9nIGJ1ZmZlciBtYW5hZ2VyIChsYm0pCisgKgkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogc3BlY2lhbCBwdXJwb3NlIGJ1ZmZlciBtYW5hZ2VyIHN1cHBvcnRpbmcgbG9nIGkvbyByZXF1aXJlbWVudHMuCisgKgorICogcGVyIGxvZyB3cml0ZSBxdWV1ZToKKyAqIGxvZyBwYWdlb3V0IG9jY3VycyBpbiBzZXJpYWwgb3JkZXIgYnkgZmlmbyB3cml0ZSBxdWV1ZSBhbmQKKyAqIHJlc3RyaWN0aW5nIHRvIGEgc2luZ2xlIGkvbyBpbiBwcmVncmVzcyBhdCBhbnkgb25lIHRpbWUuCisgKiBhIGNpcmN1bGFyIHNpbmdseS1saW5rZWQgbGlzdAorICogKGxvZy0+d3JxdWV1ZSBwb2ludHMgdG8gdGhlIHRhaWwsIGFuZCBidWZmZXJzIGFyZSBsaW5rZWQgdmlhCisgKiBicC0+d3JxdWV1ZSBmaWVsZCksIGFuZAorICogbWFpbnRhaW5zIGxvZyBwYWdlIGluIHBhZ2VvdXQgb3Qgd2FpdGluZyBmb3IgcGFnZW91dCBpbiBzZXJpYWwgcGFnZW91dC4KKyAqLworCisvKgorICoJbGJtTG9nSW5pdCgpCisgKgorICogaW5pdGlhbGl6ZSBwZXIgbG9nIEkvTyBzZXR1cCBhdCBsbUxvZ0luaXQoKQorICovCitzdGF0aWMgaW50IGxibUxvZ0luaXQoc3RydWN0IGpmc19sb2cgKiBsb2cpCit7CQkJCS8qIGxvZyBpbm9kZSAqLworCWludCBpOworCXN0cnVjdCBsYnVmICpsYnVmOworCisJamZzX2luZm8oImxibUxvZ0luaXQ6IGxvZzoweCVwIiwgbG9nKTsKKworCS8qIGluaXRpYWxpemUgY3VycmVudCBidWZmZXIgY3Vyc29yICovCisJbG9nLT5icCA9IE5VTEw7CisKKwkvKiBpbml0aWFsaXplIGxvZyBkZXZpY2Ugd3JpdGUgcXVldWUgKi8KKwlsb2ctPndxdWV1ZSA9IE5VTEw7CisKKwkvKgorCSAqIEVhY2ggbG9nIGhhcyBpdHMgb3duIGJ1ZmZlciBwYWdlcyBhbGxvY2F0ZWQgdG8gaXQuICBUaGVzZSBhcmUKKwkgKiBub3QgbWFuYWdlZCBieSB0aGUgcGFnZSBjYWNoZS4gIFRoaXMgZW5zdXJlcyB0aGF0IGEgdHJhbnNhY3Rpb24KKwkgKiB3cml0aW5nIHRvIHRoZSBsb2cgZG9lcyBub3QgYmxvY2sgdHJ5aW5nIHRvIGFsbG9jYXRlIGEgcGFnZSBmcm9tCisJICogdGhlIHBhZ2UgY2FjaGUgKGZvciB0aGUgbG9nKS4gIFRoaXMgd291bGQgYmUgYmFkLCBzaW5jZSBwYWdlCisJICogYWxsb2NhdGlvbiB3YWl0cyBvbiB0aGUga3N3YXBkIHRocmVhZCB0aGF0IG1heSBiZSBjb21taXR0aW5nIGlub2RlcworCSAqIHdoaWNoIHdvdWxkIGNhdXNlIGxvZyBhY3Rpdml0eS4gIFdhcyB0aGF0IGNsZWFyPyAgSSdtIHRyeWluZyB0bworCSAqIGF2b2lkIGRlYWRsb2NrIGhlcmUuCisJICovCisJaW5pdF93YWl0cXVldWVfaGVhZCgmbG9nLT5mcmVlX3dhaXQpOworCisJbG9nLT5sYnVmX2ZyZWUgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IExPR1BBR0VTOyBpKyspIHsKKwkJbGJ1ZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsYnVmKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChsYnVmID09IDApCisJCQlnb3RvIGVycm9yOworCQlsYnVmLT5sX2xkYXRhID0gKGNoYXIgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAobGJ1Zi0+bF9sZGF0YSA9PSAwKSB7CisJCQlrZnJlZShsYnVmKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJbGJ1Zi0+bF9sb2cgPSBsb2c7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmxidWYtPmxfaW9ldmVudCk7CisKKwkJbGJ1Zi0+bF9mcmVlbGlzdCA9IGxvZy0+bGJ1Zl9mcmVlOworCQlsb2ctPmxidWZfZnJlZSA9IGxidWY7CisJfQorCisJcmV0dXJuICgwKTsKKworICAgICAgZXJyb3I6CisJbGJtTG9nU2h1dGRvd24obG9nKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworCisvKgorICoJbGJtTG9nU2h1dGRvd24oKQorICoKKyAqIGZpbmFsaXplIHBlciBsb2cgSS9PIHNldHVwIGF0IGxtTG9nU2h1dGRvd24oKQorICovCitzdGF0aWMgdm9pZCBsYm1Mb2dTaHV0ZG93bihzdHJ1Y3QgamZzX2xvZyAqIGxvZykKK3sKKwlzdHJ1Y3QgbGJ1ZiAqbGJ1ZjsKKworCWpmc19pbmZvKCJsYm1Mb2dTaHV0ZG93bjogbG9nOjB4JXAiLCBsb2cpOworCisJbGJ1ZiA9IGxvZy0+bGJ1Zl9mcmVlOworCXdoaWxlIChsYnVmKSB7CisJCXN0cnVjdCBsYnVmICpuZXh0ID0gbGJ1Zi0+bF9mcmVlbGlzdDsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBsYnVmLT5sX2xkYXRhKTsKKwkJa2ZyZWUobGJ1Zik7CisJCWxidWYgPSBuZXh0OworCX0KKworCWxvZy0+YnAgPSBOVUxMOworfQorCisKKy8qCisgKglsYm1BbGxvY2F0ZSgpCisgKgorICogYWxsb2NhdGUgYW4gZW1wdHkgbG9nIGJ1ZmZlcgorICovCitzdGF0aWMgc3RydWN0IGxidWYgKmxibUFsbG9jYXRlKHN0cnVjdCBqZnNfbG9nICogbG9nLCBpbnQgcG4pCit7CisJc3RydWN0IGxidWYgKmJwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIHJlY3ljbGUgZnJvbSBsb2cgYnVmZmVyIGZyZWVsaXN0IGlmIGFueQorCSAqLworCUxDQUNIRV9MT0NLKGZsYWdzKTsKKwlMQ0FDSEVfU0xFRVBfQ09ORChsb2ctPmZyZWVfd2FpdCwgKGJwID0gbG9nLT5sYnVmX2ZyZWUpLCBmbGFncyk7CisJbG9nLT5sYnVmX2ZyZWUgPSBicC0+bF9mcmVlbGlzdDsKKwlMQ0FDSEVfVU5MT0NLKGZsYWdzKTsKKworCWJwLT5sX2ZsYWcgPSAwOworCisJYnAtPmxfd3FuZXh0ID0gTlVMTDsKKwlicC0+bF9mcmVlbGlzdCA9IE5VTEw7CisKKwlicC0+bF9wbiA9IHBuOworCWJwLT5sX2Jsa25vID0gbG9nLT5iYXNlICsgKHBuIDw8IChMMkxPR1BTSVpFIC0gbG9nLT5sMmJzaXplKSk7CisJYnAtPmxfY2VvciA9IDA7CisKKwlyZXR1cm4gYnA7Cit9CisKKworLyoKKyAqCWxibUZyZWUoKQorICoKKyAqIHJlbGVhc2UgYSBsb2cgYnVmZmVyIHRvIGZyZWVsaXN0CisgKi8KK3N0YXRpYyB2b2lkIGxibUZyZWUoc3RydWN0IGxidWYgKiBicCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJTENBQ0hFX0xPQ0soZmxhZ3MpOworCisJbGJtZnJlZShicCk7CisKKwlMQ0FDSEVfVU5MT0NLKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbGJtZnJlZShzdHJ1Y3QgbGJ1ZiAqIGJwKQoreworCXN0cnVjdCBqZnNfbG9nICpsb2cgPSBicC0+bF9sb2c7CisKKwlhc3NlcnQoYnAtPmxfd3FuZXh0ID09IE5VTEwpOworCisJLyoKKwkgKiByZXR1cm4gdGhlIGJ1ZmZlciB0byBoZWFkIG9mIGZyZWVsaXN0CisJICovCisJYnAtPmxfZnJlZWxpc3QgPSBsb2ctPmxidWZfZnJlZTsKKwlsb2ctPmxidWZfZnJlZSA9IGJwOworCisJd2FrZV91cCgmbG9nLT5mcmVlX3dhaXQpOworCXJldHVybjsKK30KKworCisvKgorICogTkFNRToJbGJtUmVkcml2ZQorICoKKyAqIEZVTkNUSU9OOglhZGQgYSBsb2cgYnVmZmVyIHRvIHRoZSB0aGUgbG9nIHJlZHJpdmUgbGlzdAorICoKKyAqIFBBUkFNRVRFUjoKKyAqICAgICBicAktIGxvZyBidWZmZXIKKyAqCisgKiBOT1RFUzoKKyAqCVRha2VzIGxvZ19yZWRyaXZlX2xvY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsYm1SZWRyaXZlKHN0cnVjdCBsYnVmICpicCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvZ19yZWRyaXZlX2xvY2ssIGZsYWdzKTsKKwlicC0+bF9yZWRyaXZlX25leHQgPSBsb2dfcmVkcml2ZV9saXN0OworCWxvZ19yZWRyaXZlX2xpc3QgPSBicDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2dfcmVkcml2ZV9sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwKCZqZnNfSU9fdGhyZWFkX3dhaXQpOworfQorCisKKy8qCisgKglsYm1SZWFkKCkKKyAqLworc3RhdGljIGludCBsYm1SZWFkKHN0cnVjdCBqZnNfbG9nICogbG9nLCBpbnQgcG4sIHN0cnVjdCBsYnVmICoqIGJwcCkKK3sKKwlzdHJ1Y3QgYmlvICpiaW87CisJc3RydWN0IGxidWYgKmJwOworCisJLyoKKwkgKiBhbGxvY2F0ZSBhIGxvZyBidWZmZXIKKwkgKi8KKwkqYnBwID0gYnAgPSBsYm1BbGxvY2F0ZShsb2csIHBuKTsKKwlqZnNfaW5mbygibGJtUmVhZDogYnA6MHglcCBwbjoweCV4IiwgYnAsIHBuKTsKKworCWJwLT5sX2ZsYWcgfD0gbGJtUkVBRDsKKworCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9GUywgMSk7CisKKwliaW8tPmJpX3NlY3RvciA9IGJwLT5sX2Jsa25vIDw8IChsb2ctPmwyYnNpemUgLSA5KTsKKwliaW8tPmJpX2JkZXYgPSBsb2ctPmJkZXY7CisJYmlvLT5iaV9pb192ZWNbMF0uYnZfcGFnZSA9IHZpcnRfdG9fcGFnZShicC0+bF9sZGF0YSk7CisJYmlvLT5iaV9pb192ZWNbMF0uYnZfbGVuID0gTE9HUFNJWkU7CisJYmlvLT5iaV9pb192ZWNbMF0uYnZfb2Zmc2V0ID0gMDsKKworCWJpby0+YmlfdmNudCA9IDE7CisJYmlvLT5iaV9pZHggPSAwOworCWJpby0+Ymlfc2l6ZSA9IExPR1BTSVpFOworCisJYmlvLT5iaV9lbmRfaW8gPSBsYm1JT0RvbmU7CisJYmlvLT5iaV9wcml2YXRlID0gYnA7CisJc3VibWl0X2JpbyhSRUFEX1NZTkMsIGJpbyk7CisKKwl3YWl0X2V2ZW50KGJwLT5sX2lvZXZlbnQsIChicC0+bF9mbGFnICE9IGxibVJFQUQpKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKglsYm1Xcml0ZSgpCisgKgorICogYnVmZmVyIGF0IGhlYWQgb2YgcGFnZW91dCBxdWV1ZSBzdGF5cyBhZnRlciBjb21wbGV0aW9uIG9mCisgKiBwYXJ0aWFsLXBhZ2UgcGFnZW91dCBhbmQgcmVkcml2ZW4gYnkgZXhwbGljaXQgaW5pdGlhdGlvbiBvZgorICogcGFnZW91dCBieSBjYWxsZXIgdW50aWwgZnVsbC1wYWdlIHBhZ2VvdXQgaXMgY29tcGxldGVkIGFuZAorICogcmVsZWFzZWQuCisgKgorICogZGV2aWNlIGRyaXZlciBpL28gZG9uZSByZWRyaXZlcyBwYWdlb3V0IG9mIG5ldyBidWZmZXIgYXQKKyAqIGhlYWQgb2YgcGFnZW91dCBxdWV1ZSB3aGVuIGN1cnJlbnQgYnVmZmVyIGF0IGhlYWQgb2YgcGFnZW91dAorICogcXVldWUgaXMgcmVsZWFzZWQgYXQgdGhlIGNvbXBsZXRpb24gb2YgaXRzIGZ1bGwtcGFnZSBwYWdlb3V0LgorICoKKyAqIExPR0dDX0xPQ0soKSBzZXJpYWxpemVzIGxibVdyaXRlKCkgYnkgbG1OZXh0UGFnZSgpIGFuZCBsbUdyb3VwQ29tbWl0KCkuCisgKiBMQ0FDSEVfTE9DSygpIHNlcmlhbGl6ZXMgeGZsYWcgYmV0d2VlbiBsYm1Xcml0ZSgpIGFuZCBsYm1JT0RvbmUoKQorICovCitzdGF0aWMgdm9pZCBsYm1Xcml0ZShzdHJ1Y3QgamZzX2xvZyAqIGxvZywgc3RydWN0IGxidWYgKiBicCwgaW50IGZsYWcsCisJCSAgICAgaW50IGNhbnRfYmxvY2spCit7CisJc3RydWN0IGxidWYgKnRhaWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWpmc19pbmZvKCJsYm1Xcml0ZTogYnA6MHglcCBmbGFnOjB4JXggcG46MHgleCIsIGJwLCBmbGFnLCBicC0+bF9wbik7CisKKwkvKiBtYXAgdGhlIGxvZ2ljYWwgYmxvY2sgYWRkcmVzcyB0byBwaHlzaWNhbCBibG9jayBhZGRyZXNzICovCisJYnAtPmxfYmxrbm8gPQorCSAgICBsb2ctPmJhc2UgKyAoYnAtPmxfcG4gPDwgKEwyTE9HUFNJWkUgLSBsb2ctPmwyYnNpemUpKTsKKworCUxDQUNIRV9MT0NLKGZsYWdzKTsJCS8qIGRpc2FibGUrbG9jayAqLworCisJLyoKKwkgKiBpbml0aWFsaXplIGJ1ZmZlciBmb3IgZGV2aWNlIGRyaXZlcgorCSAqLworCWJwLT5sX2ZsYWcgPSBmbGFnOworCisJLyoKKwkgKiAgICAgIGluc2VydCBicCBhdCB0YWlsIG9mIHdyaXRlIHF1ZXVlIGFzc29jaWF0ZWQgd2l0aCBsb2cKKwkgKgorCSAqIChyZXF1ZXN0IGlzIGVpdGhlciBmb3IgYnAgYWxyZWFkeS9jdXJyZW50bHkgYXQgaGVhZCBvZiBxdWV1ZQorCSAqIG9yIG5ldyBicCB0byBiZSBpbnNlcnRlZCBhdCB0YWlsKQorCSAqLworCXRhaWwgPSBsb2ctPndxdWV1ZTsKKworCS8qIGlzIGJ1ZmZlciBub3QgYWxyZWFkeSBvbiB3cml0ZSBxdWV1ZSA/ICovCisJaWYgKGJwLT5sX3dxbmV4dCA9PSBOVUxMKSB7CisJCS8qIGluc2VydCBhdCB0YWlsIG9mIHdxdWV1ZSAqLworCQlpZiAodGFpbCA9PSBOVUxMKSB7CisJCQlsb2ctPndxdWV1ZSA9IGJwOworCQkJYnAtPmxfd3FuZXh0ID0gYnA7CisJCX0gZWxzZSB7CisJCQlsb2ctPndxdWV1ZSA9IGJwOworCQkJYnAtPmxfd3FuZXh0ID0gdGFpbC0+bF93cW5leHQ7CisJCQl0YWlsLT5sX3dxbmV4dCA9IGJwOworCQl9CisKKwkJdGFpbCA9IGJwOworCX0KKworCS8qIGlzIGJ1ZmZlciBhdCBoZWFkIG9mIHdxdWV1ZSBhbmQgZm9yIHdyaXRlID8gKi8KKwlpZiAoKGJwICE9IHRhaWwtPmxfd3FuZXh0KSB8fCAhKGZsYWcgJiBsYm1XUklURSkpIHsKKwkJTENBQ0hFX1VOTE9DSyhmbGFncyk7CS8qIHVubG9jaytlbmFibGUgKi8KKwkJcmV0dXJuOworCX0KKworCUxDQUNIRV9VTkxPQ0soZmxhZ3MpOwkvKiB1bmxvY2srZW5hYmxlICovCisKKwlpZiAoY2FudF9ibG9jaykKKwkJbGJtUmVkcml2ZShicCk7CisJZWxzZSBpZiAoZmxhZyAmIGxibVNZTkMpCisJCWxibVN0YXJ0SU8oYnApOworCWVsc2UgeworCQlMT0dHQ19VTkxPQ0sobG9nKTsKKwkJbGJtU3RhcnRJTyhicCk7CisJCUxPR0dDX0xPQ0sobG9nKTsKKwl9Cit9CisKKworLyoKKyAqCWxibURpcmVjdFdyaXRlKCkKKyAqCisgKiBpbml0aWF0ZSBwYWdlb3V0IGJ5cGFzc2luZyB3cml0ZSBxdWV1ZSBmb3Igc2lkZXN0cmVhbQorICogKGUuZy4sIGxvZyBzdXBlcmJsb2NrKSB3cml0ZTsKKyAqLworc3RhdGljIHZvaWQgbGJtRGlyZWN0V3JpdGUoc3RydWN0IGpmc19sb2cgKiBsb2csIHN0cnVjdCBsYnVmICogYnAsIGludCBmbGFnKQoreworCWpmc19pbmZvKCJsYm1EaXJlY3RXcml0ZTogYnA6MHglcCBmbGFnOjB4JXggcG46MHgleCIsCisJCSBicCwgZmxhZywgYnAtPmxfcG4pOworCisJLyoKKwkgKiBpbml0aWFsaXplIGJ1ZmZlciBmb3IgZGV2aWNlIGRyaXZlcgorCSAqLworCWJwLT5sX2ZsYWcgPSBmbGFnIHwgbGJtRElSRUNUOworCisJLyogbWFwIHRoZSBsb2dpY2FsIGJsb2NrIGFkZHJlc3MgdG8gcGh5c2ljYWwgYmxvY2sgYWRkcmVzcyAqLworCWJwLT5sX2Jsa25vID0KKwkgICAgbG9nLT5iYXNlICsgKGJwLT5sX3BuIDw8IChMMkxPR1BTSVpFIC0gbG9nLT5sMmJzaXplKSk7CisKKwkvKgorCSAqICAgICAgaW5pdGlhdGUgcGFnZW91dCBvZiB0aGUgcGFnZQorCSAqLworCWxibVN0YXJ0SU8oYnApOworfQorCisKKy8qCisgKiBOQU1FOglsYm1TdGFydElPKCkKKyAqCisgKiBGVU5DVElPTjoJSW50ZXJmYWNlIHRvIEREIHN0cmF0ZWd5IHJvdXRpbmUKKyAqCisgKiBSRVRVUk46ICAgICAgbm9uZQorICoKKyAqIHNlcmlhbGl6YXRpb246IExDQUNIRV9MT0NLKCkgaXMgTk9UIGhlbGQgZHVyaW5nIGxvZyBpL287CisgKi8KK3N0YXRpYyB2b2lkIGxibVN0YXJ0SU8oc3RydWN0IGxidWYgKiBicCkKK3sKKwlzdHJ1Y3QgYmlvICpiaW87CisJc3RydWN0IGpmc19sb2cgKmxvZyA9IGJwLT5sX2xvZzsKKworCWpmc19pbmZvKCJsYm1TdGFydElPXG4iKTsKKworCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9GUywgMSk7CisJYmlvLT5iaV9zZWN0b3IgPSBicC0+bF9ibGtubyA8PCAobG9nLT5sMmJzaXplIC0gOSk7CisJYmlvLT5iaV9iZGV2ID0gbG9nLT5iZGV2OworCWJpby0+YmlfaW9fdmVjWzBdLmJ2X3BhZ2UgPSB2aXJ0X3RvX3BhZ2UoYnAtPmxfbGRhdGEpOworCWJpby0+YmlfaW9fdmVjWzBdLmJ2X2xlbiA9IExPR1BTSVpFOworCWJpby0+YmlfaW9fdmVjWzBdLmJ2X29mZnNldCA9IDA7CisKKwliaW8tPmJpX3ZjbnQgPSAxOworCWJpby0+YmlfaWR4ID0gMDsKKwliaW8tPmJpX3NpemUgPSBMT0dQU0laRTsKKworCWJpby0+YmlfZW5kX2lvID0gbGJtSU9Eb25lOworCWJpby0+YmlfcHJpdmF0ZSA9IGJwOworCisJLyogY2hlY2sgaWYgam91cm5hbGluZyB0byBkaXNrIGhhcyBiZWVuIGRpc2FibGVkICovCisJaWYgKCFsb2ctPm5vX2ludGVncml0eSkgeworCQlzdWJtaXRfYmlvKFdSSVRFX1NZTkMsIGJpbyk7CisJCUlOQ1JFTUVOVChsbVN0YXQuc3VibWl0dGVkKTsKKwl9CisJZWxzZSB7CisJCWJpby0+Ymlfc2l6ZSA9IDA7CisJCWxibUlPRG9uZShiaW8sIDAsIDApOyAvKiAybmQgYXJndW1lbnQgYXBwZWFycyB0byBub3QgYmUgdXNlZCA9PiAwCisJCQkJICAgICAgICogIDNyZCBhcmd1bWVudCBhcHBlYXJzIHRvIG5vdCBiZSB1c2VkID0+IDAKKwkJCQkgICAgICAgKi8KKwl9Cit9CisKKworLyoKKyAqCWxibUlPV2FpdCgpCisgKi8KK3N0YXRpYyBpbnQgbGJtSU9XYWl0KHN0cnVjdCBsYnVmICogYnAsIGludCBmbGFnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gMDsKKworCWpmc19pbmZvKCJsYm1JT1dhaXQxOiBicDoweCVwIGZsYWc6MHgleDoweCV4IiwgYnAsIGJwLT5sX2ZsYWcsIGZsYWcpOworCisJTENBQ0hFX0xPQ0soZmxhZ3MpOwkJLyogZGlzYWJsZStsb2NrICovCisKKwlMQ0FDSEVfU0xFRVBfQ09ORChicC0+bF9pb2V2ZW50LCAoYnAtPmxfZmxhZyAmIGxibURPTkUpLCBmbGFncyk7CisKKwlyYyA9IChicC0+bF9mbGFnICYgbGJtRVJST1IpID8gLUVJTyA6IDA7CisKKwlpZiAoZmxhZyAmIGxibUZSRUUpCisJCWxibWZyZWUoYnApOworCisJTENBQ0hFX1VOTE9DSyhmbGFncyk7CS8qIHVubG9jaytlbmFibGUgKi8KKworCWpmc19pbmZvKCJsYm1JT1dhaXQyOiBicDoweCVwIGZsYWc6MHgleDoweCV4IiwgYnAsIGJwLT5sX2ZsYWcsIGZsYWcpOworCXJldHVybiByYzsKK30KKworLyoKKyAqCWxibUlPRG9uZSgpCisgKgorICogZXhlY3V0ZWQgYXQgSU5USU9ET05FIGxldmVsCisgKi8KK3N0YXRpYyBpbnQgbGJtSU9Eb25lKHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgaW50IGJ5dGVzX2RvbmUsIGludCBlcnJvcikKK3sKKwlzdHJ1Y3QgbGJ1ZiAqYnAgPSBiaW8tPmJpX3ByaXZhdGU7CisJc3RydWN0IGxidWYgKm5leHRicCwgKnRhaWw7CisJc3RydWN0IGpmc19sb2cgKmxvZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGJpby0+Ymlfc2l6ZSkKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIGdldCBiYWNrIGpmcyBidWZmZXIgYm91bmQgdG8gdGhlIGkvbyBidWZmZXIKKwkgKi8KKwlqZnNfaW5mbygibGJtSU9Eb25lOiBicDoweCVwIGZsYWc6MHgleCIsIGJwLCBicC0+bF9mbGFnKTsKKworCUxDQUNIRV9MT0NLKGZsYWdzKTsJCS8qIGRpc2FibGUrbG9jayAqLworCisJYnAtPmxfZmxhZyB8PSBsYm1ET05FOworCisJaWYgKCF0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKSkgeworCQlicC0+bF9mbGFnIHw9IGxibUVSUk9SOworCisJCWpmc19lcnIoImxibUlPRG9uZTogSS9PIGVycm9yIGluIEpGUyBsb2ciKTsKKwl9CisKKwliaW9fcHV0KGJpbyk7CisKKwkvKgorCSAqICAgICAgcGFnZWluIGNvbXBsZXRpb24KKwkgKi8KKwlpZiAoYnAtPmxfZmxhZyAmIGxibVJFQUQpIHsKKwkJYnAtPmxfZmxhZyAmPSB+bGJtUkVBRDsKKworCQlMQ0FDSEVfVU5MT0NLKGZsYWdzKTsJLyogdW5sb2NrK2VuYWJsZSAqLworCisJCS8qIHdha2V1cCBJL08gaW5pdGlhdG9yICovCisJCUxDQUNIRV9XQUtFVVAoJmJwLT5sX2lvZXZlbnQpOworCisJCXJldHVybiAwOworCX0KKworCS8qCisJICogICAgICBwYWdlb3V0IGNvbXBsZXRpb24KKwkgKgorCSAqIHRoZSBicCBhdCB0aGUgaGVhZCBvZiB3cml0ZSBxdWV1ZSBoYXMgY29tcGxldGVkIHBhZ2VvdXQuCisJICoKKwkgKiBpZiBzaW5nbGUtY29tbWl0L2Z1bGwtcGFnZSBwYWdlb3V0LCByZW1vdmUgdGhlIGN1cnJlbnQgYnVmZmVyCisJICogZnJvbSBoZWFkIG9mIHBhZ2VvdXQgcXVldWUsIGFuZCByZWRyaXZlIHBhZ2VvdXQgd2l0aAorCSAqIHRoZSBuZXcgYnVmZmVyIGF0IGhlYWQgb2YgcGFnZW91dCBxdWV1ZTsKKwkgKiBvdGhlcndpc2UsIHRoZSBwYXJ0aWFsLXBhZ2UgcGFnZW91dCBidWZmZXIgc3RheXMgYXQKKwkgKiB0aGUgaGVhZCBvZiBwYWdlb3V0IHF1ZXVlIHRvIGJlIHJlZHJpdmVuIGZvciBwYWdlb3V0CisJICogYnkgbG1Hcm91cENvbW1pdCgpIHVudGlsIGZ1bGwtcGFnZSBwYWdlb3V0IGlzIGNvbXBsZXRlZC4KKwkgKi8KKwlicC0+bF9mbGFnICY9IH5sYm1XUklURTsKKwlJTkNSRU1FTlQobG1TdGF0LnBhZ2Vkb25lKTsKKworCS8qIHVwZGF0ZSBjb21taXR0ZWQgbHNuICovCisJbG9nID0gYnAtPmxfbG9nOworCWxvZy0+Y2xzbiA9IChicC0+bF9wbiA8PCBMMkxPR1BTSVpFKSArIGJwLT5sX2Nlb3I7CisKKwlpZiAoYnAtPmxfZmxhZyAmIGxibURJUkVDVCkgeworCQlMQ0FDSEVfV0FLRVVQKCZicC0+bF9pb2V2ZW50KTsKKwkJTENBQ0hFX1VOTE9DSyhmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCXRhaWwgPSBsb2ctPndxdWV1ZTsKKworCS8qIHNpbmdsZSBlbGVtZW50IHF1ZXVlICovCisJaWYgKGJwID09IHRhaWwpIHsKKwkJLyogcmVtb3ZlIGhlYWQgYnVmZmVyIG9mIGZ1bGwtcGFnZSBwYWdlb3V0CisJCSAqIGZyb20gbG9nIGRldmljZSB3cml0ZSBxdWV1ZQorCQkgKi8KKwkJaWYgKGJwLT5sX2ZsYWcgJiBsYm1SRUxFQVNFKSB7CisJCQlsb2ctPndxdWV1ZSA9IE5VTEw7CisJCQlicC0+bF93cW5leHQgPSBOVUxMOworCQl9CisJfQorCS8qIG11bHRpIGVsZW1lbnQgcXVldWUgKi8KKwllbHNlIHsKKwkJLyogcmVtb3ZlIGhlYWQgYnVmZmVyIG9mIGZ1bGwtcGFnZSBwYWdlb3V0CisJCSAqIGZyb20gbG9nIGRldmljZSB3cml0ZSBxdWV1ZQorCQkgKi8KKwkJaWYgKGJwLT5sX2ZsYWcgJiBsYm1SRUxFQVNFKSB7CisJCQluZXh0YnAgPSB0YWlsLT5sX3dxbmV4dCA9IGJwLT5sX3dxbmV4dDsKKwkJCWJwLT5sX3dxbmV4dCA9IE5VTEw7CisKKwkJCS8qCisJCQkgKiByZWRyaXZlIHBhZ2VvdXQgb2YgbmV4dCBwYWdlIGF0IGhlYWQgb2Ygd3JpdGUgcXVldWU6CisJCQkgKiByZWRyaXZlIG5leHQgcGFnZSB3aXRob3V0IGFueSBib3VuZCB0YmxrCisJCQkgKiAoaS5lLiwgcGFnZSB3L28gYW55IENPTU1JVCByZWNvcmRzKSwgb3IKKwkJCSAqIGZpcnN0IHBhZ2Ugb2YgbmV3IGdyb3VwIGNvbW1pdCB3aGljaCBoYXMgYmVlbgorCQkJICogcXVldWVkIGFmdGVyIGN1cnJlbnQgcGFnZSAoc3Vic2VxdWVudCBwYWdlb3V0CisJCQkgKiBpcyBwZXJmb3JtZWQgc3luY2hyb25vdXNseSwgZXhjZXB0IHBhZ2Ugd2l0aG91dAorCQkJICogYW55IENPTU1JVHMpIGJ5IGxtR3JvdXBDb21taXQoKSBhcyBpbmRpY2F0ZWQKKwkJCSAqIGJ5IGxibVdSSVRFIGZsYWc7CisJCQkgKi8KKwkJCWlmIChuZXh0YnAtPmxfZmxhZyAmIGxibVdSSVRFKSB7CisJCQkJLyoKKwkJCQkgKiBXZSBjYW4ndCBkbyB0aGUgSS9PIGF0IGludGVycnVwdCB0aW1lLgorCQkJCSAqIFRoZSBqZnNJTyB0aHJlYWQgY2FuIGRvIGl0CisJCQkJICovCisJCQkJbGJtUmVkcml2ZShuZXh0YnApOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiAgICAgIHN5bmNocm9ub3VzIHBhZ2VvdXQ6CisJICoKKwkgKiBidWZmZXIgaGFzIG5vdCBuZWNlc3NhcmlseSBiZWVuIHJlbW92ZWQgZnJvbSB3cml0ZSBxdWV1ZQorCSAqIChlLmcuLCBzeW5jaHJvbm91cyB3cml0ZSBvZiBwYXJ0aWFsLXBhZ2Ugd2l0aCBDT01NSVQpOgorCSAqIGxlYXZlIGJ1ZmZlciBmb3IgaS9vIGluaXRpYXRvciB0byBkaXNwb3NlCisJICovCisJaWYgKGJwLT5sX2ZsYWcgJiBsYm1TWU5DKSB7CisJCUxDQUNIRV9VTkxPQ0soZmxhZ3MpOwkvKiB1bmxvY2srZW5hYmxlICovCisKKwkJLyogd2FrZXVwIEkvTyBpbml0aWF0b3IgKi8KKwkJTENBQ0hFX1dBS0VVUCgmYnAtPmxfaW9ldmVudCk7CisJfQorCisJLyoKKwkgKiAgICAgIEdyb3VwIENvbW1pdCBwYWdlb3V0OgorCSAqLworCWVsc2UgaWYgKGJwLT5sX2ZsYWcgJiBsYm1HQykgeworCQlMQ0FDSEVfVU5MT0NLKGZsYWdzKTsKKwkJbG1Qb3N0R0MoYnApOworCX0KKworCS8qCisJICogICAgICBhc3luY2hyb25vdXMgcGFnZW91dDoKKwkgKgorCSAqIGJ1ZmZlciBtdXN0IGhhdmUgYmVlbiByZW1vdmVkIGZyb20gd3JpdGUgcXVldWU6CisJICogaW5zZXJ0IGJ1ZmZlciBhdCBoZWFkIG9mIGZyZWVsaXN0IHdoZXJlIGl0IGNhbiBiZSByZWN5Y2xlZAorCSAqLworCWVsc2UgeworCQlhc3NlcnQoYnAtPmxfZmxhZyAmIGxibVJFTEVBU0UpOworCQlhc3NlcnQoYnAtPmxfZmxhZyAmIGxibUZSRUUpOworCQlsYm1mcmVlKGJwKTsKKworCQlMQ0FDSEVfVU5MT0NLKGZsYWdzKTsJLyogdW5sb2NrK2VuYWJsZSAqLworCX0KKworCXJldHVybiAwOworfQorCitpbnQgamZzSU9XYWl0KHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbGJ1ZiAqYnA7CisKKwlkYWVtb25pemUoImpmc0lPIik7CisKKwljb21wbGV0ZSgmamZzSU93YWl0KTsKKworCWRvIHsKKwkJREVDTEFSRV9XQUlUUVVFVUUod3EsIGN1cnJlbnQpOworCisJCXNwaW5fbG9ja19pcnEoJmxvZ19yZWRyaXZlX2xvY2spOworCQl3aGlsZSAoKGJwID0gbG9nX3JlZHJpdmVfbGlzdCkgIT0gMCkgeworCQkJbG9nX3JlZHJpdmVfbGlzdCA9IGJwLT5sX3JlZHJpdmVfbmV4dDsKKwkJCWJwLT5sX3JlZHJpdmVfbmV4dCA9IE5VTEw7CisJCQlzcGluX3VubG9ja19pcnEoJmxvZ19yZWRyaXZlX2xvY2spOworCQkJbGJtU3RhcnRJTyhicCk7CisJCQlzcGluX2xvY2tfaXJxKCZsb2dfcmVkcml2ZV9sb2NrKTsKKwkJfQorCQlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9GUkVFWkUpIHsKKwkJCXNwaW5fdW5sb2NrX2lycSgmbG9nX3JlZHJpdmVfbG9jayk7CisJCQlyZWZyaWdlcmF0b3IoUEZfRlJFRVpFKTsKKwkJfSBlbHNlIHsKKwkJCWFkZF93YWl0X3F1ZXVlKCZqZnNfSU9fdGhyZWFkX3dhaXQsICZ3cSk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc3Bpbl91bmxvY2tfaXJxKCZsb2dfcmVkcml2ZV9sb2NrKTsKKwkJCXNjaGVkdWxlKCk7CisJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKCZqZnNfSU9fdGhyZWFkX3dhaXQsICZ3cSk7CisJCX0KKwl9IHdoaWxlICghamZzX3N0b3BfdGhyZWFkcyk7CisKKwlqZnNfaW5mbygiamZzSU9XYWl0IGJlaW5nIGtpbGxlZCEiKTsKKwljb21wbGV0ZV9hbmRfZXhpdCgmamZzSU93YWl0LCAwKTsKK30KKworLyoKKyAqIE5BTUU6CWxtTG9nRm9ybWF0KCkvamZzX2xvZ2Zvcm0oKQorICoKKyAqIEZVTkNUSU9OOglmb3JtYXQgZmlsZSBzeXN0ZW0gbG9nCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgbG9nCS0gdm9sdW1lIGxvZworICoJbG9nQWRkcmVzcyAtIHN0YXJ0IGFkZHJlc3Mgb2YgbG9nIHNwYWNlIGluIEZTIGJsb2NrCisgKglsb2dTaXplCS0gbGVuZ3RoIG9mIGxvZyBzcGFjZSBpbiBGUyBibG9jazsKKyAqCisgKiBSRVRVUk46CTAJLSBzdWNjZXNzCisgKgkJLUVJTwktIGkvbyBlcnJvcgorICoKKyAqIFhYWDogV2UncmUgc3luY2hyb25vdXNseSB3cml0aW5nIG9uZSBwYWdlIGF0IGEgdGltZS4gIFRoaXMgbmVlZHMgdG8KKyAqCWJlIGltcHJvdmVkIGJ5IHdyaXRpbmcgbXVsdGlwbGUgcGFnZXMgYXQgb25jZS4KKyAqLworaW50IGxtTG9nRm9ybWF0KHN0cnVjdCBqZnNfbG9nICpsb2csIHM2NCBsb2dBZGRyZXNzLCBpbnQgbG9nU2l6ZSkKK3sKKwlpbnQgcmMgPSAtRUlPOworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpOworCXN0cnVjdCBsb2dzdXBlciAqbG9nc3VwZXI7CisJc3RydWN0IGxvZ3BhZ2UgKmxwOworCWludCBsc3BuOwkJLyogbG9nIHNlcXVlbmNlIHBhZ2UgbnVtYmVyICovCisJc3RydWN0IGxyZCAqbHJkX3B0cjsKKwlpbnQgbnBhZ2VzID0gMDsKKwlzdHJ1Y3QgbGJ1ZiAqYnA7CisKKwlqZnNfaW5mbygibG1Mb2dGb3JtYXQ6IGxvZ0FkZHJlc3M6JUxkIGxvZ1NpemU6JWQiLAorCQkgKGxvbmcgbG9uZylsb2dBZGRyZXNzLCBsb2dTaXplKTsKKworCXNiaSA9IGxpc3RfZW50cnkobG9nLT5zYl9saXN0Lm5leHQsIHN0cnVjdCBqZnNfc2JfaW5mbywgbG9nX2xpc3QpOworCisJLyogYWxsb2NhdGUgYSBsb2cgYnVmZmVyICovCisJYnAgPSBsYm1BbGxvY2F0ZShsb2csIDEpOworCisJbnBhZ2VzID0gbG9nU2l6ZSA+PiBzYmktPmwybmJwZXJwYWdlOworCisJLyoKKwkgKiAgICAgIGxvZyBzcGFjZToKKwkgKgorCSAqIHBhZ2UgMCAtIHJlc2VydmVkOworCSAqIHBhZ2UgMSAtIGxvZyBzdXBlcmJsb2NrOworCSAqIHBhZ2UgMiAtIGxvZyBkYXRhIHBhZ2U6IEEgU1lOQyBsb2cgcmVjb3JkIGlzIHdyaXR0ZW4KKwkgKiAgICAgICAgICBpbnRvIHRoaXMgcGFnZSBhdCBsb2dmb3JtIHRpbWU7CisJICogcGFnZXMgMy1OIC0gbG9nIGRhdGEgcGFnZTogc2V0IHRvIGVtcHR5IGxvZyBkYXRhIHBhZ2VzOworCSAqLworCS8qCisJICogICAgICBpbml0IGxvZyBzdXBlcmJsb2NrOiBsb2cgcGFnZSAxCisJICovCisJbG9nc3VwZXIgPSAoc3RydWN0IGxvZ3N1cGVyICopIGJwLT5sX2xkYXRhOworCisJbG9nc3VwZXItPm1hZ2ljID0gY3B1X3RvX2xlMzIoTE9HTUFHSUMpOworCWxvZ3N1cGVyLT52ZXJzaW9uID0gY3B1X3RvX2xlMzIoTE9HVkVSU0lPTik7CisJbG9nc3VwZXItPnN0YXRlID0gY3B1X3RvX2xlMzIoTE9HUkVET05FKTsKKwlsb2dzdXBlci0+ZmxhZyA9IGNwdV90b19sZTMyKHNiaS0+bW50ZmxhZyk7CS8qID8gKi8KKwlsb2dzdXBlci0+c2l6ZSA9IGNwdV90b19sZTMyKG5wYWdlcyk7CisJbG9nc3VwZXItPmJzaXplID0gY3B1X3RvX2xlMzIoc2JpLT5ic2l6ZSk7CisJbG9nc3VwZXItPmwyYnNpemUgPSBjcHVfdG9fbGUzMihzYmktPmwyYnNpemUpOworCWxvZ3N1cGVyLT5lbmQgPSBjcHVfdG9fbGUzMigyICogTE9HUFNJWkUgKyBMT0dQSERSU0laRSArIExPR1JEU0laRSk7CisKKwlicC0+bF9mbGFnID0gbGJtV1JJVEUgfCBsYm1TWU5DIHwgbGJtRElSRUNUOworCWJwLT5sX2Jsa25vID0gbG9nQWRkcmVzcyArIHNiaS0+bmJwZXJwYWdlOworCWxibVN0YXJ0SU8oYnApOworCWlmICgocmMgPSBsYm1JT1dhaXQoYnAsIDApKSkKKwkJZ290byBleGl0OworCisJLyoKKwkgKiAgICAgIGluaXQgcGFnZXMgMiB0byBucGFnZXMtMSBhcyBsb2cgZGF0YSBwYWdlczoKKwkgKgorCSAqIGxvZyBwYWdlIHNlcXVlbmNlIG51bWJlciAobHBzbikgaW5pdGlhbGl6YXRpb246CisJICoKKwkgKiBwbjogICAwICAgICAxICAgICAyICAgICAzICAgICAgICAgICAgICAgICBuLTEKKwkgKiAgICAgICArLS0tLS0rLS0tLS0rPT09PT0rPT09PT0rPT09Li4uLi49PT0rPT09PT0rCisJICogbHNwbjogICAgICAgICAgICAgTi0xICAgMCAgICAgMSAgICAgICAgICAgTi0yCisJICogICAgICAgICAgICAgICAgICAgPC0tLSBOIHBhZ2UgY2lyY3VsYXIgZmlsZSAtLS0tPgorCSAqCisJICogdGhlIE4gKD0gbnBhZ2VzLTIpIGRhdGEgcGFnZXMgb2YgdGhlIGxvZyBpcyBtYWludGFpbmVkIGFzCisJICogYSBjaXJjdWxhciBmaWxlIGZvciB0aGUgbG9nIHJlY29yZHM7CisJICogbHBzbiBncm93cyBieSAxIG1vbm90b25pY2FsbHkgYXMgZWFjaCBsb2cgcGFnZSBpcyB3cml0dGVuCisJICogdG8gdGhlIGNpcmN1bGFyIGZpbGUgb2YgdGhlIGxvZzsKKwkgKiBhbmQgc2V0TG9ncGFnZSgpIHdpbGwgbm90IHJlc2V0IHRoZSBwYWdlIG51bWJlciBldmVuIGlmCisJICogdGhlIGVvciBpcyBlcXVhbCB0byBMT0dQSERSU0laRS4gSW4gb3JkZXIgZm9yIGJpbmFyeSBzZWFyY2gKKwkgKiBzdGlsbCB3b3JrIGluIGZpbmQgbG9nIGVuZCBwcm9jZXNzLCB3ZSBoYXZlIHRvIHNpbXVsYXRlIHRoZQorCSAqIGxvZyB3cmFwIHNpdHVhdGlvbiBhdCB0aGUgbG9nIGZvcm1hdCB0aW1lLgorCSAqIFRoZSAxc3QgbG9nIHBhZ2Ugd3JpdHRlbiB3aWxsIGhhdmUgdGhlIGhpZ2hlc3QgbHBzbi4gVGhlbgorCSAqIHRoZSBzdWNjZWVkaW5nIGxvZyBwYWdlcyB3aWxsIGhhdmUgYXNjZW5kaW5nIG9yZGVyIG9mCisJICogdGhlIGxzcG4gc3RhcnRpbmcgZnJvbSAwLCAuLi4gKE4tMikKKwkgKi8KKwlscCA9IChzdHJ1Y3QgbG9ncGFnZSAqKSBicC0+bF9sZGF0YTsKKwkvKgorCSAqIGluaXRpYWxpemUgMXN0IGxvZyBwYWdlIHRvIGJlIHdyaXR0ZW46IGxwc24gPSBOIC0gMSwKKwkgKiB3cml0ZSBhIFNZTkNQVCBsb2cgcmVjb3JkIGlzIHdyaXR0ZW4gdG8gdGhpcyBwYWdlCisJICovCisJbHAtPmgucGFnZSA9IGxwLT50LnBhZ2UgPSBjcHVfdG9fbGUzMihucGFnZXMgLSAzKTsKKwlscC0+aC5lb3IgPSBscC0+dC5lb3IgPSBjcHVfdG9fbGUxNihMT0dQSERSU0laRSArIExPR1JEU0laRSk7CisKKwlscmRfcHRyID0gKHN0cnVjdCBscmQgKikgJmxwLT5kYXRhOworCWxyZF9wdHItPmxvZ3RpZCA9IDA7CisJbHJkX3B0ci0+YmFja2NoYWluID0gMDsKKwlscmRfcHRyLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1NZTkNQVCk7CisJbHJkX3B0ci0+bGVuZ3RoID0gMDsKKwlscmRfcHRyLT5sb2cuc3luY3B0LnN5bmMgPSAwOworCisJYnAtPmxfYmxrbm8gKz0gc2JpLT5uYnBlcnBhZ2U7CisJYnAtPmxfZmxhZyA9IGxibVdSSVRFIHwgbGJtU1lOQyB8IGxibURJUkVDVDsKKwlsYm1TdGFydElPKGJwKTsKKwlpZiAoKHJjID0gbGJtSU9XYWl0KGJwLCAwKSkpCisJCWdvdG8gZXhpdDsKKworCS8qCisJICogICAgICBpbml0aWFsaXplIHN1Y2NlZWRpbmcgbG9nIHBhZ2VzOiBscHNuID0gMCwgMSwgLi4uLCAoTi0yKQorCSAqLworCWZvciAobHNwbiA9IDA7IGxzcG4gPCBucGFnZXMgLSAzOyBsc3BuKyspIHsKKwkJbHAtPmgucGFnZSA9IGxwLT50LnBhZ2UgPSBjcHVfdG9fbGUzMihsc3BuKTsKKwkJbHAtPmguZW9yID0gbHAtPnQuZW9yID0gY3B1X3RvX2xlMTYoTE9HUEhEUlNJWkUpOworCisJCWJwLT5sX2Jsa25vICs9IHNiaS0+bmJwZXJwYWdlOworCQlicC0+bF9mbGFnID0gbGJtV1JJVEUgfCBsYm1TWU5DIHwgbGJtRElSRUNUOworCQlsYm1TdGFydElPKGJwKTsKKwkJaWYgKChyYyA9IGxibUlPV2FpdChicCwgMCkpKQorCQkJZ290byBleGl0OworCX0KKworCXJjID0gMDsKK2V4aXQ6CisJLyoKKwkgKiAgICAgIGZpbmFsaXplIGxvZworCSAqLworCS8qIHJlbGVhc2UgdGhlIGJ1ZmZlciAqLworCWxibUZyZWUoYnApOworCisJcmV0dXJuIHJjOworfQorCisjaWZkZWYgQ09ORklHX0pGU19TVEFUSVNUSUNTCitpbnQgamZzX2xtc3RhdHNfcmVhZChjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorCQkgICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gMDsKKwlvZmZfdCBiZWdpbjsKKworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciwKKwkJICAgICAgICJKRlMgTG9nbWdyIHN0YXRzXG4iCisJCSAgICAgICAiPT09PT09PT09PT09PT09PVxuIgorCQkgICAgICAgImNvbW1pdHMgPSAlZFxuIgorCQkgICAgICAgIndyaXRlcyBzdWJtaXR0ZWQgPSAlZFxuIgorCQkgICAgICAgIndyaXRlcyBjb21wbGV0ZWQgPSAlZFxuIgorCQkgICAgICAgImZ1bGwgcGFnZXMgc3VibWl0dGVkID0gJWRcbiIKKwkJICAgICAgICJwYXJ0aWFsIHBhZ2VzIHN1Ym1pdHRlZCA9ICVkXG4iLAorCQkgICAgICAgbG1TdGF0LmNvbW1pdCwKKwkJICAgICAgIGxtU3RhdC5zdWJtaXR0ZWQsCisJCSAgICAgICBsbVN0YXQucGFnZWRvbmUsCisJCSAgICAgICBsbVN0YXQuZnVsbF9wYWdlLAorCQkgICAgICAgbG1TdGF0LnBhcnRpYWxfcGFnZSk7CisKKwliZWdpbiA9IG9mZnNldDsKKwkqc3RhcnQgPSBidWZmZXIgKyBiZWdpbjsKKwlsZW4gLT0gYmVnaW47CisKKwlpZiAobGVuID4gbGVuZ3RoKQorCQlsZW4gPSBsZW5ndGg7CisJZWxzZQorCQkqZW9mID0gMTsKKworCWlmIChsZW4gPCAwKQorCQlsZW4gPSAwOworCisJcmV0dXJuIGxlbjsKK30KKyNlbmRpZiAvKiBDT05GSUdfSkZTX1NUQVRJU1RJQ1MgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfbG9nbWdyLmggYi9mcy9qZnMvamZzX2xvZ21nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MWFkNzQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX2xvZ21nci5oCkBAIC0wLDAgKzEsNTEwIEBACisvKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwNAorICogICBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIENocmlzdG9waCBIZWxsd2lnLCAyMDAxLTIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZglfSF9KRlNfTE9HTUdSCisjZGVmaW5lIF9IX0pGU19MT0dNR1IKKworI2luY2x1ZGUgImpmc19maWxzeXMuaCIKKyNpbmNsdWRlICJqZnNfbG9jay5oIgorCisvKgorICoJbG9nIG1hbmFnZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKi8KKworLyogbG9nIHBhZ2Ugc2l6ZSAqLworI2RlZmluZQlMT0dQU0laRQk0MDk2CisjZGVmaW5lCUwyTE9HUFNJWkUJMTIKKworI2RlZmluZSBMT0dQQUdFUwkxNgkvKiBMb2cgcGFnZXMgcGVyIG1vdW50ZWQgZmlsZSBzeXN0ZW0gKi8KKworLyoKKyAqCWxvZyBsb2dpY2FsIHZvbHVtZQorICoKKyAqIGEgbG9nIGlzIHVzZWQgdG8gbWFrZSB0aGUgY29tbWl0IG9wZXJhdGlvbiBvbiBqb3VybmFsbGVkIAorICogZmlsZXMgd2l0aGluIHRoZSBzYW1lIGxvZ2ljYWwgdm9sdW1lIGdyb3VwIGF0b21pYy4KKyAqIGEgbG9nIGlzIGltcGxlbWVudGVkIHdpdGggYSBsb2dpY2FsIHZvbHVtZS4KKyAqIHRoZXJlIGlzIG9uZSBsb2cgcGVyIGxvZ2ljYWwgdm9sdW1lIGdyb3VwLiAKKyAqCisgKiBibG9jayAwIG9mIHRoZSBsb2cgbG9naWNhbCB2b2x1bWUgaXMgbm90IHVzZWQgKGlwbCBldGMpLgorICogYmxvY2sgMSBjb250YWlucyBhIGxvZyAic3VwZXJibG9jayIgYW5kIGlzIHVzZWQgYnkgbG9nRm9ybWF0KCksCisgKiBsbUxvZ0luaXQoKSwgbG1Mb2dTaHV0ZG93bigpLCBhbmQgbG9nUmVkbygpIHRvIHJlY29yZCBzdGF0dXMgCisgKiBvZiB0aGUgbG9nIGJ1dCBpcyBub3Qgb3RoZXJ3aXNlIHVzZWQgZHVyaW5nIG5vcm1hbCBwcm9jZXNzaW5nLiAKKyAqIGJsb2NrcyAyIC0gKE4tMSkgYXJlIHVzZWQgdG8gY29udGFpbiBsb2cgcmVjb3Jkcy4KKyAqCisgKiB3aGVuIGEgdm9sdW1lIGdyb3VwIGlzIHZhcmllZC1vbi1saW5lLCBsb2dSZWRvKCkgbXVzdCBoYXZlIAorICogYmVlbiBleGVjdXRlZCBiZWZvcmUgdGhlIGZpbGUgc3lzdGVtcyAobG9naWNhbCB2b2x1bWVzKSBpbiAKKyAqIHRoZSB2b2x1bWUgZ3JvdXAgY2FuIGJlIG1vdW50ZWQuCisgKi8KKy8qCisgKglsb2cgc3VwZXJibG9jayAoYmxvY2sgMSBvZiBsb2dpY2FsIHZvbHVtZSkKKyAqLworI2RlZmluZQlMT0dTVVBFUl9CCTEKKyNkZWZpbmUJTE9HU1RBUlRfQgkyCisKKyNkZWZpbmUJTE9HTUFHSUMJMHg4NzY1NDMyMQorI2RlZmluZQlMT0dWRVJTSU9OCTEKKworI2RlZmluZSBNQVhfQUNUSVZFCTEyOAkvKiBNYXggYWN0aXZlIGZpbGUgc3lzdGVtcyBzaGFyaW5nIGxvZyAqLworCitzdHJ1Y3QgbG9nc3VwZXIgeworCV9fbGUzMiBtYWdpYzsJCS8qIDQ6IGxvZyBsdiBpZGVudGlmaWVyICovCisJX19sZTMyIHZlcnNpb247CQkvKiA0OiB2ZXJzaW9uIG51bWJlciAqLworCV9fbGUzMiBzZXJpYWw7CQkvKiA0OiBsb2cgb3Blbi9tb3VudCBjb3VudGVyICovCisJX19sZTMyIHNpemU7CQkvKiA0OiBzaXplIGluIG51bWJlciBvZiBMT0dQU0laRSBibG9ja3MgKi8KKwlfX2xlMzIgYnNpemU7CQkvKiA0OiBsb2dpY2FsIGJsb2NrIHNpemUgaW4gYnl0ZSAqLworCV9fbGUzMiBsMmJzaXplOwkJLyogNDogbG9nMiBvZiBic2l6ZSAqLworCisJX19sZTMyIGZsYWc7CQkvKiA0OiBvcHRpb24gKi8KKwlfX2xlMzIgc3RhdGU7CQkvKiA0OiBzdGF0ZSAtIHNlZSBiZWxvdyAqLworCisJX19sZTMyIGVuZDsJCS8qIDQ6IGFkZHIgb2YgbGFzdCBsb2cgcmVjb3JkIHNldCBieSBsb2dyZWRvICovCisJY2hhciB1dWlkWzE2XTsJCS8qIDE2OiAxMjgtYml0IGpvdXJuYWwgdXVpZCAqLworCWNoYXIgbGFiZWxbMTZdOwkJLyogMTY6IGpvdXJuYWwgbGFiZWwgKi8KKwlzdHJ1Y3QgeworCQljaGFyIHV1aWRbMTZdOworCX0gYWN0aXZlW01BWF9BQ1RJVkVdOwkvKiAyMDQ4OiBhY3RpdmUgZmlsZSBzeXN0ZW1zIGxpc3QgKi8KK307CisKKyNkZWZpbmUgTlVMTF9VVUlEICJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCIKKworLyogbG9nIGZsYWc6IGNvbW1pdCBvcHRpb24gKHNlZSBqZnNfZmlsc3lzLmgpICovCisKKy8qIGxvZyBzdGF0ZSAqLworI2RlZmluZQlMT0dNT1VOVAkwCS8qIGxvZyBtb3VudGVkIGJ5IGxtTG9nSW5pdCgpICovCisjZGVmaW5lIExPR1JFRE9ORQkxCS8qIGxvZyBzaHV0ZG93biBieSBsbUxvZ1NodXRkb3duKCkuCisJCQkJICogbG9nIHJlZG8gY29tcGxldGVkIGJ5IGxvZ3JlZG8oKS4KKwkJCQkgKi8KKyNkZWZpbmUgTE9HV1JBUAkJMgkvKiBsb2cgd3JhcHBlZCAqLworI2RlZmluZSBMT0dSRUFERVJSCTMJLyogbG9nIHJlYWQgZXJyb3IgZGV0ZWN0ZWQgaW4gbG9ncmVkbygpICovCisKKworLyoKKyAqCWxvZyBsb2dpY2FsIHBhZ2UKKyAqCisgKiAodGhpcyBjb21tZW50IHNob3VsZCBiZSByZXdyaXR0ZW4gISkKKyAqIHRoZSBoZWFkZXIgYW5kIHRyYWlsZXIgc3RydWN0dXJlcyAoaCx0KSB3aWxsIG5vcm1hbGx5IGhhdmUgCisgKiB0aGUgc2FtZSBwYWdlIGFuZCBlb3IgdmFsdWUuCisgKiBBbiBleGNlcHRpb24gdG8gdGhpcyBvY2N1cnMgd2hlbiBhIGNvbXBsZXRlIHBhZ2Ugd3JpdGUgaXMgbm90IAorICogYWNjb21wbGlzaGVkIG9uIGEgcG93ZXIgZmFpbHVyZS4gU2luY2UgdGhlIGhhcmR3YXJlIG1heSAic3BsaXQgd3JpdGUiCisgKiBzZWN0b3JzIGluIHRoZSBwYWdlLCBhbnkgb3V0IG9mIG9yZGVyIHNlcXVlbmNlIG1heSBvY2N1ciBkdXJpbmcgcG93ZXJmYWlsIAorICogYW5kIG5lZWRzIHRvIGJlIHJlY29nbml6ZWQgZHVyaW5nIGxvZyByZXBsYXkuICBUaGUgeG9yIHZhbHVlIGlzCisgKiBhbiAiZXhjbHVzaXZlIG9yIiBvZiBhbGwgbG9nIHdvcmRzIGluIHRoZSBwYWdlIHVwIHRvIGVvci4gIFRoaXMKKyAqIDMyIGJpdCBlb3IgaXMgc3RvcmVkIHdpdGggdGhlIHRvcCAxNiBiaXRzIGluIHRoZSBoZWFkZXIgYW5kIHRoZQorICogYm90dG9tIDE2IGJpdHMgaW4gdGhlIHRyYWlsZXIuICBsb2dyZWRvIGNhbiBlYXNpbHkgcmVjb2duaXplIHBhZ2VzCisgKiB0aGF0IHdlcmUgbm90IGNvbXBsZXRlZCBieSByZWNvbnN0cnVjdGluZyB0aGlzIGVvciBhbmQgY2hlY2tpbmcgCisgKiB0aGUgbG9nIHBhZ2UuCisgKgorICogUHJldmlvdXMgdmVyc2lvbnMgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gZGlkIG5vdCBhbGxvdyBzcGxpdCAKKyAqIHdyaXRlcyBhbmQgZGV0ZWN0ZWQgcGFydGlhbGx5IHdyaXR0ZW4gcmVjb3JkcyBpbiBsb2dyZWRvIGJ5IAorICogb3JkZXJpbmcgdGhlIHVwZGF0ZXMgdG8gdGhlIGhlYWRlciwgdHJhaWxlciwgYW5kIHRoZSBtb3ZlIG9mIGRhdGEgCisgKiBpbnRvIHRoZSBsb2dkYXRhIGFyZWEuICBUaGUgb3JkZXI6ICgxKSBkYXRhIGlzIG1vdmVkICgyKSBoZWFkZXIgCisgKiBpcyB1cGRhdGVkICgzKSB0cmFpbGVyIGlzIHVwZGF0ZWQuICBJbiBsb2dyZWRvLCB3aGVuIHRoZSBoZWFkZXIgCisgKiBkaWZmZXJlZCBmcm9tIHRoZSB0cmFpbGVyLCB0aGUgaGVhZGVyIGFuZCB0cmFpbGVyIHdlcmUgcmVjb25jaWxlZCAKKyAqIGFzIGZvbGxvd3M6IGlmIGgucGFnZSAhPSB0LnBhZ2UgdGhleSB3ZXJlIHNldCB0byB0aGUgc21hbGxlciBvZiAKKyAqIHRoZSB0d28gYW5kIGguZW9yIGFuZCB0LmVvciBzZXQgdG8gOCAoaS5lLiBlbXB0eSBwYWdlKS4gaWYgKG9ubHkpIAorICogaC5lb3IgIT0gdC5lb3IgdGhleSB3ZXJlIHNldCB0byB0aGUgc21hbGxlciBvZiB0aGVpciB0d28gdmFsdWVzLgorICovCitzdHJ1Y3QgbG9ncGFnZSB7CisJc3RydWN0IHsJCS8qIGhlYWRlciAqLworCQlfX2xlMzIgcGFnZTsJLyogNDogbG9nIHNlcXVlbmNlIHBhZ2UgbnVtYmVyICovCisJCV9fbGUxNiByc3J2ZDsJLyogMjogKi8KKwkJX19sZTE2IGVvcjsJLyogMjogZW5kLW9mLWxvZyBvZmZzZXQgb2YgbGFzcnQgcmVjb3JkIHdyaXRlICovCisJfSBoOworCisJX19sZTMyIGRhdGFbTE9HUFNJWkUgLyA0IC0gNF07CS8qIGxvZyByZWNvcmQgYXJlYSAqLworCisJc3RydWN0IHsJCS8qIHRyYWlsZXIgKi8KKwkJX19sZTMyIHBhZ2U7CS8qIDQ6IG5vcm1hbGx5IHRoZSBzYW1lIGFzIGgucGFnZSAqLworCQlfX2xlMTYgcnNydmQ7CS8qIDI6ICovCisJCV9fbGUxNiBlb3I7CS8qIDI6IG5vcm1hbGx5IHRoZSBzYW1lIGFzIGguZW9yICovCisJfSB0OworfTsKKworI2RlZmluZSBMT0dQSERSU0laRQk4CS8qIGxvZyBwYWdlIGhlYWRlciBzaXplICovCisjZGVmaW5lIExPR1BUTFJTSVpFCTgJLyogbG9nIHBhZ2UgdHJhaWxlciBzaXplICovCisKKworLyoKKyAqCWxvZyByZWNvcmQKKyAqCisgKiAodGhpcyBjb21tZW50IHNob3VsZCBiZSByZXdyaXR0ZW4gISkKKyAqIGpmcyB1c2VzIG9ubHkgImFmdGVyIiBsb2cgcmVjb3JkcyAob25seSBhIHNpbmdsZSB3cml0ZXIgaXMgYWxsb3dlZAorICogaW4gYSAgcGFnZSwgcGFnZXMgYXJlIHdyaXR0ZW4gdG8gdGVtcG9yYXJ5IHBhZ2luZyBzcGFjZSBpZgorICogaWYgdGhleSBtdXN0IGJlIHdyaXR0ZW4gdG8gZGlzayBiZWZvcmUgY29tbWl0LCBhbmQgaS9vIGlzCisgKiBzY2hlZHVsZWQgZm9yIG1vZGlmaWVkIHBhZ2VzIHRvIHRoZWlyIGhvbWUgbG9jYXRpb24gYWZ0ZXIKKyAqIHRoZSBsb2cgcmVjb3JkcyBjb250YWluaW5nIHRoZSBhZnRlciB2YWx1ZXMgYW5kIHRoZSBjb21taXQgCisgKiByZWNvcmQgaXMgd3JpdHRlbiB0byB0aGUgbG9nIG9uIGRpc2ssIHVuZG8gZGlzY2FyZHMgdGhlIGNvcHkKKyAqIGluIG1haW4tbWVtb3J5LikKKyAqCisgKiBhIGxvZyByZWNvcmQgY29uc2lzdHMgb2YgYSBkYXRhIGFyZWEgb2YgdmFyaWFibGUgbGVuZ3RoIGZvbGxvd2VkIGJ5IAorICogYSBkZXNjcmlwdG9yIG9mIGZpeGVkIHNpemUgTE9HUkRTSVpFIGJ5dGVzLgorICogdGhlICBkYXRhIGFyZWEgaXMgcm91bmRlZCB1cCB0byBhbiBpbnRlZ3JhbCBudW1iZXIgb2YgNC1ieXRlcyBhbmQgCisgKiBtdXN0IGJlIG5vIGxvbmdlciB0aGFuIExPR1BTSVpFLgorICogdGhlIGRlc2NyaXB0b3IgaXMgb2Ygc2l6ZSBvZiBtdWx0aXBsZSBvZiA0LWJ5dGVzIGFuZCBhbGlnbmVkIG9uIGEgCisgKiA0LWJ5dGUgYm91bmRhcnkuIAorICogcmVjb3JkcyBhcmUgcGFja2VkIG9uZSBhZnRlciB0aGUgb3RoZXIgaW4gdGhlIGRhdGEgYXJlYSBvZiBsb2cgcGFnZXMuCisgKiAoc29tZXRpbWVzIGEgRFVNTVkgcmVjb3JkIGlzIGluc2VydGVkIHNvIHRoYXQgYXQgbGVhc3Qgb25lIHJlY29yZCBlbmRzIAorICogb24gZXZlcnkgcGFnZSBvciB0aGUgbG9uZ2VzdCByZWNvcmQgaXMgcGxhY2VkIG9uIGF0IG1vc3QgdHdvIHBhZ2VzKS4KKyAqIHRoZSBmaWVsZCBlb3IgaW4gcGFnZSBoZWFkZXIvdHJhaWxlciBwb2ludHMgdG8gdGhlIGJ5dGUgZm9sbG93aW5nIAorICogdGhlIGxhc3QgcmVjb3JkIG9uIGEgcGFnZS4KKyAqLworCisvKiBsb2cgcmVjb3JkIHR5cGVzICovCisjZGVmaW5lIExPR19DT01NSVQJCTB4ODAwMAorI2RlZmluZSBMT0dfU1lOQ1BUCQkweDQwMDAKKyNkZWZpbmUgTE9HX01PVU5UCQkweDIwMDAKKyNkZWZpbmUgTE9HX1JFRE9QQUdFCQkweDA4MDAKKyNkZWZpbmUgTE9HX05PUkVET1BBR0UJCTB4MDA4MAorI2RlZmluZSBMT0dfTk9SRURPSU5PRVhUCTB4MDA0MAorI2RlZmluZSBMT0dfVVBEQVRFTUFQCQkweDAwMDgKKyNkZWZpbmUgTE9HX05PUkVET0ZJTEUJCTB4MDAwMQorCisvKiBSRURPUEFHRS9OT1JFRE9QQUdFIGxvZyByZWNvcmQgZGF0YSB0eXBlICovCisjZGVmaW5lCUxPR19JTk9ERQkJMHgwMDAxCisjZGVmaW5lCUxPR19YVFJFRQkJMHgwMDAyCisjZGVmaW5lCUxPR19EVFJFRQkJMHgwMDA0CisjZGVmaW5lCUxPR19CVFJPT1QJCTB4MDAxMAorI2RlZmluZQlMT0dfRUEJCQkweDAwMjAKKyNkZWZpbmUJTE9HX0FDTAkJCTB4MDA0MAorI2RlZmluZQlMT0dfREFUQQkJMHgwMDgwCisjZGVmaW5lCUxPR19ORVcJCQkweDAxMDAKKyNkZWZpbmUJTE9HX0VYVEVORAkJMHgwMjAwCisjZGVmaW5lIExPR19SRUxPQ0FURQkJMHgwNDAwCisjZGVmaW5lIExPR19ESVJfWFRSRUUJCTB4MDgwMAkvKiBYdHJlZSBpcyBpbiBkaXJlY3RvcnkgaW5vZGUgKi8KKworLyogVVBEQVRFTUFQIGxvZyByZWNvcmQgZGVzY3JpcHRvciB0eXBlICovCisjZGVmaW5lCUxPR19BTExPQ1hBRExJU1QJMHgwMDgwCisjZGVmaW5lCUxPR19BTExPQ1BYRExJU1QJMHgwMDQwCisjZGVmaW5lCUxPR19BTExPQ1hBRAkJMHgwMDIwCisjZGVmaW5lCUxPR19BTExPQ1BYRAkJMHgwMDEwCisjZGVmaW5lCUxPR19GUkVFWEFETElTVAkJMHgwMDA4CisjZGVmaW5lCUxPR19GUkVFUFhETElTVAkJMHgwMDA0CisjZGVmaW5lCUxPR19GUkVFWEFECQkweDAwMDIKKyNkZWZpbmUJTE9HX0ZSRUVQWEQJCTB4MDAwMQorCisKK3N0cnVjdCBscmQgeworCS8qCisJICogdHlwZSBpbmRlcGVuZGVudCBhcmVhCisJICovCisJX19sZTMyIGxvZ3RpZDsJCS8qIDQ6IGxvZyB0cmFuc2FjdGlvbiBpZGVudGlmaWVyICovCisJX19sZTMyIGJhY2tjaGFpbjsJLyogNDogcHRyIHRvIHByZXYgcmVjb3JkIG9mIHNhbWUgdHJhbnNhY3Rpb24gKi8KKwlfX2xlMTYgdHlwZTsJCS8qIDI6IHJlY29yZCB0eXBlICovCisJX19sZTE2IGxlbmd0aDsJCS8qIDI6IGxlbmd0aCBvZiBkYXRhIGluIHJlY29yZCAoaW4gYnl0ZSkgKi8KKwlfX2xlMzIgYWdncmVnYXRlOwkvKiA0OiBmaWxlIHN5c3RlbSBsdi9hZ2dyZWdhdGUgKi8KKwkvKiAoMTYpICovCisKKwkvKgorCSAqIHR5cGUgZGVwZW5kZW50IGFyZWEgKDIwKQorCSAqLworCXVuaW9uIHsKKworCQkvKgorCQkgKiAgICAgIENPTU1JVDogY29tbWl0CisJCSAqCisJCSAqIHRyYW5zYWN0aW9uIGNvbW1pdDogbm8gdHlwZS1kZXBlbmRlbnQgaW5mb3JtYXRpb247CisJCSAqLworCisJCS8qCisJCSAqICAgICAgUkVET1BBR0U6IGFmdGVyLWltYWdlCisJCSAqCisJCSAqIGFwcGx5IGFmdGVyLWltYWdlOworCQkgKgorCQkgKiBOLkIuIFJFRE9QQUdFLCBOT1JFRE9QQUdFLCBhbmQgVVBEQVRFTUFQIG11c3QgYmUgc2FtZSBmb3JtYXQ7CisJCSAqLworCQlzdHJ1Y3QgeworCQkJX19sZTMyIGZpbGVzZXQ7CS8qIDQ6IGZpbGVzZXQgbnVtYmVyICovCisJCQlfX2xlMzIgaW5vZGU7CS8qIDQ6IGlub2RlIG51bWJlciAqLworCQkJX19sZTE2IHR5cGU7CS8qIDI6IFJFRE9QQUdFIHJlY29yZCB0eXBlICovCisJCQlfX2xlMTYgbDJsaW5lc2l6ZTsJLyogMjogbG9nMiBvZiBsaW5lIHNpemUgKi8KKwkJCXB4ZF90IHB4ZDsJLyogODogb24tZGlzayBwYWdlIHB4ZCAqLworCQl9IHJlZG9wYWdlOwkvKiAoMjApICovCisKKwkJLyoKKwkJICogICAgICBOT1JFRE9QQUdFOiB0aGUgcGFnZSBpcyBmcmVlZAorCQkgKgorCQkgKiBkbyBub3QgYXBwbHkgYWZ0ZXItaW1hZ2UgcmVjb3JkcyB3aGljaCBwcmVjZWRlIHRoaXMgcmVjb3JkCisJCSAqIGluIHRoZSBsb2cgd2l0aCB0aGUgc2FtZSBwYWdlIGJsb2NrIG51bWJlciB0byB0aGlzIHBhZ2UuCisJCSAqCisJCSAqIE4uQi4gUkVET1BBR0UsIE5PUkVET1BBR0UsIGFuZCBVUERBVEVNQVAgbXVzdCBiZSBzYW1lIGZvcm1hdDsKKwkJICovCisJCXN0cnVjdCB7CisJCQlfX2xlMzIgZmlsZXNldDsJLyogNDogZmlsZXNldCBudW1iZXIgKi8KKwkJCV9fbGUzMiBpbm9kZTsJLyogNDogaW5vZGUgbnVtYmVyICovCisJCQlfX2xlMTYgdHlwZTsJLyogMjogTk9SRURPUEFHRSByZWNvcmQgdHlwZSAqLworCQkJX19sZTE2IHJzcnZkOwkvKiAyOiByZXNlcnZlZCAqLworCQkJcHhkX3QgcHhkOwkvKiA4OiBvbi1kaXNrIHBhZ2UgcHhkICovCisJCX0gbm9yZWRvcGFnZTsJLyogKDIwKSAqLworCisJCS8qCisJCSAqICAgICAgVVBEQVRFTUFQOiB1cGRhdGUgYmxvY2sgYWxsb2NhdGlvbiBtYXAKKwkJICoKKwkJICogZWl0aGVyIGluLWxpbmUgUFhELAorCQkgKiBvciAgICAgb3V0LW9mLWxpbmUgIFhBRExJU1Q7CisJCSAqCisJCSAqIE4uQi4gUkVET1BBR0UsIE5PUkVET1BBR0UsIGFuZCBVUERBVEVNQVAgbXVzdCBiZSBzYW1lIGZvcm1hdDsKKwkJICovCisJCXN0cnVjdCB7CisJCQlfX2xlMzIgZmlsZXNldDsJLyogNDogZmlsZXNldCBudW1iZXIgKi8KKwkJCV9fbGUzMiBpbm9kZTsJLyogNDogaW5vZGUgbnVtYmVyICovCisJCQlfX2xlMTYgdHlwZTsJLyogMjogVVBEQVRFTUFQIHJlY29yZCB0eXBlICovCisJCQlfX2xlMTYgbnhkOwkvKiAyOiBudW1iZXIgb2YgZXh0ZW50cyAqLworCQkJcHhkX3QgcHhkOwkvKiA4OiBweGQgKi8KKwkJfSB1cGRhdGVtYXA7CS8qICgyMCkgKi8KKworCQkvKgorCQkgKiAgICAgIE5PUkVET0lOT0VYVDogdGhlIGlub2RlIGV4dGVudCBpcyBmcmVlZAorCQkgKgorCQkgKiBkbyBub3QgYXBwbHkgYWZ0ZXItaW1hZ2UgcmVjb3JkcyB3aGljaCBwcmVjZWRlIHRoaXMgCisJCSAqIHJlY29yZCBpbiB0aGUgbG9nIHdpdGggdGhlIGFueSBvZiB0aGUgNCBwYWdlIGJsb2NrIAorCQkgKiBudW1iZXJzIGluIHRoaXMgaW5vZGUgZXh0ZW50LiAKKwkJICogCisJCSAqIE5PVEU6IFRoZSBmaWxlc2V0IGFuZCBweGQgZmllbGRzIE1VU1QgcmVtYWluIGluIAorCQkgKiAgICAgICB0aGUgc2FtZSBmaWVsZHMgaW4gdGhlIFJFRE9QQUdFIHJlY29yZCBmb3JtYXQuCisJCSAqCisJCSAqLworCQlzdHJ1Y3QgeworCQkJX19sZTMyIGZpbGVzZXQ7CS8qIDQ6IGZpbGVzZXQgbnVtYmVyICovCisJCQlfX2xlMzIgaWFnbnVtOwkvKiA0OiBJQUcgbnVtYmVyICAgICAqLworCQkJX19sZTMyIGlub2V4dF9pZHg7CS8qIDQ6IGlub2RlIGV4dGVudCBpbmRleCAqLworCQkJcHhkX3QgcHhkOwkvKiA4OiBvbi1kaXNrIHBhZ2UgcHhkICovCisJCX0gbm9yZWRvaW5vZXh0OwkvKiAoMjApICovCisKKwkJLyoKKwkJICogICAgICBTWU5DUFQ6IGxvZyBzeW5jIHBvaW50CisJCSAqCisJCSAqIHJlcGxheSBsb2cgdXB0byBzeW5jcHQgYWRkcmVzcyBzcGVjaWZpZWQ7CisJCSAqLworCQlzdHJ1Y3QgeworCQkJX19sZTMyIHN5bmM7CS8qIDQ6IHN5bmNwdCBhZGRyZXNzICgwID0gaGVyZSkgKi8KKwkJfSBzeW5jcHQ7CisKKwkJLyoKKwkJICogICAgICBNT1VOVDogZmlsZSBzeXN0ZW0gbW91bnQKKwkJICoKKwkJICogZmlsZSBzeXN0ZW0gbW91bnQ6IG5vIHR5cGUtZGVwZW5kZW50IGluZm9ybWF0aW9uOworCQkgKi8KKworCQkvKgorCQkgKiAgICAgID8gRlJFRVhURU5UOiBmcmVlIHNwZWNpZmllZCBleHRlbnQocykKKwkJICoKKwkJICogZnJlZSBzcGVjaWZpZWQgZXh0ZW50KHMpIGZyb20gYmxvY2sgYWxsb2NhdGlvbiBtYXAKKwkJICogTi5CLjogbmV4dGVudHMgc2hvdWxkIGJlIGxlbmd0aCBvZiBkYXRhL3NpemVvZih4YWRfdCkKKwkJICovCisJCXN0cnVjdCB7CisJCQlfX2xlMzIgdHlwZTsJLyogNDogRlJFRVhURU5UIHJlY29yZCB0eXBlICovCisJCQlfX2xlMzIgbmV4dGVudDsJLyogNDogbnVtYmVyIG9mIGV4dGVudHMgKi8KKworCQkJLyogZGF0YTogUFhEIG9yIFhBRCBsaXN0ICovCisJCX0gZnJlZXh0ZW50OworCisJCS8qCisJCSAqICAgICAgPyBOT1JFRE9GSUxFOiB0aGlzIGZpbGUgaXMgZnJlZWQKKwkJICoKKwkJICogZG8gbm90IGFwcGx5IHJlY29yZHMgd2hpY2ggcHJlY2VkZSB0aGlzIHJlY29yZCBpbiB0aGUgbG9nCisJCSAqIHdpdGggdGhlIHNhbWUgaW5vZGUgbnVtYmVyLgorCQkgKgorCQkgKiBOT1JFRElMRSBtdXN0IGJlIHRoZSBmaXJzdCB0byBiZSB3cml0dGVuIGF0IGNvbW1pdAorCQkgKiAobGFzdCB0byBiZSByZWFkIGluIGxvZ3JlZG8oKSkgLSBpdCBwcmV2ZW50cworCQkgKiByZXBsYXkgb2YgcHJlY2VkaW5nIHVwZGF0ZXMgb2YgYWxsIHByZWNlZGluZyBnZW5lcmF0aW9ucworCQkgKiBvZiB0aGUgaW51bWJlciBlc3AuIHRoZSBvbi1kaXNrIGlub2RlIGl0c2VsZiwgCisJCSAqIGJ1dCBkb2VzIE5PVCBwcmV2ZW50CisJCSAqIHJlcGxheSBvZiB0aGUgCisJCSAqLworCQlzdHJ1Y3QgeworCQkJX19sZTMyIGZpbGVzZXQ7CS8qIDQ6IGZpbGVzZXQgbnVtYmVyICovCisJCQlfX2xlMzIgaW5vZGU7CS8qIDQ6IGlub2RlIG51bWJlciAqLworCQl9IG5vcmVkb2ZpbGU7CisKKwkJLyoKKwkJICogICAgICA/IE5FV1BBR0U6IAorCQkgKgorCQkgKiBtZXRhZGF0YSB0eXBlIGRlcGVuZGVudAorCQkgKi8KKwkJc3RydWN0IHsKKwkJCV9fbGUzMiBmaWxlc2V0OwkvKiA0OiBmaWxlc2V0IG51bWJlciAqLworCQkJX19sZTMyIGlub2RlOwkvKiA0OiBpbm9kZSBudW1iZXIgKi8KKwkJCV9fbGUzMiB0eXBlOwkvKiA0OiBORVdQQUdFIHJlY29yZCB0eXBlICovCisJCQlweGRfdCBweGQ7CS8qIDg6IG9uLWRpc2sgcGFnZSBweGQgKi8KKwkJfSBuZXdwYWdlOworCisJCS8qCisJCSAqICAgICAgPyBEVU1NWTogZmlsbGVyCisJCSAqCisJCSAqIG5vIHR5cGUtZGVwZW5kZW50IGluZm9ybWF0aW9uCisJCSAqLworCX0gbG9nOworfTsJCQkJCS8qICgzNikgKi8KKworI2RlZmluZQlMT0dSRFNJWkUJKHNpemVvZihzdHJ1Y3QgbHJkKSkKKworLyoKKyAqCWxpbmUgdmVjdG9yIGRlc2NyaXB0b3IKKyAqLworc3RydWN0IGx2ZCB7CisJX19sZTE2IG9mZnNldDsKKwlfX2xlMTYgbGVuZ3RoOworfTsKKworCisvKgorICoJbG9nIGxvZ2ljYWwgdm9sdW1lCisgKi8KK3N0cnVjdCBqZnNfbG9nIHsKKworCXN0cnVjdCBsaXN0X2hlYWQgc2JfbGlzdDsvKiAgVGhpcyBpcyB1c2VkIHRvIHN5bmMgbWV0YWRhdGEKKwkJCQkgKiAgICBiZWZvcmUgd3JpdGluZyBzeW5jcHQuCisJCQkJICovCisJc3RydWN0IGxpc3RfaGVhZCBqb3VybmFsX2xpc3Q7IC8qIEdsb2JhbCBsaXN0ICovCisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsgLyogNDogbG9nIGx2IHBvaW50ZXIgKi8KKwlpbnQgc2VyaWFsOwkJLyogNDogbG9nIG1vdW50IHNlcmlhbCBudW1iZXIgKi8KKworCXM2NCBiYXNlOwkJLyogQDg6IGxvZyBleHRlbnQgYWRkcmVzcyAoaW5saW5lIGxvZyApICovCisJaW50IHNpemU7CQkvKiA0OiBsb2cgc2l6ZSBpbiBsb2cgcGFnZSAoaW4gcGFnZSkgKi8KKwlpbnQgbDJic2l6ZTsJCS8qIDQ6IGxvZzIgb2YgYnNpemUgKi8KKworCWxvbmcgZmxhZzsJCS8qIDQ6IGZsYWcgKi8KKworCXN0cnVjdCBsYnVmICpsYnVmX2ZyZWU7CS8qIDQ6IGZyZWUgbGJ1ZnMgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBmcmVlX3dhaXQ7CS8qIDQ6ICovCisKKwkvKiBsb2cgd3JpdGUgKi8KKwlpbnQgbG9ndGlkOwkJLyogNDogbG9nIHRpZCAqLworCWludCBwYWdlOwkJLyogNDogcGFnZSBudW1iZXIgb2YgZW9sIHBhZ2UgKi8KKwlpbnQgZW9yOwkJLyogNDogZW9yIG9mIGxhc3QgcmVjb3JkIGluIGVvbCBwYWdlICovCisJc3RydWN0IGxidWYgKmJwOwkvKiA0OiBjdXJyZW50IGxvZyBwYWdlIGJ1ZmZlciAqLworCisJc3RydWN0IHNlbWFwaG9yZSBsb2dsb2NrOwkvKiA0OiBsb2cgd3JpdGUgc2VyaWFsaXphdGlvbiBsb2NrICovCisKKwkvKiBzeW5jcHQgKi8KKwlpbnQgbmV4dHN5bmM7CQkvKiA0OiBieXRlcyB0byB3cml0ZSBiZWZvcmUgbmV4dCBzeW5jcHQgKi8KKwlpbnQgYWN0aXZlOwkJLyogNDogKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBzeW5jd2FpdDsJLyogNDogKi8KKworCS8qIGNvbW1pdCAqLworCXVpbnQgY2ZsYWc7CQkvKiA0OiAqLworCXN0cnVjdCBsaXN0X2hlYWQgY3F1ZXVlOyAvKiBGSUZPIGNvbW1pdCBxdWV1ZSAqLworCXN0cnVjdCB0YmxvY2sgKmZsdXNoX3RibGs7IC8qIHRibGsgd2UncmUgd2FpdGluZyBvbiBmb3IgZmx1c2ggKi8KKwlpbnQgZ2NydGM7CQkvKiA0OiBHQ19SRUFEWSB0cmFuc2FjdGlvbiBjb3VudCAqLworCXN0cnVjdCB0YmxvY2sgKmdjbHJ0OwkvKiA0OiBsYXRlc3QgR0NfUkVBRFkgdHJhbnNhY3Rpb24gKi8KKwlzcGlubG9ja190IGdjbG9jazsJLyogNDogZ3JvdXAgY29tbWl0IGxvY2sgKi8KKwlpbnQgbG9nc2l6ZTsJCS8qIDQ6IGxvZyBkYXRhIGFyZWEgc2l6ZSBpbiBieXRlICovCisJaW50IGxzbjsJCS8qIDQ6IGVuZC1vZi1sb2cgKi8KKwlpbnQgY2xzbjsJCS8qIDQ6IGNsc24gKi8KKwlpbnQgc3luY3B0OwkJLyogNDogYWRkciBvZiBsYXN0IHN5bmNwdCByZWNvcmQgKi8KKwlpbnQgc3luYzsJCS8qIDQ6IGFkZHIgZnJvbSBsYXN0IGxvZ3N5bmMoKSAqLworCXN0cnVjdCBsaXN0X2hlYWQgc3luY2xpc3Q7CS8qIDg6IGxvZ3N5bmNsaXN0IGFuY2hvciAqLworCXNwaW5sb2NrX3Qgc3luY2xvY2s7CS8qIDQ6IHN5bmNsaXN0IGxvY2sgKi8KKwlzdHJ1Y3QgbGJ1ZiAqd3F1ZXVlOwkvKiA0OiBsb2cgcGFnZW91dCBxdWV1ZSAqLworCWludCBjb3VudDsJCS8qIDQ6IGNvdW50ICovCisJY2hhciB1dWlkWzE2XTsJCS8qIDE2OiAxMjgtYml0IHV1aWQgb2YgbG9nIGRldmljZSAqLworCisJaW50IG5vX2ludGVncml0eTsJLyogMzogZmxhZyB0byBkaXNhYmxlIGpvdXJuYWxpbmcgdG8gZGlzayAqLworfTsKKworLyoKKyAqIExvZyBmbGFnCisgKi8KKyNkZWZpbmUgbG9nX0lOTElORUxPRwkxCisjZGVmaW5lIGxvZ19TWU5DQkFSUklFUgkyCisjZGVmaW5lIGxvZ19RVUlFU0NFCTMKKyNkZWZpbmUgbG9nX0ZMVVNICTQKKworLyoKKyAqIGdyb3VwIGNvbW1pdCBmbGFnCisgKi8KKy8qIGpmc19sb2cgKi8KKyNkZWZpbmUgbG9nR0NfUEFHRU9VVAkweDAwMDAwMDAxCisKKy8qIHRibG9jay9sYnVmICovCisjZGVmaW5lIHRibGtHQ19RVUVVRQkJMHgwMDAxCisjZGVmaW5lIHRibGtHQ19SRUFEWQkJMHgwMDAyCisjZGVmaW5lIHRibGtHQ19DT01NSVQJCTB4MDAwNAorI2RlZmluZSB0YmxrR0NfQ09NTUlUVEVECTB4MDAwOAorI2RlZmluZSB0YmxrR0NfRU9QCQkweDAwMTAKKyNkZWZpbmUgdGJsa0dDX0ZSRUUJCTB4MDAyMAorI2RlZmluZSB0YmxrR0NfTEVBREVSCQkweDAwNDAKKyNkZWZpbmUgdGJsa0dDX0VSUk9SCQkweDAwODAKKyNkZWZpbmUgdGJsa0dDX0xBWlkJCTB4MDEwMAkvLyBEMjMwODYwCisjZGVmaW5lIHRibGtHQ19VTkxPQ0tFRAkJMHgwMjAwCS8vIEQyMzA4NjAKKworLyoKKyAqCQlsb2cgY2FjaGUgYnVmZmVyIGhlYWRlcgorICovCitzdHJ1Y3QgbGJ1ZiB7CisJc3RydWN0IGpmc19sb2cgKmxfbG9nOwkvKiA0OiBsb2cgYXNzb2NpYXRlZCB3aXRoIGJ1ZmZlciAqLworCisJLyoKKwkgKiBkYXRhIGJ1ZmZlciBiYXNlIGFyZWEKKwkgKi8KKwl1aW50IGxfZmxhZzsJCS8qIDQ6IHBhZ2VvdXQgY29udHJvbCBmbGFncyAqLworCisJc3RydWN0IGxidWYgKmxfd3FuZXh0OwkvKiA0OiB3cml0ZSBxdWV1ZSBsaW5rICovCisJc3RydWN0IGxidWYgKmxfZnJlZWxpc3Q7CS8qIDQ6IGZyZWVsaXN0bGluayAqLworCisJaW50IGxfcG47CQkvKiA0OiBsb2cgcGFnZSBudW1iZXIgKi8KKwlpbnQgbF9lb3I7CQkvKiA0OiBsb2cgcmVjb3JkIGVvciAqLworCWludCBsX2Nlb3I7CQkvKiA0OiBjb21taXR0ZWQgbG9nIHJlY29yZCBlb3IgKi8KKworCXM2NCBsX2Jsa25vOwkJLyogODogbG9nIHBhZ2UgYmxvY2sgbnVtYmVyICovCisJY2FkZHJfdCBsX2xkYXRhOwkvKiA0OiBkYXRhIHBhZ2UgKi8KKworCXdhaXRfcXVldWVfaGVhZF90IGxfaW9ldmVudDsJLyogNDogaS9vIGRvbmUgZXZlbnQgKi8KKwlzdHJ1Y3QgcGFnZSAqbF9wYWdlOwkvKiBUaGUgcGFnZSBpdHNlbGYgKi8KK307CisKKy8qIFJldXNlIGxfZnJlZWxpc3QgZm9yIHJlZHJpdmUgbGlzdCAqLworI2RlZmluZSBsX3JlZHJpdmVfbmV4dCBsX2ZyZWVsaXN0CisKKy8qCisgKglsb2dzeW5jbGlzdCBibG9jaworICoKKyAqIGNvbW1vbiBsb2dzeW5jYmxrIHByZWZpeCBmb3IgamJ1Zl90IGFuZCB0YmxvY2sKKyAqLworc3RydWN0IGxvZ3N5bmNibGsgeworCXUxNiB4ZmxhZzsJCS8qIGZsYWdzICovCisJdTE2IGZsYWc7CQkvKiBvbmx5IG1lYW5pbmZ1bCBpbiB0YmxvY2sgKi8KKwlsaWRfdCBsaWQ7CQkvKiBsb2NrIGlkICovCisJczMyIGxzbjsJCS8qIGxvZyBzZXF1ZW5jZSBudW1iZXIgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHN5bmNsaXN0OwkvKiBsb2cgc3luYyBsaXN0IGxpbmsgKi8KK307CisKKy8qCisgKglsb2dzeW5jbGlzdCBzZXJpYWxpemF0aW9uIChwZXIgbG9nKQorICovCisKKyNkZWZpbmUgTE9HU1lOQ19MT0NLX0lOSVQobG9nKSBzcGluX2xvY2tfaW5pdCgmKGxvZyktPnN5bmNsb2NrKQorI2RlZmluZSBMT0dTWU5DX0xPQ0sobG9nKSBzcGluX2xvY2soJihsb2cpLT5zeW5jbG9jaykKKyNkZWZpbmUgTE9HU1lOQ19VTkxPQ0sobG9nKSBzcGluX3VubG9jaygmKGxvZyktPnN5bmNsb2NrKQorCisvKiBjb21wdXRlIHRoZSBkaWZmZXJlbmNlIGluIGJ5dGVzIG9mIGxzbiBmcm9tIHN5bmMgcG9pbnQgKi8KKyNkZWZpbmUgbG9nZGlmZihkaWZmLCBsc24sIGxvZylcCit7XAorCWRpZmYgPSAobHNuKSAtIChsb2cpLT5zeW5jcHQ7XAorCWlmIChkaWZmIDwgMClcCisJCWRpZmYgKz0gKGxvZyktPmxvZ3NpemU7XAorfQorCitleHRlcm4gaW50IGxtTG9nT3BlbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK2V4dGVybiBpbnQgbG1Mb2dDbG9zZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK2V4dGVybiBpbnQgbG1Mb2dTaHV0ZG93bihzdHJ1Y3QgamZzX2xvZyAqIGxvZyk7CitleHRlcm4gaW50IGxtTG9nSW5pdChzdHJ1Y3QgamZzX2xvZyAqIGxvZyk7CitleHRlcm4gaW50IGxtTG9nRm9ybWF0KHN0cnVjdCBqZnNfbG9nICpsb2csIHM2NCBsb2dBZGRyZXNzLCBpbnQgbG9nU2l6ZSk7CitleHRlcm4gdm9pZCBqZnNfZmx1c2hfam91cm5hbChzdHJ1Y3QgamZzX2xvZyAqIGxvZywgaW50IHdhaXQpOworCisjZW5kaWYJCQkJLyogX0hfSkZTX0xPR01HUiAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19tZXRhcGFnZS5jIGIvZnMvamZzL2pmc19tZXRhcGFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMGEzYWMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX21ldGFwYWdlLmMKQEAgLTAsMCArMSw1ODAgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDAzCisgKiAgIFBvcnRpb25zIENvcHlyaWdodCAoQykgQ2hyaXN0b3BoIEhlbGx3aWcsIDIwMDEtMjAwMgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKKyNpbmNsdWRlICJqZnNfc3VwZXJibG9jay5oIgorI2luY2x1ZGUgImpmc19maWxzeXMuaCIKKyNpbmNsdWRlICJqZnNfbWV0YXBhZ2UuaCIKKyNpbmNsdWRlICJqZnNfdHhubWdyLmgiCisjaW5jbHVkZSAiamZzX2RlYnVnLmgiCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWV0YV9sb2NrKTsKKworI2lmZGVmIENPTkZJR19KRlNfU1RBVElTVElDUworc3RhdGljIHN0cnVjdCB7CisJdWludAlwYWdlYWxsb2M7CS8qICMgb2YgcGFnZSBhbGxvY2F0aW9ucyAqLworCXVpbnQJcGFnZWZyZWU7CS8qICMgb2YgcGFnZSBmcmVlcyAqLworCXVpbnQJbG9ja3dhaXQ7CS8qICMgb2Ygc2xlZXBpbmcgbG9ja19tZXRhcGFnZSgpIGNhbGxzICovCit9IG1wU3RhdDsKKyNlbmRpZgorCisKKyNkZWZpbmUgSEFTSF9CSVRTIDEwCQkvKiBUaGlzIG1ha2VzIGhhc2hfdGFibGUgMSA0SyBwYWdlICovCisjZGVmaW5lIEhBU0hfU0laRSAoMSA8PCBIQVNIX0JJVFMpCitzdGF0aWMgc3RydWN0IG1ldGFwYWdlICoqaGFzaF90YWJsZSA9IE5VTEw7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBoYXNoX29yZGVyOworCisKK3N0YXRpYyBpbmxpbmUgaW50IG1ldGFwYWdlX2xvY2tlZChzdHJ1Y3QgbWV0YXBhZ2UgKm1wKQoreworCXJldHVybiB0ZXN0X2JpdChNRVRBX2xvY2tlZCwgJm1wLT5mbGFnKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdHJ5bG9ja19tZXRhcGFnZShzdHJ1Y3QgbWV0YXBhZ2UgKm1wKQoreworCXJldHVybiB0ZXN0X2FuZF9zZXRfYml0KE1FVEFfbG9ja2VkLCAmbXAtPmZsYWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdW5sb2NrX21ldGFwYWdlKHN0cnVjdCBtZXRhcGFnZSAqbXApCit7CisJY2xlYXJfYml0KE1FVEFfbG9ja2VkLCAmbXAtPmZsYWcpOworCXdha2VfdXAoJm1wLT53YWl0KTsKK30KKworc3RhdGljIHZvaWQgX19sb2NrX21ldGFwYWdlKHN0cnVjdCBtZXRhcGFnZSAqbXApCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlJTkNSRU1FTlQobXBTdGF0LmxvY2t3YWl0KTsKKworCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZSgmbXAtPndhaXQsICZ3YWl0KTsKKwlkbyB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKG1ldGFwYWdlX2xvY2tlZChtcCkpIHsKKwkJCXNwaW5fdW5sb2NrKCZtZXRhX2xvY2spOworCQkJc2NoZWR1bGUoKTsKKwkJCXNwaW5fbG9jaygmbWV0YV9sb2NrKTsKKwkJfQorCX0gd2hpbGUgKHRyeWxvY2tfbWV0YXBhZ2UobXApKTsKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJm1wLT53YWl0LCAmd2FpdCk7Cit9CisKKy8qIG5lZWRzIG1ldGFfbG9jayAqLworc3RhdGljIGlubGluZSB2b2lkIGxvY2tfbWV0YXBhZ2Uoc3RydWN0IG1ldGFwYWdlICptcCkKK3sKKwlpZiAodHJ5bG9ja19tZXRhcGFnZShtcCkpCisJCV9fbG9ja19tZXRhcGFnZShtcCk7Cit9CisKKyNkZWZpbmUgTUVUQVBPT0xfTUlOX1BBR0VTIDMyCitzdGF0aWMga21lbV9jYWNoZV90ICptZXRhcGFnZV9jYWNoZTsKK3N0YXRpYyBtZW1wb29sX3QgKm1ldGFwYWdlX21lbXBvb2w7CisKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28sIGttZW1fY2FjaGVfdCAqY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBtZXRhcGFnZSAqbXAgPSAoc3RydWN0IG1ldGFwYWdlICopZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikgeworCQltcC0+bGlkID0gMDsKKwkJbXAtPmxzbiA9IDA7CisJCW1wLT5mbGFnID0gMDsKKwkJbXAtPmRhdGEgPSBOVUxMOworCQltcC0+Y2xzbiA9IDA7CisJCW1wLT5sb2cgPSBOVUxMOworCQlzZXRfYml0KE1FVEFfZnJlZSwgJm1wLT5mbGFnKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmbXAtPndhaXQpOworCX0KK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbWV0YXBhZ2UgKmFsbG9jX21ldGFwYWdlKGludCBnZnBfbWFzaykKK3sKKwlyZXR1cm4gbWVtcG9vbF9hbGxvYyhtZXRhcGFnZV9tZW1wb29sLCBnZnBfbWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX21ldGFwYWdlKHN0cnVjdCBtZXRhcGFnZSAqbXApCit7CisJbXAtPmZsYWcgPSAwOworCXNldF9iaXQoTUVUQV9mcmVlLCAmbXAtPmZsYWcpOworCisJbWVtcG9vbF9mcmVlKG1wLCBtZXRhcGFnZV9tZW1wb29sKTsKK30KKworaW50IF9faW5pdCBtZXRhcGFnZV9pbml0KHZvaWQpCit7CisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgbWV0YXBhZ2Ugc3RydWN0dXJlcworCSAqLworCW1ldGFwYWdlX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImpmc19tcCIsIHNpemVvZihzdHJ1Y3QgbWV0YXBhZ2UpLAorCQkJCQkgICAwLCAwLCBpbml0X29uY2UsIE5VTEwpOworCWlmIChtZXRhcGFnZV9jYWNoZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1ldGFwYWdlX21lbXBvb2wgPSBtZW1wb29sX2NyZWF0ZShNRVRBUE9PTF9NSU5fUEFHRVMsIG1lbXBvb2xfYWxsb2Nfc2xhYiwKKwkJCQkJICBtZW1wb29sX2ZyZWVfc2xhYiwgbWV0YXBhZ2VfY2FjaGUpOworCisJaWYgKG1ldGFwYWdlX21lbXBvb2wgPT0gTlVMTCkgeworCQlrbWVtX2NhY2hlX2Rlc3Ryb3kobWV0YXBhZ2VfY2FjaGUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyoKKwkgKiBOb3cgdGhlIGhhc2ggbGlzdAorCSAqLworCWZvciAoaGFzaF9vcmRlciA9IDA7CisJICAgICAoKFBBR0VfU0laRSA8PCBoYXNoX29yZGVyKSAvIHNpemVvZih2b2lkICopKSA8IEhBU0hfU0laRTsKKwkgICAgIGhhc2hfb3JkZXIrKyk7CisJaGFzaF90YWJsZSA9CisJICAgIChzdHJ1Y3QgbWV0YXBhZ2UgKiopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgaGFzaF9vcmRlcik7CisJYXNzZXJ0KGhhc2hfdGFibGUpOworCW1lbXNldChoYXNoX3RhYmxlLCAwLCBQQUdFX1NJWkUgPDwgaGFzaF9vcmRlcik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtZXRhcGFnZV9leGl0KHZvaWQpCit7CisJbWVtcG9vbF9kZXN0cm95KG1ldGFwYWdlX21lbXBvb2wpOworCWttZW1fY2FjaGVfZGVzdHJveShtZXRhcGFnZV9jYWNoZSk7Cit9CisKKy8qCisgKiBCYXNpY2FsbHkgc2FtZSBoYXNoIGFzIGluIHBhZ2VtYXAuaCwgYnV0IHVzaW5nIG91ciBoYXNoIHRhYmxlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbWV0YXBhZ2UgKiptZXRhX2hhc2goc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJICAgdW5zaWduZWQgbG9uZyBpbmRleCkKK3sKKyNkZWZpbmUgaSAoKCh1bnNpZ25lZCBsb25nKW1hcHBpbmcpLyBcCisJICAgKHNpemVvZihzdHJ1Y3QgaW5vZGUpICYgfihzaXplb2Yoc3RydWN0IGlub2RlKSAtMSApKSkKKyNkZWZpbmUgcyh4KSAoKHgpICsgKCh4KSA+PiBIQVNIX0JJVFMpKQorCXJldHVybiBoYXNoX3RhYmxlICsgKHMoaSArIGluZGV4KSAmIChIQVNIX1NJWkUgLSAxKSk7CisjdW5kZWYgaQorI3VuZGVmIHMKK30KKworc3RhdGljIHN0cnVjdCBtZXRhcGFnZSAqc2VhcmNoX2hhc2goc3RydWN0IG1ldGFwYWdlICoqIGhhc2hfcHRyLAorCQkJCSAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGluZGV4KQoreworCXN0cnVjdCBtZXRhcGFnZSAqcHRyOworCisJZm9yIChwdHIgPSAqaGFzaF9wdHI7IHB0cjsgcHRyID0gcHRyLT5oYXNoX25leHQpIHsKKwkJaWYgKChwdHItPm1hcHBpbmcgPT0gbWFwcGluZykgJiYgKHB0ci0+aW5kZXggPT0gaW5kZXgpKQorCQkJcmV0dXJuIHB0cjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgYWRkX3RvX2hhc2goc3RydWN0IG1ldGFwYWdlICogbXAsIHN0cnVjdCBtZXRhcGFnZSAqKiBoYXNoX3B0cikKK3sKKwlpZiAoKmhhc2hfcHRyKQorCQkoKmhhc2hfcHRyKS0+aGFzaF9wcmV2ID0gbXA7CisKKwltcC0+aGFzaF9wcmV2ID0gTlVMTDsKKwltcC0+aGFzaF9uZXh0ID0gKmhhc2hfcHRyOworCSpoYXNoX3B0ciA9IG1wOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfZnJvbV9oYXNoKHN0cnVjdCBtZXRhcGFnZSAqIG1wLCBzdHJ1Y3QgbWV0YXBhZ2UgKiogaGFzaF9wdHIpCit7CisJaWYgKG1wLT5oYXNoX3ByZXYpCisJCW1wLT5oYXNoX3ByZXYtPmhhc2hfbmV4dCA9IG1wLT5oYXNoX25leHQ7CisJZWxzZSB7CisJCWFzc2VydCgqaGFzaF9wdHIgPT0gbXApOworCQkqaGFzaF9wdHIgPSBtcC0+aGFzaF9uZXh0OworCX0KKworCWlmIChtcC0+aGFzaF9uZXh0KQorCQltcC0+aGFzaF9uZXh0LT5oYXNoX3ByZXYgPSBtcC0+aGFzaF9wcmV2OworfQorCitzdHJ1Y3QgbWV0YXBhZ2UgKl9fZ2V0X21ldGFwYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgbGJsb2NrLAorCQkJCXVuc2lnbmVkIGludCBzaXplLCBpbnQgYWJzb2x1dGUsCisJCQkJdW5zaWduZWQgbG9uZyBuZXcpCit7CisJc3RydWN0IG1ldGFwYWdlICoqaGFzaF9wdHI7CisJaW50IGwyQmxvY2tzUGVyUGFnZTsKKwlpbnQgbDJic2l6ZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXVuc2lnbmVkIGxvbmcgcGFnZV9pbmRleDsKKwl1bnNpZ25lZCBsb25nIHBhZ2Vfb2Zmc2V0OworCisJamZzX2luZm8oIl9fZ2V0X21ldGFwYWdlOiBpbm9kZSA9IDB4JXAsIGxibG9jayA9IDB4JWx4IiwgaW5vZGUsIGxibG9jayk7CisKKwlpZiAoYWJzb2x1dGUpCisJCW1hcHBpbmcgPSBpbm9kZS0+aV9zYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nOworCWVsc2UgeworCQkvKgorCQkgKiBJZiBhbiBuZnMgY2xpZW50IHRyaWVzIHRvIHJlYWQgYW4gaW5vZGUgdGhhdCBpcyBsYXJnZXIKKwkJICogdGhhbiBhbnkgZXhpc3RpbmcgaW5vZGVzLCB3ZSBtYXkgdHJ5IHRvIHJlYWQgcGFzdCB0aGUKKwkJICogZW5kIG9mIHRoZSBpbm9kZSBtYXAKKwkJICovCisJCWlmICgobGJsb2NrIDw8IGlub2RlLT5pX2Jsa2JpdHMpID49IGlub2RlLT5pX3NpemUpCisJCQlyZXR1cm4gTlVMTDsKKwkJbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJfQorCisJaGFzaF9wdHIgPSBtZXRhX2hhc2gobWFwcGluZywgbGJsb2NrKTsKK2FnYWluOgorCXNwaW5fbG9jaygmbWV0YV9sb2NrKTsKKwltcCA9IHNlYXJjaF9oYXNoKGhhc2hfcHRyLCBtYXBwaW5nLCBsYmxvY2spOworCWlmIChtcCkgeworCSAgICAgIHBhZ2VfZm91bmQ6CisJCWlmICh0ZXN0X2JpdChNRVRBX3N0YWxlLCAmbXAtPmZsYWcpKSB7CisJCQlzcGluX3VubG9jaygmbWV0YV9sb2NrKTsKKwkJCW1zbGVlcCgxKTsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwkJbXAtPmNvdW50Kys7CisJCWxvY2tfbWV0YXBhZ2UobXApOworCQlzcGluX3VubG9jaygmbWV0YV9sb2NrKTsKKwkJaWYgKHRlc3RfYml0KE1FVEFfZGlzY2FyZCwgJm1wLT5mbGFnKSkgeworCQkJaWYgKCFuZXcpIHsKKwkJCQlqZnNfZXJyb3IoaW5vZGUtPmlfc2IsCisJCQkJCSAgIl9fZ2V0X21ldGFwYWdlOiB1c2luZyBhICIKKwkJCQkJICAiZGlzY2FyZGVkIG1ldGFwYWdlIik7CisJCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQljbGVhcl9iaXQoTUVUQV9kaXNjYXJkLCAmbXAtPmZsYWcpOworCQl9CisJCWpmc19pbmZvKCJfX2dldF9tZXRhcGFnZTogZm91bmQgMHglcCwgaW4gaGFzaCIsIG1wKTsKKwkJaWYgKG1wLT5sb2dpY2FsX3NpemUgIT0gc2l6ZSkgeworCQkJamZzX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJCSAgIl9fZ2V0X21ldGFwYWdlOiBtcC0+bG9naWNhbF9zaXplICE9IHNpemUiKTsKKwkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlsMmJzaXplID0gaW5vZGUtPmlfYmxrYml0czsKKwkJbDJCbG9ja3NQZXJQYWdlID0gUEFHRV9DQUNIRV9TSElGVCAtIGwyYnNpemU7CisJCXBhZ2VfaW5kZXggPSBsYmxvY2sgPj4gbDJCbG9ja3NQZXJQYWdlOworCQlwYWdlX29mZnNldCA9IChsYmxvY2sgLSAocGFnZV9pbmRleCA8PCBsMkJsb2Nrc1BlclBhZ2UpKSA8PAorCQkgICAgbDJic2l6ZTsKKwkJaWYgKChwYWdlX29mZnNldCArIHNpemUpID4gUEFHRV9DQUNIRV9TSVpFKSB7CisJCQlzcGluX3VubG9jaygmbWV0YV9sb2NrKTsKKwkJCWpmc19lcnIoIk1ldGFEYXRhIGNyb3NzZXMgcGFnZSBib3VuZGFyeSEhIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQkKKwkJLyoKKwkJICogTG9ja3MgaGVsZCBvbiBhZ2dyZWdhdGUgaW5vZGUgcGFnZXMgYXJlIHVzdWFsbHkKKwkJICogbm90IGhlbGQgbG9uZywgYW5kIHRoZXkgYXJlIHRha2VuIGluIGNyaXRpY2FsIGNvZGUKKwkJICogcGF0aHMgKGNvbW1pdHRpbmcgZGlydHkgaW5vZGVzLCB0eENvbW1pdCB0aHJlYWQpIAorCQkgKiAKKwkJICogQXR0ZW1wdCB0byBnZXQgbWV0YXBhZ2Ugd2l0aG91dCBibG9ja2luZywgdGFwcGluZyBpbnRvCisJCSAqIHJlc2VydmVzIGlmIG5lY2Vzc2FyeS4KKwkJICovCisJCW1wID0gTlVMTDsKKwkJaWYgKEpGU19JUChpbm9kZSktPmZpbGVzZXQgPT0gQUdHUkVHQVRFX0kpIHsKKwkJCW1wID0gYWxsb2NfbWV0YXBhZ2UoR0ZQX0FUT01JQyk7CisJCQlpZiAoIW1wKSB7CisJCQkJLyoKKwkJCQkgKiBtZW1wb29sIGlzIHN1cHBvc2VkIHRvIHByb3RlY3QgdXMgZnJvbQorCQkJCSAqIGZhaWxpbmcgaGVyZS4gIFdlIHdpbGwgdHJ5IGEgYmxvY2tpbmcKKwkJCQkgKiBjYWxsLCBidXQgYSBkZWFkbG9jayBpcyBwb3NzaWJsZSBoZXJlCisJCQkJICovCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICAiX19nZXRfbWV0YXBhZ2U6IGF0b21pYyBjYWxsIHRvIG1lbXBvb2xfYWxsb2MgZmFpbGVkLlxuIik7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICAiV2lsbCBhdHRlbXB0IGJsb2NraW5nIGNhbGxcbiIpOworCQkJfQorCQl9CisJCWlmICghbXApIHsKKwkJCXN0cnVjdCBtZXRhcGFnZSAqbXAyOworCisJCQlzcGluX3VubG9jaygmbWV0YV9sb2NrKTsKKwkJCW1wID0gYWxsb2NfbWV0YXBhZ2UoR0ZQX05PRlMpOworCQkJc3Bpbl9sb2NrKCZtZXRhX2xvY2spOworCisJCQkvKiB3ZSBkcm9wcGVkIHRoZSBtZXRhX2xvY2ssIHdlIG5lZWQgdG8gc2VhcmNoIHRoZQorCQkJICogaGFzaCBhZ2Fpbi4KKwkJCSAqLworCQkJbXAyID0gc2VhcmNoX2hhc2goaGFzaF9wdHIsIG1hcHBpbmcsIGxibG9jayk7CisJCQlpZiAobXAyKSB7CisJCQkJZnJlZV9tZXRhcGFnZShtcCk7CisJCQkJbXAgPSBtcDI7CisJCQkJZ290byBwYWdlX2ZvdW5kOworCQkJfQorCQl9CisJCW1wLT5mbGFnID0gMDsKKwkJbG9ja19tZXRhcGFnZShtcCk7CisJCWlmIChhYnNvbHV0ZSkKKwkJCXNldF9iaXQoTUVUQV9hYnNvbHV0ZSwgJm1wLT5mbGFnKTsKKwkJbXAtPnhmbGFnID0gQ09NTUlUX1BBR0U7CisJCW1wLT5jb3VudCA9IDE7CisJCWF0b21pY19zZXQoJm1wLT5ub2hvbWVvaywwKTsKKwkJbXAtPm1hcHBpbmcgPSBtYXBwaW5nOworCQltcC0+aW5kZXggPSBsYmxvY2s7CisJCW1wLT5wYWdlID0gTlVMTDsKKwkJbXAtPmxvZ2ljYWxfc2l6ZSA9IHNpemU7CisJCWFkZF90b19oYXNoKG1wLCBoYXNoX3B0cik7CisJCXNwaW5fdW5sb2NrKCZtZXRhX2xvY2spOworCisJCWlmIChuZXcpIHsKKwkJCWpmc19pbmZvKCJfX2dldF9tZXRhcGFnZTogQ2FsbGluZyBncmFiX2NhY2hlX3BhZ2UiKTsKKwkJCW1wLT5wYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIHBhZ2VfaW5kZXgpOworCQkJaWYgKCFtcC0+cGFnZSkgeworCQkJCWpmc19lcnIoImdyYWJfY2FjaGVfcGFnZSBmYWlsZWQhIik7CisJCQkJZ290byBmcmVlaXQ7CisJCQl9IGVsc2UgeworCQkJCUlOQ1JFTUVOVChtcFN0YXQucGFnZWFsbG9jKTsKKwkJCQl1bmxvY2tfcGFnZShtcC0+cGFnZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlqZnNfaW5mbygiX19nZXRfbWV0YXBhZ2U6IENhbGxpbmcgcmVhZF9jYWNoZV9wYWdlIik7CisJCQltcC0+cGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBsYmxvY2ssCisJCQkJICAgIChmaWxsZXJfdCAqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisJCQlpZiAoSVNfRVJSKG1wLT5wYWdlKSkgeworCQkJCWpmc19lcnIoInJlYWRfY2FjaGVfcGFnZSBmYWlsZWQhIik7CisJCQkJZ290byBmcmVlaXQ7CisJCQl9IGVsc2UKKwkJCQlJTkNSRU1FTlQobXBTdGF0LnBhZ2VhbGxvYyk7CisJCX0KKwkJbXAtPmRhdGEgPSBrbWFwKG1wLT5wYWdlKSArIHBhZ2Vfb2Zmc2V0OworCX0KKworCWlmIChuZXcpCisJCW1lbXNldChtcC0+ZGF0YSwgMCwgUFNJWkUpOworCisJamZzX2luZm8oIl9fZ2V0X21ldGFwYWdlOiByZXR1cm5pbmcgPSAweCVwIiwgbXApOworCXJldHVybiBtcDsKKworZnJlZWl0OgorCXNwaW5fbG9jaygmbWV0YV9sb2NrKTsKKwlyZW1vdmVfZnJvbV9oYXNoKG1wLCBoYXNoX3B0cik7CisJZnJlZV9tZXRhcGFnZShtcCk7CisJc3Bpbl91bmxvY2soJm1ldGFfbG9jayk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgaG9sZF9tZXRhcGFnZShzdHJ1Y3QgbWV0YXBhZ2UgKiBtcCwgaW50IGZvcmNlKQoreworCXNwaW5fbG9jaygmbWV0YV9sb2NrKTsKKworCW1wLT5jb3VudCsrOworCisJaWYgKGZvcmNlKSB7CisJCUFTU0VSVCAoISh0ZXN0X2JpdChNRVRBX2ZvcmNlZCwgJm1wLT5mbGFnKSkpOworCQlpZiAodHJ5bG9ja19tZXRhcGFnZShtcCkpCisJCQlzZXRfYml0KE1FVEFfZm9yY2VkLCAmbXAtPmZsYWcpOworCX0gZWxzZQorCQlsb2NrX21ldGFwYWdlKG1wKTsKKworCXNwaW5fdW5sb2NrKCZtZXRhX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBfX3dyaXRlX21ldGFwYWdlKHN0cnVjdCBtZXRhcGFnZSAqIG1wKQoreworCWludCBsMmJzaXplID0gbXAtPm1hcHBpbmctPmhvc3QtPmlfYmxrYml0czsKKwlpbnQgbDJCbG9ja3NQZXJQYWdlID0gUEFHRV9DQUNIRV9TSElGVCAtIGwyYnNpemU7CisJdW5zaWduZWQgbG9uZyBwYWdlX2luZGV4OworCXVuc2lnbmVkIGxvbmcgcGFnZV9vZmZzZXQ7CisJaW50IHJjOworCisJamZzX2luZm8oIl9fd3JpdGVfbWV0YXBhZ2U6IG1wID0gMHglcCIsIG1wKTsKKworCXBhZ2VfaW5kZXggPSBtcC0+cGFnZS0+aW5kZXg7CisJcGFnZV9vZmZzZXQgPQorCSAgICAobXAtPmluZGV4IC0gKHBhZ2VfaW5kZXggPDwgbDJCbG9ja3NQZXJQYWdlKSkgPDwgbDJic2l6ZTsKKworCWxvY2tfcGFnZShtcC0+cGFnZSk7CisJcmMgPSBtcC0+bWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgbXAtPnBhZ2UsIHBhZ2Vfb2Zmc2V0LAorCQkJCQkgICAgICAgcGFnZV9vZmZzZXQgKworCQkJCQkgICAgICAgbXAtPmxvZ2ljYWxfc2l6ZSk7CisJaWYgKHJjKSB7CisJCWpmc19lcnIoInByZXBhcmVfd3JpdGUgcmV0dXJuICVkISIsIHJjKTsKKwkJQ2xlYXJQYWdlVXB0b2RhdGUobXAtPnBhZ2UpOworCQl1bmxvY2tfcGFnZShtcC0+cGFnZSk7CisJCWNsZWFyX2JpdChNRVRBX2RpcnR5LCAmbXAtPmZsYWcpOworCQlyZXR1cm47CisJfQorCXJjID0gbXAtPm1hcHBpbmctPmFfb3BzLT5jb21taXRfd3JpdGUoTlVMTCwgbXAtPnBhZ2UsIHBhZ2Vfb2Zmc2V0LAorCQkJCQkgICAgICBwYWdlX29mZnNldCArCisJCQkJCSAgICAgIG1wLT5sb2dpY2FsX3NpemUpOworCWlmIChyYykgeworCQlqZnNfZXJyKCJjb21taXRfd3JpdGUgcmV0dXJuZWQgJWQiLCByYyk7CisJfQorCisJdW5sb2NrX3BhZ2UobXAtPnBhZ2UpOworCWNsZWFyX2JpdChNRVRBX2RpcnR5LCAmbXAtPmZsYWcpOworCisJamZzX2luZm8oIl9fd3JpdGVfbWV0YXBhZ2UgZG9uZSIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3luY19tZXRhcGFnZShzdHJ1Y3QgbWV0YXBhZ2UgKm1wKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gbXAtPnBhZ2U7CisKKwlwYWdlX2NhY2hlX2dldChwYWdlKTsKKwlsb2NrX3BhZ2UocGFnZSk7CisKKwkvKiB3ZSdyZSBkb25lIHdpdGggdGhpcyBwYWdlIC0gbm8gbmVlZCB0byBjaGVjayBmb3IgZXJyb3JzICovCisJaWYgKHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCXdyaXRlX29uZV9wYWdlKHBhZ2UsIDEpOworCWVsc2UKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworfQorCit2b2lkIHJlbGVhc2VfbWV0YXBhZ2Uoc3RydWN0IG1ldGFwYWdlICogbXApCit7CisJc3RydWN0IGpmc19sb2cgKmxvZzsKKworCWpmc19pbmZvKCJyZWxlYXNlX21ldGFwYWdlOiBtcCA9IDB4JXAsIGZsYWcgPSAweCVseCIsIG1wLCBtcC0+ZmxhZyk7CisKKwlzcGluX2xvY2soJm1ldGFfbG9jayk7CisJaWYgKHRlc3RfYml0KE1FVEFfZm9yY2VkLCAmbXAtPmZsYWcpKSB7CisJCWNsZWFyX2JpdChNRVRBX2ZvcmNlZCwgJm1wLT5mbGFnKTsKKwkJbXAtPmNvdW50LS07CisJCXNwaW5fdW5sb2NrKCZtZXRhX2xvY2spOworCQlyZXR1cm47CisJfQorCisJYXNzZXJ0KG1wLT5jb3VudCk7CisJaWYgKC0tbXAtPmNvdW50IHx8IGF0b21pY19yZWFkKCZtcC0+bm9ob21lb2spKSB7CisJCXVubG9ja19tZXRhcGFnZShtcCk7CisJCXNwaW5fdW5sb2NrKCZtZXRhX2xvY2spOworCQlyZXR1cm47CisJfQorCisJaWYgKG1wLT5wYWdlKSB7CisJCXNldF9iaXQoTUVUQV9zdGFsZSwgJm1wLT5mbGFnKTsKKwkJc3Bpbl91bmxvY2soJm1ldGFfbG9jayk7CisJCWt1bm1hcChtcC0+cGFnZSk7CisJCW1wLT5kYXRhID0gTlVMTDsKKwkJaWYgKHRlc3RfYml0KE1FVEFfZGlydHksICZtcC0+ZmxhZykpCisJCQlfX3dyaXRlX21ldGFwYWdlKG1wKTsKKwkJaWYgKHRlc3RfYml0KE1FVEFfc3luYywgJm1wLT5mbGFnKSkgeworCQkJc3luY19tZXRhcGFnZShtcCk7CisJCQljbGVhcl9iaXQoTUVUQV9zeW5jLCAmbXAtPmZsYWcpOworCQl9CisKKwkJaWYgKHRlc3RfYml0KE1FVEFfZGlzY2FyZCwgJm1wLT5mbGFnKSkgeworCQkJbG9ja19wYWdlKG1wLT5wYWdlKTsKKwkJCWJsb2NrX2ludmFsaWRhdGVwYWdlKG1wLT5wYWdlLCAwKTsKKwkJCXVubG9ja19wYWdlKG1wLT5wYWdlKTsKKwkJfQorCisJCXBhZ2VfY2FjaGVfcmVsZWFzZShtcC0+cGFnZSk7CisJCW1wLT5wYWdlID0gTlVMTDsKKwkJSU5DUkVNRU5UKG1wU3RhdC5wYWdlZnJlZSk7CisJCXNwaW5fbG9jaygmbWV0YV9sb2NrKTsKKwl9CisKKwlpZiAobXAtPmxzbikgeworCQkvKgorCQkgKiBSZW1vdmUgbWV0YXBhZ2UgZnJvbSBsb2dzeW5jbGlzdC4KKwkJICovCisJCWxvZyA9IG1wLT5sb2c7CisJCUxPR1NZTkNfTE9DSyhsb2cpOworCQltcC0+bG9nID0gTlVMTDsKKwkJbXAtPmxzbiA9IDA7CisJCW1wLT5jbHNuID0gMDsKKwkJbG9nLT5jb3VudC0tOworCQlsaXN0X2RlbCgmbXAtPnN5bmNsaXN0KTsKKwkJTE9HU1lOQ19VTkxPQ0sobG9nKTsKKwl9CisJcmVtb3ZlX2Zyb21faGFzaChtcCwgbWV0YV9oYXNoKG1wLT5tYXBwaW5nLCBtcC0+aW5kZXgpKTsKKwlzcGluX3VubG9jaygmbWV0YV9sb2NrKTsKKworCWZyZWVfbWV0YXBhZ2UobXApOworfQorCit2b2lkIF9faW52YWxpZGF0ZV9tZXRhcGFnZXMoc3RydWN0IGlub2RlICppcCwgczY0IGFkZHIsIGludCBsZW4pCit7CisJc3RydWN0IG1ldGFwYWdlICoqaGFzaF9wdHI7CisJdW5zaWduZWQgbG9uZyBsYmxvY2s7CisJaW50IGwyQmxvY2tzUGVyUGFnZSA9IFBBR0VfQ0FDSEVfU0hJRlQgLSBpcC0+aV9ibGtiaXRzOworCS8qIEFsbCBjYWxsZXJzIGFyZSBpbnRlcmVzdGVkIGluIGJsb2NrIGRldmljZSdzIG1hcHBpbmcgKi8KKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlwLT5pX3NiLT5zX2JkZXYtPmJkX2lub2RlLT5pX21hcHBpbmc7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCS8qCisJICogRmlyc3QsIG1hcmsgbWV0YXBhZ2VzIHRvIGRpc2NhcmQuICBUaGV5IHdpbGwgZXZlbnR1YWxseSBiZQorCSAqIHJlbGVhc2VkLCBidXQgc2hvdWxkIG5vdCBiZSB3cml0dGVuLgorCSAqLworCWZvciAobGJsb2NrID0gYWRkcjsgbGJsb2NrIDwgYWRkciArIGxlbjsKKwkgICAgIGxibG9jayArPSAxIDw8IGwyQmxvY2tzUGVyUGFnZSkgeworCQloYXNoX3B0ciA9IG1ldGFfaGFzaChtYXBwaW5nLCBsYmxvY2spOworYWdhaW46CisJCXNwaW5fbG9jaygmbWV0YV9sb2NrKTsKKwkJbXAgPSBzZWFyY2hfaGFzaChoYXNoX3B0ciwgbWFwcGluZywgbGJsb2NrKTsKKwkJaWYgKG1wKSB7CisJCQlpZiAodGVzdF9iaXQoTUVUQV9zdGFsZSwgJm1wLT5mbGFnKSkgeworCQkJCXNwaW5fdW5sb2NrKCZtZXRhX2xvY2spOworCQkJCW1zbGVlcCgxKTsKKwkJCQlnb3RvIGFnYWluOworCQkJfQorCisJCQljbGVhcl9iaXQoTUVUQV9kaXJ0eSwgJm1wLT5mbGFnKTsKKwkJCXNldF9iaXQoTUVUQV9kaXNjYXJkLCAmbXAtPmZsYWcpOworCQkJc3Bpbl91bmxvY2soJm1ldGFfbG9jayk7CisJCX0gZWxzZSB7CisJCQlzcGluX3VubG9jaygmbWV0YV9sb2NrKTsKKwkJCXBhZ2UgPSBmaW5kX2xvY2tfcGFnZShtYXBwaW5nLCBsYmxvY2s+PmwyQmxvY2tzUGVyUGFnZSk7CisJCQlpZiAocGFnZSkgeworCQkJCWJsb2NrX2ludmFsaWRhdGVwYWdlKHBhZ2UsIDApOworCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCX0KKwkJfQorCX0KK30KKworI2lmZGVmIENPTkZJR19KRlNfU1RBVElTVElDUworaW50IGpmc19tcHN0YXRfcmVhZChjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorCQkgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbiA9IDA7CisJb2ZmX3QgYmVnaW47CisKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIsCisJCSAgICAgICAiSkZTIE1ldGFwYWdlIHN0YXRpc3RpY3NcbiIKKwkJICAgICAgICI9PT09PT09PT09PT09PT09PT09PT09PVxuIgorCQkgICAgICAgInBhZ2UgYWxsb2NhdGlvbnMgPSAlZFxuIgorCQkgICAgICAgInBhZ2UgZnJlZXMgPSAlZFxuIgorCQkgICAgICAgImxvY2sgd2FpdHMgPSAlZFxuIiwKKwkJICAgICAgIG1wU3RhdC5wYWdlYWxsb2MsCisJCSAgICAgICBtcFN0YXQucGFnZWZyZWUsCisJCSAgICAgICBtcFN0YXQubG9ja3dhaXQpOworCisJYmVnaW4gPSBvZmZzZXQ7CisJKnN0YXJ0ID0gYnVmZmVyICsgYmVnaW47CisJbGVuIC09IGJlZ2luOworCisJaWYgKGxlbiA+IGxlbmd0aCkKKwkJbGVuID0gbGVuZ3RoOworCWVsc2UKKwkJKmVvZiA9IDE7CisKKwlpZiAobGVuIDwgMCkKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW47Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfbWV0YXBhZ2UuaCBiL2ZzL2pmcy9qZnNfbWV0YXBhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTU4YWJhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19tZXRhcGFnZS5oCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwMgorICogICBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIENocmlzdG9waCBIZWxsd2lnLCAyMDAxLTIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZglfSF9KRlNfTUVUQVBBR0UKKyNkZWZpbmUgX0hfSkZTX01FVEFQQUdFCisKKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisKK3N0cnVjdCBtZXRhcGFnZSB7CisJLyogQ29tbW9uIGxvZ3N5bmNibGsgcHJlZml4IChzZWUgamZzX2xvZ21nci5oKSAqLworCXUxNiB4ZmxhZzsKKwl1MTYgdW51c2VkOworCWxpZF90IGxpZDsKKwlpbnQgbHNuOworCXN0cnVjdCBsaXN0X2hlYWQgc3luY2xpc3Q7CisJLyogRW5kIG9mIGxvZ3N5bmNibGsgcHJlZml4ICovCisKKwl1bnNpZ25lZCBsb25nIGZsYWc7CS8qIFNlZSBCZWxvdyAqLworCXVuc2lnbmVkIGxvbmcgY291bnQ7CS8qIFJlZmVyZW5jZSBjb3VudCAqLworCXZvaWQgKmRhdGE7CQkvKiBEYXRhIHBvaW50ZXIgKi8KKworCS8qIGxpc3QgbWFuYWdlbWVudCBzdHVmZiAqLworCXN0cnVjdCBtZXRhcGFnZSAqaGFzaF9wcmV2OworCXN0cnVjdCBtZXRhcGFnZSAqaGFzaF9uZXh0OwkvKiBBbHNvIHVzZWQgZm9yIGZyZWUgbGlzdCAqLworCisJLyoKKwkgKiBtYXBwaW5nICYgaW5kZXggYmVjb21lIHJlZHVuZGFudCwgYnV0IHdlIG5lZWQgdGhlc2UgaGVyZSB0bworCSAqIGFkZCB0aGUgbWV0YXBhZ2UgdG8gdGhlIGhhc2ggYmVmb3JlIHdlIGhhdmUgdGhlIHJlYWwgcGFnZQorCSAqLworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKworCS8qIGltcGxlbWVudGF0aW9uICovCisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyBsb2dpY2FsX3NpemU7CisKKwkvKiBKb3VybmFsIG1hbmFnZW1lbnQgKi8KKwlpbnQgY2xzbjsKKwlhdG9taWNfdCBub2hvbWVvazsKKwlzdHJ1Y3QgamZzX2xvZyAqbG9nOworfTsKKworLyogbWV0YXBhZ2UgZmxhZyAqLworI2RlZmluZSBNRVRBX2xvY2tlZAkwCisjZGVmaW5lIE1FVEFfYWJzb2x1dGUJMQorI2RlZmluZSBNRVRBX2ZyZWUJMgorI2RlZmluZSBNRVRBX2RpcnR5CTMKKyNkZWZpbmUgTUVUQV9zeW5jCTQKKyNkZWZpbmUgTUVUQV9kaXNjYXJkCTUKKyNkZWZpbmUgTUVUQV9mb3JjZWQJNgorI2RlZmluZSBNRVRBX3N0YWxlCTcKKworI2RlZmluZSBtYXJrX21ldGFwYWdlX2RpcnR5KG1wKSBzZXRfYml0KE1FVEFfZGlydHksICYobXApLT5mbGFnKQorCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCitleHRlcm4gc3RydWN0IG1ldGFwYWdlICpfX2dldF9tZXRhcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgdW5zaWduZWQgbG9uZyBsYmxvY2ssIHVuc2lnbmVkIGludCBzaXplLAorCQkJCSAgaW50IGFic29sdXRlLCB1bnNpZ25lZCBsb25nIG5ldyk7CisKKyNkZWZpbmUgcmVhZF9tZXRhcGFnZShpbm9kZSwgbGJsb2NrLCBzaXplLCBhYnNvbHV0ZSlcCisJIF9fZ2V0X21ldGFwYWdlKGlub2RlLCBsYmxvY2ssIHNpemUsIGFic29sdXRlLCBGQUxTRSkKKworI2RlZmluZSBnZXRfbWV0YXBhZ2UoaW5vZGUsIGxibG9jaywgc2l6ZSwgYWJzb2x1dGUpXAorCSBfX2dldF9tZXRhcGFnZShpbm9kZSwgbGJsb2NrLCBzaXplLCBhYnNvbHV0ZSwgVFJVRSkKKworZXh0ZXJuIHZvaWQgcmVsZWFzZV9tZXRhcGFnZShzdHJ1Y3QgbWV0YXBhZ2UgKik7CitleHRlcm4gdm9pZCBob2xkX21ldGFwYWdlKHN0cnVjdCBtZXRhcGFnZSAqLCBpbnQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbWV0YXBhZ2Uoc3RydWN0IG1ldGFwYWdlICptcCkKK3sKKwlzZXRfYml0KE1FVEFfZGlydHksICZtcC0+ZmxhZyk7CisJcmVsZWFzZV9tZXRhcGFnZShtcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9tZXRhcGFnZShzdHJ1Y3QgbWV0YXBhZ2UgKm1wKQoreworCXNldF9iaXQoTUVUQV9zeW5jLCAmbXAtPmZsYWcpOworCXdyaXRlX21ldGFwYWdlKG1wKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRpc2NhcmRfbWV0YXBhZ2Uoc3RydWN0IG1ldGFwYWdlICptcCkKK3sKKwljbGVhcl9iaXQoTUVUQV9kaXJ0eSwgJm1wLT5mbGFnKTsKKwlzZXRfYml0KE1FVEFfZGlzY2FyZCwgJm1wLT5mbGFnKTsKKwlyZWxlYXNlX21ldGFwYWdlKG1wKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZXMgaW52YWxpZGF0ZSBhbGwgcGFnZXMgZm9yIGFuIGV4dGVudC4KKyAqLworZXh0ZXJuIHZvaWQgX19pbnZhbGlkYXRlX21ldGFwYWdlcyhzdHJ1Y3QgaW5vZGUgKiwgczY0LCBpbnQpOworI2RlZmluZSBpbnZhbGlkYXRlX3B4ZF9tZXRhcGFnZXMoaXAsIHB4ZCkgXAorCV9faW52YWxpZGF0ZV9tZXRhcGFnZXMoKGlwKSwgYWRkcmVzc1BYRCgmKHB4ZCkpLCBsZW5ndGhQWEQoJihweGQpKSkKKyNkZWZpbmUgaW52YWxpZGF0ZV9keGRfbWV0YXBhZ2VzKGlwLCBkeGQpIFwKKwlfX2ludmFsaWRhdGVfbWV0YXBhZ2VzKChpcCksIGFkZHJlc3NEWEQoJihkeGQpKSwgbGVuZ3RoRFhEKCYoZHhkKSkpCisjZGVmaW5lIGludmFsaWRhdGVfeGFkX21ldGFwYWdlcyhpcCwgeGFkKSBcCisJX19pbnZhbGlkYXRlX21ldGFwYWdlcygoaXApLCBhZGRyZXNzWEFEKCYoeGFkKSksIGxlbmd0aFhBRCgmKHhhZCkpKQorCisjZW5kaWYJCQkJLyogX0hfSkZTX01FVEFQQUdFICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX21vdW50LmMgYi9mcy9qZnMvamZzX21vdW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUzNWZmZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfbW91bnQuYwpAQCAtMCwwICsxLDUxMiBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAwLTIwMDQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogTW9kdWxlOiBqZnNfbW91bnQuYworICoKKyAqIG5vdGU6IGZpbGUgc3lzdGVtIGluIHRyYW5zaXRpb24gdG8gYWdncmVnYXRlL2ZpbGVzZXQ6CisgKgorICogZmlsZSBzeXN0ZW0gbW91bnQgaXMgaW50ZXJwcmV0ZWQgYXMgdGhlIG1vdW50IG9mIGFnZ3JlZ2F0ZSwgCisgKiBpZiBub3QgYWxyZWFkeSBtb3VudGVkLCBhbmQgbW91bnQgb2YgdGhlIHNpbmdsZS9vbmx5IGZpbGVzZXQgaW4gCisgKiB0aGUgYWdncmVnYXRlOworICoKKyAqIGEgZmlsZSBzeXN0ZW0vYWdncmVnYXRlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGludGVybmFsIGlub2RlCisgKiAoYWthIG1vdW50IGlub2RlKSBpbml0aWFsaXplZCB3aXRoIGFnZ3JlZ2F0ZSBzdXBlcmJsb2NrOworICogZWFjaCB2ZnMgcmVwcmVzZW50cyBhIGZpbGVzZXQsIGFuZCBwb2ludHMgdG8gaXRzICJmaWxlc2V0IGlub2RlIAorICogYWxsb2NhdGlvbiBtYXAgaW5vZGUiIChha2EgZmlsZXNldCBpbm9kZSk6CisgKiAoYW4gYWdncmVnYXRlIGl0c2VsZiBpcyBzdHJ1Y3R1cmVkIHJlY3Vyc2l2ZWx5IGFzIGEgZmlsc2V0OiAKKyAqIGFuIGludGVybmFsIHZmcyBpcyBjb25zdHJ1Y3RlZCBhbmQgcG9pbnRzIHRvIGl0cyAiZmlsZXNldCBpbm9kZSAKKyAqIGFsbG9jYXRpb24gbWFwIGlub2RlIiAoYWthIGFnZ3JlZ2F0ZSBpbm9kZSkgd2hlcmUgZWFjaCBpbm9kZSAKKyAqIHJlcHJlc2VudHMgYSBmaWxlc2V0IGlub2RlKSBzbyB0aGF0IGlub2RlIG51bWJlciBpcyBtYXBwZWQgdG8gCisgKiBvbi1kaXNrIGlub2RlIGluIHVuaWZvcm0gd2F5IGF0IGJvdGggYWdncmVnYXRlIGFuZCBmaWxlc2V0IGxldmVsOworICoKKyAqIGVhY2ggdm5vZGUvaW5vZGUgb2YgYSBmaWxlc2V0IGlzIGxpbmtlZCB0byBpdHMgdmZzICh0byBmYWNpbGl0YXRlCisgKiBwZXIgZmlsZXNldCBpbm9kZSBvcGVyYXRpb25zLCBlLmcuLCB1bm1vdW50IG9mIGEgZmlsZXNldCwgZXRjLik7CisgKiBlYWNoIGlub2RlIHBvaW50cyB0byB0aGUgbW91bnQgaW5vZGUgKHRvIGZhY2lsaXRhdGUgYWNjZXNzIHRvCisgKiBwZXIgYWdncmVnYXRlIGluZm9ybWF0aW9uLCBlLmcuLCBibG9jayBzaXplLCBldGMuKSBhcyB3ZWxsIGFzCisgKiBpdHMgZmlsZSBzZXQgaW5vZGUuCisgKgorICogICBhZ2dyZWdhdGUgCisgKiAgIGlwbW50CisgKiAgIG1udHZmcyAtPiBmaWxlc2V0IGlwaW1hcCsgLT4gYWdncmVnYXRlIGlwYm1hcCAtPiBhZ2dyZWdhdGUgaXBhaW1hcDsKKyAqICAgICAgICAgICAgIGZpbGVzZXQgdmZzICAgICAtPiB2cCgxKSA8LT4gLi4uIDwtPiB2cChuKSA8LT52cHJvb3Q7CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKKyNpbmNsdWRlICJqZnNfZmlsc3lzLmgiCisjaW5jbHVkZSAiamZzX3N1cGVyYmxvY2suaCIKKyNpbmNsdWRlICJqZnNfZG1hcC5oIgorI2luY2x1ZGUgImpmc19pbWFwLmgiCisjaW5jbHVkZSAiamZzX21ldGFwYWdlLmgiCisjaW5jbHVkZSAiamZzX2RlYnVnLmgiCisKKworLyoKKyAqIGZvcndhcmQgcmVmZXJlbmNlcworICovCitzdGF0aWMgaW50IGNoa1N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK3N0YXRpYyBpbnQgbG9nTU9VTlQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CisKKy8qCisgKiBOQU1FOglqZnNfbW91bnQoc2IpCisgKgorICogRlVOQ1RJT046CXZmc19tb3VudCgpCisgKgorICogUEFSQU1FVEVSOglzYgktIHN1cGVyIGJsb2NrCisgKgorICogUkVUVVJOOgktRUJVU1kJLSBkZXZpY2UgYWxyZWFkeSBtb3VudGVkIG9yIG9wZW4gZm9yIHdyaXRlCisgKgkJLUVCVVNZCS0gY3ZyZHZwIGFscmVhZHkgbW91bnRlZDsKKyAqCQktRUJVU1kJLSBtb3VudCB0YWJsZSBmdWxsCisgKgkJLUVOT1RESVItIGN2cmR2cCBub3QgZGlyZWN0b3J5IG9uIGEgZGV2aWNlIG1vdW50CisgKgkJLUVOWElPCS0gZGV2aWNlIG9wZW4gZmFpbHVyZQorICovCitpbnQgamZzX21vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaW50IHJjID0gMDsJCS8qIFJldHVybiBjb2RlICAgICAgICAgICovCisJc3RydWN0IGpmc19zYl9pbmZvICpzYmkgPSBKRlNfU0JJKHNiKTsKKwlzdHJ1Y3QgaW5vZGUgKmlwYWltYXAgPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqaXBhaW1hcDIgPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqaXBpbWFwID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmlwYm1hcCA9IE5VTEw7CisKKwkvKgorCSAqIHJlYWQvdmFsaWRhdGUgc3VwZXJibG9jayAKKwkgKiAoaW5pdGlhbGl6ZSBtb3VudCBpbm9kZSBmcm9tIHRoZSBzdXBlcmJsb2NrKQorCSAqLworCWlmICgocmMgPSBjaGtTdXBlcihzYikpKSB7CisJCWdvdG8gZXJyb3V0MjA7CisJfQorCisJaXBhaW1hcCA9IGRpUmVhZFNwZWNpYWwoc2IsIEFHR1JFR0FURV9JLCAwKTsKKwlpZiAoaXBhaW1hcCA9PSBOVUxMKSB7CisJCWpmc19lcnIoImpmc19tb3VudDogRmFpbGQgdG8gcmVhZCBBR0dSRUdBVEVfSSIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gZXJyb3V0MjA7CisJfQorCXNiaS0+aXBhaW1hcCA9IGlwYWltYXA7CisKKwlqZnNfaW5mbygiamZzX21vdW50OiBpcGFpbWFwOjB4JXAiLCBpcGFpbWFwKTsKKworCS8qCisJICogaW5pdGlhbGl6ZSBhZ2dyZWdhdGUgaW5vZGUgYWxsb2NhdGlvbiBtYXAKKwkgKi8KKwlpZiAoKHJjID0gZGlNb3VudChpcGFpbWFwKSkpIHsKKwkJamZzX2VycigiamZzX21vdW50OiBkaU1vdW50KGlwYWltYXApIGZhaWxlZCB3L3JjID0gJWQiLCByYyk7CisJCWdvdG8gZXJyb3V0MjE7CisJfQorCisJLyoKKwkgKiBvcGVuIGFnZ3JlZ2F0ZSBibG9jayBhbGxvY2F0aW9uIG1hcAorCSAqLworCWlwYm1hcCA9IGRpUmVhZFNwZWNpYWwoc2IsIEJNQVBfSSwgMCk7CisJaWYgKGlwYm1hcCA9PSBOVUxMKSB7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJvdXQyMjsKKwl9CisKKwlqZnNfaW5mbygiamZzX21vdW50OiBpcGJtYXA6MHglcCIsIGlwYm1hcCk7CisKKwlzYmktPmlwYm1hcCA9IGlwYm1hcDsKKworCS8qCisJICogaW5pdGlhbGl6ZSBhZ2dyZWdhdGUgYmxvY2sgYWxsb2NhdGlvbiBtYXAKKwkgKi8KKwlpZiAoKHJjID0gZGJNb3VudChpcGJtYXApKSkgeworCQlqZnNfZXJyKCJqZnNfbW91bnQ6IGRiTW91bnQgZmFpbGVkIHcvcmMgPSAlZCIsIHJjKTsKKwkJZ290byBlcnJvdXQyMjsKKwl9CisKKwkvKgorCSAqIG9wZW4gdGhlIHNlY29uZGFyeSBhZ2dyZWdhdGUgaW5vZGUgYWxsb2NhdGlvbiBtYXAKKwkgKgorCSAqIFRoaXMgaXMgYSBkdXBsaWNhdGUgb2YgdGhlIGFnZ3JlZ2F0ZSBpbm9kZSBhbGxvY2F0aW9uIG1hcC4KKwkgKgorCSAqIGhhbmQgY3JhZnQgYSB2ZnMgaW4gdGhlIHNhbWUgZmFzaGlvbiBhcyB3ZSBkaWQgdG8gcmVhZCBpcGFpbWFwLgorCSAqIEJ5IGFkZGluZyBJTk9TUEVSRVhUICgzMikgdG8gdGhlIGlub2RlIG51bWJlciwgd2UgYXJlIHRlbGxpbmcKKwkgKiBkaVJlYWRTcGVjaWFsIHRoYXQgd2UgYXJlIHJlYWRpbmcgZnJvbSB0aGUgc2Vjb25kYXJ5IGFnZ3JlZ2F0ZQorCSAqIGlub2RlIHRhYmxlLiAgVGhpcyBhbHNvIGNyZWF0ZXMgYSB1bmlxdWUgZW50cnkgaW4gdGhlIGlub2RlIGhhc2gKKwkgKiB0YWJsZS4KKwkgKi8KKwlpZiAoKHNiaS0+bW50ZmxhZyAmIEpGU19CQURfU0FJVCkgPT0gMCkgeworCQlpcGFpbWFwMiA9IGRpUmVhZFNwZWNpYWwoc2IsIEFHR1JFR0FURV9JLCAxKTsKKwkJaWYgKGlwYWltYXAyID09IDApIHsKKwkJCWpmc19lcnIoImpmc19tb3VudDogRmFpbGQgdG8gcmVhZCBBR0dSRUdBVEVfSSIpOworCQkJcmMgPSAtRUlPOworCQkJZ290byBlcnJvdXQzNTsKKwkJfQorCQlzYmktPmlwYWltYXAyID0gaXBhaW1hcDI7CisKKwkJamZzX2luZm8oImpmc19tb3VudDogaXBhaW1hcDI6MHglcCIsIGlwYWltYXAyKTsKKworCQkvKgorCQkgKiBpbml0aWFsaXplIHNlY29uZGFyeSBhZ2dyZWdhdGUgaW5vZGUgYWxsb2NhdGlvbiBtYXAKKwkJICovCisJCWlmICgocmMgPSBkaU1vdW50KGlwYWltYXAyKSkpIHsKKwkJCWpmc19lcnIoImpmc19tb3VudDogZGlNb3VudChpcGFpbWFwMikgZmFpbGVkLCByYyA9ICVkIiwKKwkJCQlyYyk7CisJCQlnb3RvIGVycm91dDM1OworCQl9CisJfSBlbHNlCisJCS8qIFNlY29uZGFyeSBhZ2dyZWdhdGUgaW5vZGUgdGFibGUgaXMgbm90IHZhbGlkICovCisJCXNiaS0+aXBhaW1hcDIgPSBOVUxMOworCisJLyoKKwkgKiAgICAgIG1vdW50ICh0aGUgb25seS9zaW5nbGUpIGZpbGVzZXQKKwkgKi8KKwkvKgorCSAqIG9wZW4gZmlsZXNldCBpbm9kZSBhbGxvY2F0aW9uIG1hcCAoYWthIGZpbGVzZXQgaW5vZGUpCisJICovCisJaXBpbWFwID0gZGlSZWFkU3BlY2lhbChzYiwgRklMRVNZU1RFTV9JLCAwKTsKKwlpZiAoaXBpbWFwID09IE5VTEwpIHsKKwkJamZzX2VycigiamZzX21vdW50OiBGYWlsZWQgdG8gcmVhZCBGSUxFU1lTVEVNX0kiKTsKKwkJLyogb3BlbiBmaWxlc2V0IHNlY29uZGFyeSBpbm9kZSBhbGxvY2F0aW9uIG1hcCAqLworCQlyYyA9IC1FSU87CisJCWdvdG8gZXJyb3V0NDA7CisJfQorCWpmc19pbmZvKCJqZnNfbW91bnQ6IGlwaW1hcDoweCVwIiwgaXBpbWFwKTsKKworCS8qIG1hcCBmdXJ0aGVyIGFjY2VzcyBvZiBwZXIgZmlsZXNldCBpbm9kZXMgYnkgdGhlIGZpbGVzZXQgaW5vZGUgKi8KKwlzYmktPmlwaW1hcCA9IGlwaW1hcDsKKworCS8qIGluaXRpYWxpemUgZmlsZXNldCBpbm9kZSBhbGxvY2F0aW9uIG1hcCAqLworCWlmICgocmMgPSBkaU1vdW50KGlwaW1hcCkpKSB7CisJCWpmc19lcnIoImpmc19tb3VudDogZGlNb3VudCBmYWlsZWQgdy9yYyA9ICVkIiwgcmMpOworCQlnb3RvIGVycm91dDQxOworCX0KKworCWdvdG8gb3V0OworCisJLyoKKwkgKiAgICAgIHVud2luZCBvbiBlcnJvcgorCSAqLworICAgICAgZXJyb3V0NDE6CQkvKiBjbG9zZSBmaWxlc2V0IGlub2RlIGFsbG9jYXRpb24gbWFwIGlub2RlICovCisJZGlGcmVlU3BlY2lhbChpcGltYXApOworCisgICAgICBlcnJvdXQ0MDoJCS8qIGZpbGVzZXQgY2xvc2VkICovCisKKwkvKiBjbG9zZSBzZWNvbmRhcnkgYWdncmVnYXRlIGlub2RlIGFsbG9jYXRpb24gbWFwICovCisJaWYgKGlwYWltYXAyKSB7CisJCWRpVW5tb3VudChpcGFpbWFwMiwgMSk7CisJCWRpRnJlZVNwZWNpYWwoaXBhaW1hcDIpOworCX0KKworICAgICAgZXJyb3V0MzU6CisKKwkvKiBjbG9zZSBhZ2dyZWdhdGUgYmxvY2sgYWxsb2NhdGlvbiBtYXAgKi8KKwlkYlVubW91bnQoaXBibWFwLCAxKTsKKwlkaUZyZWVTcGVjaWFsKGlwYm1hcCk7CisKKyAgICAgIGVycm91dDIyOgkJLyogY2xvc2UgYWdncmVnYXRlIGlub2RlIGFsbG9jYXRpb24gbWFwICovCisKKwlkaVVubW91bnQoaXBhaW1hcCwgMSk7CisKKyAgICAgIGVycm91dDIxOgkJLyogY2xvc2UgYWdncmVnYXRlIGlub2RlcyAqLworCWRpRnJlZVNwZWNpYWwoaXBhaW1hcCk7CisgICAgICBlcnJvdXQyMDoJCS8qIGFnZ3JlZ2F0ZSBjbG9zZWQgKi8KKworICAgICAgb3V0OgorCisJaWYgKHJjKQorCQlqZnNfZXJyKCJNb3VudCBKRlMgRmFpbHVyZTogJWQiLCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBOQU1FOglqZnNfbW91bnRfcncoc2IsIHJlbW91bnQpCisgKgorICogRlVOQ1RJT046CUNvbXBsZXRlcyByZWFkLXdyaXRlIG1vdW50LCBvciByZW1vdW50cyByZWFkLW9ubHkgdm9sdW1lCisgKgkJYXMgcmVhZC13cml0ZQorICovCitpbnQgamZzX21vdW50X3J3KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCByZW1vdW50KQoreworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShzYik7ICAKKwlpbnQgcmM7CisKKwkvKgorCSAqIElmIHdlIGFyZSByZS1tb3VudGluZyBhIHByZXZpb3VzbHkgcmVhZC1vbmx5IHZvbHVtZSwgd2Ugd2FudCB0bworCSAqIHJlLXJlYWQgdGhlIGlub2RlIGFuZCBibG9jayBtYXBzLCBzaW5jZSBmc2NrLmpmcyBtYXkgaGF2ZSB1cGRhdGVkCisJICogdGhlbS4KKwkgKi8KKwlpZiAocmVtb3VudCkgeworCQlpZiAoY2hrU3VwZXIoc2IpIHx8IChzYmktPnN0YXRlICE9IEZNX0NMRUFOKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXRydW5jYXRlX2lub2RlX3BhZ2VzKHNiaS0+aXBpbWFwLT5pX21hcHBpbmcsIDApOworCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhzYmktPmlwYm1hcC0+aV9tYXBwaW5nLCAwKTsKKwkJZGlVbm1vdW50KHNiaS0+aXBpbWFwLCAxKTsKKwkJaWYgKChyYyA9IGRpTW91bnQoc2JpLT5pcGltYXApKSkgeworCQkJamZzX2VycigiamZzX21vdW50X3J3OiBkaU1vdW50IGZhaWxlZCEiKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCWRiVW5tb3VudChzYmktPmlwYm1hcCwgMSk7CisJCWlmICgocmMgPSBkYk1vdW50KHNiaS0+aXBibWFwKSkpIHsKKwkJCWpmc19lcnIoImpmc19tb3VudF9ydzogZGJNb3VudCBmYWlsZWQhIik7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwkvKgorCSAqIG9wZW4vaW5pdGlhbGl6ZSBsb2cKKwkgKi8KKwlpZiAoKHJjID0gbG1Mb2dPcGVuKHNiKSkpCisJCXJldHVybiByYzsKKworCS8qCisJICogdXBkYXRlIGZpbGUgc3lzdGVtIHN1cGVyYmxvY2s7CisJICovCisJaWYgKChyYyA9IHVwZGF0ZVN1cGVyKHNiLCBGTV9NT1VOVCkpKSB7CisJCWpmc19lcnIoImpmc19tb3VudDogdXBkYXRlU3VwZXIgZmFpbGVkIHcvcmMgPSAlZCIsIHJjKTsKKwkJbG1Mb2dDbG9zZShzYik7CisJCXJldHVybiByYzsKKwl9CisKKwkvKgorCSAqIHdyaXRlIE1PVU5UIGxvZyByZWNvcmQgb2YgdGhlIGZpbGUgc3lzdGVtCisJICovCisJbG9nTU9VTlQoc2IpOworCisJLyoKKwkgKiBTZXQgcGFnZSBjYWNoZSBhbGxvY2F0aW9uIHBvbGljeQorCSAqLworCW1hcHBpbmdfc2V0X2dmcF9tYXNrKHNiLT5zX2JkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcsIEdGUF9OT0ZTKTsKKworCXJldHVybiByYzsKK30KKworLyoKKyAqCWNoa1N1cGVyKCkKKyAqCisgKiB2YWxpZGF0ZSB0aGUgc3VwZXJibG9jayBvZiB0aGUgZmlsZSBzeXN0ZW0gdG8gYmUgbW91bnRlZCBhbmQgCisgKiBnZXQgdGhlIGZpbGUgc3lzdGVtIHBhcmFtZXRlcnMuCisgKgorICogcmV0dXJucworICoJMCB3aXRoIGZyYWdzaXplIHNldCBpZiBjaGVjayBzdWNjZXNzZnVsCisgKgllcnJvciBjb2RlIGlmIG5vdCBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbnQgY2hrU3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShzYik7CisJc3RydWN0IGpmc19zdXBlcmJsb2NrICpqX3NiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IEFJTV9ieXRlc2l6ZSwgQUlUX2J5dGVzaXplOworCWludCBleHBlY3RlZF9BSU1fYnl0ZXNpemUsIGV4cGVjdGVkX0FJVF9ieXRlc2l6ZTsKKwlzNjQgQUlNX2J5dGVfYWRkciwgQUlUX2J5dGVfYWRkciwgZnNja3dzcF9hZGRyOworCXM2NCBieXRlX2FkZHJfZGlmZjAsIGJ5dGVfYWRkcl9kaWZmMTsKKwlzMzIgYnNpemU7CisKKwlpZiAoKHJjID0gcmVhZFN1cGVyKHNiLCAmYmgpKSkKKwkJcmV0dXJuIHJjOworCWpfc2IgPSAoc3RydWN0IGpmc19zdXBlcmJsb2NrICopYmgtPmJfZGF0YTsKKworCS8qCisJICogdmFsaWRhdGUgc3VwZXJibG9jaworCSAqLworCS8qIHZhbGlkYXRlIGZzIHNpZ25hdHVyZSAqLworCWlmIChzdHJuY21wKGpfc2ItPnNfbWFnaWMsIEpGU19NQUdJQywgNCkgfHwKKwkgICAgbGUzMl90b19jcHUoal9zYi0+c192ZXJzaW9uKSA+IEpGU19WRVJTSU9OKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJYnNpemUgPSBsZTMyX3RvX2NwdShqX3NiLT5zX2JzaXplKTsKKyNpZmRlZiBfSkZTXzRLCisJaWYgKGJzaXplICE9IFBTSVpFKSB7CisJCWpmc19lcnIoIkN1cnJlbnRseSBvbmx5IDRLIGJsb2NrIHNpemUgc3VwcG9ydGVkISIpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKyNlbmRpZgkJCQkvKiBfSkZTXzRLICovCisKKwlqZnNfaW5mbygic3VwZXJibG9jazogZmxhZzoweCUwOHggc3RhdGU6MHglMDh4IHNpemU6MHglTHgiLAorCQkgbGUzMl90b19jcHUoal9zYi0+c19mbGFnKSwgbGUzMl90b19jcHUoal9zYi0+c19zdGF0ZSksCisJCSAodW5zaWduZWQgbG9uZyBsb25nKSBsZTY0X3RvX2NwdShqX3NiLT5zX3NpemUpKTsKKworCS8qIHZhbGlkYXRlIHRoZSBkZXNjcmlwdG9ycyBmb3IgU2Vjb25kYXJ5IEFJTSBhbmQgQUlUICovCisJaWYgKChqX3NiLT5zX2ZsYWcgJiBjcHVfdG9fbGUzMihKRlNfQkFEX1NBSVQpKSAhPQorCSAgICBjcHVfdG9fbGUzMihKRlNfQkFEX1NBSVQpKSB7CisJCWV4cGVjdGVkX0FJTV9ieXRlc2l6ZSA9IDIgKiBQU0laRTsKKwkJQUlNX2J5dGVzaXplID0gbGVuZ3RoUFhEKCYoal9zYi0+c19haW0yKSkgKiBic2l6ZTsKKwkJZXhwZWN0ZWRfQUlUX2J5dGVzaXplID0gNCAqIFBTSVpFOworCQlBSVRfYnl0ZXNpemUgPSBsZW5ndGhQWEQoJihqX3NiLT5zX2FpdDIpKSAqIGJzaXplOworCQlBSU1fYnl0ZV9hZGRyID0gYWRkcmVzc1BYRCgmKGpfc2ItPnNfYWltMikpICogYnNpemU7CisJCUFJVF9ieXRlX2FkZHIgPSBhZGRyZXNzUFhEKCYoal9zYi0+c19haXQyKSkgKiBic2l6ZTsKKwkJYnl0ZV9hZGRyX2RpZmYwID0gQUlUX2J5dGVfYWRkciAtIEFJTV9ieXRlX2FkZHI7CisJCWZzY2t3c3BfYWRkciA9IGFkZHJlc3NQWEQoJihqX3NiLT5zX2ZzY2tweGQpKSAqIGJzaXplOworCQlieXRlX2FkZHJfZGlmZjEgPSBmc2Nrd3NwX2FkZHIgLSBBSVRfYnl0ZV9hZGRyOworCQlpZiAoKEFJTV9ieXRlc2l6ZSAhPSBleHBlY3RlZF9BSU1fYnl0ZXNpemUpIHx8CisJCSAgICAoQUlUX2J5dGVzaXplICE9IGV4cGVjdGVkX0FJVF9ieXRlc2l6ZSkgfHwKKwkJICAgIChieXRlX2FkZHJfZGlmZjAgIT0gQUlNX2J5dGVzaXplKSB8fAorCQkgICAgKGJ5dGVfYWRkcl9kaWZmMSA8PSBBSVRfYnl0ZXNpemUpKQorCQkJal9zYi0+c19mbGFnIHw9IGNwdV90b19sZTMyKEpGU19CQURfU0FJVCk7CisJfQorCisJaWYgKChqX3NiLT5zX2ZsYWcgJiBjcHVfdG9fbGUzMihKRlNfR1JPVVBDT01NSVQpKSAhPQorCSAgICBjcHVfdG9fbGUzMihKRlNfR1JPVVBDT01NSVQpKQorCQlqX3NiLT5zX2ZsYWcgfD0gY3B1X3RvX2xlMzIoSkZTX0dST1VQQ09NTUlUKTsKKworCS8qIHZhbGlkYXRlIGZzIHN0YXRlICovCisJaWYgKGpfc2ItPnNfc3RhdGUgIT0gY3B1X3RvX2xlMzIoRk1fQ0xFQU4pICYmCisJICAgICEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCWpmc19lcnIoImpmc19tb3VudDogTW91bnQgRmFpbHVyZTogRmlsZSBTeXN0ZW0gRGlydHkuIik7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJc2JpLT5zdGF0ZSA9IGxlMzJfdG9fY3B1KGpfc2ItPnNfc3RhdGUpOworCXNiaS0+bW50ZmxhZyA9IGxlMzJfdG9fY3B1KGpfc2ItPnNfZmxhZyk7CisKKwkvKgorCSAqIEpGUyBhbHdheXMgZG9lcyBJL08gYnkgNEsgcGFnZXMuICBEb24ndCB0ZWxsIHRoZSBidWZmZXIgY2FjaGUKKwkgKiB0aGF0IHdlIHVzZSBhbnl0aGluZyBlbHNlIChsZWF2ZSBzX2Jsb2Nrc2l6ZSBhbG9uZSkuCisJICovCisJc2JpLT5ic2l6ZSA9IGJzaXplOworCXNiaS0+bDJic2l6ZSA9IGxlMTZfdG9fY3B1KGpfc2ItPnNfbDJic2l6ZSk7CisKKwkvKgorCSAqIEZvciBub3csIGlnbm9yZSBzX3Bic2l6ZSwgbDJiZmFjdG9yLiAgQWxsIEkvTyBnb2luZyB0aHJvdWdoIGJ1ZmZlcgorCSAqIGNhY2hlLgorCSAqLworCXNiaS0+bmJwZXJwYWdlID0gUFNJWkUgPj4gc2JpLT5sMmJzaXplOworCXNiaS0+bDJuYnBlcnBhZ2UgPSBMMlBTSVpFIC0gc2JpLT5sMmJzaXplOworCXNiaS0+bDJuaXBlcmJsayA9IHNiaS0+bDJic2l6ZSAtIEwyRElTSVpFOworCWlmIChzYmktPm1udGZsYWcgJiBKRlNfSU5MSU5FTE9HKQorCQlzYmktPmxvZ3B4ZCA9IGpfc2ItPnNfbG9ncHhkOworCWVsc2UgeworCQlzYmktPmxvZ2RldiA9IG5ld19kZWNvZGVfZGV2KGxlMzJfdG9fY3B1KGpfc2ItPnNfbG9nZGV2KSk7CisJCW1lbWNweShzYmktPnV1aWQsIGpfc2ItPnNfdXVpZCwgc2l6ZW9mKHNiaS0+dXVpZCkpOworCQltZW1jcHkoc2JpLT5sb2d1dWlkLCBqX3NiLT5zX2xvZ3V1aWQsIHNpemVvZihzYmktPnV1aWQpKTsKKwl9CisJc2JpLT5mc2NrcHhkID0gal9zYi0+c19mc2NrcHhkOworCXNiaS0+YWl0MiA9IGpfc2ItPnNfYWl0MjsKKworICAgICAgb3V0OgorCWJyZWxzZShiaCk7CisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKgl1cGRhdGVTdXBlcigpCisgKgorICogdXBkYXRlIHN5bmNocm9ub3VzbHkgc3VwZXJibG9jayBpZiBpdCBpcyBtb3VudGVkIHJlYWQtd3JpdGUuCisgKi8KK2ludCB1cGRhdGVTdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1aW50IHN0YXRlKQoreworCXN0cnVjdCBqZnNfc3VwZXJibG9jayAqal9zYjsKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IHJjOworCisJaWYgKHNiaS0+ZmxhZyAmIEpGU19OT0lOVEVHUklUWSkgeworCQlpZiAoc3RhdGUgPT0gRk1fRElSVFkpIHsKKwkJCXNiaS0+cF9zdGF0ZSA9IHN0YXRlOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoc3RhdGUgPT0gRk1fTU9VTlQpIHsKKwkJCXNiaS0+cF9zdGF0ZSA9IHNiaS0+c3RhdGU7CisJCQlzdGF0ZSA9IEZNX0RJUlRZOworCQl9IGVsc2UgaWYgKHN0YXRlID09IEZNX0NMRUFOKSB7CisJCQlzdGF0ZSA9IHNiaS0+cF9zdGF0ZTsKKwkJfSBlbHNlCisJCQlqZnNfZXJyKCJ1cGRhdGVTdXBlcjogYmFkIHN0YXRlIik7CisJfSBlbHNlIGlmIChzYmktPnN0YXRlID09IEZNX0RJUlRZKQorCQlyZXR1cm4gMDsKKwkKKwlpZiAoKHJjID0gcmVhZFN1cGVyKHNiLCAmYmgpKSkKKwkJcmV0dXJuIHJjOworCisJal9zYiA9IChzdHJ1Y3QgamZzX3N1cGVyYmxvY2sgKiliaC0+Yl9kYXRhOworCisJal9zYi0+c19zdGF0ZSA9IGNwdV90b19sZTMyKHN0YXRlKTsKKwlzYmktPnN0YXRlID0gc3RhdGU7CisKKwlpZiAoc3RhdGUgPT0gRk1fTU9VTlQpIHsKKwkJLyogcmVjb3JkIGxvZydzIGRldl90IGFuZCBtb3VudCBzZXJpYWwgbnVtYmVyICovCisJCWpfc2ItPnNfbG9nZGV2ID0gY3B1X3RvX2xlMzIobmV3X2VuY29kZV9kZXYoc2JpLT5sb2ctPmJkZXYtPmJkX2RldikpOworCQlqX3NiLT5zX2xvZ3NlcmlhbCA9IGNwdV90b19sZTMyKHNiaS0+bG9nLT5zZXJpYWwpOworCX0gZWxzZSBpZiAoc3RhdGUgPT0gRk1fQ0xFQU4pIHsKKwkJLyoKKwkJICogSWYgdGhpcyB2b2x1bWUgaXMgc2hhcmVkIHdpdGggT1MvMiwgT1MvMiB3aWxsIG5lZWQgdG8KKwkJICogcmVjYWxjdWxhdGUgREFTRCB1c2FnZSwgc2luY2Ugd2UgZG9uJ3QgZGVhbCB3aXRoIGl0LgorCQkgKi8KKwkJaWYgKGpfc2ItPnNfZmxhZyAmIGNwdV90b19sZTMyKEpGU19EQVNEX0VOQUJMRUQpKQorCQkJal9zYi0+c19mbGFnIHw9IGNwdV90b19sZTMyKEpGU19EQVNEX1BSSU1FKTsKKwl9CisKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJc3luY19kaXJ0eV9idWZmZXIoYmgpOworCWJyZWxzZShiaCk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJcmVhZFN1cGVyKCkKKyAqCisgKiByZWFkIHN1cGVyYmxvY2sgYnkgcmF3IHNlY3RvciBhZGRyZXNzCisgKi8KK2ludCByZWFkU3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYnBwKQoreworCS8qIHJlYWQgaW4gcHJpbWFyeSBzdXBlcmJsb2NrICovCisJKmJwcCA9IHNiX2JyZWFkKHNiLCBTVVBFUjFfT0ZGID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwlpZiAoKmJwcCkKKwkJcmV0dXJuIDA7CisKKwkvKiByZWFkIGluIHNlY29uZGFyeS9yZXBsaWNhdGVkIHN1cGVyYmxvY2sgKi8KKwkqYnBwID0gc2JfYnJlYWQoc2IsIFNVUEVSMl9PRkYgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCWlmICgqYnBwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAtRUlPOworfQorCisKKy8qCisgKglsb2dNT1VOVCgpCisgKgorICogZnVuY3Rpb246IHdyaXRlIGEgTU9VTlQgbG9nIHJlY29yZCBmb3IgZmlsZSBzeXN0ZW0uCisgKgorICogTU9VTlQgcmVjb3JkIGtlZXBzIGxvZ3JlZG8oKSBmcm9tIHByb2Nlc3NpbmcgbG9nIHJlY29yZHMKKyAqIGZvciB0aGlzIGZpbGUgc3lzdGVtIHBhc3QgdGhpcyBwb2ludCBpbiBsb2cuCisgKiBpdCBpcyBoYXJtbGVzcyBpZiBtb3VudCBmYWlscy4KKyAqCisgKiBub3RlOiBNT1VOVCByZWNvcmQgaXMgYXQgYWdncmVnYXRlIGxldmVsLCBub3QgYXQgZmlsZXNldCBsZXZlbCwgCisgKiBzaW5jZSBsb2cgcmVjb3JkcyBvZiBwcmV2aW91cyBtb3VudHMgb2YgYSBmaWxlc2V0CisgKiAoZS5nLiwgQUZURVIgcmVjb3JkIG9mIGV4dGVudCBhbGxvY2F0aW9uKSBoYXZlIHRvIGJlIHByb2Nlc3NlZCAKKyAqIHRvIHVwZGF0ZSBibG9jayBhbGxvY2F0aW9uIG1hcCBhdCBhZ2dyZWdhdGUgbGV2ZWwuCisgKi8KK3N0YXRpYyBpbnQgbG9nTU9VTlQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgamZzX2xvZyAqbG9nID0gSkZTX1NCSShzYiktPmxvZzsKKwlzdHJ1Y3QgbHJkIGxyZDsKKworCWxyZC5sb2d0aWQgPSAwOworCWxyZC5iYWNrY2hhaW4gPSAwOworCWxyZC50eXBlID0gY3B1X3RvX2xlMTYoTE9HX01PVU5UKTsKKwlscmQubGVuZ3RoID0gMDsKKwlscmQuYWdncmVnYXRlID0gY3B1X3RvX2xlMzIobmV3X2VuY29kZV9kZXYoc2ItPnNfYmRldi0+YmRfZGV2KSk7CisJbG1Mb2cobG9nLCBOVUxMLCAmbHJkLCBOVUxMKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19zdXBlcmJsb2NrLmggYi9mcy9qZnMvamZzX3N1cGVyYmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjA1NjZmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19zdXBlcmJsb2NrLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDAzCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYJX0hfSkZTX1NVUEVSQkxPQ0sKKyNkZWZpbmUgX0hfSkZTX1NVUEVSQkxPQ0sKKworLyoKKyAqIG1ha2UgdGhlIG1hZ2ljIG51bWJlciBzb21ldGhpbmcgYSBodW1hbiBjb3VsZCByZWFkCisgKi8KKyNkZWZpbmUgSkZTX01BR0lDIAkiSkZTMSIJLyogTWFnaWMgd29yZCAqLworCisjZGVmaW5lIEpGU19WRVJTSU9OCTIJLyogVmVyc2lvbiBudW1iZXI6IFZlcnNpb24gMiAqLworCisjZGVmaW5lIExWX05BTUVfU0laRQkxMQkvKiBNVVNUIEJFIDExIGZvciBPUy8yIGJvb3Qgc2VjdG9yICovCisKKy8qIAorICoJYWdncmVnYXRlIHN1cGVyYmxvY2sgCisgKgorICogVGhlIG5hbWUgc3VwZXJibG9jayBpcyB0b28gY2xvc2UgdG8gc3VwZXJfYmxvY2ssIHNvIHRoZSBuYW1lIGhhcyBiZWVuCisgKiBjaGFuZ2VkIHRvIGpmc19zdXBlcmJsb2NrLiAgVGhlIHV0aWxpdGllcyBhcmUgc3RpbGwgdXNpbmcgdGhlIG9sZCBuYW1lLgorICovCitzdHJ1Y3QgamZzX3N1cGVyYmxvY2sgeworCWNoYXIgc19tYWdpY1s0XTsJLyogNDogbWFnaWMgbnVtYmVyICovCisJX19sZTMyIHNfdmVyc2lvbjsJLyogNDogdmVyc2lvbiBudW1iZXIgKi8KKworCV9fbGU2NCBzX3NpemU7CQkvKiA4OiBhZ2dyZWdhdGUgc2l6ZSBpbiBoYXJkd2FyZS9MVk0gYmxvY2tzOworCQkJCSAqIFZGUzogbnVtYmVyIG9mIGJsb2NrcworCQkJCSAqLworCV9fbGUzMiBzX2JzaXplOwkJLyogNDogYWdncmVnYXRlIGJsb2NrIHNpemUgaW4gYnl0ZXM7IAorCQkJCSAqIFZGUzogZnJhZ21lbnQgc2l6ZQorCQkJCSAqLworCV9fbGUxNiBzX2wyYnNpemU7CS8qIDI6IGxvZzIgb2Ygc19ic2l6ZSAqLworCV9fbGUxNiBzX2wyYmZhY3RvcjsJLyogMjogbG9nMihzX2JzaXplL2hhcmR3YXJlIGJsb2NrIHNpemUpICovCisJX19sZTMyIHNfcGJzaXplOwkvKiA0OiBoYXJkd2FyZS9MVk0gYmxvY2sgc2l6ZSBpbiBieXRlcyAqLworCV9fbGUxNiBzX2wycGJzaXplOwkvKiAyOiBsb2cyIG9mIHNfcGJzaXplICovCisJX19sZTE2IHBhZDsJCS8qIDI6IHBhZGRpbmcgbmVjZXNzYXJ5IGZvciBhbGlnbm1lbnQgKi8KKworCV9fbGUzMiBzX2Fnc2l6ZTsJLyogNDogYWxsb2NhdGlvbiBncm91cCBzaXplIGluIGFnZ3IuIGJsb2NrcyAqLworCisJX19sZTMyIHNfZmxhZzsJCS8qIDQ6IGFnZ3JlZ2F0ZSBhdHRyaWJ1dGVzOgorCQkJCSAqICAgIHNlZSBqZnNfZmlsc3lzLmgKKwkJCQkgKi8KKwlfX2xlMzIgc19zdGF0ZTsJCS8qIDQ6IG1vdW50L3VubW91bnQvcmVjb3Zlcnkgc3RhdGU6IAorCQkJCSAqICAgIHNlZSBqZnNfZmlsc3lzLmgKKwkJCQkgKi8KKwlfX2xlMzIgc19jb21wcmVzczsJCS8qIDQ6ID4gMCBpZiBkYXRhIGNvbXByZXNzaW9uICovCisKKwlweGRfdCBzX2FpdDI7CQkvKiA4OiBmaXJzdCBleHRlbnQgb2Ygc2Vjb25kYXJ5CisJCQkJICogICAgYWdncmVnYXRlIGlub2RlIHRhYmxlCisJCQkJICovCisKKwlweGRfdCBzX2FpbTI7CQkvKiA4OiBmaXJzdCBleHRlbnQgb2Ygc2Vjb25kYXJ5CisJCQkJICogICAgYWdncmVnYXRlIGlub2RlIG1hcAorCQkJCSAqLworCV9fbGUzMiBzX2xvZ2RldjsJCS8qIDQ6IGRldmljZSBhZGRyZXNzIG9mIGxvZyAqLworCV9fbGUzMiBzX2xvZ3NlcmlhbDsJLyogNDogbG9nIHNlcmlhbCBudW1iZXIgYXQgYWdncmVnYXRlIG1vdW50ICovCisJcHhkX3Qgc19sb2dweGQ7CQkvKiA4OiBpbmxpbmUgbG9nIGV4dGVudCAqLworCisJcHhkX3Qgc19mc2NrcHhkOwkvKiA4OiBpbmxpbmUgZnNjayB3b3JrIHNwYWNlIGV4dGVudCAqLworCisJc3RydWN0IHRpbWVzdHJ1Y190IHNfdGltZTsJLyogODogdGltZSBsYXN0IHVwZGF0ZWQgKi8KKworCV9fbGUzMiBzX2ZzY2tsb2dsZW47CS8qIDQ6IE51bWJlciBvZiBmaWxlc3lzdGVtIGJsb2NrcyByZXNlcnZlZCBmb3IKKwkJCQkgKiAgICB0aGUgZnNjayBzZXJ2aWNlIGxvZy4gIAorCQkJCSAqICAgIE4uQi4gVGhlc2UgYmxvY2tzIGFyZSBkaXZpZGVkIGFtb25nIHRoZQorCQkJCSAqICAgICAgICAgdmVyc2lvbnMga2VwdC4gIFRoaXMgaXMgbm90IGEgcGVyCisJCQkJICogICAgICAgICB2ZXJzaW9uIHNpemUuCisJCQkJICogICAgTi5CLiBUaGVzZSBibG9ja3MgYXJlIGluY2x1ZGVkIGluIHRoZSAKKwkJCQkgKiAgICAgICAgIGxlbmd0aCBmaWVsZCBvZiBzX2ZzY2tweGQuCisJCQkJICovCisJczggc19mc2NrbG9nOwkJLyogMTogd2hpY2ggZnNjayBzZXJ2aWNlIGxvZyBpcyBtb3N0IHJlY2VudAorCQkJCSAqICAgIDAgPT4gbm8gc2VydmljZSBsb2cgZGF0YSB5ZXQKKwkJCQkgKiAgICAxID0+IHRoZSBmaXJzdCBvbmUKKwkJCQkgKiAgICAyID0+IHRoZSAybmQgb25lCisJCQkJICovCisJY2hhciBzX2ZwYWNrWzExXTsJLyogMTE6IGZpbGUgc3lzdGVtIHZvbHVtZSBuYW1lIAorCQkJCSAqICAgICBOLkIuIFRoaXMgbXVzdCBiZSAxMSBieXRlcyB0bworCQkJCSAqICAgICAgICAgIGNvbmZvcm0gd2l0aCB0aGUgT1MvMiBCb290U2VjdG9yCisJCQkJICogICAgICAgICAgcmVxdWlyZW1lbnRzCisJCQkJICogICAgICAgICAgT25seSB1c2VkIHdoZW4gc192ZXJzaW9uIGlzIDEKKwkJCQkgKi8KKworCS8qIGV4dGVuZGZzKCkgcGFyYW1ldGVyIHVuZGVyIHNfc3RhdGUgJiBGTV9FWFRFTkRGUyAqLworCV9fbGU2NCBzX3hzaXplOwkJLyogODogZXh0ZW5kZnMgc19zaXplICovCisJcHhkX3Qgc194ZnNja3B4ZDsJLyogODogZXh0ZW5kZnMgZnNja3B4ZCAqLworCXB4ZF90IHNfeGxvZ3B4ZDsJLyogODogZXh0ZW5kZnMgbG9ncHhkICovCisJLyogLSAxMjggYnl0ZSBib3VuZGFyeSAtICovCisKKwljaGFyIHNfdXVpZFsxNl07CS8qIDE2OiAxMjgtYml0IHV1aWQgZm9yIHZvbHVtZSAqLworCWNoYXIgc19sYWJlbFsxNl07CS8qIDE2OiB2b2x1bWUgbGFiZWwgKi8KKwljaGFyIHNfbG9ndXVpZFsxNl07CS8qIDE2OiAxMjgtYml0IHV1aWQgZm9yIGxvZyBkZXZpY2UgKi8KKworfTsKKworZXh0ZXJuIGludCByZWFkU3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKik7CitleHRlcm4gaW50IHVwZGF0ZVN1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1aW50KTsKK2V4dGVybiB2b2lkIGpmc19lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pOworCisjZW5kaWYgLypfSF9KRlNfU1VQRVJCTE9DSyAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc190eG5tZ3IuYyBiL2ZzL2pmcy9qZnNfdHhubWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwMzAxZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfdHhubWdyLmMKQEAgLTAsMCArMSwzMTMxIEBACisvKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwNQorICogICBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIENocmlzdG9waCBIZWxsd2lnLCAyMDAxLTIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogICAgICBqZnNfdHhubWdyLmM6IHRyYW5zYWN0aW9uIG1hbmFnZXIKKyAqCisgKiBub3RlczoKKyAqIHRyYW5zYWN0aW9uIHN0YXJ0cyB3aXRoIHR4QmVnaW4oKSBhbmQgZW5kcyB3aXRoIHR4Q29tbWl0KCkKKyAqIG9yIHR4QWJvcnQoKS4KKyAqCisgKiB0bG9jayBpcyBhY3F1aXJlZCBhdCB0aGUgdGltZSBvZiB1cGRhdGU7CisgKiAob2J2aWF0ZSBzY2FuIGF0IGNvbW1pdCB0aW1lIGZvciB4dHJlZSBhbmQgZHRyZWUpCisgKiB0bG9jayBhbmQgbXAgcG9pbnRzIHRvIGVhY2ggb3RoZXI7CisgKiAobm8gaGFzaGxpc3QgZm9yIG1wIC0+IHRsb2NrKS4KKyAqCisgKiBzcGVjaWFsIGNhc2VzOgorICogdGxvY2sgb24gaW4tbWVtb3J5IGlub2RlOgorICogaW4tcGxhY2UgdGxvY2sgaW4gdGhlIGluLW1lbW9yeSBpbm9kZSBpdHNlbGY7CisgKiBjb252ZXJ0ZWQgdG8gcGFnZSBsb2NrIGJ5IGlXcml0ZSgpIGF0IGNvbW1pdCB0aW1lLgorICoKKyAqIHRsb2NrIGR1cmluZyB3cml0ZSgpL21tYXAoKSB1bmRlciBhbm9ueW1vdXMgdHJhbnNhY3Rpb24gKHRpZCA9IDApOgorICogdHJhbnNmZXJyZWQgKD8pIHRvIHRyYW5zYWN0aW9uIGF0IGNvbW1pdCB0aW1lLgorICoKKyAqIHVzZSB0aGUgcGFnZSBpdHNlbGYgdG8gdXBkYXRlIGFsbG9jYXRpb24gbWFwcworICogKG9idmlhdGUgaW50ZXJtZWRpYXRlIHJlcGxpY2F0aW9uIG9mIGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uIGRhdGEpCisgKiBob2xkIG9uIHRvIG1wK2xvY2sgdGhydSB1cGRhdGUgb2YgbWFwcworICovCisKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKKyNpbmNsdWRlICJqZnNfZmlsc3lzLmgiCisjaW5jbHVkZSAiamZzX21ldGFwYWdlLmgiCisjaW5jbHVkZSAiamZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgImpmc19pbWFwLmgiCisjaW5jbHVkZSAiamZzX2RtYXAuaCIKKyNpbmNsdWRlICJqZnNfc3VwZXJibG9jay5oIgorI2luY2x1ZGUgImpmc19kZWJ1Zy5oIgorCisvKgorICogICAgICB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHN0cnVjdHVyZXMKKyAqLworc3RhdGljIHN0cnVjdCB7CisJaW50IGZyZWV0aWQ7CQkvKiBpbmRleCBvZiBhIGZyZWUgdGlkIHN0cnVjdHVyZSAqLworCWludCBmcmVlbG9jazsJCS8qIGluZGV4IGZpcnN0IGZyZWUgbG9jayB3b3JkICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgZnJlZXdhaXQ7CS8qIGV2ZW50bGlzdCBvZiBmcmVlIHRibG9jayAqLworCXdhaXRfcXVldWVfaGVhZF90IGZyZWVsb2Nrd2FpdDsJLyogZXZlbnRsaXN0IG9mIGZyZWUgdGxvY2sgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBsb3dsb2Nrd2FpdDsJLyogZXZlbnRsaXN0IG9mIGFtcGxlIHRsb2NrcyAqLworCWludCB0bG9ja3NJblVzZTsJLyogTnVtYmVyIG9mIHRsb2NrcyBpbiB1c2UgKi8KKwlzcGlubG9ja190IExhenlMb2NrOwkvKiBzeW5jaHJvbml6ZSBzeW5jX3F1ZXVlICYgdW5sb2NrX3F1ZXVlICovCisvKglzdHJ1Y3QgdGJsb2NrICpzeW5jX3F1ZXVlOyAqIFRyYW5zYWN0aW9ucyB3YWl0aW5nIGZvciBkYXRhIHN5bmMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHVubG9ja19xdWV1ZTsJLyogVHhucyB3YWl0aW5nIHRvIGJlIHJlbGVhc2VkICovCisJc3RydWN0IGxpc3RfaGVhZCBhbm9uX2xpc3Q7CS8qIGlub2RlcyBoYXZpbmcgYW5vbnltb3VzIHR4bnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGFub25fbGlzdDI7CS8qIGlub2RlcyBoYXZpbmcgYW5vbnltb3VzIHR4bnMKKwkJCQkJICAgdGhhdCBjb3VsZG4ndCBiZSBzeW5jJ2VkICovCit9IFR4QW5jaG9yOworCitpbnQgamZzX3Rsb2Nrc19sb3c7CQkvKiBJbmRpY2F0ZXMgbG93IG51bWJlciBvZiBhdmFpbGFibGUgdGxvY2tzICovCisKKyNpZmRlZiBDT05GSUdfSkZTX1NUQVRJU1RJQ1MKK3N0YXRpYyBzdHJ1Y3QgeworCXVpbnQgdHhCZWdpbjsKKwl1aW50IHR4QmVnaW5fYmFycmllcjsKKwl1aW50IHR4QmVnaW5fbG9ja3Nsb3c7CisJdWludCB0eEJlZ2luX2ZyZWV0aWQ7CisJdWludCB0eEJlZ2luQW5vbjsKKwl1aW50IHR4QmVnaW5Bbm9uX2JhcnJpZXI7CisJdWludCB0eEJlZ2luQW5vbl9sb2Nrc2xvdzsKKwl1aW50IHR4TG9ja0FsbG9jOworCXVpbnQgdHhMb2NrQWxsb2NfZnJlZWxvY2s7Cit9IFR4U3RhdDsKKyNlbmRpZgorCitzdGF0aWMgaW50IG5UeEJsb2NrID0gLTE7CS8qIG51bWJlciBvZiB0cmFuc2FjdGlvbiBibG9ja3MgKi8KK21vZHVsZV9wYXJhbShuVHhCbG9jaywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoblR4QmxvY2ssCisJCSAiTnVtYmVyIG9mIHRyYW5zYWN0aW9uIGJsb2NrcyAobWF4OjY1NTM2KSIpOworCitzdGF0aWMgaW50IG5UeExvY2sgPSAtMTsJLyogbnVtYmVyIG9mIHRyYW5zYWN0aW9uIGxvY2tzICovCittb2R1bGVfcGFyYW0oblR4TG9jaywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoblR4TG9jaywKKwkJICJOdW1iZXIgb2YgdHJhbnNhY3Rpb24gbG9ja3MgKG1heDo2NTUzNikiKTsKKworc3RydWN0IHRibG9jayAqVHhCbG9jazsJICAgICAgICAvKiB0cmFuc2FjdGlvbiBibG9jayB0YWJsZSAqLworc3RhdGljIGludCBUeExvY2tMV007CQkvKiBMb3cgd2F0ZXIgbWFyayBmb3IgbnVtYmVyIG9mIHR4TG9ja3MgdXNlZCAqLworc3RhdGljIGludCBUeExvY2tIV007CQkvKiBIaWdoIHdhdGVyIG1hcmsgZm9yIG51bWJlciBvZiB0eExvY2tzIHVzZWQgKi8KK3N0YXRpYyBpbnQgVHhMb2NrVkhXTTsJCS8qIFZlcnkgSGlnaCB3YXRlciBtYXJrICovCitzdHJ1Y3QgdGxvY2sgKlR4TG9jazsgICAgICAgICAgIC8qIHRyYW5zYWN0aW9uIGxvY2sgdGFibGUgKi8KKworCisvKgorICogICAgICB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IGxvY2sKKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhqZnNUeG5Mb2NrKTsKKworI2RlZmluZSBUWE5fTE9DSygpICAgICAgICAgICAgICBzcGluX2xvY2soJmpmc1R4bkxvY2spCisjZGVmaW5lIFRYTl9VTkxPQ0soKSAgICAgICAgICAgIHNwaW5fdW5sb2NrKCZqZnNUeG5Mb2NrKQorCisjZGVmaW5lIExBWllfTE9DS19JTklUKCkJc3Bpbl9sb2NrX2luaXQoJlR4QW5jaG9yLkxhenlMb2NrKTsKKyNkZWZpbmUgTEFaWV9MT0NLKGZsYWdzKQlzcGluX2xvY2tfaXJxc2F2ZSgmVHhBbmNob3IuTGF6eUxvY2ssIGZsYWdzKQorI2RlZmluZSBMQVpZX1VOTE9DSyhmbGFncykgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVHhBbmNob3IuTGF6eUxvY2ssIGZsYWdzKQorCitERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChqZnNfc3luY190aHJlYWRfd2FpdCk7CitERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChqZnNfY29tbWl0X3RocmVhZF93YWl0KTsKK3N0YXRpYyBpbnQgamZzX2NvbW1pdF90aHJlYWRfd2FraW5nOworCisvKgorICogUmV0cnkgbG9naWMgZXhpc3Qgb3V0c2lkZSB0aGVzZSBtYWNyb3MgdG8gcHJvdGVjdCBmcm9tIHNwdXJyaW91cyB3YWtldXBzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgVFhOX1NMRUVQX0RST1BfTE9DSyh3YWl0X3F1ZXVlX2hlYWRfdCAqIGV2ZW50KQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJYWRkX3dhaXRfcXVldWUoZXZlbnQsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJVFhOX1VOTE9DSygpOworCXNjaGVkdWxlKCk7CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoZXZlbnQsICZ3YWl0KTsKK30KKworI2RlZmluZSBUWE5fU0xFRVAoZXZlbnQpXAore1wKKwlUWE5fU0xFRVBfRFJPUF9MT0NLKGV2ZW50KTtcCisJVFhOX0xPQ0soKTtcCit9CisKKyNkZWZpbmUgVFhOX1dBS0VVUChldmVudCkgd2FrZV91cF9hbGwoZXZlbnQpCisKKworLyoKKyAqICAgICAgc3RhdGlzdGljcworICovCitzdGF0aWMgc3RydWN0IHsKKwl0aWRfdCBtYXh0aWQ7CQkvKiA0OiBiaWdnZXN0IHRpZCBldmVyIHVzZWQgKi8KKwlsaWRfdCBtYXhsaWQ7CQkvKiA0OiBiaWdnZXN0IGxpZCBldmVyIHVzZWQgKi8KKwlpbnQgbnRpZDsJCS8qIDQ6ICMgb2YgdHJhbnNhY3Rpb25zIHBlcmZvcm1lZCAqLworCWludCBubGlkOwkJLyogNDogIyBvZiB0bG9ja3MgYWNxdWlyZWQgKi8KKwlpbnQgd2FpdGxvY2s7CQkvKiA0OiAjIG9mIHRsb2NrIHdhaXQgKi8KK30gc3RhdHR4OworCisKKy8qCisgKiBleHRlcm5hbCByZWZlcmVuY2VzCisgKi8KK2V4dGVybiBpbnQgbG1Hcm91cENvbW1pdChzdHJ1Y3QgamZzX2xvZyAqLCBzdHJ1Y3QgdGJsb2NrICopOworZXh0ZXJuIGludCBqZnNfY29tbWl0X2lub2RlKHN0cnVjdCBpbm9kZSAqLCBpbnQpOworZXh0ZXJuIGludCBqZnNfc3RvcF90aHJlYWRzOworCitleHRlcm4gc3RydWN0IGNvbXBsZXRpb24gamZzSU93YWl0OworCisvKgorICogZm9yd2FyZCByZWZlcmVuY2VzCisgKi8KK3N0YXRpYyBpbnQgZGlMb2coc3RydWN0IGpmc19sb2cgKiBsb2csIHN0cnVjdCB0YmxvY2sgKiB0YmxrLCBzdHJ1Y3QgbHJkICogbHJkLAorCQlzdHJ1Y3QgdGxvY2sgKiB0bGNrLCBzdHJ1Y3QgY29tbWl0ICogY2QpOworc3RhdGljIGludCBkYXRhTG9nKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgdGJsb2NrICogdGJsaywgc3RydWN0IGxyZCAqIGxyZCwKKwkJc3RydWN0IHRsb2NrICogdGxjayk7CitzdGF0aWMgdm9pZCBkdExvZyhzdHJ1Y3QgamZzX2xvZyAqIGxvZywgc3RydWN0IHRibG9jayAqIHRibGssIHN0cnVjdCBscmQgKiBscmQsCisJCXN0cnVjdCB0bG9jayAqIHRsY2spOworc3RhdGljIHZvaWQgbWFwTG9nKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgdGJsb2NrICogdGJsaywgc3RydWN0IGxyZCAqIGxyZCwKKwkJc3RydWN0IHRsb2NrICogdGxjayk7CitzdGF0aWMgdm9pZCB0eEFsbG9jUE1hcChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgbWFwbG9jayAqIG1hcGxvY2ssCisJCXN0cnVjdCB0YmxvY2sgKiB0YmxrKTsKK3N0YXRpYyB2b2lkIHR4Rm9yY2Uoc3RydWN0IHRibG9jayAqIHRibGspOworc3RhdGljIGludCB0eExvZyhzdHJ1Y3QgamZzX2xvZyAqIGxvZywgc3RydWN0IHRibG9jayAqIHRibGssCisJCXN0cnVjdCBjb21taXQgKiBjZCk7CitzdGF0aWMgdm9pZCB0eFVwZGF0ZU1hcChzdHJ1Y3QgdGJsb2NrICogdGJsayk7CitzdGF0aWMgdm9pZCB0eFJlbGVhc2Uoc3RydWN0IHRibG9jayAqIHRibGspOworc3RhdGljIHZvaWQgeHRMb2coc3RydWN0IGpmc19sb2cgKiBsb2csIHN0cnVjdCB0YmxvY2sgKiB0YmxrLCBzdHJ1Y3QgbHJkICogbHJkLAorCSAgIHN0cnVjdCB0bG9jayAqIHRsY2spOworc3RhdGljIHZvaWQgTG9nU3luY1JlbGVhc2Uoc3RydWN0IG1ldGFwYWdlICogbXApOworCisvKgorICogICAgICAgICAgICAgIHRyYW5zYWN0aW9uIGJsb2NrL2xvY2sgbWFuYWdlbWVudAorICogICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qCisgKiBHZXQgYSB0cmFuc2FjdGlvbiBsb2NrIGZyb20gdGhlIGZyZWUgbGlzdC4gIElmIHRoZSBudW1iZXIgaW4gdXNlIGlzCisgKiBncmVhdGVyIHRoYW4gdGhlIGhpZ2ggd2F0ZXIgbWFyaywgd2FrZSB1cCB0aGUgc3luYyBkYWVtb24uICBUaGlzIHNob3VsZAorICogZnJlZSBzb21lIGFub255bW91cyB0cmFuc2FjdGlvbiBsb2Nrcy4gIChUWE5fTE9DSyBtdXN0IGJlIGhlbGQuKQorICovCitzdGF0aWMgbGlkX3QgdHhMb2NrQWxsb2Modm9pZCkKK3sKKwlsaWRfdCBsaWQ7CisKKwlJTkNSRU1FTlQoVHhTdGF0LnR4TG9ja0FsbG9jKTsKKwlpZiAoIVR4QW5jaG9yLmZyZWVsb2NrKSB7CisJCUlOQ1JFTUVOVChUeFN0YXQudHhMb2NrQWxsb2NfZnJlZWxvY2spOworCX0KKworCXdoaWxlICghKGxpZCA9IFR4QW5jaG9yLmZyZWVsb2NrKSkKKwkJVFhOX1NMRUVQKCZUeEFuY2hvci5mcmVlbG9ja3dhaXQpOworCVR4QW5jaG9yLmZyZWVsb2NrID0gVHhMb2NrW2xpZF0ubmV4dDsKKwlISUdIV0FURVJNQVJLKHN0YXR0eC5tYXhsaWQsIGxpZCk7CisJaWYgKCgrK1R4QW5jaG9yLnRsb2Nrc0luVXNlID4gVHhMb2NrSFdNKSAmJiAoamZzX3Rsb2Nrc19sb3cgPT0gMCkpIHsKKwkJamZzX2luZm8oInR4TG9ja0FsbG9jIHRsb2NrcyBsb3ciKTsKKwkJamZzX3Rsb2Nrc19sb3cgPSAxOworCQl3YWtlX3VwKCZqZnNfc3luY190aHJlYWRfd2FpdCk7CisJfQorCisJcmV0dXJuIGxpZDsKK30KKworc3RhdGljIHZvaWQgdHhMb2NrRnJlZShsaWRfdCBsaWQpCit7CisJVHhMb2NrW2xpZF0ubmV4dCA9IFR4QW5jaG9yLmZyZWVsb2NrOworCVR4QW5jaG9yLmZyZWVsb2NrID0gbGlkOworCVR4QW5jaG9yLnRsb2Nrc0luVXNlLS07CisJaWYgKGpmc190bG9ja3NfbG93ICYmIChUeEFuY2hvci50bG9ja3NJblVzZSA8IFR4TG9ja0xXTSkpIHsKKwkJamZzX2luZm8oInR4TG9ja0ZyZWUgamZzX3Rsb2Nrc19sb3cgbm8gbW9yZSIpOworCQlqZnNfdGxvY2tzX2xvdyA9IDA7CisJCVRYTl9XQUtFVVAoJlR4QW5jaG9yLmxvd2xvY2t3YWl0KTsKKwl9CisJVFhOX1dBS0VVUCgmVHhBbmNob3IuZnJlZWxvY2t3YWl0KTsKK30KKworLyoKKyAqIE5BTUU6ICAgICAgICB0eEluaXQoKQorICoKKyAqIEZVTkNUSU9OOiAgICBpbml0aWFsaXplIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgc3RydWN0dXJlcworICoKKyAqIFJFVFVSTjoKKyAqCisgKiBzZXJpYWxpemF0aW9uOiBzaW5nbGUgdGhyZWFkIGF0IGpmc19pbml0KCkKKyAqLworaW50IHR4SW5pdCh2b2lkKQoreworCWludCBrLCBzaXplOworCXN0cnVjdCBzeXNpbmZvIHNpOworCisJLyogU2V0IGRlZmF1bHRzIGZvciBuVHhMb2NrIGFuZCBuVHhCbG9jayBpZiB1bnNldCAqLworCisJaWYgKG5UeExvY2sgPT0gLTEpIHsKKwkJaWYgKG5UeEJsb2NrID09IC0xKSB7CisJCQkvKiBCYXNlIGRlZmF1bHQgb24gbWVtb3J5IHNpemUgKi8KKwkJCXNpX21lbWluZm8oJnNpKTsKKwkJCWlmIChzaS50b3RhbHJhbSA+ICgyNTYgKiAxMDI0KSkgLyogMSBHQiAqLworCQkJCW5UeExvY2sgPSA2NCAqIDEwMjQ7CisJCQllbHNlCisJCQkJblR4TG9jayA9IHNpLnRvdGFscmFtID4+IDI7CisJCX0gZWxzZSBpZiAoblR4QmxvY2sgPiAoOCAqIDEwMjQpKQorCQkJblR4TG9jayA9IDY0ICogMTAyNDsKKwkJZWxzZQorCQkJblR4TG9jayA9IG5UeEJsb2NrIDw8IDM7CisJfQorCWlmIChuVHhCbG9jayA9PSAtMSkKKwkJblR4QmxvY2sgPSBuVHhMb2NrID4+IDM7CisKKwkvKiBWZXJpZnkgdHVuYWJsZSBwYXJhbWV0ZXJzICovCisJaWYgKG5UeEJsb2NrIDwgMTYpCisJCW5UeEJsb2NrID0gMTY7CS8qIE5vIG9uZSBzaG91bGQgc2V0IGl0IHRoaXMgbG93ICovCisJaWYgKG5UeEJsb2NrID4gNjU1MzYpCisJCW5UeEJsb2NrID0gNjU1MzY7CisJaWYgKG5UeExvY2sgPCAyNTYpCisJCW5UeExvY2sgPSAyNTY7CS8qIE5vIG9uZSBzaG91bGQgc2V0IGl0IHRoaXMgbG93ICovCisJaWYgKG5UeExvY2sgPiA2NTUzNikKKwkJblR4TG9jayA9IDY1NTM2OworCisJcHJpbnRrKEtFUk5fSU5GTyAiSkZTOiBuVHhCbG9jayA9ICVkLCBuVHhMb2NrID0gJWRcbiIsCisJICAgICAgIG5UeEJsb2NrLCBuVHhMb2NrKTsKKwkvKgorCSAqIGluaXRpYWxpemUgdHJhbnNhY3Rpb24gYmxvY2sgKHRibG9jaykgdGFibGUKKwkgKgorCSAqIHRyYW5zYWN0aW9uIGlkICh0aWQpID0gdGJsb2NrIGluZGV4CisJICogdGlkID0gMCBpcyByZXNlcnZlZC4KKwkgKi8KKwlUeExvY2tMV00gPSAoblR4TG9jayAqIDQpIC8gMTA7CisJVHhMb2NrSFdNID0gKG5UeExvY2sgKiA3KSAvIDEwOworCVR4TG9ja1ZIV00gPSAoblR4TG9jayAqIDgpIC8gMTA7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCB0YmxvY2spICogblR4QmxvY2s7CisJVHhCbG9jayA9IChzdHJ1Y3QgdGJsb2NrICopIHZtYWxsb2Moc2l6ZSk7CisJaWYgKFR4QmxvY2sgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGsgPSAxOyBrIDwgblR4QmxvY2sgLSAxOyBrKyspIHsKKwkJVHhCbG9ja1trXS5uZXh0ID0gayArIDE7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJlR4QmxvY2tba10uZ2N3YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmVHhCbG9ja1trXS53YWl0b3IpOworCX0KKwlUeEJsb2NrW2tdLm5leHQgPSAwOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJlR4QmxvY2tba10uZ2N3YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZUeEJsb2NrW2tdLndhaXRvcik7CisKKwlUeEFuY2hvci5mcmVldGlkID0gMTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZUeEFuY2hvci5mcmVld2FpdCk7CisKKwlzdGF0dHgubWF4dGlkID0gMTsJLyogc3RhdGlzdGljcyAqLworCisJLyoKKwkgKiBpbml0aWFsaXplIHRyYW5zYWN0aW9uIGxvY2sgKHRsb2NrKSB0YWJsZQorCSAqCisJICogdHJhbnNhY3Rpb24gbG9jayBpZCA9IHRsb2NrIGluZGV4CisJICogdGxvY2sgaWQgPSAwIGlzIHJlc2VydmVkLgorCSAqLworCXNpemUgPSBzaXplb2Yoc3RydWN0IHRsb2NrKSAqIG5UeExvY2s7CisJVHhMb2NrID0gKHN0cnVjdCB0bG9jayAqKSB2bWFsbG9jKHNpemUpOworCWlmIChUeExvY2sgPT0gTlVMTCkgeworCQl2ZnJlZShUeEJsb2NrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogaW5pdGlhbGl6ZSB0bG9jayB0YWJsZSAqLworCWZvciAoayA9IDE7IGsgPCBuVHhMb2NrIC0gMTsgaysrKQorCQlUeExvY2tba10ubmV4dCA9IGsgKyAxOworCVR4TG9ja1trXS5uZXh0ID0gMDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZUeEFuY2hvci5mcmVlbG9ja3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJlR4QW5jaG9yLmxvd2xvY2t3YWl0KTsKKworCVR4QW5jaG9yLmZyZWVsb2NrID0gMTsKKwlUeEFuY2hvci50bG9ja3NJblVzZSA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJlR4QW5jaG9yLmFub25fbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJlR4QW5jaG9yLmFub25fbGlzdDIpOworCisJTEFaWV9MT0NLX0lOSVQoKTsKKwlJTklUX0xJU1RfSEVBRCgmVHhBbmNob3IudW5sb2NrX3F1ZXVlKTsKKworCXN0YXR0eC5tYXhsaWQgPSAxOwkvKiBzdGF0aXN0aWNzICovCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE5BTUU6ICAgICAgICB0eEV4aXQoKQorICoKKyAqIEZVTkNUSU9OOiAgICBjbGVhbiB1cCB3aGVuIG1vZHVsZSBpcyB1bmxvYWRlZAorICovCit2b2lkIHR4RXhpdCh2b2lkKQoreworCXZmcmVlKFR4TG9jayk7CisJVHhMb2NrID0gTlVMTDsKKwl2ZnJlZShUeEJsb2NrKTsKKwlUeEJsb2NrID0gTlVMTDsKK30KKworCisvKgorICogTkFNRTogICAgICAgIHR4QmVnaW4oKQorICoKKyAqIEZVTkNUSU9OOiAgICBzdGFydCBhIHRyYW5zYWN0aW9uLgorICoKKyAqIFBBUkFNRVRFUjogICBzYgktIHN1cGVyYmxvY2sKKyAqICAgICAgICAgICAgICBmbGFnCS0gZm9yY2UgZm9yIG5lc3RlZCB0eDsKKyAqCisgKiBSRVRVUk46CXRpZAktIHRyYW5zYWN0aW9uIGlkCisgKgorICogbm90ZTogZmxhZyBmb3JjZSBhbGxvd3MgdG8gc3RhcnQgdHggZm9yIG5lc3RlZCB0eAorICogdG8gcHJldmVudCBkZWFkbG9jayBvbiBsb2dzeW5jIGJhcnJpZXI7CisgKi8KK3RpZF90IHR4QmVnaW4oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGZsYWcpCit7CisJdGlkX3QgdDsKKwlzdHJ1Y3QgdGJsb2NrICp0YmxrOworCXN0cnVjdCBqZnNfbG9nICpsb2c7CisKKwlqZnNfaW5mbygidHhCZWdpbjogZmxhZyA9IDB4JXgiLCBmbGFnKTsKKwlsb2cgPSBKRlNfU0JJKHNiKS0+bG9nOworCisJVFhOX0xPQ0soKTsKKworCUlOQ1JFTUVOVChUeFN0YXQudHhCZWdpbik7CisKKyAgICAgIHJldHJ5OgorCWlmICghKGZsYWcgJiBDT01NSVRfRk9SQ0UpKSB7CisJCS8qCisJCSAqIHN5bmNocm9uaXplIHdpdGggbG9nc3luYyBiYXJyaWVyCisJCSAqLworCQlpZiAodGVzdF9iaXQobG9nX1NZTkNCQVJSSUVSLCAmbG9nLT5mbGFnKSB8fAorCQkgICAgdGVzdF9iaXQobG9nX1FVSUVTQ0UsICZsb2ctPmZsYWcpKSB7CisJCQlJTkNSRU1FTlQoVHhTdGF0LnR4QmVnaW5fYmFycmllcik7CisJCQlUWE5fU0xFRVAoJmxvZy0+c3luY3dhaXQpOworCQkJZ290byByZXRyeTsKKwkJfQorCX0KKwlpZiAoZmxhZyA9PSAwKSB7CisJCS8qCisJCSAqIERvbid0IGJlZ2luIHRyYW5zYWN0aW9uIGlmIHdlJ3JlIGdldHRpbmcgc3RhcnZlZCBmb3IgdGxvY2tzCisJCSAqIHVubGVzcyBDT01NSVRfRk9SQ0Ugb3IgQ09NTUlUX0lOT0RFICh3aGljaCBtYXkgdWx0aW1hdGVseQorCQkgKiBmcmVlIHRsb2NrcykKKwkJICovCisJCWlmIChUeEFuY2hvci50bG9ja3NJblVzZSA+IFR4TG9ja1ZIV00pIHsKKwkJCUlOQ1JFTUVOVChUeFN0YXQudHhCZWdpbl9sb2Nrc2xvdyk7CisJCQlUWE5fU0xFRVAoJlR4QW5jaG9yLmxvd2xvY2t3YWl0KTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwl9CisKKwkvKgorCSAqIGFsbG9jYXRlIHRyYW5zYWN0aW9uIGlkL2Jsb2NrCisJICovCisJaWYgKCh0ID0gVHhBbmNob3IuZnJlZXRpZCkgPT0gMCkgeworCQlqZnNfaW5mbygidHhCZWdpbjogd2FpdGluZyBmb3IgZnJlZSB0aWQiKTsKKwkJSU5DUkVNRU5UKFR4U3RhdC50eEJlZ2luX2ZyZWV0aWQpOworCQlUWE5fU0xFRVAoJlR4QW5jaG9yLmZyZWV3YWl0KTsKKwkJZ290byByZXRyeTsKKwl9CisKKwl0YmxrID0gdGlkX3RvX3RibG9jayh0KTsKKworCWlmICgodGJsay0+bmV4dCA9PSAwKSAmJiAhKGZsYWcgJiBDT01NSVRfRk9SQ0UpKSB7CisJCS8qIERvbid0IGxldCBhIG5vbi1mb3JjZWQgdHJhbnNhY3Rpb24gdGFrZSB0aGUgbGFzdCB0YmxrICovCisJCWpmc19pbmZvKCJ0eEJlZ2luOiB3YWl0aW5nIGZvciBmcmVlIHRpZCIpOworCQlJTkNSRU1FTlQoVHhTdGF0LnR4QmVnaW5fZnJlZXRpZCk7CisJCVRYTl9TTEVFUCgmVHhBbmNob3IuZnJlZXdhaXQpOworCQlnb3RvIHJldHJ5OworCX0KKworCVR4QW5jaG9yLmZyZWV0aWQgPSB0YmxrLT5uZXh0OworCisJLyoKKwkgKiBpbml0aWFsaXplIHRyYW5zYWN0aW9uCisJICovCisKKwkvKgorCSAqIFdlIGNhbid0IHplcm8gdGhlIHdob2xlIHRoaW5nIG9yIHdlIHNjcmV3IHVwIGFub3RoZXIgdGhyZWFkIGJlaW5nCisJICogYXdha2VuZWQgYWZ0ZXIgc2xlZXBpbmcgb24gdGJsay0+d2FpdG9yCisJICoKKwkgKiBtZW1zZXQodGJsaywgMCwgc2l6ZW9mKHN0cnVjdCB0YmxvY2spKTsKKwkgKi8KKwl0YmxrLT5uZXh0ID0gdGJsay0+bGFzdCA9IHRibGstPnhmbGFnID0gdGJsay0+ZmxhZyA9IHRibGstPmxzbiA9IDA7CisKKwl0YmxrLT5zYiA9IHNiOworCSsrbG9nLT5sb2d0aWQ7CisJdGJsay0+bG9ndGlkID0gbG9nLT5sb2d0aWQ7CisKKwkrK2xvZy0+YWN0aXZlOworCisJSElHSFdBVEVSTUFSSyhzdGF0dHgubWF4dGlkLCB0KTsJLyogc3RhdGlzdGljcyAqLworCUlOQ1JFTUVOVChzdGF0dHgubnRpZCk7CS8qIHN0YXRpc3RpY3MgKi8KKworCVRYTl9VTkxPQ0soKTsKKworCWpmc19pbmZvKCJ0eEJlZ2luOiByZXR1cm5pbmcgdGlkID0gJWQiLCB0KTsKKworCXJldHVybiB0OworfQorCisKKy8qCisgKiBOQU1FOiAgICAgICAgdHhCZWdpbkFub24oKQorICoKKyAqIEZVTkNUSU9OOiAgICBzdGFydCBhbiBhbm9ueW1vdXMgdHJhbnNhY3Rpb24uCisgKgkJQmxvY2tzIGlmIGxvZ3N5bmMgb3IgYXZhaWxhYmxlIHRsb2NrcyBhcmUgbG93IHRvIHByZXZlbnQKKyAqCQlhbm9ueW1vdXMgdGxvY2tzIGZyb20gZGVwbGV0aW5nIHN1cHBseS4KKyAqCisgKiBQQVJBTUVURVI6ICAgc2IJLSBzdXBlcmJsb2NrCisgKgorICogUkVUVVJOOglub25lCisgKi8KK3ZvaWQgdHhCZWdpbkFub24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgamZzX2xvZyAqbG9nOworCisJbG9nID0gSkZTX1NCSShzYiktPmxvZzsKKworCVRYTl9MT0NLKCk7CisJSU5DUkVNRU5UKFR4U3RhdC50eEJlZ2luQW5vbik7CisKKyAgICAgIHJldHJ5OgorCS8qCisJICogc3luY2hyb25pemUgd2l0aCBsb2dzeW5jIGJhcnJpZXIKKwkgKi8KKwlpZiAodGVzdF9iaXQobG9nX1NZTkNCQVJSSUVSLCAmbG9nLT5mbGFnKSB8fAorCSAgICB0ZXN0X2JpdChsb2dfUVVJRVNDRSwgJmxvZy0+ZmxhZykpIHsKKwkJSU5DUkVNRU5UKFR4U3RhdC50eEJlZ2luQW5vbl9iYXJyaWVyKTsKKwkJVFhOX1NMRUVQKCZsb2ctPnN5bmN3YWl0KTsKKwkJZ290byByZXRyeTsKKwl9CisKKwkvKgorCSAqIERvbid0IGJlZ2luIHRyYW5zYWN0aW9uIGlmIHdlJ3JlIGdldHRpbmcgc3RhcnZlZCBmb3IgdGxvY2tzCisJICovCisJaWYgKFR4QW5jaG9yLnRsb2Nrc0luVXNlID4gVHhMb2NrVkhXTSkgeworCQlJTkNSRU1FTlQoVHhTdGF0LnR4QmVnaW5Bbm9uX2xvY2tzbG93KTsKKwkJVFhOX1NMRUVQKCZUeEFuY2hvci5sb3dsb2Nrd2FpdCk7CisJCWdvdG8gcmV0cnk7CisJfQorCVRYTl9VTkxPQ0soKTsKK30KKworCisvKgorICogICAgICB0eEVuZCgpCisgKgorICogZnVuY3Rpb246IGZyZWUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uIGJsb2NrLgorICoKKyAqICAgICAgbG9nc3luYyBiYXJyaWVyIHByb2Nlc3Npbmc6CisgKgorICogc2VyaWFsaXphdGlvbjoKKyAqLwordm9pZCB0eEVuZCh0aWRfdCB0aWQpCit7CisJc3RydWN0IHRibG9jayAqdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKKwlzdHJ1Y3QgamZzX2xvZyAqbG9nOworCisJamZzX2luZm8oInR4RW5kOiB0aWQgPSAlZCIsIHRpZCk7CisJVFhOX0xPQ0soKTsKKworCS8qCisJICogd2FrZXVwIHRyYW5zYWN0aW9ucyB3YWl0aW5nIG9uIHRoZSBwYWdlIGxvY2tlZAorCSAqIGJ5IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uCisJICovCisJVFhOX1dBS0VVUCgmdGJsay0+d2FpdG9yKTsKKworCWxvZyA9IEpGU19TQkkodGJsay0+c2IpLT5sb2c7CisKKwkvKgorCSAqIExhenkgY29tbWl0IHRocmVhZCBjYW4ndCBmcmVlIHRoaXMgZ3V5IHVudGlsIHdlIG1hcmsgaXQgVU5MT0NLRUQsCisJICogb3RoZXJ3aXNlLCB3ZSB3b3VsZCBiZSBsZWZ0IHdpdGggYSB0cmFuc2FjdGlvbiB0aGF0IG1heSBoYXZlIGJlZW4KKwkgKiByZXVzZWQuCisJICoKKwkgKiBMYXp5IGNvbW1pdCB0aHJlYWQgd2lsbCB0dXJuIG9mZiB0YmxrR0NfTEFaWSBiZWZvcmUgY2FsbGluZyB0aGlzCisJICogcm91dGluZS4KKwkgKi8KKwlpZiAodGJsay0+ZmxhZyAmIHRibGtHQ19MQVpZKSB7CisJCWpmc19pbmZvKCJ0eEVuZCBjYWxsZWQgdy9sYXp5IHRpZDogJWQsIHRibGsgPSAweCVwIiwgdGlkLCB0YmxrKTsKKwkJVFhOX1VOTE9DSygpOworCisJCXNwaW5fbG9ja19pcnEoJmxvZy0+Z2Nsb2NrKTsJLy8gTE9HR0NfTE9DSworCQl0YmxrLT5mbGFnIHw9IHRibGtHQ19VTkxPQ0tFRDsKKwkJc3Bpbl91bmxvY2tfaXJxKCZsb2ctPmdjbG9jayk7CS8vIExPR0dDX1VOTE9DSworCQlyZXR1cm47CisJfQorCisJamZzX2luZm8oInR4RW5kOiB0aWQ6ICVkLCB0YmxrID0gMHglcCIsIHRpZCwgdGJsayk7CisKKwlhc3NlcnQodGJsay0+bmV4dCA9PSAwKTsKKworCS8qCisJICogaW5zZXJ0IHRibG9jayBiYWNrIG9uIGZyZWVsaXN0CisJICovCisJdGJsay0+bmV4dCA9IFR4QW5jaG9yLmZyZWV0aWQ7CisJVHhBbmNob3IuZnJlZXRpZCA9IHRpZDsKKworCS8qCisJICogbWFyayB0aGUgdGJsb2NrIG5vdCBhY3RpdmUKKwkgKi8KKwlpZiAoLS1sb2ctPmFjdGl2ZSA9PSAwKSB7CisJCWNsZWFyX2JpdChsb2dfRkxVU0gsICZsb2ctPmZsYWcpOworCisJCS8qCisJCSAqIHN5bmNocm9uaXplIHdpdGggbG9nc3luYyBiYXJyaWVyCisJCSAqLworCQlpZiAodGVzdF9iaXQobG9nX1NZTkNCQVJSSUVSLCAmbG9nLT5mbGFnKSkgeworCQkJLyogZm9yd2FyZCBsb2cgc3luY3B0ICovCisJCQkvKiBsbVN5bmMobG9nKTsgKi8KKworCQkJamZzX2luZm8oImxvZyBiYXJyaWVyIG9mZjogMHgleCIsIGxvZy0+bHNuKTsKKworCQkJLyogZW5hYmxlIG5ldyB0cmFuc2FjdGlvbnMgc3RhcnQgKi8KKwkJCWNsZWFyX2JpdChsb2dfU1lOQ0JBUlJJRVIsICZsb2ctPmZsYWcpOworCisJCQkvKiB3YWtldXAgYWxsIHdhaXRvcnMgZm9yIGxvZ3N5bmMgYmFycmllciAqLworCQkJVFhOX1dBS0VVUCgmbG9nLT5zeW5jd2FpdCk7CisJCX0KKwl9CisKKwkvKgorCSAqIHdha2V1cCBhbGwgd2FpdG9ycyBmb3IgYSBmcmVlIHRibG9jaworCSAqLworCVRYTl9XQUtFVVAoJlR4QW5jaG9yLmZyZWV3YWl0KTsKKworCVRYTl9VTkxPQ0soKTsKK30KKworCisvKgorICogICAgICB0eExvY2soKQorICoKKyAqIGZ1bmN0aW9uOiBhY3F1aXJlIGEgdHJhbnNhY3Rpb24gbG9jayBvbiB0aGUgc3BlY2lmaWVkIDxtcD4KKyAqCisgKiBwYXJhbWV0ZXI6CisgKgorICogcmV0dXJuOiAgICAgIHRyYW5zYWN0aW9uIGxvY2sgaWQKKyAqCisgKiBzZXJpYWxpemF0aW9uOgorICovCitzdHJ1Y3QgdGxvY2sgKnR4TG9jayh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBtZXRhcGFnZSAqIG1wLAorCQkgICAgIGludCB0eXBlKQoreworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamZzX2lwID0gSkZTX0lQKGlwKTsKKwlpbnQgZGlyX3h0cmVlID0gMDsKKwlsaWRfdCBsaWQ7CisJdGlkX3QgeHRpZDsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJc3RydWN0IHh0bG9jayAqeHRsY2s7CisJc3RydWN0IGxpbmVsb2NrICpsaW5lbG9jazsKKwl4dHBhZ2VfdCAqcDsKKwlzdHJ1Y3QgdGJsb2NrICp0YmxrOworCisJVFhOX0xPQ0soKTsKKworCWlmIChTX0lTRElSKGlwLT5pX21vZGUpICYmICh0eXBlICYgdGxja1hUUkVFKSAmJgorCSAgICAhKG1wLT54ZmxhZyAmIENPTU1JVF9QQUdFKSkgeworCQkvKgorCQkgKiBEaXJlY3RvcnkgaW5vZGUgaXMgc3BlY2lhbC4gIEl0IGNhbiBoYXZlIGJvdGggYW4geHRyZWUgdGxvY2sKKwkJICogYW5kIGEgZHRyZWUgdGxvY2sgYXNzb2NpYXRlZCB3aXRoIGl0LgorCQkgKi8KKwkJZGlyX3h0cmVlID0gMTsKKwkJbGlkID0gamZzX2lwLT54dGxpZDsKKwl9IGVsc2UKKwkJbGlkID0gbXAtPmxpZDsKKworCS8qIGlzIHBhZ2Ugbm90IGxvY2tlZCBieSBhIHRyYW5zYWN0aW9uID8gKi8KKwlpZiAobGlkID09IDApCisJCWdvdG8gYWxsb2NhdGVMb2NrOworCisJamZzX2luZm8oInR4TG9jazogdGlkOiVkIGlwOjB4JXAgbXA6MHglcCBsaWQ6JWQiLCB0aWQsIGlwLCBtcCwgbGlkKTsKKworCS8qIGlzIHBhZ2UgbG9ja2VkIGJ5IHRoZSByZXF1ZXN0ZXIgdHJhbnNhY3Rpb24gPyAqLworCXRsY2sgPSBsaWRfdG9fdGxvY2sobGlkKTsKKwlpZiAoKHh0aWQgPSB0bGNrLT50aWQpID09IHRpZCkKKwkJZ290byBncmFudExvY2s7CisKKwkvKgorCSAqIGlzIHBhZ2UgbG9ja2VkIGJ5IGFub255bW91cyB0cmFuc2FjdGlvbi9sb2NrID8KKwkgKgorCSAqIChwYWdlIHVwZGF0ZSB3aXRob3V0IHRyYW5zYWN0aW9uIChpLmUuLCBmaWxlIHdyaXRlKSBpcworCSAqIGxvY2tlZCB1bmRlciBhbm9ueW1vdXMgdHJhbnNhY3Rpb24gdGlkID0gMDoKKwkgKiBhbm9ueW1vdXMgdGxvY2tzIG1haW50YWluZWQgb24gYW5vbnltb3VzIHRsb2NrIGxpc3Qgb2YKKwkgKiB0aGUgaW5vZGUgb2YgdGhlIHBhZ2UgYW5kIGF2YWlsYWJsZSB0byBhbGwgYW5vbnltb3VzCisJICogdHJhbnNhY3Rpb25zIHVudGlsIHR4Q29tbWl0KCkgdGltZSBhdCB3aGljaCBwb2ludAorCSAqIHRoZXkgYXJlIHRyYW5zZmVycmVkIHRvIHRoZSB0cmFuc2FjdGlvbiB0bG9jayBsaXN0IG9mCisJICogdGhlIGNvbW1pdGluZyB0cmFuc2FjdGlvbiBvZiB0aGUgaW5vZGUpCisJICovCisJaWYgKHh0aWQgPT0gMCkgeworCQl0bGNrLT50aWQgPSB0aWQ7CisJCXRibGsgPSB0aWRfdG9fdGJsb2NrKHRpZCk7CisJCS8qCisJCSAqIFRoZSBvcmRlciBvZiB0aGUgdGxvY2tzIGluIHRoZSB0cmFuc2FjdGlvbiBpcyBpbXBvcnRhbnQKKwkJICogKGR1cmluZyB0cnVuY2F0ZSwgY2hpbGQgeHRyZWUgcGFnZXMgbXVzdCBiZSBmcmVlZCBiZWZvcmUKKwkJICogcGFyZW50J3MgdGxvY2tzIGNoYW5nZSB0aGUgd29ya2luZyBtYXApLgorCQkgKiBUYWtlIHRsb2NrIG9mZiBhbm9ueW1vdXMgbGlzdCBhbmQgYWRkIHRvIHRhaWwgb2YKKwkJICogdHJhbnNhY3Rpb24gbGlzdAorCQkgKgorCQkgKiBOb3RlOiAgV2UgcmVhbGx5IG5lZWQgdG8gZ2V0IHJpZCBvZiB0aGUgdGlkICYgbGlkIGFuZAorCQkgKiB1c2UgbGlzdF9oZWFkJ3MuICBUaGlzIGNvZGUgaXMgZ2V0dGluZyBVR0xZIQorCQkgKi8KKwkJaWYgKGpmc19pcC0+YXRsaGVhZCA9PSBsaWQpIHsKKwkJCWlmIChqZnNfaXAtPmF0bHRhaWwgPT0gbGlkKSB7CisJCQkJLyogb25seSBhbm9ueW1vdXMgdHhuLgorCQkJCSAqIFJlbW92ZSBmcm9tIGFub25fbGlzdAorCQkJCSAqLworCQkJCWxpc3RfZGVsX2luaXQoJmpmc19pcC0+YW5vbl9pbm9kZV9saXN0KTsKKwkJCX0KKwkJCWpmc19pcC0+YXRsaGVhZCA9IHRsY2stPm5leHQ7CisJCX0gZWxzZSB7CisJCQlsaWRfdCBsYXN0OworCQkJZm9yIChsYXN0ID0gamZzX2lwLT5hdGxoZWFkOworCQkJICAgICBsaWRfdG9fdGxvY2sobGFzdCktPm5leHQgIT0gbGlkOworCQkJICAgICBsYXN0ID0gbGlkX3RvX3Rsb2NrKGxhc3QpLT5uZXh0KSB7CisJCQkJYXNzZXJ0KGxhc3QpOworCQkJfQorCQkJbGlkX3RvX3Rsb2NrKGxhc3QpLT5uZXh0ID0gdGxjay0+bmV4dDsKKwkJCWlmIChqZnNfaXAtPmF0bHRhaWwgPT0gbGlkKQorCQkJCWpmc19pcC0+YXRsdGFpbCA9IGxhc3Q7CisJCX0KKworCQkvKiBpbnNlcnQgdGhlIHRsb2NrIGF0IHRhaWwgb2YgdHJhbnNhY3Rpb24gdGxvY2sgbGlzdCAqLworCisJCWlmICh0YmxrLT5uZXh0KQorCQkJbGlkX3RvX3Rsb2NrKHRibGstPmxhc3QpLT5uZXh0ID0gbGlkOworCQllbHNlCisJCQl0YmxrLT5uZXh0ID0gbGlkOworCQl0bGNrLT5uZXh0ID0gMDsKKwkJdGJsay0+bGFzdCA9IGxpZDsKKworCQlnb3RvIGdyYW50TG9jazsKKwl9CisKKwlnb3RvIHdhaXRMb2NrOworCisJLyoKKwkgKiBhbGxvY2F0ZSBhIHRsb2NrCisJICovCisgICAgICBhbGxvY2F0ZUxvY2s6CisJbGlkID0gdHhMb2NrQWxsb2MoKTsKKwl0bGNrID0gbGlkX3RvX3Rsb2NrKGxpZCk7CisKKwkvKgorCSAqIGluaXRpYWxpemUgdGxvY2sKKwkgKi8KKwl0bGNrLT50aWQgPSB0aWQ7CisKKwkvKiBtYXJrIHRsb2NrIGZvciBtZXRhLWRhdGEgcGFnZSAqLworCWlmIChtcC0+eGZsYWcgJiBDT01NSVRfUEFHRSkgeworCisJCXRsY2stPmZsYWcgPSB0bGNrUEFHRUxPQ0s7CisKKwkJLyogbWFyayB0aGUgcGFnZSBkaXJ0eSBhbmQgbm9ob21lb2sgKi8KKwkJbWFya19tZXRhcGFnZV9kaXJ0eShtcCk7CisJCWF0b21pY19pbmMoJm1wLT5ub2hvbWVvayk7CisKKwkJamZzX2luZm8oImxvY2tpbmcgbXAgPSAweCVwLCBub2hvbWVvayA9ICVkIHRpZCA9ICVkIHRsY2sgPSAweCVwIiwKKwkJCSBtcCwgYXRvbWljX3JlYWQoJm1wLT5ub2hvbWVvayksIHRpZCwgdGxjayk7CisKKwkJLyogaWYgYW5vbnltb3VzIHRyYW5zYWN0aW9uLCBhbmQgYnVmZmVyIGlzIG9uIHRoZSBncm91cAorCQkgKiBjb21taXQgc3luY2xpc3QsIG1hcmsgaW5vZGUgdG8gc2hvdyB0aGlzLiAgVGhpcyB3aWxsCisJCSAqIHByZXZlbnQgdGhlIGJ1ZmZlciBmcm9tIGJlaW5nIG1hcmtlZCBub2hvbWVvayBmb3IgdG9vCisJCSAqIGxvbmcgYSB0aW1lLgorCQkgKi8KKwkJaWYgKCh0aWQgPT0gMCkgJiYgbXAtPmxzbikKKwkJCXNldF9jZmxhZyhDT01NSVRfU3luY2xpc3QsIGlwKTsKKwl9CisJLyogbWFyayB0bG9jayBmb3IgaW4tbWVtb3J5IGlub2RlICovCisJZWxzZQorCQl0bGNrLT5mbGFnID0gdGxja0lOT0RFTE9DSzsKKworCXRsY2stPnR5cGUgPSAwOworCisJLyogYmluZCB0aGUgdGxvY2sgYW5kIHRoZSBwYWdlICovCisJdGxjay0+aXAgPSBpcDsKKwl0bGNrLT5tcCA9IG1wOworCWlmIChkaXJfeHRyZWUpCisJCWpmc19pcC0+eHRsaWQgPSBsaWQ7CisJZWxzZQorCQltcC0+bGlkID0gbGlkOworCisJLyoKKwkgKiBlbnF1ZXVlIHRyYW5zYWN0aW9uIGxvY2sgdG8gdHJhbnNhY3Rpb24vaW5vZGUKKwkgKi8KKwkvKiBpbnNlcnQgdGhlIHRsb2NrIGF0IHRhaWwgb2YgdHJhbnNhY3Rpb24gdGxvY2sgbGlzdCAqLworCWlmICh0aWQpIHsKKwkJdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKKwkJaWYgKHRibGstPm5leHQpCisJCQlsaWRfdG9fdGxvY2sodGJsay0+bGFzdCktPm5leHQgPSBsaWQ7CisJCWVsc2UKKwkJCXRibGstPm5leHQgPSBsaWQ7CisJCXRsY2stPm5leHQgPSAwOworCQl0YmxrLT5sYXN0ID0gbGlkOworCX0KKwkvKiBhbm9ueW1vdXMgdHJhbnNhY3Rpb246CisJICogaW5zZXJ0IHRoZSB0bG9jayBhdCBoZWFkIG9mIGlub2RlIGFub255bW91cyB0bG9jayBsaXN0CisJICovCisJZWxzZSB7CisJCXRsY2stPm5leHQgPSBqZnNfaXAtPmF0bGhlYWQ7CisJCWpmc19pcC0+YXRsaGVhZCA9IGxpZDsKKwkJaWYgKHRsY2stPm5leHQgPT0gMCkgeworCQkJLyogVGhpcyBpbm9kZSdzIGZpcnN0IGFub255bW91cyB0cmFuc2FjdGlvbiAqLworCQkJamZzX2lwLT5hdGx0YWlsID0gbGlkOworCQkJbGlzdF9hZGRfdGFpbCgmamZzX2lwLT5hbm9uX2lub2RlX2xpc3QsCisJCQkJICAgICAgJlR4QW5jaG9yLmFub25fbGlzdCk7CisJCX0KKwl9CisKKwkvKiBpbml0aWFsaXplIHR5cGUgZGVwZW5kZW50IGFyZWEgZm9yIGxpbmVsb2NrICovCisJbGluZWxvY2sgPSAoc3RydWN0IGxpbmVsb2NrICopICYgdGxjay0+bG9jazsKKwlsaW5lbG9jay0+bmV4dCA9IDA7CisJbGluZWxvY2stPmZsYWcgPSB0bGNrTElORUxPQ0s7CisJbGluZWxvY2stPm1heGNudCA9IFRMT0NLU0hPUlQ7CisJbGluZWxvY2stPmluZGV4ID0gMDsKKworCXN3aXRjaCAodHlwZSAmIHRsY2tUWVBFKSB7CisJY2FzZSB0bGNrRFRSRUU6CisJCWxpbmVsb2NrLT5sMmxpbmVzaXplID0gTDJEVFNMT1RTSVpFOworCQlicmVhazsKKworCWNhc2UgdGxja1hUUkVFOgorCQlsaW5lbG9jay0+bDJsaW5lc2l6ZSA9IEwyWFRTTE9UU0laRTsKKworCQl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopIGxpbmVsb2NrOworCQl4dGxjay0+aGVhZGVyLm9mZnNldCA9IDA7CisJCXh0bGNrLT5oZWFkZXIubGVuZ3RoID0gMjsKKworCQlpZiAodHlwZSAmIHRsY2tORVcpIHsKKwkJCXh0bGNrLT5sd20ub2Zmc2V0ID0gWFRFTlRSWVNUQVJUOworCQl9IGVsc2UgeworCQkJaWYgKG1wLT54ZmxhZyAmIENPTU1JVF9QQUdFKQorCQkJCXAgPSAoeHRwYWdlX3QgKikgbXAtPmRhdGE7CisJCQllbHNlCisJCQkJcCA9ICZqZnNfaXAtPmlfeHRyb290OworCQkJeHRsY2stPmx3bS5vZmZzZXQgPQorCQkJICAgIGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpOworCQl9CisJCXh0bGNrLT5sd20ubGVuZ3RoID0gMDsJLyogISAqLworCQl4dGxjay0+dHdtLm9mZnNldCA9IDA7CisJCXh0bGNrLT5od20ub2Zmc2V0ID0gMDsKKworCQl4dGxjay0+aW5kZXggPSAyOworCQlicmVhazsKKworCWNhc2UgdGxja0lOT0RFOgorCQlsaW5lbG9jay0+bDJsaW5lc2l6ZSA9IEwySU5PREVTTE9UU0laRTsKKwkJYnJlYWs7CisKKwljYXNlIHRsY2tEQVRBOgorCQlsaW5lbG9jay0+bDJsaW5lc2l6ZSA9IEwyREFUQVNMT1RTSVpFOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWpmc19lcnIoIlVGTyB0bG9jazoweCVwIiwgdGxjayk7CisJfQorCisJLyoKKwkgKiB1cGRhdGUgdGxvY2sgdmVjdG9yCisJICovCisgICAgICBncmFudExvY2s6CisJdGxjay0+dHlwZSB8PSB0eXBlOworCisJVFhOX1VOTE9DSygpOworCisJcmV0dXJuIHRsY2s7CisKKwkvKgorCSAqIHBhZ2UgaXMgYmVpbmcgbG9ja2VkIGJ5IGFub3RoZXIgdHJhbnNhY3Rpb246CisJICovCisgICAgICB3YWl0TG9jazoKKwkvKiBPbmx5IGxvY2tzIG9uIGlwaW1hcCBvciBpcGFpbWFwIHNob3VsZCByZWFjaCBoZXJlICovCisJLyogYXNzZXJ0KGpmc19pcC0+ZmlsZXNldCA9PSBBR0dSRUdBVEVfSSk7ICovCisJaWYgKGpmc19pcC0+ZmlsZXNldCAhPSBBR0dSRUdBVEVfSSkgeworCQlqZnNfZXJyKCJ0eExvY2s6IHRyeWluZyB0byBsb2NrIGxvY2tlZCBwYWdlISIpOworCQlkdW1wX21lbSgiaXAiLCBpcCwgc2l6ZW9mKHN0cnVjdCBpbm9kZSkpOworCQlkdW1wX21lbSgibXAiLCBtcCwgc2l6ZW9mKHN0cnVjdCBtZXRhcGFnZSkpOworCQlkdW1wX21lbSgiTG9ja2VyJ3MgdGJsayIsIHRpZF90b190YmxvY2sodGlkKSwKKwkJCSBzaXplb2Yoc3RydWN0IHRibG9jaykpOworCQlkdW1wX21lbSgiVGxvY2siLCB0bGNrLCBzaXplb2Yoc3RydWN0IHRsb2NrKSk7CisJCUJVRygpOworCX0KKwlJTkNSRU1FTlQoc3RhdHR4LndhaXRsb2NrKTsJLyogc3RhdGlzdGljcyAqLworCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCisJamZzX2luZm8oInR4TG9jazogaW4gd2FpdExvY2ssIHRpZCA9ICVkLCB4dGlkID0gJWQsIGxpZCA9ICVkIiwKKwkJIHRpZCwgeHRpZCwgbGlkKTsKKwlUWE5fU0xFRVBfRFJPUF9MT0NLKCZ0aWRfdG9fdGJsb2NrKHh0aWQpLT53YWl0b3IpOworCWpmc19pbmZvKCJ0eExvY2s6IGF3YWtlbmVkICAgICB0aWQgPSAlZCwgbGlkID0gJWQiLCB0aWQsIGxpZCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKgorICogTkFNRTogICAgICAgIHR4UmVsZWFzZSgpCisgKgorICogRlVOQ1RJT046ICAgIFJlbGVhc2UgYnVmZmVycyBhc3NvY2lhdGVkIHdpdGggdHJhbnNhY3Rpb24gbG9ja3MsIGJ1dCBkb24ndAorICoJCW1hcmsgaG9tZW9rIHlldC4gIFRoZSBhbGxvd3Mgb3RoZXIgdHJhbnNhY3Rpb25zIHRvIG1vZGlmeQorICoJCWJ1ZmZlcnMsIGJ1dCB3b24ndCBsZXQgdGhlbSBnbyB0byBkaXNrIHVudGlsIGNvbW1pdCByZWNvcmQKKyAqCQlhY3R1YWxseSBnZXRzIHdyaXR0ZW4uCisgKgorICogUEFSQU1FVEVSOgorICogICAgICAgICAgICAgIHRibGsgICAgLQorICoKKyAqIFJFVFVSTjogICAgICBFcnJvcnMgZnJvbSBzdWJyb3V0aW5lcy4KKyAqLworc3RhdGljIHZvaWQgdHhSZWxlYXNlKHN0cnVjdCB0YmxvY2sgKiB0YmxrKQoreworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJbGlkX3QgbGlkOworCXN0cnVjdCB0bG9jayAqdGxjazsKKworCVRYTl9MT0NLKCk7CisKKwlmb3IgKGxpZCA9IHRibGstPm5leHQ7IGxpZDsgbGlkID0gdGxjay0+bmV4dCkgeworCQl0bGNrID0gbGlkX3RvX3Rsb2NrKGxpZCk7CisJCWlmICgobXAgPSB0bGNrLT5tcCkgIT0gTlVMTCAmJgorCQkgICAgKHRsY2stPnR5cGUgJiB0bGNrQlRST09UKSA9PSAwKSB7CisJCQlhc3NlcnQobXAtPnhmbGFnICYgQ09NTUlUX1BBR0UpOworCQkJbXAtPmxpZCA9IDA7CisJCX0KKwl9CisKKwkvKgorCSAqIHdha2V1cCB0cmFuc2FjdGlvbnMgd2FpdGluZyBvbiBhIHBhZ2UgbG9ja2VkCisJICogYnkgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24KKwkgKi8KKwlUWE5fV0FLRVVQKCZ0YmxrLT53YWl0b3IpOworCisJVFhOX1VOTE9DSygpOworfQorCisKKy8qCisgKiBOQU1FOiAgICAgICAgdHhVbmxvY2soKQorICoKKyAqIEZVTkNUSU9OOiAgICBJbml0aWF0ZXMgcGFnZW91dCBvZiBwYWdlcyBtb2RpZmllZCBieSB0aWQgaW4gam91cm5hbGxlZAorICogICAgICAgICAgICAgIG9iamVjdHMgYW5kIGZyZWVzIHRoZWlyIGxvY2t3b3Jkcy4KKyAqLworc3RhdGljIHZvaWQgdHhVbmxvY2soc3RydWN0IHRibG9jayAqIHRibGspCit7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBsaW5lbG9jayAqbGluZWxvY2s7CisJbGlkX3QgbGlkLCBuZXh0LCBsbGlkLCBrOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJc3RydWN0IGpmc19sb2cgKmxvZzsKKwlpbnQgZGlmZnQsIGRpZmZwOworCisJamZzX2luZm8oInR4VW5sb2NrOiB0YmxrID0gMHglcCIsIHRibGspOworCWxvZyA9IEpGU19TQkkodGJsay0+c2IpLT5sb2c7CisKKwkvKgorCSAqIG1hcmsgcGFnZSB1bmRlciB0bG9jayBob21lb2sgKGl0cyBsb2cgaGFzIGJlZW4gd3JpdHRlbik6CisJICovCisJZm9yIChsaWQgPSB0YmxrLT5uZXh0OyBsaWQ7IGxpZCA9IG5leHQpIHsKKwkJdGxjayA9IGxpZF90b190bG9jayhsaWQpOworCQluZXh0ID0gdGxjay0+bmV4dDsKKworCQlqZnNfaW5mbygidW5sb2NraW5nIGxpZCA9ICVkLCB0bGNrID0gMHglcCIsIGxpZCwgdGxjayk7CisKKwkJLyogdW5iaW5kIHBhZ2UgZnJvbSB0bG9jayAqLworCQlpZiAoKG1wID0gdGxjay0+bXApICE9IE5VTEwgJiYKKwkJICAgICh0bGNrLT50eXBlICYgdGxja0JUUk9PVCkgPT0gMCkgeworCQkJYXNzZXJ0KG1wLT54ZmxhZyAmIENPTU1JVF9QQUdFKTsKKworCQkJLyogaG9sZCBidWZmZXIKKwkJCSAqCisJCQkgKiBJdCdzIHBvc3NpYmxlIHRoYXQgc29tZW9uZSBlbHNlIGhhcyB0aGUgbWV0YXBhZ2UuCisJCQkgKiBUaGUgb25seSB0aGluZ3Mgd2VyZSBjaGFuZ2luZyBhcmUgbm9ob21lb2ssIHdoaWNoCisJCQkgKiBpcyBoYW5kbGVkIGF0b21pY2FsbHksIGFuZCBjbHNuIHdoaWNoIGlzIHByb3RlY3RlZAorCQkJICogYnkgdGhlIExPR1NZTkNfTE9DSy4KKwkJCSAqLworCQkJaG9sZF9tZXRhcGFnZShtcCwgMSk7CisKKwkJCWFzc2VydChhdG9taWNfcmVhZCgmbXAtPm5vaG9tZW9rKSA+IDApOworCQkJYXRvbWljX2RlYygmbXAtPm5vaG9tZW9rKTsKKworCQkJLyogaW5oZXJpdCB5b3VuZ2VyL2xhcmdlciBjbHNuICovCisJCQlMT0dTWU5DX0xPQ0sobG9nKTsKKwkJCWlmIChtcC0+Y2xzbikgeworCQkJCWxvZ2RpZmYoZGlmZnQsIHRibGstPmNsc24sIGxvZyk7CisJCQkJbG9nZGlmZihkaWZmcCwgbXAtPmNsc24sIGxvZyk7CisJCQkJaWYgKGRpZmZ0ID4gZGlmZnApCisJCQkJCW1wLT5jbHNuID0gdGJsay0+Y2xzbjsKKwkJCX0gZWxzZQorCQkJCW1wLT5jbHNuID0gdGJsay0+Y2xzbjsKKwkJCUxPR1NZTkNfVU5MT0NLKGxvZyk7CisKKwkJCWFzc2VydCghKHRsY2stPmZsYWcgJiB0bGNrRlJFRVBBR0UpKTsKKworCQkJaWYgKHRsY2stPmZsYWcgJiB0bGNrV1JJVEVQQUdFKSB7CisJCQkJd3JpdGVfbWV0YXBhZ2UobXApOworCQkJfSBlbHNlIHsKKwkJCQkvKiByZWxlYXNlIHBhZ2Ugd2hpY2ggaGFzIGJlZW4gZm9yY2VkICovCisJCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQl9CisJCX0KKworCQkvKiBpbnNlcnQgdGxvY2ssIGFuZCBsaW5lbG9jayhzKSBvZiB0aGUgdGxvY2sgaWYgYW55LAorCQkgKiBhdCBoZWFkIG9mIGZyZWVsaXN0CisJCSAqLworCQlUWE5fTE9DSygpOworCisJCWxsaWQgPSAoKHN0cnVjdCBsaW5lbG9jayAqKSAmIHRsY2stPmxvY2spLT5uZXh0OworCQl3aGlsZSAobGxpZCkgeworCQkJbGluZWxvY2sgPSAoc3RydWN0IGxpbmVsb2NrICopIGxpZF90b190bG9jayhsbGlkKTsKKwkJCWsgPSBsaW5lbG9jay0+bmV4dDsKKwkJCXR4TG9ja0ZyZWUobGxpZCk7CisJCQlsbGlkID0gazsKKwkJfQorCQl0eExvY2tGcmVlKGxpZCk7CisKKwkJVFhOX1VOTE9DSygpOworCX0KKwl0YmxrLT5uZXh0ID0gdGJsay0+bGFzdCA9IDA7CisKKwkvKgorCSAqIHJlbW92ZSB0YmxvY2sgZnJvbSBsb2dzeW5jbGlzdAorCSAqIChhbGxvY2F0aW9uIG1hcCBwYWdlcyBpbmhlcml0ZWQgbHNuIG9mIHRibGsgYW5kCisJICogaGFzIGJlZW4gaW5zZXJ0ZWQgaW4gbG9nc3luYyBsaXN0IGF0IHR4VXBkYXRlTWFwKCkpCisJICovCisJaWYgKHRibGstPmxzbikgeworCQlMT0dTWU5DX0xPQ0sobG9nKTsKKwkJbG9nLT5jb3VudC0tOworCQlsaXN0X2RlbCgmdGJsay0+c3luY2xpc3QpOworCQlMT0dTWU5DX1VOTE9DSyhsb2cpOworCX0KK30KKworCisvKgorICogICAgICB0eE1hcGxvY2soKQorICoKKyAqIGZ1bmN0aW9uOiBhbGxvY2F0ZSBhIHRyYW5zYWN0aW9uIGxvY2sgZm9yIGZyZWVkIHBhZ2UvZW50cnk7CisgKiAgICAgIGZvciBmcmVlZCBwYWdlLCBtYXBsb2NrIGlzIHVzZWQgYXMgeHRsb2NrL2R0bG9jayB0eXBlOworICovCitzdHJ1Y3QgdGxvY2sgKnR4TWFwbG9jayh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIGludCB0eXBlKQoreworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamZzX2lwID0gSkZTX0lQKGlwKTsKKwlsaWRfdCBsaWQ7CisJc3RydWN0IHRibG9jayAqdGJsazsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJc3RydWN0IG1hcGxvY2sgKm1hcGxvY2s7CisKKwlUWE5fTE9DSygpOworCisJLyoKKwkgKiBhbGxvY2F0ZSBhIHRsb2NrCisJICovCisJbGlkID0gdHhMb2NrQWxsb2MoKTsKKwl0bGNrID0gbGlkX3RvX3Rsb2NrKGxpZCk7CisKKwkvKgorCSAqIGluaXRpYWxpemUgdGxvY2sKKwkgKi8KKwl0bGNrLT50aWQgPSB0aWQ7CisKKwkvKiBiaW5kIHRoZSB0bG9jayBhbmQgdGhlIG9iamVjdCAqLworCXRsY2stPmZsYWcgPSB0bGNrSU5PREVMT0NLOworCXRsY2stPmlwID0gaXA7CisJdGxjay0+bXAgPSBOVUxMOworCisJdGxjay0+dHlwZSA9IHR5cGU7CisKKwkvKgorCSAqIGVucXVldWUgdHJhbnNhY3Rpb24gbG9jayB0byB0cmFuc2FjdGlvbi9pbm9kZQorCSAqLworCS8qIGluc2VydCB0aGUgdGxvY2sgYXQgdGFpbCBvZiB0cmFuc2FjdGlvbiB0bG9jayBsaXN0ICovCisJaWYgKHRpZCkgeworCQl0YmxrID0gdGlkX3RvX3RibG9jayh0aWQpOworCQlpZiAodGJsay0+bmV4dCkKKwkJCWxpZF90b190bG9jayh0YmxrLT5sYXN0KS0+bmV4dCA9IGxpZDsKKwkJZWxzZQorCQkJdGJsay0+bmV4dCA9IGxpZDsKKwkJdGxjay0+bmV4dCA9IDA7CisJCXRibGstPmxhc3QgPSBsaWQ7CisJfQorCS8qIGFub255bW91cyB0cmFuc2FjdGlvbjoKKwkgKiBpbnNlcnQgdGhlIHRsb2NrIGF0IGhlYWQgb2YgaW5vZGUgYW5vbnltb3VzIHRsb2NrIGxpc3QKKwkgKi8KKwllbHNlIHsKKwkJdGxjay0+bmV4dCA9IGpmc19pcC0+YXRsaGVhZDsKKwkJamZzX2lwLT5hdGxoZWFkID0gbGlkOworCQlpZiAodGxjay0+bmV4dCA9PSAwKSB7CisJCQkvKiBUaGlzIGlub2RlJ3MgZmlyc3QgYW5vbnltb3VzIHRyYW5zYWN0aW9uICovCisJCQlqZnNfaXAtPmF0bHRhaWwgPSBsaWQ7CisJCQlsaXN0X2FkZF90YWlsKCZqZnNfaXAtPmFub25faW5vZGVfbGlzdCwKKwkJCQkgICAgICAmVHhBbmNob3IuYW5vbl9saXN0KTsKKwkJfQorCX0KKworCVRYTl9VTkxPQ0soKTsKKworCS8qIGluaXRpYWxpemUgdHlwZSBkZXBlbmRlbnQgYXJlYSBmb3IgbWFwbG9jayAqLworCW1hcGxvY2sgPSAoc3RydWN0IG1hcGxvY2sgKikgJiB0bGNrLT5sb2NrOworCW1hcGxvY2stPm5leHQgPSAwOworCW1hcGxvY2stPm1heGNudCA9IDA7CisJbWFwbG9jay0+aW5kZXggPSAwOworCisJcmV0dXJuIHRsY2s7Cit9CisKKworLyoKKyAqICAgICAgdHhMaW5lbG9jaygpCisgKgorICogZnVuY3Rpb246IGFsbG9jYXRlIGEgdHJhbnNhY3Rpb24gbG9jayBmb3IgbG9nIHZlY3RvciBsaXN0CisgKi8KK3N0cnVjdCBsaW5lbG9jayAqdHhMaW5lbG9jayhzdHJ1Y3QgbGluZWxvY2sgKiB0bG9jaykKK3sKKwlsaWRfdCBsaWQ7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBsaW5lbG9jayAqbGluZWxvY2s7CisKKwlUWE5fTE9DSygpOworCisJLyogYWxsb2NhdGUgYSBUeExvY2sgc3RydWN0dXJlICovCisJbGlkID0gdHhMb2NrQWxsb2MoKTsKKwl0bGNrID0gbGlkX3RvX3Rsb2NrKGxpZCk7CisKKwlUWE5fVU5MT0NLKCk7CisKKwkvKiBpbml0aWFsaXplIGxpbmVsb2NrICovCisJbGluZWxvY2sgPSAoc3RydWN0IGxpbmVsb2NrICopIHRsY2s7CisJbGluZWxvY2stPm5leHQgPSAwOworCWxpbmVsb2NrLT5mbGFnID0gdGxja0xJTkVMT0NLOworCWxpbmVsb2NrLT5tYXhjbnQgPSBUTE9DS0xPTkc7CisJbGluZWxvY2stPmluZGV4ID0gMDsKKworCS8qIGFwcGVuZCBsaW5lbG9jayBhZnRlciB0bG9jayAqLworCWxpbmVsb2NrLT5uZXh0ID0gdGxvY2stPm5leHQ7CisJdGxvY2stPm5leHQgPSBsaWQ7CisKKwlyZXR1cm4gbGluZWxvY2s7Cit9CisKKworCisvKgorICogICAgICAgICAgICAgIHRyYW5zYWN0aW9uIGNvbW1pdCBtYW5hZ2VtZW50CisgKiAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogTkFNRTogICAgICAgIHR4Q29tbWl0KCkKKyAqCisgKiBGVU5DVElPTjogICAgY29tbWl0IHRoZSBjaGFuZ2VzIHRvIHRoZSBvYmplY3RzIHNwZWNpZmllZCBpbgorICogICAgICAgICAgICAgIGNsaXN0LiAgRm9yIGpvdXJuYWxsZWQgc2VnbWVudHMgb25seSB0aGUKKyAqICAgICAgICAgICAgICBjaGFuZ2VzIG9mIHRoZSBjYWxsZXIgYXJlIGNvbW1pdHRlZCwgaWUgYnkgdGlkLgorICogICAgICAgICAgICAgIGZvciBub24tam91cm5hbGxlZCBzZWdtZW50cyB0aGUgZGF0YSBhcmUgZmx1c2hlZCB0bworICogICAgICAgICAgICAgIGRpc2sgYW5kIHRoZW4gdGhlIGNoYW5nZSB0byB0aGUgZGlzayBpbm9kZSBhbmQgaW5kaXJlY3QKKyAqICAgICAgICAgICAgICBibG9ja3MgY29tbWl0dGVkIChzbyBibG9ja3MgbmV3bHkgYWxsb2NhdGVkIHRvIHRoZQorICogICAgICAgICAgICAgIHNlZ21lbnQgd2lsbCBiZSBtYWRlIGEgcGFydCBvZiB0aGUgc2VnbWVudCBhdG9taWNhbGx5KS4KKyAqCisgKiAgICAgICAgICAgICAgYWxsIG9mIHRoZSBzZWdtZW50cyBzcGVjaWZpZWQgaW4gY2xpc3QgbXVzdCBiZSBpbgorICogICAgICAgICAgICAgIG9uZSBmaWxlIHN5c3RlbS4gbm8gbW9yZSB0aGFuIDYgc2VnbWVudHMgYXJlIG5lZWRlZAorICogICAgICAgICAgICAgIHRvIGhhbmRsZSBhbGwgdW5peCBzdmNzLgorICoKKyAqICAgICAgICAgICAgICBpZiB0aGUgaV9ubGluayBmaWVsZCAoaS5lLiBkaXNrIGlub2RlIGxpbmsgY291bnQpCisgKiAgICAgICAgICAgICAgaXMgemVybywgYW5kIHRoZSB0eXBlIG9mIGlub2RlIGlzIGEgcmVndWxhciBmaWxlIG9yCisgKiAgICAgICAgICAgICAgZGlyZWN0b3J5LCBvciBzeW1ib2xpYyBsaW5rICwgdGhlIGlub2RlIGlzIHRydW5jYXRlZAorICogICAgICAgICAgICAgIHRvIHplcm8gbGVuZ3RoLiB0aGUgdHJ1bmNhdGlvbiBpcyBjb21taXR0ZWQgYnV0IHRoZQorICogICAgICAgICAgICAgIFZNIHJlc291cmNlcyBhcmUgdW5hZmZlY3RlZCB1bnRpbCBpdCBpcyBjbG9zZWQgKHNlZQorICogICAgICAgICAgICAgIGlwdXQgYW5kIGljbG9zZSkuCisgKgorICogUEFSQU1FVEVSOgorICoKKyAqIFJFVFVSTjoKKyAqCisgKiBzZXJpYWxpemF0aW9uOgorICogICAgICAgICAgICAgIG9uIGVudHJ5IHRoZSBpbm9kZSBsb2NrIG9uIGVhY2ggc2VnbWVudCBpcyBhc3N1bWVkCisgKiAgICAgICAgICAgICAgdG8gYmUgaGVsZC4KKyAqCisgKiBpL28gZXJyb3I6CisgKi8KK2ludCB0eENvbW1pdCh0aWRfdCB0aWQsCQkvKiB0cmFuc2FjdGlvbiBpZGVudGlmaWVyICovCisJICAgICBpbnQgbmlwLAkJLyogbnVtYmVyIG9mIGlub2RlcyB0byBjb21taXQgKi8KKwkgICAgIHN0cnVjdCBpbm9kZSAqKmlwbGlzdCwJLyogbGlzdCBvZiBpbm9kZSB0byBjb21taXQgKi8KKwkgICAgIGludCBmbGFnKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGNvbW1pdCBjZDsKKwlzdHJ1Y3QgamZzX2xvZyAqbG9nOworCXN0cnVjdCB0YmxvY2sgKnRibGs7CisJc3RydWN0IGxyZCAqbHJkOworCWludCBsc247CisJc3RydWN0IGlub2RlICppcDsKKwlzdHJ1Y3QgamZzX2lub2RlX2luZm8gKmpmc19pcDsKKwlpbnQgaywgbjsKKwlpbm9fdCB0b3A7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKworCWpmc19pbmZvKCJ0eENvbW1pdCwgdGlkID0gJWQsIGZsYWcgPSAlZCIsIHRpZCwgZmxhZyk7CisJLyogaXMgcmVhZC1vbmx5IGZpbGUgc3lzdGVtID8gKi8KKwlpZiAoaXNSZWFkT25seShpcGxpc3RbMF0pKSB7CisJCXJjID0gLUVST0ZTOworCQlnb3RvIFRoZUVuZDsKKwl9CisKKwlzYiA9IGNkLnNiID0gaXBsaXN0WzBdLT5pX3NiOworCWNkLnRpZCA9IHRpZDsKKworCWlmICh0aWQgPT0gMCkKKwkJdGlkID0gdHhCZWdpbihzYiwgMCk7CisJdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKKworCS8qCisJICogaW5pdGlhbGl6ZSBjb21taXQgc3RydWN0dXJlCisJICovCisJbG9nID0gSkZTX1NCSShzYiktPmxvZzsKKwljZC5sb2cgPSBsb2c7CisKKwkvKiBpbml0aWFsaXplIGxvZyByZWNvcmQgZGVzY3JpcHRvciBpbiBjb21taXQgKi8KKwlscmQgPSAmY2QubHJkOworCWxyZC0+bG9ndGlkID0gY3B1X3RvX2xlMzIodGJsay0+bG9ndGlkKTsKKwlscmQtPmJhY2tjaGFpbiA9IDA7CisKKwl0YmxrLT54ZmxhZyB8PSBmbGFnOworCisJaWYgKChmbGFnICYgKENPTU1JVF9GT1JDRSB8IENPTU1JVF9TWU5DKSkgPT0gMCkKKwkJdGJsay0+eGZsYWcgfD0gQ09NTUlUX0xBWlk7CisJLyoKKwkgKiAgICAgIHByZXBhcmUgbm9uLWpvdXJuYWxlZCBvYmplY3RzIGZvciBjb21taXQKKwkgKgorCSAqIGZsdXNoIGRhdGEgcGFnZXMgb2Ygbm9uLWpvdXJuYWxlZCBmaWxlCisJICogdG8gcHJldmVudCB0aGUgZmlsZSBnZXR0aW5nIG5vbi1pbml0aWFsaXplZCBkaXNrIGJsb2NrcworCSAqIGluIGNhc2Ugb2YgY3Jhc2guCisJICogKG5ldyBibG9ja3MgLSApCisJICovCisJY2QuaXBsaXN0ID0gaXBsaXN0OworCWNkLm5pcCA9IG5pcDsKKworCS8qCisJICogICAgICBhY3F1aXJlIHRyYW5zYWN0aW9uIGxvY2sgb24gKG9uLWRpc2spIGlub2RlcworCSAqCisJICogdXBkYXRlIG9uLWRpc2sgaW5vZGUgZnJvbSBpbi1tZW1vcnkgaW5vZGUKKwkgKiBhY3F1aXJpbmcgdHJhbnNhY3Rpb24gbG9ja3MgZm9yIEFGVEVSIHJlY29yZHMKKwkgKiBvbiB0aGUgb24tZGlzayBpbm9kZSBvZiBmaWxlIG9iamVjdAorCSAqCisJICogc29ydCB0aGUgaW5vZGVzIGFycmF5IGJ5IGlub2RlIG51bWJlciBpbiBkZXNjZW5kaW5nIG9yZGVyCisJICogdG8gcHJldmVudCBkZWFkbG9jayB3aGVuIGFjcXVpcmluZyB0cmFuc2FjdGlvbiBsb2NrCisJICogb2Ygb24tZGlzayBpbm9kZXMgb24gbXVsdGlwbGUgb24tZGlzayBpbm9kZSBwYWdlcyBieQorCSAqIG11bHRpcGxlIGNvbmN1cnJlbnQgdHJhbnNhY3Rpb25zCisJICovCisJZm9yIChrID0gMDsgayA8IGNkLm5pcDsgaysrKSB7CisJCXRvcCA9IChjZC5pcGxpc3Rba10pLT5pX2lubzsKKwkJZm9yIChuID0gayArIDE7IG4gPCBjZC5uaXA7IG4rKykgeworCQkJaXAgPSBjZC5pcGxpc3Rbbl07CisJCQlpZiAoaXAtPmlfaW5vID4gdG9wKSB7CisJCQkJdG9wID0gaXAtPmlfaW5vOworCQkJCWNkLmlwbGlzdFtuXSA9IGNkLmlwbGlzdFtrXTsKKwkJCQljZC5pcGxpc3Rba10gPSBpcDsKKwkJCX0KKwkJfQorCisJCWlwID0gY2QuaXBsaXN0W2tdOworCQlqZnNfaXAgPSBKRlNfSVAoaXApOworCisJCS8qCisJCSAqIEJVR0JVRyAtIFRoaXMgY29kZSBoYXMgdGVtcG9yYXJpbHkgYmVlbiByZW1vdmVkLiAgVGhlCisJCSAqIGludGVudCBpcyB0byBlbnN1cmUgdGhhdCBhbnkgZmlsZSBkYXRhIGlzIHdyaXR0ZW4gYmVmb3JlCisJCSAqIHRoZSBtZXRhZGF0YSBpcyBjb21taXR0ZWQgdG8gdGhlIGpvdXJuYWwuICBUaGlzIHByZXZlbnRzCisJCSAqIHVuaW5pdGlhbGl6ZWQgZGF0YSBmcm9tIGFwcGVhcmluZyBpbiBhIGZpbGUgYWZ0ZXIgdGhlCisJCSAqIGpvdXJuYWwgaGFzIGJlZW4gcmVwbGF5ZWQuICAoVGhlIHVuaW5pdGlhbGl6ZWQgZGF0YQorCQkgKiBjb3VsZCBiZSBzZW5zaXRpdmUgZGF0YSByZW1vdmVkIGJ5IGFub3RoZXIgdXNlci4pCisJCSAqCisJCSAqIFRoZSBwcm9ibGVtIG5vdyBpcyB0aGF0IHdlIGFyZSBob2xkaW5nIHRoZSBJV1JJVEVMT0NLCisJCSAqIG9uIHRoZSBpbm9kZSwgYW5kIGNhbGxpbmcgZmlsZW1hcF9mZGF0YXdyaXRlIG9uIGFuCisJCSAqIHVubWFwcGVkIHBhZ2Ugd2lsbCBjYXVzZSBhIGRlYWRsb2NrIGluIGpmc19nZXRfYmxvY2suCisJCSAqCisJCSAqIFRoZSBsb25nIHRlcm0gc29sdXRpb24gaXMgdG8gcGFyZSBkb3duIHRoZSB1c2Ugb2YKKwkJICogSVdSSVRFTE9DSy4gIFdlIGFyZSBjdXJyZW50bHkgaG9sZGluZyBpdCB0b28gbG9uZy4KKwkJICogV2UgY291bGQgYWxzbyBiZSBzbWFydGVyIGFib3V0IHdoaWNoIGRhdGEgcGFnZXMgbmVlZAorCQkgKiB0byBiZSB3cml0dGVuIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkIGFuZAorCQkgKiB3aGVuIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgaXQgYXQgYWxsLgorCQkgKgorCQkgKiBpZiAoKCFTX0lTRElSKGlwLT5pX21vZGUpKQorCQkgKiAgICAmJiAodGJsay0+ZmxhZyAmIENPTU1JVF9ERUxFVEUpID09IDApIHsKKwkJICoJZmlsZW1hcF9mZGF0YXdyaXRlKGlwLT5pX21hcHBpbmcpOworCQkgKglmaWxlbWFwX2ZkYXRhd2FpdChpcC0+aV9tYXBwaW5nKTsKKwkJICogfQorCQkgKi8KKworCQkvKgorCQkgKiBNYXJrIGlub2RlIGFzIG5vdCBkaXJ0eS4gIEl0IHdpbGwgc3RpbGwgYmUgb24gdGhlIGRpcnR5CisJCSAqIGlub2RlIGxpc3QsIGJ1dCB3ZSdsbCBrbm93IG5vdCB0byBjb21taXQgaXQgYWdhaW4gdW5sZXNzCisJCSAqIGl0IGdldHMgbWFya2VkIGRpcnR5IGFnYWluCisJCSAqLworCQljbGVhcl9jZmxhZyhDT01NSVRfRGlydHksIGlwKTsKKworCQkvKiBpbmhlcml0IGFub255bW91cyB0bG9jayhzKSBvZiBpbm9kZSAqLworCQlpZiAoamZzX2lwLT5hdGxoZWFkKSB7CisJCQlsaWRfdG9fdGxvY2soamZzX2lwLT5hdGx0YWlsKS0+bmV4dCA9IHRibGstPm5leHQ7CisJCQl0YmxrLT5uZXh0ID0gamZzX2lwLT5hdGxoZWFkOworCQkJaWYgKCF0YmxrLT5sYXN0KQorCQkJCXRibGstPmxhc3QgPSBqZnNfaXAtPmF0bHRhaWw7CisJCQlqZnNfaXAtPmF0bGhlYWQgPSBqZnNfaXAtPmF0bHRhaWwgPSAwOworCQkJVFhOX0xPQ0soKTsKKwkJCWxpc3RfZGVsX2luaXQoJmpmc19pcC0+YW5vbl9pbm9kZV9saXN0KTsKKwkJCVRYTl9VTkxPQ0soKTsKKwkJfQorCisJCS8qCisJCSAqIGFjcXVpcmUgdHJhbnNhY3Rpb24gbG9jayBvbiBvbi1kaXNrIGlub2RlIHBhZ2UKKwkJICogKGJlY29tZSBmaXJzdCB0bG9jayBvZiB0aGUgdGJsaydzIHRsb2NrIGxpc3QpCisJCSAqLworCQlpZiAoKChyYyA9IGRpV3JpdGUodGlkLCBpcCkpKSkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogICAgICB3cml0ZSBsb2cgcmVjb3JkcyBmcm9tIHRyYW5zYWN0aW9uIGxvY2tzCisJICoKKwkgKiB0eFVwZGF0ZU1hcCgpIHJlc2V0cyBYQURfTkVXIGluIFhBRC4KKwkgKi8KKwlpZiAoKHJjID0gdHhMb2cobG9nLCB0YmxrLCAmY2QpKSkKKwkJZ290byBUaGVFbmQ7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IGlub2RlIGlzbid0IHJldXNlZCBiZWZvcmUKKwkgKiBsYXp5IGNvbW1pdCB0aHJlYWQgZmluaXNoZXMgcHJvY2Vzc2luZworCSAqLworCWlmICh0YmxrLT54ZmxhZyAmIENPTU1JVF9ERUxFVEUpIHsKKwkJYXRvbWljX2luYygmdGJsay0+dS5pcC0+aV9jb3VudCk7CisJCS8qCisJCSAqIEF2b2lkIGEgcmFyZSBkZWFkbG9jaworCQkgKgorCQkgKiBJZiB0aGUgaW5vZGUgaXMgbG9ja2VkLCB3ZSBtYXkgYmUgYmxvY2tlZCBpbgorCQkgKiBqZnNfY29tbWl0X2lub2RlLiAgSWYgc28sIHdlIGRvbid0IHdhbnQgdGhlCisJCSAqIGxhenlfY29tbWl0IHRocmVhZCBkb2luZyB0aGUgbGFzdCBpcHV0KCkgb24gdGhlIGlub2RlCisJCSAqIHNpbmNlIHRoYXQgbWF5IGJsb2NrIG9uIHRoZSBsb2NrZWQgaW5vZGUuICBJbnN0ZWFkLAorCQkgKiBjb21taXQgdGhlIHRyYW5zYWN0aW9uIHN5bmNocm9ub3VzbHksIHNvIHRoZSBsYXN0IGlwdXQKKwkJICogd2lsbCBiZSBkb25lIGJ5IHRoZSBjYWxsaW5nIHRocmVhZCAob3IgbGF0ZXIpCisJCSAqLworCQlpZiAodGJsay0+dS5pcC0+aV9zdGF0ZSAmIElfTE9DSykKKwkJCXRibGstPnhmbGFnICY9IH5DT01NSVRfTEFaWTsKKwl9CisKKwlBU1NFUlQoKCEodGJsay0+eGZsYWcgJiBDT01NSVRfREVMRVRFKSkgfHwKKwkgICAgICAgKCh0YmxrLT51LmlwLT5pX25saW5rID09IDApICYmCisJCSF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIHRibGstPnUuaXApKSk7CisKKwkvKgorCSAqICAgICAgd3JpdGUgQ09NTUlUIGxvZyByZWNvcmQKKwkgKi8KKwlscmQtPnR5cGUgPSBjcHVfdG9fbGUxNihMT0dfQ09NTUlUKTsKKwlscmQtPmxlbmd0aCA9IDA7CisJbHNuID0gbG1Mb2cobG9nLCB0YmxrLCBscmQsIE5VTEwpOworCisJbG1Hcm91cENvbW1pdChsb2csIHRibGspOworCisJLyoKKwkgKiAgICAgIC0gdHJhbnNhY3Rpb24gaXMgbm93IGNvbW1pdHRlZCAtCisJICovCisKKwkvKgorCSAqIGZvcmNlIHBhZ2VzIGluIGNhcmVmdWwgdXBkYXRlCisJICogKGltYXAgYWRkcmVzc2luZyBzdHJ1Y3R1cmUgdXBkYXRlKQorCSAqLworCWlmIChmbGFnICYgQ09NTUlUX0ZPUkNFKQorCQl0eEZvcmNlKHRibGspOworCisJLyoKKwkgKiAgICAgIHVwZGF0ZSBhbGxvY2F0aW9uIG1hcC4KKwkgKgorCSAqIHVwZGF0ZSBpbm9kZSBhbGxvY2F0aW9uIG1hcCBhbmQgaW5vZGU6CisJICogZnJlZSBwYWdlciBsb2NrIG9uIG1lbW9yeSBvYmplY3Qgb2YgaW5vZGUgaWYgYW55LgorCSAqIHVwZGF0ZSAgYmxvY2sgYWxsb2NhdGlvbiBtYXAuCisJICoKKwkgKiB0eFVwZGF0ZU1hcCgpIHJlc2V0cyBYQURfTkVXIGluIFhBRC4KKwkgKi8KKwlpZiAodGJsay0+eGZsYWcgJiBDT01NSVRfRk9SQ0UpCisJCXR4VXBkYXRlTWFwKHRibGspOworCisJLyoKKwkgKiAgICAgIGZyZWUgdHJhbnNhY3Rpb24gbG9ja3MgYW5kIHBhZ2VvdXQvZnJlZSBwYWdlcworCSAqLworCXR4UmVsZWFzZSh0YmxrKTsKKworCWlmICgodGJsay0+ZmxhZyAmIHRibGtHQ19MQVpZKSA9PSAwKQorCQl0eFVubG9jayh0YmxrKTsKKworCisJLyoKKwkgKiAgICAgIHJlc2V0IGluLW1lbW9yeSBvYmplY3Qgc3RhdGUKKwkgKi8KKwlmb3IgKGsgPSAwOyBrIDwgY2QubmlwOyBrKyspIHsKKwkJaXAgPSBjZC5pcGxpc3Rba107CisJCWpmc19pcCA9IEpGU19JUChpcCk7CisKKwkJLyoKKwkJICogcmVzZXQgaW4tbWVtb3J5IGlub2RlIHN0YXRlCisJCSAqLworCQlqZnNfaXAtPmJ4ZmxhZyA9IDA7CisJCWpmc19pcC0+YmxpZCA9IDA7CisJfQorCisgICAgICBvdXQ6CisJaWYgKHJjICE9IDApCisJCXR4QWJvcnQodGlkLCAxKTsKKworICAgICAgVGhlRW5kOgorCWpmc19pbmZvKCJ0eENvbW1pdDogdGlkID0gJWQsIHJldHVybmluZyAlZCIsIHRpZCwgcmMpOworCXJldHVybiByYzsKK30KKworCisvKgorICogTkFNRTogICAgICAgIHR4TG9nKCkKKyAqCisgKiBGVU5DVElPTjogICAgV3JpdGVzIEFGVEVSIGxvZyByZWNvcmRzIGZvciBhbGwgbGluZXMgbW9kaWZpZWQKKyAqICAgICAgICAgICAgICBieSB0aWQgZm9yIHNlZ21lbnRzIHNwZWNpZmllZCBieSBpbm9kZXMgaW4gY29tZGF0YS4KKyAqICAgICAgICAgICAgICBDb2RlIGFzc3VtZXMgb25seSBXUklURUxPQ0tTIGFyZSByZWNvcmRlZCBpbiBsb2Nrd29yZHMuCisgKgorICogUEFSQU1FVEVSUzoKKyAqCisgKiBSRVRVUk4gOgorICovCitzdGF0aWMgaW50IHR4TG9nKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgdGJsb2NrICogdGJsaywgc3RydWN0IGNvbW1pdCAqIGNkKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGlub2RlICppcDsKKwlsaWRfdCBsaWQ7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBscmQgKmxyZCA9ICZjZC0+bHJkOworCisJLyoKKwkgKiB3cml0ZSBsb2cgcmVjb3JkKHMpIGZvciBlYWNoIHRsb2NrIG9mIHRyYW5zYWN0aW9uLAorCSAqLworCWZvciAobGlkID0gdGJsay0+bmV4dDsgbGlkOyBsaWQgPSB0bGNrLT5uZXh0KSB7CisJCXRsY2sgPSBsaWRfdG9fdGxvY2sobGlkKTsKKworCQl0bGNrLT5mbGFnIHw9IHRsY2tMT0c7CisKKwkJLyogaW5pdGlhbGl6ZSBscmQgY29tbW9uICovCisJCWlwID0gdGxjay0+aXA7CisJCWxyZC0+YWdncmVnYXRlID0gY3B1X3RvX2xlMzIoSkZTX1NCSShpcC0+aV9zYiktPmFnZ3JlZ2F0ZSk7CisJCWxyZC0+bG9nLnJlZG9wYWdlLmZpbGVzZXQgPSBjcHVfdG9fbGUzMihKRlNfSVAoaXApLT5maWxlc2V0KTsKKwkJbHJkLT5sb2cucmVkb3BhZ2UuaW5vZGUgPSBjcHVfdG9fbGUzMihpcC0+aV9pbm8pOworCisJCS8qIHdyaXRlIGxvZyByZWNvcmQgb2YgcGFnZSBmcm9tIHRoZSB0bG9jayAqLworCQlzd2l0Y2ggKHRsY2stPnR5cGUgJiB0bGNrVFlQRSkgeworCQljYXNlIHRsY2tYVFJFRToKKwkJCXh0TG9nKGxvZywgdGJsaywgbHJkLCB0bGNrKTsKKwkJCWJyZWFrOworCisJCWNhc2UgdGxja0RUUkVFOgorCQkJZHRMb2cobG9nLCB0YmxrLCBscmQsIHRsY2spOworCQkJYnJlYWs7CisKKwkJY2FzZSB0bGNrSU5PREU6CisJCQlkaUxvZyhsb2csIHRibGssIGxyZCwgdGxjaywgY2QpOworCQkJYnJlYWs7CisKKwkJY2FzZSB0bGNrTUFQOgorCQkJbWFwTG9nKGxvZywgdGJsaywgbHJkLCB0bGNrKTsKKwkJCWJyZWFrOworCisJCWNhc2UgdGxja0RBVEE6CisJCQlkYXRhTG9nKGxvZywgdGJsaywgbHJkLCB0bGNrKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlqZnNfZXJyKCJVRk8gdGxvY2s6MHglcCIsIHRsY2spOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKiAgICAgIGRpTG9nKCkKKyAqCisgKiBmdW5jdGlvbjogICAgbG9nIGlub2RlIHRsb2NrIGFuZCBmb3JtYXQgbWFwbG9jayB0byB1cGRhdGUgYm1hcDsKKyAqLworc3RhdGljIGludCBkaUxvZyhzdHJ1Y3QgamZzX2xvZyAqIGxvZywgc3RydWN0IHRibG9jayAqIHRibGssIHN0cnVjdCBscmQgKiBscmQsCisJICBzdHJ1Y3QgdGxvY2sgKiB0bGNrLCBzdHJ1Y3QgY29tbWl0ICogY2QpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXB4ZF90ICpweGQ7CisJc3RydWN0IHB4ZF9sb2NrICpweGRsb2NrOworCisJbXAgPSB0bGNrLT5tcDsKKworCS8qIGluaXRpYWxpemUgYXMgUkVET1BBR0UgcmVjb3JkIGZvcm1hdCAqLworCWxyZC0+bG9nLnJlZG9wYWdlLnR5cGUgPSBjcHVfdG9fbGUxNihMT0dfSU5PREUpOworCWxyZC0+bG9nLnJlZG9wYWdlLmwybGluZXNpemUgPSBjcHVfdG9fbGUxNihMMklOT0RFU0xPVFNJWkUpOworCisJcHhkID0gJmxyZC0+bG9nLnJlZG9wYWdlLnB4ZDsKKworCS8qCisJICogICAgICBpbm9kZSBhZnRlciBpbWFnZQorCSAqLworCWlmICh0bGNrLT50eXBlICYgdGxja0VOVFJZKSB7CisJCS8qIGxvZyBhZnRlci1pbWFnZSBmb3IgbG9ncmVkbygpOiAqLworCQlscmQtPnR5cGUgPSBjcHVfdG9fbGUxNihMT0dfUkVET1BBR0UpOworLy8gICAgICAgICAgICAgICpweGQgPSBtcC0+Y21fcHhkOworCQlQWERhZGRyZXNzKHB4ZCwgbXAtPmluZGV4KTsKKwkJUFhEbGVuZ3RoKHB4ZCwKKwkJCSAgbXAtPmxvZ2ljYWxfc2l6ZSA+PiB0YmxrLT5zYi0+c19ibG9ja3NpemVfYml0cyk7CisJCWxyZC0+YmFja2NoYWluID0gY3B1X3RvX2xlMzIobG1Mb2cobG9nLCB0YmxrLCBscmQsIHRsY2spKTsKKworCQkvKiBtYXJrIHBhZ2UgYXMgaG9tZXdhcmQgYm91bmQgKi8KKwkJdGxjay0+ZmxhZyB8PSB0bGNrV1JJVEVQQUdFOworCX0gZWxzZSBpZiAodGxjay0+dHlwZSAmIHRsY2tGUkVFKSB7CisJCS8qCisJCSAqICAgICAgZnJlZSBpbm9kZSBleHRlbnQKKwkJICoKKwkJICogKHBhZ2VzIG9mIHRoZSBmcmVlZCBpbm9kZSBleHRlbnQgaGF2ZSBiZWVuIGludmFsaWRhdGVkIGFuZAorCQkgKiBhIG1hcGxvY2sgZm9yIGZyZWUgb2YgdGhlIGV4dGVudCBoYXMgYmVlbiBmb3JtYXR0ZWQgYXQKKwkJICogdHhMb2NrKCkgdGltZSk7CisJCSAqCisJCSAqIHRoZSB0bG9jayBoYWQgYmVlbiBhY3F1aXJlZCBvbiB0aGUgaW5vZGUgYWxsb2NhdGlvbiBtYXAgcGFnZQorCQkgKiAoaWFnKSB0aGF0IHNwZWNpZmllcyB0aGUgZnJlZWQgZXh0ZW50LCBldmVuIHRob3VnaCB0aGUgbWFwCisJCSAqIHBhZ2UgaXMgbm90IGl0c2VsZiBsb2dnZWQsIHRvIHByZXZlbnQgcGFnZW91dCBvZiB0aGUgbWFwCisJCSAqIHBhZ2UgYmVmb3JlIHRoZSBsb2c7CisJCSAqLworCisJCS8qIGxvZyBMT0dfTk9SRURPSU5PRVhUIG9mIHRoZSBmcmVlZCBpbm9kZSBleHRlbnQgZm9yCisJCSAqIGxvZ3JlZG8oKSB0byBzdGFydCBOb1JlZG9QYWdlIGZpbHRlcnMsIGFuZCB0byB1cGRhdGUKKwkJICogaW1hcCBhbmQgYm1hcCBmb3IgZnJlZSBvZiB0aGUgZXh0ZW50OworCQkgKi8KKwkJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX05PUkVET0lOT0VYVCk7CisJCS8qCisJCSAqIEZvciB0aGUgTE9HX05PUkVET0lOT0VYVCByZWNvcmQsIHdlIG5lZWQKKwkJICogdG8gcGFzcyB0aGUgSUFHIG51bWJlciBhbmQgaW5vZGUgZXh0ZW50CisJCSAqIGluZGV4ICh3aXRoaW4gdGhhdCBJQUcpIGZyb20gd2hpY2ggdGhlCisJCSAqIHRoZSBleHRlbnQgYmVpbmcgcmVsZWFzZWQuICBUaGVzZSBoYXZlIGJlZW4KKwkJICogcGFzc2VkIHRvIHVzIGluIHRoZSBpcGxpc3RbMV0gYW5kIGlwbGlzdFsyXS4KKwkJICovCisJCWxyZC0+bG9nLm5vcmVkb2lub2V4dC5pYWdudW0gPQorCQkgICAgY3B1X3RvX2xlMzIoKHUzMikgKHNpemVfdCkgY2QtPmlwbGlzdFsxXSk7CisJCWxyZC0+bG9nLm5vcmVkb2lub2V4dC5pbm9leHRfaWR4ID0KKwkJICAgIGNwdV90b19sZTMyKCh1MzIpIChzaXplX3QpIGNkLT5pcGxpc3RbMl0pOworCisJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopICYgdGxjay0+bG9jazsKKwkJKnB4ZCA9IHB4ZGxvY2stPnB4ZDsKKwkJbHJkLT5iYWNrY2hhaW4gPSBjcHVfdG9fbGUzMihsbUxvZyhsb2csIHRibGssIGxyZCwgTlVMTCkpOworCisJCS8qIHVwZGF0ZSBibWFwICovCisJCXRsY2stPmZsYWcgfD0gdGxja1VQREFURU1BUDsKKworCQkvKiBtYXJrIHBhZ2UgYXMgaG9tZXdhcmQgYm91bmQgKi8KKwkJdGxjay0+ZmxhZyB8PSB0bGNrV1JJVEVQQUdFOworCX0gZWxzZQorCQlqZnNfZXJyKCJkaUxvZzogVUZPIHR5cGUgdGxjazoweCVwIiwgdGxjayk7CisjaWZkZWYgIF9KRlNfV0lQCisJLyoKKwkgKiAgICAgIGFsbG9jL2ZyZWUgZXh0ZXJuYWwgRUEgZXh0ZW50CisJICoKKwkgKiBhIG1hcGxvY2sgZm9yIHR4VXBkYXRlTWFwKCkgdG8gdXBkYXRlIGJQV01BUCBmb3IgYWxsb2MvZnJlZQorCSAqIG9mIHRoZSBleHRlbnQgaGFzIGJlZW4gZm9ybWF0dGVkIGF0IHR4TG9jaygpIHRpbWU7CisJICovCisJZWxzZSB7CisJCWFzc2VydCh0bGNrLT50eXBlICYgdGxja0VBKTsKKworCQkvKiBsb2cgTE9HX1VQREFURU1BUCBmb3IgbG9ncmVkbygpIHRvIHVwZGF0ZSBibWFwIGZvcgorCQkgKiBhbGxvYyBvZiBuZXcgKGFuZCBmcmVlIG9mIG9sZCkgZXh0ZXJuYWwgRUEgZXh0ZW50OworCQkgKi8KKwkJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1VQREFURU1BUCk7CisJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopICYgdGxjay0+bG9jazsKKwkJbmxvY2sgPSBweGRsb2NrLT5pbmRleDsKKwkJZm9yIChpID0gMDsgaSA8IG5sb2NrOyBpKyssIHB4ZGxvY2srKykgeworCQkJaWYgKHB4ZGxvY2stPmZsYWcgJiBtbGNrQUxMT0NQWEQpCisJCQkJbHJkLT5sb2cudXBkYXRlbWFwLnR5cGUgPQorCQkJCSAgICBjcHVfdG9fbGUxNihMT0dfQUxMT0NQWEQpOworCQkJZWxzZQorCQkJCWxyZC0+bG9nLnVwZGF0ZW1hcC50eXBlID0KKwkJCQkgICAgY3B1X3RvX2xlMTYoTE9HX0ZSRUVQWEQpOworCQkJbHJkLT5sb2cudXBkYXRlbWFwLm54ZCA9IGNwdV90b19sZTE2KDEpOworCQkJbHJkLT5sb2cudXBkYXRlbWFwLnB4ZCA9IHB4ZGxvY2stPnB4ZDsKKwkJCWxyZC0+YmFja2NoYWluID0KKwkJCSAgICBjcHVfdG9fbGUzMihsbUxvZyhsb2csIHRibGssIGxyZCwgTlVMTCkpOworCQl9CisKKwkJLyogdXBkYXRlIGJtYXAgKi8KKwkJdGxjay0+ZmxhZyB8PSB0bGNrVVBEQVRFTUFQOworCX0KKyNlbmRpZgkJCQkvKiBfSkZTX1dJUCAqLworCisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKiAgICAgIGRhdGFMb2coKQorICoKKyAqIGZ1bmN0aW9uOiAgICBsb2cgZGF0YSB0bG9jaworICovCitzdGF0aWMgaW50IGRhdGFMb2coc3RydWN0IGpmc19sb2cgKiBsb2csIHN0cnVjdCB0YmxvY2sgKiB0YmxrLCBzdHJ1Y3QgbHJkICogbHJkLAorCSAgICBzdHJ1Y3QgdGxvY2sgKiB0bGNrKQoreworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJcHhkX3QgKnB4ZDsKKworCW1wID0gdGxjay0+bXA7CisKKwkvKiBpbml0aWFsaXplIGFzIFJFRE9QQUdFIHJlY29yZCBmb3JtYXQgKi8KKwlscmQtPmxvZy5yZWRvcGFnZS50eXBlID0gY3B1X3RvX2xlMTYoTE9HX0RBVEEpOworCWxyZC0+bG9nLnJlZG9wYWdlLmwybGluZXNpemUgPSBjcHVfdG9fbGUxNihMMkRBVEFTTE9UU0laRSk7CisKKwlweGQgPSAmbHJkLT5sb2cucmVkb3BhZ2UucHhkOworCisJLyogbG9nIGFmdGVyLWltYWdlIGZvciBsb2dyZWRvKCk6ICovCisJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1JFRE9QQUdFKTsKKworCWlmIChqZnNfZGlydGFibGVfaW5saW5lKHRsY2stPmlwKSkgeworCQkvKgorCQkgKiBUaGUgdGFibGUgaGFzIGJlZW4gdHJ1bmNhdGVkLCB3ZSd2ZSBtdXN0IGhhdmUgZGVsZXRlZAorCQkgKiB0aGUgbGFzdCBlbnRyeSwgc28gZG9uJ3QgYm90aGVyIGxvZ2dpbmcgdGhpcworCQkgKi8KKwkJbXAtPmxpZCA9IDA7CisJCWhvbGRfbWV0YXBhZ2UobXAsIDApOworCQlhdG9taWNfZGVjKCZtcC0+bm9ob21lb2spOworCQlkaXNjYXJkX21ldGFwYWdlKG1wKTsKKwkJdGxjay0+bXAgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisKKwlQWERhZGRyZXNzKHB4ZCwgbXAtPmluZGV4KTsKKwlQWERsZW5ndGgocHhkLCBtcC0+bG9naWNhbF9zaXplID4+IHRibGstPnNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKworCWxyZC0+YmFja2NoYWluID0gY3B1X3RvX2xlMzIobG1Mb2cobG9nLCB0YmxrLCBscmQsIHRsY2spKTsKKworCS8qIG1hcmsgcGFnZSBhcyBob21ld2FyZCBib3VuZCAqLworCXRsY2stPmZsYWcgfD0gdGxja1dSSVRFUEFHRTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiAgICAgIGR0TG9nKCkKKyAqCisgKiBmdW5jdGlvbjogICAgbG9nIGR0cmVlIHRsb2NrIGFuZCBmb3JtYXQgbWFwbG9jayB0byB1cGRhdGUgYm1hcDsKKyAqLworc3RhdGljIHZvaWQgZHRMb2coc3RydWN0IGpmc19sb2cgKiBsb2csIHN0cnVjdCB0YmxvY2sgKiB0YmxrLCBzdHJ1Y3QgbHJkICogbHJkLAorCSAgIHN0cnVjdCB0bG9jayAqIHRsY2spCit7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwlzdHJ1Y3QgcHhkX2xvY2sgKnB4ZGxvY2s7CisJcHhkX3QgKnB4ZDsKKworCW1wID0gdGxjay0+bXA7CisKKwkvKiBpbml0aWFsaXplIGFzIFJFRE9QQUdFL05PUkVET1BBR0UgcmVjb3JkIGZvcm1hdCAqLworCWxyZC0+bG9nLnJlZG9wYWdlLnR5cGUgPSBjcHVfdG9fbGUxNihMT0dfRFRSRUUpOworCWxyZC0+bG9nLnJlZG9wYWdlLmwybGluZXNpemUgPSBjcHVfdG9fbGUxNihMMkRUU0xPVFNJWkUpOworCisJcHhkID0gJmxyZC0+bG9nLnJlZG9wYWdlLnB4ZDsKKworCWlmICh0bGNrLT50eXBlICYgdGxja0JUUk9PVCkKKwkJbHJkLT5sb2cucmVkb3BhZ2UudHlwZSB8PSBjcHVfdG9fbGUxNihMT0dfQlRST09UKTsKKworCS8qCisJICogICAgICBwYWdlIGV4dGVuc2lvbiB2aWEgcmVsb2NhdGlvbjogZW50cnkgaW5zZXJ0aW9uOworCSAqICAgICAgcGFnZSBleHRlbnNpb24gaW4tcGxhY2U6IGVudHJ5IGluc2VydGlvbjsKKwkgKiAgICAgIG5ldyByaWdodCBwYWdlIGZyb20gcGFnZSBzcGxpdCwgcmVpbml0aWFsaXplZCBpbi1saW5lCisJICogICAgICByb290IGZyb20gcm9vdCBwYWdlIHNwbGl0OiBlbnRyeSBpbnNlcnRpb247CisJICovCisJaWYgKHRsY2stPnR5cGUgJiAodGxja05FVyB8IHRsY2tFWFRFTkQpKSB7CisJCS8qIGxvZyBhZnRlci1pbWFnZSBvZiB0aGUgbmV3IHBhZ2UgZm9yIGxvZ3JlZG8oKToKKwkJICogbWFyayBsb2cgKExPR19ORVcpIGZvciBsb2dyZWRvKCkgdG8gaW5pdGlhbGl6ZQorCQkgKiBmcmVlbGlzdCBhbmQgdXBkYXRlIGJtYXAgZm9yIGFsbG9jIG9mIHRoZSBuZXcgcGFnZTsKKwkJICovCisJCWxyZC0+dHlwZSA9IGNwdV90b19sZTE2KExPR19SRURPUEFHRSk7CisJCWlmICh0bGNrLT50eXBlICYgdGxja0VYVEVORCkKKwkJCWxyZC0+bG9nLnJlZG9wYWdlLnR5cGUgfD0gY3B1X3RvX2xlMTYoTE9HX0VYVEVORCk7CisJCWVsc2UKKwkJCWxyZC0+bG9nLnJlZG9wYWdlLnR5cGUgfD0gY3B1X3RvX2xlMTYoTE9HX05FVyk7CisvLyAgICAgICAgICAgICAgKnB4ZCA9IG1wLT5jbV9weGQ7CisJCVBYRGFkZHJlc3MocHhkLCBtcC0+aW5kZXgpOworCQlQWERsZW5ndGgocHhkLAorCQkJICBtcC0+bG9naWNhbF9zaXplID4+IHRibGstPnNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJbHJkLT5iYWNrY2hhaW4gPSBjcHVfdG9fbGUzMihsbUxvZyhsb2csIHRibGssIGxyZCwgdGxjaykpOworCisJCS8qIGZvcm1hdCBhIG1hcGxvY2sgZm9yIHR4VXBkYXRlTWFwKCkgdG8gdXBkYXRlIGJQTUFQIGZvcgorCQkgKiBhbGxvYyBvZiB0aGUgbmV3IHBhZ2U7CisJCSAqLworCQlpZiAodGxjay0+dHlwZSAmIHRsY2tCVFJPT1QpCisJCQlyZXR1cm47CisJCXRsY2stPmZsYWcgfD0gdGxja1VQREFURU1BUDsKKwkJcHhkbG9jayA9IChzdHJ1Y3QgcHhkX2xvY2sgKikgJiB0bGNrLT5sb2NrOworCQlweGRsb2NrLT5mbGFnID0gbWxja0FMTE9DUFhEOworCQlweGRsb2NrLT5weGQgPSAqcHhkOworCisJCXB4ZGxvY2stPmluZGV4ID0gMTsKKworCQkvKiBtYXJrIHBhZ2UgYXMgaG9tZXdhcmQgYm91bmQgKi8KKwkJdGxjay0+ZmxhZyB8PSB0bGNrV1JJVEVQQUdFOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiAgICAgIGVudHJ5IGluc2VydGlvbi9kZWxldGlvbiwKKwkgKiAgICAgIHNpYmxpbmcgcGFnZSBsaW5rIHVwZGF0ZSAob2xkIHJpZ2h0IHBhZ2UgYmVmb3JlIHNwbGl0KTsKKwkgKi8KKwlpZiAodGxjay0+dHlwZSAmICh0bGNrRU5UUlkgfCB0bGNrUkVMSU5LKSkgeworCQkvKiBsb2cgYWZ0ZXItaW1hZ2UgZm9yIGxvZ3JlZG8oKTogKi8KKwkJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1JFRE9QQUdFKTsKKwkJUFhEYWRkcmVzcyhweGQsIG1wLT5pbmRleCk7CisJCVBYRGxlbmd0aChweGQsCisJCQkgIG1wLT5sb2dpY2FsX3NpemUgPj4gdGJsay0+c2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQlscmQtPmJhY2tjaGFpbiA9IGNwdV90b19sZTMyKGxtTG9nKGxvZywgdGJsaywgbHJkLCB0bGNrKSk7CisKKwkJLyogbWFyayBwYWdlIGFzIGhvbWV3YXJkIGJvdW5kICovCisJCXRsY2stPmZsYWcgfD0gdGxja1dSSVRFUEFHRTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogICAgICBwYWdlIGRlbGV0aW9uOiBwYWdlIGhhcyBiZWVuIGludmFsaWRhdGVkCisJICogICAgICBwYWdlIHJlbG9jYXRpb246IHNvdXJjZSBleHRlbnQKKwkgKgorCSAqICAgICAgYSBtYXBsb2NrIGZvciBmcmVlIG9mIHRoZSBwYWdlIGhhcyBiZWVuIGZvcm1hdHRlZAorCSAqICAgICAgYXQgdHhMb2NrKCkgdGltZSk7CisJICovCisJaWYgKHRsY2stPnR5cGUgJiAodGxja0ZSRUUgfCB0bGNrUkVMT0NBVEUpKSB7CisJCS8qIGxvZyBMT0dfTk9SRURPUEFHRSBvZiB0aGUgZGVsZXRlZCBwYWdlIGZvciBsb2dyZWRvKCkKKwkJICogdG8gc3RhcnQgTm9SZWRvUGFnZSBmaWx0ZXIgYW5kIHRvIHVwZGF0ZSBibWFwIGZvciBmcmVlCisJCSAqIG9mIHRoZSBkZWxldGQgcGFnZQorCQkgKi8KKwkJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX05PUkVET1BBR0UpOworCQlweGRsb2NrID0gKHN0cnVjdCBweGRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisJCSpweGQgPSBweGRsb2NrLT5weGQ7CisJCWxyZC0+YmFja2NoYWluID0gY3B1X3RvX2xlMzIobG1Mb2cobG9nLCB0YmxrLCBscmQsIE5VTEwpKTsKKworCQkvKiBhIG1hcGxvY2sgZm9yIHR4VXBkYXRlTWFwKCkgZm9yIGZyZWUgb2YgdGhlIHBhZ2UKKwkJICogaGFzIGJlZW4gZm9ybWF0dGVkIGF0IHR4TG9jaygpIHRpbWU7CisJCSAqLworCQl0bGNrLT5mbGFnIHw9IHRsY2tVUERBVEVNQVA7CisJfQorCXJldHVybjsKK30KKworCisvKgorICogICAgICB4dExvZygpCisgKgorICogZnVuY3Rpb246ICAgIGxvZyB4dHJlZSB0bG9jayBhbmQgZm9ybWF0IG1hcGxvY2sgdG8gdXBkYXRlIGJtYXA7CisgKi8KK3N0YXRpYyB2b2lkIHh0TG9nKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgdGJsb2NrICogdGJsaywgc3RydWN0IGxyZCAqIGxyZCwKKwkgICBzdHJ1Y3QgdGxvY2sgKiB0bGNrKQoreworCXN0cnVjdCBpbm9kZSAqaXA7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwl4dHBhZ2VfdCAqcDsKKwlzdHJ1Y3QgeHRsb2NrICp4dGxjazsKKwlzdHJ1Y3QgbWFwbG9jayAqbWFwbG9jazsKKwlzdHJ1Y3QgeGRsaXN0bG9jayAqeGFkbG9jazsKKwlzdHJ1Y3QgcHhkX2xvY2sgKnB4ZGxvY2s7CisJcHhkX3QgKnB4ZDsKKwlpbnQgbmV4dCwgbHdtLCBod207CisKKwlpcCA9IHRsY2stPmlwOworCW1wID0gdGxjay0+bXA7CisKKwkvKiBpbml0aWFsaXplIGFzIFJFRE9QQUdFL05PUkVET1BBR0UgcmVjb3JkIGZvcm1hdCAqLworCWxyZC0+bG9nLnJlZG9wYWdlLnR5cGUgPSBjcHVfdG9fbGUxNihMT0dfWFRSRUUpOworCWxyZC0+bG9nLnJlZG9wYWdlLmwybGluZXNpemUgPSBjcHVfdG9fbGUxNihMMlhUU0xPVFNJWkUpOworCisJcHhkID0gJmxyZC0+bG9nLnJlZG9wYWdlLnB4ZDsKKworCWlmICh0bGNrLT50eXBlICYgdGxja0JUUk9PVCkgeworCQlscmQtPmxvZy5yZWRvcGFnZS50eXBlIHw9IGNwdV90b19sZTE2KExPR19CVFJPT1QpOworCQlwID0gJkpGU19JUChpcCktPmlfeHRyb290OworCQlpZiAoU19JU0RJUihpcC0+aV9tb2RlKSkKKwkJCWxyZC0+bG9nLnJlZG9wYWdlLnR5cGUgfD0KKwkJCSAgICBjcHVfdG9fbGUxNihMT0dfRElSX1hUUkVFKTsKKwl9IGVsc2UKKwkJcCA9ICh4dHBhZ2VfdCAqKSBtcC0+ZGF0YTsKKwluZXh0ID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCk7CisKKwl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopICYgdGxjay0+bG9jazsKKworCW1hcGxvY2sgPSAoc3RydWN0IG1hcGxvY2sgKikgJiB0bGNrLT5sb2NrOworCXhhZGxvY2sgPSAoc3RydWN0IHhkbGlzdGxvY2sgKikgbWFwbG9jazsKKworCS8qCisJICogICAgICBlbnRyeSBpbnNlcnRpb24vZXh0ZW5zaW9uOworCSAqICAgICAgc2libGluZyBwYWdlIGxpbmsgdXBkYXRlIChvbGQgcmlnaHQgcGFnZSBiZWZvcmUgc3BsaXQpOworCSAqLworCWlmICh0bGNrLT50eXBlICYgKHRsY2tORVcgfCB0bGNrR1JPVyB8IHRsY2tSRUxJTkspKSB7CisJCS8qIGxvZyBhZnRlci1pbWFnZSBmb3IgbG9ncmVkbygpOgorCQkgKiBsb2dyZWRvKCkgd2lsbCB1cGRhdGUgYm1hcCBmb3IgYWxsb2Mgb2YgbmV3L2V4dGVuZGVkCisJCSAqIGV4dGVudHMgKFhBRF9ORVd8WEFEX0VYVEVORCkgb2YgWEFEW2x3bTpuZXh0KSBmcm9tCisJCSAqIGFmdGVyLWltYWdlIG9mIFhBRGxpc3Q7CisJCSAqIGxvZ3JlZG8oKSByZXNldHMgKFhBRF9ORVd8WEFEX0VYVEVORCkgZmxhZyB3aGVuCisJCSAqIGFwcGx5aW5nIHRoZSBhZnRlci1pbWFnZSB0byB0aGUgbWV0YS1kYXRhIHBhZ2UuCisJCSAqLworCQlscmQtPnR5cGUgPSBjcHVfdG9fbGUxNihMT0dfUkVET1BBR0UpOworLy8gICAgICAgICAgICAgICpweGQgPSBtcC0+Y21fcHhkOworCQlQWERhZGRyZXNzKHB4ZCwgbXAtPmluZGV4KTsKKwkJUFhEbGVuZ3RoKHB4ZCwKKwkJCSAgbXAtPmxvZ2ljYWxfc2l6ZSA+PiB0YmxrLT5zYi0+c19ibG9ja3NpemVfYml0cyk7CisJCWxyZC0+YmFja2NoYWluID0gY3B1X3RvX2xlMzIobG1Mb2cobG9nLCB0YmxrLCBscmQsIHRsY2spKTsKKworCQkvKiBmb3JtYXQgYSBtYXBsb2NrIGZvciB0eFVwZGF0ZU1hcCgpIHRvIHVwZGF0ZSBiUE1BUAorCQkgKiBmb3IgYWxsb2Mgb2YgbmV3L2V4dGVuZGVkIGV4dGVudHMgb2YgWEFEW2x3bTpuZXh0KQorCQkgKiBmcm9tIHRoZSBwYWdlIGl0c2VsZjsKKwkJICogdHhVcGRhdGVNYXAoKSByZXNldHMgKFhBRF9ORVd8WEFEX0VYVEVORCkgZmxhZy4KKwkJICovCisJCWx3bSA9IHh0bGNrLT5sd20ub2Zmc2V0OworCQlpZiAobHdtID09IDApCisJCQlsd20gPSBYVFBBR0VNQVhTTE9UOworCisJCWlmIChsd20gPT0gbmV4dCkKKwkJCWdvdG8gb3V0OworCQlpZiAobHdtID4gbmV4dCkgeworCQkJamZzX2VycigieHRMb2c6IGx3bSA+IG5leHRcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJdGxjay0+ZmxhZyB8PSB0bGNrVVBEQVRFTUFQOworCQl4YWRsb2NrLT5mbGFnID0gbWxja0FMTE9DWEFETElTVDsKKwkJeGFkbG9jay0+Y291bnQgPSBuZXh0IC0gbHdtOworCQlpZiAoKHhhZGxvY2stPmNvdW50IDw9IDIpICYmICh0YmxrLT54ZmxhZyAmIENPTU1JVF9MQVpZKSkgeworCQkJaW50IGk7CisJCQkvKgorCQkJICogTGF6eSBjb21taXQgbWF5IGFsbG93IHh0cmVlIHRvIGJlIG1vZGlmaWVkIGJlZm9yZQorCQkJICogdHhVcGRhdGVNYXAgcnVucy4gIENvcHkgeGFkIGludG8gbGluZWxvY2sgdG8KKwkJCSAqIHByZXNlcnZlIGNvcnJlY3QgZGF0YS4KKwkJCSAqLworCQkJeGFkbG9jay0+eGRsaXN0ID0gJnh0bGNrLT5weGRsb2NrOworCQkJbWVtY3B5KHhhZGxvY2stPnhkbGlzdCwgJnAtPnhhZFtsd21dLAorCQkJICAgICAgIHNpemVvZih4YWRfdCkgKiB4YWRsb2NrLT5jb3VudCk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCB4YWRsb2NrLT5jb3VudDsgaSsrKQorCQkJCXAtPnhhZFtsd20gKyBpXS5mbGFnICY9CisJCQkJICAgIH4oWEFEX05FVyB8IFhBRF9FWFRFTkRFRCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogeGRsaXN0IHdpbGwgcG9pbnQgdG8gaW50byBpbm9kZSdzIHh0cmVlLCBlbnN1cmUKKwkJCSAqIHRoYXQgdHJhbnNhY3Rpb24gaXMgbm90IGNvbW1pdHRlZCBsYXppbHkuCisJCQkgKi8KKwkJCXhhZGxvY2stPnhkbGlzdCA9ICZwLT54YWRbbHdtXTsKKwkJCXRibGstPnhmbGFnICY9IH5DT01NSVRfTEFaWTsKKwkJfQorCQlqZnNfaW5mbygieHRMb2c6IGFsbG9jIGlwOjB4JXAgbXA6MHglcCB0bGNrOjB4JXAgbHdtOiVkICIKKwkJCSAiY291bnQ6JWQiLCB0bGNrLT5pcCwgbXAsIHRsY2ssIGx3bSwgeGFkbG9jay0+Y291bnQpOworCisJCW1hcGxvY2stPmluZGV4ID0gMTsKKworCSAgICAgIG91dDoKKwkJLyogbWFyayBwYWdlIGFzIGhvbWV3YXJkIGJvdW5kICovCisJCXRsY2stPmZsYWcgfD0gdGxja1dSSVRFUEFHRTsKKworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiAgICAgIHBhZ2UgZGVsZXRpb246IGZpbGUgZGVsZXRpb24vdHJ1bmNhdGlvbiAocmVmLiB4dFRydW5jYXRlKCkpCisJICoKKwkgKiAocGFnZSB3aWxsIGJlIGludmFsaWRhdGVkIGFmdGVyIGxvZyBpcyB3cml0dGVuIGFuZCBibWFwCisJICogaXMgdXBkYXRlZCBmcm9tIHRoZSBwYWdlKTsKKwkgKi8KKwlpZiAodGxjay0+dHlwZSAmIHRsY2tGUkVFKSB7CisJCS8qIExPR19OT1JFRE9QQUdFIGxvZyBmb3IgTm9SZWRvUGFnZSBmaWx0ZXI6CisJCSAqIGlmIHBhZ2UgZnJlZSBmcm9tIGZpbGUgZGVsZXRlLCBOb1JlZG9GaWxlIGZpbHRlciBmcm9tCisJCSAqIGlub2RlIGltYWdlIG9mIHplcm8gbGluayBjb3VudCB3aWxsIHN1YnN1bWUgTm9SZWRvUGFnZQorCQkgKiBmaWx0ZXJzIGZvciBlYWNoIHBhZ2U7CisJCSAqIGlmIHBhZ2UgZnJlZSBmcm9tIGZpbGUgdHJ1bmNhdHRpb24sIHdyaXRlIE5vUmVkb1BhZ2UKKwkJICogZmlsdGVyOworCQkgKgorCQkgKiB1cGFkdGUgb2YgYmxvY2sgYWxsb2NhdGlvbiBtYXAgZm9yIHRoZSBwYWdlIGl0c2VsZjoKKwkJICogaWYgcGFnZSBmcmVlIGZyb20gZGVsZXRpb24gYW5kIHRydW5jYXRpb24sIExPR19VUERBVEVNQVAKKwkJICogbG9nIGZvciB0aGUgcGFnZSBpdHNlbGYgaXMgZ2VuZXJhdGVkIGZyb20gcHJvY2Vzc2luZworCQkgKiBpdHMgcGFyZW50IHBhZ2UgeGFkIGVudHJpZXM7CisJCSAqLworCQkvKiBpZiBwYWdlIGZyZWUgZnJvbSBmaWxlIHRydW5jYXRpb24sIGxvZyBMT0dfTk9SRURPUEFHRQorCQkgKiBvZiB0aGUgZGVsZXRlZCBwYWdlIGZvciBsb2dyZWRvKCkgdG8gc3RhcnQgTm9SZWRvUGFnZQorCQkgKiBmaWx0ZXIgZm9yIHRoZSBwYWdlOworCQkgKi8KKwkJaWYgKHRibGstPnhmbGFnICYgQ09NTUlUX1RSVU5DQVRFKSB7CisJCQkvKiB3cml0ZSBOT1JFRE9QQUdFIGZvciB0aGUgcGFnZSAqLworCQkJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX05PUkVET1BBR0UpOworCQkJUFhEYWRkcmVzcyhweGQsIG1wLT5pbmRleCk7CisJCQlQWERsZW5ndGgocHhkLAorCQkJCSAgbXAtPmxvZ2ljYWxfc2l6ZSA+PiB0YmxrLT5zYi0+CisJCQkJICBzX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJCWxyZC0+YmFja2NoYWluID0KKwkJCSAgICBjcHVfdG9fbGUzMihsbUxvZyhsb2csIHRibGssIGxyZCwgTlVMTCkpOworCisJCQlpZiAodGxjay0+dHlwZSAmIHRsY2tCVFJPT1QpIHsKKwkJCQkvKiBFbXB0eSB4dHJlZSBtdXN0IGJlIGxvZ2dlZCAqLworCQkJCWxyZC0+dHlwZSA9IGNwdV90b19sZTE2KExPR19SRURPUEFHRSk7CisJCQkJbHJkLT5iYWNrY2hhaW4gPQorCQkJCSAgICBjcHVfdG9fbGUzMihsbUxvZyhsb2csIHRibGssIGxyZCwgdGxjaykpOworCQkJfQorCQl9CisKKwkJLyogaW5pdCBMT0dfVVBEQVRFTUFQIG9mIHRoZSBmcmVlZCBleHRlbnRzCisJCSAqIFhBRFtYVEVOVFJZU1RBUlQ6aHdtKSBmcm9tIHRoZSBkZWxldGVkIHBhZ2UgaXRzZWxmCisJCSAqIGZvciBsb2dyZWRvKCkgdG8gdXBkYXRlIGJtYXA7CisJCSAqLworCQlscmQtPnR5cGUgPSBjcHVfdG9fbGUxNihMT0dfVVBEQVRFTUFQKTsKKwkJbHJkLT5sb2cudXBkYXRlbWFwLnR5cGUgPSBjcHVfdG9fbGUxNihMT0dfRlJFRVhBRExJU1QpOworCQl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopICYgdGxjay0+bG9jazsKKwkJaHdtID0geHRsY2stPmh3bS5vZmZzZXQ7CisJCWxyZC0+bG9nLnVwZGF0ZW1hcC5ueGQgPQorCQkgICAgY3B1X3RvX2xlMTYoaHdtIC0gWFRFTlRSWVNUQVJUICsgMSk7CisJCS8qIHJlZm9ybWF0IGxpbmVsb2NrIGZvciBsbUxvZygpICovCisJCXh0bGNrLT5oZWFkZXIub2Zmc2V0ID0gWFRFTlRSWVNUQVJUOworCQl4dGxjay0+aGVhZGVyLmxlbmd0aCA9IGh3bSAtIFhURU5UUllTVEFSVCArIDE7CisJCXh0bGNrLT5pbmRleCA9IDE7CisJCWxyZC0+YmFja2NoYWluID0gY3B1X3RvX2xlMzIobG1Mb2cobG9nLCB0YmxrLCBscmQsIHRsY2spKTsKKworCQkvKiBmb3JtYXQgYSBtYXBsb2NrIGZvciB0eFVwZGF0ZU1hcCgpIHRvIHVwZGF0ZSBibWFwCisJCSAqIHRvIGZyZWUgZXh0ZW50cyBvZiBYQURbWFRFTlRSWVNUQVJUOmh3bSkgZnJvbSB0aGUKKwkJICogZGVsZXRlZCBwYWdlIGl0c2VsZjsKKwkJICovCisJCXRsY2stPmZsYWcgfD0gdGxja1VQREFURU1BUDsKKwkJeGFkbG9jay0+ZmxhZyA9IG1sY2tGUkVFWEFETElTVDsKKwkJeGFkbG9jay0+Y291bnQgPSBod20gLSBYVEVOVFJZU1RBUlQgKyAxOworCQlpZiAoKHhhZGxvY2stPmNvdW50IDw9IDIpICYmICh0YmxrLT54ZmxhZyAmIENPTU1JVF9MQVpZKSkgeworCQkJLyoKKwkJCSAqIExhenkgY29tbWl0IG1heSBhbGxvdyB4dHJlZSB0byBiZSBtb2RpZmllZCBiZWZvcmUKKwkJCSAqIHR4VXBkYXRlTWFwIHJ1bnMuICBDb3B5IHhhZCBpbnRvIGxpbmVsb2NrIHRvCisJCQkgKiBwcmVzZXJ2ZSBjb3JyZWN0IGRhdGEuCisJCQkgKi8KKwkJCXhhZGxvY2stPnhkbGlzdCA9ICZ4dGxjay0+cHhkbG9jazsKKwkJCW1lbWNweSh4YWRsb2NrLT54ZGxpc3QsICZwLT54YWRbWFRFTlRSWVNUQVJUXSwKKwkJCSAgICAgICBzaXplb2YoeGFkX3QpICogeGFkbG9jay0+Y291bnQpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIHhkbGlzdCB3aWxsIHBvaW50IHRvIGludG8gaW5vZGUncyB4dHJlZSwgZW5zdXJlCisJCQkgKiB0aGF0IHRyYW5zYWN0aW9uIGlzIG5vdCBjb21taXR0ZWQgbGF6aWx5LgorCQkJICovCisJCQl4YWRsb2NrLT54ZGxpc3QgPSAmcC0+eGFkW1hURU5UUllTVEFSVF07CisJCQl0YmxrLT54ZmxhZyAmPSB+Q09NTUlUX0xBWlk7CisJCX0KKwkJamZzX2luZm8oInh0TG9nOiBmcmVlIGlwOjB4JXAgbXA6MHglcCBjb3VudDolZCBsd206MiIsCisJCQkgdGxjay0+aXAsIG1wLCB4YWRsb2NrLT5jb3VudCk7CisKKwkJbWFwbG9jay0+aW5kZXggPSAxOworCisJCS8qIG1hcmsgcGFnZSBhcyBpbnZhbGlkICovCisJCWlmICgoKHRibGstPnhmbGFnICYgQ09NTUlUX1BXTUFQKSB8fCBTX0lTRElSKGlwLT5pX21vZGUpKQorCQkgICAgJiYgISh0bGNrLT50eXBlICYgdGxja0JUUk9PVCkpCisJCQl0bGNrLT5mbGFnIHw9IHRsY2tGUkVFUEFHRTsKKwkJLyoKKwkJICAgZWxzZSAodGJsay0+eGZsYWcgJiBDT01NSVRfUE1BUCkKKwkJICAgPyByZWxlYXNlIHRoZSBwYWdlOworCQkgKi8KKwkJcmV0dXJuOworCX0KKworCS8qCisJICogICAgICBwYWdlL2VudHJ5IHRydW5jYXRpb246IGZpbGUgdHJ1bmNhdGlvbiAocmVmLiB4dFRydW5jYXRlKCkpCisJICoKKwkgKiAgICAgfC0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS18CisJICogICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICB8CisJICogICAgICAgICAgICAgICAgfCAgICAgIHwgICAgIGh3bSAtIGh3bSBiZWZvcmUgdHJ1bmNhdGlvbgorCSAqICAgICAgICAgICAgICAgIHwgICAgIG5leHQgLSB0cnVuY2F0aW9uIHBvaW50CisJICogICAgICAgICAgICAgICBsd20gLSBsd20gYmVmb3JlIHRydW5jYXRpb24KKwkgKiBoZWFkZXIgPworCSAqLworCWlmICh0bGNrLT50eXBlICYgdGxja1RSVU5DQVRFKSB7CisJCXB4ZF90IHRweGQ7CS8qIHRydW5jYXRlZCBleHRlbnQgb2YgeGFkICovCisJCWludCB0d207CisKKwkJLyoKKwkJICogRm9yIHRydW5jYXRpb24gdGhlIGVudGlyZSBsaW5lbG9jayBtYXkgYmUgdXNlZCwgc28gaXQgd291bGQKKwkJICogYmUgZGlmZmljdWx0IHRvIHN0b3JlIHhhZCBsaXN0IGluIGxpbmVsb2NrIGl0c2VsZi4KKwkJICogVGhlcmVmb3JlLCB3ZSdsbCBqdXN0IGZvcmNlIHRyYW5zYWN0aW9uIHRvIGJlIGNvbW1pdHRlZAorCQkgKiBzeW5jaHJvbm91c2x5LCBzbyB0aGF0IHh0cmVlIHBhZ2VzIHdvbid0IGJlIGNoYW5nZWQgYmVmb3JlCisJCSAqIHR4VXBkYXRlTWFwIHJ1bnMuCisJCSAqLworCQl0YmxrLT54ZmxhZyAmPSB+Q09NTUlUX0xBWlk7CisJCWx3bSA9IHh0bGNrLT5sd20ub2Zmc2V0OworCQlpZiAobHdtID09IDApCisJCQlsd20gPSBYVFBBR0VNQVhTTE9UOworCQlod20gPSB4dGxjay0+aHdtLm9mZnNldDsKKwkJdHdtID0geHRsY2stPnR3bS5vZmZzZXQ7CisKKwkJLyoKKwkJICogICAgICB3cml0ZSBsb2cgcmVjb3JkcworCQkgKi8KKwkJLyogbG9nIGFmdGVyLWltYWdlIGZvciBsb2dyZWRvKCk6CisJCSAqCisJCSAqIGxvZ3JlZG8oKSB3aWxsIHVwZGF0ZSBibWFwIGZvciBhbGxvYyBvZiBuZXcvZXh0ZW5kZWQKKwkJICogZXh0ZW50cyAoWEFEX05FV3xYQURfRVhURU5EKSBvZiBYQURbbHdtOm5leHQpIGZyb20KKwkJICogYWZ0ZXItaW1hZ2Ugb2YgWEFEbGlzdDsKKwkJICogbG9ncmVkbygpIHJlc2V0cyAoWEFEX05FV3xYQURfRVhURU5EKSBmbGFnIHdoZW4KKwkJICogYXBwbHlpbmcgdGhlIGFmdGVyLWltYWdlIHRvIHRoZSBtZXRhLWRhdGEgcGFnZS4KKwkJICovCisJCWxyZC0+dHlwZSA9IGNwdV90b19sZTE2KExPR19SRURPUEFHRSk7CisJCVBYRGFkZHJlc3MocHhkLCBtcC0+aW5kZXgpOworCQlQWERsZW5ndGgocHhkLCBtcC0+bG9naWNhbF9zaXplID4+IHRibGstPnNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJbHJkLT5iYWNrY2hhaW4gPSBjcHVfdG9fbGUzMihsbUxvZyhsb2csIHRibGssIGxyZCwgdGxjaykpOworCisJCS8qCisJCSAqIHRydW5jYXRlIGVudHJ5IFhBRFt0d20gPT0gbmV4dCAtIDFdOgorCQkgKi8KKwkJaWYgKHR3bSA9PSBuZXh0IC0gMSkgeworCQkJLyogaW5pdCBMT0dfVVBEQVRFTUFQIGZvciBsb2dyZWRvKCkgdG8gdXBkYXRlIGJtYXAgZm9yCisJCQkgKiBmcmVlIG9mIHRydW5jYXRlZCBkZWx0YSBleHRlbnQgb2YgdGhlIHRydW5jYXRlZAorCQkJICogZW50cnkgWEFEW25leHQgLSAxXToKKwkJCSAqICh4dGxjay0+cHhkbG9jayA9IHRydW5jYXRlZCBkZWx0YSBleHRlbnQpOworCQkJICovCisJCQlweGRsb2NrID0gKHN0cnVjdCBweGRfbG9jayAqKSAmIHh0bGNrLT5weGRsb2NrOworCQkJLyogYXNzZXJ0KHB4ZGxvY2stPnR5cGUgJiB0bGNrVFJVTkNBVEUpOyAqLworCQkJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1VQREFURU1BUCk7CisJCQlscmQtPmxvZy51cGRhdGVtYXAudHlwZSA9IGNwdV90b19sZTE2KExPR19GUkVFUFhEKTsKKwkJCWxyZC0+bG9nLnVwZGF0ZW1hcC5ueGQgPSBjcHVfdG9fbGUxNigxKTsKKwkJCWxyZC0+bG9nLnVwZGF0ZW1hcC5weGQgPSBweGRsb2NrLT5weGQ7CisJCQl0cHhkID0gcHhkbG9jay0+cHhkOwkvKiBzYXZlIHRvIGZvcm1hdCBtYXBsb2NrICovCisJCQlscmQtPmJhY2tjaGFpbiA9CisJCQkgICAgY3B1X3RvX2xlMzIobG1Mb2cobG9nLCB0YmxrLCBscmQsIE5VTEwpKTsKKwkJfQorCisJCS8qCisJCSAqIGZyZWUgZW50cmllcyBYQURbbmV4dDpod21dOgorCQkgKi8KKwkJaWYgKGh3bSA+PSBuZXh0KSB7CisJCQkvKiBpbml0IExPR19VUERBVEVNQVAgb2YgdGhlIGZyZWVkIGV4dGVudHMKKwkJCSAqIFhBRFtuZXh0Omh3bV0gZnJvbSB0aGUgZGVsZXRlZCBwYWdlIGl0c2VsZgorCQkJICogZm9yIGxvZ3JlZG8oKSB0byB1cGRhdGUgYm1hcDsKKwkJCSAqLworCQkJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1VQREFURU1BUCk7CisJCQlscmQtPmxvZy51cGRhdGVtYXAudHlwZSA9CisJCQkgICAgY3B1X3RvX2xlMTYoTE9HX0ZSRUVYQURMSVNUKTsKKwkJCXh0bGNrID0gKHN0cnVjdCB4dGxvY2sgKikgJiB0bGNrLT5sb2NrOworCQkJaHdtID0geHRsY2stPmh3bS5vZmZzZXQ7CisJCQlscmQtPmxvZy51cGRhdGVtYXAubnhkID0KKwkJCSAgICBjcHVfdG9fbGUxNihod20gLSBuZXh0ICsgMSk7CisJCQkvKiByZWZvcm1hdCBsaW5lbG9jayBmb3IgbG1Mb2coKSAqLworCQkJeHRsY2stPmhlYWRlci5vZmZzZXQgPSBuZXh0OworCQkJeHRsY2stPmhlYWRlci5sZW5ndGggPSBod20gLSBuZXh0ICsgMTsKKwkJCXh0bGNrLT5pbmRleCA9IDE7CisJCQlscmQtPmJhY2tjaGFpbiA9CisJCQkgICAgY3B1X3RvX2xlMzIobG1Mb2cobG9nLCB0YmxrLCBscmQsIHRsY2spKTsKKwkJfQorCisJCS8qCisJCSAqICAgICAgZm9ybWF0IG1hcGxvY2socykgZm9yIHR4VXBkYXRlTWFwKCkgdG8gdXBkYXRlIGJtYXAKKwkJICovCisJCW1hcGxvY2stPmluZGV4ID0gMDsKKworCQkvKgorCQkgKiBhbGxvY2F0ZSBlbnRyaWVzIFhBRFtsd206bmV4dCk6CisJCSAqLworCQlpZiAobHdtIDwgbmV4dCkgeworCQkJLyogZm9ybWF0IGEgbWFwbG9jayBmb3IgdHhVcGRhdGVNYXAoKSB0byB1cGRhdGUgYlBNQVAKKwkJCSAqIGZvciBhbGxvYyBvZiBuZXcvZXh0ZW5kZWQgZXh0ZW50cyBvZiBYQURbbHdtOm5leHQpCisJCQkgKiBmcm9tIHRoZSBwYWdlIGl0c2VsZjsKKwkJCSAqIHR4VXBkYXRlTWFwKCkgcmVzZXRzIChYQURfTkVXfFhBRF9FWFRFTkQpIGZsYWcuCisJCQkgKi8KKwkJCXRsY2stPmZsYWcgfD0gdGxja1VQREFURU1BUDsKKwkJCXhhZGxvY2stPmZsYWcgPSBtbGNrQUxMT0NYQURMSVNUOworCQkJeGFkbG9jay0+Y291bnQgPSBuZXh0IC0gbHdtOworCQkJeGFkbG9jay0+eGRsaXN0ID0gJnAtPnhhZFtsd21dOworCisJCQlqZnNfaW5mbygieHRMb2c6IGFsbG9jIGlwOjB4JXAgbXA6MHglcCBjb3VudDolZCAiCisJCQkJICJsd206JWQgbmV4dDolZCIsCisJCQkJIHRsY2stPmlwLCBtcCwgeGFkbG9jay0+Y291bnQsIGx3bSwgbmV4dCk7CisJCQltYXBsb2NrLT5pbmRleCsrOworCQkJeGFkbG9jaysrOworCQl9CisKKwkJLyoKKwkJICogdHJ1bmNhdGUgZW50cnkgWEFEW3R3bSA9PSBuZXh0IC0gMV06CisJCSAqLworCQlpZiAodHdtID09IG5leHQgLSAxKSB7CisJCQlzdHJ1Y3QgcHhkX2xvY2sgKnB4ZGxvY2s7CisKKwkJCS8qIGZvcm1hdCBhIG1hcGxvY2sgZm9yIHR4VXBkYXRlTWFwKCkgdG8gdXBkYXRlIGJtYXAKKwkJCSAqIHRvIGZyZWUgdHJ1bmNhdGVkIGRlbHRhIGV4dGVudCBvZiB0aGUgdHJ1bmNhdGVkCisJCQkgKiBlbnRyeSBYQURbbmV4dCAtIDFdOworCQkJICogKHh0bGNrLT5weGRsb2NrID0gdHJ1bmNhdGVkIGRlbHRhIGV4dGVudCk7CisJCQkgKi8KKwkJCXRsY2stPmZsYWcgfD0gdGxja1VQREFURU1BUDsKKwkJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopIHhhZGxvY2s7CisJCQlweGRsb2NrLT5mbGFnID0gbWxja0ZSRUVQWEQ7CisJCQlweGRsb2NrLT5jb3VudCA9IDE7CisJCQlweGRsb2NrLT5weGQgPSB0cHhkOworCisJCQlqZnNfaW5mbygieHRMb2c6IHRydW5jYXRlIGlwOjB4JXAgbXA6MHglcCBjb3VudDolZCAiCisJCQkJICJod206JWQiLCBpcCwgbXAsIHB4ZGxvY2stPmNvdW50LCBod20pOworCQkJbWFwbG9jay0+aW5kZXgrKzsKKwkJCXhhZGxvY2srKzsKKwkJfQorCisJCS8qCisJCSAqIGZyZWUgZW50cmllcyBYQURbbmV4dDpod21dOgorCQkgKi8KKwkJaWYgKGh3bSA+PSBuZXh0KSB7CisJCQkvKiBmb3JtYXQgYSBtYXBsb2NrIGZvciB0eFVwZGF0ZU1hcCgpIHRvIHVwZGF0ZSBibWFwCisJCQkgKiB0byBmcmVlIGV4dGVudHMgb2YgWEFEW25leHQ6aHdtXSBmcm9tIHRoZWRlbGV0ZWQKKwkJCSAqIHBhZ2UgaXRzZWxmOworCQkJICovCisJCQl0bGNrLT5mbGFnIHw9IHRsY2tVUERBVEVNQVA7CisJCQl4YWRsb2NrLT5mbGFnID0gbWxja0ZSRUVYQURMSVNUOworCQkJeGFkbG9jay0+Y291bnQgPSBod20gLSBuZXh0ICsgMTsKKwkJCXhhZGxvY2stPnhkbGlzdCA9ICZwLT54YWRbbmV4dF07CisKKwkJCWpmc19pbmZvKCJ4dExvZzogZnJlZSBpcDoweCVwIG1wOjB4JXAgY291bnQ6JWQgIgorCQkJCSAibmV4dDolZCBod206JWQiLAorCQkJCSB0bGNrLT5pcCwgbXAsIHhhZGxvY2stPmNvdW50LCBuZXh0LCBod20pOworCQkJbWFwbG9jay0+aW5kZXgrKzsKKwkJfQorCisJCS8qIG1hcmsgcGFnZSBhcyBob21ld2FyZCBib3VuZCAqLworCQl0bGNrLT5mbGFnIHw9IHRsY2tXUklURVBBR0U7CisJfQorCXJldHVybjsKK30KKworCisvKgorICogICAgICBtYXBMb2coKQorICoKKyAqIGZ1bmN0aW9uOiAgICBsb2cgZnJvbSBtYXBsb2NrIG9mIGZyZWVkIGRhdGEgZXh0ZW50czsKKyAqLwordm9pZCBtYXBMb2coc3RydWN0IGpmc19sb2cgKiBsb2csIHN0cnVjdCB0YmxvY2sgKiB0YmxrLCBzdHJ1Y3QgbHJkICogbHJkLAorCSAgICBzdHJ1Y3QgdGxvY2sgKiB0bGNrKQoreworCXN0cnVjdCBweGRfbG9jayAqcHhkbG9jazsKKwlpbnQgaSwgbmxvY2s7CisJcHhkX3QgKnB4ZDsKKworCS8qCisJICogICAgICBwYWdlIHJlbG9jYXRpb246IGZyZWUgdGhlIHNvdXJjZSBwYWdlIGV4dGVudAorCSAqCisJICogYSBtYXBsb2NrIGZvciB0eFVwZGF0ZU1hcCgpIGZvciBmcmVlIG9mIHRoZSBwYWdlCisJICogaGFzIGJlZW4gZm9ybWF0dGVkIGF0IHR4TG9jaygpIHRpbWUgc2F2aW5nIHRoZSBzcmMKKwkgKiByZWxvY2F0ZWQgcGFnZSBhZGRyZXNzOworCSAqLworCWlmICh0bGNrLT50eXBlICYgdGxja1JFTE9DQVRFKSB7CisJCS8qIGxvZyBMT0dfTk9SRURPUEFHRSBvZiB0aGUgb2xkIHJlbG9jYXRlZCBwYWdlCisJCSAqIGZvciBsb2dyZWRvKCkgdG8gc3RhcnQgTm9SZWRvUGFnZSBmaWx0ZXI7CisJCSAqLworCQlscmQtPnR5cGUgPSBjcHVfdG9fbGUxNihMT0dfTk9SRURPUEFHRSk7CisJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopICYgdGxjay0+bG9jazsKKwkJcHhkID0gJmxyZC0+bG9nLnJlZG9wYWdlLnB4ZDsKKwkJKnB4ZCA9IHB4ZGxvY2stPnB4ZDsKKwkJbHJkLT5iYWNrY2hhaW4gPSBjcHVfdG9fbGUzMihsbUxvZyhsb2csIHRibGssIGxyZCwgTlVMTCkpOworCisJCS8qIChOLkIuIGN1cnJlbnRseSwgbG9ncmVkbygpIGRvZXMgTk9UIHVwZGF0ZSBibWFwCisJCSAqIGZvciBmcmVlIG9mIHRoZSBwYWdlIGl0c2VsZiBmb3IgKExPR19YVFJFRXxMT0dfTk9SRURPUEFHRSk7CisJCSAqIGlmIHBhZ2UgZnJlZSBmcm9tIHJlbG9jYXRpb24sIExPR19VUERBVEVNQVAgbG9nIGlzCisJCSAqIHNwZWNpZmljYWxseSBnZW5lcmF0ZWQgbm93IGZvciBsb2dyZWRvKCkKKwkJICogdG8gdXBkYXRlIGJtYXAgZm9yIGZyZWUgb2Ygc3JjIHJlbG9jYXRlZCBwYWdlOworCQkgKiAobmV3IGZsYWcgTE9HX1JFTE9DQVRFIG1heSBiZSBpbnRyb2R1Y2VkIHdoaWNoIHdpbGwKKwkJICogaW5mb3JtIGxvZ3JlZG8oKSB0byBzdGFydCBOT1JlZG9QYWdlIGZpbHRlciBhbmQgYWxzbworCQkgKiB1cGRhdGUgYmxvY2sgYWxsb2NhdGlvbiBtYXAgYXQgdGhlIHNhbWUgdGltZSwgdGh1cworCQkgKiBhdm9pZGluZyBhbiBleHRyYSBsb2cgd3JpdGUpOworCQkgKi8KKwkJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1VQREFURU1BUCk7CisJCWxyZC0+bG9nLnVwZGF0ZW1hcC50eXBlID0gY3B1X3RvX2xlMTYoTE9HX0ZSRUVQWEQpOworCQlscmQtPmxvZy51cGRhdGVtYXAubnhkID0gY3B1X3RvX2xlMTYoMSk7CisJCWxyZC0+bG9nLnVwZGF0ZW1hcC5weGQgPSBweGRsb2NrLT5weGQ7CisJCWxyZC0+YmFja2NoYWluID0gY3B1X3RvX2xlMzIobG1Mb2cobG9nLCB0YmxrLCBscmQsIE5VTEwpKTsKKworCQkvKiBhIG1hcGxvY2sgZm9yIHR4VXBkYXRlTWFwKCkgZm9yIGZyZWUgb2YgdGhlIHBhZ2UKKwkJICogaGFzIGJlZW4gZm9ybWF0dGVkIGF0IHR4TG9jaygpIHRpbWU7CisJCSAqLworCQl0bGNrLT5mbGFnIHw9IHRsY2tVUERBVEVNQVA7CisJCXJldHVybjsKKwl9CisJLyoKKworCSAqIE90aGVyd2lzZSBpdCdzIG5vdCBhIHJlbG9jYXRlIHJlcXVlc3QKKwkgKgorCSAqLworCWVsc2UgeworCQkvKiBsb2cgTE9HX1VQREFURU1BUCBmb3IgbG9ncmVkbygpIHRvIHVwZGF0ZSBibWFwIGZvcgorCQkgKiBmcmVlIG9mIHRydW5jYXRlZC9yZWxvY2F0ZWQgZGVsdGEgZXh0ZW50IG9mIHRoZSBkYXRhOworCQkgKiBlLmcuOiBleHRlcm5hbCBFQSBleHRlbnQsIHJlbG9jYXRlZC90cnVuY2F0ZWQgZXh0ZW50CisJCSAqIGZyb20geHRUYWlsZ2F0ZSgpOworCQkgKi8KKwkJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1VQREFURU1BUCk7CisJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopICYgdGxjay0+bG9jazsKKwkJbmxvY2sgPSBweGRsb2NrLT5pbmRleDsKKwkJZm9yIChpID0gMDsgaSA8IG5sb2NrOyBpKyssIHB4ZGxvY2srKykgeworCQkJaWYgKHB4ZGxvY2stPmZsYWcgJiBtbGNrQUxMT0NQWEQpCisJCQkJbHJkLT5sb2cudXBkYXRlbWFwLnR5cGUgPQorCQkJCSAgICBjcHVfdG9fbGUxNihMT0dfQUxMT0NQWEQpOworCQkJZWxzZQorCQkJCWxyZC0+bG9nLnVwZGF0ZW1hcC50eXBlID0KKwkJCQkgICAgY3B1X3RvX2xlMTYoTE9HX0ZSRUVQWEQpOworCQkJbHJkLT5sb2cudXBkYXRlbWFwLm54ZCA9IGNwdV90b19sZTE2KDEpOworCQkJbHJkLT5sb2cudXBkYXRlbWFwLnB4ZCA9IHB4ZGxvY2stPnB4ZDsKKwkJCWxyZC0+YmFja2NoYWluID0KKwkJCSAgICBjcHVfdG9fbGUzMihsbUxvZyhsb2csIHRibGssIGxyZCwgTlVMTCkpOworCQkJamZzX2luZm8oIm1hcExvZzogeGFkZHI6MHglbHggeGxlbjoweCV4IiwKKwkJCQkgKHVsb25nKSBhZGRyZXNzUFhEKCZweGRsb2NrLT5weGQpLAorCQkJCSBsZW5ndGhQWEQoJnB4ZGxvY2stPnB4ZCkpOworCQl9CisKKwkJLyogdXBkYXRlIGJtYXAgKi8KKwkJdGxjay0+ZmxhZyB8PSB0bGNrVVBEQVRFTUFQOworCX0KK30KKworCisvKgorICogICAgICB0eEVBKCkKKyAqCisgKiBmdW5jdGlvbjogICAgYWNxdWlyZSBtYXBsb2NrIGZvciBFQS9BQ0wgZXh0ZW50cyBvcgorICogICAgICAgICAgICAgIHNldCBDT01NSVRfSU5MSU5FIGZsYWc7CisgKi8KK3ZvaWQgdHhFQSh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIGR4ZF90ICogb2xkZWEsIGR4ZF90ICogbmV3ZWEpCit7CisJc3RydWN0IHRsb2NrICp0bGNrID0gTlVMTDsKKwlzdHJ1Y3QgcHhkX2xvY2sgKm1hcGxvY2sgPSBOVUxMLCAqcHhkbG9jayA9IE5VTEw7CisKKwkvKgorCSAqIGZvcm1hdCBtYXBsb2NrIGZvciBhbGxvYyBvZiBuZXcgRUEgZXh0ZW50CisJICovCisJaWYgKG5ld2VhKSB7CisJCS8qIFNpbmNlIHRoZSBuZXdlYSBjb3VsZCBiZSBhIGNvbXBsZXRlbHkgemVyb2VkIGVudHJ5IHdlIG5lZWQgdG8KKwkJICogY2hlY2sgZm9yIHRoZSB0d28gZmxhZ3Mgd2hpY2ggaW5kaWNhdGUgd2Ugc2hvdWxkIGFjdHVhbGx5CisJCSAqIGNvbW1pdCBuZXcgRUEgZGF0YQorCQkgKi8KKwkJaWYgKG5ld2VhLT5mbGFnICYgRFhEX0VYVEVOVCkgeworCQkJdGxjayA9IHR4TWFwbG9jayh0aWQsIGlwLCB0bGNrTUFQKTsKKwkJCW1hcGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopICYgdGxjay0+bG9jazsKKwkJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopIG1hcGxvY2s7CisJCQlweGRsb2NrLT5mbGFnID0gbWxja0FMTE9DUFhEOworCQkJUFhEYWRkcmVzcygmcHhkbG9jay0+cHhkLCBhZGRyZXNzRFhEKG5ld2VhKSk7CisJCQlQWERsZW5ndGgoJnB4ZGxvY2stPnB4ZCwgbGVuZ3RoRFhEKG5ld2VhKSk7CisJCQlweGRsb2NrKys7CisJCQltYXBsb2NrLT5pbmRleCA9IDE7CisJCX0gZWxzZSBpZiAobmV3ZWEtPmZsYWcgJiBEWERfSU5MSU5FKSB7CisJCQl0bGNrID0gTlVMTDsKKworCQkJc2V0X2NmbGFnKENPTU1JVF9JbmxpbmVlYSwgaXApOworCQl9CisJfQorCisJLyoKKwkgKiBmb3JtYXQgbWFwbG9jayBmb3IgZnJlZSBvZiBvbGQgRUEgZXh0ZW50CisJICovCisJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSAmJiBvbGRlYS0+ZmxhZyAmIERYRF9FWFRFTlQpIHsKKwkJaWYgKHRsY2sgPT0gTlVMTCkgeworCQkJdGxjayA9IHR4TWFwbG9jayh0aWQsIGlwLCB0bGNrTUFQKTsKKwkJCW1hcGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopICYgdGxjay0+bG9jazsKKwkJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopIG1hcGxvY2s7CisJCQltYXBsb2NrLT5pbmRleCA9IDA7CisJCX0KKwkJcHhkbG9jay0+ZmxhZyA9IG1sY2tGUkVFUFhEOworCQlQWERhZGRyZXNzKCZweGRsb2NrLT5weGQsIGFkZHJlc3NEWEQob2xkZWEpKTsKKwkJUFhEbGVuZ3RoKCZweGRsb2NrLT5weGQsIGxlbmd0aERYRChvbGRlYSkpOworCQltYXBsb2NrLT5pbmRleCsrOworCX0KK30KKworCisvKgorICogICAgICB0eEZvcmNlKCkKKyAqCisgKiBmdW5jdGlvbjogc3luY2hyb25vdXNseSB3cml0ZSBwYWdlcyBsb2NrZWQgYnkgdHJhbnNhY3Rpb24KKyAqICAgICAgICAgICAgICBhZnRlciB0eExvZygpIGJ1dCBiZWZvcmUgdHhVcGRhdGVNYXAoKTsKKyAqLwordm9pZCB0eEZvcmNlKHN0cnVjdCB0YmxvY2sgKiB0YmxrKQoreworCXN0cnVjdCB0bG9jayAqdGxjazsKKwlsaWRfdCBsaWQsIG5leHQ7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKworCS8qCisJICogcmV2ZXJzZSB0aGUgb3JkZXIgb2YgdHJhbnNhY3Rpb24gdGxvY2tzIGluCisJICogY2FyZWZ1bCB1cGRhdGUgb3JkZXIgb2YgYWRkcmVzcyBpbmRleCBwYWdlcworCSAqIChyaWdodCB0byBsZWZ0LCBib3R0b20gdXApCisJICovCisJdGxjayA9IGxpZF90b190bG9jayh0YmxrLT5uZXh0KTsKKwlsaWQgPSB0bGNrLT5uZXh0OworCXRsY2stPm5leHQgPSAwOworCXdoaWxlIChsaWQpIHsKKwkJdGxjayA9IGxpZF90b190bG9jayhsaWQpOworCQluZXh0ID0gdGxjay0+bmV4dDsKKwkJdGxjay0+bmV4dCA9IHRibGstPm5leHQ7CisJCXRibGstPm5leHQgPSBsaWQ7CisJCWxpZCA9IG5leHQ7CisJfQorCisJLyoKKwkgKiBzeW5jaHJvbm91c2x5IHdyaXRlIHRoZSBwYWdlLCBhbmQKKwkgKiBob2xkIHRoZSBwYWdlIGZvciB0eFVwZGF0ZU1hcCgpOworCSAqLworCWZvciAobGlkID0gdGJsay0+bmV4dDsgbGlkOyBsaWQgPSBuZXh0KSB7CisJCXRsY2sgPSBsaWRfdG9fdGxvY2sobGlkKTsKKwkJbmV4dCA9IHRsY2stPm5leHQ7CisKKwkJaWYgKChtcCA9IHRsY2stPm1wKSAhPSBOVUxMICYmCisJCSAgICAodGxjay0+dHlwZSAmIHRsY2tCVFJPT1QpID09IDApIHsKKwkJCWFzc2VydChtcC0+eGZsYWcgJiBDT01NSVRfUEFHRSk7CisKKwkJCWlmICh0bGNrLT5mbGFnICYgdGxja1dSSVRFUEFHRSkgeworCQkJCXRsY2stPmZsYWcgJj0gfnRsY2tXUklURVBBR0U7CisKKwkJCQkvKiBkbyBub3QgcmVsZWFzZSBwYWdlIHRvIGZyZWVsaXN0ICovCisKKwkJCQkvKgorCQkJCSAqIFRoZSAicmlnaHQiIHRoaW5nIHRvIGRvIGhlcmUgaXMgdG8KKwkJCQkgKiBzeW5jaHJvbm91c2x5IHdyaXRlIHRoZSBtZXRhZGF0YS4KKwkJCQkgKiBXaXRoIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHRoaXMKKwkJCQkgKiBpcyBoYXJkIHNpbmNlIHdyaXRlX21ldGFwYWdlIHJlcXVpcmVzCisJCQkJICogdXMgdG8ga3VubWFwICYgcmVtYXAgdGhlIHBhZ2UuICBJZiB3ZQorCQkJCSAqIGhhdmUgdGxvY2tzIHBvaW50aW5nIGludG8gdGhlIG1ldGFkYXRhCisJCQkJICogcGFnZXMsIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcy4gIEkgdGhpbmsKKwkJCQkgKiB3ZSBjYW4gZ2V0IGJ5IHdpdGggc3luY2hyb25vdXNseSB3cml0aW5nCisJCQkJICogdGhlIHBhZ2VzIHdoZW4gdGhleSBhcmUgcmVsZWFzZWQuCisJCQkJICovCisJCQkJYXNzZXJ0KGF0b21pY19yZWFkKCZtcC0+bm9ob21lb2spKTsKKwkJCQlzZXRfYml0KE1FVEFfZGlydHksICZtcC0+ZmxhZyk7CisJCQkJc2V0X2JpdChNRVRBX3N5bmMsICZtcC0+ZmxhZyk7CisJCQl9CisJCX0KKwl9Cit9CisKKworLyoKKyAqICAgICAgdHhVcGRhdGVNYXAoKQorICoKKyAqIGZ1bmN0aW9uOiAgICB1cGRhdGUgcGVyc2lzdGVudCBhbGxvY2F0aW9uIG1hcCAoYW5kIHdvcmtpbmcgbWFwCisgKiAgICAgICAgICAgICAgaWYgYXBwcm9wcmlhdGUpOworICoKKyAqIHBhcmFtZXRlcjoKKyAqLworc3RhdGljIHZvaWQgdHhVcGRhdGVNYXAoc3RydWN0IHRibG9jayAqIHRibGspCit7CisJc3RydWN0IGlub2RlICppcDsKKwlzdHJ1Y3QgaW5vZGUgKmlwaW1hcDsKKwlsaWRfdCBsaWQ7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBtYXBsb2NrICptYXBsb2NrOworCXN0cnVjdCBweGRfbG9jayBweGRsb2NrOworCWludCBtYXB0eXBlOworCWludCBrLCBubG9jazsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wID0gTlVMTDsKKworCWlwaW1hcCA9IEpGU19TQkkodGJsay0+c2IpLT5pcGltYXA7CisKKwltYXB0eXBlID0gKHRibGstPnhmbGFnICYgQ09NTUlUX1BNQVApID8gQ09NTUlUX1BNQVAgOiBDT01NSVRfUFdNQVA7CisKKworCS8qCisJICogICAgICB1cGRhdGUgYmxvY2sgYWxsb2NhdGlvbiBtYXAKKwkgKgorCSAqIHVwZGF0ZSBhbGxvY2F0aW9uIHN0YXRlIGluIHBtYXAgKGFuZCB3bWFwKSBhbmQKKwkgKiB1cGRhdGUgbHNuIG9mIHRoZSBwbWFwIHBhZ2U7CisJICovCisJLyoKKwkgKiBzY2FuIGVhY2ggdGxvY2svcGFnZSBvZiB0cmFuc2FjdGlvbiBmb3IgYmxvY2sgYWxsb2NhdGlvbi9mcmVlOgorCSAqCisJICogZm9yIGVhY2ggdGxvY2svcGFnZSBvZiB0cmFuc2FjdGlvbiwgdXBkYXRlIG1hcC4KKwkgKiAgPyBhcmUgdGhlcmUgdGxvY2sgZm9yIHBtYXAgYW5kIHB3bWFwIGF0IHRoZSBzYW1lIHRpbWUgPworCSAqLworCWZvciAobGlkID0gdGJsay0+bmV4dDsgbGlkOyBsaWQgPSB0bGNrLT5uZXh0KSB7CisJCXRsY2sgPSBsaWRfdG9fdGxvY2sobGlkKTsKKworCQlpZiAoKHRsY2stPmZsYWcgJiB0bGNrVVBEQVRFTUFQKSA9PSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKHRsY2stPmZsYWcgJiB0bGNrRlJFRVBBR0UpIHsKKwkJCS8qCisJCQkgKiBBbm90aGVyIHRocmVhZCBtYXkgYXR0ZW1wdCB0byByZXVzZSBmcmVlZCBzcGFjZQorCQkJICogaW1tZWRpYXRlbHksIHNvIHdlIHdhbnQgdG8gZ2V0IHJpZCBvZiB0aGUgbWV0YXBhZ2UKKwkJCSAqIGJlZm9yZSBhbnlvbmUgZWxzZSBoYXMgYSBjaGFuY2UgdG8gZ2V0IGl0LgorCQkJICogTG9jayBtZXRhcGFnZSwgdXBkYXRlIG1hcHMsIHRoZW4gaW52YWxpZGF0ZQorCQkJICogdGhlIG1ldGFwYWdlLgorCQkJICovCisJCQltcCA9IHRsY2stPm1wOworCQkJQVNTRVJUKG1wLT54ZmxhZyAmIENPTU1JVF9QQUdFKTsKKwkJCWhvbGRfbWV0YXBhZ2UobXAsIDApOworCQl9CisKKwkJLyoKKwkJICogZXh0ZW50IGxpc3Q6CisJCSAqIC4gaW4tbGluZSBQWEQgbGlzdDoKKwkJICogLiBvdXQtb2YtbGluZSBYQUQgbGlzdDoKKwkJICovCisJCW1hcGxvY2sgPSAoc3RydWN0IG1hcGxvY2sgKikgJiB0bGNrLT5sb2NrOworCQlubG9jayA9IG1hcGxvY2stPmluZGV4OworCisJCWZvciAoayA9IDA7IGsgPCBubG9jazsgaysrLCBtYXBsb2NrKyspIHsKKwkJCS8qCisJCQkgKiBhbGxvY2F0ZSBibG9ja3MgaW4gcGVyc2lzdGVudCBtYXA6CisJCQkgKgorCQkJICogYmxvY2tzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSB3bWFwIGF0IGFsbG9jIHRpbWU7CisJCQkgKi8KKwkJCWlmIChtYXBsb2NrLT5mbGFnICYgbWxja0FMTE9DKSB7CisJCQkJdHhBbGxvY1BNYXAoaXBpbWFwLCBtYXBsb2NrLCB0YmxrKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBmcmVlIGJsb2NrcyBpbiBwZXJzaXN0ZW50IGFuZCB3b3JraW5nIG1hcDoKKwkJCSAqIGJsb2NrcyB3aWxsIGJlIGZyZWVkIGluIHBtYXAgYW5kIHRoZW4gaW4gd21hcDsKKwkJCSAqCisJCQkgKiA/IHRibG9jayBzcGVjaWZpZXMgdGhlIFBNQVAvUFdNQVAgYmFzZWQgdXBvbgorCQkJICogdHJhbnNhY3Rpb24KKwkJCSAqCisJCQkgKiBmcmVlIGJsb2NrcyBpbiBwZXJzaXN0ZW50IG1hcDoKKwkJCSAqIGJsb2NrcyB3aWxsIGJlIGZyZWVkIGZyb20gd21hcCBhdCBsYXN0IHJlZmVyZW5jZQorCQkJICogcmVsZWFzZSBvZiB0aGUgb2JqZWN0IGZvciByZWd1bGFyIGZpbGVzOworCQkJICoKKwkJCSAqIEFsd2F5IGZyZWUgYmxvY2tzIGZyb20gYm90aCBwZXJzaXN0ZW50ICYgd29ya2luZworCQkJICogbWFwcyBmb3IgZGlyZWN0b3JpZXMKKwkJCSAqLworCQkJZWxzZSB7CS8qIChtYXBsb2NrLT5mbGFnICYgbWxja0ZSRUUpICovCisKKwkJCQlpZiAoU19JU0RJUih0bGNrLT5pcC0+aV9tb2RlKSkKKwkJCQkJdHhGcmVlTWFwKGlwaW1hcCwgbWFwbG9jaywKKwkJCQkJCSAgdGJsaywgQ09NTUlUX1BXTUFQKTsKKwkJCQllbHNlCisJCQkJCXR4RnJlZU1hcChpcGltYXAsIG1hcGxvY2ssCisJCQkJCQkgIHRibGssIG1hcHR5cGUpOworCQkJfQorCQl9CisJCWlmICh0bGNrLT5mbGFnICYgdGxja0ZSRUVQQUdFKSB7CisJCQlpZiAoISh0YmxrLT5mbGFnICYgdGJsa0dDX0xBWlkpKSB7CisJCQkJLyogVGhpcyBpcyBlcXVpdmFsZW50IHRvIHR4UmVsZWFzZSAqLworCQkJCUFTU0VSVChtcC0+bGlkID09IGxpZCk7CisJCQkJdGxjay0+bXAtPmxpZCA9IDA7CisJCQl9CisJCQlhc3NlcnQoYXRvbWljX3JlYWQoJm1wLT5ub2hvbWVvaykgPT0gMSk7CisJCQlhdG9taWNfZGVjKCZtcC0+bm9ob21lb2spOworCQkJZGlzY2FyZF9tZXRhcGFnZShtcCk7CisJCQl0bGNrLT5tcCA9IE5VTEw7CisJCX0KKwl9CisJLyoKKwkgKiAgICAgIHVwZGF0ZSBpbm9kZSBhbGxvY2F0aW9uIG1hcAorCSAqCisJICogdXBkYXRlIGFsbG9jYXRpb24gc3RhdGUgaW4gcG1hcCBhbmQKKwkgKiB1cGRhdGUgbHNuIG9mIHRoZSBwbWFwIHBhZ2U7CisJICogdXBkYXRlIGluLW1lbW9yeSBpbm9kZSBmbGFnL3N0YXRlCisJICoKKwkgKiB1bmxvY2sgbWFwcGVyL3dyaXRlIGxvY2sKKwkgKi8KKwlpZiAodGJsay0+eGZsYWcgJiBDT01NSVRfQ1JFQVRFKSB7CisJCWRpVXBkYXRlUE1hcChpcGltYXAsIHRibGstPmlubywgRkFMU0UsIHRibGspOworCQlpcGltYXAtPmlfc3RhdGUgfD0gSV9ESVJUWTsKKwkJLyogdXBkYXRlIHBlcnNpc3RlbnQgYmxvY2sgYWxsb2NhdGlvbiBtYXAKKwkJICogZm9yIHRoZSBhbGxvY2F0aW9uIG9mIGlub2RlIGV4dGVudDsKKwkJICovCisJCXB4ZGxvY2suZmxhZyA9IG1sY2tBTExPQ1BYRDsKKwkJcHhkbG9jay5weGQgPSB0YmxrLT51Lml4cHhkOworCQlweGRsb2NrLmluZGV4ID0gMTsKKwkJdHhBbGxvY1BNYXAoaXBpbWFwLCAoc3RydWN0IG1hcGxvY2sgKikgJiBweGRsb2NrLCB0YmxrKTsKKwl9IGVsc2UgaWYgKHRibGstPnhmbGFnICYgQ09NTUlUX0RFTEVURSkgeworCQlpcCA9IHRibGstPnUuaXA7CisJCWRpVXBkYXRlUE1hcChpcGltYXAsIGlwLT5pX2lubywgVFJVRSwgdGJsayk7CisJCWlwaW1hcC0+aV9zdGF0ZSB8PSBJX0RJUlRZOworCQlpcHV0KGlwKTsKKwl9Cit9CisKKworLyoKKyAqICAgICAgdHhBbGxvY1BNYXAoKQorICoKKyAqIGZ1bmN0aW9uOiBhbGxvY2F0ZSBmcm9tIHBlcnNpc3RlbnQgbWFwOworICoKKyAqIHBhcmFtZXRlcjoKKyAqICAgICAgaXBibWFwICAtCisgKiAgICAgIG1hbG9jayAtCisgKiAgICAgICAgICAgICAgeGFkIGxpc3Q6CisgKiAgICAgICAgICAgICAgcHhkOgorICoKKyAqICAgICAgbWFwdHlwZSAtCisgKiAgICAgICAgICAgICAgYWxsb2NhdGUgZnJvbSBwZXJzaXN0ZW50IG1hcDsKKyAqICAgICAgICAgICAgICBmcmVlIGZyb20gcGVyc2lzdGVudCBtYXA7CisgKiAgICAgICAgICAgICAgKGUuZy4sIHRtcCBmaWxlIC0gZnJlZSBmcm9tIHdvcmtpbmcgbWFwIGF0IHJlbGVhZQorICogICAgICAgICAgICAgICBvZiBsYXN0IHJlZmVyZW5jZSk7CisgKiAgICAgICAgICAgICAgZnJlZSBmcm9tIHBlcnNpc3RlbnQgYW5kIHdvcmtpbmcgbWFwOworICoKKyAqICAgICAgbHNuICAgICAtIGxvZyBzZXF1ZW5jZSBudW1iZXI7CisgKi8KK3N0YXRpYyB2b2lkIHR4QWxsb2NQTWFwKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBtYXBsb2NrICogbWFwbG9jaywKKwkJCXN0cnVjdCB0YmxvY2sgKiB0YmxrKQoreworCXN0cnVjdCBpbm9kZSAqaXBibWFwID0gSkZTX1NCSShpcC0+aV9zYiktPmlwYm1hcDsKKwlzdHJ1Y3QgeGRsaXN0bG9jayAqeGFkbGlzdGxvY2s7CisJeGFkX3QgKnhhZDsKKwlzNjQgeGFkZHI7CisJaW50IHhsZW47CisJc3RydWN0IHB4ZF9sb2NrICpweGRsb2NrOworCXN0cnVjdCB4ZGxpc3Rsb2NrICpweGRsaXN0bG9jazsKKwlweGRfdCAqcHhkOworCWludCBuOworCisJLyoKKwkgKiBhbGxvY2F0ZSBmcm9tIHBlcnNpc3RlbnQgbWFwOworCSAqLworCWlmIChtYXBsb2NrLT5mbGFnICYgbWxja0FMTE9DWEFETElTVCkgeworCQl4YWRsaXN0bG9jayA9IChzdHJ1Y3QgeGRsaXN0bG9jayAqKSBtYXBsb2NrOworCQl4YWQgPSB4YWRsaXN0bG9jay0+eGRsaXN0OworCQlmb3IgKG4gPSAwOyBuIDwgeGFkbGlzdGxvY2stPmNvdW50OyBuKyssIHhhZCsrKSB7CisJCQlpZiAoeGFkLT5mbGFnICYgKFhBRF9ORVcgfCBYQURfRVhURU5ERUQpKSB7CisJCQkJeGFkZHIgPSBhZGRyZXNzWEFEKHhhZCk7CisJCQkJeGxlbiA9IGxlbmd0aFhBRCh4YWQpOworCQkJCWRiVXBkYXRlUE1hcChpcGJtYXAsIEZBTFNFLCB4YWRkciwKKwkJCQkJICAgICAoczY0KSB4bGVuLCB0YmxrKTsKKwkJCQl4YWQtPmZsYWcgJj0gfihYQURfTkVXIHwgWEFEX0VYVEVOREVEKTsKKwkJCQlqZnNfaW5mbygiYWxsb2NQTWFwOiB4YWRkcjoweCVseCB4bGVuOiVkIiwKKwkJCQkJICh1bG9uZykgeGFkZHIsIHhsZW4pOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChtYXBsb2NrLT5mbGFnICYgbWxja0FMTE9DUFhEKSB7CisJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopIG1hcGxvY2s7CisJCXhhZGRyID0gYWRkcmVzc1BYRCgmcHhkbG9jay0+cHhkKTsKKwkJeGxlbiA9IGxlbmd0aFBYRCgmcHhkbG9jay0+cHhkKTsKKwkJZGJVcGRhdGVQTWFwKGlwYm1hcCwgRkFMU0UsIHhhZGRyLCAoczY0KSB4bGVuLCB0YmxrKTsKKwkJamZzX2luZm8oImFsbG9jUE1hcDogeGFkZHI6MHglbHggeGxlbjolZCIsICh1bG9uZykgeGFkZHIsIHhsZW4pOworCX0gZWxzZSB7CQkvKiAobWFwbG9jay0+ZmxhZyAmIG1sY2tBTExPQ1BYRExJU1QpICovCisKKwkJcHhkbGlzdGxvY2sgPSAoc3RydWN0IHhkbGlzdGxvY2sgKikgbWFwbG9jazsKKwkJcHhkID0gcHhkbGlzdGxvY2stPnhkbGlzdDsKKwkJZm9yIChuID0gMDsgbiA8IHB4ZGxpc3Rsb2NrLT5jb3VudDsgbisrLCBweGQrKykgeworCQkJeGFkZHIgPSBhZGRyZXNzUFhEKHB4ZCk7CisJCQl4bGVuID0gbGVuZ3RoUFhEKHB4ZCk7CisJCQlkYlVwZGF0ZVBNYXAoaXBibWFwLCBGQUxTRSwgeGFkZHIsIChzNjQpIHhsZW4sCisJCQkJICAgICB0YmxrKTsKKwkJCWpmc19pbmZvKCJhbGxvY1BNYXA6IHhhZGRyOjB4JWx4IHhsZW46JWQiLAorCQkJCSAodWxvbmcpIHhhZGRyLCB4bGVuKTsKKwkJfQorCX0KK30KKworCisvKgorICogICAgICB0eEZyZWVNYXAoKQorICoKKyAqIGZ1bmN0aW9uOiAgICBmcmVlIGZyb20gcGVyc2lzdGVudCBhbmQvb3Igd29ya2luZyBtYXA7CisgKgorICogdG9kbzogb3B0aW1pemF0aW9uCisgKi8KK3ZvaWQgdHhGcmVlTWFwKHN0cnVjdCBpbm9kZSAqaXAsCisJICAgICAgIHN0cnVjdCBtYXBsb2NrICogbWFwbG9jaywgc3RydWN0IHRibG9jayAqIHRibGssIGludCBtYXB0eXBlKQoreworCXN0cnVjdCBpbm9kZSAqaXBibWFwID0gSkZTX1NCSShpcC0+aV9zYiktPmlwYm1hcDsKKwlzdHJ1Y3QgeGRsaXN0bG9jayAqeGFkbGlzdGxvY2s7CisJeGFkX3QgKnhhZDsKKwlzNjQgeGFkZHI7CisJaW50IHhsZW47CisJc3RydWN0IHB4ZF9sb2NrICpweGRsb2NrOworCXN0cnVjdCB4ZGxpc3Rsb2NrICpweGRsaXN0bG9jazsKKwlweGRfdCAqcHhkOworCWludCBuOworCisJamZzX2luZm8oInR4RnJlZU1hcDogdGJsazoweCVwIG1hcGxvY2s6MHglcCBtYXB0eXBlOjB4JXgiLAorCQkgdGJsaywgbWFwbG9jaywgbWFwdHlwZSk7CisKKwkvKgorCSAqIGZyZWUgZnJvbSBwZXJzaXN0ZW50IG1hcDsKKwkgKi8KKwlpZiAobWFwdHlwZSA9PSBDT01NSVRfUE1BUCB8fCBtYXB0eXBlID09IENPTU1JVF9QV01BUCkgeworCQlpZiAobWFwbG9jay0+ZmxhZyAmIG1sY2tGUkVFWEFETElTVCkgeworCQkJeGFkbGlzdGxvY2sgPSAoc3RydWN0IHhkbGlzdGxvY2sgKikgbWFwbG9jazsKKwkJCXhhZCA9IHhhZGxpc3Rsb2NrLT54ZGxpc3Q7CisJCQlmb3IgKG4gPSAwOyBuIDwgeGFkbGlzdGxvY2stPmNvdW50OyBuKyssIHhhZCsrKSB7CisJCQkJaWYgKCEoeGFkLT5mbGFnICYgWEFEX05FVykpIHsKKwkJCQkJeGFkZHIgPSBhZGRyZXNzWEFEKHhhZCk7CisJCQkJCXhsZW4gPSBsZW5ndGhYQUQoeGFkKTsKKwkJCQkJZGJVcGRhdGVQTWFwKGlwYm1hcCwgVFJVRSwgeGFkZHIsCisJCQkJCQkgICAgIChzNjQpIHhsZW4sIHRibGspOworCQkJCQlqZnNfaW5mbygiZnJlZVBNYXA6IHhhZGRyOjB4JWx4ICIKKwkJCQkJCSAieGxlbjolZCIsCisJCQkJCQkgKHVsb25nKSB4YWRkciwgeGxlbik7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKG1hcGxvY2stPmZsYWcgJiBtbGNrRlJFRVBYRCkgeworCQkJcHhkbG9jayA9IChzdHJ1Y3QgcHhkX2xvY2sgKikgbWFwbG9jazsKKwkJCXhhZGRyID0gYWRkcmVzc1BYRCgmcHhkbG9jay0+cHhkKTsKKwkJCXhsZW4gPSBsZW5ndGhQWEQoJnB4ZGxvY2stPnB4ZCk7CisJCQlkYlVwZGF0ZVBNYXAoaXBibWFwLCBUUlVFLCB4YWRkciwgKHM2NCkgeGxlbiwKKwkJCQkgICAgIHRibGspOworCQkJamZzX2luZm8oImZyZWVQTWFwOiB4YWRkcjoweCVseCB4bGVuOiVkIiwKKwkJCQkgKHVsb25nKSB4YWRkciwgeGxlbik7CisJCX0gZWxzZSB7CS8qIChtYXBsb2NrLT5mbGFnICYgbWxja0FMTE9DUFhETElTVCkgKi8KKworCQkJcHhkbGlzdGxvY2sgPSAoc3RydWN0IHhkbGlzdGxvY2sgKikgbWFwbG9jazsKKwkJCXB4ZCA9IHB4ZGxpc3Rsb2NrLT54ZGxpc3Q7CisJCQlmb3IgKG4gPSAwOyBuIDwgcHhkbGlzdGxvY2stPmNvdW50OyBuKyssIHB4ZCsrKSB7CisJCQkJeGFkZHIgPSBhZGRyZXNzUFhEKHB4ZCk7CisJCQkJeGxlbiA9IGxlbmd0aFBYRChweGQpOworCQkJCWRiVXBkYXRlUE1hcChpcGJtYXAsIFRSVUUsIHhhZGRyLAorCQkJCQkgICAgIChzNjQpIHhsZW4sIHRibGspOworCQkJCWpmc19pbmZvKCJmcmVlUE1hcDogeGFkZHI6MHglbHggeGxlbjolZCIsCisJCQkJCSAodWxvbmcpIHhhZGRyLCB4bGVuKTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogZnJlZSBmcm9tIHdvcmtpbmcgbWFwOworCSAqLworCWlmIChtYXB0eXBlID09IENPTU1JVF9QV01BUCB8fCBtYXB0eXBlID09IENPTU1JVF9XTUFQKSB7CisJCWlmIChtYXBsb2NrLT5mbGFnICYgbWxja0ZSRUVYQURMSVNUKSB7CisJCQl4YWRsaXN0bG9jayA9IChzdHJ1Y3QgeGRsaXN0bG9jayAqKSBtYXBsb2NrOworCQkJeGFkID0geGFkbGlzdGxvY2stPnhkbGlzdDsKKwkJCWZvciAobiA9IDA7IG4gPCB4YWRsaXN0bG9jay0+Y291bnQ7IG4rKywgeGFkKyspIHsKKwkJCQl4YWRkciA9IGFkZHJlc3NYQUQoeGFkKTsKKwkJCQl4bGVuID0gbGVuZ3RoWEFEKHhhZCk7CisJCQkJZGJGcmVlKGlwLCB4YWRkciwgKHM2NCkgeGxlbik7CisJCQkJeGFkLT5mbGFnID0gMDsKKwkJCQlqZnNfaW5mbygiZnJlZVdNYXA6IHhhZGRyOjB4JWx4IHhsZW46JWQiLAorCQkJCQkgKHVsb25nKSB4YWRkciwgeGxlbik7CisJCQl9CisJCX0gZWxzZSBpZiAobWFwbG9jay0+ZmxhZyAmIG1sY2tGUkVFUFhEKSB7CisJCQlweGRsb2NrID0gKHN0cnVjdCBweGRfbG9jayAqKSBtYXBsb2NrOworCQkJeGFkZHIgPSBhZGRyZXNzUFhEKCZweGRsb2NrLT5weGQpOworCQkJeGxlbiA9IGxlbmd0aFBYRCgmcHhkbG9jay0+cHhkKTsKKwkJCWRiRnJlZShpcCwgeGFkZHIsIChzNjQpIHhsZW4pOworCQkJamZzX2luZm8oImZyZWVXTWFwOiB4YWRkcjoweCVseCB4bGVuOiVkIiwKKwkJCQkgKHVsb25nKSB4YWRkciwgeGxlbik7CisJCX0gZWxzZSB7CS8qIChtYXBsb2NrLT5mbGFnICYgbWxja0ZSRUVQWERMSVNUKSAqLworCisJCQlweGRsaXN0bG9jayA9IChzdHJ1Y3QgeGRsaXN0bG9jayAqKSBtYXBsb2NrOworCQkJcHhkID0gcHhkbGlzdGxvY2stPnhkbGlzdDsKKwkJCWZvciAobiA9IDA7IG4gPCBweGRsaXN0bG9jay0+Y291bnQ7IG4rKywgcHhkKyspIHsKKwkJCQl4YWRkciA9IGFkZHJlc3NQWEQocHhkKTsKKwkJCQl4bGVuID0gbGVuZ3RoUFhEKHB4ZCk7CisJCQkJZGJGcmVlKGlwLCB4YWRkciwgKHM2NCkgeGxlbik7CisJCQkJamZzX2luZm8oImZyZWVXTWFwOiB4YWRkcjoweCVseCB4bGVuOiVkIiwKKwkJCQkJICh1bG9uZykgeGFkZHIsIHhsZW4pOworCQkJfQorCQl9CisJfQorfQorCisKKy8qCisgKiAgICAgIHR4RnJlZWxvY2soKQorICoKKyAqIGZ1bmN0aW9uOiAgICByZW1vdmUgdGxvY2sgZnJvbSBpbm9kZSBhbm9ueW1vdXMgbG9ja2xpc3QKKyAqLwordm9pZCB0eEZyZWVsb2NrKHN0cnVjdCBpbm9kZSAqaXApCit7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqZnNfaXAgPSBKRlNfSVAoaXApOworCXN0cnVjdCB0bG9jayAqeHRsY2ssICp0bGNrOworCWxpZF90IHhsaWQgPSAwLCBsaWQ7CisKKwlpZiAoIWpmc19pcC0+YXRsaGVhZCkKKwkJcmV0dXJuOworCisJVFhOX0xPQ0soKTsKKwl4dGxjayA9IChzdHJ1Y3QgdGxvY2sgKikgJmpmc19pcC0+YXRsaGVhZDsKKworCXdoaWxlICgobGlkID0geHRsY2stPm5leHQpICE9IDApIHsKKwkJdGxjayA9IGxpZF90b190bG9jayhsaWQpOworCQlpZiAodGxjay0+ZmxhZyAmIHRsY2tGUkVFTE9DSykgeworCQkJeHRsY2stPm5leHQgPSB0bGNrLT5uZXh0OworCQkJdHhMb2NrRnJlZShsaWQpOworCQl9IGVsc2UgeworCQkJeHRsY2sgPSB0bGNrOworCQkJeGxpZCA9IGxpZDsKKwkJfQorCX0KKworCWlmIChqZnNfaXAtPmF0bGhlYWQpCisJCWpmc19pcC0+YXRsdGFpbCA9IHhsaWQ7CisJZWxzZSB7CisJCWpmc19pcC0+YXRsdGFpbCA9IDA7CisJCS8qCisJCSAqIElmIGlub2RlIHdhcyBvbiBhbm9uX2xpc3QsIHJlbW92ZSBpdAorCQkgKi8KKwkJbGlzdF9kZWxfaW5pdCgmamZzX2lwLT5hbm9uX2lub2RlX2xpc3QpOworCX0KKwlUWE5fVU5MT0NLKCk7Cit9CisKKworLyoKKyAqICAgICAgdHhBYm9ydCgpCisgKgorICogZnVuY3Rpb246IGFib3J0IHR4IGJlZm9yZSBjb21taXQ7CisgKgorICogZnJlZXMgbGluZS1sb2NrcyBhbmQgc2VnbWVudCBsb2NrcyBmb3IgYWxsCisgKiBzZWdtZW50cyBpbiBjb21kYXRhIHN0cnVjdHVyZS4KKyAqIE9wdGlvbmFsbHkgc2V0cyBzdGF0ZSBvZiBmaWxlLXN5c3RlbSB0byBGTV9ESVJUWSBpbiBzdXBlci1ibG9jay4KKyAqIGxvZyBhZ2Ugb2YgcGFnZS1mcmFtZXMgaW4gbWVtb3J5IGZvciB3aGljaCBjYWxsZXIgaGFzCisgKiBhcmUgcmVzZXQgdG8gMCAodG8gYXZvaWQgbG9nd2FyYXApLgorICovCit2b2lkIHR4QWJvcnQodGlkX3QgdGlkLCBpbnQgZGlydHkpCit7CisJbGlkX3QgbGlkLCBuZXh0OworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJc3RydWN0IHRibG9jayAqdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisKKwkvKgorCSAqIGZyZWUgdGxvY2tzIG9mIHRoZSB0cmFuc2FjdGlvbgorCSAqLworCWZvciAobGlkID0gdGJsay0+bmV4dDsgbGlkOyBsaWQgPSBuZXh0KSB7CisJCXRsY2sgPSBsaWRfdG9fdGxvY2sobGlkKTsKKwkJbmV4dCA9IHRsY2stPm5leHQ7CisJCW1wID0gdGxjay0+bXA7CisJCUpGU19JUCh0bGNrLT5pcCktPnh0bGlkID0gMDsKKworCQlpZiAobXApIHsKKwkJCW1wLT5saWQgPSAwOworCisJCQkvKgorCQkJICogcmVzZXQgbHNuIG9mIHBhZ2UgdG8gYXZvaWQgbG9nd2FyYXA6CisJCQkgKgorCQkJICogKHBhZ2UgbWF5IGhhdmUgYmVlbiBwcmV2aW91c2x5IGNvbW1pdHRlZCBieSBhbm90aGVyCisJCQkgKiB0cmFuc2FjdGlvbihzKSBidXQgaGFzIG5vdCBiZWVuIHBhZ2VkLCBpLmUuLAorCQkJICogaXQgbWF5IGJlIG9uIGxvZ3N5bmMgbGlzdCBldmVuIHRob3VnaCBpdCBoYXMgbm90CisJCQkgKiBiZWVuIGxvZ2dlZCBmb3IgdGhlIGN1cnJlbnQgdHguKQorCQkJICovCisJCQlpZiAobXAtPnhmbGFnICYgQ09NTUlUX1BBR0UgJiYgbXAtPmxzbikKKwkJCQlMb2dTeW5jUmVsZWFzZShtcCk7CisJCX0KKwkJLyogaW5zZXJ0IHRsb2NrIGF0IGhlYWQgb2YgZnJlZWxpc3QgKi8KKwkJVFhOX0xPQ0soKTsKKwkJdHhMb2NrRnJlZShsaWQpOworCQlUWE5fVU5MT0NLKCk7CisJfQorCisJLyogY2FsbGVyIHdpbGwgZnJlZSB0aGUgdHJhbnNhY3Rpb24gYmxvY2sgKi8KKworCXRibGstPm5leHQgPSB0YmxrLT5sYXN0ID0gMDsKKworCS8qCisJICogbWFyayBmaWxlc3lzdGVtIGRpcnR5CisJICovCisJaWYgKGRpcnR5KQorCQlqZnNfZXJyb3IodGJsay0+c2IsICJ0eEFib3J0Iik7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiAgICAgIHR4TGF6eUNvbW1pdCh2b2lkKQorICoKKyAqCUFsbCB0cmFuc2FjdGlvbnMgZXhjZXB0IHRob3NlIGNoYW5naW5nIGlwaW1hcCAoQ09NTUlUX0ZPUkNFKSBhcmUKKyAqCXByb2Nlc3NlZCBieSB0aGlzIHJvdXRpbmUuICBUaGlzIGluc3VyZXMgdGhhdCB0aGUgaW5vZGUgYW5kIGJsb2NrCisgKglhbGxvY2F0aW9uIG1hcHMgYXJlIHVwZGF0ZWQgaW4gb3JkZXIuICBGb3Igc3luY2hyb25vdXMgdHJhbnNhY3Rpb25zLAorICoJbGV0IHRoZSB1c2VyIHRocmVhZCBmaW5pc2ggcHJvY2Vzc2luZyBhZnRlciB0eFVwZGF0ZU1hcCgpIGlzIGNhbGxlZC4KKyAqLworc3RhdGljIHZvaWQgdHhMYXp5Q29tbWl0KHN0cnVjdCB0YmxvY2sgKiB0YmxrKQoreworCXN0cnVjdCBqZnNfbG9nICpsb2c7CisKKwl3aGlsZSAoKCh0YmxrLT5mbGFnICYgdGJsa0dDX1JFQURZKSA9PSAwKSAmJgorCSAgICAgICAoKHRibGstPmZsYWcgJiB0YmxrR0NfVU5MT0NLRUQpID09IDApKSB7CisJCS8qIFdlIG11c3QgaGF2ZSBnb3R0ZW4gYWhlYWQgb2YgdGhlIHVzZXIgdGhyZWFkCisJCSAqLworCQlqZnNfaW5mbygiamZzX2xhenljb21taXQ6IHRibGsgMHglcCBub3QgdW5sb2NrZWQiLCB0YmxrKTsKKwkJeWllbGQoKTsKKwl9CisKKwlqZnNfaW5mbygidHhMYXp5Q29tbWl0OiBwcm9jZXNzaW5nIHRibGsgMHglcCIsIHRibGspOworCisJdHhVcGRhdGVNYXAodGJsayk7CisKKwlsb2cgPSAoc3RydWN0IGpmc19sb2cgKikgSkZTX1NCSSh0YmxrLT5zYiktPmxvZzsKKworCXNwaW5fbG9ja19pcnEoJmxvZy0+Z2Nsb2NrKTsJLy8gTE9HR0NfTE9DSworCisJdGJsay0+ZmxhZyB8PSB0YmxrR0NfQ09NTUlUVEVEOworCisJaWYgKHRibGstPmZsYWcgJiB0YmxrR0NfUkVBRFkpCisJCWxvZy0+Z2NydGMtLTsKKworCXdha2VfdXBfYWxsKCZ0YmxrLT5nY3dhaXQpOwkvLyBMT0dHQ19XQUtFVVAKKworCS8qCisJICogQ2FuJ3QgcmVsZWFzZSBsb2ctPmdjbG9jayB1bnRpbCB3ZSd2ZSB0ZXN0ZWQgdGJsay0+ZmxhZworCSAqLworCWlmICh0YmxrLT5mbGFnICYgdGJsa0dDX0xBWlkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZsb2ctPmdjbG9jayk7CS8vIExPR0dDX1VOTE9DSworCQl0eFVubG9jayh0YmxrKTsKKwkJdGJsay0+ZmxhZyAmPSB+dGJsa0dDX0xBWlk7CisJCXR4RW5kKHRibGsgLSBUeEJsb2NrKTsJLyogQ29udmVydCBiYWNrIHRvIHRpZCAqLworCX0gZWxzZQorCQlzcGluX3VubG9ja19pcnEoJmxvZy0+Z2Nsb2NrKTsJLy8gTE9HR0NfVU5MT0NLCisKKwlqZnNfaW5mbygidHhMYXp5Q29tbWl0OiBkb25lOiB0YmxrID0gMHglcCIsIHRibGspOworfQorCisvKgorICogICAgICBqZnNfbGF6eWNvbW1pdCh2b2lkKQorICoKKyAqCVRvIGJlIHJ1biBhcyBhIGtlcm5lbCBkYWVtb24uICBJZiBsYm1JT0RvbmUgaXMgY2FsbGVkIGluIGFuIGludGVycnVwdAorICoJY29udGV4dCwgb3Igd2hlcmUgYmxvY2tpbmcgaXMgbm90IHdhbnRlZCwgdGhpcyByb3V0aW5lIHdpbGwgcHJvY2VzcworICoJY29tbWl0dGVkIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSB1bmxvY2sgcXVldWUuCisgKi8KK2ludCBqZnNfbGF6eWNvbW1pdCh2b2lkICphcmcpCit7CisJaW50IFdvcmtEb25lOworCXN0cnVjdCB0YmxvY2sgKnRibGs7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaTsKKworCWRhZW1vbml6ZSgiamZzQ29tbWl0Iik7CisKKwljb21wbGV0ZSgmamZzSU93YWl0KTsKKworCWRvIHsKKwkJTEFaWV9MT0NLKGZsYWdzKTsKKwkJamZzX2NvbW1pdF90aHJlYWRfd2FraW5nID0gMDsJLyogT0sgdG8gd2FrZSBhbm90aGVyIHRocmVhZCAqLworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJlR4QW5jaG9yLnVubG9ja19xdWV1ZSkpIHsKKwkJCVdvcmtEb25lID0gMDsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkodGJsaywgJlR4QW5jaG9yLnVubG9ja19xdWV1ZSwKKwkJCQkJICAgIGNxdWV1ZSkgeworCisJCQkJc2JpID0gSkZTX1NCSSh0YmxrLT5zYik7CisJCQkJLyoKKwkJCQkgKiBGb3IgZWFjaCB2b2x1bWUsIHRoZSB0cmFuc2FjdGlvbnMgbXVzdCBiZQorCQkJCSAqIGhhbmRsZWQgaW4gb3JkZXIuICBJZiBhbm90aGVyIGNvbW1pdCB0aHJlYWQKKwkJCQkgKiBpcyBoYW5kbGluZyBhIHRibGsgZm9yIHRoaXMgc3VwZXJibG9jaywKKwkJCQkgKiBza2lwIGl0CisJCQkJICovCisJCQkJaWYgKHNiaS0+Y29tbWl0X3N0YXRlICYgSU5fTEFaWUNPTU1JVCkKKwkJCQkJY29udGludWU7CisKKwkJCQlzYmktPmNvbW1pdF9zdGF0ZSB8PSBJTl9MQVpZQ09NTUlUOworCQkJCVdvcmtEb25lID0gMTsKKworCQkJCS8qCisJCQkJICogUmVtb3ZlIHRyYW5zYWN0aW9uIGZyb20gcXVldWUKKwkJCQkgKi8KKwkJCQlsaXN0X2RlbCgmdGJsay0+Y3F1ZXVlKTsKKworCQkJCUxBWllfVU5MT0NLKGZsYWdzKTsKKwkJCQl0eExhenlDb21taXQodGJsayk7CisJCQkJTEFaWV9MT0NLKGZsYWdzKTsKKworCQkJCXNiaS0+Y29tbWl0X3N0YXRlICY9IH5JTl9MQVpZQ09NTUlUOworCQkJCS8qCisJCQkJICogRG9uJ3QgY29udGludWUgaW4gdGhlIGZvciBsb29wLiAgKFdlIGNhbid0CisJCQkJICogYW55d2F5LCBpdCdzIHVuc2FmZSEpICBXZSB3YW50IHRvIGdvIGJhY2sgdG8KKwkJCQkgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LgorCQkJCSAqLworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBJZiB0aGVyZSB3YXMgbm90aGluZyB0byBkbywgZG9uJ3QgY29udGludWUgKi8KKwkJCWlmICghV29ya0RvbmUpCisJCQkJYnJlYWs7CisJCX0KKwkJLyogSW4gY2FzZSBhIHdha2V1cCBjYW1lIHdoaWxlIGFsbCB0aHJlYWRzIHdlcmUgYWN0aXZlICovCisJCWpmc19jb21taXRfdGhyZWFkX3dha2luZyA9IDA7CisKKwkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKSB7CisJCQlMQVpZX1VOTE9DSyhmbGFncyk7CisJCQlyZWZyaWdlcmF0b3IoUEZfRlJFRVpFKTsKKwkJfSBlbHNlIHsKKwkJCURFQ0xBUkVfV0FJVFFVRVVFKHdxLCBjdXJyZW50KTsKKworCQkJYWRkX3dhaXRfcXVldWUoJmpmc19jb21taXRfdGhyZWFkX3dhaXQsICZ3cSk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJTEFaWV9VTkxPQ0soZmxhZ3MpOworCQkJc2NoZWR1bGUoKTsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmpmc19jb21taXRfdGhyZWFkX3dhaXQsICZ3cSk7CisJCX0KKwl9IHdoaWxlICghamZzX3N0b3BfdGhyZWFkcyk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJlR4QW5jaG9yLnVubG9ja19xdWV1ZSkpCisJCWpmc19lcnIoImpmc19sYXp5Y29tbWl0IGJlaW5nIGtpbGxlZCB3L3BlbmRpbmcgdHJhbnNhY3Rpb25zISIpOworCWVsc2UKKwkJamZzX2luZm8oImpmc19sYXp5Y29tbWl0IGJlaW5nIGtpbGxlZFxuIik7CisJY29tcGxldGVfYW5kX2V4aXQoJmpmc0lPd2FpdCwgMCk7Cit9CisKK3ZvaWQgdHhMYXp5VW5sb2NrKHN0cnVjdCB0YmxvY2sgKiB0YmxrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlMQVpZX0xPQ0soZmxhZ3MpOworCisJbGlzdF9hZGRfdGFpbCgmdGJsay0+Y3F1ZXVlLCAmVHhBbmNob3IudW5sb2NrX3F1ZXVlKTsKKwkvKgorCSAqIERvbid0IHdha2UgdXAgYSBjb21taXQgdGhyZWFkIGlmIHRoZXJlIGlzIGFscmVhZHkgb25lIHNlcnZpY2luZworCSAqIHRoaXMgc3VwZXJibG9jaywgb3IgaWYgdGhlIGxhc3Qgb25lIHdlIHdva2UgdXAgaGFzbid0IHN0YXJ0ZWQgeWV0LgorCSAqLworCWlmICghKEpGU19TQkkodGJsay0+c2IpLT5jb21taXRfc3RhdGUgJiBJTl9MQVpZQ09NTUlUKSAmJgorCSAgICAhamZzX2NvbW1pdF90aHJlYWRfd2FraW5nKSB7CisJCWpmc19jb21taXRfdGhyZWFkX3dha2luZyA9IDE7CisJCXdha2VfdXAoJmpmc19jb21taXRfdGhyZWFkX3dhaXQpOworCX0KKwlMQVpZX1VOTE9DSyhmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIExvZ1N5bmNSZWxlYXNlKHN0cnVjdCBtZXRhcGFnZSAqIG1wKQoreworCXN0cnVjdCBqZnNfbG9nICpsb2cgPSBtcC0+bG9nOworCisJYXNzZXJ0KGF0b21pY19yZWFkKCZtcC0+bm9ob21lb2spKTsKKwlhc3NlcnQobG9nKTsKKwlhdG9taWNfZGVjKCZtcC0+bm9ob21lb2spOworCisJaWYgKGF0b21pY19yZWFkKCZtcC0+bm9ob21lb2spKQorCQlyZXR1cm47CisKKwlob2xkX21ldGFwYWdlKG1wLCAwKTsKKworCUxPR1NZTkNfTE9DSyhsb2cpOworCW1wLT5sb2cgPSBOVUxMOworCW1wLT5sc24gPSAwOworCW1wLT5jbHNuID0gMDsKKwlsb2ctPmNvdW50LS07CisJbGlzdF9kZWxfaW5pdCgmbXAtPnN5bmNsaXN0KTsKKwlMT0dTWU5DX1VOTE9DSyhsb2cpOworCisJcmVsZWFzZV9tZXRhcGFnZShtcCk7Cit9CisKKy8qCisgKgl0eFF1aWVzY2UKKyAqCisgKglCbG9jayBhbGwgbmV3IHRyYW5zYWN0aW9ucyBhbmQgcHVzaCBhbm9ueW1vdXMgdHJhbnNhY3Rpb25zIHRvCisgKgljb21wbGV0aW9uCisgKgorICoJVGhpcyBkb2VzIGFsbW9zdCB0aGUgc2FtZSB0aGluZyBhcyBqZnNfc3luYyBiZWxvdy4gIFdlIGRvbid0CisgKgl3b3JyeSBhYm91dCBkZWFkbG9ja2luZyB3aGVuIGpmc190bG9ja3NfbG93IGlzIHNldCwgc2luY2Ugd2Ugd291bGQKKyAqCWV4cGVjdCBqZnNfc3luYyB0byBnZXQgdXMgb3V0IG9mIHRoYXQgamFtLgorICovCit2b2lkIHR4UXVpZXNjZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBpbm9kZSAqaXA7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqZnNfaXA7CisJc3RydWN0IGpmc19sb2cgKmxvZyA9IEpGU19TQkkoc2IpLT5sb2c7CisJdGlkX3QgdGlkOworCisJc2V0X2JpdChsb2dfUVVJRVNDRSwgJmxvZy0+ZmxhZyk7CisKKwlUWE5fTE9DSygpOworcmVzdGFydDoKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJlR4QW5jaG9yLmFub25fbGlzdCkpIHsKKwkJamZzX2lwID0gbGlzdF9lbnRyeShUeEFuY2hvci5hbm9uX2xpc3QubmV4dCwKKwkJCQkgICAgc3RydWN0IGpmc19pbm9kZV9pbmZvLAorCQkJCSAgICBhbm9uX2lub2RlX2xpc3QpOworCQlpcCA9ICZqZnNfaXAtPnZmc19pbm9kZTsKKworCQkvKgorCQkgKiBpbm9kZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSBhbm9ueW1vdXMgbGlzdAorCQkgKiB3aGVuIGl0IGlzIGNvbW1pdHRlZAorCQkgKi8KKwkJVFhOX1VOTE9DSygpOworCQl0aWQgPSB0eEJlZ2luKGlwLT5pX3NiLCBDT01NSVRfSU5PREUgfCBDT01NSVRfRk9SQ0UpOworCQlkb3duKCZqZnNfaXAtPmNvbW1pdF9zZW0pOworCQl0eENvbW1pdCh0aWQsIDEsICZpcCwgMCk7CisJCXR4RW5kKHRpZCk7CisJCXVwKCZqZnNfaXAtPmNvbW1pdF9zZW0pOworCQkvKgorCQkgKiBKdXN0IHRvIGJlIHNhZmUuICBJIGRvbid0IGtub3cgaG93CisJCSAqIGxvbmcgd2UgY2FuIHJ1biB3aXRob3V0IGJsb2NraW5nCisJCSAqLworCQljb25kX3Jlc2NoZWQoKTsKKwkJVFhOX0xPQ0soKTsKKwl9CisKKwkvKgorCSAqIElmIGpmc19zeW5jIGlzIHJ1bm5pbmcgaW4gcGFyYWxsZWwsIHRoZXJlIGNvdWxkIGJlIHNvbWUgaW5vZGVzCisJICogb24gYW5vbl9saXN0Mi4gIExldCdzIGNoZWNrLgorCSAqLworCWlmICghbGlzdF9lbXB0eSgmVHhBbmNob3IuYW5vbl9saXN0MikpIHsKKwkJbGlzdF9zcGxpY2UoJlR4QW5jaG9yLmFub25fbGlzdDIsICZUeEFuY2hvci5hbm9uX2xpc3QpOworCQlJTklUX0xJU1RfSEVBRCgmVHhBbmNob3IuYW5vbl9saXN0Mik7CisJCWdvdG8gcmVzdGFydDsKKwl9CisJVFhOX1VOTE9DSygpOworCisJLyoKKwkgKiBXZSBtYXkgbmVlZCB0byBraWNrIG9mZiB0aGUgZ3JvdXAgY29tbWl0CisJICovCisJamZzX2ZsdXNoX2pvdXJuYWwobG9nLCAwKTsKK30KKworLyoKKyAqIHR4UmVzdW1lKCkKKyAqCisgKiBBbGxvd3MgdHJhbnNhY3Rpb25zIHRvIHN0YXJ0IGFnYWluIGZvbGxvd2luZyB0eFF1aWVzY2UKKyAqLwordm9pZCB0eFJlc3VtZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBqZnNfbG9nICpsb2cgPSBKRlNfU0JJKHNiKS0+bG9nOworCisJY2xlYXJfYml0KGxvZ19RVUlFU0NFLCAmbG9nLT5mbGFnKTsKKwlUWE5fV0FLRVVQKCZsb2ctPnN5bmN3YWl0KTsKK30KKworLyoKKyAqICAgICAgamZzX3N5bmModm9pZCkKKyAqCisgKglUbyBiZSBydW4gYXMgYSBrZXJuZWwgZGFlbW9uLiAgVGhpcyBpcyBhd2FrZW5lZCB3aGVuIHRsb2NrcyBydW4gbG93LgorICoJV2Ugd3JpdGUgYW55IGlub2RlcyB0aGF0IGhhdmUgYW5vbnltb3VzIHRsb2NrcyBzbyB0aGV5IHdpbGwgYmVjb21lCisgKglhdmFpbGFibGUuCisgKi8KK2ludCBqZnNfc3luYyh2b2lkICphcmcpCit7CisJc3RydWN0IGlub2RlICppcDsKKwlzdHJ1Y3QgamZzX2lub2RlX2luZm8gKmpmc19pcDsKKwlpbnQgcmM7CisJdGlkX3QgdGlkOworCisJZGFlbW9uaXplKCJqZnNTeW5jIik7CisKKwljb21wbGV0ZSgmamZzSU93YWl0KTsKKworCWRvIHsKKwkJLyoKKwkJICogd3JpdGUgZWFjaCBpbm9kZSBvbiB0aGUgYW5vbnltb3VzIGlub2RlIGxpc3QKKwkJICovCisJCVRYTl9MT0NLKCk7CisJCXdoaWxlIChqZnNfdGxvY2tzX2xvdyAmJiAhbGlzdF9lbXB0eSgmVHhBbmNob3IuYW5vbl9saXN0KSkgeworCQkJamZzX2lwID0gbGlzdF9lbnRyeShUeEFuY2hvci5hbm9uX2xpc3QubmV4dCwKKwkJCQkJICAgIHN0cnVjdCBqZnNfaW5vZGVfaW5mbywKKwkJCQkJICAgIGFub25faW5vZGVfbGlzdCk7CisJCQlpcCA9ICZqZnNfaXAtPnZmc19pbm9kZTsKKworCQkJaWYgKCEgaWdyYWIoaXApKSB7CisJCQkJLyoKKwkJCQkgKiBJbm9kZSBpcyBiZWluZyBmcmVlZAorCQkJCSAqLworCQkJCWxpc3RfZGVsX2luaXQoJmpmc19pcC0+YW5vbl9pbm9kZV9saXN0KTsKKwkJCX0gZWxzZSBpZiAoISBkb3duX3RyeWxvY2soJmpmc19pcC0+Y29tbWl0X3NlbSkpIHsKKwkJCQkvKgorCQkJCSAqIGlub2RlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGFub255bW91cyBsaXN0CisJCQkJICogd2hlbiBpdCBpcyBjb21taXR0ZWQKKwkJCQkgKi8KKwkJCQlUWE5fVU5MT0NLKCk7CisJCQkJdGlkID0gdHhCZWdpbihpcC0+aV9zYiwgQ09NTUlUX0lOT0RFKTsKKwkJCQlyYyA9IHR4Q29tbWl0KHRpZCwgMSwgJmlwLCAwKTsKKwkJCQl0eEVuZCh0aWQpOworCQkJCXVwKCZqZnNfaXAtPmNvbW1pdF9zZW0pOworCisJCQkJaXB1dChpcCk7CisJCQkJLyoKKwkJCQkgKiBKdXN0IHRvIGJlIHNhZmUuICBJIGRvbid0IGtub3cgaG93CisJCQkJICogbG9uZyB3ZSBjYW4gcnVuIHdpdGhvdXQgYmxvY2tpbmcKKwkJCQkgKi8KKwkJCQljb25kX3Jlc2NoZWQoKTsKKwkJCQlUWE5fTE9DSygpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBXZSBjYW4ndCBnZXQgdGhlIGNvbW1pdCBzZW1hcGhvcmUuICBJdCBtYXkKKwkJCQkgKiBiZSBoZWxkIGJ5IGEgdGhyZWFkIHdhaXRpbmcgZm9yIHRsb2NrJ3MKKwkJCQkgKiBzbyBsZXQncyBub3QgYmxvY2sgaGVyZS4gIFNhdmUgaXQgdG8KKwkJCQkgKiBwdXQgYmFjayBvbiB0aGUgYW5vbl9saXN0LgorCQkJCSAqLworCisJCQkJLyogVGFrZSBvZmYgYW5vbl9saXN0ICovCisJCQkJbGlzdF9kZWwoJmpmc19pcC0+YW5vbl9pbm9kZV9saXN0KTsKKworCQkJCS8qIFB1dCBvbiBhbm9uX2xpc3QyICovCisJCQkJbGlzdF9hZGQoJmpmc19pcC0+YW5vbl9pbm9kZV9saXN0LAorCQkJCQkgJlR4QW5jaG9yLmFub25fbGlzdDIpOworCisJCQkJVFhOX1VOTE9DSygpOworCQkJCWlwdXQoaXApOworCQkJCVRYTl9MT0NLKCk7CisJCQl9CisJCX0KKwkJLyogQWRkIGFub25fbGlzdDIgYmFjayB0byBhbm9uX2xpc3QgKi8KKwkJbGlzdF9zcGxpY2VfaW5pdCgmVHhBbmNob3IuYW5vbl9saXN0MiwgJlR4QW5jaG9yLmFub25fbGlzdCk7CisKKwkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKSB7CisJCQlUWE5fVU5MT0NLKCk7CisJCQlyZWZyaWdlcmF0b3IoUEZfRlJFRVpFKTsKKwkJfSBlbHNlIHsKKwkJCURFQ0xBUkVfV0FJVFFVRVVFKHdxLCBjdXJyZW50KTsKKworCQkJYWRkX3dhaXRfcXVldWUoJmpmc19zeW5jX3RocmVhZF93YWl0LCAmd3EpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCVRYTl9VTkxPQ0soKTsKKwkJCXNjaGVkdWxlKCk7CisJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKCZqZnNfc3luY190aHJlYWRfd2FpdCwgJndxKTsKKwkJfQorCX0gd2hpbGUgKCFqZnNfc3RvcF90aHJlYWRzKTsKKworCWpmc19pbmZvKCJqZnNfc3luYyBiZWluZyBraWxsZWQiKTsKKwljb21wbGV0ZV9hbmRfZXhpdCgmamZzSU93YWl0LCAwKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIGRlZmluZWQoQ09ORklHX0pGU19ERUJVRykKK2ludCBqZnNfdHhhbmNob3JfcmVhZChjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorCQkgICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gMDsKKwlvZmZfdCBiZWdpbjsKKwljaGFyICpmcmVld2FpdDsKKwljaGFyICpmcmVlbG9ja3dhaXQ7CisJY2hhciAqbG93bG9ja3dhaXQ7CisKKwlmcmVld2FpdCA9CisJICAgIHdhaXRxdWV1ZV9hY3RpdmUoJlR4QW5jaG9yLmZyZWV3YWl0KSA/ICJhY3RpdmUiIDogImVtcHR5IjsKKwlmcmVlbG9ja3dhaXQgPQorCSAgICB3YWl0cXVldWVfYWN0aXZlKCZUeEFuY2hvci5mcmVlbG9ja3dhaXQpID8gImFjdGl2ZSIgOiAiZW1wdHkiOworCWxvd2xvY2t3YWl0ID0KKwkgICAgd2FpdHF1ZXVlX2FjdGl2ZSgmVHhBbmNob3IubG93bG9ja3dhaXQpID8gImFjdGl2ZSIgOiAiZW1wdHkiOworCisJbGVuICs9IHNwcmludGYoYnVmZmVyLAorCQkgICAgICAgIkpGUyBUeEFuY2hvclxuIgorCQkgICAgICAgIj09PT09PT09PT09PVxuIgorCQkgICAgICAgImZyZWV0aWQgPSAlZFxuIgorCQkgICAgICAgImZyZWV3YWl0ID0gJXNcbiIKKwkJICAgICAgICJmcmVlbG9jayA9ICVkXG4iCisJCSAgICAgICAiZnJlZWxvY2t3YWl0ID0gJXNcbiIKKwkJICAgICAgICJsb3dsb2Nrd2FpdCA9ICVzXG4iCisJCSAgICAgICAidGxvY2tzSW5Vc2UgPSAlZFxuIgorCQkgICAgICAgImpmc190bG9ja3NfbG93ID0gJWRcbiIKKwkJICAgICAgICJ1bmxvY2tfcXVldWUgaXMgJXNlbXB0eVxuIiwKKwkJICAgICAgIFR4QW5jaG9yLmZyZWV0aWQsCisJCSAgICAgICBmcmVld2FpdCwKKwkJICAgICAgIFR4QW5jaG9yLmZyZWVsb2NrLAorCQkgICAgICAgZnJlZWxvY2t3YWl0LAorCQkgICAgICAgbG93bG9ja3dhaXQsCisJCSAgICAgICBUeEFuY2hvci50bG9ja3NJblVzZSwKKwkJICAgICAgIGpmc190bG9ja3NfbG93LAorCQkgICAgICAgbGlzdF9lbXB0eSgmVHhBbmNob3IudW5sb2NrX3F1ZXVlKSA/ICIiIDogIm5vdCAiKTsKKworCWJlZ2luID0gb2Zmc2V0OworCSpzdGFydCA9IGJ1ZmZlciArIGJlZ2luOworCWxlbiAtPSBiZWdpbjsKKworCWlmIChsZW4gPiBsZW5ndGgpCisJCWxlbiA9IGxlbmd0aDsKKwllbHNlCisJCSplb2YgPSAxOworCisJaWYgKGxlbiA8IDApCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKSAmJiBkZWZpbmVkKENPTkZJR19KRlNfU1RBVElTVElDUykKK2ludCBqZnNfdHhzdGF0c19yZWFkKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsCisJCSAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbiA9IDA7CisJb2ZmX3QgYmVnaW47CisKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIsCisJCSAgICAgICAiSkZTIFR4U3RhdHNcbiIKKwkJICAgICAgICI9PT09PT09PT09PVxuIgorCQkgICAgICAgImNhbGxzIHRvIHR4QmVnaW4gPSAlZFxuIgorCQkgICAgICAgInR4QmVnaW4gYmxvY2tlZCBieSBzeW5jIGJhcnJpZXIgPSAlZFxuIgorCQkgICAgICAgInR4QmVnaW4gYmxvY2tlZCBieSB0bG9ja3MgbG93ID0gJWRcbiIKKwkJICAgICAgICJ0eEJlZ2luIGJsb2NrZWQgYnkgbm8gZnJlZSB0aWQgPSAlZFxuIgorCQkgICAgICAgImNhbGxzIHRvIHR4QmVnaW5Bbm9uID0gJWRcbiIKKwkJICAgICAgICJ0eEJlZ2luQW5vbiBibG9ja2VkIGJ5IHN5bmMgYmFycmllciA9ICVkXG4iCisJCSAgICAgICAidHhCZWdpbkFub24gYmxvY2tlZCBieSB0bG9ja3MgbG93ID0gJWRcbiIKKwkJICAgICAgICJjYWxscyB0byB0eExvY2tBbGxvYyA9ICVkXG4iCisJCSAgICAgICAidExvY2tBbGxvYyBibG9ja2VkIGJ5IG5vIGZyZWUgbG9jayA9ICVkXG4iLAorCQkgICAgICAgVHhTdGF0LnR4QmVnaW4sCisJCSAgICAgICBUeFN0YXQudHhCZWdpbl9iYXJyaWVyLAorCQkgICAgICAgVHhTdGF0LnR4QmVnaW5fbG9ja3Nsb3csCisJCSAgICAgICBUeFN0YXQudHhCZWdpbl9mcmVldGlkLAorCQkgICAgICAgVHhTdGF0LnR4QmVnaW5Bbm9uLAorCQkgICAgICAgVHhTdGF0LnR4QmVnaW5Bbm9uX2JhcnJpZXIsCisJCSAgICAgICBUeFN0YXQudHhCZWdpbkFub25fbG9ja3Nsb3csCisJCSAgICAgICBUeFN0YXQudHhMb2NrQWxsb2MsCisJCSAgICAgICBUeFN0YXQudHhMb2NrQWxsb2NfZnJlZWxvY2spOworCisJYmVnaW4gPSBvZmZzZXQ7CisJKnN0YXJ0ID0gYnVmZmVyICsgYmVnaW47CisJbGVuIC09IGJlZ2luOworCisJaWYgKGxlbiA+IGxlbmd0aCkKKwkJbGVuID0gbGVuZ3RoOworCWVsc2UKKwkJKmVvZiA9IDE7CisKKwlpZiAobGVuIDwgMCkKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW47Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfdHhubWdyLmggYi9mcy9qZnMvamZzX3R4bm1nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MWI4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX3R4bm1nci5oCkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwNAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9IX0pGU19UWE5NR1IKKyNkZWZpbmUgX0hfSkZTX1RYTk1HUgorCisjaW5jbHVkZSAiamZzX2xvZ21nci5oIgorCisvKgorICogSGlkZSBpbXBsZW1lbnRhdGlvbiBvZiBUeEJsb2NrIGFuZCBUeExvY2sKKyAqLworI2RlZmluZSB0aWRfdG9fdGJsb2NrKHRpZCkgKCZUeEJsb2NrW3RpZF0pCisKKyNkZWZpbmUgbGlkX3RvX3Rsb2NrKGxpZCkgKCZUeExvY2tbbGlkXSkKKworLyoKKyAqCXRyYW5zYWN0aW9uIGJsb2NrCisgKi8KK3N0cnVjdCB0YmxvY2sgeworCS8qCisJICogdGJsb2NrIGFuZCBqYnVmX3QgY29tbW9uIGFyZWE6IHN0cnVjdCBsb2dzeW5jYmxrCisJICoKKwkgKiB0aGUgZm9sbG93aW5nIDUgZmllbGRzIGFyZSB0aGUgc2FtZSBhcyBzdHJ1Y3QgbG9nc3luY2JsaworCSAqIHdoaWNoIGlzIGNvbW1vbiB0byB0YmxvY2sgYW5kIGpidWYgdG8gZm9ybSBsb2dzeW5jbGlzdAorCSAqLworCXUxNiB4ZmxhZzsJCS8qIHR4IGNvbW1pdCB0eXBlICovCisJdTE2IGZsYWc7CQkvKiB0eCBjb21taXQgc3RhdGUgKi8KKwlsaWRfdCBkdW1teTsJCS8qIE11c3Qga2VlcCBzdHJ1Y3R1cmVzIGNvbW1vbiAqLworCXMzMiBsc247CQkvKiByZWNvdmVyeSBsc24gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHN5bmNsaXN0OwkvKiBsb2dzeW5jbGlzdCBsaW5rICovCisKKwkvKiBsb2NrIG1hbmFnZW1lbnQgKi8KKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwkvKiBzdXBlciBibG9jayAqLworCWxpZF90IG5leHQ7CQkvKiBpbmRleCBvZiBmaXJzdCB0bG9jayBvZiB0aWQgKi8KKwlsaWRfdCBsYXN0OwkJLyogaW5kZXggb2YgbGFzdCB0bG9jayBvZiB0aWQgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0b3I7CS8qIHRpZHMgd2FpdGluZyBvbiB0aGlzIHRpZCAqLworCisJLyogbG9nIG1hbmFnZW1lbnQgKi8KKwl1MzIgbG9ndGlkOwkJLyogbG9nIHRyYW5zYWN0aW9uIGlkICovCisKKwkvKiBjb21taXQgbWFuYWdlbWVudCAqLworCXN0cnVjdCBsaXN0X2hlYWQgY3F1ZXVlOwkvKiBjb21taXQgcXVldWUgbGlzdCAqLworCXMzMiBjbHNuOwkJLyogY29tbWl0IGxzbiAqLworCXN0cnVjdCBsYnVmICpicDsKKwlzMzIgcG47CQkJLyogY29tbWl0IHJlY29yZCBsb2cgcGFnZSBudW1iZXIgKi8KKwlzMzIgZW9yOwkJLyogY29tbWl0IHJlY29yZCBlb3IgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBnY3dhaXQ7CS8qIGdyb3VwIGNvbW1pdCBldmVudCBsaXN0OgorCQkJCQkgKiByZWFkeSB0cmFuc2FjdGlvbnMgd2FpdCBvbiB0aGlzCisJCQkJCSAqIGV2ZW50IGZvciBncm91cCBjb21taXQgY29tcGxldGlvbi4KKwkJCQkJICovCisJdW5pb24geworCQlzdHJ1Y3QgaW5vZGUgKmlwOyAvKiBpbm9kZSBiZWluZyBkZWxldGVkICovCisJCXB4ZF90IGl4cHhkOwkvKiBweGQgb2YgaW5vZGUgZXh0ZW50IGZvciBjcmVhdGVkIGlub2RlICovCisJfSB1OworCXUzMiBpbm87CQkvKiBpbm9kZSBudW1iZXIgYmVpbmcgY3JlYXRlZCAqLworfTsKKworZXh0ZXJuIHN0cnVjdCB0YmxvY2sgKlR4QmxvY2s7CS8qIHRyYW5zYWN0aW9uIGJsb2NrIHRhYmxlICovCisKKy8qIGNvbW1pdCBmbGFnczogdGJsay0+eGZsYWcgKi8KKyNkZWZpbmUJQ09NTUlUX1NZTkMJMHgwMDAxCS8qIHN5bmNocm9ub3VzIGNvbW1pdCAqLworI2RlZmluZQlDT01NSVRfRk9SQ0UJMHgwMDAyCS8qIGZvcmNlIHBhZ2VvdXQgYXQgZW5kIG9mIGNvbW1pdCAqLworI2RlZmluZQlDT01NSVRfRkxVU0gJMHgwMDA0CS8qIGluaXQgZmx1c2ggYXQgZW5kIG9mIGNvbW1pdCAqLworI2RlZmluZSBDT01NSVRfTUFQCTB4MDBmMAorI2RlZmluZQlDT01NSVRfUE1BUAkweDAwMTAJLyogdXBkYXRlIHBtYXAgKi8KKyNkZWZpbmUJQ09NTUlUX1dNQVAJMHgwMDIwCS8qIHVwZGF0ZSB3bWFwICovCisjZGVmaW5lCUNPTU1JVF9QV01BUAkweDAwNDAJLyogdXBkYXRlIHB3bWFwICovCisjZGVmaW5lCUNPTU1JVF9GUkVFCTB4MGYwMAorI2RlZmluZQlDT01NSVRfREVMRVRFCTB4MDEwMAkvKiBpbm9kZSBkZWxldGUgKi8KKyNkZWZpbmUJQ09NTUlUX1RSVU5DQVRFCTB4MDIwMAkvKiBmaWxlIHRydW5jYXRpb24gKi8KKyNkZWZpbmUJQ09NTUlUX0NSRUFURQkweDA0MDAJLyogaW5vZGUgY3JlYXRlICovCisjZGVmaW5lCUNPTU1JVF9MQVpZCTB4MDgwMAkvKiBsYXp5IGNvbW1pdCAqLworI2RlZmluZSBDT01NSVRfUEFHRQkweDEwMDAJLyogSWRlbnRpZmllcyBlbGVtZW50IGFzIG1ldGFwYWdlICovCisjZGVmaW5lIENPTU1JVF9JTk9ERQkweDIwMDAJLyogSWRlbnRpZmllcyBlbGVtZW50IGFzIGlub2RlICovCisKKy8qIGdyb3VwIGNvbW1pdCBmbGFncyB0YmxrLT5mbGFnOiBzZWUgamZzX2xvZ21nci5oICovCisKKy8qCisgKgl0cmFuc2FjdGlvbiBsb2NrCisgKi8KK3N0cnVjdCB0bG9jayB7CisJbGlkX3QgbmV4dDsJCS8qIDI6IGluZGV4IG5leHQgbG9ja3dvcmQgb24gdGlkIGxvY2tsaXN0CisJCQkJICogICAgICAgICAgbmV4dCBsb2Nrd29yZCBvbiBmcmVlbGlzdAorCQkJCSAqLworCXRpZF90IHRpZDsJCS8qIDI6IHRyYW5zYWN0aW9uIGlkIGhvbGRpbmcgbG9jayAqLworCisJdTE2IGZsYWc7CQkvKiAyOiBsb2NrIGNvbnRyb2wgKi8KKwl1MTYgdHlwZTsJCS8qIDI6IGxvZyB0eXBlICovCisKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOwkvKiA0Lzg6IG9iamVjdCBwYWdlIGJ1ZmZlciBsb2NrZWQgKi8KKwlzdHJ1Y3QgaW5vZGUgKmlwOwkvKiA0Lzg6IG9iamVjdCAqLworCS8qICgxNikgKi8KKworCXMxNiBsb2NrWzI0XTsJCS8qIDQ4OiBvdmVybGF5IGFyZWEgKi8KK307CQkJCS8qICg2NCkgKi8KKworZXh0ZXJuIHN0cnVjdCB0bG9jayAqVHhMb2NrOwkvKiB0cmFuc2FjdGlvbiBsb2NrIHRhYmxlICovCisKKy8qCisgKiB0bG9jayBmbGFnCisgKi8KKy8qIHR4TG9jayBzdGF0ZSAqLworI2RlZmluZSB0bGNrUEFHRUxPQ0sJCTB4ODAwMAorI2RlZmluZSB0bGNrSU5PREVMT0NLCQkweDQwMDAKKyNkZWZpbmUgdGxja0xJTkVMT0NLCQkweDIwMDAKKyNkZWZpbmUgdGxja0lOTElORUxPQ0sJCTB4MTAwMAorLyogbG1Mb2cgc3RhdGUgKi8KKyNkZWZpbmUgdGxja0xPRwkJCTB4MDgwMAorLyogdXBkYXRlTWFwIHN0YXRlICovCisjZGVmaW5lCXRsY2tVUERBVEVNQVAJCTB4MDA4MAorLyogZnJlZUxvY2sgc3RhdGUgKi8KKyNkZWZpbmUgdGxja0ZSRUVMT0NLCQkweDAwMDgKKyNkZWZpbmUgdGxja1dSSVRFUEFHRQkJMHgwMDA0CisjZGVmaW5lIHRsY2tGUkVFUEFHRQkJMHgwMDAyCisKKy8qCisgKiB0bG9jayB0eXBlCisgKi8KKyNkZWZpbmUJdGxja1RZUEUJCTB4ZmUwMAorI2RlZmluZQl0bGNrSU5PREUJCTB4ODAwMAorI2RlZmluZQl0bGNrWFRSRUUJCTB4NDAwMAorI2RlZmluZQl0bGNrRFRSRUUJCTB4MjAwMAorI2RlZmluZQl0bGNrTUFQCQkJMHgxMDAwCisjZGVmaW5lCXRsY2tFQQkJCTB4MDgwMAorI2RlZmluZQl0bGNrQUNMCQkJMHgwNDAwCisjZGVmaW5lCXRsY2tEQVRBCQkweDAyMDAKKyNkZWZpbmUJdGxja0JUUk9PVAkJMHgwMTAwCisKKyNkZWZpbmUJdGxja09QRVJBVElPTgkJMHgwMGZmCisjZGVmaW5lIHRsY2tHUk9XCQkweDAwMDEJLyogZmlsZSBncm93ICovCisjZGVmaW5lIHRsY2tSRU1PVkUJCTB4MDAwMgkvKiBmaWxlIGRlbGV0ZSAqLworI2RlZmluZSB0bGNrVFJVTkNBVEUJCTB4MDAwNAkvKiBmaWxlIHRydW5jYXRlICovCisjZGVmaW5lIHRsY2tSRUxPQ0FURQkJMHgwMDA4CS8qIGZpbGUvZGlyZWN0b3J5IHJlbG9jYXRlICovCisjZGVmaW5lIHRsY2tFTlRSWQkJMHgwMDAxCS8qIGRpcmVjdG9yeSBpbnNlcnQvZGVsZXRlICovCisjZGVmaW5lIHRsY2tFWFRFTkQJCTB4MDAwMgkvKiBkaXJlY3RvcnkgZXh0ZW5kIGluLWxpbmUgKi8KKyNkZWZpbmUgdGxja1NQTElUCQkweDAwMTAJLyogc3BsaXRlZCBwYWdlICovCisjZGVmaW5lIHRsY2tORVcJCQkweDAwMjAJLyogbmV3IHBhZ2UgZnJvbSBzcGxpdCAqLworI2RlZmluZSB0bGNrRlJFRQkJMHgwMDQwCS8qIGZyZWUgcGFnZSAqLworI2RlZmluZSB0bGNrUkVMSU5LCQkweDAwODAJLyogdXBkYXRlIHNpYmxpbmcgcG9pbnRlciAqLworCisvKgorICoJbGluZWxvY2sgZm9yIGxtTG9nKCkKKyAqCisgKiBub3RlOiBsaW5lbG9jayBhbmQgaXRzIHZhcmlhdGlvbnMgYXJlIG92ZXJsYWlkCisgKiBhdCB0bG9jay5sb2NrOiB3YXRjaCBmb3IgYWxpZ25tZW50OworICovCitzdHJ1Y3QgbHYgeworCXU4IG9mZnNldDsJCS8qIDE6ICovCisJdTggbGVuZ3RoOwkJLyogMTogKi8KK307CQkJCS8qICgyKSAqLworCisjZGVmaW5lCVRMT0NLU0hPUlQJMjAKKyNkZWZpbmUJVExPQ0tMT05HCTI4CisKK3N0cnVjdCBsaW5lbG9jayB7CisJbGlkX3QgbmV4dDsJCS8qIDI6IG5leHQgbGluZWxvY2sgKi8KKworCXM4IG1heGNudDsJCS8qIDE6ICovCisJczggaW5kZXg7CQkvKiAxOiAqLworCisJdTE2IGZsYWc7CQkvKiAyOiAqLworCXU4IHR5cGU7CQkvKiAxOiAqLworCXU4IGwybGluZXNpemU7CQkvKiAxOiBsb2cyIG9mIGxpbmVzaXplICovCisJLyogKDgpICovCisKKwlzdHJ1Y3QgbHYgbHZbMjBdOwkvKiA0MDogKi8KK307IAkJCQkvKiAoNDgpICovCisKKyNkZWZpbmUgZHRfbG9jawlsaW5lbG9jaworCitzdHJ1Y3QgeHRsb2NrIHsKKwlsaWRfdCBuZXh0OwkJLyogMjogKi8KKworCXM4IG1heGNudDsJCS8qIDE6ICovCisJczggaW5kZXg7CQkvKiAxOiAqLworCisJdTE2IGZsYWc7CQkvKiAyOiAqLworCXU4IHR5cGU7CQkvKiAxOiAqLworCXU4IGwybGluZXNpemU7CQkvKiAxOiBsb2cyIG9mIGxpbmVzaXplICovCisJCQkJLyogKDgpICovCisKKwlzdHJ1Y3QgbHYgaGVhZGVyOwkvKiAyOiAqLworCXN0cnVjdCBsdiBsd207CQkvKiAyOiBsb3cgd2F0ZXIgbWFyayAqLworCXN0cnVjdCBsdiBod207CQkvKiAyOiBoaWdoIHdhdGVyIG1hcmsgKi8KKwlzdHJ1Y3QgbHYgdHdtOwkJLyogMjogKi8KKwkJCQkvKiAoMTYpICovCisKKwlzMzIgcHhkbG9ja1s4XTsJCS8qIDMyOiAqLworfTsJCQkJLyogKDQ4KSAqLworCisKKy8qCisgKgltYXBsb2NrIGZvciB0eFVwZGF0ZU1hcCgpCisgKgorICogbm90ZTogbWFwbG9jayBhbmQgaXRzIHZhcmlhdGlvbnMgYXJlIG92ZXJsYWlkCisgKiBhdCB0bG9jay5sb2NrL2xpbmVsb2NrOiB3YXRjaCBmb3IgYWxpZ25tZW50OworICogTi5CLiBuZXh0IGZpZWxkIG1heSBiZSBzZXQgYnkgbGluZWxvY2ssIGFuZCBzaG91bGQgbm90CisgKiBiZSBtb2RpZmllZCBieSBtYXBsb2NrOworICogTi5CLiBpbmRleCBvZiB0aGUgZmlyc3QgcHhkbG9jayBzcGVjaWZpZXMgaW5kZXggb2YgbmV4dCAKKyAqIGZyZWUgbWFwbG9jayAoaS5lLiwgbnVtYmVyIG9mIG1hcGxvY2spIGluIHRoZSB0bG9jazsgCisgKi8KK3N0cnVjdCBtYXBsb2NrIHsKKwlsaWRfdCBuZXh0OwkJLyogMjogKi8KKworCXU4IG1heGNudDsJCS8qIDI6ICovCisJdTggaW5kZXg7CQkvKiAyOiBuZXh0IGZyZWUgbWFwbG9jayBpbmRleCAqLworCisJdTE2IGZsYWc7CQkvKiAyOiAqLworCXU4IHR5cGU7CQkvKiAxOiAqLworCXU4IGNvdW50OwkJLyogMTogbnVtYmVyIG9mIHB4ZC94YWQgKi8KKwkJCQkvKiAoOCkgKi8KKworCXB4ZF90IHB4ZDsJCS8qIDg6ICovCit9OwkJCQkvKiAoMTYpOiAqLworCisvKiBtYXBsb2NrIGZsYWcgKi8KKyNkZWZpbmUJbWxja0FMTE9DCQkweDAwZjAKKyNkZWZpbmUJbWxja0FMTE9DWEFETElTVAkweDAwODAKKyNkZWZpbmUJbWxja0FMTE9DUFhETElTVAkweDAwNDAKKyNkZWZpbmUJbWxja0FMTE9DWEFECQkweDAwMjAKKyNkZWZpbmUJbWxja0FMTE9DUFhECQkweDAwMTAKKyNkZWZpbmUJbWxja0ZSRUUJCTB4MDAwZgorI2RlZmluZQltbGNrRlJFRVhBRExJU1QJCTB4MDAwOAorI2RlZmluZQltbGNrRlJFRVBYRExJU1QJCTB4MDAwNAorI2RlZmluZQltbGNrRlJFRVhBRAkJMHgwMDAyCisjZGVmaW5lCW1sY2tGUkVFUFhECQkweDAwMDEKKworI2RlZmluZQlweGRfbG9jawltYXBsb2NrCisKK3N0cnVjdCB4ZGxpc3Rsb2NrIHsKKwlsaWRfdCBuZXh0OwkJLyogMjogKi8KKworCXU4IG1heGNudDsJCS8qIDI6ICovCisJdTggaW5kZXg7CQkvKiAyOiAqLworCisJdTE2IGZsYWc7CQkvKiAyOiAqLworCXU4IHR5cGU7CQkvKiAxOiAqLworCXU4IGNvdW50OwkJLyogMTogbnVtYmVyIG9mIHB4ZC94YWQgKi8KKwkJCQkvKiAoOCkgKi8KKworCS8qCisJICogV2UgbmVlZCB4ZGxpc3QgdG8gYmUgNjQgYml0cyAoOCBieXRlcyksIHJlZ2FyZGxlc3Mgb2YKKwkgKiB3aGV0aGVyIHZvaWQgKiBpcyAzMiBvciA2NCBiaXRzCisJICovCisJdW5pb24geworCQl2b2lkICpfeGRsaXN0OwkvKiBweGQveGFkIGxpc3QgKi8KKwkJczY0IHBhZDsJLyogODogRm9yY2UgNjQtYml0IHhkbGlzdCBzaXplICovCisJfSB1bmlvbjY0OworfTsJCQkJLyogKDE2KTogKi8KKworI2RlZmluZSB4ZGxpc3QgdW5pb242NC5feGRsaXN0CisKKy8qCisgKgljb21taXQKKyAqCisgKiBwYXJhbWV0ZXIgdG8gdGhlIGNvbW1pdCBtYW5hZ2VyIHJvdXRpbmVzCisgKi8KK3N0cnVjdCBjb21taXQgeworCXRpZF90IHRpZDsJCS8qIHRpZCA9IGluZGV4IG9mIHRibG9jayAqLworCWludCBmbGFnOwkJLyogZmxhZ3MgKi8KKwlzdHJ1Y3QgamZzX2xvZyAqbG9nOwkvKiBsb2cgKi8KKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwkvKiBzdXBlcmJsb2NrICovCisKKwlpbnQgbmlwOwkJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gaXBsaXN0ICovCisJc3RydWN0IGlub2RlICoqaXBsaXN0OwkvKiBsaXN0IG9mIHBvaW50ZXJzIHRvIGlub2RlcyAqLworCisJLyogbG9nIHJlY29yZCBkZXNjcmlwdG9yIG9uIDY0LWJpdCBib3VuZGFyeSAqLworCXN0cnVjdCBscmQgbHJkOwkJLyogOiBsb2cgcmVjb3JkIGRlc2NyaXB0b3IgKi8KK307CisKKy8qCisgKiBleHRlcm5hbCBkZWNsYXJhdGlvbnMKKyAqLworZXh0ZXJuIHN0cnVjdCB0bG9jayAqdHhMb2NrKHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwgc3RydWN0IG1ldGFwYWdlICptcCwKKwkJCSAgICBpbnQgZmxhZyk7CisKK2V4dGVybiBzdHJ1Y3QgdGxvY2sgKnR4TWFwbG9jayh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIGludCBmbGFnKTsKKworZXh0ZXJuIGludCB0eENvbW1pdCh0aWRfdCB0aWQsIGludCBuaXAsIHN0cnVjdCBpbm9kZSAqKmlwbGlzdCwgaW50IGZsYWcpOworCitleHRlcm4gdGlkX3QgdHhCZWdpbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZmxhZyk7CisKK2V4dGVybiB2b2lkIHR4QmVnaW5Bbm9uKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworCitleHRlcm4gdm9pZCB0eEVuZCh0aWRfdCB0aWQpOworCitleHRlcm4gdm9pZCB0eEFib3J0KHRpZF90IHRpZCwgaW50IGRpcnR5KTsKKworZXh0ZXJuIHN0cnVjdCBsaW5lbG9jayAqdHhMaW5lbG9jayhzdHJ1Y3QgbGluZWxvY2sgKiB0bG9jayk7CisKK2V4dGVybiB2b2lkIHR4RnJlZU1hcChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgbWFwbG9jayAqIG1hcGxvY2ssCisJCSAgICAgIHN0cnVjdCB0YmxvY2sgKiB0YmxrLCBpbnQgbWFwdHlwZSk7CisKK2V4dGVybiB2b2lkIHR4RUEodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBkeGRfdCAqIG9sZGVhLCBkeGRfdCAqIG5ld2VhKTsKKworZXh0ZXJuIHZvaWQgdHhGcmVlbG9jayhzdHJ1Y3QgaW5vZGUgKmlwKTsKKworZXh0ZXJuIGludCBsbUxvZyhzdHJ1Y3QgamZzX2xvZyAqIGxvZywgc3RydWN0IHRibG9jayAqIHRibGssIHN0cnVjdCBscmQgKiBscmQsCisJCSBzdHJ1Y3QgdGxvY2sgKiB0bGNrKTsKKworZXh0ZXJuIHZvaWQgdHhRdWllc2NlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworCitleHRlcm4gdm9pZCB0eFJlc3VtZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKyNlbmRpZgkJCQkvKiBfSF9KRlNfVFhOTUdSICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX3R5cGVzLmggYi9mcy9qZnMvamZzX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJmYWQzOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfdHlwZXMuaApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAwLTIwMDQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfSF9KRlNfVFlQRVMKKyNkZWZpbmUJX0hfSkZTX1RZUEVTCisKKy8qCisgKglqZnNfdHlwZXMuaDoKKyAqCisgKiBiYXNpYyB0eXBlL3V0aWxpdHkgIGRlZmluaXRpb25zCisgKgorICogbm90ZTogdGhpcyBoZWFkZXIgZmlsZSBtdXN0IGJlIHRoZSAxc3QgaW5jbHVkZSBmaWxlCisgKiBvZiBKRlMgaW5jbHVkZSBsaXN0IGluIGFsbCBKRlMgLmMgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKworI2luY2x1ZGUgImVuZGlhbjI0LmgiCisKKy8qCisgKiB0cmFuc2FjdGlvbiBhbmQgbG9jayBpZCdzCisgKgorICogRG9uJ3QgY2hhbmdlIHRoZXNlIHdpdGhvdXQgY2FyZWZ1bGx5IGNvbnNpZGVyaW5nIHRoZSBpbXBhY3Qgb24gdGhlCisgKiBzaXplIGFuZCBhbGlnbm1lbnQgb2YgYWxsIG9mIHRoZSBsaW5lbG9jayB2YXJpYW50cworICovCit0eXBlZGVmIHUxNiB0aWRfdDsKK3R5cGVkZWYgdTE2IGxpZF90OworCisvKgorICogQWxtb3N0IGlkZW50aWNhbCB0byBMaW51eCdzIHRpbWVzcGVjLCBidXQgbm90IHF1aXRlCisgKi8KK3N0cnVjdCB0aW1lc3RydWNfdCB7CisJX19sZTMyIHR2X3NlYzsKKwlfX2xlMzIgdHZfbnNlYzsKK307CisKKy8qCisgKgloYW5keQorICovCisKKyNkZWZpbmUgTEVGVE1PU1RPTkUJMHg4MDAwMDAwMAorI2RlZmluZQlISUdIT1JERVIJMHg4MDAwMDAwMHUJLyogaGlnaCBvcmRlciBiaXQgb24gICAgICAgICAgICAqLworI2RlZmluZQlPTkVTCQkweGZmZmZmZmZmdQkvKiBhbGwgYml0IG9uICAgICAgICAgICAgICAgICAgICovCisKK3R5cGVkZWYgaW50IGJvb2xlYW5fdDsKKyNkZWZpbmUgVFJVRSAxCisjZGVmaW5lIEZBTFNFIDAKKworLyoKKyAqCWxvZ2ljYWwgeGQgKGx4ZCkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxlbjoyNDsKKwl1bnNpZ25lZCBvZmYxOjg7CisJdTMyIG9mZjI7Cit9IGx4ZF90OworCisvKiBseGRfdCBmaWVsZCBjb25zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUJTFhEbGVuZ3RoKGx4ZCwgbGVuZ3RoMzIpCSggKGx4ZCktPmxlbiA9IGxlbmd0aDMyICkKKyNkZWZpbmUJTFhEb2Zmc2V0KGx4ZCwgb2Zmc2V0NjQpXAore1wKKwkobHhkKS0+b2ZmMSA9ICgoczY0KW9mZnNldDY0KSA+PiAzMjtcCisJKGx4ZCktPm9mZjIgPSAob2Zmc2V0NjQpICYgMHhmZmZmZmZmZjtcCit9CisKKy8qIGx4ZF90IGZpZWxkIGV4dHJhY3Rpb24gKi8KKyNkZWZpbmUJbGVuZ3RoTFhEKGx4ZCkJKCAobHhkKS0+bGVuICkKKyNkZWZpbmUJb2Zmc2V0TFhEKGx4ZClcCisJKCAoKHM2NCkoKGx4ZCktPm9mZjEpKSA8PCAzMiB8IChseGQpLT5vZmYyICkKKworLyogbHhkIGxpc3QgKi8KK3N0cnVjdCBseGRsaXN0IHsKKwlzMTYgbWF4bmx4ZDsKKwlzMTYgbmx4ZDsKKwlseGRfdCAqbHhkOworfTsKKworLyoKKyAqCXBoeXNpY2FsIHhkIChweGQpCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsZW46MjQ7CisJdW5zaWduZWQgYWRkcjE6ODsKKwlfX2xlMzIgYWRkcjI7Cit9IHB4ZF90OworCisvKiB4ZF90IGZpZWxkIGNvbnN0cnVjdGlvbiAqLworCisjZGVmaW5lCVBYRGxlbmd0aChweGQsIGxlbmd0aDMyKQkoKHB4ZCktPmxlbiA9IF9fY3B1X3RvX2xlMjQobGVuZ3RoMzIpKQorI2RlZmluZQlQWERhZGRyZXNzKHB4ZCwgYWRkcmVzczY0KVwKK3tcCisJKHB4ZCktPmFkZHIxID0gKChzNjQpYWRkcmVzczY0KSA+PiAzMjtcCisJKHB4ZCktPmFkZHIyID0gX19jcHVfdG9fbGUzMigoYWRkcmVzczY0KSAmIDB4ZmZmZmZmZmYpO1wKK30KKworLyogeGRfdCBmaWVsZCBleHRyYWN0aW9uICovCisjZGVmaW5lCWxlbmd0aFBYRChweGQpCV9fbGUyNF90b19jcHUoKHB4ZCktPmxlbikKKyNkZWZpbmUJYWRkcmVzc1BYRChweGQpXAorCSggKChzNjQpKChweGQpLT5hZGRyMSkpIDw8IDMyIHwgX19sZTMyX3RvX2NwdSgocHhkKS0+YWRkcjIpKQorCisjZGVmaW5lIE1BWFRSRUVIRUlHSFQgOAorLyogcHhkIGxpc3QgKi8KK3N0cnVjdCBweGRsaXN0IHsKKwlzMTYgbWF4bnB4ZDsKKwlzMTYgbnB4ZDsKKwlweGRfdCBweGRbTUFYVFJFRUhFSUdIVF07Cit9OworCisKKy8qCisgKglkYXRhIGV4dGVudCBkZXNjcmlwdG9yIChkeGQpCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBmbGFnOjg7CS8qIDE6IGZsYWdzICovCisJdW5zaWduZWQgcnNydmQ6MjQ7CisJX19sZTMyIHNpemU7CQkvKiA0OiBzaXplIGluIGJ5dGUgKi8KKwl1bnNpZ25lZCBsZW46MjQ7CS8qIDM6IGxlbmd0aCBpbiB1bml0IG9mIGZzYmxrc2l6ZSAqLworCXVuc2lnbmVkIGFkZHIxOjg7CS8qIDE6IGFkZHJlc3MgaW4gdW5pdCBvZiBmc2Jsa3NpemUgKi8KKwlfX2xlMzIgYWRkcjI7CQkvKiA0OiBhZGRyZXNzIGluIHVuaXQgb2YgZnNibGtzaXplICovCit9IGR4ZF90OwkJCS8qIC0gMTYgLSAqLworCisvKiBkeGRfdCBmbGFncyAqLworI2RlZmluZQlEWERfSU5ERVgJMHg4MAkvKiBCKy10cmVlIGluZGV4ICovCisjZGVmaW5lCURYRF9JTkxJTkUJMHg0MAkvKiBpbi1saW5lIGRhdGEgZXh0ZW50ICovCisjZGVmaW5lCURYRF9FWFRFTlQJMHgyMAkvKiBvdXQtb2YtbGluZSBzaW5nbGUgZXh0ZW50ICovCisjZGVmaW5lCURYRF9GSUxFCTB4MTAJLyogb3V0LW9mLWxpbmUgZmlsZSAoaW5vZGUpICovCisjZGVmaW5lIERYRF9DT1JSVVBUCTB4MDgJLyogSW5jb25zaXN0ZW5jeSBkZXRlY3RlZCAqLworCisvKiBkeGRfdCBmaWVsZCBjb25zdHJ1Y3Rpb24KKyAqCUNvbnZlbmllbnRseSwgdGhlIFBYRCBtYWNyb3Mgd29yayBmb3IgRFhECisgKi8KKyNkZWZpbmUJRFhEbGVuZ3RoCVBYRGxlbmd0aAorI2RlZmluZQlEWERhZGRyZXNzCVBYRGFkZHJlc3MKKyNkZWZpbmUJbGVuZ3RoRFhECWxlbmd0aFBYRAorI2RlZmluZQlhZGRyZXNzRFhECWFkZHJlc3NQWEQKKyNkZWZpbmUgRFhEc2l6ZShkeGQsIHNpemUzMikgKChkeGQpLT5zaXplID0gY3B1X3RvX2xlMzIoc2l6ZTMyKSkKKyNkZWZpbmUgc2l6ZURYRChkeGQpCWxlMzJfdG9fY3B1KChkeGQpLT5zaXplKQorCisvKgorICogICAgICBkaXJlY3RvcnkgZW50cnkgYXJndW1lbnQKKyAqLworc3RydWN0IGNvbXBvbmVudF9uYW1lIHsKKwlpbnQgbmFtbGVuOworCXdjaGFyX3QgKm5hbWU7Cit9OworCisKKy8qCisgKglEQVNEIGxpbWl0IGluZm9ybWF0aW9uIC0gc3RvcmVkIGluIGRpcmVjdG9yeSBpbm9kZQorICovCitzdHJ1Y3QgZGFzZCB7CisJdTggdGhyZXNoOwkJLyogQWxlcnQgVGhyZXNob2xkIChpbiBwZXJjZW50KSAqLworCXU4IGRlbHRhOwkJLyogQWxlcnQgVGhyZXNob2xkIGRlbHRhIChpbiBwZXJjZW50KSAgICovCisJdTggcnNydmQxOworCXU4IGxpbWl0X2hpOwkJLyogREFTRCBsaW1pdCAoaW4gbG9naWNhbCBibG9ja3MpICAgICAgICovCisJX19sZTMyIGxpbWl0X2xvOwkvKiBEQVNEIGxpbWl0IChpbiBsb2dpY2FsIGJsb2NrcykgICAgICAgKi8KKwl1OCByc3J2ZDJbM107CisJdTggdXNlZF9oaTsJCS8qIERBU0QgdXNhZ2UgKGluIGxvZ2ljYWwgYmxvY2tzKSAgICAgICAqLworCV9fbGUzMiB1c2VkX2xvOwkJLyogREFTRCB1c2FnZSAoaW4gbG9naWNhbCBibG9ja3MpICAgICAgICovCit9OworCisjZGVmaW5lIERBU0RMSU1JVChkYXNkcCkgXAorCSgoKHU2NCkoKGRhc2RwKS0+bGltaXRfaGkpIDw8IDMyKSArIF9fbGUzMl90b19jcHUoKGRhc2RwKS0+bGltaXRfbG8pKQorI2RlZmluZSBzZXREQVNETElNSVQoZGFzZHAsIGxpbWl0KVwKK3tcCisJKGRhc2RwKS0+bGltaXRfaGkgPSAoKHU2NClsaW1pdCkgPj4gMzI7XAorCShkYXNkcCktPmxpbWl0X2xvID0gX19jcHVfdG9fbGUzMihsaW1pdCk7XAorfQorI2RlZmluZSBEQVNEVVNFRChkYXNkcCkgXAorCSgoKHU2NCkoKGRhc2RwKS0+dXNlZF9oaSkgPDwgMzIpICsgX19sZTMyX3RvX2NwdSgoZGFzZHApLT51c2VkX2xvKSkKKyNkZWZpbmUgc2V0REFTRFVTRUQoZGFzZHAsIHVzZWQpXAore1wKKwkoZGFzZHApLT51c2VkX2hpID0gKCh1NjQpdXNlZCkgPj4gMzI7XAorCShkYXNkcCktPnVzZWRfbG8gPSBfX2NwdV90b19sZTMyKHVzZWQpO1wKK30KKworI2VuZGlmCQkJCS8qICFfSF9KRlNfVFlQRVMgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfdW1vdW50LmMgYi9mcy9qZnMvamZzX3Vtb3VudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMWE5ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX3Vtb3VudC5jCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwNAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKglqZnNfdW1vdW50LmMKKyAqCisgKiBub3RlOiBmaWxlIHN5c3RlbSBpbiB0cmFuc2l0aW9uIHRvIGFnZ3JlZ2F0ZS9maWxlc2V0OgorICogKHJlZi4gamZzX21vdW50LmMpCisgKgorICogZmlsZSBzeXN0ZW0gdW5tb3VudCBpcyBpbnRlcnByZXRlZCBhcyBtb3VudCBvZiB0aGUgc2luZ2xlL29ubHkgCisgKiBmaWxlc2V0IGluIHRoZSBhZ2dyZWdhdGUgYW5kLCBpZiB1bm1vdW50IG9mIHRoZSBsYXN0IGZpbGVzZXQsIAorICogYXMgdW5tb3VudCBvZiB0aGUgYWdnZXJhdGU7CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSAiamZzX2luY29yZS5oIgorI2luY2x1ZGUgImpmc19maWxzeXMuaCIKKyNpbmNsdWRlICJqZnNfc3VwZXJibG9jay5oIgorI2luY2x1ZGUgImpmc19kbWFwLmgiCisjaW5jbHVkZSAiamZzX2ltYXAuaCIKKyNpbmNsdWRlICJqZnNfbWV0YXBhZ2UuaCIKKyNpbmNsdWRlICJqZnNfZGVidWcuaCIKKworLyoKKyAqIE5BTUU6CWpmc191bW91bnQodmZzcCwgZmxhZ3MsIGNycCkKKyAqCisgKiBGVU5DVElPTjoJdmZzX3Vtb3VudCgpCisgKgorICogUEFSQU1FVEVSUzoJdmZzcAktIHZpcnR1YWwgZmlsZSBzeXN0ZW0gcG9pbnRlcgorICoJCWZsYWdzCS0gdW5tb3VudCBmb3Igc2h1dGRvd24KKyAqCQljcnAJLSBjcmVkZW50aWFsCisgKgorICogUkVUVVJOIDoJRUJVU1kJLSBkZXZpY2UgaGFzIG9wZW4gZmlsZXMKKyAqLworaW50IGpmc191bW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqYmRldl9tYXBwaW5nID0gc2ItPnNfYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZzsKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoc2IpOworCXN0cnVjdCBpbm9kZSAqaXBibWFwID0gc2JpLT5pcGJtYXA7CisJc3RydWN0IGlub2RlICppcGltYXAgPSBzYmktPmlwaW1hcDsKKwlzdHJ1Y3QgaW5vZGUgKmlwYWltYXAgPSBzYmktPmlwYWltYXA7CisJc3RydWN0IGlub2RlICppcGFpbWFwMiA9IHNiaS0+aXBhaW1hcDI7CisJc3RydWN0IGpmc19sb2cgKmxvZzsKKwlpbnQgcmMgPSAwOworCisJamZzX2luZm8oIlVuTW91bnQgSkZTOiBzYjoweCVwIiwgc2IpOworCisJLyoKKwkgKiAgICAgIHVwZGF0ZSBzdXBlcmJsb2NrIGFuZCBjbG9zZSBsb2cgCisJICoKKwkgKiBpZiBtb3VudGVkIHJlYWQtd3JpdGUgYW5kIGxvZyBiYXNlZCByZWNvdmVyeSB3YXMgZW5hYmxlZAorCSAqLworCWlmICgobG9nID0gc2JpLT5sb2cpKQorCQkvKgorCQkgKiBXYWl0IGZvciBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbnMgdG8gYmUgd3JpdHRlbiB0byBsb2c6IAorCQkgKi8KKwkJamZzX2ZsdXNoX2pvdXJuYWwobG9nLCAyKTsKKworCS8qCisJICogY2xvc2UgZmlsZXNldCBpbm9kZSBhbGxvY2F0aW9uIG1hcCAoYWthIGZpbGVzZXQgaW5vZGUpCisJICovCisJZGlVbm1vdW50KGlwaW1hcCwgMCk7CisKKwlkaUZyZWVTcGVjaWFsKGlwaW1hcCk7CisJc2JpLT5pcGltYXAgPSBOVUxMOworCisJLyoKKwkgKiBjbG9zZSBzZWNvbmRhcnkgYWdncmVnYXRlIGlub2RlIGFsbG9jYXRpb24gbWFwCisJICovCisJaXBhaW1hcDIgPSBzYmktPmlwYWltYXAyOworCWlmIChpcGFpbWFwMikgeworCQlkaVVubW91bnQoaXBhaW1hcDIsIDApOworCQlkaUZyZWVTcGVjaWFsKGlwYWltYXAyKTsKKwkJc2JpLT5pcGFpbWFwMiA9IE5VTEw7CisJfQorCisJLyoKKwkgKiBjbG9zZSBhZ2dyZWdhdGUgaW5vZGUgYWxsb2NhdGlvbiBtYXAKKwkgKi8KKwlpcGFpbWFwID0gc2JpLT5pcGFpbWFwOworCWRpVW5tb3VudChpcGFpbWFwLCAwKTsKKwlkaUZyZWVTcGVjaWFsKGlwYWltYXApOworCXNiaS0+aXBhaW1hcCA9IE5VTEw7CisKKwkvKgorCSAqIGNsb3NlIGFnZ3JlZ2F0ZSBibG9jayBhbGxvY2F0aW9uIG1hcAorCSAqLworCWRiVW5tb3VudChpcGJtYXAsIDApOworCisJZGlGcmVlU3BlY2lhbChpcGJtYXApOworCXNiaS0+aXBpbWFwID0gTlVMTDsKKworCS8qCisJICogTWFrZSBzdXJlIGFsbCBtZXRhZGF0YSBtYWtlcyBpdCB0byBkaXNrIGJlZm9yZSB3ZSBtYXJrCisJICogdGhlIHN1cGVyYmxvY2sgYXMgY2xlYW4KKwkgKi8KKwlmaWxlbWFwX2ZkYXRhd3JpdGUoYmRldl9tYXBwaW5nKTsKKwlmaWxlbWFwX2ZkYXRhd2FpdChiZGV2X21hcHBpbmcpOworCisJLyoKKwkgKiBlbnN1cmUgYWxsIGZpbGUgc3lzdGVtIGZpbGUgcGFnZXMgYXJlIHByb3BhZ2F0ZWQgdG8gdGhlaXIKKwkgKiBob21lIGJsb2NrcyBvbiBkaXNrIChhbmQgdGhlaXIgaW4tbWVtb3J5IGJ1ZmZlciBwYWdlcyBhcmUgCisJICogaW52YWxpZGF0ZWQpIEJFRk9SRSB1cGRhdGluZyBmaWxlIHN5c3RlbSBzdXBlcmJsb2NrIHN0YXRlCisJICogKHRvIHNpZ25pZnkgZmlsZSBzeXN0ZW0gaXMgdW5tb3VudGVkIGNsZWFubHksIGFuZCB0aHVzIGluIAorCSAqIGNvbnNpc3RlbnQgc3RhdGUpIGFuZCBsb2cgc3VwZXJibG9jayBhY3RpdmUgZmlsZSBzeXN0ZW0gCisJICogbGlzdCAodG8gc2lnbmlmeSBza2lwIGxvZ3JlZG8oKSkuCisJICovCisJaWYgKGxvZykgewkJLyogbG9nID0gTlVMTCBpZiByZWFkLW9ubHkgbW91bnQgKi8KKwkJdXBkYXRlU3VwZXIoc2IsIEZNX0NMRUFOKTsKKworCQkvKiBSZXN0b3JlIGRlZmF1bHQgZ2ZwX21hc2sgZm9yIGJkZXYgKi8KKwkJbWFwcGluZ19zZXRfZ2ZwX21hc2soYmRldl9tYXBwaW5nLCBHRlBfVVNFUik7CisKKwkJLyoKKwkJICogY2xvc2UgbG9nOiAKKwkJICoKKwkJICogcmVtb3ZlIGZpbGUgc3lzdGVtIGZyb20gbG9nIGFjdGl2ZSBmaWxlIHN5c3RlbSBsaXN0LgorCQkgKi8KKwkJcmMgPSBsbUxvZ0Nsb3NlKHNiKTsKKwl9CisJamZzX2luZm8oIlVuTW91bnQgSkZTIENvbXBsZXRlOiByYyA9ICVkIiwgcmMpOworCXJldHVybiByYzsKK30KKworCitpbnQgamZzX3Vtb3VudF9ydyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICpiZGV2X21hcHBpbmcgPSBzYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShzYik7CisJc3RydWN0IGpmc19sb2cgKmxvZyA9IHNiaS0+bG9nOworCisJaWYgKCFsb2cpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBjbG9zZSBsb2c6IAorCSAqCisJICogcmVtb3ZlIGZpbGUgc3lzdGVtIGZyb20gbG9nIGFjdGl2ZSBmaWxlIHN5c3RlbSBsaXN0LgorCSAqLworCWpmc19mbHVzaF9qb3VybmFsKGxvZywgMik7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBhbGwgbWV0YWRhdGEgbWFrZXMgaXQgdG8gZGlzaworCSAqLworCWRiU3luYyhzYmktPmlwYm1hcCk7CisJZGlTeW5jKHNiaS0+aXBpbWFwKTsKKworCS8qCisJICogTm90ZSB0aGF0IHdlIGhhdmUgdG8gZG8gdGhpcyBldmVuIGlmIHN5bmNfYmxvY2tkZXYoKSB3aWxsCisJICogZG8gZXhhY3RseSB0aGUgc2FtZSBhIGZldyBpbnN0cnVjdGlvbnMgbGF0ZXI6ICBXZSBjYW4ndAorCSAqIG1hcmsgdGhlIHN1cGVyYmxvY2sgY2xlYW4gYmVmb3JlIGV2ZXJ5dGhpbmcgaXMgZmx1c2hlZCB0bworCSAqIGRpc2suCisJICovCisJZmlsZW1hcF9mZGF0YXdyaXRlKGJkZXZfbWFwcGluZyk7CisJZmlsZW1hcF9mZGF0YXdhaXQoYmRldl9tYXBwaW5nKTsKKworCXVwZGF0ZVN1cGVyKHNiLCBGTV9DTEVBTik7CisKKwkvKiBSZXN0b3JlIGRlZmF1bHQgZ2ZwX21hc2sgZm9yIGJkZXYgKi8KKwltYXBwaW5nX3NldF9nZnBfbWFzayhiZGV2X21hcHBpbmcsIEdGUF9VU0VSKTsKKworCXJldHVybiBsbUxvZ0Nsb3NlKHNiKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfdW5pY29kZS5jIGIvZnMvamZzL2pmc191bmljb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyMjA4YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfdW5pY29kZS5jCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwNAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJqZnNfaW5jb3JlLmgiCisjaW5jbHVkZSAiamZzX2ZpbHN5cy5oIgorI2luY2x1ZGUgImpmc191bmljb2RlLmgiCisjaW5jbHVkZSAiamZzX2RlYnVnLmgiCisKKy8qCisgKiBOQU1FOglqZnNfc3RyZnJvbVVDUygpCisgKgorICogRlVOQ1RJT046CUNvbnZlcnQgbGl0dGxlLWVuZGlhbiB1bmljb2RlIHN0cmluZyB0byBjaGFyYWN0ZXIgc3RyaW5nCisgKgorICovCitpbnQgamZzX3N0cmZyb21VQ1NfbGUoY2hhciAqdG8sIGNvbnN0IF9fbGUxNiAqIGZyb20sCisJCSAgICAgIGludCBsZW4sIHN0cnVjdCBubHNfdGFibGUgKmNvZGVwYWdlKQoreworCWludCBpOworCWludCBvdXRsZW4gPSAwOworCXN0YXRpYyBpbnQgd2Fybl9hZ2FpbiA9IDU7CS8qIE9ubHkgd2FybiB1cCB0byA1IHRpbWVzIHRvdGFsICovCisJaW50IHdhcm4gPSAhIXdhcm5fYWdhaW47CS8qIG9uY2UgcGVyIHN0cmluZyAqLworCisJaWYgKGNvZGVwYWdlKSB7CisJCWZvciAoaSA9IDA7IChpIDwgbGVuKSAmJiBmcm9tW2ldOyBpKyspIHsKKwkJCWludCBjaGFybGVuOworCQkJY2hhcmxlbiA9CisJCQkgICAgY29kZXBhZ2UtPnVuaTJjaGFyKGxlMTZfdG9fY3B1KGZyb21baV0pLAorCQkJCQkgICAgICAgJnRvW291dGxlbl0sCisJCQkJCSAgICAgICBOTFNfTUFYX0NIQVJTRVRfU0laRSk7CisJCQlpZiAoY2hhcmxlbiA+IDApCisJCQkJb3V0bGVuICs9IGNoYXJsZW47CisJCQllbHNlCisJCQkJdG9bb3V0bGVuKytdID0gJz8nOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgKGkgPCBsZW4pICYmIGZyb21baV07IGkrKykgeworCQkJaWYgKGxlMTZfdG9fY3B1KGZyb21baV0pICYgMHhmZjAwKSB7CisJCQkJaWYgKHdhcm4pIHsKKwkJCQkJd2Fybi0tOworCQkJCQl3YXJuX2FnYWluLS07CisJCQkJCXByaW50ayhLRVJOX0VSUgorCQkJIm5vbi1sYXRpbjEgY2hhcmFjdGVyIDB4JXggZm91bmQgaW4gSkZTIGZpbGUgbmFtZVxuIiwgCisJCSAgICAgICAJCQkgICAgICAgbGUxNl90b19jcHUoZnJvbVtpXSkpOworCQkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkibW91bnQgd2l0aCBpb2NoYXJzZXQ9dXRmOCB0byBhY2Nlc3NcbiIpOworCQkJCX0KKwkJCQl0b1tpXSA9ICc/JzsKKwkJCX0KKwkJCWVsc2UKKwkJCQl0b1tpXSA9IChjaGFyKSAobGUxNl90b19jcHUoZnJvbVtpXSkpOworCQl9CisJCW91dGxlbiA9IGk7CisJfQorCXRvW291dGxlbl0gPSAwOworCXJldHVybiBvdXRsZW47Cit9CisKKy8qCisgKiBOQU1FOglqZnNfc3RydG9VQ1MoKQorICoKKyAqIEZVTkNUSU9OOglDb252ZXJ0IGNoYXJhY3RlciBzdHJpbmcgdG8gdW5pY29kZSBzdHJpbmcKKyAqCisgKi8KK3N0YXRpYyBpbnQgamZzX3N0cnRvVUNTKHdjaGFyX3QgKiB0bywgY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwgaW50IGxlbiwKKwkJc3RydWN0IG5sc190YWJsZSAqY29kZXBhZ2UpCit7CisJaW50IGNoYXJsZW47CisJaW50IGk7CisKKwlpZiAoY29kZXBhZ2UpIHsKKwkJZm9yIChpID0gMDsgbGVuICYmICpmcm9tOyBpKyssIGZyb20gKz0gY2hhcmxlbiwgbGVuIC09IGNoYXJsZW4pCisJCXsKKwkJCWNoYXJsZW4gPSBjb2RlcGFnZS0+Y2hhcjJ1bmkoZnJvbSwgbGVuLCAmdG9baV0pOworCQkJaWYgKGNoYXJsZW4gPCAxKSB7CisJCQkJamZzX2VycigiamZzX3N0cnRvVUNTOiBjaGFyMnVuaSByZXR1cm5lZCAlZC4iLAorCQkJCQljaGFybGVuKTsKKwkJCQlqZnNfZXJyKCJjaGFyc2V0ID0gJXMsIGNoYXIgPSAweCV4IiwKKwkJCQkJY29kZXBhZ2UtPmNoYXJzZXQsICpmcm9tKTsKKwkJCQlyZXR1cm4gY2hhcmxlbjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IChpIDwgbGVuKSAmJiBmcm9tW2ldOyBpKyspCisJCQl0b1tpXSA9ICh3Y2hhcl90KSBmcm9tW2ldOworCX0KKworCXRvW2ldID0gMDsKKwlyZXR1cm4gaTsKK30KKworLyoKKyAqIE5BTUU6CWdldF9VQ1NuYW1lKCkKKyAqCisgKiBGVU5DVElPTjoJQWxsb2NhdGUgYW5kIHRyYW5zbGF0ZSB0byB1bmljb2RlIHN0cmluZworICoKKyAqLworaW50IGdldF9VQ1NuYW1lKHN0cnVjdCBjb21wb25lbnRfbmFtZSAqIHVuaU5hbWUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHNfdGFiID0gSkZTX1NCSShkZW50cnktPmRfc2IpLT5ubHNfdGFiOworCWludCBsZW5ndGggPSBkZW50cnktPmRfbmFtZS5sZW47CisKKwlpZiAobGVuZ3RoID4gSkZTX05BTUVfTUFYKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXVuaU5hbWUtPm5hbWUgPQorCSAgICBrbWFsbG9jKChsZW5ndGggKyAxKSAqIHNpemVvZih3Y2hhcl90KSwgR0ZQX05PRlMpOworCisJaWYgKHVuaU5hbWUtPm5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwl1bmlOYW1lLT5uYW1sZW4gPSBqZnNfc3RydG9VQ1ModW5pTmFtZS0+bmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkgICAgICAgbGVuZ3RoLCBubHNfdGFiKTsKKworCWlmICh1bmlOYW1lLT5uYW1sZW4gPCAwKSB7CisJCWtmcmVlKHVuaU5hbWUtPm5hbWUpOworCQlyZXR1cm4gdW5pTmFtZS0+bmFtbGVuOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc191bmljb2RlLmggYi9mcy9qZnMvamZzX3VuaWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWUyNWViCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc191bmljb2RlLmgKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDAyCisgKiAgIFBvcnRpb25zIENvcHlyaWdodCAoYykgQ2hyaXN0b3BoIEhlbGx3aWcsIDIwMDEtMjAwMgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9IX0pGU19VTklDT0RFCisjZGVmaW5lIF9IX0pGU19VTklDT0RFCisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSAiamZzX3R5cGVzLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKwl3Y2hhcl90IHN0YXJ0OworCXdjaGFyX3QgZW5kOworCXNpZ25lZCBjaGFyICp0YWJsZTsKK30gVU5JQ0FTRVJBTkdFOworCitleHRlcm4gc2lnbmVkIGNoYXIgVW5pVXBwZXJUYWJsZVs1MTJdOworZXh0ZXJuIFVOSUNBU0VSQU5HRSBVbmlVcHBlclJhbmdlW107CitleHRlcm4gaW50IGdldF9VQ1NuYW1lKHN0cnVjdCBjb21wb25lbnRfbmFtZSAqLCBzdHJ1Y3QgZGVudHJ5ICopOworZXh0ZXJuIGludCBqZnNfc3RyZnJvbVVDU19sZShjaGFyICosIGNvbnN0IF9fbGUxNiAqLCBpbnQsIHN0cnVjdCBubHNfdGFibGUgKik7CisKKyNkZWZpbmUgZnJlZV9VQ1NuYW1lKENPTVApIGtmcmVlKChDT01QKS0+bmFtZSkKKworLyoKKyAqIFVuaVN0cmNweTogIENvcHkgYSBzdHJpbmcKKyAqLworc3RhdGljIGlubGluZSB3Y2hhcl90ICpVbmlTdHJjcHkod2NoYXJfdCAqIHVjczEsIGNvbnN0IHdjaGFyX3QgKiB1Y3MyKQoreworCXdjaGFyX3QgKmFuY2hvciA9IHVjczE7CS8qIHNhdmUgdGhlIHN0YXJ0IG9mIHJlc3VsdCBzdHJpbmcgKi8KKworCXdoaWxlICgoKnVjczErKyA9ICp1Y3MyKyspKTsKKwlyZXR1cm4gYW5jaG9yOworfQorCisKKworLyoKKyAqIFVuaVN0cm5jcHk6ICBDb3B5IGxlbmd0aCBsaW1pdGVkIHN0cmluZyB3aXRoIHBhZAorICovCitzdGF0aWMgaW5saW5lIF9fbGUxNiAqVW5pU3RybmNweV9sZShfX2xlMTYgKiB1Y3MxLCBjb25zdCBfX2xlMTYgKiB1Y3MyLAorCQkJCSAgc2l6ZV90IG4pCit7CisJX19sZTE2ICphbmNob3IgPSB1Y3MxOworCisJd2hpbGUgKG4tLSAmJiAqdWNzMikJLyogQ29weSB0aGUgc3RyaW5ncyAqLworCQkqdWNzMSsrID0gKnVjczIrKzsKKworCW4rKzsKKwl3aGlsZSAobi0tKQkJLyogUGFkIHdpdGggbnVsbHMgKi8KKwkJKnVjczErKyA9IDA7CisJcmV0dXJuIGFuY2hvcjsKK30KKworLyoKKyAqIFVuaVN0cm5jbXBfbGU6ICBDb21wYXJlIGxlbmd0aCBsaW1pdGVkIHN0cmluZyAtIG5hdGl2ZSB0byBsaXR0bGUtZW5kaWFuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IFVuaVN0cm5jbXBfbGUoY29uc3Qgd2NoYXJfdCAqIHVjczEsIGNvbnN0IF9fbGUxNiAqIHVjczIsCisJCQkJc2l6ZV90IG4pCit7CisJaWYgKCFuKQorCQlyZXR1cm4gMDsJLyogTnVsbCBzdHJpbmdzIGFyZSBlcXVhbCAqLworCXdoaWxlICgoKnVjczEgPT0gX19sZTE2X3RvX2NwdSgqdWNzMikpICYmICp1Y3MxICYmIC0tbikgeworCQl1Y3MxKys7CisJCXVjczIrKzsKKwl9CisJcmV0dXJuIChpbnQpICp1Y3MxIC0gKGludCkgX19sZTE2X3RvX2NwdSgqdWNzMik7Cit9CisKKy8qCisgKiBVbmlTdHJuY3B5X3RvX2xlOiAgQ29weSBsZW5ndGggbGltaXRlZCBzdHJpbmcgd2l0aCBwYWQgdG8gbGl0dGxlLWVuZGlhbgorICovCitzdGF0aWMgaW5saW5lIF9fbGUxNiAqVW5pU3RybmNweV90b19sZShfX2xlMTYgKiB1Y3MxLCBjb25zdCB3Y2hhcl90ICogdWNzMiwKKwkJCQkgICAgICAgc2l6ZV90IG4pCit7CisJX19sZTE2ICphbmNob3IgPSB1Y3MxOworCisJd2hpbGUgKG4tLSAmJiAqdWNzMikJLyogQ29weSB0aGUgc3RyaW5ncyAqLworCQkqdWNzMSsrID0gY3B1X3RvX2xlMTYoKnVjczIrKyk7CisKKwluKys7CisJd2hpbGUgKG4tLSkJCS8qIFBhZCB3aXRoIG51bGxzICovCisJCSp1Y3MxKysgPSAwOworCXJldHVybiBhbmNob3I7Cit9CisKKy8qCisgKiBVbmlTdHJuY3B5X2Zyb21fbGU6ICBDb3B5IGxlbmd0aCBsaW1pdGVkIHN0cmluZyB3aXRoIHBhZCBmcm9tIGxpdHRsZS1lbmRpYW4KKyAqLworc3RhdGljIGlubGluZSB3Y2hhcl90ICpVbmlTdHJuY3B5X2Zyb21fbGUod2NoYXJfdCAqIHVjczEsIGNvbnN0IF9fbGUxNiAqIHVjczIsCisJCQkJCSAgc2l6ZV90IG4pCit7CisJd2NoYXJfdCAqYW5jaG9yID0gdWNzMTsKKworCXdoaWxlIChuLS0gJiYgKnVjczIpCS8qIENvcHkgdGhlIHN0cmluZ3MgKi8KKwkJKnVjczErKyA9IF9fbGUxNl90b19jcHUoKnVjczIrKyk7CisKKwluKys7CisJd2hpbGUgKG4tLSkJCS8qIFBhZCB3aXRoIG51bGxzICovCisJCSp1Y3MxKysgPSAwOworCXJldHVybiBhbmNob3I7Cit9CisKKy8qCisgKiBVbmlUb3VwcGVyOiAgQ29udmVydCBhIHVuaWNvZGUgY2hhcmFjdGVyIHRvIHVwcGVyIGNhc2UKKyAqLworc3RhdGljIGlubGluZSB3Y2hhcl90IFVuaVRvdXBwZXIod2NoYXJfdCB1YykKK3sKKwlVTklDQVNFUkFOR0UgKnJwOworCisJaWYgKHVjIDwgc2l6ZW9mKFVuaVVwcGVyVGFibGUpKSB7CS8qIExhdGluIGNoYXJhY3RlcnMgKi8KKwkJcmV0dXJuIHVjICsgVW5pVXBwZXJUYWJsZVt1Y107CS8qIFVzZSBiYXNlIHRhYmxlcyAqLworCX0gZWxzZSB7CisJCXJwID0gVW5pVXBwZXJSYW5nZTsJLyogVXNlIHJhbmdlIHRhYmxlcyAqLworCQl3aGlsZSAocnAtPnN0YXJ0KSB7CisJCQlpZiAodWMgPCBycC0+c3RhcnQpCS8qIEJlZm9yZSBzdGFydCBvZiByYW5nZSAqLworCQkJCXJldHVybiB1YzsJLyogVXBwZXJjYXNlID0gaW5wdXQgKi8KKwkJCWlmICh1YyA8PSBycC0+ZW5kKQkvKiBJbiByYW5nZSAqLworCQkJCXJldHVybiB1YyArIHJwLT50YWJsZVt1YyAtIHJwLT5zdGFydF07CisJCQlycCsrOwkvKiBUcnkgbmV4dCByYW5nZSAqLworCQl9CisJfQorCXJldHVybiB1YzsJCS8qIFBhc3QgbGFzdCByYW5nZSAqLworfQorCisKKy8qCisgKiBVbmlTdHJ1cHI6ICBVcHBlciBjYXNlIGEgdW5pY29kZSBzdHJpbmcKKyAqLworc3RhdGljIGlubGluZSB3Y2hhcl90ICpVbmlTdHJ1cHIod2NoYXJfdCAqIHVwaW4pCit7CisJd2NoYXJfdCAqdXA7CisKKwl1cCA9IHVwaW47CisJd2hpbGUgKCp1cCkgewkJLyogRm9yIGFsbCBjaGFyYWN0ZXJzICovCisJCSp1cCA9IFVuaVRvdXBwZXIoKnVwKTsKKwkJdXArKzsKKwl9CisJcmV0dXJuIHVwaW47CQkvKiBSZXR1cm4gaW5wdXQgcG9pbnRlciAqLworfQorCisjZW5kaWYJCQkJLyogIV9IX0pGU19VTklDT0RFICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX3VuaXVwci5jIGIvZnMvamZzL2pmc191bml1cHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWIxODVkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc191bml1cHIuYwpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAwLTIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlICJqZnNfdW5pY29kZS5oIgorCisvKgorICogTGF0aW4gdXBwZXIgY2FzZQorICovCitzaWduZWQgY2hhciBVbmlVcHBlclRhYmxlWzUxMl0gPSB7CisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwMDAtMDBmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwMTAtMDFmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwMjAtMDJmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwMzAtMDNmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwNDAtMDRmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwNTAtMDVmICovCisgICAwLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLCAvKiAwNjAtMDZmICovCisgLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwNzAtMDdmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwODAtMDhmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwOTAtMDlmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwYTAtMGFmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwYjAtMGJmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwYzAtMGNmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwZDAtMGRmICovCisgLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLCAvKiAwZTAtMGVmICovCisgLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLCAgMCwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsMTIxLCAvKiAwZjAtMGZmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxMDAtMTBmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxMTAtMTFmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxMjAtMTJmICovCisgICAwLCAgMCwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAvKiAxMzAtMTNmICovCisgIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxNDAtMTRmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxNTAtMTVmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxNjAtMTZmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAvKiAxNzAtMTdmICovCisgICAwLCAgMCwgIDAsIC0xLCAgMCwgLTEsICAwLCAgMCwgLTEsICAwLCAgMCwgIDAsIC0xLCAgMCwgIDAsICAwLCAvKiAxODAtMThmICovCisgICAwLCAgMCwgLTEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC0xLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAxOTAtMTlmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAgMCwgLTEsICAwLCAgMCwgIDAsICAwLCAtMSwgIDAsICAwLCAvKiAxYTAtMWFmICovCisgIC0xLCAgMCwgIDAsICAwLCAtMSwgIDAsIC0xLCAgMCwgIDAsIC0xLCAgMCwgIDAsICAwLCAtMSwgIDAsICAwLCAvKiAxYjAtMWJmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgLTEsIC0yLCAgMCwgLTEsIC0yLCAgMCwgLTEsIC0yLCAgMCwgLTEsICAwLCAvKiAxYzAtMWNmICovCisgIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLC03OSwgIDAsIC0xLCAvKiAxZDAtMWRmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxZTAtMWVmICovCisgICAwLCAgMCwgLTEsIC0yLCAgMCwgLTEsICAwLCAgMCwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxZjAtMWZmICovCit9OworCisvKiBVcHBlciBjYXNlIHJhbmdlIC0gR3JlZWsgKi8KK3N0YXRpYyBzaWduZWQgY2hhciBVbmlDYXNlUmFuZ2VVMDNhMFs0N10gPSB7CisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsLTM4LC0zNywtMzcsLTM3LCAvKiAzYTAtM2FmICovCisgICAwLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLCAvKiAzYjAtM2JmICovCisgLTMyLC0zMiwtMzEsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTY0LC02MywtNjMsCit9OworCisvKiBVcHBlciBjYXNlIHJhbmdlIC0gQ3lyaWxsaWMgKi8KK3N0YXRpYyBzaWduZWQgY2hhciBVbmlDYXNlUmFuZ2VVMDQzMFs0OF0gPSB7CisgLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLCAvKiA0MzAtNDNmICovCisgLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLCAvKiA0NDAtNDRmICovCisgICAwLC04MCwtODAsLTgwLC04MCwtODAsLTgwLC04MCwtODAsLTgwLC04MCwtODAsLTgwLCAgMCwtODAsLTgwLCAvKiA0NTAtNDVmICovCit9OworCisvKiBVcHBlciBjYXNlIHJhbmdlIC0gRXh0ZW5kZWQgY3lyaWxsaWMgKi8KK3N0YXRpYyBzaWduZWQgY2hhciBVbmlDYXNlUmFuZ2VVMDQ5MFs2MV0gPSB7CisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiA0OTAtNDlmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiA0YTAtNGFmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiA0YjAtNGJmICovCisgICAwLCAgMCwgLTEsICAwLCAtMSwgIDAsICAwLCAgMCwgLTEsICAwLCAgMCwgIDAsIC0xLAorfTsKKworLyogVXBwZXIgY2FzZSByYW5nZSAtIEV4dGVuZGVkIGxhdGluIGFuZCBncmVlayAqLworc3RhdGljIHNpZ25lZCBjaGFyIFVuaUNhc2VSYW5nZVUxZTAwWzUwOV0gPSB7CisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxZTAwLTFlMGYgKi8KKyAgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsIC8qIDFlMTAtMWUxZiAqLworICAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgLyogMWUyMC0xZTJmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxZTMwLTFlM2YgKi8KKyAgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsIC8qIDFlNDAtMWU0ZiAqLworICAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgLyogMWU1MC0xZTVmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxZTYwLTFlNmYgKi8KKyAgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsIC8qIDFlNzAtMWU3ZiAqLworICAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgLyogMWU4MC0xZThmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAgMCwgIDAsICAwLCAgMCwtNTksICAwLCAtMSwgIDAsIC0xLCAvKiAxZTkwLTFlOWYgKi8KKyAgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsIC8qIDFlYTAtMWVhZiAqLworICAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgLyogMWViMC0xZWJmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxZWMwLTFlY2YgKi8KKyAgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsIC8qIDFlZDAtMWVkZiAqLworICAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgLyogMWVlMC0xZWVmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAxZWYwLTFlZmYgKi8KKyAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC8qIDFmMDAtMWYwZiAqLworICAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLyogMWYxMC0xZjFmICovCisgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAxZjIwLTFmMmYgKi8KKyAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC8qIDFmMzAtMWYzZiAqLworICAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLyogMWY0MC0xZjRmICovCisgICAwLCAgOCwgIDAsICA4LCAgMCwgIDgsICAwLCAgOCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAxZjUwLTFmNWYgKi8KKyAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC8qIDFmNjAtMWY2ZiAqLworICA3NCwgNzQsIDg2LCA4NiwgODYsIDg2LDEwMCwxMDAsICAwLCAgMCwxMTIsMTEyLDEyNiwxMjYsICAwLCAgMCwgLyogMWY3MC0xZjdmICovCisgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAxZjgwLTFmOGYgKi8KKyAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC8qIDFmOTAtMWY5ZiAqLworICAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLyogMWZhMC0xZmFmICovCisgICA4LCAgOCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAxZmIwLTFmYmYgKi8KKyAgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC8qIDFmYzAtMWZjZiAqLworICAgOCwgIDgsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLyogMWZkMC0xZmRmICovCisgICA4LCAgOCwgIDAsICAwLCAgMCwgIDcsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAxZmUwLTFmZWYgKi8KKyAgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCit9OworCisvKiBVcHBlciBjYXNlIHJhbmdlIC0gV2lkZSBsYXRpbiAqLworc3RhdGljIHNpZ25lZCBjaGFyIFVuaUNhc2VSYW5nZVVmZjQwWzI3XSA9IHsKKyAgIDAsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsIC8qIGZmNDAtZmY0ZiAqLworIC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsCit9OworCisvKgorICogVXBwZXIgQ2FzZSBSYW5nZQorICovCitVTklDQVNFUkFOR0UgVW5pVXBwZXJSYW5nZVtdID0geworICAgIHsgMHgwM2EwLCAgMHgwM2NlLCAgVW5pQ2FzZVJhbmdlVTAzYTAgfSwKKyAgICB7IDB4MDQzMCwgIDB4MDQ1ZiwgIFVuaUNhc2VSYW5nZVUwNDMwIH0sCisgICAgeyAweDA0OTAsICAweDA0Y2MsICBVbmlDYXNlUmFuZ2VVMDQ5MCB9LAorICAgIHsgMHgxZTAwLCAgMHgxZmZjLCAgVW5pQ2FzZVJhbmdlVTFlMDAgfSwKKyAgICB7IDB4ZmY0MCwgIDB4ZmY1YSwgIFVuaUNhc2VSYW5nZVVmZjQwIH0sCisgICAgeyAwIH0KK307CmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX3hhdHRyLmggYi9mcy9qZnMvamZzX3hhdHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwNTJmMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfeGF0dHIuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwMgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgSF9KRlNfWEFUVFIKKyNkZWZpbmUgSF9KRlNfWEFUVFIKKworLyoKKyAqIGpmc19lYV9saXN0IGRlc2NyaWJlIHRoZSBvbi1kaXNrIGZvcm1hdCBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlcy4KKyAqIEkga25vdyB0aGUgbnVsbC10ZXJtaW5hdG9yIGlzIHJlZHVuZGFudCBzaW5jZSBuYW1lbGVuIGlzIHN0b3JlZCwgYnV0CisgKiBJIGFtIG1haW50YWluaW5nIGNvbXBhdGliaWxpdHkgd2l0aCBPUy8yIHdoZXJlIHBvc3NpYmxlLgorICovCitzdHJ1Y3QgamZzX2VhIHsKKwl1OCBmbGFnOwkvKiBVbnVzZWQ/ICovCisJdTggbmFtZWxlbjsJLyogTGVuZ3RoIG9mIG5hbWUgKi8KKwlfX2xlMTYgdmFsdWVsZW47CS8qIExlbmd0aCBvZiB2YWx1ZSAqLworCWNoYXIgbmFtZVswXTsJLyogQXR0cmlidXRlIG5hbWUgKGluY2x1ZGVzIG51bGwtdGVybWluYXRvcikgKi8KK307CQkJLyogVmFsdWUgaW1tZWRpYXRlbHkgZm9sbG93cyBuYW1lICovCisKK3N0cnVjdCBqZnNfZWFfbGlzdCB7CisJX19sZTMyIHNpemU7CQkvKiBvdmVyYWxsIHNpemUgKi8KKwlzdHJ1Y3QgamZzX2VhIGVhWzBdOwkvKiBWYXJpYWJsZSBsZW5ndGggbGlzdCAqLworfTsKKworLyogTWFjcm9zIGZvciBkZWZpbmluZyBtYXhpdW11bSBudW1iZXIgb2YgYnl0ZXMgc3VwcG9ydGVkIGZvciBFQXMgKi8KKyNkZWZpbmUgTUFYRUFTSVpFCTY1NTM1CisjZGVmaW5lIE1BWEVBTElTVFNJWkUJTUFYRUFTSVpFCisKKy8qCisgKiBzb21lIG1hY3JvcyBmb3IgZGVhbGluZyB3aXRoIHZhcmlhYmxlIGxlbmd0aCBFQSBsaXN0cy4KKyAqLworI2RlZmluZSBFQV9TSVpFKGVhKSBcCisJKHNpemVvZiAoc3RydWN0IGpmc19lYSkgKyAoZWEpLT5uYW1lbGVuICsgMSArIFwKKwkgbGUxNl90b19jcHUoKGVhKS0+dmFsdWVsZW4pKQorI2RlZmluZQlORVhUX0VBKGVhKSAoKHN0cnVjdCBqZnNfZWEgKikgKCgoY2hhciAqKSAoZWEpKSArIChFQV9TSVpFIChlYSkpKSkKKyNkZWZpbmUJRklSU1RfRUEoZWFsaXN0KSAoKGVhbGlzdCktPmVhKQorI2RlZmluZQlFQUxJU1RfU0laRShlYWxpc3QpIGxlMzJfdG9fY3B1KChlYWxpc3QpLT5zaXplKQorI2RlZmluZQlFTkRfRUFMSVNUKGVhbGlzdCkgXAorCSgoc3RydWN0IGpmc19lYSAqKSAoKChjaGFyICopIChlYWxpc3QpKSArIEVBTElTVF9TSVpFKGVhbGlzdCkpKQorCitleHRlcm4gaW50IF9famZzX3NldHhhdHRyKHN0cnVjdCBpbm9kZSAqLCBjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LAorCQkJICBpbnQpOworZXh0ZXJuIGludCBqZnNfc2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqLCBjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LAorCQkJaW50KTsKK2V4dGVybiBzc2l6ZV90IF9famZzX2dldHhhdHRyKHN0cnVjdCBpbm9kZSAqLCBjb25zdCBjaGFyICosIHZvaWQgKiwgc2l6ZV90KTsKK2V4dGVybiBzc2l6ZV90IGpmc19nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCBzaXplX3QpOworZXh0ZXJuIHNzaXplX3QgamZzX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQgamZzX3JlbW92ZXhhdHRyKHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqKTsKKworI2VuZGlmCS8qIEhfSkZTX1hBVFRSICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX3h0cmVlLmMgYi9mcy9qZnMvamZzX3h0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjNThjNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfeHRyZWUuYwpAQCAtMCwwICsxLDQ0ODUgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDA0CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKy8qCisgKiAgICAgIGpmc194dHJlZS5jOiBleHRlbnQgYWxsb2NhdGlvbiBkZXNjcmlwdG9yIEIrLXRyZWUgbWFuYWdlcgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSAiamZzX2luY29yZS5oIgorI2luY2x1ZGUgImpmc19maWxzeXMuaCIKKyNpbmNsdWRlICJqZnNfbWV0YXBhZ2UuaCIKKyNpbmNsdWRlICJqZnNfZG1hcC5oIgorI2luY2x1ZGUgImpmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJqZnNfc3VwZXJibG9jay5oIgorI2luY2x1ZGUgImpmc19kZWJ1Zy5oIgorCisvKgorICogeHRyZWUgbG9jYWwgZmxhZworICovCisjZGVmaW5lIFhUX0lOU0VSVCAgICAgICAweDAwMDAwMDAxCisKKy8qCisgKiAgICAgICB4dHJlZSBrZXkvZW50cnkgY29tcGFyaXNvbjogZXh0ZW50IG9mZnNldAorICoKKyAqIHJldHVybjoKKyAqICAgICAgLTE6IGsgPCBzdGFydCBvZiBleHRlbnQKKyAqICAgICAgIDA6IHN0YXJ0X29mX2V4dGVudCA8PSBrIDw9IGVuZF9vZl9leHRlbnQKKyAqICAgICAgIDE6IGsgPiBlbmRfb2ZfZXh0ZW50CisgKi8KKyNkZWZpbmUgWFRfQ01QKENNUCwgSywgWCwgT0ZGU0VUNjQpXAore1wKKyAgICAgICAgT0ZGU0VUNjQgPSBvZmZzZXRYQUQoWCk7XAorICAgICAgICAoQ01QKSA9ICgoSykgPj0gT0ZGU0VUNjQgKyBsZW5ndGhYQUQoWCkpID8gMSA6XAorICAgICAgICAgICAgICAoKEspIDwgT0ZGU0VUNjQpID8gLTEgOiAwO1wKK30KKworLyogd3JpdGUgYSB4YWQgZW50cnkgKi8KKyNkZWZpbmUgWFRfUFVURU5UUlkoWEFELCBGTEFHLCBPRkYsIExFTiwgQUREUilcCit7XAorICAgICAgICAoWEFEKS0+ZmxhZyA9IChGTEFHKTtcCisgICAgICAgIFhBRG9mZnNldCgoWEFEKSwgKE9GRikpO1wKKyAgICAgICAgWEFEbGVuZ3RoKChYQUQpLCAoTEVOKSk7XAorICAgICAgICBYQURhZGRyZXNzKChYQUQpLCAoQUREUikpO1wKK30KKworI2RlZmluZSBYVF9QQUdFKElQLCBNUCkgQlRfUEFHRShJUCwgTVAsIHh0cGFnZV90LCBpX3h0cm9vdCkKKworLyogZ2V0IHBhZ2UgYnVmZmVyIGZvciBzcGVjaWZpZWQgYmxvY2sgYWRkcmVzcyAqLworLyogVG9EbzogUmVwbGFjZSB0aGlzIHVnbHkgbWFjcm8gd2l0aCBhIGZ1bmN0aW9uICovCisjZGVmaW5lIFhUX0dFVFBBR0UoSVAsIEJOLCBNUCwgU0laRSwgUCwgUkMpXAore1wKKwlCVF9HRVRQQUdFKElQLCBCTiwgTVAsIHh0cGFnZV90LCBTSVpFLCBQLCBSQywgaV94dHJvb3QpXAorCWlmICghKFJDKSlcCisJe1wKKwkJaWYgKChsZTE2X3RvX2NwdSgoUCktPmhlYWRlci5uZXh0aW5kZXgpIDwgWFRFTlRSWVNUQVJUKSB8fFwKKwkJICAgIChsZTE2X3RvX2NwdSgoUCktPmhlYWRlci5uZXh0aW5kZXgpID4gbGUxNl90b19jcHUoKFApLT5oZWFkZXIubWF4ZW50cnkpKSB8fFwKKwkJICAgIChsZTE2X3RvX2NwdSgoUCktPmhlYWRlci5tYXhlbnRyeSkgPiAoKChCTik9PTApP1hUUk9PVE1BWFNMT1Q6UFNJWkU+PkwyWFRTTE9UU0laRSkpKVwKKwkJe1wKKwkJCWpmc19lcnJvcigoSVApLT5pX3NiLCAiWFRfR0VUUEFHRTogeHRyZWUgcGFnZSBjb3JydXB0Iik7XAorCQkJQlRfUFVUUEFHRShNUCk7XAorCQkJTVAgPSBOVUxMO1wKKwkJCVJDID0gLUVJTztcCisJCX1cCisgICAgICAgIH1cCit9CisKKy8qIGZvciBjb25zaXN0ZW5jeSAqLworI2RlZmluZSBYVF9QVVRQQUdFKE1QKSBCVF9QVVRQQUdFKE1QKQorCisjZGVmaW5lIFhUX0dFVFNFQVJDSChJUCwgTEVBRiwgQk4sIE1QLCAgUCwgSU5ERVgpIFwKKwlCVF9HRVRTRUFSQ0goSVAsIExFQUYsIEJOLCBNUCwgeHRwYWdlX3QsIFAsIElOREVYLCBpX3h0cm9vdCkKKy8qIHh0cmVlIGVudHJ5IHBhcmFtZXRlciBkZXNjcmlwdG9yICovCitzdHJ1Y3QgeHRzcGxpdCB7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwlzMTYgaW5kZXg7CisJdTggZmxhZzsKKwlzNjQgb2ZmOworCXM2NCBhZGRyOworCWludCBsZW47CisJc3RydWN0IHB4ZGxpc3QgKnB4ZGxpc3Q7Cit9OworCisKKy8qCisgKiAgICAgIHN0YXRpc3RpY3MKKyAqLworI2lmZGVmIENPTkZJR19KRlNfU1RBVElTVElDUworc3RhdGljIHN0cnVjdCB7CisJdWludCBzZWFyY2g7CisJdWludCBmYXN0U2VhcmNoOworCXVpbnQgc3BsaXQ7Cit9IHh0U3RhdDsKKyNlbmRpZgorCisKKy8qCisgKiBmb3J3YXJkIHJlZmVyZW5jZXMKKyAqLworc3RhdGljIGludCB4dFNlYXJjaChzdHJ1Y3QgaW5vZGUgKmlwLAorCQkgICAgczY0IHhvZmYsIGludCAqY21wcCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrLCBpbnQgZmxhZyk7CisKK3N0YXRpYyBpbnQgeHRTcGxpdFVwKHRpZF90IHRpZCwKKwkJICAgICBzdHJ1Y3QgaW5vZGUgKmlwLAorCQkgICAgIHN0cnVjdCB4dHNwbGl0ICogc3BsaXQsIHN0cnVjdCBidHN0YWNrICogYnRzdGFjayk7CisKK3N0YXRpYyBpbnQgeHRTcGxpdFBhZ2UodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgeHRzcGxpdCAqIHNwbGl0LAorCQkgICAgICAgc3RydWN0IG1ldGFwYWdlICoqIHJtcHAsIHM2NCAqIHJibnApOworCitzdGF0aWMgaW50IHh0U3BsaXRSb290KHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwKKwkJICAgICAgIHN0cnVjdCB4dHNwbGl0ICogc3BsaXQsIHN0cnVjdCBtZXRhcGFnZSAqKiBybXBwKTsKKworI2lmZGVmIF9TVElMTF9UT19QT1JUCitzdGF0aWMgaW50IHh0RGVsZXRlVXAodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgbWV0YXBhZ2UgKiBmbXAsCisJCSAgICAgIHh0cGFnZV90ICogZnAsIHN0cnVjdCBidHN0YWNrICogYnRzdGFjayk7CisKK3N0YXRpYyBpbnQgeHRTZWFyY2hOb2RlKHN0cnVjdCBpbm9kZSAqaXAsCisJCQl4YWRfdCAqIHhhZCwKKwkJCWludCAqY21wcCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrLCBpbnQgZmxhZyk7CisKK3N0YXRpYyBpbnQgeHRSZWxpbmsodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCB4dHBhZ2VfdCAqIGZwKTsKKyNlbmRpZgkJCQkvKiAgX1NUSUxMX1RPX1BPUlQgKi8KKworLyogRXh0ZXJuYWwgcmVmZXJlbmNlcyAqLworCisvKgorICogICAgICBkZWJ1ZyBjb250cm9sCisgKi8KKy8qICAgICAgI2RlZmluZSBfSkZTX0RFQlVHX1hUUkVFICAgICAgICAxICovCisKKworLyoKKyAqICAgICAgeHRMb29rdXAoKQorICoKKyAqIGZ1bmN0aW9uOiBtYXAgYSBzaW5nbGUgcGFnZSBpbnRvIGEgcGh5c2ljYWwgZXh0ZW50OworICovCitpbnQgeHRMb29rdXAoc3RydWN0IGlub2RlICppcCwgczY0IGxzdGFydCwKKwkgICAgIHM2NCBsbGVuLCBpbnQgKnBmbGFnLCBzNjQgKiBwYWRkciwgczMyICogcGxlbiwgaW50IG5vX2NoZWNrKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsKKwlpbnQgY21wOworCXM2NCBibjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXh0cGFnZV90ICpwOworCWludCBpbmRleDsKKwl4YWRfdCAqeGFkOworCXM2NCBzaXplLCB4b2ZmLCB4ZW5kOworCWludCB4bGVuOworCXM2NCB4YWRkcjsKKworCSpwbGVuID0gMDsKKworCWlmICghbm9fY2hlY2spIHsKKwkJLyogaXMgbG9va3VwIG9mZnNldCBiZXlvbmQgZW9mID8gKi8KKwkJc2l6ZSA9ICgodTY0KSBpcC0+aV9zaXplICsgKEpGU19TQkkoaXAtPmlfc2IpLT5ic2l6ZSAtIDEpKSA+PgorCQkgICAgSkZTX1NCSShpcC0+aV9zYiktPmwyYnNpemU7CisJCWlmIChsc3RhcnQgPj0gc2l6ZSkgeworCQkJamZzX2VycigieHRMb29rdXA6IGxzdGFydCAoMHglbHgpID49IHNpemUgKDB4JWx4KSIsCisJCQkJKHVsb25nKSBsc3RhcnQsICh1bG9uZykgc2l6ZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qCisJICogc2VhcmNoIGZvciB0aGUgeGFkIGVudHJ5IGNvdmVyaW5nIHRoZSBsb2dpY2FsIGV4dGVudAorCSAqLworLy9zZWFyY2g6CisJaWYgKChyYyA9IHh0U2VhcmNoKGlwLCBsc3RhcnQsICZjbXAsICZidHN0YWNrLCAwKSkpIHsKKwkJamZzX2VycigieHRMb29rdXA6IHh0U2VhcmNoIHJldHVybmVkICVkIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyoKKwkgKiAgICAgIGNvbXB1dGUgdGhlIHBoeXNpY2FsIGV4dGVudCBjb3ZlcmluZyBsb2dpY2FsIGV4dGVudAorCSAqCisJICogTi5CLiBzZWFyY2ggbWF5IGhhdmUgZmFpbGVkIChlLmcuLCBob2xlIGluIHNwYXJzZSBmaWxlKSwKKwkgKiBhbmQgcmV0dXJuZWQgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGVudHJ5LgorCSAqLworCS8qIHJldHJpZXZlIHNlYXJjaCByZXN1bHQgKi8KKwlYVF9HRVRTRUFSQ0goaXAsIGJ0c3RhY2sudG9wLCBibiwgbXAsIHAsIGluZGV4KTsKKworCS8qIGlzIHhhZCBmb3VuZCBjb3ZlcmluZyBzdGFydCBvZiBsb2dpY2FsIGV4dGVudCA/CisJICogbHN0YXJ0IGlzIGEgcGFnZSBzdGFydCBhZGRyZXNzLAorCSAqIGkuZS4sIGxzdGFydCBjYW5ub3Qgc3RhcnQgaW4gYSBob2xlOworCSAqLworCWlmIChjbXApCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBseGQgY292ZXJlZCBieSB4YWQKKwkgKi8KKwl4YWQgPSAmcC0+eGFkW2luZGV4XTsKKwl4b2ZmID0gb2Zmc2V0WEFEKHhhZCk7CisJeGxlbiA9IGxlbmd0aFhBRCh4YWQpOworCXhlbmQgPSB4b2ZmICsgeGxlbjsKKwl4YWRkciA9IGFkZHJlc3NYQUQoeGFkKTsKKworCS8qIGluaXRpYWxpemUgbmV3IHB4ZCAqLworCSpwZmxhZyA9IHhhZC0+ZmxhZzsKKwkqcGFkZHIgPSB4YWRkciArIChsc3RhcnQgLSB4b2ZmKTsKKwkvKiBhIHBhZ2UgbXVzdCBiZSBmdWxseSBjb3ZlcmVkIGJ5IGFuIHhhZCAqLworCSpwbGVuID0gbWluKHhlbmQgLSBsc3RhcnQsIGxsZW4pOworCisgICAgICBvdXQ6CisJWFRfUFVUUEFHRShtcCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyoKKyAqICAgICAgeHRMb29rdXBMaXN0KCkKKyAqCisgKiBmdW5jdGlvbjogbWFwIGEgc2luZ2xlIGxvZ2ljYWwgZXh0ZW50IGludG8gYSBsaXN0IG9mIHBoeXNpY2FsIGV4dGVudDsKKyAqCisgKiBwYXJhbWV0ZXI6CisgKiAgICAgIHN0cnVjdCBpbm9kZSAgICAqaXAsCisgKiAgICAgIHN0cnVjdCBseGRsaXN0ICAqbHhkbGlzdCwgICAgICAgbHhkIGxpc3QgKGluKQorICogICAgICBzdHJ1Y3QgeGFkbGlzdCAgKnhhZGxpc3QsICAgICAgIHhhZCBsaXN0IChpbi9vdXQpCisgKiAgICAgIGludAkJZmxhZykKKyAqCisgKiBjb3ZlcmFnZSBvZiBseGQgYnkgeGFkIHVuZGVyIGFzc3VtcHRpb24gb2YKKyAqIC4gbHhkJ3MgYXJlIG9yZGVyZWQgYW5kIGRpc2pvaW50LgorICogLiB4YWQncyBhcmUgb3JkZXJlZCBhbmQgZGlzam9pbnQuCisgKgorICogcmV0dXJuOgorICogICAgICAwOiAgICAgIHN1Y2Nlc3MKKyAqCisgKiBub3RlOiBhIHBhZ2UgYmVpbmcgd3JpdHRlbiAoZXZlbiBhIHNpbmdsZSBieXRlKSBpcyBiYWNrZWQgZnVsbHksCisgKiAgICAgIGV4Y2VwdCB0aGUgbGFzdCBwYWdlIHdoaWNoIGlzIG9ubHkgYmFja2VkIHdpdGggYmxvY2tzCisgKiAgICAgIHJlcXVpcmVkIHRvIGNvdmVyIHRoZSBsYXN0IGJ5dGU7CisgKiAgICAgIHRoZSBleHRlbnQgYmFja2luZyBhIHBhZ2UgaXMgZnVsbHkgY29udGFpbmVkIHdpdGhpbiBhbiB4YWQ7CisgKi8KK2ludCB4dExvb2t1cExpc3Qoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGx4ZGxpc3QgKiBseGRsaXN0LAorCQkgc3RydWN0IHhhZGxpc3QgKiB4YWRsaXN0LCBpbnQgZmxhZykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBidHN0YWNrIGJ0c3RhY2s7CisJaW50IGNtcDsKKwlzNjQgYm47CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwl4dHBhZ2VfdCAqcDsKKwlpbnQgaW5kZXg7CisJbHhkX3QgKmx4ZDsKKwl4YWRfdCAqeGFkLCAqcHhkOworCXM2NCBzaXplLCBsc3RhcnQsIGxlbmQsIHhzdGFydCwgeGVuZCwgcHN0YXJ0OworCXM2NCBsbGVuLCB4bGVuLCBwbGVuOworCXM2NCB4YWRkciwgcGFkZHI7CisJaW50IG5seGQsIG5weGQsIG1heG5weGQ7CisKKwlucHhkID0geGFkbGlzdC0+bnhhZCA9IDA7CisJbWF4bnB4ZCA9IHhhZGxpc3QtPm1heG54YWQ7CisJcHhkID0geGFkbGlzdC0+eGFkOworCisJbmx4ZCA9IGx4ZGxpc3QtPm5seGQ7CisJbHhkID0gbHhkbGlzdC0+bHhkOworCisJbHN0YXJ0ID0gb2Zmc2V0TFhEKGx4ZCk7CisJbGxlbiA9IGxlbmd0aExYRChseGQpOworCWxlbmQgPSBsc3RhcnQgKyBsbGVuOworCisJc2l6ZSA9IChpcC0+aV9zaXplICsgKEpGU19TQkkoaXAtPmlfc2IpLT5ic2l6ZSAtIDEpKSA+PgorCSAgICBKRlNfU0JJKGlwLT5pX3NiKS0+bDJic2l6ZTsKKworCS8qCisJICogc2VhcmNoIGZvciB0aGUgeGFkIGVudHJ5IGNvdmVyaW5nIHRoZSBsb2dpY2FsIGV4dGVudAorCSAqLworICAgICAgc2VhcmNoOgorCWlmIChsc3RhcnQgPj0gc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKHJjID0geHRTZWFyY2goaXAsIGxzdGFydCwgJmNtcCwgJmJ0c3RhY2ssIDApKSkKKwkJcmV0dXJuIHJjOworCisJLyoKKwkgKiAgICAgIGNvbXB1dGUgdGhlIHBoeXNpY2FsIGV4dGVudCBjb3ZlcmluZyBsb2dpY2FsIGV4dGVudAorCSAqCisJICogTi5CLiBzZWFyY2ggbWF5IGhhdmUgZmFpbGVkIChlLmcuLCBob2xlIGluIHNwYXJzZSBmaWxlKSwKKwkgKiBhbmQgcmV0dXJuZWQgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGVudHJ5LgorCSAqLworLy9tYXA6CisJLyogcmV0cmlldmUgc2VhcmNoIHJlc3VsdCAqLworCVhUX0dFVFNFQVJDSChpcCwgYnRzdGFjay50b3AsIGJuLCBtcCwgcCwgaW5kZXgpOworCisJLyogaXMgeGFkIG9uIHRoZSBuZXh0IHNpYmxpbmcgcGFnZSA/ICovCisJaWYgKGluZGV4ID09IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpKSB7CisJCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX1JPT1QpCisJCQlnb3RvIG1hcGVuZDsKKworCQlpZiAoKGJuID0gbGU2NF90b19jcHUocC0+aGVhZGVyLm5leHQpKSA9PSAwKQorCQkJZ290byBtYXBlbmQ7CisKKwkJWFRfUFVUUEFHRShtcCk7CisKKwkJLyogZ2V0IG5leHQgc2libGluZyBwYWdlICovCisJCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCWluZGV4ID0gWFRFTlRSWVNUQVJUOworCX0KKworCXhhZCA9ICZwLT54YWRbaW5kZXhdOworCisJLyoKKwkgKiBpcyBseGQgY292ZXJlZCBieSB4YWQgPworCSAqLworICAgICAgY29tcGFyZToKKwl4c3RhcnQgPSBvZmZzZXRYQUQoeGFkKTsKKwl4bGVuID0gbGVuZ3RoWEFEKHhhZCk7CisJeGVuZCA9IHhzdGFydCArIHhsZW47CisJeGFkZHIgPSBhZGRyZXNzWEFEKHhhZCk7CisKKyAgICAgIGNvbXBhcmUxOgorCWlmICh4c3RhcnQgPCBsc3RhcnQpCisJCWdvdG8gY29tcGFyZTI7CisKKwkvKiAobHN0YXJ0IDw9IHhzdGFydCkgKi8KKworCS8qIGx4ZCBpcyBOT1QgY292ZXJlZCBieSB4YWQgKi8KKwlpZiAobGVuZCA8PSB4c3RhcnQpIHsKKwkJLyoKKwkJICogZ2V0IG5leHQgbHhkCisJCSAqLworCQlpZiAoLS1ubHhkID09IDApCisJCQlnb3RvIG1hcGVuZDsKKwkJbHhkKys7CisKKwkJbHN0YXJ0ID0gb2Zmc2V0TFhEKGx4ZCk7CisJCWxsZW4gPSBsZW5ndGhMWEQobHhkKTsKKwkJbGVuZCA9IGxzdGFydCArIGxsZW47CisJCWlmIChsc3RhcnQgPj0gc2l6ZSkKKwkJCWdvdG8gbWFwZW5kOworCisJCS8qIGNvbXBhcmUgd2l0aCB0aGUgY3VycmVudCB4YWQgICovCisJCWdvdG8gY29tcGFyZTE7CisJfQorCS8qIGx4ZCBpcyBjb3ZlcmVkIGJ5IHhhZCAqLworCWVsc2UgewkJCS8qICh4c3RhcnQgPCBsZW5kKSAqLworCisJCS8qIGluaXRpYWxpemUgbmV3IHB4ZCAqLworCQlwc3RhcnQgPSB4c3RhcnQ7CisJCXBsZW4gPSBtaW4obGVuZCAtIHhzdGFydCwgeGxlbik7CisJCXBhZGRyID0geGFkZHI7CisKKwkJZ290byBjb3ZlcjsKKwl9CisKKwkvKiAoeHN0YXJ0IDwgbHN0YXJ0KSAqLworICAgICAgY29tcGFyZTI6CisJLyogbHhkIGlzIGNvdmVyZWQgYnkgeGFkICovCisJaWYgKGxzdGFydCA8IHhlbmQpIHsKKwkJLyogaW5pdGlhbGl6ZSBuZXcgcHhkICovCisJCXBzdGFydCA9IGxzdGFydDsKKwkJcGxlbiA9IG1pbih4ZW5kIC0gbHN0YXJ0LCBsbGVuKTsKKwkJcGFkZHIgPSB4YWRkciArIChsc3RhcnQgLSB4c3RhcnQpOworCisJCWdvdG8gY292ZXI7CisJfQorCS8qIGx4ZCBpcyBOT1QgY292ZXJlZCBieSB4YWQgKi8KKwllbHNlIHsJCQkvKiAoeGVuZCA8PSBsc3RhcnQpICovCisKKwkJLyoKKwkJICogZ2V0IG5leHQgeGFkCisJCSAqCisJCSAqIGxpbmVhciBzZWFyY2ggbmV4dCB4YWQgY292ZXJpbmcgbHhkIG9uCisJCSAqIHRoZSBjdXJyZW50IHhhZCBwYWdlLCBhbmQgdGhlbiB0cmVlIHNlYXJjaAorCQkgKi8KKwkJaWYgKGluZGV4ID09IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0gMSkgeworCQkJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfUk9PVCkKKwkJCQlnb3RvIG1hcGVuZDsKKworCQkJWFRfUFVUUEFHRShtcCk7CisJCQlnb3RvIHNlYXJjaDsKKwkJfSBlbHNlIHsKKwkJCWluZGV4Kys7CisJCQl4YWQrKzsKKworCQkJLyogY29tcGFyZSB3aXRoIG5ldyB4YWQgKi8KKwkJCWdvdG8gY29tcGFyZTsKKwkJfQorCX0KKworCS8qCisJICogbHhkIGlzIGNvdmVyZWQgYnkgeGFkIGFuZCBhIG5ldyBweGQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQKKwkgKiAobHN0YXJ0IDw9IHhzdGFydCA8IGxlbmQpIG9yICh4c3RhcnQgPCBsc3RhcnQgPCB4ZW5kKQorCSAqLworICAgICAgY292ZXI6CisJLyogZmluYWxpemUgcHhkIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVudCB4YWQgKi8KKwlYVF9QVVRFTlRSWShweGQsIHhhZC0+ZmxhZywgcHN0YXJ0LCBwbGVuLCBwYWRkcik7CisKKwlpZiAoKytucHhkID49IG1heG5weGQpCisJCWdvdG8gbWFwZW5kOworCXB4ZCsrOworCisJLyoKKwkgKiBseGQgaXMgZnVsbHkgY292ZXJlZCBieSB4YWQKKwkgKi8KKwlpZiAobGVuZCA8PSB4ZW5kKSB7CisJCS8qCisJCSAqIGdldCBuZXh0IGx4ZAorCQkgKi8KKwkJaWYgKC0tbmx4ZCA9PSAwKQorCQkJZ290byBtYXBlbmQ7CisJCWx4ZCsrOworCisJCWxzdGFydCA9IG9mZnNldExYRChseGQpOworCQlsbGVuID0gbGVuZ3RoTFhEKGx4ZCk7CisJCWxlbmQgPSBsc3RhcnQgKyBsbGVuOworCQlpZiAobHN0YXJ0ID49IHNpemUpCisJCQlnb3RvIG1hcGVuZDsKKworCQkvKgorCQkgKiB0ZXN0IGZvciBvbGQgeGFkIGNvdmVyaW5nIG5ldyBseGQKKwkJICogKG9sZCB4c3RhcnQgPCBuZXcgbHN0YXJ0KQorCQkgKi8KKwkJZ290byBjb21wYXJlMjsKKwl9CisJLyoKKwkgKiBseGQgaXMgcGFydGlhbGx5IGNvdmVyZWQgYnkgeGFkCisJICovCisJZWxzZSB7CQkJLyogKHhlbmQgPCBsZW5kKSAgKi8KKworCQkvKgorCQkgKiBnZXQgbmV4dCB4YWQKKwkJICoKKwkJICogbGluZWFyIHNlYXJjaCBuZXh0IHhhZCBjb3ZlcmluZyBseGQgb24KKwkJICogdGhlIGN1cnJlbnQgeGFkIHBhZ2UsIGFuZCB0aGVuIG5leHQgeGFkIHBhZ2Ugc2VhcmNoCisJCSAqLworCQlpZiAoaW5kZXggPT0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLSAxKSB7CisJCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKQorCQkJCWdvdG8gbWFwZW5kOworCisJCQlpZiAoKGJuID0gbGU2NF90b19jcHUocC0+aGVhZGVyLm5leHQpKSA9PSAwKQorCQkJCWdvdG8gbWFwZW5kOworCisJCQlYVF9QVVRQQUdFKG1wKTsKKworCQkJLyogZ2V0IG5leHQgc2libGluZyBwYWdlICovCisJCQlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCisJCQlpbmRleCA9IFhURU5UUllTVEFSVDsKKwkJCXhhZCA9ICZwLT54YWRbaW5kZXhdOworCQl9IGVsc2UgeworCQkJaW5kZXgrKzsKKwkJCXhhZCsrOworCQl9CisKKwkJLyoKKwkJICogdGVzdCBmb3IgbmV3IHhhZCBjb3ZlcmluZyBvbGQgbHhkCisJCSAqIChvbGQgbHN0YXJ0IDwgbmV3IHhzdGFydCkKKwkJICovCisJCWdvdG8gY29tcGFyZTsKKwl9CisKKyAgICAgIG1hcGVuZDoKKwl4YWRsaXN0LT5ueGFkID0gbnB4ZDsKKworLy9vdXQ6CisJWFRfUFVUUEFHRShtcCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyoKKyAqICAgICAgeHRTZWFyY2goKQorICoKKyAqIGZ1bmN0aW9uOiAgICBzZWFyY2ggZm9yIHRoZSB4YWQgZW50cnkgY292ZXJpbmcgc3BlY2lmaWVkIG9mZnNldC4KKyAqCisgKiBwYXJhbWV0ZXJzOgorICogICAgICBpcCAgICAgIC0gZmlsZSBvYmplY3Q7CisgKiAgICAgIHhvZmYgICAgLSBleHRlbnQgb2Zmc2V0OworICogICAgICBjbXBwICAgIC0gY29tcGFyaXNvbiByZXN1bHQ6CisgKiAgICAgIGJ0c3RhY2sgLSB0cmF2ZXJzZSBzdGFjazsKKyAqICAgICAgZmxhZyAgICAtIHNlYXJjaCBwcm9jZXNzIGZsYWcgKFhUX0lOU0VSVCk7CisgKgorICogcmV0dXJuczoKKyAqICAgICAgYnRzdGFjayBjb250YWlucyAoYm4sIGluZGV4KSBvZiBzZWFyY2ggcGF0aCB0cmF2ZXJzZWQgdG8gdGhlIGVudHJ5LgorICogICAgICAqY21wcCBpcyBzZXQgdG8gcmVzdWx0IG9mIGNvbXBhcmlzb24gd2l0aCB0aGUgZW50cnkgcmV0dXJuZWQuCisgKiAgICAgIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIGVudHJ5IGlzIHBpbm5lZCBhdCBleGl0LgorICovCitzdGF0aWMgaW50IHh0U2VhcmNoKHN0cnVjdCBpbm9kZSAqaXAsIHM2NCB4b2ZmLAkvKiBvZmZzZXQgb2YgZXh0ZW50ICovCisJCSAgICBpbnQgKmNtcHAsIHN0cnVjdCBidHN0YWNrICogYnRzdGFjaywgaW50IGZsYWcpCit7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqZnNfaXAgPSBKRlNfSVAoaXApOworCWludCByYyA9IDA7CisJaW50IGNtcCA9IDE7CQkvKiBpbml0IGZvciBlbXB0eSBwYWdlICovCisJczY0IGJuOwkJCS8qIGJsb2NrIG51bWJlciAqLworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CS8qIHBhZ2UgYnVmZmVyICovCisJeHRwYWdlX3QgKnA7CQkvKiBwYWdlICovCisJeGFkX3QgKnhhZDsKKwlpbnQgYmFzZSwgaW5kZXgsIGxpbSwgYnRpbmRleDsKKwlzdHJ1Y3QgYnRmcmFtZSAqYnRzcDsKKwlpbnQgbnNwbGl0ID0gMDsJCS8qIG51bWJlciBvZiBwYWdlcyB0byBzcGxpdCAqLworCXM2NCB0NjQ7CisKKwlJTkNSRU1FTlQoeHRTdGF0LnNlYXJjaCk7CisKKwlCVF9DTFIoYnRzdGFjayk7CisKKwlidHN0YWNrLT5uc3BsaXQgPSAwOworCisJLyoKKwkgKiAgICAgIHNlYXJjaCBkb3duIHRyZWUgZnJvbSByb290OgorCSAqCisJICogYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgZW50cmllcyBvZiA8S2ksIFBpPiBhbmQgPEtqLCBQaj4gb2YKKwkgKiBpbnRlcm5hbCBwYWdlLCBjaGlsZCBwYWdlIFBpIGNvbnRhaW5zIGVudHJ5IHdpdGggaywgS2kgPD0gSyA8IEtqLgorCSAqCisJICogaWYgZW50cnkgd2l0aCBzZWFyY2gga2V5IEsgaXMgbm90IGZvdW5kCisJICogaW50ZXJuYWwgcGFnZSBzZWFyY2ggZmluZCB0aGUgZW50cnkgd2l0aCBsYXJnZXN0IGtleSBLaQorCSAqIGxlc3MgdGhhbiBLIHdoaWNoIHBvaW50IHRvIHRoZSBjaGlsZCBwYWdlIHRvIHNlYXJjaDsKKwkgKiBsZWFmIHBhZ2Ugc2VhcmNoIGZpbmQgdGhlIGVudHJ5IHdpdGggc21hbGxlc3Qga2V5IEtqCisJICogZ3JlYXRlciB0aGFuIEsgc28gdGhhdCB0aGUgcmV0dXJuZWQgaW5kZXggaXMgdGhlIHBvc2l0aW9uIG9mCisJICogdGhlIGVudHJ5IHRvIGJlIHNoaWZ0ZWQgcmlnaHQgZm9yIGluc2VydGlvbiBvZiBuZXcgZW50cnkuCisJICogZm9yIGVtcHR5IHRyZWUsIHNlYXJjaCBrZXkgaXMgZ3JlYXRlciB0aGFuIGFueSBrZXkgb2YgdGhlIHRyZWUuCisJICoKKwkgKiBieSBjb252ZW50aW9uLCByb290IGJuID0gMC4KKwkgKi8KKwlmb3IgKGJuID0gMDs7KSB7CisJCS8qIGdldC9waW4gdGhlIHBhZ2UgdG8gc2VhcmNoICovCisJCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCS8qIHRyeSBzZXF1ZW50aWFsIGFjY2VzcyBoZXVyaXN0aWNzIHdpdGggdGhlIHByZXZpb3VzCisJCSAqIGFjY2VzcyBlbnRyeSBpbiB0YXJnZXQgbGVhZiBwYWdlOgorCQkgKiBvbmNlIHNlYXJjaCBuYXJyb3dlZCBkb3duIGludG8gdGhlIHRhcmdldCBsZWFmLAorCQkgKiBrZXkgbXVzdCBlaXRoZXIgbWF0Y2ggYW4gZW50cnkgaW4gdGhlIGxlYWYgb3IKKwkJICoga2V5IGVudHJ5IGRvZXMgbm90IGV4aXN0IGluIHRoZSB0cmVlOworCQkgKi8KKy8vZmFzdFNlYXJjaDoKKwkJaWYgKChqZnNfaXAtPmJ0b3JkZXIgJiBCVF9TRVFVRU5USUFMKSAmJgorCQkgICAgKHAtPmhlYWRlci5mbGFnICYgQlRfTEVBRikgJiYKKwkJICAgIChpbmRleCA9IGpmc19pcC0+YnRpbmRleCkgPAorCQkgICAgbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkpIHsKKwkJCXhhZCA9ICZwLT54YWRbaW5kZXhdOworCQkJdDY0ID0gb2Zmc2V0WEFEKHhhZCk7CisJCQlpZiAoeG9mZiA8IHQ2NCArIGxlbmd0aFhBRCh4YWQpKSB7CisJCQkJaWYgKHhvZmYgPj0gdDY0KSB7CisJCQkJCSpjbXBwID0gMDsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCisJCQkJLyogc3RvcCBzZXF1ZW50aWFsIGFjY2VzcyBoZXVyaXN0aWNzICovCisJCQkJZ290byBiaW5hcnlTZWFyY2g7CisJCQl9IGVsc2UgewkvKiAodDY0ICsgbGVuZ3RoWEFEKHhhZCkpIDw9IHhvZmYgKi8KKworCQkJCS8qIHRyeSBuZXh0IHNlcXVlbnRpYWwgZW50cnkgKi8KKwkJCQlpbmRleCsrOworCQkJCWlmIChpbmRleCA8CisJCQkJICAgIGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpKSB7CisJCQkJCXhhZCsrOworCQkJCQl0NjQgPSBvZmZzZXRYQUQoeGFkKTsKKwkJCQkJaWYgKHhvZmYgPCB0NjQgKyBsZW5ndGhYQUQoeGFkKSkgeworCQkJCQkJaWYgKHhvZmYgPj0gdDY0KSB7CisJCQkJCQkJKmNtcHAgPSAwOworCQkJCQkJCWdvdG8gb3V0OworCQkJCQkJfQorCisJCQkJCQkvKiBtaXNzOiBrZXkgZmFsbHMgYmV0d2VlbgorCQkJCQkJICogcHJldmlvdXMgYW5kIHRoaXMgZW50cnkKKwkJCQkJCSAqLworCQkJCQkJKmNtcHAgPSAxOworCQkJCQkJZ290byBvdXQ7CisJCQkJCX0KKworCQkJCQkvKiAoeG9mZiA+PSB0NjQgKyBsZW5ndGhYQUQoeGFkKSk7CisJCQkJCSAqIG1hdGNoaW5nIGVudHJ5IG1heSBiZSBmdXJ0aGVyIG91dDoKKwkJCQkJICogc3RvcCBoZXVyaXN0aWMgc2VhcmNoCisJCQkJCSAqLworCQkJCQkvKiBzdG9wIHNlcXVlbnRpYWwgYWNjZXNzIGhldXJpc3RpY3MgKi8KKwkJCQkJZ290byBiaW5hcnlTZWFyY2g7CisJCQkJfQorCisJCQkJLyogKGluZGV4ID09IHAtPmhlYWRlci5uZXh0aW5kZXgpOworCQkJCSAqIG1pc3M6IGtleSBlbnRyeSBkb2VzIG5vdCBleGlzdCBpbgorCQkJCSAqIHRoZSB0YXJnZXQgbGVhZi90cmVlCisJCQkJICovCisJCQkJKmNtcHAgPSAxOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQkvKgorCQkJICogaWYgaGl0LCByZXR1cm4gaW5kZXggb2YgdGhlIGVudHJ5IGZvdW5kLCBhbmQKKwkJCSAqIGlmIG1pc3MsIHdoZXJlIG5ldyBlbnRyeSB3aXRoIHNlYXJjaCBrZXkgaXMKKwkJCSAqIHRvIGJlIGluc2VydGVkOworCQkJICovCisJCSAgICAgIG91dDoKKwkJCS8qIGNvbXB1dGUgbnVtYmVyIG9mIHBhZ2VzIHRvIHNwbGl0ICovCisJCQlpZiAoZmxhZyAmIFhUX0lOU0VSVCkgeworCQkJCWlmIChwLT5oZWFkZXIubmV4dGluZGV4ID09CS8qIGxpdHRsZS1lbmRpYW4gKi8KKwkJCQkgICAgcC0+aGVhZGVyLm1heGVudHJ5KQorCQkJCQluc3BsaXQrKzsKKwkJCQllbHNlCisJCQkJCW5zcGxpdCA9IDA7CisJCQkJYnRzdGFjay0+bnNwbGl0ID0gbnNwbGl0OworCQkJfQorCisJCQkvKiBzYXZlIHNlYXJjaCByZXN1bHQgKi8KKwkJCWJ0c3AgPSBidHN0YWNrLT50b3A7CisJCQlidHNwLT5ibiA9IGJuOworCQkJYnRzcC0+aW5kZXggPSBpbmRleDsKKwkJCWJ0c3AtPm1wID0gbXA7CisKKwkJCS8qIHVwZGF0ZSBzZXF1ZW50aWFsIGFjY2VzcyBoZXVyaXN0aWNzICovCisJCQlqZnNfaXAtPmJ0aW5kZXggPSBpbmRleDsKKworCQkJSU5DUkVNRU5UKHh0U3RhdC5mYXN0U2VhcmNoKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogd2VsbCwgLi4uIGZ1bGwgc2VhcmNoIG5vdyAqLworCSAgICAgIGJpbmFyeVNlYXJjaDoKKwkJbGltID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLSBYVEVOVFJZU1RBUlQ7CisKKwkJLyoKKwkJICogYmluYXJ5IHNlYXJjaCB3aXRoIHNlYXJjaCBrZXkgSyBvbiB0aGUgY3VycmVudCBwYWdlCisJCSAqLworCQlmb3IgKGJhc2UgPSBYVEVOVFJZU1RBUlQ7IGxpbTsgbGltID4+PSAxKSB7CisJCQlpbmRleCA9IGJhc2UgKyAobGltID4+IDEpOworCisJCQlYVF9DTVAoY21wLCB4b2ZmLCAmcC0+eGFkW2luZGV4XSwgdDY0KTsKKwkJCWlmIChjbXAgPT0gMCkgeworCQkJCS8qCisJCQkJICogICAgICBzZWFyY2ggaGl0CisJCQkJICovCisJCQkJLyogc2VhcmNoIGhpdCAtIGxlYWYgcGFnZToKKwkJCQkgKiByZXR1cm4gdGhlIGVudHJ5IGZvdW5kCisJCQkJICovCisJCQkJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfTEVBRikgeworCQkJCQkqY21wcCA9IGNtcDsKKworCQkJCQkvKiBjb21wdXRlIG51bWJlciBvZiBwYWdlcyB0byBzcGxpdCAqLworCQkJCQlpZiAoZmxhZyAmIFhUX0lOU0VSVCkgeworCQkJCQkJaWYgKHAtPmhlYWRlci5uZXh0aW5kZXggPT0KKwkJCQkJCSAgICBwLT5oZWFkZXIubWF4ZW50cnkpCisJCQkJCQkJbnNwbGl0Kys7CisJCQkJCQllbHNlCisJCQkJCQkJbnNwbGl0ID0gMDsKKwkJCQkJCWJ0c3RhY2stPm5zcGxpdCA9IG5zcGxpdDsKKwkJCQkJfQorCisJCQkJCS8qIHNhdmUgc2VhcmNoIHJlc3VsdCAqLworCQkJCQlidHNwID0gYnRzdGFjay0+dG9wOworCQkJCQlidHNwLT5ibiA9IGJuOworCQkJCQlidHNwLT5pbmRleCA9IGluZGV4OworCQkJCQlidHNwLT5tcCA9IG1wOworCisJCQkJCS8qIGluaXQgc2VxdWVudGlhbCBhY2Nlc3MgaGV1cmlzdGljcyAqLworCQkJCQlidGluZGV4ID0gamZzX2lwLT5idGluZGV4OworCQkJCQlpZiAoaW5kZXggPT0gYnRpbmRleCB8fAorCQkJCQkgICAgaW5kZXggPT0gYnRpbmRleCArIDEpCisJCQkJCQlqZnNfaXAtPmJ0b3JkZXIgPSBCVF9TRVFVRU5USUFMOworCQkJCQllbHNlCisJCQkJCQlqZnNfaXAtPmJ0b3JkZXIgPSBCVF9SQU5ET007CisJCQkJCWpmc19pcC0+YnRpbmRleCA9IGluZGV4OworCisJCQkJCXJldHVybiAwOworCQkJCX0KKworCQkJCS8qIHNlYXJjaCBoaXQgLSBpbnRlcm5hbCBwYWdlOgorCQkJCSAqIGRlc2NlbmQvc2VhcmNoIGl0cyBjaGlsZCBwYWdlCisJCQkJICovCisJCQkJZ290byBuZXh0OworCQkJfQorCisJCQlpZiAoY21wID4gMCkgeworCQkJCWJhc2UgPSBpbmRleCArIDE7CisJCQkJLS1saW07CisJCQl9CisJCX0KKworCQkvKgorCQkgKiAgICAgIHNlYXJjaCBtaXNzCisJCSAqCisJCSAqIGJhc2UgaXMgdGhlIHNtYWxsZXN0IGluZGV4IHdpdGgga2V5IChLaikgZ3JlYXRlciB0aGFuCisJCSAqIHNlYXJjaCBrZXkgKEspIGFuZCBtYXkgYmUgemVybyBvciBtYXhlbnRyeSBpbmRleC4KKwkJICovCisJCS8qCisJCSAqIHNlYXJjaCBtaXNzIC0gbGVhZiBwYWdlOgorCQkgKgorCQkgKiByZXR1cm4gbG9jYXRpb24gb2YgZW50cnkgKGJhc2UpIHdoZXJlIG5ldyBlbnRyeSB3aXRoCisJCSAqIHNlYXJjaCBrZXkgSyBpcyB0byBiZSBpbnNlcnRlZC4KKwkJICovCisJCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpIHsKKwkJCSpjbXBwID0gY21wOworCisJCQkvKiBjb21wdXRlIG51bWJlciBvZiBwYWdlcyB0byBzcGxpdCAqLworCQkJaWYgKGZsYWcgJiBYVF9JTlNFUlQpIHsKKwkJCQlpZiAocC0+aGVhZGVyLm5leHRpbmRleCA9PQorCQkJCSAgICBwLT5oZWFkZXIubWF4ZW50cnkpCisJCQkJCW5zcGxpdCsrOworCQkJCWVsc2UKKwkJCQkJbnNwbGl0ID0gMDsKKwkJCQlidHN0YWNrLT5uc3BsaXQgPSBuc3BsaXQ7CisJCQl9CisKKwkJCS8qIHNhdmUgc2VhcmNoIHJlc3VsdCAqLworCQkJYnRzcCA9IGJ0c3RhY2stPnRvcDsKKwkJCWJ0c3AtPmJuID0gYm47CisJCQlidHNwLT5pbmRleCA9IGJhc2U7CisJCQlidHNwLT5tcCA9IG1wOworCisJCQkvKiBpbml0IHNlcXVlbnRpYWwgYWNjZXNzIGhldXJpc3RpY3MgKi8KKwkJCWJ0aW5kZXggPSBqZnNfaXAtPmJ0aW5kZXg7CisJCQlpZiAoYmFzZSA9PSBidGluZGV4IHx8IGJhc2UgPT0gYnRpbmRleCArIDEpCisJCQkJamZzX2lwLT5idG9yZGVyID0gQlRfU0VRVUVOVElBTDsKKwkJCWVsc2UKKwkJCQlqZnNfaXAtPmJ0b3JkZXIgPSBCVF9SQU5ET007CisJCQlqZnNfaXAtPmJ0aW5kZXggPSBiYXNlOworCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qCisJCSAqIHNlYXJjaCBtaXNzIC0gbm9uLWxlYWYgcGFnZToKKwkJICoKKwkJICogaWYgYmFzZSBpcyBub24temVybywgZGVjcmVtZW50IGJhc2UgYnkgb25lIHRvIGdldCB0aGUgcGFyZW50CisJCSAqIGVudHJ5IG9mIHRoZSBjaGlsZCBwYWdlIHRvIHNlYXJjaC4KKwkJICovCisJCWluZGV4ID0gYmFzZSA/IGJhc2UgLSAxIDogYmFzZTsKKworCQkvKgorCQkgKiBnbyBkb3duIHRvIGNoaWxkIHBhZ2UKKwkJICovCisJICAgICAgbmV4dDoKKwkJLyogdXBkYXRlIG51bWJlciBvZiBwYWdlcyB0byBzcGxpdCAqLworCQlpZiAocC0+aGVhZGVyLm5leHRpbmRleCA9PSBwLT5oZWFkZXIubWF4ZW50cnkpCisJCQluc3BsaXQrKzsKKwkJZWxzZQorCQkJbnNwbGl0ID0gMDsKKworCQkvKiBwdXNoIChibiwgaW5kZXgpIG9mIHRoZSBwYXJlbnQgcGFnZS9lbnRyeSAqLworCQlCVF9QVVNIKGJ0c3RhY2ssIGJuLCBpbmRleCk7CisKKwkJLyogZ2V0IHRoZSBjaGlsZCBwYWdlIGJsb2NrIG51bWJlciAqLworCQlibiA9IGFkZHJlc3NYQUQoJnAtPnhhZFtpbmRleF0pOworCisJCS8qIHVucGluIHRoZSBwYXJlbnQgcGFnZSAqLworCQlYVF9QVVRQQUdFKG1wKTsKKwl9Cit9CisKKy8qCisgKiAgICAgIHh0SW5zZXJ0KCkKKyAqCisgKiBmdW5jdGlvbjoKKyAqCisgKiBwYXJhbWV0ZXI6CisgKiAgICAgIHRpZCAgICAgLSB0cmFuc2FjdGlvbiBpZDsKKyAqICAgICAgaXAgICAgICAtIGZpbGUgb2JqZWN0OworICogICAgICB4ZmxhZyAgIC0gZXh0ZW50IGZsYWcgKFhBRF9OT1RSRUNPUkRFRCk6CisgKiAgICAgIHhvZmYgICAgLSBleHRlbnQgb2Zmc2V0OworICogICAgICB4bGVuICAgIC0gZXh0ZW50IGxlbmd0aDsKKyAqICAgICAgeGFkZHJwICAtIGV4dGVudCBhZGRyZXNzIHBvaW50ZXIgKGluL291dCk6CisgKiAgICAgICAgICAgICAgaWYgKCp4YWRkcnApCisgKiAgICAgICAgICAgICAgICAgICAgICBjYWxsZXIgYWxsb2NhdGVkIGRhdGEgZXh0ZW50IGF0ICp4YWRkcnA7CisgKiAgICAgICAgICAgICAgZWxzZQorICogICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGUgZGF0YSBleHRlbnQgYW5kIHJldHVybiBpdHMgeGFkZHI7CisgKiAgICAgIGZsYWcgICAgLQorICoKKyAqIHJldHVybjoKKyAqLworaW50IHh0SW5zZXJ0KHRpZF90IHRpZCwJCS8qIHRyYW5zYWN0aW9uIGlkICovCisJICAgICBzdHJ1Y3QgaW5vZGUgKmlwLCBpbnQgeGZsYWcsIHM2NCB4b2ZmLCBzMzIgeGxlbiwgczY0ICogeGFkZHJwLAorCSAgICAgaW50IGZsYWcpCit7CisJaW50IHJjID0gMDsKKwlzNjQgeGFkZHIsIGhpbnQ7CisJc3RydWN0IG1ldGFwYWdlICptcDsJLyogbWV0YS1wYWdlIGJ1ZmZlciAqLworCXh0cGFnZV90ICpwOwkJLyogYmFzZSBCKy10cmVlIGluZGV4IHBhZ2UgKi8KKwlzNjQgYm47CisJaW50IGluZGV4LCBuZXh0aW5kZXg7CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsJLyogdHJhdmVyc2Ugc3RhY2sgKi8KKwlzdHJ1Y3QgeHRzcGxpdCBzcGxpdDsJLyogc3BsaXQgaW5mb3JtYXRpb24gKi8KKwl4YWRfdCAqeGFkOworCWludCBjbXA7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCB4dGxvY2sgKnh0bGNrOworCisJamZzX2luZm8oInh0SW5zZXJ0OiBueG9mZjoweCVseCBueGxlbjoweCV4IiwgKHVsb25nKSB4b2ZmLCB4bGVuKTsKKworCS8qCisJICogICAgICBzZWFyY2ggZm9yIHRoZSBlbnRyeSBsb2NhdGlvbiBhdCB3aGljaCB0byBpbnNlcnQ6CisJICoKKwkgKiB4dEZhc3RTZWFyY2goKSBhbmQgeHRTZWFyY2goKSBib3RoIHJldHVybnMgKGxlYWYgcGFnZQorCSAqIHBpbm5lZCwgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0KS4KKwkgKiBuLmIuIHh0U2VhcmNoKCkgbWF5IHJldHVybiBpbmRleCBvZiBtYXhlbnRyeSBvZgorCSAqIHRoZSBmdWxsIHBhZ2UuCisJICovCisJaWYgKChyYyA9IHh0U2VhcmNoKGlwLCB4b2ZmLCAmY21wLCAmYnRzdGFjaywgWFRfSU5TRVJUKSkpCisJCXJldHVybiByYzsKKworCS8qIHJldHJpZXZlIHNlYXJjaCByZXN1bHQgKi8KKwlYVF9HRVRTRUFSQ0goaXAsIGJ0c3RhY2sudG9wLCBibiwgbXAsIHAsIGluZGV4KTsKKworCS8qIFRoaXMgdGVzdCBtdXN0IGZvbGxvdyBYVF9HRVRTRUFSQ0ggc2luY2UgbXAgbXVzdCBiZSB2YWxpZCBpZgorCSAqIHdlIGJyYW5jaCB0byBvdXQ6ICovCisJaWYgKGNtcCA9PSAwKSB7CisJCXJjID0gLUVFWElTVDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBhbGxvY2F0ZSBkYXRhIGV4dGVudCByZXF1ZXN0ZWQKKwkgKgorCSAqIGFsbG9jYXRpb24gaGludDogbGFzdCB4YWQKKwkgKi8KKwlpZiAoKHhhZGRyID0gKnhhZGRycCkgPT0gMCkgeworCQlpZiAoaW5kZXggPiBYVEVOVFJZU1RBUlQpIHsKKwkJCXhhZCA9ICZwLT54YWRbaW5kZXggLSAxXTsKKwkJCWhpbnQgPSBhZGRyZXNzWEFEKHhhZCkgKyBsZW5ndGhYQUQoeGFkKSAtIDE7CisJCX0gZWxzZQorCQkJaGludCA9IDA7CisJCWlmICgocmMgPSBEUVVPVF9BTExPQ19CTE9DSyhpcCwgeGxlbikpKQorCQkJZ290byBvdXQ7CisJCWlmICgocmMgPSBkYkFsbG9jKGlwLCBoaW50LCAoczY0KSB4bGVuLCAmeGFkZHIpKSkgeworCQkJRFFVT1RfRlJFRV9CTE9DSyhpcCwgeGxlbik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qCisJICogICAgICBpbnNlcnQgZW50cnkgZm9yIG5ldyBleHRlbnQKKwkgKi8KKwl4ZmxhZyB8PSBYQURfTkVXOworCisJLyoKKwkgKiAgICAgIGlmIHRoZSBsZWFmIHBhZ2UgaXMgZnVsbCwgc3BsaXQgdGhlIHBhZ2UgYW5kCisJICogICAgICBwcm9wYWdhdGUgdXAgdGhlIHJvdXRlciBlbnRyeSBmb3IgdGhlIG5ldyBwYWdlIGZyb20gc3BsaXQKKwkgKgorCSAqIFRoZSB4dFNwbGl0VXAoKSB3aWxsIGluc2VydCB0aGUgZW50cnkgYW5kIHVucGluIHRoZSBsZWFmIHBhZ2UuCisJICovCisJbmV4dGluZGV4ID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCk7CisJaWYgKG5leHRpbmRleCA9PSBsZTE2X3RvX2NwdShwLT5oZWFkZXIubWF4ZW50cnkpKSB7CisJCXNwbGl0Lm1wID0gbXA7CisJCXNwbGl0LmluZGV4ID0gaW5kZXg7CisJCXNwbGl0LmZsYWcgPSB4ZmxhZzsKKwkJc3BsaXQub2ZmID0geG9mZjsKKwkJc3BsaXQubGVuID0geGxlbjsKKwkJc3BsaXQuYWRkciA9IHhhZGRyOworCQlzcGxpdC5weGRsaXN0ID0gTlVMTDsKKwkJaWYgKChyYyA9IHh0U3BsaXRVcCh0aWQsIGlwLCAmc3BsaXQsICZidHN0YWNrKSkpIHsKKwkJCS8qIHVuZG8gZGF0YSBleHRlbnQgYWxsb2NhdGlvbiAqLworCQkJaWYgKCp4YWRkcnAgPT0gMCkgeworCQkJCWRiRnJlZShpcCwgeGFkZHIsIChzNjQpIHhsZW4pOworCQkJCURRVU9UX0ZSRUVfQkxPQ0soaXAsIHhsZW4pOworCQkJfQorCQkJcmV0dXJuIHJjOworCQl9CisKKwkJKnhhZGRycCA9IHhhZGRyOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqICAgICAgaW5zZXJ0IHRoZSBuZXcgZW50cnkgaW50byB0aGUgbGVhZiBwYWdlCisJICovCisJLyoKKwkgKiBhY3F1aXJlIGEgdHJhbnNhY3Rpb24gbG9jayBvbiB0aGUgbGVhZiBwYWdlOworCSAqCisJICogYWN0aW9uOiB4YWQgaW5zZXJ0aW9uL2V4dGVuc2lvbjsKKwkgKi8KKwlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisKKwkvKiBpZiBpbnNlcnQgaW50byBtaWRkbGUsIHNoaWZ0IHJpZ2h0IHJlbWFpbmluZyBlbnRyaWVzLiAqLworCWlmIChpbmRleCA8IG5leHRpbmRleCkKKwkJbWVtbW92ZSgmcC0+eGFkW2luZGV4ICsgMV0sICZwLT54YWRbaW5kZXhdLAorCQkJKG5leHRpbmRleCAtIGluZGV4KSAqIHNpemVvZih4YWRfdCkpOworCisJLyogaW5zZXJ0IHRoZSBuZXcgZW50cnk6IG1hcmsgdGhlIGVudHJ5IE5FVyAqLworCXhhZCA9ICZwLT54YWRbaW5kZXhdOworCVhUX1BVVEVOVFJZKHhhZCwgeGZsYWcsIHhvZmYsIHhsZW4sIHhhZGRyKTsKKworCS8qIGFkdmFuY2UgbmV4dCBhdmFpbGFibGUgZW50cnkgaW5kZXggKi8KKwlwLT5oZWFkZXIubmV4dGluZGV4ID0KKwkgICAgY3B1X3RvX2xlMTYobGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgKyAxKTsKKworCS8qIERvbid0IGxvZyBpdCBpZiB0aGVyZSBhcmUgbm8gbGlua3MgdG8gdGhlIGZpbGUgKi8KKwlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tYVFJFRSB8IHRsY2tHUk9XKTsKKwkJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJCXh0bGNrLT5sd20ub2Zmc2V0ID0KKwkJICAgICh4dGxjay0+bHdtLm9mZnNldCkgPyBtaW4oaW5kZXgsCisJCQkJCSAgICAgIChpbnQpeHRsY2stPmx3bS5vZmZzZXQpIDogaW5kZXg7CisJCXh0bGNrLT5sd20ubGVuZ3RoID0KKwkJICAgIGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0geHRsY2stPmx3bS5vZmZzZXQ7CisJfQorCisJKnhhZGRycCA9IHhhZGRyOworCisgICAgICBvdXQ6CisJLyogdW5waW4gdGhlIGxlYWYgcGFnZSAqLworCVhUX1BVVFBBR0UobXApOworCisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKiAgICAgIHh0U3BsaXRVcCgpCisgKgorICogZnVuY3Rpb246CisgKiAgICAgIHNwbGl0IGZ1bGwgcGFnZXMgYXMgcHJvcGFnYXRpbmcgaW5zZXJ0aW9uIHVwIHRoZSB0cmVlCisgKgorICogcGFyYW1ldGVyOgorICogICAgICB0aWQgICAgIC0gdHJhbnNhY3Rpb24gaWQ7CisgKiAgICAgIGlwICAgICAgLSBmaWxlIG9iamVjdDsKKyAqICAgICAgc3BsaXQgICAtIGVudHJ5IHBhcmFtZXRlciBkZXNjcmlwdG9yOworICogICAgICBidHN0YWNrIC0gdHJhdmVyc2Ugc3RhY2sgZnJvbSB4dFNlYXJjaCgpCisgKgorICogcmV0dXJuOgorICovCitzdGF0aWMgaW50Cit4dFNwbGl0VXAodGlkX3QgdGlkLAorCSAgc3RydWN0IGlub2RlICppcCwgc3RydWN0IHh0c3BsaXQgKiBzcGxpdCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrKQoreworCWludCByYyA9IDA7CisJc3RydWN0IG1ldGFwYWdlICpzbXA7CisJeHRwYWdlX3QgKnNwOwkJLyogc3BsaXQgcGFnZSAqLworCXN0cnVjdCBtZXRhcGFnZSAqcm1wOworCXM2NCByYm47CQkvKiBuZXcgcmlnaHQgcGFnZSBibG9jayBudW1iZXIgKi8KKwlzdHJ1Y3QgbWV0YXBhZ2UgKnJjbXA7CisJeHRwYWdlX3QgKnJjcDsJCS8qIHJpZ2h0IGNoaWxkIHBhZ2UgKi8KKwlzNjQgcmNibjsJCS8qIHJpZ2h0IGNoaWxkIHBhZ2UgYmxvY2sgbnVtYmVyICovCisJaW50IHNraXA7CQkvKiBpbmRleCBvZiBlbnRyeSBvZiBpbnNlcnRpb24gKi8KKwlpbnQgbmV4dGluZGV4OwkJLyogbmV4dCBhdmFpbGFibGUgZW50cnkgaW5kZXggb2YgcCAqLworCXN0cnVjdCBidGZyYW1lICpwYXJlbnQ7CS8qIHBhcmVudCBwYWdlIGVudHJ5IG9uIHRyYXZlcnNlIHN0YWNrICovCisJeGFkX3QgKnhhZDsKKwlzNjQgeGFkZHI7CisJaW50IHhsZW47CisJaW50IG5zcGxpdDsJCS8qIG51bWJlciBvZiBwYWdlcyBzcGxpdCAqLworCXN0cnVjdCBweGRsaXN0IHB4ZGxpc3Q7CisJcHhkX3QgKnB4ZDsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJc3RydWN0IHh0bG9jayAqeHRsY2s7CisKKwlzbXAgPSBzcGxpdC0+bXA7CisJc3AgPSBYVF9QQUdFKGlwLCBzbXApOworCisJLyogaXMgaW5vZGUgeHRyZWUgcm9vdCBleHRlbnNpb24vaW5saW5lIEVBIGFyZWEgZnJlZSA/ICovCisJaWYgKChzcC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSAmJiAoIVNfSVNESVIoaXAtPmlfbW9kZSkpICYmCisJICAgIChsZTE2X3RvX2NwdShzcC0+aGVhZGVyLm1heGVudHJ5KSA8IFhUUk9PVE1BWFNMT1QpICYmCisJICAgIChKRlNfSVAoaXApLT5tb2RlMiAmIElOTElORUVBKSkgeworCQlzcC0+aGVhZGVyLm1heGVudHJ5ID0gY3B1X3RvX2xlMTYoWFRST09UTUFYU0xPVCk7CisJCUpGU19JUChpcCktPm1vZGUyICY9IH5JTkxJTkVFQTsKKworCQlCVF9NQVJLX0RJUlRZKHNtcCwgaXApOworCQkvKgorCQkgKiBhY3F1aXJlIGEgdHJhbnNhY3Rpb24gbG9jayBvbiB0aGUgbGVhZiBwYWdlOworCQkgKgorCQkgKiBhY3Rpb246IHhhZCBpbnNlcnRpb24vZXh0ZW5zaW9uOworCQkgKi8KKworCQkvKiBpZiBpbnNlcnQgaW50byBtaWRkbGUsIHNoaWZ0IHJpZ2h0IHJlbWFpbmluZyBlbnRyaWVzLiAqLworCQlza2lwID0gc3BsaXQtPmluZGV4OworCQluZXh0aW5kZXggPSBsZTE2X3RvX2NwdShzcC0+aGVhZGVyLm5leHRpbmRleCk7CisJCWlmIChza2lwIDwgbmV4dGluZGV4KQorCQkJbWVtbW92ZSgmc3AtPnhhZFtza2lwICsgMV0sICZzcC0+eGFkW3NraXBdLAorCQkJCShuZXh0aW5kZXggLSBza2lwKSAqIHNpemVvZih4YWRfdCkpOworCisJCS8qIGluc2VydCB0aGUgbmV3IGVudHJ5OiBtYXJrIHRoZSBlbnRyeSBORVcgKi8KKwkJeGFkID0gJnNwLT54YWRbc2tpcF07CisJCVhUX1BVVEVOVFJZKHhhZCwgc3BsaXQtPmZsYWcsIHNwbGl0LT5vZmYsIHNwbGl0LT5sZW4sCisJCQkgICAgc3BsaXQtPmFkZHIpOworCisJCS8qIGFkdmFuY2UgbmV4dCBhdmFpbGFibGUgZW50cnkgaW5kZXggKi8KKwkJc3AtPmhlYWRlci5uZXh0aW5kZXggPQorCQkgICAgY3B1X3RvX2xlMTYobGUxNl90b19jcHUoc3AtPmhlYWRlci5uZXh0aW5kZXgpICsgMSk7CisKKwkJLyogRG9uJ3QgbG9nIGl0IGlmIHRoZXJlIGFyZSBubyBsaW5rcyB0byB0aGUgZmlsZSAqLworCQlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIHNtcCwgdGxja1hUUkVFIHwgdGxja0dST1cpOworCQkJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJCQl4dGxjay0+bHdtLm9mZnNldCA9ICh4dGxjay0+bHdtLm9mZnNldCkgPworCQkJICAgIG1pbihza2lwLCAoaW50KXh0bGNrLT5sd20ub2Zmc2V0KSA6IHNraXA7CisJCQl4dGxjay0+bHdtLmxlbmd0aCA9CisJCQkgICAgbGUxNl90b19jcHUoc3AtPmhlYWRlci5uZXh0aW5kZXgpIC0KKwkJCSAgICB4dGxjay0+bHdtLm9mZnNldDsKKwkJfQorCisJCXJldHVybiAwOworCX0KKworCS8qCisJICogYWxsb2NhdGUgbmV3IGluZGV4IGJsb2NrcyB0byBjb3ZlciBpbmRleCBwYWdlIHNwbGl0KHMpCisJICoKKwkgKiBhbGxvY2F0aW9uIGhpbnQ6ID8KKwkgKi8KKwlpZiAoc3BsaXQtPnB4ZGxpc3QgPT0gTlVMTCkgeworCQluc3BsaXQgPSBidHN0YWNrLT5uc3BsaXQ7CisJCXNwbGl0LT5weGRsaXN0ID0gJnB4ZGxpc3Q7CisJCXB4ZGxpc3QubWF4bnB4ZCA9IHB4ZGxpc3QubnB4ZCA9IDA7CisJCXB4ZCA9ICZweGRsaXN0LnB4ZFswXTsKKwkJeGxlbiA9IEpGU19TQkkoaXAtPmlfc2IpLT5uYnBlcnBhZ2U7CisJCWZvciAoOyBuc3BsaXQgPiAwOyBuc3BsaXQtLSwgcHhkKyspIHsKKwkJCWlmICgocmMgPSBkYkFsbG9jKGlwLCAoczY0KSAwLCAoczY0KSB4bGVuLCAmeGFkZHIpKQorCQkJICAgID09IDApIHsKKwkJCQlQWERhZGRyZXNzKHB4ZCwgeGFkZHIpOworCQkJCVBYRGxlbmd0aChweGQsIHhsZW4pOworCisJCQkJcHhkbGlzdC5tYXhucHhkKys7CisKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogdW5kbyBhbGxvY2F0aW9uICovCisKKwkJCVhUX1BVVFBBR0Uoc21wKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCS8qCisJICogU3BsaXQgbGVhZiBwYWdlIDxzcD4gaW50byA8c3A+IGFuZCBhIG5ldyByaWdodCBwYWdlIDxycD4uCisJICoKKwkgKiBUaGUgc3BsaXQgcm91dGluZXMgaW5zZXJ0IHRoZSBuZXcgZW50cnkgaW50byB0aGUgbGVhZiBwYWdlLAorCSAqIGFuZCBhY3F1aXJlIHR4TG9jayBhcyBhcHByb3ByaWF0ZS4KKwkgKiByZXR1cm4gPHJwPiBwaW5uZWQgYW5kIGl0cyBibG9jayBudW1iZXIgPHJwYm4+LgorCSAqLworCXJjID0gKHNwLT5oZWFkZXIuZmxhZyAmIEJUX1JPT1QpID8KKwkgICAgeHRTcGxpdFJvb3QodGlkLCBpcCwgc3BsaXQsICZybXApIDoKKwkgICAgeHRTcGxpdFBhZ2UodGlkLCBpcCwgc3BsaXQsICZybXAsICZyYm4pOworCisJWFRfUFVUUEFHRShzbXApOworCisJaWYgKHJjKQorCQlyZXR1cm4gLUVJTzsKKwkvKgorCSAqIHByb3BhZ2F0ZSB1cCB0aGUgcm91dGVyIGVudHJ5IGZvciB0aGUgbGVhZiBwYWdlIGp1c3Qgc3BsaXQKKwkgKgorCSAqIGluc2VydCBhIHJvdXRlciBlbnRyeSBmb3IgdGhlIG5ldyBwYWdlIGludG8gdGhlIHBhcmVudCBwYWdlLAorCSAqIHByb3BhZ2F0ZSB0aGUgaW5zZXJ0L3NwbGl0IHVwIHRoZSB0cmVlIGJ5IHdhbGtpbmcgYmFjayB0aGUgc3RhY2sKKwkgKiBvZiAoYm4gb2YgcGFyZW50IHBhZ2UsIGluZGV4IG9mIGNoaWxkIHBhZ2UgZW50cnkgaW4gcGFyZW50IHBhZ2UpCisJICogdGhhdCB3ZXJlIHRyYXZlcnNlZCBkdXJpbmcgdGhlIHNlYXJjaCBmb3IgdGhlIHBhZ2UgdGhhdCBzcGxpdC4KKwkgKgorCSAqIHRoZSBwcm9wYWdhdGlvbiBvZiBpbnNlcnQvc3BsaXQgdXAgdGhlIHRyZWUgc3RvcHMgaWYgdGhlIHJvb3QKKwkgKiBzcGxpdHMgb3IgdGhlIHBhZ2UgaW5zZXJ0ZWQgaW50byBkb2Vzbid0IGhhdmUgdG8gc3BsaXQgdG8gaG9sZAorCSAqIHRoZSBuZXcgZW50cnkuCisJICoKKwkgKiB0aGUgcGFyZW50IGVudHJ5IGZvciB0aGUgc3BsaXQgcGFnZSByZW1haW5zIHRoZSBzYW1lLCBhbmQKKwkgKiBhIG5ldyBlbnRyeSBpcyBpbnNlcnRlZCBhdCBpdHMgcmlnaHQgd2l0aCB0aGUgZmlyc3Qga2V5IGFuZAorCSAqIGJsb2NrIG51bWJlciBvZiB0aGUgbmV3IHJpZ2h0IHBhZ2UuCisJICoKKwkgKiBUaGVyZSBhcmUgYSBtYXhpbXVtIG9mIDMgcGFnZXMgcGlubmVkIGF0IGFueSB0aW1lOgorCSAqIHJpZ2h0IGNoaWxkLCBsZWZ0IHBhcmVudCBhbmQgcmlnaHQgcGFyZW50ICh3aGVuIHRoZSBwYXJlbnQgc3BsaXRzKQorCSAqIHRvIGtlZXAgdGhlIGNoaWxkIHBhZ2UgcGlubmVkIHdoaWxlIHdvcmtpbmcgb24gdGhlIHBhcmVudC4KKwkgKiBtYWtlIHN1cmUgdGhhdCBhbGwgcGlucyBhcmUgcmVsZWFzZWQgYXQgZXhpdC4KKwkgKi8KKwl3aGlsZSAoKHBhcmVudCA9IEJUX1BPUChidHN0YWNrKSkgIT0gTlVMTCkgeworCQkvKiBwYXJlbnQgcGFnZSBzcGVjaWZpZWQgYnkgc3RhY2sgZnJhbWUgPHBhcmVudD4gKi8KKworCQkvKiBrZWVwIGN1cnJlbnQgY2hpbGQgcGFnZXMgPHJjcD4gcGlubmVkICovCisJCXJjbXAgPSBybXA7CisJCXJjYm4gPSByYm47CisJCXJjcCA9IFhUX1BBR0UoaXAsIHJjbXApOworCisJCS8qCisJCSAqIGluc2VydCByb3V0ZXIgZW50cnkgaW4gcGFyZW50IGZvciBuZXcgcmlnaHQgY2hpbGQgcGFnZSA8cnA+CisJCSAqLworCQkvKiBnZXQvcGluIHRoZSBwYXJlbnQgcGFnZSA8c3A+ICovCisJCVhUX0dFVFBBR0UoaXAsIHBhcmVudC0+Ym4sIHNtcCwgUFNJWkUsIHNwLCByYyk7CisJCWlmIChyYykgeworCQkJWFRfUFVUUEFHRShyY21wKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCS8qCisJCSAqIFRoZSBuZXcga2V5IGVudHJ5IGdvZXMgT05FIEFGVEVSIHRoZSBpbmRleCBvZiBwYXJlbnQgZW50cnksCisJCSAqIGJlY2F1c2UgdGhlIHNwbGl0IHdhcyB0byB0aGUgcmlnaHQuCisJCSAqLworCQlza2lwID0gcGFyZW50LT5pbmRleCArIDE7CisKKwkJLyoKKwkJICogc3BsaXQgb3Igc2hpZnQgcmlnaHQgcmVtYWluaW5nIGVudHJpZXMgb2YgdGhlIHBhcmVudCBwYWdlCisJCSAqLworCQluZXh0aW5kZXggPSBsZTE2X3RvX2NwdShzcC0+aGVhZGVyLm5leHRpbmRleCk7CisJCS8qCisJCSAqIHBhcmVudCBwYWdlIGlzIGZ1bGwgLSBzcGxpdCB0aGUgcGFyZW50IHBhZ2UKKwkJICovCisJCWlmIChuZXh0aW5kZXggPT0gbGUxNl90b19jcHUoc3AtPmhlYWRlci5tYXhlbnRyeSkpIHsKKwkJCS8qIGluaXQgZm9yIHBhcmVudCBwYWdlIHNwbGl0ICovCisJCQlzcGxpdC0+bXAgPSBzbXA7CisJCQlzcGxpdC0+aW5kZXggPSBza2lwOwkvKiBpbmRleCBhdCBpbnNlcnQgKi8KKwkJCXNwbGl0LT5mbGFnID0gWEFEX05FVzsKKwkJCXNwbGl0LT5vZmYgPSBvZmZzZXRYQUQoJnJjcC0+eGFkW1hURU5UUllTVEFSVF0pOworCQkJc3BsaXQtPmxlbiA9IEpGU19TQkkoaXAtPmlfc2IpLT5uYnBlcnBhZ2U7CisJCQlzcGxpdC0+YWRkciA9IHJjYm47CisKKwkJCS8qIHVucGluIHByZXZpb3VzIHJpZ2h0IGNoaWxkIHBhZ2UgKi8KKwkJCVhUX1BVVFBBR0UocmNtcCk7CisKKwkJCS8qIFRoZSBzcGxpdCByb3V0aW5lcyBpbnNlcnQgdGhlIG5ldyBlbnRyeSwKKwkJCSAqIGFuZCBhY3F1aXJlIHR4TG9jayBhcyBhcHByb3ByaWF0ZS4KKwkJCSAqIHJldHVybiA8cnA+IHBpbm5lZCBhbmQgaXRzIGJsb2NrIG51bWJlciA8cnBibj4uCisJCQkgKi8KKwkJCXJjID0gKHNwLT5oZWFkZXIuZmxhZyAmIEJUX1JPT1QpID8KKwkJCSAgICB4dFNwbGl0Um9vdCh0aWQsIGlwLCBzcGxpdCwgJnJtcCkgOgorCQkJICAgIHh0U3BsaXRQYWdlKHRpZCwgaXAsIHNwbGl0LCAmcm1wLCAmcmJuKTsKKwkJCWlmIChyYykgeworCQkJCVhUX1BVVFBBR0Uoc21wKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisKKwkJCVhUX1BVVFBBR0Uoc21wKTsKKwkJCS8qIGtlZXAgbmV3IGNoaWxkIHBhZ2UgPHJwPiBwaW5uZWQgKi8KKwkJfQorCQkvKgorCQkgKiBwYXJlbnQgcGFnZSBpcyBub3QgZnVsbCAtIGluc2VydCBpbiBwYXJlbnQgcGFnZQorCQkgKi8KKwkJZWxzZSB7CisJCQkvKgorCQkJICogaW5zZXJ0IHJvdXRlciBlbnRyeSBpbiBwYXJlbnQgZm9yIHRoZSByaWdodCBjaGlsZAorCQkJICogcGFnZSBmcm9tIHRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgcmlnaHQgY2hpbGQgcGFnZToKKwkJCSAqLworCQkJLyoKKwkJCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBwYXJlbnQgcGFnZTsKKwkJCSAqCisJCQkgKiBhY3Rpb246IHJvdXRlciB4YWQgaW5zZXJ0aW9uOworCQkJICovCisJCQlCVF9NQVJLX0RJUlRZKHNtcCwgaXApOworCisJCQkvKgorCQkJICogaWYgaW5zZXJ0IGludG8gbWlkZGxlLCBzaGlmdCByaWdodCByZW1haW5pbmcgZW50cmllcworCQkJICovCisJCQlpZiAoc2tpcCA8IG5leHRpbmRleCkKKwkJCQltZW1tb3ZlKCZzcC0+eGFkW3NraXAgKyAxXSwgJnNwLT54YWRbc2tpcF0sCisJCQkJCShuZXh0aW5kZXggLQorCQkJCQkgc2tpcCkgPDwgTDJYVFNMT1RTSVpFKTsKKworCQkJLyogaW5zZXJ0IHRoZSByb3V0ZXIgZW50cnkgKi8KKwkJCXhhZCA9ICZzcC0+eGFkW3NraXBdOworCQkJWFRfUFVURU5UUlkoeGFkLCBYQURfTkVXLAorCQkJCSAgICBvZmZzZXRYQUQoJnJjcC0+eGFkW1hURU5UUllTVEFSVF0pLAorCQkJCSAgICBKRlNfU0JJKGlwLT5pX3NiKS0+bmJwZXJwYWdlLCByY2JuKTsKKworCQkJLyogYWR2YW5jZSBuZXh0IGF2YWlsYWJsZSBlbnRyeSBpbmRleC4gKi8KKwkJCXNwLT5oZWFkZXIubmV4dGluZGV4ID0KKwkJCSAgICBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShzcC0+aGVhZGVyLm5leHRpbmRleCkgKworCQkJCQkxKTsKKworCQkJLyogRG9uJ3QgbG9nIGl0IGlmIHRoZXJlIGFyZSBubyBsaW5rcyB0byB0aGUgZmlsZSAqLworCQkJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSkgeworCQkJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgc21wLAorCQkJCQkgICAgICB0bGNrWFRSRUUgfCB0bGNrR1JPVyk7CisJCQkJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJCQkJeHRsY2stPmx3bS5vZmZzZXQgPSAoeHRsY2stPmx3bS5vZmZzZXQpID8KKwkJCQkgICAgbWluKHNraXAsIChpbnQpeHRsY2stPmx3bS5vZmZzZXQpIDogc2tpcDsKKwkJCQl4dGxjay0+bHdtLmxlbmd0aCA9CisJCQkJICAgIGxlMTZfdG9fY3B1KHNwLT5oZWFkZXIubmV4dGluZGV4KSAtCisJCQkJICAgIHh0bGNrLT5sd20ub2Zmc2V0OworCQkJfQorCisJCQkvKiB1bnBpbiBwYXJlbnQgcGFnZSAqLworCQkJWFRfUFVUUEFHRShzbXApOworCisJCQkvKiBleGl0IHByb3BhZ2F0ZSB1cCAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiB1bnBpbiBjdXJyZW50IHJpZ2h0IHBhZ2UgKi8KKwlYVF9QVVRQQUdFKHJtcCk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogICAgICB4dFNwbGl0UGFnZSgpCisgKgorICogZnVuY3Rpb246CisgKiAgICAgIHNwbGl0IGEgZnVsbCBub24tcm9vdCBwYWdlIGludG8KKyAqICAgICAgb3JpZ2luYWwvc3BsaXQvbGVmdCBwYWdlIGFuZCBuZXcgcmlnaHQgcGFnZQorICogICAgICBpLmUuLCB0aGUgb3JpZ2luYWwvc3BsaXQgcGFnZSByZW1haW5zIGFzIGxlZnQgcGFnZS4KKyAqCisgKiBwYXJhbWV0ZXI6CisgKiAgICAgIGludAkJdGlkLAorICogICAgICBzdHJ1Y3QgaW5vZGUgICAgKmlwLAorICogICAgICBzdHJ1Y3QgeHRzcGxpdCAgKnNwbGl0LAorICogICAgICBzdHJ1Y3QgbWV0YXBhZ2UJKipybXBwLAorICogICAgICB1NjQJCSpyYm5wLAorICoKKyAqIHJldHVybjoKKyAqICAgICAgUG9pbnRlciB0byBwYWdlIGluIHdoaWNoIHRvIGluc2VydCBvciBOVUxMIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50Cit4dFNwbGl0UGFnZSh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsCisJICAgIHN0cnVjdCB4dHNwbGl0ICogc3BsaXQsIHN0cnVjdCBtZXRhcGFnZSAqKiBybXBwLCBzNjQgKiByYm5wKQoreworCWludCByYyA9IDA7CisJc3RydWN0IG1ldGFwYWdlICpzbXA7CisJeHRwYWdlX3QgKnNwOworCXN0cnVjdCBtZXRhcGFnZSAqcm1wOworCXh0cGFnZV90ICpycDsJCS8qIG5ldyByaWdodCBwYWdlIGFsbG9jYXRlZCAqLworCXM2NCByYm47CQkvKiBuZXcgcmlnaHQgcGFnZSBibG9jayBudW1iZXIgKi8KKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXh0cGFnZV90ICpwOworCXM2NCBuZXh0Ym47CisJaW50IHNraXAsIG1heGVudHJ5LCBtaWRkbGUsIHJpZ2h0aGFsZiwgbjsKKwl4YWRfdCAqeGFkOworCXN0cnVjdCBweGRsaXN0ICpweGRsaXN0OworCXB4ZF90ICpweGQ7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCB4dGxvY2sgKnN4dGxjayA9IE5VTEwsICpyeHRsY2sgPSBOVUxMOworCWludCBxdW90YV9hbGxvY2F0aW9uID0gMDsKKworCXNtcCA9IHNwbGl0LT5tcDsKKwlzcCA9IFhUX1BBR0UoaXAsIHNtcCk7CisKKwlJTkNSRU1FTlQoeHRTdGF0LnNwbGl0KTsKKworCXB4ZGxpc3QgPSBzcGxpdC0+cHhkbGlzdDsKKwlweGQgPSAmcHhkbGlzdC0+cHhkW3B4ZGxpc3QtPm5weGRdOworCXB4ZGxpc3QtPm5weGQrKzsKKwlyYm4gPSBhZGRyZXNzUFhEKHB4ZCk7CisKKwkvKiBBbGxvY2F0ZSBibG9ja3MgdG8gcXVvdGEuICovCisgICAgICAgaWYgKERRVU9UX0FMTE9DX0JMT0NLKGlwLCBsZW5ndGhQWEQocHhkKSkpIHsKKwkgICAgICAgcmMgPSAtRURRVU9UOworCSAgICAgICBnb3RvIGNsZWFuX3VwOworCX0KKworCXF1b3RhX2FsbG9jYXRpb24gKz0gbGVuZ3RoUFhEKHB4ZCk7CisKKwkvKgorCSAqIGFsbG9jYXRlIHRoZSBuZXcgcmlnaHQgcGFnZSBmb3IgdGhlIHNwbGl0CisJICovCisJcm1wID0gZ2V0X21ldGFwYWdlKGlwLCByYm4sIFBTSVpFLCAxKTsKKwlpZiAocm1wID09IE5VTEwpIHsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGNsZWFuX3VwOworCX0KKworCWpmc19pbmZvKCJ4dFNwbGl0UGFnZTogaXA6MHglcCBzbXA6MHglcCBybXA6MHglcCIsIGlwLCBzbXAsIHJtcCk7CisKKwlCVF9NQVJLX0RJUlRZKHJtcCwgaXApOworCS8qCisJICogYWN0aW9uOiBuZXcgcGFnZTsKKwkgKi8KKworCXJwID0gKHh0cGFnZV90ICopIHJtcC0+ZGF0YTsKKwlycC0+aGVhZGVyLnNlbGYgPSAqcHhkOworCXJwLT5oZWFkZXIuZmxhZyA9IHNwLT5oZWFkZXIuZmxhZyAmIEJUX1RZUEU7CisJcnAtPmhlYWRlci5tYXhlbnRyeSA9IHNwLT5oZWFkZXIubWF4ZW50cnk7CS8qIGxpdHRsZS1lbmRpYW4gKi8KKwlycC0+aGVhZGVyLm5leHRpbmRleCA9IGNwdV90b19sZTE2KFhURU5UUllTVEFSVCk7CisKKwlCVF9NQVJLX0RJUlRZKHNtcCwgaXApOworCS8qIERvbid0IGxvZyBpdCBpZiB0aGVyZSBhcmUgbm8gbGlua3MgdG8gdGhlIGZpbGUgKi8KKwlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCS8qCisJCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBuZXcgcmlnaHQgcGFnZTsKKwkJICovCisJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgcm1wLCB0bGNrWFRSRUUgfCB0bGNrTkVXKTsKKwkJcnh0bGNrID0gKHN0cnVjdCB4dGxvY2sgKikgJiB0bGNrLT5sb2NrOworCQlyeHRsY2stPmx3bS5vZmZzZXQgPSBYVEVOVFJZU1RBUlQ7CisJCS8qCisJCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBzcGxpdCBwYWdlCisJCSAqLworCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIHNtcCwgdGxja1hUUkVFIHwgdGxja0dST1cpOworCQlzeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJfQorCisJLyoKKwkgKiBpbml0aWFsaXplL3VwZGF0ZSBzaWJsaW5nIHBvaW50ZXJzIG9mIDxzcD4gYW5kIDxycD4KKwkgKi8KKwluZXh0Ym4gPSBsZTY0X3RvX2NwdShzcC0+aGVhZGVyLm5leHQpOworCXJwLT5oZWFkZXIubmV4dCA9IGNwdV90b19sZTY0KG5leHRibik7CisJcnAtPmhlYWRlci5wcmV2ID0gY3B1X3RvX2xlNjQoYWRkcmVzc1BYRCgmc3AtPmhlYWRlci5zZWxmKSk7CisJc3AtPmhlYWRlci5uZXh0ID0gY3B1X3RvX2xlNjQocmJuKTsKKworCXNraXAgPSBzcGxpdC0+aW5kZXg7CisKKwkvKgorCSAqICAgICAgc2VxdWVudGlhbCBhcHBlbmQgYXQgdGFpbCAoYWZ0ZXIgbGFzdCBlbnRyeSBvZiBsYXN0IHBhZ2UpCisJICoKKwkgKiBpZiBzcGxpdHRpbmcgdGhlIGxhc3QgcGFnZSBvbiBhIGxldmVsIGJlY2F1c2Ugb2YgYXBwZW5kaW5nCisJICogYSBlbnRyeSB0byBpdCAoc2tpcCBpcyBtYXhlbnRyeSksIGl0J3MgbGlrZWx5IHRoYXQgdGhlIGFjY2VzcyBpcworCSAqIHNlcXVlbnRpYWwuIGFkZGluZyBhbiBlbXB0eSBwYWdlIG9uIHRoZSBzaWRlIG9mIHRoZSBsZXZlbCBpcyBsZXNzCisJICogd29yayBhbmQgY2FuIHB1c2ggdGhlIGZpbGwgZmFjdG9yIG11Y2ggaGlnaGVyIHRoYW4gbm9ybWFsLgorCSAqIGlmIHdlJ3JlIHdyb25nIGl0J3Mgbm8gYmlnIGRlYWwgLSAgd2Ugd2lsbCBkbyB0aGUgc3BsaXQgdGhlIHJpZ2h0CisJICogd2F5IG5leHQgdGltZS4KKwkgKiAoaXQgbWF5IGxvb2sgbGlrZSBpdCdzIGVxdWFsbHkgZWFzeSB0byBkbyBhIHNpbWlsYXIgaGFjayBmb3IKKwkgKiByZXZlcnNlIHNvcnRlZCBkYXRhLCB0aGF0IGlzLCBzcGxpdCB0aGUgdHJlZSBsZWZ0LCBidXQgaXQncyBub3QuCisJICogQmUgbXkgZ3Vlc3QuKQorCSAqLworCWlmIChuZXh0Ym4gPT0gMCAmJiBza2lwID09IGxlMTZfdG9fY3B1KHNwLT5oZWFkZXIubWF4ZW50cnkpKSB7CisJCS8qCisJCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBuZXcvcmlnaHQgcGFnZTsKKwkJICoKKwkJICogYWN0aW9uOiB4YWQgaW5zZXJ0aW9uOworCQkgKi8KKwkJLyogaW5zZXJ0IGVudHJ5IGF0IHRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgbmV3IHJpZ2h0IHBhZ2UgKi8KKwkJeGFkID0gJnJwLT54YWRbWFRFTlRSWVNUQVJUXTsKKwkJWFRfUFVURU5UUlkoeGFkLCBzcGxpdC0+ZmxhZywgc3BsaXQtPm9mZiwgc3BsaXQtPmxlbiwKKwkJCSAgICBzcGxpdC0+YWRkcik7CisKKwkJcnAtPmhlYWRlci5uZXh0aW5kZXggPSBjcHVfdG9fbGUxNihYVEVOVFJZU1RBUlQgKyAxKTsKKworCQlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCQkvKiByeHRsY2stPmx3bS5vZmZzZXQgPSBYVEVOVFJZU1RBUlQ7ICovCisJCQlyeHRsY2stPmx3bS5sZW5ndGggPSAxOworCQl9CisKKwkJKnJtcHAgPSBybXA7CisJCSpyYm5wID0gcmJuOworCisJCWpmc19pbmZvKCJ4dFNwbGl0UGFnZTogc3A6MHglcCBycDoweCVwIiwgc3AsIHJwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiAgICAgIG5vbi1zZXF1ZW50aWFsIGluc2VydCAoYXQgcG9zc2libHkgbWlkZGxlIHBhZ2UpCisJICovCisKKwkvKgorCSAqIHVwZGF0ZSBwcmV2aW91cyBwb2ludGVyIG9mIG9sZCBuZXh0L3JpZ2h0IHBhZ2Ugb2YgPHNwPgorCSAqLworCWlmIChuZXh0Ym4gIT0gMCkgeworCQlYVF9HRVRQQUdFKGlwLCBuZXh0Ym4sIG1wLCBQU0laRSwgcCwgcmMpOworCQlpZiAocmMpIHsKKwkJCVhUX1BVVFBBR0Uocm1wKTsKKwkJCWdvdG8gY2xlYW5fdXA7CisJCX0KKworCQlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisJCS8qCisJCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBuZXh0IHBhZ2U7CisJCSAqCisJCSAqIGFjdGlvbjpzaWJsaW5nIHBvaW50ZXIgdXBkYXRlOworCQkgKi8KKwkJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSkKKwkJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tYVFJFRSB8IHRsY2tSRUxJTkspOworCisJCXAtPmhlYWRlci5wcmV2ID0gY3B1X3RvX2xlNjQocmJuKTsKKworCQkvKiBzaWJsaW5nIHBhZ2UgbWF5IGhhdmUgYmVlbiB1cGRhdGVkIHByZXZpb3VzbHksIG9yCisJCSAqIGl0IG1heSBiZSB1cGRhdGVkIGxhdGVyOworCQkgKi8KKworCQlYVF9QVVRQQUdFKG1wKTsKKwl9CisKKwkvKgorCSAqIHNwbGl0IHRoZSBkYXRhIGJldHdlZW4gdGhlIHNwbGl0IGFuZCBuZXcvcmlnaHQgcGFnZXMKKwkgKi8KKwltYXhlbnRyeSA9IGxlMTZfdG9fY3B1KHNwLT5oZWFkZXIubWF4ZW50cnkpOworCW1pZGRsZSA9IG1heGVudHJ5ID4+IDE7CisJcmlnaHRoYWxmID0gbWF4ZW50cnkgLSBtaWRkbGU7CisKKwkvKgorCSAqIHNraXAgaW5kZXggaW4gb2xkIHNwbGl0L2xlZnQgcGFnZSAtIGluc2VydCBpbnRvIGxlZnQgcGFnZToKKwkgKi8KKwlpZiAoc2tpcCA8PSBtaWRkbGUpIHsKKwkJLyogbW92ZSByaWdodCBoYWxmIG9mIHNwbGl0IHBhZ2UgdG8gdGhlIG5ldyByaWdodCBwYWdlICovCisJCW1lbW1vdmUoJnJwLT54YWRbWFRFTlRSWVNUQVJUXSwgJnNwLT54YWRbbWlkZGxlXSwKKwkJCXJpZ2h0aGFsZiA8PCBMMlhUU0xPVFNJWkUpOworCisJCS8qIHNoaWZ0IHJpZ2h0IHRhaWwgb2YgbGVmdCBoYWxmIHRvIG1ha2Ugcm9vbSBmb3IgbmV3IGVudHJ5ICovCisJCWlmIChza2lwIDwgbWlkZGxlKQorCQkJbWVtbW92ZSgmc3AtPnhhZFtza2lwICsgMV0sICZzcC0+eGFkW3NraXBdLAorCQkJCShtaWRkbGUgLSBza2lwKSA8PCBMMlhUU0xPVFNJWkUpOworCisJCS8qIGluc2VydCBuZXcgZW50cnkgKi8KKwkJeGFkID0gJnNwLT54YWRbc2tpcF07CisJCVhUX1BVVEVOVFJZKHhhZCwgc3BsaXQtPmZsYWcsIHNwbGl0LT5vZmYsIHNwbGl0LT5sZW4sCisJCQkgICAgc3BsaXQtPmFkZHIpOworCisJCS8qIHVwZGF0ZSBwYWdlIGhlYWRlciAqLworCQlzcC0+aGVhZGVyLm5leHRpbmRleCA9IGNwdV90b19sZTE2KG1pZGRsZSArIDEpOworCQlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCQlzeHRsY2stPmx3bS5vZmZzZXQgPSAoc3h0bGNrLT5sd20ub2Zmc2V0KSA/CisJCQkgICAgbWluKHNraXAsIChpbnQpc3h0bGNrLT5sd20ub2Zmc2V0KSA6IHNraXA7CisJCX0KKworCQlycC0+aGVhZGVyLm5leHRpbmRleCA9CisJCSAgICBjcHVfdG9fbGUxNihYVEVOVFJZU1RBUlQgKyByaWdodGhhbGYpOworCX0KKwkvKgorCSAqIHNraXAgaW5kZXggaW4gbmV3IHJpZ2h0IHBhZ2UgLSBpbnNlcnQgaW50byByaWdodCBwYWdlOgorCSAqLworCWVsc2UgeworCQkvKiBtb3ZlIGxlZnQgaGVhZCBvZiByaWdodCBoYWxmIHRvIHJpZ2h0IHBhZ2UgKi8KKwkJbiA9IHNraXAgLSBtaWRkbGU7CisJCW1lbW1vdmUoJnJwLT54YWRbWFRFTlRSWVNUQVJUXSwgJnNwLT54YWRbbWlkZGxlXSwKKwkJCW4gPDwgTDJYVFNMT1RTSVpFKTsKKworCQkvKiBpbnNlcnQgbmV3IGVudHJ5ICovCisJCW4gKz0gWFRFTlRSWVNUQVJUOworCQl4YWQgPSAmcnAtPnhhZFtuXTsKKwkJWFRfUFVURU5UUlkoeGFkLCBzcGxpdC0+ZmxhZywgc3BsaXQtPm9mZiwgc3BsaXQtPmxlbiwKKwkJCSAgICBzcGxpdC0+YWRkcik7CisKKwkJLyogbW92ZSByaWdodCB0YWlsIG9mIHJpZ2h0IGhhbGYgdG8gcmlnaHQgcGFnZSAqLworCQlpZiAoc2tpcCA8IG1heGVudHJ5KQorCQkJbWVtbW92ZSgmcnAtPnhhZFtuICsgMV0sICZzcC0+eGFkW3NraXBdLAorCQkJCShtYXhlbnRyeSAtIHNraXApIDw8IEwyWFRTTE9UU0laRSk7CisKKwkJLyogdXBkYXRlIHBhZ2UgaGVhZGVyICovCisJCXNwLT5oZWFkZXIubmV4dGluZGV4ID0gY3B1X3RvX2xlMTYobWlkZGxlKTsKKwkJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSkgeworCQkJc3h0bGNrLT5sd20ub2Zmc2V0ID0gKHN4dGxjay0+bHdtLm9mZnNldCkgPworCQkJICAgIG1pbihtaWRkbGUsIChpbnQpc3h0bGNrLT5sd20ub2Zmc2V0KSA6IG1pZGRsZTsKKwkJfQorCisJCXJwLT5oZWFkZXIubmV4dGluZGV4ID0gY3B1X3RvX2xlMTYoWFRFTlRSWVNUQVJUICsKKwkJCQkJCSAgIHJpZ2h0aGFsZiArIDEpOworCX0KKworCWlmICghdGVzdF9jZmxhZyhDT01NSVRfTm9saW5rLCBpcCkpIHsKKwkJc3h0bGNrLT5sd20ubGVuZ3RoID0gbGUxNl90b19jcHUoc3AtPmhlYWRlci5uZXh0aW5kZXgpIC0KKwkJICAgIHN4dGxjay0+bHdtLm9mZnNldDsKKworCQkvKiByeHRsY2stPmx3bS5vZmZzZXQgPSBYVEVOVFJZU1RBUlQ7ICovCisJCXJ4dGxjay0+bHdtLmxlbmd0aCA9IGxlMTZfdG9fY3B1KHJwLT5oZWFkZXIubmV4dGluZGV4KSAtCisJCSAgICBYVEVOVFJZU1RBUlQ7CisJfQorCisJKnJtcHAgPSBybXA7CisJKnJibnAgPSByYm47CisKKwlqZnNfaW5mbygieHRTcGxpdFBhZ2U6IHNwOjB4JXAgcnA6MHglcCIsIHNwLCBycCk7CisJcmV0dXJuIHJjOworCisgICAgICBjbGVhbl91cDoKKworCS8qIFJvbGxiYWNrIHF1b3RhIGFsbG9jYXRpb24uICovCisJaWYgKHF1b3RhX2FsbG9jYXRpb24pCisJCURRVU9UX0ZSRUVfQkxPQ0soaXAsIHF1b3RhX2FsbG9jYXRpb24pOworCisJcmV0dXJuIChyYyk7Cit9CisKKworLyoKKyAqICAgICAgeHRTcGxpdFJvb3QoKQorICoKKyAqIGZ1bmN0aW9uOgorICogICAgICBzcGxpdCB0aGUgZnVsbCByb290IHBhZ2UgaW50bworICogICAgICBvcmlnaW5hbC9yb290L3NwbGl0IHBhZ2UgYW5kIG5ldyByaWdodCBwYWdlCisgKiAgICAgIGkuZS4sIHJvb3QgcmVtYWlucyBmaXhlZCBpbiB0cmVlIGFuY2hvciAoaW5vZGUpIGFuZAorICogICAgICB0aGUgcm9vdCBpcyBjb3BpZWQgdG8gYSBzaW5nbGUgbmV3IHJpZ2h0IGNoaWxkIHBhZ2UKKyAqICAgICAgc2luY2Ugcm9vdCBwYWdlIDw8IG5vbi1yb290IHBhZ2UsIGFuZAorICogICAgICB0aGUgc3BsaXQgcm9vdCBwYWdlIGNvbnRhaW5zIGEgc2luZ2xlIGVudHJ5IGZvciB0aGUKKyAqICAgICAgbmV3IHJpZ2h0IGNoaWxkIHBhZ2UuCisgKgorICogcGFyYW1ldGVyOgorICogICAgICBpbnQJCXRpZCwKKyAqICAgICAgc3RydWN0IGlub2RlICAgICppcCwKKyAqICAgICAgc3RydWN0IHh0c3BsaXQgICpzcGxpdCwKKyAqICAgICAgc3RydWN0IG1ldGFwYWdlCSoqcm1wcCkKKyAqCisgKiByZXR1cm46CisgKiAgICAgIFBvaW50ZXIgdG8gcGFnZSBpbiB3aGljaCB0byBpbnNlcnQgb3IgTlVMTCBvbiBlcnJvci4KKyAqLworc3RhdGljIGludAoreHRTcGxpdFJvb3QodGlkX3QgdGlkLAorCSAgICBzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgeHRzcGxpdCAqIHNwbGl0LCBzdHJ1Y3QgbWV0YXBhZ2UgKiogcm1wcCkKK3sKKwl4dHBhZ2VfdCAqc3A7CisJc3RydWN0IG1ldGFwYWdlICpybXA7CisJeHRwYWdlX3QgKnJwOworCXM2NCByYm47CisJaW50IHNraXAsIG5leHRpbmRleDsKKwl4YWRfdCAqeGFkOworCXB4ZF90ICpweGQ7CisJc3RydWN0IHB4ZGxpc3QgKnB4ZGxpc3Q7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCB4dGxvY2sgKnh0bGNrOworCisJc3AgPSAmSkZTX0lQKGlwKS0+aV94dHJvb3Q7CisKKwlJTkNSRU1FTlQoeHRTdGF0LnNwbGl0KTsKKworCS8qCisJICogICAgICBhbGxvY2F0ZSBhIHNpbmdsZSAocmlnaHQpIGNoaWxkIHBhZ2UKKwkgKi8KKwlweGRsaXN0ID0gc3BsaXQtPnB4ZGxpc3Q7CisJcHhkID0gJnB4ZGxpc3QtPnB4ZFtweGRsaXN0LT5ucHhkXTsKKwlweGRsaXN0LT5ucHhkKys7CisJcmJuID0gYWRkcmVzc1BYRChweGQpOworCXJtcCA9IGdldF9tZXRhcGFnZShpcCwgcmJuLCBQU0laRSwgMSk7CisJaWYgKHJtcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIEFsbG9jYXRlIGJsb2NrcyB0byBxdW90YS4gKi8KKwlpZiAoRFFVT1RfQUxMT0NfQkxPQ0soaXAsIGxlbmd0aFBYRChweGQpKSkgeworCQlyZWxlYXNlX21ldGFwYWdlKHJtcCk7CisJCXJldHVybiAtRURRVU9UOworCX0KKworCWpmc19pbmZvKCJ4dFNwbGl0Um9vdDogaXA6MHglcCBybXA6MHglcCIsIGlwLCBybXApOworCisJLyoKKwkgKiBhY3F1aXJlIGEgdHJhbnNhY3Rpb24gbG9jayBvbiB0aGUgbmV3IHJpZ2h0IHBhZ2U7CisJICoKKwkgKiBhY3Rpb246IG5ldyBwYWdlOworCSAqLworCUJUX01BUktfRElSVFkocm1wLCBpcCk7CisKKwlycCA9ICh4dHBhZ2VfdCAqKSBybXAtPmRhdGE7CisJcnAtPmhlYWRlci5mbGFnID0KKwkgICAgKHNwLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpID8gQlRfTEVBRiA6IEJUX0lOVEVSTkFMOworCXJwLT5oZWFkZXIuc2VsZiA9ICpweGQ7CisJcnAtPmhlYWRlci5uZXh0aW5kZXggPSBjcHVfdG9fbGUxNihYVEVOVFJZU1RBUlQpOworCXJwLT5oZWFkZXIubWF4ZW50cnkgPSBjcHVfdG9fbGUxNihQU0laRSA+PiBMMlhUU0xPVFNJWkUpOworCisJLyogaW5pdGlhbGl6ZSBzaWJsaW5nIHBvaW50ZXJzICovCisJcnAtPmhlYWRlci5uZXh0ID0gMDsKKwlycC0+aGVhZGVyLnByZXYgPSAwOworCisJLyoKKwkgKiBjb3B5IHRoZSBpbi1saW5lIHJvb3QgcGFnZSBpbnRvIG5ldyByaWdodCBwYWdlIGV4dGVudAorCSAqLworCW5leHRpbmRleCA9IGxlMTZfdG9fY3B1KHNwLT5oZWFkZXIubWF4ZW50cnkpOworCW1lbW1vdmUoJnJwLT54YWRbWFRFTlRSWVNUQVJUXSwgJnNwLT54YWRbWFRFTlRSWVNUQVJUXSwKKwkJKG5leHRpbmRleCAtIFhURU5UUllTVEFSVCkgPDwgTDJYVFNMT1RTSVpFKTsKKworCS8qCisJICogaW5zZXJ0IHRoZSBuZXcgZW50cnkgaW50byB0aGUgbmV3IHJpZ2h0L2NoaWxkIHBhZ2UKKwkgKiAoc2tpcCBpbmRleCBpbiB0aGUgbmV3IHJpZ2h0IHBhZ2Ugd2lsbCBub3QgY2hhbmdlKQorCSAqLworCXNraXAgPSBzcGxpdC0+aW5kZXg7CisJLyogaWYgaW5zZXJ0IGludG8gbWlkZGxlLCBzaGlmdCByaWdodCByZW1haW5pbmcgZW50cmllcyAqLworCWlmIChza2lwICE9IG5leHRpbmRleCkKKwkJbWVtbW92ZSgmcnAtPnhhZFtza2lwICsgMV0sICZycC0+eGFkW3NraXBdLAorCQkJKG5leHRpbmRleCAtIHNraXApICogc2l6ZW9mKHhhZF90KSk7CisKKwl4YWQgPSAmcnAtPnhhZFtza2lwXTsKKwlYVF9QVVRFTlRSWSh4YWQsIHNwbGl0LT5mbGFnLCBzcGxpdC0+b2ZmLCBzcGxpdC0+bGVuLCBzcGxpdC0+YWRkcik7CisKKwkvKiB1cGRhdGUgcGFnZSBoZWFkZXIgKi8KKwlycC0+aGVhZGVyLm5leHRpbmRleCA9IGNwdV90b19sZTE2KG5leHRpbmRleCArIDEpOworCisJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSkgeworCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIHJtcCwgdGxja1hUUkVFIHwgdGxja05FVyk7CisJCXh0bGNrID0gKHN0cnVjdCB4dGxvY2sgKikgJiB0bGNrLT5sb2NrOworCQl4dGxjay0+bHdtLm9mZnNldCA9IFhURU5UUllTVEFSVDsKKwkJeHRsY2stPmx3bS5sZW5ndGggPSBsZTE2X3RvX2NwdShycC0+aGVhZGVyLm5leHRpbmRleCkgLQorCQkgICAgWFRFTlRSWVNUQVJUOworCX0KKworCS8qCisJICogICAgICByZXNldCB0aGUgcm9vdAorCSAqCisJICogaW5pdCByb290IHdpdGggdGhlIHNpbmdsZSBlbnRyeSBmb3IgdGhlIG5ldyByaWdodCBwYWdlCisJICogc2V0IHRoZSAxc3QgZW50cnkgb2Zmc2V0IHRvIDAsIHdoaWNoIGZvcmNlIHRoZSBsZWZ0LW1vc3Qga2V5CisJICogYXQgYW55IGxldmVsIG9mIHRoZSB0cmVlIHRvIGJlIGxlc3MgdGhhbiBhbnkgc2VhcmNoIGtleS4KKwkgKi8KKwkvKgorCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSByb290IHBhZ2UgKGluLW1lbW9yeSBpbm9kZSk7CisJICoKKwkgKiBhY3Rpb246IHJvb3Qgc3BsaXQ7CisJICovCisJQlRfTUFSS19ESVJUWShzcGxpdC0+bXAsIGlwKTsKKworCXhhZCA9ICZzcC0+eGFkW1hURU5UUllTVEFSVF07CisJWFRfUFVURU5UUlkoeGFkLCBYQURfTkVXLCAwLCBKRlNfU0JJKGlwLT5pX3NiKS0+bmJwZXJwYWdlLCByYm4pOworCisJLyogdXBkYXRlIHBhZ2UgaGVhZGVyIG9mIHJvb3QgKi8KKwlzcC0+aGVhZGVyLmZsYWcgJj0gfkJUX0xFQUY7CisJc3AtPmhlYWRlci5mbGFnIHw9IEJUX0lOVEVSTkFMOworCisJc3AtPmhlYWRlci5uZXh0aW5kZXggPSBjcHVfdG9fbGUxNihYVEVOVFJZU1RBUlQgKyAxKTsKKworCWlmICghdGVzdF9jZmxhZyhDT01NSVRfTm9saW5rLCBpcCkpIHsKKwkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBzcGxpdC0+bXAsIHRsY2tYVFJFRSB8IHRsY2tHUk9XKTsKKwkJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJCXh0bGNrLT5sd20ub2Zmc2V0ID0gWFRFTlRSWVNUQVJUOworCQl4dGxjay0+bHdtLmxlbmd0aCA9IDE7CisJfQorCisJKnJtcHAgPSBybXA7CisKKwlqZnNfaW5mbygieHRTcGxpdFJvb3Q6IHNwOjB4JXAgcnA6MHglcCIsIHNwLCBycCk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICAgICAgeHRFeHRlbmQoKQorICoKKyAqIGZ1bmN0aW9uOiBleHRlbmQgaW4tcGxhY2U7CisgKgorICogbm90ZTogZXhpc3RpbmcgZXh0ZW50IG1heSBvciBtYXkgbm90IGhhdmUgYmVlbiBjb21taXR0ZWQuCisgKiBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHBhZ2VyIGJ1ZmZlciBjYWNoZSB1cGRhdGUsIGFuZAorICogd29ya2luZyBibG9jayBhbGxvY2F0aW9uIG1hcCB1cGRhdGU7CisgKiB1cGRhdGUgcG1hcDogYWxsb2Mgd2hvbGUgZXh0ZW5kZWQgZXh0ZW50OworICovCitpbnQgeHRFeHRlbmQodGlkX3QgdGlkLAkJLyogdHJhbnNhY3Rpb24gaWQgKi8KKwkgICAgIHN0cnVjdCBpbm9kZSAqaXAsIHM2NCB4b2ZmLAkvKiBkZWx0YSBleHRlbnQgb2Zmc2V0ICovCisJICAgICBzMzIgeGxlbiwJCS8qIGRlbHRhIGV4dGVudCBsZW5ndGggKi8KKwkgICAgIGludCBmbGFnKQoreworCWludCByYyA9IDA7CisJaW50IGNtcDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOwkvKiBtZXRhLXBhZ2UgYnVmZmVyICovCisJeHRwYWdlX3QgKnA7CQkvKiBiYXNlIEIrLXRyZWUgaW5kZXggcGFnZSAqLworCXM2NCBibjsKKwlpbnQgaW5kZXgsIG5leHRpbmRleCwgbGVuOworCXN0cnVjdCBidHN0YWNrIGJ0c3RhY2s7CS8qIHRyYXZlcnNlIHN0YWNrICovCisJc3RydWN0IHh0c3BsaXQgc3BsaXQ7CS8qIHNwbGl0IGluZm9ybWF0aW9uICovCisJeGFkX3QgKnhhZDsKKwlzNjQgeGFkZHI7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCB4dGxvY2sgKnh0bGNrID0gTlVMTDsKKworCWpmc19pbmZvKCJ4dEV4dGVuZDogbnhvZmY6MHglbHggbnhsZW46MHgleCIsICh1bG9uZykgeG9mZiwgeGxlbik7CisKKwkvKiB0aGVyZSBtdXN0IGV4aXN0IGV4dGVudCB0byBiZSBleHRlbmRlZCAqLworCWlmICgocmMgPSB4dFNlYXJjaChpcCwgeG9mZiAtIDEsICZjbXAsICZidHN0YWNrLCBYVF9JTlNFUlQpKSkKKwkJcmV0dXJuIHJjOworCisJLyogcmV0cmlldmUgc2VhcmNoIHJlc3VsdCAqLworCVhUX0dFVFNFQVJDSChpcCwgYnRzdGFjay50b3AsIGJuLCBtcCwgcCwgaW5kZXgpOworCisJaWYgKGNtcCAhPSAwKSB7CisJCVhUX1BVVFBBR0UobXApOworCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJ4dEV4dGVuZDogeHRTZWFyY2ggZGlkIG5vdCBmaW5kIGV4dGVudCIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBleHRlbnNpb24gbXVzdCBiZSBjb250aWd1b3VzICovCisJeGFkID0gJnAtPnhhZFtpbmRleF07CisJaWYgKChvZmZzZXRYQUQoeGFkKSArIGxlbmd0aFhBRCh4YWQpKSAhPSB4b2ZmKSB7CisJCVhUX1BVVFBBR0UobXApOworCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJ4dEV4dGVuZDogZXh0ZW5zaW9uIGlzIG5vdCBjb250aWd1b3VzIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qCisJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIGxlYWYgcGFnZTsKKwkgKgorCSAqIGFjdGlvbjogeGFkIGluc2VydGlvbi9leHRlbnNpb247CisJICovCisJQlRfTUFSS19ESVJUWShtcCwgaXApOworCWlmICghdGVzdF9jZmxhZyhDT01NSVRfTm9saW5rLCBpcCkpIHsKKwkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFIHwgdGxja0dST1cpOworCQl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopICYgdGxjay0+bG9jazsKKwl9CisKKwkvKiBleHRlbmQgd2lsbCBvdmVyZmxvdyBleHRlbnQgPyAqLworCXhsZW4gPSBsZW5ndGhYQUQoeGFkKSArIHhsZW47CisJaWYgKChsZW4gPSB4bGVuIC0gTUFYWExFTikgPD0gMCkKKwkJZ290byBleHRlbmRPbGQ7CisKKwkvKgorCSAqICAgICAgZXh0ZW50IG92ZXJmbG93OiBpbnNlcnQgZW50cnkgZm9yIG5ldyBleHRlbnQKKwkgKi8KKy8vaW5zZXJ0TmV3OgorCXhvZmYgPSBvZmZzZXRYQUQoeGFkKSArIE1BWFhMRU47CisJeGFkZHIgPSBhZGRyZXNzWEFEKHhhZCkgKyBNQVhYTEVOOworCW5leHRpbmRleCA9IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpOworCisJLyoKKwkgKiAgICAgIGlmIHRoZSBsZWFmIHBhZ2UgaXMgZnVsbCwgaW5zZXJ0IHRoZSBuZXcgZW50cnkgYW5kCisJICogICAgICBwcm9wYWdhdGUgdXAgdGhlIHJvdXRlciBlbnRyeSBmb3IgdGhlIG5ldyBwYWdlIGZyb20gc3BsaXQKKwkgKgorCSAqIFRoZSB4dFNwbGl0VXAoKSB3aWxsIGluc2VydCB0aGUgZW50cnkgYW5kIHVucGluIHRoZSBsZWFmIHBhZ2UuCisJICovCisJaWYgKG5leHRpbmRleCA9PSBsZTE2X3RvX2NwdShwLT5oZWFkZXIubWF4ZW50cnkpKSB7CisJCS8qIHh0U3BsaVVwKCkgdW5waW5zIGxlYWYgcGFnZXMgKi8KKwkJc3BsaXQubXAgPSBtcDsKKwkJc3BsaXQuaW5kZXggPSBpbmRleCArIDE7CisJCXNwbGl0LmZsYWcgPSBYQURfTkVXOworCQlzcGxpdC5vZmYgPSB4b2ZmOwkvKiBzcGxpdCBvZmZzZXQgKi8KKwkJc3BsaXQubGVuID0gbGVuOworCQlzcGxpdC5hZGRyID0geGFkZHI7CisJCXNwbGl0LnB4ZGxpc3QgPSBOVUxMOworCQlpZiAoKHJjID0geHRTcGxpdFVwKHRpZCwgaXAsICZzcGxpdCwgJmJ0c3RhY2spKSkKKwkJCXJldHVybiByYzsKKworCQkvKiBnZXQgYmFjayBvbGQgcGFnZSAqLworCQlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwkJLyoKKwkJICogaWYgbGVhZiByb290IGhhcyBiZWVuIHNwbGl0LCBvcmlnaW5hbCByb290IGhhcyBiZWVuCisJCSAqIGNvcGllZCB0byBuZXcgY2hpbGQgcGFnZSwgaS5lLiwgb3JpZ2luYWwgZW50cnkgbm93CisJCSAqIHJlc2lkZXMgb24gdGhlIG5ldyBjaGlsZCBwYWdlOworCQkgKi8KKwkJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfSU5URVJOQUwpIHsKKwkJCUFTU0VSVChwLT5oZWFkZXIubmV4dGluZGV4ID09CisJCQkgICAgICAgY3B1X3RvX2xlMTYoWFRFTlRSWVNUQVJUICsgMSkpOworCQkJeGFkID0gJnAtPnhhZFtYVEVOVFJZU1RBUlRdOworCQkJYm4gPSBhZGRyZXNzWEFEKHhhZCk7CisJCQlYVF9QVVRQQUdFKG1wKTsKKworCQkJLyogZ2V0IG5ldyBjaGlsZCBwYWdlICovCisJCQlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCisJCQlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisJCQlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCQkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFfHRsY2tHUk9XKTsKKwkJCQl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopICYgdGxjay0+bG9jazsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqICAgICAgaW5zZXJ0IHRoZSBuZXcgZW50cnkgaW50byB0aGUgbGVhZiBwYWdlCisJICovCisJZWxzZSB7CisJCS8qIGluc2VydCB0aGUgbmV3IGVudHJ5OiBtYXJrIHRoZSBlbnRyeSBORVcgKi8KKwkJeGFkID0gJnAtPnhhZFtpbmRleCArIDFdOworCQlYVF9QVVRFTlRSWSh4YWQsIFhBRF9ORVcsIHhvZmYsIGxlbiwgeGFkZHIpOworCisJCS8qIGFkdmFuY2UgbmV4dCBhdmFpbGFibGUgZW50cnkgaW5kZXggKi8KKwkJcC0+aGVhZGVyLm5leHRpbmRleCA9CisJCSAgICBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSArIDEpOworCX0KKworCS8qIGdldCBiYWNrIG9sZCBlbnRyeSAqLworCXhhZCA9ICZwLT54YWRbaW5kZXhdOworCXhsZW4gPSBNQVhYTEVOOworCisJLyoKKwkgKiBleHRlbmQgb2xkIGV4dGVudAorCSAqLworICAgICAgZXh0ZW5kT2xkOgorCVhBRGxlbmd0aCh4YWQsIHhsZW4pOworCWlmICghKHhhZC0+ZmxhZyAmIFhBRF9ORVcpKQorCQl4YWQtPmZsYWcgfD0gWEFEX0VYVEVOREVEOworCisJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSkgeworCQl4dGxjay0+bHdtLm9mZnNldCA9CisJCSAgICAoeHRsY2stPmx3bS5vZmZzZXQpID8gbWluKGluZGV4LAorCQkJCQkgICAgICAoaW50KXh0bGNrLT5sd20ub2Zmc2V0KSA6IGluZGV4OworCQl4dGxjay0+bHdtLmxlbmd0aCA9CisJCSAgICBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSAtIHh0bGNrLT5sd20ub2Zmc2V0OworCX0KKworCS8qIHVucGluIHRoZSBsZWFmIHBhZ2UgKi8KKwlYVF9QVVRQQUdFKG1wKTsKKworCXJldHVybiByYzsKK30KKworI2lmZGVmIF9OT1RZRVQKKy8qCisgKiAgICAgIHh0VGFpbGdhdGUoKQorICoKKyAqIGZ1bmN0aW9uOiBzcGxpdCBleGlzdGluZyAndGFpbCcgZXh0ZW50CisgKiAgICAgIChzcGxpdCBvZmZzZXQgPj0gc3RhcnQgb2Zmc2V0IG9mIHRhaWwgZXh0ZW50KSwgYW5kCisgKiAgICAgIHJlbG9jYXRlIGFuZCBleHRlbmQgdGhlIHNwbGl0IHRhaWwgaGFsZjsKKyAqCisgKiBub3RlOiBleGlzdGluZyBleHRlbnQgbWF5IG9yIG1heSBub3QgaGF2ZSBiZWVuIGNvbW1pdHRlZC4KKyAqIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgcGFnZXIgYnVmZmVyIGNhY2hlIHVwZGF0ZSwgYW5kCisgKiB3b3JraW5nIGJsb2NrIGFsbG9jYXRpb24gbWFwIHVwZGF0ZTsKKyAqIHVwZGF0ZSBwbWFwOiBmcmVlIG9sZCBzcGxpdCB0YWlsIGV4dGVudCwgYWxsb2MgbmV3IGV4dGVudDsKKyAqLworaW50IHh0VGFpbGdhdGUodGlkX3QgdGlkLAkJLyogdHJhbnNhY3Rpb24gaWQgKi8KKwkgICAgICAgc3RydWN0IGlub2RlICppcCwgczY0IHhvZmYsCS8qIHNwbGl0L25ldyBleHRlbnQgb2Zmc2V0ICovCisJICAgICAgIHMzMiB4bGVuLAkvKiBuZXcgZXh0ZW50IGxlbmd0aCAqLworCSAgICAgICBzNjQgeGFkZHIsCS8qIG5ldyBleHRlbnQgYWRkcmVzcyAqLworCSAgICAgICBpbnQgZmxhZykKK3sKKwlpbnQgcmMgPSAwOworCWludCBjbXA7CisJc3RydWN0IG1ldGFwYWdlICptcDsJLyogbWV0YS1wYWdlIGJ1ZmZlciAqLworCXh0cGFnZV90ICpwOwkJLyogYmFzZSBCKy10cmVlIGluZGV4IHBhZ2UgKi8KKwlzNjQgYm47CisJaW50IGluZGV4LCBuZXh0aW5kZXgsIGxsZW4sIHJsZW47CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsJLyogdHJhdmVyc2Ugc3RhY2sgKi8KKwlzdHJ1Y3QgeHRzcGxpdCBzcGxpdDsJLyogc3BsaXQgaW5mb3JtYXRpb24gKi8KKwl4YWRfdCAqeGFkOworCXN0cnVjdCB0bG9jayAqdGxjazsKKwlzdHJ1Y3QgeHRsb2NrICp4dGxjayA9IDA7CisJc3RydWN0IHRsb2NrICptdGxjazsKKwlzdHJ1Y3QgbWFwbG9jayAqcHhkbG9jazsKKworLyoKK3ByaW50ZigieHRUYWlsZ2F0ZTogbnhvZmY6MHglbHggbnhsZW46MHgleCBueGFkZHI6MHglbHhcbiIsCisgICAgICAgICh1bG9uZyl4b2ZmLCB4bGVuLCAodWxvbmcpeGFkZHIpOworKi8KKworCS8qIHRoZXJlIG11c3QgZXhpc3QgZXh0ZW50IHRvIGJlIHRhaWxnYXRlZCAqLworCWlmICgocmMgPSB4dFNlYXJjaChpcCwgeG9mZiwgJmNtcCwgJmJ0c3RhY2ssIFhUX0lOU0VSVCkpKQorCQlyZXR1cm4gcmM7CisKKwkvKiByZXRyaWV2ZSBzZWFyY2ggcmVzdWx0ICovCisJWFRfR0VUU0VBUkNIKGlwLCBidHN0YWNrLnRvcCwgYm4sIG1wLCBwLCBpbmRleCk7CisKKwlpZiAoY21wICE9IDApIHsKKwkJWFRfUFVUUEFHRShtcCk7CisJCWpmc19lcnJvcihpcC0+aV9zYiwgInh0VGFpbGdhdGU6IGNvdWxkbid0IGZpbmQgZXh0ZW50Iik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGVudHJ5IGZvdW5kIG11c3QgYmUgbGFzdCBlbnRyeSAqLworCW5leHRpbmRleCA9IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpOworCWlmIChpbmRleCAhPSBuZXh0aW5kZXggLSAxKSB7CisJCVhUX1BVVFBBR0UobXApOworCQlqZnNfZXJyb3IoaXAtPmlfc2IsCisJCQkgICJ4dFRhaWxnYXRlOiB0aGUgZW50cnkgZm91bmQgaXMgbm90IHRoZSBsYXN0IGVudHJ5Iik7CisJCXJldHVybiAtRUlPOworCX0KKworCUJUX01BUktfRElSVFkobXAsIGlwKTsKKwkvKgorCSAqIGFjcXVpcmUgdGxvY2sgb2YgdGhlIGxlYWYgcGFnZSBjb250YWluaW5nIG9yaWdpbmFsIGVudHJ5CisJICovCisJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSkgeworCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIG1wLCB0bGNrWFRSRUUgfCB0bGNrR1JPVyk7CisJCXh0bGNrID0gKHN0cnVjdCB4dGxvY2sgKikgJiB0bGNrLT5sb2NrOworCX0KKworCS8qIGNvbXBsZXRlbHkgcmVwbGFjZSBleHRlbnQgPyAqLworCXhhZCA9ICZwLT54YWRbaW5kZXhdOworLyoKK3ByaW50ZigieHRUYWlsZ2F0ZTogeG9mZjoweCVseCB4bGVuOjB4JXggeGFkZHI6MHglbHhcbiIsCisgICAgICAgICh1bG9uZylvZmZzZXRYQUQoeGFkKSwgbGVuZ3RoWEFEKHhhZCksICh1bG9uZylhZGRyZXNzWEFEKHhhZCkpOworKi8KKwlpZiAoKGxsZW4gPSB4b2ZmIC0gb2Zmc2V0WEFEKHhhZCkpID09IDApCisJCWdvdG8gdXBkYXRlT2xkOworCisJLyoKKwkgKiAgICAgIHBhcnRpYWxseSByZXBsYWNlIGV4dGVudDogaW5zZXJ0IGVudHJ5IGZvciBuZXcgZXh0ZW50CisJICovCisvL2luc2VydE5ldzoKKwkvKgorCSAqICAgICAgaWYgdGhlIGxlYWYgcGFnZSBpcyBmdWxsLCBpbnNlcnQgdGhlIG5ldyBlbnRyeSBhbmQKKwkgKiAgICAgIHByb3BhZ2F0ZSB1cCB0aGUgcm91dGVyIGVudHJ5IGZvciB0aGUgbmV3IHBhZ2UgZnJvbSBzcGxpdAorCSAqCisJICogVGhlIHh0U3BsaXRVcCgpIHdpbGwgaW5zZXJ0IHRoZSBlbnRyeSBhbmQgdW5waW4gdGhlIGxlYWYgcGFnZS4KKwkgKi8KKwlpZiAobmV4dGluZGV4ID09IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5tYXhlbnRyeSkpIHsKKwkJLyogeHRTcGxpVXAoKSB1bnBpbnMgbGVhZiBwYWdlcyAqLworCQlzcGxpdC5tcCA9IG1wOworCQlzcGxpdC5pbmRleCA9IGluZGV4ICsgMTsKKwkJc3BsaXQuZmxhZyA9IFhBRF9ORVc7CisJCXNwbGl0Lm9mZiA9IHhvZmY7CS8qIHNwbGl0IG9mZnNldCAqLworCQlzcGxpdC5sZW4gPSB4bGVuOworCQlzcGxpdC5hZGRyID0geGFkZHI7CisJCXNwbGl0LnB4ZGxpc3QgPSBOVUxMOworCQlpZiAoKHJjID0geHRTcGxpdFVwKHRpZCwgaXAsICZzcGxpdCwgJmJ0c3RhY2spKSkKKwkJCXJldHVybiByYzsKKworCQkvKiBnZXQgYmFjayBvbGQgcGFnZSAqLworCQlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwkJLyoKKwkJICogaWYgbGVhZiByb290IGhhcyBiZWVuIHNwbGl0LCBvcmlnaW5hbCByb290IGhhcyBiZWVuCisJCSAqIGNvcGllZCB0byBuZXcgY2hpbGQgcGFnZSwgaS5lLiwgb3JpZ2luYWwgZW50cnkgbm93CisJCSAqIHJlc2lkZXMgb24gdGhlIG5ldyBjaGlsZCBwYWdlOworCQkgKi8KKwkJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfSU5URVJOQUwpIHsKKwkJCUFTU0VSVChwLT5oZWFkZXIubmV4dGluZGV4ID09CisJCQkgICAgICAgY3B1X3RvX2xlMTYoWFRFTlRSWVNUQVJUICsgMSkpOworCQkJeGFkID0gJnAtPnhhZFtYVEVOVFJZU1RBUlRdOworCQkJYm4gPSBhZGRyZXNzWEFEKHhhZCk7CisJCQlYVF9QVVRQQUdFKG1wKTsKKworCQkJLyogZ2V0IG5ldyBjaGlsZCBwYWdlICovCisJCQlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCisJCQlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisJCQlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCQkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFfHRsY2tHUk9XKTsKKwkJCQl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopICYgdGxjay0+bG9jazsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqICAgICAgaW5zZXJ0IHRoZSBuZXcgZW50cnkgaW50byB0aGUgbGVhZiBwYWdlCisJICovCisJZWxzZSB7CisJCS8qIGluc2VydCB0aGUgbmV3IGVudHJ5OiBtYXJrIHRoZSBlbnRyeSBORVcgKi8KKwkJeGFkID0gJnAtPnhhZFtpbmRleCArIDFdOworCQlYVF9QVVRFTlRSWSh4YWQsIFhBRF9ORVcsIHhvZmYsIHhsZW4sIHhhZGRyKTsKKworCQkvKiBhZHZhbmNlIG5leHQgYXZhaWxhYmxlIGVudHJ5IGluZGV4ICovCisJCXAtPmhlYWRlci5uZXh0aW5kZXggPQorCQkgICAgY3B1X3RvX2xlMTYobGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgKyAxKTsKKwl9CisKKwkvKiBnZXQgYmFjayBvbGQgWEFEICovCisJeGFkID0gJnAtPnhhZFtpbmRleF07CisKKwkvKgorCSAqIHRydW5jYXRlL3JlbG9jYXRlIG9sZCBleHRlbnQgYXQgc3BsaXQgb2Zmc2V0CisJICovCisgICAgICB1cGRhdGVPbGQ6CisJLyogdXBkYXRlIGRtYXAgZm9yIG9sZC9jb21taXR0ZWQvdHJ1bmNhdGVkIGV4dGVudCAqLworCXJsZW4gPSBsZW5ndGhYQUQoeGFkKSAtIGxsZW47CisJaWYgKCEoeGFkLT5mbGFnICYgWEFEX05FVykpIHsKKwkJLyogZnJlZSBmcm9tIFBXTUFQIGF0IGNvbW1pdCAqLworCQlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCQltdGxjayA9IHR4TWFwbG9jayh0aWQsIGlwLCB0bGNrTUFQKTsKKwkJCXB4ZGxvY2sgPSAoc3RydWN0IG1hcGxvY2sgKikgJiBtdGxjay0+bG9jazsKKwkJCXB4ZGxvY2stPmZsYWcgPSBtbGNrRlJFRVBYRDsKKwkJCVBYRGFkZHJlc3MoJnB4ZGxvY2stPnB4ZCwgYWRkcmVzc1hBRCh4YWQpICsgbGxlbik7CisJCQlQWERsZW5ndGgoJnB4ZGxvY2stPnB4ZCwgcmxlbik7CisJCQlweGRsb2NrLT5pbmRleCA9IDE7CisJCX0KKwl9IGVsc2UKKwkJLyogZnJlZSBmcm9tIFdNQVAgKi8KKwkJZGJGcmVlKGlwLCBhZGRyZXNzWEFEKHhhZCkgKyBsbGVuLCAoczY0KSBybGVuKTsKKworCWlmIChsbGVuKQorCQkvKiB0cnVuY2F0ZSAqLworCQlYQURsZW5ndGgoeGFkLCBsbGVuKTsKKwllbHNlCisJCS8qIHJlcGxhY2UgKi8KKwkJWFRfUFVURU5UUlkoeGFkLCBYQURfTkVXLCB4b2ZmLCB4bGVuLCB4YWRkcik7CisKKwlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCXh0bGNrLT5sd20ub2Zmc2V0ID0gKHh0bGNrLT5sd20ub2Zmc2V0KSA/CisJCSAgICBtaW4oaW5kZXgsIChpbnQpeHRsY2stPmx3bS5vZmZzZXQpIDogaW5kZXg7CisJCXh0bGNrLT5sd20ubGVuZ3RoID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLQorCQkgICAgeHRsY2stPmx3bS5vZmZzZXQ7CisJfQorCisJLyogdW5waW4gdGhlIGxlYWYgcGFnZSAqLworCVhUX1BVVFBBR0UobXApOworCisJcmV0dXJuIHJjOworfQorI2VuZGlmIC8qIF9OT1RZRVQgKi8KKworLyoKKyAqICAgICAgeHRVcGRhdGUoKQorICoKKyAqIGZ1bmN0aW9uOiB1cGRhdGUgWEFEOworICoKKyAqICAgICAgdXBkYXRlIGV4dGVudCBmb3IgYWxsb2NhdGVkX2J1dF9ub3RfcmVjb3JkZWQgb3IKKyAqICAgICAgY29tcHJlc3NlZCBleHRlbnQ7CisgKgorICogcGFyYW1ldGVyOgorICogICAgICBueGFkICAgIC0gbmV3IFhBRDsKKyAqICAgICAgICAgICAgICAgIGxvZ2ljYWwgZXh0ZW50IG9mIHRoZSBzcGVjaWZpZWQgWEFEIG11c3QgYmUgY29tcGxldGVseQorICogICAgICAgICAgICAgICAgY29udGFpbmVkIGJ5IGFuIGV4aXN0aW5nIFhBRDsKKyAqLworaW50IHh0VXBkYXRlKHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwgeGFkX3QgKiBueGFkKQorewkJCQkvKiBuZXcgWEFEICovCisJaW50IHJjID0gMDsKKwlpbnQgY21wOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CS8qIG1ldGEtcGFnZSBidWZmZXIgKi8KKwl4dHBhZ2VfdCAqcDsJCS8qIGJhc2UgQistdHJlZSBpbmRleCBwYWdlICovCisJczY0IGJuOworCWludCBpbmRleDAsIGluZGV4LCBuZXdpbmRleCwgbmV4dGluZGV4OworCXN0cnVjdCBidHN0YWNrIGJ0c3RhY2s7CS8qIHRyYXZlcnNlIHN0YWNrICovCisJc3RydWN0IHh0c3BsaXQgc3BsaXQ7CS8qIHNwbGl0IGluZm9ybWF0aW9uICovCisJeGFkX3QgKnhhZCwgKmx4YWQsICpyeGFkOworCWludCB4ZmxhZzsKKwlzNjQgbnhvZmYsIHhvZmY7CisJaW50IG54bGVuLCB4bGVuLCBseGxlbiwgcnhsZW47CisJczY0IG54YWRkciwgeGFkZHI7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCB4dGxvY2sgKnh0bGNrID0gTlVMTDsKKwlpbnQgbmV3cGFnZSA9IDA7CisKKwkvKiB0aGVyZSBtdXN0IGV4aXN0IGV4dGVudCB0byBiZSB0YWlsZ2F0ZWQgKi8KKwlueG9mZiA9IG9mZnNldFhBRChueGFkKTsKKwlueGxlbiA9IGxlbmd0aFhBRChueGFkKTsKKwlueGFkZHIgPSBhZGRyZXNzWEFEKG54YWQpOworCisJaWYgKChyYyA9IHh0U2VhcmNoKGlwLCBueG9mZiwgJmNtcCwgJmJ0c3RhY2ssIFhUX0lOU0VSVCkpKQorCQlyZXR1cm4gcmM7CisKKwkvKiByZXRyaWV2ZSBzZWFyY2ggcmVzdWx0ICovCisJWFRfR0VUU0VBUkNIKGlwLCBidHN0YWNrLnRvcCwgYm4sIG1wLCBwLCBpbmRleDApOworCisJaWYgKGNtcCAhPSAwKSB7CisJCVhUX1BVVFBBR0UobXApOworCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJ4dFVwZGF0ZTogQ291bGQgbm90IGZpbmQgZXh0ZW50Iik7CisJCXJldHVybiAtRUlPOworCX0KKworCUJUX01BUktfRElSVFkobXAsIGlwKTsKKwkvKgorCSAqIGFjcXVpcmUgdGxvY2sgb2YgdGhlIGxlYWYgcGFnZSBjb250YWluaW5nIG9yaWdpbmFsIGVudHJ5CisJICovCisJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSkgeworCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIG1wLCB0bGNrWFRSRUUgfCB0bGNrR1JPVyk7CisJCXh0bGNrID0gKHN0cnVjdCB4dGxvY2sgKikgJiB0bGNrLT5sb2NrOworCX0KKworCXhhZCA9ICZwLT54YWRbaW5kZXgwXTsKKwl4ZmxhZyA9IHhhZC0+ZmxhZzsKKwl4b2ZmID0gb2Zmc2V0WEFEKHhhZCk7CisJeGxlbiA9IGxlbmd0aFhBRCh4YWQpOworCXhhZGRyID0gYWRkcmVzc1hBRCh4YWQpOworCisJLyogblhBRCBtdXN0IGJlIGNvbXBsZXRlbHkgY29udGFpbmVkIHdpdGhpbiBYQUQgKi8KKwlpZiAoKHhvZmYgPiBueG9mZikgfHwKKwkgICAgKG54b2ZmICsgbnhsZW4gPiB4b2ZmICsgeGxlbikpIHsKKwkJWFRfUFVUUEFHRShtcCk7CisJCWpmc19lcnJvcihpcC0+aV9zYiwKKwkJCSAgInh0VXBkYXRlOiBuWEFEIGluIG5vdCBjb21wbGV0ZWx5IGNvbnRhaW5lZCB3aXRoaW4gWEFEIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWluZGV4ID0gaW5kZXgwOworCW5ld2luZGV4ID0gaW5kZXggKyAxOworCW5leHRpbmRleCA9IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpOworCisjaWZkZWYgIF9KRlNfV0lQX05PQ09BTEVTQ0UKKwlpZiAoeG9mZiA8IG54b2ZmKQorCQlnb3RvIHVwZGF0ZVJpZ2h0OworCisJLyoKKwkgKiByZXBsYWNlIFhBRCB3aXRoIG5YQUQKKwkgKi8KKyAgICAgIHJlcGxhY2U6CQkJLyogKG54b2ZmID09IHhvZmYpICovCisJaWYgKG54bGVuID09IHhsZW4pIHsKKwkJLyogcmVwbGFjZSBYQUQgd2l0aCBuWEFEOnJlY29yZGVkICovCisJCSp4YWQgPSAqbnhhZDsKKwkJeGFkLT5mbGFnID0geGZsYWcgJiB+WEFEX05PVFJFQ09SREVEOworCisJCWdvdG8gb3V0OworCX0gZWxzZQkJCS8qIChueGxlbiA8IHhsZW4pICovCisJCWdvdG8gdXBkYXRlTGVmdDsKKyNlbmRpZgkJCQkvKiBfSkZTX1dJUF9OT0NPQUxFU0NFICovCisKKy8qICNpZmRlZiBfSkZTX1dJUF9DT0FMRVNDRSAqLworCWlmICh4b2ZmIDwgbnhvZmYpCisJCWdvdG8gY29hbGVzY2VSaWdodDsKKworCS8qCisJICogY29hbGVzY2Ugd2l0aCBsZWZ0IFhBRAorCSAqLworLy9jb2FsZXNjZUxlZnQ6IC8qICh4b2ZmID09IG54b2ZmKSAqLworCS8qIGlzIFhBRCBmaXJzdCBlbnRyeSBvZiBwYWdlID8gKi8KKwlpZiAoaW5kZXggPT0gWFRFTlRSWVNUQVJUKQorCQlnb3RvIHJlcGxhY2U7CisKKwkvKiBpcyBuWEFEIGxvZ2ljYWxseSBhbmQgcGh5c2ljYWxseSBjb250aWd1b3VzIHdpdGggbFhBRCA/ICovCisJbHhhZCA9ICZwLT54YWRbaW5kZXggLSAxXTsKKwlseGxlbiA9IGxlbmd0aFhBRChseGFkKTsKKwlpZiAoIShseGFkLT5mbGFnICYgWEFEX05PVFJFQ09SREVEKSAmJgorCSAgICAobnhvZmYgPT0gb2Zmc2V0WEFEKGx4YWQpICsgbHhsZW4pICYmCisJICAgIChueGFkZHIgPT0gYWRkcmVzc1hBRChseGFkKSArIGx4bGVuKSAmJgorCSAgICAobHhsZW4gKyBueGxlbiA8IE1BWFhMRU4pKSB7CisJCS8qIGV4dGVuZCByaWdodCBsWEFEICovCisJCWluZGV4MCA9IGluZGV4IC0gMTsKKwkJWEFEbGVuZ3RoKGx4YWQsIGx4bGVuICsgbnhsZW4pOworCisJCS8qIElmIHdlIGp1c3QgbWVyZ2VkIHR3byBleHRlbnRzIHRvZ2V0aGVyLCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUKKwkJICogcmlnaHQgZXh0ZW50IGdldHMgbG9nZ2VkLiAgSWYgdGhlIGxlZnQgb25lIGlzIG1hcmtlZCBYQURfTkVXLAorCQkgKiB0aGVuIHdlIGtub3cgaXQgd2lsbCBiZSBsb2dnZWQuICBPdGhlcndpc2UsIG1hcmsgYXMKKwkJICogWEFEX0VYVEVOREVECisJCSAqLworCQlpZiAoIShseGFkLT5mbGFnICYgWEFEX05FVykpCisJCQlseGFkLT5mbGFnIHw9IFhBRF9FWFRFTkRFRDsKKworCQlpZiAoeGxlbiA+IG54bGVuKSB7CisJCQkvKiB0cnVuY2F0ZSBYQUQgKi8KKwkJCVhBRG9mZnNldCh4YWQsIHhvZmYgKyBueGxlbik7CisJCQlYQURsZW5ndGgoeGFkLCB4bGVuIC0gbnhsZW4pOworCQkJWEFEYWRkcmVzcyh4YWQsIHhhZGRyICsgbnhsZW4pOworCQkJZ290byBvdXQ7CisJCX0gZWxzZSB7CS8qICh4bGVuID09IG54bGVuKSAqLworCisJCQkvKiByZW1vdmUgWEFEICovCisJCQlpZiAoaW5kZXggPCBuZXh0aW5kZXggLSAxKQorCQkJCW1lbW1vdmUoJnAtPnhhZFtpbmRleF0sICZwLT54YWRbaW5kZXggKyAxXSwKKwkJCQkJKG5leHRpbmRleCAtIGluZGV4IC0KKwkJCQkJIDEpIDw8IEwyWFRTTE9UU0laRSk7CisKKwkJCXAtPmhlYWRlci5uZXh0aW5kZXggPQorCQkJICAgIGNwdV90b19sZTE2KGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0KKwkJCQkJMSk7CisKKwkJCWluZGV4ID0gaW5kZXgwOworCQkJbmV3aW5kZXggPSBpbmRleCArIDE7CisJCQluZXh0aW5kZXggPSBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KTsKKwkJCXhvZmYgPSBueG9mZiA9IG9mZnNldFhBRChseGFkKTsKKwkJCXhsZW4gPSBueGxlbiA9IGx4bGVuICsgbnhsZW47CisJCQl4YWRkciA9IG54YWRkciA9IGFkZHJlc3NYQUQobHhhZCk7CisJCQlnb3RvIGNvYWxlc2NlUmlnaHQ7CisJCX0KKwl9CisKKwkvKgorCSAqIHJlcGxhY2UgWEFEIHdpdGggblhBRAorCSAqLworICAgICAgcmVwbGFjZToJCQkvKiAobnhvZmYgPT0geG9mZikgKi8KKwlpZiAobnhsZW4gPT0geGxlbikgeworCQkvKiByZXBsYWNlIFhBRCB3aXRoIG5YQUQ6cmVjb3JkZWQgKi8KKwkJKnhhZCA9ICpueGFkOworCQl4YWQtPmZsYWcgPSB4ZmxhZyAmIH5YQURfTk9UUkVDT1JERUQ7CisKKwkJZ290byBjb2FsZXNjZVJpZ2h0OworCX0gZWxzZQkJCS8qIChueGxlbiA8IHhsZW4pICovCisJCWdvdG8gdXBkYXRlTGVmdDsKKworCS8qCisJICogY29hbGVzY2Ugd2l0aCByaWdodCBYQUQKKwkgKi8KKyAgICAgIGNvYWxlc2NlUmlnaHQ6CQkvKiAoeG9mZiA8PSBueG9mZikgKi8KKwkvKiBpcyBYQUQgbGFzdCBlbnRyeSBvZiBwYWdlID8gKi8KKwlpZiAobmV3aW5kZXggPT0gbmV4dGluZGV4KSB7CisJCWlmICh4b2ZmID09IG54b2ZmKQorCQkJZ290byBvdXQ7CisJCWdvdG8gdXBkYXRlUmlnaHQ7CisJfQorCisJLyogaXMgblhBRCBsb2dpY2FsbHkgYW5kIHBoeXNpY2FsbHkgY29udGlndW91cyB3aXRoIHJYQUQgPyAqLworCXJ4YWQgPSAmcC0+eGFkW2luZGV4ICsgMV07CisJcnhsZW4gPSBsZW5ndGhYQUQocnhhZCk7CisJaWYgKCEocnhhZC0+ZmxhZyAmIFhBRF9OT1RSRUNPUkRFRCkgJiYKKwkgICAgKG54b2ZmICsgbnhsZW4gPT0gb2Zmc2V0WEFEKHJ4YWQpKSAmJgorCSAgICAobnhhZGRyICsgbnhsZW4gPT0gYWRkcmVzc1hBRChyeGFkKSkgJiYKKwkgICAgKHJ4bGVuICsgbnhsZW4gPCBNQVhYTEVOKSkgeworCQkvKiBleHRlbmQgbGVmdCByWEFEICovCisJCVhBRG9mZnNldChyeGFkLCBueG9mZik7CisJCVhBRGxlbmd0aChyeGFkLCByeGxlbiArIG54bGVuKTsKKwkJWEFEYWRkcmVzcyhyeGFkLCBueGFkZHIpOworCisJCS8qIElmIHdlIGp1c3QgbWVyZ2VkIHR3byBleHRlbnRzIHRvZ2V0aGVyLCBuZWVkIHRvIG1ha2Ugc3VyZQorCQkgKiB0aGUgbGVmdCBleHRlbnQgZ2V0cyBsb2dnZWQuICBJZiB0aGUgcmlnaHQgb25lIGlzIG1hcmtlZAorCQkgKiBYQURfTkVXLCB0aGVuIHdlIGtub3cgaXQgd2lsbCBiZSBsb2dnZWQuICBPdGhlcndpc2UsIG1hcmsgYXMKKwkJICogWEFEX0VYVEVOREVECisJCSAqLworCQlpZiAoIShyeGFkLT5mbGFnICYgWEFEX05FVykpCisJCQlyeGFkLT5mbGFnIHw9IFhBRF9FWFRFTkRFRDsKKworCQlpZiAoeGxlbiA+IG54bGVuKQorCQkJLyogdHJ1bmNhdGUgWEFEICovCisJCQlYQURsZW5ndGgoeGFkLCB4bGVuIC0gbnhsZW4pOworCQllbHNlIHsJCS8qICh4bGVuID09IG54bGVuKSAqLworCisJCQkvKiByZW1vdmUgWEFEICovCisJCQltZW1tb3ZlKCZwLT54YWRbaW5kZXhdLCAmcC0+eGFkW2luZGV4ICsgMV0sCisJCQkJKG5leHRpbmRleCAtIGluZGV4IC0gMSkgPDwgTDJYVFNMT1RTSVpFKTsKKworCQkJcC0+aGVhZGVyLm5leHRpbmRleCA9CisJCQkgICAgY3B1X3RvX2xlMTYobGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLQorCQkJCQkxKTsKKwkJfQorCisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoeG9mZiA9PSBueG9mZikKKwkJZ290byBvdXQ7CisKKwlpZiAoeG9mZiA+PSBueG9mZikgeworCQlYVF9QVVRQQUdFKG1wKTsKKwkJamZzX2Vycm9yKGlwLT5pX3NiLCAieHRVcGRhdGU6IHhvZmYgPj0gbnhvZmYiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorLyogI2VuZGlmIF9KRlNfV0lQX0NPQUxFU0NFICovCisKKwkvKgorCSAqIHNwbGl0IFhBRCBpbnRvIChsWEFELCBuWEFEKToKKwkgKgorCSAqICAgICAgICAgIHwtLS1uWEFELS0tPgorCSAqIC0tfC0tLS0tLS0tLS1YQUQtLS0tLS0tLS0tfC0tCisJICogICB8LWxYQUQtfAorCSAqLworICAgICAgdXBkYXRlUmlnaHQ6CQkvKiAoeG9mZiA8IG54b2ZmKSAqLworCS8qIHRydW5jYXRlIG9sZCBYQUQgYXMgbFhBRDpub3RfcmVjb3JkZWQgKi8KKwl4YWQgPSAmcC0+eGFkW2luZGV4XTsKKwlYQURsZW5ndGgoeGFkLCBueG9mZiAtIHhvZmYpOworCisJLyogaW5zZXJ0IG5YQUQ6cmVjb3JkZWQgKi8KKwlpZiAobmV4dGluZGV4ID09IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5tYXhlbnRyeSkpIHsKKworCQkvKiB4dFNwbGlVcCgpIHVucGlucyBsZWFmIHBhZ2VzICovCisJCXNwbGl0Lm1wID0gbXA7CisJCXNwbGl0LmluZGV4ID0gbmV3aW5kZXg7CisJCXNwbGl0LmZsYWcgPSB4ZmxhZyAmIH5YQURfTk9UUkVDT1JERUQ7CisJCXNwbGl0Lm9mZiA9IG54b2ZmOworCQlzcGxpdC5sZW4gPSBueGxlbjsKKwkJc3BsaXQuYWRkciA9IG54YWRkcjsKKwkJc3BsaXQucHhkbGlzdCA9IE5VTEw7CisJCWlmICgocmMgPSB4dFNwbGl0VXAodGlkLCBpcCwgJnNwbGl0LCAmYnRzdGFjaykpKQorCQkJcmV0dXJuIHJjOworCisJCS8qIGdldCBiYWNrIG9sZCBwYWdlICovCisJCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCQkvKgorCQkgKiBpZiBsZWFmIHJvb3QgaGFzIGJlZW4gc3BsaXQsIG9yaWdpbmFsIHJvb3QgaGFzIGJlZW4KKwkJICogY29waWVkIHRvIG5ldyBjaGlsZCBwYWdlLCBpLmUuLCBvcmlnaW5hbCBlbnRyeSBub3cKKwkJICogcmVzaWRlcyBvbiB0aGUgbmV3IGNoaWxkIHBhZ2U7CisJCSAqLworCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9JTlRFUk5BTCkgeworCQkJQVNTRVJUKHAtPmhlYWRlci5uZXh0aW5kZXggPT0KKwkJCSAgICAgICBjcHVfdG9fbGUxNihYVEVOVFJZU1RBUlQgKyAxKSk7CisJCQl4YWQgPSAmcC0+eGFkW1hURU5UUllTVEFSVF07CisJCQlibiA9IGFkZHJlc3NYQUQoeGFkKTsKKwkJCVhUX1BVVFBBR0UobXApOworCisJCQkvKiBnZXQgbmV3IGNoaWxkIHBhZ2UgKi8KKwkJCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gcmM7CisKKwkJCUJUX01BUktfRElSVFkobXAsIGlwKTsKKwkJCWlmICghdGVzdF9jZmxhZyhDT01NSVRfTm9saW5rLCBpcCkpIHsKKwkJCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIG1wLCB0bGNrWFRSRUV8dGxja0dST1cpOworCQkJCXh0bGNrID0gKHN0cnVjdCB4dGxvY2sgKikgJiB0bGNrLT5sb2NrOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogaXMgblhBRCBvbiBuZXcgcGFnZSA/ICovCisJCQlpZiAobmV3aW5kZXggPgorCQkJICAgIChsZTE2X3RvX2NwdShwLT5oZWFkZXIubWF4ZW50cnkpID4+IDEpKSB7CisJCQkJbmV3aW5kZXggPQorCQkJCSAgICBuZXdpbmRleCAtCisJCQkJICAgIGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpICsKKwkJCQkgICAgWFRFTlRSWVNUQVJUOworCQkJCW5ld3BhZ2UgPSAxOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogaWYgaW5zZXJ0IGludG8gbWlkZGxlLCBzaGlmdCByaWdodCByZW1haW5pbmcgZW50cmllcyAqLworCQlpZiAobmV3aW5kZXggPCBuZXh0aW5kZXgpCisJCQltZW1tb3ZlKCZwLT54YWRbbmV3aW5kZXggKyAxXSwgJnAtPnhhZFtuZXdpbmRleF0sCisJCQkJKG5leHRpbmRleCAtIG5ld2luZGV4KSA8PCBMMlhUU0xPVFNJWkUpOworCisJCS8qIGluc2VydCB0aGUgZW50cnkgKi8KKwkJeGFkID0gJnAtPnhhZFtuZXdpbmRleF07CisJCSp4YWQgPSAqbnhhZDsKKwkJeGFkLT5mbGFnID0geGZsYWcgJiB+WEFEX05PVFJFQ09SREVEOworCisJCS8qIGFkdmFuY2UgbmV4dCBhdmFpbGFibGUgZW50cnkgaW5kZXguICovCisJCXAtPmhlYWRlci5uZXh0aW5kZXggPQorCQkgICAgY3B1X3RvX2xlMTYobGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgKyAxKTsKKwl9CisKKwkvKgorCSAqIGRvZXMgblhBRCBmb3JjZSAzLXdheSBzcGxpdCA/CisJICoKKwkgKiAgICAgICAgICB8LS0tblhBRC0tLT58CisJICogLS18LS0tLS0tLS0tLVhBRC0tLS0tLS0tLS0tLS18LS0KKwkgKiAgIHwtbFhBRC18ICAgICAgICAgICB8LXJYQUQgLXwKKwkgKi8KKwlpZiAobnhvZmYgKyBueGxlbiA9PSB4b2ZmICsgeGxlbikKKwkJZ290byBvdXQ7CisKKwkvKiByZW9yaWVudCBuWEFEIGFzIFhBRCBmb3IgZnVydGhlciBzcGxpdCBYQUQgaW50byAoblhBRCwgclhBRCkgKi8KKwlpZiAobmV3cGFnZSkgeworCQkvKiBjbG9zZSBvdXQgb2xkIHBhZ2UgKi8KKwkJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSkgeworCQkJeHRsY2stPmx3bS5vZmZzZXQgPSAoeHRsY2stPmx3bS5vZmZzZXQpID8KKwkJCSAgICBtaW4oaW5kZXgwLCAoaW50KXh0bGNrLT5sd20ub2Zmc2V0KSA6IGluZGV4MDsKKwkJCXh0bGNrLT5sd20ubGVuZ3RoID0KKwkJCSAgICBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSAtCisJCQkgICAgeHRsY2stPmx3bS5vZmZzZXQ7CisJCX0KKworCQlibiA9IGxlNjRfdG9fY3B1KHAtPmhlYWRlci5uZXh0KTsKKwkJWFRfUFVUUEFHRShtcCk7CisKKwkJLyogZ2V0IG5ldyByaWdodCBwYWdlICovCisJCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCUJUX01BUktfRElSVFkobXAsIGlwKTsKKwkJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSkgeworCQkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFIHwgdGxja0dST1cpOworCQkJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJCX0KKworCQlpbmRleDAgPSBpbmRleCA9IG5ld2luZGV4OworCX0gZWxzZQorCQlpbmRleCsrOworCisJbmV3aW5kZXggPSBpbmRleCArIDE7CisJbmV4dGluZGV4ID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCk7CisJeGxlbiA9IHhsZW4gLSAobnhvZmYgLSB4b2ZmKTsKKwl4b2ZmID0gbnhvZmY7CisJeGFkZHIgPSBueGFkZHI7CisKKwkvKiByZWNvbXB1dGUgc3BsaXQgcGFnZXMgKi8KKwlpZiAobmV4dGluZGV4ID09IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5tYXhlbnRyeSkpIHsKKwkJWFRfUFVUUEFHRShtcCk7CisKKwkJaWYgKChyYyA9IHh0U2VhcmNoKGlwLCBueG9mZiwgJmNtcCwgJmJ0c3RhY2ssIFhUX0lOU0VSVCkpKQorCQkJcmV0dXJuIHJjOworCisJCS8qIHJldHJpZXZlIHNlYXJjaCByZXN1bHQgKi8KKwkJWFRfR0VUU0VBUkNIKGlwLCBidHN0YWNrLnRvcCwgYm4sIG1wLCBwLCBpbmRleDApOworCisJCWlmIChjbXAgIT0gMCkgeworCQkJWFRfUFVUUEFHRShtcCk7CisJCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJ4dFVwZGF0ZTogeHRTZWFyY2ggZmFpbGVkIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWlmIChpbmRleDAgIT0gaW5kZXgpIHsKKwkJCVhUX1BVVFBBR0UobXApOworCQkJamZzX2Vycm9yKGlwLT5pX3NiLAorCQkJCSAgInh0VXBkYXRlOiB1bmV4cGVjdGVkIHZhbHVlIG9mIGluZGV4Iik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCS8qCisJICogc3BsaXQgWEFEIGludG8gKG5YQUQsIHJYQUQpCisJICoKKwkgKiAgICAgICAgICAtLS1uWEFELS0tfAorCSAqIC0tfC0tLS0tLS0tLS1YQUQtLS0tLS0tLS0tfC0tCisJICogICAgICAgICAgICAgICAgICAgIHwtclhBRC18CisJICovCisgICAgICB1cGRhdGVMZWZ0OgkJLyogKG54b2ZmID09IHhvZmYpICYmIChueGxlbiA8IHhsZW4pICovCisJLyogdXBkYXRlIG9sZCBYQUQgd2l0aCBuWEFEOnJlY29yZGVkICovCisJeGFkID0gJnAtPnhhZFtpbmRleF07CisJKnhhZCA9ICpueGFkOworCXhhZC0+ZmxhZyA9IHhmbGFnICYgflhBRF9OT1RSRUNPUkRFRDsKKworCS8qIGluc2VydCByWEFEOm5vdF9yZWNvcmRlZCAqLworCXhvZmYgPSB4b2ZmICsgbnhsZW47CisJeGxlbiA9IHhsZW4gLSBueGxlbjsKKwl4YWRkciA9IHhhZGRyICsgbnhsZW47CisJaWYgKG5leHRpbmRleCA9PSBsZTE2X3RvX2NwdShwLT5oZWFkZXIubWF4ZW50cnkpKSB7CisvKgorcHJpbnRmKCJ4dFVwZGF0ZS51cGRhdGVMZWZ0LnNwbGl0IHA6MHglcFxuIiwgcCk7CisqLworCQkvKiB4dFNwbGlVcCgpIHVucGlucyBsZWFmIHBhZ2VzICovCisJCXNwbGl0Lm1wID0gbXA7CisJCXNwbGl0LmluZGV4ID0gbmV3aW5kZXg7CisJCXNwbGl0LmZsYWcgPSB4ZmxhZzsKKwkJc3BsaXQub2ZmID0geG9mZjsKKwkJc3BsaXQubGVuID0geGxlbjsKKwkJc3BsaXQuYWRkciA9IHhhZGRyOworCQlzcGxpdC5weGRsaXN0ID0gTlVMTDsKKwkJaWYgKChyYyA9IHh0U3BsaXRVcCh0aWQsIGlwLCAmc3BsaXQsICZidHN0YWNrKSkpCisJCQlyZXR1cm4gcmM7CisKKwkJLyogZ2V0IGJhY2sgb2xkIHBhZ2UgKi8KKwkJWFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJLyoKKwkJICogaWYgbGVhZiByb290IGhhcyBiZWVuIHNwbGl0LCBvcmlnaW5hbCByb290IGhhcyBiZWVuCisJCSAqIGNvcGllZCB0byBuZXcgY2hpbGQgcGFnZSwgaS5lLiwgb3JpZ2luYWwgZW50cnkgbm93CisJCSAqIHJlc2lkZXMgb24gdGhlIG5ldyBjaGlsZCBwYWdlOworCQkgKi8KKwkJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfSU5URVJOQUwpIHsKKwkJCUFTU0VSVChwLT5oZWFkZXIubmV4dGluZGV4ID09CisJCQkgICAgICAgY3B1X3RvX2xlMTYoWFRFTlRSWVNUQVJUICsgMSkpOworCQkJeGFkID0gJnAtPnhhZFtYVEVOVFJZU1RBUlRdOworCQkJYm4gPSBhZGRyZXNzWEFEKHhhZCk7CisJCQlYVF9QVVRQQUdFKG1wKTsKKworCQkJLyogZ2V0IG5ldyBjaGlsZCBwYWdlICovCisJCQlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCisJCQlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisJCQlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCQkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFfHRsY2tHUk9XKTsKKwkJCQl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopICYgdGxjay0+bG9jazsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qIGlmIGluc2VydCBpbnRvIG1pZGRsZSwgc2hpZnQgcmlnaHQgcmVtYWluaW5nIGVudHJpZXMgKi8KKwkJaWYgKG5ld2luZGV4IDwgbmV4dGluZGV4KQorCQkJbWVtbW92ZSgmcC0+eGFkW25ld2luZGV4ICsgMV0sICZwLT54YWRbbmV3aW5kZXhdLAorCQkJCShuZXh0aW5kZXggLSBuZXdpbmRleCkgPDwgTDJYVFNMT1RTSVpFKTsKKworCQkvKiBpbnNlcnQgdGhlIGVudHJ5ICovCisJCXhhZCA9ICZwLT54YWRbbmV3aW5kZXhdOworCQlYVF9QVVRFTlRSWSh4YWQsIHhmbGFnLCB4b2ZmLCB4bGVuLCB4YWRkcik7CisKKwkJLyogYWR2YW5jZSBuZXh0IGF2YWlsYWJsZSBlbnRyeSBpbmRleC4gKi8KKwkJcC0+aGVhZGVyLm5leHRpbmRleCA9CisJCSAgICBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSArIDEpOworCX0KKworICAgICAgb3V0OgorCWlmICghdGVzdF9jZmxhZyhDT01NSVRfTm9saW5rLCBpcCkpIHsKKwkJeHRsY2stPmx3bS5vZmZzZXQgPSAoeHRsY2stPmx3bS5vZmZzZXQpID8KKwkJICAgIG1pbihpbmRleDAsIChpbnQpeHRsY2stPmx3bS5vZmZzZXQpIDogaW5kZXgwOworCQl4dGxjay0+bHdtLmxlbmd0aCA9IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0KKwkJICAgIHh0bGNrLT5sd20ub2Zmc2V0OworCX0KKworCS8qIHVucGluIHRoZSBsZWFmIHBhZ2UgKi8KKwlYVF9QVVRQQUdFKG1wKTsKKworCXJldHVybiByYzsKK30KKworCisvKgorICogICAgICB4dEFwcGVuZCgpCisgKgorICogZnVuY3Rpb246IGdyb3cgaW4gYXBwZW5kIG1vZGUgZnJvbSBjb250aWd1b3VzIHJlZ2lvbiBzcGVjaWZpZWQgOworICoKKyAqIHBhcmFtZXRlcjoKKyAqICAgICAgdGlkICAgICAgICAgICAgIC0gdHJhbnNhY3Rpb24gaWQ7CisgKiAgICAgIGlwICAgICAgICAgICAgICAtIGZpbGUgb2JqZWN0OworICogICAgICB4ZmxhZyAgICAgICAgICAgLSBleHRlbnQgZmxhZzoKKyAqICAgICAgeG9mZiAgICAgICAgICAgIC0gZXh0ZW50IG9mZnNldDsKKyAqICAgICAgbWF4YmxvY2tzICAgICAgIC0gbWF4IGV4dGVudCBsZW5ndGg7CisgKiAgICAgIHhsZW4gICAgICAgICAgICAtIGV4dGVudCBsZW5ndGggKGluL291dCk7CisgKiAgICAgIHhhZGRycCAgICAgICAgICAtIGV4dGVudCBhZGRyZXNzIHBvaW50ZXIgKGluL291dCk6CisgKiAgICAgIGZsYWcgICAgICAgICAgICAtCisgKgorICogcmV0dXJuOgorICovCitpbnQgeHRBcHBlbmQodGlkX3QgdGlkLAkJLyogdHJhbnNhY3Rpb24gaWQgKi8KKwkgICAgIHN0cnVjdCBpbm9kZSAqaXAsIGludCB4ZmxhZywgczY0IHhvZmYsIHMzMiBtYXhibG9ja3MsCQorCSAgICAgczMyICogeGxlbnAsCS8qIChpbi9vdXQpICovCisJICAgICBzNjQgKiB4YWRkcnAsCS8qIChpbi9vdXQpICovCisJICAgICBpbnQgZmxhZykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CS8qIG1ldGEtcGFnZSBidWZmZXIgKi8KKwl4dHBhZ2VfdCAqcDsJCS8qIGJhc2UgQistdHJlZSBpbmRleCBwYWdlICovCisJczY0IGJuLCB4YWRkcjsKKwlpbnQgaW5kZXgsIG5leHRpbmRleDsKKwlzdHJ1Y3QgYnRzdGFjayBidHN0YWNrOwkvKiB0cmF2ZXJzZSBzdGFjayAqLworCXN0cnVjdCB4dHNwbGl0IHNwbGl0OwkvKiBzcGxpdCBpbmZvcm1hdGlvbiAqLworCXhhZF90ICp4YWQ7CisJaW50IGNtcDsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJc3RydWN0IHh0bG9jayAqeHRsY2s7CisJaW50IG5zcGxpdCwgbmJsb2NrcywgeGxlbjsKKwlzdHJ1Y3QgcHhkbGlzdCBweGRsaXN0OworCXB4ZF90ICpweGQ7CisKKwl4YWRkciA9ICp4YWRkcnA7CisJeGxlbiA9ICp4bGVucDsKKwlqZnNfaW5mbygieHRBcHBlbmQ6IHhvZmY6MHglbHggbWF4YmxvY2tzOiVkIHhsZW46JWQgeGFkZHI6MHglbHgiLAorCQkgKHVsb25nKSB4b2ZmLCBtYXhibG9ja3MsIHhsZW4sICh1bG9uZykgeGFkZHIpOworCisJLyoKKwkgKiAgICAgIHNlYXJjaCBmb3IgdGhlIGVudHJ5IGxvY2F0aW9uIGF0IHdoaWNoIHRvIGluc2VydDoKKwkgKgorCSAqIHh0RmFzdFNlYXJjaCgpIGFuZCB4dFNlYXJjaCgpIGJvdGggcmV0dXJucyAobGVhZiBwYWdlCisJICogcGlubmVkLCBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQpLgorCSAqIG4uYi4geHRTZWFyY2goKSBtYXkgcmV0dXJuIGluZGV4IG9mIG1heGVudHJ5IG9mCisJICogdGhlIGZ1bGwgcGFnZS4KKwkgKi8KKwlpZiAoKHJjID0geHRTZWFyY2goaXAsIHhvZmYsICZjbXAsICZidHN0YWNrLCBYVF9JTlNFUlQpKSkKKwkJcmV0dXJuIHJjOworCisJLyogcmV0cmlldmUgc2VhcmNoIHJlc3VsdCAqLworCVhUX0dFVFNFQVJDSChpcCwgYnRzdGFjay50b3AsIGJuLCBtcCwgcCwgaW5kZXgpOworCisJaWYgKGNtcCA9PSAwKSB7CisJCXJjID0gLUVFWElTVDsKKwkJZ290byBvdXQ7CisJfQorLy9pbnNlcnQ6CisJLyoKKwkgKiAgICAgIGluc2VydCBlbnRyeSBmb3IgbmV3IGV4dGVudAorCSAqLworCXhmbGFnIHw9IFhBRF9ORVc7CisKKwkvKgorCSAqICAgICAgaWYgdGhlIGxlYWYgcGFnZSBpcyBmdWxsLCBzcGxpdCB0aGUgcGFnZSBhbmQKKwkgKiAgICAgIHByb3BhZ2F0ZSB1cCB0aGUgcm91dGVyIGVudHJ5IGZvciB0aGUgbmV3IHBhZ2UgZnJvbSBzcGxpdAorCSAqCisJICogVGhlIHh0U3BsaXRVcCgpIHdpbGwgaW5zZXJ0IHRoZSBlbnRyeSBhbmQgdW5waW4gdGhlIGxlYWYgcGFnZS4KKwkgKi8KKwluZXh0aW5kZXggPSBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KTsKKwlpZiAobmV4dGluZGV4IDwgbGUxNl90b19jcHUocC0+aGVhZGVyLm1heGVudHJ5KSkKKwkJZ290byBpbnNlcnRMZWFmOworCisJLyoKKwkgKiBhbGxvY2F0ZSBuZXcgaW5kZXggYmxvY2tzIHRvIGNvdmVyIGluZGV4IHBhZ2Ugc3BsaXQocykKKwkgKi8KKwluc3BsaXQgPSBidHN0YWNrLm5zcGxpdDsKKwlzcGxpdC5weGRsaXN0ID0gJnB4ZGxpc3Q7CisJcHhkbGlzdC5tYXhucHhkID0gcHhkbGlzdC5ucHhkID0gMDsKKwlweGQgPSAmcHhkbGlzdC5weGRbMF07CisJbmJsb2NrcyA9IEpGU19TQkkoaXAtPmlfc2IpLT5uYnBlcnBhZ2U7CisJZm9yICg7IG5zcGxpdCA+IDA7IG5zcGxpdC0tLCBweGQrKywgeGFkZHIgKz0gbmJsb2NrcywgbWF4YmxvY2tzIC09IG5ibG9ja3MpIHsJCisJCWlmICgocmMgPSBkYkFsbG9jQm90dG9tVXAoaXAsIHhhZGRyLCAoczY0KSBuYmxvY2tzKSkgPT0gMCkgeworCQkJUFhEYWRkcmVzcyhweGQsIHhhZGRyKTsKKwkJCVBYRGxlbmd0aChweGQsIG5ibG9ja3MpOworCisJCQlweGRsaXN0Lm1heG5weGQrKzsKKworCQkJY29udGludWU7CisJCX0KKworCQkvKiB1bmRvIGFsbG9jYXRpb24gKi8KKworCQlnb3RvIG91dDsKKwl9CisKKwl4bGVuID0gbWluKHhsZW4sIG1heGJsb2Nrcyk7CQorCisJLyoKKwkgKiBhbGxvY2F0ZSBkYXRhIGV4dGVudCByZXF1ZXN0ZWQKKwkgKi8KKwlpZiAoKHJjID0gZGJBbGxvY0JvdHRvbVVwKGlwLCB4YWRkciwgKHM2NCkgeGxlbikpKQorCQlnb3RvIG91dDsKKworCXNwbGl0Lm1wID0gbXA7CisJc3BsaXQuaW5kZXggPSBpbmRleDsKKwlzcGxpdC5mbGFnID0geGZsYWc7CisJc3BsaXQub2ZmID0geG9mZjsKKwlzcGxpdC5sZW4gPSB4bGVuOworCXNwbGl0LmFkZHIgPSB4YWRkcjsKKwlpZiAoKHJjID0geHRTcGxpdFVwKHRpZCwgaXAsICZzcGxpdCwgJmJ0c3RhY2spKSkgeworCQkvKiB1bmRvIGRhdGEgZXh0ZW50IGFsbG9jYXRpb24gKi8KKwkJZGJGcmVlKGlwLCAqeGFkZHJwLCAoczY0KSAqIHhsZW5wKTsKKworCQlyZXR1cm4gcmM7CisJfQorCisJKnhhZGRycCA9IHhhZGRyOworCSp4bGVucCA9IHhsZW47CisJcmV0dXJuIDA7CisKKwkvKgorCSAqICAgICAgaW5zZXJ0IHRoZSBuZXcgZW50cnkgaW50byB0aGUgbGVhZiBwYWdlCisJICovCisgICAgICBpbnNlcnRMZWFmOgorCS8qCisJICogYWxsb2NhdGUgZGF0YSBleHRlbnQgcmVxdWVzdGVkCisJICovCisJaWYgKChyYyA9IGRiQWxsb2NCb3R0b21VcChpcCwgeGFkZHIsIChzNjQpIHhsZW4pKSkKKwkJZ290byBvdXQ7CisKKwlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisJLyoKKwkgKiBhY3F1aXJlIGEgdHJhbnNhY3Rpb24gbG9jayBvbiB0aGUgbGVhZiBwYWdlOworCSAqCisJICogYWN0aW9uOiB4YWQgaW5zZXJ0aW9uL2V4dGVuc2lvbjsKKwkgKi8KKwl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIG1wLCB0bGNrWFRSRUUgfCB0bGNrR1JPVyk7CisJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisKKwkvKiBpbnNlcnQgdGhlIG5ldyBlbnRyeTogbWFyayB0aGUgZW50cnkgTkVXICovCisJeGFkID0gJnAtPnhhZFtpbmRleF07CisJWFRfUFVURU5UUlkoeGFkLCB4ZmxhZywgeG9mZiwgeGxlbiwgeGFkZHIpOworCisJLyogYWR2YW5jZSBuZXh0IGF2YWlsYWJsZSBlbnRyeSBpbmRleCAqLworCXAtPmhlYWRlci5uZXh0aW5kZXggPQorCSAgICBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSArIDEpOworCisJeHRsY2stPmx3bS5vZmZzZXQgPQorCSAgICAoeHRsY2stPmx3bS5vZmZzZXQpID8gbWluKGluZGV4LChpbnQpIHh0bGNrLT5sd20ub2Zmc2V0KSA6IGluZGV4OworCXh0bGNrLT5sd20ubGVuZ3RoID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLQorCSAgICB4dGxjay0+bHdtLm9mZnNldDsKKworCSp4YWRkcnAgPSB4YWRkcjsKKwkqeGxlbnAgPSB4bGVuOworCisgICAgICBvdXQ6CisJLyogdW5waW4gdGhlIGxlYWYgcGFnZSAqLworCVhUX1BVVFBBR0UobXApOworCisJcmV0dXJuIHJjOworfQorI2lmZGVmIF9TVElMTF9UT19QT1JUCisKKy8qIC0gVEJEIGZvciBkZWZyYWdtZW50YWlvbi9yZW9yZ2FuaXphdGlvbiAtCisgKgorICogICAgICB4dERlbGV0ZSgpCisgKgorICogZnVuY3Rpb246CisgKiAgICAgIGRlbGV0ZSB0aGUgZW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KKyAqCisgKiAgICAgIE4uQi46IHdob2xlIGV4dGVudCBvZiB0aGUgZW50cnkgaXMgYXNzdW1lZCB0byBiZSBkZWxldGVkLgorICoKKyAqIHBhcmFtZXRlcjoKKyAqCisgKiByZXR1cm46CisgKiAgICAgICBFTk9FTlQ6IGlmIHRoZSBlbnRyeSBpcyBub3QgZm91bmQuCisgKgorICogZXhjZXB0aW9uOgorICovCitpbnQgeHREZWxldGUodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgeG9mZiwgczMyIHhsZW4sIGludCBmbGFnKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsKKwlpbnQgY21wOworCXM2NCBibjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXh0cGFnZV90ICpwOworCWludCBpbmRleCwgbmV4dGluZGV4OworCXN0cnVjdCB0bG9jayAqdGxjazsKKwlzdHJ1Y3QgeHRsb2NrICp4dGxjazsKKworCS8qCisJICogZmluZCB0aGUgbWF0Y2hpbmcgZW50cnk7IHh0U2VhcmNoKCkgcGlucyB0aGUgcGFnZQorCSAqLworCWlmICgocmMgPSB4dFNlYXJjaChpcCwgeG9mZiwgJmNtcCwgJmJ0c3RhY2ssIDApKSkKKwkJcmV0dXJuIHJjOworCisJWFRfR0VUU0VBUkNIKGlwLCBidHN0YWNrLnRvcCwgYm4sIG1wLCBwLCBpbmRleCk7CisJaWYgKGNtcCkgeworCQkvKiB1bnBpbiB0aGUgbGVhZiBwYWdlICovCisJCVhUX1BVVFBBR0UobXApOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwkvKgorCSAqIGRlbGV0ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGVhZiBwYWdlCisJICovCisJbmV4dGluZGV4ID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCk7CisJcC0+aGVhZGVyLm5leHRpbmRleCA9CisJICAgIGNwdV90b19sZTE2KGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0gMSk7CisKKwkvKgorCSAqIGlmIHRoZSBsZWFmIHBhZ2UgYm9jb21lIGVtcHR5LCBmcmVlIHRoZSBwYWdlCisJICovCisJaWYgKHAtPmhlYWRlci5uZXh0aW5kZXggPT0gY3B1X3RvX2xlMTYoWFRFTlRSWVNUQVJUKSkKKwkJcmV0dXJuICh4dERlbGV0ZVVwKHRpZCwgaXAsIG1wLCBwLCAmYnRzdGFjaykpOworCisJQlRfTUFSS19ESVJUWShtcCwgaXApOworCS8qCisJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIGxlYWYgcGFnZTsKKwkgKgorCSAqIGFjdGlvbjp4YWQgZGVsZXRpb247CisJICovCisJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFKTsKKwl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopICYgdGxjay0+bG9jazsKKwl4dGxjay0+bHdtLm9mZnNldCA9CisJICAgICh4dGxjay0+bHdtLm9mZnNldCkgPyBtaW4oaW5kZXgsIHh0bGNrLT5sd20ub2Zmc2V0KSA6IGluZGV4OworCisJLyogaWYgZGVsZXRlIGZyb20gbWlkZGxlLCBzaGlmdCBsZWZ0L2NvbXBhY3QgdGhlIHJlbWFpbmluZyBlbnRyaWVzICovCisJaWYgKGluZGV4IDwgbmV4dGluZGV4IC0gMSkKKwkJbWVtbW92ZSgmcC0+eGFkW2luZGV4XSwgJnAtPnhhZFtpbmRleCArIDFdLAorCQkJKG5leHRpbmRleCAtIGluZGV4IC0gMSkgKiBzaXplb2YoeGFkX3QpKTsKKworCVhUX1BVVFBBR0UobXApOworCisJcmV0dXJuIDA7Cit9CisKKworLyogLSBUQkQgZm9yIGRlZnJhZ21lbnRhaW9uL3Jlb3JnYW5pemF0aW9uIC0KKyAqCisgKiAgICAgIHh0RGVsZXRlVXAoKQorICoKKyAqIGZ1bmN0aW9uOgorICogICAgICBmcmVlIGVtcHR5IHBhZ2VzIGFzIHByb3BhZ2F0aW5nIGRlbGV0aW9uIHVwIHRoZSB0cmVlCisgKgorICogcGFyYW1ldGVyOgorICoKKyAqIHJldHVybjoKKyAqLworc3RhdGljIGludAoreHREZWxldGVVcCh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsCisJICAgc3RydWN0IG1ldGFwYWdlICogZm1wLCB4dHBhZ2VfdCAqIGZwLCBzdHJ1Y3QgYnRzdGFjayAqIGJ0c3RhY2spCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXh0cGFnZV90ICpwOworCWludCBpbmRleCwgbmV4dGluZGV4OworCXM2NCB4YWRkcjsKKwlpbnQgeGxlbjsKKwlzdHJ1Y3QgYnRmcmFtZSAqcGFyZW50OworCXN0cnVjdCB0bG9jayAqdGxjazsKKwlzdHJ1Y3QgeHRsb2NrICp4dGxjazsKKworCS8qCisJICoga2VlcCByb290IGxlYWYgcGFnZSB3aGljaCBoYXMgYmVjb21lIGVtcHR5CisJICovCisJaWYgKGZwLT5oZWFkZXIuZmxhZyAmIEJUX1JPT1QpIHsKKwkJLyoga2VlcCB0aGUgcm9vdCBwYWdlICovCisJCWZwLT5oZWFkZXIuZmxhZyAmPSB+QlRfSU5URVJOQUw7CisJCWZwLT5oZWFkZXIuZmxhZyB8PSBCVF9MRUFGOworCQlmcC0+aGVhZGVyLm5leHRpbmRleCA9IGNwdV90b19sZTE2KFhURU5UUllTVEFSVCk7CisKKwkJLyogWFRfUFVUUEFHRShmbXApOyAqLworCisJCXJldHVybiAwOworCX0KKworCS8qCisJICogZnJlZSBub24tcm9vdCBsZWFmIHBhZ2UKKwkgKi8KKwlpZiAoKHJjID0geHRSZWxpbmsodGlkLCBpcCwgZnApKSkgeworCQlYVF9QVVRQQUdFKGZtcCk7CisJCXJldHVybiByYzsKKwl9CisKKwl4YWRkciA9IGFkZHJlc3NQWEQoJmZwLT5oZWFkZXIuc2VsZik7CisJeGxlbiA9IGxlbmd0aFBYRCgmZnAtPmhlYWRlci5zZWxmKTsKKwkvKiBmcmVlIHRoZSBwYWdlIGV4dGVudCAqLworCWRiRnJlZShpcCwgeGFkZHIsIChzNjQpIHhsZW4pOworCisJLyogZnJlZSB0aGUgYnVmZmVyIHBhZ2UgKi8KKwlkaXNjYXJkX21ldGFwYWdlKGZtcCk7CisKKwkvKgorCSAqIHByb3BhZ2F0ZSBwYWdlIGRlbGV0aW9uIHVwIHRoZSBpbmRleCB0cmVlCisJICoKKwkgKiBJZiB0aGUgZGVsZXRlIGZyb20gdGhlIHBhcmVudCBwYWdlIG1ha2VzIGl0IGVtcHR5LAorCSAqIGNvbnRpbnVlIGFsbCB0aGUgd2F5IHVwIHRoZSB0cmVlLgorCSAqIHN0b3AgaWYgdGhlIHJvb3QgcGFnZSBpcyByZWFjaGVkICh3aGljaCBpcyBuZXZlciBkZWxldGVkKSBvcgorCSAqIGlmIHRoZSBlbnRyeSBkZWxldGlvbiBkb2VzIG5vdCBlbXB0eSB0aGUgcGFnZS4KKwkgKi8KKwl3aGlsZSAoKHBhcmVudCA9IEJUX1BPUChidHN0YWNrKSkgIT0gTlVMTCkgeworCQkvKiBnZXQvcGluIHRoZSBwYXJlbnQgcGFnZSA8c3A+ICovCisJCVhUX0dFVFBBR0UoaXAsIHBhcmVudC0+Ym4sIG1wLCBQU0laRSwgcCwgcmMpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJaW5kZXggPSBwYXJlbnQtPmluZGV4OworCisJCS8qIGRlbGV0ZSB0aGUgZW50cnkgZm9yIHRoZSBmcmVlZCBjaGlsZCBwYWdlIGZyb20gcGFyZW50LgorCQkgKi8KKwkJbmV4dGluZGV4ID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCk7CisKKwkJLyoKKwkJICogdGhlIHBhcmVudCBoYXMgdGhlIHNpbmdsZSBlbnRyeSBiZWluZyBkZWxldGVkOgorCQkgKiBmcmVlIHRoZSBwYXJlbnQgcGFnZSB3aGljaCBoYXMgYmVjb21lIGVtcHR5LgorCQkgKi8KKwkJaWYgKG5leHRpbmRleCA9PSAxKSB7CisJCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSB7CisJCQkJLyoga2VlcCB0aGUgcm9vdCBwYWdlICovCisJCQkJcC0+aGVhZGVyLmZsYWcgJj0gfkJUX0lOVEVSTkFMOworCQkJCXAtPmhlYWRlci5mbGFnIHw9IEJUX0xFQUY7CisJCQkJcC0+aGVhZGVyLm5leHRpbmRleCA9CisJCQkJICAgIGNwdV90b19sZTE2KFhURU5UUllTVEFSVCk7CisKKwkJCQkvKiBYVF9QVVRQQUdFKG1wKTsgKi8KKworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQkvKiBmcmVlIHRoZSBwYXJlbnQgcGFnZSAqLworCQkJCWlmICgocmMgPSB4dFJlbGluayh0aWQsIGlwLCBwKSkpCisJCQkJCXJldHVybiByYzsKKworCQkJCXhhZGRyID0gYWRkcmVzc1BYRCgmcC0+aGVhZGVyLnNlbGYpOworCQkJCS8qIGZyZWUgdGhlIHBhZ2UgZXh0ZW50ICovCisJCQkJZGJGcmVlKGlwLCB4YWRkciwKKwkJCQkgICAgICAgKHM2NCkgSkZTX1NCSShpcC0+aV9zYiktPm5icGVycGFnZSk7CisKKwkJCQkvKiB1bnBpbi9mcmVlIHRoZSBidWZmZXIgcGFnZSAqLworCQkJCWRpc2NhcmRfbWV0YXBhZ2UobXApOworCisJCQkJLyogcHJvcGFnYXRlIHVwICovCisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJLyoKKwkJICogdGhlIHBhcmVudCBoYXMgb3RoZXIgZW50cmllcyByZW1haW5pbmc6CisJCSAqIGRlbGV0ZSB0aGUgcm91dGVyIGVudHJ5IGZyb20gdGhlIHBhcmVudCBwYWdlLgorCQkgKi8KKwkJZWxzZSB7CisJCQlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisJCQkvKgorCQkJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIGxlYWYgcGFnZTsKKwkJCSAqCisJCQkgKiBhY3Rpb246eGFkIGRlbGV0aW9uOworCQkJICovCisJCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIG1wLCB0bGNrWFRSRUUpOworCQkJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJCQl4dGxjay0+bHdtLm9mZnNldCA9CisJCQkgICAgKHh0bGNrLT5sd20ub2Zmc2V0KSA/IG1pbihpbmRleCwKKwkJCQkJCSAgICAgIHh0bGNrLT5sd20uCisJCQkJCQkgICAgICBvZmZzZXQpIDogaW5kZXg7CisKKwkJCS8qIGlmIGRlbGV0ZSBmcm9tIG1pZGRsZSwKKwkJCSAqIHNoaWZ0IGxlZnQvY29tcGFjdCB0aGUgcmVtYWluaW5nIGVudHJpZXMgaW4gdGhlIHBhZ2UKKwkJCSAqLworCQkJaWYgKGluZGV4IDwgbmV4dGluZGV4IC0gMSkKKwkJCQltZW1tb3ZlKCZwLT54YWRbaW5kZXhdLCAmcC0+eGFkW2luZGV4ICsgMV0sCisJCQkJCShuZXh0aW5kZXggLSBpbmRleCAtCisJCQkJCSAxKSA8PCBMMlhUU0xPVFNJWkUpOworCisJCQlwLT5oZWFkZXIubmV4dGluZGV4ID0KKwkJCSAgICBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSAtCisJCQkJCTEpOworCQkJamZzX2luZm8oInh0RGVsZXRlVXAoZW50cnkpOiAweCVseFslZF0iLAorCQkJCSAodWxvbmcpIHBhcmVudC0+Ym4sIGluZGV4KTsKKwkJfQorCisJCS8qIHVucGluIHRoZSBwYXJlbnQgcGFnZSAqLworCQlYVF9QVVRQQUdFKG1wKTsKKworCQkvKiBleGl0IHByb3BhZ2F0aW9uIHVwICovCisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBOQU1FOiAgICAgICAgeHRSZWxvY2F0ZSgpCisgKgorICogRlVOQ1RJT046ICAgIHJlbG9jYXRlIHh0cGFnZSBvciBkYXRhIGV4dGVudCBvZiByZWd1bGFyIGZpbGU7CisgKiAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBtYWlubHkgdXNlZCBieSBkZWZyYWdmcyB1dGlsaXR5LgorICoKKyAqIE5PVEU6ICAgICAgICBUaGlzIHJvdXRpbmUgZG9lcyBub3QgaGF2ZSB0aGUgbG9naWMgdG8gaGFuZGxlCisgKiAgICAgICAgICAgICAgdW5jb21taXR0ZWQgYWxsb2NhdGVkIGV4dGVudC4gVGhlIGNhbGxlciBzaG91bGQgY2FsbAorICogICAgICAgICAgICAgIHR4Q29tbWl0KCkgdG8gY29tbWl0IGFsbCB0aGUgYWxsb2NhdGlvbiBiZWZvcmUgY2FsbAorICogICAgICAgICAgICAgIHRoaXMgcm91dGluZS4KKyAqLworaW50Cit4dFJlbG9jYXRlKHRpZF90IHRpZCwgc3RydWN0IGlub2RlICogaXAsIHhhZF90ICogb3hhZCwJLyogb2xkIFhBRCAqLworCSAgIHM2NCBueGFkZHIsCQkvKiBuZXcgeGFkZHIgKi8KKwkgICBpbnQgeHR5cGUpCit7CQkJCS8qIGV4dGVudCB0eXBlOiBYVFBBR0Ugb3IgREFUQUVYVCAqLworCWludCByYyA9IDA7CisJc3RydWN0IHRibG9jayAqdGJsazsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJc3RydWN0IHh0bG9jayAqeHRsY2s7CisJc3RydWN0IG1ldGFwYWdlICptcCwgKnBtcCwgKmxtcCwgKnJtcDsJLyogbWV0YS1wYWdlIGJ1ZmZlciAqLworCXh0cGFnZV90ICpwLCAqcHAsICpycCwgKmxwOwkvKiBiYXNlIEIrLXRyZWUgaW5kZXggcGFnZSAqLworCXhhZF90ICp4YWQ7CisJcHhkX3QgKnB4ZDsKKwlzNjQgeG9mZiwgeHNpemU7CisJaW50IHhsZW47CisJczY0IG94YWRkciwgc3hhZGRyLCBkeGFkZHIsIG5leHRibiwgcHJldmJuOworCWNidWZfdCAqY3A7CisJczY0IG9mZnNldCwgbmJ5dGVzLCBuYnJkLCBwbm87CisJaW50IG5iLCBucGFnZXMsIG5ibGtzOworCXM2NCBibjsKKwlpbnQgY21wOworCWludCBpbmRleDsKKwlzdHJ1Y3QgcHhkX2xvY2sgKnB4ZGxvY2s7CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsJLyogdHJhdmVyc2Ugc3RhY2sgKi8KKworCXh0eXBlID0geHR5cGUgJiBFWFRFTlRfVFlQRTsKKworCXhvZmYgPSBvZmZzZXRYQUQob3hhZCk7CisJb3hhZGRyID0gYWRkcmVzc1hBRChveGFkKTsKKwl4bGVuID0gbGVuZ3RoWEFEKG94YWQpOworCisJLyogdmFsaWRhdGUgZXh0ZW50IG9mZnNldCAqLworCW9mZnNldCA9IHhvZmYgPDwgSkZTX1NCSShpcC0+aV9zYiktPmwyYnNpemU7CisJaWYgKG9mZnNldCA+PSBpcC0+aV9zaXplKQorCQlyZXR1cm4gLUVTVEFMRTsJLyogc3RhbGUgZXh0ZW50ICovCisKKwlqZnNfaW5mbygieHRSZWxvY2F0ZTogeHR5cGU6JWQgeG9mZjoweCVseCB4bGVuOjB4JXggeGFkZHI6MHglbHg6MHglbHgiLAorCQkgeHR5cGUsICh1bG9uZykgeG9mZiwgeGxlbiwgKHVsb25nKSBveGFkZHIsICh1bG9uZykgbnhhZGRyKTsKKworCS8qCisJICogICAgICAxLiBnZXQgYW5kIHZhbGlkYXRlIHRoZSBwYXJlbnQgeHRwYWdlL3hhZCBlbnRyeQorCSAqICAgICAgY292ZXJpbmcgdGhlIHNvdXJjZSBleHRlbnQgdG8gYmUgcmVsb2NhdGVkOworCSAqLworCWlmICh4dHlwZSA9PSBEQVRBRVhUKSB7CisJCS8qIHNlYXJjaCBpbiBsZWFmIGVudHJ5ICovCisJCXJjID0geHRTZWFyY2goaXAsIHhvZmYsICZjbXAsICZidHN0YWNrLCAwKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCS8qIHJldHJpZXZlIHNlYXJjaCByZXN1bHQgKi8KKwkJWFRfR0VUU0VBUkNIKGlwLCBidHN0YWNrLnRvcCwgYm4sIHBtcCwgcHAsIGluZGV4KTsKKworCQlpZiAoY21wKSB7CisJCQlYVF9QVVRQQUdFKHBtcCk7CisJCQlyZXR1cm4gLUVTVEFMRTsKKwkJfQorCisJCS8qIHZhbGlkYXRlIGZvciBleGFjdCBtYXRjaCB3aXRoIGEgc2luZ2xlIGVudHJ5ICovCisJCXhhZCA9ICZwcC0+eGFkW2luZGV4XTsKKwkJaWYgKGFkZHJlc3NYQUQoeGFkKSAhPSBveGFkZHIgfHwgbGVuZ3RoWEFEKHhhZCkgIT0geGxlbikgeworCQkJWFRfUFVUUEFHRShwbXApOworCQkJcmV0dXJuIC1FU1RBTEU7CisJCX0KKwl9IGVsc2UgewkJLyogKHh0eXBlID09IFhUUEFHRSkgKi8KKworCQkvKiBzZWFyY2ggaW4gaW50ZXJuYWwgZW50cnkgKi8KKwkJcmMgPSB4dFNlYXJjaE5vZGUoaXAsIG94YWQsICZjbXAsICZidHN0YWNrLCAwKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCS8qIHJldHJpZXZlIHNlYXJjaCByZXN1bHQgKi8KKwkJWFRfR0VUU0VBUkNIKGlwLCBidHN0YWNrLnRvcCwgYm4sIHBtcCwgcHAsIGluZGV4KTsKKworCQlpZiAoY21wKSB7CisJCQlYVF9QVVRQQUdFKHBtcCk7CisJCQlyZXR1cm4gLUVTVEFMRTsKKwkJfQorCisJCS8qIHh0U2VhcmNoTm9kZSgpIHZhbGlkYXRlZCBmb3IgZXhhY3QgbWF0Y2ggd2l0aCBhIHNpbmdsZSBlbnRyeQorCQkgKi8KKwkJeGFkID0gJnBwLT54YWRbaW5kZXhdOworCX0KKwlqZnNfaW5mbygieHRSZWxvY2F0ZTogcGFyZW50IHhhZCBlbnRyeSB2YWxpZGF0ZWQuIik7CisKKwkvKgorCSAqICAgICAgMi4gcmVsb2NhdGUgdGhlIGV4dGVudAorCSAqLworCWlmICh4dHlwZSA9PSBEQVRBRVhUKSB7CisJCS8qIGlmIHRoZSBleHRlbnQgaXMgYWxsb2NhdGVkLWJ1dC1ub3QtcmVjb3JkZWQKKwkJICogdGhlcmUgaXMgbm8gcmVhbCBkYXRhIHRvIGJlIG1vdmVkIGluIHRoaXMgZXh0ZW50LAorCQkgKi8KKwkJaWYgKHhhZC0+ZmxhZyAmIFhBRF9OT1RSRUNPUkRFRCkKKwkJCWdvdG8gb3V0OworCQllbHNlCisJCQkvKiByZWxlYXNlIHh0cGFnZSBmb3IgY21SZWFkKCkveHRMb29rdXAoKSAqLworCQkJWFRfUFVUUEFHRShwbXApOworCisJCS8qCisJCSAqICAgICAgY21SZWxvY2F0ZSgpCisJCSAqCisJCSAqIGNvcHkgdGFyZ2V0IGRhdGEgcGFnZXMgdG8gYmUgcmVsb2NhdGVkOworCQkgKgorCQkgKiBkYXRhIGV4dGVudCBtdXN0IHN0YXJ0IGF0IHBhZ2UgYm91bmRhcnkgYW5kCisJCSAqIG11bHRpcGxlIG9mIHBhZ2Ugc2l6ZSAoZXhjZXB0IHRoZSBsYXN0IGRhdGEgZXh0ZW50KTsKKwkJICogcmVhZCBpbiBlYWNoIHBhZ2Ugb2YgdGhlIHNvdXJjZSBkYXRhIGV4dGVudCBpbnRvIGNidWYsCisJCSAqIHVwZGF0ZSB0aGUgY2J1ZiBleHRlbnQgZGVzY3JpcHRvciBvZiB0aGUgcGFnZSB0byBiZQorCQkgKiBob21ld2FyZCBib3VuZCB0byBuZXcgZHN0IGRhdGEgZXh0ZW50CisJCSAqIGNvcHkgdGhlIGRhdGEgZnJvbSB0aGUgb2xkIGV4dGVudCB0byBuZXcgZXh0ZW50LgorCQkgKiBjb3B5IGlzIGVzc2VudGlhbCBmb3IgY29tcHJlc3NlZCBmaWxlcyB0byBhdm9pZCBwcm9ibGVtcworCQkgKiB0aGF0IGNhbiBhcmlzZSBpZiB0aGVyZSB3YXMgYSBjaGFuZ2UgaW4gY29tcHJlc3Npb24KKwkJICogYWxnb3JpdGhtcy4KKwkJICogaXQgaXMgYSBnb29kIHN0cmF0ZWd5IGJlY2F1c2UgaXQgbWF5IGRpc3J1cHQgY2FjaGUKKwkJICogcG9saWN5IHRvIGtlZXAgdGhlIHBhZ2VzIGluIG1lbW9yeSBhZnRlcndhcmRzLgorCQkgKi8KKwkJb2Zmc2V0ID0geG9mZiA8PCBKRlNfU0JJKGlwLT5pX3NiKS0+bDJic2l6ZTsKKwkJYXNzZXJ0KChvZmZzZXQgJiBDTV9PRkZTRVQpID09IDApOworCQluYnl0ZXMgPSB4bGVuIDw8IEpGU19TQkkoaXAtPmlfc2IpLT5sMmJzaXplOworCQlwbm8gPSBvZmZzZXQgPj4gQ01fTDJCU0laRTsKKwkJbnBhZ2VzID0gKG5ieXRlcyArIChDTV9CU0laRSAtIDEpKSA+PiBDTV9MMkJTSVpFOworLyoKKyAgICAgICAgICAgICAgICBucGFnZXMgPSAoKG9mZnNldCArIG5ieXRlcyAtIDEpID4+IENNX0wyQlNJWkUpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAob2Zmc2V0ID4+IENNX0wyQlNJWkUpICsgMTsKKyovCisJCXN4YWRkciA9IG94YWRkcjsKKwkJZHhhZGRyID0gbnhhZGRyOworCisJCS8qIHByb2Nlc3MgdGhlIHJlcXVlc3Qgb25lIGNhY2hlIGJ1ZmZlciBhdCBhIHRpbWUgKi8KKwkJZm9yIChuYnJkID0gMDsgbmJyZCA8IG5ieXRlczsgbmJyZCArPSBuYiwKKwkJICAgICBvZmZzZXQgKz0gbmIsIHBubysrLCBucGFnZXMtLSkgeworCQkJLyogY29tcHV0ZSBwYWdlIHNpemUgKi8KKwkJCW5iID0gbWluKG5ieXRlcyAtIG5icmQsIENNX0JTSVpFKTsKKworCQkJLyogZ2V0IHRoZSBjYWNoZSBidWZmZXIgb2YgdGhlIHBhZ2UgKi8KKwkJCWlmIChyYyA9IGNtUmVhZChpcCwgb2Zmc2V0LCBucGFnZXMsICZjcCkpCisJCQkJYnJlYWs7CisKKwkJCWFzc2VydChhZGRyZXNzUFhEKCZjcC0+Y21fcHhkKSA9PSBzeGFkZHIpOworCQkJYXNzZXJ0KCFjcC0+Y21fbW9kaWZpZWQpOworCisJCQkvKiBiaW5kIGJ1ZmZlciB3aXRoIHRoZSBuZXcgZXh0ZW50IGFkZHJlc3MgKi8KKwkJCW5ibGtzID0gbmIgPj4gSkZTX0lQKGlwLT5pX3NiKS0+bDJic2l6ZTsKKwkJCWNtU2V0WEQoaXAsIGNwLCBwbm8sIGR4YWRkciwgbmJsa3MpOworCisJCQkvKiByZWxlYXNlIHRoZSBjYnVmLCBtYXJrIGl0IGFzIG1vZGlmaWVkICovCisJCQljbVB1dChjcCwgVFJVRSk7CisKKwkJCWR4YWRkciArPSBuYmxrczsKKwkJCXN4YWRkciArPSBuYmxrczsKKwkJfQorCisJCS8qIGdldCBiYWNrIHBhcmVudCBwYWdlICovCisJCWlmICgocmMgPSB4dFNlYXJjaChpcCwgeG9mZiwgJmNtcCwgJmJ0c3RhY2ssIDApKSkKKwkJCXJldHVybiByYzsKKworCQlYVF9HRVRTRUFSQ0goaXAsIGJ0c3RhY2sudG9wLCBibiwgcG1wLCBwcCwgaW5kZXgpOworCQlqZnNfaW5mbygieHRSZWxvY2F0ZTogdGFyZ2V0IGRhdGEgZXh0ZW50IHJlbG9jYXRlZC4iKTsKKwl9IGVsc2UgewkJLyogKHh0eXBlICA9PSBYVFBBR0UpICovCisKKwkJLyoKKwkJICogcmVhZCBpbiB0aGUgdGFyZ2V0IHh0cGFnZSBmcm9tIHRoZSBzb3VyY2UgZXh0ZW50OworCQkgKi8KKwkJWFRfR0VUUEFHRShpcCwgb3hhZGRyLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJaWYgKHJjKSB7CisJCQlYVF9QVVRQQUdFKHBtcCk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQkvKgorCQkgKiByZWFkIGluIHNpYmxpbmcgcGFnZXMgaWYgYW55IHRvIHVwZGF0ZSBzaWJsaW5nIHBvaW50ZXJzOworCQkgKi8KKwkJcm1wID0gTlVMTDsKKwkJaWYgKHAtPmhlYWRlci5uZXh0KSB7CisJCQluZXh0Ym4gPSBsZTY0X3RvX2NwdShwLT5oZWFkZXIubmV4dCk7CisJCQlYVF9HRVRQQUdFKGlwLCBuZXh0Ym4sIHJtcCwgUFNJWkUsIHJwLCByYyk7CisJCQlpZiAocmMpIHsKKwkJCQlYVF9QVVRQQUdFKHBtcCk7CisJCQkJWFRfUFVUUEFHRShtcCk7CisJCQkJcmV0dXJuIChyYyk7CisJCQl9CisJCX0KKworCQlsbXAgPSBOVUxMOworCQlpZiAocC0+aGVhZGVyLnByZXYpIHsKKwkJCXByZXZibiA9IGxlNjRfdG9fY3B1KHAtPmhlYWRlci5wcmV2KTsKKwkJCVhUX0dFVFBBR0UoaXAsIHByZXZibiwgbG1wLCBQU0laRSwgbHAsIHJjKTsKKwkJCWlmIChyYykgeworCQkJCVhUX1BVVFBBR0UocG1wKTsKKwkJCQlYVF9QVVRQQUdFKG1wKTsKKwkJCQlpZiAocm1wKQorCQkJCQlYVF9QVVRQQUdFKHJtcCk7CisJCQkJcmV0dXJuIChyYyk7CisJCQl9CisJCX0KKworCQkvKiBhdCB0aGlzIHBvaW50LCBhbGwgeHRwYWdlcyB0byBiZSB1cGRhdGVkIGFyZSBpbiBtZW1vcnkgKi8KKworCQkvKgorCQkgKiB1cGRhdGUgc2libGluZyBwb2ludGVycyBvZiBzaWJsaW5nIHh0cGFnZXMgaWYgYW55OworCQkgKi8KKwkJaWYgKGxtcCkgeworCQkJQlRfTUFSS19ESVJUWShsbXAsIGlwKTsKKwkJCXRsY2sgPQorCQkJICAgIHR4TG9jayh0aWQsIGlwLCBsbXAsIHRsY2tYVFJFRSB8IHRsY2tSRUxJTkspOworCQkJbHAtPmhlYWRlci5uZXh0ID0gY3B1X3RvX2xlNjQobnhhZGRyKTsKKwkJCVhUX1BVVFBBR0UobG1wKTsKKwkJfQorCisJCWlmIChybXApIHsKKwkJCUJUX01BUktfRElSVFkocm1wLCBpcCk7CisJCQl0bGNrID0KKwkJCSAgICB0eExvY2sodGlkLCBpcCwgcm1wLCB0bGNrWFRSRUUgfCB0bGNrUkVMSU5LKTsKKwkJCXJwLT5oZWFkZXIucHJldiA9IGNwdV90b19sZTY0KG54YWRkcik7CisJCQlYVF9QVVRQQUdFKHJtcCk7CisJCX0KKworCQkvKgorCQkgKiB1cGRhdGUgdGhlIHRhcmdldCB4dHBhZ2UgdG8gYmUgcmVsb2NhdGVkCisJCSAqCisJCSAqIHVwZGF0ZSB0aGUgc2VsZiBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgcGFnZQorCQkgKiBhbmQgd3JpdGUgdG8gZGVzdGluYXRpb24gZXh0ZW50OworCQkgKiByZWRvIGltYWdlIGNvdmVycyB0aGUgd2hvbGUgeHRwYWdlIHNpbmNlIGl0IGlzIG5ldyBwYWdlCisJCSAqIHRvIHRoZSBkZXN0aW5hdGlvbiBleHRlbnQ7CisJCSAqIHVwZGF0ZSBvZiBibWFwIGZvciB0aGUgZnJlZSBvZiBzb3VyY2UgZXh0ZW50CisJCSAqIG9mIHRoZSB0YXJnZXQgeHRwYWdlIGl0c2VsZjoKKwkJICogdXBkYXRlIG9mIGJtYXAgZm9yIHRoZSBhbGxvY2F0aW9uIG9mIGRlc3RpbmF0aW9uIGV4dGVudAorCQkgKiBvZiB0aGUgdGFyZ2V0IHh0cGFnZSBpdHNlbGY6CisJCSAqIHVwZGF0ZSBvZiBibWFwIGZvciB0aGUgZXh0ZW50cyBjb3ZlcmVkIGJ5IHhhZCBlbnRyaWVzIGluCisJCSAqIHRoZSB0YXJnZXQgeHRwYWdlIGlzIG5vdCBuZWNlc3Nhcnkgc2luY2UgdGhleSBhcmUgbm90CisJCSAqIHVwZGF0ZWQ7CisJCSAqIGlmIG5vdCBjb21taXR0ZWQgYmVmb3JlIHRoaXMgcmVsb2NhdGlvbiwKKwkJICogdGFyZ2V0IHBhZ2UgbWF5IGNvbnRhaW4gWEFEX05FVyBlbnRyaWVzIHdoaWNoIG11c3QKKwkJICogYmUgc2Nhbm5lZCBmb3IgYm1hcCB1cGRhdGUgKGxvZ3JlZG8oKSBhbHdheXMKKwkJICogc2NhbiB4dHBhZ2UgUkVET1BBR0UgaW1hZ2UgZm9yIGJtYXAgdXBkYXRlKTsKKwkJICogaWYgY29tbWl0dGVkIGJlZm9yZSB0aGlzIHJlbG9jYXRpb24gKHRsY2tSRUxPQ0FURSksCisJCSAqIHNjYW4gbWF5IGJlIHNraXBwZWQgYnkgY29tbWl0KCkgYW5kIGxvZ3JlZG8oKTsKKwkJICovCisJCUJUX01BUktfRElSVFkobXAsIGlwKTsKKwkJLyogdGxja05FVyBpbml0ICB4dGxjay0+bHdtLm9mZnNldCA9IFhURU5UUllTVEFSVDsgKi8KKwkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFIHwgdGxja05FVyk7CisJCXh0bGNrID0gKHN0cnVjdCB4dGxvY2sgKikgJiB0bGNrLT5sb2NrOworCisJCS8qIHVwZGF0ZSB0aGUgc2VsZiBhZGRyZXNzIGluIHRoZSB4dHBhZ2UgaGVhZGVyICovCisJCXB4ZCA9ICZwLT5oZWFkZXIuc2VsZjsKKwkJUFhEYWRkcmVzcyhweGQsIG54YWRkcik7CisKKwkJLyogbGluZWxvY2sgZm9yIHRoZSBhZnRlciBpbWFnZSBvZiB0aGUgd2hvbGUgcGFnZSAqLworCQl4dGxjay0+bHdtLmxlbmd0aCA9CisJCSAgICBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSAtIHh0bGNrLT5sd20ub2Zmc2V0OworCisJCS8qIHVwZGF0ZSB0aGUgYnVmZmVyIGV4dGVudCBkZXNjcmlwdG9yIG9mIHRhcmdldCB4dHBhZ2UgKi8KKwkJeHNpemUgPSB4bGVuIDw8IEpGU19TQkkoaXAtPmlfc2IpLT5sMmJzaXplOworCQlibVNldFhEKG1wLCBueGFkZHIsIHhzaXplKTsKKworCQkvKiB1bnBpbiB0aGUgdGFyZ2V0IHBhZ2UgdG8gbmV3IGhvbWV3YXJkIGJvdW5kICovCisJCVhUX1BVVFBBR0UobXApOworCQlqZnNfaW5mbygieHRSZWxvY2F0ZTogdGFyZ2V0IHh0cGFnZSByZWxvY2F0ZWQuIik7CisJfQorCisJLyoKKwkgKiAgICAgIDMuIGFjcXVpcmUgbWFwbG9jayBmb3IgdGhlIHNvdXJjZSBleHRlbnQgdG8gYmUgZnJlZWQ7CisJICoKKwkgKiBhY3F1aXJlIGEgbWFwbG9jayBzYXZpbmcgdGhlIHNyYyByZWxvY2F0ZWQgZXh0ZW50IGFkZHJlc3M7CisJICogdG8gZnJlZSBvZiB0aGUgZXh0ZW50IGF0IGNvbW1pdCB0aW1lOworCSAqLworICAgICAgb3V0OgorCS8qIGlmIERBVEFFWFQgcmVsb2NhdGlvbiwgd3JpdGUgYSBMT0dfVVBEQVRFTUFQIHJlY29yZCBmb3IKKwkgKiBmcmVlIFBYRCBvZiB0aGUgc291cmNlIGRhdGEgZXh0ZW50IChsb2dyZWRvKCkgd2lsbCB1cGRhdGUKKwkgKiBibWFwIGZvciBmcmVlIG9mIHNvdXJjZSBkYXRhIGV4dGVudCksIGFuZCB1cGRhdGUgYm1hcCBmb3IKKwkgKiBmcmVlIG9mIHRoZSBzb3VyY2UgZGF0YSBleHRlbnQ7CisJICovCisJaWYgKHh0eXBlID09IERBVEFFWFQpCisJCXRsY2sgPSB0eE1hcGxvY2sodGlkLCBpcCwgdGxja01BUCk7CisJLyogaWYgWFRQQUdFIHJlbG9jYXRpb24sIHdyaXRlIGEgTE9HX05PUkVET1BBR0UgcmVjb3JkCisJICogZm9yIHRoZSBzb3VyY2UgeHRwYWdlIChsb2dyZWRvKCkgd2lsbCBpbml0IE5vUmVkb1BhZ2UKKwkgKiBmaWx0ZXIgYW5kIHdpbGwgYWxzbyB1cGRhdGUgYm1hcCBmb3IgZnJlZSBvZiB0aGUgc291cmNlCisJICogeHRwYWdlKSwgYW5kIHVwZGF0ZSBibWFwIGZvciBmcmVlIG9mIHRoZSBzb3VyY2UgeHRwYWdlOworCSAqIE4uQi4gV2UgdXNlIHRsY2tNQVAgaW5zdGVhZCBvZiB0bGtjWFRSRUUgYmVjYXVzZSB0aGVyZQorCSAqICAgICAgaXMgbm8gYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxvY2sgc2luY2UgdGhlIGJ1ZmZlcgorCSAqICAgICAgaGFzIGJlZW4gcmVkaXJlY3RlZCB0byB0aGUgdGFyZ2V0IGxvY2F0aW9uLgorCSAqLworCWVsc2UJCQkvKiAoeHR5cGUgID09IFhUUEFHRSkgKi8KKwkJdGxjayA9IHR4TWFwbG9jayh0aWQsIGlwLCB0bGNrTUFQIHwgdGxja1JFTE9DQVRFKTsKKworCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopICYgdGxjay0+bG9jazsKKwlweGRsb2NrLT5mbGFnID0gbWxja0ZSRUVQWEQ7CisJUFhEYWRkcmVzcygmcHhkbG9jay0+cHhkLCBveGFkZHIpOworCVBYRGxlbmd0aCgmcHhkbG9jay0+cHhkLCB4bGVuKTsKKwlweGRsb2NrLT5pbmRleCA9IDE7CisKKwkvKgorCSAqICAgICAgNC4gdXBkYXRlIHRoZSBwYXJlbnQgeGFkIGVudHJ5IGZvciByZWxvY2F0aW9uOworCSAqCisJICogYWNxdWlyZSB0bGNrIGZvciB0aGUgcGFyZW50IGVudHJ5IHdpdGggWEFEX05FVyBhcyBlbnRyeQorCSAqIHVwZGF0ZSB3aGljaCB3aWxsIHdyaXRlIExPR19SRURPUEFHRSBhbmQgdXBkYXRlIGJtYXAgZm9yCisJICogYWxsb2NhdGlvbiBvZiBYQURfTkVXIGRlc3RpbmF0aW9uIGV4dGVudDsKKwkgKi8KKwlqZnNfaW5mbygieHRSZWxvY2F0ZTogdXBkYXRlIHBhcmVudCB4YWQgZW50cnkuIik7CisJQlRfTUFSS19ESVJUWShwbXAsIGlwKTsKKwl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIHBtcCwgdGxja1hUUkVFIHwgdGxja0dST1cpOworCXh0bGNrID0gKHN0cnVjdCB4dGxvY2sgKikgJiB0bGNrLT5sb2NrOworCisJLyogdXBkYXRlIHRoZSBYQUQgd2l0aCB0aGUgbmV3IGRlc3RpbmF0aW9uIGV4dGVudDsgKi8KKwl4YWQgPSAmcHAtPnhhZFtpbmRleF07CisJeGFkLT5mbGFnIHw9IFhBRF9ORVc7CisJWEFEYWRkcmVzcyh4YWQsIG54YWRkcik7CisKKwl4dGxjay0+bHdtLm9mZnNldCA9IG1pbihpbmRleCwgeHRsY2stPmx3bS5vZmZzZXQpOworCXh0bGNrLT5sd20ubGVuZ3RoID0gbGUxNl90b19jcHUocHAtPmhlYWRlci5uZXh0aW5kZXgpIC0KKwkgICAgeHRsY2stPmx3bS5vZmZzZXQ7CisKKwkvKiB1bnBpbiB0aGUgcGFyZW50IHh0cGFnZSAqLworCVhUX1BVVFBBR0UocG1wKTsKKworCXJldHVybiByYzsKK30KKworCisvKgorICogICAgICB4dFNlYXJjaE5vZGUoKQorICoKKyAqIGZ1bmN0aW9uOiAgICBzZWFyY2ggZm9yIHRoZSBpbnRlcm5hbCB4YWQgZW50cnkgY292ZXJpbmcgc3BlY2lmaWVkIGV4dGVudC4KKyAqICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG1haW5seSB1c2VkIGJ5IGRlZnJhZ2ZzIHV0aWxpdHkuCisgKgorICogcGFyYW1ldGVyczoKKyAqICAgICAgaXAgICAgICAtIGZpbGUgb2JqZWN0OworICogICAgICB4YWQgICAgIC0gZXh0ZW50IHRvIGZpbmQ7CisgKiAgICAgIGNtcHAgICAgLSBjb21wYXJpc29uIHJlc3VsdDoKKyAqICAgICAgYnRzdGFjayAtIHRyYXZlcnNlIHN0YWNrOworICogICAgICBmbGFnICAgIC0gc2VhcmNoIHByb2Nlc3MgZmxhZzsKKyAqCisgKiByZXR1cm5zOgorICogICAgICBidHN0YWNrIGNvbnRhaW5zIChibiwgaW5kZXgpIG9mIHNlYXJjaCBwYXRoIHRyYXZlcnNlZCB0byB0aGUgZW50cnkuCisgKiAgICAgICpjbXBwIGlzIHNldCB0byByZXN1bHQgb2YgY29tcGFyaXNvbiB3aXRoIHRoZSBlbnRyeSByZXR1cm5lZC4KKyAqICAgICAgdGhlIHBhZ2UgY29udGFpbmluZyB0aGUgZW50cnkgaXMgcGlubmVkIGF0IGV4aXQuCisgKi8KK3N0YXRpYyBpbnQgeHRTZWFyY2hOb2RlKHN0cnVjdCBpbm9kZSAqaXAsIHhhZF90ICogeGFkLAkvKiByZXF1aXJlZCBYQUQgZW50cnkgKi8KKwkJCWludCAqY21wcCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrLCBpbnQgZmxhZykKK3sKKwlpbnQgcmMgPSAwOworCXM2NCB4b2ZmLCB4YWRkcjsKKwlpbnQgeGxlbjsKKwlpbnQgY21wID0gMTsJCS8qIGluaXQgZm9yIGVtcHR5IHBhZ2UgKi8KKwlzNjQgYm47CQkJLyogYmxvY2sgbnVtYmVyICovCisJc3RydWN0IG1ldGFwYWdlICptcDsJLyogbWV0YS1wYWdlIGJ1ZmZlciAqLworCXh0cGFnZV90ICpwOwkJLyogcGFnZSAqLworCWludCBiYXNlLCBpbmRleCwgbGltOworCXN0cnVjdCBidGZyYW1lICpidHNwOworCXM2NCB0NjQ7CisKKwlCVF9DTFIoYnRzdGFjayk7CisKKwl4b2ZmID0gb2Zmc2V0WEFEKHhhZCk7CisJeGxlbiA9IGxlbmd0aFhBRCh4YWQpOworCXhhZGRyID0gYWRkcmVzc1hBRCh4YWQpOworCisJLyoKKwkgKiAgICAgIHNlYXJjaCBkb3duIHRyZWUgZnJvbSByb290OgorCSAqCisJICogYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgZW50cmllcyBvZiA8S2ksIFBpPiBhbmQgPEtqLCBQaj4gb2YKKwkgKiBpbnRlcm5hbCBwYWdlLCBjaGlsZCBwYWdlIFBpIGNvbnRhaW5zIGVudHJ5IHdpdGggaywgS2kgPD0gSyA8IEtqLgorCSAqCisJICogaWYgZW50cnkgd2l0aCBzZWFyY2gga2V5IEsgaXMgbm90IGZvdW5kCisJICogaW50ZXJuYWwgcGFnZSBzZWFyY2ggZmluZCB0aGUgZW50cnkgd2l0aCBsYXJnZXN0IGtleSBLaQorCSAqIGxlc3MgdGhhbiBLIHdoaWNoIHBvaW50IHRvIHRoZSBjaGlsZCBwYWdlIHRvIHNlYXJjaDsKKwkgKiBsZWFmIHBhZ2Ugc2VhcmNoIGZpbmQgdGhlIGVudHJ5IHdpdGggc21hbGxlc3Qga2V5IEtqCisJICogZ3JlYXRlciB0aGFuIEsgc28gdGhhdCB0aGUgcmV0dXJuZWQgaW5kZXggaXMgdGhlIHBvc2l0aW9uIG9mCisJICogdGhlIGVudHJ5IHRvIGJlIHNoaWZ0ZWQgcmlnaHQgZm9yIGluc2VydGlvbiBvZiBuZXcgZW50cnkuCisJICogZm9yIGVtcHR5IHRyZWUsIHNlYXJjaCBrZXkgaXMgZ3JlYXRlciB0aGFuIGFueSBrZXkgb2YgdGhlIHRyZWUuCisJICoKKwkgKiBieSBjb252ZW50aW9uLCByb290IGJuID0gMC4KKwkgKi8KKwlmb3IgKGJuID0gMDs7KSB7CisJCS8qIGdldC9waW4gdGhlIHBhZ2UgdG8gc2VhcmNoICovCisJCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSB7CisJCQlYVF9QVVRQQUdFKG1wKTsKKwkJCXJldHVybiAtRVNUQUxFOworCQl9CisKKwkJbGltID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLSBYVEVOVFJZU1RBUlQ7CisKKwkJLyoKKwkJICogYmluYXJ5IHNlYXJjaCB3aXRoIHNlYXJjaCBrZXkgSyBvbiB0aGUgY3VycmVudCBwYWdlCisJCSAqLworCQlmb3IgKGJhc2UgPSBYVEVOVFJZU1RBUlQ7IGxpbTsgbGltID4+PSAxKSB7CisJCQlpbmRleCA9IGJhc2UgKyAobGltID4+IDEpOworCisJCQlYVF9DTVAoY21wLCB4b2ZmLCAmcC0+eGFkW2luZGV4XSwgdDY0KTsKKwkJCWlmIChjbXAgPT0gMCkgeworCQkJCS8qCisJCQkJICogICAgICBzZWFyY2ggaGl0CisJCQkJICoKKwkJCQkgKiB2ZXJpZnkgZm9yIGV4YWN0IG1hdGNoOworCQkJCSAqLworCQkJCWlmICh4YWRkciA9PSBhZGRyZXNzWEFEKCZwLT54YWRbaW5kZXhdKSAmJgorCQkJCSAgICB4b2ZmID09IG9mZnNldFhBRCgmcC0+eGFkW2luZGV4XSkpIHsKKwkJCQkJKmNtcHAgPSBjbXA7CisKKwkJCQkJLyogc2F2ZSBzZWFyY2ggcmVzdWx0ICovCisJCQkJCWJ0c3AgPSBidHN0YWNrLT50b3A7CisJCQkJCWJ0c3AtPmJuID0gYm47CisJCQkJCWJ0c3AtPmluZGV4ID0gaW5kZXg7CisJCQkJCWJ0c3AtPm1wID0gbXA7CisKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCisJCQkJLyogZGVzY2VuZC9zZWFyY2ggaXRzIGNoaWxkIHBhZ2UgKi8KKwkJCQlnb3RvIG5leHQ7CisJCQl9CisKKwkJCWlmIChjbXAgPiAwKSB7CisJCQkJYmFzZSA9IGluZGV4ICsgMTsKKwkJCQktLWxpbTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqICAgICAgc2VhcmNoIG1pc3MgLSBub24tbGVhZiBwYWdlOgorCQkgKgorCQkgKiBiYXNlIGlzIHRoZSBzbWFsbGVzdCBpbmRleCB3aXRoIGtleSAoS2opIGdyZWF0ZXIgdGhhbgorCQkgKiBzZWFyY2gga2V5IChLKSBhbmQgbWF5IGJlIHplcm8gb3IgbWF4ZW50cnkgaW5kZXguCisJCSAqIGlmIGJhc2UgaXMgbm9uLXplcm8sIGRlY3JlbWVudCBiYXNlIGJ5IG9uZSB0byBnZXQgdGhlIHBhcmVudAorCQkgKiBlbnRyeSBvZiB0aGUgY2hpbGQgcGFnZSB0byBzZWFyY2guCisJCSAqLworCQlpbmRleCA9IGJhc2UgPyBiYXNlIC0gMSA6IGJhc2U7CisKKwkJLyoKKwkJICogZ28gZG93biB0byBjaGlsZCBwYWdlCisJCSAqLworCSAgICAgIG5leHQ6CisJCS8qIGdldCB0aGUgY2hpbGQgcGFnZSBibG9jayBudW1iZXIgKi8KKwkJYm4gPSBhZGRyZXNzWEFEKCZwLT54YWRbaW5kZXhdKTsKKworCQkvKiB1bnBpbiB0aGUgcGFyZW50IHBhZ2UgKi8KKwkJWFRfUFVUUEFHRShtcCk7CisJfQorfQorCisKKy8qCisgKiAgICAgIHh0UmVsaW5rKCkKKyAqCisgKiBmdW5jdGlvbjoKKyAqICAgICAgbGluayBhcm91bmQgYSBmcmVlZCBwYWdlLgorICoKKyAqIFBhcmFtZXRlcjoKKyAqICAgICAgaW50ICAgICAgICAgICB0aWQsCisgKiAgICAgIHN0cnVjdCBpbm9kZSAgICAqaXAsCisgKiAgICAgIHh0cGFnZV90ICAgICAgICAqcCkKKyAqCisgKiByZXR1cm5zOgorICovCitzdGF0aWMgaW50IHh0UmVsaW5rKHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwgeHRwYWdlX3QgKiBwKQoreworCWludCByYyA9IDA7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwlzNjQgbmV4dGJuLCBwcmV2Ym47CisJc3RydWN0IHRsb2NrICp0bGNrOworCisJbmV4dGJuID0gbGU2NF90b19jcHUocC0+aGVhZGVyLm5leHQpOworCXByZXZibiA9IGxlNjRfdG9fY3B1KHAtPmhlYWRlci5wcmV2KTsKKworCS8qIHVwZGF0ZSBwcmV2IHBvaW50ZXIgb2YgdGhlIG5leHQgcGFnZSAqLworCWlmIChuZXh0Ym4gIT0gMCkgeworCQlYVF9HRVRQQUdFKGlwLCBuZXh0Ym4sIG1wLCBQU0laRSwgcCwgcmMpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJLyoKKwkJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIHBhZ2U7CisJCSAqCisJCSAqIGFjdGlvbjogdXBkYXRlIHByZXYgcG9pbnRlcjsKKwkJICovCisJCUJUX01BUktfRElSVFkobXAsIGlwKTsKKwkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFIHwgdGxja1JFTElOSyk7CisKKwkJLyogdGhlIHBhZ2UgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIHRsb2NrJ2QgKi8KKworCQlwLT5oZWFkZXIucHJldiA9IGNwdV90b19sZTY0KHByZXZibik7CisKKwkJWFRfUFVUUEFHRShtcCk7CisJfQorCisJLyogdXBkYXRlIG5leHQgcG9pbnRlciBvZiB0aGUgcHJldmlvdXMgcGFnZSAqLworCWlmIChwcmV2Ym4gIT0gMCkgeworCQlYVF9HRVRQQUdFKGlwLCBwcmV2Ym4sIG1wLCBQU0laRSwgcCwgcmMpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJLyoKKwkJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIHBhZ2U7CisJCSAqCisJCSAqIGFjdGlvbjogdXBkYXRlIG5leHQgcG9pbnRlcjsKKwkJICovCisJCUJUX01BUktfRElSVFkobXAsIGlwKTsKKwkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFIHwgdGxja1JFTElOSyk7CisKKwkJLyogdGhlIHBhZ2UgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIHRsb2NrJ2QgKi8KKworCQlwLT5oZWFkZXIubmV4dCA9IGxlNjRfdG9fY3B1KG5leHRibik7CisKKwkJWFRfUFVUUEFHRShtcCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYJCQkJLyogIF9TVElMTF9UT19QT1JUICovCisKKworLyoKKyAqICAgICAgeHRJbml0Um9vdCgpCisgKgorICogaW5pdGlhbGl6ZSBmaWxlIHJvb3QgKGlubGluZSBpbiBpbm9kZSkKKyAqLwordm9pZCB4dEluaXRSb290KHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCkKK3sKKwl4dHBhZ2VfdCAqcDsKKworCS8qCisJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIHJvb3QKKwkgKgorCSAqIGFjdGlvbjoKKwkgKi8KKwl0eExvY2sodGlkLCBpcCwgKHN0cnVjdCBtZXRhcGFnZSAqKSAmSkZTX0lQKGlwKS0+YnhmbGFnLAorCQkgICAgICB0bGNrWFRSRUUgfCB0bGNrTkVXKTsKKwlwID0gJkpGU19JUChpcCktPmlfeHRyb290OworCisJcC0+aGVhZGVyLmZsYWcgPSBEWERfSU5ERVggfCBCVF9ST09UIHwgQlRfTEVBRjsKKwlwLT5oZWFkZXIubmV4dGluZGV4ID0gY3B1X3RvX2xlMTYoWFRFTlRSWVNUQVJUKTsKKworCWlmIChTX0lTRElSKGlwLT5pX21vZGUpKQorCQlwLT5oZWFkZXIubWF4ZW50cnkgPSBjcHVfdG9fbGUxNihYVFJPT1RJTklUU0xPVF9ESVIpOworCWVsc2UgeworCQlwLT5oZWFkZXIubWF4ZW50cnkgPSBjcHVfdG9fbGUxNihYVFJPT1RJTklUU0xPVCk7CisJCWlwLT5pX3NpemUgPSAwOworCX0KKworCisJcmV0dXJuOworfQorCisKKy8qCisgKiBXZSBjYW4gcnVuIGludG8gYSBkZWFkbG9jayB0cnVuY2F0aW5nIGEgZmlsZSB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mCisgKiB4dHJlZSBwYWdlcyAobGFyZ2UgZnJhZ21lbnRlZCBmaWxlKS4gIEEgcm9idXN0IGZpeCB3b3VsZCBlbnRhaWwgYQorICogcmVzZXJ2YXRpb24gc3lzdGVtIHdoZXJlIHdlIHdvdWxkIHJlc2VydmUgYSBudW1iZXIgb2YgbWV0YWRhdGEgcGFnZXMKKyAqIGFuZCB0bG9ja3Mgd2hpY2ggd2Ugd291bGQgYmUgZ3VhcmFudGVlZCB3aXRob3V0IGEgZGVhZGxvY2suICBXaXRob3V0CisgKiB0aGlzLCBhIHBhcnRpYWwgZml4IGlzIHRvIGxpbWl0IG51bWJlciBvZiBtZXRhZGF0YSBwYWdlcyB3ZSB3aWxsIGxvY2sKKyAqIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLiAgQ3VycmVudGx5IHdlIHdpbGwgdHJ1bmNhdGUgdGhlIGZpbGUgc28gdGhhdAorICogbm8gbW9yZSB0aGFuIDUwIGxlYWYgcGFnZXMgd2lsbCBiZSBsb2NrZWQuICBUaGUgY2FsbGVyIG9mIHh0VHJ1bmNhdGUKKyAqIHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gZ2V0cworICogY29tbWl0dGVkLCBhbmQgdGhhdCBzdWJzZXF1ZW50IHRyYW5zYWN0aW9ucyBhcmUgY3JlYXRlZCB0byB0cnVuY2F0ZQorICogdGhlIGZpbGUgZnVydGhlciBpZiBuZWVkZWQuCisgKi8KKyNkZWZpbmUgTUFYX1RSVU5DQVRFX0xFQVZFUyA1MAorCisvKgorICogICAgICB4dFRydW5jYXRlKCkKKyAqCisgKiBmdW5jdGlvbjoKKyAqICAgICAgdHJhdmVyc2UgZm9yIHRydW5jYXRpb24gbG9nZ2luZyBiYWNrd2FyZCBib3R0b20gdXA7CisgKiAgICAgIHRlcm1pbmF0ZSBhdCB0aGUgbGFzdCBleHRlbnQgZW50cnkgYXQgdGhlIGN1cnJlbnQgc3VidHJlZQorICogICAgICByb290IHBhZ2UgY292ZXJpbmcgbmV3IGRvd24gc2l6ZS4KKyAqICAgICAgdHJ1bmNhdGlvbiBtYXkgb2NjdXIgd2l0aGluIHRoZSBsYXN0IGV4dGVudCBlbnRyeS4KKyAqCisgKiBwYXJhbWV0ZXI6CisgKiAgICAgIGludCAgICAgICAgICAgdGlkLAorICogICAgICBzdHJ1Y3QgaW5vZGUgICAgKmlwLAorICogICAgICBzNjQgICAgICAgICAgIG5ld3NpemUsCisgKiAgICAgIGludCAgICAgICAgICAgdHlwZSkgICB7UFdNQVAsIFBNQVAsIFdNQVA7IERFTEVURSwgVFJVTkNBVEV9CisgKgorICogcmV0dXJuOgorICoKKyAqIG5vdGU6CisgKiAgICAgIFBXTUFQOgorICogICAgICAgMS4gdHJ1bmNhdGUgKG5vbi1DT01NSVRfTk9MSU5LIGZpbGUpCisgKiAgICAgICAgICBieSBqZnNfdHJ1bmNhdGUoKSBvciBqZnNfb3BlbihPX1RSVU5DKToKKyAqICAgICAgICAgIHh0cmVlIGlzIHVwZGF0ZWQ7CisgKgkgMi4gdHJ1bmNhdGUgaW5kZXggdGFibGUgb2YgZGlyZWN0b3J5IHdoZW4gbGFzdCBlbnRyeSByZW1vdmVkCisgKiAgICAgICBtYXAgdXBkYXRlIHZpYSB0bG9jayBhdCBjb21taXQgdGltZTsKKyAqICAgICAgUE1BUDoKKyAqCSBDYWxsIHh0VHJ1bmNhdGVfcG1hcCBpbnN0ZWFkCisgKiAgICAgIFdNQVA6CisgKiAgICAgICAxLiByZW1vdmUgKGZyZWUgemVybyBsaW5rIGNvdW50KSBvbiBsYXN0IHJlZmVyZW5jZSByZWxlYXNlCisgKiAgICAgICAgICAocG1hcCBoYXMgYmVlbiBmcmVlZCBhdCBjb21taXQgemVybyBsaW5rIGNvdW50KTsKKyAqICAgICAgIDIuIHRydW5jYXRlIChDT01NSVRfTk9MSU5LIGZpbGUsIGkuZS4sIHRtcCBmaWxlKToKKyAqICAgICAgICAgIHh0cmVlIGlzIHVwZGF0ZWQ7CisgKiAgICAgICBtYXAgdXBkYXRlIGRpcmVjdGx5IGF0IHRydW5jYXRpb24gdGltZTsKKyAqCisgKiAgICAgIGlmIChERUxFVEUpCisgKiAgICAgICAgICAgICAgbm8gTE9HX05PUkVET1BBR0UgaXMgcmVxdWlyZWQgKE5PUkVET0ZJTEUgaXMgc3VmZmljaWVudCk7CisgKiAgICAgIGVsc2UgaWYgKFRSVU5DQVRFKQorICogICAgICAgICAgICAgIG11c3Qgd3JpdGUgTE9HX05PUkVET1BBR0UgZm9yIGRlbGV0ZWQgaW5kZXggcGFnZTsKKyAqCisgKiBwYWdlcyBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gdGxvY2tlZCBieSBhbm9ueW1vdXMgdHJhbnNhY3Rpb25zCisgKiBkdXJpbmcgZmlsZSBncm93dGggKGkuZS4sIHdyaXRlKSBiZWZvcmUgdHJ1bmNhdGlvbjsKKyAqCisgKiBleGNlcHQgbGFzdCB0cnVuY2F0ZWQgZW50cnksIGRlbGV0ZWQgZW50cmllcyByZW1haW5zIGFzIGlzCisgKiBpbiB0aGUgcGFnZSAobmV4dGluZGV4IGlzIHVwZGF0ZWQpIGZvciBvdGhlciB1c2UKKyAqIChlLmcuLCBsb2cvdXBkYXRlIGFsbG9jYXRpb24gbWFwKTogdGhpcyBhdm9pZCBjb3B5aW5nIHRoZSBwYWdlCisgKiBpbmZvIGJ1dCBkZWxheSBmcmVlIG9mIHBhZ2VzOworICoKKyAqLworczY0IHh0VHJ1bmNhdGUodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgbmV3c2l6ZSwgaW50IGZsYWcpCit7CisJaW50IHJjID0gMDsKKwlzNjQgdGVvZjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXh0cGFnZV90ICpwOworCXM2NCBibjsKKwlpbnQgaW5kZXgsIG5leHRpbmRleDsKKwl4YWRfdCAqeGFkOworCXM2NCB4b2ZmLCB4YWRkcjsKKwlpbnQgeGxlbiwgbGVuLCBmcmVleGxlbjsKKwlzdHJ1Y3QgYnRzdGFjayBidHN0YWNrOworCXN0cnVjdCBidGZyYW1lICpwYXJlbnQ7CisJc3RydWN0IHRibG9jayAqdGJsayA9IE5VTEw7CisJc3RydWN0IHRsb2NrICp0bGNrID0gTlVMTDsKKwlzdHJ1Y3QgeHRsb2NrICp4dGxjayA9IE5VTEw7CisJc3RydWN0IHhkbGlzdGxvY2sgeGFkbG9jazsJLyogbWFwbG9jayBmb3IgQ09NTUlUX1dNQVAgKi8KKwlzdHJ1Y3QgcHhkX2xvY2sgKnB4ZGxvY2s7CQkvKiBtYXBsb2NrIGZvciBDT01NSVRfV01BUCAqLworCXM2NCBuZnJlZWQ7CisJaW50IGZyZWVkLCBsb2c7CisJaW50IGxvY2tlZF9sZWF2ZXMgPSAwOworCisJLyogc2F2ZSBvYmplY3QgdHJ1bmNhdGlvbiB0eXBlICovCisJaWYgKHRpZCkgeworCQl0YmxrID0gdGlkX3RvX3RibG9jayh0aWQpOworCQl0YmxrLT54ZmxhZyB8PSBmbGFnOworCX0KKworCW5mcmVlZCA9IDA7CisKKwlmbGFnICY9IENPTU1JVF9NQVA7CisJYXNzZXJ0KGZsYWcgIT0gQ09NTUlUX1BNQVApOworCisJaWYgKGZsYWcgPT0gQ09NTUlUX1BXTUFQKQorCQlsb2cgPSAxOworCWVsc2UgeworCQlsb2cgPSAwOworCQl4YWRsb2NrLmZsYWcgPSBtbGNrRlJFRVhBRExJU1Q7CisJCXhhZGxvY2suaW5kZXggPSAxOworCX0KKworCS8qCisJICogaWYgdGhlIG5ld3NpemUgaXMgbm90IGFuIGludGVncmFsIG51bWJlciBvZiBwYWdlcywKKwkgKiB0aGUgZmlsZSBiZXR3ZWVuIG5ld3NpemUgYW5kIG5leHQgcGFnZSBib3VuZGFyeSB3aWxsCisJICogYmUgY2xlYXJlZC4KKwkgKiBpZiB0cnVuY2F0aW5nIGludG8gYSBmaWxlIGhvbGUsIGl0IHdpbGwgY2F1c2UKKwkgKiBhIGZ1bGwgYmxvY2sgdG8gYmUgYWxsb2NhdGVkIGZvciB0aGUgbG9naWNhbCBibG9jay4KKwkgKi8KKworCS8qCisJICogcmVsZWFzZSBwYWdlIGJsb2NrcyBvZiB0cnVuY2F0ZWQgcmVnaW9uIDx0ZW9mLCBlb2Y+CisJICoKKwkgKiBmcmVlIHRoZSBkYXRhIGJsb2NrcyBmcm9tIHRoZSBsZWFmIGluZGV4IGJsb2Nrcy4KKwkgKiBkZWxldGUgdGhlIHBhcmVudCBpbmRleCBlbnRyaWVzIGNvcnJlc3BvbmRpbmcgdG8KKwkgKiB0aGUgZnJlZWQgY2hpbGQgZGF0YS9pbmRleCBibG9ja3MuCisJICogZnJlZSB0aGUgaW5kZXggYmxvY2tzIHRoZW1zZWx2ZXMgd2hpY2ggYXJlbid0IG5lZWRlZAorCSAqIGluIG5ldyBzaXplZCBmaWxlLgorCSAqCisJICogaW5kZXggYmxvY2tzIGFyZSB1cGRhdGVkIG9ubHkgaWYgdGhlIGJsb2NrcyBhcmUgdG8gYmUKKwkgKiByZXRhaW5lZCBpbiB0aGUgbmV3IHNpemVkIGZpbGUuCisJICogaWYgdHlwZSBpcyBQTUFQLCB0aGUgZGF0YSBhbmQgaW5kZXggcGFnZXMgYXJlIE5PVAorCSAqIGZyZWVkLCBhbmQgdGhlIGRhdGEgYW5kIGluZGV4IGJsb2NrcyBhcmUgTk9UIGZyZWVkCisJICogZnJvbSAgd29ya2luZyBtYXAuCisJICogKHRoaXMgd2lsbCBhbGxvdyBjb250aW51ZWQgYWNjZXNzIG9mIGRhdGEvaW5kZXggb2YKKwkgKiB0ZW1wb3JhcnkgZmlsZSAoemVyb2xpbmsgY291bnQgZmlsZSB0cnVuY2F0ZWQgdG8gemVyby1sZW5ndGgpKS4KKwkgKi8KKwl0ZW9mID0gKG5ld3NpemUgKyAoSkZTX1NCSShpcC0+aV9zYiktPmJzaXplIC0gMSkpID4+CisJICAgIEpGU19TQkkoaXAtPmlfc2IpLT5sMmJzaXplOworCisJLyogY2xlYXIgc3RhY2sgKi8KKwlCVF9DTFIoJmJ0c3RhY2spOworCisJLyoKKwkgKiBzdGFydCB3aXRoIHJvb3QKKwkgKgorCSAqIHJvb3QgcmVzaWRlcyBpbiB0aGUgaW5vZGUKKwkgKi8KKwlibiA9IDA7CisKKwkvKgorCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIHBhZ2U6CisJICovCisgICAgICBnZXRQYWdlOgorCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIHByb2Nlc3MgZW50cmllcyBiYWNrd2FyZCBmcm9tIGxhc3QgaW5kZXggKi8KKwlpbmRleCA9IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0gMTsKKworCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX0lOVEVSTkFMKQorCQlnb3RvIGdldENoaWxkOworCisJLyoKKwkgKiAgICAgIGxlYWYgcGFnZQorCSAqLworCisJLyogU2luY2UgdGhpcyBpcyB0aGUgcmlnaHRtb3N0IGxlYWYsIGFuZCB3ZSBtYXkgaGF2ZSBhbHJlYWR5IGZyZWVkCisJICogYSBwYWdlIHRoYXQgd2FzIGZvcm1lcmx5IHRvIHRoZSByaWdodCwgbGV0J3MgbWFrZSBzdXJlIHRoYXQgdGhlCisJICogbmV4dCBwb2ludGVyIGlzIHplcm8uCisJICovCisJaWYgKHAtPmhlYWRlci5uZXh0KSB7CisJCWlmIChsb2cpCisJCQkvKgorCQkJICogTWFrZSBzdXJlIHRoaXMgY2hhbmdlIHRvIHRoZSBoZWFkZXIgaXMgbG9nZ2VkLgorCQkJICogSWYgd2UgcmVhbGx5IHRydW5jYXRlIHRoaXMgbGVhZiwgdGhlIGZsYWcKKwkJCSAqIHdpbGwgYmUgY2hhbmdlZCB0byB0bGNrVFJVTkNBVEUKKwkJCSAqLworCQkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFfHRsY2tHUk9XKTsKKwkJQlRfTUFSS19ESVJUWShtcCwgaXApOworCQlwLT5oZWFkZXIubmV4dCA9IDA7CisJfQorCisJZnJlZWQgPSAwOworCisJLyogZG9lcyByZWdpb24gY292ZXJlZCBieSBsZWFmIHBhZ2UgcHJlY2VkZSBUZW9mID8gKi8KKwl4YWQgPSAmcC0+eGFkW2luZGV4XTsKKwl4b2ZmID0gb2Zmc2V0WEFEKHhhZCk7CisJeGxlbiA9IGxlbmd0aFhBRCh4YWQpOworCWlmICh0ZW9mID49IHhvZmYgKyB4bGVuKSB7CisJCVhUX1BVVFBBR0UobXApOworCQlnb3RvIGdldFBhcmVudDsKKwl9CisKKwkvKiAocmUpYWNxdWlyZSB0bG9jayBvZiB0aGUgbGVhZiBwYWdlICovCisJaWYgKGxvZykgeworCQlpZiAoKytsb2NrZWRfbGVhdmVzID4gTUFYX1RSVU5DQVRFX0xFQVZFUykgeworCQkJLyoKKwkJCSAqIFdlIG5lZWQgdG8gbGltaXQgdGhlIHNpemUgb2YgdGhlIHRyYW5zYWN0aW9uCisJCQkgKiB0byBhdm9pZCBleGhhdXN0aW5nIHBhZ2VjYWNoZSAmIHRsb2NrcworCQkJICovCisJCQlYVF9QVVRQQUdFKG1wKTsKKwkJCW5ld3NpemUgPSAoeG9mZiArIHhsZW4pIDw8IEpGU19TQkkoaXAtPmlfc2IpLT5sMmJzaXplOworCQkJZ290byBnZXRQYXJlbnQ7CisJCX0KKwkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFKTsKKwkJdGxjay0+dHlwZSA9IHRsY2tYVFJFRSB8IHRsY2tUUlVOQ0FURTsKKwkJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJCXh0bGNrLT5od20ub2Zmc2V0ID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLSAxOworCX0KKwlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisKKwkvKgorCSAqIHNjYW4gYmFja3dhcmQgbGVhZiBwYWdlIGVudHJpZXMKKwkgKi8KKwlmb3IgKDsgaW5kZXggPj0gWFRFTlRSWVNUQVJUOyBpbmRleC0tKSB7CisJCXhhZCA9ICZwLT54YWRbaW5kZXhdOworCQl4b2ZmID0gb2Zmc2V0WEFEKHhhZCk7CisJCXhsZW4gPSBsZW5ndGhYQUQoeGFkKTsKKwkJeGFkZHIgPSBhZGRyZXNzWEFEKHhhZCk7CisKKwkJLyoKKwkJICogVGhlICJkYXRhIiBmb3IgYSBkaXJlY3RvcnkgaXMgaW5kZXhlZCBieSB0aGUgYmxvY2sKKwkJICogZGV2aWNlJ3MgYWRkcmVzcyBzcGFjZS4gIFRoaXMgbWV0YWRhdGEgbXVzdCBiZSBpbnZhbGlkYXRlZAorCQkgKiBoZXJlCisJCSAqLworCQlpZiAoU19JU0RJUihpcC0+aV9tb2RlKSAmJiAodGVvZiA9PSAwKSkKKwkJCWludmFsaWRhdGVfeGFkX21ldGFwYWdlcyhpcCwgKnhhZCk7CisJCS8qCisJCSAqIGVudHJ5IGJleW9uZCBlb2Y6IGNvbnRpbnVlIHNjYW4gb2YgY3VycmVudCBwYWdlCisJCSAqICAgICAgICAgIHhhZAorCQkgKiAtLS18LS0tPT09PT09PS0tLS0tLS0+CisJCSAqICAgZW9mCisJCSAqLworCQlpZiAodGVvZiA8IHhvZmYpIHsKKwkJCW5mcmVlZCArPSB4bGVuOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiAoeG9mZiA8PSB0ZW9mKTogbGFzdCBlbnRyeSB0byBiZSBkZWxldGVkIGZyb20gcGFnZTsKKwkJICogSWYgb3RoZXIgZW50cmllcyByZW1haW4gaW4gcGFnZToga2VlcCBhbmQgdXBkYXRlIHRoZSBwYWdlLgorCQkgKi8KKworCQkvKgorCQkgKiBlb2YgPT0gZW50cnlfc3RhcnQ6IGRlbGV0ZSB0aGUgZW50cnkKKwkJICogICAgICAgICAgIHhhZAorCQkgKiAtLS0tLS0tfD09PT09PT0tLS0tLS0tPgorCQkgKiAgICAgICBlb2YKKwkJICoKKwkJICovCisJCWlmICh0ZW9mID09IHhvZmYpIHsKKwkJCW5mcmVlZCArPSB4bGVuOworCisJCQlpZiAoaW5kZXggPT0gWFRFTlRSWVNUQVJUKQorCQkJCWJyZWFrOworCisJCQluZXh0aW5kZXggPSBpbmRleDsKKwkJfQorCQkvKgorCQkgKiBlb2Ygd2l0aGluIHRoZSBlbnRyeTogdHJ1bmNhdGUgdGhlIGVudHJ5LgorCQkgKiAgICAgICAgICB4YWQKKwkJICogLS0tLS0tLT09PXw9PT0tLS0tLS0tPgorCQkgKiAgICAgICAgICBlb2YKKwkJICovCisJCWVsc2UgaWYgKHRlb2YgPCB4b2ZmICsgeGxlbikgeworCQkJLyogdXBkYXRlIHRydW5jYXRlZCBlbnRyeSAqLworCQkJbGVuID0gdGVvZiAtIHhvZmY7CisJCQlmcmVleGxlbiA9IHhsZW4gLSBsZW47CisJCQlYQURsZW5ndGgoeGFkLCBsZW4pOworCisJCQkvKiBzYXZlIHB4ZCBvZiB0cnVuY2F0ZWQgZXh0ZW50IGluIHRsY2sgKi8KKwkJCXhhZGRyICs9IGxlbjsKKwkJCWlmIChsb2cpIHsJLyogQ09NTUlUX1BXTUFQICovCisJCQkJeHRsY2stPmx3bS5vZmZzZXQgPSAoeHRsY2stPmx3bS5vZmZzZXQpID8KKwkJCQkgICAgbWluKGluZGV4LCAoaW50KXh0bGNrLT5sd20ub2Zmc2V0KSA6IGluZGV4OworCQkJCXh0bGNrLT5sd20ubGVuZ3RoID0gaW5kZXggKyAxIC0KKwkJCQkgICAgeHRsY2stPmx3bS5vZmZzZXQ7CisJCQkJeHRsY2stPnR3bS5vZmZzZXQgPSBpbmRleDsKKwkJCQlweGRsb2NrID0gKHN0cnVjdCBweGRfbG9jayAqKSAmIHh0bGNrLT5weGRsb2NrOworCQkJCXB4ZGxvY2stPmZsYWcgPSBtbGNrRlJFRVBYRDsKKwkJCQlQWERhZGRyZXNzKCZweGRsb2NrLT5weGQsIHhhZGRyKTsKKwkJCQlQWERsZW5ndGgoJnB4ZGxvY2stPnB4ZCwgZnJlZXhsZW4pOworCQkJfQorCQkJLyogZnJlZSB0cnVuY2F0ZWQgZXh0ZW50ICovCisJCQllbHNlIHsJLyogQ09NTUlUX1dNQVAgKi8KKworCQkJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopICYgeGFkbG9jazsKKwkJCQlweGRsb2NrLT5mbGFnID0gbWxja0ZSRUVQWEQ7CisJCQkJUFhEYWRkcmVzcygmcHhkbG9jay0+cHhkLCB4YWRkcik7CisJCQkJUFhEbGVuZ3RoKCZweGRsb2NrLT5weGQsIGZyZWV4bGVuKTsKKwkJCQl0eEZyZWVNYXAoaXAsIHB4ZGxvY2ssIE5VTEwsIENPTU1JVF9XTUFQKTsKKworCQkJCS8qIHJlc2V0IG1hcCBsb2NrICovCisJCQkJeGFkbG9jay5mbGFnID0gbWxja0ZSRUVYQURMSVNUOworCQkJfQorCisJCQkvKiBjdXJyZW50IGVudHJ5IGlzIG5ldyBsYXN0IGVudHJ5OyAqLworCQkJbmV4dGluZGV4ID0gaW5kZXggKyAxOworCisJCQluZnJlZWQgKz0gZnJlZXhsZW47CisJCX0KKwkJLyoKKwkJICogZW9mIGJleW9uZCB0aGUgZW50cnk6CisJCSAqICAgICAgICAgIHhhZAorCQkgKiAtLS0tLS0tPT09PT09PS0tLXwtLS0+CisJCSAqICAgICAgICAgICAgICAgICBlb2YKKwkJICovCisJCWVsc2UgewkJLyogKHhvZmYgKyB4bGVuIDwgdGVvZikgKi8KKworCQkJbmV4dGluZGV4ID0gaW5kZXggKyAxOworCQl9CisKKwkJaWYgKG5leHRpbmRleCA8IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpKSB7CisJCQlpZiAoIWxvZykgewkvKiBDT01NSVRfV0FNUCAqLworCQkJCXhhZGxvY2sueGRsaXN0ID0gJnAtPnhhZFtuZXh0aW5kZXhdOworCQkJCXhhZGxvY2suY291bnQgPQorCQkJCSAgICBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSAtCisJCQkJICAgIG5leHRpbmRleDsKKwkJCQl0eEZyZWVNYXAoaXAsIChzdHJ1Y3QgbWFwbG9jayAqKSAmIHhhZGxvY2ssCisJCQkJCSAgTlVMTCwgQ09NTUlUX1dNQVApOworCQkJfQorCQkJcC0+aGVhZGVyLm5leHRpbmRleCA9IGNwdV90b19sZTE2KG5leHRpbmRleCk7CisJCX0KKworCQlYVF9QVVRQQUdFKG1wKTsKKworCQkvKiBhc3NlcnQoZnJlZWQgPT0gMCk7ICovCisJCWdvdG8gZ2V0UGFyZW50OworCX0JCQkvKiBlbmQgc2NhbiBvZiBsZWFmIHBhZ2UgZW50cmllcyAqLworCisJZnJlZWQgPSAxOworCisJLyoKKwkgKiBsZWFmIHBhZ2UgYmVjb21lIGVtcHR5OiBmcmVlIHRoZSBwYWdlIGlmIHR5cGUgIT0gUE1BUAorCSAqLworCWlmIChsb2cpIHsJCS8qIENPTU1JVF9QV01BUCAqLworCQkvKiB0eENvbW1pdCgpIHdpdGggdGxja0ZSRUU6CisJCSAqIGZyZWUgZGF0YSBleHRlbnRzIGNvdmVyZWQgYnkgbGVhZiBbWFRFTlRSWVNUQVJUOmh3bSk7CisJCSAqIGludmFsaWRhdGUgbGVhZiBpZiBDT01NSVRfUFdNQVA7CisJCSAqIGlmIChUUlVOQ0FURSksIHdpbGwgd3JpdGUgTE9HX05PUkVET1BBR0U7CisJCSAqLworCQl0bGNrLT50eXBlID0gdGxja1hUUkVFIHwgdGxja0ZSRUU7CisJfSBlbHNlIHsJCS8qIENPTU1JVF9XQU1QICovCisKKwkJLyogZnJlZSBkYXRhIGV4dGVudHMgY292ZXJlZCBieSBsZWFmICovCisJCXhhZGxvY2sueGRsaXN0ID0gJnAtPnhhZFtYVEVOVFJZU1RBUlRdOworCQl4YWRsb2NrLmNvdW50ID0KKwkJICAgIGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0gWFRFTlRSWVNUQVJUOworCQl0eEZyZWVNYXAoaXAsIChzdHJ1Y3QgbWFwbG9jayAqKSAmIHhhZGxvY2ssIE5VTEwsIENPTU1JVF9XTUFQKTsKKwl9CisKKwlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSB7CisJCXAtPmhlYWRlci5mbGFnICY9IH5CVF9JTlRFUk5BTDsKKwkJcC0+aGVhZGVyLmZsYWcgfD0gQlRfTEVBRjsKKwkJcC0+aGVhZGVyLm5leHRpbmRleCA9IGNwdV90b19sZTE2KFhURU5UUllTVEFSVCk7CisKKwkJWFRfUFVUUEFHRShtcCk7CS8qIGRlYnVnICovCisJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCWlmIChsb2cpIHsJLyogQ09NTUlUX1BXTUFQICovCisJCQkvKiBwYWdlIHdpbGwgYmUgaW52YWxpZGF0ZWQgYXQgdHggY29tcGxldGlvbgorCQkJICovCisJCQlYVF9QVVRQQUdFKG1wKTsKKwkJfSBlbHNlIHsJLyogQ09NTUlUX1dNQVAgKi8KKworCQkJaWYgKG1wLT5saWQpCisJCQkJbGlkX3RvX3Rsb2NrKG1wLT5saWQpLT5mbGFnIHw9IHRsY2tGUkVFTE9DSzsKKworCQkJLyogaW52YWxpZGF0ZSBlbXB0eSBsZWFmIHBhZ2UgKi8KKwkJCWRpc2NhcmRfbWV0YXBhZ2UobXApOworCQl9CisJfQorCisJLyoKKwkgKiB0aGUgbGVhZiBwYWdlIGJlY29tZSBlbXB0eTogZGVsZXRlIHRoZSBwYXJlbnQgZW50cnkKKwkgKiBmb3IgdGhlIGxlYWYgcGFnZSBpZiB0aGUgcGFyZW50IHBhZ2UgaXMgdG8gYmUga2VwdAorCSAqIGluIHRoZSBuZXcgc2l6ZWQgZmlsZS4KKwkgKi8KKworCS8qCisJICogZ28gYmFjayB1cCB0byB0aGUgcGFyZW50IHBhZ2UKKwkgKi8KKyAgICAgIGdldFBhcmVudDoKKwkvKiBwb3AvcmVzdG9yZSBwYXJlbnQgZW50cnkgZm9yIHRoZSBjdXJyZW50IGNoaWxkIHBhZ2UgKi8KKwlpZiAoKHBhcmVudCA9IEJUX1BPUCgmYnRzdGFjaykpID09IE5VTEwpCisJCS8qIGN1cnJlbnQgcGFnZSBtdXN0IGhhdmUgYmVlbiByb290ICovCisJCWdvdG8gb3V0OworCisJLyogZ2V0IGJhY2sgdGhlIHBhcmVudCBwYWdlICovCisJYm4gPSBwYXJlbnQtPmJuOworCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWluZGV4ID0gcGFyZW50LT5pbmRleDsKKworCS8qCisJICogY2hpbGQgcGFnZSB3YXMgbm90IGVtcHR5OgorCSAqLworCWlmIChmcmVlZCA9PSAwKSB7CisJCS8qIGhhcyBhbnkgZW50cnkgZGVsZXRlZCBmcm9tIHBhcmVudCA/ICovCisJCWlmIChpbmRleCA8IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0gMSkgeworCQkJLyogKHJlKWFjcXVpcmUgdGxvY2sgb24gdGhlIHBhcmVudCBwYWdlICovCisJCQlpZiAobG9nKSB7CS8qIENPTU1JVF9QV01BUCAqLworCQkJCS8qIHR4Q29tbWl0KCkgd2l0aCB0bGNrVFJVTkNBVEU6CisJCQkJICogZnJlZSBjaGlsZCBleHRlbnRzIGNvdmVyZWQgYnkgcGFyZW50IFspOworCQkJCSAqLworCQkJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tYVFJFRSk7CisJCQkJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJCQkJaWYgKCEodGxjay0+dHlwZSAmIHRsY2tUUlVOQ0FURSkpIHsKKwkJCQkJeHRsY2stPmh3bS5vZmZzZXQgPQorCQkJCQkgICAgbGUxNl90b19jcHUocC0+aGVhZGVyLgorCQkJCQkJCW5leHRpbmRleCkgLSAxOworCQkJCQl0bGNrLT50eXBlID0KKwkJCQkJICAgIHRsY2tYVFJFRSB8IHRsY2tUUlVOQ0FURTsKKwkJCQl9CisJCQl9IGVsc2UgewkvKiBDT01NSVRfV01BUCAqLworCisJCQkJLyogZnJlZSBjaGlsZCBleHRlbnRzIGNvdmVyZWQgYnkgcGFyZW50ICovCisJCQkJeGFkbG9jay54ZGxpc3QgPSAmcC0+eGFkW2luZGV4ICsgMV07CisJCQkJeGFkbG9jay5jb3VudCA9CisJCQkJICAgIGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0KKwkJCQkgICAgaW5kZXggLSAxOworCQkJCXR4RnJlZU1hcChpcCwgKHN0cnVjdCBtYXBsb2NrICopICYgeGFkbG9jaywKKwkJCQkJICBOVUxMLCBDT01NSVRfV01BUCk7CisJCQl9CisJCQlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisKKwkJCXAtPmhlYWRlci5uZXh0aW5kZXggPSBjcHVfdG9fbGUxNihpbmRleCArIDEpOworCQl9CisJCVhUX1BVVFBBR0UobXApOworCQlnb3RvIGdldFBhcmVudDsKKwl9CisKKwkvKgorCSAqIGNoaWxkIHBhZ2Ugd2FzIGVtcHR5OgorCSAqLworCW5mcmVlZCArPSBsZW5ndGhYQUQoJnAtPnhhZFtpbmRleF0pOworCisJLyoKKwkgKiBEdXJpbmcgd29ya2luZyBtYXAgdXBkYXRlLCBjaGlsZCBwYWdlJ3MgdGxvY2sgbXVzdCBiZSBoYW5kbGVkCisJICogYmVmb3JlIHBhcmVudCdzLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBwYXJlbnQncyB0bG9jayB3aWxsIGNhdXNlCisJICogdGhlIGNoaWxkJ3MgZGlzayBzcGFjZSB0byBiZSBtYXJrZWQgYXZhaWxhYmxlIGluIHRoZSB3bWFwLCBzbworCSAqIGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIGNoaWxkIHBhZ2UgYmUgcmVsZWFzZWQgYnkgdGhhdCB0aW1lLgorCSAqCisJICogVG9EbzogIHRsb2NrcyBzaG91bGQgYmUgb24gZG91Ymx5LWxpbmtlZCBsaXN0LCBzbyB3ZSBjYW4KKwkgKiBxdWlja2x5IHJlbW92ZSBpdCBhbmQgYWRkIGl0IHRvIHRoZSBlbmQuCisJICovCisKKwkvKgorCSAqIE1vdmUgcGFyZW50IHBhZ2UncyB0bG9jayB0byB0aGUgZW5kIG9mIHRoZSB0aWQncyB0bG9jayBsaXN0CisJICovCisJaWYgKGxvZyAmJiBtcC0+bGlkICYmICh0YmxrLT5sYXN0ICE9IG1wLT5saWQpICYmCisJICAgIGxpZF90b190bG9jayhtcC0+bGlkKS0+dGlkKSB7CisJCWxpZF90IGxpZCA9IG1wLT5saWQ7CisJCXN0cnVjdCB0bG9jayAqcHJldjsKKworCQl0bGNrID0gbGlkX3RvX3Rsb2NrKGxpZCk7CisKKwkJaWYgKHRibGstPm5leHQgPT0gbGlkKQorCQkJdGJsay0+bmV4dCA9IHRsY2stPm5leHQ7CisJCWVsc2UgeworCQkJZm9yIChwcmV2ID0gbGlkX3RvX3Rsb2NrKHRibGstPm5leHQpOworCQkJICAgICBwcmV2LT5uZXh0ICE9IGxpZDsKKwkJCSAgICAgcHJldiA9IGxpZF90b190bG9jayhwcmV2LT5uZXh0KSkgeworCQkJCWFzc2VydChwcmV2LT5uZXh0KTsKKwkJCX0KKwkJCXByZXYtPm5leHQgPSB0bGNrLT5uZXh0OworCQl9CisJCWxpZF90b190bG9jayh0YmxrLT5sYXN0KS0+bmV4dCA9IGxpZDsKKwkJdGxjay0+bmV4dCA9IDA7CisJCXRibGstPmxhc3QgPSBsaWQ7CisJfQorCisJLyoKKwkgKiBwYXJlbnQgcGFnZSBiZWNvbWUgZW1wdHk6IGZyZWUgdGhlIHBhZ2UKKwkgKi8KKwlpZiAoaW5kZXggPT0gWFRFTlRSWVNUQVJUKSB7CisJCWlmIChsb2cpIHsJLyogQ09NTUlUX1BXTUFQICovCisJCQkvKiB0eENvbW1pdCgpIHdpdGggdGxja0ZSRUU6CisJCQkgKiBmcmVlIGNoaWxkIGV4dGVudHMgY292ZXJlZCBieSBwYXJlbnQ7CisJCQkgKiBpbnZhbGlkYXRlIHBhcmVudCBpZiBDT01NSVRfUFdNQVA7CisJCQkgKi8KKwkJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tYVFJFRSk7CisJCQl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopICYgdGxjay0+bG9jazsKKwkJCXh0bGNrLT5od20ub2Zmc2V0ID0KKwkJCSAgICBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSAtIDE7CisJCQl0bGNrLT50eXBlID0gdGxja1hUUkVFIHwgdGxja0ZSRUU7CisJCX0gZWxzZSB7CS8qIENPTU1JVF9XTUFQICovCisKKwkJCS8qIGZyZWUgY2hpbGQgZXh0ZW50cyBjb3ZlcmVkIGJ5IHBhcmVudCAqLworCQkJeGFkbG9jay54ZGxpc3QgPSAmcC0+eGFkW1hURU5UUllTVEFSVF07CisJCQl4YWRsb2NrLmNvdW50ID0KKwkJCSAgICBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSAtCisJCQkgICAgWFRFTlRSWVNUQVJUOworCQkJdHhGcmVlTWFwKGlwLCAoc3RydWN0IG1hcGxvY2sgKikgJiB4YWRsb2NrLCBOVUxMLAorCQkJCSAgQ09NTUlUX1dNQVApOworCQl9CisJCUJUX01BUktfRElSVFkobXAsIGlwKTsKKworCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSB7CisJCQlwLT5oZWFkZXIuZmxhZyAmPSB+QlRfSU5URVJOQUw7CisJCQlwLT5oZWFkZXIuZmxhZyB8PSBCVF9MRUFGOworCQkJcC0+aGVhZGVyLm5leHRpbmRleCA9IGNwdV90b19sZTE2KFhURU5UUllTVEFSVCk7CisJCQlpZiAobGUxNl90b19jcHUocC0+aGVhZGVyLm1heGVudHJ5KSA9PSBYVFJPT1RNQVhTTE9UKSB7CisJCQkJLyoKKwkJCQkgKiBTaHJpbmsgcm9vdCBkb3duIHRvIGFsbG93IGlubGluZQorCQkJCSAqIEVBIChvdGhlcndpc2UgZnNjayBjb21wbGFpbnMpCisJCQkJICovCisJCQkJcC0+aGVhZGVyLm1heGVudHJ5ID0KKwkJCQkgICAgY3B1X3RvX2xlMTYoWFRST09USU5JVFNMT1QpOworCQkJCUpGU19JUChpcCktPm1vZGUyIHw9IElOTElORUVBOworCQkJfQorCisJCQlYVF9QVVRQQUdFKG1wKTsJLyogZGVidWcgKi8KKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgeworCQkJaWYgKGxvZykgewkvKiBDT01NSVRfUFdNQVAgKi8KKwkJCQkvKiBwYWdlIHdpbGwgYmUgaW52YWxpZGF0ZWQgYXQgdHggY29tcGxldGlvbgorCQkJCSAqLworCQkJCVhUX1BVVFBBR0UobXApOworCQkJfSBlbHNlIHsJLyogQ09NTUlUX1dNQVAgKi8KKworCQkJCWlmIChtcC0+bGlkKQorCQkJCQlsaWRfdG9fdGxvY2sobXAtPmxpZCktPmZsYWcgfD0KKwkJCQkJCXRsY2tGUkVFTE9DSzsKKworCQkJCS8qIGludmFsaWRhdGUgcGFyZW50IHBhZ2UgKi8KKwkJCQlkaXNjYXJkX21ldGFwYWdlKG1wKTsKKwkJCX0KKworCQkJLyogcGFyZW50IGhhcyBiZWNvbWUgZW1wdHkgYW5kIGZyZWVkOgorCQkJICogZ28gYmFjayB1cCB0byBpdHMgcGFyZW50IHBhZ2UKKwkJCSAqLworCQkJLyogZnJlZWQgPSAxOyAqLworCQkJZ290byBnZXRQYXJlbnQ7CisJCX0KKwl9CisJLyoKKwkgKiBwYXJlbnQgcGFnZSBzdGlsbCBoYXMgZW50cmllcyBmb3IgZnJvbnQgcmVnaW9uOworCSAqLworCWVsc2UgeworCQkvKiB0cnkgdHJ1bmNhdGUgcmVnaW9uIGNvdmVyZWQgYnkgcHJlY2VkaW5nIGVudHJ5CisJCSAqIChwcm9jZXNzIGJhY2t3YXJkKQorCQkgKi8KKwkJaW5kZXgtLTsKKworCQkvKiBnbyBiYWNrIGRvd24gdG8gdGhlIGNoaWxkIHBhZ2UgY29ycmVzcG9uZGluZworCQkgKiB0byB0aGUgZW50cnkKKwkJICovCisJCWdvdG8gZ2V0Q2hpbGQ7CisJfQorCisJLyoKKwkgKiAgICAgIGludGVybmFsIHBhZ2U6IGdvIGRvd24gdG8gY2hpbGQgcGFnZSBvZiBjdXJyZW50IGVudHJ5CisJICovCisgICAgICBnZXRDaGlsZDoKKwkvKiBzYXZlIGN1cnJlbnQgcGFyZW50IGVudHJ5IGZvciB0aGUgY2hpbGQgcGFnZSAqLworCUJUX1BVU0goJmJ0c3RhY2ssIGJuLCBpbmRleCk7CisKKwkvKiBnZXQgY2hpbGQgcGFnZSAqLworCXhhZCA9ICZwLT54YWRbaW5kZXhdOworCWJuID0gYWRkcmVzc1hBRCh4YWQpOworCisJLyoKKwkgKiBmaXJzdCBhY2Nlc3Mgb2YgZWFjaCBpbnRlcm5hbCBlbnRyeToKKwkgKi8KKwkvKiByZWxlYXNlIHBhcmVudCBwYWdlICovCisJWFRfUFVUUEFHRShtcCk7CisKKwkvKiBwcm9jZXNzIHRoZSBjaGlsZCBwYWdlICovCisJZ290byBnZXRQYWdlOworCisgICAgICBvdXQ6CisJLyoKKwkgKiB1cGRhdGUgZmlsZSByZXNvdXJjZSBzdGF0CisJICovCisJLyogc2V0IHNpemUKKwkgKi8KKwlpZiAoU19JU0RJUihpcC0+aV9tb2RlKSAmJiAhbmV3c2l6ZSkKKwkJaXAtPmlfc2l6ZSA9IDE7CS8qIGZzY2sgaGF0ZXMgemVyby1sZW5ndGggZGlyZWN0b3JpZXMgKi8KKwllbHNlCisJCWlwLT5pX3NpemUgPSBuZXdzaXplOworCisJLyogdXBkYXRlIHF1b3RhIGFsbG9jYXRpb24gdG8gcmVmbGVjdCBmcmVlZCBibG9ja3MgKi8KKwlEUVVPVF9GUkVFX0JMT0NLKGlwLCBuZnJlZWQpOworCisJLyoKKwkgKiBmcmVlIHRsb2NrIG9mIGludmFsaWRhdGVkIHBhZ2VzCisJICovCisJaWYgKGZsYWcgPT0gQ09NTUlUX1dNQVApCisJCXR4RnJlZWxvY2soaXApOworCisJcmV0dXJuIG5ld3NpemU7Cit9CisKKworLyoKKyAqICAgICAgeHRUcnVuY2F0ZV9wbWFwKCkKKyAqCisgKiBmdW5jdGlvbjoKKyAqCVBlcmZvcm0gdHJ1bmNhdGUgdG8gemVybyBsZW5naHRoIGZvciBkZWxldGVkIGZpbGUsIGxlYXZpbmcgdGhlCisgKgl0aGUgeHRyZWUgYW5kIHdvcmtpbmcgbWFwIHVudG91Y2hlZC4gIFRoaXMgYWxsb3dzIHRoZSBmaWxlIHRvCisgKgliZSBhY2Nlc3NlZCB2aWEgb3BlbiBmaWxlIGhhbmRsZXMsIHdoaWxlIHRoZSBkZWxldGUgb2YgdGhlIGZpbGUKKyAqCWlzIGNvbW1pdHRlZCB0byBkaXNrLgorICoKKyAqIHBhcmFtZXRlcjoKKyAqICAgICAgdGlkX3QJCXRpZCwKKyAqICAgICAgc3RydWN0IGlub2RlCSppcCwKKyAqICAgICAgczY0CQljb21taXR0ZWRfc2l6ZSkKKyAqCisgKiByZXR1cm46IG5ldyBjb21taXR0ZWQgc2l6ZQorICoKKyAqIG5vdGU6CisgKgorICoJVG8gYXZvaWQgZGVhZGxvY2sgYnkgaG9sZGluZyB0b28gbWFueSB0cmFuc2FjdGlvbiBsb2NrcywgdGhlCisgKgl0cnVuY2F0aW9uIG1heSBiZSBicm9rZW4gdXAgaW50byBtdWx0aXBsZSB0cmFuc2FjdGlvbnMuCisgKglUaGUgY29tbWl0dGVkX3NpemUga2VlcHMgdHJhY2sgb2YgcGFydCBvZiB0aGUgZmlsZSBoYXMgYmVlbgorICoJZnJlZWQgZnJvbSB0aGUgcG1hcHMuCisgKi8KK3M2NCB4dFRydW5jYXRlX3BtYXAodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgY29tbWl0dGVkX3NpemUpCit7CisJczY0IGJuOworCXN0cnVjdCBidHN0YWNrIGJ0c3RhY2s7CisJaW50IGNtcDsKKwlpbnQgaW5kZXg7CisJaW50IGxvY2tlZF9sZWF2ZXMgPSAwOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJeHRwYWdlX3QgKnA7CisJc3RydWN0IGJ0ZnJhbWUgKnBhcmVudDsKKwlpbnQgcmM7CisJc3RydWN0IHRibG9jayAqdGJsazsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2sgPSBOVUxMOworCXhhZF90ICp4YWQ7CisJaW50IHhsZW47CisJczY0IHhvZmY7CisJc3RydWN0IHh0bG9jayAqeHRsY2sgPSBOVUxMOworCisJLyogc2F2ZSBvYmplY3QgdHJ1bmNhdGlvbiB0eXBlICovCisJdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKKwl0YmxrLT54ZmxhZyB8PSBDT01NSVRfUE1BUDsKKworCS8qIGNsZWFyIHN0YWNrICovCisJQlRfQ0xSKCZidHN0YWNrKTsKKworCWlmIChjb21taXR0ZWRfc2l6ZSkgeworCQl4b2ZmID0gKGNvbW1pdHRlZF9zaXplID4+IEpGU19TQkkoaXAtPmlfc2IpLT5sMmJzaXplKSAtIDE7CisJCXJjID0geHRTZWFyY2goaXAsIHhvZmYsICZjbXAsICZidHN0YWNrLCAwKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCVhUX0dFVFNFQVJDSChpcCwgYnRzdGFjay50b3AsIGJuLCBtcCwgcCwgaW5kZXgpOworCisJCWlmIChjbXAgIT0gMCkgeworCQkJWFRfUFVUUEFHRShtcCk7CisJCQlqZnNfZXJyb3IoaXAtPmlfc2IsCisJCQkJICAieHRUcnVuY2F0ZV9wbWFwOiBkaWQgbm90IGZpbmQgZXh0ZW50Iik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIHN0YXJ0IHdpdGggcm9vdAorCQkgKgorCQkgKiByb290IHJlc2lkZXMgaW4gdGhlIGlub2RlCisJCSAqLworCQlibiA9IDA7CisKKwkJLyoKKwkJICogZmlyc3QgYWNjZXNzIG9mIGVhY2ggcGFnZToKKwkJICovCisgICAgICBnZXRQYWdlOgorCQlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQkvKiBwcm9jZXNzIGVudHJpZXMgYmFja3dhcmQgZnJvbSBsYXN0IGluZGV4ICovCisJCWluZGV4ID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLSAxOworCisJCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX0lOVEVSTkFMKQorCQkJZ290byBnZXRDaGlsZDsKKwl9CisKKwkvKgorCSAqICAgICAgbGVhZiBwYWdlCisJICovCisKKwlpZiAoKytsb2NrZWRfbGVhdmVzID4gTUFYX1RSVU5DQVRFX0xFQVZFUykgeworCQkvKgorCQkgKiBXZSBuZWVkIHRvIGxpbWl0IHRoZSBzaXplIG9mIHRoZSB0cmFuc2FjdGlvbgorCQkgKiB0byBhdm9pZCBleGhhdXN0aW5nIHBhZ2VjYWNoZSAmIHRsb2NrcworCQkgKi8KKwkJeGFkID0gJnAtPnhhZFtpbmRleF07CisJCXhvZmYgPSBvZmZzZXRYQUQoeGFkKTsKKwkJeGxlbiA9IGxlbmd0aFhBRCh4YWQpOworCQlYVF9QVVRQQUdFKG1wKTsKKwkJcmV0dXJuICAoeG9mZiArIHhsZW4pIDw8IEpGU19TQkkoaXAtPmlfc2IpLT5sMmJzaXplOworCX0KKwl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIG1wLCB0bGNrWFRSRUUpOworCXRsY2stPnR5cGUgPSB0bGNrWFRSRUUgfCB0bGNrRlJFRTsKKwl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopICYgdGxjay0+bG9jazsKKwl4dGxjay0+aHdtLm9mZnNldCA9IGluZGV4OworCisKKwlYVF9QVVRQQUdFKG1wKTsKKworCS8qCisJICogZ28gYmFjayB1cCB0byB0aGUgcGFyZW50IHBhZ2UKKwkgKi8KKyAgICAgIGdldFBhcmVudDoKKwkvKiBwb3AvcmVzdG9yZSBwYXJlbnQgZW50cnkgZm9yIHRoZSBjdXJyZW50IGNoaWxkIHBhZ2UgKi8KKwlpZiAoKHBhcmVudCA9IEJUX1BPUCgmYnRzdGFjaykpID09IE5VTEwpCisJCS8qIGN1cnJlbnQgcGFnZSBtdXN0IGhhdmUgYmVlbiByb290ICovCisJCWdvdG8gb3V0OworCisJLyogZ2V0IGJhY2sgdGhlIHBhcmVudCBwYWdlICovCisJYm4gPSBwYXJlbnQtPmJuOworCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWluZGV4ID0gcGFyZW50LT5pbmRleDsKKworCS8qCisJICogcGFyZW50IHBhZ2UgYmVjb21lIGVtcHR5OiBmcmVlIHRoZSBwYWdlCisJICovCisJaWYgKGluZGV4ID09IFhURU5UUllTVEFSVCkgeworCQkvKiB0eENvbW1pdCgpIHdpdGggdGxja0ZSRUU6CisJCSAqIGZyZWUgY2hpbGQgZXh0ZW50cyBjb3ZlcmVkIGJ5IHBhcmVudDsKKwkJICogaW52YWxpZGF0ZSBwYXJlbnQgaWYgQ09NTUlUX1BXTUFQOworCQkgKi8KKwkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFKTsKKwkJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJCXh0bGNrLT5od20ub2Zmc2V0ID0KKwkJICAgIGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0gMTsKKwkJdGxjay0+dHlwZSA9IHRsY2tYVFJFRSB8IHRsY2tGUkVFOworCisJCVhUX1BVVFBBR0UobXApOworCisJCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX1JPT1QpIHsKKworCQkJZ290byBvdXQ7CisJCX0gZWxzZSB7CisJCQlnb3RvIGdldFBhcmVudDsKKwkJfQorCX0KKwkvKgorCSAqIHBhcmVudCBwYWdlIHN0aWxsIGhhcyBlbnRyaWVzIGZvciBmcm9udCByZWdpb247CisJICovCisJZWxzZQorCQlpbmRleC0tOworCS8qCisJICogICAgICBpbnRlcm5hbCBwYWdlOiBnbyBkb3duIHRvIGNoaWxkIHBhZ2Ugb2YgY3VycmVudCBlbnRyeQorCSAqLworICAgICAgZ2V0Q2hpbGQ6CisJLyogc2F2ZSBjdXJyZW50IHBhcmVudCBlbnRyeSBmb3IgdGhlIGNoaWxkIHBhZ2UgKi8KKwlCVF9QVVNIKCZidHN0YWNrLCBibiwgaW5kZXgpOworCisJLyogZ2V0IGNoaWxkIHBhZ2UgKi8KKwl4YWQgPSAmcC0+eGFkW2luZGV4XTsKKwlibiA9IGFkZHJlc3NYQUQoeGFkKTsKKworCS8qCisJICogZmlyc3QgYWNjZXNzIG9mIGVhY2ggaW50ZXJuYWwgZW50cnk6CisJICovCisJLyogcmVsZWFzZSBwYXJlbnQgcGFnZSAqLworCVhUX1BVVFBBR0UobXApOworCisJLyogcHJvY2VzcyB0aGUgY2hpbGQgcGFnZSAqLworCWdvdG8gZ2V0UGFnZTsKKworICAgICAgb3V0OgorCisJcmV0dXJuIDA7Cit9CisKKworI2lmZGVmIF9KRlNfREVCVUdfWFRSRUUKKy8qCisgKiAgICAgIHh0RGlzcGxheVRyZWUoKQorICoKKyAqIGZ1bmN0aW9uOiB0cmF2ZXJzZSBmb3J3YXJkCisgKi8KK2ludCB4dERpc3BsYXlUcmVlKHN0cnVjdCBpbm9kZSAqaXApCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXh0cGFnZV90ICpwOworCXM2NCBibiwgcGJuOworCWludCBpbmRleCwgbGFzdGluZGV4LCB2LCBoOworCXhhZF90ICp4YWQ7CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsKKwlzdHJ1Y3QgYnRmcmFtZSAqYnRzcDsKKwlzdHJ1Y3QgYnRmcmFtZSAqcGFyZW50OworCisJcHJpbnRrKCJkaXNwbGF5IEIrLXRyZWUuXG4iKTsKKworCS8qIGNsZWFyIHN0YWNrICovCisJYnRzcCA9IGJ0c3RhY2suc3RhY2s7CisKKwkvKgorCSAqIHN0YXJ0IHdpdGggcm9vdAorCSAqCisJICogcm9vdCByZXNpZGVzIGluIHRoZSBpbm9kZQorCSAqLworCWJuID0gMDsKKwl2ID0gaCA9IDA7CisKKwkvKgorCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIHBhZ2U6CisJICovCisgICAgICBnZXRQYWdlOgorCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIHByb2Nlc3MgZW50cmllcyBmb3J3YXJkIGZyb20gZmlyc3QgaW5kZXggKi8KKwlpbmRleCA9IFhURU5UUllTVEFSVDsKKwlsYXN0aW5kZXggPSBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSAtIDE7CisKKwlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9JTlRFUk5BTCkgeworCQkvKgorCQkgKiBmaXJzdCBhY2Nlc3Mgb2YgZWFjaCBpbnRlcm5hbCBwYWdlCisJCSAqLworCQlnb3RvIGdldENoaWxkOworCX0gZWxzZSB7CQkvKiAocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSAqLworCisJCS8qCisJCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIGxlYWYgcGFnZQorCQkgKi8KKwkJcHJpbnRmKCJsZWFmIHBhZ2UgIik7CisJCXh0RGlzcGxheVBhZ2UoaXAsIGJuLCBwKTsKKworCQkvKiB1bnBpbiB0aGUgbGVhZiBwYWdlICovCisJCVhUX1BVVFBBR0UobXApOworCX0KKworCS8qCisJICogZ28gYmFjayB1cCB0byB0aGUgcGFyZW50IHBhZ2UKKwkgKi8KKyAgICAgIGdldFBhcmVudDoKKwkvKiBwb3AvcmVzdG9yZSBwYXJlbnQgZW50cnkgZm9yIHRoZSBjdXJyZW50IGNoaWxkIHBhZ2UgKi8KKwlpZiAoKHBhcmVudCA9IChidHNwID09IGJ0c3RhY2suc3RhY2sgPyBOVUxMIDogLS1idHNwKSkgPT0gTlVMTCkKKwkJLyogY3VycmVudCBwYWdlIG11c3QgaGF2ZSBiZWVuIHJvb3QgKi8KKwkJcmV0dXJuOworCisJLyoKKwkgKiBwYXJlbnQgcGFnZSBzY2FuIGNvbXBsZXRlZAorCSAqLworCWlmICgoaW5kZXggPSBwYXJlbnQtPmluZGV4KSA9PSAobGFzdGluZGV4ID0gcGFyZW50LT5sYXN0aW5kZXgpKSB7CisJCS8qIGdvIGJhY2sgdXAgdG8gdGhlIHBhcmVudCBwYWdlICovCisJCWdvdG8gZ2V0UGFyZW50OworCX0KKworCS8qCisJICogcGFyZW50IHBhZ2UgaGFzIGVudHJpZXMgcmVtYWluaW5nCisJICovCisJLyogZ2V0IGJhY2sgdGhlIHBhcmVudCBwYWdlICovCisJYm4gPSBwYXJlbnQtPmJuOworCS8qIHYgPSBwYXJlbnQtPmxldmVsOyAqLworCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIGdldCBuZXh0IHBhcmVudCBlbnRyeSAqLworCWluZGV4Kys7CisKKwkvKgorCSAqIGludGVybmFsIHBhZ2U6IGdvIGRvd24gdG8gY2hpbGQgcGFnZSBvZiBjdXJyZW50IGVudHJ5CisJICovCisgICAgICBnZXRDaGlsZDoKKwkvKiBwdXNoL3NhdmUgY3VycmVudCBwYXJlbnQgZW50cnkgZm9yIHRoZSBjaGlsZCBwYWdlICovCisJYnRzcC0+Ym4gPSBwYm4gPSBibjsKKwlidHNwLT5pbmRleCA9IGluZGV4OworCWJ0c3AtPmxhc3RpbmRleCA9IGxhc3RpbmRleDsKKwkvKiBidHNwLT5sZXZlbCA9IHY7ICovCisJLyogYnRzcC0+bm9kZSA9IGg7ICovCisJKytidHNwOworCisJLyogZ2V0IGNoaWxkIHBhZ2UgKi8KKwl4YWQgPSAmcC0+eGFkW2luZGV4XTsKKwlibiA9IGFkZHJlc3NYQUQoeGFkKTsKKworCS8qCisJICogZmlyc3QgYWNjZXNzIG9mIGVhY2ggaW50ZXJuYWwgZW50cnk6CisJICovCisJLyogcmVsZWFzZSBwYXJlbnQgcGFnZSAqLworCVhUX1BVVFBBR0UobXApOworCisJcHJpbnRrKCJ0cmF2ZXJzZSBkb3duIDB4JWx4WyVkXS0+MHglbHhcbiIsICh1bG9uZykgcGJuLCBpbmRleCwKKwkgICAgICAgKHVsb25nKSBibik7CisJdisrOworCWggPSBpbmRleDsKKworCS8qIHByb2Nlc3MgdGhlIGNoaWxkIHBhZ2UgKi8KKwlnb3RvIGdldFBhZ2U7Cit9CisKKworLyoKKyAqICAgICAgeHREaXNwbGF5UGFnZSgpCisgKgorICogZnVuY3Rpb246IGRpc3BsYXkgcGFnZQorICovCitpbnQgeHREaXNwbGF5UGFnZShzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgYm4sIHh0cGFnZV90ICogcCkKK3sKKwlpbnQgcmMgPSAwOworCXhhZF90ICp4YWQ7CisJczY0IHhhZGRyLCB4b2ZmOworCWludCB4bGVuLCBpLCBqOworCisJLyogZGlzcGxheSBwYWdlIGNvbnRyb2wgKi8KKwlwcmludGYoImJuOjB4JWx4IGZsYWc6MHgleCBuZXh0aW5kZXg6JWRcbiIsCisJICAgICAgICh1bG9uZykgYm4sIHAtPmhlYWRlci5mbGFnLAorCSAgICAgICBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSk7CisKKwkvKiBkaXNwbGF5IGVudHJpZXMgKi8KKwl4YWQgPSAmcC0+eGFkW1hURU5UUllTVEFSVF07CisJCWZvciAoaSA9IFhURU5UUllTVEFSVCwgaiA9IDE7IGkgPCBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KTsKKwkJICAgICBpKyssIHhhZCsrLCBqKyspIHsKKwkJCXhvZmYgPSBvZmZzZXRYQUQoeGFkKTsKKwkJCXhhZGRyID0gYWRkcmVzc1hBRCh4YWQpOworCQkJeGxlbiA9IGxlbmd0aFhBRCh4YWQpOworCQkJcHJpbnRmKCJcdFslZF0gMHglbHg6MHglbHgoMHgleCkiLCBpLCAodWxvbmcpIHhvZmYsCisJCQkgICAgICAgKHVsb25nKSB4YWRkciwgeGxlbik7CisKKwkJCWlmIChqID09IDQpIHsKKwkJCQlwcmludGYoIlxuIik7CisJCQkJaiA9IDA7CisJCX0KKwl9CisKKwlwcmludGYoIlxuIik7Cit9CisjZW5kaWYJCQkJLyogX0pGU19ERUJVR19YVFJFRSAqLworCisKKyNpZmRlZiBfSkZTX1dJUAorLyoKKyAqICAgICAgeHRHYXRoZXIoKQorICoKKyAqIGZ1bmN0aW9uOgorICogICAgICB0cmF2ZXJzZSBmb3IgYWxsb2NhdGlvbiBhY3F1aXJpbmcgdGxvY2sgYXQgY29tbWl0IHRpbWUKKyAqICAgICAgKHZzIGF0IHRoZSB0aW1lIG9mIHVwZGF0ZSkgbG9nZ2luZyBiYWNrd2FyZCB0b3AgZG93bgorICoKKyAqIG5vdGU6CisgKiAgICAgIHByb2JsZW0gLSBlc3RhYmxpc2hpbmcgdGhhdCBhbGwgbmV3IGFsbG9jYXRpb24gaGF2ZSBiZWVuCisgKiAgICAgIHByb2Nlc3NlZCBib3RoIGZvciBhcHBlbmQgYW5kIHJhbmRvbSB3cml0ZSBpbiBzcGFyc2UgZmlsZQorICogICAgICBhdCB0aGUgY3VycmVudCBlbnRyeSBhdCB0aGUgY3VycmVudCBzdWJ0cmVlIHJvb3QgcGFnZQorICoKKyAqLworaW50IHh0R2F0aGVyKGJ0cmVlX3QgKnQpCit7CisJaW50IHJjID0gMDsKKwl4dHBhZ2VfdCAqcDsKKwl1NjQgYm47CisJaW50IGluZGV4OworCWJ0ZW50cnlfdCAqZTsKKwlzdHJ1Y3QgYnRzdGFjayBidHN0YWNrOworCXN0cnVjdCBidHNmICpwYXJlbnQ7CisKKwkvKiBjbGVhciBzdGFjayAqLworCUJUX0NMUigmYnRzdGFjayk7CisKKwkvKgorCSAqIHN0YXJ0IHdpdGggcm9vdAorCSAqCisJICogcm9vdCByZXNpZGVzIGluIHRoZSBpbm9kZQorCSAqLworCWJuID0gMDsKKwlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiBuZXcgcm9vdCBpcyBOT1QgcG9pbnRlZCBieSBhIG5ldyBlbnRyeQorCSAgIGlmIChwLT5oZWFkZXIuZmxhZyAmIE5FVykKKwkgICBhbGxvY2F0ZSBuZXcgcGFnZSBsb2NrOworCSAgIHdyaXRlIGEgTkVXUEFHRSBsb2c7CisJICovCisKKyAgICAgIGRvcGFnZToKKwkvKgorCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIHBhZ2U6CisJICovCisJLyogcHJvY2VzcyBlbnRyaWVzIGJhY2t3YXJkIGZyb20gbGFzdCBpbmRleCAqLworCWluZGV4ID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLSAxOworCisJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfTEVBRikgeworCQkvKgorCQkgKiBmaXJzdCBhY2Nlc3Mgb2YgZWFjaCBsZWFmIHBhZ2UKKwkJICovCisJCS8qIHByb2Nlc3MgbGVhZiBwYWdlIGVudHJpZXMgYmFja3dhcmQgKi8KKwkJZm9yICg7IGluZGV4ID49IFhURU5UUllTVEFSVDsgaW5kZXgtLSkgeworCQkJZSA9ICZwLT54YWRbaW5kZXhdOworCQkJLyoKKwkJCSAqIGlmIG5ld3BhZ2UsIGxvZyBORVdQQUdFLgorCQkJICoKKwkJCSBpZiAoZS0+ZmxhZyAmIFhBRF9ORVcpIHsKKwkJCSBuZm91bmQgPSsgZW50cnktPmxlbmd0aDsKKwkJCSB1cGRhdGUgY3VycmVudCBwYWdlIGxvY2sgZm9yIHRoZSBlbnRyeTsKKwkJCSBuZXdwYWdlKGVudHJ5KTsKKwkJCSAqCisJCQkgKiBpZiBtb3ZlZCwgbG9nIG1vdmUuCisJCQkgKgorCQkJIH0gZWxzZSBpZiAoZS0+ZmxhZyAmIFhBRF9NT1ZFRCkgeworCQkJIHJlc2V0IGZsYWc7CisJCQkgdXBkYXRlIGN1cnJlbnQgcGFnZSBsb2NrIGZvciB0aGUgZW50cnk7CisJCQkgfQorCQkJICovCisJCX0KKworCQkvKiB1bnBpbiB0aGUgbGVhZiBwYWdlICovCisJCVhUX1BVVFBBR0UobXApOworCisJCS8qCisJCSAqIGdvIGJhY2sgdXAgdG8gdGhlIHBhcmVudCBwYWdlCisJCSAqLworCSAgICAgIGdldFBhcmVudDoKKwkJLyogcmVzdG9yZSBwYXJlbnQgZW50cnkgZm9yIHRoZSBjdXJyZW50IGNoaWxkIHBhZ2UgKi8KKwkJaWYgKChwYXJlbnQgPSBCVF9QT1AoJmJ0c3RhY2spKSA9PSBOVUxMKQorCQkJLyogY3VycmVudCBwYWdlIG11c3QgaGF2ZSBiZWVuIHJvb3QgKi8KKwkJCXJldHVybiAwOworCisJCWlmICgoaW5kZXggPSBwYXJlbnQtPmluZGV4KSA9PSBYVEVOVFJZU1RBUlQpIHsKKwkJCS8qCisJCQkgKiBwYXJlbnQgcGFnZSBzY2FuIGNvbXBsZXRlZAorCQkJICovCisJCQkvKiBnbyBiYWNrIHVwIHRvIHRoZSBwYXJlbnQgcGFnZSAqLworCQkJZ290byBnZXRQYXJlbnQ7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogcGFyZW50IHBhZ2UgaGFzIGVudHJpZXMgcmVtYWluaW5nCisJCQkgKi8KKwkJCS8qIGdldCBiYWNrIHRoZSBwYXJlbnQgcGFnZSAqLworCQkJYm4gPSBwYXJlbnQtPmJuOworCQkJWFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOworCQkJaWYgKHJjKQorCQkJCXJldHVybiAtRUlPOworCisJCQkvKiBmaXJzdCBzdWJyb290IHBhZ2Ugd2hpY2gKKwkJCSAqIGNvdmVycyBhbGwgbmV3IGFsbG9jYXRlZCBibG9ja3MKKwkJCSAqIGl0c2VsZiBub3QgbmV3L21vZGlmaWVkLgorCQkJICogKGlmIG1vZGlmaWVkIGZyb20gc3BsaXQgb2YgZGVzY2VuZGVudCwKKwkJCSAqIGdvIGRvd24gcGF0aCBvZiBzcGxpdCBwYWdlKQorCisJCQkgaWYgKG5mb3VuZCA9PSBubmV3ICYmCisJCQkgIShwLT5oZWFkZXIuZmxhZyAmIChORVcgfCBNT0QpKSkKKwkJCSBleGl0IHNjYW47CisJCQkgKi8KKworCQkJLyogcHJvY2VzcyBwYXJlbnQgcGFnZSBlbnRyaWVzIGJhY2t3YXJkICovCisJCQlpbmRleC0tOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogZmlyc3QgYWNjZXNzIG9mIGVhY2ggaW50ZXJuYWwgcGFnZQorCQkgKi8KKwl9CisKKwkvKgorCSAqIGludGVybmFsIHBhZ2U6IGdvIGRvd24gdG8gY2hpbGQgcGFnZSBvZiBjdXJyZW50IGVudHJ5CisJICovCisKKwkvKiBzYXZlIGN1cnJlbnQgcGFyZW50IGVudHJ5IGZvciB0aGUgY2hpbGQgcGFnZSAqLworCUJUX1BVU0goJmJ0c3RhY2ssIGJuLCBpbmRleCk7CisKKwkvKiBnZXQgY3VycmVudCBlbnRyeSBmb3IgdGhlIGNoaWxkIHBhZ2UgKi8KKwllID0gJnAtPnhhZFtpbmRleF07CisKKwkvKgorCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIGludGVybmFsIGVudHJ5OgorCSAqLworCS8qCisJICogaWYgbmV3IGVudHJ5LCBsb2cgYnRyZWVfdG5ld2VudHJ5LgorCSAqCisJIGlmIChlLT5mbGFnICYgWEFEX05FVykKKwkgdXBkYXRlIHBhcmVudCBwYWdlIGxvY2sgZm9yIHRoZSBlbnRyeTsKKwkgKi8KKworCS8qIHJlbGVhc2UgcGFyZW50IHBhZ2UgKi8KKwlYVF9QVVRQQUdFKG1wKTsKKworCS8qIGdldCBjaGlsZCBwYWdlICovCisJYm4gPSBlLT5ibjsKKwlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKgorCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIG5vbi1yb290IHBhZ2U6CisJICovCisJLyoKKwkgKiBpZiBuZXcsIGxvZyBidHJlZV9uZXdwYWdlLgorCSAqCisJIGlmIChwLT5oZWFkZXIuZmxhZyAmIE5FVykKKwkgYWxsb2NhdGUgbmV3IHBhZ2UgbG9jazsKKwkgd3JpdGUgYSBORVdQQUdFIGxvZyAobmV4dCwgcHJldik7CisJICovCisKKwkvKiBwcm9jZXNzIHRoZSBjaGlsZCBwYWdlICovCisJZ290byBkb3BhZ2U7CisKKyAgICAgIG91dDoKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkJCQkvKiBfSkZTX1dJUCAqLworCisKKyNpZmRlZiBDT05GSUdfSkZTX1NUQVRJU1RJQ1MKK2ludCBqZnNfeHRzdGF0X3JlYWQoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwKKwkJICAgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW4gPSAwOworCW9mZl90IGJlZ2luOworCisJbGVuICs9IHNwcmludGYoYnVmZmVyLAorCQkgICAgICAgIkpGUyBYdHJlZSBzdGF0aXN0aWNzXG4iCisJCSAgICAgICAiPT09PT09PT09PT09PT09PT09PT1cbiIKKwkJICAgICAgICJzZWFyY2hlcyA9ICVkXG4iCisJCSAgICAgICAiZmFzdCBzZWFyY2hlcyA9ICVkXG4iCisJCSAgICAgICAic3BsaXRzID0gJWRcbiIsCisJCSAgICAgICB4dFN0YXQuc2VhcmNoLAorCQkgICAgICAgeHRTdGF0LmZhc3RTZWFyY2gsCisJCSAgICAgICB4dFN0YXQuc3BsaXQpOworCisJYmVnaW4gPSBvZmZzZXQ7CisJKnN0YXJ0ID0gYnVmZmVyICsgYmVnaW47CisJbGVuIC09IGJlZ2luOworCisJaWYgKGxlbiA+IGxlbmd0aCkKKwkJbGVuID0gbGVuZ3RoOworCWVsc2UKKwkJKmVvZiA9IDE7CisKKwlpZiAobGVuIDwgMCkKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW47Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfeHRyZWUuaCBiL2ZzL2pmcy9qZnNfeHRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjk3ODQyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc194dHJlZS5oCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwMgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9IX0pGU19YVFJFRQorI2RlZmluZSBfSF9KRlNfWFRSRUUKKworLyoKKyAqICAgICAgamZzX3h0cmVlLmg6IGV4dGVudCBhbGxvY2F0aW9uIGRlc2NyaXB0b3IgQistdHJlZSBtYW5hZ2VyCisgKi8KKworI2luY2x1ZGUgImpmc19idHJlZS5oIgorCisKKy8qCisgKiAgICAgIGV4dGVudCBhbGxvY2F0aW9uIGRlc2NyaXB0b3IgKHhhZCkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGFkIHsKKwl1bnNpZ25lZCBmbGFnOjg7CS8qIDE6IGZsYWcgKi8KKwl1bnNpZ25lZCByc3ZyZDoxNjsJLyogMjogcmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBvZmYxOjg7CS8qIDE6IG9mZnNldCBpbiB1bml0IG9mIGZzYmxrc2l6ZSAqLworCV9fbGUzMiBvZmYyOwkJLyogNDogb2Zmc2V0IGluIHVuaXQgb2YgZnNibGtzaXplICovCisJdW5zaWduZWQgbGVuOjI0OwkvKiAzOiBsZW5ndGggaW4gdW5pdCBvZiBmc2Jsa3NpemUgKi8KKwl1bnNpZ25lZCBhZGRyMTo4OwkvKiAxOiBhZGRyZXNzIGluIHVuaXQgb2YgZnNibGtzaXplICovCisJX19sZTMyIGFkZHIyOwkJLyogNDogYWRkcmVzcyBpbiB1bml0IG9mIGZzYmxrc2l6ZSAqLworfSB4YWRfdDsJCQkvKiAoMTYpICovCisKKyNkZWZpbmUgTUFYWExFTiAgICAgICAgICgoMSA8PCAyNCkgLSAxKQorCisjZGVmaW5lIFhUU0xPVFNJWkUgICAgICAxNgorI2RlZmluZSBMMlhUU0xPVFNJWkUgICAgNAorCisvKiB4YWRfdCBmaWVsZCBjb25zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgWEFEb2Zmc2V0KHhhZCwgb2Zmc2V0NjQpXAore1wKKyAgICAgICAgKHhhZCktPm9mZjEgPSAoKHU2NClvZmZzZXQ2NCkgPj4gMzI7XAorICAgICAgICAoeGFkKS0+b2ZmMiA9IF9fY3B1X3RvX2xlMzIoKG9mZnNldDY0KSAmIDB4ZmZmZmZmZmYpO1wKK30KKyNkZWZpbmUgWEFEYWRkcmVzcyh4YWQsIGFkZHJlc3M2NClcCit7XAorICAgICAgICAoeGFkKS0+YWRkcjEgPSAoKHU2NClhZGRyZXNzNjQpID4+IDMyO1wKKyAgICAgICAgKHhhZCktPmFkZHIyID0gX19jcHVfdG9fbGUzMigoYWRkcmVzczY0KSAmIDB4ZmZmZmZmZmYpO1wKK30KKyNkZWZpbmUgWEFEbGVuZ3RoKHhhZCwgbGVuZ3RoMzIpICAgICAgICAoeGFkKS0+bGVuID0gX19jcHVfdG9fbGUyNChsZW5ndGgzMikKKworLyogeGFkX3QgZmllbGQgZXh0cmFjdGlvbiAqLworI2RlZmluZSBvZmZzZXRYQUQoeGFkKVwKKyAgICAgICAgKCAoKHM2NCkoKHhhZCktPm9mZjEpKSA8PCAzMiB8IF9fbGUzMl90b19jcHUoKHhhZCktPm9mZjIpKQorI2RlZmluZSBhZGRyZXNzWEFEKHhhZClcCisgICAgICAgICggKChzNjQpKCh4YWQpLT5hZGRyMSkpIDw8IDMyIHwgX19sZTMyX3RvX2NwdSgoeGFkKS0+YWRkcjIpKQorI2RlZmluZSBsZW5ndGhYQUQoeGFkKSAgX19sZTI0X3RvX2NwdSgoeGFkKS0+bGVuKQorCisvKiB4YWQgbGlzdCAqLworc3RydWN0IHhhZGxpc3QgeworCXMxNiBtYXhueGFkOworCXMxNiBueGFkOworCXhhZF90ICp4YWQ7Cit9OworCisvKiB4YWRfdCBmbGFncyAqLworI2RlZmluZSBYQURfTkVXICAgICAgICAgMHgwMQkvKiBuZXcgKi8KKyNkZWZpbmUgWEFEX0VYVEVOREVEICAgIDB4MDIJLyogZXh0ZW5kZWQgKi8KKyNkZWZpbmUgWEFEX0NPTVBSRVNTRUQgIDB4MDQJLyogY29tcHJlc3NlZCB3aXRoIHJlY29yZGVkIGxlbmd0aCAqLworI2RlZmluZSBYQURfTk9UUkVDT1JERUQgMHgwOAkvKiBhbGxvY2F0ZWQgYnV0IG5vdCByZWNvcmRlZCAqLworI2RlZmluZSBYQURfQ09XICAgICAgICAgMHgxMAkvKiBjb3B5LW9uLXdyaXRlICovCisKKworLyogcG9zc2libGUgdmFsdWVzIGZvciBtYXhlbnRyeSAqLworI2RlZmluZSBYVFJPT1RJTklUU0xPVF9ESVIgIDYKKyNkZWZpbmUgWFRST09USU5JVFNMT1QgIDEwCisjZGVmaW5lIFhUUk9PVE1BWFNMT1QgICAxOAorI2RlZmluZSBYVFBBR0VNQVhTTE9UICAgMjU2CisjZGVmaW5lIFhURU5UUllTVEFSVCAgICAyCisKKy8qCisgKiAgICAgIHh0cmVlIHBhZ2U6CisgKi8KK3R5cGVkZWYgdW5pb24geworCXN0cnVjdCB4dGhlYWRlciB7CisJCV9fbGU2NCBuZXh0OwkvKiA4OiAqLworCQlfX2xlNjQgcHJldjsJLyogODogKi8KKworCQl1OCBmbGFnOwkvKiAxOiAqLworCQl1OCByc3J2ZDE7CS8qIDE6ICovCisJCV9fbGUxNiBuZXh0aW5kZXg7CS8qIDI6IG5leHQgaW5kZXggPSBudW1iZXIgb2YgZW50cmllcyAqLworCQlfX2xlMTYgbWF4ZW50cnk7CS8qIDI6IG1heCBudW1iZXIgb2YgZW50cmllcyAqLworCQlfX2xlMTYgcnNydmQyOwkvKiAyOiAqLworCisJCXB4ZF90IHNlbGY7CS8qIDg6IHNlbGYgKi8KKwl9IGhlYWRlcjsJCS8qICgzMikgKi8KKworCXhhZF90IHhhZFtYVFJPT1RNQVhTTE9UXTsJLyogMTYgKiBtYXhlbnRyeTogeGFkIGFycmF5ICovCit9IHh0cGFnZV90OworCisvKgorICogICAgICBleHRlcm5hbCBkZWNsYXJhdGlvbgorICovCitleHRlcm4gaW50IHh0TG9va3VwKHN0cnVjdCBpbm9kZSAqaXAsIHM2NCBsc3RhcnQsIHM2NCBsbGVuLAorCQkgICAgaW50ICpwZmxhZywgczY0ICogcGFkZHIsIGludCAqcGxlbiwgaW50IGZsYWcpOworZXh0ZXJuIGludCB4dExvb2t1cExpc3Qoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGx4ZGxpc3QgKiBseGRsaXN0LAorCQkJc3RydWN0IHhhZGxpc3QgKiB4YWRsaXN0LCBpbnQgZmxhZyk7CitleHRlcm4gdm9pZCB4dEluaXRSb290KHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCk7CitleHRlcm4gaW50IHh0SW5zZXJ0KHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwKKwkJICAgIGludCB4ZmxhZywgczY0IHhvZmYsIGludCB4bGVuLCBzNjQgKiB4YWRkcnAsIGludCBmbGFnKTsKK2V4dGVybiBpbnQgeHRFeHRlbmQodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgeG9mZiwgaW50IHhsZW4sCisJCSAgICBpbnQgZmxhZyk7CisjaWZkZWYgX05PVFlFVAorZXh0ZXJuIGludCB4dFRhaWxnYXRlKHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwKKwkJICAgICAgczY0IHhvZmYsIGludCB4bGVuLCBzNjQgeGFkZHIsIGludCBmbGFnKTsKKyNlbmRpZgorZXh0ZXJuIGludCB4dFVwZGF0ZSh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCB4YWQgKm54YWQpOworZXh0ZXJuIGludCB4dERlbGV0ZSh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIHM2NCB4b2ZmLCBpbnQgeGxlbiwKKwkJICAgIGludCBmbGFnKTsKK2V4dGVybiBzNjQgeHRUcnVuY2F0ZSh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIHM2NCBuZXdzaXplLCBpbnQgdHlwZSk7CitleHRlcm4gczY0IHh0VHJ1bmNhdGVfcG1hcCh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIHM2NCBjb21taXR0ZWRfc2l6ZSk7CitleHRlcm4gaW50IHh0UmVsb2NhdGUodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLAorCQkgICAgICB4YWRfdCAqIG94YWQsIHM2NCBueGFkZHIsIGludCB4dHlwZSk7CitleHRlcm4gaW50IHh0QXBwZW5kKHRpZF90IHRpZCwKKwkJICAgIHN0cnVjdCBpbm9kZSAqaXAsIGludCB4ZmxhZywgczY0IHhvZmYsIGludCBtYXhibG9ja3MsCisJCSAgICBpbnQgKnhsZW5wLCBzNjQgKiB4YWRkcnAsIGludCBmbGFnKTsKKworI2lmZGVmICBfSkZTX0RFQlVHX1hUUkVFCitleHRlcm4gaW50IHh0RGlzcGxheVRyZWUoc3RydWN0IGlub2RlICppcCk7CitleHRlcm4gaW50IHh0RGlzcGxheVBhZ2Uoc3RydWN0IGlub2RlICppcCwgczY0IGJuLCB4dHBhZ2VfdCAqIHApOworI2VuZGlmCQkJCS8qIF9KRlNfREVCVUdfWFRSRUUgKi8KKworI2VuZGlmCQkJCS8qICFfSF9KRlNfWFRSRUUgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9uYW1laS5jIGIvZnMvamZzL25hbWVpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQxM2EzNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9uYW1laS5jCkBAIC0wLDAgKzEsMTU0MCBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAwLTIwMDQKKyAqICAgUG9ydGlvbnMgQ29weXJpZ2h0IChDKSBDaHJpc3RvcGggSGVsbHdpZywgMjAwMS0yMDAyCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKKyNpbmNsdWRlICJqZnNfc3VwZXJibG9jay5oIgorI2luY2x1ZGUgImpmc19pbm9kZS5oIgorI2luY2x1ZGUgImpmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJqZnNfZG1hcC5oIgorI2luY2x1ZGUgImpmc191bmljb2RlLmgiCisjaW5jbHVkZSAiamZzX21ldGFwYWdlLmgiCisjaW5jbHVkZSAiamZzX3hhdHRyLmgiCisjaW5jbHVkZSAiamZzX2FjbC5oIgorI2luY2x1ZGUgImpmc19kZWJ1Zy5oIgorCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgamZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBqZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgamZzX2ZpbGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGpmc19hb3BzOworCitleHRlcm4gaW50IGpmc19mc3luYyhzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7CitleHRlcm4gdm9pZCBqZnNfdHJ1bmNhdGVfbm9sb2NrKHN0cnVjdCBpbm9kZSAqLCBsb2ZmX3QpOworZXh0ZXJuIGludCBqZnNfaW5pdF9hY2woc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqKTsKKworLyoKKyAqIGZvcndhcmQgcmVmZXJlbmNlcworICovCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBqZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGpmc19kaXJfb3BlcmF0aW9uczsKK3N0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBqZnNfY2lfZGVudHJ5X29wZXJhdGlvbnM7CisKK3N0YXRpYyBzNjQgY29tbWl0WmVyb0xpbmsodGlkX3QsIHN0cnVjdCBpbm9kZSAqKTsKKworLyoKKyAqIE5BTUU6CWpmc19jcmVhdGUoZGlwLCBkZW50cnksIG1vZGUpCisgKgorICogRlVOQ1RJT046CWNyZWF0ZSBhIHJlZ3VsYXIgZmlsZSBpbiB0aGUgcGFyZW50IGRpcmVjdG9yeSA8ZGlwPgorICoJCXdpdGggbmFtZSA9IDxmcm9tIGRlbnRyeT4gYW5kIG1vZGUgPSA8bW9kZT4KKyAqCisgKiBQQVJBTUVURVI6CWRpcCAJLSBwYXJlbnQgZGlyZWN0b3J5IHZub2RlCisgKgkJZGVudHJ5CS0gZGVudHJ5IG9mIG5ldyBmaWxlCisgKgkJbW9kZQktIGNyZWF0ZSBtb2RlIChyd3hyd3hyd3gpLgorICoJCW5kLSBuZCBzdHJ1Y3QKKyAqCisgKiBSRVRVUk46CUVycm9ycyBmcm9tIHN1YnJvdXRpbmVzCisgKgorICovCitzdGF0aWMgaW50IGpmc19jcmVhdGUoc3RydWN0IGlub2RlICpkaXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWludCByYyA9IDA7CisJdGlkX3QgdGlkOwkJLyogdHJhbnNhY3Rpb24gaWQgKi8KKwlzdHJ1Y3QgaW5vZGUgKmlwID0gTlVMTDsJLyogY2hpbGQgZGlyZWN0b3J5IGlub2RlICovCisJaW5vX3QgaW5vOworCXN0cnVjdCBjb21wb25lbnRfbmFtZSBkbmFtZTsJLyogY2hpbGQgZGlyZWN0b3J5IG5hbWUgKi8KKwlzdHJ1Y3QgYnRzdGFjayBidHN0YWNrOworCXN0cnVjdCBpbm9kZSAqaXBsaXN0WzJdOworCXN0cnVjdCB0YmxvY2sgKnRibGs7CisKKwlqZnNfaW5mbygiamZzX2NyZWF0ZTogZGlwOjB4JXAgbmFtZTolcyIsIGRpcCwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwkvKgorCSAqIHNlYXJjaCBwYXJlbnQgZGlyZWN0b3J5IGZvciBlbnRyeS9mcmVlc3BhY2UKKwkgKiAoZHRTZWFyY2goKSByZXR1cm5zIHBhcmVudCBkaXJlY3RvcnkgcGFnZSBwaW5uZWQpCisJICovCisJaWYgKChyYyA9IGdldF9VQ1NuYW1lKCZkbmFtZSwgZGVudHJ5KSkpCisJCWdvdG8gb3V0MTsKKworCS8qCisJICogRWl0aGVyIGlBbGxvYygpIG9yIHR4QmVnaW4oKSBtYXkgYmxvY2suICBEZWFkbG9jayBjYW4gb2NjdXIgaWYgd2UKKwkgKiBibG9jayB0aGVyZSB3aGlsZSBob2xkaW5nIGR0cmVlIHBhZ2UsIHNvIHdlIGFsbG9jYXRlIHRoZSBpbm9kZSAmCisJICogYmVnaW4gdGhlIHRyYW5zYWN0aW9uIGJlZm9yZSB3ZSBzZWFyY2ggdGhlIGRpcmVjdG9yeS4KKwkgKi8KKwlpcCA9IGlhbGxvYyhkaXAsIG1vZGUpOworCWlmIChpcCA9PSBOVUxMKSB7CisJCXJjID0gLUVOT1NQQzsKKwkJZ290byBvdXQyOworCX0KKworCXRpZCA9IHR4QmVnaW4oZGlwLT5pX3NiLCAwKTsKKworCWRvd24oJkpGU19JUChkaXApLT5jb21taXRfc2VtKTsKKwlkb3duKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKworCWlmICgocmMgPSBkdFNlYXJjaChkaXAsICZkbmFtZSwgJmlubywgJmJ0c3RhY2ssIEpGU19DUkVBVEUpKSkgeworCQlqZnNfZXJyKCJqZnNfY3JlYXRlOiBkdFNlYXJjaCByZXR1cm5lZCAlZCIsIHJjKTsKKwkJZ290byBvdXQzOworCX0KKworCXRibGsgPSB0aWRfdG9fdGJsb2NrKHRpZCk7CisJdGJsay0+eGZsYWcgfD0gQ09NTUlUX0NSRUFURTsKKwl0YmxrLT5pbm8gPSBpcC0+aV9pbm87CisJdGJsay0+dS5peHB4ZCA9IEpGU19JUChpcCktPml4cHhkOworCisJaXBsaXN0WzBdID0gZGlwOworCWlwbGlzdFsxXSA9IGlwOworCisJLyoKKwkgKiBpbml0aWFsaXplIHRoZSBjaGlsZCBYQUQgdHJlZSByb290IGluLWxpbmUgaW4gaW5vZGUKKwkgKi8KKwl4dEluaXRSb290KHRpZCwgaXApOworCisJLyoKKwkgKiBjcmVhdGUgZW50cnkgaW4gcGFyZW50IGRpcmVjdG9yeSBmb3IgY2hpbGQgZGlyZWN0b3J5CisJICogKGR0SW5zZXJ0KCkgcmVsZWFzZXMgcGFyZW50IGRpcmVjdG9yeSBwYWdlKQorCSAqLworCWlubyA9IGlwLT5pX2lubzsKKwlpZiAoKHJjID0gZHRJbnNlcnQodGlkLCBkaXAsICZkbmFtZSwgJmlubywgJmJ0c3RhY2spKSkgeworCQlpZiAocmMgPT0gLUVJTykgeworCQkJamZzX2VycigiamZzX2NyZWF0ZTogZHRJbnNlcnQgcmV0dXJuZWQgLUVJTyIpOworCQkJdHhBYm9ydCh0aWQsIDEpOwkvKiBNYXJrcyBGaWxlc3lzdGVtIGRpcnR5ICovCisJCX0gZWxzZQorCQkJdHhBYm9ydCh0aWQsIDApOwkvKiBGaWxlc3lzdGVtIGZ1bGwgKi8KKwkJZ290byBvdXQzOworCX0KKworCWlwLT5pX29wID0gJmpmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJaXAtPmlfZm9wID0gJmpmc19maWxlX29wZXJhdGlvbnM7CisJaXAtPmlfbWFwcGluZy0+YV9vcHMgPSAmamZzX2FvcHM7CisKKwlpbnNlcnRfaW5vZGVfaGFzaChpcCk7CisJbWFya19pbm9kZV9kaXJ0eShpcCk7CisKKwlkaXAtPmlfY3RpbWUgPSBkaXAtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CisKKwltYXJrX2lub2RlX2RpcnR5KGRpcCk7CisKKwlyYyA9IHR4Q29tbWl0KHRpZCwgMiwgJmlwbGlzdFswXSwgMCk7CisKKyAgICAgIG91dDM6CisJdHhFbmQodGlkKTsKKwl1cCgmSkZTX0lQKGRpcCktPmNvbW1pdF9zZW0pOworCXVwKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKwlpZiAocmMpIHsKKwkJaXAtPmlfbmxpbmsgPSAwOworCQlpcHV0KGlwKTsKKwl9IGVsc2UKKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlwKTsKKworICAgICAgb3V0MjoKKwlmcmVlX1VDU25hbWUoJmRuYW1lKTsKKworI2lmZGVmIENPTkZJR19KRlNfUE9TSVhfQUNMCisJaWYgKHJjID09IDApCisJCWpmc19pbml0X2FjbChpcCwgZGlwKTsKKyNlbmRpZgorCisgICAgICBvdXQxOgorCisJamZzX2luZm8oImpmc19jcmVhdGU6IHJjOiVkIiwgcmMpOworCXJldHVybiByYzsKK30KKworCisvKgorICogTkFNRToJamZzX21rZGlyKGRpcCwgZGVudHJ5LCBtb2RlKQorICoKKyAqIEZVTkNUSU9OOgljcmVhdGUgYSBjaGlsZCBkaXJlY3RvcnkgaW4gdGhlIHBhcmVudCBkaXJlY3RvcnkgPGRpcD4KKyAqCQl3aXRoIG5hbWUgPSA8ZnJvbSBkZW50cnk+IGFuZCBtb2RlID0gPG1vZGU+CisgKgorICogUEFSQU1FVEVSOglkaXAgCS0gcGFyZW50IGRpcmVjdG9yeSB2bm9kZQorICoJCWRlbnRyeQktIGRlbnRyeSBvZiBjaGlsZCBkaXJlY3RvcnkKKyAqCQltb2RlCS0gY3JlYXRlIG1vZGUgKHJ3eHJ3eHJ3eCkuCisgKgorICogUkVUVVJOOglFcnJvcnMgZnJvbSBzdWJyb3V0aW5lcworICoKKyAqIG5vdGU6CisgKiBFQUNDRVNTOiB1c2VyIG5lZWRzIHNlYXJjaCt3cml0ZSBwZXJtaXNzaW9uIG9uIHRoZSBwYXJlbnQgZGlyZWN0b3J5CisgKi8KK3N0YXRpYyBpbnQgamZzX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQoreworCWludCByYyA9IDA7CisJdGlkX3QgdGlkOwkJLyogdHJhbnNhY3Rpb24gaWQgKi8KKwlzdHJ1Y3QgaW5vZGUgKmlwID0gTlVMTDsJLyogY2hpbGQgZGlyZWN0b3J5IGlub2RlICovCisJaW5vX3QgaW5vOworCXN0cnVjdCBjb21wb25lbnRfbmFtZSBkbmFtZTsJLyogY2hpbGQgZGlyZWN0b3J5IG5hbWUgKi8KKwlzdHJ1Y3QgYnRzdGFjayBidHN0YWNrOworCXN0cnVjdCBpbm9kZSAqaXBsaXN0WzJdOworCXN0cnVjdCB0YmxvY2sgKnRibGs7CisKKwlqZnNfaW5mbygiamZzX21rZGlyOiBkaXA6MHglcCBuYW1lOiVzIiwgZGlwLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCS8qIGxpbmsgY291bnQgb3ZlcmZsb3cgb24gcGFyZW50IGRpcmVjdG9yeSA/ICovCisJaWYgKGRpcC0+aV9ubGluayA9PSBKRlNfTElOS19NQVgpIHsKKwkJcmMgPSAtRU1MSU5LOworCQlnb3RvIG91dDE7CisJfQorCisJLyoKKwkgKiBzZWFyY2ggcGFyZW50IGRpcmVjdG9yeSBmb3IgZW50cnkvZnJlZXNwYWNlCisJICogKGR0U2VhcmNoKCkgcmV0dXJucyBwYXJlbnQgZGlyZWN0b3J5IHBhZ2UgcGlubmVkKQorCSAqLworCWlmICgocmMgPSBnZXRfVUNTbmFtZSgmZG5hbWUsIGRlbnRyeSkpKQorCQlnb3RvIG91dDE7CisKKwkvKgorCSAqIEVpdGhlciBpQWxsb2MoKSBvciB0eEJlZ2luKCkgbWF5IGJsb2NrLiAgRGVhZGxvY2sgY2FuIG9jY3VyIGlmIHdlCisJICogYmxvY2sgdGhlcmUgd2hpbGUgaG9sZGluZyBkdHJlZSBwYWdlLCBzbyB3ZSBhbGxvY2F0ZSB0aGUgaW5vZGUgJgorCSAqIGJlZ2luIHRoZSB0cmFuc2FjdGlvbiBiZWZvcmUgd2Ugc2VhcmNoIHRoZSBkaXJlY3RvcnkuCisJICovCisJaXAgPSBpYWxsb2MoZGlwLCBTX0lGRElSIHwgbW9kZSk7CisJaWYgKGlwID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PU1BDOworCQlnb3RvIG91dDI7CisJfQorCisJdGlkID0gdHhCZWdpbihkaXAtPmlfc2IsIDApOworCisJZG93bigmSkZTX0lQKGRpcCktPmNvbW1pdF9zZW0pOworCWRvd24oJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCisJaWYgKChyYyA9IGR0U2VhcmNoKGRpcCwgJmRuYW1lLCAmaW5vLCAmYnRzdGFjaywgSkZTX0NSRUFURSkpKSB7CisJCWpmc19lcnIoImpmc19ta2RpcjogZHRTZWFyY2ggcmV0dXJuZWQgJWQiLCByYyk7CisJCWdvdG8gb3V0MzsKKwl9CisKKwl0YmxrID0gdGlkX3RvX3RibG9jayh0aWQpOworCXRibGstPnhmbGFnIHw9IENPTU1JVF9DUkVBVEU7CisJdGJsay0+aW5vID0gaXAtPmlfaW5vOworCXRibGstPnUuaXhweGQgPSBKRlNfSVAoaXApLT5peHB4ZDsKKworCWlwbGlzdFswXSA9IGRpcDsKKwlpcGxpc3RbMV0gPSBpcDsKKworCS8qCisJICogaW5pdGlhbGl6ZSB0aGUgY2hpbGQgZGlyZWN0b3J5IGluLWxpbmUgaW4gaW5vZGUKKwkgKi8KKwlkdEluaXRSb290KHRpZCwgaXAsIGRpcC0+aV9pbm8pOworCisJLyoKKwkgKiBjcmVhdGUgZW50cnkgaW4gcGFyZW50IGRpcmVjdG9yeSBmb3IgY2hpbGQgZGlyZWN0b3J5CisJICogKGR0SW5zZXJ0KCkgcmVsZWFzZXMgcGFyZW50IGRpcmVjdG9yeSBwYWdlKQorCSAqLworCWlubyA9IGlwLT5pX2lubzsKKwlpZiAoKHJjID0gZHRJbnNlcnQodGlkLCBkaXAsICZkbmFtZSwgJmlubywgJmJ0c3RhY2spKSkgeworCQlpZiAocmMgPT0gLUVJTykgeworCQkJamZzX2VycigiamZzX21rZGlyOiBkdEluc2VydCByZXR1cm5lZCAtRUlPIik7CisJCQl0eEFib3J0KHRpZCwgMSk7CS8qIE1hcmtzIEZpbGVzeXN0ZW0gZGlydHkgKi8KKwkJfSBlbHNlCisJCQl0eEFib3J0KHRpZCwgMCk7CS8qIEZpbGVzeXN0ZW0gZnVsbCAqLworCQlnb3RvIG91dDM7CisJfQorCisJaXAtPmlfbmxpbmsgPSAyOwkvKiBmb3IgJy4nICovCisJaXAtPmlfb3AgPSAmamZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCWlwLT5pX2ZvcCA9ICZqZnNfZGlyX29wZXJhdGlvbnM7CisKKwlpbnNlcnRfaW5vZGVfaGFzaChpcCk7CisJbWFya19pbm9kZV9kaXJ0eShpcCk7CisKKwkvKiB1cGRhdGUgcGFyZW50IGRpcmVjdG9yeSBpbm9kZSAqLworCWRpcC0+aV9ubGluaysrOwkJLyogZm9yICcuLicgZnJvbSBjaGlsZCBkaXJlY3RvcnkgKi8KKwlkaXAtPmlfY3RpbWUgPSBkaXAtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CisJbWFya19pbm9kZV9kaXJ0eShkaXApOworCisJcmMgPSB0eENvbW1pdCh0aWQsIDIsICZpcGxpc3RbMF0sIDApOworCisgICAgICBvdXQzOgorCXR4RW5kKHRpZCk7CisJdXAoJkpGU19JUChkaXApLT5jb21taXRfc2VtKTsKKwl1cCgmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisJaWYgKHJjKSB7CisJCWlwLT5pX25saW5rID0gMDsKKwkJaXB1dChpcCk7CisJfSBlbHNlCisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpcCk7CisKKyAgICAgIG91dDI6CisJZnJlZV9VQ1NuYW1lKCZkbmFtZSk7CisKKyNpZmRlZiBDT05GSUdfSkZTX1BPU0lYX0FDTAorCWlmIChyYyA9PSAwKQorCQlqZnNfaW5pdF9hY2woaXAsIGRpcCk7CisjZW5kaWYKKworICAgICAgb3V0MToKKworCWpmc19pbmZvKCJqZnNfbWtkaXI6IHJjOiVkIiwgcmMpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIE5BTUU6CWpmc19ybWRpcihkaXAsIGRlbnRyeSkKKyAqCisgKiBGVU5DVElPTjoJcmVtb3ZlIGEgbGluayB0byBjaGlsZCBkaXJlY3RvcnkKKyAqCisgKiBQQVJBTUVURVI6CWRpcCAJLSBwYXJlbnQgaW5vZGUKKyAqCQlkZW50cnkJLSBjaGlsZCBkaXJlY3RvcnkgZGVudHJ5CisgKgorICogUkVUVVJOOgktRUlOVkFMCS0gaWYgbmFtZSBpcyAuIG9yIC4uCisgKgkJLUVJTlZBTCAgLSBpZiAuIG9yIC4uIGV4aXN0IGJ1dCBhcmUgaW52YWxpZC4KKyAqCQllcnJvcnMgZnJvbSBzdWJyb3V0aW5lcworICoKKyAqIG5vdGU6CisgKiBpZiBvdGhlciB0aHJlYWRzIGhhdmUgdGhlIGRpcmVjdG9yeSBvcGVuIHdoZW4gdGhlIGxhc3QgbGluayAKKyAqIGlzIHJlbW92ZWQsIHRoZSAiLiIgYW5kICIuLiIgZW50cmllcywgaWYgcHJlc2VudCwgYXJlIHJlbW92ZWQgYmVmb3JlIAorICogcm1kaXIoKSByZXR1cm5zIGFuZCBubyBuZXcgZW50cmllcyBtYXkgYmUgY3JlYXRlZCBpbiB0aGUgZGlyZWN0b3J5LCAKKyAqIGJ1dCB0aGUgZGlyZWN0b3J5IGlzIG5vdCByZW1vdmVkIHVudGlsIHRoZSBsYXN0IHJlZmVyZW5jZSB0byAKKyAqIHRoZSBkaXJlY3RvcnkgaXMgcmVsZWFzZWQgKGNmLnVubGluaygpIG9mIHJlZ3VsYXIgZmlsZSkuCisgKi8KK3N0YXRpYyBpbnQgamZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IHJjOworCXRpZF90IHRpZDsJCS8qIHRyYW5zYWN0aW9uIGlkICovCisJc3RydWN0IGlub2RlICppcCA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbm9fdCBpbm87CisJc3RydWN0IGNvbXBvbmVudF9uYW1lIGRuYW1lOworCXN0cnVjdCBpbm9kZSAqaXBsaXN0WzJdOworCXN0cnVjdCB0YmxvY2sgKnRibGs7CisKKwlqZnNfaW5mbygiamZzX3JtZGlyOiBkaXA6MHglcCBuYW1lOiVzIiwgZGlwLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCS8qIEluaXQgaW5vZGUgZm9yIHF1b3RhIG9wZXJhdGlvbnMuICovCisJRFFVT1RfSU5JVChpcCk7CisKKwkvKiBkaXJlY3RvcnkgbXVzdCBiZSBlbXB0eSB0byBiZSByZW1vdmVkICovCisJaWYgKCFkdEVtcHR5KGlwKSkgeworCQlyYyA9IC1FTk9URU1QVFk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgocmMgPSBnZXRfVUNTbmFtZSgmZG5hbWUsIGRlbnRyeSkpKSB7CisJCWdvdG8gb3V0OworCX0KKworCXRpZCA9IHR4QmVnaW4oZGlwLT5pX3NiLCAwKTsKKworCWRvd24oJkpGU19JUChkaXApLT5jb21taXRfc2VtKTsKKwlkb3duKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKworCWlwbGlzdFswXSA9IGRpcDsKKwlpcGxpc3RbMV0gPSBpcDsKKworCXRibGsgPSB0aWRfdG9fdGJsb2NrKHRpZCk7CisJdGJsay0+eGZsYWcgfD0gQ09NTUlUX0RFTEVURTsKKwl0YmxrLT51LmlwID0gaXA7CisKKwkvKgorCSAqIGRlbGV0ZSB0aGUgZW50cnkgb2YgdGFyZ2V0IGRpcmVjdG9yeSBmcm9tIHBhcmVudCBkaXJlY3RvcnkKKwkgKi8KKwlpbm8gPSBpcC0+aV9pbm87CisJaWYgKChyYyA9IGR0RGVsZXRlKHRpZCwgZGlwLCAmZG5hbWUsICZpbm8sIEpGU19SRU1PVkUpKSkgeworCQlqZnNfZXJyKCJqZnNfcm1kaXI6IGR0RGVsZXRlIHJldHVybmVkICVkIiwgcmMpOworCQlpZiAocmMgPT0gLUVJTykKKwkJCXR4QWJvcnQodGlkLCAxKTsKKwkJdHhFbmQodGlkKTsKKwkJdXAoJkpGU19JUChkaXApLT5jb21taXRfc2VtKTsKKwkJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCisJCWdvdG8gb3V0MjsKKwl9CisKKwkvKiB1cGRhdGUgcGFyZW50IGRpcmVjdG9yeSdzIGxpbmsgY291bnQgY29ycmVzcG9uZGluZworCSAqIHRvICIuLiIgZW50cnkgb2YgdGhlIHRhcmdldCBkaXJlY3RvcnkgZGVsZXRlZAorCSAqLworCWRpcC0+aV9ubGluay0tOworCWRpcC0+aV9jdGltZSA9IGRpcC0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKKwltYXJrX2lub2RlX2RpcnR5KGRpcCk7CisKKwkvKgorCSAqIE9TLzIgY291bGQgaGF2ZSBjcmVhdGVkIEVBIGFuZC9vciBBQ0wKKwkgKi8KKwkvKiBmcmVlIEVBIGZyb20gYm90aCBwZXJzaXN0ZW50IGFuZCB3b3JraW5nIG1hcCAqLworCWlmIChKRlNfSVAoaXApLT5lYS5mbGFnICYgRFhEX0VYVEVOVCkgeworCQkvKiBmcmVlIEVBIHBhZ2VzICovCisJCXR4RUEodGlkLCBpcCwgJkpGU19JUChpcCktPmVhLCBOVUxMKTsKKwl9CisJSkZTX0lQKGlwKS0+ZWEuZmxhZyA9IDA7CisKKwkvKiBmcmVlIEFDTCBmcm9tIGJvdGggcGVyc2lzdGVudCBhbmQgd29ya2luZyBtYXAgKi8KKwlpZiAoSkZTX0lQKGlwKS0+YWNsLmZsYWcgJiBEWERfRVhURU5UKSB7CisJCS8qIGZyZWUgQUNMIHBhZ2VzICovCisJCXR4RUEodGlkLCBpcCwgJkpGU19JUChpcCktPmFjbCwgTlVMTCk7CisJfQorCUpGU19JUChpcCktPmFjbC5mbGFnID0gMDsKKworCS8qIG1hcmsgdGhlIHRhcmdldCBkaXJlY3RvcnkgYXMgZGVsZXRlZCAqLworCWlwLT5pX25saW5rID0gMDsKKwltYXJrX2lub2RlX2RpcnR5KGlwKTsKKworCXJjID0gdHhDb21taXQodGlkLCAyLCAmaXBsaXN0WzBdLCAwKTsKKworCXR4RW5kKHRpZCk7CisKKwl1cCgmSkZTX0lQKGRpcCktPmNvbW1pdF9zZW0pOworCXVwKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKworCS8qCisJICogVHJ1bmNhdGluZyB0aGUgZGlyZWN0b3J5IGluZGV4IHRhYmxlIGlzIG5vdCBndWFyYW50ZWVkLiAgSXQKKwkgKiBtYXkgbmVlZCB0byBiZSBkb25lIGl0ZXJhdGl2ZWx5CisJICovCisJaWYgKHRlc3RfY2ZsYWcoQ09NTUlUX1N0YWxlLCBkaXApKSB7CisJCWlmIChkaXAtPmlfc2l6ZSA+IDEpCisJCQlqZnNfdHJ1bmNhdGVfbm9sb2NrKGRpcCwgMCk7CisKKwkJY2xlYXJfY2ZsYWcoQ09NTUlUX1N0YWxlLCBkaXApOworCX0KKworICAgICAgb3V0MjoKKwlmcmVlX1VDU25hbWUoJmRuYW1lKTsKKworICAgICAgb3V0OgorCWpmc19pbmZvKCJqZnNfcm1kaXI6IHJjOiVkIiwgcmMpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIE5BTUU6CWpmc191bmxpbmsoZGlwLCBkZW50cnkpCisgKgorICogRlVOQ1RJT046CXJlbW92ZSBhIGxpbmsgdG8gb2JqZWN0IDx2cD4gbmFtZWQgYnkgPG5hbWU+IAorICoJCWZyb20gcGFyZW50IGRpcmVjdG9yeSA8ZHZwPgorICoKKyAqIFBBUkFNRVRFUjoJZGlwIAktIGlub2RlIG9mIHBhcmVudCBkaXJlY3RvcnkKKyAqCQlkZW50cnkgCS0gZGVudHJ5IG9mIG9iamVjdCB0byBiZSByZW1vdmVkCisgKgorICogUkVUVVJOOgllcnJvcnMgZnJvbSBzdWJyb3V0aW5lcworICoKKyAqIG5vdGU6CisgKiB0ZW1wb3JhcnkgZmlsZTogaWYgb25lIG9yIG1vcmUgcHJvY2Vzc2VzIGhhdmUgdGhlIGZpbGUgb3BlbgorICogd2hlbiB0aGUgbGFzdCBsaW5rIGlzIHJlbW92ZWQsIHRoZSBsaW5rIHdpbGwgYmUgcmVtb3ZlZCBiZWZvcmUKKyAqIHVubGluaygpIHJldHVybnMsIGJ1dCB0aGUgcmVtb3ZhbCBvZiB0aGUgZmlsZSBjb250ZW50cyB3aWxsIGJlCisgKiBwb3N0cG9uZWQgdW50aWwgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGZpbGVzIGFyZSBjbG9zZWQuCisgKgorICogSkZTIGRvZXMgTk9UIHN1cHBvcnQgdW5saW5rKCkgb24gZGlyZWN0b3JpZXMuCisgKgorICovCitzdGF0aWMgaW50IGpmc191bmxpbmsoc3RydWN0IGlub2RlICpkaXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgcmM7CisJdGlkX3QgdGlkOwkJLyogdHJhbnNhY3Rpb24gaWQgKi8KKwlzdHJ1Y3QgaW5vZGUgKmlwID0gZGVudHJ5LT5kX2lub2RlOworCWlub190IGlubzsKKwlzdHJ1Y3QgY29tcG9uZW50X25hbWUgZG5hbWU7CS8qIG9iamVjdCBuYW1lICovCisJc3RydWN0IGlub2RlICppcGxpc3RbMl07CisJc3RydWN0IHRibG9jayAqdGJsazsKKwlzNjQgbmV3X3NpemUgPSAwOworCWludCBjb21taXRfZmxhZzsKKworCWpmc19pbmZvKCJqZnNfdW5saW5rOiBkaXA6MHglcCBuYW1lOiVzIiwgZGlwLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCS8qIEluaXQgaW5vZGUgZm9yIHF1b3RhIG9wZXJhdGlvbnMuICovCisJRFFVT1RfSU5JVChpcCk7CisKKwlpZiAoKHJjID0gZ2V0X1VDU25hbWUoJmRuYW1lLCBkZW50cnkpKSkKKwkJZ290byBvdXQ7CisKKwlJV1JJVEVfTE9DSyhpcCk7CisKKwl0aWQgPSB0eEJlZ2luKGRpcC0+aV9zYiwgMCk7CisKKwlkb3duKCZKRlNfSVAoZGlwKS0+Y29tbWl0X3NlbSk7CisJZG93bigmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisKKwlpcGxpc3RbMF0gPSBkaXA7CisJaXBsaXN0WzFdID0gaXA7CisKKwkvKgorCSAqIGRlbGV0ZSB0aGUgZW50cnkgb2YgdGFyZ2V0IGZpbGUgZnJvbSBwYXJlbnQgZGlyZWN0b3J5CisJICovCisJaW5vID0gaXAtPmlfaW5vOworCWlmICgocmMgPSBkdERlbGV0ZSh0aWQsIGRpcCwgJmRuYW1lLCAmaW5vLCBKRlNfUkVNT1ZFKSkpIHsKKwkJamZzX2VycigiamZzX3VubGluazogZHREZWxldGUgcmV0dXJuZWQgJWQiLCByYyk7CisJCWlmIChyYyA9PSAtRUlPKQorCQkJdHhBYm9ydCh0aWQsIDEpOwkvKiBNYXJrcyBGUyBEaXJ0eSAqLworCQl0eEVuZCh0aWQpOworCQl1cCgmSkZTX0lQKGRpcCktPmNvbW1pdF9zZW0pOworCQl1cCgmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisJCUlXUklURV9VTkxPQ0soaXApOworCQlnb3RvIG91dDE7CisJfQorCisJQVNTRVJUKGlwLT5pX25saW5rKTsKKworCWlwLT5pX2N0aW1lID0gZGlwLT5pX2N0aW1lID0gZGlwLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOworCW1hcmtfaW5vZGVfZGlydHkoZGlwKTsKKworCS8qIHVwZGF0ZSB0YXJnZXQncyBpbm9kZSAqLworCWlwLT5pX25saW5rLS07CisJbWFya19pbm9kZV9kaXJ0eShpcCk7CisKKwkvKgorCSAqICAgICAgY29tbWl0IHplcm8gbGluayBjb3VudCBvYmplY3QKKwkgKi8KKwlpZiAoaXAtPmlfbmxpbmsgPT0gMCkgeworCQlhc3NlcnQoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKTsKKwkJLyogZnJlZSBibG9jayByZXNvdXJjZXMgKi8KKwkJaWYgKChuZXdfc2l6ZSA9IGNvbW1pdFplcm9MaW5rKHRpZCwgaXApKSA8IDApIHsKKwkJCXR4QWJvcnQodGlkLCAxKTsJLyogTWFya3MgRlMgRGlydHkgKi8KKwkJCXR4RW5kKHRpZCk7CisJCQl1cCgmSkZTX0lQKGRpcCktPmNvbW1pdF9zZW0pOworCQkJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCQkJSVdSSVRFX1VOTE9DSyhpcCk7CisJCQlyYyA9IG5ld19zaXplOworCQkJZ290byBvdXQxOworCQl9CisJCXRibGsgPSB0aWRfdG9fdGJsb2NrKHRpZCk7CisJCXRibGstPnhmbGFnIHw9IENPTU1JVF9ERUxFVEU7CisJCXRibGstPnUuaXAgPSBpcDsKKwl9CisKKwkvKgorCSAqIEluY29tcGxldGUgdHJ1bmNhdGUgb2YgZmlsZSBkYXRhIGNhbgorCSAqIHJlc3VsdCBpbiB0aW1pbmcgcHJvYmxlbXMgdW5sZXNzIHdlIHN5bmNocm9ub3VzbHkgY29tbWl0IHRoZQorCSAqIHRyYW5zYWN0aW9uLgorCSAqLworCWlmIChuZXdfc2l6ZSkKKwkJY29tbWl0X2ZsYWcgPSBDT01NSVRfU1lOQzsKKwllbHNlCisJCWNvbW1pdF9mbGFnID0gMDsKKworCS8qCisJICogSWYgeHRUcnVuY2F0ZSB3YXMgaW5jb21wbGV0ZSwgY29tbWl0IHN5bmNocm9ub3VzbHkgdG8gYXZvaWQKKwkgKiB0aW1pbmcgY29tcGxpY2F0aW9ucworCSAqLworCXJjID0gdHhDb21taXQodGlkLCAyLCAmaXBsaXN0WzBdLCBjb21taXRfZmxhZyk7CisKKwl0eEVuZCh0aWQpOworCisJdXAoJkpGU19JUChkaXApLT5jb21taXRfc2VtKTsKKwl1cCgmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisKKworCXdoaWxlIChuZXdfc2l6ZSAmJiAocmMgPT0gMCkpIHsKKwkJdGlkID0gdHhCZWdpbihkaXAtPmlfc2IsIDApOworCQlkb3duKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKwkJbmV3X3NpemUgPSB4dFRydW5jYXRlX3BtYXAodGlkLCBpcCwgbmV3X3NpemUpOworCQlpZiAobmV3X3NpemUgPCAwKSB7CisJCQl0eEFib3J0KHRpZCwgMSk7CS8qIE1hcmtzIEZTIERpcnR5ICovCisJCQlyYyA9IG5ld19zaXplOworCQl9IGVsc2UKKwkJCXJjID0gdHhDb21taXQodGlkLCAyLCAmaXBsaXN0WzBdLCBDT01NSVRfU1lOQyk7CisJCXR4RW5kKHRpZCk7CisJCXVwKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKwl9CisKKwlpZiAoaXAtPmlfbmxpbmsgPT0gMCkKKwkJc2V0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKTsKKworCUlXUklURV9VTkxPQ0soaXApOworCisJLyoKKwkgKiBUcnVuY2F0aW5nIHRoZSBkaXJlY3RvcnkgaW5kZXggdGFibGUgaXMgbm90IGd1YXJhbnRlZWQuICBJdAorCSAqIG1heSBuZWVkIHRvIGJlIGRvbmUgaXRlcmF0aXZlbHkKKwkgKi8KKwlpZiAodGVzdF9jZmxhZyhDT01NSVRfU3RhbGUsIGRpcCkpIHsKKwkJaWYgKGRpcC0+aV9zaXplID4gMSkKKwkJCWpmc190cnVuY2F0ZV9ub2xvY2soZGlwLCAwKTsKKworCQljbGVhcl9jZmxhZyhDT01NSVRfU3RhbGUsIGRpcCk7CisJfQorCisgICAgICBvdXQxOgorCWZyZWVfVUNTbmFtZSgmZG5hbWUpOworICAgICAgb3V0OgorCWpmc19pbmZvKCJqZnNfdW5saW5rOiByYzolZCIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBOQU1FOgljb21taXRaZXJvTGluaygpCisgKgorICogRlVOQ1RJT046ICAgIGZvciBub24tZGlyZWN0b3J5LCBjYWxsZWQgYnkgamZzX3JlbW92ZSgpLAorICoJCXRydW5jYXRlIGEgcmVndWxhciBmaWxlLCBkaXJlY3Rvcnkgb3Igc3ltYm9saWMKKyAqCQlsaW5rIHRvIHplcm8gbGVuZ3RoLiByZXR1cm4gMCBpZiB0eXBlIGlzIG5vdCAKKyAqCQlvbmUgb2YgdGhlc2UuCisgKgorICoJCWlmIHRoZSBmaWxlIGlzIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggYSBWTSBzZWdtZW50CisgKgkJb25seSBwZXJtYW5lbnQgZGlzayBhbmQgaW5vZGUgbWFwIHJlc291cmNlcyBhcmUgZnJlZWQsCisgKgkJYW5kIG5laXRoZXIgdGhlIGlub2RlIG5vciBpbmRpcmVjdCBibG9ja3MgYXJlIG1vZGlmaWVkCisgKgkJc28gdGhhdCB0aGUgcmVzb3VyY2VzIGNhbiBiZSBsYXRlciBmcmVlZCBpbiB0aGUgd29yaworICoJCW1hcCBieSBjdHJ1bmMxLgorICoJCWlmIHRoZXJlIGlzIG5vIFZNIHNlZ21lbnQgb24gZW50cnksIHRoZSByZXNvdXJjZXMgYXJlCisgKgkJZnJlZWQgaW4gYm90aCB3b3JrIGFuZCBwZXJtYW5lbnQgbWFwLgorICoJCSg/IGZvciB0ZW1wb3JhcnkgZmlsZSAtIG1lbW9yeSBvYmplY3QgaXMgY2FjaGVkIGV2ZW4gCisgKgkJYWZ0ZXIgbm8gcmVmZXJlbmNlOgorICoJCXJlZmVyZW5jZSBjb3VudCA+IDAgLSAgICkKKyAqCisgKiBQQVJBTUVURVJTOgljZAktIHBvaW50ZXIgdG8gY29tbWl0IGRhdGEgc3RydWN0dXJlLgorICoJCQkgIGN1cnJlbnQgaW5vZGUgaXMgdGhlIG9uZSB0byB0cnVuY2F0ZS4KKyAqCisgKiBSRVRVUk46CUVycm9ycyBmcm9tIHN1YnJvdXRpbmVzCisgKi8KK3N0YXRpYyBzNjQgY29tbWl0WmVyb0xpbmsodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwKQoreworCWludCBmaWxldHlwZTsKKwlzdHJ1Y3QgdGJsb2NrICp0YmxrOworCisJamZzX2luZm8oImNvbW1pdFplcm9MaW5rOiB0aWQgPSAlZCwgaXAgPSAweCVwIiwgdGlkLCBpcCk7CisKKwlmaWxldHlwZSA9IGlwLT5pX21vZGUgJiBTX0lGTVQ7CisJc3dpdGNoIChmaWxldHlwZSkgeworCWNhc2UgU19JRlJFRzoKKwkJYnJlYWs7CisJY2FzZSBTX0lGTE5LOgorCQkvKiBmYXN0IHN5bWJvbGljIGxpbmsgKi8KKwkJaWYgKGlwLT5pX3NpemUgPCBJREFUQVNJWkUpIHsKKwkJCWlwLT5pX3NpemUgPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYXNzZXJ0KGZpbGV0eXBlICE9IFNfSUZESVIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZXRfY2ZsYWcoQ09NTUlUX0ZyZWV3bWFwLCBpcCk7CisKKwkvKiBtYXJrIHRyYW5zYWN0aW9uIG9mIGJsb2NrIG1hcCB1cGRhdGUgdHlwZSAqLworCXRibGsgPSB0aWRfdG9fdGJsb2NrKHRpZCk7CisJdGJsay0+eGZsYWcgfD0gQ09NTUlUX1BNQVA7CisKKwkvKgorCSAqIGZyZWUgRUEKKwkgKi8KKwlpZiAoSkZTX0lQKGlwKS0+ZWEuZmxhZyAmIERYRF9FWFRFTlQpCisJCS8qIGFjcXVpcmUgbWFwbG9jayBvbiBFQSB0byBiZSBmcmVlZCBmcm9tIGJsb2NrIG1hcCAqLworCQl0eEVBKHRpZCwgaXAsICZKRlNfSVAoaXApLT5lYSwgTlVMTCk7CisKKwkvKgorCSAqIGZyZWUgQUNMCisJICovCisJaWYgKEpGU19JUChpcCktPmFjbC5mbGFnICYgRFhEX0VYVEVOVCkKKwkJLyogYWNxdWlyZSBtYXBsb2NrIG9uIEVBIHRvIGJlIGZyZWVkIGZyb20gYmxvY2sgbWFwICovCisJCXR4RUEodGlkLCBpcCwgJkpGU19JUChpcCktPmFjbCwgTlVMTCk7CisKKwkvKgorCSAqIGZyZWUgeHRyZWUvZGF0YSAodHJ1bmNhdGUgdG8gemVybyBsZW5ndGgpOgorCSAqIGZyZWUgeHRyZWUvZGF0YSBwYWdlcyBmcm9tIGNhY2hlIGlmIENPTU1JVF9QV01BUCwgCisJICogZnJlZSB4dHJlZS9kYXRhIGJsb2NrcyBmcm9tIHBlcnNpc3RlbnQgYmxvY2sgbWFwLCBhbmQKKwkgKiBmcmVlIHh0cmVlL2RhdGEgYmxvY2tzIGZyb20gd29ya2luZyBibG9jayBtYXAgaWYgQ09NTUlUX1BXTUFQOworCSAqLworCWlmIChpcC0+aV9zaXplKQorCQlyZXR1cm4geHRUcnVuY2F0ZV9wbWFwKHRpZCwgaXAsIDApOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIE5BTUU6CWZyZWVaZXJvTGluaygpCisgKgorICogRlVOQ1RJT046ICAgIGZvciBub24tZGlyZWN0b3J5LCBjYWxsZWQgYnkgaUNsb3NlKCksCisgKgkJZnJlZSByZXNvdXJjZXMgb2YgYSBmaWxlIGZyb20gY2FjaGUgYW5kIFdPUktJTkcgbWFwIAorICoJCWZvciBhIGZpbGUgcHJldmlvdXNseSBjb21taXR0ZWQgd2l0aCB6ZXJvIGxpbmsgY291bnQKKyAqCQl3aGlsZSBhc3NvY2lhdGVkIHdpdGggYSBwYWdlciBvYmplY3QsCisgKgorICogUEFSQU1FVEVSOglpcAktIHBvaW50ZXIgdG8gaW5vZGUgb2YgZmlsZS4KKyAqCisgKiBSRVRVUk46CTAgLW9rCisgKi8KK2ludCBmcmVlWmVyb0xpbmsoc3RydWN0IGlub2RlICppcCkKK3sKKwlpbnQgcmMgPSAwOworCWludCB0eXBlOworCisJamZzX2luZm8oImZyZWVaZXJvTGluazogaXAgPSAweCVwIiwgaXApOworCisJLyogcmV0dXJuIGlmIG5vdCByZWcgb3Igc3ltYm9saWMgbGluayBvciBpZiBzaXplIGlzCisJICogYWxyZWFkeSBvay4KKwkgKi8KKwl0eXBlID0gaXAtPmlfbW9kZSAmIFNfSUZNVDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU19JRlJFRzoKKwkJYnJlYWs7CisJY2FzZSBTX0lGTE5LOgorCQkvKiBpZiBpdHMgY29udGFpbmVkIGluIGlub2RlIG5vdGhpbmcgdG8gZG8gKi8KKwkJaWYgKGlwLT5pX3NpemUgPCBJREFUQVNJWkUpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBmcmVlIEVBCisJICovCisJaWYgKEpGU19JUChpcCktPmVhLmZsYWcgJiBEWERfRVhURU5UKSB7CisJCXM2NCB4YWRkciA9IGFkZHJlc3NEWEQoJkpGU19JUChpcCktPmVhKTsKKwkJaW50IHhsZW4gPSBsZW5ndGhEWEQoJkpGU19JUChpcCktPmVhKTsKKwkJc3RydWN0IG1hcGxvY2sgbWFwbG9jazsJLyogbWFwbG9jayBmb3IgQ09NTUlUX1dNQVAgKi8KKwkJc3RydWN0IHB4ZF9sb2NrICpweGRsb2NrOwkvKiBtYXBsb2NrIGZvciBDT01NSVRfV01BUCAqLworCisJCS8qIGZyZWUgRUEgcGFnZXMgZnJvbSBjYWNoZSAqLworCQlpbnZhbGlkYXRlX2R4ZF9tZXRhcGFnZXMoaXAsIEpGU19JUChpcCktPmVhKTsKKworCQkvKiBmcmVlIEVBIGV4dGVudCBmcm9tIHdvcmtpbmcgYmxvY2sgbWFwICovCisJCW1hcGxvY2suaW5kZXggPSAxOworCQlweGRsb2NrID0gKHN0cnVjdCBweGRfbG9jayAqKSAmIG1hcGxvY2s7CisJCXB4ZGxvY2stPmZsYWcgPSBtbGNrRlJFRVBYRDsKKwkJUFhEYWRkcmVzcygmcHhkbG9jay0+cHhkLCB4YWRkcik7CisJCVBYRGxlbmd0aCgmcHhkbG9jay0+cHhkLCB4bGVuKTsKKwkJdHhGcmVlTWFwKGlwLCBweGRsb2NrLCBOVUxMLCBDT01NSVRfV01BUCk7CisJfQorCisJLyoKKwkgKiBmcmVlIEFDTAorCSAqLworCWlmIChKRlNfSVAoaXApLT5hY2wuZmxhZyAmIERYRF9FWFRFTlQpIHsKKwkJczY0IHhhZGRyID0gYWRkcmVzc0RYRCgmSkZTX0lQKGlwKS0+YWNsKTsKKwkJaW50IHhsZW4gPSBsZW5ndGhEWEQoJkpGU19JUChpcCktPmFjbCk7CisJCXN0cnVjdCBtYXBsb2NrIG1hcGxvY2s7CS8qIG1hcGxvY2sgZm9yIENPTU1JVF9XTUFQICovCisJCXN0cnVjdCBweGRfbG9jayAqcHhkbG9jazsJLyogbWFwbG9jayBmb3IgQ09NTUlUX1dNQVAgKi8KKworCQlpbnZhbGlkYXRlX2R4ZF9tZXRhcGFnZXMoaXAsIEpGU19JUChpcCktPmFjbCk7CisKKwkJLyogZnJlZSBBQ0wgZXh0ZW50IGZyb20gd29ya2luZyBibG9jayBtYXAgKi8KKwkJbWFwbG9jay5pbmRleCA9IDE7CisJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopICYgbWFwbG9jazsKKwkJcHhkbG9jay0+ZmxhZyA9IG1sY2tGUkVFUFhEOworCQlQWERhZGRyZXNzKCZweGRsb2NrLT5weGQsIHhhZGRyKTsKKwkJUFhEbGVuZ3RoKCZweGRsb2NrLT5weGQsIHhsZW4pOworCQl0eEZyZWVNYXAoaXAsIHB4ZGxvY2ssIE5VTEwsIENPTU1JVF9XTUFQKTsKKwl9CisKKwkvKgorCSAqIGZyZWUgeHRyZWUvZGF0YSAodHJ1bmNhdGUgdG8gemVybyBsZW5ndGgpOgorCSAqIGZyZWUgeHRyZWUvZGF0YSBwYWdlcyBmcm9tIGNhY2hlLCBhbmQKKwkgKiBmcmVlIHh0cmVlL2RhdGEgYmxvY2tzIGZyb20gd29ya2luZyBibG9jayBtYXA7CisJICovCisJaWYgKGlwLT5pX3NpemUpCisJCXJjID0geHRUcnVuY2F0ZSgwLCBpcCwgMCwgQ09NTUlUX1dNQVApOworCisJcmV0dXJuIHJjOworfQorCisvKgorICogTkFNRToJamZzX2xpbmsodnAsIGR2cCwgbmFtZSwgY3JwKQorICoKKyAqIEZVTkNUSU9OOgljcmVhdGUgYSBsaW5rIHRvIDx2cD4gYnkgdGhlIG5hbWUgPSA8bmFtZT4KKyAqCQlpbiB0aGUgcGFyZW50IGRpcmVjdG9yeSA8ZHZwPgorICoKKyAqIFBBUkFNRVRFUjoJdnAgCS0gdGFyZ2V0IG9iamVjdAorICoJCWR2cAktIHBhcmVudCBkaXJlY3Rvcnkgb2YgbmV3IGxpbmsKKyAqCQluYW1lCS0gbmFtZSBvZiBuZXcgbGluayB0byB0YXJnZXQgb2JqZWN0CisgKgkJY3JwCS0gY3JlZGVudGlhbAorICoKKyAqIFJFVFVSTjoJRXJyb3JzIGZyb20gc3Vicm91dGluZXMKKyAqCisgKiBub3RlOgorICogSkZTIGRvZXMgTk9UIHN1cHBvcnQgbGluaygpIG9uIGRpcmVjdG9yaWVzICh0byBwcmV2ZW50IGNpcmN1bGFyCisgKiBwYXRoIGluIHRoZSBkaXJlY3RvcnkgaGllcmFyY2h5KTsKKyAqIEVQRVJNOiB0aGUgdGFyZ2V0IG9iamVjdCBpcyBhIGRpcmVjdG9yeSwgYW5kIGVpdGhlciB0aGUgY2FsbGVyCisgKiBkb2VzIG5vdCBoYXZlIGFwcHJvcHJpYXRlIHByaXZpbGVnZXMgb3IgdGhlIGltcGxlbWVudGF0aW9uIHByb2hpYml0cworICogdXNpbmcgbGluaygpIG9uIGRpcmVjdG9yaWVzIFtYUEc0LjJdLgorICoKKyAqIEpGUyBkb2VzIE5PVCBzdXBwb3J0IGxpbmtzIGJldHdlZW4gZmlsZSBzeXN0ZW1zOgorICogRVhERVY6IHRhcmdldCBvYmplY3QgYW5kIG5ldyBsaW5rIGFyZSBvbiBkaWZmZXJlbnQgZmlsZSBzeXN0ZW1zIGFuZAorICogaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCBsaW5rcyBiZXR3ZWVuIGZpbGUgc3lzdGVtcyBbWFBHNC4yXS4KKyAqLworc3RhdGljIGludCBqZnNfbGluayhzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorCSAgICAgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgcmM7CisJdGlkX3QgdGlkOworCXN0cnVjdCBpbm9kZSAqaXAgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCWlub190IGlubzsKKwlzdHJ1Y3QgY29tcG9uZW50X25hbWUgZG5hbWU7CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsKKwlzdHJ1Y3QgaW5vZGUgKmlwbGlzdFsyXTsKKworCWpmc19pbmZvKCJqZnNfbGluazogJXMgJXMiLCBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJaWYgKGlwLT5pX25saW5rID09IEpGU19MSU5LX01BWCkKKwkJcmV0dXJuIC1FTUxJTks7CisKKwlpZiAoaXAtPmlfbmxpbmsgPT0gMCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwl0aWQgPSB0eEJlZ2luKGlwLT5pX3NiLCAwKTsKKworCWRvd24oJkpGU19JUChkaXIpLT5jb21taXRfc2VtKTsKKwlkb3duKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKworCS8qCisJICogc2NhbiBwYXJlbnQgZGlyZWN0b3J5IGZvciBlbnRyeS9mcmVlc3BhY2UKKwkgKi8KKwlpZiAoKHJjID0gZ2V0X1VDU25hbWUoJmRuYW1lLCBkZW50cnkpKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoKHJjID0gZHRTZWFyY2goZGlyLCAmZG5hbWUsICZpbm8sICZidHN0YWNrLCBKRlNfQ1JFQVRFKSkpCisJCWdvdG8gZnJlZV9kbmFtZTsKKworCS8qCisJICogY3JlYXRlIGVudHJ5IGZvciBuZXcgbGluayBpbiBwYXJlbnQgZGlyZWN0b3J5CisJICovCisJaW5vID0gaXAtPmlfaW5vOworCWlmICgocmMgPSBkdEluc2VydCh0aWQsIGRpciwgJmRuYW1lLCAmaW5vLCAmYnRzdGFjaykpKQorCQlnb3RvIGZyZWVfZG5hbWU7CisKKwkvKiB1cGRhdGUgb2JqZWN0IGlub2RlICovCisJaXAtPmlfbmxpbmsrKzsJCS8qIGZvciBuZXcgbGluayAqLworCWlwLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKKwlhdG9taWNfaW5jKCZpcC0+aV9jb3VudCk7CisKKwlpcGxpc3RbMF0gPSBpcDsKKwlpcGxpc3RbMV0gPSBkaXI7CisJcmMgPSB0eENvbW1pdCh0aWQsIDIsICZpcGxpc3RbMF0sIDApOworCisJaWYgKHJjKSB7CisJCWlwLT5pX25saW5rLS07CisJCWlwdXQoaXApOworCX0gZWxzZQorCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaXApOworCisgICAgICBmcmVlX2RuYW1lOgorCWZyZWVfVUNTbmFtZSgmZG5hbWUpOworCisgICAgICBvdXQ6CisJdHhFbmQodGlkKTsKKworCXVwKCZKRlNfSVAoZGlyKS0+Y29tbWl0X3NlbSk7CisJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCisJamZzX2luZm8oImpmc19saW5rOiByYzolZCIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBOQU1FOglqZnNfc3ltbGluayhkaXAsIGRlbnRyeSwgbmFtZSkKKyAqCisgKiBGVU5DVElPTjoJY3JlYXRlcyBhIHN5bWJvbGljIGxpbmsgdG8gPHN5bWxpbms+IGJ5IG5hbWUgPG5hbWU+CisgKgkJICAgICAgICBpbiBkaXJlY3RvcnkgPGRpcD4KKyAqCisgKiBQQVJBTUVURVI6CWRpcAkgICAgLSBwYXJlbnQgZGlyZWN0b3J5IHZub2RlCisgKgkJICAgICAgICBkZW50cnkgCS0gZGVudHJ5IG9mIHN5bWJvbGljIGxpbmsKKyAqCQkgICAgICAgIG5hbWUgICAgLSB0aGUgcGF0aCBuYW1lIG9mIHRoZSBleGlzdGluZyBvYmplY3QgCisgKgkJCSAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIHRoZSBzb3VyY2Ugb2YgdGhlIGxpbmsKKyAqCisgKiBSRVRVUk46CWVycm9ycyBmcm9tIHN1YnJvdXRpbmVzCisgKgorICogbm90ZToKKyAqIEVOQU1FVE9PTE9ORzogcGF0aG5hbWUgcmVzb2x1dGlvbiBvZiBhIHN5bWJvbGljIGxpbmsgcHJvZHVjZWQKKyAqIGFuIGludGVybWVkaWF0ZSByZXN1bHQgd2hvc2UgbGVuZ3RoIGV4Y2VlZHMgUEFUSF9NQVggW1hQRzQuMl0KKyovCisKK3N0YXRpYyBpbnQgamZzX3N5bWxpbmsoc3RydWN0IGlub2RlICpkaXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgcmM7CisJdGlkX3QgdGlkOworCWlub190IGlubyA9IDA7CisJc3RydWN0IGNvbXBvbmVudF9uYW1lIGRuYW1lOworCWludCBzc2l6ZTsJCS8qIHNvdXJjZSBwYXRobmFtZSBzaXplICovCisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsKKwlzdHJ1Y3QgaW5vZGUgKmlwID0gZGVudHJ5LT5kX2lub2RlOworCXVuY2hhciAqaV9mYXN0c3ltbGluazsKKwlzNjQgeGxlbiA9IDA7CisJaW50IGJtYXNrID0gMCwgeHNpemU7CisJczY0IGV4dGVudCA9IDAsIHhhZGRyOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgdGJsb2NrICp0YmxrOworCisJc3RydWN0IGlub2RlICppcGxpc3RbMl07CisKKwlqZnNfaW5mbygiamZzX3N5bWxpbms6IGRpcDoweCVwIG5hbWU6JXMiLCBkaXAsIG5hbWUpOworCisJc3NpemUgPSBzdHJsZW4obmFtZSkgKyAxOworCisJLyoKKwkgKiBzZWFyY2ggcGFyZW50IGRpcmVjdG9yeSBmb3IgZW50cnkvZnJlZXNwYWNlCisJICogKGR0U2VhcmNoKCkgcmV0dXJucyBwYXJlbnQgZGlyZWN0b3J5IHBhZ2UgcGlubmVkKQorCSAqLworCisJaWYgKChyYyA9IGdldF9VQ1NuYW1lKCZkbmFtZSwgZGVudHJ5KSkpCisJCWdvdG8gb3V0MTsKKworCS8qCisJICogYWxsb2NhdGUgb24tZGlzay9pbi1tZW1vcnkgaW5vZGUgZm9yIHN5bWJvbGljIGxpbms6CisJICogKGlBbGxvYygpIHJldHVybnMgbmV3LCBsb2NrZWQgaW5vZGUpCisJICovCisJaXAgPSBpYWxsb2MoZGlwLCBTX0lGTE5LIHwgMDc3Nyk7CisJaWYgKGlwID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PU1BDOworCQlnb3RvIG91dDI7CisJfQorCisJdGlkID0gdHhCZWdpbihkaXAtPmlfc2IsIDApOworCisJZG93bigmSkZTX0lQKGRpcCktPmNvbW1pdF9zZW0pOworCWRvd24oJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCisJdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKKwl0YmxrLT54ZmxhZyB8PSBDT01NSVRfQ1JFQVRFOworCXRibGstPmlubyA9IGlwLT5pX2lubzsKKwl0YmxrLT51Lml4cHhkID0gSkZTX0lQKGlwKS0+aXhweGQ7CisKKwkvKiBmaXggc3ltbGluayBhY2Nlc3MgcGVybWlzc2lvbgorCSAqIChkaXJfY3JlYXRlKCkgQU5EcyBpbiB0aGUgdS51X2NtYXNrLCAKKwkgKiBidXQgc3ltbGlua3MgcmVhbGx5IG5lZWQgdG8gYmUgNzc3IGFjY2VzcykKKwkgKi8KKwlpcC0+aV9tb2RlIHw9IDA3Nzc7CisKKwkvKgorCSAqIHdyaXRlIHN5bWJvbGljIGxpbmsgdGFyZ2V0IHBhdGggbmFtZQorCSAqLworCXh0SW5pdFJvb3QodGlkLCBpcCk7CisKKwkvKgorCSAqIHdyaXRlIHNvdXJjZSBwYXRoIG5hbWUgaW5saW5lIGluIG9uLWRpc2sgaW5vZGUgKGZhc3Qgc3ltYm9saWMgbGluaykKKwkgKi8KKworCWlmIChzc2l6ZSA8PSBJREFUQVNJWkUpIHsKKwkJaXAtPmlfb3AgPSAmamZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKworCQlpX2Zhc3RzeW1saW5rID0gSkZTX0lQKGlwKS0+aV9pbmxpbmU7CisJCW1lbWNweShpX2Zhc3RzeW1saW5rLCBuYW1lLCBzc2l6ZSk7CisJCWlwLT5pX3NpemUgPSBzc2l6ZSAtIDE7CisKKwkJLyoKKwkJICogaWYgc3ltbGluayBpcyA+IDEyOCBieXRlcywgd2UgZG9uJ3QgaGF2ZSB0aGUgc3BhY2UgdG8KKwkJICogc3RvcmUgaW5saW5lIGV4dGVuZGVkIGF0dHJpYnV0ZXMKKwkJICovCisJCWlmIChzc2l6ZSA+IHNpemVvZiAoSkZTX0lQKGlwKS0+aV9pbmxpbmUpKQorCQkJSkZTX0lQKGlwKS0+bW9kZTIgJj0gfklOTElORUVBOworCisJCWpmc19pbmZvKCJqZnNfc3ltbGluazogZmFzdCBzeW1saW5rIGFkZGVkICBzc2l6ZTolZCBuYW1lOiVzICIsCisJCQkgc3NpemUsIG5hbWUpOworCX0KKwkvKgorCSAqIHdyaXRlIHNvdXJjZSBwYXRoIG5hbWUgaW4gYSBzaW5nbGUgZXh0ZW50CisJICovCisJZWxzZSB7CisJCWpmc19pbmZvKCJqZnNfc3ltbGluazogYWxsb2NhdGUgZXh0ZW50IGlwOjB4JXAiLCBpcCk7CisKKwkJaXAtPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWlwLT5pX21hcHBpbmctPmFfb3BzID0gJmpmc19hb3BzOworCisJCS8qCisJCSAqIGV2ZW4gdGhvdWdoIHRoZSBkYXRhIG9mIHN5bWxpbmsgb2JqZWN0IChzb3VyY2UgCisJCSAqIHBhdGggbmFtZSkgaXMgdHJlYXRlZCBhcyBub24tam91cm5hbGVkIHVzZXIgZGF0YSwKKwkJICogaXQgaXMgcmVhZC93cml0dGVuIHRocnUgYnVmZmVyIGNhY2hlIGZvciBwZXJmb3JtYW5jZS4KKwkJICovCisJCXNiID0gaXAtPmlfc2I7CisJCWJtYXNrID0gSkZTX1NCSShzYiktPmJzaXplIC0gMTsKKwkJeHNpemUgPSAoc3NpemUgKyBibWFzaykgJiB+Ym1hc2s7CisJCXhhZGRyID0gMDsKKwkJeGxlbiA9IHhzaXplID4+IEpGU19TQkkoc2IpLT5sMmJzaXplOworCQlpZiAoKHJjID0geHRJbnNlcnQodGlkLCBpcCwgMCwgMCwgeGxlbiwgJnhhZGRyLCAwKSkpIHsKKwkJCXR4QWJvcnQodGlkLCAwKTsKKwkJCXJjID0gLUVOT1NQQzsKKwkJCWdvdG8gb3V0MzsKKwkJfQorCQlleHRlbnQgPSB4YWRkcjsKKwkJaXAtPmlfc2l6ZSA9IHNzaXplIC0gMTsKKwkJd2hpbGUgKHNzaXplKSB7CisJCQkvKiBUaGlzIGlzIGtpbmQgb2Ygc2lsbHkgc2luY2UgUEFUSF9NQVggPT0gNEsgKi8KKwkJCWludCBjb3B5X3NpemUgPSBtaW4oc3NpemUsIFBTSVpFKTsKKworCQkJbXAgPSBnZXRfbWV0YXBhZ2UoaXAsIHhhZGRyLCBQU0laRSwgMSk7CisKKwkJCWlmIChtcCA9PSBOVUxMKSB7CisJCQkJeHRUcnVuY2F0ZSh0aWQsIGlwLCAwLCBDT01NSVRfUFdNQVApOworCQkJCXJjID0gLUVJTzsKKwkJCQl0eEFib3J0KHRpZCwgMCk7CisJCQkJZ290byBvdXQzOworCQkJfQorCQkJbWVtY3B5KG1wLT5kYXRhLCBuYW1lLCBjb3B5X3NpemUpOworCQkJZmx1c2hfbWV0YXBhZ2UobXApOworCQkJc3NpemUgLT0gY29weV9zaXplOworCQkJbmFtZSArPSBjb3B5X3NpemU7CisJCQl4YWRkciArPSBKRlNfU0JJKHNiKS0+bmJwZXJwYWdlOworCQl9CisJfQorCisJLyoKKwkgKiBjcmVhdGUgZW50cnkgZm9yIHN5bWJvbGljIGxpbmsgaW4gcGFyZW50IGRpcmVjdG9yeQorCSAqLworCXJjID0gZHRTZWFyY2goZGlwLCAmZG5hbWUsICZpbm8sICZidHN0YWNrLCBKRlNfQ1JFQVRFKTsKKwlpZiAocmMgPT0gMCkgeworCQlpbm8gPSBpcC0+aV9pbm87CisJCXJjID0gZHRJbnNlcnQodGlkLCBkaXAsICZkbmFtZSwgJmlubywgJmJ0c3RhY2spOworCX0KKwlpZiAocmMpIHsKKwkJaWYgKHhsZW4pCisJCQl4dFRydW5jYXRlKHRpZCwgaXAsIDAsIENPTU1JVF9QV01BUCk7CisJCXR4QWJvcnQodGlkLCAwKTsKKwkJLyogZGlzY2FyZCBuZXcgaW5vZGUgKi8KKwkJZ290byBvdXQzOworCX0KKworCWluc2VydF9pbm9kZV9oYXNoKGlwKTsKKwltYXJrX2lub2RlX2RpcnR5KGlwKTsKKworCS8qCisJICogY29tbWl0IHVwZGF0ZSBvZiBwYXJlbnQgZGlyZWN0b3J5IGFuZCBsaW5rIG9iamVjdAorCSAqLworCisJaXBsaXN0WzBdID0gZGlwOworCWlwbGlzdFsxXSA9IGlwOworCXJjID0gdHhDb21taXQodGlkLCAyLCAmaXBsaXN0WzBdLCAwKTsKKworICAgICAgb3V0MzoKKwl0eEVuZCh0aWQpOworCXVwKCZKRlNfSVAoZGlwKS0+Y29tbWl0X3NlbSk7CisJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCWlmIChyYykgeworCQlpcC0+aV9ubGluayA9IDA7CisJCWlwdXQoaXApOworCX0gZWxzZQorCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaXApOworCisgICAgICBvdXQyOgorCWZyZWVfVUNTbmFtZSgmZG5hbWUpOworCisjaWZkZWYgQ09ORklHX0pGU19QT1NJWF9BQ0wKKwlpZiAocmMgPT0gMCkKKwkJamZzX2luaXRfYWNsKGlwLCBkaXApOworI2VuZGlmCisKKyAgICAgIG91dDE6CisJamZzX2luZm8oImpmc19zeW1saW5rOiByYzolZCIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKworLyoKKyAqIE5BTUU6ICAgICAgICBqZnNfcmVuYW1lCisgKgorICogRlVOQ1RJT046ICAgIHJlbmFtZSBhIGZpbGUgb3IgZGlyZWN0b3J5CisgKi8KK3N0YXRpYyBpbnQgamZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJICAgICAgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwlzdHJ1Y3QgYnRzdGFjayBidHN0YWNrOworCWlub190IGlubzsKKwlzdHJ1Y3QgY29tcG9uZW50X25hbWUgbmV3X2RuYW1lOworCXN0cnVjdCBpbm9kZSAqbmV3X2lwOworCXN0cnVjdCBjb21wb25lbnRfbmFtZSBvbGRfZG5hbWU7CisJc3RydWN0IGlub2RlICpvbGRfaXA7CisJaW50IHJjOworCXRpZF90IHRpZDsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJc3RydWN0IGR0X2xvY2sgKmR0bGNrOworCXN0cnVjdCBsdiAqbHY7CisJaW50IGlwY291bnQ7CisJc3RydWN0IGlub2RlICppcGxpc3RbNF07CisJc3RydWN0IHRibG9jayAqdGJsazsKKwlzNjQgbmV3X3NpemUgPSAwOworCWludCBjb21taXRfZmxhZzsKKworCisJamZzX2luZm8oImpmc19yZW5hbWU6ICVzICVzIiwgb2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCSBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlvbGRfaXAgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCW5ld19pcCA9IG5ld19kZW50cnktPmRfaW5vZGU7CisKKwlpZiAoKHJjID0gZ2V0X1VDU25hbWUoJm9sZF9kbmFtZSwgb2xkX2RlbnRyeSkpKQorCQlnb3RvIG91dDE7CisKKwlpZiAoKHJjID0gZ2V0X1VDU25hbWUoJm5ld19kbmFtZSwgbmV3X2RlbnRyeSkpKQorCQlnb3RvIG91dDI7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBzb3VyY2UgaW5vZGUgbnVtYmVyIGlzIHdoYXQgd2UgdGhpbmsgaXQgaXMKKwkgKi8KKwlyYyA9IGR0U2VhcmNoKG9sZF9kaXIsICZvbGRfZG5hbWUsICZpbm8sICZidHN0YWNrLCBKRlNfTE9PS1VQKTsKKwlpZiAocmMgfHwgKGlubyAhPSBvbGRfaXAtPmlfaW5vKSkgeworCQlyYyA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0MzsKKwl9CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBkZXN0IGlub2RlIG51bWJlciAoaWYgYW55KSBpcyB3aGF0IHdlIHRoaW5rIGl0IGlzCisJICovCisJcmMgPSBkdFNlYXJjaChuZXdfZGlyLCAmbmV3X2RuYW1lLCAmaW5vLCAmYnRzdGFjaywgSkZTX0xPT0tVUCk7CisJaWYgKHJjID09IDApIHsKKwkJaWYgKChuZXdfaXAgPT0gMCkgfHwgKGlubyAhPSBuZXdfaXAtPmlfaW5vKSkgeworCQkJcmMgPSAtRVNUQUxFOworCQkJZ290byBvdXQzOworCQl9CisJfSBlbHNlIGlmIChyYyAhPSAtRU5PRU5UKQorCQlnb3RvIG91dDM7CisJZWxzZSBpZiAobmV3X2lwKSB7CisJCS8qIG5vIGVudHJ5IGV4aXN0cywgYnV0IG9uZSB3YXMgZXhwZWN0ZWQgKi8KKwkJcmMgPSAtRVNUQUxFOworCQlnb3RvIG91dDM7CisJfQorCisJaWYgKFNfSVNESVIob2xkX2lwLT5pX21vZGUpKSB7CisJCWlmIChuZXdfaXApIHsKKwkJCWlmICghZHRFbXB0eShuZXdfaXApKSB7CisJCQkJcmMgPSAtRU5PVEVNUFRZOworCQkJCWdvdG8gb3V0MzsKKwkJCX0KKwkJfSBlbHNlIGlmICgobmV3X2RpciAhPSBvbGRfZGlyKSAmJgorCQkJICAgKG5ld19kaXItPmlfbmxpbmsgPT0gSkZTX0xJTktfTUFYKSkgeworCQkJcmMgPSAtRU1MSU5LOworCQkJZ290byBvdXQzOworCQl9CisJfSBlbHNlIGlmIChuZXdfaXApIHsKKwkJSVdSSVRFX0xPQ0sobmV3X2lwKTsKKwkJLyogSW5pdCBpbm9kZSBmb3IgcXVvdGEgb3BlcmF0aW9ucy4gKi8KKwkJRFFVT1RfSU5JVChuZXdfaXApOworCX0KKworCS8qCisJICogVGhlIHJlYWwgd29yayBzdGFydHMgaGVyZQorCSAqLworCXRpZCA9IHR4QmVnaW4obmV3X2Rpci0+aV9zYiwgMCk7CisKKwlkb3duKCZKRlNfSVAobmV3X2RpciktPmNvbW1pdF9zZW0pOworCWRvd24oJkpGU19JUChvbGRfaXApLT5jb21taXRfc2VtKTsKKwlpZiAob2xkX2RpciAhPSBuZXdfZGlyKQorCQlkb3duKCZKRlNfSVAob2xkX2RpciktPmNvbW1pdF9zZW0pOworCisJaWYgKG5ld19pcCkgeworCQlkb3duKCZKRlNfSVAobmV3X2lwKS0+Y29tbWl0X3NlbSk7CisJCS8qCisJCSAqIENoYW5nZSBleGlzdGluZyBkaXJlY3RvcnkgZW50cnkgdG8gbmV3IGlub2RlIG51bWJlcgorCQkgKi8KKwkJaW5vID0gbmV3X2lwLT5pX2lubzsKKwkJcmMgPSBkdE1vZGlmeSh0aWQsIG5ld19kaXIsICZuZXdfZG5hbWUsICZpbm8sCisJCQkgICAgICBvbGRfaXAtPmlfaW5vLCBKRlNfUkVOQU1FKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ0OworCQluZXdfaXAtPmlfbmxpbmstLTsKKwkJaWYgKFNfSVNESVIobmV3X2lwLT5pX21vZGUpKSB7CisJCQluZXdfaXAtPmlfbmxpbmstLTsKKwkJCWlmIChuZXdfaXAtPmlfbmxpbmspIHsKKwkJCQl1cCgmSkZTX0lQKG5ld19kaXIpLT5jb21taXRfc2VtKTsKKwkJCQl1cCgmSkZTX0lQKG9sZF9pcCktPmNvbW1pdF9zZW0pOworCQkJCWlmIChvbGRfZGlyICE9IG5ld19kaXIpCisJCQkJCXVwKCZKRlNfSVAob2xkX2RpciktPmNvbW1pdF9zZW0pOworCQkJCWlmICghU19JU0RJUihvbGRfaXAtPmlfbW9kZSkgJiYgbmV3X2lwKQorCQkJCQlJV1JJVEVfVU5MT0NLKG5ld19pcCk7CisJCQkJamZzX2Vycm9yKG5ld19pcC0+aV9zYiwKKwkJCQkJICAiamZzX3JlbmFtZTogbmV3X2lwLT5pX25saW5rICE9IDAiKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCXRibGsgPSB0aWRfdG9fdGJsb2NrKHRpZCk7CisJCQl0YmxrLT54ZmxhZyB8PSBDT01NSVRfREVMRVRFOworCQkJdGJsay0+dS5pcCA9IG5ld19pcDsKKwkJfSBlbHNlIGlmIChuZXdfaXAtPmlfbmxpbmsgPT0gMCkgeworCQkJYXNzZXJ0KCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIG5ld19pcCkpOworCQkJLyogZnJlZSBibG9jayByZXNvdXJjZXMgKi8KKwkJCWlmICgobmV3X3NpemUgPSBjb21taXRaZXJvTGluayh0aWQsIG5ld19pcCkpIDwgMCkgeworCQkJCXR4QWJvcnQodGlkLCAxKTsJLyogTWFya3MgRlMgRGlydHkgKi8KKwkJCQlyYyA9IG5ld19zaXplOwkJCisJCQkJZ290byBvdXQ0OworCQkJfQorCQkJdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKKwkJCXRibGstPnhmbGFnIHw9IENPTU1JVF9ERUxFVEU7CisJCQl0YmxrLT51LmlwID0gbmV3X2lwOworCQl9IGVsc2UgeworCQkJbmV3X2lwLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCQkJbWFya19pbm9kZV9kaXJ0eShuZXdfaXApOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQWRkIG5ldyBkaXJlY3RvcnkgZW50cnkKKwkJICovCisJCXJjID0gZHRTZWFyY2gobmV3X2RpciwgJm5ld19kbmFtZSwgJmlubywgJmJ0c3RhY2ssCisJCQkgICAgICBKRlNfQ1JFQVRFKTsKKwkJaWYgKHJjKSB7CisJCQlqZnNfZXJyKCJqZnNfcmVuYW1lIGRpZG4ndCBleHBlY3QgZHRTZWFyY2ggdG8gZmFpbCAiCisJCQkJIncvcmMgPSAlZCIsIHJjKTsKKwkJCWdvdG8gb3V0NDsKKwkJfQorCisJCWlubyA9IG9sZF9pcC0+aV9pbm87CisJCXJjID0gZHRJbnNlcnQodGlkLCBuZXdfZGlyLCAmbmV3X2RuYW1lLCAmaW5vLCAmYnRzdGFjayk7CisJCWlmIChyYykgeworCQkJaWYgKHJjID09IC1FSU8pCisJCQkJamZzX2VycigiamZzX3JlbmFtZTogZHRJbnNlcnQgcmV0dXJuZWQgLUVJTyIpOworCQkJZ290byBvdXQ0OworCQl9CisJCWlmIChTX0lTRElSKG9sZF9pcC0+aV9tb2RlKSkKKwkJCW5ld19kaXItPmlfbmxpbmsrKzsKKwl9CisJLyoKKwkgKiBSZW1vdmUgb2xkIGRpcmVjdG9yeSBlbnRyeQorCSAqLworCisJaW5vID0gb2xkX2lwLT5pX2lubzsKKwlyYyA9IGR0RGVsZXRlKHRpZCwgb2xkX2RpciwgJm9sZF9kbmFtZSwgJmlubywgSkZTX1JFTU9WRSk7CisJaWYgKHJjKSB7CisJCWpmc19lcnIoImpmc19yZW5hbWUgZGlkIG5vdCBleHBlY3QgZHREZWxldGUgdG8gcmV0dXJuIHJjID0gJWQiLAorCQkJcmMpOworCQl0eEFib3J0KHRpZCwgMSk7CS8qIE1hcmtzIEZpbGVzeXN0ZW0gZGlydHkgKi8KKwkJZ290byBvdXQ0OworCX0KKwlpZiAoU19JU0RJUihvbGRfaXAtPmlfbW9kZSkpIHsKKwkJb2xkX2Rpci0+aV9ubGluay0tOworCQlpZiAob2xkX2RpciAhPSBuZXdfZGlyKSB7CisJCQkvKgorCQkJICogQ2hhbmdlIGlub2RlIG51bWJlciBvZiBwYXJlbnQgZm9yIG1vdmVkIGRpcmVjdG9yeQorCQkJICovCisKKwkJCUpGU19JUChvbGRfaXApLT5pX2R0cm9vdC5oZWFkZXIuaWRvdGRvdCA9CisJCQkJY3B1X3RvX2xlMzIobmV3X2Rpci0+aV9pbm8pOworCisJCQkvKiBMaW5lbG9jayBoZWFkZXIgb2YgZHRyZWUgKi8KKwkJCXRsY2sgPSB0eExvY2sodGlkLCBvbGRfaXAsCisJCQkJICAgIChzdHJ1Y3QgbWV0YXBhZ2UgKikgJkpGU19JUChvbGRfaXApLT5ieGZsYWcsCisJCQkJICAgICAgdGxja0RUUkVFIHwgdGxja0JUUk9PVCB8IHRsY2tSRUxJTkspOworCQkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCQkJQVNTRVJUKGR0bGNrLT5pbmRleCA9PSAwKTsKKwkJCWx2ID0gJiBkdGxjay0+bHZbMF07CisJCQlsdi0+b2Zmc2V0ID0gMDsKKwkJCWx2LT5sZW5ndGggPSAxOworCQkJZHRsY2stPmluZGV4Kys7CisJCX0KKwl9CisKKwkvKgorCSAqIFVwZGF0ZSBjdGltZSBvbiBjaGFuZ2VkL21vdmVkIGlub2RlcyAmIG1hcmsgZGlydHkKKwkgKi8KKwlvbGRfaXAtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJbWFya19pbm9kZV9kaXJ0eShvbGRfaXApOworCisJbmV3X2Rpci0+aV9jdGltZSA9IG5ld19kaXItPmlfbXRpbWUgPSBjdXJyZW50X2ZzX3RpbWUobmV3X2Rpci0+aV9zYik7CisJbWFya19pbm9kZV9kaXJ0eShuZXdfZGlyKTsKKworCS8qIEJ1aWxkIGxpc3Qgb2YgaW5vZGVzIG1vZGlmaWVkIGJ5IHRoaXMgdHJhbnNhY3Rpb24gKi8KKwlpcGNvdW50ID0gMDsKKwlpcGxpc3RbaXBjb3VudCsrXSA9IG9sZF9pcDsKKwlpZiAobmV3X2lwKQorCQlpcGxpc3RbaXBjb3VudCsrXSA9IG5ld19pcDsKKwlpcGxpc3RbaXBjb3VudCsrXSA9IG9sZF9kaXI7CisKKwlpZiAob2xkX2RpciAhPSBuZXdfZGlyKSB7CisJCWlwbGlzdFtpcGNvdW50KytdID0gbmV3X2RpcjsKKwkJb2xkX2Rpci0+aV9jdGltZSA9IG9sZF9kaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CisJCW1hcmtfaW5vZGVfZGlydHkob2xkX2Rpcik7CisJfQorCisJLyoKKwkgKiBJbmNvbXBsZXRlIHRydW5jYXRlIG9mIGZpbGUgZGF0YSBjYW4KKwkgKiByZXN1bHQgaW4gdGltaW5nIHByb2JsZW1zIHVubGVzcyB3ZSBzeW5jaHJvbm91c2x5IGNvbW1pdCB0aGUKKwkgKiB0cmFuc2FjdGlvbi4KKwkgKi8KKwlpZiAobmV3X3NpemUpCisJCWNvbW1pdF9mbGFnID0gQ09NTUlUX1NZTkM7CisJZWxzZQorCQljb21taXRfZmxhZyA9IDA7CisKKwlyYyA9IHR4Q29tbWl0KHRpZCwgaXBjb3VudCwgaXBsaXN0LCBjb21taXRfZmxhZyk7CisKKyAgICAgIG91dDQ6CisJdHhFbmQodGlkKTsKKworCXVwKCZKRlNfSVAobmV3X2RpciktPmNvbW1pdF9zZW0pOworCXVwKCZKRlNfSVAob2xkX2lwKS0+Y29tbWl0X3NlbSk7CisJaWYgKG9sZF9kaXIgIT0gbmV3X2RpcikKKwkJdXAoJkpGU19JUChvbGRfZGlyKS0+Y29tbWl0X3NlbSk7CisJaWYgKG5ld19pcCkKKwkJdXAoJkpGU19JUChuZXdfaXApLT5jb21taXRfc2VtKTsKKworCXdoaWxlIChuZXdfc2l6ZSAmJiAocmMgPT0gMCkpIHsKKwkJdGlkID0gdHhCZWdpbihuZXdfaXAtPmlfc2IsIDApOworCQlkb3duKCZKRlNfSVAobmV3X2lwKS0+Y29tbWl0X3NlbSk7CisJCW5ld19zaXplID0geHRUcnVuY2F0ZV9wbWFwKHRpZCwgbmV3X2lwLCBuZXdfc2l6ZSk7CisJCWlmIChuZXdfc2l6ZSA8IDApIHsKKwkJCXR4QWJvcnQodGlkLCAxKTsKKwkJCXJjID0gbmV3X3NpemU7CQkKKwkJfSBlbHNlCisJCQlyYyA9IHR4Q29tbWl0KHRpZCwgMSwgJm5ld19pcCwgQ09NTUlUX1NZTkMpOworCQl0eEVuZCh0aWQpOworCQl1cCgmSkZTX0lQKG5ld19pcCktPmNvbW1pdF9zZW0pOworCX0KKwlpZiAobmV3X2lwICYmIChuZXdfaXAtPmlfbmxpbmsgPT0gMCkpCisJCXNldF9jZmxhZyhDT01NSVRfTm9saW5rLCBuZXdfaXApOworICAgICAgb3V0MzoKKwlmcmVlX1VDU25hbWUoJm5ld19kbmFtZSk7CisgICAgICBvdXQyOgorCWZyZWVfVUNTbmFtZSgmb2xkX2RuYW1lKTsKKyAgICAgIG91dDE6CisJaWYgKG5ld19pcCAmJiAhU19JU0RJUihuZXdfaXAtPmlfbW9kZSkpCisJCUlXUklURV9VTkxPQ0sobmV3X2lwKTsKKwkvKgorCSAqIFRydW5jYXRpbmcgdGhlIGRpcmVjdG9yeSBpbmRleCB0YWJsZSBpcyBub3QgZ3VhcmFudGVlZC4gIEl0CisJICogbWF5IG5lZWQgdG8gYmUgZG9uZSBpdGVyYXRpdmVseQorCSAqLworCWlmICh0ZXN0X2NmbGFnKENPTU1JVF9TdGFsZSwgb2xkX2RpcikpIHsKKwkJaWYgKG9sZF9kaXItPmlfc2l6ZSA+IDEpCisJCQlqZnNfdHJ1bmNhdGVfbm9sb2NrKG9sZF9kaXIsIDApOworCisJCWNsZWFyX2NmbGFnKENPTU1JVF9TdGFsZSwgb2xkX2Rpcik7CisJfQorCisJamZzX2luZm8oImpmc19yZW5hbWU6IHJldHVybmluZyAlZCIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKworLyoKKyAqIE5BTUU6ICAgICAgICBqZnNfbWtub2QKKyAqCisgKiBGVU5DVElPTjogICAgQ3JlYXRlIGEgc3BlY2lhbCBmaWxlIChkZXZpY2UpCisgKi8KK3N0YXRpYyBpbnQgamZzX21rbm9kKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCWludCBtb2RlLCBkZXZfdCByZGV2KQoreworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamZzX2lwOworCXN0cnVjdCBidHN0YWNrIGJ0c3RhY2s7CisJc3RydWN0IGNvbXBvbmVudF9uYW1lIGRuYW1lOworCWlub190IGlubzsKKwlzdHJ1Y3QgaW5vZGUgKmlwOworCXN0cnVjdCBpbm9kZSAqaXBsaXN0WzJdOworCWludCByYzsKKwl0aWRfdCB0aWQ7CisJc3RydWN0IHRibG9jayAqdGJsazsKKworCWlmICghbmV3X3ZhbGlkX2RldihyZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlqZnNfaW5mbygiamZzX21rbm9kOiAlcyIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJaWYgKChyYyA9IGdldF9VQ1NuYW1lKCZkbmFtZSwgZGVudHJ5KSkpCisJCWdvdG8gb3V0OworCisJaXAgPSBpYWxsb2MoZGlyLCBtb2RlKTsKKwlpZiAoaXAgPT0gTlVMTCkgeworCQlyYyA9IC1FTk9TUEM7CisJCWdvdG8gb3V0MTsKKwl9CisJamZzX2lwID0gSkZTX0lQKGlwKTsKKworCXRpZCA9IHR4QmVnaW4oZGlyLT5pX3NiLCAwKTsKKworCWRvd24oJkpGU19JUChkaXIpLT5jb21taXRfc2VtKTsKKwlkb3duKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKworCWlmICgocmMgPSBkdFNlYXJjaChkaXIsICZkbmFtZSwgJmlubywgJmJ0c3RhY2ssIEpGU19DUkVBVEUpKSkKKwkJZ290byBvdXQzOworCisJdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKKwl0YmxrLT54ZmxhZyB8PSBDT01NSVRfQ1JFQVRFOworCXRibGstPmlubyA9IGlwLT5pX2lubzsKKwl0YmxrLT51Lml4cHhkID0gSkZTX0lQKGlwKS0+aXhweGQ7CisKKwlpbm8gPSBpcC0+aV9pbm87CisJaWYgKChyYyA9IGR0SW5zZXJ0KHRpZCwgZGlyLCAmZG5hbWUsICZpbm8sICZidHN0YWNrKSkpCisJCWdvdG8gb3V0MzsKKworCWlwLT5pX29wID0gJmpmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJamZzX2lwLT5kZXYgPSBuZXdfZW5jb2RlX2RldihyZGV2KTsKKwlpbml0X3NwZWNpYWxfaW5vZGUoaXAsIGlwLT5pX21vZGUsIHJkZXYpOworCisJaW5zZXJ0X2lub2RlX2hhc2goaXApOworCW1hcmtfaW5vZGVfZGlydHkoaXApOworCisJZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOworCisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCisJaXBsaXN0WzBdID0gZGlyOworCWlwbGlzdFsxXSA9IGlwOworCXJjID0gdHhDb21taXQodGlkLCAyLCBpcGxpc3QsIDApOworCisgICAgICBvdXQzOgorCXR4RW5kKHRpZCk7CisJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCXVwKCZKRlNfSVAoZGlyKS0+Y29tbWl0X3NlbSk7CisJaWYgKHJjKSB7CisJCWlwLT5pX25saW5rID0gMDsKKwkJaXB1dChpcCk7CisJfSBlbHNlCisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpcCk7CisKKyAgICAgIG91dDE6CisJZnJlZV9VQ1NuYW1lKCZkbmFtZSk7CisKKyNpZmRlZiBDT05GSUdfSkZTX1BPU0lYX0FDTAorCWlmIChyYyA9PSAwKQorCQlqZnNfaW5pdF9hY2woaXAsIGRpcik7CisjZW5kaWYKKworICAgICAgb3V0OgorCWpmc19pbmZvKCJqZnNfbWtub2Q6IHJldHVybmluZyAlZCIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpqZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBidHN0YWNrIGJ0c3RhY2s7CisJaW5vX3QgaW51bTsKKwlzdHJ1Y3QgaW5vZGUgKmlwOworCXN0cnVjdCBjb21wb25lbnRfbmFtZSBrZXk7CisJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJaW50IGxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwlpbnQgcmM7CisKKwlqZnNfaW5mbygiamZzX2xvb2t1cDogbmFtZSA9ICVzIiwgbmFtZSk7CisKKworCWlmICgobmFtZVswXSA9PSAnLicpICYmIChsZW4gPT0gMSkpCisJCWludW0gPSBkaXAtPmlfaW5vOworCWVsc2UgaWYgKHN0cmNtcChuYW1lLCAiLi4iKSA9PSAwKQorCQlpbnVtID0gUEFSRU5UKGRpcCk7CisJZWxzZSB7CisJCWlmICgocmMgPSBnZXRfVUNTbmFtZSgma2V5LCBkZW50cnkpKSkKKwkJCXJldHVybiBFUlJfUFRSKHJjKTsKKwkJcmMgPSBkdFNlYXJjaChkaXAsICZrZXksICZpbnVtLCAmYnRzdGFjaywgSkZTX0xPT0tVUCk7CisJCWZyZWVfVUNTbmFtZSgma2V5KTsKKwkJaWYgKHJjID09IC1FTk9FTlQpIHsKKwkJCWRfYWRkKGRlbnRyeSwgTlVMTCk7CisJCQlyZXR1cm4gRVJSX1BUUigwKTsKKwkJfSBlbHNlIGlmIChyYykgeworCQkJamZzX2VycigiamZzX2xvb2t1cDogZHRTZWFyY2ggcmV0dXJuZWQgJWQiLCByYyk7CisJCQlyZXR1cm4gRVJSX1BUUihyYyk7CisJCX0KKwl9CisKKwlpcCA9IGlnZXQoZGlwLT5pX3NiLCBpbnVtKTsKKwlpZiAoaXAgPT0gTlVMTCB8fCBpc19iYWRfaW5vZGUoaXApKSB7CisJCWpmc19lcnIoImpmc19sb29rdXA6IGlnZXQgZmFpbGVkIG9uIGludW0gJWQiLCAodWludCkgaW51bSk7CisJCWlmIChpcCkKKwkJCWlwdXQoaXApOworCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKwl9CisKKwlpZiAoSkZTX1NCSShkaXAtPmlfc2IpLT5tbnRmbGFnICYgSkZTX09TMikKKwkJZGVudHJ5LT5kX29wID0gJmpmc19jaV9kZW50cnlfb3BlcmF0aW9uczsKKworCWRlbnRyeSA9IGRfc3BsaWNlX2FsaWFzKGlwLCBkZW50cnkpOworCisJaWYgKGRlbnRyeSAmJiAoSkZTX1NCSShkaXAtPmlfc2IpLT5tbnRmbGFnICYgSkZTX09TMikpCisJCWRlbnRyeS0+ZF9vcCA9ICZqZnNfY2lfZGVudHJ5X29wZXJhdGlvbnM7CisKKwlyZXR1cm4gZGVudHJ5OworfQorCitzdHJ1Y3QgZGVudHJ5ICpqZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQgPSBFUlJfUFRSKC1FTk9FTlQpOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJdW5zaWduZWQgbG9uZyBwYXJlbnRfaW5vOworCisJcGFyZW50X2lubyA9CisJCWxlMzJfdG9fY3B1KEpGU19JUChkZW50cnktPmRfaW5vZGUpLT5pX2R0cm9vdC5oZWFkZXIuaWRvdGRvdCk7CisJaW5vZGUgPSBpZ2V0KHNiLCBwYXJlbnRfaW5vKTsKKwlpZiAoaW5vZGUpIHsKKwkJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKKwkJCWlwdXQoaW5vZGUpOworCQkJcGFyZW50ID0gRVJSX1BUUigtRUFDQ0VTKTsKKwkJfSBlbHNlIHsKKwkJCXBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisJCQlpZiAoIXBhcmVudCkgeworCQkJCXBhcmVudCA9IEVSUl9QVFIoLUVOT01FTSk7CisJCQkJaXB1dChpbm9kZSk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcGFyZW50OworfQorCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBqZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmNyZWF0ZQkJPSBqZnNfY3JlYXRlLAorCS5sb29rdXAJCT0gamZzX2xvb2t1cCwKKwkubGluawkJPSBqZnNfbGluaywKKwkudW5saW5rCQk9IGpmc191bmxpbmssCisJLnN5bWxpbmsJPSBqZnNfc3ltbGluaywKKwkubWtkaXIJCT0gamZzX21rZGlyLAorCS5ybWRpcgkJPSBqZnNfcm1kaXIsCisJLm1rbm9kCQk9IGpmc19ta25vZCwKKwkucmVuYW1lCQk9IGpmc19yZW5hbWUsCisJLnNldHhhdHRyCT0gamZzX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGpmc19nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gamZzX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBqZnNfcmVtb3ZleGF0dHIsCisjaWZkZWYgQ09ORklHX0pGU19QT1NJWF9BQ0wKKwkuc2V0YXR0cgk9IGpmc19zZXRhdHRyLAorCS5wZXJtaXNzaW9uCT0gamZzX3Blcm1pc3Npb24sCisjZW5kaWYKK307CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgamZzX2Rpcl9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBqZnNfcmVhZGRpciwKKwkuZnN5bmMJCT0gamZzX2ZzeW5jLAorfTsKKworc3RhdGljIGludCBqZnNfY2lfaGFzaChzdHJ1Y3QgZGVudHJ5ICpkaXIsIHN0cnVjdCBxc3RyICp0aGlzKQoreworCXVuc2lnbmVkIGxvbmcgaGFzaDsKKwlpbnQgaTsKKworCWhhc2ggPSBpbml0X25hbWVfaGFzaCgpOworCWZvciAoaT0wOyBpIDwgdGhpcy0+bGVuOyBpKyspCisJCWhhc2ggPSBwYXJ0aWFsX25hbWVfaGFzaCh0b2xvd2VyKHRoaXMtPm5hbWVbaV0pLCBoYXNoKTsKKwl0aGlzLT5oYXNoID0gZW5kX25hbWVfaGFzaChoYXNoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGpmc19jaV9jb21wYXJlKHN0cnVjdCBkZW50cnkgKmRpciwgc3RydWN0IHFzdHIgKmEsIHN0cnVjdCBxc3RyICpiKQoreworCWludCBpLCByZXN1bHQgPSAxOworCisJaWYgKGEtPmxlbiAhPSBiLT5sZW4pCisJCWdvdG8gb3V0OworCWZvciAoaT0wOyBpIDwgYS0+bGVuOyBpKyspIHsKKwkJaWYgKHRvbG93ZXIoYS0+bmFtZVtpXSkgIT0gdG9sb3dlcihiLT5uYW1lW2ldKSkKKwkJCWdvdG8gb3V0OworCX0KKwlyZXN1bHQgPSAwOworCisJLyoKKwkgKiBXZSB3YW50IGNyZWF0ZXMgdG8gcHJlc2VydmUgY2FzZS4gIEEgbmVnYXRpdmUgZGVudHJ5LCBhLCB0aGF0CisJICogaGFzIGEgZGlmZmVyZW50IGNhc2UgdGhhbiBiIG1heSBjYXVzZSBhIG5ldyBlbnRyeSB0byBiZSBjcmVhdGVkCisJICogd2l0aCB0aGUgd3JvbmcgY2FzZS4gIFNpbmNlIHdlIGNhbid0IHRlbGwgaWYgYSBjb21lcyBmcm9tIGEgbmVnYXRpdmUKKwkgKiBkZW50cnksIHdlIGJsaW5kbHkgcmVwbGFjZSBpdCB3aXRoIGIuICBUaGlzIHNob3VsZCBiZSBoYXJtbGVzcyBpZgorCSAqIGEgaXMgbm90IGEgbmVnYXRpdmUgZGVudHJ5LgorCSAqLworCW1lbWNweSgodW5zaWduZWQgY2hhciAqKWEtPm5hbWUsIGItPm5hbWUsIGEtPmxlbik7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGpmc19jaV9kZW50cnlfb3BlcmF0aW9ucyA9Cit7CisJLmRfaGFzaCA9IGpmc19jaV9oYXNoLAorCS5kX2NvbXBhcmUgPSBqZnNfY2lfY29tcGFyZSwKK307CmRpZmYgLS1naXQgYS9mcy9qZnMvcmVzaXplLmMgYi9mcy9qZnMvcmVzaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViNjg2OQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9yZXNpemUuYwpAQCAtMCwwICsxLDUzNyBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMC0yMDA0CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSAiamZzX2luY29yZS5oIgorI2luY2x1ZGUgImpmc19maWxzeXMuaCIKKyNpbmNsdWRlICJqZnNfbWV0YXBhZ2UuaCIKKyNpbmNsdWRlICJqZnNfZGlub2RlLmgiCisjaW5jbHVkZSAiamZzX2ltYXAuaCIKKyNpbmNsdWRlICJqZnNfZG1hcC5oIgorI2luY2x1ZGUgImpmc19zdXBlcmJsb2NrLmgiCisjaW5jbHVkZSAiamZzX3R4bm1nci5oIgorI2luY2x1ZGUgImpmc19kZWJ1Zy5oIgorCisjZGVmaW5lIEJJVFNQRVJQQUdFICAgICAoUFNJWkUgPDwgMykKKyNkZWZpbmUgTDJNRUdBQllURSAgICAgIDIwCisjZGVmaW5lIE1FR0FCWVRFICAgICAgICAoMSA8PCBMMk1FR0FCWVRFKQorI2RlZmluZSBNRUdBQllURTMyICAgICAoTUVHQUJZVEUgPDwgNSkKKworLyogY29udmVydCBibG9jayBudW1iZXIgdG8gYm1hcCBmaWxlIHBhZ2UgbnVtYmVyICovCisjZGVmaW5lIEJMS1RPRE1BUE4oYilcCisgICAgICAgICgoKGIpID4+IDEzKSArICgoYikgPj4gMjMpICsgKChiKSA+PiAzMykgKyAzICsgMSkKKworLyoKKyAqICAgICAgamZzX2V4dGVuZGZzKCkKKyAqCisgKiBmdW5jdGlvbjogZXh0ZW5kIGZpbGUgc3lzdGVtOworICoKKyAqICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICogICBmaWxlIHN5c3RlbSBzcGFjZSAgICAgICAgICAgICAgIGZzY2sgICAgICAgaW5saW5lIGxvZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzcGFjZSAgc3BhY2UKKyAqCisgKiBpbnB1dDoKKyAqICAgICAgbmV3IExWU2l6ZTogaW4gTFYgYmxvY2tzIChyZXF1aXJlZCkKKyAqICAgICAgbmV3IExvZ1NpemU6IGluIExWIGJsb2NrcyAob3B0aW9uYWwpCisgKiAgICAgIG5ldyBGU1NpemU6IGluIExWIGJsb2NrcyAob3B0aW9uYWwpCisgKgorICogbmV3IGNvbmZpZ3VyYXRpb246CisgKiAxLiBzZXQgbmV3IExvZ1NpemUgYXMgc3BlY2lmaWVkIG9yIGRlZmF1bHQgZnJvbSBuZXcgTFZTaXplOworICogMi4gY29tcHV0ZSBuZXcgRlNDS1NpemUgZnJvbSBuZXcgTFZTaXplOworICogMy4gc2V0IG5ldyBGU1NpemUgYXMgTUlOKEZTU2l6ZSwgTFZTaXplLShMb2dTaXplK0ZTQ0tTaXplKSkgd2hlcmUKKyAqICAgIGFzc2VydChuZXcgRlNTaXplID49IG9sZCBGU1NpemUpLAorICogICAgaS5lLiwgZmlsZSBzeXN0ZW0gbXVzdCBub3QgYmUgc2hyaW5rZWQ7CisgKi8KK2ludCBqZnNfZXh0ZW5kZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgczY0IG5ld0xWU2l6ZSwgaW50IG5ld0xvZ1NpemUpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoc2IpOworCXN0cnVjdCBpbm9kZSAqaXBibWFwID0gc2JpLT5pcGJtYXA7CisJc3RydWN0IGlub2RlICppcGJtYXAyOworCXN0cnVjdCBpbm9kZSAqaXBpbWFwID0gc2JpLT5pcGltYXA7CisJc3RydWN0IGpmc19sb2cgKmxvZyA9IHNiaS0+bG9nOworCXN0cnVjdCBibWFwICpibXAgPSBzYmktPmJtYXA7CisJczY0IG5ld0xvZ0FkZHJlc3MsIG5ld0ZTQ0tBZGRyZXNzOworCWludCBuZXdGU0NLU2l6ZTsKKwlzNjQgbmV3TWFwU2l6ZSA9IDAsIG1hcFNpemU7CisJczY0IFhBZGRyZXNzLCBYU2l6ZSwgbmJsb2NrcywgeG9mZiwgeGFkZHIsIHQ2NDsKKwlzNjQgb2xkTFZTaXplOworCXM2NCBuZXdGU1NpemU7CisJczY0IFZvbHVtZVNpemU7CisJaW50IG5ld05wYWdlcyA9IDAsIG5QYWdlcywgbmV3UGFnZSwgeGxlbiwgdDMyOworCWludCB0aWQ7CisJaW50IGxvZ19mb3JtYXR0ZWQgPSAwOworCXN0cnVjdCBpbm9kZSAqaXBsaXN0WzFdOworCXN0cnVjdCBqZnNfc3VwZXJibG9jayAqal9zYiwgKmpfc2IyOworCXVpbnQgb2xkX2Fnc2l6ZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqYmgyOworCisJLyogSWYgdGhlIHZvbHVtZSBoYXNuJ3QgZ3Jvd24sIGdldCBvdXQgbm93ICovCisKKwlpZiAoc2JpLT5tbnRmbGFnICYgSkZTX0lOTElORUxPRykKKwkJb2xkTFZTaXplID0gYWRkcmVzc1BYRCgmc2JpLT5sb2dweGQpICsgbGVuZ3RoUFhEKCZzYmktPmxvZ3B4ZCk7CisJZWxzZQorCQlvbGRMVlNpemUgPSBhZGRyZXNzUFhEKCZzYmktPmZzY2tweGQpICsKKwkJICAgIGxlbmd0aFBYRCgmc2JpLT5mc2NrcHhkKTsKKworCWlmIChvbGRMVlNpemUgPj0gbmV3TFZTaXplKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJqZnNfZXh0ZW5kZnM6IHZvbHVtZSBoYXNuJ3QgZ3Jvd24sIHJldHVybmluZ1xuIik7CisJCWdvdG8gb3V0OworCX0KKworCVZvbHVtZVNpemUgPSBzYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9zaXplID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCisJaWYgKFZvbHVtZVNpemUpIHsKKwkJaWYgKG5ld0xWU2l6ZSA+IFZvbHVtZVNpemUpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmc19leHRlbmRmczogaW52YWxpZCBzaXplXG4iKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIHsKKwkJLyogY2hlY2sgdGhlIGRldmljZSAqLworCQliaCA9IHNiX2JyZWFkKHNiLCBuZXdMVlNpemUgLSAxKTsKKwkJaWYgKCFiaCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZzX2V4dGVuZGZzOiBpbnZhbGlkIHNpemVcbiIpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJYmZvcmdldChiaCk7CisJfQorCisJLyogQ2FuJ3QgZXh0ZW5kIHdyaXRlLXByb3RlY3RlZCBkcml2ZSAqLworCisJaWYgKGlzUmVhZE9ubHkoaXBibWFwKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZnNfZXh0ZW5kZnM6IHJlYWQtb25seSBmaWxlIHN5c3RlbVxuIik7CisJCXJjID0gLUVST0ZTOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqICAgICAgcmVjb25maWd1cmUgTFYgc3BhY2VzCisJICogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKgorCSAqIHZhbGlkYXRlIG5ldyBzaXplLCBvciwgaWYgbm90IHNwZWNpZmllZCwgZGV0ZXJtaW5lIG5ldyBzaXplCisJICovCisKKwkvKgorCSAqIHJlY29uZmlndXJlIGlubGluZSBsb2cgc3BhY2U6CisJICovCisJaWYgKChzYmktPm1udGZsYWcgJiBKRlNfSU5MSU5FTE9HKSkgeworCQlpZiAobmV3TG9nU2l6ZSA9PSAwKSB7CisJCQkvKgorCQkJICogbm8gc2l6ZSBzcGVjaWZpZWQ6IGRlZmF1bHQgdG8gMS8yNTYgb2YgYWdncmVnYXRlCisJCQkgKiBzaXplOyByb3VuZGVkIHVwIHRvIGEgbWVnYWJ5dGUgYm91bmRhcnk7CisJCQkgKi8KKwkJCW5ld0xvZ1NpemUgPSBuZXdMVlNpemUgPj4gODsKKwkJCXQzMiA9ICgxIDw8ICgyMCAtIHNiaS0+bDJic2l6ZSkpIC0gMTsKKwkJCW5ld0xvZ1NpemUgPSAobmV3TG9nU2l6ZSArIHQzMikgJiB+dDMyOworCQkJbmV3TG9nU2l6ZSA9CisJCQkgICAgbWluKG5ld0xvZ1NpemUsIE1FR0FCWVRFMzIgPj4gc2JpLT5sMmJzaXplKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBjb252ZXJ0IHRoZSBuZXdMb2dTaXplIHRvIGZzIGJsb2Nrcy4KKwkJCSAqCisJCQkgKiBTaW5jZSB0aGlzIGlzIGdpdmVuIGluIG1lZ2FieXRlcywgaXQgd2lsbCBhbHdheXMgYmUKKwkJCSAqIGFuIGV2ZW4gbnVtYmVyIG9mIHBhZ2VzLgorCQkJICovCisJCQluZXdMb2dTaXplID0gKG5ld0xvZ1NpemUgKiBNRUdBQllURSkgPj4gc2JpLT5sMmJzaXplOworCQl9CisKKwl9IGVsc2UKKwkJbmV3TG9nU2l6ZSA9IDA7CisKKwluZXdMb2dBZGRyZXNzID0gbmV3TFZTaXplIC0gbmV3TG9nU2l6ZTsKKworCS8qCisJICogcmVjb25maWd1cmUgZnNjayB3b3JrIHNwYWNlOgorCSAqCisJICogY29uZmlndXJlIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGxvZ2ljYWwgdm9sdW1lIHJlZ2FyZGxlc3Mgb2YKKwkgKiB3aGV0aGVyIGZpbGUgc3lzdGVtIGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYWdncmVnYXRlOworCSAqIE5lZWQgZW5vdWdoIDRrIHBhZ2VzIHRvIGNvdmVyOgorCSAqICAtIDEgYml0IHBlciBibG9jayBpbiBhZ2dyZWdhdGUgcm91bmRlZCB1cCB0byBCUEVSRE1BUCBib3VuZGFyeQorCSAqICAtIDEgZXh0cmEgcGFnZSB0byBoYW5kbGUgY29udHJvbCBwYWdlIGFuZCBpbnRlcm1lZGlhdGUgbGV2ZWwgcGFnZXMKKwkgKiAgLSA1MCBleHRyYSBwYWdlcyBmb3IgdGhlIGNoa2RzayBzZXJ2aWNlIGxvZworCSAqLworCXQ2NCA9ICgobmV3TFZTaXplIC0gbmV3TG9nU2l6ZSArIEJQRVJETUFQIC0gMSkgPj4gTDJCUEVSRE1BUCkKKwkgICAgPDwgTDJCUEVSRE1BUDsKKwl0MzIgPSAoKHQ2NCArIChCSVRTUEVSUEFHRSAtIDEpKSAvIEJJVFNQRVJQQUdFKSArIDEgKyA1MDsKKwluZXdGU0NLU2l6ZSA9IHQzMiA8PCBzYmktPmwybmJwZXJwYWdlOworCW5ld0ZTQ0tBZGRyZXNzID0gbmV3TG9nQWRkcmVzcyAtIG5ld0ZTQ0tTaXplOworCisJLyoKKwkgKiBjb21wdXRlIG5ldyBmaWxlIHN5c3RlbSBzcGFjZTsKKwkgKi8KKwluZXdGU1NpemUgPSBuZXdMVlNpemUgLSBuZXdMb2dTaXplIC0gbmV3RlNDS1NpemU7CisKKwkvKiBmaWxlIHN5c3RlbSBjYW5ub3QgYmUgc2hyaW5rZWQgKi8KKwlpZiAobmV3RlNTaXplIDwgYm1wLT5kYl9tYXBzaXplKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBJZiB3ZSdyZSBleHBhbmRpbmcgZW5vdWdoIHRoYXQgdGhlIGlubGluZSBsb2cgZG9lcyBub3Qgb3ZlcmxhcAorCSAqIHRoZSBvbGQgb25lLCB3ZSBjYW4gZm9ybWF0IHRoZSBuZXcgbG9nIGJlZm9yZSB3ZSBxdWllc2NlIHRoZQorCSAqIGZpbGVzeXN0ZW0uCisJICovCisJaWYgKChzYmktPm1udGZsYWcgJiBKRlNfSU5MSU5FTE9HKSAmJiAobmV3TG9nQWRkcmVzcyA+IG9sZExWU2l6ZSkpIHsKKwkJaWYgKChyYyA9IGxtTG9nRm9ybWF0KGxvZywgbmV3TG9nQWRkcmVzcywgbmV3TG9nU2l6ZSkpKQorCQkJZ290byBvdXQ7CisJCWxvZ19mb3JtYXR0ZWQgPSAxOworCX0KKwkvKgorCSAqICAgICAgcXVpZXNjZSBmaWxlIHN5c3RlbQorCSAqCisJICogKHByZXBhcmUgdG8gbW92ZSB0aGUgaW5saW5lIGxvZyBhbmQgdG8gcHJldmVudCBtYXAgdXBkYXRlKQorCSAqCisJICogYmxvY2sgYW55IG5ldyB0cmFuc2FjdGlvbnMgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24gb2YKKwkgKiBhbGwgd2lwIHRyYW5zYWN0aW9ucyBhbmQgZmx1c2ggbW9kaWZpZWQgcGFnZXMgcy50LgorCSAqIG9uLWRpc2sgZmlsZSBzeXN0ZW0gaXMgaW4gY29uc2lzdGVudCBzdGF0ZSBhbmQKKwkgKiBsb2cgaXMgbm90IHJlcXVpcmVkIGZvciByZWNvdmVyeS4KKwkgKi8KKwl0eFF1aWVzY2Uoc2IpOworCisJaWYgKHNiaS0+bW50ZmxhZyAmIEpGU19JTkxJTkVMT0cpIHsKKwkJLyoKKwkJICogZGVhY3RpdmF0ZSBvbGQgaW5saW5lIGxvZworCQkgKi8KKwkJbG1Mb2dTaHV0ZG93bihsb2cpOworCisJCS8qCisJCSAqIG1hcmsgb24tZGlzayBzdXBlciBibG9jayBmb3IgZnMgaW4gdHJhbnNpdGlvbjsKKwkJICoKKwkJICogdXBkYXRlIG9uLWRpc2sgc3VwZXJibG9jayBmb3IgdGhlIG5ldyBzcGFjZSBjb25maWd1cmF0aW9uCisJCSAqIG9mIGlubGluZSBsb2cgc3BhY2UgYW5kIGZzY2sgd29yayBzcGFjZSBkZXNjcmlwdG9yczoKKwkJICogTi5CLiBGUyBkZXNjcmlwdG9yIGlzIE5PVCB1cGRhdGVkOworCQkgKgorCQkgKiBjcmFzaCByZWNvdmVyeToKKwkJICogbG9ncmVkbygpOiBpZiBGTV9FWFRFTkRGUywgcmV0dXJuIHRvIGZzY2soKSBmb3IgY2xlYW51cDsKKwkJICogZnNjaygpOiBpZiBGTV9FWFRFTkRGUywgcmVmb3JtYXQgaW5saW5lIGxvZyBhbmQgZnNjaworCQkgKiB3b3Jrc3BhY2UgZnJvbSBzdXBlcmJsb2NrIGlubGluZSBsb2cgZGVzY3JpcHRvciBhbmQgZnNjaworCQkgKiB3b3Jrc3BhY2UgZGVzY3JpcHRvcjsKKwkJICovCisKKwkJLyogcmVhZCBpbiBzdXBlcmJsb2NrICovCisJCWlmICgocmMgPSByZWFkU3VwZXIoc2IsICZiaCkpKQorCQkJZ290byBlcnJvcl9vdXQ7CisJCWpfc2IgPSAoc3RydWN0IGpmc19zdXBlcmJsb2NrICopYmgtPmJfZGF0YTsKKworCQkvKiBtYXJrIGV4dGVuZGZzKCkgaW4gcHJvZ3Jlc3MgKi8KKwkJal9zYi0+c19zdGF0ZSB8PSBjcHVfdG9fbGUzMihGTV9FWFRFTkRGUyk7CisJCWpfc2ItPnNfeHNpemUgPSBjcHVfdG9fbGU2NChuZXdGU1NpemUpOworCQlQWERhZGRyZXNzKCZqX3NiLT5zX3hmc2NrcHhkLCBuZXdGU0NLQWRkcmVzcyk7CisJCVBYRGxlbmd0aCgmal9zYi0+c194ZnNja3B4ZCwgbmV3RlNDS1NpemUpOworCQlQWERhZGRyZXNzKCZqX3NiLT5zX3hsb2dweGQsIG5ld0xvZ0FkZHJlc3MpOworCQlQWERsZW5ndGgoJmpfc2ItPnNfeGxvZ3B4ZCwgbmV3TG9nU2l6ZSk7CisKKwkJLyogc3luY2hyb25vdXNseSB1cGRhdGUgc3VwZXJibG9jayAqLworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwkJYnJlbHNlKGJoKTsKKworCQkvKgorCQkgKiBmb3JtYXQgbmV3IGlubGluZSBsb2cgc3luY2hyb25vdXNseTsKKwkJICoKKwkJICogY3Jhc2ggcmVjb3Zlcnk6IGlmIGxvZyBtb3ZlIGluIHByb2dyZXNzLAorCQkgKiByZWZvcm1hdCBsb2cgYW5kIGV4aXQgc3VjY2VzczsKKwkJICovCisJCWlmICghbG9nX2Zvcm1hdHRlZCkKKwkJCWlmICgocmMgPSBsbUxvZ0Zvcm1hdChsb2csIG5ld0xvZ0FkZHJlc3MsIG5ld0xvZ1NpemUpKSkKKwkJCQlnb3RvIGVycm9yX291dDsKKworCQkvKgorCQkgKiBhY3RpdmF0ZSBuZXcgbG9nCisJCSAqLworCQlsb2ctPmJhc2UgPSBuZXdMb2dBZGRyZXNzOworCQlsb2ctPnNpemUgPSBuZXdMb2dTaXplID4+IChMMkxPR1BTSVpFIC0gc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQlpZiAoKHJjID0gbG1Mb2dJbml0KGxvZykpKQorCQkJZ290byBlcnJvcl9vdXQ7CisJfQorCisJLyoKKwkgKiAgICAgIGV4dGVuZCBibG9jayBhbGxvY2F0aW9uIG1hcAorCSAqICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICoKKwkgKiBleHRlbmRmcygpIGZvciBuZXcgZXh0ZW5zaW9uLCByZXRyeSBhZnRlciBjcmFzaCByZWNvdmVyeTsKKwkgKgorCSAqIG5vdGU6IGJvdGggbG9ncmVkbygpIGFuZCBmc2NrKCkgcmVidWlsZCBtYXAgZnJvbQorCSAqIHRoZSBiaXRtYXAgYW5kIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGZyb20gc3VwZXJibG9jaworCSAqIChkaXNyZWdhcmRpbmcgYWxsIG90aGVyIGNvbnRyb2wgaW5mb3JtYXRpb24gaW4gdGhlIG1hcCk7CisJICoKKwkgKiBzdXBlcmJsb2NrOgorCSAqICBzX3NpemU6IGFnZ3JlZ2F0ZSBzaXplIGluIHBoeXNpY2FsIGJsb2NrczsKKwkgKi8KKwkvKgorCSAqICAgICAgY29tcHV0ZSB0aGUgbmV3IGJsb2NrIGFsbG9jYXRpb24gbWFwIGNvbmZpZ3VyYXRpb24KKwkgKgorCSAqIG1hcCBkaW5vZGU6CisJICogIGRpX3NpemU6IG1hcCBmaWxlIHNpemUgaW4gYnl0ZTsKKwkgKiAgZGlfbmJsb2NrczogbnVtYmVyIG9mIGJsb2NrcyBhbGxvY2F0ZWQgZm9yIG1hcCBmaWxlOworCSAqICBkaV9tYXBzaXplOiBudW1iZXIgb2YgYmxvY2tzIGluIGFnZ3JlZ2F0ZSAoY292ZXJlZCBieSBtYXApOworCSAqIG1hcCBjb250cm9sIHBhZ2U6CisJICogIGRiX21hcHNpemU6IG51bWJlciBvZiBibG9ja3MgaW4gYWdncmVnYXRlIChjb3ZlcmVkIGJ5IG1hcCk7CisJICovCisJbmV3TWFwU2l6ZSA9IG5ld0ZTU2l6ZTsKKwkvKiBudW1iZXIgb2YgZGF0YSBwYWdlcyBvZiBuZXcgYm1hcCBmaWxlOgorCSAqIHJvdW5kdXAgbmV3IHNpemUgdG8gZnVsbCBkbWFwIHBhZ2UgYm91bmRhcnkgYW5kCisJICogYWRkIDEgZXh0cmEgZG1hcCBwYWdlIGZvciBuZXh0IGV4dGVuZGZzKCkKKwkgKi8KKwl0NjQgPSAobmV3TWFwU2l6ZSAtIDEpICsgQlBFUkRNQVA7CisJbmV3TnBhZ2VzID0gQkxLVE9ETUFQTih0NjQpICsgMTsKKworCS8qCisJICogICAgICBleHRlbmQgbWFwIGZyb20gY3VycmVudCBtYXAgKFdJVEhPVVQgZ3Jvd2luZyBtYXBmaWxlKQorCSAqCisJICogbWFwIG5ldyBleHRlbnNpb24gd2l0aCB1bm1hcHBlZCBwYXJ0IG9mIHRoZSBsYXN0IHBhcnRpYWwKKwkgKiBkbWFwIHBhZ2UsIGlmIGFwcGxpY2FibGUsIGFuZCBleHRyYSBwYWdlKHMpIGFsbG9jYXRlZAorCSAqIGF0IGVuZCBvZiBibWFwIGJ5IG1rZnMoKSBvciBwcmV2aW91cyBleHRlbmRmcygpOworCSAqLworICAgICAgZXh0ZW5kQm1hcDoKKwkvKiBjb21wdXRlIG51bWJlciBvZiBibG9ja3MgcmVxdWVzdGVkIHRvIGV4dGVuZCAqLworCW1hcFNpemUgPSBibXAtPmRiX21hcHNpemU7CisJWEFkZHJlc3MgPSBtYXBTaXplOwkvKiBlWHRlbnNpb24gQWRkcmVzcyAqLworCVhTaXplID0gbmV3TWFwU2l6ZSAtIG1hcFNpemU7CS8qIGVYdGVuc2lvbiBTaXplICovCisJb2xkX2Fnc2l6ZSA9IGJtcC0+ZGJfYWdzaXplOwkvKiBXZSBuZWVkIHRvIGtub3cgaWYgdGhpcyBjaGFuZ2VzICovCisKKwkvKiBjb21wdXRlIG51bWJlciBvZiBibG9ja3MgdGhhdCBjYW4gYmUgZXh0ZW5kZWQgYnkgY3VycmVudCBtYXBmaWxlICovCisJdDY0ID0gZGJNYXBGaWxlU2l6ZVRvTWFwU2l6ZShpcGJtYXApOworCWlmIChtYXBTaXplID4gdDY0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiamZzX2V4dGVuZGZzOiBtYXBTaXplICgweCVMeCkgPiB0NjQgKDB4JUx4KVxuIiwKKwkJICAgICAgIChsb25nIGxvbmcpIG1hcFNpemUsIChsb25nIGxvbmcpIHQ2NCk7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCW5ibG9ja3MgPSBtaW4odDY0IC0gbWFwU2l6ZSwgWFNpemUpOworCisJLyoKKwkgKiB1cGRhdGUgbWFwIHBhZ2VzIGZvciBuZXcgZXh0ZW5zaW9uOgorCSAqCisJICogdXBkYXRlL2luaXQgZG1hcCBhbmQgYnViYmxlIHVwIHRoZSBjb250cm9sIGhpZXJhcmNoeQorCSAqIGluY3JlbWVudGFsbHkgZm9sZCB1cCBkbWFwcyBpbnRvIHVwcGVyIGxldmVsczsKKwkgKiB1cGRhdGUgYm1hcCBjb250cm9sIHBhZ2U7CisJICovCisJaWYgKChyYyA9IGRiRXh0ZW5kRlMoaXBibWFwLCBYQWRkcmVzcywgbmJsb2NrcykpKQorCQlnb3RvIGVycm9yX291dDsKKwkvKgorCSAqIHRoZSBtYXAgbm93IGhhcyBleHRlbmRlZCB0byBjb3ZlciBhZGRpdGlvbmFsIG5ibG9ja3M6CisJICogZG5fbWFwc2l6ZSA9IG9sZE1hcHNpemUgKyBuYmxvY2tzOworCSAqLworCS8qIGlwYm1hcC0+aV9tYXBzaXplICs9IG5ibG9ja3M7ICovCisJWFNpemUgLT0gbmJsb2NrczsKKworCS8qCisJICogICAgICBncm93IG1hcCBmaWxlIHRvIGNvdmVyIHJlbWFpbmluZyBleHRlbnNpb24KKwkgKiAgICAgIGFuZC9vciBvbmUgZXh0cmEgZG1hcCBwYWdlIGZvciBuZXh0IGV4dGVuZGZzKCk7CisJICoKKwkgKiBhbGxvY2F0ZSBuZXcgbWFwIHBhZ2VzIGFuZCBpdHMgYmFja2luZyBibG9ja3MsIGFuZAorCSAqIHVwZGF0ZSBtYXAgZmlsZSB4dHJlZQorCSAqLworCS8qIGNvbXB1dGUgbnVtYmVyIG9mIGRhdGEgcGFnZXMgb2YgY3VycmVudCBibWFwIGZpbGUgKi8KKwluUGFnZXMgPSBpcGJtYXAtPmlfc2l6ZSA+PiBMMlBTSVpFOworCisJLyogbmVlZCB0byBncm93IG1hcCBmaWxlID8gKi8KKwlpZiAoblBhZ2VzID09IG5ld05wYWdlcykKKwkJZ290byBmaW5hbGl6ZUJtYXA7CisKKwkvKgorCSAqIGdyb3cgYm1hcCBmaWxlIGZvciB0aGUgbmV3IG1hcCBwYWdlcyByZXF1aXJlZDoKKwkgKgorCSAqIGFsbG9jYXRlIGdyb3d0aCBhdCB0aGUgc3RhcnQgb2YgbmV3bHkgZXh0ZW5kZWQgcmVnaW9uOworCSAqIGJtYXAgZmlsZSBvbmx5IGdyb3dzIHNlcXVlbnRpYWxseSwgaS5lLiwgYm90aCBkYXRhIHBhZ2VzCisJICogYW5kIHBvc3NpYmx5IHh0cmVlIGluZGV4IHBhZ2VzIG1heSBncm93IGluIGFwcGVuZCBtb2RlLAorCSAqIHMudC4gbG9ncmVkbygpIGNhbiByZWNvbnN0cnVjdCBwcmUtZXh0ZW5zaW9uIHN0YXRlCisJICogYnkgd2FzaGluZyBhd2F5IGJtYXAgZmlsZSBvZiBwYWdlcyBvdXRzaWRlIHNfc2l6ZSBib3VuZGFyeTsKKwkgKi8KKwkvKgorCSAqIGpvdXJuYWwgbWFwIGZpbGUgZ3Jvd3RoIGFzIGlmIGEgcmVndWxhciBmaWxlIGdyb3d0aDoKKwkgKiAobm90ZTogYm1hcCBpcyBjcmVhdGVkIHdpdGggZGlfbW9kZSA9IElGSk9VUk5BTHxJRlJFRyk7CisJICoKKwkgKiBqb3VybmFsaW5nIG9mIGJtYXAgZmlsZSBncm93dGggaXMgbm90IHJlcXVpcmVkIHNpbmNlCisJICogbG9ncmVkbygpIGRvL2NhbiBub3QgdXNlIGxvZyByZWNvcmRzIG9mIGJtYXAgZmlsZSBncm93dGgKKwkgKiBidXQgaXQgcHJvdmlkZXMgY2FyZWZ1bCB3cml0ZSBzZW1hbnRpY3MsIHBtYXAgdXBkYXRlLCBldGMuOworCSAqLworCS8qIHN5bmNocm9ub3VzIHdyaXRlIG9mIGRhdGEgcGFnZXM6IGJtYXAgZGF0YSBwYWdlcyBhcmUKKwkgKiBjYWNoZWQgaW4gbWV0YS1kYXRhIGNhY2hlLCBhbmQgbm90IHdyaXR0ZW4gb3V0CisJICogYnkgdHhDb21taXQoKTsKKwkgKi8KKwlmaWxlbWFwX2ZkYXRhd2FpdChpcGJtYXAtPmlfbWFwcGluZyk7CisJZmlsZW1hcF9mZGF0YXdyaXRlKGlwYm1hcC0+aV9tYXBwaW5nKTsKKwlmaWxlbWFwX2ZkYXRhd2FpdChpcGJtYXAtPmlfbWFwcGluZyk7CisJZGlXcml0ZVNwZWNpYWwoaXBibWFwLCAwKTsKKworCW5ld1BhZ2UgPSBuUGFnZXM7CS8qIGZpcnN0IG5ldyBwYWdlIG51bWJlciAqLworCXhvZmYgPSBuZXdQYWdlIDw8IHNiaS0+bDJuYnBlcnBhZ2U7CisJeGxlbiA9IChuZXdOcGFnZXMgLSBuUGFnZXMpIDw8IHNiaS0+bDJuYnBlcnBhZ2U7CisJeGxlbiA9IG1pbih4bGVuLCAoaW50KSBuYmxvY2tzKSAmIH4oc2JpLT5uYnBlcnBhZ2UgLSAxKTsKKwl4YWRkciA9IFhBZGRyZXNzOworCisJdGlkID0gdHhCZWdpbihzYiwgQ09NTUlUX0ZPUkNFKTsKKworCWlmICgocmMgPSB4dEFwcGVuZCh0aWQsIGlwYm1hcCwgMCwgeG9mZiwgbmJsb2NrcywgJnhsZW4sICZ4YWRkciwgMCkpKSB7CisJCXR4RW5kKHRpZCk7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKwkvKiB1cGRhdGUgYm1hcCBmaWxlIHNpemUgKi8KKwlpcGJtYXAtPmlfc2l6ZSArPSB4bGVuIDw8IHNiaS0+bDJic2l6ZTsKKwlpbm9kZV9hZGRfYnl0ZXMoaXBibWFwLCB4bGVuIDw8IHNiaS0+bDJic2l6ZSk7CisKKwlpcGxpc3RbMF0gPSBpcGJtYXA7CisJcmMgPSB0eENvbW1pdCh0aWQsIDEsICZpcGxpc3RbMF0sIENPTU1JVF9GT1JDRSk7CisKKwl0eEVuZCh0aWQpOworCisJaWYgKHJjKQorCQlnb3RvIGVycm9yX291dDsKKworCS8qCisJICogbWFwIGZpbGUgaGFzIGJlZW4gZ3Jvd24gbm93IHRvIGNvdmVyIGV4dGVuc2lvbiB0byBmdXJ0aGVyIG91dDsKKwkgKiBkaV9zaXplID0gbmV3IG1hcCBmaWxlIHNpemU7CisJICoKKwkgKiBpZiBodWdlIGV4dGVuc2lvbiwgdGhlIHByZXZpb3VzIGV4dGVuc2lvbiBiYXNlZCBvbiBwcmV2aW91cworCSAqIG1hcCBmaWxlIHNpemUgbWF5IG5vdCBoYXZlIGJlZW4gc3VmZmljaWVudCB0byBjb3ZlciB3aG9sZSBleHRlbnNpb24KKwkgKiAoaXQgY291bGQgaGF2ZSBiZWVuIHVzZWQgdXAgZm9yIG5ldyBtYXAgcGFnZXMpLAorCSAqIGJ1dCB0aGUgbmV3bHkgZ3Jvd24gbWFwIGZpbGUgbm93IGNvdmVycyBsb3QgYmlnZ2VyIG5ldyBmcmVlIHNwYWNlCisJICogYXZhaWxhYmxlIGZvciBmdXJ0aGVyIGV4dGVuc2lvbiBvZiBtYXA7CisJICovCisJLyogYW55IG1vcmUgYmxvY2tzIHRvIGV4dGVuZCA/ICovCisJaWYgKFhTaXplKQorCQlnb3RvIGV4dGVuZEJtYXA7CisKKyAgICAgIGZpbmFsaXplQm1hcDoKKwkvKiBmaW5hbGl6ZSBibWFwICovCisJZGJGaW5hbGl6ZUJtYXAoaXBibWFwKTsKKworCS8qCisJICogICAgICB1cGRhdGUgaW5vZGUgYWxsb2NhdGlvbiBtYXAKKwkgKiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqCisJICogbW92ZSBpYWcgbGlzdHMgZnJvbSBvbGQgdG8gbmV3IGlhZzsKKwkgKiBhZ3N0YXJ0IGZpZWxkIGlzIG5vdCB1cGRhdGVkIGZvciBsb2dyZWRvKCkgdG8gcmVjb25zdHJ1Y3QKKwkgKiBpYWcgbGlzdHMgaWYgc3lzdGVtIGNyYXNoIG9jY3Vycy4KKwkgKiAoY29tcHV0YXRpb24gb2YgYWcgbnVtYmVyIGZyb20gYWdzdGFydCBiYXNlZCBvbiBhZ3NpemUKKwkgKiB3aWxsIGNvcnJlY3RseSBpZGVudGlmeSB0aGUgbmV3IGFnKTsKKwkgKi8KKwkvKiBpZiBuZXcgQUcgc2l6ZSB0aGUgc2FtZSBhcyBvbGQgQUcgc2l6ZSwgZG9uZSEgKi8KKwlpZiAoYm1wLT5kYl9hZ3NpemUgIT0gb2xkX2Fnc2l6ZSkgeworCQlpZiAoKHJjID0gZGlFeHRlbmRGUyhpcGltYXAsIGlwYm1hcCkpKQorCQkJZ290byBlcnJvcl9vdXQ7CisKKwkJLyogZmluYWxpemUgaW1hcCAqLworCQlpZiAoKHJjID0gZGlTeW5jKGlwaW1hcCkpKQorCQkJZ290byBlcnJvcl9vdXQ7CisJfQorCisJLyoKKwkgKiAgICAgIGZpbmFsaXplCisJICogICAgICAtLS0tLS0tLQorCSAqCisJICogZXh0ZW5zaW9uIGlzIGNvbW1pdHRlZCB3aGVuIG9uLWRpc2sgc3VwZXIgYmxvY2sgaXMKKwkgKiB1cGRhdGVkIHdpdGggbmV3IGRlc2NyaXB0b3JzOiBsb2dyZWRvIHdpbGwgcmVjb3ZlcgorCSAqIGNyYXNoIGJlZm9yZSBpdCB0byBwcmUtZXh0ZW5zaW9uIHN0YXRlOworCSAqLworCisJLyogc3luYyBsb2cgdG8gc2tpcCBsb2cgcmVwbGF5IG9mIGJtYXAgZmlsZSBncm93dGggdHJhbnNhY3Rpb247ICovCisJLyogbG1Mb2dTeW5jKGxvZywgMSk7ICovCisKKwkvKgorCSAqIHN5bmNocm9ub3VzIHdyaXRlIGJtYXAgZ2xvYmFsIGNvbnRyb2wgcGFnZTsKKwkgKiBmb3IgY3Jhc2ggYmVmb3JlIGNvbXBsZXRpb24gb2Ygd3JpdGUKKwkgKiBsb2dyZWRvKCkgd2lsbCByZWNvdmVyIHRvIHByZS1leHRlbmRmcyBzdGF0ZTsKKwkgKiBmb3IgY3Jhc2ggYWZ0ZXIgY29tcGxldGlvbiBvZiB3cml0ZSwKKwkgKiBsb2dyZWRvKCkgd2lsbCByZWNvdmVyIHBvc3QtZXh0ZW5kZnMgc3RhdGU7CisJICovCisJaWYgKChyYyA9IGRiU3luYyhpcGJtYXApKSkKKwkJZ290byBlcnJvcl9vdXQ7CisKKwkvKgorCSAqIGNvcHkgcHJpbWFyeSBibWFwIGlub2RlIHRvIHNlY29uZGFyeSBibWFwIGlub2RlCisJICovCisKKwlpcGJtYXAyID0gZGlSZWFkU3BlY2lhbChzYiwgQk1BUF9JLCAxKTsKKwlpZiAoaXBibWFwMiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiamZzX2V4dGVuZGZzOiBkaVJlYWRTcGVjaWFsKGJtYXApIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKwltZW1jcHkoJkpGU19JUChpcGJtYXAyKS0+aV94dHJvb3QsICZKRlNfSVAoaXBibWFwKS0+aV94dHJvb3QsIDI4OCk7CisJaXBibWFwMi0+aV9zaXplID0gaXBibWFwLT5pX3NpemU7CisJaXBibWFwMi0+aV9ibG9ja3MgPSBpcGJtYXAtPmlfYmxvY2tzOworCisJZGlXcml0ZVNwZWNpYWwoaXBibWFwMiwgMSk7CisJZGlGcmVlU3BlY2lhbChpcGJtYXAyKTsKKworCS8qCisJICogICAgICB1cGRhdGUgc3VwZXJibG9jaworCSAqLworCWlmICgocmMgPSByZWFkU3VwZXIoc2IsICZiaCkpKQorCQlnb3RvIGVycm9yX291dDsKKwlqX3NiID0gKHN0cnVjdCBqZnNfc3VwZXJibG9jayAqKWJoLT5iX2RhdGE7CisKKwkvKiBtYXJrIGV4dGVuZGZzKCkgY29tcGxldGlvbiAqLworCWpfc2ItPnNfc3RhdGUgJj0gY3B1X3RvX2xlMzIofkZNX0VYVEVOREZTKTsKKwlqX3NiLT5zX3NpemUgPSBjcHVfdG9fbGU2NChibXAtPmRiX21hcHNpemUgPDwKKwkJCQkgICBsZTE2X3RvX2NwdShqX3NiLT5zX2wyYmZhY3RvcikpOworCWpfc2ItPnNfYWdzaXplID0gY3B1X3RvX2xlMzIoYm1wLT5kYl9hZ3NpemUpOworCisJLyogdXBkYXRlIGlubGluZSBsb2cgc3BhY2UgZGVzY3JpcHRvciAqLworCWlmIChzYmktPm1udGZsYWcgJiBKRlNfSU5MSU5FTE9HKSB7CisJCVBYRGFkZHJlc3MoJihqX3NiLT5zX2xvZ3B4ZCksIG5ld0xvZ0FkZHJlc3MpOworCQlQWERsZW5ndGgoJihqX3NiLT5zX2xvZ3B4ZCksIG5ld0xvZ1NpemUpOworCX0KKworCS8qIHJlY29yZCBsb2cncyBtb3VudCBzZXJpYWwgbnVtYmVyICovCisJal9zYi0+c19sb2dzZXJpYWwgPSBjcHVfdG9fbGUzMihsb2ctPnNlcmlhbCk7CisKKwkvKiB1cGRhdGUgZnNjayB3b3JrIHNwYWNlIGRlc2NyaXB0b3IgKi8KKwlQWERhZGRyZXNzKCYoal9zYi0+c19mc2NrcHhkKSwgbmV3RlNDS0FkZHJlc3MpOworCVBYRGxlbmd0aCgmKGpfc2ItPnNfZnNja3B4ZCksIG5ld0ZTQ0tTaXplKTsKKwlqX3NiLT5zX2ZzY2tsb2cgPSAxOworCS8qIHNiLT5zX2ZzY2tsb2dsZW4gcmVtYWlucyB0aGUgc2FtZSAqLworCisJLyogVXBkYXRlIHNlY29uZGFyeSBzdXBlcmJsb2NrICovCisJYmgyID0gc2JfYnJlYWQoc2IsIFNVUEVSMl9PRkYgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCWlmIChiaDIpIHsKKwkJal9zYjIgPSAoc3RydWN0IGpmc19zdXBlcmJsb2NrICopYmgyLT5iX2RhdGE7CisJCW1lbWNweShqX3NiMiwgal9zYiwgc2l6ZW9mIChzdHJ1Y3QgamZzX3N1cGVyYmxvY2spKTsKKworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCXN5bmNfZGlydHlfYnVmZmVyKGJoMik7CisJCWJyZWxzZShiaDIpOworCX0KKworCS8qIHdyaXRlIHByaW1hcnkgc3VwZXJibG9jayAqLworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CisJYnJlbHNlKGJoKTsKKworCWdvdG8gcmVzdW1lOworCisgICAgICBlcnJvcl9vdXQ6CisJamZzX2Vycm9yKHNiLCAiamZzX2V4dGVuZGZzIik7CisKKyAgICAgIHJlc3VtZToKKwkvKgorCSAqICAgICAgcmVzdW1lIGZpbGUgc3lzdGVtIHRyYW5zYWN0aW9ucworCSAqLworCXR4UmVzdW1lKHNiKTsKKworICAgICAgb3V0OgorCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmcy9zdXBlci5jIGIvZnMvamZzL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg1Njg2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9zdXBlci5jCkBAIC0wLDAgKzEsNzAwIEBACisvKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwNAorICogICBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIENocmlzdG9waCBIZWxsd2lnLCAyMDAxLTIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiamZzX2luY29yZS5oIgorI2luY2x1ZGUgImpmc19maWxzeXMuaCIKKyNpbmNsdWRlICJqZnNfbWV0YXBhZ2UuaCIKKyNpbmNsdWRlICJqZnNfc3VwZXJibG9jay5oIgorI2luY2x1ZGUgImpmc19kbWFwLmgiCisjaW5jbHVkZSAiamZzX2ltYXAuaCIKKyNpbmNsdWRlICJqZnNfYWNsLmgiCisjaW5jbHVkZSAiamZzX2RlYnVnLmgiCisKK01PRFVMRV9ERVNDUklQVElPTigiVGhlIEpvdXJuYWxlZCBGaWxlc3lzdGVtIChKRlMpIik7CitNT0RVTEVfQVVUSE9SKCJTdGV2ZSBCZXN0L0RhdmUgS2xlaWthbXAvQmFycnkgQXJuZHQsIElCTSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMga21lbV9jYWNoZV90ICogamZzX2lub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGpmc19zdXBlcl9vcGVyYXRpb25zOworc3RhdGljIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBqZnNfZXhwb3J0X29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgamZzX2ZzX3R5cGU7CisKKyNkZWZpbmUgTUFYX0NPTU1JVF9USFJFQURTIDY0CitzdGF0aWMgaW50IGNvbW1pdF90aHJlYWRzID0gMDsKK21vZHVsZV9wYXJhbShjb21taXRfdGhyZWFkcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY29tbWl0X3RocmVhZHMsICJOdW1iZXIgb2YgY29tbWl0IHRocmVhZHMiKTsKKworaW50IGpmc19zdG9wX3RocmVhZHM7CitzdGF0aWMgcGlkX3QgamZzSU90aHJlYWQ7CitzdGF0aWMgcGlkX3QgamZzQ29tbWl0VGhyZWFkW01BWF9DT01NSVRfVEhSRUFEU107CitzdGF0aWMgcGlkX3QgamZzU3luY1RocmVhZDsKK0RFQ0xBUkVfQ09NUExFVElPTihqZnNJT3dhaXQpOworCisjaWZkZWYgQ09ORklHX0pGU19ERUJVRworaW50IGpmc2xvZ2xldmVsID0gSkZTX0xPR0xFVkVMX1dBUk47Cittb2R1bGVfcGFyYW0oamZzbG9nbGV2ZWwsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGpmc2xvZ2xldmVsLCAiU3BlY2lmeSBKRlMgbG9nbGV2ZWwgKDAsIDEgb3IgMikiKTsKKyNlbmRpZgorCisvKgorICogRXh0ZXJuYWwgZGVjbGFyYXRpb25zCisgKi8KK2V4dGVybiBpbnQgamZzX21vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2V4dGVybiBpbnQgamZzX21vdW50X3J3KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQpOworZXh0ZXJuIGludCBqZnNfdW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2V4dGVybiBpbnQgamZzX3Vtb3VudF9ydyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CisKK2V4dGVybiBpbnQgamZzSU9XYWl0KHZvaWQgKik7CitleHRlcm4gaW50IGpmc19sYXp5Y29tbWl0KHZvaWQgKik7CitleHRlcm4gaW50IGpmc19zeW5jKHZvaWQgKik7CisKK2V4dGVybiB2b2lkIGpmc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworZXh0ZXJuIHZvaWQgamZzX2RpcnR5X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworZXh0ZXJuIHZvaWQgamZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2V4dGVybiBpbnQgamZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB3YWl0KTsKKworZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmpmc19nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CitleHRlcm4gaW50IGpmc19leHRlbmRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgczY0LCBpbnQpOworCitleHRlcm4gc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGpmc19jaV9kZW50cnlfb3BlcmF0aW9uczsKKworI2lmZGVmIFBST0NfRlNfSkZTCQkvKiBzZWUgamZzX2RlYnVnLmggKi8KK2V4dGVybiB2b2lkIGpmc19wcm9jX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBqZnNfcHJvY19jbGVhbih2b2lkKTsKKyNlbmRpZgorCitleHRlcm4gd2FpdF9xdWV1ZV9oZWFkX3QgamZzX0lPX3RocmVhZF93YWl0OworZXh0ZXJuIHdhaXRfcXVldWVfaGVhZF90IGpmc19jb21taXRfdGhyZWFkX3dhaXQ7CitleHRlcm4gd2FpdF9xdWV1ZV9oZWFkX3QgamZzX3N5bmNfdGhyZWFkX3dhaXQ7CisKK3N0YXRpYyB2b2lkIGpmc19oYW5kbGVfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoc2IpOworCisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlyZXR1cm47CisKKwl1cGRhdGVTdXBlcihzYiwgRk1fRElSVFkpOworCisJaWYgKHNiaS0+ZmxhZyAmIEpGU19FUlJfUEFOSUMpCisJCXBhbmljKCJKRlMgKGRldmljZSAlcyk6IHBhbmljIGZvcmNlZCBhZnRlciBlcnJvclxuIiwKKwkJCXNiLT5zX2lkKTsKKwllbHNlIGlmIChzYmktPmZsYWcgJiBKRlNfRVJSX1JFTU9VTlRfUk8pIHsKKwkJamZzX2VycigiRVJST1I6IChkZXZpY2UgJXMpOiByZW1vdW50aW5nIGZpbGVzeXN0ZW0gIgorCQkJImFzIHJlYWQtb25seVxuIiwKKwkJCXNiLT5zX2lkKTsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCX0gCisKKwkvKiBub3RoaW5nIGlzIGRvbmUgZm9yIGNvbnRpbnVlIGJleW9uZCBtYXJraW5nIHRoZSBzdXBlcmJsb2NrIGRpcnR5ICovCit9CisKK3ZvaWQgamZzX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKiBmdW5jdGlvbiwgLi4uKQoreworCXN0YXRpYyBjaGFyIGVycm9yX2J1ZlsyNTZdOworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZ1bmN0aW9uKTsKKwl2c3ByaW50ZihlcnJvcl9idWYsIGZ1bmN0aW9uLCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwlwcmludGsoS0VSTl9FUlIgIkVSUk9SOiAoZGV2aWNlICVzKTogJXNcbiIsIHNiLT5zX2lkLCBlcnJvcl9idWYpOworCisJamZzX2hhbmRsZV9lcnJvcihzYik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmpmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamZzX2lub2RlOworCisJamZzX2lub2RlID0ga21lbV9jYWNoZV9hbGxvYyhqZnNfaW5vZGVfY2FjaGVwLCBHRlBfTk9GUyk7CisJaWYgKCFqZnNfaW5vZGUpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmamZzX2lub2RlLT52ZnNfaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGpmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqaSA9IEpGU19JUChpbm9kZSk7CisKKwlzcGluX2xvY2tfaXJxKCZqaS0+YWdfbG9jayk7CisJaWYgKGppLT5hY3RpdmVfYWcgIT0gLTEpIHsKKwkJc3RydWN0IGJtYXAgKmJtYXAgPSBKRlNfU0JJKGlub2RlLT5pX3NiKS0+Ym1hcDsKKwkJYXRvbWljX2RlYygmYm1hcC0+ZGJfYWN0aXZlW2ppLT5hY3RpdmVfYWddKTsKKwkJamktPmFjdGl2ZV9hZyA9IC0xOworCX0KKwlzcGluX3VubG9ja19pcnEoJmppLT5hZ19sb2NrKTsKKworI2lmZGVmIENPTkZJR19KRlNfUE9TSVhfQUNMCisJaWYgKGppLT5pX2FjbCAhPSBKRlNfQUNMX05PVF9DQUNIRUQpIHsKKwkJcG9zaXhfYWNsX3JlbGVhc2UoamktPmlfYWNsKTsKKwkJamktPmlfYWNsID0gSkZTX0FDTF9OT1RfQ0FDSEVEOworCX0KKwlpZiAoamktPmlfZGVmYXVsdF9hY2wgIT0gSkZTX0FDTF9OT1RfQ0FDSEVEKSB7CisJCXBvc2l4X2FjbF9yZWxlYXNlKGppLT5pX2RlZmF1bHRfYWNsKTsKKwkJamktPmlfZGVmYXVsdF9hY2wgPSBKRlNfQUNMX05PVF9DQUNIRUQ7CisJfQorI2VuZGlmCisKKwlrbWVtX2NhY2hlX2ZyZWUoamZzX2lub2RlX2NhY2hlcCwgamkpOworfQorCitzdGF0aWMgaW50IGpmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoc2IpOworCXM2NCBtYXhpbm9kZXM7CisJc3RydWN0IGlub21hcCAqaW1hcCA9IEpGU19JUChzYmktPmlwaW1hcCktPmlfaW1hcDsKKworCWpmc19pbmZvKCJJbiBqZnNfc3RhdGZzIik7CisJYnVmLT5mX3R5cGUgPSBKRlNfU1VQRVJfTUFHSUM7CisJYnVmLT5mX2JzaXplID0gc2JpLT5ic2l6ZTsKKwlidWYtPmZfYmxvY2tzID0gc2JpLT5ibWFwLT5kYl9tYXBzaXplOworCWJ1Zi0+Zl9iZnJlZSA9IHNiaS0+Ym1hcC0+ZGJfbmZyZWU7CisJYnVmLT5mX2JhdmFpbCA9IHNiaS0+Ym1hcC0+ZGJfbmZyZWU7CisJLyoKKwkgKiBJZiB3ZSByZWFsbHkgcmV0dXJuIHRoZSBudW1iZXIgb2YgYWxsb2NhdGVkICYgZnJlZSBpbm9kZXMsIHNvbWUKKwkgKiBhcHBsaWNhdGlvbnMgd2lsbCBmYWlsIGJlY2F1c2UgdGhleSB3b24ndCBzZWUgZW5vdWdoIGZyZWUgaW5vZGVzLgorCSAqIFdlJ2xsIHRyeSB0byBjYWxjdWxhdGUgc29tZSBndWVzcyBhcyB0byBob3cgbWF5IGlub2RlcyB3ZSBjYW4KKwkgKiByZWFsbHkgYWxsb2NhdGUKKwkgKgorCSAqIGJ1Zi0+Zl9maWxlcyA9IGF0b21pY19yZWFkKCZpbWFwLT5pbV9udW1pbm9zKTsKKwkgKiBidWYtPmZfZmZyZWUgPSBhdG9taWNfcmVhZCgmaW1hcC0+aW1fbnVtZnJlZSk7CisJICovCisJbWF4aW5vZGVzID0gbWluKChzNjQpIGF0b21pY19yZWFkKCZpbWFwLT5pbV9udW1pbm9zKSArCisJCQkoKHNiaS0+Ym1hcC0+ZGJfbmZyZWUgPj4gaW1hcC0+aW1fbDJuYnBlcmlleHQpCisJCQkgPDwgTDJJTk9TUEVSRVhUKSwgKHM2NCkgMHhmZmZmZmZmZkxMKTsKKwlidWYtPmZfZmlsZXMgPSBtYXhpbm9kZXM7CisJYnVmLT5mX2ZmcmVlID0gbWF4aW5vZGVzIC0gKGF0b21pY19yZWFkKCZpbWFwLT5pbV9udW1pbm9zKSAtCisJCQkJICAgIGF0b21pY19yZWFkKCZpbWFwLT5pbV9udW1mcmVlKSk7CisKKwlidWYtPmZfbmFtZWxlbiA9IEpGU19OQU1FX01BWDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgamZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShzYik7CisJaW50IHJjOworCisJamZzX2luZm8oIkluIGpmc19wdXRfc3VwZXIiKTsKKwlyYyA9IGpmc191bW91bnQoc2IpOworCWlmIChyYykKKwkJamZzX2VycigiamZzX3Vtb3VudCBmYWlsZWQgd2l0aCByZXR1cm4gY29kZSAlZCIsIHJjKTsKKwlpZiAoc2JpLT5ubHNfdGFiKQorCQl1bmxvYWRfbmxzKHNiaS0+bmxzX3RhYik7CisJc2JpLT5ubHNfdGFiID0gTlVMTDsKKworCWtmcmVlKHNiaSk7Cit9CisKK2VudW0geworCU9wdF9pbnRlZ3JpdHksIE9wdF9ub2ludGVncml0eSwgT3B0X2lvY2hhcnNldCwgT3B0X3Jlc2l6ZSwKKwlPcHRfcmVzaXplX25vc2l6ZSwgT3B0X2Vycm9ycywgT3B0X2lnbm9yZSwgT3B0X2VyciwKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7T3B0X2ludGVncml0eSwgImludGVncml0eSJ9LAorCXtPcHRfbm9pbnRlZ3JpdHksICJub2ludGVncml0eSJ9LAorCXtPcHRfaW9jaGFyc2V0LCAiaW9jaGFyc2V0PSVzIn0sCisJe09wdF9yZXNpemUsICJyZXNpemU9JXUifSwKKwl7T3B0X3Jlc2l6ZV9ub3NpemUsICJyZXNpemUifSwKKwl7T3B0X2Vycm9ycywgImVycm9ycz0lcyJ9LAorCXtPcHRfaWdub3JlLCAibm9xdW90YSJ9LAorCXtPcHRfaWdub3JlLCAicXVvdGEifSwKKwl7T3B0X2lnbm9yZSwgInVzcnF1b3RhIn0sCisJe09wdF9pZ25vcmUsICJncnBxdW90YSJ9LAorCXtPcHRfZXJyLCBOVUxMfQorfTsKKworc3RhdGljIGludCBwYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHM2NCAqbmV3TFZTaXplLAorCQkJIGludCAqZmxhZykKK3sKKwl2b2lkICpubHNfbWFwID0gKHZvaWQgKiktMTsJLyogLTE6IG5vIGNoYW5nZTsgIE5VTEw6IG5vbmUgKi8KKwljaGFyICpwOworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShzYik7CisKKwkqbmV3TFZTaXplID0gMDsKKworCWlmICghb3B0aW9ucykKKwkJcmV0dXJuIDE7CisKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCQlpbnQgdG9rZW47CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJY2FzZSBPcHRfaW50ZWdyaXR5OgorCQkJKmZsYWcgJj0gfkpGU19OT0lOVEVHUklUWTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub2ludGVncml0eToKKwkJCSpmbGFnIHw9IEpGU19OT0lOVEVHUklUWTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9pZ25vcmU6CisJCQkvKiBTaWxlbnRseSBpZ25vcmUgdGhlIHF1b3RhIG9wdGlvbnMgKi8KKwkJCS8qIERvbid0IGRvIGFueXRoaW5nIDstKSAqLworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2lvY2hhcnNldDoKKwkJCWlmIChubHNfbWFwICYmIG5sc19tYXAgIT0gKHZvaWQgKikgLTEpCisJCQkJdW5sb2FkX25scyhubHNfbWFwKTsKKwkJCWlmICghc3RyY21wKGFyZ3NbMF0uZnJvbSwgIm5vbmUiKSkKKwkJCQlubHNfbWFwID0gTlVMTDsKKwkJCWVsc2UgeworCQkJCW5sc19tYXAgPSBsb2FkX25scyhhcmdzWzBdLmZyb20pOworCQkJCWlmICghbmxzX21hcCkgeworCQkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJICAgICAgICJKRlM6IGNoYXJzZXQgbm90IGZvdW5kXG4iKTsKKwkJCQkJZ290byBjbGVhbnVwOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9wdF9yZXNpemU6CisJCXsKKwkJCWNoYXIgKnJlc2l6ZSA9IGFyZ3NbMF0uZnJvbTsKKwkJCSpuZXdMVlNpemUgPSBzaW1wbGVfc3RydG91bGwocmVzaXplLCAmcmVzaXplLCAwKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgT3B0X3Jlc2l6ZV9ub3NpemU6CisJCXsKKwkJCSpuZXdMVlNpemUgPSBzYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9zaXplID4+CisJCQkJc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCQlpZiAoKm5ld0xWU2l6ZSA9PSAwKQorCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAiSkZTOiBDYW5ub3QgZGV0ZXJtaW5lIHZvbHVtZSBzaXplXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgT3B0X2Vycm9yczoKKwkJeworCQkJY2hhciAqZXJyb3JzID0gYXJnc1swXS5mcm9tOworCQkJaWYgKCFlcnJvcnMgfHwgISplcnJvcnMpCisJCQkJZ290byBjbGVhbnVwOworCQkJaWYgKCFzdHJjbXAoZXJyb3JzLCAiY29udGludWUiKSkgeworCQkJCSpmbGFnICY9IH5KRlNfRVJSX1JFTU9VTlRfUk87CisJCQkJKmZsYWcgJj0gfkpGU19FUlJfUEFOSUM7CisJCQkJKmZsYWcgfD0gSkZTX0VSUl9DT05USU5VRTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChlcnJvcnMsICJyZW1vdW50LXJvIikpIHsKKwkJCQkqZmxhZyAmPSB+SkZTX0VSUl9DT05USU5VRTsKKwkJCQkqZmxhZyAmPSB+SkZTX0VSUl9QQU5JQzsKKwkJCQkqZmxhZyB8PSBKRlNfRVJSX1JFTU9VTlRfUk87CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoZXJyb3JzLCAicGFuaWMiKSkgeworCQkJCSpmbGFnICY9IH5KRlNfRVJSX0NPTlRJTlVFOworCQkJCSpmbGFnICY9IH5KRlNfRVJSX1JFTU9VTlRfUk87CisJCQkJKmZsYWcgfD0gSkZTX0VSUl9QQU5JQzsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICJKRlM6ICVzIGlzIGFuIGludmFsaWQgZXJyb3IgaGFuZGxlclxuIiwKKwkJCQkgICAgICAgZXJyb3JzKTsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJqZnM6IFVucmVjb2duaXplZCBtb3VudCBvcHRpb24gXCIlc1wiICIKKwkJCQkJIiBvciBtaXNzaW5nIHZhbHVlXG4iLCBwKTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCX0KKworCWlmIChubHNfbWFwICE9ICh2b2lkICopIC0xKSB7CisJCS8qIERpc2NhcmQgb2xkIChpZiByZW1vdW50KSAqLworCQlpZiAoc2JpLT5ubHNfdGFiKQorCQkJdW5sb2FkX25scyhzYmktPm5sc190YWIpOworCQlzYmktPm5sc190YWIgPSBubHNfbWFwOworCX0KKwlyZXR1cm4gMTsKKworY2xlYW51cDoKKwlpZiAobmxzX21hcCAmJiBubHNfbWFwICE9ICh2b2lkICopIC0xKQorCQl1bmxvYWRfbmxzKG5sc19tYXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGpmc19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJczY0IG5ld0xWU2l6ZSA9IDA7CisJaW50IHJjID0gMDsKKwlpbnQgZmxhZyA9IEpGU19TQkkoc2IpLT5mbGFnOworCisJaWYgKCFwYXJzZV9vcHRpb25zKGRhdGEsIHNiLCAmbmV3TFZTaXplLCAmZmxhZykpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChuZXdMVlNpemUpIHsKKwkJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJICAiSkZTOiByZXNpemUgcmVxdWlyZXMgdm9sdW1lIHRvIGJlIG1vdW50ZWQgcmVhZC13cml0ZVxuIik7CisJCQlyZXR1cm4gLUVST0ZTOworCQl9CisJCXJjID0gamZzX2V4dGVuZGZzKHNiLCBuZXdMVlNpemUsIDApOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKChzYi0+c19mbGFncyAmIE1TX1JET05MWSkgJiYgISgqZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCUpGU19TQkkoc2IpLT5mbGFnID0gZmxhZzsKKwkJcmV0dXJuIGpmc19tb3VudF9ydyhzYiwgMSk7CisJfQorCWlmICgoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpICYmICgqZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCXJjID0gamZzX3Vtb3VudF9ydyhzYik7CisJCUpGU19TQkkoc2IpLT5mbGFnID0gZmxhZzsKKwkJcmV0dXJuIHJjOworCX0KKwlpZiAoKEpGU19TQkkoc2IpLT5mbGFnICYgSkZTX05PSU5URUdSSVRZKSAhPSAoZmxhZyAmIEpGU19OT0lOVEVHUklUWSkpCisJCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJcmMgPSBqZnNfdW1vdW50X3J3KHNiKTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gcmM7CisJCQlKRlNfU0JJKHNiKS0+ZmxhZyA9IGZsYWc7CisJCQlyZXR1cm4gamZzX21vdW50X3J3KHNiLCAxKTsKKwkJfQorCUpGU19TQkkoc2IpLT5mbGFnID0gZmxhZzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGpmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IGpmc19zYl9pbmZvICpzYmk7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgcmM7CisJczY0IG5ld0xWU2l6ZSA9IDA7CisJaW50IGZsYWc7CisKKwlqZnNfaW5mbygiSW4gamZzX3JlYWRfc3VwZXI6IHNfZmxhZ3M9MHglbHgiLCBzYi0+c19mbGFncyk7CisKKwlpZiAoIW5ld192YWxpZF9kZXYoc2ItPnNfYmRldi0+YmRfZGV2KSkKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisKKwlzYmkgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGpmc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmkpCisJCXJldHVybiAtRU5PU1BDOworCW1lbXNldChzYmksIDAsIHNpemVvZiAoc3RydWN0IGpmc19zYl9pbmZvKSk7CisJc2ItPnNfZnNfaW5mbyA9IHNiaTsKKwlzYmktPnNiID0gc2I7CisKKwkvKiBpbml0aWFsaXplIHRoZSBtb3VudCBmbGFnIGFuZCBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlciAqLworCWZsYWcgPSBKRlNfRVJSX1JFTU9VTlRfUk87CisKKwlpZiAoIXBhcnNlX29wdGlvbnMoKGNoYXIgKikgZGF0YSwgc2IsICZuZXdMVlNpemUsICZmbGFnKSkgeworCQlrZnJlZShzYmkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc2JpLT5mbGFnID0gZmxhZzsKKworI2lmZGVmIENPTkZJR19KRlNfUE9TSVhfQUNMCisJc2ItPnNfZmxhZ3MgfD0gTVNfUE9TSVhBQ0w7CisjZW5kaWYKKworCWlmIChuZXdMVlNpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyZXNpemUgb3B0aW9uIGZvciByZW1vdW50IG9ubHlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemUgYmxvY2tzaXplIHRvIDRLLgorCSAqLworCXNiX3NldF9ibG9ja3NpemUoc2IsIFBTSVpFKTsKKworCS8qCisJICogU2V0IG1ldGhvZCB2ZWN0b3JzLgorCSAqLworCXNiLT5zX29wID0gJmpmc19zdXBlcl9vcGVyYXRpb25zOworCXNiLT5zX2V4cG9ydF9vcCA9ICZqZnNfZXhwb3J0X29wZXJhdGlvbnM7CisKKwlyYyA9IGpmc19tb3VudChzYik7CisJaWYgKHJjKSB7CisJCWlmICghc2lsZW50KSB7CisJCQlqZnNfZXJyKCJqZnNfbW91bnQgZmFpbGVkIHcvcmV0dXJuIGNvZGUgPSAlZCIsIHJjKTsKKwkJfQorCQlnb3RvIG91dF9rZnJlZTsKKwl9CisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlzYmktPmxvZyA9IE5VTEw7CisJZWxzZSB7CisJCXJjID0gamZzX21vdW50X3J3KHNiLCAwKTsKKwkJaWYgKHJjKSB7CisJCQlpZiAoIXNpbGVudCkgeworCQkJCWpmc19lcnIoImpmc19tb3VudF9ydyBmYWlsZWQsIHJldHVybiBjb2RlID0gJWQiLAorCQkJCQlyYyk7CisJCQl9CisJCQlnb3RvIG91dF9ub19ydzsKKwkJfQorCX0KKworCXNiLT5zX21hZ2ljID0gSkZTX1NVUEVSX01BR0lDOworCisJaW5vZGUgPSBpZ2V0KHNiLCBST09UX0kpOworCWlmICghaW5vZGUgfHwgaXNfYmFkX2lub2RlKGlub2RlKSkKKwkJZ290byBvdXRfbm9fcm9vdDsKKwlzYi0+c19yb290ID0gZF9hbGxvY19yb290KGlub2RlKTsKKwlpZiAoIXNiLT5zX3Jvb3QpCisJCWdvdG8gb3V0X25vX3Jvb3Q7CisKKwlpZiAoc2JpLT5tbnRmbGFnICYgSkZTX09TMikKKwkJc2ItPnNfcm9vdC0+ZF9vcCA9ICZqZnNfY2lfZGVudHJ5X29wZXJhdGlvbnM7CisKKwkvKiBsb2dpY2FsIGJsb2NrcyBhcmUgcmVwcmVzZW50ZWQgYnkgNDAgYml0cyBpbiBweGRfdCwgZXRjLiAqLworCXNiLT5zX21heGJ5dGVzID0gKCh1NjQpIHNiLT5zX2Jsb2Nrc2l6ZSkgPDwgNDA7CisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCS8qCisJICogUGFnZSBjYWNoZSBpcyBpbmRleGVkIGJ5IGxvbmcuCisJICogSSB3b3VsZCB1c2UgTUFYX0xGU19GSUxFU0laRSwgYnV0IGl0J3Mgb25seSBoYWxmIGFzIGJpZworCSAqLworCXNiLT5zX21heGJ5dGVzID0gbWluKCgodTY0KSBQQUdFX0NBQ0hFX1NJWkUgPDwgMzIpIC0gMSwgc2ItPnNfbWF4Ynl0ZXMpOworI2VuZGlmCisJc2ItPnNfdGltZV9ncmFuID0gMTsKKwlyZXR1cm4gMDsKKworb3V0X25vX3Jvb3Q6CisJamZzX2VycigiamZzX3JlYWRfc3VwZXI6IGdldCByb290IGlub2RlIGZhaWxlZCIpOworCWlmIChpbm9kZSkKKwkJaXB1dChpbm9kZSk7CisKK291dF9ub19ydzoKKwlyYyA9IGpmc191bW91bnQoc2IpOworCWlmIChyYykgeworCQlqZnNfZXJyKCJqZnNfdW1vdW50IGZhaWxlZCB3aXRoIHJldHVybiBjb2RlICVkIiwgcmMpOworCX0KK291dF9rZnJlZToKKwlpZiAoc2JpLT5ubHNfdGFiKQorCQl1bmxvYWRfbmxzKHNiaS0+bmxzX3RhYik7CisJa2ZyZWUoc2JpKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgamZzX3dyaXRlX3N1cGVyX2xvY2tmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShzYik7CisJc3RydWN0IGpmc19sb2cgKmxvZyA9IHNiaS0+bG9nOworCisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCXR4UXVpZXNjZShzYik7CisJCWxtTG9nU2h1dGRvd24obG9nKTsKKwkJdXBkYXRlU3VwZXIoc2IsIEZNX0NMRUFOKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGpmc191bmxvY2tmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShzYik7CisJc3RydWN0IGpmc19sb2cgKmxvZyA9IHNiaS0+bG9nOworCWludCByYyA9IDA7CisKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJdXBkYXRlU3VwZXIoc2IsIEZNX01PVU5UKTsKKwkJaWYgKChyYyA9IGxtTG9nSW5pdChsb2cpKSkKKwkJCWpmc19lcnIoImpmc191bmxvY2sgZmFpbGVkIHdpdGggcmV0dXJuIGNvZGUgJWQiLCByYyk7CisJCWVsc2UKKwkJCXR4UmVzdW1lKHNiKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmpmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsIAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgamZzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgaW50IGpmc19zeW5jX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB3YWl0KQoreworCXN0cnVjdCBqZnNfbG9nICpsb2cgPSBKRlNfU0JJKHNiKS0+bG9nOworCisJLyogbG9nID09IE5VTEwgaW5kaWNhdGVzIHJlYWQtb25seSBtb3VudCAqLworCWlmIChsb2cpCisJCWpmc19mbHVzaF9qb3VybmFsKGxvZywgd2FpdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGpmc19zdXBlcl9vcGVyYXRpb25zID0geworCS5hbGxvY19pbm9kZQk9IGpmc19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IGpmc19kZXN0cm95X2lub2RlLAorCS5yZWFkX2lub2RlCT0gamZzX3JlYWRfaW5vZGUsCisJLmRpcnR5X2lub2RlCT0gamZzX2RpcnR5X2lub2RlLAorCS53cml0ZV9pbm9kZQk9IGpmc193cml0ZV9pbm9kZSwKKwkuZGVsZXRlX2lub2RlCT0gamZzX2RlbGV0ZV9pbm9kZSwKKwkucHV0X3N1cGVyCT0gamZzX3B1dF9zdXBlciwKKwkuc3luY19mcwk9IGpmc19zeW5jX2ZzLAorCS53cml0ZV9zdXBlcl9sb2NrZnMgPSBqZnNfd3JpdGVfc3VwZXJfbG9ja2ZzLAorCS51bmxvY2tmcyAgICAgICA9IGpmc191bmxvY2tmcywKKwkuc3RhdGZzCQk9IGpmc19zdGF0ZnMsCisJLnJlbW91bnRfZnMJPSBqZnNfcmVtb3VudCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgamZzX2V4cG9ydF9vcGVyYXRpb25zID0geworCS5nZXRfcGFyZW50CT0gamZzX2dldF9wYXJlbnQsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgamZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJqZnMiLAorCS5nZXRfc2IJCT0gamZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworZXh0ZXJuIGludCBtZXRhcGFnZV9pbml0KHZvaWQpOworZXh0ZXJuIGludCB0eEluaXQodm9pZCk7CitleHRlcm4gdm9pZCB0eEV4aXQodm9pZCk7CitleHRlcm4gdm9pZCBtZXRhcGFnZV9leGl0KHZvaWQpOworCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqZnNfaXAgPSAoc3RydWN0IGpmc19pbm9kZV9pbmZvICopIGZvbzsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWSB8IFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikgeworCQltZW1zZXQoamZzX2lwLCAwLCBzaXplb2Yoc3RydWN0IGpmc19pbm9kZV9pbmZvKSk7CisJCUlOSVRfTElTVF9IRUFEKCZqZnNfaXAtPmFub25faW5vZGVfbGlzdCk7CisJCWluaXRfcndzZW0oJmpmc19pcC0+cmR3cmxvY2spOworCQlpbml0X01VVEVYKCZqZnNfaXAtPmNvbW1pdF9zZW0pOworCQlpbml0X3J3c2VtKCZqZnNfaXAtPnhhdHRyX3NlbSk7CisJCXNwaW5fbG9ja19pbml0KCZqZnNfaXAtPmFnX2xvY2spOworCQlqZnNfaXAtPmFjdGl2ZV9hZyA9IC0xOworI2lmZGVmIENPTkZJR19KRlNfUE9TSVhfQUNMCisJCWpmc19pcC0+aV9hY2wgPSBKRlNfQUNMX05PVF9DQUNIRUQ7CisJCWpmc19pcC0+aV9kZWZhdWx0X2FjbCA9IEpGU19BQ0xfTk9UX0NBQ0hFRDsKKyNlbmRpZgorCQlpbm9kZV9pbml0X29uY2UoJmpmc19pcC0+dmZzX2lub2RlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfamZzX2ZzKHZvaWQpCit7CisJaW50IGk7CisJaW50IHJjOworCisJamZzX2lub2RlX2NhY2hlcCA9CisJICAgIGttZW1fY2FjaGVfY3JlYXRlKCJqZnNfaXAiLCBzaXplb2Yoc3RydWN0IGpmc19pbm9kZV9pbmZvKSwgMCwgCisJCQkgICAgU0xBQl9SRUNMQUlNX0FDQ09VTlQsIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKGpmc19pbm9kZV9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIE1ldGFwYWdlIGluaXRpYWxpemF0aW9uCisJICovCisJcmMgPSBtZXRhcGFnZV9pbml0KCk7CisJaWYgKHJjKSB7CisJCWpmc19lcnIoIm1ldGFwYWdlX2luaXQgZmFpbGVkIHcvcmMgPSAlZCIsIHJjKTsKKwkJZ290byBmcmVlX3NsYWI7CisJfQorCisJLyoKKwkgKiBUcmFuc2FjdGlvbiBNYW5hZ2VyIGluaXRpYWxpemF0aW9uCisJICovCisJcmMgPSB0eEluaXQoKTsKKwlpZiAocmMpIHsKKwkJamZzX2VycigidHhJbml0IGZhaWxlZCB3L3JjID0gJWQiLCByYyk7CisJCWdvdG8gZnJlZV9tZXRhcGFnZTsKKwl9CisKKwkvKgorCSAqIEkvTyBjb21wbGV0aW9uIHRocmVhZCAoZW5kaW8pCisJICovCisJamZzSU90aHJlYWQgPSBrZXJuZWxfdGhyZWFkKGpmc0lPV2FpdCwgTlVMTCwgQ0xPTkVfS0VSTkVMKTsKKwlpZiAoamZzSU90aHJlYWQgPCAwKSB7CisJCWpmc19lcnIoImluaXRfamZzX2ZzOiBmb3JrIGZhaWxlZCB3L3JjID0gJWQiLCBqZnNJT3RocmVhZCk7CisJCWdvdG8gZW5kX3R4bW5ncjsKKwl9CisJd2FpdF9mb3JfY29tcGxldGlvbigmamZzSU93YWl0KTsJLyogV2FpdCB1bnRpbCB0aHJlYWQgc3RhcnRzICovCisKKwlpZiAoY29tbWl0X3RocmVhZHMgPCAxKQorCQljb21taXRfdGhyZWFkcyA9IG51bV9vbmxpbmVfY3B1cygpOworCWlmIChjb21taXRfdGhyZWFkcyA+IE1BWF9DT01NSVRfVEhSRUFEUykKKwkJY29tbWl0X3RocmVhZHMgPSBNQVhfQ09NTUlUX1RIUkVBRFM7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29tbWl0X3RocmVhZHM7IGkrKykgeworCQlqZnNDb21taXRUaHJlYWRbaV0gPSBrZXJuZWxfdGhyZWFkKGpmc19sYXp5Y29tbWl0LCBOVUxMLAorCQkJCQkJICAgQ0xPTkVfS0VSTkVMKTsKKwkJaWYgKGpmc0NvbW1pdFRocmVhZFtpXSA8IDApIHsKKwkJCWpmc19lcnIoImluaXRfamZzX2ZzOiBmb3JrIGZhaWxlZCB3L3JjID0gJWQiLAorCQkJCWpmc0NvbW1pdFRocmVhZFtpXSk7CisJCQljb21taXRfdGhyZWFkcyA9IGk7CisJCQlnb3RvIGtpbGxfY29tbWl0dGFzazsKKwkJfQorCQkvKiBXYWl0IHVudGlsIHRocmVhZCBzdGFydHMgKi8KKwkJd2FpdF9mb3JfY29tcGxldGlvbigmamZzSU93YWl0KTsKKwl9CisKKwlqZnNTeW5jVGhyZWFkID0ga2VybmVsX3RocmVhZChqZnNfc3luYywgTlVMTCwgQ0xPTkVfS0VSTkVMKTsKKwlpZiAoamZzU3luY1RocmVhZCA8IDApIHsKKwkJamZzX2VycigiaW5pdF9qZnNfZnM6IGZvcmsgZmFpbGVkIHcvcmMgPSAlZCIsIGpmc1N5bmNUaHJlYWQpOworCQlnb3RvIGtpbGxfY29tbWl0dGFzazsKKwl9CisJd2FpdF9mb3JfY29tcGxldGlvbigmamZzSU93YWl0KTsJLyogV2FpdCB1bnRpbCB0aHJlYWQgc3RhcnRzICovCisKKyNpZmRlZiBQUk9DX0ZTX0pGUworCWpmc19wcm9jX2luaXQoKTsKKyNlbmRpZgorCisJcmV0dXJuIHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmpmc19mc190eXBlKTsKKwora2lsbF9jb21taXR0YXNrOgorCWpmc19zdG9wX3RocmVhZHMgPSAxOworCXdha2VfdXBfYWxsKCZqZnNfY29tbWl0X3RocmVhZF93YWl0KTsKKwlmb3IgKGkgPSAwOyBpIDwgY29tbWl0X3RocmVhZHM7IGkrKykKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmamZzSU93YWl0KTsKKworCXdha2VfdXAoJmpmc19JT190aHJlYWRfd2FpdCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmamZzSU93YWl0KTsJLyogV2FpdCBmb3IgdGhyZWFkIGV4aXQgKi8KK2VuZF90eG1uZ3I6CisJdHhFeGl0KCk7CitmcmVlX21ldGFwYWdlOgorCW1ldGFwYWdlX2V4aXQoKTsKK2ZyZWVfc2xhYjoKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koamZzX2lub2RlX2NhY2hlcCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9qZnNfZnModm9pZCkKK3sKKwlpbnQgaTsKKworCWpmc19pbmZvKCJleGl0X2pmc19mcyBjYWxsZWQiKTsKKworCWpmc19zdG9wX3RocmVhZHMgPSAxOworCXR4RXhpdCgpOworCW1ldGFwYWdlX2V4aXQoKTsKKwl3YWtlX3VwKCZqZnNfSU9fdGhyZWFkX3dhaXQpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmpmc0lPd2FpdCk7CS8qIFdhaXQgdW50aWwgSU8gdGhyZWFkIGV4aXRzICovCisJd2FrZV91cF9hbGwoJmpmc19jb21taXRfdGhyZWFkX3dhaXQpOworCWZvciAoaSA9IDA7IGkgPCBjb21taXRfdGhyZWFkczsgaSsrKQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZqZnNJT3dhaXQpOworCXdha2VfdXAoJmpmc19zeW5jX3RocmVhZF93YWl0KTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZqZnNJT3dhaXQpOwkvKiBXYWl0IHVudGlsIFN5bmMgdGhyZWFkIGV4aXRzICovCisjaWZkZWYgUFJPQ19GU19KRlMKKwlqZnNfcHJvY19jbGVhbigpOworI2VuZGlmCisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZqZnNfZnNfdHlwZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KGpmc19pbm9kZV9jYWNoZXApOworfQorCittb2R1bGVfaW5pdChpbml0X2pmc19mcykKK21vZHVsZV9leGl0KGV4aXRfamZzX2ZzKQpkaWZmIC0tZ2l0IGEvZnMvamZzL3N5bWxpbmsuYyBiL2ZzL2pmcy9zeW1saW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0YzA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9zeW1saW5rLmMKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChjKSBDaHJpc3RvcGggSGVsbHdpZywgMjAwMS0yMDAyCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlICJqZnNfaW5jb3JlLmgiCisjaW5jbHVkZSAiamZzX3hhdHRyLmgiCisKK3N0YXRpYyBpbnQgamZzX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJY2hhciAqcyA9IEpGU19JUChkZW50cnktPmRfaW5vZGUpLT5pX2lubGluZTsKKwluZF9zZXRfbGluayhuZCwgcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGpmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBqZnNfZm9sbG93X2xpbmssCisJLnNldHhhdHRyCT0gamZzX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGpmc19nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gamZzX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBqZnNfcmVtb3ZleGF0dHIsCit9OworCmRpZmYgLS1naXQgYS9mcy9qZnMveGF0dHIuYyBiL2ZzL2pmcy94YXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOWZmZDUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMveGF0dHIuYwpAQCAtMCwwICsxLDExMjcgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDAtMjAwNAorICogICBDb3B5cmlnaHQgKEMpIENocmlzdG9waCBIZWxsd2lnLCAyMDAyCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKKyNpbmNsdWRlICJqZnNfc3VwZXJibG9jay5oIgorI2luY2x1ZGUgImpmc19kbWFwLmgiCisjaW5jbHVkZSAiamZzX2RlYnVnLmgiCisjaW5jbHVkZSAiamZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgImpmc19leHRlbnQuaCIKKyNpbmNsdWRlICJqZnNfbWV0YXBhZ2UuaCIKKyNpbmNsdWRlICJqZnNfeGF0dHIuaCIKKyNpbmNsdWRlICJqZnNfYWNsLmgiCisKKy8qCisgKglqZnNfeGF0dHIuYzogZXh0ZW5kZWQgYXR0cmlidXRlIHNlcnZpY2UKKyAqCisgKiBPdmVyYWxsIGRlc2lnbiAtLQorICoKKyAqIEZvcm1hdDoKKyAqCisgKiAgIEV4dGVuZGVkIGF0dHJpYnV0ZSBsaXN0cyAoamZzX2VhX2xpc3QpIGNvbnNpc3Qgb2YgYW4gb3ZlcmFsbCBzaXplICgzMiBiaXQKKyAqICAgdmFsdWUpIGFuZCBhIHZhcmlhYmxlICgwIG9yIG1vcmUpIG51bWJlciBvZiBleHRlbmRlZCBhdHRyaWJ1dGUKKyAqICAgZW50cmllcy4gIEVhY2ggZXh0ZW5kZWQgYXR0cmlidXRlIGVudHJ5IChqZnNfZWEpIGlzIGEgPG5hbWUsdmFsdWU+IGRvdWJsZQorICogICB3aGVyZSA8bmFtZT4gaXMgY29uc3RydWN0ZWQgZnJvbSBhIG51bGwtdGVybWluYXRlZCBhc2NpaSBzdHJpbmcKKyAqICAgKDEgLi4uIDI1NSBieXRlcyBpbiB0aGUgbmFtZSkgYW5kIDx2YWx1ZT4gaXMgYXJiaXRyYXJ5IDggYml0IGRhdGEKKyAqICAgKDEgLi4uIDY1NTM1IGJ5dGVzKS4gIFRoZSBpbi1tZW1vcnkgZm9ybWF0IGlzCisgKgorICogICAwICAgICAgIDEgICAgICAgIDIgICAgICAgIDQgICAgICAgICAgICAgICAgNCArIG5hbWVsZW4gKyAxCisgKiAgICstLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgfCBGbGFncyB8IE5hbWUgICB8IFZhbHVlICB8IE5hbWUgU3RyaW5nIFwwIHwgRGF0YSAuIC4gLiAuICAgICAgfAorICogICB8ICAgICAgIHwgTGVuZ3RoIHwgTGVuZ3RoIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8CisgKiAgICstLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiAgIEEgamZzX2VhX2xpc3QgdGhlbiBpcyBzdHJ1Y3R1cmVkIGFzCisgKgorICogICAwICAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICA0ICsgRUFfU0laRShlYTEpCisgKiAgICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLQorICogICB8IE92ZXJhbGwgRUEgfCBGaXJzdCBGRUEgRWxlbWVudCB8IFNlY29uZCBGRUEgRWxlbWVudCB8IC4uLi4uIAorICogICB8IExpc3QgU2l6ZSAgfCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CisgKiAgICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLQorICoKKyAqICAgT24tZGlzazoKKyAqCisgKiAgICAgRkVBTElTVHMgYXJlIHN0b3JlZCBvbiBkaXNrIHVzaW5nIGJsb2NrcyBhbGxvY2F0ZWQgYnkgZGJBbGxvYygpIGFuZAorICogICAgIHdyaXR0ZW4gZGlyZWN0bHkuIEFuIEVBIGxpc3QgbWF5IGJlIGluLWxpbmVkIGluIHRoZSBpbm9kZSBpZiB0aGVyZSBpcworICogICAgIHN1ZmZpY2llbnQgcm9vbSBhdmFpbGFibGUuCisgKi8KKworc3RydWN0IGVhX2J1ZmZlciB7CisJaW50IGZsYWc7CQkvKiBJbmRpY2F0ZXMgd2hhdCBzdG9yYWdlIHhhdHRyIHBvaW50cyB0byAqLworCWludCBtYXhfc2l6ZTsJCS8qIGxhcmdlc3QgeGF0dHIgdGhhdCBmaXRzIGluIGN1cnJlbnQgYnVmZmVyICovCisJZHhkX3QgbmV3X2VhOwkJLyogZHhkIHRvIHJlcGxhY2UgZWEgd2hlbiBtb2RpZnlpbmcgeGF0dHIgKi8KKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOwkvKiBtZXRhcGFnZSBjb250YWluaW5nIGVhIGxpc3QgKi8KKwlzdHJ1Y3QgamZzX2VhX2xpc3QgKnhhdHRyOwkvKiBidWZmZXIgY29udGFpbmluZyBlYSBsaXN0ICovCit9OworCisvKgorICogZWFfYnVmZmVyLmZsYWcgdmFsdWVzCisgKi8KKyNkZWZpbmUgRUFfSU5MSU5FCTB4MDAwMQorI2RlZmluZSBFQV9FWFRFTlQJMHgwMDAyCisjZGVmaW5lIEVBX05FVwkJMHgwMDA0CisjZGVmaW5lIEVBX01BTExPQwkweDAwMDgKKworLyogTmFtZXNwYWNlcyAqLworI2RlZmluZSBYQVRUUl9TWVNURU1fUFJFRklYICJzeXN0ZW0uIgorI2RlZmluZSBYQVRUUl9TWVNURU1fUFJFRklYX0xFTiAoc2l6ZW9mIChYQVRUUl9TWVNURU1fUFJFRklYKSAtIDEpCisKKyNkZWZpbmUgWEFUVFJfVVNFUl9QUkVGSVggInVzZXIuIgorI2RlZmluZSBYQVRUUl9VU0VSX1BSRUZJWF9MRU4gKHNpemVvZiAoWEFUVFJfVVNFUl9QUkVGSVgpIC0gMSkKKworI2RlZmluZSBYQVRUUl9PUzJfUFJFRklYICJvczIuIgorI2RlZmluZSBYQVRUUl9PUzJfUFJFRklYX0xFTiAoc2l6ZW9mIChYQVRUUl9PUzJfUFJFRklYKSAtIDEpCisKKy8qIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBpcyBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgveGF0dHIuaCAqLworI2RlZmluZSBYQVRUUl9TRUNVUklUWV9QUkVGSVhfTEVOIChzaXplb2YgKFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCkgLSAxKQorCisjZGVmaW5lIFhBVFRSX1RSVVNURURfUFJFRklYICJ0cnVzdGVkLiIKKyNkZWZpbmUgWEFUVFJfVFJVU1RFRF9QUkVGSVhfTEVOIChzaXplb2YgKFhBVFRSX1RSVVNURURfUFJFRklYKSAtIDEpCisKKy8qCisgKiBUaGVzZSB0aHJlZSByb3V0aW5lcyBhcmUgdXNlZCB0byByZWNvZ25pemUgb24tZGlzayBleHRlbmRlZCBhdHRyaWJ1dGVzCisgKiB0aGF0IGFyZSBpbiBhIHJlY29nbml6ZWQgbmFtZXNwYWNlLiAgSWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgcmVjb2duaXplZCwKKyAqICJvczIuIiBpcyBwcmVwZW5kZWQgdG8gdGhlIG5hbWUKKyAqLworc3RhdGljIGlubGluZSBpbnQgaXNfb3MyX3hhdHRyKHN0cnVjdCBqZnNfZWEgKmVhKQoreworCS8qCisJICogQ2hlY2sgZm9yICJzeXN0ZW0uIgorCSAqLworCWlmICgoZWEtPm5hbWVsZW4gPj0gWEFUVFJfU1lTVEVNX1BSRUZJWF9MRU4pICYmCisJICAgICFzdHJuY21wKGVhLT5uYW1lLCBYQVRUUl9TWVNURU1fUFJFRklYLCBYQVRUUl9TWVNURU1fUFJFRklYX0xFTikpCisJCXJldHVybiBGQUxTRTsKKwkvKgorCSAqIENoZWNrIGZvciAidXNlci4iCisJICovCisJaWYgKChlYS0+bmFtZWxlbiA+PSBYQVRUUl9VU0VSX1BSRUZJWF9MRU4pICYmCisJICAgICFzdHJuY21wKGVhLT5uYW1lLCBYQVRUUl9VU0VSX1BSRUZJWCwgWEFUVFJfVVNFUl9QUkVGSVhfTEVOKSkKKwkJcmV0dXJuIEZBTFNFOworCS8qCisJICogQ2hlY2sgZm9yICJzZWN1cml0eS4iCisJICovCisJaWYgKChlYS0+bmFtZWxlbiA+PSBYQVRUUl9TRUNVUklUWV9QUkVGSVhfTEVOKSAmJgorCSAgICAhc3RybmNtcChlYS0+bmFtZSwgWEFUVFJfU0VDVVJJVFlfUFJFRklYLAorCQkgICAgIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWF9MRU4pKQorCQlyZXR1cm4gRkFMU0U7CisJLyoKKwkgKiBDaGVjayBmb3IgInRydXN0ZWQuIgorCSAqLworCWlmICgoZWEtPm5hbWVsZW4gPj0gWEFUVFJfVFJVU1RFRF9QUkVGSVhfTEVOKSAmJgorCSAgICAhc3RybmNtcChlYS0+bmFtZSwgWEFUVFJfVFJVU1RFRF9QUkVGSVgsIFhBVFRSX1RSVVNURURfUFJFRklYX0xFTikpCisJCXJldHVybiBGQUxTRTsKKwkvKgorCSAqIEFkZCBhbnkgb3RoZXIgdmFsaWQgbmFtZXNwYWNlIHByZWZpeGVzIGhlcmUKKwkgKi8KKworCS8qCisJICogV2UgYXNzdW1lIGl0J3MgT1MvMidzIGZsYXQgbmFtZXNwYWNlCisJICovCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5hbWVfc2l6ZShzdHJ1Y3QgamZzX2VhICplYSkKK3sKKwlpZiAoaXNfb3MyX3hhdHRyKGVhKSkKKwkJcmV0dXJuIGVhLT5uYW1lbGVuICsgWEFUVFJfT1MyX1BSRUZJWF9MRU47CisJZWxzZQorCQlyZXR1cm4gZWEtPm5hbWVsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNvcHlfbmFtZShjaGFyICpidWZmZXIsIHN0cnVjdCBqZnNfZWEgKmVhKQoreworCWludCBsZW4gPSBlYS0+bmFtZWxlbjsKKworCWlmIChpc19vczJfeGF0dHIoZWEpKSB7CisJCW1lbWNweShidWZmZXIsIFhBVFRSX09TMl9QUkVGSVgsIFhBVFRSX09TMl9QUkVGSVhfTEVOKTsKKwkJYnVmZmVyICs9IFhBVFRSX09TMl9QUkVGSVhfTEVOOworCQlsZW4gKz0gWEFUVFJfT1MyX1BSRUZJWF9MRU47CisJfQorCW1lbWNweShidWZmZXIsIGVhLT5uYW1lLCBlYS0+bmFtZWxlbik7CisJYnVmZmVyW2VhLT5uYW1lbGVuXSA9IDA7CisKKwlyZXR1cm4gbGVuOworfQorCisvKiBGb3J3YXJkIHJlZmVyZW5jZXMgKi8KK3N0YXRpYyB2b2lkIGVhX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGVhX2J1ZmZlciAqZWFfYnVmKTsKKworLyoKKyAqIE5BTUU6IGVhX3dyaXRlX2lubGluZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogRlVOQ1RJT046IEF0dGVtcHQgdG8gd3JpdGUgYW4gRUEgaW5saW5lIGlmIGFyZWEgaXMgYXZhaWxhYmxlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBQUkUgQ09ORElUSU9OUzoKKyAqCUFscmVhZHkgdmVyaWZpZWQgdGhhdCB0aGUgc3BlY2lmaWVkIEVBIGlzIHNtYWxsIGVub3VnaCB0byBmaXQgaW5saW5lCisgKgorICogUEFSQU1FVEVSUzoKKyAqCWlwCS0gSW5vZGUgcG9pbnRlcgorICoJZWFsaXN0CS0gRUEgbGlzdCBwb2ludGVyCisgKglzaXplCS0gc2l6ZSBvZiBlYWxpc3QgaW4gYnl0ZXMKKyAqCWVhCS0gZHhkX3Qgc3RydWN0dXJlIHRvIGJlIGZpbGxlZCBpbiB3aXRoIG5lY2Vzc2FyeSBFQSBpbmZvcm1hdGlvbgorICoJCSAgaWYgd2Ugc3VjY2Vzc2Z1bGx5IGNvcHkgdGhlIEVBIGlubGluZQorICoKKyAqIE5PVEVTOgorICoJQ2hlY2tzIGlmIHRoZSBpbm9kZSdzIGlubGluZSBhcmVhIGlzIGF2YWlsYWJsZS4gIElmIHNvLCBjb3BpZXMgRUEgaW5saW5lCisgKglhbmQgc2V0cyA8ZWE+IGZpZWxkcyBhcHByb3ByaWF0ZWx5LiAgT3RoZXJ3aXNlLCByZXR1cm5zIGZhaWx1cmUsIEVBIHdpbGwKKyAqCWhhdmUgdG8gYmUgcHV0IGludG8gYW4gZXh0ZW50LgorICoKKyAqIFJFVFVSTlM6IDAgZm9yIHN1Y2Nlc3NmdWwgY29weSB0byBpbmxpbmUgYXJlYTsgLTEgaWYgYXJlYSBub3QgYXZhaWxhYmxlCisgKi8KK3N0YXRpYyBpbnQgZWFfd3JpdGVfaW5saW5lKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBqZnNfZWFfbGlzdCAqZWFsaXN0LAorCQkJICAgaW50IHNpemUsIGR4ZF90ICogZWEpCit7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqaSA9IEpGU19JUChpcCk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB3ZSBoYXZlIGFuIEVBIC0tIHRoZSBOVUxMIEVBIGxpc3QgaXMgdmFsaWQsIGJ1dCB5b3UKKwkgKiBjYW4ndCBjb3B5IGl0IQorCSAqLworCWlmIChlYWxpc3QgJiYgc2l6ZSA+IHNpemVvZiAoc3RydWN0IGpmc19lYV9saXN0KSkgeworCQlhc3NlcnQoc2l6ZSA8PSBzaXplb2YgKGppLT5pX2lubGluZV9lYSkpOworCisJCS8qCisJCSAqIFNlZSBpZiB0aGUgc3BhY2UgaXMgYXZhaWxhYmxlIG9yIGlmIGl0IGlzIGFscmVhZHkgYmVpbmcKKwkJICogdXNlZCBmb3IgYW4gaW5saW5lIEVBLgorCQkgKi8KKwkJaWYgKCEoamktPm1vZGUyICYgSU5MSU5FRUEpICYmICEoamktPmVhLmZsYWcgJiBEWERfSU5MSU5FKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJRFhEc2l6ZShlYSwgc2l6ZSk7CisJCURYRGxlbmd0aChlYSwgMCk7CisJCURYRGFkZHJlc3MoZWEsIDApOworCQltZW1jcHkoamktPmlfaW5saW5lX2VhLCBlYWxpc3QsIHNpemUpOworCQllYS0+ZmxhZyA9IERYRF9JTkxJTkU7CisJCWppLT5tb2RlMiAmPSB+SU5MSU5FRUE7CisJfSBlbHNlIHsKKwkJZWEtPmZsYWcgPSAwOworCQlEWERzaXplKGVhLCAwKTsKKwkJRFhEbGVuZ3RoKGVhLCAwKTsKKwkJRFhEYWRkcmVzcyhlYSwgMCk7CisKKwkJLyogRnJlZSB1cCBJTkxJTkUgYXJlYSAqLworCQlpZiAoamktPmVhLmZsYWcgJiBEWERfSU5MSU5FKQorCQkJamktPm1vZGUyIHw9IElOTElORUVBOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogTkFNRTogZWFfd3JpdGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEZVTkNUSU9OOiBXcml0ZSBhbiBFQSBmb3IgYW4gaW5vZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFBSRSBDT05ESVRJT05TOiBFQSBoYXMgYmVlbiB2ZXJpZmllZCAKKyAqCisgKiBQQVJBTUVURVJTOgorICoJaXAJLSBJbm9kZSBwb2ludGVyCisgKgllYWxpc3QJLSBFQSBsaXN0IHBvaW50ZXIKKyAqCXNpemUJLSBzaXplIG9mIGVhbGlzdCBpbiBieXRlcworICoJZWEJLSBkeGRfdCBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkIGluIGFwcHJvcHJpYXRlbHkgd2l0aCB3aGVyZSB0aGUKKyAqCQkgIEVBIHdhcyBjb3BpZWQKKyAqCisgKiBOT1RFUzogV2lsbCB3cml0ZSBFQSBpbmxpbmUgaWYgYWJsZSB0bywgb3RoZXJ3aXNlIGFsbG9jYXRlcyBibG9ja3MgZm9yIGFuCisgKglleHRlbnQgYW5kIHN5bmNocm9ub3VzbHkgd3JpdGVzIGl0IHRvIHRob3NlIGJsb2Nrcy4KKyAqCisgKiBSRVRVUk5TOiAwIGZvciBzdWNjZXNzOyBBbnl0aGluZyBlbHNlIGluZGljYXRlcyBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgZWFfd3JpdGUoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGpmc19lYV9saXN0ICplYWxpc3QsIGludCBzaXplLAorCQkgICAgICAgZHhkX3QgKiBlYSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaXAtPmlfc2I7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqaSA9IEpGU19JUChpcCk7CisJc3RydWN0IGpmc19zYl9pbmZvICpzYmkgPSBKRlNfU0JJKHNiKTsKKwlpbnQgbmJsb2NrczsKKwlzNjQgYmxrbm87CisJaW50IHJjID0gMCwgaTsKKwljaGFyICpjcDsKKwlzMzIgbmJ5dGVzLCBuYjsKKwlzMzIgYnl0ZXNfdG9fd3JpdGU7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKworCS8qCisJICogUXVpY2sgY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYW4gaW4tbGluYWJsZSBFQS4gIFNob3J0IEVBcworCSAqIGFuZCBlbXB0eSBFQXMgYXJlIGFsbCBpbi1saW5hYmxlLCBwcm92aWRlZCB0aGUgc3BhY2UgZXhpc3RzLgorCSAqLworCWlmICghZWFsaXN0IHx8IHNpemUgPD0gc2l6ZW9mIChqaS0+aV9pbmxpbmVfZWEpKSB7CisJCWlmICghZWFfd3JpdGVfaW5saW5lKGlwLCBlYWxpc3QsIHNpemUsIGVhKSkKKwkJCXJldHVybiAwOworCX0KKworCS8qIGZpZ3VyZSBvdXQgaG93IG1hbnkgYmxvY2tzIHdlIG5lZWQgKi8KKwluYmxvY2tzID0gKHNpemUgKyAoc2ItPnNfYmxvY2tzaXplIC0gMSkpID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCisJLyogQWxsb2NhdGUgbmV3IGJsb2NrcyB0byBxdW90YS4gKi8KKwlpZiAoRFFVT1RfQUxMT0NfQkxPQ0soaXAsIG5ibG9ja3MpKSB7CisJCXJldHVybiAtRURRVU9UOworCX0KKworCXJjID0gZGJBbGxvYyhpcCwgSU5PSElOVChpcCksIG5ibG9ja3MsICZibGtubyk7CisJaWYgKHJjKSB7CisJCS8qUm9sbGJhY2sgcXVvdGEgYWxsb2NhdGlvbi4gKi8KKwkJRFFVT1RfRlJFRV9CTE9DSyhpcCwgbmJsb2Nrcyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKgorCSAqIE5vdyBoYXZlIG5ibG9ja3Mgd29ydGggb2Ygc3RvcmFnZSB0byBzdHVmZiBpbnRvIHRoZSBGRUFMSVNULgorCSAqIGxvb3Agb3ZlciB0aGUgRkVBTElTVCBjb3B5aW5nIGRhdGEgaW50byB0aGUgYnVmZmVyIG9uZSBwYWdlIGF0CisJICogYSB0aW1lLgorCSAqLworCWNwID0gKGNoYXIgKikgZWFsaXN0OworCW5ieXRlcyA9IHNpemU7CisJZm9yIChpID0gMDsgaSA8IG5ibG9ja3M7IGkgKz0gc2JpLT5uYnBlcnBhZ2UpIHsKKwkJLyoKKwkJICogRGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIGZvciB0aGlzIHJlcXVlc3QsIGFuZCByb3VuZCB1cCB0bworCQkgKiB0aGUgbmVhcmVzdCBhZ2dyZWdhdGUgYmxvY2sgc2l6ZQorCQkgKi8KKwkJbmIgPSBtaW4oUFNJWkUsIG5ieXRlcyk7CisJCWJ5dGVzX3RvX3dyaXRlID0KKwkJICAgICgoKChuYiArIHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSA+PiBzYi0+c19ibG9ja3NpemVfYml0cykpCisJCSAgICA8PCBzYi0+c19ibG9ja3NpemVfYml0czsKKworCQlpZiAoIShtcCA9IGdldF9tZXRhcGFnZShpcCwgYmxrbm8gKyBpLCBieXRlc190b193cml0ZSwgMSkpKSB7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCisJCW1lbWNweShtcC0+ZGF0YSwgY3AsIG5iKTsKKworCQkvKgorCQkgKiBXZSByZWFsbHkgbmVlZCBhIHdheSB0byBwcm9wYWdhdGUgZXJyb3JzIGZvcgorCQkgKiBmb3JjZWQgd3JpdGVzIGxpa2UgdGhpcyBvbmUuICAtLWhjaAorCQkgKgorCQkgKiAoX193cml0ZV9tZXRhcGFnZSA9PiByZWxlYXNlX21ldGFwYWdlID0+IGZsdXNoX21ldGFwYWdlKQorCQkgKi8KKyNpZmRlZiBfSkZTX0ZJWE1FCisJCWlmICgocmMgPSBmbHVzaF9tZXRhcGFnZShtcCkpKSB7CisJCQkvKgorCQkJICogdGhlIHdyaXRlIGZhaWxlZCAtLSB0aGlzIG1lYW5zIHRoYXQgdGhlIGJ1ZmZlcgorCQkJICogaXMgc3RpbGwgYXNzaWduZWQgYW5kIHRoZSBibG9ja3MgYXJlIG5vdCBiZWluZworCQkJICogdXNlZC4gIHRoaXMgc2VlbXMgbGlrZSB0aGUgYmVzdCBlcnJvciByZWNvdmVyeQorCQkJICogd2UgY2FuIGdldCAuLi4KKwkJCSAqLworCQkJZ290byBmYWlsZWQ7CisJCX0KKyNlbHNlCisJCWZsdXNoX21ldGFwYWdlKG1wKTsKKyNlbmRpZgorCisJCWNwICs9IFBTSVpFOworCQluYnl0ZXMgLT0gbmI7CisJfQorCisJZWEtPmZsYWcgPSBEWERfRVhURU5UOworCURYRHNpemUoZWEsIGxlMzJfdG9fY3B1KGVhbGlzdC0+c2l6ZSkpOworCURYRGxlbmd0aChlYSwgbmJsb2Nrcyk7CisJRFhEYWRkcmVzcyhlYSwgYmxrbm8pOworCisJLyogRnJlZSB1cCBJTkxJTkUgYXJlYSAqLworCWlmIChqaS0+ZWEuZmxhZyAmIERYRF9JTkxJTkUpCisJCWppLT5tb2RlMiB8PSBJTkxJTkVFQTsKKworCXJldHVybiAwOworCisgICAgICBmYWlsZWQ6CisJLyogUm9sbGJhY2sgcXVvdGEgYWxsb2NhdGlvbi4gKi8KKwlEUVVPVF9GUkVFX0JMT0NLKGlwLCBuYmxvY2tzKTsKKworCWRiRnJlZShpcCwgYmxrbm8sIG5ibG9ja3MpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIE5BTUU6IGVhX3JlYWRfaW5saW5lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBGVU5DVElPTjogUmVhZCBhbiBpbmxpbmVkIEVBIGludG8gdXNlcidzIGJ1ZmZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogUEFSQU1FVEVSUzoKKyAqCWlwCS0gSW5vZGUgcG9pbnRlcgorICoJZWFsaXN0CS0gUG9pbnRlciB0byBidWZmZXIgdG8gZmlsbCBpbiB3aXRoIEVBCisgKgorICogUkVUVVJOUzogMAorICovCitzdGF0aWMgaW50IGVhX3JlYWRfaW5saW5lKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBqZnNfZWFfbGlzdCAqZWFsaXN0KQoreworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamkgPSBKRlNfSVAoaXApOworCWludCBlYV9zaXplID0gc2l6ZURYRCgmamktPmVhKTsKKworCWlmIChlYV9zaXplID09IDApIHsKKwkJZWFsaXN0LT5zaXplID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogU2FuaXR5IENoZWNrICovCisJaWYgKChzaXplRFhEKCZqaS0+ZWEpID4gc2l6ZW9mIChqaS0+aV9pbmxpbmVfZWEpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxlMzJfdG9fY3B1KCgoc3RydWN0IGpmc19lYV9saXN0ICopICZqaS0+aV9pbmxpbmVfZWEpLT5zaXplKQorCSAgICAhPSBlYV9zaXplKQorCQlyZXR1cm4gLUVJTzsKKworCW1lbWNweShlYWxpc3QsIGppLT5pX2lubGluZV9lYSwgZWFfc2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBOQU1FOiBlYV9yZWFkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBGVU5DVElPTjogY29weSBFQSBkYXRhIGludG8gdXNlcidzIGJ1ZmZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogUEFSQU1FVEVSUzoKKyAqCWlwCS0gSW5vZGUgcG9pbnRlcgorICoJZWFsaXN0CS0gUG9pbnRlciB0byBidWZmZXIgdG8gZmlsbCBpbiB3aXRoIEVBCisgKgorICogTk9URVM6ICBJZiBFQSBpcyBpbmxpbmUgY2FsbHMgZWFfcmVhZF9pbmxpbmUoKSB0byBjb3B5IEVBLgorICoKKyAqIFJFVFVSTlM6IDAgZm9yIHN1Y2Nlc3M7IG90aGVyIGluZGljYXRlcyBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgZWFfcmVhZChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgamZzX2VhX2xpc3QgKmVhbGlzdCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaXAtPmlfc2I7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqaSA9IEpGU19JUChpcCk7CisJc3RydWN0IGpmc19zYl9pbmZvICpzYmkgPSBKRlNfU0JJKHNiKTsKKwlpbnQgbmJsb2NrczsKKwlzNjQgYmxrbm87CisJY2hhciAqY3AgPSAoY2hhciAqKSBlYWxpc3Q7CisJaW50IGk7CisJaW50IG5ieXRlcywgbmI7CisJczMyIGJ5dGVzX3RvX3JlYWQ7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKworCS8qIHF1aWNrIGNoZWNrIGZvciBpbi1saW5lIEVBICovCisJaWYgKGppLT5lYS5mbGFnICYgRFhEX0lOTElORSkKKwkJcmV0dXJuIGVhX3JlYWRfaW5saW5lKGlwLCBlYWxpc3QpOworCisJbmJ5dGVzID0gc2l6ZURYRCgmamktPmVhKTsKKwlpZiAoIW5ieXRlcykgeworCQlqZnNfZXJyb3Ioc2IsICJlYV9yZWFkOiBuYnl0ZXMgaXMgMCIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiAKKwkgKiBGaWd1cmUgb3V0IGhvdyBtYW55IGJsb2NrcyB3ZXJlIGFsbG9jYXRlZCB3aGVuIHRoaXMgRUEgbGlzdCB3YXMKKwkgKiBvcmlnaW5hbGx5IHdyaXR0ZW4gdG8gZGlzay4KKwkgKi8KKwluYmxvY2tzID0gbGVuZ3RoRFhEKCZqaS0+ZWEpIDw8IHNiaS0+bDJuYnBlcnBhZ2U7CisJYmxrbm8gPSBhZGRyZXNzRFhEKCZqaS0+ZWEpIDw8IHNiaS0+bDJuYnBlcnBhZ2U7CisKKwkvKgorCSAqIEkgaGF2ZSBmb3VuZCB0aGUgZGlzayBibG9ja3Mgd2hpY2ggd2VyZSBvcmlnaW5hbGx5IHVzZWQgdG8gc3RvcmUKKwkgKiB0aGUgRkVBTElTVC4gIG5vdyBpIGxvb3Agb3ZlciBlYWNoIGNvbnRpZ3VvdXMgYmxvY2sgY29weWluZyB0aGUKKwkgKiBkYXRhIGludG8gdGhlIGJ1ZmZlci4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbmJsb2NrczsgaSArPSBzYmktPm5icGVycGFnZSkgeworCQkvKgorCQkgKiBEZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgZm9yIHRoaXMgcmVxdWVzdCwgYW5kIHJvdW5kIHVwIHRvCisJCSAqIHRoZSBuZWFyZXN0IGFnZ3JlZ2F0ZSBibG9jayBzaXplCisJCSAqLworCQluYiA9IG1pbihQU0laRSwgbmJ5dGVzKTsKKwkJYnl0ZXNfdG9fcmVhZCA9CisJCSAgICAoKCgobmIgKyBzYi0+c19ibG9ja3NpemUgLSAxKSkgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMpKQorCQkgICAgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHM7CisKKwkJaWYgKCEobXAgPSByZWFkX21ldGFwYWdlKGlwLCBibGtubyArIGksIGJ5dGVzX3RvX3JlYWQsIDEpKSkKKwkJCXJldHVybiAtRUlPOworCisJCW1lbWNweShjcCwgbXAtPmRhdGEsIG5iKTsKKwkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisKKwkJY3AgKz0gUFNJWkU7CisJCW5ieXRlcyAtPSBuYjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE5BTUU6IGVhX2dldAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogRlVOQ1RJT046IFJldHVybnMgYnVmZmVyIGNvbnRhaW5pbmcgZXhpc3RpbmcgZXh0ZW5kZWQgYXR0cmlidXRlcy4KKyAqCSAgICAgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB3aWxsIGJlIHRoZSBsYXJnZXIgb2YgdGhlIGV4aXN0aW5nCisgKgkgICAgIGF0dHJpYnV0ZXMgc2l6ZSwgb3IgbWluX3NpemUuCisgKgorICoJICAgICBUaGUgYnVmZmVyLCB3aGljaCBtYXkgYmUgaW5saW5lZCBpbiB0aGUgaW5vZGUgb3IgaW4gdGhlCisgKiAJICAgICBwYWdlIGNhY2hlIG11c3QgYmUgcmVsZWFzZSBieSBjYWxsaW5nIGVhX3JlbGVhc2Ugb3IgZWFfcHV0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBQQVJBTUVURVJTOgorICoJaW5vZGUJLSBJbm9kZSBwb2ludGVyCisgKgllYV9idWYJLSBTdHJ1Y3R1cmUgdG8gYmUgcG9wdWxhdGVkIHdpdGggZWFsaXN0IGFuZCBpdHMgbWV0YWRhdGEKKyAqCW1pbl9zaXplLSBtaW5pbXVtIHNpemUgb2YgYnVmZmVyIHRvIGJlIHJldHVybmVkCisgKgorICogUkVUVVJOUzogMCBmb3Igc3VjY2VzczsgT3RoZXIgaW5kaWNhdGVzIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBlYV9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGVhX2J1ZmZlciAqZWFfYnVmLCBpbnQgbWluX3NpemUpCit7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqaSA9IEpGU19JUChpbm9kZSk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCWludCBzaXplOworCWludCBlYV9zaXplID0gc2l6ZURYRCgmamktPmVhKTsKKwlpbnQgYmxvY2tzX25lZWRlZCwgY3VycmVudF9ibG9ja3M7CisJczY0IGJsa25vOworCWludCByYzsKKwlpbnQgcXVvdGFfYWxsb2NhdGlvbiA9IDA7CisKKwkvKiBXaGVuIGZzY2suamZzIGNsZWFycyBhIGJhZCBlYSwgaXQgZG9lc24ndCBjbGVhciB0aGUgc2l6ZSAqLworCWlmIChqaS0+ZWEuZmxhZyA9PSAwKQorCQllYV9zaXplID0gMDsKKworCWlmIChlYV9zaXplID09IDApIHsKKwkJaWYgKG1pbl9zaXplID09IDApIHsKKwkJCWVhX2J1Zi0+ZmxhZyA9IDA7CisJCQllYV9idWYtPm1heF9zaXplID0gMDsKKwkJCWVhX2J1Zi0+eGF0dHIgPSBOVUxMOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKChtaW5fc2l6ZSA8PSBzaXplb2YgKGppLT5pX2lubGluZV9lYSkpICYmCisJCSAgICAoamktPm1vZGUyICYgSU5MSU5FRUEpKSB7CisJCQllYV9idWYtPmZsYWcgPSBFQV9JTkxJTkUgfCBFQV9ORVc7CisJCQllYV9idWYtPm1heF9zaXplID0gc2l6ZW9mIChqaS0+aV9pbmxpbmVfZWEpOworCQkJZWFfYnVmLT54YXR0ciA9IChzdHJ1Y3QgamZzX2VhX2xpc3QgKikgamktPmlfaW5saW5lX2VhOworCQkJRFhEbGVuZ3RoKCZlYV9idWYtPm5ld19lYSwgMCk7CisJCQlEWERhZGRyZXNzKCZlYV9idWYtPm5ld19lYSwgMCk7CisJCQllYV9idWYtPm5ld19lYS5mbGFnID0gRFhEX0lOTElORTsKKwkJCURYRHNpemUoJmVhX2J1Zi0+bmV3X2VhLCBtaW5fc2l6ZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljdXJyZW50X2Jsb2NrcyA9IDA7CisJfSBlbHNlIGlmIChqaS0+ZWEuZmxhZyAmIERYRF9JTkxJTkUpIHsKKwkJaWYgKG1pbl9zaXplIDw9IHNpemVvZiAoamktPmlfaW5saW5lX2VhKSkgeworCQkJZWFfYnVmLT5mbGFnID0gRUFfSU5MSU5FOworCQkJZWFfYnVmLT5tYXhfc2l6ZSA9IHNpemVvZiAoamktPmlfaW5saW5lX2VhKTsKKwkJCWVhX2J1Zi0+eGF0dHIgPSAoc3RydWN0IGpmc19lYV9saXN0ICopIGppLT5pX2lubGluZV9lYTsKKwkJCWdvdG8gc2l6ZV9jaGVjazsKKwkJfQorCQljdXJyZW50X2Jsb2NrcyA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKCEoamktPmVhLmZsYWcgJiBEWERfRVhURU5UKSkgeworCQkJamZzX2Vycm9yKHNiLCAiZWFfZ2V0OiBpbnZhbGlkIGVhLmZsYWcpIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQljdXJyZW50X2Jsb2NrcyA9IChlYV9zaXplICsgc2ItPnNfYmxvY2tzaXplIC0gMSkgPj4KKwkJICAgIHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCX0KKwlzaXplID0gbWF4KG1pbl9zaXplLCBlYV9zaXplKTsKKworCWlmIChzaXplID4gUFNJWkUpIHsKKwkJLyoKKwkJICogVG8ga2VlcCB0aGUgcmVzdCBvZiB0aGUgY29kZSBzaW1wbGUuICBBbGxvY2F0ZSBhCisJCSAqIGNvbnRpZ3VvdXMgYnVmZmVyIHRvIHdvcmsgd2l0aAorCQkgKi8KKwkJZWFfYnVmLT54YXR0ciA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChlYV9idWYtPnhhdHRyID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQllYV9idWYtPmZsYWcgPSBFQV9NQUxMT0M7CisJCWVhX2J1Zi0+bWF4X3NpemUgPSAoc2l6ZSArIHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpICYKKwkJICAgIH4oc2ItPnNfYmxvY2tzaXplIC0gMSk7CisKKwkJaWYgKGVhX3NpemUgPT0gMCkKKwkJCXJldHVybiAwOworCisJCWlmICgocmMgPSBlYV9yZWFkKGlub2RlLCBlYV9idWYtPnhhdHRyKSkpIHsKKwkJCWtmcmVlKGVhX2J1Zi0+eGF0dHIpOworCQkJZWFfYnVmLT54YXR0ciA9IE5VTEw7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJZ290byBzaXplX2NoZWNrOworCX0KKwlibG9ja3NfbmVlZGVkID0gKG1pbl9zaXplICsgc2ItPnNfYmxvY2tzaXplIC0gMSkgPj4KKwkgICAgc2ItPnNfYmxvY2tzaXplX2JpdHM7CisKKwlpZiAoYmxvY2tzX25lZWRlZCA+IGN1cnJlbnRfYmxvY2tzKSB7CisJCS8qIEFsbG9jYXRlIG5ldyBibG9ja3MgdG8gcXVvdGEuICovCisJCWlmIChEUVVPVF9BTExPQ19CTE9DSyhpbm9kZSwgYmxvY2tzX25lZWRlZCkpCisJCQlyZXR1cm4gLUVEUVVPVDsKKworCQlxdW90YV9hbGxvY2F0aW9uID0gYmxvY2tzX25lZWRlZDsKKworCQlyYyA9IGRiQWxsb2MoaW5vZGUsIElOT0hJTlQoaW5vZGUpLCAoczY0KSBibG9ja3NfbmVlZGVkLAorCQkJICAgICAmYmxrbm8pOworCQlpZiAocmMpCisJCQlnb3RvIGNsZWFuX3VwOworCisJCURYRGxlbmd0aCgmZWFfYnVmLT5uZXdfZWEsIGJsb2Nrc19uZWVkZWQpOworCQlEWERhZGRyZXNzKCZlYV9idWYtPm5ld19lYSwgYmxrbm8pOworCQllYV9idWYtPm5ld19lYS5mbGFnID0gRFhEX0VYVEVOVDsKKwkJRFhEc2l6ZSgmZWFfYnVmLT5uZXdfZWEsIG1pbl9zaXplKTsKKworCQllYV9idWYtPmZsYWcgPSBFQV9FWFRFTlQgfCBFQV9ORVc7CisKKwkJZWFfYnVmLT5tcCA9IGdldF9tZXRhcGFnZShpbm9kZSwgYmxrbm8sCisJCQkJCSAgYmxvY2tzX25lZWRlZCA8PCBzYi0+c19ibG9ja3NpemVfYml0cywKKwkJCQkJICAxKTsKKwkJaWYgKGVhX2J1Zi0+bXAgPT0gTlVMTCkgeworCQkJZGJGcmVlKGlub2RlLCBibGtubywgKHM2NCkgYmxvY2tzX25lZWRlZCk7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIGNsZWFuX3VwOworCQl9CisJCWVhX2J1Zi0+eGF0dHIgPSBlYV9idWYtPm1wLT5kYXRhOworCQllYV9idWYtPm1heF9zaXplID0gKG1pbl9zaXplICsgc2ItPnNfYmxvY2tzaXplIC0gMSkgJgorCQkgICAgfihzYi0+c19ibG9ja3NpemUgLSAxKTsKKwkJaWYgKGVhX3NpemUgPT0gMCkKKwkJCXJldHVybiAwOworCQlpZiAoKHJjID0gZWFfcmVhZChpbm9kZSwgZWFfYnVmLT54YXR0cikpKSB7CisJCQlkaXNjYXJkX21ldGFwYWdlKGVhX2J1Zi0+bXApOworCQkJZGJGcmVlKGlub2RlLCBibGtubywgKHM2NCkgYmxvY2tzX25lZWRlZCk7CisJCQlnb3RvIGNsZWFuX3VwOworCQl9CisJCWdvdG8gc2l6ZV9jaGVjazsKKwl9CisJZWFfYnVmLT5mbGFnID0gRUFfRVhURU5UOworCWVhX2J1Zi0+bXAgPSByZWFkX21ldGFwYWdlKGlub2RlLCBhZGRyZXNzRFhEKCZqaS0+ZWEpLAorCQkJCSAgIGxlbmd0aERYRCgmamktPmVhKSA8PCBzYi0+c19ibG9ja3NpemVfYml0cywKKwkJCQkgICAxKTsKKwlpZiAoZWFfYnVmLT5tcCA9PSBOVUxMKSB7CisJCXJjID0gLUVJTzsKKwkJZ290byBjbGVhbl91cDsKKwl9CisJZWFfYnVmLT54YXR0ciA9IGVhX2J1Zi0+bXAtPmRhdGE7CisJZWFfYnVmLT5tYXhfc2l6ZSA9IChlYV9zaXplICsgc2ItPnNfYmxvY2tzaXplIC0gMSkgJgorCSAgICB+KHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOworCisgICAgICBzaXplX2NoZWNrOgorCWlmIChFQUxJU1RfU0laRShlYV9idWYtPnhhdHRyKSAhPSBlYV9zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZWFfZ2V0OiBpbnZhbGlkIGV4dGVuZGVkIGF0dHJpYnV0ZVxuIik7CisJCWR1bXBfbWVtKCJ4YXR0ciIsIGVhX2J1Zi0+eGF0dHIsIGVhX3NpemUpOworCQllYV9yZWxlYXNlKGlub2RlLCBlYV9idWYpOworCQlyYyA9IC1FSU87CisJCWdvdG8gY2xlYW5fdXA7CisJfQorCisJcmV0dXJuIGVhX3NpemU7CisKKyAgICAgIGNsZWFuX3VwOgorCS8qIFJvbGxiYWNrIHF1b3RhIGFsbG9jYXRpb24gKi8KKwlpZiAocXVvdGFfYWxsb2NhdGlvbikKKwkJRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgcXVvdGFfYWxsb2NhdGlvbik7CisKKwlyZXR1cm4gKHJjKTsKK30KKworc3RhdGljIHZvaWQgZWFfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZWFfYnVmZmVyICplYV9idWYpCit7CisJaWYgKGVhX2J1Zi0+ZmxhZyAmIEVBX01BTExPQykKKwkJa2ZyZWUoZWFfYnVmLT54YXR0cik7CisJZWxzZSBpZiAoZWFfYnVmLT5mbGFnICYgRUFfRVhURU5UKSB7CisJCWFzc2VydChlYV9idWYtPm1wKTsKKwkJcmVsZWFzZV9tZXRhcGFnZShlYV9idWYtPm1wKTsKKworCQlpZiAoZWFfYnVmLT5mbGFnICYgRUFfTkVXKQorCQkJZGJGcmVlKGlub2RlLCBhZGRyZXNzRFhEKCZlYV9idWYtPm5ld19lYSksCisJCQkgICAgICAgbGVuZ3RoRFhEKCZlYV9idWYtPm5ld19lYSkpOworCX0KK30KKworc3RhdGljIGludCBlYV9wdXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGVhX2J1ZmZlciAqZWFfYnVmLCBpbnQgbmV3X3NpemUpCit7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqaSA9IEpGU19JUChpbm9kZSk7CisJdW5zaWduZWQgbG9uZyBvbGRfYmxvY2tzLCBuZXdfYmxvY2tzOworCWludCByYyA9IDA7CisJdGlkX3QgdGlkOworCisJaWYgKG5ld19zaXplID09IDApIHsKKwkJZWFfcmVsZWFzZShpbm9kZSwgZWFfYnVmKTsKKwkJZWFfYnVmID0gTlVMTDsKKwl9IGVsc2UgaWYgKGVhX2J1Zi0+ZmxhZyAmIEVBX0lOTElORSkgeworCQlhc3NlcnQobmV3X3NpemUgPD0gc2l6ZW9mIChqaS0+aV9pbmxpbmVfZWEpKTsKKwkJamktPm1vZGUyICY9IH5JTkxJTkVFQTsKKwkJZWFfYnVmLT5uZXdfZWEuZmxhZyA9IERYRF9JTkxJTkU7CisJCURYRHNpemUoJmVhX2J1Zi0+bmV3X2VhLCBuZXdfc2l6ZSk7CisJCURYRGFkZHJlc3MoJmVhX2J1Zi0+bmV3X2VhLCAwKTsKKwkJRFhEbGVuZ3RoKCZlYV9idWYtPm5ld19lYSwgMCk7CisJfSBlbHNlIGlmIChlYV9idWYtPmZsYWcgJiBFQV9NQUxMT0MpIHsKKwkJcmMgPSBlYV93cml0ZShpbm9kZSwgZWFfYnVmLT54YXR0ciwgbmV3X3NpemUsICZlYV9idWYtPm5ld19lYSk7CisJCWtmcmVlKGVhX2J1Zi0+eGF0dHIpOworCX0gZWxzZSBpZiAoZWFfYnVmLT5mbGFnICYgRUFfTkVXKSB7CisJCS8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgYSBuZXcgZHhkICovCisJCWZsdXNoX21ldGFwYWdlKGVhX2J1Zi0+bXApOworCX0gZWxzZSB7CisJCS8qIC0+eGF0dHIgbXVzdCBwb2ludCB0byBvcmlnaW5hbCBlYSdzIG1ldGFwYWdlICovCisJCXJjID0gZWFfd3JpdGUoaW5vZGUsIGVhX2J1Zi0+eGF0dHIsIG5ld19zaXplLCAmZWFfYnVmLT5uZXdfZWEpOworCQlkaXNjYXJkX21ldGFwYWdlKGVhX2J1Zi0+bXApOworCX0KKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXRpZCA9IHR4QmVnaW4oaW5vZGUtPmlfc2IsIDApOworCWRvd24oJmppLT5jb21taXRfc2VtKTsKKworCW9sZF9ibG9ja3MgPSBuZXdfYmxvY2tzID0gMDsKKworCWlmIChqaS0+ZWEuZmxhZyAmIERYRF9FWFRFTlQpIHsKKwkJaW52YWxpZGF0ZV9keGRfbWV0YXBhZ2VzKGlub2RlLCBqaS0+ZWEpOworCQlvbGRfYmxvY2tzID0gbGVuZ3RoRFhEKCZqaS0+ZWEpOworCX0KKworCWlmIChlYV9idWYpIHsKKwkJdHhFQSh0aWQsIGlub2RlLCAmamktPmVhLCAmZWFfYnVmLT5uZXdfZWEpOworCQlpZiAoZWFfYnVmLT5uZXdfZWEuZmxhZyAmIERYRF9FWFRFTlQpIHsKKwkJCW5ld19ibG9ja3MgPSBsZW5ndGhEWEQoJmVhX2J1Zi0+bmV3X2VhKTsKKwkJCWlmIChqaS0+ZWEuZmxhZyAmIERYRF9JTkxJTkUpCisJCQkJamktPm1vZGUyIHw9IElOTElORUVBOworCQl9CisJCWppLT5lYSA9IGVhX2J1Zi0+bmV3X2VhOworCX0gZWxzZSB7CisJCXR4RUEodGlkLCBpbm9kZSwgJmppLT5lYSwgTlVMTCk7CisJCWlmIChqaS0+ZWEuZmxhZyAmIERYRF9JTkxJTkUpCisJCQlqaS0+bW9kZTIgfD0gSU5MSU5FRUE7CisJCWppLT5lYS5mbGFnID0gMDsKKwkJamktPmVhLnNpemUgPSAwOworCX0KKworCS8qIElmIG9sZCBibG9ja3MgZXhpc3QsIHRoZXkgbXVzdCBiZSByZW1vdmVkIGZyb20gcXVvdGEgYWxsb2NhdGlvbi4gKi8KKwlpZiAob2xkX2Jsb2NrcykKKwkJRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgb2xkX2Jsb2Nrcyk7CisKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwlyYyA9IHR4Q29tbWl0KHRpZCwgMSwgJmlub2RlLCAwKTsKKwl0eEVuZCh0aWQpOworCXVwKCZqaS0+Y29tbWl0X3NlbSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBjYW5fc2V0X3N5c3RlbV94YXR0cgorICoKKyAqIFRoaXMgY29kZSBpcyBzcGVjaWZpYyB0byB0aGUgc3lzdGVtLiogbmFtZXNwYWNlLiAgSXQgY29udGFpbnMgcG9saWN5CisgKiB3aGljaCBkb2Vzbid0IGJlbG9uZyBpbiB0aGUgbWFpbiB4YXR0ciBjb2RlcGF0aC4KKyAqLworc3RhdGljIGludCBjYW5fc2V0X3N5c3RlbV94YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCWNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3QgdmFsdWVfbGVuKQoreworI2lmZGVmIENPTkZJR19KRlNfUE9TSVhfQUNMCisJc3RydWN0IHBvc2l4X2FjbCAqYWNsOworCWludCByYzsKKworCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qCisJICogWEFUVFJfTkFNRV9BQ0xfQUNDRVNTIGlzIHRpZWQgdG8gaV9tb2RlCisJICovCisJaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX0FDTF9BQ0NFU1MpID09IDApIHsKKwkJYWNsID0gcG9zaXhfYWNsX2Zyb21feGF0dHIodmFsdWUsIHZhbHVlX2xlbik7CisJCWlmIChJU19FUlIoYWNsKSkgeworCQkJcmMgPSBQVFJfRVJSKGFjbCk7CisJCQlwcmludGsoS0VSTl9FUlIgInBvc2l4X2FjbF9mcm9tX3hhdHRyIHJldHVybmVkICVkXG4iLAorCQkJICAgICAgIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlpZiAoYWNsKSB7CisJCQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CisJCQlyYyA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJm1vZGUpOworCQkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkgICAgICAgInBvc2l4X2FjbF9lcXVpdl9tb2RlIHJldHVybmVkICVkXG4iLAorCQkJCSAgICAgICByYyk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJfQorCQkvKgorCQkgKiBXZSdyZSBjaGFuZ2luZyB0aGUgQUNMLiAgR2V0IHJpZCBvZiB0aGUgY2FjaGVkIG9uZQorCQkgKi8KKwkJYWNsID1KRlNfSVAoaW5vZGUpLT5pX2FjbDsKKwkJaWYgKGFjbCAhPSBKRlNfQUNMX05PVF9DQUNIRUQpCisJCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCQlKRlNfSVAoaW5vZGUpLT5pX2FjbCA9IEpGU19BQ0xfTk9UX0NBQ0hFRDsKKworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX0FDTF9ERUZBVUxUKSA9PSAwKSB7CisJCWFjbCA9IHBvc2l4X2FjbF9mcm9tX3hhdHRyKHZhbHVlLCB2YWx1ZV9sZW4pOworCQlpZiAoSVNfRVJSKGFjbCkpIHsKKwkJCXJjID0gUFRSX0VSUihhY2wpOworCQkJcHJpbnRrKEtFUk5fRVJSICJwb3NpeF9hY2xfZnJvbV94YXR0ciByZXR1cm5lZCAlZFxuIiwKKwkJCSAgICAgICByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKworCQkvKgorCQkgKiBXZSdyZSBjaGFuZ2luZyB0aGUgZGVmYXVsdCBBQ0wuICBHZXQgcmlkIG9mIHRoZSBjYWNoZWQgb25lCisJCSAqLworCQlhY2wgPUpGU19JUChpbm9kZSktPmlfZGVmYXVsdF9hY2w7CisJCWlmIChhY2wgJiYgKGFjbCAhPSBKRlNfQUNMX05PVF9DQUNIRUQpKQorCQkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwkJSkZTX0lQKGlub2RlKS0+aV9kZWZhdWx0X2FjbCA9IEpGU19BQ0xfTk9UX0NBQ0hFRDsKKworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYJCQkvKiBDT05GSUdfSkZTX1BPU0lYX0FDTCAqLworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGludCBjYW5fc2V0X3hhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCB2YWx1ZV9sZW4pCit7CisJaWYgKElTX1JET05MWShpbm9kZSkpCisJCXJldHVybiAtRVJPRlM7CisKKwlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpIHx8IFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRVBFUk07CisKKwlpZihzdHJuY21wKG5hbWUsIFhBVFRSX1NZU1RFTV9QUkVGSVgsIFhBVFRSX1NZU1RFTV9QUkVGSVhfTEVOKSA9PSAwKQorCQkvKgorCQkgKiAic3lzdGVtLioiCisJCSAqLworCQlyZXR1cm4gY2FuX3NldF9zeXN0ZW1feGF0dHIoaW5vZGUsIG5hbWUsIHZhbHVlLCB2YWx1ZV9sZW4pOworCisJaWYoc3RybmNtcChuYW1lLCBYQVRUUl9UUlVTVEVEX1BSRUZJWCwgWEFUVFJfVFJVU1RFRF9QUkVGSVhfTEVOKSAhPSAwKQorCQlyZXR1cm4gKGNhcGFibGUoQ0FQX1NZU19BRE1JTikgPyAwIDogLUVQRVJNKTsKKworI2lmZGVmIENPTkZJR19KRlNfU0VDVVJJVFkKKwlpZiAoc3RybmNtcChuYW1lLCBYQVRUUl9TRUNVUklUWV9QUkVGSVgsIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWF9MRU4pCisJICAgICE9IDApCisJCXJldHVybiAwOwkvKiBMZWF2ZSBpdCB0byB0aGUgc2VjdXJpdHkgbW9kdWxlICovCisjZW5kaWYKKwkJCisJaWYoKHN0cm5jbXAobmFtZSwgWEFUVFJfVVNFUl9QUkVGSVgsIFhBVFRSX1VTRVJfUFJFRklYX0xFTikgIT0gMCkgJiYKKwkgICAoc3RybmNtcChuYW1lLCBYQVRUUl9PUzJfUFJFRklYLCBYQVRUUl9PUzJfUFJFRklYX0xFTikgIT0gMCkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJgorCSAgICAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgaW5vZGUtPmlfbW9kZSAmU19JU1ZUWCkpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXR1cm4gcGVybWlzc2lvbihpbm9kZSwgTUFZX1dSSVRFLCBOVUxMKTsKK30KKworaW50IF9famZzX3NldHhhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAorCQkgICBzaXplX3QgdmFsdWVfbGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGpmc19lYV9saXN0ICplYWxpc3Q7CisJc3RydWN0IGpmc19lYSAqZWEsICpvbGRfZWEgPSBOVUxMLCAqbmV4dF9lYSA9IE5VTEw7CisJc3RydWN0IGVhX2J1ZmZlciBlYV9idWY7CisJaW50IG9sZF9lYV9zaXplID0gMDsKKwlpbnQgeGF0dHJfc2l6ZTsKKwlpbnQgbmV3X3NpemU7CisJaW50IG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJY2hhciAqb3MybmFtZSA9IE5VTEw7CisJaW50IGZvdW5kID0gMDsKKwlpbnQgcmM7CisJaW50IGxlbmd0aDsKKworCWlmICgocmMgPSBjYW5fc2V0X3hhdHRyKGlub2RlLCBuYW1lLCB2YWx1ZSwgdmFsdWVfbGVuKSkpCisJCXJldHVybiByYzsKKworCWlmIChzdHJuY21wKG5hbWUsIFhBVFRSX09TMl9QUkVGSVgsIFhBVFRSX09TMl9QUkVGSVhfTEVOKSA9PSAwKSB7CisJCW9zMm5hbWUgPSBrbWFsbG9jKG5hbWVsZW4gLSBYQVRUUl9PUzJfUFJFRklYX0xFTiArIDEsCisJCQkJICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFvczJuYW1lKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXN0cmNweShvczJuYW1lLCBuYW1lICsgWEFUVFJfT1MyX1BSRUZJWF9MRU4pOworCQluYW1lID0gb3MybmFtZTsKKwkJbmFtZWxlbiAtPSBYQVRUUl9PUzJfUFJFRklYX0xFTjsKKwl9CisKKwlkb3duX3dyaXRlKCZKRlNfSVAoaW5vZGUpLT54YXR0cl9zZW0pOworCisJeGF0dHJfc2l6ZSA9IGVhX2dldChpbm9kZSwgJmVhX2J1ZiwgMCk7CisJaWYgKHhhdHRyX3NpemUgPCAwKSB7CisJCXJjID0geGF0dHJfc2l6ZTsKKwkJZ290byBvdXQ7CisJfQorCisgICAgICBhZ2FpbjoKKwllYWxpc3QgPSAoc3RydWN0IGpmc19lYV9saXN0ICopIGVhX2J1Zi54YXR0cjsKKwluZXdfc2l6ZSA9IHNpemVvZiAoc3RydWN0IGpmc19lYV9saXN0KTsKKworCWlmICh4YXR0cl9zaXplKSB7CisJCWZvciAoZWEgPSBGSVJTVF9FQShlYWxpc3QpOyBlYSA8IEVORF9FQUxJU1QoZWFsaXN0KTsKKwkJICAgICBlYSA9IE5FWFRfRUEoZWEpKSB7CisJCQlpZiAoKG5hbWVsZW4gPT0gZWEtPm5hbWVsZW4pICYmCisJCQkgICAgKG1lbWNtcChuYW1lLCBlYS0+bmFtZSwgbmFtZWxlbikgPT0gMCkpIHsKKwkJCQlmb3VuZCA9IDE7CisJCQkJaWYgKGZsYWdzICYgWEFUVFJfQ1JFQVRFKSB7CisJCQkJCXJjID0gLUVFWElTVDsKKwkJCQkJZ290byByZWxlYXNlOworCQkJCX0KKwkJCQlvbGRfZWEgPSBlYTsKKwkJCQlvbGRfZWFfc2l6ZSA9IEVBX1NJWkUoZWEpOworCQkJCW5leHRfZWEgPSBORVhUX0VBKGVhKTsKKwkJCX0gZWxzZQorCQkJCW5ld19zaXplICs9IEVBX1NJWkUoZWEpOworCQl9CisJfQorCisJaWYgKCFmb3VuZCkgeworCQlpZiAoZmxhZ3MgJiBYQVRUUl9SRVBMQUNFKSB7CisJCQlyYyA9IC1FTk9EQVRBOworCQkJZ290byByZWxlYXNlOworCQl9CisJCWlmICh2YWx1ZSA9PSBOVUxMKSB7CisJCQlyYyA9IDA7CisJCQlnb3RvIHJlbGVhc2U7CisJCX0KKwl9CisJaWYgKHZhbHVlKQorCQluZXdfc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBqZnNfZWEpICsgbmFtZWxlbiArIDEgKyB2YWx1ZV9sZW47CisKKwlpZiAobmV3X3NpemUgPiBlYV9idWYubWF4X3NpemUpIHsKKwkJLyoKKwkJICogV2UgbmVlZCB0byBhbGxvY2F0ZSBtb3JlIHNwYWNlIGZvciBtZXJnZWQgZWEgbGlzdC4KKwkJICogV2Ugc2hvdWxkIG9ubHkgaGF2ZSBsb29wIHRvIGFnYWluOiBvbmNlLgorCQkgKi8KKwkJZWFfcmVsZWFzZShpbm9kZSwgJmVhX2J1Zik7CisJCXhhdHRyX3NpemUgPSBlYV9nZXQoaW5vZGUsICZlYV9idWYsIG5ld19zaXplKTsKKwkJaWYgKHhhdHRyX3NpemUgPCAwKSB7CisJCQlyYyA9IHhhdHRyX3NpemU7CisJCQlnb3RvIG91dDsKKwkJfQorCQlnb3RvIGFnYWluOworCX0KKworCS8qIFJlbW92ZSBvbGQgZWEgb2YgdGhlIHNhbWUgbmFtZSAqLworCWlmIChmb3VuZCkgeworCQkvKiBudW1iZXIgb2YgYnl0ZXMgZm9sbG93aW5nIHRhcmdldCBFQSAqLworCQlsZW5ndGggPSAoY2hhciAqKSBFTkRfRUFMSVNUKGVhbGlzdCkgLSAoY2hhciAqKSBuZXh0X2VhOworCQlpZiAobGVuZ3RoID4gMCkKKwkJCW1lbW1vdmUob2xkX2VhLCBuZXh0X2VhLCBsZW5ndGgpOworCQl4YXR0cl9zaXplIC09IG9sZF9lYV9zaXplOworCX0KKworCS8qIEFkZCBuZXcgZW50cnkgdG8gdGhlIGVuZCAqLworCWlmICh2YWx1ZSkgeworCQlpZiAoeGF0dHJfc2l6ZSA9PSAwKQorCQkJLyogQ29tcGxldGVseSBuZXcgZWEgbGlzdCAqLworCQkJeGF0dHJfc2l6ZSA9IHNpemVvZiAoc3RydWN0IGpmc19lYV9saXN0KTsKKworCQllYSA9IChzdHJ1Y3QgamZzX2VhICopICgoY2hhciAqKSBlYWxpc3QgKyB4YXR0cl9zaXplKTsKKwkJZWEtPmZsYWcgPSAwOworCQllYS0+bmFtZWxlbiA9IG5hbWVsZW47CisJCWVhLT52YWx1ZWxlbiA9IChjcHVfdG9fbGUxNih2YWx1ZV9sZW4pKTsKKwkJbWVtY3B5KGVhLT5uYW1lLCBuYW1lLCBuYW1lbGVuKTsKKwkJZWEtPm5hbWVbbmFtZWxlbl0gPSAwOworCQlpZiAodmFsdWVfbGVuKQorCQkJbWVtY3B5KCZlYS0+bmFtZVtuYW1lbGVuICsgMV0sIHZhbHVlLCB2YWx1ZV9sZW4pOworCQl4YXR0cl9zaXplICs9IEVBX1NJWkUoZWEpOworCX0KKworCS8qIERFQlVHIC0gSWYgd2UgZGlkIHRoaXMgcmlnaHQsIHRoZXNlIG51bWJlciBtYXRjaCAqLworCWlmICh4YXR0cl9zaXplICE9IG5ld19zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImpmc194c2V0YXR0cjogeGF0dHJfc2l6ZSA9ICVkLCBuZXdfc2l6ZSA9ICVkXG4iLAorCQkgICAgICAgeGF0dHJfc2l6ZSwgbmV3X3NpemUpOworCisJCXJjID0gLUVJTlZBTDsKKwkJZ290byByZWxlYXNlOworCX0KKworCS8qCisJICogSWYgd2UncmUgbGVmdCB3aXRoIGFuIGVtcHR5IGxpc3QsIHRoZXJlJ3Mgbm8gZWEKKwkgKi8KKwlpZiAobmV3X3NpemUgPT0gc2l6ZW9mIChzdHJ1Y3QgamZzX2VhX2xpc3QpKQorCQluZXdfc2l6ZSA9IDA7CisKKwllYWxpc3QtPnNpemUgPSBjcHVfdG9fbGUzMihuZXdfc2l6ZSk7CisKKwlyYyA9IGVhX3B1dChpbm9kZSwgJmVhX2J1ZiwgbmV3X3NpemUpOworCisJZ290byBvdXQ7CisgICAgICByZWxlYXNlOgorCWVhX3JlbGVhc2UoaW5vZGUsICZlYV9idWYpOworICAgICAgb3V0OgorCXVwX3dyaXRlKCZKRlNfSVAoaW5vZGUpLT54YXR0cl9zZW0pOworCisJaWYgKG9zMm5hbWUpCisJCWtmcmVlKG9zMm5hbWUpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgamZzX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsCisJCSBzaXplX3QgdmFsdWVfbGVuLCBpbnQgZmxhZ3MpCit7CisJaWYgKHZhbHVlID09IE5VTEwpIHsJLyogZW1wdHkgRUEsIGRvIG5vdCByZW1vdmUgKi8KKwkJdmFsdWUgPSAiIjsKKwkJdmFsdWVfbGVuID0gMDsKKwl9CisKKwlyZXR1cm4gX19qZnNfc2V0eGF0dHIoZGVudHJ5LT5kX2lub2RlLCBuYW1lLCB2YWx1ZSwgdmFsdWVfbGVuLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgY2FuX2dldF94YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQoreworI2lmZGVmIENPTkZJR19KRlNfU0VDVVJJVFkKKwlpZihzdHJuY21wKG5hbWUsIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwgWEFUVFJfU0VDVVJJVFlfUFJFRklYX0xFTikgPT0gMCkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKworCWlmKHN0cm5jbXAobmFtZSwgWEFUVFJfVFJVU1RFRF9QUkVGSVgsIFhBVFRSX1RSVVNURURfUFJFRklYX0xFTikgPT0gMCkKKwkJcmV0dXJuIChjYXBhYmxlKENBUF9TWVNfQURNSU4pID8gMCA6IC1FUEVSTSk7CisKKwlpZihzdHJuY21wKG5hbWUsIFhBVFRSX1NZU1RFTV9QUkVGSVgsIFhBVFRSX1NZU1RFTV9QUkVGSVhfTEVOKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBwZXJtaXNzaW9uKGlub2RlLCBNQVlfUkVBRCwgTlVMTCk7Cit9CisKK3NzaXplX3QgX19qZnNfZ2V0eGF0dHIoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSwKKwkJICAgICAgIHNpemVfdCBidWZfc2l6ZSkKK3sKKwlzdHJ1Y3QgamZzX2VhX2xpc3QgKmVhbGlzdDsKKwlzdHJ1Y3QgamZzX2VhICplYTsKKwlzdHJ1Y3QgZWFfYnVmZmVyIGVhX2J1ZjsKKwlpbnQgeGF0dHJfc2l6ZTsKKwlzc2l6ZV90IHNpemU7CisJaW50IG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJY2hhciAqb3MybmFtZSA9IE5VTEw7CisJaW50IHJjOworCWNoYXIgKnZhbHVlOworCisJaWYgKChyYyA9IGNhbl9nZXRfeGF0dHIoaW5vZGUsIG5hbWUpKSkKKwkJcmV0dXJuIHJjOworCisJaWYgKHN0cm5jbXAobmFtZSwgWEFUVFJfT1MyX1BSRUZJWCwgWEFUVFJfT1MyX1BSRUZJWF9MRU4pID09IDApIHsKKwkJb3MybmFtZSA9IGttYWxsb2MobmFtZWxlbiAtIFhBVFRSX09TMl9QUkVGSVhfTEVOICsgMSwKKwkJCQkgIEdGUF9LRVJORUwpOworCQlpZiAoIW9zMm5hbWUpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJc3RyY3B5KG9zMm5hbWUsIG5hbWUgKyBYQVRUUl9PUzJfUFJFRklYX0xFTik7CisJCW5hbWUgPSBvczJuYW1lOworCQluYW1lbGVuIC09IFhBVFRSX09TMl9QUkVGSVhfTEVOOworCX0KKworCWRvd25fcmVhZCgmSkZTX0lQKGlub2RlKS0+eGF0dHJfc2VtKTsKKworCXhhdHRyX3NpemUgPSBlYV9nZXQoaW5vZGUsICZlYV9idWYsIDApOworCisJaWYgKHhhdHRyX3NpemUgPCAwKSB7CisJCXNpemUgPSB4YXR0cl9zaXplOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoeGF0dHJfc2l6ZSA9PSAwKQorCQlnb3RvIG5vdF9mb3VuZDsKKworCWVhbGlzdCA9IChzdHJ1Y3QgamZzX2VhX2xpc3QgKikgZWFfYnVmLnhhdHRyOworCisJLyogRmluZCB0aGUgbmFtZWQgYXR0cmlidXRlICovCisJZm9yIChlYSA9IEZJUlNUX0VBKGVhbGlzdCk7IGVhIDwgRU5EX0VBTElTVChlYWxpc3QpOyBlYSA9IE5FWFRfRUEoZWEpKQorCQlpZiAoKG5hbWVsZW4gPT0gZWEtPm5hbWVsZW4pICYmCisJCSAgICBtZW1jbXAobmFtZSwgZWEtPm5hbWUsIG5hbWVsZW4pID09IDApIHsKKwkJCS8qIEZvdW5kIGl0ICovCisJCQlzaXplID0gbGUxNl90b19jcHUoZWEtPnZhbHVlbGVuKTsKKwkJCWlmICghZGF0YSkKKwkJCQlnb3RvIHJlbGVhc2U7CisJCQllbHNlIGlmIChzaXplID4gYnVmX3NpemUpIHsKKwkJCQlzaXplID0gLUVSQU5HRTsKKwkJCQlnb3RvIHJlbGVhc2U7CisJCQl9CisJCQl2YWx1ZSA9ICgoY2hhciAqKSAmZWEtPm5hbWUpICsgZWEtPm5hbWVsZW4gKyAxOworCQkJbWVtY3B5KGRhdGEsIHZhbHVlLCBzaXplKTsKKwkJCWdvdG8gcmVsZWFzZTsKKwkJfQorICAgICAgbm90X2ZvdW5kOgorCXNpemUgPSAtRU5PREFUQTsKKyAgICAgIHJlbGVhc2U6CisJZWFfcmVsZWFzZShpbm9kZSwgJmVhX2J1Zik7CisgICAgICBvdXQ6CisJdXBfcmVhZCgmSkZTX0lQKGlub2RlKS0+eGF0dHJfc2VtKTsKKworCWlmIChvczJuYW1lKQorCQlrZnJlZShvczJuYW1lKTsKKworCXJldHVybiBzaXplOworfQorCitzc2l6ZV90IGpmc19nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEsCisJCSAgICAgc2l6ZV90IGJ1Zl9zaXplKQoreworCWludCBlcnI7CisKKwllcnIgPSBfX2pmc19nZXR4YXR0cihkZW50cnktPmRfaW5vZGUsIG5hbWUsIGRhdGEsIGJ1Zl9zaXplKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBObyBzcGVjaWFsIHBlcm1pc3Npb25zIGFyZSBuZWVkZWQgdG8gbGlzdCBhdHRyaWJ1dGVzIGV4Y2VwdCBmb3IgdHJ1c3RlZC4qCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNhbl9saXN0KHN0cnVjdCBqZnNfZWEgKmVhKQoreworCXJldHVybiAoc3RybmNtcChlYS0+bmFtZSwgWEFUVFJfVFJVU1RFRF9QUkVGSVgsCisJCQkgICAgWEFUVFJfVFJVU1RFRF9QUkVGSVhfTEVOKSB8fAorCQljYXBhYmxlKENBUF9TWVNfQURNSU4pKTsKK30KKworc3NpemVfdCBqZnNfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGNoYXIgKmRhdGEsIHNpemVfdCBidWZfc2l6ZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWNoYXIgKmJ1ZmZlcjsKKwlzc2l6ZV90IHNpemUgPSAwOworCWludCB4YXR0cl9zaXplOworCXN0cnVjdCBqZnNfZWFfbGlzdCAqZWFsaXN0OworCXN0cnVjdCBqZnNfZWEgKmVhOworCXN0cnVjdCBlYV9idWZmZXIgZWFfYnVmOworCisJZG93bl9yZWFkKCZKRlNfSVAoaW5vZGUpLT54YXR0cl9zZW0pOworCisJeGF0dHJfc2l6ZSA9IGVhX2dldChpbm9kZSwgJmVhX2J1ZiwgMCk7CisJaWYgKHhhdHRyX3NpemUgPCAwKSB7CisJCXNpemUgPSB4YXR0cl9zaXplOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoeGF0dHJfc2l6ZSA9PSAwKQorCQlnb3RvIHJlbGVhc2U7CisKKwllYWxpc3QgPSAoc3RydWN0IGpmc19lYV9saXN0ICopIGVhX2J1Zi54YXR0cjsKKworCS8qIGNvbXB1dGUgcmVxdWlyZWQgc2l6ZSBvZiBsaXN0ICovCisJZm9yIChlYSA9IEZJUlNUX0VBKGVhbGlzdCk7IGVhIDwgRU5EX0VBTElTVChlYWxpc3QpOyBlYSA9IE5FWFRfRUEoZWEpKSB7CisJICAgIAlpZiAoY2FuX2xpc3QoZWEpKQorCQkJc2l6ZSArPSBuYW1lX3NpemUoZWEpICsgMTsKKwl9CisKKwlpZiAoIWRhdGEpCisJCWdvdG8gcmVsZWFzZTsKKworCWlmIChzaXplID4gYnVmX3NpemUpIHsKKwkJc2l6ZSA9IC1FUkFOR0U7CisJCWdvdG8gcmVsZWFzZTsKKwl9CisKKwkvKiBDb3B5IGF0dHJpYnV0ZSBuYW1lcyB0byBidWZmZXIgKi8KKwlidWZmZXIgPSBkYXRhOworCWZvciAoZWEgPSBGSVJTVF9FQShlYWxpc3QpOyBlYSA8IEVORF9FQUxJU1QoZWFsaXN0KTsgZWEgPSBORVhUX0VBKGVhKSkgeworCSAgICAJaWYgKGNhbl9saXN0KGVhKSkgeworCQkJaW50IG5hbWVsZW4gPSBjb3B5X25hbWUoYnVmZmVyLCBlYSk7CisJCQlidWZmZXIgKz0gbmFtZWxlbiArIDE7CisJCX0KKwl9CisKKyAgICAgIHJlbGVhc2U6CisJZWFfcmVsZWFzZShpbm9kZSwgJmVhX2J1Zik7CisgICAgICBvdXQ6CisJdXBfcmVhZCgmSkZTX0lQKGlub2RlKS0+eGF0dHJfc2VtKTsKKwlyZXR1cm4gc2l6ZTsKK30KKworaW50IGpmc19yZW1vdmV4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIF9famZzX3NldHhhdHRyKGRlbnRyeS0+ZF9pbm9kZSwgbmFtZSwgTlVMTCwgMCwgWEFUVFJfUkVQTEFDRSk7Cit9CmRpZmYgLS1naXQgYS9mcy9saWJmcy5jIGIvZnMvbGliZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTBiMjk1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbGliZnMuYwpAQCAtMCwwICsxLDU0OSBAQAorLyoKKyAqCWZzL2xpYmZzLmMKKyAqCUxpYnJhcnkgZm9yIGZpbGVzeXN0ZW1zIHdyaXRlcnMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK2ludCBzaW1wbGVfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICBzdHJ1Y3Qga3N0YXQgKnN0YXQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlnZW5lcmljX2ZpbGxhdHRyKGlub2RlLCBzdGF0KTsKKwlzdGF0LT5ibG9ja3MgPSBpbm9kZS0+aV9tYXBwaW5nLT5ucnBhZ2VzIDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gOSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzaW1wbGVfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCit7CisJYnVmLT5mX3R5cGUgPSBzYi0+c19tYWdpYzsKKwlidWYtPmZfYnNpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJYnVmLT5mX25hbWVsZW4gPSBOQU1FX01BWDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJldGFpbmluZyBuZWdhdGl2ZSBkZW50cmllcyBmb3IgYW4gaW4tbWVtb3J5IGZpbGVzeXN0ZW0ganVzdCB3YXN0ZXMKKyAqIG1lbW9yeSBhbmQgbG9va3VwIHRpbWU6IGFycmFuZ2UgZm9yIHRoZW0gdG8gYmUgZGVsZXRlZCBpbW1lZGlhdGVseS4KKyAqLworc3RhdGljIGludCBzaW1wbGVfZGVsZXRlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBMb29rdXAgdGhlIGRhdGEuIFRoaXMgaXMgdHJpdmlhbCAtIGlmIHRoZSBkZW50cnkgZGlkbid0IGFscmVhZHkKKyAqIGV4aXN0LCB3ZSBrbm93IGl0IGlzIG5lZ2F0aXZlLiAgU2V0IGRfb3AgdG8gZGVsZXRlIG5lZ2F0aXZlIGRlbnRyaWVzLgorICovCitzdHJ1Y3QgZGVudHJ5ICpzaW1wbGVfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0YXRpYyBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgc2ltcGxlX2RlbnRyeV9vcGVyYXRpb25zID0geworCQkuZF9kZWxldGUgPSBzaW1wbGVfZGVsZXRlX2RlbnRyeSwKKwl9OworCisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IE5BTUVfTUFYKQorCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKKwlkZW50cnktPmRfb3AgPSAmc2ltcGxlX2RlbnRyeV9vcGVyYXRpb25zOworCWRfYWRkKGRlbnRyeSwgTlVMTCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBzaW1wbGVfc3luY19maWxlKHN0cnVjdCBmaWxlICogZmlsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCit7CisJcmV0dXJuIDA7Cit9CisgCitpbnQgZGNhY2hlX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0YXRpYyBzdHJ1Y3QgcXN0ciBjdXJzb3JfbmFtZSA9IHsubGVuID0gMSwgLm5hbWUgPSAiLiJ9OworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZF9hbGxvYyhmaWxlLT5mX2RlbnRyeSwgJmN1cnNvcl9uYW1lKTsKKworCXJldHVybiBmaWxlLT5wcml2YXRlX2RhdGEgPyAwIDogLUVOT01FTTsKK30KKworaW50IGRjYWNoZV9kaXJfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZHB1dChmaWxlLT5wcml2YXRlX2RhdGEpOworCXJldHVybiAwOworfQorCitsb2ZmX3QgZGNhY2hlX2Rpcl9sc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKK3sKKwlkb3duKCZmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCXN3aXRjaCAob3JpZ2luKSB7CisJCWNhc2UgMToKKwkJCW9mZnNldCArPSBmaWxlLT5mX3BvczsKKwkJY2FzZSAwOgorCQkJaWYgKG9mZnNldCA+PSAwKQorCQkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdXAoJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKG9mZnNldCAhPSBmaWxlLT5mX3BvcykgeworCQlmaWxlLT5mX3BvcyA9IG9mZnNldDsKKwkJaWYgKGZpbGUtPmZfcG9zID49IDIpIHsKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJCQlzdHJ1Y3QgZGVudHJ5ICpjdXJzb3IgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCQlsb2ZmX3QgbiA9IGZpbGUtPmZfcG9zIC0gMjsKKworCQkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJCQlsaXN0X2RlbCgmY3Vyc29yLT5kX2NoaWxkKTsKKwkJCXAgPSBmaWxlLT5mX2RlbnRyeS0+ZF9zdWJkaXJzLm5leHQ7CisJCQl3aGlsZSAobiAmJiBwICE9ICZmaWxlLT5mX2RlbnRyeS0+ZF9zdWJkaXJzKSB7CisJCQkJc3RydWN0IGRlbnRyeSAqbmV4dDsKKwkJCQluZXh0ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKwkJCQlpZiAoIWRfdW5oYXNoZWQobmV4dCkgJiYgbmV4dC0+ZF9pbm9kZSkKKwkJCQkJbi0tOworCQkJCXAgPSBwLT5uZXh0OworCQkJfQorCQkJbGlzdF9hZGRfdGFpbCgmY3Vyc29yLT5kX2NoaWxkLCBwKTsKKwkJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCX0KKwl9CisJdXAoJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJcmV0dXJuIG9mZnNldDsKK30KKworLyogUmVsYXRpb25zaGlwIGJldHdlZW4gaV9tb2RlIGFuZCB0aGUgRFRfeHh4IHR5cGVzICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgZHRfdHlwZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiAoaW5vZGUtPmlfbW9kZSA+PiAxMikgJiAxNTsKK30KKworLyoKKyAqIERpcmVjdG9yeSBpcyBsb2NrZWQgYW5kIGFsbCBwb3NpdGl2ZSBkZW50cmllcyBpbiBpdCBhcmUgc2FmZSwgc2luY2UKKyAqIGZvciByYW1mcy10eXBlIHRyZWVzIHRoZXkgY2FuJ3QgZ28gYXdheSB3aXRob3V0IHVubGluaygpIG9yIHJtZGlyKCksCisgKiBib3RoIGltcG9zc2libGUgZHVlIHRvIHRoZSBsb2NrIG9uIGRpcmVjdG9yeS4KKyAqLworCitpbnQgZGNhY2hlX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpjdXJzb3IgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKnEgPSAmY3Vyc29yLT5kX2NoaWxkOworCWlub190IGlubzsKKwlpbnQgaSA9IGZpbHAtPmZfcG9zOworCisJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJCWlubyA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9pbm87CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgaSwgaW5vLCBEVF9ESVIpIDwgMCkKKwkJCQlicmVhazsKKwkJCWZpbHAtPmZfcG9zKys7CisJCQlpKys7CisJCQkvKiBmYWxsdGhyb3VnaCAqLworCQljYXNlIDE6CisJCQlpbm8gPSBwYXJlbnRfaW5vKGRlbnRyeSk7CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIGksIGlubywgRFRfRElSKSA8IDApCisJCQkJYnJlYWs7CisJCQlmaWxwLT5mX3BvcysrOworCQkJaSsrOworCQkJLyogZmFsbHRocm91Z2ggKi8KKwkJZGVmYXVsdDoKKwkJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCQkJaWYgKGZpbHAtPmZfcG9zID09IDIpIHsKKwkJCQlsaXN0X2RlbChxKTsKKwkJCQlsaXN0X2FkZChxLCAmZGVudHJ5LT5kX3N1YmRpcnMpOworCQkJfQorCQkJZm9yIChwPXEtPm5leHQ7IHAgIT0gJmRlbnRyeS0+ZF9zdWJkaXJzOyBwPXAtPm5leHQpIHsKKwkJCQlzdHJ1Y3QgZGVudHJ5ICpuZXh0OworCQkJCW5leHQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBkZW50cnksIGRfY2hpbGQpOworCQkJCWlmIChkX3VuaGFzaGVkKG5leHQpIHx8ICFuZXh0LT5kX2lub2RlKQorCQkJCQljb250aW51ZTsKKworCQkJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBuZXh0LT5kX25hbWUubmFtZSwgbmV4dC0+ZF9uYW1lLmxlbiwgZmlscC0+Zl9wb3MsIG5leHQtPmRfaW5vZGUtPmlfaW5vLCBkdF90eXBlKG5leHQtPmRfaW5vZGUpKSA8IDApCisJCQkJCXJldHVybiAwOworCQkJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCQkJCS8qIG5leHQgaXMgc3RpbGwgYWxpdmUgKi8KKwkJCQlsaXN0X2RlbChxKTsKKwkJCQlsaXN0X2FkZChxLCBwKTsKKwkJCQlwID0gcTsKKwkJCQlmaWxwLT5mX3BvcysrOworCQkJfQorCQkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3NzaXplX3QgZ2VuZXJpY19yZWFkX2RpcihzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IHNpeiwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiAtRUlTRElSOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNpbXBsZV9kaXJfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBkY2FjaGVfZGlyX29wZW4sCisJLnJlbGVhc2UJPSBkY2FjaGVfZGlyX2Nsb3NlLAorCS5sbHNlZWsJCT0gZGNhY2hlX2Rpcl9sc2VlaywKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gZGNhY2hlX3JlYWRkaXIsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmxvb2t1cAkJPSBzaW1wbGVfbG9va3VwLAorfTsKKworLyoKKyAqIENvbW1vbiBoZWxwZXIgZm9yIHBzZXVkby1maWxlc3lzdGVtcyAoc29ja2ZzLCBwaXBlZnMsIGJkZXYgLSBzdHVmZiB0aGF0CisgKiB3aWxsIG5ldmVyIGJlIG1vdW50YWJsZSkKKyAqLworc3RydWN0IHN1cGVyX2Jsb2NrICoKK2dldF9zYl9wc2V1ZG8oc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsIGNoYXIgKm5hbWUsCisJc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgKm9wcywgdW5zaWduZWQgbG9uZyBtYWdpYykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBzZ2V0KGZzX3R5cGUsIE5VTEwsIHNldF9hbm9uX3N1cGVyLCBOVUxMKTsKKwlzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgZGVmYXVsdF9vcHMgPSB7LnN0YXRmcyA9IHNpbXBsZV9zdGF0ZnN9OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKnJvb3Q7CisJc3RydWN0IHFzdHIgZF9uYW1lID0gey5uYW1lID0gbmFtZSwgLmxlbiA9IHN0cmxlbihuYW1lKX07CisKKwlpZiAoSVNfRVJSKHMpKQorCQlyZXR1cm4gczsKKworCXMtPnNfZmxhZ3MgPSBNU19OT1VTRVI7CisJcy0+c19tYXhieXRlcyA9IH4wVUxMOworCXMtPnNfYmxvY2tzaXplID0gMTAyNDsKKwlzLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gMTA7CisJcy0+c19tYWdpYyA9IG1hZ2ljOworCXMtPnNfb3AgPSBvcHMgPyBvcHMgOiAmZGVmYXVsdF9vcHM7CisJcy0+c190aW1lX2dyYW4gPSAxOworCXJvb3QgPSBuZXdfaW5vZGUocyk7CisJaWYgKCFyb290KQorCQlnb3RvIEVub21lbTsKKwlyb290LT5pX21vZGUgPSBTX0lGRElSIHwgU19JUlVTUiB8IFNfSVdVU1I7CisJcm9vdC0+aV91aWQgPSByb290LT5pX2dpZCA9IDA7CisJcm9vdC0+aV9hdGltZSA9IHJvb3QtPmlfbXRpbWUgPSByb290LT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCWRlbnRyeSA9IGRfYWxsb2MoTlVMTCwgJmRfbmFtZSk7CisJaWYgKCFkZW50cnkpIHsKKwkJaXB1dChyb290KTsKKwkJZ290byBFbm9tZW07CisJfQorCWRlbnRyeS0+ZF9zYiA9IHM7CisJZGVudHJ5LT5kX3BhcmVudCA9IGRlbnRyeTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgcm9vdCk7CisJcy0+c19yb290ID0gZGVudHJ5OworCXMtPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOworCXJldHVybiBzOworCitFbm9tZW06CisJdXBfd3JpdGUoJnMtPnNfdW1vdW50KTsKKwlkZWFjdGl2YXRlX3N1cGVyKHMpOworCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworfQorCitpbnQgc2ltcGxlX2xpbmsoc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKworCWlub2RlLT5pX2N0aW1lID0gZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOworCWlub2RlLT5pX25saW5rKys7CisJYXRvbWljX2luYygmaW5vZGUtPmlfY291bnQpOworCWRnZXQoZGVudHJ5KTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzaW1wbGVfcG9zaXRpdmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXJldHVybiBkZW50cnktPmRfaW5vZGUgJiYgIWRfdW5oYXNoZWQoZGVudHJ5KTsKK30KKworaW50IHNpbXBsZV9lbXB0eShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGRlbnRyeSAqY2hpbGQ7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmZGVudHJ5LT5kX3N1YmRpcnMsIGRfY2hpbGQpCisJCWlmIChzaW1wbGVfcG9zaXRpdmUoY2hpbGQpKQorCQkJZ290byBvdXQ7CisJcmV0ID0gMTsKK291dDoKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK2ludCBzaW1wbGVfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWlub2RlLT5pX2N0aW1lID0gZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOworCWlub2RlLT5pX25saW5rLS07CisJZHB1dChkZW50cnkpOworCXJldHVybiAwOworfQorCitpbnQgc2ltcGxlX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaWYgKCFzaW1wbGVfZW1wdHkoZGVudHJ5KSkKKwkJcmV0dXJuIC1FTk9URU1QVFk7CisKKwlkZW50cnktPmRfaW5vZGUtPmlfbmxpbmstLTsKKwlzaW1wbGVfdW5saW5rKGRpciwgZGVudHJ5KTsKKwlkaXItPmlfbmxpbmstLTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNpbXBsZV9yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorCQlzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisJaW50IHRoZXlfYXJlX2RpcnMgPSBTX0lTRElSKG9sZF9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSk7CisKKwlpZiAoIXNpbXBsZV9lbXB0eShuZXdfZGVudHJ5KSkKKwkJcmV0dXJuIC1FTk9URU1QVFk7CisKKwlpZiAobmV3X2RlbnRyeS0+ZF9pbm9kZSkgeworCQlzaW1wbGVfdW5saW5rKG5ld19kaXIsIG5ld19kZW50cnkpOworCQlpZiAodGhleV9hcmVfZGlycykKKwkJCW9sZF9kaXItPmlfbmxpbmstLTsKKwl9IGVsc2UgaWYgKHRoZXlfYXJlX2RpcnMpIHsKKwkJb2xkX2Rpci0+aV9ubGluay0tOworCQluZXdfZGlyLT5pX25saW5rKys7CisJfQorCisJb2xkX2Rpci0+aV9jdGltZSA9IG9sZF9kaXItPmlfbXRpbWUgPSBuZXdfZGlyLT5pX2N0aW1lID0KKwkJbmV3X2Rpci0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzaW1wbGVfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXZvaWQgKmthZGRyOworCisJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJZ290byBvdXQ7CisKKwlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwltZW1zZXQoa2FkZHIsIDAsIFBBR0VfQ0FDSEVfU0laRSk7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKK291dDoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNpbXBsZV9wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCXVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCWlmICh0byAtIGZyb20gIT0gUEFHRV9DQUNIRV9TSVpFKSB7CisJCQl2b2lkICprYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJCW1lbXNldChrYWRkciwgMCwgZnJvbSk7CisJCQltZW1zZXQoa2FkZHIgKyB0bywgMCwgUEFHRV9DQUNIRV9TSVpFIC0gdG8pOworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCX0KKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHNpbXBsZV9jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlsb2ZmX3QgcG9zID0gKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyB0bzsKKworCS8qCisJICogTm8gbmVlZCB0byB1c2UgaV9zaXplX3JlYWQoKSBoZXJlLCB0aGUgaV9zaXplCisJICogY2Fubm90IGNoYW5nZSB1bmRlciB1cyBiZWNhdXNlIHdlIGhvbGQgdGhlIGlfc2VtLgorCSAqLworCWlmIChwb3MgPiBpbm9kZS0+aV9zaXplKQorCQlpX3NpemVfd3JpdGUoaW5vZGUsIHBvcyk7CisJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzaW1wbGVfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBtYWdpYywgc3RydWN0IHRyZWVfZGVzY3IgKmZpbGVzKQoreworCXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBzX29wcyA9IHsuc3RhdGZzID0gc2ltcGxlX3N0YXRmc307CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5ICpyb290OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlpbnQgaTsKKworCXMtPnNfYmxvY2tzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCXMtPnNfYmxvY2tzaXplX2JpdHMgPSBQQUdFX0NBQ0hFX1NISUZUOworCXMtPnNfbWFnaWMgPSBtYWdpYzsKKwlzLT5zX29wID0gJnNfb3BzOworCXMtPnNfdGltZV9ncmFuID0gMTsKKworCWlub2RlID0gbmV3X2lub2RlKHMpOworCWlmICghaW5vZGUpCisJCXJldHVybiAtRU5PTUVNOworCWlub2RlLT5pX21vZGUgPSBTX0lGRElSIHwgMDc1NTsKKwlpbm9kZS0+aV91aWQgPSBpbm9kZS0+aV9naWQgPSAwOworCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJaW5vZGUtPmlfb3AgPSAmc2ltcGxlX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT5pX2ZvcCA9ICZzaW1wbGVfZGlyX29wZXJhdGlvbnM7CisJcm9vdCA9IGRfYWxsb2Nfcm9vdChpbm9kZSk7CisJaWYgKCFyb290KSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZm9yIChpID0gMDsgIWZpbGVzLT5uYW1lIHx8IGZpbGVzLT5uYW1lWzBdOyBpKyssIGZpbGVzKyspIHsKKwkJaWYgKCFmaWxlcy0+bmFtZSkKKwkJCWNvbnRpbnVlOworCQlkZW50cnkgPSBkX2FsbG9jX25hbWUocm9vdCwgZmlsZXMtPm5hbWUpOworCQlpZiAoIWRlbnRyeSkKKwkJCWdvdG8gb3V0OworCQlpbm9kZSA9IG5ld19pbm9kZShzKTsKKwkJaWYgKCFpbm9kZSkKKwkJCWdvdG8gb3V0OworCQlpbm9kZS0+aV9tb2RlID0gU19JRlJFRyB8IGZpbGVzLT5tb2RlOworCQlpbm9kZS0+aV91aWQgPSBpbm9kZS0+aV9naWQgPSAwOworCQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCQlpbm9kZS0+aV9ibG9ja3MgPSAwOworCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJCWlub2RlLT5pX2ZvcCA9IGZpbGVzLT5vcHM7CisJCWlub2RlLT5pX2lubyA9IGk7CisJCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCX0KKwlzLT5zX3Jvb3QgPSByb290OworCXJldHVybiAwOworb3V0OgorCWRfZ2Vub2NpZGUocm9vdCk7CisJZHB1dChyb290KTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIERFRklORV9TUElOTE9DSyhwaW5fZnNfbG9jayk7CisKK2ludCBzaW1wbGVfcGluX2ZzKGNoYXIgKm5hbWUsIHN0cnVjdCB2ZnNtb3VudCAqKm1vdW50LCBpbnQgKmNvdW50KQoreworCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gTlVMTDsKKwlzcGluX2xvY2soJnBpbl9mc19sb2NrKTsKKwlpZiAodW5saWtlbHkoISptb3VudCkpIHsKKwkJc3Bpbl91bmxvY2soJnBpbl9mc19sb2NrKTsKKwkJbW50ID0gZG9fa2Vybl9tb3VudChuYW1lLCAwLCBuYW1lLCBOVUxMKTsKKwkJaWYgKElTX0VSUihtbnQpKQorCQkJcmV0dXJuIFBUUl9FUlIobW50KTsKKwkJc3Bpbl9sb2NrKCZwaW5fZnNfbG9jayk7CisJCWlmICghKm1vdW50KQorCQkJKm1vdW50ID0gbW50OworCX0KKwltbnRnZXQoKm1vdW50KTsKKwkrKypjb3VudDsKKwlzcGluX3VubG9jaygmcGluX2ZzX2xvY2spOworCW1udHB1dChtbnQpOworCXJldHVybiAwOworfQorCit2b2lkIHNpbXBsZV9yZWxlYXNlX2ZzKHN0cnVjdCB2ZnNtb3VudCAqKm1vdW50LCBpbnQgKmNvdW50KQoreworCXN0cnVjdCB2ZnNtb3VudCAqbW50OworCXNwaW5fbG9jaygmcGluX2ZzX2xvY2spOworCW1udCA9ICptb3VudDsKKwlpZiAoIS0tKmNvdW50KQorCQkqbW91bnQgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZwaW5fZnNfbG9jayk7CisJbW50cHV0KG1udCk7Cit9CisKK3NzaXplX3Qgc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodm9pZCBfX3VzZXIgKnRvLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcywKKwkJCQljb25zdCB2b2lkICpmcm9tLCBzaXplX3QgYXZhaWxhYmxlKQoreworCWxvZmZfdCBwb3MgPSAqcHBvczsKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBvcyA+PSBhdmFpbGFibGUpCisJCXJldHVybiAwOworCWlmIChjb3VudCA+IGF2YWlsYWJsZSAtIHBvcykKKwkJY291bnQgPSBhdmFpbGFibGUgLSBwb3M7CisJaWYgKGNvcHlfdG9fdXNlcih0bywgZnJvbSArIHBvcywgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkqcHBvcyA9IHBvcyArIGNvdW50OworCXJldHVybiBjb3VudDsKK30KKworLyoKKyAqIFRyYW5zYWN0aW9uIGJhc2VkIElPLgorICogVGhlIGZpbGUgZXhwZWN0cyBhIHNpbmdsZSB3cml0ZSB3aGljaCB0cmlnZ2VycyB0aGUgdHJhbnNhY3Rpb24sIGFuZCB0aGVuCisgKiBwb3NzaWJseSBhIHJlYWQgd2hpY2ggY29sbGVjdHMgdGhlIHJlc3VsdCAtIHdoaWNoIGlzIHN0b3JlZCBpbiBhCisgKiBmaWxlLWxvY2FsIGJ1ZmZlci4KKyAqLworY2hhciAqc2ltcGxlX3RyYW5zYWN0aW9uX2dldChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHNpbXBsZV90cmFuc2FjdGlvbl9hcmdyZXNwICphcjsKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNpbXBsZV90cmFuc2FjdGlvbl9sb2NrKTsKKworCWlmIChzaXplID4gU0lNUExFX1RSQU5TQUNUSU9OX0xJTUlUIC0gMSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVGQklHKTsKKworCWFyID0gKHN0cnVjdCBzaW1wbGVfdHJhbnNhY3Rpb25fYXJncmVzcCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWFyKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwaW5fbG9jaygmc2ltcGxlX3RyYW5zYWN0aW9uX2xvY2spOworCisJLyogb25seSBvbmUgd3JpdGUgYWxsb3dlZCBwZXIgb3BlbiAqLworCWlmIChmaWxlLT5wcml2YXRlX2RhdGEpIHsKKwkJc3Bpbl91bmxvY2soJnNpbXBsZV90cmFuc2FjdGlvbl9sb2NrKTsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFyKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKKwl9CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBhcjsKKworCXNwaW5fdW5sb2NrKCZzaW1wbGVfdHJhbnNhY3Rpb25fbG9jayk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYXItPmRhdGEsIGJ1Ziwgc2l6ZSkpCisJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworCisJcmV0dXJuIGFyLT5kYXRhOworfQorCitzc2l6ZV90IHNpbXBsZV90cmFuc2FjdGlvbl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3Qgc2l6ZSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHNpbXBsZV90cmFuc2FjdGlvbl9hcmdyZXNwICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmICghYXIpCisJCXJldHVybiAwOworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIHNpemUsIHBvcywgYXItPmRhdGEsIGFyLT5zaXplKTsKK30KKworaW50IHNpbXBsZV90cmFuc2FjdGlvbl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylmaWxlLT5wcml2YXRlX2RhdGEpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKGRjYWNoZV9kaXJfY2xvc2UpOworRVhQT1JUX1NZTUJPTChkY2FjaGVfZGlyX2xzZWVrKTsKK0VYUE9SVF9TWU1CT0woZGNhY2hlX2Rpcl9vcGVuKTsKK0VYUE9SVF9TWU1CT0woZGNhY2hlX3JlYWRkaXIpOworRVhQT1JUX1NZTUJPTChnZW5lcmljX3JlYWRfZGlyKTsKK0VYUE9SVF9TWU1CT0woZ2V0X3NiX3BzZXVkbyk7CitFWFBPUlRfU1lNQk9MKHNpbXBsZV9jb21taXRfd3JpdGUpOworRVhQT1JUX1NZTUJPTChzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnMpOworRVhQT1JUX1NZTUJPTChzaW1wbGVfZGlyX29wZXJhdGlvbnMpOworRVhQT1JUX1NZTUJPTChzaW1wbGVfZW1wdHkpOworRVhQT1JUX1NZTUJPTChkX2FsbG9jX25hbWUpOworRVhQT1JUX1NZTUJPTChzaW1wbGVfZmlsbF9zdXBlcik7CitFWFBPUlRfU1lNQk9MKHNpbXBsZV9nZXRhdHRyKTsKK0VYUE9SVF9TWU1CT0woc2ltcGxlX2xpbmspOworRVhQT1JUX1NZTUJPTChzaW1wbGVfbG9va3VwKTsKK0VYUE9SVF9TWU1CT0woc2ltcGxlX3Bpbl9mcyk7CitFWFBPUlRfU1lNQk9MKHNpbXBsZV9wcmVwYXJlX3dyaXRlKTsKK0VYUE9SVF9TWU1CT0woc2ltcGxlX3JlYWRwYWdlKTsKK0VYUE9SVF9TWU1CT0woc2ltcGxlX3JlbGVhc2VfZnMpOworRVhQT1JUX1NZTUJPTChzaW1wbGVfcmVuYW1lKTsKK0VYUE9SVF9TWU1CT0woc2ltcGxlX3JtZGlyKTsKK0VYUE9SVF9TWU1CT0woc2ltcGxlX3N0YXRmcyk7CitFWFBPUlRfU1lNQk9MKHNpbXBsZV9zeW5jX2ZpbGUpOworRVhQT1JUX1NZTUJPTChzaW1wbGVfdW5saW5rKTsKK0VYUE9SVF9TWU1CT0woc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIpOworRVhQT1JUX1NZTUJPTChzaW1wbGVfdHJhbnNhY3Rpb25fZ2V0KTsKK0VYUE9SVF9TWU1CT0woc2ltcGxlX3RyYW5zYWN0aW9uX3JlYWQpOworRVhQT1JUX1NZTUJPTChzaW1wbGVfdHJhbnNhY3Rpb25fcmVsZWFzZSk7CmRpZmYgLS1naXQgYS9mcy9sb2NrZC9NYWtlZmlsZSBiL2ZzL2xvY2tkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MjVhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9sb2NrZC9NYWtlZmlsZQpAQCAtMCwwICsxLDEwIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggbG9jayBtYW5hZ2VyIHN0dWZmCisjCisKK29iai0kKENPTkZJR19MT0NLRCkgKz0gbG9ja2QubworCitsb2NrZC1vYmpzLXkgOj0gY2xudGxvY2subyBjbG50cHJvYy5vIGhvc3QubyBzdmMubyBzdmNsb2NrLm8gc3Zjc2hhcmUubyBcCisJICAgICAgICBzdmNwcm9jLm8gc3Zjc3Vicy5vIG1vbi5vIHhkci5vCitsb2NrZC1vYmpzLSQoQ09ORklHX0xPQ0tEX1Y0KSArPSB4ZHI0Lm8gc3ZjNHByb2MubworbG9ja2Qtb2JqcwkJICAgICAgOj0gJChsb2NrZC1vYmpzLXkpCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9jbG50bG9jay5jIGIvZnMvbG9ja2QvY2xudGxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjcxMDNiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbG9ja2QvY2xudGxvY2suYwpAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqIGxpbnV4L2ZzL2xvY2tkL2NsbnRsb2NrLmMKKyAqCisgKiBMb2NrIGhhbmRsaW5nIGZvciB0aGUgY2xpZW50IHNpZGUgTkxNIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjZGVmaW5lIE5MTURCR19GQUNJTElUWQkJTkxNREJHX0NMSUVOVAorCisvKgorICogTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICovCitzdGF0aWMgaW50CQkJcmVjbGFpbWVyKHZvaWQgKnB0cik7CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBoYW5kbGUgYmxvY2tpbmcgYW5kIGdyYW50aW5nIGZyb20gdGhlCisgKiBjbGllbnQgcGVyc3BlY3RpdmUuCisgKi8KKworLyoKKyAqIFRoaXMgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGEgYmxvY2tlZCBjbGllbnQgbG9jay4KKyAqLworc3RydWN0IG5sbV93YWl0IHsKKwlzdHJ1Y3QgbmxtX3dhaXQgKgliX25leHQ7CQkvKiBsaW5rZWQgbGlzdCAqLworCXdhaXRfcXVldWVfaGVhZF90CWJfd2FpdDsJCS8qIHdoZXJlIHRvIHdhaXQgb24gKi8KKwlzdHJ1Y3QgbmxtX2hvc3QgKgliX2hvc3Q7CisJc3RydWN0IGZpbGVfbG9jayAqCWJfbG9jazsJCS8qIGxvY2FsIGZpbGUgbG9jayAqLworCXVuc2lnbmVkIHNob3J0CQliX3JlY2xhaW07CS8qIGdvdCB0byByZWNsYWltIGxvY2sgKi8KKwl1MzIJCQliX3N0YXR1czsJLyogZ3JhbnQgY2FsbGJhY2sgc3RhdHVzICovCit9OworCitzdGF0aWMgc3RydWN0IG5sbV93YWl0ICoJbmxtX2Jsb2NrZWQ7CisKKy8qCisgKiBCbG9jayBvbiBhIGxvY2sKKyAqLworaW50CitubG1jbG50X2Jsb2NrKHN0cnVjdCBubG1faG9zdCAqaG9zdCwgc3RydWN0IGZpbGVfbG9jayAqZmwsIHUzMiAqc3RhdHApCit7CisJc3RydWN0IG5sbV93YWl0CWJsb2NrLCAqKmhlYWQ7CisJaW50CQllcnI7CisJdTMyCQlwc3RhdGU7CisKKwlibG9jay5iX2hvc3QgICA9IGhvc3Q7CisJYmxvY2suYl9sb2NrICAgPSBmbDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZibG9jay5iX3dhaXQpOworCWJsb2NrLmJfc3RhdHVzID0gTkxNX0xDS19CTE9DS0VEOworCWJsb2NrLmJfbmV4dCAgID0gbmxtX2Jsb2NrZWQ7CisJbmxtX2Jsb2NrZWQgICAgPSAmYmxvY2s7CisKKwkvKiBSZW1lbWJlciBwc2V1ZG8gbnNtIHN0YXRlICovCisJcHN0YXRlID0gaG9zdC0+aF9zdGF0ZTsKKworCS8qIEdvIHRvIHNsZWVwIHdhaXRpbmcgZm9yIEdSQU5UIGNhbGxiYWNrLiBTb21lIHNlcnZlcnMgc2VlbQorCSAqIHRvIGxvc2UgY2FsbGJhY2tzLCBob3dldmVyLCBzbyB3ZSdyZSBnb2luZyB0byBwb2xsIGZyb20KKwkgKiB0aW1lIHRvIHRpbWUganVzdCB0byBtYWtlIHN1cmUuCisJICoKKwkgKiBGb3Igbm93LCB0aGUgcmV0cnkgZnJlcXVlbmN5IGlzIHByZXR0eSBoaWdoOyBub3JtYWxseSAKKwkgKiBhIDEgbWludXRlIHRpbWVvdXQgd291bGQgZG8uIFNlZSB0aGUgY29tbWVudCBiZWZvcmUKKwkgKiBubG1jbG50X2xvY2sgZm9yIGFuIGV4cGxhbmF0aW9uLgorCSAqLworCXNsZWVwX29uX3RpbWVvdXQoJmJsb2NrLmJfd2FpdCwgMzAqSFopOworCisJZm9yIChoZWFkID0gJm5sbV9ibG9ja2VkOyAqaGVhZDsgaGVhZCA9ICYoKmhlYWQpLT5iX25leHQpIHsKKwkJaWYgKCpoZWFkID09ICZibG9jaykgeworCQkJKmhlYWQgPSBibG9jay5iX25leHQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghc2lnbmFsbGVkKCkpIHsKKwkJKnN0YXRwID0gYmxvY2suYl9zdGF0dXM7CisJCXJldHVybiAwOworCX0KKworCS8qIE9rYXksIHdlIHdlcmUgaW50ZXJydXB0ZWQuIENhbmNlbCB0aGUgcGVuZGluZyByZXF1ZXN0CisJICogdW5sZXNzIHRoZSBzZXJ2ZXIgaGFzIHJlYm9vdGVkLgorCSAqLworCWlmIChwc3RhdGUgPT0gaG9zdC0+aF9zdGF0ZSAmJiAoZXJyID0gbmxtY2xudF9jYW5jZWwoaG9zdCwgZmwpKSA8IDApCisJCXByaW50ayhLRVJOX05PVElDRQorCQkJImxvY2tkOiBDQU5DRUwgY2FsbCBmYWlsZWQgKGVycm5vICVkKVxuIiwgLWVycik7CisKKwlyZXR1cm4gLUVSRVNUQVJUU1lTOworfQorCisvKgorICogVGhlIHNlcnZlciBsb2NrZCBoYXMgY2FsbGVkIHVzIGJhY2sgdG8gdGVsbCB1cyB0aGUgbG9jayB3YXMgZ3JhbnRlZAorICovCit1MzIKK25sbWNsbnRfZ3JhbnQoc3RydWN0IG5sbV9sb2NrICpsb2NrKQoreworCXN0cnVjdCBubG1fd2FpdAkqYmxvY2s7CisKKwkvKgorCSAqIExvb2sgdXAgYmxvY2tlZCByZXF1ZXN0IGJhc2VkIG9uIGFyZ3VtZW50cy4gCisJICogV2FybmluZzogbXVzdCBub3QgdXNlIGNvb2tpZSB0byBtYXRjaCBpdCEKKwkgKi8KKwlmb3IgKGJsb2NrID0gbmxtX2Jsb2NrZWQ7IGJsb2NrOyBibG9jayA9IGJsb2NrLT5iX25leHQpIHsKKwkJaWYgKG5sbV9jb21wYXJlX2xvY2tzKGJsb2NrLT5iX2xvY2ssICZsb2NrLT5mbCkpCisJCQlicmVhazsKKwl9CisKKwkvKiBPb29wcywgbm8gYmxvY2tlZCByZXF1ZXN0IGZvdW5kLiAqLworCWlmIChibG9jayA9PSBOVUxMKQorCQlyZXR1cm4gbmxtX2xja19kZW5pZWQ7CisKKwkvKiBBbHJpZ2h0LCB3ZSBmb3VuZCB0aGUgbG9jay4gU2V0IHRoZSByZXR1cm4gc3RhdHVzIGFuZAorCSAqIHdha2UgdXAgdGhlIGNhbGxlci4KKwkgKi8KKwlibG9jay0+Yl9zdGF0dXMgPSBOTE1fTENLX0dSQU5URUQ7CisJd2FrZV91cCgmYmxvY2stPmJfd2FpdCk7CisKKwlyZXR1cm4gbmxtX2dyYW50ZWQ7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHByb2NlZHVyZXMgZGVhbCB3aXRoIHRoZSByZWNvdmVyeSBvZiBsb2NrcyBhZnRlciBhCisgKiBzZXJ2ZXIgY3Jhc2guCisgKi8KKworLyoKKyAqIE1hcmsgdGhlIGxvY2tzIGZvciByZWNsYWltaW5nLgorICogRklYTUU6IEluIDIuNSB3ZSBkb24ndCB3YW50IHRvIGl0ZXJhdGUgdGhyb3VnaCBhbnkgZ2xvYmFsIGZpbGVfbG9ja19saXN0LgorICogICAgICAgIE1haW50YWluIE5MTSBsb2NrIHJlY2xhaW1pbmcgbGlzdHMgaW4gdGhlIG5sbV9ob3N0IGluc3RlYWQuCisgKi8KK3N0YXRpYwordm9pZCBubG1jbG50X21hcmtfcmVjbGFpbShzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGZpbGVfbG9jayAqZmw7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJmZpbGVfbG9ja19saXN0KSB7CisJCWZsID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBmaWxlX2xvY2ssIGZsX2xpbmspOworCisJCWlub2RlID0gZmwtPmZsX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCQlpZiAoaW5vZGUtPmlfc2ItPnNfbWFnaWMgIT0gTkZTX1NVUEVSX01BR0lDKQorCQkJY29udGludWU7CisJCWlmIChmbC0+ZmxfdS5uZnNfZmwub3duZXItPmhvc3QgIT0gaG9zdCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIShmbC0+ZmxfdS5uZnNfZmwuZmxhZ3MgJiBORlNfTENLX0dSQU5URUQpKQorCQkJY29udGludWU7CisJCWZsLT5mbF91Lm5mc19mbC5mbGFncyB8PSBORlNfTENLX1JFQ0xBSU07CisJfQorfQorCisvKgorICogU29tZW9uZSBoYXMgc2VudCB1cyBhbiBTTV9OT1RJRlkuIEVuc3VyZSB3ZSBiaW5kIHRvIHRoZSBuZXcgcG9ydCBudW1iZXIsCisgKiB0aGF0IHdlIG1hcmsgbG9ja3MgZm9yIHJlY2xhaW1pbmcsIGFuZCB0aGF0IHdlIGJ1bXAgdGhlIHBzZXVkbyBOU00gc3RhdGUuCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgbmxtY2xudF9wcmVwYXJlX3JlY2xhaW0oc3RydWN0IG5sbV9ob3N0ICpob3N0LCB1MzIgbmV3c3RhdGUpCit7CisJaG9zdC0+aF9tb25pdG9yZWQgPSAwOworCWhvc3QtPmhfbnNtc3RhdGUgPSBuZXdzdGF0ZTsKKwlob3N0LT5oX3N0YXRlKys7CisJaG9zdC0+aF9uZXh0cmViaW5kID0gMDsKKwlubG1fcmViaW5kX2hvc3QoaG9zdCk7CisJbmxtY2xudF9tYXJrX3JlY2xhaW0oaG9zdCk7CisJZHByaW50aygiTkxNOiByZWNsYWltaW5nIGxvY2tzIGZvciBob3N0ICVzIiwgaG9zdC0+aF9uYW1lKTsKK30KKworLyoKKyAqIFJlY2xhaW0gYWxsIGxvY2tzIG9uIHNlcnZlciBob3N0LiBXZSBkbyB0aGlzIGJ5IHNwYXduaW5nIGEgc2VwYXJhdGUKKyAqIHJlY2xhaW1lciB0aHJlYWQuCisgKi8KK3ZvaWQKK25sbWNsbnRfcmVjb3Zlcnkoc3RydWN0IG5sbV9ob3N0ICpob3N0LCB1MzIgbmV3c3RhdGUpCit7CisJaWYgKGhvc3QtPmhfcmVjbGFpbWluZysrKSB7CisJCWlmIChob3N0LT5oX25zbXN0YXRlID09IG5ld3N0YXRlKQorCQkJcmV0dXJuOworCQlubG1jbG50X3ByZXBhcmVfcmVjbGFpbShob3N0LCBuZXdzdGF0ZSk7CisJfSBlbHNlIHsKKwkJbmxtY2xudF9wcmVwYXJlX3JlY2xhaW0oaG9zdCwgbmV3c3RhdGUpOworCQlubG1fZ2V0X2hvc3QoaG9zdCk7CisJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisJCWlmIChrZXJuZWxfdGhyZWFkKHJlY2xhaW1lciwgaG9zdCwgQ0xPTkVfS0VSTkVMKSA8IDApCisJCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3JlY2xhaW1lcih2b2lkICpwdHIpCit7CisJc3RydWN0IG5sbV9ob3N0CSAgKmhvc3QgPSAoc3RydWN0IG5sbV9ob3N0ICopIHB0cjsKKwlzdHJ1Y3QgbmxtX3dhaXQJICAqYmxvY2s7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCXN0cnVjdCBmaWxlX2xvY2sgKmZsOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlkYWVtb25pemUoIiVzLXJlY2xhaW0iLCBob3N0LT5oX25hbWUpOworCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKKworCS8qIFRoaXMgb25lIGVuc3VyZXMgdGhhdCBvdXIgcGFyZW50IGRvZXNuJ3QgdGVybWluYXRlIHdoaWxlIHRoZQorCSAqIHJlY2xhaW0gaXMgaW4gcHJvZ3Jlc3MgKi8KKwlsb2NrX2tlcm5lbCgpOworCWxvY2tkX3VwKCk7CisKKwkvKiBGaXJzdCwgcmVjbGFpbSBhbGwgbG9ja3MgdGhhdCBoYXZlIGJlZW4gbWFya2VkLiAqLworcmVzdGFydDoKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJmZpbGVfbG9ja19saXN0KSB7CisJCWZsID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBmaWxlX2xvY2ssIGZsX2xpbmspOworCisJCWlub2RlID0gZmwtPmZsX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCQlpZiAoaW5vZGUtPmlfc2ItPnNfbWFnaWMgIT0gTkZTX1NVUEVSX01BR0lDKQorCQkJY29udGludWU7CisJCWlmIChmbC0+ZmxfdS5uZnNfZmwub3duZXItPmhvc3QgIT0gaG9zdCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIShmbC0+ZmxfdS5uZnNfZmwuZmxhZ3MgJiBORlNfTENLX1JFQ0xBSU0pKQorCQkJY29udGludWU7CisKKwkJZmwtPmZsX3UubmZzX2ZsLmZsYWdzICY9IH5ORlNfTENLX1JFQ0xBSU07CisJCW5sbWNsbnRfcmVjbGFpbShob3N0LCBmbCk7CisJCWlmIChzaWduYWxsZWQoKSkKKwkJCWJyZWFrOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJaG9zdC0+aF9yZWNsYWltaW5nID0gMDsKKworCS8qIE5vdywgd2FrZSB1cCBhbGwgcHJvY2Vzc2VzIHRoYXQgc2xlZXAgb24gYSBibG9ja2VkIGxvY2sgKi8KKwlmb3IgKGJsb2NrID0gbmxtX2Jsb2NrZWQ7IGJsb2NrOyBibG9jayA9IGJsb2NrLT5iX25leHQpIHsKKwkJaWYgKGJsb2NrLT5iX2hvc3QgPT0gaG9zdCkgeworCQkJYmxvY2stPmJfc3RhdHVzID0gTkxNX0xDS19ERU5JRURfR1JBQ0VfUEVSSU9EOworCQkJd2FrZV91cCgmYmxvY2stPmJfd2FpdCk7CisJCX0KKwl9CisKKwkvKiBSZWxlYXNlIGhvc3QgaGFuZGxlIGFmdGVyIHVzZSAqLworCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbG9ja2RfZG93bigpOworCXVubG9ja19rZXJuZWwoKTsKKwltb2R1bGVfcHV0X2FuZF9leGl0KDApOworfQpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvY2xudHByb2MuYyBiL2ZzL2xvY2tkL2NsbnRwcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0MDc2MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2xvY2tkL2NsbnRwcm9jLmMKQEAgLTAsMCArMSw4MjAgQEAKKy8qCisgKiBsaW51eC9mcy9sb2NrZC9jbG50cHJvYy5jCisgKgorICogUlBDIHByb2NlZHVyZXMgZm9yIHRoZSBjbGllbnQgc2lkZSBOTE0gaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9sb2NrZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3NtX2ludGVyLmg+CisKKyNkZWZpbmUgTkxNREJHX0ZBQ0lMSVRZCQlOTE1EQkdfQ0xJRU5UCisjZGVmaW5lIE5MTUNMTlRfR1JBQ0VfV0FJVAkoNSpIWikKKworc3RhdGljIGludAlubG1jbG50X3Rlc3Qoc3RydWN0IG5sbV9ycXN0ICosIHN0cnVjdCBmaWxlX2xvY2sgKik7CitzdGF0aWMgaW50CW5sbWNsbnRfbG9jayhzdHJ1Y3QgbmxtX3Jxc3QgKiwgc3RydWN0IGZpbGVfbG9jayAqKTsKK3N0YXRpYyBpbnQJbmxtY2xudF91bmxvY2soc3RydWN0IG5sbV9ycXN0ICosIHN0cnVjdCBmaWxlX2xvY2sgKik7CitzdGF0aWMgdm9pZAlubG1jbG50X3VubG9ja19jYWxsYmFjayhzdHJ1Y3QgcnBjX3Rhc2sgKik7CitzdGF0aWMgdm9pZAlubG1jbG50X2NhbmNlbF9jYWxsYmFjayhzdHJ1Y3QgcnBjX3Rhc2sgKik7CitzdGF0aWMgaW50CW5sbV9zdGF0X3RvX2Vycm5vKHUzMiBzdGF0KTsKK3N0YXRpYyB2b2lkCW5sbWNsbnRfbG9ja3NfaW5pdF9wcml2YXRlKHN0cnVjdCBmaWxlX2xvY2sgKmZsLCBzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpOworCisvKgorICogQ29va2llIGNvdW50ZXIgZm9yIE5MTSByZXF1ZXN0cworICovCitzdGF0aWMgdTMyCW5sbV9jb29raWUgPSAweDEyMzQ7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBubG1jbG50X25leHRfY29va2llKHN0cnVjdCBubG1fY29va2llICpjKQoreworCW1lbWNweShjLT5kYXRhLCAmbmxtX2Nvb2tpZSwgNCk7CisJbWVtc2V0KGMtPmRhdGErNCwgMCwgNCk7CisJYy0+bGVuPTQ7CisJbmxtX2Nvb2tpZSsrOworfQorCitzdGF0aWMgc3RydWN0IG5sbV9sb2Nrb3duZXIgKm5sbV9nZXRfbG9ja293bmVyKHN0cnVjdCBubG1fbG9ja293bmVyICpsb2Nrb3duZXIpCit7CisJYXRvbWljX2luYygmbG9ja293bmVyLT5jb3VudCk7CisJcmV0dXJuIGxvY2tvd25lcjsKK30KKworc3RhdGljIHZvaWQgbmxtX3B1dF9sb2Nrb3duZXIoc3RydWN0IG5sbV9sb2Nrb3duZXIgKmxvY2tvd25lcikKK3sKKwlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJmxvY2tvd25lci0+Y291bnQsICZsb2Nrb3duZXItPmhvc3QtPmhfbG9jaykpCisJCXJldHVybjsKKwlsaXN0X2RlbCgmbG9ja293bmVyLT5saXN0KTsKKwlzcGluX3VubG9jaygmbG9ja293bmVyLT5ob3N0LT5oX2xvY2spOworCW5sbV9yZWxlYXNlX2hvc3QobG9ja293bmVyLT5ob3N0KTsKKwlrZnJlZShsb2Nrb3duZXIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBubG1fcGlkYnVzeShzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIHVpbnQzMl90IHBpZCkKK3sKKwlzdHJ1Y3QgbmxtX2xvY2tvd25lciAqbG9ja293bmVyOworCWxpc3RfZm9yX2VhY2hfZW50cnkobG9ja293bmVyLCAmaG9zdC0+aF9sb2Nrb3duZXJzLCBsaXN0KSB7CisJCWlmIChsb2Nrb3duZXItPnBpZCA9PSBwaWQpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBfX25sbV9hbGxvY19waWQoc3RydWN0IG5sbV9ob3N0ICpob3N0KQoreworCXVpbnQzMl90IHJlczsKKwlkbyB7CisJCXJlcyA9IGhvc3QtPmhfcGlkY291bnQrKzsKKwl9IHdoaWxlIChubG1fcGlkYnVzeShob3N0LCByZXMpIDwgMCk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHN0cnVjdCBubG1fbG9ja293bmVyICpfX25sbV9maW5kX2xvY2tvd25lcihzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIGZsX293bmVyX3Qgb3duZXIpCit7CisJc3RydWN0IG5sbV9sb2Nrb3duZXIgKmxvY2tvd25lcjsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2tvd25lciwgJmhvc3QtPmhfbG9ja293bmVycywgbGlzdCkgeworCQlpZiAobG9ja293bmVyLT5vd25lciAhPSBvd25lcikKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gbmxtX2dldF9sb2Nrb3duZXIobG9ja293bmVyKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxtX2xvY2tvd25lciAqbmxtX2ZpbmRfbG9ja293bmVyKHN0cnVjdCBubG1faG9zdCAqaG9zdCwgZmxfb3duZXJfdCBvd25lcikKK3sKKwlzdHJ1Y3QgbmxtX2xvY2tvd25lciAqcmVzLCAqbmV3ID0gTlVMTDsKKworCXNwaW5fbG9jaygmaG9zdC0+aF9sb2NrKTsKKwlyZXMgPSBfX25sbV9maW5kX2xvY2tvd25lcihob3N0LCBvd25lcik7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrKCZob3N0LT5oX2xvY2spOworCQluZXcgPSAoc3RydWN0IG5sbV9sb2Nrb3duZXIgKilrbWFsbG9jKHNpemVvZigqbmV3KSwgR0ZQX0tFUk5FTCk7CisJCXNwaW5fbG9jaygmaG9zdC0+aF9sb2NrKTsKKwkJcmVzID0gX19ubG1fZmluZF9sb2Nrb3duZXIoaG9zdCwgb3duZXIpOworCQlpZiAocmVzID09IE5VTEwgJiYgbmV3ICE9IE5VTEwpIHsKKwkJCXJlcyA9IG5ldzsKKwkJCWF0b21pY19zZXQoJm5ldy0+Y291bnQsIDEpOworCQkJbmV3LT5vd25lciA9IG93bmVyOworCQkJbmV3LT5waWQgPSBfX25sbV9hbGxvY19waWQoaG9zdCk7CisJCQluZXctPmhvc3QgPSBubG1fZ2V0X2hvc3QoaG9zdCk7CisJCQlsaXN0X2FkZCgmbmV3LT5saXN0LCAmaG9zdC0+aF9sb2Nrb3duZXJzKTsKKwkJCW5ldyA9IE5VTEw7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmhvc3QtPmhfbG9jayk7CisJaWYgKG5ldyAhPSBOVUxMKQorCQlrZnJlZShuZXcpOworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGFyZ3VtZW50cyBmb3IgVEVTVC9MT0NLL1VOTE9DSy9DQU5DRUwgY2FsbHMKKyAqLworc3RhdGljIHZvaWQgbmxtY2xudF9zZXRsb2NrYXJncyhzdHJ1Y3QgbmxtX3Jxc3QgKnJlcSwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IG5sbV9hcmdzCSphcmdwID0gJnJlcS0+YV9hcmdzOworCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOworCisJbmxtY2xudF9uZXh0X2Nvb2tpZSgmYXJncC0+Y29va2llKTsKKwlhcmdwLT5zdGF0ZSAgID0gbnNtX2xvY2FsX3N0YXRlOworCW1lbWNweSgmbG9jay0+ZmgsIE5GU19GSChmbC0+ZmxfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpLCBzaXplb2Yoc3RydWN0IG5mc19maCkpOworCWxvY2stPmNhbGxlciAgPSBzeXN0ZW1fdXRzbmFtZS5ub2RlbmFtZTsKKwlsb2NrLT5vaC5kYXRhID0gcmVxLT5hX293bmVyOworCWxvY2stPm9oLmxlbiAgPSBzcHJpbnRmKHJlcS0+YV9vd25lciwgIiVkQCVzIiwKKwkJCQljdXJyZW50LT5waWQsIHN5c3RlbV91dHNuYW1lLm5vZGVuYW1lKTsKKwlsb2Nrc19jb3B5X2xvY2soJmxvY2stPmZsLCBmbCk7Cit9CisKK3N0YXRpYyB2b2lkIG5sbWNsbnRfcmVsZWFzZV9sb2NrYXJncyhzdHJ1Y3QgbmxtX3Jxc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9ICZyZXEtPmFfYXJncy5sb2NrLmZsOworCisJaWYgKGZsLT5mbF9vcHMgJiYgZmwtPmZsX29wcy0+ZmxfcmVsZWFzZV9wcml2YXRlKQorCQlmbC0+Zmxfb3BzLT5mbF9yZWxlYXNlX3ByaXZhdGUoZmwpOworfQorCisvKgorICogSW5pdGlhbGl6ZSBhcmd1bWVudHMgZm9yIEdSQU5URUQgY2FsbC4gVGhlIG5sbV9ycXN0IHN0cnVjdHVyZQorICogaGFzIGJlZW4gY2xlYXJlZCBhbHJlYWR5LgorICovCitpbnQKK25sbWNsbnRfc2V0Z3JhbnRhcmdzKHN0cnVjdCBubG1fcnFzdCAqY2FsbCwgc3RydWN0IG5sbV9sb2NrICpsb2NrKQoreworCWxvY2tzX2NvcHlfbG9jaygmY2FsbC0+YV9hcmdzLmxvY2suZmwsICZsb2NrLT5mbCk7CisJbWVtY3B5KCZjYWxsLT5hX2FyZ3MubG9jay5maCwgJmxvY2stPmZoLCBzaXplb2YoY2FsbC0+YV9hcmdzLmxvY2suZmgpKTsKKwljYWxsLT5hX2FyZ3MubG9jay5jYWxsZXIgPSBzeXN0ZW1fdXRzbmFtZS5ub2RlbmFtZTsKKwljYWxsLT5hX2FyZ3MubG9jay5vaC5sZW4gPSBsb2NrLT5vaC5sZW47CisKKwkvKiBzZXQgZGVmYXVsdCBkYXRhIGFyZWEgKi8KKwljYWxsLT5hX2FyZ3MubG9jay5vaC5kYXRhID0gY2FsbC0+YV9vd25lcjsKKworCWlmIChsb2NrLT5vaC5sZW4gPiBOTE1DTE5UX09IU0laRSkgeworCQl2b2lkICpkYXRhID0ga21hbGxvYyhsb2NrLT5vaC5sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoIWRhdGEpIHsKKwkJCW5sbWNsbnRfZnJlZWdyYW50YXJncyhjYWxsKTsKKwkJCXJldHVybiAwOworCQl9CisJCWNhbGwtPmFfYXJncy5sb2NrLm9oLmRhdGEgPSAodTggKikgZGF0YTsKKwl9CisKKwltZW1jcHkoY2FsbC0+YV9hcmdzLmxvY2sub2guZGF0YSwgbG9jay0+b2guZGF0YSwgbG9jay0+b2gubGVuKTsKKwlyZXR1cm4gMTsKK30KKwordm9pZAorbmxtY2xudF9mcmVlZ3JhbnRhcmdzKHN0cnVjdCBubG1fcnFzdCAqY2FsbCkKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9ICZjYWxsLT5hX2FyZ3MubG9jay5mbDsKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgd2UgYWxsb2NhdGVkIG1lbW9yeSBmb3IgdGhlIG93bmVyLgorCSAqLworCWlmIChjYWxsLT5hX2FyZ3MubG9jay5vaC5kYXRhICE9ICh1OCAqKSBjYWxsLT5hX293bmVyKSB7CisJCWtmcmVlKGNhbGwtPmFfYXJncy5sb2NrLm9oLmRhdGEpOworCX0KKwlpZiAoZmwtPmZsX29wcyAmJiBmbC0+Zmxfb3BzLT5mbF9yZWxlYXNlX3ByaXZhdGUpCisJCWZsLT5mbF9vcHMtPmZsX3JlbGVhc2VfcHJpdmF0ZShmbCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgTkxNIGNsaWVudC4KKyAqLworaW50CitubG1jbG50X3Byb2Moc3RydWN0IGlub2RlICppbm9kZSwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIJKm5mc3NydiA9IE5GU19TRVJWRVIoaW5vZGUpOworCXN0cnVjdCBubG1faG9zdAkJKmhvc3Q7CisJc3RydWN0IG5sbV9ycXN0CQlyZXFzdCwgKmNhbGwgPSAmcmVxc3Q7CisJc2lnc2V0X3QJCW9sZHNldDsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlpbnQJCQlzdGF0dXMsIHByb3RvLCB2ZXJzOworCisJdmVycyA9IChORlNfUFJPVE8oaW5vZGUpLT52ZXJzaW9uID09IDMpID8gNCA6IDE7CisJaWYgKE5GU19QUk9UTyhpbm9kZSktPnZlcnNpb24gPiAzKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiTkZTdjQgZmlsZSBsb2NraW5nIG5vdCBpbXBsZW1lbnRlZCFcbiIpOworCQlyZXR1cm4gLUVOT0xDSzsKKwl9CisKKwkvKiBSZXRyaWV2ZSB0cmFuc3BvcnQgcHJvdG9jb2wgZnJvbSBORlMgY2xpZW50ICovCisJcHJvdG8gPSBORlNfQ0xJRU5UKGlub2RlKS0+Y2xfeHBydC0+cHJvdDsKKworCWlmICghKGhvc3QgPSBubG1jbG50X2xvb2t1cF9ob3N0KE5GU19BRERSKGlub2RlKSwgcHJvdG8sIHZlcnMpKSkKKwkJcmV0dXJuIC1FTk9MQ0s7CisKKwkvKiBDcmVhdGUgUlBDIGNsaWVudCBoYW5kbGUgaWYgbm90IHRoZXJlLCBhbmQgY29weSBzb2Z0CisJICogYW5kIGludHIgZmxhZ3MgZnJvbSBORlMgY2xpZW50LiAqLworCWlmIChob3N0LT5oX3JwY2NsbnQgPT0gTlVMTCkgeworCQlzdHJ1Y3QgcnBjX2NsbnQJKmNsbnQ7CisKKwkJLyogQmluZCBhbiBycGMgY2xpZW50IHRvIHRoaXMgaG9zdCBoYW5kbGUgKGRvZXMgbm90CisJCSAqIHBlcmZvcm0gYSBwb3J0bWFwcGVyIGxvb2t1cCkgKi8KKwkJaWYgKCEoY2xudCA9IG5sbV9iaW5kX2hvc3QoaG9zdCkpKSB7CisJCQlzdGF0dXMgPSAtRU5PTENLOworCQkJZ290byBkb25lOworCQl9CisJCWNsbnQtPmNsX3NvZnRydHJ5ID0gbmZzc3J2LT5jbGllbnQtPmNsX3NvZnRydHJ5OworCQljbG50LT5jbF9pbnRyICAgICA9IG5mc3Nydi0+Y2xpZW50LT5jbF9pbnRyOworCQljbG50LT5jbF9jaGF0dHkgICA9IG5mc3Nydi0+Y2xpZW50LT5jbF9jaGF0dHk7CisJfQorCisJLyogS2VlcCB0aGUgb2xkIHNpZ25hbCBtYXNrICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKwlvbGRzZXQgPSBjdXJyZW50LT5ibG9ja2VkOworCisJLyogSWYgd2UncmUgY2xlYW5pbmcgdXAgbG9ja3MgYmVjYXVzZSB0aGUgcHJvY2VzcyBpcyBleGl0aW5nLAorCSAqIHBlcmZvcm0gdGhlIFJQQyBjYWxsIGFzeW5jaHJvbm91c2x5LiAqLworCWlmICgoSVNfU0VUTEsoY21kKSB8fCBJU19TRVRMS1coY21kKSkKKwkgICAgJiYgZmwtPmZsX3R5cGUgPT0gRl9VTkxDSworCSAgICAmJiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9FWElUSU5HKSkgeworCQlzaWdmaWxsc2V0KCZjdXJyZW50LT5ibG9ja2VkKTsJLyogTWFzayBhbGwgc2lnbmFscyAqLworCQlyZWNhbGNfc2lncGVuZGluZygpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisKKwkJY2FsbCA9IG5sbWNsbnRfYWxsb2NfY2FsbCgpOworCQlpZiAoIWNhbGwpIHsKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9yZXN0b3JlOworCQl9CisJCWNhbGwtPmFfZmxhZ3MgPSBSUENfVEFTS19BU1lOQzsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJCW1lbXNldChjYWxsLCAwLCBzaXplb2YoKmNhbGwpKTsKKwkJbG9ja3NfaW5pdF9sb2NrKCZjYWxsLT5hX2FyZ3MubG9jay5mbCk7CisJCWxvY2tzX2luaXRfbG9jaygmY2FsbC0+YV9yZXMubG9jay5mbCk7CisJfQorCWNhbGwtPmFfaG9zdCA9IGhvc3Q7CisKKwlubG1jbG50X2xvY2tzX2luaXRfcHJpdmF0ZShmbCwgaG9zdCk7CisKKwkvKiBTZXQgdXAgdGhlIGFyZ3VtZW50IHN0cnVjdCAqLworCW5sbWNsbnRfc2V0bG9ja2FyZ3MoY2FsbCwgZmwpOworCisJaWYgKElTX1NFVExLKGNtZCkgfHwgSVNfU0VUTEtXKGNtZCkpIHsKKwkJaWYgKGZsLT5mbF90eXBlICE9IEZfVU5MQ0spIHsKKwkJCWNhbGwtPmFfYXJncy5ibG9jayA9IElTX1NFVExLVyhjbWQpID8gMSA6IDA7CisJCQlzdGF0dXMgPSBubG1jbG50X2xvY2soY2FsbCwgZmwpOworCQl9IGVsc2UKKwkJCXN0YXR1cyA9IG5sbWNsbnRfdW5sb2NrKGNhbGwsIGZsKTsKKwl9IGVsc2UgaWYgKElTX0dFVExLKGNtZCkpCisJCXN0YXR1cyA9IG5sbWNsbnRfdGVzdChjYWxsLCBmbCk7CisJZWxzZQorCQlzdGF0dXMgPSAtRUlOVkFMOworCisgb3V0X3Jlc3RvcmU6CisJc3Bpbl9sb2NrX2lycXNhdmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKwljdXJyZW50LT5ibG9ja2VkID0gb2xkc2V0OworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCitkb25lOgorCWRwcmludGsoImxvY2tkOiBjbG50IHByb2MgcmV0dXJucyAlZFxuIiwgc3RhdHVzKTsKKwlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MKG5sbWNsbnRfcHJvYyk7CisKKy8qCisgKiBBbGxvY2F0ZSBhbiBOTE0gUlBDIGNhbGwgc3RydWN0CisgKi8KK3N0cnVjdCBubG1fcnFzdCAqCitubG1jbG50X2FsbG9jX2NhbGwodm9pZCkKK3sKKwlzdHJ1Y3QgbmxtX3Jxc3QJKmNhbGw7CisKKwl3aGlsZSAoIXNpZ25hbGxlZCgpKSB7CisJCWNhbGwgPSAoc3RydWN0IG5sbV9ycXN0ICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBubG1fcnFzdCksIEdGUF9LRVJORUwpOworCQlpZiAoY2FsbCkgeworCQkJbWVtc2V0KGNhbGwsIDAsIHNpemVvZigqY2FsbCkpOworCQkJbG9ja3NfaW5pdF9sb2NrKCZjYWxsLT5hX2FyZ3MubG9jay5mbCk7CisJCQlsb2Nrc19pbml0X2xvY2soJmNhbGwtPmFfcmVzLmxvY2suZmwpOworCQkJcmV0dXJuIGNhbGw7CisJCX0KKwkJcHJpbnRrKCJubG1jbG50X2FsbG9jX2NhbGw6IGZhaWxlZCwgd2FpdGluZyBmb3IgbWVtb3J5XG4iKTsKKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXNjaGVkdWxlX3RpbWVvdXQoNSpIWik7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IG5sbV93YWl0X29uX2dyYWNlKHdhaXRfcXVldWVfaGVhZF90ICpxdWV1ZSkKK3sKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwlpbnQgc3RhdHVzID0gLUVJTlRSOworCisJcHJlcGFyZV90b193YWl0KHF1ZXVlLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlpZiAoIXNpZ25hbGxlZCAoKSkgeworCQlzY2hlZHVsZV90aW1lb3V0KE5MTUNMTlRfR1JBQ0VfV0FJVCk7CisJCXRyeV90b19mcmVlemUoUEZfRlJFRVpFKTsKKwkJaWYgKCFzaWduYWxsZWQgKCkpCisJCQlzdGF0dXMgPSAwOworCX0KKwlmaW5pc2hfd2FpdChxdWV1ZSwgJndhaXQpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBHZW5lcmljIE5MTSBjYWxsCisgKi8KK3N0YXRpYyBpbnQKK25sbWNsbnRfY2FsbChzdHJ1Y3QgbmxtX3Jxc3QgKnJlcSwgdTMyIHByb2MpCit7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0ID0gcmVxLT5hX2hvc3Q7CisJc3RydWN0IHJwY19jbG50CSpjbG50OworCXN0cnVjdCBubG1fYXJncwkqYXJncCA9ICZyZXEtPmFfYXJnczsKKwlzdHJ1Y3QgbmxtX3JlcwkqcmVzcCA9ICZyZXEtPmFfcmVzOworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfYXJncAk9IGFyZ3AsCisJCS5ycGNfcmVzcAk9IHJlc3AsCisJfTsKKwlpbnQJCXN0YXR1czsKKworCWRwcmludGsoImxvY2tkOiBjYWxsIHByb2NlZHVyZSAlZCBvbiAlc1xuIiwKKwkJCShpbnQpcHJvYywgaG9zdC0+aF9uYW1lKTsKKworCWRvIHsKKwkJaWYgKGhvc3QtPmhfcmVjbGFpbWluZyAmJiAhYXJncC0+cmVjbGFpbSkKKwkJCWdvdG8gaW5fZ3JhY2VfcGVyaW9kOworCisJCS8qIElmIHdlIGhhdmUgbm8gUlBDIGNsaWVudCB5ZXQsIGNyZWF0ZSBvbmUuICovCisJCWlmICgoY2xudCA9IG5sbV9iaW5kX2hvc3QoaG9zdCkpID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT0xDSzsKKwkJbXNnLnJwY19wcm9jID0gJmNsbnQtPmNsX3Byb2NpbmZvW3Byb2NdOworCisJCS8qIFBlcmZvcm0gdGhlIFJQQyBjYWxsLiBJZiBhbiBlcnJvciBvY2N1cnMsIHRyeSBhZ2FpbiAqLworCQlpZiAoKHN0YXR1cyA9IHJwY19jYWxsX3N5bmMoY2xudCwgJm1zZywgMCkpIDwgMCkgeworCQkJZHByaW50aygibG9ja2Q6IHJwY19jYWxsIHJldHVybmVkIGVycm9yICVkXG4iLCAtc3RhdHVzKTsKKwkJCXN3aXRjaCAoc3RhdHVzKSB7CisJCQljYXNlIC1FUFJPVE9OT1NVUFBPUlQ6CisJCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgLUVDT05OUkVGVVNFRDoKKwkJCWNhc2UgLUVUSU1FRE9VVDoKKwkJCWNhc2UgLUVOT1RDT05OOgorCQkJCW5sbV9yZWJpbmRfaG9zdChob3N0KTsKKwkJCQlzdGF0dXMgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJY2FzZSAtRVJFU1RBUlRTWVM6CisJCQkJcmV0dXJuIHNpZ25hbGxlZCAoKSA/IC1FSU5UUiA6IHN0YXR1czsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJfSBlbHNlCisJCWlmIChyZXNwLT5zdGF0dXMgPT0gTkxNX0xDS19ERU5JRURfR1JBQ0VfUEVSSU9EKSB7CisJCQlkcHJpbnRrKCJsb2NrZDogc2VydmVyIGluIGdyYWNlIHBlcmlvZFxuIik7CisJCQlpZiAoYXJncC0+cmVjbGFpbSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICJsb2NrZDogc3B1cmlvdXMgZ3JhY2UgcGVyaW9kIHJlamVjdD8hXG4iKTsKKwkJCQlyZXR1cm4gLUVOT0xDSzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghYXJncC0+cmVjbGFpbSkgeworCQkJCS8qIFdlIGFwcGVhciB0byBiZSBvdXQgb2YgdGhlIGdyYWNlIHBlcmlvZCAqLworCQkJCXdha2VfdXBfYWxsKCZob3N0LT5oX2dyYWNld2FpdCk7CisJCQl9CisJCQlkcHJpbnRrKCJsb2NrZDogc2VydmVyIHJldHVybnMgc3RhdHVzICVkXG4iLCByZXNwLT5zdGF0dXMpOworCQkJcmV0dXJuIDA7CS8qIE9rYXksIGNhbGwgY29tcGxldGUgKi8KKwkJfQorCitpbl9ncmFjZV9wZXJpb2Q6CisJCS8qCisJCSAqIFRoZSBzZXJ2ZXIgaGFzIHJlYm9vdGVkIGFuZCBhcHBlYXJzIHRvIGJlIGluIHRoZSBncmFjZQorCQkgKiBwZXJpb2QgZHVyaW5nIHdoaWNoIGxvY2tzIGFyZSBvbmx5IGFsbG93ZWQgdG8gYmUKKwkJICogcmVjbGFpbWVkLgorCQkgKiBXZSBjYW4gb25seSBiYWNrIG9mZiBhbmQgdHJ5IGFnYWluIGxhdGVyLgorCQkgKi8KKwkJc3RhdHVzID0gbmxtX3dhaXRfb25fZ3JhY2UoJmhvc3QtPmhfZ3JhY2V3YWl0KTsKKwl9IHdoaWxlIChzdGF0dXMgPT0gMCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogR2VuZXJpYyBOTE0gY2FsbCwgYXN5bmMgdmVyc2lvbi4KKyAqLworaW50CitubG1zdmNfYXN5bmNfY2FsbChzdHJ1Y3QgbmxtX3Jxc3QgKnJlcSwgdTMyIHByb2MsIHJwY19hY3Rpb24gY2FsbGJhY2spCit7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0ID0gcmVxLT5hX2hvc3Q7CisJc3RydWN0IHJwY19jbG50CSpjbG50OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfYXJncAk9ICZyZXEtPmFfYXJncywKKwkJLnJwY19yZXNwCT0gJnJlcS0+YV9yZXMsCisJfTsKKwlpbnQJCXN0YXR1czsKKworCWRwcmludGsoImxvY2tkOiBjYWxsIHByb2NlZHVyZSAlZCBvbiAlcyAoYXN5bmMpXG4iLAorCQkJKGludClwcm9jLCBob3N0LT5oX25hbWUpOworCisJLyogSWYgd2UgaGF2ZSBubyBSUEMgY2xpZW50IHlldCwgY3JlYXRlIG9uZS4gKi8KKwlpZiAoKGNsbnQgPSBubG1fYmluZF9ob3N0KGhvc3QpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0xDSzsKKwltc2cucnBjX3Byb2MgPSAmY2xudC0+Y2xfcHJvY2luZm9bcHJvY107CisKKyAgICAgICAgLyogYm9vdHN0cmFwIGFuZCBraWNrIG9mZiB0aGUgYXN5bmMgUlBDIGNhbGwgKi8KKyAgICAgICAgc3RhdHVzID0gcnBjX2NhbGxfYXN5bmMoY2xudCwgJm1zZywgUlBDX1RBU0tfQVNZTkMsIGNhbGxiYWNrLCByZXEpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmxtY2xudF9hc3luY19jYWxsKHN0cnVjdCBubG1fcnFzdCAqcmVxLCB1MzIgcHJvYywgcnBjX2FjdGlvbiBjYWxsYmFjaykKK3sKKwlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3QgPSByZXEtPmFfaG9zdDsKKwlzdHJ1Y3QgcnBjX2NsbnQJKmNsbnQ7CisJc3RydWN0IG5sbV9hcmdzCSphcmdwID0gJnJlcS0+YV9hcmdzOworCXN0cnVjdCBubG1fcmVzCSpyZXNwID0gJnJlcS0+YV9yZXM7CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19hcmdwCT0gYXJncCwKKwkJLnJwY19yZXNwCT0gcmVzcCwKKwl9OworCWludAkJc3RhdHVzOworCisJZHByaW50aygibG9ja2Q6IGNhbGwgcHJvY2VkdXJlICVkIG9uICVzIChhc3luYylcbiIsCisJCQkoaW50KXByb2MsIGhvc3QtPmhfbmFtZSk7CisKKwkvKiBJZiB3ZSBoYXZlIG5vIFJQQyBjbGllbnQgeWV0LCBjcmVhdGUgb25lLiAqLworCWlmICgoY2xudCA9IG5sbV9iaW5kX2hvc3QoaG9zdCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTENLOworCW1zZy5ycGNfcHJvYyA9ICZjbG50LT5jbF9wcm9jaW5mb1twcm9jXTsKKworCS8qIEluY3JlbWVudCBob3N0IHJlZmNvdW50ICovCisJbmxtX2dldF9ob3N0KGhvc3QpOworICAgICAgICAvKiBib290c3RyYXAgYW5kIGtpY2sgb2ZmIHRoZSBhc3luYyBSUEMgY2FsbCAqLworICAgICAgICBzdGF0dXMgPSBycGNfY2FsbF9hc3luYyhjbG50LCAmbXNnLCBSUENfVEFTS19BU1lOQywgY2FsbGJhY2ssIHJlcSk7CisJaWYgKHN0YXR1cyA8IDApCisJCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIFRFU1QgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIGNvbmZsaWN0aW5nIGxvY2sKKyAqLworc3RhdGljIGludAorbmxtY2xudF90ZXN0KHN0cnVjdCBubG1fcnFzdCAqcmVxLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlpbnQJc3RhdHVzOworCisJc3RhdHVzID0gbmxtY2xudF9jYWxsKHJlcSwgTkxNUFJPQ19URVNUKTsKKwlubG1jbG50X3JlbGVhc2VfbG9ja2FyZ3MocmVxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCXN0YXR1cyA9IHJlcS0+YV9yZXMuc3RhdHVzOworCWlmIChzdGF0dXMgPT0gTkxNX0xDS19HUkFOVEVEKSB7CisJCWZsLT5mbF90eXBlID0gRl9VTkxDSzsKKwl9IGlmIChzdGF0dXMgPT0gTkxNX0xDS19ERU5JRUQpIHsKKwkJLyoKKwkJICogUmVwb3J0IHRoZSBjb25mbGljdGluZyBsb2NrIGJhY2sgdG8gdGhlIGFwcGxpY2F0aW9uLgorCQkgKi8KKwkJbG9ja3NfY29weV9sb2NrKGZsLCAmcmVxLT5hX3Jlcy5sb2NrLmZsKTsKKwkJZmwtPmZsX3BpZCA9IDA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIG5sbV9zdGF0X3RvX2Vycm5vKHJlcS0+YV9yZXMuc3RhdHVzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmxtY2xudF9sb2Nrc19jb3B5X2xvY2soc3RydWN0IGZpbGVfbG9jayAqbmV3LCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwltZW1jcHkoJm5ldy0+ZmxfdS5uZnNfZmwsICZmbC0+ZmxfdS5uZnNfZmwsIHNpemVvZihuZXctPmZsX3UubmZzX2ZsKSk7CisJbmxtX2dldF9sb2Nrb3duZXIobmV3LT5mbF91Lm5mc19mbC5vd25lcik7Cit9CisKK3N0YXRpYyB2b2lkIG5sbWNsbnRfbG9ja3NfcmVsZWFzZV9wcml2YXRlKHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCW5sbV9wdXRfbG9ja293bmVyKGZsLT5mbF91Lm5mc19mbC5vd25lcik7CisJZmwtPmZsX29wcyA9IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9sb2NrX29wZXJhdGlvbnMgbmxtY2xudF9sb2NrX29wcyA9IHsKKwkuZmxfY29weV9sb2NrID0gbmxtY2xudF9sb2Nrc19jb3B5X2xvY2ssCisJLmZsX3JlbGVhc2VfcHJpdmF0ZSA9IG5sbWNsbnRfbG9ja3NfcmVsZWFzZV9wcml2YXRlLAorfTsKKworc3RhdGljIHZvaWQgbmxtY2xudF9sb2Nrc19pbml0X3ByaXZhdGUoc3RydWN0IGZpbGVfbG9jayAqZmwsIHN0cnVjdCBubG1faG9zdCAqaG9zdCkKK3sKKwlCVUdfT04oZmwtPmZsX29wcyAhPSBOVUxMKTsKKwlmbC0+ZmxfdS5uZnNfZmwuc3RhdGUgPSAwOworCWZsLT5mbF91Lm5mc19mbC5mbGFncyA9IDA7CisJZmwtPmZsX3UubmZzX2ZsLm93bmVyID0gbmxtX2ZpbmRfbG9ja293bmVyKGhvc3QsIGZsLT5mbF9vd25lcik7CisJZmwtPmZsX29wcyA9ICZubG1jbG50X2xvY2tfb3BzOworfQorCitzdGF0aWMgdm9pZCBkb192ZnNfbG9jayhzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlpbnQgcmVzID0gMDsKKwlzd2l0Y2ggKGZsLT5mbF9mbGFncyAmIChGTF9QT1NJWHxGTF9GTE9DSykpIHsKKwkJY2FzZSBGTF9QT1NJWDoKKwkJCXJlcyA9IHBvc2l4X2xvY2tfZmlsZV93YWl0KGZsLT5mbF9maWxlLCBmbCk7CisJCQlicmVhazsKKwkJY2FzZSBGTF9GTE9DSzoKKwkJCXJlcyA9IGZsb2NrX2xvY2tfZmlsZV93YWl0KGZsLT5mbF9maWxlLCBmbCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCX0KKwlpZiAocmVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFZGUyBpcyBvdXQgb2Ygc3luYyB3aXRoIGxvY2sgbWFuYWdlciFcbiIsCisJCQkJX19GVU5DVElPTl9fKTsKK30KKworLyoKKyAqIExPQ0s6IFRyeSB0byBjcmVhdGUgYSBsb2NrCisgKgorICoJCQlQcm9ncmFtbWVyIEhhcmFzc21lbnQgQWxlcnQKKyAqCisgKiBXaGVuIGdpdmVuIGEgYmxvY2tpbmcgbG9jayByZXF1ZXN0IGluIGEgc3luYyBSUEMgY2FsbCwgdGhlIEhQVVggbG9ja2QKKyAqIHdpbGwgZmFpdGhmdWxseSByZXR1cm4gTENLX0JMT0NLRUQgYnV0IG5ldmVyIGNhcmVzIHRvIG5vdGlmeSB1cyB3aGVuCisgKiB0aGUgbG9jayBjb3VsZCBiZSBncmFudGVkLiBUaGlzIHdheSwgb3VyIGxvY2FsIHByb2Nlc3MgY291bGQgaGFuZworICogYXJvdW5kIGZvcmV2ZXIgd2FpdGluZyBmb3IgdGhlIGNhbGxiYWNrLgorICoKKyAqICBTb2x1dGlvbiBBOglJbXBsZW1lbnQgYnVzeS13YWl0aW5nCisgKiAgU29sdXRpb24gQjogVXNlIHRoZSBhc3luYyB2ZXJzaW9uIG9mIHRoZSBjYWxsIChOTE1fTE9DS197TVNHLFJFU30pCisgKgorICogRm9yIG5vdyBJIGFtIGltcGxlbWVudGluZyBzb2x1dGlvbiBBLCBiZWNhdXNlIEkgaGF0ZSB0aGUgaWRlYSBvZgorICogcmUtaW1wbGVtZW50aW5nIGxvY2tkIGZvciBhIHRoaXJkIHRpbWUgaW4gdHdvIG1vbnRocy4gVGhlIGFzeW5jCisgKiBjYWxscyBzaG91bGRuJ3QgYmUgdG9vIGhhcmQgdG8gZG8sIGhvd2V2ZXIuCisgKgorICogVGhpcyBpcyBvbmUgb2YgdGhlIGxvdmVseSB0aGluZ3MgYWJvdXQgc3RhbmRhcmRzIGluIHRoZSBORlMgYXJlYToKKyAqIHRoZXkncmUgc28gc29mdCBhbmQgc3F1aXNoeSB5b3UgY2FuJ3QgcmVhbGx5IGJsYW1lIEhQIGZvciBkb2luZyB0aGlzLgorICovCitzdGF0aWMgaW50CitubG1jbG50X2xvY2soc3RydWN0IG5sbV9ycXN0ICpyZXEsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXN0cnVjdCBubG1faG9zdAkqaG9zdCA9IHJlcS0+YV9ob3N0OworCXN0cnVjdCBubG1fcmVzCSpyZXNwID0gJnJlcS0+YV9yZXM7CisJaW50CQlzdGF0dXM7CisKKwlpZiAoIWhvc3QtPmhfbW9uaXRvcmVkICYmIG5zbV9tb25pdG9yKGhvc3QpIDwgMCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImxvY2tkOiBmYWlsZWQgdG8gbW9uaXRvciAlc1xuIiwKKwkJCQkJaG9zdC0+aF9uYW1lKTsKKwkJc3RhdHVzID0gLUVOT0xDSzsKKwkJZ290byBvdXQ7CisJfQorCisJZG8geworCQlpZiAoKHN0YXR1cyA9IG5sbWNsbnRfY2FsbChyZXEsIE5MTVBST0NfTE9DSykpID49IDApIHsKKwkJCWlmIChyZXNwLT5zdGF0dXMgIT0gTkxNX0xDS19CTE9DS0VEKQorCQkJCWJyZWFrOworCQkJc3RhdHVzID0gbmxtY2xudF9ibG9jayhob3N0LCBmbCwgJnJlc3AtPnN0YXR1cyk7CisJCX0KKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIG91dDsKKwl9IHdoaWxlIChyZXNwLT5zdGF0dXMgPT0gTkxNX0xDS19CTE9DS0VEICYmIHJlcS0+YV9hcmdzLmJsb2NrKTsKKworCWlmIChyZXNwLT5zdGF0dXMgPT0gTkxNX0xDS19HUkFOVEVEKSB7CisJCWZsLT5mbF91Lm5mc19mbC5zdGF0ZSA9IGhvc3QtPmhfc3RhdGU7CisJCWZsLT5mbF91Lm5mc19mbC5mbGFncyB8PSBORlNfTENLX0dSQU5URUQ7CisJCWZsLT5mbF9mbGFncyB8PSBGTF9TTEVFUDsKKwkJZG9fdmZzX2xvY2soZmwpOworCX0KKwlzdGF0dXMgPSBubG1fc3RhdF90b19lcnJubyhyZXNwLT5zdGF0dXMpOworb3V0OgorCW5sbWNsbnRfcmVsZWFzZV9sb2NrYXJncyhyZXEpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBSRUNMQUlNOiBUcnkgdG8gcmVjbGFpbSBhIGxvY2sKKyAqLworaW50CitubG1jbG50X3JlY2xhaW0oc3RydWN0IG5sbV9ob3N0ICpob3N0LCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzdHJ1Y3QgbmxtX3Jxc3QgcmVxc3QsICpyZXE7CisJaW50CQlzdGF0dXM7CisKKwlyZXEgPSAmcmVxc3Q7CisJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsKKwlsb2Nrc19pbml0X2xvY2soJnJlcS0+YV9hcmdzLmxvY2suZmwpOworCWxvY2tzX2luaXRfbG9jaygmcmVxLT5hX3Jlcy5sb2NrLmZsKTsKKwlyZXEtPmFfaG9zdCAgPSBob3N0OworCXJlcS0+YV9mbGFncyA9IDA7CisKKwkvKiBTZXQgdXAgdGhlIGFyZ3VtZW50IHN0cnVjdCAqLworCW5sbWNsbnRfc2V0bG9ja2FyZ3MocmVxLCBmbCk7CisJcmVxLT5hX2FyZ3MucmVjbGFpbSA9IDE7CisKKwlpZiAoKHN0YXR1cyA9IG5sbWNsbnRfY2FsbChyZXEsIE5MTVBST0NfTE9DSykpID49IDAKKwkgJiYgcmVxLT5hX3Jlcy5zdGF0dXMgPT0gTkxNX0xDS19HUkFOVEVEKQorCQlyZXR1cm4gMDsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgImxvY2tkOiBmYWlsZWQgdG8gcmVjbGFpbSBsb2NrIGZvciBwaWQgJWQgIgorCQkJCSIoZXJybm8gJWQsIHN0YXR1cyAlZClcbiIsIGZsLT5mbF9waWQsCisJCQkJc3RhdHVzLCByZXEtPmFfcmVzLnN0YXR1cyk7CisKKwkvKgorCSAqIEZJWE1FOiBUaGlzIGlzIGEgc2VyaW91cyBmYWlsdXJlLiBXZSBjYW4KKwkgKgorCSAqICBhLglJZ25vcmUgdGhlIHByb2JsZW0KKwkgKiAgYi4JU2VuZCB0aGUgb3duaW5nIHByb2Nlc3Mgc29tZSBzaWduYWwgKExpbnV4IGRvZXNuJ3QgaGF2ZQorCSAqCVNJR0xPU1QsIHRob3VnaC4uLikKKwkgKiAgYy4JUmV0cnkgdGhlIG9wZXJhdGlvbgorCSAqCisJICogVW50aWwgc29tZW9uZSBjb21lcyB1cCB3aXRoIGEgc2ltcGxlIGltcGxlbWVudGF0aW9uCisJICogZm9yIGIgb3IgYywgSSdsbCBjaG9vc2Ugb3B0aW9uIGEuCisJICovCisKKwlyZXR1cm4gLUVOT0xDSzsKK30KKworLyoKKyAqIFVOTE9DSzogcmVtb3ZlIGFuIGV4aXN0aW5nIGxvY2sKKyAqLworc3RhdGljIGludAorbmxtY2xudF91bmxvY2soc3RydWN0IG5sbV9ycXN0ICpyZXEsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXN0cnVjdCBubG1fcmVzCSpyZXNwID0gJnJlcS0+YV9yZXM7CisJaW50CQlzdGF0dXM7CisKKwkvKiBDbGVhbiB0aGUgR1JBTlRFRCBmbGFnIG5vdyBzbyB0aGUgbG9jayBkb2Vzbid0IGdldAorCSAqIHJlY2xhaW1lZCB3aGlsZSB3ZSdyZSBzdHVjayBpbiB0aGUgdW5sb2NrIGNhbGwuICovCisJZmwtPmZsX3UubmZzX2ZsLmZsYWdzICY9IH5ORlNfTENLX0dSQU5URUQ7CisKKwlpZiAocmVxLT5hX2ZsYWdzICYgUlBDX1RBU0tfQVNZTkMpIHsKKwkJc3RhdHVzID0gbmxtY2xudF9hc3luY19jYWxsKHJlcSwgTkxNUFJPQ19VTkxPQ0ssCisJCQkJCW5sbWNsbnRfdW5sb2NrX2NhbGxiYWNrKTsKKwkJLyogSHJtZi4uLiBEbyB0aGUgdW5sb2NrIGVhcmx5IHNpbmNlIGxvY2tzX3JlbW92ZV9wb3NpeCgpCisJCSAqIHJlYWxseSBleHBlY3RzIHVzIHRvIGZyZWUgdGhlIGxvY2sgc3luY2hyb25vdXNseSAqLworCQlkb192ZnNfbG9jayhmbCk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlubG1jbG50X3JlbGVhc2VfbG9ja2FyZ3MocmVxKTsKKwkJCWtmcmVlKHJlcSk7CisJCX0KKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzdGF0dXMgPSBubG1jbG50X2NhbGwocmVxLCBOTE1QUk9DX1VOTE9DSyk7CisJbmxtY2xudF9yZWxlYXNlX2xvY2thcmdzKHJlcSk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwlkb192ZnNfbG9jayhmbCk7CisJaWYgKHJlc3AtPnN0YXR1cyA9PSBOTE1fTENLX0dSQU5URUQpCisJCXJldHVybiAwOworCisJaWYgKHJlc3AtPnN0YXR1cyAhPSBOTE1fTENLX0RFTklFRF9OT0xPQ0tTKQorCQlwcmludGsoImxvY2tkOiB1bmV4cGVjdGVkIHVubG9jayBzdGF0dXM6ICVkXG4iLCByZXNwLT5zdGF0dXMpOworCisJLyogV2hhdCB0byBkbyBub3c/IEknbSBvdXQgb2YgbXkgZGVwdGguLi4gKi8KKworCXJldHVybiAtRU5PTENLOworfQorCitzdGF0aWMgdm9pZAorbmxtY2xudF91bmxvY2tfY2FsbGJhY2soc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBubG1fcnFzdAkqcmVxID0gKHN0cnVjdCBubG1fcnFzdCAqKSB0YXNrLT50a19jYWxsZGF0YTsKKwlpbnQJCXN0YXR1cyA9IHJlcS0+YV9yZXMuc3RhdHVzOworCisJaWYgKFJQQ19BU1NBU1NJTkFURUQodGFzaykpCisJCWdvdG8gZGllOworCisJaWYgKHRhc2stPnRrX3N0YXR1cyA8IDApIHsKKwkJZHByaW50aygibG9ja2Q6IHVubG9jayBmYWlsZWQgKGVyciA9ICVkKVxuIiwgLXRhc2stPnRrX3N0YXR1cyk7CisJCWdvdG8gcmV0cnlfcmViaW5kOworCX0KKwlpZiAoc3RhdHVzID09IE5MTV9MQ0tfREVOSUVEX0dSQUNFX1BFUklPRCkgeworCQlycGNfZGVsYXkodGFzaywgTkxNQ0xOVF9HUkFDRV9XQUlUKTsKKwkJZ290byByZXRyeV91bmxvY2s7CisJfQorCWlmIChzdGF0dXMgIT0gTkxNX0xDS19HUkFOVEVEKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb2NrZDogdW5leHBlY3RlZCB1bmxvY2sgc3RhdHVzOiAlZFxuIiwgc3RhdHVzKTsKK2RpZToKKwlubG1fcmVsZWFzZV9ob3N0KHJlcS0+YV9ob3N0KTsKKwlubG1jbG50X3JlbGVhc2VfbG9ja2FyZ3MocmVxKTsKKwlrZnJlZShyZXEpOworCXJldHVybjsKKyByZXRyeV9yZWJpbmQ6CisJbmxtX3JlYmluZF9ob3N0KHJlcS0+YV9ob3N0KTsKKyByZXRyeV91bmxvY2s6CisJcnBjX3Jlc3RhcnRfY2FsbCh0YXNrKTsKK30KKworLyoKKyAqIENhbmNlbCBhIGJsb2NrZWQgbG9jayByZXF1ZXN0LgorICogV2UgYWx3YXlzIHVzZSBhbiBhc3luYyBSUEMgY2FsbCBmb3IgdGhpcyBpbiBvcmRlciBub3QgdG8gaGFuZyBhCisgKiBwcm9jZXNzIHRoYXQgaGFzIGJlZW4gQ3RybC1DJ2VkLgorICovCitpbnQKK25sbWNsbnRfY2FuY2VsKHN0cnVjdCBubG1faG9zdCAqaG9zdCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IG5sbV9ycXN0CSpyZXE7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlzaWdzZXRfdAlvbGRzZXQ7CisJaW50CQlzdGF0dXM7CisKKwkvKiBCbG9jayBhbGwgc2lnbmFscyB3aGlsZSBzZXR0aW5nIHVwIGNhbGwgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCW9sZHNldCA9IGN1cnJlbnQtPmJsb2NrZWQ7CisJc2lnZmlsbHNldCgmY3VycmVudC0+YmxvY2tlZCk7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisKKwlyZXEgPSBubG1jbG50X2FsbG9jX2NhbGwoKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmVxLT5hX2hvc3QgID0gaG9zdDsKKwlyZXEtPmFfZmxhZ3MgPSBSUENfVEFTS19BU1lOQzsKKworCW5sbWNsbnRfc2V0bG9ja2FyZ3MocmVxLCBmbCk7CisKKwlzdGF0dXMgPSBubG1jbG50X2FzeW5jX2NhbGwocmVxLCBOTE1QUk9DX0NBTkNFTCwKKwkJCQkJbmxtY2xudF9jYW5jZWxfY2FsbGJhY2spOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW5sbWNsbnRfcmVsZWFzZV9sb2NrYXJncyhyZXEpOworCQlrZnJlZShyZXEpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJY3VycmVudC0+YmxvY2tlZCA9IG9sZHNldDsKKwlyZWNhbGNfc2lncGVuZGluZygpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkCitubG1jbG50X2NhbmNlbF9jYWxsYmFjayhzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IG5sbV9ycXN0CSpyZXEgPSAoc3RydWN0IG5sbV9ycXN0ICopIHRhc2stPnRrX2NhbGxkYXRhOworCisJaWYgKFJQQ19BU1NBU1NJTkFURUQodGFzaykpCisJCWdvdG8gZGllOworCisJaWYgKHRhc2stPnRrX3N0YXR1cyA8IDApIHsKKwkJZHByaW50aygibG9ja2Q6IENBTkNFTCBjYWxsIGVycm9yICVkLCByZXRyeWluZy5cbiIsCisJCQkJCXRhc2stPnRrX3N0YXR1cyk7CisJCWdvdG8gcmV0cnlfY2FuY2VsOworCX0KKworCWRwcmludGsoImxvY2tkOiBjYW5jZWwgc3RhdHVzICVkICh0YXNrICVkKVxuIiwKKwkJCXJlcS0+YV9yZXMuc3RhdHVzLCB0YXNrLT50a19waWQpOworCisJc3dpdGNoIChyZXEtPmFfcmVzLnN0YXR1cykgeworCWNhc2UgTkxNX0xDS19HUkFOVEVEOgorCWNhc2UgTkxNX0xDS19ERU5JRURfR1JBQ0VfUEVSSU9EOgorCQkvKiBFdmVyeXRoaW5nJ3MgZ29vZCAqLworCQlicmVhazsKKwljYXNlIE5MTV9MQ0tfREVOSUVEX05PTE9DS1M6CisJCWRwcmludGsoImxvY2tkOiBDQU5DRUwgZmFpbGVkIChzZXJ2ZXIgaGFzIG5vIGxvY2tzKVxuIik7CisJCWdvdG8gcmV0cnlfY2FuY2VsOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX05PVElDRSAibG9ja2Q6IHdlaXJkIHJldHVybiAlZCBmb3IgQ0FOQ0VMIGNhbGxcbiIsCisJCQlyZXEtPmFfcmVzLnN0YXR1cyk7CisJfQorCitkaWU6CisJbmxtX3JlbGVhc2VfaG9zdChyZXEtPmFfaG9zdCk7CisJbmxtY2xudF9yZWxlYXNlX2xvY2thcmdzKHJlcSk7CisJa2ZyZWUocmVxKTsKKwlyZXR1cm47CisKK3JldHJ5X2NhbmNlbDoKKwlubG1fcmViaW5kX2hvc3QocmVxLT5hX2hvc3QpOworCXJwY19yZXN0YXJ0X2NhbGwodGFzayk7CisJcnBjX2RlbGF5KHRhc2ssIDMwICogSFopOworfQorCisvKgorICogQ29udmVydCBhbiBOTE0gc3RhdHVzIGNvZGUgdG8gYSBnZW5lcmljIGtlcm5lbCBlcnJubworICovCitzdGF0aWMgaW50CitubG1fc3RhdF90b19lcnJubyh1MzIgc3RhdHVzKQoreworCXN3aXRjaChzdGF0dXMpIHsKKwljYXNlIE5MTV9MQ0tfR1JBTlRFRDoKKwkJcmV0dXJuIDA7CisJY2FzZSBOTE1fTENLX0RFTklFRDoKKwkJcmV0dXJuIC1FQUdBSU47CisJY2FzZSBOTE1fTENLX0RFTklFRF9OT0xPQ0tTOgorCWNhc2UgTkxNX0xDS19ERU5JRURfR1JBQ0VfUEVSSU9EOgorCQlyZXR1cm4gLUVOT0xDSzsKKwljYXNlIE5MTV9MQ0tfQkxPQ0tFRDoKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJsb2NrZDogdW5leHBlY3RlZCBzdGF0dXMgTkxNX0JMT0NLRURcbiIpOworCQlyZXR1cm4gLUVOT0xDSzsKKyNpZmRlZiBDT05GSUdfTE9DS0RfVjQKKwljYXNlIE5MTV9ERUFETENLOgorCQlyZXR1cm4gLUVERUFETEs7CisJY2FzZSBOTE1fUk9GUzoKKwkJcmV0dXJuIC1FUk9GUzsKKwljYXNlIE5MTV9TVEFMRV9GSDoKKwkJcmV0dXJuIC1FU1RBTEU7CisJY2FzZSBOTE1fRkJJRzoKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJY2FzZSBOTE1fRkFJTEVEOgorCQlyZXR1cm4gLUVOT0xDSzsKKyNlbmRpZgorCX0KKwlwcmludGsoS0VSTl9OT1RJQ0UgImxvY2tkOiB1bmV4cGVjdGVkIHNlcnZlciBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIC1FTk9MQ0s7Cit9CmRpZmYgLS1naXQgYS9mcy9sb2NrZC9ob3N0LmMgYi9mcy9sb2NrZC9ob3N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI3MDdjNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2xvY2tkL2hvc3QuYwpAQCAtMCwwICsxLDM0NiBAQAorLyoKKyAqIGxpbnV4L2ZzL2xvY2tkL2hvc3QuYworICoKKyAqIE1hbmFnZW1lbnQgZm9yIE5MTSBwZWVyIGhvc3RzLiBUaGUgbmxtX2hvc3Qgc3RydWN0IGlzIHNoYXJlZAorICogYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBpbXBsZW1lbnRhdGlvbi4gVGhlIG9ubHkgcmVhc29uIHRvCisgKiBkbyBzbyBpcyB0byByZWR1Y2UgY29kZSBibG9hdC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9zbV9pbnRlci5oPgorCisKKyNkZWZpbmUgTkxNREJHX0ZBQ0lMSVRZCQlOTE1EQkdfSE9TVENBQ0hFCisjZGVmaW5lIE5MTV9IT1NUX01BWAkJNjQKKyNkZWZpbmUgTkxNX0hPU1RfTlJIQVNICQkzMgorI2RlZmluZSBOTE1fQUREUkhBU0goYWRkcikJKG50b2hsKGFkZHIpICYgKE5MTV9IT1NUX05SSEFTSC0xKSkKKyNkZWZpbmUgTkxNX0hPU1RfUkVCSU5ECQkoNjAgKiBIWikKKyNkZWZpbmUgTkxNX0hPU1RfRVhQSVJFCQkoKG5yaG9zdHMgPiBOTE1fSE9TVF9NQVgpPyAzMDAgKiBIWiA6IDEyMCAqIEhaKQorI2RlZmluZSBOTE1fSE9TVF9DT0xMRUNUCSgobnJob3N0cyA+IE5MTV9IT1NUX01BWCk/IDEyMCAqIEhaIDogIDYwICogSFopCisjZGVmaW5lIE5MTV9IT1NUX0FERFIoc3YpCSgmKHN2KS0+c19ubG1jbG50LT5jbF94cHJ0LT5hZGRyKQorCitzdGF0aWMgc3RydWN0IG5sbV9ob3N0ICoJbmxtX2hvc3RzW05MTV9IT1NUX05SSEFTSF07CitzdGF0aWMgdW5zaWduZWQgbG9uZwkJbmV4dF9nYzsKK3N0YXRpYyBpbnQJCQlucmhvc3RzOworc3RhdGljIERFQ0xBUkVfTVVURVgobmxtX2hvc3Rfc2VtYSk7CisKKworc3RhdGljIHZvaWQJCQlubG1fZ2NfaG9zdHModm9pZCk7CisKKy8qCisgKiBGaW5kIGFuIE5MTSBzZXJ2ZXIgaGFuZGxlIGluIHRoZSBjYWNoZS4gSWYgdGhlcmUgaXMgbm9uZSwgY3JlYXRlIGl0LgorICovCitzdHJ1Y3QgbmxtX2hvc3QgKgorbmxtY2xudF9sb29rdXBfaG9zdChzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiwgaW50IHByb3RvLCBpbnQgdmVyc2lvbikKK3sKKwlyZXR1cm4gbmxtX2xvb2t1cF9ob3N0KDAsIHNpbiwgcHJvdG8sIHZlcnNpb24pOworfQorCisvKgorICogRmluZCBhbiBOTE0gY2xpZW50IGhhbmRsZSBpbiB0aGUgY2FjaGUuIElmIHRoZXJlIGlzIG5vbmUsIGNyZWF0ZSBpdC4KKyAqLworc3RydWN0IG5sbV9ob3N0ICoKK25sbXN2Y19sb29rdXBfaG9zdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCXJldHVybiBubG1fbG9va3VwX2hvc3QoMSwgJnJxc3RwLT5ycV9hZGRyLAorCQkJICAgICAgIHJxc3RwLT5ycV9wcm90LCBycXN0cC0+cnFfdmVycyk7Cit9CisKKy8qCisgKiBDb21tb24gaG9zdCBsb29rdXAgcm91dGluZSBmb3Igc2VydmVyICYgY2xpZW50CisgKi8KK3N0cnVjdCBubG1faG9zdCAqCitubG1fbG9va3VwX2hvc3QoaW50IHNlcnZlciwgc3RydWN0IHNvY2thZGRyX2luICpzaW4sCisJCQkJCWludCBwcm90bywgaW50IHZlcnNpb24pCit7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0LCAqKmhwOworCXUzMgkJYWRkcjsKKwlpbnQJCWhhc2g7CisKKwlkcHJpbnRrKCJsb2NrZDogbmxtX2xvb2t1cF9ob3N0KCUwOHgsIHA9JWQsIHY9JWQpXG4iLAorCQkJKHVuc2lnbmVkKShzaW4/IG50b2hsKHNpbi0+c2luX2FkZHIuc19hZGRyKSA6IDApLCBwcm90bywgdmVyc2lvbik7CisKKwloYXNoID0gTkxNX0FERFJIQVNIKHNpbi0+c2luX2FkZHIuc19hZGRyKTsKKworCS8qIExvY2sgaGFzaCB0YWJsZSAqLworCWRvd24oJm5sbV9ob3N0X3NlbWEpOworCisJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgbmV4dF9nYykpCisJCW5sbV9nY19ob3N0cygpOworCisJZm9yIChocCA9ICZubG1faG9zdHNbaGFzaF07IChob3N0ID0gKmhwKSAhPSAwOyBocCA9ICZob3N0LT5oX25leHQpIHsKKwkJaWYgKGhvc3QtPmhfcHJvdG8gIT0gcHJvdG8pCisJCQljb250aW51ZTsKKwkJaWYgKGhvc3QtPmhfdmVyc2lvbiAhPSB2ZXJzaW9uKQorCQkJY29udGludWU7CisJCWlmIChob3N0LT5oX3NlcnZlciAhPSBzZXJ2ZXIpCisJCQljb250aW51ZTsKKworCQlpZiAobmxtX2NtcF9hZGRyKCZob3N0LT5oX2FkZHIsIHNpbikpIHsKKwkJCWlmIChocCAhPSBubG1faG9zdHMgKyBoYXNoKSB7CisJCQkJKmhwID0gaG9zdC0+aF9uZXh0OworCQkJCWhvc3QtPmhfbmV4dCA9IG5sbV9ob3N0c1toYXNoXTsKKwkJCQlubG1faG9zdHNbaGFzaF0gPSBob3N0OworCQkJfQorCQkJbmxtX2dldF9ob3N0KGhvc3QpOworCQkJdXAoJm5sbV9ob3N0X3NlbWEpOworCQkJcmV0dXJuIGhvc3Q7CisJCX0KKwl9CisKKwkvKiBPb29wcywgbm8gaG9zdCBmb3VuZCwgY3JlYXRlIGl0ICovCisJZHByaW50aygibG9ja2Q6IGNyZWF0aW5nIGhvc3QgZW50cnlcbiIpOworCisJaWYgKCEoaG9zdCA9IChzdHJ1Y3QgbmxtX2hvc3QgKikga21hbGxvYyhzaXplb2YoKmhvc3QpLCBHRlBfS0VSTkVMKSkpCisJCWdvdG8gbm9ob3N0OworCW1lbXNldChob3N0LCAwLCBzaXplb2YoKmhvc3QpKTsKKworCWFkZHIgPSBzaW4tPnNpbl9hZGRyLnNfYWRkcjsKKwlzcHJpbnRmKGhvc3QtPmhfbmFtZSwgIiV1LiV1LiV1LiV1IiwgTklQUVVBRChhZGRyKSk7CisKKwlob3N0LT5oX2FkZHIgICAgICAgPSAqc2luOworCWhvc3QtPmhfYWRkci5zaW5fcG9ydCA9IDA7CS8qIG91Y2ghICovCisJaG9zdC0+aF92ZXJzaW9uICAgID0gdmVyc2lvbjsKKwlob3N0LT5oX3Byb3RvICAgICAgPSBwcm90bzsKKwlob3N0LT5oX3JwY2NsbnQgICAgPSBOVUxMOworCWluaXRfTVVURVgoJmhvc3QtPmhfc2VtYSk7CisJaG9zdC0+aF9uZXh0cmViaW5kID0gamlmZmllcyArIE5MTV9IT1NUX1JFQklORDsKKwlob3N0LT5oX2V4cGlyZXMgICAgPSBqaWZmaWVzICsgTkxNX0hPU1RfRVhQSVJFOworCWF0b21pY19zZXQoJmhvc3QtPmhfY291bnQsIDEpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmhvc3QtPmhfZ3JhY2V3YWl0KTsKKwlob3N0LT5oX3N0YXRlICAgICAgPSAwOwkJCS8qIHBzZXVkbyBOU00gc3RhdGUgKi8KKwlob3N0LT5oX25zbXN0YXRlICAgPSAwOwkJCS8qIHJlYWwgTlNNIHN0YXRlICovCisJaG9zdC0+aF9zZXJ2ZXIJICAgPSBzZXJ2ZXI7CisJaG9zdC0+aF9uZXh0ICAgICAgID0gbmxtX2hvc3RzW2hhc2hdOworCW5sbV9ob3N0c1toYXNoXSAgICA9IGhvc3Q7CisJSU5JVF9MSVNUX0hFQUQoJmhvc3QtPmhfbG9ja293bmVycyk7CisJc3Bpbl9sb2NrX2luaXQoJmhvc3QtPmhfbG9jayk7CisKKwlpZiAoKytucmhvc3RzID4gTkxNX0hPU1RfTUFYKQorCQluZXh0X2djID0gMDsKKworbm9ob3N0OgorCXVwKCZubG1faG9zdF9zZW1hKTsKKwlyZXR1cm4gaG9zdDsKK30KKworc3RydWN0IG5sbV9ob3N0ICoKK25sbV9maW5kX2NsaWVudCh2b2lkKQoreworCS8qIGZpbmQgYSBubG1faG9zdCBmb3IgYSBjbGllbnQgZm9yIHdoaWNoIGhfa2lsbGVkID09IDAuCisJICogYW5kIHJldHVybiBpdAorCSAqLworCWludCBoYXNoOworCWRvd24oJm5sbV9ob3N0X3NlbWEpOworCWZvciAoaGFzaCA9IDAgOyBoYXNoIDwgTkxNX0hPU1RfTlJIQVNIOyBoYXNoKyspIHsKKwkJc3RydWN0IG5sbV9ob3N0ICpob3N0LCAqKmhwOworCQlmb3IgKGhwID0gJm5sbV9ob3N0c1toYXNoXTsgKGhvc3QgPSAqaHApICE9IDA7IGhwID0gJmhvc3QtPmhfbmV4dCkgeworCQkJaWYgKGhvc3QtPmhfc2VydmVyICYmCisJCQkgICAgaG9zdC0+aF9raWxsZWQgPT0gMCkgeworCQkJCW5sbV9nZXRfaG9zdChob3N0KTsKKwkJCQl1cCgmbmxtX2hvc3Rfc2VtYSk7CisJCQkJcmV0dXJuIGhvc3Q7CisJCQl9CisJCX0KKwl9CisJdXAoJm5sbV9ob3N0X3NlbWEpOworCXJldHVybiBOVUxMOworfQorCisJCQkJCisvKgorICogQ3JlYXRlIHRoZSBOTE0gUlBDIGNsaWVudCBmb3IgYW4gTkxNIHBlZXIKKyAqLworc3RydWN0IHJwY19jbG50ICoKK25sbV9iaW5kX2hvc3Qoc3RydWN0IG5sbV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBycGNfY2xudAkqY2xudDsKKwlzdHJ1Y3QgcnBjX3hwcnQJKnhwcnQ7CisKKwlkcHJpbnRrKCJsb2NrZDogbmxtX2JpbmRfaG9zdCglMDh4KVxuIiwKKwkJCSh1bnNpZ25lZCludG9obChob3N0LT5oX2FkZHIuc2luX2FkZHIuc19hZGRyKSk7CisKKwkvKiBMb2NrIGhvc3QgaGFuZGxlICovCisJZG93bigmaG9zdC0+aF9zZW1hKTsKKworCS8qIElmIHdlJ3ZlIGFscmVhZHkgY3JlYXRlZCBhbiBSUEMgY2xpZW50LCBjaGVjayB3aGV0aGVyCisJICogUlBDIHJlYmluZCBpcyByZXF1aXJlZAorCSAqIE5vdGU6IHdoeSBrZWVwIHJlYmluZGluZyBpZiB3ZSdyZSBvbiBhIHRjcCBjb25uZWN0aW9uPworCSAqLworCWlmICgoY2xudCA9IGhvc3QtPmhfcnBjY2xudCkgIT0gTlVMTCkgeworCQl4cHJ0ID0gY2xudC0+Y2xfeHBydDsKKwkJaWYgKCF4cHJ0LT5zdHJlYW0gJiYgdGltZV9hZnRlcl9lcShqaWZmaWVzLCBob3N0LT5oX25leHRyZWJpbmQpKSB7CisJCQljbG50LT5jbF9wb3J0ID0gMDsKKwkJCWhvc3QtPmhfbmV4dHJlYmluZCA9IGppZmZpZXMgKyBOTE1fSE9TVF9SRUJJTkQ7CisJCQlkcHJpbnRrKCJsb2NrZDogbmV4dCByZWJpbmQgaW4gJWxkIGppZmZpZXNcbiIsCisJCQkJCWhvc3QtPmhfbmV4dHJlYmluZCAtIGppZmZpZXMpOworCQl9CisJfSBlbHNlIHsKKwkJeHBydCA9IHhwcnRfY3JlYXRlX3Byb3RvKGhvc3QtPmhfcHJvdG8sICZob3N0LT5oX2FkZHIsIE5VTEwpOworCQlpZiAoSVNfRVJSKHhwcnQpKQorCQkJZ290byBmb3JnZXRpdDsKKworCQl4cHJ0X3NldF90aW1lb3V0KCZ4cHJ0LT50aW1lb3V0LCA1LCBubG1zdmNfdGltZW91dCk7CisKKwkJLyogRXhpc3RpbmcgTkxNIHNlcnZlcnMgYWNjZXB0IEFVVEhfVU5JWCBvbmx5ICovCisJCWNsbnQgPSBycGNfY3JlYXRlX2NsaWVudCh4cHJ0LCBob3N0LT5oX25hbWUsICZubG1fcHJvZ3JhbSwKKwkJCQkJaG9zdC0+aF92ZXJzaW9uLCBSUENfQVVUSF9VTklYKTsKKwkJaWYgKElTX0VSUihjbG50KSkgeworCQkJeHBydF9kZXN0cm95KHhwcnQpOworCQkJZ290byBmb3JnZXRpdDsKKwkJfQorCQljbG50LT5jbF9hdXRvYmluZCA9IDE7CS8qIHR1cm4gb24gcG1hcCBxdWVyaWVzICovCisJCXhwcnQtPm5vY29uZyA9IDE7CS8qIE5vIGNvbmdlc3Rpb24gY29udHJvbCBmb3IgTkxNICovCisJCXhwcnQtPnJlc3Zwb3J0ID0gMTsJLyogTkxNIHJlcXVpcmVzIGEgcmVzZXJ2ZWQgcG9ydCAqLworCisJCWhvc3QtPmhfcnBjY2xudCA9IGNsbnQ7CisJfQorCisJdXAoJmhvc3QtPmhfc2VtYSk7CisJcmV0dXJuIGNsbnQ7CisKK2ZvcmdldGl0OgorCXByaW50aygibG9ja2Q6IGNvdWxkbid0IGNyZWF0ZSBSUEMgaGFuZGxlIGZvciAlc1xuIiwgaG9zdC0+aF9uYW1lKTsKKwl1cCgmaG9zdC0+aF9zZW1hKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEZvcmNlIGEgcG9ydG1hcCBsb29rdXAgb2YgdGhlIHJlbW90ZSBsb2NrZCBwb3J0CisgKi8KK3ZvaWQKK25sbV9yZWJpbmRfaG9zdChzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCit7CisJZHByaW50aygibG9ja2Q6IHJlYmluZCBob3N0ICVzXG4iLCBob3N0LT5oX25hbWUpOworCWlmIChob3N0LT5oX3JwY2NsbnQgJiYgdGltZV9hZnRlcl9lcShqaWZmaWVzLCBob3N0LT5oX25leHRyZWJpbmQpKSB7CisJCWhvc3QtPmhfcnBjY2xudC0+Y2xfcG9ydCA9IDA7CisJCWhvc3QtPmhfbmV4dHJlYmluZCA9IGppZmZpZXMgKyBOTE1fSE9TVF9SRUJJTkQ7CisJfQorfQorCisvKgorICogSW5jcmVtZW50IE5MTSBob3N0IGNvdW50CisgKi8KK3N0cnVjdCBubG1faG9zdCAqIG5sbV9nZXRfaG9zdChzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCit7CisJaWYgKGhvc3QpIHsKKwkJZHByaW50aygibG9ja2Q6IGdldCBob3N0ICVzXG4iLCBob3N0LT5oX25hbWUpOworCQlhdG9taWNfaW5jKCZob3N0LT5oX2NvdW50KTsKKwkJaG9zdC0+aF9leHBpcmVzID0gamlmZmllcyArIE5MTV9IT1NUX0VYUElSRTsKKwl9CisJcmV0dXJuIGhvc3Q7Cit9CisKKy8qCisgKiBSZWxlYXNlIE5MTSBob3N0IGFmdGVyIHVzZQorICovCit2b2lkIG5sbV9yZWxlYXNlX2hvc3Qoc3RydWN0IG5sbV9ob3N0ICpob3N0KQoreworCWlmIChob3N0ICE9IE5VTEwpIHsKKwkJZHByaW50aygibG9ja2Q6IHJlbGVhc2UgaG9zdCAlc1xuIiwgaG9zdC0+aF9uYW1lKTsKKwkJYXRvbWljX2RlYygmaG9zdC0+aF9jb3VudCk7CisJCUJVR19PTihhdG9taWNfcmVhZCgmaG9zdC0+aF9jb3VudCkgPCAwKTsKKwl9Cit9CisKKy8qCisgKiBTaHV0IGRvd24gdGhlIGhvc3RzIG1vZHVsZS4KKyAqIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIG9ubHkgYXQgc2VydmVyIHNodXRkb3duIHRpbWUuCisgKi8KK3ZvaWQKK25sbV9zaHV0ZG93bl9ob3N0cyh2b2lkKQoreworCXN0cnVjdCBubG1faG9zdAkqaG9zdDsKKwlpbnQJCWk7CisKKwlkcHJpbnRrKCJsb2NrZDogc2h1dHRpbmcgZG93biBob3N0IG1vZHVsZVxuIik7CisJZG93bigmbmxtX2hvc3Rfc2VtYSk7CisKKwkvKiBGaXJzdCwgbWFrZSBhbGwgaG9zdHMgZWxpZ2libGUgZm9yIGdjICovCisJZHByaW50aygibG9ja2Q6IG51a2luZyBhbGwgaG9zdHMuLi5cbiIpOworCWZvciAoaSA9IDA7IGkgPCBOTE1fSE9TVF9OUkhBU0g7IGkrKykgeworCQlmb3IgKGhvc3QgPSBubG1faG9zdHNbaV07IGhvc3Q7IGhvc3QgPSBob3N0LT5oX25leHQpCisJCQlob3N0LT5oX2V4cGlyZXMgPSBqaWZmaWVzIC0gMTsKKwl9CisKKwkvKiBUaGVuLCBwZXJmb3JtIGEgZ2FyYmFnZSBjb2xsZWN0aW9uIHBhc3MgKi8KKwlubG1fZ2NfaG9zdHMoKTsKKwl1cCgmbmxtX2hvc3Rfc2VtYSk7CisKKwkvKiBjb21wbGFpbiBpZiBhbnkgaG9zdHMgYXJlIGxlZnQgKi8KKwlpZiAobnJob3N0cykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb2NrZDogY291bGRuJ3Qgc2h1dGRvd24gaG9zdCBtb2R1bGUhXG4iKTsKKwkJZHByaW50aygibG9ja2Q6ICVkIGhvc3RzIGxlZnQ6XG4iLCBucmhvc3RzKTsKKwkJZm9yIChpID0gMDsgaSA8IE5MTV9IT1NUX05SSEFTSDsgaSsrKSB7CisJCQlmb3IgKGhvc3QgPSBubG1faG9zdHNbaV07IGhvc3Q7IGhvc3QgPSBob3N0LT5oX25leHQpIHsKKwkJCQlkcHJpbnRrKCIgICAgICAgJXMgKGNudCAlZCB1c2UgJWQgZXhwICVsZClcbiIsCisJCQkJCWhvc3QtPmhfbmFtZSwgYXRvbWljX3JlYWQoJmhvc3QtPmhfY291bnQpLAorCQkJCQlob3N0LT5oX2ludXNlLCBob3N0LT5oX2V4cGlyZXMpOworCQkJfQorCQl9CisJfQorfQorCisvKgorICogR2FyYmFnZSBjb2xsZWN0IGFueSB1bnVzZWQgTkxNIGhvc3RzLgorICogVGhpcyBHQyBjb21iaW5lcyByZWZlcmVuY2UgY291bnRpbmcgZm9yIGFzeW5jIG9wZXJhdGlvbnMgd2l0aAorICogbWFyayAmIHN3ZWVwIGZvciByZXNvdXJjZXMgaGVsZCBieSByZW1vdGUgY2xpZW50cy4KKyAqLworc3RhdGljIHZvaWQKK25sbV9nY19ob3N0cyh2b2lkKQoreworCXN0cnVjdCBubG1faG9zdAkqKnEsICpob3N0OworCXN0cnVjdCBycGNfY2xudAkqY2xudDsKKwlpbnQJCWk7CisKKwlkcHJpbnRrKCJsb2NrZDogaG9zdCBnYXJiYWdlIGNvbGxlY3Rpb25cbiIpOworCWZvciAoaSA9IDA7IGkgPCBOTE1fSE9TVF9OUkhBU0g7IGkrKykgeworCQlmb3IgKGhvc3QgPSBubG1faG9zdHNbaV07IGhvc3Q7IGhvc3QgPSBob3N0LT5oX25leHQpCisJCQlob3N0LT5oX2ludXNlID0gMDsKKwl9CisKKwkvKiBNYXJrIGFsbCBob3N0cyB0aGF0IGhvbGQgbG9ja3MsIGJsb2NrcyBvciBzaGFyZXMgKi8KKwlubG1zdmNfbWFya19yZXNvdXJjZXMoKTsKKworCWZvciAoaSA9IDA7IGkgPCBOTE1fSE9TVF9OUkhBU0g7IGkrKykgeworCQlxID0gJm5sbV9ob3N0c1tpXTsKKwkJd2hpbGUgKChob3N0ID0gKnEpICE9IE5VTEwpIHsKKwkJCWlmIChhdG9taWNfcmVhZCgmaG9zdC0+aF9jb3VudCkgfHwgaG9zdC0+aF9pbnVzZQorCQkJIHx8IHRpbWVfYmVmb3JlKGppZmZpZXMsIGhvc3QtPmhfZXhwaXJlcykpIHsKKwkJCQlkcHJpbnRrKCJubG1fZ2NfaG9zdHMgc2tpcHBpbmcgJXMgKGNudCAlZCB1c2UgJWQgZXhwICVsZClcbiIsCisJCQkJCWhvc3QtPmhfbmFtZSwgYXRvbWljX3JlYWQoJmhvc3QtPmhfY291bnQpLAorCQkJCQlob3N0LT5oX2ludXNlLCBob3N0LT5oX2V4cGlyZXMpOworCQkJCXEgPSAmaG9zdC0+aF9uZXh0OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZHByaW50aygibG9ja2Q6IGRlbGV0ZSBob3N0ICVzXG4iLCBob3N0LT5oX25hbWUpOworCQkJKnEgPSBob3N0LT5oX25leHQ7CisJCQkvKiBEb24ndCB1bm1vbml0b3IgaG9zdHMgdGhhdCBoYXZlIGJlZW4gaW52YWxpZGF0ZWQgKi8KKwkJCWlmIChob3N0LT5oX21vbml0b3JlZCAmJiAhaG9zdC0+aF9raWxsZWQpCisJCQkJbnNtX3VubW9uaXRvcihob3N0KTsKKwkJCWlmICgoY2xudCA9IGhvc3QtPmhfcnBjY2xudCkgIT0gTlVMTCkgeworCQkJCWlmIChhdG9taWNfcmVhZCgmY2xudC0+Y2xfdXNlcnMpKSB7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJCSJsb2NrZDogYWN0aXZlIFJQQyBoYW5kbGVcbiIpOworCQkJCQljbG50LT5jbF9kZWFkID0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQlycGNfZGVzdHJveV9jbGllbnQoaG9zdC0+aF9ycGNjbG50KTsKKwkJCQl9CisJCQl9CisJCQlCVUdfT04oIWxpc3RfZW1wdHkoJmhvc3QtPmhfbG9ja293bmVycykpOworCQkJa2ZyZWUoaG9zdCk7CisJCQlucmhvc3RzLS07CisJCX0KKwl9CisKKwluZXh0X2djID0gamlmZmllcyArIE5MTV9IT1NUX0NPTExFQ1Q7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL21vbi5jIGIvZnMvbG9ja2QvbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjMWJlYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2xvY2tkL21vbi5jCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICogbGludXgvZnMvbG9ja2QvbW9uLmMKKyAqCisgKiBUaGUga2VybmVsIHN0YXRkIGNsaWVudC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9sb2NrZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3NtX2ludGVyLmg+CisKKworI2RlZmluZSBOTE1EQkdfRkFDSUxJVFkJCU5MTURCR19NT05JVE9SCisKK3N0YXRpYyBzdHJ1Y3QgcnBjX2NsbnQgKgluc21fY3JlYXRlKHZvaWQpOworCitzdGF0aWMgc3RydWN0IHJwY19wcm9ncmFtCW5zbV9wcm9ncmFtOworCisvKgorICogTG9jYWwgTlNNIHN0YXRlCisgKi8KK3UzMgkJCQluc21fbG9jYWxfc3RhdGU7CisKKy8qCisgKiBDb21tb24gcHJvY2VkdXJlIGZvciBTTV9NT04vU01fVU5NT04gY2FsbHMKKyAqLworc3RhdGljIGludAorbnNtX21vbl91bm1vbihzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIHUzMiBwcm9jLCBzdHJ1Y3QgbnNtX3JlcyAqcmVzKQoreworCXN0cnVjdCBycGNfY2xudAkqY2xudDsKKwlpbnQJCXN0YXR1czsKKwlzdHJ1Y3QgbnNtX2FyZ3MJYXJnczsKKworCWNsbnQgPSBuc21fY3JlYXRlKCk7CisJaWYgKElTX0VSUihjbG50KSkgeworCQlzdGF0dXMgPSBQVFJfRVJSKGNsbnQpOworCQlnb3RvIG91dDsKKwl9CisKKwlhcmdzLmFkZHIgPSBob3N0LT5oX2FkZHIuc2luX2FkZHIuc19hZGRyOworCWFyZ3MucHJvdG89IChob3N0LT5oX3Byb3RvPDwxKSB8IGhvc3QtPmhfc2VydmVyOworCWFyZ3MucHJvZyA9IE5MTV9QUk9HUkFNOworCWFyZ3MudmVycyA9IGhvc3QtPmhfdmVyc2lvbjsKKwlhcmdzLnByb2MgPSBOTE1QUk9DX05TTV9OT1RJRlk7CisJbWVtc2V0KHJlcywgMCwgc2l6ZW9mKCpyZXMpKTsKKworCXN0YXR1cyA9IHJwY19jYWxsKGNsbnQsIHByb2MsICZhcmdzLCByZXMsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9ERUJVRyAibnNtX21vbl91bm1vbjogcnBjIGZhaWxlZCwgc3RhdHVzPSVkXG4iLAorCQkJc3RhdHVzKTsKKwllbHNlCisJCXN0YXR1cyA9IDA7Cisgb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBTZXQgdXAgbW9uaXRvcmluZyBvZiBhIHJlbW90ZSBob3N0CisgKi8KK2ludAorbnNtX21vbml0b3Ioc3RydWN0IG5sbV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBuc21fcmVzCXJlczsKKwlpbnQJCXN0YXR1czsKKworCWRwcmludGsoImxvY2tkOiBuc21fbW9uaXRvciglcylcbiIsIGhvc3QtPmhfbmFtZSk7CisKKwlzdGF0dXMgPSBuc21fbW9uX3VubW9uKGhvc3QsIFNNX01PTiwgJnJlcyk7CisKKwlpZiAoc3RhdHVzIDwgMCB8fCByZXMuc3RhdHVzICE9IDApCisJCXByaW50ayhLRVJOX05PVElDRSAibG9ja2Q6IGNhbm5vdCBtb25pdG9yICVzXG4iLCBob3N0LT5oX25hbWUpOworCWVsc2UKKwkJaG9zdC0+aF9tb25pdG9yZWQgPSAxOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBDZWFzZSB0byBtb25pdG9yIHJlbW90ZSBob3N0CisgKi8KK2ludAorbnNtX3VubW9uaXRvcihzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IG5zbV9yZXMJcmVzOworCWludAkJc3RhdHVzOworCisJZHByaW50aygibG9ja2Q6IG5zbV91bm1vbml0b3IoJXMpXG4iLCBob3N0LT5oX25hbWUpOworCisJc3RhdHVzID0gbnNtX21vbl91bm1vbihob3N0LCBTTV9VTk1PTiwgJnJlcyk7CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX05PVElDRSAibG9ja2Q6IGNhbm5vdCB1bm1vbml0b3IgJXNcbiIsIGhvc3QtPmhfbmFtZSk7CisJZWxzZQorCQlob3N0LT5oX21vbml0b3JlZCA9IDA7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIENyZWF0ZSBOU00gY2xpZW50IGZvciB0aGUgbG9jYWwgaG9zdAorICovCitzdGF0aWMgc3RydWN0IHJwY19jbG50ICoKK25zbV9jcmVhdGUodm9pZCkKK3sKKwlzdHJ1Y3QgcnBjX3hwcnQJCSp4cHJ0OworCXN0cnVjdCBycGNfY2xudAkJKmNsbnQ7CisJc3RydWN0IHNvY2thZGRyX2luCXNpbjsKKworCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzaW4uc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKTsKKwlzaW4uc2luX3BvcnQgPSAwOworCisJeHBydCA9IHhwcnRfY3JlYXRlX3Byb3RvKElQUFJPVE9fVURQLCAmc2luLCBOVUxMKTsKKwlpZiAoSVNfRVJSKHhwcnQpKQorCQlyZXR1cm4gKHN0cnVjdCBycGNfY2xudCAqKXhwcnQ7CisKKwljbG50ID0gcnBjX2NyZWF0ZV9jbGllbnQoeHBydCwgImxvY2FsaG9zdCIsCisJCQkJJm5zbV9wcm9ncmFtLCBTTV9WRVJTSU9OLAorCQkJCVJQQ19BVVRIX05VTEwpOworCWlmIChJU19FUlIoY2xudCkpCisJCWdvdG8gb3V0X2Rlc3Ryb3k7CisJY2xudC0+Y2xfc29mdHJ0cnkgPSAxOworCWNsbnQtPmNsX2NoYXR0eSAgID0gMTsKKwljbG50LT5jbF9vbmVzaG90ICA9IDE7CisJeHBydC0+cmVzdnBvcnQgPSAxOwkvKiBOU00gcmVxdWlyZXMgYSByZXNlcnZlZCBwb3J0ICovCisJcmV0dXJuIGNsbnQ7CisKK291dF9kZXN0cm95OgorCXhwcnRfZGVzdHJveSh4cHJ0KTsKKwlyZXR1cm4gY2xudDsKK30KKworLyoKKyAqIFhEUiBmdW5jdGlvbnMgZm9yIE5TTS4KKyAqLworCitzdGF0aWMgdTMyICoKK3hkcl9lbmNvZGVfY29tbW9uKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5zbV9hcmdzICphcmdwKQoreworCWNoYXIJYnVmZmVyWzIwXTsKKworCS8qCisJICogVXNlIHRoZSBkb3R0ZWQtcXVhZCBJUCBhZGRyZXNzIG9mIHRoZSByZW1vdGUgaG9zdCBhcworCSAqIGlkZW50aWZpZXIuIExpbnV4IHN0YXRkIGFsd2F5cyBsb29rcyB1cCB0aGUgY2Fub25pY2FsCisJICogaG9zdG5hbWUgZmlyc3QgZm9yIHdoYXRldmVyIHJlbW90ZSBob3N0bmFtZSBpdCByZWNlaXZlcywKKwkgKiBzbyB0aGlzIHdvcmtzIGFscmlnaHQuCisJICovCisJc3ByaW50ZihidWZmZXIsICIldS4ldS4ldS4ldSIsIE5JUFFVQUQoYXJncC0+YWRkcikpOworCWlmICghKHAgPSB4ZHJfZW5jb2RlX3N0cmluZyhwLCBidWZmZXIpKQorCSB8fCAhKHAgPSB4ZHJfZW5jb2RlX3N0cmluZyhwLCBzeXN0ZW1fdXRzbmFtZS5ub2RlbmFtZSkpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwkqcCsrID0gaHRvbmwoYXJncC0+cHJvZyk7CisJKnArKyA9IGh0b25sKGFyZ3AtPnZlcnMpOworCSpwKysgPSBodG9ubChhcmdwLT5wcm9jKTsKKworCXJldHVybiBwOworfQorCitzdGF0aWMgaW50Cit4ZHJfZW5jb2RlX21vbihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBuc21fYXJncyAqYXJncCkKK3sKKwlwID0geGRyX2VuY29kZV9jb21tb24ocnFzdHAsIHAsIGFyZ3ApOworCWlmIChJU19FUlIocCkpCisJCXJldHVybiBQVFJfRVJSKHApOworCSpwKysgPSBhcmdwLT5hZGRyOworCSpwKysgPSBhcmdwLT52ZXJzOworCSpwKysgPSBhcmdwLT5wcm90bzsKKwkqcCsrID0gMDsKKwlycXN0cC0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocnFzdHAtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit4ZHJfZW5jb2RlX3VubW9uKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5zbV9hcmdzICphcmdwKQoreworCXAgPSB4ZHJfZW5jb2RlX2NvbW1vbihycXN0cCwgcCwgYXJncCk7CisJaWYgKElTX0VSUihwKSkKKwkJcmV0dXJuIFBUUl9FUlIocCk7CisJcnFzdHAtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJxc3RwLT5ycV9zdmVjLCBwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoreGRyX2RlY29kZV9zdGF0X3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBuc21fcmVzICpyZXNwKQoreworCXJlc3AtPnN0YXR1cyA9IG50b2hsKCpwKyspOworCXJlc3AtPnN0YXRlID0gbnRvaGwoKnArKyk7CisJZHByaW50aygibnNtOiB4ZHJfZGVjb2RlX3N0YXRfcmVzIHN0YXR1cyAlZCBzdGF0ZSAlZFxuIiwKKwkJCXJlc3AtPnN0YXR1cywgcmVzcC0+c3RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit4ZHJfZGVjb2RlX3N0YXQoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbnNtX3JlcyAqcmVzcCkKK3sKKwlyZXNwLT5zdGF0ZSA9IG50b2hsKCpwKyspOworCXJldHVybiAwOworfQorCisjZGVmaW5lIFNNX215X25hbWVfc3oJKDErWERSX1FVQURMRU4oU01fTUFYU1RSTEVOKSkKKyNkZWZpbmUgU01fbXlfaWRfc3oJKDMrMStTTV9teV9uYW1lX3N6KQorI2RlZmluZSBTTV9tb25faWRfc3oJKDErWERSX1FVQURMRU4oMjApK1NNX215X2lkX3N6KQorI2RlZmluZSBTTV9tb25fc3oJKFNNX21vbl9pZF9zeis0KQorI2RlZmluZSBTTV9tb25yZXNfc3oJMgorI2RlZmluZSBTTV91bm1vbnJlc19zegkxCisKKyNpZm5kZWYgTUFYCisjIGRlZmluZSBNQVgoYSwgYikJKCgoYSkgPiAoYikpPyAoYSkgOiAoYikpCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBycGNfcHJvY2luZm8JbnNtX3Byb2NlZHVyZXNbXSA9IHsKK1tTTV9NT05dID0geworCQkucF9wcm9jCQk9IFNNX01PTiwKKwkJLnBfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpIHhkcl9lbmNvZGVfbW9uLAorCQkucF9kZWNvZGUJPSAoa3hkcnByb2NfdCkgeGRyX2RlY29kZV9zdGF0X3JlcywKKwkJLnBfYnVmc2l6CT0gTUFYKFNNX21vbl9zeiwgU01fbW9ucmVzX3N6KSA8PCAyLAorCX0sCitbU01fVU5NT05dID0geworCQkucF9wcm9jCQk9IFNNX1VOTU9OLAorCQkucF9lbmNvZGUJPSAoa3hkcnByb2NfdCkgeGRyX2VuY29kZV91bm1vbiwKKwkJLnBfZGVjb2RlCT0gKGt4ZHJwcm9jX3QpIHhkcl9kZWNvZGVfc3RhdCwKKwkJLnBfYnVmc2l6CT0gTUFYKFNNX21vbl9pZF9zeiwgU01fdW5tb25yZXNfc3opIDw8IDIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24JbnNtX3ZlcnNpb24xID0geworCQkubnVtYmVyCQk9IDEsIAorCQkubnJwcm9jcwk9IHNpemVvZihuc21fcHJvY2VkdXJlcykvc2l6ZW9mKG5zbV9wcm9jZWR1cmVzWzBdKSwKKwkJLnByb2NzCQk9IG5zbV9wcm9jZWR1cmVzCit9OworCitzdGF0aWMgc3RydWN0IHJwY192ZXJzaW9uICoJbnNtX3ZlcnNpb25bXSA9IHsKKwlbMV0gPSAmbnNtX3ZlcnNpb24xLAorfTsKKworc3RhdGljIHN0cnVjdCBycGNfc3RhdAkJbnNtX3N0YXRzOworCitzdGF0aWMgc3RydWN0IHJwY19wcm9ncmFtCW5zbV9wcm9ncmFtID0geworCQkubmFtZQkJPSAic3RhdGQiLAorCQkubnVtYmVyCQk9IFNNX1BST0dSQU0sCisJCS5ucnZlcnMJCT0gc2l6ZW9mKG5zbV92ZXJzaW9uKS9zaXplb2YobnNtX3ZlcnNpb25bMF0pLAorCQkudmVyc2lvbgk9IG5zbV92ZXJzaW9uLAorCQkuc3RhdHMJCT0gJm5zbV9zdGF0cworfTsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Yy5jIGIvZnMvbG9ja2Qvc3ZjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyZTQ3MAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2xvY2tkL3N2Yy5jCkBAIC0wLDAgKzEsNTE5IEBACisvKgorICogbGludXgvZnMvbG9ja2Qvc3ZjLmMKKyAqCisgKiBUaGlzIGlzIHRoZSBjZW50cmFsIGxvY2tkIHNlcnZpY2UuCisgKgorICogRklYTUU6IFNlcGFyYXRlIHRoZSBsb2NrZCBORlMgc2VydmVyIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgbG9ja2QgTkZTCisgKiAJICBjbGllbnQgZnVuY3Rpb25hbGl0eS4gT2ggd2h5IGRpZG4ndCBTdW4gY3JlYXRlIHR3byBzZXBhcmF0ZQorICoJICBzZXJ2aWNlcyBpbiB0aGUgZmlyc3QgcGxhY2U/CisgKgorICogQXV0aG9yczoJT2xhZiBLaXJjaCAob2tpckBtb25hZC5zd2IuZGUpCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSA8bGludXgvc3VucnBjL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N0YXRzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y3NvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9sb2NrZC5oPgorI2luY2x1ZGUgPGxpbnV4L25mcy5oPgorCisjZGVmaW5lIE5MTURCR19GQUNJTElUWQkJTkxNREJHX1NWQworI2RlZmluZSBMT0NLRF9CVUZTSVpFCQkoMTAyNCArIE5MTVNWQ19YRFJTSVpFKQorI2RlZmluZSBBTExPV0VEX1NJR1MJCShzaWdtYXNrKFNJR0tJTEwpKQorCitzdGF0aWMgc3RydWN0IHN2Y19wcm9ncmFtCW5sbXN2Y19wcm9ncmFtOworCitzdHJ1Y3Qgbmxtc3ZjX2JpbmRpbmcgKgkJbmxtc3ZjX29wczsKK0VYUE9SVF9TWU1CT0wobmxtc3ZjX29wcyk7CisKK3N0YXRpYyBERUNMQVJFX01VVEVYKG5sbXN2Y19zZW1hKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJCW5sbXN2Y191c2VyczsKK3N0YXRpYyBwaWRfdAkJCW5sbXN2Y19waWQ7CitpbnQJCQkJbmxtc3ZjX2dyYWNlX3BlcmlvZDsKK3Vuc2lnbmVkIGxvbmcJCQlubG1zdmNfdGltZW91dDsKKworc3RhdGljIERFQ0xBUkVfTVVURVhfTE9DS0VEKGxvY2tkX3N0YXJ0KTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChsb2NrZF9leGl0KTsKKworLyoKKyAqIFRoZXNlIGNhbiBiZSBzZXQgYXQgaW5zbW9kIHRpbWUgKHVzZWZ1bCBmb3IgTkZTIGFzIHJvb3QgZmlsZXN5c3RlbSksCisgKiBhbmQgYWxzbyBjaGFuZ2VkIHRocm91Z2ggdGhlIHN5c2N0bCBpbnRlcmZhY2UuICAtLSBKYW1pZSBMb2tpZXIsIEF1ZyAyMDAzCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nCQlubG1fZ3JhY2VfcGVyaW9kOworc3RhdGljIHVuc2lnbmVkIGxvbmcJCW5sbV90aW1lb3V0ID0gTE9DS0RfREZMVF9USU1FTzsKK3N0YXRpYyBpbnQJCQlubG1fdWRwcG9ydCwgbmxtX3RjcHBvcnQ7CisKKy8qCisgKiBDb25zdGFudHMgbmVlZGVkIGZvciB0aGUgc3lzY3RsIGludGVyZmFjZS4KKyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcJbmxtX2dyYWNlX3BlcmlvZF9taW4gPSAwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcJbmxtX2dyYWNlX3BlcmlvZF9tYXggPSAyNDA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZwlubG1fdGltZW91dF9taW4gPSAzOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcJbmxtX3RpbWVvdXRfbWF4ID0gMjA7CitzdGF0aWMgY29uc3QgaW50CQlubG1fcG9ydF9taW4gPSAwLCBubG1fcG9ydF9tYXggPSA2NTUzNTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICogbmxtX3N5c2N0bF90YWJsZTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2V0X2dyYWNlX3BlcmlvZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZ3JhY2VfcGVyaW9kOworCisJLyogTm90ZTogbmxtX3RpbWVvdXQgc2hvdWxkIGFsd2F5cyBiZSBub256ZXJvICovCisJaWYgKG5sbV9ncmFjZV9wZXJpb2QpCisJCWdyYWNlX3BlcmlvZCA9ICgobmxtX2dyYWNlX3BlcmlvZCArIG5sbV90aW1lb3V0IC0gMSkKKwkJCQkvIG5sbV90aW1lb3V0KSAqIG5sbV90aW1lb3V0ICogSFo7CisJZWxzZQorCQlncmFjZV9wZXJpb2QgPSBubG1fdGltZW91dCAqIDUgKiBIWjsKKwlubG1zdmNfZ3JhY2VfcGVyaW9kID0gMTsKKwlyZXR1cm4gZ3JhY2VfcGVyaW9kICsgamlmZmllczsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX2dyYWNlX3BlcmlvZCh2b2lkKQoreworCW5sbXN2Y19ncmFjZV9wZXJpb2QgPSAwOworfQorCisvKgorICogVGhpcyBpcyB0aGUgbG9ja2Qga2VybmVsIHRocmVhZAorICovCitzdGF0aWMgdm9pZAorbG9ja2Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwlzdHJ1Y3Qgc3ZjX3NlcnYJKnNlcnYgPSBycXN0cC0+cnFfc2VydmVyOworCWludAkJZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGdyYWNlX3BlcmlvZF9leHBpcmU7CisKKwkvKiBMb2NrIG1vZHVsZSBhbmQgc2V0IHVwIGtlcm5lbCB0aHJlYWQgKi8KKwkvKiBsb2NrZF91cCBpcyB3YWl0aW5nIGZvciB1cyB0byBzdGFydHVwLCBzbyB3aWxsCisJICogYmUgaG9sZGluZyBhIHJlZmVyZW5jZSB0byB0aGlzIG1vZHVsZSwgc28gaXQKKwkgKiBpcyBzYWZlIHRvIGp1c3QgY2xhaW0gYW5vdGhlciByZWZlcmVuY2UKKwkgKi8KKwlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCWxvY2tfa2VybmVsKCk7CisKKwkvKgorCSAqIExldCBvdXIgbWFrZXIga25vdyB3ZSdyZSBydW5uaW5nLgorCSAqLworCW5sbXN2Y19waWQgPSBjdXJyZW50LT5waWQ7CisJdXAoJmxvY2tkX3N0YXJ0KTsKKworCWRhZW1vbml6ZSgibG9ja2QiKTsKKworCS8qIFByb2Nlc3MgcmVxdWVzdCB3aXRoIHNpZ25hbHMgYmxvY2tlZCwgYnV0IGFsbG93IFNJR0tJTEwuICAqLworCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKKworCS8qIGtpY2sgcnBjaW9kICovCisJcnBjaW9kX3VwKCk7CisKKwlkcHJpbnRrKCJORlMgbG9ja2luZyBzZXJ2aWNlIHN0YXJ0ZWQgKHZlciAiIExPQ0tEX1ZFUlNJT04gIikuXG4iKTsKKworCWlmICghbmxtX3RpbWVvdXQpCisJCW5sbV90aW1lb3V0ID0gTE9DS0RfREZMVF9USU1FTzsKKwlubG1zdmNfdGltZW91dCA9IG5sbV90aW1lb3V0ICogSFo7CisKKwlncmFjZV9wZXJpb2RfZXhwaXJlID0gc2V0X2dyYWNlX3BlcmlvZCgpOworCisJLyoKKwkgKiBUaGUgbWFpbiByZXF1ZXN0IGxvb3AuIFdlIGRvbid0IHRlcm1pbmF0ZSB1bnRpbCB0aGUgbGFzdAorCSAqIE5GUyBtb3VudCBvciBORlMgZGFlbW9uIGhhcyBnb25lIGF3YXksIGFuZCB3ZSd2ZSBiZWVuIHNlbnQgYQorCSAqIHNpZ25hbCwgb3IgZWxzZSBhbm90aGVyIHByb2Nlc3MgaGFzIHRha2VuIG92ZXIgb3VyIGpvYi4KKwkgKi8KKwl3aGlsZSAoKG5sbXN2Y191c2VycyB8fCAhc2lnbmFsbGVkKCkpICYmIG5sbXN2Y19waWQgPT0gY3VycmVudC0+cGlkKSB7CisJCWxvbmcgdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCisJCWlmIChzaWduYWxsZWQoKSkgeworCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKKwkJCWlmIChubG1zdmNfb3BzKSB7CisJCQkJbmxtc3ZjX2ludmFsaWRhdGVfYWxsKCk7CisJCQkJZ3JhY2VfcGVyaW9kX2V4cGlyZSA9IHNldF9ncmFjZV9wZXJpb2QoKTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFJldHJ5IGFueSBibG9ja2VkIGxvY2tzIHRoYXQgaGF2ZSBiZWVuIG5vdGlmaWVkIGJ5CisJCSAqIHRoZSBWRlMuIERvbid0IGRvIHRoaXMgZHVyaW5nIGdyYWNlIHBlcmlvZC4KKwkJICogKFRoZW9yZXRpY2FsbHksIHRoZXJlIHNob3VsZG4ndCBldmVuIGJlIGJsb2NrZWQgbG9ja3MKKwkJICogZHVyaW5nIGdyYWNlIHBlcmlvZCkuCisJCSAqLworCQlpZiAoIW5sbXN2Y19ncmFjZV9wZXJpb2QpIHsKKwkJCXRpbWVvdXQgPSBubG1zdmNfcmV0cnlfYmxvY2tlZCgpOworCQl9IGVsc2UgaWYgKHRpbWVfYmVmb3JlKGdyYWNlX3BlcmlvZF9leHBpcmUsIGppZmZpZXMpKQorCQkJY2xlYXJfZ3JhY2VfcGVyaW9kKCk7CisKKwkJLyoKKwkJICogRmluZCBhIHNvY2tldCB3aXRoIGRhdGEgYXZhaWxhYmxlIGFuZCBjYWxsIGl0cworCQkgKiByZWN2ZnJvbSByb3V0aW5lLgorCQkgKi8KKwkJZXJyID0gc3ZjX3JlY3Yoc2VydiwgcnFzdHAsIHRpbWVvdXQpOworCQlpZiAoZXJyID09IC1FQUdBSU4gfHwgZXJyID09IC1FSU5UUikKKwkJCWNvbnRpbnVlOworCQlpZiAoZXJyIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJsb2NrZDogdGVybWluYXRpbmcgb24gZXJyb3IgJWRcbiIsCisJCQkgICAgICAgLWVycik7CisJCQlicmVhazsKKwkJfQorCisJCWRwcmludGsoImxvY2tkOiByZXF1ZXN0IGZyb20gJTA4eFxuIiwKKwkJCSh1bnNpZ25lZCludG9obChycXN0cC0+cnFfYWRkci5zaW5fYWRkci5zX2FkZHIpKTsKKworCQlzdmNfcHJvY2VzcyhzZXJ2LCBycXN0cCk7CisKKwl9CisKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgdGhlcmUncyBhIG5ldyBsb2NrZCBwcm9jZXNzIGJlZm9yZQorCSAqIHNodXR0aW5nIGRvd24gdGhlIGhvc3RzIGFuZCBjbGVhcmluZyB0aGUgc2xvdC4KKwkgKi8KKwlpZiAoIW5sbXN2Y19waWQgfHwgY3VycmVudC0+cGlkID09IG5sbXN2Y19waWQpIHsKKwkJaWYgKG5sbXN2Y19vcHMpCisJCQlubG1zdmNfaW52YWxpZGF0ZV9hbGwoKTsKKwkJbmxtX3NodXRkb3duX2hvc3RzKCk7CisJCW5sbXN2Y19waWQgPSAwOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9ERUJVRworCQkJImxvY2tkOiBuZXcgcHJvY2Vzcywgc2tpcHBpbmcgaG9zdCBzaHV0ZG93blxuIik7CisJd2FrZV91cCgmbG9ja2RfZXhpdCk7CisJCQorCS8qIEV4aXQgdGhlIFJQQyB0aHJlYWQgKi8KKwlzdmNfZXhpdF90aHJlYWQocnFzdHApOworCisJLyogcmVsZWFzZSBycGNpb2QgKi8KKwlycGNpb2RfZG93bigpOworCisJLyogUmVsZWFzZSBtb2R1bGUgKi8KKwl1bmxvY2tfa2VybmVsKCk7CisJbW9kdWxlX3B1dF9hbmRfZXhpdCgwKTsKK30KKworLyoKKyAqIEJyaW5nIHVwIHRoZSBsb2NrZCBwcm9jZXNzIGlmIGl0J3Mgbm90IGFscmVhZHkgdXAuCisgKi8KK2ludAorbG9ja2RfdXAodm9pZCkKK3sKKwlzdGF0aWMgaW50CQl3YXJuZWQ7CisJc3RydWN0IHN2Y19zZXJ2ICoJc2VydjsKKwlpbnQJCQllcnJvciA9IDA7CisKKwlkb3duKCZubG1zdmNfc2VtYSk7CisJLyoKKwkgKiBVbmNvbmRpdGlvbmFsbHkgaW5jcmVtZW50IHRoZSB1c2VyIGNvdW50IC4uLiB0aGlzIGlzCisJICogdGhlIG51bWJlciBvZiBjbGllbnRzIHdobyBfd2FudF8gYSBsb2NrZCBwcm9jZXNzLgorCSAqLworCW5sbXN2Y191c2VycysrOyAKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgd2UncmUgYWxyZWFkeSB1cCBhbmQgcnVubmluZy4KKwkgKi8KKwlpZiAobmxtc3ZjX3BpZCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIFNhbml0eSBjaGVjazogaWYgdGhlcmUncyBubyBwaWQsCisJICogd2Ugc2hvdWxkIGJlIHRoZSBmaXJzdCB1c2VyIC4uLgorCSAqLworCWlmIChubG1zdmNfdXNlcnMgPiAxKQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkibG9ja2RfdXA6IG5vIHBpZCwgJWQgdXNlcnM/P1xuIiwgbmxtc3ZjX3VzZXJzKTsKKworCWVycm9yID0gLUVOT01FTTsKKwlzZXJ2ID0gc3ZjX2NyZWF0ZSgmbmxtc3ZjX3Byb2dyYW0sIExPQ0tEX0JVRlNJWkUpOworCWlmICghc2VydikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb2NrZF91cDogY3JlYXRlIHNlcnZpY2UgZmFpbGVkXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChlcnJvciA9IHN2Y19tYWtlc29jayhzZXJ2LCBJUFBST1RPX1VEUCwgbmxtX3VkcHBvcnQpKSA8IDAgCisjaWZkZWYgQ09ORklHX05GU0RfVENQCisJIHx8IChlcnJvciA9IHN2Y19tYWtlc29jayhzZXJ2LCBJUFBST1RPX1RDUCwgbmxtX3RjcHBvcnQpKSA8IDAKKyNlbmRpZgorCQkpIHsKKwkJaWYgKHdhcm5lZCsrID09IDApIAorCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJsb2NrZF91cDogbWFrZXNvY2sgZmFpbGVkLCBlcnJvcj0lZFxuIiwgZXJyb3IpOworCQlnb3RvIGRlc3Ryb3lfYW5kX291dDsKKwl9IAorCXdhcm5lZCA9IDA7CisKKwkvKgorCSAqIENyZWF0ZSB0aGUga2VybmVsIHRocmVhZCBhbmQgd2FpdCBmb3IgaXQgdG8gc3RhcnQuCisJICovCisJZXJyb3IgPSBzdmNfY3JlYXRlX3RocmVhZChsb2NrZCwgc2Vydik7CisJaWYgKGVycm9yKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJsb2NrZF91cDogY3JlYXRlIHRocmVhZCBmYWlsZWQsIGVycm9yPSVkXG4iLCBlcnJvcik7CisJCWdvdG8gZGVzdHJveV9hbmRfb3V0OworCX0KKwlkb3duKCZsb2NrZF9zdGFydCk7CisKKwkvKgorCSAqIE5vdGU6IHN2Y19zZXJ2IHN0cnVjdHVyZXMgaGF2ZSBhbiBpbml0aWFsIHVzZSBjb3VudCBvZiAxLAorCSAqIHNvIHdlIGV4aXQgdGhyb3VnaCBoZXJlIG9uIGJvdGggc3VjY2VzcyBhbmQgZmFpbHVyZS4KKwkgKi8KK2Rlc3Ryb3lfYW5kX291dDoKKwlzdmNfZGVzdHJveShzZXJ2KTsKK291dDoKKwl1cCgmbmxtc3ZjX3NlbWEpOworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0wobG9ja2RfdXApOworCisvKgorICogRGVjcmVtZW50IHRoZSB1c2VyIGNvdW50IGFuZCBicmluZyBkb3duIGxvY2tkIGlmIHdlJ3JlIHRoZSBsYXN0LgorICovCit2b2lkCitsb2NrZF9kb3duKHZvaWQpCit7CisJc3RhdGljIGludCB3YXJuZWQ7CisKKwlkb3duKCZubG1zdmNfc2VtYSk7CisJaWYgKG5sbXN2Y191c2VycykgeworCQlpZiAoLS1ubG1zdmNfdXNlcnMpCisJCQlnb3RvIG91dDsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibG9ja2RfZG93bjogbm8gdXNlcnMhIHBpZD0lZFxuIiwgbmxtc3ZjX3BpZCk7CisKKwlpZiAoIW5sbXN2Y19waWQpIHsKKwkJaWYgKHdhcm5lZCsrID09IDApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb2NrZF9kb3duOiBubyBsb2NrZCBydW5uaW5nLlxuIik7IAorCQlnb3RvIG91dDsKKwl9CisJd2FybmVkID0gMDsKKworCWtpbGxfcHJvYyhubG1zdmNfcGlkLCBTSUdLSUxMLCAxKTsKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSBsb2NrZCBwcm9jZXNzIHRvIGV4aXQsIGJ1dCBzaW5jZSB3ZSdyZSBob2xkaW5nCisJICogdGhlIGxvY2tkIHNlbWFwaG9yZSwgd2UgY2FuJ3Qgd2FpdCBhcm91bmQgZm9yZXZlciAuLi4KKwkgKi8KKwljbGVhcl90aHJlYWRfZmxhZyhUSUZfU0lHUEVORElORyk7CisJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZsb2NrZF9leGl0LCBIWik7CisJaWYgKG5sbXN2Y19waWQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCSJsb2NrZF9kb3duOiBsb2NrZCBmYWlsZWQgdG8gZXhpdCwgY2xlYXJpbmcgcGlkXG4iKTsKKwkJbmxtc3ZjX3BpZCA9IDA7CisJfQorCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKK291dDoKKwl1cCgmbmxtc3ZjX3NlbWEpOworfQorRVhQT1JUX1NZTUJPTChsb2NrZF9kb3duKTsKKworLyoKKyAqIFN5c2N0bCBwYXJhbWV0ZXJzIChzYW1lIGFzIG1vZHVsZSBwYXJhbWV0ZXJzLCBkaWZmZXJlbnQgaW50ZXJmYWNlKS4KKyAqLworCisvKiBTb21ldGhpbmcgdGhhdCBpc24ndCBDVExfQU5ZLCBDVExfTk9ORSBvciBhIHZhbHVlIHRoYXQgbWF5IGNsYXNoLiAqLworI2RlZmluZSBDVExfVU5OVU1CRVJFRAkJLTIKKworc3RhdGljIGN0bF90YWJsZSBubG1fc3lzY3Rsc1tdID0geworCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCisJCS5wcm9jbmFtZQk9ICJubG1fZ3JhY2VfcGVyaW9kIiwKKwkJLmRhdGEJCT0gJm5sbV9ncmFjZV9wZXJpb2QsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb3Vsb25ndmVjX21pbm1heCwKKwkJLmV4dHJhMQkJPSAodW5zaWduZWQgbG9uZyAqKSAmbmxtX2dyYWNlX3BlcmlvZF9taW4sCisJCS5leHRyYTIJCT0gKHVuc2lnbmVkIGxvbmcgKikgJm5sbV9ncmFjZV9wZXJpb2RfbWF4LAorCX0sCisJeworCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKKwkJLnByb2NuYW1lCT0gIm5sbV90aW1lb3V0IiwKKwkJLmRhdGEJCT0gJm5sbV90aW1lb3V0LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG91bG9uZ3ZlY19taW5tYXgsCisJCS5leHRyYTEJCT0gKHVuc2lnbmVkIGxvbmcgKikgJm5sbV90aW1lb3V0X21pbiwKKwkJLmV4dHJhMgkJPSAodW5zaWduZWQgbG9uZyAqKSAmbmxtX3RpbWVvdXRfbWF4LAorCX0sCisJeworCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKKwkJLnByb2NuYW1lCT0gIm5sbV91ZHBwb3J0IiwKKwkJLmRhdGEJCT0gJm5sbV91ZHBwb3J0LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuZXh0cmExCQk9IChpbnQgKikgJm5sbV9wb3J0X21pbiwKKwkJLmV4dHJhMgkJPSAoaW50ICopICZubG1fcG9ydF9tYXgsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAibmxtX3RjcHBvcnQiLAorCQkuZGF0YQkJPSAmbmxtX3RjcHBvcnQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5leHRyYTEJCT0gKGludCAqKSAmbmxtX3BvcnRfbWluLAorCQkuZXh0cmEyCQk9IChpbnQgKikgJm5sbV9wb3J0X21heCwKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIG5sbV9zeXNjdGxfZGlyW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKKwkJLnByb2NuYW1lCT0gIm5mcyIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBubG1fc3lzY3RscywKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIG5sbV9zeXNjdGxfcm9vdFtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX0ZTLAorCQkucHJvY25hbWUJPSAiZnMiLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gbmxtX3N5c2N0bF9kaXIsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworLyoKKyAqIE1vZHVsZSAoYW5kIGRyaXZlcmZzKSBwYXJhbWV0ZXJzLgorICovCisKKyNkZWZpbmUgcGFyYW1fc2V0X21pbl9tYXgobmFtZSwgdHlwZSwgd2hpY2hfc3RydG9sLCBtaW4sIG1heCkJCVwKK3N0YXRpYyBpbnQgcGFyYW1fc2V0XyMjbmFtZShjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQlcCit7CQkJCQkJCQkJXAorCWNoYXIgKmVuZHA7CQkJCQkJCVwKKwlfX3R5cGVvZl9fKHR5cGUpIG51bSA9IHdoaWNoX3N0cnRvbCh2YWwsICZlbmRwLCAwKTsJCVwKKwlpZiAoZW5kcCA9PSB2YWwgfHwgKmVuZHAgfHwgbnVtIDwgKG1pbikgfHwgbnVtID4gKG1heCkpCQlcCisJCXJldHVybiAtRUlOVkFMOwkJCQkJCVwKKwkqKChpbnQgKikga3AtPmFyZykgPSBudW07CQkJCQlcCisJcmV0dXJuIDA7CQkJCQkJCVwKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfY2FsbGJhY2sodTMyIHByb2MpCit7CisJcmV0dXJuIHByb2MgPT0gTkxNUFJPQ19HUkFOVEVECisJCXx8IHByb2MgPT0gTkxNUFJPQ19HUkFOVEVEX01TRworCQl8fCBwcm9jID09IE5MTVBST0NfVEVTVF9SRVMKKwkJfHwgcHJvYyA9PSBOTE1QUk9DX0xPQ0tfUkVTCisJCXx8IHByb2MgPT0gTkxNUFJPQ19DQU5DRUxfUkVTCisJCXx8IHByb2MgPT0gTkxNUFJPQ19VTkxPQ0tfUkVTCisJCXx8IHByb2MgPT0gTkxNUFJPQ19OU01fTk9USUZZOworfQorCisKK3N0YXRpYyBpbnQgbG9ja2RfYXV0aGVudGljYXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCit7CisJcnFzdHAtPnJxX2NsaWVudCA9IE5VTEw7CisJc3dpdGNoIChycXN0cC0+cnFfYXV0aG9wLT5mbGF2b3VyKSB7CisJCWNhc2UgUlBDX0FVVEhfTlVMTDoKKwkJY2FzZSBSUENfQVVUSF9VTklYOgorCQkJaWYgKHJxc3RwLT5ycV9wcm9jID09IDApCisJCQkJcmV0dXJuIFNWQ19PSzsKKwkJCWlmIChpc19jYWxsYmFjayhycXN0cC0+cnFfcHJvYykpIHsKKwkJCQkvKiBMZWF2ZSBpdCB0byBpbmRpdmlkdWFsIHByb2NlZHVyZXMgdG8KKwkJCQkgKiBjYWxsIG5sbXN2Y19sb29rdXBfaG9zdChycXN0cCkKKwkJCQkgKi8KKwkJCQlyZXR1cm4gU1ZDX09LOworCQkJfQorCQkJcmV0dXJuIHN2Y19zZXRfY2xpZW50KHJxc3RwKTsKKwl9CisJcmV0dXJuIFNWQ19ERU5JRUQ7Cit9CisKKworcGFyYW1fc2V0X21pbl9tYXgocG9ydCwgaW50LCBzaW1wbGVfc3RydG9sLCAwLCA2NTUzNSkKK3BhcmFtX3NldF9taW5fbWF4KGdyYWNlX3BlcmlvZCwgdW5zaWduZWQgbG9uZywgc2ltcGxlX3N0cnRvdWwsCisJCSAgbmxtX2dyYWNlX3BlcmlvZF9taW4sIG5sbV9ncmFjZV9wZXJpb2RfbWF4KQorcGFyYW1fc2V0X21pbl9tYXgodGltZW91dCwgdW5zaWduZWQgbG9uZywgc2ltcGxlX3N0cnRvdWwsCisJCSAgbmxtX3RpbWVvdXRfbWluLCBubG1fdGltZW91dF9tYXgpCisKK01PRFVMRV9BVVRIT1IoIk9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJORlMgZmlsZSBsb2NraW5nIHNlcnZpY2UgdmVyc2lvbiAiIExPQ0tEX1ZFUlNJT04gIi4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtX2NhbGwobmxtX2dyYWNlX3BlcmlvZCwgcGFyYW1fc2V0X2dyYWNlX3BlcmlvZCwgcGFyYW1fZ2V0X3Vsb25nLAorCQkgICZubG1fZ3JhY2VfcGVyaW9kLCAwNjQ0KTsKK21vZHVsZV9wYXJhbV9jYWxsKG5sbV90aW1lb3V0LCBwYXJhbV9zZXRfdGltZW91dCwgcGFyYW1fZ2V0X3Vsb25nLAorCQkgICZubG1fdGltZW91dCwgMDY0NCk7Cittb2R1bGVfcGFyYW1fY2FsbChubG1fdWRwcG9ydCwgcGFyYW1fc2V0X3BvcnQsIHBhcmFtX2dldF9pbnQsCisJCSAgJm5sbV91ZHBwb3J0LCAwNjQ0KTsKK21vZHVsZV9wYXJhbV9jYWxsKG5sbV90Y3Bwb3J0LCBwYXJhbV9zZXRfcG9ydCwgcGFyYW1fZ2V0X2ludCwKKwkJICAmbmxtX3RjcHBvcnQsIDA2NDQpOworCisvKgorICogSW5pdGlhbGlzaW5nIGFuZCB0ZXJtaW5hdGluZyB0aGUgbW9kdWxlLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxtKHZvaWQpCit7CisJbmxtX3N5c2N0bF90YWJsZSA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShubG1fc3lzY3RsX3Jvb3QsIDApOworCXJldHVybiBubG1fc3lzY3RsX3RhYmxlID8gMCA6IC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sbSh2b2lkKQoreworCS8qIEZJWE1FOiBkZWxldGUgYWxsIE5MTSBjbGllbnRzICovCisJbmxtX3NodXRkb3duX2hvc3RzKCk7CisJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUobmxtX3N5c2N0bF90YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxtKTsKK21vZHVsZV9leGl0KGV4aXRfbmxtKTsKKworLyoKKyAqIERlZmluZSBOTE0gcHJvZ3JhbSBhbmQgcHJvY2VkdXJlcworICovCitzdGF0aWMgc3RydWN0IHN2Y192ZXJzaW9uCW5sbXN2Y192ZXJzaW9uMSA9IHsKKwkJLnZzX3ZlcnMJPSAxLAorCQkudnNfbnByb2MJPSAxNywKKwkJLnZzX3Byb2MJPSBubG1zdmNfcHJvY2VkdXJlcywKKwkJLnZzX3hkcnNpemUJPSBOTE1TVkNfWERSU0laRSwKK307CitzdGF0aWMgc3RydWN0IHN2Y192ZXJzaW9uCW5sbXN2Y192ZXJzaW9uMyA9IHsKKwkJLnZzX3ZlcnMJPSAzLAorCQkudnNfbnByb2MJPSAyNCwKKwkJLnZzX3Byb2MJPSBubG1zdmNfcHJvY2VkdXJlcywKKwkJLnZzX3hkcnNpemUJPSBOTE1TVkNfWERSU0laRSwKK307CisjaWZkZWYgQ09ORklHX0xPQ0tEX1Y0CitzdGF0aWMgc3RydWN0IHN2Y192ZXJzaW9uCW5sbXN2Y192ZXJzaW9uNCA9IHsKKwkJLnZzX3ZlcnMJPSA0LAorCQkudnNfbnByb2MJPSAyNCwKKwkJLnZzX3Byb2MJPSBubG1zdmNfcHJvY2VkdXJlczQsCisJCS52c194ZHJzaXplCT0gTkxNU1ZDX1hEUlNJWkUsCit9OworI2VuZGlmCitzdGF0aWMgc3RydWN0IHN2Y192ZXJzaW9uICoJbmxtc3ZjX3ZlcnNpb25bXSA9IHsKKwlbMV0gPSAmbmxtc3ZjX3ZlcnNpb24xLAorCVszXSA9ICZubG1zdmNfdmVyc2lvbjMsCisjaWZkZWYgQ09ORklHX0xPQ0tEX1Y0CisJWzRdID0gJm5sbXN2Y192ZXJzaW9uNCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBzdmNfc3RhdAkJbmxtc3ZjX3N0YXRzOworCisjZGVmaW5lIE5MTV9OUlZFUlMJKHNpemVvZihubG1zdmNfdmVyc2lvbikvc2l6ZW9mKG5sbXN2Y192ZXJzaW9uWzBdKSkKK3N0YXRpYyBzdHJ1Y3Qgc3ZjX3Byb2dyYW0Jbmxtc3ZjX3Byb2dyYW0gPSB7CisJLnBnX3Byb2cJCT0gTkxNX1BST0dSQU0sCQkvKiBwcm9ncmFtIG51bWJlciAqLworCS5wZ19udmVycwkJPSBOTE1fTlJWRVJTLAkJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gbmxtc3ZjX3ZlcnNpb24gKi8KKwkucGdfdmVycwkJPSBubG1zdmNfdmVyc2lvbiwJLyogdmVyc2lvbiB0YWJsZSAqLworCS5wZ19uYW1lCQk9ICJsb2NrZCIsCQkvKiBzZXJ2aWNlIG5hbWUgKi8KKwkucGdfY2xhc3MJCT0gIm5mc2QiLAkJLyogc2hhcmUgYXV0aGVudGljYXRpb24gd2l0aCBuZnNkICovCisJLnBnX3N0YXRzCQk9ICZubG1zdmNfc3RhdHMsCS8qIHN0YXRzIHRhYmxlICovCisJLnBnX2F1dGhlbnRpY2F0ZSA9ICZsb2NrZF9hdXRoZW50aWNhdGUJLyogZXhwb3J0IGF1dGhlbnRpY2F0aW9uICovCit9OwpkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3ZjNHByb2MuYyBiL2ZzL2xvY2tkL3N2YzRwcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5NjcwZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2xvY2tkL3N2YzRwcm9jLmMKQEAgLTAsMCArMSw1ODAgQEAKKy8qCisgKiBsaW51eC9mcy9sb2NrZC9zdmM0cHJvYy5jCisgKgorICogTG9ja2Qgc2VydmVyIHByb2NlZHVyZXMuIFdlIGRvbid0IGltcGxlbWVudCB0aGUgTkxNXypfUkVTIAorICogcHJvY2VkdXJlcyBiZWNhdXNlIHdlIGRvbid0IHVzZSB0aGUgYXN5bmMgcHJvY2VkdXJlcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9sb2NrZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3NoYXJlLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2Qvc21faW50ZXIuaD4KKworCisjZGVmaW5lIE5MTURCR19GQUNJTElUWQkJTkxNREJHX0NMSUVOVAorCitzdGF0aWMgdTMyCW5sbTRzdmNfY2FsbGJhY2soc3RydWN0IHN2Y19ycXN0ICosIHUzMiwgc3RydWN0IG5sbV9yZXMgKik7CitzdGF0aWMgdm9pZAlubG00c3ZjX2NhbGxiYWNrX2V4aXQoc3RydWN0IHJwY190YXNrICopOworCisvKgorICogT2J0YWluIGNsaWVudCBhbmQgZmlsZSBmcm9tIGFyZ3VtZW50cworICovCitzdGF0aWMgdTMyCitubG00c3ZjX3JldHJpZXZlX2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJc3RydWN0IG5sbV9ob3N0ICoqaG9zdHAsIHN0cnVjdCBubG1fZmlsZSAqKmZpbHApCit7CisJc3RydWN0IG5sbV9ob3N0CQkqaG9zdCA9IE5VTEw7CisJc3RydWN0IG5sbV9maWxlCQkqZmlsZSA9IE5VTEw7CisJc3RydWN0IG5sbV9sb2NrCQkqbG9jayA9ICZhcmdwLT5sb2NrOworCXUzMgkJCWVycm9yID0gMDsKKworCS8qIG5mc2QgY2FsbGJhY2tzIG11c3QgaGF2ZSBiZWVuIGluc3RhbGxlZCBmb3IgdGhpcyBwcm9jZWR1cmUgKi8KKwlpZiAoIW5sbXN2Y19vcHMpCisJCXJldHVybiBubG1fbGNrX2RlbmllZF9ub2xvY2tzOworCisJLyogT2J0YWluIGhvc3QgaGFuZGxlICovCisJaWYgKCEoaG9zdCA9IG5sbXN2Y19sb29rdXBfaG9zdChycXN0cCkpCisJIHx8IChhcmdwLT5tb25pdG9yICYmICFob3N0LT5oX21vbml0b3JlZCAmJiBuc21fbW9uaXRvcihob3N0KSA8IDApKQorCQlnb3RvIG5vX2xvY2tzOworCSpob3N0cCA9IGhvc3Q7CisKKwkvKiBPYnRhaW4gZmlsZSBwb2ludGVyLiBOb3QgdXNlZCBieSBGUkVFX0FMTCBjYWxsLiAqLworCWlmIChmaWxwICE9IE5VTEwpIHsKKwkJaWYgKChlcnJvciA9IG5sbV9sb29rdXBfZmlsZShycXN0cCwgJmZpbGUsICZsb2NrLT5maCkpICE9IDApCisJCQlnb3RvIG5vX2xvY2tzOworCQkqZmlscCA9IGZpbGU7CisKKwkJLyogU2V0IHVwIHRoZSBtaXNzaW5nIHBhcnRzIG9mIHRoZSBmaWxlX2xvY2sgc3RydWN0dXJlICovCisJCWxvY2stPmZsLmZsX2ZpbGUgID0gZmlsZS0+Zl9maWxlOworCQlsb2NrLT5mbC5mbF9vd25lciA9IChmbF9vd25lcl90KSBob3N0OworCQlsb2NrLT5mbC5mbF9sbW9wcyA9ICZubG1zdmNfbG9ja19vcGVyYXRpb25zOworCX0KKworCXJldHVybiAwOworCitub19sb2NrczoKKwlpZiAoaG9zdCkKKwkJbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKyAJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CQorCXJldHVybiBubG1fbGNrX2RlbmllZF9ub2xvY2tzOworfQorCisvKgorICogTlVMTDogVGVzdCBmb3IgcHJlc2VuY2Ugb2Ygc2VydmljZQorICovCitzdGF0aWMgaW50CitubG00c3ZjX3Byb2NfbnVsbChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB2b2lkICphcmdwLCB2b2lkICpyZXNwKQoreworCWRwcmludGsoImxvY2tkOiBOVUxMICAgICAgICAgIGNhbGxlZFxuIik7CisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCisvKgorICogVEVTVDogQ2hlY2sgZm9yIGNvbmZsaWN0aW5nIGxvY2sKKyAqLworc3RhdGljIGludAorbmxtNHN2Y19wcm9jX3Rlc3Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJCSAgICAgICAgIHN0cnVjdCBubG1fcmVzICAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3Q7CisJc3RydWN0IG5sbV9maWxlCSpmaWxlOworCisJZHByaW50aygibG9ja2Q6IFRFU1Q0ICAgICAgICBjYWxsZWRcbiIpOworCXJlc3AtPmNvb2tpZSA9IGFyZ3AtPmNvb2tpZTsKKworCS8qIERvbid0IGFjY2VwdCB0ZXN0IHJlcXVlc3RzIGR1cmluZyBncmFjZSBwZXJpb2QgKi8KKwlpZiAobmxtc3ZjX2dyYWNlX3BlcmlvZCkgeworCQlyZXNwLT5zdGF0dXMgPSBubG1fbGNrX2RlbmllZF9ncmFjZV9wZXJpb2Q7CisJCXJldHVybiBycGNfc3VjY2VzczsKKwl9CisKKwkvKiBPYnRhaW4gY2xpZW50IGFuZCBmaWxlICovCisJaWYgKChyZXNwLT5zdGF0dXMgPSBubG00c3ZjX3JldHJpZXZlX2FyZ3MocnFzdHAsIGFyZ3AsICZob3N0LCAmZmlsZSkpKQorCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisKKwkvKiBOb3cgY2hlY2sgZm9yIGNvbmZsaWN0aW5nIGxvY2tzICovCisJcmVzcC0+c3RhdHVzID0gbmxtc3ZjX3Rlc3Rsb2NrKGZpbGUsICZhcmdwLT5sb2NrLCAmcmVzcC0+bG9jayk7CisKKwlkcHJpbnRrKCJsb2NrZDogVEVTVDQgICAgICAgICAgc3RhdHVzICVkXG4iLCBudG9obChyZXNwLT5zdGF0dXMpKTsKKwlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbV9yZWxlYXNlX2ZpbGUoZmlsZSk7CisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCitzdGF0aWMgaW50CitubG00c3ZjX3Byb2NfbG9jayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCQkJICAgICAgICAgc3RydWN0IG5sbV9yZXMgICpyZXNwKQoreworCXN0cnVjdCBubG1faG9zdAkqaG9zdDsKKwlzdHJ1Y3QgbmxtX2ZpbGUJKmZpbGU7CisKKwlkcHJpbnRrKCJsb2NrZDogTE9DSyAgICAgICAgICBjYWxsZWRcbiIpOworCisJcmVzcC0+Y29va2llID0gYXJncC0+Y29va2llOworCisJLyogRG9uJ3QgYWNjZXB0IG5ldyBsb2NrIHJlcXVlc3RzIGR1cmluZyBncmFjZSBwZXJpb2QgKi8KKwlpZiAobmxtc3ZjX2dyYWNlX3BlcmlvZCAmJiAhYXJncC0+cmVjbGFpbSkgeworCQlyZXNwLT5zdGF0dXMgPSBubG1fbGNrX2RlbmllZF9ncmFjZV9wZXJpb2Q7CisJCXJldHVybiBycGNfc3VjY2VzczsKKwl9CisKKwkvKiBPYnRhaW4gY2xpZW50IGFuZCBmaWxlICovCisJaWYgKChyZXNwLT5zdGF0dXMgPSBubG00c3ZjX3JldHJpZXZlX2FyZ3MocnFzdHAsIGFyZ3AsICZob3N0LCAmZmlsZSkpKQorCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisKKyNpZiAwCisJLyogSWYgc3VwcGxpZWQgc3RhdGUgZG9lc24ndCBtYXRjaCBjdXJyZW50IHN0YXRlLCB3ZSBhc3N1bWUgaXQncworCSAqIGFuIG9sZCByZXF1ZXN0IHRoYXQgdGltZS13YXJwZWQgc29tZWhvdy4gQW55IGVycm9yIHJldHVybiB3b3VsZAorCSAqIGRvIGluIHRoaXMgY2FzZSBiZWNhdXNlIGl0J3MgaXJyZWxldmFudCBhbnl3YXkuCisJICoKKwkgKiBOQjogV2UgZG9uJ3QgcmV0cmlldmUgdGhlIHJlbW90ZSBob3N0J3Mgc3RhdGUgeWV0LgorCSAqLworCWlmIChob3N0LT5oX25zbXN0YXRlICYmIGhvc3QtPmhfbnNtc3RhdGUgIT0gYXJncC0+c3RhdGUpIHsKKwkJcmVzcC0+c3RhdHVzID0gbmxtX2xja19kZW5pZWRfbm9sb2NrczsKKwl9IGVsc2UKKyNlbmRpZgorCisJLyogTm93IHRyeSB0byBsb2NrIHRoZSBmaWxlICovCisJcmVzcC0+c3RhdHVzID0gbmxtc3ZjX2xvY2socnFzdHAsIGZpbGUsICZhcmdwLT5sb2NrLAorCQkJCQlhcmdwLT5ibG9jaywgJmFyZ3AtPmNvb2tpZSk7CisKKwlkcHJpbnRrKCJsb2NrZDogTE9DSyAgICAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOworCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKKwlyZXR1cm4gcnBjX3N1Y2Nlc3M7Cit9CisKK3N0YXRpYyBpbnQKK25sbTRzdmNfcHJvY19jYW5jZWwoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJCSAgICAgICAgICAgc3RydWN0IG5sbV9yZXMgICpyZXNwKQoreworCXN0cnVjdCBubG1faG9zdAkqaG9zdDsKKwlzdHJ1Y3QgbmxtX2ZpbGUJKmZpbGU7CisKKwlkcHJpbnRrKCJsb2NrZDogQ0FOQ0VMICAgICAgICBjYWxsZWRcbiIpOworCisJcmVzcC0+Y29va2llID0gYXJncC0+Y29va2llOworCisJLyogRG9uJ3QgYWNjZXB0IHJlcXVlc3RzIGR1cmluZyBncmFjZSBwZXJpb2QgKi8KKwlpZiAobmxtc3ZjX2dyYWNlX3BlcmlvZCkgeworCQlyZXNwLT5zdGF0dXMgPSBubG1fbGNrX2RlbmllZF9ncmFjZV9wZXJpb2Q7CisJCXJldHVybiBycGNfc3VjY2VzczsKKwl9CisKKwkvKiBPYnRhaW4gY2xpZW50IGFuZCBmaWxlICovCisJaWYgKChyZXNwLT5zdGF0dXMgPSBubG00c3ZjX3JldHJpZXZlX2FyZ3MocnFzdHAsIGFyZ3AsICZob3N0LCAmZmlsZSkpKQorCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisKKwkvKiBUcnkgdG8gY2FuY2VsIHJlcXVlc3QuICovCisJcmVzcC0+c3RhdHVzID0gbmxtc3ZjX2NhbmNlbF9ibG9ja2VkKGZpbGUsICZhcmdwLT5sb2NrKTsKKworCWRwcmludGsoImxvY2tkOiBDQU5DRUwgICAgICAgIHN0YXR1cyAlZFxuIiwgbnRvaGwocmVzcC0+c3RhdHVzKSk7CisJbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwlubG1fcmVsZWFzZV9maWxlKGZpbGUpOworCXJldHVybiBycGNfc3VjY2VzczsKK30KKworLyoKKyAqIFVOTE9DSzogcmVsZWFzZSBhIGxvY2sKKyAqLworc3RhdGljIGludAorbmxtNHN2Y19wcm9jX3VubG9jayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCQkJICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCit7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0OworCXN0cnVjdCBubG1fZmlsZQkqZmlsZTsKKworCWRwcmludGsoImxvY2tkOiBVTkxPQ0sgICAgICAgIGNhbGxlZFxuIik7CisKKwlyZXNwLT5jb29raWUgPSBhcmdwLT5jb29raWU7CisKKwkvKiBEb24ndCBhY2NlcHQgbmV3IGxvY2sgcmVxdWVzdHMgZHVyaW5nIGdyYWNlIHBlcmlvZCAqLworCWlmIChubG1zdmNfZ3JhY2VfcGVyaW9kKSB7CisJCXJlc3AtPnN0YXR1cyA9IG5sbV9sY2tfZGVuaWVkX2dyYWNlX3BlcmlvZDsKKwkJcmV0dXJuIHJwY19zdWNjZXNzOworCX0KKworCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KKwlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbTRzdmNfcmV0cmlldmVfYXJncyhycXN0cCwgYXJncCwgJmhvc3QsICZmaWxlKSkpCisJCXJldHVybiBycGNfc3VjY2VzczsKKworCS8qIE5vdyB0cnkgdG8gcmVtb3ZlIHRoZSBsb2NrICovCisJcmVzcC0+c3RhdHVzID0gbmxtc3ZjX3VubG9jayhmaWxlLCAmYXJncC0+bG9jayk7CisKKwlkcHJpbnRrKCJsb2NrZDogVU5MT0NLICAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOworCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKKwlyZXR1cm4gcnBjX3N1Y2Nlc3M7Cit9CisKKy8qCisgKiBHUkFOVEVEOiBBIHNlcnZlciBjYWxscyB1cyB0byB0ZWxsIHRoYXQgYSBwcm9jZXNzJyBsb2NrIHJlcXVlc3QKKyAqIHdhcyBncmFudGVkCisgKi8KK3N0YXRpYyBpbnQKK25sbTRzdmNfcHJvY19ncmFudGVkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKKwkJCQkgICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCit7CisJcmVzcC0+Y29va2llID0gYXJncC0+Y29va2llOworCisJZHByaW50aygibG9ja2Q6IEdSQU5URUQgICAgICAgY2FsbGVkXG4iKTsKKwlyZXNwLT5zdGF0dXMgPSBubG1jbG50X2dyYW50KCZhcmdwLT5sb2NrKTsKKwlkcHJpbnRrKCJsb2NrZDogR1JBTlRFRCAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOworCXJldHVybiBycGNfc3VjY2VzczsKK30KKworLyoKKyAqIGBBc3luYycgdmVyc2lvbnMgb2YgdGhlIGFib3ZlIHNlcnZpY2Ugcm91dGluZXMuIFRoZXkgYXJlbid0IHJlYWxseSwKKyAqIGJlY2F1c2Ugd2Ugc2VuZCB0aGUgY2FsbGJhY2sgYmVmb3JlIHRoZSByZXBseSBwcm9wZXIuIEkgaG9wZSB0aGlzCisgKiBkb2Vzbid0IGJyZWFrIGFueSBjbGllbnRzLgorICovCitzdGF0aWMgaW50CitubG00c3ZjX3Byb2NfdGVzdF9tc2coc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJCQkgICAgIHZvaWQJICAgICAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX3JlcwlyZXM7CisJdTMyCQlzdGF0OworCisJZHByaW50aygibG9ja2Q6IFRFU1RfTVNHICAgICAgY2FsbGVkXG4iKTsKKwltZW1zZXQoJnJlcywgMCwgc2l6ZW9mKHJlcykpOworCisJaWYgKChzdGF0ID0gbmxtNHN2Y19wcm9jX3Rlc3QocnFzdHAsIGFyZ3AsICZyZXMpKSA9PSAwKQorCQlzdGF0ID0gbmxtNHN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19URVNUX1JFUywgJnJlcyk7CisJcmV0dXJuIHN0YXQ7Cit9CisKK3N0YXRpYyBpbnQKK25sbTRzdmNfcHJvY19sb2NrX21zZyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCQkJCSAgICAgdm9pZAkgICAgICpyZXNwKQoreworCXN0cnVjdCBubG1fcmVzCXJlczsKKwl1MzIJCXN0YXQ7CisKKwlkcHJpbnRrKCJsb2NrZDogTE9DS19NU0cgICAgICBjYWxsZWRcbiIpOworCW1lbXNldCgmcmVzLCAwLCBzaXplb2YocmVzKSk7CisKKwlpZiAoKHN0YXQgPSBubG00c3ZjX3Byb2NfbG9jayhycXN0cCwgYXJncCwgJnJlcykpID09IDApCisJCXN0YXQgPSBubG00c3ZjX2NhbGxiYWNrKHJxc3RwLCBOTE1QUk9DX0xPQ0tfUkVTLCAmcmVzKTsKKwlyZXR1cm4gc3RhdDsKK30KKworc3RhdGljIGludAorbmxtNHN2Y19wcm9jX2NhbmNlbF9tc2coc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJCQkgICAgICAgdm9pZAkgICAgICAgKnJlc3ApCit7CisJc3RydWN0IG5sbV9yZXMJcmVzOworCXUzMgkJc3RhdDsKKworCWRwcmludGsoImxvY2tkOiBDQU5DRUxfTVNHICAgIGNhbGxlZFxuIik7CisJbWVtc2V0KCZyZXMsIDAsIHNpemVvZihyZXMpKTsKKworCWlmICgoc3RhdCA9IG5sbTRzdmNfcHJvY19jYW5jZWwocnFzdHAsIGFyZ3AsICZyZXMpKSA9PSAwKQorCQlzdGF0ID0gbmxtNHN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19DQU5DRUxfUkVTLCAmcmVzKTsKKwlyZXR1cm4gc3RhdDsKK30KKworc3RhdGljIGludAorbmxtNHN2Y19wcm9jX3VubG9ja19tc2coc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnJlc3ApCit7CisJc3RydWN0IG5sbV9yZXMJcmVzOworCXUzMgkJc3RhdDsKKworCWRwcmludGsoImxvY2tkOiBVTkxPQ0tfTVNHICAgIGNhbGxlZFxuIik7CisJbWVtc2V0KCZyZXMsIDAsIHNpemVvZihyZXMpKTsKKworCWlmICgoc3RhdCA9IG5sbTRzdmNfcHJvY191bmxvY2socnFzdHAsIGFyZ3AsICZyZXMpKSA9PSAwKQorCQlzdGF0ID0gbmxtNHN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19VTkxPQ0tfUkVTLCAmcmVzKTsKKwlyZXR1cm4gc3RhdDsKK30KKworc3RhdGljIGludAorbmxtNHN2Y19wcm9jX2dyYW50ZWRfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX3JlcwlyZXM7CisJdTMyCQlzdGF0OworCisJZHByaW50aygibG9ja2Q6IEdSQU5URURfTVNHICAgY2FsbGVkXG4iKTsKKwltZW1zZXQoJnJlcywgMCwgc2l6ZW9mKHJlcykpOworCisJaWYgKChzdGF0ID0gbmxtNHN2Y19wcm9jX2dyYW50ZWQocnFzdHAsIGFyZ3AsICZyZXMpKSA9PSAwKQorCQlzdGF0ID0gbmxtNHN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19HUkFOVEVEX1JFUywgJnJlcyk7CisJcmV0dXJuIHN0YXQ7Cit9CisKKy8qCisgKiBTSEFSRTogY3JlYXRlIGEgRE9TIHNoYXJlIG9yIGFsdGVyIGV4aXN0aW5nIHNoYXJlLgorICovCitzdGF0aWMgaW50CitubG00c3ZjX3Byb2Nfc2hhcmUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJCSAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCit7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0OworCXN0cnVjdCBubG1fZmlsZQkqZmlsZTsKKworCWRwcmludGsoImxvY2tkOiBTSEFSRSAgICAgICAgIGNhbGxlZFxuIik7CisKKwlyZXNwLT5jb29raWUgPSBhcmdwLT5jb29raWU7CisKKwkvKiBEb24ndCBhY2NlcHQgbmV3IGxvY2sgcmVxdWVzdHMgZHVyaW5nIGdyYWNlIHBlcmlvZCAqLworCWlmIChubG1zdmNfZ3JhY2VfcGVyaW9kICYmICFhcmdwLT5yZWNsYWltKSB7CisJCXJlc3AtPnN0YXR1cyA9IG5sbV9sY2tfZGVuaWVkX2dyYWNlX3BlcmlvZDsKKwkJcmV0dXJuIHJwY19zdWNjZXNzOworCX0KKworCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KKwlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbTRzdmNfcmV0cmlldmVfYXJncyhycXN0cCwgYXJncCwgJmhvc3QsICZmaWxlKSkpCisJCXJldHVybiBycGNfc3VjY2VzczsKKworCS8qIE5vdyB0cnkgdG8gY3JlYXRlIHRoZSBzaGFyZSAqLworCXJlc3AtPnN0YXR1cyA9IG5sbXN2Y19zaGFyZV9maWxlKGhvc3QsIGZpbGUsIGFyZ3ApOworCisJZHByaW50aygibG9ja2Q6IFNIQVJFICAgICAgICAgc3RhdHVzICVkXG4iLCBudG9obChyZXNwLT5zdGF0dXMpKTsKKwlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbV9yZWxlYXNlX2ZpbGUoZmlsZSk7CisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCisvKgorICogVU5TSEFSRTogUmVsZWFzZSBhIERPUyBzaGFyZS4KKyAqLworc3RhdGljIGludAorbmxtNHN2Y19wcm9jX3Vuc2hhcmUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJCSAgICAgICAgICAgIHN0cnVjdCBubG1fcmVzICAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3Q7CisJc3RydWN0IG5sbV9maWxlCSpmaWxlOworCisJZHByaW50aygibG9ja2Q6IFVOU0hBUkUgICAgICAgY2FsbGVkXG4iKTsKKworCXJlc3AtPmNvb2tpZSA9IGFyZ3AtPmNvb2tpZTsKKworCS8qIERvbid0IGFjY2VwdCByZXF1ZXN0cyBkdXJpbmcgZ3JhY2UgcGVyaW9kICovCisJaWYgKG5sbXN2Y19ncmFjZV9wZXJpb2QpIHsKKwkJcmVzcC0+c3RhdHVzID0gbmxtX2xja19kZW5pZWRfZ3JhY2VfcGVyaW9kOworCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisJfQorCisJLyogT2J0YWluIGNsaWVudCBhbmQgZmlsZSAqLworCWlmICgocmVzcC0+c3RhdHVzID0gbmxtNHN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgJmZpbGUpKSkKKwkJcmV0dXJuIHJwY19zdWNjZXNzOworCisJLyogTm93IHRyeSB0byBsb2NrIHRoZSBmaWxlICovCisJcmVzcC0+c3RhdHVzID0gbmxtc3ZjX3Vuc2hhcmVfZmlsZShob3N0LCBmaWxlLCBhcmdwKTsKKworCWRwcmludGsoImxvY2tkOiBVTlNIQVJFICAgICAgIHN0YXR1cyAlZFxuIiwgbnRvaGwocmVzcC0+c3RhdHVzKSk7CisJbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwlubG1fcmVsZWFzZV9maWxlKGZpbGUpOworCXJldHVybiBycGNfc3VjY2VzczsKK30KKworLyoKKyAqIE5NX0xPQ0s6IENyZWF0ZSBhbiB1bm1vbml0b3JlZCBsb2NrCisgKi8KK3N0YXRpYyBpbnQKK25sbTRzdmNfcHJvY19ubV9sb2NrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKKwkJCQkgICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCit7CisJZHByaW50aygibG9ja2Q6IE5NX0xPQ0sgICAgICAgY2FsbGVkXG4iKTsKKworCWFyZ3AtPm1vbml0b3IgPSAwOwkJLyoganVzdCBjbGVhbiB0aGUgbW9uaXRvciBmbGFnICovCisJcmV0dXJuIG5sbTRzdmNfcHJvY19sb2NrKHJxc3RwLCBhcmdwLCByZXNwKTsKK30KKworLyoKKyAqIEZSRUVfQUxMOiBSZWxlYXNlIGFsbCBsb2NrcyBhbmQgc2hhcmVzIGhlbGQgYnkgY2xpZW50CisgKi8KK3N0YXRpYyBpbnQKK25sbTRzdmNfcHJvY19mcmVlX2FsbChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCQkJCSAgICAgdm9pZCAgICAgICAgICAgICpyZXNwKQoreworCXN0cnVjdCBubG1faG9zdAkqaG9zdDsKKworCS8qIE9idGFpbiBjbGllbnQgKi8KKwlpZiAobmxtNHN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgTlVMTCkpCisJCXJldHVybiBycGNfc3VjY2VzczsKKworCW5sbXN2Y19mcmVlX2hvc3RfcmVzb3VyY2VzKGhvc3QpOworCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCisvKgorICogU01fTk9USUZZOiBwcml2YXRlIGNhbGxiYWNrIGZyb20gc3RhdGQgKG5vdCBwYXJ0IG9mIG9mZmljaWFsIE5MTSBwcm90bykKKyAqLworc3RhdGljIGludAorbmxtNHN2Y19wcm9jX3NtX25vdGlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX3JlYm9vdCAqYXJncCwKKwkJCQkJICAgICAgdm9pZAkgICAgICAgICpyZXNwKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbglzYWRkciA9IHJxc3RwLT5ycV9hZGRyOworCWludAkJCXZlcnMgPSBhcmdwLT52ZXJzOworCWludAkJCXByb3QgPSBhcmdwLT5wcm90byA+PiAxOworCisJc3RydWN0IG5sbV9ob3N0CQkqaG9zdDsKKworCWRwcmludGsoImxvY2tkOiBTTV9OT1RJRlkgICAgIGNhbGxlZFxuIik7CisJaWYgKHNhZGRyLnNpbl9hZGRyLnNfYWRkciAhPSBodG9ubChJTkFERFJfTE9PUEJBQ0spCisJIHx8IG50b2hzKHNhZGRyLnNpbl9wb3J0KSA+PSAxMDI0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJsb2NrZDogcmVqZWN0ZWQgTlNNIGNhbGxiYWNrIGZyb20gJTA4eDolZFxuIiwKKwkJCW50b2hsKHJxc3RwLT5ycV9hZGRyLnNpbl9hZGRyLnNfYWRkciksCisJCQludG9ocyhycXN0cC0+cnFfYWRkci5zaW5fcG9ydCkpOworCQlyZXR1cm4gcnBjX3N5c3RlbV9lcnI7CisJfQorCisJLyogT2J0YWluIHRoZSBob3N0IHBvaW50ZXIgZm9yIHRoaXMgTkZTIHNlcnZlciBhbmQgdHJ5IHRvCisJICogcmVjbGFpbSBhbGwgbG9ja3Mgd2UgaG9sZCBvbiB0aGlzIHNlcnZlci4KKwkgKi8KKwlzYWRkci5zaW5fYWRkci5zX2FkZHIgPSBhcmdwLT5hZGRyOworCisJaWYgKChhcmdwLT5wcm90byAmIDEpPT0wKSB7CisJCWlmICgoaG9zdCA9IG5sbWNsbnRfbG9va3VwX2hvc3QoJnNhZGRyLCBwcm90LCB2ZXJzKSkgIT0gTlVMTCkgeworCQkJbmxtY2xudF9yZWNvdmVyeShob3N0LCBhcmdwLT5zdGF0ZSk7CisJCQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCQl9CisJfSBlbHNlIHsKKwkJLyogSWYgd2UgcnVuIG9uIGFuIE5GUyBzZXJ2ZXIsIGRlbGV0ZSBhbGwgbG9ja3MgaGVsZCBieSB0aGUgY2xpZW50ICovCisKKwkJaWYgKChob3N0ID0gbmxtX2xvb2t1cF9ob3N0KDEsICZzYWRkciwgcHJvdCwgdmVycykpICE9IE5VTEwpIHsKKwkJCW5sbXN2Y19mcmVlX2hvc3RfcmVzb3VyY2VzKGhvc3QpOworCQkJbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwkJfQorCX0KKwlyZXR1cm4gcnBjX3N1Y2Nlc3M7Cit9CisKKy8qCisgKiBjbGllbnQgc2VudCBhIEdSQU5URURfUkVTLCBsZXQncyByZW1vdmUgdGhlIGFzc29jaWF0ZWQgYmxvY2sKKyAqLworc3RhdGljIGludAorbmxtNHN2Y19wcm9jX2dyYW50ZWRfcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fcmVzICAqYXJncCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcmVzcCkKK3sKKyAgICAgICAgaWYgKCFubG1zdmNfb3BzKQorICAgICAgICAgICAgICAgIHJldHVybiBycGNfc3VjY2VzczsKKworICAgICAgICBkcHJpbnRrKCJsb2NrZDogR1JBTlRFRF9SRVMgICBjYWxsZWRcbiIpOworCisgICAgICAgIG5sbXN2Y19ncmFudF9yZXBseShycXN0cCwgJmFyZ3AtPmNvb2tpZSwgYXJncC0+c3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHJwY19zdWNjZXNzOworfQorCisKKworLyoKKyAqIFRoaXMgaXMgdGhlIGdlbmVyaWMgbG9ja2QgY2FsbGJhY2sgZm9yIGFzeW5jIFJQQyBjYWxscworICovCitzdGF0aWMgdTMyCitubG00c3ZjX2NhbGxiYWNrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiBwcm9jLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3Q7CisJc3RydWN0IG5sbV9ycXN0CSpjYWxsOworCisJaWYgKCEoY2FsbCA9IG5sbWNsbnRfYWxsb2NfY2FsbCgpKSkKKwkJcmV0dXJuIHJwY19zeXN0ZW1fZXJyOworCisJaG9zdCA9IG5sbWNsbnRfbG9va3VwX2hvc3QoJnJxc3RwLT5ycV9hZGRyLAorCQkJCXJxc3RwLT5ycV9wcm90LCBycXN0cC0+cnFfdmVycyk7CisJaWYgKCFob3N0KSB7CisJCWtmcmVlKGNhbGwpOworCQlyZXR1cm4gcnBjX3N5c3RlbV9lcnI7CisJfQorCisJY2FsbC0+YV9mbGFncyA9IFJQQ19UQVNLX0FTWU5DOworCWNhbGwtPmFfaG9zdCAgPSBob3N0OworCW1lbWNweSgmY2FsbC0+YV9hcmdzLCByZXNwLCBzaXplb2YoKnJlc3ApKTsKKworCWlmIChubG1zdmNfYXN5bmNfY2FsbChjYWxsLCBwcm9jLCBubG00c3ZjX2NhbGxiYWNrX2V4aXQpIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiBycGNfc3VjY2VzczsKKyBlcnJvcjoKKwlrZnJlZShjYWxsKTsKKwlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCXJldHVybiBycGNfc3lzdGVtX2VycjsKK30KKworc3RhdGljIHZvaWQKK25sbTRzdmNfY2FsbGJhY2tfZXhpdChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IG5sbV9ycXN0CSpjYWxsID0gKHN0cnVjdCBubG1fcnFzdCAqKSB0YXNrLT50a19jYWxsZGF0YTsKKworCWlmICh0YXNrLT50a19zdGF0dXMgPCAwKSB7CisJCWRwcmludGsoImxvY2tkOiAlNGQgY2FsbGJhY2sgZmFpbGVkIChlcnJubyA9ICVkKVxuIiwKKwkJCQkJdGFzay0+dGtfcGlkLCAtdGFzay0+dGtfc3RhdHVzKTsKKwl9CisJbmxtX3JlbGVhc2VfaG9zdChjYWxsLT5hX2hvc3QpOworCWtmcmVlKGNhbGwpOworfQorCisvKgorICogTkxNIFNlcnZlciBwcm9jZWR1cmVzLgorICovCisKKyNkZWZpbmUgbmxtNHN2Y19lbmNvZGVfbm9yZXAJbmxtNHN2Y19lbmNvZGVfdm9pZAorI2RlZmluZSBubG00c3ZjX2RlY29kZV9ub3JlcAlubG00c3ZjX2RlY29kZV92b2lkCisjZGVmaW5lIG5sbTRzdmNfZGVjb2RlX3Rlc3RyZXMJbmxtNHN2Y19kZWNvZGVfdm9pZAorI2RlZmluZSBubG00c3ZjX2RlY29kZV9sb2NrcmVzCW5sbTRzdmNfZGVjb2RlX3ZvaWQKKyNkZWZpbmUgbmxtNHN2Y19kZWNvZGVfdW5sb2NrcmVzCW5sbTRzdmNfZGVjb2RlX3ZvaWQKKyNkZWZpbmUgbmxtNHN2Y19kZWNvZGVfY2FuY2VscmVzCW5sbTRzdmNfZGVjb2RlX3ZvaWQKKyNkZWZpbmUgbmxtNHN2Y19kZWNvZGVfZ3JhbnRlZHJlcwlubG00c3ZjX2RlY29kZV92b2lkCisKKyNkZWZpbmUgbmxtNHN2Y19wcm9jX25vbmUJbmxtNHN2Y19wcm9jX251bGwKKyNkZWZpbmUgbmxtNHN2Y19wcm9jX3Rlc3RfcmVzCW5sbTRzdmNfcHJvY19udWxsCisjZGVmaW5lIG5sbTRzdmNfcHJvY19sb2NrX3JlcwlubG00c3ZjX3Byb2NfbnVsbAorI2RlZmluZSBubG00c3ZjX3Byb2NfY2FuY2VsX3JlcwlubG00c3ZjX3Byb2NfbnVsbAorI2RlZmluZSBubG00c3ZjX3Byb2NfdW5sb2NrX3JlcwlubG00c3ZjX3Byb2NfbnVsbAorCitzdHJ1Y3QgbmxtX3ZvaWQJCQl7IGludCBkdW1teTsgfTsKKworI2RlZmluZSBQUk9DKG5hbWUsIHhhcmd0LCB4cmVzdCwgYXJndCwgcmVzdCwgcmVzcHNpemUpCVwKKyB7IC5wY19mdW5jCT0gKHN2Y19wcm9jZnVuYykgbmxtNHN2Y19wcm9jXyMjbmFtZSwJXAorICAgLnBjX2RlY29kZQk9IChreGRycHJvY190KSBubG00c3ZjX2RlY29kZV8jI3hhcmd0LAlcCisgICAucGNfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpIG5sbTRzdmNfZW5jb2RlXyMjeHJlc3QsCVwKKyAgIC5wY19yZWxlYXNlCT0gTlVMTCwJCQkJCVwKKyAgIC5wY19hcmdzaXplCT0gc2l6ZW9mKHN0cnVjdCBubG1fIyNhcmd0KSwJCVwKKyAgIC5wY19yZXNzaXplCT0gc2l6ZW9mKHN0cnVjdCBubG1fIyNyZXN0KSwJCVwKKyAgIC5wY194ZHJyZXNzaXplID0gcmVzcHNpemUsCQkJCVwKKyB9CisjZGVmaW5lCUNrCSgxK1hEUl9RVUFETEVOKE5MTV9NQVhDT09LSUVMRU4pKQkvKiBjb29raWUgKi8KKyNkZWZpbmUJTm8JKDErMTAyNC80KQkJCQkvKiBuZXRvYmogKi8KKyNkZWZpbmUJU3QJMQkJCQkJLyogc3RhdHVzICovCisjZGVmaW5lCVJnCTQJCQkJCS8qIHJhbmdlIChvZmZzZXQgKyBsZW5ndGgpICovCitzdHJ1Y3Qgc3ZjX3Byb2NlZHVyZQkJbmxtc3ZjX3Byb2NlZHVyZXM0W10gPSB7CisgIFBST0MobnVsbCwJCXZvaWQsCQl2b2lkLAkJdm9pZCwJdm9pZCwgMSksCisgIFBST0ModGVzdCwJCXRlc3RhcmdzLAl0ZXN0cmVzLAlhcmdzLAlyZXMsIENrK1N0KzIrTm8rUmcpLAorICBQUk9DKGxvY2ssCQlsb2NrYXJncywJcmVzLAkJYXJncywJcmVzLCBDaytTdCksCisgIFBST0MoY2FuY2VsLAkJY2FuY2FyZ3MsCXJlcywJCWFyZ3MsCXJlcywgQ2srU3QpLAorICBQUk9DKHVubG9jaywJCXVubG9ja2FyZ3MsCXJlcywJCWFyZ3MsCXJlcywgQ2srU3QpLAorICBQUk9DKGdyYW50ZWQsCQl0ZXN0YXJncywJcmVzLAkJYXJncywJcmVzLCBDaytTdCksCisgIFBST0ModGVzdF9tc2csCXRlc3RhcmdzLAlub3JlcCwJCWFyZ3MsCXZvaWQsIDEpLAorICBQUk9DKGxvY2tfbXNnLAlsb2NrYXJncywJbm9yZXAsCQlhcmdzLAl2b2lkLCAxKSwKKyAgUFJPQyhjYW5jZWxfbXNnLAljYW5jYXJncywJbm9yZXAsCQlhcmdzLAl2b2lkLCAxKSwKKyAgUFJPQyh1bmxvY2tfbXNnLAl1bmxvY2thcmdzLAlub3JlcCwJCWFyZ3MsCXZvaWQsIDEpLAorICBQUk9DKGdyYW50ZWRfbXNnLAl0ZXN0YXJncywJbm9yZXAsCQlhcmdzLAl2b2lkLCAxKSwKKyAgUFJPQyh0ZXN0X3JlcywJdGVzdHJlcywJbm9yZXAsCQlyZXMsCXZvaWQsIDEpLAorICBQUk9DKGxvY2tfcmVzLAlsb2NrcmVzLAlub3JlcCwJCXJlcywJdm9pZCwgMSksCisgIFBST0MoY2FuY2VsX3JlcywJY2FuY2VscmVzLAlub3JlcCwJCXJlcywJdm9pZCwgMSksCisgIFBST0ModW5sb2NrX3JlcywJdW5sb2NrcmVzLAlub3JlcCwJCXJlcywJdm9pZCwgMSksCisgIFBST0MoZ3JhbnRlZF9yZXMsCXJlcywJCW5vcmVwLAkJcmVzLAl2b2lkLCAxKSwKKyAgLyogc3RhdGQgY2FsbGJhY2sgKi8KKyAgUFJPQyhzbV9ub3RpZnksCXJlYm9vdCwJCXZvaWQsCQlyZWJvb3QsCXZvaWQsIDEpLAorICBQUk9DKG5vbmUsCQl2b2lkLAkJdm9pZCwJCXZvaWQsCXZvaWQsIDApLAorICBQUk9DKG5vbmUsCQl2b2lkLAkJdm9pZCwJCXZvaWQsCXZvaWQsIDApLAorICBQUk9DKG5vbmUsCQl2b2lkLAkJdm9pZCwJCXZvaWQsCXZvaWQsIDApLAorICBQUk9DKHNoYXJlLAkJc2hhcmVhcmdzLAlzaGFyZXJlcywJYXJncywJcmVzLCBDaytTdCsxKSwKKyAgUFJPQyh1bnNoYXJlLAkJc2hhcmVhcmdzLAlzaGFyZXJlcywJYXJncywJcmVzLCBDaytTdCsxKSwKKyAgUFJPQyhubV9sb2NrLAkJbG9ja2FyZ3MsCXJlcywJCWFyZ3MsCXJlcywgQ2srU3QpLAorICBQUk9DKGZyZWVfYWxsLAlub3RpZnksCQl2b2lkLAkJYXJncywJdm9pZCwgMSksCisKK307CmRpZmYgLS1naXQgYS9mcy9sb2NrZC9zdmNsb2NrLmMgYi9mcy9sb2NrZC9zdmNsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmOTU5NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2xvY2tkL3N2Y2xvY2suYwpAQCAtMCwwICsxLDY4NiBAQAorLyoKKyAqIGxpbnV4L2ZzL2xvY2tkL3N2Y2xvY2suYworICoKKyAqIEhhbmRsaW5nIG9mIHNlcnZlci1zaWRlIGxvY2tzLCBtb3N0bHkgb2YgdGhlIGJsb2NrZWQgdmFyaWV0eS4KKyAqIFRoaXMgaXMgdGhlIHVnbGllc3QgcGFydCBvZiBsb2NrZCBiZWNhdXNlIHdlIHRyZWFkIG9uIHZlcnkgdGhpbiBpY2UuCisgKiBHUkFOVCBhbmQgQ0FOQ0VMIGNhbGxzIG1heSBnZXQgc3R1Y2ssIG1lZXQgaW4gbWlkLWZsaWdodCwgZXRjLgorICogSU1OU0hPIGludHJvZHVjaW5nIHRoZSBncmFudCBjYWxsYmFjayBpbnRvIHRoZSBOTE0gcHJvdG9jb2wgd2FzIG9uZQorICogb2YgdGhlIHdvcnN0IGlkZWFzIFN1biBldmVyIGhhZC4gRXhjZXB0IG1heWJlIGZvciB0aGUgaWRlYSBvZiBkb2luZworICogTkZTIGZpbGUgbG9ja2luZyBhdCBhbGwuCisgKgorICogSSdtIHRyeWluZyBoYXJkIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyBieSBwcm90ZWN0aW5nIG1vc3QgYWNjZXNzZXMKKyAqIHRvIGEgZmlsZSdzIGxpc3Qgb2YgYmxvY2tlZCBsb2NrcyB0aHJvdWdoIGEgc2VtYXBob3JlLiBUaGUgZ2xvYmFsCisgKiBsaXN0IG9mIGJsb2NrZWQgbG9ja3MgaXMgbm90IHByb3RlY3RlZCBpbiB0aGlzIGZhc2hpb24gaG93ZXZlci4KKyAqIFRoZXJlZm9yZSwgc29tZSBmdW5jdGlvbnMgKHN1Y2ggYXMgdGhlIFJQQyBjYWxsYmFjayBmb3IgdGhlIGFzeW5jIGdyYW50CisgKiBjYWxsKSBtb3ZlIGJsb2NrZWQgbG9ja3MgdG93YXJkcyB0aGUgaGVhZCBvZiB0aGUgbGlzdCAqd2hpbGUgc29tZSBvdGhlcgorICogcHJvY2VzcyBtaWdodCBiZSB0cmF2ZXJzaW5nIGl0Ki4gVGhpcyBzaG91bGQgbm90IGJlIGEgcHJvYmxlbSBpbgorICogcHJhY3RpY2UsIGJlY2F1c2UgdGhpcyB3aWxsIG9ubHkgY2F1c2UgZnVuY3Rpb25zIHRyYXZlcnNpbmcgdGhlIGxpc3QKKyAqIHRvIHZpc2l0IHNvbWUgYmxvY2tzIHR3aWNlLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2QvbmxtLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KKworI2RlZmluZSBOTE1EQkdfRkFDSUxJVFkJCU5MTURCR19TVkNMT0NLCisKKyNpZmRlZiBDT05GSUdfTE9DS0RfVjQKKyNkZWZpbmUgbmxtX2RlYWRsb2NrCW5sbTRfZGVhZGxvY2sKKyNlbHNlCisjZGVmaW5lIG5sbV9kZWFkbG9jawlubG1fbGNrX2RlbmllZAorI2VuZGlmCisKK3N0YXRpYyB2b2lkCW5sbXN2Y19pbnNlcnRfYmxvY2soc3RydWN0IG5sbV9ibG9jayAqYmxvY2ssIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIGludAlubG1zdmNfcmVtb3ZlX2Jsb2NrKHN0cnVjdCBubG1fYmxvY2sgKmJsb2NrKTsKK3N0YXRpYyB2b2lkCW5sbXN2Y19ncmFudF9jYWxsYmFjayhzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spOworCisvKgorICogVGhlIGxpc3Qgb2YgYmxvY2tlZCBsb2NrcyB0byByZXRyeQorICovCitzdGF0aWMgc3RydWN0IG5sbV9ibG9jayAqCW5sbV9ibG9ja2VkOworCisvKgorICogSW5zZXJ0IGEgYmxvY2tlZCBsb2NrIGludG8gdGhlIGdsb2JhbCBsaXN0CisgKi8KK3N0YXRpYyB2b2lkCitubG1zdmNfaW5zZXJ0X2Jsb2NrKHN0cnVjdCBubG1fYmxvY2sgKmJsb2NrLCB1bnNpZ25lZCBsb25nIHdoZW4pCit7CisJc3RydWN0IG5sbV9ibG9jayAqKmJwLCAqYjsKKworCWRwcmludGsoImxvY2tkOiBubG1zdmNfaW5zZXJ0X2Jsb2NrKCVwLCAlbGQpXG4iLCBibG9jaywgd2hlbik7CisJaWYgKGJsb2NrLT5iX3F1ZXVlZCkKKwkJbmxtc3ZjX3JlbW92ZV9ibG9jayhibG9jayk7CisJYnAgPSAmbmxtX2Jsb2NrZWQ7CisJaWYgKHdoZW4gIT0gTkxNX05FVkVSKSB7CisJCWlmICgod2hlbiArPSBqaWZmaWVzKSA9PSBOTE1fTkVWRVIpCisJCQl3aGVuICsrOworCQl3aGlsZSAoKGIgPSAqYnApICYmIHRpbWVfYmVmb3JlX2VxKGItPmJfd2hlbix3aGVuKSAmJiBiLT5iX3doZW4gIT0gTkxNX05FVkVSKQorCQkJYnAgPSAmYi0+Yl9uZXh0OworCX0gZWxzZQorCQl3aGlsZSAoKGIgPSAqYnApICE9IDApCisJCQlicCA9ICZiLT5iX25leHQ7CisKKwlibG9jay0+Yl9xdWV1ZWQgPSAxOworCWJsb2NrLT5iX3doZW4gPSB3aGVuOworCWJsb2NrLT5iX25leHQgPSBiOworCSpicCA9IGJsb2NrOworfQorCisvKgorICogUmVtb3ZlIGEgYmxvY2sgZnJvbSB0aGUgZ2xvYmFsIGxpc3QKKyAqLworc3RhdGljIGludAorbmxtc3ZjX3JlbW92ZV9ibG9jayhzdHJ1Y3QgbmxtX2Jsb2NrICpibG9jaykKK3sKKwlzdHJ1Y3QgbmxtX2Jsb2NrICoqYnAsICpiOworCisJaWYgKCFibG9jay0+Yl9xdWV1ZWQpCisJCXJldHVybiAxOworCWZvciAoYnAgPSAmbmxtX2Jsb2NrZWQ7IChiID0gKmJwKSAhPSAwOyBicCA9ICZiLT5iX25leHQpIHsKKwkJaWYgKGIgPT0gYmxvY2spIHsKKwkJCSpicCA9IGJsb2NrLT5iX25leHQ7CisJCQlibG9jay0+Yl9xdWV1ZWQgPSAwOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZpbmQgYSBibG9jayBmb3IgYSBnaXZlbiBsb2NrIGFuZCBvcHRpb25hbGx5IHJlbW92ZSBpdCBmcm9tCisgKiB0aGUgbGlzdC4KKyAqLworc3RhdGljIHN0cnVjdCBubG1fYmxvY2sgKgorbmxtc3ZjX2xvb2t1cF9ibG9jayhzdHJ1Y3QgbmxtX2ZpbGUgKmZpbGUsIHN0cnVjdCBubG1fbG9jayAqbG9jaywgaW50IHJlbW92ZSkKK3sKKwlzdHJ1Y3QgbmxtX2Jsb2NrCSoqaGVhZCwgKmJsb2NrOworCXN0cnVjdCBmaWxlX2xvY2sJKmZsOworCisJZHByaW50aygibG9ja2Q6IG5sbXN2Y19sb29rdXBfYmxvY2sgZj0lcCBwZD0lZCAlTGQtJUxkIHR5PSVkXG4iLAorCQkJCWZpbGUsIGxvY2stPmZsLmZsX3BpZCwKKwkJCQkobG9uZyBsb25nKWxvY2stPmZsLmZsX3N0YXJ0LAorCQkJCShsb25nIGxvbmcpbG9jay0+ZmwuZmxfZW5kLCBsb2NrLT5mbC5mbF90eXBlKTsKKwlmb3IgKGhlYWQgPSAmbmxtX2Jsb2NrZWQ7IChibG9jayA9ICpoZWFkKSAhPSAwOyBoZWFkID0gJmJsb2NrLT5iX25leHQpIHsKKwkJZmwgPSAmYmxvY2stPmJfY2FsbC5hX2FyZ3MubG9jay5mbDsKKwkJZHByaW50aygibG9ja2Q6IGNoZWNrIGY9JXAgcGQ9JWQgJUxkLSVMZCB0eT0lZCBjb29raWU9JXNcbiIsCisJCQkJYmxvY2stPmJfZmlsZSwgZmwtPmZsX3BpZCwKKwkJCQkobG9uZyBsb25nKWZsLT5mbF9zdGFydCwKKwkJCQkobG9uZyBsb25nKWZsLT5mbF9lbmQsIGZsLT5mbF90eXBlLAorCQkJCW5sbWRiZ19jb29raWUyYSgmYmxvY2stPmJfY2FsbC5hX2FyZ3MuY29va2llKSk7CisJCWlmIChibG9jay0+Yl9maWxlID09IGZpbGUgJiYgbmxtX2NvbXBhcmVfbG9ja3MoZmwsICZsb2NrLT5mbCkpIHsKKwkJCWlmIChyZW1vdmUpIHsKKwkJCQkqaGVhZCA9IGJsb2NrLT5iX25leHQ7CisJCQkJYmxvY2stPmJfcXVldWVkID0gMDsKKwkJCX0KKwkJCXJldHVybiBibG9jazsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCBubG1fY29va2llX21hdGNoKHN0cnVjdCBubG1fY29va2llICphLCBzdHJ1Y3QgbmxtX2Nvb2tpZSAqYikKK3sKKwlpZihhLT5sZW4gIT0gYi0+bGVuKQorCQlyZXR1cm4gMDsKKwlpZihtZW1jbXAoYS0+ZGF0YSxiLT5kYXRhLGEtPmxlbikpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKgorICogRmluZCBhIGJsb2NrIHdpdGggYSBnaXZlbiBOTE0gY29va2llLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBubG1fYmxvY2sgKgorbmxtc3ZjX2ZpbmRfYmxvY2soc3RydWN0IG5sbV9jb29raWUgKmNvb2tpZSwgIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luKQoreworCXN0cnVjdCBubG1fYmxvY2sgKmJsb2NrOworCisJZm9yIChibG9jayA9IG5sbV9ibG9ja2VkOyBibG9jazsgYmxvY2sgPSBibG9jay0+Yl9uZXh0KSB7CisJCWRwcmludGsoImNvb2tpZTogaGVhZCBvZiBibG9ja2VkIHF1ZXVlICVwLCBibG9jayAlcFxuIiwgCisJCQlubG1fYmxvY2tlZCwgYmxvY2spOworCQlpZiAobmxtX2Nvb2tpZV9tYXRjaCgmYmxvY2stPmJfY2FsbC5hX2FyZ3MuY29va2llLGNvb2tpZSkKKwkJCQkmJiBubG1fY21wX2FkZHIoc2luLCAmYmxvY2stPmJfaG9zdC0+aF9hZGRyKSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBibG9jazsKK30KKworLyoKKyAqIENyZWF0ZSBhIGJsb2NrIGFuZCBpbml0aWFsaXplIGl0LgorICoKKyAqIE5vdGU6IHdlIGV4cGxpY2l0bHkgc2V0IHRoZSBjb29raWUgb2YgdGhlIGdyYW50IHJlcGx5IHRvIHRoYXQgb2YKKyAqIHRoZSBibG9ja2VkIGxvY2sgcmVxdWVzdC4gVGhlIHNwZWMgZXhwbGljaXRseSBtZW50aW9ucyB0aGF0IHRoZSBjbGllbnQKKyAqIHNob3VsZCBfbm90XyByZWx5IG9uIHRoZSBjYWxsYmFjayBjb250YWluaW5nIHRoZSBzYW1lIGNvb2tpZSBhcyB0aGUKKyAqIHJlcXVlc3QsIGJ1dCAoYXMgSSBmb3VuZCBvdXQgbGF0ZXIpIHRoYXQncyBiZWNhdXNlIHNvbWUgaW1wbGVtZW50YXRpb25zCisgKiBkbyBqdXN0IHRoaXMuIE5ldmVyIG1pbmQgdGhlIHN0YW5kYXJkcyBjb21pdHRlZXMsIHRoZXkgc3VwcG9ydCBvdXIKKyAqIGxvZ2dpbmcgaW5kdXN0cmllcy4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmxtX2Jsb2NrICoKK25sbXN2Y19jcmVhdGVfYmxvY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9maWxlICpmaWxlLAorCQkJCXN0cnVjdCBubG1fbG9jayAqbG9jaywgc3RydWN0IG5sbV9jb29raWUgKmNvb2tpZSkKK3sKKwlzdHJ1Y3QgbmxtX2Jsb2NrCSpibG9jazsKKwlzdHJ1Y3QgbmxtX2hvc3QJCSpob3N0OworCXN0cnVjdCBubG1fcnFzdAkJKmNhbGw7CisKKwkvKiBDcmVhdGUgaG9zdCBoYW5kbGUgZm9yIGNhbGxiYWNrICovCisJaG9zdCA9IG5sbWNsbnRfbG9va3VwX2hvc3QoJnJxc3RwLT5ycV9hZGRyLAorCQkJCXJxc3RwLT5ycV9wcm90LCBycXN0cC0+cnFfdmVycyk7CisJaWYgKGhvc3QgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGJsb2NrLCBhbmQgaW5pdGlhbGl6ZSBhcmd1bWVudHMgKi8KKwlpZiAoIShibG9jayA9IChzdHJ1Y3QgbmxtX2Jsb2NrICopIGttYWxsb2Moc2l6ZW9mKCpibG9jayksIEdGUF9LRVJORUwpKSkKKwkJZ290byBmYWlsZWQ7CisJbWVtc2V0KGJsb2NrLCAwLCBzaXplb2YoKmJsb2NrKSk7CisJbG9ja3NfaW5pdF9sb2NrKCZibG9jay0+Yl9jYWxsLmFfYXJncy5sb2NrLmZsKTsKKwlsb2Nrc19pbml0X2xvY2soJmJsb2NrLT5iX2NhbGwuYV9yZXMubG9jay5mbCk7CisKKwlpZiAoIW5sbWNsbnRfc2V0Z3JhbnRhcmdzKCZibG9jay0+Yl9jYWxsLCBsb2NrKSkKKwkJZ290byBmYWlsZWRfZnJlZTsKKworCS8qIFNldCBub3RpZmllciBmdW5jdGlvbiBmb3IgVkZTLCBhbmQgaW5pdCBhcmdzICovCisJYmxvY2stPmJfY2FsbC5hX2FyZ3MubG9jay5mbC5mbF9sbW9wcyA9ICZubG1zdmNfbG9ja19vcGVyYXRpb25zOworCWJsb2NrLT5iX2NhbGwuYV9hcmdzLmNvb2tpZSA9ICpjb29raWU7CS8qIHNlZSBhYm92ZSAqLworCisJZHByaW50aygibG9ja2Q6IGNyZWF0ZWQgYmxvY2sgJXAuLi5cbiIsIGJsb2NrKTsKKworCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgYmxvY2sgKi8KKwlibG9jay0+Yl9kYWVtb24gPSBycXN0cC0+cnFfc2VydmVyOworCWJsb2NrLT5iX2hvc3QgICA9IGhvc3Q7CisJYmxvY2stPmJfZmlsZSAgID0gZmlsZTsKKworCS8qIEFkZCB0byBmaWxlJ3MgbGlzdCBvZiBibG9ja3MgKi8KKwlibG9jay0+Yl9mbmV4dCAgPSBmaWxlLT5mX2Jsb2NrczsKKwlmaWxlLT5mX2Jsb2NrcyAgPSBibG9jazsKKworCS8qIFNldCB1cCBSUEMgYXJndW1lbnRzIGZvciBjYWxsYmFjayAqLworCWNhbGwgPSAmYmxvY2stPmJfY2FsbDsKKwljYWxsLT5hX2hvc3QgICAgPSBob3N0OworCWNhbGwtPmFfZmxhZ3MgICA9IFJQQ19UQVNLX0FTWU5DOworCisJcmV0dXJuIGJsb2NrOworCitmYWlsZWRfZnJlZToKKwlrZnJlZShibG9jayk7CitmYWlsZWQ6CisJbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIERlbGV0ZSBhIGJsb2NrLiBJZiB0aGUgbG9jayB3YXMgY2FuY2VsbGVkIG9yIHRoZSBncmFudCBjYWxsYmFjaworICogZmFpbGVkLCB1bmxvY2sgaXMgc2V0IHRvIDEuCisgKiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gY2hlY2sgd2hldGhlciB0aGUgZmlsZQorICogY2FuIGJlIGNsb3NlZCBoZXJlYWZ0ZXIuCisgKi8KK3N0YXRpYyB2b2lkCitubG1zdmNfZGVsZXRlX2Jsb2NrKHN0cnVjdCBubG1fYmxvY2sgKmJsb2NrLCBpbnQgdW5sb2NrKQoreworCXN0cnVjdCBmaWxlX2xvY2sJKmZsID0gJmJsb2NrLT5iX2NhbGwuYV9hcmdzLmxvY2suZmw7CisJc3RydWN0IG5sbV9maWxlCQkqZmlsZSA9IGJsb2NrLT5iX2ZpbGU7CisJc3RydWN0IG5sbV9ibG9jawkqKmJwOworCisJZHByaW50aygibG9ja2Q6IGRlbGV0aW5nIGJsb2NrICVwLi4uXG4iLCBibG9jayk7CisKKwkvKiBSZW1vdmUgYmxvY2sgZnJvbSBsaXN0ICovCisJbmxtc3ZjX3JlbW92ZV9ibG9jayhibG9jayk7CisJaWYgKGZsLT5mbF9uZXh0KQorCQlwb3NpeF91bmJsb2NrX2xvY2soZmlsZS0+Zl9maWxlLCBmbCk7CisJaWYgKHVubG9jaykgeworCQlmbC0+ZmxfdHlwZSA9IEZfVU5MQ0s7CisJCXBvc2l4X2xvY2tfZmlsZShmaWxlLT5mX2ZpbGUsIGZsKTsKKwkJYmxvY2stPmJfZ3JhbnRlZCA9IDA7CisJfQorCisJLyogSWYgdGhlIGJsb2NrIGlzIGluIHRoZSBtaWRkbGUgb2YgYSBHUkFOVCBjYWxsYmFjaywKKwkgKiBkb24ndCBraWxsIGl0IHlldC4gKi8KKwlpZiAoYmxvY2stPmJfaW5jYWxsKSB7CisJCW5sbXN2Y19pbnNlcnRfYmxvY2soYmxvY2ssIE5MTV9ORVZFUik7CisJCWJsb2NrLT5iX2RvbmUgPSAxOworCQlyZXR1cm47CisJfQorCisJLyogUmVtb3ZlIGJsb2NrIGZyb20gZmlsZSdzIGxpc3Qgb2YgYmxvY2tzICovCisJZm9yIChicCA9ICZmaWxlLT5mX2Jsb2NrczsgKmJwOyBicCA9ICYoKmJwKS0+Yl9mbmV4dCkgeworCQlpZiAoKmJwID09IGJsb2NrKSB7CisJCQkqYnAgPSBibG9jay0+Yl9mbmV4dDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGJsb2NrLT5iX2hvc3QpCisJCW5sbV9yZWxlYXNlX2hvc3QoYmxvY2stPmJfaG9zdCk7CisJbmxtY2xudF9mcmVlZ3JhbnRhcmdzKCZibG9jay0+Yl9jYWxsKTsKKwlrZnJlZShibG9jayk7Cit9CisKKy8qCisgKiBMb29wIG92ZXIgYWxsIGJsb2NrcyBhbmQgcGVyZm9ybSB0aGUgYWN0aW9uIHNwZWNpZmllZC4KKyAqIChOTE1fQUNUX0NIRUNLIGhhbmRsZWQgYnkgbmxtc3ZjX2luc3BlY3RfZmlsZSkuCisgKi8KK2ludAorbmxtc3ZjX3RyYXZlcnNlX2Jsb2NrcyhzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIHN0cnVjdCBubG1fZmlsZSAqZmlsZSwgaW50IGFjdGlvbikKK3sKKwlzdHJ1Y3QgbmxtX2Jsb2NrCSpibG9jaywgKm5leHQ7CisKKwlkb3duKCZmaWxlLT5mX3NlbWEpOworCWZvciAoYmxvY2sgPSBmaWxlLT5mX2Jsb2NrczsgYmxvY2s7IGJsb2NrID0gbmV4dCkgeworCQluZXh0ID0gYmxvY2stPmJfZm5leHQ7CisJCWlmIChhY3Rpb24gPT0gTkxNX0FDVF9NQVJLKQorCQkJYmxvY2stPmJfaG9zdC0+aF9pbnVzZSA9IDE7CisJCWVsc2UgaWYgKGFjdGlvbiA9PSBOTE1fQUNUX1VOTE9DSykgeworCQkJaWYgKGhvc3QgPT0gTlVMTCB8fCBob3N0ID09IGJsb2NrLT5iX2hvc3QpCisJCQkJbmxtc3ZjX2RlbGV0ZV9ibG9jayhibG9jaywgMSk7CisJCX0KKwl9CisJdXAoJmZpbGUtPmZfc2VtYSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBdHRlbXB0IHRvIGVzdGFibGlzaCBhIGxvY2ssIGFuZCBpZiBpdCBjYW4ndCBiZSBncmFudGVkLCBibG9jayBpdAorICogaWYgcmVxdWlyZWQuCisgKi8KK3UzMgorbmxtc3ZjX2xvY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9maWxlICpmaWxlLAorCQkJc3RydWN0IG5sbV9sb2NrICpsb2NrLCBpbnQgd2FpdCwgc3RydWN0IG5sbV9jb29raWUgKmNvb2tpZSkKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrCSpjb25mbG9jazsKKwlzdHJ1Y3QgbmxtX2Jsb2NrCSpibG9jazsKKwlpbnQJCQllcnJvcjsKKworCWRwcmludGsoImxvY2tkOiBubG1zdmNfbG9jayglcy8lbGQsIHR5PSVkLCBwaT0lZCwgJUxkLSVMZCwgYmw9JWQpXG4iLAorCQkJCWZpbGUtPmZfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfaWQsCisJCQkJZmlsZS0+Zl9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8sCisJCQkJbG9jay0+ZmwuZmxfdHlwZSwgbG9jay0+ZmwuZmxfcGlkLAorCQkJCShsb25nIGxvbmcpbG9jay0+ZmwuZmxfc3RhcnQsCisJCQkJKGxvbmcgbG9uZylsb2NrLT5mbC5mbF9lbmQsCisJCQkJd2FpdCk7CisKKworCS8qIEdldCBleGlzdGluZyBibG9jayAoaW4gY2FzZSBjbGllbnQgaXMgYnVzeS13YWl0aW5nKSAqLworCWJsb2NrID0gbmxtc3ZjX2xvb2t1cF9ibG9jayhmaWxlLCBsb2NrLCAwKTsKKworCWxvY2stPmZsLmZsX2ZsYWdzIHw9IEZMX0xPQ0tEOworCithZ2FpbjoKKwkvKiBMb2NrIGZpbGUgYWdhaW5zdCBjb25jdXJyZW50IGFjY2VzcyAqLworCWRvd24oJmZpbGUtPmZfc2VtYSk7CisKKwlpZiAoIShjb25mbG9jayA9IHBvc2l4X3Rlc3RfbG9jayhmaWxlLT5mX2ZpbGUsICZsb2NrLT5mbCkpKSB7CisJCWVycm9yID0gcG9zaXhfbG9ja19maWxlKGZpbGUtPmZfZmlsZSwgJmxvY2stPmZsKTsKKworCQlpZiAoYmxvY2spCisJCQlubG1zdmNfZGVsZXRlX2Jsb2NrKGJsb2NrLCAwKTsKKwkJdXAoJmZpbGUtPmZfc2VtYSk7CisKKwkJZHByaW50aygibG9ja2Q6IHBvc2l4X2xvY2tfZmlsZSByZXR1cm5lZCAlZFxuIiwgLWVycm9yKTsKKwkJc3dpdGNoKC1lcnJvcikgeworCQljYXNlIDA6CisJCQlyZXR1cm4gbmxtX2dyYW50ZWQ7CisJCWNhc2UgRURFQURMSzoKKwkJCXJldHVybiBubG1fZGVhZGxvY2s7CisJCWNhc2UgRUFHQUlOOgorCQkJcmV0dXJuIG5sbV9sY2tfZGVuaWVkOworCQlkZWZhdWx0OgkJCS8qIGluY2x1ZGVzIEVOT0xDSyAqLworCQkJcmV0dXJuIG5sbV9sY2tfZGVuaWVkX25vbG9ja3M7CisJCX0KKwl9CisKKwlpZiAoIXdhaXQpIHsKKwkJdXAoJmZpbGUtPmZfc2VtYSk7CisJCXJldHVybiBubG1fbGNrX2RlbmllZDsKKwl9CisKKwlpZiAocG9zaXhfbG9ja3NfZGVhZGxvY2soJmxvY2stPmZsLCBjb25mbG9jaykpIHsKKwkJdXAoJmZpbGUtPmZfc2VtYSk7CisJCXJldHVybiBubG1fZGVhZGxvY2s7CisJfQorCisJLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIGJsb2NrLCBjcmVhdGUgYW5kIGluaXRpYWxpemUgaXQuIFRoZW4KKwkgKiByZXRyeSBiZWNhdXNlIHdlIG1heSBoYXZlIHNsZXB0IGluIGttYWxsb2MuICovCisJLyogV2UgaGF2ZSB0byByZWxlYXNlIGZfc2VtYSBhcyBubG1zdmNfY3JlYXRlX2Jsb2NrIG1heSB0cnkgdG8KKwkgKiB0byBjbGFpbSBpdCB3aGlsZSBkb2luZyBob3N0IGdhcmJhZ2UgY29sbGVjdGlvbiAqLworCWlmIChibG9jayA9PSBOVUxMKSB7CisJCXVwKCZmaWxlLT5mX3NlbWEpOworCQlkcHJpbnRrKCJsb2NrZDogYmxvY2tpbmcgb24gdGhpcyBsb2NrIChhbGxvY2F0aW5nKS5cbiIpOworCQlpZiAoIShibG9jayA9IG5sbXN2Y19jcmVhdGVfYmxvY2socnFzdHAsIGZpbGUsIGxvY2ssIGNvb2tpZSkpKQorCQkJcmV0dXJuIG5sbV9sY2tfZGVuaWVkX25vbG9ja3M7CisJCWdvdG8gYWdhaW47CisJfQorCisJLyogQXBwZW5kIHRvIGxpc3Qgb2YgYmxvY2tlZCAqLworCW5sbXN2Y19pbnNlcnRfYmxvY2soYmxvY2ssIE5MTV9ORVZFUik7CisKKwlpZiAobGlzdF9lbXB0eSgmYmxvY2stPmJfY2FsbC5hX2FyZ3MubG9jay5mbC5mbF9ibG9jaykpIHsKKwkJLyogTm93IGFkZCBibG9jayB0byBibG9jayBsaXN0IG9mIHRoZSBjb25mbGljdGluZyBsb2NrCisJCSAgIGlmIHdlIGhhdmVuJ3QgZG9uZSBzby4gKi8KKwkJZHByaW50aygibG9ja2Q6IGJsb2NraW5nIG9uIHRoaXMgbG9jay5cbiIpOworCQlwb3NpeF9ibG9ja19sb2NrKGNvbmZsb2NrLCAmYmxvY2stPmJfY2FsbC5hX2FyZ3MubG9jay5mbCk7CisJfQorCisJdXAoJmZpbGUtPmZfc2VtYSk7CisJcmV0dXJuIG5sbV9sY2tfYmxvY2tlZDsKK30KKworLyoKKyAqIFRlc3QgZm9yIHByZXNlbmNlIG9mIGEgY29uZmxpY3RpbmcgbG9jay4KKyAqLwordTMyCitubG1zdmNfdGVzdGxvY2soc3RydWN0IG5sbV9maWxlICpmaWxlLCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2ssCisJCQkJICAgICAgIHN0cnVjdCBubG1fbG9jayAqY29uZmxvY2spCit7CisJc3RydWN0IGZpbGVfbG9jawkqZmw7CisKKwlkcHJpbnRrKCJsb2NrZDogbmxtc3ZjX3Rlc3Rsb2NrKCVzLyVsZCwgdHk9JWQsICVMZC0lTGQpXG4iLAorCQkJCWZpbGUtPmZfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfaWQsCisJCQkJZmlsZS0+Zl9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8sCisJCQkJbG9jay0+ZmwuZmxfdHlwZSwKKwkJCQkobG9uZyBsb25nKWxvY2stPmZsLmZsX3N0YXJ0LAorCQkJCShsb25nIGxvbmcpbG9jay0+ZmwuZmxfZW5kKTsKKworCWlmICgoZmwgPSBwb3NpeF90ZXN0X2xvY2soZmlsZS0+Zl9maWxlLCAmbG9jay0+ZmwpKSAhPSBOVUxMKSB7CisJCWRwcmludGsoImxvY2tkOiBjb25mbGljdGluZyBsb2NrKHR5PSVkLCAlTGQtJUxkKVxuIiwKKwkJCQlmbC0+ZmxfdHlwZSwgKGxvbmcgbG9uZylmbC0+Zmxfc3RhcnQsCisJCQkJKGxvbmcgbG9uZylmbC0+ZmxfZW5kKTsKKwkJY29uZmxvY2stPmNhbGxlciA9ICJzb21laG9zdCI7CS8qIEZJWE1FICovCisJCWNvbmZsb2NrLT5vaC5sZW4gPSAwOwkJLyogZG9uJ3QgcmV0dXJuIE9IIGluZm8gKi8KKwkJY29uZmxvY2stPmZsID0gKmZsOworCQlyZXR1cm4gbmxtX2xja19kZW5pZWQ7CisJfQorCisJcmV0dXJuIG5sbV9ncmFudGVkOworfQorCisvKgorICogUmVtb3ZlIGEgbG9jay4KKyAqIFRoaXMgaW1wbGllcyBhIENBTkNFTCBjYWxsOiBXZSBzZW5kIGEgR1JBTlRfTVNHLCB0aGUgY2xpZW50IHJlcGxpZXMKKyAqIHdpdGggYSBHUkFOVF9SRVMgY2FsbCB3aGljaCBnZXRzIGxvc3QsIGFuZCBjYWxscyBVTkxPQ0sgaW1tZWRpYXRlbHkKKyAqIGFmdGVyd2FyZHMuIEluIHRoaXMgY2FzZSB0aGUgYmxvY2sgd2lsbCBzdGlsbCBiZSB0aGVyZSwgYW5kIGhlbmNlCisgKiBtdXN0IGJlIHJlbW92ZWQuCisgKi8KK3UzMgorbmxtc3ZjX3VubG9jayhzdHJ1Y3QgbmxtX2ZpbGUgKmZpbGUsIHN0cnVjdCBubG1fbG9jayAqbG9jaykKK3sKKwlpbnQJZXJyb3I7CisKKwlkcHJpbnRrKCJsb2NrZDogbmxtc3ZjX3VubG9jayglcy8lbGQsIHBpPSVkLCAlTGQtJUxkKVxuIiwKKwkJCQlmaWxlLT5mX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX2lkLAorCQkJCWZpbGUtPmZfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfaW5vLAorCQkJCWxvY2stPmZsLmZsX3BpZCwKKwkJCQkobG9uZyBsb25nKWxvY2stPmZsLmZsX3N0YXJ0LAorCQkJCShsb25nIGxvbmcpbG9jay0+ZmwuZmxfZW5kKTsKKworCS8qIEZpcnN0LCBjYW5jZWwgYW55IGxvY2sgdGhhdCBtaWdodCBiZSB0aGVyZSAqLworCW5sbXN2Y19jYW5jZWxfYmxvY2tlZChmaWxlLCBsb2NrKTsKKworCWxvY2stPmZsLmZsX3R5cGUgPSBGX1VOTENLOworCWVycm9yID0gcG9zaXhfbG9ja19maWxlKGZpbGUtPmZfZmlsZSwgJmxvY2stPmZsKTsKKworCXJldHVybiAoZXJyb3IgPCAwKT8gbmxtX2xja19kZW5pZWRfbm9sb2NrcyA6IG5sbV9ncmFudGVkOworfQorCisvKgorICogQ2FuY2VsIGEgcHJldmlvdXNseSBibG9ja2VkIHJlcXVlc3QuCisgKgorICogQSBjYW5jZWwgcmVxdWVzdCBhbHdheXMgb3ZlcnJpZGVzIGFueSBncmFudCB0aGF0IG1heSBjdXJyZW50bHkKKyAqIGJlIGluIHByb2dyZXNzLgorICogVGhlIGNhbGxpbmcgcHJvY2VkdXJlIG11c3QgY2hlY2sgd2hldGhlciB0aGUgZmlsZSBjYW4gYmUgY2xvc2VkLgorICovCit1MzIKK25sbXN2Y19jYW5jZWxfYmxvY2tlZChzdHJ1Y3QgbmxtX2ZpbGUgKmZpbGUsIHN0cnVjdCBubG1fbG9jayAqbG9jaykKK3sKKwlzdHJ1Y3QgbmxtX2Jsb2NrCSpibG9jazsKKworCWRwcmludGsoImxvY2tkOiBubG1zdmNfY2FuY2VsKCVzLyVsZCwgcGk9JWQsICVMZC0lTGQpXG4iLAorCQkJCWZpbGUtPmZfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfaWQsCisJCQkJZmlsZS0+Zl9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8sCisJCQkJbG9jay0+ZmwuZmxfcGlkLAorCQkJCShsb25nIGxvbmcpbG9jay0+ZmwuZmxfc3RhcnQsCisJCQkJKGxvbmcgbG9uZylsb2NrLT5mbC5mbF9lbmQpOworCisJZG93bigmZmlsZS0+Zl9zZW1hKTsKKwlpZiAoKGJsb2NrID0gbmxtc3ZjX2xvb2t1cF9ibG9jayhmaWxlLCBsb2NrLCAxKSkgIT0gTlVMTCkKKwkJbmxtc3ZjX2RlbGV0ZV9ibG9jayhibG9jaywgMSk7CisJdXAoJmZpbGUtPmZfc2VtYSk7CisJcmV0dXJuIG5sbV9ncmFudGVkOworfQorCisvKgorICogVW5ibG9jayBhIGJsb2NrZWQgbG9jayByZXF1ZXN0LiBUaGlzIGlzIGEgY2FsbGJhY2sgaW52b2tlZCBmcm9tIHRoZQorICogVkZTIGxheWVyIHdoZW4gYSBsb2NrIG9uIHdoaWNoIHdlIGJsb2NrZWQgaXMgcmVtb3ZlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZ3JhbnQgdGhlIGJsb2NrZWQgbG9jayBpbnN0YW50bHksIGJ1dCByYXRoZXIgbW92ZXMKKyAqIHRoZSBibG9jayB0byB0aGUgaGVhZCBvZiBubG1fYmxvY2tlZCB3aGVyZSBpdCBjYW4gYmUgcGlja2VkIHVwIGJ5IGxvY2tkLgorICovCitzdGF0aWMgdm9pZAorbmxtc3ZjX25vdGlmeV9ibG9ja2VkKHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXN0cnVjdCBubG1fYmxvY2sJKipicCwgKmJsb2NrOworCisJZHByaW50aygibG9ja2Q6IFZGUyB1bmJsb2NrIG5vdGlmaWNhdGlvbiBmb3IgYmxvY2sgJXBcbiIsIGZsKTsKKwlmb3IgKGJwID0gJm5sbV9ibG9ja2VkOyAoYmxvY2sgPSAqYnApICE9IDA7IGJwID0gJmJsb2NrLT5iX25leHQpIHsKKwkJaWYgKG5sbV9jb21wYXJlX2xvY2tzKCZibG9jay0+Yl9jYWxsLmFfYXJncy5sb2NrLmZsLCBmbCkpIHsKKwkJCW5sbXN2Y19pbnNlcnRfYmxvY2soYmxvY2ssIDApOworCQkJc3ZjX3dha2VfdXAoYmxvY2stPmJfZGFlbW9uKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX1dBUk5JTkcgImxvY2tkOiBub3RpZmljYXRpb24gZm9yIHVua25vd24gYmxvY2shXG4iKTsKK30KKworc3RhdGljIGludCBubG1zdmNfc2FtZV9vd25lcihzdHJ1Y3QgZmlsZV9sb2NrICpmbDEsIHN0cnVjdCBmaWxlX2xvY2sgKmZsMikKK3sKKwlyZXR1cm4gZmwxLT5mbF9vd25lciA9PSBmbDItPmZsX293bmVyICYmIGZsMS0+ZmxfcGlkID09IGZsMi0+ZmxfcGlkOworfQorCitzdHJ1Y3QgbG9ja19tYW5hZ2VyX29wZXJhdGlvbnMgbmxtc3ZjX2xvY2tfb3BlcmF0aW9ucyA9IHsKKwkuZmxfY29tcGFyZV9vd25lciA9IG5sbXN2Y19zYW1lX293bmVyLAorCS5mbF9ub3RpZnkgPSBubG1zdmNfbm90aWZ5X2Jsb2NrZWQsCit9OworCisvKgorICogVHJ5IHRvIGNsYWltIGEgbG9jayB0aGF0IHdhcyBwcmV2aW91c2x5IGJsb2NrZWQuCisgKgorICogTm90ZSB0aGF0IHdlIHVzZSBib3RoIHRoZSBSUENfR1JBTlRFRF9NU0cgY2FsbCBfYW5kXyBhbiBhc3luYworICogUlBDIHRocmVhZCB3aGVuIG5vdGlmeWluZyB0aGUgY2xpZW50LiBUaGlzIHNlZW1zIGxpa2Ugb3ZlcmtpbGwuLi4KKyAqIEhlcmUncyB3aHk6CisgKiAgLQl3ZSBkb24ndCB3YW50IHRvIHVzZSBhIHN5bmNocm9ub3VzIFJQQyB0aHJlYWQsIG90aGVyd2lzZQorICoJd2UgbWlnaHQgZmluZCBvdXJzZWx2ZXMgaGFuZ2luZyBvbiBhIGRlYWQgcG9ydG1hcHBlci4KKyAqICAtCVNvbWUgbG9ja2QgaW1wbGVtZW50YXRpb25zIChlLmcuIEhQKSBkb24ndCByZWFjdCB0bworICoJUlBDX0dSQU5URUQgY2FsbHM7IHRoZXkgc2VlbSB0byBpbnNpc3Qgb24gUlBDX0dSQU5URURfTVNHIGNhbGxzLgorICovCitzdGF0aWMgdm9pZAorbmxtc3ZjX2dyYW50X2Jsb2NrZWQoc3RydWN0IG5sbV9ibG9jayAqYmxvY2spCit7CisJc3RydWN0IG5sbV9maWxlCQkqZmlsZSA9IGJsb2NrLT5iX2ZpbGU7CisJc3RydWN0IG5sbV9sb2NrCQkqbG9jayA9ICZibG9jay0+Yl9jYWxsLmFfYXJncy5sb2NrOworCXN0cnVjdCBmaWxlX2xvY2sJKmNvbmZsb2NrOworCWludAkJCWVycm9yOworCisJZHByaW50aygibG9ja2Q6IGdyYW50IGJsb2NrZWQgbG9jayAlcFxuIiwgYmxvY2spOworCisJLyogRmlyc3QgdGhpbmcgaXMgbG9jayB0aGUgZmlsZSAqLworCWRvd24oJmZpbGUtPmZfc2VtYSk7CisKKwkvKiBVbmxpbmsgYmxvY2sgcmVxdWVzdCBmcm9tIGxpc3QgKi8KKwlubG1zdmNfcmVtb3ZlX2Jsb2NrKGJsb2NrKTsKKworCS8qIElmIGJfZ3JhbnRlZCBpcyB0cnVlIHRoaXMgbWVhbnMgd2UndmUgYmVlbiBoZXJlIGJlZm9yZS4KKwkgKiBKdXN0IHJldHJ5IHRoZSBncmFudCBjYWxsYmFjaywgcG9zc2libHkgcmVmcmVzaGluZyB0aGUgUlBDCisJICogYmluZGluZyAqLworCWlmIChibG9jay0+Yl9ncmFudGVkKSB7CisJCW5sbV9yZWJpbmRfaG9zdChibG9jay0+Yl9ob3N0KTsKKwkJZ290byBjYWxsYmFjazsKKwl9CisKKwkvKiBUcnkgdGhlIGxvY2sgb3BlcmF0aW9uIGFnYWluICovCisJaWYgKChjb25mbG9jayA9IHBvc2l4X3Rlc3RfbG9jayhmaWxlLT5mX2ZpbGUsICZsb2NrLT5mbCkpICE9IE5VTEwpIHsKKwkJLyogQnVtbWVyLCB3ZSBibG9ja2VkIGFnYWluICovCisJCWRwcmludGsoImxvY2tkOiBsb2NrIHN0aWxsIGJsb2NrZWRcbiIpOworCQlubG1zdmNfaW5zZXJ0X2Jsb2NrKGJsb2NrLCBOTE1fTkVWRVIpOworCQlwb3NpeF9ibG9ja19sb2NrKGNvbmZsb2NrLCAmbG9jay0+ZmwpOworCQl1cCgmZmlsZS0+Zl9zZW1hKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEFscmlnaHQsIG5vIGNvbmZsaWN0aW5nIGxvY2suIE5vdyBsb2NrIGl0IGZvciByZWFsLiBJZiB0aGUKKwkgKiBmb2xsb3dpbmcgeWllbGRzIGFuIGVycm9yLCB0aGlzIGlzIG1vc3QgcHJvYmFibHkgZHVlIHRvIGxvdworCSAqIG1lbW9yeS4gUmV0cnkgdGhlIGxvY2sgaW4gYSBmZXcgc2Vjb25kcy4KKwkgKi8KKwlpZiAoKGVycm9yID0gcG9zaXhfbG9ja19maWxlKGZpbGUtPmZfZmlsZSwgJmxvY2stPmZsKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImxvY2tkOiB1bmV4cGVjdGVkIGVycm9yICVkIGluICVzIVxuIiwKKwkJCQktZXJyb3IsIF9fRlVOQ1RJT05fXyk7CisJCW5sbXN2Y19pbnNlcnRfYmxvY2soYmxvY2ssIDEwICogSFopOworCQl1cCgmZmlsZS0+Zl9zZW1hKTsKKwkJcmV0dXJuOworCX0KKworY2FsbGJhY2s6CisJLyogTG9jayB3YXMgZ3JhbnRlZCBieSBWRlMuICovCisJZHByaW50aygibG9ja2Q6IEdSQU5UaW5nIGJsb2NrZWQgbG9jay5cbiIpOworCWJsb2NrLT5iX2dyYW50ZWQgPSAxOworCWJsb2NrLT5iX2luY2FsbCAgPSAxOworCisJLyogU2NoZWR1bGUgbmV4dCBncmFudCBjYWxsYmFjayBpbiAzMCBzZWNvbmRzICovCisJbmxtc3ZjX2luc2VydF9ibG9jayhibG9jaywgMzAgKiBIWik7CisKKwkvKiBDYWxsIHRoZSBjbGllbnQgKi8KKwlubG1fZ2V0X2hvc3QoYmxvY2stPmJfY2FsbC5hX2hvc3QpOworCWlmIChubG1zdmNfYXN5bmNfY2FsbCgmYmxvY2stPmJfY2FsbCwgTkxNUFJPQ19HUkFOVEVEX01TRywKKwkJCQkJCW5sbXN2Y19ncmFudF9jYWxsYmFjaykgPCAwKQorCQlubG1fcmVsZWFzZV9ob3N0KGJsb2NrLT5iX2NhbGwuYV9ob3N0KTsKKwl1cCgmZmlsZS0+Zl9zZW1hKTsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZyb20gdGhlIFJQQyBsYXllciB3aGVuIHRoZSBOTE1fR1JBTlRFRF9NU0cKKyAqIFJQQyBjYWxsIGhhcyBzdWNjZWVkZWQgb3IgdGltZWQgb3V0LgorICogTGlrZSBhbGwgUlBDIGNhbGxiYWNrcywgaXQgaXMgaW52b2tlZCBieSB0aGUgcnBjaW9kIHByb2Nlc3MsIHNvIGl0CisgKiBiZXR0ZXIgbm90IHNsZWVwLiBUaGVyZWZvcmUsIHdlIHB1dCB0aGUgYmxvY2tlZCBsb2NrIG9uIHRoZSBubG1fYmxvY2tlZAorICogY2hhaW4gb25jZSBtb3JlIGluIG9yZGVyIHRvIGhhdmUgaXQgcmVtb3ZlZCBieSBsb2NrZCBpdHNlbGYgKHdoaWNoIGNhbgorICogdGhlbiBzbGVlcCBvbiB0aGUgZmlsZSBzZW1hcGhvcmUgd2l0aG91dCBkaXNydXB0aW5nIGUuZy4gdGhlIG5mcyBjbGllbnQpLgorICovCitzdGF0aWMgdm9pZAorbmxtc3ZjX2dyYW50X2NhbGxiYWNrKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgbmxtX3Jxc3QJCSpjYWxsID0gKHN0cnVjdCBubG1fcnFzdCAqKSB0YXNrLT50a19jYWxsZGF0YTsKKwlzdHJ1Y3QgbmxtX2Jsb2NrCSpibG9jazsKKwl1bnNpZ25lZCBsb25nCQl0aW1lb3V0OworCXN0cnVjdCBzb2NrYWRkcl9pbgkqcGVlcl9hZGRyID0gUlBDX1BFRVJBRERSKHRhc2stPnRrX2NsaWVudCk7CisKKwlkcHJpbnRrKCJsb2NrZDogR1JBTlRfTVNHIFJQQyBjYWxsYmFja1xuIik7CisJZHByaW50aygiY2FsbGJhY2s6IGxvb2tpbmcgZm9yIGNvb2tpZSAlcywgaG9zdCAoJXUuJXUuJXUuJXUpXG4iLAorCQlubG1kYmdfY29va2llMmEoJmNhbGwtPmFfYXJncy5jb29raWUpLAorCQlOSVBRVUFEKHBlZXJfYWRkci0+c2luX2FkZHIuc19hZGRyKSk7CisJaWYgKCEoYmxvY2sgPSBubG1zdmNfZmluZF9ibG9jaygmY2FsbC0+YV9hcmdzLmNvb2tpZSwgcGVlcl9hZGRyKSkpIHsKKwkJZHByaW50aygibG9ja2Q6IG5vIGJsb2NrIGZvciBjb29raWUgJXMsIGhvc3QgKCV1LiV1LiV1LiV1KVxuIiwKKwkJCW5sbWRiZ19jb29raWUyYSgmY2FsbC0+YV9hcmdzLmNvb2tpZSksCisJCQlOSVBRVUFEKHBlZXJfYWRkci0+c2luX2FkZHIuc19hZGRyKSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBUZWNobmljYWxseSwgd2Ugc2hvdWxkIGRvd24gdGhlIGZpbGUgc2VtYXBob3JlIGhlcmUuIFNpbmNlIHdlCisJICogbW92ZSB0aGUgYmxvY2sgdG93YXJkcyB0aGUgaGVhZCBvZiB0aGUgcXVldWUgb25seSwgbm8gaGFybQorCSAqIGNhbiBiZSBkb25lLCB0aG91Z2guICovCisJaWYgKHRhc2stPnRrX3N0YXR1cyA8IDApIHsKKwkJLyogUlBDIGVycm9yOiBSZS1pbnNlcnQgZm9yIHJldHJhbnNtaXNzaW9uICovCisJCXRpbWVvdXQgPSAxMCAqIEhaOworCX0gZWxzZSBpZiAoYmxvY2stPmJfZG9uZSkgeworCQkvKiBCbG9jayBhbHJlYWR5IHJlbW92ZWQsIGtpbGwgaXQgZm9yIHJlYWwgKi8KKwkJdGltZW91dCA9IDA7CisJfSBlbHNlIHsKKwkJLyogQ2FsbCB3YXMgc3VjY2Vzc2Z1bCwgbm93IHdhaXQgZm9yIGNsaWVudCBjYWxsYmFjayAqLworCQl0aW1lb3V0ID0gNjAgKiBIWjsKKwl9CisJbmxtc3ZjX2luc2VydF9ibG9jayhibG9jaywgdGltZW91dCk7CisJc3ZjX3dha2VfdXAoYmxvY2stPmJfZGFlbW9uKTsKKwlibG9jay0+Yl9pbmNhbGwgPSAwOworCisJbmxtX3JlbGVhc2VfaG9zdChjYWxsLT5hX2hvc3QpOworfQorCisvKgorICogV2UgcmVjZWl2ZWQgYSBHUkFOVF9SRVMgY2FsbGJhY2suIFRyeSB0byBmaW5kIHRoZSBjb3JyZXNwb25kaW5nCisgKiBibG9jay4KKyAqLwordm9pZAorbmxtc3ZjX2dyYW50X3JlcGx5KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fY29va2llICpjb29raWUsIHUzMiBzdGF0dXMpCit7CisJc3RydWN0IG5sbV9ibG9jawkqYmxvY2s7CisJc3RydWN0IG5sbV9maWxlCQkqZmlsZTsKKworCWRwcmludGsoImdyYW50X3JlcGx5OiBsb29raW5nIGZvciBjb29raWUgJXgsIGhvc3QgKCUwOHgpLCBzPSVkIFxuIiwgCisJCSoodW5zaWduZWQgaW50ICopKGNvb2tpZS0+ZGF0YSksIAorCQludG9obChycXN0cC0+cnFfYWRkci5zaW5fYWRkci5zX2FkZHIpLCBzdGF0dXMpOworCWlmICghKGJsb2NrID0gbmxtc3ZjX2ZpbmRfYmxvY2soY29va2llLCAmcnFzdHAtPnJxX2FkZHIpKSkKKwkJcmV0dXJuOworCWZpbGUgPSBibG9jay0+Yl9maWxlOworCisJZmlsZS0+Zl9jb3VudCsrOworCWRvd24oJmZpbGUtPmZfc2VtYSk7CisJaWYgKChibG9jayA9IG5sbXN2Y19maW5kX2Jsb2NrKGNvb2tpZSwmcnFzdHAtPnJxX2FkZHIpKSAhPSBOVUxMKSB7CisJCWlmIChzdGF0dXMgPT0gTkxNX0xDS19ERU5JRURfR1JBQ0VfUEVSSU9EKSB7CisJCQkvKiBUcnkgYWdhaW4gaW4gYSBjb3VwbGUgb2Ygc2Vjb25kcyAqLworCQkJbmxtc3ZjX2luc2VydF9ibG9jayhibG9jaywgMTAgKiBIWik7CisJCQlibG9jayA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQkvKiBMb2NrIGlzIG5vdyBoZWxkIGJ5IGNsaWVudCwgb3IgaGFzIGJlZW4gcmVqZWN0ZWQuCisJCQkgKiBJbiBib3RoIGNhc2VzLCB0aGUgYmxvY2sgc2hvdWxkIGJlIHJlbW92ZWQuICovCisJCQl1cCgmZmlsZS0+Zl9zZW1hKTsKKwkJCWlmIChzdGF0dXMgPT0gTkxNX0xDS19HUkFOVEVEKQorCQkJCW5sbXN2Y19kZWxldGVfYmxvY2soYmxvY2ssIDApOworCQkJZWxzZQorCQkJCW5sbXN2Y19kZWxldGVfYmxvY2soYmxvY2ssIDEpOworCQl9CisJfQorCWlmICghYmxvY2spCisJCXVwKCZmaWxlLT5mX3NlbWEpOworCW5sbV9yZWxlYXNlX2ZpbGUoZmlsZSk7Cit9CisKKy8qCisgKiBSZXRyeSBhbGwgYmxvY2tlZCBsb2NrcyB0aGF0IGhhdmUgYmVlbiBub3RpZmllZC4gVGhpcyBpcyB3aGVyZSBsb2NrZAorICogcGlja3MgdXAgbG9ja3MgdGhhdCBjYW4gYmUgZ3JhbnRlZCwgb3IgZ3JhbnQgbm90aWZpY2F0aW9ucyB0aGF0IG11c3QKKyAqIGJlIHJldHJhbnNtaXR0ZWQuCisgKi8KK3Vuc2lnbmVkIGxvbmcKK25sbXN2Y19yZXRyeV9ibG9ja2VkKHZvaWQpCit7CisJc3RydWN0IG5sbV9ibG9jawkqYmxvY2s7CisKKwlkcHJpbnRrKCJubG1zdmNfcmV0cnlfYmxvY2tlZCglcCwgd2hlbj0lbGQpXG4iLAorCQkJbmxtX2Jsb2NrZWQsCisJCQlubG1fYmxvY2tlZD8gbmxtX2Jsb2NrZWQtPmJfd2hlbiA6IDApOworCXdoaWxlICgoYmxvY2sgPSBubG1fYmxvY2tlZCkgIT0gMCkgeworCQlpZiAoYmxvY2stPmJfd2hlbiA9PSBOTE1fTkVWRVIpCisJCQlicmVhazsKKwkgICAgICAgIGlmICh0aW1lX2FmdGVyKGJsb2NrLT5iX3doZW4samlmZmllcykpCisJCQlicmVhazsKKwkJZHByaW50aygibmxtc3ZjX3JldHJ5X2Jsb2NrZWQoJXAsIHdoZW49JWxkLCBkb25lPSVkKVxuIiwKKwkJCWJsb2NrLCBibG9jay0+Yl93aGVuLCBibG9jay0+Yl9kb25lKTsKKwkJaWYgKGJsb2NrLT5iX2RvbmUpCisJCQlubG1zdmNfZGVsZXRlX2Jsb2NrKGJsb2NrLCAwKTsKKwkJZWxzZQorCQkJbmxtc3ZjX2dyYW50X2Jsb2NrZWQoYmxvY2spOworCX0KKworCWlmICgoYmxvY2sgPSBubG1fYmxvY2tlZCkgJiYgYmxvY2stPmJfd2hlbiAhPSBOTE1fTkVWRVIpCisJCXJldHVybiAoYmxvY2stPmJfd2hlbiAtIGppZmZpZXMpOworCisJcmV0dXJuIE1BWF9TQ0hFRFVMRV9USU1FT1VUOworfQpkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3ZjcHJvYy5jIGIvZnMvbG9ja2Qvc3ZjcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1N2UzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9sb2NrZC9zdmNwcm9jLmMKQEAgLTAsMCArMSw2MDYgQEAKKy8qCisgKiBsaW51eC9mcy9sb2NrZC9zdmNwcm9jLmMKKyAqCisgKiBMb2NrZCBzZXJ2ZXIgcHJvY2VkdXJlcy4gV2UgZG9uJ3QgaW1wbGVtZW50IHRoZSBOTE1fKl9SRVMgCisgKiBwcm9jZWR1cmVzIGJlY2F1c2Ugd2UgZG9uJ3QgdXNlIHRoZSBhc3luYyBwcm9jZWR1cmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2Qvc2hhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9zbV9pbnRlci5oPgorCisKKyNkZWZpbmUgTkxNREJHX0ZBQ0lMSVRZCQlOTE1EQkdfQ0xJRU5UCisKK3N0YXRpYyB1MzIJbmxtc3ZjX2NhbGxiYWNrKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIsIHN0cnVjdCBubG1fcmVzICopOworc3RhdGljIHZvaWQJbmxtc3ZjX2NhbGxiYWNrX2V4aXQoc3RydWN0IHJwY190YXNrICopOworCisjaWZkZWYgQ09ORklHX0xPQ0tEX1Y0CitzdGF0aWMgdTMyCitjYXN0X3RvX25sbSh1MzIgc3RhdHVzLCB1MzIgdmVycykKK3sKKwkvKiBOb3RlOiBzdGF0dXMgaXMgYXNzdW1lZCB0byBiZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgISEhICovCisJaWYgKHZlcnMgIT0gNCl7CisJCXN3aXRjaCAoc3RhdHVzKSB7CisJCWNhc2UgbmxtX2dyYW50ZWQ6CisJCWNhc2UgbmxtX2xja19kZW5pZWQ6CisJCWNhc2UgbmxtX2xja19kZW5pZWRfbm9sb2NrczoKKwkJY2FzZSBubG1fbGNrX2Jsb2NrZWQ6CisJCWNhc2UgbmxtX2xja19kZW5pZWRfZ3JhY2VfcGVyaW9kOgorCQkJYnJlYWs7CisJCWNhc2UgbmxtNF9kZWFkbG9jazoKKwkJCXN0YXR1cyA9IG5sbV9sY2tfZGVuaWVkOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzdGF0dXMgPSBubG1fbGNrX2RlbmllZF9ub2xvY2tzOworCQl9CisJfQorCisJcmV0dXJuIChzdGF0dXMpOworfQorI2RlZmluZQljYXN0X3N0YXR1cyhzdGF0dXMpIChjYXN0X3RvX25sbShzdGF0dXMsIHJxc3RwLT5ycV92ZXJzKSkKKyNlbHNlCisjZGVmaW5lIGNhc3Rfc3RhdHVzKHN0YXR1cykgKHN0YXR1cykKKyNlbmRpZgorCisvKgorICogT2J0YWluIGNsaWVudCBhbmQgZmlsZSBmcm9tIGFyZ3VtZW50cworICovCitzdGF0aWMgdTMyCitubG1zdmNfcmV0cmlldmVfYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCQlzdHJ1Y3QgbmxtX2hvc3QgKipob3N0cCwgc3RydWN0IG5sbV9maWxlICoqZmlscCkKK3sKKwlzdHJ1Y3QgbmxtX2hvc3QJCSpob3N0ID0gTlVMTDsKKwlzdHJ1Y3QgbmxtX2ZpbGUJCSpmaWxlID0gTlVMTDsKKwlzdHJ1Y3QgbmxtX2xvY2sJCSpsb2NrID0gJmFyZ3AtPmxvY2s7CisJdTMyCQkJZXJyb3I7CisKKwkvKiBuZnNkIGNhbGxiYWNrcyBtdXN0IGhhdmUgYmVlbiBpbnN0YWxsZWQgZm9yIHRoaXMgcHJvY2VkdXJlICovCisJaWYgKCFubG1zdmNfb3BzKQorCQlyZXR1cm4gbmxtX2xja19kZW5pZWRfbm9sb2NrczsKKworCS8qIE9idGFpbiBob3N0IGhhbmRsZSAqLworCWlmICghKGhvc3QgPSBubG1zdmNfbG9va3VwX2hvc3QocnFzdHApKQorCSB8fCAoYXJncC0+bW9uaXRvciAmJiAhaG9zdC0+aF9tb25pdG9yZWQgJiYgbnNtX21vbml0b3IoaG9zdCkgPCAwKSkKKwkJZ290byBub19sb2NrczsKKwkqaG9zdHAgPSBob3N0OworCisJLyogT2J0YWluIGZpbGUgcG9pbnRlci4gTm90IHVzZWQgYnkgRlJFRV9BTEwgY2FsbC4gKi8KKwlpZiAoZmlscCAhPSBOVUxMKSB7CisJCWlmICgoZXJyb3IgPSBubG1fbG9va3VwX2ZpbGUocnFzdHAsICZmaWxlLCAmbG9jay0+ZmgpKSAhPSAwKQorCQkJZ290byBub19sb2NrczsKKwkJKmZpbHAgPSBmaWxlOworCisJCS8qIFNldCB1cCB0aGUgbWlzc2luZyBwYXJ0cyBvZiB0aGUgZmlsZV9sb2NrIHN0cnVjdHVyZSAqLworCQlsb2NrLT5mbC5mbF9maWxlICA9IGZpbGUtPmZfZmlsZTsKKwkJbG9jay0+ZmwuZmxfb3duZXIgPSAoZmxfb3duZXJfdCkgaG9zdDsKKwkJbG9jay0+ZmwuZmxfbG1vcHMgPSAmbmxtc3ZjX2xvY2tfb3BlcmF0aW9uczsKKwl9CisKKwlyZXR1cm4gMDsKKworbm9fbG9ja3M6CisJaWYgKGhvc3QpCisJCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJcmV0dXJuIG5sbV9sY2tfZGVuaWVkX25vbG9ja3M7Cit9CisKKy8qCisgKiBOVUxMOiBUZXN0IGZvciBwcmVzZW5jZSBvZiBzZXJ2aWNlCisgKi8KK3N0YXRpYyBpbnQKK25sbXN2Y19wcm9jX251bGwoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdm9pZCAqYXJncCwgdm9pZCAqcmVzcCkKK3sKKwlkcHJpbnRrKCJsb2NrZDogTlVMTCAgICAgICAgICBjYWxsZWRcbiIpOworCXJldHVybiBycGNfc3VjY2VzczsKK30KKworLyoKKyAqIFRFU1Q6IENoZWNrIGZvciBjb25mbGljdGluZyBsb2NrCisgKi8KK3N0YXRpYyBpbnQKK25sbXN2Y19wcm9jX3Rlc3Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJCSAgICAgICAgIHN0cnVjdCBubG1fcmVzICAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3Q7CisJc3RydWN0IG5sbV9maWxlCSpmaWxlOworCisJZHByaW50aygibG9ja2Q6IFRFU1QgICAgICAgICAgY2FsbGVkXG4iKTsKKwlyZXNwLT5jb29raWUgPSBhcmdwLT5jb29raWU7CisKKwkvKiBEb24ndCBhY2NlcHQgdGVzdCByZXF1ZXN0cyBkdXJpbmcgZ3JhY2UgcGVyaW9kICovCisJaWYgKG5sbXN2Y19ncmFjZV9wZXJpb2QpIHsKKwkJcmVzcC0+c3RhdHVzID0gbmxtX2xja19kZW5pZWRfZ3JhY2VfcGVyaW9kOworCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisJfQorCisJLyogT2J0YWluIGNsaWVudCBhbmQgZmlsZSAqLworCWlmICgocmVzcC0+c3RhdHVzID0gbmxtc3ZjX3JldHJpZXZlX2FyZ3MocnFzdHAsIGFyZ3AsICZob3N0LCAmZmlsZSkpKQorCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisKKwkvKiBOb3cgY2hlY2sgZm9yIGNvbmZsaWN0aW5nIGxvY2tzICovCisJcmVzcC0+c3RhdHVzID0gY2FzdF9zdGF0dXMobmxtc3ZjX3Rlc3Rsb2NrKGZpbGUsICZhcmdwLT5sb2NrLCAmcmVzcC0+bG9jaykpOworCisJZHByaW50aygibG9ja2Q6IFRFU1QgICAgICAgICAgc3RhdHVzICVkIHZlcnMgJWRcbiIsCisJCW50b2hsKHJlc3AtPnN0YXR1cyksIHJxc3RwLT5ycV92ZXJzKTsKKwlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbV9yZWxlYXNlX2ZpbGUoZmlsZSk7CisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCitzdGF0aWMgaW50CitubG1zdmNfcHJvY19sb2NrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKKwkJCQkgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCit7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0OworCXN0cnVjdCBubG1fZmlsZQkqZmlsZTsKKworCWRwcmludGsoImxvY2tkOiBMT0NLICAgICAgICAgIGNhbGxlZFxuIik7CisKKwlyZXNwLT5jb29raWUgPSBhcmdwLT5jb29raWU7CisKKwkvKiBEb24ndCBhY2NlcHQgbmV3IGxvY2sgcmVxdWVzdHMgZHVyaW5nIGdyYWNlIHBlcmlvZCAqLworCWlmIChubG1zdmNfZ3JhY2VfcGVyaW9kICYmICFhcmdwLT5yZWNsYWltKSB7CisJCXJlc3AtPnN0YXR1cyA9IG5sbV9sY2tfZGVuaWVkX2dyYWNlX3BlcmlvZDsKKwkJcmV0dXJuIHJwY19zdWNjZXNzOworCX0KKworCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KKwlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbXN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgJmZpbGUpKSkKKwkJcmV0dXJuIHJwY19zdWNjZXNzOworCisjaWYgMAorCS8qIElmIHN1cHBsaWVkIHN0YXRlIGRvZXNuJ3QgbWF0Y2ggY3VycmVudCBzdGF0ZSwgd2UgYXNzdW1lIGl0J3MKKwkgKiBhbiBvbGQgcmVxdWVzdCB0aGF0IHRpbWUtd2FycGVkIHNvbWVob3cuIEFueSBlcnJvciByZXR1cm4gd291bGQKKwkgKiBkbyBpbiB0aGlzIGNhc2UgYmVjYXVzZSBpdCdzIGlycmVsZXZhbnQgYW55d2F5LgorCSAqCisJICogTkI6IFdlIGRvbid0IHJldHJpZXZlIHRoZSByZW1vdGUgaG9zdCdzIHN0YXRlIHlldC4KKwkgKi8KKwlpZiAoaG9zdC0+aF9uc21zdGF0ZSAmJiBob3N0LT5oX25zbXN0YXRlICE9IGFyZ3AtPnN0YXRlKSB7CisJCXJlc3AtPnN0YXR1cyA9IG5sbV9sY2tfZGVuaWVkX25vbG9ja3M7CisJfSBlbHNlCisjZW5kaWYKKworCS8qIE5vdyB0cnkgdG8gbG9jayB0aGUgZmlsZSAqLworCXJlc3AtPnN0YXR1cyA9IGNhc3Rfc3RhdHVzKG5sbXN2Y19sb2NrKHJxc3RwLCBmaWxlLCAmYXJncC0+bG9jaywKKwkJCQkJICAgICAgIGFyZ3AtPmJsb2NrLCAmYXJncC0+Y29va2llKSk7CisKKwlkcHJpbnRrKCJsb2NrZDogTE9DSyAgICAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOworCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKKwlyZXR1cm4gcnBjX3N1Y2Nlc3M7Cit9CisKK3N0YXRpYyBpbnQKK25sbXN2Y19wcm9jX2NhbmNlbChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCQkJICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCit7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0OworCXN0cnVjdCBubG1fZmlsZQkqZmlsZTsKKworCWRwcmludGsoImxvY2tkOiBDQU5DRUwgICAgICAgIGNhbGxlZFxuIik7CisKKwlyZXNwLT5jb29raWUgPSBhcmdwLT5jb29raWU7CisKKwkvKiBEb24ndCBhY2NlcHQgcmVxdWVzdHMgZHVyaW5nIGdyYWNlIHBlcmlvZCAqLworCWlmIChubG1zdmNfZ3JhY2VfcGVyaW9kKSB7CisJCXJlc3AtPnN0YXR1cyA9IG5sbV9sY2tfZGVuaWVkX2dyYWNlX3BlcmlvZDsKKwkJcmV0dXJuIHJwY19zdWNjZXNzOworCX0KKworCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KKwlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbXN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgJmZpbGUpKSkKKwkJcmV0dXJuIHJwY19zdWNjZXNzOworCisJLyogVHJ5IHRvIGNhbmNlbCByZXF1ZXN0LiAqLworCXJlc3AtPnN0YXR1cyA9IGNhc3Rfc3RhdHVzKG5sbXN2Y19jYW5jZWxfYmxvY2tlZChmaWxlLCAmYXJncC0+bG9jaykpOworCisJZHByaW50aygibG9ja2Q6IENBTkNFTCAgICAgICAgc3RhdHVzICVkXG4iLCBudG9obChyZXNwLT5zdGF0dXMpKTsKKwlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbV9yZWxlYXNlX2ZpbGUoZmlsZSk7CisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCisvKgorICogVU5MT0NLOiByZWxlYXNlIGEgbG9jaworICovCitzdGF0aWMgaW50CitubG1zdmNfcHJvY191bmxvY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJCSAgICAgICAgICAgc3RydWN0IG5sbV9yZXMgICpyZXNwKQoreworCXN0cnVjdCBubG1faG9zdAkqaG9zdDsKKwlzdHJ1Y3QgbmxtX2ZpbGUJKmZpbGU7CisKKwlkcHJpbnRrKCJsb2NrZDogVU5MT0NLICAgICAgICBjYWxsZWRcbiIpOworCisJcmVzcC0+Y29va2llID0gYXJncC0+Y29va2llOworCisJLyogRG9uJ3QgYWNjZXB0IG5ldyBsb2NrIHJlcXVlc3RzIGR1cmluZyBncmFjZSBwZXJpb2QgKi8KKwlpZiAobmxtc3ZjX2dyYWNlX3BlcmlvZCkgeworCQlyZXNwLT5zdGF0dXMgPSBubG1fbGNrX2RlbmllZF9ncmFjZV9wZXJpb2Q7CisJCXJldHVybiBycGNfc3VjY2VzczsKKwl9CisKKwkvKiBPYnRhaW4gY2xpZW50IGFuZCBmaWxlICovCisJaWYgKChyZXNwLT5zdGF0dXMgPSBubG1zdmNfcmV0cmlldmVfYXJncyhycXN0cCwgYXJncCwgJmhvc3QsICZmaWxlKSkpCisJCXJldHVybiBycGNfc3VjY2VzczsKKworCS8qIE5vdyB0cnkgdG8gcmVtb3ZlIHRoZSBsb2NrICovCisJcmVzcC0+c3RhdHVzID0gY2FzdF9zdGF0dXMobmxtc3ZjX3VubG9jayhmaWxlLCAmYXJncC0+bG9jaykpOworCisJZHByaW50aygibG9ja2Q6IFVOTE9DSyAgICAgICAgc3RhdHVzICVkXG4iLCBudG9obChyZXNwLT5zdGF0dXMpKTsKKwlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbV9yZWxlYXNlX2ZpbGUoZmlsZSk7CisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCisvKgorICogR1JBTlRFRDogQSBzZXJ2ZXIgY2FsbHMgdXMgdG8gdGVsbCB0aGF0IGEgcHJvY2VzcycgbG9jayByZXF1ZXN0CisgKiB3YXMgZ3JhbnRlZAorICovCitzdGF0aWMgaW50CitubG1zdmNfcHJvY19ncmFudGVkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKKwkJCQkgICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCit7CisJcmVzcC0+Y29va2llID0gYXJncC0+Y29va2llOworCisJZHByaW50aygibG9ja2Q6IEdSQU5URUQgICAgICAgY2FsbGVkXG4iKTsKKwlyZXNwLT5zdGF0dXMgPSBubG1jbG50X2dyYW50KCZhcmdwLT5sb2NrKTsKKwlkcHJpbnRrKCJsb2NrZDogR1JBTlRFRCAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOworCXJldHVybiBycGNfc3VjY2VzczsKK30KKworLyoKKyAqIGBBc3luYycgdmVyc2lvbnMgb2YgdGhlIGFib3ZlIHNlcnZpY2Ugcm91dGluZXMuIFRoZXkgYXJlbid0IHJlYWxseSwKKyAqIGJlY2F1c2Ugd2Ugc2VuZCB0aGUgY2FsbGJhY2sgYmVmb3JlIHRoZSByZXBseSBwcm9wZXIuIEkgaG9wZSB0aGlzCisgKiBkb2Vzbid0IGJyZWFrIGFueSBjbGllbnRzLgorICovCitzdGF0aWMgaW50CitubG1zdmNfcHJvY190ZXN0X21zZyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCQkJCSAgICAgdm9pZAkgICAgICpyZXNwKQoreworCXN0cnVjdCBubG1fcmVzCXJlczsKKwl1MzIJCXN0YXQ7CisKKwlkcHJpbnRrKCJsb2NrZDogVEVTVF9NU0cgICAgICBjYWxsZWRcbiIpOworCW1lbXNldCgmcmVzLCAwLCBzaXplb2YocmVzKSk7CisKKwlpZiAoKHN0YXQgPSBubG1zdmNfcHJvY190ZXN0KHJxc3RwLCBhcmdwLCAmcmVzKSkgPT0gMCkKKwkJc3RhdCA9IG5sbXN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19URVNUX1JFUywgJnJlcyk7CisJcmV0dXJuIHN0YXQ7Cit9CisKK3N0YXRpYyBpbnQKK25sbXN2Y19wcm9jX2xvY2tfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKKwkJCQkJICAgICB2b2lkCSAgICAgKnJlc3ApCit7CisJc3RydWN0IG5sbV9yZXMJcmVzOworCXUzMgkJc3RhdDsKKworCWRwcmludGsoImxvY2tkOiBMT0NLX01TRyAgICAgIGNhbGxlZFxuIik7CisJbWVtc2V0KCZyZXMsIDAsIHNpemVvZihyZXMpKTsKKworCWlmICgoc3RhdCA9IG5sbXN2Y19wcm9jX2xvY2socnFzdHAsIGFyZ3AsICZyZXMpKSA9PSAwKQorCQlzdGF0ID0gbmxtc3ZjX2NhbGxiYWNrKHJxc3RwLCBOTE1QUk9DX0xPQ0tfUkVTLCAmcmVzKTsKKwlyZXR1cm4gc3RhdDsKK30KKworc3RhdGljIGludAorbmxtc3ZjX3Byb2NfY2FuY2VsX21zZyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCQkJCSAgICAgICB2b2lkCSAgICAgICAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX3JlcwlyZXM7CisJdTMyCQlzdGF0OworCisJZHByaW50aygibG9ja2Q6IENBTkNFTF9NU0cgICAgY2FsbGVkXG4iKTsKKwltZW1zZXQoJnJlcywgMCwgc2l6ZW9mKHJlcykpOworCisJaWYgKChzdGF0ID0gbmxtc3ZjX3Byb2NfY2FuY2VsKHJxc3RwLCBhcmdwLCAmcmVzKSkgPT0gMCkKKwkJc3RhdCA9IG5sbXN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19DQU5DRUxfUkVTLCAmcmVzKTsKKwlyZXR1cm4gc3RhdDsKK30KKworc3RhdGljIGludAorbmxtc3ZjX3Byb2NfdW5sb2NrX21zZyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX3JlcwlyZXM7CisJdTMyCQlzdGF0OworCisJZHByaW50aygibG9ja2Q6IFVOTE9DS19NU0cgICAgY2FsbGVkXG4iKTsKKwltZW1zZXQoJnJlcywgMCwgc2l6ZW9mKHJlcykpOworCisJaWYgKChzdGF0ID0gbmxtc3ZjX3Byb2NfdW5sb2NrKHJxc3RwLCBhcmdwLCAmcmVzKSkgPT0gMCkKKwkJc3RhdCA9IG5sbXN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19VTkxPQ0tfUkVTLCAmcmVzKTsKKwlyZXR1cm4gc3RhdDsKK30KKworc3RhdGljIGludAorbmxtc3ZjX3Byb2NfZ3JhbnRlZF9tc2coc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICpyZXNwKQoreworCXN0cnVjdCBubG1fcmVzCXJlczsKKwl1MzIJCXN0YXQ7CisKKwlkcHJpbnRrKCJsb2NrZDogR1JBTlRFRF9NU0cgICBjYWxsZWRcbiIpOworCW1lbXNldCgmcmVzLCAwLCBzaXplb2YocmVzKSk7CisKKwlpZiAoKHN0YXQgPSBubG1zdmNfcHJvY19ncmFudGVkKHJxc3RwLCBhcmdwLCAmcmVzKSkgPT0gMCkKKwkJc3RhdCA9IG5sbXN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19HUkFOVEVEX1JFUywgJnJlcyk7CisJcmV0dXJuIHN0YXQ7Cit9CisKKy8qCisgKiBTSEFSRTogY3JlYXRlIGEgRE9TIHNoYXJlIG9yIGFsdGVyIGV4aXN0aW5nIHNoYXJlLgorICovCitzdGF0aWMgaW50CitubG1zdmNfcHJvY19zaGFyZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCQkJICAgICAgICAgIHN0cnVjdCBubG1fcmVzICAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3Q7CisJc3RydWN0IG5sbV9maWxlCSpmaWxlOworCisJZHByaW50aygibG9ja2Q6IFNIQVJFICAgICAgICAgY2FsbGVkXG4iKTsKKworCXJlc3AtPmNvb2tpZSA9IGFyZ3AtPmNvb2tpZTsKKworCS8qIERvbid0IGFjY2VwdCBuZXcgbG9jayByZXF1ZXN0cyBkdXJpbmcgZ3JhY2UgcGVyaW9kICovCisJaWYgKG5sbXN2Y19ncmFjZV9wZXJpb2QgJiYgIWFyZ3AtPnJlY2xhaW0pIHsKKwkJcmVzcC0+c3RhdHVzID0gbmxtX2xja19kZW5pZWRfZ3JhY2VfcGVyaW9kOworCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisJfQorCisJLyogT2J0YWluIGNsaWVudCBhbmQgZmlsZSAqLworCWlmICgocmVzcC0+c3RhdHVzID0gbmxtc3ZjX3JldHJpZXZlX2FyZ3MocnFzdHAsIGFyZ3AsICZob3N0LCAmZmlsZSkpKQorCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisKKwkvKiBOb3cgdHJ5IHRvIGNyZWF0ZSB0aGUgc2hhcmUgKi8KKwlyZXNwLT5zdGF0dXMgPSBjYXN0X3N0YXR1cyhubG1zdmNfc2hhcmVfZmlsZShob3N0LCBmaWxlLCBhcmdwKSk7CisKKwlkcHJpbnRrKCJsb2NrZDogU0hBUkUgICAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOworCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKKwlyZXR1cm4gcnBjX3N1Y2Nlc3M7Cit9CisKKy8qCisgKiBVTlNIQVJFOiBSZWxlYXNlIGEgRE9TIHNoYXJlLgorICovCitzdGF0aWMgaW50CitubG1zdmNfcHJvY191bnNoYXJlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKKwkJCQkgICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCit7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0OworCXN0cnVjdCBubG1fZmlsZQkqZmlsZTsKKworCWRwcmludGsoImxvY2tkOiBVTlNIQVJFICAgICAgIGNhbGxlZFxuIik7CisKKwlyZXNwLT5jb29raWUgPSBhcmdwLT5jb29raWU7CisKKwkvKiBEb24ndCBhY2NlcHQgcmVxdWVzdHMgZHVyaW5nIGdyYWNlIHBlcmlvZCAqLworCWlmIChubG1zdmNfZ3JhY2VfcGVyaW9kKSB7CisJCXJlc3AtPnN0YXR1cyA9IG5sbV9sY2tfZGVuaWVkX2dyYWNlX3BlcmlvZDsKKwkJcmV0dXJuIHJwY19zdWNjZXNzOworCX0KKworCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KKwlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbXN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgJmZpbGUpKSkKKwkJcmV0dXJuIHJwY19zdWNjZXNzOworCisJLyogTm93IHRyeSB0byB1bnNoYXJlIHRoZSBmaWxlICovCisJcmVzcC0+c3RhdHVzID0gY2FzdF9zdGF0dXMobmxtc3ZjX3Vuc2hhcmVfZmlsZShob3N0LCBmaWxlLCBhcmdwKSk7CisKKwlkcHJpbnRrKCJsb2NrZDogVU5TSEFSRSAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOworCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKKwlyZXR1cm4gcnBjX3N1Y2Nlc3M7Cit9CisKKy8qCisgKiBOTV9MT0NLOiBDcmVhdGUgYW4gdW5tb25pdG9yZWQgbG9jaworICovCitzdGF0aWMgaW50CitubG1zdmNfcHJvY19ubV9sb2NrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKKwkJCQkgICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCit7CisJZHByaW50aygibG9ja2Q6IE5NX0xPQ0sgICAgICAgY2FsbGVkXG4iKTsKKworCWFyZ3AtPm1vbml0b3IgPSAwOwkJLyoganVzdCBjbGVhbiB0aGUgbW9uaXRvciBmbGFnICovCisJcmV0dXJuIG5sbXN2Y19wcm9jX2xvY2socnFzdHAsIGFyZ3AsIHJlc3ApOworfQorCisvKgorICogRlJFRV9BTEw6IFJlbGVhc2UgYWxsIGxvY2tzIGFuZCBzaGFyZXMgaGVsZCBieSBjbGllbnQKKyAqLworc3RhdGljIGludAorbmxtc3ZjX3Byb2NfZnJlZV9hbGwoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJCQkgICAgIHZvaWQgICAgICAgICAgICAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3Q7CisKKwkvKiBPYnRhaW4gY2xpZW50ICovCisJaWYgKG5sbXN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgTlVMTCkpCisJCXJldHVybiBycGNfc3VjY2VzczsKKworCW5sbXN2Y19mcmVlX2hvc3RfcmVzb3VyY2VzKGhvc3QpOworCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCisvKgorICogU01fTk9USUZZOiBwcml2YXRlIGNhbGxiYWNrIGZyb20gc3RhdGQgKG5vdCBwYXJ0IG9mIG9mZmljaWFsIE5MTSBwcm90bykKKyAqLworc3RhdGljIGludAorbmxtc3ZjX3Byb2Nfc21fbm90aWZ5KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fcmVib290ICphcmdwLAorCQkJCQkgICAgICB2b2lkCSAgICAgICAgKnJlc3ApCit7CisJc3RydWN0IHNvY2thZGRyX2luCXNhZGRyID0gcnFzdHAtPnJxX2FkZHI7CisJaW50CQkJdmVycyA9IGFyZ3AtPnZlcnM7CisJaW50CQkJcHJvdCA9IGFyZ3AtPnByb3RvID4+IDE7CisJc3RydWN0IG5sbV9ob3N0CQkqaG9zdDsKKworCWRwcmludGsoImxvY2tkOiBTTV9OT1RJRlkgICAgIGNhbGxlZFxuIik7CisJaWYgKHNhZGRyLnNpbl9hZGRyLnNfYWRkciAhPSBodG9ubChJTkFERFJfTE9PUEJBQ0spCisJIHx8IG50b2hzKHNhZGRyLnNpbl9wb3J0KSA+PSAxMDI0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJsb2NrZDogcmVqZWN0ZWQgTlNNIGNhbGxiYWNrIGZyb20gJTA4eDolZFxuIiwKKwkJCW50b2hsKHJxc3RwLT5ycV9hZGRyLnNpbl9hZGRyLnNfYWRkciksCisJCQludG9ocyhycXN0cC0+cnFfYWRkci5zaW5fcG9ydCkpOworCQlyZXR1cm4gcnBjX3N5c3RlbV9lcnI7CisJfQorCisJLyogT2J0YWluIHRoZSBob3N0IHBvaW50ZXIgZm9yIHRoaXMgTkZTIHNlcnZlciBhbmQgdHJ5IHRvCisJICogcmVjbGFpbSBhbGwgbG9ja3Mgd2UgaG9sZCBvbiB0aGlzIHNlcnZlci4KKwkgKi8KKwlzYWRkci5zaW5fYWRkci5zX2FkZHIgPSBhcmdwLT5hZGRyOworCWlmICgoYXJncC0+cHJvdG8gJiAxKT09MCkgeworCQlpZiAoKGhvc3QgPSBubG1jbG50X2xvb2t1cF9ob3N0KCZzYWRkciwgcHJvdCwgdmVycykpICE9IE5VTEwpIHsKKwkJCW5sbWNsbnRfcmVjb3ZlcnkoaG9zdCwgYXJncC0+c3RhdGUpOworCQkJbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIElmIHdlIHJ1biBvbiBhbiBORlMgc2VydmVyLCBkZWxldGUgYWxsIGxvY2tzIGhlbGQgYnkgdGhlIGNsaWVudCAqLworCQlpZiAoKGhvc3QgPSBubG1fbG9va3VwX2hvc3QoMSwgJnNhZGRyLCBwcm90LCB2ZXJzKSkgIT0gTlVMTCkgeworCQkJbmxtc3ZjX2ZyZWVfaG9zdF9yZXNvdXJjZXMoaG9zdCk7CisJCQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCQl9CisJfQorCisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCisvKgorICogY2xpZW50IHNlbnQgYSBHUkFOVEVEX1JFUywgbGV0J3MgcmVtb3ZlIHRoZSBhc3NvY2lhdGVkIGJsb2NrCisgKi8KK3N0YXRpYyBpbnQKK25sbXN2Y19wcm9jX2dyYW50ZWRfcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fcmVzICAqYXJncCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcmVzcCkKK3sKKwlpZiAoIW5sbXN2Y19vcHMpCisJCXJldHVybiBycGNfc3VjY2VzczsKKworCWRwcmludGsoImxvY2tkOiBHUkFOVEVEX1JFUyAgIGNhbGxlZFxuIik7CisKKwlubG1zdmNfZ3JhbnRfcmVwbHkocnFzdHAsICZhcmdwLT5jb29raWUsIGFyZ3AtPnN0YXR1cyk7CisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCisvKgorICogVGhpcyBpcyB0aGUgZ2VuZXJpYyBsb2NrZCBjYWxsYmFjayBmb3IgYXN5bmMgUlBDIGNhbGxzCisgKi8KK3N0YXRpYyB1MzIKK25sbXN2Y19jYWxsYmFjayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgcHJvYywgc3RydWN0IG5sbV9yZXMgKnJlc3ApCit7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0OworCXN0cnVjdCBubG1fcnFzdAkqY2FsbDsKKworCWlmICghKGNhbGwgPSBubG1jbG50X2FsbG9jX2NhbGwoKSkpCisJCXJldHVybiBycGNfc3lzdGVtX2VycjsKKworCWhvc3QgPSBubG1jbG50X2xvb2t1cF9ob3N0KCZycXN0cC0+cnFfYWRkciwKKwkJCQlycXN0cC0+cnFfcHJvdCwgcnFzdHAtPnJxX3ZlcnMpOworCWlmICghaG9zdCkgeworCQlrZnJlZShjYWxsKTsKKwkJcmV0dXJuIHJwY19zeXN0ZW1fZXJyOworCX0KKworCWNhbGwtPmFfZmxhZ3MgPSBSUENfVEFTS19BU1lOQzsKKwljYWxsLT5hX2hvc3QgID0gaG9zdDsKKwltZW1jcHkoJmNhbGwtPmFfYXJncywgcmVzcCwgc2l6ZW9mKCpyZXNwKSk7CisKKwlpZiAobmxtc3ZjX2FzeW5jX2NhbGwoY2FsbCwgcHJvYywgbmxtc3ZjX2NhbGxiYWNrX2V4aXQpIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiBycGNfc3VjY2VzczsKKyBlcnJvcjoKKwlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCWtmcmVlKGNhbGwpOworCXJldHVybiBycGNfc3lzdGVtX2VycjsKK30KKworc3RhdGljIHZvaWQKK25sbXN2Y19jYWxsYmFja19leGl0KHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgbmxtX3Jxc3QJKmNhbGwgPSAoc3RydWN0IG5sbV9ycXN0ICopIHRhc2stPnRrX2NhbGxkYXRhOworCisJaWYgKHRhc2stPnRrX3N0YXR1cyA8IDApIHsKKwkJZHByaW50aygibG9ja2Q6ICU0ZCBjYWxsYmFjayBmYWlsZWQgKGVycm5vID0gJWQpXG4iLAorCQkJCQl0YXNrLT50a19waWQsIC10YXNrLT50a19zdGF0dXMpOworCX0KKwlubG1fcmVsZWFzZV9ob3N0KGNhbGwtPmFfaG9zdCk7CisJa2ZyZWUoY2FsbCk7Cit9CisKKy8qCisgKiBOTE0gU2VydmVyIHByb2NlZHVyZXMuCisgKi8KKworI2RlZmluZSBubG1zdmNfZW5jb2RlX25vcmVwCW5sbXN2Y19lbmNvZGVfdm9pZAorI2RlZmluZSBubG1zdmNfZGVjb2RlX25vcmVwCW5sbXN2Y19kZWNvZGVfdm9pZAorI2RlZmluZSBubG1zdmNfZGVjb2RlX3Rlc3RyZXMJbmxtc3ZjX2RlY29kZV92b2lkCisjZGVmaW5lIG5sbXN2Y19kZWNvZGVfbG9ja3JlcwlubG1zdmNfZGVjb2RlX3ZvaWQKKyNkZWZpbmUgbmxtc3ZjX2RlY29kZV91bmxvY2tyZXMJbmxtc3ZjX2RlY29kZV92b2lkCisjZGVmaW5lIG5sbXN2Y19kZWNvZGVfY2FuY2VscmVzCW5sbXN2Y19kZWNvZGVfdm9pZAorI2RlZmluZSBubG1zdmNfZGVjb2RlX2dyYW50ZWRyZXMJbmxtc3ZjX2RlY29kZV92b2lkCisKKyNkZWZpbmUgbmxtc3ZjX3Byb2Nfbm9uZQlubG1zdmNfcHJvY19udWxsCisjZGVmaW5lIG5sbXN2Y19wcm9jX3Rlc3RfcmVzCW5sbXN2Y19wcm9jX251bGwKKyNkZWZpbmUgbmxtc3ZjX3Byb2NfbG9ja19yZXMJbmxtc3ZjX3Byb2NfbnVsbAorI2RlZmluZSBubG1zdmNfcHJvY19jYW5jZWxfcmVzCW5sbXN2Y19wcm9jX251bGwKKyNkZWZpbmUgbmxtc3ZjX3Byb2NfdW5sb2NrX3JlcwlubG1zdmNfcHJvY19udWxsCisKK3N0cnVjdCBubG1fdm9pZAkJCXsgaW50IGR1bW15OyB9OworCisjZGVmaW5lIFBST0MobmFtZSwgeGFyZ3QsIHhyZXN0LCBhcmd0LCByZXN0LCByZXNwc2l6ZSkJXAorIHsgLnBjX2Z1bmMJPSAoc3ZjX3Byb2NmdW5jKSBubG1zdmNfcHJvY18jI25hbWUsCVwKKyAgIC5wY19kZWNvZGUJPSAoa3hkcnByb2NfdCkgbmxtc3ZjX2RlY29kZV8jI3hhcmd0LAlcCisgICAucGNfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpIG5sbXN2Y19lbmNvZGVfIyN4cmVzdCwJXAorICAgLnBjX3JlbGVhc2UJPSBOVUxMLAkJCQkJXAorICAgLnBjX2FyZ3NpemUJPSBzaXplb2Yoc3RydWN0IG5sbV8jI2FyZ3QpLAkJXAorICAgLnBjX3Jlc3NpemUJPSBzaXplb2Yoc3RydWN0IG5sbV8jI3Jlc3QpLAkJXAorICAgLnBjX3hkcnJlc3NpemUgPSByZXNwc2l6ZSwJCQkJXAorIH0KKworI2RlZmluZQlDawkoMStYRFJfUVVBRExFTihOTE1fTUFYQ09PS0lFTEVOKSkJLyogY29va2llICovCisjZGVmaW5lCVN0CTEJCQkJLyogc3RhdHVzICovCisjZGVmaW5lCU5vCSgxKzEwMjQvNCkJCQkvKiBOZXQgT2JqICovCisjZGVmaW5lCVJnCTIJCQkJLyogcmFuZ2UgLSBvZmZzZXQgKyBzaXplICovCisKK3N0cnVjdCBzdmNfcHJvY2VkdXJlCQlubG1zdmNfcHJvY2VkdXJlc1tdID0geworICBQUk9DKG51bGwsCQl2b2lkLAkJdm9pZCwJCXZvaWQsCXZvaWQsIDEpLAorICBQUk9DKHRlc3QsCQl0ZXN0YXJncywJdGVzdHJlcywJYXJncywJcmVzLCBDaytTdCsyK05vK1JnKSwKKyAgUFJPQyhsb2NrLAkJbG9ja2FyZ3MsCXJlcywJCWFyZ3MsCXJlcywgQ2srU3QpLAorICBQUk9DKGNhbmNlbCwJCWNhbmNhcmdzLAlyZXMsCQlhcmdzLAlyZXMsIENrK1N0KSwKKyAgUFJPQyh1bmxvY2ssCQl1bmxvY2thcmdzLAlyZXMsCQlhcmdzLAlyZXMsIENrK1N0KSwKKyAgUFJPQyhncmFudGVkLAkJdGVzdGFyZ3MsCXJlcywJCWFyZ3MsCXJlcywgQ2srU3QpLAorICBQUk9DKHRlc3RfbXNnLAl0ZXN0YXJncywJbm9yZXAsCQlhcmdzLAl2b2lkLCAxKSwKKyAgUFJPQyhsb2NrX21zZywJbG9ja2FyZ3MsCW5vcmVwLAkJYXJncywJdm9pZCwgMSksCisgIFBST0MoY2FuY2VsX21zZywJY2FuY2FyZ3MsCW5vcmVwLAkJYXJncywJdm9pZCwgMSksCisgIFBST0ModW5sb2NrX21zZywJdW5sb2NrYXJncywJbm9yZXAsCQlhcmdzLAl2b2lkLCAxKSwKKyAgUFJPQyhncmFudGVkX21zZywJdGVzdGFyZ3MsCW5vcmVwLAkJYXJncywJdm9pZCwgMSksCisgIFBST0ModGVzdF9yZXMsCXRlc3RyZXMsCW5vcmVwLAkJcmVzLAl2b2lkLCAxKSwKKyAgUFJPQyhsb2NrX3JlcywJbG9ja3JlcywJbm9yZXAsCQlyZXMsCXZvaWQsIDEpLAorICBQUk9DKGNhbmNlbF9yZXMsCWNhbmNlbHJlcywJbm9yZXAsCQlyZXMsCXZvaWQsIDEpLAorICBQUk9DKHVubG9ja19yZXMsCXVubG9ja3JlcywJbm9yZXAsCQlyZXMsCXZvaWQsIDEpLAorICBQUk9DKGdyYW50ZWRfcmVzLAlyZXMsCQlub3JlcCwJCXJlcywJdm9pZCwgMSksCisgIC8qIHN0YXRkIGNhbGxiYWNrICovCisgIFBST0Moc21fbm90aWZ5LAlyZWJvb3QsCQl2b2lkLAkJcmVib290LAl2b2lkLCAxKSwKKyAgUFJPQyhub25lLAkJdm9pZCwJCXZvaWQsCQl2b2lkLAl2b2lkLCAxKSwKKyAgUFJPQyhub25lLAkJdm9pZCwJCXZvaWQsCQl2b2lkLAl2b2lkLCAxKSwKKyAgUFJPQyhub25lLAkJdm9pZCwJCXZvaWQsCQl2b2lkLAl2b2lkLCAxKSwKKyAgUFJPQyhzaGFyZSwJCXNoYXJlYXJncywJc2hhcmVyZXMsCWFyZ3MsCXJlcywgQ2srU3QrMSksCisgIFBST0ModW5zaGFyZSwJCXNoYXJlYXJncywJc2hhcmVyZXMsCWFyZ3MsCXJlcywgQ2srU3QrMSksCisgIFBST0Mobm1fbG9jaywJCWxvY2thcmdzLAlyZXMsCQlhcmdzLAlyZXMsIENrK1N0KSwKKyAgUFJPQyhmcmVlX2FsbCwJbm90aWZ5LAkJdm9pZCwJCWFyZ3MsCXZvaWQsIDApLAorCit9OwpkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3Zjc2hhcmUuYyBiL2ZzL2xvY2tkL3N2Y3NoYXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0M2ZiNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2xvY2tkL3N2Y3NoYXJlLmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBsaW51eC9mcy9sb2NrZC9zdmNzaGFyZS5jCisgKgorICogTWFuYWdlbWVudCBvZiBET1Mgc2hhcmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2Qvc2hhcmUuaD4KKworc3RhdGljIGlubGluZSBpbnQKK25sbV9jbXBfb3duZXIoc3RydWN0IG5sbV9zaGFyZSAqc2hhcmUsIHN0cnVjdCB4ZHJfbmV0b2JqICpvaCkKK3sKKwlyZXR1cm4gc2hhcmUtPnNfb3duZXIubGVuID09IG9oLT5sZW4KKwkgICAgJiYgIW1lbWNtcChzaGFyZS0+c19vd25lci5kYXRhLCBvaC0+ZGF0YSwgb2gtPmxlbik7Cit9CisKK3UzMgorbmxtc3ZjX3NoYXJlX2ZpbGUoc3RydWN0IG5sbV9ob3N0ICpob3N0LCBzdHJ1Y3QgbmxtX2ZpbGUgKmZpbGUsCisJCQlzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3ApCit7CisJc3RydWN0IG5sbV9zaGFyZQkqc2hhcmU7CisJc3RydWN0IHhkcl9uZXRvYmoJKm9oID0gJmFyZ3AtPmxvY2sub2g7CisJdTgJCQkqb2hkYXRhOworCisJZm9yIChzaGFyZSA9IGZpbGUtPmZfc2hhcmVzOyBzaGFyZTsgc2hhcmUgPSBzaGFyZS0+c19uZXh0KSB7CisJCWlmIChzaGFyZS0+c19ob3N0ID09IGhvc3QgJiYgbmxtX2NtcF9vd25lcihzaGFyZSwgb2gpKQorCQkJZ290byB1cGRhdGU7CisJCWlmICgoYXJncC0+ZnNtX2FjY2VzcyAmIHNoYXJlLT5zX21vZGUpCisJCSB8fCAoYXJncC0+ZnNtX21vZGUgICAmIHNoYXJlLT5zX2FjY2VzcyApKQorCQkJcmV0dXJuIG5sbV9sY2tfZGVuaWVkOworCX0KKworCXNoYXJlID0gKHN0cnVjdCBubG1fc2hhcmUgKikga21hbGxvYyhzaXplb2YoKnNoYXJlKSArIG9oLT5sZW4sCisJCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoc2hhcmUgPT0gTlVMTCkKKwkJcmV0dXJuIG5sbV9sY2tfZGVuaWVkX25vbG9ja3M7CisKKwkvKiBDb3B5IG93bmVyIGhhbmRsZSAqLworCW9oZGF0YSA9ICh1OCAqKSAoc2hhcmUgKyAxKTsKKwltZW1jcHkob2hkYXRhLCBvaC0+ZGF0YSwgb2gtPmxlbik7CisKKwlzaGFyZS0+c19maWxlCSAgICA9IGZpbGU7CisJc2hhcmUtPnNfaG9zdCAgICAgICA9IGhvc3Q7CisJc2hhcmUtPnNfb3duZXIuZGF0YSA9IG9oZGF0YTsKKwlzaGFyZS0+c19vd25lci5sZW4gID0gb2gtPmxlbjsKKwlzaGFyZS0+c19uZXh0ICAgICAgID0gZmlsZS0+Zl9zaGFyZXM7CisJZmlsZS0+Zl9zaGFyZXMgICAgICA9IHNoYXJlOworCit1cGRhdGU6CisJc2hhcmUtPnNfYWNjZXNzID0gYXJncC0+ZnNtX2FjY2VzczsKKwlzaGFyZS0+c19tb2RlICAgPSBhcmdwLT5mc21fbW9kZTsKKwlyZXR1cm4gbmxtX2dyYW50ZWQ7Cit9CisKKy8qCisgKiBEZWxldGUgYSBzaGFyZS4KKyAqLwordTMyCitubG1zdmNfdW5zaGFyZV9maWxlKHN0cnVjdCBubG1faG9zdCAqaG9zdCwgc3RydWN0IG5sbV9maWxlICpmaWxlLAorCQkJc3RydWN0IG5sbV9hcmdzICphcmdwKQoreworCXN0cnVjdCBubG1fc2hhcmUJKnNoYXJlLCAqKnNocHA7CisJc3RydWN0IHhkcl9uZXRvYmoJKm9oID0gJmFyZ3AtPmxvY2sub2g7CisKKwlmb3IgKHNocHAgPSAmZmlsZS0+Zl9zaGFyZXM7IChzaGFyZSA9ICpzaHBwKSAhPSAwOyBzaHBwID0gJnNoYXJlLT5zX25leHQpIHsKKwkJaWYgKHNoYXJlLT5zX2hvc3QgPT0gaG9zdCAmJiBubG1fY21wX293bmVyKHNoYXJlLCBvaCkpIHsKKwkJCSpzaHBwID0gc2hhcmUtPnNfbmV4dDsKKwkJCWtmcmVlKHNoYXJlKTsKKwkJCXJldHVybiBubG1fZ3JhbnRlZDsKKwkJfQorCX0KKworCS8qIFgvT3BlbiBzcGVjIHNheXMgcmV0dXJuIHN1Y2Nlc3MgZXZlbiBpZiB0aGVyZSB3YXMgbm8KKwkgKiBjb3JyZXNwb25kaW5nIHNoYXJlLiAqLworCXJldHVybiBubG1fZ3JhbnRlZDsKK30KKworLyoKKyAqIFRyYXZlcnNlIGFsbCBzaGFyZXMgZm9yIGEgZ2l2ZW4gZmlsZSAoYW5kIGhvc3QpLgorICogTkxNX0FDVF9DSEVDSyBpcyBoYW5kbGVkIGJ5IG5sbXN2Y19pbnNwZWN0X2ZpbGUuCisgKi8KK2ludAorbmxtc3ZjX3RyYXZlcnNlX3NoYXJlcyhzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIHN0cnVjdCBubG1fZmlsZSAqZmlsZSwgaW50IGFjdGlvbikKK3sKKwlzdHJ1Y3QgbmxtX3NoYXJlCSpzaGFyZSwgKipzaHBwOworCisJc2hwcCA9ICZmaWxlLT5mX3NoYXJlczsKKwl3aGlsZSAoKHNoYXJlID0gKnNocHApICE9ICBOVUxMKSB7CisJCWlmIChhY3Rpb24gPT0gTkxNX0FDVF9NQVJLKQorCQkJc2hhcmUtPnNfaG9zdC0+aF9pbnVzZSA9IDE7CisJCWVsc2UgaWYgKGFjdGlvbiA9PSBOTE1fQUNUX1VOTE9DSykgeworCQkJaWYgKGhvc3QgPT0gTlVMTCB8fCBob3N0ID09IHNoYXJlLT5zX2hvc3QpIHsKKwkJCQkqc2hwcCA9IHNoYXJlLT5zX25leHQ7CisJCQkJa2ZyZWUoc2hhcmUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCXNocHAgPSAmc2hhcmUtPnNfbmV4dDsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Y3N1YnMuYyBiL2ZzL2xvY2tkL3N2Y3N1YnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTc1MzYzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbG9ja2Qvc3Zjc3Vicy5jCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogbGludXgvZnMvbG9ja2Qvc3Zjc3Vicy5jCisgKgorICogVmFyaW91cyBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgTkxNIHNlcnZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZmguaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2Qvc2hhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9zbV9pbnRlci5oPgorCisjZGVmaW5lIE5MTURCR19GQUNJTElUWQkJTkxNREJHX1NWQ1NVQlMKKworCisvKgorICogR2xvYmFsIGZpbGUgaGFzaCB0YWJsZQorICovCisjZGVmaW5lIEZJTEVfSEFTSF9CSVRTCQk1CisjZGVmaW5lIEZJTEVfTlJIQVNICQkoMTw8RklMRV9IQVNIX0JJVFMpCitzdGF0aWMgc3RydWN0IG5sbV9maWxlICoJbmxtX2ZpbGVzW0ZJTEVfTlJIQVNIXTsKK3N0YXRpYyBERUNMQVJFX01VVEVYKG5sbV9maWxlX3NlbWEpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBmaWxlX2hhc2goc3RydWN0IG5mc19maCAqZikKK3sKKwl1bnNpZ25lZCBpbnQgdG1wPTA7CisJaW50IGk7CisJZm9yIChpPTA7IGk8TkZTMl9GSFNJWkU7aSsrKQorCQl0bXAgKz0gZi0+ZGF0YVtpXTsKKwlyZXR1cm4gdG1wICYgKEZJTEVfTlJIQVNIIC0gMSk7Cit9CisKKy8qCisgKiBMb29rdXAgZmlsZSBpbmZvLiBJZiBpdCBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgYSBmaWxlIGluZm8gc3RydWN0CisgKiBhbmQgb3BlbiBhIChWRlMpIGZpbGUgZm9yIHRoZSBnaXZlbiBpbm9kZS4KKyAqCisgKiBGSVhNRToKKyAqIE5vdGUgdGhhdCB3ZSBvcGVuIHRoZSBmaWxlIE9fUkRPTkxZIGV2ZW4gd2hlbiBjcmVhdGluZyB3cml0ZSBsb2Nrcy4KKyAqIFRoaXMgaXMgbm90IHF1aXRlIHJpZ2h0LCBidXQgZm9yIG5vdywgd2UgYXNzdW1lIHRoZSBjbGllbnQgcGVyZm9ybXMKKyAqIHRoZSBwcm9wZXIgUi9XIGNoZWNraW5nLgorICovCit1MzIKK25sbV9sb29rdXBfZmlsZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2ZpbGUgKipyZXN1bHQsCisJCQkJCXN0cnVjdCBuZnNfZmggKmYpCit7CisJc3RydWN0IG5sbV9maWxlCSpmaWxlOworCXVuc2lnbmVkIGludAloYXNoOworCXUzMgkJbmZzZXJyOworCXUzMgkJKmZocCA9ICh1MzIqKWYtPmRhdGE7CisKKwlkcHJpbnRrKCJsb2NrZDogbmxtX2ZpbGVfbG9va3VwKCUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4KVxuIiwKKwkJZmhwWzBdLCBmaHBbMV0sIGZocFsyXSwgZmhwWzNdLCBmaHBbNF0sIGZocFs1XSk7CisKKworCWhhc2ggPSBmaWxlX2hhc2goZik7CisKKwkvKiBMb2NrIGZpbGUgdGFibGUgKi8KKwlkb3duKCZubG1fZmlsZV9zZW1hKTsKKworCWZvciAoZmlsZSA9IG5sbV9maWxlc1toYXNoXTsgZmlsZTsgZmlsZSA9IGZpbGUtPmZfbmV4dCkKKwkJaWYgKCFuZnNfY29tcGFyZV9maCgmZmlsZS0+Zl9oYW5kbGUsIGYpKQorCQkJZ290byBmb3VuZDsKKworCWRwcmludGsoImxvY2tkOiBjcmVhdGluZyBmaWxlIGZvciAoJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHgpXG4iLAorCQlmaHBbMF0sIGZocFsxXSwgZmhwWzJdLCBmaHBbM10sIGZocFs0XSwgZmhwWzVdKTsKKworCW5mc2VyciA9IG5sbV9sY2tfZGVuaWVkX25vbG9ja3M7CisJZmlsZSA9IChzdHJ1Y3QgbmxtX2ZpbGUgKikga21hbGxvYyhzaXplb2YoKmZpbGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gb3V0X3VubG9jazsKKworCW1lbXNldChmaWxlLCAwLCBzaXplb2YoKmZpbGUpKTsKKwltZW1jcHkoJmZpbGUtPmZfaGFuZGxlLCBmLCBzaXplb2Yoc3RydWN0IG5mc19maCkpOworCWZpbGUtPmZfaGFzaCA9IGhhc2g7CisJaW5pdF9NVVRFWCgmZmlsZS0+Zl9zZW1hKTsKKworCS8qIE9wZW4gdGhlIGZpbGUuIE5vdGUgdGhhdCB0aGlzIG11c3Qgbm90IHNsZWVwIGZvciB0b28gbG9uZywgZWxzZQorCSAqIHdlIHdvdWxkIGxvY2sgdXAgbG9ja2Q6LSkgU28gbm8gTkZTIHJlLWV4cG9ydHMsIGZvbGtzLgorCSAqCisJICogV2UgaGF2ZSB0byBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgcmlnaHQgY3JlZGVudGlhbCB0byBvcGVuCisJICogdGhlIGZpbGUuCisJICovCisJaWYgKChuZnNlcnIgPSBubG1zdmNfb3BzLT5mb3BlbihycXN0cCwgZiwgJmZpbGUtPmZfZmlsZSkpICE9IDApIHsKKwkJZHByaW50aygibG9ja2Q6IG9wZW4gZmFpbGVkIChuZnNlcnIgJWQpXG4iLCBudG9obChuZnNlcnIpKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlmaWxlLT5mX25leHQgPSBubG1fZmlsZXNbaGFzaF07CisJbmxtX2ZpbGVzW2hhc2hdID0gZmlsZTsKKworZm91bmQ6CisJZHByaW50aygibG9ja2Q6IGZvdW5kIGZpbGUgJXAgKGNvdW50ICVkKVxuIiwgZmlsZSwgZmlsZS0+Zl9jb3VudCk7CisJKnJlc3VsdCA9IGZpbGU7CisJZmlsZS0+Zl9jb3VudCsrOworCW5mc2VyciA9IDA7CisKK291dF91bmxvY2s6CisJdXAoJm5sbV9maWxlX3NlbWEpOworCXJldHVybiBuZnNlcnI7CisKK291dF9mcmVlOgorCWtmcmVlKGZpbGUpOworI2lmZGVmIENPTkZJR19MT0NLRF9WNAorCWlmIChuZnNlcnIgPT0gMSkKKwkJbmZzZXJyID0gbmxtNF9zdGFsZV9maDsKKwllbHNlCisjZW5kaWYKKwluZnNlcnIgPSBubG1fbGNrX2RlbmllZDsKKwlnb3RvIG91dF91bmxvY2s7Cit9CisKKy8qCisgKiBEZWxldGUgYSBmaWxlIGFmdGVyIGhhdmluZyByZWxlYXNlZCBhbGwgbG9ja3MsIGJsb2NrcyBhbmQgc2hhcmVzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbmxtX2RlbGV0ZV9maWxlKHN0cnVjdCBubG1fZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgbmxtX2ZpbGUJKipmcCwgKmY7CisKKwlkcHJpbnRrKCJsb2NrZDogY2xvc2luZyBmaWxlICVzLyVsZFxuIiwKKwkJaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7CisJZnAgPSBubG1fZmlsZXMgKyBmaWxlLT5mX2hhc2g7CisJd2hpbGUgKChmID0gKmZwKSAhPSBOVUxMKSB7CisJCWlmIChmID09IGZpbGUpIHsKKwkJCSpmcCA9IGZpbGUtPmZfbmV4dDsKKwkJCW5sbXN2Y19vcHMtPmZjbG9zZShmaWxlLT5mX2ZpbGUpOworCQkJa2ZyZWUoZmlsZSk7CisJCQlyZXR1cm47CisJCX0KKwkJZnAgPSAmZi0+Zl9uZXh0OworCX0KKworCXByaW50ayhLRVJOX1dBUk5JTkcgImxvY2tkOiBhdHRlbXB0IHRvIHJlbGVhc2UgdW5rbm93biBmaWxlIVxuIik7Cit9CisKKy8qCisgKiBMb29wIG92ZXIgYWxsIGxvY2tzIG9uIHRoZSBnaXZlbiBmaWxlIGFuZCBwZXJmb3JtIHRoZSBzcGVjaWZpZWQKKyAqIGFjdGlvbi4KKyAqLworc3RhdGljIGludAorbmxtX3RyYXZlcnNlX2xvY2tzKHN0cnVjdCBubG1faG9zdCAqaG9zdCwgc3RydWN0IG5sbV9maWxlICpmaWxlLCBpbnQgYWN0aW9uKQoreworCXN0cnVjdCBpbm9kZQkgKmlub2RlID0gbmxtc3ZjX2ZpbGVfaW5vZGUoZmlsZSk7CisJc3RydWN0IGZpbGVfbG9jayAqZmw7CisJc3RydWN0IG5sbV9ob3N0CSAqbG9ja2hvc3Q7CisKK2FnYWluOgorCWZpbGUtPmZfbG9ja3MgPSAwOworCWZvciAoZmwgPSBpbm9kZS0+aV9mbG9jazsgZmw7IGZsID0gZmwtPmZsX25leHQpIHsKKwkJaWYgKCEoZmwtPmZsX2ZsYWdzICYgRkxfTE9DS0QpKQorCQkJY29udGludWU7CisKKwkJLyogdXBkYXRlIGN1cnJlbnQgbG9jayBjb3VudCAqLworCQlmaWxlLT5mX2xvY2tzKys7CisJCWxvY2tob3N0ID0gKHN0cnVjdCBubG1faG9zdCAqKSBmbC0+Zmxfb3duZXI7CisJCWlmIChhY3Rpb24gPT0gTkxNX0FDVF9NQVJLKQorCQkJbG9ja2hvc3QtPmhfaW51c2UgPSAxOworCQllbHNlIGlmIChhY3Rpb24gPT0gTkxNX0FDVF9DSEVDSykKKwkJCXJldHVybiAxOworCQllbHNlIGlmIChhY3Rpb24gPT0gTkxNX0FDVF9VTkxPQ0spIHsKKwkJCXN0cnVjdCBmaWxlX2xvY2sgbG9jayA9ICpmbDsKKworCQkJaWYgKGhvc3QgJiYgbG9ja2hvc3QgIT0gaG9zdCkKKwkJCQljb250aW51ZTsKKworCQkJbG9jay5mbF90eXBlICA9IEZfVU5MQ0s7CisJCQlsb2NrLmZsX3N0YXJ0ID0gMDsKKwkJCWxvY2suZmxfZW5kICAgPSBPRkZTRVRfTUFYOworCQkJaWYgKHBvc2l4X2xvY2tfZmlsZShmaWxlLT5mX2ZpbGUsICZsb2NrKSA8IDApIHsKKwkJCQlwcmludGsoImxvY2tkOiB1bmxvY2sgZmFpbHVyZSBpbiAlczolZFxuIiwKKwkJCQkJCV9fRklMRV9fLCBfX0xJTkVfXyk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlnb3RvIGFnYWluOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBPcGVyYXRlIG9uIGEgc2luZ2xlIGZpbGUKKyAqLworc3RhdGljIGlubGluZSBpbnQKK25sbV9pbnNwZWN0X2ZpbGUoc3RydWN0IG5sbV9ob3N0ICpob3N0LCBzdHJ1Y3QgbmxtX2ZpbGUgKmZpbGUsIGludCBhY3Rpb24pCit7CisJaWYgKGFjdGlvbiA9PSBOTE1fQUNUX0NIRUNLKSB7CisJCS8qIEZhc3QgcGF0aCBmb3IgbWFyayBhbmQgc3dlZXAgZ2FyYmFnZSBjb2xsZWN0aW9uICovCisJCWlmIChmaWxlLT5mX2NvdW50IHx8IGZpbGUtPmZfYmxvY2tzIHx8IGZpbGUtPmZfc2hhcmVzKQorCQkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJaWYgKG5sbXN2Y190cmF2ZXJzZV9ibG9ja3MoaG9zdCwgZmlsZSwgYWN0aW9uKQorCQkgfHwgbmxtc3ZjX3RyYXZlcnNlX3NoYXJlcyhob3N0LCBmaWxlLCBhY3Rpb24pKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiBubG1fdHJhdmVyc2VfbG9ja3MoaG9zdCwgZmlsZSwgYWN0aW9uKTsKK30KKworLyoKKyAqIExvb3Agb3ZlciBhbGwgZmlsZXMgaW4gdGhlIGZpbGUgdGFibGUuCisgKi8KK3N0YXRpYyBpbnQKK25sbV90cmF2ZXJzZV9maWxlcyhzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIGludCBhY3Rpb24pCit7CisJc3RydWN0IG5sbV9maWxlCSpmaWxlLCAqKmZwOworCWludAkJaTsKKworCWRvd24oJm5sbV9maWxlX3NlbWEpOworCWZvciAoaSA9IDA7IGkgPCBGSUxFX05SSEFTSDsgaSsrKSB7CisJCWZwID0gbmxtX2ZpbGVzICsgaTsKKwkJd2hpbGUgKChmaWxlID0gKmZwKSAhPSBOVUxMKSB7CisJCQkvKiBUcmF2ZXJzZSBsb2NrcywgYmxvY2tzIGFuZCBzaGFyZXMgb2YgdGhpcyBmaWxlCisJCQkgKiBhbmQgdXBkYXRlIGZpbGUtPmZfbG9ja3MgY291bnQgKi8KKwkJCWlmIChubG1faW5zcGVjdF9maWxlKGhvc3QsIGZpbGUsIGFjdGlvbikpIHsKKwkJCQl1cCgmbmxtX2ZpbGVfc2VtYSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCS8qIE5vIG1vcmUgcmVmZXJlbmNlcyB0byB0aGlzIGZpbGUuIExldCBnbyBvZiBpdC4gKi8KKwkJCWlmICghZmlsZS0+Zl9ibG9ja3MgJiYgIWZpbGUtPmZfbG9ja3MKKwkJCSAmJiAhZmlsZS0+Zl9zaGFyZXMgJiYgIWZpbGUtPmZfY291bnQpIHsKKwkJCQkqZnAgPSBmaWxlLT5mX25leHQ7CisJCQkJbmxtc3ZjX29wcy0+ZmNsb3NlKGZpbGUtPmZfZmlsZSk7CisJCQkJa2ZyZWUoZmlsZSk7CisJCQl9IGVsc2UgeworCQkJCWZwID0gJmZpbGUtPmZfbmV4dDsKKwkJCX0KKwkJfQorCX0KKwl1cCgmbmxtX2ZpbGVfc2VtYSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWxlYXNlIGZpbGUuIElmIHRoZXJlIGFyZSBubyBtb3JlIHJlbW90ZSBsb2NrcyBvbiB0aGlzIGZpbGUsCisgKiBjbG9zZSBpdCBhbmQgZnJlZSB0aGUgaGFuZGxlLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBjYW4ndCBkbyBwcm9wZXIgcmVmZXJlbmNlIGNvdW50aW5nIHdpdGhvdXQgbWFqb3IKKyAqIGNvbnRvcnRpb25zIGJlY2F1c2UgdGhlIGNvZGUgaW4gZnMvbG9ja3MuYyBjcmVhdGVzLCBkZWxldGVzIGFuZAorICogc3BsaXRzIGxvY2tzIHdpdGhvdXQgbm90aWZpY2F0aW9uLiBPdXIgb25seSB3YXkgaXMgdG8gd2FsayB0aGUKKyAqIGVudGlyZSBsb2NrIGxpc3QgZWFjaCB0aW1lIHdlIHJlbW92ZSBhIGxvY2suCisgKi8KK3ZvaWQKK25sbV9yZWxlYXNlX2ZpbGUoc3RydWN0IG5sbV9maWxlICpmaWxlKQoreworCWRwcmludGsoImxvY2tkOiBubG1fcmVsZWFzZV9maWxlKCVwLCBjdCA9ICVkKVxuIiwKKwkJCQlmaWxlLCBmaWxlLT5mX2NvdW50KTsKKworCS8qIExvY2sgZmlsZSB0YWJsZSAqLworCWRvd24oJm5sbV9maWxlX3NlbWEpOworCisJLyogSWYgdGhlcmUgYXJlIG5vIG1vcmUgbG9ja3MgZXRjLCBkZWxldGUgdGhlIGZpbGUgKi8KKwlpZigtLWZpbGUtPmZfY291bnQgPT0gMCkgeworCQlpZighbmxtX2luc3BlY3RfZmlsZShOVUxMLCBmaWxlLCBOTE1fQUNUX0NIRUNLKSkKKwkJCW5sbV9kZWxldGVfZmlsZShmaWxlKTsKKwl9CisKKwl1cCgmbmxtX2ZpbGVfc2VtYSk7Cit9CisKKy8qCisgKiBNYXJrIGFsbCBob3N0cyB0aGF0IHN0aWxsIGhvbGQgcmVzb3VyY2VzCisgKi8KK3ZvaWQKK25sbXN2Y19tYXJrX3Jlc291cmNlcyh2b2lkKQoreworCWRwcmludGsoImxvY2tkOiBubG1zdmNfbWFya19yZXNvdXJjZXNcbiIpOworCisJbmxtX3RyYXZlcnNlX2ZpbGVzKE5VTEwsIE5MTV9BQ1RfTUFSSyk7Cit9CisKKy8qCisgKiBSZWxlYXNlIGFsbCByZXNvdXJjZXMgaGVsZCBieSB0aGUgZ2l2ZW4gY2xpZW50CisgKi8KK3ZvaWQKK25sbXN2Y19mcmVlX2hvc3RfcmVzb3VyY2VzKHN0cnVjdCBubG1faG9zdCAqaG9zdCkKK3sKKwlkcHJpbnRrKCJsb2NrZDogbmxtc3ZjX2ZyZWVfaG9zdF9yZXNvdXJjZXNcbiIpOworCisJaWYgKG5sbV90cmF2ZXJzZV9maWxlcyhob3N0LCBOTE1fQUNUX1VOTE9DSykpCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJsb2NrZDogY291bGRuJ3QgcmVtb3ZlIGFsbCBsb2NrcyBoZWxkIGJ5ICVzIiwKKwkJCWhvc3QtPmhfbmFtZSk7Cit9CisKKy8qCisgKiBkZWxldGUgYWxsIGhvc3RzIHN0cnVjdHMgZm9yIGNsaWVudHMKKyAqLwordm9pZAorbmxtc3ZjX2ludmFsaWRhdGVfYWxsKHZvaWQpCit7CisJc3RydWN0IG5sbV9ob3N0ICpob3N0OworCXdoaWxlICgoaG9zdCA9IG5sbV9maW5kX2NsaWVudCgpKSAhPSBOVUxMKSB7CisJCW5sbXN2Y19mcmVlX2hvc3RfcmVzb3VyY2VzKGhvc3QpOworCQlob3N0LT5oX2V4cGlyZXMgPSAwOworCQlob3N0LT5oX2tpbGxlZCA9IDE7CisJCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QveGRyLmMgYi9mcy9sb2NrZC94ZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDFlOWMwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbG9ja2QveGRyLmMKQEAgLTAsMCArMSw2MzUgQEAKKy8qCisgKiBsaW51eC9mcy9sb2NrZC94ZHIuYworICoKKyAqIFhEUiBzdXBwb3J0IGZvciBsb2NrZCBhbmQgdGhlIGxvY2sgY2xpZW50LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94ZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3RhdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9sb2NrZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3NtX2ludGVyLmg+CisKKyNkZWZpbmUgTkxNREJHX0ZBQ0lMSVRZCQlOTE1EQkdfWERSCisKKworc3RhdGljIGlubGluZSBsb2ZmX3QKK3MzMl90b19sb2ZmX3QoX19zMzIgb2Zmc2V0KQoreworCXJldHVybiAobG9mZl90KW9mZnNldDsKK30KKworc3RhdGljIGlubGluZSBfX3MzMgorbG9mZl90X3RvX3MzMihsb2ZmX3Qgb2Zmc2V0KQoreworCV9fczMyIHJlczsKKwlpZiAob2Zmc2V0ID49IE5MTV9PRkZTRVRfTUFYKQorCQlyZXMgPSBOTE1fT0ZGU0VUX01BWDsKKwllbHNlIGlmIChvZmZzZXQgPD0gLU5MTV9PRkZTRVRfTUFYKQorCQlyZXMgPSAtTkxNX09GRlNFVF9NQVg7CisJZWxzZQorCQlyZXMgPSBvZmZzZXQ7CisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqIFhEUiBmdW5jdGlvbnMgZm9yIGJhc2ljIE5MTSB0eXBlcworICovCitzdGF0aWMgaW5saW5lIHUzMiAqbmxtX2RlY29kZV9jb29raWUodTMyICpwLCBzdHJ1Y3QgbmxtX2Nvb2tpZSAqYykKK3sKKwl1bnNpZ25lZCBpbnQJbGVuOworCisJbGVuID0gbnRvaGwoKnArKyk7CisJCisJaWYobGVuPT0wKQorCXsKKwkJYy0+bGVuPTQ7CisJCW1lbXNldChjLT5kYXRhLCAwLCA0KTsJLyogaG9ja2V5cHV4IGJyYWluIGRhbWFnZSAqLworCX0KKwllbHNlIGlmKGxlbjw9TkxNX01BWENPT0tJRUxFTikKKwl7CisJCWMtPmxlbj1sZW47CisJCW1lbWNweShjLT5kYXRhLCBwLCBsZW4pOworCQlwKz1YRFJfUVVBRExFTihsZW4pOworCX0KKwllbHNlIAorCXsKKwkJcHJpbnRrKEtFUk5fTk9USUNFCisJCQkibG9ja2Q6IGJhZCBjb29raWUgc2l6ZSAlZCAob25seSBjb29raWVzIHVuZGVyICVkIGJ5dGVzIGFyZSBzdXBwb3J0ZWQuKVxuIiwgbGVuLCBOTE1fTUFYQ09PS0lFTEVOKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBwOworfQorCitzdGF0aWMgaW5saW5lIHUzMiAqCitubG1fZW5jb2RlX2Nvb2tpZSh1MzIgKnAsIHN0cnVjdCBubG1fY29va2llICpjKQoreworCSpwKysgPSBodG9ubChjLT5sZW4pOworCW1lbWNweShwLCBjLT5kYXRhLCBjLT5sZW4pOworCXArPVhEUl9RVUFETEVOKGMtPmxlbik7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK25sbV9kZWNvZGVfZmgodTMyICpwLCBzdHJ1Y3QgbmZzX2ZoICpmKQoreworCXVuc2lnbmVkIGludAlsZW47CisKKwlpZiAoKGxlbiA9IG50b2hsKCpwKyspKSAhPSBORlMyX0ZIU0laRSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCSJsb2NrZDogYmFkIGZoYW5kbGUgc2l6ZSAlZCAoc2hvdWxkIGJlICVkKVxuIiwKKwkJCWxlbiwgTkZTMl9GSFNJWkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZi0+c2l6ZSA9IE5GUzJfRkhTSVpFOworCW1lbXNldChmLT5kYXRhLCAwLCBzaXplb2YoZi0+ZGF0YSkpOworCW1lbWNweShmLT5kYXRhLCBwLCBORlMyX0ZIU0laRSk7CisJcmV0dXJuIHAgKyBYRFJfUVVBRExFTihORlMyX0ZIU0laRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK25sbV9lbmNvZGVfZmgodTMyICpwLCBzdHJ1Y3QgbmZzX2ZoICpmKQoreworCSpwKysgPSBodG9ubChORlMyX0ZIU0laRSk7CisJbWVtY3B5KHAsIGYtPmRhdGEsIE5GUzJfRkhTSVpFKTsKKwlyZXR1cm4gcCArIFhEUl9RVUFETEVOKE5GUzJfRkhTSVpFKTsKK30KKworLyoKKyAqIEVuY29kZSBhbmQgZGVjb2RlIG93bmVyIGhhbmRsZQorICovCitzdGF0aWMgaW5saW5lIHUzMiAqCitubG1fZGVjb2RlX29oKHUzMiAqcCwgc3RydWN0IHhkcl9uZXRvYmogKm9oKQoreworCXJldHVybiB4ZHJfZGVjb2RlX25ldG9iaihwLCBvaCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK25sbV9lbmNvZGVfb2godTMyICpwLCBzdHJ1Y3QgeGRyX25ldG9iaiAqb2gpCit7CisJcmV0dXJuIHhkcl9lbmNvZGVfbmV0b2JqKHAsIG9oKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgKgorbmxtX2RlY29kZV9sb2NrKHUzMiAqcCwgc3RydWN0IG5sbV9sb2NrICpsb2NrKQoreworCXN0cnVjdCBmaWxlX2xvY2sJKmZsID0gJmxvY2stPmZsOworCXMzMgkJCXN0YXJ0LCBsZW4sIGVuZDsKKworCWlmICghKHAgPSB4ZHJfZGVjb2RlX3N0cmluZ19pbnBsYWNlKHAsICZsb2NrLT5jYWxsZXIsCisJCQkJCSAgICAmbG9jay0+bGVuLAorCQkJCQkgICAgTkxNX01BWFNUUkxFTikpCisJIHx8ICEocCA9IG5sbV9kZWNvZGVfZmgocCwgJmxvY2stPmZoKSkKKwkgfHwgIShwID0gbmxtX2RlY29kZV9vaChwLCAmbG9jay0+b2gpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsb2Nrc19pbml0X2xvY2soZmwpOworCWZsLT5mbF9vd25lciA9IGN1cnJlbnQtPmZpbGVzOworCWZsLT5mbF9waWQgICA9IG50b2hsKCpwKyspOworCWZsLT5mbF9mbGFncyA9IEZMX1BPU0lYOworCWZsLT5mbF90eXBlICA9IEZfUkRMQ0s7CQkvKiBhcyBnb29kIGFzIGFueXRoaW5nIGVsc2UgKi8KKwlzdGFydCA9IG50b2hsKCpwKyspOworCWxlbiA9IG50b2hsKCpwKyspOworCWVuZCA9IHN0YXJ0ICsgbGVuIC0gMTsKKworCWZsLT5mbF9zdGFydCA9IHMzMl90b19sb2ZmX3Qoc3RhcnQpOworCisJaWYgKGxlbiA9PSAwIHx8IGVuZCA8IDApCisJCWZsLT5mbF9lbmQgPSBPRkZTRVRfTUFYOworCWVsc2UKKwkJZmwtPmZsX2VuZCA9IHMzMl90b19sb2ZmX3QoZW5kKTsKKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIEVuY29kZSBhIGxvY2sgYXMgcGFydCBvZiBhbiBOTE0gY2FsbAorICovCitzdGF0aWMgdTMyICoKK25sbV9lbmNvZGVfbG9jayh1MzIgKnAsIHN0cnVjdCBubG1fbG9jayAqbG9jaykKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrCSpmbCA9ICZsb2NrLT5mbDsKKwlfX3MzMgkJCXN0YXJ0LCBsZW47CisKKwlpZiAoIShwID0geGRyX2VuY29kZV9zdHJpbmcocCwgbG9jay0+Y2FsbGVyKSkKKwkgfHwgIShwID0gbmxtX2VuY29kZV9maChwLCAmbG9jay0+ZmgpKQorCSB8fCAhKHAgPSBubG1fZW5jb2RlX29oKHAsICZsb2NrLT5vaCkpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChmbC0+Zmxfc3RhcnQgPiBOTE1fT0ZGU0VUX01BWAorCSB8fCAoZmwtPmZsX2VuZCA+IE5MTV9PRkZTRVRfTUFYICYmIGZsLT5mbF9lbmQgIT0gT0ZGU0VUX01BWCkpCisJCXJldHVybiBOVUxMOworCisJc3RhcnQgPSBsb2ZmX3RfdG9fczMyKGZsLT5mbF9zdGFydCk7CisJaWYgKGZsLT5mbF9lbmQgPT0gT0ZGU0VUX01BWCkKKwkJbGVuID0gMDsKKwllbHNlCisJCWxlbiA9IGxvZmZfdF90b19zMzIoZmwtPmZsX2VuZCAtIGZsLT5mbF9zdGFydCArIDEpOworCisJKnArKyA9IGh0b25sKGZsLT5mbF9waWQpOworCSpwKysgPSBodG9ubChzdGFydCk7CisJKnArKyA9IGh0b25sKGxlbik7CisKKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIEVuY29kZSByZXN1bHQgb2YgYSBURVNUL1RFU1RfTVNHIGNhbGwKKyAqLworc3RhdGljIHUzMiAqCitubG1fZW5jb2RlX3Rlc3RyZXModTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK3sKKwlzMzIJCXN0YXJ0LCBsZW47CisKKwlpZiAoIShwID0gbmxtX2VuY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gTlVMTDsKKwkqcCsrID0gcmVzcC0+c3RhdHVzOworCisJaWYgKHJlc3AtPnN0YXR1cyA9PSBubG1fbGNrX2RlbmllZCkgeworCQlzdHJ1Y3QgZmlsZV9sb2NrCSpmbCA9ICZyZXNwLT5sb2NrLmZsOworCisJCSpwKysgPSAoZmwtPmZsX3R5cGUgPT0gRl9SRExDSyk/IHhkcl96ZXJvIDogeGRyX29uZTsKKwkJKnArKyA9IGh0b25sKGZsLT5mbF9waWQpOworCisJCS8qIEVuY29kZSBvd25lciBoYW5kbGUuICovCisJCWlmICghKHAgPSB4ZHJfZW5jb2RlX25ldG9iaihwLCAmcmVzcC0+bG9jay5vaCkpKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJc3RhcnQgPSBsb2ZmX3RfdG9fczMyKGZsLT5mbF9zdGFydCk7CisJCWlmIChmbC0+ZmxfZW5kID09IE9GRlNFVF9NQVgpCisJCQlsZW4gPSAwOworCQllbHNlCisJCQlsZW4gPSBsb2ZmX3RfdG9fczMyKGZsLT5mbF9lbmQgLSBmbC0+Zmxfc3RhcnQgKyAxKTsKKworCQkqcCsrID0gaHRvbmwoc3RhcnQpOworCQkqcCsrID0gaHRvbmwobGVuKTsKKwl9CisKKwlyZXR1cm4gcDsKK30KKworCisvKgorICogRmlyc3QsIHRoZSBzZXJ2ZXIgc2lkZSBYRFIgZnVuY3Rpb25zCisgKi8KK2ludAorbmxtc3ZjX2RlY29kZV90ZXN0YXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQoreworCXUzMglleGNsdXNpdmU7CisKKwlpZiAoIShwID0gbmxtX2RlY29kZV9jb29raWUocCwgJmFyZ3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gMDsKKworCWV4Y2x1c2l2ZSA9IG50b2hsKCpwKyspOworCWlmICghKHAgPSBubG1fZGVjb2RlX2xvY2socCwgJmFyZ3AtPmxvY2spKSkKKwkJcmV0dXJuIDA7CisJaWYgKGV4Y2x1c2l2ZSkKKwkJYXJncC0+bG9jay5mbC5mbF90eXBlID0gRl9XUkxDSzsKKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmxtc3ZjX2VuY29kZV90ZXN0cmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCit7CisJaWYgKCEocCA9IG5sbV9lbmNvZGVfdGVzdHJlcyhwLCByZXNwKSkpCisJCXJldHVybiAwOworCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmxtc3ZjX2RlY29kZV9sb2NrYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQoreworCXUzMglleGNsdXNpdmU7CisKKwlpZiAoIShwID0gbmxtX2RlY29kZV9jb29raWUocCwgJmFyZ3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gMDsKKwlhcmdwLT5ibG9jayAgPSBudG9obCgqcCsrKTsKKwlleGNsdXNpdmUgICAgPSBudG9obCgqcCsrKTsKKwlpZiAoIShwID0gbmxtX2RlY29kZV9sb2NrKHAsICZhcmdwLT5sb2NrKSkpCisJCXJldHVybiAwOworCWlmIChleGNsdXNpdmUpCisJCWFyZ3AtPmxvY2suZmwuZmxfdHlwZSA9IEZfV1JMQ0s7CisJYXJncC0+cmVjbGFpbSA9IG50b2hsKCpwKyspOworCWFyZ3AtPnN0YXRlICAgPSBudG9obCgqcCsrKTsKKwlhcmdwLT5tb25pdG9yID0gMTsJCS8qIG1vbml0b3IgY2xpZW50IGJ5IGRlZmF1bHQgKi8KKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmxtc3ZjX2RlY29kZV9jYW5jYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQoreworCXUzMglleGNsdXNpdmU7CisKKwlpZiAoIShwID0gbmxtX2RlY29kZV9jb29raWUocCwgJmFyZ3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gMDsKKwlhcmdwLT5ibG9jayA9IG50b2hsKCpwKyspOworCWV4Y2x1c2l2ZSA9IG50b2hsKCpwKyspOworCWlmICghKHAgPSBubG1fZGVjb2RlX2xvY2socCwgJmFyZ3AtPmxvY2spKSkKKwkJcmV0dXJuIDA7CisJaWYgKGV4Y2x1c2l2ZSkKKwkJYXJncC0+bG9jay5mbC5mbF90eXBlID0gRl9XUkxDSzsKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbXN2Y19kZWNvZGVfdW5sb2NrYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQoreworCWlmICghKHAgPSBubG1fZGVjb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkKKwkgfHwgIShwID0gbmxtX2RlY29kZV9sb2NrKHAsICZhcmdwLT5sb2NrKSkpCisJCXJldHVybiAwOworCWFyZ3AtPmxvY2suZmwuZmxfdHlwZSA9IEZfVU5MQ0s7CisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CitubG1zdmNfZGVjb2RlX3NoYXJlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQoreworCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOworCisJbWVtc2V0KGxvY2ssIDAsIHNpemVvZigqbG9jaykpOworCWxvY2tzX2luaXRfbG9jaygmbG9jay0+ZmwpOworCWxvY2stPmZsLmZsX3BpZCA9IH4odTMyKSAwOworCisJaWYgKCEocCA9IG5sbV9kZWNvZGVfY29va2llKHAsICZhcmdwLT5jb29raWUpKQorCSB8fCAhKHAgPSB4ZHJfZGVjb2RlX3N0cmluZ19pbnBsYWNlKHAsICZsb2NrLT5jYWxsZXIsCisJCQkJCSAgICAmbG9jay0+bGVuLCBOTE1fTUFYU1RSTEVOKSkKKwkgfHwgIShwID0gbmxtX2RlY29kZV9maChwLCAmbG9jay0+ZmgpKQorCSB8fCAhKHAgPSBubG1fZGVjb2RlX29oKHAsICZsb2NrLT5vaCkpKQorCQlyZXR1cm4gMDsKKwlhcmdwLT5mc21fbW9kZSA9IG50b2hsKCpwKyspOworCWFyZ3AtPmZzbV9hY2Nlc3MgPSBudG9obCgqcCsrKTsKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbXN2Y19lbmNvZGVfc2hhcmVyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK3sKKwlpZiAoIShwID0gbmxtX2VuY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gMDsKKwkqcCsrID0gcmVzcC0+c3RhdHVzOworCSpwKysgPSB4ZHJfemVybzsJCS8qIHNlcXVlbmNlIGFyZ3VtZW50ICovCisJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CitubG1zdmNfZW5jb2RlX3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQoreworCWlmICghKHAgPSBubG1fZW5jb2RlX2Nvb2tpZShwLCAmcmVzcC0+Y29va2llKSkpCisJCXJldHVybiAwOworCSpwKysgPSByZXNwLT5zdGF0dXM7CisJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CitubG1zdmNfZGVjb2RlX25vdGlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fYXJncyAqYXJncCkKK3sKKwlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKKworCWlmICghKHAgPSB4ZHJfZGVjb2RlX3N0cmluZ19pbnBsYWNlKHAsICZsb2NrLT5jYWxsZXIsCisJCQkJCSAgICAmbG9jay0+bGVuLCBOTE1fTUFYU1RSTEVOKSkpCisJCXJldHVybiAwOworCWFyZ3AtPnN0YXRlID0gbnRvaGwoKnArKyk7CisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CitubG1zdmNfZGVjb2RlX3JlYm9vdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVib290ICphcmdwKQoreworCWlmICghKHAgPSB4ZHJfZGVjb2RlX3N0cmluZ19pbnBsYWNlKHAsICZhcmdwLT5tb24sICZhcmdwLT5sZW4sIFNNX01BWFNUUkxFTikpKQorCQlyZXR1cm4gMDsKKwlhcmdwLT5zdGF0ZSA9IG50b2hsKCpwKyspOworCS8qIFByZXNlcnZlIHRoZSBhZGRyZXNzIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworCWFyZ3AtPmFkZHIgPSAqcCsrOworCWFyZ3AtPnZlcnMgPSAqcCsrOworCWFyZ3AtPnByb3RvID0gKnArKzsKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbXN2Y19kZWNvZGVfcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCit7CisJaWYgKCEocCA9IG5sbV9kZWNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKKwkJcmV0dXJuIDA7CisJcmVzcC0+c3RhdHVzID0gbnRvaGwoKnArKyk7CisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CitubG1zdmNfZGVjb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCB2b2lkICpkdW1teSkKK3sKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbXN2Y19lbmNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHZvaWQgKmR1bW15KQoreworCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKKy8qCisgKiBOb3csIHRoZSBjbGllbnQgc2lkZSBYRFIgZnVuY3Rpb25zCisgKi8KKyNpZmRlZiBOTE1DTE5UX1NVUFBPUlRfU0hBUkVTCitzdGF0aWMgaW50CitubG1jbHRfZGVjb2RlX3ZvaWQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgdm9pZCAqcHRyKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK25sbWNsdF9lbmNvZGVfdGVzdGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCit7CisJc3RydWN0IG5sbV9sb2NrCSpsb2NrID0gJmFyZ3AtPmxvY2s7CisKKwlpZiAoIShwID0gbmxtX2VuY29kZV9jb29raWUocCwgJmFyZ3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gLUVJTzsKKwkqcCsrID0gKGxvY2stPmZsLmZsX3R5cGUgPT0gRl9XUkxDSyk/IHhkcl9vbmUgOiB4ZHJfemVybzsKKwlpZiAoIShwID0gbmxtX2VuY29kZV9sb2NrKHAsIGxvY2spKSkKKwkJcmV0dXJuIC1FSU87CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitubG1jbHRfZGVjb2RlX3Rlc3RyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCit7CisJaWYgKCEocCA9IG5sbV9kZWNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKKwkJcmV0dXJuIC1FSU87CisJcmVzcC0+c3RhdHVzID0gbnRvaGwoKnArKyk7CisJaWYgKHJlc3AtPnN0YXR1cyA9PSBOTE1fTENLX0RFTklFRCkgeworCQlzdHJ1Y3QgZmlsZV9sb2NrCSpmbCA9ICZyZXNwLT5sb2NrLmZsOworCQl1MzIJCQlleGNsOworCQlzMzIJCQlzdGFydCwgbGVuLCBlbmQ7CisKKwkJbWVtc2V0KCZyZXNwLT5sb2NrLCAwLCBzaXplb2YocmVzcC0+bG9jaykpOworCQlsb2Nrc19pbml0X2xvY2soZmwpOworCQlleGNsID0gbnRvaGwoKnArKyk7CisJCWZsLT5mbF9waWQgPSBudG9obCgqcCsrKTsKKwkJaWYgKCEocCA9IG5sbV9kZWNvZGVfb2gocCwgJnJlc3AtPmxvY2sub2gpKSkKKwkJCXJldHVybiAtRUlPOworCisJCWZsLT5mbF9mbGFncyA9IEZMX1BPU0lYOworCQlmbC0+ZmxfdHlwZSAgPSBleGNsPyBGX1dSTENLIDogRl9SRExDSzsKKwkJc3RhcnQgPSBudG9obCgqcCsrKTsKKwkJbGVuID0gbnRvaGwoKnArKyk7CisJCWVuZCA9IHN0YXJ0ICsgbGVuIC0gMTsKKworCQlmbC0+Zmxfc3RhcnQgPSBzMzJfdG9fbG9mZl90KHN0YXJ0KTsKKwkJaWYgKGxlbiA9PSAwIHx8IGVuZCA8IDApCisJCQlmbC0+ZmxfZW5kID0gT0ZGU0VUX01BWDsKKwkJZWxzZQorCQkJZmwtPmZsX2VuZCA9IHMzMl90b19sb2ZmX3QoZW5kKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorbmxtY2x0X2VuY29kZV9sb2NrYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK3sKKwlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKKworCWlmICghKHAgPSBubG1fZW5jb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkpCisJCXJldHVybiAtRUlPOworCSpwKysgPSBhcmdwLT5ibG9jaz8geGRyX29uZSA6IHhkcl96ZXJvOworCSpwKysgPSAobG9jay0+ZmwuZmxfdHlwZSA9PSBGX1dSTENLKT8geGRyX29uZSA6IHhkcl96ZXJvOworCWlmICghKHAgPSBubG1fZW5jb2RlX2xvY2socCwgbG9jaykpKQorCQlyZXR1cm4gLUVJTzsKKwkqcCsrID0gYXJncC0+cmVjbGFpbT8geGRyX29uZSA6IHhkcl96ZXJvOworCSpwKysgPSBodG9ubChhcmdwLT5zdGF0ZSk7CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitubG1jbHRfZW5jb2RlX2NhbmNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQoreworCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOworCisJaWYgKCEocCA9IG5sbV9lbmNvZGVfY29va2llKHAsICZhcmdwLT5jb29raWUpKSkKKwkJcmV0dXJuIC1FSU87CisJKnArKyA9IGFyZ3AtPmJsb2NrPyB4ZHJfb25lIDogeGRyX3plcm87CisJKnArKyA9IChsb2NrLT5mbC5mbF90eXBlID09IEZfV1JMQ0spPyB4ZHJfb25lIDogeGRyX3plcm87CisJaWYgKCEocCA9IG5sbV9lbmNvZGVfbG9jayhwLCBsb2NrKSkpCisJCXJldHVybiAtRUlPOworCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmxtY2x0X2VuY29kZV91bmxvY2thcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQoreworCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOworCisJaWYgKCEocCA9IG5sbV9lbmNvZGVfY29va2llKHAsICZhcmdwLT5jb29raWUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKCEocCA9IG5sbV9lbmNvZGVfbG9jayhwLCBsb2NrKSkpCisJCXJldHVybiAtRUlPOworCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmxtY2x0X2VuY29kZV9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCit7CisJaWYgKCEocCA9IG5sbV9lbmNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKKwkJcmV0dXJuIC1FSU87CisJKnArKyA9IHJlc3AtPnN0YXR1czsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25sbWNsdF9lbmNvZGVfdGVzdHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK3sKKwlpZiAoIShwID0gbmxtX2VuY29kZV90ZXN0cmVzKHAsIHJlc3ApKSkKKwkJcmV0dXJuIC1FSU87CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitubG1jbHRfZGVjb2RlX3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK3sKKwlpZiAoIShwID0gbmxtX2RlY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gLUVJTzsKKwlyZXNwLT5zdGF0dXMgPSBudG9obCgqcCsrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEJ1ZmZlciByZXF1aXJlbWVudHMgZm9yIE5MTQorICovCisjZGVmaW5lIE5MTV92b2lkX3N6CQkwCisjZGVmaW5lIE5MTV9jb29raWVfc3oJCTErWERSX1FVQURMRU4oTkxNX01BWENPT0tJRUxFTikKKyNkZWZpbmUgTkxNX2NhbGxlcl9zegkJMStYRFJfUVVBRExFTihzaXplb2Yoc3lzdGVtX3V0c25hbWUubm9kZW5hbWUpKQorI2RlZmluZSBOTE1fbmV0b2JqX3N6CQkxK1hEUl9RVUFETEVOKFhEUl9NQVhfTkVUT0JKKQorLyogI2RlZmluZSBOTE1fb3duZXJfc3oJCTErWERSX1FVQURMRU4oTkxNX01BWE9XTkVSKSAqLworI2RlZmluZSBOTE1fZmhhbmRsZV9zegkJMStYRFJfUVVBRExFTihORlMyX0ZIU0laRSkKKyNkZWZpbmUgTkxNX2xvY2tfc3oJCTMrTkxNX2NhbGxlcl9zeitOTE1fbmV0b2JqX3N6K05MTV9maGFuZGxlX3N6CisjZGVmaW5lIE5MTV9ob2xkZXJfc3oJCTQrTkxNX25ldG9ial9zegorCisjZGVmaW5lIE5MTV90ZXN0YXJnc19zegkJTkxNX2Nvb2tpZV9zeisxK05MTV9sb2NrX3N6CisjZGVmaW5lIE5MTV9sb2NrYXJnc19zegkJTkxNX2Nvb2tpZV9zeis0K05MTV9sb2NrX3N6CisjZGVmaW5lIE5MTV9jYW5jYXJnc19zegkJTkxNX2Nvb2tpZV9zeisyK05MTV9sb2NrX3N6CisjZGVmaW5lIE5MTV91bmxvY2thcmdzX3N6CU5MTV9jb29raWVfc3orTkxNX2xvY2tfc3oKKworI2RlZmluZSBOTE1fdGVzdHJlc19zegkJTkxNX2Nvb2tpZV9zeisxK05MTV9ob2xkZXJfc3oKKyNkZWZpbmUgTkxNX3Jlc19zegkJTkxNX2Nvb2tpZV9zeisxCisjZGVmaW5lIE5MTV9ub3JlcF9zegkJMAorCisjaWZuZGVmIE1BWAorIyBkZWZpbmUgTUFYKGEsIGIpCQkoKChhKSA+IChiKSk/IChhKSA6IChiKSkKKyNlbmRpZgorCisvKgorICogRm9yIE5MTSwgYSB2b2lkIHByb2NlZHVyZSByZWFsbHkgcmV0dXJucyBub3RoaW5nCisgKi8KKyNkZWZpbmUgbmxtY2x0X2RlY29kZV9ub3JlcAlOVUxMCisKKyNkZWZpbmUgUFJPQyhwcm9jLCBhcmd0eXBlLCByZXN0eXBlKQlcCitbTkxNUFJPQ18jI3Byb2NdID0gewkJCQkJCQlcCisJLnBfcHJvYyAgICAgID0gTkxNUFJPQ18jI3Byb2MsCQkJCQlcCisJLnBfZW5jb2RlICAgID0gKGt4ZHJwcm9jX3QpIG5sbWNsdF9lbmNvZGVfIyNhcmd0eXBlLAkJXAorCS5wX2RlY29kZSAgICA9IChreGRycHJvY190KSBubG1jbHRfZGVjb2RlXyMjcmVzdHlwZSwJCVwKKwkucF9idWZzaXogICAgPSBNQVgoTkxNXyMjYXJndHlwZSMjX3N6LCBOTE1fIyNyZXN0eXBlIyNfc3opIDw8IDIJXAorCX0KKworc3RhdGljIHN0cnVjdCBycGNfcHJvY2luZm8JbmxtX3Byb2NlZHVyZXNbXSA9IHsKKyAgICBQUk9DKFRFU1QsCQl0ZXN0YXJncywJdGVzdHJlcyksCisgICAgUFJPQyhMT0NLLAkJbG9ja2FyZ3MsCXJlcyksCisgICAgUFJPQyhDQU5DRUwsCWNhbmNhcmdzLAlyZXMpLAorICAgIFBST0MoVU5MT0NLLAl1bmxvY2thcmdzLAlyZXMpLAorICAgIFBST0MoR1JBTlRFRCwJdGVzdGFyZ3MsCXJlcyksCisgICAgUFJPQyhURVNUX01TRywJdGVzdGFyZ3MsCW5vcmVwKSwKKyAgICBQUk9DKExPQ0tfTVNHLAlsb2NrYXJncywJbm9yZXApLAorICAgIFBST0MoQ0FOQ0VMX01TRywJY2FuY2FyZ3MsCW5vcmVwKSwKKyAgICBQUk9DKFVOTE9DS19NU0csCXVubG9ja2FyZ3MsCW5vcmVwKSwKKyAgICBQUk9DKEdSQU5URURfTVNHLAl0ZXN0YXJncywJbm9yZXApLAorICAgIFBST0MoVEVTVF9SRVMsCXRlc3RyZXMsCW5vcmVwKSwKKyAgICBQUk9DKExPQ0tfUkVTLAlyZXMsCQlub3JlcCksCisgICAgUFJPQyhDQU5DRUxfUkVTLAlyZXMsCQlub3JlcCksCisgICAgUFJPQyhVTkxPQ0tfUkVTLAlyZXMsCQlub3JlcCksCisgICAgUFJPQyhHUkFOVEVEX1JFUywJcmVzLAkJbm9yZXApLAorI2lmZGVmIE5MTUNMTlRfU1VQUE9SVF9TSEFSRVMKKyAgICBQUk9DKFNIQVJFLAkJc2hhcmVhcmdzLAlzaGFyZXJlcyksCisgICAgUFJPQyhVTlNIQVJFLAlzaGFyZWFyZ3MsCXNoYXJlcmVzKSwKKyAgICBQUk9DKE5NX0xPQ0ssCWxvY2thcmdzLAlyZXMpLAorICAgIFBST0MoRlJFRV9BTEwsCW5vdGlmeSwJCXZvaWQpLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHJwY192ZXJzaW9uCW5sbV92ZXJzaW9uMSA9IHsKKwkJLm51bWJlcgkJPSAxLAorCQkubnJwcm9jcwk9IDE2LAorCQkucHJvY3MJCT0gbmxtX3Byb2NlZHVyZXMsCit9OworCitzdGF0aWMgc3RydWN0IHJwY192ZXJzaW9uCW5sbV92ZXJzaW9uMyA9IHsKKwkJLm51bWJlcgkJPSAzLAorCQkubnJwcm9jcwk9IDI0LAorCQkucHJvY3MJCT0gbmxtX3Byb2NlZHVyZXMsCit9OworCisjaWZkZWYgCUNPTkZJR19MT0NLRF9WNAorZXh0ZXJuIHN0cnVjdCBycGNfdmVyc2lvbiBubG1fdmVyc2lvbjQ7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbiAqCW5sbV92ZXJzaW9uc1tdID0geworCVsxXSA9ICZubG1fdmVyc2lvbjEsCisJWzNdID0gJm5sbV92ZXJzaW9uMywKKyNpZmRlZiAJQ09ORklHX0xPQ0tEX1Y0CisJWzRdID0gJm5sbV92ZXJzaW9uNCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBycGNfc3RhdAkJbmxtX3N0YXRzOworCitzdHJ1Y3QgcnBjX3Byb2dyYW0JCW5sbV9wcm9ncmFtID0geworCQkubmFtZQkJPSAibG9ja2QiLAorCQkubnVtYmVyCQk9IE5MTV9QUk9HUkFNLAorCQkubnJ2ZXJzCQk9IHNpemVvZihubG1fdmVyc2lvbnMpIC8gc2l6ZW9mKG5sbV92ZXJzaW9uc1swXSksCisJCS52ZXJzaW9uCT0gbmxtX3ZlcnNpb25zLAorCQkuc3RhdHMJCT0gJm5sbV9zdGF0cywKK307CisKKyNpZmRlZiBSUENfREVCVUcKK2NvbnN0IGNoYXIgKm5sbWRiZ19jb29raWUyYShjb25zdCBzdHJ1Y3QgbmxtX2Nvb2tpZSAqY29va2llKQoreworCS8qCisJICogV2UgY2FuIGdldCBhd2F5IHdpdGggYSBzdGF0aWMgYnVmZmVyIGJlY2F1c2Ugd2UncmUgb25seQorCSAqIGNhbGxlZCB3aXRoIEJLTCBoZWxkLgorCSAqLworCXN0YXRpYyBjaGFyIGJ1ZlsyKk5MTV9NQVhDT09LSUVMRU4rMV07CisJaW50IGk7CisJaW50IGxlbiA9IHNpemVvZihidWYpOworCWNoYXIgKnAgPSBidWY7CisKKwlsZW4tLTsJLyogYWxsb3cgZm9yIHRyYWlsaW5nIFwwICovCisJaWYgKGxlbiA8IDMpCisJCXJldHVybiAiPz8/IjsKKwlmb3IgKGkgPSAwIDsgaSA8IGNvb2tpZS0+bGVuIDsgaSsrKSB7CisJCWlmIChsZW4gPCAyKSB7CisJCQlzdHJjcHkocC0zLCAiLi4uIik7CisJCQlicmVhazsKKwkJfQorCQlzcHJpbnRmKHAsICIlMDJ4IiwgY29va2llLT5kYXRhW2ldKTsKKwkJcCArPSAyOworCQlsZW4gLT0gMjsKKwl9CisJKnAgPSAnXDAnOworCisJcmV0dXJuIGJ1ZjsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QveGRyNC5jIGIvZnMvbG9ja2QveGRyNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNGQ2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9sb2NrZC94ZHI0LmMKQEAgLTAsMCArMSw1ODAgQEAKKy8qCisgKiBsaW51eC9mcy9sb2NrZC94ZHI0LmMKKyAqCisgKiBYRFIgc3VwcG9ydCBmb3IgbG9ja2QgYW5kIHRoZSBsb2NrIGNsaWVudC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIFRyb25kIE15a2xlYnVzdCA8dHJvbmQubXlrbGVidXN0QGZ5cy51aW8ubm8+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvbmZzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMveGRyLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N0YXRzLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9zbV9pbnRlci5oPgorCisjZGVmaW5lIE5MTURCR19GQUNJTElUWQkJTkxNREJHX1hEUgorCitzdGF0aWMgaW5saW5lIGxvZmZfdAorczY0X3RvX2xvZmZfdChfX3M2NCBvZmZzZXQpCit7CisJcmV0dXJuIChsb2ZmX3Qpb2Zmc2V0OworfQorCisKK3N0YXRpYyBpbmxpbmUgczY0Citsb2ZmX3RfdG9fczY0KGxvZmZfdCBvZmZzZXQpCit7CisJczY0IHJlczsKKwlpZiAob2Zmc2V0ID4gTkxNNF9PRkZTRVRfTUFYKQorCQlyZXMgPSBOTE00X09GRlNFVF9NQVg7CisJZWxzZSBpZiAob2Zmc2V0IDwgLU5MTTRfT0ZGU0VUX01BWCkKKwkJcmVzID0gLU5MTTRfT0ZGU0VUX01BWDsKKwllbHNlCisJCXJlcyA9IG9mZnNldDsKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogWERSIGZ1bmN0aW9ucyBmb3IgYmFzaWMgTkxNIHR5cGVzCisgKi8KK3N0YXRpYyB1MzIgKgorbmxtNF9kZWNvZGVfY29va2llKHUzMiAqcCwgc3RydWN0IG5sbV9jb29raWUgKmMpCit7CisJdW5zaWduZWQgaW50CWxlbjsKKworCWxlbiA9IG50b2hsKCpwKyspOworCQorCWlmKGxlbj09MCkKKwl7CisJCWMtPmxlbj00OworCQltZW1zZXQoYy0+ZGF0YSwgMCwgNCk7CS8qIGhvY2tleXB1eCBicmFpbiBkYW1hZ2UgKi8KKwl9CisJZWxzZSBpZihsZW48PU5MTV9NQVhDT09LSUVMRU4pCisJeworCQljLT5sZW49bGVuOworCQltZW1jcHkoYy0+ZGF0YSwgcCwgbGVuKTsKKwkJcCs9WERSX1FVQURMRU4obGVuKTsKKwl9CisJZWxzZSAKKwl7CisJCXByaW50ayhLRVJOX05PVElDRQorCQkJImxvY2tkOiBiYWQgY29va2llIHNpemUgJWQgKG9ubHkgY29va2llcyB1bmRlciAlZCBieXRlcyBhcmUgc3VwcG9ydGVkLilcbiIsIGxlbiwgTkxNX01BWENPT0tJRUxFTik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gcDsKK30KKworc3RhdGljIHUzMiAqCitubG00X2VuY29kZV9jb29raWUodTMyICpwLCBzdHJ1Y3QgbmxtX2Nvb2tpZSAqYykKK3sKKwkqcCsrID0gaHRvbmwoYy0+bGVuKTsKKwltZW1jcHkocCwgYy0+ZGF0YSwgYy0+bGVuKTsKKwlwKz1YRFJfUVVBRExFTihjLT5sZW4pOworCXJldHVybiBwOworfQorCitzdGF0aWMgdTMyICoKK25sbTRfZGVjb2RlX2ZoKHUzMiAqcCwgc3RydWN0IG5mc19maCAqZikKK3sKKwltZW1zZXQoZi0+ZGF0YSwgMCwgc2l6ZW9mKGYtPmRhdGEpKTsKKwlmLT5zaXplID0gbnRvaGwoKnArKyk7CisJaWYgKGYtPnNpemUgPiBORlNfTUFYRkhTSVpFKSB7CisJCXByaW50ayhLRVJOX05PVElDRQorCQkJImxvY2tkOiBiYWQgZmhhbmRsZSBzaXplICVkIChzaG91bGQgYmUgPD0lZClcbiIsCisJCQlmLT5zaXplLCBORlNfTUFYRkhTSVpFKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorICAgICAgCW1lbWNweShmLT5kYXRhLCBwLCBmLT5zaXplKTsKKwlyZXR1cm4gcCArIFhEUl9RVUFETEVOKGYtPnNpemUpOworfQorCitzdGF0aWMgdTMyICoKK25sbTRfZW5jb2RlX2ZoKHUzMiAqcCwgc3RydWN0IG5mc19maCAqZikKK3sKKwkqcCsrID0gaHRvbmwoZi0+c2l6ZSk7CisJaWYgKGYtPnNpemUpIHBbWERSX1FVQURMRU4oZi0+c2l6ZSktMV0gPSAwOyAvKiBkb24ndCBsZWFrIGFueXRoaW5nICovCisJbWVtY3B5KHAsIGYtPmRhdGEsIGYtPnNpemUpOworCXJldHVybiBwICsgWERSX1FVQURMRU4oZi0+c2l6ZSk7Cit9CisKKy8qCisgKiBFbmNvZGUgYW5kIGRlY29kZSBvd25lciBoYW5kbGUKKyAqLworc3RhdGljIHUzMiAqCitubG00X2RlY29kZV9vaCh1MzIgKnAsIHN0cnVjdCB4ZHJfbmV0b2JqICpvaCkKK3sKKwlyZXR1cm4geGRyX2RlY29kZV9uZXRvYmoocCwgb2gpOworfQorCitzdGF0aWMgdTMyICoKK25sbTRfZW5jb2RlX29oKHUzMiAqcCwgc3RydWN0IHhkcl9uZXRvYmogKm9oKQoreworCXJldHVybiB4ZHJfZW5jb2RlX25ldG9iaihwLCBvaCk7Cit9CisKK3N0YXRpYyB1MzIgKgorbmxtNF9kZWNvZGVfbG9jayh1MzIgKnAsIHN0cnVjdCBubG1fbG9jayAqbG9jaykKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrCSpmbCA9ICZsb2NrLT5mbDsKKwlfX3M2NAkJCWxlbiwgc3RhcnQsIGVuZDsKKworCWlmICghKHAgPSB4ZHJfZGVjb2RlX3N0cmluZ19pbnBsYWNlKHAsICZsb2NrLT5jYWxsZXIsCisJCQkJCSAgICAmbG9jay0+bGVuLCBOTE1fTUFYU1RSTEVOKSkKKwkgfHwgIShwID0gbmxtNF9kZWNvZGVfZmgocCwgJmxvY2stPmZoKSkKKwkgfHwgIShwID0gbmxtNF9kZWNvZGVfb2gocCwgJmxvY2stPm9oKSkpCisJCXJldHVybiBOVUxMOworCisJbG9ja3NfaW5pdF9sb2NrKGZsKTsKKwlmbC0+Zmxfb3duZXIgPSBjdXJyZW50LT5maWxlczsKKwlmbC0+ZmxfcGlkICAgPSBudG9obCgqcCsrKTsKKwlmbC0+ZmxfZmxhZ3MgPSBGTF9QT1NJWDsKKwlmbC0+ZmxfdHlwZSAgPSBGX1JETENLOwkJLyogYXMgZ29vZCBhcyBhbnl0aGluZyBlbHNlICovCisJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJnN0YXJ0KTsKKwlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmbGVuKTsKKwllbmQgPSBzdGFydCArIGxlbiAtIDE7CisKKwlmbC0+Zmxfc3RhcnQgPSBzNjRfdG9fbG9mZl90KHN0YXJ0KTsKKworCWlmIChsZW4gPT0gMCB8fCBlbmQgPCAwKQorCQlmbC0+ZmxfZW5kID0gT0ZGU0VUX01BWDsKKwllbHNlCisJCWZsLT5mbF9lbmQgPSBzNjRfdG9fbG9mZl90KGVuZCk7CisJcmV0dXJuIHA7Cit9CisKKy8qCisgKiBFbmNvZGUgYSBsb2NrIGFzIHBhcnQgb2YgYW4gTkxNIGNhbGwKKyAqLworc3RhdGljIHUzMiAqCitubG00X2VuY29kZV9sb2NrKHUzMiAqcCwgc3RydWN0IG5sbV9sb2NrICpsb2NrKQoreworCXN0cnVjdCBmaWxlX2xvY2sJKmZsID0gJmxvY2stPmZsOworCV9fczY0CQkJc3RhcnQsIGxlbjsKKworCWlmICghKHAgPSB4ZHJfZW5jb2RlX3N0cmluZyhwLCBsb2NrLT5jYWxsZXIpKQorCSB8fCAhKHAgPSBubG00X2VuY29kZV9maChwLCAmbG9jay0+ZmgpKQorCSB8fCAhKHAgPSBubG00X2VuY29kZV9vaChwLCAmbG9jay0+b2gpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZmwtPmZsX3N0YXJ0ID4gTkxNNF9PRkZTRVRfTUFYCisJIHx8IChmbC0+ZmxfZW5kID4gTkxNNF9PRkZTRVRfTUFYICYmIGZsLT5mbF9lbmQgIT0gT0ZGU0VUX01BWCkpCisJCXJldHVybiBOVUxMOworCisJKnArKyA9IGh0b25sKGZsLT5mbF9waWQpOworCisJc3RhcnQgPSBsb2ZmX3RfdG9fczY0KGZsLT5mbF9zdGFydCk7CisJaWYgKGZsLT5mbF9lbmQgPT0gT0ZGU0VUX01BWCkKKwkJbGVuID0gMDsKKwllbHNlCisJCWxlbiA9IGxvZmZfdF90b19zNjQoZmwtPmZsX2VuZCAtIGZsLT5mbF9zdGFydCArIDEpOworCisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgc3RhcnQpOworCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGxlbik7CisKKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIEVuY29kZSByZXN1bHQgb2YgYSBURVNUL1RFU1RfTVNHIGNhbGwKKyAqLworc3RhdGljIHUzMiAqCitubG00X2VuY29kZV90ZXN0cmVzKHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCit7CisJczY0CQlzdGFydCwgbGVuOworCisJZHByaW50aygieGRyOiBiZWZvcmUgZW5jb2RlX3Rlc3RyZXMgKHAgJXAgcmVzcCAlcClcbiIsIHAsIHJlc3ApOworCWlmICghKHAgPSBubG00X2VuY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gTlVMTDsKKwkqcCsrID0gcmVzcC0+c3RhdHVzOworCisJaWYgKHJlc3AtPnN0YXR1cyA9PSBubG1fbGNrX2RlbmllZCkgeworCQlzdHJ1Y3QgZmlsZV9sb2NrCSpmbCA9ICZyZXNwLT5sb2NrLmZsOworCisJCSpwKysgPSAoZmwtPmZsX3R5cGUgPT0gRl9SRExDSyk/IHhkcl96ZXJvIDogeGRyX29uZTsKKwkJKnArKyA9IGh0b25sKGZsLT5mbF9waWQpOworCisJCS8qIEVuY29kZSBvd25lciBoYW5kbGUuICovCisJCWlmICghKHAgPSB4ZHJfZW5jb2RlX25ldG9iaihwLCAmcmVzcC0+bG9jay5vaCkpKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJc3RhcnQgPSBsb2ZmX3RfdG9fczY0KGZsLT5mbF9zdGFydCk7CisJCWlmIChmbC0+ZmxfZW5kID09IE9GRlNFVF9NQVgpCisJCQlsZW4gPSAwOworCQllbHNlCisJCQlsZW4gPSBsb2ZmX3RfdG9fczY0KGZsLT5mbF9lbmQgLSBmbC0+Zmxfc3RhcnQgKyAxKTsKKwkJCisJCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIHN0YXJ0KTsKKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgbGVuKTsKKwkJZHByaW50aygieGRyOiBlbmNvZGVfdGVzdHJlcyAoc3RhdHVzICVkIHBpZCAlZCB0eXBlICVkIHN0YXJ0ICVMZCBlbmQgJUxkKVxuIiwKKwkJCXJlc3AtPnN0YXR1cywgZmwtPmZsX3BpZCwgZmwtPmZsX3R5cGUsCisJCQkobG9uZyBsb25nKWZsLT5mbF9zdGFydCwgIChsb25nIGxvbmcpZmwtPmZsX2VuZCk7CisJfQorCisJZHByaW50aygieGRyOiBhZnRlciBlbmNvZGVfdGVzdHJlcyAocCAlcCByZXNwICVwKVxuIiwgcCwgcmVzcCk7CisJcmV0dXJuIHA7Cit9CisKKworLyoKKyAqIEZpcnN0LCB0aGUgc2VydmVyIHNpZGUgWERSIGZ1bmN0aW9ucworICovCitpbnQKK25sbTRzdmNfZGVjb2RlX3Rlc3RhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCit7CisJdTMyCWV4Y2x1c2l2ZTsKKworCWlmICghKHAgPSBubG00X2RlY29kZV9jb29raWUocCwgJmFyZ3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gMDsKKworCWV4Y2x1c2l2ZSA9IG50b2hsKCpwKyspOworCWlmICghKHAgPSBubG00X2RlY29kZV9sb2NrKHAsICZhcmdwLT5sb2NrKSkpCisJCXJldHVybiAwOworCWlmIChleGNsdXNpdmUpCisJCWFyZ3AtPmxvY2suZmwuZmxfdHlwZSA9IEZfV1JMQ0s7CisKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbTRzdmNfZW5jb2RlX3Rlc3RyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK3sKKwlpZiAoIShwID0gbmxtNF9lbmNvZGVfdGVzdHJlcyhwLCByZXNwKSkpCisJCXJldHVybiAwOworCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmxtNHN2Y19kZWNvZGVfbG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK3sKKwl1MzIJZXhjbHVzaXZlOworCisJaWYgKCEocCA9IG5sbTRfZGVjb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkpCisJCXJldHVybiAwOworCWFyZ3AtPmJsb2NrICA9IG50b2hsKCpwKyspOworCWV4Y2x1c2l2ZSAgICA9IG50b2hsKCpwKyspOworCWlmICghKHAgPSBubG00X2RlY29kZV9sb2NrKHAsICZhcmdwLT5sb2NrKSkpCisJCXJldHVybiAwOworCWlmIChleGNsdXNpdmUpCisJCWFyZ3AtPmxvY2suZmwuZmxfdHlwZSA9IEZfV1JMQ0s7CisJYXJncC0+cmVjbGFpbSA9IG50b2hsKCpwKyspOworCWFyZ3AtPnN0YXRlICAgPSBudG9obCgqcCsrKTsKKwlhcmdwLT5tb25pdG9yID0gMTsJCS8qIG1vbml0b3IgY2xpZW50IGJ5IGRlZmF1bHQgKi8KKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmxtNHN2Y19kZWNvZGVfY2FuY2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK3sKKwl1MzIJZXhjbHVzaXZlOworCisJaWYgKCEocCA9IG5sbTRfZGVjb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkpCisJCXJldHVybiAwOworCWFyZ3AtPmJsb2NrID0gbnRvaGwoKnArKyk7CisJZXhjbHVzaXZlID0gbnRvaGwoKnArKyk7CisJaWYgKCEocCA9IG5sbTRfZGVjb2RlX2xvY2socCwgJmFyZ3AtPmxvY2spKSkKKwkJcmV0dXJuIDA7CisJaWYgKGV4Y2x1c2l2ZSkKKwkJYXJncC0+bG9jay5mbC5mbF90eXBlID0gRl9XUkxDSzsKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbTRzdmNfZGVjb2RlX3VubG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK3sKKwlpZiAoIShwID0gbmxtNF9kZWNvZGVfY29va2llKHAsICZhcmdwLT5jb29raWUpKQorCSB8fCAhKHAgPSBubG00X2RlY29kZV9sb2NrKHAsICZhcmdwLT5sb2NrKSkpCisJCXJldHVybiAwOworCWFyZ3AtPmxvY2suZmwuZmxfdHlwZSA9IEZfVU5MQ0s7CisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CitubG00c3ZjX2RlY29kZV9zaGFyZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK3sKKwlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKKworCW1lbXNldChsb2NrLCAwLCBzaXplb2YoKmxvY2spKTsKKwlsb2Nrc19pbml0X2xvY2soJmxvY2stPmZsKTsKKwlsb2NrLT5mbC5mbF9waWQgPSB+KHUzMikgMDsKKworCWlmICghKHAgPSBubG00X2RlY29kZV9jb29raWUocCwgJmFyZ3AtPmNvb2tpZSkpCisJIHx8ICEocCA9IHhkcl9kZWNvZGVfc3RyaW5nX2lucGxhY2UocCwgJmxvY2stPmNhbGxlciwKKwkJCQkJICAgICZsb2NrLT5sZW4sIE5MTV9NQVhTVFJMRU4pKQorCSB8fCAhKHAgPSBubG00X2RlY29kZV9maChwLCAmbG9jay0+ZmgpKQorCSB8fCAhKHAgPSBubG00X2RlY29kZV9vaChwLCAmbG9jay0+b2gpKSkKKwkJcmV0dXJuIDA7CisJYXJncC0+ZnNtX21vZGUgPSBudG9obCgqcCsrKTsKKwlhcmdwLT5mc21fYWNjZXNzID0gbnRvaGwoKnArKyk7CisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CitubG00c3ZjX2VuY29kZV9zaGFyZXJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQoreworCWlmICghKHAgPSBubG00X2VuY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gMDsKKwkqcCsrID0gcmVzcC0+c3RhdHVzOworCSpwKysgPSB4ZHJfemVybzsJCS8qIHNlcXVlbmNlIGFyZ3VtZW50ICovCisJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CitubG00c3ZjX2VuY29kZV9yZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK3sKKwlpZiAoIShwID0gbmxtNF9lbmNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKKwkJcmV0dXJuIDA7CisJKnArKyA9IHJlc3AtPnN0YXR1czsKKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbTRzdmNfZGVjb2RlX25vdGlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fYXJncyAqYXJncCkKK3sKKwlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKKworCWlmICghKHAgPSB4ZHJfZGVjb2RlX3N0cmluZ19pbnBsYWNlKHAsICZsb2NrLT5jYWxsZXIsCisJCQkJCSAgICAmbG9jay0+bGVuLCBOTE1fTUFYU1RSTEVOKSkpCisJCXJldHVybiAwOworCWFyZ3AtPnN0YXRlID0gbnRvaGwoKnArKyk7CisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CitubG00c3ZjX2RlY29kZV9yZWJvb3Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmxtX3JlYm9vdCAqYXJncCkKK3sKKwlpZiAoIShwID0geGRyX2RlY29kZV9zdHJpbmdfaW5wbGFjZShwLCAmYXJncC0+bW9uLCAmYXJncC0+bGVuLCBTTV9NQVhTVFJMRU4pKSkKKwkJcmV0dXJuIDA7CisJYXJncC0+c3RhdGUgPSBudG9obCgqcCsrKTsKKwkvKiBQcmVzZXJ2ZSB0aGUgYWRkcmVzcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwlhcmdwLT5hZGRyID0gKnArKzsKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbTRzdmNfZGVjb2RlX3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQoreworCWlmICghKHAgPSBubG00X2RlY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gMDsKKwlyZXNwLT5zdGF0dXMgPSBudG9obCgqcCsrKTsKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbTRzdmNfZGVjb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCB2b2lkICpkdW1teSkKK3sKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbTRzdmNfZW5jb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCB2b2lkICpkdW1teSkKK3sKKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCisvKgorICogTm93LCB0aGUgY2xpZW50IHNpZGUgWERSIGZ1bmN0aW9ucworICovCisjaWZkZWYgTkxNQ0xOVF9TVVBQT1JUX1NIQVJFUworc3RhdGljIGludAorbmxtNGNsdF9kZWNvZGVfdm9pZChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCB2b2lkICpwdHIpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorbmxtNGNsdF9lbmNvZGVfdGVzdGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCit7CisJc3RydWN0IG5sbV9sb2NrCSpsb2NrID0gJmFyZ3AtPmxvY2s7CisKKwlpZiAoIShwID0gbmxtNF9lbmNvZGVfY29va2llKHAsICZhcmdwLT5jb29raWUpKSkKKwkJcmV0dXJuIC1FSU87CisJKnArKyA9IChsb2NrLT5mbC5mbF90eXBlID09IEZfV1JMQ0spPyB4ZHJfb25lIDogeGRyX3plcm87CisJaWYgKCEocCA9IG5sbTRfZW5jb2RlX2xvY2socCwgbG9jaykpKQorCQlyZXR1cm4gLUVJTzsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25sbTRjbHRfZGVjb2RlX3Rlc3RyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCit7CisJaWYgKCEocCA9IG5sbTRfZGVjb2RlX2Nvb2tpZShwLCAmcmVzcC0+Y29va2llKSkpCisJCXJldHVybiAtRUlPOworCXJlc3AtPnN0YXR1cyA9IG50b2hsKCpwKyspOworCWlmIChyZXNwLT5zdGF0dXMgPT0gTkxNX0xDS19ERU5JRUQpIHsKKwkJc3RydWN0IGZpbGVfbG9jawkqZmwgPSAmcmVzcC0+bG9jay5mbDsKKwkJdTMyCQkJZXhjbDsKKwkJczY0CQkJc3RhcnQsIGVuZCwgbGVuOworCisJCW1lbXNldCgmcmVzcC0+bG9jaywgMCwgc2l6ZW9mKHJlc3AtPmxvY2spKTsKKwkJbG9ja3NfaW5pdF9sb2NrKGZsKTsKKwkJZXhjbCA9IG50b2hsKCpwKyspOworCQlmbC0+ZmxfcGlkID0gbnRvaGwoKnArKyk7CisJCWlmICghKHAgPSBubG00X2RlY29kZV9vaChwLCAmcmVzcC0+bG9jay5vaCkpKQorCQkJcmV0dXJuIC1FSU87CisKKwkJZmwtPmZsX2ZsYWdzID0gRkxfUE9TSVg7CisJCWZsLT5mbF90eXBlICA9IGV4Y2w/IEZfV1JMQ0sgOiBGX1JETENLOworCQlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmc3RhcnQpOworCQlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmbGVuKTsKKwkJZW5kID0gc3RhcnQgKyBsZW4gLSAxOworCisJCWZsLT5mbF9zdGFydCA9IHM2NF90b19sb2ZmX3Qoc3RhcnQpOworCQlpZiAobGVuID09IDAgfHwgZW5kIDwgMCkKKwkJCWZsLT5mbF9lbmQgPSBPRkZTRVRfTUFYOworCQllbHNlCisJCQlmbC0+ZmxfZW5kID0gczY0X3RvX2xvZmZfdChlbmQpOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitubG00Y2x0X2VuY29kZV9sb2NrYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK3sKKwlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKKworCWlmICghKHAgPSBubG00X2VuY29kZV9jb29raWUocCwgJmFyZ3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gLUVJTzsKKwkqcCsrID0gYXJncC0+YmxvY2s/IHhkcl9vbmUgOiB4ZHJfemVybzsKKwkqcCsrID0gKGxvY2stPmZsLmZsX3R5cGUgPT0gRl9XUkxDSyk/IHhkcl9vbmUgOiB4ZHJfemVybzsKKwlpZiAoIShwID0gbmxtNF9lbmNvZGVfbG9jayhwLCBsb2NrKSkpCisJCXJldHVybiAtRUlPOworCSpwKysgPSBhcmdwLT5yZWNsYWltPyB4ZHJfb25lIDogeGRyX3plcm87CisJKnArKyA9IGh0b25sKGFyZ3AtPnN0YXRlKTsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25sbTRjbHRfZW5jb2RlX2NhbmNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQoreworCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOworCisJaWYgKCEocCA9IG5sbTRfZW5jb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkpCisJCXJldHVybiAtRUlPOworCSpwKysgPSBhcmdwLT5ibG9jaz8geGRyX29uZSA6IHhkcl96ZXJvOworCSpwKysgPSAobG9jay0+ZmwuZmxfdHlwZSA9PSBGX1dSTENLKT8geGRyX29uZSA6IHhkcl96ZXJvOworCWlmICghKHAgPSBubG00X2VuY29kZV9sb2NrKHAsIGxvY2spKSkKKwkJcmV0dXJuIC1FSU87CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitubG00Y2x0X2VuY29kZV91bmxvY2thcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQoreworCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOworCisJaWYgKCEocCA9IG5sbTRfZW5jb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkpCisJCXJldHVybiAtRUlPOworCWlmICghKHAgPSBubG00X2VuY29kZV9sb2NrKHAsIGxvY2spKSkKKwkJcmV0dXJuIC1FSU87CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitubG00Y2x0X2VuY29kZV9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCit7CisJaWYgKCEocCA9IG5sbTRfZW5jb2RlX2Nvb2tpZShwLCAmcmVzcC0+Y29va2llKSkpCisJCXJldHVybiAtRUlPOworCSpwKysgPSByZXNwLT5zdGF0dXM7CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitubG00Y2x0X2VuY29kZV90ZXN0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQoreworCWlmICghKHAgPSBubG00X2VuY29kZV90ZXN0cmVzKHAsIHJlc3ApKSkKKwkJcmV0dXJuIC1FSU87CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitubG00Y2x0X2RlY29kZV9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCit7CisJaWYgKCEocCA9IG5sbTRfZGVjb2RlX2Nvb2tpZShwLCAmcmVzcC0+Y29va2llKSkpCisJCXJldHVybiAtRUlPOworCXJlc3AtPnN0YXR1cyA9IG50b2hsKCpwKyspOworCXJldHVybiAwOworfQorCisvKgorICogQnVmZmVyIHJlcXVpcmVtZW50cyBmb3IgTkxNCisgKi8KKyNkZWZpbmUgTkxNNF92b2lkX3N6CQkwCisjZGVmaW5lIE5MTTRfY29va2llX3N6CQkxK1hEUl9RVUFETEVOKE5MTV9NQVhDT09LSUVMRU4pCisjZGVmaW5lIE5MTTRfY2FsbGVyX3N6CQkxK1hEUl9RVUFETEVOKE5MTV9NQVhTVFJMRU4pCisjZGVmaW5lIE5MTTRfbmV0b2JqX3N6CQkxK1hEUl9RVUFETEVOKFhEUl9NQVhfTkVUT0JKKQorLyogI2RlZmluZSBOTE00X293bmVyX3N6CQkxK1hEUl9RVUFETEVOKE5MTTRfTUFYT1dORVIpICovCisjZGVmaW5lIE5MTTRfZmhhbmRsZV9zegkJMStYRFJfUVVBRExFTihORlMzX0ZIU0laRSkKKyNkZWZpbmUgTkxNNF9sb2NrX3N6CQk1K05MTTRfY2FsbGVyX3N6K05MTTRfbmV0b2JqX3N6K05MTTRfZmhhbmRsZV9zegorI2RlZmluZSBOTE00X2hvbGRlcl9zegkJNitOTE00X25ldG9ial9zegorCisjZGVmaW5lIE5MTTRfdGVzdGFyZ3Nfc3oJTkxNNF9jb29raWVfc3orMStOTE00X2xvY2tfc3oKKyNkZWZpbmUgTkxNNF9sb2NrYXJnc19zeglOTE00X2Nvb2tpZV9zeis0K05MTTRfbG9ja19zegorI2RlZmluZSBOTE00X2NhbmNhcmdzX3N6CU5MTTRfY29va2llX3N6KzIrTkxNNF9sb2NrX3N6CisjZGVmaW5lIE5MTTRfdW5sb2NrYXJnc19zeglOTE00X2Nvb2tpZV9zeitOTE00X2xvY2tfc3oKKworI2RlZmluZSBOTE00X3Rlc3RyZXNfc3oJCU5MTTRfY29va2llX3N6KzErTkxNNF9ob2xkZXJfc3oKKyNkZWZpbmUgTkxNNF9yZXNfc3oJCU5MTTRfY29va2llX3N6KzEKKyNkZWZpbmUgTkxNNF9ub3JlcF9zegkJMAorCisjaWZuZGVmIE1BWAorIyBkZWZpbmUgTUFYKGEsYikJCSgoKGEpID4gKGIpKT8gKGEpIDogKGIpKQorI2VuZGlmCisKKy8qCisgKiBGb3IgTkxNLCBhIHZvaWQgcHJvY2VkdXJlIHJlYWxseSByZXR1cm5zIG5vdGhpbmcKKyAqLworI2RlZmluZSBubG00Y2x0X2RlY29kZV9ub3JlcAlOVUxMCisKKyNkZWZpbmUgUFJPQyhwcm9jLCBhcmd0eXBlLCByZXN0eXBlKQkJCQkJXAorW05MTVBST0NfIyNwcm9jXSA9IHsJCQkJCQkJXAorCS5wX3Byb2MgICAgICA9IE5MTVBST0NfIyNwcm9jLAkJCQkJXAorCS5wX2VuY29kZSAgICA9IChreGRycHJvY190KSBubG00Y2x0X2VuY29kZV8jI2FyZ3R5cGUsCQlcCisJLnBfZGVjb2RlICAgID0gKGt4ZHJwcm9jX3QpIG5sbTRjbHRfZGVjb2RlXyMjcmVzdHlwZSwJCVwKKwkucF9idWZzaXogICAgPSBNQVgoTkxNNF8jI2FyZ3R5cGUjI19zeiwgTkxNNF8jI3Jlc3R5cGUjI19zeikgPDwgMglcCisJfQorCitzdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbwlubG00X3Byb2NlZHVyZXNbXSA9IHsKKyAgICBQUk9DKFRFU1QsCQl0ZXN0YXJncywJdGVzdHJlcyksCisgICAgUFJPQyhMT0NLLAkJbG9ja2FyZ3MsCXJlcyksCisgICAgUFJPQyhDQU5DRUwsCWNhbmNhcmdzLAlyZXMpLAorICAgIFBST0MoVU5MT0NLLAl1bmxvY2thcmdzLAlyZXMpLAorICAgIFBST0MoR1JBTlRFRCwJdGVzdGFyZ3MsCXJlcyksCisgICAgUFJPQyhURVNUX01TRywJdGVzdGFyZ3MsCW5vcmVwKSwKKyAgICBQUk9DKExPQ0tfTVNHLAlsb2NrYXJncywJbm9yZXApLAorICAgIFBST0MoQ0FOQ0VMX01TRywJY2FuY2FyZ3MsCW5vcmVwKSwKKyAgICBQUk9DKFVOTE9DS19NU0csCXVubG9ja2FyZ3MsCW5vcmVwKSwKKyAgICBQUk9DKEdSQU5URURfTVNHLAl0ZXN0YXJncywJbm9yZXApLAorICAgIFBST0MoVEVTVF9SRVMsCXRlc3RyZXMsCW5vcmVwKSwKKyAgICBQUk9DKExPQ0tfUkVTLAlyZXMsCQlub3JlcCksCisgICAgUFJPQyhDQU5DRUxfUkVTLAlyZXMsCQlub3JlcCksCisgICAgUFJPQyhVTkxPQ0tfUkVTLAlyZXMsCQlub3JlcCksCisgICAgUFJPQyhHUkFOVEVEX1JFUywJcmVzLAkJbm9yZXApLAorI2lmZGVmIE5MTUNMTlRfU1VQUE9SVF9TSEFSRVMKKyAgICBQUk9DKFNIQVJFLAkJc2hhcmVhcmdzLAlzaGFyZXJlcyksCisgICAgUFJPQyhVTlNIQVJFLAlzaGFyZWFyZ3MsCXNoYXJlcmVzKSwKKyAgICBQUk9DKE5NX0xPQ0ssCWxvY2thcmdzLAlyZXMpLAorICAgIFBST0MoRlJFRV9BTEwsCW5vdGlmeSwJCXZvaWQpLAorI2VuZGlmCit9OworCitzdHJ1Y3QgcnBjX3ZlcnNpb24JbmxtX3ZlcnNpb240ID0geworCS5udW1iZXIJCT0gNCwKKwkubnJwcm9jcwk9IDI0LAorCS5wcm9jcwkJPSBubG00X3Byb2NlZHVyZXMsCit9OwpkaWZmIC0tZ2l0IGEvZnMvbG9ja3MuYyBiL2ZzL2xvY2tzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5MmNlNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2xvY2tzLmMKQEAgLTAsMCArMSwyMjEyIEBACisvKgorICogIGxpbnV4L2ZzL2xvY2tzLmMKKyAqCisgKiAgUHJvdmlkZSBzdXBwb3J0IGZvciBmY250bCgpJ3MgRl9HRVRMSywgRl9TRVRMSywgYW5kIEZfU0VUTEtXIGNhbGxzLgorICogIERvdWcgRXZhbnMgKGRqZUBzcGlmZi51dWNwKSwgQXVndXN0IDA3LCAxOTkyCisgKgorICogIERlYWRsb2NrIGRldGVjdGlvbiBhZGRlZC4KKyAqICBGSVhNRTogb25lIHRoaW5nIGlzbid0IGhhbmRsZWQgeWV0OgorICoJLSBtYW5kYXRvcnkgbG9ja3MgKHJlcXVpcmVzIGxvdHMgb2YgY2hhbmdlcyBlbHNld2hlcmUpCisgKiAgS2VsbHkgQ2FybWljaGFlbCAoa2VsbHlAWzE0Mi4yNC44LjY1XSksIFNlcHRlbWJlciAxNywgMTk5NC4KKyAqCisgKiAgTWlzY2VsbGFuZW91cyBlZGl0cywgYW5kIGEgdG90YWwgcmV3cml0ZSBvZiBwb3NpeF9sb2NrX2ZpbGUoKSBjb2RlLgorICogIEthaSBQZXR6a2UgKHdwcEBtYXJpZS5waHlzaWsudHUtYmVybGluLmRlKSwgMTk5NAorICogIAorICogIENvbnZlcnRlZCBmaWxlX2xvY2tfdGFibGUgdG8gYSBsaW5rZWQgbGlzdCBmcm9tIGFuIGFycmF5LCB3aGljaCBlbGltaW5hdGVzCisgKiAgdGhlIGxpbWl0cyBvbiBob3cgbWFueSBhY3RpdmUgZmlsZSBsb2NrcyBhcmUgb3Blbi4KKyAqICBDaGFkIFBhZ2UgKHBhZ2VvbmVAbmV0Y29tLmNvbSksIE5vdmVtYmVyIDI3LCAxOTk0CisgKiAKKyAqICBSZW1vdmVkIGRlcGVuZGVuY3kgb24gZmlsZSBkZXNjcmlwdG9ycy4gZHVwKCknZWQgZmlsZSBkZXNjcmlwdG9ycyBub3cKKyAqICBnZXQgdGhlIHNhbWUgbG9ja3MgYXMgdGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvcnMsIGFuZCBhIGNsb3NlKCkgb24KKyAqICBhbnkgZmlsZSBkZXNjcmlwdG9yIHJlbW92ZXMgQUxMIHRoZSBsb2NrcyBvbiB0aGUgZmlsZSBmb3IgdGhlIGN1cnJlbnQKKyAqICBwcm9jZXNzLiBTaW5jZSBsb2NrcyBzdGlsbCBkZXBlbmQgb24gdGhlIHByb2Nlc3MgaWQsIGxvY2tzIGFyZSBpbmhlcml0ZWQKKyAqICBhZnRlciBhbiBleGVjKCkgYnV0IG5vdCBhZnRlciBhIGZvcmsoKS4gVGhpcyBhZ3JlZXMgd2l0aCBQT1NJWCwgYW5kIGJvdGgKKyAqICBCU0QgYW5kIFNWUjQgcHJhY3RpY2UuCisgKiAgQW5keSBXYWxrZXIgKGFuZHlAbHlzYWtlci5rdmFlcm5lci5ubyksIEZlYnJ1YXJ5IDE0LCAxOTk1CisgKgorICogIFNjcmFwcGVkIGZyZWUgbGlzdCB3aGljaCBpcyByZWR1bmRhbnQgbm93IHRoYXQgd2UgYWxsb2NhdGUgbG9ja3MKKyAqICBkeW5hbWljYWxseSB3aXRoIGttYWxsb2MoKS9rZnJlZSgpLgorICogIEFuZHkgV2Fsa2VyIChhbmR5QGx5c2FrZXIua3ZhZXJuZXIubm8pLCBGZWJydWFyeSAyMSwgMTk5NQorICoKKyAqICBJbXBsZW1lbnRlZCB0d28gbG9jayBwZXJzb25hbGl0aWVzIC0gRkxfRkxPQ0sgYW5kIEZMX1BPU0lYLgorICoKKyAqICBGTF9QT1NJWCBsb2NrcyBhcmUgY3JlYXRlZCB3aXRoIGNhbGxzIHRvIGZjbnRsKCkgYW5kIGxvY2tmKCkgdGhyb3VnaCB0aGUKKyAqICBmY250bCgpIHN5c3RlbSBjYWxsLiBUaGV5IGhhdmUgdGhlIHNlbWFudGljcyBkZXNjcmliZWQgYWJvdmUuCisgKgorICogIEZMX0ZMT0NLIGxvY2tzIGFyZSBjcmVhdGVkIHdpdGggY2FsbHMgdG8gZmxvY2soKSwgdGhyb3VnaCB0aGUgZmxvY2soKQorICogIHN5c3RlbSBjYWxsLCB3aGljaCBpcyBuZXcuIE9sZCBDIGxpYnJhcmllcyBpbXBsZW1lbnQgZmxvY2soKSB2aWEgZmNudGwoKQorICogIGFuZCB3aWxsIGNvbnRpbnVlIHRvIHVzZSB0aGUgb2xkLCBicm9rZW4gaW1wbGVtZW50YXRpb24uCisgKgorICogIEZMX0ZMT0NLIGxvY2tzIGZvbGxvdyB0aGUgNC40IEJTRCBmbG9jaygpIHNlbWFudGljcy4gVGhleSBhcmUgYXNzb2NpYXRlZAorICogIHdpdGggYSBmaWxlIHBvaW50ZXIgKGZpbHApLiBBcyBhIHJlc3VsdCB0aGV5IGNhbiBiZSBzaGFyZWQgYnkgYSBwYXJlbnQKKyAqICBwcm9jZXNzIGFuZCBpdHMgY2hpbGRyZW4gYWZ0ZXIgYSBmb3JrKCkuIFRoZXkgYXJlIHJlbW92ZWQgd2hlbiB0aGUgbGFzdAorICogIGZpbGUgZGVzY3JpcHRvciByZWZlcnJpbmcgdG8gdGhlIGZpbGUgcG9pbnRlciBpcyBjbG9zZWQgKHVubGVzcyBleHBsaWNpdGx5CisgKiAgdW5sb2NrZWQpLiAKKyAqCisgKiAgRkxfRkxPQ0sgbG9ja3MgbmV2ZXIgZGVhZGxvY2ssIGFuIGV4aXN0aW5nIGxvY2sgaXMgYWx3YXlzIHJlbW92ZWQgYmVmb3JlCisgKiAgdXBncmFkaW5nIGZyb20gc2hhcmVkIHRvIGV4Y2x1c2l2ZSAob3IgdmljZSB2ZXJzYSkuIFdoZW4gdGhpcyBoYXBwZW5zCisgKiAgYW55IHByb2Nlc3NlcyBibG9ja2VkIGJ5IHRoZSBjdXJyZW50IGxvY2sgYXJlIHdva2VuIHVwIGFuZCBhbGxvd2VkIHRvCisgKiAgcnVuIGJlZm9yZSB0aGUgbmV3IGxvY2sgaXMgYXBwbGllZC4KKyAqICBBbmR5IFdhbGtlciAoYW5keUBseXNha2VyLmt2YWVybmVyLm5vKSwgSnVuZSAwOSwgMTk5NQorICoKKyAqICBSZW1vdmVkIHNvbWUgcmFjZSBjb25kaXRpb25zIGluIGZsb2NrX2xvY2tfZmlsZSgpLCBtYXJrZWQgb3RoZXIgcG9zc2libGUKKyAqICByYWNlcy4gSnVzdCBncmVwIGZvciBGSVhNRSB0byBzZWUgdGhlbS4gCisgKiAgRG1pdHJ5IEdvcm9kY2hhbmluIChwZ21kc2dAaWJpLmNvbSksIEZlYnJ1YXJ5IDA5LCAxOTk2LgorICoKKyAqICBBZGRyZXNzZWQgRG1pdHJ5J3MgY29uY2VybnMuIERlYWRsb2NrIGNoZWNraW5nIG5vIGxvbmdlciByZWN1cnNpdmUuCisgKiAgTG9jayBhbGxvY2F0aW9uIGNoYW5nZWQgdG8gR0ZQX0FUT01JQyBhcyB3ZSBjYW4ndCBhZmZvcmQgdG8gc2xlZXAKKyAqICBvbmNlIHdlJ3ZlIGNoZWNrZWQgZm9yIGJsb2NraW5nIGFuZCBkZWFkbG9ja2luZy4KKyAqICBBbmR5IFdhbGtlciAoYW5keUBseXNha2VyLmt2YWVybmVyLm5vKSwgQXByaWwgMDMsIDE5OTYuCisgKgorICogIEluaXRpYWwgaW1wbGVtZW50YXRpb24gb2YgbWFuZGF0b3J5IGxvY2tzLiBTdW5PUyB0dXJuZWQgb3V0IHRvIGJlCisgKiAgYSByb3R0ZW4gbW9kZWwsIHNvIEkgaW1wbGVtZW50ZWQgdGhlICJvYnZpb3VzIiBzZW1hbnRpY3MuCisgKiAgU2VlICdEb2N1bWVudGF0aW9uL21hbmRhdG9yeS50eHQnIGZvciBkZXRhaWxzLgorICogIEFuZHkgV2Fsa2VyIChhbmR5QGx5c2FrZXIua3ZhZXJuZXIubm8pLCBBcHJpbCAwNiwgMTk5Ni4KKyAqCisgKiAgRG9uJ3QgYWxsb3cgbWFuZGF0b3J5IGxvY2tzIG9uIG1tYXAoKSdlZCBmaWxlcy4gQWRkZWQgc2ltcGxlIGZ1bmN0aW9ucyB0bworICogIGNoZWNrIGlmIGEgZmlsZSBoYXMgbWFuZGF0b3J5IGxvY2tzLCB1c2VkIGJ5IG1tYXAoKSwgb3BlbigpIGFuZCBjcmVhdCgpIHRvCisgKiAgc2VlIGlmIHN5c3RlbSBjYWxsIHNob3VsZCBiZSByZWplY3RlZC4gUmVmLiBIUC1VWC9TdW5PUy9Tb2xhcmlzIFJlZmVyZW5jZQorICogIE1hbnVhbCwgU2VjdGlvbiAyLgorICogIEFuZHkgV2Fsa2VyIChhbmR5QGx5c2FrZXIua3ZhZXJuZXIubm8pLCBBcHJpbCAwOSwgMTk5Ni4KKyAqCisgKiAgVGlkaWVkIHVwIGJsb2NrIGxpc3QgaGFuZGxpbmcuIEFkZGVkICcvcHJvYy9sb2NrcycgaW50ZXJmYWNlLgorICogIEFuZHkgV2Fsa2VyIChhbmR5QGx5c2FrZXIua3ZhZXJuZXIubm8pLCBBcHJpbCAyNCwgMTk5Ni4KKyAqCisgKiAgRml4ZWQgZGVhZGxvY2sgY29uZGl0aW9uIGZvciBwYXRob2xvZ2ljYWwgY29kZSB0aGF0IG1peGVzIGNhbGxzIHRvCisgKiAgZmxvY2soKSBhbmQgZmNudGwoKS4KKyAqICBBbmR5IFdhbGtlciAoYW5keUBseXNha2VyLmt2YWVybmVyLm5vKSwgQXByaWwgMjksIDE5OTYuCisgKgorICogIEFsbG93IG9ubHkgb25lIHR5cGUgb2YgbG9ja2luZyBzY2hlbWUgKEZMX1BPU0lYIG9yIEZMX0ZMT0NLKSB0byBiZSBpbiB1c2UKKyAqICBmb3IgYSBnaXZlbiBmaWxlIGF0IGEgdGltZS4gQ2hhbmdlZCB0aGUgQ09ORklHX0xPQ0tfTUFOREFUT1JZIHNjaGVtZSB0bworICogIGd1YXJhbnRlZSBzZW5zaWJsZSBiZWhhdmlvdXIgaW4gdGhlIGNhc2Ugd2hlcmUgZmlsZSBzeXN0ZW0gbW9kdWxlcyBtaWdodAorICogIGJlIGNvbXBpbGVkIHdpdGggZGlmZmVyZW50IG9wdGlvbnMgdGhhbiB0aGUga2VybmVsIGl0c2VsZi4KKyAqICBBbmR5IFdhbGtlciAoYW5keUBseXNha2VyLmt2YWVybmVyLm5vKSwgTWF5IDE1LCAxOTk2LgorICoKKyAqICBBZGRlZCBhIGNvdXBsZSBvZiBtaXNzaW5nIHdha2VfdXAoKSBjYWxscy4gVGhhbmtzIHRvIFRob21hcyBNZWNrZWwKKyAqICAoVGhvbWFzLk1lY2tlbEBtbmkuZmgtZ2llc3Nlbi5kZSkgZm9yIHNwb3R0aW5nIHRoaXMuCisgKiAgQW5keSBXYWxrZXIgKGFuZHlAbHlzYWtlci5rdmFlcm5lci5ubyksIE1heSAxNSwgMTk5Ni4KKyAqCisgKiAgQ2hhbmdlZCBGTF9QT1NJWCBsb2NrcyB0byB1c2UgdGhlIGJsb2NrIGxpc3QgaW4gdGhlIHNhbWUgd2F5IGFzIEZMX0ZMT0NLCisgKiAgbG9ja3MuIENoYW5nZWQgcHJvY2VzcyBzeW5jaHJvbmlzYXRpb24gdG8gYXZvaWQgZGVyZWZlcmVuY2luZyBsb2NrcyB0aGF0CisgKiAgaGF2ZSBhbHJlYWR5IGJlZW4gZnJlZWQuCisgKiAgQW5keSBXYWxrZXIgKGFuZHlAbHlzYWtlci5rdmFlcm5lci5ubyksIFNlcCAyMSwgMTk5Ni4KKyAqCisgKiAgTWFkZSB0aGUgYmxvY2sgbGlzdCBhIGNpcmN1bGFyIGxpc3QgdG8gbWluaW1pc2Ugc2VhcmNoaW5nIGluIHRoZSBsaXN0LgorICogIEFuZHkgV2Fsa2VyIChhbmR5QGx5c2FrZXIua3ZhZXJuZXIubm8pLCBTZXAgMjUsIDE5OTYuCisgKgorICogIE1hZGUgbWFuZGF0b3J5IGxvY2tpbmcgYSBtb3VudCBvcHRpb24uIERlZmF1bHQgaXMgbm90IHRvIGFsbG93IG1hbmRhdG9yeQorICogIGxvY2tpbmcuCisgKiAgQW5keSBXYWxrZXIgKGFuZHlAbHlzYWtlci5rdmFlcm5lci5ubyksIE9jdCAwNCwgMTk5Ni4KKyAqCisgKiAgU29tZSBhZGFwdGF0aW9ucyBmb3IgTkZTIHN1cHBvcnQuCisgKiAgT2xhZiBLaXJjaCAob2tpckBtb25hZC5zd2IuZGUpLCBEZWMgMTk5NiwKKyAqCisgKiAgRml4ZWQgL3Byb2MvbG9ja3MgaW50ZXJmYWNlIHNvIHRoYXQgd2UgY2FuJ3Qgb3ZlcnJ1biB0aGUgYnVmZmVyIHdlIGFyZSBoYW5kZWQuCisgKiAgQW5keSBXYWxrZXIgKGFuZHlAbHlzYWtlci5rdmFlcm5lci5ubyksIE1heSAxMiwgMTk5Ny4KKyAqCisgKiAgVXNlIHNsYWIgYWxsb2NhdG9yIGluc3RlYWQgb2Yga21hbGxvYy9rZnJlZS4KKyAqICBVc2UgZ2VuZXJpYyBsaXN0IGltcGxlbWVudGF0aW9uIGZyb20gPGxpbnV4L2xpc3QuaD4uCisgKiAgU3BlZCB1cCBwb3NpeF9sb2Nrc19kZWFkbG9jayBieSBvbmx5IGNvbnNpZGVyaW5nIGJsb2NrZWQgbG9ja3MuCisgKiAgTWF0dGhldyBXaWxjb3ggPHdpbGx5QGRlYmlhbi5vcmc+LCBNYXJjaCwgMjAwMC4KKyAqCisgKiAgTGVhc2VzIGFuZCBMT0NLX01BTkQKKyAqICBNYXR0aGV3IFdpbGNveCA8d2lsbHlAZGViaWFuLm9yZz4sIEp1bmUsIDIwMDAuCisgKiAgU3RlcGhlbiBSb3Rod2VsbCA8c2ZyQGNhbmIuYXV1Zy5vcmcuYXU+LCBKdW5lLCAyMDAwLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBJU19QT1NJWChmbCkJKGZsLT5mbF9mbGFncyAmIEZMX1BPU0lYKQorI2RlZmluZSBJU19GTE9DSyhmbCkJKGZsLT5mbF9mbGFncyAmIEZMX0ZMT0NLKQorI2RlZmluZSBJU19MRUFTRShmbCkJKGZsLT5mbF9mbGFncyAmIEZMX0xFQVNFKQorCitpbnQgbGVhc2VzX2VuYWJsZSA9IDE7CitpbnQgbGVhc2VfYnJlYWtfdGltZSA9IDQ1OworCisjZGVmaW5lIGZvcl9lYWNoX2xvY2soaW5vZGUsIGxvY2twKSBcCisJZm9yIChsb2NrcCA9ICZpbm9kZS0+aV9mbG9jazsgKmxvY2twICE9IE5VTEw7IGxvY2twID0gJigqbG9ja3ApLT5mbF9uZXh0KQorCitMSVNUX0hFQUQoZmlsZV9sb2NrX2xpc3QpOworCitFWFBPUlRfU1lNQk9MKGZpbGVfbG9ja19saXN0KTsKKworc3RhdGljIExJU1RfSEVBRChibG9ja2VkX2xpc3QpOworCitzdGF0aWMga21lbV9jYWNoZV90ICpmaWxlbG9ja19jYWNoZTsKKworLyogQWxsb2NhdGUgYW4gZW1wdHkgbG9jayBzdHJ1Y3R1cmUuICovCitzdGF0aWMgc3RydWN0IGZpbGVfbG9jayAqbG9ja3NfYWxsb2NfbG9jayh2b2lkKQoreworCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGZpbGVsb2NrX2NhY2hlLCBTTEFCX0tFUk5FTCk7Cit9CisKKy8qIEZyZWUgYSBsb2NrIHdoaWNoIGlzIG5vdCBpbiB1c2UuICovCitzdGF0aWMgaW5saW5lIHZvaWQgbG9ja3NfZnJlZV9sb2NrKHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCWlmIChmbCA9PSBOVUxMKSB7CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCWlmICh3YWl0cXVldWVfYWN0aXZlKCZmbC0+Zmxfd2FpdCkpCisJCXBhbmljKCJBdHRlbXB0aW5nIHRvIGZyZWUgbG9jayB3aXRoIGFjdGl2ZSB3YWl0IHF1ZXVlIik7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmZsLT5mbF9ibG9jaykpCisJCXBhbmljKCJBdHRlbXB0aW5nIHRvIGZyZWUgbG9jayB3aXRoIGFjdGl2ZSBibG9jayBsaXN0Iik7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmZsLT5mbF9saW5rKSkKKwkJcGFuaWMoIkF0dGVtcHRpbmcgdG8gZnJlZSBsb2NrIG9uIGFjdGl2ZSBsb2NrIGxpc3QiKTsKKworCWlmIChmbC0+Zmxfb3BzKSB7CisJCWlmIChmbC0+Zmxfb3BzLT5mbF9yZWxlYXNlX3ByaXZhdGUpCisJCQlmbC0+Zmxfb3BzLT5mbF9yZWxlYXNlX3ByaXZhdGUoZmwpOworCQlmbC0+Zmxfb3BzID0gTlVMTDsKKwl9CisKKwlpZiAoZmwtPmZsX2xtb3BzKSB7CisJCWlmIChmbC0+ZmxfbG1vcHMtPmZsX3JlbGVhc2VfcHJpdmF0ZSkKKwkJCWZsLT5mbF9sbW9wcy0+ZmxfcmVsZWFzZV9wcml2YXRlKGZsKTsKKwkJZmwtPmZsX2xtb3BzID0gTlVMTDsKKwl9CisKKwlrbWVtX2NhY2hlX2ZyZWUoZmlsZWxvY2tfY2FjaGUsIGZsKTsKK30KKwordm9pZCBsb2Nrc19pbml0X2xvY2soc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJSU5JVF9MSVNUX0hFQUQoJmZsLT5mbF9saW5rKTsKKwlJTklUX0xJU1RfSEVBRCgmZmwtPmZsX2Jsb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmbC0+Zmxfd2FpdCk7CisJZmwtPmZsX25leHQgPSBOVUxMOworCWZsLT5mbF9mYXN5bmMgPSBOVUxMOworCWZsLT5mbF9vd25lciA9IE5VTEw7CisJZmwtPmZsX3BpZCA9IDA7CisJZmwtPmZsX2ZpbGUgPSBOVUxMOworCWZsLT5mbF9mbGFncyA9IDA7CisJZmwtPmZsX3R5cGUgPSAwOworCWZsLT5mbF9zdGFydCA9IGZsLT5mbF9lbmQgPSAwOworCWZsLT5mbF9vcHMgPSBOVUxMOworCWZsLT5mbF9sbW9wcyA9IE5VTEw7Cit9CisKK0VYUE9SVF9TWU1CT0wobG9ja3NfaW5pdF9sb2NrKTsKKworLyoKKyAqIEluaXRpYWxpc2VzIHRoZSBmaWVsZHMgb2YgdGhlIGZpbGUgbG9jayB3aGljaCBhcmUgaW52YXJpYW50IGZvcgorICogZnJlZSBmaWxlX2xvY2tzLgorICovCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vLCBrbWVtX2NhY2hlX3QgKmNhY2hlLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBmaWxlX2xvY2sgKmxvY2sgPSAoc3RydWN0IGZpbGVfbG9jayAqKSBmb287CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgIT0KKwkJCQkJU0xBQl9DVE9SX0NPTlNUUlVDVE9SKQorCQlyZXR1cm47CisKKwlsb2Nrc19pbml0X2xvY2sobG9jayk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGEgbmV3IGxvY2sgZnJvbSBhbiBleGlzdGluZyBmaWxlX2xvY2sgc3RydWN0dXJlLgorICovCit2b2lkIGxvY2tzX2NvcHlfbG9jayhzdHJ1Y3QgZmlsZV9sb2NrICpuZXcsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCW5ldy0+Zmxfb3duZXIgPSBmbC0+Zmxfb3duZXI7CisJbmV3LT5mbF9waWQgPSBmbC0+ZmxfcGlkOworCW5ldy0+ZmxfZmlsZSA9IGZsLT5mbF9maWxlOworCW5ldy0+ZmxfZmxhZ3MgPSBmbC0+ZmxfZmxhZ3M7CisJbmV3LT5mbF90eXBlID0gZmwtPmZsX3R5cGU7CisJbmV3LT5mbF9zdGFydCA9IGZsLT5mbF9zdGFydDsKKwluZXctPmZsX2VuZCA9IGZsLT5mbF9lbmQ7CisJbmV3LT5mbF9vcHMgPSBmbC0+Zmxfb3BzOworCW5ldy0+ZmxfbG1vcHMgPSBmbC0+ZmxfbG1vcHM7CisJaWYgKGZsLT5mbF9vcHMgJiYgZmwtPmZsX29wcy0+ZmxfY29weV9sb2NrKQorCQlmbC0+Zmxfb3BzLT5mbF9jb3B5X2xvY2sobmV3LCBmbCk7CisJaWYgKGZsLT5mbF9sbW9wcyAmJiBmbC0+ZmxfbG1vcHMtPmZsX2NvcHlfbG9jaykKKwkJZmwtPmZsX2xtb3BzLT5mbF9jb3B5X2xvY2sobmV3LCBmbCk7Cit9CisKK0VYUE9SVF9TWU1CT0wobG9ja3NfY29weV9sb2NrKTsKKworc3RhdGljIGlubGluZSBpbnQgZmxvY2tfdHJhbnNsYXRlX2NtZChpbnQgY21kKSB7CisJaWYgKGNtZCAmIExPQ0tfTUFORCkKKwkJcmV0dXJuIGNtZCAmIChMT0NLX01BTkQgfCBMT0NLX1JXKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTE9DS19TSDoKKwkJcmV0dXJuIEZfUkRMQ0s7CisJY2FzZSBMT0NLX0VYOgorCQlyZXR1cm4gRl9XUkxDSzsKKwljYXNlIExPQ0tfVU46CisJCXJldHVybiBGX1VOTENLOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogRmlsbCBpbiBhIGZpbGVfbG9jayBzdHJ1Y3R1cmUgd2l0aCBhbiBhcHByb3ByaWF0ZSBGTE9DSyBsb2NrLiAqLworc3RhdGljIGludCBmbG9ja19tYWtlX2xvY2soc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBmaWxlX2xvY2sgKipsb2NrLAorCQl1bnNpZ25lZCBpbnQgY21kKQoreworCXN0cnVjdCBmaWxlX2xvY2sgKmZsOworCWludCB0eXBlID0gZmxvY2tfdHJhbnNsYXRlX2NtZChjbWQpOworCWlmICh0eXBlIDwgMCkKKwkJcmV0dXJuIHR5cGU7CisJCisJZmwgPSBsb2Nrc19hbGxvY19sb2NrKCk7CisJaWYgKGZsID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZmwtPmZsX2ZpbGUgPSBmaWxwOworCWZsLT5mbF9waWQgPSBjdXJyZW50LT50Z2lkOworCWZsLT5mbF9mbGFncyA9IEZMX0ZMT0NLOworCWZsLT5mbF90eXBlID0gdHlwZTsKKwlmbC0+ZmxfZW5kID0gT0ZGU0VUX01BWDsKKwkKKwkqbG9jayA9IGZsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzc2lnbl90eXBlKHN0cnVjdCBmaWxlX2xvY2sgKmZsLCBpbnQgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEZfUkRMQ0s6CisJY2FzZSBGX1dSTENLOgorCWNhc2UgRl9VTkxDSzoKKwkJZmwtPmZsX3R5cGUgPSB0eXBlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFZlcmlmeSBhICJzdHJ1Y3QgZmxvY2siIGFuZCBjb3B5IGl0IHRvIGEgInN0cnVjdCBmaWxlX2xvY2siIGFzIGEgUE9TSVgKKyAqIHN0eWxlIGxvY2suCisgKi8KK3N0YXRpYyBpbnQgZmxvY2tfdG9fcG9zaXhfbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGZpbGVfbG9jayAqZmwsCisJCQkgICAgICAgc3RydWN0IGZsb2NrICpsKQoreworCW9mZl90IHN0YXJ0LCBlbmQ7CisKKwlzd2l0Y2ggKGwtPmxfd2hlbmNlKSB7CisJY2FzZSAwOiAvKlNFRUtfU0VUKi8KKwkJc3RhcnQgPSAwOworCQlicmVhazsKKwljYXNlIDE6IC8qU0VFS19DVVIqLworCQlzdGFydCA9IGZpbHAtPmZfcG9zOworCQlicmVhazsKKwljYXNlIDI6IC8qU0VFS19FTkQqLworCQlzdGFydCA9IGlfc2l6ZV9yZWFkKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogUE9TSVgtMTk5NiBsZWF2ZXMgdGhlIGNhc2UgbC0+bF9sZW4gPCAwIHVuZGVmaW5lZDsKKwkgICBQT1NJWC0yMDAxIGRlZmluZXMgaXQuICovCisJc3RhcnQgKz0gbC0+bF9zdGFydDsKKwllbmQgPSBzdGFydCArIGwtPmxfbGVuIC0gMTsKKwlpZiAobC0+bF9sZW4gPCAwKSB7CisJCWVuZCA9IHN0YXJ0IC0gMTsKKwkJc3RhcnQgKz0gbC0+bF9sZW47CisJfQorCisJaWYgKHN0YXJ0IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGwtPmxfbGVuID4gMCAmJiBlbmQgPCAwKQorCQlyZXR1cm4gLUVPVkVSRkxPVzsKKworCWZsLT5mbF9zdGFydCA9IHN0YXJ0OwkvKiB3ZSByZWNvcmQgdGhlIGFic29sdXRlIHBvc2l0aW9uICovCisJZmwtPmZsX2VuZCA9IGVuZDsKKwlpZiAobC0+bF9sZW4gPT0gMCkKKwkJZmwtPmZsX2VuZCA9IE9GRlNFVF9NQVg7CisJCisJZmwtPmZsX293bmVyID0gY3VycmVudC0+ZmlsZXM7CisJZmwtPmZsX3BpZCA9IGN1cnJlbnQtPnRnaWQ7CisJZmwtPmZsX2ZpbGUgPSBmaWxwOworCWZsLT5mbF9mbGFncyA9IEZMX1BPU0lYOworCWZsLT5mbF9vcHMgPSBOVUxMOworCWZsLT5mbF9sbW9wcyA9IE5VTEw7CisKKwlyZXR1cm4gYXNzaWduX3R5cGUoZmwsIGwtPmxfdHlwZSk7Cit9CisKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCitzdGF0aWMgaW50IGZsb2NrNjRfdG9fcG9zaXhfbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGZpbGVfbG9jayAqZmwsCisJCQkJIHN0cnVjdCBmbG9jazY0ICpsKQoreworCWxvZmZfdCBzdGFydDsKKworCXN3aXRjaCAobC0+bF93aGVuY2UpIHsKKwljYXNlIDA6IC8qU0VFS19TRVQqLworCQlzdGFydCA9IDA7CisJCWJyZWFrOworCWNhc2UgMTogLypTRUVLX0NVUiovCisJCXN0YXJ0ID0gZmlscC0+Zl9wb3M7CisJCWJyZWFrOworCWNhc2UgMjogLypTRUVLX0VORCovCisJCXN0YXJ0ID0gaV9zaXplX3JlYWQoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKChzdGFydCArPSBsLT5sX3N0YXJ0KSA8IDApIHx8IChsLT5sX2xlbiA8IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmbC0+ZmxfZW5kID0gc3RhcnQgKyBsLT5sX2xlbiAtIDE7CisJaWYgKGwtPmxfbGVuID4gMCAmJiBmbC0+ZmxfZW5kIDwgMCkKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJZmwtPmZsX3N0YXJ0ID0gc3RhcnQ7CS8qIHdlIHJlY29yZCB0aGUgYWJzb2x1dGUgcG9zaXRpb24gKi8KKwlpZiAobC0+bF9sZW4gPT0gMCkKKwkJZmwtPmZsX2VuZCA9IE9GRlNFVF9NQVg7CisJCisJZmwtPmZsX293bmVyID0gY3VycmVudC0+ZmlsZXM7CisJZmwtPmZsX3BpZCA9IGN1cnJlbnQtPnRnaWQ7CisJZmwtPmZsX2ZpbGUgPSBmaWxwOworCWZsLT5mbF9mbGFncyA9IEZMX1BPU0lYOworCWZsLT5mbF9vcHMgPSBOVUxMOworCWZsLT5mbF9sbW9wcyA9IE5VTEw7CisKKwlzd2l0Y2ggKGwtPmxfdHlwZSkgeworCWNhc2UgRl9SRExDSzoKKwljYXNlIEZfV1JMQ0s6CisJY2FzZSBGX1VOTENLOgorCQlmbC0+ZmxfdHlwZSA9IGwtPmxfdHlwZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCisvKiBkZWZhdWx0IGxlYXNlIGxvY2sgbWFuYWdlciBvcGVyYXRpb25zICovCitzdGF0aWMgdm9pZCBsZWFzZV9icmVha19jYWxsYmFjayhzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlraWxsX2Zhc3luYygmZmwtPmZsX2Zhc3luYywgU0lHSU8sIFBPTExfTVNHKTsKK30KKworc3RhdGljIHZvaWQgbGVhc2VfcmVsZWFzZV9wcml2YXRlX2NhbGxiYWNrKHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCWlmICghZmwtPmZsX2ZpbGUpCisJCXJldHVybjsKKworCWZfZGVsb3duKGZsLT5mbF9maWxlKTsKKwlmbC0+ZmxfZmlsZS0+Zl9vd25lci5zaWdudW0gPSAwOworfQorCitpbnQgbGVhc2VfbXlsZWFzZV9jYWxsYmFjayhzdHJ1Y3QgZmlsZV9sb2NrICpmbCwgc3RydWN0IGZpbGVfbG9jayAqdHJ5KQoreworCXJldHVybiBmbC0+ZmxfZmlsZSA9PSB0cnktPmZsX2ZpbGU7Cit9CisKK3N0cnVjdCBsb2NrX21hbmFnZXJfb3BlcmF0aW9ucyBsZWFzZV9tYW5hZ2VyX29wcyA9IHsKKwkuZmxfYnJlYWsgPSBsZWFzZV9icmVha19jYWxsYmFjaywKKwkuZmxfcmVsZWFzZV9wcml2YXRlID0gbGVhc2VfcmVsZWFzZV9wcml2YXRlX2NhbGxiYWNrLAorCS5mbF9teWxlYXNlID0gbGVhc2VfbXlsZWFzZV9jYWxsYmFjaywKKwkuZmxfY2hhbmdlID0gbGVhc2VfbW9kaWZ5LAorfTsKKworLyoKKyAqIEluaXRpYWxpemUgYSBsZWFzZSwgdXNlIHRoZSBkZWZhdWx0IGxvY2sgbWFuYWdlciBvcGVyYXRpb25zCisgKi8KK3N0YXRpYyBpbnQgbGVhc2VfaW5pdChzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IHR5cGUsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQorIHsKKwlmbC0+Zmxfb3duZXIgPSBjdXJyZW50LT5maWxlczsKKwlmbC0+ZmxfcGlkID0gY3VycmVudC0+dGdpZDsKKworCWZsLT5mbF9maWxlID0gZmlscDsKKwlmbC0+ZmxfZmxhZ3MgPSBGTF9MRUFTRTsKKwlpZiAoYXNzaWduX3R5cGUoZmwsIHR5cGUpICE9IDApIHsKKwkJbG9ja3NfZnJlZV9sb2NrKGZsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZsLT5mbF9zdGFydCA9IDA7CisJZmwtPmZsX2VuZCA9IE9GRlNFVF9NQVg7CisJZmwtPmZsX29wcyA9IE5VTEw7CisJZmwtPmZsX2xtb3BzID0gJmxlYXNlX21hbmFnZXJfb3BzOworCXJldHVybiAwOworfQorCisvKiBBbGxvY2F0ZSBhIGZpbGVfbG9jayBpbml0aWFsaXNlZCB0byB0aGlzIHR5cGUgb2YgbGVhc2UgKi8KK3N0YXRpYyBpbnQgbGVhc2VfYWxsb2Moc3RydWN0IGZpbGUgKmZpbHAsIGludCB0eXBlLCBzdHJ1Y3QgZmlsZV9sb2NrICoqZmxwKQoreworCXN0cnVjdCBmaWxlX2xvY2sgKmZsID0gbG9ja3NfYWxsb2NfbG9jaygpOworCWludCBlcnJvcjsKKworCWlmIChmbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVycm9yID0gbGVhc2VfaW5pdChmaWxwLCB0eXBlLCBmbCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJKmZscCA9IGZsOworCXJldHVybiAwOworfQorCisvKiBDaGVjayBpZiB0d28gbG9ja3Mgb3ZlcmxhcCBlYWNoIG90aGVyLgorICovCitzdGF0aWMgaW5saW5lIGludCBsb2Nrc19vdmVybGFwKHN0cnVjdCBmaWxlX2xvY2sgKmZsMSwgc3RydWN0IGZpbGVfbG9jayAqZmwyKQoreworCXJldHVybiAoKGZsMS0+ZmxfZW5kID49IGZsMi0+Zmxfc3RhcnQpICYmCisJCShmbDItPmZsX2VuZCA+PSBmbDEtPmZsX3N0YXJ0KSk7Cit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIHR3byBsb2NrcyBoYXZlIHRoZSBzYW1lIG93bmVyLgorICovCitzdGF0aWMgaW5saW5lIGludAorcG9zaXhfc2FtZV9vd25lcihzdHJ1Y3QgZmlsZV9sb2NrICpmbDEsIHN0cnVjdCBmaWxlX2xvY2sgKmZsMikKK3sKKwlpZiAoZmwxLT5mbF9sbW9wcyAmJiBmbDEtPmZsX2xtb3BzLT5mbF9jb21wYXJlX293bmVyKQorCQlyZXR1cm4gZmwyLT5mbF9sbW9wcyA9PSBmbDEtPmZsX2xtb3BzICYmCisJCQlmbDEtPmZsX2xtb3BzLT5mbF9jb21wYXJlX293bmVyKGZsMSwgZmwyKTsKKwlyZXR1cm4gZmwxLT5mbF9vd25lciA9PSBmbDItPmZsX293bmVyOworfQorCisvKiBSZW1vdmUgd2FpdGVyIGZyb20gYmxvY2tlcidzIGJsb2NrIGxpc3QuCisgKiBXaGVuIGJsb2NrZXIgZW5kcyB1cCBwb2ludGluZyB0byBpdHNlbGYgdGhlbiB0aGUgbGlzdCBpcyBlbXB0eS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fbG9ja3NfZGVsZXRlX2Jsb2NrKHN0cnVjdCBmaWxlX2xvY2sgKndhaXRlcikKK3sKKwlsaXN0X2RlbF9pbml0KCZ3YWl0ZXItPmZsX2Jsb2NrKTsKKwlsaXN0X2RlbF9pbml0KCZ3YWl0ZXItPmZsX2xpbmspOworCXdhaXRlci0+ZmxfbmV4dCA9IE5VTEw7Cit9CisKKy8qCisgKi8KK3N0YXRpYyB2b2lkIGxvY2tzX2RlbGV0ZV9ibG9jayhzdHJ1Y3QgZmlsZV9sb2NrICp3YWl0ZXIpCit7CisJbG9ja19rZXJuZWwoKTsKKwlfX2xvY2tzX2RlbGV0ZV9ibG9jayh3YWl0ZXIpOworCXVubG9ja19rZXJuZWwoKTsKK30KKworLyogSW5zZXJ0IHdhaXRlciBpbnRvIGJsb2NrZXIncyBibG9jayBsaXN0LgorICogV2UgdXNlIGEgY2lyY3VsYXIgbGlzdCBzbyB0aGF0IHByb2Nlc3NlcyBjYW4gYmUgZWFzaWx5IHdva2VuIHVwIGluCisgKiB0aGUgb3JkZXIgdGhleSBibG9ja2VkLiBUaGUgZG9jdW1lbnRhdGlvbiBkb2Vzbid0IHJlcXVpcmUgdGhpcyBidXQKKyAqIGl0IHNlZW1zIGxpa2UgdGhlIHJlYXNvbmFibGUgdGhpbmcgdG8gZG8uCisgKi8KK3N0YXRpYyB2b2lkIGxvY2tzX2luc2VydF9ibG9jayhzdHJ1Y3QgZmlsZV9sb2NrICpibG9ja2VyLCAKKwkJCSAgICAgICBzdHJ1Y3QgZmlsZV9sb2NrICp3YWl0ZXIpCit7CisJaWYgKCFsaXN0X2VtcHR5KCZ3YWl0ZXItPmZsX2Jsb2NrKSkgeworCQlwcmludGsoS0VSTl9FUlIgImxvY2tzX2luc2VydF9ibG9jazogcmVtb3ZpbmcgZHVwbGljYXRlZCBsb2NrICIKKwkJCSIocGlkPSVkICVMZC0lTGQgdHlwZT0lZClcbiIsIHdhaXRlci0+ZmxfcGlkLAorCQkJd2FpdGVyLT5mbF9zdGFydCwgd2FpdGVyLT5mbF9lbmQsIHdhaXRlci0+ZmxfdHlwZSk7CisJCV9fbG9ja3NfZGVsZXRlX2Jsb2NrKHdhaXRlcik7CisJfQorCWxpc3RfYWRkX3RhaWwoJndhaXRlci0+ZmxfYmxvY2ssICZibG9ja2VyLT5mbF9ibG9jayk7CisJd2FpdGVyLT5mbF9uZXh0ID0gYmxvY2tlcjsKKwlpZiAoSVNfUE9TSVgoYmxvY2tlcikpCisJCWxpc3RfYWRkKCZ3YWl0ZXItPmZsX2xpbmssICZibG9ja2VkX2xpc3QpOworfQorCisvKiBXYWtlIHVwIHByb2Nlc3NlcyBibG9ja2VkIHdhaXRpbmcgZm9yIGJsb2NrZXIuCisgKiBJZiB0b2xkIHRvIHdhaXQgdGhlbiBzY2hlZHVsZSB0aGUgcHJvY2Vzc2VzIHVudGlsIHRoZSBibG9jayBsaXN0CisgKiBpcyBlbXB0eSwgb3RoZXJ3aXNlIGVtcHR5IHRoZSBibG9jayBsaXN0IG91cnNlbHZlcy4KKyAqLworc3RhdGljIHZvaWQgbG9ja3Nfd2FrZV91cF9ibG9ja3Moc3RydWN0IGZpbGVfbG9jayAqYmxvY2tlcikKK3sKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmJsb2NrZXItPmZsX2Jsb2NrKSkgeworCQlzdHJ1Y3QgZmlsZV9sb2NrICp3YWl0ZXIgPSBsaXN0X2VudHJ5KGJsb2NrZXItPmZsX2Jsb2NrLm5leHQsCisJCQkJc3RydWN0IGZpbGVfbG9jaywgZmxfYmxvY2spOworCQlfX2xvY2tzX2RlbGV0ZV9ibG9jayh3YWl0ZXIpOworCQlpZiAod2FpdGVyLT5mbF9sbW9wcyAmJiB3YWl0ZXItPmZsX2xtb3BzLT5mbF9ub3RpZnkpCisJCQl3YWl0ZXItPmZsX2xtb3BzLT5mbF9ub3RpZnkod2FpdGVyKTsKKwkJZWxzZQorCQkJd2FrZV91cCgmd2FpdGVyLT5mbF93YWl0KTsKKwl9Cit9CisKKy8qIEluc2VydCBmaWxlIGxvY2sgZmwgaW50byBhbiBpbm9kZSdzIGxvY2sgbGlzdCBhdCB0aGUgcG9zaXRpb24gaW5kaWNhdGVkCisgKiBieSBwb3MuIEF0IHRoZSBzYW1lIHRpbWUgYWRkIHRoZSBsb2NrIHRvIHRoZSBnbG9iYWwgZmlsZSBsb2NrIGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkIGxvY2tzX2luc2VydF9sb2NrKHN0cnVjdCBmaWxlX2xvY2sgKipwb3MsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCWxpc3RfYWRkKCZmbC0+ZmxfbGluaywgJmZpbGVfbG9ja19saXN0KTsKKworCS8qIGluc2VydCBpbnRvIGZpbGUncyBsaXN0ICovCisJZmwtPmZsX25leHQgPSAqcG9zOworCSpwb3MgPSBmbDsKKworCWlmIChmbC0+Zmxfb3BzICYmIGZsLT5mbF9vcHMtPmZsX2luc2VydCkKKwkJZmwtPmZsX29wcy0+ZmxfaW5zZXJ0KGZsKTsKK30KKworLyoKKyAqIERlbGV0ZSBhIGxvY2sgYW5kIHRoZW4gZnJlZSBpdC4KKyAqIFdha2UgdXAgcHJvY2Vzc2VzIHRoYXQgYXJlIGJsb2NrZWQgd2FpdGluZyBmb3IgdGhpcyBsb2NrLAorICogbm90aWZ5IHRoZSBGUyB0aGF0IHRoZSBsb2NrIGhhcyBiZWVuIGNsZWFyZWQgYW5kCisgKiBmaW5hbGx5IGZyZWUgdGhlIGxvY2suCisgKi8KK3N0YXRpYyB2b2lkIGxvY2tzX2RlbGV0ZV9sb2NrKHN0cnVjdCBmaWxlX2xvY2sgKip0aGlzZmxfcCkKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9ICp0aGlzZmxfcDsKKworCSp0aGlzZmxfcCA9IGZsLT5mbF9uZXh0OworCWZsLT5mbF9uZXh0ID0gTlVMTDsKKwlsaXN0X2RlbF9pbml0KCZmbC0+ZmxfbGluayk7CisKKwlmYXN5bmNfaGVscGVyKDAsIGZsLT5mbF9maWxlLCAwLCAmZmwtPmZsX2Zhc3luYyk7CisJaWYgKGZsLT5mbF9mYXN5bmMgIT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImxvY2tzX2RlbGV0ZV9sb2NrOiBmYXN5bmMgPT0gJXBcbiIsIGZsLT5mbF9mYXN5bmMpOworCQlmbC0+ZmxfZmFzeW5jID0gTlVMTDsKKwl9CisKKwlpZiAoZmwtPmZsX29wcyAmJiBmbC0+Zmxfb3BzLT5mbF9yZW1vdmUpCisJCWZsLT5mbF9vcHMtPmZsX3JlbW92ZShmbCk7CisKKwlsb2Nrc193YWtlX3VwX2Jsb2NrcyhmbCk7CisJbG9ja3NfZnJlZV9sb2NrKGZsKTsKK30KKworLyogRGV0ZXJtaW5lIGlmIGxvY2sgc3lzX2ZsIGJsb2NrcyBsb2NrIGNhbGxlcl9mbC4gQ29tbW9uIGZ1bmN0aW9uYWxpdHkKKyAqIGNoZWNrcyBmb3Igc2hhcmVkL2V4Y2x1c2l2ZSBzdGF0dXMgb2Ygb3ZlcmxhcHBpbmcgbG9ja3MuCisgKi8KK3N0YXRpYyBpbnQgbG9ja3NfY29uZmxpY3Qoc3RydWN0IGZpbGVfbG9jayAqY2FsbGVyX2ZsLCBzdHJ1Y3QgZmlsZV9sb2NrICpzeXNfZmwpCit7CisJaWYgKHN5c19mbC0+ZmxfdHlwZSA9PSBGX1dSTENLKQorCQlyZXR1cm4gMTsKKwlpZiAoY2FsbGVyX2ZsLT5mbF90eXBlID09IEZfV1JMQ0spCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKiBEZXRlcm1pbmUgaWYgbG9jayBzeXNfZmwgYmxvY2tzIGxvY2sgY2FsbGVyX2ZsLiBQT1NJWCBzcGVjaWZpYworICogY2hlY2tpbmcgYmVmb3JlIGNhbGxpbmcgdGhlIGxvY2tzX2NvbmZsaWN0KCkuCisgKi8KK3N0YXRpYyBpbnQgcG9zaXhfbG9ja3NfY29uZmxpY3Qoc3RydWN0IGZpbGVfbG9jayAqY2FsbGVyX2ZsLCBzdHJ1Y3QgZmlsZV9sb2NrICpzeXNfZmwpCit7CisJLyogUE9TSVggbG9ja3Mgb3duZWQgYnkgdGhlIHNhbWUgcHJvY2VzcyBkbyBub3QgY29uZmxpY3Qgd2l0aAorCSAqIGVhY2ggb3RoZXIuCisJICovCisJaWYgKCFJU19QT1NJWChzeXNfZmwpIHx8IHBvc2l4X3NhbWVfb3duZXIoY2FsbGVyX2ZsLCBzeXNfZmwpKQorCQlyZXR1cm4gKDApOworCisJLyogQ2hlY2sgd2hldGhlciB0aGV5IG92ZXJsYXAgKi8KKwlpZiAoIWxvY2tzX292ZXJsYXAoY2FsbGVyX2ZsLCBzeXNfZmwpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAobG9ja3NfY29uZmxpY3QoY2FsbGVyX2ZsLCBzeXNfZmwpKTsKK30KKworLyogRGV0ZXJtaW5lIGlmIGxvY2sgc3lzX2ZsIGJsb2NrcyBsb2NrIGNhbGxlcl9mbC4gRkxPQ0sgc3BlY2lmaWMKKyAqIGNoZWNraW5nIGJlZm9yZSBjYWxsaW5nIHRoZSBsb2Nrc19jb25mbGljdCgpLgorICovCitzdGF0aWMgaW50IGZsb2NrX2xvY2tzX2NvbmZsaWN0KHN0cnVjdCBmaWxlX2xvY2sgKmNhbGxlcl9mbCwgc3RydWN0IGZpbGVfbG9jayAqc3lzX2ZsKQoreworCS8qIEZMT0NLIGxvY2tzIHJlZmVycmluZyB0byB0aGUgc2FtZSBmaWxwIGRvIG5vdCBjb25mbGljdCB3aXRoCisJICogZWFjaCBvdGhlci4KKwkgKi8KKwlpZiAoIUlTX0ZMT0NLKHN5c19mbCkgfHwgKGNhbGxlcl9mbC0+ZmxfZmlsZSA9PSBzeXNfZmwtPmZsX2ZpbGUpKQorCQlyZXR1cm4gKDApOworCWlmICgoY2FsbGVyX2ZsLT5mbF90eXBlICYgTE9DS19NQU5EKSB8fCAoc3lzX2ZsLT5mbF90eXBlICYgTE9DS19NQU5EKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKGxvY2tzX2NvbmZsaWN0KGNhbGxlcl9mbCwgc3lzX2ZsKSk7Cit9CisKK3N0YXRpYyBpbnQgaW50ZXJydXB0aWJsZV9zbGVlcF9vbl9sb2NrZWQod2FpdF9xdWV1ZV9oZWFkX3QgKmZsX3dhaXQsIGludCB0aW1lb3V0KQoreworCWludCByZXN1bHQgPSAwOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCWFkZF93YWl0X3F1ZXVlKGZsX3dhaXQsICZ3YWl0KTsKKwlpZiAodGltZW91dCA9PSAwKQorCQlzY2hlZHVsZSgpOworCWVsc2UKKwkJcmVzdWx0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJlc3VsdCA9IC1FUkVTVEFSVFNZUzsKKwlyZW1vdmVfd2FpdF9xdWV1ZShmbF93YWl0LCAmd2FpdCk7CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbG9ja3NfYmxvY2tfb25fdGltZW91dChzdHJ1Y3QgZmlsZV9sb2NrICpibG9ja2VyLCBzdHJ1Y3QgZmlsZV9sb2NrICp3YWl0ZXIsIGludCB0aW1lKQoreworCWludCByZXN1bHQ7CisJbG9ja3NfaW5zZXJ0X2Jsb2NrKGJsb2NrZXIsIHdhaXRlcik7CisJcmVzdWx0ID0gaW50ZXJydXB0aWJsZV9zbGVlcF9vbl9sb2NrZWQoJndhaXRlci0+Zmxfd2FpdCwgdGltZSk7CisJX19sb2Nrc19kZWxldGVfYmxvY2sod2FpdGVyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdHJ1Y3QgZmlsZV9sb2NrICoKK3Bvc2l4X3Rlc3RfbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IGZpbGVfbG9jayAqY2ZsOworCisJbG9ja19rZXJuZWwoKTsKKwlmb3IgKGNmbCA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2Zsb2NrOyBjZmw7IGNmbCA9IGNmbC0+ZmxfbmV4dCkgeworCQlpZiAoIUlTX1BPU0lYKGNmbCkpCisJCQljb250aW51ZTsKKwkJaWYgKHBvc2l4X2xvY2tzX2NvbmZsaWN0KGNmbCwgZmwpKQorCQkJYnJlYWs7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiAoY2ZsKTsKK30KKworRVhQT1JUX1NZTUJPTChwb3NpeF90ZXN0X2xvY2spOworCisvKiBUaGlzIGZ1bmN0aW9uIHRlc3RzIGZvciBkZWFkbG9jayBjb25kaXRpb24gYmVmb3JlIHB1dHRpbmcgYSBwcm9jZXNzIHRvCisgKiBzbGVlcC4gVGhlIGRldGVjdGlvbiBzY2hlbWUgaXMgbm8gbG9uZ2VyIHJlY3Vyc2l2ZS4gUmVjdXJzaXZlIHdhcyBuZWF0LAorICogYnV0IGRhbmdlcm91cyAtIHdlIHJpc2tlZCBzdGFjayBjb3JydXB0aW9uIGlmIHRoZSBsb2NrIGRhdGEgd2FzIGJhZCwgb3IKKyAqIGlmIHRoZSByZWN1cnNpb24gd2FzIHRvbyBkZWVwIGZvciBhbnkgb3RoZXIgcmVhc29uLgorICoKKyAqIFdlIHJlbHkgb24gdGhlIGZhY3QgdGhhdCBhIHRhc2sgY2FuIG9ubHkgYmUgb24gb25lIGxvY2sncyB3YWl0IHF1ZXVlCisgKiBhdCBhIHRpbWUuIFdoZW4gd2UgZmluZCBibG9ja2VkX3Rhc2sgb24gYSB3YWl0IHF1ZXVlIHdlIGNhbiByZS1zZWFyY2gKKyAqIHdpdGggYmxvY2tlZF90YXNrIGVxdWFsIHRvIHRoYXQgcXVldWUncyBvd25lciwgdW50aWwgZWl0aGVyIGJsb2NrZWRfdGFzaworICogaXNuJ3QgZm91bmQsIG9yIGJsb2NrZWRfdGFzayBpcyBmb3VuZCBvbiBhIHF1ZXVlIG93bmVkIGJ5IG15X3Rhc2suCisgKgorICogTm90ZTogdGhlIGFib3ZlIGFzc3VtcHRpb24gbWF5IG5vdCBiZSB0cnVlIHdoZW4gaGFuZGxpbmcgbG9jayByZXF1ZXN0cworICogZnJvbSBhIGJyb2tlbiBORlMgY2xpZW50LiBCdXQgYnJva2VuIE5GUyBjbGllbnRzIGhhdmUgYSBsb3QgbW9yZSB0bworICogd29ycnkgYWJvdXQgdGhhbiBwcm9wZXIgZGVhZGxvY2sgZGV0ZWN0aW9uIGFueXdheS4uLiAtLW9raXIKKyAqLworaW50IHBvc2l4X2xvY2tzX2RlYWRsb2NrKHN0cnVjdCBmaWxlX2xvY2sgKmNhbGxlcl9mbCwKKwkJCQlzdHJ1Y3QgZmlsZV9sb2NrICpibG9ja19mbCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisKK25leHRfdGFzazoKKwlpZiAocG9zaXhfc2FtZV9vd25lcihjYWxsZXJfZmwsIGJsb2NrX2ZsKSkKKwkJcmV0dXJuIDE7CisJbGlzdF9mb3JfZWFjaCh0bXAsICZibG9ja2VkX2xpc3QpIHsKKwkJc3RydWN0IGZpbGVfbG9jayAqZmwgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGZpbGVfbG9jaywgZmxfbGluayk7CisJCWlmIChwb3NpeF9zYW1lX293bmVyKGZsLCBibG9ja19mbCkpIHsKKwkJCWZsID0gZmwtPmZsX25leHQ7CisJCQlibG9ja19mbCA9IGZsOworCQkJZ290byBuZXh0X3Rhc2s7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0wocG9zaXhfbG9ja3NfZGVhZGxvY2spOworCisvKiBUcnkgdG8gY3JlYXRlIGEgRkxPQ0sgbG9jayBvbiBmaWxwLiBXZSBhbHdheXMgaW5zZXJ0IG5ldyBGTE9DSyBsb2NrcworICogYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIGJ1dCB0aGF0J3Mgc2VjcmV0IGtub3dsZWRnZSBrbm93biBvbmx5IHRvCisgKiBmbG9ja19sb2NrX2ZpbGUgYW5kIHBvc2l4X2xvY2tfZmlsZS4KKyAqLworc3RhdGljIGludCBmbG9ja19sb2NrX2ZpbGUoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBmaWxlX2xvY2sgKm5ld19mbCkKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrICoqYmVmb3JlOworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW50IGVycm9yID0gMDsKKwlpbnQgZm91bmQgPSAwOworCisJbG9ja19rZXJuZWwoKTsKKwlmb3JfZWFjaF9sb2NrKGlub2RlLCBiZWZvcmUpIHsKKwkJc3RydWN0IGZpbGVfbG9jayAqZmwgPSAqYmVmb3JlOworCQlpZiAoSVNfUE9TSVgoZmwpKQorCQkJYnJlYWs7CisJCWlmIChJU19MRUFTRShmbCkpCisJCQljb250aW51ZTsKKwkJaWYgKGZpbHAgIT0gZmwtPmZsX2ZpbGUpCisJCQljb250aW51ZTsKKwkJaWYgKG5ld19mbC0+ZmxfdHlwZSA9PSBmbC0+ZmxfdHlwZSkKKwkJCWdvdG8gb3V0OworCQlmb3VuZCA9IDE7CisJCWxvY2tzX2RlbGV0ZV9sb2NrKGJlZm9yZSk7CisJCWJyZWFrOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisKKwlpZiAobmV3X2ZsLT5mbF90eXBlID09IEZfVU5MQ0spCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiBhIGhpZ2hlci1wcmlvcml0eSBwcm9jZXNzIHdhcyBibG9ja2VkIG9uIHRoZSBvbGQgZmlsZSBsb2NrLAorCSAqIGdpdmUgaXQgdGhlIG9wcG9ydHVuaXR5IHRvIGxvY2sgdGhlIGZpbGUuCisJICovCisJaWYgKGZvdW5kKQorCQljb25kX3Jlc2NoZWQoKTsKKworCWxvY2tfa2VybmVsKCk7CisJZm9yX2VhY2hfbG9jayhpbm9kZSwgYmVmb3JlKSB7CisJCXN0cnVjdCBmaWxlX2xvY2sgKmZsID0gKmJlZm9yZTsKKwkJaWYgKElTX1BPU0lYKGZsKSkKKwkJCWJyZWFrOworCQlpZiAoSVNfTEVBU0UoZmwpKQorCQkJY29udGludWU7CisJCWlmICghZmxvY2tfbG9ja3NfY29uZmxpY3QobmV3X2ZsLCBmbCkpCisJCQljb250aW51ZTsKKwkJZXJyb3IgPSAtRUFHQUlOOworCQlpZiAobmV3X2ZsLT5mbF9mbGFncyAmIEZMX1NMRUVQKSB7CisJCQlsb2Nrc19pbnNlcnRfYmxvY2soZmwsIG5ld19mbCk7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCWxvY2tzX2luc2VydF9sb2NrKCZpbm9kZS0+aV9mbG9jaywgbmV3X2ZsKTsKKwllcnJvciA9IDA7CisKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycm9yOworfQorCitFWFBPUlRfU1lNQk9MKHBvc2l4X2xvY2tfZmlsZSk7CisKK3N0YXRpYyBpbnQgX19wb3NpeF9sb2NrX2ZpbGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGVfbG9jayAqcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbDsKKwlzdHJ1Y3QgZmlsZV9sb2NrICpuZXdfZmwsICpuZXdfZmwyOworCXN0cnVjdCBmaWxlX2xvY2sgKmxlZnQgPSBOVUxMOworCXN0cnVjdCBmaWxlX2xvY2sgKnJpZ2h0ID0gTlVMTDsKKwlzdHJ1Y3QgZmlsZV9sb2NrICoqYmVmb3JlOworCWludCBlcnJvciwgYWRkZWQgPSAwOworCisJLyoKKwkgKiBXZSBtYXkgbmVlZCB0d28gZmlsZV9sb2NrIHN0cnVjdHVyZXMgZm9yIHRoaXMgb3BlcmF0aW9uLAorCSAqIHNvIHdlIGdldCB0aGVtIGluIGFkdmFuY2UgdG8gYXZvaWQgcmFjZXMuCisJICovCisJbmV3X2ZsID0gbG9ja3NfYWxsb2NfbG9jaygpOworCW5ld19mbDIgPSBsb2Nrc19hbGxvY19sb2NrKCk7CisKKwlsb2NrX2tlcm5lbCgpOworCWlmIChyZXF1ZXN0LT5mbF90eXBlICE9IEZfVU5MQ0spIHsKKwkJZm9yX2VhY2hfbG9jayhpbm9kZSwgYmVmb3JlKSB7CisJCQlzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9ICpiZWZvcmU7CisJCQlpZiAoIUlTX1BPU0lYKGZsKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghcG9zaXhfbG9ja3NfY29uZmxpY3QocmVxdWVzdCwgZmwpKQorCQkJCWNvbnRpbnVlOworCQkJZXJyb3IgPSAtRUFHQUlOOworCQkJaWYgKCEocmVxdWVzdC0+ZmxfZmxhZ3MgJiBGTF9TTEVFUCkpCisJCQkJZ290byBvdXQ7CisJCQllcnJvciA9IC1FREVBRExLOworCQkJaWYgKHBvc2l4X2xvY2tzX2RlYWRsb2NrKHJlcXVlc3QsIGZsKSkKKwkJCQlnb3RvIG91dDsKKwkJCWVycm9yID0gLUVBR0FJTjsKKwkJCWxvY2tzX2luc2VydF9ibG9jayhmbCwgcmVxdWVzdCk7CisJCQlnb3RvIG91dDsKKyAgCQl9CisgIAl9CisKKwkvKiBJZiB3ZSdyZSBqdXN0IGxvb2tpbmcgZm9yIGEgY29uZmxpY3QsIHdlJ3JlIGRvbmUuICovCisJZXJyb3IgPSAwOworCWlmIChyZXF1ZXN0LT5mbF9mbGFncyAmIEZMX0FDQ0VTUykKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IC1FTk9MQ0s7IC8qICJubyBsdWNrIiAqLworCWlmICghKG5ld19mbCAmJiBuZXdfZmwyKSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIFdlJ3ZlIGFsbG9jYXRlZCB0aGUgbmV3IGxvY2tzIGluIGFkdmFuY2UsIHNvIHRoZXJlIGFyZSBubworCSAqIGVycm9ycyBwb3NzaWJsZSAoYW5kIG5vIGJsb2NraW5nIG9wZXJhdGlvbnMpIGZyb20gaGVyZSBvbi4KKwkgKiAKKwkgKiBGaW5kIHRoZSBmaXJzdCBvbGQgbG9jayB3aXRoIHRoZSBzYW1lIG93bmVyIGFzIHRoZSBuZXcgbG9jay4KKwkgKi8KKwkKKwliZWZvcmUgPSAmaW5vZGUtPmlfZmxvY2s7CisKKwkvKiBGaXJzdCBza2lwIGxvY2tzIG93bmVkIGJ5IG90aGVyIHByb2Nlc3Nlcy4gICovCisJd2hpbGUgKChmbCA9ICpiZWZvcmUpICYmICghSVNfUE9TSVgoZmwpIHx8CisJCQkJICAhcG9zaXhfc2FtZV9vd25lcihyZXF1ZXN0LCBmbCkpKSB7CisJCWJlZm9yZSA9ICZmbC0+ZmxfbmV4dDsKKwl9CisKKwkvKiBQcm9jZXNzIGxvY2tzIHdpdGggdGhpcyBvd25lci4gICovCisJd2hpbGUgKChmbCA9ICpiZWZvcmUpICYmIHBvc2l4X3NhbWVfb3duZXIocmVxdWVzdCwgZmwpKSB7CisJCS8qIERldGVjdCBhZGphY2VudCBvciBvdmVybGFwcGluZyByZWdpb25zIChpZiBzYW1lIGxvY2sgdHlwZSkKKwkJICovCisJCWlmIChyZXF1ZXN0LT5mbF90eXBlID09IGZsLT5mbF90eXBlKSB7CisJCQlpZiAoZmwtPmZsX2VuZCA8IHJlcXVlc3QtPmZsX3N0YXJ0IC0gMSkKKwkJCQlnb3RvIG5leHRfbG9jazsKKwkJCS8qIElmIHRoZSBuZXh0IGxvY2sgaW4gdGhlIGxpc3QgaGFzIGVudGlyZWx5IGJpZ2dlcgorCQkJICogYWRkcmVzc2VzIHRoYW4gdGhlIG5ldyBvbmUsIGluc2VydCB0aGUgbG9jayBoZXJlLgorCQkJICovCisJCQlpZiAoZmwtPmZsX3N0YXJ0ID4gcmVxdWVzdC0+ZmxfZW5kICsgMSkKKwkJCQlicmVhazsKKworCQkJLyogSWYgd2UgY29tZSBoZXJlLCB0aGUgbmV3IGFuZCBvbGQgbG9jayBhcmUgb2YgdGhlCisJCQkgKiBzYW1lIHR5cGUgYW5kIGFkamFjZW50IG9yIG92ZXJsYXBwaW5nLiBNYWtlIG9uZQorCQkJICogbG9jayB5aWVsZGluZyBmcm9tIHRoZSBsb3dlciBzdGFydCBhZGRyZXNzIG9mIGJvdGgKKwkJCSAqIGxvY2tzIHRvIHRoZSBoaWdoZXIgZW5kIGFkZHJlc3MuCisJCQkgKi8KKwkJCWlmIChmbC0+Zmxfc3RhcnQgPiByZXF1ZXN0LT5mbF9zdGFydCkKKwkJCQlmbC0+Zmxfc3RhcnQgPSByZXF1ZXN0LT5mbF9zdGFydDsKKwkJCWVsc2UKKwkJCQlyZXF1ZXN0LT5mbF9zdGFydCA9IGZsLT5mbF9zdGFydDsKKwkJCWlmIChmbC0+ZmxfZW5kIDwgcmVxdWVzdC0+ZmxfZW5kKQorCQkJCWZsLT5mbF9lbmQgPSByZXF1ZXN0LT5mbF9lbmQ7CisJCQllbHNlCisJCQkJcmVxdWVzdC0+ZmxfZW5kID0gZmwtPmZsX2VuZDsKKwkJCWlmIChhZGRlZCkgeworCQkJCWxvY2tzX2RlbGV0ZV9sb2NrKGJlZm9yZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZXF1ZXN0ID0gZmw7CisJCQlhZGRlZCA9IDE7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBQcm9jZXNzaW5nIGZvciBkaWZmZXJlbnQgbG9jayB0eXBlcyBpcyBhIGJpdAorCQkJICogbW9yZSBjb21wbGV4LgorCQkJICovCisJCQlpZiAoZmwtPmZsX2VuZCA8IHJlcXVlc3QtPmZsX3N0YXJ0KQorCQkJCWdvdG8gbmV4dF9sb2NrOworCQkJaWYgKGZsLT5mbF9zdGFydCA+IHJlcXVlc3QtPmZsX2VuZCkKKwkJCQlicmVhazsKKwkJCWlmIChyZXF1ZXN0LT5mbF90eXBlID09IEZfVU5MQ0spCisJCQkJYWRkZWQgPSAxOworCQkJaWYgKGZsLT5mbF9zdGFydCA8IHJlcXVlc3QtPmZsX3N0YXJ0KQorCQkJCWxlZnQgPSBmbDsKKwkJCS8qIElmIHRoZSBuZXh0IGxvY2sgaW4gdGhlIGxpc3QgaGFzIGEgaGlnaGVyIGVuZAorCQkJICogYWRkcmVzcyB0aGFuIHRoZSBuZXcgb25lLCBpbnNlcnQgdGhlIG5ldyBvbmUgaGVyZS4KKwkJCSAqLworCQkJaWYgKGZsLT5mbF9lbmQgPiByZXF1ZXN0LT5mbF9lbmQpIHsKKwkJCQlyaWdodCA9IGZsOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGZsLT5mbF9zdGFydCA+PSByZXF1ZXN0LT5mbF9zdGFydCkgeworCQkJCS8qIFRoZSBuZXcgbG9jayBjb21wbGV0ZWx5IHJlcGxhY2VzIGFuIG9sZAorCQkJCSAqIG9uZSAoVGhpcyBtYXkgaGFwcGVuIHNldmVyYWwgdGltZXMpLgorCQkJCSAqLworCQkJCWlmIChhZGRlZCkgeworCQkJCQlsb2Nrc19kZWxldGVfbG9jayhiZWZvcmUpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogUmVwbGFjZSB0aGUgb2xkIGxvY2sgd2l0aCB0aGUgbmV3IG9uZS4KKwkJCQkgKiBXYWtlIHVwIGFueWJvZHkgd2FpdGluZyBmb3IgdGhlIG9sZCBvbmUsCisJCQkJICogYXMgdGhlIGNoYW5nZSBpbiBsb2NrIHR5cGUgbWlnaHQgc2F0aXNmeQorCQkJCSAqIHRoZWlyIG5lZWRzLgorCQkJCSAqLworCQkJCWxvY2tzX3dha2VfdXBfYmxvY2tzKGZsKTsKKwkJCQlmbC0+Zmxfc3RhcnQgPSByZXF1ZXN0LT5mbF9zdGFydDsKKwkJCQlmbC0+ZmxfZW5kID0gcmVxdWVzdC0+ZmxfZW5kOworCQkJCWZsLT5mbF90eXBlID0gcmVxdWVzdC0+ZmxfdHlwZTsKKwkJCQlmbC0+ZmxfdSA9IHJlcXVlc3QtPmZsX3U7CisJCQkJcmVxdWVzdCA9IGZsOworCQkJCWFkZGVkID0gMTsKKwkJCX0KKwkJfQorCQkvKiBHbyBvbiB0byBuZXh0IGxvY2suCisJCSAqLworCW5leHRfbG9jazoKKwkJYmVmb3JlID0gJmZsLT5mbF9uZXh0OworCX0KKworCWVycm9yID0gMDsKKwlpZiAoIWFkZGVkKSB7CisJCWlmIChyZXF1ZXN0LT5mbF90eXBlID09IEZfVU5MQ0spCisJCQlnb3RvIG91dDsKKwkJbG9ja3NfY29weV9sb2NrKG5ld19mbCwgcmVxdWVzdCk7CisJCWxvY2tzX2luc2VydF9sb2NrKGJlZm9yZSwgbmV3X2ZsKTsKKwkJbmV3X2ZsID0gTlVMTDsKKwl9CisJaWYgKHJpZ2h0KSB7CisJCWlmIChsZWZ0ID09IHJpZ2h0KSB7CisJCQkvKiBUaGUgbmV3IGxvY2sgYnJlYWtzIHRoZSBvbGQgb25lIGluIHR3byBwaWVjZXMsCisJCQkgKiBzbyB3ZSBoYXZlIHRvIHVzZSB0aGUgc2Vjb25kIG5ldyBsb2NrLgorCQkJICovCisJCQlsZWZ0ID0gbmV3X2ZsMjsKKwkJCW5ld19mbDIgPSBOVUxMOworCQkJbG9ja3NfY29weV9sb2NrKGxlZnQsIHJpZ2h0KTsKKwkJCWxvY2tzX2luc2VydF9sb2NrKGJlZm9yZSwgbGVmdCk7CisJCX0KKwkJcmlnaHQtPmZsX3N0YXJ0ID0gcmVxdWVzdC0+ZmxfZW5kICsgMTsKKwkJbG9ja3Nfd2FrZV91cF9ibG9ja3MocmlnaHQpOworCX0KKwlpZiAobGVmdCkgeworCQlsZWZ0LT5mbF9lbmQgPSByZXF1ZXN0LT5mbF9zdGFydCAtIDE7CisJCWxvY2tzX3dha2VfdXBfYmxvY2tzKGxlZnQpOworCX0KKyBvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCS8qCisJICogRnJlZSBhbnkgdW51c2VkIGxvY2tzLgorCSAqLworCWlmIChuZXdfZmwpCisJCWxvY2tzX2ZyZWVfbG9jayhuZXdfZmwpOworCWlmIChuZXdfZmwyKQorCQlsb2Nrc19mcmVlX2xvY2sobmV3X2ZsMik7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIHBvc2l4X2xvY2tfZmlsZSAtIEFwcGx5IGEgUE9TSVgtc3R5bGUgbG9jayB0byBhIGZpbGUKKyAqIEBmaWxwOiBUaGUgZmlsZSB0byBhcHBseSB0aGUgbG9jayB0bworICogQGZsOiBUaGUgbG9jayB0byBiZSBhcHBsaWVkCisgKgorICogQWRkIGEgUE9TSVggc3R5bGUgbG9jayB0byBhIGZpbGUuCisgKiBXZSBtZXJnZSBhZGphY2VudCAmIG92ZXJsYXBwaW5nIGxvY2tzIHdoZW5ldmVyIHBvc3NpYmxlLgorICogUE9TSVggbG9ja3MgYXJlIHNvcnRlZCBieSBvd25lciB0YXNrLCB0aGVuIGJ5IHN0YXJ0aW5nIGFkZHJlc3MKKyAqLworaW50IHBvc2l4X2xvY2tfZmlsZShzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJcmV0dXJuIF9fcG9zaXhfbG9ja19maWxlKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCBmbCk7Cit9CisKKy8qKgorICogcG9zaXhfbG9ja19maWxlX3dhaXQgLSBBcHBseSBhIFBPU0lYLXN0eWxlIGxvY2sgdG8gYSBmaWxlCisgKiBAZmlscDogVGhlIGZpbGUgdG8gYXBwbHkgdGhlIGxvY2sgdG8KKyAqIEBmbDogVGhlIGxvY2sgdG8gYmUgYXBwbGllZAorICoKKyAqIEFkZCBhIFBPU0lYIHN0eWxlIGxvY2sgdG8gYSBmaWxlLgorICogV2UgbWVyZ2UgYWRqYWNlbnQgJiBvdmVybGFwcGluZyBsb2NrcyB3aGVuZXZlciBwb3NzaWJsZS4KKyAqIFBPU0lYIGxvY2tzIGFyZSBzb3J0ZWQgYnkgb3duZXIgdGFzaywgdGhlbiBieSBzdGFydGluZyBhZGRyZXNzCisgKi8KK2ludCBwb3NpeF9sb2NrX2ZpbGVfd2FpdChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJaW50IGVycm9yOworCW1pZ2h0X3NsZWVwICgpOworCWZvciAoOzspIHsKKwkJZXJyb3IgPSBfX3Bvc2l4X2xvY2tfZmlsZShmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmwpOworCQlpZiAoKGVycm9yICE9IC1FQUdBSU4pIHx8ICEoZmwtPmZsX2ZsYWdzICYgRkxfU0xFRVApKQorCQkJYnJlYWs7CisJCWVycm9yID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGZsLT5mbF93YWl0LCAhZmwtPmZsX25leHQpOworCQlpZiAoIWVycm9yKQorCQkJY29udGludWU7CisKKwkJbG9ja3NfZGVsZXRlX2Jsb2NrKGZsKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0wocG9zaXhfbG9ja19maWxlX3dhaXQpOworCisvKioKKyAqIGxvY2tzX21hbmRhdG9yeV9sb2NrZWQgLSBDaGVjayBmb3IgYW4gYWN0aXZlIGxvY2sKKyAqIEBpbm9kZTogdGhlIGZpbGUgdG8gY2hlY2sKKyAqCisgKiBTZWFyY2hlcyB0aGUgaW5vZGUncyBsaXN0IG9mIGxvY2tzIHRvIGZpbmQgYW55IFBPU0lYIGxvY2tzIHdoaWNoIGNvbmZsaWN0LgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBsb2Nrc192ZXJpZnlfbG9ja2VkKCkgb25seS4KKyAqLworaW50IGxvY2tzX21hbmRhdG9yeV9sb2NrZWQoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlmbF9vd25lcl90IG93bmVyID0gY3VycmVudC0+ZmlsZXM7CisJc3RydWN0IGZpbGVfbG9jayAqZmw7CisKKwkvKgorCSAqIFNlYXJjaCB0aGUgbG9jayBsaXN0IGZvciB0aGlzIGlub2RlIGZvciBhbnkgUE9TSVggbG9ja3MuCisJICovCisJbG9ja19rZXJuZWwoKTsKKwlmb3IgKGZsID0gaW5vZGUtPmlfZmxvY2s7IGZsICE9IE5VTEw7IGZsID0gZmwtPmZsX25leHQpIHsKKwkJaWYgKCFJU19QT1NJWChmbCkpCisJCQljb250aW51ZTsKKwkJaWYgKGZsLT5mbF9vd25lciAhPSBvd25lcikKKwkJCWJyZWFrOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGZsID8gLUVBR0FJTiA6IDA7Cit9CisKKy8qKgorICogbG9ja3NfbWFuZGF0b3J5X2FyZWEgLSBDaGVjayBmb3IgYSBjb25mbGljdGluZyBsb2NrCisgKiBAcmVhZF93cml0ZTogJUZMT0NLX1ZFUklGWV9XUklURSBmb3IgZXhjbHVzaXZlIGFjY2VzcywgJUZMT0NLX1ZFUklGWV9SRUFECisgKgkJZm9yIHNoYXJlZAorICogQGlub2RlOiAgICAgIHRoZSBmaWxlIHRvIGNoZWNrCisgKiBAZmlscDogICAgICAgaG93IHRoZSBmaWxlIHdhcyBvcGVuZWQgKGlmIGl0IHdhcykKKyAqIEBvZmZzZXQ6ICAgICBzdGFydCBvZiBhcmVhIHRvIGNoZWNrCisgKiBAY291bnQ6ICAgICAgbGVuZ3RoIG9mIGFyZWEgdG8gY2hlY2sKKyAqCisgKiBTZWFyY2hlcyB0aGUgaW5vZGUncyBsaXN0IG9mIGxvY2tzIHRvIGZpbmQgYW55IFBPU0lYIGxvY2tzIHdoaWNoIGNvbmZsaWN0LgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSByd192ZXJpZnlfYXJlYSgpIGFuZAorICogbG9ja3NfdmVyaWZ5X3RydW5jYXRlKCkuCisgKi8KK2ludCBsb2Nrc19tYW5kYXRvcnlfYXJlYShpbnQgcmVhZF93cml0ZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSBzdHJ1Y3QgZmlsZSAqZmlscCwgbG9mZl90IG9mZnNldCwKKwkJCSBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGZpbGVfbG9jayBmbDsKKwlpbnQgZXJyb3I7CisKKwlsb2Nrc19pbml0X2xvY2soJmZsKTsKKwlmbC5mbF9vd25lciA9IGN1cnJlbnQtPmZpbGVzOworCWZsLmZsX3BpZCA9IGN1cnJlbnQtPnRnaWQ7CisJZmwuZmxfZmlsZSA9IGZpbHA7CisJZmwuZmxfZmxhZ3MgPSBGTF9QT1NJWCB8IEZMX0FDQ0VTUzsKKwlpZiAoZmlscCAmJiAhKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKKwkJZmwuZmxfZmxhZ3MgfD0gRkxfU0xFRVA7CisJZmwuZmxfdHlwZSA9IChyZWFkX3dyaXRlID09IEZMT0NLX1ZFUklGWV9XUklURSkgPyBGX1dSTENLIDogRl9SRExDSzsKKwlmbC5mbF9zdGFydCA9IG9mZnNldDsKKwlmbC5mbF9lbmQgPSBvZmZzZXQgKyBjb3VudCAtIDE7CisKKwlmb3IgKDs7KSB7CisJCWVycm9yID0gX19wb3NpeF9sb2NrX2ZpbGUoaW5vZGUsICZmbCk7CisJCWlmIChlcnJvciAhPSAtRUFHQUlOKQorCQkJYnJlYWs7CisJCWlmICghKGZsLmZsX2ZsYWdzICYgRkxfU0xFRVApKQorCQkJYnJlYWs7CisJCWVycm9yID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGZsLmZsX3dhaXQsICFmbC5mbF9uZXh0KTsKKwkJaWYgKCFlcnJvcikgeworCQkJLyoKKwkJCSAqIElmIHdlJ3ZlIGJlZW4gc2xlZXBpbmcgc29tZW9uZSBtaWdodCBoYXZlCisJCQkgKiBjaGFuZ2VkIHRoZSBwZXJtaXNzaW9ucyBiZWhpbmQgb3VyIGJhY2suCisJCQkgKi8KKwkJCWlmICgoaW5vZGUtPmlfbW9kZSAmIChTX0lTR0lEIHwgU19JWEdSUCkpID09IFNfSVNHSUQpCisJCQkJY29udGludWU7CisJCX0KKworCQlsb2Nrc19kZWxldGVfYmxvY2soJmZsKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCitFWFBPUlRfU1lNQk9MKGxvY2tzX21hbmRhdG9yeV9hcmVhKTsKKworLyogV2UgYWxyZWFkeSBoYWQgYSBsZWFzZSBvbiB0aGlzIGZpbGU7IGp1c3QgY2hhbmdlIGl0cyB0eXBlICovCitpbnQgbGVhc2VfbW9kaWZ5KHN0cnVjdCBmaWxlX2xvY2sgKipiZWZvcmUsIGludCBhcmcpCit7CisJc3RydWN0IGZpbGVfbG9jayAqZmwgPSAqYmVmb3JlOworCWludCBlcnJvciA9IGFzc2lnbl90eXBlKGZsLCBhcmcpOworCisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJbG9ja3Nfd2FrZV91cF9ibG9ja3MoZmwpOworCWlmIChhcmcgPT0gRl9VTkxDSykKKwkJbG9ja3NfZGVsZXRlX2xvY2soYmVmb3JlKTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChsZWFzZV9tb2RpZnkpOworCitzdGF0aWMgdm9pZCB0aW1lX291dF9sZWFzZXMoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrICoqYmVmb3JlOworCXN0cnVjdCBmaWxlX2xvY2sgKmZsOworCisJYmVmb3JlID0gJmlub2RlLT5pX2Zsb2NrOworCXdoaWxlICgoZmwgPSAqYmVmb3JlKSAmJiBJU19MRUFTRShmbCkgJiYgKGZsLT5mbF90eXBlICYgRl9JTlBST0dSRVNTKSkgeworCQlpZiAoKGZsLT5mbF9icmVha190aW1lID09IDApCisJCQkJfHwgdGltZV9iZWZvcmUoamlmZmllcywgZmwtPmZsX2JyZWFrX3RpbWUpKSB7CisJCQliZWZvcmUgPSAmZmwtPmZsX25leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICJsZWFzZSBicm9rZW4gLSBvd25lciBwaWQgPSAlZFxuIiwgZmwtPmZsX3BpZCk7CisJCWxlYXNlX21vZGlmeShiZWZvcmUsIGZsLT5mbF90eXBlICYgfkZfSU5QUk9HUkVTUyk7CisJCWlmIChmbCA9PSAqYmVmb3JlKQkvKiBsZWFzZV9tb2RpZnkgbWF5IGhhdmUgZnJlZWQgZmwgKi8KKwkJCWJlZm9yZSA9ICZmbC0+ZmxfbmV4dDsKKwl9Cit9CisKKy8qKgorICoJX19icmVha19sZWFzZQktCXJldm9rZSBhbGwgb3V0c3RhbmRpbmcgbGVhc2VzIG9uIGZpbGUKKyAqCUBpbm9kZTogdGhlIGlub2RlIG9mIHRoZSBmaWxlIHRvIHJldHVybgorICoJQG1vZGU6IHRoZSBvcGVuIG1vZGUgKHJlYWQgb3Igd3JpdGUpCisgKgorICoJYnJlYWtfbGVhc2UgKGlubGluZWQgZm9yIHNwZWVkKSBoYXMgY2hlY2tlZCB0aGVyZSBhbHJlYWR5CisgKglpcyBhIGxlYXNlIG9uIHRoaXMgZmlsZS4gIExlYXNlcyBhcmUgYnJva2VuIG9uIGEgY2FsbCB0byBvcGVuKCkKKyAqCW9yIHRydW5jYXRlKCkuICBUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcCB1bmxlc3MgeW91CisgKglzcGVjaWZpZWQgJU9fTk9OQkxPQ0sgdG8geW91ciBvcGVuKCkuCisgKi8KK2ludCBfX2JyZWFrX2xlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGludCBtb2RlKQoreworCWludCBlcnJvciA9IDAsIGZ1dHVyZTsKKwlzdHJ1Y3QgZmlsZV9sb2NrICpuZXdfZmwsICpmbG9jazsKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbDsKKwlpbnQgYWxsb2NfZXJyOworCXVuc2lnbmVkIGxvbmcgYnJlYWtfdGltZTsKKwlpbnQgaV9oYXZlX3RoaXNfbGVhc2UgPSAwOworCisJYWxsb2NfZXJyID0gbGVhc2VfYWxsb2MoTlVMTCwgbW9kZSAmIEZNT0RFX1dSSVRFID8gRl9XUkxDSyA6IEZfUkRMQ0ssCisJCQkmbmV3X2ZsKTsKKworCWxvY2tfa2VybmVsKCk7CisKKwl0aW1lX291dF9sZWFzZXMoaW5vZGUpOworCisJZmxvY2sgPSBpbm9kZS0+aV9mbG9jazsKKwlpZiAoKGZsb2NrID09IE5VTEwpIHx8ICFJU19MRUFTRShmbG9jaykpCisJCWdvdG8gb3V0OworCisJZm9yIChmbCA9IGZsb2NrOyBmbCAmJiBJU19MRUFTRShmbCk7IGZsID0gZmwtPmZsX25leHQpCisJCWlmIChmbC0+Zmxfb3duZXIgPT0gY3VycmVudC0+ZmlsZXMpCisJCQlpX2hhdmVfdGhpc19sZWFzZSA9IDE7CisKKwlpZiAobW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCS8qIElmIHdlIHdhbnQgd3JpdGUgYWNjZXNzLCB3ZSBoYXZlIHRvIHJldm9rZSBhbnkgbGVhc2UuICovCisJCWZ1dHVyZSA9IEZfVU5MQ0sgfCBGX0lOUFJPR1JFU1M7CisJfSBlbHNlIGlmIChmbG9jay0+ZmxfdHlwZSAmIEZfSU5QUk9HUkVTUykgeworCQkvKiBJZiB0aGUgbGVhc2UgaXMgYWxyZWFkeSBiZWluZyBicm9rZW4sIHdlIGp1c3QgbGVhdmUgaXQgKi8KKwkJZnV0dXJlID0gZmxvY2stPmZsX3R5cGU7CisJfSBlbHNlIGlmIChmbG9jay0+ZmxfdHlwZSAmIEZfV1JMQ0spIHsKKwkJLyogRG93bmdyYWRlIHRoZSBleGNsdXNpdmUgbGVhc2UgdG8gYSByZWFkLW9ubHkgbGVhc2UuICovCisJCWZ1dHVyZSA9IEZfUkRMQ0sgfCBGX0lOUFJPR1JFU1M7CisJfSBlbHNlIHsKKwkJLyogdGhlIGV4aXN0aW5nIGxlYXNlIHdhcyByZWFkLW9ubHksIHNvIHdlIGNhbiByZWFkIHRvby4gKi8KKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGFsbG9jX2VyciAmJiAhaV9oYXZlX3RoaXNfbGVhc2UgJiYgKChtb2RlICYgT19OT05CTE9DSykgPT0gMCkpIHsKKwkJZXJyb3IgPSBhbGxvY19lcnI7CisJCWdvdG8gb3V0OworCX0KKworCWJyZWFrX3RpbWUgPSAwOworCWlmIChsZWFzZV9icmVha190aW1lID4gMCkgeworCQlicmVha190aW1lID0gamlmZmllcyArIGxlYXNlX2JyZWFrX3RpbWUgKiBIWjsKKwkJaWYgKGJyZWFrX3RpbWUgPT0gMCkKKwkJCWJyZWFrX3RpbWUrKzsJLyogc28gdGhhdCAwIG1lYW5zIG5vIGJyZWFrIHRpbWUgKi8KKwl9CisKKwlmb3IgKGZsID0gZmxvY2s7IGZsICYmIElTX0xFQVNFKGZsKTsgZmwgPSBmbC0+ZmxfbmV4dCkgeworCQlpZiAoZmwtPmZsX3R5cGUgIT0gZnV0dXJlKSB7CisJCQlmbC0+ZmxfdHlwZSA9IGZ1dHVyZTsKKwkJCWZsLT5mbF9icmVha190aW1lID0gYnJlYWtfdGltZTsKKwkJCS8qIGxlYXNlIG11c3QgaGF2ZSBsbW9wcyBicmVhayBjYWxsYmFjayAqLworCQkJZmwtPmZsX2xtb3BzLT5mbF9icmVhayhmbCk7CisJCX0KKwl9CisKKwlpZiAoaV9oYXZlX3RoaXNfbGVhc2UgfHwgKG1vZGUgJiBPX05PTkJMT0NLKSkgeworCQllcnJvciA9IC1FV09VTERCTE9DSzsKKwkJZ290byBvdXQ7CisJfQorCityZXN0YXJ0OgorCWJyZWFrX3RpbWUgPSBmbG9jay0+ZmxfYnJlYWtfdGltZTsKKwlpZiAoYnJlYWtfdGltZSAhPSAwKSB7CisJCWJyZWFrX3RpbWUgLT0gamlmZmllczsKKwkJaWYgKGJyZWFrX3RpbWUgPT0gMCkKKwkJCWJyZWFrX3RpbWUrKzsKKwl9CisJZXJyb3IgPSBsb2Nrc19ibG9ja19vbl90aW1lb3V0KGZsb2NrLCBuZXdfZmwsIGJyZWFrX3RpbWUpOworCWlmIChlcnJvciA+PSAwKSB7CisJCWlmIChlcnJvciA9PSAwKQorCQkJdGltZV9vdXRfbGVhc2VzKGlub2RlKTsKKwkJLyogV2FpdCBmb3IgdGhlIG5leHQgbGVhc2UgdGhhdCBoYXMgbm90IGJlZW4gYnJva2VuIHlldCAqLworCQlmb3IgKGZsb2NrID0gaW5vZGUtPmlfZmxvY2s7IGZsb2NrICYmIElTX0xFQVNFKGZsb2NrKTsKKwkJCQlmbG9jayA9IGZsb2NrLT5mbF9uZXh0KSB7CisJCQlpZiAoZmxvY2stPmZsX3R5cGUgJiBGX0lOUFJPR1JFU1MpCisJCQkJZ290byByZXN0YXJ0OworCQl9CisJCWVycm9yID0gMDsKKwl9CisKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJaWYgKCFhbGxvY19lcnIpCisJCWxvY2tzX2ZyZWVfbG9jayhuZXdfZmwpOworCXJldHVybiBlcnJvcjsKK30KKworRVhQT1JUX1NZTUJPTChfX2JyZWFrX2xlYXNlKTsKKworLyoqCisgKglsZWFzZV9nZXRfbXRpbWUKKyAqCUBpbm9kZTogdGhlIGlub2RlCisgKiAgICAgIEB0aW1lOiAgcG9pbnRlciB0byBhIHRpbWVzcGVjIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgbGFzdCBtb2RpZmllZCB0aW1lCisgKgorICogVGhpcyBpcyB0byBmb3JjZSBORlMgY2xpZW50cyB0byBmbHVzaCB0aGVpciBjYWNoZXMgZm9yIGZpbGVzIHdpdGgKKyAqIGV4Y2x1c2l2ZSBsZWFzZXMuICBUaGUganVzdGlmaWNhdGlvbiBpcyB0aGF0IGlmIHNvbWVvbmUgaGFzIGFuCisgKiBleGNsdXNpdmUgbGVhc2UsIHRoZW4gdGhleSBjb3VsZCBiZSBtb2RpZml5aW5nIGl0LgorICovCit2b2lkIGxlYXNlX2dldF9tdGltZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpCit7CisJc3RydWN0IGZpbGVfbG9jayAqZmxvY2sgPSBpbm9kZS0+aV9mbG9jazsKKwlpZiAoZmxvY2sgJiYgSVNfTEVBU0UoZmxvY2spICYmIChmbG9jay0+ZmxfdHlwZSAmIEZfV1JMQ0spKQorCQkqdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CisJZWxzZQorCQkqdGltZSA9IGlub2RlLT5pX210aW1lOworfQorCitFWFBPUlRfU1lNQk9MKGxlYXNlX2dldF9tdGltZSk7CisKKy8qKgorICoJZmNudGxfZ2V0bGVhc2UgLSBFbnF1aXJlIHdoYXQgbGVhc2UgaXMgY3VycmVudGx5IGFjdGl2ZQorICoJQGZpbHA6IHRoZSBmaWxlCisgKgorICoJVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBvbmUgb2YKKyAqCShpZiBubyBsZWFzZSBicmVhayBpcyBwZW5kaW5nKToKKyAqCisgKgklRl9SRExDSyB0byBpbmRpY2F0ZSBhIHNoYXJlZCBsZWFzZSBpcyBoZWxkLgorICoKKyAqCSVGX1dSTENLIHRvIGluZGljYXRlIGFuIGV4Y2x1c2l2ZSBsZWFzZSBpcyBoZWxkLgorICoKKyAqCSVGX1VOTENLIHRvIGluZGljYXRlIG5vIGxlYXNlIGlzIGhlbGQuCisgKgorICoJKGlmIGEgbGVhc2UgYnJlYWsgaXMgcGVuZGluZyk6CisgKgorICoJJUZfUkRMQ0sgdG8gaW5kaWNhdGUgYW4gZXhjbHVzaXZlIGxlYXNlIG5lZWRzIHRvIGJlCisgKgkJY2hhbmdlZCB0byBhIHNoYXJlZCBsZWFzZSAob3IgcmVtb3ZlZCkuCisgKgorICoJJUZfVU5MQ0sgdG8gaW5kaWNhdGUgdGhlIGxlYXNlIG5lZWRzIHRvIGJlIHJlbW92ZWQuCisgKgorICoJWFhYOiBzZnIgJiB3aWxseSBkaXNhZ3JlZSBvdmVyIHdoZXRoZXIgRl9JTlBST0dSRVNTCisgKglzaG91bGQgYmUgcmV0dXJuZWQgdG8gdXNlcnNwYWNlLgorICovCitpbnQgZmNudGxfZ2V0bGVhc2Uoc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGZpbGVfbG9jayAqZmw7CisJaW50IHR5cGUgPSBGX1VOTENLOworCisJbG9ja19rZXJuZWwoKTsKKwl0aW1lX291dF9sZWFzZXMoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCWZvciAoZmwgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9mbG9jazsgZmwgJiYgSVNfTEVBU0UoZmwpOworCQkJZmwgPSBmbC0+ZmxfbmV4dCkgeworCQlpZiAoZmwtPmZsX2ZpbGUgPT0gZmlscCkgeworCQkJdHlwZSA9IGZsLT5mbF90eXBlICYgfkZfSU5QUk9HUkVTUzsKKwkJCWJyZWFrOworCQl9CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gdHlwZTsKK30KKworLyoqCisgKglfX3NldGxlYXNlCS0Jc2V0cyBhIGxlYXNlIG9uIGFuIG9wZW4gZmlsZQorICoJQGZpbHA6IGZpbGUgcG9pbnRlcgorICoJQGFyZzogdHlwZSBvZiBsZWFzZSB0byBvYnRhaW4KKyAqCUBmbHA6IGlucHV0IC0gZmlsZV9sb2NrIHRvIHVzZSwgb3V0cHV0IC0gZmlsZV9sb2NrIGluc2VydGVkCisgKgorICoJVGhlIChpbnB1dCkgZmxwLT5mbF9sbW9wcy0+ZmxfYnJlYWsgZnVuY3Rpb24gaXMgcmVxdWlyZWQKKyAqCWJ5IGJyZWFrX2xlYXNlKCkuCisgKgorICoJQ2FsbGVkIHdpdGgga2VybmVsIGxvY2sgaGVsZC4KKyAqLworaW50IF9fc2V0bGVhc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGxvbmcgYXJnLCBzdHJ1Y3QgZmlsZV9sb2NrICoqZmxwKQoreworCXN0cnVjdCBmaWxlX2xvY2sgKmZsLCAqKmJlZm9yZSwgKipteV9iZWZvcmUgPSBOVUxMLCAqbGVhc2UgPSAqZmxwOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGVycm9yLCByZGxlYXNlX2NvdW50ID0gMCwgd3JsZWFzZV9jb3VudCA9IDA7CisKKwl0aW1lX291dF9sZWFzZXMoaW5vZGUpOworCisJZXJyb3IgPSAtRUlOVkFMOworCWlmICghZmxwIHx8ICEoKmZscCkgfHwgISgqZmxwKS0+ZmxfbG1vcHMgfHwgISgqZmxwKS0+ZmxfbG1vcHMtPmZsX2JyZWFrKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gLUVBR0FJTjsKKwlpZiAoKGFyZyA9PSBGX1JETENLKSAmJiAoYXRvbWljX3JlYWQoJmlub2RlLT5pX3dyaXRlY291bnQpID4gMCkpCisJCWdvdG8gb3V0OworCWlmICgoYXJnID09IEZfV1JMQ0spCisJICAgICYmICgoYXRvbWljX3JlYWQoJmRlbnRyeS0+ZF9jb3VudCkgPiAxKQorCQl8fCAoYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSA+IDEpKSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQsIHdlIGtub3cgdGhhdCBpZiB0aGVyZSBpcyBhbiBleGNsdXNpdmUKKwkgKiBsZWFzZSBvbiB0aGlzIGZpbGUsIHRoZW4gd2UgaG9sZCBpdCBvbiB0aGlzIGZpbHAKKwkgKiAob3RoZXJ3aXNlIG91ciBvcGVuIG9mIHRoaXMgZmlsZSB3b3VsZCBoYXZlIGJsb2NrZWQpLgorCSAqIEFuZCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIGFjcXVpcmUgYW4gZXhjbHVzaXZlIGxlYXNlLAorCSAqIHRoZW4gdGhlIGZpbGUgaXMgbm90IG9wZW4gYnkgYW55b25lIChpbmNsdWRpbmcgdXMpCisJICogZXhjZXB0IGZvciB0aGlzIGZpbHAuCisJICovCisJZm9yIChiZWZvcmUgPSAmaW5vZGUtPmlfZmxvY2s7CisJCQkoKGZsID0gKmJlZm9yZSkgIT0gTlVMTCkgJiYgSVNfTEVBU0UoZmwpOworCQkJYmVmb3JlID0gJmZsLT5mbF9uZXh0KSB7CisJCWlmIChsZWFzZS0+ZmxfbG1vcHMtPmZsX215bGVhc2UoZmwsIGxlYXNlKSkKKwkJCW15X2JlZm9yZSA9IGJlZm9yZTsKKwkJZWxzZSBpZiAoZmwtPmZsX3R5cGUgPT0gKEZfSU5QUk9HUkVTUyB8IEZfVU5MQ0spKQorCQkJLyoKKwkJCSAqIFNvbWVvbmUgaXMgaW4gdGhlIHByb2Nlc3Mgb2Ygb3BlbmluZyB0aGlzCisJCQkgKiBmaWxlIGZvciB3cml0aW5nIHNvIHdlIG1heSBub3QgdGFrZSBhbgorCQkJICogZXhjbHVzaXZlIGxlYXNlIG9uIGl0LgorCQkJICovCisJCQl3cmxlYXNlX2NvdW50Kys7CisJCWVsc2UKKwkJCXJkbGVhc2VfY291bnQrKzsKKwl9CisKKwlpZiAoKGFyZyA9PSBGX1JETENLICYmICh3cmxlYXNlX2NvdW50ID4gMCkpIHx8CisJICAgIChhcmcgPT0gRl9XUkxDSyAmJiAoKHJkbGVhc2VfY291bnQgKyB3cmxlYXNlX2NvdW50KSA+IDApKSkKKwkJZ290byBvdXQ7CisKKwlpZiAobXlfYmVmb3JlICE9IE5VTEwpIHsKKwkJZXJyb3IgPSBsZWFzZS0+ZmxfbG1vcHMtPmZsX2NoYW5nZShteV9iZWZvcmUsIGFyZyk7CisJCWdvdG8gb3V0OworCX0KKworCWVycm9yID0gMDsKKwlpZiAoYXJnID09IEZfVU5MQ0spCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSAtRUlOVkFMOworCWlmICghbGVhc2VzX2VuYWJsZSkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IGxlYXNlX2FsbG9jKGZpbHAsIGFyZywgJmZsKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJbG9ja3NfY29weV9sb2NrKGZsLCBsZWFzZSk7CisKKwlsb2Nrc19pbnNlcnRfbG9jayhiZWZvcmUsIGZsKTsKKworCSpmbHAgPSBmbDsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKyAvKioKKyAqCXNldGxlYXNlICAgICAgICAtICAgICAgIHNldHMgYSBsZWFzZSBvbiBhbiBvcGVuIGZpbGUKKyAqCUBmaWxwOiBmaWxlIHBvaW50ZXIKKyAqCUBhcmc6IHR5cGUgb2YgbGVhc2UgdG8gb2J0YWluCisgKglAbGVhc2U6IGZpbGVfbG9jayB0byB1c2UKKyAqCisgKglDYWxsIHRoaXMgdG8gZXN0YWJsaXNoIGEgbGVhc2Ugb24gdGhlIGZpbGUuCisgKglUaGUgZmxfbG1vcHMgZmxfYnJlYWsgZnVuY3Rpb24gaXMgcmVxdWlyZWQgYnkgYnJlYWtfbGVhc2UKKyAqLworCitpbnQgc2V0bGVhc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGxvbmcgYXJnLCBzdHJ1Y3QgZmlsZV9sb2NrICoqbGVhc2UpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlscC0+Zl9kZW50cnk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCkgJiYgIWNhcGFibGUoQ0FQX0xFQVNFKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllcnJvciA9IHNlY3VyaXR5X2ZpbGVfbG9jayhmaWxwLCBhcmcpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJbG9ja19rZXJuZWwoKTsKKwllcnJvciA9IF9fc2V0bGVhc2UoZmlscCwgYXJnLCBsZWFzZSk7CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIGVycm9yOworfQorCitFWFBPUlRfU1lNQk9MKHNldGxlYXNlKTsKKworLyoqCisgKglmY250bF9zZXRsZWFzZQktCXNldHMgYSBsZWFzZSBvbiBhbiBvcGVuIGZpbGUKKyAqCUBmZDogb3BlbiBmaWxlIGRlc2NyaXB0b3IKKyAqCUBmaWxwOiBmaWxlIHBvaW50ZXIKKyAqCUBhcmc6IHR5cGUgb2YgbGVhc2UgdG8gb2J0YWluCisgKgorICoJQ2FsbCB0aGlzIGZjbnRsIHRvIGVzdGFibGlzaCBhIGxlYXNlIG9uIHRoZSBmaWxlLgorICoJTm90ZSB0aGF0IHlvdSBhbHNvIG5lZWQgdG8gY2FsbCAlRl9TRVRTSUcgdG8KKyAqCXJlY2VpdmUgYSBzaWduYWwgd2hlbiB0aGUgbGVhc2UgaXMgYnJva2VuLgorICovCitpbnQgZmNudGxfc2V0bGVhc2UodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgbG9uZyBhcmcpCit7CisJc3RydWN0IGZpbGVfbG9jayBmbCwgKmZscCA9ICZmbDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvcjsKKworCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfTEVBU0UpKQorCQlyZXR1cm4gLUVBQ0NFUzsKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRUlOVkFMOworCWVycm9yID0gc2VjdXJpdHlfZmlsZV9sb2NrKGZpbHAsIGFyZyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlsb2Nrc19pbml0X2xvY2soJmZsKTsKKwllcnJvciA9IGxlYXNlX2luaXQoZmlscCwgYXJnLCAmZmwpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJbG9ja19rZXJuZWwoKTsKKworCWVycm9yID0gX19zZXRsZWFzZShmaWxwLCBhcmcsICZmbHApOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfdW5sb2NrOworCisJZXJyb3IgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxwLCAxLCAmZmxwLT5mbF9mYXN5bmMpOworCWlmIChlcnJvciA8IDApIHsKKwkJLyogcmVtb3ZlIGxlYXNlIGp1c3QgaW5zZXJ0ZWQgYnkgX19zZXRsZWFzZSAqLworCQlmbHAtPmZsX3R5cGUgPSBGX1VOTENLIHwgRl9JTlBST0dSRVNTOworCQlmbHAtPmZsX2JyZWFrX3RpbWUgPSBqaWZmaWVzLSAxMDsKKwkJdGltZV9vdXRfbGVhc2VzKGlub2RlKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWVycm9yID0gZl9zZXRvd24oZmlscCwgY3VycmVudC0+cGlkLCAwKTsKK291dF91bmxvY2s6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBmbG9ja19sb2NrX2ZpbGVfd2FpdCAtIEFwcGx5IGEgRkxPQ0stc3R5bGUgbG9jayB0byBhIGZpbGUKKyAqIEBmaWxwOiBUaGUgZmlsZSB0byBhcHBseSB0aGUgbG9jayB0bworICogQGZsOiBUaGUgbG9jayB0byBiZSBhcHBsaWVkCisgKgorICogQWRkIGEgRkxPQ0sgc3R5bGUgbG9jayB0byBhIGZpbGUuCisgKi8KK2ludCBmbG9ja19sb2NrX2ZpbGVfd2FpdChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJaW50IGVycm9yOworCW1pZ2h0X3NsZWVwKCk7CisJZm9yICg7OykgeworCQllcnJvciA9IGZsb2NrX2xvY2tfZmlsZShmaWxwLCBmbCk7CisJCWlmICgoZXJyb3IgIT0gLUVBR0FJTikgfHwgIShmbC0+ZmxfZmxhZ3MgJiBGTF9TTEVFUCkpCisJCQlicmVhazsKKwkJZXJyb3IgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZmwtPmZsX3dhaXQsICFmbC0+ZmxfbmV4dCk7CisJCWlmICghZXJyb3IpCisJCQljb250aW51ZTsKKworCQlsb2Nrc19kZWxldGVfYmxvY2soZmwpOworCQlicmVhazsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCitFWFBPUlRfU1lNQk9MKGZsb2NrX2xvY2tfZmlsZV93YWl0KTsKKworLyoqCisgKglzeXNfZmxvY2s6IC0gZmxvY2soKSBzeXN0ZW0gY2FsbC4KKyAqCUBmZDogdGhlIGZpbGUgZGVzY3JpcHRvciB0byBsb2NrLgorICoJQGNtZDogdGhlIHR5cGUgb2YgbG9jayB0byBhcHBseS4KKyAqCisgKglBcHBseSBhICVGTF9GTE9DSyBzdHlsZSBsb2NrIHRvIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yLgorICoJVGhlIEBjbWQgY2FuIGJlIG9uZSBvZgorICoKKyAqCSVMT0NLX1NIIC0tIGEgc2hhcmVkIGxvY2suCisgKgorICoJJUxPQ0tfRVggLS0gYW4gZXhjbHVzaXZlIGxvY2suCisgKgorICoJJUxPQ0tfVU4gLS0gcmVtb3ZlIGFuIGV4aXN0aW5nIGxvY2suCisgKgorICoJJUxPQ0tfTUFORCAtLSBhIGBtYW5kYXRvcnknIGZsb2NrLiAgVGhpcyBleGlzdHMgdG8gZW11bGF0ZSBXaW5kb3dzIFNoYXJlIE1vZGVzLgorICoKKyAqCSVMT0NLX01BTkQgY2FuIGJlIGNvbWJpbmVkIHdpdGggJUxPQ0tfUkVBRCBvciAlTE9DS19XUklURSB0byBhbGxvdyBvdGhlcgorICoJcHJvY2Vzc2VzIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyByZXNwZWN0aXZlbHkuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfZmxvY2sodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kKQoreworCXN0cnVjdCBmaWxlICpmaWxwOworCXN0cnVjdCBmaWxlX2xvY2sgKmxvY2s7CisJaW50IGNhbl9zbGVlcCwgdW5sb2NrOworCWludCBlcnJvcjsKKworCWVycm9yID0gLUVCQURGOworCWZpbHAgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbHApCisJCWdvdG8gb3V0OworCisJY2FuX3NsZWVwID0gIShjbWQgJiBMT0NLX05CKTsKKwljbWQgJj0gfkxPQ0tfTkI7CisJdW5sb2NrID0gKGNtZCA9PSBMT0NLX1VOKTsKKworCWlmICghdW5sb2NrICYmICEoY21kICYgTE9DS19NQU5EKSAmJiAhKGZpbHAtPmZfbW9kZSAmIDMpKQorCQlnb3RvIG91dF9wdXRmOworCisJZXJyb3IgPSBmbG9ja19tYWtlX2xvY2soZmlscCwgJmxvY2ssIGNtZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9wdXRmOworCWlmIChjYW5fc2xlZXApCisJCWxvY2stPmZsX2ZsYWdzIHw9IEZMX1NMRUVQOworCisJZXJyb3IgPSBzZWN1cml0eV9maWxlX2xvY2soZmlscCwgY21kKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlpZiAoZmlscC0+Zl9vcCAmJiBmaWxwLT5mX29wLT5mbG9jaykKKwkJZXJyb3IgPSBmaWxwLT5mX29wLT5mbG9jayhmaWxwLAorCQkJCQkgIChjYW5fc2xlZXApID8gRl9TRVRMS1cgOiBGX1NFVExLLAorCQkJCQkgIGxvY2spOworCWVsc2UKKwkJZXJyb3IgPSBmbG9ja19sb2NrX2ZpbGVfd2FpdChmaWxwLCBsb2NrKTsKKworIG91dF9mcmVlOgorCWlmIChsaXN0X2VtcHR5KCZsb2NrLT5mbF9saW5rKSkgeworCQlsb2Nrc19mcmVlX2xvY2sobG9jayk7CisJfQorCisgb3V0X3B1dGY6CisJZnB1dChmaWxwKTsKKyBvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisvKiBSZXBvcnQgdGhlIGZpcnN0IGV4aXN0aW5nIGxvY2sgdGhhdCB3b3VsZCBjb25mbGljdCB3aXRoIGwuCisgKiBUaGlzIGltcGxlbWVudHMgdGhlIEZfR0VUTEsgY29tbWFuZCBvZiBmY250bCgpLgorICovCitpbnQgZmNudGxfZ2V0bGsoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBmbG9jayBfX3VzZXIgKmwpCit7CisJc3RydWN0IGZpbGVfbG9jayAqZmwsIGZpbGVfbG9jazsKKwlzdHJ1Y3QgZmxvY2sgZmxvY2s7CisJaW50IGVycm9yOworCisJZXJyb3IgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmZmxvY2ssIGwsIHNpemVvZihmbG9jaykpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKChmbG9jay5sX3R5cGUgIT0gRl9SRExDSykgJiYgKGZsb2NrLmxfdHlwZSAhPSBGX1dSTENLKSkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IGZsb2NrX3RvX3Bvc2l4X2xvY2soZmlscCwgJmZpbGVfbG9jaywgJmZsb2NrKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJaWYgKGZpbHAtPmZfb3AgJiYgZmlscC0+Zl9vcC0+bG9jaykgeworCQllcnJvciA9IGZpbHAtPmZfb3AtPmxvY2soZmlscCwgRl9HRVRMSywgJmZpbGVfbG9jayk7CisJCWlmIChlcnJvciA8IDApCisJCQlnb3RvIG91dDsKKwkJZWxzZQorCQkgIGZsID0gKGZpbGVfbG9jay5mbF90eXBlID09IEZfVU5MQ0sgPyBOVUxMIDogJmZpbGVfbG9jayk7CisJfSBlbHNlIHsKKwkJZmwgPSBwb3NpeF90ZXN0X2xvY2soZmlscCwgJmZpbGVfbG9jayk7CisJfQorIAorCWZsb2NrLmxfdHlwZSA9IEZfVU5MQ0s7CisJaWYgKGZsICE9IE5VTEwpIHsKKwkJZmxvY2subF9waWQgPSBmbC0+ZmxfcGlkOworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKKwkJLyoKKwkJICogTWFrZSBzdXJlIHdlIGNhbiByZXByZXNlbnQgdGhlIHBvc2l4IGxvY2sgdmlhCisJCSAqIGxlZ2FjeSAzMmJpdCBmbG9jay4KKwkJICovCisJCWVycm9yID0gLUVPVkVSRkxPVzsKKwkJaWYgKGZsLT5mbF9zdGFydCA+IE9GRlRfT0ZGU0VUX01BWCkKKwkJCWdvdG8gb3V0OworCQlpZiAoKGZsLT5mbF9lbmQgIT0gT0ZGU0VUX01BWCkKKwkJICAgICYmIChmbC0+ZmxfZW5kID4gT0ZGVF9PRkZTRVRfTUFYKSkKKwkJCWdvdG8gb3V0OworI2VuZGlmCisJCWZsb2NrLmxfc3RhcnQgPSBmbC0+Zmxfc3RhcnQ7CisJCWZsb2NrLmxfbGVuID0gZmwtPmZsX2VuZCA9PSBPRkZTRVRfTUFYID8gMCA6CisJCQlmbC0+ZmxfZW5kIC0gZmwtPmZsX3N0YXJ0ICsgMTsKKwkJZmxvY2subF93aGVuY2UgPSAwOworCQlmbG9jay5sX3R5cGUgPSBmbC0+ZmxfdHlwZTsKKwl9CisJZXJyb3IgPSAtRUZBVUxUOworCWlmICghY29weV90b191c2VyKGwsICZmbG9jaywgc2l6ZW9mKGZsb2NrKSkpCisJCWVycm9yID0gMDsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qIEFwcGx5IHRoZSBsb2NrIGRlc2NyaWJlZCBieSBsIHRvIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yLgorICogVGhpcyBpbXBsZW1lbnRzIGJvdGggdGhlIEZfU0VUTEsgYW5kIEZfU0VUTEtXIGNvbW1hbmRzIG9mIGZjbnRsKCkuCisgKi8KK2ludCBmY250bF9zZXRsayhzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgc3RydWN0IGZsb2NrIF9fdXNlciAqbCkKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmaWxlX2xvY2sgPSBsb2Nrc19hbGxvY19sb2NrKCk7CisJc3RydWN0IGZsb2NrIGZsb2NrOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGVycm9yOworCisJaWYgKGZpbGVfbG9jayA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0xDSzsKKworCS8qCisJICogVGhpcyBtaWdodCBibG9jaywgc28gd2UgZG8gaXQgYmVmb3JlIGNoZWNraW5nIHRoZSBpbm9kZS4KKwkgKi8KKwllcnJvciA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZmbG9jaywgbCwgc2l6ZW9mKGZsb2NrKSkpCisJCWdvdG8gb3V0OworCisJaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKworCS8qIERvbid0IGFsbG93IG1hbmRhdG9yeSBsb2NrcyBvbiBmaWxlcyB0aGF0IG1heSBiZSBtZW1vcnkgbWFwcGVkCisJICogYW5kIHNoYXJlZC4KKwkgKi8KKwlpZiAoSVNfTUFORExPQ0soaW5vZGUpICYmCisJICAgIChpbm9kZS0+aV9tb2RlICYgKFNfSVNHSUQgfCBTX0lYR1JQKSkgPT0gU19JU0dJRCAmJgorCSAgICBtYXBwaW5nX3dyaXRhYmx5X21hcHBlZChmaWxwLT5mX21hcHBpbmcpKSB7CisJCWVycm9yID0gLUVBR0FJTjsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyb3IgPSBmbG9ja190b19wb3NpeF9sb2NrKGZpbHAsIGZpbGVfbG9jaywgJmZsb2NrKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCWlmIChjbWQgPT0gRl9TRVRMS1cpIHsKKwkJZmlsZV9sb2NrLT5mbF9mbGFncyB8PSBGTF9TTEVFUDsKKwl9CisJCisJZXJyb3IgPSAtRUJBREY7CisJc3dpdGNoIChmbG9jay5sX3R5cGUpIHsKKwljYXNlIEZfUkRMQ0s6CisJCWlmICghKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCWNhc2UgRl9XUkxDSzoKKwkJaWYgKCEoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCWNhc2UgRl9VTkxDSzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwllcnJvciA9IHNlY3VyaXR5X2ZpbGVfbG9jayhmaWxwLCBmaWxlX2xvY2stPmZsX3R5cGUpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwlpZiAoZmlscC0+Zl9vcCAmJiBmaWxwLT5mX29wLT5sb2NrICE9IE5VTEwpIHsKKwkJZXJyb3IgPSBmaWxwLT5mX29wLT5sb2NrKGZpbHAsIGNtZCwgZmlsZV9sb2NrKTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yICg7OykgeworCQllcnJvciA9IF9fcG9zaXhfbG9ja19maWxlKGlub2RlLCBmaWxlX2xvY2spOworCQlpZiAoKGVycm9yICE9IC1FQUdBSU4pIHx8IChjbWQgPT0gRl9TRVRMSykpCisJCQlicmVhazsKKwkJZXJyb3IgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZmlsZV9sb2NrLT5mbF93YWl0LAorCQkJCSFmaWxlX2xvY2stPmZsX25leHQpOworCQlpZiAoIWVycm9yKQorCQkJY29udGludWU7CisKKwkJbG9ja3NfZGVsZXRlX2Jsb2NrKGZpbGVfbG9jayk7CisJCWJyZWFrOworCX0KKworIG91dDoKKwlsb2Nrc19mcmVlX2xvY2soZmlsZV9sb2NrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisvKiBSZXBvcnQgdGhlIGZpcnN0IGV4aXN0aW5nIGxvY2sgdGhhdCB3b3VsZCBjb25mbGljdCB3aXRoIGwuCisgKiBUaGlzIGltcGxlbWVudHMgdGhlIEZfR0VUTEsgY29tbWFuZCBvZiBmY250bCgpLgorICovCitpbnQgZmNudGxfZ2V0bGs2NChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGZsb2NrNjQgX191c2VyICpsKQoreworCXN0cnVjdCBmaWxlX2xvY2sgKmZsLCBmaWxlX2xvY2s7CisJc3RydWN0IGZsb2NrNjQgZmxvY2s7CisJaW50IGVycm9yOworCisJZXJyb3IgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmZmxvY2ssIGwsIHNpemVvZihmbG9jaykpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKChmbG9jay5sX3R5cGUgIT0gRl9SRExDSykgJiYgKGZsb2NrLmxfdHlwZSAhPSBGX1dSTENLKSkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IGZsb2NrNjRfdG9fcG9zaXhfbG9jayhmaWxwLCAmZmlsZV9sb2NrLCAmZmxvY2spOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwlpZiAoZmlscC0+Zl9vcCAmJiBmaWxwLT5mX29wLT5sb2NrKSB7CisJCWVycm9yID0gZmlscC0+Zl9vcC0+bG9jayhmaWxwLCBGX0dFVExLLCAmZmlsZV9sb2NrKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gb3V0OworCQllbHNlCisJCSAgZmwgPSAoZmlsZV9sb2NrLmZsX3R5cGUgPT0gRl9VTkxDSyA/IE5VTEwgOiAmZmlsZV9sb2NrKTsKKwl9IGVsc2UgeworCQlmbCA9IHBvc2l4X3Rlc3RfbG9jayhmaWxwLCAmZmlsZV9sb2NrKTsKKwl9CisgCisJZmxvY2subF90eXBlID0gRl9VTkxDSzsKKwlpZiAoZmwgIT0gTlVMTCkgeworCQlmbG9jay5sX3BpZCA9IGZsLT5mbF9waWQ7CisJCWZsb2NrLmxfc3RhcnQgPSBmbC0+Zmxfc3RhcnQ7CisJCWZsb2NrLmxfbGVuID0gZmwtPmZsX2VuZCA9PSBPRkZTRVRfTUFYID8gMCA6CisJCQlmbC0+ZmxfZW5kIC0gZmwtPmZsX3N0YXJ0ICsgMTsKKwkJZmxvY2subF93aGVuY2UgPSAwOworCQlmbG9jay5sX3R5cGUgPSBmbC0+ZmxfdHlwZTsKKwl9CisJZXJyb3IgPSAtRUZBVUxUOworCWlmICghY29weV90b191c2VyKGwsICZmbG9jaywgc2l6ZW9mKGZsb2NrKSkpCisJCWVycm9yID0gMDsKKyAgCitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisvKiBBcHBseSB0aGUgbG9jayBkZXNjcmliZWQgYnkgbCB0byBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvci4KKyAqIFRoaXMgaW1wbGVtZW50cyBib3RoIHRoZSBGX1NFVExLIGFuZCBGX1NFVExLVyBjb21tYW5kcyBvZiBmY250bCgpLgorICovCitpbnQgZmNudGxfc2V0bGs2NChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgc3RydWN0IGZsb2NrNjQgX191c2VyICpsKQoreworCXN0cnVjdCBmaWxlX2xvY2sgKmZpbGVfbG9jayA9IGxvY2tzX2FsbG9jX2xvY2soKTsKKwlzdHJ1Y3QgZmxvY2s2NCBmbG9jazsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnJvcjsKKworCWlmIChmaWxlX2xvY2sgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9MQ0s7CisKKwkvKgorCSAqIFRoaXMgbWlnaHQgYmxvY2ssIHNvIHdlIGRvIGl0IGJlZm9yZSBjaGVja2luZyB0aGUgaW5vZGUuCisJICovCisJZXJyb3IgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmZmxvY2ssIGwsIHNpemVvZihmbG9jaykpKQorCQlnb3RvIG91dDsKKworCWlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisKKwkvKiBEb24ndCBhbGxvdyBtYW5kYXRvcnkgbG9ja3Mgb24gZmlsZXMgdGhhdCBtYXkgYmUgbWVtb3J5IG1hcHBlZAorCSAqIGFuZCBzaGFyZWQuCisJICovCisJaWYgKElTX01BTkRMT0NLKGlub2RlKSAmJgorCSAgICAoaW5vZGUtPmlfbW9kZSAmIChTX0lTR0lEIHwgU19JWEdSUCkpID09IFNfSVNHSUQgJiYKKwkgICAgbWFwcGluZ193cml0YWJseV9tYXBwZWQoZmlscC0+Zl9tYXBwaW5nKSkgeworCQllcnJvciA9IC1FQUdBSU47CisJCWdvdG8gb3V0OworCX0KKworCWVycm9yID0gZmxvY2s2NF90b19wb3NpeF9sb2NrKGZpbHAsIGZpbGVfbG9jaywgJmZsb2NrKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCWlmIChjbWQgPT0gRl9TRVRMS1c2NCkgeworCQlmaWxlX2xvY2stPmZsX2ZsYWdzIHw9IEZMX1NMRUVQOworCX0KKwkKKwllcnJvciA9IC1FQkFERjsKKwlzd2l0Y2ggKGZsb2NrLmxfdHlwZSkgeworCWNhc2UgRl9SRExDSzoKKwkJaWYgKCEoZmlscC0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJY2FzZSBGX1dSTENLOgorCQlpZiAoIShmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJY2FzZSBGX1VOTENLOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWVycm9yID0gc2VjdXJpdHlfZmlsZV9sb2NrKGZpbHAsIGZpbGVfbG9jay0+ZmxfdHlwZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCWlmIChmaWxwLT5mX29wICYmIGZpbHAtPmZfb3AtPmxvY2sgIT0gTlVMTCkgeworCQllcnJvciA9IGZpbHAtPmZfb3AtPmxvY2soZmlscCwgY21kLCBmaWxlX2xvY2spOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKDs7KSB7CisJCWVycm9yID0gX19wb3NpeF9sb2NrX2ZpbGUoaW5vZGUsIGZpbGVfbG9jayk7CisJCWlmICgoZXJyb3IgIT0gLUVBR0FJTikgfHwgKGNtZCA9PSBGX1NFVExLNjQpKQorCQkJYnJlYWs7CisJCWVycm9yID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGZpbGVfbG9jay0+Zmxfd2FpdCwKKwkJCQkhZmlsZV9sb2NrLT5mbF9uZXh0KTsKKwkJaWYgKCFlcnJvcikKKwkJCWNvbnRpbnVlOworCisJCWxvY2tzX2RlbGV0ZV9ibG9jayhmaWxlX2xvY2spOworCQlicmVhazsKKwl9CisKK291dDoKKwlsb2Nrc19mcmVlX2xvY2soZmlsZV9sb2NrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisjZW5kaWYgLyogQklUU19QRVJfTE9ORyA9PSAzMiAqLworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgZmlsZSBpcyBiZWluZyByZW1vdmVkCisgKiBmcm9tIHRoZSB0YXNrJ3MgZmQgYXJyYXkuICBQT1NJWCBsb2NrcyBiZWxvbmdpbmcgdG8gdGhpcyB0YXNrCisgKiBhcmUgZGVsZXRlZCBhdCB0aGlzIHRpbWUuCisgKi8KK3ZvaWQgbG9ja3NfcmVtb3ZlX3Bvc2l4KHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IG93bmVyKQoreworCXN0cnVjdCBmaWxlX2xvY2sgbG9jaywgKipiZWZvcmU7CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBubyBsb2NrcyBoZWxkIG9uIHRoaXMgZmlsZSwgd2UgZG9uJ3QgbmVlZCB0byBjYWxsCisJICogcG9zaXhfbG9ja19maWxlKCkuICBBbm90aGVyIHByb2Nlc3MgY291bGQgYmUgc2V0dGluZyBhIGxvY2sgb24gdGhpcworCSAqIGZpbGUgYXQgdGhlIHNhbWUgdGltZSwgYnV0IHdlIHdvdWxkbid0IHJlbW92ZSB0aGF0IGxvY2sgYW55d2F5LgorCSAqLworCWJlZm9yZSA9ICZmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9mbG9jazsKKwlpZiAoKmJlZm9yZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlsb2NrLmZsX3R5cGUgPSBGX1VOTENLOworCWxvY2suZmxfZmxhZ3MgPSBGTF9QT1NJWDsKKwlsb2NrLmZsX3N0YXJ0ID0gMDsKKwlsb2NrLmZsX2VuZCA9IE9GRlNFVF9NQVg7CisJbG9jay5mbF9vd25lciA9IG93bmVyOworCWxvY2suZmxfcGlkID0gY3VycmVudC0+dGdpZDsKKwlsb2NrLmZsX2ZpbGUgPSBmaWxwOworCWxvY2suZmxfb3BzID0gTlVMTDsKKwlsb2NrLmZsX2xtb3BzID0gTlVMTDsKKworCWlmIChmaWxwLT5mX29wICYmIGZpbHAtPmZfb3AtPmxvY2sgIT0gTlVMTCkgeworCQlmaWxwLT5mX29wLT5sb2NrKGZpbHAsIEZfU0VUTEssICZsb2NrKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQ2FuJ3QgdXNlIHBvc2l4X2xvY2tfZmlsZSBoZXJlOyB3ZSBuZWVkIHRvIHJlbW92ZSBpdCBubyBtYXR0ZXIKKwkgKiB3aGljaCBwaWQgd2UgaGF2ZS4KKwkgKi8KKwlsb2NrX2tlcm5lbCgpOworCXdoaWxlICgqYmVmb3JlICE9IE5VTEwpIHsKKwkJc3RydWN0IGZpbGVfbG9jayAqZmwgPSAqYmVmb3JlOworCQlpZiAoSVNfUE9TSVgoZmwpICYmIHBvc2l4X3NhbWVfb3duZXIoZmwsICZsb2NrKSkgeworCQkJbG9ja3NfZGVsZXRlX2xvY2soYmVmb3JlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJlZm9yZSA9ICZmbC0+ZmxfbmV4dDsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworb3V0OgorCWlmIChsb2NrLmZsX29wcyAmJiBsb2NrLmZsX29wcy0+ZmxfcmVsZWFzZV9wcml2YXRlKQorCQlsb2NrLmZsX29wcy0+ZmxfcmVsZWFzZV9wcml2YXRlKCZsb2NrKTsKK30KKworRVhQT1JUX1NZTUJPTChsb2Nrc19yZW1vdmVfcG9zaXgpOworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gdGhlIGxhc3QgY2xvc2Ugb2YgYW4gb3BlbiBmaWxlLgorICovCit2b2lkIGxvY2tzX3JlbW92ZV9mbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOyAKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbDsKKwlzdHJ1Y3QgZmlsZV9sb2NrICoqYmVmb3JlOworCisJaWYgKCFpbm9kZS0+aV9mbG9jaykKKwkJcmV0dXJuOworCisJaWYgKGZpbHAtPmZfb3AgJiYgZmlscC0+Zl9vcC0+ZmxvY2spIHsKKwkJc3RydWN0IGZpbGVfbG9jayBmbCA9IHsKKwkJCS5mbF9waWQgPSBjdXJyZW50LT50Z2lkLAorCQkJLmZsX2ZpbGUgPSBmaWxwLAorCQkJLmZsX2ZsYWdzID0gRkxfRkxPQ0ssCisJCQkuZmxfdHlwZSA9IEZfVU5MQ0ssCisJCQkuZmxfZW5kID0gT0ZGU0VUX01BWCwKKwkJfTsKKwkJZmlscC0+Zl9vcC0+ZmxvY2soZmlscCwgRl9TRVRMS1csICZmbCk7CisJfQorCisJbG9ja19rZXJuZWwoKTsKKwliZWZvcmUgPSAmaW5vZGUtPmlfZmxvY2s7CisKKwl3aGlsZSAoKGZsID0gKmJlZm9yZSkgIT0gTlVMTCkgeworCQlpZiAoZmwtPmZsX2ZpbGUgPT0gZmlscCkgeworCQkJLyoKKwkJCSAqIFdlIG1pZ2h0IGhhdmUgYSBQT1NJWCBsb2NrIHRoYXQgd2FzIGNyZWF0ZWQgYXQgdGhlIHNhbWUgdGltZQorCQkJICogdGhlIGZpbHAgd2FzIGNsb3NlZCBmb3IgdGhlIGxhc3QgdGltZS4gSnVzdCByZW1vdmUgdGhhdCB0b28sCisJCQkgKiByZWdhcmRsZXNzIG9mIG93bmVyc2hpcCwgc2luY2Ugbm9ib2R5IGNhbiBvd24gaXQuCisJCQkgKi8KKwkJCWlmIChJU19GTE9DSyhmbCkgfHwgSVNfUE9TSVgoZmwpKSB7CisJCQkJbG9ja3NfZGVsZXRlX2xvY2soYmVmb3JlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChJU19MRUFTRShmbCkpIHsKKwkJCQlsZWFzZV9tb2RpZnkoYmVmb3JlLCBGX1VOTENLKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIFdoYXQ/ICovCisJCQlCVUcoKTsKKyAJCX0KKwkJYmVmb3JlID0gJmZsLT5mbF9uZXh0OworCX0KKwl1bmxvY2tfa2VybmVsKCk7Cit9CisKKy8qKgorICoJcG9zaXhfYmxvY2tfbG9jayAtIGJsb2NrcyB3YWl0aW5nIGZvciBhIGZpbGUgbG9jaworICoJQGJsb2NrZXI6IHRoZSBsb2NrIHdoaWNoIGlzIGJsb2NraW5nCisgKglAd2FpdGVyOiB0aGUgbG9jayB3aGljaCBjb25mbGljdHMgYW5kIGhhcyB0byB3YWl0CisgKgorICogbG9ja2QgbmVlZHMgdG8gYmxvY2sgd2FpdGluZyBmb3IgbG9ja3MuCisgKi8KK3ZvaWQKK3Bvc2l4X2Jsb2NrX2xvY2soc3RydWN0IGZpbGVfbG9jayAqYmxvY2tlciwgc3RydWN0IGZpbGVfbG9jayAqd2FpdGVyKQoreworCWxvY2tzX2luc2VydF9ibG9jayhibG9ja2VyLCB3YWl0ZXIpOworfQorCitFWFBPUlRfU1lNQk9MKHBvc2l4X2Jsb2NrX2xvY2spOworCisvKioKKyAqCXBvc2l4X3VuYmxvY2tfbG9jayAtIHN0b3Agd2FpdGluZyBmb3IgYSBmaWxlIGxvY2sKKyAqICAgICAgQGZpbHA6ICAgaG93IHRoZSBmaWxlIHdhcyBvcGVuZWQKKyAqCUB3YWl0ZXI6IHRoZSBsb2NrIHdoaWNoIHdhcyB3YWl0aW5nCisgKgorICoJbG9ja2QgbmVlZHMgdG8gYmxvY2sgd2FpdGluZyBmb3IgbG9ja3MuCisgKi8KK3ZvaWQKK3Bvc2l4X3VuYmxvY2tfbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGZpbGVfbG9jayAqd2FpdGVyKQoreworCS8qIAorCSAqIEEgcmVtb3RlIG1hY2hpbmUgbWF5IGNhbmNlbCB0aGUgbG9jayByZXF1ZXN0IGFmdGVyIGl0J3MgYmVlbgorCSAqIGdyYW50ZWQgbG9jYWxseS4gIElmIHRoYXQgaGFwcGVucywgd2UgbmVlZCB0byBkZWxldGUgdGhlIGxvY2suCisJICovCisJbG9ja19rZXJuZWwoKTsKKwlpZiAod2FpdGVyLT5mbF9uZXh0KSB7CisJCV9fbG9ja3NfZGVsZXRlX2Jsb2NrKHdhaXRlcik7CisJCXVubG9ja19rZXJuZWwoKTsKKwl9IGVsc2UgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXdhaXRlci0+ZmxfdHlwZSA9IEZfVU5MQ0s7CisJCXBvc2l4X2xvY2tfZmlsZShmaWxwLCB3YWl0ZXIpOworCX0KK30KKworRVhQT1JUX1NZTUJPTChwb3NpeF91bmJsb2NrX2xvY2spOworCitzdGF0aWMgdm9pZCBsb2NrX2dldF9zdGF0dXMoY2hhciogb3V0LCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCwgaW50IGlkLCBjaGFyICpwZngpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisKKwlpZiAoZmwtPmZsX2ZpbGUgIT0gTlVMTCkKKwkJaW5vZGUgPSBmbC0+ZmxfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisKKwlvdXQgKz0gc3ByaW50ZihvdXQsICIlZDolcyAiLCBpZCwgcGZ4KTsKKwlpZiAoSVNfUE9TSVgoZmwpKSB7CisJCW91dCArPSBzcHJpbnRmKG91dCwgIiU2cyAlcyAiLAorCQkJICAgICAoZmwtPmZsX2ZsYWdzICYgRkxfQUNDRVNTKSA/ICJBQ0NFU1MiIDogIlBPU0lYICIsCisJCQkgICAgIChpbm9kZSA9PSBOVUxMKSA/ICIqTk9JTk9ERSoiIDoKKwkJCSAgICAgKElTX01BTkRMT0NLKGlub2RlKSAmJgorCQkJICAgICAgKGlub2RlLT5pX21vZGUgJiAoU19JWEdSUCB8IFNfSVNHSUQpKSA9PSBTX0lTR0lEKSA/CisJCQkgICAgICJNQU5EQVRPUlkiIDogIkFEVklTT1JZICIpOworCX0gZWxzZSBpZiAoSVNfRkxPQ0soZmwpKSB7CisJCWlmIChmbC0+ZmxfdHlwZSAmIExPQ0tfTUFORCkgeworCQkJb3V0ICs9IHNwcmludGYob3V0LCAiRkxPQ0sgIE1TTkZTICAgICAiKTsKKwkJfSBlbHNlIHsKKwkJCW91dCArPSBzcHJpbnRmKG91dCwgIkZMT0NLICBBRFZJU09SWSAgIik7CisJCX0KKwl9IGVsc2UgaWYgKElTX0xFQVNFKGZsKSkgeworCQlvdXQgKz0gc3ByaW50ZihvdXQsICJMRUFTRSAgIik7CisJCWlmIChmbC0+ZmxfdHlwZSAmIEZfSU5QUk9HUkVTUykKKwkJCW91dCArPSBzcHJpbnRmKG91dCwgIkJSRUFLSU5HICAiKTsKKwkJZWxzZSBpZiAoZmwtPmZsX2ZpbGUpCisJCQlvdXQgKz0gc3ByaW50ZihvdXQsICJBQ1RJVkUgICAgIik7CisJCWVsc2UKKwkJCW91dCArPSBzcHJpbnRmKG91dCwgIkJSRUFLRVIgICAiKTsKKwl9IGVsc2UgeworCQlvdXQgKz0gc3ByaW50ZihvdXQsICJVTktOT1dOIFVOS05PV04gICIpOworCX0KKwlpZiAoZmwtPmZsX3R5cGUgJiBMT0NLX01BTkQpIHsKKwkJb3V0ICs9IHNwcmludGYob3V0LCAiJXMgIiwKKwkJCSAgICAgICAoZmwtPmZsX3R5cGUgJiBMT0NLX1JFQUQpCisJCQkgICAgICAgPyAoZmwtPmZsX3R5cGUgJiBMT0NLX1dSSVRFKSA/ICJSVyAgICIgOiAiUkVBRCAiCisJCQkgICAgICAgOiAoZmwtPmZsX3R5cGUgJiBMT0NLX1dSSVRFKSA/ICJXUklURSIgOiAiTk9ORSAiKTsKKwl9IGVsc2UgeworCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlcyAiLAorCQkJICAgICAgIChmbC0+ZmxfdHlwZSAmIEZfSU5QUk9HUkVTUykKKwkJCSAgICAgICA/IChmbC0+ZmxfdHlwZSAmIEZfVU5MQ0spID8gIlVOTENLIiA6ICJSRUFEICIKKwkJCSAgICAgICA6IChmbC0+ZmxfdHlwZSAmIEZfV1JMQ0spID8gIldSSVRFIiA6ICJSRUFEICIpOworCX0KKwlpZiAoaW5vZGUpIHsKKyNpZmRlZiBXRV9DQU5fQlJFQUtfTFNMS19OT1cKKwkJb3V0ICs9IHNwcmludGYob3V0LCAiJWQgJXM6JWxkICIsIGZsLT5mbF9waWQsCisJCQkJaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7CisjZWxzZQorCQkvKiB1c2Vyc3BhY2UgcmVsaWVzIG9uIHRoaXMgcmVwcmVzZW50YXRpb24gb2YgZGV2X3QgOy0oICovCisJCW91dCArPSBzcHJpbnRmKG91dCwgIiVkICUwMng6JTAyeDolbGQgIiwgZmwtPmZsX3BpZCwKKwkJCQlNQUpPUihpbm9kZS0+aV9zYi0+c19kZXYpLAorCQkJCU1JTk9SKGlub2RlLT5pX3NiLT5zX2RldiksIGlub2RlLT5pX2lubyk7CisjZW5kaWYKKwl9IGVsc2UgeworCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlZCA8bm9uZT46MCAiLCBmbC0+ZmxfcGlkKTsKKwl9CisJaWYgKElTX1BPU0lYKGZsKSkgeworCQlpZiAoZmwtPmZsX2VuZCA9PSBPRkZTRVRfTUFYKQorCQkJb3V0ICs9IHNwcmludGYob3V0LCAiJUxkIEVPRlxuIiwgZmwtPmZsX3N0YXJ0KTsKKwkJZWxzZQorCQkJb3V0ICs9IHNwcmludGYob3V0LCAiJUxkICVMZFxuIiwgZmwtPmZsX3N0YXJ0LAorCQkJCQlmbC0+ZmxfZW5kKTsKKwl9IGVsc2UgeworCQlvdXQgKz0gc3ByaW50ZihvdXQsICIwIEVPRlxuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBtb3ZlX2xvY2tfc3RhdHVzKGNoYXIgKipwLCBvZmZfdCogcG9zLCBvZmZfdCBvZmZzZXQpCit7CisJaW50IGxlbjsKKwlsZW4gPSBzdHJsZW4oKnApOworCWlmKCpwb3MgPj0gb2Zmc2V0KSB7CisJCS8qIHRoZSBjb21wbGV0ZSBsaW5lIGlzIHZhbGlkICovCisJCSpwICs9IGxlbjsKKwkJKnBvcyArPSBsZW47CisJCXJldHVybjsKKwl9CisJaWYoKnBvcytsZW4gPiBvZmZzZXQpIHsKKwkJLyogdXNlIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgbGluZSAqLworCQlpbnQgaSA9IG9mZnNldC0qcG9zOworCQltZW1tb3ZlKCpwLCpwK2ksbGVuLWkpOworCQkqcCArPSBsZW4taTsKKwkJKnBvcyArPSBsZW47CisJCXJldHVybjsKKwl9CisJLyogZGlzY2FyZCB0aGUgY29tcGxldGUgbGluZSAqLworCSpwb3MgKz0gbGVuOworfQorCisvKioKKyAqCWdldF9sb2Nrc19zdGF0dXMJLQlyZXBvcnRzIGxvY2sgdXNhZ2UgaW4gL3Byb2MvbG9ja3MKKyAqCUBidWZmZXI6IGFkZHJlc3MgaW4gdXNlcnNwYWNlIHRvIHdyaXRlIGludG8KKyAqCUBzdGFydDogPworICoJQG9mZnNldDogaG93IGZhciB3ZSBhcmUgdGhyb3VnaCB0aGUgYnVmZmVyCisgKglAbGVuZ3RoOiBob3cgbXVjaCB0byByZWFkCisgKi8KKworaW50IGdldF9sb2Nrc19zdGF0dXMoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJY2hhciAqcSA9IGJ1ZmZlcjsKKwlvZmZfdCBwb3MgPSAwOworCWludCBpID0gMDsKKworCWxvY2tfa2VybmVsKCk7CisJbGlzdF9mb3JfZWFjaCh0bXAsICZmaWxlX2xvY2tfbGlzdCkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpidG1wOworCQlzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgZmlsZV9sb2NrLCBmbF9saW5rKTsKKwkJbG9ja19nZXRfc3RhdHVzKHEsIGZsLCArK2ksICIiKTsKKwkJbW92ZV9sb2NrX3N0YXR1cygmcSwgJnBvcywgb2Zmc2V0KTsKKworCQlpZihwb3MgPj0gb2Zmc2V0K2xlbmd0aCkKKwkJCWdvdG8gZG9uZTsKKworCQlsaXN0X2Zvcl9lYWNoKGJ0bXAsICZmbC0+ZmxfYmxvY2spIHsKKwkJCXN0cnVjdCBmaWxlX2xvY2sgKmJmbCA9IGxpc3RfZW50cnkoYnRtcCwKKwkJCQkJc3RydWN0IGZpbGVfbG9jaywgZmxfYmxvY2spOworCQkJbG9ja19nZXRfc3RhdHVzKHEsIGJmbCwgaSwgIiAtPiIpOworCQkJbW92ZV9sb2NrX3N0YXR1cygmcSwgJnBvcywgb2Zmc2V0KTsKKworCQkJaWYocG9zID49IG9mZnNldCtsZW5ndGgpCisJCQkJZ290byBkb25lOworCQl9CisJfQorZG9uZToKKwl1bmxvY2tfa2VybmVsKCk7CisJKnN0YXJ0ID0gYnVmZmVyOworCWlmKHEtYnVmZmVyIDwgbGVuZ3RoKQorCQlyZXR1cm4gKHEtYnVmZmVyKTsKKwlyZXR1cm4gbGVuZ3RoOworfQorCisvKioKKyAqCWxvY2tfbWF5X3JlYWQgLSBjaGVja3MgdGhhdCB0aGUgcmVnaW9uIGlzIGZyZWUgb2YgbG9ja3MKKyAqCUBpbm9kZTogdGhlIGlub2RlIHRoYXQgaXMgYmVpbmcgcmVhZAorICoJQHN0YXJ0OiB0aGUgZmlyc3QgYnl0ZSB0byByZWFkCisgKglAbGVuOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqCisgKglFbXVsYXRlcyBXaW5kb3dzIGxvY2tpbmcgcmVxdWlyZW1lbnRzLiAgV2hvbGUtZmlsZQorICoJbWFuZGF0b3J5IGxvY2tzIChzaGFyZSBtb2RlcykgY2FuIHByb2hpYml0IGEgcmVhZCBhbmQKKyAqCWJ5dGUtcmFuZ2UgUE9TSVggbG9ja3MgY2FuIHByb2hpYml0IGEgcmVhZCBpZiB0aGV5IG92ZXJsYXAuCisgKgorICoJTi5CLiB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgZXZlciBjYWxsZWQKKyAqCWZyb20ga25mc2QgYW5kIG93bmVyc2hpcCBvZiBsb2NrcyBpcyBuZXZlciBjaGVja2VkLgorICovCitpbnQgbG9ja19tYXlfcmVhZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXN0cnVjdCBmaWxlX2xvY2sgKmZsOworCWludCByZXN1bHQgPSAxOworCWxvY2tfa2VybmVsKCk7CisJZm9yIChmbCA9IGlub2RlLT5pX2Zsb2NrOyBmbCAhPSBOVUxMOyBmbCA9IGZsLT5mbF9uZXh0KSB7CisJCWlmIChJU19QT1NJWChmbCkpIHsKKwkJCWlmIChmbC0+ZmxfdHlwZSA9PSBGX1JETENLKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKChmbC0+ZmxfZW5kIDwgc3RhcnQpIHx8IChmbC0+Zmxfc3RhcnQgPiAoc3RhcnQgKyBsZW4pKSkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChJU19GTE9DSyhmbCkpIHsKKwkJCWlmICghKGZsLT5mbF90eXBlICYgTE9DS19NQU5EKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChmbC0+ZmxfdHlwZSAmIExPQ0tfUkVBRCkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlCisJCQljb250aW51ZTsKKwkJcmVzdWx0ID0gMDsKKwkJYnJlYWs7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitFWFBPUlRfU1lNQk9MKGxvY2tfbWF5X3JlYWQpOworCisvKioKKyAqCWxvY2tfbWF5X3dyaXRlIC0gY2hlY2tzIHRoYXQgdGhlIHJlZ2lvbiBpcyBmcmVlIG9mIGxvY2tzCisgKglAaW5vZGU6IHRoZSBpbm9kZSB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4KKyAqCUBzdGFydDogdGhlIGZpcnN0IGJ5dGUgdG8gd3JpdGUKKyAqCUBsZW46IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAqCisgKglFbXVsYXRlcyBXaW5kb3dzIGxvY2tpbmcgcmVxdWlyZW1lbnRzLiAgV2hvbGUtZmlsZQorICoJbWFuZGF0b3J5IGxvY2tzIChzaGFyZSBtb2RlcykgY2FuIHByb2hpYml0IGEgd3JpdGUgYW5kCisgKglieXRlLXJhbmdlIFBPU0lYIGxvY2tzIGNhbiBwcm9oaWJpdCBhIHdyaXRlIGlmIHRoZXkgb3ZlcmxhcC4KKyAqCisgKglOLkIuIHRoaXMgZnVuY3Rpb24gaXMgb25seSBldmVyIGNhbGxlZAorICoJZnJvbSBrbmZzZCBhbmQgb3duZXJzaGlwIG9mIGxvY2tzIGlzIG5ldmVyIGNoZWNrZWQuCisgKi8KK2ludCBsb2NrX21heV93cml0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXN0cnVjdCBmaWxlX2xvY2sgKmZsOworCWludCByZXN1bHQgPSAxOworCWxvY2tfa2VybmVsKCk7CisJZm9yIChmbCA9IGlub2RlLT5pX2Zsb2NrOyBmbCAhPSBOVUxMOyBmbCA9IGZsLT5mbF9uZXh0KSB7CisJCWlmIChJU19QT1NJWChmbCkpIHsKKwkJCWlmICgoZmwtPmZsX2VuZCA8IHN0YXJ0KSB8fCAoZmwtPmZsX3N0YXJ0ID4gKHN0YXJ0ICsgbGVuKSkpCisJCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoSVNfRkxPQ0soZmwpKSB7CisJCQlpZiAoIShmbC0+ZmxfdHlwZSAmIExPQ0tfTUFORCkpCisJCQkJY29udGludWU7CisJCQlpZiAoZmwtPmZsX3R5cGUgJiBMT0NLX1dSSVRFKQorCQkJCWNvbnRpbnVlOworCQl9IGVsc2UKKwkJCWNvbnRpbnVlOworCQlyZXN1bHQgPSAwOworCQlicmVhazsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK0VYUE9SVF9TWU1CT0wobG9ja19tYXlfd3JpdGUpOworCitzdGF0aWMgaW5saW5lIHZvaWQgX19zdGVhbF9sb2NrcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgZmxfb3duZXJfdCBmcm9tKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9IGlub2RlLT5pX2Zsb2NrOworCisJd2hpbGUgKGZsKSB7CisJCWlmIChmbC0+ZmxfZmlsZSA9PSBmaWxlICYmIGZsLT5mbF9vd25lciA9PSBmcm9tKQorCQkJZmwtPmZsX293bmVyID0gY3VycmVudC0+ZmlsZXM7CisJCWZsID0gZmwtPmZsX25leHQ7CisJfQorfQorCisvKiBXaGVuIGdldHRpbmcgcmVhZHkgZm9yIGV4ZWN1dGluZyBhIGJpbmFyeSwgd2UgbWFrZSBzdXJlIHRoYXQgY3VycmVudAorICogaGFzIGEgZmlsZXNfc3RydWN0IG9uIGl0cyBvd24uIEJlZm9yZSBkcm9wcGluZyB0aGUgb2xkIGZpbGVzX3N0cnVjdCwKKyAqIHdlIHRha2Ugb3ZlciBvd25lcnNoaXAgb2YgYWxsIGxvY2tzIGZvciBhbGwgZmlsZSBkZXNjcmlwdG9ycyB3ZSBvd24uCisgKiBOb3RlIHRoYXQgd2UgbWF5IGFjY2lkZW50YWxseSBzdGVhbCBhIGxvY2sgZm9yIGEgZmlsZSB0aGF0IGEgc2libGluZworICogaGFzIGNyZWF0ZWQgc2luY2UgdGhlIHVuc2hhcmVfZmlsZXMoKSBjYWxsLgorICovCit2b2lkIHN0ZWFsX2xvY2tzKGZsX293bmVyX3QgZnJvbSkKK3sKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOworCWludCBpLCBqOworCisJaWYgKGZyb20gPT0gZmlsZXMpCisJCXJldHVybjsKKworCWxvY2tfa2VybmVsKCk7CisJaiA9IDA7CisJZm9yICg7OykgeworCQl1bnNpZ25lZCBsb25nIHNldDsKKwkJaSA9IGogKiBfX05GREJJVFM7CisJCWlmIChpID49IGZpbGVzLT5tYXhfZmRzZXQgfHwgaSA+PSBmaWxlcy0+bWF4X2ZkcykKKwkJCWJyZWFrOworCQlzZXQgPSBmaWxlcy0+b3Blbl9mZHMtPmZkc19iaXRzW2orK107CisJCXdoaWxlIChzZXQpIHsKKwkJCWlmIChzZXQgJiAxKSB7CisJCQkJc3RydWN0IGZpbGUgKmZpbGUgPSBmaWxlcy0+ZmRbaV07CisJCQkJaWYgKGZpbGUpCisJCQkJCV9fc3RlYWxfbG9ja3MoZmlsZSwgZnJvbSk7CisJCQl9CisJCQlpKys7CisJCQlzZXQgPj49IDE7CisJCX0KKwl9CisJdW5sb2NrX2tlcm5lbCgpOworfQorRVhQT1JUX1NZTUJPTChzdGVhbF9sb2Nrcyk7CisKK3N0YXRpYyBpbnQgX19pbml0IGZpbGVsb2NrX2luaXQodm9pZCkKK3sKKwlmaWxlbG9ja19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJmaWxlX2xvY2tfY2FjaGUiLAorCQkJc2l6ZW9mKHN0cnVjdCBmaWxlX2xvY2spLCAwLCBTTEFCX1BBTklDLAorCQkJaW5pdF9vbmNlLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworY29yZV9pbml0Y2FsbChmaWxlbG9ja19pbml0KTsKZGlmZiAtLWdpdCBhL2ZzL21iY2FjaGUuYyBiL2ZzL21iY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWU0ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbWJjYWNoZS5jCkBAIC0wLDAgKzEsNjc3IEBACisvKgorICogbGludXgvZnMvbWJjYWNoZS5jCisgKiAoQykgMjAwMS0yMDAyIEFuZHJlYXMgR3J1ZW5iYWNoZXIsIDxhLmdydWVuYmFjaGVyQGNvbXB1dGVyLm9yZz4KKyAqLworCisvKgorICogRmlsZXN5c3RlbSBNZXRhIEluZm9ybWF0aW9uIEJsb2NrIENhY2hlIChtYmNhY2hlKQorICoKKyAqIFRoZSBtYmNhY2hlIGNhY2hlcyBibG9ja3Mgb2YgYmxvY2sgZGV2aWNlcyB0aGF0IG5lZWQgdG8gYmUgbG9jYXRlZAorICogYnkgdGhlaXIgZGV2aWNlL2Jsb2NrIG51bWJlciwgYXMgd2VsbCBhcyBieSBvdGhlciBjcml0ZXJpYSAoc3VjaAorICogYXMgdGhlIGJsb2NrJ3MgY29udGVudHMpLgorICoKKyAqIFRoZXJlIGNhbiBvbmx5IGJlIG9uZSBjYWNoZSBlbnRyeSBpbiBhIGNhY2hlIHBlciBkZXZpY2UgYW5kIGJsb2NrIG51bWJlci4KKyAqIEFkZGl0aW9uYWwgaW5kZXhlcyBuZWVkIG5vdCBiZSB1bmlxdWUgaW4gdGhpcyBzZW5zZS4gVGhlIG51bWJlciBvZgorICogYWRkaXRpb25hbCBpbmRleGVzICg9b3RoZXIgY3JpdGVyaWEpIGNhbiBiZSBoYXJkd2lyZWQgYXQgY29tcGlsZSB0aW1lCisgKiBvciBzcGVjaWZpZWQgYXQgY2FjaGUgY3JlYXRlIHRpbWUuCisgKgorICogRWFjaCBjYWNoZSBlbnRyeSBpcyBvZiBmaXhlZCBzaXplLiBBbiBlbnRyeSBtYXkgYmUgYHZhbGlkJyBvciBgaW52YWxpZCcKKyAqIGluIHRoZSBjYWNoZS4gQSB2YWxpZCBlbnRyeSBpcyBpbiB0aGUgbWFpbiBoYXNoIHRhYmxlcyBvZiB0aGUgY2FjaGUsCisgKiBhbmQgbWF5IGFsc28gYmUgaW4gdGhlIGxydSBsaXN0LiBBbiBpbnZhbGlkIGVudHJ5IGlzIG5vdCBpbiBhbnkgaGFzaGVzCisgKiBvciBsaXN0cy4KKyAqCisgKiBBIHZhbGlkIGNhY2hlIGVudHJ5IGlzIG9ubHkgaW4gdGhlIGxydSBsaXN0IGlmIG5vIGhhbmRsZXMgcmVmZXIgdG8gaXQuCisgKiBJbnZhbGlkIGNhY2hlIGVudHJpZXMgd2lsbCBiZSBmcmVlZCB3aGVuIHRoZSBsYXN0IGhhbmRsZSB0byB0aGUgY2FjaGUKKyAqIGVudHJ5IGlzIHJlbGVhc2VkLiBFbnRyaWVzIHRoYXQgY2Fubm90IGJlIGZyZWVkIGltbWVkaWF0ZWx5IGFyZSBwdXQKKyAqIGJhY2sgb24gdGhlIGxydSBsaXN0LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21iY2FjaGUuaD4KKworCisjaWZkZWYgTUJfQ0FDSEVfREVCVUcKKyMgZGVmaW5lIG1iX2RlYnVnKGYuLi4pIGRvIHsgXAorCQlwcmludGsoS0VSTl9ERUJVRyBmKTsgXAorCQlwcmludGsoIlxuIik7IFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBtYl9hc3NlcnQoYykgZG8geyBpZiAoIShjKSkgXAorCQlwcmludGsoS0VSTl9FUlIgImFzc2VydGlvbiAiICNjICIgZmFpbGVkXG4iKTsgXAorCX0gd2hpbGUoMCkKKyNlbHNlCisjIGRlZmluZSBtYl9kZWJ1ZyhmLi4uKSBkbyB7IH0gd2hpbGUoMCkKKyMgZGVmaW5lIG1iX2Fzc2VydChjKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorI2RlZmluZSBtYl9lcnJvcihmLi4uKSBkbyB7IFwKKwkJcHJpbnRrKEtFUk5fRVJSIGYpOyBcCisJCXByaW50aygiXG4iKTsgXAorCX0gd2hpbGUoMCkKKworI2RlZmluZSBNQl9DQUNIRV9XUklURVIgKCh1bnNpZ25lZCBzaG9ydCl+MFUgPj4gMSkKKworREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobWJfY2FjaGVfcXVldWUpOworCQkKK01PRFVMRV9BVVRIT1IoIkFuZHJlYXMgR3J1ZW5iYWNoZXIgPGEuZ3J1ZW5iYWNoZXJAY29tcHV0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNZXRhIGJsb2NrIGNhY2hlIChmb3IgZXh0ZW5kZWQgYXR0cmlidXRlcykiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworRVhQT1JUX1NZTUJPTChtYl9jYWNoZV9jcmVhdGUpOworRVhQT1JUX1NZTUJPTChtYl9jYWNoZV9zaHJpbmspOworRVhQT1JUX1NZTUJPTChtYl9jYWNoZV9kZXN0cm95KTsKK0VYUE9SVF9TWU1CT0wobWJfY2FjaGVfZW50cnlfYWxsb2MpOworRVhQT1JUX1NZTUJPTChtYl9jYWNoZV9lbnRyeV9pbnNlcnQpOworRVhQT1JUX1NZTUJPTChtYl9jYWNoZV9lbnRyeV9yZWxlYXNlKTsKK0VYUE9SVF9TWU1CT0wobWJfY2FjaGVfZW50cnlfZnJlZSk7CitFWFBPUlRfU1lNQk9MKG1iX2NhY2hlX2VudHJ5X2dldCk7CisjaWYgIWRlZmluZWQoTUJfQ0FDSEVfSU5ERVhFU19DT1VOVCkgfHwgKE1CX0NBQ0hFX0lOREVYRVNfQ09VTlQgPiAwKQorRVhQT1JUX1NZTUJPTChtYl9jYWNoZV9lbnRyeV9maW5kX2ZpcnN0KTsKK0VYUE9SVF9TWU1CT0wobWJfY2FjaGVfZW50cnlfZmluZF9uZXh0KTsKKyNlbmRpZgorCitzdHJ1Y3QgbWJfY2FjaGUgeworCXN0cnVjdCBsaXN0X2hlYWQJCWNfY2FjaGVfbGlzdDsKKwljb25zdCBjaGFyCQkJKmNfbmFtZTsKKwlzdHJ1Y3QgbWJfY2FjaGVfb3AJCWNfb3A7CisJYXRvbWljX3QJCQljX2VudHJ5X2NvdW50OworCWludAkJCQljX2J1Y2tldF9iaXRzOworI2lmbmRlZiBNQl9DQUNIRV9JTkRFWEVTX0NPVU5UCisJaW50CQkJCWNfaW5kZXhlc19jb3VudDsKKyNlbmRpZgorCWttZW1fY2FjaGVfdAkJCSpjX2VudHJ5X2NhY2hlOworCXN0cnVjdCBsaXN0X2hlYWQJCSpjX2Jsb2NrX2hhc2g7CisJc3RydWN0IGxpc3RfaGVhZAkJKmNfaW5kZXhlc19oYXNoWzBdOworfTsKKworCisvKgorICogR2xvYmFsIGRhdGE6IGxpc3Qgb2YgYWxsIG1iY2FjaGUncywgbHJ1IGxpc3QsIGFuZCBhIHNwaW5sb2NrIGZvcgorICogYWNjZXNzaW5nIGNhY2hlIGRhdGEgc3RydWN0dXJlcyBvbiBTTVAgbWFjaGluZXMuIFRoZSBscnUgbGlzdCBpcworICogZ2xvYmFsIGFjcm9zcyBhbGwgbWJjYWNoZXMuCisgKi8KKworc3RhdGljIExJU1RfSEVBRChtYl9jYWNoZV9saXN0KTsKK3N0YXRpYyBMSVNUX0hFQUQobWJfY2FjaGVfbHJ1X2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhtYl9jYWNoZV9zcGlubG9jayk7CitzdGF0aWMgc3RydWN0IHNocmlua2VyICptYl9zaHJpbmtlcjsKKworc3RhdGljIGlubGluZSBpbnQKK21iX2NhY2hlX2luZGV4ZXMoc3RydWN0IG1iX2NhY2hlICpjYWNoZSkKK3sKKyNpZmRlZiBNQl9DQUNIRV9JTkRFWEVTX0NPVU5UCisJcmV0dXJuIE1CX0NBQ0hFX0lOREVYRVNfQ09VTlQ7CisjZWxzZQorCXJldHVybiBjYWNoZS0+Y19pbmRleGVzX2NvdW50OworI2VuZGlmCit9CisKKy8qCisgKiBXaGF0IHRoZSBtYmNhY2hlIHJlZ2lzdGVycyBhcyB0byBnZXQgc2hydW5rIGR5bmFtaWNhbGx5LgorICovCisKK3N0YXRpYyBpbnQgbWJfY2FjaGVfc2hyaW5rX2ZuKGludCBucl90b19zY2FuLCB1bnNpZ25lZCBpbnQgZ2ZwX21hc2spOworCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX21iX2NhY2hlX2VudHJ5X2lzX2hhc2hlZChzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlKQoreworCXJldHVybiAhbGlzdF9lbXB0eSgmY2UtPmVfYmxvY2tfbGlzdCk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkCitfX21iX2NhY2hlX2VudHJ5X3VuaGFzaChzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlKQoreworCWludCBuOworCisJaWYgKF9fbWJfY2FjaGVfZW50cnlfaXNfaGFzaGVkKGNlKSkgeworCQlsaXN0X2RlbF9pbml0KCZjZS0+ZV9ibG9ja19saXN0KTsKKwkJZm9yIChuPTA7IG48bWJfY2FjaGVfaW5kZXhlcyhjZS0+ZV9jYWNoZSk7IG4rKykKKwkJCWxpc3RfZGVsKCZjZS0+ZV9pbmRleGVzW25dLm9fbGlzdCk7CisJfQorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19tYl9jYWNoZV9lbnRyeV9mb3JnZXQoc3RydWN0IG1iX2NhY2hlX2VudHJ5ICpjZSwgaW50IGdmcF9tYXNrKQoreworCXN0cnVjdCBtYl9jYWNoZSAqY2FjaGUgPSBjZS0+ZV9jYWNoZTsKKworCW1iX2Fzc2VydCghKGNlLT5lX3VzZWQgfHwgY2UtPmVfcXVldWVkKSk7CisJaWYgKGNhY2hlLT5jX29wLmZyZWUgJiYgY2FjaGUtPmNfb3AuZnJlZShjZSwgZ2ZwX21hc2spKSB7CisJCS8qIGZyZWUgZmFpbGVkIC0tIHB1dCBiYWNrIG9uIHRoZSBscnUgbGlzdAorCQkgICBmb3IgZnJlZWluZyBsYXRlci4gKi8KKwkJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJCWxpc3RfYWRkKCZjZS0+ZV9scnVfbGlzdCwgJm1iX2NhY2hlX2xydV9saXN0KTsKKwkJc3Bpbl91bmxvY2soJm1iX2NhY2hlX3NwaW5sb2NrKTsKKwl9IGVsc2UgeworCQlrbWVtX2NhY2hlX2ZyZWUoY2FjaGUtPmNfZW50cnlfY2FjaGUsIGNlKTsKKwkJYXRvbWljX2RlYygmY2FjaGUtPmNfZW50cnlfY291bnQpOworCX0KK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fbWJfY2FjaGVfZW50cnlfcmVsZWFzZV91bmxvY2soc3RydWN0IG1iX2NhY2hlX2VudHJ5ICpjZSkKK3sKKwkvKiBXYWtlIHVwIGFsbCBwcm9jZXNzZXMgcXVldWluZyBmb3IgdGhpcyBjYWNoZSBlbnRyeS4gKi8KKwlpZiAoY2UtPmVfcXVldWVkKQorCQl3YWtlX3VwX2FsbCgmbWJfY2FjaGVfcXVldWUpOworCWlmIChjZS0+ZV91c2VkID49IE1CX0NBQ0hFX1dSSVRFUikKKwkJY2UtPmVfdXNlZCAtPSBNQl9DQUNIRV9XUklURVI7CisJY2UtPmVfdXNlZC0tOworCWlmICghKGNlLT5lX3VzZWQgfHwgY2UtPmVfcXVldWVkKSkgeworCQlpZiAoIV9fbWJfY2FjaGVfZW50cnlfaXNfaGFzaGVkKGNlKSkKKwkJCWdvdG8gZm9yZ2V0OworCQltYl9hc3NlcnQobGlzdF9lbXB0eSgmY2UtPmVfbHJ1X2xpc3QpKTsKKwkJbGlzdF9hZGRfdGFpbCgmY2UtPmVfbHJ1X2xpc3QsICZtYl9jYWNoZV9scnVfbGlzdCk7CisJfQorCXNwaW5fdW5sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJcmV0dXJuOworZm9yZ2V0OgorCXNwaW5fdW5sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJX19tYl9jYWNoZV9lbnRyeV9mb3JnZXQoY2UsIEdGUF9LRVJORUwpOworfQorCisKKy8qCisgKiBtYl9jYWNoZV9zaHJpbmtfZm4oKSAgbWVtb3J5IHByZXNzdXJlIGNhbGxiYWNrCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGtlcm5lbCBtZW1vcnkgbWFuYWdlbWVudCB3aGVuIG1lbW9yeQorICogZ2V0cyBsb3cuCisgKgorICogQG5yX3RvX3NjYW46IE51bWJlciBvZiBvYmplY3RzIHRvIHNjYW4KKyAqIEBnZnBfbWFzazogKGlnbm9yZWQpCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgd2hpY2ggYXJlIHByZXNlbnQgaW4gdGhlIGNhY2hlLgorICovCitzdGF0aWMgaW50CittYl9jYWNoZV9zaHJpbmtfZm4oaW50IG5yX3RvX3NjYW4sIHVuc2lnbmVkIGludCBnZnBfbWFzaykKK3sKKwlMSVNUX0hFQUQoZnJlZV9saXN0KTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsLCAqbHRtcDsKKwlpbnQgY291bnQgPSAwOworCisJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJbGlzdF9mb3JfZWFjaChsLCAmbWJfY2FjaGVfbGlzdCkgeworCQlzdHJ1Y3QgbWJfY2FjaGUgKmNhY2hlID0KKwkJCWxpc3RfZW50cnkobCwgc3RydWN0IG1iX2NhY2hlLCBjX2NhY2hlX2xpc3QpOworCQltYl9kZWJ1ZygiY2FjaGUgJXMgKCVkKSIsIGNhY2hlLT5jX25hbWUsCisJCQkgIGF0b21pY19yZWFkKCZjYWNoZS0+Y19lbnRyeV9jb3VudCkpOworCQljb3VudCArPSBhdG9taWNfcmVhZCgmY2FjaGUtPmNfZW50cnlfY291bnQpOworCX0KKwltYl9kZWJ1ZygidHJ5aW5nIHRvIGZyZWUgJWQgZW50cmllcyIsIG5yX3RvX3NjYW4pOworCWlmIChucl90b19zY2FuID09IDApIHsKKwkJc3Bpbl91bmxvY2soJm1iX2NhY2hlX3NwaW5sb2NrKTsKKwkJZ290byBvdXQ7CisJfQorCXdoaWxlIChucl90b19zY2FuLS0gJiYgIWxpc3RfZW1wdHkoJm1iX2NhY2hlX2xydV9saXN0KSkgeworCQlzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlID0KKwkJCWxpc3RfZW50cnkobWJfY2FjaGVfbHJ1X2xpc3QubmV4dCwKKwkJCQkgICBzdHJ1Y3QgbWJfY2FjaGVfZW50cnksIGVfbHJ1X2xpc3QpOworCQlsaXN0X21vdmVfdGFpbCgmY2UtPmVfbHJ1X2xpc3QsICZmcmVlX2xpc3QpOworCQlfX21iX2NhY2hlX2VudHJ5X3VuaGFzaChjZSk7CisJfQorCXNwaW5fdW5sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGwsIGx0bXAsICZmcmVlX2xpc3QpIHsKKwkJX19tYl9jYWNoZV9lbnRyeV9mb3JnZXQobGlzdF9lbnRyeShsLCBzdHJ1Y3QgbWJfY2FjaGVfZW50cnksCisJCQkJCQkgICBlX2xydV9saXN0KSwgZ2ZwX21hc2spOworCX0KK291dDoKKwlyZXR1cm4gKGNvdW50IC8gMTAwKSAqIHN5c2N0bF92ZnNfY2FjaGVfcHJlc3N1cmU7Cit9CisKKworLyoKKyAqIG1iX2NhY2hlX2NyZWF0ZSgpICBjcmVhdGUgYSBuZXcgY2FjaGUKKyAqCisgKiBBbGwgZW50cmllcyBpbiBvbmUgY2FjaGUgYXJlIGVxdWFsIHNpemUuIENhY2hlIGVudHJpZXMgbWF5IGJlIGZyb20KKyAqIG11bHRpcGxlIGRldmljZXMuIElmIHRoaXMgaXMgdGhlIGZpcnN0IG1iY2FjaGUgY3JlYXRlZCwgcmVnaXN0ZXJzCisgKiB0aGUgY2FjaGUgd2l0aCBrZXJuZWwgbWVtb3J5IG1hbmFnZW1lbnQuIFJldHVybnMgTlVMTCBpZiBubyBtb3JlCisgKiBtZW1vcnkgd2FzIGF2YWlsYWJsZS4KKyAqCisgKiBAbmFtZTogbmFtZSBvZiB0aGUgY2FjaGUgKGluZm9ybWFsKQorICogQGNhY2hlX29wOiBjb250YWlucyB0aGUgY2FsbGJhY2sgY2FsbGVkIHdoZW4gZnJlZWluZyBhIGNhY2hlIGVudHJ5CisgKiBAZW50cnlfc2l6ZTogVGhlIHNpemUgb2YgYSBjYWNoZSBlbnRyeSwgaW5jbHVkaW5nCisgKiAgICAgICAgICAgICAgc3RydWN0IG1iX2NhY2hlX2VudHJ5CisgKiBAaW5kZXhlc19jb3VudDogbnVtYmVyIG9mIGFkZGl0aW9uYWwgaW5kZXhlcyBpbiB0aGUgY2FjaGUuIE11c3QgZXF1YWwKKyAqICAgICAgICAgICAgICAgICBNQl9DQUNIRV9JTkRFWEVTX0NPVU5UIGlmIHRoZSBudW1iZXIgb2YgaW5kZXhlcyBpcworICogICAgICAgICAgICAgICAgIGhhcmR3aXJlZC4KKyAqIEBidWNrZXRfYml0czogbG9nMihudW1iZXIgb2YgaGFzaCBidWNrZXRzKQorICovCitzdHJ1Y3QgbWJfY2FjaGUgKgorbWJfY2FjaGVfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBtYl9jYWNoZV9vcCAqY2FjaGVfb3AsCisJCXNpemVfdCBlbnRyeV9zaXplLCBpbnQgaW5kZXhlc19jb3VudCwgaW50IGJ1Y2tldF9iaXRzKQoreworCWludCBtPTAsIG4sIGJ1Y2tldF9jb3VudCA9IDEgPDwgYnVja2V0X2JpdHM7CisJc3RydWN0IG1iX2NhY2hlICpjYWNoZSA9IE5VTEw7CisKKwlpZihlbnRyeV9zaXplIDwgc2l6ZW9mKHN0cnVjdCBtYl9jYWNoZV9lbnRyeSkgKworCSAgIGluZGV4ZXNfY291bnQgKiBzaXplb2YoKChzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKikgMCktPmVfaW5kZXhlc1swXSkpCisJCXJldHVybiBOVUxMOworCisJY2FjaGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWJfY2FjaGUpICsKKwkgICAgICAgICAgICAgICAgaW5kZXhlc19jb3VudCAqIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjYWNoZSkKKwkJZ290byBmYWlsOworCWNhY2hlLT5jX25hbWUgPSBuYW1lOworCWNhY2hlLT5jX29wLmZyZWUgPSBOVUxMOworCWlmIChjYWNoZV9vcCkKKwkJY2FjaGUtPmNfb3AuZnJlZSA9IGNhY2hlX29wLT5mcmVlOworCWF0b21pY19zZXQoJmNhY2hlLT5jX2VudHJ5X2NvdW50LCAwKTsKKwljYWNoZS0+Y19idWNrZXRfYml0cyA9IGJ1Y2tldF9iaXRzOworI2lmZGVmIE1CX0NBQ0hFX0lOREVYRVNfQ09VTlQKKwltYl9hc3NlcnQoaW5kZXhlc19jb3VudCA9PSBNQl9DQUNIRV9JTkRFWEVTX0NPVU5UKTsKKyNlbHNlCisJY2FjaGUtPmNfaW5kZXhlc19jb3VudCA9IGluZGV4ZXNfY291bnQ7CisjZW5kaWYKKwljYWNoZS0+Y19ibG9ja19oYXNoID0ga21hbGxvYyhidWNrZXRfY291bnQgKiBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFjYWNoZS0+Y19ibG9ja19oYXNoKQorCQlnb3RvIGZhaWw7CisJZm9yIChuPTA7IG48YnVja2V0X2NvdW50OyBuKyspCisJCUlOSVRfTElTVF9IRUFEKCZjYWNoZS0+Y19ibG9ja19oYXNoW25dKTsKKwlmb3IgKG09MDsgbTxpbmRleGVzX2NvdW50OyBtKyspIHsKKwkJY2FjaGUtPmNfaW5kZXhlc19oYXNoW21dID0ga21hbGxvYyhidWNrZXRfY291bnQgKgorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCksCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIWNhY2hlLT5jX2luZGV4ZXNfaGFzaFttXSkKKwkJCWdvdG8gZmFpbDsKKwkJZm9yIChuPTA7IG48YnVja2V0X2NvdW50OyBuKyspCisJCQlJTklUX0xJU1RfSEVBRCgmY2FjaGUtPmNfaW5kZXhlc19oYXNoW21dW25dKTsKKwl9CisJY2FjaGUtPmNfZW50cnlfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZShuYW1lLCBlbnRyeV9zaXplLCAwLAorCQlTTEFCX1JFQ0xBSU1fQUNDT1VOVCwgTlVMTCwgTlVMTCk7CisJaWYgKCFjYWNoZS0+Y19lbnRyeV9jYWNoZSkKKwkJZ290byBmYWlsOworCisJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJbGlzdF9hZGQoJmNhY2hlLT5jX2NhY2hlX2xpc3QsICZtYl9jYWNoZV9saXN0KTsKKwlzcGluX3VubG9jaygmbWJfY2FjaGVfc3BpbmxvY2spOworCXJldHVybiBjYWNoZTsKKworZmFpbDoKKwlpZiAoY2FjaGUpIHsKKwkJd2hpbGUgKC0tbSA+PSAwKQorCQkJa2ZyZWUoY2FjaGUtPmNfaW5kZXhlc19oYXNoW21dKTsKKwkJaWYgKGNhY2hlLT5jX2Jsb2NrX2hhc2gpCisJCQlrZnJlZShjYWNoZS0+Y19ibG9ja19oYXNoKTsKKwkJa2ZyZWUoY2FjaGUpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworCisvKgorICogbWJfY2FjaGVfc2hyaW5rKCkKKyAqCisgKiBSZW1vdmVzIGFsbCBjYWNoZSBlbnRpcmVzIG9mIGEgZGV2aWNlIGZyb20gdGhlIGNhY2hlLiBBbGwgY2FjaGUgZW50cmllcworICogY3VycmVudGx5IGluIHVzZSBjYW5ub3QgYmUgZnJlZWQsIGFuZCB0aHVzIHJlbWFpbiBpbiB0aGUgY2FjaGUuIEFsbCBvdGhlcnMKKyAqIGFyZSBmcmVlZC4KKyAqCisgKiBAY2FjaGU6IHdoaWNoIGNhY2hlIHRvIHNocmluaworICogQGJkZXY6IHdoaWNoIGRldmljZSdzIGNhY2hlIGVudHJpZXMgdG8gc2hyaW5rCisgKi8KK3ZvaWQKK21iX2NhY2hlX3NocmluayhzdHJ1Y3QgbWJfY2FjaGUgKmNhY2hlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCUxJU1RfSEVBRChmcmVlX2xpc3QpOworCXN0cnVjdCBsaXN0X2hlYWQgKmwsICpsdG1wOworCisJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGwsIGx0bXAsICZtYl9jYWNoZV9scnVfbGlzdCkgeworCQlzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlID0KKwkJCWxpc3RfZW50cnkobCwgc3RydWN0IG1iX2NhY2hlX2VudHJ5LCBlX2xydV9saXN0KTsKKwkJaWYgKGNlLT5lX2JkZXYgPT0gYmRldikgeworCQkJbGlzdF9tb3ZlX3RhaWwoJmNlLT5lX2xydV9saXN0LCAmZnJlZV9saXN0KTsKKwkJCV9fbWJfY2FjaGVfZW50cnlfdW5oYXNoKGNlKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmbWJfY2FjaGVfc3BpbmxvY2spOworCWxpc3RfZm9yX2VhY2hfc2FmZShsLCBsdG1wLCAmZnJlZV9saXN0KSB7CisJCV9fbWJfY2FjaGVfZW50cnlfZm9yZ2V0KGxpc3RfZW50cnkobCwgc3RydWN0IG1iX2NhY2hlX2VudHJ5LAorCQkJCQkJICAgZV9scnVfbGlzdCksIEdGUF9LRVJORUwpOworCX0KK30KKworCisvKgorICogbWJfY2FjaGVfZGVzdHJveSgpCisgKgorICogU2hyaW5rcyB0aGUgY2FjaGUgdG8gaXRzIG1pbmltdW0gcG9zc2libGUgc2l6ZSAoaG9wZWZ1bGx5IDAgZW50cmllcyksCisgKiBhbmQgdGhlbiBkZXN0cm95cyBpdC4gSWYgdGhpcyB3YXMgdGhlIGxhc3QgbWJjYWNoZSwgdW4tcmVnaXN0ZXJzIHRoZQorICogbWJjYWNoZSBmcm9tIGtlcm5lbCBtZW1vcnkgbWFuYWdlbWVudC4KKyAqLwordm9pZAorbWJfY2FjaGVfZGVzdHJveShzdHJ1Y3QgbWJfY2FjaGUgKmNhY2hlKQoreworCUxJU1RfSEVBRChmcmVlX2xpc3QpOworCXN0cnVjdCBsaXN0X2hlYWQgKmwsICpsdG1wOworCWludCBuOworCisJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGwsIGx0bXAsICZtYl9jYWNoZV9scnVfbGlzdCkgeworCQlzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlID0KKwkJCWxpc3RfZW50cnkobCwgc3RydWN0IG1iX2NhY2hlX2VudHJ5LCBlX2xydV9saXN0KTsKKwkJaWYgKGNlLT5lX2NhY2hlID09IGNhY2hlKSB7CisJCQlsaXN0X21vdmVfdGFpbCgmY2UtPmVfbHJ1X2xpc3QsICZmcmVlX2xpc3QpOworCQkJX19tYl9jYWNoZV9lbnRyeV91bmhhc2goY2UpOworCQl9CisJfQorCWxpc3RfZGVsKCZjYWNoZS0+Y19jYWNoZV9saXN0KTsKKwlzcGluX3VubG9jaygmbWJfY2FjaGVfc3BpbmxvY2spOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGwsIGx0bXAsICZmcmVlX2xpc3QpIHsKKwkJX19tYl9jYWNoZV9lbnRyeV9mb3JnZXQobGlzdF9lbnRyeShsLCBzdHJ1Y3QgbWJfY2FjaGVfZW50cnksCisJCQkJCQkgICBlX2xydV9saXN0KSwgR0ZQX0tFUk5FTCk7CisJfQorCisJaWYgKGF0b21pY19yZWFkKCZjYWNoZS0+Y19lbnRyeV9jb3VudCkgPiAwKSB7CisJCW1iX2Vycm9yKCJjYWNoZSAlczogJWQgb3JwaGFuZWQgZW50cmllcyIsCisJCQkgIGNhY2hlLT5jX25hbWUsCisJCQkgIGF0b21pY19yZWFkKCZjYWNoZS0+Y19lbnRyeV9jb3VudCkpOworCX0KKworCWttZW1fY2FjaGVfZGVzdHJveShjYWNoZS0+Y19lbnRyeV9jYWNoZSk7CisKKwlmb3IgKG49MDsgbiA8IG1iX2NhY2hlX2luZGV4ZXMoY2FjaGUpOyBuKyspCisJCWtmcmVlKGNhY2hlLT5jX2luZGV4ZXNfaGFzaFtuXSk7CisJa2ZyZWUoY2FjaGUtPmNfYmxvY2tfaGFzaCk7CisJa2ZyZWUoY2FjaGUpOworfQorCisKKy8qCisgKiBtYl9jYWNoZV9lbnRyeV9hbGxvYygpCisgKgorICogQWxsb2NhdGVzIGEgbmV3IGNhY2hlIGVudHJ5LiBUaGUgbmV3IGVudHJ5IHdpbGwgbm90IGJlIHZhbGlkIGluaXRpYWxseSwKKyAqIGFuZCB0aHVzIGNhbm5vdCBiZSBsb29rZWQgdXAgeWV0LiBJdCBzaG91bGQgYmUgZmlsbGVkIHdpdGggZGF0YSwgYW5kCisgKiB0aGVuIGluc2VydGVkIGludG8gdGhlIGNhY2hlIHVzaW5nIG1iX2NhY2hlX2VudHJ5X2luc2VydCgpLiBSZXR1cm5zIE5VTEwKKyAqIGlmIG5vIG1vcmUgbWVtb3J5IHdhcyBhdmFpbGFibGUuCisgKi8KK3N0cnVjdCBtYl9jYWNoZV9lbnRyeSAqCittYl9jYWNoZV9lbnRyeV9hbGxvYyhzdHJ1Y3QgbWJfY2FjaGUgKmNhY2hlKQoreworCXN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqY2U7CisKKwlhdG9taWNfaW5jKCZjYWNoZS0+Y19lbnRyeV9jb3VudCk7CisJY2UgPSBrbWVtX2NhY2hlX2FsbG9jKGNhY2hlLT5jX2VudHJ5X2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2UpIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmNlLT5lX2xydV9saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmNlLT5lX2Jsb2NrX2xpc3QpOworCQljZS0+ZV9jYWNoZSA9IGNhY2hlOworCQljZS0+ZV91c2VkID0gMSArIE1CX0NBQ0hFX1dSSVRFUjsKKwkJY2UtPmVfcXVldWVkID0gMDsKKwl9CisJcmV0dXJuIGNlOworfQorCisKKy8qCisgKiBtYl9jYWNoZV9lbnRyeV9pbnNlcnQoKQorICoKKyAqIEluc2VydHMgYW4gZW50cnkgdGhhdCB3YXMgYWxsb2NhdGVkIHVzaW5nIG1iX2NhY2hlX2VudHJ5X2FsbG9jKCkgaW50bworICogdGhlIGNhY2hlLiBBZnRlciB0aGlzLCB0aGUgY2FjaGUgZW50cnkgY2FuIGJlIGxvb2tlZCB1cCwgYnV0IGlzIG5vdCB5ZXQKKyAqIGluIHRoZSBscnUgbGlzdCBhcyB0aGUgY2FsbGVyIHN0aWxsIGhvbGRzIGEgaGFuZGxlIHRvIGl0LiBSZXR1cm5zIDAgb24KKyAqIHN1Y2Nlc3MsIG9yIC1FQlVTWSBpZiBhIGNhY2hlIGVudHJ5IGZvciB0aGF0IGRldmljZSArIGlub2RlIGV4aXN0cworICogYWxyZWFkeSAodGhpcyBtYXkgaGFwcGVuIGFmdGVyIGEgZmFpbGVkIGxvb2t1cCwgYnV0IHdoZW4gYW5vdGhlciBwcm9jZXNzCisgKiBoYXMgaW5zZXJ0ZWQgdGhlIHNhbWUgY2FjaGUgZW50cnkgaW4gdGhlIG1lYW50aW1lKS4KKyAqCisgKiBAYmRldjogZGV2aWNlIHRoZSBjYWNoZSBlbnRyeSBiZWxvbmdzIHRvCisgKiBAYmxvY2s6IGJsb2NrIG51bWJlcgorICogQGtleXM6IGFycmF5IG9mIGFkZGl0aW9uYWwga2V5cy4gVGhlcmUgbXVzdCBiZSBpbmRleGVzX2NvdW50IGVudHJpZXMKKyAqICAgICAgICBpbiB0aGUgYXJyYXkgKGFzIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSBjYWNoZSkuCisgKi8KK2ludAorbWJfY2FjaGVfZW50cnlfaW5zZXJ0KHN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqY2UsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCSAgICAgIHNlY3Rvcl90IGJsb2NrLCB1bnNpZ25lZCBpbnQga2V5c1tdKQoreworCXN0cnVjdCBtYl9jYWNoZSAqY2FjaGUgPSBjZS0+ZV9jYWNoZTsKKwl1bnNpZ25lZCBpbnQgYnVja2V0OworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJaW50IGVycm9yID0gLUVCVVNZLCBuOworCisJYnVja2V0ID0gaGFzaF9sb25nKCh1bnNpZ25lZCBsb25nKWJkZXYgKyAoYmxvY2sgJiAweGZmZmZmZmZmKSwgCisJCQkgICBjYWNoZS0+Y19idWNrZXRfYml0cyk7CisJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJbGlzdF9mb3JfZWFjaF9wcmV2KGwsICZjYWNoZS0+Y19ibG9ja19oYXNoW2J1Y2tldF0pIHsKKwkJc3RydWN0IG1iX2NhY2hlX2VudHJ5ICpjZSA9CisJCQlsaXN0X2VudHJ5KGwsIHN0cnVjdCBtYl9jYWNoZV9lbnRyeSwgZV9ibG9ja19saXN0KTsKKwkJaWYgKGNlLT5lX2JkZXYgPT0gYmRldiAmJiBjZS0+ZV9ibG9jayA9PSBibG9jaykKKwkJCWdvdG8gb3V0OworCX0KKwlfX21iX2NhY2hlX2VudHJ5X3VuaGFzaChjZSk7CisJY2UtPmVfYmRldiA9IGJkZXY7CisJY2UtPmVfYmxvY2sgPSBibG9jazsKKwlsaXN0X2FkZCgmY2UtPmVfYmxvY2tfbGlzdCwgJmNhY2hlLT5jX2Jsb2NrX2hhc2hbYnVja2V0XSk7CisJZm9yIChuPTA7IG48bWJfY2FjaGVfaW5kZXhlcyhjYWNoZSk7IG4rKykgeworCQljZS0+ZV9pbmRleGVzW25dLm9fa2V5ID0ga2V5c1tuXTsKKwkJYnVja2V0ID0gaGFzaF9sb25nKGtleXNbbl0sIGNhY2hlLT5jX2J1Y2tldF9iaXRzKTsKKwkJbGlzdF9hZGQoJmNlLT5lX2luZGV4ZXNbbl0ub19saXN0LAorCQkJICZjYWNoZS0+Y19pbmRleGVzX2hhc2hbbl1bYnVja2V0XSk7CisJfQorCWVycm9yID0gMDsKK291dDoKKwlzcGluX3VubG9jaygmbWJfY2FjaGVfc3BpbmxvY2spOworCXJldHVybiBlcnJvcjsKK30KKworCisvKgorICogbWJfY2FjaGVfZW50cnlfcmVsZWFzZSgpCisgKgorICogUmVsZWFzZSBhIGhhbmRsZSB0byBhIGNhY2hlIGVudHJ5LiBXaGVuIHRoZSBsYXN0IGhhbmRsZSB0byBhIGNhY2hlIGVudHJ5CisgKiBpcyByZWxlYXNlZCBpdCBpcyBlaXRoZXIgZnJlZWQgKGlmIGl0IGlzIGludmFsaWQpIG9yIG90aGVyd2lzZSBpbnNlcnRlZAorICogaW4gdG8gdGhlIGxydSBsaXN0LgorICovCit2b2lkCittYl9jYWNoZV9lbnRyeV9yZWxlYXNlKHN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqY2UpCit7CisJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJX19tYl9jYWNoZV9lbnRyeV9yZWxlYXNlX3VubG9jayhjZSk7Cit9CisKKworLyoKKyAqIG1iX2NhY2hlX2VudHJ5X2ZyZWUoKQorICoKKyAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgc2VxdWVuY2UgbWJfY2FjaGVfZW50cnlfdGFrZW91dCgpIC0tCisgKiBtYl9jYWNoZV9lbnRyeV9yZWxlYXNlKCkuCisgKi8KK3ZvaWQKK21iX2NhY2hlX2VudHJ5X2ZyZWUoc3RydWN0IG1iX2NhY2hlX2VudHJ5ICpjZSkKK3sKKwlzcGluX2xvY2soJm1iX2NhY2hlX3NwaW5sb2NrKTsKKwltYl9hc3NlcnQobGlzdF9lbXB0eSgmY2UtPmVfbHJ1X2xpc3QpKTsKKwlfX21iX2NhY2hlX2VudHJ5X3VuaGFzaChjZSk7CisJX19tYl9jYWNoZV9lbnRyeV9yZWxlYXNlX3VubG9jayhjZSk7Cit9CisKKworLyoKKyAqIG1iX2NhY2hlX2VudHJ5X2dldCgpCisgKgorICogR2V0IGEgY2FjaGUgZW50cnkgIGJ5IGRldmljZSAvIGJsb2NrIG51bWJlci4gKFRoZXJlIGNhbiBvbmx5IGJlIG9uZSBlbnRyeQorICogaW4gdGhlIGNhY2hlIHBlciBkZXZpY2UgYW5kIGJsb2NrLikgUmV0dXJucyBOVUxMIGlmIG5vIHN1Y2ggY2FjaGUgZW50cnkKKyAqIGV4aXN0cy4gVGhlIHJldHVybmVkIGNhY2hlIGVudHJ5IGlzIGxvY2tlZCBmb3IgZXhjbHVzaXZlIGFjY2VzcyAoInNpbmdsZQorICogd3JpdGVyIikuCisgKi8KK3N0cnVjdCBtYl9jYWNoZV9lbnRyeSAqCittYl9jYWNoZV9lbnRyeV9nZXQoc3RydWN0IG1iX2NhY2hlICpjYWNoZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJICAgc2VjdG9yX3QgYmxvY2spCit7CisJdW5zaWduZWQgaW50IGJ1Y2tldDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsOworCXN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqY2U7CisKKwlidWNrZXQgPSBoYXNoX2xvbmcoKHVuc2lnbmVkIGxvbmcpYmRldiArIChibG9jayAmIDB4ZmZmZmZmZmYpLAorCQkJICAgY2FjaGUtPmNfYnVja2V0X2JpdHMpOworCXNwaW5fbG9jaygmbWJfY2FjaGVfc3BpbmxvY2spOworCWxpc3RfZm9yX2VhY2gobCwgJmNhY2hlLT5jX2Jsb2NrX2hhc2hbYnVja2V0XSkgeworCQljZSA9IGxpc3RfZW50cnkobCwgc3RydWN0IG1iX2NhY2hlX2VudHJ5LCBlX2Jsb2NrX2xpc3QpOworCQlpZiAoY2UtPmVfYmRldiA9PSBiZGV2ICYmIGNlLT5lX2Jsb2NrID09IGJsb2NrKSB7CisJCQlERUZJTkVfV0FJVCh3YWl0KTsKKworCQkJaWYgKCFsaXN0X2VtcHR5KCZjZS0+ZV9scnVfbGlzdCkpCisJCQkJbGlzdF9kZWxfaW5pdCgmY2UtPmVfbHJ1X2xpc3QpOworCisJCQl3aGlsZSAoY2UtPmVfdXNlZCA+IDApIHsKKwkJCQljZS0+ZV9xdWV1ZWQrKzsKKwkJCQlwcmVwYXJlX3RvX3dhaXQoJm1iX2NhY2hlX3F1ZXVlLCAmd2FpdCwKKwkJCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCQlzcGluX3VubG9jaygmbWJfY2FjaGVfc3BpbmxvY2spOworCQkJCXNjaGVkdWxlKCk7CisJCQkJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJCQkJY2UtPmVfcXVldWVkLS07CisJCQl9CisJCQlmaW5pc2hfd2FpdCgmbWJfY2FjaGVfcXVldWUsICZ3YWl0KTsKKwkJCWNlLT5lX3VzZWQgKz0gMSArIE1CX0NBQ0hFX1dSSVRFUjsKKworCQkJaWYgKCFfX21iX2NhY2hlX2VudHJ5X2lzX2hhc2hlZChjZSkpIHsKKwkJCQlfX21iX2NhY2hlX2VudHJ5X3JlbGVhc2VfdW5sb2NrKGNlKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCX0KKwljZSA9IE5VTEw7CisKK2NsZWFudXA6CisJc3Bpbl91bmxvY2soJm1iX2NhY2hlX3NwaW5sb2NrKTsKKwlyZXR1cm4gY2U7Cit9CisKKyNpZiAhZGVmaW5lZChNQl9DQUNIRV9JTkRFWEVTX0NPVU5UKSB8fCAoTUJfQ0FDSEVfSU5ERVhFU19DT1VOVCA+IDApCisKK3N0YXRpYyBzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKgorX19tYl9jYWNoZV9lbnRyeV9maW5kKHN0cnVjdCBsaXN0X2hlYWQgKmwsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCSAgICAgIGludCBpbmRleCwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdW5zaWduZWQgaW50IGtleSkKK3sKKwl3aGlsZSAobCAhPSBoZWFkKSB7CisJCXN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqY2UgPQorCQkJbGlzdF9lbnRyeShsLCBzdHJ1Y3QgbWJfY2FjaGVfZW50cnksCisJCQkgICAgICAgICAgIGVfaW5kZXhlc1tpbmRleF0ub19saXN0KTsKKwkJaWYgKGNlLT5lX2JkZXYgPT0gYmRldiAmJiBjZS0+ZV9pbmRleGVzW2luZGV4XS5vX2tleSA9PSBrZXkpIHsKKwkJCURFRklORV9XQUlUKHdhaXQpOworCisJCQlpZiAoIWxpc3RfZW1wdHkoJmNlLT5lX2xydV9saXN0KSkKKwkJCQlsaXN0X2RlbF9pbml0KCZjZS0+ZV9scnVfbGlzdCk7CisKKwkJCS8qIEluY3JlbWVudGluZyBiZWZvcmUgaG9sZGluZyB0aGUgbG9jayBnaXZlcyByZWFkZXJzCisJCQkgICBwcmlvcml0eSBvdmVyIHdyaXRlcnMuICovCisJCQljZS0+ZV91c2VkKys7CisJCQl3aGlsZSAoY2UtPmVfdXNlZCA+PSBNQl9DQUNIRV9XUklURVIpIHsKKwkJCQljZS0+ZV9xdWV1ZWQrKzsKKwkJCQlwcmVwYXJlX3RvX3dhaXQoJm1iX2NhY2hlX3F1ZXVlLCAmd2FpdCwKKwkJCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCQlzcGluX3VubG9jaygmbWJfY2FjaGVfc3BpbmxvY2spOworCQkJCXNjaGVkdWxlKCk7CisJCQkJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJCQkJY2UtPmVfcXVldWVkLS07CisJCQl9CisJCQlmaW5pc2hfd2FpdCgmbWJfY2FjaGVfcXVldWUsICZ3YWl0KTsKKworCQkJaWYgKCFfX21iX2NhY2hlX2VudHJ5X2lzX2hhc2hlZChjZSkpIHsKKwkJCQlfX21iX2NhY2hlX2VudHJ5X3JlbGVhc2VfdW5sb2NrKGNlKTsKKwkJCQlzcGluX2xvY2soJm1iX2NhY2hlX3NwaW5sb2NrKTsKKwkJCQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsKKwkJCX0KKwkJCXJldHVybiBjZTsKKwkJfQorCQlsID0gbC0+bmV4dDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworLyoKKyAqIG1iX2NhY2hlX2VudHJ5X2ZpbmRfZmlyc3QoKQorICoKKyAqIEZpbmQgdGhlIGZpcnN0IGNhY2hlIGVudHJ5IG9uIGEgZ2l2ZW4gZGV2aWNlIHdpdGggYSBjZXJ0YWluIGtleSBpbgorICogYW4gYWRkaXRpb25hbCBpbmRleC4gQWRkaXRvbmFsIG1hdGNoZXMgY2FuIGJlIGZvdW5kIHdpdGgKKyAqIG1iX2NhY2hlX2VudHJ5X2ZpbmRfbmV4dCgpLiBSZXR1cm5zIE5VTEwgaWYgbm8gbWF0Y2ggd2FzIGZvdW5kLiBUaGUKKyAqIHJldHVybmVkIGNhY2hlIGVudHJ5IGlzIGxvY2tlZCBmb3Igc2hhcmVkIGFjY2VzcyAoIm11bHRpcGxlIHJlYWRlcnMiKS4KKyAqCisgKiBAY2FjaGU6IHRoZSBjYWNoZSB0byBzZWFyY2gKKyAqIEBpbmRleDogdGhlIG51bWJlciBvZiB0aGUgYWRkaXRvbmFsIGluZGV4IHRvIHNlYXJjaCAoMDw9aW5kZXg8aW5kZXhlc19jb3VudCkKKyAqIEBiZGV2OiB0aGUgZGV2aWNlIHRoZSBjYWNoZSBlbnRyeSBzaG91bGQgYmVsb25nIHRvCisgKiBAa2V5OiB0aGUga2V5IGluIHRoZSBpbmRleAorICovCitzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKgorbWJfY2FjaGVfZW50cnlfZmluZF9maXJzdChzdHJ1Y3QgbWJfY2FjaGUgKmNhY2hlLCBpbnQgaW5kZXgsCisJCQkgIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHVuc2lnbmVkIGludCBrZXkpCit7CisJdW5zaWduZWQgaW50IGJ1Y2tldCA9IGhhc2hfbG9uZyhrZXksIGNhY2hlLT5jX2J1Y2tldF9iaXRzKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsOworCXN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqY2U7CisKKwltYl9hc3NlcnQoaW5kZXggPCBtYl9jYWNoZV9pbmRleGVzKGNhY2hlKSk7CisJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJbCA9IGNhY2hlLT5jX2luZGV4ZXNfaGFzaFtpbmRleF1bYnVja2V0XS5uZXh0OworCWNlID0gX19tYl9jYWNoZV9lbnRyeV9maW5kKGwsICZjYWNoZS0+Y19pbmRleGVzX2hhc2hbaW5kZXhdW2J1Y2tldF0sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIGJkZXYsIGtleSk7CisJc3Bpbl91bmxvY2soJm1iX2NhY2hlX3NwaW5sb2NrKTsKKwlyZXR1cm4gY2U7Cit9CisKKworLyoKKyAqIG1iX2NhY2hlX2VudHJ5X2ZpbmRfbmV4dCgpCisgKgorICogRmluZCB0aGUgbmV4dCBjYWNoZSBlbnRyeSBvbiBhIGdpdmVuIGRldmljZSB3aXRoIGEgY2VydGFpbiBrZXkgaW4gYW4KKyAqIGFkZGl0aW9uYWwgaW5kZXguIFJldHVybnMgTlVMTCBpZiBubyBtYXRjaCBjb3VsZCBiZSBmb3VuZC4gVGhlIHByZXZpb3VzCisgKiBlbnRyeSBpcyBhdG9tYXRpY2FsbHkgcmVsZWFzZWQsIHNvIHRoYXQgbWJfY2FjaGVfZW50cnlfZmluZF9uZXh0KCkgY2FuCisgKiBiZSBjYWxsZWQgbGlrZSB0aGlzOgorICoKKyAqIGVudHJ5ID0gbWJfY2FjaGVfZW50cnlfZmluZF9maXJzdCgpOworICogd2hpbGUgKGVudHJ5KSB7CisgKiAJLi4uCisgKgllbnRyeSA9IG1iX2NhY2hlX2VudHJ5X2ZpbmRfbmV4dChlbnRyeSwgLi4uKTsKKyAqIH0KKyAqCisgKiBAcHJldjogVGhlIHByZXZpb3VzIG1hdGNoCisgKiBAaW5kZXg6IHRoZSBudW1iZXIgb2YgdGhlIGFkZGl0b25hbCBpbmRleCB0byBzZWFyY2ggKDA8PWluZGV4PGluZGV4ZXNfY291bnQpCisgKiBAYmRldjogdGhlIGRldmljZSB0aGUgY2FjaGUgZW50cnkgc2hvdWxkIGJlbG9uZyB0bworICogQGtleTogdGhlIGtleSBpbiB0aGUgaW5kZXgKKyAqLworc3RydWN0IG1iX2NhY2hlX2VudHJ5ICoKK21iX2NhY2hlX2VudHJ5X2ZpbmRfbmV4dChzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKnByZXYsIGludCBpbmRleCwKKwkJCSBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB1bnNpZ25lZCBpbnQga2V5KQoreworCXN0cnVjdCBtYl9jYWNoZSAqY2FjaGUgPSBwcmV2LT5lX2NhY2hlOworCXVuc2lnbmVkIGludCBidWNrZXQgPSBoYXNoX2xvbmcoa2V5LCBjYWNoZS0+Y19idWNrZXRfYml0cyk7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKwlzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlOworCisJbWJfYXNzZXJ0KGluZGV4IDwgbWJfY2FjaGVfaW5kZXhlcyhjYWNoZSkpOworCXNwaW5fbG9jaygmbWJfY2FjaGVfc3BpbmxvY2spOworCWwgPSBwcmV2LT5lX2luZGV4ZXNbaW5kZXhdLm9fbGlzdC5uZXh0OworCWNlID0gX19tYl9jYWNoZV9lbnRyeV9maW5kKGwsICZjYWNoZS0+Y19pbmRleGVzX2hhc2hbaW5kZXhdW2J1Y2tldF0sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIGJkZXYsIGtleSk7CisJX19tYl9jYWNoZV9lbnRyeV9yZWxlYXNlX3VubG9jayhwcmV2KTsKKwlyZXR1cm4gY2U7Cit9CisKKyNlbmRpZiAgLyogIWRlZmluZWQoTUJfQ0FDSEVfSU5ERVhFU19DT1VOVCkgfHwgKE1CX0NBQ0hFX0lOREVYRVNfQ09VTlQgPiAwKSAqLworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X21iY2FjaGUodm9pZCkKK3sKKwltYl9zaHJpbmtlciA9IHNldF9zaHJpbmtlcihERUZBVUxUX1NFRUtTLCBtYl9jYWNoZV9zaHJpbmtfZm4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9tYmNhY2hlKHZvaWQpCit7CisJcmVtb3ZlX3Nocmlua2VyKG1iX3Nocmlua2VyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9tYmNhY2hlKQorbW9kdWxlX2V4aXQoZXhpdF9tYmNhY2hlKQorCmRpZmYgLS1naXQgYS9mcy9taW5peC9NYWtlZmlsZSBiL2ZzL21pbml4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNjMwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9taW5peC9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBtaW5peCBmaWxlc3lzdGVtIHJvdXRpbmVzLgorIworCitvYmotJChDT05GSUdfTUlOSVhfRlMpICs9IG1pbml4Lm8KKworbWluaXgtb2JqcyA6PSBiaXRtYXAubyBpdHJlZV92MS5vIGl0cmVlX3YyLm8gbmFtZWkubyBpbm9kZS5vIGZpbGUubyBkaXIubwpkaWZmIC0tZ2l0IGEvZnMvbWluaXgvYml0bWFwLmMgYi9mcy9taW5peC9iaXRtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzZhNGU0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbWluaXgvYml0bWFwLmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiAgbGludXgvZnMvbWluaXgvYml0bWFwLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKy8qCisgKiBNb2RpZmllZCBmb3IgNjgweDAgYnkgSGFtaXNoIE1hY2RvbmFsZAorICogRml4ZWQgZm9yIDY4MHgwIGJ5IEFuZHJlYXMgU2Nod2FiCisgKi8KKworLyogYml0bWFwLmMgY29udGFpbnMgdGhlIGNvZGUgdGhhdCBoYW5kbGVzIHRoZSBpbm9kZSBhbmQgYmxvY2sgYml0bWFwcyAqLworCisjaW5jbHVkZSAibWluaXguaCIKKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKK3N0YXRpYyBpbnQgbmliYmxlbWFwW10gPSB7IDQsMywzLDIsMywyLDIsMSwzLDIsMiwxLDIsMSwxLDAgfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY291bnRfZnJlZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKm1hcFtdLCB1bnNpZ25lZCBudW1ibG9ja3MsIF9fdTMyIG51bWJpdHMpCit7CisJdW5zaWduZWQgaSwgaiwgc3VtID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworICAKKwlmb3IgKGk9MDsgaTxudW1ibG9ja3MtMTsgaSsrKSB7CisJCWlmICghKGJoPW1hcFtpXSkpIAorCQkJcmV0dXJuKDApOworCQlmb3IgKGo9MDsgajxCTE9DS19TSVpFOyBqKyspCisJCQlzdW0gKz0gbmliYmxlbWFwW2JoLT5iX2RhdGFbal0gJiAweGZdCisJCQkJKyBuaWJibGVtYXBbKGJoLT5iX2RhdGFbal0+PjQpICYgMHhmXTsKKwl9CisKKwlpZiAobnVtYmxvY2tzPT0wIHx8ICEoYmg9bWFwW251bWJsb2Nrcy0xXSkpCisJCXJldHVybigwKTsKKwlpID0gKChudW1iaXRzLShudW1ibG9ja3MtMSkqQkxPQ0tfU0laRSo4KS8xNikqMjsKKwlmb3IgKGo9MDsgajxpOyBqKyspIHsKKwkJc3VtICs9IG5pYmJsZW1hcFtiaC0+Yl9kYXRhW2pdICYgMHhmXQorCQkJKyBuaWJibGVtYXBbKGJoLT5iX2RhdGFbal0+PjQpICYgMHhmXTsKKwl9CisKKwlpID0gbnVtYml0cyUxNjsKKwlpZiAoaSE9MCkgeworCQlpID0gKihfX3UxNiAqKSgmYmgtPmJfZGF0YVtqXSkgfCB+KCgxPDxpKSAtIDEpOworCQlzdW0gKz0gbmliYmxlbWFwW2kgJiAweGZdICsgbmliYmxlbWFwWyhpPj40KSAmIDB4Zl07CisJCXN1bSArPSBuaWJibGVtYXBbKGk+PjgpICYgMHhmXSArIG5pYmJsZW1hcFsoaT4+MTIpICYgMHhmXTsKKwl9CisJcmV0dXJuKHN1bSk7Cit9CisKK3ZvaWQgbWluaXhfZnJlZV9ibG9jayhzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IGJsb2NrKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IG1pbml4X3NiX2luZm8gKiBzYmkgPSBtaW5peF9zYihzYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJdW5zaWduZWQgaW50IGJpdCx6b25lOworCisJaWYgKGJsb2NrIDwgc2JpLT5zX2ZpcnN0ZGF0YXpvbmUgfHwgYmxvY2sgPj0gc2JpLT5zX256b25lcykgeworCQlwcmludGsoInRyeWluZyB0byBmcmVlIGJsb2NrIG5vdCBpbiBkYXRhem9uZVxuIik7CisJCXJldHVybjsKKwl9CisJem9uZSA9IGJsb2NrIC0gc2JpLT5zX2ZpcnN0ZGF0YXpvbmUgKyAxOworCWJpdCA9IHpvbmUgJiA4MTkxOworCXpvbmUgPj49IDEzOworCWlmICh6b25lID49IHNiaS0+c196bWFwX2Jsb2NrcykgeworCQlwcmludGsoIm1pbml4X2ZyZWVfYmxvY2s6IG5vbmV4aXN0ZW50IGJpdG1hcCBidWZmZXJcbiIpOworCQlyZXR1cm47CisJfQorCWJoID0gc2JpLT5zX3ptYXBbem9uZV07CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoIW1pbml4X3Rlc3RfYW5kX2NsZWFyX2JpdChiaXQsYmgtPmJfZGF0YSkpCisJCXByaW50aygiZnJlZV9ibG9jayAoJXM6JWQpOiBiaXQgYWxyZWFkeSBjbGVhcmVkXG4iLAorCQkgICAgICAgc2ItPnNfaWQsIGJsb2NrKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCXJldHVybjsKK30KKworaW50IG1pbml4X25ld19ibG9jayhzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqc2JpID0gbWluaXhfc2IoaW5vZGUtPmlfc2IpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNiaS0+c196bWFwX2Jsb2NrczsgaSsrKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBzYmktPnNfem1hcFtpXTsKKwkJaW50IGo7CisKKwkJbG9ja19rZXJuZWwoKTsKKwkJaWYgKChqID0gbWluaXhfZmluZF9maXJzdF96ZXJvX2JpdChiaC0+Yl9kYXRhLCA4MTkyKSkgPCA4MTkyKSB7CisJCQltaW5peF9zZXRfYml0KGosYmgtPmJfZGF0YSk7CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQlqICs9IGkqODE5MiArIHNiaS0+c19maXJzdGRhdGF6b25lLTE7CisJCQlpZiAoaiA8IHNiaS0+c19maXJzdGRhdGF6b25lIHx8IGogPj0gc2JpLT5zX256b25lcykKKwkJCQlicmVhazsKKwkJCXJldHVybiBqOworCQl9CisJCXVubG9ja19rZXJuZWwoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbWluaXhfY291bnRfZnJlZV9ibG9ja3Moc3RydWN0IG1pbml4X3NiX2luZm8gKnNiaSkKK3sKKwlyZXR1cm4gKGNvdW50X2ZyZWUoc2JpLT5zX3ptYXAsIHNiaS0+c196bWFwX2Jsb2NrcywKKwkJc2JpLT5zX256b25lcyAtIHNiaS0+c19maXJzdGRhdGF6b25lICsgMSkKKwkJPDwgc2JpLT5zX2xvZ196b25lX3NpemUpOworfQorCitzdHJ1Y3QgbWluaXhfaW5vZGUgKgorbWluaXhfVjFfcmF3X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGlub190IGlubywgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpCit7CisJaW50IGJsb2NrOworCXN0cnVjdCBtaW5peF9zYl9pbmZvICpzYmkgPSBtaW5peF9zYihzYik7CisJc3RydWN0IG1pbml4X2lub2RlICpwOworCisJaWYgKCFpbm8gfHwgaW5vID4gc2JpLT5zX25pbm9kZXMpIHsKKwkJcHJpbnRrKCJCYWQgaW5vZGUgbnVtYmVyIG9uIGRldiAlczogJWxkIGlzIG91dCBvZiByYW5nZVxuIiwKKwkJICAgICAgIHNiLT5zX2lkLCAobG9uZylpbm8pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaW5vLS07CisJYmxvY2sgPSAyICsgc2JpLT5zX2ltYXBfYmxvY2tzICsgc2JpLT5zX3ptYXBfYmxvY2tzICsKKwkJIGlubyAvIE1JTklYX0lOT0RFU19QRVJfQkxPQ0s7CisJKmJoID0gc2JfYnJlYWQoc2IsIGJsb2NrKTsKKwlpZiAoISpiaCkgeworCQlwcmludGsoInVuYWJsZSB0byByZWFkIGktbm9kZSBibG9ja1xuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlwID0gKHZvaWQgKikoKmJoKS0+Yl9kYXRhOworCXJldHVybiBwICsgaW5vICUgTUlOSVhfSU5PREVTX1BFUl9CTE9DSzsKK30KKworc3RydWN0IG1pbml4Ml9pbm9kZSAqCittaW5peF9WMl9yYXdfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW5vX3QgaW5vLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCkKK3sKKwlpbnQgYmxvY2s7CisJc3RydWN0IG1pbml4X3NiX2luZm8gKnNiaSA9IG1pbml4X3NiKHNiKTsKKwlzdHJ1Y3QgbWluaXgyX2lub2RlICpwOworCisJKmJoID0gTlVMTDsKKwlpZiAoIWlubyB8fCBpbm8gPiBzYmktPnNfbmlub2RlcykgeworCQlwcmludGsoIkJhZCBpbm9kZSBudW1iZXIgb24gZGV2ICVzOiAlbGQgaXMgb3V0IG9mIHJhbmdlXG4iLAorCQkgICAgICAgc2ItPnNfaWQsIChsb25nKWlubyk7CisJCXJldHVybiBOVUxMOworCX0KKwlpbm8tLTsKKwlibG9jayA9IDIgKyBzYmktPnNfaW1hcF9ibG9ja3MgKyBzYmktPnNfem1hcF9ibG9ja3MgKworCQkgaW5vIC8gTUlOSVgyX0lOT0RFU19QRVJfQkxPQ0s7CisJKmJoID0gc2JfYnJlYWQoc2IsIGJsb2NrKTsKKwlpZiAoISpiaCkgeworCQlwcmludGsoInVuYWJsZSB0byByZWFkIGktbm9kZSBibG9ja1xuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlwID0gKHZvaWQgKikoKmJoKS0+Yl9kYXRhOworCXJldHVybiBwICsgaW5vICUgTUlOSVgyX0lOT0RFU19QRVJfQkxPQ0s7Cit9CisKKy8qIENsZWFyIHRoZSBsaW5rIGNvdW50IGFuZCBtb2RlIG9mIGEgZGVsZXRlZCBpbm9kZSBvbiBkaXNrLiAqLworCitzdGF0aWMgdm9pZCBtaW5peF9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCisJaWYgKElOT0RFX1ZFUlNJT04oaW5vZGUpID09IE1JTklYX1YxKSB7CisJCXN0cnVjdCBtaW5peF9pbm9kZSAqcmF3X2lub2RlOworCQlyYXdfaW5vZGUgPSBtaW5peF9WMV9yYXdfaW5vZGUoaW5vZGUtPmlfc2IsIGlub2RlLT5pX2lubywgJmJoKTsKKwkJaWYgKHJhd19pbm9kZSkgeworCQkJcmF3X2lub2RlLT5pX25saW5rcyA9IDA7CisJCQlyYXdfaW5vZGUtPmlfbW9kZSA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgbWluaXgyX2lub2RlICpyYXdfaW5vZGU7CisJCXJhd19pbm9kZSA9IG1pbml4X1YyX3Jhd19pbm9kZShpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAmYmgpOworCQlpZiAocmF3X2lub2RlKSB7CisJCQlyYXdfaW5vZGUtPmlfbmxpbmtzID0gMDsKKwkJCXJhd19pbm9kZS0+aV9tb2RlID0gMDsKKwkJfQorCX0KKwlpZiAoYmgpIHsKKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQlicmVsc2UgKGJoKTsKKwl9Cit9CisKK3ZvaWQgbWluaXhfZnJlZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqc2JpID0gbWluaXhfc2IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXVuc2lnbmVkIGxvbmcgaW5vOworCisJaW5vID0gaW5vZGUtPmlfaW5vOworCWlmIChpbm8gPCAxIHx8IGlubyA+IHNiaS0+c19uaW5vZGVzKSB7CisJCXByaW50aygibWluaXhfZnJlZV9pbm9kZTogaW5vZGUgMCBvciBub25leGlzdGVudCBpbm9kZVxuIik7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoKGlubyA+PiAxMykgPj0gc2JpLT5zX2ltYXBfYmxvY2tzKSB7CisJCXByaW50aygibWluaXhfZnJlZV9pbm9kZTogbm9uZXhpc3RlbnQgaW1hcCBpbiBzdXBlcmJsb2NrXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJbWluaXhfY2xlYXJfaW5vZGUoaW5vZGUpOwkvKiBjbGVhciBvbi1kaXNrIGNvcHkgKi8KKworCWJoID0gc2JpLT5zX2ltYXBbaW5vID4+IDEzXTsKKwlsb2NrX2tlcm5lbCgpOworCWlmICghbWluaXhfdGVzdF9hbmRfY2xlYXJfYml0KGlubyAmIDgxOTEsIGJoLT5iX2RhdGEpKQorCQlwcmludGsoIm1pbml4X2ZyZWVfaW5vZGU6IGJpdCAlbHUgYWxyZWFkeSBjbGVhcmVkLlxuIiwgaW5vKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJbWFya19idWZmZXJfZGlydHkoYmgpOworIG91dDoKKwljbGVhcl9pbm9kZShpbm9kZSk7CQkvKiBjbGVhciBpbi1tZW1vcnkgY29weSAqLworfQorCitzdHJ1Y3QgaW5vZGUgKiBtaW5peF9uZXdfaW5vZGUoY29uc3Qgc3RydWN0IGlub2RlICogZGlyLCBpbnQgKiBlcnJvcikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBtaW5peF9zYl9pbmZvICpzYmkgPSBtaW5peF9zYihzYik7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG5ld19pbm9kZShzYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJaW50IGksajsKKworCWlmICghaW5vZGUpIHsKKwkJKmVycm9yID0gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWogPSA4MTkyOworCWJoID0gTlVMTDsKKwkqZXJyb3IgPSAtRU5PU1BDOworCWxvY2tfa2VybmVsKCk7CisJZm9yIChpID0gMDsgaSA8IHNiaS0+c19pbWFwX2Jsb2NrczsgaSsrKSB7CisJCWJoID0gc2JpLT5zX2ltYXBbaV07CisJCWlmICgoaiA9IG1pbml4X2ZpbmRfZmlyc3RfemVyb19iaXQoYmgtPmJfZGF0YSwgODE5MikpIDwgODE5MikKKwkJCWJyZWFrOworCX0KKwlpZiAoIWJoIHx8IGogPj0gODE5MikgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKG1pbml4X3Rlc3RfYW5kX3NldF9iaXQoaixiaC0+Yl9kYXRhKSkgewkvKiBzaG91bGRuJ3QgaGFwcGVuICovCisJCXByaW50aygibmV3X2lub2RlOiBiaXQgYWxyZWFkeSBzZXQiKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJaiArPSBpKjgxOTI7CisJaWYgKCFqIHx8IGogPiBzYmktPnNfbmlub2RlcykgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlub2RlLT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCWlub2RlLT5pX2dpZCA9IChkaXItPmlfbW9kZSAmIFNfSVNHSUQpID8gZGlyLT5pX2dpZCA6IGN1cnJlbnQtPmZzZ2lkOworCWlub2RlLT5pX2lubyA9IGo7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpbm9kZS0+aV9ibG9ja3MgPSBpbm9kZS0+aV9ibGtzaXplID0gMDsKKwltZW1zZXQoJm1pbml4X2koaW5vZGUpLT51LCAwLCBzaXplb2YobWluaXhfaShpbm9kZSktPnUpKTsKKwlpbnNlcnRfaW5vZGVfaGFzaChpbm9kZSk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisKKwkqZXJyb3IgPSAwOworCXJldHVybiBpbm9kZTsKK30KKwordW5zaWduZWQgbG9uZyBtaW5peF9jb3VudF9mcmVlX2lub2RlcyhzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqc2JpKQoreworCXJldHVybiBjb3VudF9mcmVlKHNiaS0+c19pbWFwLCBzYmktPnNfaW1hcF9ibG9ja3MsIHNiaS0+c19uaW5vZGVzICsgMSk7Cit9CmRpZmYgLS1naXQgYS9mcy9taW5peC9kaXIuYyBiL2ZzL21pbml4L2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjUwMmEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9taW5peC9kaXIuYwpAQCAtMCwwICsxLDQwOSBAQAorLyoKKyAqICBsaW51eC9mcy9taW5peC9kaXIuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgbWluaXggZGlyZWN0b3J5IGhhbmRsaW5nIGZ1bmN0aW9ucworICovCisKKyNpbmNsdWRlICJtaW5peC5oIgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCit0eXBlZGVmIHN0cnVjdCBtaW5peF9kaXJfZW50cnkgbWluaXhfZGlyZW50OworCitzdGF0aWMgaW50IG1pbml4X3JlYWRkaXIoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1pbml4X2Rpcl9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBtaW5peF9yZWFkZGlyLAorCS5mc3luYwkJPSBtaW5peF9zeW5jX2ZpbGUsCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgZGlyX3B1dF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCWt1bm1hcChwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG9mZnNldCBpbnRvIHBhZ2UgYHBhZ2VfbnInIG9mIHRoZSBsYXN0IHZhbGlkCisgKiBieXRlIGluIHRoYXQgcGFnZSwgcGx1cyBvbmUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZAorbWluaXhfbGFzdF9ieXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgcGFnZV9ucikKK3sKKwl1bnNpZ25lZCBsYXN0X2J5dGUgPSBQQUdFX0NBQ0hFX1NJWkU7CisKKwlpZiAocGFnZV9uciA9PSAoaW5vZGUtPmlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKSkKKwkJbGFzdF9ieXRlID0gaW5vZGUtPmlfc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwlyZXR1cm4gbGFzdF9ieXRlOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZGlyX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIChpbm9kZS0+aV9zaXplK1BBR0VfQ0FDSEVfU0laRS0xKT4+UEFHRV9DQUNIRV9TSElGVDsKK30KKworc3RhdGljIGludCBkaXJfY29tbWl0X2NodW5rKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IChzdHJ1Y3QgaW5vZGUgKilwYWdlLT5tYXBwaW5nLT5ob3N0OworCWludCBlcnIgPSAwOworCXBhZ2UtPm1hcHBpbmctPmFfb3BzLT5jb21taXRfd3JpdGUoTlVMTCwgcGFnZSwgZnJvbSwgdG8pOworCWlmIChJU19ESVJTWU5DKGRpcikpCisJCWVyciA9IHdyaXRlX29uZV9wYWdlKHBhZ2UsIDEpOworCWVsc2UKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBwYWdlICogZGlyX2dldF9wYWdlKHN0cnVjdCBpbm9kZSAqZGlyLCB1bnNpZ25lZCBsb25nIG4pCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBkaXItPmlfbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBuLAorCQkJCShmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwlpZiAoIUlTX0VSUihwYWdlKSkgeworCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCQlrbWFwKHBhZ2UpOworCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJCWdvdG8gZmFpbDsKKwl9CisJcmV0dXJuIHBhZ2U7CisKK2ZhaWw6CisJZGlyX3B1dF9wYWdlKHBhZ2UpOworCXJldHVybiBFUlJfUFRSKC1FSU8pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKm1pbml4X25leHRfZW50cnkodm9pZCAqZGUsIHN0cnVjdCBtaW5peF9zYl9pbmZvICpzYmkpCit7CisJcmV0dXJuICh2b2lkKikoKGNoYXIqKWRlICsgc2JpLT5zX2RpcnNpemUpOworfQorCitzdGF0aWMgaW50IG1pbml4X3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwl1bnNpZ25lZCBsb25nIHBvcyA9IGZpbHAtPmZfcG9zOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJdW5zaWduZWQgb2Zmc2V0ID0gcG9zICYgflBBR0VfQ0FDSEVfTUFTSzsKKwl1bnNpZ25lZCBsb25nIG4gPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIG5wYWdlcyA9IGRpcl9wYWdlcyhpbm9kZSk7CisJc3RydWN0IG1pbml4X3NiX2luZm8gKnNiaSA9IG1pbml4X3NiKHNiKTsKKwl1bnNpZ25lZCBjaHVua19zaXplID0gc2JpLT5zX2RpcnNpemU7CisKKwlsb2NrX2tlcm5lbCgpOworCisJcG9zID0gKHBvcyArIGNodW5rX3NpemUtMSkgJiB+KGNodW5rX3NpemUtMSk7CisJaWYgKHBvcyA+PSBpbm9kZS0+aV9zaXplKQorCQlnb3RvIGRvbmU7CisKKwlmb3IgKCA7IG4gPCBucGFnZXM7IG4rKywgb2Zmc2V0ID0gMCkgeworCQljaGFyICpwLCAqa2FkZHIsICpsaW1pdDsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBkaXJfZ2V0X3BhZ2UoaW5vZGUsIG4pOworCisJCWlmIChJU19FUlIocGFnZSkpCisJCQljb250aW51ZTsKKwkJa2FkZHIgPSAoY2hhciAqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJcCA9IGthZGRyK29mZnNldDsKKwkJbGltaXQgPSBrYWRkciArIG1pbml4X2xhc3RfYnl0ZShpbm9kZSwgbikgLSBjaHVua19zaXplOworCQlmb3IgKCA7IHAgPD0gbGltaXQgOyBwID0gbWluaXhfbmV4dF9lbnRyeShwLCBzYmkpKSB7CisJCQltaW5peF9kaXJlbnQgKmRlID0gKG1pbml4X2RpcmVudCAqKXA7CisJCQlpZiAoZGUtPmlub2RlKSB7CisJCQkJaW50IG92ZXI7CisJCQkJdW5zaWduZWQgbCA9IHN0cm5sZW4oZGUtPm5hbWUsc2JpLT5zX25hbWVsZW4pOworCisJCQkJb2Zmc2V0ID0gcCAtIGthZGRyOworCQkJCW92ZXIgPSBmaWxsZGlyKGRpcmVudCwgZGUtPm5hbWUsIGwsCisJCQkJCQkobjw8UEFHRV9DQUNIRV9TSElGVCkgfCBvZmZzZXQsCisJCQkJCQlkZS0+aW5vZGUsIERUX1VOS05PV04pOworCQkJCWlmIChvdmVyKSB7CisJCQkJCWRpcl9wdXRfcGFnZShwYWdlKTsKKwkJCQkJZ290byBkb25lOworCQkJCX0KKwkJCX0KKwkJfQorCQlkaXJfcHV0X3BhZ2UocGFnZSk7CisJfQorCitkb25lOgorCWZpbHAtPmZfcG9zID0gKG4gPDwgUEFHRV9DQUNIRV9TSElGVCkgfCBvZmZzZXQ7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBuYW1lY29tcGFyZShpbnQgbGVuLCBpbnQgbWF4bGVuLAorCWNvbnN0IGNoYXIgKiBuYW1lLCBjb25zdCBjaGFyICogYnVmZmVyKQoreworCWlmIChsZW4gPCBtYXhsZW4gJiYgYnVmZmVyW2xlbl0pCisJCXJldHVybiAwOworCXJldHVybiAhbWVtY21wKG5hbWUsIGJ1ZmZlciwgbGVuKTsKK30KKworLyoKKyAqCW1pbml4X2ZpbmRfZW50cnkoKQorICoKKyAqIGZpbmRzIGFuIGVudHJ5IGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHdpdGggdGhlIHdhbnRlZCBuYW1lLiBJdAorICogcmV0dXJucyB0aGUgY2FjaGUgYnVmZmVyIGluIHdoaWNoIHRoZSBlbnRyeSB3YXMgZm91bmQsIGFuZCB0aGUgZW50cnkKKyAqIGl0c2VsZiAoYXMgYSBwYXJhbWV0ZXIgLSByZXNfZGlyKS4gSXQgZG9lcyBOT1QgcmVhZCB0aGUgaW5vZGUgb2YgdGhlCisgKiBlbnRyeSAtIHlvdSdsbCBoYXZlIHRvIGRvIHRoYXQgeW91cnNlbGYgaWYgeW91IHdhbnQgdG8uCisgKi8KK21pbml4X2RpcmVudCAqbWluaXhfZmluZF9lbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYWdlICoqcmVzX3BhZ2UpCit7CisJY29uc3QgY2hhciAqIG5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludCBuYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXN0cnVjdCBpbm9kZSAqIGRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IG1pbml4X3NiX2luZm8gKiBzYmkgPSBtaW5peF9zYihzYik7CisJdW5zaWduZWQgbG9uZyBuOworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzID0gZGlyX3BhZ2VzKGRpcik7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCXN0cnVjdCBtaW5peF9kaXJfZW50cnkgKmRlOworCisJKnJlc19wYWdlID0gTlVMTDsKKworCWZvciAobiA9IDA7IG4gPCBucGFnZXM7IG4rKykgeworCQljaGFyICprYWRkcjsKKwkJcGFnZSA9IGRpcl9nZXRfcGFnZShkaXIsIG4pOworCQlpZiAoSVNfRVJSKHBhZ2UpKQorCQkJY29udGludWU7CisKKwkJa2FkZHIgPSAoY2hhciopcGFnZV9hZGRyZXNzKHBhZ2UpOworCQlkZSA9IChzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5ICopIGthZGRyOworCQlrYWRkciArPSBtaW5peF9sYXN0X2J5dGUoZGlyLCBuKSAtIHNiaS0+c19kaXJzaXplOworCQlmb3IgKCA7IChjaGFyICopIGRlIDw9IGthZGRyIDsgZGUgPSBtaW5peF9uZXh0X2VudHJ5KGRlLHNiaSkpIHsKKwkJCWlmICghZGUtPmlub2RlKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKG5hbWVjb21wYXJlKG5hbWVsZW4sc2JpLT5zX25hbWVsZW4sbmFtZSxkZS0+bmFtZSkpCisJCQkJZ290byBmb3VuZDsKKwkJfQorCQlkaXJfcHV0X3BhZ2UocGFnZSk7CisJfQorCXJldHVybiBOVUxMOworCitmb3VuZDoKKwkqcmVzX3BhZ2UgPSBwYWdlOworCXJldHVybiBkZTsKK30KKworaW50IG1pbml4X2FkZF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJY29uc3QgY2hhciAqIG5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludCBuYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBtaW5peF9zYl9pbmZvICogc2JpID0gbWluaXhfc2Ioc2IpOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwlzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5ICogZGU7CisJdW5zaWduZWQgbG9uZyBucGFnZXMgPSBkaXJfcGFnZXMoZGlyKTsKKwl1bnNpZ25lZCBsb25nIG47CisJY2hhciAqa2FkZHI7CisJdW5zaWduZWQgZnJvbSwgdG87CisJaW50IGVycjsKKworCS8qCisJICogV2UgdGFrZSBjYXJlIG9mIGRpcmVjdG9yeSBleHBhbnNpb24gaW4gdGhlIHNhbWUgbG9vcAorCSAqIFRoaXMgY29kZSBwbGF5cyBvdXRzaWRlIGlfc2l6ZSwgc28gaXQgbG9ja3MgdGhlIHBhZ2UKKwkgKiB0byBwcm90ZWN0IHRoYXQgcmVnaW9uLgorCSAqLworCWZvciAobiA9IDA7IG4gPD0gbnBhZ2VzOyBuKyspIHsKKwkJY2hhciAqZGlyX2VuZDsKKworCQlwYWdlID0gZGlyX2dldF9wYWdlKGRpciwgbik7CisJCWVyciA9IFBUUl9FUlIocGFnZSk7CisJCWlmIChJU19FUlIocGFnZSkpCisJCQlnb3RvIG91dDsKKwkJbG9ja19wYWdlKHBhZ2UpOworCQlrYWRkciA9IChjaGFyKilwYWdlX2FkZHJlc3MocGFnZSk7CisJCWRpcl9lbmQgPSBrYWRkciArIG1pbml4X2xhc3RfYnl0ZShkaXIsIG4pOworCQlkZSA9IChtaW5peF9kaXJlbnQgKilrYWRkcjsKKwkJa2FkZHIgKz0gUEFHRV9DQUNIRV9TSVpFIC0gc2JpLT5zX2RpcnNpemU7CisJCXdoaWxlICgoY2hhciAqKWRlIDw9IGthZGRyKSB7CisJCQlpZiAoKGNoYXIgKilkZSA9PSBkaXJfZW5kKSB7CisJCQkJLyogV2UgaGl0IGlfc2l6ZSAqLworCQkJCWRlLT5pbm9kZSA9IDA7CisJCQkJZ290byBnb3RfaXQ7CisJCQl9CisJCQlpZiAoIWRlLT5pbm9kZSkKKwkJCQlnb3RvIGdvdF9pdDsKKwkJCWVyciA9IC1FRVhJU1Q7CisJCQlpZiAobmFtZWNvbXBhcmUobmFtZWxlbixzYmktPnNfbmFtZWxlbixuYW1lLGRlLT5uYW1lKSkKKwkJCQlnb3RvIG91dF91bmxvY2s7CisJCQlkZSA9IG1pbml4X25leHRfZW50cnkoZGUsIHNiaSk7CisJCX0KKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCWRpcl9wdXRfcGFnZShwYWdlKTsKKwl9CisJQlVHKCk7CisJcmV0dXJuIC1FSU5WQUw7CisKK2dvdF9pdDoKKwlmcm9tID0gKGNoYXIqKWRlIC0gKGNoYXIqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwl0byA9IGZyb20gKyBzYmktPnNfZGlyc2l6ZTsKKwllcnIgPSBwYWdlLT5tYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCBmcm9tLCB0byk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5sb2NrOworCW1lbWNweSAoZGUtPm5hbWUsIG5hbWUsIG5hbWVsZW4pOworCW1lbXNldCAoZGUtPm5hbWUgKyBuYW1lbGVuLCAwLCBzYmktPnNfZGlyc2l6ZSAtIG5hbWVsZW4gLSAyKTsKKwlkZS0+aW5vZGUgPSBpbm9kZS0+aV9pbm87CisJZXJyID0gZGlyX2NvbW1pdF9jaHVuayhwYWdlLCBmcm9tLCB0byk7CisJZGlyLT5pX210aW1lID0gZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGRpcik7CitvdXRfcHV0OgorCWRpcl9wdXRfcGFnZShwYWdlKTsKK291dDoKKwlyZXR1cm4gZXJyOworb3V0X3VubG9jazoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlnb3RvIG91dF9wdXQ7Cit9CisKK2ludCBtaW5peF9kZWxldGVfZW50cnkoc3RydWN0IG1pbml4X2Rpcl9lbnRyeSAqZGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gKHN0cnVjdCBpbm9kZSopbWFwcGluZy0+aG9zdDsKKwljaGFyICprYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwl1bnNpZ25lZCBmcm9tID0gKGNoYXIqKWRlIC0ga2FkZHI7CisJdW5zaWduZWQgdG8gPSBmcm9tICsgbWluaXhfc2IoaW5vZGUtPmlfc2IpLT5zX2RpcnNpemU7CisJaW50IGVycjsKKworCWxvY2tfcGFnZShwYWdlKTsKKwllcnIgPSBtYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCBmcm9tLCB0byk7CisJaWYgKGVyciA9PSAwKSB7CisJCWRlLT5pbm9kZSA9IDA7CisJCWVyciA9IGRpcl9jb21taXRfY2h1bmsocGFnZSwgZnJvbSwgdG8pOworCX0gZWxzZSB7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCX0KKwlkaXJfcHV0X3BhZ2UocGFnZSk7CisJaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJcmV0dXJuIGVycjsKK30KKworaW50IG1pbml4X21ha2VfZW1wdHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIDApOworCXN0cnVjdCBtaW5peF9zYl9pbmZvICogc2JpID0gbWluaXhfc2IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBtaW5peF9kaXJfZW50cnkgKiBkZTsKKwljaGFyICprYWRkcjsKKwlpbnQgZXJyOworCisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKwllcnIgPSBtYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCAwLCAyICogc2JpLT5zX2RpcnNpemUpOworCWlmIChlcnIpIHsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwltZW1zZXQoa2FkZHIsIDAsIFBBR0VfQ0FDSEVfU0laRSk7CisKKwlkZSA9IChzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5ICopa2FkZHI7CisJZGUtPmlub2RlID0gaW5vZGUtPmlfaW5vOworCXN0cmNweShkZS0+bmFtZSwiLiIpOworCWRlID0gbWluaXhfbmV4dF9lbnRyeShkZSwgc2JpKTsKKwlkZS0+aW5vZGUgPSBkaXItPmlfaW5vOworCXN0cmNweShkZS0+bmFtZSwiLi4iKTsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisKKwllcnIgPSBkaXJfY29tbWl0X2NodW5rKHBhZ2UsIDAsIDIgKiBzYmktPnNfZGlyc2l6ZSk7CitmYWlsOgorCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogcm91dGluZSB0byBjaGVjayB0aGF0IHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGlzIGVtcHR5IChmb3Igcm1kaXIpCisgKi8KK2ludCBtaW5peF9lbXB0eV9kaXIoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaSwgbnBhZ2VzID0gZGlyX3BhZ2VzKGlub2RlKTsKKwlzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqc2JpID0gbWluaXhfc2IoaW5vZGUtPmlfc2IpOworCisJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKSB7CisJCWNoYXIgKmthZGRyOworCQltaW5peF9kaXJlbnQgKiBkZTsKKwkJcGFnZSA9IGRpcl9nZXRfcGFnZShpbm9kZSwgaSk7CisKKwkJaWYgKElTX0VSUihwYWdlKSkKKwkJCWNvbnRpbnVlOworCisJCWthZGRyID0gKGNoYXIgKilwYWdlX2FkZHJlc3MocGFnZSk7CisJCWRlID0gKG1pbml4X2RpcmVudCAqKWthZGRyOworCQlrYWRkciArPSBtaW5peF9sYXN0X2J5dGUoaW5vZGUsIGkpIC0gc2JpLT5zX2RpcnNpemU7CisKKwkJd2hpbGUgKChjaGFyICopZGUgPD0ga2FkZHIpIHsKKwkJCWlmIChkZS0+aW5vZGUgIT0gMCkgeworCQkJCS8qIGNoZWNrIGZvciAuIGFuZCAuLiAqLworCQkJCWlmIChkZS0+bmFtZVswXSAhPSAnLicpCisJCQkJCWdvdG8gbm90X2VtcHR5OworCQkJCWlmICghZGUtPm5hbWVbMV0pIHsKKwkJCQkJaWYgKGRlLT5pbm9kZSAhPSBpbm9kZS0+aV9pbm8pCisJCQkJCQlnb3RvIG5vdF9lbXB0eTsKKwkJCQl9IGVsc2UgaWYgKGRlLT5uYW1lWzFdICE9ICcuJykKKwkJCQkJZ290byBub3RfZW1wdHk7CisJCQkJZWxzZSBpZiAoZGUtPm5hbWVbMl0pCisJCQkJCWdvdG8gbm90X2VtcHR5OworCQkJfQorCQkJZGUgPSBtaW5peF9uZXh0X2VudHJ5KGRlLCBzYmkpOworCQl9CisJCWRpcl9wdXRfcGFnZShwYWdlKTsKKwl9CisJcmV0dXJuIDE7CisKK25vdF9lbXB0eToKKwlkaXJfcHV0X3BhZ2UocGFnZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJlbGVhc2VzIHRoZSBwYWdlICovCit2b2lkIG1pbml4X3NldF9saW5rKHN0cnVjdCBtaW5peF9kaXJfZW50cnkgKmRlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gKHN0cnVjdCBpbm9kZSopcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqc2JpID0gbWluaXhfc2IoZGlyLT5pX3NiKTsKKwl1bnNpZ25lZCBmcm9tID0gKGNoYXIgKilkZS0oY2hhciopcGFnZV9hZGRyZXNzKHBhZ2UpOworCXVuc2lnbmVkIHRvID0gZnJvbSArIHNiaS0+c19kaXJzaXplOworCWludCBlcnI7CisKKwlsb2NrX3BhZ2UocGFnZSk7CisJZXJyID0gcGFnZS0+bWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgcGFnZSwgZnJvbSwgdG8pOworCWlmIChlcnIgPT0gMCkgeworCQlkZS0+aW5vZGUgPSBpbm9kZS0+aV9pbm87CisJCWVyciA9IGRpcl9jb21taXRfY2h1bmsocGFnZSwgZnJvbSwgdG8pOworCX0gZWxzZSB7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCX0KKwlkaXJfcHV0X3BhZ2UocGFnZSk7CisJZGlyLT5pX210aW1lID0gZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGRpcik7Cit9CisKK3N0cnVjdCBtaW5peF9kaXJfZW50cnkgKiBtaW5peF9kb3Rkb3QgKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgcGFnZSAqKnApCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBkaXJfZ2V0X3BhZ2UoZGlyLCAwKTsKKwlzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqc2JpID0gbWluaXhfc2IoZGlyLT5pX3NiKTsKKwlzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5ICpkZSA9IE5VTEw7CisKKwlpZiAoIUlTX0VSUihwYWdlKSkgeworCQlkZSA9IG1pbml4X25leHRfZW50cnkocGFnZV9hZGRyZXNzKHBhZ2UpLCBzYmkpOworCQkqcCA9IHBhZ2U7CisJfQorCXJldHVybiBkZTsKK30KKworaW5vX3QgbWluaXhfaW5vZGVfYnlfbmFtZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IG1pbml4X2Rpcl9lbnRyeSAqZGUgPSBtaW5peF9maW5kX2VudHJ5KGRlbnRyeSwgJnBhZ2UpOworCWlub190IHJlcyA9IDA7CisKKwlpZiAoZGUpIHsKKwkJcmVzID0gZGUtPmlub2RlOworCQlkaXJfcHV0X3BhZ2UocGFnZSk7CisJfQorCXJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9mcy9taW5peC9maWxlLmMgYi9mcy9taW5peC9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkNzdhYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL21pbml4L2ZpbGUuYwpAQCAtMCwwICsxLDQ1IEBACisvKgorICogIGxpbnV4L2ZzL21pbml4L2ZpbGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgbWluaXggcmVndWxhciBmaWxlIGhhbmRsaW5nIHByaW1pdGl2ZXMKKyAqLworCisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4JCS8qIGZvciBmc3luY19pbm9kZV9idWZmZXJzKCkgKi8KKyNpbmNsdWRlICJtaW5peC5oIgorCisvKgorICogV2UgaGF2ZSBtb3N0bHkgTlVMTHMgaGVyZTogdGhlIGN1cnJlbnQgZGVmYXVsdHMgYXJlIE9LIGZvcgorICogdGhlIG1pbml4IGZpbGVzeXN0ZW0uCisgKi8KK2ludCBtaW5peF9zeW5jX2ZpbGUoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1pbml4X2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19maWxlX3JlYWQsCisJLndyaXRlCQk9IGdlbmVyaWNfZmlsZV93cml0ZSwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkuZnN5bmMJCT0gbWluaXhfc3luY19maWxlLAorCS5zZW5kZmlsZQk9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG1pbml4X2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkudHJ1bmNhdGUJPSBtaW5peF90cnVuY2F0ZSwKKwkuZ2V0YXR0cgk9IG1pbml4X2dldGF0dHIsCit9OworCitpbnQgbWluaXhfc3luY19maWxlKHN0cnVjdCBmaWxlICogZmlsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyOworCisJZXJyID0gc3luY19tYXBwaW5nX2J1ZmZlcnMoaW5vZGUtPmlfbWFwcGluZyk7CisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX0RJUlRZKSkKKwkJcmV0dXJuIGVycjsKKwlpZiAoZGF0YXN5bmMgJiYgIShpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFlfREFUQVNZTkMpKQorCQlyZXR1cm4gZXJyOworCQorCWVyciB8PSBtaW5peF9zeW5jX2lub2RlKGlub2RlKTsKKwlyZXR1cm4gZXJyID8gLUVJTyA6IDA7Cit9CmRpZmYgLS1naXQgYS9mcy9taW5peC9pbm9kZS5jIGIvZnMvbWluaXgvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjE4YzIxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbWluaXgvaW5vZGUuYwpAQCAtMCwwICsxLDU5OCBAQAorLyoKKyAqICBsaW51eC9mcy9taW5peC9pbm9kZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk2ICBHZXJ0amFuIHZhbiBXaW5nZXJkZSAgICAoZ2VydGphbkBjcy52dS5ubCkKKyAqCU1pbml4IFYyIGZzIHN1cHBvcnQuCisgKgorICogIE1vZGlmaWVkIGZvciA2ODB4MCBieSBBbmRyZWFzIFNjaHdhYgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlICJtaW5peC5oIgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdodWlkLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisKK3N0YXRpYyB2b2lkIG1pbml4X3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpOworc3RhdGljIGludCBtaW5peF93cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IHdhaXQpOworc3RhdGljIGludCBtaW5peF9zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1Zik7CitzdGF0aWMgaW50IG1pbml4X3JlbW91bnQgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBpbnQgKiBmbGFncywgY2hhciAqIGRhdGEpOworCitzdGF0aWMgdm9pZCBtaW5peF9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbm9kZS0+aV9zaXplID0gMDsKKwltaW5peF90cnVuY2F0ZShpbm9kZSk7CisJbWluaXhfZnJlZV9pbm9kZShpbm9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIG1pbml4X3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWludCBpOworCXN0cnVjdCBtaW5peF9zYl9pbmZvICpzYmkgPSBtaW5peF9zYihzYik7CisKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJc2JpLT5zX21zLT5zX3N0YXRlID0gc2JpLT5zX21vdW50X3N0YXRlOworCQltYXJrX2J1ZmZlcl9kaXJ0eShzYmktPnNfc2JoKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IHNiaS0+c19pbWFwX2Jsb2NrczsgaSsrKQorCQlicmVsc2Uoc2JpLT5zX2ltYXBbaV0pOworCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfem1hcF9ibG9ja3M7IGkrKykKKwkJYnJlbHNlKHNiaS0+c196bWFwW2ldKTsKKwlicmVsc2UgKHNiaS0+c19zYmgpOworCWtmcmVlKHNiaS0+c19pbWFwKTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlrZnJlZShzYmkpOworCisJcmV0dXJuOworfQorCitzdGF0aWMga21lbV9jYWNoZV90ICogbWluaXhfaW5vZGVfY2FjaGVwOworCitzdGF0aWMgc3RydWN0IGlub2RlICptaW5peF9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBtaW5peF9pbm9kZV9pbmZvICplaTsKKwllaSA9IChzdHJ1Y3QgbWluaXhfaW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2MobWluaXhfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBtaW5peF9kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJa21lbV9jYWNoZV9mcmVlKG1pbml4X2lub2RlX2NhY2hlcCwgbWluaXhfaShpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBtaW5peF9pbm9kZV9pbmZvICplaSA9IChzdHJ1Y3QgbWluaXhfaW5vZGVfaW5mbyAqKSBmb287CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKQorCQlpbm9kZV9pbml0X29uY2UoJmVpLT52ZnNfaW5vZGUpOworfQorIAorc3RhdGljIGludCBpbml0X2lub2RlY2FjaGUodm9pZCkKK3sKKwltaW5peF9pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibWluaXhfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgbWluaXhfaW5vZGVfaW5mbyksCisJCQkJCSAgICAgMCwgU0xBQl9SRUNMQUlNX0FDQ09VTlQsCisJCQkJCSAgICAgaW5pdF9vbmNlLCBOVUxMKTsKKwlpZiAobWluaXhfaW5vZGVfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKK3sKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KG1pbml4X2lub2RlX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX0lORk8gIm1pbml4X2lub2RlX2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBtaW5peF9zb3BzID0geworCS5hbGxvY19pbm9kZQk9IG1pbml4X2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gbWluaXhfZGVzdHJveV9pbm9kZSwKKwkucmVhZF9pbm9kZQk9IG1pbml4X3JlYWRfaW5vZGUsCisJLndyaXRlX2lub2RlCT0gbWluaXhfd3JpdGVfaW5vZGUsCisJLmRlbGV0ZV9pbm9kZQk9IG1pbml4X2RlbGV0ZV9pbm9kZSwKKwkucHV0X3N1cGVyCT0gbWluaXhfcHV0X3N1cGVyLAorCS5zdGF0ZnMJCT0gbWluaXhfc3RhdGZzLAorCS5yZW1vdW50X2ZzCT0gbWluaXhfcmVtb3VudCwKK307CisKK3N0YXRpYyBpbnQgbWluaXhfcmVtb3VudCAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGludCAqIGZsYWdzLCBjaGFyICogZGF0YSkKK3sKKwlzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqIHNiaSA9IG1pbml4X3NiKHNiKTsKKwlzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2sgKiBtczsKKworCW1zID0gc2JpLT5zX21zOworCWlmICgoKmZsYWdzICYgTVNfUkRPTkxZKSA9PSAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQorCQlyZXR1cm4gMDsKKwlpZiAoKmZsYWdzICYgTVNfUkRPTkxZKSB7CisJCWlmIChtcy0+c19zdGF0ZSAmIE1JTklYX1ZBTElEX0ZTIHx8CisJCSAgICAhKHNiaS0+c19tb3VudF9zdGF0ZSAmIE1JTklYX1ZBTElEX0ZTKSkKKwkJCXJldHVybiAwOworCQkvKiBNb3VudGluZyBhIHJ3IHBhcnRpdGlvbiByZWFkLW9ubHkuICovCisJCW1zLT5zX3N0YXRlID0gc2JpLT5zX21vdW50X3N0YXRlOworCQltYXJrX2J1ZmZlcl9kaXJ0eShzYmktPnNfc2JoKTsKKwl9IGVsc2UgeworCSAgCS8qIE1vdW50IGEgcGFydGl0aW9uIHdoaWNoIGlzIHJlYWQtb25seSwgcmVhZC13cml0ZS4gKi8KKwkJc2JpLT5zX21vdW50X3N0YXRlID0gbXMtPnNfc3RhdGU7CisJCW1zLT5zX3N0YXRlICY9IH5NSU5JWF9WQUxJRF9GUzsKKwkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX3NiaCk7CisKKwkJaWYgKCEoc2JpLT5zX21vdW50X3N0YXRlICYgTUlOSVhfVkFMSURfRlMpKQorCQkJcHJpbnRrICgiTUlOSVgtZnMgd2FybmluZzogcmVtb3VudGluZyB1bmNoZWNrZWQgZnMsICIKKwkJCQkicnVubmluZyBmc2NrIGlzIHJlY29tbWVuZGVkLlxuIik7CisJCWVsc2UgaWYgKChzYmktPnNfbW91bnRfc3RhdGUgJiBNSU5JWF9FUlJPUl9GUykpCisJCQlwcmludGsgKCJNSU5JWC1mcyB3YXJuaW5nOiByZW1vdW50aW5nIGZzIHdpdGggZXJyb3JzLCAiCisJCQkJInJ1bm5pbmcgZnNjayBpcyByZWNvbW1lbmRlZC5cbiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtaW5peF9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqKm1hcDsKKwlzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2sgKm1zOworCWludCBpLCBibG9jazsKKwlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGU7CisJc3RydWN0IG1pbml4X3NiX2luZm8gKnNiaTsKKworCXNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaW5peF9zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmkpCisJCXJldHVybiAtRU5PTUVNOworCXMtPnNfZnNfaW5mbyA9IHNiaTsKKwltZW1zZXQoc2JpLCAwLCBzaXplb2Yoc3RydWN0IG1pbml4X3NiX2luZm8pKTsKKworCS8qIE4uQi4gVGhlc2Ugc2hvdWxkIGJlIGNvbXBpbGUtdGltZSB0ZXN0cy4KKwkgICBVbmZvcnR1bmF0ZWx5IHRoYXQgaXMgaW1wb3NzaWJsZS4gKi8KKwlpZiAoMzIgIT0gc2l6ZW9mIChzdHJ1Y3QgbWluaXhfaW5vZGUpKQorCQlwYW5pYygiYmFkIFYxIGktbm9kZSBzaXplIik7CisJaWYgKDY0ICE9IHNpemVvZihzdHJ1Y3QgbWluaXgyX2lub2RlKSkKKwkJcGFuaWMoImJhZCBWMiBpLW5vZGUgc2l6ZSIpOworCisJaWYgKCFzYl9zZXRfYmxvY2tzaXplKHMsIEJMT0NLX1NJWkUpKQorCQlnb3RvIG91dF9iYWRfaGJsb2NrOworCisJaWYgKCEoYmggPSBzYl9icmVhZChzLCAxKSkpCisJCWdvdG8gb3V0X2JhZF9zYjsKKworCW1zID0gKHN0cnVjdCBtaW5peF9zdXBlcl9ibG9jayAqKSBiaC0+Yl9kYXRhOworCXNiaS0+c19tcyA9IG1zOworCXNiaS0+c19zYmggPSBiaDsKKwlzYmktPnNfbW91bnRfc3RhdGUgPSBtcy0+c19zdGF0ZTsKKwlzYmktPnNfbmlub2RlcyA9IG1zLT5zX25pbm9kZXM7CisJc2JpLT5zX256b25lcyA9IG1zLT5zX256b25lczsKKwlzYmktPnNfaW1hcF9ibG9ja3MgPSBtcy0+c19pbWFwX2Jsb2NrczsKKwlzYmktPnNfem1hcF9ibG9ja3MgPSBtcy0+c196bWFwX2Jsb2NrczsKKwlzYmktPnNfZmlyc3RkYXRhem9uZSA9IG1zLT5zX2ZpcnN0ZGF0YXpvbmU7CisJc2JpLT5zX2xvZ196b25lX3NpemUgPSBtcy0+c19sb2dfem9uZV9zaXplOworCXNiaS0+c19tYXhfc2l6ZSA9IG1zLT5zX21heF9zaXplOworCXMtPnNfbWFnaWMgPSBtcy0+c19tYWdpYzsKKwlpZiAocy0+c19tYWdpYyA9PSBNSU5JWF9TVVBFUl9NQUdJQykgeworCQlzYmktPnNfdmVyc2lvbiA9IE1JTklYX1YxOworCQlzYmktPnNfZGlyc2l6ZSA9IDE2OworCQlzYmktPnNfbmFtZWxlbiA9IDE0OworCQlzYmktPnNfbGlua19tYXggPSBNSU5JWF9MSU5LX01BWDsKKwl9IGVsc2UgaWYgKHMtPnNfbWFnaWMgPT0gTUlOSVhfU1VQRVJfTUFHSUMyKSB7CisJCXNiaS0+c192ZXJzaW9uID0gTUlOSVhfVjE7CisJCXNiaS0+c19kaXJzaXplID0gMzI7CisJCXNiaS0+c19uYW1lbGVuID0gMzA7CisJCXNiaS0+c19saW5rX21heCA9IE1JTklYX0xJTktfTUFYOworCX0gZWxzZSBpZiAocy0+c19tYWdpYyA9PSBNSU5JWDJfU1VQRVJfTUFHSUMpIHsKKwkJc2JpLT5zX3ZlcnNpb24gPSBNSU5JWF9WMjsKKwkJc2JpLT5zX256b25lcyA9IG1zLT5zX3pvbmVzOworCQlzYmktPnNfZGlyc2l6ZSA9IDE2OworCQlzYmktPnNfbmFtZWxlbiA9IDE0OworCQlzYmktPnNfbGlua19tYXggPSBNSU5JWDJfTElOS19NQVg7CisJfSBlbHNlIGlmIChzLT5zX21hZ2ljID09IE1JTklYMl9TVVBFUl9NQUdJQzIpIHsKKwkJc2JpLT5zX3ZlcnNpb24gPSBNSU5JWF9WMjsKKwkJc2JpLT5zX256b25lcyA9IG1zLT5zX3pvbmVzOworCQlzYmktPnNfZGlyc2l6ZSA9IDMyOworCQlzYmktPnNfbmFtZWxlbiA9IDMwOworCQlzYmktPnNfbGlua19tYXggPSBNSU5JWDJfTElOS19NQVg7CisJfSBlbHNlCisJCWdvdG8gb3V0X25vX2ZzOworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgYnVmZmVyIG1hcCB0byBrZWVwIHRoZSBzdXBlcmJsb2NrIHNtYWxsLgorCSAqLworCWkgPSAoc2JpLT5zX2ltYXBfYmxvY2tzICsgc2JpLT5zX3ptYXBfYmxvY2tzKSAqIHNpemVvZihiaCk7CisJbWFwID0ga21hbGxvYyhpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1hcCkKKwkJZ290byBvdXRfbm9fbWFwOworCW1lbXNldChtYXAsIDAsIGkpOworCXNiaS0+c19pbWFwID0gJm1hcFswXTsKKwlzYmktPnNfem1hcCA9ICZtYXBbc2JpLT5zX2ltYXBfYmxvY2tzXTsKKworCWJsb2NrPTI7CisJZm9yIChpPTAgOyBpIDwgc2JpLT5zX2ltYXBfYmxvY2tzIDsgaSsrKSB7CisJCWlmICghKHNiaS0+c19pbWFwW2ldPXNiX2JyZWFkKHMsIGJsb2NrKSkpCisJCQlnb3RvIG91dF9ub19iaXRtYXA7CisJCWJsb2NrKys7CisJfQorCWZvciAoaT0wIDsgaSA8IHNiaS0+c196bWFwX2Jsb2NrcyA7IGkrKykgeworCQlpZiAoIShzYmktPnNfem1hcFtpXT1zYl9icmVhZChzLCBibG9jaykpKQorCQkJZ290byBvdXRfbm9fYml0bWFwOworCQlibG9jaysrOworCX0KKworCW1pbml4X3NldF9iaXQoMCxzYmktPnNfaW1hcFswXS0+Yl9kYXRhKTsKKwltaW5peF9zZXRfYml0KDAsc2JpLT5zX3ptYXBbMF0tPmJfZGF0YSk7CisKKwkvKiBzZXQgdXAgZW5vdWdoIHNvIHRoYXQgaXQgY2FuIHJlYWQgYW4gaW5vZGUgKi8KKwlzLT5zX29wID0gJm1pbml4X3NvcHM7CisJcm9vdF9pbm9kZSA9IGlnZXQocywgTUlOSVhfUk9PVF9JTk8pOworCWlmICghcm9vdF9pbm9kZSB8fCBpc19iYWRfaW5vZGUocm9vdF9pbm9kZSkpCisJCWdvdG8gb3V0X25vX3Jvb3Q7CisKKwlzLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdF9pbm9kZSk7CisJaWYgKCFzLT5zX3Jvb3QpCisJCWdvdG8gb3V0X2lwdXQ7CisKKwlpZiAoIU5PX1RSVU5DQVRFKQorCQlzLT5zX3Jvb3QtPmRfb3AgPSAmbWluaXhfZGVudHJ5X29wZXJhdGlvbnM7CisKKwlpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQltcy0+c19zdGF0ZSAmPSB+TUlOSVhfVkFMSURfRlM7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwl9CisJaWYgKCEoc2JpLT5zX21vdW50X3N0YXRlICYgTUlOSVhfVkFMSURfRlMpKQorCQlwcmludGsgKCJNSU5JWC1mczogbW91bnRpbmcgdW5jaGVja2VkIGZpbGUgc3lzdGVtLCAiCisJCQkicnVubmluZyBmc2NrIGlzIHJlY29tbWVuZGVkLlxuIik7CisgCWVsc2UgaWYgKHNiaS0+c19tb3VudF9zdGF0ZSAmIE1JTklYX0VSUk9SX0ZTKQorCQlwcmludGsgKCJNSU5JWC1mczogbW91bnRpbmcgZmlsZSBzeXN0ZW0gd2l0aCBlcnJvcnMsICIKKwkJCSJydW5uaW5nIGZzY2sgaXMgcmVjb21tZW5kZWQuXG4iKTsKKwlyZXR1cm4gMDsKKworb3V0X2lwdXQ6CisJaXB1dChyb290X2lub2RlKTsKKwlnb3RvIG91dF9mcmVlbWFwOworCitvdXRfbm9fcm9vdDoKKwlpZiAoIXNpbGVudCkKKwkJcHJpbnRrKCJNSU5JWC1mczogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKKwlnb3RvIG91dF9mcmVlbWFwOworCitvdXRfbm9fYml0bWFwOgorCXByaW50aygiTUlOSVgtZnM6IGJhZCBzdXBlcmJsb2NrIG9yIHVuYWJsZSB0byByZWFkIGJpdG1hcHNcbiIpOworICAgIG91dF9mcmVlbWFwOgorCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfaW1hcF9ibG9ja3M7IGkrKykKKwkJYnJlbHNlKHNiaS0+c19pbWFwW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2JpLT5zX3ptYXBfYmxvY2tzOyBpKyspCisJCWJyZWxzZShzYmktPnNfem1hcFtpXSk7CisJa2ZyZWUoc2JpLT5zX2ltYXApOworCWdvdG8gb3V0X3JlbGVhc2U7CisKK291dF9ub19tYXA6CisJaWYgKCFzaWxlbnQpCisJCXByaW50ayAoIk1JTklYLWZzOiBjYW4ndCBhbGxvY2F0ZSBtYXBcbiIpOworCWdvdG8gb3V0X3JlbGVhc2U7CisKK291dF9ub19mczoKKwlpZiAoIXNpbGVudCkKKwkJcHJpbnRrKCJWRlM6IENhbid0IGZpbmQgYSBNaW5peCBvciBNaW5peCBWMiBmaWxlc3lzdGVtIG9uIGRldmljZSAiCisJCSAgICAgICAiJXMuXG4iLCBzLT5zX2lkKTsKKyAgICBvdXRfcmVsZWFzZToKKwlicmVsc2UoYmgpOworCWdvdG8gb3V0OworCitvdXRfYmFkX2hibG9jazoKKwlwcmludGsoIk1JTklYLWZzOiBibG9ja3NpemUgdG9vIHNtYWxsIGZvciBkZXZpY2UuXG4iKTsKKwlnb3RvIG91dDsKKworb3V0X2JhZF9zYjoKKwlwcmludGsoIk1JTklYLWZzOiB1bmFibGUgdG8gcmVhZCBzdXBlcmJsb2NrXG4iKTsKKyBvdXQ6CisJcy0+c19mc19pbmZvID0gTlVMTDsKKwlrZnJlZShzYmkpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IG1pbml4X3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCXN0cnVjdCBtaW5peF9zYl9pbmZvICpzYmkgPSBtaW5peF9zYihzYik7CisJYnVmLT5mX3R5cGUgPSBzYi0+c19tYWdpYzsKKwlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CisJYnVmLT5mX2Jsb2NrcyA9IChzYmktPnNfbnpvbmVzIC0gc2JpLT5zX2ZpcnN0ZGF0YXpvbmUpIDw8IHNiaS0+c19sb2dfem9uZV9zaXplOworCWJ1Zi0+Zl9iZnJlZSA9IG1pbml4X2NvdW50X2ZyZWVfYmxvY2tzKHNiaSk7CisJYnVmLT5mX2JhdmFpbCA9IGJ1Zi0+Zl9iZnJlZTsKKwlidWYtPmZfZmlsZXMgPSBzYmktPnNfbmlub2RlczsKKwlidWYtPmZfZmZyZWUgPSBtaW5peF9jb3VudF9mcmVlX2lub2RlcyhzYmkpOworCWJ1Zi0+Zl9uYW1lbGVuID0gc2JpLT5zX25hbWVsZW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWluaXhfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGJsb2NrLAorCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJaWYgKElOT0RFX1ZFUlNJT04oaW5vZGUpID09IE1JTklYX1YxKQorCQlyZXR1cm4gVjFfbWluaXhfZ2V0X2Jsb2NrKGlub2RlLCBibG9jaywgYmhfcmVzdWx0LCBjcmVhdGUpOworCWVsc2UKKwkJcmV0dXJuIFYyX21pbml4X2dldF9ibG9jayhpbm9kZSwgYmxvY2ssIGJoX3Jlc3VsdCwgY3JlYXRlKTsKK30KKworc3RhdGljIGludCBtaW5peF93cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXJldHVybiBibG9ja193cml0ZV9mdWxsX3BhZ2UocGFnZSwgbWluaXhfZ2V0X2Jsb2NrLCB3YmMpOworfQorc3RhdGljIGludCBtaW5peF9yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlKHBhZ2UsbWluaXhfZ2V0X2Jsb2NrKTsKK30KK3N0YXRpYyBpbnQgbWluaXhfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXJldHVybiBibG9ja19wcmVwYXJlX3dyaXRlKHBhZ2UsZnJvbSx0byxtaW5peF9nZXRfYmxvY2spOworfQorc3RhdGljIHNlY3Rvcl90IG1pbml4X2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGJsb2NrKQoreworCXJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAobWFwcGluZyxibG9jayxtaW5peF9nZXRfYmxvY2spOworfQorc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgbWluaXhfYW9wcyA9IHsKKwkucmVhZHBhZ2UgPSBtaW5peF9yZWFkcGFnZSwKKwkud3JpdGVwYWdlID0gbWluaXhfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UgPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUgPSBtaW5peF9wcmVwYXJlX3dyaXRlLAorCS5jb21taXRfd3JpdGUgPSBnZW5lcmljX2NvbW1pdF93cml0ZSwKKwkuYm1hcCA9IG1pbml4X2JtYXAKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBtaW5peF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBwYWdlX2ZvbGxvd19saW5rX2xpZ2h0LAorCS5wdXRfbGluawk9IHBhZ2VfcHV0X2xpbmssCisJLmdldGF0dHIJPSBtaW5peF9nZXRhdHRyLAorfTsKKwordm9pZCBtaW5peF9zZXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgZGV2X3QgcmRldikKK3sKKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZtaW5peF9maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZtaW5peF9maWxlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJm1pbml4X2FvcHM7CisJfSBlbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJm1pbml4X2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmbWluaXhfZGlyX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJm1pbml4X2FvcHM7CisJfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJm1pbml4X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmbWluaXhfYW9wczsKKwl9IGVsc2UKKwkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCByZGV2KTsKK30KKworLyoKKyAqIFRoZSBtaW5peCBWMSBmdW5jdGlvbiB0byByZWFkIGFuIGlub2RlLgorICovCitzdGF0aWMgdm9pZCBWMV9taW5peF9yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBtaW5peF9pbm9kZSAqIHJhd19pbm9kZTsKKwlzdHJ1Y3QgbWluaXhfaW5vZGVfaW5mbyAqbWluaXhfaW5vZGUgPSBtaW5peF9pKGlub2RlKTsKKwlpbnQgaTsKKworCXJhd19pbm9kZSA9IG1pbml4X1YxX3Jhd19pbm9kZShpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAmYmgpOworCWlmICghcmF3X2lub2RlKSB7CisJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJcmV0dXJuOworCX0KKwlpbm9kZS0+aV9tb2RlID0gcmF3X2lub2RlLT5pX21vZGU7CisJaW5vZGUtPmlfdWlkID0gKHVpZF90KXJhd19pbm9kZS0+aV91aWQ7CisJaW5vZGUtPmlfZ2lkID0gKGdpZF90KXJhd19pbm9kZS0+aV9naWQ7CisJaW5vZGUtPmlfbmxpbmsgPSByYXdfaW5vZGUtPmlfbmxpbmtzOworCWlub2RlLT5pX3NpemUgPSByYXdfaW5vZGUtPmlfc2l6ZTsKKwlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBpbm9kZS0+aV9jdGltZS50dl9zZWMgPSByYXdfaW5vZGUtPmlfdGltZTsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9ibG9ja3MgPSBpbm9kZS0+aV9ibGtzaXplID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorCQltaW5peF9pbm9kZS0+dS5pMV9kYXRhW2ldID0gcmF3X2lub2RlLT5pX3pvbmVbaV07CisJbWluaXhfc2V0X2lub2RlKGlub2RlLCBvbGRfZGVjb2RlX2RldihyYXdfaW5vZGUtPmlfem9uZVswXSkpOworCWJyZWxzZShiaCk7Cit9CisKKy8qCisgKiBUaGUgbWluaXggVjIgZnVuY3Rpb24gdG8gcmVhZCBhbiBpbm9kZS4KKyAqLworc3RhdGljIHZvaWQgVjJfbWluaXhfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgbWluaXgyX2lub2RlICogcmF3X2lub2RlOworCXN0cnVjdCBtaW5peF9pbm9kZV9pbmZvICptaW5peF9pbm9kZSA9IG1pbml4X2koaW5vZGUpOworCWludCBpOworCisJcmF3X2lub2RlID0gbWluaXhfVjJfcmF3X2lub2RlKGlub2RlLT5pX3NiLCBpbm9kZS0+aV9pbm8sICZiaCk7CisJaWYgKCFyYXdfaW5vZGUpIHsKKwkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQlyZXR1cm47CisJfQorCWlub2RlLT5pX21vZGUgPSByYXdfaW5vZGUtPmlfbW9kZTsKKwlpbm9kZS0+aV91aWQgPSAodWlkX3QpcmF3X2lub2RlLT5pX3VpZDsKKwlpbm9kZS0+aV9naWQgPSAoZ2lkX3QpcmF3X2lub2RlLT5pX2dpZDsKKwlpbm9kZS0+aV9ubGluayA9IHJhd19pbm9kZS0+aV9ubGlua3M7CisJaW5vZGUtPmlfc2l6ZSA9IHJhd19pbm9kZS0+aV9zaXplOworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IHJhd19pbm9kZS0+aV9tdGltZTsKKwlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSByYXdfaW5vZGUtPmlfYXRpbWU7CisJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gcmF3X2lub2RlLT5pX2N0aW1lOworCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSAwOworCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAwOworCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOworCWlub2RlLT5pX2Jsb2NrcyA9IGlub2RlLT5pX2Jsa3NpemUgPSAwOworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorCQltaW5peF9pbm9kZS0+dS5pMl9kYXRhW2ldID0gcmF3X2lub2RlLT5pX3pvbmVbaV07CisJbWluaXhfc2V0X2lub2RlKGlub2RlLCBvbGRfZGVjb2RlX2RldihyYXdfaW5vZGUtPmlfem9uZVswXSkpOworCWJyZWxzZShiaCk7Cit9CisKKy8qCisgKiBUaGUgZ2xvYmFsIGZ1bmN0aW9uIHRvIHJlYWQgYW4gaW5vZGUuCisgKi8KK3N0YXRpYyB2b2lkIG1pbml4X3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJaWYgKElOT0RFX1ZFUlNJT04oaW5vZGUpID09IE1JTklYX1YxKQorCQlWMV9taW5peF9yZWFkX2lub2RlKGlub2RlKTsKKwllbHNlCisJCVYyX21pbml4X3JlYWRfaW5vZGUoaW5vZGUpOworfQorCisvKgorICogVGhlIG1pbml4IFYxIGZ1bmN0aW9uIHRvIHN5bmNocm9uaXplIGFuIGlub2RlLgorICovCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICogVjFfbWluaXhfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBtaW5peF9pbm9kZSAqIHJhd19pbm9kZTsKKwlzdHJ1Y3QgbWluaXhfaW5vZGVfaW5mbyAqbWluaXhfaW5vZGUgPSBtaW5peF9pKGlub2RlKTsKKwlpbnQgaTsKKworCXJhd19pbm9kZSA9IG1pbml4X1YxX3Jhd19pbm9kZShpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAmYmgpOworCWlmICghcmF3X2lub2RlKQorCQlyZXR1cm4gTlVMTDsKKwlyYXdfaW5vZGUtPmlfbW9kZSA9IGlub2RlLT5pX21vZGU7CisJcmF3X2lub2RlLT5pX3VpZCA9IGZzX2hpZ2gybG93dWlkKGlub2RlLT5pX3VpZCk7CisJcmF3X2lub2RlLT5pX2dpZCA9IGZzX2hpZ2gybG93Z2lkKGlub2RlLT5pX2dpZCk7CisJcmF3X2lub2RlLT5pX25saW5rcyA9IGlub2RlLT5pX25saW5rOworCXJhd19pbm9kZS0+aV9zaXplID0gaW5vZGUtPmlfc2l6ZTsKKwlyYXdfaW5vZGUtPmlfdGltZSA9IGlub2RlLT5pX210aW1lLnR2X3NlYzsKKwlpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpKQorCQlyYXdfaW5vZGUtPmlfem9uZVswXSA9IG9sZF9lbmNvZGVfZGV2KGlub2RlLT5pX3JkZXYpOworCWVsc2UgZm9yIChpID0gMDsgaSA8IDk7IGkrKykKKwkJcmF3X2lub2RlLT5pX3pvbmVbaV0gPSBtaW5peF9pbm9kZS0+dS5pMV9kYXRhW2ldOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlyZXR1cm4gYmg7Cit9CisKKy8qCisgKiBUaGUgbWluaXggVjIgZnVuY3Rpb24gdG8gc3luY2hyb25pemUgYW4gaW5vZGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBWMl9taW5peF91cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IG1pbml4Ml9pbm9kZSAqIHJhd19pbm9kZTsKKwlzdHJ1Y3QgbWluaXhfaW5vZGVfaW5mbyAqbWluaXhfaW5vZGUgPSBtaW5peF9pKGlub2RlKTsKKwlpbnQgaTsKKworCXJhd19pbm9kZSA9IG1pbml4X1YyX3Jhd19pbm9kZShpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAmYmgpOworCWlmICghcmF3X2lub2RlKQorCQlyZXR1cm4gTlVMTDsKKwlyYXdfaW5vZGUtPmlfbW9kZSA9IGlub2RlLT5pX21vZGU7CisJcmF3X2lub2RlLT5pX3VpZCA9IGZzX2hpZ2gybG93dWlkKGlub2RlLT5pX3VpZCk7CisJcmF3X2lub2RlLT5pX2dpZCA9IGZzX2hpZ2gybG93Z2lkKGlub2RlLT5pX2dpZCk7CisJcmF3X2lub2RlLT5pX25saW5rcyA9IGlub2RlLT5pX25saW5rOworCXJhd19pbm9kZS0+aV9zaXplID0gaW5vZGUtPmlfc2l6ZTsKKwlyYXdfaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9tdGltZS50dl9zZWM7CisJcmF3X2lub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfYXRpbWUudHZfc2VjOworCXJhd19pbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX2N0aW1lLnR2X3NlYzsKKwlpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpKQorCQlyYXdfaW5vZGUtPmlfem9uZVswXSA9IG9sZF9lbmNvZGVfZGV2KGlub2RlLT5pX3JkZXYpOworCWVsc2UgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCisJCXJhd19pbm9kZS0+aV96b25lW2ldID0gbWluaXhfaW5vZGUtPnUuaTJfZGF0YVtpXTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJcmV0dXJuIGJoOworfQorCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICptaW5peF91cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoSU5PREVfVkVSU0lPTihpbm9kZSkgPT0gTUlOSVhfVjEpCisJCXJldHVybiBWMV9taW5peF91cGRhdGVfaW5vZGUoaW5vZGUpOworCWVsc2UKKwkJcmV0dXJuIFYyX21pbml4X3VwZGF0ZV9pbm9kZShpbm9kZSk7Cit9CisKK3N0YXRpYyBpbnQgbWluaXhfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUsIGludCB3YWl0KQoreworCWJyZWxzZShtaW5peF91cGRhdGVfaW5vZGUoaW5vZGUpKTsKKwlyZXR1cm4gMDsKK30KKworaW50IG1pbml4X3N5bmNfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCWJoID0gbWluaXhfdXBkYXRlX2lub2RlKGlub2RlKTsKKwlpZiAoYmggJiYgYnVmZmVyX2RpcnR5KGJoKSkKKwl7CisJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwkJaWYgKGJ1ZmZlcl9yZXEoYmgpICYmICFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQl7CisJCQlwcmludGsgKCJJTyBlcnJvciBzeW5jaW5nIG1pbml4IGlub2RlIFslczolMDhseF1cbiIsCisJCQkJaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7CisJCQllcnIgPSAtMTsKKwkJfQorCX0KKwllbHNlIGlmICghYmgpCisJCWVyciA9IC0xOworCWJyZWxzZSAoYmgpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBtaW5peF9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdCAqc3RhdCkKK3sKKwlnZW5lcmljX2ZpbGxhdHRyKGRlbnRyeS0+ZF9pbm9kZSwgc3RhdCk7CisJaWYgKElOT0RFX1ZFUlNJT04oZGVudHJ5LT5kX2lub2RlKSA9PSBNSU5JWF9WMSkKKwkJc3RhdC0+YmxvY2tzID0gKEJMT0NLX1NJWkUgLyA1MTIpICogVjFfbWluaXhfYmxvY2tzKHN0YXQtPnNpemUpOworCWVsc2UKKwkJc3RhdC0+YmxvY2tzID0gKEJMT0NLX1NJWkUgLyA1MTIpICogVjJfbWluaXhfYmxvY2tzKHN0YXQtPnNpemUpOworCXN0YXQtPmJsa3NpemUgPSBCTE9DS19TSVpFOworCXJldHVybiAwOworfQorCisvKgorICogVGhlIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGZvciBmaWxlIHRydW5jYXRpb24uCisgKi8KK3ZvaWQgbWluaXhfdHJ1bmNhdGUoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJaWYgKCEoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpKQorCQlyZXR1cm47CisJaWYgKElOT0RFX1ZFUlNJT04oaW5vZGUpID09IE1JTklYX1YxKQorCQlWMV9taW5peF90cnVuY2F0ZShpbm9kZSk7CisJZWxzZQorCQlWMl9taW5peF90cnVuY2F0ZShpbm9kZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKm1pbml4X2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIG1pbml4X2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgbWluaXhfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIm1pbml4IiwKKwkuZ2V0X3NiCQk9IG1pbml4X2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9taW5peF9mcyh2b2lkKQoreworCWludCBlcnIgPSBpbml0X2lub2RlY2FjaGUoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmbWluaXhfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJcmV0dXJuIDA7CitvdXQ6CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CitvdXQxOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X21pbml4X2ZzKHZvaWQpCit7CisgICAgICAgIHVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmbWluaXhfZnNfdHlwZSk7CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbWluaXhfZnMpCittb2R1bGVfZXhpdChleGl0X21pbml4X2ZzKQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9mcy9taW5peC9pdHJlZV9jb21tb24uYyBiL2ZzL21pbml4L2l0cmVlX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOWJhZjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9taW5peC9pdHJlZV9jb21tb24uYwpAQCAtMCwwICsxLDM2MiBAQAorLyogR2VuZXJpYyBwYXJ0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlibG9ja190CSpwOworCWJsb2NrX3QJa2V5OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7Cit9IEluZGlyZWN0OworCitzdGF0aWMgREVGSU5FX1JXTE9DSyhwb2ludGVyc19sb2NrKTsKKworc3RhdGljIGlubGluZSB2b2lkIGFkZF9jaGFpbihJbmRpcmVjdCAqcCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgYmxvY2tfdCAqdikKK3sKKwlwLT5rZXkgPSAqKHAtPnAgPSB2KTsKKwlwLT5iaCA9IGJoOworfQorCitzdGF0aWMgaW5saW5lIGludCB2ZXJpZnlfY2hhaW4oSW5kaXJlY3QgKmZyb20sIEluZGlyZWN0ICp0bykKK3sKKwl3aGlsZSAoZnJvbSA8PSB0byAmJiBmcm9tLT5rZXkgPT0gKmZyb20tPnApCisJCWZyb20rKzsKKwlyZXR1cm4gKGZyb20gPiB0byk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYmxvY2tfdCAqYmxvY2tfZW5kKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJcmV0dXJuIChibG9ja190ICopKChjaGFyKiliaC0+Yl9kYXRhICsgQkxPQ0tfU0laRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgSW5kaXJlY3QgKmdldF9icmFuY2goc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJaW50IGRlcHRoLAorCQkJCQlpbnQgKm9mZnNldHMsCisJCQkJCUluZGlyZWN0IGNoYWluW0RFUFRIXSwKKwkJCQkJaW50ICplcnIpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCUluZGlyZWN0ICpwID0gY2hhaW47CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCSplcnIgPSAwOworCS8qIGlfZGF0YSBpcyBub3QgZ29pbmcgYXdheSwgbm8gbG9jayBuZWVkZWQgKi8KKwlhZGRfY2hhaW4gKGNoYWluLCBOVUxMLCBpX2RhdGEoaW5vZGUpICsgKm9mZnNldHMpOworCWlmICghcC0+a2V5KQorCQlnb3RvIG5vX2Jsb2NrOworCXdoaWxlICgtLWRlcHRoKSB7CisJCWJoID0gc2JfYnJlYWQoc2IsIGJsb2NrX3RvX2NwdShwLT5rZXkpKTsKKwkJaWYgKCFiaCkKKwkJCWdvdG8gZmFpbHVyZTsKKwkJcmVhZF9sb2NrKCZwb2ludGVyc19sb2NrKTsKKwkJaWYgKCF2ZXJpZnlfY2hhaW4oY2hhaW4sIHApKQorCQkJZ290byBjaGFuZ2VkOworCQlhZGRfY2hhaW4oKytwLCBiaCwgKGJsb2NrX3QgKiliaC0+Yl9kYXRhICsgKisrb2Zmc2V0cyk7CisJCXJlYWRfdW5sb2NrKCZwb2ludGVyc19sb2NrKTsKKwkJaWYgKCFwLT5rZXkpCisJCQlnb3RvIG5vX2Jsb2NrOworCX0KKwlyZXR1cm4gTlVMTDsKKworY2hhbmdlZDoKKwlyZWFkX3VubG9jaygmcG9pbnRlcnNfbG9jayk7CisJYnJlbHNlKGJoKTsKKwkqZXJyID0gLUVBR0FJTjsKKwlnb3RvIG5vX2Jsb2NrOworZmFpbHVyZToKKwkqZXJyID0gLUVJTzsKK25vX2Jsb2NrOgorCXJldHVybiBwOworfQorCitzdGF0aWMgaW50IGFsbG9jX2JyYW5jaChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICBpbnQgbnVtLAorCQkJICAgICBpbnQgKm9mZnNldHMsCisJCQkgICAgIEluZGlyZWN0ICpicmFuY2gpCit7CisJaW50IG4gPSAwOworCWludCBpOworCWludCBwYXJlbnQgPSBtaW5peF9uZXdfYmxvY2soaW5vZGUpOworCisJYnJhbmNoWzBdLmtleSA9IGNwdV90b19ibG9jayhwYXJlbnQpOworCWlmIChwYXJlbnQpIGZvciAobiA9IDE7IG4gPCBudW07IG4rKykgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQkvKiBBbGxvY2F0ZSB0aGUgbmV4dCBibG9jayAqLworCQlpbnQgbnIgPSBtaW5peF9uZXdfYmxvY2soaW5vZGUpOworCQlpZiAoIW5yKQorCQkJYnJlYWs7CisJCWJyYW5jaFtuXS5rZXkgPSBjcHVfdG9fYmxvY2sobnIpOworCQliaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgcGFyZW50KTsKKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1zZXQoYmgtPmJfZGF0YSwgMCwgQkxPQ0tfU0laRSk7CisJCWJyYW5jaFtuXS5iaCA9IGJoOworCQlicmFuY2hbbl0ucCA9IChibG9ja190KikgYmgtPmJfZGF0YSArIG9mZnNldHNbbl07CisJCSpicmFuY2hbbl0ucCA9IGJyYW5jaFtuXS5rZXk7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJbWFya19idWZmZXJfZGlydHlfaW5vZGUoYmgsIGlub2RlKTsKKwkJcGFyZW50ID0gbnI7CisJfQorCWlmIChuID09IG51bSkKKwkJcmV0dXJuIDA7CisKKwkvKiBBbGxvY2F0aW9uIGZhaWxlZCwgZnJlZSB3aGF0IHdlIGFscmVhZHkgYWxsb2NhdGVkICovCisJZm9yIChpID0gMTsgaSA8IG47IGkrKykKKwkJYmZvcmdldChicmFuY2hbaV0uYmgpOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCW1pbml4X2ZyZWVfYmxvY2soaW5vZGUsIGJsb2NrX3RvX2NwdShicmFuY2hbaV0ua2V5KSk7CisJcmV0dXJuIC1FTk9TUEM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNwbGljZV9icmFuY2goc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgIEluZGlyZWN0IGNoYWluW0RFUFRIXSwKKwkJCQkgICAgIEluZGlyZWN0ICp3aGVyZSwKKwkJCQkgICAgIGludCBudW0pCit7CisJaW50IGk7CisKKwl3cml0ZV9sb2NrKCZwb2ludGVyc19sb2NrKTsKKworCS8qIFZlcmlmeSB0aGF0IHBsYWNlIHdlIGFyZSBzcGxpY2luZyB0byBpcyBzdGlsbCB0aGVyZSBhbmQgdmFjYW50ICovCisJaWYgKCF2ZXJpZnlfY2hhaW4oY2hhaW4sIHdoZXJlLTEpIHx8ICp3aGVyZS0+cCkKKwkJZ290byBjaGFuZ2VkOworCisJKndoZXJlLT5wID0gd2hlcmUtPmtleTsKKworCXdyaXRlX3VubG9jaygmcG9pbnRlcnNfbG9jayk7CisKKwkvKiBXZSBhcmUgZG9uZSB3aXRoIGF0b21pYyBzdHVmZiwgbm93IGRvIHRoZSByZXN0IG9mIGhvdXNla2VlcGluZyAqLworCisJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCisJLyogaGFkIHdlIHNwbGljZWQgaXQgb250byBpbmRpcmVjdCBibG9jaz8gKi8KKwlpZiAod2hlcmUtPmJoKQorCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZSh3aGVyZS0+YmgsIGlub2RlKTsKKworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXJldHVybiAwOworCitjaGFuZ2VkOgorCXdyaXRlX3VubG9jaygmcG9pbnRlcnNfbG9jayk7CisJZm9yIChpID0gMTsgaSA8IG51bTsgaSsrKQorCQliZm9yZ2V0KHdoZXJlW2ldLmJoKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJCW1pbml4X2ZyZWVfYmxvY2soaW5vZGUsIGJsb2NrX3RvX2NwdSh3aGVyZVtpXS5rZXkpKTsKKwlyZXR1cm4gLUVBR0FJTjsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzZWN0b3JfdCBibG9jaywKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBjcmVhdGUpCit7CisJaW50IGVyciA9IC1FSU87CisJaW50IG9mZnNldHNbREVQVEhdOworCUluZGlyZWN0IGNoYWluW0RFUFRIXTsKKwlJbmRpcmVjdCAqcGFydGlhbDsKKwlpbnQgbGVmdDsKKwlpbnQgZGVwdGggPSBibG9ja190b19wYXRoKGlub2RlLCBibG9jaywgb2Zmc2V0cyk7CisKKwlpZiAoZGVwdGggPT0gMCkKKwkJZ290byBvdXQ7CisKK3JlcmVhZDoKKwlwYXJ0aWFsID0gZ2V0X2JyYW5jaChpbm9kZSwgZGVwdGgsIG9mZnNldHMsIGNoYWluLCAmZXJyKTsKKworCS8qIFNpbXBsZXN0IGNhc2UgLSBibG9jayBmb3VuZCwgbm8gYWxsb2NhdGlvbiBuZWVkZWQgKi8KKwlpZiAoIXBhcnRpYWwpIHsKK2dvdF9pdDoKKwkJbWFwX2JoKGJoLCBpbm9kZS0+aV9zYiwgYmxvY2tfdG9fY3B1KGNoYWluW2RlcHRoLTFdLmtleSkpOworCQkvKiBDbGVhbiB1cCBhbmQgZXhpdCAqLworCQlwYXJ0aWFsID0gY2hhaW4rZGVwdGgtMTsgLyogdGhlIHdob2xlIGNoYWluICovCisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBOZXh0IHNpbXBsZSBjYXNlIC0gcGxhaW4gbG9va3VwIG9yIGZhaWxlZCByZWFkIG9mIGluZGlyZWN0IGJsb2NrICovCisJaWYgKCFjcmVhdGUgfHwgZXJyID09IC1FSU8pIHsKK2NsZWFudXA6CisJCXdoaWxlIChwYXJ0aWFsID4gY2hhaW4pIHsKKwkJCWJyZWxzZShwYXJ0aWFsLT5iaCk7CisJCQlwYXJ0aWFsLS07CisJCX0KK291dDoKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKgorCSAqIEluZGlyZWN0IGJsb2NrIG1pZ2h0IGJlIHJlbW92ZWQgYnkgdHJ1bmNhdGUgd2hpbGUgd2Ugd2VyZQorCSAqIHJlYWRpbmcgaXQuIEhhbmRsaW5nIG9mIHRoYXQgY2FzZSAoZm9yZ2V0IHdoYXQgd2UndmUgZ290IGFuZAorCSAqIHJlcmVhZCkgaXMgdGFrZW4gb3V0IG9mIHRoZSBtYWluIHBhdGguCisJICovCisJaWYgKGVyciA9PSAtRUFHQUlOKQorCQlnb3RvIGNoYW5nZWQ7CisKKwlsZWZ0ID0gKGNoYWluICsgZGVwdGgpIC0gcGFydGlhbDsKKwllcnIgPSBhbGxvY19icmFuY2goaW5vZGUsIGxlZnQsIG9mZnNldHMrKHBhcnRpYWwtY2hhaW4pLCBwYXJ0aWFsKTsKKwlpZiAoZXJyKQorCQlnb3RvIGNsZWFudXA7CisKKwlpZiAoc3BsaWNlX2JyYW5jaChpbm9kZSwgY2hhaW4sIHBhcnRpYWwsIGxlZnQpIDwgMCkKKwkJZ290byBjaGFuZ2VkOworCisJc2V0X2J1ZmZlcl9uZXcoYmgpOworCWdvdG8gZ290X2l0OworCitjaGFuZ2VkOgorCXdoaWxlIChwYXJ0aWFsID4gY2hhaW4pIHsKKwkJYnJlbHNlKHBhcnRpYWwtPmJoKTsKKwkJcGFydGlhbC0tOworCX0KKwlnb3RvIHJlcmVhZDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYWxsX3plcm9lcyhibG9ja190ICpwLCBibG9ja190ICpxKQoreworCXdoaWxlIChwIDwgcSkKKwkJaWYgKCpwKyspCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIEluZGlyZWN0ICpmaW5kX3NoYXJlZChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCWludCBkZXB0aCwKKwkJCQlpbnQgb2Zmc2V0c1tERVBUSF0sCisJCQkJSW5kaXJlY3QgY2hhaW5bREVQVEhdLAorCQkJCWJsb2NrX3QgKnRvcCkKK3sKKwlJbmRpcmVjdCAqcGFydGlhbCwgKnA7CisJaW50IGssIGVycjsKKworCSp0b3AgPSAwOworCWZvciAoayA9IGRlcHRoOyBrID4gMSAmJiAhb2Zmc2V0c1trLTFdOyBrLS0pCisJCTsKKwlwYXJ0aWFsID0gZ2V0X2JyYW5jaChpbm9kZSwgaywgb2Zmc2V0cywgY2hhaW4sICZlcnIpOworCisJd3JpdGVfbG9jaygmcG9pbnRlcnNfbG9jayk7CisJaWYgKCFwYXJ0aWFsKQorCQlwYXJ0aWFsID0gY2hhaW4gKyBrLTE7CisJaWYgKCFwYXJ0aWFsLT5rZXkgJiYgKnBhcnRpYWwtPnApIHsKKwkJd3JpdGVfdW5sb2NrKCZwb2ludGVyc19sb2NrKTsKKwkJZ290byBub190b3A7CisJfQorCWZvciAocD1wYXJ0aWFsO3A+Y2hhaW4gJiYgYWxsX3plcm9lcygoYmxvY2tfdCopcC0+YmgtPmJfZGF0YSxwLT5wKTtwLS0pCisJCTsKKwlpZiAocCA9PSBjaGFpbiArIGsgLSAxICYmIHAgPiBjaGFpbikgeworCQlwLT5wLS07CisJfSBlbHNlIHsKKwkJKnRvcCA9ICpwLT5wOworCQkqcC0+cCA9IDA7CisJfQorCXdyaXRlX3VubG9jaygmcG9pbnRlcnNfbG9jayk7CisKKwl3aGlsZShwYXJ0aWFsID4gcCkKKwl7CisJCWJyZWxzZShwYXJ0aWFsLT5iaCk7CisJCXBhcnRpYWwtLTsKKwl9Citub190b3A6CisJcmV0dXJuIHBhcnRpYWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSwgYmxvY2tfdCAqcCwgYmxvY2tfdCAqcSkKK3sKKwl1bnNpZ25lZCBsb25nIG5yOworCisJZm9yICggOyBwIDwgcSA7IHArKykgeworCQluciA9IGJsb2NrX3RvX2NwdSgqcCk7CisJCWlmIChucikgeworCQkJKnAgPSAwOworCQkJbWluaXhfZnJlZV9ibG9jayhpbm9kZSwgbnIpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBmcmVlX2JyYW5jaGVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGJsb2NrX3QgKnAsIGJsb2NrX3QgKnEsIGludCBkZXB0aCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwl1bnNpZ25lZCBsb25nIG5yOworCisJaWYgKGRlcHRoLS0pIHsKKwkJZm9yICggOyBwIDwgcSA7IHArKykgeworCQkJbnIgPSBibG9ja190b19jcHUoKnApOworCQkJaWYgKCFucikKKwkJCQljb250aW51ZTsKKwkJCSpwID0gMDsKKwkJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIG5yKTsKKwkJCWlmICghYmgpCisJCQkJY29udGludWU7CisJCQlmcmVlX2JyYW5jaGVzKGlub2RlLCAoYmxvY2tfdCopYmgtPmJfZGF0YSwKKwkJCQkgICAgICBibG9ja19lbmQoYmgpLCBkZXB0aCk7CisJCQliZm9yZ2V0KGJoKTsKKwkJCW1pbml4X2ZyZWVfYmxvY2soaW5vZGUsIG5yKTsKKwkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQl9CisJfSBlbHNlCisJCWZyZWVfZGF0YShpbm9kZSwgcCwgcSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cnVuY2F0ZSAoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJYmxvY2tfdCAqaWRhdGEgPSBpX2RhdGEoaW5vZGUpOworCWludCBvZmZzZXRzW0RFUFRIXTsKKwlJbmRpcmVjdCBjaGFpbltERVBUSF07CisJSW5kaXJlY3QgKnBhcnRpYWw7CisJYmxvY2tfdCBuciA9IDA7CisJaW50IG47CisJaW50IGZpcnN0X3dob2xlOworCWxvbmcgaWJsb2NrOworCisJaWJsb2NrID0gKGlub2RlLT5pX3NpemUgKyBCTE9DS19TSVpFLTEpID4+IDEwOworCWJsb2NrX3RydW5jYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5vZGUtPmlfc2l6ZSwgZ2V0X2Jsb2NrKTsKKworCW4gPSBibG9ja190b19wYXRoKGlub2RlLCBpYmxvY2ssIG9mZnNldHMpOworCWlmICghbikKKwkJcmV0dXJuOworCisJaWYgKG4gPT0gMSkgeworCQlmcmVlX2RhdGEoaW5vZGUsIGlkYXRhK29mZnNldHNbMF0sIGlkYXRhICsgRElSRUNUKTsKKwkJZmlyc3Rfd2hvbGUgPSAwOworCQlnb3RvIGRvX2luZGlyZWN0czsKKwl9CisKKwlmaXJzdF93aG9sZSA9IG9mZnNldHNbMF0gKyAxIC0gRElSRUNUOworCXBhcnRpYWwgPSBmaW5kX3NoYXJlZChpbm9kZSwgbiwgb2Zmc2V0cywgY2hhaW4sICZucik7CisJaWYgKG5yKSB7CisJCWlmIChwYXJ0aWFsID09IGNoYWluKQorCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCWVsc2UKKwkJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKHBhcnRpYWwtPmJoLCBpbm9kZSk7CisJCWZyZWVfYnJhbmNoZXMoaW5vZGUsICZuciwgJm5yKzEsIChjaGFpbituLTEpIC0gcGFydGlhbCk7CisJfQorCS8qIENsZWFyIHRoZSBlbmRzIG9mIGluZGlyZWN0IGJsb2NrcyBvbiB0aGUgc2hhcmVkIGJyYW5jaCAqLworCXdoaWxlIChwYXJ0aWFsID4gY2hhaW4pIHsKKwkJZnJlZV9icmFuY2hlcyhpbm9kZSwgcGFydGlhbC0+cCArIDEsIGJsb2NrX2VuZChwYXJ0aWFsLT5iaCksCisJCQkJKGNoYWluK24tMSkgLSBwYXJ0aWFsKTsKKwkJbWFya19idWZmZXJfZGlydHlfaW5vZGUocGFydGlhbC0+YmgsIGlub2RlKTsKKwkJYnJlbHNlIChwYXJ0aWFsLT5iaCk7CisJCXBhcnRpYWwtLTsKKwl9Citkb19pbmRpcmVjdHM6CisJLyogS2lsbCB0aGUgcmVtYWluaW5nICh3aG9sZSkgc3VidHJlZXMgKi8KKwl3aGlsZSAoZmlyc3Rfd2hvbGUgPCBERVBUSC0xKSB7CisJCW5yID0gaWRhdGFbRElSRUNUK2ZpcnN0X3dob2xlXTsKKwkJaWYgKG5yKSB7CisJCQlpZGF0YVtESVJFQ1QrZmlyc3Rfd2hvbGVdID0gMDsKKwkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkJZnJlZV9icmFuY2hlcyhpbm9kZSwgJm5yLCAmbnIrMSwgZmlyc3Rfd2hvbGUrMSk7CisJCX0KKwkJZmlyc3Rfd2hvbGUrKzsKKwl9CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbmJsb2Nrcyhsb2ZmX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBibG9ja3MsIHJlcywgZGlyZWN0ID0gRElSRUNULCBpID0gREVQVEg7CisJYmxvY2tzID0gKHNpemUgKyBCTE9DS19TSVpFIC0gMSkgPj4gQkxPQ0tfU0laRV9CSVRTOworCXJlcyA9IGJsb2NrczsKKwl3aGlsZSAoLS1pICYmIGJsb2NrcyA+IGRpcmVjdCkgeworCQlibG9ja3MgLT0gZGlyZWN0OworCQlibG9ja3MgKz0gQkxPQ0tfU0laRS9zaXplb2YoYmxvY2tfdCkgLSAxOworCQlibG9ja3MgLz0gQkxPQ0tfU0laRS9zaXplb2YoYmxvY2tfdCk7CisJCXJlcyArPSBibG9ja3M7CisJCWRpcmVjdCA9IDE7CisJfQorCXJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9mcy9taW5peC9pdHJlZV92MS5jIGIvZnMvbWluaXgvaXRyZWVfdjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTA2YWVmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbWluaXgvaXRyZWVfdjEuYwpAQCAtMCwwICsxLDYxIEBACisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlICJtaW5peC5oIgorCitlbnVtIHtERVBUSCA9IDMsIERJUkVDVCA9IDd9OwkvKiBPbmx5IGRvdWJsZSBpbmRpcmVjdCAqLworCit0eXBlZGVmIHUxNiBibG9ja190OwkvKiAxNiBiaXQsIGhvc3Qgb3JkZXIgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGJsb2NrX3RvX2NwdShibG9ja190IG4pCit7CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbmxpbmUgYmxvY2tfdCBjcHVfdG9fYmxvY2sodW5zaWduZWQgbG9uZyBuKQoreworCXJldHVybiBuOworfQorCitzdGF0aWMgaW5saW5lIGJsb2NrX3QgKmlfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiAoYmxvY2tfdCAqKW1pbml4X2koaW5vZGUpLT51LmkxX2RhdGE7Cit9CisKK3N0YXRpYyBpbnQgYmxvY2tfdG9fcGF0aChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgbG9uZyBibG9jaywgaW50IG9mZnNldHNbREVQVEhdKQoreworCWludCBuID0gMDsKKworCWlmIChibG9jayA8IDApIHsKKwkJcHJpbnRrKCJtaW5peF9ibWFwOiBibG9jazwwIik7CisJfSBlbHNlIGlmIChibG9jayA+PSAobWluaXhfc2IoaW5vZGUtPmlfc2IpLT5zX21heF9zaXplL0JMT0NLX1NJWkUpKSB7CisJCXByaW50aygibWluaXhfYm1hcDogYmxvY2s+YmlnIik7CisJfSBlbHNlIGlmIChibG9jayA8IDcpIHsKKwkJb2Zmc2V0c1tuKytdID0gYmxvY2s7CisJfSBlbHNlIGlmICgoYmxvY2sgLT0gNykgPCA1MTIpIHsKKwkJb2Zmc2V0c1tuKytdID0gNzsKKwkJb2Zmc2V0c1tuKytdID0gYmxvY2s7CisJfSBlbHNlIHsKKwkJYmxvY2sgLT0gNTEyOworCQlvZmZzZXRzW24rK10gPSA4OworCQlvZmZzZXRzW24rK10gPSBibG9jaz4+OTsKKwkJb2Zmc2V0c1tuKytdID0gYmxvY2sgJiA1MTE7CisJfQorCXJldHVybiBuOworfQorCisjaW5jbHVkZSAiaXRyZWVfY29tbW9uLmMiCisKK2ludCBWMV9taW5peF9nZXRfYmxvY2soc3RydWN0IGlub2RlICogaW5vZGUsIGxvbmcgYmxvY2ssCisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK3sKKwlyZXR1cm4gZ2V0X2Jsb2NrKGlub2RlLCBibG9jaywgYmhfcmVzdWx0LCBjcmVhdGUpOworfQorCit2b2lkIFYxX21pbml4X3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXRydW5jYXRlKGlub2RlKTsKK30KKwordW5zaWduZWQgVjFfbWluaXhfYmxvY2tzKGxvZmZfdCBzaXplKQoreworCXJldHVybiBuYmxvY2tzKHNpemUpOworfQpkaWZmIC0tZ2l0IGEvZnMvbWluaXgvaXRyZWVfdjIuYyBiL2ZzL21pbml4L2l0cmVlX3YyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkYzc2NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL21pbml4L2l0cmVlX3YyLmMKQEAgLTAsMCArMSw2NiBAQAorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSAibWluaXguaCIKKworZW51bSB7RElSRUNUID0gNywgREVQVEggPSA0fTsJLyogSGF2ZSB0cmlwbGUgaW5kaXJlY3QgKi8KKwordHlwZWRlZiB1MzIgYmxvY2tfdDsJLyogMzIgYml0LCBob3N0IG9yZGVyICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBibG9ja190b19jcHUoYmxvY2tfdCBuKQoreworCXJldHVybiBuOworfQorCitzdGF0aWMgaW5saW5lIGJsb2NrX3QgY3B1X3RvX2Jsb2NrKHVuc2lnbmVkIGxvbmcgbikKK3sKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGlubGluZSBibG9ja190ICppX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gKGJsb2NrX3QgKiltaW5peF9pKGlub2RlKS0+dS5pMl9kYXRhOworfQorCitzdGF0aWMgaW50IGJsb2NrX3RvX3BhdGgoc3RydWN0IGlub2RlICogaW5vZGUsIGxvbmcgYmxvY2ssIGludCBvZmZzZXRzW0RFUFRIXSkKK3sKKwlpbnQgbiA9IDA7CisKKwlpZiAoYmxvY2sgPCAwKSB7CisJCXByaW50aygibWluaXhfYm1hcDogYmxvY2s8MCIpOworCX0gZWxzZSBpZiAoYmxvY2sgPj0gKG1pbml4X3NiKGlub2RlLT5pX3NiKS0+c19tYXhfc2l6ZS9CTE9DS19TSVpFKSkgeworCQlwcmludGsoIm1pbml4X2JtYXA6IGJsb2NrPmJpZyIpOworCX0gZWxzZSBpZiAoYmxvY2sgPCA3KSB7CisJCW9mZnNldHNbbisrXSA9IGJsb2NrOworCX0gZWxzZSBpZiAoKGJsb2NrIC09IDcpIDwgMjU2KSB7CisJCW9mZnNldHNbbisrXSA9IDc7CisJCW9mZnNldHNbbisrXSA9IGJsb2NrOworCX0gZWxzZSBpZiAoKGJsb2NrIC09IDI1NikgPCAyNTYqMjU2KSB7CisJCW9mZnNldHNbbisrXSA9IDg7CisJCW9mZnNldHNbbisrXSA9IGJsb2NrPj44OworCQlvZmZzZXRzW24rK10gPSBibG9jayAmIDI1NTsKKwl9IGVsc2UgeworCQlibG9jayAtPSAyNTYqMjU2OworCQlvZmZzZXRzW24rK10gPSA5OworCQlvZmZzZXRzW24rK10gPSBibG9jaz4+MTY7CisJCW9mZnNldHNbbisrXSA9IChibG9jaz4+OCkgJiAyNTU7CisJCW9mZnNldHNbbisrXSA9IGJsb2NrICYgMjU1OworCX0KKwlyZXR1cm4gbjsKK30KKworI2luY2x1ZGUgIml0cmVlX2NvbW1vbi5jIgorCitpbnQgVjJfbWluaXhfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBsb25nIGJsb2NrLAorCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJcmV0dXJuIGdldF9ibG9jayhpbm9kZSwgYmxvY2ssIGJoX3Jlc3VsdCwgY3JlYXRlKTsKK30KKwordm9pZCBWMl9taW5peF90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwl0cnVuY2F0ZShpbm9kZSk7Cit9CisKK3Vuc2lnbmVkIFYyX21pbml4X2Jsb2Nrcyhsb2ZmX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gbmJsb2NrcyhzaXplKTsKK30KZGlmZiAtLWdpdCBhL2ZzL21pbml4L21pbml4LmggYi9mcy9taW5peC9taW5peC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MmE4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9taW5peC9taW5peC5oCkBAIC0wLDAgKzEsOTYgQEAKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9taW5peF9mcy5oPgorCisvKgorICogY2hhbmdlIHRoZSBkZWZpbmUgYmVsb3cgdG8gMCBpZiB5b3Ugd2FudCBuYW1lcyA+IGluZm8tPnNfbmFtZWxlbiBjaGFycyB0byBiZQorICogdHJ1bmNhdGVkLiBFbHNlIHRoZXkgd2lsbCBiZSBkaXNhbGxvd2VkIChFTkFNRVRPT0xPTkcpLgorICovCisjZGVmaW5lIE5PX1RSVU5DQVRFIDEKKworI2RlZmluZSBJTk9ERV9WRVJTSU9OKGlub2RlKQltaW5peF9zYihpbm9kZS0+aV9zYiktPnNfdmVyc2lvbgorCisjZGVmaW5lIE1JTklYX1YxCQkweDAwMDEJCS8qIG9yaWdpbmFsIG1pbml4IGZzICovCisjZGVmaW5lIE1JTklYX1YyCQkweDAwMDIJCS8qIG1pbml4IFYyIGZzICovCisKKy8qCisgKiBtaW5peCBmcyBpbm9kZSBkYXRhIGluIG1lbW9yeQorICovCitzdHJ1Y3QgbWluaXhfaW5vZGVfaW5mbyB7CisJdW5pb24geworCQlfX3UxNiBpMV9kYXRhWzE2XTsKKwkJX191MzIgaTJfZGF0YVsxNl07CisJfSB1OworCXN0cnVjdCBpbm9kZSB2ZnNfaW5vZGU7Cit9OworCisvKgorICogbWluaXggc3VwZXItYmxvY2sgZGF0YSBpbiBtZW1vcnkKKyAqLworc3RydWN0IG1pbml4X3NiX2luZm8geworCXVuc2lnbmVkIGxvbmcgc19uaW5vZGVzOworCXVuc2lnbmVkIGxvbmcgc19uem9uZXM7CisJdW5zaWduZWQgbG9uZyBzX2ltYXBfYmxvY2tzOworCXVuc2lnbmVkIGxvbmcgc196bWFwX2Jsb2NrczsKKwl1bnNpZ25lZCBsb25nIHNfZmlyc3RkYXRhem9uZTsKKwl1bnNpZ25lZCBsb25nIHNfbG9nX3pvbmVfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHNfbWF4X3NpemU7CisJaW50IHNfZGlyc2l6ZTsKKwlpbnQgc19uYW1lbGVuOworCWludCBzX2xpbmtfbWF4OworCXN0cnVjdCBidWZmZXJfaGVhZCAqKiBzX2ltYXA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICoqIHNfem1hcDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzX3NiaDsKKwlzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2sgKiBzX21zOworCXVuc2lnbmVkIHNob3J0IHNfbW91bnRfc3RhdGU7CisJdW5zaWduZWQgc2hvcnQgc192ZXJzaW9uOworfTsKKworZXh0ZXJuIHN0cnVjdCBtaW5peF9pbm9kZSAqIG1pbml4X1YxX3Jhd19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW5vX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqKik7CitleHRlcm4gc3RydWN0IG1pbml4Ml9pbm9kZSAqIG1pbml4X1YyX3Jhd19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW5vX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqKik7CitleHRlcm4gc3RydWN0IGlub2RlICogbWluaXhfbmV3X2lub2RlKGNvbnN0IHN0cnVjdCBpbm9kZSAqIGRpciwgaW50ICogZXJyb3IpOworZXh0ZXJuIHZvaWQgbWluaXhfZnJlZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBtaW5peF9jb3VudF9mcmVlX2lub2RlcyhzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqc2JpKTsKK2V4dGVybiBpbnQgbWluaXhfbmV3X2Jsb2NrKHN0cnVjdCBpbm9kZSAqIGlub2RlKTsKK2V4dGVybiB2b2lkIG1pbml4X2ZyZWVfYmxvY2soc3RydWN0IGlub2RlICogaW5vZGUsIGludCBibG9jayk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBtaW5peF9jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqc2JpKTsKKworZXh0ZXJuIGludCBtaW5peF9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqLCBzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBrc3RhdCAqKTsKKworZXh0ZXJuIHZvaWQgVjJfbWluaXhfdHJ1bmNhdGUoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHZvaWQgVjFfbWluaXhfdHJ1bmNhdGUoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHZvaWQgVjJfbWluaXhfdHJ1bmNhdGUoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHZvaWQgbWluaXhfdHJ1bmNhdGUoc3RydWN0IGlub2RlICopOworZXh0ZXJuIGludCBtaW5peF9zeW5jX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiB2b2lkIG1pbml4X3NldF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgZGV2X3QpOworZXh0ZXJuIGludCBWMV9taW5peF9nZXRfYmxvY2soc3RydWN0IGlub2RlICosIGxvbmcsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOworZXh0ZXJuIGludCBWMl9taW5peF9nZXRfYmxvY2soc3RydWN0IGlub2RlICosIGxvbmcsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOworZXh0ZXJuIHVuc2lnbmVkIFYxX21pbml4X2Jsb2Nrcyhsb2ZmX3QpOworZXh0ZXJuIHVuc2lnbmVkIFYyX21pbml4X2Jsb2Nrcyhsb2ZmX3QpOworCitleHRlcm4gc3RydWN0IG1pbml4X2Rpcl9lbnRyeSAqbWluaXhfZmluZF9lbnRyeShzdHJ1Y3QgZGVudHJ5Kiwgc3RydWN0IHBhZ2UqKik7CitleHRlcm4gaW50IG1pbml4X2FkZF9saW5rKHN0cnVjdCBkZW50cnkqLCBzdHJ1Y3QgaW5vZGUqKTsKK2V4dGVybiBpbnQgbWluaXhfZGVsZXRlX2VudHJ5KHN0cnVjdCBtaW5peF9kaXJfZW50cnkqLCBzdHJ1Y3QgcGFnZSopOworZXh0ZXJuIGludCBtaW5peF9tYWtlX2VtcHR5KHN0cnVjdCBpbm9kZSosIHN0cnVjdCBpbm9kZSopOworZXh0ZXJuIGludCBtaW5peF9lbXB0eV9kaXIoc3RydWN0IGlub2RlKik7CitleHRlcm4gdm9pZCBtaW5peF9zZXRfbGluayhzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5Kiwgc3RydWN0IHBhZ2UqLCBzdHJ1Y3QgaW5vZGUqKTsKK2V4dGVybiBzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5ICptaW5peF9kb3Rkb3Qoc3RydWN0IGlub2RlKiwgc3RydWN0IHBhZ2UqKik7CitleHRlcm4gaW5vX3QgbWluaXhfaW5vZGVfYnlfbmFtZShzdHJ1Y3QgZGVudHJ5Kik7CisKK2V4dGVybiBpbnQgbWluaXhfc3luY19maWxlKHN0cnVjdCBmaWxlICosIHN0cnVjdCBkZW50cnkgKiwgaW50KTsKKworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG1pbml4X2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBtaW5peF9kaXJfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1pbml4X2ZpbGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1pbml4X2Rpcl9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBtaW5peF9kZW50cnlfb3BlcmF0aW9uczsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqbWluaXhfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gc2ItPnNfZnNfaW5mbzsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbWluaXhfaW5vZGVfaW5mbyAqbWluaXhfaShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBsaXN0X2VudHJ5KGlub2RlLCBzdHJ1Y3QgbWluaXhfaW5vZGVfaW5mbywgdmZzX2lub2RlKTsKK30KZGlmZiAtLWdpdCBhL2ZzL21pbml4L25hbWVpLmMgYi9mcy9taW5peC9uYW1laS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNWJjYTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9taW5peC9uYW1laS5jCkBAIC0wLDAgKzEsMzE3IEBACisvKgorICogIGxpbnV4L2ZzL21pbml4L25hbWVpLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKyNpbmNsdWRlICJtaW5peC5oIgorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5jX2NvdW50KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW5vZGUtPmlfbmxpbmsrKzsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlY19jb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlub2RlLT5pX25saW5rLS07CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Cit9CisKK3N0YXRpYyBpbnQgYWRkX25vbmRpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGVyciA9IG1pbml4X2FkZF9saW5rKGRlbnRyeSwgaW5vZGUpOworCWlmICghZXJyKSB7CisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJCXJldHVybiAwOworCX0KKwlkZWNfY291bnQoaW5vZGUpOworCWlwdXQoaW5vZGUpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWluaXhfaGFzaChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxc3RyKQoreworCXVuc2lnbmVkIGxvbmcgaGFzaDsKKwlpbnQgaTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lOworCisJaSA9IG1pbml4X3NiKGRlbnRyeS0+ZF9pbm9kZS0+aV9zYiktPnNfbmFtZWxlbjsKKwlpZiAoaSA+PSBxc3RyLT5sZW4pCisJCXJldHVybiAwOworCS8qIFRydW5jYXRlIHRoZSBuYW1lIGluIHBsYWNlLCBhdm9pZHMgaGF2aW5nIHRvIGRlZmluZSBhIGNvbXBhcmUKKwkgICBmdW5jdGlvbi4gKi8KKwlxc3RyLT5sZW4gPSBpOworCW5hbWUgPSBxc3RyLT5uYW1lOworCWhhc2ggPSBpbml0X25hbWVfaGFzaCgpOworCXdoaWxlIChpLS0pCisJCWhhc2ggPSBwYXJ0aWFsX25hbWVfaGFzaCgqbmFtZSsrLCBoYXNoKTsKKwlxc3RyLT5oYXNoID0gZW5kX25hbWVfaGFzaChoYXNoKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIG1pbml4X2RlbnRyeV9vcGVyYXRpb25zID0geworCS5kX2hhc2gJCT0gbWluaXhfaGFzaCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICptaW5peF9sb29rdXAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gTlVMTDsKKwlpbm9fdCBpbm87CisKKwlkZW50cnktPmRfb3AgPSBkaXItPmlfc2ItPnNfcm9vdC0+ZF9vcDsKKworCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiBtaW5peF9zYihkaXItPmlfc2IpLT5zX25hbWVsZW4pCisJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCisJaW5vID0gbWluaXhfaW5vZGVfYnlfbmFtZShkZW50cnkpOworCWlmIChpbm8pIHsKKwkJaW5vZGUgPSBpZ2V0KGRpci0+aV9zYiwgaW5vKTsKKyAKKwkJaWYgKCFpbm9kZSkKKwkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCX0KKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBtaW5peF9ta25vZChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIGRldl90IHJkZXYpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlpZiAoIW9sZF92YWxpZF9kZXYocmRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJaW5vZGUgPSBtaW5peF9uZXdfaW5vZGUoZGlyLCAmZXJyb3IpOworCisJaWYgKGlub2RlKSB7CisJCWlub2RlLT5pX21vZGUgPSBtb2RlOworCQltaW5peF9zZXRfaW5vZGUoaW5vZGUsIHJkZXYpOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJZXJyb3IgPSBhZGRfbm9uZGlyKGRlbnRyeSwgaW5vZGUpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgbWluaXhfY3JlYXRlKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJcmV0dXJuIG1pbml4X21rbm9kKGRpciwgZGVudHJ5LCBtb2RlLCAwKTsKK30KKworc3RhdGljIGludCBtaW5peF9zeW1saW5rKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCSAgY29uc3QgY2hhciAqIHN5bW5hbWUpCit7CisJaW50IGVyciA9IC1FTkFNRVRPT0xPTkc7CisJaW50IGkgPSBzdHJsZW4oc3ltbmFtZSkrMTsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKworCWlmIChpID4gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkKKwkJZ290byBvdXQ7CisKKwlpbm9kZSA9IG1pbml4X25ld19pbm9kZShkaXIsICZlcnIpOworCWlmICghaW5vZGUpCisJCWdvdG8gb3V0OworCisJaW5vZGUtPmlfbW9kZSA9IFNfSUZMTksgfCAwNzc3OworCW1pbml4X3NldF9pbm9kZShpbm9kZSwgMCk7CisJZXJyID0gcGFnZV9zeW1saW5rKGlub2RlLCBzeW1uYW1lLCBpKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mYWlsOworCisJZXJyID0gYWRkX25vbmRpcihkZW50cnksIGlub2RlKTsKK291dDoKKwlyZXR1cm4gZXJyOworCitvdXRfZmFpbDoKKwlkZWNfY291bnQoaW5vZGUpOworCWlwdXQoaW5vZGUpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IG1pbml4X2xpbmsoc3RydWN0IGRlbnRyeSAqIG9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqIGRpciwKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisKKwlpZiAoaW5vZGUtPmlfbmxpbmsgPj0gbWluaXhfc2IoaW5vZGUtPmlfc2IpLT5zX2xpbmtfbWF4KQorCQlyZXR1cm4gLUVNTElOSzsKKworCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpbmNfY291bnQoaW5vZGUpOworCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKKwlyZXR1cm4gYWRkX25vbmRpcihkZW50cnksIGlub2RlKTsKK30KKworc3RhdGljIGludCBtaW5peF9ta2RpcihzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJaW50IGVyciA9IC1FTUxJTks7CisKKwlpZiAoZGlyLT5pX25saW5rID49IG1pbml4X3NiKGRpci0+aV9zYiktPnNfbGlua19tYXgpCisJCWdvdG8gb3V0OworCisJaW5jX2NvdW50KGRpcik7CisKKwlpbm9kZSA9IG1pbml4X25ld19pbm9kZShkaXIsICZlcnIpOworCWlmICghaW5vZGUpCisJCWdvdG8gb3V0X2RpcjsKKworCWlub2RlLT5pX21vZGUgPSBTX0lGRElSIHwgbW9kZTsKKwlpZiAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKQorCQlpbm9kZS0+aV9tb2RlIHw9IFNfSVNHSUQ7CisJbWluaXhfc2V0X2lub2RlKGlub2RlLCAwKTsKKworCWluY19jb3VudChpbm9kZSk7CisKKwllcnIgPSBtaW5peF9tYWtlX2VtcHR5KGlub2RlLCBkaXIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZhaWw7CisKKwllcnIgPSBtaW5peF9hZGRfbGluayhkZW50cnksIGlub2RlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mYWlsOworCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKK291dDoKKwlyZXR1cm4gZXJyOworCitvdXRfZmFpbDoKKwlkZWNfY291bnQoaW5vZGUpOworCWRlY19jb3VudChpbm9kZSk7CisJaXB1dChpbm9kZSk7CitvdXRfZGlyOgorCWRlY19jb3VudChkaXIpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IG1pbml4X3VubGluayhzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgZXJyID0gLUVOT0VOVDsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgcGFnZSAqIHBhZ2U7CisJc3RydWN0IG1pbml4X2Rpcl9lbnRyeSAqIGRlOworCisJZGUgPSBtaW5peF9maW5kX2VudHJ5KGRlbnRyeSwgJnBhZ2UpOworCWlmICghZGUpCisJCWdvdG8gZW5kX3VubGluazsKKworCWVyciA9IG1pbml4X2RlbGV0ZV9lbnRyeShkZSwgcGFnZSk7CisJaWYgKGVycikKKwkJZ290byBlbmRfdW5saW5rOworCisJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWU7CisJZGVjX2NvdW50KGlub2RlKTsKK2VuZF91bmxpbms6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtaW5peF9ybWRpcihzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyID0gLUVOT1RFTVBUWTsKKworCWlmIChtaW5peF9lbXB0eV9kaXIoaW5vZGUpKSB7CisJCWVyciA9IG1pbml4X3VubGluayhkaXIsIGRlbnRyeSk7CisJCWlmICghZXJyKSB7CisJCQlkZWNfY291bnQoZGlyKTsKKwkJCWRlY19jb3VudChpbm9kZSk7CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtaW5peF9yZW5hbWUoc3RydWN0IGlub2RlICogb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKKwkJCSAgIHN0cnVjdCBpbm9kZSAqIG5ld19kaXIsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisJc3RydWN0IG1pbml4X3NiX2luZm8gKiBpbmZvID0gbWluaXhfc2Iob2xkX2Rpci0+aV9zYik7CisJc3RydWN0IGlub2RlICogb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKiBuZXdfaW5vZGUgPSBuZXdfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBwYWdlICogZGlyX3BhZ2UgPSBOVUxMOworCXN0cnVjdCBtaW5peF9kaXJfZW50cnkgKiBkaXJfZGUgPSBOVUxMOworCXN0cnVjdCBwYWdlICogb2xkX3BhZ2U7CisJc3RydWN0IG1pbml4X2Rpcl9lbnRyeSAqIG9sZF9kZTsKKwlpbnQgZXJyID0gLUVOT0VOVDsKKworCW9sZF9kZSA9IG1pbml4X2ZpbmRfZW50cnkob2xkX2RlbnRyeSwgJm9sZF9wYWdlKTsKKwlpZiAoIW9sZF9kZSkKKwkJZ290byBvdXQ7CisKKwlpZiAoU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSkpIHsKKwkJZXJyID0gLUVJTzsKKwkJZGlyX2RlID0gbWluaXhfZG90ZG90KG9sZF9pbm9kZSwgJmRpcl9wYWdlKTsKKwkJaWYgKCFkaXJfZGUpCisJCQlnb3RvIG91dF9vbGQ7CisJfQorCisJaWYgKG5ld19pbm9kZSkgeworCQlzdHJ1Y3QgcGFnZSAqIG5ld19wYWdlOworCQlzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5ICogbmV3X2RlOworCisJCWVyciA9IC1FTk9URU1QVFk7CisJCWlmIChkaXJfZGUgJiYgIW1pbml4X2VtcHR5X2RpcihuZXdfaW5vZGUpKQorCQkJZ290byBvdXRfZGlyOworCisJCWVyciA9IC1FTk9FTlQ7CisJCW5ld19kZSA9IG1pbml4X2ZpbmRfZW50cnkobmV3X2RlbnRyeSwgJm5ld19wYWdlKTsKKwkJaWYgKCFuZXdfZGUpCisJCQlnb3RvIG91dF9kaXI7CisJCWluY19jb3VudChvbGRfaW5vZGUpOworCQltaW5peF9zZXRfbGluayhuZXdfZGUsIG5ld19wYWdlLCBvbGRfaW5vZGUpOworCQluZXdfaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQlpZiAoZGlyX2RlKQorCQkJbmV3X2lub2RlLT5pX25saW5rLS07CisJCWRlY19jb3VudChuZXdfaW5vZGUpOworCX0gZWxzZSB7CisJCWlmIChkaXJfZGUpIHsKKwkJCWVyciA9IC1FTUxJTks7CisJCQlpZiAobmV3X2Rpci0+aV9ubGluayA+PSBpbmZvLT5zX2xpbmtfbWF4KQorCQkJCWdvdG8gb3V0X2RpcjsKKwkJfQorCQlpbmNfY291bnQob2xkX2lub2RlKTsKKwkJZXJyID0gbWluaXhfYWRkX2xpbmsobmV3X2RlbnRyeSwgb2xkX2lub2RlKTsKKwkJaWYgKGVycikgeworCQkJZGVjX2NvdW50KG9sZF9pbm9kZSk7CisJCQlnb3RvIG91dF9kaXI7CisJCX0KKwkJaWYgKGRpcl9kZSkKKwkJCWluY19jb3VudChuZXdfZGlyKTsKKwl9CisKKwltaW5peF9kZWxldGVfZW50cnkob2xkX2RlLCBvbGRfcGFnZSk7CisJZGVjX2NvdW50KG9sZF9pbm9kZSk7CisKKwlpZiAoZGlyX2RlKSB7CisJCW1pbml4X3NldF9saW5rKGRpcl9kZSwgZGlyX3BhZ2UsIG5ld19kaXIpOworCQlkZWNfY291bnQob2xkX2Rpcik7CisJfQorCXJldHVybiAwOworCitvdXRfZGlyOgorCWlmIChkaXJfZGUpIHsKKwkJa3VubWFwKGRpcl9wYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKGRpcl9wYWdlKTsKKwl9CitvdXRfb2xkOgorCWt1bm1hcChvbGRfcGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKG9sZF9wYWdlKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogZGlyZWN0b3JpZXMgY2FuIGhhbmRsZSBtb3N0IG9wZXJhdGlvbnMuLi4KKyAqLworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbWluaXhfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmNyZWF0ZQkJPSBtaW5peF9jcmVhdGUsCisJLmxvb2t1cAkJPSBtaW5peF9sb29rdXAsCisJLmxpbmsJCT0gbWluaXhfbGluaywKKwkudW5saW5rCQk9IG1pbml4X3VubGluaywKKwkuc3ltbGluawk9IG1pbml4X3N5bWxpbmssCisJLm1rZGlyCQk9IG1pbml4X21rZGlyLAorCS5ybWRpcgkJPSBtaW5peF9ybWRpciwKKwkubWtub2QJCT0gbWluaXhfbWtub2QsCisJLnJlbmFtZQkJPSBtaW5peF9yZW5hbWUsCisJLmdldGF0dHIJPSBtaW5peF9nZXRhdHRyLAorfTsKZGlmZiAtLWdpdCBhL2ZzL21wYWdlLmMgYi9mcy9tcGFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDhkMWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9tcGFnZS5jCkBAIC0wLDAgKzEsNzcyIEBACisvKgorICogZnMvbXBhZ2UuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgTGludXMgVG9ydmFsZHMuCisgKgorICogQ29udGFpbnMgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gcHJlcGFyaW5nIGFuZCBzdWJtaXR0aW5nIEJJT3Mgd2hpY2ggY29udGFpbgorICogbXVsdGlwbGUgcGFnZWNhY2hlIHBhZ2VzLgorICoKKyAqIDE1TWF5MjAwMglha3BtQHppcC5jb20uYXUKKyAqCQlJbml0aWFsIHZlcnNpb24KKyAqIDI3SnVuMjAwMglheGJvZUBzdXNlLmRlCisgKgkJdXNlIGJpb19hZGRfcGFnZSgpIHRvIGJ1aWxkIGJpbydzIGp1c3QgdGhlIHJpZ2h0IHNpemUKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9iaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2V2ZWMuaD4KKworLyoKKyAqIEkvTyBjb21wbGV0aW9uIGhhbmRsZXIgZm9yIG11bHRpcGFnZSBCSU9zLgorICoKKyAqIFRoZSBtcGFnZSBjb2RlIG5ldmVyIHB1dHMgcGFydGlhbCBwYWdlcyBpbnRvIGEgQklPIChleGNlcHQgZm9yIGVuZC1vZi1maWxlKS4KKyAqIElmIGEgcGFnZSBkb2VzIG5vdCBtYXAgdG8gYSBjb250aWd1b3VzIHJ1biBvZiBibG9ja3MgdGhlbiBpdCBzaW1wbHkgZmFsbHMKKyAqIGJhY2sgdG8gYmxvY2tfcmVhZF9mdWxsX3BhZ2UoKS4KKyAqCisgKiBXaHkgaXMgdGhpcz8gIElmIGEgcGFnZSdzIGNvbXBsZXRpb24gZGVwZW5kcyBvbiBhIG51bWJlciBvZiBkaWZmZXJlbnQgQklPcworICogd2hpY2ggY2FuIGNvbXBsZXRlIGluIGFueSBvcmRlciAob3IgYXQgdGhlIHNhbWUgdGltZSkgdGhlbiBkZXRlcm1pbmluZyB0aGUKKyAqIHN0YXR1cyBvZiB0aGF0IHBhZ2UgaXMgaGFyZC4gIFNlZSBlbmRfYnVmZmVyX2FzeW5jX3JlYWQoKSBmb3IgdGhlIGRldGFpbHMuCisgKiBUaGVyZSBpcyBubyBwb2ludCBpbiBkdXBsaWNhdGluZyBhbGwgdGhhdCBjb21wbGV4aXR5LgorICovCitzdGF0aWMgaW50IG1wYWdlX2VuZF9pb19yZWFkKHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgaW50IGJ5dGVzX2RvbmUsIGludCBlcnIpCit7CisJY29uc3QgaW50IHVwdG9kYXRlID0gdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYyArIGJpby0+YmlfdmNudCAtIDE7CisKKwlpZiAoYmlvLT5iaV9zaXplKQorCQlyZXR1cm4gMTsKKworCWRvIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBidmVjLT5idl9wYWdlOworCisJCWlmICgtLWJ2ZWMgPj0gYmlvLT5iaV9pb192ZWMpCisJCQlwcmVmZXRjaHcoJmJ2ZWMtPmJ2X3BhZ2UtPmZsYWdzKTsKKworCQlpZiAodXB0b2RhdGUpIHsKKwkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJfSBlbHNlIHsKKwkJCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOworCQkJU2V0UGFnZUVycm9yKHBhZ2UpOworCQl9CisJCXVubG9ja19wYWdlKHBhZ2UpOworCX0gd2hpbGUgKGJ2ZWMgPj0gYmlvLT5iaV9pb192ZWMpOworCWJpb19wdXQoYmlvKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGFnZV9lbmRfaW9fd3JpdGUoc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBpbnQgYnl0ZXNfZG9uZSwgaW50IGVycikKK3sKKwljb25zdCBpbnQgdXB0b2RhdGUgPSB0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYyA9IGJpby0+YmlfaW9fdmVjICsgYmlvLT5iaV92Y250IC0gMTsKKworCWlmIChiaW8tPmJpX3NpemUpCisJCXJldHVybiAxOworCisJZG8geworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGJ2ZWMtPmJ2X3BhZ2U7CisKKwkJaWYgKC0tYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYykKKwkJCXByZWZldGNodygmYnZlYy0+YnZfcGFnZS0+ZmxhZ3MpOworCisJCWlmICghdXB0b2RhdGUpCisJCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJCWVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwl9IHdoaWxlIChidmVjID49IGJpby0+YmlfaW9fdmVjKTsKKwliaW9fcHV0KGJpbyk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBiaW8gKm1wYWdlX2Jpb19zdWJtaXQoaW50IHJ3LCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJYmlvLT5iaV9lbmRfaW8gPSBtcGFnZV9lbmRfaW9fcmVhZDsKKwlpZiAocncgPT0gV1JJVEUpCisJCWJpby0+YmlfZW5kX2lvID0gbXBhZ2VfZW5kX2lvX3dyaXRlOworCXN1Ym1pdF9iaW8ocncsIGJpbyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmlvICoKK21wYWdlX2FsbG9jKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCXNlY3Rvcl90IGZpcnN0X3NlY3RvciwgaW50IG5yX3ZlY3MsCisJCXVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IGJpbyAqYmlvOworCisJYmlvID0gYmlvX2FsbG9jKGdmcF9mbGFncywgbnJfdmVjcyk7CisKKwlpZiAoYmlvID09IE5VTEwgJiYgKGN1cnJlbnQtPmZsYWdzICYgUEZfTUVNQUxMT0MpKSB7CisJCXdoaWxlICghYmlvICYmIChucl92ZWNzIC89IDIpKQorCQkJYmlvID0gYmlvX2FsbG9jKGdmcF9mbGFncywgbnJfdmVjcyk7CisJfQorCisJaWYgKGJpbykgeworCQliaW8tPmJpX2JkZXYgPSBiZGV2OworCQliaW8tPmJpX3NlY3RvciA9IGZpcnN0X3NlY3RvcjsKKwl9CisJcmV0dXJuIGJpbzsKK30KKworLyoKKyAqIHN1cHBvcnQgZnVuY3Rpb24gZm9yIG1wYWdlX3JlYWRwYWdlcy4gIFRoZSBmcyBzdXBwbGllZCBnZXRfYmxvY2sgbWlnaHQKKyAqIHJldHVybiBhbiB1cCB0byBkYXRlIGJ1ZmZlci4gIFRoaXMgaXMgdXNlZCB0byBtYXAgdGhhdCBidWZmZXIgaW50bworICogdGhlIHBhZ2UsIHdoaWNoIGFsbG93cyByZWFkcGFnZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGEgZHVwbGljYXRlIGNhbGwKKyAqIHRvIGdldF9ibG9jay4KKyAqCisgKiBUaGUgaWRlYSBpcyB0byBhdm9pZCBhZGRpbmcgYnVmZmVycyB0byBwYWdlcyB0aGF0IGRvbid0IGFscmVhZHkgaGF2ZQorICogdGhlbS4gIFNvIHdoZW4gdGhlIGJ1ZmZlciBpcyB1cCB0byBkYXRlIGFuZCB0aGUgcGFnZSBzaXplID09IGJsb2NrIHNpemUsCisgKiB0aGlzIG1hcmtzIHRoZSBwYWdlIHVwIHRvIGRhdGUgaW5zdGVhZCBvZiBhZGRpbmcgbmV3IGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkIAorbWFwX2J1ZmZlcl90b19wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgcGFnZV9ibG9jaykgCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpwYWdlX2JoLCAqaGVhZDsKKwlpbnQgYmxvY2sgPSAwOworCisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCS8qCisJCSAqIGRvbid0IG1ha2UgYW55IGJ1ZmZlcnMgaWYgdGhlcmUgaXMgb25seSBvbmUgYnVmZmVyIG9uCisJCSAqIHRoZSBwYWdlIGFuZCB0aGUgcGFnZSBqdXN0IG5lZWRzIHRvIGJlIHNldCB1cCB0byBkYXRlCisJCSAqLworCQlpZiAoaW5vZGUtPmlfYmxrYml0cyA9PSBQQUdFX0NBQ0hFX1NISUZUICYmIAorCQkgICAgYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOyAgICAKKwkJCXJldHVybjsKKwkJfQorCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCAxIDw8IGlub2RlLT5pX2Jsa2JpdHMsIDApOworCX0KKwloZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCXBhZ2VfYmggPSBoZWFkOworCWRvIHsKKwkJaWYgKGJsb2NrID09IHBhZ2VfYmxvY2spIHsKKwkJCXBhZ2VfYmgtPmJfc3RhdGUgPSBiaC0+Yl9zdGF0ZTsKKwkJCXBhZ2VfYmgtPmJfYmRldiA9IGJoLT5iX2JkZXY7CisJCQlwYWdlX2JoLT5iX2Jsb2NrbnIgPSBiaC0+Yl9ibG9ja25yOworCQkJYnJlYWs7CisJCX0KKwkJcGFnZV9iaCA9IHBhZ2VfYmgtPmJfdGhpc19wYWdlOworCQlibG9jaysrOworCX0gd2hpbGUgKHBhZ2VfYmggIT0gaGVhZCk7Cit9CisKKy8qKgorICogbXBhZ2VfcmVhZHBhZ2VzIC0gcG9wdWxhdGUgYW4gYWRkcmVzcyBzcGFjZSB3aXRoIHNvbWUgcGFnZXMsIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IHJlYWRzIGFnYWluc3QgdGhlbS4KKyAqCisgKiBAbWFwcGluZzogdGhlIGFkZHJlc3Nfc3BhY2UKKyAqIEBwYWdlczogVGhlIGFkZHJlc3Mgb2YgYSBsaXN0X2hlYWQgd2hpY2ggY29udGFpbnMgdGhlIHRhcmdldCBwYWdlcy4gIFRoZXNlCisgKiAgIHBhZ2VzIGhhdmUgdGhlaXIgLT5pbmRleCBwb3B1bGF0ZWQgYW5kIGFyZSBvdGhlcndpc2UgdW5pbml0aWFsaXNlZC4KKyAqCisgKiAgIFRoZSBwYWdlIGF0IEBwYWdlcy0+cHJldiBoYXMgdGhlIGxvd2VzdCBmaWxlIG9mZnNldCwgYW5kIHJlYWRzIHNob3VsZCBiZQorICogICBpc3N1ZWQgaW4gQHBhZ2VzLT5wcmV2IHRvIEBwYWdlcy0+bmV4dCBvcmRlci4KKyAqCisgKiBAbnJfcGFnZXM6IFRoZSBudW1iZXIgb2YgcGFnZXMgYXQgKkBwYWdlcworICogQGdldF9ibG9jazogVGhlIGZpbGVzeXN0ZW0ncyBibG9jayBtYXBwZXIgZnVuY3Rpb24uCisgKgorICogVGhpcyBmdW5jdGlvbiB3YWxrcyB0aGUgcGFnZXMgYW5kIHRoZSBibG9ja3Mgd2l0aGluIGVhY2ggcGFnZSwgYnVpbGRpbmcgYW5kCisgKiBlbWl0dGluZyBsYXJnZSBCSU9zLgorICoKKyAqIElmIGFueXRoaW5nIHVudXN1YWwgaGFwcGVucywgc3VjaCBhczoKKyAqCisgKiAtIGVuY291bnRlcmluZyBhIHBhZ2Ugd2hpY2ggaGFzIGJ1ZmZlcnMKKyAqIC0gZW5jb3VudGVyaW5nIGEgcGFnZSB3aGljaCBoYXMgYSBub24taG9sZSBhZnRlciBhIGhvbGUKKyAqIC0gZW5jb3VudGVyaW5nIGEgcGFnZSB3aXRoIG5vbi1jb250aWd1b3VzIGJsb2NrcworICoKKyAqIHRoZW4gdGhpcyBjb2RlIGp1c3QgZ2l2ZXMgdXAgYW5kIGNhbGxzIHRoZSBidWZmZXJfaGVhZC1iYXNlZCByZWFkIGZ1bmN0aW9uLgorICogSXQgZG9lcyBoYW5kbGUgYSBwYWdlIHdoaWNoIGhhcyBob2xlcyBhdCB0aGUgZW5kIC0gdGhhdCBpcyBhIGNvbW1vbiBjYXNlOgorICogdGhlIGVuZC1vZi1maWxlIG9uIGJsb2Nrc2l6ZSA8IFBBR0VfQ0FDSEVfU0laRSBzZXR1cHMuCisgKgorICogQkhfQm91bmRhcnkgZXhwbGFuYXRpb246CisgKgorICogVGhlcmUgaXMgYSBwcm9ibGVtLiAgVGhlIG1wYWdlIHJlYWQgY29kZSBhc3NlbWJsZXMgc2V2ZXJhbCBwYWdlcywgZ2V0cyBhbGwKKyAqIHRoZWlyIGRpc2sgbWFwcGluZ3MsIGFuZCB0aGVuIHN1Ym1pdHMgdGhlbSBhbGwuICBUaGF0J3MgZmluZSwgYnV0IG9idGFpbmluZworICogdGhlIGRpc2sgbWFwcGluZ3MgbWF5IHJlcXVpcmUgSS9PLiAgUmVhZHMgb2YgaW5kaXJlY3QgYmxvY2tzLCBmb3IgZXhhbXBsZS4KKyAqCisgKiBTbyBhbiBtcGFnZSByZWFkIG9mIHRoZSBmaXJzdCAxNiBibG9ja3Mgb2YgYW4gZXh0MiBmaWxlIHdpbGwgY2F1c2UgSS9PIHRvIGJlCisgKiBzdWJtaXR0ZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKyAqIAkxMiAwIDEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEzIDE0IDE1IDE2CisgKiBiZWNhdXNlIHRoZSBpbmRpcmVjdCBibG9jayBoYXMgdG8gYmUgcmVhZCB0byBnZXQgdGhlIG1hcHBpbmdzIG9mIGJsb2NrcworICogMTMsMTQsMTUsMTYuICBPYnZpb3VzbHksIHRoaXMgaW1wYWN0cyBwZXJmb3JtYW5jZS4KKyAqIAorICogU28gd2hhdCB3ZSBkbyBpdCB0byBhbGxvdyB0aGUgZmlsZXN5c3RlbSdzIGdldF9ibG9jaygpIGZ1bmN0aW9uIHRvIHNldAorICogQkhfQm91bmRhcnkgd2hlbiBpdCBtYXBzIGJsb2NrIDExLiAgQkhfQm91bmRhcnkgc2F5czogbWFwcGluZyBvZiB0aGUgYmxvY2sKKyAqIGFmdGVyIHRoaXMgb25lIHdpbGwgcmVxdWlyZSBJL08gYWdhaW5zdCBhIGJsb2NrIHdoaWNoIGlzIHByb2JhYmx5IGNsb3NlIHRvCisgKiB0aGlzIG9uZS4gIFNvIHlvdSBzaG91bGQgcHVzaCB3aGF0IEkvTyB5b3UgaGF2ZSBjdXJyZW50bHkgYWNjdW11bGF0ZWQuCisgKgorICogVGhpcyBhbGwgY2F1c2VzIHRoZSBkaXNrIHJlcXVlc3RzIHRvIGJlIGlzc3VlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4KKyAqLworc3RhdGljIHN0cnVjdCBiaW8gKgorZG9fbXBhZ2VfcmVhZHBhZ2Uoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbnJfcGFnZXMsCisJCQlzZWN0b3JfdCAqbGFzdF9ibG9ja19pbl9iaW8sIGdldF9ibG9ja190IGdldF9ibG9jaykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwljb25zdCB1bnNpZ25lZCBibGtiaXRzID0gaW5vZGUtPmlfYmxrYml0czsKKwljb25zdCB1bnNpZ25lZCBibG9ja3NfcGVyX3BhZ2UgPSBQQUdFX0NBQ0hFX1NJWkUgPj4gYmxrYml0czsKKwljb25zdCB1bnNpZ25lZCBibG9ja3NpemUgPSAxIDw8IGJsa2JpdHM7CisJc2VjdG9yX3QgYmxvY2tfaW5fZmlsZTsKKwlzZWN0b3JfdCBsYXN0X2Jsb2NrOworCXNlY3Rvcl90IGJsb2Nrc1tNQVhfQlVGX1BFUl9QQUdFXTsKKwl1bnNpZ25lZCBwYWdlX2Jsb2NrOworCXVuc2lnbmVkIGZpcnN0X2hvbGUgPSBibG9ja3NfcGVyX3BhZ2U7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkIGJoOworCWludCBsZW5ndGg7CisJaW50IGZ1bGx5X21hcHBlZCA9IDE7CisKKwlpZiAocGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwkJZ290byBjb25mdXNlZDsKKworCWJsb2NrX2luX2ZpbGUgPSBwYWdlLT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGJsa2JpdHMpOworCWxhc3RfYmxvY2sgPSAoaV9zaXplX3JlYWQoaW5vZGUpICsgYmxvY2tzaXplIC0gMSkgPj4gYmxrYml0czsKKworCWJoLmJfcGFnZSA9IHBhZ2U7CisJZm9yIChwYWdlX2Jsb2NrID0gMDsgcGFnZV9ibG9jayA8IGJsb2Nrc19wZXJfcGFnZTsKKwkJCQlwYWdlX2Jsb2NrKyssIGJsb2NrX2luX2ZpbGUrKykgeworCQliaC5iX3N0YXRlID0gMDsKKwkJaWYgKGJsb2NrX2luX2ZpbGUgPCBsYXN0X2Jsb2NrKSB7CisJCQlpZiAoZ2V0X2Jsb2NrKGlub2RlLCBibG9ja19pbl9maWxlLCAmYmgsIDApKQorCQkJCWdvdG8gY29uZnVzZWQ7CisJCX0KKworCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoJmJoKSkgeworCQkJZnVsbHlfbWFwcGVkID0gMDsKKwkJCWlmIChmaXJzdF9ob2xlID09IGJsb2Nrc19wZXJfcGFnZSkKKwkJCQlmaXJzdF9ob2xlID0gcGFnZV9ibG9jazsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogc29tZSBmaWxlc3lzdGVtcyB3aWxsIGNvcHkgZGF0YSBpbnRvIHRoZSBwYWdlIGR1cmluZworCQkgKiB0aGUgZ2V0X2Jsb2NrIGNhbGwsIGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3Qgd2FudCB0bworCQkgKiByZWFkIGl0IGFnYWluLiAgbWFwX2J1ZmZlcl90b19wYWdlIGNvcGllcyB0aGUgZGF0YQorCQkgKiB3ZSBqdXN0IGNvbGxlY3RlZCBmcm9tIGdldF9ibG9jayBpbnRvIHRoZSBwYWdlJ3MgYnVmZmVycworCQkgKiBzbyByZWFkcGFnZSBkb2Vzbid0IGhhdmUgdG8gcmVwZWF0IHRoZSBnZXRfYmxvY2sgY2FsbAorCQkgKi8KKwkJaWYgKGJ1ZmZlcl91cHRvZGF0ZSgmYmgpKSB7CisJCQltYXBfYnVmZmVyX3RvX3BhZ2UocGFnZSwgJmJoLCBwYWdlX2Jsb2NrKTsKKwkJCWdvdG8gY29uZnVzZWQ7CisJCX0KKwkKKwkJaWYgKGZpcnN0X2hvbGUgIT0gYmxvY2tzX3Blcl9wYWdlKQorCQkJZ290byBjb25mdXNlZDsJCS8qIGhvbGUgLT4gbm9uLWhvbGUgKi8KKworCQkvKiBDb250aWd1b3VzIGJsb2Nrcz8gKi8KKwkJaWYgKHBhZ2VfYmxvY2sgJiYgYmxvY2tzW3BhZ2VfYmxvY2stMV0gIT0gYmguYl9ibG9ja25yLTEpCisJCQlnb3RvIGNvbmZ1c2VkOworCQlibG9ja3NbcGFnZV9ibG9ja10gPSBiaC5iX2Jsb2NrbnI7CisJCWJkZXYgPSBiaC5iX2JkZXY7CisJfQorCisJaWYgKGZpcnN0X2hvbGUgIT0gYmxvY2tzX3Blcl9wYWdlKSB7CisJCWNoYXIgKmthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQltZW1zZXQoa2FkZHIgKyAoZmlyc3RfaG9sZSA8PCBibGtiaXRzKSwgMCwKKwkJCQlQQUdFX0NBQ0hFX1NJWkUgLSAoZmlyc3RfaG9sZSA8PCBibGtiaXRzKSk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCWlmIChmaXJzdF9ob2xlID09IDApIHsKKwkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgaWYgKGZ1bGx5X21hcHBlZCkgeworCQlTZXRQYWdlTWFwcGVkVG9EaXNrKHBhZ2UpOworCX0KKworCS8qCisJICogVGhpcyBwYWdlIHdpbGwgZ28gdG8gQklPLiAgRG8gd2UgbmVlZCB0byBzZW5kIHRoaXMgQklPIG9mZiBmaXJzdD8KKwkgKi8KKwlpZiAoYmlvICYmICgqbGFzdF9ibG9ja19pbl9iaW8gIT0gYmxvY2tzWzBdIC0gMSkpCisJCWJpbyA9IG1wYWdlX2Jpb19zdWJtaXQoUkVBRCwgYmlvKTsKKworYWxsb2NfbmV3OgorCWlmIChiaW8gPT0gTlVMTCkgeworCQliaW8gPSBtcGFnZV9hbGxvYyhiZGV2LCBibG9ja3NbMF0gPDwgKGJsa2JpdHMgLSA5KSwKKwkJCSAgCW1pbl90KGludCwgbnJfcGFnZXMsIGJpb19nZXRfbnJfdmVjcyhiZGV2KSksCisJCQkJR0ZQX0tFUk5FTCk7CisJCWlmIChiaW8gPT0gTlVMTCkKKwkJCWdvdG8gY29uZnVzZWQ7CisJfQorCisJbGVuZ3RoID0gZmlyc3RfaG9sZSA8PCBibGtiaXRzOworCWlmIChiaW9fYWRkX3BhZ2UoYmlvLCBwYWdlLCBsZW5ndGgsIDApIDwgbGVuZ3RoKSB7CisJCWJpbyA9IG1wYWdlX2Jpb19zdWJtaXQoUkVBRCwgYmlvKTsKKwkJZ290byBhbGxvY19uZXc7CisJfQorCisJaWYgKGJ1ZmZlcl9ib3VuZGFyeSgmYmgpIHx8IChmaXJzdF9ob2xlICE9IGJsb2Nrc19wZXJfcGFnZSkpCisJCWJpbyA9IG1wYWdlX2Jpb19zdWJtaXQoUkVBRCwgYmlvKTsKKwllbHNlCisJCSpsYXN0X2Jsb2NrX2luX2JpbyA9IGJsb2Nrc1tibG9ja3NfcGVyX3BhZ2UgLSAxXTsKK291dDoKKwlyZXR1cm4gYmlvOworCitjb25mdXNlZDoKKwlpZiAoYmlvKQorCQliaW8gPSBtcGFnZV9iaW9fc3VibWl0KFJFQUQsIGJpbyk7CisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpCisJICAgICAgICBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLCBnZXRfYmxvY2spOworCWVsc2UKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJZ290byBvdXQ7Cit9CisKK2ludAorbXBhZ2VfcmVhZHBhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlcywKKwkJCQl1bnNpZ25lZCBucl9wYWdlcywgZ2V0X2Jsb2NrX3QgZ2V0X2Jsb2NrKQoreworCXN0cnVjdCBiaW8gKmJpbyA9IE5VTEw7CisJdW5zaWduZWQgcGFnZV9pZHg7CisJc2VjdG9yX3QgbGFzdF9ibG9ja19pbl9iaW8gPSAwOworCXN0cnVjdCBwYWdldmVjIGxydV9wdmVjOworCisJcGFnZXZlY19pbml0KCZscnVfcHZlYywgMCk7CisJZm9yIChwYWdlX2lkeCA9IDA7IHBhZ2VfaWR4IDwgbnJfcGFnZXM7IHBhZ2VfaWR4KyspIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBsaXN0X2VudHJ5KHBhZ2VzLT5wcmV2LCBzdHJ1Y3QgcGFnZSwgbHJ1KTsKKworCQlwcmVmZXRjaHcoJnBhZ2UtPmZsYWdzKTsKKwkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CisJCWlmICghYWRkX3RvX3BhZ2VfY2FjaGUocGFnZSwgbWFwcGluZywKKwkJCQkJcGFnZS0+aW5kZXgsIEdGUF9LRVJORUwpKSB7CisJCQliaW8gPSBkb19tcGFnZV9yZWFkcGFnZShiaW8sIHBhZ2UsCisJCQkJCW5yX3BhZ2VzIC0gcGFnZV9pZHgsCisJCQkJCSZsYXN0X2Jsb2NrX2luX2JpbywgZ2V0X2Jsb2NrKTsKKwkJCWlmICghcGFnZXZlY19hZGQoJmxydV9wdmVjLCBwYWdlKSkKKwkJCQlfX3BhZ2V2ZWNfbHJ1X2FkZCgmbHJ1X3B2ZWMpOworCQl9IGVsc2UgeworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQl9CisJfQorCXBhZ2V2ZWNfbHJ1X2FkZCgmbHJ1X3B2ZWMpOworCUJVR19PTighbGlzdF9lbXB0eShwYWdlcykpOworCWlmIChiaW8pCisJCW1wYWdlX2Jpb19zdWJtaXQoUkVBRCwgYmlvKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wobXBhZ2VfcmVhZHBhZ2VzKTsKKworLyoKKyAqIFRoaXMgaXNuJ3QgY2FsbGVkIG11Y2ggYXQgYWxsCisgKi8KK2ludCBtcGFnZV9yZWFkcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgZ2V0X2Jsb2NrX3QgZ2V0X2Jsb2NrKQoreworCXN0cnVjdCBiaW8gKmJpbyA9IE5VTEw7CisJc2VjdG9yX3QgbGFzdF9ibG9ja19pbl9iaW8gPSAwOworCisJYmlvID0gZG9fbXBhZ2VfcmVhZHBhZ2UoYmlvLCBwYWdlLCAxLAorCQkJJmxhc3RfYmxvY2tfaW5fYmlvLCBnZXRfYmxvY2spOworCWlmIChiaW8pCisJCW1wYWdlX2Jpb19zdWJtaXQoUkVBRCwgYmlvKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wobXBhZ2VfcmVhZHBhZ2UpOworCisvKgorICogV3JpdGluZyBpcyBub3Qgc28gc2ltcGxlLgorICoKKyAqIElmIHRoZSBwYWdlIGhhcyBidWZmZXJzIHRoZW4gdGhleSB3aWxsIGJlIHVzZWQgZm9yIG9idGFpbmluZyB0aGUgZGlzaworICogbWFwcGluZy4gIFdlIG9ubHkgc3VwcG9ydCBwYWdlcyB3aGljaCBhcmUgZnVsbHkgbWFwcGVkLWFuZC1kaXJ0eSwgd2l0aCBhCisgKiBzcGVjaWFsIGNhc2UgZm9yIHBhZ2VzIHdoaWNoIGFyZSB1bm1hcHBlZCBhdCB0aGUgZW5kOiBlbmQtb2YtZmlsZS4KKyAqCisgKiBJZiB0aGUgcGFnZSBoYXMgbm8gYnVmZmVycyAocHJlZmVycmVkKSB0aGVuIHRoZSBwYWdlIGlzIG1hcHBlZCBoZXJlLgorICoKKyAqIElmIGFsbCBibG9ja3MgYXJlIGZvdW5kIHRvIGJlIGNvbnRpZ3VvdXMgdGhlbiB0aGUgcGFnZSBjYW4gZ28gaW50byB0aGUKKyAqIEJJTy4gIE90aGVyd2lzZSBmYWxsIGJhY2sgdG8gdGhlIG1hcHBpbmcncyB3cml0ZXBhZ2UoKS4KKyAqIAorICogRklYTUU6IFRoaXMgY29kZSB3YW50cyBhbiBlc3RpbWF0ZSBvZiBob3cgbWFueSBwYWdlcyBhcmUgc3RpbGwgdG8gYmUKKyAqIHdyaXR0ZW4sIHNvIGl0IGNhbiBpbnRlbGxpZ2VudGx5IGFsbG9jYXRlIGEgc3VpdGFibHktc2l6ZWQgQklPLiAgRm9yIG5vdywKKyAqIGp1c3QgYWxsb2NhdGUgZnVsbC1zaXplICgxNi1wYWdlKSBCSU9zLgorICovCitzdGF0aWMgc3RydWN0IGJpbyAqCitfX21wYWdlX3dyaXRlcGFnZShzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBwYWdlICpwYWdlLCBnZXRfYmxvY2tfdCBnZXRfYmxvY2ssCisJc2VjdG9yX3QgKmxhc3RfYmxvY2tfaW5fYmlvLCBpbnQgKnJldCwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsCisJd3JpdGVwYWdlX3Qgd3JpdGVwYWdlX2ZuKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwljb25zdCB1bnNpZ25lZCBibGtiaXRzID0gaW5vZGUtPmlfYmxrYml0czsKKwl1bnNpZ25lZCBsb25nIGVuZF9pbmRleDsKKwljb25zdCB1bnNpZ25lZCBibG9ja3NfcGVyX3BhZ2UgPSBQQUdFX0NBQ0hFX1NJWkUgPj4gYmxrYml0czsKKwlzZWN0b3JfdCBsYXN0X2Jsb2NrOworCXNlY3Rvcl90IGJsb2NrX2luX2ZpbGU7CisJc2VjdG9yX3QgYmxvY2tzW01BWF9CVUZfUEVSX1BBR0VdOworCXVuc2lnbmVkIHBhZ2VfYmxvY2s7CisJdW5zaWduZWQgZmlyc3RfdW5tYXBwZWQgPSBibG9ja3NfcGVyX3BhZ2U7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IE5VTEw7CisJaW50IGJvdW5kYXJ5ID0gMDsKKwlzZWN0b3JfdCBib3VuZGFyeV9ibG9jayA9IDA7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYm91bmRhcnlfYmRldiA9IE5VTEw7CisJaW50IGxlbmd0aDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgbWFwX2JoOworCWxvZmZfdCBpX3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisKKwlpZiAocGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBoZWFkOworCisJCS8qIElmIHRoZXkncmUgYWxsIG1hcHBlZCBhbmQgZGlydHksIGRvIGl0ICovCisJCXBhZ2VfYmxvY2sgPSAwOworCQlkbyB7CisJCQlCVUdfT04oYnVmZmVyX2xvY2tlZChiaCkpOworCQkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkgeworCQkJCS8qCisJCQkJICogdW5tYXBwZWQgZGlydHkgYnVmZmVycyBhcmUgY3JlYXRlZCBieQorCQkJCSAqIF9fc2V0X3BhZ2VfZGlydHlfYnVmZmVycyAtPiBtbWFwcGVkIGRhdGEKKwkJCQkgKi8KKwkJCQlpZiAoYnVmZmVyX2RpcnR5KGJoKSkKKwkJCQkJZ290byBjb25mdXNlZDsKKwkJCQlpZiAoZmlyc3RfdW5tYXBwZWQgPT0gYmxvY2tzX3Blcl9wYWdlKQorCQkJCQlmaXJzdF91bm1hcHBlZCA9IHBhZ2VfYmxvY2s7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChmaXJzdF91bm1hcHBlZCAhPSBibG9ja3NfcGVyX3BhZ2UpCisJCQkJZ290byBjb25mdXNlZDsJLyogaG9sZSAtPiBub24taG9sZSAqLworCisJCQlpZiAoIWJ1ZmZlcl9kaXJ0eShiaCkgfHwgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQkJZ290byBjb25mdXNlZDsKKwkJCWlmIChwYWdlX2Jsb2NrKSB7CisJCQkJaWYgKGJoLT5iX2Jsb2NrbnIgIT0gYmxvY2tzW3BhZ2VfYmxvY2stMV0gKyAxKQorCQkJCQlnb3RvIGNvbmZ1c2VkOworCQkJfQorCQkJYmxvY2tzW3BhZ2VfYmxvY2srK10gPSBiaC0+Yl9ibG9ja25yOworCQkJYm91bmRhcnkgPSBidWZmZXJfYm91bmRhcnkoYmgpOworCQkJaWYgKGJvdW5kYXJ5KSB7CisJCQkJYm91bmRhcnlfYmxvY2sgPSBiaC0+Yl9ibG9ja25yOworCQkJCWJvdW5kYXJ5X2JkZXYgPSBiaC0+Yl9iZGV2OworCQkJfQorCQkJYmRldiA9IGJoLT5iX2JkZXY7CisJCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisKKwkJaWYgKGZpcnN0X3VubWFwcGVkKQorCQkJZ290byBwYWdlX2lzX21hcHBlZDsKKworCQkvKgorCQkgKiBQYWdlIGhhcyBidWZmZXJzLCBidXQgdGhleSBhcmUgYWxsIHVubWFwcGVkLiBUaGUgcGFnZSB3YXMKKwkJICogY3JlYXRlZCBieSBwYWdlaW4gb3IgcmVhZCBvdmVyIGEgaG9sZSB3aGljaCB3YXMgaGFuZGxlZCBieQorCQkgKiBibG9ja19yZWFkX2Z1bGxfcGFnZSgpLiAgSWYgdGhpcyBhZGRyZXNzX3NwYWNlIGlzIGFsc28KKwkJICogdXNpbmcgbXBhZ2VfcmVhZHBhZ2VzIHRoZW4gdGhpcyBjYW4gcmFyZWx5IGhhcHBlbi4KKwkJICovCisJCWdvdG8gY29uZnVzZWQ7CisJfQorCisJLyoKKwkgKiBUaGUgcGFnZSBoYXMgbm8gYnVmZmVyczogbWFwIGl0IHRvIGRpc2sKKwkgKi8KKwlCVUdfT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CisJYmxvY2tfaW5fZmlsZSA9IHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gYmxrYml0cyk7CisJbGFzdF9ibG9jayA9IChpX3NpemUgLSAxKSA+PiBibGtiaXRzOworCW1hcF9iaC5iX3BhZ2UgPSBwYWdlOworCWZvciAocGFnZV9ibG9jayA9IDA7IHBhZ2VfYmxvY2sgPCBibG9ja3NfcGVyX3BhZ2U7ICkgeworCisJCW1hcF9iaC5iX3N0YXRlID0gMDsKKwkJaWYgKGdldF9ibG9jayhpbm9kZSwgYmxvY2tfaW5fZmlsZSwgJm1hcF9iaCwgMSkpCisJCQlnb3RvIGNvbmZ1c2VkOworCQlpZiAoYnVmZmVyX25ldygmbWFwX2JoKSkKKwkJCXVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEobWFwX2JoLmJfYmRldiwKKwkJCQkJCW1hcF9iaC5iX2Jsb2NrbnIpOworCQlpZiAoYnVmZmVyX2JvdW5kYXJ5KCZtYXBfYmgpKSB7CisJCQlib3VuZGFyeV9ibG9jayA9IG1hcF9iaC5iX2Jsb2NrbnI7CisJCQlib3VuZGFyeV9iZGV2ID0gbWFwX2JoLmJfYmRldjsKKwkJfQorCQlpZiAocGFnZV9ibG9jaykgeworCQkJaWYgKG1hcF9iaC5iX2Jsb2NrbnIgIT0gYmxvY2tzW3BhZ2VfYmxvY2stMV0gKyAxKQorCQkJCWdvdG8gY29uZnVzZWQ7CisJCX0KKwkJYmxvY2tzW3BhZ2VfYmxvY2srK10gPSBtYXBfYmguYl9ibG9ja25yOworCQlib3VuZGFyeSA9IGJ1ZmZlcl9ib3VuZGFyeSgmbWFwX2JoKTsKKwkJYmRldiA9IG1hcF9iaC5iX2JkZXY7CisJCWlmIChibG9ja19pbl9maWxlID09IGxhc3RfYmxvY2spCisJCQlicmVhazsKKwkJYmxvY2tfaW5fZmlsZSsrOworCX0KKwlCVUdfT04ocGFnZV9ibG9jayA9PSAwKTsKKworCWZpcnN0X3VubWFwcGVkID0gcGFnZV9ibG9jazsKKworcGFnZV9pc19tYXBwZWQ6CisJZW5kX2luZGV4ID0gaV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaWYgKHBhZ2UtPmluZGV4ID49IGVuZF9pbmRleCkgeworCQkvKgorCQkgKiBUaGUgcGFnZSBzdHJhZGRsZXMgaV9zaXplLiAgSXQgbXVzdCBiZSB6ZXJvZWQgb3V0IG9uIGVhY2gKKwkJICogYW5kIGV2ZXJ5IHdyaXRlcGFnZSBpbnZva2F0aW9uIGJlY2F1c2UgaXQgbWF5IGJlIG1tYXBwZWQuCisJCSAqICJBIGZpbGUgaXMgbWFwcGVkIGluIG11bHRpcGxlcyBvZiB0aGUgcGFnZSBzaXplLiAgRm9yIGEgZmlsZQorCQkgKiB0aGF0IGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBwYWdlIHNpemUsIHRoZSByZW1haW5pbmcgbWVtb3J5CisJCSAqIGlzIHplcm9lZCB3aGVuIG1hcHBlZCwgYW5kIHdyaXRlcyB0byB0aGF0IHJlZ2lvbiBhcmUgbm90CisJCSAqIHdyaXR0ZW4gb3V0IHRvIHRoZSBmaWxlLiIKKwkJICovCisJCXVuc2lnbmVkIG9mZnNldCA9IGlfc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwkJY2hhciAqa2FkZHI7CisKKwkJaWYgKHBhZ2UtPmluZGV4ID4gZW5kX2luZGV4IHx8ICFvZmZzZXQpCisJCQlnb3RvIGNvbmZ1c2VkOworCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtc2V0KGthZGRyICsgb2Zmc2V0LCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQpOworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCX0KKworCS8qCisJICogVGhpcyBwYWdlIHdpbGwgZ28gdG8gQklPLiAgRG8gd2UgbmVlZCB0byBzZW5kIHRoaXMgQklPIG9mZiBmaXJzdD8KKwkgKi8KKwlpZiAoYmlvICYmICpsYXN0X2Jsb2NrX2luX2JpbyAhPSBibG9ja3NbMF0gLSAxKQorCQliaW8gPSBtcGFnZV9iaW9fc3VibWl0KFdSSVRFLCBiaW8pOworCithbGxvY19uZXc6CisJaWYgKGJpbyA9PSBOVUxMKSB7CisJCWJpbyA9IG1wYWdlX2FsbG9jKGJkZXYsIGJsb2Nrc1swXSA8PCAoYmxrYml0cyAtIDkpLAorCQkJCWJpb19nZXRfbnJfdmVjcyhiZGV2KSwgR0ZQX05PRlN8X19HRlBfSElHSCk7CisJCWlmIChiaW8gPT0gTlVMTCkKKwkJCWdvdG8gY29uZnVzZWQ7CisJfQorCisJLyoKKwkgKiBNdXN0IHRyeSB0byBhZGQgdGhlIHBhZ2UgYmVmb3JlIG1hcmtpbmcgdGhlIGJ1ZmZlciBjbGVhbiBvcgorCSAqIHRoZSBjb25mdXNlZCBmYWlsIHBhdGggYWJvdmUgKE9PTSkgd2lsbCBiZSB2ZXJ5IGNvbmZ1c2VkIHdoZW4KKwkgKiBpdCBmaW5kcyBhbGwgYmggbWFya2VkIGNsZWFuIChpLmUuIGl0IHdpbGwgbm90IHdyaXRlIGFueXRoaW5nKQorCSAqLworCWxlbmd0aCA9IGZpcnN0X3VubWFwcGVkIDw8IGJsa2JpdHM7CisJaWYgKGJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIGxlbmd0aCwgMCkgPCBsZW5ndGgpIHsKKwkJYmlvID0gbXBhZ2VfYmlvX3N1Ym1pdChXUklURSwgYmlvKTsKKwkJZ290byBhbGxvY19uZXc7CisJfQorCisJLyoKKwkgKiBPSywgd2UgaGF2ZSBvdXIgQklPLCBzbyB3ZSBjYW4gbm93IG1hcmsgdGhlIGJ1ZmZlcnMgY2xlYW4uICBNYWtlCisJICogc3VyZSB0byBvbmx5IGNsZWFuIGJ1ZmZlcnMgd2hpY2ggd2Uga25vdyB3ZSdsbCBiZSB3cml0aW5nLgorCSAqLworCWlmIChwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGhlYWQ7CisJCXVuc2lnbmVkIGJ1ZmZlcl9jb3VudGVyID0gMDsKKworCQlkbyB7CisJCQlpZiAoYnVmZmVyX2NvdW50ZXIrKyA9PSBmaXJzdF91bm1hcHBlZCkKKwkJCQlicmVhazsKKwkJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJfSB3aGlsZSAoYmggIT0gaGVhZCk7CisKKwkJLyoKKwkJICogd2UgY2Fubm90IGRyb3AgdGhlIGJoIGlmIHRoZSBwYWdlIGlzIG5vdCB1cHRvZGF0ZQorCQkgKiBvciBhIGNvbmN1cnJlbnQgcmVhZHBhZ2Ugd291bGQgZmFpbCB0byBzZXJpYWxpemUgd2l0aCB0aGUgYmgKKwkJICogYW5kIGl0IHdvdWxkIHJlYWQgZnJvbSBkaXNrIGJlZm9yZSB3ZSByZWFjaCB0aGUgcGxhdHRlci4KKwkJICovCisJCWlmIChidWZmZXJfaGVhZHNfb3Zlcl9saW1pdCAmJiBQYWdlVXB0b2RhdGUocGFnZSkpCisJCQl0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpOworCX0KKworCUJVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKKwlzZXRfcGFnZV93cml0ZWJhY2socGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJaWYgKGJvdW5kYXJ5IHx8IChmaXJzdF91bm1hcHBlZCAhPSBibG9ja3NfcGVyX3BhZ2UpKSB7CisJCWJpbyA9IG1wYWdlX2Jpb19zdWJtaXQoV1JJVEUsIGJpbyk7CisJCWlmIChib3VuZGFyeV9ibG9jaykgeworCQkJd3JpdGVfYm91bmRhcnlfYmxvY2soYm91bmRhcnlfYmRldiwKKwkJCQkJYm91bmRhcnlfYmxvY2ssIDEgPDwgYmxrYml0cyk7CisJCX0KKwl9IGVsc2UgeworCQkqbGFzdF9ibG9ja19pbl9iaW8gPSBibG9ja3NbYmxvY2tzX3Blcl9wYWdlIC0gMV07CisJfQorCWdvdG8gb3V0OworCitjb25mdXNlZDoKKwlpZiAoYmlvKQorCQliaW8gPSBtcGFnZV9iaW9fc3VibWl0KFdSSVRFLCBiaW8pOworCisJaWYgKHdyaXRlcGFnZV9mbikgeworCQkqcmV0ID0gKCp3cml0ZXBhZ2VfZm4pKHBhZ2UsIHdiYyk7CisJfSBlbHNlIHsKKwkJKnJldCA9IC1FQUdBSU47CisJCWdvdG8gb3V0OworCX0KKwkvKgorCSAqIFRoZSBjYWxsZXIgaGFzIGEgcmVmIG9uIHRoZSBpbm9kZSwgc28gKm1hcHBpbmcgaXMgc3RhYmxlCisJICovCisJaWYgKCpyZXQpIHsKKwkJaWYgKCpyZXQgPT0gLUVOT1NQQykKKwkJCXNldF9iaXQoQVNfRU5PU1BDLCAmbWFwcGluZy0+ZmxhZ3MpOworCQllbHNlCisJCQlzZXRfYml0KEFTX0VJTywgJm1hcHBpbmctPmZsYWdzKTsKKwl9CitvdXQ6CisJcmV0dXJuIGJpbzsKK30KKworLyoqCisgKiBtcGFnZV93cml0ZXBhZ2VzIC0gd2FsayB0aGUgbGlzdCBvZiBkaXJ0eSBwYWdlcyBvZiB0aGUgZ2l2ZW4KKyAqIGFkZHJlc3Mgc3BhY2UgYW5kIHdyaXRlcGFnZSgpIGFsbCBvZiB0aGVtLgorICogCisgKiBAbWFwcGluZzogYWRkcmVzcyBzcGFjZSBzdHJ1Y3R1cmUgdG8gd3JpdGUKKyAqIEB3YmM6IHN1YnRyYWN0IHRoZSBudW1iZXIgb2Ygd3JpdHRlbiBwYWdlcyBmcm9tICpAd2JjLT5ucl90b193cml0ZQorICogQGdldF9ibG9jazogdGhlIGZpbGVzeXN0ZW0ncyBibG9jayBtYXBwZXIgZnVuY3Rpb24uCisgKiAgICAgICAgICAgICBJZiB0aGlzIGlzIE5VTEwgdGhlbiB1c2UgYV9vcHMtPndyaXRlcGFnZS4gIE90aGVyd2lzZSwgZ28KKyAqICAgICAgICAgICAgIGRpcmVjdC10by1CSU8uCisgKgorICogVGhpcyBpcyBhIGxpYnJhcnkgZnVuY3Rpb24sIHdoaWNoIGltcGxlbWVudHMgdGhlIHdyaXRlcGFnZXMoKQorICogYWRkcmVzc19zcGFjZV9vcGVyYXRpb24uCisgKgorICogSWYgYSBwYWdlIGlzIGFscmVhZHkgdW5kZXIgSS9PLCBnZW5lcmljX3dyaXRlcGFnZXMoKSBza2lwcyBpdCwgZXZlbgorICogaWYgaXQncyBkaXJ0eS4gIFRoaXMgaXMgZGVzaXJhYmxlIGJlaGF2aW91ciBmb3IgbWVtb3J5LWNsZWFuaW5nIHdyaXRlYmFjaywKKyAqIGJ1dCBpdCBpcyBJTkNPUlJFQ1QgZm9yIGRhdGEtaW50ZWdyaXR5IHN5c3RlbSBjYWxscyBzdWNoIGFzIGZzeW5jKCkuICBmc3luYygpCisgKiBhbmQgbXN5bmMoKSBuZWVkIHRvIGd1YXJhbnRlZSB0aGF0IGFsbCB0aGUgZGF0YSB3aGljaCB3YXMgZGlydHkgYXQgdGhlIHRpbWUKKyAqIHRoZSBjYWxsIHdhcyBtYWRlIGdldCBuZXcgSS9PIHN0YXJ0ZWQgYWdhaW5zdCB0aGVtLiAgSWYgd2JjLT5zeW5jX21vZGUgaXMKKyAqIFdCX1NZTkNfQUxMIHRoZW4gd2Ugd2VyZSBjYWxsZWQgZm9yIGRhdGEgaW50ZWdyaXR5IGFuZCB3ZSBtdXN0IHdhaXQgZm9yCisgKiBleGlzdGluZyBJTyB0byBjb21wbGV0ZS4KKyAqLworaW50CittcGFnZV93cml0ZXBhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywgZ2V0X2Jsb2NrX3QgZ2V0X2Jsb2NrKQoreworCXJldHVybiBfX21wYWdlX3dyaXRlcGFnZXMobWFwcGluZywgd2JjLCBnZXRfYmxvY2ssCisJCW1hcHBpbmctPmFfb3BzLT53cml0ZXBhZ2UpOworfQorCitpbnQKK19fbXBhZ2Vfd3JpdGVwYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsIGdldF9ibG9ja190IGdldF9ibG9jaywKKwkJd3JpdGVwYWdlX3Qgd3JpdGVwYWdlX2ZuKQoreworCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkgPSBtYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOworCXN0cnVjdCBiaW8gKmJpbyA9IE5VTEw7CisJc2VjdG9yX3QgbGFzdF9ibG9ja19pbl9iaW8gPSAwOworCWludCByZXQgPSAwOworCWludCBkb25lID0gMDsKKwlpbnQgKCp3cml0ZXBhZ2UpKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7CisJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKKwlpbnQgbnJfcGFnZXM7CisJcGdvZmZfdCBpbmRleDsKKwlwZ29mZl90IGVuZCA9IC0xOwkJLyogSW5jbHVzaXZlICovCisJaW50IHNjYW5uZWQgPSAwOworCWludCBpc19yYW5nZSA9IDA7CisKKwlpZiAod2JjLT5ub25ibG9ja2luZyAmJiBiZGlfd3JpdGVfY29uZ2VzdGVkKGJkaSkpIHsKKwkJd2JjLT5lbmNvdW50ZXJlZF9jb25nZXN0aW9uID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJd3JpdGVwYWdlID0gTlVMTDsKKwlpZiAoZ2V0X2Jsb2NrID09IE5VTEwpCisJCXdyaXRlcGFnZSA9IG1hcHBpbmctPmFfb3BzLT53cml0ZXBhZ2U7CisKKwlwYWdldmVjX2luaXQoJnB2ZWMsIDApOworCWlmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX05PTkUpIHsKKwkJaW5kZXggPSBtYXBwaW5nLT53cml0ZWJhY2tfaW5kZXg7IC8qIFN0YXJ0IGZyb20gcHJldiBvZmZzZXQgKi8KKwl9IGVsc2UgeworCQlpbmRleCA9IDA7CQkJICAvKiB3aG9sZS1maWxlIHN3ZWVwICovCisJCXNjYW5uZWQgPSAxOworCX0KKwlpZiAod2JjLT5zdGFydCB8fCB3YmMtPmVuZCkgeworCQlpbmRleCA9IHdiYy0+c3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJZW5kID0gd2JjLT5lbmQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJaXNfcmFuZ2UgPSAxOworCQlzY2FubmVkID0gMTsKKwl9CityZXRyeToKKwl3aGlsZSAoIWRvbmUgJiYgKGluZGV4IDw9IGVuZCkgJiYKKwkJCShucl9wYWdlcyA9IHBhZ2V2ZWNfbG9va3VwX3RhZygmcHZlYywgbWFwcGluZywgJmluZGV4LAorCQkJUEFHRUNBQ0hFX1RBR19ESVJUWSwKKwkJCW1pbihlbmQgLSBpbmRleCwgKHBnb2ZmX3QpUEFHRVZFQ19TSVpFLTEpICsgMSkpKSB7CisJCXVuc2lnbmVkIGk7CisKKwkJc2Nhbm5lZCA9IDE7CisJCWZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsgaSsrKSB7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMucGFnZXNbaV07CisKKwkJCS8qCisJCQkgKiBBdCB0aGlzIHBvaW50IHdlIGhvbGQgbmVpdGhlciBtYXBwaW5nLT50cmVlX2xvY2sgbm9yCisJCQkgKiBsb2NrIG9uIHRoZSBwYWdlIGl0c2VsZjogdGhlIHBhZ2UgbWF5IGJlIHRydW5jYXRlZCBvcgorCQkJICogaW52YWxpZGF0ZWQgKGNoYW5naW5nIHBhZ2UtPm1hcHBpbmcgdG8gTlVMTCksIG9yIGV2ZW4KKwkJCSAqIHN3aXp6bGVkIGJhY2sgZnJvbSBzd2FwcGVyX3NwYWNlIHRvIHRtcGZzIGZpbGUKKwkJCSAqIG1hcHBpbmcKKwkJCSAqLworCisJCQlsb2NrX3BhZ2UocGFnZSk7CisKKwkJCWlmICh1bmxpa2VseShwYWdlLT5tYXBwaW5nICE9IG1hcHBpbmcpKSB7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmICh1bmxpa2VseShpc19yYW5nZSkgJiYgcGFnZS0+aW5kZXggPiBlbmQpIHsKKwkJCQlkb25lID0gMTsKKwkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHdiYy0+c3luY19tb2RlICE9IFdCX1NZTkNfTk9ORSkKKwkJCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCisJCQlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSB8fAorCQkJCQkhY2xlYXJfcGFnZV9kaXJ0eV9mb3JfaW8ocGFnZSkpIHsKKwkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHdyaXRlcGFnZSkgeworCQkJCXJldCA9ICgqd3JpdGVwYWdlKShwYWdlLCB3YmMpOworCQkJCWlmIChyZXQpIHsKKwkJCQkJaWYgKHJldCA9PSAtRU5PU1BDKQorCQkJCQkJc2V0X2JpdChBU19FTk9TUEMsCisJCQkJCQkJJm1hcHBpbmctPmZsYWdzKTsKKwkJCQkJZWxzZQorCQkJCQkJc2V0X2JpdChBU19FSU8sCisJCQkJCQkJJm1hcHBpbmctPmZsYWdzKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWJpbyA9IF9fbXBhZ2Vfd3JpdGVwYWdlKGJpbywgcGFnZSwgZ2V0X2Jsb2NrLAorCQkJCQkJJmxhc3RfYmxvY2tfaW5fYmlvLCAmcmV0LCB3YmMsCisJCQkJCQl3cml0ZXBhZ2VfZm4pOworCQkJfQorCQkJaWYgKHJldCB8fCAoLS0od2JjLT5ucl90b193cml0ZSkgPD0gMCkpCisJCQkJZG9uZSA9IDE7CisJCQlpZiAod2JjLT5ub25ibG9ja2luZyAmJiBiZGlfd3JpdGVfY29uZ2VzdGVkKGJkaSkpIHsKKwkJCQl3YmMtPmVuY291bnRlcmVkX2Nvbmdlc3Rpb24gPSAxOworCQkJCWRvbmUgPSAxOworCQkJfQorCQl9CisJCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlpZiAoIXNjYW5uZWQgJiYgIWRvbmUpIHsKKwkJLyoKKwkJICogV2UgaGl0IHRoZSBsYXN0IHBhZ2UgYW5kIHRoZXJlIGlzIG1vcmUgd29yayB0byBiZSBkb25lOiB3cmFwCisJCSAqIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlCisJCSAqLworCQlzY2FubmVkID0gMTsKKwkJaW5kZXggPSAwOworCQlnb3RvIHJldHJ5OworCX0KKwlpZiAoIWlzX3JhbmdlKQorCQltYXBwaW5nLT53cml0ZWJhY2tfaW5kZXggPSBpbmRleDsKKwlpZiAoYmlvKQorCQltcGFnZV9iaW9fc3VibWl0KFdSSVRFLCBiaW8pOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1wYWdlX3dyaXRlcGFnZXMpOworRVhQT1JUX1NZTUJPTChfX21wYWdlX3dyaXRlcGFnZXMpOworCitpbnQgbXBhZ2Vfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBnZXRfYmxvY2tfdCBnZXRfYmxvY2ssCisJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGJpbyAqYmlvOworCXNlY3Rvcl90IGxhc3RfYmxvY2tfaW5fYmlvID0gMDsKKworCWJpbyA9IF9fbXBhZ2Vfd3JpdGVwYWdlKE5VTEwsIHBhZ2UsIGdldF9ibG9jaywKKwkJCSZsYXN0X2Jsb2NrX2luX2JpbywgJnJldCwgd2JjLCBOVUxMKTsKKwlpZiAoYmlvKQorCQltcGFnZV9iaW9fc3VibWl0KFdSSVRFLCBiaW8pOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wobXBhZ2Vfd3JpdGVwYWdlKTsKZGlmZiAtLWdpdCBhL2ZzL21zZG9zL01ha2VmaWxlIGIvZnMvbXNkb3MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2NzY0NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL21zZG9zL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IG1zZG9zIGZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19NU0RPU19GUykgKz0gbXNkb3MubworCittc2Rvcy15IDo9IG5hbWVpLm8KZGlmZiAtLWdpdCBhL2ZzL21zZG9zL25hbWVpLmMgYi9mcy9tc2Rvcy9uYW1laS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NGY1MTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9tc2Rvcy9uYW1laS5jCkBAIC0wLDAgKzEsNzExIEBACisvKgorICogIGxpbnV4L2ZzL21zZG9zL25hbWVpLmMKKyAqCisgKiAgV3JpdHRlbiAxOTkyLDE5OTMgYnkgV2VybmVyIEFsbWVzYmVyZ2VyCisgKiAgSGlkZGVuIGZpbGVzIDE5OTUgYnkgQWxiZXJ0IENhaGFsYW4gPGFsYmVydEBjY3MubmV1LmVkdT4gPGFkY0Bjb2UubmV1LmVkdT4KKyAqICBSZXdyaXR0ZW4gZm9yIGNvbnN0YW50IGludW1iZXJzIDE5OTkgYnkgQWwgVmlybworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tc2Rvc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKy8qIE1TLURPUyAiZGV2aWNlIHNwZWNpYWwgZmlsZXMiICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAqcmVzZXJ2ZWRfbmFtZXNbXSA9IHsKKwkiQ09OICAgICAiLCAiUFJOICAgICAiLCAiTlVMICAgICAiLCAiQVVYICAgICAiLAorCSJMUFQxICAgICIsICJMUFQyICAgICIsICJMUFQzICAgICIsICJMUFQ0ICAgICIsCisJIkNPTTEgICAgIiwgIkNPTTIgICAgIiwgIkNPTTMgICAgIiwgIkNPTTQgICAgIiwKKwlOVUxMCit9OworCisvKiBDaGFyYWN0ZXJzIHRoYXQgYXJlIHVuZGVzaXJhYmxlIGluIGFuIE1TLURPUyBmaWxlIG5hbWUgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJhZF9jaGFyc1tdID0gIio/PD58XCIiOworc3RhdGljIHVuc2lnbmVkIGNoYXIgYmFkX2lmX3N0cmljdF9wY1tdID0gIis9LDsgIjsKKy8qIEdFTURPUyBpcyBsZXNzIHJlc3RyaWN0aXZlICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBiYWRfaWZfc3RyaWN0X2F0YXJpW10gPSAiICI7CisKKyNkZWZpbmUgYmFkX2lmX3N0cmljdChvcHRzKSBcCisJKChvcHRzKS0+YXRhcmkgPyBiYWRfaWZfc3RyaWN0X2F0YXJpIDogYmFkX2lmX3N0cmljdF9wYykKKworLyoqKioqIEZvcm1hdHMgYW4gTVMtRE9TIGZpbGUgbmFtZS4gUmVqZWN0cyBpbnZhbGlkIG5hbWVzLiAqLworc3RhdGljIGludCBtc2Rvc19mb3JtYXRfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLCBpbnQgbGVuLAorCQkJICAgICB1bnNpZ25lZCBjaGFyICpyZXMsIHN0cnVjdCBmYXRfbW91bnRfb3B0aW9ucyAqb3B0cykKKwkvKgorCSAqIG5hbWUgaXMgdGhlIHByb3Bvc2VkIG5hbWUsIGxlbiBpcyBpdHMgbGVuZ3RoLCByZXMgaXMKKwkgKiB0aGUgcmVzdWx0aW5nIG5hbWUsIG9wdHMtPm5hbWVfY2hlY2sgaXMgZWl0aGVyIChyKWVsYXhlZCwKKwkgKiAobilvcm1hbCBvciAocyl0cmljdCwgb3B0cy0+ZG90c09LIGFsbG93cyBkb3RzIGF0IHRoZQorCSAqIGJlZ2lubmluZyBvZiBuYW1lIChmb3IgaGlkZGVuIGZpbGVzKQorCSAqLworeworCXVuc2lnbmVkIGNoYXIgKndhbGs7CisJY29uc3QgdW5zaWduZWQgY2hhciAqKnJlc2VydmVkOworCXVuc2lnbmVkIGNoYXIgYzsKKwlpbnQgc3BhY2U7CisKKwlpZiAobmFtZVswXSA9PSAnLicpIHsJLyogZG90ZmlsZSBiZWNhdXNlIC4gYW5kIC4uIGFscmVhZHkgZG9uZSAqLworCQlpZiAob3B0cy0+ZG90c09LKSB7CisJCQkvKiBHZXQgcmlkIG9mIGRvdCAtIHRlc3QgZm9yIGl0IGVsc2V3aGVyZSAqLworCQkJbmFtZSsrOworCQkJbGVuLS07CisJCX0gZWxzZSBpZiAoIW9wdHMtPmF0YXJpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qCisJICogZGlzYWxsb3cgbmFtZXMgdGhhdCBfcmVhbGx5XyBzdGFydCB3aXRoIGEgZG90IGZvciBNUy1ET1MsCisJICogR0VNRE9TIGRvZXMgbm90IGNhcmUKKwkgKi8KKwlzcGFjZSA9ICFvcHRzLT5hdGFyaTsKKwljID0gMDsKKwlmb3IgKHdhbGsgPSByZXM7IGxlbiAmJiB3YWxrIC0gcmVzIDwgODsgd2FsaysrKSB7CisJCWMgPSAqbmFtZSsrOworCQlsZW4tLTsKKwkJaWYgKG9wdHMtPm5hbWVfY2hlY2sgIT0gJ3InICYmIHN0cmNocihiYWRfY2hhcnMsIGMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChvcHRzLT5uYW1lX2NoZWNrID09ICdzJyAmJiBzdHJjaHIoYmFkX2lmX3N0cmljdChvcHRzKSwgYykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onICYmIG9wdHMtPm5hbWVfY2hlY2sgPT0gJ3MnKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjIDwgJyAnIHx8IGMgPT0gJzonIHx8IGMgPT0gJ1xcJykKKwkJCXJldHVybiAtRUlOVkFMOworCS8qCisJICogMHhFNSBpcyBsZWdhbCBhcyBhIGZpcnN0IGNoYXJhY3RlciwgYnV0IHdlIG11c3Qgc3Vic3RpdHV0ZQorCSAqIDB4MDUgYmVjYXVzZSAweEU1IG1hcmtzIGRlbGV0ZWQgZmlsZXMuICBZZXMsIERPUyByZWFsbHkKKwkgKiBkb2VzIHRoaXMuCisJICogSXQgc2VlbXMgdGhhdCBNaWNyb3NvZnQgaGFja2VkIERPUyB0byBzdXBwb3J0IG5vbi1VUworCSAqIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIDB4RTUgY2hhcmFjdGVyIHdhcyBhbHJlYWR5IGluIHVzZSB0bworCSAqIG1hcmsgZGVsZXRlZCBmaWxlcy4KKwkgKi8KKwkJaWYgKChyZXMgPT0gd2FsaykgJiYgKGMgPT0gMHhFNSkpCisJCQljID0gMHgwNTsKKwkJaWYgKGMgPT0gJy4nKQorCQkJYnJlYWs7CisJCXNwYWNlID0gKGMgPT0gJyAnKTsKKwkJKndhbGsgPSAoIW9wdHMtPm5vY2FzZSAmJiBjID49ICdhJyAmJiBjIDw9ICd6JykgPyBjIC0gMzIgOiBjOworCX0KKwlpZiAoc3BhY2UpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChvcHRzLT5uYW1lX2NoZWNrID09ICdzJyAmJiBsZW4gJiYgYyAhPSAnLicpIHsKKwkJYyA9ICpuYW1lKys7CisJCWxlbi0tOworCQlpZiAoYyAhPSAnLicpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJd2hpbGUgKGMgIT0gJy4nICYmIGxlbi0tKQorCQljID0gKm5hbWUrKzsKKwlpZiAoYyA9PSAnLicpIHsKKwkJd2hpbGUgKHdhbGsgLSByZXMgPCA4KQorCQkJKndhbGsrKyA9ICcgJzsKKwkJd2hpbGUgKGxlbiA+IDAgJiYgd2FsayAtIHJlcyA8IE1TRE9TX05BTUUpIHsKKwkJCWMgPSAqbmFtZSsrOworCQkJbGVuLS07CisJCQlpZiAob3B0cy0+bmFtZV9jaGVjayAhPSAncicgJiYgc3RyY2hyKGJhZF9jaGFycywgYykpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAob3B0cy0+bmFtZV9jaGVjayA9PSAncycgJiYKKwkJCSAgICBzdHJjaHIoYmFkX2lmX3N0cmljdChvcHRzKSwgYykpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoYyA8ICcgJyB8fCBjID09ICc6JyB8fCBjID09ICdcXCcpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoYyA9PSAnLicpIHsKKwkJCQlpZiAob3B0cy0+bmFtZV9jaGVjayA9PSAncycpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onICYmIG9wdHMtPm5hbWVfY2hlY2sgPT0gJ3MnKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJc3BhY2UgPSBjID09ICcgJzsKKwkJCWlmICghb3B0cy0+bm9jYXNlICYmIGMgPj0gJ2EnICYmIGMgPD0gJ3onKQorCQkJCSp3YWxrKysgPSBjIC0gMzI7CisJCQllbHNlCisJCQkJKndhbGsrKyA9IGM7CisJCX0KKwkJaWYgKHNwYWNlKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChvcHRzLT5uYW1lX2NoZWNrID09ICdzJyAmJiBsZW4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJd2hpbGUgKHdhbGsgLSByZXMgPCBNU0RPU19OQU1FKQorCQkqd2FsaysrID0gJyAnOworCWlmICghb3B0cy0+YXRhcmkpCisJCS8qIEdFTURPUyBpcyBsZXNzIHN0dXBpZCBhbmQgaGFzIG5vIHJlc2VydmVkIG5hbWVzICovCisJCWZvciAocmVzZXJ2ZWQgPSByZXNlcnZlZF9uYW1lczsgKnJlc2VydmVkOyByZXNlcnZlZCsrKQorCQkJaWYgKCFzdHJuY21wKHJlcywgKnJlc2VydmVkLCA4KSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqIExvY2F0ZXMgYSBkaXJlY3RvcnkgZW50cnkuICBVc2VzIHVuZm9ybWF0dGVkIG5hbWUuICovCitzdGF0aWMgaW50IG1zZG9zX2ZpbmQoc3RydWN0IGlub2RlICpkaXIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUsIGludCBsZW4sCisJCSAgICAgIHN0cnVjdCBmYXRfc2xvdF9pbmZvICpzaW5mbykKK3sKKwlzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpID0gTVNET1NfU0IoZGlyLT5pX3NiKTsKKwl1bnNpZ25lZCBjaGFyIG1zZG9zX25hbWVbTVNET1NfTkFNRV07CisJaW50IGVycjsKKworCWVyciA9IG1zZG9zX2Zvcm1hdF9uYW1lKG5hbWUsIGxlbiwgbXNkb3NfbmFtZSwgJnNiaS0+b3B0aW9ucyk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwllcnIgPSBmYXRfc2NhbihkaXIsIG1zZG9zX25hbWUsIHNpbmZvKTsKKwlpZiAoIWVyciAmJiBzYmktPm9wdGlvbnMuZG90c09LKSB7CisJCWlmIChuYW1lWzBdID09ICcuJykgeworCQkJaWYgKCEoc2luZm8tPmRlLT5hdHRyICYgQVRUUl9ISURERU4pKQorCQkJCWVyciA9IC1FTk9FTlQ7CisJCX0gZWxzZSB7CisJCQlpZiAoc2luZm8tPmRlLT5hdHRyICYgQVRUUl9ISURERU4pCisJCQkJZXJyID0gLUVOT0VOVDsKKwkJfQorCQlpZiAoZXJyKQorCQkJYnJlbHNlKHNpbmZvLT5iaCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDb21wdXRlIHRoZSBoYXNoIGZvciB0aGUgbXNkb3MgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZW50cnkuCisgKiBOb3RlOiBpZiB0aGUgbmFtZSBpcyBpbnZhbGlkLCB3ZSBsZWF2ZSB0aGUgaGFzaCBjb2RlIHVuY2hhbmdlZCBzbworICogdGhhdCB0aGUgZXhpc3RpbmcgZGVudHJ5IGNhbiBiZSB1c2VkLiBUaGUgbXNkb3MgZnMgcm91dGluZXMgd2lsbAorICogcmV0dXJuIEVOT0VOVCBvciBFSU5WQUwgYXMgYXBwcm9wcmlhdGUuCisgKi8KK3N0YXRpYyBpbnQgbXNkb3NfaGFzaChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxc3RyKQoreworCXN0cnVjdCBmYXRfbW91bnRfb3B0aW9ucyAqb3B0aW9ucyA9ICZNU0RPU19TQihkZW50cnktPmRfc2IpLT5vcHRpb25zOworCXVuc2lnbmVkIGNoYXIgbXNkb3NfbmFtZVtNU0RPU19OQU1FXTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IG1zZG9zX2Zvcm1hdF9uYW1lKHFzdHItPm5hbWUsIHFzdHItPmxlbiwgbXNkb3NfbmFtZSwgb3B0aW9ucyk7CisJaWYgKCFlcnJvcikKKwkJcXN0ci0+aGFzaCA9IGZ1bGxfbmFtZV9oYXNoKG1zZG9zX25hbWUsIE1TRE9TX05BTUUpOworCXJldHVybiAwOworfQorCisvKgorICogQ29tcGFyZSB0d28gbXNkb3MgbmFtZXMuIElmIGVpdGhlciBvZiB0aGUgbmFtZXMgYXJlIGludmFsaWQsCisgKiB3ZSBmYWxsIGJhY2sgdG8gZG9pbmcgdGhlIHN0YW5kYXJkIG5hbWUgY29tcGFyaXNvbi4KKyAqLworc3RhdGljIGludCBtc2Rvc19jbXAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqYSwgc3RydWN0IHFzdHIgKmIpCit7CisJc3RydWN0IGZhdF9tb3VudF9vcHRpb25zICpvcHRpb25zID0gJk1TRE9TX1NCKGRlbnRyeS0+ZF9zYiktPm9wdGlvbnM7CisJdW5zaWduZWQgY2hhciBhX21zZG9zX25hbWVbTVNET1NfTkFNRV0sIGJfbXNkb3NfbmFtZVtNU0RPU19OQU1FXTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IG1zZG9zX2Zvcm1hdF9uYW1lKGEtPm5hbWUsIGEtPmxlbiwgYV9tc2Rvc19uYW1lLCBvcHRpb25zKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb2xkX2NvbXBhcmU7CisJZXJyb3IgPSBtc2Rvc19mb3JtYXRfbmFtZShiLT5uYW1lLCBiLT5sZW4sIGJfbXNkb3NfbmFtZSwgb3B0aW9ucyk7CisJaWYgKGVycm9yKQorCQlnb3RvIG9sZF9jb21wYXJlOworCWVycm9yID0gbWVtY21wKGFfbXNkb3NfbmFtZSwgYl9tc2Rvc19uYW1lLCBNU0RPU19OQU1FKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7CisKK29sZF9jb21wYXJlOgorCWVycm9yID0gMTsKKwlpZiAoYS0+bGVuID09IGItPmxlbikKKwkJZXJyb3IgPSBtZW1jbXAoYS0+bmFtZSwgYi0+bmFtZSwgYS0+bGVuKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBtc2Rvc19kZW50cnlfb3BlcmF0aW9ucyA9IHsKKwkuZF9oYXNoCQk9IG1zZG9zX2hhc2gsCisJLmRfY29tcGFyZQk9IG1zZG9zX2NtcCwKK307CisKKy8qCisgKiBBVi4gV3JhcHBlcnMgZm9yIEZBVCBzYiBvcGVyYXRpb25zLiBJcyBpdCB3aXNlPworICovCisKKy8qKioqKiBHZXQgaW5vZGUgdXNpbmcgZGlyZWN0b3J5IGFuZCBuYW1lICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqbXNkb3NfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKKwlzdHJ1Y3QgZmF0X3Nsb3RfaW5mbyBzaW5mbzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlpbnQgcmVzOworCisJZGVudHJ5LT5kX29wID0gJm1zZG9zX2RlbnRyeV9vcGVyYXRpb25zOworCisJbG9ja19rZXJuZWwoKTsKKwlyZXMgPSBtc2Rvc19maW5kKGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCAmc2luZm8pOworCWlmIChyZXMgPT0gLUVOT0VOVCkKKwkJZ290byBhZGQ7CisJaWYgKHJlcyA8IDApCisJCWdvdG8gb3V0OworCWlub2RlID0gZmF0X2J1aWxkX2lub2RlKHNiLCBzaW5mby5kZSwgc2luZm8uaV9wb3MpOworCWJyZWxzZShzaW5mby5iaCk7CisJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJcmVzID0gUFRSX0VSUihpbm9kZSk7CisJCWdvdG8gb3V0OworCX0KK2FkZDoKKwlyZXMgPSAwOworCWRlbnRyeSA9IGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOworCWlmIChkZW50cnkpCisJCWRlbnRyeS0+ZF9vcCA9ICZtc2Rvc19kZW50cnlfb3BlcmF0aW9uczsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJaWYgKCFyZXMpCisJCXJldHVybiBkZW50cnk7CisJcmV0dXJuIEVSUl9QVFIocmVzKTsKK30KKworLyoqKioqIENyZWF0ZXMgYSBkaXJlY3RvcnkgZW50cnkgKG5hbWUgaXMgYWxyZWFkeSBmb3JtYXR0ZWQpLiAqLworc3RhdGljIGludCBtc2Rvc19hZGRfZW50cnkoc3RydWN0IGlub2RlICpkaXIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUsCisJCQkgICBpbnQgaXNfZGlyLCBpbnQgaXNfaGlkLCBpbnQgY2x1c3RlciwKKwkJCSAgIHN0cnVjdCB0aW1lc3BlYyAqdHMsIHN0cnVjdCBmYXRfc2xvdF9pbmZvICpzaW5mbykKK3sKKwlzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5IGRlOworCV9fbGUxNiB0aW1lLCBkYXRlOworCWludCBlcnI7CisKKwltZW1jcHkoZGUubmFtZSwgbmFtZSwgTVNET1NfTkFNRSk7CisJZGUuYXR0ciA9IGlzX2RpciA/IEFUVFJfRElSIDogQVRUUl9BUkNIOworCWlmIChpc19oaWQpCisJCWRlLmF0dHIgfD0gQVRUUl9ISURERU47CisJZGUubGNhc2UgPSAwOworCWZhdF9kYXRlX3VuaXgyZG9zKHRzLT50dl9zZWMsICZ0aW1lLCAmZGF0ZSk7CisJZGUuY2RhdGUgPSBkZS5hZGF0ZSA9IDA7CisJZGUuY3RpbWUgPSAwOworCWRlLmN0aW1lX2NzID0gMDsKKwlkZS50aW1lID0gdGltZTsKKwlkZS5kYXRlID0gZGF0ZTsKKwlkZS5zdGFydCA9IGNwdV90b19sZTE2KGNsdXN0ZXIpOworCWRlLnN0YXJ0aGkgPSBjcHVfdG9fbGUxNihjbHVzdGVyID4+IDE2KTsKKwlkZS5zaXplID0gMDsKKworCWVyciA9IGZhdF9hZGRfZW50cmllcyhkaXIsICZkZSwgMSwgc2luZm8pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlkaXItPmlfY3RpbWUgPSBkaXItPmlfbXRpbWUgPSAqdHM7CisJaWYgKElTX0RJUlNZTkMoZGlyKSkKKwkJKHZvaWQpZmF0X3N5bmNfaW5vZGUoZGlyKTsKKwllbHNlCisJCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKKworCXJldHVybiAwOworfQorCisvKioqKiogQ3JlYXRlIGEgZmlsZSAqLworc3RhdGljIGludCBtc2Rvc19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGZhdF9zbG90X2luZm8gc2luZm87CisJc3RydWN0IHRpbWVzcGVjIHRzOworCXVuc2lnbmVkIGNoYXIgbXNkb3NfbmFtZVtNU0RPU19OQU1FXTsKKwlpbnQgZXJyLCBpc19oaWQ7CisKKwlsb2NrX2tlcm5lbCgpOworCisJZXJyID0gbXNkb3NfZm9ybWF0X25hbWUoZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLAorCQkJCW1zZG9zX25hbWUsICZNU0RPU19TQihzYiktPm9wdGlvbnMpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWlzX2hpZCA9IChkZW50cnktPmRfbmFtZS5uYW1lWzBdID09ICcuJykgJiYgKG1zZG9zX25hbWVbMF0gIT0gJy4nKTsKKwkvKiBIYXZlIHRvIGRvIGl0IGR1ZSB0byBmb28gdnMuIC5mb28gY29uZmxpY3RzICovCisJaWYgKCFmYXRfc2NhbihkaXIsIG1zZG9zX25hbWUsICZzaW5mbykpIHsKKwkJYnJlbHNlKHNpbmZvLmJoKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJdHMgPSBDVVJSRU5UX1RJTUVfU0VDOworCWVyciA9IG1zZG9zX2FkZF9lbnRyeShkaXIsIG1zZG9zX25hbWUsIDAsIGlzX2hpZCwgMCwgJnRzLCAmc2luZm8pOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWlub2RlID0gZmF0X2J1aWxkX2lub2RlKHNiLCBzaW5mby5kZSwgc2luZm8uaV9wb3MpOworCWJyZWxzZShzaW5mby5iaCk7CisJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJCWdvdG8gb3V0OworCX0KKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSB0czsKKwkvKiB0aW1lc3RhbXAgaXMgYWxyZWFkeSB3cml0dGVuLCBzbyBtYXJrX2lub2RlX2RpcnR5KCkgaXMgdW5uZWVkZWQuICovCisKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioqKiogUmVtb3ZlIGEgZGlyZWN0b3J5ICovCitzdGF0aWMgaW50IG1zZG9zX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZmF0X3Nsb3RfaW5mbyBzaW5mbzsKKwlpbnQgZXJyOworCisJbG9ja19rZXJuZWwoKTsKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgdGhlIGRpcmVjdG9yeSBpcyBub3QgaW4gdXNlLCB0aGVuIGNoZWNrCisJICogd2hldGhlciBpdCBpcyBlbXB0eS4KKwkgKi8KKwllcnIgPSBmYXRfZGlyX2VtcHR5KGlub2RlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSBtc2Rvc19maW5kKGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCAmc2luZm8pOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gZmF0X3JlbW92ZV9lbnRyaWVzKGRpciwgJnNpbmZvKTsJLyogYW5kIHJlbGVhc2VzIGJoICovCisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZGlyLT5pX25saW5rLS07CisKKwlpbm9kZS0+aV9ubGluayA9IDA7CisJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWZhdF9kZXRhY2goaW5vZGUpOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKioqKiBNYWtlIGEgZGlyZWN0b3J5ICovCitzdGF0aWMgaW50IG1zZG9zX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IGZhdF9zbG90X2luZm8gc2luZm87CisJc3RydWN0IGlub2RlICppbm9kZTsKKwl1bnNpZ25lZCBjaGFyIG1zZG9zX25hbWVbTVNET1NfTkFNRV07CisJc3RydWN0IHRpbWVzcGVjIHRzOworCWludCBlcnIsIGlzX2hpZCwgY2x1c3RlcjsKKworCWxvY2tfa2VybmVsKCk7CisKKwllcnIgPSBtc2Rvc19mb3JtYXRfbmFtZShkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sCisJCQkJbXNkb3NfbmFtZSwgJk1TRE9TX1NCKHNiKS0+b3B0aW9ucyk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJaXNfaGlkID0gKGRlbnRyeS0+ZF9uYW1lLm5hbWVbMF0gPT0gJy4nKSAmJiAobXNkb3NfbmFtZVswXSAhPSAnLicpOworCS8qIGZvbyB2cyAuZm9vIHNpdHVhdGlvbiAqLworCWlmICghZmF0X3NjYW4oZGlyLCBtc2Rvc19uYW1lLCAmc2luZm8pKSB7CisJCWJyZWxzZShzaW5mby5iaCk7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXRzID0gQ1VSUkVOVF9USU1FX1NFQzsKKwljbHVzdGVyID0gZmF0X2FsbG9jX25ld19kaXIoZGlyLCAmdHMpOworCWlmIChjbHVzdGVyIDwgMCkgeworCQllcnIgPSBjbHVzdGVyOworCQlnb3RvIG91dDsKKwl9CisJZXJyID0gbXNkb3NfYWRkX2VudHJ5KGRpciwgbXNkb3NfbmFtZSwgMSwgaXNfaGlkLCBjbHVzdGVyLCAmdHMsICZzaW5mbyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZTsKKwlkaXItPmlfbmxpbmsrKzsKKworCWlub2RlID0gZmF0X2J1aWxkX2lub2RlKHNiLCBzaW5mby5kZSwgc2luZm8uaV9wb3MpOworCWJyZWxzZShzaW5mby5iaCk7CisJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJCS8qIHRoZSBkaXJlY3Rvcnkgd2FzIGNvbXBsZXRlZCwganVzdCByZXR1cm4gYSBlcnJvciAqLworCQlnb3RvIG91dDsKKwl9CisJaW5vZGUtPmlfbmxpbmsgPSAyOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IHRzOworCS8qIHRpbWVzdGFtcCBpcyBhbHJlYWR5IHdyaXR0ZW4sIHNvIG1hcmtfaW5vZGVfZGlydHkoKSBpcyB1bm5lZWRlZC4gKi8KKworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7CisKK291dF9mcmVlOgorCWZhdF9mcmVlX2NsdXN0ZXJzKGRpciwgY2x1c3Rlcik7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisKKy8qKioqKiBVbmxpbmsgYSBmaWxlICovCitzdGF0aWMgaW50IG1zZG9zX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGZhdF9zbG90X2luZm8gc2luZm87CisJaW50IGVycjsKKworCWxvY2tfa2VybmVsKCk7CisJZXJyID0gbXNkb3NfZmluZChkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgJnNpbmZvKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IGZhdF9yZW1vdmVfZW50cmllcyhkaXIsICZzaW5mbyk7CS8qIGFuZCByZWxlYXNlcyBiaCAqLworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWlub2RlLT5pX25saW5rID0gMDsKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJZmF0X2RldGFjaChpbm9kZSk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkb19tc2Rvc19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCB1bnNpZ25lZCBjaGFyICpvbGRfbmFtZSwKKwkJCSAgIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCQkgICBzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsIHVuc2lnbmVkIGNoYXIgKm5ld19uYW1lLAorCQkJICAgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSwgaW50IGlzX2hpZCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRvdGRvdF9iaDsKKwlzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICpkb3Rkb3RfZGU7CisJbG9mZl90IGRvdGRvdF9pX3BvczsKKwlzdHJ1Y3QgaW5vZGUgKm9sZF9pbm9kZSwgKm5ld19pbm9kZTsKKwlzdHJ1Y3QgZmF0X3Nsb3RfaW5mbyBvbGRfc2luZm8sIHNpbmZvOworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwlpbnQgZXJyLCBvbGRfYXR0cnMsIGlzX2RpciwgdXBkYXRlX2RvdGRvdCwgY29ycnVwdCA9IDA7CisKKwlvbGRfc2luZm8uYmggPSBzaW5mby5iaCA9IGRvdGRvdF9iaCA9IE5VTEw7CisJb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKwluZXdfaW5vZGUgPSBuZXdfZGVudHJ5LT5kX2lub2RlOworCisJZXJyID0gZmF0X3NjYW4ob2xkX2Rpciwgb2xkX25hbWUsICZvbGRfc2luZm8pOworCWlmIChlcnIpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJaXNfZGlyID0gU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSk7CisJdXBkYXRlX2RvdGRvdCA9IChpc19kaXIgJiYgb2xkX2RpciAhPSBuZXdfZGlyKTsKKwlpZiAodXBkYXRlX2RvdGRvdCkgeworCQlpZiAoZmF0X2dldF9kb3Rkb3RfZW50cnkob2xkX2lub2RlLCAmZG90ZG90X2JoLCAmZG90ZG90X2RlLAorCQkJCQkgJmRvdGRvdF9pX3BvcykgPCAwKSB7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlvbGRfYXR0cnMgPSBNU0RPU19JKG9sZF9pbm9kZSktPmlfYXR0cnM7CisJZXJyID0gZmF0X3NjYW4obmV3X2RpciwgbmV3X25hbWUsICZzaW5mbyk7CisJaWYgKCFlcnIpIHsKKwkJaWYgKCFuZXdfaW5vZGUpIHsKKwkJCS8qICJmb28iIC0+ICIuZm9vIiBjYXNlLiBqdXN0IGNoYW5nZSB0aGUgQVRUUl9ISURERU4gKi8KKwkJCWlmIChzaW5mby5kZSAhPSBvbGRfc2luZm8uZGUpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaWYgKGlzX2hpZCkKKwkJCQlNU0RPU19JKG9sZF9pbm9kZSktPmlfYXR0cnMgfD0gQVRUUl9ISURERU47CisJCQllbHNlCisJCQkJTVNET1NfSShvbGRfaW5vZGUpLT5pX2F0dHJzICY9IH5BVFRSX0hJRERFTjsKKwkJCWlmIChJU19ESVJTWU5DKG9sZF9kaXIpKSB7CisJCQkJZXJyID0gZmF0X3N5bmNfaW5vZGUob2xkX2lub2RlKTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCU1TRE9TX0kob2xkX2lub2RlKS0+aV9hdHRycyA9IG9sZF9hdHRyczsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJbWFya19pbm9kZV9kaXJ0eShvbGRfaW5vZGUpOworCisJCQlvbGRfZGlyLT5pX3ZlcnNpb24rKzsKKwkJCW9sZF9kaXItPmlfY3RpbWUgPSBvbGRfZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwkJCWlmIChJU19ESVJTWU5DKG9sZF9kaXIpKQorCQkJCSh2b2lkKWZhdF9zeW5jX2lub2RlKG9sZF9kaXIpOworCQkJZWxzZQorCQkJCW1hcmtfaW5vZGVfZGlydHkob2xkX2Rpcik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXRzID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpZiAobmV3X2lub2RlKSB7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJaWYgKE1TRE9TX0kobmV3X2lub2RlKS0+aV9wb3MgIT0gc2luZm8uaV9wb3MpIHsKKwkJCS8qIFdURj8/PyBDcnkgYW5kIGZhaWwuICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtc2Rvc19yZW5hbWU6IGZzIGNvcnJ1cHRlZFxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChpc19kaXIpIHsKKwkJCWVyciA9IGZhdF9kaXJfZW1wdHkobmV3X2lub2RlKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisJCX0KKwkJZmF0X2RldGFjaChuZXdfaW5vZGUpOworCX0gZWxzZSB7CisJCWVyciA9IG1zZG9zX2FkZF9lbnRyeShuZXdfZGlyLCBuZXdfbmFtZSwgaXNfZGlyLCBpc19oaWQsIDAsCisJCQkJICAgICAgJnRzLCAmc2luZm8pOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfQorCW5ld19kaXItPmlfdmVyc2lvbisrOworCisJZmF0X2RldGFjaChvbGRfaW5vZGUpOworCWZhdF9hdHRhY2gob2xkX2lub2RlLCBzaW5mby5pX3Bvcyk7CisJaWYgKGlzX2hpZCkKKwkJTVNET1NfSShvbGRfaW5vZGUpLT5pX2F0dHJzIHw9IEFUVFJfSElEREVOOworCWVsc2UKKwkJTVNET1NfSShvbGRfaW5vZGUpLT5pX2F0dHJzICY9IH5BVFRSX0hJRERFTjsKKwlpZiAoSVNfRElSU1lOQyhuZXdfZGlyKSkgeworCQllcnIgPSBmYXRfc3luY19pbm9kZShvbGRfaW5vZGUpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJvcl9pbm9kZTsKKwl9IGVsc2UKKwkJbWFya19pbm9kZV9kaXJ0eShvbGRfaW5vZGUpOworCisJaWYgKHVwZGF0ZV9kb3Rkb3QpIHsKKwkJaW50IHN0YXJ0ID0gTVNET1NfSShuZXdfZGlyKS0+aV9sb2dzdGFydDsKKwkJZG90ZG90X2RlLT5zdGFydCA9IGNwdV90b19sZTE2KHN0YXJ0KTsKKwkJZG90ZG90X2RlLT5zdGFydGhpID0gY3B1X3RvX2xlMTYoc3RhcnQgPj4gMTYpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShkb3Rkb3RfYmgpOworCQlpZiAoSVNfRElSU1lOQyhuZXdfZGlyKSkgeworCQkJZXJyID0gc3luY19kaXJ0eV9idWZmZXIoZG90ZG90X2JoKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBlcnJvcl9kb3Rkb3Q7CisJCX0KKwkJb2xkX2Rpci0+aV9ubGluay0tOworCQlpZiAoIW5ld19pbm9kZSkKKwkJCW5ld19kaXItPmlfbmxpbmsrKzsKKwl9CisKKwllcnIgPSBmYXRfcmVtb3ZlX2VudHJpZXMob2xkX2RpciwgJm9sZF9zaW5mbyk7CS8qIGFuZCByZWxlYXNlcyBiaCAqLworCW9sZF9zaW5mby5iaCA9IE5VTEw7CisJaWYgKGVycikKKwkJZ290byBlcnJvcl9kb3Rkb3Q7CisJb2xkX2Rpci0+aV92ZXJzaW9uKys7CisJb2xkX2Rpci0+aV9jdGltZSA9IG9sZF9kaXItPmlfbXRpbWUgPSB0czsKKwlpZiAoSVNfRElSU1lOQyhvbGRfZGlyKSkKKwkJKHZvaWQpZmF0X3N5bmNfaW5vZGUob2xkX2Rpcik7CisJZWxzZQorCQltYXJrX2lub2RlX2RpcnR5KG9sZF9kaXIpOworCisJaWYgKG5ld19pbm9kZSkgeworCQlpZiAoaXNfZGlyKQorCQkJbmV3X2lub2RlLT5pX25saW5rIC09IDI7CisJCWVsc2UKKwkJCW5ld19pbm9kZS0+aV9ubGluay0tOworCQluZXdfaW5vZGUtPmlfY3RpbWUgPSB0czsKKwl9CitvdXQ6CisJYnJlbHNlKHNpbmZvLmJoKTsKKwlicmVsc2UoZG90ZG90X2JoKTsKKwlicmVsc2Uob2xkX3NpbmZvLmJoKTsKKwlyZXR1cm4gZXJyOworCitlcnJvcl9kb3Rkb3Q6CisJLyogZGF0YSBjbHVzdGVyIGlzIHNoYXJlZCwgc2VyaW91cyBjb3JydXB0aW9uICovCisJY29ycnVwdCA9IDE7CisKKwlpZiAodXBkYXRlX2RvdGRvdCkgeworCQlpbnQgc3RhcnQgPSBNU0RPU19JKG9sZF9kaXIpLT5pX2xvZ3N0YXJ0OworCQlkb3Rkb3RfZGUtPnN0YXJ0ID0gY3B1X3RvX2xlMTYoc3RhcnQpOworCQlkb3Rkb3RfZGUtPnN0YXJ0aGkgPSBjcHVfdG9fbGUxNihzdGFydCA+PiAxNik7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGRvdGRvdF9iaCk7CisJCWNvcnJ1cHQgfD0gc3luY19kaXJ0eV9idWZmZXIoZG90ZG90X2JoKTsKKwl9CitlcnJvcl9pbm9kZToKKwlmYXRfZGV0YWNoKG9sZF9pbm9kZSk7CisJZmF0X2F0dGFjaChvbGRfaW5vZGUsIG9sZF9zaW5mby5pX3Bvcyk7CisJTVNET1NfSShvbGRfaW5vZGUpLT5pX2F0dHJzID0gb2xkX2F0dHJzOworCWlmIChuZXdfaW5vZGUpIHsKKwkJZmF0X2F0dGFjaChuZXdfaW5vZGUsIHNpbmZvLmlfcG9zKTsKKwkJaWYgKGNvcnJ1cHQpCisJCQljb3JydXB0IHw9IGZhdF9zeW5jX2lub2RlKG5ld19pbm9kZSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSWYgbmV3IGVudHJ5IHdhcyBub3Qgc2hhcmluZyB0aGUgZGF0YSBjbHVzdGVyLCBpdAorCQkgKiBzaG91bGRuJ3QgYmUgc2VyaW91cyBjb3JydXB0aW9uLgorCQkgKi8KKwkJaW50IGVycjIgPSBmYXRfcmVtb3ZlX2VudHJpZXMobmV3X2RpciwgJnNpbmZvKTsKKwkJaWYgKGNvcnJ1cHQpCisJCQljb3JydXB0IHw9IGVycjI7CisJCXNpbmZvLmJoID0gTlVMTDsKKwl9CisJaWYgKGNvcnJ1cHQgPCAwKSB7CisJCWZhdF9mc19wYW5pYyhuZXdfZGlyLT5pX3NiLAorCQkJICAgICAiJXM6IEZpbGVzeXN0ZW0gY29ycnVwdGVkIChpX3BvcyAlbGxkKSIsCisJCQkgICAgIF9fRlVOQ1RJT05fXywgc2luZm8uaV9wb3MpOworCX0KKwlnb3RvIG91dDsKK30KKworLyoqKioqIFJlbmFtZSwgYSB3cmFwcGVyIGZvciByZW5hbWVfc2FtZV9kaXIgJiByZW5hbWVfZGlmZl9kaXIgKi8KK3N0YXRpYyBpbnQgbXNkb3NfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKKwkJCXN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwl1bnNpZ25lZCBjaGFyIG9sZF9tc2Rvc19uYW1lW01TRE9TX05BTUVdLCBuZXdfbXNkb3NfbmFtZVtNU0RPU19OQU1FXTsKKwlpbnQgZXJyLCBpc19oaWQ7CisKKwlsb2NrX2tlcm5lbCgpOworCisJZXJyID0gbXNkb3NfZm9ybWF0X25hbWUob2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJb2xkX2RlbnRyeS0+ZF9uYW1lLmxlbiwgb2xkX21zZG9zX25hbWUsCisJCQkJJk1TRE9TX1NCKG9sZF9kaXItPmlfc2IpLT5vcHRpb25zKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSBtc2Rvc19mb3JtYXRfbmFtZShuZXdfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQluZXdfZGVudHJ5LT5kX25hbWUubGVuLCBuZXdfbXNkb3NfbmFtZSwKKwkJCQkmTVNET1NfU0IobmV3X2Rpci0+aV9zYiktPm9wdGlvbnMpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJaXNfaGlkID0KKwkgICAgIChuZXdfZGVudHJ5LT5kX25hbWUubmFtZVswXSA9PSAnLicpICYmIChuZXdfbXNkb3NfbmFtZVswXSAhPSAnLicpOworCisJZXJyID0gZG9fbXNkb3NfcmVuYW1lKG9sZF9kaXIsIG9sZF9tc2Rvc19uYW1lLCBvbGRfZGVudHJ5LAorCQkJICAgICAgbmV3X2RpciwgbmV3X21zZG9zX25hbWUsIG5ld19kZW50cnksIGlzX2hpZCk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBtc2Rvc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkuY3JlYXRlCQk9IG1zZG9zX2NyZWF0ZSwKKwkubG9va3VwCQk9IG1zZG9zX2xvb2t1cCwKKwkudW5saW5rCQk9IG1zZG9zX3VubGluaywKKwkubWtkaXIJCT0gbXNkb3NfbWtkaXIsCisJLnJtZGlyCQk9IG1zZG9zX3JtZGlyLAorCS5yZW5hbWUJCT0gbXNkb3NfcmVuYW1lLAorCS5zZXRhdHRyCT0gZmF0X25vdGlmeV9jaGFuZ2UsCit9OworCitzdGF0aWMgaW50IG1zZG9zX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlpbnQgcmVzOworCisJcmVzID0gZmF0X2ZpbGxfc3VwZXIoc2IsIGRhdGEsIHNpbGVudCwgJm1zZG9zX2Rpcl9pbm9kZV9vcGVyYXRpb25zLCAwKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJc2ItPnNfZmxhZ3MgfD0gTVNfTk9BVElNRTsKKwlzYi0+c19yb290LT5kX29wID0gJm1zZG9zX2RlbnRyeV9vcGVyYXRpb25zOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICptc2Rvc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkJCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJCXZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgbXNkb3NfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBtc2Rvc19mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAibXNkb3MiLAorCS5nZXRfc2IJCT0gbXNkb3NfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X21zZG9zX2ZzKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJm1zZG9zX2ZzX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9tc2Rvc19mcyh2b2lkKQoreworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmbXNkb3NfZnNfdHlwZSk7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIldlcm5lciBBbG1lc2JlcmdlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNUy1ET1MgZmlsZXN5c3RlbSBzdXBwb3J0Iik7CisKK21vZHVsZV9pbml0KGluaXRfbXNkb3NfZnMpCittb2R1bGVfZXhpdChleGl0X21zZG9zX2ZzKQpkaWZmIC0tZ2l0IGEvZnMvbmFtZWkuYyBiL2ZzL25hbWVpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0YWVmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25hbWVpLmMKQEAgLTAsMCArMSwyNDU0IEBACisvKgorICogIGxpbnV4L2ZzL25hbWVpLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKy8qCisgKiBTb21lIGNvcnJlY3Rpb25zIGJ5IHR5dHNvLgorICovCisKKy8qIFtGZWIgMTk5NyBULiBTY2hvZWJlbC1UaGV1ZXJdIENvbXBsZXRlIHJld3JpdGUgb2YgdGhlIHBhdGhuYW1lCisgKiBsb29rdXAgbG9naWMuCisgKi8KKy8qIFtGZWItQXByIDIwMDAsIEFWXSBSZXdyaXRlIHRvIHRoZSBuZXcgbmFtZXNwYWNlIGFyY2hpdGVjdHVyZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZG5vdGlmeS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgorI2luY2x1ZGUgPGFzbS9uYW1laS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgQUNDX01PREUoeCkgKCJcMDAwXDAwNFwwMDJcMDA2IlsoeCkmT19BQ0NNT0RFXSkKKworLyogW0ZlYi0xOTk3IFQuIFNjaG9lYmVsLVRoZXVlcl0KKyAqIEZ1bmRhbWVudGFsIGNoYW5nZXMgaW4gdGhlIHBhdGhuYW1lIGxvb2t1cCBtZWNoYW5pc21zIChuYW1laSkKKyAqIHdlcmUgbmVjZXNzYXJ5IGJlY2F1c2Ugb2Ygb21pcnIuICBUaGUgcmVhc29uIGlzIHRoYXQgb21pcnIgbmVlZHMKKyAqIHRvIGtub3cgdGhlIF9yZWFsXyBwYXRobmFtZSwgbm90IHRoZSB1c2VyLXN1cHBsaWVkIG9uZSwgaW4gY2FzZQorICogb2Ygc3ltbGlua3MgKGFuZCBhbHNvIHdoZW4gdHJhbnNuYW1lIHJlcGxhY2VtZW50cyBvY2N1cikuCisgKgorICogVGhlIG5ldyBjb2RlIHJlcGxhY2VzIHRoZSBvbGQgcmVjdXJzaXZlIHN5bWxpbmsgcmVzb2x1dGlvbiB3aXRoCisgKiBhbiBpdGVyYXRpdmUgb25lIChpbiBjYXNlIG9mIG5vbi1uZXN0ZWQgc3ltbGluayBjaGFpbnMpLiAgSXQgZG9lcworICogdGhpcyB3aXRoIGNhbGxzIHRvIDxmcz5fZm9sbG93X2xpbmsoKS4KKyAqIEFzIGEgc2lkZSBlZmZlY3QsIGRpcl9uYW1laSgpLCBfbmFtZWkoKSBhbmQgZm9sbG93X2xpbmsoKSBhcmUgbm93IAorICogcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSBmdW5jdGlvbiBsb29rdXBfZGVudHJ5KCkgdGhhdCBjYW4gaGFuZGxlIGFsbCAKKyAqIHRoZSBzcGVjaWFsIGNhc2VzIG9mIHRoZSBmb3JtZXIgY29kZS4KKyAqCisgKiBXaXRoIHRoZSBuZXcgZGNhY2hlLCB0aGUgcGF0aG5hbWUgaXMgc3RvcmVkIGF0IGVhY2ggaW5vZGUsIGF0IGxlYXN0IGFzCisgKiBsb25nIGFzIHRoZSByZWZjb3VudCBvZiB0aGUgaW5vZGUgaXMgcG9zaXRpdmUuICBBcyBhIHNpZGUgZWZmZWN0LCB0aGUKKyAqIHNpemUgb2YgdGhlIGRjYWNoZSBkZXBlbmRzIG9uIHRoZSBpbm9kZSBjYWNoZSBhbmQgdGh1cyBpcyBkeW5hbWljLgorICoKKyAqIFsyOS1BcHItMTk5OCBDLiBTY290dCBBbmFuaWFuXSBVcGRhdGVkIGFib3ZlIGRlc2NyaXB0aW9uIG9mIHN5bWxpbmsKKyAqIHJlc29sdXRpb24gdG8gY29ycmVzcG9uZCB3aXRoIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvZGUuCisgKgorICogTm90ZSB0aGF0IHRoZSBzeW1saW5rIHJlc29sdXRpb24gaXMgbm90ICpjb21wbGV0ZWx5KiBpdGVyYXRpdmUuCisgKiBUaGVyZSBpcyBzdGlsbCBhIHNpZ25pZmljYW50IGFtb3VudCBvZiB0YWlsLSBhbmQgbWlkLSByZWN1cnNpb24gaW4KKyAqIHRoZSBhbGdvcml0aG0uICBBbHNvLCBub3RlIHRoYXQgPGZzPl9yZWFkbGluaygpIGlzIG5vdCB1c2VkIGluCisgKiBsb29rdXBfZGVudHJ5KCk6IGxvb2t1cF9kZW50cnkoKSBvbiB0aGUgcmVzdWx0IG9mIDxmcz5fcmVhZGxpbmsoKQorICogbWF5IHJldHVybiBkaWZmZXJlbnQgcmVzdWx0cyB0aGFuIDxmcz5fZm9sbG93X2xpbmsoKS4gIE1hbnkgdmlydHVhbAorICogZmlsZXN5c3RlbXMgKGluY2x1ZGluZyAvcHJvYykgZXhoaWJpdCB0aGlzIGJlaGF2aW9yLgorICovCisKKy8qIFsyNC1GZWItOTcgVC4gU2Nob2ViZWwtVGhldWVyXSBTaWRlIGVmZmVjdHMgY2F1c2VkIGJ5IG5ldyBpbXBsZW1lbnRhdGlvbjoKKyAqIE5ldyBzeW1saW5rIHNlbWFudGljczogd2hlbiBvcGVuKCkgaXMgY2FsbGVkIHdpdGggZmxhZ3MgT19DUkVBVCB8IE9fRVhDTAorICogYW5kIHRoZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIGZvcm0gb2YgYSBzeW1saW5rLCB0cnkgdG8gY3JlYXRlIHRoZSBuZXcKKyAqIG5hbWUgaW5kaWNhdGVkIGJ5IHRoZSBzeW1saW5rLiBUaGUgb2xkIGNvZGUgYWx3YXlzIGNvbXBsYWluZWQgdGhhdCB0aGUKKyAqIG5hbWUgYWxyZWFkeSBleGlzdHMsIGR1ZSB0byBub3QgZm9sbG93aW5nIHRoZSBzeW1saW5rIGV2ZW4gaWYgaXRzIHRhcmdldAorICogaXMgbm9uZXhpc3RlbnQuICBUaGUgbmV3IHNlbWFudGljcyBhZmZlY3RzIGFsc28gbWtub2QoKSBhbmQgbGluaygpIHdoZW4KKyAqIHRoZSBuYW1lIGlzIGEgc3ltbGluayBwb2ludGluZyB0byBhIG5vbi1leGlzdGFudCBuYW1lLgorICoKKyAqIEkgZG9uJ3Qga25vdyB3aGljaCBzZW1hbnRpY3MgaXMgdGhlIHJpZ2h0IG9uZSwgc2luY2UgSSBoYXZlIG5vIGFjY2VzcworICogdG8gc3RhbmRhcmRzLiBCdXQgSSBmb3VuZCBieSB0cmlhbCB0aGF0IEhQLVVYIDkuMCBoYXMgdGhlIGZ1bGwgIm5ldyIKKyAqIHNlbWFudGljcyBpbXBsZW1lbnRlZCwgd2hpbGUgU3VuT1MgNC4xLjEgYW5kIFNvbGFyaXMgKFN1bk9TIDUuNCkgaGF2ZSB0aGUKKyAqICJvbGQiIG9uZS4gUGVyc29uYWxseSwgSSB0aGluayB0aGUgbmV3IHNlbWFudGljcyBpcyBtdWNoIG1vcmUgbG9naWNhbC4KKyAqIE5vdGUgdGhhdCAibG4gb2xkIG5ldyIgd2hlcmUgIm5ldyIgaXMgYSBzeW1saW5rIHBvaW50aW5nIHRvIGEgbm9uLWV4aXN0aW5nCisgKiBmaWxlIGRvZXMgc3VjY2VlZCBpbiBib3RoIEhQLVVYIGFuZCBTdW5PcywgYnV0IG5vdCBpbiBTb2xhcmlzCisgKiBhbmQgaW4gdGhlIG9sZCBMaW51eCBzZW1hbnRpY3MuCisgKi8KKworLyogWzE2LURlYy05NyBLZXZpbiBCdWhyXSBGb3Igc2VjdXJpdHkgcmVhc29ucywgd2UgY2hhbmdlIHNvbWUgc3ltbGluaworICogc2VtYW50aWNzLiAgU2VlIHRoZSBjb21tZW50cyBpbiAib3Blbl9uYW1laSIgYW5kICJkb19saW5rIiBiZWxvdy4KKyAqCisgKiBbMTAtU2VwLTk4IEFsYW4gTW9kcmFdIEFub3RoZXIgc3ltbGluayBjaGFuZ2UuCisgKi8KKworLyogW0ZlYi1BcHIgMjAwMCBBVl0gQ29tcGxldGUgcmV3cml0ZS4gUnVsZXMgZm9yIHN5bWxpbmtzOgorICoJaW5zaWRlIHRoZSBwYXRoIC0gYWx3YXlzIGZvbGxvdy4KKyAqCWluIHRoZSBsYXN0IGNvbXBvbmVudCBpbiBjcmVhdGlvbi9yZW1vdmFsL3JlbmFtaW5nIC0gbmV2ZXIgZm9sbG93LgorICoJaWYgTE9PS1VQX0ZPTExPVyBwYXNzZWQgLSBmb2xsb3cuCisgKglpZiB0aGUgcGF0aG5hbWUgaGFzIHRyYWlsaW5nIHNsYXNoZXMgLSBmb2xsb3cuCisgKglvdGhlcndpc2UgLSBkb24ndCBmb2xsb3cuCisgKiAoYXBwbGllZCBpbiB0aGF0IG9yZGVyKS4KKyAqCisgKiBbSnVuIDIwMDAgQVZdIEluY29uc2lzdGVudCBiZWhhdmlvdXIgb2Ygb3BlbigpIGluIGNhc2UgaWYgZmxhZ3M9PU9fQ1JFQVQKKyAqIHJlc3RvcmVkIGZvciAyLjQuIFRoaXMgaXMgdGhlIGxhc3Qgc3Vydml2aW5nIHBhcnQgb2Ygb2xkIDQuMkJTRCBidWcuCisgKiBEdXJpbmcgdGhlIDIuNCB3ZSBuZWVkIHRvIGZpeCB0aGUgdXNlcmxhbmQgc3R1ZmYgZGVwZW5kaW5nIG9uIGl0IC0KKyAqIGhvcGVmdWxseSB3ZSB3aWxsIGJlIGFibGUgdG8gZ2V0IHJpZCBvZiB0aGF0IHdhcnQgaW4gMi41LiBTbyBmYXIgb25seQorICogWEVtYWNzIHNlZW1zIHRvIGJlIHJlbHlpbmcgb24gaXQuLi4KKyAqLworLyoKKyAqIFtTZXAgMjAwMSBBVl0gU2luZ2xlLXNlbWFwaG9yZSBsb2NraW5nIHNjaGVtZSAoa3Vkb3MgdG8gRGF2aWQgSG9sbGFuZCkKKyAqIGltcGxlbWVudGVkLiAgTGV0J3Mgc2VlIGlmIHJhaXNlZCBwcmlvcml0eSBvZiAtPnNfdmZzX3JlbmFtZV9zZW0gZ2l2ZXMKKyAqIGFueSBleHRyYSBjb250ZW50aW9uLi4uCisgKi8KKworLyogSW4gb3JkZXIgdG8gcmVkdWNlIHNvbWUgcmFjZXMsIHdoaWxlIGF0IHRoZSBzYW1lIHRpbWUgZG9pbmcgYWRkaXRpb25hbAorICogY2hlY2tpbmcgYW5kIGhvcGVmdWxseSBzcGVlZGluZyB0aGluZ3MgdXAsIHdlIGNvcHkgZmlsZW5hbWVzIHRvIHRoZQorICoga2VybmVsIGRhdGEgc3BhY2UgYmVmb3JlIHVzaW5nIHRoZW0uLgorICoKKyAqIFBPU0lYLjEgMi40OiBhbiBlbXB0eSBwYXRobmFtZSBpcyBpbnZhbGlkIChFTk9FTlQpLgorICogUEFUSF9NQVggaW5jbHVkZXMgdGhlIG51bCB0ZXJtaW5hdG9yIC0tUlIuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRvX2dldG5hbWUoY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBjaGFyICpwYWdlKQoreworCWludCByZXR2YWw7CisJdW5zaWduZWQgbG9uZyBsZW4gPSBQQVRIX01BWDsKKworCWlmICghc2VnbWVudF9lcShnZXRfZnMoKSwgS0VSTkVMX0RTKSkgeworCQlpZiAoKHVuc2lnbmVkIGxvbmcpIGZpbGVuYW1lID49IFRBU0tfU0laRSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoVEFTS19TSVpFIC0gKHVuc2lnbmVkIGxvbmcpIGZpbGVuYW1lIDwgUEFUSF9NQVgpCisJCQlsZW4gPSBUQVNLX1NJWkUgLSAodW5zaWduZWQgbG9uZykgZmlsZW5hbWU7CisJfQorCisJcmV0dmFsID0gc3RybmNweV9mcm9tX3VzZXIocGFnZSwgZmlsZW5hbWUsIGxlbik7CisJaWYgKHJldHZhbCA+IDApIHsKKwkJaWYgKHJldHZhbCA8IGxlbikKKwkJCXJldHVybiAwOworCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwl9IGVsc2UgaWYgKCFyZXR2YWwpCisJCXJldHZhbCA9IC1FTk9FTlQ7CisJcmV0dXJuIHJldHZhbDsKK30KKworY2hhciAqIGdldG5hbWUoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSkKK3sKKwljaGFyICp0bXAsICpyZXN1bHQ7CisKKwlyZXN1bHQgPSBFUlJfUFRSKC1FTk9NRU0pOworCXRtcCA9IF9fZ2V0bmFtZSgpOworCWlmICh0bXApICB7CisJCWludCByZXR2YWwgPSBkb19nZXRuYW1lKGZpbGVuYW1lLCB0bXApOworCisJCXJlc3VsdCA9IHRtcDsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCV9fcHV0bmFtZSh0bXApOworCQkJcmVzdWx0ID0gRVJSX1BUUihyZXR2YWwpOworCQl9CisJfQorCWF1ZGl0X2dldG5hbWUocmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAordm9pZCBwdXRuYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaWYgKHVubGlrZWx5KGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpKQorCQlhdWRpdF9wdXRuYW1lKG5hbWUpOworCWVsc2UKKwkJX19wdXRuYW1lKG5hbWUpOworfQorRVhQT1JUX1NZTUJPTChwdXRuYW1lKTsKKyNlbmRpZgorCisKKy8qKgorICogZ2VuZXJpY19wZXJtaXNzaW9uICAtICBjaGVjayBmb3IgYWNjZXNzIHJpZ2h0cyBvbiBhIFBvc2l4LWxpa2UgZmlsZXN5c3RlbQorICogQGlub2RlOglpbm9kZSB0byBjaGVjayBhY2Nlc3MgcmlnaHRzIGZvcgorICogQG1hc2s6CXJpZ2h0IHRvIGNoZWNrIGZvciAoJU1BWV9SRUFELCAlTUFZX1dSSVRFLCAlTUFZX0VYRUMpCisgKiBAY2hlY2tfYWNsOglvcHRpb25hbCBjYWxsYmFjayB0byBjaGVjayBmb3IgUG9zaXggQUNMcworICoKKyAqIFVzZWQgdG8gY2hlY2sgZm9yIHJlYWQvd3JpdGUvZXhlY3V0ZSBwZXJtaXNzaW9ucyBvbiBhIGZpbGUuCisgKiBXZSB1c2UgImZzdWlkIiBmb3IgdGhpcywgbGV0dGluZyB1cyBzZXQgYXJiaXRyYXJ5IHBlcm1pc3Npb25zCisgKiBmb3IgZmlsZXN5c3RlbSBhY2Nlc3Mgd2l0aG91dCBjaGFuZ2luZyB0aGUgIm5vcm1hbCIgdWlkcyB3aGljaAorICogYXJlIHVzZWQgZm9yIG90aGVyIHRoaW5ncy4uCisgKi8KK2ludCBnZW5lcmljX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssCisJCWludCAoKmNoZWNrX2FjbCkoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spKQoreworCXVtb2RlX3QJCQltb2RlID0gaW5vZGUtPmlfbW9kZTsKKworCWlmIChjdXJyZW50LT5mc3VpZCA9PSBpbm9kZS0+aV91aWQpCisJCW1vZGUgPj49IDY7CisJZWxzZSB7CisJCWlmIChJU19QT1NJWEFDTChpbm9kZSkgJiYgKG1vZGUgJiBTX0lSV1hHKSAmJiBjaGVja19hY2wpIHsKKwkJCWludCBlcnJvciA9IGNoZWNrX2FjbChpbm9kZSwgbWFzayk7CisJCQlpZiAoZXJyb3IgPT0gLUVBQ0NFUykKKwkJCQlnb3RvIGNoZWNrX2NhcGFiaWxpdGllczsKKwkJCWVsc2UgaWYgKGVycm9yICE9IC1FQUdBSU4pCisJCQkJcmV0dXJuIGVycm9yOworCQl9CisKKwkJaWYgKGluX2dyb3VwX3AoaW5vZGUtPmlfZ2lkKSkKKwkJCW1vZGUgPj49IDM7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgREFDcyBhcmUgb2sgd2UgZG9uJ3QgbmVlZCBhbnkgY2FwYWJpbGl0eSBjaGVjay4KKwkgKi8KKwlpZiAoKChtb2RlICYgbWFzayAmIChNQVlfUkVBRHxNQVlfV1JJVEV8TUFZX0VYRUMpKSA9PSBtYXNrKSkKKwkJcmV0dXJuIDA7CisKKyBjaGVja19jYXBhYmlsaXRpZXM6CisJLyoKKwkgKiBSZWFkL3dyaXRlIERBQ3MgYXJlIGFsd2F5cyBvdmVycmlkYWJsZS4KKwkgKiBFeGVjdXRhYmxlIERBQ3MgYXJlIG92ZXJyaWRhYmxlIGlmIGF0IGxlYXN0IG9uZSBleGVjIGJpdCBpcyBzZXQuCisJICovCisJaWYgKCEobWFzayAmIE1BWV9FWEVDKSB8fAorCSAgICAoaW5vZGUtPmlfbW9kZSAmIFNfSVhVR08pIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCWlmIChjYXBhYmxlKENBUF9EQUNfT1ZFUlJJREUpKQorCQkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFNlYXJjaGluZyBpbmNsdWRlcyBleGVjdXRhYmxlIG9uIGRpcmVjdG9yaWVzLCBlbHNlIGp1c3QgcmVhZC4KKwkgKi8KKwlpZiAobWFzayA9PSBNQVlfUkVBRCB8fCAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiAhKG1hc2sgJiBNQVlfV1JJVEUpKSkKKwkJaWYgKGNhcGFibGUoQ0FQX0RBQ19SRUFEX1NFQVJDSCkpCisJCQlyZXR1cm4gMDsKKworCXJldHVybiAtRUFDQ0VTOworfQorCitpbnQgcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IHJldHZhbCwgc3VibWFzazsKKworCWlmIChtYXNrICYgTUFZX1dSSVRFKSB7CisJCXVtb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CisKKwkJLyoKKwkJICogTm9ib2R5IGdldHMgd3JpdGUgYWNjZXNzIHRvIGEgcmVhZC1vbmx5IGZzLgorCQkgKi8KKwkJaWYgKElTX1JET05MWShpbm9kZSkgJiYKKwkJICAgIChTX0lTUkVHKG1vZGUpIHx8IFNfSVNESVIobW9kZSkgfHwgU19JU0xOSyhtb2RlKSkpCisJCQlyZXR1cm4gLUVST0ZTOworCisJCS8qCisJCSAqIE5vYm9keSBnZXRzIHdyaXRlIGFjY2VzcyB0byBhbiBpbW11dGFibGUgZmlsZS4KKwkJICovCisJCWlmIChJU19JTU1VVEFCTEUoaW5vZGUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisKKwkvKiBPcmRpbmFyeSBwZXJtaXNzaW9uIHJvdXRpbmVzIGRvIG5vdCB1bmRlcnN0YW5kIE1BWV9BUFBFTkQuICovCisJc3VibWFzayA9IG1hc2sgJiB+TUFZX0FQUEVORDsKKwlpZiAoaW5vZGUtPmlfb3AgJiYgaW5vZGUtPmlfb3AtPnBlcm1pc3Npb24pCisJCXJldHZhbCA9IGlub2RlLT5pX29wLT5wZXJtaXNzaW9uKGlub2RlLCBzdWJtYXNrLCBuZCk7CisJZWxzZQorCQlyZXR2YWwgPSBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIHN1Ym1hc2ssIE5VTEwpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gc2VjdXJpdHlfaW5vZGVfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgbmQpOworfQorCisvKgorICogZ2V0X3dyaXRlX2FjY2VzcygpIGdldHMgd3JpdGUgcGVybWlzc2lvbiBmb3IgYSBmaWxlLgorICogcHV0X3dyaXRlX2FjY2VzcygpIHJlbGVhc2VzIHRoaXMgd3JpdGUgcGVybWlzc2lvbi4KKyAqIFRoaXMgaXMgdXNlZCBmb3IgcmVndWxhciBmaWxlcy4KKyAqIFdlIGNhbm5vdCBzdXBwb3J0IHdyaXRlIChhbmQgbWF5YmUgbW1hcCByZWFkLXdyaXRlIHNoYXJlZCkgYWNjZXNzZXMgYW5kCisgKiBNQVBfREVOWVdSSVRFIG1tYXBwaW5ncyBzaW11bHRhbmVvdXNseS4gVGhlIGlfd3JpdGVjb3VudCBmaWVsZCBvZiBhbiBpbm9kZQorICogY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAwOiBubyB3cml0ZXJzLCBubyBWTV9ERU5ZV1JJVEUgbWFwcGluZ3MKKyAqIDwgMDogKC1pX3dyaXRlY291bnQpIHZtX2FyZWFfc3RydWN0cyB3aXRoIFZNX0RFTllXUklURSBzZXQgZXhpc3QKKyAqID4gMDogKGlfd3JpdGVjb3VudCkgdXNlcnMgYXJlIHdyaXRpbmcgdG8gdGhlIGZpbGUuCisgKgorICogTm9ybWFsbHkgd2Ugb3BlcmF0ZSBvbiB0aGF0IGNvdW50ZXIgd2l0aCBhdG9taWNfe2luYyxkZWN9IGFuZCBpdCdzIHNhZmUKKyAqIGV4Y2VwdCBmb3IgdGhlIGNhc2VzIHdoZXJlIHdlIGRvbid0IGhvbGQgaV93cml0ZWNvdW50IHlldC4gVGhlbiB3ZSBuZWVkIHRvCisgKiB1c2Uge2dldCxkZW55fV93cml0ZV9hY2Nlc3MoKSAtIHRoZXNlIGZ1bmN0aW9ucyBjaGVjayB0aGUgc2lnbiBhbmQgcmVmdXNlCisgKiB0byBkbyB0aGUgY2hhbmdlIGlmIHNpZ24gaXMgd3JvbmcuIEV4Y2x1c2lvbiBiZXR3ZWVuIHRoZW0gaXMgcHJvdmlkZWQgYnkKKyAqIHRoZSBpbm9kZS0+aV9sb2NrIHNwaW5sb2NrLgorICovCisKK2ludCBnZXRfd3JpdGVfYWNjZXNzKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJaWYgKGF0b21pY19yZWFkKCZpbm9kZS0+aV93cml0ZWNvdW50KSA8IDApIHsKKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlyZXR1cm4gLUVUWFRCU1k7CisJfQorCWF0b21pY19pbmMoJmlub2RlLT5pX3dyaXRlY291bnQpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKworCXJldHVybiAwOworfQorCitpbnQgZGVueV93cml0ZV9hY2Nlc3Moc3RydWN0IGZpbGUgKiBmaWxlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJaWYgKGF0b21pY19yZWFkKCZpbm9kZS0+aV93cml0ZWNvdW50KSA+IDApIHsKKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlyZXR1cm4gLUVUWFRCU1k7CisJfQorCWF0b21pY19kZWMoJmlub2RlLT5pX3dyaXRlY291bnQpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKworCXJldHVybiAwOworfQorCit2b2lkIHBhdGhfcmVsZWFzZShzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlkcHV0KG5kLT5kZW50cnkpOworCW1udHB1dChuZC0+bW50KTsKK30KKworLyoKKyAqIHVtb3VudCgpIG11c3RuJ3QgY2FsbCBwYXRoX3JlbGVhc2UoKS9tbnRwdXQoKSBhcyB0aGF0IHdvdWxkIGNsZWFyCisgKiBtbnRfZXhwaXJ5X21hcmsKKyAqLwordm9pZCBwYXRoX3JlbGVhc2Vfb25fdW1vdW50KHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWRwdXQobmQtPmRlbnRyeSk7CisJX21udHB1dChuZC0+bW50KTsKK30KKworLyoKKyAqIEludGVybmFsIGxvb2t1cCgpIHVzaW5nIHRoZSBuZXcgZ2VuZXJpYyBkY2FjaGUuCisgKiBTTVAtc2FmZQorICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqIGNhY2hlZF9sb29rdXAoc3RydWN0IGRlbnRyeSAqIHBhcmVudCwgc3RydWN0IHFzdHIgKiBuYW1lLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gX19kX2xvb2t1cChwYXJlbnQsIG5hbWUpOworCisJLyogbG9ja2VzcyBfX2RfbG9va3VwIG1heSBmYWlsIGR1ZSB0byBjb25jdXJyZW50IGRfbW92ZSgpIAorCSAqIGluIHNvbWUgdW5yZWxhdGVkIGRpcmVjdG9yeSwgc28gdHJ5IHdpdGggZF9sb29rdXAKKwkgKi8KKwlpZiAoIWRlbnRyeSkKKwkJZGVudHJ5ID0gZF9sb29rdXAocGFyZW50LCBuYW1lKTsKKworCWlmIChkZW50cnkgJiYgZGVudHJ5LT5kX29wICYmIGRlbnRyeS0+ZF9vcC0+ZF9yZXZhbGlkYXRlKSB7CisJCWlmICghZGVudHJ5LT5kX29wLT5kX3JldmFsaWRhdGUoZGVudHJ5LCBuZCkgJiYgIWRfaW52YWxpZGF0ZShkZW50cnkpKSB7CisJCQlkcHV0KGRlbnRyeSk7CisJCQlkZW50cnkgPSBOVUxMOworCQl9CisJfQorCXJldHVybiBkZW50cnk7Cit9CisKKy8qCisgKiBTaG9ydC1jdXQgdmVyc2lvbiBvZiBwZXJtaXNzaW9uKCksIGZvciBjYWxsaW5nIGJ5CisgKiBwYXRoX3dhbGsoKSwgd2hlbiBkY2FjaGUgbG9jayBpcyBoZWxkLiAgQ29tYmluZXMgcGFydHMKKyAqIG9mIHBlcm1pc3Npb24oKSBhbmQgZ2VuZXJpY19wZXJtaXNzaW9uKCksIGFuZCB0ZXN0cyBPTkxZIGZvcgorICogTUFZX0VYRUMgcGVybWlzc2lvbi4KKyAqCisgKiBJZiBhcHByb3ByaWF0ZSwgY2hlY2sgREFDIG9ubHkuICBJZiBub3QgYXBwcm9wcmlhdGUsIG9yCisgKiBzaG9ydC1jdXQgREFDIGZhaWxzLCB0aGVuIGNhbGwgcGVybWlzc2lvbigpIHRvIGRvIG1vcmUKKyAqIGNvbXBsZXRlIHBlcm1pc3Npb24gY2hlY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGV4ZWNfcGVybWlzc2lvbl9saXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXVtb2RlX3QJbW9kZSA9IGlub2RlLT5pX21vZGU7CisKKwlpZiAoaW5vZGUtPmlfb3AgJiYgaW5vZGUtPmlfb3AtPnBlcm1pc3Npb24pCisJCXJldHVybiAtRUFHQUlOOworCisJaWYgKGN1cnJlbnQtPmZzdWlkID09IGlub2RlLT5pX3VpZCkKKwkJbW9kZSA+Pj0gNjsKKwllbHNlIGlmIChpbl9ncm91cF9wKGlub2RlLT5pX2dpZCkpCisJCW1vZGUgPj49IDM7CisKKwlpZiAobW9kZSAmIE1BWV9FWEVDKQorCQlnb3RvIG9rOworCisJaWYgKChpbm9kZS0+aV9tb2RlICYgU19JWFVHTykgJiYgY2FwYWJsZShDQVBfREFDX09WRVJSSURFKSkKKwkJZ290byBvazsKKworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpICYmIGNhcGFibGUoQ0FQX0RBQ19PVkVSUklERSkpCisJCWdvdG8gb2s7CisKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiBjYXBhYmxlKENBUF9EQUNfUkVBRF9TRUFSQ0gpKQorCQlnb3RvIG9rOworCisJcmV0dXJuIC1FQUNDRVM7CitvazoKKwlyZXR1cm4gc2VjdXJpdHlfaW5vZGVfcGVybWlzc2lvbihpbm9kZSwgTUFZX0VYRUMsIG5kKTsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gZXZlcnl0aGluZyBlbHNlIGZhaWxzLCBhbmQgd2UgYWN0dWFsbHkgaGF2ZQorICogdG8gZ28gdG8gdGhlIGxvdy1sZXZlbCBmaWxlc3lzdGVtIHRvIGZpbmQgb3V0IHdoYXQgd2Ugc2hvdWxkIGRvLi4KKyAqCisgKiBXZSBnZXQgdGhlIGRpcmVjdG9yeSBzZW1hcGhvcmUsIGFuZCBhZnRlciBnZXR0aW5nIHRoYXQgd2UgYWxzbworICogbWFrZSBzdXJlIHRoYXQgbm9ib2R5IGFkZGVkIHRoZSBlbnRyeSB0byB0aGUgZGNhY2hlIGluIHRoZSBtZWFudGltZS4uCisgKiBTTVAtc2FmZQorICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqIHJlYWxfbG9va3VwKHN0cnVjdCBkZW50cnkgKiBwYXJlbnQsIHN0cnVjdCBxc3RyICogbmFtZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGRlbnRyeSAqIHJlc3VsdDsKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IHBhcmVudC0+ZF9pbm9kZTsKKworCWRvd24oJmRpci0+aV9zZW0pOworCS8qCisJICogRmlyc3QgcmUtZG8gdGhlIGNhY2hlZCBsb29rdXAganVzdCBpbiBjYXNlIGl0IHdhcyBjcmVhdGVkCisJICogd2hpbGUgd2Ugd2FpdGVkIGZvciB0aGUgZGlyZWN0b3J5IHNlbWFwaG9yZS4uCisJICoKKwkgKiBGSVhNRSEgVGhpcyBjb3VsZCB1c2UgdmVyc2lvbiBudW1iZXJpbmcgb3Igc2ltaWxhciB0bworCSAqIGF2b2lkIHVubmVjZXNzYXJ5IGNhY2hlIGxvb2t1cHMuCisJICoKKwkgKiBUaGUgImRjYWNoZV9sb2NrIiBpcyBwdXJlbHkgdG8gcHJvdGVjdCB0aGUgUkNVIGxpc3Qgd2Fsa2VyCisJICogZnJvbSBjb25jdXJyZW50IHJlbmFtZXMgYXQgdGhpcyBwb2ludCAod2UgbXVzdG4ndCBnZXQgZmFsc2UKKwkgKiBuZWdhdGl2ZXMgZnJvbSB0aGUgUkNVIGxpc3Qgd2FsayBoZXJlLCB1bmxpa2UgdGhlIG9wdGltaXN0aWMKKwkgKiBmYXN0IHdhbGspLgorCSAqCisJICogc28gZG9pbmcgZF9sb29rdXAoKSAod2l0aCBzZXFsb2NrKSwgaW5zdGVhZCBvZiBsb2NrZnJlZSBfX2RfbG9va3VwCisJICovCisJcmVzdWx0ID0gZF9sb29rdXAocGFyZW50LCBuYW1lKTsKKwlpZiAoIXJlc3VsdCkgeworCQlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gZF9hbGxvYyhwYXJlbnQsIG5hbWUpOworCQlyZXN1bHQgPSBFUlJfUFRSKC1FTk9NRU0pOworCQlpZiAoZGVudHJ5KSB7CisJCQlyZXN1bHQgPSBkaXItPmlfb3AtPmxvb2t1cChkaXIsIGRlbnRyeSwgbmQpOworCQkJaWYgKHJlc3VsdCkKKwkJCQlkcHV0KGRlbnRyeSk7CisJCQllbHNlCisJCQkJcmVzdWx0ID0gZGVudHJ5OworCQl9CisJCXVwKCZkaXItPmlfc2VtKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKgorCSAqIFVoaHVoISBOYXN0eSBjYXNlOiB0aGUgY2FjaGUgd2FzIHJlLXBvcHVsYXRlZCB3aGlsZQorCSAqIHdlIHdhaXRlZCBvbiB0aGUgc2VtYXBob3JlLiBOZWVkIHRvIHJldmFsaWRhdGUuCisJICovCisJdXAoJmRpci0+aV9zZW0pOworCWlmIChyZXN1bHQtPmRfb3AgJiYgcmVzdWx0LT5kX29wLT5kX3JldmFsaWRhdGUpIHsKKwkJaWYgKCFyZXN1bHQtPmRfb3AtPmRfcmV2YWxpZGF0ZShyZXN1bHQsIG5kKSAmJiAhZF9pbnZhbGlkYXRlKHJlc3VsdCkpIHsKKwkJCWRwdXQocmVzdWx0KTsKKwkJCXJlc3VsdCA9IEVSUl9QVFIoLUVOT0VOVCk7CisJCX0KKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBfX2VtdWxfbG9va3VwX2RlbnRyeShjb25zdCBjaGFyICosIHN0cnVjdCBuYW1laWRhdGEgKik7CisKKy8qIFNNUC1zYWZlICovCitzdGF0aWMgaW5saW5lIGludAord2Fsa19pbml0X3Jvb3QoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJcmVhZF9sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJaWYgKGN1cnJlbnQtPmZzLT5hbHRyb290ICYmICEobmQtPmZsYWdzICYgTE9PS1VQX05PQUxUKSkgeworCQluZC0+bW50ID0gbW50Z2V0KGN1cnJlbnQtPmZzLT5hbHRyb290bW50KTsKKwkJbmQtPmRlbnRyeSA9IGRnZXQoY3VycmVudC0+ZnMtPmFsdHJvb3QpOworCQlyZWFkX3VubG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCQlpZiAoX19lbXVsX2xvb2t1cF9kZW50cnkobmFtZSxuZCkpCisJCQlyZXR1cm4gMDsKKwkJcmVhZF9sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJfQorCW5kLT5tbnQgPSBtbnRnZXQoY3VycmVudC0+ZnMtPnJvb3RtbnQpOworCW5kLT5kZW50cnkgPSBkZ2V0KGN1cnJlbnQtPmZzLT5yb290KTsKKwlyZWFkX3VubG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX3Zmc19mb2xsb3dfbGluayhzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgY29uc3QgY2hhciAqbGluaykKK3sKKwlpbnQgcmVzID0gMDsKKwljaGFyICpuYW1lOworCWlmIChJU19FUlIobGluaykpCisJCWdvdG8gZmFpbDsKKworCWlmICgqbGluayA9PSAnLycpIHsKKwkJcGF0aF9yZWxlYXNlKG5kKTsKKwkJaWYgKCF3YWxrX2luaXRfcm9vdChsaW5rLCBuZCkpCisJCQkvKiB3ZWlyZCBfX2VtdWxfcHJlZml4KCkgc3R1ZmYgZGlkIGl0ICovCisJCQlnb3RvIG91dDsKKwl9CisJcmVzID0gbGlua19wYXRoX3dhbGsobGluaywgbmQpOworb3V0OgorCWlmIChuZC0+ZGVwdGggfHwgcmVzIHx8IG5kLT5sYXN0X3R5cGUhPUxBU1RfTk9STSkKKwkJcmV0dXJuIHJlczsKKwkvKgorCSAqIElmIGl0IGlzIGFuIGl0ZXJhdGl2ZSBzeW1saW5rcyByZXNvbHV0aW9uIGluIG9wZW5fbmFtZWkoKSB3ZQorCSAqIGhhdmUgdG8gY29weSB0aGUgbGFzdCBjb21wb25lbnQuIEFuZCBhbGwgdGhhdCBjcmFwIGJlY2F1c2Ugb2YKKwkgKiBibG9vZHkgY3JlYXRlKCkgb24gYnJva2VuIHN5bWxpbmtzLiBGdXJyZnUuLi4KKwkgKi8KKwluYW1lID0gX19nZXRuYW1lKCk7CisJaWYgKHVubGlrZWx5KCFuYW1lKSkgeworCQlwYXRoX3JlbGVhc2UobmQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3RyY3B5KG5hbWUsIG5kLT5sYXN0Lm5hbWUpOworCW5kLT5sYXN0Lm5hbWUgPSBuYW1lOworCXJldHVybiAwOworZmFpbDoKKwlwYXRoX3JlbGVhc2UobmQpOworCXJldHVybiBQVFJfRVJSKGxpbmspOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX2RvX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IGVycm9yOworCisJdG91Y2hfYXRpbWUobmQtPm1udCwgZGVudHJ5KTsKKwluZF9zZXRfbGluayhuZCwgTlVMTCk7CisJZXJyb3IgPSBkZW50cnktPmRfaW5vZGUtPmlfb3AtPmZvbGxvd19saW5rKGRlbnRyeSwgbmQpOworCWlmICghZXJyb3IpIHsKKwkJY2hhciAqcyA9IG5kX2dldF9saW5rKG5kKTsKKwkJaWYgKHMpCisJCQllcnJvciA9IF9fdmZzX2ZvbGxvd19saW5rKG5kLCBzKTsKKwkJaWYgKGRlbnRyeS0+ZF9pbm9kZS0+aV9vcC0+cHV0X2xpbmspCisJCQlkZW50cnktPmRfaW5vZGUtPmlfb3AtPnB1dF9saW5rKGRlbnRyeSwgbmQpOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFRoaXMgbGltaXRzIHJlY3Vyc2l2ZSBzeW1saW5rIGZvbGxvd3MgdG8gOCwgd2hpbGUKKyAqIGxpbWl0aW5nIGNvbnNlY3V0aXZlIHN5bWxpbmtzIHRvIDQwLgorICoKKyAqIFdpdGhvdXQgdGhhdCBraW5kIG9mIHRvdGFsIGxpbWl0LCBuYXN0eSBjaGFpbnMgb2YgY29uc2VjdXRpdmUKKyAqIHN5bWxpbmtzIGNhbiBjYXVzZSBhbG1vc3QgYXJiaXRyYXJpbHkgbG9uZyBsb29rdXBzLiAKKyAqLworc3RhdGljIGlubGluZSBpbnQgZG9fZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlpbnQgZXJyID0gLUVMT09QOworCWlmIChjdXJyZW50LT5saW5rX2NvdW50ID49IE1BWF9ORVNURURfTElOS1MpCisJCWdvdG8gbG9vcDsKKwlpZiAoY3VycmVudC0+dG90YWxfbGlua19jb3VudCA+PSA0MCkKKwkJZ290byBsb29wOworCUJVR19PTihuZC0+ZGVwdGggPj0gTUFYX05FU1RFRF9MSU5LUyk7CisJY29uZF9yZXNjaGVkKCk7CisJZXJyID0gc2VjdXJpdHlfaW5vZGVfZm9sbG93X2xpbmsoZGVudHJ5LCBuZCk7CisJaWYgKGVycikKKwkJZ290byBsb29wOworCWN1cnJlbnQtPmxpbmtfY291bnQrKzsKKwljdXJyZW50LT50b3RhbF9saW5rX2NvdW50Kys7CisJbmQtPmRlcHRoKys7CisJZXJyID0gX19kb19mb2xsb3dfbGluayhkZW50cnksIG5kKTsKKwljdXJyZW50LT5saW5rX2NvdW50LS07CisJbmQtPmRlcHRoLS07CisJcmV0dXJuIGVycjsKK2xvb3A6CisJcGF0aF9yZWxlYXNlKG5kKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgZm9sbG93X3VwKHN0cnVjdCB2ZnNtb3VudCAqKm1udCwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKnBhcmVudDsKKwlzdHJ1Y3QgZGVudHJ5ICptb3VudHBvaW50OworCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisJcGFyZW50PSgqbW50KS0+bW50X3BhcmVudDsKKwlpZiAocGFyZW50ID09ICptbnQpIHsKKwkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisJbW50Z2V0KHBhcmVudCk7CisJbW91bnRwb2ludD1kZ2V0KCgqbW50KS0+bW50X21vdW50cG9pbnQpOworCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwlkcHV0KCpkZW50cnkpOworCSpkZW50cnkgPSBtb3VudHBvaW50OworCW1udHB1dCgqbW50KTsKKwkqbW50ID0gcGFyZW50OworCXJldHVybiAxOworfQorCisvKiBubyBuZWVkIGZvciBkY2FjaGVfbG9jaywgYXMgc2VyaWFsaXphdGlvbiBpcyB0YWtlbiBjYXJlIGluCisgKiBuYW1lc3BhY2UuYworICovCitzdGF0aWMgaW50IGZvbGxvd19tb3VudChzdHJ1Y3QgdmZzbW91bnQgKiptbnQsIHN0cnVjdCBkZW50cnkgKipkZW50cnkpCit7CisJaW50IHJlcyA9IDA7CisJd2hpbGUgKGRfbW91bnRwb2ludCgqZGVudHJ5KSkgeworCQlzdHJ1Y3QgdmZzbW91bnQgKm1vdW50ZWQgPSBsb29rdXBfbW50KCptbnQsICpkZW50cnkpOworCQlpZiAoIW1vdW50ZWQpCisJCQlicmVhazsKKwkJbW50cHV0KCptbnQpOworCQkqbW50ID0gbW91bnRlZDsKKwkJZHB1dCgqZGVudHJ5KTsKKwkJKmRlbnRyeSA9IGRnZXQobW91bnRlZC0+bW50X3Jvb3QpOworCQlyZXMgPSAxOworCX0KKwlyZXR1cm4gcmVzOworfQorCisvKiBubyBuZWVkIGZvciBkY2FjaGVfbG9jaywgYXMgc2VyaWFsaXphdGlvbiBpcyB0YWtlbiBjYXJlIGluCisgKiBuYW1lc3BhY2UuYworICovCitzdGF0aWMgaW5saW5lIGludCBfX2ZvbGxvd19kb3duKHN0cnVjdCB2ZnNtb3VudCAqKm1udCwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1vdW50ZWQ7CisKKwltb3VudGVkID0gbG9va3VwX21udCgqbW50LCAqZGVudHJ5KTsKKwlpZiAobW91bnRlZCkgeworCQltbnRwdXQoKm1udCk7CisJCSptbnQgPSBtb3VudGVkOworCQlkcHV0KCpkZW50cnkpOworCQkqZGVudHJ5ID0gZGdldChtb3VudGVkLT5tbnRfcm9vdCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGZvbGxvd19kb3duKHN0cnVjdCB2ZnNtb3VudCAqKm1udCwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSkKK3sKKwlyZXR1cm4gX19mb2xsb3dfZG93bihtbnQsZGVudHJ5KTsKK30KKyAKK3N0YXRpYyBpbmxpbmUgdm9pZCBmb2xsb3dfZG90ZG90KHN0cnVjdCB2ZnNtb3VudCAqKm1udCwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSkKK3sKKwl3aGlsZSgxKSB7CisJCXN0cnVjdCB2ZnNtb3VudCAqcGFyZW50OworCQlzdHJ1Y3QgZGVudHJ5ICpvbGQgPSAqZGVudHJ5OworCisgICAgICAgICAgICAgICAgcmVhZF9sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJCWlmICgqZGVudHJ5ID09IGN1cnJlbnQtPmZzLT5yb290ICYmCisJCSAgICAqbW50ID09IGN1cnJlbnQtPmZzLT5yb290bW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3VubG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgICAgICAgICByZWFkX3VubG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCQlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwkJaWYgKCpkZW50cnkgIT0gKCptbnQpLT5tbnRfcm9vdCkgeworCQkJKmRlbnRyeSA9IGRnZXQoKCpkZW50cnkpLT5kX3BhcmVudCk7CisJCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQkJZHB1dChvbGQpOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJcGFyZW50ID0gKCptbnQpLT5tbnRfcGFyZW50OworCQlpZiAocGFyZW50ID09ICptbnQpIHsKKwkJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJCWJyZWFrOworCQl9CisJCW1udGdldChwYXJlbnQpOworCQkqZGVudHJ5ID0gZGdldCgoKm1udCktPm1udF9tb3VudHBvaW50KTsKKwkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCQlkcHV0KG9sZCk7CisJCW1udHB1dCgqbW50KTsKKwkJKm1udCA9IHBhcmVudDsKKwl9CisJZm9sbG93X21vdW50KG1udCwgZGVudHJ5KTsKK30KKworc3RydWN0IHBhdGggeworCXN0cnVjdCB2ZnNtb3VudCAqbW50OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKK307CisKKy8qCisgKiAgSXQncyBtb3JlIGNvbnZvbHV0ZWQgdGhhbiBJJ2QgbGlrZSBpdCB0byBiZSwgYnV0Li4uIGl0J3Mgc3RpbGwgZmFpcmx5CisgKiAgc21hbGwgYW5kIGZvciBub3cgSSdkIHByZWZlciB0byBoYXZlIGZhc3QgcGF0aCBhcyBzdHJhaWdodCBhcyBwb3NzaWJsZS4KKyAqICBJdCBfaXNfIHRpbWUtY3JpdGljYWwuCisgKi8KK3N0YXRpYyBpbnQgZG9fbG9va3VwKHN0cnVjdCBuYW1laWRhdGEgKm5kLCBzdHJ1Y3QgcXN0ciAqbmFtZSwKKwkJICAgICBzdHJ1Y3QgcGF0aCAqcGF0aCkKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IG5kLT5tbnQ7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gX19kX2xvb2t1cChuZC0+ZGVudHJ5LCBuYW1lKTsKKworCWlmICghZGVudHJ5KQorCQlnb3RvIG5lZWRfbG9va3VwOworCWlmIChkZW50cnktPmRfb3AgJiYgZGVudHJ5LT5kX29wLT5kX3JldmFsaWRhdGUpCisJCWdvdG8gbmVlZF9yZXZhbGlkYXRlOworZG9uZToKKwlwYXRoLT5tbnQgPSBtbnQ7CisJcGF0aC0+ZGVudHJ5ID0gZGVudHJ5OworCXJldHVybiAwOworCituZWVkX2xvb2t1cDoKKwlkZW50cnkgPSByZWFsX2xvb2t1cChuZC0+ZGVudHJ5LCBuYW1lLCBuZCk7CisJaWYgKElTX0VSUihkZW50cnkpKQorCQlnb3RvIGZhaWw7CisJZ290byBkb25lOworCituZWVkX3JldmFsaWRhdGU6CisJaWYgKGRlbnRyeS0+ZF9vcC0+ZF9yZXZhbGlkYXRlKGRlbnRyeSwgbmQpKQorCQlnb3RvIGRvbmU7CisJaWYgKGRfaW52YWxpZGF0ZShkZW50cnkpKQorCQlnb3RvIGRvbmU7CisJZHB1dChkZW50cnkpOworCWdvdG8gbmVlZF9sb29rdXA7CisKK2ZhaWw6CisJcmV0dXJuIFBUUl9FUlIoZGVudHJ5KTsKK30KKworLyoKKyAqIE5hbWUgcmVzb2x1dGlvbi4KKyAqCisgKiBUaGlzIGlzIHRoZSBiYXNpYyBuYW1lIHJlc29sdXRpb24gZnVuY3Rpb24sIHR1cm5pbmcgYSBwYXRobmFtZQorICogaW50byB0aGUgZmluYWwgZGVudHJ5LgorICoKKyAqIFdlIGV4cGVjdCAnYmFzZScgdG8gYmUgcG9zaXRpdmUgYW5kIGEgZGlyZWN0b3J5LgorICovCitzdGF0aWMgZmFzdGNhbGwgaW50IF9fbGlua19wYXRoX3dhbGsoY29uc3QgY2hhciAqIG5hbWUsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBwYXRoIG5leHQ7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBsb29rdXBfZmxhZ3MgPSBuZC0+ZmxhZ3M7CisJCisJd2hpbGUgKCpuYW1lPT0nLycpCisJCW5hbWUrKzsKKwlpZiAoISpuYW1lKQorCQlnb3RvIHJldHVybl9yZXZhbDsKKworCWlub2RlID0gbmQtPmRlbnRyeS0+ZF9pbm9kZTsKKwlpZiAobmQtPmRlcHRoKQorCQlsb29rdXBfZmxhZ3MgPSBMT09LVVBfRk9MTE9XOworCisJLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHdlIGhhdmUgYSByZWFsIHBhdGggY29tcG9uZW50LiAqLworCWZvcig7OykgeworCQl1bnNpZ25lZCBsb25nIGhhc2g7CisJCXN0cnVjdCBxc3RyIHRoaXM7CisJCXVuc2lnbmVkIGludCBjOworCisJCWVyciA9IGV4ZWNfcGVybWlzc2lvbl9saXRlKGlub2RlLCBuZCk7CisJCWlmIChlcnIgPT0gLUVBR0FJTikgeyAKKwkJCWVyciA9IHBlcm1pc3Npb24oaW5vZGUsIE1BWV9FWEVDLCBuZCk7CisJCX0KKyAJCWlmIChlcnIpCisJCQlicmVhazsKKworCQl0aGlzLm5hbWUgPSBuYW1lOworCQljID0gKihjb25zdCB1bnNpZ25lZCBjaGFyICopbmFtZTsKKworCQloYXNoID0gaW5pdF9uYW1lX2hhc2goKTsKKwkJZG8geworCQkJbmFtZSsrOworCQkJaGFzaCA9IHBhcnRpYWxfbmFtZV9oYXNoKGMsIGhhc2gpOworCQkJYyA9ICooY29uc3QgdW5zaWduZWQgY2hhciAqKW5hbWU7CisJCX0gd2hpbGUgKGMgJiYgKGMgIT0gJy8nKSk7CisJCXRoaXMubGVuID0gbmFtZSAtIChjb25zdCBjaGFyICopIHRoaXMubmFtZTsKKwkJdGhpcy5oYXNoID0gZW5kX25hbWVfaGFzaChoYXNoKTsKKworCQkvKiByZW1vdmUgdHJhaWxpbmcgc2xhc2hlcz8gKi8KKwkJaWYgKCFjKQorCQkJZ290byBsYXN0X2NvbXBvbmVudDsKKwkJd2hpbGUgKCorK25hbWUgPT0gJy8nKTsKKwkJaWYgKCEqbmFtZSkKKwkJCWdvdG8gbGFzdF93aXRoX3NsYXNoZXM7CisKKwkJLyoKKwkJICogIi4iIGFuZCAiLi4iIGFyZSBzcGVjaWFsIC0gIi4uIiBlc3BlY2lhbGx5IHNvIGJlY2F1c2UgaXQgaGFzCisJCSAqIHRvIGJlIGFibGUgdG8ga25vdyBhYm91dCB0aGUgY3VycmVudCByb290IGRpcmVjdG9yeSBhbmQKKwkJICogcGFyZW50IHJlbGF0aW9uc2hpcHMuCisJCSAqLworCQlpZiAodGhpcy5uYW1lWzBdID09ICcuJykgc3dpdGNoICh0aGlzLmxlbikgeworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoJCisJCQkJaWYgKHRoaXMubmFtZVsxXSAhPSAnLicpCisJCQkJCWJyZWFrOworCQkJCWZvbGxvd19kb3Rkb3QoJm5kLT5tbnQsICZuZC0+ZGVudHJ5KTsKKwkJCQlpbm9kZSA9IG5kLT5kZW50cnktPmRfaW5vZGU7CisJCQkJLyogZmFsbHRocm91Z2ggKi8KKwkJCWNhc2UgMToKKwkJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBTZWUgaWYgdGhlIGxvdy1sZXZlbCBmaWxlc3lzdGVtIG1pZ2h0IHdhbnQKKwkJICogdG8gdXNlIGl0cyBvd24gaGFzaC4uCisJCSAqLworCQlpZiAobmQtPmRlbnRyeS0+ZF9vcCAmJiBuZC0+ZGVudHJ5LT5kX29wLT5kX2hhc2gpIHsKKwkJCWVyciA9IG5kLT5kZW50cnktPmRfb3AtPmRfaGFzaChuZC0+ZGVudHJ5LCAmdGhpcyk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlicmVhazsKKwkJfQorCQluZC0+ZmxhZ3MgfD0gTE9PS1VQX0NPTlRJTlVFOworCQkvKiBUaGlzIGRvZXMgdGhlIGFjdHVhbCBsb29rdXBzLi4gKi8KKwkJZXJyID0gZG9fbG9va3VwKG5kLCAmdGhpcywgJm5leHQpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJCS8qIENoZWNrIG1vdW50cG9pbnRzLi4gKi8KKwkJZm9sbG93X21vdW50KCZuZXh0Lm1udCwgJm5leHQuZGVudHJ5KTsKKworCQllcnIgPSAtRU5PRU5UOworCQlpbm9kZSA9IG5leHQuZGVudHJ5LT5kX2lub2RlOworCQlpZiAoIWlub2RlKQorCQkJZ290byBvdXRfZHB1dDsKKwkJZXJyID0gLUVOT1RESVI7IAorCQlpZiAoIWlub2RlLT5pX29wKQorCQkJZ290byBvdXRfZHB1dDsKKworCQlpZiAoaW5vZGUtPmlfb3AtPmZvbGxvd19saW5rKSB7CisJCQltbnRnZXQobmV4dC5tbnQpOworCQkJZXJyID0gZG9fZm9sbG93X2xpbmsobmV4dC5kZW50cnksIG5kKTsKKwkJCWRwdXQobmV4dC5kZW50cnkpOworCQkJbW50cHV0KG5leHQubW50KTsKKwkJCWlmIChlcnIpCisJCQkJZ290byByZXR1cm5fZXJyOworCQkJZXJyID0gLUVOT0VOVDsKKwkJCWlub2RlID0gbmQtPmRlbnRyeS0+ZF9pbm9kZTsKKwkJCWlmICghaW5vZGUpCisJCQkJYnJlYWs7CisJCQllcnIgPSAtRU5PVERJUjsgCisJCQlpZiAoIWlub2RlLT5pX29wKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJZHB1dChuZC0+ZGVudHJ5KTsKKwkJCW5kLT5tbnQgPSBuZXh0Lm1udDsKKwkJCW5kLT5kZW50cnkgPSBuZXh0LmRlbnRyeTsKKwkJfQorCQllcnIgPSAtRU5PVERJUjsgCisJCWlmICghaW5vZGUtPmlfb3AtPmxvb2t1cCkKKwkJCWJyZWFrOworCQljb250aW51ZTsKKwkJLyogaGVyZSBlbmRzIHRoZSBtYWluIGxvb3AgKi8KKworbGFzdF93aXRoX3NsYXNoZXM6CisJCWxvb2t1cF9mbGFncyB8PSBMT09LVVBfRk9MTE9XIHwgTE9PS1VQX0RJUkVDVE9SWTsKK2xhc3RfY29tcG9uZW50OgorCQluZC0+ZmxhZ3MgJj0gfkxPT0tVUF9DT05USU5VRTsKKwkJaWYgKGxvb2t1cF9mbGFncyAmIExPT0tVUF9QQVJFTlQpCisJCQlnb3RvIGxvb2t1cF9wYXJlbnQ7CisJCWlmICh0aGlzLm5hbWVbMF0gPT0gJy4nKSBzd2l0Y2ggKHRoaXMubGVuKSB7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJY2FzZSAyOgkKKwkJCQlpZiAodGhpcy5uYW1lWzFdICE9ICcuJykKKwkJCQkJYnJlYWs7CisJCQkJZm9sbG93X2RvdGRvdCgmbmQtPm1udCwgJm5kLT5kZW50cnkpOworCQkJCWlub2RlID0gbmQtPmRlbnRyeS0+ZF9pbm9kZTsKKwkJCQkvKiBmYWxsdGhyb3VnaCAqLworCQkJY2FzZSAxOgorCQkJCWdvdG8gcmV0dXJuX3JldmFsOworCQl9CisJCWlmIChuZC0+ZGVudHJ5LT5kX29wICYmIG5kLT5kZW50cnktPmRfb3AtPmRfaGFzaCkgeworCQkJZXJyID0gbmQtPmRlbnRyeS0+ZF9vcC0+ZF9oYXNoKG5kLT5kZW50cnksICZ0aGlzKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWJyZWFrOworCQl9CisJCWVyciA9IGRvX2xvb2t1cChuZCwgJnRoaXMsICZuZXh0KTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCQlmb2xsb3dfbW91bnQoJm5leHQubW50LCAmbmV4dC5kZW50cnkpOworCQlpbm9kZSA9IG5leHQuZGVudHJ5LT5kX2lub2RlOworCQlpZiAoKGxvb2t1cF9mbGFncyAmIExPT0tVUF9GT0xMT1cpCisJCSAgICAmJiBpbm9kZSAmJiBpbm9kZS0+aV9vcCAmJiBpbm9kZS0+aV9vcC0+Zm9sbG93X2xpbmspIHsKKwkJCW1udGdldChuZXh0Lm1udCk7CisJCQllcnIgPSBkb19mb2xsb3dfbGluayhuZXh0LmRlbnRyeSwgbmQpOworCQkJZHB1dChuZXh0LmRlbnRyeSk7CisJCQltbnRwdXQobmV4dC5tbnQpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIHJldHVybl9lcnI7CisJCQlpbm9kZSA9IG5kLT5kZW50cnktPmRfaW5vZGU7CisJCX0gZWxzZSB7CisJCQlkcHV0KG5kLT5kZW50cnkpOworCQkJbmQtPm1udCA9IG5leHQubW50OworCQkJbmQtPmRlbnRyeSA9IG5leHQuZGVudHJ5OworCQl9CisJCWVyciA9IC1FTk9FTlQ7CisJCWlmICghaW5vZGUpCisJCQlicmVhazsKKwkJaWYgKGxvb2t1cF9mbGFncyAmIExPT0tVUF9ESVJFQ1RPUlkpIHsKKwkJCWVyciA9IC1FTk9URElSOyAKKwkJCWlmICghaW5vZGUtPmlfb3AgfHwgIWlub2RlLT5pX29wLT5sb29rdXApCisJCQkJYnJlYWs7CisJCX0KKwkJZ290byByZXR1cm5fYmFzZTsKK2xvb2t1cF9wYXJlbnQ6CisJCW5kLT5sYXN0ID0gdGhpczsKKwkJbmQtPmxhc3RfdHlwZSA9IExBU1RfTk9STTsKKwkJaWYgKHRoaXMubmFtZVswXSAhPSAnLicpCisJCQlnb3RvIHJldHVybl9iYXNlOworCQlpZiAodGhpcy5sZW4gPT0gMSkKKwkJCW5kLT5sYXN0X3R5cGUgPSBMQVNUX0RPVDsKKwkJZWxzZSBpZiAodGhpcy5sZW4gPT0gMiAmJiB0aGlzLm5hbWVbMV0gPT0gJy4nKQorCQkJbmQtPmxhc3RfdHlwZSA9IExBU1RfRE9URE9UOworCQllbHNlCisJCQlnb3RvIHJldHVybl9iYXNlOworcmV0dXJuX3JldmFsOgorCQkvKgorCQkgKiBXZSBieXBhc3NlZCB0aGUgb3JkaW5hcnkgcmV2YWxpZGF0aW9uIHJvdXRpbmVzLgorCQkgKiBXZSBtYXkgbmVlZCB0byBjaGVjayB0aGUgY2FjaGVkIGRlbnRyeSBmb3Igc3RhbGVuZXNzLgorCQkgKi8KKwkJaWYgKG5kLT5kZW50cnkgJiYgbmQtPmRlbnRyeS0+ZF9zYiAmJgorCQkgICAgKG5kLT5kZW50cnktPmRfc2ItPnNfdHlwZS0+ZnNfZmxhZ3MgJiBGU19SRVZBTF9ET1QpKSB7CisJCQllcnIgPSAtRVNUQUxFOworCQkJLyogTm90ZTogd2UgZG8gbm90IGRfaW52YWxpZGF0ZSgpICovCisJCQlpZiAoIW5kLT5kZW50cnktPmRfb3AtPmRfcmV2YWxpZGF0ZShuZC0+ZGVudHJ5LCBuZCkpCisJCQkJYnJlYWs7CisJCX0KK3JldHVybl9iYXNlOgorCQlyZXR1cm4gMDsKK291dF9kcHV0OgorCQlkcHV0KG5leHQuZGVudHJ5KTsKKwkJYnJlYWs7CisJfQorCXBhdGhfcmVsZWFzZShuZCk7CityZXR1cm5fZXJyOgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBXcmFwcGVyIHRvIHJldHJ5IHBhdGhuYW1lIHJlc29sdXRpb24gd2hlbmV2ZXIgdGhlIHVuZGVybHlpbmcKKyAqIGZpbGUgc3lzdGVtIHJldHVybnMgYW4gRVNUQUxFLgorICoKKyAqIFJldHJ5IHRoZSB3aG9sZSBwYXRoIG9uY2UsIGZvcmNpbmcgcmVhbCBsb29rdXAgcmVxdWVzdHMKKyAqIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aGUgZGNhY2hlLgorICovCitpbnQgZmFzdGNhbGwgbGlua19wYXRoX3dhbGsoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IG5hbWVpZGF0YSBzYXZlID0gKm5kOworCWludCByZXN1bHQ7CisKKwkvKiBtYWtlIHN1cmUgdGhlIHN0dWZmIHdlIHNhdmVkIGRvZXNuJ3QgZ28gYXdheSAqLworCWRnZXQoc2F2ZS5kZW50cnkpOworCW1udGdldChzYXZlLm1udCk7CisKKwlyZXN1bHQgPSBfX2xpbmtfcGF0aF93YWxrKG5hbWUsIG5kKTsKKwlpZiAocmVzdWx0ID09IC1FU1RBTEUpIHsKKwkJKm5kID0gc2F2ZTsKKwkJZGdldChuZC0+ZGVudHJ5KTsKKwkJbW50Z2V0KG5kLT5tbnQpOworCQluZC0+ZmxhZ3MgfD0gTE9PS1VQX1JFVkFMOworCQlyZXN1bHQgPSBfX2xpbmtfcGF0aF93YWxrKG5hbWUsIG5kKTsKKwl9CisKKwlkcHV0KHNhdmUuZGVudHJ5KTsKKwltbnRwdXQoc2F2ZS5tbnQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGZhc3RjYWxsIHBhdGhfd2Fsayhjb25zdCBjaGFyICogbmFtZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJY3VycmVudC0+dG90YWxfbGlua19jb3VudCA9IDA7CisJcmV0dXJuIGxpbmtfcGF0aF93YWxrKG5hbWUsIG5kKTsKK30KKworLyogU01QLXNhZmUgKi8KKy8qIHJldHVybnMgMSBpZiBldmVyeXRoaW5nIGlzIGRvbmUgKi8KK3N0YXRpYyBpbnQgX19lbXVsX2xvb2t1cF9kZW50cnkoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaWYgKHBhdGhfd2FsayhuYW1lLCBuZCkpCisJCXJldHVybiAwOwkJLyogc29tZXRoaW5nIHdlbnQgd3JvbmcuLi4gKi8KKworCWlmICghbmQtPmRlbnRyeS0+ZF9pbm9kZSB8fCBTX0lTRElSKG5kLT5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpIHsKKwkJc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSA9IG5kLT5kZW50cnk7CisJCXN0cnVjdCB2ZnNtb3VudCAqb2xkX21udCA9IG5kLT5tbnQ7CisJCXN0cnVjdCBxc3RyIGxhc3QgPSBuZC0+bGFzdDsKKwkJaW50IGxhc3RfdHlwZSA9IG5kLT5sYXN0X3R5cGU7CisJCS8qCisJCSAqIE5BTUUgd2FzIG5vdCBmb3VuZCBpbiBhbHRlcm5hdGUgcm9vdCBvciBpdCdzIGEgZGlyZWN0b3J5LiAgVHJ5IHRvIGZpbmQKKwkJICogaXQgaW4gdGhlIG5vcm1hbCByb290OgorCQkgKi8KKwkJbmQtPmxhc3RfdHlwZSA9IExBU1RfUk9PVDsKKwkJcmVhZF9sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJCW5kLT5tbnQgPSBtbnRnZXQoY3VycmVudC0+ZnMtPnJvb3RtbnQpOworCQluZC0+ZGVudHJ5ID0gZGdldChjdXJyZW50LT5mcy0+cm9vdCk7CisJCXJlYWRfdW5sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJCWlmIChwYXRoX3dhbGsobmFtZSwgbmQpID09IDApIHsKKwkJCWlmIChuZC0+ZGVudHJ5LT5kX2lub2RlKSB7CisJCQkJZHB1dChvbGRfZGVudHJ5KTsKKwkJCQltbnRwdXQob2xkX21udCk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlwYXRoX3JlbGVhc2UobmQpOworCQl9CisJCW5kLT5kZW50cnkgPSBvbGRfZGVudHJ5OworCQluZC0+bW50ID0gb2xkX21udDsKKwkJbmQtPmxhc3QgPSBsYXN0OworCQluZC0+bGFzdF90eXBlID0gbGFzdF90eXBlOworCX0KKwlyZXR1cm4gMTsKK30KKwordm9pZCBzZXRfZnNfYWx0cm9vdCh2b2lkKQoreworCWNoYXIgKmVtdWwgPSBfX2VtdWxfcHJlZml4KCk7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IE5VTEwsICpvbGRtbnQ7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gTlVMTCwgKm9sZGRlbnRyeTsKKwlpbnQgZXJyOworCisJaWYgKCFlbXVsKQorCQlnb3RvIHNldF9pdDsKKwllcnIgPSBwYXRoX2xvb2t1cChlbXVsLCBMT09LVVBfRk9MTE9XfExPT0tVUF9ESVJFQ1RPUll8TE9PS1VQX05PQUxULCAmbmQpOworCWlmICghZXJyKSB7CisJCW1udCA9IG5kLm1udDsKKwkJZGVudHJ5ID0gbmQuZGVudHJ5OworCX0KK3NldF9pdDoKKwl3cml0ZV9sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJb2xkbW50ID0gY3VycmVudC0+ZnMtPmFsdHJvb3RtbnQ7CisJb2xkZGVudHJ5ID0gY3VycmVudC0+ZnMtPmFsdHJvb3Q7CisJY3VycmVudC0+ZnMtPmFsdHJvb3RtbnQgPSBtbnQ7CisJY3VycmVudC0+ZnMtPmFsdHJvb3QgPSBkZW50cnk7CisJd3JpdGVfdW5sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJaWYgKG9sZGRlbnRyeSkgeworCQlkcHV0KG9sZGRlbnRyeSk7CisJCW1udHB1dChvbGRtbnQpOworCX0KK30KKworaW50IGZhc3RjYWxsIHBhdGhfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IHJldHZhbDsKKworCW5kLT5sYXN0X3R5cGUgPSBMQVNUX1JPT1Q7IC8qIGlmIHRoZXJlIGFyZSBvbmx5IHNsYXNoZXMuLi4gKi8KKwluZC0+ZmxhZ3MgPSBmbGFnczsKKwluZC0+ZGVwdGggPSAwOworCisJcmVhZF9sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJaWYgKCpuYW1lPT0nLycpIHsKKwkJaWYgKGN1cnJlbnQtPmZzLT5hbHRyb290ICYmICEobmQtPmZsYWdzICYgTE9PS1VQX05PQUxUKSkgeworCQkJbmQtPm1udCA9IG1udGdldChjdXJyZW50LT5mcy0+YWx0cm9vdG1udCk7CisJCQluZC0+ZGVudHJ5ID0gZGdldChjdXJyZW50LT5mcy0+YWx0cm9vdCk7CisJCQlyZWFkX3VubG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCQkJaWYgKF9fZW11bF9sb29rdXBfZGVudHJ5KG5hbWUsbmQpKQorCQkJCXJldHVybiAwOworCQkJcmVhZF9sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJCX0KKwkJbmQtPm1udCA9IG1udGdldChjdXJyZW50LT5mcy0+cm9vdG1udCk7CisJCW5kLT5kZW50cnkgPSBkZ2V0KGN1cnJlbnQtPmZzLT5yb290KTsKKwl9IGVsc2UgeworCQluZC0+bW50ID0gbW50Z2V0KGN1cnJlbnQtPmZzLT5wd2RtbnQpOworCQluZC0+ZGVudHJ5ID0gZGdldChjdXJyZW50LT5mcy0+cHdkKTsKKwl9CisJcmVhZF91bmxvY2soJmN1cnJlbnQtPmZzLT5sb2NrKTsKKwljdXJyZW50LT50b3RhbF9saW5rX2NvdW50ID0gMDsKKwlyZXR2YWwgPSBsaW5rX3BhdGhfd2FsayhuYW1lLCBuZCk7CisJaWYgKHVubGlrZWx5KGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQKKwkJICAgICAmJiBuZCAmJiBuZC0+ZGVudHJ5ICYmIG5kLT5kZW50cnktPmRfaW5vZGUpKQorCQlhdWRpdF9pbm9kZShuYW1lLCBuZC0+ZGVudHJ5LT5kX2lub2RlKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogUmVzdHJpY3RlZCBmb3JtIG9mIGxvb2t1cC4gRG9lc24ndCBmb2xsb3cgbGlua3MsIHNpbmdsZS1jb21wb25lbnQgb25seSwKKyAqIG5lZWRzIHBhcmVudCBhbHJlYWR5IGxvY2tlZC4gRG9lc24ndCBmb2xsb3cgbW91bnRzLgorICogU01QLXNhZmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICogX19sb29rdXBfaGFzaChzdHJ1Y3QgcXN0ciAqbmFtZSwgc3RydWN0IGRlbnRyeSAqIGJhc2UsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBkZW50cnkgKiBkZW50cnk7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgZXJyOworCisJaW5vZGUgPSBiYXNlLT5kX2lub2RlOworCWVyciA9IHBlcm1pc3Npb24oaW5vZGUsIE1BWV9FWEVDLCBuZCk7CisJZGVudHJ5ID0gRVJSX1BUUihlcnIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBTZWUgaWYgdGhlIGxvdy1sZXZlbCBmaWxlc3lzdGVtIG1pZ2h0IHdhbnQKKwkgKiB0byB1c2UgaXRzIG93biBoYXNoLi4KKwkgKi8KKwlpZiAoYmFzZS0+ZF9vcCAmJiBiYXNlLT5kX29wLT5kX2hhc2gpIHsKKwkJZXJyID0gYmFzZS0+ZF9vcC0+ZF9oYXNoKGJhc2UsIG5hbWUpOworCQlkZW50cnkgPSBFUlJfUFRSKGVycik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCisJZGVudHJ5ID0gY2FjaGVkX2xvb2t1cChiYXNlLCBuYW1lLCBuZCk7CisJaWYgKCFkZW50cnkpIHsKKwkJc3RydWN0IGRlbnRyeSAqbmV3ID0gZF9hbGxvYyhiYXNlLCBuYW1lKTsKKwkJZGVudHJ5ID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJaWYgKCFuZXcpCisJCQlnb3RvIG91dDsKKwkJZGVudHJ5ID0gaW5vZGUtPmlfb3AtPmxvb2t1cChpbm9kZSwgbmV3LCBuZCk7CisJCWlmICghZGVudHJ5KQorCQkJZGVudHJ5ID0gbmV3OworCQllbHNlCisJCQlkcHV0KG5ldyk7CisJfQorb3V0OgorCXJldHVybiBkZW50cnk7Cit9CisKK3N0cnVjdCBkZW50cnkgKiBsb29rdXBfaGFzaChzdHJ1Y3QgcXN0ciAqbmFtZSwgc3RydWN0IGRlbnRyeSAqIGJhc2UpCit7CisJcmV0dXJuIF9fbG9va3VwX2hhc2gobmFtZSwgYmFzZSwgTlVMTCk7Cit9CisKKy8qIFNNUC1zYWZlICovCitzdHJ1Y3QgZGVudHJ5ICogbG9va3VwX29uZV9sZW4oY29uc3QgY2hhciAqIG5hbWUsIHN0cnVjdCBkZW50cnkgKiBiYXNlLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgaGFzaDsKKwlzdHJ1Y3QgcXN0ciB0aGlzOworCXVuc2lnbmVkIGludCBjOworCisJdGhpcy5uYW1lID0gbmFtZTsKKwl0aGlzLmxlbiA9IGxlbjsKKwlpZiAoIWxlbikKKwkJZ290byBhY2Nlc3M7CisKKwloYXNoID0gaW5pdF9uYW1lX2hhc2goKTsKKwl3aGlsZSAobGVuLS0pIHsKKwkJYyA9ICooY29uc3QgdW5zaWduZWQgY2hhciAqKW5hbWUrKzsKKwkJaWYgKGMgPT0gJy8nIHx8IGMgPT0gJ1wwJykKKwkJCWdvdG8gYWNjZXNzOworCQloYXNoID0gcGFydGlhbF9uYW1lX2hhc2goYywgaGFzaCk7CisJfQorCXRoaXMuaGFzaCA9IGVuZF9uYW1lX2hhc2goaGFzaCk7CisKKwlyZXR1cm4gbG9va3VwX2hhc2goJnRoaXMsIGJhc2UpOworYWNjZXNzOgorCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworfQorCisvKgorICoJbmFtZWkoKQorICoKKyAqIGlzIHVzZWQgYnkgbW9zdCBzaW1wbGUgY29tbWFuZHMgdG8gZ2V0IHRoZSBpbm9kZSBvZiBhIHNwZWNpZmllZCBuYW1lLgorICogT3BlbiwgbGluayBldGMgdXNlIHRoZWlyIG93biByb3V0aW5lcywgYnV0IHRoaXMgaXMgZW5vdWdoIGZvciB0aGluZ3MKKyAqIGxpa2UgJ2NobW9kJyBldGMuCisgKgorICogbmFtZWkgZXhpc3RzIGluIHR3byB2ZXJzaW9uczogbmFtZWkvbG5hbWVpLiBUaGUgb25seSBkaWZmZXJlbmNlIGlzCisgKiB0aGF0IG5hbWVpIGZvbGxvd3MgbGlua3MsIHdoaWxlIGxuYW1laSBkb2VzIG5vdC4KKyAqIFNNUC1zYWZlCisgKi8KK2ludCBmYXN0Y2FsbCBfX3VzZXJfd2Fsayhjb25zdCBjaGFyIF9fdXNlciAqbmFtZSwgdW5zaWduZWQgZmxhZ3MsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWNoYXIgKnRtcCA9IGdldG5hbWUobmFtZSk7CisJaW50IGVyciA9IFBUUl9FUlIodG1wKTsKKworCWlmICghSVNfRVJSKHRtcCkpIHsKKwkJZXJyID0gcGF0aF9sb29rdXAodG1wLCBmbGFncywgbmQpOworCQlwdXRuYW1lKHRtcCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBJdCdzIGlubGluZSwgc28gcGVuYWx0eSBmb3IgZmlsZXN5c3RlbXMgdGhhdCBkb24ndCB1c2Ugc3RpY2t5IGJpdCBpcworICogbWluaW1hbC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfc3RpY2t5KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmICghKGRpci0+aV9tb2RlICYgU19JU1ZUWCkpCisJCXJldHVybiAwOworCWlmIChpbm9kZS0+aV91aWQgPT0gY3VycmVudC0+ZnN1aWQpCisJCXJldHVybiAwOworCWlmIChkaXItPmlfdWlkID09IGN1cnJlbnQtPmZzdWlkKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gIWNhcGFibGUoQ0FQX0ZPV05FUik7Cit9CisKKy8qCisgKglDaGVjayB3aGV0aGVyIHdlIGNhbiByZW1vdmUgYSBsaW5rIHZpY3RpbSBmcm9tIGRpcmVjdG9yeSBkaXIsIGNoZWNrCisgKiAgd2hldGhlciB0aGUgdHlwZSBvZiB2aWN0aW0gaXMgcmlnaHQuCisgKiAgMS4gV2UgY2FuJ3QgZG8gaXQgaWYgZGlyIGlzIHJlYWQtb25seSAoZG9uZSBpbiBwZXJtaXNzaW9uKCkpCisgKiAgMi4gV2Ugc2hvdWxkIGhhdmUgd3JpdGUgYW5kIGV4ZWMgcGVybWlzc2lvbnMgb24gZGlyCisgKiAgMy4gV2UgY2FuJ3QgcmVtb3ZlIGFueXRoaW5nIGZyb20gYXBwZW5kLW9ubHkgZGlyCisgKiAgNC4gV2UgY2FuJ3QgZG8gYW55dGhpbmcgd2l0aCBpbW11dGFibGUgZGlyIChkb25lIGluIHBlcm1pc3Npb24oKSkKKyAqICA1LiBJZiB0aGUgc3RpY2t5IGJpdCBvbiBkaXIgaXMgc2V0IHdlIHNob3VsZCBlaXRoZXIKKyAqCWEuIGJlIG93bmVyIG9mIGRpciwgb3IKKyAqCWIuIGJlIG93bmVyIG9mIHZpY3RpbSwgb3IKKyAqCWMuIGhhdmUgQ0FQX0ZPV05FUiBjYXBhYmlsaXR5CisgKiAgNi4gSWYgdGhlIHZpY3RpbSBpcyBhcHBlbmQtb25seSBvciBpbW11dGFibGUgd2UgY2FuJ3QgZG8gYW50eWhpbmcgd2l0aAorICogICAgIGxpbmtzIHBvaW50aW5nIHRvIGl0LgorICogIDcuIElmIHdlIHdlcmUgYXNrZWQgdG8gcmVtb3ZlIGEgZGlyZWN0b3J5IGFuZCB2aWN0aW0gaXNuJ3Qgb25lIC0gRU5PVERJUi4KKyAqICA4LiBJZiB3ZSB3ZXJlIGFza2VkIHRvIHJlbW92ZSBhIG5vbi1kaXJlY3RvcnkgYW5kIHZpY3RpbSBpc24ndCBvbmUgLSBFSVNESVIuCisgKiAgOS4gV2UgY2FuJ3QgcmVtb3ZlIGEgcm9vdCBvciBtb3VudHBvaW50LgorICogMTAuIFdlIGRvbid0IGFsbG93IHJlbW92YWwgb2YgTkZTIHNpbGx5cmVuYW1lZCBmaWxlczsgaXQncyBoYW5kbGVkIGJ5CisgKiAgICAgbmZzX2FzeW5jX3VubGluaygpLgorICovCitzdGF0aWMgaW5saW5lIGludCBtYXlfZGVsZXRlKHN0cnVjdCBpbm9kZSAqZGlyLHN0cnVjdCBkZW50cnkgKnZpY3RpbSxpbnQgaXNkaXIpCit7CisJaW50IGVycm9yOworCisJaWYgKCF2aWN0aW0tPmRfaW5vZGUpCisJCXJldHVybiAtRU5PRU5UOworCisJQlVHX09OKHZpY3RpbS0+ZF9wYXJlbnQtPmRfaW5vZGUgIT0gZGlyKTsKKworCWVycm9yID0gcGVybWlzc2lvbihkaXIsTUFZX1dSSVRFIHwgTUFZX0VYRUMsIE5VTEwpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWlmIChJU19BUFBFTkQoZGlyKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoY2hlY2tfc3RpY2t5KGRpciwgdmljdGltLT5kX2lub2RlKXx8SVNfQVBQRU5EKHZpY3RpbS0+ZF9pbm9kZSl8fAorCSAgICBJU19JTU1VVEFCTEUodmljdGltLT5kX2lub2RlKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoaXNkaXIpIHsKKwkJaWYgKCFTX0lTRElSKHZpY3RpbS0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJCXJldHVybiAtRU5PVERJUjsKKwkJaWYgKElTX1JPT1QodmljdGltKSkKKwkJCXJldHVybiAtRUJVU1k7CisJfSBlbHNlIGlmIChTX0lTRElSKHZpY3RpbS0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FSVNESVI7CisJaWYgKElTX0RFQURESVIoZGlyKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKHZpY3RpbS0+ZF9mbGFncyAmIERDQUNIRV9ORlNGU19SRU5BTUVEKQorCQlyZXR1cm4gLUVCVVNZOworCXJldHVybiAwOworfQorCisvKglDaGVjayB3aGV0aGVyIHdlIGNhbiBjcmVhdGUgYW4gb2JqZWN0IHdpdGggZGVudHJ5IGNoaWxkIGluIGRpcmVjdG9yeQorICogIGRpci4KKyAqICAxLiBXZSBjYW4ndCBkbyBpdCBpZiBjaGlsZCBhbHJlYWR5IGV4aXN0cyAob3BlbiBoYXMgc3BlY2lhbCB0cmVhdG1lbnQgZm9yCisgKiAgICAgdGhpcyBjYXNlLCBidXQgc2luY2Ugd2UgYXJlIGlubGluZWQgaXQncyBPSykKKyAqICAyLiBXZSBjYW4ndCBkbyBpdCBpZiBkaXIgaXMgcmVhZC1vbmx5IChkb25lIGluIHBlcm1pc3Npb24oKSkKKyAqICAzLiBXZSBzaG91bGQgaGF2ZSB3cml0ZSBhbmQgZXhlYyBwZXJtaXNzaW9ucyBvbiBkaXIKKyAqICA0LiBXZSBjYW4ndCBkbyBpdCBpZiBkaXIgaXMgaW1tdXRhYmxlIChkb25lIGluIHBlcm1pc3Npb24oKSkKKyAqLworc3RhdGljIGlubGluZSBpbnQgbWF5X2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqY2hpbGQsCisJCQkgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWlmIChjaGlsZC0+ZF9pbm9kZSkKKwkJcmV0dXJuIC1FRVhJU1Q7CisJaWYgKElTX0RFQURESVIoZGlyKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJcmV0dXJuIHBlcm1pc3Npb24oZGlyLE1BWV9XUklURSB8IE1BWV9FWEVDLCBuZCk7Cit9CisKKy8qIAorICogU3BlY2lhbCBjYXNlOiBPX0NSRUFUfE9fRVhDTCBpbXBsaWVzIE9fTk9GT0xMT1cgZm9yIHNlY3VyaXR5CisgKiByZWFzb25zLgorICoKKyAqIE9fRElSRUNUT1JZIHRyYW5zbGF0ZXMgaW50byBmb3JjaW5nIGEgZGlyZWN0b3J5IGxvb2t1cC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbG9va3VwX2ZsYWdzKHVuc2lnbmVkIGludCBmKQoreworCXVuc2lnbmVkIGxvbmcgcmV0dmFsID0gTE9PS1VQX0ZPTExPVzsKKworCWlmIChmICYgT19OT0ZPTExPVykKKwkJcmV0dmFsICY9IH5MT09LVVBfRk9MTE9XOworCQorCWlmICgoZiAmIChPX0NSRUFUfE9fRVhDTCkpID09IChPX0NSRUFUfE9fRVhDTCkpCisJCXJldHZhbCAmPSB+TE9PS1VQX0ZPTExPVzsKKwkKKwlpZiAoZiAmIE9fRElSRUNUT1JZKQorCQlyZXR2YWwgfD0gTE9PS1VQX0RJUkVDVE9SWTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBwMSBhbmQgcDIgc2hvdWxkIGJlIGRpcmVjdG9yaWVzIG9uIHRoZSBzYW1lIGZzLgorICovCitzdHJ1Y3QgZGVudHJ5ICpsb2NrX3JlbmFtZShzdHJ1Y3QgZGVudHJ5ICpwMSwgc3RydWN0IGRlbnRyeSAqcDIpCit7CisJc3RydWN0IGRlbnRyeSAqcDsKKworCWlmIChwMSA9PSBwMikgeworCQlkb3duKCZwMS0+ZF9pbm9kZS0+aV9zZW0pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkb3duKCZwMS0+ZF9pbm9kZS0+aV9zYi0+c192ZnNfcmVuYW1lX3NlbSk7CisKKwlmb3IgKHAgPSBwMTsgcC0+ZF9wYXJlbnQgIT0gcDsgcCA9IHAtPmRfcGFyZW50KSB7CisJCWlmIChwLT5kX3BhcmVudCA9PSBwMikgeworCQkJZG93bigmcDItPmRfaW5vZGUtPmlfc2VtKTsKKwkJCWRvd24oJnAxLT5kX2lub2RlLT5pX3NlbSk7CisJCQlyZXR1cm4gcDsKKwkJfQorCX0KKworCWZvciAocCA9IHAyOyBwLT5kX3BhcmVudCAhPSBwOyBwID0gcC0+ZF9wYXJlbnQpIHsKKwkJaWYgKHAtPmRfcGFyZW50ID09IHAxKSB7CisJCQlkb3duKCZwMS0+ZF9pbm9kZS0+aV9zZW0pOworCQkJZG93bigmcDItPmRfaW5vZGUtPmlfc2VtKTsKKwkJCXJldHVybiBwOworCQl9CisJfQorCisJZG93bigmcDEtPmRfaW5vZGUtPmlfc2VtKTsKKwlkb3duKCZwMi0+ZF9pbm9kZS0+aV9zZW0pOworCXJldHVybiBOVUxMOworfQorCit2b2lkIHVubG9ja19yZW5hbWUoc3RydWN0IGRlbnRyeSAqcDEsIHN0cnVjdCBkZW50cnkgKnAyKQoreworCXVwKCZwMS0+ZF9pbm9kZS0+aV9zZW0pOworCWlmIChwMSAhPSBwMikgeworCQl1cCgmcDItPmRfaW5vZGUtPmlfc2VtKTsKKwkJdXAoJnAxLT5kX2lub2RlLT5pX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwl9Cit9CisKK2ludCB2ZnNfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlpbnQgZXJyb3IgPSBtYXlfY3JlYXRlKGRpciwgZGVudHJ5LCBuZCk7CisKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWlmICghZGlyLT5pX29wIHx8ICFkaXItPmlfb3AtPmNyZWF0ZSkKKwkJcmV0dXJuIC1FQUNDRVM7CS8qIHNob3VsZG4ndCBpdCBiZSBFTk9TWVM/ICovCisJbW9kZSAmPSBTX0lBTExVR087CisJbW9kZSB8PSBTX0lGUkVHOworCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfY3JlYXRlKGRpciwgZGVudHJ5LCBtb2RlKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlEUVVPVF9JTklUKGRpcik7CisJZXJyb3IgPSBkaXItPmlfb3AtPmNyZWF0ZShkaXIsIGRlbnRyeSwgbW9kZSwgbmQpOworCWlmICghZXJyb3IpIHsKKwkJaW5vZGVfZGlyX25vdGlmeShkaXIsIEROX0NSRUFURSk7CisJCXNlY3VyaXR5X2lub2RlX3Bvc3RfY3JlYXRlKGRpciwgZGVudHJ5LCBtb2RlKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgbWF5X29wZW4oc3RydWN0IG5hbWVpZGF0YSAqbmQsIGludCBhY2NfbW9kZSwgaW50IGZsYWcpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gbmQtPmRlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvcjsKKworCWlmICghaW5vZGUpCisJCXJldHVybiAtRU5PRU5UOworCisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRUxPT1A7CisJCisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgKGZsYWcgJiBGTU9ERV9XUklURSkpCisJCXJldHVybiAtRUlTRElSOworCisJZXJyb3IgPSBwZXJtaXNzaW9uKGlub2RlLCBhY2NfbW9kZSwgbmQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJLyoKKwkgKiBGSUZPJ3MsIHNvY2tldHMgYW5kIGRldmljZSBmaWxlcyBhcmUgc3BlY2lhbDogdGhleSBkb24ndAorCSAqIGFjdHVhbGx5IGxpdmUgb24gdGhlIGZpbGVzeXN0ZW0gaXRzZWxmLCBhbmQgYXMgc3VjaCB5b3UKKwkgKiBjYW4gd3JpdGUgdG8gdGhlbSBldmVuIGlmIHRoZSBmaWxlc3lzdGVtIGlzIHJlYWQtb25seS4KKwkgKi8KKwlpZiAoU19JU0ZJRk8oaW5vZGUtPmlfbW9kZSkgfHwgU19JU1NPQ0soaW5vZGUtPmlfbW9kZSkpIHsKKwkgICAgCWZsYWcgJj0gfk9fVFJVTkM7CisJfSBlbHNlIGlmIChTX0lTQkxLKGlub2RlLT5pX21vZGUpIHx8IFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKG5kLT5tbnQtPm1udF9mbGFncyAmIE1OVF9OT0RFVikKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWZsYWcgJj0gfk9fVFJVTkM7CisJfSBlbHNlIGlmIChJU19SRE9OTFkoaW5vZGUpICYmIChmbGFnICYgRk1PREVfV1JJVEUpKQorCQlyZXR1cm4gLUVST0ZTOworCS8qCisJICogQW4gYXBwZW5kLW9ubHkgZmlsZSBtdXN0IGJlIG9wZW5lZCBpbiBhcHBlbmQgbW9kZSBmb3Igd3JpdGluZy4KKwkgKi8KKwlpZiAoSVNfQVBQRU5EKGlub2RlKSkgeworCQlpZiAgKChmbGFnICYgRk1PREVfV1JJVEUpICYmICEoZmxhZyAmIE9fQVBQRU5EKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChmbGFnICYgT19UUlVOQykKKwkJCXJldHVybiAtRVBFUk07CisJfQorCisJLyogT19OT0FUSU1FIGNhbiBvbmx5IGJlIHNldCBieSB0aGUgb3duZXIgb3Igc3VwZXJ1c2VyICovCisJaWYgKGZsYWcgJiBPX05PQVRJTUUpCisJCWlmIChjdXJyZW50LT5mc3VpZCAhPSBpbm9kZS0+aV91aWQgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJLyoKKwkgKiBFbnN1cmUgdGhlcmUgYXJlIG5vIG91dHN0YW5kaW5nIGxlYXNlcyBvbiB0aGUgZmlsZS4KKwkgKi8KKwllcnJvciA9IGJyZWFrX2xlYXNlKGlub2RlLCBmbGFnKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWlmIChmbGFnICYgT19UUlVOQykgeworCQllcnJvciA9IGdldF93cml0ZV9hY2Nlc3MoaW5vZGUpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisKKwkJLyoKKwkJICogUmVmdXNlIHRvIHRydW5jYXRlIGZpbGVzIHdpdGggbWFuZGF0b3J5IGxvY2tzIGhlbGQgb24gdGhlbS4KKwkJICovCisJCWVycm9yID0gbG9ja3NfdmVyaWZ5X2xvY2tlZChpbm9kZSk7CisJCWlmICghZXJyb3IpIHsKKwkJCURRVU9UX0lOSVQoaW5vZGUpOworCQkJCisJCQllcnJvciA9IGRvX3RydW5jYXRlKGRlbnRyeSwgMCk7CisJCX0KKwkJcHV0X3dyaXRlX2FjY2Vzcyhpbm9kZSk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9IGVsc2UKKwkJaWYgKGZsYWcgJiBGTU9ERV9XUklURSkKKwkJCURRVU9UX0lOSVQoaW5vZGUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglvcGVuX25hbWVpKCkKKyAqCisgKiBuYW1laSBmb3Igb3BlbiAtIHRoaXMgaXMgaW4gZmFjdCBhbG1vc3QgdGhlIHdob2xlIG9wZW4tcm91dGluZS4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGxvdyBiaXRzIG9mICJmbGFnIiBhcmVuJ3QgdGhlIHNhbWUgYXMgaW4gdGhlIG9wZW4KKyAqIHN5c3RlbSBjYWxsIC0gdGhleSBhcmUgMDAgLSBubyBwZXJtaXNzaW9ucyBuZWVkZWQKKyAqCQkJICAwMSAtIHJlYWQgcGVybWlzc2lvbiBuZWVkZWQKKyAqCQkJICAxMCAtIHdyaXRlIHBlcm1pc3Npb24gbmVlZGVkCisgKgkJCSAgMTEgLSByZWFkL3dyaXRlIHBlcm1pc3Npb25zIG5lZWRlZAorICogd2hpY2ggaXMgYSBsb3QgbW9yZSBsb2dpY2FsLCBhbmQgYWxzbyBhbGxvd3MgdGhlICJubyBwZXJtIiBuZWVkZWQKKyAqIGZvciBzeW1saW5rcyAod2hlcmUgdGhlIHBlcm1pc3Npb25zIGFyZSBjaGVja2VkIGxhdGVyKS4KKyAqIFNNUC1zYWZlCisgKi8KK2ludCBvcGVuX25hbWVpKGNvbnN0IGNoYXIgKiBwYXRobmFtZSwgaW50IGZsYWcsIGludCBtb2RlLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlpbnQgYWNjX21vZGUsIGVycm9yID0gMDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IGRlbnRyeSAqZGlyOworCWludCBjb3VudCA9IDA7CisKKwlhY2NfbW9kZSA9IEFDQ19NT0RFKGZsYWcpOworCisJLyogQWxsb3cgdGhlIExTTSBwZXJtaXNzaW9uIGhvb2sgdG8gZGlzdGluZ3Vpc2ggYXBwZW5kIAorCSAgIGFjY2VzcyBmcm9tIGdlbmVyYWwgd3JpdGUgYWNjZXNzLiAqLworCWlmIChmbGFnICYgT19BUFBFTkQpCisJCWFjY19tb2RlIHw9IE1BWV9BUFBFTkQ7CisKKwkvKiBGaWxsIGluIHRoZSBvcGVuKCkgaW50ZW50IGRhdGEgKi8KKwluZC0+aW50ZW50Lm9wZW4uZmxhZ3MgPSBmbGFnOworCW5kLT5pbnRlbnQub3Blbi5jcmVhdGVfbW9kZSA9IG1vZGU7CisKKwkvKgorCSAqIFRoZSBzaW1wbGVzdCBjYXNlIC0ganVzdCBhIHBsYWluIGxvb2t1cC4KKwkgKi8KKwlpZiAoIShmbGFnICYgT19DUkVBVCkpIHsKKwkJZXJyb3IgPSBwYXRoX2xvb2t1cChwYXRobmFtZSwgbG9va3VwX2ZsYWdzKGZsYWcpfExPT0tVUF9PUEVOLCBuZCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwkJZ290byBvazsKKwl9CisKKwkvKgorCSAqIENyZWF0ZSAtIHdlIG5lZWQgdG8ga25vdyB0aGUgcGFyZW50LgorCSAqLworCWVycm9yID0gcGF0aF9sb29rdXAocGF0aG5hbWUsIExPT0tVUF9QQVJFTlR8TE9PS1VQX09QRU58TE9PS1VQX0NSRUFURSwgbmQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJLyoKKwkgKiBXZSBoYXZlIHRoZSBwYXJlbnQgYW5kIGxhc3QgY29tcG9uZW50LiBGaXJzdCBvZiBhbGwsIGNoZWNrCisJICogdGhhdCB3ZSBhcmUgbm90IGFza2VkIHRvIGNyZWF0KDIpIGFuIG9idmlvdXMgZGlyZWN0b3J5IC0gdGhhdAorCSAqIHdpbGwgbm90IGRvLgorCSAqLworCWVycm9yID0gLUVJU0RJUjsKKwlpZiAobmQtPmxhc3RfdHlwZSAhPSBMQVNUX05PUk0gfHwgbmQtPmxhc3QubmFtZVtuZC0+bGFzdC5sZW5dKQorCQlnb3RvIGV4aXQ7CisKKwlkaXIgPSBuZC0+ZGVudHJ5OworCW5kLT5mbGFncyAmPSB+TE9PS1VQX1BBUkVOVDsKKwlkb3duKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKwlkZW50cnkgPSBfX2xvb2t1cF9oYXNoKCZuZC0+bGFzdCwgbmQtPmRlbnRyeSwgbmQpOworCitkb19sYXN0OgorCWVycm9yID0gUFRSX0VSUihkZW50cnkpOworCWlmIChJU19FUlIoZGVudHJ5KSkgeworCQl1cCgmZGlyLT5kX2lub2RlLT5pX3NlbSk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBOZWdhdGl2ZSBkZW50cnksIGp1c3QgY3JlYXRlIHRoZSBmaWxlICovCisJaWYgKCFkZW50cnktPmRfaW5vZGUpIHsKKwkJaWYgKCFJU19QT1NJWEFDTChkaXItPmRfaW5vZGUpKQorCQkJbW9kZSAmPSB+Y3VycmVudC0+ZnMtPnVtYXNrOworCQllcnJvciA9IHZmc19jcmVhdGUoZGlyLT5kX2lub2RlLCBkZW50cnksIG1vZGUsIG5kKTsKKwkJdXAoJmRpci0+ZF9pbm9kZS0+aV9zZW0pOworCQlkcHV0KG5kLT5kZW50cnkpOworCQluZC0+ZGVudHJ5ID0gZGVudHJ5OworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGV4aXQ7CisJCS8qIERvbid0IGNoZWNrIGZvciB3cml0ZSBwZXJtaXNzaW9uLCBkb24ndCB0cnVuY2F0ZSAqLworCQlhY2NfbW9kZSA9IDA7CisJCWZsYWcgJj0gfk9fVFJVTkM7CisJCWdvdG8gb2s7CisJfQorCisJLyoKKwkgKiBJdCBhbHJlYWR5IGV4aXN0cy4KKwkgKi8KKwl1cCgmZGlyLT5kX2lub2RlLT5pX3NlbSk7CisKKwllcnJvciA9IC1FRVhJU1Q7CisJaWYgKGZsYWcgJiBPX0VYQ0wpCisJCWdvdG8gZXhpdF9kcHV0OworCisJaWYgKGRfbW91bnRwb2ludChkZW50cnkpKSB7CisJCWVycm9yID0gLUVMT09QOworCQlpZiAoZmxhZyAmIE9fTk9GT0xMT1cpCisJCQlnb3RvIGV4aXRfZHB1dDsKKwkJd2hpbGUgKF9fZm9sbG93X2Rvd24oJm5kLT5tbnQsJmRlbnRyeSkgJiYgZF9tb3VudHBvaW50KGRlbnRyeSkpOworCX0KKwllcnJvciA9IC1FTk9FTlQ7CisJaWYgKCFkZW50cnktPmRfaW5vZGUpCisJCWdvdG8gZXhpdF9kcHV0OworCWlmIChkZW50cnktPmRfaW5vZGUtPmlfb3AgJiYgZGVudHJ5LT5kX2lub2RlLT5pX29wLT5mb2xsb3dfbGluaykKKwkJZ290byBkb19saW5rOworCisJZHB1dChuZC0+ZGVudHJ5KTsKKwluZC0+ZGVudHJ5ID0gZGVudHJ5OworCWVycm9yID0gLUVJU0RJUjsKKwlpZiAoZGVudHJ5LT5kX2lub2RlICYmIFNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQorCQlnb3RvIGV4aXQ7CitvazoKKwllcnJvciA9IG1heV9vcGVuKG5kLCBhY2NfbW9kZSwgZmxhZyk7CisJaWYgKGVycm9yKQorCQlnb3RvIGV4aXQ7CisJcmV0dXJuIDA7CisKK2V4aXRfZHB1dDoKKwlkcHV0KGRlbnRyeSk7CitleGl0OgorCXBhdGhfcmVsZWFzZShuZCk7CisJcmV0dXJuIGVycm9yOworCitkb19saW5rOgorCWVycm9yID0gLUVMT09QOworCWlmIChmbGFnICYgT19OT0ZPTExPVykKKwkJZ290byBleGl0X2RwdXQ7CisJLyoKKwkgKiBUaGlzIGlzIHN1YnRsZS4gSW5zdGVhZCBvZiBjYWxsaW5nIGRvX2ZvbGxvd19saW5rKCkgd2UgZG8gdGhlCisJICogdGhpbmcgYnkgaGFuZHMuIFRoZSByZWFzb24gaXMgdGhhdCB0aGlzIHdheSB3ZSBoYXZlIHplcm8gbGlua19jb3VudAorCSAqIGFuZCBwYXRoX3dhbGsoKSAoY2FsbGVkIGZyb20gLT5mb2xsb3dfbGluaykgaG9ub3JpbmcgTE9PS1VQX1BBUkVOVC4KKwkgKiBBZnRlciB0aGF0IHdlIGhhdmUgdGhlIHBhcmVudCBhbmQgbGFzdCBjb21wb25lbnQsIGkuZS4KKwkgKiB3ZSBhcmUgaW4gdGhlIHNhbWUgc2l0dWF0aW9uIGFzIGFmdGVyIHRoZSBmaXJzdCBwYXRoX3dhbGsoKS4KKwkgKiBXZWxsLCBhbG1vc3QgLSBpZiB0aGUgbGFzdCBjb21wb25lbnQgaXMgbm9ybWFsIHdlIGdldCBpdHMgY29weQorCSAqIHN0b3JlZCBpbiBuZC0+bGFzdC5uYW1lIGFuZCB3ZSB3aWxsIGhhdmUgdG8gcHV0bmFtZSgpIGl0IHdoZW4gd2UKKwkgKiBhcmUgZG9uZS4gUHJvY2ZzLWxpa2Ugc3ltbGlua3MganVzdCBzZXQgTEFTVF9CSU5ELgorCSAqLworCW5kLT5mbGFncyB8PSBMT09LVVBfUEFSRU5UOworCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfZm9sbG93X2xpbmsoZGVudHJ5LCBuZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGV4aXRfZHB1dDsKKwllcnJvciA9IF9fZG9fZm9sbG93X2xpbmsoZGVudHJ5LCBuZCk7CisJZHB1dChkZW50cnkpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCW5kLT5mbGFncyAmPSB+TE9PS1VQX1BBUkVOVDsKKwlpZiAobmQtPmxhc3RfdHlwZSA9PSBMQVNUX0JJTkQpIHsKKwkJZGVudHJ5ID0gbmQtPmRlbnRyeTsKKwkJZ290byBvazsKKwl9CisJZXJyb3IgPSAtRUlTRElSOworCWlmIChuZC0+bGFzdF90eXBlICE9IExBU1RfTk9STSkKKwkJZ290byBleGl0OworCWlmIChuZC0+bGFzdC5uYW1lW25kLT5sYXN0Lmxlbl0pIHsKKwkJcHV0bmFtZShuZC0+bGFzdC5uYW1lKTsKKwkJZ290byBleGl0OworCX0KKwllcnJvciA9IC1FTE9PUDsKKwlpZiAoY291bnQrKz09MzIpIHsKKwkJcHV0bmFtZShuZC0+bGFzdC5uYW1lKTsKKwkJZ290byBleGl0OworCX0KKwlkaXIgPSBuZC0+ZGVudHJ5OworCWRvd24oJmRpci0+ZF9pbm9kZS0+aV9zZW0pOworCWRlbnRyeSA9IF9fbG9va3VwX2hhc2goJm5kLT5sYXN0LCBuZC0+ZGVudHJ5LCBuZCk7CisJcHV0bmFtZShuZC0+bGFzdC5uYW1lKTsKKwlnb3RvIGRvX2xhc3Q7Cit9CisKKy8qKgorICogbG9va3VwX2NyZWF0ZSAtIGxvb2t1cCBhIGRlbnRyeSwgY3JlYXRpbmcgaXQgaWYgaXQgZG9lc24ndCBleGlzdAorICogQG5kOiBuYW1laWRhdGEgaW5mbworICogQGlzX2RpcjogZGlyZWN0b3J5IGZsYWcKKyAqCisgKiBTaW1wbGUgZnVuY3Rpb24gdG8gbG9va3VwIGFuZCByZXR1cm4gYSBkZW50cnkgYW5kIGNyZWF0ZSBpdAorICogaWYgaXQgZG9lc24ndCBleGlzdC4gIElzIFNNUC1zYWZlLgorICovCitzdHJ1Y3QgZGVudHJ5ICpsb29rdXBfY3JlYXRlKHN0cnVjdCBuYW1laWRhdGEgKm5kLCBpbnQgaXNfZGlyKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKworCWRvd24oJm5kLT5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwlkZW50cnkgPSBFUlJfUFRSKC1FRVhJU1QpOworCWlmIChuZC0+bGFzdF90eXBlICE9IExBU1RfTk9STSkKKwkJZ290byBmYWlsOworCW5kLT5mbGFncyAmPSB+TE9PS1VQX1BBUkVOVDsKKwlkZW50cnkgPSBsb29rdXBfaGFzaCgmbmQtPmxhc3QsIG5kLT5kZW50cnkpOworCWlmIChJU19FUlIoZGVudHJ5KSkKKwkJZ290byBmYWlsOworCWlmICghaXNfZGlyICYmIG5kLT5sYXN0Lm5hbWVbbmQtPmxhc3QubGVuXSAmJiAhZGVudHJ5LT5kX2lub2RlKQorCQlnb3RvIGVub2VudDsKKwlyZXR1cm4gZGVudHJ5OworZW5vZW50OgorCWRwdXQoZGVudHJ5KTsKKwlkZW50cnkgPSBFUlJfUFRSKC1FTk9FTlQpOworZmFpbDoKKwlyZXR1cm4gZGVudHJ5OworfQorCitpbnQgdmZzX21rbm9kKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLCBkZXZfdCBkZXYpCit7CisJaW50IGVycm9yID0gbWF5X2NyZWF0ZShkaXIsIGRlbnRyeSwgTlVMTCk7CisKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWlmICgoU19JU0NIUihtb2RlKSB8fCBTX0lTQkxLKG1vZGUpKSAmJiAhY2FwYWJsZShDQVBfTUtOT0QpKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKCFkaXItPmlfb3AgfHwgIWRpci0+aV9vcC0+bWtub2QpCisJCXJldHVybiAtRVBFUk07CisKKwllcnJvciA9IHNlY3VyaXR5X2lub2RlX21rbm9kKGRpciwgZGVudHJ5LCBtb2RlLCBkZXYpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJRFFVT1RfSU5JVChkaXIpOworCWVycm9yID0gZGlyLT5pX29wLT5ta25vZChkaXIsIGRlbnRyeSwgbW9kZSwgZGV2KTsKKwlpZiAoIWVycm9yKSB7CisJCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9DUkVBVEUpOworCQlzZWN1cml0eV9pbm9kZV9wb3N0X21rbm9kKGRpciwgZGVudHJ5LCBtb2RlLCBkZXYpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfbWtub2QoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgaW50IG1vZGUsIHVuc2lnbmVkIGRldikKK3sKKwlpbnQgZXJyb3IgPSAwOworCWNoYXIgKiB0bXA7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeTsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCisJaWYgKFNfSVNESVIobW9kZSkpCisJCXJldHVybiAtRVBFUk07CisJdG1wID0gZ2V0bmFtZShmaWxlbmFtZSk7CisJaWYgKElTX0VSUih0bXApKQorCQlyZXR1cm4gUFRSX0VSUih0bXApOworCisJZXJyb3IgPSBwYXRoX2xvb2t1cCh0bXAsIExPT0tVUF9QQVJFTlQsICZuZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKwlkZW50cnkgPSBsb29rdXBfY3JlYXRlKCZuZCwgMCk7CisJZXJyb3IgPSBQVFJfRVJSKGRlbnRyeSk7CisKKwlpZiAoIUlTX1BPU0lYQUNMKG5kLmRlbnRyeS0+ZF9pbm9kZSkpCisJCW1vZGUgJj0gfmN1cnJlbnQtPmZzLT51bWFzazsKKwlpZiAoIUlTX0VSUihkZW50cnkpKSB7CisJCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgeworCQljYXNlIDA6IGNhc2UgU19JRlJFRzoKKwkJCWVycm9yID0gdmZzX2NyZWF0ZShuZC5kZW50cnktPmRfaW5vZGUsZGVudHJ5LG1vZGUsJm5kKTsKKwkJCWJyZWFrOworCQljYXNlIFNfSUZDSFI6IGNhc2UgU19JRkJMSzoKKwkJCWVycm9yID0gdmZzX21rbm9kKG5kLmRlbnRyeS0+ZF9pbm9kZSxkZW50cnksbW9kZSwKKwkJCQkJbmV3X2RlY29kZV9kZXYoZGV2KSk7CisJCQlicmVhazsKKwkJY2FzZSBTX0lGSUZPOiBjYXNlIFNfSUZTT0NLOgorCQkJZXJyb3IgPSB2ZnNfbWtub2QobmQuZGVudHJ5LT5kX2lub2RlLGRlbnRyeSxtb2RlLDApOworCQkJYnJlYWs7CisJCWNhc2UgU19JRkRJUjoKKwkJCWVycm9yID0gLUVQRVJNOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnJvciA9IC1FSU5WQUw7CisJCX0KKwkJZHB1dChkZW50cnkpOworCX0KKwl1cCgmbmQuZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJcGF0aF9yZWxlYXNlKCZuZCk7CitvdXQ6CisJcHV0bmFtZSh0bXApOworCisJcmV0dXJuIGVycm9yOworfQorCitpbnQgdmZzX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQoreworCWludCBlcnJvciA9IG1heV9jcmVhdGUoZGlyLCBkZW50cnksIE5VTEwpOworCisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAoIWRpci0+aV9vcCB8fCAhZGlyLT5pX29wLT5ta2RpcikKKwkJcmV0dXJuIC1FUEVSTTsKKworCW1vZGUgJj0gKFNfSVJXWFVHT3xTX0lTVlRYKTsKKwllcnJvciA9IHNlY3VyaXR5X2lub2RlX21rZGlyKGRpciwgZGVudHJ5LCBtb2RlKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCURRVU9UX0lOSVQoZGlyKTsKKwllcnJvciA9IGRpci0+aV9vcC0+bWtkaXIoZGlyLCBkZW50cnksIG1vZGUpOworCWlmICghZXJyb3IpIHsKKwkJaW5vZGVfZGlyX25vdGlmeShkaXIsIEROX0NSRUFURSk7CisJCXNlY3VyaXR5X2lub2RlX3Bvc3RfbWtkaXIoZGlyLGRlbnRyeSwgbW9kZSk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19ta2Rpcihjb25zdCBjaGFyIF9fdXNlciAqIHBhdGhuYW1lLCBpbnQgbW9kZSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCWNoYXIgKiB0bXA7CisKKwl0bXAgPSBnZXRuYW1lKHBhdGhuYW1lKTsKKwllcnJvciA9IFBUUl9FUlIodG1wKTsKKwlpZiAoIUlTX0VSUih0bXApKSB7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwkJc3RydWN0IG5hbWVpZGF0YSBuZDsKKworCQllcnJvciA9IHBhdGhfbG9va3VwKHRtcCwgTE9PS1VQX1BBUkVOVCwgJm5kKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJCWRlbnRyeSA9IGxvb2t1cF9jcmVhdGUoJm5kLCAxKTsKKwkJZXJyb3IgPSBQVFJfRVJSKGRlbnRyeSk7CisJCWlmICghSVNfRVJSKGRlbnRyeSkpIHsKKwkJCWlmICghSVNfUE9TSVhBQ0wobmQuZGVudHJ5LT5kX2lub2RlKSkKKwkJCQltb2RlICY9IH5jdXJyZW50LT5mcy0+dW1hc2s7CisJCQllcnJvciA9IHZmc19ta2RpcihuZC5kZW50cnktPmRfaW5vZGUsIGRlbnRyeSwgbW9kZSk7CisJCQlkcHV0KGRlbnRyeSk7CisJCX0KKwkJdXAoJm5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCQlwYXRoX3JlbGVhc2UoJm5kKTsKK291dDoKKwkJcHV0bmFtZSh0bXApOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFdlIHRyeSB0byBkcm9wIHRoZSBkZW50cnkgZWFybHk6IHdlIHNob3VsZCBoYXZlCisgKiBhIHVzYWdlIGNvdW50IG9mIDIgaWYgd2UncmUgdGhlIG9ubHkgdXNlciBvZiB0aGlzCisgKiBkZW50cnksIGFuZCBpZiB0aGF0IGlzIHRydWUgKHBvc3NpYmx5IGFmdGVyIHBydW5pbmcKKyAqIHRoZSBkY2FjaGUpLCB0aGVuIHdlIGRyb3AgdGhlIGRlbnRyeSBub3cuCisgKgorICogQSBsb3ctbGV2ZWwgZmlsZXN5c3RlbSBjYW4sIGlmIGl0IGNob3NlcywgbGVnYWxseQorICogZG8gYQorICoKKyAqCWlmICghZF91bmhhc2hlZChkZW50cnkpKQorICoJCXJldHVybiAtRUJVU1k7CisgKgorICogaWYgaXQgY2Fubm90IGhhbmRsZSB0aGUgY2FzZSBvZiByZW1vdmluZyBhIGRpcmVjdG9yeQorICogdGhhdCBpcyBzdGlsbCBpbiB1c2UgYnkgc29tZXRoaW5nIGVsc2UuLgorICovCit2b2lkIGRlbnRyeV91bmhhc2goc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWRnZXQoZGVudHJ5KTsKKwlpZiAoYXRvbWljX3JlYWQoJmRlbnRyeS0+ZF9jb3VudCkpCisJCXNocmlua19kY2FjaGVfcGFyZW50KGRlbnRyeSk7CisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJaWYgKGF0b21pY19yZWFkKCZkZW50cnktPmRfY291bnQpID09IDIpCisJCV9fZF9kcm9wKGRlbnRyeSk7CisJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworfQorCitpbnQgdmZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IGVycm9yID0gbWF5X2RlbGV0ZShkaXIsIGRlbnRyeSwgMSk7CisKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWlmICghZGlyLT5pX29wIHx8ICFkaXItPmlfb3AtPnJtZGlyKQorCQlyZXR1cm4gLUVQRVJNOworCisJRFFVT1RfSU5JVChkaXIpOworCisJZG93bigmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJZGVudHJ5X3VuaGFzaChkZW50cnkpOworCWlmIChkX21vdW50cG9pbnQoZGVudHJ5KSkKKwkJZXJyb3IgPSAtRUJVU1k7CisJZWxzZSB7CisJCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfcm1kaXIoZGlyLCBkZW50cnkpOworCQlpZiAoIWVycm9yKSB7CisJCQllcnJvciA9IGRpci0+aV9vcC0+cm1kaXIoZGlyLCBkZW50cnkpOworCQkJaWYgKCFlcnJvcikKKwkJCQlkZW50cnktPmRfaW5vZGUtPmlfZmxhZ3MgfD0gU19ERUFEOworCQl9CisJfQorCXVwKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwlpZiAoIWVycm9yKSB7CisJCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9ERUxFVEUpOworCQlkX2RlbGV0ZShkZW50cnkpOworCX0KKwlkcHV0KGRlbnRyeSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfcm1kaXIoY29uc3QgY2hhciBfX3VzZXIgKiBwYXRobmFtZSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCWNoYXIgKiBuYW1lOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCisJbmFtZSA9IGdldG5hbWUocGF0aG5hbWUpOworCWlmKElTX0VSUihuYW1lKSkKKwkJcmV0dXJuIFBUUl9FUlIobmFtZSk7CisKKwllcnJvciA9IHBhdGhfbG9va3VwKG5hbWUsIExPT0tVUF9QQVJFTlQsICZuZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGV4aXQ7CisKKwlzd2l0Y2gobmQubGFzdF90eXBlKSB7CisJCWNhc2UgTEFTVF9ET1RET1Q6CisJCQllcnJvciA9IC1FTk9URU1QVFk7CisJCQlnb3RvIGV4aXQxOworCQljYXNlIExBU1RfRE9UOgorCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJZ290byBleGl0MTsKKwkJY2FzZSBMQVNUX1JPT1Q6CisJCQllcnJvciA9IC1FQlVTWTsKKwkJCWdvdG8gZXhpdDE7CisJfQorCWRvd24oJm5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCWRlbnRyeSA9IGxvb2t1cF9oYXNoKCZuZC5sYXN0LCBuZC5kZW50cnkpOworCWVycm9yID0gUFRSX0VSUihkZW50cnkpOworCWlmICghSVNfRVJSKGRlbnRyeSkpIHsKKwkJZXJyb3IgPSB2ZnNfcm1kaXIobmQuZGVudHJ5LT5kX2lub2RlLCBkZW50cnkpOworCQlkcHV0KGRlbnRyeSk7CisJfQorCXVwKCZuZC5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKK2V4aXQxOgorCXBhdGhfcmVsZWFzZSgmbmQpOworZXhpdDoKKwlwdXRuYW1lKG5hbWUpOworCXJldHVybiBlcnJvcjsKK30KKworaW50IHZmc191bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgZXJyb3IgPSBtYXlfZGVsZXRlKGRpciwgZGVudHJ5LCAwKTsKKworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKCFkaXItPmlfb3AgfHwgIWRpci0+aV9vcC0+dW5saW5rKQorCQlyZXR1cm4gLUVQRVJNOworCisJRFFVT1RfSU5JVChkaXIpOworCisJZG93bigmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJaWYgKGRfbW91bnRwb2ludChkZW50cnkpKQorCQllcnJvciA9IC1FQlVTWTsKKwllbHNlIHsKKwkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV91bmxpbmsoZGlyLCBkZW50cnkpOworCQlpZiAoIWVycm9yKQorCQkJZXJyb3IgPSBkaXItPmlfb3AtPnVubGluayhkaXIsIGRlbnRyeSk7CisJfQorCXVwKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKworCS8qIFdlIGRvbid0IGRfZGVsZXRlKCkgTkZTIHNpbGx5cmVuYW1lZCBmaWxlcy0tdGhleSBzdGlsbCBleGlzdC4gKi8KKwlpZiAoIWVycm9yICYmICEoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX05GU0ZTX1JFTkFNRUQpKSB7CisJCWRfZGVsZXRlKGRlbnRyeSk7CisJCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9ERUxFVEUpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBNYWtlIHN1cmUgdGhhdCB0aGUgYWN0dWFsIHRydW5jYXRpb24gb2YgdGhlIGZpbGUgd2lsbCBvY2N1ciBvdXRzaWRlIGl0cworICogZGlyZWN0b3J5J3MgaV9zZW0uICBUcnVuY2F0ZSBjYW4gdGFrZSBhIGxvbmcgdGltZSBpZiB0aGVyZSBpcyBhIGxvdCBvZgorICogd3JpdGVvdXQgaGFwcGVuaW5nLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBwcmV2ZW50IGFjY2VzcyB0byB0aGUgZGlyZWN0b3J5CisgKiB3aGlsZSB3YWl0aW5nIG9uIHRoZSBJL08uCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfdW5saW5rKGNvbnN0IGNoYXIgX191c2VyICogcGF0aG5hbWUpCit7CisJaW50IGVycm9yID0gMDsKKwljaGFyICogbmFtZTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKworCW5hbWUgPSBnZXRuYW1lKHBhdGhuYW1lKTsKKwlpZihJU19FUlIobmFtZSkpCisJCXJldHVybiBQVFJfRVJSKG5hbWUpOworCisJZXJyb3IgPSBwYXRoX2xvb2t1cChuYW1lLCBMT09LVVBfUEFSRU5ULCAmbmQpOworCWlmIChlcnJvcikKKwkJZ290byBleGl0OworCWVycm9yID0gLUVJU0RJUjsKKwlpZiAobmQubGFzdF90eXBlICE9IExBU1RfTk9STSkKKwkJZ290byBleGl0MTsKKwlkb3duKCZuZC5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwlkZW50cnkgPSBsb29rdXBfaGFzaCgmbmQubGFzdCwgbmQuZGVudHJ5KTsKKwllcnJvciA9IFBUUl9FUlIoZGVudHJ5KTsKKwlpZiAoIUlTX0VSUihkZW50cnkpKSB7CisJCS8qIFdoeSBub3QgYmVmb3JlPyBCZWNhdXNlIHdlIHdhbnQgY29ycmVjdCBlcnJvciB2YWx1ZSAqLworCQlpZiAobmQubGFzdC5uYW1lW25kLmxhc3QubGVuXSkKKwkJCWdvdG8gc2xhc2hlczsKKwkJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJCWlmIChpbm9kZSkKKwkJCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKKwkJZXJyb3IgPSB2ZnNfdW5saW5rKG5kLmRlbnRyeS0+ZF9pbm9kZSwgZGVudHJ5KTsKKwlleGl0MjoKKwkJZHB1dChkZW50cnkpOworCX0KKwl1cCgmbmQuZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJaWYgKGlub2RlKQorCQlpcHV0KGlub2RlKTsJLyogdHJ1bmNhdGUgdGhlIGlub2RlIGhlcmUgKi8KK2V4aXQxOgorCXBhdGhfcmVsZWFzZSgmbmQpOworZXhpdDoKKwlwdXRuYW1lKG5hbWUpOworCXJldHVybiBlcnJvcjsKKworc2xhc2hlczoKKwllcnJvciA9ICFkZW50cnktPmRfaW5vZGUgPyAtRU5PRU5UIDoKKwkJU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgPyAtRUlTRElSIDogLUVOT1RESVI7CisJZ290byBleGl0MjsKK30KKworaW50IHZmc19zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm9sZG5hbWUsIGludCBtb2RlKQoreworCWludCBlcnJvciA9IG1heV9jcmVhdGUoZGlyLCBkZW50cnksIE5VTEwpOworCisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAoIWRpci0+aV9vcCB8fCAhZGlyLT5pX29wLT5zeW1saW5rKQorCQlyZXR1cm4gLUVQRVJNOworCisJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9zeW1saW5rKGRpciwgZGVudHJ5LCBvbGRuYW1lKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCURRVU9UX0lOSVQoZGlyKTsKKwllcnJvciA9IGRpci0+aV9vcC0+c3ltbGluayhkaXIsIGRlbnRyeSwgb2xkbmFtZSk7CisJaWYgKCFlcnJvcikgeworCQlpbm9kZV9kaXJfbm90aWZ5KGRpciwgRE5fQ1JFQVRFKTsKKwkJc2VjdXJpdHlfaW5vZGVfcG9zdF9zeW1saW5rKGRpciwgZGVudHJ5LCBvbGRuYW1lKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX3N5bWxpbmsoY29uc3QgY2hhciBfX3VzZXIgKiBvbGRuYW1lLCBjb25zdCBjaGFyIF9fdXNlciAqIG5ld25hbWUpCit7CisJaW50IGVycm9yID0gMDsKKwljaGFyICogZnJvbTsKKwljaGFyICogdG87CisKKwlmcm9tID0gZ2V0bmFtZShvbGRuYW1lKTsKKwlpZihJU19FUlIoZnJvbSkpCisJCXJldHVybiBQVFJfRVJSKGZyb20pOworCXRvID0gZ2V0bmFtZShuZXduYW1lKTsKKwllcnJvciA9IFBUUl9FUlIodG8pOworCWlmICghSVNfRVJSKHRvKSkgeworCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisKKwkJZXJyb3IgPSBwYXRoX2xvb2t1cCh0bywgTE9PS1VQX1BBUkVOVCwgJm5kKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJCWRlbnRyeSA9IGxvb2t1cF9jcmVhdGUoJm5kLCAwKTsKKwkJZXJyb3IgPSBQVFJfRVJSKGRlbnRyeSk7CisJCWlmICghSVNfRVJSKGRlbnRyeSkpIHsKKwkJCWVycm9yID0gdmZzX3N5bWxpbmsobmQuZGVudHJ5LT5kX2lub2RlLCBkZW50cnksIGZyb20sIFNfSUFMTFVHTyk7CisJCQlkcHV0KGRlbnRyeSk7CisJCX0KKwkJdXAoJm5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCQlwYXRoX3JlbGVhc2UoJm5kKTsKK291dDoKKwkJcHV0bmFtZSh0byk7CisJfQorCXB1dG5hbWUoZnJvbSk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgdmZzX2xpbmsoc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisJaW50IGVycm9yOworCisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwllcnJvciA9IG1heV9jcmVhdGUoZGlyLCBuZXdfZGVudHJ5LCBOVUxMKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWlmIChkaXItPmlfc2IgIT0gaW5vZGUtPmlfc2IpCisJCXJldHVybiAtRVhERVY7CisKKwkvKgorCSAqIEEgbGluayB0byBhbiBhcHBlbmQtb25seSBvciBpbW11dGFibGUgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZC4KKwkgKi8KKwlpZiAoSVNfQVBQRU5EKGlub2RlKSB8fCBJU19JTU1VVEFCTEUoaW5vZGUpKQorCQlyZXR1cm4gLUVQRVJNOworCWlmICghZGlyLT5pX29wIHx8ICFkaXItPmlfb3AtPmxpbmspCisJCXJldHVybiAtRVBFUk07CisJaWYgKFNfSVNESVIob2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfbGluayhvbGRfZGVudHJ5LCBkaXIsIG5ld19kZW50cnkpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZG93bigmb2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCURRVU9UX0lOSVQoZGlyKTsKKwllcnJvciA9IGRpci0+aV9vcC0+bGluayhvbGRfZGVudHJ5LCBkaXIsIG5ld19kZW50cnkpOworCXVwKCZvbGRfZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJaWYgKCFlcnJvcikgeworCQlpbm9kZV9kaXJfbm90aWZ5KGRpciwgRE5fQ1JFQVRFKTsKKwkJc2VjdXJpdHlfaW5vZGVfcG9zdF9saW5rKG9sZF9kZW50cnksIGRpciwgbmV3X2RlbnRyeSk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEhhcmRsaW5rcyBhcmUgb2Z0ZW4gdXNlZCBpbiBkZWxpY2F0ZSBzaXR1YXRpb25zLiAgV2UgYXZvaWQKKyAqIHNlY3VyaXR5LXJlbGF0ZWQgc3VycHJpc2VzIGJ5IG5vdCBmb2xsb3dpbmcgc3ltbGlua3Mgb24gdGhlCisgKiBuZXduYW1lLiAgLS1LQUIKKyAqCisgKiBXZSBkb24ndCBmb2xsb3cgdGhlbSBvbiB0aGUgb2xkbmFtZSBlaXRoZXIgdG8gYmUgY29tcGF0aWJsZQorICogd2l0aCBsaW51eCAyLjAsIGFuZCB0byBhdm9pZCBoYXJkLWxpbmtpbmcgdG8gZGlyZWN0b3JpZXMKKyAqIGFuZCBvdGhlciBzcGVjaWFsIGZpbGVzLiAgLS1BRE0KKyAqLworYXNtbGlua2FnZSBsb25nIHN5c19saW5rKGNvbnN0IGNoYXIgX191c2VyICogb2xkbmFtZSwgY29uc3QgY2hhciBfX3VzZXIgKiBuZXduYW1lKQoreworCXN0cnVjdCBkZW50cnkgKm5ld19kZW50cnk7CisJc3RydWN0IG5hbWVpZGF0YSBuZCwgb2xkX25kOworCWludCBlcnJvcjsKKwljaGFyICogdG87CisKKwl0byA9IGdldG5hbWUobmV3bmFtZSk7CisJaWYgKElTX0VSUih0bykpCisJCXJldHVybiBQVFJfRVJSKHRvKTsKKworCWVycm9yID0gX191c2VyX3dhbGsob2xkbmFtZSwgMCwgJm9sZF9uZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGV4aXQ7CisJZXJyb3IgPSBwYXRoX2xvb2t1cCh0bywgTE9PS1VQX1BBUkVOVCwgJm5kKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCWVycm9yID0gLUVYREVWOworCWlmIChvbGRfbmQubW50ICE9IG5kLm1udCkKKwkJZ290byBvdXRfcmVsZWFzZTsKKwluZXdfZGVudHJ5ID0gbG9va3VwX2NyZWF0ZSgmbmQsIDApOworCWVycm9yID0gUFRSX0VSUihuZXdfZGVudHJ5KTsKKwlpZiAoIUlTX0VSUihuZXdfZGVudHJ5KSkgeworCQllcnJvciA9IHZmc19saW5rKG9sZF9uZC5kZW50cnksIG5kLmRlbnRyeS0+ZF9pbm9kZSwgbmV3X2RlbnRyeSk7CisJCWRwdXQobmV3X2RlbnRyeSk7CisJfQorCXVwKCZuZC5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKK291dF9yZWxlYXNlOgorCXBhdGhfcmVsZWFzZSgmbmQpOworb3V0OgorCXBhdGhfcmVsZWFzZSgmb2xkX25kKTsKK2V4aXQ6CisJcHV0bmFtZSh0byk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBUaGUgd29yc3Qgb2YgYWxsIG5hbWVzcGFjZSBvcGVyYXRpb25zIC0gcmVuYW1pbmcgZGlyZWN0b3J5LiAiUGVydmVydGVkIgorICogZG9lc24ndCBldmVuIHN0YXJ0IHRvIGRlc2NyaWJlIGl0LiBTb21lYm9keSBpbiBVQ0IgaGFkIGEgaGVjayBvZiBhIHRyaXAuLi4KKyAqIFByb2JsZW1zOgorICoJYSkgd2UgY2FuIGdldCBpbnRvIGxvb3AgY3JlYXRpb24uIENoZWNrIGlzIGRvbmUgaW4gaXNfc3ViZGlyKCkuCisgKgliKSByYWNlIHBvdGVudGlhbCAtIHR3byBpbm5vY2VudCByZW5hbWVzIGNhbiBjcmVhdGUgYSBsb29wIHRvZ2V0aGVyLgorICoJICAgVGhhdCdzIHdoZXJlIDQuNCBzY3Jld3MgdXAuIEN1cnJlbnQgZml4OiBzZXJpYWxpemF0aW9uIG9uCisgKgkgICBzYi0+c192ZnNfcmVuYW1lX3NlbS4gV2UgbWlnaHQgYmUgbW9yZSBhY2N1cmF0ZSwgYnV0IHRoYXQncyBhbm90aGVyCisgKgkgICBzdG9yeS4KKyAqCWMpIHdlIGhhdmUgdG8gbG9jayBfdGhyZWVfIG9iamVjdHMgLSBwYXJlbnRzIGFuZCB2aWN0aW0gKGlmIGl0IGV4aXN0cykuCisgKgkgICBBbmQgdGhhdCAtIGFmdGVyIHdlIGdvdCAtPmlfc2VtIG9uIHBhcmVudHMgKHVudGlsIHRoZW4gd2UgZG9uJ3Qga25vdworICoJICAgd2hldGhlciB0aGUgdGFyZ2V0IGV4aXN0cykuICBTb2x1dGlvbjogdHJ5IHRvIGJlIHNtYXJ0IHdpdGggbG9ja2luZworICoJICAgb3JkZXIgZm9yIGlub2Rlcy4gIFdlIHJlbHkgb24gdGhlIGZhY3QgdGhhdCB0cmVlIHRvcG9sb2d5IG1heSBjaGFuZ2UKKyAqCSAgIG9ubHkgdW5kZXIgLT5zX3Zmc19yZW5hbWVfc2VtIF9hbmRfIHRoYXQgcGFyZW50IG9mIHRoZSBvYmplY3Qgd2UKKyAqCSAgIG1vdmUgd2lsbCBiZSBsb2NrZWQuICBUaHVzIHdlIGNhbiByYW5rIGRpcmVjdG9yaWVzIGJ5IHRoZSB0cmVlCisgKgkgICAoYW5jZXN0b3JzIGZpcnN0KSBhbmQgcmFuayBhbGwgbm9uLWRpcmVjdG9yaWVzIGFmdGVyIHRoZW0uCisgKgkgICBUaGF0IHdvcmtzIHNpbmNlIGV2ZXJ5Ym9keSBleGNlcHQgcmVuYW1lIGRvZXMgImxvY2sgcGFyZW50LCBsb29rdXAsCisgKgkgICBsb2NrIGNoaWxkIiBhbmQgcmVuYW1lIGlzIHVuZGVyIC0+c192ZnNfcmVuYW1lX3NlbS4KKyAqCSAgIEhPV0VWRVIsIGl0IHJlbGllcyBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGFueSBvYmplY3Qgd2l0aCAtPmxvb2t1cCgpCisgKgkgICBoYXMgbm8gbW9yZSB0aGFuIDEgZGVudHJ5LiAgSWYgImh5YnJpZCIgb2JqZWN0cyB3aWxsIGV2ZXIgYXBwZWFyLAorICoJICAgd2UnZCBiZXR0ZXIgbWFrZSBzdXJlIHRoYXQgdGhlcmUncyBubyBsaW5rKDIpIGZvciB0aGVtLgorICoJZCkgc29tZSBmaWxlc3lzdGVtcyBkb24ndCBzdXBwb3J0IG9wZW5lZC1idXQtdW5saW5rZWQgZGlyZWN0b3JpZXMsCisgKgkgICBlaXRoZXIgYmVjYXVzZSBvZiBsYXlvdXQgb3IgYmVjYXVzZSB0aGV5IGFyZSBub3QgcmVhZHkgdG8gZGVhbCB3aXRoCisgKgkgICBhbGwgY2FzZXMgY29ycmVjdGx5LiBUaGUgbGF0dGVyIHdpbGwgYmUgZml4ZWQgKHRha2luZyB0aGlzIHNvcnQgb2YKKyAqCSAgIHN0dWZmIGludG8gVkZTKSwgYnV0IHRoZSBmb3JtZXIgaXMgbm90IGdvaW5nIGF3YXkuIFNvbHV0aW9uOiB0aGUgc2FtZQorICoJICAgdHJpY2sgYXMgaW4gcm1kaXIoKS4KKyAqCWUpIGNvbnZlcnNpb24gZnJvbSBmaGFuZGxlIHRvIGRlbnRyeSBtYXkgY29tZSBpbiB0aGUgd3JvbmcgbW9tZW50IC0gd2hlbgorICoJICAgd2UgYXJlIHJlbW92aW5nIHRoZSB0YXJnZXQuIFNvbHV0aW9uOiB3ZSB3aWxsIGhhdmUgdG8gZ3JhYiAtPmlfc2VtCisgKgkgICBpbiB0aGUgZmhhbmRsZV90b19kZW50cnkgY29kZS4gW0ZJWE1FIC0gY3VycmVudCBuZnNmaC5jIHJlbGllcyBvbgorICoJICAgLT5pX3NlbSBvbiBwYXJlbnRzLCB3aGljaCB3b3JrcyBidXQgbGVhZHMgdG8gc29tZSB0cnVlbHkgZXhjZXNzaXZlCisgKgkgICBsb2NraW5nXS4KKyAqLworaW50IHZmc19yZW5hbWVfZGlyKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKKwkgICAgICAgc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQoreworCWludCBlcnJvciA9IDA7CisJc3RydWN0IGlub2RlICp0YXJnZXQ7CisKKwkvKgorCSAqIElmIHdlIGFyZSBnb2luZyB0byBjaGFuZ2UgdGhlIHBhcmVudCAtIGNoZWNrIHdyaXRlIHBlcm1pc3Npb25zLAorCSAqIHdlJ2xsIG5lZWQgdG8gZmxpcCAnLi4nLgorCSAqLworCWlmIChuZXdfZGlyICE9IG9sZF9kaXIpIHsKKwkJZXJyb3IgPSBwZXJtaXNzaW9uKG9sZF9kZW50cnktPmRfaW5vZGUsIE1BWV9XUklURSwgTlVMTCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9CisKKwllcnJvciA9IHNlY3VyaXR5X2lub2RlX3JlbmFtZShvbGRfZGlyLCBvbGRfZGVudHJ5LCBuZXdfZGlyLCBuZXdfZGVudHJ5KTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXRhcmdldCA9IG5ld19kZW50cnktPmRfaW5vZGU7CisJaWYgKHRhcmdldCkgeworCQlkb3duKCZ0YXJnZXQtPmlfc2VtKTsKKwkJZGVudHJ5X3VuaGFzaChuZXdfZGVudHJ5KTsKKwl9CisJaWYgKGRfbW91bnRwb2ludChvbGRfZGVudHJ5KXx8ZF9tb3VudHBvaW50KG5ld19kZW50cnkpKQorCQllcnJvciA9IC1FQlVTWTsKKwllbHNlIAorCQllcnJvciA9IG9sZF9kaXItPmlfb3AtPnJlbmFtZShvbGRfZGlyLCBvbGRfZGVudHJ5LCBuZXdfZGlyLCBuZXdfZGVudHJ5KTsKKwlpZiAodGFyZ2V0KSB7CisJCWlmICghZXJyb3IpCisJCQl0YXJnZXQtPmlfZmxhZ3MgfD0gU19ERUFEOworCQl1cCgmdGFyZ2V0LT5pX3NlbSk7CisJCWlmIChkX3VuaGFzaGVkKG5ld19kZW50cnkpKQorCQkJZF9yZWhhc2gobmV3X2RlbnRyeSk7CisJCWRwdXQobmV3X2RlbnRyeSk7CisJfQorCWlmICghZXJyb3IpIHsKKwkJZF9tb3ZlKG9sZF9kZW50cnksbmV3X2RlbnRyeSk7CisJCXNlY3VyaXR5X2lub2RlX3Bvc3RfcmVuYW1lKG9sZF9kaXIsIG9sZF9kZW50cnksCisJCQkJCSAgIG5ld19kaXIsIG5ld19kZW50cnkpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludCB2ZnNfcmVuYW1lX290aGVyKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKKwkgICAgICAgc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqdGFyZ2V0OworCWludCBlcnJvcjsKKworCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfcmVuYW1lKG9sZF9kaXIsIG9sZF9kZW50cnksIG5ld19kaXIsIG5ld19kZW50cnkpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZGdldChuZXdfZGVudHJ5KTsKKwl0YXJnZXQgPSBuZXdfZGVudHJ5LT5kX2lub2RlOworCWlmICh0YXJnZXQpCisJCWRvd24oJnRhcmdldC0+aV9zZW0pOworCWlmIChkX21vdW50cG9pbnQob2xkX2RlbnRyeSl8fGRfbW91bnRwb2ludChuZXdfZGVudHJ5KSkKKwkJZXJyb3IgPSAtRUJVU1k7CisJZWxzZQorCQllcnJvciA9IG9sZF9kaXItPmlfb3AtPnJlbmFtZShvbGRfZGlyLCBvbGRfZGVudHJ5LCBuZXdfZGlyLCBuZXdfZGVudHJ5KTsKKwlpZiAoIWVycm9yKSB7CisJCS8qIFRoZSBmb2xsb3dpbmcgZF9tb3ZlKCkgc2hvdWxkIGJlY29tZSB1bmNvbmRpdGlvbmFsICovCisJCWlmICghKG9sZF9kaXItPmlfc2ItPnNfdHlwZS0+ZnNfZmxhZ3MgJiBGU19PRERfUkVOQU1FKSkKKwkJCWRfbW92ZShvbGRfZGVudHJ5LCBuZXdfZGVudHJ5KTsKKwkJc2VjdXJpdHlfaW5vZGVfcG9zdF9yZW5hbWUob2xkX2Rpciwgb2xkX2RlbnRyeSwgbmV3X2RpciwgbmV3X2RlbnRyeSk7CisJfQorCWlmICh0YXJnZXQpCisJCXVwKCZ0YXJnZXQtPmlfc2VtKTsKKwlkcHV0KG5ld19kZW50cnkpOworCXJldHVybiBlcnJvcjsKK30KKworaW50IHZmc19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorCSAgICAgICBzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisJaW50IGVycm9yOworCWludCBpc19kaXIgPSBTX0lTRElSKG9sZF9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSk7CisKKwlpZiAob2xkX2RlbnRyeS0+ZF9pbm9kZSA9PSBuZXdfZGVudHJ5LT5kX2lub2RlKQorIAkJcmV0dXJuIDA7CisgCisJZXJyb3IgPSBtYXlfZGVsZXRlKG9sZF9kaXIsIG9sZF9kZW50cnksIGlzX2Rpcik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAoIW5ld19kZW50cnktPmRfaW5vZGUpCisJCWVycm9yID0gbWF5X2NyZWF0ZShuZXdfZGlyLCBuZXdfZGVudHJ5LCBOVUxMKTsKKwllbHNlCisJCWVycm9yID0gbWF5X2RlbGV0ZShuZXdfZGlyLCBuZXdfZGVudHJ5LCBpc19kaXIpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKCFvbGRfZGlyLT5pX29wIHx8ICFvbGRfZGlyLT5pX29wLT5yZW5hbWUpCisJCXJldHVybiAtRVBFUk07CisKKwlEUVVPVF9JTklUKG9sZF9kaXIpOworCURRVU9UX0lOSVQobmV3X2Rpcik7CisKKwlpZiAoaXNfZGlyKQorCQllcnJvciA9IHZmc19yZW5hbWVfZGlyKG9sZF9kaXIsb2xkX2RlbnRyeSxuZXdfZGlyLG5ld19kZW50cnkpOworCWVsc2UKKwkJZXJyb3IgPSB2ZnNfcmVuYW1lX290aGVyKG9sZF9kaXIsb2xkX2RlbnRyeSxuZXdfZGlyLG5ld19kZW50cnkpOworCWlmICghZXJyb3IpIHsKKwkJaWYgKG9sZF9kaXIgPT0gbmV3X2RpcikKKwkJCWlub2RlX2Rpcl9ub3RpZnkob2xkX2RpciwgRE5fUkVOQU1FKTsKKwkJZWxzZSB7CisJCQlpbm9kZV9kaXJfbm90aWZ5KG9sZF9kaXIsIEROX0RFTEVURSk7CisJCQlpbm9kZV9kaXJfbm90aWZ5KG5ld19kaXIsIEROX0NSRUFURSk7CisJCX0KKwl9CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW5saW5lIGludCBkb19yZW5hbWUoY29uc3QgY2hhciAqIG9sZG5hbWUsIGNvbnN0IGNoYXIgKiBuZXduYW1lKQoreworCWludCBlcnJvciA9IDA7CisJc3RydWN0IGRlbnRyeSAqIG9sZF9kaXIsICogbmV3X2RpcjsKKwlzdHJ1Y3QgZGVudHJ5ICogb2xkX2RlbnRyeSwgKm5ld19kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqIHRyYXA7CisJc3RydWN0IG5hbWVpZGF0YSBvbGRuZCwgbmV3bmQ7CisKKwllcnJvciA9IHBhdGhfbG9va3VwKG9sZG5hbWUsIExPT0tVUF9QQVJFTlQsICZvbGRuZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGV4aXQ7CisKKwllcnJvciA9IHBhdGhfbG9va3VwKG5ld25hbWUsIExPT0tVUF9QQVJFTlQsICZuZXduZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGV4aXQxOworCisJZXJyb3IgPSAtRVhERVY7CisJaWYgKG9sZG5kLm1udCAhPSBuZXduZC5tbnQpCisJCWdvdG8gZXhpdDI7CisKKwlvbGRfZGlyID0gb2xkbmQuZGVudHJ5OworCWVycm9yID0gLUVCVVNZOworCWlmIChvbGRuZC5sYXN0X3R5cGUgIT0gTEFTVF9OT1JNKQorCQlnb3RvIGV4aXQyOworCisJbmV3X2RpciA9IG5ld25kLmRlbnRyeTsKKwlpZiAobmV3bmQubGFzdF90eXBlICE9IExBU1RfTk9STSkKKwkJZ290byBleGl0MjsKKworCXRyYXAgPSBsb2NrX3JlbmFtZShuZXdfZGlyLCBvbGRfZGlyKTsKKworCW9sZF9kZW50cnkgPSBsb29rdXBfaGFzaCgmb2xkbmQubGFzdCwgb2xkX2Rpcik7CisJZXJyb3IgPSBQVFJfRVJSKG9sZF9kZW50cnkpOworCWlmIChJU19FUlIob2xkX2RlbnRyeSkpCisJCWdvdG8gZXhpdDM7CisJLyogc291cmNlIG11c3QgZXhpc3QgKi8KKwllcnJvciA9IC1FTk9FTlQ7CisJaWYgKCFvbGRfZGVudHJ5LT5kX2lub2RlKQorCQlnb3RvIGV4aXQ0OworCS8qIHVubGVzcyB0aGUgc291cmNlIGlzIGEgZGlyZWN0b3J5IHRyYWlsaW5nIHNsYXNoZXMgZ2l2ZSAtRU5PVERJUiAqLworCWlmICghU19JU0RJUihvbGRfZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKSB7CisJCWVycm9yID0gLUVOT1RESVI7CisJCWlmIChvbGRuZC5sYXN0Lm5hbWVbb2xkbmQubGFzdC5sZW5dKQorCQkJZ290byBleGl0NDsKKwkJaWYgKG5ld25kLmxhc3QubmFtZVtuZXduZC5sYXN0Lmxlbl0pCisJCQlnb3RvIGV4aXQ0OworCX0KKwkvKiBzb3VyY2Ugc2hvdWxkIG5vdCBiZSBhbmNlc3RvciBvZiB0YXJnZXQgKi8KKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKG9sZF9kZW50cnkgPT0gdHJhcCkKKwkJZ290byBleGl0NDsKKwluZXdfZGVudHJ5ID0gbG9va3VwX2hhc2goJm5ld25kLmxhc3QsIG5ld19kaXIpOworCWVycm9yID0gUFRSX0VSUihuZXdfZGVudHJ5KTsKKwlpZiAoSVNfRVJSKG5ld19kZW50cnkpKQorCQlnb3RvIGV4aXQ0OworCS8qIHRhcmdldCBzaG91bGQgbm90IGJlIGFuIGFuY2VzdG9yIG9mIHNvdXJjZSAqLworCWVycm9yID0gLUVOT1RFTVBUWTsKKwlpZiAobmV3X2RlbnRyeSA9PSB0cmFwKQorCQlnb3RvIGV4aXQ1OworCisJZXJyb3IgPSB2ZnNfcmVuYW1lKG9sZF9kaXItPmRfaW5vZGUsIG9sZF9kZW50cnksCisJCQkJICAgbmV3X2Rpci0+ZF9pbm9kZSwgbmV3X2RlbnRyeSk7CitleGl0NToKKwlkcHV0KG5ld19kZW50cnkpOworZXhpdDQ6CisJZHB1dChvbGRfZGVudHJ5KTsKK2V4aXQzOgorCXVubG9ja19yZW5hbWUobmV3X2Rpciwgb2xkX2Rpcik7CitleGl0MjoKKwlwYXRoX3JlbGVhc2UoJm5ld25kKTsKK2V4aXQxOgorCXBhdGhfcmVsZWFzZSgmb2xkbmQpOworZXhpdDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfcmVuYW1lKGNvbnN0IGNoYXIgX191c2VyICogb2xkbmFtZSwgY29uc3QgY2hhciBfX3VzZXIgKiBuZXduYW1lKQoreworCWludCBlcnJvcjsKKwljaGFyICogZnJvbTsKKwljaGFyICogdG87CisKKwlmcm9tID0gZ2V0bmFtZShvbGRuYW1lKTsKKwlpZihJU19FUlIoZnJvbSkpCisJCXJldHVybiBQVFJfRVJSKGZyb20pOworCXRvID0gZ2V0bmFtZShuZXduYW1lKTsKKwllcnJvciA9IFBUUl9FUlIodG8pOworCWlmICghSVNfRVJSKHRvKSkgeworCQllcnJvciA9IGRvX3JlbmFtZShmcm9tLHRvKTsKKwkJcHV0bmFtZSh0byk7CisJfQorCXB1dG5hbWUoZnJvbSk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgdmZzX3JlYWRsaW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgaW50IGJ1ZmxlbiwgY29uc3QgY2hhciAqbGluaykKK3sKKwlpbnQgbGVuOworCisJbGVuID0gUFRSX0VSUihsaW5rKTsKKwlpZiAoSVNfRVJSKGxpbmspKQorCQlnb3RvIG91dDsKKworCWxlbiA9IHN0cmxlbihsaW5rKTsKKwlpZiAobGVuID4gKHVuc2lnbmVkKSBidWZsZW4pCisJCWxlbiA9IGJ1ZmxlbjsKKwlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgbGluaywgbGVuKSkKKwkJbGVuID0gLUVGQVVMVDsKK291dDoKKwlyZXR1cm4gbGVuOworfQorCisvKgorICogQSBoZWxwZXIgZm9yIC0+cmVhZGxpbmsoKS4gIFRoaXMgc2hvdWxkIGJlIHVzZWQgKk9OTFkqIGZvciBzeW1saW5rcyB0aGF0CisgKiBoYXZlIC0+Zm9sbG93X2xpbmsoKSB0b3VjaGluZyBuZCBvbmx5IGluIG5kX3NldF9saW5rKCkuICBVc2luZyAob3Igbm90CisgKiB1c2luZykgaXQgZm9yIGFueSBnaXZlbiBpbm9kZSBpcyB1cCB0byBmaWxlc3lzdGVtLgorICovCitpbnQgZ2VuZXJpY19yZWFkbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgX191c2VyICpidWZmZXIsIGludCBidWZsZW4pCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgcmVzOworCW5kLmRlcHRoID0gMDsKKwlyZXMgPSBkZW50cnktPmRfaW5vZGUtPmlfb3AtPmZvbGxvd19saW5rKGRlbnRyeSwgJm5kKTsKKwlpZiAoIXJlcykgeworCQlyZXMgPSB2ZnNfcmVhZGxpbmsoZGVudHJ5LCBidWZmZXIsIGJ1ZmxlbiwgbmRfZ2V0X2xpbmsoJm5kKSk7CisJCWlmIChkZW50cnktPmRfaW5vZGUtPmlfb3AtPnB1dF9saW5rKQorCQkJZGVudHJ5LT5kX2lub2RlLT5pX29wLT5wdXRfbGluayhkZW50cnksICZuZCk7CisJfQorCXJldHVybiByZXM7Cit9CisKK2ludCB2ZnNfZm9sbG93X2xpbmsoc3RydWN0IG5hbWVpZGF0YSAqbmQsIGNvbnN0IGNoYXIgKmxpbmspCit7CisJcmV0dXJuIF9fdmZzX2ZvbGxvd19saW5rKG5kLCBsaW5rKTsKK30KKworLyogZ2V0IHRoZSBsaW5rIGNvbnRlbnRzIGludG8gcGFnZWNhY2hlICovCitzdGF0aWMgY2hhciAqcGFnZV9nZXRsaW5rKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBwYWdlICoqcHBhZ2UpCit7CisJc3RydWN0IHBhZ2UgKiBwYWdlOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmc7CisJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCAwLCAoZmlsbGVyX3QgKiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsCisJCQkJTlVMTCk7CisJaWYgKElTX0VSUihwYWdlKSkKKwkJZ290byBzeW5jX2ZhaWw7CisJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJZ290byBhc3luY19mYWlsOworCSpwcGFnZSA9IHBhZ2U7CisJcmV0dXJuIGttYXAocGFnZSk7CisKK2FzeW5jX2ZhaWw6CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXJldHVybiBFUlJfUFRSKC1FSU8pOworCitzeW5jX2ZhaWw6CisJcmV0dXJuIChjaGFyKilwYWdlOworfQorCitpbnQgcGFnZV9yZWFkbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgX191c2VyICpidWZmZXIsIGludCBidWZsZW4pCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCWNoYXIgKnMgPSBwYWdlX2dldGxpbmsoZGVudHJ5LCAmcGFnZSk7CisJaW50IHJlcyA9IHZmc19yZWFkbGluayhkZW50cnksYnVmZmVyLGJ1ZmxlbixzKTsKKwlpZiAocGFnZSkgeworCQlrdW5tYXAocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CisJcmV0dXJuIHJlczsKK30KKworaW50IHBhZ2VfZm9sbG93X2xpbmtfbGlnaHQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwluZF9zZXRfbGluayhuZCwgcGFnZV9nZXRsaW5rKGRlbnRyeSwgJnBhZ2UpKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBwYWdlX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaWYgKCFJU19FUlIobmRfZ2V0X2xpbmsobmQpKSkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcsIDApOworCQlpZiAoIXBhZ2UpCisJCQlCVUcoKTsKKwkJa3VubWFwKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9Cit9CisKK2ludCBwYWdlX3N5bWxpbmsoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqc3ltbmFtZSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UobWFwcGluZywgMCk7CisJaW50IGVyciA9IC1FTk9NRU07CisJY2hhciAqa2FkZHI7CisKKwlpZiAoIXBhZ2UpCisJCWdvdG8gZmFpbDsKKwllcnIgPSBtYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCAwLCBsZW4tMSk7CisJaWYgKGVycikKKwkJZ290byBmYWlsX21hcDsKKwlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwltZW1jcHkoa2FkZHIsIHN5bW5hbWUsIGxlbi0xKTsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJbWFwcGluZy0+YV9vcHMtPmNvbW1pdF93cml0ZShOVUxMLCBwYWdlLCAwLCBsZW4tMSk7CisJLyoKKwkgKiBOb3RpY2UgdGhhdCB3ZSBhcmUgX25vdF8gZ29pbmcgdG8gYmxvY2sgaGVyZSAtIGVuZCBvZiBwYWdlIGlzCisJICogdW5tYXBwZWQsIHNvIHRoaXMgd2lsbCBvbmx5IHRyeSB0byBtYXAgdGhlIHJlc3Qgb2YgcGFnZSwgc2VlCisJICogdGhhdCBpdCBpcyB1bm1hcHBlZCAodHlwaWNhbGx5IGV2ZW4gd2lsbCBub3QgbG9vayBpbnRvIGlub2RlIC0KKwkgKiAtPmlfc2l6ZSB3aWxsIGJlIGVub3VnaCBmb3IgZXZlcnl0aGluZykgYW5kIHplcm8gaXQgb3V0LgorCSAqIE9UT0ggaXQncyBvYnZpb3VzbHkgY29ycmVjdCBhbmQgc2hvdWxkIG1ha2UgdGhlIHBhZ2UgdXAtdG8tZGF0ZS4KKwkgKi8KKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQllcnIgPSBtYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UoTlVMTCwgcGFnZSk7CisJCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7CisJfSBlbHNlIHsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJfQorCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBmYWlsOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXJldHVybiAwOworZmFpbF9tYXA6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworZmFpbDoKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZGxpbmsJPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawk9IHBhZ2VfZm9sbG93X2xpbmtfbGlnaHQsCisJLnB1dF9saW5rCT0gcGFnZV9wdXRfbGluaywKK307CisKK0VYUE9SVF9TWU1CT0woX191c2VyX3dhbGspOworRVhQT1JUX1NZTUJPTChmb2xsb3dfZG93bik7CitFWFBPUlRfU1lNQk9MKGZvbGxvd191cCk7CitFWFBPUlRfU1lNQk9MKGdldF93cml0ZV9hY2Nlc3MpOyAvKiBiaW5mbXRfYW91dCAqLworRVhQT1JUX1NZTUJPTChnZXRuYW1lKTsKK0VYUE9SVF9TWU1CT0wobG9ja19yZW5hbWUpOworRVhQT1JUX1NZTUJPTChsb29rdXBfaGFzaCk7CitFWFBPUlRfU1lNQk9MKGxvb2t1cF9vbmVfbGVuKTsKK0VYUE9SVF9TWU1CT0wocGFnZV9mb2xsb3dfbGlua19saWdodCk7CitFWFBPUlRfU1lNQk9MKHBhZ2VfcHV0X2xpbmspOworRVhQT1JUX1NZTUJPTChwYWdlX3JlYWRsaW5rKTsKK0VYUE9SVF9TWU1CT0wocGFnZV9zeW1saW5rKTsKK0VYUE9SVF9TWU1CT0wocGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnMpOworRVhQT1JUX1NZTUJPTChwYXRoX2xvb2t1cCk7CitFWFBPUlRfU1lNQk9MKHBhdGhfcmVsZWFzZSk7CitFWFBPUlRfU1lNQk9MKHBhdGhfd2Fsayk7CitFWFBPUlRfU1lNQk9MKHBlcm1pc3Npb24pOworRVhQT1JUX1NZTUJPTCh1bmxvY2tfcmVuYW1lKTsKK0VYUE9SVF9TWU1CT0wodmZzX2NyZWF0ZSk7CitFWFBPUlRfU1lNQk9MKHZmc19mb2xsb3dfbGluayk7CitFWFBPUlRfU1lNQk9MKHZmc19saW5rKTsKK0VYUE9SVF9TWU1CT0wodmZzX21rZGlyKTsKK0VYUE9SVF9TWU1CT0wodmZzX21rbm9kKTsKK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19wZXJtaXNzaW9uKTsKK0VYUE9SVF9TWU1CT0wodmZzX3JlYWRsaW5rKTsKK0VYUE9SVF9TWU1CT0wodmZzX3JlbmFtZSk7CitFWFBPUlRfU1lNQk9MKHZmc19ybWRpcik7CitFWFBPUlRfU1lNQk9MKHZmc19zeW1saW5rKTsKK0VYUE9SVF9TWU1CT0wodmZzX3VubGluayk7CitFWFBPUlRfU1lNQk9MKGRlbnRyeV91bmhhc2gpOworRVhQT1JUX1NZTUJPTChnZW5lcmljX3JlYWRsaW5rKTsKZGlmZiAtLWdpdCBhL2ZzL25hbWVzcGFjZS5jIGIvZnMvbmFtZXNwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I5M2U1ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25hbWVzcGFjZS5jCkBAIC0wLDAgKzEsMTQ2NSBAQAorLyoKKyAqICBsaW51eC9mcy9uYW1lc3BhY2UuYworICoKKyAqIChDKSBDb3B5cmlnaHQgQWwgVmlybyAyMDAwLCAyMDAxCisgKglSZWxlYXNlZCB1bmRlciBHUEwgdjIuCisgKgorICogQmFzZWQgb24gY29kZSBmcm9tIGZzL3N1cGVyLmMsIGNvcHlyaWdodCBMaW51cyBUb3J2YWxkcyBhbmQgb3RoZXJzLgorICogSGVhdmlseSByZXdyaXR0ZW4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9hY2N0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1lc3BhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworZXh0ZXJuIGludCBfX2luaXQgaW5pdF9yb290ZnModm9pZCk7CisKKyNpZmRlZiBDT05GSUdfU1lTRlMKK2V4dGVybiBpbnQgX19pbml0IHN5c2ZzX2luaXQodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgc3lzZnNfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qIHNwaW5sb2NrIGZvciB2ZnNtb3VudCByZWxhdGVkIG9wZXJhdGlvbnMsIGlucGxhY2Ugb2YgZGNhY2hlX2xvY2sgKi8KKyBfX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcCBERUZJTkVfU1BJTkxPQ0sodmZzbW91bnRfbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICptb3VudF9oYXNodGFibGU7CitzdGF0aWMgaW50IGhhc2hfbWFzaywgaGFzaF9iaXRzOworc3RhdGljIGttZW1fY2FjaGVfdCAqbW50X2NhY2hlOyAKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhhc2goc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcCA9ICgodW5zaWduZWQgbG9uZykgbW50IC8gTDFfQ0FDSEVfQllURVMpOworCXRtcCArPSAoKHVuc2lnbmVkIGxvbmcpIGRlbnRyeSAvIEwxX0NBQ0hFX0JZVEVTKTsKKwl0bXAgPSB0bXAgKyAodG1wID4+IGhhc2hfYml0cyk7CisJcmV0dXJuIHRtcCAmIGhhc2hfbWFzazsKK30KKworc3RydWN0IHZmc21vdW50ICphbGxvY192ZnNtbnQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IGttZW1fY2FjaGVfYWxsb2MobW50X2NhY2hlLCBHRlBfS0VSTkVMKTsgCisJaWYgKG1udCkgeworCQltZW1zZXQobW50LCAwLCBzaXplb2Yoc3RydWN0IHZmc21vdW50KSk7CisJCWF0b21pY19zZXQoJm1udC0+bW50X2NvdW50LDEpOworCQlJTklUX0xJU1RfSEVBRCgmbW50LT5tbnRfaGFzaCk7CisJCUlOSVRfTElTVF9IRUFEKCZtbnQtPm1udF9jaGlsZCk7CisJCUlOSVRfTElTVF9IRUFEKCZtbnQtPm1udF9tb3VudHMpOworCQlJTklUX0xJU1RfSEVBRCgmbW50LT5tbnRfbGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZtbnQtPm1udF9mc2xpbmspOworCQlpZiAobmFtZSkgeworCQkJaW50IHNpemUgPSBzdHJsZW4obmFtZSkrMTsKKwkJCWNoYXIgKm5ld25hbWUgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQkJaWYgKG5ld25hbWUpIHsKKwkJCQltZW1jcHkobmV3bmFtZSwgbmFtZSwgc2l6ZSk7CisJCQkJbW50LT5tbnRfZGV2bmFtZSA9IG5ld25hbWU7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIG1udDsKK30KKwordm9pZCBmcmVlX3Zmc21udChzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlrZnJlZShtbnQtPm1udF9kZXZuYW1lKTsKKwlrbWVtX2NhY2hlX2ZyZWUobW50X2NhY2hlLCBtbnQpOworfQorCisvKgorICogTm93LCBsb29rdXBfbW50IGluY3JlbWVudHMgdGhlIHJlZiBjb3VudCBiZWZvcmUgcmV0dXJuaW5nCisgKiB0aGUgdmZzbW91bnQgc3RydWN0LgorICovCitzdHJ1Y3QgdmZzbW91bnQgKmxvb2t1cF9tbnQoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICogaGVhZCA9IG1vdW50X2hhc2h0YWJsZSArIGhhc2gobW50LCBkZW50cnkpOworCXN0cnVjdCBsaXN0X2hlYWQgKiB0bXAgPSBoZWFkOworCXN0cnVjdCB2ZnNtb3VudCAqcCwgKmZvdW5kID0gTlVMTDsKKworCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisJZm9yICg7OykgeworCQl0bXAgPSB0bXAtPm5leHQ7CisJCXAgPSBOVUxMOworCQlpZiAodG1wID09IGhlYWQpCisJCQlicmVhazsKKwkJcCA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9oYXNoKTsKKwkJaWYgKHAtPm1udF9wYXJlbnQgPT0gbW50ICYmIHAtPm1udF9tb3VudHBvaW50ID09IGRlbnRyeSkgeworCQkJZm91bmQgPSBtbnRnZXQocCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgaW5saW5lIGludCBjaGVja19tbnQoc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJcmV0dXJuIG1udC0+bW50X25hbWVzcGFjZSA9PSBjdXJyZW50LT5uYW1lc3BhY2U7Cit9CisKK3N0YXRpYyB2b2lkIGRldGFjaF9tbnQoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBuYW1laWRhdGEgKm9sZF9uZCkKK3sKKwlvbGRfbmQtPmRlbnRyeSA9IG1udC0+bW50X21vdW50cG9pbnQ7CisJb2xkX25kLT5tbnQgPSBtbnQtPm1udF9wYXJlbnQ7CisJbW50LT5tbnRfcGFyZW50ID0gbW50OworCW1udC0+bW50X21vdW50cG9pbnQgPSBtbnQtPm1udF9yb290OworCWxpc3RfZGVsX2luaXQoJm1udC0+bW50X2NoaWxkKTsKKwlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9oYXNoKTsKKwlvbGRfbmQtPmRlbnRyeS0+ZF9tb3VudGVkLS07Cit9CisKK3N0YXRpYyB2b2lkIGF0dGFjaF9tbnQoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCW1udC0+bW50X3BhcmVudCA9IG1udGdldChuZC0+bW50KTsKKwltbnQtPm1udF9tb3VudHBvaW50ID0gZGdldChuZC0+ZGVudHJ5KTsKKwlsaXN0X2FkZCgmbW50LT5tbnRfaGFzaCwgbW91bnRfaGFzaHRhYmxlK2hhc2gobmQtPm1udCwgbmQtPmRlbnRyeSkpOworCWxpc3RfYWRkX3RhaWwoJm1udC0+bW50X2NoaWxkLCAmbmQtPm1udC0+bW50X21vdW50cyk7CisJbmQtPmRlbnRyeS0+ZF9tb3VudGVkKys7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKm5leHRfbW50KHN0cnVjdCB2ZnNtb3VudCAqcCwgc3RydWN0IHZmc21vdW50ICpyb290KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQgPSBwLT5tbnRfbW91bnRzLm5leHQ7CisJaWYgKG5leHQgPT0gJnAtPm1udF9tb3VudHMpIHsKKwkJd2hpbGUgKDEpIHsKKwkJCWlmIChwID09IHJvb3QpCisJCQkJcmV0dXJuIE5VTEw7CisJCQluZXh0ID0gcC0+bW50X2NoaWxkLm5leHQ7CisJCQlpZiAobmV4dCAhPSAmcC0+bW50X3BhcmVudC0+bW50X21vdW50cykKKwkJCQlicmVhazsKKwkJCXAgPSBwLT5tbnRfcGFyZW50OworCQl9CisJfQorCXJldHVybiBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCB2ZnNtb3VudCwgbW50X2NoaWxkKTsKK30KKworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqCitjbG9uZV9tbnQoc3RydWN0IHZmc21vdW50ICpvbGQsIHN0cnVjdCBkZW50cnkgKnJvb3QpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IG9sZC0+bW50X3NiOworCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gYWxsb2NfdmZzbW50KG9sZC0+bW50X2Rldm5hbWUpOworCisJaWYgKG1udCkgeworCQltbnQtPm1udF9mbGFncyA9IG9sZC0+bW50X2ZsYWdzOworCQlhdG9taWNfaW5jKCZzYi0+c19hY3RpdmUpOworCQltbnQtPm1udF9zYiA9IHNiOworCQltbnQtPm1udF9yb290ID0gZGdldChyb290KTsKKwkJbW50LT5tbnRfbW91bnRwb2ludCA9IG1udC0+bW50X3Jvb3Q7CisJCW1udC0+bW50X3BhcmVudCA9IG1udDsKKwkJbW50LT5tbnRfbmFtZXNwYWNlID0gb2xkLT5tbnRfbmFtZXNwYWNlOworCisJCS8qIHN0aWNrIHRoZSBkdXBsaWNhdGUgbW91bnQgb24gdGhlIHNhbWUgZXhwaXJ5IGxpc3QKKwkJICogYXMgdGhlIG9yaWdpbmFsIGlmIHRoYXQgd2FzIG9uIG9uZSAqLworCQlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOworCQlpZiAoIWxpc3RfZW1wdHkoJm9sZC0+bW50X2ZzbGluaykpCisJCQlsaXN0X2FkZCgmbW50LT5tbnRfZnNsaW5rLCAmb2xkLT5tbnRfZnNsaW5rKTsKKwkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCX0KKwlyZXR1cm4gbW50OworfQorCit2b2lkIF9fbW50cHV0KHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBtbnQtPm1udF9zYjsKKwlkcHV0KG1udC0+bW50X3Jvb3QpOworCWZyZWVfdmZzbW50KG1udCk7CisJZGVhY3RpdmF0ZV9zdXBlcihzYik7Cit9CisKK0VYUE9SVF9TWU1CT0woX19tbnRwdXQpOworCisvKiBpdGVyYXRvciAqLworc3RhdGljIHZvaWQgKm1fc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbmFtZXNwYWNlICpuID0gbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCWxvZmZfdCBsID0gKnBvczsKKworCWRvd25fcmVhZCgmbi0+c2VtKTsKKwlsaXN0X2Zvcl9lYWNoKHAsICZuLT5saXN0KQorCQlpZiAoIWwtLSkKKwkJCXJldHVybiBsaXN0X2VudHJ5KHAsIHN0cnVjdCB2ZnNtb3VudCwgbW50X2xpc3QpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqbV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IG5hbWVzcGFjZSAqbiA9IG0tPnByaXZhdGU7CisJc3RydWN0IGxpc3RfaGVhZCAqcCA9ICgoc3RydWN0IHZmc21vdW50ICopdiktPm1udF9saXN0Lm5leHQ7CisJKCpwb3MpKys7CisJcmV0dXJuIHA9PSZuLT5saXN0ID8gTlVMTCA6IGxpc3RfZW50cnkocCwgc3RydWN0IHZmc21vdW50LCBtbnRfbGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkIG1fc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IG5hbWVzcGFjZSAqbiA9IG0tPnByaXZhdGU7CisJdXBfcmVhZCgmbi0+c2VtKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1hbmdsZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGNvbnN0IGNoYXIgKnMpCit7CisJc2VxX2VzY2FwZShtLCBzLCAiIFx0XG5cXCIpOworfQorCitzdGF0aWMgaW50IHNob3dfdmZzbW50KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IHY7CisJaW50IGVyciA9IDA7CisJc3RhdGljIHN0cnVjdCBwcm9jX2ZzX2luZm8geworCQlpbnQgZmxhZzsKKwkJY2hhciAqc3RyOworCX0gZnNfaW5mb1tdID0geworCQl7IE1TX1NZTkNIUk9OT1VTLCAiLHN5bmMiIH0sCisJCXsgTVNfRElSU1lOQywgIixkaXJzeW5jIiB9LAorCQl7IE1TX01BTkRMT0NLLCAiLG1hbmQiIH0sCisJCXsgTVNfTk9BVElNRSwgIixub2F0aW1lIiB9LAorCQl7IE1TX05PRElSQVRJTUUsICIsbm9kaXJhdGltZSIgfSwKKwkJeyAwLCBOVUxMIH0KKwl9OworCXN0YXRpYyBzdHJ1Y3QgcHJvY19mc19pbmZvIG1udF9pbmZvW10gPSB7CisJCXsgTU5UX05PU1VJRCwgIixub3N1aWQiIH0sCisJCXsgTU5UX05PREVWLCAiLG5vZGV2IiB9LAorCQl7IE1OVF9OT0VYRUMsICIsbm9leGVjIiB9LAorCQl7IDAsIE5VTEwgfQorCX07CisJc3RydWN0IHByb2NfZnNfaW5mbyAqZnNfaW5mb3A7CisKKwltYW5nbGUobSwgbW50LT5tbnRfZGV2bmFtZSA/IG1udC0+bW50X2Rldm5hbWUgOiAibm9uZSIpOworCXNlcV9wdXRjKG0sICcgJyk7CisJc2VxX3BhdGgobSwgbW50LCBtbnQtPm1udF9yb290LCAiIFx0XG5cXCIpOworCXNlcV9wdXRjKG0sICcgJyk7CisJbWFuZ2xlKG0sIG1udC0+bW50X3NiLT5zX3R5cGUtPm5hbWUpOworCXNlcV9wdXRzKG0sIG1udC0+bW50X3NiLT5zX2ZsYWdzICYgTVNfUkRPTkxZID8gIiBybyIgOiAiIHJ3Iik7CisJZm9yIChmc19pbmZvcCA9IGZzX2luZm87IGZzX2luZm9wLT5mbGFnOyBmc19pbmZvcCsrKSB7CisJCWlmIChtbnQtPm1udF9zYi0+c19mbGFncyAmIGZzX2luZm9wLT5mbGFnKQorCQkJc2VxX3B1dHMobSwgZnNfaW5mb3AtPnN0cik7CisJfQorCWZvciAoZnNfaW5mb3AgPSBtbnRfaW5mbzsgZnNfaW5mb3AtPmZsYWc7IGZzX2luZm9wKyspIHsKKwkJaWYgKG1udC0+bW50X2ZsYWdzICYgZnNfaW5mb3AtPmZsYWcpCisJCQlzZXFfcHV0cyhtLCBmc19pbmZvcC0+c3RyKTsKKwl9CisJaWYgKG1udC0+bW50X3NiLT5zX29wLT5zaG93X29wdGlvbnMpCisJCWVyciA9IG1udC0+bW50X3NiLT5zX29wLT5zaG93X29wdGlvbnMobSwgbW50KTsKKwlzZXFfcHV0cyhtLCAiIDAgMFxuIik7CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IHNlcV9vcGVyYXRpb25zIG1vdW50c19vcCA9IHsKKwkuc3RhcnQJPSBtX3N0YXJ0LAorCS5uZXh0CT0gbV9uZXh0LAorCS5zdG9wCT0gbV9zdG9wLAorCS5zaG93CT0gc2hvd192ZnNtbnQKK307CisKKy8qKgorICogbWF5X3Vtb3VudF90cmVlIC0gY2hlY2sgaWYgYSBtb3VudCB0cmVlIGlzIGJ1c3kKKyAqIEBtbnQ6IHJvb3Qgb2YgbW91bnQgdHJlZQorICoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIGNoZWNrIGlmIGEgdHJlZSBvZiBtb3VudHMgaGFzIGFueQorICogb3BlbiBmaWxlcywgcHdkcywgY2hyb290cyBvciBzdWIgbW91bnRzIHRoYXQgYXJlCisgKiBidXN5LgorICovCitpbnQgbWF5X3Vtb3VudF90cmVlKHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CisJc3RydWN0IHZmc21vdW50ICp0aGlzX3BhcmVudCA9IG1udDsKKwlpbnQgYWN0dWFsX3JlZnM7CisJaW50IG1pbmltdW1fcmVmczsKKworCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisJYWN0dWFsX3JlZnMgPSBhdG9taWNfcmVhZCgmbW50LT5tbnRfY291bnQpOworCW1pbmltdW1fcmVmcyA9IDI7CityZXBlYXQ6CisJbmV4dCA9IHRoaXNfcGFyZW50LT5tbnRfbW91bnRzLm5leHQ7CityZXN1bWU6CisJd2hpbGUgKG5leHQgIT0gJnRoaXNfcGFyZW50LT5tbnRfbW91bnRzKSB7CisJCXN0cnVjdCB2ZnNtb3VudCAqcCA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IHZmc21vdW50LCBtbnRfY2hpbGQpOworCisJCW5leHQgPSBuZXh0LT5uZXh0OworCisJCWFjdHVhbF9yZWZzICs9IGF0b21pY19yZWFkKCZwLT5tbnRfY291bnQpOworCQltaW5pbXVtX3JlZnMgKz0gMjsKKworCQlpZiAoIWxpc3RfZW1wdHkoJnAtPm1udF9tb3VudHMpKSB7CisJCQl0aGlzX3BhcmVudCA9IHA7CisJCQlnb3RvIHJlcGVhdDsKKwkJfQorCX0KKworCWlmICh0aGlzX3BhcmVudCAhPSBtbnQpIHsKKwkJbmV4dCA9IHRoaXNfcGFyZW50LT5tbnRfY2hpbGQubmV4dDsKKwkJdGhpc19wYXJlbnQgPSB0aGlzX3BhcmVudC0+bW50X3BhcmVudDsKKwkJZ290byByZXN1bWU7CisJfQorCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKworCWlmIChhY3R1YWxfcmVmcyA+IG1pbmltdW1fcmVmcykKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKG1heV91bW91bnRfdHJlZSk7CisKKy8qKgorICogbWF5X3Vtb3VudCAtIGNoZWNrIGlmIGEgbW91bnQgcG9pbnQgaXMgYnVzeQorICogQG1udDogcm9vdCBvZiBtb3VudAorICoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIGNoZWNrIGlmIGEgbW91bnQgcG9pbnQgaGFzIGFueQorICogb3BlbiBmaWxlcywgcHdkcywgY2hyb290cyBvciBzdWIgbW91bnRzLiBJZiB0aGUKKyAqIG1vdW50IGhhcyBzdWIgbW91bnRzIHRoaXMgd2lsbCByZXR1cm4gYnVzeQorICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzdWIgbW91bnRzIGFyZSBidXN5LgorICoKKyAqIERvZXNuJ3QgdGFrZSBxdW90YSBhbmQgc3R1ZmYgaW50byBhY2NvdW50LiBJT1csIGluIHNvbWUgY2FzZXMgaXQgd2lsbAorICogZ2l2ZSBmYWxzZSBuZWdhdGl2ZXMuIFRoZSBtYWluIHJlYXNvbiB3aHkgaXQncyBoZXJlIGlzIHRoYXQgd2UgbmVlZAorICogYSBub24tZGVzdHJ1Y3RpdmUgd2F5IHRvIGxvb2sgZm9yIGVhc2lseSB1bW91bnRhYmxlIGZpbGVzeXN0ZW1zLgorICovCitpbnQgbWF5X3Vtb3VudChzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlpZiAoYXRvbWljX3JlYWQoJm1udC0+bW50X2NvdW50KSA+IDIpCisJCXJldHVybiAtRUJVU1k7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0wobWF5X3Vtb3VudCk7CisKK3ZvaWQgdW1vdW50X3RyZWUoc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJc3RydWN0IHZmc21vdW50ICpwOworCUxJU1RfSEVBRChraWxsKTsKKworCWZvciAocCA9IG1udDsgcDsgcCA9IG5leHRfbW50KHAsIG1udCkpIHsKKwkJbGlzdF9kZWwoJnAtPm1udF9saXN0KTsKKwkJbGlzdF9hZGQoJnAtPm1udF9saXN0LCAma2lsbCk7CisJfQorCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZraWxsKSkgeworCQltbnQgPSBsaXN0X2VudHJ5KGtpbGwubmV4dCwgc3RydWN0IHZmc21vdW50LCBtbnRfbGlzdCk7CisJCWxpc3RfZGVsX2luaXQoJm1udC0+bW50X2xpc3QpOworCQlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9mc2xpbmspOworCQlpZiAobW50LT5tbnRfcGFyZW50ID09IG1udCkgeworCQkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCQl9IGVsc2UgeworCQkJc3RydWN0IG5hbWVpZGF0YSBvbGRfbmQ7CisJCQlkZXRhY2hfbW50KG1udCwgJm9sZF9uZCk7CisJCQlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CisJCQlwYXRoX3JlbGVhc2UoJm9sZF9uZCk7CisJCX0KKwkJbW50cHV0KG1udCk7CisJCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisJfQorfQorCitzdGF0aWMgaW50IGRvX3Vtb3VudChzdHJ1Y3QgdmZzbW91bnQgKm1udCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gbW50LT5tbnRfc2I7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHNlY3VyaXR5X3NiX3Vtb3VudChtbnQsIGZsYWdzKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJLyoKKwkgKiBBbGxvdyB1c2Vyc3BhY2UgdG8gcmVxdWVzdCBhIG1vdW50cG9pbnQgYmUgZXhwaXJlZCByYXRoZXIgdGhhbgorCSAqIHVubW91bnRpbmcgdW5jb25kaXRpb25hbGx5LiBVbm1vdW50IG9ubHkgaGFwcGVucyBpZjoKKwkgKiAgKDEpIHRoZSBtYXJrIGlzIGFscmVhZHkgc2V0ICh0aGUgbWFyayBpcyBjbGVhcmVkIGJ5IG1udHB1dCgpKQorCSAqICAoMikgdGhlIHVzYWdlIGNvdW50ID09IDEgW3BhcmVudCB2ZnNtb3VudF0gKyAxIFtzeXNfdW1vdW50XQorCSAqLworCWlmIChmbGFncyAmIE1OVF9FWFBJUkUpIHsKKwkJaWYgKG1udCA9PSBjdXJyZW50LT5mcy0+cm9vdG1udCB8fAorCQkgICAgZmxhZ3MgJiAoTU5UX0ZPUkNFIHwgTU5UX0RFVEFDSCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoYXRvbWljX3JlYWQoJm1udC0+bW50X2NvdW50KSAhPSAyKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlpZiAoIXhjaGcoJm1udC0+bW50X2V4cGlyeV9tYXJrLCAxKSkKKwkJCXJldHVybiAtRUFHQUlOOworCX0KKworCS8qCisJICogSWYgd2UgbWF5IGhhdmUgdG8gYWJvcnQgb3BlcmF0aW9ucyB0byBnZXQgb3V0IG9mIHRoaXMKKwkgKiBtb3VudCwgYW5kIHRoZXkgd2lsbCB0aGVtc2VsdmVzIGhvbGQgcmVzb3VyY2VzIHdlIG11c3QKKwkgKiBhbGxvdyB0aGUgZnMgdG8gZG8gdGhpbmdzLiBJbiB0aGUgVW5peCB0cmFkaXRpb24gb2YKKwkgKiAnR2VlIHRoYXRzIHRyaWNreSBsZXRzIGRvIGl0IGluIHVzZXJzcGFjZScgdGhlIHVtb3VudF9iZWdpbgorCSAqIG1pZ2h0IGZhaWwgdG8gY29tcGxldGUgb24gdGhlIGZpcnN0IHJ1biB0aHJvdWdoIGFzIG90aGVyIHRhc2tzCisJICogbXVzdCByZXR1cm4sIGFuZCB0aGUgbGlrZS4gVGhhdHMgZm9yIHRoZSBtb3VudCBwcm9ncmFtIHRvIHdvcnJ5CisJICogYWJvdXQgZm9yIHRoZSBtb21lbnQuCisJICovCisKKwlsb2NrX2tlcm5lbCgpOworCWlmKCAoZmxhZ3MmTU5UX0ZPUkNFKSAmJiBzYi0+c19vcC0+dW1vdW50X2JlZ2luKQorCQlzYi0+c19vcC0+dW1vdW50X2JlZ2luKHNiKTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKwkvKgorCSAqIE5vIHNlbnNlIHRvIGdyYWIgdGhlIGxvY2sgZm9yIHRoaXMgdGVzdCwgYnV0IHRlc3QgaXRzZWxmIGxvb2tzCisJICogc29tZXdoYXQgYm9ndXMuIFN1Z2dlc3Rpb25zIGZvciBiZXR0ZXIgcmVwbGFjZW1lbnQ/CisJICogSG8taHVtLi4uIEluIHByaW5jaXBsZSwgd2UgbWlnaHQgdHJlYXQgdGhhdCBhcyB1bW91bnQgKyBzd2l0Y2gKKwkgKiB0byByb290ZnMuIEdDIHdvdWxkIGV2ZW50dWFsbHkgdGFrZSBjYXJlIG9mIHRoZSBvbGQgdmZzbW91bnQuCisJICogQWN0dWFsbHkgaXQgbWFrZXMgc2Vuc2UsIGVzcGVjaWFsbHkgaWYgcm9vdGZzIHdvdWxkIGNvbnRhaW4gYQorCSAqIC9yZWJvb3QgLSBzdGF0aWMgYmluYXJ5IHRoYXQgd291bGQgY2xvc2UgYWxsIGRlc2NyaXB0b3JzIGFuZAorCSAqIGNhbGwgcmVib290KDkpLiBUaGVuIGluaXQoOCkgY291bGQgdW1vdW50IHJvb3QgYW5kIGV4ZWMgL3JlYm9vdC4KKwkgKi8KKwlpZiAobW50ID09IGN1cnJlbnQtPmZzLT5yb290bW50ICYmICEoZmxhZ3MgJiBNTlRfREVUQUNIKSkgeworCQkvKgorCQkgKiBTcGVjaWFsIGNhc2UgZm9yICJ1bm1vdW50aW5nIiByb290IC4uLgorCQkgKiB3ZSBqdXN0IHRyeSB0byByZW1vdW50IGl0IHJlYWRvbmx5LgorCQkgKi8KKwkJZG93bl93cml0ZSgmc2ItPnNfdW1vdW50KTsKKwkJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCQlsb2NrX2tlcm5lbCgpOworCQkJRFFVT1RfT0ZGKHNiKTsKKwkJCXJldHZhbCA9IGRvX3JlbW91bnRfc2Ioc2IsIE1TX1JET05MWSwgTlVMTCwgMCk7CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCX0KKwkJdXBfd3JpdGUoJnNiLT5zX3Vtb3VudCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJZG93bl93cml0ZSgmY3VycmVudC0+bmFtZXNwYWNlLT5zZW0pOworCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisKKwlpZiAoYXRvbWljX3JlYWQoJnNiLT5zX2FjdGl2ZSkgPT0gMSkgeworCQkvKiBsYXN0IGluc3RhbmNlIC0gdHJ5IHRvIGJlIHNtYXJ0ICovCisJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJbG9ja19rZXJuZWwoKTsKKwkJRFFVT1RfT0ZGKHNiKTsKKwkJYWNjdF9hdXRvX2Nsb3NlKHNiKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlzZWN1cml0eV9zYl91bW91bnRfY2xvc2UobW50KTsKKwkJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwl9CisJcmV0dmFsID0gLUVCVVNZOworCWlmIChhdG9taWNfcmVhZCgmbW50LT5tbnRfY291bnQpID09IDIgfHwgZmxhZ3MgJiBNTlRfREVUQUNIKSB7CisJCWlmICghbGlzdF9lbXB0eSgmbW50LT5tbnRfbGlzdCkpCisJCQl1bW91bnRfdHJlZShtbnQpOworCQlyZXR2YWwgPSAwOworCX0KKwlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CisJaWYgKHJldHZhbCkKKwkJc2VjdXJpdHlfc2JfdW1vdW50X2J1c3kobW50KTsKKwl1cF93cml0ZSgmY3VycmVudC0+bmFtZXNwYWNlLT5zZW0pOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBOb3cgdW1vdW50IGNhbiBoYW5kbGUgbW91bnQgcG9pbnRzIGFzIHdlbGwgYXMgYmxvY2sgZGV2aWNlcy4KKyAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBmaWxlc3lzdGVtcyB3aGljaCB1c2UgdW5uYW1lZCBibG9jayBkZXZpY2VzLgorICoKKyAqIFdlIG5vdyBzdXBwb3J0IGEgZmxhZyBmb3IgZm9yY2VkIHVubW91bnQgbGlrZSB0aGUgb3RoZXIgJ2JpZyBpcm9uJworICogdW5peGVzLiBPdXIgQVBJIGlzIGlkZW50aWNhbCB0byBPU0YvMSB0byBhdm9pZCBtYWtpbmcgYSBtZXNzIG9mIEFNRAorICovCisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfdW1vdW50KGNoYXIgX191c2VyICogbmFtZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IF9fdXNlcl93YWxrKG5hbWUsIExPT0tVUF9GT0xMT1csICZuZCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CisJcmV0dmFsID0gLUVJTlZBTDsKKwlpZiAobmQuZGVudHJ5ICE9IG5kLm1udC0+bW50X3Jvb3QpCisJCWdvdG8gZHB1dF9hbmRfb3V0OworCWlmICghY2hlY2tfbW50KG5kLm1udCkpCisJCWdvdG8gZHB1dF9hbmRfb3V0OworCisJcmV0dmFsID0gLUVQRVJNOworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJZ290byBkcHV0X2FuZF9vdXQ7CisKKwlyZXR2YWwgPSBkb191bW91bnQobmQubW50LCBmbGFncyk7CitkcHV0X2FuZF9vdXQ6CisJcGF0aF9yZWxlYXNlX29uX3Vtb3VudCgmbmQpOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKKyNpZmRlZiBfX0FSQ0hfV0FOVF9TWVNfT0xEVU1PVU5UCisKKy8qCisgKglUaGUgMi4wIGNvbXBhdGlibGUgdW1vdW50LiBObyBmbGFncy4gCisgKi8KKyAKK2FzbWxpbmthZ2UgbG9uZyBzeXNfb2xkdW1vdW50KGNoYXIgX191c2VyICogbmFtZSkKK3sKKwlyZXR1cm4gc3lzX3Vtb3VudChuYW1lLDApOworfQorCisjZW5kaWYKKworc3RhdGljIGludCBtb3VudF9pc19zYWZlKHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWlmIChjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVQRVJNOworI2lmZGVmIG5vdHlldAorCWlmIChTX0lTTE5LKG5kLT5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRVBFUk07CisJaWYgKG5kLT5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSAmIFNfSVNWVFgpIHsKKwkJaWYgKGN1cnJlbnQtPnVpZCAhPSBuZC0+ZGVudHJ5LT5kX2lub2RlLT5pX3VpZCkKKwkJCXJldHVybiAtRVBFUk07CisJfQorCWlmIChwZXJtaXNzaW9uKG5kLT5kZW50cnktPmRfaW5vZGUsIE1BWV9XUklURSwgbmQpKQorCQlyZXR1cm4gLUVQRVJNOworCXJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQKK2xpdmVzX2JlbG93X2luX3NhbWVfZnMoc3RydWN0IGRlbnRyeSAqZCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXdoaWxlICgxKSB7CisJCWlmIChkID09IGRlbnRyeSkKKwkJCXJldHVybiAxOworCQlpZiAoZCA9PSBOVUxMIHx8IGQgPT0gZC0+ZF9wYXJlbnQpCisJCQlyZXR1cm4gMDsKKwkJZCA9IGQtPmRfcGFyZW50OworCX0KK30KKworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqY29weV90cmVlKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IHZmc21vdW50ICpyZXMsICpwLCAqcSwgKnIsICpzOworCXN0cnVjdCBsaXN0X2hlYWQgKmg7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKworCXJlcyA9IHEgPSBjbG9uZV9tbnQobW50LCBkZW50cnkpOworCWlmICghcSkKKwkJZ290byBFbm9tZW07CisJcS0+bW50X21vdW50cG9pbnQgPSBtbnQtPm1udF9tb3VudHBvaW50OworCisJcCA9IG1udDsKKwlmb3IgKGggPSBtbnQtPm1udF9tb3VudHMubmV4dDsgaCAhPSAmbW50LT5tbnRfbW91bnRzOyBoID0gaC0+bmV4dCkgeworCQlyID0gbGlzdF9lbnRyeShoLCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9jaGlsZCk7CisJCWlmICghbGl2ZXNfYmVsb3dfaW5fc2FtZV9mcyhyLT5tbnRfbW91bnRwb2ludCwgZGVudHJ5KSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAocyA9IHI7IHM7IHMgPSBuZXh0X21udChzLCByKSkgeworCQkJd2hpbGUgKHAgIT0gcy0+bW50X3BhcmVudCkgeworCQkJCXAgPSBwLT5tbnRfcGFyZW50OworCQkJCXEgPSBxLT5tbnRfcGFyZW50OworCQkJfQorCQkJcCA9IHM7CisJCQluZC5tbnQgPSBxOworCQkJbmQuZGVudHJ5ID0gcC0+bW50X21vdW50cG9pbnQ7CisJCQlxID0gY2xvbmVfbW50KHAsIHAtPm1udF9yb290KTsKKwkJCWlmICghcSkKKwkJCQlnb3RvIEVub21lbTsKKwkJCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisJCQlsaXN0X2FkZF90YWlsKCZxLT5tbnRfbGlzdCwgJnJlcy0+bW50X2xpc3QpOworCQkJYXR0YWNoX21udChxLCAmbmQpOworCQkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCQl9CisJfQorCXJldHVybiByZXM7CisgRW5vbWVtOgorCWlmIChyZXMpIHsKKwkJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJdW1vdW50X3RyZWUocmVzKTsKKwkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBncmFmdF90cmVlKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlpbnQgZXJyOworCWlmIChtbnQtPm1udF9zYi0+c19mbGFncyAmIE1TX05PVVNFUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoU19JU0RJUihuZC0+ZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpICE9CisJICAgICAgU19JU0RJUihtbnQtPm1udF9yb290LT5kX2lub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gLUVOT1RESVI7CisKKwllcnIgPSAtRU5PRU5UOworCWRvd24oJm5kLT5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwlpZiAoSVNfREVBRERJUihuZC0+ZGVudHJ5LT5kX2lub2RlKSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJZXJyID0gc2VjdXJpdHlfc2JfY2hlY2tfc2IobW50LCBuZCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5sb2NrOworCisJZXJyID0gLUVOT0VOVDsKKwlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOworCWlmIChJU19ST09UKG5kLT5kZW50cnkpIHx8ICFkX3VuaGFzaGVkKG5kLT5kZW50cnkpKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKworCQlhdHRhY2hfbW50KG1udCwgbmQpOworCQlsaXN0X2FkZF90YWlsKCZoZWFkLCAmbW50LT5tbnRfbGlzdCk7CisJCWxpc3Rfc3BsaWNlKCZoZWFkLCBjdXJyZW50LT5uYW1lc3BhY2UtPmxpc3QucHJldik7CisJCW1udGdldChtbnQpOworCQllcnIgPSAwOworCX0KKwlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CitvdXRfdW5sb2NrOgorCXVwKCZuZC0+ZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJaWYgKCFlcnIpCisJCXNlY3VyaXR5X3NiX3Bvc3RfYWRkbW91bnQobW50LCBuZCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIGRvIGxvb3BiYWNrIG1vdW50LgorICovCitzdGF0aWMgaW50IGRvX2xvb3BiYWNrKHN0cnVjdCBuYW1laWRhdGEgKm5kLCBjaGFyICpvbGRfbmFtZSwgaW50IHJlY3Vyc2UpCit7CisJc3RydWN0IG5hbWVpZGF0YSBvbGRfbmQ7CisJc3RydWN0IHZmc21vdW50ICptbnQgPSBOVUxMOworCWludCBlcnIgPSBtb3VudF9pc19zYWZlKG5kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWlmICghb2xkX25hbWUgfHwgISpvbGRfbmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZXJyID0gcGF0aF9sb29rdXAob2xkX25hbWUsIExPT0tVUF9GT0xMT1csICZvbGRfbmQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlkb3duX3dyaXRlKCZjdXJyZW50LT5uYW1lc3BhY2UtPnNlbSk7CisJZXJyID0gLUVJTlZBTDsKKwlpZiAoY2hlY2tfbW50KG5kLT5tbnQpICYmICghcmVjdXJzZSB8fCBjaGVja19tbnQob2xkX25kLm1udCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWlmIChyZWN1cnNlKQorCQkJbW50ID0gY29weV90cmVlKG9sZF9uZC5tbnQsIG9sZF9uZC5kZW50cnkpOworCQllbHNlCisJCQltbnQgPSBjbG9uZV9tbnQob2xkX25kLm1udCwgb2xkX25kLmRlbnRyeSk7CisJfQorCisJaWYgKG1udCkgeworCQkvKiBzdG9wIGJpbmQgbW91bnRzIGZyb20gZXhwaXJpbmcgKi8KKwkJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfZnNsaW5rKTsKKwkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCisJCWVyciA9IGdyYWZ0X3RyZWUobW50LCBuZCk7CisJCWlmIChlcnIpIHsKKwkJCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisJCQl1bW91bnRfdHJlZShtbnQpOworCQkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCQl9IGVsc2UKKwkJCW1udHB1dChtbnQpOworCX0KKworCXVwX3dyaXRlKCZjdXJyZW50LT5uYW1lc3BhY2UtPnNlbSk7CisJcGF0aF9yZWxlYXNlKCZvbGRfbmQpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBjaGFuZ2UgZmlsZXN5c3RlbSBmbGFncy4gZGlyIHNob3VsZCBiZSBhIHBoeXNpY2FsIHJvb3Qgb2YgZmlsZXN5c3RlbS4KKyAqIElmIHlvdSd2ZSBtb3VudGVkIGEgbm9uLXJvb3QgZGlyZWN0b3J5IHNvbWV3aGVyZSBhbmQgd2FudCB0byBkbyByZW1vdW50CisgKiBvbiBpdCAtIHRvdWdoIGx1Y2suCisgKi8KKworc3RhdGljIGludCBkb19yZW1vdW50KHN0cnVjdCBuYW1laWRhdGEgKm5kLCBpbnQgZmxhZ3MsIGludCBtbnRfZmxhZ3MsCisJCSAgICAgIHZvaWQgKmRhdGEpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiA9IG5kLT5tbnQtPm1udF9zYjsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmICghY2hlY2tfbW50KG5kLT5tbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChuZC0+ZGVudHJ5ICE9IG5kLT5tbnQtPm1udF9yb290KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd25fd3JpdGUoJnNiLT5zX3Vtb3VudCk7CisJZXJyID0gZG9fcmVtb3VudF9zYihzYiwgZmxhZ3MsIGRhdGEsIDApOworCWlmICghZXJyKQorCQluZC0+bW50LT5tbnRfZmxhZ3M9bW50X2ZsYWdzOworCXVwX3dyaXRlKCZzYi0+c191bW91bnQpOworCWlmICghZXJyKQorCQlzZWN1cml0eV9zYl9wb3N0X3JlbW91bnQobmQtPm1udCwgZmxhZ3MsIGRhdGEpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZG9fbW92ZV9tb3VudChzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgY2hhciAqb2xkX25hbWUpCit7CisJc3RydWN0IG5hbWVpZGF0YSBvbGRfbmQsIHBhcmVudF9uZDsKKwlzdHJ1Y3QgdmZzbW91bnQgKnA7CisJaW50IGVyciA9IDA7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCWlmICghb2xkX25hbWUgfHwgISpvbGRfbmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZXJyID0gcGF0aF9sb29rdXAob2xkX25hbWUsIExPT0tVUF9GT0xMT1csICZvbGRfbmQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlkb3duX3dyaXRlKCZjdXJyZW50LT5uYW1lc3BhY2UtPnNlbSk7CisJd2hpbGUoZF9tb3VudHBvaW50KG5kLT5kZW50cnkpICYmIGZvbGxvd19kb3duKCZuZC0+bW50LCAmbmQtPmRlbnRyeSkpCisJCTsKKwllcnIgPSAtRUlOVkFMOworCWlmICghY2hlY2tfbW50KG5kLT5tbnQpIHx8ICFjaGVja19tbnQob2xkX25kLm1udCkpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVOT0VOVDsKKwlkb3duKCZuZC0+ZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJaWYgKElTX0RFQURESVIobmQtPmRlbnRyeS0+ZF9pbm9kZSkpCisJCWdvdG8gb3V0MTsKKworCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisJaWYgKCFJU19ST09UKG5kLT5kZW50cnkpICYmIGRfdW5oYXNoZWQobmQtPmRlbnRyeSkpCisJCWdvdG8gb3V0MjsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKG9sZF9uZC5kZW50cnkgIT0gb2xkX25kLm1udC0+bW50X3Jvb3QpCisJCWdvdG8gb3V0MjsKKworCWlmIChvbGRfbmQubW50ID09IG9sZF9uZC5tbnQtPm1udF9wYXJlbnQpCisJCWdvdG8gb3V0MjsKKworCWlmIChTX0lTRElSKG5kLT5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgIT0KKwkgICAgICBTX0lTRElSKG9sZF9uZC5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisJCWdvdG8gb3V0MjsKKworCWVyciA9IC1FTE9PUDsKKwlmb3IgKHAgPSBuZC0+bW50OyBwLT5tbnRfcGFyZW50IT1wOyBwID0gcC0+bW50X3BhcmVudCkKKwkJaWYgKHAgPT0gb2xkX25kLm1udCkKKwkJCWdvdG8gb3V0MjsKKwllcnIgPSAwOworCisJZGV0YWNoX21udChvbGRfbmQubW50LCAmcGFyZW50X25kKTsKKwlhdHRhY2hfbW50KG9sZF9uZC5tbnQsIG5kKTsKKworCS8qIGlmIHRoZSBtb3VudCBpcyBtb3ZlZCwgaXQgc2hvdWxkIG5vIGxvbmdlciBiZSBleHBpcmUKKwkgKiBhdXRvbWF0aWNhbGx5ICovCisJbGlzdF9kZWxfaW5pdCgmb2xkX25kLm1udC0+bW50X2ZzbGluayk7CitvdXQyOgorCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKK291dDE6CisJdXAoJm5kLT5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKK291dDoKKwl1cF93cml0ZSgmY3VycmVudC0+bmFtZXNwYWNlLT5zZW0pOworCWlmICghZXJyKQorCQlwYXRoX3JlbGVhc2UoJnBhcmVudF9uZCk7CisJcGF0aF9yZWxlYXNlKCZvbGRfbmQpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBjcmVhdGUgYSBuZXcgbW91bnQgZm9yIHVzZXJzcGFjZSBhbmQgcmVxdWVzdCBpdCB0byBiZSBhZGRlZCBpbnRvIHRoZQorICogbmFtZXNwYWNlJ3MgdHJlZQorICovCitzdGF0aWMgaW50IGRvX25ld19tb3VudChzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgY2hhciAqdHlwZSwgaW50IGZsYWdzLAorCQkJaW50IG1udF9mbGFncywgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKKworCWlmICghdHlwZSB8fCAhbWVtY2hyKHR5cGUsIDAsIFBBR0VfU0laRSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogd2UgbmVlZCBjYXBhYmlsaXRpZXMuLi4gKi8KKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwltbnQgPSBkb19rZXJuX21vdW50KHR5cGUsIGZsYWdzLCBuYW1lLCBkYXRhKTsKKwlpZiAoSVNfRVJSKG1udCkpCisJCXJldHVybiBQVFJfRVJSKG1udCk7CisKKwlyZXR1cm4gZG9fYWRkX21vdW50KG1udCwgbmQsIG1udF9mbGFncywgTlVMTCk7Cit9CisKKy8qCisgKiBhZGQgYSBtb3VudCBpbnRvIGEgbmFtZXNwYWNlJ3MgbW91bnQgdHJlZQorICogLSBwcm92aWRlIHRoZSBvcHRpb24gb2YgYWRkaW5nIHRoZSBuZXcgbW91bnQgdG8gYW4gZXhwaXJhdGlvbiBsaXN0CisgKi8KK2ludCBkb19hZGRfbW91bnQoc3RydWN0IHZmc21vdW50ICpuZXdtbnQsIHN0cnVjdCBuYW1laWRhdGEgKm5kLAorCQkgaW50IG1udF9mbGFncywgc3RydWN0IGxpc3RfaGVhZCAqZnNsaXN0KQoreworCWludCBlcnI7CisKKwlkb3duX3dyaXRlKCZjdXJyZW50LT5uYW1lc3BhY2UtPnNlbSk7CisJLyogU29tZXRoaW5nIHdhcyBtb3VudGVkIGhlcmUgd2hpbGUgd2Ugc2xlcHQgKi8KKwl3aGlsZShkX21vdW50cG9pbnQobmQtPmRlbnRyeSkgJiYgZm9sbG93X2Rvd24oJm5kLT5tbnQsICZuZC0+ZGVudHJ5KSkKKwkJOworCWVyciA9IC1FSU5WQUw7CisJaWYgKCFjaGVja19tbnQobmQtPm1udCkpCisJCWdvdG8gdW5sb2NrOworCisJLyogUmVmdXNlIHRoZSBzYW1lIGZpbGVzeXN0ZW0gb24gdGhlIHNhbWUgbW91bnQgcG9pbnQgKi8KKwllcnIgPSAtRUJVU1k7CisJaWYgKG5kLT5tbnQtPm1udF9zYiA9PSBuZXdtbnQtPm1udF9zYiAmJgorCSAgICBuZC0+bW50LT5tbnRfcm9vdCA9PSBuZC0+ZGVudHJ5KQorCQlnb3RvIHVubG9jazsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKFNfSVNMTksobmV3bW50LT5tbnRfcm9vdC0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJZ290byB1bmxvY2s7CisKKwluZXdtbnQtPm1udF9mbGFncyA9IG1udF9mbGFnczsKKwllcnIgPSBncmFmdF90cmVlKG5ld21udCwgbmQpOworCisJaWYgKGVyciA9PSAwICYmIGZzbGlzdCkgeworCQkvKiBhZGQgdG8gdGhlIHNwZWNpZmllZCBleHBpcmF0aW9uIGxpc3QgKi8KKwkJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmbmV3bW50LT5tbnRfZnNsaW5rLCBmc2xpc3QpOworCQlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CisJfQorCit1bmxvY2s6CisJdXBfd3JpdGUoJmN1cnJlbnQtPm5hbWVzcGFjZS0+c2VtKTsKKwltbnRwdXQobmV3bW50KTsKKwlyZXR1cm4gZXJyOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChkb19hZGRfbW91bnQpOworCisvKgorICogcHJvY2VzcyBhIGxpc3Qgb2YgZXhwaXJhYmxlIG1vdW50cG9pbnRzIHdpdGggdGhlIGludGVudCBvZiBkaXNjYXJkaW5nIGFueQorICogbW91bnRwb2ludHMgdGhhdCBhcmVuJ3QgaW4gdXNlIGFuZCBoYXZlbid0IGJlZW4gdG91Y2hlZCBzaW5jZSBsYXN0IHdlIGNhbWUKKyAqIGhlcmUKKyAqLwordm9pZCBtYXJrX21vdW50c19mb3JfZXhwaXJ5KHN0cnVjdCBsaXN0X2hlYWQgKm1vdW50cykKK3sKKwlzdHJ1Y3QgbmFtZXNwYWNlICpuYW1lc3BhY2U7CisJc3RydWN0IHZmc21vdW50ICptbnQsICpuZXh0OworCUxJU1RfSEVBRChncmF2ZXlhcmQpOworCisJaWYgKGxpc3RfZW1wdHkobW91bnRzKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKworCS8qIGV4dHJhY3QgZnJvbSB0aGUgZXhwaXJhdGlvbiBsaXN0IGV2ZXJ5IHZmc21vdW50IHRoYXQgbWF0Y2hlcyB0aGUKKwkgKiBmb2xsb3dpbmcgY3JpdGVyaWE6CisJICogLSBvbmx5IHJlZmVyZW5jZWQgYnkgaXRzIHBhcmVudCB2ZnNtb3VudAorCSAqIC0gc3RpbGwgbWFya2VkIGZvciBleHBpcnkgKG1hcmtlZCBvbiB0aGUgbGFzdCBjYWxsIGhlcmU7IG1hcmtzIGFyZQorCSAqICAgY2xlYXJlZCBieSBtbnRwdXQoKSkKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobW50LCBuZXh0LCBtb3VudHMsIG1udF9mc2xpbmspIHsKKwkJaWYgKCF4Y2hnKCZtbnQtPm1udF9leHBpcnlfbWFyaywgMSkgfHwKKwkJICAgIGF0b21pY19yZWFkKCZtbnQtPm1udF9jb3VudCkgIT0gMSkKKwkJCWNvbnRpbnVlOworCisJCW1udGdldChtbnQpOworCQlsaXN0X21vdmUoJm1udC0+bW50X2ZzbGluaywgJmdyYXZleWFyZCk7CisJfQorCisJLyoKKwkgKiBnbyB0aHJvdWdoIHRoZSB2ZnNtb3VudHMgd2UndmUganVzdCBjb25zaWduZWQgdG8gdGhlIGdyYXZleWFyZCB0bworCSAqIC0gY2hlY2sgdGhhdCB0aGV5J3JlIHN0aWxsIGRlYWQKKwkgKiAtIGRlbGV0ZSB0aGUgdmZzbW91bnQgZnJvbSB0aGUgYXBwcm9wcmlhdGUgbmFtZXNwYWNlIHVuZGVyIGxvY2sKKwkgKiAtIGRpc3Bvc2Ugb2YgdGhlIGNvcnBzZQorCSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmZ3JhdmV5YXJkKSkgeworCQltbnQgPSBsaXN0X2VudHJ5KGdyYXZleWFyZC5uZXh0LCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9mc2xpbmspOworCQlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9mc2xpbmspOworCisJCS8qIGRvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBuYW1lc3BhY2UgaXMgZGVhZCAtIGFsbCB0aGUKKwkJICogdmZzbW91bnRzIGZyb20gaXQgYXJlIGdvaW5nIGF3YXkgYW55d2F5ICovCisJCW5hbWVzcGFjZSA9IG1udC0+bW50X25hbWVzcGFjZTsKKwkJaWYgKCFuYW1lc3BhY2UgfHwgYXRvbWljX3JlYWQoJm5hbWVzcGFjZS0+Y291bnQpIDw9IDApCisJCQljb250aW51ZTsKKwkJZ2V0X25hbWVzcGFjZShuYW1lc3BhY2UpOworCisJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJZG93bl93cml0ZSgmbmFtZXNwYWNlLT5zZW0pOworCQlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOworCisJCS8qIGNoZWNrIHRoYXQgaXQgaXMgc3RpbGwgZGVhZDogdGhlIGNvdW50IHNob3VsZCBub3cgYmUgMiAtIGFzCisJCSAqIGNvbnRyaWJ1dGVkIGJ5IHRoZSB2ZnNtb3VudCBwYXJlbnQgYW5kIHRoZSBtbnRnZXQgYWJvdmUgKi8KKwkJaWYgKGF0b21pY19yZWFkKCZtbnQtPm1udF9jb3VudCkgPT0gMikgeworCQkJc3RydWN0IHZmc21vdW50ICp4ZG1udDsKKwkJCXN0cnVjdCBkZW50cnkgKnhkZW50cnk7CisKKwkJCS8qIGRlbGV0ZSBmcm9tIHRoZSBuYW1lc3BhY2UgKi8KKwkJCWxpc3RfZGVsX2luaXQoJm1udC0+bW50X2xpc3QpOworCQkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfY2hpbGQpOworCQkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfaGFzaCk7CisJCQltbnQtPm1udF9tb3VudHBvaW50LT5kX21vdW50ZWQtLTsKKworCQkJeGRlbnRyeSA9IG1udC0+bW50X21vdW50cG9pbnQ7CisJCQltbnQtPm1udF9tb3VudHBvaW50ID0gbW50LT5tbnRfcm9vdDsKKwkJCXhkbW50ID0gbW50LT5tbnRfcGFyZW50OworCQkJbW50LT5tbnRfcGFyZW50ID0gbW50OworCisJCQlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CisKKwkJCW1udHB1dCh4ZG1udCk7CisJCQlkcHV0KHhkZW50cnkpOworCisJCQkvKiBub3cgbGF5IGl0IHRvIHJlc3QgaWYgdGhpcyB3YXMgdGhlIGxhc3QgcmVmIG9uIHRoZQorCQkJICogc3VwZXJibG9jayAqLworCQkJaWYgKGF0b21pY19yZWFkKCZtbnQtPm1udF9zYi0+c19hY3RpdmUpID09IDEpIHsKKwkJCQkvKiBsYXN0IGluc3RhbmNlIC0gdHJ5IHRvIGJlIHNtYXJ0ICovCisJCQkJbG9ja19rZXJuZWwoKTsKKwkJCQlEUVVPVF9PRkYobW50LT5tbnRfc2IpOworCQkJCWFjY3RfYXV0b19jbG9zZShtbnQtPm1udF9zYik7CisJCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJfQorCisJCQltbnRwdXQobW50KTsKKwkJfSBlbHNlIHsKKwkJCS8qIHNvbWVvbmUgYnJvdWdodCBpdCBiYWNrIHRvIGxpZmUgd2hpbHN0IHdlIGRpZG4ndAorCQkJICogaGF2ZSBhbnkgbG9ja3MgaGVsZCBzbyByZXR1cm4gaXQgdG8gdGhlIGV4cGlyYXRpb24KKwkJCSAqIGxpc3QgKi8KKwkJCWxpc3RfYWRkX3RhaWwoJm1udC0+bW50X2ZzbGluaywgbW91bnRzKTsKKwkJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJfQorCisJCXVwX3dyaXRlKCZuYW1lc3BhY2UtPnNlbSk7CisKKwkJbW50cHV0KG1udCk7CisJCXB1dF9uYW1lc3BhY2UobmFtZXNwYWNlKTsKKworCQlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOworCX0KKworCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwobWFya19tb3VudHNfZm9yX2V4cGlyeSk7CisKKy8qCisgKiBTb21lIGNvcHlfZnJvbV91c2VyKCkgaW1wbGVtZW50YXRpb25zIGRvIG5vdCByZXR1cm4gdGhlIGV4YWN0IG51bWJlciBvZgorICogYnl0ZXMgcmVtYWluaW5nIHRvIGNvcHkgb24gYSBmYXVsdC4gIEJ1dCBjb3B5X21vdW50X29wdGlvbnMoKSByZXF1aXJlcyB0aGF0LgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gZGlmZmVycyBmcm9tIGNvcHlfZnJvbV91c2VyKCkgaW4gdGhhdCBpdCB3aWxsIG9vcHMKKyAqIG9uIGJhZCB2YWx1ZXMgb2YgYHRvJywgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGEgc2hvcnQgY29weS4KKyAqLworc3RhdGljIGxvbmcKK2V4YWN0X2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCWNoYXIgKnQgPSB0bzsKKwljb25zdCBjaGFyIF9fdXNlciAqZiA9IGZyb207CisJY2hhciBjOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKQorCQlyZXR1cm4gbjsKKworCXdoaWxlIChuKSB7CisJCWlmIChfX2dldF91c2VyKGMsIGYpKSB7CisJCQltZW1zZXQodCwgMCwgbik7CisJCQlicmVhazsKKwkJfQorCQkqdCsrID0gYzsKKwkJZisrOworCQluLS07CisJfQorCXJldHVybiBuOworfQorCitpbnQgY29weV9tb3VudF9vcHRpb25zKGNvbnN0IHZvaWQgX191c2VyICpkYXRhLCB1bnNpZ25lZCBsb25nICp3aGVyZSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CisJdW5zaWduZWQgbG9uZyBzaXplOworCQorCSp3aGVyZSA9IDA7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gMDsKKworCWlmICghKHBhZ2UgPSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFdlIG9ubHkgY2FyZSB0aGF0ICpzb21lKiBkYXRhIGF0IHRoZSBhZGRyZXNzIHRoZSB1c2VyCisJICogZ2F2ZSB1cyBpcyB2YWxpZC4gIEp1c3QgaW4gY2FzZSwgd2UnbGwgemVybworCSAqIHRoZSByZW1haW5kZXIgb2YgdGhlIHBhZ2UuCisJICovCisJLyogY29weV9mcm9tX3VzZXIgY2Fubm90IGNyb3NzIFRBU0tfU0laRSAhICovCisJc2l6ZSA9IFRBU0tfU0laRSAtICh1bnNpZ25lZCBsb25nKWRhdGE7CisJaWYgKHNpemUgPiBQQUdFX1NJWkUpCisJCXNpemUgPSBQQUdFX1NJWkU7CisKKwlpID0gc2l6ZSAtIGV4YWN0X2NvcHlfZnJvbV91c2VyKCh2b2lkICopcGFnZSwgZGF0YSwgc2l6ZSk7CisJaWYgKCFpKSB7CisJCWZyZWVfcGFnZShwYWdlKTsgCisJCXJldHVybiAtRUZBVUxUOworCX0KKwlpZiAoaSAhPSBQQUdFX1NJWkUpCisJCW1lbXNldCgoY2hhciAqKXBhZ2UgKyBpLCAwLCBQQUdFX1NJWkUgLSBpKTsKKwkqd2hlcmUgPSBwYWdlOworCXJldHVybiAwOworfQorCisvKgorICogRmxhZ3MgaXMgYSAzMi1iaXQgdmFsdWUgdGhhdCBhbGxvd3MgdXAgdG8gMzEgbm9uLWZzIGRlcGVuZGVudCBmbGFncyB0bworICogYmUgZ2l2ZW4gdG8gdGhlIG1vdW50KCkgY2FsbCAoaWU6IHJlYWQtb25seSwgbm8tZGV2LCBuby1zdWlkIGV0YykuCisgKgorICogZGF0YSBpcyBhICh2b2lkICopIHRoYXQgY2FuIHBvaW50IHRvIGFueSBzdHJ1Y3R1cmUgdXAgdG8KKyAqIFBBR0VfU0laRS0xIGJ5dGVzLCB3aGljaCBjYW4gY29udGFpbiBhcmJpdHJhcnkgZnMtZGVwZW5kZW50CisgKiBpbmZvcm1hdGlvbiAob3IgYmUgTlVMTCkuCisgKgorICogUHJlLTAuOTcgdmVyc2lvbnMgb2YgbW91bnQoKSBkaWRuJ3QgaGF2ZSBhIGZsYWdzIHdvcmQuCisgKiBXaGVuIHRoZSBmbGFncyB3b3JkIHdhcyBpbnRyb2R1Y2VkIGl0cyB0b3AgaGFsZiB3YXMgcmVxdWlyZWQKKyAqIHRvIGhhdmUgdGhlIG1hZ2ljIHZhbHVlIDB4QzBFRCwgYW5kIHRoaXMgcmVtYWluZWQgc28gdW50aWwgMi40LjAtdGVzdDkuCisgKiBUaGVyZWZvcmUsIGlmIHRoaXMgbWFnaWMgbnVtYmVyIGlzIHByZXNlbnQsIGl0IGNhcnJpZXMgbm8gaW5mb3JtYXRpb24KKyAqIGFuZCBtdXN0IGJlIGRpc2NhcmRlZC4KKyAqLworbG9uZyBkb19tb3VudChjaGFyICogZGV2X25hbWUsIGNoYXIgKiBkaXJfbmFtZSwgY2hhciAqdHlwZV9wYWdlLAorCQkgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZvaWQgKmRhdGFfcGFnZSkKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCByZXR2YWwgPSAwOworCWludCBtbnRfZmxhZ3MgPSAwOworCisJLyogRGlzY2FyZCBtYWdpYyAqLworCWlmICgoZmxhZ3MgJiBNU19NR0NfTVNLKSA9PSBNU19NR0NfVkFMKQorCQlmbGFncyAmPSB+TVNfTUdDX01TSzsKKworCS8qIEJhc2ljIHNhbml0eSBjaGVja3MgKi8KKworCWlmICghZGlyX25hbWUgfHwgISpkaXJfbmFtZSB8fCAhbWVtY2hyKGRpcl9uYW1lLCAwLCBQQUdFX1NJWkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZGV2X25hbWUgJiYgIW1lbWNocihkZXZfbmFtZSwgMCwgUEFHRV9TSVpFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGF0YV9wYWdlKQorCQkoKGNoYXIgKilkYXRhX3BhZ2UpW1BBR0VfU0laRSAtIDFdID0gMDsKKworCS8qIFNlcGFyYXRlIHRoZSBwZXItbW91bnRwb2ludCBmbGFncyAqLworCWlmIChmbGFncyAmIE1TX05PU1VJRCkKKwkJbW50X2ZsYWdzIHw9IE1OVF9OT1NVSUQ7CisJaWYgKGZsYWdzICYgTVNfTk9ERVYpCisJCW1udF9mbGFncyB8PSBNTlRfTk9ERVY7CisJaWYgKGZsYWdzICYgTVNfTk9FWEVDKQorCQltbnRfZmxhZ3MgfD0gTU5UX05PRVhFQzsKKwlmbGFncyAmPSB+KE1TX05PU1VJRHxNU19OT0VYRUN8TVNfTk9ERVZ8TVNfQUNUSVZFKTsKKworCS8qIC4uLiBhbmQgZ2V0IHRoZSBtb3VudHBvaW50ICovCisJcmV0dmFsID0gcGF0aF9sb29rdXAoZGlyX25hbWUsIExPT0tVUF9GT0xMT1csICZuZCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IHNlY3VyaXR5X3NiX21vdW50KGRldl9uYW1lLCAmbmQsIHR5cGVfcGFnZSwgZmxhZ3MsIGRhdGFfcGFnZSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBkcHV0X291dDsKKworCWlmIChmbGFncyAmIE1TX1JFTU9VTlQpCisJCXJldHZhbCA9IGRvX3JlbW91bnQoJm5kLCBmbGFncyAmIH5NU19SRU1PVU5ULCBtbnRfZmxhZ3MsCisJCQkJICAgIGRhdGFfcGFnZSk7CisJZWxzZSBpZiAoZmxhZ3MgJiBNU19CSU5EKQorCQlyZXR2YWwgPSBkb19sb29wYmFjaygmbmQsIGRldl9uYW1lLCBmbGFncyAmIE1TX1JFQyk7CisJZWxzZSBpZiAoZmxhZ3MgJiBNU19NT1ZFKQorCQlyZXR2YWwgPSBkb19tb3ZlX21vdW50KCZuZCwgZGV2X25hbWUpOworCWVsc2UKKwkJcmV0dmFsID0gZG9fbmV3X21vdW50KCZuZCwgdHlwZV9wYWdlLCBmbGFncywgbW50X2ZsYWdzLAorCQkJCSAgICAgIGRldl9uYW1lLCBkYXRhX3BhZ2UpOworZHB1dF9vdXQ6CisJcGF0aF9yZWxlYXNlKCZuZCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IGNvcHlfbmFtZXNwYWNlKGludCBmbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJc3RydWN0IG5hbWVzcGFjZSAqbmFtZXNwYWNlID0gdHNrLT5uYW1lc3BhY2U7CisJc3RydWN0IG5hbWVzcGFjZSAqbmV3X25zOworCXN0cnVjdCB2ZnNtb3VudCAqcm9vdG1udCA9IE5VTEwsICpwd2RtbnQgPSBOVUxMLCAqYWx0cm9vdG1udCA9IE5VTEw7CisJc3RydWN0IGZzX3N0cnVjdCAqZnMgPSB0c2stPmZzOworCXN0cnVjdCB2ZnNtb3VudCAqcCwgKnE7CisKKwlpZiAoIW5hbWVzcGFjZSkKKwkJcmV0dXJuIDA7CisKKwlnZXRfbmFtZXNwYWNlKG5hbWVzcGFjZSk7CisKKwlpZiAoIShmbGFncyAmIENMT05FX05FV05TKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJcHV0X25hbWVzcGFjZShuYW1lc3BhY2UpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCW5ld19ucyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBuYW1lc3BhY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld19ucykKKwkJZ290byBvdXQ7CisKKwlhdG9taWNfc2V0KCZuZXdfbnMtPmNvdW50LCAxKTsKKwlpbml0X3J3c2VtKCZuZXdfbnMtPnNlbSk7CisJSU5JVF9MSVNUX0hFQUQoJm5ld19ucy0+bGlzdCk7CisKKwlkb3duX3dyaXRlKCZ0c2stPm5hbWVzcGFjZS0+c2VtKTsKKwkvKiBGaXJzdCBwYXNzOiBjb3B5IHRoZSB0cmVlIHRvcG9sb2d5ICovCisJbmV3X25zLT5yb290ID0gY29weV90cmVlKG5hbWVzcGFjZS0+cm9vdCwgbmFtZXNwYWNlLT5yb290LT5tbnRfcm9vdCk7CisJaWYgKCFuZXdfbnMtPnJvb3QpIHsKKwkJdXBfd3JpdGUoJnRzay0+bmFtZXNwYWNlLT5zZW0pOworCQlrZnJlZShuZXdfbnMpOworCQlnb3RvIG91dDsKKwl9CisJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZuZXdfbnMtPmxpc3QsICZuZXdfbnMtPnJvb3QtPm1udF9saXN0KTsKKwlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CisKKwkvKgorCSAqIFNlY29uZCBwYXNzOiBzd2l0Y2ggdGhlIHRzay0+ZnMtPiogZWxlbWVudHMgYW5kIG1hcmsgbmV3IHZmc21vdW50cworCSAqIGFzIGJlbG9uZ2luZyB0byBuZXcgbmFtZXNwYWNlLiAgV2UgaGF2ZSBhbHJlYWR5IGFjcXVpcmVkIGEgcHJpdmF0ZQorCSAqIGZzX3N0cnVjdCwgc28gdHNrLT5mcy0+bG9jayBpcyBub3QgbmVlZGVkLgorCSAqLworCXAgPSBuYW1lc3BhY2UtPnJvb3Q7CisJcSA9IG5ld19ucy0+cm9vdDsKKwl3aGlsZSAocCkgeworCQlxLT5tbnRfbmFtZXNwYWNlID0gbmV3X25zOworCQlpZiAoZnMpIHsKKwkJCWlmIChwID09IGZzLT5yb290bW50KSB7CisJCQkJcm9vdG1udCA9IHA7CisJCQkJZnMtPnJvb3RtbnQgPSBtbnRnZXQocSk7CisJCQl9CisJCQlpZiAocCA9PSBmcy0+cHdkbW50KSB7CisJCQkJcHdkbW50ID0gcDsKKwkJCQlmcy0+cHdkbW50ID0gbW50Z2V0KHEpOworCQkJfQorCQkJaWYgKHAgPT0gZnMtPmFsdHJvb3RtbnQpIHsKKwkJCQlhbHRyb290bW50ID0gcDsKKwkJCQlmcy0+YWx0cm9vdG1udCA9IG1udGdldChxKTsKKwkJCX0KKwkJfQorCQlwID0gbmV4dF9tbnQocCwgbmFtZXNwYWNlLT5yb290KTsKKwkJcSA9IG5leHRfbW50KHEsIG5ld19ucy0+cm9vdCk7CisJfQorCXVwX3dyaXRlKCZ0c2stPm5hbWVzcGFjZS0+c2VtKTsKKworCXRzay0+bmFtZXNwYWNlID0gbmV3X25zOworCisJaWYgKHJvb3RtbnQpCisJCW1udHB1dChyb290bW50KTsKKwlpZiAocHdkbW50KQorCQltbnRwdXQocHdkbW50KTsKKwlpZiAoYWx0cm9vdG1udCkKKwkJbW50cHV0KGFsdHJvb3RtbnQpOworCisJcHV0X25hbWVzcGFjZShuYW1lc3BhY2UpOworCXJldHVybiAwOworCitvdXQ6CisJcHV0X25hbWVzcGFjZShuYW1lc3BhY2UpOworCXJldHVybiAtRU5PTUVNOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX21vdW50KGNoYXIgX191c2VyICogZGV2X25hbWUsIGNoYXIgX191c2VyICogZGlyX25hbWUsCisJCQkgIGNoYXIgX191c2VyICogdHlwZSwgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJCSAgdm9pZCBfX3VzZXIgKiBkYXRhKQoreworCWludCByZXR2YWw7CisJdW5zaWduZWQgbG9uZyBkYXRhX3BhZ2U7CisJdW5zaWduZWQgbG9uZyB0eXBlX3BhZ2U7CisJdW5zaWduZWQgbG9uZyBkZXZfcGFnZTsKKwljaGFyICpkaXJfcGFnZTsKKworCXJldHZhbCA9IGNvcHlfbW91bnRfb3B0aW9ucyAodHlwZSwgJnR5cGVfcGFnZSk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkaXJfcGFnZSA9IGdldG5hbWUoZGlyX25hbWUpOworCXJldHZhbCA9IFBUUl9FUlIoZGlyX3BhZ2UpOworCWlmIChJU19FUlIoZGlyX3BhZ2UpKQorCQlnb3RvIG91dDE7CisKKwlyZXR2YWwgPSBjb3B5X21vdW50X29wdGlvbnMgKGRldl9uYW1lLCAmZGV2X3BhZ2UpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIG91dDI7CisKKwlyZXR2YWwgPSBjb3B5X21vdW50X29wdGlvbnMgKGRhdGEsICZkYXRhX3BhZ2UpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIG91dDM7CisKKwlsb2NrX2tlcm5lbCgpOworCXJldHZhbCA9IGRvX21vdW50KChjaGFyKilkZXZfcGFnZSwgZGlyX3BhZ2UsIChjaGFyKil0eXBlX3BhZ2UsCisJCQkgIGZsYWdzLCAodm9pZCopZGF0YV9wYWdlKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJZnJlZV9wYWdlKGRhdGFfcGFnZSk7CisKK291dDM6CisJZnJlZV9wYWdlKGRldl9wYWdlKTsKK291dDI6CisJcHV0bmFtZShkaXJfcGFnZSk7CitvdXQxOgorCWZyZWVfcGFnZSh0eXBlX3BhZ2UpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBSZXBsYWNlIHRoZSBmcy0+e3Jvb3RtbnQscm9vdH0gd2l0aCB7bW50LGRlbnRyeX0uIFB1dCB0aGUgb2xkIHZhbHVlcy4KKyAqIEl0IGNhbiBibG9jay4gUmVxdWlyZXMgdGhlIGJpZyBsb2NrIGhlbGQuCisgKi8KK3ZvaWQgc2V0X2ZzX3Jvb3Qoc3RydWN0IGZzX3N0cnVjdCAqZnMsIHN0cnVjdCB2ZnNtb3VudCAqbW50LAorCQkgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBkZW50cnkgKm9sZF9yb290OworCXN0cnVjdCB2ZnNtb3VudCAqb2xkX3Jvb3RtbnQ7CisJd3JpdGVfbG9jaygmZnMtPmxvY2spOworCW9sZF9yb290ID0gZnMtPnJvb3Q7CisJb2xkX3Jvb3RtbnQgPSBmcy0+cm9vdG1udDsKKwlmcy0+cm9vdG1udCA9IG1udGdldChtbnQpOworCWZzLT5yb290ID0gZGdldChkZW50cnkpOworCXdyaXRlX3VubG9jaygmZnMtPmxvY2spOworCWlmIChvbGRfcm9vdCkgeworCQlkcHV0KG9sZF9yb290KTsKKwkJbW50cHV0KG9sZF9yb290bW50KTsKKwl9Cit9CisKKy8qCisgKiBSZXBsYWNlIHRoZSBmcy0+e3B3ZG1udCxwd2R9IHdpdGgge21udCxkZW50cnl9LiBQdXQgdGhlIG9sZCB2YWx1ZXMuCisgKiBJdCBjYW4gYmxvY2suIFJlcXVpcmVzIHRoZSBiaWcgbG9jayBoZWxkLgorICovCit2b2lkIHNldF9mc19wd2Qoc3RydWN0IGZzX3N0cnVjdCAqZnMsIHN0cnVjdCB2ZnNtb3VudCAqbW50LAorCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGRlbnRyeSAqb2xkX3B3ZDsKKwlzdHJ1Y3QgdmZzbW91bnQgKm9sZF9wd2RtbnQ7CisKKwl3cml0ZV9sb2NrKCZmcy0+bG9jayk7CisJb2xkX3B3ZCA9IGZzLT5wd2Q7CisJb2xkX3B3ZG1udCA9IGZzLT5wd2RtbnQ7CisJZnMtPnB3ZG1udCA9IG1udGdldChtbnQpOworCWZzLT5wd2QgPSBkZ2V0KGRlbnRyeSk7CisJd3JpdGVfdW5sb2NrKCZmcy0+bG9jayk7CisKKwlpZiAob2xkX3B3ZCkgeworCQlkcHV0KG9sZF9wd2QpOworCQltbnRwdXQob2xkX3B3ZG1udCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjaHJvb3RfZnNfcmVmcyhzdHJ1Y3QgbmFtZWlkYXRhICpvbGRfbmQsIHN0cnVjdCBuYW1laWRhdGEgKm5ld19uZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmcsICpwOworCXN0cnVjdCBmc19zdHJ1Y3QgKmZzOworCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlkb19lYWNoX3RocmVhZChnLCBwKSB7CisJCXRhc2tfbG9jayhwKTsKKwkJZnMgPSBwLT5mczsKKwkJaWYgKGZzKSB7CisJCQlhdG9taWNfaW5jKCZmcy0+Y291bnQpOworCQkJdGFza191bmxvY2socCk7CisJCQlpZiAoZnMtPnJvb3Q9PW9sZF9uZC0+ZGVudHJ5JiZmcy0+cm9vdG1udD09b2xkX25kLT5tbnQpCisJCQkJc2V0X2ZzX3Jvb3QoZnMsIG5ld19uZC0+bW50LCBuZXdfbmQtPmRlbnRyeSk7CisJCQlpZiAoZnMtPnB3ZD09b2xkX25kLT5kZW50cnkmJmZzLT5wd2RtbnQ9PW9sZF9uZC0+bW50KQorCQkJCXNldF9mc19wd2QoZnMsIG5ld19uZC0+bW50LCBuZXdfbmQtPmRlbnRyeSk7CisJCQlwdXRfZnNfc3RydWN0KGZzKTsKKwkJfSBlbHNlCisJCQl0YXNrX3VubG9jayhwKTsKKwl9IHdoaWxlX2VhY2hfdGhyZWFkKGcsIHApOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKK30KKworLyoKKyAqIHBpdm90X3Jvb3QgU2VtYW50aWNzOgorICogTW92ZXMgdGhlIHJvb3QgZmlsZSBzeXN0ZW0gb2YgdGhlIGN1cnJlbnQgcHJvY2VzcyB0byB0aGUgZGlyZWN0b3J5IHB1dF9vbGQsCisgKiBtYWtlcyBuZXdfcm9vdCBhcyB0aGUgbmV3IHJvb3QgZmlsZSBzeXN0ZW0gb2YgdGhlIGN1cnJlbnQgcHJvY2VzcywgYW5kIHNldHMKKyAqIHJvb3QvY3dkIG9mIGFsbCBwcm9jZXNzZXMgd2hpY2ggaGFkIHRoZW0gb24gdGhlIGN1cnJlbnQgcm9vdCB0byBuZXdfcm9vdC4KKyAqCisgKiBSZXN0cmljdGlvbnM6CisgKiBUaGUgbmV3X3Jvb3QgYW5kIHB1dF9vbGQgbXVzdCBiZSBkaXJlY3RvcmllcywgYW5kICBtdXN0IG5vdCBiZSBvbiB0aGUKKyAqIHNhbWUgZmlsZSAgc3lzdGVtIGFzIHRoZSBjdXJyZW50IHByb2Nlc3Mgcm9vdC4gVGhlIHB1dF9vbGQgIG11c3QgIGJlCisgKiB1bmRlcm5lYXRoIG5ld19yb290LCAgaS5lLiBhZGRpbmcgYSBub24temVybyBudW1iZXIgb2YgLy4uIHRvIHRoZSBzdHJpbmcKKyAqIHBvaW50ZWQgdG8gYnkgcHV0X29sZCBtdXN0IHlpZWxkIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBuZXdfcm9vdC4gTm8gb3RoZXIKKyAqIGZpbGUgc3lzdGVtIG1heSBiZSBtb3VudGVkIG9uIHB1dF9vbGQuIEFmdGVyIGFsbCwgbmV3X3Jvb3QgaXMgYSBtb3VudHBvaW50LgorICoKKyAqIE5vdGVzOgorICogIC0gd2UgZG9uJ3QgbW92ZSByb290L2N3ZCBpZiB0aGV5IGFyZSBub3QgYXQgdGhlIHJvb3QgKHJlYXNvbjogaWYgc29tZXRoaW5nCisgKiAgICBjYXJlZCBlbm91Z2ggdG8gY2hhbmdlIHRoZW0sIGl0J3MgcHJvYmFibHkgd3JvbmcgdG8gZm9yY2UgdGhlbSBlbHNld2hlcmUpCisgKiAgLSBpdCdzIG9rYXkgdG8gcGljayBhIHJvb3QgdGhhdCBpc24ndCB0aGUgcm9vdCBvZiBhIGZpbGUgc3lzdGVtLCBlLmcuCisgKiAgICAvbmZzL215X3Jvb3Qgd2hlcmUgL25mcyBpcyB0aGUgbW91bnQgcG9pbnQuIEl0IG11c3QgYmUgYSBtb3VudHBvaW50LAorICogICAgdGhvdWdoLCBzbyB5b3UgbWF5IG5lZWQgdG8gc2F5IG1vdW50IC0tYmluZCAvbmZzL215X3Jvb3QgL25mcy9teV9yb290CisgKiAgICBmaXJzdC4KKyAqLworCithc21saW5rYWdlIGxvbmcgc3lzX3Bpdm90X3Jvb3QoY29uc3QgY2hhciBfX3VzZXIgKm5ld19yb290LCBjb25zdCBjaGFyIF9fdXNlciAqcHV0X29sZCkKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKnRtcDsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5ld19uZCwgb2xkX25kLCBwYXJlbnRfbmQsIHJvb3RfcGFyZW50LCB1c2VyX25kOworCWludCBlcnJvcjsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWxvY2tfa2VybmVsKCk7CisKKwllcnJvciA9IF9fdXNlcl93YWxrKG5ld19yb290LCBMT09LVVBfRk9MTE9XfExPT0tVUF9ESVJFQ1RPUlksICZuZXdfbmQpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQwOworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoIWNoZWNrX21udChuZXdfbmQubW50KSkKKwkJZ290byBvdXQxOworCisJZXJyb3IgPSBfX3VzZXJfd2FsayhwdXRfb2xkLCBMT09LVVBfRk9MTE9XfExPT0tVUF9ESVJFQ1RPUlksICZvbGRfbmQpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQxOworCisJZXJyb3IgPSBzZWN1cml0eV9zYl9waXZvdHJvb3QoJm9sZF9uZCwgJm5ld19uZCk7CisJaWYgKGVycm9yKSB7CisJCXBhdGhfcmVsZWFzZSgmb2xkX25kKTsKKwkJZ290byBvdXQxOworCX0KKworCXJlYWRfbG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCXVzZXJfbmQubW50ID0gbW50Z2V0KGN1cnJlbnQtPmZzLT5yb290bW50KTsKKwl1c2VyX25kLmRlbnRyeSA9IGRnZXQoY3VycmVudC0+ZnMtPnJvb3QpOworCXJlYWRfdW5sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJZG93bl93cml0ZSgmY3VycmVudC0+bmFtZXNwYWNlLT5zZW0pOworCWRvd24oJm9sZF9uZC5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKCFjaGVja19tbnQodXNlcl9uZC5tbnQpKQorCQlnb3RvIG91dDI7CisJZXJyb3IgPSAtRU5PRU5UOworCWlmIChJU19ERUFERElSKG5ld19uZC5kZW50cnktPmRfaW5vZGUpKQorCQlnb3RvIG91dDI7CisJaWYgKGRfdW5oYXNoZWQobmV3X25kLmRlbnRyeSkgJiYgIUlTX1JPT1QobmV3X25kLmRlbnRyeSkpCisJCWdvdG8gb3V0MjsKKwlpZiAoZF91bmhhc2hlZChvbGRfbmQuZGVudHJ5KSAmJiAhSVNfUk9PVChvbGRfbmQuZGVudHJ5KSkKKwkJZ290byBvdXQyOworCWVycm9yID0gLUVCVVNZOworCWlmIChuZXdfbmQubW50ID09IHVzZXJfbmQubW50IHx8IG9sZF9uZC5tbnQgPT0gdXNlcl9uZC5tbnQpCisJCWdvdG8gb3V0MjsgLyogbG9vcCwgb24gdGhlIHNhbWUgZmlsZSBzeXN0ZW0gICovCisJZXJyb3IgPSAtRUlOVkFMOworCWlmICh1c2VyX25kLm1udC0+bW50X3Jvb3QgIT0gdXNlcl9uZC5kZW50cnkpCisJCWdvdG8gb3V0MjsgLyogbm90IGEgbW91bnRwb2ludCAqLworCWlmIChuZXdfbmQubW50LT5tbnRfcm9vdCAhPSBuZXdfbmQuZGVudHJ5KQorCQlnb3RvIG91dDI7IC8qIG5vdCBhIG1vdW50cG9pbnQgKi8KKwl0bXAgPSBvbGRfbmQubW50OyAvKiBtYWtlIHN1cmUgd2UgY2FuIHJlYWNoIHB1dF9vbGQgZnJvbSBuZXdfcm9vdCAqLworCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisJaWYgKHRtcCAhPSBuZXdfbmQubW50KSB7CisJCWZvciAoOzspIHsKKwkJCWlmICh0bXAtPm1udF9wYXJlbnQgPT0gdG1wKQorCQkJCWdvdG8gb3V0MzsgLyogYWxyZWFkeSBtb3VudGVkIG9uIHB1dF9vbGQgKi8KKwkJCWlmICh0bXAtPm1udF9wYXJlbnQgPT0gbmV3X25kLm1udCkKKwkJCQlicmVhazsKKwkJCXRtcCA9IHRtcC0+bW50X3BhcmVudDsKKwkJfQorCQlpZiAoIWlzX3N1YmRpcih0bXAtPm1udF9tb3VudHBvaW50LCBuZXdfbmQuZGVudHJ5KSkKKwkJCWdvdG8gb3V0MzsKKwl9IGVsc2UgaWYgKCFpc19zdWJkaXIob2xkX25kLmRlbnRyeSwgbmV3X25kLmRlbnRyeSkpCisJCWdvdG8gb3V0MzsKKwlkZXRhY2hfbW50KG5ld19uZC5tbnQsICZwYXJlbnRfbmQpOworCWRldGFjaF9tbnQodXNlcl9uZC5tbnQsICZyb290X3BhcmVudCk7CisJYXR0YWNoX21udCh1c2VyX25kLm1udCwgJm9sZF9uZCk7ICAgICAvKiBtb3VudCBvbGQgcm9vdCBvbiBwdXRfb2xkICovCisJYXR0YWNoX21udChuZXdfbmQubW50LCAmcm9vdF9wYXJlbnQpOyAvKiBtb3VudCBuZXdfcm9vdCBvbiAvICovCisJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCWNocm9vdF9mc19yZWZzKCZ1c2VyX25kLCAmbmV3X25kKTsKKwlzZWN1cml0eV9zYl9wb3N0X3Bpdm90cm9vdCgmdXNlcl9uZCwgJm5ld19uZCk7CisJZXJyb3IgPSAwOworCXBhdGhfcmVsZWFzZSgmcm9vdF9wYXJlbnQpOworCXBhdGhfcmVsZWFzZSgmcGFyZW50X25kKTsKK291dDI6CisJdXAoJm9sZF9uZC5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwl1cF93cml0ZSgmY3VycmVudC0+bmFtZXNwYWNlLT5zZW0pOworCXBhdGhfcmVsZWFzZSgmdXNlcl9uZCk7CisJcGF0aF9yZWxlYXNlKCZvbGRfbmQpOworb3V0MToKKwlwYXRoX3JlbGVhc2UoJm5ld19uZCk7CitvdXQwOgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7CitvdXQzOgorCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwlnb3RvIG91dDI7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X21vdW50X3RyZWUodm9pZCkKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKKwlzdHJ1Y3QgbmFtZXNwYWNlICpuYW1lc3BhY2U7CisJc3RydWN0IHRhc2tfc3RydWN0ICpnLCAqcDsKKworCW1udCA9IGRvX2tlcm5fbW91bnQoInJvb3RmcyIsIDAsICJyb290ZnMiLCBOVUxMKTsKKwlpZiAoSVNfRVJSKG1udCkpCisJCXBhbmljKCJDYW4ndCBjcmVhdGUgcm9vdGZzIik7CisJbmFtZXNwYWNlID0ga21hbGxvYyhzaXplb2YoKm5hbWVzcGFjZSksIEdGUF9LRVJORUwpOworCWlmICghbmFtZXNwYWNlKQorCQlwYW5pYygiQ2FuJ3QgYWxsb2NhdGUgaW5pdGlhbCBuYW1lc3BhY2UiKTsKKwlhdG9taWNfc2V0KCZuYW1lc3BhY2UtPmNvdW50LCAxKTsKKwlJTklUX0xJU1RfSEVBRCgmbmFtZXNwYWNlLT5saXN0KTsKKwlpbml0X3J3c2VtKCZuYW1lc3BhY2UtPnNlbSk7CisJbGlzdF9hZGQoJm1udC0+bW50X2xpc3QsICZuYW1lc3BhY2UtPmxpc3QpOworCW5hbWVzcGFjZS0+cm9vdCA9IG1udDsKKwltbnQtPm1udF9uYW1lc3BhY2UgPSBuYW1lc3BhY2U7CisKKwlpbml0X3Rhc2submFtZXNwYWNlID0gbmFtZXNwYWNlOworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJZG9fZWFjaF90aHJlYWQoZywgcCkgeworCQlnZXRfbmFtZXNwYWNlKG5hbWVzcGFjZSk7CisJCXAtPm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKKwl9IHdoaWxlX2VhY2hfdGhyZWFkKGcsIHApOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKworCXNldF9mc19wd2QoY3VycmVudC0+ZnMsIG5hbWVzcGFjZS0+cm9vdCwgbmFtZXNwYWNlLT5yb290LT5tbnRfcm9vdCk7CisJc2V0X2ZzX3Jvb3QoY3VycmVudC0+ZnMsIG5hbWVzcGFjZS0+cm9vdCwgbmFtZXNwYWNlLT5yb290LT5tbnRfcm9vdCk7Cit9CisKK3ZvaWQgX19pbml0IG1udF9pbml0KHVuc2lnbmVkIGxvbmcgbWVtcGFnZXMpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZDsKKwl1bnNpZ25lZCBpbnQgbnJfaGFzaDsKKwlpbnQgaTsKKworCW1udF9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJtbnRfY2FjaGUiLCBzaXplb2Yoc3RydWN0IHZmc21vdW50KSwKKwkJCTAsIFNMQUJfSFdDQUNIRV9BTElHTnxTTEFCX1BBTklDLCBOVUxMLCBOVUxMKTsKKworCW1vdW50X2hhc2h0YWJsZSA9IChzdHJ1Y3QgbGlzdF9oZWFkICopCisJCV9fZ2V0X2ZyZWVfcGFnZShHRlBfQVRPTUlDKTsKKworCWlmICghbW91bnRfaGFzaHRhYmxlKQorCQlwYW5pYygiRmFpbGVkIHRvIGFsbG9jYXRlIG1vdW50IGhhc2ggdGFibGVcbiIpOworCisJLyoKKwkgKiBGaW5kIHRoZSBwb3dlci1vZi10d28gbGlzdC1oZWFkcyB0aGF0IGNhbiBmaXQgaW50byB0aGUgYWxsb2NhdGlvbi4uCisJICogV2UgZG9uJ3QgZ3VhcmFudGVlIHRoYXQgInNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSIgaXMgbmVjZXNzYXJpbHkKKwkgKiBhIHBvd2VyLW9mLXR3by4KKwkgKi8KKwlucl9oYXNoID0gUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpOworCWhhc2hfYml0cyA9IDA7CisJZG8geworCQloYXNoX2JpdHMrKzsKKwl9IHdoaWxlICgobnJfaGFzaCA+PiBoYXNoX2JpdHMpICE9IDApOworCWhhc2hfYml0cy0tOworCisJLyoKKwkgKiBSZS1jYWxjdWxhdGUgdGhlIGFjdHVhbCBudW1iZXIgb2YgZW50cmllcyBhbmQgdGhlIG1hc2sKKwkgKiBmcm9tIHRoZSBudW1iZXIgb2YgYml0cyB3ZSBjYW4gZml0LgorCSAqLworCW5yX2hhc2ggPSAxVUwgPDwgaGFzaF9iaXRzOworCWhhc2hfbWFzayA9IG5yX2hhc2gtMTsKKworCXByaW50aygiTW91bnQtY2FjaGUgaGFzaCB0YWJsZSBlbnRyaWVzOiAlZFxuIiwgbnJfaGFzaCk7CisKKwkvKiBBbmQgaW5pdGlhbGl6ZSB0aGUgbmV3bHkgYWxsb2NhdGVkIGFycmF5ICovCisJZCA9IG1vdW50X2hhc2h0YWJsZTsKKwlpID0gbnJfaGFzaDsKKwlkbyB7CisJCUlOSVRfTElTVF9IRUFEKGQpOworCQlkKys7CisJCWktLTsKKwl9IHdoaWxlIChpKTsKKwlzeXNmc19pbml0KCk7CisJaW5pdF9yb290ZnMoKTsKKwlpbml0X21vdW50X3RyZWUoKTsKK30KKwordm9pZCBfX3B1dF9uYW1lc3BhY2Uoc3RydWN0IG5hbWVzcGFjZSAqbmFtZXNwYWNlKQoreworCXN0cnVjdCB2ZnNtb3VudCAqbW50OworCisJZG93bl93cml0ZSgmbmFtZXNwYWNlLT5zZW0pOworCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1udCwgJm5hbWVzcGFjZS0+bGlzdCwgbW50X2xpc3QpIHsKKwkJbW50LT5tbnRfbmFtZXNwYWNlID0gTlVMTDsKKwl9CisKKwl1bW91bnRfdHJlZShuYW1lc3BhY2UtPnJvb3QpOworCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwl1cF93cml0ZSgmbmFtZXNwYWNlLT5zZW0pOworCWtmcmVlKG5hbWVzcGFjZSk7Cit9CmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9LY29uZmlnIGIvZnMvbmNwZnMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDI4MDg0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmNwZnMvS2NvbmZpZwpAQCAtMCwwICsxLDg3IEBACisjCisjIE5DUCBGaWxlc3lzdGVtIGNvbmZpZ3VyYXRpb24KKyMKK2NvbmZpZyBOQ1BGU19QQUNLRVRfU0lHTklORworCWJvb2wgIlBhY2tldCBzaWduYXR1cmVzIgorCWRlcGVuZHMgb24gTkNQX0ZTCisJaGVscAorCSAgTkNQIGFsbG93cyBwYWNrZXRzIHRvIGJlIHNpZ25lZCBmb3Igc3Ryb25nZXIgc2VjdXJpdHkuIElmIHlvdSB3YW50CisJICBzZWN1cml0eSwgc2F5IFkuICBOb3JtYWwgdXNlcnMgY2FuIGxlYXZlIGl0IG9mZi4gIFRvIGJlIGFibGUgdG8gdXNlCisJICBwYWNrZXQgc2lnbmluZyB5b3UgbXVzdCB1c2UgbmNwZnMgPiAyLjAuMTIuCisKK2NvbmZpZyBOQ1BGU19JT0NUTF9MT0NLSU5HCisJYm9vbCAiUHJvcHJpZXRhcnkgZmlsZSBsb2NraW5nIgorCWRlcGVuZHMgb24gTkNQX0ZTCisJaGVscAorCSAgQWxsb3dzIGxvY2tpbmcgb2YgcmVjb3JkcyBvbiByZW1vdGUgdm9sdW1lcy4gIFNheSBOIHVubGVzcyB5b3UgaGF2ZQorCSAgc3BlY2lhbCBhcHBsaWNhdGlvbnMgd2hpY2ggYXJlIGFibGUgdG8gdXRpbGl6ZSB0aGlzIGxvY2tpbmcgc2NoZW1lLgorCitjb25maWcgTkNQRlNfU1RST05HCisJYm9vbCAiQ2xlYXIgcmVtb3ZlL2RlbGV0ZSBpbmhpYml0IHdoZW4gbmVlZGVkIgorCWRlcGVuZHMgb24gTkNQX0ZTCisJaGVscAorCSAgQWxsb3dzIG1hbmlwdWxhdGlvbiBvZiBmaWxlcyBmbGFnZ2VkIGFzIERlbGV0ZSBvciBSZW5hbWUgSW5oaWJpdC4KKwkgIFRvIHVzZSB0aGlzIGZlYXR1cmUgeW91IG11c3QgbW91bnQgdm9sdW1lcyB3aXRoIHRoZSBuY3Btb3VudAorCSAgcGFyYW1ldGVyICItcyIgKG5jcGZzLTIuMC4xMiBhbmQgbmV3ZXIpLiAgU2F5IFkgdW5sZXNzIHlvdSBhcmUgbm90CisJICBtb3VudGluZyB2b2x1bWVzIHdpdGggLWYgNDQ0LgorCitjb25maWcgTkNQRlNfTkZTX05TCisJYm9vbCAiVXNlIE5GUyBuYW1lc3BhY2UgaWYgYXZhaWxhYmxlIgorCWRlcGVuZHMgb24gTkNQX0ZTCisJaGVscAorCSAgQWxsb3dzIHlvdSB0byB1dGlsaXplIE5GUyBuYW1lc3BhY2Ugb24gTmV0V2FyZSBzZXJ2ZXJzLiAgSXQgYnJpbmdzCisJICB5b3UgY2FzZSBzZW5zaXRpdmUgZmlsZW5hbWVzLiAgU2F5IFkuICBZb3UgY2FuIGRpc2FibGUgaXQgYXQKKwkgIG1vdW50LXRpbWUgd2l0aCB0aGUgYC1OIG5mcycgcGFyYW1ldGVyIG9mIG5jcG1vdW50LgorCitjb25maWcgTkNQRlNfT1MyX05TCisJYm9vbCAiVXNlIExPTkcgKE9TLzIpIG5hbWVzcGFjZSBpZiBhdmFpbGFibGUiCisJZGVwZW5kcyBvbiBOQ1BfRlMKKwloZWxwCisJICBBbGxvd3MgeW91IHRvIHV0aWxpemUgT1MyL0xPTkcgbmFtZXNwYWNlIG9uIE5ldFdhcmUgc2VydmVycy4KKwkgIEZpbGVuYW1lcyBpbiB0aGlzIG5hbWVzcGFjZSBhcmUgbGltaXRlZCB0byAyNTUgY2hhcmFjdGVycywgdGhleSBhcmUKKwkgIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBjYXNlIGluIG5hbWVzIGlzIHByZXNlcnZlZC4gIFNheSBZLiAgWW91IGNhbgorCSAgZGlzYWJsZSBpdCBhdCBtb3VudCB0aW1lIHdpdGggdGhlIC1OIG9zMiBwYXJhbWV0ZXIgb2YgbmNwbW91bnQuCisKK2NvbmZpZyBOQ1BGU19TTUFMTERPUworCWJvb2wgIkxvd2VyY2FzZSBET1MgZmlsZW5hbWVzIgorCWRlcGVuZHMgb24gTkNQX0ZTCisJLS0taGVscC0tLQorCSAgSWYgeW91IHNheSBZIGhlcmUsIGV2ZXJ5IGZpbGVuYW1lIG9uIGEgTmV0V2FyZSBzZXJ2ZXIgdm9sdW1lIHVzaW5nCisJICB0aGUgT1MyL0xPTkcgbmFtZXNwYWNlIGFuZCBjcmVhdGVkIHVuZGVyIERPUyBvciBvbiBhIHZvbHVtZSB1c2luZworCSAgRE9TIG5hbWVzcGFjZSB3aWxsIGJlIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgY2hhcmFjdGVycy4KKwkgIFNheWluZyBOIGhlcmUgd2lsbCBnaXZlIHlvdSB0aGVzZSBmaWxlbmFtZXMgaW4gdXBwZXJjYXNlLgorCisJICBUaGlzIGlzIG9ubHkgYSBjb3NtZXRpYyBvcHRpb24gc2luY2UgdGhlIE9TMi9MT05HIG5hbWVzcGFjZSBpcyBjYXNlCisJICBpbnNlbnNpdGl2ZS4gVGhlIG9ubHkgbWFqb3IgcmVhc29uIGZvciB0aGlzIG9wdGlvbiBpcyBiYWNrd2FyZAorCSAgY29tcGF0aWJpbGl0eSB3aGVuIG1vdmluZyBmcm9tIERPUyB0byBPUzIvTE9ORyBuYW1lc3BhY2Ugc3VwcG9ydC4KKwkgIExvbmcgZmlsZW5hbWVzIChjcmVhdGVkIGJ5IFdpbjk1KSB3aWxsIG5vdCBiZSBhZmZlY3RlZC4KKworCSAgVGhpcyBvcHRpb24gZG9lcyBub3Qgc29sdmUgdGhlIHByb2JsZW0gdGhhdCBmaWxlbmFtZXMgYXBwZWFyCisJICBkaWZmZXJlbnRseSB1bmRlciBMaW51eCBhbmQgdW5kZXIgV2luZG93cywgc2luY2UgV2luZG93cyBkb2VzIGFuCisJICBhZGRpdGlvbmFsIGNvbnZlcnNpb25zIG9uIHRoZSBjbGllbnQgc2lkZS4gWW91IGNhbiBhY2hpZXZlIHNpbWlsYXIKKwkgIGVmZmVjdHMgYnkgc2F5aW5nIFkgdG8gIkFsbG93IHVzaW5nIG9mIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgorCSAgYmVsb3cuCisKK2NvbmZpZyBOQ1BGU19OTFMKKwlib29sICJVc2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBOQ1BfRlMKKwlzZWxlY3QgTkxTCisJaGVscAorCSAgQWxsb3dzIHlvdSB0byB1c2UgY29kZXBhZ2VzIGFuZCBJL08gY2hhcnNldHMgZm9yIGZpbGUgbmFtZQorCSAgdHJhbnNsYXRpb24gYmV0d2VlbiB0aGUgc2VydmVyIGZpbGUgc3lzdGVtIGFuZCBpbnB1dC9vdXRwdXQuIFRoaXMKKwkgIG1heSBiZSB1c2VmdWwsIGlmIHlvdSB3YW50IHRvIGFjY2VzcyB0aGUgc2VydmVyIHdpdGggb3RoZXIgb3BlcmF0aW5nCisJICBzeXN0ZW1zLCBlLmcuIFdpbmRvd3MgOTUuIFNlZSBhbHNvIE5MUyBmb3IgbW9yZSBJbmZvcm1hdGlvbi4KKworCSAgVG8gc2VsZWN0IGNvZGVwYWdlcyBhbmQgSS9PIGNoYXJzZXRzIHVzZSBuY3Bmcy0yLjIuMC4xMyBvciBuZXdlci4KKworY29uZmlnIE5DUEZTX0VYVFJBUworCWJvb2wgIkVuYWJsZSBzeW1ib2xpYyBsaW5rcyBhbmQgZXhlY3V0ZSBmbGFncyIKKwlkZXBlbmRzIG9uIE5DUF9GUworCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgdXNlIG9mIHN5bWJvbGljIGxpbmtzIGFuZCBhbiBleGVjdXRlIHBlcm1pc3Npb24KKwkgIGJpdCBvbiBOQ1BGUy4gVGhlIGZpbGUgc2VydmVyIG5lZWQgbm90IGhhdmUgbG9uZyBuYW1lIHNwYWNlIG9yIE5GUworCSAgbmFtZSBzcGFjZSBsb2FkZWQgZm9yIHRoZXNlIHRvIHdvcmsuCisKKwkgIFRvIHVzZSB0aGUgbmV3IGF0dHJpYnV0ZXMsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgZmxhZ3MKKwkgICctZiA2MDAgLWQgNzU1JyBvbiB0aGUgbmNwbW91bnQgY29tbWFuZCBsaW5lLgorCmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9NYWtlZmlsZSBiL2ZzL25jcGZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZWEwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uY3Bmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDE2IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggbmNwIGZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19OQ1BfRlMpICs9IG5jcGZzLm8KKworbmNwZnMteSAgICAgIDo9IGRpci5vIGZpbGUubyBpbm9kZS5vIGlvY3RsLm8gbW1hcC5vIG5jcGxpYl9rZXJuZWwubyBzb2NrLm8gXAorCQluY3BzaWduX2tlcm5lbC5vIGdldG9wdC5vCisKK25jcGZzLSQoQ09ORklHX05DUEZTX0VYVFJBUykgICArPSBzeW1saW5rLm8KK25jcGZzLSQoQ09ORklHX05DUEZTX05GU19OUykgICArPSBzeW1saW5rLm8KKworIyBJZiB5b3Ugd2FudCBkZWJ1Z2dpbmcgb3V0cHV0LCBwbGVhc2UgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZQorIyBFWFRSQV9DRkxBR1MgKz0gLURERUJVR19OQ1A9MQorCitDRkxBR1NfbmNwbGliX2tlcm5lbC5vIDo9IC1maW5saW5lLWZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvZGlyLmMgYi9mcy9uY3Bmcy9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGMyZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmNwZnMvZGlyLmMKQEAgLTAsMCArMSwxMjYwIEBACisvKgorICogIGRpci5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBWb2xrZXIgTGVuZGVja2UKKyAqICBNb2RpZmllZCBmb3IgYmlnIGVuZGlhbiBieSBKLkYuIENoYWRpbWEgYW5kIERhdmlkIFMuIE1pbGxlcgorICogIE1vZGlmaWVkIDE5OTcgUGV0ZXIgV2FsdGVuYmVyZywgQmlsbCBIYXdlcywgRGF2aWQgV29vZGhvdXNlIGZvciAyLjEgZGNhY2hlCisgKiAgTW9kaWZpZWQgMTk5OCwgMTk5OSBXb2xmcmFtIFBpZW5rb3NzIGZvciBOTFMKKyAqICBNb2RpZmllZCAxOTk5IFdvbGZyYW0gUGllbmtvc3MgZm9yIGRpcmVjdG9yeSBjYWNoaW5nCisgKiAgTW9kaWZpZWQgMjAwMCBCZW4gSGFycmlzLCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSBmb3IgTkZTIE5TIG1ldGEtaW5mbworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uY3BfZnMuaD4KKworI2luY2x1ZGUgIm5jcGxpYl9rZXJuZWwuaCIKKworc3RhdGljIHZvaWQgbmNwX3JlYWRfdm9sdW1lX2xpc3Qoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QsCisJCQkJc3RydWN0IG5jcF9jYWNoZV9jb250cm9sICopOworc3RhdGljIHZvaWQgbmNwX2RvX3JlYWRkaXIoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QsCisJCQkJc3RydWN0IG5jcF9jYWNoZV9jb250cm9sICopOworCitzdGF0aWMgaW50IG5jcF9yZWFkZGlyKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKKworc3RhdGljIGludCBuY3BfY3JlYXRlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCwgc3RydWN0IG5hbWVpZGF0YSAqKTsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpuY3BfbG9va3VwKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBuYW1laWRhdGEgKik7CitzdGF0aWMgaW50IG5jcF91bmxpbmsoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKik7CitzdGF0aWMgaW50IG5jcF9ta2RpcihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOworc3RhdGljIGludCBuY3Bfcm1kaXIoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKik7CitzdGF0aWMgaW50IG5jcF9yZW5hbWUoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwKKwkgIAkgICAgICBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqKTsKK3N0YXRpYyBpbnQgbmNwX21rbm9kKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICAgIGludCBtb2RlLCBkZXZfdCByZGV2KTsKKyNpZiBkZWZpbmVkKENPTkZJR19OQ1BGU19FWFRSQVMpIHx8IGRlZmluZWQoQ09ORklHX05DUEZTX05GU19OUykKK2V4dGVybiBpbnQgbmNwX3N5bWxpbmsoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqKTsKKyNlbHNlCisjZGVmaW5lIG5jcF9zeW1saW5rIE5VTEwKKyNlbmRpZgorCQkgICAgICAKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgbmNwX2Rpcl9vcGVyYXRpb25zID0KK3sKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gbmNwX3JlYWRkaXIsCisJLmlvY3RsCQk9IG5jcF9pb2N0bCwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG5jcF9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9Cit7CisJLmNyZWF0ZQkJPSBuY3BfY3JlYXRlLAorCS5sb29rdXAJCT0gbmNwX2xvb2t1cCwKKwkudW5saW5rCQk9IG5jcF91bmxpbmssCisJLnN5bWxpbmsJPSBuY3Bfc3ltbGluaywKKwkubWtkaXIJCT0gbmNwX21rZGlyLAorCS5ybWRpcgkJPSBuY3Bfcm1kaXIsCisJLm1rbm9kCQk9IG5jcF9ta25vZCwKKwkucmVuYW1lCQk9IG5jcF9yZW5hbWUsCisJLnNldGF0dHIJPSBuY3Bfbm90aWZ5X2NoYW5nZSwKK307CisKKy8qCisgKiBEZW50cnkgb3BlcmF0aW9ucyByb3V0aW5lcworICovCitzdGF0aWMgaW50IG5jcF9sb29rdXBfdmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOworc3RhdGljIGludCBuY3BfaGFzaF9kZW50cnkoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgcXN0ciAqKTsKK3N0YXRpYyBpbnQgbmNwX2NvbXBhcmVfZGVudHJ5IChzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBxc3RyICosIHN0cnVjdCBxc3RyICopOworc3RhdGljIGludCBuY3BfZGVsZXRlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICopOworCitzdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIG5jcF9kZW50cnlfb3BlcmF0aW9ucyA9Cit7CisJLmRfcmV2YWxpZGF0ZQk9IG5jcF9sb29rdXBfdmFsaWRhdGUsCisJLmRfaGFzaAkJPSBuY3BfaGFzaF9kZW50cnksCisJLmRfY29tcGFyZQk9IG5jcF9jb21wYXJlX2RlbnRyeSwKKwkuZF9kZWxldGUJPSBuY3BfZGVsZXRlX2RlbnRyeSwKK307CisKK3N0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBuY3Bfcm9vdF9kZW50cnlfb3BlcmF0aW9ucyA9Cit7CisJLmRfaGFzaAkJPSBuY3BfaGFzaF9kZW50cnksCisJLmRfY29tcGFyZQk9IG5jcF9jb21wYXJlX2RlbnRyeSwKKwkuZF9kZWxldGUJPSBuY3BfZGVsZXRlX2RlbnRyeSwKK307CisKKworLyoKKyAqIE5vdGU6IGxlYXZlIHRoZSBoYXNoIHVuY2hhbmdlZCBpZiB0aGUgZGlyZWN0b3J5CisgKiBpcyBjYXNlLXNlbnNpdGl2ZS4KKyAqLworc3RhdGljIGludCAKK25jcF9oYXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICp0aGlzKQoreworCXN0cnVjdCBubHNfdGFibGUgKnQ7CisJdW5zaWduZWQgbG9uZyBoYXNoOworCWludCBpOworCisJdCA9IE5DUF9JT19UQUJMRShkZW50cnkpOworCisJaWYgKCFuY3BfY2FzZV9zZW5zaXRpdmUoZGVudHJ5LT5kX2lub2RlKSkgeworCQloYXNoID0gaW5pdF9uYW1lX2hhc2goKTsKKwkJZm9yIChpPTA7IGk8dGhpcy0+bGVuIDsgaSsrKQorCQkJaGFzaCA9IHBhcnRpYWxfbmFtZV9oYXNoKG5jcF90b2xvd2VyKHQsIHRoaXMtPm5hbWVbaV0pLAorCQkJCQkJCQkJaGFzaCk7CisJCXRoaXMtPmhhc2ggPSBlbmRfbmFtZV9oYXNoKGhhc2gpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmNwX2NvbXBhcmVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKmEsIHN0cnVjdCBxc3RyICpiKQoreworCWlmIChhLT5sZW4gIT0gYi0+bGVuKQorCQlyZXR1cm4gMTsKKworCWlmIChuY3BfY2FzZV9zZW5zaXRpdmUoZGVudHJ5LT5kX2lub2RlKSkKKwkJcmV0dXJuIHN0cm5jbXAoYS0+bmFtZSwgYi0+bmFtZSwgYS0+bGVuKTsKKworCXJldHVybiBuY3Bfc3RybmljbXAoTkNQX0lPX1RBQkxFKGRlbnRyeSksIGEtPm5hbWUsIGItPm5hbWUsIGEtPmxlbik7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBjYWxsYmFjayBmcm9tIGRwdXQoKSB3aGVuIGRfY291bnQgaXMgZ29pbmcgdG8gMC4KKyAqIFdlIHVzZSB0aGlzIHRvIHVuaGFzaCBkZW50cmllcyB3aXRoIGJhZCBpbm9kZXMuCisgKiBDbG9zaW5nIGZpbGVzIGNhbiBiZSBzYWZlbHkgcG9zdHBvbmVkIHVudGlsIGlwdXQoKSAtIGl0J3MgZG9uZSB0aGVyZSBhbnl3YXkuCisgKi8KK3N0YXRpYyBpbnQKK25jcF9kZWxldGVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWlmIChpbm9kZSkgeworCQlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkKKwkJCXJldHVybiAxOworCX0gZWxzZQorCXsKKwkvKiBOLkIuIFVuaGFzaCBuZWdhdGl2ZSBkZW50cmllcz8gKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituY3Bfc2luZ2xlX3ZvbHVtZShzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyKQoreworCXJldHVybiAoc2VydmVyLT5tLm1vdW50ZWRfdm9sWzBdICE9ICdcMCcpOworfQorCitzdGF0aWMgaW5saW5lIGludCBuY3BfaXNfc2VydmVyX3Jvb3Qoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gKCFuY3Bfc2luZ2xlX3ZvbHVtZShOQ1BfU0VSVkVSKGlub2RlKSkgJiYKKwkJaW5vZGUgPT0gaW5vZGUtPmlfc2ItPnNfcm9vdC0+ZF9pbm9kZSk7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIHdoZW4gdGhlIGRjYWNoZSBoYXMgYSBsb29rdXAgaGl0LgorICovCisKKworI2lmZGVmIENPTkZJR19OQ1BGU19TVFJPTkcKKy8qIHRyeSB0byBkZWxldGUgYSByZWFkb25seSBmaWxlIChOVyBSIGJpdCBzZXQpICovCisKK3N0YXRpYyBpbnQKK25jcF9mb3JjZV91bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkqIGRlbnRyeSkKK3sKKyAgICAgICAgaW50IHJlcz0weDljLHJlczI7CisJc3RydWN0IG53X21vZGlmeV9kb3NfaW5mbyBpbmZvOworCV9fbGUzMiBvbGRfbndhdHRyOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJCisgICAgICAgIC8qIHJlbW92ZSB0aGUgUmVhZC1Pbmx5IGZsYWcgb24gdGhlIE5XIHNlcnZlciAqLworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJb2xkX253YXR0ciA9IE5DUF9GSU5GTyhpbm9kZSktPm53YXR0cjsKKwlpbmZvLmF0dHJpYnV0ZXMgPSBvbGRfbndhdHRyICYgfihhUk9OTFl8YURFTEVURUlOSElCSVR8YVJFTkFNRUlOSElCSVQpOworCXJlczIgPSBuY3BfbW9kaWZ5X2ZpbGVfb3Jfc3ViZGlyX2Rvc19pbmZvX3BhdGgoTkNQX1NFUlZFUihpbm9kZSksIGlub2RlLCBOVUxMLCBETV9BVFRSSUJVVEVTLCAmaW5mbyk7CisJaWYgKHJlczIpCisJCWdvdG8gbGVhdmVfbWU7CisKKyAgICAgICAgLyogbm93IHRyeSBhZ2FpbiB0aGUgZGVsZXRlIG9wZXJhdGlvbiAqLworICAgICAgICByZXMgPSBuY3BfZGVsX2ZpbGVfb3Jfc3ViZGlyMihOQ1BfU0VSVkVSKGRpciksIGRlbnRyeSk7CisKKyAgICAgICAgaWYgKHJlcykgIC8qIGRlbGV0ZSBmYWlsZWQsIHNldCBSIGJpdCBhZ2FpbiAqLworICAgICAgICB7CisJCWluZm8uYXR0cmlidXRlcyA9IG9sZF9ud2F0dHI7CisJCXJlczIgPSBuY3BfbW9kaWZ5X2ZpbGVfb3Jfc3ViZGlyX2Rvc19pbmZvX3BhdGgoTkNQX1NFUlZFUihpbm9kZSksIGlub2RlLCBOVUxMLCBETV9BVFRSSUJVVEVTLCAmaW5mbyk7CisJCWlmIChyZXMyKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsZWF2ZV9tZTsKKyAgICAgICAgfQorbGVhdmVfbWU6CisgICAgICAgIHJldHVybihyZXMpOworfQorI2VuZGlmCS8qIENPTkZJR19OQ1BGU19TVFJPTkcgKi8KKworI2lmZGVmIENPTkZJR19OQ1BGU19TVFJPTkcKK3N0YXRpYyBpbnQKK25jcF9mb3JjZV9yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5KiBvbGRfZGVudHJ5LCBjaGFyICpfb2xkX25hbWUsCisgICAgICAgICAgICAgICAgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSogbmV3X2RlbnRyeSwgY2hhciAqX25ld19uYW1lKQoreworCXN0cnVjdCBud19tb2RpZnlfZG9zX2luZm8gaW5mbzsKKyAgICAgICAgaW50IHJlcz0weDkwLHJlczI7CisJc3RydWN0IGlub2RlICpvbGRfaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCV9fbGUzMiBvbGRfbndhdHRyID0gTkNQX0ZJTkZPKG9sZF9pbm9kZSktPm53YXR0cjsKKwlfX2xlMzIgbmV3X253YXR0ciA9IDA7IC8qIHNodXQgY29tcGlsZXIgd2FybmluZyAqLworCWludCBvbGRfbndhdHRyX2NoYW5nZWQgPSAwOworCWludCBuZXdfbndhdHRyX2NoYW5nZWQgPSAwOworCisJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCQorICAgICAgICAvKiByZW1vdmUgdGhlIFJlYWQtT25seSBmbGFnIG9uIHRoZSBOVyBzZXJ2ZXIgKi8KKworCWluZm8uYXR0cmlidXRlcyA9IG9sZF9ud2F0dHIgJiB+KGFST05MWXxhUkVOQU1FSU5ISUJJVHxhREVMRVRFSU5ISUJJVCk7CisJcmVzMiA9IG5jcF9tb2RpZnlfZmlsZV9vcl9zdWJkaXJfZG9zX2luZm9fcGF0aChOQ1BfU0VSVkVSKG9sZF9pbm9kZSksIG9sZF9pbm9kZSwgTlVMTCwgRE1fQVRUUklCVVRFUywgJmluZm8pOworCWlmICghcmVzMikKKwkJb2xkX253YXR0cl9jaGFuZ2VkID0gMTsKKwlpZiAobmV3X2RlbnRyeSAmJiBuZXdfZGVudHJ5LT5kX2lub2RlKSB7CisJCW5ld19ud2F0dHIgPSBOQ1BfRklORk8obmV3X2RlbnRyeS0+ZF9pbm9kZSktPm53YXR0cjsKKwkJaW5mby5hdHRyaWJ1dGVzID0gbmV3X253YXR0ciAmIH4oYVJPTkxZfGFSRU5BTUVJTkhJQklUfGFERUxFVEVJTkhJQklUKTsKKwkJcmVzMiA9IG5jcF9tb2RpZnlfZmlsZV9vcl9zdWJkaXJfZG9zX2luZm9fcGF0aChOQ1BfU0VSVkVSKG5ld19kaXIpLCBuZXdfZGlyLCBfbmV3X25hbWUsIERNX0FUVFJJQlVURVMsICZpbmZvKTsKKwkJaWYgKCFyZXMyKQorCQkJbmV3X253YXR0cl9jaGFuZ2VkID0gMTsKKwl9CisgICAgICAgIC8qIG5vdyB0cnkgYWdhaW4gdGhlIHJlbmFtZSBvcGVyYXRpb24gKi8KKwkvKiBidXQgb25seSBpZiBzb21ldGhpbmcgcmVhbGx5IGhhcHBlbmVkICovCisJaWYgKG5ld19ud2F0dHJfY2hhbmdlZCB8fCBvbGRfbndhdHRyX2NoYW5nZWQpIHsKKwkgICAgICAgIHJlcyA9IG5jcF9yZW5fb3JfbW92X2ZpbGVfb3Jfc3ViZGlyKE5DUF9TRVJWRVIob2xkX2RpciksCisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfZGlyLCBfb2xkX25hbWUsCisgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfZGlyLCBfbmV3X25hbWUpOworCX0gCisJaWYgKHJlcykKKwkJZ290byBsZWF2ZV9tZTsKKwkvKiBmaWxlIHdhcyBzdWNjZXNzZnVsbHkgcmVuYW1lZCwgc286CisJICAgZG8gbm90IHNldCBhdHRyaWJ1dGVzIG9uIG9sZCBmaWxlIC0gaXQgbm8gbG9uZ2VyIGV4aXN0cworCSAgIGNvcHkgYXR0cmlidXRlcyBmcm9tIG9sZCBmaWxlIHRvIG5ldyAqLworCW5ld19ud2F0dHJfY2hhbmdlZCA9IG9sZF9ud2F0dHJfY2hhbmdlZDsKKwluZXdfbndhdHRyID0gb2xkX253YXR0cjsKKwlvbGRfbndhdHRyX2NoYW5nZWQgPSAwOworCQorbGVhdmVfbWU6OworCWlmIChvbGRfbndhdHRyX2NoYW5nZWQpIHsKKwkJaW5mby5hdHRyaWJ1dGVzID0gb2xkX253YXR0cjsKKwkJcmVzMiA9IG5jcF9tb2RpZnlfZmlsZV9vcl9zdWJkaXJfZG9zX2luZm9fcGF0aChOQ1BfU0VSVkVSKG9sZF9pbm9kZSksIG9sZF9pbm9kZSwgTlVMTCwgRE1fQVRUUklCVVRFUywgJmluZm8pOworCQkvKiBpZ25vcmUgZXJyb3JzICovCisJfQorCWlmIChuZXdfbndhdHRyX2NoYW5nZWQpCXsKKwkJaW5mby5hdHRyaWJ1dGVzID0gbmV3X253YXR0cjsKKwkJcmVzMiA9IG5jcF9tb2RpZnlfZmlsZV9vcl9zdWJkaXJfZG9zX2luZm9fcGF0aChOQ1BfU0VSVkVSKG5ld19kaXIpLCBuZXdfZGlyLCBfbmV3X25hbWUsIERNX0FUVFJJQlVURVMsICZpbmZvKTsKKwkJLyogaWdub3JlIGVycm9ycyAqLworCX0KKyAgICAgICAgcmV0dXJuKHJlcyk7Cit9CisjZW5kaWYJLyogQ09ORklHX05DUEZTX1NUUk9ORyAqLworCisKK3N0YXRpYyBpbnQKK19fbmNwX2xvb2t1cF92YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyOworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwlzdHJ1Y3QgaW5vZGUgKmRpcjsKKwlzdHJ1Y3QgbmNwX2VudHJ5X2luZm8gZmluZm87CisJaW50IHJlcywgdmFsID0gMCwgbGVuOworCV9fdTggX19uYW1lW05DUF9NQVhQQVRITEVOICsgMV07CisKKwlwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnkpOworCWRpciA9IHBhcmVudC0+ZF9pbm9kZTsKKworCWlmICghZGVudHJ5LT5kX2lub2RlKQorCQlnb3RvIGZpbmlzaGVkOworCisJc2VydmVyID0gTkNQX1NFUlZFUihkaXIpOworCisJaWYgKCFuY3BfY29ubl92YWxpZChzZXJ2ZXIpKQorCQlnb3RvIGZpbmlzaGVkOworCisJLyoKKwkgKiBJbnNwaXJlZCBieSBzbWJmczoKKwkgKiBUaGUgZGVmYXVsdCB2YWxpZGF0aW9uIGlzIGJhc2VkIG9uIGRlbnRyeSBhZ2U6CisJICogV2Ugc2V0IHRoZSBtYXggYWdlIGF0IG1vdW50IHRpbWUuICAoQnV0IGVhY2gKKwkgKiBzdWNjZXNzZnVsIHNlcnZlciBsb29rdXAgcmVuZXdzIHRoZSB0aW1lc3RhbXAuKQorCSAqLworCXZhbCA9IE5DUF9URVNUX0FHRShzZXJ2ZXIsIGRlbnRyeSk7CisJaWYgKHZhbCkKKwkJZ290byBmaW5pc2hlZDsKKworCUREUFJJTlRLKCJuY3BfbG9va3VwX3ZhbGlkYXRlOiAlcy8lcyBub3QgdmFsaWQsIGFnZT0lbGQsIHNlcnZlciBsb29rdXBcbiIsCisJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQlOQ1BfR0VUX0FHRShkZW50cnkpKTsKKworCWxlbiA9IHNpemVvZihfX25hbWUpOworCWlmIChuY3BfaXNfc2VydmVyX3Jvb3QoZGlyKSkgeworCQlyZXMgPSBuY3BfaW8ydm9sKHNlcnZlciwgX19uYW1lLCAmbGVuLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCSBkZW50cnktPmRfbmFtZS5sZW4sIDEpOworCQlpZiAoIXJlcykKKwkJCXJlcyA9IG5jcF9sb29rdXBfdm9sdW1lKHNlcnZlciwgX19uYW1lLCAmKGZpbmZvLmkpKTsKKwl9IGVsc2UgeworCQlyZXMgPSBuY3BfaW8ydm9sKHNlcnZlciwgX19uYW1lLCAmbGVuLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCSBkZW50cnktPmRfbmFtZS5sZW4sICFuY3BfcHJlc2VydmVfY2FzZShkaXIpKTsKKwkJaWYgKCFyZXMpCisJCQlyZXMgPSBuY3Bfb2J0YWluX2luZm8oc2VydmVyLCBkaXIsIF9fbmFtZSwgJihmaW5mby5pKSk7CisJfQorCWZpbmZvLnZvbHVtZSA9IGZpbmZvLmkudm9sTnVtYmVyOworCUREUFJJTlRLKCJuY3BfbG9va3VwX3ZhbGlkYXRlOiBsb29rZWQgZm9yICVzLyVzLCByZXM9JWRcbiIsCisJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBfX25hbWUsIHJlcyk7CisJLyoKKwkgKiBJZiB3ZSBkaWRuJ3QgZmluZCBpdCwgb3IgaWYgaXQgaGFzIGEgZGlmZmVyZW50IGRpckVudE51bSB0bworCSAqIHdoYXQgd2UgcmVtZW1iZXIsIGl0J3Mgbm90IHZhbGlkIGFueSBtb3JlLgorCSAqLworCWlmICghcmVzKSB7CisJCWlmIChmaW5mby5pLmRpckVudE51bSA9PSBOQ1BfRklORk8oZGVudHJ5LT5kX2lub2RlKS0+ZGlyRW50TnVtKSB7CisJCQluY3BfbmV3X2RlbnRyeShkZW50cnkpOworCQkJdmFsPTE7CisJCX0gZWxzZQorCQkJRERQUklOVEsoIm5jcF9sb29rdXBfdmFsaWRhdGU6IGZvdW5kLCBidXQgZGlyRW50TnVtIGNoYW5nZWRcbiIpOworCisJCW5jcF91cGRhdGVfaW5vZGUyKGRlbnRyeS0+ZF9pbm9kZSwgJmZpbmZvKTsKKwl9CisKK2ZpbmlzaGVkOgorCUREUFJJTlRLKCJuY3BfbG9va3VwX3ZhbGlkYXRlOiByZXN1bHQ9JWRcbiIsIHZhbCk7CisJZHB1dChwYXJlbnQpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQKK25jcF9sb29rdXBfdmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IHJlczsKKwlsb2NrX2tlcm5lbCgpOworCXJlcyA9IF9fbmNwX2xvb2t1cF92YWxpZGF0ZShkZW50cnksIG5kKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKgorbmNwX2RnZXRfZnBvcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgdW5zaWduZWQgbG9uZyBmcG9zKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnQgPSBkZW50cnk7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dDsKKworCWlmIChkX3ZhbGlkYXRlKGRlbnQsIHBhcmVudCkpIHsKKwkJaWYgKGRlbnQtPmRfbmFtZS5sZW4gPD0gTkNQX01BWFBBVEhMRU4gJiYKKwkJICAgICh1bnNpZ25lZCBsb25nKWRlbnQtPmRfZnNkYXRhID09IGZwb3MpIHsKKwkJCWlmICghZGVudC0+ZF9pbm9kZSkgeworCQkJCWRwdXQoZGVudCk7CisJCQkJZGVudCA9IE5VTEw7CisJCQl9CisJCQlyZXR1cm4gZGVudDsKKwkJfQorCQlkcHV0KGRlbnQpOworCX0KKworCS8qIElmIGEgcG9pbnRlciBpcyBpbnZhbGlkLCB3ZSBzZWFyY2ggdGhlIGRlbnRyeS4gKi8KKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwluZXh0ID0gcGFyZW50LT5kX3N1YmRpcnMubmV4dDsKKwl3aGlsZSAobmV4dCAhPSAmcGFyZW50LT5kX3N1YmRpcnMpIHsKKwkJZGVudCA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IGRlbnRyeSwgZF9jaGlsZCk7CisJCWlmICgodW5zaWduZWQgbG9uZylkZW50LT5kX2ZzZGF0YSA9PSBmcG9zKSB7CisJCQlpZiAoZGVudC0+ZF9pbm9kZSkKKwkJCQlkZ2V0X2xvY2tlZChkZW50KTsKKwkJCWVsc2UKKwkJCQlkZW50ID0gTlVMTDsKKwkJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCQlnb3RvIG91dDsKKwkJfQorCQluZXh0ID0gbmV4dC0+bmV4dDsKKwl9CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwlyZXR1cm4gTlVMTDsKKworb3V0OgorCXJldHVybiBkZW50OworfQorCitzdGF0aWMgdGltZV90IG5jcF9vYnRhaW5fbXRpbWUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciA9IE5DUF9TRVJWRVIoaW5vZGUpOworCXN0cnVjdCBud19pbmZvX3N0cnVjdCBpOworCisJaWYgKCFuY3BfY29ubl92YWxpZChzZXJ2ZXIpIHx8IG5jcF9pc19zZXJ2ZXJfcm9vdChpbm9kZSkpCisJCXJldHVybiAwOworCisJaWYgKG5jcF9vYnRhaW5faW5mbyhzZXJ2ZXIsIGlub2RlLCBOVUxMLCAmaSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIG5jcF9kYXRlX2RvczJ1bml4KGkubW9kaWZ5VGltZSwgaS5tb2RpZnlEYXRlKTsKK30KKworc3RhdGljIGludCBuY3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gTkNQX1NFUlZFUihpbm9kZSk7CisJdW5pb24gIG5jcF9kaXJfY2FjaGUgKmNhY2hlID0gTlVMTDsKKwlzdHJ1Y3QgbmNwX2NhY2hlX2NvbnRyb2wgY3RsOworCWludCByZXN1bHQsIG10aW1lX3ZhbGlkID0gMDsKKwl0aW1lX3QgbXRpbWUgPSAwOworCisJbG9ja19rZXJuZWwoKTsKKworCWN0bC5wYWdlICA9IE5VTEw7CisJY3RsLmNhY2hlID0gTlVMTDsKKworCUREUFJJTlRLKCJuY3BfcmVhZGRpcjogcmVhZGluZyAlcy8lcywgcG9zPSVkXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJKGludCkgZmlscC0+Zl9wb3MpOworCisJcmVzdWx0ID0gLUVJTzsKKwlpZiAoIW5jcF9jb25uX3ZhbGlkKHNlcnZlcikpCisJCWdvdG8gb3V0OworCisJcmVzdWx0ID0gMDsKKwlpZiAoZmlscC0+Zl9wb3MgPT0gMCkgeworCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgMCwgaW5vZGUtPmlfaW5vLCBEVF9ESVIpKQorCQkJZ290byBvdXQ7CisJCWZpbHAtPmZfcG9zID0gMTsKKwl9CisJaWYgKGZpbHAtPmZfcG9zID09IDEpIHsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLi4iLCAyLCAxLCBwYXJlbnRfaW5vKGRlbnRyeSksIERUX0RJUikpCisJCQlnb3RvIG91dDsKKwkJZmlscC0+Zl9wb3MgPSAyOworCX0KKworCXBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UoJmlub2RlLT5pX2RhdGEsIDApOworCWlmICghcGFnZSkKKwkJZ290byByZWFkX3JlYWxseTsKKworCWN0bC5jYWNoZSA9IGNhY2hlID0ga21hcChwYWdlKTsKKwljdGwuaGVhZCAgPSBjYWNoZS0+aGVhZDsKKworCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpIHx8ICFjdGwuaGVhZC5lb2YpCisJCWdvdG8gaW5pdF9jYWNoZTsKKworCWlmIChmaWxwLT5mX3BvcyA9PSAyKSB7CisJCWlmIChqaWZmaWVzIC0gY3RsLmhlYWQudGltZSA+PSBOQ1BfTUFYX0FHRShzZXJ2ZXIpKQorCQkJZ290byBpbml0X2NhY2hlOworCisJCW10aW1lID0gbmNwX29idGFpbl9tdGltZShkZW50cnkpOworCQltdGltZV92YWxpZCA9IDE7CisJCWlmICgoIW10aW1lKSB8fCAobXRpbWUgIT0gY3RsLmhlYWQubXRpbWUpKQorCQkJZ290byBpbml0X2NhY2hlOworCX0KKworCWlmIChmaWxwLT5mX3BvcyA+IGN0bC5oZWFkLmVuZCkKKwkJZ290byBmaW5pc2hlZDsKKworCWN0bC5mcG9zID0gZmlscC0+Zl9wb3MgKyAoTkNQX0RJUkNBQ0hFX1NUQVJUIC0gMik7CisJY3RsLm9mcyAgPSBjdGwuZnBvcyAvIE5DUF9ESVJDQUNIRV9TSVpFOworCWN0bC5pZHggID0gY3RsLmZwb3MgJSBOQ1BfRElSQ0FDSEVfU0laRTsKKworCWZvciAoOzspIHsKKwkJaWYgKGN0bC5vZnMgIT0gMCkgeworCQkJY3RsLnBhZ2UgPSBmaW5kX2xvY2tfcGFnZSgmaW5vZGUtPmlfZGF0YSwgY3RsLm9mcyk7CisJCQlpZiAoIWN0bC5wYWdlKQorCQkJCWdvdG8gaW52YWxpZF9jYWNoZTsKKwkJCWN0bC5jYWNoZSA9IGttYXAoY3RsLnBhZ2UpOworCQkJaWYgKCFQYWdlVXB0b2RhdGUoY3RsLnBhZ2UpKQorCQkJCWdvdG8gaW52YWxpZF9jYWNoZTsKKwkJfQorCQl3aGlsZSAoY3RsLmlkeCA8IE5DUF9ESVJDQUNIRV9TSVpFKSB7CisJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50OworCQkJaW50IHJlczsKKworCQkJZGVudCA9IG5jcF9kZ2V0X2Zwb3MoY3RsLmNhY2hlLT5kZW50cnlbY3RsLmlkeF0sCisJCQkJCQlkZW50cnksIGZpbHAtPmZfcG9zKTsKKwkJCWlmICghZGVudCkKKwkJCQlnb3RvIGludmFsaWRfY2FjaGU7CisJCQlyZXMgPSBmaWxsZGlyKGRpcmVudCwgZGVudC0+ZF9uYW1lLm5hbWUsCisJCQkJCWRlbnQtPmRfbmFtZS5sZW4sIGZpbHAtPmZfcG9zLAorCQkJCQlkZW50LT5kX2lub2RlLT5pX2lubywgRFRfVU5LTk9XTik7CisJCQlkcHV0KGRlbnQpOworCQkJaWYgKHJlcykKKwkJCQlnb3RvIGZpbmlzaGVkOworCQkJZmlscC0+Zl9wb3MgKz0gMTsKKwkJCWN0bC5pZHggKz0gMTsKKwkJCWlmIChmaWxwLT5mX3BvcyA+IGN0bC5oZWFkLmVuZCkKKwkJCQlnb3RvIGZpbmlzaGVkOworCQl9CisJCWlmIChjdGwucGFnZSkgeworCQkJa3VubWFwKGN0bC5wYWdlKTsKKwkJCVNldFBhZ2VVcHRvZGF0ZShjdGwucGFnZSk7CisJCQl1bmxvY2tfcGFnZShjdGwucGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UoY3RsLnBhZ2UpOworCQkJY3RsLnBhZ2UgPSBOVUxMOworCQl9CisJCWN0bC5pZHggID0gMDsKKwkJY3RsLm9mcyArPSAxOworCX0KK2ludmFsaWRfY2FjaGU6CisJaWYgKGN0bC5wYWdlKSB7CisJCWt1bm1hcChjdGwucGFnZSk7CisJCXVubG9ja19wYWdlKGN0bC5wYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKGN0bC5wYWdlKTsKKwkJY3RsLnBhZ2UgPSBOVUxMOworCX0KKwljdGwuY2FjaGUgPSBjYWNoZTsKK2luaXRfY2FjaGU6CisJbmNwX2ludmFsaWRhdGVfZGlyY2FjaGVfZW50cmllcyhkZW50cnkpOworCWlmICghbXRpbWVfdmFsaWQpIHsKKwkJbXRpbWUgPSBuY3Bfb2J0YWluX210aW1lKGRlbnRyeSk7CisJCW10aW1lX3ZhbGlkID0gMTsKKwl9CisJY3RsLmhlYWQubXRpbWUgPSBtdGltZTsKKwljdGwuaGVhZC50aW1lID0gamlmZmllczsKKwljdGwuaGVhZC5lb2YgPSAwOworCWN0bC5mcG9zID0gMjsKKwljdGwub2ZzID0gMDsKKwljdGwuaWR4ID0gTkNQX0RJUkNBQ0hFX1NUQVJUOworCWN0bC5maWxsZWQgPSAwOworCWN0bC52YWxpZCAgPSAxOworcmVhZF9yZWFsbHk6CisJaWYgKG5jcF9pc19zZXJ2ZXJfcm9vdChpbm9kZSkpIHsKKwkJbmNwX3JlYWRfdm9sdW1lX2xpc3QoZmlscCwgZGlyZW50LCBmaWxsZGlyLCAmY3RsKTsKKwl9IGVsc2UgeworCQluY3BfZG9fcmVhZGRpcihmaWxwLCBkaXJlbnQsIGZpbGxkaXIsICZjdGwpOworCX0KKwljdGwuaGVhZC5lbmQgPSBjdGwuZnBvcyAtIDE7CisJY3RsLmhlYWQuZW9mID0gY3RsLnZhbGlkOworZmluaXNoZWQ6CisJaWYgKHBhZ2UpIHsKKwkJY2FjaGUtPmhlYWQgPSBjdGwuaGVhZDsKKwkJa3VubWFwKHBhZ2UpOworCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJfQorCWlmIChjdGwucGFnZSkgeworCQlrdW5tYXAoY3RsLnBhZ2UpOworCQlTZXRQYWdlVXB0b2RhdGUoY3RsLnBhZ2UpOworCQl1bmxvY2tfcGFnZShjdGwucGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShjdGwucGFnZSk7CisJfQorb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CituY3BfZmlsbF9jYWNoZShzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpciwKKwkJc3RydWN0IG5jcF9jYWNoZV9jb250cm9sICpjdHJsLCBzdHJ1Y3QgbmNwX2VudHJ5X2luZm8gKmVudHJ5KQoreworCXN0cnVjdCBkZW50cnkgKm5ld2RlbnQsICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKm5ld2lubywgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBuY3BfY2FjaGVfY29udHJvbCBjdGwgPSAqY3RybDsKKwlzdHJ1Y3QgcXN0ciBxbmFtZTsKKwlpbnQgdmFsaWQgPSAwOworCWludCBoYXNoZWQgPSAwOworCWlub190IGlubyA9IDA7CisJX191OCBfX25hbWVbTkNQX01BWFBBVEhMRU4gKyAxXTsKKworCXFuYW1lLmxlbiA9IHNpemVvZihfX25hbWUpOworCWlmIChuY3Bfdm9sMmlvKE5DUF9TRVJWRVIoaW5vZGUpLCBfX25hbWUsICZxbmFtZS5sZW4sCisJCQllbnRyeS0+aS5lbnRyeU5hbWUsIGVudHJ5LT5pLm5hbWVMZW4sCisJCQkhbmNwX3ByZXNlcnZlX2VudHJ5X2Nhc2UoaW5vZGUsIGVudHJ5LT5pLk5TQ3JlYXRvcikpKQorCQlyZXR1cm4gMTsgLyogSSdtIG5vdCBzdXJlICovCisKKwlxbmFtZS5uYW1lID0gX19uYW1lOworCXFuYW1lLmhhc2ggPSBmdWxsX25hbWVfaGFzaChxbmFtZS5uYW1lLCBxbmFtZS5sZW4pOworCisJaWYgKGRlbnRyeS0+ZF9vcCAmJiBkZW50cnktPmRfb3AtPmRfaGFzaCkKKwkJaWYgKGRlbnRyeS0+ZF9vcC0+ZF9oYXNoKGRlbnRyeSwgJnFuYW1lKSAhPSAwKQorCQkJZ290byBlbmRfYWR2YW5jZTsKKworCW5ld2RlbnQgPSBkX2xvb2t1cChkZW50cnksICZxbmFtZSk7CisKKwlpZiAoIW5ld2RlbnQpIHsKKwkJbmV3ZGVudCA9IGRfYWxsb2MoZGVudHJ5LCAmcW5hbWUpOworCQlpZiAoIW5ld2RlbnQpCisJCQlnb3RvIGVuZF9hZHZhbmNlOworCX0gZWxzZSB7CisJCWhhc2hlZCA9IDE7CisJCW1lbWNweSgoY2hhciAqKSBuZXdkZW50LT5kX25hbWUubmFtZSwgcW5hbWUubmFtZSwKKwkJCQkJCQluZXdkZW50LT5kX25hbWUubGVuKTsKKwl9CisKKwlpZiAoIW5ld2RlbnQtPmRfaW5vZGUpIHsKKwkJZW50cnktPm9wZW5lZCA9IDA7CisJCWVudHJ5LT5pbm8gPSBpdW5pcXVlKGlub2RlLT5pX3NiLCAyKTsKKwkJbmV3aW5vID0gbmNwX2lnZXQoaW5vZGUtPmlfc2IsIGVudHJ5KTsKKwkJaWYgKG5ld2lubykgeworCQkJbmV3ZGVudC0+ZF9vcCA9ICZuY3BfZGVudHJ5X29wZXJhdGlvbnM7CisJCQlkX2luc3RhbnRpYXRlKG5ld2RlbnQsIG5ld2lubyk7CisJCQlpZiAoIWhhc2hlZCkKKwkJCQlkX3JlaGFzaChuZXdkZW50KTsKKwkJfQorCX0gZWxzZQorCQluY3BfdXBkYXRlX2lub2RlMihuZXdkZW50LT5kX2lub2RlLCBlbnRyeSk7CisKKwlpZiAobmV3ZGVudC0+ZF9pbm9kZSkgeworCQlpbm8gPSBuZXdkZW50LT5kX2lub2RlLT5pX2lubzsKKwkJbmV3ZGVudC0+ZF9mc2RhdGEgPSAodm9pZCAqKSBjdGwuZnBvczsKKwkJbmNwX25ld19kZW50cnkobmV3ZGVudCk7CisJfQorCisJaWYgKGN0bC5pZHggPj0gTkNQX0RJUkNBQ0hFX1NJWkUpIHsKKwkJaWYgKGN0bC5wYWdlKSB7CisJCQlrdW5tYXAoY3RsLnBhZ2UpOworCQkJU2V0UGFnZVVwdG9kYXRlKGN0bC5wYWdlKTsKKwkJCXVubG9ja19wYWdlKGN0bC5wYWdlKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShjdGwucGFnZSk7CisJCX0KKwkJY3RsLmNhY2hlID0gTlVMTDsKKwkJY3RsLmlkeCAgLT0gTkNQX0RJUkNBQ0hFX1NJWkU7CisJCWN0bC5vZnMgICs9IDE7CisJCWN0bC5wYWdlICA9IGdyYWJfY2FjaGVfcGFnZSgmaW5vZGUtPmlfZGF0YSwgY3RsLm9mcyk7CisJCWlmIChjdGwucGFnZSkKKwkJCWN0bC5jYWNoZSA9IGttYXAoY3RsLnBhZ2UpOworCX0KKwlpZiAoY3RsLmNhY2hlKSB7CisJCWN0bC5jYWNoZS0+ZGVudHJ5W2N0bC5pZHhdID0gbmV3ZGVudDsKKwkJdmFsaWQgPSAxOworCX0KKwlkcHV0KG5ld2RlbnQpOworZW5kX2FkdmFuY2U6CisJaWYgKCF2YWxpZCkKKwkJY3RsLnZhbGlkID0gMDsKKwlpZiAoIWN0bC5maWxsZWQgJiYgKGN0bC5mcG9zID09IGZpbHAtPmZfcG9zKSkgeworCQlpZiAoIWlubykKKwkJCWlubyA9IGZpbmRfaW5vZGVfbnVtYmVyKGRlbnRyeSwgJnFuYW1lKTsKKwkJaWYgKCFpbm8pCisJCQlpbm8gPSBpdW5pcXVlKGlub2RlLT5pX3NiLCAyKTsKKwkJY3RsLmZpbGxlZCA9IGZpbGxkaXIoZGlyZW50LCBxbmFtZS5uYW1lLCBxbmFtZS5sZW4sCisJCQkJICAgICBmaWxwLT5mX3BvcywgaW5vLCBEVF9VTktOT1dOKTsKKwkJaWYgKCFjdGwuZmlsbGVkKQorCQkJZmlscC0+Zl9wb3MgKz0gMTsKKwl9CisJY3RsLmZwb3MgKz0gMTsKKwljdGwuaWR4ICArPSAxOworCSpjdHJsID0gY3RsOworCXJldHVybiAoY3RsLnZhbGlkIHx8ICFjdGwuZmlsbGVkKTsKK30KKworc3RhdGljIHZvaWQKK25jcF9yZWFkX3ZvbHVtZV9saXN0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyLAorCQkJc3RydWN0IG5jcF9jYWNoZV9jb250cm9sICpjdGwpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlscC0+Zl9kZW50cnk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gTkNQX1NFUlZFUihpbm9kZSk7CisJc3RydWN0IG5jcF92b2x1bWVfaW5mbyBpbmZvOworCXN0cnVjdCBuY3BfZW50cnlfaW5mbyBlbnRyeTsKKwlpbnQgaTsKKworCURQUklOVEsoIm5jcF9yZWFkX3ZvbHVtZV9saXN0OiBwb3M9JWxkXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpIGZpbHAtPmZfcG9zKTsKKworCWZvciAoaSA9IDA7IGkgPCBOQ1BfTlVNQkVSX09GX1ZPTFVNRVM7IGkrKykgeworCisJCWlmIChuY3BfZ2V0X3ZvbHVtZV9pbmZvX3dpdGhfbnVtYmVyKHNlcnZlciwgaSwgJmluZm8pICE9IDApCisJCQlyZXR1cm47CisJCWlmICghc3RybGVuKGluZm8udm9sdW1lX25hbWUpKQorCQkJY29udGludWU7CisKKwkJRFBSSU5USygibmNwX3JlYWRfdm9sdW1lX2xpc3Q6IGZvdW5kIHZvbDogJXNcbiIsCisJCQlpbmZvLnZvbHVtZV9uYW1lKTsKKworCQlpZiAobmNwX2xvb2t1cF92b2x1bWUoc2VydmVyLCBpbmZvLnZvbHVtZV9uYW1lLAorCQkJCQkmZW50cnkuaSkpIHsKKwkJCURQUklOVEsoIm5jcGZzOiBjb3VsZCBub3QgbG9va3VwIHZvbCAlc1xuIiwKKwkJCQlpbmZvLnZvbHVtZV9uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVudHJ5LnZvbHVtZSA9IGVudHJ5Lmkudm9sTnVtYmVyOworCQlpZiAoIW5jcF9maWxsX2NhY2hlKGZpbHAsIGRpcmVudCwgZmlsbGRpciwgY3RsLCAmZW50cnkpKQorCQkJcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQKK25jcF9kb19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyLAorCQkJCQkJc3RydWN0IG5jcF9jYWNoZV9jb250cm9sICpjdGwpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlscC0+Zl9kZW50cnk7CisJc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciA9IE5DUF9TRVJWRVIoZGlyKTsKKwlzdHJ1Y3Qgbndfc2VhcmNoX3NlcXVlbmNlIHNlcTsKKwlzdHJ1Y3QgbmNwX2VudHJ5X2luZm8gZW50cnk7CisJaW50IGVycjsKKwl2b2lkKiBidWY7CisJaW50IG1vcmU7CisJc2l6ZV90IGJ1ZnNpemU7CisKKwlEUFJJTlRLKCJuY3BfZG9fcmVhZGRpcjogJXMvJXMsIGZwb3M9JWxkXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJKHVuc2lnbmVkIGxvbmcpIGZpbHAtPmZfcG9zKTsKKwlQUFJJTlRLKCJuY3BfZG9fcmVhZGRpcjogaW5pdCAlcywgdm9sbnVtPSVkLCBkaXJlbnQ9JXVcbiIsCisJCWRlbnRyeS0+ZF9uYW1lLm5hbWUsIE5DUF9GSU5GTyhkaXIpLT52b2xOdW1iZXIsCisJCU5DUF9GSU5GTyhkaXIpLT5kaXJFbnROdW0pOworCisJZXJyID0gbmNwX2luaXRpYWxpemVfc2VhcmNoKHNlcnZlciwgZGlyLCAmc2VxKTsKKwlpZiAoZXJyKSB7CisJCURQUklOVEsoIm5jcF9kb19yZWFkZGlyOiBpbml0IGZhaWxlZCwgZXJyPSVkXG4iLCBlcnIpOworCQlyZXR1cm47CisJfQorI2lmZGVmIFVTRV9PTERfU0xPV19ESVJFQ1RPUllfTElTVElORworCWZvciAoOzspIHsKKwkJZXJyID0gbmNwX3NlYXJjaF9mb3JfZmlsZV9vcl9zdWJkaXIoc2VydmVyLCAmc2VxLCAmZW50cnkuaSk7CisJCWlmIChlcnIpIHsKKwkJCURQUklOVEsoIm5jcF9kb19yZWFkZGlyOiBzZWFyY2ggZmFpbGVkLCBlcnI9JWRcbiIsIGVycik7CisJCQlicmVhazsKKwkJfQorCQllbnRyeS52b2x1bWUgPSBlbnRyeS5pLnZvbE51bWJlcjsKKwkJaWYgKCFuY3BfZmlsbF9jYWNoZShmaWxwLCBkaXJlbnQsIGZpbGxkaXIsIGN0bCwgJmVudHJ5KSkKKwkJCWJyZWFrOworCX0KKyNlbHNlCisJLyogV2UgTVVTVCBOT1QgdXNlIHNlcnZlci0+YnVmZmVyX3NpemUgaGFuZHNoYWtlZCB3aXRoIHNlcnZlciBpZiB3ZSBhcmUKKwkgICB1c2luZyBVRFAsIGFzIGZvciBVRFAgc2VydmVyIHVzZXMgbWF4LiBidWZmZXIgc2l6ZSBkZXRlcm1pbmVkIGJ5CisJICAgTVRVLCBhbmQgZm9yIFRDUCBzZXJ2ZXIgdXNlcyBoYXJkd2lyZWQgdmFsdWUgNjVLQiAoPT0gNjY1NjAgYnl0ZXMpLiAKKwkgICBTbyB3ZSB1c2UgMTI4S0IsIGp1c3QgdG8gYmUgc3VyZSwgYXMgdGhlcmUgaXMgbm8gd2F5IGhvdyB0byBrbm93CisJICAgdGhpcyB2YWx1ZSBpbiBhZHZhbmNlLiAqLworCWJ1ZnNpemUgPSAxMzEwNzI7CisJYnVmID0gdm1hbGxvYyhidWZzaXplKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCWRvIHsKKwkJaW50IGNudDsKKwkJY2hhciogcnBsOworCQlzaXplX3QgcnBsczsKKworCQllcnIgPSBuY3Bfc2VhcmNoX2Zvcl9maWxlc2V0KHNlcnZlciwgJnNlcSwgJm1vcmUsICZjbnQsIGJ1ZiwgYnVmc2l6ZSwgJnJwbCwgJnJwbHMpOworCQlpZiAoZXJyKQkJLyogRXJyb3IgKi8KKwkJCWJyZWFrOworCQlpZiAoIWNudCkJCS8qIHByZXZlbnQgZW5kbGVzcyBsb29wICovCisJCQlicmVhazsKKwkJd2hpbGUgKGNudC0tKSB7CisJCQlzaXplX3Qgb25lcnBsOworCQkJCisJCQlpZiAocnBscyA8IG9mZnNldG9mKHN0cnVjdCBud19pbmZvX3N0cnVjdCwgZW50cnlOYW1lKSkKKwkJCQlicmVhazsJLyogc2hvcnQgcGFja2V0ICovCisJCQluY3BfZXh0cmFjdF9maWxlX2luZm8ocnBsLCAmZW50cnkuaSk7CisJCQlvbmVycGwgPSBvZmZzZXRvZihzdHJ1Y3QgbndfaW5mb19zdHJ1Y3QsIGVudHJ5TmFtZSkgKyBlbnRyeS5pLm5hbWVMZW47CisJCQlpZiAocnBscyA8IG9uZXJwbCkKKwkJCQlicmVhazsJLyogc2hvcnQgcGFja2V0ICovCisJCQkodm9pZCluY3Bfb2J0YWluX25mc19pbmZvKHNlcnZlciwgJmVudHJ5LmkpOworCQkJcnBsICs9IG9uZXJwbDsKKwkJCXJwbHMgLT0gb25lcnBsOworCQkJZW50cnkudm9sdW1lID0gZW50cnkuaS52b2xOdW1iZXI7CisJCQlpZiAoIW5jcF9maWxsX2NhY2hlKGZpbHAsIGRpcmVudCwgZmlsbGRpciwgY3RsLCAmZW50cnkpKQorCQkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAobW9yZSk7CisJdmZyZWUoYnVmKTsKKyNlbmRpZgorCXJldHVybjsKK30KKworaW50IG5jcF9jb25uX2xvZ2dlZF9pbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBuY3Bfc2VydmVyKiBzZXJ2ZXIgPSBOQ1BfU0JQKHNiKTsKKwlpbnQgcmVzdWx0OworCisJaWYgKG5jcF9zaW5nbGVfdm9sdW1lKHNlcnZlcikpIHsKKwkJaW50IGxlbjsKKwkJc3RydWN0IGRlbnRyeSogZGVudDsKKwkJX191MzIgdm9sTnVtYmVyOworCQlfX2xlMzIgZGlyRW50TnVtOworCQlfX2xlMzIgRG9zRGlyTnVtOworCQlfX3U4IF9fbmFtZVtOQ1BfTUFYUEFUSExFTiArIDFdOworCisJCWxlbiA9IHNpemVvZihfX25hbWUpOworCQlyZXN1bHQgPSBuY3BfaW8ydm9sKHNlcnZlciwgX19uYW1lLCAmbGVuLCBzZXJ2ZXItPm0ubW91bnRlZF92b2wsCisJCQkJICAgIHN0cmxlbihzZXJ2ZXItPm0ubW91bnRlZF92b2wpLCAxKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWdvdG8gb3V0OworCQlyZXN1bHQgPSAtRU5PRU5UOworCQlpZiAobmNwX2dldF92b2x1bWVfcm9vdChzZXJ2ZXIsIF9fbmFtZSwgJnZvbE51bWJlciwgJmRpckVudE51bSwgJkRvc0Rpck51bSkpIHsKKwkJCVBQUklOVEsoIm5jcF9jb25uX2xvZ2dlZF9pbjogJXMgbm90IGZvdW5kXG4iLAorCQkJCXNlcnZlci0+bS5tb3VudGVkX3ZvbCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlkZW50ID0gc2ItPnNfcm9vdDsKKwkJaWYgKGRlbnQpIHsKKwkJCXN0cnVjdCBpbm9kZSogaW5vID0gZGVudC0+ZF9pbm9kZTsKKwkJCWlmIChpbm8pIHsKKwkJCQlOQ1BfRklORk8oaW5vKS0+dm9sTnVtYmVyID0gdm9sTnVtYmVyOworCQkJCU5DUF9GSU5GTyhpbm8pLT5kaXJFbnROdW0gPSBkaXJFbnROdW07CisJCQkJTkNQX0ZJTkZPKGlubyktPkRvc0Rpck51bSA9IERvc0Rpck51bTsKKwkJCX0gZWxzZSB7CisJCQkJRFBSSU5USygibmNwZnM6IHNiLT5zX3Jvb3QtPmRfaW5vZGUgPT0gTlVMTCFcbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJRFBSSU5USygibmNwZnM6IHNiLT5zX3Jvb3QgPT0gTlVMTCFcbiIpOworCQl9CisJfQorCXJlc3VsdCA9IDA7CisKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqbmNwX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gTkNQX1NFUlZFUihkaXIpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCXN0cnVjdCBuY3BfZW50cnlfaW5mbyBmaW5mbzsKKwlpbnQgZXJyb3IsIHJlcywgbGVuOworCV9fdTggX19uYW1lW05DUF9NQVhQQVRITEVOICsgMV07CisKKwlsb2NrX2tlcm5lbCgpOworCWVycm9yID0gLUVJTzsKKwlpZiAoIW5jcF9jb25uX3ZhbGlkKHNlcnZlcikpCisJCWdvdG8gZmluaXNoZWQ7CisKKwlQUFJJTlRLKCJuY3BfbG9va3VwOiBzZXJ2ZXIgbG9va3VwIGZvciAlcy8lc1xuIiwKKwkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJbGVuID0gc2l6ZW9mKF9fbmFtZSk7CisJaWYgKG5jcF9pc19zZXJ2ZXJfcm9vdChkaXIpKSB7CisJCXJlcyA9IG5jcF9pbzJ2b2woc2VydmVyLCBfX25hbWUsICZsZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJIGRlbnRyeS0+ZF9uYW1lLmxlbiwgMSk7CisJCWlmICghcmVzKQorCQkJcmVzID0gbmNwX2xvb2t1cF92b2x1bWUoc2VydmVyLCBfX25hbWUsICYoZmluZm8uaSkpOworCX0gZWxzZSB7CisJCXJlcyA9IG5jcF9pbzJ2b2woc2VydmVyLCBfX25hbWUsICZsZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJIGRlbnRyeS0+ZF9uYW1lLmxlbiwgIW5jcF9wcmVzZXJ2ZV9jYXNlKGRpcikpOworCQlpZiAoIXJlcykKKwkJCXJlcyA9IG5jcF9vYnRhaW5faW5mbyhzZXJ2ZXIsIGRpciwgX19uYW1lLCAmKGZpbmZvLmkpKTsKKwl9CisJUFBSSU5USygibmNwX2xvb2t1cDogbG9va2VkIGZvciAlcy8lcywgcmVzPSVkXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgX19uYW1lLCByZXMpOworCS8qCisJICogSWYgd2UgZGlkbid0IGZpbmQgYW4gZW50cnksIG1ha2UgYSBuZWdhdGl2ZSBkZW50cnkuCisJICovCisJaWYgKHJlcykKKwkJZ290byBhZGRfZW50cnk7CisKKwkvKgorCSAqIENyZWF0ZSBhbiBpbm9kZSBmb3IgdGhlIGVudHJ5LgorCSAqLworCWZpbmZvLm9wZW5lZCA9IDA7CisJZmluZm8uaW5vID0gaXVuaXF1ZShkaXItPmlfc2IsIDIpOworCWZpbmZvLnZvbHVtZSA9IGZpbmZvLmkudm9sTnVtYmVyOworCWVycm9yID0gLUVBQ0NFUzsKKwlpbm9kZSA9IG5jcF9pZ2V0KGRpci0+aV9zYiwgJmZpbmZvKTsKKworCWlmIChpbm9kZSkgeworCQluY3BfbmV3X2RlbnRyeShkZW50cnkpOworYWRkX2VudHJ5OgorCQlkZW50cnktPmRfb3AgPSAmbmNwX2RlbnRyeV9vcGVyYXRpb25zOworCQlkX2FkZChkZW50cnksIGlub2RlKTsKKwkJZXJyb3IgPSAwOworCX0KKworZmluaXNoZWQ6CisJUFBSSU5USygibmNwX2xvb2t1cDogcmVzdWx0PSVkXG4iLCBlcnJvcik7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBFUlJfUFRSKGVycm9yKTsKK30KKworLyoKKyAqIFRoaXMgY29kZSBpcyBjb21tb24gdG8gY3JlYXRlLCBta2RpciwgYW5kIG1rbm9kLgorICovCitzdGF0aWMgaW50IG5jcF9pbnN0YW50aWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJc3RydWN0IG5jcF9lbnRyeV9pbmZvICpmaW5mbykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnJvciA9IC1FSU5WQUw7CisKKwlmaW5mby0+aW5vID0gaXVuaXF1ZShkaXItPmlfc2IsIDIpOworCWlub2RlID0gbmNwX2lnZXQoZGlyLT5pX3NiLCBmaW5mbyk7CisJaWYgKCFpbm9kZSkKKwkJZ290byBvdXRfY2xvc2U7CisJZF9pbnN0YW50aWF0ZShkZW50cnksaW5vZGUpOworCWVycm9yID0gMDsKK291dDoKKwlyZXR1cm4gZXJyb3I7CisKK291dF9jbG9zZToKKwlQUFJJTlRLKCJuY3BfaW5zdGFudGlhdGU6ICVzLyVzIGZhaWxlZCwgY2xvc2luZyBmaWxlXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJbmNwX2Nsb3NlX2ZpbGUoTkNQX1NFUlZFUihkaXIpLCBmaW5mby0+ZmlsZV9oYW5kbGUpOworCWdvdG8gb3V0OworfQorCitpbnQgbmNwX2NyZWF0ZV9uZXcoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCSAgIGRldl90IHJkZXYsIF9fbGUzMiBhdHRyaWJ1dGVzKQoreworCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIgPSBOQ1BfU0VSVkVSKGRpcik7CisJc3RydWN0IG5jcF9lbnRyeV9pbmZvIGZpbmZvOworCWludCBlcnJvciwgcmVzdWx0LCBsZW47CisJaW50IG9wbW9kZTsKKwlfX3U4IF9fbmFtZVtOQ1BfTUFYUEFUSExFTiArIDFdOworCQorCVBQUklOVEsoIm5jcF9jcmVhdGVfbmV3OiBjcmVhdGluZyAlcy8lcywgbW9kZT0leFxuIiwKKwkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIG1vZGUpOworCisJZXJyb3IgPSAtRUlPOworCWxvY2tfa2VybmVsKCk7CisJaWYgKCFuY3BfY29ubl92YWxpZChzZXJ2ZXIpKQorCQlnb3RvIG91dDsKKworCW5jcF9hZ2VfZGVudHJ5KHNlcnZlciwgZGVudHJ5KTsKKwlsZW4gPSBzaXplb2YoX19uYW1lKTsKKwllcnJvciA9IG5jcF9pbzJ2b2woc2VydmVyLCBfX25hbWUsICZsZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkgICBkZW50cnktPmRfbmFtZS5sZW4sICFuY3BfcHJlc2VydmVfY2FzZShkaXIpKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSAtRUFDQ0VTOworCQorCWlmIChTX0lTUkVHKG1vZGUpICYmIAorCSAgICAoc2VydmVyLT5tLmZsYWdzICYgTkNQX01PVU5UX0VYVFJBUykgJiYgCisJICAgIChtb2RlICYgU19JWFVHTykpCisJCWF0dHJpYnV0ZXMgfD0gYVNZU1RFTSB8IGFTSEFSRUQ7CisJCisJcmVzdWx0ID0gbmNwX29wZW5fY3JlYXRlX2ZpbGVfb3Jfc3ViZGlyKHNlcnZlciwgZGlyLCBfX25hbWUsCisJCQkJT0NfTU9ERV9DUkVBVEUgfCBPQ19NT0RFX09QRU4gfCBPQ19NT0RFX1JFUExBQ0UsCisJCQkJYXR0cmlidXRlcywgQVJfUkVBRCB8IEFSX1dSSVRFLCAmZmluZm8pOworCW9wbW9kZSA9IE9fUkRXUjsKKwlpZiAocmVzdWx0KSB7CisJCXJlc3VsdCA9IG5jcF9vcGVuX2NyZWF0ZV9maWxlX29yX3N1YmRpcihzZXJ2ZXIsIGRpciwgX19uYW1lLAorCQkJCU9DX01PREVfQ1JFQVRFIHwgT0NfTU9ERV9PUEVOIHwgT0NfTU9ERV9SRVBMQUNFLAorCQkJCWF0dHJpYnV0ZXMsIEFSX1dSSVRFLCAmZmluZm8pOworCQlpZiAocmVzdWx0KSB7CisJCQlpZiAocmVzdWx0ID09IDB4ODcpCisJCQkJZXJyb3IgPSAtRU5BTUVUT09MT05HOworCQkJRFBSSU5USygibmNwX2NyZWF0ZTogJXMvJXMgZmFpbGVkXG4iLAorCQkJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCW9wbW9kZSA9IE9fV1JPTkxZOworCX0KKwlmaW5mby5hY2Nlc3MgPSBvcG1vZGU7CisJaWYgKG5jcF9pc19uZnNfZXh0cmFzKHNlcnZlciwgZmluZm8udm9sdW1lKSkgeworCQlmaW5mby5pLm5mcy5tb2RlID0gbW9kZTsKKwkJZmluZm8uaS5uZnMucmRldiA9IG5ld19lbmNvZGVfZGV2KHJkZXYpOworCQlpZiAobmNwX21vZGlmeV9uZnNfaW5mbyhzZXJ2ZXIsIGZpbmZvLnZvbHVtZSwKKwkJCQkJZmluZm8uaS5kaXJFbnROdW0sCisJCQkJCW1vZGUsIG5ld19lbmNvZGVfZGV2KHJkZXYpKSAhPSAwKQorCQkJZ290byBvdXQ7CisJfQorCisJZXJyb3IgPSBuY3BfaW5zdGFudGlhdGUoZGlyLCBkZW50cnksICZmaW5mbyk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBuY3BfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlyZXR1cm4gbmNwX2NyZWF0ZV9uZXcoZGlyLCBkZW50cnksIG1vZGUsIDAsIDApOworfQorCitzdGF0aWMgaW50IG5jcF9ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgbmNwX2VudHJ5X2luZm8gZmluZm87CisJc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciA9IE5DUF9TRVJWRVIoZGlyKTsKKwlpbnQgZXJyb3IsIGxlbjsKKwlfX3U4IF9fbmFtZVtOQ1BfTUFYUEFUSExFTiArIDFdOworCisJRFBSSU5USygibmNwX21rZGlyOiBtYWtpbmcgJXMvJXNcbiIsCisJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWVycm9yID0gLUVJTzsKKwlsb2NrX2tlcm5lbCgpOworCWlmICghbmNwX2Nvbm5fdmFsaWQoc2VydmVyKSkKKwkJZ290byBvdXQ7CisKKwluY3BfYWdlX2RlbnRyeShzZXJ2ZXIsIGRlbnRyeSk7CisJbGVuID0gc2l6ZW9mKF9fbmFtZSk7CisJZXJyb3IgPSBuY3BfaW8ydm9sKHNlcnZlciwgX19uYW1lLCAmbGVuLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJICAgZGVudHJ5LT5kX25hbWUubGVuLCAhbmNwX3ByZXNlcnZlX2Nhc2UoZGlyKSk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gLUVBQ0NFUzsKKwlpZiAobmNwX29wZW5fY3JlYXRlX2ZpbGVfb3Jfc3ViZGlyKHNlcnZlciwgZGlyLCBfX25hbWUsCisJCQkJCSAgIE9DX01PREVfQ1JFQVRFLCBhRElSLAorCQkJCQkgICBjcHVfdG9fbGUxNigweGZmZmYpLAorCQkJCQkgICAmZmluZm8pID09IDApCisJeworCQlpZiAobmNwX2lzX25mc19leHRyYXMoc2VydmVyLCBmaW5mby52b2x1bWUpKSB7CisJCQltb2RlIHw9IFNfSUZESVI7CisJCQlmaW5mby5pLm5mcy5tb2RlID0gbW9kZTsKKwkJCWlmIChuY3BfbW9kaWZ5X25mc19pbmZvKHNlcnZlciwKKwkJCQkJCWZpbmZvLnZvbHVtZSwKKwkJCQkJCWZpbmZvLmkuZGlyRW50TnVtLAorCQkJCQkJbW9kZSwgMCkgIT0gMCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQllcnJvciA9IG5jcF9pbnN0YW50aWF0ZShkaXIsIGRlbnRyeSwgJmZpbmZvKTsKKwl9CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBuY3Bfcm1kaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gTkNQX1NFUlZFUihkaXIpOworCWludCBlcnJvciwgcmVzdWx0LCBsZW47CisJX191OCBfX25hbWVbTkNQX01BWFBBVEhMRU4gKyAxXTsKKworCURQUklOVEsoIm5jcF9ybWRpcjogcmVtb3ZpbmcgJXMvJXNcbiIsCisJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWVycm9yID0gLUVJTzsKKwlsb2NrX2tlcm5lbCgpOworCWlmICghbmNwX2Nvbm5fdmFsaWQoc2VydmVyKSkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IC1FQlVTWTsKKwlpZiAoIWRfdW5oYXNoZWQoZGVudHJ5KSkKKwkJZ290byBvdXQ7CisKKwlsZW4gPSBzaXplb2YoX19uYW1lKTsKKwllcnJvciA9IG5jcF9pbzJ2b2woc2VydmVyLCBfX25hbWUsICZsZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkgICBkZW50cnktPmRfbmFtZS5sZW4sICFuY3BfcHJlc2VydmVfY2FzZShkaXIpKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJcmVzdWx0ID0gbmNwX2RlbF9maWxlX29yX3N1YmRpcihzZXJ2ZXIsIGRpciwgX19uYW1lKTsKKwlzd2l0Y2ggKHJlc3VsdCkgeworCQljYXNlIDB4MDA6CisJCQllcnJvciA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAweDg1OgkvKiB1bmF1dGhvcml6ZWQgdG8gZGVsZXRlIGZpbGUgKi8KKwkJY2FzZSAweDhBOgkvKiB1bmF1dGhvcml6ZWQgdG8gZGVsZXRlIGZpbGUgKi8KKwkJCWVycm9yID0gLUVBQ0NFUzsKKwkJCWJyZWFrOworCQljYXNlIDB4OEY6CisJCWNhc2UgMHg5MDoJLyogcmVhZCBvbmx5ICovCisJCQllcnJvciA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQljYXNlIDB4OUY6CS8qIGluIHVzZSBieSBhbm90aGVyIGNsaWVudCAqLworCQkJZXJyb3IgPSAtRUJVU1k7CisJCQlicmVhazsKKwkJY2FzZSAweEEwOgkvKiBkaXJlY3Rvcnkgbm90IGVtcHR5ICovCisJCQllcnJvciA9IC1FTk9URU1QVFk7CisJCQlicmVhazsKKwkJY2FzZSAweEZGOgkvKiBzb21lb25lIGRlbGV0ZWQgZmlsZSAqLworCQkJZXJyb3IgPSAtRU5PRU5UOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnJvciA9IC1FQUNDRVM7CisJCQlicmVhazsKKyAgICAgICAJfQorb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgbmNwX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlcjsKKwlpbnQgZXJyb3I7CisKKwlsb2NrX2tlcm5lbCgpOworCXNlcnZlciA9IE5DUF9TRVJWRVIoZGlyKTsKKwlEUFJJTlRLKCJuY3BfdW5saW5rOiB1bmxpbmtpbmcgJXMvJXNcbiIsCisJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkKKwllcnJvciA9IC1FSU87CisJaWYgKCFuY3BfY29ubl92YWxpZChzZXJ2ZXIpKQorCQlnb3RvIG91dDsKKworCS8qCisJICogQ2hlY2sgd2hldGhlciB0byBjbG9zZSB0aGUgZmlsZSAuLi4KKwkgKi8KKwlpZiAoaW5vZGUpIHsKKwkJUFBSSU5USygibmNwX3VubGluazogY2xvc2luZyBmaWxlXG4iKTsKKwkJbmNwX21ha2VfY2xvc2VkKGlub2RlKTsKKwl9CisKKwllcnJvciA9IG5jcF9kZWxfZmlsZV9vcl9zdWJkaXIyKHNlcnZlciwgZGVudHJ5KTsKKyNpZmRlZiBDT05GSUdfTkNQRlNfU1RST05HCisJLyogOUMgaXMgSW52YWxpZCBwYXRoLi4gSXQgc2hvdWxkIGJlIDhGLCA5MCAtIHJlYWQgb25seSwgYnV0CisJICAgaXQgaXMgbm90IDotKCAqLworCWlmICgoZXJyb3IgPT0gMHg5QyB8fCBlcnJvciA9PSAweDkwKSAmJiBzZXJ2ZXItPm0uZmxhZ3MgJiBOQ1BfTU9VTlRfU1RST05HKSB7IC8qIFIvTyAqLworCQllcnJvciA9IG5jcF9mb3JjZV91bmxpbmsoZGlyLCBkZW50cnkpOworCX0KKyNlbmRpZgorCXN3aXRjaCAoZXJyb3IpIHsKKwkJY2FzZSAweDAwOgorCQkJRFBSSU5USygibmNwOiByZW1vdmVkICVzLyVzXG4iLAorCQkJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIDB4ODU6CisJCWNhc2UgMHg4QToKKwkJCWVycm9yID0gLUVBQ0NFUzsKKwkJCWJyZWFrOworCQljYXNlIDB4OEQ6CS8qIHNvbWUgZmlsZXMgaW4gdXNlICovCisJCWNhc2UgMHg4RToJLyogYWxsIGZpbGVzIGluIHVzZSAqLworCQkJZXJyb3IgPSAtRUJVU1k7CisJCQlicmVhazsKKwkJY2FzZSAweDhGOgkvKiBzb21lIHJlYWQgb25seSAqLworCQljYXNlIDB4OTA6CS8qIGFsbCByZWFkIG9ubHkgKi8KKwkJY2FzZSAweDlDOgkvKiAhISEgcmV0dXJuZWQgd2hlbiBpbi11c2Ugb3IgcmVhZC1vbmx5IGJ5IE5XNCAqLworCQkJZXJyb3IgPSAtRVBFUk07CisJCQlicmVhazsKKwkJY2FzZSAweEZGOgorCQkJZXJyb3IgPSAtRU5PRU5UOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnJvciA9IC1FQUNDRVM7CisJCQlicmVhazsKKwl9CisJCQorb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgbmNwX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCSAgICAgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gTkNQX1NFUlZFUihvbGRfZGlyKTsKKwlpbnQgZXJyb3I7CisJaW50IG9sZF9sZW4sIG5ld19sZW47CisJX191OCBfX29sZF9uYW1lW05DUF9NQVhQQVRITEVOICsgMV0sIF9fbmV3X25hbWVbTkNQX01BWFBBVEhMRU4gKyAxXTsKKworCURQUklOVEsoIm5jcF9yZW5hbWU6ICVzLyVzIHRvICVzLyVzXG4iLAorCQlvbGRfZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIG9sZF9kZW50cnktPmRfbmFtZS5uYW1lLAorCQluZXdfZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIG5ld19kZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWVycm9yID0gLUVJTzsKKwlsb2NrX2tlcm5lbCgpOworCWlmICghbmNwX2Nvbm5fdmFsaWQoc2VydmVyKSkKKwkJZ290byBvdXQ7CisKKwluY3BfYWdlX2RlbnRyeShzZXJ2ZXIsIG9sZF9kZW50cnkpOworCW5jcF9hZ2VfZGVudHJ5KHNlcnZlciwgbmV3X2RlbnRyeSk7CisKKwlvbGRfbGVuID0gc2l6ZW9mKF9fb2xkX25hbWUpOworCWVycm9yID0gbmNwX2lvMnZvbChzZXJ2ZXIsIF9fb2xkX25hbWUsICZvbGRfbGVuLAorCQkJICAgb2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsIG9sZF9kZW50cnktPmRfbmFtZS5sZW4sCisJCQkgICAhbmNwX3ByZXNlcnZlX2Nhc2Uob2xkX2RpcikpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwluZXdfbGVuID0gc2l6ZW9mKF9fbmV3X25hbWUpOworCWVycm9yID0gbmNwX2lvMnZvbChzZXJ2ZXIsIF9fbmV3X25hbWUsICZuZXdfbGVuLAorCQkJICAgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsIG5ld19kZW50cnktPmRfbmFtZS5sZW4sCisJCQkgICAhbmNwX3ByZXNlcnZlX2Nhc2UobmV3X2RpcikpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IG5jcF9yZW5fb3JfbW92X2ZpbGVfb3Jfc3ViZGlyKHNlcnZlciwgb2xkX2RpciwgX19vbGRfbmFtZSwKKwkJCQkJCSAgICAgIG5ld19kaXIsIF9fbmV3X25hbWUpOworI2lmZGVmIENPTkZJR19OQ1BGU19TVFJPTkcKKwlpZiAoKGVycm9yID09IDB4OTAgfHwgZXJyb3IgPT0gMHg4QiB8fCBlcnJvciA9PSAtRUFDQ0VTKSAmJgorCQkJc2VydmVyLT5tLmZsYWdzICYgTkNQX01PVU5UX1NUUk9ORykgewkvKiBSTyAqLworCQllcnJvciA9IG5jcF9mb3JjZV9yZW5hbWUob2xkX2Rpciwgb2xkX2RlbnRyeSwgX19vbGRfbmFtZSwKKwkJCQkJIG5ld19kaXIsIG5ld19kZW50cnksIF9fbmV3X25hbWUpOworCX0KKyNlbmRpZgorCXN3aXRjaCAoZXJyb3IpIHsKKwkJY2FzZSAweDAwOgorICAgICAgICAgICAgICAgCSAgICAgICAgRFBSSU5USygibmNwIHJlbmFtZWQgJXMgLT4gJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSxuZXdfZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSAweDlFOgorCQkJZXJyb3IgPSAtRU5BTUVUT09MT05HOworCQkJYnJlYWs7CisJCWNhc2UgMHhGRjoKKwkJCWVycm9yID0gLUVOT0VOVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyb3IgPSAtRUFDQ0VTOworCQkJYnJlYWs7CisJfQorb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgbmNwX21rbm9kKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICAgIGludCBtb2RlLCBkZXZfdCByZGV2KQoreworCWlmICghbmV3X3ZhbGlkX2RldihyZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG5jcF9pc19uZnNfZXh0cmFzKE5DUF9TRVJWRVIoZGlyKSwgTkNQX0ZJTkZPKGRpciktPnZvbE51bWJlcikpIHsKKwkJRFBSSU5USyhLRVJOX0RFQlVHICJuY3BfbWtub2Q6IG1vZGUgPSAwJW9cbiIsIG1vZGUpOworCQlyZXR1cm4gbmNwX2NyZWF0ZV9uZXcoZGlyLCBkZW50cnksIG1vZGUsIHJkZXYsIDApOworCX0KKwlyZXR1cm4gLUVQRVJNOyAvKiBTdHJhbmdlLCBidXQgdHJ1ZSAqLworfQorCisvKiBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFyZSB0YWtlbiBkaXJlY3RseSBmcm9tIG1zZG9zLWZzICovCisKKy8qIExpbmVhciBkYXkgbnVtYmVycyBvZiB0aGUgcmVzcGVjdGl2ZSAxc3RzIGluIG5vbi1sZWFwIHllYXJzLiAqLworCitzdGF0aWMgaW50IGRheV9uW10gPQorezAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0LCAwLCAwLCAwLCAwfTsKKy8qIEphbiBGZWIgTWFyIEFwciBNYXkgSnVuIEp1bCBBdWcgU2VwIE9jdCBOb3YgRGVjICovCisKKworZXh0ZXJuIHN0cnVjdCB0aW1lem9uZSBzeXNfdHo7CisKK3N0YXRpYyBpbnQgdXRjMmxvY2FsKGludCB0aW1lKQoreworCXJldHVybiB0aW1lIC0gc3lzX3R6LnR6X21pbnV0ZXN3ZXN0ICogNjA7Cit9CisKK3N0YXRpYyBpbnQgbG9jYWwydXRjKGludCB0aW1lKQoreworCXJldHVybiB0aW1lICsgc3lzX3R6LnR6X21pbnV0ZXN3ZXN0ICogNjA7Cit9CisKKy8qIENvbnZlcnQgYSBNUy1ET1MgdGltZS9kYXRlIHBhaXIgdG8gYSBVTklYIGRhdGUgKHNlY29uZHMgc2luY2UgMSAxIDcwKS4gKi8KK2ludAorbmNwX2RhdGVfZG9zMnVuaXgoX19sZTE2IHQsIF9fbGUxNiBkKQoreworCXVuc2lnbmVkIHNob3J0IHRpbWUgPSBsZTE2X3RvX2NwdSh0KSwgZGF0ZSA9IGxlMTZfdG9fY3B1KGQpOworCWludCBtb250aCwgeWVhciwgc2VjczsKKworCS8qIGZpcnN0IHN1YnRyYWN0IGFuZCBtYXNrIGFmdGVyIHRoYXQuLi4gT3RoZXJ3aXNlLCBpZgorCSAgIGRhdGUgPT0gMCwgYmFkIHRoaW5ncyBoYXBwZW4gKi8KKwltb250aCA9ICgoZGF0ZSA+PiA1KSAtIDEpICYgMTU7CisJeWVhciA9IGRhdGUgPj4gOTsKKwlzZWNzID0gKHRpbWUgJiAzMSkgKiAyICsgNjAgKiAoKHRpbWUgPj4gNSkgJiA2MykgKyAodGltZSA+PiAxMSkgKiAzNjAwICsKKwkJODY0MDAgKiAoKGRhdGUgJiAzMSkgLSAxICsgZGF5X25bbW9udGhdICsgKHllYXIgLyA0KSArIAorCQl5ZWFyICogMzY1IC0gKCh5ZWFyICYgMykgPT0gMCAmJiBtb250aCA8IDIgPyAxIDogMCkgKyAzNjUzKTsKKwkvKiBkYXlzIHNpbmNlIDEuMS43MCBwbHVzIDgwJ3MgbGVhcCBkYXkgKi8KKwlyZXR1cm4gbG9jYWwydXRjKHNlY3MpOworfQorCisKKy8qIENvbnZlcnQgbGluZWFyIFVOSVggZGF0ZSB0byBhIE1TLURPUyB0aW1lL2RhdGUgcGFpci4gKi8KK3ZvaWQKK25jcF9kYXRlX3VuaXgyZG9zKGludCB1bml4X2RhdGUsIF9fbGUxNiAqdGltZSwgX19sZTE2ICpkYXRlKQoreworCWludCBkYXksIHllYXIsIG5sX2RheSwgbW9udGg7CisKKwl1bml4X2RhdGUgPSB1dGMybG9jYWwodW5peF9kYXRlKTsKKwkqdGltZSA9IGNwdV90b19sZTE2KAorCQkodW5peF9kYXRlICUgNjApIC8gMiArICgoKHVuaXhfZGF0ZSAvIDYwKSAlIDYwKSA8PCA1KSArCisJCSgoKHVuaXhfZGF0ZSAvIDM2MDApICUgMjQpIDw8IDExKSk7CisJZGF5ID0gdW5peF9kYXRlIC8gODY0MDAgLSAzNjUyOworCXllYXIgPSBkYXkgLyAzNjU7CisJaWYgKCh5ZWFyICsgMykgLyA0ICsgMzY1ICogeWVhciA+IGRheSkKKwkJeWVhci0tOworCWRheSAtPSAoeWVhciArIDMpIC8gNCArIDM2NSAqIHllYXI7CisJaWYgKGRheSA9PSA1OSAmJiAhKHllYXIgJiAzKSkgeworCQlubF9kYXkgPSBkYXk7CisJCW1vbnRoID0gMjsKKwl9IGVsc2UgeworCQlubF9kYXkgPSAoeWVhciAmIDMpIHx8IGRheSA8PSA1OSA/IGRheSA6IGRheSAtIDE7CisJCWZvciAobW9udGggPSAwOyBtb250aCA8IDEyOyBtb250aCsrKQorCQkJaWYgKGRheV9uW21vbnRoXSA+IG5sX2RheSkKKwkJCQlicmVhazsKKwl9CisJKmRhdGUgPSBjcHVfdG9fbGUxNihubF9kYXkgLSBkYXlfblttb250aCAtIDFdICsgMSArIChtb250aCA8PCA1KSArICh5ZWFyIDw8IDkpKTsKK30KZGlmZiAtLWdpdCBhL2ZzL25jcGZzL2ZpbGUuYyBiL2ZzL25jcGZzL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTQ3ZDliCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmNwZnMvZmlsZS5jCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogIGZpbGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgVm9sa2VyIExlbmRlY2tlCisgKiAgTW9kaWZpZWQgMTk5NyBQZXRlciBXYWx0ZW5iZXJnLCBCaWxsIEhhd2VzLCBEYXZpZCBXb29kaG91c2UgZm9yIDIuMSBkY2FjaGUKKyAqCisgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uY3BfZnMuaD4KKyNpbmNsdWRlICJuY3BsaWJfa2VybmVsLmgiCisKK3N0YXRpYyBpbnQgbmNwX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBkYXRhc3luYykKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE9wZW4gYSBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCByZWFkL3dyaXRlIG1vZGUuCisgKi8KK2ludCBuY3BfbWFrZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCByaWdodCkKK3sKKwlpbnQgZXJyb3I7CisJaW50IGFjY2VzczsKKworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoIWlub2RlKSB7CisJCXByaW50ayhLRVJOX0VSUiAibmNwX21ha2Vfb3BlbjogZ290IE5VTEwgaW5vZGVcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlEUFJJTlRLKCJuY3BfbWFrZV9vcGVuOiBvcGVuZWQ9JWQsIHZvbHVtZSAjICV1LCBkaXIgZW50cnkgIyAldVxuIiwKKwkJYXRvbWljX3JlYWQoJk5DUF9GSU5GTyhpbm9kZSktPm9wZW5lZCksIAorCQlOQ1BfRklORk8oaW5vZGUpLT52b2xOdW1iZXIsIAorCQlOQ1BfRklORk8oaW5vZGUpLT5kaXJFbnROdW0pOworCWVycm9yID0gLUVBQ0NFUzsKKwlkb3duKCZOQ1BfRklORk8oaW5vZGUpLT5vcGVuX3NlbSk7CisJaWYgKCFhdG9taWNfcmVhZCgmTkNQX0ZJTkZPKGlub2RlKS0+b3BlbmVkKSkgeworCQlzdHJ1Y3QgbmNwX2VudHJ5X2luZm8gZmluZm87CisJCWludCByZXN1bHQ7CisKKwkJLyogdHJpZXMgbWF4LiByaWdodHMgKi8KKwkJZmluZm8uYWNjZXNzID0gT19SRFdSOworCQlyZXN1bHQgPSBuY3Bfb3Blbl9jcmVhdGVfZmlsZV9vcl9zdWJkaXIoTkNQX1NFUlZFUihpbm9kZSksCisJCQkJCWlub2RlLCBOVUxMLCBPQ19NT0RFX09QRU4sCisJCQkJCTAsIEFSX1JFQUQgfCBBUl9XUklURSwgJmZpbmZvKTsKKwkJaWYgKCFyZXN1bHQpCisJCQlnb3RvIHVwZGF0ZTsKKwkJLyogUkRXUiBkaWQgbm90IHN1Y2NlZWRlZCwgdHJ5IHJlYWRvbmx5IG9yIHdyaXRlb25seSBhcyByZXF1ZXN0ZWQgKi8KKwkJc3dpdGNoIChyaWdodCkgeworCQkJY2FzZSBPX1JET05MWToKKwkJCQlmaW5mby5hY2Nlc3MgPSBPX1JET05MWTsKKwkJCQlyZXN1bHQgPSBuY3Bfb3Blbl9jcmVhdGVfZmlsZV9vcl9zdWJkaXIoTkNQX1NFUlZFUihpbm9kZSksCisJCQkJCWlub2RlLCBOVUxMLCBPQ19NT0RFX09QRU4sCisJCQkJCTAsIEFSX1JFQUQsICZmaW5mbyk7CisJCQkJYnJlYWs7CisJCQljYXNlIE9fV1JPTkxZOgorCQkJCWZpbmZvLmFjY2VzcyA9IE9fV1JPTkxZOworCQkJCXJlc3VsdCA9IG5jcF9vcGVuX2NyZWF0ZV9maWxlX29yX3N1YmRpcihOQ1BfU0VSVkVSKGlub2RlKSwKKwkJCQkJaW5vZGUsIE5VTEwsIE9DX01PREVfT1BFTiwKKwkJCQkJMCwgQVJfV1JJVEUsICZmaW5mbyk7CisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJlc3VsdCkgeworCQkJUFBSSU5USygibmNwX21ha2Vfb3BlbjogZmFpbGVkLCByZXN1bHQ9JWRcbiIsIHJlc3VsdCk7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwkJLyoKKwkJICogVXBkYXRlIHRoZSBpbm9kZSBpbmZvcm1hdGlvbi4KKwkJICovCisJdXBkYXRlOgorCQluY3BfdXBkYXRlX2lub2RlKGlub2RlLCAmZmluZm8pOworCQlhdG9taWNfc2V0KCZOQ1BfRklORk8oaW5vZGUpLT5vcGVuZWQsIDEpOworCX0KKworCWFjY2VzcyA9IE5DUF9GSU5GTyhpbm9kZSktPmFjY2VzczsKKwlQUFJJTlRLKCJuY3BfbWFrZV9vcGVuOiBmaWxlIG9wZW4sIGFjY2Vzcz0leFxuIiwgYWNjZXNzKTsKKwlpZiAoYWNjZXNzID09IHJpZ2h0IHx8IGFjY2VzcyA9PSBPX1JEV1IpIHsKKwkJYXRvbWljX2luYygmTkNQX0ZJTkZPKGlub2RlKS0+b3BlbmVkKTsKKwkJZXJyb3IgPSAwOworCX0KKworb3V0X3VubG9jazoKKwl1cCgmTkNQX0ZJTkZPKGlub2RlKS0+b3Blbl9zZW0pOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHNzaXplX3QKK25jcF9maWxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc2l6ZV90IGFscmVhZHlfcmVhZCA9IDA7CisJb2ZmX3QgcG9zOworCXNpemVfdCBidWZzaXplOworCWludCBlcnJvcjsKKwl2b2lkKiBmcmVlcGFnZTsKKwlzaXplX3QgZnJlZWxlbjsKKworCURQUklOVEsoIm5jcF9maWxlX3JlYWQ6IGVudGVyICVzLyVzXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlpZiAoIW5jcF9jb25uX3ZhbGlkKE5DUF9TRVJWRVIoaW5vZGUpKSkKKwkJcmV0dXJuIC1FSU87CisKKwlwb3MgPSAqcHBvczsKKworCWlmICgoc3NpemVfdCkgY291bnQgPCAwKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gMDsKKwlpZiAocG9zID4gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpCisJCXJldHVybiAwOworCWlmIChwb3MgKyBjb3VudCA+IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKSB7CisJCWNvdW50ID0gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMgLSBwb3M7CisJfQorCisJZXJyb3IgPSBuY3BfbWFrZV9vcGVuKGlub2RlLCBPX1JET05MWSk7CisJaWYgKGVycm9yKSB7CisJCURQUklOVEsoS0VSTl9FUlIgIm5jcF9maWxlX3JlYWQ6IG9wZW4gZmFpbGVkLCBlcnJvcj0lZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJYnVmc2l6ZSA9IE5DUF9TRVJWRVIoaW5vZGUpLT5idWZmZXJfc2l6ZTsKKworCWVycm9yID0gLUVJTzsKKwlmcmVlbGVuID0gbmNwX3JlYWRfYm91bmNlX3NpemUoYnVmc2l6ZSk7CisJZnJlZXBhZ2UgPSB2bWFsbG9jKGZyZWVsZW4pOworCWlmICghZnJlZXBhZ2UpCisJCWdvdG8gb3V0cmVsOworCWVycm9yID0gMDsKKwkvKiBGaXJzdCByZWFkIGluIGFzIG11Y2ggYXMgcG9zc2libGUgZm9yIGVhY2ggYnVmc2l6ZS4gKi8KKwl3aGlsZSAoYWxyZWFkeV9yZWFkIDwgY291bnQpIHsKKwkJaW50IHJlYWRfdGhpc190aW1lOworCQlzaXplX3QgdG9fcmVhZCA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkgICAgIGJ1ZnNpemUgLSAocG9zICUgYnVmc2l6ZSksCisJCQkJICAgICBjb3VudCAtIGFscmVhZHlfcmVhZCk7CisKKwkJZXJyb3IgPSBuY3BfcmVhZF9ib3VuY2UoTkNQX1NFUlZFUihpbm9kZSksCisJCQkgCU5DUF9GSU5GTyhpbm9kZSktPmZpbGVfaGFuZGxlLAorCQkJCXBvcywgdG9fcmVhZCwgYnVmLCAmcmVhZF90aGlzX3RpbWUsIAorCQkJCWZyZWVwYWdlLCBmcmVlbGVuKTsKKwkJaWYgKGVycm9yKSB7CisJCQllcnJvciA9IC1FSU87CS8qIE5XIGVycm5vIC0+IExpbnV4IGVycm5vICovCisJCQlicmVhazsKKwkJfQorCQlwb3MgKz0gcmVhZF90aGlzX3RpbWU7CisJCWJ1ZiArPSByZWFkX3RoaXNfdGltZTsKKwkJYWxyZWFkeV9yZWFkICs9IHJlYWRfdGhpc190aW1lOworCisJCWlmIChyZWFkX3RoaXNfdGltZSAhPSB0b19yZWFkKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwl2ZnJlZShmcmVlcGFnZSk7CisKKwkqcHBvcyA9IHBvczsKKworCWZpbGVfYWNjZXNzZWQoZmlsZSk7CisKKwlEUFJJTlRLKCJuY3BfZmlsZV9yZWFkOiBleGl0ICVzLyVzXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CitvdXRyZWw6CisJbmNwX2lub2RlX2Nsb3NlKGlub2RlKTsJCQorCXJldHVybiBhbHJlYWR5X3JlYWQgPyBhbHJlYWR5X3JlYWQgOiBlcnJvcjsKK30KKworc3RhdGljIHNzaXplX3QKK25jcF9maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXNpemVfdCBhbHJlYWR5X3dyaXR0ZW4gPSAwOworCW9mZl90IHBvczsKKwlzaXplX3QgYnVmc2l6ZTsKKwlpbnQgZXJybm87CisJdm9pZCogYm91bmNlYnVmZmVyOworCisJRFBSSU5USygibmNwX2ZpbGVfd3JpdGU6IGVudGVyICVzLyVzXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJaWYgKCFuY3BfY29ubl92YWxpZChOQ1BfU0VSVkVSKGlub2RlKSkpCisJCXJldHVybiAtRUlPOworCWlmICgoc3NpemVfdCkgY291bnQgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwb3MgPSAqcHBvczsKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EKSB7CisJCXBvcyA9IGlub2RlLT5pX3NpemU7CisJfQorCisJaWYgKHBvcyArIGNvdW50ID4gTUFYX05PTl9MRlMgJiYgIShmaWxlLT5mX2ZsYWdzJk9fTEFSR0VGSUxFKSkgeworCQlpZiAocG9zID49IE1BWF9OT05fTEZTKSB7CisJCQlzZW5kX3NpZyhTSUdYRlNaLCBjdXJyZW50LCAwKTsKKwkJCXJldHVybiAtRUZCSUc7CisJCX0KKwkJaWYgKGNvdW50ID4gTUFYX05PTl9MRlMgLSAodTMyKXBvcykgeworCQkJY291bnQgPSBNQVhfTk9OX0xGUyAtICh1MzIpcG9zOworCQl9CisJfQorCWlmIChwb3MgPj0gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpIHsKKwkJaWYgKGNvdW50IHx8IHBvcyA+IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKSB7CisJCQlzZW5kX3NpZyhTSUdYRlNaLCBjdXJyZW50LCAwKTsKKwkJCXJldHVybiAtRUZCSUc7CisJCX0KKwl9CisJaWYgKHBvcyArIGNvdW50ID4gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpIHsKKwkJY291bnQgPSBpbm9kZS0+aV9zYi0+c19tYXhieXRlcyAtIHBvczsKKwl9CisJCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIDA7CisJZXJybm8gPSBuY3BfbWFrZV9vcGVuKGlub2RlLCBPX1dST05MWSk7CisJaWYgKGVycm5vKSB7CisJCURQUklOVEsoS0VSTl9FUlIgIm5jcF9maWxlX3dyaXRlOiBvcGVuIGZhaWxlZCwgZXJyb3I9JWRcbiIsIGVycm5vKTsKKwkJcmV0dXJuIGVycm5vOworCX0KKwlidWZzaXplID0gTkNQX1NFUlZFUihpbm9kZSktPmJ1ZmZlcl9zaXplOworCisJYWxyZWFkeV93cml0dGVuID0gMDsKKworCWJvdW5jZWJ1ZmZlciA9IHZtYWxsb2MoYnVmc2l6ZSk7CisJaWYgKCFib3VuY2VidWZmZXIpIHsKKwkJZXJybm8gPSAtRUlPOwkvKiAtRU5PTUVNICovCisJCWdvdG8gb3V0cmVsOworCX0KKwl3aGlsZSAoYWxyZWFkeV93cml0dGVuIDwgY291bnQpIHsKKwkJaW50IHdyaXR0ZW5fdGhpc190aW1lOworCQlzaXplX3QgdG9fd3JpdGUgPSBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJICAgICAgYnVmc2l6ZSAtIChwb3MgJSBidWZzaXplKSwKKwkJCQkgICAgICBjb3VudCAtIGFscmVhZHlfd3JpdHRlbik7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGJvdW5jZWJ1ZmZlciwgYnVmLCB0b193cml0ZSkpIHsKKwkJCWVycm5vID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChuY3Bfd3JpdGVfa2VybmVsKE5DUF9TRVJWRVIoaW5vZGUpLCAKKwkJICAgIE5DUF9GSU5GTyhpbm9kZSktPmZpbGVfaGFuZGxlLAorCQkgICAgcG9zLCB0b193cml0ZSwgYm91bmNlYnVmZmVyLCAmd3JpdHRlbl90aGlzX3RpbWUpICE9IDApIHsKKwkJCWVycm5vID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCXBvcyArPSB3cml0dGVuX3RoaXNfdGltZTsKKwkJYnVmICs9IHdyaXR0ZW5fdGhpc190aW1lOworCQlhbHJlYWR5X3dyaXR0ZW4gKz0gd3JpdHRlbl90aGlzX3RpbWU7CisKKwkJaWYgKHdyaXR0ZW5fdGhpc190aW1lICE9IHRvX3dyaXRlKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwl2ZnJlZShib3VuY2VidWZmZXIpOworCisJaW5vZGVfdXBkYXRlX3RpbWUoaW5vZGUsIDEpOworCisJKnBwb3MgPSBwb3M7CisKKwlpZiAocG9zID4gaW5vZGUtPmlfc2l6ZSkgeworCQlpbm9kZS0+aV9zaXplID0gcG9zOworCX0KKwlEUFJJTlRLKCJuY3BfZmlsZV93cml0ZTogZXhpdCAlcy8lc1xuIiwKKwkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworb3V0cmVsOgorCW5jcF9pbm9kZV9jbG9zZShpbm9kZSk7CQkKKwlyZXR1cm4gYWxyZWFkeV93cml0dGVuID8gYWxyZWFkeV93cml0dGVuIDogZXJybm87Cit9CisKK3N0YXRpYyBpbnQgbmNwX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpIHsKKwlpZiAobmNwX21ha2VfY2xvc2VkKGlub2RlKSkgeworCQlEUFJJTlRLKCJuY3BfcmVsZWFzZTogZmFpbGVkIHRvIGNsb3NlXG4iKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgbmNwX2ZpbGVfb3BlcmF0aW9ucyA9Cit7CisJLmxsc2VlawkJPSByZW1vdGVfbGxzZWVrLAorCS5yZWFkCQk9IG5jcF9maWxlX3JlYWQsCisJLndyaXRlCQk9IG5jcF9maWxlX3dyaXRlLAorCS5pb2N0bAkJPSBuY3BfaW9jdGwsCisJLm1tYXAJCT0gbmNwX21tYXAsCisJLnJlbGVhc2UJPSBuY3BfcmVsZWFzZSwKKwkuZnN5bmMJCT0gbmNwX2ZzeW5jLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbmNwX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9Cit7CisJLnNldGF0dHIJPSBuY3Bfbm90aWZ5X2NoYW5nZSwKK307CmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9nZXRvcHQuYyBiL2ZzL25jcGZzL2dldG9wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNWIwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uY3Bmcy9nZXRvcHQuYwpAQCAtMCwwICsxLDc1IEBACisvKgorICogZ2V0b3B0LmMKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworI2luY2x1ZGUgImdldG9wdC5oIgorCisvKioKKyAqCW5jcF9nZXRvcHQgLSBvcHRpb24gcGFyc2VyCisgKglAY2FsbGVyOiBuYW1lIG9mIHRoZSBjYWxsZXIsIGZvciBlcnJvciBtZXNzYWdlcworICoJQG9wdGlvbnM6IHRoZSBvcHRpb25zIHN0cmluZworICoJQG9wdHM6IGFuIGFycmF5IG9mICZzdHJ1Y3Qgb3B0aW9uIGVudHJpZXMgY29udHJvbGxpbmcgcGFyc2VyIG9wZXJhdGlvbnMKKyAqCUBvcHRvcHQ6IG91dHB1dDsgd2lsbCBjb250YWluIHRoZSBjdXJyZW50IG9wdGlvbgorICoJQG9wdGFyZzogb3V0cHV0OyB3aWxsIGNvbnRhaW4gdGhlIHZhbHVlIChpZiBvbmUgZXhpc3RzKQorICoJQGZsYWc6IG91dHB1dDsgbWF5IGJlIE5VTEw7IHNob3VsZCBwb2ludCB0byBhIGxvbmcgZm9yIG9yJ2luZyBmbGFncworICoJQHZhbHVlOiBvdXRwdXQ7IG1heSBiZSBOVUxMOyB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIGludGVnZXIgdmFsdWUKKyAqCQlvZiB0aGUgY3VycmVudCBhcmd1bWVudC4KKyAqCisgKglIZWxwZXIgdG8gcGFyc2Ugb3B0aW9ucyBvbiB0aGUgZm9ybWF0IHVzZWQgYnkgbW91bnQgKCJhPWIsYz1kLGUsZiIpLgorICoJUmV0dXJucyBvcHRzLT52YWwgaWYgYSBtYXRjaGluZyBlbnRyeSBpbiB0aGUgJ29wdHMnIGFycmF5IGlzIGZvdW5kLAorICoJMCB3aGVuIG5vIG1vcmUgdG9rZW5zIGFyZSBmb3VuZCwgLTEgaWYgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQuCisgKi8KK2ludCBuY3BfZ2V0b3B0KGNvbnN0IGNoYXIgKmNhbGxlciwgY2hhciAqKm9wdGlvbnMsIGNvbnN0IHN0cnVjdCBuY3Bfb3B0aW9uICpvcHRzLAorCSAgICAgICBjaGFyICoqb3B0b3B0LCBjaGFyICoqb3B0YXJnLCB1bnNpZ25lZCBsb25nICp2YWx1ZSkKK3sKKwljaGFyICp0b2tlbjsKKwljaGFyICp2YWw7CisKKwlkbyB7CisJCWlmICgodG9rZW4gPSBzdHJzZXAob3B0aW9ucywgIiwiKSkgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCX0gd2hpbGUgKCp0b2tlbiA9PSAnXDAnKTsKKwlpZiAob3B0b3B0KQorCQkqb3B0b3B0ID0gdG9rZW47CisKKwlpZiAoKHZhbCA9IHN0cmNociAodG9rZW4sICc9JykpICE9IE5VTEwpIHsKKwkJKnZhbCsrID0gMDsKKwl9CisJKm9wdGFyZyA9IHZhbDsKKwlmb3IgKDsgb3B0cy0+bmFtZTsgb3B0cysrKSB7CisJCWlmICghc3RyY21wKG9wdHMtPm5hbWUsIHRva2VuKSkgeworCQkJaWYgKCF2YWwpIHsKKwkJCQlpZiAob3B0cy0+aGFzX2FyZyAmIE9QVF9OT1BBUkFNKSB7CisJCQkJCXJldHVybiBvcHRzLT52YWw7CisJCQkJfQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiB0aGUgJXMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iLAorCQkJCSAgICAgICBjYWxsZXIsIHRva2VuKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmIChvcHRzLT5oYXNfYXJnICYgT1BUX0lOVCkgeworCQkJCWNoYXIqIHY7CisKKwkJCQkqdmFsdWUgPSBzaW1wbGVfc3RydG91bCh2YWwsICZ2LCAwKTsKKwkJCQlpZiAoISp2KSB7CisJCQkJCXJldHVybiBvcHRzLT52YWw7CisJCQkJfQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnZhbGlkIG51bWVyaWMgdmFsdWUgaW4gJXM9JXNcbiIsCisJCQkJCWNhbGxlciwgdG9rZW4sIHZhbCk7CisJCQkJcmV0dXJuIC1FRE9NOworCQkJfQorCQkJaWYgKG9wdHMtPmhhc19hcmcgJiBPUFRfU1RSSU5HKSB7CisJCQkJcmV0dXJuIG9wdHMtPnZhbDsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiB1bmV4cGVjdGVkIGFyZ3VtZW50ICVzIHRvIHRoZSAlcyBvcHRpb25cbiIsCisJCQkJY2FsbGVyLCB2YWwsIHRva2VuKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbnJlY29nbml6ZWQgbW91bnQgb3B0aW9uICVzXG4iLCBjYWxsZXIsIHRva2VuKTsKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9nZXRvcHQuaCBiL2ZzL25jcGZzL2dldG9wdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjY2MwMDcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uY3Bmcy9nZXRvcHQuaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9MSU5VWF9HRVRPUFRfSAorI2RlZmluZSBfTElOVVhfR0VUT1BUX0gKKworI2RlZmluZSBPUFRfTk9QQVJBTQkxCisjZGVmaW5lIE9QVF9JTlQJCTIKKyNkZWZpbmUgT1BUX1NUUklORwk0CitzdHJ1Y3QgbmNwX29wdGlvbiB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgaGFzX2FyZzsKKwlpbnQgdmFsOworfTsKKworZXh0ZXJuIGludCBuY3BfZ2V0b3B0KGNvbnN0IGNoYXIgKmNhbGxlciwgY2hhciAqKm9wdGlvbnMsIGNvbnN0IHN0cnVjdCBuY3Bfb3B0aW9uICpvcHRzLAorCQkgICAgICBjaGFyICoqb3B0b3B0LCBjaGFyICoqb3B0YXJnLCB1bnNpZ25lZCBsb25nICp2YWx1ZSk7CisKKyNlbmRpZiAvKiBfTElOVVhfR0VUT1BUX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL25jcGZzL2lub2RlLmMgYi9mcy9uY3Bmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0Nzk1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uY3Bmcy9pbm9kZS5jCkBAIC0wLDAgKzEsMTAxMiBAQAorLyoKKyAqICBpbm9kZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBWb2xrZXIgTGVuZGVja2UKKyAqICBNb2RpZmllZCBmb3IgYmlnIGVuZGlhbiBieSBKLkYuIENoYWRpbWEgYW5kIERhdmlkIFMuIE1pbGxlcgorICogIE1vZGlmaWVkIDE5OTcgUGV0ZXIgV2FsdGVuYmVyZywgQmlsbCBIYXdlcywgRGF2aWQgV29vZGhvdXNlIGZvciAyLjEgZGNhY2hlCisgKiAgTW9kaWZpZWQgMTk5OCBXb2xmcmFtIFBpZW5rb3NzIGZvciBOTFMKKyAqICBNb2RpZmllZCAyMDAwIEJlbiBIYXJyaXMsIFVuaXZlcnNpdHkgb2YgQ2FtYnJpZGdlIGZvciBORlMgTlMgbWV0YS1pbmZvCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uY3BfZnMuaD4KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlICJuY3BsaWJfa2VybmVsLmgiCisjaW5jbHVkZSAiZ2V0b3B0LmgiCisKK3N0YXRpYyB2b2lkIG5jcF9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICopOworc3RhdGljIHZvaWQgbmNwX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitzdGF0aWMgaW50ICBuY3Bfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKKworc3RhdGljIGttZW1fY2FjaGVfdCAqIG5jcF9pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKm5jcF9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBuY3BfaW5vZGVfaW5mbyAqZWk7CisJZWkgPSAoc3RydWN0IG5jcF9pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhuY3BfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBuY3BfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShuY3BfaW5vZGVfY2FjaGVwLCBOQ1BfRklORk8oaW5vZGUpKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgbmNwX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBuY3BfaW5vZGVfaW5mbyAqKSBmb287CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKSB7CisJCWluaXRfTVVURVgoJmVpLT5vcGVuX3NlbSk7CisJCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7CisJfQorfQorIAorc3RhdGljIGludCBpbml0X2lub2RlY2FjaGUodm9pZCkKK3sKKwluY3BfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoIm5jcF9pbm9kZV9jYWNoZSIsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBuY3BfaW5vZGVfaW5mbyksCisJCQkJCSAgICAgMCwgU0xBQl9SRUNMQUlNX0FDQ09VTlQsCisJCQkJCSAgICAgaW5pdF9vbmNlLCBOVUxMKTsKKwlpZiAobmNwX2lub2RlX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCit7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShuY3BfaW5vZGVfY2FjaGVwKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAibmNwX2lub2RlX2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7Cit9CisKK3N0YXRpYyBpbnQgbmNwX3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciogZGF0YSkKK3sKKwkqZmxhZ3MgfD0gTVNfTk9ESVJBVElNRTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIG5jcF9zb3BzID0KK3sKKwkuYWxsb2NfaW5vZGUJPSBuY3BfYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSBuY3BfZGVzdHJveV9pbm9kZSwKKwkuZHJvcF9pbm9kZQk9IGdlbmVyaWNfZGVsZXRlX2lub2RlLAorCS5kZWxldGVfaW5vZGUJPSBuY3BfZGVsZXRlX2lub2RlLAorCS5wdXRfc3VwZXIJPSBuY3BfcHV0X3N1cGVyLAorCS5zdGF0ZnMJCT0gbmNwX3N0YXRmcywKKwkucmVtb3VudF9mcwk9IG5jcF9yZW1vdW50LAorfTsKKworZXh0ZXJuIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBuY3Bfcm9vdF9kZW50cnlfb3BlcmF0aW9uczsKKyNpZiBkZWZpbmVkKENPTkZJR19OQ1BGU19FWFRSQVMpIHx8IGRlZmluZWQoQ09ORklHX05DUEZTX05GU19OUykKK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIG5jcF9zeW1saW5rX2FvcHM7CitleHRlcm4gaW50IG5jcF9zeW1saW5rKHN0cnVjdCBpbm9kZSosIHN0cnVjdCBkZW50cnkqLCBjb25zdCBjaGFyKik7CisjZW5kaWYKKworLyoKKyAqIEZpbGwgaW4gdGhlIG5jcGZzLXNwZWNpZmljIGluZm9ybWF0aW9uIGluIHRoZSBpbm9kZS4KKyAqLworc3RhdGljIHZvaWQgbmNwX3VwZGF0ZV9kaXJlbnQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5jcF9lbnRyeV9pbmZvICpud2luZm8pCit7CisJTkNQX0ZJTkZPKGlub2RlKS0+RG9zRGlyTnVtID0gbndpbmZvLT5pLkRvc0Rpck51bTsKKwlOQ1BfRklORk8oaW5vZGUpLT5kaXJFbnROdW0gPSBud2luZm8tPmkuZGlyRW50TnVtOworCU5DUF9GSU5GTyhpbm9kZSktPnZvbE51bWJlciA9IG53aW5mby0+dm9sdW1lOworfQorCit2b2lkIG5jcF91cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5jcF9lbnRyeV9pbmZvICpud2luZm8pCit7CisJbmNwX3VwZGF0ZV9kaXJlbnQoaW5vZGUsIG53aW5mbyk7CisJTkNQX0ZJTkZPKGlub2RlKS0+bndhdHRyID0gbndpbmZvLT5pLmF0dHJpYnV0ZXM7CisJTkNQX0ZJTkZPKGlub2RlKS0+YWNjZXNzID0gbndpbmZvLT5hY2Nlc3M7CisJbWVtY3B5KE5DUF9GSU5GTyhpbm9kZSktPmZpbGVfaGFuZGxlLCBud2luZm8tPmZpbGVfaGFuZGxlLAorCQkJc2l6ZW9mKG53aW5mby0+ZmlsZV9oYW5kbGUpKTsKKwlEUFJJTlRLKCJuY3BfdXBkYXRlX2lub2RlOiB1cGRhdGVkICVzLCB2b2xudW09JWQsIGRpcmVudD0ldVxuIiwKKwkJbndpbmZvLT5pLmVudHJ5TmFtZSwgTkNQX0ZJTkZPKGlub2RlKS0+dm9sTnVtYmVyLAorCQlOQ1BfRklORk8oaW5vZGUpLT5kaXJFbnROdW0pOworfQorCitzdGF0aWMgdm9pZCBuY3BfdXBkYXRlX2RhdGVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBud19pbmZvX3N0cnVjdCAqbndpKQoreworCS8qIE5GUyBuYW1lc3BhY2UgbW9kZSBvdmVycmlkZXMgb3RoZXJzIGlmIGl0J3Mgc2V0LiAqLworCURQUklOVEsoS0VSTl9ERUJVRyAibmNwX3VwZGF0ZV9kYXRlc19hbmRfbW9kZTogKCVzKSBuZnMubW9kZT0wJW9cbiIsCisJCW53aS0+ZW50cnlOYW1lLCBud2ktPm5mcy5tb2RlKTsKKwlpZiAobndpLT5uZnMubW9kZSkgeworCQkvKiBYWFggU2VjdXJpdHk/ICovCisJCWlub2RlLT5pX21vZGUgPSBud2ktPm5mcy5tb2RlOworCX0KKworCWlub2RlLT5pX2Jsb2NrcyA9IChpbm9kZS0+aV9zaXplICsgTkNQX0JMT0NLX1NJWkUgLSAxKSA+PiBOQ1BfQkxPQ0tfU0hJRlQ7CisKKwlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBuY3BfZGF0ZV9kb3MydW5peChud2ktPm1vZGlmeVRpbWUsIG53aS0+bW9kaWZ5RGF0ZSk7CisJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gbmNwX2RhdGVfZG9zMnVuaXgobndpLT5jcmVhdGlvblRpbWUsIG53aS0+Y3JlYXRpb25EYXRlKTsKKwlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBuY3BfZGF0ZV9kb3MydW5peCgwLCBud2ktPmxhc3RBY2Nlc3NEYXRlKTsKKwlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKK30KKworc3RhdGljIHZvaWQgbmNwX3VwZGF0ZV9hdHRycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmNwX2VudHJ5X2luZm8gKm53aW5mbykKK3sKKwlzdHJ1Y3QgbndfaW5mb19zdHJ1Y3QgKm53aSA9ICZud2luZm8tPmk7CisJc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciA9IE5DUF9TRVJWRVIoaW5vZGUpOworCisJaWYgKG53aS0+YXR0cmlidXRlcyAmIGFESVIpIHsKKwkJaW5vZGUtPmlfbW9kZSA9IHNlcnZlci0+bS5kaXJfbW9kZTsKKwkJLyogZm9yIGRpcmVjdG9yaWVzIGRhdGFTdHJlYW1TaXplIHNlZW1zIHRvIGJlIHNvbWUKKwkJICAgT2JqZWN0IElEID8/PyAqLworCQlpbm9kZS0+aV9zaXplID0gTkNQX0JMT0NLX1NJWkU7CisJfSBlbHNlIHsKKwkJaW5vZGUtPmlfbW9kZSA9IHNlcnZlci0+bS5maWxlX21vZGU7CisJCWlub2RlLT5pX3NpemUgPSBsZTMyX3RvX2NwdShud2ktPmRhdGFTdHJlYW1TaXplKTsKKyNpZmRlZiBDT05GSUdfTkNQRlNfRVhUUkFTCisJCWlmICgoc2VydmVyLT5tLmZsYWdzICYgKE5DUF9NT1VOVF9FWFRSQVN8TkNQX01PVU5UX1NZTUxJTktTKSkgCisJCSAmJiAobndpLT5hdHRyaWJ1dGVzICYgYVNIQVJFRCkpIHsKKwkJCXN3aXRjaCAobndpLT5hdHRyaWJ1dGVzICYgKGFISURERU58YVNZU1RFTSkpIHsKKwkJCQljYXNlIGFISURERU46CisJCQkJCWlmIChzZXJ2ZXItPm0uZmxhZ3MgJiBOQ1BfTU9VTlRfU1lNTElOS1MpIHsKKwkJCQkJCWlmICgvKiAoaW5vZGUtPmlfc2l6ZSA+PSBOQ1BfTUlOX1NZTUxJTktfU0laRSkKKwkJCQkJCSAmJiAqLyAoaW5vZGUtPmlfc2l6ZSA8PSBOQ1BfTUFYX1NZTUxJTktfU0laRSkpIHsKKwkJCQkJCQlpbm9kZS0+aV9tb2RlID0gKGlub2RlLT5pX21vZGUgJiB+U19JRk1UKSB8IFNfSUZMTks7CisJCQkJCQkJTkNQX0ZJTkZPKGlub2RlKS0+ZmxhZ3MgfD0gTkNQSV9LTFVER0VfU1lNTElOSzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvKiBGQUxMVEhST1VHSCAqLworCQkJCWNhc2UgMDoKKwkJCQkJaWYgKHNlcnZlci0+bS5mbGFncyAmIE5DUF9NT1VOVF9FWFRSQVMpCisJCQkJCQlpbm9kZS0+aV9tb2RlIHw9IFNfSVJVR087CisJCQkJCWJyZWFrOworCQkJCWNhc2UgYVNZU1RFTToKKwkJCQkJaWYgKHNlcnZlci0+bS5mbGFncyAmIE5DUF9NT1VOVF9FWFRSQVMpCisJCQkJCQlpbm9kZS0+aV9tb2RlIHw9IChpbm9kZS0+aV9tb2RlID4+IDIpICYgU19JWFVHTzsKKwkJCQkJYnJlYWs7CisJCQkJLyogY2FzZSBhU1lTVEVNfGFISURERU46ICovCisJCQkJZGVmYXVsdDoKKwkJCQkJLyogcmVzZXJ2ZWQgY29tYmluYXRpb24gKi8KKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKyNlbmRpZgorCX0KKwlpZiAobndpLT5hdHRyaWJ1dGVzICYgYVJPTkxZKSBpbm9kZS0+aV9tb2RlICY9IH5TX0lXVUdPOworfQorCit2b2lkIG5jcF91cGRhdGVfaW5vZGUyKHN0cnVjdCBpbm9kZSogaW5vZGUsIHN0cnVjdCBuY3BfZW50cnlfaW5mbyAqbndpbmZvKQoreworCU5DUF9GSU5GTyhpbm9kZSktPmZsYWdzID0gMDsKKwlpZiAoIWF0b21pY19yZWFkKCZOQ1BfRklORk8oaW5vZGUpLT5vcGVuZWQpKSB7CisJCU5DUF9GSU5GTyhpbm9kZSktPm53YXR0ciA9IG53aW5mby0+aS5hdHRyaWJ1dGVzOworCQluY3BfdXBkYXRlX2F0dHJzKGlub2RlLCBud2luZm8pOworCX0KKworCW5jcF91cGRhdGVfZGF0ZXMoaW5vZGUsICZud2luZm8tPmkpOworCW5jcF91cGRhdGVfZGlyZW50KGlub2RlLCBud2luZm8pOworfQorCisvKgorICogRmlsbCBpbiB0aGUgaW5vZGUgYmFzZWQgb24gdGhlIG5jcF9lbnRyeV9pbmZvIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQgbmNwX3NldF9hdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBuY3BfZW50cnlfaW5mbyAqbndpbmZvKQoreworCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIgPSBOQ1BfU0VSVkVSKGlub2RlKTsKKworCU5DUF9GSU5GTyhpbm9kZSktPmZsYWdzID0gMDsKKwkKKwluY3BfdXBkYXRlX2F0dHJzKGlub2RlLCBud2luZm8pOworCisJRERQUklOVEsoIm5jcF9yZWFkX2lub2RlOiBpbm9kZS0+aV9tb2RlID0gJXVcbiIsIGlub2RlLT5pX21vZGUpOworCisJaW5vZGUtPmlfbmxpbmsgPSAxOworCWlub2RlLT5pX3VpZCA9IHNlcnZlci0+bS51aWQ7CisJaW5vZGUtPmlfZ2lkID0gc2VydmVyLT5tLmdpZDsKKwlpbm9kZS0+aV9ibGtzaXplID0gTkNQX0JMT0NLX1NJWkU7CisKKwluY3BfdXBkYXRlX2RhdGVzKGlub2RlLCAmbndpbmZvLT5pKTsKKwluY3BfdXBkYXRlX2lub2RlKGlub2RlLCBud2luZm8pOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfTkNQRlNfRVhUUkFTKSB8fCBkZWZpbmVkKENPTkZJR19OQ1BGU19ORlNfTlMpCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbmNwX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZGxpbmsJPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawk9IHBhZ2VfZm9sbG93X2xpbmtfbGlnaHQsCisJLnB1dF9saW5rCT0gcGFnZV9wdXRfbGluaywKKwkuc2V0YXR0cgk9IG5jcF9ub3RpZnlfY2hhbmdlLAorfTsKKyNlbmRpZgorCisvKgorICogR2V0IGEgbmV3IGlub2RlLgorICovCitzdHJ1Y3QgaW5vZGUgKiAKK25jcF9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBuY3BfZW50cnlfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaWYgKGluZm8gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIm5jcF9pZ2V0OiBpbmZvIGlzIE5VTExcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpbm9kZSA9IG5ld19pbm9kZShzYik7CisJaWYgKGlub2RlKSB7CisJCWF0b21pY19zZXQoJk5DUF9GSU5GTyhpbm9kZSktPm9wZW5lZCwgaW5mby0+b3BlbmVkKTsKKworCQlpbm9kZS0+aV9pbm8gPSBpbmZvLT5pbm87CisJCW5jcF9zZXRfYXR0cihpbm9kZSwgaW5mbyk7CisJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCQlpbm9kZS0+aV9vcCA9ICZuY3BfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfZm9wID0gJm5jcF9maWxlX29wZXJhdGlvbnM7CisJCX0gZWxzZSBpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQkJaW5vZGUtPmlfb3AgPSAmbmNwX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfZm9wID0gJm5jcF9kaXJfb3BlcmF0aW9uczsKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkZTX05TCisJCX0gZWxzZSBpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpIHx8IFNfSVNGSUZPKGlub2RlLT5pX21vZGUpIHx8IFNfSVNTT0NLKGlub2RlLT5pX21vZGUpKSB7CisJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCisJCQkJbmV3X2RlY29kZV9kZXYoaW5mby0+aS5uZnMucmRldikpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfTkNQRlNfRVhUUkFTKSB8fCBkZWZpbmVkKENPTkZJR19OQ1BGU19ORlNfTlMpCisJCX0gZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgeworCQkJaW5vZGUtPmlfb3AgPSAmbmNwX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmbmNwX3N5bWxpbmtfYW9wczsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQl9CisJCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJuY3BfaWdldDogaWdldCBmYWlsZWQhXG4iKTsKKwlyZXR1cm4gaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkCituY3BfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJRERQUklOVEsoIm5jcF9kZWxldGVfaW5vZGU6IHB1dCBkaXJlY3RvcnkgJWxkXG4iLCBpbm9kZS0+aV9pbm8pOworCX0KKworCWlmIChuY3BfbWFrZV9jbG9zZWQoaW5vZGUpICE9IDApIHsKKwkJLyogV2UgY2FuJ3QgZG8gYW55dGhpbmcgYnV0IGNvbXBsYWluLiAqLworCQlwcmludGsoS0VSTl9FUlIgIm5jcF9kZWxldGVfaW5vZGU6IGNvdWxkIG5vdCBjbG9zZVxuIik7CisJfQorCWNsZWFyX2lub2RlKGlub2RlKTsKK30KKworc3RhdGljIHZvaWQgbmNwX3N0b3BfdGFza3Moc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlcikgeworCXN0cnVjdCBzb2NrKiBzayA9IHNlcnZlci0+bmNwX3NvY2stPnNrOworCQkKKwlzay0+c2tfZXJyb3JfcmVwb3J0ID0gc2VydmVyLT5lcnJvcl9yZXBvcnQ7CisJc2stPnNrX2RhdGFfcmVhZHkgICA9IHNlcnZlci0+ZGF0YV9yZWFkeTsKKwlzay0+c2tfd3JpdGVfc3BhY2UgID0gc2VydmVyLT53cml0ZV9zcGFjZTsKKwlkZWxfdGltZXJfc3luYygmc2VydmVyLT50aW1lb3V0X3RtKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5jcF9vcHRpb24gbmNwX29wdHNbXSA9IHsKKwl7ICJ1aWQiLAlPUFRfSU5ULAkndScgfSwKKwl7ICJnaWQiLAlPUFRfSU5ULAknZycgfSwKKwl7ICJvd25lciIsCU9QVF9JTlQsCSdvJyB9LAorCXsgIm1vZGUiLAlPUFRfSU5ULAknbScgfSwKKwl7ICJkaXJtb2RlIiwJT1BUX0lOVCwJJ2QnIH0sCisJeyAidGltZW91dCIsCU9QVF9JTlQsCSd0JyB9LAorCXsgInJldHJ5IiwJT1BUX0lOVCwJJ3InIH0sCisJeyAiZmxhZ3MiLAlPUFRfSU5ULAknZicgfSwKKwl7ICJ3ZG9ncGlkIiwJT1BUX0lOVCwJJ3cnIH0sCisJeyAibmNwZmQiLAlPUFRfSU5ULAknbicgfSwKKwl7ICJpbmZvZmQiLAlPUFRfSU5ULAknaScgfSwJLyogdjUgKi8KKwl7ICJ2ZXJzaW9uIiwJT1BUX0lOVCwJJ3YnIH0sCisJeyBOVUxMLAkJMCwJCTAgfSB9OworCitzdGF0aWMgaW50IG5jcF9wYXJzZV9vcHRpb25zKHN0cnVjdCBuY3BfbW91bnRfZGF0YV9rZXJuZWwgKmRhdGEsIGNoYXIgKm9wdGlvbnMpIHsKKwlpbnQgb3B0dmFsOworCWNoYXIgKm9wdGFyZzsKKwl1bnNpZ25lZCBsb25nIG9wdGludDsKKwlpbnQgdmVyc2lvbiA9IDA7CisKKwlkYXRhLT5mbGFncyA9IDA7CisJZGF0YS0+aW50X2ZsYWdzID0gMDsKKwlkYXRhLT5tb3VudGVkX3VpZCA9IDA7CisJZGF0YS0+d2RvZ19waWQgPSAtMTsKKwlkYXRhLT5uY3BfZmQgPSB+MDsKKwlkYXRhLT50aW1lX291dCA9IDEwOworCWRhdGEtPnJldHJ5X2NvdW50ID0gMjA7CisJZGF0YS0+dWlkID0gMDsKKwlkYXRhLT5naWQgPSAwOworCWRhdGEtPmZpbGVfbW9kZSA9IDA2MDA7CisJZGF0YS0+ZGlyX21vZGUgPSAwNzAwOworCWRhdGEtPmluZm9fZmQgPSAtMTsKKwlkYXRhLT5tb3VudGVkX3ZvbFswXSA9IDA7CisJCisJd2hpbGUgKChvcHR2YWwgPSBuY3BfZ2V0b3B0KCJuY3BmcyIsICZvcHRpb25zLCBuY3Bfb3B0cywgTlVMTCwgJm9wdGFyZywgJm9wdGludCkpICE9IDApIHsKKwkJaWYgKG9wdHZhbCA8IDApCisJCQlyZXR1cm4gb3B0dmFsOworCQlzd2l0Y2ggKG9wdHZhbCkgeworCQkJY2FzZSAndSc6CisJCQkJZGF0YS0+dWlkID0gb3B0aW50OworCQkJCWJyZWFrOworCQkJY2FzZSAnZyc6CisJCQkJZGF0YS0+Z2lkID0gb3B0aW50OworCQkJCWJyZWFrOworCQkJY2FzZSAnbyc6CisJCQkJZGF0YS0+bW91bnRlZF91aWQgPSBvcHRpbnQ7CisJCQkJYnJlYWs7CisJCQljYXNlICdtJzoKKwkJCQlkYXRhLT5maWxlX21vZGUgPSBvcHRpbnQ7CisJCQkJYnJlYWs7CisJCQljYXNlICdkJzoKKwkJCQlkYXRhLT5kaXJfbW9kZSA9IG9wdGludDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3QnOgorCQkJCWRhdGEtPnRpbWVfb3V0ID0gb3B0aW50OworCQkJCWJyZWFrOworCQkJY2FzZSAncic6CisJCQkJZGF0YS0+cmV0cnlfY291bnQgPSBvcHRpbnQ7CisJCQkJYnJlYWs7CisJCQljYXNlICdmJzoKKwkJCQlkYXRhLT5mbGFncyA9IG9wdGludDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3cnOgorCQkJCWRhdGEtPndkb2dfcGlkID0gb3B0aW50OworCQkJCWJyZWFrOworCQkJY2FzZSAnbic6CisJCQkJZGF0YS0+bmNwX2ZkID0gb3B0aW50OworCQkJCWJyZWFrOworCQkJY2FzZSAnaSc6CisJCQkJZGF0YS0+aW5mb19mZCA9IG9wdGludDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3YnOgorCQkJCWlmIChvcHRpbnQgPCBOQ1BfTU9VTlRfVkVSU0lPTl9WNCkgeworCQkJCQlyZXR1cm4gLUVDSFJORzsKKwkJCQl9CisJCQkJaWYgKG9wdGludCA+IE5DUF9NT1VOVF9WRVJTSU9OX1Y1KSB7CisJCQkJCXJldHVybiAtRUNIUk5HOworCQkJCX0KKwkJCQl2ZXJzaW9uID0gb3B0aW50OworCQkJCWJyZWFrOworCQkJCisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmNwX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqcmF3X2RhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IG5jcF9tb3VudF9kYXRhX2tlcm5lbCBkYXRhOworCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXI7CisJc3RydWN0IGZpbGUgKm5jcF9maWxwOworCXN0cnVjdCBpbm9kZSAqcm9vdF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKnNvY2tfaW5vZGU7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwlpbnQgZXJyb3I7CisJaW50IGRlZmF1bHRfYnVmc2l6ZTsKKyNpZmRlZiBDT05GSUdfTkNQRlNfUEFDS0VUX1NJR05JTkcKKwlpbnQgb3B0aW9uczsKKyNlbmRpZgorCXN0cnVjdCBuY3BfZW50cnlfaW5mbyBmaW5mbzsKKworCXNlcnZlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBuY3Bfc2VydmVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXJ2ZXIpCisJCXJldHVybiAtRU5PTUVNOworCXNiLT5zX2ZzX2luZm8gPSBzZXJ2ZXI7CisJbWVtc2V0KHNlcnZlciwgMCwgc2l6ZW9mKHN0cnVjdCBuY3Bfc2VydmVyKSk7CisKKwllcnJvciA9IC1FRkFVTFQ7CisJaWYgKHJhd19kYXRhID09IE5VTEwpCisJCWdvdG8gb3V0OworCXN3aXRjaCAoKihpbnQqKXJhd19kYXRhKSB7CisJCWNhc2UgTkNQX01PVU5UX1ZFUlNJT046CisJCQl7CisJCQkJc3RydWN0IG5jcF9tb3VudF9kYXRhKiBtZCA9IChzdHJ1Y3QgbmNwX21vdW50X2RhdGEqKXJhd19kYXRhOworCisJCQkJZGF0YS5mbGFncyA9IG1kLT5mbGFnczsKKwkJCQlkYXRhLmludF9mbGFncyA9IE5DUF9JTU9VTlRfTE9HR0VESU5fUE9TU0lCTEU7CisJCQkJZGF0YS5tb3VudGVkX3VpZCA9IG1kLT5tb3VudGVkX3VpZDsKKwkJCQlkYXRhLndkb2dfcGlkID0gbWQtPndkb2dfcGlkOworCQkJCWRhdGEubmNwX2ZkID0gbWQtPm5jcF9mZDsKKwkJCQlkYXRhLnRpbWVfb3V0ID0gbWQtPnRpbWVfb3V0OworCQkJCWRhdGEucmV0cnlfY291bnQgPSBtZC0+cmV0cnlfY291bnQ7CisJCQkJZGF0YS51aWQgPSBtZC0+dWlkOworCQkJCWRhdGEuZ2lkID0gbWQtPmdpZDsKKwkJCQlkYXRhLmZpbGVfbW9kZSA9IG1kLT5maWxlX21vZGU7CisJCQkJZGF0YS5kaXJfbW9kZSA9IG1kLT5kaXJfbW9kZTsKKwkJCQlkYXRhLmluZm9fZmQgPSAtMTsKKwkJCQltZW1jcHkoZGF0YS5tb3VudGVkX3ZvbCwgbWQtPm1vdW50ZWRfdm9sLAorCQkJCQlOQ1BfVk9MTkFNRV9MRU4rMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBOQ1BfTU9VTlRfVkVSU0lPTl9WNDoKKwkJCXsKKwkJCQlzdHJ1Y3QgbmNwX21vdW50X2RhdGFfdjQqIG1kID0gKHN0cnVjdCBuY3BfbW91bnRfZGF0YV92NCopcmF3X2RhdGE7CisKKwkJCQlkYXRhLmZsYWdzID0gbWQtPmZsYWdzOworCQkJCWRhdGEuaW50X2ZsYWdzID0gMDsKKwkJCQlkYXRhLm1vdW50ZWRfdWlkID0gbWQtPm1vdW50ZWRfdWlkOworCQkJCWRhdGEud2RvZ19waWQgPSBtZC0+d2RvZ19waWQ7CisJCQkJZGF0YS5uY3BfZmQgPSBtZC0+bmNwX2ZkOworCQkJCWRhdGEudGltZV9vdXQgPSBtZC0+dGltZV9vdXQ7CisJCQkJZGF0YS5yZXRyeV9jb3VudCA9IG1kLT5yZXRyeV9jb3VudDsKKwkJCQlkYXRhLnVpZCA9IG1kLT51aWQ7CisJCQkJZGF0YS5naWQgPSBtZC0+Z2lkOworCQkJCWRhdGEuZmlsZV9tb2RlID0gbWQtPmZpbGVfbW9kZTsKKwkJCQlkYXRhLmRpcl9tb2RlID0gbWQtPmRpcl9tb2RlOworCQkJCWRhdGEuaW5mb19mZCA9IC0xOworCQkJCWRhdGEubW91bnRlZF92b2xbMF0gPSAwOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnJvciA9IC1FQ0hSTkc7CisJCQlpZiAobWVtY21wKHJhd19kYXRhLCAidmVycyIsIDQpID09IDApIHsKKwkJCQllcnJvciA9IG5jcF9wYXJzZV9vcHRpb25zKCZkYXRhLCByYXdfZGF0YSk7CisJCQl9CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBvdXQ7CisJCQlicmVhazsKKwl9CisJZXJyb3IgPSAtRUJBREY7CisJbmNwX2ZpbHAgPSBmZ2V0KGRhdGEubmNwX2ZkKTsKKwlpZiAoIW5jcF9maWxwKQorCQlnb3RvIG91dDsKKwllcnJvciA9IC1FTk9UU09DSzsKKwlzb2NrX2lub2RlID0gbmNwX2ZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCWlmICghU19JU1NPQ0soc29ja19pbm9kZS0+aV9tb2RlKSkKKwkJZ290byBvdXRfZnB1dDsKKwlzb2NrID0gU09DS0VUX0koc29ja19pbm9kZSk7CisJaWYgKCFzb2NrKQorCQlnb3RvIG91dF9mcHV0OworCQkKKwlpZiAoc29jay0+dHlwZSA9PSBTT0NLX1NUUkVBTSkKKwkJZGVmYXVsdF9idWZzaXplID0gMHhGMDAwOworCWVsc2UKKwkJZGVmYXVsdF9idWZzaXplID0gMTAyNDsKKworCXNiLT5zX2ZsYWdzIHw9IE1TX05PRElSQVRJTUU7CS8qIHByb2JhYmx5IGV2ZW4gbm9hdGltZSAqLworCXNiLT5zX21heGJ5dGVzID0gMHhGRkZGRkZGRlU7CisJc2ItPnNfYmxvY2tzaXplID0gMTAyNDsJLyogRWguLi4gIElzIHRoaXMgY29ycmVjdD8gKi8KKwlzYi0+c19ibG9ja3NpemVfYml0cyA9IDEwOworCXNiLT5zX21hZ2ljID0gTkNQX1NVUEVSX01BR0lDOworCXNiLT5zX29wID0gJm5jcF9zb3BzOworCisJc2VydmVyID0gTkNQX1NCUChzYik7CisJbWVtc2V0KHNlcnZlciwgMCwgc2l6ZW9mKCpzZXJ2ZXIpKTsKKworCXNlcnZlci0+bmNwX2ZpbHAgPSBuY3BfZmlscDsKKwlzZXJ2ZXItPm5jcF9zb2NrID0gc29jazsKKwkKKwlpZiAoZGF0YS5pbmZvX2ZkICE9IC0xKSB7CisJCXN0cnVjdCBzb2NrZXQgKmluZm9fc29jazsKKworCQllcnJvciA9IC1FQkFERjsKKwkJc2VydmVyLT5pbmZvX2ZpbHAgPSBmZ2V0KGRhdGEuaW5mb19mZCk7CisJCWlmICghc2VydmVyLT5pbmZvX2ZpbHApCisJCQlnb3RvIG91dF9mcHV0OworCQllcnJvciA9IC1FTk9UU09DSzsKKwkJc29ja19pbm9kZSA9IHNlcnZlci0+aW5mb19maWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwkJaWYgKCFTX0lTU09DSyhzb2NrX2lub2RlLT5pX21vZGUpKQorCQkJZ290byBvdXRfZnB1dDI7CisJCWluZm9fc29jayA9IFNPQ0tFVF9JKHNvY2tfaW5vZGUpOworCQlpZiAoIWluZm9fc29jaykKKwkJCWdvdG8gb3V0X2ZwdXQyOworCQllcnJvciA9IC1FQkFERkQ7CisJCWlmIChpbmZvX3NvY2stPnR5cGUgIT0gU09DS19TVFJFQU0pCisJCQlnb3RvIG91dF9mcHV0MjsKKwkJc2VydmVyLT5pbmZvX3NvY2sgPSBpbmZvX3NvY2s7CisJfQorCisvKglzZXJ2ZXItPmxvY2sgPSAwOwkqLworCWluaXRfTVVURVgoJnNlcnZlci0+c2VtKTsKKwlzZXJ2ZXItPnBhY2tldCA9IE5VTEw7CisvKglzZXJ2ZXItPmJ1ZmZlcl9zaXplID0gMDsJKi8KKy8qCXNlcnZlci0+Y29ubl9zdGF0dXMgPSAwOwkqLworLyoJc2VydmVyLT5yb290X2RlbnRyeSA9IE5VTEw7CSovCisvKglzZXJ2ZXItPnJvb3Rfc2V0dXBlZCA9IDA7CSovCisjaWZkZWYgQ09ORklHX05DUEZTX1BBQ0tFVF9TSUdOSU5HCisvKglzZXJ2ZXItPnNpZ25fd2FudGVkID0gMDsJKi8KKy8qCXNlcnZlci0+c2lnbl9hY3RpdmUgPSAwOwkqLworI2VuZGlmCisJc2VydmVyLT5hdXRoLmF1dGhfdHlwZSA9IE5DUF9BVVRIX05PTkU7CisvKglzZXJ2ZXItPmF1dGgub2JqZWN0X25hbWVfbGVuID0gMDsJKi8KKy8qCXNlcnZlci0+YXV0aC5vYmplY3RfbmFtZSA9IE5VTEw7CSovCisvKglzZXJ2ZXItPmF1dGgub2JqZWN0X3R5cGUgPSAwOwkJKi8KKy8qCXNlcnZlci0+cHJpdi5sZW4gPSAwOwkJCSovCisvKglzZXJ2ZXItPnByaXYuZGF0YSA9IE5VTEw7CQkqLworCisJc2VydmVyLT5tID0gZGF0YTsKKwkvKiBBbHRob3VnaHQgYW55dGhpbmcgcHJvZHVjaW5nIHRoaXMgaXMgYnVnZ3ksIGl0IGhhcHBlbnMKKwkgICBub3cgYmVjYXVzZSBvZiBQQVRIX01BWCBjaGFuZ2VzLi4gKi8KKwlpZiAoc2VydmVyLT5tLnRpbWVfb3V0IDwgMSkgeworCQlzZXJ2ZXItPm0udGltZV9vdXQgPSAxMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiWW91IG5lZWQgdG8gcmVjb21waWxlIHlvdXIgbmNwZnMgdXRpbHMuLlxuIik7CisJfQorCXNlcnZlci0+bS50aW1lX291dCA9IHNlcnZlci0+bS50aW1lX291dCAqIEhaIC8gMTAwOworCXNlcnZlci0+bS5maWxlX21vZGUgPSAoc2VydmVyLT5tLmZpbGVfbW9kZSAmIFNfSVJXWFVHTykgfCBTX0lGUkVHOworCXNlcnZlci0+bS5kaXJfbW9kZSA9IChzZXJ2ZXItPm0uZGlyX21vZGUgJiBTX0lSV1hVR08pIHwgU19JRkRJUjsKKworI2lmZGVmIENPTkZJR19OQ1BGU19OTFMKKwkvKiBsb2FkIHRoZSBkZWZhdWx0IE5MUyBjaGFyc2V0cyAqLworCXNlcnZlci0+bmxzX3ZvbCA9IGxvYWRfbmxzX2RlZmF1bHQoKTsKKwlzZXJ2ZXItPm5sc19pbyA9IGxvYWRfbmxzX2RlZmF1bHQoKTsKKyNlbmRpZiAvKiBDT05GSUdfTkNQRlNfTkxTICovCisKKwlzZXJ2ZXItPmRlbnRyeV90dGwgPSAwOwkvKiBubyBjYWNoaW5nICovCisKKwlJTklUX0xJU1RfSEVBRCgmc2VydmVyLT50eC5yZXF1ZXN0cyk7CisJaW5pdF9NVVRFWCgmc2VydmVyLT5yY3YuY3JlcV9zZW0pOworCXNlcnZlci0+dHguY3JlcQkJPSBOVUxMOworCXNlcnZlci0+cmN2LmNyZXEJPSBOVUxMOworCXNlcnZlci0+ZGF0YV9yZWFkeQk9IHNvY2stPnNrLT5za19kYXRhX3JlYWR5OworCXNlcnZlci0+d3JpdGVfc3BhY2UJPSBzb2NrLT5zay0+c2tfd3JpdGVfc3BhY2U7CisJc2VydmVyLT5lcnJvcl9yZXBvcnQJPSBzb2NrLT5zay0+c2tfZXJyb3JfcmVwb3J0OworCXNvY2stPnNrLT5za191c2VyX2RhdGEJPSBzZXJ2ZXI7CisKKwlpbml0X3RpbWVyKCZzZXJ2ZXItPnRpbWVvdXRfdG0pOworI3VuZGVmIE5DUF9QQUNLRVRfU0laRQorI2RlZmluZSBOQ1BfUEFDS0VUX1NJWkUgMTMxMDcyCisJZXJyb3IgPSAtRU5PTUVNOworCXNlcnZlci0+cGFja2V0X3NpemUgPSBOQ1BfUEFDS0VUX1NJWkU7CisJc2VydmVyLT5wYWNrZXQgPSB2bWFsbG9jKE5DUF9QQUNLRVRfU0laRSk7CisJaWYgKHNlcnZlci0+cGFja2V0ID09IE5VTEwpCisJCWdvdG8gb3V0X25sczsKKworCXNvY2stPnNrLT5za19kYXRhX3JlYWR5CSAgPSBuY3BfdGNwX2RhdGFfcmVhZHk7CisJc29jay0+c2stPnNrX2Vycm9yX3JlcG9ydCA9IG5jcF90Y3BfZXJyb3JfcmVwb3J0OworCWlmIChzb2NrLT50eXBlID09IFNPQ0tfU1RSRUFNKSB7CisJCXNlcnZlci0+cmN2LnB0ciA9ICh1bnNpZ25lZCBjaGFyKikmc2VydmVyLT5yY3YuYnVmOworCQlzZXJ2ZXItPnJjdi5sZW4gPSAxMDsKKwkJc2VydmVyLT5yY3Yuc3RhdGUgPSAwOworCQlJTklUX1dPUksoJnNlcnZlci0+cmN2LnRxLCBuY3BfdGNwX3Jjdl9wcm9jLCBzZXJ2ZXIpOworCQlJTklUX1dPUksoJnNlcnZlci0+dHgudHEsIG5jcF90Y3BfdHhfcHJvYywgc2VydmVyKTsKKwkJc29jay0+c2stPnNrX3dyaXRlX3NwYWNlID0gbmNwX3RjcF93cml0ZV9zcGFjZTsKKwl9IGVsc2UgeworCQlJTklUX1dPUksoJnNlcnZlci0+cmN2LnRxLCBuY3BkZ3JhbV9yY3ZfcHJvYywgc2VydmVyKTsKKwkJSU5JVF9XT1JLKCZzZXJ2ZXItPnRpbWVvdXRfdHEsIG5jcGRncmFtX3RpbWVvdXRfcHJvYywgc2VydmVyKTsKKwkJc2VydmVyLT50aW1lb3V0X3RtLmRhdGEgPSAodW5zaWduZWQgbG9uZylzZXJ2ZXI7CisJCXNlcnZlci0+dGltZW91dF90bS5mdW5jdGlvbiA9IG5jcGRncmFtX3RpbWVvdXRfY2FsbDsKKwl9CisKKwluY3BfbG9ja19zZXJ2ZXIoc2VydmVyKTsKKwllcnJvciA9IG5jcF9jb25uZWN0KHNlcnZlcik7CisJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dF9wYWNrZXQ7CisJRFBSSU5USygibmNwX2ZpbGxfc3VwZXI6IE5DUF9TQlAoc2IpID0gJXhcbiIsIChpbnQpIE5DUF9TQlAoc2IpKTsKKworCWVycm9yID0gLUVNU0dTSVpFOwkvKiAtRVJFTU9URVNJREVJTkNPTVBBVElCTEUgKi8KKyNpZmRlZiBDT05GSUdfTkNQRlNfUEFDS0VUX1NJR05JTkcKKwlpZiAobmNwX25lZ290aWF0ZV9zaXplX2FuZF9vcHRpb25zKHNlcnZlciwgZGVmYXVsdF9idWZzaXplLAorCQlOQ1BfREVGQVVMVF9PUFRJT05TLCAmKHNlcnZlci0+YnVmZmVyX3NpemUpLCAmb3B0aW9ucykgPT0gMCkKKwl7CisJCWlmIChvcHRpb25zICE9IE5DUF9ERUZBVUxUX09QVElPTlMpCisJCXsKKwkJCWlmIChuY3BfbmVnb3RpYXRlX3NpemVfYW5kX29wdGlvbnMoc2VydmVyLCAKKwkJCQlkZWZhdWx0X2J1ZnNpemUsCisJCQkJb3B0aW9ucyAmIDIsIAorCQkJCSYoc2VydmVyLT5idWZmZXJfc2l6ZSksICZvcHRpb25zKSAhPSAwKQorCQkJCQorCQkJeworCQkJCWdvdG8gb3V0X2Rpc2Nvbm5lY3Q7CisJCQl9CisJCX0KKwkJaWYgKG9wdGlvbnMgJiAyKQorCQkJc2VydmVyLT5zaWduX3dhbnRlZCA9IDE7CisJfQorCWVsc2UgCisjZW5kaWYJLyogQ09ORklHX05DUEZTX1BBQ0tFVF9TSUdOSU5HICovCisJaWYgKG5jcF9uZWdvdGlhdGVfYnVmZmVyc2l6ZShzZXJ2ZXIsIGRlZmF1bHRfYnVmc2l6ZSwKKyAgCQkJCSAgICAgJihzZXJ2ZXItPmJ1ZmZlcl9zaXplKSkgIT0gMCkKKwkJZ290byBvdXRfZGlzY29ubmVjdDsKKwlEUFJJTlRLKCJuY3BmczogYnVmc2l6ZSA9ICVkXG4iLCBzZXJ2ZXItPmJ1ZmZlcl9zaXplKTsKKworCW1lbXNldCgmZmluZm8sIDAsIHNpemVvZihmaW5mbykpOworCWZpbmZvLmkuYXR0cmlidXRlcwk9IGFESVI7CisJZmluZm8uaS5kYXRhU3RyZWFtU2l6ZQk9IDA7CS8qIGlnbm9yZWQgKi8KKwlmaW5mby5pLmRpckVudE51bQk9IDA7CisJZmluZm8uaS5Eb3NEaXJOdW0JPSAwOworI2lmZGVmIENPTkZJR19OQ1BGU19TTUFMTERPUworCWZpbmZvLmkuTlNDcmVhdG9yCT0gTldfTlNfRE9TOworI2VuZGlmCisJZmluZm8udm9sdW1lCQk9IE5DUF9OVU1CRVJfT0ZfVk9MVU1FUzsKKwkvKiBzZXQgZGF0ZXMgb2YgbW91bnRwb2ludCB0byBKYW4gMSwgMTk4NjsgMDA6MDAgKi8KKwlmaW5mby5pLmNyZWF0aW9uVGltZQk9IGZpbmZvLmkubW9kaWZ5VGltZQorCQkJCT0gY3B1X3RvX2xlMTYoMHgwMDAwKTsKKwlmaW5mby5pLmNyZWF0aW9uRGF0ZQk9IGZpbmZvLmkubW9kaWZ5RGF0ZQorCQkJCT0gZmluZm8uaS5sYXN0QWNjZXNzRGF0ZQorCQkJCT0gY3B1X3RvX2xlMTYoMHgwQzIxKTsKKwlmaW5mby5pLm5hbWVMZW4JCT0gMDsKKwlmaW5mby5pLmVudHJ5TmFtZVswXQk9ICdcMCc7CisKKwlmaW5mby5vcGVuZWQJCT0gMDsKKwlmaW5mby5pbm8JCT0gMjsJLyogdHJhZGl0aW9uICovCisKKwlzZXJ2ZXItPm5hbWVfc3BhY2VbZmluZm8udm9sdW1lXSA9IE5XX05TX0RPUzsKKworCWVycm9yID0gLUVOT01FTTsKKyAgICAgICAgcm9vdF9pbm9kZSA9IG5jcF9pZ2V0KHNiLCAmZmluZm8pOworICAgICAgICBpZiAoIXJvb3RfaW5vZGUpCisJCWdvdG8gb3V0X2Rpc2Nvbm5lY3Q7CisJRFBSSU5USygibmNwX2ZpbGxfc3VwZXI6IHJvb3Qgdm9sPSVkXG4iLCBOQ1BfRklORk8ocm9vdF9pbm9kZSktPnZvbE51bWJlcik7CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKKyAgICAgICAgaWYgKCFzYi0+c19yb290KQorCQlnb3RvIG91dF9ub19yb290OworCXNiLT5zX3Jvb3QtPmRfb3AgPSAmbmNwX3Jvb3RfZGVudHJ5X29wZXJhdGlvbnM7CisJcmV0dXJuIDA7CisKK291dF9ub19yb290OgorCWlwdXQocm9vdF9pbm9kZSk7CitvdXRfZGlzY29ubmVjdDoKKwluY3BfbG9ja19zZXJ2ZXIoc2VydmVyKTsKKwluY3BfZGlzY29ubmVjdChzZXJ2ZXIpOworCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CitvdXRfcGFja2V0OgorCW5jcF9zdG9wX3Rhc2tzKHNlcnZlcik7CisJdmZyZWUoc2VydmVyLT5wYWNrZXQpOworb3V0X25sczoKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkxTCisJdW5sb2FkX25scyhzZXJ2ZXItPm5sc19pbyk7CisJdW5sb2FkX25scyhzZXJ2ZXItPm5sc192b2wpOworI2VuZGlmCitvdXRfZnB1dDI6CisJaWYgKHNlcnZlci0+aW5mb19maWxwKQorCQlmcHV0KHNlcnZlci0+aW5mb19maWxwKTsKK291dF9mcHV0OgorCS8qIDIzLzEyLzE5OTggTWFyY2luIERhbGVja2kgPGRhbGVja2lAY3MubmV0LnBsPjoKKwkgKiAKKwkgKiBUaGUgcHJldmlvdXNseSB1c2VkIHB1dF9maWxwKG5jcF9maWxwKTsgd2FzIGJvZ291cywgc2luY2UKKwkgKiBpdCBkb2Vzbid0IHByb3BlciB1bmxvY2tpbmcuCisJICovCisJZnB1dChuY3BfZmlscCk7CitvdXQ6CisJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CisJa2ZyZWUoc2VydmVyKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIG5jcF9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gTkNQX1NCUChzYik7CisKKwluY3BfbG9ja19zZXJ2ZXIoc2VydmVyKTsKKwluY3BfZGlzY29ubmVjdChzZXJ2ZXIpOworCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisKKwluY3Bfc3RvcF90YXNrcyhzZXJ2ZXIpOworCisjaWZkZWYgQ09ORklHX05DUEZTX05MUworCS8qIHVubG9hZCB0aGUgTkxTIGNoYXJzZXRzICovCisJaWYgKHNlcnZlci0+bmxzX3ZvbCkKKwl7CisJCXVubG9hZF9ubHMoc2VydmVyLT5ubHNfdm9sKTsKKwkJc2VydmVyLT5ubHNfdm9sID0gTlVMTDsKKwl9CisJaWYgKHNlcnZlci0+bmxzX2lvKQorCXsKKwkJdW5sb2FkX25scyhzZXJ2ZXItPm5sc19pbyk7CisJCXNlcnZlci0+bmxzX2lvID0gTlVMTDsKKwl9CisjZW5kaWYgLyogQ09ORklHX05DUEZTX05MUyAqLworCisJaWYgKHNlcnZlci0+aW5mb19maWxwKQorCQlmcHV0KHNlcnZlci0+aW5mb19maWxwKTsKKwlmcHV0KHNlcnZlci0+bmNwX2ZpbHApOworCWtpbGxfcHJvYyhzZXJ2ZXItPm0ud2RvZ19waWQsIFNJR1RFUk0sIDEpOworCisJaWYgKHNlcnZlci0+cHJpdi5kYXRhKSAKKwkJbmNwX2tmcmVlX3Moc2VydmVyLT5wcml2LmRhdGEsIHNlcnZlci0+cHJpdi5sZW4pOworCWlmIChzZXJ2ZXItPmF1dGgub2JqZWN0X25hbWUpCisJCW5jcF9rZnJlZV9zKHNlcnZlci0+YXV0aC5vYmplY3RfbmFtZSwgc2VydmVyLT5hdXRoLm9iamVjdF9uYW1lX2xlbik7CisJdmZyZWUoc2VydmVyLT5wYWNrZXQpOworCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNlcnZlcik7Cit9CisKK3N0YXRpYyBpbnQgbmNwX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCXN0cnVjdCBkZW50cnkqIGQ7CisJc3RydWN0IGlub2RlKiBpOworCXN0cnVjdCBuY3BfaW5vZGVfaW5mbyogbmk7CisJc3RydWN0IG5jcF9zZXJ2ZXIqIHM7CisJc3RydWN0IG5jcF92b2x1bWVfaW5mbyB2aTsKKwlpbnQgZXJyOworCV9fdTggZGg7CisJCisJZCA9IHNiLT5zX3Jvb3Q7CisJaWYgKCFkKSB7CisJCWdvdG8gZGZsdDsKKwl9CisJaSA9IGQtPmRfaW5vZGU7CisJaWYgKCFpKSB7CisJCWdvdG8gZGZsdDsKKwl9CisJbmkgPSBOQ1BfRklORk8oaSk7CisJaWYgKCFuaSkgeworCQlnb3RvIGRmbHQ7CisJfQorCXMgPSBOQ1BfU0JQKHNiKTsKKwlpZiAoIXMpIHsKKwkJZ290byBkZmx0OworCX0KKwlpZiAoIXMtPm0ubW91bnRlZF92b2xbMF0pIHsKKwkJZ290byBkZmx0OworCX0KKworCWVyciA9IG5jcF9kaXJoYW5kbGVfYWxsb2MocywgbmktPnZvbE51bWJlciwgbmktPkRvc0Rpck51bSwgJmRoKTsKKwlpZiAoZXJyKSB7CisJCWdvdG8gZGZsdDsKKwl9CisJZXJyID0gbmNwX2dldF9kaXJlY3RvcnlfaW5mbyhzLCBkaCwgJnZpKTsKKwluY3BfZGlyaGFuZGxlX2ZyZWUocywgZGgpOworCWlmIChlcnIpIHsKKwkJZ290byBkZmx0OworCX0KKwlidWYtPmZfdHlwZSA9IE5DUF9TVVBFUl9NQUdJQzsKKwlidWYtPmZfYnNpemUgPSB2aS5zZWN0b3JzX3Blcl9ibG9jayAqIDUxMjsKKwlidWYtPmZfYmxvY2tzID0gdmkudG90YWxfYmxvY2tzOworCWJ1Zi0+Zl9iZnJlZSA9IHZpLmZyZWVfYmxvY2tzOworCWJ1Zi0+Zl9iYXZhaWwgPSB2aS5mcmVlX2Jsb2NrczsKKwlidWYtPmZfZmlsZXMgPSB2aS50b3RhbF9kaXJfZW50cmllczsKKwlidWYtPmZfZmZyZWUgPSB2aS5hdmFpbGFibGVfZGlyX2VudHJpZXM7CisJYnVmLT5mX25hbWVsZW4gPSAxMjsKKwlyZXR1cm4gMDsKKworCS8qIFdlIGNhbm5vdCBzYXkgaG93IG11Y2ggZGlzayBzcGFjZSBpcyBsZWZ0IG9uIGEgbW91bnRlZAorCSAgIE5ldFdhcmUgU2VydmVyLCBiZWNhdXNlIGZyZWUgc3BhY2UgaXMgZGlzdHJpYnV0ZWQgb3ZlcgorCSAgIHZvbHVtZXMsIGFuZCB0aGUgY3VycmVudCB1c2VyIG1pZ2h0IGhhdmUgZGlzayBxdW90YXMuIFNvCisJICAgZnJlZSBzcGFjZSBpcyBub3QgdGhhdCBzaW1wbGUgdG8gZGV0ZXJtaW5lLiBPdXIgZGVjaXNpb24KKwkgICBoZXJlIGlzIHRvIGVyciBjb25zZXJ2YXRpdmVseS4gKi8KKworZGZsdDo7CisJYnVmLT5mX3R5cGUgPSBOQ1BfU1VQRVJfTUFHSUM7CisJYnVmLT5mX2JzaXplID0gTkNQX0JMT0NLX1NJWkU7CisJYnVmLT5mX2Jsb2NrcyA9IDA7CisJYnVmLT5mX2JmcmVlID0gMDsKKwlidWYtPmZfYmF2YWlsID0gMDsKKwlidWYtPmZfbmFtZWxlbiA9IDEyOworCXJldHVybiAwOworfQorCitpbnQgbmNwX25vdGlmeV9jaGFuZ2Uoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgcmVzdWx0ID0gMDsKKwlfX2xlMzIgaW5mb19tYXNrOworCXN0cnVjdCBud19tb2RpZnlfZG9zX2luZm8gaW5mbzsKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyOworCisJcmVzdWx0ID0gLUVJTzsKKworCWxvY2tfa2VybmVsKCk7CQorCisJc2VydmVyID0gTkNQX1NFUlZFUihpbm9kZSk7CisJaWYgKCghc2VydmVyKSB8fCAhbmNwX2Nvbm5fdmFsaWQoc2VydmVyKSkKKwkJZ290byBvdXQ7CisKKwkvKiBhZ2VpbmcgdGhlIGRlbnRyeSB0byBmb3JjZSB2YWxpZGF0aW9uICovCisJbmNwX2FnZV9kZW50cnkoc2VydmVyLCBkZW50cnkpOworCisJcmVzdWx0ID0gaW5vZGVfY2hhbmdlX29rKGlub2RlLCBhdHRyKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXN1bHQgPSAtRVBFUk07CisJaWYgKCgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCkgJiYKKwkgICAgIChhdHRyLT5pYV91aWQgIT0gc2VydmVyLT5tLnVpZCkpKQorCQlnb3RvIG91dDsKKworCWlmICgoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpICYmCisJICAgICAoYXR0ci0+aWFfZ2lkICE9IHNlcnZlci0+bS5naWQpKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgJiYKKwkgICAgIChhdHRyLT5pYV9tb2RlICYKKwkgICAgICB+KFNfSUZSRUcgfCBTX0lGRElSIHwgU19JUldYVUdPKSkpKQorCQlnb3RvIG91dDsKKworCWluZm9fbWFzayA9IDA7CisJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCisjaWYgMSAKKyAgICAgICAgaWYgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgIT0gMCkKKyAgICAgICAgeworCQl1bW9kZV90IG5ld21vZGUgPSBhdHRyLT5pYV9tb2RlOworCisJCWluZm9fbWFzayB8PSBETV9BVFRSSUJVVEVTOworCisgICAgICAgICAgICAgICAgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKyAgICAgICAgICAgICAgICAJbmV3bW9kZSAmPSBzZXJ2ZXItPm0uZGlyX21vZGU7CisJCX0gZWxzZSB7CisjaWZkZWYgQ09ORklHX05DUEZTX0VYVFJBUwkJCQorCQkJaWYgKHNlcnZlci0+bS5mbGFncyAmIE5DUF9NT1VOVF9FWFRSQVMpIHsKKwkJCQkvKiBhbnkgbm9uLWRlZmF1bHQgZXhlY3V0ZSBiaXQgc2V0ICovCisJCQkJaWYgKG5ld21vZGUgJiB+c2VydmVyLT5tLmZpbGVfbW9kZSAmIFNfSVhVR08pCisJCQkJCWluZm8uYXR0cmlidXRlcyB8PSBhU0hBUkVEIHwgYVNZU1RFTTsKKwkJCQkvKiByZWFkIGZvciBncm91cC93b3JsZCBhbmQgbm90IGluIGRlZmF1bHQgZmlsZV9tb2RlICovCisJCQkJZWxzZSBpZiAobmV3bW9kZSAmIH5zZXJ2ZXItPm0uZmlsZV9tb2RlICYgU19JUlVHTykKKwkJCQkJaW5mby5hdHRyaWJ1dGVzIHw9IGFTSEFSRUQ7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJCW5ld21vZGUgJj0gc2VydmVyLT5tLmZpbGVfbW9kZTsJCQkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5ld21vZGUgJiBTX0lXVUdPKQorICAgICAgICAgICAgICAgIAlpbmZvLmF0dHJpYnV0ZXMgJj0gfihhUk9OTFl8YVJFTkFNRUlOSElCSVR8YURFTEVURUlOSElCSVQpOworICAgICAgICAgICAgICAgIGVsc2UKKwkJCWluZm8uYXR0cmlidXRlcyB8PSAgKGFST05MWXxhUkVOQU1FSU5ISUJJVHxhREVMRVRFSU5ISUJJVCk7CisKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkZTX05TCisJCWlmIChuY3BfaXNfbmZzX2V4dHJhcyhzZXJ2ZXIsIE5DUF9GSU5GTyhpbm9kZSktPnZvbE51bWJlcikpIHsKKwkJCXJlc3VsdCA9IG5jcF9tb2RpZnlfbmZzX2luZm8oc2VydmVyLAorCQkJCQkJICAgICBOQ1BfRklORk8oaW5vZGUpLT52b2xOdW1iZXIsCisJCQkJCQkgICAgIE5DUF9GSU5GTyhpbm9kZSktPmRpckVudE51bSwKKwkJCQkJCSAgICAgYXR0ci0+aWFfbW9kZSwgMCk7CisJCQlpZiAocmVzdWx0ICE9IDApCisJCQkJZ290byBvdXQ7CisJCQlpbmZvLmF0dHJpYnV0ZXMgJj0gfihhU0hBUkVEIHwgYVNZU1RFTSk7CisJCQl7CisJCQkJLyogbWFyayBwYXJ0aWFsIHN1Y2Nlc3MgKi8KKwkJCQlzdHJ1Y3QgaWF0dHIgdG1wYXR0cjsKKwkJCQkKKwkJCQl0bXBhdHRyLmlhX3ZhbGlkID0gQVRUUl9NT0RFOworCQkJCXRtcGF0dHIuaWFfbW9kZSA9IGF0dHItPmlhX21vZGU7CisKKwkJCQlyZXN1bHQgPSBpbm9kZV9zZXRhdHRyKGlub2RlLCAmdG1wYXR0cik7CisJCQkJaWYgKHJlc3VsdCkKKwkJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKyNlbmRpZgorICAgICAgICB9CisjZW5kaWYKKworCS8qIERvIFNJWkUgYmVmb3JlIGF0dHJpYnV0ZXMsIG90aGVyd2lzZSBtdGltZSB0b2dldGhlciB3aXRoIHNpemUgZG9lcyBub3Qgd29yay4uLgorCSAqLworCWlmICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpICE9IDApIHsKKwkJaW50IHdyaXR0ZW47CisKKwkJRFBSSU5USygibmNwZnM6IHRyeWluZyB0byBjaGFuZ2Ugc2l6ZSB0byAlbGRcbiIsCisJCQlhdHRyLT5pYV9zaXplKTsKKworCQlpZiAoKHJlc3VsdCA9IG5jcF9tYWtlX29wZW4oaW5vZGUsIE9fV1JPTkxZKSkgPCAwKSB7CisJCQlyZXN1bHQgPSAtRUFDQ0VTOworCQkJZ290byBvdXQ7CisJCX0KKwkJbmNwX3dyaXRlX2tlcm5lbChOQ1BfU0VSVkVSKGlub2RlKSwgTkNQX0ZJTkZPKGlub2RlKS0+ZmlsZV9oYW5kbGUsCisJCQkgIGF0dHItPmlhX3NpemUsIDAsICIiLCAmd3JpdHRlbik7CisKKwkJLyogQWNjb3JkaW5nIHRvIG5kaXIsIHRoZSBjaGFuZ2VzIG9ubHkgdGFrZSBlZmZlY3QgYWZ0ZXIKKwkJICAgY2xvc2luZyB0aGUgZmlsZSAqLworCQluY3BfaW5vZGVfY2xvc2UoaW5vZGUpOworCQlyZXN1bHQgPSBuY3BfbWFrZV9jbG9zZWQoaW5vZGUpOworCQlpZiAocmVzdWx0KQorCQkJZ290byBvdXQ7CisJCXsKKwkJCXN0cnVjdCBpYXR0ciB0bXBhdHRyOworCQkJCisJCQl0bXBhdHRyLmlhX3ZhbGlkID0gQVRUUl9TSVpFOworCQkJdG1wYXR0ci5pYV9zaXplID0gYXR0ci0+aWFfc2l6ZTsKKwkJCQorCQkJcmVzdWx0ID0gaW5vZGVfc2V0YXR0cihpbm9kZSwgJnRtcGF0dHIpOworCQkJaWYgKHJlc3VsdCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlpZiAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9DVElNRSkgIT0gMCkgeworCQlpbmZvX21hc2sgfD0gKERNX0NSRUFURV9USU1FIHwgRE1fQ1JFQVRFX0RBVEUpOworCQluY3BfZGF0ZV91bml4MmRvcyhhdHRyLT5pYV9jdGltZS50dl9zZWMsCisJCQkgICAgICZpbmZvLmNyZWF0aW9uVGltZSwgJmluZm8uY3JlYXRpb25EYXRlKTsKKwl9CisJaWYgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTVRJTUUpICE9IDApIHsKKwkJaW5mb19tYXNrIHw9IChETV9NT0RJRllfVElNRSB8IERNX01PRElGWV9EQVRFKTsKKwkJbmNwX2RhdGVfdW5peDJkb3MoYXR0ci0+aWFfbXRpbWUudHZfc2VjLAorCQkJCSAgJmluZm8ubW9kaWZ5VGltZSwgJmluZm8ubW9kaWZ5RGF0ZSk7CisJfQorCWlmICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0FUSU1FKSAhPSAwKSB7CisJCV9fbGUxNiBkdW1teTsKKwkJaW5mb19tYXNrIHw9IChETV9MQVNUX0FDQ0VTU19EQVRFKTsKKwkJbmNwX2RhdGVfdW5peDJkb3MoYXR0ci0+aWFfYXRpbWUudHZfc2VjLAorCQkJCSAgJmR1bW15LCAmaW5mby5sYXN0QWNjZXNzRGF0ZSk7CisJfQorCWlmIChpbmZvX21hc2sgIT0gMCkgeworCQlyZXN1bHQgPSBuY3BfbW9kaWZ5X2ZpbGVfb3Jfc3ViZGlyX2Rvc19pbmZvKE5DUF9TRVJWRVIoaW5vZGUpLAorCQkJCSAgICAgIGlub2RlLCBpbmZvX21hc2ssICZpbmZvKTsKKwkJaWYgKHJlc3VsdCAhPSAwKSB7CisJCQlyZXN1bHQgPSAtRUFDQ0VTOworCisJCQlpZiAoaW5mb19tYXNrID09IChETV9DUkVBVEVfVElNRSB8IERNX0NSRUFURV9EQVRFKSkgeworCQkJCS8qIE5ldFdhcmUgc2VlbXMgbm90IHRvIGFsbG93IHRoaXMuIEkKKwkJCQkgICBkbyBub3Qga25vdyB3aHkuIFNvLCBqdXN0IHRlbGwgdGhlCisJCQkJICAgdXNlciBldmVyeXRoaW5nIHdlbnQgZmluZS4gVGhpcyBpcworCQkJCSAgIGEgdGVycmlibGUgaGFjaywgYnV0IEkgZG8gbm90IGtub3cKKwkJCQkgICBob3cgdG8gZG8gdGhpcyBjb3JyZWN0bHkuICovCisJCQkJcmVzdWx0ID0gMDsKKwkJCX0gZWxzZQorCQkJCWdvdG8gb3V0OworCQl9CisjaWZkZWYgQ09ORklHX05DUEZTX1NUUk9ORwkJCisJCWlmICgoIXJlc3VsdCkgJiYgKGluZm9fbWFzayAmIERNX0FUVFJJQlVURVMpKQorCQkJTkNQX0ZJTkZPKGlub2RlKS0+bndhdHRyID0gaW5mby5hdHRyaWJ1dGVzOworI2VuZGlmCisJfQorCWlmICghcmVzdWx0KQorCQlyZXN1bHQgPSBpbm9kZV9zZXRhdHRyKGlub2RlLCBhdHRyKTsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworI2lmZGVmIERFQlVHX05DUF9NQUxMT0MKK2ludCBuY3BfbWFsbG9jZWQ7CitpbnQgbmNwX2N1cnJlbnRfbWFsbG9jZWQ7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqbmNwX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2Jfbm9kZXYoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIG5jcF9maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIG5jcF9mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAibmNwZnMiLAorCS5nZXRfc2IJCT0gbmNwX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYW5vbl9zdXBlciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmNwX2ZzKHZvaWQpCit7CisJaW50IGVycjsKKwlEUFJJTlRLKCJuY3BmczogaW5pdF9tb2R1bGUgY2FsbGVkXG4iKTsKKworI2lmZGVmIERFQlVHX05DUF9NQUxMT0MKKwluY3BfbWFsbG9jZWQgPSAwOworCW5jcF9jdXJyZW50X21hbGxvY2VkID0gMDsKKyNlbmRpZgorCWVyciA9IGluaXRfaW5vZGVjYWNoZSgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwllcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZuY3BfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJcmV0dXJuIDA7CitvdXQ6CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CitvdXQxOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25jcF9mcyh2b2lkKQoreworCURQUklOVEsoIm5jcGZzOiBjbGVhbnVwX21vZHVsZSBjYWxsZWRcbiIpOworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmbmNwX2ZzX3R5cGUpOworCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworI2lmZGVmIERFQlVHX05DUF9NQUxMT0MKKwlQUklOVEsoIm5jcF9tYWxsb2NlZDogJWRcbiIsIG5jcF9tYWxsb2NlZCk7CisJUFJJTlRLKCJuY3BfY3VycmVudF9tYWxsb2NlZDogJWRcbiIsIG5jcF9jdXJyZW50X21hbGxvY2VkKTsKKyNlbmRpZgorfQorCittb2R1bGVfaW5pdChpbml0X25jcF9mcykKK21vZHVsZV9leGl0KGV4aXRfbmNwX2ZzKQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvaW9jdGwuYyBiL2ZzL25jcGZzL2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkZjc5MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25jcGZzL2lvY3RsLmMKQEAgLTAsMCArMSw2NDkgQEAKKy8qCisgKiAgaW9jdGwuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgVm9sa2VyIExlbmRlY2tlCisgKiAgTW9kaWZpZWQgMTk5NyBQZXRlciBXYWx0ZW5iZXJnLCBCaWxsIEhhd2VzLCBEYXZpZCBXb29kaG91c2UgZm9yIDIuMSBkY2FjaGUKKyAqICBNb2RpZmllZCAxOTk4LCAxOTk5IFdvbGZyYW0gUGllbmtvc3MgZm9yIE5MUworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uY3BfZnMuaD4KKworI2luY2x1ZGUgIm5jcGxpYl9rZXJuZWwuaCIKKworLyogbWF4aW11bSBsaW1pdCBmb3IgbmNwX29iamVjdG5hbWVfaW9jdGwgKi8KKyNkZWZpbmUgTkNQX09CSkVDVF9OQU1FX01BWF9MRU4JNDA5NgorLyogbWF4aW11bSBsaW1pdCBmb3IgbmNwX3ByaXZhdGVkYXRhX2lvY3RsICovCisjZGVmaW5lIE5DUF9QUklWQVRFX0RBVEFfTUFYX0xFTiA4MTkyCisvKiBtYXhpbXVtIG5lZ290aWFibGUgcGFja2V0IHNpemUgKi8KKyNkZWZpbmUgTkNQX1BBQ0tFVF9TSVpFX0lOVEVSTkFMIDY1NTM2CisKK3N0YXRpYyBpbnQKK25jcF9nZXRfZnNfaW5mbyhzdHJ1Y3QgbmNwX3NlcnZlciogc2VydmVyLCBzdHJ1Y3QgaW5vZGUqIGlub2RlLCBzdHJ1Y3QgbmNwX2ZzX2luZm8gX191c2VyICphcmcpCit7CisJc3RydWN0IG5jcF9mc19pbmZvIGluZm87CisKKwlpZiAoKHBlcm1pc3Npb24oaW5vZGUsIE1BWV9XUklURSwgTlVMTCkgIT0gMCkKKwkgICAgJiYgKGN1cnJlbnQtPnVpZCAhPSBzZXJ2ZXItPm0ubW91bnRlZF91aWQpKSB7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoaW5mby52ZXJzaW9uICE9IE5DUF9HRVRfRlNfSU5GT19WRVJTSU9OKSB7CisJCURQUklOVEsoImluZm8udmVyc2lvbiBpbnZhbGlkOiAlZFxuIiwgaW5mby52ZXJzaW9uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIFRPRE86IGluZm8uYWRkciA9IHNlcnZlci0+bS5zZXJ2X2FkZHI7ICovCisJU0VUX1VJRChpbmZvLm1vdW50ZWRfdWlkLCBzZXJ2ZXItPm0ubW91bnRlZF91aWQpOworCWluZm8uY29ubmVjdGlvbgkJPSBzZXJ2ZXItPmNvbm5lY3Rpb247CisJaW5mby5idWZmZXJfc2l6ZQk9IHNlcnZlci0+YnVmZmVyX3NpemU7CisJaW5mby52b2x1bWVfbnVtYmVyCT0gTkNQX0ZJTkZPKGlub2RlKS0+dm9sTnVtYmVyOworCWluZm8uZGlyZWN0b3J5X2lkCT0gTkNQX0ZJTkZPKGlub2RlKS0+RG9zRGlyTnVtOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmNwX2dldF9mc19pbmZvX3YyKHN0cnVjdCBuY3Bfc2VydmVyKiBzZXJ2ZXIsIHN0cnVjdCBpbm9kZSogaW5vZGUsIHN0cnVjdCBuY3BfZnNfaW5mb192MiBfX3VzZXIgKiBhcmcpCit7CisJc3RydWN0IG5jcF9mc19pbmZvX3YyIGluZm8yOworCisJaWYgKChwZXJtaXNzaW9uKGlub2RlLCBNQVlfV1JJVEUsIE5VTEwpICE9IDApCisJICAgICYmIChjdXJyZW50LT51aWQgIT0gc2VydmVyLT5tLm1vdW50ZWRfdWlkKSkgeworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvMiwgYXJnLCBzaXplb2YoaW5mbzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoaW5mbzIudmVyc2lvbiAhPSBOQ1BfR0VUX0ZTX0lORk9fVkVSU0lPTl9WMikgeworCQlEUFJJTlRLKCJpbmZvLnZlcnNpb24gaW52YWxpZDogJWRcbiIsIGluZm8yLnZlcnNpb24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaW5mbzIubW91bnRlZF91aWQgICA9IHNlcnZlci0+bS5tb3VudGVkX3VpZDsKKwlpbmZvMi5jb25uZWN0aW9uICAgID0gc2VydmVyLT5jb25uZWN0aW9uOworCWluZm8yLmJ1ZmZlcl9zaXplICAgPSBzZXJ2ZXItPmJ1ZmZlcl9zaXplOworCWluZm8yLnZvbHVtZV9udW1iZXIgPSBOQ1BfRklORk8oaW5vZGUpLT52b2xOdW1iZXI7CisJaW5mbzIuZGlyZWN0b3J5X2lkICA9IE5DUF9GSU5GTyhpbm9kZSktPkRvc0Rpck51bTsKKwlpbmZvMi5kdW1teTEgPSBpbmZvMi5kdW1teTIgPSBpbmZvMi5kdW1teTMgPSAwOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZpbmZvMiwgc2l6ZW9mKGluZm8yKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX05DUEZTX05MUworLyogSGVyZSB3ZSBhcmUgc2VsZWN0IHRoZSBpb2NoYXJzZXQgYW5kIHRoZSBjb2RlcGFnZSBmb3IgTkxTLgorICogVGhhbmtzIFBldHIgVmFuZHJvdmVjIGZvciBpZGVhIGFuZCBtYW55IGhpbnRzLgorICovCitzdGF0aWMgaW50CituY3Bfc2V0X2NoYXJzZXRzKHN0cnVjdCBuY3Bfc2VydmVyKiBzZXJ2ZXIsIHN0cnVjdCBuY3BfbmxzX2lvY3RsIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBuY3BfbmxzX2lvY3RsIHVzZXI7CisJc3RydWN0IG5sc190YWJsZSAqY29kZXBhZ2U7CisJc3RydWN0IG5sc190YWJsZSAqaW9jaGFyc2V0OworCXN0cnVjdCBubHNfdGFibGUgKm9sZHNldF9pbzsKKwlzdHJ1Y3QgbmxzX3RhYmxlICpvbGRzZXRfY3A7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRUFDQ0VTOworCWlmIChzZXJ2ZXItPnJvb3Rfc2V0dXBlZCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdXNlciwgYXJnLCBzaXplb2YodXNlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWNvZGVwYWdlID0gTlVMTDsKKwl1c2VyLmNvZGVwYWdlW05DUF9JT0NTTkFNRV9MRU5dID0gMDsKKwlpZiAoIXVzZXIuY29kZXBhZ2VbMF0gfHwgIXN0cmNtcCh1c2VyLmNvZGVwYWdlLCAiZGVmYXVsdCIpKQorCQljb2RlcGFnZSA9IGxvYWRfbmxzX2RlZmF1bHQoKTsKKwllbHNlIHsKKwkJY29kZXBhZ2UgPSBsb2FkX25scyh1c2VyLmNvZGVwYWdlKTsKKwkJaWYgKCFjb2RlcGFnZSkgeworCQkJcmV0dXJuIC1FQkFEUlFDOworCQl9CisJfQorCisJaW9jaGFyc2V0ID0gTlVMTDsKKwl1c2VyLmlvY2hhcnNldFtOQ1BfSU9DU05BTUVfTEVOXSA9IDA7CisJaWYgKCF1c2VyLmlvY2hhcnNldFswXSB8fCAhc3RyY21wKHVzZXIuaW9jaGFyc2V0LCAiZGVmYXVsdCIpKSB7CisJCWlvY2hhcnNldCA9IGxvYWRfbmxzX2RlZmF1bHQoKTsKKwkJTkNQX0NMUl9GTEFHKHNlcnZlciwgTkNQX0ZMQUdfVVRGOCk7CisJfSBlbHNlIGlmICghc3RyY21wKHVzZXIuaW9jaGFyc2V0LCAidXRmOCIpKSB7CisJCWlvY2hhcnNldCA9IGxvYWRfbmxzX2RlZmF1bHQoKTsKKwkJTkNQX1NFVF9GTEFHKHNlcnZlciwgTkNQX0ZMQUdfVVRGOCk7CisJfSBlbHNlIHsKKwkJaW9jaGFyc2V0ID0gbG9hZF9ubHModXNlci5pb2NoYXJzZXQpOworCQlpZiAoIWlvY2hhcnNldCkgeworCQkJdW5sb2FkX25scyhjb2RlcGFnZSk7CisJCQlyZXR1cm4gLUVCQURSUUM7CisJCX0KKwkJTkNQX0NMUl9GTEFHKHNlcnZlciwgTkNQX0ZMQUdfVVRGOCk7CisJfQorCisJb2xkc2V0X2NwID0gc2VydmVyLT5ubHNfdm9sOworCXNlcnZlci0+bmxzX3ZvbCA9IGNvZGVwYWdlOworCW9sZHNldF9pbyA9IHNlcnZlci0+bmxzX2lvOworCXNlcnZlci0+bmxzX2lvID0gaW9jaGFyc2V0OworCisJaWYgKG9sZHNldF9jcCkKKwkJdW5sb2FkX25scyhvbGRzZXRfY3ApOworCWlmIChvbGRzZXRfaW8pCisJCXVubG9hZF9ubHMob2xkc2V0X2lvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CituY3BfZ2V0X2NoYXJzZXRzKHN0cnVjdCBuY3Bfc2VydmVyKiBzZXJ2ZXIsIHN0cnVjdCBuY3BfbmxzX2lvY3RsIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBuY3BfbmxzX2lvY3RsIHVzZXI7CisJaW50IGxlbjsKKworCW1lbXNldCgmdXNlciwgMCwgc2l6ZW9mKHVzZXIpKTsKKwlpZiAoc2VydmVyLT5ubHNfdm9sICYmIHNlcnZlci0+bmxzX3ZvbC0+Y2hhcnNldCkgeworCQlsZW4gPSBzdHJsZW4oc2VydmVyLT5ubHNfdm9sLT5jaGFyc2V0KTsKKwkJaWYgKGxlbiA+IE5DUF9JT0NTTkFNRV9MRU4pCisJCQlsZW4gPSBOQ1BfSU9DU05BTUVfTEVOOworCQlzdHJuY3B5KHVzZXIuY29kZXBhZ2UsIHNlcnZlci0+bmxzX3ZvbC0+Y2hhcnNldCwgbGVuKTsKKwkJdXNlci5jb2RlcGFnZVtsZW5dID0gMDsKKwl9CisKKwlpZiAoTkNQX0lTX0ZMQUcoc2VydmVyLCBOQ1BfRkxBR19VVEY4KSkKKwkJc3RyY3B5KHVzZXIuaW9jaGFyc2V0LCAidXRmOCIpOworCWVsc2UgaWYgKHNlcnZlci0+bmxzX2lvICYmIHNlcnZlci0+bmxzX2lvLT5jaGFyc2V0KSB7CisJCWxlbiA9IHN0cmxlbihzZXJ2ZXItPm5sc19pby0+Y2hhcnNldCk7CisJCWlmIChsZW4gPiBOQ1BfSU9DU05BTUVfTEVOKQorCQkJbGVuID0gTkNQX0lPQ1NOQU1FX0xFTjsKKwkJc3RybmNweSh1c2VyLmlvY2hhcnNldCwJc2VydmVyLT5ubHNfaW8tPmNoYXJzZXQsIGxlbik7CisJCXVzZXIuaW9jaGFyc2V0W2xlbl0gPSAwOworCX0KKworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmdXNlciwgc2l6ZW9mKHVzZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX05DUEZTX05MUyAqLworCitpbnQgbmNwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIgPSBOQ1BfU0VSVkVSKGlub2RlKTsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBuY3BfaW9jdGxfcmVxdWVzdCByZXF1ZXN0OworCWNoYXIqIGJvdW5jZWJ1ZmZlcjsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBOQ1BfSU9DX05DUFJFUVVFU1Q6CisKKwkJaWYgKChwZXJtaXNzaW9uKGlub2RlLCBNQVlfV1JJVEUsIE5VTEwpICE9IDApCisJCSAgICAmJiAoY3VycmVudC0+dWlkICE9IHNlcnZlci0+bS5tb3VudGVkX3VpZCkpIHsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwgYXJncCwgc2l6ZW9mKHJlcXVlc3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmICgocmVxdWVzdC5mdW5jdGlvbiA+IDI1NSkKKwkJICAgIHx8IChyZXF1ZXN0LnNpemUgPgorCQkgIE5DUF9QQUNLRVRfU0laRSAtIHNpemVvZihzdHJ1Y3QgbmNwX3JlcXVlc3RfaGVhZGVyKSkpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJvdW5jZWJ1ZmZlciA9IHZtYWxsb2MoTkNQX1BBQ0tFVF9TSVpFX0lOVEVSTkFMKTsKKwkJaWYgKCFib3VuY2VidWZmZXIpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGJvdW5jZWJ1ZmZlciwgcmVxdWVzdC5kYXRhLCByZXF1ZXN0LnNpemUpKSB7CisJCQl2ZnJlZShib3VuY2VidWZmZXIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJbmNwX2xvY2tfc2VydmVyKHNlcnZlcik7CisKKwkJLyogRklYTUU6IFdlIGhhY2sgYXJvdW5kIGluIHRoZSBzZXJ2ZXIncyBzdHJ1Y3R1cmVzCisJCSAgIGhlcmUgdG8gYmUgYWJsZSB0byB1c2UgbmNwX3JlcXVlc3QgKi8KKworCQlzZXJ2ZXItPmhhc19zdWJmdW5jdGlvbiA9IDA7CisJCXNlcnZlci0+Y3VycmVudF9zaXplID0gcmVxdWVzdC5zaXplOworCQltZW1jcHkoc2VydmVyLT5wYWNrZXQsIGJvdW5jZWJ1ZmZlciwgcmVxdWVzdC5zaXplKTsKKworCQlyZXN1bHQgPSBuY3BfcmVxdWVzdDIoc2VydmVyLCByZXF1ZXN0LmZ1bmN0aW9uLCAKKwkJCWJvdW5jZWJ1ZmZlciwgTkNQX1BBQ0tFVF9TSVpFX0lOVEVSTkFMKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlyZXN1bHQgPSAtRUlPOworCQllbHNlCisJCQlyZXN1bHQgPSBzZXJ2ZXItPnJlcGx5X3NpemU7CisJCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJCURQUklOVEsoIm5jcF9pb2N0bDogY29weSAlZCBieXRlc1xuIiwKKwkJCXJlc3VsdCk7CisJCWlmIChyZXN1bHQgPj0gMCkKKwkJCWlmIChjb3B5X3RvX3VzZXIocmVxdWVzdC5kYXRhLCBib3VuY2VidWZmZXIsIHJlc3VsdCkpCisJCQkJcmVzdWx0ID0gLUVGQVVMVDsKKwkJdmZyZWUoYm91bmNlYnVmZmVyKTsKKwkJcmV0dXJuIHJlc3VsdDsKKworCWNhc2UgTkNQX0lPQ19DT05OX0xPR0dFRF9JTjoKKworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJaWYgKCEoc2VydmVyLT5tLmludF9mbGFncyAmIE5DUF9JTU9VTlRfTE9HR0VESU5fUE9TU0lCTEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChzZXJ2ZXItPnJvb3Rfc2V0dXBlZCkKKwkJCXJldHVybiAtRUJVU1k7CisJCXNlcnZlci0+cm9vdF9zZXR1cGVkID0gMTsKKwkJcmV0dXJuIG5jcF9jb25uX2xvZ2dlZF9pbihpbm9kZS0+aV9zYik7CisKKwljYXNlIE5DUF9JT0NfR0VUX0ZTX0lORk86CisJCXJldHVybiBuY3BfZ2V0X2ZzX2luZm8oc2VydmVyLCBpbm9kZSwgYXJncCk7CisKKwljYXNlIE5DUF9JT0NfR0VUX0ZTX0lORk9fVjI6CisJCXJldHVybiBuY3BfZ2V0X2ZzX2luZm9fdjIoc2VydmVyLCBpbm9kZSwgYXJncCk7CisKKwljYXNlIE5DUF9JT0NfR0VUTU9VTlRVSUQyOgorCQl7CisJCQl1bnNpZ25lZCBsb25nIHRtcCA9IHNlcnZlci0+bS5tb3VudGVkX3VpZDsKKworCQkJaWYgKCAgIChwZXJtaXNzaW9uKGlub2RlLCBNQVlfUkVBRCwgTlVMTCkgIT0gMCkKKwkJCSAgICAmJiAoY3VycmVudC0+dWlkICE9IHNlcnZlci0+bS5tb3VudGVkX3VpZCkpCisJCQl7CisJCQkJcmV0dXJuIC1FQUNDRVM7CisJCQl9CisJCQlpZiAocHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmdwKSkgCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJY2FzZSBOQ1BfSU9DX0dFVFJPT1Q6CisJCXsKKwkJCXN0cnVjdCBuY3Bfc2V0cm9vdF9pb2N0bCBzcjsKKworCQkJaWYgKCAgIChwZXJtaXNzaW9uKGlub2RlLCBNQVlfUkVBRCwgTlVMTCkgIT0gMCkKKwkJCSAgICAmJiAoY3VycmVudC0+dWlkICE9IHNlcnZlci0+bS5tb3VudGVkX3VpZCkpCisJCQl7CisJCQkJcmV0dXJuIC1FQUNDRVM7CisJCQl9CisJCQlpZiAoc2VydmVyLT5tLm1vdW50ZWRfdm9sWzBdKSB7CisJCQkJc3RydWN0IGRlbnRyeSogZGVudHJ5ID0gaW5vZGUtPmlfc2ItPnNfcm9vdDsKKworCQkJCWlmIChkZW50cnkpIHsKKwkJCQkJc3RydWN0IGlub2RlKiBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwkJCQkKKwkJCQkJaWYgKGlub2RlKSB7CisJCQkJCQlzci52b2xOdW1iZXIgPSBOQ1BfRklORk8oaW5vZGUpLT52b2xOdW1iZXI7CisJCQkJCQlzci5kaXJFbnROdW0gPSBOQ1BfRklORk8oaW5vZGUpLT5kaXJFbnROdW07CisJCQkJCQlzci5uYW1lc3BhY2UgPSBzZXJ2ZXItPm5hbWVfc3BhY2Vbc3Iudm9sTnVtYmVyXTsKKwkJCQkJfSBlbHNlCisJCQkJCQlEUFJJTlRLKCJuY3Bmczogc19yb290LT5kX2lub2RlPT1OVUxMXG4iKTsKKwkJCQl9IGVsc2UKKwkJCQkJRFBSSU5USygibmNwZnM6IHNfcm9vdD09TlVMTFxuIik7CisJCQl9IGVsc2UgeworCQkJCXNyLnZvbE51bWJlciA9IC0xOworCQkJCXNyLm5hbWVzcGFjZSA9IDA7CisJCQkJc3IuZGlyRW50TnVtID0gMDsKKwkJCX0KKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnNyLCBzaXplb2Yoc3IpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CisJY2FzZSBOQ1BfSU9DX1NFVFJPT1Q6CisJCXsKKwkJCXN0cnVjdCBuY3Bfc2V0cm9vdF9pb2N0bCBzcjsKKwkJCV9fdTMyIHZudW07CisJCQlfX2xlMzIgZGU7CisJCQlfX2xlMzIgZG9zZGU7CisJCQlzdHJ1Y3QgZGVudHJ5KiBkZW50cnk7CisKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXsKKwkJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJCX0KKwkJCWlmIChzZXJ2ZXItPnJvb3Rfc2V0dXBlZCkgcmV0dXJuIC1FQlVTWTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmc3IsIGFyZ3AsIHNpemVvZihzcikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKHNyLnZvbE51bWJlciA8IDApIHsKKwkJCQlzZXJ2ZXItPm0ubW91bnRlZF92b2xbMF0gPSAwOworCQkJCXZudW0gPSBOQ1BfTlVNQkVSX09GX1ZPTFVNRVM7CisJCQkJZGUgPSAwOworCQkJCWRvc2RlID0gMDsKKwkJCX0gZWxzZSBpZiAoc3Iudm9sTnVtYmVyID49IE5DUF9OVU1CRVJfT0ZfVk9MVU1FUykgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfSBlbHNlIGlmIChuY3BfbW91bnRfc3ViZGlyKHNlcnZlciwgc3Iudm9sTnVtYmVyLAorCQkJCQkJc3IubmFtZXNwYWNlLCBzci5kaXJFbnROdW0sCisJCQkJCQkmdm51bSwgJmRlLCAmZG9zZGUpKSB7CisJCQkJcmV0dXJuIC1FTk9FTlQ7CisJCQl9CisJCQkKKwkJCWRlbnRyeSA9IGlub2RlLT5pX3NiLT5zX3Jvb3Q7CisJCQlzZXJ2ZXItPnJvb3Rfc2V0dXBlZCA9IDE7CisJCQlpZiAoZGVudHJ5KSB7CisJCQkJc3RydWN0IGlub2RlKiBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwkJCQkKKwkJCQlpZiAoaW5vZGUpIHsKKwkJCQkJTkNQX0ZJTkZPKGlub2RlKS0+dm9sTnVtYmVyID0gdm51bTsKKwkJCQkJTkNQX0ZJTkZPKGlub2RlKS0+ZGlyRW50TnVtID0gZGU7CisJCQkJCU5DUF9GSU5GTyhpbm9kZSktPkRvc0Rpck51bSA9IGRvc2RlOworCQkJCX0gZWxzZQorCQkJCQlEUFJJTlRLKCJuY3Bmczogc19yb290LT5kX2lub2RlPT1OVUxMXG4iKTsKKwkJCX0gZWxzZQorCQkJCURQUklOVEsoIm5jcGZzOiBzX3Jvb3Q9PU5VTExcbiIpOworCisJCQlyZXR1cm4gMDsKKwkJfQorCisjaWZkZWYgQ09ORklHX05DUEZTX1BBQ0tFVF9TSUdOSU5HCQorCWNhc2UgTkNQX0lPQ19TSUdOX0lOSVQ6CisJCWlmICgocGVybWlzc2lvbihpbm9kZSwgTUFZX1dSSVRFLCBOVUxMKSAhPSAwKQorCQkgICAgJiYgKGN1cnJlbnQtPnVpZCAhPSBzZXJ2ZXItPm0ubW91bnRlZF91aWQpKQorCQl7CisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJfQorCQlpZiAoYXJncCkgeworCQkJaWYgKHNlcnZlci0+c2lnbl93YW50ZWQpCisJCQl7CisJCQkJc3RydWN0IG5jcF9zaWduX2luaXQgc2lnbjsKKworCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmc2lnbiwgYXJncCwgc2l6ZW9mKHNpZ24pKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJbWVtY3B5KHNlcnZlci0+c2lnbl9yb290LHNpZ24uc2lnbl9yb290LDgpOworCQkJCW1lbWNweShzZXJ2ZXItPnNpZ25fbGFzdCxzaWduLnNpZ25fbGFzdCwxNik7CisJCQkJc2VydmVyLT5zaWduX2FjdGl2ZSA9IDE7CisJCQl9CisJCQkvKiBpZ25vcmUgd2hlbiBzaWduYXR1cmVzIG5vdCB3YW50ZWQgKi8KKwkJfSBlbHNlIHsKKwkJCXNlcnZlci0+c2lnbl9hY3RpdmUgPSAwOworCQl9CisJCXJldHVybiAwOwkJCisJCQorICAgICAgICBjYXNlIE5DUF9JT0NfU0lHTl9XQU5URUQ6CisJCWlmICggICAocGVybWlzc2lvbihpbm9kZSwgTUFZX1JFQUQsIE5VTEwpICE9IDApCisJCSAgICAmJiAoY3VycmVudC0+dWlkICE9IHNlcnZlci0+bS5tb3VudGVkX3VpZCkpCisJCXsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisJCQorICAgICAgICAgICAgICAgIGlmIChwdXRfdXNlcihzZXJ2ZXItPnNpZ25fd2FudGVkLCAoaW50IF9fdXNlciAqKWFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJY2FzZSBOQ1BfSU9DX1NFVF9TSUdOX1dBTlRFRDoKKwkJeworCQkJaW50IG5ld3N0YXRlOworCisJCQlpZiAoICAgKHBlcm1pc3Npb24oaW5vZGUsIE1BWV9XUklURSwgTlVMTCkgIT0gMCkKKwkJCSAgICAmJiAoY3VycmVudC0+dWlkICE9IHNlcnZlci0+bS5tb3VudGVkX3VpZCkpCisJCQl7CisJCQkJcmV0dXJuIC1FQUNDRVM7CisJCQl9CisJCQkvKiBnZXQgb25seSBsb3cgOCBiaXRzLi4uICovCisJCQlpZiAoZ2V0X3VzZXIobmV3c3RhdGUsICh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKWFyZ3ApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKHNlcnZlci0+c2lnbl9hY3RpdmUpIHsKKwkJCQkvKiBjYW5ub3QgdHVybiBzaWduYXR1cmVzIE9GRiB3aGVuIGFjdGl2ZSAqLworCQkJCWlmICghbmV3c3RhdGUpIHJldHVybiAtRUlOVkFMOworCQkJfSBlbHNlIHsKKwkJCQlzZXJ2ZXItPnNpZ25fd2FudGVkID0gbmV3c3RhdGUgIT0gMDsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisKKyNlbmRpZiAvKiBDT05GSUdfTkNQRlNfUEFDS0VUX1NJR05JTkcgKi8KKworI2lmZGVmIENPTkZJR19OQ1BGU19JT0NUTF9MT0NLSU5HCisJY2FzZSBOQ1BfSU9DX0xPQ0tVTkxPQ0s6CisJCWlmICggICAocGVybWlzc2lvbihpbm9kZSwgTUFZX1dSSVRFLCBOVUxMKSAhPSAwKQorCQkgICAgJiYgKGN1cnJlbnQtPnVpZCAhPSBzZXJ2ZXItPm0ubW91bnRlZF91aWQpKQorCQl7CisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJfQorCQl7CisJCQlzdHJ1Y3QgbmNwX2xvY2tfaW9jdGwJIHJxZGF0YTsKKwkJCWludCByZXN1bHQ7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmcnFkYXRhLCBhcmdwLCBzaXplb2YocnFkYXRhKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAocnFkYXRhLm9yaWdpbiAhPSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJLyogY2hlY2sgZm9yIGNtZCAqLworCQkJc3dpdGNoIChycWRhdGEuY21kKSB7CisJCQkJY2FzZSBOQ1BfTE9DS19FWDoKKwkJCQljYXNlIE5DUF9MT0NLX1NIOgorCQkJCQkJaWYgKHJxZGF0YS50aW1lb3V0ID09IDApCisJCQkJCQkJcnFkYXRhLnRpbWVvdXQgPSBOQ1BfTE9DS19ERUZBVUxUX1RJTUVPVVQ7CisJCQkJCQllbHNlIGlmIChycWRhdGEudGltZW91dCA+IE5DUF9MT0NLX01BWF9USU1FT1VUKQorCQkJCQkJCXJxZGF0YS50aW1lb3V0ID0gTkNQX0xPQ0tfTUFYX1RJTUVPVVQ7CisJCQkJCQlicmVhazsKKwkJCQljYXNlIE5DUF9MT0NLX0xPRzoKKwkJCQkJCXJxZGF0YS50aW1lb3V0ID0gTkNQX0xPQ0tfREVGQVVMVF9USU1FT1VUOwkvKiBoYXMgbm8gZWZmZWN0ICovCisJCQkJY2FzZSBOQ1BfTE9DS19DTEVBUjoKKwkJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCS8qIGxvY2tpbmcgbmVlZHMgYm90aCByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgKi8KKwkJCWlmICgocmVzdWx0ID0gbmNwX21ha2Vfb3Blbihpbm9kZSwgT19SRFdSKSkgIT0gMCkKKwkJCXsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJcmVzdWx0ID0gLUVJTzsKKwkJCWlmICghbmNwX2Nvbm5fdmFsaWQoc2VydmVyKSkKKwkJCQlnb3RvIG91dHJlbDsKKwkJCXJlc3VsdCA9IC1FSVNESVI7CisJCQlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCQkJZ290byBvdXRyZWw7CisJCQlpZiAocnFkYXRhLmNtZCA9PSBOQ1BfTE9DS19DTEVBUikKKwkJCXsKKwkJCQlyZXN1bHQgPSBuY3BfQ2xlYXJQaHlzaWNhbFJlY29yZChOQ1BfU0VSVkVSKGlub2RlKSwKKwkJCQkJCQlOQ1BfRklORk8oaW5vZGUpLT5maWxlX2hhbmRsZSwgCisJCQkJCQkJcnFkYXRhLm9mZnNldCwKKwkJCQkJCQlycWRhdGEubGVuZ3RoKTsKKwkJCQlpZiAocmVzdWx0ID4gMCkgcmVzdWx0ID0gMDsJLyogbm8gc3VjaCBsb2NrICovCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaW50IGxvY2tjbWQ7CisKKwkJCQlzd2l0Y2ggKHJxZGF0YS5jbWQpCisJCQkJeworCQkJCQljYXNlIE5DUF9MT0NLX0VYOiAgbG9ja2NtZD0xOyBicmVhazsKKwkJCQkJY2FzZSBOQ1BfTE9DS19TSDogIGxvY2tjbWQ9MzsgYnJlYWs7CisJCQkJCWRlZmF1bHQ6CSAgIGxvY2tjbWQ9MDsgYnJlYWs7CisJCQkJfQorCQkJCXJlc3VsdCA9IG5jcF9Mb2dQaHlzaWNhbFJlY29yZChOQ1BfU0VSVkVSKGlub2RlKSwKKwkJCQkJCQlOQ1BfRklORk8oaW5vZGUpLT5maWxlX2hhbmRsZSwKKwkJCQkJCQlsb2NrY21kLAorCQkJCQkJCXJxZGF0YS5vZmZzZXQsCisJCQkJCQkJcnFkYXRhLmxlbmd0aCwKKwkJCQkJCQlycWRhdGEudGltZW91dCk7CisJCQkJaWYgKHJlc3VsdCA+IDApIHJlc3VsdCA9IC1FQUdBSU47CisJCQl9CitvdXRyZWw6CQkJCisJCQluY3BfaW5vZGVfY2xvc2UoaW5vZGUpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorI2VuZGlmCS8qIENPTkZJR19OQ1BGU19JT0NUTF9MT0NLSU5HICovCisKKwljYXNlIE5DUF9JT0NfR0VUT0JKRUNUTkFNRToKKwkJaWYgKGN1cnJlbnQtPnVpZCAhPSBzZXJ2ZXItPm0ubW91bnRlZF91aWQpIHsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisJCXsKKwkJCXN0cnVjdCBuY3Bfb2JqZWN0bmFtZV9pb2N0bCB1c2VyOworCQkJc2l6ZV90IG91dGw7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmdXNlciwgYXJncCwgc2l6ZW9mKHVzZXIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXVzZXIuYXV0aF90eXBlID0gc2VydmVyLT5hdXRoLmF1dGhfdHlwZTsKKwkJCW91dGwgPSB1c2VyLm9iamVjdF9uYW1lX2xlbjsKKwkJCXVzZXIub2JqZWN0X25hbWVfbGVuID0gc2VydmVyLT5hdXRoLm9iamVjdF9uYW1lX2xlbjsKKwkJCWlmIChvdXRsID4gdXNlci5vYmplY3RfbmFtZV9sZW4pCisJCQkJb3V0bCA9IHVzZXIub2JqZWN0X25hbWVfbGVuOworCQkJaWYgKG91dGwpIHsKKwkJCQlpZiAoY29weV90b191c2VyKHVzZXIub2JqZWN0X25hbWUsCisJCQkJCQkgc2VydmVyLT5hdXRoLm9iamVjdF9uYW1lLAorCQkJCQkJIG91dGwpKSByZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnVzZXIsIHNpemVvZih1c2VyKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgTkNQX0lPQ19TRVRPQkpFQ1ROQU1FOgorCQlpZiAoY3VycmVudC0+dWlkICE9IHNlcnZlci0+bS5tb3VudGVkX3VpZCkgeworCQkJcmV0dXJuIC1FQUNDRVM7CisJCX0KKwkJeworCQkJc3RydWN0IG5jcF9vYmplY3RuYW1lX2lvY3RsIHVzZXI7CisJCQl2b2lkKiBuZXduYW1lOworCQkJdm9pZCogb2xkbmFtZTsKKwkJCXNpemVfdCBvbGRuYW1lbGVuOworCQkJdm9pZCogb2xkcHJpdmF0ZTsKKwkJCXNpemVfdCBvbGRwcml2YXRlbGVuOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnVzZXIsIGFyZ3AsIHNpemVvZih1c2VyKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAodXNlci5vYmplY3RfbmFtZV9sZW4gPiBOQ1BfT0JKRUNUX05BTUVfTUFYX0xFTikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWlmICh1c2VyLm9iamVjdF9uYW1lX2xlbikgeworCQkJCW5ld25hbWUgPSBuY3Bfa21hbGxvYyh1c2VyLm9iamVjdF9uYW1lX2xlbiwgR0ZQX1VTRVIpOworCQkJCWlmICghbmV3bmFtZSkgcmV0dXJuIC1FTk9NRU07CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKG5ld25hbWUsIHVzZXIub2JqZWN0X25hbWUsIHVzZXIub2JqZWN0X25hbWVfbGVuKSkgeworCQkJCQluY3Bfa2ZyZWVfcyhuZXduYW1lLCB1c2VyLm9iamVjdF9uYW1lX2xlbik7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbmV3bmFtZSA9IE5VTEw7CisJCQl9CisJCQkvKiBlbnRlciBjcml0aWNhbCBzZWN0aW9uICovCisJCQkvKiBtYXliZSB0aGF0IGtmcmVlIGNhbiBzbGVlcCBzbyBkbyB0aGF0IHRoaXMgd2F5ICovCisJCQkvKiBpdCBpcyBhdCBsZWFzdCBtb3JlIFNNUCBmcmllbmRseSAoaW4gZnV0dXJlLi4uKSAqLworCQkJb2xkbmFtZSA9IHNlcnZlci0+YXV0aC5vYmplY3RfbmFtZTsKKwkJCW9sZG5hbWVsZW4gPSBzZXJ2ZXItPmF1dGgub2JqZWN0X25hbWVfbGVuOworCQkJb2xkcHJpdmF0ZSA9IHNlcnZlci0+cHJpdi5kYXRhOworCQkJb2xkcHJpdmF0ZWxlbiA9IHNlcnZlci0+cHJpdi5sZW47CisJCQlzZXJ2ZXItPmF1dGguYXV0aF90eXBlID0gdXNlci5hdXRoX3R5cGU7CisJCQlzZXJ2ZXItPmF1dGgub2JqZWN0X25hbWVfbGVuID0gdXNlci5vYmplY3RfbmFtZV9sZW47CisJCQlzZXJ2ZXItPmF1dGgub2JqZWN0X25hbWUgPSBuZXduYW1lOworCQkJc2VydmVyLT5wcml2LmxlbiA9IDA7CisJCQlzZXJ2ZXItPnByaXYuZGF0YSA9IE5VTEw7CisJCQkvKiBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uICovCisJCQlpZiAob2xkcHJpdmF0ZSkgbmNwX2tmcmVlX3Mob2xkcHJpdmF0ZSwgb2xkcHJpdmF0ZWxlbik7CisJCQlpZiAob2xkbmFtZSkgbmNwX2tmcmVlX3Mob2xkbmFtZSwgb2xkbmFtZWxlbik7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgTkNQX0lPQ19HRVRQUklWQVRFREFUQToKKwkJaWYgKGN1cnJlbnQtPnVpZCAhPSBzZXJ2ZXItPm0ubW91bnRlZF91aWQpIHsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisJCXsKKwkJCXN0cnVjdCBuY3BfcHJpdmF0ZWRhdGFfaW9jdGwgdXNlcjsKKwkJCXNpemVfdCBvdXRsOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnVzZXIsIGFyZ3AsIHNpemVvZih1c2VyKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlvdXRsID0gdXNlci5sZW47CisJCQl1c2VyLmxlbiA9IHNlcnZlci0+cHJpdi5sZW47CisJCQlpZiAob3V0bCA+IHVzZXIubGVuKSBvdXRsID0gdXNlci5sZW47CisJCQlpZiAob3V0bCkgeworCQkJCWlmIChjb3B5X3RvX3VzZXIodXNlci5kYXRhLAorCQkJCQkJIHNlcnZlci0+cHJpdi5kYXRhLAorCQkJCQkJIG91dGwpKSByZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnVzZXIsIHNpemVvZih1c2VyKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgTkNQX0lPQ19TRVRQUklWQVRFREFUQToKKwkJaWYgKGN1cnJlbnQtPnVpZCAhPSBzZXJ2ZXItPm0ubW91bnRlZF91aWQpIHsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisJCXsKKwkJCXN0cnVjdCBuY3BfcHJpdmF0ZWRhdGFfaW9jdGwgdXNlcjsKKwkJCXZvaWQqIG5ldzsKKwkJCXZvaWQqIG9sZDsKKwkJCXNpemVfdCBvbGRsZW47CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmdXNlciwgYXJncCwgc2l6ZW9mKHVzZXIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmICh1c2VyLmxlbiA+IE5DUF9QUklWQVRFX0RBVEFfTUFYX0xFTikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWlmICh1c2VyLmxlbikgeworCQkJCW5ldyA9IG5jcF9rbWFsbG9jKHVzZXIubGVuLCBHRlBfVVNFUik7CisJCQkJaWYgKCFuZXcpIHJldHVybiAtRU5PTUVNOworCQkJCWlmIChjb3B5X2Zyb21fdXNlcihuZXcsIHVzZXIuZGF0YSwgdXNlci5sZW4pKSB7CisJCQkJCW5jcF9rZnJlZV9zKG5ldywgdXNlci5sZW4pOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW5ldyA9IE5VTEw7CisJCQl9CisJCQkvKiBlbnRlciBjcml0aWNhbCBzZWN0aW9uICovCisJCQlvbGQgPSBzZXJ2ZXItPnByaXYuZGF0YTsKKwkJCW9sZGxlbiA9IHNlcnZlci0+cHJpdi5sZW47CisJCQlzZXJ2ZXItPnByaXYubGVuID0gdXNlci5sZW47CisJCQlzZXJ2ZXItPnByaXYuZGF0YSA9IG5ldzsKKwkJCS8qIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gKi8KKwkJCWlmIChvbGQpIG5jcF9rZnJlZV9zKG9sZCwgb2xkbGVuKTsKKwkJCXJldHVybiAwOworCQl9CisKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkxTCisJY2FzZSBOQ1BfSU9DX1NFVENIQVJTRVRTOgorCQlyZXR1cm4gbmNwX3NldF9jaGFyc2V0cyhzZXJ2ZXIsIGFyZ3ApOworCQkKKwljYXNlIE5DUF9JT0NfR0VUQ0hBUlNFVFM6CisJCXJldHVybiBuY3BfZ2V0X2NoYXJzZXRzKHNlcnZlciwgYXJncCk7CisKKyNlbmRpZiAvKiBDT05GSUdfTkNQRlNfTkxTICovCisKKwljYXNlIE5DUF9JT0NfU0VUREVOVFJZVFRMOgorCQlpZiAoKHBlcm1pc3Npb24oaW5vZGUsIE1BWV9XUklURSwgTlVMTCkgIT0gMCkgJiYKKwkJCQkgKGN1cnJlbnQtPnVpZCAhPSBzZXJ2ZXItPm0ubW91bnRlZF91aWQpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCXsKKwkJCXVfaW50MzJfdCB1c2VyOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnVzZXIsIGFyZ3AsIHNpemVvZih1c2VyKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkvKiAyMCBzZWNzIGF0IG1vc3QuLi4gKi8KKwkJCWlmICh1c2VyID4gMjAwMDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl1c2VyID0gKHVzZXIgKiBIWikgLyAxMDAwOworCQkJc2VydmVyLT5kZW50cnlfdHRsID0gdXNlcjsKKwkJCXJldHVybiAwOworCQl9CisJCQorCWNhc2UgTkNQX0lPQ19HRVRERU5UUllUVEw6CisJCXsKKwkJCXVfaW50MzJfdCB1c2VyID0gKHNlcnZlci0+ZGVudHJ5X3R0bCAqIDEwMDApIC8gSFo7CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ1c2VyLCBzaXplb2YodXNlcikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KKworCX0KKy8qICNpZmRlZiBDT05GSUdfVUlEMTYgKi8KKwkvKiBOQ1BfSU9DX0dFVE1PVU5UVUlEIG1heSBiZSBzYW1lIGFzIE5DUF9JT0NfR0VUTU9VTlRVSUQyLAorICAgICAgICAgICBzbyB3ZSBoYXZlIHRoaXMgb3V0IG9mIHN3aXRjaCAqLworCWlmIChjbWQgPT0gTkNQX0lPQ19HRVRNT1VOVFVJRCkgeworCQlfX2tlcm5lbF91aWRfdCB1aWQgPSAwOworCQlpZiAoKHBlcm1pc3Npb24oaW5vZGUsIE1BWV9SRUFELCBOVUxMKSAhPSAwKQorCQkgICAgJiYgKGN1cnJlbnQtPnVpZCAhPSBzZXJ2ZXItPm0ubW91bnRlZF91aWQpKSB7CisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJfQorCQlTRVRfVUlEKHVpZCwgc2VydmVyLT5tLm1vdW50ZWRfdWlkKTsKKwkJaWYgKHB1dF91c2VyKHVpZCwgKF9fa2VybmVsX3VpZF90IF9fdXNlciAqKWFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKy8qICNlbmRpZiAqLworCXJldHVybiAtRUlOVkFMOworfQpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvbW1hcC5jIGIvZnMvbmNwZnMvbW1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZDYwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uY3Bmcy9tbWFwLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiAgbW1hcC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBWb2xrZXIgTGVuZGVja2UKKyAqICBNb2RpZmllZCAxOTk3IFBldGVyIFdhbHRlbmJlcmcsIEJpbGwgSGF3ZXMsIERhdmlkIFdvb2Rob3VzZSBmb3IgMi4xIGRjYWNoZQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NobS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L25jcF9mcy5oPgorCisjaW5jbHVkZSAibmNwbGliX2tlcm5lbC5oIgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKgorICogRmlsbCBpbiB0aGUgc3VwcGxpZWQgcGFnZSBmb3IgbW1hcAorICovCitzdGF0aWMgc3RydWN0IHBhZ2UqIG5jcF9maWxlX21tYXBfbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50ICp0eXBlKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gYXJlYS0+dm1fZmlsZTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBwYWdlKiBwYWdlOworCWNoYXIgKnBnX2FkZHI7CisJdW5zaWduZWQgaW50IGFscmVhZHlfcmVhZDsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJaW50IGJ1ZnNpemU7CisJaW50IHBvczsKKworCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9ISUdIVVNFUik7IC8qIG5jcGZzIGhhcyBub3RoaW5nIGFnYWluc3QgaGlnaCBwYWdlcworCSAgICAgICAgICAgYXMgbG9uZyBhcyByZWN2bXNnIGFuZCBtZW1zZXQgd29ya3Mgb24gaXQgKi8KKwlpZiAoIXBhZ2UpCisJCXJldHVybiBwYWdlOworCXBnX2FkZHIgPSBrbWFwKHBhZ2UpOworCWFkZHJlc3MgJj0gUEFHRV9NQVNLOworCXBvcyA9IGFkZHJlc3MgLSBhcmVhLT52bV9zdGFydCArIChhcmVhLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUKTsKKworCWNvdW50ID0gUEFHRV9TSVpFOworCWlmIChhZGRyZXNzICsgUEFHRV9TSVpFID4gYXJlYS0+dm1fZW5kKSB7CisJCWNvdW50ID0gYXJlYS0+dm1fZW5kIC0gYWRkcmVzczsKKwl9CisJLyogd2hhdCB3ZSBjYW4gcmVhZCBpbiBvbmUgZ28gKi8KKwlidWZzaXplID0gTkNQX1NFUlZFUihpbm9kZSktPmJ1ZmZlcl9zaXplOworCisJYWxyZWFkeV9yZWFkID0gMDsKKwlpZiAobmNwX21ha2Vfb3Blbihpbm9kZSwgT19SRE9OTFkpID49IDApIHsKKwkJd2hpbGUgKGFscmVhZHlfcmVhZCA8IGNvdW50KSB7CisJCQlpbnQgcmVhZF90aGlzX3RpbWU7CisJCQlpbnQgdG9fcmVhZDsKKworCQkJdG9fcmVhZCA9IGJ1ZnNpemUgLSAocG9zICUgYnVmc2l6ZSk7CisKKwkJCXRvX3JlYWQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHRvX3JlYWQsIGNvdW50IC0gYWxyZWFkeV9yZWFkKTsKKworCQkJaWYgKG5jcF9yZWFkX2tlcm5lbChOQ1BfU0VSVkVSKGlub2RlKSwKKwkJCQkgICAgIE5DUF9GSU5GTyhpbm9kZSktPmZpbGVfaGFuZGxlLAorCQkJCSAgICAgcG9zLCB0b19yZWFkLAorCQkJCSAgICAgcGdfYWRkciArIGFscmVhZHlfcmVhZCwKKwkJCQkgICAgICZyZWFkX3RoaXNfdGltZSkgIT0gMCkgeworCQkJCXJlYWRfdGhpc190aW1lID0gMDsKKwkJCX0KKwkJCXBvcyArPSByZWFkX3RoaXNfdGltZTsKKwkJCWFscmVhZHlfcmVhZCArPSByZWFkX3RoaXNfdGltZTsKKworCQkJaWYgKHJlYWRfdGhpc190aW1lIDwgdG9fcmVhZCkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCW5jcF9pbm9kZV9jbG9zZShpbm9kZSk7CisKKwl9CisKKwlpZiAoYWxyZWFkeV9yZWFkIDwgUEFHRV9TSVpFKQorCQltZW1zZXQocGdfYWRkciArIGFscmVhZHlfcmVhZCwgMCwgUEFHRV9TSVpFIC0gYWxyZWFkeV9yZWFkKTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlrdW5tYXAocGFnZSk7CisKKwkvKgorCSAqIElmIEkgdW5kZXJzdGFuZCBuY3BfcmVhZF9rZXJuZWwoKSBwcm9wZXJseSwgdGhlIGFib3ZlIGFsd2F5cworCSAqIGZldGNoZXMgZnJvbSB0aGUgbmV0d29yaywgaGVyZSB0aGUgYW5hbG9ndWUgb2YgZGlzay4KKwkgKiAtLSB3bGkKKwkgKi8KKwlpZiAodHlwZSkKKwkJKnR5cGUgPSBWTV9GQVVMVF9NQUpPUjsKKwlpbmNfcGFnZV9zdGF0ZShwZ21hamZhdWx0KTsKKwlyZXR1cm4gcGFnZTsKK30KKworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBuY3BfZmlsZV9tbWFwID0KK3sKKwkubm9wYWdlCT0gbmNwX2ZpbGVfbW1hcF9ub3BhZ2UsCit9OworCisKKy8qIFRoaXMgaXMgdXNlZCBmb3IgYSBnZW5lcmFsIG1tYXAgb2YgYSBuY3AgZmlsZSAqLworaW50IG5jcF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJCisJRFBSSU5USygibmNwX21tYXA6IGNhbGxlZFxuIik7CisKKwlpZiAoIW5jcF9jb25uX3ZhbGlkKE5DUF9TRVJWRVIoaW5vZGUpKSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBvbmx5IFBBR0VfQ09XIG9yIHJlYWQtb25seSBzdXBwb3J0ZWQgbm93ICovCisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9TSEFSRUQpCisJCXJldHVybiAtRUlOVkFMOworCS8qIHdlIGRvIG5vdCBzdXBwb3J0IGZpbGVzIGJpZ2dlciB0aGFuIDRHQi4uLiBXZSBldmVudHVhbGx5IAorCSAgIHN1cHBvcnRzIGp1c3QgNEdCLi4uICovCisJaWYgKCgodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUKSArIHZtYS0+dm1fcGdvZmYgCisJICAgPiAoMVUgPDwgKDMyIC0gUEFHRV9TSElGVCkpKQorCQlyZXR1cm4gLUVGQklHOworCisJdm1hLT52bV9vcHMgPSAmbmNwX2ZpbGVfbW1hcDsKKwlmaWxlX2FjY2Vzc2VkKGZpbGUpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvbmNwbGliX2tlcm5lbC5jIGIvZnMvbmNwZnMvbmNwbGliX2tlcm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZWI1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uY3Bmcy9uY3BsaWJfa2VybmVsLmMKQEAgLTAsMCArMSwxMzU1IEBACisvKgorICogIG5jcGxpYl9rZXJuZWwuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgVm9sa2VyIExlbmRlY2tlCisgKiAgTW9kaWZpZWQgZm9yIGJpZyBlbmRpYW4gYnkgSi5GLiBDaGFkaW1hIGFuZCBEYXZpZCBTLiBNaWxsZXIKKyAqICBNb2RpZmllZCAxOTk3IFBldGVyIFdhbHRlbmJlcmcsIEJpbGwgSGF3ZXMsIERhdmlkIFdvb2Rob3VzZSBmb3IgMi4xIGRjYWNoZQorICogIE1vZGlmaWVkIDE5OTkgV29sZnJhbSBQaWVua29zcyBmb3IgTkxTCisgKiAgTW9kaWZpZWQgMjAwMCBCZW4gSGFycmlzLCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSBmb3IgTkZTIE5TIG1ldGEtaW5mbworICoKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgIm5jcGxpYl9rZXJuZWwuaCIKKworc3RhdGljIGlubGluZSB2b2lkIGFzc2VydF9zZXJ2ZXJfbG9ja2VkKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIpCit7CisJaWYgKHNlcnZlci0+bG9jayA9PSAwKSB7CisJCURQUklOVEsoIm5jcGZzOiBzZXJ2ZXIgbm90IGxvY2tlZCFcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgbmNwX2FkZF9ieXRlKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIF9fdTggeCkKK3sKKwlhc3NlcnRfc2VydmVyX2xvY2tlZChzZXJ2ZXIpOworCSooX191OCAqKSAoJihzZXJ2ZXItPnBhY2tldFtzZXJ2ZXItPmN1cnJlbnRfc2l6ZV0pKSA9IHg7CisJc2VydmVyLT5jdXJyZW50X3NpemUgKz0gMTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIG5jcF9hZGRfd29yZChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBfX2xlMTYgeCkKK3sKKwlhc3NlcnRfc2VydmVyX2xvY2tlZChzZXJ2ZXIpOworCXB1dF91bmFsaWduZWQoeCwgKF9fbGUxNiAqKSAoJihzZXJ2ZXItPnBhY2tldFtzZXJ2ZXItPmN1cnJlbnRfc2l6ZV0pKSk7CisJc2VydmVyLT5jdXJyZW50X3NpemUgKz0gMjsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIG5jcF9hZGRfYmUxNihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBfX3UxNiB4KQoreworCWFzc2VydF9zZXJ2ZXJfbG9ja2VkKHNlcnZlcik7CisJcHV0X3VuYWxpZ25lZChjcHVfdG9fYmUxNih4KSwgKF9fYmUxNiAqKSAoJihzZXJ2ZXItPnBhY2tldFtzZXJ2ZXItPmN1cnJlbnRfc2l6ZV0pKSk7CisJc2VydmVyLT5jdXJyZW50X3NpemUgKz0gMjsKK30KKworc3RhdGljIHZvaWQgbmNwX2FkZF9kd29yZChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBfX2xlMzIgeCkKK3sKKwlhc3NlcnRfc2VydmVyX2xvY2tlZChzZXJ2ZXIpOworCXB1dF91bmFsaWduZWQoeCwgKF9fbGUzMiAqKSAoJihzZXJ2ZXItPnBhY2tldFtzZXJ2ZXItPmN1cnJlbnRfc2l6ZV0pKSk7CisJc2VydmVyLT5jdXJyZW50X3NpemUgKz0gNDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIG5jcF9hZGRfYmUzMihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBfX3UzMiB4KQoreworCWFzc2VydF9zZXJ2ZXJfbG9ja2VkKHNlcnZlcik7CisJcHV0X3VuYWxpZ25lZChjcHVfdG9fYmUzMih4KSwgKF9fYmUzMiAqKSgmKHNlcnZlci0+cGFja2V0W3NlcnZlci0+Y3VycmVudF9zaXplXSkpKTsKKwlzZXJ2ZXItPmN1cnJlbnRfc2l6ZSArPSA0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmNwX2FkZF9kd29yZF9saChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBfX3UzMiB4KSB7CisJbmNwX2FkZF9kd29yZChzZXJ2ZXIsIGNwdV90b19sZTMyKHgpKTsKK30KKworc3RhdGljIHZvaWQgbmNwX2FkZF9tZW0oc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgY29uc3Qgdm9pZCAqc291cmNlLCBpbnQgc2l6ZSkKK3sKKwlhc3NlcnRfc2VydmVyX2xvY2tlZChzZXJ2ZXIpOworCW1lbWNweSgmKHNlcnZlci0+cGFja2V0W3NlcnZlci0+Y3VycmVudF9zaXplXSksIHNvdXJjZSwgc2l6ZSk7CisJc2VydmVyLT5jdXJyZW50X3NpemUgKz0gc2l6ZTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIG5jcF9hZGRfcHN0cmluZyhzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBjb25zdCBjaGFyICpzKQoreworCWludCBsZW4gPSBzdHJsZW4ocyk7CisJYXNzZXJ0X3NlcnZlcl9sb2NrZWQoc2VydmVyKTsKKwlpZiAobGVuID4gMjU1KSB7CisJCURQUklOVEsoIm5jcGZzOiBzdHJpbmcgdG9vIGxvbmc6ICVzXG4iLCBzKTsKKwkJbGVuID0gMjU1OworCX0KKwluY3BfYWRkX2J5dGUoc2VydmVyLCBsZW4pOworCW5jcF9hZGRfbWVtKHNlcnZlciwgcywgbGVuKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuY3BfaW5pdF9yZXF1ZXN0KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIpCit7CisJbmNwX2xvY2tfc2VydmVyKHNlcnZlcik7CisKKwlzZXJ2ZXItPmN1cnJlbnRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmNwX3JlcXVlc3RfaGVhZGVyKTsKKwlzZXJ2ZXItPmhhc19zdWJmdW5jdGlvbiA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuY3BfaW5pdF9yZXF1ZXN0X3Moc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgaW50IHN1YmZ1bmN0aW9uKQoreworCW5jcF9sb2NrX3NlcnZlcihzZXJ2ZXIpOworCQorCXNlcnZlci0+Y3VycmVudF9zaXplID0gc2l6ZW9mKHN0cnVjdCBuY3BfcmVxdWVzdF9oZWFkZXIpICsgMjsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCBzdWJmdW5jdGlvbik7CisKKwlzZXJ2ZXItPmhhc19zdWJmdW5jdGlvbiA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqCisgbmNwX3JlcGx5X2RhdGEoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gJihzZXJ2ZXItPnBhY2tldFtzaXplb2Yoc3RydWN0IG5jcF9yZXBseV9oZWFkZXIpICsgb2Zmc2V0XSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191OCBCVkFMKHZvaWQqIGRhdGEpCit7CisJcmV0dXJuIGdldF91bmFsaWduZWQoKF9fdTgqKWRhdGEpOworfQorCitzdGF0aWMgX191OAorIG5jcF9yZXBseV9ieXRlKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGludCBvZmZzZXQpCit7CisJcmV0dXJuIGdldF91bmFsaWduZWQoKF9fdTggKikgbmNwX3JlcGx5X2RhdGEoc2VydmVyLCBvZmZzZXQpKTsKK30KKworc3RhdGljIGlubGluZSBfX3UxNiBXVkFMX0xIKHZvaWQqIGRhdGEpCit7CisJcmV0dXJuIGxlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fbGUxNiopZGF0YSkpOworfQorCitzdGF0aWMgX191MTYKKyBuY3BfcmVwbHlfbGUxNihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBpbnQgb2Zmc2V0KQoreworCXJldHVybiBsZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX2xlMTYgKikgbmNwX3JlcGx5X2RhdGEoc2VydmVyLCBvZmZzZXQpKSk7Cit9CisKK3N0YXRpYyBfX3UxNgorIG5jcF9yZXBseV9iZTE2KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGludCBvZmZzZXQpCit7CisJcmV0dXJuIGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fYmUxNiAqKSBuY3BfcmVwbHlfZGF0YShzZXJ2ZXIsIG9mZnNldCkpKTsKK30KKworc3RhdGljIGlubGluZSBfX3UzMiBEVkFMX0xIKHZvaWQqIGRhdGEpCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fbGUzMiopZGF0YSkpOworfQorCitzdGF0aWMgX19sZTMyCisgbmNwX3JlcGx5X2R3b3JkKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGludCBvZmZzZXQpCit7CisJcmV0dXJuIGdldF91bmFsaWduZWQoKF9fbGUzMiAqKSBuY3BfcmVwbHlfZGF0YShzZXJ2ZXIsIG9mZnNldCkpOworfQorCitzdGF0aWMgaW5saW5lIF9fdTMyIG5jcF9yZXBseV9kd29yZF9saChzdHJ1Y3QgbmNwX3NlcnZlciogc2VydmVyLCBpbnQgb2Zmc2V0KSB7CisJcmV0dXJuIGxlMzJfdG9fY3B1KG5jcF9yZXBseV9kd29yZChzZXJ2ZXIsIG9mZnNldCkpOworfQorCitpbnQKK25jcF9uZWdvdGlhdGVfYnVmZmVyc2l6ZShzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBpbnQgc2l6ZSwgaW50ICp0YXJnZXQpCit7CisJaW50IHJlc3VsdDsKKworCW5jcF9pbml0X3JlcXVlc3Qoc2VydmVyKTsKKwluY3BfYWRkX2JlMTYoc2VydmVyLCBzaXplKTsKKworCWlmICgocmVzdWx0ID0gbmNwX3JlcXVlc3Qoc2VydmVyLCAzMykpICE9IDApIHsKKwkJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJKnRhcmdldCA9IG1pbl90KHVuc2lnbmVkIGludCwgbmNwX3JlcGx5X2JlMTYoc2VydmVyLCAwKSwgc2l6ZSk7CisKKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCXJldHVybiAwOworfQorCisKKy8qIG9wdGlvbnM6IAorICoJYml0IDAJaXB4IGNoZWNrc3VtCisgKgliaXQgMQlwYWNrZXQgc2lnbmluZworICovCitpbnQKK25jcF9uZWdvdGlhdGVfc2l6ZV9hbmRfb3B0aW9ucyhzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCAKKwlpbnQgc2l6ZSwgaW50IG9wdGlvbnMsIGludCAqcmV0X3NpemUsIGludCAqcmV0X29wdGlvbnMpIHsKKwlpbnQgcmVzdWx0OworCisJLyogdGhlcmUgaXMgbWluaW11bSAqLworCWlmIChzaXplIDwgTkNQX0JMT0NLX1NJWkUpIHNpemUgPSBOQ1BfQkxPQ0tfU0laRTsKKworCW5jcF9pbml0X3JlcXVlc3Qoc2VydmVyKTsKKwluY3BfYWRkX2JlMTYoc2VydmVyLCBzaXplKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCBvcHRpb25zKTsKKwkKKwlpZiAoKHJlc3VsdCA9IG5jcF9yZXF1ZXN0KHNlcnZlciwgMHg2MSkpICE9IDApCisJeworCQluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIE5DUCBvdmVyIFVEUCByZXR1cm5zIDAgKCEhISkgKi8KKwlyZXN1bHQgPSBuY3BfcmVwbHlfYmUxNihzZXJ2ZXIsIDApOworCWlmIChyZXN1bHQgPj0gTkNQX0JMT0NLX1NJWkUpCisJCXNpemUgPSBtaW4ocmVzdWx0LCBzaXplKTsKKwkqcmV0X3NpemUgPSBzaXplOworCSpyZXRfb3B0aW9ucyA9IG5jcF9yZXBseV9ieXRlKHNlcnZlciwgNCk7CisKKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCXJldHVybiAwOworfQorCitpbnQgbmNwX2dldF92b2x1bWVfaW5mb193aXRoX251bWJlcihzdHJ1Y3QgbmNwX3NlcnZlciogc2VydmVyLAorCQkJICAgICBpbnQgbiwgc3RydWN0IG5jcF92b2x1bWVfaW5mbyogdGFyZ2V0KSB7CisJaW50IHJlc3VsdDsKKwlpbnQgbGVuOworCisJbmNwX2luaXRfcmVxdWVzdF9zKHNlcnZlciwgNDQpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIG4pOworCisJaWYgKChyZXN1bHQgPSBuY3BfcmVxdWVzdChzZXJ2ZXIsIDIyKSkgIT0gMCkgeworCQlnb3RvIG91dDsKKwl9CisJdGFyZ2V0LT50b3RhbF9ibG9ja3MgPSBuY3BfcmVwbHlfZHdvcmRfbGgoc2VydmVyLCAwKTsKKwl0YXJnZXQtPmZyZWVfYmxvY2tzID0gbmNwX3JlcGx5X2R3b3JkX2xoKHNlcnZlciwgNCk7CisJdGFyZ2V0LT5wdXJnZWFibGVfYmxvY2tzID0gbmNwX3JlcGx5X2R3b3JkX2xoKHNlcnZlciwgOCk7CisJdGFyZ2V0LT5ub3RfeWV0X3B1cmdlYWJsZV9ibG9ja3MgPSBuY3BfcmVwbHlfZHdvcmRfbGgoc2VydmVyLCAxMik7CisJdGFyZ2V0LT50b3RhbF9kaXJfZW50cmllcyA9IG5jcF9yZXBseV9kd29yZF9saChzZXJ2ZXIsIDE2KTsKKwl0YXJnZXQtPmF2YWlsYWJsZV9kaXJfZW50cmllcyA9IG5jcF9yZXBseV9kd29yZF9saChzZXJ2ZXIsIDIwKTsKKwl0YXJnZXQtPnNlY3RvcnNfcGVyX2Jsb2NrID0gbmNwX3JlcGx5X2J5dGUoc2VydmVyLCAyOCk7CisKKwltZW1zZXQoJih0YXJnZXQtPnZvbHVtZV9uYW1lKSwgMCwgc2l6ZW9mKHRhcmdldC0+dm9sdW1lX25hbWUpKTsKKworCXJlc3VsdCA9IC1FSU87CisJbGVuID0gbmNwX3JlcGx5X2J5dGUoc2VydmVyLCAyOSk7CisJaWYgKGxlbiA+IE5DUF9WT0xOQU1FX0xFTikgeworCQlEUFJJTlRLKCJuY3Bmczogdm9sdW1lIG5hbWUgdG9vIGxvbmc6ICVkXG4iLCBsZW4pOworCQlnb3RvIG91dDsKKwl9CisJbWVtY3B5KCYodGFyZ2V0LT52b2x1bWVfbmFtZSksIG5jcF9yZXBseV9kYXRhKHNlcnZlciwgMzApLCBsZW4pOworCXJlc3VsdCA9IDA7CitvdXQ6CisJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgbmNwX2dldF9kaXJlY3RvcnlfaW5mbyhzdHJ1Y3QgbmNwX3NlcnZlciogc2VydmVyLCBfX3U4IG4sIAorCQkJICAgc3RydWN0IG5jcF92b2x1bWVfaW5mbyogdGFyZ2V0KSB7CisJaW50IHJlc3VsdDsKKwlpbnQgbGVuOworCisJbmNwX2luaXRfcmVxdWVzdF9zKHNlcnZlciwgNDUpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIG4pOworCisJaWYgKChyZXN1bHQgPSBuY3BfcmVxdWVzdChzZXJ2ZXIsIDIyKSkgIT0gMCkgeworCQlnb3RvIG91dDsKKwl9CisJdGFyZ2V0LT50b3RhbF9ibG9ja3MgPSBuY3BfcmVwbHlfZHdvcmRfbGgoc2VydmVyLCAwKTsKKwl0YXJnZXQtPmZyZWVfYmxvY2tzID0gbmNwX3JlcGx5X2R3b3JkX2xoKHNlcnZlciwgNCk7CisJdGFyZ2V0LT5wdXJnZWFibGVfYmxvY2tzID0gMDsKKwl0YXJnZXQtPm5vdF95ZXRfcHVyZ2VhYmxlX2Jsb2NrcyA9IDA7CisJdGFyZ2V0LT50b3RhbF9kaXJfZW50cmllcyA9IG5jcF9yZXBseV9kd29yZF9saChzZXJ2ZXIsIDgpOworCXRhcmdldC0+YXZhaWxhYmxlX2Rpcl9lbnRyaWVzID0gbmNwX3JlcGx5X2R3b3JkX2xoKHNlcnZlciwgMTIpOworCXRhcmdldC0+c2VjdG9yc19wZXJfYmxvY2sgPSBuY3BfcmVwbHlfYnl0ZShzZXJ2ZXIsIDIwKTsKKworCW1lbXNldCgmKHRhcmdldC0+dm9sdW1lX25hbWUpLCAwLCBzaXplb2YodGFyZ2V0LT52b2x1bWVfbmFtZSkpOworCisJcmVzdWx0ID0gLUVJTzsKKwlsZW4gPSBuY3BfcmVwbHlfYnl0ZShzZXJ2ZXIsIDIxKTsKKwlpZiAobGVuID4gTkNQX1ZPTE5BTUVfTEVOKSB7CisJCURQUklOVEsoIm5jcGZzOiB2b2x1bWUgbmFtZSB0b28gbG9uZzogJWRcbiIsIGxlbik7CisJCWdvdG8gb3V0OworCX0KKwltZW1jcHkoJih0YXJnZXQtPnZvbHVtZV9uYW1lKSwgbmNwX3JlcGx5X2RhdGEoc2VydmVyLCAyMiksIGxlbik7CisJcmVzdWx0ID0gMDsKK291dDoKKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludAorbmNwX2Nsb3NlX2ZpbGUoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgY29uc3QgY2hhciAqZmlsZV9pZCkKK3sKKwlpbnQgcmVzdWx0OworCisJbmNwX2luaXRfcmVxdWVzdChzZXJ2ZXIpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDApOworCW5jcF9hZGRfbWVtKHNlcnZlciwgZmlsZV9pZCwgNik7CisKKwlyZXN1bHQgPSBuY3BfcmVxdWVzdChzZXJ2ZXIsIDY2KTsKKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludAorbmNwX21ha2VfY2xvc2VkKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGVycjsKKworCWVyciA9IDA7CisJZG93bigmTkNQX0ZJTkZPKGlub2RlKS0+b3Blbl9zZW0pOwkKKwlpZiAoYXRvbWljX3JlYWQoJk5DUF9GSU5GTyhpbm9kZSktPm9wZW5lZCkgPT0gMSkgeworCQlhdG9taWNfc2V0KCZOQ1BfRklORk8oaW5vZGUpLT5vcGVuZWQsIDApOworCQllcnIgPSBuY3BfY2xvc2VfZmlsZShOQ1BfU0VSVkVSKGlub2RlKSwgTkNQX0ZJTkZPKGlub2RlKS0+ZmlsZV9oYW5kbGUpOworCisJCWlmICghZXJyKQorCQkJUFBSSU5USygibmNwX21ha2VfY2xvc2VkOiB2b2xudW09JWQsIGRpcmVudD0ldSwgZXJyb3I9JWRcbiIsCisJCQkJTkNQX0ZJTkZPKGlub2RlKS0+dm9sTnVtYmVyLAorCQkJCU5DUF9GSU5GTyhpbm9kZSktPmRpckVudE51bSwgZXJyKTsKKwl9CisJdXAoJk5DUF9GSU5GTyhpbm9kZSktPm9wZW5fc2VtKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBuY3BfYWRkX2hhbmRsZV9wYXRoKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIF9fdTggdm9sX251bSwKKwkJCQlfX2xlMzIgZGlyX2Jhc2UsIGludCBoYXZlX2Rpcl9iYXNlLCAKKwkJCQljb25zdCBjaGFyICpwYXRoKQoreworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIHZvbF9udW0pOworCW5jcF9hZGRfZHdvcmQoc2VydmVyLCBkaXJfYmFzZSk7CisJaWYgKGhhdmVfZGlyX2Jhc2UgIT0gMCkgeworCQluY3BfYWRkX2J5dGUoc2VydmVyLCAxKTsJLyogZGlyX2Jhc2UgKi8KKwl9IGVsc2UgeworCQluY3BfYWRkX2J5dGUoc2VydmVyLCAweGZmKTsJLyogbm8gaGFuZGxlICovCisJfQorCWlmIChwYXRoICE9IE5VTEwpIHsKKwkJbmNwX2FkZF9ieXRlKHNlcnZlciwgMSk7CS8qIDEgY29tcG9uZW50ICovCisJCW5jcF9hZGRfcHN0cmluZyhzZXJ2ZXIsIHBhdGgpOworCX0gZWxzZSB7CisJCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDApOworCX0KK30KKworaW50IG5jcF9kaXJoYW5kbGVfYWxsb2Moc3RydWN0IG5jcF9zZXJ2ZXIqIHNlcnZlciwgX191OCB2b2xudW0sIF9fbGUzMiBkaXJlbnQsCisJCQlfX3U4KiBkaXJoYW5kbGUpIHsKKwlpbnQgcmVzdWx0OworCisJbmNwX2luaXRfcmVxdWVzdChzZXJ2ZXIpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDEyKTsJCS8qIHN1YmZ1bmN0aW9uICovCisJbmNwX2FkZF9ieXRlKHNlcnZlciwgTldfTlNfRE9TKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCAwKTsKKwluY3BfYWRkX3dvcmQoc2VydmVyLCAwKTsKKwluY3BfYWRkX2hhbmRsZV9wYXRoKHNlcnZlciwgdm9sbnVtLCBkaXJlbnQsIDEsIE5VTEwpOworCWlmICgocmVzdWx0ID0gbmNwX3JlcXVlc3Qoc2VydmVyLCA4NykpID09IDApIHsKKwkJKmRpcmhhbmRsZSA9IG5jcF9yZXBseV9ieXRlKHNlcnZlciwgMCk7CisJfQorCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG5jcF9kaXJoYW5kbGVfZnJlZShzdHJ1Y3QgbmNwX3NlcnZlciogc2VydmVyLCBfX3U4IGRpcmhhbmRsZSkgeworCWludCByZXN1bHQ7CisJCisJbmNwX2luaXRfcmVxdWVzdF9zKHNlcnZlciwgMjApOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIGRpcmhhbmRsZSk7CisJcmVzdWx0ID0gbmNwX3JlcXVlc3Qoc2VydmVyLCAyMik7CisJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCit2b2lkIG5jcF9leHRyYWN0X2ZpbGVfaW5mbyh2b2lkICpzdHJ1Y3R1cmUsIHN0cnVjdCBud19pbmZvX3N0cnVjdCAqdGFyZ2V0KQoreworCV9fdTggKm5hbWVfbGVuOworCWNvbnN0IGludCBpbmZvX3N0cnVjdF9zaXplID0gb2Zmc2V0b2Yoc3RydWN0IG53X2luZm9fc3RydWN0LCBuYW1lTGVuKTsKKworCW1lbWNweSh0YXJnZXQsIHN0cnVjdHVyZSwgaW5mb19zdHJ1Y3Rfc2l6ZSk7CisJbmFtZV9sZW4gPSBzdHJ1Y3R1cmUgKyBpbmZvX3N0cnVjdF9zaXplOworCXRhcmdldC0+bmFtZUxlbiA9ICpuYW1lX2xlbjsKKwltZW1jcHkodGFyZ2V0LT5lbnRyeU5hbWUsIG5hbWVfbGVuICsgMSwgKm5hbWVfbGVuKTsKKwl0YXJnZXQtPmVudHJ5TmFtZVsqbmFtZV9sZW5dID0gJ1wwJzsKKwl0YXJnZXQtPnZvbE51bWJlciA9IGxlMzJfdG9fY3B1KHRhcmdldC0+dm9sTnVtYmVyKTsKKwlyZXR1cm47Cit9CisKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkZTX05TCitzdGF0aWMgaW5saW5lIHZvaWQgbmNwX2V4dHJhY3RfbmZzX2luZm8odW5zaWduZWQgY2hhciAqc3RydWN0dXJlLAorCQkJCSBzdHJ1Y3QgbndfbmZzX2luZm8gKnRhcmdldCkKK3sKKwl0YXJnZXQtPm1vZGUgPSBEVkFMX0xIKHN0cnVjdHVyZSk7CisJdGFyZ2V0LT5yZGV2ID0gRFZBTF9MSChzdHJ1Y3R1cmUgKyA4KTsKK30KKyNlbmRpZgorCitpbnQgbmNwX29idGFpbl9uZnNfaW5mbyhzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLAorCQkgICAgICAgIHN0cnVjdCBud19pbmZvX3N0cnVjdCAqdGFyZ2V0KQorCit7CisJaW50IHJlc3VsdCA9IDA7CisjaWZkZWYgQ09ORklHX05DUEZTX05GU19OUworCV9fdTMyIHZvbG51bSA9IHRhcmdldC0+dm9sTnVtYmVyOworCisJaWYgKG5jcF9pc19uZnNfZXh0cmFzKHNlcnZlciwgdm9sbnVtKSkgeworCQluY3BfaW5pdF9yZXF1ZXN0KHNlcnZlcik7CisJCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDE5KTsJLyogc3ViZnVuY3Rpb24gKi8KKwkJbmNwX2FkZF9ieXRlKHNlcnZlciwgc2VydmVyLT5uYW1lX3NwYWNlW3ZvbG51bV0pOworCQluY3BfYWRkX2J5dGUoc2VydmVyLCBOV19OU19ORlMpOworCQluY3BfYWRkX2J5dGUoc2VydmVyLCAwKTsKKwkJbmNwX2FkZF9ieXRlKHNlcnZlciwgdm9sbnVtKTsKKwkJbmNwX2FkZF9kd29yZChzZXJ2ZXIsIHRhcmdldC0+ZGlyRW50TnVtKTsKKwkJLyogV2UgbXVzdCByZXRyaWV2ZSBib3RoIG5saW5rcyBhbmQgcmRldiwgb3RoZXJ3aXNlIHNvbWUgc2VydmVyIHZlcnNpb25zCisJCSAgIHJlcG9ydCB6ZXJvZXMgaW5zdGVhZCBvZiB2YWxpZCBkYXRhICovCisJCW5jcF9hZGRfZHdvcmRfbGgoc2VydmVyLCBOU0lCTV9ORlNfTU9ERSB8IE5TSUJNX05GU19OTElOS1MgfCBOU0lCTV9ORlNfUkRFVik7CisKKwkJaWYgKChyZXN1bHQgPSBuY3BfcmVxdWVzdChzZXJ2ZXIsIDg3KSkgPT0gMCkgeworCQkJbmNwX2V4dHJhY3RfbmZzX2luZm8obmNwX3JlcGx5X2RhdGEoc2VydmVyLCAwKSwgJnRhcmdldC0+bmZzKTsKKwkJCURQUklOVEsoS0VSTl9ERUJVRworCQkJCSJuY3Bfb2J0YWluX25mc19pbmZvOiAoJXMpIG1vZGU9MCVvLCByZGV2PTB4JXhcbiIsCisJCQkJdGFyZ2V0LT5lbnRyeU5hbWUsIHRhcmdldC0+bmZzLm1vZGUsCisJCQkJdGFyZ2V0LT5uZnMucmRldik7CisJCX0gZWxzZSB7CisJCQl0YXJnZXQtPm5mcy5tb2RlID0gMDsKKwkJCXRhcmdldC0+bmZzLnJkZXYgPSAwOworCQl9CisJICAgICAgICBuY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCisJfSBlbHNlCisjZW5kaWYKKwl7CisJCXRhcmdldC0+bmZzLm1vZGUgPSAwOworCQl0YXJnZXQtPm5mcy5yZGV2ID0gMDsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFJldHVybnMgaW5mb3JtYXRpb24gZm9yIGEgKG9uZS1jb21wb25lbnQpIG5hbWUgcmVsYXRpdmUgdG8KKyAqIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgorICovCitpbnQgbmNwX29idGFpbl9pbmZvKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBpbm9kZSAqZGlyLCBjaGFyICpwYXRoLAorCQkJc3RydWN0IG53X2luZm9fc3RydWN0ICp0YXJnZXQpCit7CisJX191OCAgdm9sbnVtID0gTkNQX0ZJTkZPKGRpciktPnZvbE51bWJlcjsKKwlfX2xlMzIgZGlyZW50ID0gTkNQX0ZJTkZPKGRpciktPmRpckVudE51bTsKKwlpbnQgcmVzdWx0OworCisJaWYgKHRhcmdldCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAibmNwX29idGFpbl9pbmZvOiBpbnZhbGlkIGNhbGxcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbmNwX2luaXRfcmVxdWVzdChzZXJ2ZXIpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDYpOwkvKiBzdWJmdW5jdGlvbiAqLworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIHNlcnZlci0+bmFtZV9zcGFjZVt2b2xudW1dKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCBzZXJ2ZXItPm5hbWVfc3BhY2Vbdm9sbnVtXSk7IC8qIE4uQi4gdHdpY2UgPz8gKi8KKwluY3BfYWRkX3dvcmQoc2VydmVyLCBjcHVfdG9fbGUxNigweDgwMDYpKTsJLyogZ2V0IGFsbCAqLworCW5jcF9hZGRfZHdvcmQoc2VydmVyLCBSSU1fQUxMKTsKKwluY3BfYWRkX2hhbmRsZV9wYXRoKHNlcnZlciwgdm9sbnVtLCBkaXJlbnQsIDEsIHBhdGgpOworCisJaWYgKChyZXN1bHQgPSBuY3BfcmVxdWVzdChzZXJ2ZXIsIDg3KSkgIT0gMCkKKwkJZ290byBvdXQ7CisJbmNwX2V4dHJhY3RfZmlsZV9pbmZvKG5jcF9yZXBseV9kYXRhKHNlcnZlciwgMCksIHRhcmdldCk7CisJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwkKKwlyZXN1bHQgPSBuY3Bfb2J0YWluX25mc19pbmZvKHNlcnZlciwgdGFyZ2V0KTsKKwlyZXR1cm4gcmVzdWx0OworCitvdXQ6CisJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisjaWZkZWYgQ09ORklHX05DUEZTX05GU19OUworc3RhdGljIGludAorbmNwX29idGFpbl9ET1NfZGlyX2Jhc2Uoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwKKwkJX191OCB2b2xudW0sIF9fbGUzMiBkaXJlbnQsCisJCWNoYXIgKnBhdGgsIC8qIEF0IG1vc3QgMSBjb21wb25lbnQgKi8KKwkJX19sZTMyICpET1NfZGlyX2Jhc2UpCit7CisJaW50IHJlc3VsdDsKKworCW5jcF9pbml0X3JlcXVlc3Qoc2VydmVyKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCA2KTsgLyogc3ViZnVuY3Rpb24gKi8KKwluY3BfYWRkX2J5dGUoc2VydmVyLCBzZXJ2ZXItPm5hbWVfc3BhY2Vbdm9sbnVtXSk7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgc2VydmVyLT5uYW1lX3NwYWNlW3ZvbG51bV0pOworCW5jcF9hZGRfd29yZChzZXJ2ZXIsIGNwdV90b19sZTE2KDB4ODAwNikpOyAvKiBnZXQgYWxsICovCisJbmNwX2FkZF9kd29yZChzZXJ2ZXIsIFJJTV9ESVJFQ1RPUlkpOworCW5jcF9hZGRfaGFuZGxlX3BhdGgoc2VydmVyLCB2b2xudW0sIGRpcmVudCwgMSwgcGF0aCk7CisKKwlpZiAoKHJlc3VsdCA9IG5jcF9yZXF1ZXN0KHNlcnZlciwgODcpKSA9PSAwKQorCXsKKwkgICAJaWYgKERPU19kaXJfYmFzZSkgKkRPU19kaXJfYmFzZT1uY3BfcmVwbHlfZHdvcmQoc2VydmVyLCAweDM0KTsKKwl9CisJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8qIENPTkZJR19OQ1BGU19ORlNfTlMgKi8KKworc3RhdGljIGlubGluZSBpbnQKK25jcF9nZXRfa25vd25fbmFtZXNwYWNlKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIF9fdTggdm9sdW1lKQoreworI2lmIGRlZmluZWQoQ09ORklHX05DUEZTX09TMl9OUykgfHwgZGVmaW5lZChDT05GSUdfTkNQRlNfTkZTX05TKQorCWludCByZXN1bHQ7CisJX191OCAqbmFtZXNwYWNlOworCV9fdTE2IG5vX25hbWVzcGFjZXM7CisKKwluY3BfaW5pdF9yZXF1ZXN0KHNlcnZlcik7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMjQpOwkvKiBTdWJmdW5jdGlvbjogR2V0IE5hbWUgU3BhY2VzIExvYWRlZCAqLworCW5jcF9hZGRfd29yZChzZXJ2ZXIsIDApOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIHZvbHVtZSk7CisKKwlpZiAoKHJlc3VsdCA9IG5jcF9yZXF1ZXN0KHNlcnZlciwgODcpKSAhPSAwKSB7CisJCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJCXJldHVybiBOV19OU19ET1M7IC8qIG5vdCByZXN1bHQgPz8gKi8KKwl9CisKKwlyZXN1bHQgPSBOV19OU19ET1M7CisJbm9fbmFtZXNwYWNlcyA9IG5jcF9yZXBseV9sZTE2KHNlcnZlciwgMCk7CisJbmFtZXNwYWNlID0gbmNwX3JlcGx5X2RhdGEoc2VydmVyLCAyKTsKKworCXdoaWxlIChub19uYW1lc3BhY2VzID4gMCkgeworCQlEUFJJTlRLKCJnZXRfbmFtZXNwYWNlczogZm91bmQgJWQgb24gJWRcbiIsICpuYW1lc3BhY2UsIHZvbHVtZSk7CisKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkZTX05TCisJCWlmICgoKm5hbWVzcGFjZSA9PSBOV19OU19ORlMpICYmICEoc2VydmVyLT5tLmZsYWdzJk5DUF9NT1VOVF9OT19ORlMpKSAKKwkJeworCQkJcmVzdWx0ID0gTldfTlNfTkZTOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgkvKiBDT05GSUdfTkNQRlNfTkZTX05TICovCisjaWZkZWYgQ09ORklHX05DUEZTX09TMl9OUworCQlpZiAoKCpuYW1lc3BhY2UgPT0gTldfTlNfT1MyKSAmJiAhKHNlcnZlci0+bS5mbGFncyZOQ1BfTU9VTlRfTk9fT1MyKSkKKwkJeworCQkJcmVzdWx0ID0gTldfTlNfT1MyOworCQl9CisjZW5kaWYJLyogQ09ORklHX05DUEZTX09TMl9OUyAqLworCQluYW1lc3BhY2UgKz0gMTsKKwkJbm9fbmFtZXNwYWNlcyAtPSAxOworCX0KKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCXJldHVybiByZXN1bHQ7CisjZWxzZQkvKiBuZWl0aGVyIE9TMiBub3IgTkZTIC0gb25seSBET1MgKi8KKwlyZXR1cm4gTldfTlNfRE9TOworI2VuZGlmCS8qIGRlZmluZWQoQ09ORklHX05DUEZTX09TMl9OUykgfHwgZGVmaW5lZChDT05GSUdfTkNQRlNfTkZTX05TKSAqLworfQorCitzdGF0aWMgaW50CituY3BfT2J0YWluU3BlY2lmaWNEaXJCYXNlKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsCisJCV9fdTggbnNTcmMsIF9fdTggbnNEc3QsIF9fdTggdm9sX251bSwgX19sZTMyIGRpcl9iYXNlLAorCQljaGFyICpwYXRoLCAvKiBBdCBtb3N0IDEgY29tcG9uZW50ICovCisJCV9fbGUzMiAqZGlyRW50TnVtLCBfX2xlMzIgKkRvc0Rpck51bSkKK3sKKwlpbnQgcmVzdWx0OworCisJbmNwX2luaXRfcmVxdWVzdChzZXJ2ZXIpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDYpOyAvKiBzdWJmdW5jdGlvbiAqLworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIG5zU3JjKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCBuc0RzdCk7CisJbmNwX2FkZF93b3JkKHNlcnZlciwgY3B1X3RvX2xlMTYoMHg4MDA2KSk7IC8qIGdldCBhbGwgKi8KKwluY3BfYWRkX2R3b3JkKHNlcnZlciwgUklNX0FMTCk7CisJbmNwX2FkZF9oYW5kbGVfcGF0aChzZXJ2ZXIsIHZvbF9udW0sIGRpcl9iYXNlLCAxLCBwYXRoKTsKKworCWlmICgocmVzdWx0ID0gbmNwX3JlcXVlc3Qoc2VydmVyLCA4NykpICE9IDApCisJeworCQluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCWlmIChkaXJFbnROdW0pCisJCSpkaXJFbnROdW0gPSBuY3BfcmVwbHlfZHdvcmQoc2VydmVyLCAweDMwKTsKKwlpZiAoRG9zRGlyTnVtKQorCQkqRG9zRGlyTnVtID0gbmNwX3JlcGx5X2R3b3JkKHNlcnZlciwgMHgzNCk7CisJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwlyZXR1cm4gMDsKK30KKworaW50CituY3BfbW91bnRfc3ViZGlyKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsCisJCSBfX3U4IHZvbE51bWJlciwgX191OCBzcmNOUywgX19sZTMyIGRpckVudE51bSwKKwkJIF9fdTMyKiB2b2x1bWUsIF9fbGUzMiogbmV3RGlyRW50LCBfX2xlMzIqIG5ld0Rvc0VudCkKK3sKKwlpbnQgZHN0TlM7CisJaW50IHJlc3VsdDsKKwkKKwlkc3ROUyA9IG5jcF9nZXRfa25vd25fbmFtZXNwYWNlKHNlcnZlciwgdm9sTnVtYmVyKTsKKwlpZiAoKHJlc3VsdCA9IG5jcF9PYnRhaW5TcGVjaWZpY0RpckJhc2Uoc2VydmVyLCBzcmNOUywgZHN0TlMsIHZvbE51bWJlciwgCisJCQkJICAgICAgZGlyRW50TnVtLCBOVUxMLCBuZXdEaXJFbnQsIG5ld0Rvc0VudCkpICE9IDApCisJeworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlzZXJ2ZXItPm5hbWVfc3BhY2Vbdm9sTnVtYmVyXSA9IGRzdE5TOworCSp2b2x1bWUgPSB2b2xOdW1iZXI7CisJc2VydmVyLT5tLm1vdW50ZWRfdm9sWzFdID0gMDsKKwlzZXJ2ZXItPm0ubW91bnRlZF92b2xbMF0gPSAnWCc7CisJcmV0dXJuIDA7Cit9CisKK2ludCAKK25jcF9nZXRfdm9sdW1lX3Jvb3Qoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgY29uc3QgY2hhciAqdm9sbmFtZSwKKwkJICAgIF9fdTMyKiB2b2x1bWUsIF9fbGUzMiogZGlyZW50LCBfX2xlMzIqIGRvc2RpcmVudCkKK3sKKwlpbnQgcmVzdWx0OworCV9fdTggdm9sbnVtOworCisJRFBSSU5USygibmNwX2dldF92b2x1bWVfcm9vdDogbG9va2luZyB1cCB2b2wgJXNcbiIsIHZvbG5hbWUpOworCisJbmNwX2luaXRfcmVxdWVzdChzZXJ2ZXIpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDIyKTsJLyogU3ViZnVuY3Rpb246IEdlbmVyYXRlIGRpciBoYW5kbGUgKi8KKwluY3BfYWRkX2J5dGUoc2VydmVyLCAwKTsJLyogRE9TIG5hbWVzcGFjZSAqLworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDApOwkvKiByZXNlcnZlZCAqLworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDApOwkvKiByZXNlcnZlZCAqLworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDApOwkvKiByZXNlcnZlZCAqLworCisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMCk7CS8qIGZha2VkIHZvbHVtZSBudW1iZXIgKi8KKwluY3BfYWRkX2R3b3JkKHNlcnZlciwgMCk7CS8qIGZha2VkIGRpcl9iYXNlICovCisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMHhmZik7CS8qIERvbid0IGhhdmUgYSBkaXJfYmFzZSAqLworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDEpOwkvKiAxIHBhdGggY29tcG9uZW50ICovCisJbmNwX2FkZF9wc3RyaW5nKHNlcnZlciwgdm9sbmFtZSk7CisKKwlpZiAoKHJlc3VsdCA9IG5jcF9yZXF1ZXN0KHNlcnZlciwgODcpKSAhPSAwKSB7CisJCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCSpkaXJlbnQgPSAqZG9zZGlyZW50ID0gbmNwX3JlcGx5X2R3b3JkKHNlcnZlciwgNCk7CisJdm9sbnVtID0gbmNwX3JlcGx5X2J5dGUoc2VydmVyLCA4KTsKKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCSp2b2x1bWUgPSB2b2xudW07CisKKwlzZXJ2ZXItPm5hbWVfc3BhY2Vbdm9sbnVtXSA9IG5jcF9nZXRfa25vd25fbmFtZXNwYWNlKHNlcnZlciwgdm9sbnVtKTsKKworCURQUklOVEsoImxvb2t1cF92b2w6IG5hbWVzcGFjZVslZF0gPSAlZFxuIiwKKwkJdm9sbnVtLCBzZXJ2ZXItPm5hbWVfc3BhY2Vbdm9sbnVtXSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50CituY3BfbG9va3VwX3ZvbHVtZShzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBjb25zdCBjaGFyICp2b2xuYW1lLAorCQkgIHN0cnVjdCBud19pbmZvX3N0cnVjdCAqdGFyZ2V0KQoreworCWludCByZXN1bHQ7CisKKwltZW1zZXQodGFyZ2V0LCAwLCBzaXplb2YoKnRhcmdldCkpOworCXJlc3VsdCA9IG5jcF9nZXRfdm9sdW1lX3Jvb3Qoc2VydmVyLCB2b2xuYW1lLAorCQkJJnRhcmdldC0+dm9sTnVtYmVyLCAmdGFyZ2V0LT5kaXJFbnROdW0sICZ0YXJnZXQtPkRvc0Rpck51bSk7CisJaWYgKHJlc3VsdCkgeworCQlyZXR1cm4gcmVzdWx0OworCX0KKwl0YXJnZXQtPm5hbWVMZW4gPSBzdHJsZW4odm9sbmFtZSk7CisJbWVtY3B5KHRhcmdldC0+ZW50cnlOYW1lLCB2b2xuYW1lLCB0YXJnZXQtPm5hbWVMZW4rMSk7CisJdGFyZ2V0LT5hdHRyaWJ1dGVzID0gYURJUjsKKwkvKiBzZXQgZGF0ZXMgdG8gSmFuIDEsIDE5ODYgIDAwOjAwICovCisJdGFyZ2V0LT5jcmVhdGlvblRpbWUgPSB0YXJnZXQtPm1vZGlmeVRpbWUgPSBjcHVfdG9fbGUxNigweDAwMDApOworCXRhcmdldC0+Y3JlYXRpb25EYXRlID0gdGFyZ2V0LT5tb2RpZnlEYXRlID0gdGFyZ2V0LT5sYXN0QWNjZXNzRGF0ZSA9IGNwdV90b19sZTE2KDB4MEMyMSk7CisJdGFyZ2V0LT5uZnMubW9kZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK2ludCBuY3BfbW9kaWZ5X2ZpbGVfb3Jfc3ViZGlyX2Rvc19pbmZvX3BhdGgoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwKKwkJCQkJICAgIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJCQkgICAgY29uc3QgY2hhciAqcGF0aCwKKwkJCQkJICAgIF9fbGUzMiBpbmZvX21hc2ssCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgbndfbW9kaWZ5X2Rvc19pbmZvICppbmZvKQoreworCV9fdTggIHZvbG51bSA9IE5DUF9GSU5GTyhkaXIpLT52b2xOdW1iZXI7CisJX19sZTMyIGRpcmVudCA9IE5DUF9GSU5GTyhkaXIpLT5kaXJFbnROdW07CisJaW50IHJlc3VsdDsKKworCW5jcF9pbml0X3JlcXVlc3Qoc2VydmVyKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCA3KTsJLyogc3ViZnVuY3Rpb24gKi8KKwluY3BfYWRkX2J5dGUoc2VydmVyLCBzZXJ2ZXItPm5hbWVfc3BhY2Vbdm9sbnVtXSk7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMCk7CS8qIHJlc2VydmVkICovCisJbmNwX2FkZF93b3JkKHNlcnZlciwgY3B1X3RvX2xlMTYoMHg4MDA2KSk7CS8qIHNlYXJjaCBhdHRyaWJzOiBhbGwgKi8KKworCW5jcF9hZGRfZHdvcmQoc2VydmVyLCBpbmZvX21hc2spOworCW5jcF9hZGRfbWVtKHNlcnZlciwgaW5mbywgc2l6ZW9mKCppbmZvKSk7CisJbmNwX2FkZF9oYW5kbGVfcGF0aChzZXJ2ZXIsIHZvbG51bSwgZGlyZW50LCAxLCBwYXRoKTsKKworCXJlc3VsdCA9IG5jcF9yZXF1ZXN0KHNlcnZlciwgODcpOworCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG5jcF9tb2RpZnlfZmlsZV9vcl9zdWJkaXJfZG9zX2luZm8oc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwKKwkJCQkgICAgICAgc3RydWN0IGlub2RlICpkaXIsCisJCQkJICAgICAgIF9fbGUzMiBpbmZvX21hc2ssCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBud19tb2RpZnlfZG9zX2luZm8gKmluZm8pCit7CisJcmV0dXJuIG5jcF9tb2RpZnlfZmlsZV9vcl9zdWJkaXJfZG9zX2luZm9fcGF0aChzZXJ2ZXIsIGRpciwgTlVMTCwKKwkJaW5mb19tYXNrLCBpbmZvKTsKK30KKworI2lmZGVmIENPTkZJR19OQ1BGU19ORlNfTlMKK2ludCBuY3BfbW9kaWZ5X25mc19pbmZvKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIF9fdTggdm9sbnVtLCBfX2xlMzIgZGlyZW50LAorCQkJICAgICAgIF9fdTMyIG1vZGUsIF9fdTMyIHJkZXYpCisKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKworCWlmIChzZXJ2ZXItPm5hbWVfc3BhY2Vbdm9sbnVtXSA9PSBOV19OU19ORlMpIHsKKwkJbmNwX2luaXRfcmVxdWVzdChzZXJ2ZXIpOworCQluY3BfYWRkX2J5dGUoc2VydmVyLCAyNSk7CS8qIHN1YmZ1bmN0aW9uICovCisJCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIHNlcnZlci0+bmFtZV9zcGFjZVt2b2xudW1dKTsKKwkJbmNwX2FkZF9ieXRlKHNlcnZlciwgTldfTlNfTkZTKTsKKwkJbmNwX2FkZF9ieXRlKHNlcnZlciwgdm9sbnVtKTsKKwkJbmNwX2FkZF9kd29yZChzZXJ2ZXIsIGRpcmVudCk7CisJCS8qIHdlIG11c3QgYWx3YXlzIG9wZXJhdGUgb24gYm90aCBubGlua3MgYW5kIHJkZXYsIG90aGVyd2lzZQorCQkgICByZGV2IGlzIG5vdCBzZXQgKi8KKwkJbmNwX2FkZF9kd29yZF9saChzZXJ2ZXIsIE5TSUJNX05GU19NT0RFIHwgTlNJQk1fTkZTX05MSU5LUyB8IE5TSUJNX05GU19SREVWKTsKKwkJbmNwX2FkZF9kd29yZF9saChzZXJ2ZXIsIG1vZGUpOworCQluY3BfYWRkX2R3b3JkX2xoKHNlcnZlciwgMSk7CS8qIG5saW5rcyAqLworCQluY3BfYWRkX2R3b3JkX2xoKHNlcnZlciwgcmRldik7CisJCXJlc3VsdCA9IG5jcF9yZXF1ZXN0KHNlcnZlciwgODcpOworCQluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKKworc3RhdGljIGludAorbmNwX0RlbGV0ZU5TRW50cnkoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwKKwkJICBfX3U4IGhhdmVfZGlyX2Jhc2UsIF9fdTggdm9sbnVtLCBfX2xlMzIgZGlyZW50LAorCQkgIGNoYXIqIG5hbWUsIF9fdTggbnMsIF9fbGUxNiBhdHRyKQoreworCWludCByZXN1bHQ7CisKKwluY3BfaW5pdF9yZXF1ZXN0KHNlcnZlcik7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgOCk7CS8qIHN1YmZ1bmN0aW9uICovCisJbmNwX2FkZF9ieXRlKHNlcnZlciwgbnMpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDApOwkvKiByZXNlcnZlZCAqLworCW5jcF9hZGRfd29yZChzZXJ2ZXIsIGF0dHIpOwkvKiBzZWFyY2ggYXR0cmliczogYWxsICovCisJbmNwX2FkZF9oYW5kbGVfcGF0aChzZXJ2ZXIsIHZvbG51bSwgZGlyZW50LCBoYXZlX2Rpcl9iYXNlLCBuYW1lKTsKKworCXJlc3VsdCA9IG5jcF9yZXF1ZXN0KHNlcnZlciwgODcpOworCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50CituY3BfZGVsX2ZpbGVfb3Jfc3ViZGlyMihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLAorCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJX191OCAgdm9sbnVtOworCV9fbGUzMiBkaXJlbnQ7CisKKwlpZiAoIWlub2RlKSB7CisjaWZkZWYgQ09ORklHX05DUEZTX0RFQlVHREVOVFJZCisJCVBSSU5USygibmNwZnM6IG5jcGRlbDI6IGRlbnRyeS0+ZF9pbm9kZSA9PSBOVUxMXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gMHhGRjsJLyogQW55IGVycm9yICovCisJfQorCXZvbG51bSA9IE5DUF9GSU5GTyhpbm9kZSktPnZvbE51bWJlcjsKKwlkaXJlbnQgPSBOQ1BfRklORk8oaW5vZGUpLT5Eb3NEaXJOdW07CisJcmV0dXJuIG5jcF9EZWxldGVOU0VudHJ5KHNlcnZlciwgMSwgdm9sbnVtLCBkaXJlbnQsIE5VTEwsIE5XX05TX0RPUywgY3B1X3RvX2xlMTYoMHg4MDA2KSk7Cit9CisKK2ludAorbmNwX2RlbF9maWxlX29yX3N1YmRpcihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLAorCQkgICAgICAgc3RydWN0IGlub2RlICpkaXIsIGNoYXIgKm5hbWUpCit7CisJX191OCAgdm9sbnVtID0gTkNQX0ZJTkZPKGRpciktPnZvbE51bWJlcjsKKwlfX2xlMzIgZGlyZW50ID0gTkNQX0ZJTkZPKGRpciktPmRpckVudE51bTsKKworI2lmZGVmIENPTkZJR19OQ1BGU19ORlNfTlMKKwlpZiAoc2VydmVyLT5uYW1lX3NwYWNlW3ZvbG51bV09PU5XX05TX05GUykKKyAJeworIAkJaW50IHJlc3VsdDsKKyAKKyAJCXJlc3VsdD1uY3Bfb2J0YWluX0RPU19kaXJfYmFzZShzZXJ2ZXIsIHZvbG51bSwgZGlyZW50LCBuYW1lLCAmZGlyZW50KTsKKyAJCWlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7CisgCQlyZXR1cm4gbmNwX0RlbGV0ZU5TRW50cnkoc2VydmVyLCAxLCB2b2xudW0sIGRpcmVudCwgTlVMTCwgTldfTlNfRE9TLCBjcHVfdG9fbGUxNigweDgwMDYpKTsKKyAJfQorIAllbHNlCisjZW5kaWYJLyogQ09ORklHX05DUEZTX05GU19OUyAqLworIAkJcmV0dXJuIG5jcF9EZWxldGVOU0VudHJ5KHNlcnZlciwgMSwgdm9sbnVtLCBkaXJlbnQsIG5hbWUsIHNlcnZlci0+bmFtZV9zcGFjZVt2b2xudW1dLCBjcHVfdG9fbGUxNigweDgwMDYpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIENvbnZlcnRUb05XZnJvbURXT1JEKF9fdTE2IHYwLCBfX3UxNiB2MSwgX191OCByZXRbNl0pCit7CisJX19sZTE2ICpkZXN0ID0gKF9fbGUxNiAqKSByZXQ7CisJZGVzdFsxXSA9IGNwdV90b19sZTE2KHYwKTsKKwlkZXN0WzJdID0gY3B1X3RvX2xlMTYodjEpOworCWRlc3RbMF0gPSBjcHVfdG9fbGUxNih2MCArIDEpOworCXJldHVybjsKK30KKworLyogSWYgYm90aCBkaXIgYW5kIG5hbWUgYXJlIE5VTEwsIHRoZW4gaW4gdGFyZ2V0IHRoZXJlJ3MgYWxyZWFkeSBhCisgICBsb29rZWQtdXAgZW50cnkgdGhhdCB3YW50cyB0byBiZSBvcGVuZWQuICovCitpbnQgbmNwX29wZW5fY3JlYXRlX2ZpbGVfb3Jfc3ViZGlyKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsCisJCQkJICAgc3RydWN0IGlub2RlICpkaXIsIGNoYXIgKm5hbWUsCisJCQkJICAgaW50IG9wZW5fY3JlYXRlX21vZGUsCisJCQkJICAgX19sZTMyIGNyZWF0ZV9hdHRyaWJ1dGVzLAorCQkJCSAgIF9fbGUxNiBkZXNpcmVkX2FjY19yaWdodHMsCisJCQkJICAgc3RydWN0IG5jcF9lbnRyeV9pbmZvICp0YXJnZXQpCit7CisJX19sZTE2IHNlYXJjaF9hdHRyaWJzID0gY3B1X3RvX2xlMTYoMHgwMDA2KTsKKwlfX3U4ICB2b2xudW07CisJX19sZTMyIGRpcmVudDsKKwlpbnQgcmVzdWx0OworCisJdm9sbnVtID0gTkNQX0ZJTkZPKGRpciktPnZvbE51bWJlcjsKKwlkaXJlbnQgPSBOQ1BfRklORk8oZGlyKS0+ZGlyRW50TnVtOworCisJaWYgKChjcmVhdGVfYXR0cmlidXRlcyAmIGFESVIpICE9IDApIHsKKwkJc2VhcmNoX2F0dHJpYnMgfD0gY3B1X3RvX2xlMTYoMHg4MDAwKTsKKwl9CisJbmNwX2luaXRfcmVxdWVzdChzZXJ2ZXIpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDEpOwkvKiBzdWJmdW5jdGlvbiAqLworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIHNlcnZlci0+bmFtZV9zcGFjZVt2b2xudW1dKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCBvcGVuX2NyZWF0ZV9tb2RlKTsKKwluY3BfYWRkX3dvcmQoc2VydmVyLCBzZWFyY2hfYXR0cmlicyk7CisJbmNwX2FkZF9kd29yZChzZXJ2ZXIsIFJJTV9BTEwpOworCW5jcF9hZGRfZHdvcmQoc2VydmVyLCBjcmVhdGVfYXR0cmlidXRlcyk7CisJLyogVGhlIGRlc2lyZWQgYWNjIHJpZ2h0cyBzZWVtIHRvIGJlIHRoZSBpbmhlcml0ZWQgcmlnaHRzIG1hc2sKKwkgICBmb3IgZGlyZWN0b3JpZXMgKi8KKwluY3BfYWRkX3dvcmQoc2VydmVyLCBkZXNpcmVkX2FjY19yaWdodHMpOworCW5jcF9hZGRfaGFuZGxlX3BhdGgoc2VydmVyLCB2b2xudW0sIGRpcmVudCwgMSwgbmFtZSk7CisKKwlpZiAoKHJlc3VsdCA9IG5jcF9yZXF1ZXN0KHNlcnZlciwgODcpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoIShjcmVhdGVfYXR0cmlidXRlcyAmIGFESVIpKQorCQl0YXJnZXQtPm9wZW5lZCA9IDE7CisKKwkvKiBpbiB0YXJnZXQgdGhlcmUncyBhIG5ldyBmaW5mbyB0byBmaWxsICovCisJbmNwX2V4dHJhY3RfZmlsZV9pbmZvKG5jcF9yZXBseV9kYXRhKHNlcnZlciwgNiksICYodGFyZ2V0LT5pKSk7CisJdGFyZ2V0LT52b2x1bWUgPSB0YXJnZXQtPmkudm9sTnVtYmVyOworCUNvbnZlcnRUb05XZnJvbURXT1JEKG5jcF9yZXBseV9sZTE2KHNlcnZlciwgMCksCisJCQkgICAgIG5jcF9yZXBseV9sZTE2KHNlcnZlciwgMiksCisJCQkgICAgIHRhcmdldC0+ZmlsZV9oYW5kbGUpOworCQorCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisKKwkodm9pZCluY3Bfb2J0YWluX25mc19pbmZvKHNlcnZlciwgJih0YXJnZXQtPmkpKTsKKwlyZXR1cm4gMDsKKworb3V0OgorCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50CituY3BfaW5pdGlhbGl6ZV9zZWFyY2goc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IGlub2RlICpkaXIsCisJCQlzdHJ1Y3Qgbndfc2VhcmNoX3NlcXVlbmNlICp0YXJnZXQpCit7CisJX191OCAgdm9sbnVtID0gTkNQX0ZJTkZPKGRpciktPnZvbE51bWJlcjsKKwlfX2xlMzIgZGlyZW50ID0gTkNQX0ZJTkZPKGRpciktPmRpckVudE51bTsKKwlpbnQgcmVzdWx0OworCisJbmNwX2luaXRfcmVxdWVzdChzZXJ2ZXIpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDIpOwkvKiBzdWJmdW5jdGlvbiAqLworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIHNlcnZlci0+bmFtZV9zcGFjZVt2b2xudW1dKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCAwKTsJLyogcmVzZXJ2ZWQgKi8KKwluY3BfYWRkX2hhbmRsZV9wYXRoKHNlcnZlciwgdm9sbnVtLCBkaXJlbnQsIDEsIE5VTEwpOworCisJcmVzdWx0ID0gbmNwX3JlcXVlc3Qoc2VydmVyLCA4Nyk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBvdXQ7CisJbWVtY3B5KHRhcmdldCwgbmNwX3JlcGx5X2RhdGEoc2VydmVyLCAwKSwgc2l6ZW9mKCp0YXJnZXQpKTsKKworb3V0OgorCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogU2VhcmNoIGZvciBldmVyeXRoaW5nICovCitpbnQgbmNwX3NlYXJjaF9mb3JfZmlsZV9vcl9zdWJkaXIoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwKKwkJCQkgIHN0cnVjdCBud19zZWFyY2hfc2VxdWVuY2UgKnNlcSwKKwkJCQkgIHN0cnVjdCBud19pbmZvX3N0cnVjdCAqdGFyZ2V0KQoreworCWludCByZXN1bHQ7CisKKwluY3BfaW5pdF9yZXF1ZXN0KHNlcnZlcik7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMyk7CS8qIHN1YmZ1bmN0aW9uICovCisJbmNwX2FkZF9ieXRlKHNlcnZlciwgc2VydmVyLT5uYW1lX3NwYWNlW3NlcS0+dm9sTnVtYmVyXSk7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMCk7CS8qIGRhdGEgc3RyZWFtICg/Pz8pICovCisJbmNwX2FkZF93b3JkKHNlcnZlciwgY3B1X3RvX2xlMTYoMHg4MDA2KSk7CS8qIFNlYXJjaCBhdHRyaWJzICovCisJbmNwX2FkZF9kd29yZChzZXJ2ZXIsIFJJTV9BTEwpOwkJLyogcmV0dXJuIGluZm8gbWFzayAqLworCW5jcF9hZGRfbWVtKHNlcnZlciwgc2VxLCA5KTsKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkZTX05TCisJaWYgKHNlcnZlci0+bmFtZV9zcGFjZVtzZXEtPnZvbE51bWJlcl0gPT0gTldfTlNfTkZTKSB7CisJCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDApOwkvKiAwIGJ5dGUgcGF0dGVybiAqLworCX0gZWxzZSAKKyNlbmRpZgorCXsKKwkJbmNwX2FkZF9ieXRlKHNlcnZlciwgMik7CS8qIDIgYnl0ZSBwYXR0ZXJuICovCisJCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDB4ZmYpOwkvKiBmb2xsb3dpbmcgaXMgYSB3aWxkY2FyZCAqLworCQluY3BfYWRkX2J5dGUoc2VydmVyLCAnKicpOworCX0KKwkKKwlpZiAoKHJlc3VsdCA9IG5jcF9yZXF1ZXN0KHNlcnZlciwgODcpKSAhPSAwKQorCQlnb3RvIG91dDsKKwltZW1jcHkoc2VxLCBuY3BfcmVwbHlfZGF0YShzZXJ2ZXIsIDApLCBzaXplb2YoKnNlcSkpOworCW5jcF9leHRyYWN0X2ZpbGVfaW5mbyhuY3BfcmVwbHlfZGF0YShzZXJ2ZXIsIDEwKSwgdGFyZ2V0KTsKKworCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJCisJcmVzdWx0ID0gbmNwX29idGFpbl9uZnNfaW5mbyhzZXJ2ZXIsIHRhcmdldCk7CisJcmV0dXJuIHJlc3VsdDsKKworb3V0OgorCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG5jcF9zZWFyY2hfZm9yX2ZpbGVzZXQoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwKKwkJCSAgIHN0cnVjdCBud19zZWFyY2hfc2VxdWVuY2UgKnNlcSwKKwkJCSAgIGludCogbW9yZSwKKwkJCSAgIGludCogY250LAorCQkJICAgY2hhciogYnVmZmVyLAorCQkJICAgc2l6ZV90IGJ1ZnNpemUsCisJCQkgICBjaGFyKiogcmJ1ZiwKKwkJCSAgIHNpemVfdCogcnNpemUpCit7CisJaW50IHJlc3VsdDsKKworCW5jcF9pbml0X3JlcXVlc3Qoc2VydmVyKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCAyMCk7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgc2VydmVyLT5uYW1lX3NwYWNlW3NlcS0+dm9sTnVtYmVyXSk7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMCk7CQkvKiBkYXRhc3RyZWFtICovCisJbmNwX2FkZF93b3JkKHNlcnZlciwgY3B1X3RvX2xlMTYoMHg4MDA2KSk7CisJbmNwX2FkZF9kd29yZChzZXJ2ZXIsIFJJTV9BTEwpOworCW5jcF9hZGRfd29yZChzZXJ2ZXIsIGNwdV90b19sZTE2KDMyNzY3KSk7CS8qIG1heCByZXR1cm5lZCBpdGVtcyAqLworCW5jcF9hZGRfbWVtKHNlcnZlciwgc2VxLCA5KTsKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkZTX05TCisJaWYgKHNlcnZlci0+bmFtZV9zcGFjZVtzZXEtPnZvbE51bWJlcl0gPT0gTldfTlNfTkZTKSB7CisJCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDApOwkvKiAwIGJ5dGUgcGF0dGVybiAqLworCX0gZWxzZSAKKyNlbmRpZgorCXsKKwkJbmNwX2FkZF9ieXRlKHNlcnZlciwgMik7CS8qIDIgYnl0ZSBwYXR0ZXJuICovCisJCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDB4ZmYpOwkvKiBmb2xsb3dpbmcgaXMgYSB3aWxkY2FyZCAqLworCQluY3BfYWRkX2J5dGUoc2VydmVyLCAnKicpOworCX0KKwlyZXN1bHQgPSBuY3BfcmVxdWVzdDIoc2VydmVyLCA4NywgYnVmZmVyLCBidWZzaXplKTsKKwlpZiAocmVzdWx0KSB7CisJCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCWlmIChzZXJ2ZXItPm5jcF9yZXBseV9zaXplIDwgMTIpIHsKKwkJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwkJcmV0dXJuIDB4RkY7CisJfQorCSpyc2l6ZSA9IHNlcnZlci0+bmNwX3JlcGx5X3NpemUgLSAxMjsKKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCWJ1ZmZlciA9IGJ1ZmZlciArIHNpemVvZihzdHJ1Y3QgbmNwX3JlcGx5X2hlYWRlcik7CisJKnJidWYgPSBidWZmZXIgKyAxMjsKKwkqY250ID0gV1ZBTF9MSChidWZmZXIgKyAxMCk7CisJKm1vcmUgPSBCVkFMKGJ1ZmZlciArIDkpOworCW1lbWNweShzZXEsIGJ1ZmZlciwgOSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25jcF9SZW5hbWVOU0VudHJ5KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsCisJCSAgc3RydWN0IGlub2RlICpvbGRfZGlyLCBjaGFyICpvbGRfbmFtZSwgX19sZTE2IG9sZF90eXBlLAorCQkgIHN0cnVjdCBpbm9kZSAqbmV3X2RpciwgY2hhciAqbmV3X25hbWUpCit7CisJaW50IHJlc3VsdCA9IC1FSU5WQUw7CisKKwlpZiAoKG9sZF9kaXIgPT0gTlVMTCkgfHwgKG9sZF9uYW1lID09IE5VTEwpIHx8CisJICAgIChuZXdfZGlyID09IE5VTEwpIHx8IChuZXdfbmFtZSA9PSBOVUxMKSkKKwkJZ290byBvdXQ7CisKKwluY3BfaW5pdF9yZXF1ZXN0KHNlcnZlcik7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgNCk7CS8qIHN1YmZ1bmN0aW9uICovCisJbmNwX2FkZF9ieXRlKHNlcnZlciwgc2VydmVyLT5uYW1lX3NwYWNlW05DUF9GSU5GTyhvbGRfZGlyKS0+dm9sTnVtYmVyXSk7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMSk7CS8qIHJlbmFtZSBmbGFnICovCisJbmNwX2FkZF93b3JkKHNlcnZlciwgb2xkX3R5cGUpOwkvKiBzZWFyY2ggYXR0cmlidXRlcyAqLworCisJLyogc291cmNlIEhhbmRsZSBQYXRoICovCisJbmNwX2FkZF9ieXRlKHNlcnZlciwgTkNQX0ZJTkZPKG9sZF9kaXIpLT52b2xOdW1iZXIpOworCW5jcF9hZGRfZHdvcmQoc2VydmVyLCBOQ1BfRklORk8ob2xkX2RpciktPmRpckVudE51bSk7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMSk7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMSk7CS8qIDEgc291cmNlIGNvbXBvbmVudCAqLworCisJLyogZGVzdCBIYW5kbGUgUGF0aCAqLworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIE5DUF9GSU5GTyhuZXdfZGlyKS0+dm9sTnVtYmVyKTsKKwluY3BfYWRkX2R3b3JkKHNlcnZlciwgTkNQX0ZJTkZPKG5ld19kaXIpLT5kaXJFbnROdW0pOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDEpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDEpOwkvKiAxIGRlc3RpbmF0aW9uIGNvbXBvbmVudCAqLworCisJLyogc291cmNlIHBhdGggc3RyaW5nICovCisJbmNwX2FkZF9wc3RyaW5nKHNlcnZlciwgb2xkX25hbWUpOworCS8qIGRlc3QgcGF0aCBzdHJpbmcgKi8KKwluY3BfYWRkX3BzdHJpbmcoc2VydmVyLCBuZXdfbmFtZSk7CisKKwlyZXN1bHQgPSBuY3BfcmVxdWVzdChzZXJ2ZXIsIDg3KTsKKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBuY3BfcmVuX29yX21vdl9maWxlX29yX3N1YmRpcihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLAorCQkJCXN0cnVjdCBpbm9kZSAqb2xkX2RpciwgY2hhciAqb2xkX25hbWUsCisJCQkJc3RydWN0IGlub2RlICpuZXdfZGlyLCBjaGFyICpuZXdfbmFtZSkKK3sKKyAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgX19sZTE2IG9sZF90eXBlID0gY3B1X3RvX2xlMTYoMHgwNik7CisKKy8qIElmIHNvbWVib2R5IGNhbiBkbyBpdCBhdG9taWMsIGNhbGwgbWUuLi4gdmFuZHJvdmVAdmMuY3Z1dC5jeiAqLworCXJlc3VsdCA9IG5jcF9SZW5hbWVOU0VudHJ5KHNlcnZlciwgb2xkX2Rpciwgb2xkX25hbWUsIG9sZF90eXBlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2RpciwgbmV3X25hbWUpOworICAgICAgICBpZiAocmVzdWx0ID09IDB4RkYpCS8qIEZpbGUgTm90IEZvdW5kLCB0cnkgZGlyZWN0b3J5ICovCisJeworCQlvbGRfdHlwZSA9IGNwdV90b19sZTE2KDB4MTYpOworCQlyZXN1bHQgPSBuY3BfUmVuYW1lTlNFbnRyeShzZXJ2ZXIsIG9sZF9kaXIsIG9sZF9uYW1lLCBvbGRfdHlwZSwKKwkJCQkJCSAgIG5ld19kaXIsIG5ld19uYW1lKTsKKwl9CisJaWYgKHJlc3VsdCAhPSAweDkyKSByZXR1cm4gcmVzdWx0OwkvKiBBbGwgZXhjZXB0IE5PX0ZJTEVTX1JFTkFNRUQgKi8KKwlyZXN1bHQgPSBuY3BfZGVsX2ZpbGVfb3Jfc3ViZGlyKHNlcnZlciwgbmV3X2RpciwgbmV3X25hbWUpOworCWlmIChyZXN1bHQgIT0gMCkgcmV0dXJuIC1FQUNDRVM7CisJcmVzdWx0ID0gbmNwX1JlbmFtZU5TRW50cnkoc2VydmVyLCBvbGRfZGlyLCBvbGRfbmFtZSwgb2xkX3R5cGUsCisJCQkJCSAgIG5ld19kaXIsIG5ld19uYW1lKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCQorCisvKiBXZSBoYXZlIHRvIHRyYW5zZmVyIHRvL2Zyb20gdXNlciBzcGFjZSAqLworaW50CituY3BfcmVhZF9rZXJuZWwoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgY29uc3QgY2hhciAqZmlsZV9pZCwKKwkgICAgIF9fdTMyIG9mZnNldCwgX191MTYgdG9fcmVhZCwgY2hhciAqdGFyZ2V0LCBpbnQgKmJ5dGVzX3JlYWQpCit7CisJY2hhciAqc291cmNlOworCWludCByZXN1bHQ7CisKKwluY3BfaW5pdF9yZXF1ZXN0KHNlcnZlcik7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMCk7CisJbmNwX2FkZF9tZW0oc2VydmVyLCBmaWxlX2lkLCA2KTsKKwluY3BfYWRkX2JlMzIoc2VydmVyLCBvZmZzZXQpOworCW5jcF9hZGRfYmUxNihzZXJ2ZXIsIHRvX3JlYWQpOworCisJaWYgKChyZXN1bHQgPSBuY3BfcmVxdWVzdChzZXJ2ZXIsIDcyKSkgIT0gMCkgeworCQlnb3RvIG91dDsKKwl9CisJKmJ5dGVzX3JlYWQgPSBuY3BfcmVwbHlfYmUxNihzZXJ2ZXIsIDApOworCXNvdXJjZSA9IG5jcF9yZXBseV9kYXRhKHNlcnZlciwgMiArIChvZmZzZXQgJiAxKSk7CisKKwltZW1jcHkodGFyZ2V0LCBzb3VyY2UsICpieXRlc19yZWFkKTsKK291dDoKKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIFRoZXJlIGlzIGEgcHJvYmxlbS4uLiBlZ3JlcCBhbmQgc29tZSBvdGhlciBzaWxseSB0b29scyBkbzoKKwl4ID0gbW1hcChOVUxMLCBNQVBfUFJJVkFURSwgUFJPVF9SRUFEfFBST1RfV1JJVEUsIDxuY3BmcyBmZD4sIDMyNzY4KTsKKwlyZWFkKDxuY3BmcyBmZD4sIHgsIDMyNzY4KTsKKyAgIE5vdyBjb3B5aW5nIHJlYWQgcmVzdWx0IGJ5IGNvcHlfdG9fdXNlciBjYXVzZXMgcGFnZWZhdWx0LiBUaGlzIHBhZ2VmYXVsdAorICAgY291bGQgbm90IGJlIGhhbmRsZWQgYmVjYXVzZSBvZiBzZXJ2ZXIgd2FzIGxvY2tlZCBkdWUgdG8gcmVhZC4gU28gd2UgaGF2ZQorICAgdG8gdXNlIHRlbXBvcmFyeSBidWZmZXIuIFNvIG5jcF91bmxvY2tfc2VydmVyIG11c3QgYmUgZG9uZSBiZWZvcmUKKyAgIGNvcHlfdG9fdXNlciAoYW5kIGZvciB3cml0ZSwgY29weV9mcm9tX3VzZXIgbXVzdCBiZSBkb25lIGJlZm9yZSAKKyAgIG5jcF9pbml0X3JlcXVlc3QuLi4gc2FtZSBhcHBsaWVzIGZvciBzZW5kIHJhdyBwYWNrZXQgaW9jdGwpLiBCZWNhdXNlIG9mCisgICBmaWxlIGlzIG5vcm1hbGx5IHJlYWQgaW4gYmlnZ2VyIGNodW5rcywgY2FsbGVyIHByb3ZpZGVzIGttYWxsb2NlZCAKKyAgICh2bWFsbG9jZWQpIGNodW5rIG9mIG1lbW9yeSB3aXRoIHNpemUgPj0gdG9fcmVhZC4uLgorICovCitpbnQKK25jcF9yZWFkX2JvdW5jZShzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBjb25zdCBjaGFyICpmaWxlX2lkLAorCSBfX3UzMiBvZmZzZXQsIF9fdTE2IHRvX3JlYWQsIGNoYXIgX191c2VyICp0YXJnZXQsIGludCAqYnl0ZXNfcmVhZCwKKwkgdm9pZCogYm91bmNlLCBfX3UzMiBidWZzaXplKQoreworCWludCByZXN1bHQ7CisKKwluY3BfaW5pdF9yZXF1ZXN0KHNlcnZlcik7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMCk7CisJbmNwX2FkZF9tZW0oc2VydmVyLCBmaWxlX2lkLCA2KTsKKwluY3BfYWRkX2JlMzIoc2VydmVyLCBvZmZzZXQpOworCW5jcF9hZGRfYmUxNihzZXJ2ZXIsIHRvX3JlYWQpOworCXJlc3VsdCA9IG5jcF9yZXF1ZXN0MihzZXJ2ZXIsIDcyLCBib3VuY2UsIGJ1ZnNpemUpOworCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJaWYgKCFyZXN1bHQpIHsKKwkJaW50IGxlbiA9IGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fYmUxNiopKChjaGFyKilib3VuY2UgKyAKKwkJCSAgc2l6ZW9mKHN0cnVjdCBuY3BfcmVwbHlfaGVhZGVyKSkpKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwkJaWYgKGxlbiA8PSB0b19yZWFkKSB7CisJCQljaGFyKiBzb3VyY2U7CisKKwkJCXNvdXJjZSA9IChjaGFyKilib3VuY2UgKyAKKwkJCSAgICAgICAgIHNpemVvZihzdHJ1Y3QgbmNwX3JlcGx5X2hlYWRlcikgKyAyICsgCisJCQkgICAgICAgICAob2Zmc2V0ICYgMSk7CisJCQkqYnl0ZXNfcmVhZCA9IGxlbjsKKwkJCXJlc3VsdCA9IDA7CisJCQlpZiAoY29weV90b191c2VyKHRhcmdldCwgc291cmNlLCBsZW4pKQorCQkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCX0KKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50CituY3Bfd3JpdGVfa2VybmVsKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGNvbnN0IGNoYXIgKmZpbGVfaWQsCisJCSBfX3UzMiBvZmZzZXQsIF9fdTE2IHRvX3dyaXRlLAorCQkgY29uc3QgY2hhciAqc291cmNlLCBpbnQgKmJ5dGVzX3dyaXR0ZW4pCit7CisJaW50IHJlc3VsdDsKKworCW5jcF9pbml0X3JlcXVlc3Qoc2VydmVyKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCAwKTsKKwluY3BfYWRkX21lbShzZXJ2ZXIsIGZpbGVfaWQsIDYpOworCW5jcF9hZGRfYmUzMihzZXJ2ZXIsIG9mZnNldCk7CisJbmNwX2FkZF9iZTE2KHNlcnZlciwgdG9fd3JpdGUpOworCW5jcF9hZGRfbWVtKHNlcnZlciwgc291cmNlLCB0b193cml0ZSk7CisJCisJaWYgKChyZXN1bHQgPSBuY3BfcmVxdWVzdChzZXJ2ZXIsIDczKSkgPT0gMCkKKwkJKmJ5dGVzX3dyaXR0ZW4gPSB0b193cml0ZTsKKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCXJldHVybiByZXN1bHQ7Cit9CisKKyNpZmRlZiBDT05GSUdfTkNQRlNfSU9DVExfTE9DS0lORworaW50CituY3BfTG9nUGh5c2ljYWxSZWNvcmQoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgY29uc3QgY2hhciAqZmlsZV9pZCwKKwkgIF9fdTggbG9ja3R5cGUsIF9fdTMyIG9mZnNldCwgX191MzIgbGVuZ3RoLCBfX3UxNiB0aW1lb3V0KQoreworCWludCByZXN1bHQ7CisKKwluY3BfaW5pdF9yZXF1ZXN0KHNlcnZlcik7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgbG9ja3R5cGUpOworCW5jcF9hZGRfbWVtKHNlcnZlciwgZmlsZV9pZCwgNik7CisJbmNwX2FkZF9iZTMyKHNlcnZlciwgb2Zmc2V0KTsKKwluY3BfYWRkX2JlMzIoc2VydmVyLCBsZW5ndGgpOworCW5jcF9hZGRfYmUxNihzZXJ2ZXIsIHRpbWVvdXQpOworCisJaWYgKChyZXN1bHQgPSBuY3BfcmVxdWVzdChzZXJ2ZXIsIDB4MUEpKSAhPSAwKQorCXsKKwkJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwlyZXR1cm4gMDsKK30KKworaW50CituY3BfQ2xlYXJQaHlzaWNhbFJlY29yZChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBjb25zdCBjaGFyICpmaWxlX2lkLAorCSAgX191MzIgb2Zmc2V0LCBfX3UzMiBsZW5ndGgpCit7CisJaW50IHJlc3VsdDsKKworCW5jcF9pbml0X3JlcXVlc3Qoc2VydmVyKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCAwKTsJLyogd2hvIGtub3dzLi4uIGxhbmFseXplciBzYXlzIHRoYXQgKi8KKwluY3BfYWRkX21lbShzZXJ2ZXIsIGZpbGVfaWQsIDYpOworCW5jcF9hZGRfYmUzMihzZXJ2ZXIsIG9mZnNldCk7CisJbmNwX2FkZF9iZTMyKHNlcnZlciwgbGVuZ3RoKTsKKworCWlmICgocmVzdWx0ID0gbmNwX3JlcXVlc3Qoc2VydmVyLCAweDFFKSkgIT0gMCkKKwl7CisJCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYJLyogQ09ORklHX05DUEZTX0lPQ1RMX0xPQ0tJTkcgKi8KKworI2lmZGVmIENPTkZJR19OQ1BGU19OTFMKKy8qIFRoaXMgYXJlIHRoZSBOTFMgY29udmVyc2lvbiByb3V0aW5lcyB3aXRoIGluc3BpcmF0aW9ucyBhbmQgY29kZSBwYXJ0cworICogZnJvbSB0aGUgdmZhdCBmaWxlIHN5c3RlbSBhbmQgaGludHMgZnJvbSBQZXRyIFZhbmRyb3ZlYy4KKyAqLworCitpbnQKK25jcF9faW8ydm9sKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIHVuc2lnbmVkIGNoYXIgKnZuYW1lLCB1bnNpZ25lZCBpbnQgKnZsZW4sCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluYW1lLCB1bnNpZ25lZCBpbnQgaWxlbiwgaW50IGNjKQoreworCXN0cnVjdCBubHNfdGFibGUgKmluID0gc2VydmVyLT5ubHNfaW87CisJc3RydWN0IG5sc190YWJsZSAqb3V0ID0gc2VydmVyLT5ubHNfdm9sOworCXVuc2lnbmVkIGNoYXIgKnZuYW1lX3N0YXJ0OworCXVuc2lnbmVkIGNoYXIgKnZuYW1lX2VuZDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICppbmFtZV9lbmQ7CisKKwlpbmFtZV9lbmQgPSBpbmFtZSArIGlsZW47CisJdm5hbWVfc3RhcnQgPSB2bmFtZTsKKwl2bmFtZV9lbmQgPSB2bmFtZSArICp2bGVuIC0gMTsKKworCXdoaWxlIChpbmFtZSA8IGluYW1lX2VuZCkgeworCQlpbnQgY2hsOworCQl3Y2hhcl90IGVjOworCisJCWlmIChOQ1BfSVNfRkxBRyhzZXJ2ZXIsIE5DUF9GTEFHX1VURjgpKSB7CisJCQlpbnQgazsKKworCQkJayA9IHV0ZjhfbWJ0b3djKCZlYywgaW5hbWUsIGluYW1lX2VuZCAtIGluYW1lKTsKKwkJCWlmIChrIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWluYW1lICs9IGs7CisJCX0gZWxzZSB7CisJCQlpZiAoKmluYW1lID09IE5DUF9FU0MpIHsKKwkJCQlpbnQgazsKKworCQkJCWlmIChpbmFtZV9lbmQgLSBpbmFtZSA8IDUpCisJCQkJCWdvdG8gbm9zcGVjOworCisJCQkJZWMgPSAwOworCQkJCWZvciAoayA9IDE7IGsgPCA1OyBrKyspIHsKKwkJCQkJdW5zaWduZWQgY2hhciBuYzsKKworCQkJCQluYyA9IGluYW1lW2tdIC0gJzAnOworCQkJCQlpZiAobmMgPj0gMTApIHsKKwkJCQkJCW5jIC09ICdBJyAtICcwJyAtIDEwOworCQkJCQkJaWYgKChuYyA8IDEwKSB8fCAobmMgPiAxNSkpIHsKKwkJCQkJCQlnb3RvIG5vc3BlYzsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllYyA9IChlYyA8PCA0KSB8IG5jOworCQkJCX0KKwkJCQlpbmFtZSArPSA1OworCQkJfSBlbHNlIHsKK25vc3BlYzo7CQkJCisJCQkJaWYgKCAoY2hsID0gaW4tPmNoYXIydW5pKGluYW1lLCBpbmFtZV9lbmQgLSBpbmFtZSwgJmVjKSkgPCAwKQorCQkJCQlyZXR1cm4gY2hsOworCQkJCWluYW1lICs9IGNobDsKKwkJCX0KKwkJfQorCisJCS8qIHVuaXRvdXBwZXIgc2hvdWxkIGJlIGhlcmUhICovCisKKwkJY2hsID0gb3V0LT51bmkyY2hhcihlYywgdm5hbWUsIHZuYW1lX2VuZCAtIHZuYW1lKTsKKwkJaWYgKGNobCA8IDApCisJCQlyZXR1cm4gY2hsOworCisJCS8qIHRoaXMgaXMgd3JvbmcuLi4gKi8KKwkJaWYgKGNjKSB7CisJCQlpbnQgY2hpOworCisJCQlmb3IgKGNoaSA9IDA7IGNoaSA8IGNobDsgY2hpKyspeworCQkJCXZuYW1lW2NoaV0gPSBuY3BfdG91cHBlcihvdXQsIHZuYW1lW2NoaV0pOworCQkJfQorCQl9CisJCXZuYW1lICs9IGNobDsKKwl9CisKKwkqdm5hbWUgPSAwOworCSp2bGVuID0gdm5hbWUgLSB2bmFtZV9zdGFydDsKKwlyZXR1cm4gMDsKK30KKworaW50CituY3BfX3ZvbDJpbyhzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCB1bnNpZ25lZCBjaGFyICppbmFtZSwgdW5zaWduZWQgaW50ICppbGVuLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICp2bmFtZSwgdW5zaWduZWQgaW50IHZsZW4sIGludCBjYykKK3sKKwlzdHJ1Y3QgbmxzX3RhYmxlICppbiA9IHNlcnZlci0+bmxzX3ZvbDsKKwlzdHJ1Y3QgbmxzX3RhYmxlICpvdXQgPSBzZXJ2ZXItPm5sc19pbzsKKwljb25zdCB1bnNpZ25lZCBjaGFyICp2bmFtZV9lbmQ7CisJdW5zaWduZWQgY2hhciAqaW5hbWVfc3RhcnQ7CisJdW5zaWduZWQgY2hhciAqaW5hbWVfZW5kOworCXVuc2lnbmVkIGNoYXIgKnZuYW1lX2NjOworCWludCBlcnI7CisKKwl2bmFtZV9jYyA9IE5VTEw7CisKKwlpZiAoY2MpIHsKKwkJaW50IGk7CisKKwkJLyogdGhpcyBpcyB3cm9uZyEgKi8KKwkJdm5hbWVfY2MgPSBrbWFsbG9jKHZsZW4sIEdGUF9LRVJORUwpOworCQlpZiAoIXZuYW1lX2NjKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWZvciAoaSA9IDA7IGkgPCB2bGVuOyBpKyspCisJCQl2bmFtZV9jY1tpXSA9IG5jcF90b2xvd2VyKGluLCB2bmFtZVtpXSk7CisJCXZuYW1lID0gdm5hbWVfY2M7CisJfQorCisJaW5hbWVfc3RhcnQgPSBpbmFtZTsKKwlpbmFtZV9lbmQgPSBpbmFtZSArICppbGVuIC0gMTsKKwl2bmFtZV9lbmQgPSB2bmFtZSArIHZsZW47CisKKwl3aGlsZSAodm5hbWUgPCB2bmFtZV9lbmQpIHsKKwkJd2NoYXJfdCBlYzsKKwkJaW50IGNobDsKKworCQlpZiAoIChjaGwgPSBpbi0+Y2hhcjJ1bmkodm5hbWUsIHZuYW1lX2VuZCAtIHZuYW1lLCAmZWMpKSA8IDApIHsKKwkJCWVyciA9IGNobDsKKwkJCWdvdG8gcXVpdDsKKwkJfQorCQl2bmFtZSArPSBjaGw7CisKKwkJLyogdW5pdG9sb3dlciBzaG91bGQgYmUgaGVyZSEgKi8KKworCQlpZiAoTkNQX0lTX0ZMQUcoc2VydmVyLCBOQ1BfRkxBR19VVEY4KSkgeworCQkJaW50IGs7CisKKwkJCWsgPSB1dGY4X3djdG9tYihpbmFtZSwgZWMsIGluYW1lX2VuZCAtIGluYW1lKTsKKwkJCWlmIChrIDwgMCkgeworCQkJCWVyciA9IC1FTkFNRVRPT0xPTkc7CisJCQkJZ290byBxdWl0OworCQkJfQorCQkJaW5hbWUgKz0gazsKKwkJfSBlbHNlIHsKKwkJCWlmICggKGNobCA9IG91dC0+dW5pMmNoYXIoZWMsIGluYW1lLCBpbmFtZV9lbmQgLSBpbmFtZSkpID49IDApIHsKKwkJCQlpbmFtZSArPSBjaGw7CisJCQl9IGVsc2UgeworCQkJCWludCBrOworCisJCQkJaWYgKGluYW1lX2VuZCAtIGluYW1lIDwgNSkgeworCQkJCQllcnIgPSAtRU5BTUVUT09MT05HOworCQkJCQlnb3RvIHF1aXQ7CisJCQkJfQorCQkJCSppbmFtZSA9IE5DUF9FU0M7CisJCQkJZm9yIChrID0gNDsgayA+IDA7IGstLSkgeworCQkJCQl1bnNpZ25lZCBjaGFyIHY7CisJCQkJCQorCQkJCQl2ID0gKGVjICYgMHhGKSArICcwJzsKKwkJCQkJaWYgKHYgPiAnOScpIHsKKwkJCQkJCXYgKz0gJ0EnIC0gJzknIC0gMTsKKwkJCQkJfQorCQkJCQlpbmFtZVtrXSA9IHY7CisJCQkJCWVjID4+PSA0OworCQkJCX0KKwkJCQlpbmFtZSArPSA1OworCQkJfQorCQl9CisJfQorCisJKmluYW1lID0gMDsKKwkqaWxlbiA9IGluYW1lIC0gaW5hbWVfc3RhcnQ7CisJZXJyID0gMDsKK3F1aXQ6OworCWlmIChjYykKKwkJa2ZyZWUodm5hbWVfY2MpOworCXJldHVybiBlcnI7Cit9CisKKyNlbHNlCisKK2ludAorbmNwX19pbzJ2b2wodW5zaWduZWQgY2hhciAqdm5hbWUsIHVuc2lnbmVkIGludCAqdmxlbiwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqaW5hbWUsIHVuc2lnbmVkIGludCBpbGVuLCBpbnQgY2MpCit7CisJaW50IGk7CisKKwlpZiAoKnZsZW4gPD0gaWxlbikKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwlpZiAoY2MpCisJCWZvciAoaSA9IDA7IGkgPCBpbGVuOyBpKyspIHsKKwkJCSp2bmFtZSA9IHRvdXBwZXIoKmluYW1lKTsKKwkJCXZuYW1lKys7CisJCQlpbmFtZSsrOworCQl9CisJZWxzZSB7CisJCW1lbW1vdmUodm5hbWUsIGluYW1lLCBpbGVuKTsKKwkJdm5hbWUgKz0gaWxlbjsKKwl9CisKKwkqdmxlbiA9IGlsZW47CisJKnZuYW1lID0gMDsKKwlyZXR1cm4gMDsKK30KKworaW50CituY3BfX3ZvbDJpbyh1bnNpZ25lZCBjaGFyICppbmFtZSwgdW5zaWduZWQgaW50ICppbGVuLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICp2bmFtZSwgdW5zaWduZWQgaW50IHZsZW4sIGludCBjYykKK3sKKwlpbnQgaTsKKworCWlmICgqaWxlbiA8PSB2bGVuKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCWlmIChjYykKKwkJZm9yIChpID0gMDsgaSA8IHZsZW47IGkrKykgeworCQkJKmluYW1lID0gdG9sb3dlcigqdm5hbWUpOworCQkJaW5hbWUrKzsKKwkJCXZuYW1lKys7CisJCX0KKwllbHNlIHsKKwkJbWVtbW92ZShpbmFtZSwgdm5hbWUsIHZsZW4pOworCQlpbmFtZSArPSB2bGVuOworCX0KKworCSppbGVuID0gdmxlbjsKKwkqaW5hbWUgPSAwOworCXJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL25jcGxpYl9rZXJuZWwuaCBiL2ZzL25jcGZzL25jcGxpYl9rZXJuZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWVjMmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmNwZnMvbmNwbGliX2tlcm5lbC5oCkBAIC0wLDAgKzEsMjU5IEBACisvKgorICogIG5jcGxpYl9rZXJuZWwuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgVm9sa2VyIExlbmRlY2tlCisgKiAgTW9kaWZpZWQgZm9yIGJpZyBlbmRpYW4gYnkgSi5GLiBDaGFkaW1hIGFuZCBEYXZpZCBTLiBNaWxsZXIKKyAqICBNb2RpZmllZCAxOTk3IFBldGVyIFdhbHRlbmJlcmcsIEJpbGwgSGF3ZXMsIERhdmlkIFdvb2Rob3VzZSBmb3IgMi4xIGRjYWNoZQorICogIE1vZGlmaWVkIDE5OTgsIDE5OTkgV29sZnJhbSBQaWVua29zcyBmb3IgTkxTCisgKiAgTW9kaWZpZWQgMTk5OSBXb2xmcmFtIFBpZW5rb3NzIGZvciBkaXJlY3RvcnkgY2FjaGluZworICoKKyAqLworCisjaWZuZGVmIF9OQ1BMSUJfSAorI2RlZmluZSBfTkNQTElCX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkxTCisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjZW5kaWYgLyogQ09ORklHX05DUEZTX05MUyAqLworCisjaW5jbHVkZSA8bGludXgvbmNwX2ZzLmg+CisKKyNkZWZpbmUgTkNQX01JTl9TWU1MSU5LX1NJWkUJOAorI2RlZmluZSBOQ1BfTUFYX1NZTUxJTktfU0laRQk1MTIKKworI2RlZmluZSBOQ1BfQkxPQ0tfU0hJRlQJCTkKKyNkZWZpbmUgTkNQX0JMT0NLX1NJWkUJCSgxIDw8IChOQ1BfQkxPQ0tfU0hJRlQpKQorCitpbnQgbmNwX25lZ290aWF0ZV9idWZmZXJzaXplKHN0cnVjdCBuY3Bfc2VydmVyICosIGludCwgaW50ICopOworaW50IG5jcF9uZWdvdGlhdGVfc2l6ZV9hbmRfb3B0aW9ucyhzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBpbnQgc2l6ZSwKKyAgCQkJICBpbnQgb3B0aW9ucywgaW50ICpyZXRfc2l6ZSwgaW50ICpyZXRfb3B0aW9ucyk7CisKK2ludCBuY3BfZ2V0X3ZvbHVtZV9pbmZvX3dpdGhfbnVtYmVyKHN0cnVjdCBuY3Bfc2VydmVyKiBzZXJ2ZXIsIGludCBuLAorCQkJCSAgICBzdHJ1Y3QgbmNwX3ZvbHVtZV9pbmZvICp0YXJnZXQpOworCitpbnQgbmNwX2dldF9kaXJlY3RvcnlfaW5mbyhzdHJ1Y3QgbmNwX3NlcnZlciogc2VydmVyLCBfX3U4IGRpcmhhbmRsZSwKKwkJCSAgIHN0cnVjdCBuY3Bfdm9sdW1lX2luZm8qIHRhcmdldCk7CisKK2ludCBuY3BfY2xvc2VfZmlsZShzdHJ1Y3QgbmNwX3NlcnZlciAqLCBjb25zdCBjaGFyICopOworc3RhdGljIGlubGluZSBpbnQgbmNwX3JlYWRfYm91bmNlX3NpemUoX191MzIgc2l6ZSkgeworCXJldHVybiBzaXplb2Yoc3RydWN0IG5jcF9yZXBseV9oZWFkZXIpICsgMiArIDIgKyBzaXplICsgODsKK307CitpbnQgbmNwX3JlYWRfYm91bmNlKHN0cnVjdCBuY3Bfc2VydmVyICosIGNvbnN0IGNoYXIgKiwgX191MzIsIF9fdTE2LCAKKwkJY2hhciBfX3VzZXIgKiwgaW50ICosIHZvaWQqIGJvdW5jZSwgX191MzIgYm91bmNlbGVuKTsKK2ludCBuY3BfcmVhZF9rZXJuZWwoc3RydWN0IG5jcF9zZXJ2ZXIgKiwgY29uc3QgY2hhciAqLCBfX3UzMiwgX191MTYsIAorCQljaGFyICosIGludCAqKTsKK2ludCBuY3Bfd3JpdGVfa2VybmVsKHN0cnVjdCBuY3Bfc2VydmVyICosIGNvbnN0IGNoYXIgKiwgX191MzIsIF9fdTE2LAorCQljb25zdCBjaGFyICosIGludCAqKTsKKworc3RhdGljIGlubGluZSB2b2lkIG5jcF9pbm9kZV9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlKSB7CisJYXRvbWljX2RlYygmTkNQX0ZJTkZPKGlub2RlKS0+b3BlbmVkKTsKK30KKwordm9pZCBuY3BfZXh0cmFjdF9maWxlX2luZm8odm9pZCogc3JjLCBzdHJ1Y3QgbndfaW5mb19zdHJ1Y3QqIHRhcmdldCk7CitpbnQgbmNwX29idGFpbl9pbmZvKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBpbm9kZSAqLCBjaGFyICosCisJCXN0cnVjdCBud19pbmZvX3N0cnVjdCAqdGFyZ2V0KTsKK2ludCBuY3Bfb2J0YWluX25mc19pbmZvKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBud19pbmZvX3N0cnVjdCAqdGFyZ2V0KTsKK2ludCBuY3BfZ2V0X3ZvbHVtZV9yb290KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGNvbnN0IGNoYXIgKnZvbG5hbWUsCisJCQlfX3UzMiAqdm9sdW1lLCBfX2xlMzIgKmRpcmVudCwgX19sZTMyICpkb3NkaXJlbnQpOworaW50IG5jcF9sb29rdXBfdm9sdW1lKHN0cnVjdCBuY3Bfc2VydmVyICosIGNvbnN0IGNoYXIgKiwgc3RydWN0IG53X2luZm9fc3RydWN0ICopOworaW50IG5jcF9tb2RpZnlfZmlsZV9vcl9zdWJkaXJfZG9zX2luZm8oc3RydWN0IG5jcF9zZXJ2ZXIgKiwgc3RydWN0IGlub2RlICosCisJIF9fbGUzMiwgY29uc3Qgc3RydWN0IG53X21vZGlmeV9kb3NfaW5mbyAqaW5mbyk7CitpbnQgbmNwX21vZGlmeV9maWxlX29yX3N1YmRpcl9kb3NfaW5mb19wYXRoKHN0cnVjdCBuY3Bfc2VydmVyICosIHN0cnVjdCBpbm9kZSAqLAorCSBjb25zdCBjaGFyKiBwYXRoLCBfX2xlMzIsIGNvbnN0IHN0cnVjdCBud19tb2RpZnlfZG9zX2luZm8gKmluZm8pOworaW50IG5jcF9tb2RpZnlfbmZzX2luZm8oc3RydWN0IG5jcF9zZXJ2ZXIgKiwgX191OCB2b2xudW0sIF9fbGUzMiBkaXJlbnQsCisJCQlfX3UzMiBtb2RlLCBfX3UzMiByZGV2KTsKKworaW50IG5jcF9kZWxfZmlsZV9vcl9zdWJkaXIyKHN0cnVjdCBuY3Bfc2VydmVyICosIHN0cnVjdCBkZW50cnkqKTsKK2ludCBuY3BfZGVsX2ZpbGVfb3Jfc3ViZGlyKHN0cnVjdCBuY3Bfc2VydmVyICosIHN0cnVjdCBpbm9kZSAqLCBjaGFyICopOworaW50IG5jcF9vcGVuX2NyZWF0ZV9maWxlX29yX3N1YmRpcihzdHJ1Y3QgbmNwX3NlcnZlciAqLCBzdHJ1Y3QgaW5vZGUgKiwgY2hhciAqLAorCQkJCWludCwgX19sZTMyLCBfX2xlMTYsIHN0cnVjdCBuY3BfZW50cnlfaW5mbyAqKTsKKworaW50IG5jcF9pbml0aWFsaXplX3NlYXJjaChzdHJ1Y3QgbmNwX3NlcnZlciAqLCBzdHJ1Y3QgaW5vZGUgKiwKKwkJICAgICAgc3RydWN0IG53X3NlYXJjaF9zZXF1ZW5jZSAqdGFyZ2V0KTsKK2ludCBuY3Bfc2VhcmNoX2Zvcl9maWxlX29yX3N1YmRpcihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLAorCQkJICAgICAgc3RydWN0IG53X3NlYXJjaF9zZXF1ZW5jZSAqc2VxLAorCQkJICAgICAgc3RydWN0IG53X2luZm9fc3RydWN0ICp0YXJnZXQpOworaW50IG5jcF9zZWFyY2hfZm9yX2ZpbGVzZXQoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwKKwkJCSAgIHN0cnVjdCBud19zZWFyY2hfc2VxdWVuY2UgKnNlcSwKKwkJCSAgIGludCogbW9yZSwgaW50KiBjbnQsCisJCQkgICBjaGFyKiBidWZmZXIsIHNpemVfdCBidWZzaXplLAorCQkJICAgY2hhcioqIHJidWYsIHNpemVfdCogcnNpemUpOworCitpbnQgbmNwX3Jlbl9vcl9tb3ZfZmlsZV9vcl9zdWJkaXIoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwKKwkJCSAgICAgIHN0cnVjdCBpbm9kZSAqLCBjaGFyICosIHN0cnVjdCBpbm9kZSAqLCBjaGFyICopOworCisKK2ludAorbmNwX0xvZ1BoeXNpY2FsUmVjb3JkKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsCisJCSAgICAgIGNvbnN0IGNoYXIgKmZpbGVfaWQsIF9fdTggbG9ja3R5cGUsCisJCSAgICAgIF9fdTMyIG9mZnNldCwgX191MzIgbGVuZ3RoLCBfX3UxNiB0aW1lb3V0KTsKKworI2lmZGVmIENPTkZJR19OQ1BGU19JT0NUTF9MT0NLSU5HCitpbnQKK25jcF9DbGVhclBoeXNpY2FsUmVjb3JkKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsCisJCQljb25zdCBjaGFyICpmaWxlX2lkLAorCQkJX191MzIgb2Zmc2V0LCBfX3UzMiBsZW5ndGgpOworI2VuZGlmCS8qIENPTkZJR19OQ1BGU19JT0NUTF9MT0NLSU5HICovCisKK2ludAorbmNwX21vdW50X3N1YmRpcihzdHJ1Y3QgbmNwX3NlcnZlciAqLCBfX3U4LCBfX3U4LCBfX2xlMzIsCisJCSBfX3UzMiogdm9sdW1lLCBfX2xlMzIqIGRpcmVudCwgX19sZTMyKiBkb3NkaXJlbnQpOworaW50IG5jcF9kaXJoYW5kbGVfYWxsb2Moc3RydWN0IG5jcF9zZXJ2ZXIgKiwgX191OCB2b2wsIF9fbGUzMiBkaXJlbnQsIF9fdTggKmRpcmhhbmRsZSk7CitpbnQgbmNwX2RpcmhhbmRsZV9mcmVlKHN0cnVjdCBuY3Bfc2VydmVyICosIF9fdTggZGlyaGFuZGxlKTsKKworaW50IG5jcF9jcmVhdGVfbmV3KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlLCBkZXZfdCByZGV2LCBfX2xlMzIgYXR0cmlidXRlcyk7CisKK3N0YXRpYyBpbmxpbmUgaW50IG5jcF9pc19uZnNfZXh0cmFzKHN0cnVjdCBuY3Bfc2VydmVyKiBzZXJ2ZXIsIHVuc2lnbmVkIGludCB2b2xudW0pIHsKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkZTX05TCisJcmV0dXJuIChzZXJ2ZXItPm0uZmxhZ3MgJiBOQ1BfTU9VTlRfTkZTX0VYVFJBUykgJiYKKwkgICAgICAgKHNlcnZlci0+bmFtZV9zcGFjZVt2b2xudW1dID09IE5XX05TX05GUyk7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkxTCisKK2ludCBuY3BfX2lvMnZvbChzdHJ1Y3QgbmNwX3NlcnZlciAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCAqLAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LCBpbnQpOworaW50IG5jcF9fdm9sMmlvKHN0cnVjdCBuY3Bfc2VydmVyICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50ICosCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGludCk7CisKKyNkZWZpbmUgTkNQX0VTQwkJCSc6JworI2RlZmluZSBOQ1BfSU9fVEFCTEUoZGVudHJ5KQkoTkNQX1NFUlZFUigoZGVudHJ5KS0+ZF9pbm9kZSktPm5sc19pbykKKyNkZWZpbmUgbmNwX3RvbG93ZXIodCwgYykJbmxzX3RvbG93ZXIodCwgYykKKyNkZWZpbmUgbmNwX3RvdXBwZXIodCwgYykJbmxzX3RvdXBwZXIodCwgYykKKyNkZWZpbmUgbmNwX3N0cm5pY21wKHQsIHMxLCBzMiwgbGVuKSBcCisJbmxzX3N0cm5pY21wKHQsIHMxLCBzMiwgbGVuKQorI2RlZmluZSBuY3BfaW8ydm9sKFMsbSxpLG4sayxVKQluY3BfX2lvMnZvbChTLG0saSxuLGssVSkKKyNkZWZpbmUgbmNwX3ZvbDJpbyhTLG0saSxuLGssVSkJbmNwX192b2wyaW8oUyxtLGksbixrLFUpCisKKyNlbHNlCisKK2ludCBuY3BfX2lvMnZvbCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCAqLAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LCBpbnQpOworaW50IG5jcF9fdm9sMmlvKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50ICosCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGludCk7CisKKyNkZWZpbmUgTkNQX0lPX1RBQkxFKGRlbnRyeSkJTlVMTAorI2RlZmluZSBuY3BfdG9sb3dlcih0LCBjKQl0b2xvd2VyKGMpCisjZGVmaW5lIG5jcF90b3VwcGVyKHQsIGMpCXRvdXBwZXIoYykKKyNkZWZpbmUgbmNwX2lvMnZvbChTLG0saSxuLGssVSkJbmNwX19pbzJ2b2wobSxpLG4sayxVKQorI2RlZmluZSBuY3Bfdm9sMmlvKFMsbSxpLG4sayxVKQluY3BfX3ZvbDJpbyhtLGksbixrLFUpCisKKworc3RhdGljIGlubGluZSBpbnQgbmNwX3N0cm5pY21wKHN0cnVjdCBubHNfdGFibGUgKnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMxLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpzMiwgaW50IGxlbikKK3sKKwl3aGlsZSAobGVuLS0pIHsKKwkJaWYgKHRvbG93ZXIoKnMxKyspICE9IHRvbG93ZXIoKnMyKyspKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfTkNQRlNfTkxTICovCisKKyNkZWZpbmUgTkNQX0dFVF9BR0UoZGVudHJ5KQkoamlmZmllcyAtIChkZW50cnkpLT5kX3RpbWUpCisjZGVmaW5lIE5DUF9NQVhfQUdFKHNlcnZlcikJKChzZXJ2ZXIpLT5kZW50cnlfdHRsKQorI2RlZmluZSBOQ1BfVEVTVF9BR0Uoc2VydmVyLGRlbnRyeSkJKE5DUF9HRVRfQUdFKGRlbnRyeSkgPCBOQ1BfTUFYX0FHRShzZXJ2ZXIpKQorCitzdGF0aWMgaW5saW5lIHZvaWQKK25jcF9hZ2VfZGVudHJ5KHN0cnVjdCBuY3Bfc2VydmVyKiBzZXJ2ZXIsIHN0cnVjdCBkZW50cnkqIGRlbnRyeSkKK3sKKwlkZW50cnktPmRfdGltZSA9IGppZmZpZXMgLSBzZXJ2ZXItPmRlbnRyeV90dGw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbmNwX25ld19kZW50cnkoc3RydWN0IGRlbnRyeSogZGVudHJ5KQoreworCWRlbnRyeS0+ZF90aW1lID0gamlmZmllczsKK30KKworc3RhdGljIGlubGluZSB2b2lkCituY3BfcmVuZXdfZGVudHJpZXMoc3RydWN0IGRlbnRyeSAqcGFyZW50KQoreworCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIgPSBOQ1BfU0VSVkVSKHBhcmVudC0+ZF9pbm9kZSk7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwluZXh0ID0gcGFyZW50LT5kX3N1YmRpcnMubmV4dDsKKwl3aGlsZSAobmV4dCAhPSAmcGFyZW50LT5kX3N1YmRpcnMpIHsKKwkJZGVudHJ5ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKworCQlpZiAoZGVudHJ5LT5kX2ZzZGF0YSA9PSBOVUxMKQorCQkJbmNwX2FnZV9kZW50cnkoc2VydmVyLCBkZW50cnkpOworCQllbHNlCisJCQluY3BfbmV3X2RlbnRyeShkZW50cnkpOworCisJCW5leHQgPSBuZXh0LT5uZXh0OworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK25jcF9pbnZhbGlkYXRlX2RpcmNhY2hlX2VudHJpZXMoc3RydWN0IGRlbnRyeSAqcGFyZW50KQoreworCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIgPSBOQ1BfU0VSVkVSKHBhcmVudC0+ZF9pbm9kZSk7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwluZXh0ID0gcGFyZW50LT5kX3N1YmRpcnMubmV4dDsKKwl3aGlsZSAobmV4dCAhPSAmcGFyZW50LT5kX3N1YmRpcnMpIHsKKwkJZGVudHJ5ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKwkJZGVudHJ5LT5kX2ZzZGF0YSA9IE5VTEw7CisJCW5jcF9hZ2VfZGVudHJ5KHNlcnZlciwgZGVudHJ5KTsKKwkJbmV4dCA9IG5leHQtPm5leHQ7CisJfQorCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7Cit9CisKK3N0cnVjdCBuY3BfY2FjaGVfaGVhZCB7CisJdGltZV90CQltdGltZTsKKwl1bnNpZ25lZCBsb25nCXRpbWU7CS8qIGNhY2hlIGFnZSAqLworCXVuc2lnbmVkIGxvbmcJZW5kOwkvKiBsYXN0IHZhbGlkIGZwb3MgaW4gY2FjaGUgKi8KKwlpbnQJCWVvZjsKK307CisKKyNkZWZpbmUgTkNQX0RJUkNBQ0hFX1NJWkUJKChpbnQpKFBBR0VfQ0FDSEVfU0laRS9zaXplb2Yoc3RydWN0IGRlbnRyeSAqKSkpCit1bmlvbiBuY3BfZGlyX2NhY2hlIHsKKwlzdHJ1Y3QgbmNwX2NhY2hlX2hlYWQJaGVhZDsKKwlzdHJ1Y3QgZGVudHJ5CQkqZGVudHJ5W05DUF9ESVJDQUNIRV9TSVpFXTsKK307CisKKyNkZWZpbmUgTkNQX0ZJUlNUQ0FDSEVfU0laRQkoKGludCkoKE5DUF9ESVJDQUNIRV9TSVpFICogXAorCXNpemVvZihzdHJ1Y3QgZGVudHJ5ICopIC0gc2l6ZW9mKHN0cnVjdCBuY3BfY2FjaGVfaGVhZCkpIC8gXAorCXNpemVvZihzdHJ1Y3QgZGVudHJ5ICopKSkKKworI2RlZmluZSBOQ1BfRElSQ0FDSEVfU1RBUlQJKE5DUF9ESVJDQUNIRV9TSVpFIC0gTkNQX0ZJUlNUQ0FDSEVfU0laRSkKKworc3RydWN0IG5jcF9jYWNoZV9jb250cm9sIHsKKwlzdHJ1Y3QJbmNwX2NhY2hlX2hlYWQJCWhlYWQ7CisJc3RydWN0CXBhZ2UJCQkqcGFnZTsKKwl1bmlvbgluY3BfZGlyX2NhY2hlCQkqY2FjaGU7CisJdW5zaWduZWQgbG9uZwkJCWZwb3MsIG9mczsKKwlpbnQJCQkJZmlsbGVkLCB2YWxpZCwgaWR4OworfTsKKworI2VuZGlmIC8qIF9OQ1BMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvbmNwc2lnbl9rZXJuZWwuYyBiL2ZzL25jcGZzL25jcHNpZ25fa2VybmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZlYzkwYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25jcGZzL25jcHNpZ25fa2VybmVsLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiAgbmNwc2lnbl9rZXJuZWwuYworICoKKyAqICBBcm5lIGRlIEJydWlqbiAoYXJuZUBrbm93YXJlLm5sKSwgMTk5NworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpZmRlZiBDT05GSUdfTkNQRlNfUEFDS0VUX1NJR05JTkcKKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25jcC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgIm5jcHNpZ25fa2VybmVsLmgiCisKKy8qIGkzODY6IDMyLWJpdCwgbGl0dGxlIGVuZGlhbiwgaGFuZGxlcyBtaXMtYWxpZ25tZW50ICovCisjaWZkZWYgX19pMzg2X18KKyNkZWZpbmUgR0VUX0xFMzIocCkgKCooaW50ICopKHApKQorI2RlZmluZSBQVVRfTEUzMihwLHYpIHsgKihpbnQgKikocCk9djsgfQorI2Vsc2UKKy8qIGZyb20gaW5jbHVkZS9uY3BsaWIuaCAqLworI2RlZmluZSBCVkFMKGJ1Zixwb3MpICgoKF9fdTggKikoYnVmKSlbcG9zXSkKKyNkZWZpbmUgUFZBTChidWYscG9zKSAoKHVuc2lnbmVkKUJWQUwoYnVmLHBvcykpCisjZGVmaW5lIEJTRVQoYnVmLHBvcyx2YWwpIChCVkFMKGJ1Zixwb3MpID0gKHZhbCkpCisKK3N0YXRpYyBpbmxpbmUgX191MTYKK1dWQUxfTEgoX191OCAqIGJ1ZiwgaW50IHBvcykKK3sKKwlyZXR1cm4gUFZBTChidWYsIHBvcykgfCBQVkFMKGJ1ZiwgcG9zICsgMSkgPDwgODsKK30KK3N0YXRpYyBpbmxpbmUgX191MzIKK0RWQUxfTEgoX191OCAqIGJ1ZiwgaW50IHBvcykKK3sKKwlyZXR1cm4gV1ZBTF9MSChidWYsIHBvcykgfCBXVkFMX0xIKGJ1ZiwgcG9zICsgMikgPDwgMTY7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQKK1dTRVRfTEgoX191OCAqIGJ1ZiwgaW50IHBvcywgX191MTYgdmFsKQoreworCUJTRVQoYnVmLCBwb3MsIHZhbCAmIDB4ZmYpOworCUJTRVQoYnVmLCBwb3MgKyAxLCB2YWwgPj4gOCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQKK0RTRVRfTEgoX191OCAqIGJ1ZiwgaW50IHBvcywgX191MzIgdmFsKQoreworCVdTRVRfTEgoYnVmLCBwb3MsIHZhbCAmIDB4ZmZmZik7CisJV1NFVF9MSChidWYsIHBvcyArIDIsIHZhbCA+PiAxNik7Cit9CisKKyNkZWZpbmUgR0VUX0xFMzIocCkgRFZBTF9MSChwLDApCisjZGVmaW5lIFBVVF9MRTMyKHAsdikgRFNFVF9MSChwLDAsdikKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBud3NpZ24oY2hhciAqcl9kYXRhMSwgY2hhciAqcl9kYXRhMiwgY2hhciAqb3V0ZGF0YSkgeworIGludCBpOworIHVuc2lnbmVkIGludCB3MCx3MSx3Mix3MzsKKyBzdGF0aWMgaW50IHJiaXRbNF09ezAsIDIsIDEsIDN9OworI2lmZGVmIF9faTM4Nl9fCisgdW5zaWduZWQgaW50ICpkYXRhMj0oaW50ICopcl9kYXRhMjsKKyNlbHNlCisgdW5zaWduZWQgaW50IGRhdGEyWzE2XTsKKyBmb3IgKGk9MDtpPDE2O2krKykKKyAgZGF0YTJbaV09R0VUX0xFMzIocl9kYXRhMisoaTw8MikpOworI2VuZGlmIAorIHcwPUdFVF9MRTMyKHJfZGF0YTEpOworIHcxPUdFVF9MRTMyKHJfZGF0YTErNCk7CisgdzI9R0VUX0xFMzIocl9kYXRhMSs4KTsKKyB3Mz1HRVRfTEUzMihyX2RhdGExKzEyKTsKKyBmb3IgKGk9MDtpPDE2O2krPTQpIHsKKyAgdzA9cm9sMzIodzAgKyAoKHcxICYgdzIpIHwgKCh+dzEpICYgdzMpKSArIGRhdGEyW2krMF0sMyk7CisgIHczPXJvbDMyKHczICsgKCh3MCAmIHcxKSB8ICgofncwKSAmIHcyKSkgKyBkYXRhMltpKzFdLDcpOworICB3Mj1yb2wzMih3MiArICgodzMgJiB3MCkgfCAoKH53MykgJiB3MSkpICsgZGF0YTJbaSsyXSwxMSk7CisgIHcxPXJvbDMyKHcxICsgKCh3MiAmIHczKSB8ICgofncyKSAmIHcwKSkgKyBkYXRhMltpKzNdLDE5KTsKKyB9CisgZm9yIChpPTA7aTw0O2krKykgeworICB3MD1yb2wzMih3MCArICgoKHcyIHwgdzMpICYgdzEpIHwgKHcyICYgdzMpKSArIDB4NWE4Mjc5OTkgKyBkYXRhMltpKzBdLDMpOworICB3Mz1yb2wzMih3MyArICgoKHcxIHwgdzIpICYgdzApIHwgKHcxICYgdzIpKSArIDB4NWE4Mjc5OTkgKyBkYXRhMltpKzRdLDUpOworICB3Mj1yb2wzMih3MiArICgoKHcwIHwgdzEpICYgdzMpIHwgKHcwICYgdzEpKSArIDB4NWE4Mjc5OTkgKyBkYXRhMltpKzhdLDkpOworICB3MT1yb2wzMih3MSArICgoKHczIHwgdzApICYgdzIpIHwgKHczICYgdzApKSArIDB4NWE4Mjc5OTkgKyBkYXRhMltpKzEyXSwxMyk7CisgfQorIGZvciAoaT0wO2k8NDtpKyspIHsKKyAgdzA9cm9sMzIodzAgKyAoKHcxIF4gdzIpIF4gdzMpICsgMHg2ZWQ5ZWJhMSArIGRhdGEyW3JiaXRbaV0rMF0sMyk7CisgIHczPXJvbDMyKHczICsgKCh3MCBeIHcxKSBeIHcyKSArIDB4NmVkOWViYTEgKyBkYXRhMltyYml0W2ldKzhdLDkpOworICB3Mj1yb2wzMih3MiArICgodzMgXiB3MCkgXiB3MSkgKyAweDZlZDllYmExICsgZGF0YTJbcmJpdFtpXSs0XSwxMSk7CisgIHcxPXJvbDMyKHcxICsgKCh3MiBeIHczKSBeIHcwKSArIDB4NmVkOWViYTEgKyBkYXRhMltyYml0W2ldKzEyXSwxNSk7CisgfQorIFBVVF9MRTMyKG91dGRhdGEsKHcwK0dFVF9MRTMyKHJfZGF0YTEpKSAmIDB4ZmZmZmZmZmYpOworIFBVVF9MRTMyKG91dGRhdGErNCwodzErR0VUX0xFMzIocl9kYXRhMSs0KSkgJiAweGZmZmZmZmZmKTsKKyBQVVRfTEUzMihvdXRkYXRhKzgsKHcyK0dFVF9MRTMyKHJfZGF0YTErOCkpICYgMHhmZmZmZmZmZik7CisgUFVUX0xFMzIob3V0ZGF0YSsxMiwodzMrR0VUX0xFMzIocl9kYXRhMSsxMikpICYgMHhmZmZmZmZmZik7Cit9CisKKy8qIE1ha2UgYSBzaWduYXR1cmUgZm9yIHRoZSBjdXJyZW50IHBhY2tldCBhbmQgYWRkIGl0IGF0IHRoZSBlbmQgb2YgdGhlICovCisvKiBwYWNrZXQuICovCit2b2lkIF9fc2lnbl9wYWNrZXQoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgY29uc3QgY2hhciAqcGFja2V0LCBzaXplX3Qgc2l6ZSwgX191MzIgdG90YWxzaXplLCB2b2lkICpzaWduX2J1ZmYpIHsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbNjRdOworCisJbWVtY3B5KGRhdGEsIHNlcnZlci0+c2lnbl9yb290LCA4KTsKKwkqKF9fdTMyKikoZGF0YSArIDgpID0gdG90YWxzaXplOworCWlmIChzaXplIDwgNTIpIHsKKwkJbWVtY3B5KGRhdGEgKyAxMiwgcGFja2V0LCBzaXplKTsKKwkJbWVtc2V0KGRhdGEgKyAxMiArIHNpemUsIDAsIDUyIC0gc2l6ZSk7CisJfSBlbHNlIHsKKwkJbWVtY3B5KGRhdGEgKyAxMiwgcGFja2V0LCA1Mik7CisJfQorCW53c2lnbihzZXJ2ZXItPnNpZ25fbGFzdCwgZGF0YSwgc2VydmVyLT5zaWduX2xhc3QpOworCW1lbWNweShzaWduX2J1ZmYsIHNlcnZlci0+c2lnbl9sYXN0LCA4KTsKK30KKworaW50IHNpZ25fdmVyaWZ5X3JlcGx5KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGNvbnN0IGNoYXIgKnBhY2tldCwgc2l6ZV90IHNpemUsIF9fdTMyIHRvdGFsc2l6ZSwgY29uc3Qgdm9pZCAqc2lnbl9idWZmKSB7CisJdW5zaWduZWQgY2hhciBkYXRhWzY0XTsKKwl1bnNpZ25lZCBjaGFyIGhhc2hbMTZdOworCisJbWVtY3B5KGRhdGEsIHNlcnZlci0+c2lnbl9yb290LCA4KTsKKwkqKF9fdTMyKikoZGF0YSArIDgpID0gdG90YWxzaXplOworCWlmIChzaXplIDwgNTIpIHsKKwkJbWVtY3B5KGRhdGEgKyAxMiwgcGFja2V0LCBzaXplKTsKKwkJbWVtc2V0KGRhdGEgKyAxMiArIHNpemUsIDAsIDUyIC0gc2l6ZSk7CisJfSBlbHNlIHsKKwkJbWVtY3B5KGRhdGEgKyAxMiwgcGFja2V0LCA1Mik7CisJfQorCW53c2lnbihzZXJ2ZXItPnNpZ25fbGFzdCwgZGF0YSwgaGFzaCk7CisJcmV0dXJuIG1lbWNtcChzaWduX2J1ZmYsIGhhc2gsIDgpOworfQorCisjZW5kaWYJLyogQ09ORklHX05DUEZTX1BBQ0tFVF9TSUdOSU5HICovCisKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL25jcHNpZ25fa2VybmVsLmggYi9mcy9uY3Bmcy9uY3BzaWduX2tlcm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NTFhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uY3Bmcy9uY3BzaWduX2tlcm5lbC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiAgbmNwc2lnbl9rZXJuZWwuaAorICoKKyAqICBBcm5lIGRlIEJydWlqbiAoYXJuZUBrbm93YXJlLm5sKSwgMTk5NworICoKKyAqLworIAorI2lmbmRlZiBfTkNQU0lHTl9LRVJORUxfSAorI2RlZmluZSBfTkNQU0lHTl9LRVJORUxfSAorCisjaW5jbHVkZSA8bGludXgvbmNwX2ZzLmg+CisKKyNpZmRlZiBDT05GSUdfTkNQRlNfUEFDS0VUX1NJR05JTkcKK3ZvaWQgX19zaWduX3BhY2tldChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSwgX191MzIgdG90YWxzaXplLCB2b2lkICpzaWduX2J1ZmYpOworaW50IHNpZ25fdmVyaWZ5X3JlcGx5KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLCBfX3UzMiB0b3RhbHNpemUsIGNvbnN0IHZvaWQgKnNpZ25fYnVmZik7CisjZW5kaWYKKworc3RhdGljIGlubGluZSBzaXplX3Qgc2lnbl9wYWNrZXQoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsIF9fdTMyIHRvdGFsc2l6ZSwgdm9pZCAqc2lnbl9idWZmKSB7CisjaWZkZWYgQ09ORklHX05DUEZTX1BBQ0tFVF9TSUdOSU5HCisJaWYgKHNlcnZlci0+c2lnbl9hY3RpdmUpIHsKKwkJX19zaWduX3BhY2tldChzZXJ2ZXIsIGRhdGEsIHNpemUsIHRvdGFsc2l6ZSwgc2lnbl9idWZmKTsKKwkJcmV0dXJuIDg7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvc29jay5jIGIvZnMvbmNwZnMvc29jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OTNhNWMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uY3Bmcy9zb2NrLmMKQEAgLTAsMCArMSw4NTAgQEAKKy8qCisgKiAgbGludXgvZnMvbmNwZnMvc29jay5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MyAgUmljayBTbGFka2V5CisgKgorICogIE1vZGlmaWVkIDE5OTUsIDE5OTYgYnkgVm9sa2VyIExlbmRlY2tlIHRvIGJlIHVzYWJsZSBmb3IgbmNwCisgKiAgTW9kaWZpZWQgMTk5NyBQZXRlciBXYWx0ZW5iZXJnLCBCaWxsIEhhd2VzLCBEYXZpZCBXb29kaG91c2UgZm9yIDIuMSBkY2FjaGUKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bmV0L3NjbS5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaXB4Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L25jcF9mcy5oPgorCisjaW5jbHVkZSAibmNwc2lnbl9rZXJuZWwuaCIKKworc3RhdGljIGludCBfcmVjdihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB2b2lkICpidWYsIGludCBzaXplLCB1bnNpZ25lZCBmbGFncykKK3sKKwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHtOVUxMLCB9OworCXN0cnVjdCBrdmVjIGlvdiA9IHtidWYsIHNpemV9OworCXJldHVybiBrZXJuZWxfcmVjdm1zZyhzb2NrLCAmbXNnLCAmaW92LCAxLCBzaXplLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRvX3NlbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IGt2ZWMgKnZlYywgaW50IGNvdW50LAorCQkJICBpbnQgbGVuLCB1bnNpZ25lZCBmbGFncykKK3sKKwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsgLm1zZ19mbGFncyA9IGZsYWdzIH07CisJcmV0dXJuIGtlcm5lbF9zZW5kbXNnKHNvY2ssICZtc2csIHZlYywgY291bnQsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgX3NlbmQoc3RydWN0IHNvY2tldCAqc29jaywgY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qga3ZlYyB2ZWM7CisJdmVjLmlvdl9iYXNlID0gKHZvaWQgKikgYnVmZjsKKwl2ZWMuaW92X2xlbiA9IGxlbjsKKwlyZXR1cm4gZG9fc2VuZChzb2NrLCAmdmVjLCAxLCBsZW4sIDApOworfQorCitzdHJ1Y3QgbmNwX3JlcXVlc3RfcmVwbHkgeworCXN0cnVjdCBsaXN0X2hlYWQgcmVxOworCXdhaXRfcXVldWVfaGVhZF90IHdxOworCXN0cnVjdCBuY3BfcmVwbHlfaGVhZGVyKiByZXBseV9idWY7CisJc2l6ZV90IGRhdGFsZW47CisJaW50IHJlc3VsdDsKKwllbnVtIHsgUlFfRE9ORSwgUlFfSU5QUk9HUkVTUywgUlFfUVVFVUVELCBSUV9JRExFIH0gc3RhdHVzOworCXN0cnVjdCBrdmVjKiB0eF9jaW92OworCXNpemVfdCB0eF90b3RhbGxlbjsKKwlzaXplX3QgdHhfaW92bGVuOworCXN0cnVjdCBrdmVjIHR4X2lvdlszXTsKKwl1X2ludDE2X3QgdHhfdHlwZTsKKwl1X2ludDMyX3Qgc2lnbls2XTsKK307CisKK3ZvaWQgbmNwX3RjcF9kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaywgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gc2stPnNrX3VzZXJfZGF0YTsKKworCXNlcnZlci0+ZGF0YV9yZWFkeShzaywgbGVuKTsKKwlzY2hlZHVsZV93b3JrKCZzZXJ2ZXItPnJjdi50cSk7Cit9CisKK3ZvaWQgbmNwX3RjcF9lcnJvcl9yZXBvcnQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIgPSBzay0+c2tfdXNlcl9kYXRhOworCQorCXNlcnZlci0+ZXJyb3JfcmVwb3J0KHNrKTsKKwlzY2hlZHVsZV93b3JrKCZzZXJ2ZXItPnJjdi50cSk7Cit9CisKK3ZvaWQgbmNwX3RjcF93cml0ZV9zcGFjZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciA9IHNrLT5za191c2VyX2RhdGE7CisJCisJLyogV2UgZG8gbm90IG5lZWQgYW55IGxvY2tpbmc6IHdlIGZpcnN0IHNldCB0eC5jcmVxLCBhbmQgdGhlbiB3ZSBkbyBzZW5kbXNnLAorCSAgIG5vdCB2aWNlIHZlcnNhLi4uICovCisJc2VydmVyLT53cml0ZV9zcGFjZShzayk7CisJaWYgKHNlcnZlci0+dHguY3JlcSkKKwkJc2NoZWR1bGVfd29yaygmc2VydmVyLT50eC50cSk7Cit9CisKK3ZvaWQgbmNwZGdyYW1fdGltZW91dF9jYWxsKHVuc2lnbmVkIGxvbmcgdikKK3sKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gKHZvaWQqKXY7CisJCisJc2NoZWR1bGVfd29yaygmc2VydmVyLT50aW1lb3V0X3RxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5jcF9maW5pc2hfcmVxdWVzdChzdHJ1Y3QgbmNwX3JlcXVlc3RfcmVwbHkgKnJlcSwgaW50IHJlc3VsdCkKK3sKKwlyZXEtPnJlc3VsdCA9IHJlc3VsdDsKKwlyZXEtPnN0YXR1cyA9IFJRX0RPTkU7CisJd2FrZV91cF9hbGwoJnJlcS0+d3EpOworfQorCitzdGF0aWMgdm9pZCBfX2Fib3J0X25jcF9jb25uZWN0aW9uKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuY3BfcmVxdWVzdF9yZXBseSAqYWJvcnRlZCwgaW50IGVycikKK3sKKwlzdHJ1Y3QgbmNwX3JlcXVlc3RfcmVwbHkgKnJlcTsKKworCW5jcF9pbnZhbGlkYXRlX2Nvbm4oc2VydmVyKTsKKwlkZWxfdGltZXIoJnNlcnZlci0+dGltZW91dF90bSk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZzZXJ2ZXItPnR4LnJlcXVlc3RzKSkgeworCQlyZXEgPSBsaXN0X2VudHJ5KHNlcnZlci0+dHgucmVxdWVzdHMubmV4dCwgc3RydWN0IG5jcF9yZXF1ZXN0X3JlcGx5LCByZXEpOworCQkKKwkJbGlzdF9kZWxfaW5pdCgmcmVxLT5yZXEpOworCQlpZiAocmVxID09IGFib3J0ZWQpIHsKKwkJCW5jcF9maW5pc2hfcmVxdWVzdChyZXEsIGVycik7CisJCX0gZWxzZSB7CisJCQluY3BfZmluaXNoX3JlcXVlc3QocmVxLCAtRUlPKTsKKwkJfQorCX0KKwlyZXEgPSBzZXJ2ZXItPnJjdi5jcmVxOworCWlmIChyZXEpIHsKKwkJc2VydmVyLT5yY3YuY3JlcSA9IE5VTEw7CisJCWlmIChyZXEgPT0gYWJvcnRlZCkgeworCQkJbmNwX2ZpbmlzaF9yZXF1ZXN0KHJlcSwgZXJyKTsKKwkJfSBlbHNlIHsKKwkJCW5jcF9maW5pc2hfcmVxdWVzdChyZXEsIC1FSU8pOworCQl9CisJCXNlcnZlci0+cmN2LnB0ciA9IE5VTEw7CisJCXNlcnZlci0+cmN2LnN0YXRlID0gMDsKKwl9CisJcmVxID0gc2VydmVyLT50eC5jcmVxOworCWlmIChyZXEpIHsKKwkJc2VydmVyLT50eC5jcmVxID0gTlVMTDsKKwkJaWYgKHJlcSA9PSBhYm9ydGVkKSB7CisJCQluY3BfZmluaXNoX3JlcXVlc3QocmVxLCBlcnIpOworCQl9IGVsc2UgeworCQkJbmNwX2ZpbmlzaF9yZXF1ZXN0KHJlcSwgLUVJTyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9jb25uX251bWJlcihzdHJ1Y3QgbmNwX3JlcGx5X2hlYWRlciAqcnApCit7CisJcmV0dXJuIHJwLT5jb25uX2xvdyB8IChycC0+Y29ubl9oaWdoIDw8IDgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19uY3BfYWJvcnRfcmVxdWVzdChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmNwX3JlcXVlc3RfcmVwbHkgKnJlcSwgaW50IGVycikKK3sKKwkvKiBJZiByZXEgaXMgZG9uZSwgd2UgZ290IHNpZ25hbCwgYnV0IHdlIGFsc28gcmVjZWl2ZWQgYW5zd2VyLi4uICovCisJc3dpdGNoIChyZXEtPnN0YXR1cykgeworCQljYXNlIFJRX0lETEU6CisJCWNhc2UgUlFfRE9ORToKKwkJCWJyZWFrOworCQljYXNlIFJRX1FVRVVFRDoKKwkJCWxpc3RfZGVsX2luaXQoJnJlcS0+cmVxKTsKKwkJCW5jcF9maW5pc2hfcmVxdWVzdChyZXEsIGVycik7CisJCQlicmVhazsKKwkJY2FzZSBSUV9JTlBST0dSRVNTOgorCQkJX19hYm9ydF9uY3BfY29ubmVjdGlvbihzZXJ2ZXIsIHJlcSwgZXJyKTsKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIG5jcF9hYm9ydF9yZXF1ZXN0KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuY3BfcmVxdWVzdF9yZXBseSAqcmVxLCBpbnQgZXJyKQoreworCWRvd24oJnNlcnZlci0+cmN2LmNyZXFfc2VtKTsKKwlfX25jcF9hYm9ydF9yZXF1ZXN0KHNlcnZlciwgcmVxLCBlcnIpOworCXVwKCZzZXJ2ZXItPnJjdi5jcmVxX3NlbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX25jcHRjcF9hYm9ydChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyKQoreworCV9fYWJvcnRfbmNwX2Nvbm5lY3Rpb24oc2VydmVyLCBOVUxMLCAwKTsKK30KKworc3RhdGljIGludCBuY3BkZ3JhbV9zZW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBuY3BfcmVxdWVzdF9yZXBseSAqcmVxKQoreworCXN0cnVjdCBrdmVjIHZlY1szXTsKKwkvKiBzb2NrX3NlbmRtc2cgdXBkYXRlcyBpb3YgcG9pbnRlcnMgZm9yIHVzIDotKCAqLworCW1lbWNweSh2ZWMsIHJlcS0+dHhfY2lvdiwgcmVxLT50eF9pb3ZsZW4gKiBzaXplb2YodmVjWzBdKSk7CisJcmV0dXJuIGRvX3NlbmQoc29jaywgdmVjLCByZXEtPnR4X2lvdmxlbiwKKwkJICAgICAgIHJlcS0+dHhfdG90YWxsZW4sIE1TR19ET05UV0FJVCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fbmNwdGNwX3RyeV9zZW5kKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIpCit7CisJc3RydWN0IG5jcF9yZXF1ZXN0X3JlcGx5ICpycTsKKwlzdHJ1Y3Qga3ZlYyAqaW92OworCXN0cnVjdCBrdmVjIGlvdmNbM107CisJaW50IHJlc3VsdDsKKworCXJxID0gc2VydmVyLT50eC5jcmVxOworCWlmICghcnEpCisJCXJldHVybjsKKworCS8qIHNvY2tfc2VuZG1zZyB1cGRhdGVzIGlvdiBwb2ludGVycyBmb3IgdXMgOi0oICovCisJbWVtY3B5KGlvdmMsIHJxLT50eF9jaW92LCBycS0+dHhfaW92bGVuICogc2l6ZW9mKGlvdlswXSkpOworCXJlc3VsdCA9IGRvX3NlbmQoc2VydmVyLT5uY3Bfc29jaywgaW92YywgcnEtPnR4X2lvdmxlbiwKKwkJCSBycS0+dHhfdG90YWxsZW4sIE1TR19OT1NJR05BTCB8IE1TR19ET05UV0FJVCk7CisKKwlpZiAocmVzdWx0ID09IC1FQUdBSU4pCisJCXJldHVybjsKKworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibmNwZnM6IHRjcDogU2VuZCBmYWlsZWQ6ICVkXG4iLCByZXN1bHQpOworCQlfX25jcF9hYm9ydF9yZXF1ZXN0KHNlcnZlciwgcnEsIHJlc3VsdCk7CisJCXJldHVybjsKKwl9CisJaWYgKHJlc3VsdCA+PSBycS0+dHhfdG90YWxsZW4pIHsKKwkJc2VydmVyLT5yY3YuY3JlcSA9IHJxOworCQlzZXJ2ZXItPnR4LmNyZXEgPSBOVUxMOworCQlyZXR1cm47CisJfQorCXJxLT50eF90b3RhbGxlbiAtPSByZXN1bHQ7CisJaW92ID0gcnEtPnR4X2Npb3Y7CisJd2hpbGUgKGlvdi0+aW92X2xlbiA8PSByZXN1bHQpIHsKKwkJcmVzdWx0IC09IGlvdi0+aW92X2xlbjsKKwkJaW92Kys7CisJCXJxLT50eF9pb3ZsZW4tLTsKKwl9CisJaW92LT5pb3ZfYmFzZSArPSByZXN1bHQ7CisJaW92LT5pb3ZfbGVuIC09IHJlc3VsdDsKKwlycS0+dHhfY2lvdiA9IGlvdjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5jcF9pbml0X2hlYWRlcihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmNwX3JlcXVlc3RfcmVwbHkgKnJlcSwgc3RydWN0IG5jcF9yZXF1ZXN0X2hlYWRlciAqaCkKK3sKKwlyZXEtPnN0YXR1cyA9IFJRX0lOUFJPR1JFU1M7CisJaC0+Y29ubl9sb3cgPSBzZXJ2ZXItPmNvbm5lY3Rpb247CisJaC0+Y29ubl9oaWdoID0gc2VydmVyLT5jb25uZWN0aW9uID4+IDg7CisJaC0+c2VxdWVuY2UgPSArK3NlcnZlci0+c2VxdWVuY2U7Cit9CisJCitzdGF0aWMgdm9pZCBuY3BkZ3JhbV9zdGFydF9yZXF1ZXN0KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuY3BfcmVxdWVzdF9yZXBseSAqcmVxKQoreworCXNpemVfdCBzaWdubGVuOworCXN0cnVjdCBuY3BfcmVxdWVzdF9oZWFkZXIqIGg7CisJCisJcmVxLT50eF9jaW92ID0gcmVxLT50eF9pb3YgKyAxOworCisJaCA9IHJlcS0+dHhfaW92WzFdLmlvdl9iYXNlOworCW5jcF9pbml0X2hlYWRlcihzZXJ2ZXIsIHJlcSwgaCk7CisJc2lnbmxlbiA9IHNpZ25fcGFja2V0KHNlcnZlciwgcmVxLT50eF9pb3ZbMV0uaW92X2Jhc2UgKyBzaXplb2Yoc3RydWN0IG5jcF9yZXF1ZXN0X2hlYWRlcikgLSAxLCAKKwkJCXJlcS0+dHhfaW92WzFdLmlvdl9sZW4gLSBzaXplb2Yoc3RydWN0IG5jcF9yZXF1ZXN0X2hlYWRlcikgKyAxLAorCQkJY3B1X3RvX2xlMzIocmVxLT50eF90b3RhbGxlbiksIHJlcS0+c2lnbik7CisJaWYgKHNpZ25sZW4pIHsKKwkJcmVxLT50eF9jaW92WzFdLmlvdl9iYXNlID0gcmVxLT5zaWduOworCQlyZXEtPnR4X2Npb3ZbMV0uaW92X2xlbiA9IHNpZ25sZW47CisJCXJlcS0+dHhfaW92bGVuICs9IDE7CisJCXJlcS0+dHhfdG90YWxsZW4gKz0gc2lnbmxlbjsKKwl9CisJc2VydmVyLT5yY3YuY3JlcSA9IHJlcTsKKwlzZXJ2ZXItPnRpbWVvdXRfbGFzdCA9IHNlcnZlci0+bS50aW1lX291dDsKKwlzZXJ2ZXItPnRpbWVvdXRfcmV0cmllcyA9IHNlcnZlci0+bS5yZXRyeV9jb3VudDsKKwluY3BkZ3JhbV9zZW5kKHNlcnZlci0+bmNwX3NvY2ssIHJlcSk7CisJbW9kX3RpbWVyKCZzZXJ2ZXItPnRpbWVvdXRfdG0sIGppZmZpZXMgKyBzZXJ2ZXItPm0udGltZV9vdXQpOworfQorCisjZGVmaW5lIE5DUF9UQ1BfWE1JVF9NQUdJQwkoMHg0NDZENjQ1NCkKKyNkZWZpbmUgTkNQX1RDUF9YTUlUX1ZFUlNJT04JKDEpCisjZGVmaW5lIE5DUF9UQ1BfUkNWRF9NQUdJQwkoMHg3NDRFNjM1MCkKKworc3RhdGljIHZvaWQgbmNwdGNwX3N0YXJ0X3JlcXVlc3Qoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5jcF9yZXF1ZXN0X3JlcGx5ICpyZXEpCit7CisJc2l6ZV90IHNpZ25sZW47CisJc3RydWN0IG5jcF9yZXF1ZXN0X2hlYWRlciogaDsKKworCXJlcS0+dHhfY2lvdiA9IHJlcS0+dHhfaW92OworCWggPSByZXEtPnR4X2lvdlsxXS5pb3ZfYmFzZTsKKwluY3BfaW5pdF9oZWFkZXIoc2VydmVyLCByZXEsIGgpOworCXNpZ25sZW4gPSBzaWduX3BhY2tldChzZXJ2ZXIsIHJlcS0+dHhfaW92WzFdLmlvdl9iYXNlICsgc2l6ZW9mKHN0cnVjdCBuY3BfcmVxdWVzdF9oZWFkZXIpIC0gMSwKKwkJCXJlcS0+dHhfaW92WzFdLmlvdl9sZW4gLSBzaXplb2Yoc3RydWN0IG5jcF9yZXF1ZXN0X2hlYWRlcikgKyAxLAorCQkJY3B1X3RvX2JlMzIocmVxLT50eF90b3RhbGxlbiArIDI0KSwgcmVxLT5zaWduICsgNCkgKyAxNjsKKworCXJlcS0+c2lnblswXSA9IGh0b25sKE5DUF9UQ1BfWE1JVF9NQUdJQyk7CisJcmVxLT5zaWduWzFdID0gaHRvbmwocmVxLT50eF90b3RhbGxlbiArIHNpZ25sZW4pOworCXJlcS0+c2lnblsyXSA9IGh0b25sKE5DUF9UQ1BfWE1JVF9WRVJTSU9OKTsKKwlyZXEtPnNpZ25bM10gPSBodG9ubChyZXEtPmRhdGFsZW4gKyA4KTsKKwlyZXEtPnR4X2lvdlswXS5pb3ZfYmFzZSA9IHJlcS0+c2lnbjsKKwlyZXEtPnR4X2lvdlswXS5pb3ZfbGVuID0gc2lnbmxlbjsKKwlyZXEtPnR4X2lvdmxlbiArPSAxOworCXJlcS0+dHhfdG90YWxsZW4gKz0gc2lnbmxlbjsKKworCXNlcnZlci0+dHguY3JlcSA9IHJlcTsKKwlfX25jcHRjcF90cnlfc2VuZChzZXJ2ZXIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19uY3Bfc3RhcnRfcmVxdWVzdChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmNwX3JlcXVlc3RfcmVwbHkgKnJlcSkKK3sKKwlpZiAoc2VydmVyLT5uY3Bfc29jay0+dHlwZSA9PSBTT0NLX1NUUkVBTSkKKwkJbmNwdGNwX3N0YXJ0X3JlcXVlc3Qoc2VydmVyLCByZXEpOworCWVsc2UKKwkJbmNwZGdyYW1fc3RhcnRfcmVxdWVzdChzZXJ2ZXIsIHJlcSk7Cit9CisKK3N0YXRpYyBpbnQgbmNwX2FkZF9yZXF1ZXN0KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuY3BfcmVxdWVzdF9yZXBseSAqcmVxKQoreworCWRvd24oJnNlcnZlci0+cmN2LmNyZXFfc2VtKTsKKwlpZiAoIW5jcF9jb25uX3ZhbGlkKHNlcnZlcikpIHsKKwkJdXAoJnNlcnZlci0+cmN2LmNyZXFfc2VtKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJuY3BmczogdGNwOiBTZXJ2ZXIgZGllZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoc2VydmVyLT50eC5jcmVxIHx8IHNlcnZlci0+cmN2LmNyZXEpIHsKKwkJcmVxLT5zdGF0dXMgPSBSUV9RVUVVRUQ7CisJCWxpc3RfYWRkX3RhaWwoJnJlcS0+cmVxLCAmc2VydmVyLT50eC5yZXF1ZXN0cyk7CisJCXVwKCZzZXJ2ZXItPnJjdi5jcmVxX3NlbSk7CisJCXJldHVybiAwOworCX0KKwlfX25jcF9zdGFydF9yZXF1ZXN0KHNlcnZlciwgcmVxKTsKKwl1cCgmc2VydmVyLT5yY3YuY3JlcV9zZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX25jcF9uZXh0X3JlcXVlc3Qoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlcikKK3sKKwlzdHJ1Y3QgbmNwX3JlcXVlc3RfcmVwbHkgKnJlcTsKKworCXNlcnZlci0+cmN2LmNyZXEgPSBOVUxMOworCWlmIChsaXN0X2VtcHR5KCZzZXJ2ZXItPnR4LnJlcXVlc3RzKSkgeworCQlyZXR1cm47CisJfQorCXJlcSA9IGxpc3RfZW50cnkoc2VydmVyLT50eC5yZXF1ZXN0cy5uZXh0LCBzdHJ1Y3QgbmNwX3JlcXVlc3RfcmVwbHksIHJlcSk7CisJbGlzdF9kZWxfaW5pdCgmcmVxLT5yZXEpOworCV9fbmNwX3N0YXJ0X3JlcXVlc3Qoc2VydmVyLCByZXEpOworfQorCitzdGF0aWMgdm9pZCBpbmZvX3NlcnZlcihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCB1bnNpZ25lZCBpbnQgaWQsIGNvbnN0IHZvaWQgKiBkYXRhLCBzaXplX3QgbGVuKQoreworCWlmIChzZXJ2ZXItPmluZm9fc29jaykgeworCQlzdHJ1Y3Qga3ZlYyBpb3ZbMl07CisJCV9fYmUzMiBoZHJbMl07CisJCisJCWhkclswXSA9IGNwdV90b19iZTMyKGxlbiArIDgpOworCQloZHJbMV0gPSBjcHVfdG9fYmUzMihpZCk7CisJCisJCWlvdlswXS5pb3ZfYmFzZSA9IGhkcjsKKwkJaW92WzBdLmlvdl9sZW4gPSA4OworCQlpb3ZbMV0uaW92X2Jhc2UgPSAodm9pZCAqKSBkYXRhOworCQlpb3ZbMV0uaW92X2xlbiA9IGxlbjsKKworCQlkb19zZW5kKHNlcnZlci0+aW5mb19zb2NrLCBpb3YsIDIsIGxlbiArIDgsIE1TR19OT1NJR05BTCk7CisJfQorfQorCit2b2lkIG5jcGRncmFtX3Jjdl9wcm9jKHZvaWQgKnMpCit7CisJc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciA9IHM7CisJc3RydWN0IHNvY2tldCogc29jazsKKwkKKwlzb2NrID0gc2VydmVyLT5uY3Bfc29jazsKKwkKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgbmNwX3JlcGx5X2hlYWRlciByZXBseTsKKwkJaW50IHJlc3VsdDsKKworCQlyZXN1bHQgPSBfcmVjdihzb2NrLCAmcmVwbHksIHNpemVvZihyZXBseSksIE1TR19QRUVLIHwgTVNHX0RPTlRXQUlUKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWJyZWFrOworCQl9CisJCWlmIChyZXN1bHQgPj0gc2l6ZW9mKHJlcGx5KSkgeworCQkJc3RydWN0IG5jcF9yZXF1ZXN0X3JlcGx5ICpyZXE7CisJCisJCQlpZiAocmVwbHkudHlwZSA9PSBOQ1BfV0FUQ0hET0cpIHsKKwkJCQl1bnNpZ25lZCBjaGFyIGJ1ZlsxMF07CisKKwkJCQlpZiAoc2VydmVyLT5jb25uZWN0aW9uICE9IGdldF9jb25uX251bWJlcigmcmVwbHkpKSB7CisJCQkJCWdvdG8gZHJvcDsKKwkJCQl9CisJCQkJcmVzdWx0ID0gX3JlY3Yoc29jaywgYnVmLCBzaXplb2YoYnVmKSwgTVNHX0RPTlRXQUlUKTsKKwkJCQlpZiAocmVzdWx0IDwgMCkgeworCQkJCQlEUFJJTlRLKCJyZWN2IGZhaWxlZCB3aXRoICVkXG4iLCByZXN1bHQpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKHJlc3VsdCA8IDEwKSB7CisJCQkJCURQUklOVEsoInRvbyBzaG9ydCAoJXUpIHdhdGNoZG9nIHBhY2tldFxuIiwgcmVzdWx0KTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChidWZbOV0gIT0gJz8nKSB7CisJCQkJCURQUklOVEsoImJhZCBzaWduYXR1cmUgKCUwMlgpIGluIHdhdGNoZG9nIHBhY2tldFxuIiwgYnVmWzldKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWJ1Zls5XSA9ICdZJzsKKwkJCQlfc2VuZChzb2NrLCBidWYsIHNpemVvZihidWYpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChyZXBseS50eXBlICE9IE5DUF9QT1NJVElWRV9BQ0sgJiYgcmVwbHkudHlwZSAhPSBOQ1BfUkVQTFkpIHsKKwkJCQlyZXN1bHQgPSBfcmVjdihzb2NrLCBzZXJ2ZXItPnVuZXhwZWN0ZWRfcGFja2V0LmRhdGEsIHNpemVvZihzZXJ2ZXItPnVuZXhwZWN0ZWRfcGFja2V0LmRhdGEpLCBNU0dfRE9OVFdBSVQpOworCQkJCWlmIChyZXN1bHQgPCAwKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpbmZvX3NlcnZlcihzZXJ2ZXIsIDAsIHNlcnZlci0+dW5leHBlY3RlZF9wYWNrZXQuZGF0YSwgcmVzdWx0KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWRvd24oJnNlcnZlci0+cmN2LmNyZXFfc2VtKTsJCQorCQkJcmVxID0gc2VydmVyLT5yY3YuY3JlcTsKKwkJCWlmIChyZXEgJiYgKHJlcS0+dHhfdHlwZSA9PSBOQ1BfQUxMT0NfU0xPVF9SRVFVRVNUIHx8IChzZXJ2ZXItPnNlcXVlbmNlID09IHJlcGx5LnNlcXVlbmNlICYmIAorCQkJCQlzZXJ2ZXItPmNvbm5lY3Rpb24gPT0gZ2V0X2Nvbm5fbnVtYmVyKCZyZXBseSkpKSkgeworCQkJCWlmIChyZXBseS50eXBlID09IE5DUF9QT1NJVElWRV9BQ0spIHsKKwkJCQkJc2VydmVyLT50aW1lb3V0X3JldHJpZXMgPSBzZXJ2ZXItPm0ucmV0cnlfY291bnQ7CisJCQkJCXNlcnZlci0+dGltZW91dF9sYXN0ID0gTkNQX01BWF9SUENfVElNRU9VVDsKKwkJCQkJbW9kX3RpbWVyKCZzZXJ2ZXItPnRpbWVvdXRfdG0sIGppZmZpZXMgKyBOQ1BfTUFYX1JQQ19USU1FT1VUKTsKKwkJCQl9IGVsc2UgaWYgKHJlcGx5LnR5cGUgPT0gTkNQX1JFUExZKSB7CisJCQkJCXJlc3VsdCA9IF9yZWN2KHNvY2ssICh2b2lkKilyZXEtPnJlcGx5X2J1ZiwgcmVxLT5kYXRhbGVuLCBNU0dfRE9OVFdBSVQpOworI2lmZGVmIENPTkZJR19OQ1BGU19QQUNLRVRfU0lHTklORworCQkJCQlpZiAocmVzdWx0ID49IDAgJiYgc2VydmVyLT5zaWduX2FjdGl2ZSAmJiByZXEtPnR4X3R5cGUgIT0gTkNQX0RFQUxMT0NfU0xPVF9SRVFVRVNUKSB7CisJCQkJCQlpZiAocmVzdWx0IDwgOCArIDgpIHsKKwkJCQkJCQlyZXN1bHQgPSAtRUlPOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgaGRybDsKKwkJCQkJCQkKKwkJCQkJCQlyZXN1bHQgLT0gODsKKwkJCQkJCQloZHJsID0gc29jay0+c2stPnNrX2ZhbWlseSA9PSBBRl9JTkVUID8gOCA6IDY7CisJCQkJCQkJaWYgKHNpZ25fdmVyaWZ5X3JlcGx5KHNlcnZlciwgKChjaGFyKilyZXEtPnJlcGx5X2J1ZikgKyBoZHJsLCByZXN1bHQgLSBoZHJsLCBjcHVfdG9fbGUzMihyZXN1bHQpLCAoKGNoYXIqKXJlcS0+cmVwbHlfYnVmKSArIHJlc3VsdCkpIHsKKwkJCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAibmNwZnM6IFNpZ25hdHVyZSB2aW9sYXRpb25cbiIpOworCQkJCQkJCQlyZXN1bHQgPSAtRUlPOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorI2VuZGlmCisJCQkJCWRlbF90aW1lcigmc2VydmVyLT50aW1lb3V0X3RtKTsKKwkJCQkgICAgIAlzZXJ2ZXItPnJjdi5jcmVxID0gTlVMTDsKKwkJCQkJbmNwX2ZpbmlzaF9yZXF1ZXN0KHJlcSwgcmVzdWx0KTsKKwkJCQkJX19uY3BfbmV4dF9yZXF1ZXN0KHNlcnZlcik7CisJCQkJCXVwKCZzZXJ2ZXItPnJjdi5jcmVxX3NlbSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCXVwKCZzZXJ2ZXItPnJjdi5jcmVxX3NlbSk7CisJCX0KK2Ryb3A6OwkJCisJCV9yZWN2KHNvY2ssICZyZXBseSwgc2l6ZW9mKHJlcGx5KSwgTVNHX0RPTlRXQUlUKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fbmNwZGdyYW1fdGltZW91dF9wcm9jKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIpCit7CisJLyogSWYgdGltZXIgaXMgcGVuZGluZywgd2UgYXJlIHByb2Nlc3NpbmcgYW5vdGhlciByZXF1ZXN0Li4uICovCisJaWYgKCF0aW1lcl9wZW5kaW5nKCZzZXJ2ZXItPnRpbWVvdXRfdG0pKSB7CisJCXN0cnVjdCBuY3BfcmVxdWVzdF9yZXBseSogcmVxOworCQkKKwkJcmVxID0gc2VydmVyLT5yY3YuY3JlcTsKKwkJaWYgKHJlcSkgeworCQkJaW50IHRpbWVvdXQ7CisJCQkKKwkJCWlmIChzZXJ2ZXItPm0uZmxhZ3MgJiBOQ1BfTU9VTlRfU09GVCkgeworCQkJCWlmIChzZXJ2ZXItPnRpbWVvdXRfcmV0cmllcy0tID09IDApIHsKKwkJCQkJX19uY3BfYWJvcnRfcmVxdWVzdChzZXJ2ZXIsIHJlcSwgLUVUSU1FRE9VVCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQkvKiBJZ25vcmUgZXJyb3JzICovCisJCQluY3BkZ3JhbV9zZW5kKHNlcnZlci0+bmNwX3NvY2ssIHJlcSk7CisJCQl0aW1lb3V0ID0gc2VydmVyLT50aW1lb3V0X2xhc3QgPDwgMTsKKwkJCWlmICh0aW1lb3V0ID4gTkNQX01BWF9SUENfVElNRU9VVCkgeworCQkJCXRpbWVvdXQgPSBOQ1BfTUFYX1JQQ19USU1FT1VUOworCQkJfQorCQkJc2VydmVyLT50aW1lb3V0X2xhc3QgPSB0aW1lb3V0OworCQkJbW9kX3RpbWVyKCZzZXJ2ZXItPnRpbWVvdXRfdG0sIGppZmZpZXMgKyB0aW1lb3V0KTsKKwkJfQorCX0KK30KKwordm9pZCBuY3BkZ3JhbV90aW1lb3V0X3Byb2Modm9pZCAqcykKK3sKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gczsKKwlkb3duKCZzZXJ2ZXItPnJjdi5jcmVxX3NlbSk7CisJX19uY3BkZ3JhbV90aW1lb3V0X3Byb2Moc2VydmVyKTsKKwl1cCgmc2VydmVyLT5yY3YuY3JlcV9zZW0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmNwX2luaXRfcmVxKHN0cnVjdCBuY3BfcmVxdWVzdF9yZXBseSogcmVxKQoreworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJlcS0+d3EpOworCXJlcS0+c3RhdHVzID0gUlFfSURMRTsKK30KKworc3RhdGljIGludCBkb190Y3BfcmN2KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbikKK3sKKwlpbnQgcmVzdWx0OworCQorCWlmIChidWZmZXIpIHsKKwkJcmVzdWx0ID0gX3JlY3Yoc2VydmVyLT5uY3Bfc29jaywgYnVmZmVyLCBsZW4sIE1TR19ET05UV0FJVCk7CisJfSBlbHNlIHsKKwkJc3RhdGljIHVuc2lnbmVkIGNoYXIgZHVtbXlbMTAyNF07CisJCQkKKwkJaWYgKGxlbiA+IHNpemVvZihkdW1teSkpIHsKKwkJCWxlbiA9IHNpemVvZihkdW1teSk7CisJCX0KKwkJcmVzdWx0ID0gX3JlY3Yoc2VydmVyLT5uY3Bfc29jaywgZHVtbXksIGxlbiwgTVNHX0RPTlRXQUlUKTsKKwl9CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJaWYgKHJlc3VsdCA+IGxlbikgeworCQlwcmludGsoS0VSTl9FUlIgIm5jcGZzOiB0Y3A6IGJ1ZyBpbiByZWN2bXNnICgldSA+ICVadSlcbiIsIHJlc3VsdCwgbGVuKTsKKwkJcmV0dXJuIC1FSU87CQkJCisJfQorCXJldHVybiByZXN1bHQ7Cit9CQorCitzdGF0aWMgaW50IF9fbmNwdGNwX3Jjdl9wcm9jKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIpCit7CisJLyogV2UgaGF2ZSB0byBjaGVjayB0aGUgcmVzdWx0LCBzbyBzdG9yZSB0aGUgY29tcGxldGUgaGVhZGVyICovCisJd2hpbGUgKDEpIHsKKwkJaW50IHJlc3VsdDsKKwkJc3RydWN0IG5jcF9yZXF1ZXN0X3JlcGx5ICpyZXE7CisJCWludCBkYXRhbGVuOworCQlpbnQgdHlwZTsKKworCQl3aGlsZSAoc2VydmVyLT5yY3YubGVuKSB7CisJCQlyZXN1bHQgPSBkb190Y3BfcmN2KHNlcnZlciwgc2VydmVyLT5yY3YucHRyLCBzZXJ2ZXItPnJjdi5sZW4pOworCQkJaWYgKHJlc3VsdCA9PSAtRUFHQUlOKSB7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAocmVzdWx0IDw9IDApIHsKKwkJCQlyZXEgPSBzZXJ2ZXItPnJjdi5jcmVxOworCQkJCWlmIChyZXEpIHsKKwkJCQkJX19uY3BfYWJvcnRfcmVxdWVzdChzZXJ2ZXIsIHJlcSwgLUVJTyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJX19uY3B0Y3BfYWJvcnQoc2VydmVyKTsKKwkJCQl9CisJCQkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJuY3BmczogdGNwOiBlcnJvciBpbiByZWN2bXNnOiAlZFxuIiwgcmVzdWx0KTsKKwkJCQl9IGVsc2UgeworCQkJCQlEUFJJTlRLKEtFUk5fRVJSICJuY3BmczogdGNwOiBFT0ZcbiIpOworCQkJCX0KKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCWlmIChzZXJ2ZXItPnJjdi5wdHIpIHsKKwkJCQlzZXJ2ZXItPnJjdi5wdHIgKz0gcmVzdWx0OworCQkJfQorCQkJc2VydmVyLT5yY3YubGVuIC09IHJlc3VsdDsKKwkJfQorCQlzd2l0Y2ggKHNlcnZlci0+cmN2LnN0YXRlKSB7CisJCQljYXNlIDA6CisJCQkJaWYgKHNlcnZlci0+cmN2LmJ1Zi5tYWdpYyAhPSBodG9ubChOQ1BfVENQX1JDVkRfTUFHSUMpKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAibmNwZnM6IHRjcDogVW5leHBlY3RlZCByZXBseSB0eXBlICUwOFhcbiIsIG50b2hsKHNlcnZlci0+cmN2LmJ1Zi5tYWdpYykpOworCQkJCQlfX25jcHRjcF9hYm9ydChzZXJ2ZXIpOworCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQl9CisJCQkJZGF0YWxlbiA9IG50b2hsKHNlcnZlci0+cmN2LmJ1Zi5sZW4pICYgMHgwRkZGRkZGRjsKKwkJCQlpZiAoZGF0YWxlbiA8IDEwKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAibmNwZnM6IHRjcDogVW5leHBlY3RlZCByZXBseSBsZW4gJWRcbiIsIGRhdGFsZW4pOworCQkJCQlfX25jcHRjcF9hYm9ydChzZXJ2ZXIpOworCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQl9CisjaWZkZWYgQ09ORklHX05DUEZTX1BBQ0tFVF9TSUdOSU5HCQkJCQorCQkJCWlmIChzZXJ2ZXItPnNpZ25fYWN0aXZlKSB7CisJCQkJCWlmIChkYXRhbGVuIDwgMTgpIHsKKwkJCQkJCXByaW50ayhLRVJOX0VSUiAibmNwZnM6IHRjcDogVW5leHBlY3RlZCByZXBseSBsZW4gJWRcbiIsIGRhdGFsZW4pOworCQkJCQkJX19uY3B0Y3BfYWJvcnQoc2VydmVyKTsKKwkJCQkJCXJldHVybiAtRUlPOworCQkJCQl9CisJCQkJCXNlcnZlci0+cmN2LmJ1Zi5sZW4gPSBkYXRhbGVuIC0gODsKKwkJCQkJc2VydmVyLT5yY3YucHRyID0gKHVuc2lnbmVkIGNoYXIqKSZzZXJ2ZXItPnJjdi5idWYucDE7CisJCQkJCXNlcnZlci0+cmN2LmxlbiA9IDg7CisJCQkJCXNlcnZlci0+cmN2LnN0YXRlID0gNDsKKwkJCQkJYnJlYWs7CisJCQkJfQorI2VuZGlmCQkJCQorCQkJCXR5cGUgPSBudG9ocyhzZXJ2ZXItPnJjdi5idWYudHlwZSk7CisjaWZkZWYgQ09ORklHX05DUEZTX1BBQ0tFVF9TSUdOSU5HCQkJCQorY29udDo7CQkJCQorI2VuZGlmCisJCQkJaWYgKHR5cGUgIT0gTkNQX1JFUExZKSB7CisJCQkJCWlmIChkYXRhbGVuIC0gOCA8PSBzaXplb2Yoc2VydmVyLT51bmV4cGVjdGVkX3BhY2tldC5kYXRhKSkgeworCQkJCQkJKihfX3UxNiopKHNlcnZlci0+dW5leHBlY3RlZF9wYWNrZXQuZGF0YSkgPSBodG9ucyh0eXBlKTsKKwkJCQkJCXNlcnZlci0+dW5leHBlY3RlZF9wYWNrZXQubGVuID0gZGF0YWxlbiAtIDg7CisKKwkJCQkJCXNlcnZlci0+cmN2LnN0YXRlID0gNTsKKwkJCQkJCXNlcnZlci0+cmN2LnB0ciA9IHNlcnZlci0+dW5leHBlY3RlZF9wYWNrZXQuZGF0YSArIDI7CisJCQkJCQlzZXJ2ZXItPnJjdi5sZW4gPSBkYXRhbGVuIC0gMTA7CisJCQkJCQlicmVhazsKKwkJCQkJfQkJCQkJCisJCQkJCURQUklOVEsoIm5jcGZzOiB0Y3A6IFVuZXhwZWN0ZWQgTkNQIHR5cGUgJTAyWFxuIiwgdHlwZSk7Citza2lwZGF0YTI6OworCQkJCQlzZXJ2ZXItPnJjdi5zdGF0ZSA9IDI7Citza2lwZGF0YTo7CisJCQkJCXNlcnZlci0+cmN2LnB0ciA9IE5VTEw7CisJCQkJCXNlcnZlci0+cmN2LmxlbiA9IGRhdGFsZW4gLSAxMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXJlcSA9IHNlcnZlci0+cmN2LmNyZXE7CisJCQkJaWYgKCFyZXEpIHsKKwkJCQkJRFBSSU5USyhLRVJOX0VSUiAibmNwZnM6IFJlcGx5IHdpdGhvdXQgYXBwcm9wcmlhdGUgcmVxdWVzdFxuIik7CisJCQkJCWdvdG8gc2tpcGRhdGEyOworCQkJCX0KKwkJCQlpZiAoZGF0YWxlbiA+IHJlcS0+ZGF0YWxlbiArIDgpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJuY3BmczogdGNwOiBVbmV4cGVjdGVkIHJlcGx5IGxlbiAlZCAoZXhwZWN0ZWQgYXQgbW9zdCAlWmQpXG4iLCBkYXRhbGVuLCByZXEtPmRhdGFsZW4gKyA4KTsKKwkJCQkJc2VydmVyLT5yY3Yuc3RhdGUgPSAzOworCQkJCQlnb3RvIHNraXBkYXRhOworCQkJCX0KKwkJCQlyZXEtPmRhdGFsZW4gPSBkYXRhbGVuIC0gODsKKwkJCQlyZXEtPnJlcGx5X2J1Zi0+dHlwZSA9IE5DUF9SRVBMWTsKKwkJCQlzZXJ2ZXItPnJjdi5wdHIgPSAodW5zaWduZWQgY2hhciopKHJlcS0+cmVwbHlfYnVmKSArIDI7CisJCQkJc2VydmVyLT5yY3YubGVuID0gZGF0YWxlbiAtIDEwOworCQkJCXNlcnZlci0+cmN2LnN0YXRlID0gMTsKKwkJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfTkNQRlNfUEFDS0VUX1NJR05JTkcJCQkJCisJCQljYXNlIDQ6CisJCQkJZGF0YWxlbiA9IHNlcnZlci0+cmN2LmJ1Zi5sZW47CisJCQkJdHlwZSA9IG50b2hzKHNlcnZlci0+cmN2LmJ1Zi50eXBlMik7CisJCQkJZ290byBjb250OworI2VuZGlmCisJCQljYXNlIDE6CisJCQkJcmVxID0gc2VydmVyLT5yY3YuY3JlcTsKKwkJCQlpZiAocmVxLT50eF90eXBlICE9IE5DUF9BTExPQ19TTE9UX1JFUVVFU1QpIHsKKwkJCQkJaWYgKHJlcS0+cmVwbHlfYnVmLT5zZXF1ZW5jZSAhPSBzZXJ2ZXItPnNlcXVlbmNlKSB7CisJCQkJCQlwcmludGsoS0VSTl9FUlIgIm5jcGZzOiB0Y3A6IEJhZCBzZXF1ZW5jZSBudW1iZXJcbiIpOworCQkJCQkJX19uY3BfYWJvcnRfcmVxdWVzdChzZXJ2ZXIsIHJlcSwgLUVJTyk7CisJCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQkJfQorCQkJCQlpZiAoKHJlcS0+cmVwbHlfYnVmLT5jb25uX2xvdyB8IChyZXEtPnJlcGx5X2J1Zi0+Y29ubl9oaWdoIDw8IDgpKSAhPSBzZXJ2ZXItPmNvbm5lY3Rpb24pIHsKKwkJCQkJCXByaW50ayhLRVJOX0VSUiAibmNwZnM6IHRjcDogQ29ubmVjdGlvbiBudW1iZXIgbWlzbWF0Y2hcbiIpOworCQkJCQkJX19uY3BfYWJvcnRfcmVxdWVzdChzZXJ2ZXIsIHJlcSwgLUVJTyk7CisJCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQkJfQorCQkJCX0KKyNpZmRlZiBDT05GSUdfTkNQRlNfUEFDS0VUX1NJR05JTkcJCQkJCisJCQkJaWYgKHNlcnZlci0+c2lnbl9hY3RpdmUgJiYgcmVxLT50eF90eXBlICE9IE5DUF9ERUFMTE9DX1NMT1RfUkVRVUVTVCkgeworCQkJCQlpZiAoc2lnbl92ZXJpZnlfcmVwbHkoc2VydmVyLCAodW5zaWduZWQgY2hhciopKHJlcS0+cmVwbHlfYnVmKSArIDYsIHJlcS0+ZGF0YWxlbiAtIDYsIGNwdV90b19iZTMyKHJlcS0+ZGF0YWxlbiArIDE2KSwgJnNlcnZlci0+cmN2LmJ1Zi50eXBlKSkgeworCQkJCQkJcHJpbnRrKEtFUk5fRVJSICJuY3BmczogdGNwOiBTaWduYXR1cmUgdmlvbGF0aW9uXG4iKTsKKwkJCQkJCV9fbmNwX2Fib3J0X3JlcXVlc3Qoc2VydmVyLCByZXEsIC1FSU8pOworCQkJCQkJcmV0dXJuIC1FSU87CisJCQkJCX0KKwkJCQl9CisjZW5kaWYJCQkJCisJCQkJbmNwX2ZpbmlzaF9yZXF1ZXN0KHJlcSwgcmVxLT5kYXRhbGVuKTsKKwkJCW5leHRyZXE6OworCQkJCV9fbmNwX25leHRfcmVxdWVzdChzZXJ2ZXIpOworCQkJY2FzZSAyOgorCQkJbmV4dDo7CisJCQkJc2VydmVyLT5yY3YucHRyID0gKHVuc2lnbmVkIGNoYXIqKSZzZXJ2ZXItPnJjdi5idWY7CisJCQkJc2VydmVyLT5yY3YubGVuID0gMTA7CisJCQkJc2VydmVyLT5yY3Yuc3RhdGUgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCW5jcF9maW5pc2hfcmVxdWVzdChzZXJ2ZXItPnJjdi5jcmVxLCAtRUlPKTsKKwkJCQlnb3RvIG5leHRyZXE7CisJCQljYXNlIDU6CisJCQkJaW5mb19zZXJ2ZXIoc2VydmVyLCAwLCBzZXJ2ZXItPnVuZXhwZWN0ZWRfcGFja2V0LmRhdGEsIHNlcnZlci0+dW5leHBlY3RlZF9wYWNrZXQubGVuKTsKKwkJCQlnb3RvIG5leHQ7CisJCX0KKwl9Cit9CisKK3ZvaWQgbmNwX3RjcF9yY3ZfcHJvYyh2b2lkICpzKQoreworCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIgPSBzOworCisJZG93bigmc2VydmVyLT5yY3YuY3JlcV9zZW0pOworCV9fbmNwdGNwX3Jjdl9wcm9jKHNlcnZlcik7CisJdXAoJnNlcnZlci0+cmN2LmNyZXFfc2VtKTsKK30KKwordm9pZCBuY3BfdGNwX3R4X3Byb2Modm9pZCAqcykKK3sKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gczsKKwkKKwlkb3duKCZzZXJ2ZXItPnJjdi5jcmVxX3NlbSk7CisJX19uY3B0Y3BfdHJ5X3NlbmQoc2VydmVyKTsKKwl1cCgmc2VydmVyLT5yY3YuY3JlcV9zZW0pOworfQorCitzdGF0aWMgaW50IGRvX25jcF9ycGNfY2FsbChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBpbnQgc2l6ZSwKKwkJc3RydWN0IG5jcF9yZXBseV9oZWFkZXIqIHJlcGx5X2J1ZiwgaW50IG1heF9yZXBseV9zaXplKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IG5jcF9yZXF1ZXN0X3JlcGx5IHJlcTsKKworCW5jcF9pbml0X3JlcSgmcmVxKTsKKwlyZXEucmVwbHlfYnVmID0gcmVwbHlfYnVmOworCXJlcS5kYXRhbGVuID0gbWF4X3JlcGx5X3NpemU7CisJcmVxLnR4X2lvdlsxXS5pb3ZfYmFzZSA9IHNlcnZlci0+cGFja2V0OworCXJlcS50eF9pb3ZbMV0uaW92X2xlbiA9IHNpemU7CisJcmVxLnR4X2lvdmxlbiA9IDE7CisJcmVxLnR4X3RvdGFsbGVuID0gc2l6ZTsKKwlyZXEudHhfdHlwZSA9ICoodV9pbnQxNl90KilzZXJ2ZXItPnBhY2tldDsKKworCXJlc3VsdCA9IG5jcF9hZGRfcmVxdWVzdChzZXJ2ZXIsICZyZXEpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXJldHVybiByZXN1bHQ7CisJfQorCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocmVxLndxLCByZXEuc3RhdHVzID09IFJRX0RPTkUpKSB7CisJCW5jcF9hYm9ydF9yZXF1ZXN0KHNlcnZlciwgJnJlcSwgLUVJTyk7CisJfQorCXJldHVybiByZXEucmVzdWx0OworfQorCisvKgorICogV2UgbmVlZCB0aGUgc2VydmVyIHRvIGJlIGxvY2tlZCBoZXJlLCBzbyBjaGVjayEKKyAqLworCitzdGF0aWMgaW50IG5jcF9kb19yZXF1ZXN0KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGludCBzaXplLAorCQl2b2lkKiByZXBseSwgaW50IG1heF9yZXBseV9zaXplKQoreworCWludCByZXN1bHQ7CisKKwlpZiAoc2VydmVyLT5sb2NrID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJuY3BmczogU2VydmVyIG5vdCBsb2NrZWQhXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICghbmNwX2Nvbm5fdmFsaWQoc2VydmVyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIm5jcGZzOiBDb25uZWN0aW9uIGludmFsaWQhXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXsKKwkJc2lnc2V0X3Qgb2xkX3NldDsKKwkJdW5zaWduZWQgbG9uZyBtYXNrLCBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCQlvbGRfc2V0ID0gY3VycmVudC0+YmxvY2tlZDsKKwkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRVhJVElORykKKwkJCW1hc2sgPSAwOworCQllbHNlCisJCQltYXNrID0gc2lnbWFzayhTSUdLSUxMKTsKKwkJaWYgKHNlcnZlci0+bS5mbGFncyAmIE5DUF9NT1VOVF9JTlRSKSB7CisJCQkvKiBGSVhNRTogVGhpcyBkb2Vzbid0IHNlZW0gcmlnaHQgYXQgYWxsLiAgU28sIGxpa2UsCisJCQkgICB3ZSBjYW4ndCBoYW5kbGUgU0lHSU5UIGFuZCBnZXQgd2hhdGV2ZXIgdG8gc3RvcD8KKwkJCSAgIFdoYXQgaWYgd2UndmUgYmxvY2tlZCBpdCBvdXJzZWx2ZXM/ICBXaGF0IGFib3V0CisJCQkgICBhbGFybXM/ICBXaHksIGluIGZhY3QsIGFyZSB3ZSBtdWNraW5nIHdpdGggdGhlCisJCQkgICBzaWdtYXNrIGF0IGFsbD8gLS0gcn4gKi8KKwkJCWlmIChjdXJyZW50LT5zaWdoYW5kLT5hY3Rpb25bU0lHSU5UIC0gMV0uc2Euc2FfaGFuZGxlciA9PSBTSUdfREZMKQorCQkJCW1hc2sgfD0gc2lnbWFzayhTSUdJTlQpOworCQkJaWYgKGN1cnJlbnQtPnNpZ2hhbmQtPmFjdGlvbltTSUdRVUlUIC0gMV0uc2Euc2FfaGFuZGxlciA9PSBTSUdfREZMKQorCQkJCW1hc2sgfD0gc2lnbWFzayhTSUdRVUlUKTsKKwkJfQorCQlzaWdpbml0c2V0aW52KCZjdXJyZW50LT5ibG9ja2VkLCBtYXNrKTsKKwkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCQkKKwkJcmVzdWx0ID0gZG9fbmNwX3JwY19jYWxsKHNlcnZlciwgc2l6ZSwgcmVwbHksIG1heF9yZXBseV9zaXplKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCQljdXJyZW50LT5ibG9ja2VkID0gb2xkX3NldDsKKwkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCX0KKworCUREUFJJTlRLKCJkb19uY3BfcnBjX2NhbGwgcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7CisKKwlpZiAocmVzdWx0IDwgMCkgeworCQkvKiBUaGVyZSB3YXMgYSBwcm9ibGVtIHdpdGggSS9PLCBzbyB0aGUgY29ubmVjdGlvbnMgaXMKKwkJICogbm8gbG9uZ2VyIHVzYWJsZS4gKi8KKwkJbmNwX2ludmFsaWRhdGVfY29ubihzZXJ2ZXIpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBuY3BfZG9fcmVxdWVzdCBhc3N1cmVzIHRoYXQgYXQgbGVhc3QgYSBjb21wbGV0ZSByZXBseSBoZWFkZXIgaXMKKyAqIHJlY2VpdmVkLiBJdCBhc3N1bWVzIHRoYXQgc2VydmVyLT5jdXJyZW50X3NpemUgY29udGFpbnMgdGhlIG5jcAorICogcmVxdWVzdCBzaXplCisgKi8KK2ludCBuY3BfcmVxdWVzdDIoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgaW50IGZ1bmN0aW9uLCAKKwkJdm9pZCogcnBsLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgbmNwX3JlcXVlc3RfaGVhZGVyICpoOworCXN0cnVjdCBuY3BfcmVwbHlfaGVhZGVyKiByZXBseSA9IHJwbDsKKwlpbnQgcmVzdWx0OworCisJaCA9IChzdHJ1Y3QgbmNwX3JlcXVlc3RfaGVhZGVyICopIChzZXJ2ZXItPnBhY2tldCk7CisJaWYgKHNlcnZlci0+aGFzX3N1YmZ1bmN0aW9uICE9IDApIHsKKwkJKihfX3UxNiAqKSAmIChoLT5kYXRhWzBdKSA9IGh0b25zKHNlcnZlci0+Y3VycmVudF9zaXplIC0gc2l6ZW9mKCpoKSAtIDIpOworCX0KKwloLT50eXBlID0gTkNQX1JFUVVFU1Q7CisJLyoKKwkgKiBUaGUgc2VydmVyIHNob3VsZG4ndCBrbm93IG9yIGNhcmUgd2hhdCB0YXNrIGlzIG1ha2luZyBhCisJICogcmVxdWVzdCwgc28gd2UgYWx3YXlzIHVzZSB0aGUgc2FtZSB0YXNrIG51bWJlci4KKwkgKi8KKwloLT50YXNrID0gMjsgLyogKGN1cnJlbnQtPnBpZCkgJiAweGZmOyAqLworCWgtPmZ1bmN0aW9uID0gZnVuY3Rpb247CisKKwlyZXN1bHQgPSBuY3BfZG9fcmVxdWVzdChzZXJ2ZXIsIHNlcnZlci0+Y3VycmVudF9zaXplLCByZXBseSwgc2l6ZSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJRFBSSU5USygibmNwX3JlcXVlc3RfZXJyb3I6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIG91dDsKKwl9CisJc2VydmVyLT5jb21wbGV0aW9uID0gcmVwbHktPmNvbXBsZXRpb25fY29kZTsKKwlzZXJ2ZXItPmNvbm5fc3RhdHVzID0gcmVwbHktPmNvbm5lY3Rpb25fc3RhdGU7CisJc2VydmVyLT5yZXBseV9zaXplID0gcmVzdWx0OworCXNlcnZlci0+bmNwX3JlcGx5X3NpemUgPSByZXN1bHQgLSBzaXplb2Yoc3RydWN0IG5jcF9yZXBseV9oZWFkZXIpOworCisJcmVzdWx0ID0gcmVwbHktPmNvbXBsZXRpb25fY29kZTsKKworCWlmIChyZXN1bHQgIT0gMCkKKwkJUFBSSU5USygibmNwX3JlcXVlc3Q6IGNvbXBsZXRpb24gY29kZT0leFxuIiwgcmVzdWx0KTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgbmNwX2Nvbm5lY3Qoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlcikKK3sKKwlzdHJ1Y3QgbmNwX3JlcXVlc3RfaGVhZGVyICpoOworCWludCByZXN1bHQ7CisKKwlzZXJ2ZXItPmNvbm5lY3Rpb24gPSAweEZGRkY7CisJc2VydmVyLT5zZXF1ZW5jZSA9IDI1NTsKKworCWggPSAoc3RydWN0IG5jcF9yZXF1ZXN0X2hlYWRlciAqKSAoc2VydmVyLT5wYWNrZXQpOworCWgtPnR5cGUgPSBOQ1BfQUxMT0NfU0xPVF9SRVFVRVNUOworCWgtPnRhc2sJCT0gMjsgLyogc2VlIGFib3ZlICovCisJaC0+ZnVuY3Rpb24JPSAwOworCisJcmVzdWx0ID0gbmNwX2RvX3JlcXVlc3Qoc2VydmVyLCBzaXplb2YoKmgpLCBzZXJ2ZXItPnBhY2tldCwgc2VydmVyLT5wYWNrZXRfc2l6ZSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0OworCXNlcnZlci0+Y29ubmVjdGlvbiA9IGgtPmNvbm5fbG93ICsgKGgtPmNvbm5faGlnaCAqIDI1Nik7CisJcmVzdWx0ID0gMDsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgbmNwX2Rpc2Nvbm5lY3Qoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlcikKK3sKKwlzdHJ1Y3QgbmNwX3JlcXVlc3RfaGVhZGVyICpoOworCisJaCA9IChzdHJ1Y3QgbmNwX3JlcXVlc3RfaGVhZGVyICopIChzZXJ2ZXItPnBhY2tldCk7CisJaC0+dHlwZSA9IE5DUF9ERUFMTE9DX1NMT1RfUkVRVUVTVDsKKwloLT50YXNrCQk9IDI7IC8qIHNlZSBhYm92ZSAqLworCWgtPmZ1bmN0aW9uCT0gMDsKKworCXJldHVybiBuY3BfZG9fcmVxdWVzdChzZXJ2ZXIsIHNpemVvZigqaCksIHNlcnZlci0+cGFja2V0LCBzZXJ2ZXItPnBhY2tldF9zaXplKTsKK30KKwordm9pZCBuY3BfbG9ja19zZXJ2ZXIoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlcikKK3sKKwlkb3duKCZzZXJ2ZXItPnNlbSk7CisJaWYgKHNlcnZlci0+bG9jaykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibmNwX2xvY2tfc2VydmVyOiB3YXMgbG9ja2VkIVxuIik7CisJc2VydmVyLT5sb2NrID0gMTsKK30KKwordm9pZCBuY3BfdW5sb2NrX3NlcnZlcihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyKQoreworCWlmICghc2VydmVyLT5sb2NrKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm5jcF91bmxvY2tfc2VydmVyOiB3YXMgbm90IGxvY2tlZCFcbiIpOworCQlyZXR1cm47CisJfQorCXNlcnZlci0+bG9jayA9IDA7CisJdXAoJnNlcnZlci0+c2VtKTsKK30KZGlmZiAtLWdpdCBhL2ZzL25jcGZzL3N5bWxpbmsuYyBiL2ZzL25jcGZzL3N5bWxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTM1ZjFiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmNwZnMvc3ltbGluay5jCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogIGxpbnV4L2ZzL25jcGZzL3N5bWxpbmsuYworICoKKyAqICBDb2RlIGZvciBhbGxvd2luZyBzeW1ib2xpYyBsaW5rcyBvbiBOQ1BGUyAoaS5lLiBOZXRXYXJlKQorICogIFN5bWJvbGljIGxpbmtzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIG5hdGl2ZSBOZXRXYXJlLCBzbyB3ZSB1c2UgYW4KKyAqICBpbmZyZXF1ZW50bHktdXNlZCBmbGFnIChTaCkgYW5kIHN0b3JlIGEgdHdvLXdvcmQgbWFnaWMgaGVhZGVyIGluCisgKiAgdGhlIGZpbGUgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGFjY2lkZW50YWxseSB1c2UgYSBub24tbGluayBmaWxlCisgKiAgYXMgYSBsaW5rLgorICoKKyAqICBXaGVuIHVzaW5nIHRoZSBORlMgbmFtZXNwYWNlLCB3ZSBzZXQgdGhlIG1vZGUgdG8gaW5kaWNhdGUgYSBzeW1saW5rIGFuZAorICogIGRvbid0IGJvdGhlciB3aXRoIHRoZSBtYWdpYyBudW1iZXJzLgorICoKKyAqICBmcm9tIGxpbnV4L2ZzL2V4dDIvc3ltbGluay5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OC05OSwgRnJhbmsgQS4gVm9yc3RlbmJvc2NoCisgKgorICogIG5jcGZzIHN5bWxpbmsgaGFuZGxpbmcgY29kZQorICogIE5MUyBzdXBwb3J0IChjKSAxOTk5IFBldHIgVmFuZHJvdmVjCisgKiAgTW9kaWZpZWQgMjAwMCBCZW4gSGFycmlzLCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSBmb3IgTkZTIE5TIG1ldGEtaW5mbworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25jcF9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlICJuY3BsaWJfa2VybmVsLmgiCisKKworLyogdGhlc2UgbWFnaWMgbnVtYmVycyBtdXN0IGFwcGVhciBpbiB0aGUgc3ltbGluayBmaWxlIC0tIHRoaXMgbWFrZXMgaXQgYSBiaXQKKyAgIG1vcmUgcmVzaWxpZW50IGFnYWluc3QgdGhlIG1hZ2ljIGF0dHJpYnV0ZXMgYmVpbmcgc2V0IG9uIHJhbmRvbSBmaWxlcy4gKi8KKworI2RlZmluZSBOQ1BfU1lNTElOS19NQUdJQzAJY3B1X3RvX2xlMzIoMHg2YzZkNzk3MykgICAgIC8qICJzeW1sbmstPiIgKi8KKyNkZWZpbmUgTkNQX1NZTUxJTktfTUFHSUMxCWNwdV90b19sZTMyKDB4M2UyZDZiNmUpCisKKy8qIC0tLS0tIHJlYWQgYSBzeW1ib2xpYyBsaW5rIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IG5jcF9zeW1saW5rX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlpbnQgZXJyb3IsIGxlbmd0aCwgbGVuOworCWNoYXIgKmxpbmssICpyYXdsaW5rOworCWNoYXIgKmJ1ZiA9IGttYXAocGFnZSk7CisKKwllcnJvciA9IC1FTk9NRU07CisJcmF3bGluaz0oY2hhciAqKWttYWxsb2MoTkNQX01BWF9TWU1MSU5LX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghcmF3bGluaykKKwkJZ290byBmYWlsOworCisJaWYgKG5jcF9tYWtlX29wZW4oaW5vZGUsT19SRE9OTFkpKQorCQlnb3RvIGZhaWxFSU87CisKKwllcnJvcj1uY3BfcmVhZF9rZXJuZWwoTkNQX1NFUlZFUihpbm9kZSksTkNQX0ZJTkZPKGlub2RlKS0+ZmlsZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCxOQ1BfTUFYX1NZTUxJTktfU0laRSxyYXdsaW5rLCZsZW5ndGgpOworCisJbmNwX2lub2RlX2Nsb3NlKGlub2RlKTsKKwkvKiBDbG9zZSBmaWxlIGhhbmRsZSBpZiBubyBvdGhlciB1c2Vycy4uLiAqLworCW5jcF9tYWtlX2Nsb3NlZChpbm9kZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWxFSU87CisKKwlpZiAoTkNQX0ZJTkZPKGlub2RlKS0+ZmxhZ3MgJiBOQ1BJX0tMVURHRV9TWU1MSU5LKSB7CisJCWlmIChsZW5ndGg8TkNQX01JTl9TWU1MSU5LX1NJWkUgfHwgCisJCSAgICAoKF9fbGUzMiAqKXJhd2xpbmspWzBdIT1OQ1BfU1lNTElOS19NQUdJQzAgfHwKKwkJICAgICgoX19sZTMyICopcmF3bGluaylbMV0hPU5DUF9TWU1MSU5LX01BR0lDMSkKKwkJICAgIAlnb3RvIGZhaWxFSU87CisJCWxpbmsgPSByYXdsaW5rICsgODsKKwkJbGVuZ3RoIC09IDg7CisJfSBlbHNlIHsKKwkJbGluayA9IHJhd2xpbms7CisJfQorCisJbGVuID0gTkNQX01BWF9TWU1MSU5LX1NJWkU7CisJZXJyb3IgPSBuY3Bfdm9sMmlvKE5DUF9TRVJWRVIoaW5vZGUpLCBidWYsICZsZW4sIGxpbmssIGxlbmd0aCwgMCk7CisJa2ZyZWUocmF3bGluayk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWw7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKKworZmFpbEVJTzoKKwllcnJvciA9IC1FSU87CisJa2ZyZWUocmF3bGluayk7CitmYWlsOgorCVNldFBhZ2VFcnJvcihwYWdlKTsKKwlrdW5tYXAocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogc3ltbGlua3MgY2FuJ3QgZG8gbXVjaC4uLgorICovCitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIG5jcF9zeW1saW5rX2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gbmNwX3N5bWxpbmtfcmVhZHBhZ2UsCit9OworCQorLyogLS0tLS0gY3JlYXRlIGEgbmV3IHN5bWJvbGljIGxpbmsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAKK2ludCBuY3Bfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpzeW1uYW1lKSB7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwljaGFyICpyYXdsaW5rOworCWludCBsZW5ndGgsIGVyciwgaSwgb3V0bGVuOworCWludCBrbHVkZ2U7CisJaW50IG1vZGU7CisJX19sZTMyIGF0dHI7CisJdW5zaWduZWQgaW50IGhkcjsKKworCURQUklOVEsoIm5jcF9zeW1saW5rKGRpcj0lcCxkZW50cnk9JXAsc3ltbmFtZT0lcylcbiIsZGlyLGRlbnRyeSxzeW1uYW1lKTsKKworCWlmIChuY3BfaXNfbmZzX2V4dHJhcyhOQ1BfU0VSVkVSKGRpciksIE5DUF9GSU5GTyhkaXIpLT52b2xOdW1iZXIpKQorCQlrbHVkZ2UgPSAwOworCWVsc2UKKyNpZmRlZiBDT05GSUdfTkNQRlNfRVhUUkFTCisJaWYgKE5DUF9TRVJWRVIoZGlyKS0+bS5mbGFncyAmIE5DUF9NT1VOVF9TWU1MSU5LUykKKwkJa2x1ZGdlID0gMTsKKwllbHNlCisjZW5kaWYKKwkvKiBFUEVSTSBpcyByZXR1cm5lZCBieSBWRlMgaWYgc3ltbGluayBwcm9jZWR1cmUgZG9lcyBub3QgZXhpc3QgKi8KKwkJcmV0dXJuIC1FUEVSTTsKKyAgCisJcmF3bGluaz0oY2hhciAqKWttYWxsb2MoTkNQX01BWF9TWU1MSU5LX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghcmF3bGluaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoa2x1ZGdlKSB7CisJCW1vZGUgPSAwOworCQlhdHRyID0gYVNIQVJFRCB8IGFISURERU47CisJCSgoX19sZTMyICopcmF3bGluaylbMF09TkNQX1NZTUxJTktfTUFHSUMwOworCQkoKF9fbGUzMiAqKXJhd2xpbmspWzFdPU5DUF9TWU1MSU5LX01BR0lDMTsKKwkJaGRyID0gODsKKwl9IGVsc2UgeworCQltb2RlID0gU19JRkxOSyB8IFNfSVJXWFVHTzsKKwkJYXR0ciA9IDA7CisJCWhkciA9IDA7CisJfQkJCQorCisJbGVuZ3RoID0gc3RybGVuKHN5bW5hbWUpOworCS8qIG1hcCB0by9mcm9tIHNlcnZlciBjaGFyc2V0LCBkbyBub3QgdG91Y2ggdXBwZXIvbG93ZXIgY2FzZSBhcworCSAgIHN5bWxpbmsgY2FuIHBvaW50IG91dCBvZiBuY3AgZmlsZXN5c3RlbSAqLworCW91dGxlbiA9IE5DUF9NQVhfU1lNTElOS19TSVpFIC0gaGRyOworCWVyciA9IG5jcF9pbzJ2b2woTkNQX1NFUlZFUihkaXIpLCByYXdsaW5rICsgaGRyLCAmb3V0bGVuLCBzeW1uYW1lLCBsZW5ndGgsIDApOworCWlmIChlcnIpCisJCWdvdG8gZmFpbGZyZWU7CisKKwlvdXRsZW4gKz0gaGRyOworCisJZXJyID0gLUVJTzsKKwlpZiAobmNwX2NyZWF0ZV9uZXcoZGlyLGRlbnRyeSxtb2RlLDAsYXR0cikpIHsKKwkJZ290byBmYWlsZnJlZTsKKwl9CisKKwlpbm9kZT1kZW50cnktPmRfaW5vZGU7CisKKwlpZiAobmNwX21ha2Vfb3Blbihpbm9kZSwgT19XUk9OTFkpKQorCQlnb3RvIGZhaWxmcmVlOworCisJaWYgKG5jcF93cml0ZV9rZXJuZWwoTkNQX1NFUlZFUihpbm9kZSksIE5DUF9GSU5GTyhpbm9kZSktPmZpbGVfaGFuZGxlLCAKKwkJCSAgICAgMCwgb3V0bGVuLCByYXdsaW5rLCAmaSkgfHwgaSE9b3V0bGVuKSB7CisJCWdvdG8gZmFpbDsKKwl9CisKKwluY3BfaW5vZGVfY2xvc2UoaW5vZGUpOworCW5jcF9tYWtlX2Nsb3NlZChpbm9kZSk7CisJa2ZyZWUocmF3bGluayk7CisJcmV0dXJuIDA7CitmYWlsOjsKKwluY3BfaW5vZGVfY2xvc2UoaW5vZGUpOworCW5jcF9tYWtlX2Nsb3NlZChpbm9kZSk7CitmYWlsZnJlZTo7CisJa2ZyZWUocmF3bGluayk7CisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLS0gRU9GIC0tLS0tICovCmRpZmYgLS1naXQgYS9mcy9uZnMvTWFrZWZpbGUgYi9mcy9uZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiYWEwMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggbmZzIGZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19ORlNfRlMpICs9IG5mcy5vCisKK25mcy15IAkJCTo9IGRpci5vIGZpbGUubyBpbm9kZS5vIG5mczJ4ZHIubyBwYWdlbGlzdC5vIFwKKwkJCSAgIHByb2MubyByZWFkLm8gc3ltbGluay5vIHVubGluay5vIHdyaXRlLm8KK25mcy0kKENPTkZJR19ST09UX05GUykJKz0gbmZzcm9vdC5vIG1vdW50X2NsbnQubyAgICAgIAorbmZzLSQoQ09ORklHX05GU19WMykJKz0gbmZzM3Byb2MubyBuZnMzeGRyLm8KK25mcy0kKENPTkZJR19ORlNfVjQpCSs9IG5mczRwcm9jLm8gbmZzNHhkci5vIG5mczRzdGF0ZS5vIG5mczRyZW5ld2QubyBcCisJCQkgICBkZWxlZ2F0aW9uLm8gaWRtYXAubyBcCisJCQkgICBjYWxsYmFjay5vIGNhbGxiYWNrX3hkci5vIGNhbGxiYWNrX3Byb2MubworbmZzLSQoQ09ORklHX05GU19ESVJFQ1RJTykgKz0gZGlyZWN0Lm8KK25mcy1vYmpzCQk6PSAkKG5mcy15KQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NhbGxiYWNrLmMgYi9mcy9uZnMvY2FsbGJhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjBkNjE3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL2NhbGxiYWNrLmMKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBsaW51eC9mcy9uZnMvY2FsbGJhY2suYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBUcm9uZCBNeWtsZWJ1c3QKKyAqCisgKiBORlN2NCBjYWxsYmFjayBoYW5kbGluZworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3Zjc29jay5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisKKyNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZIE5GU0RCR19DQUxMQkFDSworCitzdHJ1Y3QgbmZzX2NhbGxiYWNrX2RhdGEgeworCXVuc2lnbmVkIGludCB1c2VyczsKKwlzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnY7CisJcGlkX3QgcGlkOworCXN0cnVjdCBjb21wbGV0aW9uIHN0YXJ0ZWQ7CisJc3RydWN0IGNvbXBsZXRpb24gc3RvcHBlZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmZzX2NhbGxiYWNrX2RhdGEgbmZzX2NhbGxiYWNrX2luZm87CitzdGF0aWMgREVDTEFSRV9NVVRFWChuZnNfY2FsbGJhY2tfc2VtYSk7CitzdGF0aWMgc3RydWN0IHN2Y19wcm9ncmFtIG5mczRfY2FsbGJhY2tfcHJvZ3JhbTsKKwordW5zaWduZWQgc2hvcnQgbmZzX2NhbGxiYWNrX3RjcHBvcnQ7CisKKy8qCisgKiBUaGlzIGlzIHRoZSBjYWxsYmFjayBrZXJuZWwgdGhyZWFkLgorICovCitzdGF0aWMgdm9pZCBuZnNfY2FsbGJhY2tfc3ZjKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCit7CisJc3RydWN0IHN2Y19zZXJ2ICpzZXJ2ID0gcnFzdHAtPnJxX3NlcnZlcjsKKwlpbnQgZXJyOworCisJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKwlsb2NrX2tlcm5lbCgpOworCisJbmZzX2NhbGxiYWNrX2luZm8ucGlkID0gY3VycmVudC0+cGlkOworCWRhZW1vbml6ZSgibmZzdjQtc3ZjIik7CisJLyogUHJvY2VzcyByZXF1ZXN0IHdpdGggc2lnbmFscyBibG9ja2VkLCBidXQgYWxsb3cgU0lHS0lMTC4gICovCisJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOworCisJY29tcGxldGUoJm5mc19jYWxsYmFja19pbmZvLnN0YXJ0ZWQpOworCisJd2hpbGUgKG5mc19jYWxsYmFja19pbmZvLnVzZXJzICE9IDAgfHwgIXNpZ25hbGxlZCgpKSB7CisJCS8qCisJCSAqIExpc3RlbiBmb3IgYSByZXF1ZXN0IG9uIHRoZSBzb2NrZXQKKwkJICovCisJCWVyciA9IHN2Y19yZWN2KHNlcnYsIHJxc3RwLCBNQVhfU0NIRURVTEVfVElNRU9VVCk7CisJCWlmIChlcnIgPT0gLUVBR0FJTiB8fCBlcnIgPT0gLUVJTlRSKQorCQkJY29udGludWU7CisJCWlmIChlcnIgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSIlczogdGVybWluYXRpbmcgb24gZXJyb3IgJWRcbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgLWVycik7CisJCQlicmVhazsKKwkJfQorCQlkcHJpbnRrKCIlczogcmVxdWVzdCBmcm9tICV1LiV1LiV1LiV1XG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJTklQUVVBRChycXN0cC0+cnFfYWRkci5zaW5fYWRkci5zX2FkZHIpKTsKKwkJc3ZjX3Byb2Nlc3Moc2VydiwgcnFzdHApOworCX0KKworCW5mc19jYWxsYmFja19pbmZvLnBpZCA9IDA7CisJY29tcGxldGUoJm5mc19jYWxsYmFja19pbmZvLnN0b3BwZWQpOworCXVubG9ja19rZXJuZWwoKTsKKwltb2R1bGVfcHV0X2FuZF9leGl0KDApOworfQorCisvKgorICogQnJpbmcgdXAgdGhlIHNlcnZlciBwcm9jZXNzIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHVwLgorICovCitpbnQgbmZzX2NhbGxiYWNrX3VwKHZvaWQpCit7CisJc3RydWN0IHN2Y19zZXJ2ICpzZXJ2OworCXN0cnVjdCBzdmNfc29jayAqc3ZzazsKKwlpbnQgcmV0ID0gMDsKKworCWxvY2tfa2VybmVsKCk7CisJZG93bigmbmZzX2NhbGxiYWNrX3NlbWEpOworCWlmIChuZnNfY2FsbGJhY2tfaW5mby51c2VycysrIHx8IG5mc19jYWxsYmFja19pbmZvLnBpZCAhPSAwKQorCQlnb3RvIG91dDsKKwlpbml0X2NvbXBsZXRpb24oJm5mc19jYWxsYmFja19pbmZvLnN0YXJ0ZWQpOworCWluaXRfY29tcGxldGlvbigmbmZzX2NhbGxiYWNrX2luZm8uc3RvcHBlZCk7CisJc2VydiA9IHN2Y19jcmVhdGUoJm5mczRfY2FsbGJhY2tfcHJvZ3JhbSwgTkZTNF9DQUxMQkFDS19CVUZTSVpFKTsKKwlyZXQgPSAtRU5PTUVNOworCWlmICghc2VydikKKwkJZ290byBvdXRfZXJyOworCS8qIEZJWE1FOiBXZSBkb24ndCB3YW50IHRvIHJlZ2lzdGVyIHRoaXMgc29ja2V0IHdpdGggdGhlIHBvcnRtYXBwZXIgKi8KKwlyZXQgPSBzdmNfbWFrZXNvY2soc2VydiwgSVBQUk9UT19UQ1AsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dF9kZXN0cm95OworCWlmICghbGlzdF9lbXB0eSgmc2Vydi0+c3ZfcGVybXNvY2tzKSkgeworCQlzdnNrID0gbGlzdF9lbnRyeShzZXJ2LT5zdl9wZXJtc29ja3MubmV4dCwKKwkJCQlzdHJ1Y3Qgc3ZjX3NvY2ssIHNrX2xpc3QpOworCQluZnNfY2FsbGJhY2tfdGNwcG9ydCA9IG50b2hzKGluZXRfc2soc3Zzay0+c2tfc2spLT5zcG9ydCk7CisJCWRwcmludGsgKCJDYWxsYmFjayBwb3J0ID0gMHgleFxuIiwgbmZzX2NhbGxiYWNrX3RjcHBvcnQpOworCX0gZWxzZQorCQlCVUcoKTsKKwlyZXQgPSBzdmNfY3JlYXRlX3RocmVhZChuZnNfY2FsbGJhY2tfc3ZjLCBzZXJ2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfZGVzdHJveTsKKwluZnNfY2FsbGJhY2tfaW5mby5zZXJ2ID0gc2VydjsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZuZnNfY2FsbGJhY2tfaW5mby5zdGFydGVkKTsKK291dDoKKwl1cCgmbmZzX2NhbGxiYWNrX3NlbWEpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0Oworb3V0X2Rlc3Ryb3k6CisJc3ZjX2Rlc3Ryb3koc2Vydik7CitvdXRfZXJyOgorCW5mc19jYWxsYmFja19pbmZvLnVzZXJzLS07CisJZ290byBvdXQ7Cit9CisKKy8qCisgKiBLaWxsIHRoZSBzZXJ2ZXIgcHJvY2VzcyBpZiBpdCBpcyBub3QgYWxyZWFkeSB1cC4KKyAqLworaW50IG5mc19jYWxsYmFja19kb3duKHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlsb2NrX2tlcm5lbCgpOworCWRvd24oJm5mc19jYWxsYmFja19zZW1hKTsKKwlpZiAoLS1uZnNfY2FsbGJhY2tfaW5mby51c2VycyB8fCBuZnNfY2FsbGJhY2tfaW5mby5waWQgPT0gMCkKKwkJZ290byBvdXQ7CisJa2lsbF9wcm9jKG5mc19jYWxsYmFja19pbmZvLnBpZCwgU0lHS0lMTCwgMSk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmbmZzX2NhbGxiYWNrX2luZm8uc3RvcHBlZCk7CitvdXQ6CisJdXAoJm5mc19jYWxsYmFja19zZW1hKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBuZnNfY2FsbGJhY2tfYXV0aGVudGljYXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCit7CisJc3RydWN0IGluX2FkZHIgKmFkZHIgPSAmcnFzdHAtPnJxX2FkZHIuc2luX2FkZHI7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHA7CisKKwkvKiBEb24ndCB0YWxrIHRvIHN0cmFuZ2VycyAqLworCWNscCA9IG5mczRfZmluZF9jbGllbnQoYWRkcik7CisJaWYgKGNscCA9PSBOVUxMKQorCQlyZXR1cm4gU1ZDX0RST1A7CisJZHByaW50aygiJXM6ICV1LiV1LiV1LiV1IE5GU3Y0IGNhbGxiYWNrIVxuIiwgX19GVU5DVElPTl9fLCBOSVBRVUFEKGFkZHIpKTsKKwluZnM0X3B1dF9jbGllbnQoY2xwKTsKKwlzd2l0Y2ggKHJxc3RwLT5ycV9hdXRob3AtPmZsYXZvdXIpIHsKKwkJY2FzZSBSUENfQVVUSF9OVUxMOgorCQkJaWYgKHJxc3RwLT5ycV9wcm9jICE9IENCX05VTEwpCisJCQkJcmV0dXJuIFNWQ19ERU5JRUQ7CisJCQlicmVhazsKKwkJY2FzZSBSUENfQVVUSF9VTklYOgorCQkJYnJlYWs7CisJCWNhc2UgUlBDX0FVVEhfR1NTOgorCQkJLyogRklYTUU6IFJQQ1NFQ19HU1MgaGFuZGxpbmc/ICovCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gU1ZDX0RFTklFRDsKKwl9CisJcmV0dXJuIFNWQ19PSzsKK30KKworLyoKKyAqIERlZmluZSBORlM0IGNhbGxiYWNrIHByb2dyYW0KKyAqLworZXh0ZXJuIHN0cnVjdCBzdmNfdmVyc2lvbiBuZnM0X2NhbGxiYWNrX3ZlcnNpb24xOworCitzdGF0aWMgc3RydWN0IHN2Y192ZXJzaW9uICpuZnM0X2NhbGxiYWNrX3ZlcnNpb25bXSA9IHsKKwlbMV0gPSAmbmZzNF9jYWxsYmFja192ZXJzaW9uMSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3ZjX3N0YXQgbmZzNF9jYWxsYmFja19zdGF0czsKKworc3RhdGljIHN0cnVjdCBzdmNfcHJvZ3JhbSBuZnM0X2NhbGxiYWNrX3Byb2dyYW0gPSB7CisJLnBnX3Byb2cgPSBORlM0X0NBTExCQUNLLAkJCS8qIFJQQyBzZXJ2aWNlIG51bWJlciAqLworCS5wZ19udmVycyA9IEFSUkFZX1NJWkUobmZzNF9jYWxsYmFja192ZXJzaW9uKSwJLyogTnVtYmVyIG9mIGVudHJpZXMgKi8KKwkucGdfdmVycyA9IG5mczRfY2FsbGJhY2tfdmVyc2lvbiwJCS8qIHZlcnNpb24gdGFibGUgKi8KKwkucGdfbmFtZSA9ICJORlN2NCBjYWxsYmFjayIsCQkJLyogc2VydmljZSBuYW1lICovCisJLnBnX2NsYXNzID0gIm5mcyIsCQkJCS8qIGF1dGhlbnRpY2F0aW9uIGNsYXNzICovCisJLnBnX3N0YXRzID0gJm5mczRfY2FsbGJhY2tfc3RhdHMsCisJLnBnX2F1dGhlbnRpY2F0ZSA9IG5mc19jYWxsYmFja19hdXRoZW50aWNhdGUsCit9OwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NhbGxiYWNrLmggYi9mcy9uZnMvY2FsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGRiMmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL2NhbGxiYWNrLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIGxpbnV4L2ZzL25mcy9jYWxsYmFjay5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFRyb25kIE15a2xlYnVzdAorICoKKyAqIE5GU3Y0IGNhbGxiYWNrIGRlZmluaXRpb25zCisgKi8KKyNpZm5kZWYgX19MSU5VWF9GU19ORlNfQ0FMTEJBQ0tfSAorI2RlZmluZSBfX0xJTlVYX0ZTX05GU19DQUxMQkFDS19ICisKKyNkZWZpbmUgTkZTNF9DQUxMQkFDSyAweDQwMDAwMDAwCisjZGVmaW5lIE5GUzRfQ0FMTEJBQ0tfWERSU0laRSAyMDQ4CisjZGVmaW5lIE5GUzRfQ0FMTEJBQ0tfQlVGU0laRSAoMTAyNCArIE5GUzRfQ0FMTEJBQ0tfWERSU0laRSkKKworZW51bSBuZnM0X2NhbGxiYWNrX3Byb2NudW0geworCUNCX05VTEwgPSAwLAorCUNCX0NPTVBPVU5EID0gMSwKK307CisKK2VudW0gbmZzNF9jYWxsYmFja19vcG51bSB7CisJT1BfQ0JfR0VUQVRUUiA9IDMsCisJT1BfQ0JfUkVDQUxMICA9IDQsCisJT1BfQ0JfSUxMRUdBTCA9IDEwMDQ0LAorfTsKKworc3RydWN0IGNiX2NvbXBvdW5kX2hkcl9hcmcgeworCWludCB0YWdsZW47CisJY29uc3QgY2hhciAqdGFnOworCXVuc2lnbmVkIGludCBjYWxsYmFja19pZGVudDsKKwl1bnNpZ25lZCBub3BzOworfTsKKworc3RydWN0IGNiX2NvbXBvdW5kX2hkcl9yZXMgeworCXVpbnQzMl90ICpzdGF0dXM7CisJaW50IHRhZ2xlbjsKKwljb25zdCBjaGFyICp0YWc7CisJdWludDMyX3QgKm5vcHM7Cit9OworCitzdHJ1Y3QgY2JfZ2V0YXR0cmFyZ3MgeworCXN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcjsKKwlzdHJ1Y3QgbmZzX2ZoIGZoOworCXVpbnQzMl90IGJpdG1hcFsyXTsKK307CisKK3N0cnVjdCBjYl9nZXRhdHRycmVzIHsKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgYml0bWFwWzJdOworCXVpbnQ2NF90IHNpemU7CisJdWludDY0X3QgY2hhbmdlX2F0dHI7CisJc3RydWN0IHRpbWVzcGVjIGN0aW1lOworCXN0cnVjdCB0aW1lc3BlYyBtdGltZTsKK307CisKK3N0cnVjdCBjYl9yZWNhbGxhcmdzIHsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHI7CisJc3RydWN0IG5mc19maCBmaDsKKwluZnM0X3N0YXRlaWQgc3RhdGVpZDsKKwl1aW50MzJfdCB0cnVuY2F0ZTsKK307CisKK2V4dGVybiB1bnNpZ25lZCBuZnM0X2NhbGxiYWNrX2dldGF0dHIoc3RydWN0IGNiX2dldGF0dHJhcmdzICphcmdzLCBzdHJ1Y3QgY2JfZ2V0YXR0cnJlcyAqcmVzKTsKK2V4dGVybiB1bnNpZ25lZCBuZnM0X2NhbGxiYWNrX3JlY2FsbChzdHJ1Y3QgY2JfcmVjYWxsYXJncyAqYXJncywgdm9pZCAqZHVtbXkpOworCitleHRlcm4gaW50IG5mc19jYWxsYmFja191cCh2b2lkKTsKK2V4dGVybiBpbnQgbmZzX2NhbGxiYWNrX2Rvd24odm9pZCk7CisKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBuZnNfY2FsbGJhY2tfdGNwcG9ydDsKKworI2VuZGlmIC8qIF9fTElOVVhfRlNfTkZTX0NBTExCQUNLX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL25mcy9jYWxsYmFja19wcm9jLmMgYi9mcy9uZnMvY2FsbGJhY2tfcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZTI3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvY2FsbGJhY2tfcHJvYy5jCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBsaW51eC9mcy9uZnMvY2FsbGJhY2tfcHJvYy5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFRyb25kIE15a2xlYnVzdAorICoKKyAqIE5GU3Y0IGNhbGxiYWNrIHByb2NlZHVyZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L25mczQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKyNpbmNsdWRlICJjYWxsYmFjay5oIgorI2luY2x1ZGUgImRlbGVnYXRpb24uaCIKKworI2RlZmluZSBORlNEQkdfRkFDSUxJVFkgTkZTREJHX0NBTExCQUNLCisgCit1bnNpZ25lZCBuZnM0X2NhbGxiYWNrX2dldGF0dHIoc3RydWN0IGNiX2dldGF0dHJhcmdzICphcmdzLCBzdHJ1Y3QgY2JfZ2V0YXR0cnJlcyAqcmVzKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwOworCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJCisJcmVzLT5iaXRtYXBbMF0gPSByZXMtPmJpdG1hcFsxXSA9IDA7CisJcmVzLT5zdGF0dXMgPSBodG9ubChORlM0RVJSX0JBREhBTkRMRSk7CisJY2xwID0gbmZzNF9maW5kX2NsaWVudCgmYXJncy0+YWRkci0+c2luX2FkZHIpOworCWlmIChjbHAgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJaW5vZGUgPSBuZnNfZGVsZWdhdGlvbl9maW5kX2lub2RlKGNscCwgJmFyZ3MtPmZoKTsKKwlpZiAoaW5vZGUgPT0gTlVMTCkKKwkJZ290byBvdXRfcHV0Y2xpZW50OworCW5mc2kgPSBORlNfSShpbm9kZSk7CisJZG93bl9yZWFkKCZuZnNpLT5yd3NlbSk7CisJZGVsZWdhdGlvbiA9IG5mc2ktPmRlbGVnYXRpb247CisJaWYgKGRlbGVnYXRpb24gPT0gTlVMTCB8fCAoZGVsZWdhdGlvbi0+dHlwZSAmIEZNT0RFX1dSSVRFKSA9PSAwKQorCQlnb3RvIG91dF9pcHV0OworCXJlcy0+c2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwlyZXMtPmNoYW5nZV9hdHRyID0gTkZTX0NIQU5HRV9BVFRSKGlub2RlKTsKKwlyZXMtPmN0aW1lID0gaW5vZGUtPmlfY3RpbWU7CisJcmVzLT5tdGltZSA9IGlub2RlLT5pX210aW1lOworCXJlcy0+Yml0bWFwWzBdID0gKEZBVFRSNF9XT1JEMF9DSEFOR0V8RkFUVFI0X1dPUkQwX1NJWkUpICYKKwkJYXJncy0+Yml0bWFwWzBdOworCXJlcy0+Yml0bWFwWzFdID0gKEZBVFRSNF9XT1JEMV9USU1FX01FVEFEQVRBfEZBVFRSNF9XT1JEMV9USU1FX01PRElGWSkgJgorCQlhcmdzLT5iaXRtYXBbMV07CisJcmVzLT5zdGF0dXMgPSAwOworb3V0X2lwdXQ6CisJdXBfcmVhZCgmbmZzaS0+cndzZW0pOworCWlwdXQoaW5vZGUpOworb3V0X3B1dGNsaWVudDoKKwluZnM0X3B1dF9jbGllbnQoY2xwKTsKK291dDoKKwlkcHJpbnRrKCIlczogZXhpdCB3aXRoIHN0YXR1cyA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIG50b2hsKHJlcy0+c3RhdHVzKSk7CisJcmV0dXJuIHJlcy0+c3RhdHVzOworfQorCit1bnNpZ25lZCBuZnM0X2NhbGxiYWNrX3JlY2FsbChzdHJ1Y3QgY2JfcmVjYWxsYXJncyAqYXJncywgdm9pZCAqZHVtbXkpCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHA7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwl1bnNpZ25lZCByZXM7CisJCisJcmVzID0gaHRvbmwoTkZTNEVSUl9CQURIQU5ETEUpOworCWNscCA9IG5mczRfZmluZF9jbGllbnQoJmFyZ3MtPmFkZHItPnNpbl9hZGRyKTsKKwlpZiAoY2xwID09IE5VTEwpCisJCWdvdG8gb3V0OworCWlub2RlID0gbmZzX2RlbGVnYXRpb25fZmluZF9pbm9kZShjbHAsICZhcmdzLT5maCk7CisJaWYgKGlub2RlID09IE5VTEwpCisJCWdvdG8gb3V0X3B1dGNsaWVudDsKKwkvKiBTZXQgdXAgYSBoZWxwZXIgdGhyZWFkIHRvIGFjdHVhbGx5IHJldHVybiB0aGUgZGVsZWdhdGlvbiAqLworCXN3aXRjaChuZnNfYXN5bmNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24oaW5vZGUsICZhcmdzLT5zdGF0ZWlkKSkgeworCQljYXNlIDA6CisJCQlyZXMgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgLUVOT0VOVDoKKwkJCXJlcyA9IGh0b25sKE5GUzRFUlJfQkFEX1NUQVRFSUQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXMgPSBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwl9CisJaXB1dChpbm9kZSk7CitvdXRfcHV0Y2xpZW50OgorCW5mczRfcHV0X2NsaWVudChjbHApOworb3V0OgorCWRwcmludGsoIiVzOiBleGl0IHdpdGggc3RhdHVzID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgbnRvaGwocmVzKSk7CisJcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL2ZzL25mcy9jYWxsYmFja194ZHIuYyBiL2ZzL25mcy9jYWxsYmFja194ZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjcxZGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL2NhbGxiYWNrX3hkci5jCkBAIC0wLDAgKzEsNDgxIEBACisvKgorICogbGludXgvZnMvbmZzL2NhbGxiYWNrX3hkci5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFRyb25kIE15a2xlYnVzdAorICoKKyAqIE5GU3Y0IGNhbGxiYWNrIGVuY29kZS9kZWNvZGUgcHJvY2VkdXJlcworICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgorI2luY2x1ZGUgPGxpbnV4L25mczQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKyNpbmNsdWRlICJjYWxsYmFjay5oIgorCisjZGVmaW5lIENCX09QX1RBR0xFTl9NQVhTWgkoNTEyKQorI2RlZmluZSBDQl9PUF9IRFJfUkVTX01BWFNaCSgyICsgQ0JfT1BfVEFHTEVOX01BWFNaKQorI2RlZmluZSBDQl9PUF9HRVRBVFRSX0JJVE1BUF9NQVhTWgkoNCkKKyNkZWZpbmUgQ0JfT1BfR0VUQVRUUl9SRVNfTUFYU1oJKENCX09QX0hEUl9SRVNfTUFYU1ogKyBcCisJCQkJQ0JfT1BfR0VUQVRUUl9CSVRNQVBfTUFYU1ogKyBcCisJCQkJMiArIDIgKyAzICsgMykKKyNkZWZpbmUgQ0JfT1BfUkVDQUxMX1JFU19NQVhTWgkoQ0JfT1BfSERSX1JFU19NQVhTWikKKworI2RlZmluZSBORlNEQkdfRkFDSUxJVFkgTkZTREJHX0NBTExCQUNLCisKK3R5cGVkZWYgdW5zaWduZWQgKCpjYWxsYmFja19wcm9jZXNzX29wX3QpKHZvaWQgKiwgdm9pZCAqKTsKK3R5cGVkZWYgdW5zaWduZWQgKCpjYWxsYmFja19kZWNvZGVfYXJnX3QpKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqLCB2b2lkICopOwordHlwZWRlZiB1bnNpZ25lZCAoKmNhbGxiYWNrX2VuY29kZV9yZXNfdCkoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCB4ZHJfc3RyZWFtICosIHZvaWQgKik7CisKKworc3RydWN0IGNhbGxiYWNrX29wIHsKKwljYWxsYmFja19wcm9jZXNzX29wX3QgcHJvY2Vzc19vcDsKKwljYWxsYmFja19kZWNvZGVfYXJnX3QgZGVjb2RlX2FyZ3M7CisJY2FsbGJhY2tfZW5jb2RlX3Jlc190IGVuY29kZV9yZXM7CisJbG9uZyByZXNfbWF4c2l6ZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2FsbGJhY2tfb3AgY2FsbGJhY2tfb3BzW107CisKK3N0YXRpYyBpbnQgbmZzNF9jYWxsYmFja19udWxsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHZvaWQgKmFyZ3AsIHZvaWQgKnJlc3ApCit7CisJcmV0dXJuIGh0b25sKE5GUzRfT0spOworfQorCitzdGF0aWMgaW50IG5mczRfZGVjb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHZvaWQgKmR1bW15KQoreworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9lbmNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgdm9pZCAqZHVtbXkpCit7CisJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworc3RhdGljIHVpbnQzMl90ICpyZWFkX2J1ZihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBpbnQgbmJ5dGVzKQoreworCXVpbnQzMl90ICpwOworCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgbmJ5dGVzKTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTdjQgY2FsbGJhY2sgcmVwbHkgYnVmZmVyIG92ZXJmbG93ZWQhXG4iKTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIHVuc2lnbmVkIGRlY29kZV9zdHJpbmcoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdW5zaWduZWQgaW50ICpsZW4sIGNvbnN0IGNoYXIgKipzdHIpCit7CisJdWludDMyX3QgKnA7CisKKwlwID0gcmVhZF9idWYoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJcmV0dXJuIGh0b25sKE5GUzRFUlJfUkVTT1VSQ0UpOworCSpsZW4gPSBudG9obCgqcCk7CisKKwlpZiAoKmxlbiAhPSAwKSB7CisJCXAgPSByZWFkX2J1Zih4ZHIsICpsZW4pOworCQlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJCXJldHVybiBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwkJKnN0ciA9IChjb25zdCBjaGFyICopcDsKKwl9IGVsc2UKKwkJKnN0ciA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGRlY29kZV9maChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2ZoICpmaCkKK3sKKwl1aW50MzJfdCAqcDsKKworCXAgPSByZWFkX2J1Zih4ZHIsIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlyZXR1cm4gaHRvbmwoTkZTNEVSUl9SRVNPVVJDRSk7CisJZmgtPnNpemUgPSBudG9obCgqcCk7CisJaWYgKGZoLT5zaXplID4gTkZTNF9GSFNJWkUpCisJCXJldHVybiBodG9ubChORlM0RVJSX0JBREhBTkRMRSk7CisJcCA9IHJlYWRfYnVmKHhkciwgZmgtPnNpemUpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlyZXR1cm4gaHRvbmwoTkZTNEVSUl9SRVNPVVJDRSk7CisJbWVtY3B5KCZmaC0+ZGF0YVswXSwgcCwgZmgtPnNpemUpOworCW1lbXNldCgmZmgtPmRhdGFbZmgtPnNpemVdLCAwLCBzaXplb2YoZmgtPmRhdGEpIC0gZmgtPnNpemUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgZGVjb2RlX2JpdG1hcChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwKQoreworCXVpbnQzMl90ICpwOworCXVuc2lnbmVkIGludCBhdHRybGVuOworCisJcCA9IHJlYWRfYnVmKHhkciwgNCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCXJldHVybiBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwlhdHRybGVuID0gbnRvaGwoKnApOworCXAgPSByZWFkX2J1Zih4ZHIsIGF0dHJsZW4gPDwgMik7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCXJldHVybiBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwlpZiAobGlrZWx5KGF0dHJsZW4gPiAwKSkKKwkJYml0bWFwWzBdID0gbnRvaGwoKnArKyk7CisJaWYgKGF0dHJsZW4gPiAxKQorCQliaXRtYXBbMV0gPSBudG9obCgqcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBkZWNvZGVfc3RhdGVpZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQpCit7CisJdWludDMyX3QgKnA7CisKKwlwID0gcmVhZF9idWYoeGRyLCAxNik7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCXJldHVybiBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwltZW1jcHkoc3RhdGVpZC0+ZGF0YSwgcCwgMTYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgZGVjb2RlX2NvbXBvdW5kX2hkcl9hcmcoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IGNiX2NvbXBvdW5kX2hkcl9hcmcgKmhkcikKK3sKKwl1aW50MzJfdCAqcDsKKwl1bnNpZ25lZCBpbnQgbWlub3JfdmVyc2lvbjsKKwl1bnNpZ25lZCBzdGF0dXM7CisKKwlzdGF0dXMgPSBkZWNvZGVfc3RyaW5nKHhkciwgJmhkci0+dGFnbGVuLCAmaGRyLT50YWcpOworCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpCisJCXJldHVybiBzdGF0dXM7CisJLyogV2UgZG8gbm90IGxpa2Ugb3Zlcmx5IGxvbmcgdGFncyEgKi8KKwlpZiAoaGRyLT50YWdsZW4gPiBDQl9PUF9UQUdMRU5fTUFYU1otMTIgfHwgaGRyLT50YWdsZW4gPCAwKSB7CisJCXByaW50aygiTkZTdjQgQ0FMTEJBQ0sgJXM6IGNsaWVudCBzZW50IHRhZyBvZiBsZW5ndGggJXVcbiIsCisJCQkJX19GVU5DVElPTl9fLCBoZHItPnRhZ2xlbik7CisJCXJldHVybiBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwl9CisJcCA9IHJlYWRfYnVmKHhkciwgMTIpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlyZXR1cm4gaHRvbmwoTkZTNEVSUl9SRVNPVVJDRSk7CisJbWlub3JfdmVyc2lvbiA9IG50b2hsKCpwKyspOworCS8qIENoZWNrIG1pbm9yIHZlcnNpb24gaXMgemVyby4gKi8KKwlpZiAobWlub3JfdmVyc2lvbiAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBORlN2NCBzZXJ2ZXIgY2FsbGJhY2sgd2l0aCBpbGxlZ2FsIG1pbm9yIHZlcnNpb24gJXUhXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgbWlub3JfdmVyc2lvbik7CisJCXJldHVybiBodG9ubChORlM0RVJSX01JTk9SX1ZFUlNfTUlTTUFUQ0gpOworCX0KKwloZHItPmNhbGxiYWNrX2lkZW50ID0gbnRvaGwoKnArKyk7CisJaGRyLT5ub3BzID0gbnRvaGwoKnApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgZGVjb2RlX29wX2hkcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1bnNpZ25lZCBpbnQgKm9wKQoreworCXVpbnQzMl90ICpwOworCXAgPSByZWFkX2J1Zih4ZHIsIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlyZXR1cm4gaHRvbmwoTkZTNEVSUl9SRVNPVVJDRSk7CisJKm9wID0gbnRvaGwoKnApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgZGVjb2RlX2dldGF0dHJfYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgY2JfZ2V0YXR0cmFyZ3MgKmFyZ3MpCit7CisJdW5zaWduZWQgc3RhdHVzOworCisJc3RhdHVzID0gZGVjb2RlX2ZoKHhkciwgJmFyZ3MtPmZoKTsKKwlpZiAodW5saWtlbHkoc3RhdHVzICE9IDApKQorCQlnb3RvIG91dDsKKwlhcmdzLT5hZGRyID0gJnJxc3RwLT5ycV9hZGRyOworCXN0YXR1cyA9IGRlY29kZV9iaXRtYXAoeGRyLCBhcmdzLT5iaXRtYXApOworb3V0OgorCWRwcmludGsoIiVzOiBleGl0IHdpdGggc3RhdHVzID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdW5zaWduZWQgZGVjb2RlX3JlY2FsbF9hcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBjYl9yZWNhbGxhcmdzICphcmdzKQoreworCXVpbnQzMl90ICpwOworCXVuc2lnbmVkIHN0YXR1czsKKworCWFyZ3MtPmFkZHIgPSAmcnFzdHAtPnJxX2FkZHI7CisJc3RhdHVzID0gZGVjb2RlX3N0YXRlaWQoeGRyLCAmYXJncy0+c3RhdGVpZCk7CisJaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwKSkKKwkJZ290byBvdXQ7CisJcCA9IHJlYWRfYnVmKHhkciwgNCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpIHsKKwkJc3RhdHVzID0gaHRvbmwoTkZTNEVSUl9SRVNPVVJDRSk7CisJCWdvdG8gb3V0OworCX0KKwlhcmdzLT50cnVuY2F0ZSA9IG50b2hsKCpwKTsKKwlzdGF0dXMgPSBkZWNvZGVfZmgoeGRyLCAmYXJncy0+ZmgpOworb3V0OgorCWRwcmludGsoIiVzOiBleGl0IHdpdGggc3RhdHVzID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGVuY29kZV9zdHJpbmcoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqc3RyKQoreworCXVpbnQzMl90ICpwOworCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCArIGxlbik7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCXJldHVybiBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwl4ZHJfZW5jb2RlX29wYXF1ZShwLCBzdHIsIGxlbik7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQ0JfU1VQUE9SVEVEX0FUVFIwIChGQVRUUjRfV09SRDBfQ0hBTkdFfEZBVFRSNF9XT1JEMF9TSVpFKQorI2RlZmluZSBDQl9TVVBQT1JURURfQVRUUjEgKEZBVFRSNF9XT1JEMV9USU1FX01FVEFEQVRBfEZBVFRSNF9XT1JEMV9USU1FX01PRElGWSkKK3N0YXRpYyB1bnNpZ25lZCBlbmNvZGVfYXR0cl9iaXRtYXAoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgdWludDMyX3QgKmJpdG1hcCwgdWludDMyX3QgKipzYXZlcCkKK3sKKwl1aW50MzJfdCBibVsyXTsKKwl1aW50MzJfdCAqcDsKKworCWJtWzBdID0gaHRvbmwoYml0bWFwWzBdICYgQ0JfU1VQUE9SVEVEX0FUVFIwKTsKKwlibVsxXSA9IGh0b25sKGJpdG1hcFsxXSAmIENCX1NVUFBPUlRFRF9BVFRSMSk7CisJaWYgKGJtWzFdICE9IDApIHsKKwkJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgMTYpOworCQlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJCXJldHVybiBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwkJKnArKyA9IGh0b25sKDIpOworCQkqcCsrID0gYm1bMF07CisJCSpwKysgPSBibVsxXTsKKwl9IGVsc2UgaWYgKGJtWzBdICE9IDApIHsKKwkJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgMTIpOworCQlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJCXJldHVybiBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwkJKnArKyA9IGh0b25sKDEpOworCQkqcCsrID0gYm1bMF07CisJfSBlbHNlIHsKKwkJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgOCk7CisJCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQkJcmV0dXJuIGh0b25sKE5GUzRFUlJfUkVTT1VSQ0UpOworCQkqcCsrID0gaHRvbmwoMCk7CisJfQorCSpzYXZlcCA9IHA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBlbmNvZGVfYXR0cl9jaGFuZ2Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgY2hhbmdlKQoreworCXVpbnQzMl90ICpwOworCisJaWYgKCEoYml0bWFwWzBdICYgRkFUVFI0X1dPUkQwX0NIQU5HRSkpCisJCXJldHVybiAwOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDgpOworCWlmICh1bmxpa2VseShwID09IDApKQorCQlyZXR1cm4gaHRvbmwoTkZTNEVSUl9SRVNPVVJDRSk7CisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgY2hhbmdlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGVuY29kZV9hdHRyX3NpemUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3Qgc2l6ZSkKK3sKKwl1aW50MzJfdCAqcDsKKworCWlmICghKGJpdG1hcFswXSAmIEZBVFRSNF9XT1JEMF9TSVpFKSkKKwkJcmV0dXJuIDA7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgOCk7CisJaWYgKHVubGlrZWx5KHAgPT0gMCkpCisJCXJldHVybiBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwlwID0geGRyX2VuY29kZV9oeXBlcihwLCBzaXplKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGVuY29kZV9hdHRyX3RpbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lKQoreworCXVpbnQzMl90ICpwOworCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgMTIpOworCWlmICh1bmxpa2VseShwID09IDApKQorCQlyZXR1cm4gaHRvbmwoTkZTNEVSUl9SRVNPVVJDRSk7CisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgdGltZS0+dHZfc2VjKTsKKwkqcCA9IGh0b25sKHRpbWUtPnR2X25zZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgZW5jb2RlX2F0dHJfY3RpbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgdWludDMyX3QgKmJpdG1hcCwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lKQoreworCWlmICghKGJpdG1hcFsxXSAmIEZBVFRSNF9XT1JEMV9USU1FX01FVEFEQVRBKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGVuY29kZV9hdHRyX3RpbWUoeGRyLHRpbWUpOworfQorCitzdGF0aWMgdW5zaWduZWQgZW5jb2RlX2F0dHJfbXRpbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgdWludDMyX3QgKmJpdG1hcCwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lKQoreworCWlmICghKGJpdG1hcFsxXSAmIEZBVFRSNF9XT1JEMV9USU1FX01PRElGWSkpCisJCXJldHVybiAwOworCXJldHVybiBlbmNvZGVfYXR0cl90aW1lKHhkcix0aW1lKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGVuY29kZV9jb21wb3VuZF9oZHJfcmVzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBjYl9jb21wb3VuZF9oZHJfcmVzICpoZHIpCit7CisJdW5zaWduZWQgc3RhdHVzOworCisJaGRyLT5zdGF0dXMgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQpOworCWlmICh1bmxpa2VseShoZHItPnN0YXR1cyA9PSBOVUxMKSkKKwkJcmV0dXJuIGh0b25sKE5GUzRFUlJfUkVTT1VSQ0UpOworCXN0YXR1cyA9IGVuY29kZV9zdHJpbmcoeGRyLCBoZHItPnRhZ2xlbiwgaGRyLT50YWcpOworCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpCisJCXJldHVybiBzdGF0dXM7CisJaGRyLT5ub3BzID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkoaGRyLT5ub3BzID09IE5VTEwpKQorCQlyZXR1cm4gaHRvbmwoTkZTNEVSUl9SRVNPVVJDRSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBlbmNvZGVfb3BfaGRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90IG9wLCB1aW50MzJfdCByZXMpCit7CisJdWludDMyX3QgKnA7CisJCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgOCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCXJldHVybiBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwkqcCsrID0gaHRvbmwob3ApOworCSpwID0gcmVzOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgZW5jb2RlX2dldGF0dHJfcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBjYl9nZXRhdHRycmVzICpyZXMpCit7CisJdWludDMyX3QgKnNhdmVwOworCXVuc2lnbmVkIHN0YXR1cyA9IHJlcy0+c3RhdHVzOworCQorCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGVuY29kZV9hdHRyX2JpdG1hcCh4ZHIsIHJlcy0+Yml0bWFwLCAmc2F2ZXApOworCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGVuY29kZV9hdHRyX2NoYW5nZSh4ZHIsIHJlcy0+Yml0bWFwLCByZXMtPmNoYW5nZV9hdHRyKTsKKwlpZiAodW5saWtlbHkoc3RhdHVzICE9IDApKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBlbmNvZGVfYXR0cl9zaXplKHhkciwgcmVzLT5iaXRtYXAsIHJlcy0+c2l6ZSk7CisJaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwKSkKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZW5jb2RlX2F0dHJfY3RpbWUoeGRyLCByZXMtPmJpdG1hcCwgJnJlcy0+Y3RpbWUpOworCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGVuY29kZV9hdHRyX210aW1lKHhkciwgcmVzLT5iaXRtYXAsICZyZXMtPm10aW1lKTsKKwkqc2F2ZXAgPSBodG9ubCgodW5zaWduZWQgaW50KSgoY2hhciAqKXhkci0+cCAtIChjaGFyICopKHNhdmVwKzEpKSk7CitvdXQ6CisJZHByaW50aygiJXM6IGV4aXQgd2l0aCBzdGF0dXMgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBwcm9jZXNzX29wKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCisJCXN0cnVjdCB4ZHJfc3RyZWFtICp4ZHJfaW4sIHZvaWQgKmFyZ3AsCisJCXN0cnVjdCB4ZHJfc3RyZWFtICp4ZHJfb3V0LCB2b2lkICpyZXNwKQoreworCXN0cnVjdCBjYWxsYmFja19vcCAqb3A7CisJdW5zaWduZWQgaW50IG9wX25yOworCXVuc2lnbmVkIGludCBzdGF0dXMgPSAwOworCWxvbmcgbWF4bGVuOworCXVuc2lnbmVkIHJlczsKKworCWRwcmludGsoIiVzOiBzdGFydFxuIiwgX19GVU5DVElPTl9fKTsKKwlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkcl9pbiwgJm9wX25yKTsKKwlpZiAodW5saWtlbHkoc3RhdHVzICE9IDApKSB7CisJCW9wX25yID0gT1BfQ0JfSUxMRUdBTDsKKwkJb3AgPSAmY2FsbGJhY2tfb3BzWzBdOworCX0gZWxzZSBpZiAodW5saWtlbHkob3BfbnIgIT0gT1BfQ0JfR0VUQVRUUiAmJiBvcF9uciAhPSBPUF9DQl9SRUNBTEwpKSB7CisJCW9wX25yID0gT1BfQ0JfSUxMRUdBTDsKKwkJb3AgPSAmY2FsbGJhY2tfb3BzWzBdOworCQlzdGF0dXMgPSBodG9ubChORlM0RVJSX09QX0lMTEVHQUwpOworCX0gZWxzZQorCQlvcCA9ICZjYWxsYmFja19vcHNbb3BfbnJdOworCisJbWF4bGVuID0geGRyX291dC0+ZW5kIC0geGRyX291dC0+cDsKKwlpZiAobWF4bGVuID4gMCAmJiBtYXhsZW4gPCBQQUdFX1NJWkUpIHsKKwkJaWYgKGxpa2VseShzdGF0dXMgPT0gMCAmJiBvcC0+ZGVjb2RlX2FyZ3MgIT0gTlVMTCkpCisJCQlzdGF0dXMgPSBvcC0+ZGVjb2RlX2FyZ3MocnFzdHAsIHhkcl9pbiwgYXJncCk7CisJCWlmIChsaWtlbHkoc3RhdHVzID09IDAgJiYgb3AtPnByb2Nlc3Nfb3AgIT0gTlVMTCkpCisJCQlzdGF0dXMgPSBvcC0+cHJvY2Vzc19vcChhcmdwLCByZXNwKTsKKwl9IGVsc2UKKwkJc3RhdHVzID0gaHRvbmwoTkZTNEVSUl9SRVNPVVJDRSk7CisKKwlyZXMgPSBlbmNvZGVfb3BfaGRyKHhkcl9vdXQsIG9wX25yLCBzdGF0dXMpOworCWlmIChzdGF0dXMgPT0gMCkKKwkJc3RhdHVzID0gcmVzOworCWlmIChvcC0+ZW5jb2RlX3JlcyAhPSBOVUxMICYmIHN0YXR1cyA9PSAwKQorCQlzdGF0dXMgPSBvcC0+ZW5jb2RlX3JlcyhycXN0cCwgeGRyX291dCwgcmVzcCk7CisJZHByaW50aygiJXM6IGRvbmUsIHN0YXR1cyA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSwgcHJvY2VzcyBhbmQgZW5jb2RlIGEgQ09NUE9VTkQKKyAqLworc3RhdGljIGludCBuZnM0X2NhbGxiYWNrX2NvbXBvdW5kKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHZvaWQgKmFyZ3AsIHZvaWQgKnJlc3ApCit7CisJc3RydWN0IGNiX2NvbXBvdW5kX2hkcl9hcmcgaGRyX2FyZzsKKwlzdHJ1Y3QgY2JfY29tcG91bmRfaGRyX3JlcyBoZHJfcmVzOworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcl9pbiwgeGRyX291dDsKKwl1aW50MzJfdCAqcDsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBub3BzID0gMTsKKworCWRwcmludGsoIiVzOiBzdGFydFxuIiwgX19GVU5DVElPTl9fKTsKKworCXhkcl9pbml0X2RlY29kZSgmeGRyX2luLCAmcnFzdHAtPnJxX2FyZywgcnFzdHAtPnJxX2FyZy5oZWFkWzBdLmlvdl9iYXNlKTsKKworCXAgPSAodWludDMyX3QqKSgoY2hhciAqKXJxc3RwLT5ycV9yZXMuaGVhZFswXS5pb3ZfYmFzZSArIHJxc3RwLT5ycV9yZXMuaGVhZFswXS5pb3ZfbGVuKTsKKwlycXN0cC0+cnFfcmVzLmhlYWRbMF0uaW92X2xlbiA9IFBBR0VfU0laRTsKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkcl9vdXQsICZycXN0cC0+cnFfcmVzLCBwKTsKKworCWRlY29kZV9jb21wb3VuZF9oZHJfYXJnKCZ4ZHJfaW4sICZoZHJfYXJnKTsKKwloZHJfcmVzLnRhZ2xlbiA9IGhkcl9hcmcudGFnbGVuOworCWhkcl9yZXMudGFnID0gaGRyX2FyZy50YWc7CisJZW5jb2RlX2NvbXBvdW5kX2hkcl9yZXMoJnhkcl9vdXQsICZoZHJfcmVzKTsKKworCWZvciAoOzspIHsKKwkJc3RhdHVzID0gcHJvY2Vzc19vcChycXN0cCwgJnhkcl9pbiwgYXJncCwgJnhkcl9vdXQsIHJlc3ApOworCQlpZiAoc3RhdHVzICE9IDApCisJCQlicmVhazsKKwkJaWYgKG5vcHMgPT0gaGRyX2FyZy5ub3BzKQorCQkJYnJlYWs7CisJCW5vcHMrKzsKKwl9CisJKmhkcl9yZXMuc3RhdHVzID0gc3RhdHVzOworCSpoZHJfcmVzLm5vcHMgPSBodG9ubChub3BzKTsKKwlkcHJpbnRrKCIlczogZG9uZSwgc3RhdHVzID0gJXVcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlyZXR1cm4gcnBjX3N1Y2Nlc3M7Cit9CisKKy8qCisgKiBEZWZpbmUgTkZTNCBjYWxsYmFjayBDT01QT1VORCBvcHMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2FsbGJhY2tfb3AgY2FsbGJhY2tfb3BzW10gPSB7CisJWzBdID0geworCQkucmVzX21heHNpemUgPSBDQl9PUF9IRFJfUkVTX01BWFNaLAorCX0sCisJW09QX0NCX0dFVEFUVFJdID0geworCQkucHJvY2Vzc19vcCA9IChjYWxsYmFja19wcm9jZXNzX29wX3QpbmZzNF9jYWxsYmFja19nZXRhdHRyLAorCQkuZGVjb2RlX2FyZ3MgPSAoY2FsbGJhY2tfZGVjb2RlX2FyZ190KWRlY29kZV9nZXRhdHRyX2FyZ3MsCisJCS5lbmNvZGVfcmVzID0gKGNhbGxiYWNrX2VuY29kZV9yZXNfdCllbmNvZGVfZ2V0YXR0cl9yZXMsCisJCS5yZXNfbWF4c2l6ZSA9IENCX09QX0dFVEFUVFJfUkVTX01BWFNaLAorCX0sCisJW09QX0NCX1JFQ0FMTF0gPSB7CisJCS5wcm9jZXNzX29wID0gKGNhbGxiYWNrX3Byb2Nlc3Nfb3BfdCluZnM0X2NhbGxiYWNrX3JlY2FsbCwKKwkJLmRlY29kZV9hcmdzID0gKGNhbGxiYWNrX2RlY29kZV9hcmdfdClkZWNvZGVfcmVjYWxsX2FyZ3MsCisJCS5yZXNfbWF4c2l6ZSA9IENCX09QX1JFQ0FMTF9SRVNfTUFYU1osCisJfQorfTsKKworLyoKKyAqIERlZmluZSBORlM0IGNhbGxiYWNrIHByb2NlZHVyZXMKKyAqLworc3RhdGljIHN0cnVjdCBzdmNfcHJvY2VkdXJlIG5mczRfY2FsbGJhY2tfcHJvY2VkdXJlczFbXSA9IHsKKwlbQ0JfTlVMTF0gPSB7CisJCS5wY19mdW5jID0gbmZzNF9jYWxsYmFja19udWxsLAorCQkucGNfZGVjb2RlID0gKGt4ZHJwcm9jX3QpbmZzNF9kZWNvZGVfdm9pZCwKKwkJLnBjX2VuY29kZSA9IChreGRycHJvY190KW5mczRfZW5jb2RlX3ZvaWQsCisJCS5wY194ZHJyZXNzaXplID0gMSwKKwl9LAorCVtDQl9DT01QT1VORF0gPSB7CisJCS5wY19mdW5jID0gbmZzNF9jYWxsYmFja19jb21wb3VuZCwKKwkJLnBjX2VuY29kZSA9IChreGRycHJvY190KW5mczRfZW5jb2RlX3ZvaWQsCisJCS5wY19hcmdzaXplID0gMjU2LAorCQkucGNfcmVzc2l6ZSA9IDI1NiwKKwkJLnBjX3hkcnJlc3NpemUgPSBORlM0X0NBTExCQUNLX0JVRlNJWkUsCisJfQorfTsKKworc3RydWN0IHN2Y192ZXJzaW9uIG5mczRfY2FsbGJhY2tfdmVyc2lvbjEgPSB7CisJLnZzX3ZlcnMgPSAxLAorCS52c19ucHJvYyA9IEFSUkFZX1NJWkUobmZzNF9jYWxsYmFja19wcm9jZWR1cmVzMSksCisJLnZzX3Byb2MgPSBuZnM0X2NhbGxiYWNrX3Byb2NlZHVyZXMxLAorCS52c194ZHJzaXplID0gTkZTNF9DQUxMQkFDS19YRFJTSVpFLAorCS52c19kaXNwYXRjaCA9IE5VTEwsCit9OworCmRpZmYgLS1naXQgYS9mcy9uZnMvZGVsZWdhdGlvbi5jIGIvZnMvbmZzL2RlbGVnYXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjljNjBmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL2RlbGVnYXRpb24uYwpAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIGxpbnV4L2ZzL25mcy9kZWxlZ2F0aW9uLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVHJvbmQgTXlrbGVidXN0CisgKgorICogTkZTIGZpbGUgZGVsZWdhdGlvbiBtYW5hZ2VtZW50CisgKgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGxpbnV4L25mczQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfeGRyLmg+CisKKyNpbmNsdWRlICJkZWxlZ2F0aW9uLmgiCisKK3N0YXRpYyBzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKm5mc19hbGxvY19kZWxlZ2F0aW9uKHZvaWQpCit7CisJcmV0dXJuIChzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmZzX2RlbGVnYXRpb24pLCBHRlBfS0VSTkVMKTsKK30KKworc3RhdGljIHZvaWQgbmZzX2ZyZWVfZGVsZWdhdGlvbihzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24pCit7CisJaWYgKGRlbGVnYXRpb24tPmNyZWQpCisJCXB1dF9ycGNjcmVkKGRlbGVnYXRpb24tPmNyZWQpOworCWtmcmVlKGRlbGVnYXRpb24pOworfQorCitzdGF0aWMgdm9pZCBuZnNfZGVsZWdhdGlvbl9jbGFpbV9vcGVucyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eDsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGU7CisKK2FnYWluOgorCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdHgsICZuZnNpLT5vcGVuX2ZpbGVzLCBsaXN0KSB7CisJCXN0YXRlID0gY3R4LT5zdGF0ZTsKKwkJaWYgKHN0YXRlID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJaWYgKCF0ZXN0X2JpdChORlNfREVMRUdBVEVEX1NUQVRFLCAmc3RhdGUtPmZsYWdzKSkKKwkJCWNvbnRpbnVlOworCQlnZXRfbmZzX29wZW5fY29udGV4dChjdHgpOworCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCWlmIChuZnM0X29wZW5fZGVsZWdhdGlvbl9yZWNhbGwoY3R4LT5kZW50cnksIHN0YXRlKSA8IDApCisJCQlyZXR1cm47CisJCXB1dF9uZnNfb3Blbl9jb250ZXh0KGN0eCk7CisJCWdvdG8gYWdhaW47CisJfQorCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKK30KKworLyoKKyAqIFNldCB1cCBhIGRlbGVnYXRpb24gb24gYW4gaW5vZGUKKyAqLwordm9pZCBuZnNfaW5vZGVfcmVjbGFpbV9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwgc3RydWN0IG5mc19vcGVucmVzICpyZXMpCit7CisJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uID0gTkZTX0koaW5vZGUpLT5kZWxlZ2F0aW9uOworCisJaWYgKGRlbGVnYXRpb24gPT0gTlVMTCkKKwkJcmV0dXJuOworCW1lbWNweShkZWxlZ2F0aW9uLT5zdGF0ZWlkLmRhdGEsIHJlcy0+ZGVsZWdhdGlvbi5kYXRhLAorCQkJc2l6ZW9mKGRlbGVnYXRpb24tPnN0YXRlaWQuZGF0YSkpOworCWRlbGVnYXRpb24tPnR5cGUgPSByZXMtPmRlbGVnYXRpb25fdHlwZTsKKwlkZWxlZ2F0aW9uLT5tYXhzaXplID0gcmVzLT5tYXhzaXplOworCXB1dF9ycGNjcmVkKGNyZWQpOworCWRlbGVnYXRpb24tPmNyZWQgPSBnZXRfcnBjY3JlZChjcmVkKTsKKwlkZWxlZ2F0aW9uLT5mbGFncyAmPSB+TkZTX0RFTEVHQVRJT05fTkVFRF9SRUNMQUlNOworCU5GU19JKGlub2RlKS0+ZGVsZWdhdGlvbl9zdGF0ZSA9IGRlbGVnYXRpb24tPnR5cGU7CisJc21wX3dtYigpOworfQorCisvKgorICogU2V0IHVwIGEgZGVsZWdhdGlvbiBvbiBhbiBpbm9kZQorICovCitpbnQgbmZzX2lub2RlX3NldF9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwgc3RydWN0IG5mc19vcGVucmVzICpyZXMpCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBORlNfU0VSVkVSKGlub2RlKS0+bmZzNF9zdGF0ZTsKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKKwlpbnQgc3RhdHVzID0gMDsKKworCWRlbGVnYXRpb24gPSBuZnNfYWxsb2NfZGVsZWdhdGlvbigpOworCWlmIChkZWxlZ2F0aW9uID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweShkZWxlZ2F0aW9uLT5zdGF0ZWlkLmRhdGEsIHJlcy0+ZGVsZWdhdGlvbi5kYXRhLAorCQkJc2l6ZW9mKGRlbGVnYXRpb24tPnN0YXRlaWQuZGF0YSkpOworCWRlbGVnYXRpb24tPnR5cGUgPSByZXMtPmRlbGVnYXRpb25fdHlwZTsKKwlkZWxlZ2F0aW9uLT5tYXhzaXplID0gcmVzLT5tYXhzaXplOworCWRlbGVnYXRpb24tPmNyZWQgPSBnZXRfcnBjY3JlZChjcmVkKTsKKwlkZWxlZ2F0aW9uLT5pbm9kZSA9IGlub2RlOworCisJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCWlmIChuZnNpLT5kZWxlZ2F0aW9uID09IE5VTEwpIHsKKwkJbGlzdF9hZGQoJmRlbGVnYXRpb24tPnN1cGVyX2xpc3QsICZjbHAtPmNsX2RlbGVnYXRpb25zKTsKKwkJbmZzaS0+ZGVsZWdhdGlvbiA9IGRlbGVnYXRpb247CisJCW5mc2ktPmRlbGVnYXRpb25fc3RhdGUgPSBkZWxlZ2F0aW9uLT50eXBlOworCQlkZWxlZ2F0aW9uID0gTlVMTDsKKwl9IGVsc2UgeworCQlpZiAobWVtY21wKCZkZWxlZ2F0aW9uLT5zdGF0ZWlkLCAmbmZzaS0+ZGVsZWdhdGlvbi0+c3RhdGVpZCwKKwkJCQkJc2l6ZW9mKGRlbGVnYXRpb24tPnN0YXRlaWQpKSAhPSAwIHx8CisJCQkJZGVsZWdhdGlvbi0+dHlwZSAhPSBuZnNpLT5kZWxlZ2F0aW9uLT50eXBlKSB7CisJCQlwcmludGsoIiVzOiBzZXJ2ZXIgJXUuJXUuJXUuJXUsIGhhbmRlZCBvdXQgYSBkdXBsaWNhdGUgZGVsZWdhdGlvbiFcbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgTklQUVVBRChjbHAtPmNsX2FkZHIpKTsKKwkJCXN0YXR1cyA9IC1FSU87CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJaWYgKGRlbGVnYXRpb24gIT0gTlVMTCkKKwkJa2ZyZWUoZGVsZWdhdGlvbik7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBuZnNfZG9fcmV0dXJuX2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uKQoreworCWludCByZXMgPSAwOworCisJX19uZnNfcmV2YWxpZGF0ZV9pbm9kZShORlNfU0VSVkVSKGlub2RlKSwgaW5vZGUpOworCisJcmVzID0gbmZzNF9wcm9jX2RlbGVncmV0dXJuKGlub2RlLCBkZWxlZ2F0aW9uLT5jcmVkLCAmZGVsZWdhdGlvbi0+c3RhdGVpZCk7CisJbmZzX2ZyZWVfZGVsZWdhdGlvbihkZWxlZ2F0aW9uKTsKKwlyZXR1cm4gcmVzOworfQorCisvKiBTeW5jIGFsbCBkYXRhIHRvIGRpc2sgdXBvbiBkZWxlZ2F0aW9uIHJldHVybiAqLworc3RhdGljIHZvaWQgbmZzX21zeW5jX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJZmlsZW1hcF9mZGF0YXdyaXRlKGlub2RlLT5pX21hcHBpbmcpOworCW5mc193Yl9hbGwoaW5vZGUpOworCWZpbGVtYXBfZmRhdGF3YWl0KGlub2RlLT5pX21hcHBpbmcpOworfQorCisvKgorICogQmFzaWMgcHJvY2VkdXJlIGZvciByZXR1cm5pbmcgYSBkZWxlZ2F0aW9uIHRvIHRoZSBzZXJ2ZXIKKyAqLworaW50IG5mc19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gTkZTX1NFUlZFUihpbm9kZSktPm5mczRfc3RhdGU7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKwlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CisJaW50IHJlcyA9IDA7CisKKwluZnNfbXN5bmNfaW5vZGUoaW5vZGUpOworCWRvd25fcmVhZCgmY2xwLT5jbF9zZW0pOworCS8qIEd1YXJkIGFnYWluc3QgbmV3IGRlbGVnYXRlZCBvcGVuIGNhbGxzICovCisJZG93bl93cml0ZSgmbmZzaS0+cndzZW0pOworCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwlkZWxlZ2F0aW9uID0gbmZzaS0+ZGVsZWdhdGlvbjsKKwlpZiAoZGVsZWdhdGlvbiAhPSBOVUxMKSB7CisJCWxpc3RfZGVsX2luaXQoJmRlbGVnYXRpb24tPnN1cGVyX2xpc3QpOworCQluZnNpLT5kZWxlZ2F0aW9uID0gTlVMTDsKKwkJbmZzaS0+ZGVsZWdhdGlvbl9zdGF0ZSA9IDA7CisJfQorCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCW5mc19kZWxlZ2F0aW9uX2NsYWltX29wZW5zKGlub2RlKTsKKwl1cF93cml0ZSgmbmZzaS0+cndzZW0pOworCXVwX3JlYWQoJmNscC0+Y2xfc2VtKTsKKwluZnNfbXN5bmNfaW5vZGUoaW5vZGUpOworCisJaWYgKGRlbGVnYXRpb24gIT0gTlVMTCkKKwkJcmVzID0gbmZzX2RvX3JldHVybl9kZWxlZ2F0aW9uKGlub2RlLCBkZWxlZ2F0aW9uKTsKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogUmV0dXJuIGFsbCBkZWxlZ2F0aW9ucyBhc3NvY2lhdGVkIHRvIGEgc3VwZXIgYmxvY2sKKyAqLwordm9pZCBuZnNfcmV0dXJuX2FsbF9kZWxlZ2F0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gTkZTX1NCKHNiKS0+bmZzNF9zdGF0ZTsKKwlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCWlmIChjbHAgPT0gTlVMTCkKKwkJcmV0dXJuOworcmVzdGFydDoKKwlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZWxlZ2F0aW9uLCAmY2xwLT5jbF9kZWxlZ2F0aW9ucywgc3VwZXJfbGlzdCkgeworCQlpZiAoZGVsZWdhdGlvbi0+aW5vZGUtPmlfc2IgIT0gc2IpCisJCQljb250aW51ZTsKKwkJaW5vZGUgPSBpZ3JhYihkZWxlZ2F0aW9uLT5pbm9kZSk7CisJCWlmIChpbm9kZSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCQluZnNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24oaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwkJZ290byByZXN0YXJ0OworCX0KKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKK30KKworLyoKKyAqIFJldHVybiBhbGwgZGVsZWdhdGlvbnMgZm9sbG93aW5nIGFuIE5GUzRFUlJfQ0JfUEFUSF9ET1dOIGVycm9yLgorICovCit2b2lkIG5mc19oYW5kbGVfY2JfcGF0aGRvd24oc3RydWN0IG5mczRfY2xpZW50ICpjbHApCit7CisJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlpZiAoY2xwID09IE5VTEwpCisJCXJldHVybjsKK3Jlc3RhcnQ6CisJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVsZWdhdGlvbiwgJmNscC0+Y2xfZGVsZWdhdGlvbnMsIHN1cGVyX2xpc3QpIHsKKwkJaW5vZGUgPSBpZ3JhYihkZWxlZ2F0aW9uLT5pbm9kZSk7CisJCWlmIChpbm9kZSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCQluZnNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24oaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwkJZ290byByZXN0YXJ0OworCX0KKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKK30KKworc3RydWN0IHJlY2FsbF90aHJlYWRhcmdzIHsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwOworCWNvbnN0IG5mczRfc3RhdGVpZCAqc3RhdGVpZDsKKworCXN0cnVjdCBjb21wbGV0aW9uIHN0YXJ0ZWQ7CisJaW50IHJlc3VsdDsKK307CisKK3N0YXRpYyBpbnQgcmVjYWxsX3RocmVhZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCByZWNhbGxfdGhyZWFkYXJncyAqYXJncyA9IChzdHJ1Y3QgcmVjYWxsX3RocmVhZGFyZ3MgKilkYXRhOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBpZ3JhYihhcmdzLT5pbm9kZSk7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBORlNfU0VSVkVSKGlub2RlKS0+bmZzNF9zdGF0ZTsKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKKworCWRhZW1vbml6ZSgibmZzdjQtZGVsZWdyZXR1cm4iKTsKKworCW5mc19tc3luY19pbm9kZShpbm9kZSk7CisJZG93bl9yZWFkKCZjbHAtPmNsX3NlbSk7CisJZG93bl93cml0ZSgmbmZzaS0+cndzZW0pOworCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwlkZWxlZ2F0aW9uID0gbmZzaS0+ZGVsZWdhdGlvbjsKKwlpZiAoZGVsZWdhdGlvbiAhPSBOVUxMICYmIG1lbWNtcChkZWxlZ2F0aW9uLT5zdGF0ZWlkLmRhdGEsCisJCQkJYXJncy0+c3RhdGVpZC0+ZGF0YSwKKwkJCQlzaXplb2YoZGVsZWdhdGlvbi0+c3RhdGVpZC5kYXRhKSkgPT0gMCkgeworCQlsaXN0X2RlbF9pbml0KCZkZWxlZ2F0aW9uLT5zdXBlcl9saXN0KTsKKwkJbmZzaS0+ZGVsZWdhdGlvbiA9IE5VTEw7CisJCW5mc2ktPmRlbGVnYXRpb25fc3RhdGUgPSAwOworCQlhcmdzLT5yZXN1bHQgPSAwOworCX0gZWxzZSB7CisJCWRlbGVnYXRpb24gPSBOVUxMOworCQlhcmdzLT5yZXN1bHQgPSAtRU5PRU5UOworCX0KKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKKwljb21wbGV0ZSgmYXJncy0+c3RhcnRlZCk7CisJbmZzX2RlbGVnYXRpb25fY2xhaW1fb3BlbnMoaW5vZGUpOworCXVwX3dyaXRlKCZuZnNpLT5yd3NlbSk7CisJdXBfcmVhZCgmY2xwLT5jbF9zZW0pOworCW5mc19tc3luY19pbm9kZShpbm9kZSk7CisKKwlpZiAoZGVsZWdhdGlvbiAhPSBOVUxMKQorCQluZnNfZG9fcmV0dXJuX2RlbGVnYXRpb24oaW5vZGUsIGRlbGVnYXRpb24pOworCWlwdXQoaW5vZGUpOworCW1vZHVsZV9wdXRfYW5kX2V4aXQoMCk7Cit9CisKKy8qCisgKiBBc3luY2hyb25vdXMgZGVsZWdhdGlvbiByZWNhbGwhCisgKi8KK2ludCBuZnNfYXN5bmNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkKQoreworCXN0cnVjdCByZWNhbGxfdGhyZWFkYXJncyBkYXRhID0geworCQkuaW5vZGUgPSBpbm9kZSwKKwkJLnN0YXRlaWQgPSBzdGF0ZWlkLAorCX07CisJaW50IHN0YXR1czsKKworCWluaXRfY29tcGxldGlvbigmZGF0YS5zdGFydGVkKTsKKwlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCXN0YXR1cyA9IGtlcm5lbF90aHJlYWQocmVjYWxsX3RocmVhZCwgJmRhdGEsIENMT05FX0tFUk5FTCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gb3V0X21vZHVsZV9wdXQ7CisJd2FpdF9mb3JfY29tcGxldGlvbigmZGF0YS5zdGFydGVkKTsKKwlyZXR1cm4gZGF0YS5yZXN1bHQ7CitvdXRfbW9kdWxlX3B1dDoKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogUmV0cmlldmUgdGhlIGlub2RlIGFzc29jaWF0ZWQgd2l0aCBhIGRlbGVnYXRpb24KKyAqLworc3RydWN0IGlub2RlICpuZnNfZGVsZWdhdGlvbl9maW5kX2lub2RlKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCBjb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlKQoreworCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKKwlzdHJ1Y3QgaW5vZGUgKnJlcyA9IE5VTEw7CisJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVsZWdhdGlvbiwgJmNscC0+Y2xfZGVsZWdhdGlvbnMsIHN1cGVyX2xpc3QpIHsKKwkJaWYgKG5mc19jb21wYXJlX2ZoKGZoYW5kbGUsICZORlNfSShkZWxlZ2F0aW9uLT5pbm9kZSktPmZoKSA9PSAwKSB7CisJCQlyZXMgPSBpZ3JhYihkZWxlZ2F0aW9uLT5pbm9kZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogTWFyayBhbGwgZGVsZWdhdGlvbnMgYXMgbmVlZGluZyB0byBiZSByZWNsYWltZWQKKyAqLwordm9pZCBuZnNfZGVsZWdhdGlvbl9tYXJrX3JlY2xhaW0oc3RydWN0IG5mczRfY2xpZW50ICpjbHApCit7CisJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOworCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlbGVnYXRpb24sICZjbHAtPmNsX2RlbGVnYXRpb25zLCBzdXBlcl9saXN0KQorCQlkZWxlZ2F0aW9uLT5mbGFncyB8PSBORlNfREVMRUdBVElPTl9ORUVEX1JFQ0xBSU07CisJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7Cit9CisKKy8qCisgKiBSZWFwIGFsbCB1bmNsYWltZWQgZGVsZWdhdGlvbnMgYWZ0ZXIgcmVib290IHJlY292ZXJ5IGlzIGRvbmUKKyAqLwordm9pZCBuZnNfZGVsZWdhdGlvbl9yZWFwX3VuY2xhaW1lZChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24sICpuOworCUxJU1RfSEVBRChoZWFkKTsKKwlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlbGVnYXRpb24sIG4sICZjbHAtPmNsX2RlbGVnYXRpb25zLCBzdXBlcl9saXN0KSB7CisJCWlmICgoZGVsZWdhdGlvbi0+ZmxhZ3MgJiBORlNfREVMRUdBVElPTl9ORUVEX1JFQ0xBSU0pID09IDApCisJCQljb250aW51ZTsKKwkJbGlzdF9tb3ZlKCZkZWxlZ2F0aW9uLT5zdXBlcl9saXN0LCAmaGVhZCk7CisJCU5GU19JKGRlbGVnYXRpb24tPmlub2RlKS0+ZGVsZWdhdGlvbiA9IE5VTEw7CisJCU5GU19JKGRlbGVnYXRpb24tPmlub2RlKS0+ZGVsZWdhdGlvbl9zdGF0ZSA9IDA7CisJfQorCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCXdoaWxlKCFsaXN0X2VtcHR5KCZoZWFkKSkgeworCQlkZWxlZ2F0aW9uID0gbGlzdF9lbnRyeShoZWFkLm5leHQsIHN0cnVjdCBuZnNfZGVsZWdhdGlvbiwgc3VwZXJfbGlzdCk7CisJCWxpc3RfZGVsKCZkZWxlZ2F0aW9uLT5zdXBlcl9saXN0KTsKKwkJbmZzX2ZyZWVfZGVsZWdhdGlvbihkZWxlZ2F0aW9uKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9mcy9uZnMvZGVsZWdhdGlvbi5oIGIvZnMvbmZzL2RlbGVnYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjZjNDVhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL2RlbGVnYXRpb24uaApAQCAtMCwwICsxLDU3IEBACisvKgorICogbGludXgvZnMvbmZzL2RlbGVnYXRpb24uaAorICoKKyAqIENvcHlyaWdodCAoYykgVHJvbmQgTXlrbGVidXN0CisgKgorICogRGVmaW5pdGlvbnMgcGVydGFpbmluZyB0byBORlMgZGVsZWdhdGVkIGZpbGVzCisgKi8KKyNpZm5kZWYgRlNfTkZTX0RFTEVHQVRJT05fSAorI2RlZmluZSBGU19ORlNfREVMRUdBVElPTl9ICisKKyNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjQpCisvKgorICogTkZTdjQgZGVsZWdhdGlvbgorICovCitzdHJ1Y3QgbmZzX2RlbGVnYXRpb24geworCXN0cnVjdCBsaXN0X2hlYWQgc3VwZXJfbGlzdDsKKwlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQ7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwluZnM0X3N0YXRlaWQgc3RhdGVpZDsKKwlpbnQgdHlwZTsKKyNkZWZpbmUgTkZTX0RFTEVHQVRJT05fTkVFRF9SRUNMQUlNIDEKKwlsb25nIGZsYWdzOworCWxvZmZfdCBtYXhzaXplOworfTsKKworaW50IG5mc19pbm9kZV9zZXRfZGVsZWdhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIHN0cnVjdCBuZnNfb3BlbnJlcyAqcmVzKTsKK3ZvaWQgbmZzX2lub2RlX3JlY2xhaW1fZGVsZWdhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIHN0cnVjdCBuZnNfb3BlbnJlcyAqcmVzKTsKK2ludCBuZnNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSk7CitpbnQgbmZzX2FzeW5jX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IG5mczRfc3RhdGVpZCAqc3RhdGVpZCk7CisKK3N0cnVjdCBpbm9kZSAqbmZzX2RlbGVnYXRpb25fZmluZF9pbm9kZShzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCwgY29uc3Qgc3RydWN0IG5mc19maCAqZmhhbmRsZSk7Cit2b2lkIG5mc19yZXR1cm5fYWxsX2RlbGVnYXRpb25zKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwordm9pZCBuZnNfaGFuZGxlX2NiX3BhdGhkb3duKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKTsKKwordm9pZCBuZnNfZGVsZWdhdGlvbl9tYXJrX3JlY2xhaW0oc3RydWN0IG5mczRfY2xpZW50ICpjbHApOwordm9pZCBuZnNfZGVsZWdhdGlvbl9yZWFwX3VuY2xhaW1lZChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCk7CisKKy8qIE5GU3Y0IGRlbGVnYXRpb24tcmVsYXRlZCBwcm9jZWR1cmVzICovCitpbnQgbmZzNF9wcm9jX2RlbGVncmV0dXJuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwgY29uc3QgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkKTsKK2ludCBuZnM0X29wZW5fZGVsZWdhdGlvbl9yZWNhbGwoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUpOworCitzdGF0aWMgaW5saW5lIGludCBuZnNfaGF2ZV9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmbGFncykKK3sKKwlmbGFncyAmPSBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFOworCXNtcF9ybWIoKTsKKwlpZiAoKE5GU19JKGlub2RlKS0+ZGVsZWdhdGlvbl9zdGF0ZSAmIGZsYWdzKSA9PSBmbGFncykKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgbmZzX2hhdmVfZGVsZWdhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9uZnMvZGlyLmMgYi9mcy9uZnMvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmOTZhYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy9kaXIuYwpAQCAtMCwwICsxLDE1NjIgQEAKKy8qCisgKiAgbGludXgvZnMvbmZzL2Rpci5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MiAgUmljayBTbGFka2V5CisgKgorICogIG5mcyBkaXJlY3RvcnkgaGFuZGxpbmcgZnVuY3Rpb25zCisgKgorICogMTAgQXByIDE5OTYJQWRkZWQgc2lsbHkgcmVuYW1lIGZvciB1bmxpbmsJLS1va2lyCisgKiAyOCBTZXAgMTk5NglJbXByb3ZlZCBkaXJlY3RvcnkgY2FjaGUgLS1va2lyCisgKiAyMyBBdWcgMTk5NyAgQ2xhdXMgSGVpbmUgY2xhdXNAbW9tby5tYXRoLnJ3dGgtYWFjaGVuLmRlIAorICogICAgICAgICAgICAgIFJlLWltcGxlbWVudGVkIHNpbGx5IHJlbmFtZSBmb3IgdW5saW5rLCBuZXdseSBpbXBsZW1lbnRlZAorICogICAgICAgICAgICAgIHNpbGx5IHJlbmFtZSBmb3IgbmZzX3JlbmFtZSgpIGZvbGxvd2luZyB0aGUgc3VnZ2VzdGlvbnMKKyAqICAgICAgICAgICAgICBvZiBPbGFmIEtpcmNoIChva2lyKSBmb3VuZCBpbiB0aGlzIGZpbGUuCisgKiAgICAgICAgICAgICAgRm9sbG93aW5nIExpbnVzIGNvbW1lbnRzIG9uIG15IG9yaWdpbmFsIGhhY2ssIHRoaXMgdmVyc2lvbgorICogICAgICAgICAgICAgIGRlcGVuZHMgb25seSBvbiB0aGUgZGNhY2hlIHN0dWZmIGFuZCBkb2Vzbid0IHRvdWNoIHRoZSBpbm9kZQorICogICAgICAgICAgICAgIGxheWVyIChpcHV0KCkgYW5kIGZyaWVuZHMpLgorICogIDYgSnVuIDE5OTkJQ2FjaGUgcmVhZGRpciBsb29rdXBzIGluIHRoZSBwYWdlIGNhY2hlLiAtRGF2ZU0KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorCisjaW5jbHVkZSAiZGVsZWdhdGlvbi5oIgorCisjZGVmaW5lIE5GU19QQVJBTk9JQSAxCisvKiAjZGVmaW5lIE5GU19ERUJVR19WRVJCT1NFIDEgKi8KKworc3RhdGljIGludCBuZnNfb3BlbmRpcihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgaW50IG5mc19yZWFkZGlyKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpuZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBuYW1laWRhdGEgKik7CitzdGF0aWMgaW50IG5mc19jcmVhdGUoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgaW50LCBzdHJ1Y3QgbmFtZWlkYXRhICopOworc3RhdGljIGludCBuZnNfbWtkaXIoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgaW50KTsKK3N0YXRpYyBpbnQgbmZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICopOworc3RhdGljIGludCBuZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICopOworc3RhdGljIGludCBuZnNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBjb25zdCBjaGFyICopOworc3RhdGljIGludCBuZnNfbGluayhzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICopOworc3RhdGljIGludCBuZnNfbWtub2Qoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgaW50LCBkZXZfdCk7CitzdGF0aWMgaW50IG5mc19yZW5hbWUoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwKKwkJICAgICAgc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKik7CitzdGF0aWMgaW50IG5mc19mc3luY19kaXIoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG5mc19kaXJfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gbmZzX3JlYWRkaXIsCisJLm9wZW4JCT0gbmZzX29wZW5kaXIsCisJLnJlbGVhc2UJPSBuZnNfcmVsZWFzZSwKKwkuZnN5bmMJCT0gbmZzX2ZzeW5jX2RpciwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG5mc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkuY3JlYXRlCQk9IG5mc19jcmVhdGUsCisJLmxvb2t1cAkJPSBuZnNfbG9va3VwLAorCS5saW5rCQk9IG5mc19saW5rLAorCS51bmxpbmsJCT0gbmZzX3VubGluaywKKwkuc3ltbGluawk9IG5mc19zeW1saW5rLAorCS5ta2RpcgkJPSBuZnNfbWtkaXIsCisJLnJtZGlyCQk9IG5mc19ybWRpciwKKwkubWtub2QJCT0gbmZzX21rbm9kLAorCS5yZW5hbWUJCT0gbmZzX3JlbmFtZSwKKwkucGVybWlzc2lvbgk9IG5mc19wZXJtaXNzaW9uLAorCS5nZXRhdHRyCT0gbmZzX2dldGF0dHIsCisJLnNldGF0dHIJPSBuZnNfc2V0YXR0ciwKK307CisKKyNpZmRlZiBDT05GSUdfTkZTX1Y0CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpuZnNfYXRvbWljX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbmZzNF9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkuY3JlYXRlCQk9IG5mc19jcmVhdGUsCisJLmxvb2t1cAkJPSBuZnNfYXRvbWljX2xvb2t1cCwKKwkubGluawkJPSBuZnNfbGluaywKKwkudW5saW5rCQk9IG5mc191bmxpbmssCisJLnN5bWxpbmsJPSBuZnNfc3ltbGluaywKKwkubWtkaXIJCT0gbmZzX21rZGlyLAorCS5ybWRpcgkJPSBuZnNfcm1kaXIsCisJLm1rbm9kCQk9IG5mc19ta25vZCwKKwkucmVuYW1lCQk9IG5mc19yZW5hbWUsCisJLnBlcm1pc3Npb24JPSBuZnNfcGVybWlzc2lvbiwKKwkuZ2V0YXR0cgk9IG5mc19nZXRhdHRyLAorCS5zZXRhdHRyCT0gbmZzX3NldGF0dHIsCit9OworCisjZW5kaWYgLyogQ09ORklHX05GU19WNCAqLworCisvKgorICogT3BlbiBmaWxlCisgKi8KK3N0YXRpYyBpbnQKK25mc19vcGVuZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWludCByZXMgPSAwOworCisJbG9ja19rZXJuZWwoKTsKKwkvKiBDYWxsIGdlbmVyaWMgb3BlbiBjb2RlIGluIG9yZGVyIHRvIGNhY2hlIGNyZWRlbnRpYWxzICovCisJaWYgKCFyZXMpCisJCXJlcyA9IG5mc19vcGVuKGlub2RlLCBmaWxwKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJlczsKK30KKwordHlwZWRlZiB1MzIgKiAoKmRlY29kZV9kaXJlbnRfdCkodTMyICosIHN0cnVjdCBuZnNfZW50cnkgKiwgaW50KTsKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgZmlsZQkqZmlsZTsKKwlzdHJ1Y3QgcGFnZQkqcGFnZTsKKwl1bnNpZ25lZCBsb25nCXBhZ2VfaW5kZXg7CisJdTMyCQkqcHRyOworCXU2NAkJdGFyZ2V0OworCXN0cnVjdCBuZnNfZW50cnkgKmVudHJ5OworCWRlY29kZV9kaXJlbnRfdAlkZWNvZGU7CisJaW50CQlwbHVzOworCWludAkJZXJyb3I7Cit9IG5mc19yZWFkZGlyX2Rlc2NyaXB0b3JfdDsKKworLyogTm93IHdlIGNhY2hlIGRpcmVjdG9yaWVzIHByb3Blcmx5LCBieSBzdHVmZmluZyB0aGUgZGlyZW50CisgKiBkYXRhIGRpcmVjdGx5IGluIHRoZSBwYWdlIGNhY2hlLgorICoKKyAqIElub2RlIGludmFsaWRhdGlvbiBkdWUgdG8gcmVmcmVzaCBldGMuIHRha2VzIGNhcmUgb2YKKyAqIF9ldmVyeXRoaW5nXywgbm8gc2xvcHB5IGVudHJ5IGZsdXNoaW5nIGxvZ2ljLCBubyBleHRyYW5lb3VzCisgKiBjb3B5aW5nLCBuZXR3b3JrIGRpcmVjdCB0byBwYWdlIGNhY2hlLCB0aGUgd2F5IGl0IHdhcyBtZWFudAorICogdG8gYmUuCisgKgorICogTk9URTogRGlyZW50IGluZm9ybWF0aW9uIHZlcmlmaWNhdGlvbiBpcyBkb25lIGFsd2F5cyBieSB0aGUKKyAqCSBwYWdlLWluIG9mIHRoZSBSUEMgcmVwbHksIG5vd2hlcmUgZWxzZSwgdGhpcyBzaW1wbGllcworICoJIHRoaW5ncyBzdWJzdGFudGlhbGx5LgorICovCitzdGF0aWMKK2ludCBuZnNfcmVhZGRpcl9maWxsZXIobmZzX3JlYWRkaXJfZGVzY3JpcHRvcl90ICpkZXNjLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgZmlsZQkqZmlsZSA9IGRlc2MtPmZpbGU7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBycGNfY3JlZAkqY3JlZCA9IG5mc19maWxlX2NyZWQoZmlsZSk7CisJdW5zaWduZWQgbG9uZwl0aW1lc3RhbXA7CisJaW50CQllcnJvcjsKKworCWRmcHJpbnRrKFZGUywgIk5GUzogbmZzX3JlYWRkaXJfZmlsbGVyKCkgcmVhZGluZyBjb29raWUgJUx1IGludG8gcGFnZSAlbHUuXG4iLCAobG9uZyBsb25nKWRlc2MtPmVudHJ5LT5jb29raWUsIHBhZ2UtPmluZGV4KTsKKworIGFnYWluOgorCXRpbWVzdGFtcCA9IGppZmZpZXM7CisJZXJyb3IgPSBORlNfUFJPVE8oaW5vZGUpLT5yZWFkZGlyKGZpbGUtPmZfZGVudHJ5LCBjcmVkLCBkZXNjLT5lbnRyeS0+Y29va2llLCBwYWdlLAorCQkJCQkgIE5GU19TRVJWRVIoaW5vZGUpLT5kdHNpemUsIGRlc2MtPnBsdXMpOworCWlmIChlcnJvciA8IDApIHsKKwkJLyogV2UgcmVxdWVzdGVkIFJFQURESVJQTFVTLCBidXQgdGhlIHNlcnZlciBkb2Vzbid0IGdyb2sgaXQgKi8KKwkJaWYgKGVycm9yID09IC1FTk9UU1VQUCAmJiBkZXNjLT5wbHVzKSB7CisJCQlORlNfU0VSVkVSKGlub2RlKS0+Y2FwcyAmPSB+TkZTX0NBUF9SRUFERElSUExVUzsKKwkJCU5GU19GTEFHUyhpbm9kZSkgJj0gfk5GU19JTk9fQURWSVNFX1JEUExVUzsKKwkJCWRlc2MtPnBsdXMgPSAwOworCQkJZ290byBhZ2FpbjsKKwkJfQorCQlnb3RvIGVycm9yOworCX0KKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJTkZTX0ZMQUdTKGlub2RlKSB8PSBORlNfSU5PX0lOVkFMSURfQVRJTUU7CisJLyogRW5zdXJlIGNvbnNpc3RlbnQgcGFnZSBhbGlnbm1lbnQgb2YgdGhlIGRhdGEuCisJICogTm90ZTogYXNzdW1lcyB3ZSBoYXZlIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhpcyBtYXBwaW5nIGVpdGhlcgorCSAqCSB0aHJvdWdodCBpbm9kZS0+aV9zZW0gb3Igc29tZSBvdGhlciBtZWNoYW5pc20uCisJICovCisJaWYgKHBhZ2UtPmluZGV4ID09IDApIHsKKwkJaW52YWxpZGF0ZV9pbm9kZV9wYWdlcyhpbm9kZS0+aV9tYXBwaW5nKTsKKwkJTkZTX0koaW5vZGUpLT5yZWFkZGlyX3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwl9CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIDA7CisgZXJyb3I6CisJU2V0UGFnZUVycm9yKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCW5mc196YXBfY2FjaGVzKGlub2RlKTsKKwlkZXNjLT5lcnJvciA9IGVycm9yOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW5saW5lCitpbnQgZGlyX2RlY29kZShuZnNfcmVhZGRpcl9kZXNjcmlwdG9yX3QgKmRlc2MpCit7CisJdTMyCSpwID0gZGVzYy0+cHRyOworCXAgPSBkZXNjLT5kZWNvZGUocCwgZGVzYy0+ZW50cnksIGRlc2MtPnBsdXMpOworCWlmIChJU19FUlIocCkpCisJCXJldHVybiBQVFJfRVJSKHApOworCWRlc2MtPnB0ciA9IHA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgZGlyX3BhZ2VfcmVsZWFzZShuZnNfcmVhZGRpcl9kZXNjcmlwdG9yX3QgKmRlc2MpCit7CisJa3VubWFwKGRlc2MtPnBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShkZXNjLT5wYWdlKTsKKwlkZXNjLT5wYWdlID0gTlVMTDsKKwlkZXNjLT5wdHIgPSBOVUxMOworfQorCisvKgorICogR2l2ZW4gYSBwb2ludGVyIHRvIGEgYnVmZmVyIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBmaWxsZWQgYnkgYSBjYWxsCisgKiB0byByZWFkZGlyLCBmaW5kIHRoZSBuZXh0IGVudHJ5LgorICoKKyAqIElmIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBoYXMgYmVlbiByZWFjaGVkLCByZXR1cm4gLUVBR0FJTiwgaWYgbm90LAorICogcmV0dXJuIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBidWZmZXIgb2YgdGhlIG5leHQgZW50cnkgdG8gYmUKKyAqIHJlYWQuCisgKi8KK3N0YXRpYyBpbmxpbmUKK2ludCBmaW5kX2RpcmVudChuZnNfcmVhZGRpcl9kZXNjcmlwdG9yX3QgKmRlc2MsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBuZnNfZW50cnkgKmVudHJ5ID0gZGVzYy0+ZW50cnk7CisJaW50CQlsb29wX2NvdW50ID0gMCwKKwkJCXN0YXR1czsKKworCXdoaWxlKChzdGF0dXMgPSBkaXJfZGVjb2RlKGRlc2MpKSA9PSAwKSB7CisJCWRmcHJpbnRrKFZGUywgIk5GUzogZm91bmQgY29va2llICVMdVxuIiwgKGxvbmcgbG9uZyllbnRyeS0+Y29va2llKTsKKwkJaWYgKGVudHJ5LT5wcmV2X2Nvb2tpZSA9PSBkZXNjLT50YXJnZXQpCisJCQlicmVhazsKKwkJaWYgKGxvb3BfY291bnQrKyA+IDIwMCkgeworCQkJbG9vcF9jb3VudCA9IDA7CisJCQlzY2hlZHVsZSgpOworCQl9CisJfQorCWRmcHJpbnRrKFZGUywgIk5GUzogZmluZF9kaXJlbnQoKSByZXR1cm5zICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBnaXZlbiBwYWdlLCBhbmQgY2FsbCBmaW5kX2RpcmVudCgpIGluIG9yZGVyIHRvIHRyeSB0bworICogcmV0dXJuIHRoZSBuZXh0IGVudHJ5LgorICovCitzdGF0aWMgaW5saW5lCitpbnQgZmluZF9kaXJlbnRfcGFnZShuZnNfcmVhZGRpcl9kZXNjcmlwdG9yX3QgKmRlc2MpCit7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IGRlc2MtPmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBwYWdlCSpwYWdlOworCWludAkJc3RhdHVzOworCisJZGZwcmludGsoVkZTLCAiTkZTOiBmaW5kX2RpcmVudF9wYWdlKCkgc2VhcmNoaW5nIGRpcmVjdG9yeSBwYWdlICVsZFxuIiwgZGVzYy0+cGFnZV9pbmRleCk7CisKKwlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGRlc2MtPnBhZ2VfaW5kZXgsCisJCQkgICAgICAgKGZpbGxlcl90ICopbmZzX3JlYWRkaXJfZmlsbGVyLCBkZXNjKTsKKwlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCXN0YXR1cyA9IFBUUl9FUlIocGFnZSk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJZ290byByZWFkX2Vycm9yOworCisJLyogTk9URTogU29tZW9uZSBlbHNlIG1heSBoYXZlIGNoYW5nZWQgdGhlIFJFQURESVJQTFVTIGZsYWcgKi8KKwlkZXNjLT5wYWdlID0gcGFnZTsKKwlkZXNjLT5wdHIgPSBrbWFwKHBhZ2UpOwkJLyogbWF0Y2hpbmcga3VubWFwIGluIG5mc19kb19maWxsZGlyICovCisJc3RhdHVzID0gZmluZF9kaXJlbnQoZGVzYywgcGFnZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWRpcl9wYWdlX3JlbGVhc2UoZGVzYyk7Cisgb3V0OgorCWRmcHJpbnRrKFZGUywgIk5GUzogZmluZF9kaXJlbnRfcGFnZSgpIHJldHVybnMgJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKKyByZWFkX2Vycm9yOgorCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIFJlY3Vyc2UgdGhyb3VnaCB0aGUgcGFnZSBjYWNoZSBwYWdlcywgYW5kIHJldHVybiBhCisgKiBmaWxsZWQgbmZzX2VudHJ5IHN0cnVjdHVyZSBvZiB0aGUgbmV4dCBkaXJlY3RvcnkgZW50cnkgaWYgcG9zc2libGUuCisgKgorICogVGhlIHRhcmdldCBmb3IgdGhlIHNlYXJjaCBpcyAnZGVzYy0+dGFyZ2V0Jy4KKyAqLworc3RhdGljIGlubGluZQoraW50IHJlYWRkaXJfc2VhcmNoX3BhZ2VjYWNoZShuZnNfcmVhZGRpcl9kZXNjcmlwdG9yX3QgKmRlc2MpCit7CisJaW50CQlsb29wX2NvdW50ID0gMDsKKwlpbnQJCXJlczsKKworCWRmcHJpbnRrKFZGUywgIk5GUzogcmVhZGRpcl9zZWFyY2hfcGFnZWNhY2hlKCkgc2VhcmNoaW5nIGZvciBjb29raWUgJUx1XG4iLCAobG9uZyBsb25nKWRlc2MtPnRhcmdldCk7CisJZm9yICg7OykgeworCQlyZXMgPSBmaW5kX2RpcmVudF9wYWdlKGRlc2MpOworCQlpZiAocmVzICE9IC1FQUdBSU4pCisJCQlicmVhazsKKwkJLyogQWxpZ24gdG8gYmVnaW5uaW5nIG9mIG5leHQgcGFnZSAqLworCQlkZXNjLT5wYWdlX2luZGV4ICsrOworCQlpZiAobG9vcF9jb3VudCsrID4gMjAwKSB7CisJCQlsb29wX2NvdW50ID0gMDsKKwkJCXNjaGVkdWxlKCk7CisJCX0KKwl9CisJZGZwcmludGsoVkZTLCAiTkZTOiByZWFkZGlyX3NlYXJjaF9wYWdlY2FjaGUoKSByZXR1cm5lZCAlZFxuIiwgcmVzKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBkdF90eXBlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIChpbm9kZS0+aV9tb2RlID4+IDEyKSAmIDE1OworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqbmZzX3JlYWRkaXJfbG9va3VwKG5mc19yZWFkZGlyX2Rlc2NyaXB0b3JfdCAqZGVzYyk7CisKKy8qCisgKiBPbmNlIHdlJ3ZlIGZvdW5kIHRoZSBzdGFydCBvZiB0aGUgZGlyZW50IHdpdGhpbiBhIHBhZ2U6IGZpbGwgJ2VyIHVwLi4uCisgKi8KK3N0YXRpYyAKK2ludCBuZnNfZG9fZmlsbGRpcihuZnNfcmVhZGRpcl9kZXNjcmlwdG9yX3QgKmRlc2MsIHZvaWQgKmRpcmVudCwKKwkJICAgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGZpbGUJKmZpbGUgPSBkZXNjLT5maWxlOworCXN0cnVjdCBuZnNfZW50cnkgKmVudHJ5ID0gZGVzYy0+ZW50cnk7CisJc3RydWN0IGRlbnRyeQkqZGVudHJ5ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nCWZpbGVpZDsKKwlpbnQJCWxvb3BfY291bnQgPSAwLAorCQkJcmVzOworCisJZGZwcmludGsoVkZTLCAiTkZTOiBuZnNfZG9fZmlsbGRpcigpIGZpbGxpbmcgc3RhcnRpbmcgQCBjb29raWUgJUx1XG4iLCAobG9uZyBsb25nKWRlc2MtPnRhcmdldCk7CisKKwlmb3IoOzspIHsKKwkJdW5zaWduZWQgZF90eXBlID0gRFRfVU5LTk9XTjsKKwkJLyogTm90ZTogZW50cnktPnByZXZfY29va2llIGNvbnRhaW5zIHRoZSBjb29raWUgZm9yCisJCSAqCSByZXRyaWV2aW5nIHRoZSBjdXJyZW50IGRpcmVudCBvbiB0aGUgc2VydmVyICovCisJCWZpbGVpZCA9IG5mc19maWxlaWRfdG9faW5vX3QoZW50cnktPmlubyk7CisKKwkJLyogR2V0IGEgZGVudHJ5IGlmIHdlIGhhdmUgb25lICovCisJCWlmIChkZW50cnkgIT0gTlVMTCkKKwkJCWRwdXQoZGVudHJ5KTsKKwkJZGVudHJ5ID0gbmZzX3JlYWRkaXJfbG9va3VwKGRlc2MpOworCisJCS8qIFVzZSByZWFkZGlycGx1cyBpbmZvICovCisJCWlmIChkZW50cnkgIT0gTlVMTCAmJiBkZW50cnktPmRfaW5vZGUgIT0gTlVMTCkgeworCQkJZF90eXBlID0gZHRfdHlwZShkZW50cnktPmRfaW5vZGUpOworCQkJZmlsZWlkID0gZGVudHJ5LT5kX2lub2RlLT5pX2lubzsKKwkJfQorCisJCXJlcyA9IGZpbGxkaXIoZGlyZW50LCBlbnRyeS0+bmFtZSwgZW50cnktPmxlbiwgCisJCQkgICAgICBlbnRyeS0+cHJldl9jb29raWUsIGZpbGVpZCwgZF90eXBlKTsKKwkJaWYgKHJlcyA8IDApCisJCQlicmVhazsKKwkJZmlsZS0+Zl9wb3MgPSBkZXNjLT50YXJnZXQgPSBlbnRyeS0+Y29va2llOworCQlpZiAoZGlyX2RlY29kZShkZXNjKSAhPSAwKSB7CisJCQlkZXNjLT5wYWdlX2luZGV4ICsrOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGxvb3BfY291bnQrKyA+IDIwMCkgeworCQkJbG9vcF9jb3VudCA9IDA7CisJCQlzY2hlZHVsZSgpOworCQl9CisJfQorCWRpcl9wYWdlX3JlbGVhc2UoZGVzYyk7CisJaWYgKGRlbnRyeSAhPSBOVUxMKQorCQlkcHV0KGRlbnRyeSk7CisJZGZwcmludGsoVkZTLCAiTkZTOiBuZnNfZG9fZmlsbGRpcigpIGZpbGxpbmcgZW5kZWQgQCBjb29raWUgJUx1OyByZXR1cm5pbmcgPSAlZFxuIiwgKGxvbmcgbG9uZylkZXNjLT50YXJnZXQsIHJlcyk7CisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqIElmIHdlIGNhbm5vdCBmaW5kIGEgY29va2llIGluIG91ciBjYWNoZSwgd2Ugc3VzcGVjdCB0aGF0IHRoaXMgaXMKKyAqIGJlY2F1c2UgaXQgcG9pbnRzIHRvIGEgZGVsZXRlZCBmaWxlLCBzbyB3ZSBhc2sgdGhlIHNlcnZlciB0byByZXR1cm4KKyAqIHdoYXRldmVyIGl0IHRoaW5rcyBpcyB0aGUgbmV4dCBlbnRyeS4gV2UgdGhlbiBmZWVkIHRoaXMgdG8gZmlsbGRpci4KKyAqIElmIGFsbCBnb2VzIHdlbGwsIHdlIHNob3VsZCB0aGVuIGJlIGFibGUgdG8gZmluZCBvdXIgd2F5IHJvdW5kIHRoZQorICogY2FjaGUgb24gdGhlIG5leHQgY2FsbCB0byByZWFkZGlyX3NlYXJjaF9wYWdlY2FjaGUoKTsKKyAqCisgKiBOT1RFOiB3ZSBjYW5ub3QgYWRkIHRoZSBhbm9ueW1vdXMgcGFnZSB0byB0aGUgcGFnZWNhY2hlIGJlY2F1c2UKKyAqCSB0aGUgZGF0YSBpdCBjb250YWlucyBtaWdodCBub3QgYmUgcGFnZSBhbGlnbmVkLiBCZXNpZGVzLAorICoJIHdlIHNob3VsZCBhbHJlYWR5IGhhdmUgYSBjb21wbGV0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAqCSBkaXJlY3RvcnkgaW4gdGhlIHBhZ2UgY2FjaGUgYnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUuCisgKi8KK3N0YXRpYyBpbmxpbmUKK2ludCB1bmNhY2hlZF9yZWFkZGlyKG5mc19yZWFkZGlyX2Rlc2NyaXB0b3JfdCAqZGVzYywgdm9pZCAqZGlyZW50LAorCQkgICAgIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBmaWxlCSpmaWxlID0gZGVzYy0+ZmlsZTsKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHJwY19jcmVkCSpjcmVkID0gbmZzX2ZpbGVfY3JlZChmaWxlKTsKKwlzdHJ1Y3QgcGFnZQkqcGFnZSA9IE5VTEw7CisJaW50CQlzdGF0dXM7CisKKwlkZnByaW50ayhWRlMsICJORlM6IHVuY2FjaGVkX3JlYWRkaXIoKSBzZWFyY2hpbmcgZm9yIGNvb2tpZSAlTHVcbiIsIChsb25nIGxvbmcpZGVzYy0+dGFyZ2V0KTsKKworCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9ISUdIVVNFUik7CisJaWYgKCFwYWdlKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlkZXNjLT5lcnJvciA9IE5GU19QUk9UTyhpbm9kZSktPnJlYWRkaXIoZmlsZS0+Zl9kZW50cnksIGNyZWQsIGRlc2MtPnRhcmdldCwKKwkJCQkJCXBhZ2UsCisJCQkJCQlORlNfU0VSVkVSKGlub2RlKS0+ZHRzaXplLAorCQkJCQkJZGVzYy0+cGx1cyk7CisJTkZTX0ZMQUdTKGlub2RlKSB8PSBORlNfSU5PX0lOVkFMSURfQVRJTUU7CisJZGVzYy0+cGFnZSA9IHBhZ2U7CisJZGVzYy0+cHRyID0ga21hcChwYWdlKTsJCS8qIG1hdGNoaW5nIGt1bm1hcCBpbiBuZnNfZG9fZmlsbGRpciAqLworCWlmIChkZXNjLT5lcnJvciA+PSAwKSB7CisJCWlmICgoc3RhdHVzID0gZGlyX2RlY29kZShkZXNjKSkgPT0gMCkKKwkJCWRlc2MtPmVudHJ5LT5wcmV2X2Nvb2tpZSA9IGRlc2MtPnRhcmdldDsKKwl9IGVsc2UKKwkJc3RhdHVzID0gLUVJTzsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBvdXRfcmVsZWFzZTsKKworCXN0YXR1cyA9IG5mc19kb19maWxsZGlyKGRlc2MsIGRpcmVudCwgZmlsbGRpcik7CisKKwkvKiBSZXNldCByZWFkIGRlc2NyaXB0b3Igc28gaXQgc2VhcmNoZXMgdGhlIHBhZ2UgY2FjaGUgZnJvbQorCSAqIHRoZSBzdGFydCB1cG9uIHRoZSBuZXh0IGNhbGwgdG8gcmVhZGRpcl9zZWFyY2hfcGFnZWNhY2hlKCkgKi8KKwlkZXNjLT5wYWdlX2luZGV4ID0gMDsKKwlkZXNjLT5lbnRyeS0+Y29va2llID0gZGVzYy0+ZW50cnktPnByZXZfY29va2llID0gMDsKKwlkZXNjLT5lbnRyeS0+ZW9mID0gMDsKKyBvdXQ6CisJZGZwcmludGsoVkZTLCAiTkZTOiB1bmNhY2hlZF9yZWFkZGlyKCkgcmV0dXJucyAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworIG91dF9yZWxlYXNlOgorCWRpcl9wYWdlX3JlbGVhc2UoZGVzYyk7CisJZ290byBvdXQ7Cit9CisKKy8qIFRoZSBmaWxlIG9mZnNldCBwb3NpdGlvbiBpcyBub3cgcmVwcmVzZW50ZWQgYXMgYSB0cnVlIG9mZnNldCBpbnRvIHRoZQorICogcGFnZSBjYWNoZSBhcyBpcyB0aGUgY2FzZSBpbiBtb3N0IG9mIHRoZSBvdGhlciBmaWxlc3lzdGVtcy4KKyAqLworc3RhdGljIGludCBuZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCW5mc19yZWFkZGlyX2Rlc2NyaXB0b3JfdCBteV9kZXNjLAorCQkJKmRlc2MgPSAmbXlfZGVzYzsKKwlzdHJ1Y3QgbmZzX2VudHJ5IG15X2VudHJ5OworCXN0cnVjdCBuZnNfZmgJIGZoOworCXN0cnVjdCBuZnNfZmF0dHIgZmF0dHI7CisJbG9uZwkJcmVzOworCisJbG9ja19rZXJuZWwoKTsKKworCXJlcyA9IG5mc19yZXZhbGlkYXRlX2lub2RlKE5GU19TRVJWRVIoaW5vZGUpLCBpbm9kZSk7CisJaWYgKHJlcyA8IDApIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gcmVzOworCX0KKworCS8qCisJICogZmlscC0+Zl9wb3MgcG9pbnRzIHRvIHRoZSBmaWxlIG9mZnNldCBpbiB0aGUgcGFnZSBjYWNoZS4KKwkgKiBidXQgaWYgdGhlIGNhY2hlIGhhcyBtZWFud2hpbGUgYmVlbiB6YXBwZWQsIHdlIG5lZWQgdG8KKwkgKiByZWFkIGZyb20gdGhlIGxhc3QgZGlyZW50IHRvIHJldmFsaWRhdGUgZl9wb3MKKwkgKiBpdHNlbGYuCisJICovCisJbWVtc2V0KGRlc2MsIDAsIHNpemVvZigqZGVzYykpOworCisJZGVzYy0+ZmlsZSA9IGZpbHA7CisJZGVzYy0+dGFyZ2V0ID0gZmlscC0+Zl9wb3M7CisJZGVzYy0+ZGVjb2RlID0gTkZTX1BST1RPKGlub2RlKS0+ZGVjb2RlX2RpcmVudDsKKwlkZXNjLT5wbHVzID0gTkZTX1VTRV9SRUFERElSUExVUyhpbm9kZSk7CisKKwlteV9lbnRyeS5jb29raWUgPSBteV9lbnRyeS5wcmV2X2Nvb2tpZSA9IDA7CisJbXlfZW50cnkuZW9mID0gMDsKKwlteV9lbnRyeS5maCA9ICZmaDsKKwlteV9lbnRyeS5mYXR0ciA9ICZmYXR0cjsKKwlkZXNjLT5lbnRyeSA9ICZteV9lbnRyeTsKKworCXdoaWxlKCFkZXNjLT5lbnRyeS0+ZW9mKSB7CisJCXJlcyA9IHJlYWRkaXJfc2VhcmNoX3BhZ2VjYWNoZShkZXNjKTsKKwkJaWYgKHJlcyA9PSAtRUJBRENPT0tJRSkgeworCQkJLyogVGhpcyBtZWFucyBlaXRoZXIgZW5kIG9mIGRpcmVjdG9yeSAqLworCQkJaWYgKGRlc2MtPmVudHJ5LT5jb29raWUgIT0gZGVzYy0+dGFyZ2V0KSB7CisJCQkJLyogT3IgdGhhdCB0aGUgc2VydmVyIGhhcyAnbG9zdCcgYSBjb29raWUgKi8KKwkJCQlyZXMgPSB1bmNhY2hlZF9yZWFkZGlyKGRlc2MsIGRpcmVudCwgZmlsbGRpcik7CisJCQkJaWYgKHJlcyA+PSAwKQorCQkJCQljb250aW51ZTsKKwkJCX0KKwkJCXJlcyA9IDA7CisJCQlicmVhazsKKwkJfQorCQlpZiAocmVzID09IC1FVE9PU01BTEwgJiYgZGVzYy0+cGx1cykgeworCQkJTkZTX0ZMQUdTKGlub2RlKSAmPSB+TkZTX0lOT19BRFZJU0VfUkRQTFVTOworCQkJbmZzX3phcF9jYWNoZXMoaW5vZGUpOworCQkJZGVzYy0+cGx1cyA9IDA7CisJCQlkZXNjLT5lbnRyeS0+ZW9mID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChyZXMgPCAwKQorCQkJYnJlYWs7CisKKwkJcmVzID0gbmZzX2RvX2ZpbGxkaXIoZGVzYywgZGlyZW50LCBmaWxsZGlyKTsKKwkJaWYgKHJlcyA8IDApIHsKKwkJCXJlcyA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJaWYgKGRlc2MtPmVycm9yIDwgMCkKKwkJcmV0dXJuIGRlc2MtPmVycm9yOworCWlmIChyZXMgPCAwKQorCQlyZXR1cm4gcmVzOworCXJldHVybiAwOworfQorCisvKgorICogQWxsIGRpcmVjdG9yeSBvcGVyYXRpb25zIHVuZGVyIE5GUyBhcmUgc3luY2hyb25vdXMsIHNvIGZzeW5jKCkKKyAqIGlzIGEgZHVtbXkgb3BlcmF0aW9uLgorICovCitpbnQgbmZzX2ZzeW5jX2RpcihzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBIGNoZWNrIGZvciB3aGV0aGVyIG9yIG5vdCB0aGUgcGFyZW50IGRpcmVjdG9yeSBoYXMgY2hhbmdlZC4KKyAqIEluIHRoZSBjYXNlIGl0IGhhcywgd2UgYXNzdW1lIHRoYXQgdGhlIGRlbnRyaWVzIGFyZSB1bnRydXN0d29ydGh5CisgKiBhbmQgbWF5IG5lZWQgdG8gYmUgbG9va2VkIHVwIGFnYWluLgorICovCitzdGF0aWMgaW5saW5lIGludCBuZnNfY2hlY2tfdmVyaWZpZXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpZiAoSVNfUk9PVChkZW50cnkpKQorCQlyZXR1cm4gMTsKKwlpZiAoKE5GU19GTEFHUyhkaXIpICYgTkZTX0lOT19JTlZBTElEX0FUVFIpICE9IDAKKwkJCXx8IG5mc19hdHRyaWJ1dGVfdGltZW91dChkaXIpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gbmZzX3ZlcmlmeV9jaGFuZ2VfYXR0cmlidXRlKGRpciwgKHVuc2lnbmVkIGxvbmcpZGVudHJ5LT5kX2ZzZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZnNfc2V0X3ZlcmlmaWVyKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHVuc2lnbmVkIGxvbmcgdmVyZikKK3sKKwlkZW50cnktPmRfZnNkYXRhID0gKHZvaWQgKil2ZXJmOworfQorCisvKgorICogV2hlbmV2ZXIgYW4gTkZTIG9wZXJhdGlvbiBzdWNjZWVkcywgd2Uga25vdyB0aGF0IHRoZSBkZW50cnkKKyAqIGlzIHZhbGlkLCBzbyB3ZSB1cGRhdGUgdGhlIHJldmFsaWRhdGlvbiB0aW1lc3RhbXAuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBuZnNfcmVuZXdfdGltZXMoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKK3sKKwlkZW50cnktPmRfdGltZSA9IGppZmZpZXM7Cit9CisKK3N0YXRpYyBpbmxpbmUKK2ludCBuZnNfbG9va3VwX3ZlcmlmeV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihpbm9kZSk7CisKKwlpZiAobmQgIT0gTlVMTCkgeworCQlpbnQgbmRmbGFncyA9IG5kLT5mbGFnczsKKwkJLyogVkZTIHdhbnRzIGFuIG9uLXRoZS13aXJlIHJldmFsaWRhdGlvbiAqLworCQlpZiAobmRmbGFncyAmIExPT0tVUF9SRVZBTCkKKwkJCWdvdG8gb3V0X2ZvcmNlOworCQkvKiBUaGlzIGlzIGFuIG9wZW4oMikgKi8KKwkJaWYgKChuZGZsYWdzICYgTE9PS1VQX09QRU4pICYmCisJCQkJIShuZGZsYWdzICYgTE9PS1VQX0NPTlRJTlVFKSAmJgorCQkJCSEoc2VydmVyLT5mbGFncyAmIE5GU19NT1VOVF9OT0NUTykpCisJCQlnb3RvIG91dF9mb3JjZTsKKwl9CisJcmV0dXJuIG5mc19yZXZhbGlkYXRlX2lub2RlKHNlcnZlciwgaW5vZGUpOworb3V0X2ZvcmNlOgorCXJldHVybiBfX25mc19yZXZhbGlkYXRlX2lub2RlKHNlcnZlciwgaW5vZGUpOworfQorCisvKgorICogV2UganVkZ2UgaG93IGxvbmcgd2Ugd2FudCB0byB0cnVzdCBuZWdhdGl2ZQorICogZGVudHJpZXMgYnkgbG9va2luZyBhdCB0aGUgcGFyZW50IGlub2RlIG10aW1lLgorICoKKyAqIElmIHBhcmVudCBtdGltZSBoYXMgY2hhbmdlZCwgd2UgcmV2YWxpZGF0ZSwgZWxzZSB3ZSB3YWl0IGZvciBhCisgKiBwZXJpb2QgY29ycmVzcG9uZGluZyB0byB0aGUgcGFyZW50J3MgYXR0cmlidXRlIGNhY2hlIHRpbWVvdXQgdmFsdWUuCisgKi8KK3N0YXRpYyBpbmxpbmUKK2ludCBuZnNfbmVnX25lZWRfcmV2YWwoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJICAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWludCBuZGZsYWdzID0gMDsKKworCWlmIChuZCkKKwkJbmRmbGFncyA9IG5kLT5mbGFnczsKKwkvKiBEb24ndCByZXZhbGlkYXRlIGEgbmVnYXRpdmUgZGVudHJ5IGlmIHdlJ3JlIGNyZWF0aW5nIGEgbmV3IGZpbGUgKi8KKwlpZiAoKG5kZmxhZ3MgJiBMT09LVVBfQ1JFQVRFKSAmJiAhKG5kZmxhZ3MgJiBMT09LVVBfQ09OVElOVUUpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gIW5mc19jaGVja192ZXJpZmllcihkaXIsIGRlbnRyeSk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBkY2FjaGUgaGFzIGEgbG9va3VwIGhpdCwKKyAqIGFuZCB3ZSBzaG91bGQgY2hlY2sgd2hldGhlciB3ZSBjYW4gcmVhbGx5IHRydXN0IHRoYXQKKyAqIGxvb2t1cC4KKyAqCisgKiBOT1RFISBUaGUgaGl0IGNhbiBiZSBhIG5lZ2F0aXZlIGhpdCB0b28sIGRvbid0IGFzc3VtZQorICogd2UgaGF2ZSBhbiBpbm9kZSEKKyAqCisgKiBJZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBpcyBzZWVuIHRvIGhhdmUgY2hhbmdlZCwgd2UgdGhyb3cgb3V0IHRoZQorICogY2FjaGVkIGRlbnRyeSBhbmQgZG8gYSBuZXcgbG9va3VwLgorICovCitzdGF0aWMgaW50IG5mc19sb29rdXBfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmRpcjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwlpbnQgZXJyb3I7CisJc3RydWN0IG5mc19maCBmaGFuZGxlOworCXN0cnVjdCBuZnNfZmF0dHIgZmF0dHI7CisJdW5zaWduZWQgbG9uZyB2ZXJpZmllcjsKKworCXBhcmVudCA9IGRnZXRfcGFyZW50KGRlbnRyeSk7CisJbG9ja19rZXJuZWwoKTsKKwlkaXIgPSBwYXJlbnQtPmRfaW5vZGU7CisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisKKwlpZiAoIWlub2RlKSB7CisJCWlmIChuZnNfbmVnX25lZWRfcmV2YWwoZGlyLCBkZW50cnksIG5kKSkKKwkJCWdvdG8gb3V0X2JhZDsKKwkJZ290byBvdXRfdmFsaWQ7CisJfQorCisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKKwkJZGZwcmludGsoVkZTLCAibmZzX2xvb2t1cF92YWxpZGF0ZTogJXMvJXMgaGFzIGR1ZCBpbm9kZVxuIiwKKwkJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJZ290byBvdXRfYmFkOworCX0KKworCS8qIFJldmFsaWRhdGUgcGFyZW50IGRpcmVjdG9yeSBhdHRyaWJ1dGUgY2FjaGUgKi8KKwlpZiAobmZzX3JldmFsaWRhdGVfaW5vZGUoTkZTX1NFUlZFUihkaXIpLCBkaXIpIDwgMCkKKwkJZ290byBvdXRfemFwX3BhcmVudDsKKworCS8qIEZvcmNlIGEgZnVsbCBsb29rIHVwIGlmZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBoYXMgY2hhbmdlZCAqLworCWlmIChuZnNfY2hlY2tfdmVyaWZpZXIoZGlyLCBkZW50cnkpKSB7CisJCWlmIChuZnNfbG9va3VwX3ZlcmlmeV9pbm9kZShpbm9kZSwgbmQpKQorCQkJZ290byBvdXRfemFwX3BhcmVudDsKKwkJZ290byBvdXRfdmFsaWQ7CisJfQorCisJaWYgKE5GU19TVEFMRShpbm9kZSkpCisJCWdvdG8gb3V0X2JhZDsKKworCXZlcmlmaWVyID0gbmZzX3NhdmVfY2hhbmdlX2F0dHJpYnV0ZShkaXIpOworCWVycm9yID0gTkZTX1BST1RPKGRpciktPmxvb2t1cChkaXIsICZkZW50cnktPmRfbmFtZSwgJmZoYW5kbGUsICZmYXR0cik7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9iYWQ7CisJaWYgKG5mc19jb21wYXJlX2ZoKE5GU19GSChpbm9kZSksICZmaGFuZGxlKSkKKwkJZ290byBvdXRfYmFkOworCWlmICgoZXJyb3IgPSBuZnNfcmVmcmVzaF9pbm9kZShpbm9kZSwgJmZhdHRyKSkgIT0gMCkKKwkJZ290byBvdXRfYmFkOworCisJbmZzX3JlbmV3X3RpbWVzKGRlbnRyeSk7CisJbmZzX3NldF92ZXJpZmllcihkZW50cnksIHZlcmlmaWVyKTsKKyBvdXRfdmFsaWQ6CisJdW5sb2NrX2tlcm5lbCgpOworCWRwdXQocGFyZW50KTsKKwlyZXR1cm4gMTsKK291dF96YXBfcGFyZW50OgorCW5mc196YXBfY2FjaGVzKGRpcik7Cisgb3V0X2JhZDoKKwlORlNfQ0FDSEVJTlYoZGlyKTsKKwlpZiAoaW5vZGUgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQkvKiBQdXJnZSByZWFkZGlyIGNhY2hlcy4gKi8KKwkJbmZzX3phcF9jYWNoZXMoaW5vZGUpOworCQkvKiBJZiB3ZSBoYXZlIHN1Ym1vdW50cywgZG9uJ3QgdW5oYXNoICEgKi8KKwkJaWYgKGhhdmVfc3VibW91bnRzKGRlbnRyeSkpCisJCQlnb3RvIG91dF92YWxpZDsKKwkJc2hyaW5rX2RjYWNoZV9wYXJlbnQoZGVudHJ5KTsKKwl9CisJZF9kcm9wKGRlbnRyeSk7CisJdW5sb2NrX2tlcm5lbCgpOworCWRwdXQocGFyZW50KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20gZHB1dCgpIHdoZW4gZF9jb3VudCBpcyBnb2luZyB0byAwLgorICovCitzdGF0aWMgaW50IG5mc19kZW50cnlfZGVsZXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlkZnByaW50ayhWRlMsICJORlM6IGRlbnRyeV9kZWxldGUoJXMvJXMsICV4KVxuIiwKKwkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCWRlbnRyeS0+ZF9mbGFncyk7CisKKwlpZiAoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX05GU0ZTX1JFTkFNRUQpIHsKKwkJLyogVW5oYXNoIGl0LCBzbyB0aGF0IC0+ZF9pcHV0KCkgd291bGQgYmUgY2FsbGVkICovCisJCXJldHVybiAxOworCX0KKwlpZiAoIShkZW50cnktPmRfc2ItPnNfZmxhZ3MgJiBNU19BQ1RJVkUpKSB7CisJCS8qIFVuaGFzaCBpdCwgc28gdGhhdCBhbmNlc3RvcnMgb2Yga2lsbGVkIGFzeW5jIHVubGluaworCQkgKiBmaWxlcyB3aWxsIGJlIGNsZWFuZWQgdXAgZHVyaW5nIHVtb3VudCAqLworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7CisKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIHRoZSBkZW50cnkgbG9zZXMgaW5vZGUuCisgKiBXZSB1c2UgaXQgdG8gY2xlYW4gdXAgc2lsbHktcmVuYW1lZCBmaWxlcy4KKyAqLworc3RhdGljIHZvaWQgbmZzX2RlbnRyeV9pcHV0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX05GU0ZTX1JFTkFNRUQpIHsKKwkJbG9ja19rZXJuZWwoKTsKKwkJaW5vZGUtPmlfbmxpbmstLTsKKwkJbmZzX2NvbXBsZXRlX3VubGluayhkZW50cnkpOworCQl1bmxvY2tfa2VybmVsKCk7CisJfQorCS8qIFdoZW4gY3JlYXRpbmcgYSBuZWdhdGl2ZSBkZW50cnksIHdlIHdhbnQgdG8gcmVuZXcgZF90aW1lICovCisJbmZzX3JlbmV3X3RpbWVzKGRlbnRyeSk7CisJaXB1dChpbm9kZSk7Cit9CisKK3N0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBuZnNfZGVudHJ5X29wZXJhdGlvbnMgPSB7CisJLmRfcmV2YWxpZGF0ZQk9IG5mc19sb29rdXBfcmV2YWxpZGF0ZSwKKwkuZF9kZWxldGUJPSBuZnNfZGVudHJ5X2RlbGV0ZSwKKwkuZF9pcHV0CQk9IG5mc19kZW50cnlfaXB1dCwKK307CisKK3N0YXRpYyBpbmxpbmUKK2ludCBuZnNfaXNfZXhjbHVzaXZlX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaWYgKE5GU19QUk9UTyhkaXIpLT52ZXJzaW9uID09IDIpCisJCXJldHVybiAwOworCWlmICghbmQgfHwgKG5kLT5mbGFncyAmIExPT0tVUF9DT05USU5VRSkgfHwgIShuZC0+ZmxhZ3MgJiBMT09LVVBfQ1JFQVRFKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIChuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgJiBPX0VYQ0wpICE9IDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpuZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpyZXM7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJaW50IGVycm9yOworCXN0cnVjdCBuZnNfZmggZmhhbmRsZTsKKwlzdHJ1Y3QgbmZzX2ZhdHRyIGZhdHRyOworCisJZGZwcmludGsoVkZTLCAiTkZTOiBsb29rdXAoJXMvJXMpXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlyZXMgPSBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiBORlNfU0VSVkVSKGRpciktPm5hbWVsZW4pCisJCWdvdG8gb3V0OworCisJcmVzID0gRVJSX1BUUigtRU5PTUVNKTsKKwlkZW50cnktPmRfb3AgPSBORlNfUFJPVE8oZGlyKS0+ZGVudHJ5X29wczsKKworCWxvY2tfa2VybmVsKCk7CisJLyogUmV2YWxpZGF0ZSBwYXJlbnQgZGlyZWN0b3J5IGF0dHJpYnV0ZSBjYWNoZSAqLworCWVycm9yID0gbmZzX3JldmFsaWRhdGVfaW5vZGUoTkZTX1NFUlZFUihkaXIpLCBkaXIpOworCWlmIChlcnJvciA8IDApIHsKKwkJcmVzID0gRVJSX1BUUihlcnJvcik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBJZiB3ZSdyZSBkb2luZyBhbiBleGNsdXNpdmUgY3JlYXRlLCBvcHRpbWl6ZSBhd2F5IHRoZSBsb29rdXAgKi8KKwlpZiAobmZzX2lzX2V4Y2x1c2l2ZV9jcmVhdGUoZGlyLCBuZCkpCisJCWdvdG8gbm9fZW50cnk7CisKKwllcnJvciA9IE5GU19QUk9UTyhkaXIpLT5sb29rdXAoZGlyLCAmZGVudHJ5LT5kX25hbWUsICZmaGFuZGxlLCAmZmF0dHIpOworCWlmIChlcnJvciA9PSAtRU5PRU5UKQorCQlnb3RvIG5vX2VudHJ5OworCWlmIChlcnJvciA8IDApIHsKKwkJcmVzID0gRVJSX1BUUihlcnJvcik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJcmVzID0gRVJSX1BUUigtRUFDQ0VTKTsKKwlpbm9kZSA9IG5mc19maGdldChkZW50cnktPmRfc2IsICZmaGFuZGxlLCAmZmF0dHIpOworCWlmICghaW5vZGUpCisJCWdvdG8gb3V0X3VubG9jazsKK25vX2VudHJ5OgorCXJlcyA9IGRfYWRkX3VuaXF1ZShkZW50cnksIGlub2RlKTsKKwlpZiAocmVzICE9IE5VTEwpCisJCWRlbnRyeSA9IHJlczsKKwluZnNfcmVuZXdfdGltZXMoZGVudHJ5KTsKKwluZnNfc2V0X3ZlcmlmaWVyKGRlbnRyeSwgbmZzX3NhdmVfY2hhbmdlX2F0dHJpYnV0ZShkaXIpKTsKK291dF91bmxvY2s6CisJdW5sb2NrX2tlcm5lbCgpOworb3V0OgorCXJldHVybiByZXM7Cit9CisKKyNpZmRlZiBDT05GSUdfTkZTX1Y0CitzdGF0aWMgaW50IG5mc19vcGVuX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOworCitzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgbmZzNF9kZW50cnlfb3BlcmF0aW9ucyA9IHsKKwkuZF9yZXZhbGlkYXRlCT0gbmZzX29wZW5fcmV2YWxpZGF0ZSwKKwkuZF9kZWxldGUJPSBuZnNfZGVudHJ5X2RlbGV0ZSwKKwkuZF9pcHV0CQk9IG5mc19kZW50cnlfaXB1dCwKK307CisKK3N0YXRpYyBpbnQgaXNfYXRvbWljX29wZW4oc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWlmICghbmQpCisJCXJldHVybiAwOworCS8qIENoZWNrIHRoYXQgd2UgYXJlIGluZGVlZCB0cnlpbmcgdG8gb3BlbiB0aGlzIGZpbGUgKi8KKwlpZiAoKG5kLT5mbGFncyAmIExPT0tVUF9DT05USU5VRSkgfHwgIShuZC0+ZmxhZ3MgJiBMT09LVVBfT1BFTikpCisJCXJldHVybiAwOworCS8qIE5GUyBkb2VzIG5vdCAoeWV0KSBoYXZlIGEgc3RhdGVmdWwgb3BlbiBmb3IgZGlyZWN0b3JpZXMgKi8KKwlpZiAobmQtPmZsYWdzICYgTE9PS1VQX0RJUkVDVE9SWSkKKwkJcmV0dXJuIDA7CisJLyogQXJlIHdlIHRyeWluZyB0byB3cml0ZSB0byBhIHJlYWQgb25seSBwYXJ0aXRpb24/ICovCisJaWYgKElTX1JET05MWShkaXIpICYmIChuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgJiAoT19DUkVBVHxPX1RSVU5DfEZNT0RFX1dSSVRFKSkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqbmZzX2F0b21pY19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGRlbnRyeSAqcmVzID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlpbnQgZXJyb3I7CisKKwkvKiBDaGVjayB0aGF0IHdlIGFyZSBpbmRlZWQgdHJ5aW5nIHRvIG9wZW4gdGhpcyBmaWxlICovCisJaWYgKCFpc19hdG9taWNfb3BlbihkaXIsIG5kKSkKKwkJZ290byBub19vcGVuOworCisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IE5GU19TRVJWRVIoZGlyKS0+bmFtZWxlbikgeworCQlyZXMgPSBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCQlnb3RvIG91dDsKKwl9CisJZGVudHJ5LT5kX29wID0gTkZTX1BST1RPKGRpciktPmRlbnRyeV9vcHM7CisKKwkvKiBMZXQgdmZzX2NyZWF0ZSgpIGRlYWwgd2l0aCBPX0VYQ0wgKi8KKwlpZiAobmQtPmludGVudC5vcGVuLmZsYWdzICYgT19FWENMKQorCQlnb3RvIG5vX2VudHJ5OworCisJLyogT3BlbiB0aGUgZmlsZSBvbiB0aGUgc2VydmVyICovCisJbG9ja19rZXJuZWwoKTsKKwkvKiBSZXZhbGlkYXRlIHBhcmVudCBkaXJlY3RvcnkgYXR0cmlidXRlIGNhY2hlICovCisJZXJyb3IgPSBuZnNfcmV2YWxpZGF0ZV9pbm9kZShORlNfU0VSVkVSKGRpciksIGRpcik7CisJaWYgKGVycm9yIDwgMCkgeworCQlyZXMgPSBFUlJfUFRSKGVycm9yKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKG5kLT5pbnRlbnQub3Blbi5mbGFncyAmIE9fQ1JFQVQpIHsKKwkJbmZzX2JlZ2luX2RhdGFfdXBkYXRlKGRpcik7CisJCWlub2RlID0gbmZzNF9hdG9taWNfb3BlbihkaXIsIGRlbnRyeSwgbmQpOworCQluZnNfZW5kX2RhdGFfdXBkYXRlKGRpcik7CisJfSBlbHNlCisJCWlub2RlID0gbmZzNF9hdG9taWNfb3BlbihkaXIsIGRlbnRyeSwgbmQpOworCXVubG9ja19rZXJuZWwoKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQllcnJvciA9IFBUUl9FUlIoaW5vZGUpOworCQlzd2l0Y2ggKGVycm9yKSB7CisJCQkvKiBNYWtlIGEgbmVnYXRpdmUgZGVudHJ5ICovCisJCQljYXNlIC1FTk9FTlQ6CisJCQkJaW5vZGUgPSBOVUxMOworCQkJCWJyZWFrOworCQkJLyogVGhpcyB0dXJuZWQgb3V0IG5vdCB0byBiZSBhIHJlZ3VsYXIgZmlsZSAqLworCQkJY2FzZSAtRUxPT1A6CisJCQkJaWYgKCEobmQtPmludGVudC5vcGVuLmZsYWdzICYgT19OT0ZPTExPVykpCisJCQkJCWdvdG8gbm9fb3BlbjsKKwkJCS8qIGNhc2UgLUVJU0RJUjogKi8KKwkJCS8qIGNhc2UgLUVJTlZBTDogKi8KKwkJCWRlZmF1bHQ6CisJCQkJcmVzID0gRVJSX1BUUihlcnJvcik7CisJCQkJZ290byBvdXQ7CisJCX0KKwl9Citub19lbnRyeToKKwlyZXMgPSBkX2FkZF91bmlxdWUoZGVudHJ5LCBpbm9kZSk7CisJaWYgKHJlcyAhPSBOVUxMKQorCQlkZW50cnkgPSByZXM7CisJbmZzX3JlbmV3X3RpbWVzKGRlbnRyeSk7CisJbmZzX3NldF92ZXJpZmllcihkZW50cnksIG5mc19zYXZlX2NoYW5nZV9hdHRyaWJ1dGUoZGlyKSk7CitvdXQ6CisJcmV0dXJuIHJlczsKK25vX29wZW46CisJcmV0dXJuIG5mc19sb29rdXAoZGlyLCBkZW50cnksIG5kKTsKK30KKworc3RhdGljIGludCBuZnNfb3Blbl9yZXZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqZGlyOworCXVuc2lnbmVkIGxvbmcgdmVyaWZpZXI7CisJaW50IG9wZW5mbGFncywgcmV0ID0gMDsKKworCXBhcmVudCA9IGRnZXRfcGFyZW50KGRlbnRyeSk7CisJZGlyID0gcGFyZW50LT5kX2lub2RlOworCWlmICghaXNfYXRvbWljX29wZW4oZGlyLCBuZCkpCisJCWdvdG8gbm9fb3BlbjsKKwkvKiBXZSBjYW4ndCBjcmVhdGUgbmV3IGZpbGVzIGluIG5mc19vcGVuX3JldmFsaWRhdGUoKSwgc28gd2UKKwkgKiBvcHRpbWl6ZSBhd2F5IHJldmFsaWRhdGlvbiBvZiBuZWdhdGl2ZSBkZW50cmllcy4KKwkgKi8KKwlpZiAoaW5vZGUgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJLyogTkZTIG9ubHkgc3VwcG9ydHMgT1BFTiBvbiByZWd1bGFyIGZpbGVzICovCisJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQlnb3RvIG5vX29wZW47CisJb3BlbmZsYWdzID0gbmQtPmludGVudC5vcGVuLmZsYWdzOworCS8qIFdlIGNhbm5vdCBkbyBleGNsdXNpdmUgY3JlYXRpb24gb24gYSBwb3NpdGl2ZSBkZW50cnkgKi8KKwlpZiAoKG9wZW5mbGFncyAmIChPX0NSRUFUfE9fRVhDTCkpID09IChPX0NSRUFUfE9fRVhDTCkpCisJCWdvdG8gbm9fb3BlbjsKKwkvKiBXZSBjYW4ndCBjcmVhdGUgbmV3IGZpbGVzLCBvciB0cnVuY2F0ZSBleGlzdGluZyBvbmVzIGhlcmUgKi8KKwlvcGVuZmxhZ3MgJj0gfihPX0NSRUFUfE9fVFJVTkMpOworCisJLyoKKwkgKiBOb3RlOiB3ZSdyZSBub3QgaG9sZGluZyBpbm9kZS0+aV9zZW0gYW5kIHNvIG1heSBiZSByYWNpbmcgd2l0aAorCSAqIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGRpcmVjdG9yeS4gV2UgdGhlcmVmb3JlIHNhdmUgdGhlCisJICogY2hhbmdlIGF0dHJpYnV0ZSAqYmVmb3JlKiB3ZSBkbyB0aGUgUlBDIGNhbGwuCisJICovCisJbG9ja19rZXJuZWwoKTsKKwl2ZXJpZmllciA9IG5mc19zYXZlX2NoYW5nZV9hdHRyaWJ1dGUoZGlyKTsKKwlyZXQgPSBuZnM0X29wZW5fcmV2YWxpZGF0ZShkaXIsIGRlbnRyeSwgb3BlbmZsYWdzKTsKKwlpZiAoIXJldCkKKwkJbmZzX3NldF92ZXJpZmllcihkZW50cnksIHZlcmlmaWVyKTsKKwl1bmxvY2tfa2VybmVsKCk7CitvdXQ6CisJZHB1dChwYXJlbnQpOworCWlmICghcmV0KQorCQlkX2Ryb3AoZGVudHJ5KTsKKwlyZXR1cm4gcmV0Oworbm9fb3BlbjoKKwlkcHV0KHBhcmVudCk7CisJaWYgKGlub2RlICE9IE5VTEwgJiYgbmZzX2hhdmVfZGVsZWdhdGlvbihpbm9kZSwgRk1PREVfUkVBRCkpCisJCXJldHVybiAxOworCXJldHVybiBuZnNfbG9va3VwX3JldmFsaWRhdGUoZGVudHJ5LCBuZCk7Cit9CisjZW5kaWYgLyogQ09ORklHX05GU1Y0ICovCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpuZnNfcmVhZGRpcl9sb29rdXAobmZzX3JlYWRkaXJfZGVzY3JpcHRvcl90ICpkZXNjKQoreworCXN0cnVjdCBkZW50cnkgKnBhcmVudCA9IGRlc2MtPmZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqZGlyID0gcGFyZW50LT5kX2lub2RlOworCXN0cnVjdCBuZnNfZW50cnkgKmVudHJ5ID0gZGVzYy0+ZW50cnk7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCAqYWxpYXM7CisJc3RydWN0IHFzdHIgbmFtZSA9IHsKKwkJLm5hbWUgPSBlbnRyeS0+bmFtZSwKKwkJLmxlbiA9IGVudHJ5LT5sZW4sCisJfTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJc3dpdGNoIChuYW1lLmxlbikgeworCQljYXNlIDI6CisJCQlpZiAobmFtZS5uYW1lWzBdID09ICcuJyAmJiBuYW1lLm5hbWVbMV0gPT0gJy4nKQorCQkJCXJldHVybiBkZ2V0X3BhcmVudChwYXJlbnQpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWlmIChuYW1lLm5hbWVbMF0gPT0gJy4nKQorCQkJCXJldHVybiBkZ2V0KHBhcmVudCk7CisJfQorCW5hbWUuaGFzaCA9IGZ1bGxfbmFtZV9oYXNoKG5hbWUubmFtZSwgbmFtZS5sZW4pOworCWRlbnRyeSA9IGRfbG9va3VwKHBhcmVudCwgJm5hbWUpOworCWlmIChkZW50cnkgIT0gTlVMTCkKKwkJcmV0dXJuIGRlbnRyeTsKKwlpZiAoIWRlc2MtPnBsdXMgfHwgIShlbnRyeS0+ZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFIpKQorCQlyZXR1cm4gTlVMTDsKKwkvKiBOb3RlOiBjYWxsZXIgaXMgYWxyZWFkeSBob2xkaW5nIHRoZSBkaXItPmlfc2VtISAqLworCWRlbnRyeSA9IGRfYWxsb2MocGFyZW50LCAmbmFtZSk7CisJaWYgKGRlbnRyeSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlkZW50cnktPmRfb3AgPSBORlNfUFJPVE8oZGlyKS0+ZGVudHJ5X29wczsKKwlpbm9kZSA9IG5mc19maGdldChkZW50cnktPmRfc2IsIGVudHJ5LT5maCwgZW50cnktPmZhdHRyKTsKKwlpZiAoIWlub2RlKSB7CisJCWRwdXQoZGVudHJ5KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWFsaWFzID0gZF9hZGRfdW5pcXVlKGRlbnRyeSwgaW5vZGUpOworCWlmIChhbGlhcyAhPSBOVUxMKSB7CisJCWRwdXQoZGVudHJ5KTsKKwkJZGVudHJ5ID0gYWxpYXM7CisJfQorCW5mc19yZW5ld190aW1lcyhkZW50cnkpOworCW5mc19zZXRfdmVyaWZpZXIoZGVudHJ5LCBuZnNfc2F2ZV9jaGFuZ2VfYXR0cmlidXRlKGRpcikpOworCXJldHVybiBkZW50cnk7Cit9CisKKy8qCisgKiBDb2RlIGNvbW1vbiB0byBjcmVhdGUsIG1rZGlyLCBhbmQgbWtub2QuCisgKi8KK2ludCBuZnNfaW5zdGFudGlhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQkJCXN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGVycm9yID0gLUVBQ0NFUzsKKworCS8qIFdlIG1heSBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgZnVydGhlciBkb3duICovCisJaWYgKGRlbnRyeS0+ZF9pbm9kZSkKKwkJcmV0dXJuIDA7CisJaWYgKGZoYW5kbGUtPnNpemUgPT0gMCkgeworCQlzdHJ1Y3QgaW5vZGUgKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJCWVycm9yID0gTkZTX1BST1RPKGRpciktPmxvb2t1cChkaXIsICZkZW50cnktPmRfbmFtZSwgZmhhbmRsZSwgZmF0dHIpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dF9lcnI7CisJfQorCWlmICghKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSKSkgeworCQlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NCKGRlbnRyeS0+ZF9zYik7CisJCWVycm9yID0gc2VydmVyLT5ycGNfb3BzLT5nZXRhdHRyKHNlcnZlciwgZmhhbmRsZSwgZmF0dHIpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXRfZXJyOworCX0KKwllcnJvciA9IC1FTk9NRU07CisJaW5vZGUgPSBuZnNfZmhnZXQoZGVudHJ5LT5kX3NiLCBmaGFuZGxlLCBmYXR0cik7CisJaWYgKGlub2RlID09IE5VTEwpCisJCWdvdG8gb3V0X2VycjsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiAwOworb3V0X2VycjoKKwlkX2Ryb3AoZGVudHJ5KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBGb2xsb3dpbmcgYSBmYWlsZWQgY3JlYXRlIG9wZXJhdGlvbiwgd2UgZHJvcCB0aGUgZGVudHJ5IHJhdGhlcgorICogdGhhbiByZXRhaW4gYSBuZWdhdGl2ZSBkZW50cnkuIFRoaXMgYXZvaWRzIGEgcHJvYmxlbSBpbiB0aGUgZXZlbnQKKyAqIHRoYXQgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQgb24gdGhlIHNlcnZlciwgYnV0IGFuIGVycm9yIGluIHRoZQorICogcmVwbHkgcGF0aCBtYWRlIGl0IGFwcGVhciB0byBoYXZlIGZhaWxlZC4KKyAqLworc3RhdGljIGludCBuZnNfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgaWF0dHIgYXR0cjsKKwlpbnQgZXJyb3I7CisJaW50IG9wZW5fZmxhZ3MgPSAwOworCisJZGZwcmludGsoVkZTLCAiTkZTOiBjcmVhdGUoJXMvJWxkLCAlc1xuIiwgZGlyLT5pX3NiLT5zX2lkLCAKKwkJZGlyLT5pX2lubywgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlhdHRyLmlhX21vZGUgPSBtb2RlOworCWF0dHIuaWFfdmFsaWQgPSBBVFRSX01PREU7CisKKwlpZiAobmQgJiYgKG5kLT5mbGFncyAmIExPT0tVUF9DUkVBVEUpKQorCQlvcGVuX2ZsYWdzID0gbmQtPmludGVudC5vcGVuLmZsYWdzOworCisJbG9ja19rZXJuZWwoKTsKKwluZnNfYmVnaW5fZGF0YV91cGRhdGUoZGlyKTsKKwllcnJvciA9IE5GU19QUk9UTyhkaXIpLT5jcmVhdGUoZGlyLCBkZW50cnksICZhdHRyLCBvcGVuX2ZsYWdzKTsKKwluZnNfZW5kX2RhdGFfdXBkYXRlKGRpcik7CisJaWYgKGVycm9yICE9IDApCisJCWdvdG8gb3V0X2VycjsKKwluZnNfcmVuZXdfdGltZXMoZGVudHJ5KTsKKwluZnNfc2V0X3ZlcmlmaWVyKGRlbnRyeSwgbmZzX3NhdmVfY2hhbmdlX2F0dHJpYnV0ZShkaXIpKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCXVubG9ja19rZXJuZWwoKTsKKwlkX2Ryb3AoZGVudHJ5KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBTZWUgY29tbWVudHMgZm9yIG5mc19wcm9jX2NyZWF0ZSByZWdhcmRpbmcgZmFpbGVkIG9wZXJhdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQKK25mc19ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwgZGV2X3QgcmRldikKK3sKKwlzdHJ1Y3QgaWF0dHIgYXR0cjsKKwlpbnQgc3RhdHVzOworCisJZGZwcmludGsoVkZTLCAiTkZTOiBta25vZCglcy8lbGQsICVzXG4iLCBkaXItPmlfc2ItPnNfaWQsCisJCWRpci0+aV9pbm8sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJaWYgKCFuZXdfdmFsaWRfZGV2KHJkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWF0dHIuaWFfbW9kZSA9IG1vZGU7CisJYXR0ci5pYV92YWxpZCA9IEFUVFJfTU9ERTsKKworCWxvY2tfa2VybmVsKCk7CisJbmZzX2JlZ2luX2RhdGFfdXBkYXRlKGRpcik7CisJc3RhdHVzID0gTkZTX1BST1RPKGRpciktPm1rbm9kKGRpciwgZGVudHJ5LCAmYXR0ciwgcmRldik7CisJbmZzX2VuZF9kYXRhX3VwZGF0ZShkaXIpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBvdXRfZXJyOworCW5mc19yZW5ld190aW1lcyhkZW50cnkpOworCW5mc19zZXRfdmVyaWZpZXIoZGVudHJ5LCBuZnNfc2F2ZV9jaGFuZ2VfYXR0cmlidXRlKGRpcikpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK291dF9lcnI6CisJdW5sb2NrX2tlcm5lbCgpOworCWRfZHJvcChkZW50cnkpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBTZWUgY29tbWVudHMgZm9yIG5mc19wcm9jX2NyZWF0ZSByZWdhcmRpbmcgZmFpbGVkIG9wZXJhdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQgbmZzX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQoreworCXN0cnVjdCBpYXR0ciBhdHRyOworCWludCBlcnJvcjsKKworCWRmcHJpbnRrKFZGUywgIk5GUzogbWtkaXIoJXMvJWxkLCAlc1xuIiwgZGlyLT5pX3NiLT5zX2lkLAorCQlkaXItPmlfaW5vLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWF0dHIuaWFfdmFsaWQgPSBBVFRSX01PREU7CisJYXR0ci5pYV9tb2RlID0gbW9kZSB8IFNfSUZESVI7CisKKwlsb2NrX2tlcm5lbCgpOworCW5mc19iZWdpbl9kYXRhX3VwZGF0ZShkaXIpOworCWVycm9yID0gTkZTX1BST1RPKGRpciktPm1rZGlyKGRpciwgZGVudHJ5LCAmYXR0cik7CisJbmZzX2VuZF9kYXRhX3VwZGF0ZShkaXIpOworCWlmIChlcnJvciAhPSAwKQorCQlnb3RvIG91dF9lcnI7CisJbmZzX3JlbmV3X3RpbWVzKGRlbnRyeSk7CisJbmZzX3NldF92ZXJpZmllcihkZW50cnksIG5mc19zYXZlX2NoYW5nZV9hdHRyaWJ1dGUoZGlyKSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworb3V0X2VycjoKKwlkX2Ryb3AoZGVudHJ5KTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IG5mc19ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWludCBlcnJvcjsKKworCWRmcHJpbnRrKFZGUywgIk5GUzogcm1kaXIoJXMvJWxkLCAlc1xuIiwgZGlyLT5pX3NiLT5zX2lkLAorCQlkaXItPmlfaW5vLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWxvY2tfa2VybmVsKCk7CisJbmZzX2JlZ2luX2RhdGFfdXBkYXRlKGRpcik7CisJZXJyb3IgPSBORlNfUFJPVE8oZGlyKS0+cm1kaXIoZGlyLCAmZGVudHJ5LT5kX25hbWUpOworCS8qIEVuc3VyZSB0aGUgVkZTIGRlbGV0ZXMgdGhpcyBpbm9kZSAqLworCWlmIChlcnJvciA9PSAwICYmIGRlbnRyeS0+ZF9pbm9kZSAhPSBOVUxMKQorCQlkZW50cnktPmRfaW5vZGUtPmlfbmxpbmsgPSAwOworCW5mc19lbmRfZGF0YV91cGRhdGUoZGlyKTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgbmZzX3NpbGx5cmVuYW1lKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RhdGljIHVuc2lnbmVkIGludCBzaWxseWNvdW50ZXI7CisJY29uc3QgaW50ICAgICAgaV9pbm9zaXplICA9IHNpemVvZihkaXItPmlfaW5vKSoyOworCWNvbnN0IGludCAgICAgIGNvdW50ZXJzaXplID0gc2l6ZW9mKHNpbGx5Y291bnRlcikqMjsKKwljb25zdCBpbnQgICAgICBzbGVuICAgICAgID0gc2l6ZW9mKCIubmZzIikgKyBpX2lub3NpemUgKyBjb3VudGVyc2l6ZSAtIDE7CisJY2hhciAgICAgICAgICAgc2lsbHlbc2xlbisxXTsKKwlzdHJ1Y3QgcXN0ciAgICBxc2lsbHk7CisJc3RydWN0IGRlbnRyeSAqc2RlbnRyeTsKKwlpbnQgICAgICAgICAgICBlcnJvciA9IC1FSU87CisKKwlkZnByaW50ayhWRlMsICJORlM6IHNpbGx5LXJlbmFtZSglcy8lcywgY3Q9JWQpXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSwgCisJCWF0b21pY19yZWFkKCZkZW50cnktPmRfY291bnQpKTsKKworI2lmZGVmIE5GU19QQVJBTk9JQQoraWYgKCFkZW50cnktPmRfaW5vZGUpCitwcmludGsoIk5GUzogc2lsbHktcmVuYW1pbmcgJXMvJXMsIG5lZ2F0aXZlIGRlbnRyeT8/XG4iLAorZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworI2VuZGlmCisJLyoKKwkgKiBXZSBkb24ndCBhbGxvdyBhIGRlbnRyeSB0byBiZSBzaWxseS1yZW5hbWVkIHR3aWNlLgorCSAqLworCWVycm9yID0gLUVCVVNZOworCWlmIChkZW50cnktPmRfZmxhZ3MgJiBEQ0FDSEVfTkZTRlNfUkVOQU1FRCkKKwkJZ290byBvdXQ7CisKKwlzcHJpbnRmKHNpbGx5LCAiLm5mcyUqLipseCIsCisJCWlfaW5vc2l6ZSwgaV9pbm9zaXplLCBkZW50cnktPmRfaW5vZGUtPmlfaW5vKTsKKworCXNkZW50cnkgPSBOVUxMOworCWRvIHsKKwkJY2hhciAqc3VmZml4ID0gc2lsbHkgKyBzbGVuIC0gY291bnRlcnNpemU7CisKKwkJZHB1dChzZGVudHJ5KTsKKwkJc2lsbHljb3VudGVyKys7CisJCXNwcmludGYoc3VmZml4LCAiJSouKngiLCBjb3VudGVyc2l6ZSwgY291bnRlcnNpemUsIHNpbGx5Y291bnRlcik7CisKKwkJZGZwcmludGsoVkZTLCAidHJ5aW5nIHRvIHJlbmFtZSAlcyB0byAlc1xuIiwKKwkJCSBkZW50cnktPmRfbmFtZS5uYW1lLCBzaWxseSk7CisJCQorCQlzZGVudHJ5ID0gbG9va3VwX29uZV9sZW4oc2lsbHksIGRlbnRyeS0+ZF9wYXJlbnQsIHNsZW4pOworCQkvKgorCQkgKiBOLkIuIEJldHRlciB0byByZXR1cm4gRUJVU1kgaGVyZSAuLi4gaXQgY291bGQgYmUKKwkJICogZGFuZ2Vyb3VzIHRvIGRlbGV0ZSB0aGUgZmlsZSB3aGlsZSBpdCdzIGluIHVzZS4KKwkJICovCisJCWlmIChJU19FUlIoc2RlbnRyeSkpCisJCQlnb3RvIG91dDsKKwl9IHdoaWxlKHNkZW50cnktPmRfaW5vZGUgIT0gTlVMTCk7IC8qIG5lZWQgbmVnYXRpdmUgbG9va3VwICovCisKKwlxc2lsbHkubmFtZSA9IHNpbGx5OworCXFzaWxseS5sZW4gID0gc3RybGVuKHNpbGx5KTsKKwluZnNfYmVnaW5fZGF0YV91cGRhdGUoZGlyKTsKKwlpZiAoZGVudHJ5LT5kX2lub2RlKSB7CisJCW5mc19iZWdpbl9kYXRhX3VwZGF0ZShkZW50cnktPmRfaW5vZGUpOworCQllcnJvciA9IE5GU19QUk9UTyhkaXIpLT5yZW5hbWUoZGlyLCAmZGVudHJ5LT5kX25hbWUsCisJCQkJZGlyLCAmcXNpbGx5KTsKKwkJbmZzX2VuZF9kYXRhX3VwZGF0ZShkZW50cnktPmRfaW5vZGUpOworCX0gZWxzZQorCQllcnJvciA9IE5GU19QUk9UTyhkaXIpLT5yZW5hbWUoZGlyLCAmZGVudHJ5LT5kX25hbWUsCisJCQkJZGlyLCAmcXNpbGx5KTsKKwluZnNfZW5kX2RhdGFfdXBkYXRlKGRpcik7CisJaWYgKCFlcnJvcikgeworCQluZnNfcmVuZXdfdGltZXMoZGVudHJ5KTsKKwkJbmZzX3NldF92ZXJpZmllcihkZW50cnksIG5mc19zYXZlX2NoYW5nZV9hdHRyaWJ1dGUoZGlyKSk7CisJCWRfbW92ZShkZW50cnksIHNkZW50cnkpOworCQllcnJvciA9IG5mc19hc3luY191bmxpbmsoZGVudHJ5KTsKKyAJCS8qIElmIHdlIHJldHVybiAwIHdlIGRvbid0IHVubGluayAqLworCX0KKwlkcHV0KHNkZW50cnkpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFJlbW92ZSBhIGZpbGUgYWZ0ZXIgbWFraW5nIHN1cmUgdGhlcmUgYXJlIG5vIHBlbmRpbmcgd3JpdGVzLAorICogYW5kIGFmdGVyIGNoZWNraW5nIHRoYXQgdGhlIGZpbGUgaGFzIG9ubHkgb25lIHVzZXIuIAorICoKKyAqIFdlIGludmFsaWRhdGUgdGhlIGF0dHJpYnV0ZSBjYWNoZSBhbmQgZnJlZSB0aGUgaW5vZGUgcHJpb3IgdG8gdGhlIG9wZXJhdGlvbgorICogdG8gYXZvaWQgcG9zc2libGUgcmFjZXMgaWYgdGhlIHNlcnZlciByZXVzZXMgdGhlIGlub2RlLgorICovCitzdGF0aWMgaW50IG5mc19zYWZlX3JlbW92ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGVycm9yID0gLUVCVVNZOworCQkKKwlkZnByaW50ayhWRlMsICJORlM6IHNhZmVfcmVtb3ZlKCVzLyVzKVxuIiwKKwkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJLyogSWYgdGhlIGRlbnRyeSB3YXMgc2lsbHlyZW5hbWVkLCB3ZSBzaW1wbHkgY2FsbCBkX2RlbGV0ZSgpICovCisJaWYgKGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9ORlNGU19SRU5BTUVEKSB7CisJCWVycm9yID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJbmZzX2JlZ2luX2RhdGFfdXBkYXRlKGRpcik7CisJaWYgKGlub2RlICE9IE5VTEwpIHsKKwkJbmZzX2JlZ2luX2RhdGFfdXBkYXRlKGlub2RlKTsKKwkJZXJyb3IgPSBORlNfUFJPVE8oZGlyKS0+cmVtb3ZlKGRpciwgJmRlbnRyeS0+ZF9uYW1lKTsKKwkJLyogVGhlIFZGUyBtYXkgd2FudCB0byBkZWxldGUgdGhpcyBpbm9kZSAqLworCQlpZiAoZXJyb3IgPT0gMCkKKwkJCWlub2RlLT5pX25saW5rLS07CisJCW5mc19lbmRfZGF0YV91cGRhdGUoaW5vZGUpOworCX0gZWxzZQorCQllcnJvciA9IE5GU19QUk9UTyhkaXIpLT5yZW1vdmUoZGlyLCAmZGVudHJ5LT5kX25hbWUpOworCW5mc19lbmRfZGF0YV91cGRhdGUoZGlyKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qICBXZSBkbyBzaWxseSByZW5hbWUuIEluIGNhc2Ugc2lsbHlyZW5hbWUoKSByZXR1cm5zIC1FQlVTWSwgdGhlIGlub2RlCisgKiAgYmVsb25ncyB0byBhbiBhY3RpdmUgIi5uZnMuLi4iIGZpbGUgYW5kIHdlIHJldHVybiAtRUJVU1kuCisgKgorICogIElmIHNpbGx5cmVuYW1lKCkgcmV0dXJucyAwLCB3ZSBkbyBub3RoaW5nLCBvdGhlcndpc2Ugd2UgdW5saW5rLgorICovCitzdGF0aWMgaW50IG5mc191bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgZXJyb3I7CisJaW50IG5lZWRfcmVoYXNoID0gMDsKKworCWRmcHJpbnRrKFZGUywgIk5GUzogdW5saW5rKCVzLyVsZCwgJXMpXG4iLCBkaXItPmlfc2ItPnNfaWQsCisJCWRpci0+aV9pbm8sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJbG9ja19rZXJuZWwoKTsKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlpZiAoYXRvbWljX3JlYWQoJmRlbnRyeS0+ZF9jb3VudCkgPiAxKSB7CisJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCWVycm9yID0gbmZzX3NpbGx5cmVuYW1lKGRpciwgZGVudHJ5KTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCWlmICghZF91bmhhc2hlZChkZW50cnkpKSB7CisJCV9fZF9kcm9wKGRlbnRyeSk7CisJCW5lZWRfcmVoYXNoID0gMTsKKwl9CisJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCWVycm9yID0gbmZzX3NhZmVfcmVtb3ZlKGRlbnRyeSk7CisJaWYgKCFlcnJvcikgeworCQluZnNfcmVuZXdfdGltZXMoZGVudHJ5KTsKKwkJbmZzX3NldF92ZXJpZmllcihkZW50cnksIG5mc19zYXZlX2NoYW5nZV9hdHRyaWJ1dGUoZGlyKSk7CisJfSBlbHNlIGlmIChuZWVkX3JlaGFzaCkKKwkJZF9yZWhhc2goZGVudHJ5KTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50CituZnNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpzeW1uYW1lKQoreworCXN0cnVjdCBpYXR0ciBhdHRyOworCXN0cnVjdCBuZnNfZmF0dHIgc3ltX2F0dHI7CisJc3RydWN0IG5mc19maCBzeW1fZmg7CisJc3RydWN0IHFzdHIgcXN5bW5hbWU7CisJaW50IGVycm9yOworCisJZGZwcmludGsoVkZTLCAiTkZTOiBzeW1saW5rKCVzLyVsZCwgJXMsICVzKVxuIiwgZGlyLT5pX3NiLT5zX2lkLAorCQlkaXItPmlfaW5vLCBkZW50cnktPmRfbmFtZS5uYW1lLCBzeW1uYW1lKTsKKworI2lmZGVmIE5GU19QQVJBTk9JQQoraWYgKGRlbnRyeS0+ZF9pbm9kZSkKK3ByaW50aygibmZzX3Byb2Nfc3ltbGluazogJXMvJXMgbm90IG5lZ2F0aXZlIVxuIiwKK2RlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKyNlbmRpZgorCS8qCisJICogRmlsbCBpbiB0aGUgc2F0dHIgZm9yIHRoZSBjYWxsLgorIAkgKiBOb3RlOiBTdW5PUyA0LjEuMiBjcmFzaGVzIGlmIHRoZSBtb2RlIGlzbid0IGluaXRpYWxpemVkIQorCSAqLworCWF0dHIuaWFfdmFsaWQgPSBBVFRSX01PREU7CisJYXR0ci5pYV9tb2RlID0gU19JRkxOSyB8IFNfSVJXWFVHTzsKKworCXFzeW1uYW1lLm5hbWUgPSBzeW1uYW1lOworCXFzeW1uYW1lLmxlbiAgPSBzdHJsZW4oc3ltbmFtZSk7CisKKwlsb2NrX2tlcm5lbCgpOworCW5mc19iZWdpbl9kYXRhX3VwZGF0ZShkaXIpOworCWVycm9yID0gTkZTX1BST1RPKGRpciktPnN5bWxpbmsoZGlyLCAmZGVudHJ5LT5kX25hbWUsICZxc3ltbmFtZSwKKwkJCQkJICAmYXR0ciwgJnN5bV9maCwgJnN5bV9hdHRyKTsKKwluZnNfZW5kX2RhdGFfdXBkYXRlKGRpcik7CisJaWYgKCFlcnJvcikgeworCQllcnJvciA9IG5mc19pbnN0YW50aWF0ZShkZW50cnksICZzeW1fZmgsICZzeW1fYXR0cik7CisJfSBlbHNlIHsKKwkJaWYgKGVycm9yID09IC1FRVhJU1QpCisJCQlwcmludGsoIm5mc19wcm9jX3N5bWxpbms6ICVzLyVzIGFscmVhZHkgZXhpc3RzPz9cbiIsCisJCQkgICAgICAgZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQlkX2Ryb3AoZGVudHJ5KTsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCAKK25mc19saW5rKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisJaW50IGVycm9yOworCisJZGZwcmludGsoVkZTLCAiTkZTOiBsaW5rKCVzLyVzIC0+ICVzLyVzKVxuIiwKKwkJb2xkX2RlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJLyoKKwkgKiBEcm9wIHRoZSBkZW50cnkgaW4gYWR2YW5jZSB0byBmb3JjZSBhIG5ldyBsb29rdXAuCisJICogU2luY2UgbmZzX3Byb2NfbGluayBkb2Vzbid0IHJldHVybiBhIGZpbGUgaGFuZGxlLAorCSAqIHdlIGNhbid0IHVzZSB0aGUgZXhpc3RpbmcgZGVudHJ5LgorCSAqLworCWxvY2tfa2VybmVsKCk7CisJZF9kcm9wKGRlbnRyeSk7CisKKwluZnNfYmVnaW5fZGF0YV91cGRhdGUoZGlyKTsKKwluZnNfYmVnaW5fZGF0YV91cGRhdGUoaW5vZGUpOworCWVycm9yID0gTkZTX1BST1RPKGRpciktPmxpbmsoaW5vZGUsIGRpciwgJmRlbnRyeS0+ZF9uYW1lKTsKKwluZnNfZW5kX2RhdGFfdXBkYXRlKGlub2RlKTsKKwluZnNfZW5kX2RhdGFfdXBkYXRlKGRpcik7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFJFTkFNRQorICogRklYTUU6IFNvbWUgbmZzZHMsIGxpa2UgdGhlIExpbnV4IHVzZXIgc3BhY2UgbmZzZCwgbWF5IGdlbmVyYXRlIGEKKyAqIGRpZmZlcmVudCBmaWxlIGhhbmRsZSBmb3IgdGhlIHNhbWUgaW5vZGUgYWZ0ZXIgYSByZW5hbWUgKGUuZy4gd2hlbgorICogbW92aW5nIHRvIGEgZGlmZmVyZW50IGRpcmVjdG9yeSkuIEEgZmFpbC1zYWZlIG1ldGhvZCB0byBkbyBzbyB3b3VsZAorICogYmUgdG8gbG9vayB1cCBvbGRfZGlyL29sZF9uYW1lLCBjcmVhdGUgYSBsaW5rIHRvIG5ld19kaXIvbmV3X25hbWUgYW5kCisgKiByZW5hbWUgdGhlIG9sZCBmaWxlIHVzaW5nIHRoZSBzaWxseXJlbmFtZSBzdHVmZi4gVGhpcyB3YXksIHRoZSBvcmlnaW5hbAorICogZmlsZSBpbiBvbGRfZGlyIHdpbGwgZ28gYXdheSB3aGVuIHRoZSBsYXN0IHByb2Nlc3MgaXB1dCgpcyB0aGUgaW5vZGUuCisgKgorICogRklYRUQuCisgKiAKKyAqIEl0IGFjdHVhbGx5IHdvcmtzIHF1aXRlIHdlbGwuIE9uZSBuZWVkcyB0byBoYXZlIHRoZSBwb3NzaWJpbGl0eSBmb3IKKyAqIGF0IGxlYXN0IG9uZSAiLm5mcy4uLiIgZmlsZSBpbiBlYWNoIGRpcmVjdG9yeSB0aGUgZmlsZSBldmVyIGdldHMKKyAqIG1vdmVkIG9yIGxpbmtlZCB0byB3aGljaCBoYXBwZW5zIGF1dG9tYWdpY2FsbHkgd2l0aCB0aGUgbmV3CisgKiBpbXBsZW1lbnRhdGlvbiB0aGF0IG9ubHkgZGVwZW5kcyBvbiB0aGUgZGNhY2hlIHN0dWZmIGluc3RlYWQgb2YKKyAqIHVzaW5nIHRoZSBpbm9kZSBsYXllcgorICoKKyAqIFVuZm9ydHVuYXRlbHksIHRoaW5ncyBhcmUgYSBsaXR0bGUgbW9yZSBjb21wbGljYXRlZCB0aGFuIGluZGljYXRlZAorICogYWJvdmUuIEZvciBhIGNyb3NzLWRpcmVjdG9yeSBtb3ZlLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBjYW4gZ2V0CisgKiByaWQgb2YgdGhlIG9sZCBpbm9kZSBhZnRlciB0aGUgb3BlcmF0aW9uLiAgVGhpcyBtZWFucyB0aGVyZSBtdXN0IGJlCisgKiBubyBwZW5kaW5nIHdyaXRlcyAoaWYgaXQncyBhIGZpbGUpLCBhbmQgdGhlIHVzZSBjb3VudCBtdXN0IGJlIDEuCisgKiBJZiB0aGVzZSBjb25kaXRpb25zIGFyZSBtZXQsIHdlIGNhbiBkcm9wIHRoZSBkZW50cmllcyBiZWZvcmUgZG9pbmcKKyAqIHRoZSByZW5hbWUuCisgKi8KK3N0YXRpYyBpbnQgbmZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCSAgICAgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKm9sZF9pbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICpuZXdfaW5vZGUgPSBuZXdfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IE5VTEwsICpyZWhhc2ggPSBOVUxMOworCWludCBlcnJvciA9IC1FQlVTWTsKKworCS8qCisJICogVG8gcHJldmVudCBhbnkgbmV3IHJlZmVyZW5jZXMgdG8gdGhlIHRhcmdldCBkdXJpbmcgdGhlIHJlbmFtZSwKKwkgKiB3ZSB1bmhhc2ggdGhlIGRlbnRyeSBhbmQgZnJlZSB0aGUgaW5vZGUgaW4gYWR2YW5jZS4KKwkgKi8KKwlsb2NrX2tlcm5lbCgpOworCWlmICghZF91bmhhc2hlZChuZXdfZGVudHJ5KSkgeworCQlkX2Ryb3AobmV3X2RlbnRyeSk7CisJCXJlaGFzaCA9IG5ld19kZW50cnk7CisJfQorCisJZGZwcmludGsoVkZTLCAiTkZTOiByZW5hbWUoJXMvJXMgLT4gJXMvJXMsIGN0PSVkKVxuIiwKKwkJIG9sZF9kZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgb2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCSBuZXdfZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIG5ld19kZW50cnktPmRfbmFtZS5uYW1lLAorCQkgYXRvbWljX3JlYWQoJm5ld19kZW50cnktPmRfY291bnQpKTsKKworCS8qCisJICogRmlyc3QgY2hlY2sgd2hldGhlciB0aGUgdGFyZ2V0IGlzIGJ1c3kgLi4uIHdlIGNhbid0CisJICogc2FmZWx5IGRvIF9hbnlfIHJlbmFtZSBpZiB0aGUgdGFyZ2V0IGlzIGluIHVzZS4KKwkgKgorCSAqIEZvciBmaWxlcywgbWFrZSBhIGNvcHkgb2YgdGhlIGRlbnRyeSBhbmQgdGhlbiBkbyBhIAorCSAqIHNpbGx5LXJlbmFtZS4gSWYgdGhlIHNpbGx5LXJlbmFtZSBzdWNjZWVkcywgdGhlCisJICogY29waWVkIGRlbnRyeSBpcyBoYXNoZWQgYW5kIGJlY29tZXMgdGhlIG5ldyB0YXJnZXQuCisJICovCisJaWYgKCFuZXdfaW5vZGUpCisJCWdvdG8gZ29fYWhlYWQ7CisJaWYgKFNfSVNESVIobmV3X2lub2RlLT5pX21vZGUpKQorCQlnb3RvIG91dDsKKwllbHNlIGlmIChhdG9taWNfcmVhZCgmbmV3X2RlbnRyeS0+ZF9jb3VudCkgPiAyKSB7CisJCWludCBlcnI7CisJCS8qIGNvcHkgdGhlIHRhcmdldCBkZW50cnkncyBuYW1lICovCisJCWRlbnRyeSA9IGRfYWxsb2MobmV3X2RlbnRyeS0+ZF9wYXJlbnQsCisJCQkJICZuZXdfZGVudHJ5LT5kX25hbWUpOworCQlpZiAoIWRlbnRyeSkKKwkJCWdvdG8gb3V0OworCisJCS8qIHNpbGx5LXJlbmFtZSB0aGUgZXhpc3RpbmcgdGFyZ2V0IC4uLiAqLworCQllcnIgPSBuZnNfc2lsbHlyZW5hbWUobmV3X2RpciwgbmV3X2RlbnRyeSk7CisJCWlmICghZXJyKSB7CisJCQluZXdfZGVudHJ5ID0gcmVoYXNoID0gZGVudHJ5OworCQkJbmV3X2lub2RlID0gTlVMTDsKKwkJCS8qIGluc3RhbnRpYXRlIHRoZSByZXBsYWNlbWVudCB0YXJnZXQgKi8KKwkJCWRfaW5zdGFudGlhdGUobmV3X2RlbnRyeSwgTlVMTCk7CisJCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJm5ld19kZW50cnktPmRfY291bnQpID4gMSkgeworCQkvKiBkZW50cnkgc3RpbGwgYnVzeT8gKi8KKyNpZmRlZiBORlNfUEFSQU5PSUEKKwkJCXByaW50aygibmZzX3JlbmFtZTogdGFyZ2V0ICVzLyVzIGJ1c3ksIGRfY291bnQ9JWRcbiIsCisJCQkgICAgICAgbmV3X2RlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLAorCQkJICAgICAgIG5ld19kZW50cnktPmRfbmFtZS5uYW1lLAorCQkJICAgICAgIGF0b21pY19yZWFkKCZuZXdfZGVudHJ5LT5kX2NvdW50KSk7CisjZW5kaWYKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCitnb19haGVhZDoKKwkvKgorCSAqIC4uLiBwcnVuZSBjaGlsZCBkZW50cmllcyBhbmQgd3JpdGViYWNrcyBpZiBuZWVkZWQuCisJICovCisJaWYgKGF0b21pY19yZWFkKCZvbGRfZGVudHJ5LT5kX2NvdW50KSA+IDEpIHsKKwkJbmZzX3diX2FsbChvbGRfaW5vZGUpOworCQlzaHJpbmtfZGNhY2hlX3BhcmVudChvbGRfZGVudHJ5KTsKKwl9CisKKwlpZiAobmV3X2lub2RlKQorCQlkX2RlbGV0ZShuZXdfZGVudHJ5KTsKKworCW5mc19iZWdpbl9kYXRhX3VwZGF0ZShvbGRfZGlyKTsKKwluZnNfYmVnaW5fZGF0YV91cGRhdGUobmV3X2Rpcik7CisJbmZzX2JlZ2luX2RhdGFfdXBkYXRlKG9sZF9pbm9kZSk7CisJZXJyb3IgPSBORlNfUFJPVE8ob2xkX2RpciktPnJlbmFtZShvbGRfZGlyLCAmb2xkX2RlbnRyeS0+ZF9uYW1lLAorCQkJCQkgICBuZXdfZGlyLCAmbmV3X2RlbnRyeS0+ZF9uYW1lKTsKKwluZnNfZW5kX2RhdGFfdXBkYXRlKG9sZF9pbm9kZSk7CisJbmZzX2VuZF9kYXRhX3VwZGF0ZShuZXdfZGlyKTsKKwluZnNfZW5kX2RhdGFfdXBkYXRlKG9sZF9kaXIpOworb3V0OgorCWlmIChyZWhhc2gpCisJCWRfcmVoYXNoKHJlaGFzaCk7CisJaWYgKCFlcnJvcikgeworCQlpZiAoIVNfSVNESVIob2xkX2lub2RlLT5pX21vZGUpKQorCQkJZF9tb3ZlKG9sZF9kZW50cnksIG5ld19kZW50cnkpOworCQluZnNfcmVuZXdfdGltZXMobmV3X2RlbnRyeSk7CisJCW5mc19zZXRfdmVyaWZpZXIobmV3X2RlbnRyeSwgbmZzX3NhdmVfY2hhbmdlX2F0dHJpYnV0ZShuZXdfZGlyKSk7CisJfQorCisJLyogbmV3IGRlbnRyeSBjcmVhdGVkPyAqLworCWlmIChkZW50cnkpCisJCWRwdXQoZGVudHJ5KTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgbmZzX2FjY2Vzc19nZXRfY2FjaGVkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwgc3RydWN0IG5mc19hY2Nlc3NfZW50cnkgKnJlcykKK3sKKwlzdHJ1Y3QgbmZzX2FjY2Vzc19lbnRyeSAqY2FjaGUgPSAmTkZTX0koaW5vZGUpLT5jYWNoZV9hY2Nlc3M7CisKKwlpZiAoY2FjaGUtPmNyZWQgIT0gY3JlZAorCQkJfHwgdGltZV9hZnRlcihqaWZmaWVzLCBjYWNoZS0+amlmZmllcyArIE5GU19BVFRSVElNRU8oaW5vZGUpKQorCQkJfHwgKE5GU19GTEFHUyhpbm9kZSkgJiBORlNfSU5PX0lOVkFMSURfQUNDRVNTKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJbWVtY3B5KHJlcywgY2FjaGUsIHNpemVvZigqcmVzKSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbmZzX2FjY2Vzc19hZGRfY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5mc19hY2Nlc3NfZW50cnkgKnNldCkKK3sKKwlzdHJ1Y3QgbmZzX2FjY2Vzc19lbnRyeSAqY2FjaGUgPSAmTkZTX0koaW5vZGUpLT5jYWNoZV9hY2Nlc3M7CisKKwlpZiAoY2FjaGUtPmNyZWQgIT0gc2V0LT5jcmVkKSB7CisJCWlmIChjYWNoZS0+Y3JlZCkKKwkJCXB1dF9ycGNjcmVkKGNhY2hlLT5jcmVkKTsKKwkJY2FjaGUtPmNyZWQgPSBnZXRfcnBjY3JlZChzZXQtPmNyZWQpOworCX0KKwlORlNfRkxBR1MoaW5vZGUpICY9IH5ORlNfSU5PX0lOVkFMSURfQUNDRVNTOworCWNhY2hlLT5qaWZmaWVzID0gc2V0LT5qaWZmaWVzOworCWNhY2hlLT5tYXNrID0gc2V0LT5tYXNrOworfQorCitzdGF0aWMgaW50IG5mc19kb19hY2Nlc3Moc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBpbnQgbWFzaykKK3sKKwlzdHJ1Y3QgbmZzX2FjY2Vzc19lbnRyeSBjYWNoZTsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gbmZzX2FjY2Vzc19nZXRfY2FjaGVkKGlub2RlLCBjcmVkLCAmY2FjaGUpOworCWlmIChzdGF0dXMgPT0gMCkKKwkJZ290byBvdXQ7CisKKwkvKiBCZSBjbGV2ZXI6IGFzayBzZXJ2ZXIgdG8gY2hlY2sgZm9yIGFsbCBwb3NzaWJsZSByaWdodHMgKi8KKwljYWNoZS5tYXNrID0gTUFZX0VYRUMgfCBNQVlfV1JJVEUgfCBNQVlfUkVBRDsKKwljYWNoZS5jcmVkID0gY3JlZDsKKwljYWNoZS5qaWZmaWVzID0gamlmZmllczsKKwlzdGF0dXMgPSBORlNfUFJPVE8oaW5vZGUpLT5hY2Nlc3MoaW5vZGUsICZjYWNoZSk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gc3RhdHVzOworCW5mc19hY2Nlc3NfYWRkX2NhY2hlKGlub2RlLCAmY2FjaGUpOworb3V0OgorCWlmICgoY2FjaGUubWFzayAmIG1hc2spID09IG1hc2spCisJCXJldHVybiAwOworCXJldHVybiAtRUFDQ0VTOworfQorCitpbnQgbmZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBycGNfY3JlZCAqY3JlZDsKKwlpbnQgcmVzID0gMDsKKworCWlmIChtYXNrID09IDApCisJCWdvdG8gb3V0OworCS8qIElzIHRoaXMgc3lzX2FjY2VzcygpID8gKi8KKwlpZiAobmQgIT0gTlVMTCAmJiAobmQtPmZsYWdzICYgTE9PS1VQX0FDQ0VTUykpCisJCWdvdG8gZm9yY2VfbG9va3VwOworCisJc3dpdGNoIChpbm9kZS0+aV9tb2RlICYgU19JRk1UKSB7CisJCWNhc2UgU19JRkxOSzoKKwkJCWdvdG8gb3V0OworCQljYXNlIFNfSUZSRUc6CisJCQkvKiBORlN2NCBoYXMgYXRvbWljX29wZW4uLi4gKi8KKwkJCWlmIChuZnNfc2VydmVyX2NhcGFibGUoaW5vZGUsIE5GU19DQVBfQVRPTUlDX09QRU4pCisJCQkJCSYmIG5kICE9IE5VTEwKKwkJCQkJJiYgKG5kLT5mbGFncyAmIExPT0tVUF9PUEVOKSkKKwkJCQlnb3RvIG91dDsKKwkJCWJyZWFrOworCQljYXNlIFNfSUZESVI6CisJCQkvKgorCQkJICogT3B0aW1pemUgYXdheSBhbGwgd3JpdGUgb3BlcmF0aW9ucywgc2luY2UgdGhlIHNlcnZlcgorCQkJICogd2lsbCBjaGVjayBwZXJtaXNzaW9ucyB3aGVuIHdlIHBlcmZvcm0gdGhlIG9wLgorCQkJICovCisJCQlpZiAoKG1hc2sgJiBNQVlfV1JJVEUpICYmICEobWFzayAmIE1BWV9SRUFEKSkKKwkJCQlnb3RvIG91dDsKKwl9CisKK2ZvcmNlX2xvb2t1cDoKKwlsb2NrX2tlcm5lbCgpOworCisJaWYgKCFORlNfUFJPVE8oaW5vZGUpLT5hY2Nlc3MpCisJCWdvdG8gb3V0X25vdHN1cDsKKworCWNyZWQgPSBycGNhdXRoX2xvb2t1cGNyZWQoTkZTX0NMSUVOVChpbm9kZSktPmNsX2F1dGgsIDApOworCWlmICghSVNfRVJSKGNyZWQpKSB7CisJCXJlcyA9IG5mc19kb19hY2Nlc3MoaW5vZGUsIGNyZWQsIG1hc2spOworCQlwdXRfcnBjY3JlZChjcmVkKTsKKwl9IGVsc2UKKwkJcmVzID0gUFRSX0VSUihjcmVkKTsKKwl1bmxvY2tfa2VybmVsKCk7CitvdXQ6CisJcmV0dXJuIHJlczsKK291dF9ub3RzdXA6CisJcmVzID0gbmZzX3JldmFsaWRhdGVfaW5vZGUoTkZTX1NFUlZFUihpbm9kZSksIGlub2RlKTsKKwlpZiAocmVzID09IDApCisJCXJlcyA9IGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgTlVMTCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgdmVyc2lvbi1jb250cm9sOiB0CisgKiAga2VwdC1uZXctdmVyc2lvbnM6IDUKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2RpcmVjdC5jIGIvZnMvbmZzL2RpcmVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZGY4MDMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvZGlyZWN0LmMKQEAgLTAsMCArMSw4MDggQEAKKy8qCisgKiBsaW51eC9mcy9uZnMvZGlyZWN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgYnkgQ2h1Y2sgTGV2ZXIgPGNlbEBuZXRhcHAuY29tPgorICoKKyAqIEhpZ2gtcGVyZm9ybWFuY2UgdW5jYWNoZWQgSS9PIGZvciB0aGUgTGludXggTkZTIGNsaWVudAorICoKKyAqIFRoZXJlIGFyZSBpbXBvcnRhbnQgYXBwbGljYXRpb25zIHdob3NlIHBlcmZvcm1hbmNlIG9yIGNvcnJlY3RuZXNzCisgKiBkZXBlbmRzIG9uIHVuY2FjaGVkIGFjY2VzcyB0byBmaWxlIGRhdGEuICBEYXRhYmFzZSBjbHVzdGVycworICogKG11bHRpcGxlIGNvcGllcyBvZiB0aGUgc2FtZSBpbnN0YW5jZSBydW5uaW5nIG9uIHNlcGFyYXRlIGhvc3RzKSAKKyAqIGltcGxlbWVudCB0aGVpciBvd24gY2FjaGUgY29oZXJlbmN5IHByb3RvY29sIHRoYXQgc3Vic3VtZXMgZmlsZQorICogc3lzdGVtIGNhY2hlIHByb3RvY29scy4gIEFwcGxpY2F0aW9ucyB0aGF0IHByb2Nlc3MgZGF0YXNldHMgCisgKiBjb25zaWRlcmFibHkgbGFyZ2VyIHRoYW4gdGhlIGNsaWVudCdzIG1lbW9yeSBkbyBub3QgYWx3YXlzIGJlbmVmaXQgCisgKiBmcm9tIGEgbG9jYWwgY2FjaGUuICBBIHN0cmVhbWluZyB2aWRlbyBzZXJ2ZXIsIGZvciBpbnN0YW5jZSwgaGFzIG5vIAorICogbmVlZCB0byBjYWNoZSB0aGUgY29udGVudHMgb2YgYSBmaWxlLgorICoKKyAqIFdoZW4gYW4gYXBwbGljYXRpb24gcmVxdWVzdHMgdW5jYWNoZWQgSS9PLCBhbGwgcmVhZCBhbmQgd3JpdGUgcmVxdWVzdHMKKyAqIGFyZSBtYWRlIGRpcmVjdGx5IHRvIHRoZSBzZXJ2ZXI7IGRhdGEgc3RvcmVkIG9yIGZldGNoZWQgdmlhIHRoZXNlCisgKiByZXF1ZXN0cyBpcyBub3QgY2FjaGVkIGluIHRoZSBMaW51eCBwYWdlIGNhY2hlLiAgVGhlIGNsaWVudCBkb2VzIG5vdAorICogY29ycmVjdCB1bmFsaWduZWQgcmVxdWVzdHMgZnJvbSBhcHBsaWNhdGlvbnMuICBBbGwgcmVxdWVzdGVkIGJ5dGVzIGFyZQorICogaGVsZCBvbiBwZXJtYW5lbnQgc3RvcmFnZSBiZWZvcmUgYSBkaXJlY3Qgd3JpdGUgc3lzdGVtIGNhbGwgcmV0dXJucyB0bworICogYW4gYXBwbGljYXRpb24uCisgKgorICogU29sYXJpcyBpbXBsZW1lbnRzIGFuIHVuY2FjaGVkIEkvTyBmYWNpbGl0eSBjYWxsZWQgZGlyZWN0aW8oKSB0aGF0CisgKiBpcyB1c2VkIGZvciBiYWNrdXBzIGFuZCBzZXF1ZW50aWFsIEkvTyB0byB2ZXJ5IGxhcmdlIGZpbGVzLiAgU29sYXJpcworICogYWxzbyBzdXBwb3J0cyB1bmNhY2hpbmcgd2hvbGUgTkZTIHBhcnRpdGlvbnMgd2l0aCAiLW8gZm9yY2VkaXJlY3RpbywiCisgKiBhbiB1bmRvY3VtZW50ZWQgbW91bnQgb3B0aW9uLgorICoKKyAqIERlc2lnbmVkIGJ5IEplZmYgS2ltbWVsLCBDaHVjayBMZXZlciwgYW5kIFRyb25kIE15a2xlYnVzdCwgd2l0aAorICogaGVscCBmcm9tIEFuZHJldyBNb3J0b24uCisgKgorICogMTggRGVjIDIwMDEJSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBmb3IgMi40ICAtLWNlbAorICogMDggSnVsIDIwMDIJVmVyc2lvbiBmb3IgMi40LjE5LCB3aXRoIGJ1ZyBmaXhlcyAtLXRyb25kbXkKKyAqIDA4IEp1biAyMDAzCVBvcnQgdG8gMi41IEFQSXMgIC0tY2VsCisgKiAzMSBNYXIgMjAwNAlIYW5kbGUgZGlyZWN0IEkvTyB3aXRob3V0IFZGUyBzdXBwb3J0ICAtLWNlbAorICogMTUgU2VwIDIwMDQJUGFyYWxsZWwgYXN5bmMgcmVhZHMgIC0tY2VsCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKworI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworI2RlZmluZSBORlNEQkdfRkFDSUxJVFkJCU5GU0RCR19WRlMKKyNkZWZpbmUgTUFYX0RJUkVDVElPX1NJWkUJKDQwOTZVTCA8PCBQQUdFX1NISUZUKQorCitzdGF0aWMga21lbV9jYWNoZV90ICpuZnNfZGlyZWN0X2NhY2hlcDsKKworLyoKKyAqIFRoaXMgcmVwcmVzZW50cyBhIHNldCBvZiBhc3luY2hyb25vdXMgcmVxdWVzdHMgdGhhdCB3ZSdyZSB3YWl0aW5nIG9uCisgKi8KK3N0cnVjdCBuZnNfZGlyZWN0X3JlcSB7CisJc3RydWN0IGtyZWYJCWtyZWY7CQkvKiByZWxlYXNlIG1hbmFnZXIgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CQkvKiBuZnNfcmVhZF9kYXRhIHN0cnVjdHMgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0OwkJLyogd2FpdCBmb3IgaS9vIGNvbXBsZXRpb24gKi8KKwlzdHJ1Y3QgcGFnZSAqKgkJcGFnZXM7CQkvKiBwYWdlcyBpbiBvdXIgYnVmZmVyICovCisJdW5zaWduZWQgaW50CQlucGFnZXM7CQkvKiBjb3VudCBvZiBwYWdlcyAqLworCWF0b21pY190CQljb21wbGV0ZSwJLyogaS9vcyB3ZSdyZSB3YWl0aW5nIGZvciAqLworCQkJCWNvdW50LAkJLyogYnl0ZXMgYWN0dWFsbHkgcHJvY2Vzc2VkICovCisJCQkJZXJyb3I7CQkvKiBhbnkgcmVwb3J0ZWQgZXJyb3IgKi8KK307CisKKworLyoqCisgKiBuZnNfZ2V0X3VzZXJfcGFnZXMgLSBmaW5kIGFuZCBzZXQgdXAgcGFnZXMgdW5kZXJseWluZyB1c2VyJ3MgYnVmZmVyCisgKiBydzogZGlyZWN0aW9uIChyZWFkIG9yIHdyaXRlKQorICogdXNlcl9hZGRyOiBzdGFydGluZyBhZGRyZXNzIG9mIHRoaXMgc2VnbWVudCBvZiB1c2VyJ3MgYnVmZmVyCisgKiBjb3VudDogc2l6ZSBvZiB0aGlzIHNlZ21lbnQKKyAqIEBwYWdlczogcmV0dXJuZWQgYXJyYXkgb2YgcGFnZSBzdHJ1Y3QgcG9pbnRlcnMgdW5kZXJseWluZyB1c2VyJ3MgYnVmZmVyCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CituZnNfZ2V0X3VzZXJfcGFnZXMoaW50IHJ3LCB1bnNpZ25lZCBsb25nIHVzZXJfYWRkciwgc2l6ZV90IHNpemUsCisJCXN0cnVjdCBwYWdlICoqKnBhZ2VzKQoreworCWludCByZXN1bHQgPSAtRU5PTUVNOworCXVuc2lnbmVkIGxvbmcgcGFnZV9jb3VudDsKKwlzaXplX3QgYXJyYXlfc2l6ZTsKKworCS8qIHNldCBhbiBhcmJpdHJhcnkgbGltaXQgdG8gcHJldmVudCB0eXBlIG92ZXJmbG93ICovCisJLyogWFhYOiB0aGlzIGNhbiBwcm9iYWJseSBiZSBhcyBsYXJnZSBhcyBJTlRfTUFYICovCisJaWYgKHNpemUgPiBNQVhfRElSRUNUSU9fU0laRSkgeworCQkqcGFnZXMgPSBOVUxMOworCQlyZXR1cm4gLUVGQklHOworCX0KKworCXBhZ2VfY291bnQgPSAodXNlcl9hZGRyICsgc2l6ZSArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJcGFnZV9jb3VudCAtPSB1c2VyX2FkZHIgPj4gUEFHRV9TSElGVDsKKworCWFycmF5X3NpemUgPSAocGFnZV9jb3VudCAqIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSk7CisJKnBhZ2VzID0ga21hbGxvYyhhcnJheV9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoKnBhZ2VzKSB7CisJCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwkJcmVzdWx0ID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sIHVzZXJfYWRkciwKKwkJCQkJcGFnZV9jb3VudCwgKHJ3ID09IFJFQUQpLCAwLAorCQkJCQkqcGFnZXMsIE5VTEwpOworCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIG5mc19mcmVlX3VzZXJfcGFnZXMgLSB0ZWFyIGRvd24gcGFnZSBzdHJ1Y3QgYXJyYXkKKyAqIEBwYWdlczogYXJyYXkgb2YgcGFnZSBzdHJ1Y3QgcG9pbnRlcnMgdW5kZXJseWluZyB0YXJnZXQgYnVmZmVyCisgKiBAbnBhZ2VzOiBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIGFycmF5CisgKiBAZG9fZGlydHk6IGRpcnR5IHRoZSBwYWdlcyBhcyB3ZSByZWxlYXNlIHRoZW0KKyAqLworc3RhdGljIHZvaWQKK25mc19mcmVlX3VzZXJfcGFnZXMoc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IG5wYWdlcywgaW50IGRvX2RpcnR5KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykgeworCQlpZiAoZG9fZGlydHkpCisJCQlzZXRfcGFnZV9kaXJ0eV9sb2NrKHBhZ2VzW2ldKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2VzW2ldKTsKKwl9CisJa2ZyZWUocGFnZXMpOworfQorCisvKioKKyAqIG5mc19kaXJlY3RfcmVxX3JlbGVhc2UgLSByZWxlYXNlICBuZnNfZGlyZWN0X3JlcSBzdHJ1Y3R1cmUgZm9yIGRpcmVjdCByZWFkCisgKiBAa3JlZjoga3JlZiBvYmplY3QgZW1iZWRkZWQgaW4gYW4gbmZzX2RpcmVjdF9yZXEgc3RydWN0dXJlCisgKgorICovCitzdGF0aWMgdm9pZCBuZnNfZGlyZWN0X3JlcV9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBuZnNfZGlyZWN0X3JlcSAqZHJlcSA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgbmZzX2RpcmVjdF9yZXEsIGtyZWYpOworCWttZW1fY2FjaGVfZnJlZShuZnNfZGlyZWN0X2NhY2hlcCwgZHJlcSk7Cit9CisKKy8qKgorICogbmZzX2RpcmVjdF9yZWFkX2FsbG9jIC0gYWxsb2NhdGUgbmZzX3JlYWRfZGF0YSBzdHJ1Y3R1cmVzIGZvciBkaXJlY3QgcmVhZAorICogQGNvdW50OiBjb3VudCBvZiBieXRlcyBmb3IgdGhlIHJlYWQgcmVxdWVzdAorICogQHJzaXplOiBsb2NhbCByc2l6ZSBzZXR0aW5nCisgKgorICogTm90ZSB3ZSBhbHNvIHNldCB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIHdlIGhhdmUgaW4gdGhlIGRyZXEgd2hlbiB3ZSBhcmUKKyAqIGRvbmUuICBUaGlzIHByZXZlbnRzIHJhY2VzIHdpdGggSS9PIGNvbXBsZXRpb24gc28gd2Ugd2lsbCBhbHdheXMgd2FpdAorICogdW50aWwgYWxsIHJlcXVlc3RzIGhhdmUgYmVlbiBkaXNwYXRjaGVkIGFuZCBjb21wbGV0ZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmZzX2RpcmVjdF9yZXEgKm5mc19kaXJlY3RfcmVhZF9hbGxvYyhzaXplX3QgbmJ5dGVzLCB1bnNpZ25lZCBpbnQgcnNpemUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgbmZzX2RpcmVjdF9yZXEgKmRyZXE7CisJdW5zaWduZWQgaW50IHJlYWRzID0gMDsKKworCWRyZXEgPSBrbWVtX2NhY2hlX2FsbG9jKG5mc19kaXJlY3RfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFkcmVxKQorCQlyZXR1cm4gTlVMTDsKKworCWtyZWZfaW5pdCgmZHJlcS0+a3JlZik7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZHJlcS0+d2FpdCk7CisJSU5JVF9MSVNUX0hFQUQoJmRyZXEtPmxpc3QpOworCWF0b21pY19zZXQoJmRyZXEtPmNvdW50LCAwKTsKKwlhdG9taWNfc2V0KCZkcmVxLT5lcnJvciwgMCk7CisKKwlsaXN0ID0gJmRyZXEtPmxpc3Q7CisJZm9yKDs7KSB7CisJCXN0cnVjdCBuZnNfcmVhZF9kYXRhICpkYXRhID0gbmZzX3JlYWRkYXRhX2FsbG9jKCk7CisKKwkJaWYgKHVubGlrZWx5KCFkYXRhKSkgeworCQkJd2hpbGUgKCFsaXN0X2VtcHR5KGxpc3QpKSB7CisJCQkJZGF0YSA9IGxpc3RfZW50cnkobGlzdC0+bmV4dCwKKwkJCQkJCSAgc3RydWN0IG5mc19yZWFkX2RhdGEsIHBhZ2VzKTsKKwkJCQlsaXN0X2RlbCgmZGF0YS0+cGFnZXMpOworCQkJCW5mc19yZWFkZGF0YV9mcmVlKGRhdGEpOworCQkJfQorCQkJa3JlZl9wdXQoJmRyZXEtPmtyZWYsIG5mc19kaXJlY3RfcmVxX3JlbGVhc2UpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlJTklUX0xJU1RfSEVBRCgmZGF0YS0+cGFnZXMpOworCQlsaXN0X2FkZCgmZGF0YS0+cGFnZXMsIGxpc3QpOworCisJCWRhdGEtPnJlcSA9IChzdHJ1Y3QgbmZzX3BhZ2UgKikgZHJlcTsKKwkJcmVhZHMrKzsKKwkJaWYgKG5ieXRlcyA8PSByc2l6ZSkKKwkJCWJyZWFrOworCQluYnl0ZXMgLT0gcnNpemU7CisJfQorCWtyZWZfZ2V0KCZkcmVxLT5rcmVmKTsKKwlhdG9taWNfc2V0KCZkcmVxLT5jb21wbGV0ZSwgcmVhZHMpOworCXJldHVybiBkcmVxOworfQorCisvKioKKyAqIG5mc19kaXJlY3RfcmVhZF9yZXN1bHQgLSBoYW5kbGUgYSByZWFkIHJlcGx5IGZvciBhIGRpcmVjdCByZWFkIHJlcXVlc3QKKyAqIEBkYXRhOiBhZGRyZXNzIG9mIE5GUyBSRUFEIG9wZXJhdGlvbiBjb250cm9sIGJsb2NrCisgKiBAc3RhdHVzOiBzdGF0dXMgb2YgdGhpcyBORlMgUkVBRCBvcGVyYXRpb24KKyAqCisgKiBXZSBtdXN0IGhvbGQgYSByZWZlcmVuY2UgdG8gYWxsIHRoZSBwYWdlcyBpbiB0aGlzIGRpcmVjdCByZWFkIHJlcXVlc3QKKyAqIHVudGlsIHRoZSBSUENzIGNvbXBsZXRlLiAgVGhpcyBjb3VsZCBiZSBsb25nICphZnRlciogd2UgYXJlIHdva2VuIHVwIGluCisgKiBuZnNfZGlyZWN0X3JlYWRfd2FpdCAoZm9yIGluc3RhbmNlLCBpZiBzb21lb25lIGhpdHMgXkMgb24gYSBzbG93IHNlcnZlcikuCisgKi8KK3N0YXRpYyB2b2lkIG5mc19kaXJlY3RfcmVhZF9yZXN1bHQoc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGEsIGludCBzdGF0dXMpCit7CisJc3RydWN0IG5mc19kaXJlY3RfcmVxICpkcmVxID0gKHN0cnVjdCBuZnNfZGlyZWN0X3JlcSAqKSBkYXRhLT5yZXE7CisKKwlpZiAobGlrZWx5KHN0YXR1cyA+PSAwKSkKKwkJYXRvbWljX2FkZChkYXRhLT5yZXMuY291bnQsICZkcmVxLT5jb3VudCk7CisJZWxzZQorCQlhdG9taWNfc2V0KCZkcmVxLT5lcnJvciwgc3RhdHVzKTsKKworCWlmICh1bmxpa2VseShhdG9taWNfZGVjX2FuZF90ZXN0KCZkcmVxLT5jb21wbGV0ZSkpKSB7CisJCW5mc19mcmVlX3VzZXJfcGFnZXMoZHJlcS0+cGFnZXMsIGRyZXEtPm5wYWdlcywgMSk7CisJCXdha2VfdXAoJmRyZXEtPndhaXQpOworCQlrcmVmX3B1dCgmZHJlcS0+a3JlZiwgbmZzX2RpcmVjdF9yZXFfcmVsZWFzZSk7CisJfQorfQorCisvKioKKyAqIG5mc19kaXJlY3RfcmVhZF9zY2hlZHVsZSAtIGRpc3BhdGNoIE5GUyBSRUFEIG9wZXJhdGlvbnMgZm9yIGEgZGlyZWN0IHJlYWQKKyAqIEBkcmVxOiBhZGRyZXNzIG9mIG5mc19kaXJlY3RfcmVxIHN0cnVjdCBmb3IgdGhpcyByZXF1ZXN0CisgKiBAaW5vZGU6IHRhcmdldCBpbm9kZQorICogQGN0eDogdGFyZ2V0IGZpbGUgb3BlbiBjb250ZXh0CisgKiBAdXNlcl9hZGRyOiBzdGFydGluZyBhZGRyZXNzIG9mIHRoaXMgc2VnbWVudCBvZiB1c2VyJ3MgYnVmZmVyCisgKiBAY291bnQ6IHNpemUgb2YgdGhpcyBzZWdtZW50CisgKiBAZmlsZV9vZmZzZXQ6IG9mZnNldCBpbiBmaWxlIHRvIGJlZ2luIHRoZSBvcGVyYXRpb24KKyAqCisgKiBGb3IgZWFjaCBuZnNfcmVhZF9kYXRhIHN0cnVjdCB0aGF0IHdhcyBhbGxvY2F0ZWQgb24gdGhlIGxpc3QsIGRpc3BhdGNoCisgKiBhbiBORlMgUkVBRCBvcGVyYXRpb24KKyAqLworc3RhdGljIHZvaWQgbmZzX2RpcmVjdF9yZWFkX3NjaGVkdWxlKHN0cnVjdCBuZnNfZGlyZWN0X3JlcSAqZHJlcSwKKwkJc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCwKKwkJdW5zaWduZWQgbG9uZyB1c2VyX2FkZHIsIHNpemVfdCBjb3VudCwgbG9mZl90IGZpbGVfb2Zmc2V0KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QgPSAmZHJlcS0+bGlzdDsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gZHJlcS0+cGFnZXM7CisJdW5zaWduZWQgaW50IGN1cnBhZ2UsIHBnYmFzZTsKKwl1bnNpZ25lZCBpbnQgcnNpemUgPSBORlNfU0VSVkVSKGlub2RlKS0+cnNpemU7CisKKwljdXJwYWdlID0gMDsKKwlwZ2Jhc2UgPSB1c2VyX2FkZHIgJiB+UEFHRV9NQVNLOworCWRvIHsKKwkJc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGE7CisJCXVuc2lnbmVkIGludCBieXRlczsKKworCQlieXRlcyA9IHJzaXplOworCQlpZiAoY291bnQgPCByc2l6ZSkKKwkJCWJ5dGVzID0gY291bnQ7CisKKwkJZGF0YSA9IGxpc3RfZW50cnkobGlzdC0+bmV4dCwgc3RydWN0IG5mc19yZWFkX2RhdGEsIHBhZ2VzKTsKKwkJbGlzdF9kZWxfaW5pdCgmZGF0YS0+cGFnZXMpOworCisJCWRhdGEtPmlub2RlID0gaW5vZGU7CisJCWRhdGEtPmNyZWQgPSBjdHgtPmNyZWQ7CisJCWRhdGEtPmFyZ3MuZmggPSBORlNfRkgoaW5vZGUpOworCQlkYXRhLT5hcmdzLmNvbnRleHQgPSBjdHg7CisJCWRhdGEtPmFyZ3Mub2Zmc2V0ID0gZmlsZV9vZmZzZXQ7CisJCWRhdGEtPmFyZ3MucGdiYXNlID0gcGdiYXNlOworCQlkYXRhLT5hcmdzLnBhZ2VzID0gJnBhZ2VzW2N1cnBhZ2VdOworCQlkYXRhLT5hcmdzLmNvdW50ID0gYnl0ZXM7CisJCWRhdGEtPnJlcy5mYXR0ciA9ICZkYXRhLT5mYXR0cjsKKwkJZGF0YS0+cmVzLmVvZiA9IDA7CisJCWRhdGEtPnJlcy5jb3VudCA9IGJ5dGVzOworCisJCU5GU19QUk9UTyhpbm9kZSktPnJlYWRfc2V0dXAoZGF0YSk7CisKKwkJZGF0YS0+dGFzay50a19jb29raWUgPSAodW5zaWduZWQgbG9uZykgaW5vZGU7CisJCWRhdGEtPnRhc2sudGtfY2FsbGRhdGEgPSBkYXRhOworCQlkYXRhLT50YXNrLnRrX3JlbGVhc2UgPSBuZnNfcmVhZGRhdGFfcmVsZWFzZTsKKwkJZGF0YS0+Y29tcGxldGUgPSBuZnNfZGlyZWN0X3JlYWRfcmVzdWx0OworCisJCWxvY2tfa2VybmVsKCk7CisJCXJwY19leGVjdXRlKCZkYXRhLT50YXNrKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCisJCWRmcHJpbnRrKFZGUywgIk5GUzogJTRkIGluaXRpYXRlZCBkaXJlY3QgcmVhZCBjYWxsIChyZXEgJXMvJUxkLCAldSBieXRlcyBAIG9mZnNldCAlTHUpXG4iLAorCQkJCWRhdGEtPnRhc2sudGtfcGlkLAorCQkJCWlub2RlLT5pX3NiLT5zX2lkLAorCQkJCShsb25nIGxvbmcpTkZTX0ZJTEVJRChpbm9kZSksCisJCQkJYnl0ZXMsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkYXRhLT5hcmdzLm9mZnNldCk7CisKKwkJZmlsZV9vZmZzZXQgKz0gYnl0ZXM7CisJCXBnYmFzZSArPSBieXRlczsKKwkJY3VycGFnZSArPSBwZ2Jhc2UgPj4gUEFHRV9TSElGVDsKKwkJcGdiYXNlICY9IH5QQUdFX01BU0s7CisKKwkJY291bnQgLT0gYnl0ZXM7CisJfSB3aGlsZSAoY291bnQgIT0gMCk7Cit9CisKKy8qKgorICogbmZzX2RpcmVjdF9yZWFkX3dhaXQgLSB3YWl0IGZvciBJL08gY29tcGxldGlvbiBmb3IgZGlyZWN0IHJlYWRzCisgKiBAZHJlcTogcmVxdWVzdCBvbiB3aGljaCB3ZSBhcmUgdG8gd2FpdAorICogQGludHI6IHdoZXRoZXIgb3Igbm90IHRoaXMgd2FpdCBjYW4gYmUgaW50ZXJydXB0ZWQKKyAqCisgKiBDb2xsZWN0cyBhbmQgcmV0dXJucyB0aGUgZmluYWwgZXJyb3IgdmFsdWUvYnl0ZS1jb3VudC4KKyAqLworc3RhdGljIHNzaXplX3QgbmZzX2RpcmVjdF9yZWFkX3dhaXQoc3RydWN0IG5mc19kaXJlY3RfcmVxICpkcmVxLCBpbnQgaW50cikKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKworCWlmIChpbnRyKSB7CisJCXJlc3VsdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkcmVxLT53YWl0LAorCQkJCQkoYXRvbWljX3JlYWQoJmRyZXEtPmNvbXBsZXRlKSA9PSAwKSk7CisJfSBlbHNlIHsKKwkJd2FpdF9ldmVudChkcmVxLT53YWl0LCAoYXRvbWljX3JlYWQoJmRyZXEtPmNvbXBsZXRlKSA9PSAwKSk7CisJfQorCisJaWYgKCFyZXN1bHQpCisJCXJlc3VsdCA9IGF0b21pY19yZWFkKCZkcmVxLT5lcnJvcik7CisJaWYgKCFyZXN1bHQpCisJCXJlc3VsdCA9IGF0b21pY19yZWFkKCZkcmVxLT5jb3VudCk7CisKKwlrcmVmX3B1dCgmZHJlcS0+a3JlZiwgbmZzX2RpcmVjdF9yZXFfcmVsZWFzZSk7CisJcmV0dXJuIChzc2l6ZV90KSByZXN1bHQ7Cit9CisKKy8qKgorICogbmZzX2RpcmVjdF9yZWFkX3NlZyAtIFJlYWQgaW4gb25lIGlvdiBzZWdtZW50LiAgR2VuZXJhdGUgc2VwYXJhdGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBSUENzIGZvciBlYWNoICJyc2l6ZSIgYnl0ZXMuCisgKiBAaW5vZGU6IHRhcmdldCBpbm9kZQorICogQGN0eDogdGFyZ2V0IGZpbGUgb3BlbiBjb250ZXh0CisgKiBAdXNlcl9hZGRyOiBzdGFydGluZyBhZGRyZXNzIG9mIHRoaXMgc2VnbWVudCBvZiB1c2VyJ3MgYnVmZmVyCisgKiBAY291bnQ6IHNpemUgb2YgdGhpcyBzZWdtZW50CisgKiBAZmlsZV9vZmZzZXQ6IG9mZnNldCBpbiBmaWxlIHRvIGJlZ2luIHRoZSBvcGVyYXRpb24KKyAqIEBwYWdlczogYXJyYXkgb2YgYWRkcmVzc2VzIG9mIHBhZ2Ugc3RydWN0cyBkZWZpbmluZyB1c2VyJ3MgYnVmZmVyCisgKiBAbnJfcGFnZXM6IG51bWJlciBvZiBwYWdlcyBpbiB0aGUgYXJyYXkKKyAqCisgKi8KK3N0YXRpYyBzc2l6ZV90IG5mc19kaXJlY3RfcmVhZF9zZWcoc3RydWN0IGlub2RlICppbm9kZSwKKwkJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCwgdW5zaWduZWQgbG9uZyB1c2VyX2FkZHIsCisJCXNpemVfdCBjb3VudCwgbG9mZl90IGZpbGVfb2Zmc2V0LCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAorCQl1bnNpZ25lZCBpbnQgbnJfcGFnZXMpCit7CisJc3NpemVfdCByZXN1bHQ7CisJc2lnc2V0X3Qgb2xkc2V0OworCXN0cnVjdCBycGNfY2xudCAqY2xudCA9IE5GU19DTElFTlQoaW5vZGUpOworCXN0cnVjdCBuZnNfZGlyZWN0X3JlcSAqZHJlcTsKKworCWRyZXEgPSBuZnNfZGlyZWN0X3JlYWRfYWxsb2MoY291bnQsIE5GU19TRVJWRVIoaW5vZGUpLT5yc2l6ZSk7CisJaWYgKCFkcmVxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRyZXEtPnBhZ2VzID0gcGFnZXM7CisJZHJlcS0+bnBhZ2VzID0gbnJfcGFnZXM7CisKKwlycGNfY2xudF9zaWdtYXNrKGNsbnQsICZvbGRzZXQpOworCW5mc19kaXJlY3RfcmVhZF9zY2hlZHVsZShkcmVxLCBpbm9kZSwgY3R4LCB1c2VyX2FkZHIsIGNvdW50LAorCQkJCSBmaWxlX29mZnNldCk7CisJcmVzdWx0ID0gbmZzX2RpcmVjdF9yZWFkX3dhaXQoZHJlcSwgY2xudC0+Y2xfaW50cik7CisJcnBjX2NsbnRfc2lndW5tYXNrKGNsbnQsICZvbGRzZXQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBuZnNfZGlyZWN0X3JlYWQgLSBGb3IgZWFjaCBpb3Ygc2VnbWVudCwgbWFwIHRoZSB1c2VyJ3MgYnVmZmVyCisgKiAgICAgICAgICAgICAgICAgICB0aGVuIGdlbmVyYXRlIHJlYWQgUlBDcy4KKyAqIEBpbm9kZTogdGFyZ2V0IGlub2RlCisgKiBAY3R4OiB0YXJnZXQgZmlsZSBvcGVuIGNvbnRleHQKKyAqIEBpb3Y6IGFycmF5IG9mIHZlY3RvcnMgdGhhdCBkZWZpbmUgSS9PIGJ1ZmZlcgorICogZmlsZV9vZmZzZXQ6IG9mZnNldCBpbiBmaWxlIHRvIGJlZ2luIHRoZSBvcGVyYXRpb24KKyAqIG5yX3NlZ3M6IHNpemUgb2YgaW92ZWMgYXJyYXkKKyAqCisgKiBXZSd2ZSBhbHJlYWR5IHB1c2hlZCBvdXQgYW55IG5vbi1kaXJlY3Qgd3JpdGVzIHNvIHRoYXQgdGhpcyByZWFkCisgKiB3aWxsIHNlZSB0aGVtIHdoZW4gd2UgcmVhZCBmcm9tIHRoZSBzZXJ2ZXIuCisgKi8KK3N0YXRpYyBzc2l6ZV90CituZnNfZGlyZWN0X3JlYWQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCwKKwkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBmaWxlX29mZnNldCwKKwkJdW5zaWduZWQgbG9uZyBucl9zZWdzKQoreworCXNzaXplX3QgdG90X2J5dGVzID0gMDsKKwl1bnNpZ25lZCBsb25nIHNlZyA9IDA7CisKKwl3aGlsZSAoKHNlZyA8IG5yX3NlZ3MpICYmICh0b3RfYnl0ZXMgPj0gMCkpIHsKKwkJc3NpemVfdCByZXN1bHQ7CisJCWludCBwYWdlX2NvdW50OworCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOworCQljb25zdCBzdHJ1Y3QgaW92ZWMgKnZlYyA9ICZpb3Zbc2VnKytdOworCQl1bnNpZ25lZCBsb25nIHVzZXJfYWRkciA9ICh1bnNpZ25lZCBsb25nKSB2ZWMtPmlvdl9iYXNlOworCQlzaXplX3Qgc2l6ZSA9IHZlYy0+aW92X2xlbjsKKworICAgICAgICAgICAgICAgIHBhZ2VfY291bnQgPSBuZnNfZ2V0X3VzZXJfcGFnZXMoUkVBRCwgdXNlcl9hZGRyLCBzaXplLCAmcGFnZXMpOworICAgICAgICAgICAgICAgIGlmIChwYWdlX2NvdW50IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmZzX2ZyZWVfdXNlcl9wYWdlcyhwYWdlcywgMCwgMCk7CisJCQlpZiAodG90X2J5dGVzID4gMCkKKwkJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYWdlX2NvdW50OworICAgICAgICAgICAgICAgIH0KKworCQlyZXN1bHQgPSBuZnNfZGlyZWN0X3JlYWRfc2VnKGlub2RlLCBjdHgsIHVzZXJfYWRkciwgc2l6ZSwKKwkJCQlmaWxlX29mZnNldCwgcGFnZXMsIHBhZ2VfY291bnQpOworCisJCWlmIChyZXN1bHQgPD0gMCkgeworCQkJaWYgKHRvdF9ieXRlcyA+IDApCisJCQkJYnJlYWs7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCXRvdF9ieXRlcyArPSByZXN1bHQ7CisJCWZpbGVfb2Zmc2V0ICs9IHJlc3VsdDsKKwkJaWYgKHJlc3VsdCA8IHNpemUpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdG90X2J5dGVzOworfQorCisvKioKKyAqIG5mc19kaXJlY3Rfd3JpdGVfc2VnIC0gV3JpdGUgb3V0IG9uZSBpb3Ygc2VnbWVudC4gIEdlbmVyYXRlIHNlcGFyYXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIFJQQ3MgZm9yIGVhY2ggIndzaXplIiBieXRlcywgdGhlbiBjb21taXQuCisgKiBAaW5vZGU6IHRhcmdldCBpbm9kZQorICogQGN0eDogdGFyZ2V0IGZpbGUgb3BlbiBjb250ZXh0CisgKiB1c2VyX2FkZHI6IHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhpcyBzZWdtZW50IG9mIHVzZXIncyBidWZmZXIKKyAqIGNvdW50OiBzaXplIG9mIHRoaXMgc2VnbWVudAorICogZmlsZV9vZmZzZXQ6IG9mZnNldCBpbiBmaWxlIHRvIGJlZ2luIHRoZSBvcGVyYXRpb24KKyAqIEBwYWdlczogYXJyYXkgb2YgYWRkcmVzc2VzIG9mIHBhZ2Ugc3RydWN0cyBkZWZpbmluZyB1c2VyJ3MgYnVmZmVyCisgKiBucl9wYWdlczogc2l6ZSBvZiBwYWdlcyBhcnJheQorICovCitzdGF0aWMgc3NpemVfdCBuZnNfZGlyZWN0X3dyaXRlX3NlZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4LCB1bnNpZ25lZCBsb25nIHVzZXJfYWRkciwKKwkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgZmlsZV9vZmZzZXQsIHN0cnVjdCBwYWdlICoqcGFnZXMsCisJCWludCBucl9wYWdlcykKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgd3NpemUgPSBORlNfU0VSVkVSKGlub2RlKS0+d3NpemU7CisJc2l6ZV90IHJlcXVlc3Q7CisJaW50IGN1cnBhZ2UsIG5lZWRfY29tbWl0OworCXNzaXplX3QgcmVzdWx0LCB0b3RfYnl0ZXM7CisJc3RydWN0IG5mc193cml0ZXZlcmYgZmlyc3RfdmVyZjsKKwlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKndkYXRhOworCisJd2RhdGEgPSBuZnNfd3JpdGVkYXRhX2FsbG9jKCk7CisJaWYgKCF3ZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3ZGF0YS0+aW5vZGUgPSBpbm9kZTsKKwl3ZGF0YS0+Y3JlZCA9IGN0eC0+Y3JlZDsKKwl3ZGF0YS0+YXJncy5maCA9IE5GU19GSChpbm9kZSk7CisJd2RhdGEtPmFyZ3MuY29udGV4dCA9IGN0eDsKKwl3ZGF0YS0+YXJncy5zdGFibGUgPSBORlNfVU5TVEFCTEU7CisJaWYgKElTX1NZTkMoaW5vZGUpIHx8IE5GU19QUk9UTyhpbm9kZSktPnZlcnNpb24gPT0gMiB8fCBjb3VudCA8PSB3c2l6ZSkKKwkJd2RhdGEtPmFyZ3Muc3RhYmxlID0gTkZTX0ZJTEVfU1lOQzsKKwl3ZGF0YS0+cmVzLmZhdHRyID0gJndkYXRhLT5mYXR0cjsKKwl3ZGF0YS0+cmVzLnZlcmYgPSAmd2RhdGEtPnZlcmY7CisKKwluZnNfYmVnaW5fZGF0YV91cGRhdGUoaW5vZGUpOworcmV0cnk6CisJbmVlZF9jb21taXQgPSAwOworCXRvdF9ieXRlcyA9IDA7CisJY3VycGFnZSA9IDA7CisJcmVxdWVzdCA9IGNvdW50OworCXdkYXRhLT5hcmdzLnBnYmFzZSA9IHVzZXJfYWRkciAmIH5QQUdFX01BU0s7CisJd2RhdGEtPmFyZ3Mub2Zmc2V0ID0gZmlsZV9vZmZzZXQ7CisJZG8geworCQl3ZGF0YS0+YXJncy5jb3VudCA9IHJlcXVlc3Q7CisJCWlmICh3ZGF0YS0+YXJncy5jb3VudCA+IHdzaXplKQorCQkJd2RhdGEtPmFyZ3MuY291bnQgPSB3c2l6ZTsKKwkJd2RhdGEtPmFyZ3MucGFnZXMgPSAmcGFnZXNbY3VycGFnZV07CisKKwkJZHByaW50aygiTkZTOiBkaXJlY3Qgd3JpdGU6IGM9JXUgbz0lTGQgdWE9JWx1LCBwYj0ldSwgY3A9JXVcbiIsCisJCQl3ZGF0YS0+YXJncy5jb3VudCwgKGxvbmcgbG9uZykgd2RhdGEtPmFyZ3Mub2Zmc2V0LAorCQkJdXNlcl9hZGRyICsgdG90X2J5dGVzLCB3ZGF0YS0+YXJncy5wZ2Jhc2UsIGN1cnBhZ2UpOworCisJCWxvY2tfa2VybmVsKCk7CisJCXJlc3VsdCA9IE5GU19QUk9UTyhpbm9kZSktPndyaXRlKHdkYXRhKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCisJCWlmIChyZXN1bHQgPD0gMCkgeworCQkJaWYgKHRvdF9ieXRlcyA+IDApCisJCQkJYnJlYWs7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmICh0b3RfYnl0ZXMgPT0gMCkKKwkJCW1lbWNweSgmZmlyc3RfdmVyZi52ZXJpZmllciwgJndkYXRhLT52ZXJmLnZlcmlmaWVyLAorCQkJCQkJc2l6ZW9mKGZpcnN0X3ZlcmYudmVyaWZpZXIpKTsKKwkJaWYgKHdkYXRhLT52ZXJmLmNvbW1pdHRlZCAhPSBORlNfRklMRV9TWU5DKSB7CisJCQluZWVkX2NvbW1pdCA9IDE7CisJCQlpZiAobWVtY21wKCZmaXJzdF92ZXJmLnZlcmlmaWVyLCAmd2RhdGEtPnZlcmYudmVyaWZpZXIsCisJCQkJCXNpemVvZihmaXJzdF92ZXJmLnZlcmlmaWVyKSkpOworCQkJCWdvdG8gc3luY19yZXRyeTsKKwkJfQorCisJCXRvdF9ieXRlcyArPSByZXN1bHQ7CisKKwkJLyogaW4gY2FzZSBvZiBhIHNob3J0IHdyaXRlOiBzdG9wIG5vdywgbGV0IHRoZSBhcHAgcmVjb3ZlciAqLworCQlpZiAocmVzdWx0IDwgd2RhdGEtPmFyZ3MuY291bnQpCisJCQlicmVhazsKKworCQl3ZGF0YS0+YXJncy5vZmZzZXQgKz0gcmVzdWx0OworCQl3ZGF0YS0+YXJncy5wZ2Jhc2UgKz0gcmVzdWx0OworCQljdXJwYWdlICs9IHdkYXRhLT5hcmdzLnBnYmFzZSA+PiBQQUdFX1NISUZUOworCQl3ZGF0YS0+YXJncy5wZ2Jhc2UgJj0gflBBR0VfTUFTSzsKKwkJcmVxdWVzdCAtPSByZXN1bHQ7CisJfSB3aGlsZSAocmVxdWVzdCAhPSAwKTsKKworCS8qCisJICogQ29tbWl0IGRhdGEgd3JpdHRlbiBzbyBmYXIsIGV2ZW4gaW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yCisJICovCisJaWYgKG5lZWRfY29tbWl0KSB7CisJCXdkYXRhLT5hcmdzLmNvdW50ID0gdG90X2J5dGVzOworCQl3ZGF0YS0+YXJncy5vZmZzZXQgPSBmaWxlX29mZnNldDsKKworCQlsb2NrX2tlcm5lbCgpOworCQlyZXN1bHQgPSBORlNfUFJPVE8oaW5vZGUpLT5jb21taXQod2RhdGEpOworCQl1bmxvY2tfa2VybmVsKCk7CisKKwkJaWYgKHJlc3VsdCA8IDAgfHwgbWVtY21wKCZmaXJzdF92ZXJmLnZlcmlmaWVyLAorCQkJCQkgJndkYXRhLT52ZXJmLnZlcmlmaWVyLAorCQkJCQkgc2l6ZW9mKGZpcnN0X3ZlcmYudmVyaWZpZXIpKSAhPSAwKQorCQkJZ290byBzeW5jX3JldHJ5OworCX0KKwlyZXN1bHQgPSB0b3RfYnl0ZXM7CisKK291dDoKKwluZnNfZW5kX2RhdGFfdXBkYXRlX2RlZmVyKGlub2RlKTsKKwluZnNfd3JpdGVkYXRhX2ZyZWUod2RhdGEpOworCXJldHVybiByZXN1bHQ7CisKK3N5bmNfcmV0cnk6CisJd2RhdGEtPmFyZ3Muc3RhYmxlID0gTkZTX0ZJTEVfU1lOQzsKKwlnb3RvIHJldHJ5OworfQorCisvKioKKyAqIG5mc19kaXJlY3Rfd3JpdGUgLSBGb3IgZWFjaCBpb3Ygc2VnbWVudCwgbWFwIHRoZSB1c2VyJ3MgYnVmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgdGhlbiBnZW5lcmF0ZSB3cml0ZSBhbmQgY29tbWl0IFJQQ3MuCisgKiBAaW5vZGU6IHRhcmdldCBpbm9kZQorICogQGN0eDogdGFyZ2V0IGZpbGUgb3BlbiBjb250ZXh0CisgKiBAaW92OiBhcnJheSBvZiB2ZWN0b3JzIHRoYXQgZGVmaW5lIEkvTyBidWZmZXIKKyAqIGZpbGVfb2Zmc2V0OiBvZmZzZXQgaW4gZmlsZSB0byBiZWdpbiB0aGUgb3BlcmF0aW9uCisgKiBucl9zZWdzOiBzaXplIG9mIGlvdmVjIGFycmF5CisgKgorICogVXBvbiByZXR1cm4sIGdlbmVyaWNfZmlsZV9kaXJlY3RfSU8gaW52YWxpZGF0ZXMgYW55IGNhY2hlZCBwYWdlcworICogdGhhdCBub24tZGlyZWN0IHJlYWRlcnMgbWlnaHQgYWNjZXNzLCBzbyB0aGV5IHdpbGwgcGljayB1cCB0aGVzZQorICogd3JpdGVzIGltbWVkaWF0ZWx5LgorICovCitzdGF0aWMgc3NpemVfdCBuZnNfZGlyZWN0X3dyaXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAorCQlsb2ZmX3QgZmlsZV9vZmZzZXQsIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKK3sKKwlzc2l6ZV90IHRvdF9ieXRlcyA9IDA7CisJdW5zaWduZWQgbG9uZyBzZWcgPSAwOworCisJd2hpbGUgKChzZWcgPCBucl9zZWdzKSAmJiAodG90X2J5dGVzID49IDApKSB7CisJCXNzaXplX3QgcmVzdWx0OworCQlpbnQgcGFnZV9jb3VudDsKKwkJc3RydWN0IHBhZ2UgKipwYWdlczsKKwkJY29uc3Qgc3RydWN0IGlvdmVjICp2ZWMgPSAmaW92W3NlZysrXTsKKwkJdW5zaWduZWQgbG9uZyB1c2VyX2FkZHIgPSAodW5zaWduZWQgbG9uZykgdmVjLT5pb3ZfYmFzZTsKKwkJc2l6ZV90IHNpemUgPSB2ZWMtPmlvdl9sZW47CisKKyAgICAgICAgICAgICAgICBwYWdlX2NvdW50ID0gbmZzX2dldF91c2VyX3BhZ2VzKFdSSVRFLCB1c2VyX2FkZHIsIHNpemUsICZwYWdlcyk7CisgICAgICAgICAgICAgICAgaWYgKHBhZ2VfY291bnQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZnNfZnJlZV91c2VyX3BhZ2VzKHBhZ2VzLCAwLCAwKTsKKwkJCWlmICh0b3RfYnl0ZXMgPiAwKQorCQkJCWJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhZ2VfY291bnQ7CisgICAgICAgICAgICAgICAgfQorCisJCXJlc3VsdCA9IG5mc19kaXJlY3Rfd3JpdGVfc2VnKGlub2RlLCBjdHgsIHVzZXJfYWRkciwgc2l6ZSwKKwkJCQlmaWxlX29mZnNldCwgcGFnZXMsIHBhZ2VfY291bnQpOworCQluZnNfZnJlZV91c2VyX3BhZ2VzKHBhZ2VzLCBwYWdlX2NvdW50LCAwKTsKKworCQlpZiAocmVzdWx0IDw9IDApIHsKKwkJCWlmICh0b3RfYnl0ZXMgPiAwKQorCQkJCWJyZWFrOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQl0b3RfYnl0ZXMgKz0gcmVzdWx0OworCQlmaWxlX29mZnNldCArPSByZXN1bHQ7CisJCWlmIChyZXN1bHQgPCBzaXplKQorCQkJYnJlYWs7CisJfQorCXJldHVybiB0b3RfYnl0ZXM7Cit9CisKKy8qKgorICogbmZzX2RpcmVjdF9JTyAtIE5GUyBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbiBmb3IgZGlyZWN0IEkvTworICogcnc6IGRpcmVjdGlvbiAocmVhZCBvciB3cml0ZSkKKyAqIEBpb2NiOiB0YXJnZXQgSS9PIGNvbnRyb2wgYmxvY2sKKyAqIEBpb3Y6IGFycmF5IG9mIHZlY3RvcnMgdGhhdCBkZWZpbmUgSS9PIGJ1ZmZlcgorICogZmlsZV9vZmZzZXQ6IG9mZnNldCBpbiBmaWxlIHRvIGJlZ2luIHRoZSBvcGVyYXRpb24KKyAqIG5yX3NlZ3M6IHNpemUgb2YgaW92ZWMgYXJyYXkKKyAqCisgKi8KK3NzaXplX3QKK25mc19kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAorCQlsb2ZmX3QgZmlsZV9vZmZzZXQsIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKK3sKKwlzc2l6ZV90IHJlc3VsdCA9IC1FSU5WQUw7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHg7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCS8qCisJICogTm8gc3VwcG9ydCBmb3IgYXN5bmMgeWV0CisJICovCisJaWYgKCFpc19zeW5jX2tpb2NiKGlvY2IpKQorCQlyZXR1cm4gcmVzdWx0OworCisJY3R4ID0gKHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN3aXRjaCAocncpIHsKKwljYXNlIFJFQUQ6CisJCWRwcmludGsoIk5GUzogZGlyZWN0X0lPKHJlYWQpICglcykgb2ZmL25vKCVMdS8lbHUpXG4iLAorCQkJCWRlbnRyeS0+ZF9uYW1lLm5hbWUsIGZpbGVfb2Zmc2V0LCBucl9zZWdzKTsKKworCQlyZXN1bHQgPSBuZnNfZGlyZWN0X3JlYWQoaW5vZGUsIGN0eCwgaW92LAorCQkJCQkJZmlsZV9vZmZzZXQsIG5yX3NlZ3MpOworCQlicmVhazsKKwljYXNlIFdSSVRFOgorCQlkcHJpbnRrKCJORlM6IGRpcmVjdF9JTyh3cml0ZSkgKCVzKSBvZmYvbm8oJUx1LyVsdSlcbiIsCisJCQkJZGVudHJ5LT5kX25hbWUubmFtZSwgZmlsZV9vZmZzZXQsIG5yX3NlZ3MpOworCisJCXJlc3VsdCA9IG5mc19kaXJlY3Rfd3JpdGUoaW5vZGUsIGN0eCwgaW92LAorCQkJCQkJZmlsZV9vZmZzZXQsIG5yX3NlZ3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBuZnNfZmlsZV9kaXJlY3RfcmVhZCAtIGZpbGUgZGlyZWN0IHJlYWQgb3BlcmF0aW9uIGZvciBORlMgZmlsZXMKKyAqIEBpb2NiOiB0YXJnZXQgSS9PIGNvbnRyb2wgYmxvY2sKKyAqIEBidWY6IHVzZXIncyBidWZmZXIgaW50byB3aGljaCB0byByZWFkIGRhdGEKKyAqIGNvdW50OiBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICogcG9zOiBieXRlIG9mZnNldCBpbiBmaWxlIHdoZXJlIHJlYWRpbmcgc3RhcnRzCisgKgorICogV2UgdXNlIHRoaXMgZnVuY3Rpb24gZm9yIGRpcmVjdCByZWFkcyBpbnN0ZWFkIG9mIGNhbGxpbmcKKyAqIGdlbmVyaWNfZmlsZV9haW9fcmVhZCgpIGluIG9yZGVyIHRvIGF2b2lkIGdmYXIncyBjaGVjayB0byBzZWUgaWYKKyAqIHRoZSByZXF1ZXN0IHN0YXJ0cyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgZmlsZS4gIEZvciB0aGF0IGNoZWNrCisgKiB0byB3b3JrLCB3ZSBtdXN0IGdlbmVyYXRlIGEgR0VUQVRUUiBiZWZvcmUgZWFjaCBkaXJlY3QgcmVhZCwgYW5kCisgKiBldmVuIHRoZW4gdGhlcmUgaXMgYSB3aW5kb3cgYmV0d2VlbiB0aGUgR0VUQVRUUiBhbmQgdGhlIHN1YnNlcXVlbnQKKyAqIFJFQUQgd2hlcmUgdGhlIGZpbGUgc2l6ZSBjb3VsZCBjaGFuZ2UuICBTbyBvdXIgcHJlZmVyZW5jZSBpcyBzaW1wbHkKKyAqIHRvIGRvIGFsbCByZWFkcyB0aGUgYXBwbGljYXRpb24gd2FudHMsIGFuZCB0aGUgc2VydmVyIHdpbGwgdGFrZQorICogY2FyZSBvZiBtYW5hZ2luZyB0aGUgZW5kIG9mIGZpbGUgYm91bmRhcnkuCisgKiAKKyAqIFRoaXMgZnVuY3Rpb24gYWxzbyBlbGltaW5hdGVzIHVubmVjZXNzYXJpbHkgdXBkYXRpbmcgdGhlIGZpbGUncworICogYXRpbWUgbG9jYWxseSwgYXMgdGhlIE5GUyBzZXJ2ZXIgc2V0cyB0aGUgZmlsZSdzIGF0aW1lLCBhbmQgdGhpcworICogY2xpZW50IG11c3QgcmVhZCB0aGUgdXBkYXRlZCBhdGltZSBmcm9tIHRoZSBzZXJ2ZXIgYmFjayBpbnRvIGl0cworICogY2FjaGUuCisgKi8KK3NzaXplX3QKK25mc19maWxlX2RpcmVjdF9yZWFkKHN0cnVjdCBraW9jYiAqaW9jYiwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKQoreworCXNzaXplX3QgcmV0dmFsID0gLUVJTlZBTDsKKwlsb2ZmX3QgKnBwb3MgPSAmaW9jYi0+a2lfcG9zOworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4ID0KKwkJCShzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGlvdmVjIGlvdiA9IHsKKwkJLmlvdl9iYXNlID0gYnVmLAorCQkuaW92X2xlbiA9IGNvdW50LAorCX07CisKKwlkcHJpbnRrKCJuZnM6IGRpcmVjdCByZWFkKCVzLyVzLCAlbHVAJWx1KVxuIiwKKwkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCSh1bnNpZ25lZCBsb25nKSBjb3VudCwgKHVuc2lnbmVkIGxvbmcpIHBvcyk7CisKKwlpZiAoIWlzX3N5bmNfa2lvY2IoaW9jYikpCisJCWdvdG8gb3V0OworCWlmIChjb3VudCA8IDApCisJCWdvdG8gb3V0OworCXJldHZhbCA9IC1FRkFVTFQ7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBpb3YuaW92X2Jhc2UsIGlvdi5pb3ZfbGVuKSkKKwkJZ290byBvdXQ7CisJcmV0dmFsID0gMDsKKwlpZiAoIWNvdW50KQorCQlnb3RvIG91dDsKKworCWlmIChtYXBwaW5nLT5ucnBhZ2VzKSB7CisJCXJldHZhbCA9IGZpbGVtYXBfZmRhdGF3cml0ZShtYXBwaW5nKTsKKwkJaWYgKHJldHZhbCA9PSAwKQorCQkJcmV0dmFsID0gbmZzX3diX2FsbChpbm9kZSk7CisJCWlmIChyZXR2YWwgPT0gMCkKKwkJCXJldHZhbCA9IGZpbGVtYXBfZmRhdGF3YWl0KG1hcHBpbmcpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBvdXQ7CisJfQorCisJcmV0dmFsID0gbmZzX2RpcmVjdF9yZWFkKGlub2RlLCBjdHgsICZpb3YsIHBvcywgMSk7CisJaWYgKHJldHZhbCA+IDApCisJCSpwcG9zID0gcG9zICsgcmV0dmFsOworCitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBuZnNfZmlsZV9kaXJlY3Rfd3JpdGUgLSBmaWxlIGRpcmVjdCB3cml0ZSBvcGVyYXRpb24gZm9yIE5GUyBmaWxlcworICogQGlvY2I6IHRhcmdldCBJL08gY29udHJvbCBibG9jaworICogQGJ1ZjogdXNlcidzIGJ1ZmZlciBmcm9tIHdoaWNoIHRvIHdyaXRlIGRhdGEKKyAqIGNvdW50OiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAqIHBvczogYnl0ZSBvZmZzZXQgaW4gZmlsZSB3aGVyZSB3cml0aW5nIHN0YXJ0cworICoKKyAqIFdlIHVzZSB0aGlzIGZ1bmN0aW9uIGZvciBkaXJlY3Qgd3JpdGVzIGluc3RlYWQgb2YgY2FsbGluZworICogZ2VuZXJpY19maWxlX2Fpb193cml0ZSgpIGluIG9yZGVyIHRvIGF2b2lkIHRha2luZyB0aGUgaW5vZGUKKyAqIHNlbWFwaG9yZSBhbmQgdXBkYXRpbmcgdGhlIGlfc2l6ZS4gIFRoZSBORlMgc2VydmVyIHdpbGwgc2V0CisgKiB0aGUgbmV3IGlfc2l6ZSBhbmQgdGhpcyBjbGllbnQgbXVzdCByZWFkIHRoZSB1cGRhdGVkIHNpemUKKyAqIGJhY2sgaW50byBpdHMgY2FjaGUuICBXZSBsZXQgdGhlIHNlcnZlciBkbyBnZW5lcmljIHdyaXRlCisgKiBwYXJhbWV0ZXIgY2hlY2tpbmcgYW5kIHJlcG9ydCBwcm9ibGVtcy4KKyAqCisgKiBXZSBhbHNvIGF2b2lkIGFuIHVubmVjZXNzYXJ5IGludm9jYXRpb24gb2YgZ2VuZXJpY19vc3luY19pbm9kZSgpLAorICogYXMgaXQgaXMgZmFpcmx5IG1lYW5pbmdsZXNzIHRvIHN5bmMgdGhlIG1ldGFkYXRhIG9mIGFuIE5GUyBmaWxlLgorICoKKyAqIFdlIGVsaW1pbmF0ZSBsb2NhbCBhdGltZSB1cGRhdGVzLCBzZWUgZGlyZWN0IHJlYWQgYWJvdmUuCisgKgorICogV2UgYXZvaWQgdW5uZWNlc3NhcnkgcGFnZSBjYWNoZSBpbnZhbGlkYXRpb25zIGZvciBub3JtYWwgY2FjaGVkCisgKiByZWFkZXJzIG9mIHRoaXMgZmlsZS4KKyAqCisgKiBOb3RlIHRoYXQgT19BUFBFTkQgaXMgbm90IHN1cHBvcnRlZCBmb3IgTkZTIGRpcmVjdCB3cml0ZXMsIGFzIHRoZXJlCisgKiBpcyBubyBhdG9taWMgT19BUFBFTkQgd3JpdGUgZmFjaWxpdHkgaW4gdGhlIE5GUyBwcm90b2NvbC4KKyAqLworc3NpemVfdAorbmZzX2ZpbGVfZGlyZWN0X3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKQoreworCXNzaXplX3QgcmV0dmFsID0gLUVJTlZBTDsKKwlsb2ZmX3QgKnBwb3MgPSAmaW9jYi0+a2lfcG9zOworCXVuc2lnbmVkIGxvbmcgbGltaXQgPSBjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX0ZTSVpFXS5ybGltX2N1cjsKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CisJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCA9CisJCQkoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXN0cnVjdCBpb3ZlYyBpb3YgPSB7CisJCS5pb3ZfYmFzZSA9IChjaGFyIF9fdXNlciAqKWJ1ZiwKKwkJLmlvdl9sZW4gPSBjb3VudCwKKwl9OworCisJZGZwcmludGsoVkZTLCAibmZzOiBkaXJlY3Qgd3JpdGUoJXMvJXMoJWxkKSwgJWx1QCVsdSlcbiIsCisJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQlpbm9kZS0+aV9pbm8sICh1bnNpZ25lZCBsb25nKSBjb3VudCwgKHVuc2lnbmVkIGxvbmcpIHBvcyk7CisKKwlpZiAoIWlzX3N5bmNfa2lvY2IoaW9jYikpCisJCWdvdG8gb3V0OworCWlmIChjb3VudCA8IDApCisJCWdvdG8gb3V0OworICAgICAgICBpZiAocG9zIDwgMCkKKwkJZ290byBvdXQ7CisJcmV0dmFsID0gLUVGQVVMVDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgaW92Lmlvdl9iYXNlLCBpb3YuaW92X2xlbikpCisJCWdvdG8gb3V0OworICAgICAgICBpZiAoZmlsZS0+Zl9lcnJvcikgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IGZpbGUtPmZfZXJyb3I7CisgICAgICAgICAgICAgICAgZmlsZS0+Zl9lcnJvciA9IDA7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKwlyZXR2YWwgPSAtRUZCSUc7CisJaWYgKGxpbWl0ICE9IFJMSU1fSU5GSU5JVFkpIHsKKwkJaWYgKHBvcyA+PSBsaW1pdCkgeworCQkJc2VuZF9zaWcoU0lHWEZTWiwgY3VycmVudCwgMCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoY291bnQgPiBsaW1pdCAtICh1bnNpZ25lZCBsb25nKSBwb3MpCisJCQljb3VudCA9IGxpbWl0IC0gKHVuc2lnbmVkIGxvbmcpIHBvczsKKwl9CisJcmV0dmFsID0gMDsKKwlpZiAoIWNvdW50KQorCQlnb3RvIG91dDsKKworCWlmIChtYXBwaW5nLT5ucnBhZ2VzKSB7CisJCXJldHZhbCA9IGZpbGVtYXBfZmRhdGF3cml0ZShtYXBwaW5nKTsKKwkJaWYgKHJldHZhbCA9PSAwKQorCQkJcmV0dmFsID0gbmZzX3diX2FsbChpbm9kZSk7CisJCWlmIChyZXR2YWwgPT0gMCkKKwkJCXJldHZhbCA9IGZpbGVtYXBfZmRhdGF3YWl0KG1hcHBpbmcpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBvdXQ7CisJfQorCisJcmV0dmFsID0gbmZzX2RpcmVjdF93cml0ZShpbm9kZSwgY3R4LCAmaW92LCBwb3MsIDEpOworCWlmIChtYXBwaW5nLT5ucnBhZ2VzKQorCQlpbnZhbGlkYXRlX2lub2RlX3BhZ2VzMihtYXBwaW5nKTsKKwlpZiAocmV0dmFsID4gMCkKKwkJKnBwb3MgPSBwb3MgKyByZXR2YWw7CisKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgbmZzX2luaXRfZGlyZWN0Y2FjaGUodm9pZCkKK3sKKwluZnNfZGlyZWN0X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJuZnNfZGlyZWN0X2NhY2hlIiwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgbmZzX2RpcmVjdF9yZXEpLAorCQkJCQkJMCwgU0xBQl9SRUNMQUlNX0FDQ09VTlQsCisJCQkJCQlOVUxMLCBOVUxMKTsKKwlpZiAobmZzX2RpcmVjdF9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBuZnNfZGVzdHJveV9kaXJlY3RjYWNoZSh2b2lkKQoreworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kobmZzX2RpcmVjdF9jYWNoZXApKQorCQlwcmludGsoS0VSTl9JTkZPICJuZnNfZGlyZWN0X2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7Cit9CmRpZmYgLS1naXQgYS9mcy9uZnMvZmlsZS5jIGIvZnMvbmZzL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDZlZWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL2ZpbGUuYwpAQCAtMCwwICsxLDQ4NCBAQAorLyoKKyAqICBsaW51eC9mcy9uZnMvZmlsZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MiAgUmljayBTbGFka2V5CisgKgorICogIENoYW5nZXMgQ29weXJpZ2h0IChDKSAxOTk0IGJ5IEZsb3JpYW4gTGEgUm9jaGUKKyAqICAgLSBEbyBub3QgY29weSBkYXRhIHRvbyBvZnRlbiBhcm91bmQgaW4gdGhlIGtlcm5lbC4KKyAqICAgLSBJbiBuZnNfZmlsZV9yZWFkIHRoZSByZXR1cm4gdmFsdWUgb2Yga21hbGxvYyB3YXNuJ3QgY2hlY2tlZC4KKyAqICAgLSBQdXQgaW4gYSBiZXR0ZXIgdmVyc2lvbiBvZiByZWFkIGxvb2stYWhlYWQgYnVmZmVyaW5nLiBPcmlnaW5hbCBpZGVhCisgKiAgICAgYW5kIGltcGxlbWVudGF0aW9uIGJ5IFdhaSBTIEtvayBlbGVrb2t3c0BlZS5udXMuc2cuCisgKgorICogIEV4cGlyZSBjYWNoZSBvbiB3cml0ZSB0byBhIGZpbGUgYnkgV2FpIFMgS29rIChPY3QgMTk5NCkuCisgKgorICogIFRvdGFsIHJld3JpdGUgb2YgcmVhZCBzaWRlIGZvciBuZXcgTkZTIGJ1ZmZlciBjYWNoZS4uIExpbnVzLgorICoKKyAqICBuZnMgcmVndWxhciBmaWxlIGhhbmRsaW5nIGZ1bmN0aW9ucworICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSAiZGVsZWdhdGlvbi5oIgorCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWQkJTkZTREJHX0ZJTEUKKworc3RhdGljIGludCBuZnNfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyBpbnQgbmZzX2ZpbGVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgaW50ICBuZnNfZmlsZV9tbWFwKHN0cnVjdCBmaWxlICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKK3N0YXRpYyBzc2l6ZV90IG5mc19maWxlX3NlbmRmaWxlKHN0cnVjdCBmaWxlICosIGxvZmZfdCAqLCBzaXplX3QsIHJlYWRfYWN0b3JfdCwgdm9pZCAqKTsKK3N0YXRpYyBzc2l6ZV90IG5mc19maWxlX3JlYWQoc3RydWN0IGtpb2NiICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90KTsKK3N0YXRpYyBzc2l6ZV90IG5mc19maWxlX3dyaXRlKHN0cnVjdCBraW9jYiAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCk7CitzdGF0aWMgaW50ICBuZnNfZmlsZV9mbHVzaChzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyBpbnQgIG5mc19mc3luYyhzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBkYXRhc3luYyk7CitzdGF0aWMgaW50IG5mc19jaGVja19mbGFncyhpbnQgZmxhZ3MpOworc3RhdGljIGludCBuZnNfbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpOworc3RhdGljIGludCBuZnNfZmxvY2soc3RydWN0IGZpbGUgKmZpbHAsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBuZnNfZmlsZV9vcGVyYXRpb25zID0geworCS5sbHNlZWsJCT0gcmVtb3RlX2xsc2VlaywKKwkucmVhZAkJPSBkb19zeW5jX3JlYWQsCisJLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCisJLmFpb19yZWFkCQk9IG5mc19maWxlX3JlYWQsCisJLmFpb193cml0ZQkJPSBuZnNfZmlsZV93cml0ZSwKKwkubW1hcAkJPSBuZnNfZmlsZV9tbWFwLAorCS5vcGVuCQk9IG5mc19maWxlX29wZW4sCisJLmZsdXNoCQk9IG5mc19maWxlX2ZsdXNoLAorCS5yZWxlYXNlCT0gbmZzX2ZpbGVfcmVsZWFzZSwKKwkuZnN5bmMJCT0gbmZzX2ZzeW5jLAorCS5sb2NrCQk9IG5mc19sb2NrLAorCS5mbG9jawkJPSBuZnNfZmxvY2ssCisJLnNlbmRmaWxlCT0gbmZzX2ZpbGVfc2VuZGZpbGUsCisJLmNoZWNrX2ZsYWdzCT0gbmZzX2NoZWNrX2ZsYWdzLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbmZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkucGVybWlzc2lvbgk9IG5mc19wZXJtaXNzaW9uLAorCS5nZXRhdHRyCT0gbmZzX2dldGF0dHIsCisJLnNldGF0dHIJPSBuZnNfc2V0YXR0ciwKK307CisKKy8qIEhhY2sgZm9yIGZ1dHVyZSBORlMgc3dhcCBzdXBwb3J0ICovCisjaWZuZGVmIElTX1NXQVBGSUxFCisjIGRlZmluZSBJU19TV0FQRklMRShpbm9kZSkJKDApCisjZW5kaWYKKworc3RhdGljIGludCBuZnNfY2hlY2tfZmxhZ3MoaW50IGZsYWdzKQoreworCWlmICgoZmxhZ3MgJiAoT19BUFBFTkQgfCBPX0RJUkVDVCkpID09IChPX0FQUEVORCB8IE9fRElSRUNUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE9wZW4gZmlsZQorICovCitzdGF0aWMgaW50CituZnNfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGlub2RlKTsKKwlpbnQgKCpvcGVuKShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CisJaW50IHJlczsKKworCXJlcyA9IG5mc19jaGVja19mbGFncyhmaWxwLT5mX2ZsYWdzKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJbG9ja19rZXJuZWwoKTsKKwkvKiBEbyBORlN2NCBvcGVuKCkgY2FsbCAqLworCWlmICgob3BlbiA9IHNlcnZlci0+cnBjX29wcy0+ZmlsZV9vcGVuKSAhPSBOVUxMKQorCQlyZXMgPSBvcGVuKGlub2RlLCBmaWxwKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludAorbmZzX2ZpbGVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwkvKiBFbnN1cmUgdGhhdCBkaXJ0eSBwYWdlcyBhcmUgZmx1c2hlZCBvdXQgd2l0aCB0aGUgcmlnaHQgY3JlZHMgKi8KKwlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCWZpbGVtYXBfZmRhdGF3cml0ZShmaWxwLT5mX21hcHBpbmcpOworCXJldHVybiBORlNfUFJPVE8oaW5vZGUpLT5maWxlX3JlbGVhc2UoaW5vZGUsIGZpbHApOworfQorCisvKgorICogRmx1c2ggYWxsIGRpcnR5IHBhZ2VzLCBhbmQgY2hlY2sgZm9yIHdyaXRlIGVycm9ycy4KKyAqCisgKi8KK3N0YXRpYyBpbnQKK25mc19maWxlX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHggPSAoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWludAkJc3RhdHVzOworCisJZGZwcmludGsoVkZTLCAibmZzOiBmbHVzaCglcy8lbGQpXG4iLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsKKworCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpID09IDApCisJCXJldHVybiAwOworCWxvY2tfa2VybmVsKCk7CisJLyogRW5zdXJlIHRoYXQgZGF0YSthdHRyaWJ1dGUgY2FjaGVzIGFyZSB1cCB0byBkYXRlIGFmdGVyIGNsb3NlKCkgKi8KKwlzdGF0dXMgPSBuZnNfd2JfYWxsKGlub2RlKTsKKwlpZiAoIXN0YXR1cykgeworCQlzdGF0dXMgPSBjdHgtPmVycm9yOworCQljdHgtPmVycm9yID0gMDsKKwkJaWYgKCFzdGF0dXMgJiYgIW5mc19oYXZlX2RlbGVnYXRpb24oaW5vZGUsIEZNT0RFX1JFQUQpKQorCQkJX19uZnNfcmV2YWxpZGF0ZV9pbm9kZShORlNfU0VSVkVSKGlub2RlKSwgaW5vZGUpOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHNzaXplX3QKK25mc19maWxlX3JlYWQoc3RydWN0IGtpb2NiICppb2NiLCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBpb2NiLT5raV9maWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzc2l6ZV90IHJlc3VsdDsKKworI2lmZGVmIENPTkZJR19ORlNfRElSRUNUSU8KKwlpZiAoaW9jYi0+a2lfZmlscC0+Zl9mbGFncyAmIE9fRElSRUNUKQorCQlyZXR1cm4gbmZzX2ZpbGVfZGlyZWN0X3JlYWQoaW9jYiwgYnVmLCBjb3VudCwgcG9zKTsKKyNlbmRpZgorCisJZGZwcmludGsoVkZTLCAibmZzOiByZWFkKCVzLyVzLCAlbHVAJWx1KVxuIiwKKwkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCSh1bnNpZ25lZCBsb25nKSBjb3VudCwgKHVuc2lnbmVkIGxvbmcpIHBvcyk7CisKKwlyZXN1bHQgPSBuZnNfcmV2YWxpZGF0ZV9pbm9kZShORlNfU0VSVkVSKGlub2RlKSwgaW5vZGUpOworCWlmICghcmVzdWx0KQorCQlyZXN1bHQgPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQoaW9jYiwgYnVmLCBjb3VudCwgcG9zKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3NpemVfdAorbmZzX2ZpbGVfc2VuZGZpbGUoc3RydWN0IGZpbGUgKmZpbHAsIGxvZmZfdCAqcHBvcywgc2l6ZV90IGNvdW50LAorCQlyZWFkX2FjdG9yX3QgYWN0b3IsIHZvaWQgKnRhcmdldCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXNzaXplX3QgcmVzOworCisJZGZwcmludGsoVkZTLCAibmZzOiBzZW5kZmlsZSglcy8lcywgJWx1QCVMdSlcbiIsCisJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkodW5zaWduZWQgbG9uZykgY291bnQsICh1bnNpZ25lZCBsb25nIGxvbmcpICpwcG9zKTsKKworCXJlcyA9IG5mc19yZXZhbGlkYXRlX2lub2RlKE5GU19TRVJWRVIoaW5vZGUpLCBpbm9kZSk7CisJaWYgKCFyZXMpCisJCXJlcyA9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZShmaWxwLCBwcG9zLCBjb3VudCwgYWN0b3IsIHRhcmdldCk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludAorbmZzX2ZpbGVfbW1hcChzdHJ1Y3QgZmlsZSAqIGZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludAlzdGF0dXM7CisKKwlkZnByaW50ayhWRlMsICJuZnM6IG1tYXAoJXMvJXMpXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlzdGF0dXMgPSBuZnNfcmV2YWxpZGF0ZV9pbm9kZShORlNfU0VSVkVSKGlub2RlKSwgaW5vZGUpOworCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSBnZW5lcmljX2ZpbGVfbW1hcChmaWxlLCB2bWEpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBGbHVzaCBhbnkgZGlydHkgcGFnZXMgZm9yIHRoaXMgcHJvY2VzcywgYW5kIGNoZWNrIGZvciB3cml0ZSBlcnJvcnMuCisgKiBUaGUgcmV0dXJuIHN0YXR1cyBmcm9tIHRoaXMgY2FsbCBwcm92aWRlcyBhIHJlbGlhYmxlIGluZGljYXRpb24gb2YKKyAqIHdoZXRoZXIgYW55IHdyaXRlIGVycm9ycyBvY2N1cnJlZCBmb3IgdGhpcyBwcm9jZXNzLgorICovCitzdGF0aWMgaW50CituZnNfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKQoreworCXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHggPSAoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgc3RhdHVzOworCisJZGZwcmludGsoVkZTLCAibmZzOiBmc3luYyglcy8lbGQpXG4iLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsKKworCWxvY2tfa2VybmVsKCk7CisJc3RhdHVzID0gbmZzX3diX2FsbChpbm9kZSk7CisJaWYgKCFzdGF0dXMpIHsKKwkJc3RhdHVzID0gY3R4LT5lcnJvcjsKKwkJY3R4LT5lcnJvciA9IDA7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogVGhpcyBkb2VzIHRoZSAicmVhbCIgd29yayBvZiB0aGUgd3JpdGUuIFRoZSBnZW5lcmljIHJvdXRpbmUgaGFzCisgKiBhbGxvY2F0ZWQgdGhlIHBhZ2UsIGxvY2tlZCBpdCwgZG9uZSBhbGwgdGhlIHBhZ2UgYWxpZ25tZW50IHN0dWZmCisgKiBjYWxjdWxhdGlvbnMgZXRjLiBOb3cgd2Ugc2hvdWxkIGp1c3QgY29weSB0aGUgZGF0YSBmcm9tIHVzZXIKKyAqIHNwYWNlIGFuZCB3cml0ZSBpdCBiYWNrIHRvIHRoZSByZWFsIG1lZGl1bS4uCisgKgorICogSWYgdGhlIHdyaXRlciBlbmRzIHVwIGRlbGF5aW5nIHRoZSB3cml0ZSwgdGhlIHdyaXRlciBuZWVkcyB0bworICogaW5jcmVtZW50IHRoZSBwYWdlIHVzZSBjb3VudHMgdW50aWwgaGUgaXMgZG9uZSB3aXRoIHRoZSBwYWdlLgorICovCitzdGF0aWMgaW50IG5mc19wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCB0bykKK3sKKwlyZXR1cm4gbmZzX2ZsdXNoX2luY29tcGF0aWJsZShmaWxlLCBwYWdlKTsKK30KKworc3RhdGljIGludCBuZnNfY29tbWl0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCB0bykKK3sKKwlsb25nIHN0YXR1czsKKworCWxvY2tfa2VybmVsKCk7CisJc3RhdHVzID0gbmZzX3VwZGF0ZXBhZ2UoZmlsZSwgcGFnZSwgb2Zmc2V0LCB0by1vZmZzZXQpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIG5mc19maWxlX2FvcHMgPSB7CisJLnJlYWRwYWdlID0gbmZzX3JlYWRwYWdlLAorCS5yZWFkcGFnZXMgPSBuZnNfcmVhZHBhZ2VzLAorCS5zZXRfcGFnZV9kaXJ0eSA9IF9fc2V0X3BhZ2VfZGlydHlfbm9idWZmZXJzLAorCS53cml0ZXBhZ2UgPSBuZnNfd3JpdGVwYWdlLAorCS53cml0ZXBhZ2VzID0gbmZzX3dyaXRlcGFnZXMsCisJLnByZXBhcmVfd3JpdGUgPSBuZnNfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlID0gbmZzX2NvbW1pdF93cml0ZSwKKyNpZmRlZiBDT05GSUdfTkZTX0RJUkVDVElPCisJLmRpcmVjdF9JTyA9IG5mc19kaXJlY3RfSU8sCisjZW5kaWYKK307CisKKy8qIAorICogV3JpdGUgdG8gYSBmaWxlICh0aHJvdWdoIHRoZSBwYWdlIGNhY2hlKS4KKyAqLworc3RhdGljIHNzaXplX3QKK25mc19maWxlX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBpb2NiLT5raV9maWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzc2l6ZV90IHJlc3VsdDsKKworI2lmZGVmIENPTkZJR19ORlNfRElSRUNUSU8KKwlpZiAoaW9jYi0+a2lfZmlscC0+Zl9mbGFncyAmIE9fRElSRUNUKQorCQlyZXR1cm4gbmZzX2ZpbGVfZGlyZWN0X3dyaXRlKGlvY2IsIGJ1ZiwgY291bnQsIHBvcyk7CisjZW5kaWYKKworCWRmcHJpbnRrKFZGUywgIm5mczogd3JpdGUoJXMvJXMoJWxkKSwgJWx1QCVsdSlcbiIsCisJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQlpbm9kZS0+aV9pbm8sICh1bnNpZ25lZCBsb25nKSBjb3VudCwgKHVuc2lnbmVkIGxvbmcpIHBvcyk7CisKKwlyZXN1bHQgPSAtRUJVU1k7CisJaWYgKElTX1NXQVBGSUxFKGlub2RlKSkKKwkJZ290byBvdXRfc3dhcGZpbGU7CisJcmVzdWx0ID0gbmZzX3JldmFsaWRhdGVfaW5vZGUoTkZTX1NFUlZFUihpbm9kZSksIGlub2RlKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIG91dDsKKworCXJlc3VsdCA9IGNvdW50OworCWlmICghY291bnQpCisJCWdvdG8gb3V0OworCisJcmVzdWx0ID0gZ2VuZXJpY19maWxlX2Fpb193cml0ZShpb2NiLCBidWYsIGNvdW50LCBwb3MpOworb3V0OgorCXJldHVybiByZXN1bHQ7CisKK291dF9zd2FwZmlsZToKKwlwcmludGsoS0VSTl9JTkZPICJORlM6IGF0dGVtcHQgdG8gd3JpdGUgdG8gYWN0aXZlIHN3YXAgZmlsZSFcbiIpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IGRvX2dldGxrKHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9tYXBwaW5nLT5ob3N0OworCWludCBzdGF0dXMgPSAwOworCisJbG9ja19rZXJuZWwoKTsKKwkvKiBVc2UgbG9jYWwgbG9ja2luZyBpZiBtb3VudGVkIHdpdGggIi1vbm9sb2NrIiAqLworCWlmICghKE5GU19TRVJWRVIoaW5vZGUpLT5mbGFncyAmIE5GU19NT1VOVF9OT05MTSkpCisJCXN0YXR1cyA9IE5GU19QUk9UTyhpbm9kZSktPmxvY2soZmlscCwgY21kLCBmbCk7CisJZWxzZSB7CisJCXN0cnVjdCBmaWxlX2xvY2sgKmNmbCA9IHBvc2l4X3Rlc3RfbG9jayhmaWxwLCBmbCk7CisKKwkJZmwtPmZsX3R5cGUgPSBGX1VOTENLOworCQlpZiAoY2ZsICE9IE5VTEwpCisJCQltZW1jcHkoZmwsIGNmbCwgc2l6ZW9mKCpmbCkpOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkb192ZnNfbG9jayhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJaW50IHJlcyA9IDA7CisJc3dpdGNoIChmbC0+ZmxfZmxhZ3MgJiAoRkxfUE9TSVh8RkxfRkxPQ0spKSB7CisJCWNhc2UgRkxfUE9TSVg6CisJCQlyZXMgPSBwb3NpeF9sb2NrX2ZpbGVfd2FpdChmaWxlLCBmbCk7CisJCQlicmVhazsKKwkJY2FzZSBGTF9GTE9DSzoKKwkJCXJlcyA9IGZsb2NrX2xvY2tfZmlsZV93YWl0KGZpbGUsIGZsKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJfQorCWlmIChyZXMgPCAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVkZTIGlzIG91dCBvZiBzeW5jIHdpdGggbG9jayBtYW5hZ2VyIVxuIiwKKwkJCQlfX0ZVTkNUSU9OX18pOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgZG9fdW5sayhzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfbWFwcGluZy0+aG9zdDsKKwlzaWdzZXRfdCBvbGRzZXQ7CisJaW50IHN0YXR1czsKKworCXJwY19jbG50X3NpZ21hc2soTkZTX0NMSUVOVChpbm9kZSksICZvbGRzZXQpOworCS8qCisJICogRmx1c2ggYWxsIHBlbmRpbmcgd3JpdGVzIGJlZm9yZSBkb2luZyBhbnl0aGluZworCSAqIHdpdGggbG9ja3MuLgorCSAqLworCWZpbGVtYXBfZmRhdGF3cml0ZShmaWxwLT5mX21hcHBpbmcpOworCWRvd24oJmlub2RlLT5pX3NlbSk7CisJbmZzX3diX2FsbChpbm9kZSk7CisJdXAoJmlub2RlLT5pX3NlbSk7CisJZmlsZW1hcF9mZGF0YXdhaXQoZmlscC0+Zl9tYXBwaW5nKTsKKworCS8qIE5PVEU6IHNwZWNpYWwgY2FzZQorCSAqIAlJZiB3ZSdyZSBzaWduYWxsZWQgd2hpbGUgY2xlYW5pbmcgdXAgbG9ja3Mgb24gcHJvY2VzcyBleGl0LCB3ZQorCSAqIAlzdGlsbCBuZWVkIHRvIGNvbXBsZXRlIHRoZSB1bmxvY2suCisJICovCisJbG9ja19rZXJuZWwoKTsKKwkvKiBVc2UgbG9jYWwgbG9ja2luZyBpZiBtb3VudGVkIHdpdGggIi1vbm9sb2NrIiAqLworCWlmICghKE5GU19TRVJWRVIoaW5vZGUpLT5mbGFncyAmIE5GU19NT1VOVF9OT05MTSkpCisJCXN0YXR1cyA9IE5GU19QUk9UTyhpbm9kZSktPmxvY2soZmlscCwgY21kLCBmbCk7CisJZWxzZQorCQlzdGF0dXMgPSBkb192ZnNfbG9jayhmaWxwLCBmbCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJwY19jbG50X3NpZ3VubWFzayhORlNfQ0xJRU5UKGlub2RlKSwgJm9sZHNldCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkb19zZXRsayhzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfbWFwcGluZy0+aG9zdDsKKwlzaWdzZXRfdCBvbGRzZXQ7CisJaW50IHN0YXR1czsKKworCXJwY19jbG50X3NpZ21hc2soTkZTX0NMSUVOVChpbm9kZSksICZvbGRzZXQpOworCS8qCisJICogRmx1c2ggYWxsIHBlbmRpbmcgd3JpdGVzIGJlZm9yZSBkb2luZyBhbnl0aGluZworCSAqIHdpdGggbG9ja3MuLgorCSAqLworCXN0YXR1cyA9IGZpbGVtYXBfZmRhdGF3cml0ZShmaWxwLT5mX21hcHBpbmcpOworCWlmIChzdGF0dXMgPT0gMCkgeworCQlkb3duKCZpbm9kZS0+aV9zZW0pOworCQlzdGF0dXMgPSBuZnNfd2JfYWxsKGlub2RlKTsKKwkJdXAoJmlub2RlLT5pX3NlbSk7CisJCWlmIChzdGF0dXMgPT0gMCkKKwkJCXN0YXR1cyA9IGZpbGVtYXBfZmRhdGF3YWl0KGZpbHAtPmZfbWFwcGluZyk7CisJfQorCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIG91dDsKKworCWxvY2tfa2VybmVsKCk7CisJLyogVXNlIGxvY2FsIGxvY2tpbmcgaWYgbW91bnRlZCB3aXRoICItb25vbG9jayIgKi8KKwlpZiAoIShORlNfU0VSVkVSKGlub2RlKS0+ZmxhZ3MgJiBORlNfTU9VTlRfTk9OTE0pKSB7CisJCXN0YXR1cyA9IE5GU19QUk9UTyhpbm9kZSktPmxvY2soZmlscCwgY21kLCBmbCk7CisJCS8qIElmIHdlIHdlcmUgc2lnbmFsbGVkIHdlIHN0aWxsIG5lZWQgdG8gZW5zdXJlIHRoYXQKKwkJICogd2UgY2xlYW4gdXAgYW55IHN0YXRlIG9uIHRoZSBzZXJ2ZXIuIFdlIHRoZXJlZm9yZQorCQkgKiByZWNvcmQgdGhlIGxvY2sgY2FsbCBhcyBoYXZpbmcgc3VjY2VlZGVkIGluIG9yZGVyIHRvCisJCSAqIGVuc3VyZSB0aGF0IGxvY2tzX3JlbW92ZV9wb3NpeCgpIGNsZWFucyBpdCBvdXQgd2hlbgorCQkgKiB0aGUgcHJvY2VzcyBleGl0cy4KKwkJICovCisJCWlmIChzdGF0dXMgPT0gLUVJTlRSIHx8IHN0YXR1cyA9PSAtRVJFU1RBUlRTWVMpCisJCQlkb192ZnNfbG9jayhmaWxwLCBmbCk7CisJfSBlbHNlCisJCXN0YXR1cyA9IGRvX3Zmc19sb2NrKGZpbHAsIGZsKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gb3V0OworCS8qCisJICogTWFrZSBzdXJlIHdlIGNsZWFyIHRoZSBjYWNoZSB3aGVuZXZlciB3ZSB0cnkgdG8gZ2V0IHRoZSBsb2NrLgorCSAqIFRoaXMgbWFrZXMgbG9ja2luZyBhY3QgYXMgYSBjYWNoZSBjb2hlcmVuY3kgcG9pbnQuCisJICovCisJZmlsZW1hcF9mZGF0YXdyaXRlKGZpbHAtPmZfbWFwcGluZyk7CisJZG93bigmaW5vZGUtPmlfc2VtKTsKKwluZnNfd2JfYWxsKGlub2RlKTsJLyogd2UgbWF5IGhhdmUgc2xlcHQgKi8KKwl1cCgmaW5vZGUtPmlfc2VtKTsKKwlmaWxlbWFwX2ZkYXRhd2FpdChmaWxwLT5mX21hcHBpbmcpOworCW5mc196YXBfY2FjaGVzKGlub2RlKTsKK291dDoKKwlycGNfY2xudF9zaWd1bm1hc2soTkZTX0NMSUVOVChpbm9kZSksICZvbGRzZXQpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBMb2NrIGEgKHBvcnRpb24gb2YpIGEgZmlsZQorICovCitzdGF0aWMgaW50IG5mc19sb2NrKHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGZpbHAtPmZfbWFwcGluZy0+aG9zdDsKKworCWRwcmludGsoIk5GUzogbmZzX2xvY2soZj0lcy8lbGQsIHQ9JXgsIGZsPSV4LCByPSVMZDolTGQpXG4iLAorCQkJaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywKKwkJCWZsLT5mbF90eXBlLCBmbC0+ZmxfZmxhZ3MsCisJCQkobG9uZyBsb25nKWZsLT5mbF9zdGFydCwgKGxvbmcgbG9uZylmbC0+ZmxfZW5kKTsKKworCWlmICghaW5vZGUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogTm8gbWFuZGF0b3J5IGxvY2tzIG92ZXIgTkZTICovCisJaWYgKChpbm9kZS0+aV9tb2RlICYgKFNfSVNHSUQgfCBTX0lYR1JQKSkgPT0gU19JU0dJRCkKKwkJcmV0dXJuIC1FTk9MQ0s7CisKKwlpZiAoSVNfR0VUTEsoY21kKSkKKwkJcmV0dXJuIGRvX2dldGxrKGZpbHAsIGNtZCwgZmwpOworCWlmIChmbC0+ZmxfdHlwZSA9PSBGX1VOTENLKQorCQlyZXR1cm4gZG9fdW5sayhmaWxwLCBjbWQsIGZsKTsKKwlyZXR1cm4gZG9fc2V0bGsoZmlscCwgY21kLCBmbCk7Cit9CisKKy8qCisgKiBMb2NrIGEgKHBvcnRpb24gb2YpIGEgZmlsZQorICovCitzdGF0aWMgaW50IG5mc19mbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxwLT5mX21hcHBpbmctPmhvc3Q7CisKKwlkcHJpbnRrKCJORlM6IG5mc19mbG9jayhmPSVzLyVsZCwgdD0leCwgZmw9JXgpXG4iLAorCQkJaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywKKwkJCWZsLT5mbF90eXBlLCBmbC0+ZmxfZmxhZ3MpOworCisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIE5vIEJTRCBmbG9ja3Mgb3ZlciBORlMgYWxsb3dlZC4KKwkgKiBOb3RlOiB3ZSBjb3VsZCB0cnkgdG8gZmFrZSBhIFBPU0lYIGxvY2sgcmVxdWVzdCBoZXJlIGJ5CisJICogdXNpbmcgKCh1MzIpIGZpbHAgfCAweDgwMDAwMDAwKSBvciBzb21lIHN1Y2ggYXMgdGhlIHBpZC4KKwkgKiBOb3Qgc3VyZSB3aGV0aGVyIHRoYXQgd291bGQgYmUgdW5pcXVlLCB0aG91Z2gsIG9yIHdoZXRoZXIKKwkgKiB0aGF0IHdvdWxkIGJyZWFrIGluIG90aGVyIHBsYWNlcy4KKwkgKi8KKwlpZiAoIShmbC0+ZmxfZmxhZ3MgJiBGTF9GTE9DSykpCisJCXJldHVybiAtRU5PTENLOworCisJLyogV2UncmUgc2ltdWxhdGluZyBmbG9jaygpIGxvY2tzIHVzaW5nIHBvc2l4IGxvY2tzIG9uIHRoZSBzZXJ2ZXIgKi8KKwlmbC0+Zmxfb3duZXIgPSAoZmxfb3duZXJfdClmaWxwOworCWZsLT5mbF9zdGFydCA9IDA7CisJZmwtPmZsX2VuZCA9IE9GRlNFVF9NQVg7CisKKwlpZiAoZmwtPmZsX3R5cGUgPT0gRl9VTkxDSykKKwkJcmV0dXJuIGRvX3VubGsoZmlscCwgY21kLCBmbCk7CisJcmV0dXJuIGRvX3NldGxrKGZpbHAsIGNtZCwgZmwpOworfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2lkbWFwLmMgYi9mcy9uZnMvaWRtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzRjNGUzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL2lkbWFwLmMKQEAgLTAsMCArMSw0OTggQEAKKy8qCisgKiBmcy9uZnMvaWRtYXAuYworICoKKyAqICBVSUQgYW5kIEdJRCB0byBuYW1lIG1hcHBpbmcgZm9yIGNsaWVudHMuCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBNYXJpdXMgQWFtb2R0IEVyaWtzZW4gPG1hcml1c0B1bWljaC5lZHU+CisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9ycGNfcGlwZV9mcy5oPgorCisjaW5jbHVkZSA8bGludXgvbmZzX2ZzX3NiLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZnNfaWRtYXAuaD4KKworI2RlZmluZSBJRE1BUF9IQVNIX1NaICAgICAgICAgIDEyOAorCitzdHJ1Y3QgaWRtYXBfaGFzaGVudCB7CisJX191MzIgaWhfaWQ7CisJaW50IGloX25hbWVsZW47CisJY2hhciBpaF9uYW1lW0lETUFQX05BTUVTWl07Cit9OworCitzdHJ1Y3QgaWRtYXBfaGFzaHRhYmxlIHsKKwlfX3U4IGhfdHlwZTsKKwlzdHJ1Y3QgaWRtYXBfaGFzaGVudCBoX2VudHJpZXNbSURNQVBfSEFTSF9TWl07Cit9OworCitzdHJ1Y3QgaWRtYXAgeworCWNoYXIgICAgICAgICAgICAgICAgICBpZG1hcF9wYXRoWzQ4XTsKKwlzdHJ1Y3QgZGVudHJ5ICAgICAgICAqaWRtYXBfZGVudHJ5OworCXdhaXRfcXVldWVfaGVhZF90ICAgICBpZG1hcF93cTsKKwlzdHJ1Y3QgaWRtYXBfbXNnICAgICAgaWRtYXBfaW07CisJc3RydWN0IHNlbWFwaG9yZSAgICAgIGlkbWFwX2xvY2s7ICAgIC8qIFNlcmlhbGl6ZXMgdXBjYWxscyAqLworCXN0cnVjdCBzZW1hcGhvcmUgICAgICBpZG1hcF9pbV9sb2NrOyAvKiBQcm90ZWN0cyB0aGUgaGFzaHRhYmxlICovCisJc3RydWN0IGlkbWFwX2hhc2h0YWJsZSBpZG1hcF91c2VyX2hhc2g7CisJc3RydWN0IGlkbWFwX2hhc2h0YWJsZSBpZG1hcF9ncm91cF9oYXNoOworfTsKKworc3RhdGljIHNzaXplX3QgICBpZG1hcF9waXBlX3VwY2FsbChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgcnBjX3BpcGVfbXNnICosCisJCSAgICAgY2hhciBfX3VzZXIgKiwgc2l6ZV90KTsKK3N0YXRpYyBzc2l6ZV90ICAgaWRtYXBfcGlwZV9kb3duY2FsbChzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLAorCQkgICAgIHNpemVfdCk7Cit2b2lkICAgICAgICAgICAgIGlkbWFwX3BpcGVfZGVzdHJveV9tc2coc3RydWN0IHJwY19waXBlX21zZyAqKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBmbnZoYXNoMzIoY29uc3Qgdm9pZCAqLCBzaXplX3QpOworCitzdGF0aWMgc3RydWN0IHJwY19waXBlX29wcyBpZG1hcF91cGNhbGxfb3BzID0geworICAgICAgICAudXBjYWxsICAgICAgICAgPSBpZG1hcF9waXBlX3VwY2FsbCwKKyAgICAgICAgLmRvd25jYWxsICAgICAgID0gaWRtYXBfcGlwZV9kb3duY2FsbCwKKyAgICAgICAgLmRlc3Ryb3lfbXNnICAgID0gaWRtYXBfcGlwZV9kZXN0cm95X21zZywKK307CisKK3ZvaWQKK25mc19pZG1hcF9uZXcoc3RydWN0IG5mczRfY2xpZW50ICpjbHApCit7CisJc3RydWN0IGlkbWFwICppZG1hcDsKKworCWlmIChjbHAtPmNsX2lkbWFwICE9IE5VTEwpCisJCXJldHVybjsKKyAgICAgICAgaWYgKChpZG1hcCA9IGttYWxsb2Moc2l6ZW9mKCppZG1hcCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworCW1lbXNldChpZG1hcCwgMCwgc2l6ZW9mKCppZG1hcCkpOworCisJc25wcmludGYoaWRtYXAtPmlkbWFwX3BhdGgsIHNpemVvZihpZG1hcC0+aWRtYXBfcGF0aCksCisJICAgICIlcy9pZG1hcCIsIGNscC0+Y2xfcnBjY2xpZW50LT5jbF9wYXRobmFtZSk7CisKKyAgICAgICAgaWRtYXAtPmlkbWFwX2RlbnRyeSA9IHJwY19ta3BpcGUoaWRtYXAtPmlkbWFwX3BhdGgsCisJICAgIGlkbWFwLCAmaWRtYXBfdXBjYWxsX29wcywgMCk7CisgICAgICAgIGlmIChJU19FUlIoaWRtYXAtPmlkbWFwX2RlbnRyeSkpIHsKKwkJa2ZyZWUoaWRtYXApOworCQlyZXR1cm47CisJfQorCisgICAgICAgIGluaXRfTVVURVgoJmlkbWFwLT5pZG1hcF9sb2NrKTsKKyAgICAgICAgaW5pdF9NVVRFWCgmaWRtYXAtPmlkbWFwX2ltX2xvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlkbWFwLT5pZG1hcF93cSk7CisJaWRtYXAtPmlkbWFwX3VzZXJfaGFzaC5oX3R5cGUgPSBJRE1BUF9UWVBFX1VTRVI7CisJaWRtYXAtPmlkbWFwX2dyb3VwX2hhc2guaF90eXBlID0gSURNQVBfVFlQRV9HUk9VUDsKKworCWNscC0+Y2xfaWRtYXAgPSBpZG1hcDsKK30KKwordm9pZAorbmZzX2lkbWFwX2RlbGV0ZShzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgaWRtYXAgKmlkbWFwID0gY2xwLT5jbF9pZG1hcDsKKworCWlmICghaWRtYXApCisJCXJldHVybjsKKwlycGNfdW5saW5rKGlkbWFwLT5pZG1hcF9wYXRoKTsKKwljbHAtPmNsX2lkbWFwID0gTlVMTDsKKwlrZnJlZShpZG1hcCk7Cit9CisKKy8qCisgKiBIZWxwZXIgcm91dGluZXMgZm9yIG1hbmlwdWxhdGluZyB0aGUgaGFzaHRhYmxlCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlkbWFwX2hhc2hlbnQgKgoraWRtYXBfbmFtZV9oYXNoKHN0cnVjdCBpZG1hcF9oYXNodGFibGUqIGgsIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuICZoLT5oX2VudHJpZXNbZm52aGFzaDMyKG5hbWUsIGxlbikgJSBJRE1BUF9IQVNIX1NaXTsKK30KKworc3RhdGljIHN0cnVjdCBpZG1hcF9oYXNoZW50ICoKK2lkbWFwX2xvb2t1cF9uYW1lKHN0cnVjdCBpZG1hcF9oYXNodGFibGUgKmgsIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGlkbWFwX2hhc2hlbnQgKmhlID0gaWRtYXBfbmFtZV9oYXNoKGgsIG5hbWUsIGxlbik7CisKKwlpZiAoaGUtPmloX25hbWVsZW4gIT0gbGVuIHx8IG1lbWNtcChoZS0+aWhfbmFtZSwgbmFtZSwgbGVuKSAhPSAwKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gaGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlkbWFwX2hhc2hlbnQgKgoraWRtYXBfaWRfaGFzaChzdHJ1Y3QgaWRtYXBfaGFzaHRhYmxlKiBoLCBfX3UzMiBpZCkKK3sKKwlyZXR1cm4gJmgtPmhfZW50cmllc1tmbnZoYXNoMzIoJmlkLCBzaXplb2YoaWQpKSAlIElETUFQX0hBU0hfU1pdOworfQorCitzdGF0aWMgc3RydWN0IGlkbWFwX2hhc2hlbnQgKgoraWRtYXBfbG9va3VwX2lkKHN0cnVjdCBpZG1hcF9oYXNodGFibGUgKmgsIF9fdTMyIGlkKQoreworCXN0cnVjdCBpZG1hcF9oYXNoZW50ICpoZSA9IGlkbWFwX2lkX2hhc2goaCwgaWQpOworCWlmIChoZS0+aWhfaWQgIT0gaWQgfHwgaGUtPmloX25hbWVsZW4gPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGhlOworfQorCisvKgorICogUm91dGluZXMgZm9yIGFsbG9jYXRpbmcgbmV3IGVudHJpZXMgaW4gdGhlIGhhc2h0YWJsZS4KKyAqIEZvciBub3csIHdlIGp1c3QgaGF2ZSAxIGVudHJ5IHBlciBidWNrZXQsIHNvIGl0J3MgYWxsCisgKiBwcmV0dHkgdHJpdmlhbC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaWRtYXBfaGFzaGVudCAqCitpZG1hcF9hbGxvY19uYW1lKHN0cnVjdCBpZG1hcF9oYXNodGFibGUgKmgsIGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxlbikKK3sKKwlyZXR1cm4gaWRtYXBfbmFtZV9oYXNoKGgsIG5hbWUsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlkbWFwX2hhc2hlbnQgKgoraWRtYXBfYWxsb2NfaWQoc3RydWN0IGlkbWFwX2hhc2h0YWJsZSAqaCwgX191MzIgaWQpCit7CisJcmV0dXJuIGlkbWFwX2lkX2hhc2goaCwgaWQpOworfQorCitzdGF0aWMgdm9pZAoraWRtYXBfdXBkYXRlX2VudHJ5KHN0cnVjdCBpZG1hcF9oYXNoZW50ICpoZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJc2l6ZV90IG5hbWVsZW4sIF9fdTMyIGlkKQoreworCWhlLT5paF9pZCA9IGlkOworCW1lbWNweShoZS0+aWhfbmFtZSwgbmFtZSwgbmFtZWxlbik7CisJaGUtPmloX25hbWVbbmFtZWxlbl0gPSAnXDAnOworCWhlLT5paF9uYW1lbGVuID0gbmFtZWxlbjsKK30KKworLyoKKyAqIE5hbWUgLT4gSUQKKyAqLworc3RhdGljIGludAorbmZzX2lkbWFwX2lkKHN0cnVjdCBpZG1hcCAqaWRtYXAsIHN0cnVjdCBpZG1hcF9oYXNodGFibGUgKmgsCisJCWNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lbGVuLCBfX3UzMiAqaWQpCit7CisJc3RydWN0IHJwY19waXBlX21zZyBtc2c7CisJc3RydWN0IGlkbWFwX21zZyAqaW07CisJc3RydWN0IGlkbWFwX2hhc2hlbnQgKmhlOworCURFQ0xBUkVfV0FJVFFVRVVFKHdxLCBjdXJyZW50KTsKKwlpbnQgcmV0ID0gLUVJTzsKKworCWltID0gJmlkbWFwLT5pZG1hcF9pbTsKKworCS8qCisJICogU3RyaW5nIHNhbml0eSBjaGVja3MKKwkgKiBOb3RlIHRoYXQgdGhlIHVzZXJsYW5kIGRhZW1vbiBleHBlY3RzIE5VTCB0ZXJtaW5hdGVkIHN0cmluZ3MKKwkgKi8KKwlmb3IgKDs7KSB7CisJCWlmIChuYW1lbGVuID09IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKG5hbWVbbmFtZWxlbi0xXSAhPSAnXDAnKQorCQkJYnJlYWs7CisJCW5hbWVsZW4tLTsKKwl9CisJaWYgKG5hbWVsZW4gPj0gSURNQVBfTkFNRVNaKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd24oJmlkbWFwLT5pZG1hcF9sb2NrKTsKKwlkb3duKCZpZG1hcC0+aWRtYXBfaW1fbG9jayk7CisKKwloZSA9IGlkbWFwX2xvb2t1cF9uYW1lKGgsIG5hbWUsIG5hbWVsZW4pOworCWlmIChoZSAhPSBOVUxMKSB7CisJCSppZCA9IGhlLT5paF9pZDsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJbWVtc2V0KGltLCAwLCBzaXplb2YoKmltKSk7CisJbWVtY3B5KGltLT5pbV9uYW1lLCBuYW1lLCBuYW1lbGVuKTsKKworCWltLT5pbV90eXBlID0gaC0+aF90eXBlOworCWltLT5pbV9jb252ID0gSURNQVBfQ09OVl9OQU1FVE9JRDsKKworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisJbXNnLmRhdGEgPSBpbTsKKwltc2cubGVuID0gc2l6ZW9mKCppbSk7CisKKwlhZGRfd2FpdF9xdWV1ZSgmaWRtYXAtPmlkbWFwX3dxLCAmd3EpOworCWlmIChycGNfcXVldWVfdXBjYWxsKGlkbWFwLT5pZG1hcF9kZW50cnktPmRfaW5vZGUsICZtc2cpIDwgMCkgeworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmaWRtYXAtPmlkbWFwX3dxLCAmd3EpOworCQlnb3RvIG91dDsKKwl9CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJdXAoJmlkbWFwLT5pZG1hcF9pbV9sb2NrKTsKKwlzY2hlZHVsZSgpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXJlbW92ZV93YWl0X3F1ZXVlKCZpZG1hcC0+aWRtYXBfd3EsICZ3cSk7CisJZG93bigmaWRtYXAtPmlkbWFwX2ltX2xvY2spOworCisJaWYgKGltLT5pbV9zdGF0dXMgJiBJRE1BUF9TVEFUVVNfU1VDQ0VTUykgeworCQkqaWQgPSBpbS0+aW1faWQ7CisJCXJldCA9IDA7CisJfQorCisgb3V0OgorCW1lbXNldChpbSwgMCwgc2l6ZW9mKCppbSkpOworCXVwKCZpZG1hcC0+aWRtYXBfaW1fbG9jayk7CisJdXAoJmlkbWFwLT5pZG1hcF9sb2NrKTsKKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qCisgKiBJRCAtPiBOYW1lCisgKi8KK3N0YXRpYyBpbnQKK25mc19pZG1hcF9uYW1lKHN0cnVjdCBpZG1hcCAqaWRtYXAsIHN0cnVjdCBpZG1hcF9oYXNodGFibGUgKmgsCisJCV9fdTMyIGlkLCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBycGNfcGlwZV9tc2cgbXNnOworCXN0cnVjdCBpZG1hcF9tc2cgKmltOworCXN0cnVjdCBpZG1hcF9oYXNoZW50ICpoZTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3cSwgY3VycmVudCk7CisJaW50IHJldCA9IC1FSU87CisJdW5zaWduZWQgaW50IGxlbjsKKworCWltID0gJmlkbWFwLT5pZG1hcF9pbTsKKworCWRvd24oJmlkbWFwLT5pZG1hcF9sb2NrKTsKKwlkb3duKCZpZG1hcC0+aWRtYXBfaW1fbG9jayk7CisKKwloZSA9IGlkbWFwX2xvb2t1cF9pZChoLCBpZCk7CisJaWYgKGhlICE9IDApIHsKKwkJbWVtY3B5KG5hbWUsIGhlLT5paF9uYW1lLCBoZS0+aWhfbmFtZWxlbik7CisJCXJldCA9IGhlLT5paF9uYW1lbGVuOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1zZXQoaW0sIDAsIHNpemVvZigqaW0pKTsKKwlpbS0+aW1fdHlwZSA9IGgtPmhfdHlwZTsKKwlpbS0+aW1fY29udiA9IElETUFQX0NPTlZfSURUT05BTUU7CisJaW0tPmltX2lkID0gaWQ7CisKKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOworCW1zZy5kYXRhID0gaW07CisJbXNnLmxlbiA9IHNpemVvZigqaW0pOworCisJYWRkX3dhaXRfcXVldWUoJmlkbWFwLT5pZG1hcF93cSwgJndxKTsKKworCWlmIChycGNfcXVldWVfdXBjYWxsKGlkbWFwLT5pZG1hcF9kZW50cnktPmRfaW5vZGUsICZtc2cpIDwgMCkgeworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmaWRtYXAtPmlkbWFwX3dxLCAmd3EpOworCQlnb3RvIG91dDsKKwl9CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJdXAoJmlkbWFwLT5pZG1hcF9pbV9sb2NrKTsKKwlzY2hlZHVsZSgpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXJlbW92ZV93YWl0X3F1ZXVlKCZpZG1hcC0+aWRtYXBfd3EsICZ3cSk7CisJZG93bigmaWRtYXAtPmlkbWFwX2ltX2xvY2spOworCisJaWYgKGltLT5pbV9zdGF0dXMgJiBJRE1BUF9TVEFUVVNfU1VDQ0VTUykgeworCQlpZiAoKGxlbiA9IHN0cm5sZW4oaW0tPmltX25hbWUsIElETUFQX05BTUVTWikpID09IDApCisJCQlnb3RvIG91dDsKKwkJbWVtY3B5KG5hbWUsIGltLT5pbV9uYW1lLCBsZW4pOworCQlyZXQgPSBsZW47CisJfQorCisgb3V0OgorCW1lbXNldChpbSwgMCwgc2l6ZW9mKCppbSkpOworCXVwKCZpZG1hcC0+aWRtYXBfaW1fbG9jayk7CisJdXAoJmlkbWFwLT5pZG1hcF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBSUEMgcGlwZWZzIHVwY2FsbC9kb3duY2FsbCByb3V0aW5lcyAqLworc3RhdGljIHNzaXplX3QKK2lkbWFwX3BpcGVfdXBjYWxsKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcnBjX3BpcGVfbXNnICptc2csCisgICAgY2hhciBfX3VzZXIgKmRzdCwgc2l6ZV90IGJ1ZmxlbikKK3sKKyAgICAgICAgY2hhciAqZGF0YSA9IChjaGFyICopbXNnLT5kYXRhICsgbXNnLT5jb3BpZWQ7CisgICAgICAgIHNzaXplX3QgbWxlbiA9IG1zZy0+bGVuIC0gbXNnLT5jb3BpZWQ7CisgICAgICAgIHNzaXplX3QgbGVmdDsKKworICAgICAgICBpZiAobWxlbiA+IGJ1ZmxlbikKKyAgICAgICAgICAgICAgICBtbGVuID0gYnVmbGVuOworCisgICAgICAgIGxlZnQgPSBjb3B5X3RvX3VzZXIoZHN0LCBkYXRhLCBtbGVuKTsKKwlpZiAobGVmdCA8IDApIHsKKwkJbXNnLT5lcnJubyA9IGxlZnQ7CisJCXJldHVybiBsZWZ0OworCX0KKwltbGVuIC09IGxlZnQ7CisJbXNnLT5jb3BpZWQgKz0gbWxlbjsKKwltc2ctPmVycm5vID0gMDsKKyAgICAgICAgcmV0dXJuIG1sZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpZG1hcF9waXBlX2Rvd25jYWxsKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBzaXplX3QgbWxlbikKK3sKKyAgICAgICAgc3RydWN0IHJwY19pbm9kZSAqcnBjaSA9IFJQQ19JKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgaWRtYXAgKmlkbWFwID0gKHN0cnVjdCBpZG1hcCAqKXJwY2ktPnByaXZhdGU7CisJc3RydWN0IGlkbWFwX21zZyBpbV9pbiwgKmltID0gJmlkbWFwLT5pZG1hcF9pbTsKKwlzdHJ1Y3QgaWRtYXBfaGFzaHRhYmxlICpoOworCXN0cnVjdCBpZG1hcF9oYXNoZW50ICpoZSA9IE5VTEw7CisJaW50IG5hbWVsZW5faW47CisJaW50IHJldDsKKworICAgICAgICBpZiAobWxlbiAhPSBzaXplb2YoaW1faW4pKQorICAgICAgICAgICAgICAgIHJldHVybiAoLUVOT1NQQyk7CisKKyAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZpbV9pbiwgc3JjLCBtbGVuKSAhPSAwKQorCQlyZXR1cm4gKC1FRkFVTFQpOworCisJZG93bigmaWRtYXAtPmlkbWFwX2ltX2xvY2spOworCisJcmV0ID0gbWxlbjsKKwlpbS0+aW1fc3RhdHVzID0gaW1faW4uaW1fc3RhdHVzOworCS8qIElmIHdlIGdvdCBhbiBlcnJvciwgdGVybWluYXRlIG5vdywgYW5kIHdha2UgdXAgcGVuZGluZyB1cGNhbGxzICovCisJaWYgKCEoaW1faW4uaW1fc3RhdHVzICYgSURNQVBfU1RBVFVTX1NVQ0NFU1MpKSB7CisJCXdha2VfdXAoJmlkbWFwLT5pZG1hcF93cSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFNhbml0eSBjaGVja2luZyBvZiBzdHJpbmdzICovCisJcmV0ID0gLUVJTlZBTDsKKwluYW1lbGVuX2luID0gc3RybmxlbihpbV9pbi5pbV9uYW1lLCBJRE1BUF9OQU1FU1opOworCWlmIChuYW1lbGVuX2luID09IDAgfHwgbmFtZWxlbl9pbiA9PSBJRE1BUF9OQU1FU1opCisJCWdvdG8gb3V0OworCisJc3dpdGNoIChpbV9pbi5pbV90eXBlKSB7CisJCWNhc2UgSURNQVBfVFlQRV9VU0VSOgorCQkJaCA9ICZpZG1hcC0+aWRtYXBfdXNlcl9oYXNoOworCQkJYnJlYWs7CisJCWNhc2UgSURNQVBfVFlQRV9HUk9VUDoKKwkJCWggPSAmaWRtYXAtPmlkbWFwX2dyb3VwX2hhc2g7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gb3V0OworCX0KKworCXN3aXRjaCAoaW1faW4uaW1fY29udikgeworCWNhc2UgSURNQVBfQ09OVl9JRFRPTkFNRToKKwkJLyogRGlkIHdlIG1hdGNoIHRoZSBjdXJyZW50IHVwY2FsbD8gKi8KKwkJaWYgKGltLT5pbV9jb252ID09IElETUFQX0NPTlZfSURUT05BTUUKKwkJCQkmJiBpbS0+aW1fdHlwZSA9PSBpbV9pbi5pbV90eXBlCisJCQkJJiYgaW0tPmltX2lkID09IGltX2luLmltX2lkKSB7CisJCQkvKiBZZXM6IGNvcHkgc3RyaW5nLCBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nICdcMCcgICovCisJCQltZW1jcHkoaW0tPmltX25hbWUsIGltX2luLmltX25hbWUsIG5hbWVsZW5faW4pOworCQkJaW0tPmltX25hbWVbbmFtZWxlbl9pbl0gPSAnXDAnOworCQkJd2FrZV91cCgmaWRtYXAtPmlkbWFwX3dxKTsKKwkJfQorCQloZSA9IGlkbWFwX2FsbG9jX2lkKGgsIGltX2luLmltX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBJRE1BUF9DT05WX05BTUVUT0lEOgorCQkvKiBEaWQgd2UgbWF0Y2ggdGhlIGN1cnJlbnQgdXBjYWxsPyAqLworCQlpZiAoaW0tPmltX2NvbnYgPT0gSURNQVBfQ09OVl9OQU1FVE9JRAorCQkJCSYmIGltLT5pbV90eXBlID09IGltX2luLmltX3R5cGUKKwkJCQkmJiBzdHJubGVuKGltLT5pbV9uYW1lLCBJRE1BUF9OQU1FU1opID09IG5hbWVsZW5faW4KKwkJCQkmJiBtZW1jbXAoaW0tPmltX25hbWUsIGltX2luLmltX25hbWUsIG5hbWVsZW5faW4pID09IDApIHsKKwkJCWltLT5pbV9pZCA9IGltX2luLmltX2lkOworCQkJd2FrZV91cCgmaWRtYXAtPmlkbWFwX3dxKTsKKwkJfQorCQloZSA9IGlkbWFwX2FsbG9jX25hbWUoaCwgaW1faW4uaW1fbmFtZSwgbmFtZWxlbl9pbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gb3V0OworCX0KKworCS8qIElmIHRoZSBlbnRyeSBpcyB2YWxpZCwgYWxzbyBjb3B5IGl0IHRvIHRoZSBjYWNoZSAqLworCWlmIChoZSAhPSBOVUxMKQorCQlpZG1hcF91cGRhdGVfZW50cnkoaGUsIGltX2luLmltX25hbWUsIG5hbWVsZW5faW4sIGltX2luLmltX2lkKTsKKwlyZXQgPSBtbGVuOworb3V0OgorCXVwKCZpZG1hcC0+aWRtYXBfaW1fbG9jayk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZAoraWRtYXBfcGlwZV9kZXN0cm95X21zZyhzdHJ1Y3QgcnBjX3BpcGVfbXNnICptc2cpCit7CisJc3RydWN0IGlkbWFwX21zZyAqaW0gPSBtc2ctPmRhdGE7CisJc3RydWN0IGlkbWFwICppZG1hcCA9IGNvbnRhaW5lcl9vZihpbSwgc3RydWN0IGlkbWFwLCBpZG1hcF9pbSk7IAorCisJaWYgKG1zZy0+ZXJybm8gPj0gMCkKKwkJcmV0dXJuOworCWRvd24oJmlkbWFwLT5pZG1hcF9pbV9sb2NrKTsKKwlpbS0+aW1fc3RhdHVzID0gSURNQVBfU1RBVFVTX0xPT0tVUEZBSUw7CisJd2FrZV91cCgmaWRtYXAtPmlkbWFwX3dxKTsKKwl1cCgmaWRtYXAtPmlkbWFwX2ltX2xvY2spOworfQorCisvKiAKKyAqIEZvd2xlci9Ob2xsL1ZvIGhhc2gKKyAqICAgIGh0dHA6Ly93d3cuaXN0aGUuY29tL2Nob25nby90ZWNoL2NvbXAvZm52LworICovCisKKyNkZWZpbmUgRk5WX1BfMzIgKCh1bnNpZ25lZCBpbnQpMHgwMTAwMDE5MykgLyogMTY3Nzc2MTkgKi8KKyNkZWZpbmUgRk5WXzFfMzIgKCh1bnNpZ25lZCBpbnQpMHg4MTFjOWRjNSkgLyogMjE2NjEzNjI2MSAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGZudmhhc2gzMihjb25zdCB2b2lkICpidWYsIHNpemVfdCBidWZsZW4pCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCwgKmVuZCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopYnVmICsgYnVmbGVuOworCXVuc2lnbmVkIGludCBoYXNoID0gRk5WXzFfMzI7CisKKwlmb3IgKHAgPSBidWY7IHAgPCBlbmQ7IHArKykgeworCQloYXNoICo9IEZOVl9QXzMyOworCQloYXNoIF49ICh1bnNpZ25lZCBpbnQpKnA7CisJfQorCisJcmV0dXJuIChoYXNoKTsKK30KKworaW50IG5mc19tYXBfbmFtZV90b191aWQoc3RydWN0IG5mczRfY2xpZW50ICpjbHAsIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lbGVuLCBfX3UzMiAqdWlkKQoreworCXN0cnVjdCBpZG1hcCAqaWRtYXAgPSBjbHAtPmNsX2lkbWFwOworCisJcmV0dXJuIG5mc19pZG1hcF9pZChpZG1hcCwgJmlkbWFwLT5pZG1hcF91c2VyX2hhc2gsIG5hbWUsIG5hbWVsZW4sIHVpZCk7Cit9CisKK2ludCBuZnNfbWFwX2dyb3VwX3RvX2dpZChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVsZW4sIF9fdTMyICp1aWQpCit7CisJc3RydWN0IGlkbWFwICppZG1hcCA9IGNscC0+Y2xfaWRtYXA7CisKKwlyZXR1cm4gbmZzX2lkbWFwX2lkKGlkbWFwLCAmaWRtYXAtPmlkbWFwX2dyb3VwX2hhc2gsIG5hbWUsIG5hbWVsZW4sIHVpZCk7Cit9CisKK2ludCBuZnNfbWFwX3VpZF90b19uYW1lKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCBfX3UzMiB1aWQsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWRtYXAgKmlkbWFwID0gY2xwLT5jbF9pZG1hcDsKKworCXJldHVybiBuZnNfaWRtYXBfbmFtZShpZG1hcCwgJmlkbWFwLT5pZG1hcF91c2VyX2hhc2gsIHVpZCwgYnVmKTsKK30KK2ludCBuZnNfbWFwX2dpZF90b19ncm91cChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCwgX191MzIgdWlkLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlkbWFwICppZG1hcCA9IGNscC0+Y2xfaWRtYXA7CisKKwlyZXR1cm4gbmZzX2lkbWFwX25hbWUoaWRtYXAsICZpZG1hcC0+aWRtYXBfZ3JvdXBfaGFzaCwgdWlkLCBidWYpOworfQorCmRpZmYgLS1naXQgYS9mcy9uZnMvaW5vZGUuYyBiL2ZzL25mcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNDVmMjYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvaW5vZGUuYwpAQCAtMCwwICsxLDIwMDMgQEAKKy8qCisgKiAgbGludXgvZnMvbmZzL2lub2RlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyICBSaWNrIFNsYWRrZXkKKyAqCisgKiAgbmZzIGlub2RlIGFuZCBzdXBlcmJsb2NrIGhhbmRsaW5nIGZ1bmN0aW9ucworICoKKyAqICBNb2R1bGFyaXNlZCBieSBBbGFuIENveCA8QWxhbi5Db3hAbGludXgub3JnPiwgd2hpbGUgaGFja2luZyBzb21lCisgKiAgZXhwZXJpbWVudGFsIE5GUyBjaGFuZ2VzLiBNb2R1bGFyaXNhdGlvbiB0YWtlbiBzdHJhaWdodCBmcm9tIFNZUzUgZnMuCisgKgorICogIENoYW5nZSB0byBuZnNfcmVhZF9zdXBlcigpIHRvIHBlcm1pdCBORlMgbW91bnRzIHRvIG11bHRpLWhvbWVkIGhvc3RzLgorICogIEouUy5QZWF0ZmllbGRAZGFtdHAuY2FtLmFjLnVrCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdGF0cy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L25mczRfbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9iaW5kLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2lkbWFwLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImRlbGVnYXRpb24uaCIKKworI2RlZmluZSBORlNEQkdfRkFDSUxJVFkJCU5GU0RCR19WRlMKKyNkZWZpbmUgTkZTX1BBUkFOT0lBIDEKKworLyogTWF4aW11bSBudW1iZXIgb2YgcmVhZGFoZWFkIHJlcXVlc3RzCisgKiBGSVhNRTogdGhpcyBzaG91bGQgcmVhbGx5IGJlIGEgc3lzY3RsIHNvIHRoYXQgdXNlcnMgbWF5IHR1bmUgaXQgdG8gc3VpdAorICogICAgICAgIHRoZWlyIG5lZWRzLiBQZW9wbGUgdGhhdCBkbyBORlMgb3ZlciBhIHNsb3cgbmV0d29yaywgbWlnaHQgZm9yCisgKiAgICAgICAgaW5zdGFuY2Ugd2FudCB0byByZWR1Y2UgaXQgdG8gc29tZXRoaW5nIGNsb3NlciB0byAxIGZvciBpbXByb3ZlZAorICogICAgICAgIGludGVyYWN0aXZlIHJlc3BvbnNlLgorICovCisjZGVmaW5lIE5GU19NQVhfUkVBREFIRUFECShSUENfREVGX1NMT1RfVEFCTEUgLSAxKQorCitzdGF0aWMgdm9pZCBuZnNfaW52YWxpZGF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitzdGF0aWMgaW50IG5mc191cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICosIHN0cnVjdCBuZnNfZmF0dHIgKiwgdW5zaWduZWQgbG9uZyk7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKm5mc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK3N0YXRpYyB2b2lkIG5mc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK3N0YXRpYyBpbnQgbmZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqLGludCk7CitzdGF0aWMgdm9pZCBuZnNfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK3N0YXRpYyB2b2lkIG5mc19jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitzdGF0aWMgdm9pZCBuZnNfdW1vdW50X2JlZ2luKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK3N0YXRpYyBpbnQgIG5mc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBrc3RhdGZzICopOworc3RhdGljIGludCAgbmZzX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHZmc21vdW50ICopOworCitzdGF0aWMgc3RydWN0IHJwY19wcm9ncmFtCW5mc19wcm9ncmFtOworCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgbmZzX3NvcHMgPSB7IAorCS5hbGxvY19pbm9kZQk9IG5mc19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IG5mc19kZXN0cm95X2lub2RlLAorCS53cml0ZV9pbm9kZQk9IG5mc193cml0ZV9pbm9kZSwKKwkuZGVsZXRlX2lub2RlCT0gbmZzX2RlbGV0ZV9pbm9kZSwKKwkuc3RhdGZzCQk9IG5mc19zdGF0ZnMsCisJLmNsZWFyX2lub2RlCT0gbmZzX2NsZWFyX2lub2RlLAorCS51bW91bnRfYmVnaW4JPSBuZnNfdW1vdW50X2JlZ2luLAorCS5zaG93X29wdGlvbnMJPSBuZnNfc2hvd19vcHRpb25zLAorfTsKKworLyoKKyAqIFJQQyBjcnVmdCBmb3IgTkZTCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnBjX3N0YXQJCW5mc19ycGNzdGF0ID0geworCS5wcm9ncmFtCQk9ICZuZnNfcHJvZ3JhbQorfTsKK3N0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24gKgluZnNfdmVyc2lvbltdID0geworCU5VTEwsCisJTlVMTCwKKwkmbmZzX3ZlcnNpb24yLAorI2lmIGRlZmluZWQoQ09ORklHX05GU19WMykKKwkmbmZzX3ZlcnNpb24zLAorI2VsaWYgZGVmaW5lZChDT05GSUdfTkZTX1Y0KQorCU5VTEwsCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjQpCisJJm5mc192ZXJzaW9uNCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBycGNfcHJvZ3JhbQluZnNfcHJvZ3JhbSA9IHsKKwkubmFtZQkJCT0gIm5mcyIsCisJLm51bWJlcgkJCT0gTkZTX1BST0dSQU0sCisJLm5ydmVycwkJCT0gc2l6ZW9mKG5mc192ZXJzaW9uKSAvIHNpemVvZihuZnNfdmVyc2lvblswXSksCisJLnZlcnNpb24JCT0gbmZzX3ZlcnNpb24sCisJLnN0YXRzCQkJPSAmbmZzX3JwY3N0YXQsCisJLnBpcGVfZGlyX25hbWUJCT0gIi9uZnMiLAorfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCituZnNfZmF0dHJfdG9faW5vX3Qoc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJcmV0dXJuIG5mc19maWxlaWRfdG9faW5vX3QoZmF0dHItPmZpbGVpZCk7Cit9CisKK3N0YXRpYyBpbnQKK25mc193cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgc3luYykKK3sKKwlpbnQgZmxhZ3MgPSBzeW5jID8gRkxVU0hfV0FJVCA6IDA7CisJaW50IHJldDsKKworCXJldCA9IG5mc19jb21taXRfaW5vZGUoaW5vZGUsIDAsIDAsIGZsYWdzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK25mc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJZHByaW50aygiTkZTOiBkZWxldGVfaW5vZGUoJXMvJWxkKVxuIiwgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7CisKKwluZnNfd2JfYWxsKGlub2RlKTsKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgc2hvdWxkIG5ldmVyIGhhcHBlbi4uLgorCSAqLworCWlmIChuZnNfaGF2ZV93cml0ZWJhY2tzKGlub2RlKSkgeworCQlwcmludGsoS0VSTl9FUlIgIm5mc19kZWxldGVfaW5vZGU6IGlub2RlICVsZCBoYXMgcGVuZGluZyBSUEMgcmVxdWVzdHNcbiIsIGlub2RlLT5pX2lubyk7CisJfQorCisJY2xlYXJfaW5vZGUoaW5vZGUpOworfQorCisvKgorICogRm9yIHRoZSBtb21lbnQsIHRoZSBvbmx5IHRhc2sgZm9yIHRoZSBORlMgY2xlYXJfaW5vZGUgbWV0aG9kIGlzIHRvCisgKiByZWxlYXNlIHRoZSBtbWFwIGNyZWRlbnRpYWwKKyAqLworc3RhdGljIHZvaWQKK25mc19jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisJc3RydWN0IHJwY19jcmVkICpjcmVkOworCisJbmZzX3diX2FsbChpbm9kZSk7CisJQlVHX09OICghbGlzdF9lbXB0eSgmbmZzaS0+b3Blbl9maWxlcykpOworCWNyZWQgPSBuZnNpLT5jYWNoZV9hY2Nlc3MuY3JlZDsKKwlpZiAoY3JlZCkKKwkJcHV0X3JwY2NyZWQoY3JlZCk7CisJQlVHX09OKGF0b21pY19yZWFkKCZuZnNpLT5kYXRhX3VwZGF0ZXMpICE9IDApOworfQorCit2b2lkCituZnNfdW1vdW50X2JlZ2luKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TQihzYik7CisJc3RydWN0IHJwY19jbG50CSpycGM7CisKKwkvKiAtRUlPIGFsbCBwZW5kaW5nIEkvTyAqLworCWlmICgocnBjID0gc2VydmVyLT5jbGllbnQpICE9IE5VTEwpCisJCXJwY19raWxsYWxsX3Rhc2tzKHJwYyk7Cit9CisKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCituZnNfYmxvY2tfYml0cyh1bnNpZ25lZCBsb25nIGJzaXplLCB1bnNpZ25lZCBjaGFyICpucmJpdHNwKQoreworCS8qIG1ha2Ugc3VyZSBibG9ja3NpemUgaXMgYSBwb3dlciBvZiB0d28gKi8KKwlpZiAoKGJzaXplICYgKGJzaXplIC0gMSkpIHx8IG5yYml0c3ApIHsKKwkJdW5zaWduZWQgY2hhcglucmJpdHM7CisKKwkJZm9yIChucmJpdHMgPSAzMTsgbnJiaXRzICYmICEoYnNpemUgJiAoMSA8PCBucmJpdHMpKTsgbnJiaXRzLS0pCisJCQk7CisJCWJzaXplID0gMSA8PCBucmJpdHM7CisJCWlmIChucmJpdHNwKQorCQkJKm5yYml0c3AgPSBucmJpdHM7CisJfQorCisJcmV0dXJuIGJzaXplOworfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgNTEyYnl0ZSBibG9ja3MgdXNlZC4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCituZnNfY2FsY19ibG9ja19zaXplKHU2NCB0c2l6ZSkKK3sKKwlsb2ZmX3QgdXNlZCA9ICh0c2l6ZSArIDUxMSkgPj4gOTsKKwlyZXR1cm4gKHVzZWQgPiBVTE9OR19NQVgpID8gVUxPTkdfTUFYIDogdXNlZDsKK30KKworLyoKKyAqIENvbXB1dGUgYW5kIHNldCBORlMgc2VydmVyIGJsb2Nrc2l6ZQorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK25mc19ibG9ja19zaXplKHVuc2lnbmVkIGxvbmcgYnNpemUsIHVuc2lnbmVkIGNoYXIgKm5yYml0c3ApCit7CisJaWYgKGJzaXplIDwgMTAyNCkKKwkJYnNpemUgPSBORlNfREVGX0ZJTEVfSU9fQlVGRkVSX1NJWkU7CisJZWxzZSBpZiAoYnNpemUgPj0gTkZTX01BWF9GSUxFX0lPX0JVRkZFUl9TSVpFKQorCQlic2l6ZSA9IE5GU19NQVhfRklMRV9JT19CVUZGRVJfU0laRTsKKworCXJldHVybiBuZnNfYmxvY2tfYml0cyhic2l6ZSwgbnJiaXRzcCk7Cit9CisKKy8qCisgKiBPYnRhaW4gdGhlIHJvb3QgaW5vZGUgb2YgdGhlIGZpbGUgc3lzdGVtLgorICovCitzdGF0aWMgc3RydWN0IGlub2RlICoKK25mc19nZXRfcm9vdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgbmZzX2ZoICpyb290ZmgsIHN0cnVjdCBuZnNfZnNpbmZvICpmc2luZm8pCit7CisJc3RydWN0IG5mc19zZXJ2ZXIJKnNlcnZlciA9IE5GU19TQihzYik7CisJc3RydWN0IGlub2RlICpyb290aTsKKwlpbnQJCQllcnJvcjsKKworCWVycm9yID0gc2VydmVyLT5ycGNfb3BzLT5nZXRyb290KHNlcnZlciwgcm9vdGZoLCBmc2luZm8pOworCWlmIChlcnJvciA8IDApIHsKKwkJZHByaW50aygibmZzX2dldF9yb290OiBnZXRhdHRyIGVycm9yID0gJWRcbiIsIC1lcnJvcik7CisJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKKwl9CisKKwlyb290aSA9IG5mc19maGdldChzYiwgcm9vdGZoLCBmc2luZm8tPmZhdHRyKTsKKwlpZiAoIXJvb3RpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlyZXR1cm4gcm9vdGk7Cit9CisKKy8qCisgKiBEbyBORlMgdmVyc2lvbi1pbmRlcGVuZGVudCBtb3VudCBwcm9jZXNzaW5nLCBhbmQgc2FuaXR5IGNoZWNraW5nCisgKi8KK3N0YXRpYyBpbnQKK25mc19zYl9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHJwY19hdXRoZmxhdm9yX3QgYXV0aGZsYXZvcikKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlcgkqc2VydmVyOworCXN0cnVjdCBpbm9kZQkJKnJvb3RfaW5vZGU7CisJc3RydWN0IG5mc19mYXR0cglmYXR0cjsKKwlzdHJ1Y3QgbmZzX2ZzaW5mbwlmc2luZm8gPSB7CisJCQkJCS5mYXR0ciA9ICZmYXR0ciwKKwkJCQl9OworCXN0cnVjdCBuZnNfcGF0aGNvbmYgcGF0aGluZm8gPSB7CisJCQkuZmF0dHIgPSAmZmF0dHIsCisJfTsKKwlpbnQgbm9fcm9vdF9lcnJvciA9IDA7CisJdW5zaWduZWQgbG9uZyBtYXhfcnBjX3BheWxvYWQ7CisKKwkvKiBXZSBwcm9iYWJseSB3YW50IHNvbWV0aGluZyBtb3JlIGluZm9ybWF0aXZlIGhlcmUgKi8KKwlzbnByaW50ZihzYi0+c19pZCwgc2l6ZW9mKHNiLT5zX2lkKSwgIiV4OiV4IiwgTUFKT1Ioc2ItPnNfZGV2KSwgTUlOT1Ioc2ItPnNfZGV2KSk7CisKKwlzZXJ2ZXIgPSBORlNfU0Ioc2IpOworCisJc2ItPnNfbWFnaWMgICAgICA9IE5GU19TVVBFUl9NQUdJQzsKKworCXJvb3RfaW5vZGUgPSBuZnNfZ2V0X3Jvb3Qoc2IsICZzZXJ2ZXItPmZoLCAmZnNpbmZvKTsKKwkvKiBEaWQgZ2V0dGluZyB0aGUgcm9vdCBpbm9kZSBmYWlsPyAqLworCWlmIChJU19FUlIocm9vdF9pbm9kZSkpIHsKKwkJbm9fcm9vdF9lcnJvciA9IFBUUl9FUlIocm9vdF9pbm9kZSk7CisJCWdvdG8gb3V0X25vX3Jvb3Q7CisJfQorCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdF9pbm9kZSk7CisJaWYgKCFzYi0+c19yb290KSB7CisJCW5vX3Jvb3RfZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIG91dF9ub19yb290OworCX0KKwlzYi0+c19yb290LT5kX29wID0gc2VydmVyLT5ycGNfb3BzLT5kZW50cnlfb3BzOworCisJLyogR2V0IHNvbWUgZ2VuZXJhbCBmaWxlIHN5c3RlbSBpbmZvICovCisJaWYgKHNlcnZlci0+bmFtZWxlbiA9PSAwICYmCisJICAgIHNlcnZlci0+cnBjX29wcy0+cGF0aGNvbmYoc2VydmVyLCAmc2VydmVyLT5maCwgJnBhdGhpbmZvKSA+PSAwKQorCQlzZXJ2ZXItPm5hbWVsZW4gPSBwYXRoaW5mby5tYXhfbmFtZWxlbjsKKwkvKiBXb3JrIG91dCBhIGxvdCBvZiBwYXJhbWV0ZXJzICovCisJaWYgKHNlcnZlci0+cnNpemUgPT0gMCkKKwkJc2VydmVyLT5yc2l6ZSA9IG5mc19ibG9ja19zaXplKGZzaW5mby5ydHByZWYsIE5VTEwpOworCWlmIChzZXJ2ZXItPndzaXplID09IDApCisJCXNlcnZlci0+d3NpemUgPSBuZnNfYmxvY2tfc2l6ZShmc2luZm8ud3RwcmVmLCBOVUxMKTsKKworCWlmIChmc2luZm8ucnRtYXggPj0gNTEyICYmIHNlcnZlci0+cnNpemUgPiBmc2luZm8ucnRtYXgpCisJCXNlcnZlci0+cnNpemUgPSBuZnNfYmxvY2tfc2l6ZShmc2luZm8ucnRtYXgsIE5VTEwpOworCWlmIChmc2luZm8ud3RtYXggPj0gNTEyICYmIHNlcnZlci0+d3NpemUgPiBmc2luZm8ud3RtYXgpCisJCXNlcnZlci0+d3NpemUgPSBuZnNfYmxvY2tfc2l6ZShmc2luZm8ud3RtYXgsIE5VTEwpOworCisJbWF4X3JwY19wYXlsb2FkID0gbmZzX2Jsb2NrX3NpemUocnBjX21heF9wYXlsb2FkKHNlcnZlci0+Y2xpZW50KSwgTlVMTCk7CisJaWYgKHNlcnZlci0+cnNpemUgPiBtYXhfcnBjX3BheWxvYWQpCisJCXNlcnZlci0+cnNpemUgPSBtYXhfcnBjX3BheWxvYWQ7CisJaWYgKHNlcnZlci0+d3NpemUgPiBtYXhfcnBjX3BheWxvYWQpCisJCXNlcnZlci0+d3NpemUgPSBtYXhfcnBjX3BheWxvYWQ7CisKKwlzZXJ2ZXItPnJwYWdlcyA9IChzZXJ2ZXItPnJzaXplICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlpZiAoc2VydmVyLT5ycGFnZXMgPiBORlNfUkVBRF9NQVhJT1YpIHsKKwkJc2VydmVyLT5ycGFnZXMgPSBORlNfUkVBRF9NQVhJT1Y7CisJCXNlcnZlci0+cnNpemUgPSBzZXJ2ZXItPnJwYWdlcyA8PCBQQUdFX0NBQ0hFX1NISUZUOworCX0KKworCXNlcnZlci0+d3BhZ2VzID0gKHNlcnZlci0+d3NpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworICAgICAgICBpZiAoc2VydmVyLT53cGFnZXMgPiBORlNfV1JJVEVfTUFYSU9WKSB7CisJCXNlcnZlci0+d3BhZ2VzID0gTkZTX1dSSVRFX01BWElPVjsKKyAgICAgICAgICAgICAgICBzZXJ2ZXItPndzaXplID0gc2VydmVyLT53cGFnZXMgPDwgUEFHRV9DQUNIRV9TSElGVDsKKwl9CisKKwlpZiAoc2ItPnNfYmxvY2tzaXplID09IDApCisJCXNiLT5zX2Jsb2Nrc2l6ZSA9IG5mc19ibG9ja19iaXRzKHNlcnZlci0+d3NpemUsCisJCQkJCQkJICZzYi0+c19ibG9ja3NpemVfYml0cyk7CisJc2VydmVyLT53dG11bHQgPSBuZnNfYmxvY2tfYml0cyhmc2luZm8ud3RtdWx0LCBOVUxMKTsKKworCXNlcnZlci0+ZHRzaXplID0gbmZzX2Jsb2NrX3NpemUoZnNpbmZvLmR0cHJlZiwgTlVMTCk7CisJaWYgKHNlcnZlci0+ZHRzaXplID4gUEFHRV9DQUNIRV9TSVpFKQorCQlzZXJ2ZXItPmR0c2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwlpZiAoc2VydmVyLT5kdHNpemUgPiBzZXJ2ZXItPnJzaXplKQorCQlzZXJ2ZXItPmR0c2l6ZSA9IHNlcnZlci0+cnNpemU7CisKKwlpZiAoc2VydmVyLT5mbGFncyAmIE5GU19NT1VOVF9OT0FDKSB7CisJCXNlcnZlci0+YWNyZWdtaW4gPSBzZXJ2ZXItPmFjcmVnbWF4ID0gMDsKKwkJc2VydmVyLT5hY2Rpcm1pbiA9IHNlcnZlci0+YWNkaXJtYXggPSAwOworCQlzYi0+c19mbGFncyB8PSBNU19TWU5DSFJPTk9VUzsKKwl9CisJc2VydmVyLT5iYWNraW5nX2Rldl9pbmZvLnJhX3BhZ2VzID0gc2VydmVyLT5ycGFnZXMgKiBORlNfTUFYX1JFQURBSEVBRDsKKworCXNiLT5zX21heGJ5dGVzID0gZnNpbmZvLm1heGZpbGVzaXplOworCWlmIChzYi0+c19tYXhieXRlcyA+IE1BWF9MRlNfRklMRVNJWkUpIAorCQlzYi0+c19tYXhieXRlcyA9IE1BWF9MRlNfRklMRVNJWkU7IAorCisJc2VydmVyLT5jbGllbnQtPmNsX2ludHIgPSAoc2VydmVyLT5mbGFncyAmIE5GU19NT1VOVF9JTlRSKSA/IDEgOiAwOworCXNlcnZlci0+Y2xpZW50LT5jbF9zb2Z0cnRyeSA9IChzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX1NPRlQpID8gMSA6IDA7CisKKwkvKiBXZSdyZSBhaXJib3JuZSBTZXQgc29ja2V0IGJ1ZmZlcnNpemUgKi8KKwlycGNfc2V0YnVmc2l6ZShzZXJ2ZXItPmNsaWVudCwgc2VydmVyLT53c2l6ZSArIDEwMCwgc2VydmVyLT5yc2l6ZSArIDEwMCk7CisJcmV0dXJuIDA7CisJLyogWWFyZ3MuIEl0IGRpZG4ndCB3b3JrIG91dC4gKi8KK291dF9ub19yb290OgorCWRwcmludGsoIm5mc19zYl9pbml0OiBnZXQgcm9vdCBpbm9kZSBmYWlsZWQ6IGVycm5vICVkXG4iLCAtbm9fcm9vdF9lcnJvcik7CisJaWYgKCFJU19FUlIocm9vdF9pbm9kZSkpCisJCWlwdXQocm9vdF9pbm9kZSk7CisJcmV0dXJuIG5vX3Jvb3RfZXJyb3I7Cit9CisKKy8qCisgKiBDcmVhdGUgYW4gUlBDIGNsaWVudCBoYW5kbGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnBjX2NsbnQgKgorbmZzX2NyZWF0ZV9jbGllbnQoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgY29uc3Qgc3RydWN0IG5mc19tb3VudF9kYXRhICpkYXRhKQoreworCXN0cnVjdCBycGNfdGltZW91dAl0aW1lcGFybXM7CisJc3RydWN0IHJwY194cHJ0CQkqeHBydCA9IE5VTEw7CisJc3RydWN0IHJwY19jbG50CQkqY2xudCA9IE5VTEw7CisJaW50CQkJdGNwICAgPSAoZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfVENQKTsKKworCS8qIEluaXRpYWxpemUgdGltZW91dCB2YWx1ZXMgKi8KKwl0aW1lcGFybXMudG9faW5pdHZhbCA9IGRhdGEtPnRpbWVvICogSFogLyAxMDsKKwl0aW1lcGFybXMudG9fcmV0cmllcyA9IGRhdGEtPnJldHJhbnM7CisJdGltZXBhcm1zLnRvX21heHZhbCAgPSB0Y3AgPyBSUENfTUFYX1RDUF9USU1FT1VUIDogUlBDX01BWF9VRFBfVElNRU9VVDsKKwl0aW1lcGFybXMudG9fZXhwb25lbnRpYWwgPSAxOworCisJaWYgKCF0aW1lcGFybXMudG9faW5pdHZhbCkKKwkJdGltZXBhcm1zLnRvX2luaXR2YWwgPSAodGNwID8gNjAwIDogMTEpICogSFogLyAxMDsKKwlpZiAoIXRpbWVwYXJtcy50b19yZXRyaWVzKQorCQl0aW1lcGFybXMudG9fcmV0cmllcyA9IDU7CisKKwkvKiBjcmVhdGUgdHJhbnNwb3J0IGFuZCBjbGllbnQgKi8KKwl4cHJ0ID0geHBydF9jcmVhdGVfcHJvdG8odGNwID8gSVBQUk9UT19UQ1AgOiBJUFBST1RPX1VEUCwKKwkJCQkgJnNlcnZlci0+YWRkciwgJnRpbWVwYXJtcyk7CisJaWYgKElTX0VSUih4cHJ0KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IGNhbm5vdCBjcmVhdGUgUlBDIHRyYW5zcG9ydC5cbiIpOworCQlyZXR1cm4gKHN0cnVjdCBycGNfY2xudCAqKXhwcnQ7CisJfQorCWNsbnQgPSBycGNfY3JlYXRlX2NsaWVudCh4cHJ0LCBzZXJ2ZXItPmhvc3RuYW1lLCAmbmZzX3Byb2dyYW0sCisJCQkJIHNlcnZlci0+cnBjX29wcy0+dmVyc2lvbiwgZGF0YS0+cHNldWRvZmxhdm9yKTsKKwlpZiAoSVNfRVJSKGNsbnQpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUzogY2Fubm90IGNyZWF0ZSBSUEMgY2xpZW50LlxuIik7CisJCWdvdG8gb3V0X2ZhaWw7CisJfQorCisJY2xudC0+Y2xfaW50ciAgICAgPSAxOworCWNsbnQtPmNsX3NvZnRydHJ5ID0gMTsKKwljbG50LT5jbF9jaGF0dHkgICA9IDE7CisKKwlyZXR1cm4gY2xudDsKKworb3V0X2ZhaWw6CisJeHBydF9kZXN0cm95KHhwcnQpOworCXJldHVybiBjbG50OworfQorCisvKgorICogVGhlIHdheSB0aGlzIHdvcmtzIGlzIHRoYXQgdGhlIG1vdW50IHByb2Nlc3MgcGFzc2VzIGEgc3RydWN0dXJlCisgKiBpbiB0aGUgZGF0YSBhcmd1bWVudCB3aGljaCBjb250YWlucyB0aGUgc2VydmVyJ3MgSVAgYWRkcmVzcworICogYW5kIHRoZSByb290IGZpbGUgaGFuZGxlIG9idGFpbmVkIGZyb20gdGhlIHNlcnZlcidzIG1vdW50CisgKiBkYWVtb24uIFdlIHN0YXNoIHRoZXNlIGF3YXkgaW4gdGhlIHByaXZhdGUgc3VwZXJibG9jayBmaWVsZHMuCisgKi8KK3N0YXRpYyBpbnQKK25mc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBuZnNfbW91bnRfZGF0YSAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlcgkqc2VydmVyOworCXJwY19hdXRoZmxhdm9yX3QJYXV0aGZsYXZvcjsKKworCXNlcnZlciAgICAgICAgICAgPSBORlNfU0Ioc2IpOworCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gMDsKKwlzYi0+c19ibG9ja3NpemUgPSAwOworCWlmIChkYXRhLT5ic2l6ZSkKKwkJc2ItPnNfYmxvY2tzaXplID0gbmZzX2Jsb2NrX3NpemUoZGF0YS0+YnNpemUsICZzYi0+c19ibG9ja3NpemVfYml0cyk7CisJaWYgKGRhdGEtPnJzaXplKQorCQlzZXJ2ZXItPnJzaXplID0gbmZzX2Jsb2NrX3NpemUoZGF0YS0+cnNpemUsIE5VTEwpOworCWlmIChkYXRhLT53c2l6ZSkKKwkJc2VydmVyLT53c2l6ZSA9IG5mc19ibG9ja19zaXplKGRhdGEtPndzaXplLCBOVUxMKTsKKwlzZXJ2ZXItPmZsYWdzICAgID0gZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfRkxBR01BU0s7CisKKwlzZXJ2ZXItPmFjcmVnbWluID0gZGF0YS0+YWNyZWdtaW4qSFo7CisJc2VydmVyLT5hY3JlZ21heCA9IGRhdGEtPmFjcmVnbWF4KkhaOworCXNlcnZlci0+YWNkaXJtaW4gPSBkYXRhLT5hY2Rpcm1pbipIWjsKKwlzZXJ2ZXItPmFjZGlybWF4ID0gZGF0YS0+YWNkaXJtYXgqSFo7CisKKwkvKiBTdGFydCBsb2NrZCBoZXJlLCBiZWZvcmUgd2UgbWlnaHQgZXJyb3Igb3V0ICovCisJaWYgKCEoc2VydmVyLT5mbGFncyAmIE5GU19NT1VOVF9OT05MTSkpCisJCWxvY2tkX3VwKCk7CisKKwlzZXJ2ZXItPm5hbWVsZW4gID0gZGF0YS0+bmFtbGVuOworCXNlcnZlci0+aG9zdG5hbWUgPSBrbWFsbG9jKHN0cmxlbihkYXRhLT5ob3N0bmFtZSkgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlcnZlci0+aG9zdG5hbWUpCisJCXJldHVybiAtRU5PTUVNOworCXN0cmNweShzZXJ2ZXItPmhvc3RuYW1lLCBkYXRhLT5ob3N0bmFtZSk7CisKKwkvKiBDaGVjayBORlMgcHJvdG9jb2wgcmV2aXNpb24gYW5kIGluaXRpYWxpemUgUlBDIG9wIHZlY3RvcgorCSAqIGFuZCBmaWxlIGhhbmRsZSBwb29sLiAqLworCWlmIChzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX1ZFUjMpIHsKKyNpZmRlZiBDT05GSUdfTkZTX1YzCisJCXNlcnZlci0+cnBjX29wcyA9ICZuZnNfdjNfY2xpZW50b3BzOworCQlzZXJ2ZXItPmNhcHMgfD0gTkZTX0NBUF9SRUFERElSUExVUzsKKwkJaWYgKGRhdGEtPnZlcnNpb24gPCA0KSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5GUzogTkZTdjMgbm90IHN1cHBvcnRlZCBieSBtb3VudCBwcm9ncmFtLlxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorI2Vsc2UKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJORlM6IE5GU3YzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisjZW5kaWYKKwl9IGVsc2UgeworCQlzZXJ2ZXItPnJwY19vcHMgPSAmbmZzX3YyX2NsaWVudG9wczsKKwl9CisKKwkvKiBGaWxsIGluIHBzZXVkb2ZsYXZvciBmb3IgbW91bnQgdmVyc2lvbiA8IDUgKi8KKwlpZiAoIShkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9TRUNGTEFWT1VSKSkKKwkJZGF0YS0+cHNldWRvZmxhdm9yID0gUlBDX0FVVEhfVU5JWDsKKwlhdXRoZmxhdm9yID0gZGF0YS0+cHNldWRvZmxhdm9yOwkvKiBzYXZlIGZvciBzYl9pbml0KCkgKi8KKwkvKiBYWFggbWF5YmUgd2Ugd2FudCB0byBhZGQgYSBzZXJ2ZXItPnBzZXVkb2ZsYXZvciBmaWVsZCAqLworCisJLyogQ3JlYXRlIFJQQyBjbGllbnQgaGFuZGxlcyAqLworCXNlcnZlci0+Y2xpZW50ID0gbmZzX2NyZWF0ZV9jbGllbnQoc2VydmVyLCBkYXRhKTsKKwlpZiAoSVNfRVJSKHNlcnZlci0+Y2xpZW50KSkKKwkJcmV0dXJuIFBUUl9FUlIoc2VydmVyLT5jbGllbnQpOworCS8qIFJGQyAyNjIzLCBzZWMgMi4zLjIgKi8KKwlpZiAoYXV0aGZsYXZvciAhPSBSUENfQVVUSF9VTklYKSB7CisJCXNlcnZlci0+Y2xpZW50X3N5cyA9IHJwY19jbG9uZV9jbGllbnQoc2VydmVyLT5jbGllbnQpOworCQlpZiAoSVNfRVJSKHNlcnZlci0+Y2xpZW50X3N5cykpCisJCQlyZXR1cm4gUFRSX0VSUihzZXJ2ZXItPmNsaWVudF9zeXMpOworCQlpZiAoIXJwY2F1dGhfY3JlYXRlKFJQQ19BVVRIX1VOSVgsIHNlcnZlci0+Y2xpZW50X3N5cykpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9IGVsc2UgeworCQlhdG9taWNfaW5jKCZzZXJ2ZXItPmNsaWVudC0+Y2xfY291bnQpOworCQlzZXJ2ZXItPmNsaWVudF9zeXMgPSBzZXJ2ZXItPmNsaWVudDsKKwl9CisKKwlpZiAoc2VydmVyLT5mbGFncyAmIE5GU19NT1VOVF9WRVIzKSB7CisJCWlmIChzZXJ2ZXItPm5hbWVsZW4gPT0gMCB8fCBzZXJ2ZXItPm5hbWVsZW4gPiBORlMzX01BWE5BTUxFTikKKwkJCXNlcnZlci0+bmFtZWxlbiA9IE5GUzNfTUFYTkFNTEVOOworCQlzYi0+c190aW1lX2dyYW4gPSAxOworCX0gZWxzZSB7CisJCWlmIChzZXJ2ZXItPm5hbWVsZW4gPT0gMCB8fCBzZXJ2ZXItPm5hbWVsZW4gPiBORlMyX01BWE5BTUxFTikKKwkJCXNlcnZlci0+bmFtZWxlbiA9IE5GUzJfTUFYTkFNTEVOOworCX0KKworCXNiLT5zX29wID0gJm5mc19zb3BzOworCXJldHVybiBuZnNfc2JfaW5pdChzYiwgYXV0aGZsYXZvcik7Cit9CisKK3N0YXRpYyBpbnQKK25mc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NCKHNiKTsKKwl1bnNpZ25lZCBjaGFyIGJsb2NrYml0czsKKwl1bnNpZ25lZCBsb25nIGJsb2NrcmVzOworCXN0cnVjdCBuZnNfZmggKnJvb3RmaCA9IE5GU19GSChzYi0+c19yb290LT5kX2lub2RlKTsKKwlzdHJ1Y3QgbmZzX2ZhdHRyIGZhdHRyOworCXN0cnVjdCBuZnNfZnNzdGF0IHJlcyA9IHsKKwkJCS5mYXR0ciA9ICZmYXR0ciwKKwl9OworCWludCBlcnJvcjsKKworCWxvY2tfa2VybmVsKCk7CisKKwllcnJvciA9IHNlcnZlci0+cnBjX29wcy0+c3RhdGZzKHNlcnZlciwgcm9vdGZoLCAmcmVzKTsKKwlidWYtPmZfdHlwZSA9IE5GU19TVVBFUl9NQUdJQzsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dF9lcnI7CisKKwkvKgorCSAqIEN1cnJlbnQgdmVyc2lvbnMgb2YgZ2xpYmMgZG8gbm90IGNvcnJlY3RseSBoYW5kbGUgdGhlCisJICogY2FzZSB3aGVyZSBmX2Zyc2l6ZSAhPSBmX2JzaXplLiAgRXZlbnR1YWxseSB3ZSB3YW50IHRvCisJICogcmVwb3J0IHRoZSB2YWx1ZSBvZiB3dG11bHQgaW4gdGhpcyBmaWVsZC4KKwkgKi8KKwlidWYtPmZfZnJzaXplID0gc2ItPnNfYmxvY2tzaXplOworCisJLyoKKwkgKiBPbiBtb3N0ICpuaXggc3lzdGVtcywgZl9ibG9ja3MsIGZfYmZyZWUsIGFuZCBmX2JhdmFpbAorCSAqIGFyZSByZXBvcnRlZCBpbiB1bml0cyBvZiBmX2Zyc2l6ZS4gIExpbnV4IGhhc24ndCBoYWQKKwkgKiBhbiBmX2Zyc2l6ZSBmaWVsZCBpbiBpdHMgc3RhdGZzIHN0cnVjdCB1bnRpbCByZWNlbnRseSwKKwkgKiB0aHVzIGhpc3RvcmljYWxseSBMaW51eCdzIHN5c19zdGF0ZnMgcmVwb3J0cyB0aGVzZQorCSAqIGZpZWxkcyBpbiB1bml0cyBvZiBmX2JzaXplLgorCSAqLworCWJ1Zi0+Zl9ic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwlibG9ja2JpdHMgPSBzYi0+c19ibG9ja3NpemVfYml0czsKKwlibG9ja3JlcyA9ICgxIDw8IGJsb2NrYml0cykgLSAxOworCWJ1Zi0+Zl9ibG9ja3MgPSAocmVzLnRieXRlcyArIGJsb2NrcmVzKSA+PiBibG9ja2JpdHM7CisJYnVmLT5mX2JmcmVlID0gKHJlcy5mYnl0ZXMgKyBibG9ja3JlcykgPj4gYmxvY2tiaXRzOworCWJ1Zi0+Zl9iYXZhaWwgPSAocmVzLmFieXRlcyArIGJsb2NrcmVzKSA+PiBibG9ja2JpdHM7CisKKwlidWYtPmZfZmlsZXMgPSByZXMudGZpbGVzOworCWJ1Zi0+Zl9mZnJlZSA9IHJlcy5hZmlsZXM7CisKKwlidWYtPmZfbmFtZWxlbiA9IHNlcnZlci0+bmFtZWxlbjsKKyBvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIDA7CisKKyBvdXRfZXJyOgorCXByaW50ayhLRVJOX1dBUk5JTkcgIm5mc19zdGF0ZnM6IHN0YXRmcyBlcnJvciA9ICVkXG4iLCAtZXJyb3IpOworCWJ1Zi0+Zl9ic2l6ZSA9IGJ1Zi0+Zl9ibG9ja3MgPSBidWYtPmZfYmZyZWUgPSBidWYtPmZfYmF2YWlsID0gLTE7CisJZ290byBvdXQ7CisKK30KKworc3RhdGljIGludCBuZnNfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJc3RhdGljIHN0cnVjdCBwcm9jX25mc19pbmZvIHsKKwkJaW50IGZsYWc7CisJCWNoYXIgKnN0cjsKKwkJY2hhciAqbm9zdHI7CisJfSBuZnNfaW5mb1tdID0geworCQl7IE5GU19NT1VOVF9TT0ZULCAiLHNvZnQiLCAiLGhhcmQiIH0sCisJCXsgTkZTX01PVU5UX0lOVFIsICIsaW50ciIsICIiIH0sCisJCXsgTkZTX01PVU5UX1BPU0lYLCAiLHBvc2l4IiwgIiIgfSwKKwkJeyBORlNfTU9VTlRfVENQLCAiLHRjcCIsICIsdWRwIiB9LAorCQl7IE5GU19NT1VOVF9OT0NUTywgIixub2N0byIsICIiIH0sCisJCXsgTkZTX01PVU5UX05PQUMsICIsbm9hYyIsICIiIH0sCisJCXsgTkZTX01PVU5UX05PTkxNLCAiLG5vbG9jayIsICIsbG9jayIgfSwKKwkJeyAwLCBOVUxMLCBOVUxMIH0KKwl9OworCXN0cnVjdCBwcm9jX25mc19pbmZvICpuZnNfaW5mb3A7CisJc3RydWN0IG5mc19zZXJ2ZXIgKm5mc3MgPSBORlNfU0IobW50LT5tbnRfc2IpOworCisJc2VxX3ByaW50ZihtLCAiLHYlZCIsIG5mc3MtPnJwY19vcHMtPnZlcnNpb24pOworCXNlcV9wcmludGYobSwgIixyc2l6ZT0lZCIsIG5mc3MtPnJzaXplKTsKKwlzZXFfcHJpbnRmKG0sICIsd3NpemU9JWQiLCBuZnNzLT53c2l6ZSk7CisJaWYgKG5mc3MtPmFjcmVnbWluICE9IDMqSFopCisJCXNlcV9wcmludGYobSwgIixhY3JlZ21pbj0lZCIsIG5mc3MtPmFjcmVnbWluL0haKTsKKwlpZiAobmZzcy0+YWNyZWdtYXggIT0gNjAqSFopCisJCXNlcV9wcmludGYobSwgIixhY3JlZ21heD0lZCIsIG5mc3MtPmFjcmVnbWF4L0haKTsKKwlpZiAobmZzcy0+YWNkaXJtaW4gIT0gMzAqSFopCisJCXNlcV9wcmludGYobSwgIixhY2Rpcm1pbj0lZCIsIG5mc3MtPmFjZGlybWluL0haKTsKKwlpZiAobmZzcy0+YWNkaXJtYXggIT0gNjAqSFopCisJCXNlcV9wcmludGYobSwgIixhY2Rpcm1heD0lZCIsIG5mc3MtPmFjZGlybWF4L0haKTsKKwlmb3IgKG5mc19pbmZvcCA9IG5mc19pbmZvOyBuZnNfaW5mb3AtPmZsYWc7IG5mc19pbmZvcCsrKSB7CisJCWlmIChuZnNzLT5mbGFncyAmIG5mc19pbmZvcC0+ZmxhZykKKwkJCXNlcV9wdXRzKG0sIG5mc19pbmZvcC0+c3RyKTsKKwkJZWxzZQorCQkJc2VxX3B1dHMobSwgbmZzX2luZm9wLT5ub3N0cik7CisJfQorCXNlcV9wdXRzKG0sICIsYWRkcj0iKTsKKwlzZXFfZXNjYXBlKG0sIG5mc3MtPmhvc3RuYW1lLCAiIFx0XG5cXCIpOworCXJldHVybiAwOworfQorCisvKgorICogSW52YWxpZGF0ZSB0aGUgbG9jYWwgY2FjaGVzCisgKi8KK3ZvaWQKK25mc196YXBfY2FjaGVzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKwlpbnQgbW9kZSA9IGlub2RlLT5pX21vZGU7CisKKwlORlNfQVRUUlRJTUVPKGlub2RlKSA9IE5GU19NSU5BVFRSVElNRU8oaW5vZGUpOworCU5GU19BVFRSVElNRU9fVVBEQVRFKGlub2RlKSA9IGppZmZpZXM7CisKKwltZW1zZXQoTkZTX0NPT0tJRVZFUkYoaW5vZGUpLCAwLCBzaXplb2YoTkZTX0NPT0tJRVZFUkYoaW5vZGUpKSk7CisJaWYgKFNfSVNSRUcobW9kZSkgfHwgU19JU0RJUihtb2RlKSB8fCBTX0lTTE5LKG1vZGUpKQorCQluZnNpLT5mbGFncyB8PSBORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX0lOVkFMSURfREFUQXxORlNfSU5PX0lOVkFMSURfQUNDRVNTOworCWVsc2UKKwkJbmZzaS0+ZmxhZ3MgfD0gTkZTX0lOT19JTlZBTElEX0FUVFJ8TkZTX0lOT19JTlZBTElEX0FDQ0VTUzsKK30KKworLyoKKyAqIEludmFsaWRhdGUsIGJ1dCBkbyBub3QgdW5oYXNoLCB0aGUgaW5vZGUKKyAqLworc3RhdGljIHZvaWQKK25mc19pbnZhbGlkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJdW1vZGVfdCBzYXZlX21vZGUgPSBpbm9kZS0+aV9tb2RlOworCisJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCWlub2RlLT5pX21vZGUgPSBzYXZlX21vZGU7CisJbmZzX3phcF9jYWNoZXMoaW5vZGUpOworfQorCitzdHJ1Y3QgbmZzX2ZpbmRfZGVzYyB7CisJc3RydWN0IG5mc19maAkJKmZoOworCXN0cnVjdCBuZnNfZmF0dHIJKmZhdHRyOworfTsKKworLyoKKyAqIEluIE5GU3YzIHdlIGNhbiBoYXZlIDY0Yml0IGlub2RlIG51bWJlcnMuIEluIG9yZGVyIHRvIHN1cHBvcnQKKyAqIHRoaXMsIGFuZCByZS1leHBvcnRlZCBkaXJlY3RvcmllcyAoYWxzbyBzZWVuIGluIE5GU3YyKQorICogd2UgYXJlIGZvcmNlZCB0byBhbGxvdyAyIGRpZmZlcmVudCBpbm9kZXMgdG8gaGF2ZSB0aGUgc2FtZQorICogaV9pbm8uCisgKi8KK3N0YXRpYyBpbnQKK25mc19maW5kX2FjdG9yKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKm9wYXF1ZSkKK3sKKwlzdHJ1Y3QgbmZzX2ZpbmRfZGVzYwkqZGVzYyA9IChzdHJ1Y3QgbmZzX2ZpbmRfZGVzYyAqKW9wYXF1ZTsKKwlzdHJ1Y3QgbmZzX2ZoCQkqZmggPSBkZXNjLT5maDsKKwlzdHJ1Y3QgbmZzX2ZhdHRyCSpmYXR0ciA9IGRlc2MtPmZhdHRyOworCisJaWYgKE5GU19GSUxFSUQoaW5vZGUpICE9IGZhdHRyLT5maWxlaWQpCisJCXJldHVybiAwOworCWlmIChuZnNfY29tcGFyZV9maChORlNfRkgoaW5vZGUpLCBmaCkpCisJCXJldHVybiAwOworCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpIHx8IE5GU19TVEFMRShpbm9kZSkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CituZnNfaW5pdF9sb2NrZWQoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlKQoreworCXN0cnVjdCBuZnNfZmluZF9kZXNjCSpkZXNjID0gKHN0cnVjdCBuZnNfZmluZF9kZXNjICopb3BhcXVlOworCXN0cnVjdCBuZnNfZmF0dHIJKmZhdHRyID0gZGVzYy0+ZmF0dHI7CisKKwlORlNfRklMRUlEKGlub2RlKSA9IGZhdHRyLT5maWxlaWQ7CisJbmZzX2NvcHlfZmgoTkZTX0ZIKGlub2RlKSwgZGVzYy0+ZmgpOworCXJldHVybiAwOworfQorCisvKiBEb24ndCB1c2UgUkVBRERJUlBMVVMgb24gZGlyZWN0b3JpZXMgdGhhdCB3ZSBiZWxpZXZlIGFyZSB0b28gbGFyZ2UgKi8KKyNkZWZpbmUgTkZTX0xJTUlUX1JFQURESVJQTFVTICg4KlBBR0VfU0laRSkKKworLyoKKyAqIFRoaXMgaXMgb3VyIGZyb250LWVuZCB0byBpZ2V0IHRoYXQgbG9va3MgdXAgaW5vZGVzIGJ5IGZpbGUgaGFuZGxlCisgKiBpbnN0ZWFkIG9mIGlub2RlIG51bWJlci4KKyAqLworc3RydWN0IGlub2RlICoKK25mc19maGdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgbmZzX2ZoICpmaCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJc3RydWN0IG5mc19maW5kX2Rlc2MgZGVzYyA9IHsKKwkJLmZoCT0gZmgsCisJCS5mYXR0cgk9IGZhdHRyCisJfTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGhhc2g7CisKKwlpZiAoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSKSA9PSAwKQorCQlnb3RvIG91dF9ub19pbm9kZTsKKworCWlmICghZmF0dHItPm5saW5rKSB7CisJCXByaW50aygiTkZTOiBCdWdneSBzZXJ2ZXIgLSBubGluayA9PSAwIVxuIik7CisJCWdvdG8gb3V0X25vX2lub2RlOworCX0KKworCWhhc2ggPSBuZnNfZmF0dHJfdG9faW5vX3QoZmF0dHIpOworCisJaWYgKCEoaW5vZGUgPSBpZ2V0NV9sb2NrZWQoc2IsIGhhc2gsIG5mc19maW5kX2FjdG9yLCBuZnNfaW5pdF9sb2NrZWQsICZkZXNjKSkpCisJCWdvdG8gb3V0X25vX2lub2RlOworCisJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKworCQkvKiBXZSBzZXQgaV9pbm8gZm9yIHRoZSBmZXcgdGhpbmdzIHRoYXQgc3RpbGwgcmVseSBvbiBpdCwKKwkJICogc3VjaCBhcyBzdGF0KDIpICovCisJCWlub2RlLT5pX2lubyA9IGhhc2g7CisKKwkJLyogV2UgY2FuJ3Qgc3VwcG9ydCB1cGRhdGVfYXRpbWUoKSwgc2luY2UgdGhlIHNlcnZlciB3aWxsIHJlc2V0IGl0ICovCisJCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9BVElNRXxTX05PQ01USU1FOworCQlpbm9kZS0+aV9tb2RlID0gZmF0dHItPm1vZGU7CisJCS8qIFdoeSBzbz8gQmVjYXVzZSB3ZSB3YW50IHJldmFsaWRhdGUgZm9yIGRldmljZXMvRklGT3MsIGFuZAorCQkgKiB0aGF0J3MgcHJlY2lzZWx5IHdoYXQgd2UgaGF2ZSBpbiBuZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zLgorCQkgKi8KKwkJaW5vZGUtPmlfb3AgPSAmbmZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWlub2RlLT5pX2ZvcCA9ICZuZnNfZmlsZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZuZnNfZmlsZV9hb3BzOworCQkJaW5vZGUtPmlfZGF0YS5iYWNraW5nX2Rldl9pbmZvID0gJk5GU19TQihzYiktPmJhY2tpbmdfZGV2X2luZm87CisJCX0gZWxzZSBpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQkJaW5vZGUtPmlfb3AgPSBORlNfU0Ioc2IpLT5ycGNfb3BzLT5kaXJfaW5vZGVfb3BzOworCQkJaW5vZGUtPmlfZm9wID0gJm5mc19kaXJfb3BlcmF0aW9uczsKKwkJCWlmIChuZnNfc2VydmVyX2NhcGFibGUoaW5vZGUsIE5GU19DQVBfUkVBRERJUlBMVVMpCisJCQkgICAgJiYgZmF0dHItPnNpemUgPD0gTkZTX0xJTUlUX1JFQURESVJQTFVTKQorCQkJCU5GU19GTEFHUyhpbm9kZSkgfD0gTkZTX0lOT19BRFZJU0VfUkRQTFVTOworCQl9IGVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCQlpbm9kZS0+aV9vcCA9ICZuZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQllbHNlCisJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsIGZhdHRyLT5yZGV2KTsKKworCQluZnNpLT5yZWFkX2NhY2hlX2ppZmZpZXMgPSBmYXR0ci0+dGltZXN0YW1wOworCQlpbm9kZS0+aV9hdGltZSA9IGZhdHRyLT5hdGltZTsKKwkJaW5vZGUtPmlfbXRpbWUgPSBmYXR0ci0+bXRpbWU7CisJCWlub2RlLT5pX2N0aW1lID0gZmF0dHItPmN0aW1lOworCQlpZiAoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfVjQpCisJCQluZnNpLT5jaGFuZ2VfYXR0ciA9IGZhdHRyLT5jaGFuZ2VfYXR0cjsKKwkJaW5vZGUtPmlfc2l6ZSA9IG5mc19zaXplX3RvX2xvZmZfdChmYXR0ci0+c2l6ZSk7CisJCWlub2RlLT5pX25saW5rID0gZmF0dHItPm5saW5rOworCQlpbm9kZS0+aV91aWQgPSBmYXR0ci0+dWlkOworCQlpbm9kZS0+aV9naWQgPSBmYXR0ci0+Z2lkOworCQlpZiAoZmF0dHItPnZhbGlkICYgKE5GU19BVFRSX0ZBVFRSX1YzIHwgTkZTX0FUVFJfRkFUVFJfVjQpKSB7CisJCQkvKgorCQkJICogcmVwb3J0IHRoZSBibG9ja3MgaW4gNTEyYnl0ZSB1bml0cworCQkJICovCisJCQlpbm9kZS0+aV9ibG9ja3MgPSBuZnNfY2FsY19ibG9ja19zaXplKGZhdHRyLT5kdS5uZnMzLnVzZWQpOworCQkJaW5vZGUtPmlfYmxrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJfSBlbHNlIHsKKwkJCWlub2RlLT5pX2Jsb2NrcyA9IGZhdHRyLT5kdS5uZnMyLmJsb2NrczsKKwkJCWlub2RlLT5pX2Jsa3NpemUgPSBmYXR0ci0+ZHUubmZzMi5ibG9ja3NpemU7CisJCX0KKwkJbmZzaS0+YXR0cnRpbWVvID0gTkZTX01JTkFUVFJUSU1FTyhpbm9kZSk7CisJCW5mc2ktPmF0dHJ0aW1lb190aW1lc3RhbXAgPSBqaWZmaWVzOworCQltZW1zZXQobmZzaS0+Y29va2lldmVyZiwgMCwgc2l6ZW9mKG5mc2ktPmNvb2tpZXZlcmYpKTsKKwkJbmZzaS0+Y2FjaGVfYWNjZXNzLmNyZWQgPSBOVUxMOworCisJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCX0gZWxzZQorCQluZnNfcmVmcmVzaF9pbm9kZShpbm9kZSwgZmF0dHIpOworCWRwcmludGsoIk5GUzogbmZzX2ZoZ2V0KCVzLyVMZCBjdD0lZClcbiIsCisJCWlub2RlLT5pX3NiLT5zX2lkLAorCQkobG9uZyBsb25nKU5GU19GSUxFSUQoaW5vZGUpLAorCQlhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpKTsKKworb3V0OgorCXJldHVybiBpbm9kZTsKKworb3V0X25vX2lub2RlOgorCXByaW50aygibmZzX2ZoZ2V0OiBpZ2V0IGZhaWxlZFxuIik7CisJZ290byBvdXQ7Cit9CisKKyNkZWZpbmUgTkZTX1ZBTElEX0FUVFJTIChBVFRSX01PREV8QVRUUl9VSUR8QVRUUl9HSUR8QVRUUl9TSVpFfEFUVFJfQVRJTUV8QVRUUl9BVElNRV9TRVR8QVRUUl9NVElNRXxBVFRSX01USU1FX1NFVCkKKworaW50CituZnNfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBuZnNfZmF0dHIgZmF0dHI7CisJaW50IGVycm9yOworCisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CisJCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBhdHRyLT5pYV9zaXplID09IGlfc2l6ZV9yZWFkKGlub2RlKSkKKwkJCWF0dHItPmlhX3ZhbGlkICY9IH5BVFRSX1NJWkU7CisJfQorCisJLyogT3B0aW1pemF0aW9uOiBpZiB0aGUgZW5kIHJlc3VsdCBpcyBubyBjaGFuZ2UsIGRvbid0IFJQQyAqLworCWF0dHItPmlhX3ZhbGlkICY9IE5GU19WQUxJRF9BVFRSUzsKKwlpZiAoYXR0ci0+aWFfdmFsaWQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlsb2NrX2tlcm5lbCgpOworCW5mc19iZWdpbl9kYXRhX3VwZGF0ZShpbm9kZSk7CisJLyogV3JpdGUgYWxsIGRpcnR5IGRhdGEgaWYgd2UncmUgY2hhbmdpbmcgZmlsZSBwZXJtaXNzaW9ucyBvciBzaXplICovCisJaWYgKChhdHRyLT5pYV92YWxpZCAmIChBVFRSX01PREV8QVRUUl9VSUR8QVRUUl9HSUR8QVRUUl9TSVpFKSkgIT0gMCkgeworCQlpZiAoZmlsZW1hcF9mZGF0YXdyaXRlKGlub2RlLT5pX21hcHBpbmcpID09IDApCisJCQlmaWxlbWFwX2ZkYXRhd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKKwkJbmZzX3diX2FsbChpbm9kZSk7CisJfQorCWVycm9yID0gTkZTX1BST1RPKGlub2RlKS0+c2V0YXR0cihkZW50cnksICZmYXR0ciwgYXR0cik7CisJaWYgKGVycm9yID09IDApIHsKKwkJbmZzX3JlZnJlc2hfaW5vZGUoaW5vZGUsICZmYXR0cik7CisJCWlmICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpICE9IDApIHsKKwkJCWludCBtb2RlOworCQkJbW9kZSA9IGlub2RlLT5pX21vZGUgJiB+U19JQUxMVUdPOworCQkJbW9kZSB8PSBhdHRyLT5pYV9tb2RlICYgU19JQUxMVUdPOworCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCX0KKwkJaWYgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKSAhPSAwKQorCQkJaW5vZGUtPmlfdWlkID0gYXR0ci0+aWFfdWlkOworCQlpZiAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpICE9IDApCisJCQlpbm9kZS0+aV9naWQgPSBhdHRyLT5pYV9naWQ7CisJCWlmICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpICE9IDApIHsKKwkJCWlub2RlLT5pX3NpemUgPSBhdHRyLT5pYV9zaXplOworCQkJdm10cnVuY2F0ZShpbm9kZSwgYXR0ci0+aWFfc2l6ZSk7CisJCX0KKwl9CisJaWYgKChhdHRyLT5pYV92YWxpZCAmIChBVFRSX01PREV8QVRUUl9VSUR8QVRUUl9HSUQpKSAhPSAwKQorCQlORlNfRkxBR1MoaW5vZGUpIHw9IE5GU19JTk9fSU5WQUxJRF9BQ0NFU1M7CisJbmZzX2VuZF9kYXRhX3VwZGF0ZShpbm9kZSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFdhaXQgZm9yIHRoZSBpbm9kZSB0byBnZXQgdW5sb2NrZWQuCisgKiAoVXNlZCBmb3IgTkZTX0lOT19MT0NLRUQgYW5kIE5GU19JTk9fUkVWQUxJREFUSU5HKS4KKyAqLworc3RhdGljIGludAorbmZzX3dhaXRfb25faW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZsYWcpCit7CisJc3RydWN0IHJwY19jbG50CSpjbG50ID0gTkZTX0NMSUVOVChpbm9kZSk7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKworCWludCBlcnJvcjsKKwlpZiAoIShORlNfRkxBR1MoaW5vZGUpICYgZmxhZykpCisJCXJldHVybiAwOworCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKKwllcnJvciA9IG5mc193YWl0X2V2ZW50KGNsbnQsIG5mc2ktPm5mc19pX3dhaXQsCisJCQkJIShORlNfRkxBR1MoaW5vZGUpICYgZmxhZykpOworCWlwdXQoaW5vZGUpOworCXJldHVybiBlcnJvcjsKK30KKworaW50IG5mc19nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdCAqc3RhdCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisJaW50IG5lZWRfYXRpbWUgPSBuZnNpLT5mbGFncyAmIE5GU19JTk9fSU5WQUxJRF9BVElNRTsKKwlpbnQgZXJyOworCisJaWYgKF9fSVNfRkxHKGlub2RlLCBNU19OT0FUSU1FKSkKKwkJbmVlZF9hdGltZSA9IDA7CisJZWxzZSBpZiAoX19JU19GTEcoaW5vZGUsIE1TX05PRElSQVRJTUUpICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCW5lZWRfYXRpbWUgPSAwOworCS8qIFdlIG1heSBmb3JjZSBhIGdldGF0dHIgaWYgdGhlIHVzZXIgY2FyZXMgYWJvdXQgYXRpbWUgKi8KKwlpZiAobmVlZF9hdGltZSkKKwkJZXJyID0gX19uZnNfcmV2YWxpZGF0ZV9pbm9kZShORlNfU0VSVkVSKGlub2RlKSwgaW5vZGUpOworCWVsc2UKKwkJZXJyID0gbmZzX3JldmFsaWRhdGVfaW5vZGUoTkZTX1NFUlZFUihpbm9kZSksIGlub2RlKTsKKwlpZiAoIWVycikKKwkJZ2VuZXJpY19maWxsYXR0cihpbm9kZSwgc3RhdCk7CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmFsbG9jX25mc19vcGVuX2NvbnRleHQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQpCit7CisJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eDsKKworCWN0eCA9IChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqKWttYWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY3R4ICE9IE5VTEwpIHsKKwkJYXRvbWljX3NldCgmY3R4LT5jb3VudCwgMSk7CisJCWN0eC0+ZGVudHJ5ID0gZGdldChkZW50cnkpOworCQljdHgtPmNyZWQgPSBnZXRfcnBjY3JlZChjcmVkKTsKKwkJY3R4LT5zdGF0ZSA9IE5VTEw7CisJCWN0eC0+bG9ja293bmVyID0gY3VycmVudC0+ZmlsZXM7CisJCWN0eC0+ZXJyb3IgPSAwOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjdHgtPndhaXRxKTsKKwl9CisJcmV0dXJuIGN0eDsKK30KKworc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmdldF9uZnNfb3Blbl9jb250ZXh0KHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgpCit7CisJaWYgKGN0eCAhPSBOVUxMKQorCQlhdG9taWNfaW5jKCZjdHgtPmNvdW50KTsKKwlyZXR1cm4gY3R4OworfQorCit2b2lkIHB1dF9uZnNfb3Blbl9jb250ZXh0KHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmN0eC0+Y291bnQpKSB7CisJCWlmICghbGlzdF9lbXB0eSgmY3R4LT5saXN0KSkgeworCQkJc3RydWN0IGlub2RlICppbm9kZSA9IGN0eC0+ZGVudHJ5LT5kX2lub2RlOworCQkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJCWxpc3RfZGVsKCZjdHgtPmxpc3QpOworCQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQl9CisJCWlmIChjdHgtPnN0YXRlICE9IE5VTEwpCisJCQluZnM0X2Nsb3NlX3N0YXRlKGN0eC0+c3RhdGUsIGN0eC0+bW9kZSk7CisJCWlmIChjdHgtPmNyZWQgIT0gTlVMTCkKKwkJCXB1dF9ycGNjcmVkKGN0eC0+Y3JlZCk7CisJCWRwdXQoY3R4LT5kZW50cnkpOworCQlrZnJlZShjdHgpOworCX0KK30KKworLyoKKyAqIEVuc3VyZSB0aGF0IG1tYXAgaGFzIGEgcmVjZW50IFJQQyBjcmVkZW50aWFsIGZvciB1c2Ugd2hlbiB3cml0aW5nIG91dAorICogc2hhcmVkIHBhZ2VzCisgKi8KK3ZvaWQgbmZzX2ZpbGVfc2V0X29wZW5fY29udGV4dChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKworCWZpbHAtPnByaXZhdGVfZGF0YSA9IGdldF9uZnNfb3Blbl9jb250ZXh0KGN0eCk7CisJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlsaXN0X2FkZCgmY3R4LT5saXN0LCAmbmZzaS0+b3Blbl9maWxlcyk7CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworfQorCitzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqbmZzX2ZpbmRfb3Blbl9jb250ZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtb2RlKQoreworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKnBvcywgKmN0eCA9IE5VTEw7CisKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmbmZzaS0+b3Blbl9maWxlcywgbGlzdCkgeworCQlpZiAoKHBvcy0+bW9kZSAmIG1vZGUpID09IG1vZGUpIHsKKwkJCWN0eCA9IGdldF9uZnNfb3Blbl9jb250ZXh0KHBvcyk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJcmV0dXJuIGN0eDsKK30KKwordm9pZCBuZnNfZmlsZV9jbGVhcl9vcGVuX2NvbnRleHQoc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHggPSAoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKilmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoY3R4KSB7CisJCWZpbHAtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJCWxpc3RfbW92ZV90YWlsKCZjdHgtPmxpc3QsICZORlNfSShpbm9kZSktPm9wZW5fZmlsZXMpOworCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCXB1dF9uZnNfb3Blbl9jb250ZXh0KGN0eCk7CisJfQorfQorCisvKgorICogVGhlc2UgYWxsb2NhdGUgYW5kIHJlbGVhc2UgZmlsZSByZWFkL3dyaXRlIGNvbnRleHQgaW5mb3JtYXRpb24uCisgKi8KK2ludCBuZnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4OworCXN0cnVjdCBycGNfY3JlZCAqY3JlZDsKKworCWNyZWQgPSBycGNhdXRoX2xvb2t1cGNyZWQoTkZTX0NMSUVOVChpbm9kZSktPmNsX2F1dGgsIDApOworCWlmIChJU19FUlIoY3JlZCkpCisJCXJldHVybiBQVFJfRVJSKGNyZWQpOworCWN0eCA9IGFsbG9jX25mc19vcGVuX2NvbnRleHQoZmlscC0+Zl9kZW50cnksIGNyZWQpOworCXB1dF9ycGNjcmVkKGNyZWQpOworCWlmIChjdHggPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJY3R4LT5tb2RlID0gZmlscC0+Zl9tb2RlOworCW5mc19maWxlX3NldF9vcGVuX2NvbnRleHQoZmlscCwgY3R4KTsKKwlwdXRfbmZzX29wZW5fY29udGV4dChjdHgpOworCWlmICgoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICE9IDApCisJCW5mc19iZWdpbl9kYXRhX3VwZGF0ZShpbm9kZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBuZnNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpZiAoKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAhPSAwKQorCQluZnNfZW5kX2RhdGFfdXBkYXRlKGlub2RlKTsKKwluZnNfZmlsZV9jbGVhcl9vcGVuX2NvbnRleHQoZmlscCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBzb21lIHBhcnQgb2YgTkZTIG5vdGljZXMgdGhhdAorICogdGhlIGNhY2hlZCBhdHRyaWJ1dGVzIGhhdmUgdG8gYmUgcmVmcmVzaGVkLgorICovCitpbnQKK19fbmZzX3JldmFsaWRhdGVfaW5vZGUoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbnQJCSBzdGF0dXMgPSAtRVNUQUxFOworCXN0cnVjdCBuZnNfZmF0dHIgZmF0dHI7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKwl1bnNpZ25lZCBsb25nIHZlcmlmaWVyOworCXVuc2lnbmVkIGludCBmbGFnczsKKworCWRmcHJpbnRrKFBBR0VDQUNIRSwgIk5GUzogcmV2YWxpZGF0aW5nICglcy8lTGQpXG4iLAorCQlpbm9kZS0+aV9zYi0+c19pZCwgKGxvbmcgbG9uZylORlNfRklMRUlEKGlub2RlKSk7CisKKwlsb2NrX2tlcm5lbCgpOworCWlmICghaW5vZGUgfHwgaXNfYmFkX2lub2RlKGlub2RlKSkKKyAJCWdvdG8gb3V0X25vd2FpdDsKKwlpZiAoTkZTX1NUQUxFKGlub2RlKSkKKyAJCWdvdG8gb3V0X25vd2FpdDsKKworCXdoaWxlIChORlNfUkVWQUxJREFUSU5HKGlub2RlKSkgeworCQlzdGF0dXMgPSBuZnNfd2FpdF9vbl9pbm9kZShpbm9kZSwgTkZTX0lOT19SRVZBTElEQVRJTkcpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gb3V0X25vd2FpdDsKKwkJaWYgKE5GU19BVFRSVElNRU8oaW5vZGUpID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKE5GU19GTEFHUyhpbm9kZSkgJiAoTkZTX0lOT19JTlZBTElEX0FUVFJ8TkZTX0lOT19JTlZBTElEX0RBVEF8TkZTX0lOT19JTlZBTElEX0FUSU1FKSkKKwkJCWNvbnRpbnVlOworCQlzdGF0dXMgPSBORlNfU1RBTEUoaW5vZGUpID8gLUVTVEFMRSA6IDA7CisJCWdvdG8gb3V0X25vd2FpdDsKKwl9CisJTkZTX0ZMQUdTKGlub2RlKSB8PSBORlNfSU5PX1JFVkFMSURBVElORzsKKworCS8qIFByb3RlY3QgYWdhaW5zdCBSUEMgcmFjZXMgYnkgc2F2aW5nIHRoZSBjaGFuZ2UgYXR0cmlidXRlICovCisJdmVyaWZpZXIgPSBuZnNfc2F2ZV9jaGFuZ2VfYXR0cmlidXRlKGlub2RlKTsKKwlzdGF0dXMgPSBORlNfUFJPVE8oaW5vZGUpLT5nZXRhdHRyKHNlcnZlciwgTkZTX0ZIKGlub2RlKSwgJmZhdHRyKTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJZGZwcmludGsoUEFHRUNBQ0hFLCAibmZzX3JldmFsaWRhdGVfaW5vZGU6ICglcy8lTGQpIGdldGF0dHIgZmFpbGVkLCBlcnJvcj0lZFxuIiwKKwkJCSBpbm9kZS0+aV9zYi0+c19pZCwKKwkJCSAobG9uZyBsb25nKU5GU19GSUxFSUQoaW5vZGUpLCBzdGF0dXMpOworCQlpZiAoc3RhdHVzID09IC1FU1RBTEUpIHsKKwkJCW5mc196YXBfY2FjaGVzKGlub2RlKTsKKwkJCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCQlORlNfRkxBR1MoaW5vZGUpIHw9IE5GU19JTk9fU1RBTEU7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCisJc3RhdHVzID0gbmZzX3VwZGF0ZV9pbm9kZShpbm9kZSwgJmZhdHRyLCB2ZXJpZmllcik7CisJaWYgKHN0YXR1cykgeworCQlkZnByaW50ayhQQUdFQ0FDSEUsICJuZnNfcmV2YWxpZGF0ZV9pbm9kZTogKCVzLyVMZCkgcmVmcmVzaCBmYWlsZWQsIGVycm9yPSVkXG4iLAorCQkJIGlub2RlLT5pX3NiLT5zX2lkLAorCQkJIChsb25nIGxvbmcpTkZTX0ZJTEVJRChpbm9kZSksIHN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KKwlmbGFncyA9IG5mc2ktPmZsYWdzOworCS8qCisJICogV2UgbWF5IG5lZWQgdG8ga2VlcCB0aGUgYXR0cmlidXRlcyBtYXJrZWQgYXMgaW52YWxpZCBpZgorCSAqIHdlIHJhY2VkIHdpdGggbmZzX2VuZF9hdHRyX3VwZGF0ZSgpLgorCSAqLworCWlmICh2ZXJpZmllciA9PSBuZnNpLT5jYWNoZV9jaGFuZ2VfYXR0cmlidXRlKQorCQluZnNpLT5mbGFncyAmPSB+KE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fSU5WQUxJRF9BVElNRSk7CisJLyogRG8gdGhlIHBhZ2UgY2FjaGUgaW52YWxpZGF0aW9uICovCisJaWYgKGZsYWdzICYgTkZTX0lOT19JTlZBTElEX0RBVEEpIHsKKwkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWlmIChmaWxlbWFwX2ZkYXRhd3JpdGUoaW5vZGUtPmlfbWFwcGluZykgPT0gMCkKKwkJCQlmaWxlbWFwX2ZkYXRhd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKKwkJCW5mc193Yl9hbGwoaW5vZGUpOworCQl9CisJCW5mc2ktPmZsYWdzICY9IH5ORlNfSU5PX0lOVkFMSURfREFUQTsKKwkJaW52YWxpZGF0ZV9pbm9kZV9wYWdlczIoaW5vZGUtPmlfbWFwcGluZyk7CisJCW1lbXNldChORlNfQ09PS0lFVkVSRihpbm9kZSksIDAsIHNpemVvZihORlNfQ09PS0lFVkVSRihpbm9kZSkpKTsKKwkJZGZwcmludGsoUEFHRUNBQ0hFLCAiTkZTOiAoJXMvJUxkKSBkYXRhIGNhY2hlIGludmFsaWRhdGVkXG4iLAorCQkJCWlub2RlLT5pX3NiLT5zX2lkLAorCQkJCShsb25nIGxvbmcpTkZTX0ZJTEVJRChpbm9kZSkpOworCQkvKiBUaGlzIGVuc3VyZXMgd2UgcmV2YWxpZGF0ZSBkZW50cmllcyAqLworCQluZnNpLT5jYWNoZV9jaGFuZ2VfYXR0cmlidXRlKys7CisJfQorCWRmcHJpbnRrKFBBR0VDQUNIRSwgIk5GUzogKCVzLyVMZCkgcmV2YWxpZGF0aW9uIGNvbXBsZXRlXG4iLAorCQlpbm9kZS0+aV9zYi0+c19pZCwKKwkJKGxvbmcgbG9uZylORlNfRklMRUlEKGlub2RlKSk7CisKK291dDoKKwlORlNfRkxBR1MoaW5vZGUpICY9IH5ORlNfSU5PX1JFVkFMSURBVElORzsKKwl3YWtlX3VwKCZuZnNpLT5uZnNfaV93YWl0KTsKKyBvdXRfbm93YWl0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgbmZzX2F0dHJpYnV0ZV90aW1lb3V0KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKworCWlmIChuZnNfaGF2ZV9kZWxlZ2F0aW9uKGlub2RlLCBGTU9ERV9SRUFEKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHRpbWVfYWZ0ZXIoamlmZmllcywgbmZzaS0+cmVhZF9jYWNoZV9qaWZmaWVzK25mc2ktPmF0dHJ0aW1lbyk7Cit9CisKKy8qKgorICogbmZzX3JldmFsaWRhdGVfaW5vZGUgLSBSZXZhbGlkYXRlIHRoZSBpbm9kZSBhdHRyaWJ1dGVzCisgKiBAc2VydmVyIC0gcG9pbnRlciB0byBuZnNfc2VydmVyIHN0cnVjdAorICogQGlub2RlIC0gcG9pbnRlciB0byBpbm9kZSBzdHJ1Y3QKKyAqCisgKiBVcGRhdGVzIGlub2RlIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiBieSByZXRyaWV2aW5nIHRoZSBkYXRhIGZyb20gdGhlIHNlcnZlci4KKyAqLworaW50IG5mc19yZXZhbGlkYXRlX2lub2RlKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKCEoTkZTX0ZMQUdTKGlub2RlKSAmIChORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX0lOVkFMSURfREFUQSkpCisJCQkmJiAhbmZzX2F0dHJpYnV0ZV90aW1lb3V0KGlub2RlKSkKKwkJcmV0dXJuIE5GU19TVEFMRShpbm9kZSkgPyAtRVNUQUxFIDogMDsKKwlyZXR1cm4gX19uZnNfcmV2YWxpZGF0ZV9pbm9kZShzZXJ2ZXIsIGlub2RlKTsKK30KKworLyoqCisgKiBuZnNfYmVnaW5fZGF0YV91cGRhdGUKKyAqIEBpbm9kZSAtIHBvaW50ZXIgdG8gaW5vZGUKKyAqIERlY2xhcmUgdGhhdCBhIHNldCBvZiBvcGVyYXRpb25zIHdpbGwgdXBkYXRlIGZpbGUgZGF0YSBvbiB0aGUgc2VydmVyCisgKi8KK3ZvaWQgbmZzX2JlZ2luX2RhdGFfdXBkYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJYXRvbWljX2luYygmTkZTX0koaW5vZGUpLT5kYXRhX3VwZGF0ZXMpOworfQorCisvKioKKyAqIG5mc19lbmRfZGF0YV91cGRhdGUKKyAqIEBpbm9kZSAtIHBvaW50ZXIgdG8gaW5vZGUKKyAqIERlY2xhcmUgZW5kIG9mIHRoZSBvcGVyYXRpb25zIHRoYXQgd2lsbCB1cGRhdGUgZmlsZSBkYXRhCisgKiBUaGlzIHdpbGwgbWFyayB0aGUgaW5vZGUgYXMgaW1tZWRpYXRlbHkgbmVlZGluZyByZXZhbGlkYXRpb24KKyAqIG9mIGl0cyBhdHRyaWJ1dGUgY2FjaGUuCisgKi8KK3ZvaWQgbmZzX2VuZF9kYXRhX3VwZGF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisKKwlpZiAoIW5mc19oYXZlX2RlbGVnYXRpb24oaW5vZGUsIEZNT0RFX1JFQUQpKSB7CisJCS8qIE1hcmsgdGhlIGF0dHJpYnV0ZSBjYWNoZSBmb3IgcmV2YWxpZGF0aW9uICovCisJCW5mc2ktPmZsYWdzIHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSOworCQkvKiBEaXJlY3RvcmllcyBhbmQgc3ltbGlua3M6IGludmFsaWRhdGUgcGFnZSBjYWNoZSB0b28gKi8KKwkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJCW5mc2ktPmZsYWdzIHw9IE5GU19JTk9fSU5WQUxJRF9EQVRBOworCX0KKwluZnNpLT5jYWNoZV9jaGFuZ2VfYXR0cmlidXRlICsrOworCWF0b21pY19kZWMoJm5mc2ktPmRhdGFfdXBkYXRlcyk7Cit9CisKKy8qKgorICogbmZzX2VuZF9kYXRhX3VwZGF0ZV9kZWZlcgorICogQGlub2RlIC0gcG9pbnRlciB0byBpbm9kZQorICogRGVjbGFyZSBlbmQgb2YgdGhlIG9wZXJhdGlvbnMgdGhhdCB3aWxsIHVwZGF0ZSBmaWxlIGRhdGEKKyAqIFRoaXMgd2lsbCBkZWZlciBtYXJraW5nIHRoZSBpbm9kZSBhcyBuZWVkaW5nIHJldmFsaWRhdGlvbgorICogdW5sZXNzIHRoZXJlIGFyZSBubyBvdGhlciBwZW5kaW5nIHVwZGF0ZXMuCisgKi8KK3ZvaWQgbmZzX2VuZF9kYXRhX3VwZGF0ZV9kZWZlcihzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmbmZzaS0+ZGF0YV91cGRhdGVzKSkgeworCQkvKiBNYXJrIHRoZSBhdHRyaWJ1dGUgY2FjaGUgZm9yIHJldmFsaWRhdGlvbiAqLworCQluZnNpLT5mbGFncyB8PSBORlNfSU5PX0lOVkFMSURfQVRUUjsKKwkJLyogRGlyZWN0b3JpZXMgYW5kIHN5bWxpbmtzOiBpbnZhbGlkYXRlIHBhZ2UgY2FjaGUgdG9vICovCisJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCQluZnNpLT5mbGFncyB8PSBORlNfSU5PX0lOVkFMSURfREFUQTsKKwkJbmZzaS0+Y2FjaGVfY2hhbmdlX2F0dHJpYnV0ZSArKzsKKwl9Cit9CisKKy8qKgorICogbmZzX3JlZnJlc2hfaW5vZGUgLSB2ZXJpZnkgY29uc2lzdGVuY3kgb2YgdGhlIGlub2RlIGF0dHJpYnV0ZSBjYWNoZQorICogQGlub2RlIC0gcG9pbnRlciB0byBpbm9kZQorICogQGZhdHRyIC0gdXBkYXRlZCBhdHRyaWJ1dGVzCisgKgorICogVmVyaWZpZXMgdGhlIGF0dHJpYnV0ZSBjYWNoZS4gSWYgd2UgaGF2ZSBqdXN0IGNoYW5nZWQgdGhlIGF0dHJpYnV0ZXMsCisgKiBzbyB0aGF0IGZhdHRyIGNhcnJpZXMgd2VhayBjYWNoZSBjb25zaXN0ZW5jeSBkYXRhLCB0aGVuIGl0IG1heQorICogYWxzbyB1cGRhdGUgdGhlIGN0aW1lL210aW1lL2NoYW5nZV9hdHRyaWJ1dGUuCisgKi8KK2ludCBuZnNfcmVmcmVzaF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCWxvZmZfdCBjdXJfc2l6ZSwgbmV3X2lzaXplOworCWludCBkYXRhX3Vuc3RhYmxlOworCisJLyogRG8gd2UgaG9sZCBhIGRlbGVnYXRpb24/ICovCisJaWYgKG5mc19oYXZlX2RlbGVnYXRpb24oaW5vZGUsIEZNT0RFX1JFQUQpKQorCQlyZXR1cm4gMDsKKworCS8qIEFyZSB3ZSBpbiB0aGUgcHJvY2VzcyBvZiB1cGRhdGluZyBkYXRhIG9uIHRoZSBzZXJ2ZXI/ICovCisJZGF0YV91bnN0YWJsZSA9IG5mc19jYWNoZXNfdW5zdGFibGUoaW5vZGUpOworCisJaWYgKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX1Y0KSB7CisJCWlmICgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfUFJFX0NIQU5HRSkgIT0gMAorCQkJCSYmIG5mc2ktPmNoYW5nZV9hdHRyID09IGZhdHRyLT5wcmVfY2hhbmdlX2F0dHIpCisJCQluZnNpLT5jaGFuZ2VfYXR0ciA9IGZhdHRyLT5jaGFuZ2VfYXR0cjsKKwkJaWYgKCFkYXRhX3Vuc3RhYmxlICYmIG5mc2ktPmNoYW5nZV9hdHRyICE9IGZhdHRyLT5jaGFuZ2VfYXR0cikKKwkJCW5mc2ktPmZsYWdzIHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSOworCX0KKworCWlmICgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFIpID09IDApCisJCXJldHVybiAwOworCisJLyogSGFzIHRoZSBpbm9kZSBnb25lIGFuZCBjaGFuZ2VkIGJlaGluZCBvdXIgYmFjaz8gKi8KKwlpZiAobmZzaS0+ZmlsZWlkICE9IGZhdHRyLT5maWxlaWQKKwkJCXx8IChpbm9kZS0+aV9tb2RlICYgU19JRk1UKSAhPSAoZmF0dHItPm1vZGUgJiBTX0lGTVQpKQorCQlyZXR1cm4gLUVJTzsKKworCWN1cl9zaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworIAluZXdfaXNpemUgPSBuZnNfc2l6ZV90b19sb2ZmX3QoZmF0dHItPnNpemUpOworCisJLyogSWYgd2UgaGF2ZSBhdG9taWMgV0NDIGRhdGEsIHdlIG1heSB1cGRhdGUgc29tZSBhdHRyaWJ1dGVzICovCisJaWYgKChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9XQ0MpICE9IDApIHsKKwkJaWYgKHRpbWVzcGVjX2VxdWFsKCZpbm9kZS0+aV9jdGltZSwgJmZhdHRyLT5wcmVfY3RpbWUpKQorCQkJbWVtY3B5KCZpbm9kZS0+aV9jdGltZSwgJmZhdHRyLT5jdGltZSwgc2l6ZW9mKGlub2RlLT5pX2N0aW1lKSk7CisJCWlmICh0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfbXRpbWUsICZmYXR0ci0+cHJlX210aW1lKSkKKwkJCW1lbWNweSgmaW5vZGUtPmlfbXRpbWUsICZmYXR0ci0+bXRpbWUsIHNpemVvZihpbm9kZS0+aV9tdGltZSkpOworCX0KKworCS8qIFZlcmlmeSBhIGZldyBvZiB0aGUgbW9yZSBpbXBvcnRhbnQgYXR0cmlidXRlcyAqLworCWlmICghZGF0YV91bnN0YWJsZSkgeworCQlpZiAoIXRpbWVzcGVjX2VxdWFsKCZpbm9kZS0+aV9tdGltZSwgJmZhdHRyLT5tdGltZSkKKwkJCQl8fCBjdXJfc2l6ZSAhPSBuZXdfaXNpemUpCisJCQluZnNpLT5mbGFncyB8PSBORlNfSU5PX0lOVkFMSURfQVRUUjsKKwl9IGVsc2UgaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgbmV3X2lzaXplID4gY3VyX3NpemUpCisJCQluZnNpLT5mbGFncyB8PSBORlNfSU5PX0lOVkFMSURfQVRUUjsKKworCS8qIEhhdmUgYW55IGZpbGUgcGVybWlzc2lvbnMgY2hhbmdlZD8gKi8KKwlpZiAoKGlub2RlLT5pX21vZGUgJiBTX0lBTExVR08pICE9IChmYXR0ci0+bW9kZSAmIFNfSUFMTFVHTykKKwkJCXx8IGlub2RlLT5pX3VpZCAhPSBmYXR0ci0+dWlkCisJCQl8fCBpbm9kZS0+aV9naWQgIT0gZmF0dHItPmdpZCkKKwkJbmZzaS0+ZmxhZ3MgfD0gTkZTX0lOT19JTlZBTElEX0FUVFIgfCBORlNfSU5PX0lOVkFMSURfQUNDRVNTOworCisJLyogSGFzIHRoZSBsaW5rIGNvdW50IGNoYW5nZWQ/ICovCisJaWYgKGlub2RlLT5pX25saW5rICE9IGZhdHRyLT5ubGluaykKKwkJbmZzaS0+ZmxhZ3MgfD0gTkZTX0lOT19JTlZBTElEX0FUVFI7CisKKwlpZiAoIXRpbWVzcGVjX2VxdWFsKCZpbm9kZS0+aV9hdGltZSwgJmZhdHRyLT5hdGltZSkpCisJCW5mc2ktPmZsYWdzIHw9IE5GU19JTk9fSU5WQUxJRF9BVElNRTsKKworCW5mc2ktPnJlYWRfY2FjaGVfamlmZmllcyA9IGZhdHRyLT50aW1lc3RhbXA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNYW55IG5mcyBwcm90b2NvbCBjYWxscyByZXR1cm4gdGhlIG5ldyBmaWxlIGF0dHJpYnV0ZXMgYWZ0ZXIKKyAqIGFuIG9wZXJhdGlvbi4gIEhlcmUgd2UgdXBkYXRlIHRoZSBpbm9kZSB0byByZWZsZWN0IHRoZSBzdGF0ZQorICogb2YgdGhlIHNlcnZlcidzIGlub2RlLgorICoKKyAqIFRoaXMgaXMgYSBiaXQgdHJpY2t5IGJlY2F1c2Ugd2UgaGF2ZSB0byBtYWtlIHN1cmUgYWxsIGRpcnR5IHBhZ2VzCisgKiBoYXZlIGJlZW4gc2VudCBvZmYgdG8gdGhlIHNlcnZlciBiZWZvcmUgY2FsbGluZyBpbnZhbGlkYXRlX2lub2RlX3BhZ2VzLgorICogVG8gbWFrZSBzdXJlIG5vIG90aGVyIHByb2Nlc3MgYWRkcyBtb3JlIHdyaXRlIHJlcXVlc3RzIHdoaWxlIHdlIHRyeQorICogb3VyIGJlc3QgdG8gZmx1c2ggdGhlbSwgd2UgbWFrZSB0aGVtIHNsZWVwIGR1cmluZyB0aGUgYXR0cmlidXRlIHJlZnJlc2guCisgKgorICogQSB2ZXJ5IHNpbWlsYXIgc2NlbmFyaW8gaG9sZHMgZm9yIHRoZSBkaXIgY2FjaGUuCisgKi8KK3N0YXRpYyBpbnQgbmZzX3VwZGF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0ciwgdW5zaWduZWQgbG9uZyB2ZXJpZmllcikKK3sKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCV9fdTY0CQluZXdfc2l6ZTsKKwlsb2ZmX3QJCW5ld19pc2l6ZTsKKwl1bnNpZ25lZCBpbnQJaW52YWxpZCA9IDA7CisJbG9mZl90CQljdXJfaXNpemU7CisJaW50IGRhdGFfdW5zdGFibGU7CisKKwlkZnByaW50ayhWRlMsICJORlM6ICVzKCVzLyVsZCBjdD0lZCBpbmZvPTB4JXgpXG4iLAorCQkJX19GVU5DVElPTl9fLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vLAorCQkJYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSwgZmF0dHItPnZhbGlkKTsKKworCWlmICgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFIpID09IDApCisJCXJldHVybiAwOworCisJaWYgKG5mc2ktPmZpbGVpZCAhPSBmYXR0ci0+ZmlsZWlkKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGlub2RlIG51bWJlciBtaXNtYXRjaFxuIgorCQkgICAgICAgImV4cGVjdGVkICglcy8weCVMeCksIGdvdCAoJXMvMHglTHgpXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLAorCQkgICAgICAgaW5vZGUtPmlfc2ItPnNfaWQsIChsb25nIGxvbmcpbmZzaS0+ZmlsZWlkLAorCQkgICAgICAgaW5vZGUtPmlfc2ItPnNfaWQsIChsb25nIGxvbmcpZmF0dHItPmZpbGVpZCk7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgaW5vZGUncyB0eXBlIGhhc24ndCBjaGFuZ2VkLgorCSAqLworCWlmICgoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgIT0gKGZhdHRyLT5tb2RlICYgU19JRk1UKSkKKwkJZ290byBvdXRfY2hhbmdlZDsKKworCS8qCisJICogVXBkYXRlIHRoZSByZWFkIHRpbWUgc28gd2UgZG9uJ3QgcmV2YWxpZGF0ZSB0b28gb2Z0ZW4uCisJICovCisJbmZzaS0+cmVhZF9jYWNoZV9qaWZmaWVzID0gZmF0dHItPnRpbWVzdGFtcDsKKworCS8qIEFyZSB3ZSByYWNpbmcgd2l0aCBrbm93biB1cGRhdGVzIG9mIHRoZSBtZXRhZGF0YSBvbiB0aGUgc2VydmVyPyAqLworCWRhdGFfdW5zdGFibGUgPSAhIG5mc192ZXJpZnlfY2hhbmdlX2F0dHJpYnV0ZShpbm9kZSwgdmVyaWZpZXIpOworCisJLyogQ2hlY2sgaWYgdGhlIGZpbGUgc2l6ZSBhZ3JlZXMgKi8KKwluZXdfc2l6ZSA9IGZhdHRyLT5zaXplOworIAluZXdfaXNpemUgPSBuZnNfc2l6ZV90b19sb2ZmX3QoZmF0dHItPnNpemUpOworCWN1cl9pc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwlpZiAoY3VyX2lzaXplICE9IG5ld19zaXplKSB7CisjaWZkZWYgTkZTX0RFQlVHX1ZFUkJPU0UKKwkJcHJpbnRrKEtFUk5fREVCVUcgIk5GUzogaXNpemUgY2hhbmdlIG9uICVzLyVsZFxuIiwgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7CisjZW5kaWYKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBwZW5kaW5nIHdyaXRlYmFja3MsIHRoaW5ncyBjYW4gZ2V0CisJCSAqIG1lc3N5LgorCQkgKi8KKwkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgZGF0YV91bnN0YWJsZSkgeworCQkJaWYgKG5ld19pc2l6ZSA+IGN1cl9pc2l6ZSkgeworCQkJCWlub2RlLT5pX3NpemUgPSBuZXdfaXNpemU7CisJCQkJaW52YWxpZCB8PSBORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX0lOVkFMSURfREFUQTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlub2RlLT5pX3NpemUgPSBuZXdfaXNpemU7CisJCQlpbnZhbGlkIHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fSU5WQUxJRF9EQVRBOworCQl9CisJfQorCisJLyoKKwkgKiBOb3RlOiB3ZSBkb24ndCBjaGVjayBpbm9kZS0+aV9tdGltZSBzaW5jZSBwaXBlcyBldGMuCisJICogICAgICAgY2FuIGNoYW5nZSB0aGlzIHZhbHVlIGluIFZGUyB3aXRob3V0IHJlcXVpcmluZyBhCisJICoJIGNhY2hlIHJldmFsaWRhdGlvbi4KKwkgKi8KKwlpZiAoIXRpbWVzcGVjX2VxdWFsKCZpbm9kZS0+aV9tdGltZSwgJmZhdHRyLT5tdGltZSkpIHsKKwkJbWVtY3B5KCZpbm9kZS0+aV9tdGltZSwgJmZhdHRyLT5tdGltZSwgc2l6ZW9mKGlub2RlLT5pX210aW1lKSk7CisjaWZkZWYgTkZTX0RFQlVHX1ZFUkJPU0UKKwkJcHJpbnRrKEtFUk5fREVCVUcgIk5GUzogbXRpbWUgY2hhbmdlIG9uICVzLyVsZFxuIiwgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7CisjZW5kaWYKKwkJaWYgKCFkYXRhX3Vuc3RhYmxlKQorCQkJaW52YWxpZCB8PSBORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX0lOVkFMSURfREFUQTsKKwl9CisKKwlpZiAoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX1Y0KQorCSAgICAmJiBuZnNpLT5jaGFuZ2VfYXR0ciAhPSBmYXR0ci0+Y2hhbmdlX2F0dHIpIHsKKyNpZmRlZiBORlNfREVCVUdfVkVSQk9TRQorCQlwcmludGsoS0VSTl9ERUJVRyAiTkZTOiBjaGFuZ2VfYXR0ciBjaGFuZ2Ugb24gJXMvJWxkXG4iLAorCQkgICAgICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7CisjZW5kaWYKKwkJbmZzaS0+Y2hhbmdlX2F0dHIgPSBmYXR0ci0+Y2hhbmdlX2F0dHI7CisJCWlmICghZGF0YV91bnN0YWJsZSkKKwkJCWludmFsaWQgfD0gTkZTX0lOT19JTlZBTElEX0FUVFJ8TkZTX0lOT19JTlZBTElEX0RBVEF8TkZTX0lOT19JTlZBTElEX0FDQ0VTUzsKKwl9CisKKwltZW1jcHkoJmlub2RlLT5pX2N0aW1lLCAmZmF0dHItPmN0aW1lLCBzaXplb2YoaW5vZGUtPmlfY3RpbWUpKTsKKwltZW1jcHkoJmlub2RlLT5pX2F0aW1lLCAmZmF0dHItPmF0aW1lLCBzaXplb2YoaW5vZGUtPmlfYXRpbWUpKTsKKworCWlmICgoaW5vZGUtPmlfbW9kZSAmIFNfSUFMTFVHTykgIT0gKGZhdHRyLT5tb2RlICYgU19JQUxMVUdPKSB8fAorCSAgICBpbm9kZS0+aV91aWQgIT0gZmF0dHItPnVpZCB8fAorCSAgICBpbm9kZS0+aV9naWQgIT0gZmF0dHItPmdpZCkKKwkJaW52YWxpZCB8PSBORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX0lOVkFMSURfQUNDRVNTOworCisJaW5vZGUtPmlfbW9kZSA9IGZhdHRyLT5tb2RlOworCWlub2RlLT5pX25saW5rID0gZmF0dHItPm5saW5rOworCWlub2RlLT5pX3VpZCA9IGZhdHRyLT51aWQ7CisJaW5vZGUtPmlfZ2lkID0gZmF0dHItPmdpZDsKKworCWlmIChmYXR0ci0+dmFsaWQgJiAoTkZTX0FUVFJfRkFUVFJfVjMgfCBORlNfQVRUUl9GQVRUUl9WNCkpIHsKKwkJLyoKKwkJICogcmVwb3J0IHRoZSBibG9ja3MgaW4gNTEyYnl0ZSB1bml0cworCQkgKi8KKwkJaW5vZGUtPmlfYmxvY2tzID0gbmZzX2NhbGNfYmxvY2tfc2l6ZShmYXR0ci0+ZHUubmZzMy51c2VkKTsKKwkJaW5vZGUtPmlfYmxrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKyAJfSBlbHNlIHsKKyAJCWlub2RlLT5pX2Jsb2NrcyA9IGZhdHRyLT5kdS5uZnMyLmJsb2NrczsKKyAJCWlub2RlLT5pX2Jsa3NpemUgPSBmYXR0ci0+ZHUubmZzMi5ibG9ja3NpemU7CisgCX0KKworCS8qIFVwZGF0ZSBhdHRydGltZW8gdmFsdWUgaWYgd2UncmUgb3V0IG9mIHRoZSB1bnN0YWJsZSBwZXJpb2QgKi8KKwlpZiAoaW52YWxpZCAmIE5GU19JTk9fSU5WQUxJRF9BVFRSKSB7CisJCW5mc2ktPmF0dHJ0aW1lbyA9IE5GU19NSU5BVFRSVElNRU8oaW5vZGUpOworCQluZnNpLT5hdHRydGltZW9fdGltZXN0YW1wID0gamlmZmllczsKKwl9IGVsc2UgaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgbmZzaS0+YXR0cnRpbWVvX3RpbWVzdGFtcCtuZnNpLT5hdHRydGltZW8pKSB7CisJCWlmICgobmZzaS0+YXR0cnRpbWVvIDw8PSAxKSA+IE5GU19NQVhBVFRSVElNRU8oaW5vZGUpKQorCQkJbmZzaS0+YXR0cnRpbWVvID0gTkZTX01BWEFUVFJUSU1FTyhpbm9kZSk7CisJCW5mc2ktPmF0dHJ0aW1lb190aW1lc3RhbXAgPSBqaWZmaWVzOworCX0KKwkvKiBEb24ndCBpbnZhbGlkYXRlIHRoZSBkYXRhIGlmIHdlIHdlcmUgdG8gYmxhbWUgKi8KKwlpZiAoIShTX0lTUkVHKGlub2RlLT5pX21vZGUpIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkKKwkJCQl8fCBTX0lTTE5LKGlub2RlLT5pX21vZGUpKSkKKwkJaW52YWxpZCAmPSB+TkZTX0lOT19JTlZBTElEX0RBVEE7CisJaWYgKCFuZnNfaGF2ZV9kZWxlZ2F0aW9uKGlub2RlLCBGTU9ERV9SRUFEKSkKKwkJbmZzaS0+ZmxhZ3MgfD0gaW52YWxpZDsKKworCXJldHVybiAwOworIG91dF9jaGFuZ2VkOgorCS8qCisJICogQmlnIHRyb3VibGUhIFRoZSBpbm9kZSBoYXMgYmVjb21lIGEgZGlmZmVyZW50IG9iamVjdC4KKwkgKi8KKyNpZmRlZiBORlNfUEFSQU5PSUEKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlub2RlICVsZCBtb2RlIGNoYW5nZWQsICUwN28gdG8gJTA3b1xuIiwKKwkJCV9fRlVOQ1RJT05fXywgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9tb2RlLCBmYXR0ci0+bW9kZSk7CisjZW5kaWYKKwkvKgorCSAqIE5vIG5lZWQgdG8gd29ycnkgYWJvdXQgdW5oYXNoaW5nIHRoZSBkZW50cnksIGFzIHRoZQorCSAqIGxvb2t1cCB2YWxpZGF0aW9uIHdpbGwga25vdyB0aGF0IHRoZSBpbm9kZSBpcyBiYWQuCisJICogKEJ1dCB3ZSBmYWxsIHRocm91Z2ggdG8gaW52YWxpZGF0ZSB0aGUgY2FjaGVzLikKKwkgKi8KKwluZnNfaW52YWxpZGF0ZV9pbm9kZShpbm9kZSk7Cisgb3V0X2VycjoKKwlORlNfRkxBR1MoaW5vZGUpIHw9IE5GU19JTk9fU1RBTEU7CisJcmV0dXJuIC1FU1RBTEU7Cit9CisKKy8qCisgKiBGaWxlIHN5c3RlbSBpbmZvcm1hdGlvbgorICovCisKK3N0YXRpYyBpbnQgbmZzX3NldF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHZvaWQgKmRhdGEpCit7CisJcy0+c19mc19pbmZvID0gZGF0YTsKKwlyZXR1cm4gc2V0X2Fub25fc3VwZXIocywgZGF0YSk7Cit9CisgCitzdGF0aWMgaW50IG5mc19jb21wYXJlX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IGRhdGE7CisJc3RydWN0IG5mc19zZXJ2ZXIgKm9sZCA9IE5GU19TQihzYik7CisKKwlpZiAob2xkLT5hZGRyLnNpbl9hZGRyLnNfYWRkciAhPSBzZXJ2ZXItPmFkZHIuc2luX2FkZHIuc19hZGRyKQorCQlyZXR1cm4gMDsKKwlpZiAob2xkLT5hZGRyLnNpbl9wb3J0ICE9IHNlcnZlci0+YWRkci5zaW5fcG9ydCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuICFuZnNfY29tcGFyZV9maCgmb2xkLT5maCwgJnNlcnZlci0+ZmgpOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpuZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKnJhd19kYXRhKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyOworCXN0cnVjdCBzdXBlcl9ibG9jayAqczsKKwlzdHJ1Y3QgbmZzX2ZoICpyb290OworCXN0cnVjdCBuZnNfbW91bnRfZGF0YSAqZGF0YSA9IHJhd19kYXRhOworCisJaWYgKCFkYXRhKSB7CisJCXByaW50aygibmZzX3JlYWRfc3VwZXI6IG1pc3NpbmcgZGF0YSBhcmd1bWVudFxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCXNlcnZlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZnNfc2VydmVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXJ2ZXIpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCW1lbXNldChzZXJ2ZXIsIDAsIHNpemVvZihzdHJ1Y3QgbmZzX3NlcnZlcikpOworCS8qIFplcm8gb3V0IHRoZSBORlMgc3RhdGUgc3R1ZmYgKi8KKwlpbml0X25mc3Y0X3N0YXRlKHNlcnZlcik7CisKKwlpZiAoZGF0YS0+dmVyc2lvbiAhPSBORlNfTU9VTlRfVkVSU0lPTikgeworCQlwcmludGsoIm5mcyB3YXJuaW5nOiBtb3VudCB2ZXJzaW9uICVzIHRoYW4ga2VybmVsXG4iLAorCQkJZGF0YS0+dmVyc2lvbiA8IE5GU19NT1VOVF9WRVJTSU9OID8gIm9sZGVyIiA6ICJuZXdlciIpOworCQlpZiAoZGF0YS0+dmVyc2lvbiA8IDIpCisJCQlkYXRhLT5uYW1sZW4gPSAwOworCQlpZiAoZGF0YS0+dmVyc2lvbiA8IDMpCisJCQlkYXRhLT5ic2l6ZSAgPSAwOworCQlpZiAoZGF0YS0+dmVyc2lvbiA8IDQpIHsKKwkJCWRhdGEtPmZsYWdzICY9IH5ORlNfTU9VTlRfVkVSMzsKKwkJCWRhdGEtPnJvb3Quc2l6ZSA9IE5GUzJfRkhTSVpFOworCQkJbWVtY3B5KGRhdGEtPnJvb3QuZGF0YSwgZGF0YS0+b2xkX3Jvb3QuZGF0YSwgTkZTMl9GSFNJWkUpOworCQl9CisJCWlmIChkYXRhLT52ZXJzaW9uIDwgNSkKKwkJCWRhdGEtPmZsYWdzICY9IH5ORlNfTU9VTlRfU0VDRkxBVk9VUjsKKwl9CisKKwlyb290ID0gJnNlcnZlci0+Zmg7CisJaWYgKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1ZFUjMpCisJCXJvb3QtPnNpemUgPSBkYXRhLT5yb290LnNpemU7CisJZWxzZQorCQlyb290LT5zaXplID0gTkZTMl9GSFNJWkU7CisJaWYgKHJvb3QtPnNpemUgPiBzaXplb2Yocm9vdC0+ZGF0YSkpIHsKKwkJcHJpbnRrKCJuZnNfZ2V0X3NiOiBpbnZhbGlkIHJvb3QgZmlsZWhhbmRsZVxuIik7CisJCWtmcmVlKHNlcnZlcik7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKwltZW1jcHkocm9vdC0+ZGF0YSwgZGF0YS0+cm9vdC5kYXRhLCByb290LT5zaXplKTsKKworCS8qIFdlIG5vdyByZXF1aXJlIHRoYXQgdGhlIG1vdW50IHByb2Nlc3MgcGFzc2VzIHRoZSByZW1vdGUgYWRkcmVzcyAqLworCW1lbWNweSgmc2VydmVyLT5hZGRyLCAmZGF0YS0+YWRkciwgc2l6ZW9mKHNlcnZlci0+YWRkcikpOworCWlmIChzZXJ2ZXItPmFkZHIuc2luX2FkZHIuc19hZGRyID09IElOQUREUl9BTlkpIHsKKwkJcHJpbnRrKCJORlM6IG1vdW50IHByb2dyYW0gZGlkbid0IHBhc3MgcmVtb3RlIGFkZHJlc3MhXG4iKTsKKwkJa2ZyZWUoc2VydmVyKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJcyA9IHNnZXQoZnNfdHlwZSwgbmZzX2NvbXBhcmVfc3VwZXIsIG5mc19zZXRfc3VwZXIsIHNlcnZlcik7CisKKwlpZiAoSVNfRVJSKHMpIHx8IHMtPnNfcm9vdCkgeworCQlrZnJlZShzZXJ2ZXIpOworCQlyZXR1cm4gczsKKwl9CisKKwlzLT5zX2ZsYWdzID0gZmxhZ3M7CisKKwkvKiBGaXJlIHVwIHJwY2lvZCBpZiBub3QgeWV0IHJ1bm5pbmcgKi8KKwlpZiAocnBjaW9kX3VwKCkgIT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IGNvdWxkbid0IHN0YXJ0IHJwY2lvZCFcbiIpOworCQlrZnJlZShzZXJ2ZXIpOworCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwl9CisKKwllcnJvciA9IG5mc19maWxsX3N1cGVyKHMsIGRhdGEsIGZsYWdzICYgTVNfVkVSQk9TRSA/IDEgOiAwKTsKKwlpZiAoZXJyb3IpIHsKKwkJdXBfd3JpdGUoJnMtPnNfdW1vdW50KTsKKwkJZGVhY3RpdmF0ZV9zdXBlcihzKTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworCX0KKwlzLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHZvaWQgbmZzX2tpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0Iocyk7CisKKwlraWxsX2Fub25fc3VwZXIocyk7CisKKwlpZiAoc2VydmVyLT5jbGllbnQgIT0gTlVMTCAmJiAhSVNfRVJSKHNlcnZlci0+Y2xpZW50KSkKKwkJcnBjX3NodXRkb3duX2NsaWVudChzZXJ2ZXItPmNsaWVudCk7CisJaWYgKHNlcnZlci0+Y2xpZW50X3N5cyAhPSBOVUxMICYmICFJU19FUlIoc2VydmVyLT5jbGllbnRfc3lzKSkKKwkJcnBjX3NodXRkb3duX2NsaWVudChzZXJ2ZXItPmNsaWVudF9zeXMpOworCisJaWYgKCEoc2VydmVyLT5mbGFncyAmIE5GU19NT1VOVF9OT05MTSkpCisJCWxvY2tkX2Rvd24oKTsJLyogcmVsZWFzZSBycGMubG9ja2QgKi8KKworCXJwY2lvZF9kb3duKCk7CQkvKiByZWxlYXNlIHJwY2lvZCAqLworCisJaWYgKHNlcnZlci0+aG9zdG5hbWUgIT0gTlVMTCkKKwkJa2ZyZWUoc2VydmVyLT5ob3N0bmFtZSk7CisJa2ZyZWUoc2VydmVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIG5mc19mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAibmZzIiwKKwkuZ2V0X3NiCQk9IG5mc19nZXRfc2IsCisJLmtpbGxfc2IJPSBuZnNfa2lsbF9zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19PRERfUkVOQU1FfEZTX1JFVkFMX0RPVHxGU19CSU5BUllfTU9VTlREQVRBLAorfTsKKworI2lmZGVmIENPTkZJR19ORlNfVjQKKworc3RhdGljIHZvaWQgbmZzNF9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CisKKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIG5mczRfc29wcyA9IHsgCisJLmFsbG9jX2lub2RlCT0gbmZzX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gbmZzX2Rlc3Ryb3lfaW5vZGUsCisJLndyaXRlX2lub2RlCT0gbmZzX3dyaXRlX2lub2RlLAorCS5kZWxldGVfaW5vZGUJPSBuZnNfZGVsZXRlX2lub2RlLAorCS5zdGF0ZnMJCT0gbmZzX3N0YXRmcywKKwkuY2xlYXJfaW5vZGUJPSBuZnM0X2NsZWFyX2lub2RlLAorCS51bW91bnRfYmVnaW4JPSBuZnNfdW1vdW50X2JlZ2luLAorCS5zaG93X29wdGlvbnMJPSBuZnNfc2hvd19vcHRpb25zLAorfTsKKworLyoKKyAqIENsZWFuIG91dCBhbnkgcmVtYWluaW5nIE5GU3Y0IHN0YXRlIHRoYXQgbWlnaHQgYmUgbGVmdCBvdmVyIGR1ZQorICogdG8gb3BlbigpIGNhbGxzIHRoYXQgcGFzc2VkIG5mc19hdG9taWNfbG9va3VwLCBidXQgZmFpbGVkIHRvIGNhbGwKKyAqIG5mc19vcGVuKCkuCisgKi8KK3N0YXRpYyB2b2lkIG5mczRfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCisJLyogSWYgd2UgYXJlIGhvbGRpbmcgYSBkZWxlZ2F0aW9uLCByZXR1cm4gaXQhICovCisJaWYgKG5mc2ktPmRlbGVnYXRpb24gIT0gTlVMTCkKKwkJbmZzX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uKGlub2RlKTsKKwkvKiBGaXJzdCBjYWxsIHN0YW5kYXJkIE5GUyBjbGVhcl9pbm9kZSgpIGNvZGUgKi8KKwluZnNfY2xlYXJfaW5vZGUoaW5vZGUpOworCS8qIE5vdyBjbGVhciBvdXQgYW55IHJlbWFpbmluZyBzdGF0ZSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmbmZzaS0+b3Blbl9zdGF0ZXMpKSB7CisJCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZTsKKwkJCisJCXN0YXRlID0gbGlzdF9lbnRyeShuZnNpLT5vcGVuX3N0YXRlcy5uZXh0LAorCQkJCXN0cnVjdCBuZnM0X3N0YXRlLAorCQkJCWlub2RlX3N0YXRlcyk7CisJCWRwcmludGsoIiVzKCVzLyVMZCk6IGZvdW5kIHVuY2xhaW1lZCBORlN2NCBzdGF0ZSAlcFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sCisJCQkJaW5vZGUtPmlfc2ItPnNfaWQsCisJCQkJKGxvbmcgbG9uZylORlNfRklMRUlEKGlub2RlKSwKKwkJCQlzdGF0ZSk7CisJCUJVR19PTihhdG9taWNfcmVhZCgmc3RhdGUtPmNvdW50KSAhPSAxKTsKKwkJbmZzNF9jbG9zZV9zdGF0ZShzdGF0ZSwgc3RhdGUtPnN0YXRlKTsKKwl9Cit9CisKKworc3RhdGljIGludCBuZnM0X2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IG5mczRfbW91bnRfZGF0YSAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyOworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gTlVMTDsKKwlzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQgPSBOVUxMOworCXN0cnVjdCBycGNfY2xudCAqY2xudCA9IE5VTEw7CisJc3RydWN0IHJwY190aW1lb3V0IHRpbWVwYXJtczsKKwlycGNfYXV0aGZsYXZvcl90IGF1dGhmbGF2b3VyOworCWludCBwcm90bywgZXJyID0gLUVJTzsKKworCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gMDsKKwlzYi0+c19ibG9ja3NpemUgPSAwOworCXNlcnZlciA9IE5GU19TQihzYik7CisJaWYgKGRhdGEtPnJzaXplICE9IDApCisJCXNlcnZlci0+cnNpemUgPSBuZnNfYmxvY2tfc2l6ZShkYXRhLT5yc2l6ZSwgTlVMTCk7CisJaWYgKGRhdGEtPndzaXplICE9IDApCisJCXNlcnZlci0+d3NpemUgPSBuZnNfYmxvY2tfc2l6ZShkYXRhLT53c2l6ZSwgTlVMTCk7CisJc2VydmVyLT5mbGFncyA9IGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX0ZMQUdNQVNLOworCXNlcnZlci0+Y2FwcyA9IE5GU19DQVBfQVRPTUlDX09QRU47CisKKwlzZXJ2ZXItPmFjcmVnbWluID0gZGF0YS0+YWNyZWdtaW4qSFo7CisJc2VydmVyLT5hY3JlZ21heCA9IGRhdGEtPmFjcmVnbWF4KkhaOworCXNlcnZlci0+YWNkaXJtaW4gPSBkYXRhLT5hY2Rpcm1pbipIWjsKKwlzZXJ2ZXItPmFjZGlybWF4ID0gZGF0YS0+YWNkaXJtYXgqSFo7CisKKwlzZXJ2ZXItPnJwY19vcHMgPSAmbmZzX3Y0X2NsaWVudG9wczsKKwkvKiBJbml0aWFsaXplIHRpbWVvdXQgdmFsdWVzICovCisKKwl0aW1lcGFybXMudG9faW5pdHZhbCA9IGRhdGEtPnRpbWVvICogSFogLyAxMDsKKwl0aW1lcGFybXMudG9fcmV0cmllcyA9IGRhdGEtPnJldHJhbnM7CisJdGltZXBhcm1zLnRvX2V4cG9uZW50aWFsID0gMTsKKwlpZiAoIXRpbWVwYXJtcy50b19yZXRyaWVzKQorCQl0aW1lcGFybXMudG9fcmV0cmllcyA9IDU7CisKKwlwcm90byA9IGRhdGEtPnByb3RvOworCS8qIFdoaWNoIElQIHByb3RvY29sIGRvIHdlIHVzZT8gKi8KKwlzd2l0Y2ggKHByb3RvKSB7CisJY2FzZSBJUFBST1RPX1RDUDoKKwkJdGltZXBhcm1zLnRvX21heHZhbCAgPSBSUENfTUFYX1RDUF9USU1FT1VUOworCQlpZiAoIXRpbWVwYXJtcy50b19pbml0dmFsKQorCQkJdGltZXBhcm1zLnRvX2luaXR2YWwgPSA2MDAgKiBIWiAvIDEwOworCQlicmVhazsKKwljYXNlIElQUFJPVE9fVURQOgorCQl0aW1lcGFybXMudG9fbWF4dmFsICA9IFJQQ19NQVhfVURQX1RJTUVPVVQ7CisJCWlmICghdGltZXBhcm1zLnRvX2luaXR2YWwpCisJCQl0aW1lcGFybXMudG9faW5pdHZhbCA9IDExICogSFogLyAxMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2xwID0gbmZzNF9nZXRfY2xpZW50KCZzZXJ2ZXItPmFkZHIuc2luX2FkZHIpOworCWlmICghY2xwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUzogZmFpbGVkIHRvIGNyZWF0ZSBORlM0IGNsaWVudC5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBOb3cgY3JlYXRlIHRyYW5zcG9ydCBhbmQgY2xpZW50ICovCisJYXV0aGZsYXZvdXIgPSBSUENfQVVUSF9VTklYOworCWlmIChkYXRhLT5hdXRoX2ZsYXZvdXJsZW4gIT0gMCkgeworCQlpZiAoZGF0YS0+YXV0aF9mbGF2b3VybGVuID4gMSkKKwkJCXByaW50ayhLRVJOX0lORk8gIk5GUzogY2Fubm90IHlldCBkZWFsIHdpdGggbXVsdGlwbGUgYXV0aCBmbGF2b3Vycy5cbiIpOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmF1dGhmbGF2b3VyLCBkYXRhLT5hdXRoX2ZsYXZvdXJzLCBzaXplb2YoYXV0aGZsYXZvdXIpKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0X2ZhaWw7CisJCX0KKwl9CisKKwlkb3duX3dyaXRlKCZjbHAtPmNsX3NlbSk7CisJaWYgKGNscC0+Y2xfcnBjY2xpZW50ID09IE5VTEwpIHsKKwkJeHBydCA9IHhwcnRfY3JlYXRlX3Byb3RvKHByb3RvLCAmc2VydmVyLT5hZGRyLCAmdGltZXBhcm1zKTsKKwkJaWYgKElTX0VSUih4cHJ0KSkgeworCQkJdXBfd3JpdGUoJmNscC0+Y2xfc2VtKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUzogY2Fubm90IGNyZWF0ZSBSUEMgdHJhbnNwb3J0LlxuIik7CisJCQllcnIgPSBQVFJfRVJSKHhwcnQpOworCQkJZ290byBvdXRfZmFpbDsKKwkJfQorCQljbG50ID0gcnBjX2NyZWF0ZV9jbGllbnQoeHBydCwgc2VydmVyLT5ob3N0bmFtZSwgJm5mc19wcm9ncmFtLAorCQkJCXNlcnZlci0+cnBjX29wcy0+dmVyc2lvbiwgYXV0aGZsYXZvdXIpOworCQlpZiAoSVNfRVJSKGNsbnQpKSB7CisJCQl1cF93cml0ZSgmY2xwLT5jbF9zZW0pOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBjYW5ub3QgY3JlYXRlIFJQQyBjbGllbnQuXG4iKTsKKwkJCXhwcnRfZGVzdHJveSh4cHJ0KTsKKwkJCWVyciA9IFBUUl9FUlIoY2xudCk7CisJCQlnb3RvIG91dF9mYWlsOworCQl9CisJCWNsbnQtPmNsX2ludHIgICAgID0gMTsKKwkJY2xudC0+Y2xfc29mdHJ0cnkgPSAxOworCQljbG50LT5jbF9jaGF0dHkgICA9IDE7CisJCWNscC0+Y2xfcnBjY2xpZW50ID0gY2xudDsKKwkJY2xwLT5jbF9jcmVkID0gcnBjYXV0aF9sb29rdXBjcmVkKGNsbnQtPmNsX2F1dGgsIDApOworCQlpZiAoSVNfRVJSKGNscC0+Y2xfY3JlZCkpIHsKKwkJCXVwX3dyaXRlKCZjbHAtPmNsX3NlbSk7CisJCQllcnIgPSBQVFJfRVJSKGNscC0+Y2xfY3JlZCk7CisJCQljbHAtPmNsX2NyZWQgPSBOVUxMOworCQkJZ290byBvdXRfZmFpbDsKKwkJfQorCQltZW1jcHkoY2xwLT5jbF9pcGFkZHIsIHNlcnZlci0+aXBfYWRkciwgc2l6ZW9mKGNscC0+Y2xfaXBhZGRyKSk7CisJCW5mc19pZG1hcF9uZXcoY2xwKTsKKwl9CisJaWYgKGxpc3RfZW1wdHkoJmNscC0+Y2xfc3VwZXJibG9ja3MpKSB7CisJCWVyciA9IG5mczRfaW5pdF9jbGllbnQoY2xwKTsKKwkJaWYgKGVyciAhPSAwKSB7CisJCQl1cF93cml0ZSgmY2xwLT5jbF9zZW0pOworCQkJZ290byBvdXRfZmFpbDsKKwkJfQorCX0KKwlsaXN0X2FkZF90YWlsKCZzZXJ2ZXItPm5mczRfc2libGluZ3MsICZjbHAtPmNsX3N1cGVyYmxvY2tzKTsKKwljbG50ID0gcnBjX2Nsb25lX2NsaWVudChjbHAtPmNsX3JwY2NsaWVudCk7CisJaWYgKCFJU19FUlIoY2xudCkpCisJCQlzZXJ2ZXItPm5mczRfc3RhdGUgPSBjbHA7CisJdXBfd3JpdGUoJmNscC0+Y2xfc2VtKTsKKwljbHAgPSBOVUxMOworCisJaWYgKElTX0VSUihjbG50KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IGNhbm5vdCBjcmVhdGUgUlBDIGNsaWVudC5cbiIpOworCQlyZXR1cm4gUFRSX0VSUihjbG50KTsKKwl9CisKKwlzZXJ2ZXItPmNsaWVudCAgICA9IGNsbnQ7CisKKwlpZiAoc2VydmVyLT5uZnM0X3N0YXRlLT5jbF9pZG1hcCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUzogZmFpbGVkIHRvIGNyZWF0ZSBpZG1hcHBlci5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoY2xudC0+Y2xfYXV0aC0+YXVfZmxhdm9yICE9IGF1dGhmbGF2b3VyKSB7CisJCWlmIChycGNhdXRoX2NyZWF0ZShhdXRoZmxhdm91ciwgY2xudCkgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBjb3VsZG4ndCBjcmVhdGUgY3JlZGNhY2hlIVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCXNiLT5zX3RpbWVfZ3JhbiA9IDE7CisKKwlzYi0+c19vcCA9ICZuZnM0X3NvcHM7CisJZXJyID0gbmZzX3NiX2luaXQoc2IsIGF1dGhmbGF2b3VyKTsKKwlpZiAoZXJyID09IDApCisJCXJldHVybiAwOworb3V0X2ZhaWw6CisJaWYgKGNscCkKKwkJbmZzNF9wdXRfY2xpZW50KGNscCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBuZnM0X2NvbXBhcmVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gZGF0YTsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqb2xkID0gTkZTX1NCKHNiKTsKKworCWlmIChzdHJjbXAoc2VydmVyLT5ob3N0bmFtZSwgb2xkLT5ob3N0bmFtZSkgIT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKHN0cmNtcChzZXJ2ZXItPm1udF9wYXRoLCBvbGQtPm1udF9wYXRoKSAhPSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgKgorbmZzX2NvcHlfdXNlcl9zdHJpbmcoY2hhciAqZHN0LCBzdHJ1Y3QgbmZzX3N0cmluZyAqc3JjLCBpbnQgbWF4bGVuKQoreworCXZvaWQgKnAgPSBOVUxMOworCisJaWYgKCFzcmMtPmxlbikKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKHNyYy0+bGVuIDwgbWF4bGVuKQorCQltYXhsZW4gPSBzcmMtPmxlbjsKKwlpZiAoZHN0ID09IE5VTEwpIHsKKwkJcCA9IGRzdCA9IGttYWxsb2MobWF4bGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCWlmIChwID09IE5VTEwpCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKGRzdCwgc3JjLT5kYXRhLCBtYXhsZW4pKSB7CisJCWlmIChwICE9IE5VTEwpCisJCQlrZnJlZShwKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CisJfQorCWRzdFttYXhsZW5dID0gJ1wwJzsKKwlyZXR1cm4gZHN0OworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpuZnM0X2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpyYXdfZGF0YSkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnM7CisJc3RydWN0IG5mczRfbW91bnRfZGF0YSAqZGF0YSA9IHJhd19kYXRhOworCXZvaWQgKnA7CisKKwlpZiAoIWRhdGEpIHsKKwkJcHJpbnRrKCJuZnNfcmVhZF9zdXBlcjogbWlzc2luZyBkYXRhIGFyZ3VtZW50XG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJc2VydmVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5mc19zZXJ2ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlcnZlcikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJbWVtc2V0KHNlcnZlciwgMCwgc2l6ZW9mKHN0cnVjdCBuZnNfc2VydmVyKSk7CisJLyogWmVybyBvdXQgdGhlIE5GUyBzdGF0ZSBzdHVmZiAqLworCWluaXRfbmZzdjRfc3RhdGUoc2VydmVyKTsKKworCWlmIChkYXRhLT52ZXJzaW9uICE9IE5GUzRfTU9VTlRfVkVSU0lPTikgeworCQlwcmludGsoIm5mcyB3YXJuaW5nOiBtb3VudCB2ZXJzaW9uICVzIHRoYW4ga2VybmVsXG4iLAorCQkJZGF0YS0+dmVyc2lvbiA8IE5GUzRfTU9VTlRfVkVSU0lPTiA/ICJvbGRlciIgOiAibmV3ZXIiKTsKKwl9CisKKwlwID0gbmZzX2NvcHlfdXNlcl9zdHJpbmcoTlVMTCwgJmRhdGEtPmhvc3RuYW1lLCAyNTYpOworCWlmIChJU19FUlIocCkpCisJCWdvdG8gb3V0X2VycjsKKwlzZXJ2ZXItPmhvc3RuYW1lID0gcDsKKworCXAgPSBuZnNfY29weV91c2VyX3N0cmluZyhOVUxMLCAmZGF0YS0+bW50X3BhdGgsIDEwMjQpOworCWlmIChJU19FUlIocCkpCisJCWdvdG8gb3V0X2VycjsKKwlzZXJ2ZXItPm1udF9wYXRoID0gcDsKKworCXAgPSBuZnNfY29weV91c2VyX3N0cmluZyhzZXJ2ZXItPmlwX2FkZHIsICZkYXRhLT5jbGllbnRfYWRkciwKKwkJCXNpemVvZihzZXJ2ZXItPmlwX2FkZHIpIC0gMSk7CisJaWYgKElTX0VSUihwKSkKKwkJZ290byBvdXRfZXJyOworCisJLyogV2Ugbm93IHJlcXVpcmUgdGhhdCB0aGUgbW91bnQgcHJvY2VzcyBwYXNzZXMgdGhlIHJlbW90ZSBhZGRyZXNzICovCisJaWYgKGRhdGEtPmhvc3RfYWRkcmxlbiAhPSBzaXplb2Yoc2VydmVyLT5hZGRyKSkgeworCQlzID0gRVJSX1BUUigtRUlOVkFMKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKCZzZXJ2ZXItPmFkZHIsIGRhdGEtPmhvc3RfYWRkciwgc2l6ZW9mKHNlcnZlci0+YWRkcikpKSB7CisJCXMgPSBFUlJfUFRSKC1FRkFVTFQpOworCQlnb3RvIG91dF9mcmVlOworCX0KKwlpZiAoc2VydmVyLT5hZGRyLnNpbl9mYW1pbHkgIT0gQUZfSU5FVCB8fAorCSAgICBzZXJ2ZXItPmFkZHIuc2luX2FkZHIuc19hZGRyID09IElOQUREUl9BTlkpIHsKKwkJcHJpbnRrKCJORlM6IG1vdW50IHByb2dyYW0gZGlkbid0IHBhc3MgcmVtb3RlIElQIGFkZHJlc3MhXG4iKTsKKwkJcyA9IEVSUl9QVFIoLUVJTlZBTCk7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJcyA9IHNnZXQoZnNfdHlwZSwgbmZzNF9jb21wYXJlX3N1cGVyLCBuZnNfc2V0X3N1cGVyLCBzZXJ2ZXIpOworCisJaWYgKElTX0VSUihzKSB8fCBzLT5zX3Jvb3QpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlzLT5zX2ZsYWdzID0gZmxhZ3M7CisKKwkvKiBGaXJlIHVwIHJwY2lvZCBpZiBub3QgeWV0IHJ1bm5pbmcgKi8KKwlpZiAocnBjaW9kX3VwKCkgIT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IGNvdWxkbid0IHN0YXJ0IHJwY2lvZCFcbiIpOworCQlzID0gRVJSX1BUUigtRUlPKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwllcnJvciA9IG5mczRfZmlsbF9zdXBlcihzLCBkYXRhLCBmbGFncyAmIE1TX1ZFUkJPU0UgPyAxIDogMCk7CisJaWYgKGVycm9yKSB7CisJCXVwX3dyaXRlKCZzLT5zX3Vtb3VudCk7CisJCWRlYWN0aXZhdGVfc3VwZXIocyk7CisJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKKwl9CisJcy0+c19mbGFncyB8PSBNU19BQ1RJVkU7CisJcmV0dXJuIHM7CitvdXRfZXJyOgorCXMgPSAoc3RydWN0IHN1cGVyX2Jsb2NrICopcDsKK291dF9mcmVlOgorCWlmIChzZXJ2ZXItPm1udF9wYXRoKQorCQlrZnJlZShzZXJ2ZXItPm1udF9wYXRoKTsKKwlpZiAoc2VydmVyLT5ob3N0bmFtZSkKKwkJa2ZyZWUoc2VydmVyLT5ob3N0bmFtZSk7CisJa2ZyZWUoc2VydmVyKTsKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHZvaWQgbmZzNF9raWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TQihzYik7CisKKwluZnNfcmV0dXJuX2FsbF9kZWxlZ2F0aW9ucyhzYik7CisJa2lsbF9hbm9uX3N1cGVyKHNiKTsKKworCW5mczRfcmVuZXdkX3ByZXBhcmVfc2h1dGRvd24oc2VydmVyKTsKKworCWlmIChzZXJ2ZXItPmNsaWVudCAhPSBOVUxMICYmICFJU19FUlIoc2VydmVyLT5jbGllbnQpKQorCQlycGNfc2h1dGRvd25fY2xpZW50KHNlcnZlci0+Y2xpZW50KTsKKwlycGNpb2RfZG93bigpOwkJLyogcmVsZWFzZSBycGNpb2QgKi8KKworCWRlc3Ryb3lfbmZzdjRfc3RhdGUoc2VydmVyKTsKKworCWlmIChzZXJ2ZXItPmhvc3RuYW1lICE9IE5VTEwpCisJCWtmcmVlKHNlcnZlci0+aG9zdG5hbWUpOworCWtmcmVlKHNlcnZlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBuZnM0X2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJuZnM0IiwKKwkuZ2V0X3NiCQk9IG5mczRfZ2V0X3NiLAorCS5raWxsX3NiCT0gbmZzNF9raWxsX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX09ERF9SRU5BTUV8RlNfUkVWQUxfRE9UfEZTX0JJTkFSWV9NT1VOVERBVEEsCit9OworCisjZGVmaW5lIG5mczRfaW5pdF9vbmNlKG5mc2kpIFwKKwlkbyB7IFwKKwkJSU5JVF9MSVNUX0hFQUQoJihuZnNpKS0+b3Blbl9zdGF0ZXMpOyBcCisJCW5mc2ktPmRlbGVnYXRpb24gPSBOVUxMOyBcCisJCW5mc2ktPmRlbGVnYXRpb25fc3RhdGUgPSAwOyBcCisJCWluaXRfcndzZW0oJm5mc2ktPnJ3c2VtKTsgXAorCX0gd2hpbGUoMCkKKyNkZWZpbmUgcmVnaXN0ZXJfbmZzNGZzKCkgcmVnaXN0ZXJfZmlsZXN5c3RlbSgmbmZzNF9mc190eXBlKQorI2RlZmluZSB1bnJlZ2lzdGVyX25mczRmcygpIHVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmbmZzNF9mc190eXBlKQorI2Vsc2UKKyNkZWZpbmUgbmZzNF9pbml0X29uY2UobmZzaSkgXAorCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcmVnaXN0ZXJfbmZzNGZzKCkgKDApCisjZGVmaW5lIHVucmVnaXN0ZXJfbmZzNGZzKCkKKyNlbmRpZgorCitleHRlcm4gaW50IG5mc19pbml0X25mc3BhZ2VjYWNoZSh2b2lkKTsKK2V4dGVybiB2b2lkIG5mc19kZXN0cm95X25mc3BhZ2VjYWNoZSh2b2lkKTsKK2V4dGVybiBpbnQgbmZzX2luaXRfcmVhZHBhZ2VjYWNoZSh2b2lkKTsKK2V4dGVybiB2b2lkIG5mc19kZXN0cm95X3JlYWRwYWdlY2FjaGUodm9pZCk7CitleHRlcm4gaW50IG5mc19pbml0X3dyaXRlcGFnZWNhY2hlKHZvaWQpOworZXh0ZXJuIHZvaWQgbmZzX2Rlc3Ryb3lfd3JpdGVwYWdlY2FjaGUodm9pZCk7CisjaWZkZWYgQ09ORklHX05GU19ESVJFQ1RJTworZXh0ZXJuIGludCBuZnNfaW5pdF9kaXJlY3RjYWNoZSh2b2lkKTsKK2V4dGVybiB2b2lkIG5mc19kZXN0cm95X2RpcmVjdGNhY2hlKHZvaWQpOworI2VuZGlmCisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKiBuZnNfaW5vZGVfY2FjaGVwOworCitzdGF0aWMgc3RydWN0IGlub2RlICpuZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpOworCW5mc2kgPSAoc3RydWN0IG5mc19pbm9kZSAqKWttZW1fY2FjaGVfYWxsb2MobmZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghbmZzaSkKKwkJcmV0dXJuIE5VTEw7CisJbmZzaS0+ZmxhZ3MgPSAwOworCXJldHVybiAmbmZzaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBuZnNfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShuZnNfaW5vZGVfY2FjaGVwLCBORlNfSShpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSAoc3RydWN0IG5mc19pbm9kZSAqKSBmb287CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKSB7CisJCWlub2RlX2luaXRfb25jZSgmbmZzaS0+dmZzX2lub2RlKTsKKwkJc3Bpbl9sb2NrX2luaXQoJm5mc2ktPnJlcV9sb2NrKTsKKwkJSU5JVF9MSVNUX0hFQUQoJm5mc2ktPmRpcnR5KTsKKwkJSU5JVF9MSVNUX0hFQUQoJm5mc2ktPmNvbW1pdCk7CisJCUlOSVRfTElTVF9IRUFEKCZuZnNpLT5vcGVuX2ZpbGVzKTsKKwkJSU5JVF9SQURJWF9UUkVFKCZuZnNpLT5uZnNfcGFnZV90cmVlLCBHRlBfQVRPTUlDKTsKKwkJYXRvbWljX3NldCgmbmZzaS0+ZGF0YV91cGRhdGVzLCAwKTsKKwkJbmZzaS0+bmRpcnR5ID0gMDsKKwkJbmZzaS0+bmNvbW1pdCA9IDA7CisJCW5mc2ktPm5wYWdlcyA9IDA7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm5mc2ktPm5mc19pX3dhaXQpOworCQluZnM0X2luaXRfb25jZShuZnNpKTsKKwl9Cit9CisgCitpbnQgbmZzX2luaXRfaW5vZGVjYWNoZSh2b2lkKQoreworCW5mc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibmZzX2lub2RlX2NhY2hlIiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IG5mc19pbm9kZSksCisJCQkJCSAgICAgMCwgU0xBQl9SRUNMQUlNX0FDQ09VTlQsCisJCQkJCSAgICAgaW5pdF9vbmNlLCBOVUxMKTsKKwlpZiAobmZzX2lub2RlX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCit2b2lkIG5mc19kZXN0cm95X2lub2RlY2FjaGUodm9pZCkKK3sKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KG5mc19pbm9kZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9JTkZPICJuZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgTkZTCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmZzX2ZzKHZvaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IG5mc19pbml0X25mc3BhZ2VjYWNoZSgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0NDsKKworCWVyciA9IG5mc19pbml0X2lub2RlY2FjaGUoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDM7CisKKwllcnIgPSBuZnNfaW5pdF9yZWFkcGFnZWNhY2hlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQyOworCisJZXJyID0gbmZzX2luaXRfd3JpdGVwYWdlY2FjaGUoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisKKyNpZmRlZiBDT05GSUdfTkZTX0RJUkVDVElPCisJZXJyID0gbmZzX2luaXRfZGlyZWN0Y2FjaGUoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDA7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJcnBjX3Byb2NfcmVnaXN0ZXIoJm5mc19ycGNzdGF0KTsKKyNlbmRpZgorICAgICAgICBlcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZuZnNfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJaWYgKChlcnIgPSByZWdpc3Rlcl9uZnM0ZnMoKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJcmV0dXJuIDA7CitvdXQ6CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlycGNfcHJvY191bnJlZ2lzdGVyKCJuZnMiKTsKKyNlbmRpZgorCW5mc19kZXN0cm95X3dyaXRlcGFnZWNhY2hlKCk7CisjaWZkZWYgQ09ORklHX05GU19ESVJFQ1RJTworb3V0MDoKKwluZnNfZGVzdHJveV9kaXJlY3RjYWNoZSgpOworI2VuZGlmCitvdXQxOgorCW5mc19kZXN0cm95X3JlYWRwYWdlY2FjaGUoKTsKK291dDI6CisJbmZzX2Rlc3Ryb3lfaW5vZGVjYWNoZSgpOworb3V0MzoKKwluZnNfZGVzdHJveV9uZnNwYWdlY2FjaGUoKTsKK291dDQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmZzX2ZzKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX05GU19ESVJFQ1RJTworCW5mc19kZXN0cm95X2RpcmVjdGNhY2hlKCk7CisjZW5kaWYKKwluZnNfZGVzdHJveV93cml0ZXBhZ2VjYWNoZSgpOworCW5mc19kZXN0cm95X3JlYWRwYWdlY2FjaGUoKTsKKwluZnNfZGVzdHJveV9pbm9kZWNhY2hlKCk7CisJbmZzX2Rlc3Ryb3lfbmZzcGFnZWNhY2hlKCk7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlycGNfcHJvY191bnJlZ2lzdGVyKCJuZnMiKTsKKyNlbmRpZgorCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmbmZzX2ZzX3R5cGUpOworCXVucmVnaXN0ZXJfbmZzNGZzKCk7Cit9CisKKy8qIE5vdCBxdWl0ZSB0cnVlOyBJIGp1c3QgbWFpbnRhaW4gaXQgKi8KK01PRFVMRV9BVVRIT1IoIk9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChpbml0X25mc19mcykKK21vZHVsZV9leGl0KGV4aXRfbmZzX2ZzKQpkaWZmIC0tZ2l0IGEvZnMvbmZzL21vdW50X2NsbnQuYyBiL2ZzL25mcy9tb3VudF9jbG50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQzZGRhZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy9tb3VudF9jbG50LmMKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBsaW51eC9mcy9uZnMvbW91bnRfY2xudC5jCisgKgorICogTU9VTlQgY2xpZW50IHRvIHN1cHBvcnQgTkZTcm9vdC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94cHJ0Lmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisKKyNpZmRlZiBSUENfREVCVUcKKyMgZGVmaW5lIE5GU0RCR19GQUNJTElUWQlORlNEQkdfUk9PVAorI2VuZGlmCisKKy8qCisjZGVmaW5lIE1PVU5UX1BST0dSQU0JCTEwMDAwNQorI2RlZmluZSBNT1VOVF9WRVJTSU9OCQkxCisjZGVmaW5lIE1PVU5UX01OVAkJMQorI2RlZmluZSBNT1VOVF9VTU5UCQkzCisgKi8KKworc3RhdGljIHN0cnVjdCBycGNfY2xudCAqCW1udF9jcmVhdGUoY2hhciAqLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKiwKKwkJCQkJCQkJaW50LCBpbnQpOworc3RhdGljIHN0cnVjdCBycGNfcHJvZ3JhbQltbnRfcHJvZ3JhbTsKKworc3RydWN0IG1udF9maHN0YXR1cyB7CisJdW5zaWduZWQgaW50CQlzdGF0dXM7CisJc3RydWN0IG5mc19maCAqCQlmaDsKK307CisKKy8qCisgKiBPYnRhaW4gYW4gTkZTIGZpbGUgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gaG9zdCBhbmQgcGF0aAorICovCitpbnQKK25mc3Jvb3RfbW91bnQoc3RydWN0IHNvY2thZGRyX2luICphZGRyLCBjaGFyICpwYXRoLCBzdHJ1Y3QgbmZzX2ZoICpmaCwKKwkJaW50IHZlcnNpb24sIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3QgcnBjX2NsbnQJCSptbnRfY2xudDsKKwlzdHJ1Y3QgbW50X2Zoc3RhdHVzCXJlc3VsdCA9IHsKKwkJLmZoCQk9IGZoCisJfTsKKwljaGFyCQkJaG9zdG5hbWVbMzJdOworCWludAkJCXN0YXR1czsKKwlpbnQJCQljYWxsOworCisJZHByaW50aygiTkZTOiAgICAgIG5mc19tb3VudCglMDh4OiVzKVxuIiwKKwkJCSh1bnNpZ25lZCludG9obChhZGRyLT5zaW5fYWRkci5zX2FkZHIpLCBwYXRoKTsKKworCXNwcmludGYoaG9zdG5hbWUsICIldS4ldS4ldS4ldSIsIE5JUFFVQUQoYWRkci0+c2luX2FkZHIuc19hZGRyKSk7CisJbW50X2NsbnQgPSBtbnRfY3JlYXRlKGhvc3RuYW1lLCBhZGRyLCB2ZXJzaW9uLCBwcm90b2NvbCk7CisJaWYgKElTX0VSUihtbnRfY2xudCkpCisJCXJldHVybiBQVFJfRVJSKG1udF9jbG50KTsKKworCWNhbGwgPSAodmVyc2lvbiA9PSBORlNfTU5UM19WRVJTSU9OKSA/IE1PVU5UUFJPQzNfTU5UIDogTU5UUFJPQ19NTlQ7CisJc3RhdHVzID0gcnBjX2NhbGwobW50X2NsbnQsIGNhbGwsIHBhdGgsICZyZXN1bHQsIDApOworCXJldHVybiBzdGF0dXMgPCAwPyBzdGF0dXMgOiAocmVzdWx0LnN0YXR1cz8gLUVBQ0NFUyA6IDApOworfQorCitzdGF0aWMgc3RydWN0IHJwY19jbG50ICoKK21udF9jcmVhdGUoY2hhciAqaG9zdG5hbWUsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc3J2YWRkciwgaW50IHZlcnNpb24sCisJCWludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3QgcnBjX3hwcnQJKnhwcnQ7CisJc3RydWN0IHJwY19jbG50CSpjbG50OworCisJeHBydCA9IHhwcnRfY3JlYXRlX3Byb3RvKHByb3RvY29sLCBzcnZhZGRyLCBOVUxMKTsKKwlpZiAoSVNfRVJSKHhwcnQpKQorCQlyZXR1cm4gKHN0cnVjdCBycGNfY2xudCAqKXhwcnQ7CisKKwljbG50ID0gcnBjX2NyZWF0ZV9jbGllbnQoeHBydCwgaG9zdG5hbWUsCisJCQkJJm1udF9wcm9ncmFtLCB2ZXJzaW9uLAorCQkJCVJQQ19BVVRIX1VOSVgpOworCWlmIChJU19FUlIoY2xudCkpIHsKKwkJeHBydF9kZXN0cm95KHhwcnQpOworCX0gZWxzZSB7CisJCWNsbnQtPmNsX3NvZnRydHJ5ID0gMTsKKwkJY2xudC0+Y2xfY2hhdHR5ICAgPSAxOworCQljbG50LT5jbF9vbmVzaG90ICA9IDE7CisJCWNsbnQtPmNsX2ludHIgPSAxOworCX0KKwlyZXR1cm4gY2xudDsKK30KKworLyoKKyAqIFhEUiBlbmNvZGUvZGVjb2RlIGZ1bmN0aW9ucyBmb3IgTU9VTlQKKyAqLworc3RhdGljIGludAoreGRyX2VuY29kZV9kaXJwYXRoKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJcCA9IHhkcl9lbmNvZGVfc3RyaW5nKHAsIHBhdGgpOworCisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit4ZHJfZGVjb2RlX2Zoc3RhdHVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBtbnRfZmhzdGF0dXMgKnJlcykKK3sKKwlzdHJ1Y3QgbmZzX2ZoICpmaCA9IHJlcy0+Zmg7CisKKwlpZiAoKHJlcy0+c3RhdHVzID0gbnRvaGwoKnArKykpID09IDApIHsKKwkJZmgtPnNpemUgPSBORlMyX0ZIU0laRTsKKwkJbWVtY3B5KGZoLT5kYXRhLCBwLCBORlMyX0ZIU0laRSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit4ZHJfZGVjb2RlX2Zoc3RhdHVzMyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbW50X2Zoc3RhdHVzICpyZXMpCit7CisJc3RydWN0IG5mc19maCAqZmggPSByZXMtPmZoOworCisJaWYgKChyZXMtPnN0YXR1cyA9IG50b2hsKCpwKyspKSA9PSAwKSB7CisJCWludCBzaXplID0gbnRvaGwoKnArKyk7CisJCWlmIChzaXplIDw9IE5GUzNfRkhTSVpFKSB7CisJCQlmaC0+c2l6ZSA9IHNpemU7CisJCQltZW1jcHkoZmgtPmRhdGEsIHAsIHNpemUpOworCQl9IGVsc2UKKwkJCXJlcy0+c3RhdHVzID0gLUVCQURIQU5ETEU7CisJfQorCXJldHVybiAwOworfQorCisjZGVmaW5lIE1OVF9kaXJwYXRoX3N6CQkoMSArIDI1NikKKyNkZWZpbmUgTU5UX2Zoc3RhdHVzX3N6CQkoMSArIDgpCisKK3N0YXRpYyBzdHJ1Y3QgcnBjX3Byb2NpbmZvCW1udF9wcm9jZWR1cmVzW10gPSB7CitbTU5UUFJPQ19NTlRdID0geworCSAgLnBfcHJvYwkJPSBNTlRQUk9DX01OVCwKKwkgIC5wX2VuY29kZQkJPSAoa3hkcnByb2NfdCkgeGRyX2VuY29kZV9kaXJwYXRoLAkKKwkgIC5wX2RlY29kZQkJPSAoa3hkcnByb2NfdCkgeGRyX2RlY29kZV9maHN0YXR1cywKKwkgIC5wX2J1ZnNpegkJPSBNTlRfZGlycGF0aF9zeiA8PCAyLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbyBtbnQzX3Byb2NlZHVyZXNbXSA9IHsKK1tNT1VOVFBST0MzX01OVF0gPSB7CisJICAucF9wcm9jCQk9IE1PVU5UUFJPQzNfTU5ULAorCSAgLnBfZW5jb2RlCQk9IChreGRycHJvY190KSB4ZHJfZW5jb2RlX2RpcnBhdGgsCisJICAucF9kZWNvZGUJCT0gKGt4ZHJwcm9jX3QpIHhkcl9kZWNvZGVfZmhzdGF0dXMzLAorCSAgLnBfYnVmc2l6CQk9IE1OVF9kaXJwYXRoX3N6IDw8IDIsCisJfSwKK307CisKKworc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbgltbnRfdmVyc2lvbjEgPSB7CisJCS5udW1iZXIJCT0gMSwKKwkJLm5ycHJvY3MgCT0gMiwKKwkJLnByb2NzIAkJPSBtbnRfcHJvY2VkdXJlcworfTsKKworc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbiAgICAgICBtbnRfdmVyc2lvbjMgPSB7CisJCS5udW1iZXIJCT0gMywKKwkJLm5ycHJvY3MJPSAyLAorCQkucHJvY3MJCT0gbW50M19wcm9jZWR1cmVzCit9OworCitzdGF0aWMgc3RydWN0IHJwY192ZXJzaW9uICoJbW50X3ZlcnNpb25bXSA9IHsKKwlOVUxMLAorCSZtbnRfdmVyc2lvbjEsCisJTlVMTCwKKwkmbW50X3ZlcnNpb24zLAorfTsKKworc3RhdGljIHN0cnVjdCBycGNfc3RhdAkJbW50X3N0YXRzOworCitzdGF0aWMgc3RydWN0IHJwY19wcm9ncmFtCW1udF9wcm9ncmFtID0geworCS5uYW1lCQk9ICJtb3VudCIsCisJLm51bWJlcgkJPSBORlNfTU5UX1BST0dSQU0sCisJLm5ydmVycwkJPSBzaXplb2YobW50X3ZlcnNpb24pL3NpemVvZihtbnRfdmVyc2lvblswXSksCisJLnZlcnNpb24JPSBtbnRfdmVyc2lvbiwKKwkuc3RhdHMJCT0gJm1udF9zdGF0cywKK307CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzMnhkci5jIGIvZnMvbmZzL25mczJ4ZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTFiNjkwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL25mczJ4ZHIuYwpAQCAtMCwwICsxLDcxMSBAQAorLyoKKyAqIGxpbnV4L2ZzL25mcy9uZnMyeGRyLmMKKyAqCisgKiBYRFIgZnVuY3Rpb25zIHRvIGVuY29kZS9kZWNvZGUgTkZTIFJQQyBhcmd1bWVudHMgYW5kIHJlc3VsdHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0ICBSaWNrIFNsYWRrZXkKKyAqIENvcHlyaWdodCAoQykgMTk5NiBPbGFmIEtpcmNoCisgKiAwNCBBdWcgMTk5OCAgSW9uIEJhZHVsZXNjdSA8aW9udXRAY3MuY29sdW1iaWEuZWR1PgorICogCQlGSUZPJ3MgbmVlZCBzcGVjaWFsIGhhbmRsaW5nIGluIE5GU3YyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L25mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mczIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKworI2RlZmluZSBORlNEQkdfRkFDSUxJVFkJCU5GU0RCR19YRFIKKy8qICNkZWZpbmUgTkZTX1BBUkFOT0lBIDEgKi8KKworZXh0ZXJuIGludAkJCW5mc19zdGF0X3RvX2Vycm5vKGludCBzdGF0KTsKKworLyogTWFwcGluZyBmcm9tIE5GUyBlcnJvciBjb2RlIHRvICJlcnJubyIgZXJyb3IgY29kZS4gKi8KKyNkZWZpbmUgZXJybm9fTkZTRVJSX0lPCQlFSU8KKworLyoKKyAqIERlY2xhcmUgdGhlIHNwYWNlIHJlcXVpcmVtZW50cyBmb3IgTkZTIGFyZ3VtZW50cyBhbmQgcmVwbGllcyBhcworICogbnVtYmVyIG9mIDMyYml0LXdvcmRzCisgKi8KKyNkZWZpbmUgTkZTX2ZoYW5kbGVfc3oJCSg4KQorI2RlZmluZSBORlNfc2F0dHJfc3oJCSg4KQorI2RlZmluZSBORlNfZmlsZW5hbWVfc3oJCSgxKyhORlMyX01BWE5BTUxFTj4+MikpCisjZGVmaW5lIE5GU19wYXRoX3N6CQkoMSsoTkZTMl9NQVhQQVRITEVOPj4yKSkKKyNkZWZpbmUgTkZTX2ZhdHRyX3N6CQkoMTcpCisjZGVmaW5lIE5GU19pbmZvX3N6CQkoNSkKKyNkZWZpbmUgTkZTX2VudHJ5X3N6CQkoTkZTX2ZpbGVuYW1lX3N6KzMpCisKKyNkZWZpbmUgTkZTX2Rpcm9wYXJnc19zegkoTkZTX2ZoYW5kbGVfc3orTkZTX2ZpbGVuYW1lX3N6KQorI2RlZmluZSBORlNfc2F0dHJhcmdzX3N6CShORlNfZmhhbmRsZV9zeitORlNfc2F0dHJfc3opCisjZGVmaW5lIE5GU19yZWFkbGlua2FyZ3Nfc3oJKE5GU19maGFuZGxlX3N6KQorI2RlZmluZSBORlNfcmVhZGFyZ3Nfc3oJCShORlNfZmhhbmRsZV9zeiszKQorI2RlZmluZSBORlNfd3JpdGVhcmdzX3N6CShORlNfZmhhbmRsZV9zeis0KQorI2RlZmluZSBORlNfY3JlYXRlYXJnc19zegkoTkZTX2Rpcm9wYXJnc19zeitORlNfc2F0dHJfc3opCisjZGVmaW5lIE5GU19yZW5hbWVhcmdzX3N6CShORlNfZGlyb3BhcmdzX3N6K05GU19kaXJvcGFyZ3Nfc3opCisjZGVmaW5lIE5GU19saW5rYXJnc19zegkJKE5GU19maGFuZGxlX3N6K05GU19kaXJvcGFyZ3Nfc3opCisjZGVmaW5lIE5GU19zeW1saW5rYXJnc19zegkoTkZTX2Rpcm9wYXJnc19zeitORlNfcGF0aF9zeitORlNfc2F0dHJfc3opCisjZGVmaW5lIE5GU19yZWFkZGlyYXJnc19zegkoTkZTX2ZoYW5kbGVfc3orMikKKworI2RlZmluZSBORlNfYXR0cnN0YXRfc3oJCSgxK05GU19mYXR0cl9zeikKKyNkZWZpbmUgTkZTX2Rpcm9wcmVzX3N6CQkoMStORlNfZmhhbmRsZV9zeitORlNfZmF0dHJfc3opCisjZGVmaW5lIE5GU19yZWFkbGlua3Jlc19zegkoMikKKyNkZWZpbmUgTkZTX3JlYWRyZXNfc3oJCSgxK05GU19mYXR0cl9zeisxKQorI2RlZmluZSBORlNfd3JpdGVyZXNfc3ogICAgICAgICAoTkZTX2F0dHJzdGF0X3N6KQorI2RlZmluZSBORlNfc3RhdF9zegkJKDEpCisjZGVmaW5lIE5GU19yZWFkZGlycmVzX3N6CSgxKQorI2RlZmluZSBORlNfc3RhdGZzcmVzX3N6CSgxK05GU19pbmZvX3N6KQorCisvKgorICogQ29tbW9uIE5GUyBYRFIgZnVuY3Rpb25zIGFzIGlubGluZXMKKyAqLworc3RhdGljIGlubGluZSB1MzIgKgoreGRyX2VuY29kZV9maGFuZGxlKHUzMiAqcCwgc3RydWN0IG5mc19maCAqZmhhbmRsZSkKK3sKKwltZW1jcHkocCwgZmhhbmRsZS0+ZGF0YSwgTkZTMl9GSFNJWkUpOworCXJldHVybiBwICsgWERSX1FVQURMRU4oTkZTMl9GSFNJWkUpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiAqCit4ZHJfZGVjb2RlX2ZoYW5kbGUodTMyICpwLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlKQoreworCS8qIE5GU3YyIGhhbmRsZXMgaGF2ZSBhIGZpeGVkIGxlbmd0aCAqLworCWZoYW5kbGUtPnNpemUgPSBORlMyX0ZIU0laRTsKKwltZW1jcHkoZmhhbmRsZS0+ZGF0YSwgcCwgTkZTMl9GSFNJWkUpOworCXJldHVybiBwICsgWERSX1FVQURMRU4oTkZTMl9GSFNJWkUpOworfQorCitzdGF0aWMgaW5saW5lIHUzMioKK3hkcl9lbmNvZGVfdGltZSh1MzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCit7CisJKnArKyA9IGh0b25sKHRpbWVwLT50dl9zZWMpOworCS8qIENvbnZlcnQgbmFub3NlY29uZHMgaW50byBtaWNyb3NlY29uZHMgKi8KKwkqcCsrID0gaHRvbmwodGltZXAtPnR2X25zZWMgPyB0aW1lcC0+dHZfbnNlYyAvIDEwMDAgOiAwKTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGlubGluZSB1MzIqCit4ZHJfZW5jb2RlX2N1cnJlbnRfc2VydmVyX3RpbWUodTMyICpwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVwKQoreworCS8qCisJICogUGFzc2luZyB0aGUgaW52YWxpZCB2YWx1ZSB1c2Vjb25kcz0xMDAwMDAwIGlzIGEKKwkgKiBTdW4gY29udmVudGlvbiBmb3IgInNldCB0byBjdXJyZW50IHNlcnZlciB0aW1lIi4KKwkgKiBJdCdzIG5lZWRlZCB0byBtYWtlIHBlcm1pc3Npb25zIGNoZWNrcyBmb3IgdGhlCisJICogInRvdWNoIiBwcm9ncmFtIGFjcm9zcyB2MiBtb3VudHMgdG8gU29sYXJpcyBhbmQKKwkgKiBJcml4IGJveGVzIHdvcmsgY29ycmVjdGx5LiBTZWUgZGVzY3JpcHRpb24gb2YKKwkgKiBzYXR0ciBpbiBzZWN0aW9uIDYuMSBvZiAiTkZTIElsbHVzdHJhdGVkIiBieQorCSAqIEJyZW50IENhbGxhZ2hhbiwgQWRkaXNvbi1XZXNsZXksIElTQk4gMC0yMDEtMzI3NTAtNQorCSAqLworCSpwKysgPSBodG9ubCh0aW1lcC0+dHZfc2VjKTsKKwkqcCsrID0gaHRvbmwoMTAwMDAwMCk7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyKgoreGRyX2RlY29kZV90aW1lKHUzMiAqcCwgc3RydWN0IHRpbWVzcGVjICp0aW1lcCkKK3sKKwl0aW1lcC0+dHZfc2VjID0gbnRvaGwoKnArKyk7CisJLyogQ29udmVydCBtaWNyb3NlY29uZHMgaW50byBuYW5vc2Vjb25kcyAqLworCXRpbWVwLT50dl9uc2VjID0gbnRvaGwoKnArKykgKiAxMDAwOworCXJldHVybiBwOworfQorCitzdGF0aWMgdTMyICoKK3hkcl9kZWNvZGVfZmF0dHIodTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwl1MzIgcmRldjsKKwlmYXR0ci0+dHlwZSA9IChlbnVtIG5mc19mdHlwZSkgbnRvaGwoKnArKyk7CisJZmF0dHItPm1vZGUgPSBudG9obCgqcCsrKTsKKwlmYXR0ci0+bmxpbmsgPSBudG9obCgqcCsrKTsKKwlmYXR0ci0+dWlkID0gbnRvaGwoKnArKyk7CisJZmF0dHItPmdpZCA9IG50b2hsKCpwKyspOworCWZhdHRyLT5zaXplID0gbnRvaGwoKnArKyk7CisJZmF0dHItPmR1Lm5mczIuYmxvY2tzaXplID0gbnRvaGwoKnArKyk7CisJcmRldiA9IG50b2hsKCpwKyspOworCWZhdHRyLT5kdS5uZnMyLmJsb2NrcyA9IG50b2hsKCpwKyspOworCWZhdHRyLT5mc2lkX3UubmZzMyA9IG50b2hsKCpwKyspOworCWZhdHRyLT5maWxlaWQgPSBudG9obCgqcCsrKTsKKwlwID0geGRyX2RlY29kZV90aW1lKHAsICZmYXR0ci0+YXRpbWUpOworCXAgPSB4ZHJfZGVjb2RlX3RpbWUocCwgJmZhdHRyLT5tdGltZSk7CisJcCA9IHhkcl9kZWNvZGVfdGltZShwLCAmZmF0dHItPmN0aW1lKTsKKwlmYXR0ci0+dmFsaWQgfD0gTkZTX0FUVFJfRkFUVFI7CisJZmF0dHItPnJkZXYgPSBuZXdfZGVjb2RlX2RldihyZGV2KTsKKwlpZiAoZmF0dHItPnR5cGUgPT0gTkZDSFIgJiYgcmRldiA9PSBORlMyX0ZJRk9fREVWKSB7CisJCWZhdHRyLT50eXBlID0gTkZGSUZPOworCQlmYXR0ci0+bW9kZSA9IChmYXR0ci0+bW9kZSAmIH5TX0lGTVQpIHwgU19JRklGTzsKKwkJZmF0dHItPnJkZXYgPSAwOworCX0KKwlmYXR0ci0+dGltZXN0YW1wID0gamlmZmllczsKKwlyZXR1cm4gcDsKK30KKworI2RlZmluZSBTQVRUUihwLCBhdHRyLCBmbGFnLCBmaWVsZCkgXAorICAgICAgICAqcCsrID0gKGF0dHItPmlhX3ZhbGlkICYgZmxhZykgPyBodG9ubChhdHRyLT5maWVsZCkgOiB+KHUzMikgMAorc3RhdGljIGlubGluZSB1MzIgKgoreGRyX2VuY29kZV9zYXR0cih1MzIgKnAsIHN0cnVjdCBpYXR0ciAqYXR0cikKK3sKKwlTQVRUUihwLCBhdHRyLCBBVFRSX01PREUsIGlhX21vZGUpOworCVNBVFRSKHAsIGF0dHIsIEFUVFJfVUlELCBpYV91aWQpOworCVNBVFRSKHAsIGF0dHIsIEFUVFJfR0lELCBpYV9naWQpOworCVNBVFRSKHAsIGF0dHIsIEFUVFJfU0laRSwgaWFfc2l6ZSk7CisKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0FUSU1FX1NFVCkgeworCQlwID0geGRyX2VuY29kZV90aW1lKHAsICZhdHRyLT5pYV9hdGltZSk7CisJfSBlbHNlIGlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUUpIHsKKwkJcCA9IHhkcl9lbmNvZGVfY3VycmVudF9zZXJ2ZXJfdGltZShwLCAmYXR0ci0+aWFfYXRpbWUpOworCX0gZWxzZSB7CisJCSpwKysgPSB+KHUzMikgMDsKKwkJKnArKyA9IH4odTMyKSAwOworCX0KKworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTVRJTUVfU0VUKSB7CisJCXAgPSB4ZHJfZW5jb2RlX3RpbWUocCwgJmF0dHItPmlhX210aW1lKTsKKwl9IGVsc2UgaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NVElNRSkgeworCQlwID0geGRyX2VuY29kZV9jdXJyZW50X3NlcnZlcl90aW1lKHAsICZhdHRyLT5pYV9tdGltZSk7CisJfSBlbHNlIHsKKwkJKnArKyA9IH4odTMyKSAwOwkKKwkJKnArKyA9IH4odTMyKSAwOworCX0KKyAgCXJldHVybiBwOworfQorI3VuZGVmIFNBVFRSCisKKy8qCisgKiBORlMgZW5jb2RlIGZ1bmN0aW9ucworICovCisvKgorICogRW5jb2RlIGZpbGUgaGFuZGxlIGFyZ3VtZW50CisgKiBHRVRBVFRSLCBSRUFETElOSywgU1RBVEZTCisgKi8KK3N0YXRpYyBpbnQKK25mc194ZHJfZmhhbmRsZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX2ZoICpmaCkKK3sKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGZoKTsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFbmNvZGUgU0VUQVRUUiBhcmd1bWVudHMKKyAqLworc3RhdGljIGludAorbmZzX3hkcl9zYXR0cmFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19zYXR0cmFyZ3MgKmFyZ3MpCit7CisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CisJcCA9IHhkcl9lbmNvZGVfc2F0dHIocCwgYXJncy0+c2F0dHIpOworCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEVuY29kZSBkaXJlY3Rvcnkgb3BzIGFyZ3VtZW50CisgKiBMT09LVVAsIFJFTU9WRSwgUk1ESVIKKyAqLworc3RhdGljIGludAorbmZzX3hkcl9kaXJvcGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19kaXJvcGFyZ3MgKmFyZ3MpCit7CisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CisJcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+bmFtZSwgYXJncy0+bGVuKTsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBcmd1bWVudHMgdG8gYSBSRUFEIGNhbGwuIFNpbmNlIHdlIHJlYWQgZGF0YSBkaXJlY3RseSBpbnRvIHRoZSBwYWdlCisgKiBjYWNoZSwgd2UgYWxzbyBzZXQgdXAgdGhlIHJlcGx5IGlvdmVjIGhlcmUgc28gdGhhdCBpb3ZbMV0gcG9pbnRzCisgKiBleGFjdGx5IHRvIHRoZSBwYWdlIHdlIHdhbnQgdG8gZmV0Y2guCisgKi8KK3N0YXRpYyBpbnQKK25mc194ZHJfcmVhZGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19yZWFkYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgcnBjX2F1dGgJKmF1dGggPSByZXEtPnJxX3Rhc2stPnRrX2F1dGg7CisJdW5zaWduZWQgaW50IHJlcGxlbjsKKwl1MzIgb2Zmc2V0ID0gKHUzMilhcmdzLT5vZmZzZXQ7CisJdTMyIGNvdW50ID0gYXJncy0+Y291bnQ7CisKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKKwkqcCsrID0gaHRvbmwob2Zmc2V0KTsKKwkqcCsrID0gaHRvbmwoY291bnQpOworCSpwKysgPSBodG9ubChjb3VudCk7CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCisJLyogSW5saW5lIHRoZSBwYWdlIGFycmF5ICovCisJcmVwbGVuID0gKFJQQ19SRVBIRFJTSVpFICsgYXV0aC0+YXVfcnNsYWNrICsgTkZTX3JlYWRyZXNfc3opIDw8IDI7CisJeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCByZXBsZW4sCisJCQkgYXJncy0+cGFnZXMsIGFyZ3MtPnBnYmFzZSwgY291bnQpOworCXJldHVybiAwOworfQorCisvKgorICogRGVjb2RlIFJFQUQgcmVwbHkKKyAqLworc3RhdGljIGludAorbmZzX3hkcl9yZWFkcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzKQoreworCXN0cnVjdCBrdmVjICppb3YgPSByZXEtPnJxX3Jjdl9idWYuaGVhZDsKKwlpbnQJc3RhdHVzLCBjb3VudCwgcmVjdmQsIGhkcmxlbjsKKworCWlmICgoc3RhdHVzID0gbnRvaGwoKnArKykpKQorCQlyZXR1cm4gLW5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CisJcCA9IHhkcl9kZWNvZGVfZmF0dHIocCwgcmVzLT5mYXR0cik7CisKKwljb3VudCA9IG50b2hsKCpwKyspOworCXJlcy0+ZW9mID0gMDsKKwloZHJsZW4gPSAodTggKikgcCAtICh1OCAqKSBpb3YtPmlvdl9iYXNlOworCWlmIChpb3YtPmlvdl9sZW4gPCBoZHJsZW4pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBSRUFEIHJlcGx5IGhlYWRlciBvdmVyZmxvd2VkOiIKKwkJCQkibGVuZ3RoICVkID4gJVp1XG4iLCBoZHJsZW4sIGlvdi0+aW92X2xlbik7CisJCXJldHVybiAtZXJybm9fTkZTRVJSX0lPOworCX0gZWxzZSBpZiAoaW92LT5pb3ZfbGVuICE9IGhkcmxlbikgeworCQlkcHJpbnRrKCJORlM6IFJFQUQgaGVhZGVyIGlzIHNob3J0LiBpb3ZlYyB3aWxsIGJlIHNoaWZ0ZWQuXG4iKTsKKwkJeGRyX3NoaWZ0X2J1ZigmcmVxLT5ycV9yY3ZfYnVmLCBpb3YtPmlvdl9sZW4gLSBoZHJsZW4pOworCX0KKworCXJlY3ZkID0gcmVxLT5ycV9yY3ZfYnVmLmxlbiAtIGhkcmxlbjsKKwlpZiAoY291bnQgPiByZWN2ZCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IHNlcnZlciBjaGVhdGluZyBpbiByZWFkIHJlcGx5OiAiCisJCQkiY291bnQgJWQgPiByZWN2ZCAlZFxuIiwgY291bnQsIHJlY3ZkKTsKKwkJY291bnQgPSByZWN2ZDsKKwl9CisKKwlkcHJpbnRrKCJSUEM6ICAgICAgcmVhZHJlcyBPSyBjb3VudCAlZFxuIiwgY291bnQpOworCWlmIChjb3VudCA8IHJlcy0+Y291bnQpCisJCXJlcy0+Y291bnQgPSBjb3VudDsKKworCXJldHVybiBjb3VudDsKK30KKworCisvKgorICogV3JpdGUgYXJndW1lbnRzLiBTcGxpY2UgdGhlIGJ1ZmZlciB0byBiZSB3cml0dGVuIGludG8gdGhlIGlvdmVjLgorICovCitzdGF0aWMgaW50CituZnNfeGRyX3dyaXRlYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgeGRyX2J1ZiAqc25kYnVmID0gJnJlcS0+cnFfc25kX2J1ZjsKKwl1MzIgb2Zmc2V0ID0gKHUzMilhcmdzLT5vZmZzZXQ7CisJdTMyIGNvdW50ID0gYXJncy0+Y291bnQ7CisKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKKwkqcCsrID0gaHRvbmwob2Zmc2V0KTsKKwkqcCsrID0gaHRvbmwob2Zmc2V0KTsKKwkqcCsrID0gaHRvbmwoY291bnQpOworCSpwKysgPSBodG9ubChjb3VudCk7CisJc25kYnVmLT5sZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHNuZGJ1Zi0+aGVhZCwgcCk7CisKKwkvKiBDb3B5IHRoZSBwYWdlIGFycmF5ICovCisJeGRyX2VuY29kZV9wYWdlcyhzbmRidWYsIGFyZ3MtPnBhZ2VzLCBhcmdzLT5wZ2Jhc2UsIGNvdW50KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEVuY29kZSBjcmVhdGUgYXJndW1lbnRzCisgKiBDUkVBVEUsIE1LRElSCisgKi8KK3N0YXRpYyBpbnQKK25mc194ZHJfY3JlYXRlYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX2NyZWF0ZWFyZ3MgKmFyZ3MpCit7CisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CisJcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+bmFtZSwgYXJncy0+bGVuKTsKKwlwID0geGRyX2VuY29kZV9zYXR0cihwLCBhcmdzLT5zYXR0cik7CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCisvKgorICogRW5jb2RlIFJFTkFNRSBhcmd1bWVudHMKKyAqLworc3RhdGljIGludAorbmZzX3hkcl9yZW5hbWVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfcmVuYW1lYXJncyAqYXJncykKK3sKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZyb21maCk7CisJcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+ZnJvbW5hbWUsIGFyZ3MtPmZyb21sZW4pOworCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+dG9maCk7CisJcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+dG9uYW1lLCBhcmdzLT50b2xlbik7CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCisvKgorICogRW5jb2RlIExJTksgYXJndW1lbnRzCisgKi8KK3N0YXRpYyBpbnQKK25mc194ZHJfbGlua2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19saW5rYXJncyAqYXJncykKK3sKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZyb21maCk7CisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT50b2ZoKTsKKwlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT50b25hbWUsIGFyZ3MtPnRvbGVuKTsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFbmNvZGUgU1lNTElOSyBhcmd1bWVudHMKKyAqLworc3RhdGljIGludAorbmZzX3hkcl9zeW1saW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3N5bWxpbmthcmdzICphcmdzKQoreworCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZnJvbWZoKTsKKwlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5mcm9tbmFtZSwgYXJncy0+ZnJvbWxlbik7CisJcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+dG9wYXRoLCBhcmdzLT50b2xlbik7CisJcCA9IHhkcl9lbmNvZGVfc2F0dHIocCwgYXJncy0+c2F0dHIpOworCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEVuY29kZSBhcmd1bWVudHMgdG8gcmVhZGRpciBjYWxsCisgKi8KK3N0YXRpYyBpbnQKK25mc194ZHJfcmVhZGRpcmFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19yZWFkZGlyYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgcnBjX3Rhc2sJKnRhc2sgPSByZXEtPnJxX3Rhc2s7CisJc3RydWN0IHJwY19hdXRoCSphdXRoID0gdGFzay0+dGtfYXV0aDsKKwl1bnNpZ25lZCBpbnQgcmVwbGVuOworCXUzMiBjb3VudCA9IGFyZ3MtPmNvdW50OworCisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CisJKnArKyA9IGh0b25sKGFyZ3MtPmNvb2tpZSk7CisJKnArKyA9IGh0b25sKGNvdW50KTsgLyogc2VlIGFib3ZlICovCisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCisJLyogSW5saW5lIHRoZSBwYWdlIGFycmF5ICovCisJcmVwbGVuID0gKFJQQ19SRVBIRFJTSVpFICsgYXV0aC0+YXVfcnNsYWNrICsgTkZTX3JlYWRkaXJyZXNfc3opIDw8IDI7CisJeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCByZXBsZW4sIGFyZ3MtPnBhZ2VzLCAwLCBjb3VudCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWNvZGUgdGhlIHJlc3VsdCBvZiBhIHJlYWRkaXIgY2FsbC4KKyAqIFdlJ3JlIG5vdCByZWFsbHkgZGVjb2RpbmcgYW55bW9yZSwgd2UganVzdCBsZWF2ZSB0aGUgYnVmZmVyIHVudG91Y2hlZAorICogYW5kIG9ubHkgY2hlY2sgdGhhdCBpdCBpcyBzeW50YWN0aWNhbGx5IGNvcnJlY3QuCisgKiBUaGUgcmVhbCBkZWNvZGluZyBoYXBwZW5zIGluIG5mc19kZWNvZGVfZW50cnkgYmVsb3csIGNhbGxlZCBkaXJlY3RseQorICogZnJvbSBuZnNfcmVhZGRpciBmb3IgZWFjaCBlbnRyeS4KKyAqLworc3RhdGljIGludAorbmZzX3hkcl9yZWFkZGlycmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHZvaWQgKmR1bW15KQoreworCXN0cnVjdCB4ZHJfYnVmICpyY3ZidWYgPSAmcmVxLT5ycV9yY3ZfYnVmOworCXN0cnVjdCBrdmVjICppb3YgPSByY3ZidWYtPmhlYWQ7CisJc3RydWN0IHBhZ2UgKipwYWdlOworCWludCBoZHJsZW4sIHJlY3ZkOworCWludCBzdGF0dXMsIG5yOworCXVuc2lnbmVkIGludCBsZW4sIHBnbGVuOworCXUzMiAqZW5kLCAqZW50cnksICprYWRkcjsKKworCWlmICgoc3RhdHVzID0gbnRvaGwoKnArKykpKQorCQlyZXR1cm4gLW5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CisKKwloZHJsZW4gPSAodTggKikgcCAtICh1OCAqKSBpb3YtPmlvdl9iYXNlOworCWlmIChpb3YtPmlvdl9sZW4gPCBoZHJsZW4pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBSRUFERElSIHJlcGx5IGhlYWRlciBvdmVyZmxvd2VkOiIKKwkJCQkibGVuZ3RoICVkID4gJVp1XG4iLCBoZHJsZW4sIGlvdi0+aW92X2xlbik7CisJCXJldHVybiAtZXJybm9fTkZTRVJSX0lPOworCX0gZWxzZSBpZiAoaW92LT5pb3ZfbGVuICE9IGhkcmxlbikgeworCQlkcHJpbnRrKCJORlM6IFJFQURESVIgaGVhZGVyIGlzIHNob3J0LiBpb3ZlYyB3aWxsIGJlIHNoaWZ0ZWQuXG4iKTsKKwkJeGRyX3NoaWZ0X2J1ZihyY3ZidWYsIGlvdi0+aW92X2xlbiAtIGhkcmxlbik7CisJfQorCisJcGdsZW4gPSByY3ZidWYtPnBhZ2VfbGVuOworCXJlY3ZkID0gcmN2YnVmLT5sZW4gLSBoZHJsZW47CisJaWYgKHBnbGVuID4gcmVjdmQpCisJCXBnbGVuID0gcmVjdmQ7CisJcGFnZSA9IHJjdmJ1Zi0+cGFnZXM7CisJa2FkZHIgPSBwID0gKHUzMiAqKWttYXBfYXRvbWljKCpwYWdlLCBLTV9VU0VSMCk7CisJZW5kID0gKHUzMiAqKSgoY2hhciAqKXAgKyBwZ2xlbik7CisJZW50cnkgPSBwOworCWZvciAobnIgPSAwOyAqcCsrOyBucisrKSB7CisJCWlmIChwICsgMiA+IGVuZCkKKwkJCWdvdG8gc2hvcnRfcGt0OworCQlwKys7IC8qIGZpbGVpZCAqLworCQlsZW4gPSBudG9obCgqcCsrKTsKKwkJcCArPSBYRFJfUVVBRExFTihsZW4pICsgMTsJLyogbmFtZSBwbHVzIGNvb2tpZSAqLworCQlpZiAobGVuID4gTkZTMl9NQVhOQU1MRU4pIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUzogZ2lhbnQgZmlsZW5hbWUgaW4gcmVhZGRpciAobGVuIDB4JXgpIVxuIiwKKwkJCQkJCWxlbik7CisJCQlnb3RvIGVycl91bm1hcDsKKwkJfQorCQlpZiAocCArIDIgPiBlbmQpCisJCQlnb3RvIHNob3J0X3BrdDsKKwkJZW50cnkgPSBwOworCX0KKwlpZiAoIW5yICYmIChlbnRyeVswXSAhPSAwIHx8IGVudHJ5WzFdID09IDApKQorCQlnb3RvIHNob3J0X3BrdDsKKyBvdXQ6CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCXJldHVybiBucjsKKyBzaG9ydF9wa3Q6CisJZW50cnlbMF0gPSBlbnRyeVsxXSA9IDA7CisJLyogdHJ1bmNhdGUgbGlzdGluZyA/ICovCisJaWYgKCFucikgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5GUzogcmVhZGRpciByZXBseSB0cnVuY2F0ZWQhXG4iKTsKKwkJZW50cnlbMV0gPSAxOworCX0KKwlnb3RvIG91dDsKK2Vycl91bm1hcDoKKwluciA9IC1lcnJub19ORlNFUlJfSU87CisJZ290byBvdXQ7Cit9CisKK3UzMiAqCituZnNfZGVjb2RlX2RpcmVudCh1MzIgKnAsIHN0cnVjdCBuZnNfZW50cnkgKmVudHJ5LCBpbnQgcGx1cykKK3sKKwlpZiAoISpwKyspIHsKKwkJaWYgKCEqcCkKKwkJCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOworCQllbnRyeS0+ZW9mID0gMTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVCQURDT09LSUUpOworCX0KKworCWVudHJ5LT5pbm8JICA9IG50b2hsKCpwKyspOworCWVudHJ5LT5sZW4JICA9IG50b2hsKCpwKyspOworCWVudHJ5LT5uYW1lCSAgPSAoY29uc3QgY2hhciAqKSBwOworCXAJCSArPSBYRFJfUVVBRExFTihlbnRyeS0+bGVuKTsKKwllbnRyeS0+cHJldl9jb29raWUJICA9IGVudHJ5LT5jb29raWU7CisJZW50cnktPmNvb2tpZQkgID0gbnRvaGwoKnArKyk7CisJZW50cnktPmVvZgkgID0gIXBbMF0gJiYgcFsxXTsKKworCXJldHVybiBwOworfQorCisvKgorICogTkZTIFhEUiBkZWNvZGUgZnVuY3Rpb25zCisgKi8KKy8qCisgKiBEZWNvZGUgc2ltcGxlIHN0YXR1cyByZXBseQorICovCitzdGF0aWMgaW50CituZnNfeGRyX3N0YXQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgdm9pZCAqZHVtbXkpCit7CisJaW50CXN0YXR1czsKKworCWlmICgoc3RhdHVzID0gbnRvaGwoKnArKykpICE9IDApCisJCXN0YXR1cyA9IC1uZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEZWNvZGUgYXR0cnN0YXQgcmVwbHkKKyAqIEdFVEFUVFIsIFNFVEFUVFIsIFdSSVRFCisgKi8KK3N0YXRpYyBpbnQKK25mc194ZHJfYXR0cnN0YXQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJaW50CXN0YXR1czsKKworCWlmICgoc3RhdHVzID0gbnRvaGwoKnArKykpKQorCQlyZXR1cm4gLW5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CisJeGRyX2RlY29kZV9mYXR0cihwLCBmYXR0cik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWNvZGUgZGlyb3ByZXMgcmVwbHkKKyAqIExPT0tVUCwgQ1JFQVRFLCBNS0RJUgorICovCitzdGF0aWMgaW50CituZnNfeGRyX2Rpcm9wcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfZGlyb3BvayAqcmVzKQoreworCWludAlzdGF0dXM7CisKKwlpZiAoKHN0YXR1cyA9IG50b2hsKCpwKyspKSkKKwkJcmV0dXJuIC1uZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworCXAgPSB4ZHJfZGVjb2RlX2ZoYW5kbGUocCwgcmVzLT5maCk7CisJeGRyX2RlY29kZV9mYXR0cihwLCByZXMtPmZhdHRyKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEVuY29kZSBSRUFETElOSyBhcmdzCisgKi8KK3N0YXRpYyBpbnQKK25mc194ZHJfcmVhZGxpbmthcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfcmVhZGxpbmthcmdzICphcmdzKQoreworCXN0cnVjdCBycGNfYXV0aCAqYXV0aCA9IHJlcS0+cnFfdGFzay0+dGtfYXV0aDsKKwl1bnNpZ25lZCBpbnQgcmVwbGVuOworCisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCisJLyogSW5saW5lIHRoZSBwYWdlIGFycmF5ICovCisJcmVwbGVuID0gKFJQQ19SRVBIRFJTSVpFICsgYXV0aC0+YXVfcnNsYWNrICsgTkZTX3JlYWRsaW5rcmVzX3N6KSA8PCAyOworCXhkcl9pbmxpbmVfcGFnZXMoJnJlcS0+cnFfcmN2X2J1ZiwgcmVwbGVuLCBhcmdzLT5wYWdlcywgYXJncy0+cGdiYXNlLCBhcmdzLT5wZ2xlbik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWNvZGUgUkVBRExJTksgcmVwbHkKKyAqLworc3RhdGljIGludAorbmZzX3hkcl9yZWFkbGlua3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCB2b2lkICpkdW1teSkKK3sKKwlzdHJ1Y3QgeGRyX2J1ZiAqcmN2YnVmID0gJnJlcS0+cnFfcmN2X2J1ZjsKKwlzdHJ1Y3Qga3ZlYyAqaW92ID0gcmN2YnVmLT5oZWFkOworCWludCBoZHJsZW4sIGxlbiwgcmVjdmQ7CisJY2hhcgkqa2FkZHI7CisJaW50CXN0YXR1czsKKworCWlmICgoc3RhdHVzID0gbnRvaGwoKnArKykpKQorCQlyZXR1cm4gLW5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CisJLyogQ29udmVydCBsZW5ndGggb2Ygc3ltbGluayAqLworCWxlbiA9IG50b2hsKCpwKyspOworCWlmIChsZW4gPj0gcmN2YnVmLT5wYWdlX2xlbiB8fCBsZW4gPD0gMCkgeworCQlkcHJpbnRrKEtFUk5fV0FSTklORyAibmZzOiBzZXJ2ZXIgcmV0dXJuZWQgZ2lhbnQgc3ltbGluayFcbiIpOworCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwl9CisJaGRybGVuID0gKHU4ICopIHAgLSAodTggKikgaW92LT5pb3ZfYmFzZTsKKwlpZiAoaW92LT5pb3ZfbGVuIDwgaGRybGVuKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUzogUkVBRExJTksgcmVwbHkgaGVhZGVyIG92ZXJmbG93ZWQ6IgorCQkJCSJsZW5ndGggJWQgPiAlWnVcbiIsIGhkcmxlbiwgaW92LT5pb3ZfbGVuKTsKKwkJcmV0dXJuIC1lcnJub19ORlNFUlJfSU87CisJfSBlbHNlIGlmIChpb3YtPmlvdl9sZW4gIT0gaGRybGVuKSB7CisJCWRwcmludGsoIk5GUzogUkVBRExJTksgaGVhZGVyIGlzIHNob3J0LiBpb3ZlYyB3aWxsIGJlIHNoaWZ0ZWQuXG4iKTsKKwkJeGRyX3NoaWZ0X2J1ZihyY3ZidWYsIGlvdi0+aW92X2xlbiAtIGhkcmxlbik7CisJfQorCXJlY3ZkID0gcmVxLT5ycV9yY3ZfYnVmLmxlbiAtIGhkcmxlbjsKKwlpZiAocmVjdmQgPCBsZW4pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBzZXJ2ZXIgY2hlYXRpbmcgaW4gcmVhZGxpbmsgcmVwbHk6ICIKKwkJCQkiY291bnQgJXUgPiByZWN2ZCAldVxuIiwgbGVuLCByZWN2ZCk7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIE5VTEwgdGVybWluYXRlIHRoZSBzdHJpbmcgd2UgZ290ICovCisJa2FkZHIgPSAoY2hhciAqKWttYXBfYXRvbWljKHJjdmJ1Zi0+cGFnZXNbMF0sIEtNX1VTRVIwKTsKKwlrYWRkcltsZW4rcmN2YnVmLT5wYWdlX2Jhc2VdID0gJ1wwJzsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWNvZGUgV1JJVEUgcmVwbHkKKyAqLworc3RhdGljIGludAorbmZzX3hkcl93cml0ZXJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXMpCit7CisJcmVzLT52ZXJmLT5jb21taXR0ZWQgPSBORlNfRklMRV9TWU5DOworCXJldHVybiBuZnNfeGRyX2F0dHJzdGF0KHJlcSwgcCwgcmVzLT5mYXR0cik7Cit9CisKKy8qCisgKiBEZWNvZGUgU1RBVEZTIHJlcGx5CisgKi8KK3N0YXRpYyBpbnQKK25mc194ZHJfc3RhdGZzcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMyX2Zzc3RhdCAqcmVzKQoreworCWludAlzdGF0dXM7CisKKwlpZiAoKHN0YXR1cyA9IG50b2hsKCpwKyspKSkKKwkJcmV0dXJuIC1uZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworCisJcmVzLT50c2l6ZSAgPSBudG9obCgqcCsrKTsKKwlyZXMtPmJzaXplICA9IG50b2hsKCpwKyspOworCXJlcy0+YmxvY2tzID0gbnRvaGwoKnArKyk7CisJcmVzLT5iZnJlZSAgPSBudG9obCgqcCsrKTsKKwlyZXMtPmJhdmFpbCA9IG50b2hsKCpwKyspOworCXJldHVybiAwOworfQorCisvKgorICogV2UgbmVlZCB0byB0cmFuc2xhdGUgYmV0d2VlbiBuZnMgc3RhdHVzIHJldHVybiB2YWx1ZXMgYW5kCisgKiB0aGUgbG9jYWwgZXJybm8gdmFsdWVzIHdoaWNoIG1heSBub3QgYmUgdGhlIHNhbWUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWludCBzdGF0OworCWludCBlcnJubzsKK30gbmZzX2VycnRibFtdID0geworCXsgTkZTX09LLAkJMAkJfSwKKwl7IE5GU0VSUl9QRVJNLAkJRVBFUk0JCX0sCisJeyBORlNFUlJfTk9FTlQsCQlFTk9FTlQJCX0sCisJeyBORlNFUlJfSU8sCQllcnJub19ORlNFUlJfSU8JfSwKKwl7IE5GU0VSUl9OWElPLAkJRU5YSU8JCX0sCisvKgl7IE5GU0VSUl9FQUdBSU4sCUVBR0FJTgkJfSwgKi8KKwl7IE5GU0VSUl9BQ0NFUywJCUVBQ0NFUwkJfSwKKwl7IE5GU0VSUl9FWElTVCwJCUVFWElTVAkJfSwKKwl7IE5GU0VSUl9YREVWLAkJRVhERVYJCX0sCisJeyBORlNFUlJfTk9ERVYsCQlFTk9ERVYJCX0sCisJeyBORlNFUlJfTk9URElSLAlFTk9URElSCQl9LAorCXsgTkZTRVJSX0lTRElSLAkJRUlTRElSCQl9LAorCXsgTkZTRVJSX0lOVkFMLAkJRUlOVkFMCQl9LAorCXsgTkZTRVJSX0ZCSUcsCQlFRkJJRwkJfSwKKwl7IE5GU0VSUl9OT1NQQywJCUVOT1NQQwkJfSwKKwl7IE5GU0VSUl9ST0ZTLAkJRVJPRlMJCX0sCisJeyBORlNFUlJfTUxJTkssCQlFTUxJTksJCX0sCisJeyBORlNFUlJfTkFNRVRPT0xPTkcsCUVOQU1FVE9PTE9ORwl9LAorCXsgTkZTRVJSX05PVEVNUFRZLAlFTk9URU1QVFkJfSwKKwl7IE5GU0VSUl9EUVVPVCwJCUVEUVVPVAkJfSwKKwl7IE5GU0VSUl9TVEFMRSwJCUVTVEFMRQkJfSwKKwl7IE5GU0VSUl9SRU1PVEUsCUVSRU1PVEUJCX0sCisjaWZkZWYgRVdGTFVTSAorCXsgTkZTRVJSX1dGTFVTSCwJRVdGTFVTSAkJfSwKKyNlbmRpZgorCXsgTkZTRVJSX0JBREhBTkRMRSwJRUJBREhBTkRMRQl9LAorCXsgTkZTRVJSX05PVF9TWU5DLAlFTk9UU1lOQwl9LAorCXsgTkZTRVJSX0JBRF9DT09LSUUsCUVCQURDT09LSUUJfSwKKwl7IE5GU0VSUl9OT1RTVVBQLAlFTk9UU1VQUAl9LAorCXsgTkZTRVJSX1RPT1NNQUxMLAlFVE9PU01BTEwJfSwKKwl7IE5GU0VSUl9TRVJWRVJGQVVMVCwJRVNFUlZFUkZBVUxUCX0sCisJeyBORlNFUlJfQkFEVFlQRSwJRUJBRFRZUEUJfSwKKwl7IE5GU0VSUl9KVUtFQk9YLAlFSlVLRUJPWAl9LAorCXsgLTEsCQkJRUlPCQl9Cit9OworCisvKgorICogQ29udmVydCBhbiBORlMgZXJyb3IgY29kZSB0byBhIGxvY2FsIG9uZS4KKyAqIFRoaXMgb25lIGlzIHVzZWQgam9pbnRseSBieSBORlN2MiBhbmQgTkZTdjMuCisgKi8KK2ludAorbmZzX3N0YXRfdG9fZXJybm8oaW50IHN0YXQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBuZnNfZXJydGJsW2ldLnN0YXQgIT0gLTE7IGkrKykgeworCQlpZiAobmZzX2VycnRibFtpXS5zdGF0ID09IHN0YXQpCisJCQlyZXR1cm4gbmZzX2VycnRibFtpXS5lcnJubzsKKwl9CisJcHJpbnRrKEtFUk5fRVJSICJuZnNfc3RhdF90b19lcnJubzogYmFkIG5mcyBzdGF0dXMgcmV0dXJuIHZhbHVlOiAlZFxuIiwgc3RhdCk7CisJcmV0dXJuIG5mc19lcnJ0YmxbaV0uZXJybm87Cit9CisKKyNpZm5kZWYgTUFYCisjIGRlZmluZSBNQVgoYSwgYikJKCgoYSkgPiAoYikpPyAoYSkgOiAoYikpCisjZW5kaWYKKworI2RlZmluZSBQUk9DKHByb2MsIGFyZ3R5cGUsIHJlc3R5cGUsIHRpbWVyKQkJCQlcCitbTkZTUFJPQ18jI3Byb2NdID0gewkJCQkJCQlcCisJLnBfcHJvYwkgICAgPSAgTkZTUFJPQ18jI3Byb2MsCQkJCQlcCisJLnBfZW5jb2RlICAgPSAgKGt4ZHJwcm9jX3QpIG5mc194ZHJfIyNhcmd0eXBlLAkJCVwKKwkucF9kZWNvZGUgICA9ICAoa3hkcnByb2NfdCkgbmZzX3hkcl8jI3Jlc3R5cGUsCQkJXAorCS5wX2J1ZnNpeiAgID0gIE1BWChORlNfIyNhcmd0eXBlIyNfc3osTkZTXyMjcmVzdHlwZSMjX3N6KSA8PCAyLAlcCisJLnBfdGltZXIgICAgPSAgdGltZXIJCQkJCQlcCisJfQorc3RydWN0IHJwY19wcm9jaW5mbwluZnNfcHJvY2VkdXJlc1tdID0geworICAgIFBST0MoR0VUQVRUUiwJZmhhbmRsZSwJYXR0cnN0YXQsIDEpLAorICAgIFBST0MoU0VUQVRUUiwJc2F0dHJhcmdzLAlhdHRyc3RhdCwgMCksCisgICAgUFJPQyhMT09LVVAsCWRpcm9wYXJncywJZGlyb3ByZXMsIDIpLAorICAgIFBST0MoUkVBRExJTkssCXJlYWRsaW5rYXJncywJcmVhZGxpbmtyZXMsIDMpLAorICAgIFBST0MoUkVBRCwJCXJlYWRhcmdzLAlyZWFkcmVzLCAzKSwKKyAgICBQUk9DKFdSSVRFLAkJd3JpdGVhcmdzLAl3cml0ZXJlcywgNCksCisgICAgUFJPQyhDUkVBVEUsCWNyZWF0ZWFyZ3MsCWRpcm9wcmVzLCAwKSwKKyAgICBQUk9DKFJFTU9WRSwJZGlyb3BhcmdzLAlzdGF0LCAwKSwKKyAgICBQUk9DKFJFTkFNRSwJcmVuYW1lYXJncywJc3RhdCwgMCksCisgICAgUFJPQyhMSU5LLAkJbGlua2FyZ3MsCXN0YXQsIDApLAorICAgIFBST0MoU1lNTElOSywJc3ltbGlua2FyZ3MsCXN0YXQsIDApLAorICAgIFBST0MoTUtESVIsCQljcmVhdGVhcmdzLAlkaXJvcHJlcywgMCksCisgICAgUFJPQyhSTURJUiwJCWRpcm9wYXJncywJc3RhdCwgMCksCisgICAgUFJPQyhSRUFERElSLAlyZWFkZGlyYXJncywJcmVhZGRpcnJlcywgMyksCisgICAgUFJPQyhTVEFURlMsCWZoYW5kbGUsCXN0YXRmc3JlcywgMCksCit9OworCitzdHJ1Y3QgcnBjX3ZlcnNpb24JCW5mc192ZXJzaW9uMiA9IHsKKwkubnVtYmVyCQkJPSAyLAorCS5ucnByb2NzCQk9IHNpemVvZihuZnNfcHJvY2VkdXJlcykvc2l6ZW9mKG5mc19wcm9jZWR1cmVzWzBdKSwKKwkucHJvY3MJCQk9IG5mc19wcm9jZWR1cmVzCit9OwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczNwcm9jLmMgYi9mcy9uZnMvbmZzM3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODc4NDk0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL25mczNwcm9jLmMKQEAgLTAsMCArMSw4NTkgQEAKKy8qCisgKiAgbGludXgvZnMvbmZzL25mczNwcm9jLmMKKyAqCisgKiAgQ2xpZW50LXNpZGUgTkZTdjMgcHJvY2VkdXJlcyBzdHVicy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LCBPbGFmIEtpcmNoCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9iaW5kLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworI2RlZmluZSBORlNEQkdfRkFDSUxJVFkJCU5GU0RCR19QUk9DCisKK2V4dGVybiBzdHJ1Y3QgcnBjX3Byb2NpbmZvIG5mczNfcHJvY2VkdXJlc1tdOworCisvKiBBIHdyYXBwZXIgdG8gaGFuZGxlIHRoZSBFSlVLRUJPWCBlcnJvciBtZXNzYWdlICovCitzdGF0aWMgaW50CituZnMzX3JwY193cmFwcGVyKHN0cnVjdCBycGNfY2xudCAqY2xudCwgc3RydWN0IHJwY19tZXNzYWdlICptc2csIGludCBmbGFncykKK3sKKwlzaWdzZXRfdCBvbGRzZXQ7CisJaW50IHJlczsKKwlycGNfY2xudF9zaWdtYXNrKGNsbnQsICZvbGRzZXQpOworCWRvIHsKKwkJcmVzID0gcnBjX2NhbGxfc3luYyhjbG50LCBtc2csIGZsYWdzKTsKKwkJaWYgKHJlcyAhPSAtRUpVS0VCT1gpCisJCQlicmVhazsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChORlNfSlVLRUJPWF9SRVRSWV9USU1FKTsKKwkJcmVzID0gLUVSRVNUQVJUU1lTOworCX0gd2hpbGUgKCFzaWduYWxsZWQoKSk7CisJcnBjX2NsbnRfc2lndW5tYXNrKGNsbnQsICZvbGRzZXQpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnMzX3JwY19jYWxsX3dyYXBwZXIoc3RydWN0IHJwY19jbG50ICpjbG50LCB1MzIgcHJvYywgdm9pZCAqYXJncCwgdm9pZCAqcmVzcCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYwk9ICZuZnMzX3Byb2NlZHVyZXNbcHJvY10sCisJCS5ycGNfYXJncAk9IGFyZ3AsCisJCS5ycGNfcmVzcAk9IHJlc3AsCisJfTsKKwlyZXR1cm4gbmZzM19ycGNfd3JhcHBlcihjbG50LCAmbXNnLCBmbGFncyk7Cit9CisKKyNkZWZpbmUgcnBjX2NhbGwoY2xudCwgcHJvYywgYXJncCwgcmVzcCwgZmxhZ3MpIFwKKwkJbmZzM19ycGNfY2FsbF93cmFwcGVyKGNsbnQsIHByb2MsIGFyZ3AsIHJlc3AsIGZsYWdzKQorI2RlZmluZSBycGNfY2FsbF9zeW5jKGNsbnQsIG1zZywgZmxhZ3MpIFwKKwkJbmZzM19ycGNfd3JhcHBlcihjbG50LCBtc2csIGZsYWdzKQorCitzdGF0aWMgaW50CituZnMzX2FzeW5jX2hhbmRsZV9qdWtlYm94KHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlpZiAodGFzay0+dGtfc3RhdHVzICE9IC1FSlVLRUJPWCkKKwkJcmV0dXJuIDA7CisJdGFzay0+dGtfc3RhdHVzID0gMDsKKwlycGNfcmVzdGFydF9jYWxsKHRhc2spOworCXJwY19kZWxheSh0YXNrLCBORlNfSlVLRUJPWF9SRVRSWV9USU1FKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEJhcmUtYm9uZXMgYWNjZXNzIHRvIGdldGF0dHI6IHRoaXMgaXMgZm9yIG5mc19yZWFkX3N1cGVyLgorICovCitzdGF0aWMgaW50CituZnMzX3Byb2NfZ2V0X3Jvb3Qoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwKKwkJICAgc3RydWN0IG5mc19mc2luZm8gKmluZm8pCit7CisJaW50CXN0YXR1czsKKworCWRwcmludGsoIiVzOiBjYWxsICBmc2luZm9cbiIsIF9fRlVOQ1RJT05fXyk7CisJaW5mby0+ZmF0dHItPnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbChzZXJ2ZXItPmNsaWVudF9zeXMsIE5GUzNQUk9DX0ZTSU5GTywgZmhhbmRsZSwgaW5mbywgMCk7CisJZHByaW50aygiJXM6IHJlcGx5IGZzaW5mbzogJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlpZiAoIShpbmZvLT5mYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUikpIHsKKwkJc3RhdHVzID0gcnBjX2NhbGwoc2VydmVyLT5jbGllbnRfc3lzLCBORlMzUFJPQ19HRVRBVFRSLCBmaGFuZGxlLCBpbmZvLT5mYXR0ciwgMCk7CisJCWRwcmludGsoIiVzOiByZXBseSBnZXRhdHRyOiAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogT25lIGZ1bmN0aW9uIGZvciBlYWNoIHByb2NlZHVyZSBpbiB0aGUgTkZTIHByb3RvY29sLgorICovCitzdGF0aWMgaW50CituZnMzX3Byb2NfZ2V0YXR0cihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQlzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlpbnQJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIGdldGF0dHJcbiIpOworCWZhdHRyLT52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGwoc2VydmVyLT5jbGllbnQsIE5GUzNQUk9DX0dFVEFUVFIsCisJCQkgIGZoYW5kbGUsIGZhdHRyLCAwKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgZ2V0YXR0cjogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmZzM19wcm9jX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0ciwKKwkJCXN0cnVjdCBpYXR0ciAqc2F0dHIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgbmZzM19zYXR0cmFyZ3MJYXJnID0geworCQkuZmgJCT0gTkZTX0ZIKGlub2RlKSwKKwkJLnNhdHRyCQk9IHNhdHRyLAorCX07CisJaW50CXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICBzZXRhdHRyXG4iKTsKKwlmYXR0ci0+dmFsaWQgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsKE5GU19DTElFTlQoaW5vZGUpLCBORlMzUFJPQ19TRVRBVFRSLCAmYXJnLCBmYXR0ciwgMCk7CisJZHByaW50aygiTkZTIHJlcGx5IHNldGF0dHI6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mczNfcHJvY19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBxc3RyICpuYW1lLAorCQkgc3RydWN0IG5mc19maCAqZmhhbmRsZSwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJc3RydWN0IG5mc19mYXR0cglkaXJfYXR0cjsKKwlzdHJ1Y3QgbmZzM19kaXJvcGFyZ3MJYXJnID0geworCQkuZmgJCT0gTkZTX0ZIKGRpciksCisJCS5uYW1lCQk9IG5hbWUtPm5hbWUsCisJCS5sZW4JCT0gbmFtZS0+bGVuCisJfTsKKwlzdHJ1Y3QgbmZzM19kaXJvcHJlcwlyZXMgPSB7CisJCS5kaXJfYXR0cgk9ICZkaXJfYXR0ciwKKwkJLmZoCQk9IGZoYW5kbGUsCisJCS5mYXR0cgkJPSBmYXR0cgorCX07CisJaW50CQkJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIGxvb2t1cCAlc1xuIiwgbmFtZS0+bmFtZSk7CisJZGlyX2F0dHIudmFsaWQgPSAwOworCWZhdHRyLT52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGwoTkZTX0NMSUVOVChkaXIpLCBORlMzUFJPQ19MT09LVVAsICZhcmcsICZyZXMsIDApOworCWlmIChzdGF0dXMgPj0gMCAmJiAhKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSKSkKKwkJc3RhdHVzID0gcnBjX2NhbGwoTkZTX0NMSUVOVChkaXIpLCBORlMzUFJPQ19HRVRBVFRSLAorCQkJIGZoYW5kbGUsIGZhdHRyLCAwKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgbG9va3VwOiAlZFxuIiwgc3RhdHVzKTsKKwlpZiAoc3RhdHVzID49IDApCisJCXN0YXR1cyA9IG5mc19yZWZyZXNoX2lub2RlKGRpciwgJmRpcl9hdHRyKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mczNfcHJvY19hY2Nlc3Moc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5mc19hY2Nlc3NfZW50cnkgKmVudHJ5KQoreworCXN0cnVjdCBuZnNfZmF0dHIJZmF0dHI7CisJc3RydWN0IG5mczNfYWNjZXNzYXJncwlhcmcgPSB7CisJCS5maAkJPSBORlNfRkgoaW5vZGUpLAorCX07CisJc3RydWN0IG5mczNfYWNjZXNzcmVzCXJlcyA9IHsKKwkJLmZhdHRyCQk9ICZmYXR0ciwKKwl9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYwk9ICZuZnMzX3Byb2NlZHVyZXNbTkZTM1BST0NfQUNDRVNTXSwKKwkJLnJwY19hcmdwCT0gJmFyZywKKwkJLnJwY19yZXNwCT0gJnJlcywKKwkJLnJwY19jcmVkCT0gZW50cnktPmNyZWQKKwl9OworCWludCBtb2RlID0gZW50cnktPm1hc2s7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICBhY2Nlc3NcbiIpOworCWZhdHRyLnZhbGlkID0gMDsKKworCWlmIChtb2RlICYgTUFZX1JFQUQpCisJCWFyZy5hY2Nlc3MgfD0gTkZTM19BQ0NFU1NfUkVBRDsKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQlpZiAobW9kZSAmIE1BWV9XUklURSkKKwkJCWFyZy5hY2Nlc3MgfD0gTkZTM19BQ0NFU1NfTU9ESUZZIHwgTkZTM19BQ0NFU1NfRVhURU5EIHwgTkZTM19BQ0NFU1NfREVMRVRFOworCQlpZiAobW9kZSAmIE1BWV9FWEVDKQorCQkJYXJnLmFjY2VzcyB8PSBORlMzX0FDQ0VTU19MT09LVVA7CisJfSBlbHNlIHsKKwkJaWYgKG1vZGUgJiBNQVlfV1JJVEUpCisJCQlhcmcuYWNjZXNzIHw9IE5GUzNfQUNDRVNTX01PRElGWSB8IE5GUzNfQUNDRVNTX0VYVEVORDsKKwkJaWYgKG1vZGUgJiBNQVlfRVhFQykKKwkJCWFyZy5hY2Nlc3MgfD0gTkZTM19BQ0NFU1NfRVhFQ1VURTsKKwl9CisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKGlub2RlKSwgJm1zZywgMCk7CisJbmZzX3JlZnJlc2hfaW5vZGUoaW5vZGUsICZmYXR0cik7CisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCWVudHJ5LT5tYXNrID0gMDsKKwkJaWYgKHJlcy5hY2Nlc3MgJiBORlMzX0FDQ0VTU19SRUFEKQorCQkJZW50cnktPm1hc2sgfD0gTUFZX1JFQUQ7CisJCWlmIChyZXMuYWNjZXNzICYgKE5GUzNfQUNDRVNTX01PRElGWSB8IE5GUzNfQUNDRVNTX0VYVEVORCB8IE5GUzNfQUNDRVNTX0RFTEVURSkpCisJCQllbnRyeS0+bWFzayB8PSBNQVlfV1JJVEU7CisJCWlmIChyZXMuYWNjZXNzICYgKE5GUzNfQUNDRVNTX0xPT0tVUHxORlMzX0FDQ0VTU19FWEVDVVRFKSkKKwkJCWVudHJ5LT5tYXNrIHw9IE1BWV9FWEVDOworCX0KKwlkcHJpbnRrKCJORlMgcmVwbHkgYWNjZXNzOiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mczNfcHJvY19yZWFkbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJdW5zaWduZWQgaW50IHBnYmFzZSwgdW5zaWduZWQgaW50IHBnbGVuKQoreworCXN0cnVjdCBuZnNfZmF0dHIJZmF0dHI7CisJc3RydWN0IG5mczNfcmVhZGxpbmthcmdzIGFyZ3MgPSB7CisJCS5maAkJPSBORlNfRkgoaW5vZGUpLAorCQkucGdiYXNlCQk9IHBnYmFzZSwKKwkJLnBnbGVuCQk9IHBnbGVuLAorCQkucGFnZXMJCT0gJnBhZ2UKKwl9OworCWludAkJCXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICByZWFkbGlua1xuIik7CisJZmF0dHIudmFsaWQgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsKE5GU19DTElFTlQoaW5vZGUpLCBORlMzUFJPQ19SRUFETElOSywKKwkJCSAgJmFyZ3MsICZmYXR0ciwgMCk7CisJbmZzX3JlZnJlc2hfaW5vZGUoaW5vZGUsICZmYXR0cik7CisJZHByaW50aygiTkZTIHJlcGx5IHJlYWRsaW5rOiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mczNfcHJvY19yZWFkKHN0cnVjdCBuZnNfcmVhZF9kYXRhICpyZGF0YSkKK3sKKwlpbnQJCQlmbGFncyA9IHJkYXRhLT5mbGFnczsKKwlzdHJ1Y3QgaW5vZGUgKgkJaW5vZGUgPSByZGF0YS0+aW5vZGU7CisJc3RydWN0IG5mc19mYXR0ciAqCWZhdHRyID0gcmRhdGEtPnJlcy5mYXR0cjsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UJbXNnID0geworCQkucnBjX3Byb2MJPSAmbmZzM19wcm9jZWR1cmVzW05GUzNQUk9DX1JFQURdLAorCQkucnBjX2FyZ3AJPSAmcmRhdGEtPmFyZ3MsCisJCS5ycGNfcmVzcAk9ICZyZGF0YS0+cmVzLAorCQkucnBjX2NyZWQJPSByZGF0YS0+Y3JlZCwKKwl9OworCWludAkJCXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICByZWFkICVkIEAgJUxkXG4iLCByZGF0YS0+YXJncy5jb3VudCwKKwkJCShsb25nIGxvbmcpIHJkYXRhLT5hcmdzLm9mZnNldCk7CisJZmF0dHItPnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKE5GU19DTElFTlQoaW5vZGUpLCAmbXNnLCBmbGFncyk7CisJaWYgKHN0YXR1cyA+PSAwKQorCQluZnNfcmVmcmVzaF9pbm9kZShpbm9kZSwgZmF0dHIpOworCWRwcmludGsoIk5GUyByZXBseSByZWFkOiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mczNfcHJvY193cml0ZShzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKndkYXRhKQoreworCWludAkJCXJwY2ZsYWdzID0gd2RhdGEtPmZsYWdzOworCXN0cnVjdCBpbm9kZSAqCQlpbm9kZSA9IHdkYXRhLT5pbm9kZTsKKwlzdHJ1Y3QgbmZzX2ZhdHRyICoJZmF0dHIgPSB3ZGF0YS0+cmVzLmZhdHRyOworCXN0cnVjdCBycGNfbWVzc2FnZQltc2cgPSB7CisJCS5ycGNfcHJvYwk9ICZuZnMzX3Byb2NlZHVyZXNbTkZTM1BST0NfV1JJVEVdLAorCQkucnBjX2FyZ3AJPSAmd2RhdGEtPmFyZ3MsCisJCS5ycGNfcmVzcAk9ICZ3ZGF0YS0+cmVzLAorCQkucnBjX2NyZWQJPSB3ZGF0YS0+Y3JlZCwKKwl9OworCWludAkJCXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICB3cml0ZSAlZCBAICVMZFxuIiwgd2RhdGEtPmFyZ3MuY291bnQsCisJCQkobG9uZyBsb25nKSB3ZGF0YS0+YXJncy5vZmZzZXQpOworCWZhdHRyLT52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKGlub2RlKSwgJm1zZywgcnBjZmxhZ3MpOworCWlmIChzdGF0dXMgPj0gMCkKKwkJbmZzX3JlZnJlc2hfaW5vZGUoaW5vZGUsIGZhdHRyKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgd3JpdGU6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXMgPCAwPyBzdGF0dXMgOiB3ZGF0YS0+cmVzLmNvdW50OworfQorCitzdGF0aWMgaW50IG5mczNfcHJvY19jb21taXQoc3RydWN0IG5mc193cml0ZV9kYXRhICpjZGF0YSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKgkJaW5vZGUgPSBjZGF0YS0+aW5vZGU7CisJc3RydWN0IG5mc19mYXR0ciAqCWZhdHRyID0gY2RhdGEtPnJlcy5mYXR0cjsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UJbXNnID0geworCQkucnBjX3Byb2MJPSAmbmZzM19wcm9jZWR1cmVzW05GUzNQUk9DX0NPTU1JVF0sCisJCS5ycGNfYXJncAk9ICZjZGF0YS0+YXJncywKKwkJLnJwY19yZXNwCT0gJmNkYXRhLT5yZXMsCisJCS5ycGNfY3JlZAk9IGNkYXRhLT5jcmVkLAorCX07CisJaW50CQkJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIGNvbW1pdCAlZCBAICVMZFxuIiwgY2RhdGEtPmFyZ3MuY291bnQsCisJCQkobG9uZyBsb25nKSBjZGF0YS0+YXJncy5vZmZzZXQpOworCWZhdHRyLT52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKGlub2RlKSwgJm1zZywgMCk7CisJaWYgKHN0YXR1cyA+PSAwKQorCQluZnNfcmVmcmVzaF9pbm9kZShpbm9kZSwgZmF0dHIpOworCWRwcmludGsoIk5GUyByZXBseSBjb21taXQ6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBDcmVhdGUgYSByZWd1bGFyIGZpbGUuCisgKiBGb3Igbm93LCB3ZSBkb24ndCBpbXBsZW1lbnQgT19FWENMLgorICovCitzdGF0aWMgaW50CituZnMzX3Byb2NfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqc2F0dHIsCisJCSBpbnQgZmxhZ3MpCit7CisJc3RydWN0IG5mc19maAkJZmhhbmRsZTsKKwlzdHJ1Y3QgbmZzX2ZhdHRyCWZhdHRyOworCXN0cnVjdCBuZnNfZmF0dHIJZGlyX2F0dHI7CisJc3RydWN0IG5mczNfY3JlYXRlYXJncwlhcmcgPSB7CisJCS5maAkJPSBORlNfRkgoZGlyKSwKKwkJLm5hbWUJCT0gZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJLmxlbgkJPSBkZW50cnktPmRfbmFtZS5sZW4sCisJCS5zYXR0cgkJPSBzYXR0ciwKKwl9OworCXN0cnVjdCBuZnMzX2Rpcm9wcmVzCXJlcyA9IHsKKwkJLmRpcl9hdHRyCT0gJmRpcl9hdHRyLAorCQkuZmgJCT0gJmZoYW5kbGUsCisJCS5mYXR0cgkJPSAmZmF0dHIKKwl9OworCWludAkJCXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICBjcmVhdGUgJXNcbiIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWFyZy5jcmVhdGVtb2RlID0gTkZTM19DUkVBVEVfVU5DSEVDS0VEOworCWlmIChmbGFncyAmIE9fRVhDTCkgeworCQlhcmcuY3JlYXRlbW9kZSAgPSBORlMzX0NSRUFURV9FWENMVVNJVkU7CisJCWFyZy52ZXJpZmllclswXSA9IGppZmZpZXM7CisJCWFyZy52ZXJpZmllclsxXSA9IGN1cnJlbnQtPnBpZDsKKwl9CisKK2FnYWluOgorCWRpcl9hdHRyLnZhbGlkID0gMDsKKwlmYXR0ci52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGwoTkZTX0NMSUVOVChkaXIpLCBORlMzUFJPQ19DUkVBVEUsICZhcmcsICZyZXMsIDApOworCW5mc19yZWZyZXNoX2lub2RlKGRpciwgJmRpcl9hdHRyKTsKKworCS8qIElmIHRoZSBzZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBleGNsdXNpdmUgY3JlYXRpb24gc2VtYW50aWNzLAorCSAqIHRyeSBhZ2FpbiB3aXRoIHNpbXBsZSAnZ3VhcmRlZCcgbW9kZS4gKi8KKwlpZiAoc3RhdHVzID09IE5GU0VSUl9OT1RTVVBQKSB7CisJCXN3aXRjaCAoYXJnLmNyZWF0ZW1vZGUpIHsKKwkJCWNhc2UgTkZTM19DUkVBVEVfRVhDTFVTSVZFOgorCQkJCWFyZy5jcmVhdGVtb2RlID0gTkZTM19DUkVBVEVfR1VBUkRFRDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBORlMzX0NSRUFURV9HVUFSREVEOgorCQkJCWFyZy5jcmVhdGVtb2RlID0gTkZTM19DUkVBVEVfVU5DSEVDS0VEOworCQkJCWJyZWFrOworCisJCQljYXNlIE5GUzNfQ1JFQVRFX1VOQ0hFQ0tFRDoKKwkJCQlnb3RvIG91dDsKKwkJfQorCQlnb3RvIGFnYWluOworCX0KKworCWlmIChzdGF0dXMgPT0gMCkKKwkJc3RhdHVzID0gbmZzX2luc3RhbnRpYXRlKGRlbnRyeSwgJmZoYW5kbGUsICZmYXR0cik7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlnb3RvIG91dDsKKworCS8qIFdoZW4gd2UgY3JlYXRlZCB0aGUgZmlsZSB3aXRoIGV4Y2x1c2l2ZSBzZW1hbnRpY3MsIG1ha2UKKwkgKiBzdXJlIHdlIHNldCB0aGUgYXR0cmlidXRlcyBhZnRlcndhcmRzLiAqLworCWlmIChhcmcuY3JlYXRlbW9kZSA9PSBORlMzX0NSRUFURV9FWENMVVNJVkUpIHsKKwkJZHByaW50aygiTkZTIGNhbGwgIHNldGF0dHIgKHBvc3QtY3JlYXRlKVxuIik7CisKKwkJaWYgKCEoc2F0dHItPmlhX3ZhbGlkICYgQVRUUl9BVElNRV9TRVQpKQorCQkJc2F0dHItPmlhX3ZhbGlkIHw9IEFUVFJfQVRJTUU7CisJCWlmICghKHNhdHRyLT5pYV92YWxpZCAmIEFUVFJfTVRJTUVfU0VUKSkKKwkJCXNhdHRyLT5pYV92YWxpZCB8PSBBVFRSX01USU1FOworCisJCS8qIE5vdGU6IHdlIGNvdWxkIHVzZSBhIGd1YXJkZWQgc2V0YXR0ciBoZXJlLCBidXQgSSdtCisJCSAqIG5vdCBzdXJlIHRoaXMgYnV5cyB1cyBhbnl0aGluZyAoYW5kIEknZCBoYXZlCisJCSAqIHRvIHJldmFtcCB0aGUgTkZTdjMgWERSIGNvZGUpICovCisJCXN0YXR1cyA9IG5mczNfcHJvY19zZXRhdHRyKGRlbnRyeSwgJmZhdHRyLCBzYXR0cik7CisJCW5mc19yZWZyZXNoX2lub2RlKGRlbnRyeS0+ZF9pbm9kZSwgJmZhdHRyKTsKKwkJZHByaW50aygiTkZTIHJlcGx5IHNldGF0dHIgKHBvc3QtY3JlYXRlKTogJWRcbiIsIHN0YXR1cyk7CisJfQorb3V0OgorCWRwcmludGsoIk5GUyByZXBseSBjcmVhdGU6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mczNfcHJvY19yZW1vdmUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBxc3RyICpuYW1lKQoreworCXN0cnVjdCBuZnNfZmF0dHIJZGlyX2F0dHI7CisJc3RydWN0IG5mczNfZGlyb3BhcmdzCWFyZyA9IHsKKwkJLmZoCQk9IE5GU19GSChkaXIpLAorCQkubmFtZQkJPSBuYW1lLT5uYW1lLAorCQkubGVuCQk9IG5hbWUtPmxlbgorCX07CisJc3RydWN0IHJwY19tZXNzYWdlCW1zZyA9IHsKKwkJLnJwY19wcm9jCT0gJm5mczNfcHJvY2VkdXJlc1tORlMzUFJPQ19SRU1PVkVdLAorCQkucnBjX2FyZ3AJPSAmYXJnLAorCQkucnBjX3Jlc3AJPSAmZGlyX2F0dHIsCisJfTsKKwlpbnQJCQlzdGF0dXM7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgcmVtb3ZlICVzXG4iLCBuYW1lLT5uYW1lKTsKKwlkaXJfYXR0ci52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKGRpciksICZtc2csIDApOworCW5mc19yZWZyZXNoX2lub2RlKGRpciwgJmRpcl9hdHRyKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgcmVtb3ZlOiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CituZnMzX3Byb2NfdW5saW5rX3NldHVwKHN0cnVjdCBycGNfbWVzc2FnZSAqbXNnLCBzdHJ1Y3QgZGVudHJ5ICpkaXIsIHN0cnVjdCBxc3RyICpuYW1lKQoreworCXN0cnVjdCB1bmxpbmt4ZHIgeworCQlzdHJ1Y3QgbmZzM19kaXJvcGFyZ3MgYXJnOworCQlzdHJ1Y3QgbmZzX2ZhdHRyIHJlczsKKwl9ICpwdHI7CisKKwlwdHIgPSAoc3RydWN0IHVubGlua3hkciAqKWttYWxsb2Moc2l6ZW9mKCpwdHIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB0cikKKwkJcmV0dXJuIC1FTk9NRU07CisJcHRyLT5hcmcuZmggPSBORlNfRkgoZGlyLT5kX2lub2RlKTsKKwlwdHItPmFyZy5uYW1lID0gbmFtZS0+bmFtZTsKKwlwdHItPmFyZy5sZW4gPSBuYW1lLT5sZW47CisJcHRyLT5yZXMudmFsaWQgPSAwOworCW1zZy0+cnBjX3Byb2MgPSAmbmZzM19wcm9jZWR1cmVzW05GUzNQUk9DX1JFTU9WRV07CisJbXNnLT5ycGNfYXJncCA9ICZwdHItPmFyZzsKKwltc2ctPnJwY19yZXNwID0gJnB0ci0+cmVzOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CituZnMzX3Byb2NfdW5saW5rX2RvbmUoc3RydWN0IGRlbnRyeSAqZGlyLCBzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IHJwY19tZXNzYWdlICptc2cgPSAmdGFzay0+dGtfbXNnOworCXN0cnVjdCBuZnNfZmF0dHIJKmRpcl9hdHRyOworCisJaWYgKG5mczNfYXN5bmNfaGFuZGxlX2p1a2Vib3godGFzaykpCisJCXJldHVybiAxOworCWlmIChtc2ctPnJwY19hcmdwKSB7CisJCWRpcl9hdHRyID0gKHN0cnVjdCBuZnNfZmF0dHIqKW1zZy0+cnBjX3Jlc3A7CisJCW5mc19yZWZyZXNoX2lub2RlKGRpci0+ZF9pbm9kZSwgZGlyX2F0dHIpOworCQlrZnJlZShtc2ctPnJwY19hcmdwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25mczNfcHJvY19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgcXN0ciAqb2xkX25hbWUsCisJCSBzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsIHN0cnVjdCBxc3RyICpuZXdfbmFtZSkKK3sKKwlzdHJ1Y3QgbmZzX2ZhdHRyCW9sZF9kaXJfYXR0ciwgbmV3X2Rpcl9hdHRyOworCXN0cnVjdCBuZnMzX3JlbmFtZWFyZ3MJYXJnID0geworCQkuZnJvbWZoCQk9IE5GU19GSChvbGRfZGlyKSwKKwkJLmZyb21uYW1lCT0gb2xkX25hbWUtPm5hbWUsCisJCS5mcm9tbGVuCT0gb2xkX25hbWUtPmxlbiwKKwkJLnRvZmgJCT0gTkZTX0ZIKG5ld19kaXIpLAorCQkudG9uYW1lCQk9IG5ld19uYW1lLT5uYW1lLAorCQkudG9sZW4JCT0gbmV3X25hbWUtPmxlbgorCX07CisJc3RydWN0IG5mczNfcmVuYW1lcmVzCXJlcyA9IHsKKwkJLmZyb21hdHRyCT0gJm9sZF9kaXJfYXR0ciwKKwkJLnRvYXR0cgkJPSAmbmV3X2Rpcl9hdHRyCisJfTsKKwlpbnQJCQlzdGF0dXM7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgcmVuYW1lICVzIC0+ICVzXG4iLCBvbGRfbmFtZS0+bmFtZSwgbmV3X25hbWUtPm5hbWUpOworCW9sZF9kaXJfYXR0ci52YWxpZCA9IDA7CisJbmV3X2Rpcl9hdHRyLnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbChORlNfQ0xJRU5UKG9sZF9kaXIpLCBORlMzUFJPQ19SRU5BTUUsICZhcmcsICZyZXMsIDApOworCW5mc19yZWZyZXNoX2lub2RlKG9sZF9kaXIsICZvbGRfZGlyX2F0dHIpOworCW5mc19yZWZyZXNoX2lub2RlKG5ld19kaXIsICZuZXdfZGlyX2F0dHIpOworCWRwcmludGsoIk5GUyByZXBseSByZW5hbWU6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mczNfcHJvY19saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmZzX2ZhdHRyCWRpcl9hdHRyLCBmYXR0cjsKKwlzdHJ1Y3QgbmZzM19saW5rYXJncwlhcmcgPSB7CisJCS5mcm9tZmgJCT0gTkZTX0ZIKGlub2RlKSwKKwkJLnRvZmgJCT0gTkZTX0ZIKGRpciksCisJCS50b25hbWUJCT0gbmFtZS0+bmFtZSwKKwkJLnRvbGVuCQk9IG5hbWUtPmxlbgorCX07CisJc3RydWN0IG5mczNfbGlua3JlcwlyZXMgPSB7CisJCS5kaXJfYXR0cgk9ICZkaXJfYXR0ciwKKwkJLmZhdHRyCQk9ICZmYXR0cgorCX07CisJaW50CQkJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIGxpbmsgJXNcbiIsIG5hbWUtPm5hbWUpOworCWRpcl9hdHRyLnZhbGlkID0gMDsKKwlmYXR0ci52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGwoTkZTX0NMSUVOVChpbm9kZSksIE5GUzNQUk9DX0xJTkssICZhcmcsICZyZXMsIDApOworCW5mc19yZWZyZXNoX2lub2RlKGRpciwgJmRpcl9hdHRyKTsKKwluZnNfcmVmcmVzaF9pbm9kZShpbm9kZSwgJmZhdHRyKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgbGluazogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmZzM19wcm9jX3N5bWxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBxc3RyICpuYW1lLCBzdHJ1Y3QgcXN0ciAqcGF0aCwKKwkJICBzdHJ1Y3QgaWF0dHIgKnNhdHRyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQkgIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCXN0cnVjdCBuZnNfZmF0dHIJZGlyX2F0dHI7CisJc3RydWN0IG5mczNfc3ltbGlua2FyZ3MJYXJnID0geworCQkuZnJvbWZoCQk9IE5GU19GSChkaXIpLAorCQkuZnJvbW5hbWUJPSBuYW1lLT5uYW1lLAorCQkuZnJvbWxlbgk9IG5hbWUtPmxlbiwKKwkJLnRvcGF0aAkJPSBwYXRoLT5uYW1lLAorCQkudG9sZW4JCT0gcGF0aC0+bGVuLAorCQkuc2F0dHIJCT0gc2F0dHIKKwl9OworCXN0cnVjdCBuZnMzX2Rpcm9wcmVzCXJlcyA9IHsKKwkJLmRpcl9hdHRyCT0gJmRpcl9hdHRyLAorCQkuZmgJCT0gZmhhbmRsZSwKKwkJLmZhdHRyCQk9IGZhdHRyCisJfTsKKwlpbnQJCQlzdGF0dXM7CisKKwlpZiAocGF0aC0+bGVuID4gTkZTM19NQVhQQVRITEVOKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwlkcHJpbnRrKCJORlMgY2FsbCAgc3ltbGluayAlcyAtPiAlc1xuIiwgbmFtZS0+bmFtZSwgcGF0aC0+bmFtZSk7CisJZGlyX2F0dHIudmFsaWQgPSAwOworCWZhdHRyLT52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGwoTkZTX0NMSUVOVChkaXIpLCBORlMzUFJPQ19TWU1MSU5LLCAmYXJnLCAmcmVzLCAwKTsKKwluZnNfcmVmcmVzaF9pbm9kZShkaXIsICZkaXJfYXR0cik7CisJZHByaW50aygiTkZTIHJlcGx5IHN5bWxpbms6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mczNfcHJvY19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKnNhdHRyKQoreworCXN0cnVjdCBuZnNfZmggZmhhbmRsZTsKKwlzdHJ1Y3QgbmZzX2ZhdHRyIGZhdHRyLCBkaXJfYXR0cjsKKwlzdHJ1Y3QgbmZzM19ta2RpcmFyZ3MJYXJnID0geworCQkuZmgJCT0gTkZTX0ZIKGRpciksCisJCS5uYW1lCQk9IGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCS5sZW4JCT0gZGVudHJ5LT5kX25hbWUubGVuLAorCQkuc2F0dHIJCT0gc2F0dHIKKwl9OworCXN0cnVjdCBuZnMzX2Rpcm9wcmVzCXJlcyA9IHsKKwkJLmRpcl9hdHRyCT0gJmRpcl9hdHRyLAorCQkuZmgJCT0gJmZoYW5kbGUsCisJCS5mYXR0cgkJPSAmZmF0dHIKKwl9OworCWludAkJCXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICBta2RpciAlc1xuIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJZGlyX2F0dHIudmFsaWQgPSAwOworCWZhdHRyLnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbChORlNfQ0xJRU5UKGRpciksIE5GUzNQUk9DX01LRElSLCAmYXJnLCAmcmVzLCAwKTsKKwluZnNfcmVmcmVzaF9pbm9kZShkaXIsICZkaXJfYXR0cik7CisJaWYgKHN0YXR1cyA9PSAwKQorCQlzdGF0dXMgPSBuZnNfaW5zdGFudGlhdGUoZGVudHJ5LCAmZmhhbmRsZSwgJmZhdHRyKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgbWtkaXI6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mczNfcHJvY19ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKm5hbWUpCit7CisJc3RydWN0IG5mc19mYXR0cglkaXJfYXR0cjsKKwlzdHJ1Y3QgbmZzM19kaXJvcGFyZ3MJYXJnID0geworCQkuZmgJCT0gTkZTX0ZIKGRpciksCisJCS5uYW1lCQk9IG5hbWUtPm5hbWUsCisJCS5sZW4JCT0gbmFtZS0+bGVuCisJfTsKKwlpbnQJCQlzdGF0dXM7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgcm1kaXIgJXNcbiIsIG5hbWUtPm5hbWUpOworCWRpcl9hdHRyLnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbChORlNfQ0xJRU5UKGRpciksIE5GUzNQUk9DX1JNRElSLCAmYXJnLCAmZGlyX2F0dHIsIDApOworCW5mc19yZWZyZXNoX2lub2RlKGRpciwgJmRpcl9hdHRyKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgcm1kaXI6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBUaGUgUkVBRERJUiBpbXBsZW1lbnRhdGlvbiBpcyBzb21ld2hhdCBoYWNraXNoIC0gd2UgcGFzcyB0aGUgdXNlciBidWZmZXIKKyAqIHRvIHRoZSBlbmNvZGUgZnVuY3Rpb24sIHdoaWNoIGluc3RhbGxzIGl0IGluIHRoZSByZWNlaXZlIGlvdmVjLgorICogVGhlIGRlY29kZSBmdW5jdGlvbiBpdHNlbGYgZG9lc24ndCBwZXJmb3JtIGFueSBkZWNvZGluZywgaXQganVzdCBtYWtlcworICogc3VyZSB0aGUgcmVwbHkgaXMgc3ludGFjdGljYWxseSBjb3JyZWN0LgorICoKKyAqIEFsc28gbm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gaGFuZGxlcyBib3RoIHBsYWluIHJlYWRkaXIgYW5kCisgKiByZWFkZGlycGx1cy4KKyAqLworc3RhdGljIGludAorbmZzM19wcm9jX3JlYWRkaXIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsCisJCSAgdTY0IGNvb2tpZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBjb3VudCwgaW50IHBsdXMpCit7CisJc3RydWN0IGlub2RlCQkqZGlyID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBuZnNfZmF0dHIJZGlyX2F0dHI7CisJdTMyCQkJKnZlcmYgPSBORlNfQ09PS0lFVkVSRihkaXIpOworCXN0cnVjdCBuZnMzX3JlYWRkaXJhcmdzCWFyZyA9IHsKKwkJLmZoCQk9IE5GU19GSChkaXIpLAorCQkuY29va2llCQk9IGNvb2tpZSwKKwkJLnZlcmYJCT0ge3ZlcmZbMF0sIHZlcmZbMV19LAorCQkucGx1cwkJPSBwbHVzLAorCQkuY291bnQJCT0gY291bnQsCisJCS5wYWdlcwkJPSAmcGFnZQorCX07CisJc3RydWN0IG5mczNfcmVhZGRpcnJlcwlyZXMgPSB7CisJCS5kaXJfYXR0cgk9ICZkaXJfYXR0ciwKKwkJLnZlcmYJCT0gdmVyZiwKKwkJLnBsdXMJCT0gcGx1cworCX07CisJc3RydWN0IHJwY19tZXNzYWdlCW1zZyA9IHsKKwkJLnJwY19wcm9jCT0gJm5mczNfcHJvY2VkdXJlc1tORlMzUFJPQ19SRUFERElSXSwKKwkJLnJwY19hcmdwCT0gJmFyZywKKwkJLnJwY19yZXNwCT0gJnJlcywKKwkJLnJwY19jcmVkCT0gY3JlZAorCX07CisJaW50CQkJc3RhdHVzOworCisJbG9ja19rZXJuZWwoKTsKKworCWlmIChwbHVzKQorCQltc2cucnBjX3Byb2MgPSAmbmZzM19wcm9jZWR1cmVzW05GUzNQUk9DX1JFQURESVJQTFVTXTsKKworCWRwcmludGsoIk5GUyBjYWxsICByZWFkZGlyJXMgJWRcbiIsCisJCQlwbHVzPyAicGx1cyIgOiAiIiwgKHVuc2lnbmVkIGludCkgY29va2llKTsKKworCWRpcl9hdHRyLnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKE5GU19DTElFTlQoZGlyKSwgJm1zZywgMCk7CisJbmZzX3JlZnJlc2hfaW5vZGUoZGlyLCAmZGlyX2F0dHIpOworCWRwcmludGsoIk5GUyByZXBseSByZWFkZGlyOiAlZFxuIiwgc3RhdHVzKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmZzM19wcm9jX21rbm9kKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqc2F0dHIsCisJCWRldl90IHJkZXYpCit7CisJc3RydWN0IG5mc19maCBmaDsKKwlzdHJ1Y3QgbmZzX2ZhdHRyIGZhdHRyLCBkaXJfYXR0cjsKKwlzdHJ1Y3QgbmZzM19ta25vZGFyZ3MJYXJnID0geworCQkuZmgJCT0gTkZTX0ZIKGRpciksCisJCS5uYW1lCQk9IGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCS5sZW4JCT0gZGVudHJ5LT5kX25hbWUubGVuLAorCQkuc2F0dHIJCT0gc2F0dHIsCisJCS5yZGV2CQk9IHJkZXYKKwl9OworCXN0cnVjdCBuZnMzX2Rpcm9wcmVzCXJlcyA9IHsKKwkJLmRpcl9hdHRyCT0gJmRpcl9hdHRyLAorCQkuZmgJCT0gJmZoLAorCQkuZmF0dHIJCT0gJmZhdHRyCisJfTsKKwlpbnQgc3RhdHVzOworCisJc3dpdGNoIChzYXR0ci0+aWFfbW9kZSAmIFNfSUZNVCkgeworCWNhc2UgU19JRkJMSzoJYXJnLnR5cGUgPSBORjNCTEs7ICBicmVhazsKKwljYXNlIFNfSUZDSFI6CWFyZy50eXBlID0gTkYzQ0hSOyAgYnJlYWs7CisJY2FzZSBTX0lGSUZPOglhcmcudHlwZSA9IE5GM0ZJRk87IGJyZWFrOworCWNhc2UgU19JRlNPQ0s6CWFyZy50eXBlID0gTkYzU09DSzsgYnJlYWs7CisJZGVmYXVsdDoJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZHByaW50aygiTkZTIGNhbGwgIG1rbm9kICVzICV1OiV1XG4iLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJTUFKT1IocmRldiksIE1JTk9SKHJkZXYpKTsKKwlkaXJfYXR0ci52YWxpZCA9IDA7CisJZmF0dHIudmFsaWQgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsKE5GU19DTElFTlQoZGlyKSwgTkZTM1BST0NfTUtOT0QsICZhcmcsICZyZXMsIDApOworCW5mc19yZWZyZXNoX2lub2RlKGRpciwgJmRpcl9hdHRyKTsKKwlpZiAoc3RhdHVzID09IDApCisJCXN0YXR1cyA9IG5mc19pbnN0YW50aWF0ZShkZW50cnksICZmaCwgJmZhdHRyKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgbWtub2Q6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mczNfcHJvY19zdGF0ZnMoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwKKwkJIHN0cnVjdCBuZnNfZnNzdGF0ICpzdGF0KQoreworCWludAlzdGF0dXM7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgZnNzdGF0XG4iKTsKKwlzdGF0LT5mYXR0ci0+dmFsaWQgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsKHNlcnZlci0+Y2xpZW50LCBORlMzUFJPQ19GU1NUQVQsIGZoYW5kbGUsIHN0YXQsIDApOworCWRwcmludGsoIk5GUyByZXBseSBzdGF0ZnM6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mczNfcHJvY19mc2luZm8oc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwKKwkJIHN0cnVjdCBuZnNfZnNpbmZvICppbmZvKQoreworCWludAlzdGF0dXM7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgZnNpbmZvXG4iKTsKKwlpbmZvLT5mYXR0ci0+dmFsaWQgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsKHNlcnZlci0+Y2xpZW50X3N5cywgTkZTM1BST0NfRlNJTkZPLCBmaGFuZGxlLCBpbmZvLCAwKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgZnNpbmZvOiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CituZnMzX3Byb2NfcGF0aGNvbmYoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwKKwkJICAgc3RydWN0IG5mc19wYXRoY29uZiAqaW5mbykKK3sKKwlpbnQJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIHBhdGhjb25mXG4iKTsKKwlpbmZvLT5mYXR0ci0+dmFsaWQgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsKHNlcnZlci0+Y2xpZW50LCBORlMzUFJPQ19QQVRIQ09ORiwgZmhhbmRsZSwgaW5mbywgMCk7CisJZHByaW50aygiTkZTIHJlcGx5IHBhdGhjb25mOiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitleHRlcm4gdTMyICpuZnMzX2RlY29kZV9kaXJlbnQodTMyICosIHN0cnVjdCBuZnNfZW50cnkgKiwgaW50KTsKKworc3RhdGljIHZvaWQKK25mczNfcmVhZF9kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKmRhdGEgPSAoc3RydWN0IG5mc193cml0ZV9kYXRhICopIHRhc2stPnRrX2NhbGxkYXRhOworCisJaWYgKG5mczNfYXN5bmNfaGFuZGxlX2p1a2Vib3godGFzaykpCisJCXJldHVybjsKKwkvKiBDYWxsIGJhY2sgY29tbW9uIE5GUyByZWFkcGFnZSBwcm9jZXNzaW5nICovCisJaWYgKHRhc2stPnRrX3N0YXR1cyA+PSAwKQorCQluZnNfcmVmcmVzaF9pbm9kZShkYXRhLT5pbm9kZSwgJmRhdGEtPmZhdHRyKTsKKwluZnNfcmVhZHBhZ2VfcmVzdWx0KHRhc2spOworfQorCitzdGF0aWMgdm9pZAorbmZzM19wcm9jX3JlYWRfc2V0dXAoc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHJwY190YXNrCQkqdGFzayA9ICZkYXRhLT50YXNrOworCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gZGF0YS0+aW5vZGU7CisJaW50CQkJZmxhZ3M7CisJc3RydWN0IHJwY19tZXNzYWdlCW1zZyA9IHsKKwkJLnJwY19wcm9jCT0gJm5mczNfcHJvY2VkdXJlc1tORlMzUFJPQ19SRUFEXSwKKwkJLnJwY19hcmdwCT0gJmRhdGEtPmFyZ3MsCisJCS5ycGNfcmVzcAk9ICZkYXRhLT5yZXMsCisJCS5ycGNfY3JlZAk9IGRhdGEtPmNyZWQsCisJfTsKKworCS8qIE4uQi4gRG8gd2UgbmVlZCB0byB0ZXN0PyBOZXZlciBjYWxsZWQgZm9yIHN3YXBmaWxlIGlub2RlICovCisJZmxhZ3MgPSBSUENfVEFTS19BU1lOQyB8IChJU19TV0FQRklMRShpbm9kZSk/IE5GU19SUENfU1dBUEZMQUdTIDogMCk7CisKKwkvKiBGaW5hbGl6ZSB0aGUgdGFzay4gKi8KKwlycGNfaW5pdF90YXNrKHRhc2ssIE5GU19DTElFTlQoaW5vZGUpLCBuZnMzX3JlYWRfZG9uZSwgZmxhZ3MpOworCXJwY19jYWxsX3NldHVwKHRhc2ssICZtc2csIDApOworfQorCitzdGF0aWMgdm9pZAorbmZzM193cml0ZV9kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKmRhdGE7CisKKwlpZiAobmZzM19hc3luY19oYW5kbGVfanVrZWJveCh0YXNrKSkKKwkJcmV0dXJuOworCWRhdGEgPSAoc3RydWN0IG5mc193cml0ZV9kYXRhICopdGFzay0+dGtfY2FsbGRhdGE7CisJaWYgKHRhc2stPnRrX3N0YXR1cyA+PSAwKQorCQluZnNfcmVmcmVzaF9pbm9kZShkYXRhLT5pbm9kZSwgZGF0YS0+cmVzLmZhdHRyKTsKKwluZnNfd3JpdGViYWNrX2RvbmUodGFzayk7Cit9CisKK3N0YXRpYyB2b2lkCituZnMzX3Byb2Nfd3JpdGVfc2V0dXAoc3RydWN0IG5mc193cml0ZV9kYXRhICpkYXRhLCBpbnQgaG93KQoreworCXN0cnVjdCBycGNfdGFzawkJKnRhc2sgPSAmZGF0YS0+dGFzazsKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IGRhdGEtPmlub2RlOworCWludAkJCXN0YWJsZTsKKwlpbnQJCQlmbGFnczsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UJbXNnID0geworCQkucnBjX3Byb2MJPSAmbmZzM19wcm9jZWR1cmVzW05GUzNQUk9DX1dSSVRFXSwKKwkJLnJwY19hcmdwCT0gJmRhdGEtPmFyZ3MsCisJCS5ycGNfcmVzcAk9ICZkYXRhLT5yZXMsCisJCS5ycGNfY3JlZAk9IGRhdGEtPmNyZWQsCisJfTsKKworCWlmIChob3cgJiBGTFVTSF9TVEFCTEUpIHsKKwkJaWYgKCFORlNfSShpbm9kZSktPm5jb21taXQpCisJCQlzdGFibGUgPSBORlNfRklMRV9TWU5DOworCQllbHNlCisJCQlzdGFibGUgPSBORlNfREFUQV9TWU5DOworCX0gZWxzZQorCQlzdGFibGUgPSBORlNfVU5TVEFCTEU7CisJZGF0YS0+YXJncy5zdGFibGUgPSBzdGFibGU7CisKKwkvKiBTZXQgdGhlIGluaXRpYWwgZmxhZ3MgZm9yIHRoZSB0YXNrLiAgKi8KKwlmbGFncyA9IChob3cgJiBGTFVTSF9TWU5DKSA/IDAgOiBSUENfVEFTS19BU1lOQzsKKworCS8qIEZpbmFsaXplIHRoZSB0YXNrLiAqLworCXJwY19pbml0X3Rhc2sodGFzaywgTkZTX0NMSUVOVChpbm9kZSksIG5mczNfd3JpdGVfZG9uZSwgZmxhZ3MpOworCXJwY19jYWxsX3NldHVwKHRhc2ssICZtc2csIDApOworfQorCitzdGF0aWMgdm9pZAorbmZzM19jb21taXRfZG9uZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IG5mc193cml0ZV9kYXRhICpkYXRhOworCisJaWYgKG5mczNfYXN5bmNfaGFuZGxlX2p1a2Vib3godGFzaykpCisJCXJldHVybjsKKwlkYXRhID0gKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqKXRhc2stPnRrX2NhbGxkYXRhOworCWlmICh0YXNrLT50a19zdGF0dXMgPj0gMCkKKwkJbmZzX3JlZnJlc2hfaW5vZGUoZGF0YS0+aW5vZGUsIGRhdGEtPnJlcy5mYXR0cik7CisJbmZzX2NvbW1pdF9kb25lKHRhc2spOworfQorCitzdGF0aWMgdm9pZAorbmZzM19wcm9jX2NvbW1pdF9zZXR1cChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKmRhdGEsIGludCBob3cpCit7CisJc3RydWN0IHJwY190YXNrCQkqdGFzayA9ICZkYXRhLT50YXNrOworCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gZGF0YS0+aW5vZGU7CisJaW50CQkJZmxhZ3M7CisJc3RydWN0IHJwY19tZXNzYWdlCW1zZyA9IHsKKwkJLnJwY19wcm9jCT0gJm5mczNfcHJvY2VkdXJlc1tORlMzUFJPQ19DT01NSVRdLAorCQkucnBjX2FyZ3AJPSAmZGF0YS0+YXJncywKKwkJLnJwY19yZXNwCT0gJmRhdGEtPnJlcywKKwkJLnJwY19jcmVkCT0gZGF0YS0+Y3JlZCwKKwl9OworCisJLyogU2V0IHRoZSBpbml0aWFsIGZsYWdzIGZvciB0aGUgdGFzay4gICovCisJZmxhZ3MgPSAoaG93ICYgRkxVU0hfU1lOQykgPyAwIDogUlBDX1RBU0tfQVNZTkM7CisKKwkvKiBGaW5hbGl6ZSB0aGUgdGFzay4gKi8KKwlycGNfaW5pdF90YXNrKHRhc2ssIE5GU19DTElFTlQoaW5vZGUpLCBuZnMzX2NvbW1pdF9kb25lLCBmbGFncyk7CisJcnBjX2NhbGxfc2V0dXAodGFzaywgJm1zZywgMCk7Cit9CisKK3N0YXRpYyBpbnQKK25mczNfcHJvY19sb2NrKHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlyZXR1cm4gbmxtY2xudF9wcm9jKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCBjbWQsIGZsKTsKK30KKworc3RydWN0IG5mc19ycGNfb3BzCW5mc192M19jbGllbnRvcHMgPSB7CisJLnZlcnNpb24JPSAzLAkJCS8qIHByb3RvY29sIHZlcnNpb24gKi8KKwkuZGVudHJ5X29wcwk9ICZuZnNfZGVudHJ5X29wZXJhdGlvbnMsCisJLmRpcl9pbm9kZV9vcHMJPSAmbmZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zLAorCS5nZXRyb290CT0gbmZzM19wcm9jX2dldF9yb290LAorCS5nZXRhdHRyCT0gbmZzM19wcm9jX2dldGF0dHIsCisJLnNldGF0dHIJPSBuZnMzX3Byb2Nfc2V0YXR0ciwKKwkubG9va3VwCQk9IG5mczNfcHJvY19sb29rdXAsCisJLmFjY2VzcwkJPSBuZnMzX3Byb2NfYWNjZXNzLAorCS5yZWFkbGluawk9IG5mczNfcHJvY19yZWFkbGluaywKKwkucmVhZAkJPSBuZnMzX3Byb2NfcmVhZCwKKwkud3JpdGUJCT0gbmZzM19wcm9jX3dyaXRlLAorCS5jb21taXQJCT0gbmZzM19wcm9jX2NvbW1pdCwKKwkuY3JlYXRlCQk9IG5mczNfcHJvY19jcmVhdGUsCisJLnJlbW92ZQkJPSBuZnMzX3Byb2NfcmVtb3ZlLAorCS51bmxpbmtfc2V0dXAJPSBuZnMzX3Byb2NfdW5saW5rX3NldHVwLAorCS51bmxpbmtfZG9uZQk9IG5mczNfcHJvY191bmxpbmtfZG9uZSwKKwkucmVuYW1lCQk9IG5mczNfcHJvY19yZW5hbWUsCisJLmxpbmsJCT0gbmZzM19wcm9jX2xpbmssCisJLnN5bWxpbmsJPSBuZnMzX3Byb2Nfc3ltbGluaywKKwkubWtkaXIJCT0gbmZzM19wcm9jX21rZGlyLAorCS5ybWRpcgkJPSBuZnMzX3Byb2Nfcm1kaXIsCisJLnJlYWRkaXIJPSBuZnMzX3Byb2NfcmVhZGRpciwKKwkubWtub2QJCT0gbmZzM19wcm9jX21rbm9kLAorCS5zdGF0ZnMJCT0gbmZzM19wcm9jX3N0YXRmcywKKwkuZnNpbmZvCQk9IG5mczNfcHJvY19mc2luZm8sCisJLnBhdGhjb25mCT0gbmZzM19wcm9jX3BhdGhjb25mLAorCS5kZWNvZGVfZGlyZW50CT0gbmZzM19kZWNvZGVfZGlyZW50LAorCS5yZWFkX3NldHVwCT0gbmZzM19wcm9jX3JlYWRfc2V0dXAsCisJLndyaXRlX3NldHVwCT0gbmZzM19wcm9jX3dyaXRlX3NldHVwLAorCS5jb21taXRfc2V0dXAJPSBuZnMzX3Byb2NfY29tbWl0X3NldHVwLAorCS5maWxlX29wZW4JPSBuZnNfb3BlbiwKKwkuZmlsZV9yZWxlYXNlCT0gbmZzX3JlbGVhc2UsCisJLmxvY2sJCT0gbmZzM19wcm9jX2xvY2ssCit9OwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczN4ZHIuYyBiL2ZzL25mcy9uZnMzeGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1OTNkNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy9uZnMzeGRyLmMKQEAgLTAsMCArMSwxMDIzIEBACisvKgorICogbGludXgvZnMvbmZzL25mczN4ZHIuYworICoKKyAqIFhEUiBmdW5jdGlvbnMgdG8gZW5jb2RlL2RlY29kZSBORlN2MyBSUEMgYXJndW1lbnRzIGFuZCByZXN1bHRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBPbGFmIEtpcmNoCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L25mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mczMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKworI2RlZmluZSBORlNEQkdfRkFDSUxJVFkJCU5GU0RCR19YRFIKKworLyogTWFwcGluZyBmcm9tIE5GUyBlcnJvciBjb2RlIHRvICJlcnJubyIgZXJyb3IgY29kZS4gKi8KKyNkZWZpbmUgZXJybm9fTkZTRVJSX0lPCQlFSU8KKworZXh0ZXJuIGludAkJCW5mc19zdGF0X3RvX2Vycm5vKGludCk7CisKKy8qCisgKiBEZWNsYXJlIHRoZSBzcGFjZSByZXF1aXJlbWVudHMgZm9yIE5GUyBhcmd1bWVudHMgYW5kIHJlcGxpZXMgYXMKKyAqIG51bWJlciBvZiAzMmJpdC13b3JkcworICovCisjZGVmaW5lIE5GUzNfZmhhbmRsZV9zegkJKDErMTYpCisjZGVmaW5lIE5GUzNfZmhfc3oJCShORlMzX2ZoYW5kbGVfc3opCS8qIHNob3J0aGFuZCAqLworI2RlZmluZSBORlMzX3NhdHRyX3N6CQkoMTUpCisjZGVmaW5lIE5GUzNfZmlsZW5hbWVfc3oJKDErKE5GUzNfTUFYTkFNTEVOPj4yKSkKKyNkZWZpbmUgTkZTM19wYXRoX3N6CQkoMSsoTkZTM19NQVhQQVRITEVOPj4yKSkKKyNkZWZpbmUgTkZTM19mYXR0cl9zegkJKDIxKQorI2RlZmluZSBORlMzX3djY19hdHRyX3N6CQkoNikKKyNkZWZpbmUgTkZTM19wcmVfb3BfYXR0cl9zegkoMStORlMzX3djY19hdHRyX3N6KQorI2RlZmluZSBORlMzX3Bvc3Rfb3BfYXR0cl9zegkoMStORlMzX2ZhdHRyX3N6KQorI2RlZmluZSBORlMzX3djY19kYXRhX3N6CQkoTkZTM19wcmVfb3BfYXR0cl9zeitORlMzX3Bvc3Rfb3BfYXR0cl9zeikKKyNkZWZpbmUgTkZTM19mc3N0YXRfc3oJCQorI2RlZmluZSBORlMzX2ZzaW5mb19zegkJCisjZGVmaW5lIE5GUzNfcGF0aGNvbmZfc3oJCQorI2RlZmluZSBORlMzX2VudHJ5X3N6CQkoTkZTM19maWxlbmFtZV9zeiszKQorCisjZGVmaW5lIE5GUzNfc2F0dHJhcmdzX3N6CShORlMzX2ZoX3N6K05GUzNfc2F0dHJfc3orMykKKyNkZWZpbmUgTkZTM19kaXJvcGFyZ3Nfc3oJKE5GUzNfZmhfc3orTkZTM19maWxlbmFtZV9zeikKKyNkZWZpbmUgTkZTM19hY2Nlc3NhcmdzX3N6CShORlMzX2ZoX3N6KzEpCisjZGVmaW5lIE5GUzNfcmVhZGxpbmthcmdzX3N6CShORlMzX2ZoX3N6KQorI2RlZmluZSBORlMzX3JlYWRhcmdzX3N6CShORlMzX2ZoX3N6KzMpCisjZGVmaW5lIE5GUzNfd3JpdGVhcmdzX3N6CShORlMzX2ZoX3N6KzUpCisjZGVmaW5lIE5GUzNfY3JlYXRlYXJnc19zegkoTkZTM19kaXJvcGFyZ3Nfc3orTkZTM19zYXR0cl9zeikKKyNkZWZpbmUgTkZTM19ta2RpcmFyZ3Nfc3oJKE5GUzNfZGlyb3BhcmdzX3N6K05GUzNfc2F0dHJfc3opCisjZGVmaW5lIE5GUzNfc3ltbGlua2FyZ3Nfc3oJKE5GUzNfZGlyb3BhcmdzX3N6K05GUzNfcGF0aF9zeitORlMzX3NhdHRyX3N6KQorI2RlZmluZSBORlMzX21rbm9kYXJnc19zegkoTkZTM19kaXJvcGFyZ3Nfc3orMitORlMzX3NhdHRyX3N6KQorI2RlZmluZSBORlMzX3JlbmFtZWFyZ3Nfc3oJKE5GUzNfZGlyb3BhcmdzX3N6K05GUzNfZGlyb3BhcmdzX3N6KQorI2RlZmluZSBORlMzX2xpbmthcmdzX3N6CQkoTkZTM19maF9zeitORlMzX2Rpcm9wYXJnc19zeikKKyNkZWZpbmUgTkZTM19yZWFkZGlyYXJnc19zegkoTkZTM19maF9zeisyKQorI2RlZmluZSBORlMzX2NvbW1pdGFyZ3Nfc3oJKE5GUzNfZmhfc3orMykKKworI2RlZmluZSBORlMzX2F0dHJzdGF0X3N6CSgxK05GUzNfZmF0dHJfc3opCisjZGVmaW5lIE5GUzNfd2Njc3RhdF9zegkJKDErTkZTM193Y2NfZGF0YV9zeikKKyNkZWZpbmUgTkZTM19sb29rdXByZXNfc3oJKDErTkZTM19maF9zeisoMiAqIE5GUzNfcG9zdF9vcF9hdHRyX3N6KSkKKyNkZWZpbmUgTkZTM19hY2Nlc3NyZXNfc3oJKDErTkZTM19wb3N0X29wX2F0dHJfc3orMSkKKyNkZWZpbmUgTkZTM19yZWFkbGlua3Jlc19zegkoMStORlMzX3Bvc3Rfb3BfYXR0cl9zeisxKQorI2RlZmluZSBORlMzX3JlYWRyZXNfc3oJCSgxK05GUzNfcG9zdF9vcF9hdHRyX3N6KzMpCisjZGVmaW5lIE5GUzNfd3JpdGVyZXNfc3oJKDErTkZTM193Y2NfZGF0YV9zeis0KQorI2RlZmluZSBORlMzX2NyZWF0ZXJlc19zegkoMStORlMzX2ZoX3N6K05GUzNfcG9zdF9vcF9hdHRyX3N6K05GUzNfd2NjX2RhdGFfc3opCisjZGVmaW5lIE5GUzNfcmVuYW1lcmVzX3N6CSgxKygyICogTkZTM193Y2NfZGF0YV9zeikpCisjZGVmaW5lIE5GUzNfbGlua3Jlc19zegkJKDErTkZTM19wb3N0X29wX2F0dHJfc3orTkZTM193Y2NfZGF0YV9zeikKKyNkZWZpbmUgTkZTM19yZWFkZGlycmVzX3N6CSgxK05GUzNfcG9zdF9vcF9hdHRyX3N6KzIpCisjZGVmaW5lIE5GUzNfZnNzdGF0cmVzX3N6CSgxK05GUzNfcG9zdF9vcF9hdHRyX3N6KzEzKQorI2RlZmluZSBORlMzX2ZzaW5mb3Jlc19zegkoMStORlMzX3Bvc3Rfb3BfYXR0cl9zeisxMikKKyNkZWZpbmUgTkZTM19wYXRoY29uZnJlc19zegkoMStORlMzX3Bvc3Rfb3BfYXR0cl9zeis2KQorI2RlZmluZSBORlMzX2NvbW1pdHJlc19zegkoMStORlMzX3djY19kYXRhX3N6KzIpCisKKy8qCisgKiBNYXAgZmlsZSB0eXBlIHRvIFNfSUZNVCBiaXRzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGludAltb2RlOworCXVuc2lnbmVkIGludAluZnMydHlwZTsKK30gbmZzX3R5cGUyZm10W10gPSB7CisgICAgICB7IDAsCQlORk5PTgl9LAorICAgICAgeyBTX0lGUkVHLAlORlJFRwl9LAorICAgICAgeyBTX0lGRElSLAlORkRJUgl9LAorICAgICAgeyBTX0lGQkxLLAlORkJMSwl9LAorICAgICAgeyBTX0lGQ0hSLAlORkNIUgl9LAorICAgICAgeyBTX0lGTE5LLAlORkxOSwl9LAorICAgICAgeyBTX0lGU09DSywJTkZTT0NLCX0sCisgICAgICB7IFNfSUZJRk8sCU5GRklGTwl9LAorICAgICAgeyAwLAkJTkZCQUQJfQorfTsKKworLyoKKyAqIENvbW1vbiBORlMgWERSIGZ1bmN0aW9ucyBhcyBpbmxpbmVzCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyICoKK3hkcl9lbmNvZGVfZmhhbmRsZSh1MzIgKnAsIHN0cnVjdCBuZnNfZmggKmZoKQoreworCXJldHVybiB4ZHJfZW5jb2RlX2FycmF5KHAsIGZoLT5kYXRhLCBmaC0+c2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK3hkcl9kZWNvZGVfZmhhbmRsZSh1MzIgKnAsIHN0cnVjdCBuZnNfZmggKmZoKQoreworCWlmICgoZmgtPnNpemUgPSBudG9obCgqcCsrKSkgPD0gTkZTM19GSFNJWkUpIHsKKwkJbWVtY3B5KGZoLT5kYXRhLCBwLCBmaC0+c2l6ZSk7CisJCXJldHVybiBwICsgWERSX1FVQURMRU4oZmgtPnNpemUpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEVuY29kZS9kZWNvZGUgdGltZS4KKyAqLworc3RhdGljIGlubGluZSB1MzIgKgoreGRyX2VuY29kZV90aW1lMyh1MzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCit7CisJKnArKyA9IGh0b25sKHRpbWVwLT50dl9zZWMpOworCSpwKysgPSBodG9ubCh0aW1lcC0+dHZfbnNlYyk7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK3hkcl9kZWNvZGVfdGltZTModTMyICpwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVwKQoreworCXRpbWVwLT50dl9zZWMgPSBudG9obCgqcCsrKTsKKwl0aW1lcC0+dHZfbnNlYyA9IG50b2hsKCpwKyspOworCXJldHVybiBwOworfQorCitzdGF0aWMgdTMyICoKK3hkcl9kZWNvZGVfZmF0dHIodTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwl1bnNpZ25lZCBpbnQJdHlwZSwgbWFqb3IsIG1pbm9yOworCWludAkJZm1vZGU7CisKKwl0eXBlID0gbnRvaGwoKnArKyk7CisJaWYgKHR5cGUgPj0gTkYzQkFEKQorCQl0eXBlID0gTkYzQkFEOworCWZtb2RlID0gbmZzX3R5cGUyZm10W3R5cGVdLm1vZGU7CisJZmF0dHItPnR5cGUgPSBuZnNfdHlwZTJmbXRbdHlwZV0ubmZzMnR5cGU7CisJZmF0dHItPm1vZGUgPSAobnRvaGwoKnArKykgJiB+U19JRk1UKSB8IGZtb2RlOworCWZhdHRyLT5ubGluayA9IG50b2hsKCpwKyspOworCWZhdHRyLT51aWQgPSBudG9obCgqcCsrKTsKKwlmYXR0ci0+Z2lkID0gbnRvaGwoKnArKyk7CisJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmZhdHRyLT5zaXplKTsKKwlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmZmF0dHItPmR1Lm5mczMudXNlZCk7CisKKwkvKiBUdXJuIHJlbW90ZSBkZXZpY2UgaW5mbyBpbnRvIExpbnV4LXNwZWNpZmljIGRldl90ICovCisJbWFqb3IgPSBudG9obCgqcCsrKTsKKwltaW5vciA9IG50b2hsKCpwKyspOworCWZhdHRyLT5yZGV2ID0gTUtERVYobWFqb3IsIG1pbm9yKTsKKwlpZiAoTUFKT1IoZmF0dHItPnJkZXYpICE9IG1ham9yIHx8IE1JTk9SKGZhdHRyLT5yZGV2KSAhPSBtaW5vcikKKwkJZmF0dHItPnJkZXYgPSAwOworCisJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmZhdHRyLT5mc2lkX3UubmZzMyk7CisJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmZhdHRyLT5maWxlaWQpOworCXAgPSB4ZHJfZGVjb2RlX3RpbWUzKHAsICZmYXR0ci0+YXRpbWUpOworCXAgPSB4ZHJfZGVjb2RlX3RpbWUzKHAsICZmYXR0ci0+bXRpbWUpOworCXAgPSB4ZHJfZGVjb2RlX3RpbWUzKHAsICZmYXR0ci0+Y3RpbWUpOworCisJLyogVXBkYXRlIHRoZSBtb2RlIGJpdHMgKi8KKwlmYXR0ci0+dmFsaWQgfD0gKE5GU19BVFRSX0ZBVFRSIHwgTkZTX0FUVFJfRkFUVFJfVjMpOworCWZhdHRyLT50aW1lc3RhbXAgPSBqaWZmaWVzOworCXJldHVybiBwOworfQorCitzdGF0aWMgaW5saW5lIHUzMiAqCit4ZHJfZW5jb2RlX3NhdHRyKHUzMiAqcCwgc3RydWN0IGlhdHRyICphdHRyKQoreworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgeworCQkqcCsrID0geGRyX29uZTsKKwkJKnArKyA9IGh0b25sKGF0dHItPmlhX21vZGUpOworCX0gZWxzZSB7CisJCSpwKysgPSB4ZHJfemVybzsKKwl9CisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQpIHsKKwkJKnArKyA9IHhkcl9vbmU7CisJCSpwKysgPSBodG9ubChhdHRyLT5pYV91aWQpOworCX0gZWxzZSB7CisJCSpwKysgPSB4ZHJfemVybzsKKwl9CisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpIHsKKwkJKnArKyA9IHhkcl9vbmU7CisJCSpwKysgPSBodG9ubChhdHRyLT5pYV9naWQpOworCX0gZWxzZSB7CisJCSpwKysgPSB4ZHJfemVybzsKKwl9CisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CisJCSpwKysgPSB4ZHJfb25lOworCQlwID0geGRyX2VuY29kZV9oeXBlcihwLCAoX191NjQpIGF0dHItPmlhX3NpemUpOworCX0gZWxzZSB7CisJCSpwKysgPSB4ZHJfemVybzsKKwl9CisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9BVElNRV9TRVQpIHsKKwkJKnArKyA9IHhkcl90d287CisJCXAgPSB4ZHJfZW5jb2RlX3RpbWUzKHAsICZhdHRyLT5pYV9hdGltZSk7CisJfSBlbHNlIGlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUUpIHsKKwkJKnArKyA9IHhkcl9vbmU7CisJfSBlbHNlIHsKKwkJKnArKyA9IHhkcl96ZXJvOworCX0KKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01USU1FX1NFVCkgeworCQkqcCsrID0geGRyX3R3bzsKKwkJcCA9IHhkcl9lbmNvZGVfdGltZTMocCwgJmF0dHItPmlhX210aW1lKTsKKwl9IGVsc2UgaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NVElNRSkgeworCQkqcCsrID0geGRyX29uZTsKKwl9IGVsc2UgeworCQkqcCsrID0geGRyX3plcm87CisJfQorCXJldHVybiBwOworfQorCitzdGF0aWMgaW5saW5lIHUzMiAqCit4ZHJfZGVjb2RlX3djY19hdHRyKHUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmZhdHRyLT5wcmVfc2l6ZSk7CisJcCA9IHhkcl9kZWNvZGVfdGltZTMocCwgJmZhdHRyLT5wcmVfbXRpbWUpOworCXAgPSB4ZHJfZGVjb2RlX3RpbWUzKHAsICZmYXR0ci0+cHJlX2N0aW1lKTsKKwlmYXR0ci0+dmFsaWQgfD0gTkZTX0FUVFJfV0NDOworCXJldHVybiBwOworfQorCitzdGF0aWMgaW5saW5lIHUzMiAqCit4ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cih1MzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCWlmICgqcCsrKQorCQlwID0geGRyX2RlY29kZV9mYXR0cihwLCBmYXR0cik7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK3hkcl9kZWNvZGVfcHJlX29wX2F0dHIodTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlpZiAoKnArKykKKwkJcmV0dXJuIHhkcl9kZWNvZGVfd2NjX2F0dHIocCwgZmF0dHIpOworCXJldHVybiBwOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK3hkcl9kZWNvZGVfd2NjX2RhdGEodTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlwID0geGRyX2RlY29kZV9wcmVfb3BfYXR0cihwLCBmYXR0cik7CisJcmV0dXJuIHhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIGZhdHRyKTsKK30KKworLyoKKyAqIE5GUyBlbmNvZGUgZnVuY3Rpb25zCisgKi8KKworLyoKKyAqIEVuY29kZSBmaWxlIGhhbmRsZSBhcmd1bWVudAorICovCitzdGF0aWMgaW50CituZnMzX3hkcl9maGFuZGxlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfZmggKmZoKQoreworCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgZmgpOworCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEVuY29kZSBTRVRBVFRSIGFyZ3VtZW50cworICovCitzdGF0aWMgaW50CituZnMzX3hkcl9zYXR0cmFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfc2F0dHJhcmdzICphcmdzKQoreworCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOworCXAgPSB4ZHJfZW5jb2RlX3NhdHRyKHAsIGFyZ3MtPnNhdHRyKTsKKwkqcCsrID0gaHRvbmwoYXJncy0+Z3VhcmQpOworCWlmIChhcmdzLT5ndWFyZCkKKwkJcCA9IHhkcl9lbmNvZGVfdGltZTMocCwgJmFyZ3MtPmd1YXJkdGltZSk7CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCisvKgorICogRW5jb2RlIGRpcmVjdG9yeSBvcHMgYXJndW1lbnQKKyAqLworc3RhdGljIGludAorbmZzM194ZHJfZGlyb3BhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX2Rpcm9wYXJncyAqYXJncykKK3sKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKKwlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uYW1lLCBhcmdzLT5sZW4pOworCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEVuY29kZSBhY2Nlc3MoKSBhcmd1bWVudAorICovCitzdGF0aWMgaW50CituZnMzX3hkcl9hY2Nlc3NhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX2FjY2Vzc2FyZ3MgKmFyZ3MpCit7CisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CisJKnArKyA9IGh0b25sKGFyZ3MtPmFjY2Vzcyk7CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCisvKgorICogQXJndW1lbnRzIHRvIGEgUkVBRCBjYWxsLiBTaW5jZSB3ZSByZWFkIGRhdGEgZGlyZWN0bHkgaW50byB0aGUgcGFnZQorICogY2FjaGUsIHdlIGFsc28gc2V0IHVwIHRoZSByZXBseSBpb3ZlYyBoZXJlIHNvIHRoYXQgaW92WzFdIHBvaW50cworICogZXhhY3RseSB0byB0aGUgcGFnZSB3ZSB3YW50IHRvIGZldGNoLgorICovCitzdGF0aWMgaW50CituZnMzX3hkcl9yZWFkYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3JlYWRhcmdzICphcmdzKQoreworCXN0cnVjdCBycGNfYXV0aAkqYXV0aCA9IHJlcS0+cnFfdGFzay0+dGtfYXV0aDsKKwl1bnNpZ25lZCBpbnQgcmVwbGVuOworCXUzMiBjb3VudCA9IGFyZ3MtPmNvdW50OworCisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgYXJncy0+b2Zmc2V0KTsKKwkqcCsrID0gaHRvbmwoY291bnQpOworCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKKworCS8qIElubGluZSB0aGUgcGFnZSBhcnJheSAqLworCXJlcGxlbiA9IChSUENfUkVQSERSU0laRSArIGF1dGgtPmF1X3JzbGFjayArIE5GUzNfcmVhZHJlc19zeikgPDwgMjsKKwl4ZHJfaW5saW5lX3BhZ2VzKCZyZXEtPnJxX3Jjdl9idWYsIHJlcGxlbiwKKwkJCSBhcmdzLT5wYWdlcywgYXJncy0+cGdiYXNlLCBjb3VudCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXcml0ZSBhcmd1bWVudHMuIFNwbGljZSB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgaW92ZWMuCisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX3dyaXRlYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgeGRyX2J1ZiAqc25kYnVmID0gJnJlcS0+cnFfc25kX2J1ZjsKKwl1MzIgY291bnQgPSBhcmdzLT5jb3VudDsKKworCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOworCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGFyZ3MtPm9mZnNldCk7CisJKnArKyA9IGh0b25sKGNvdW50KTsKKwkqcCsrID0gaHRvbmwoYXJncy0+c3RhYmxlKTsKKwkqcCsrID0gaHRvbmwoY291bnQpOworCXNuZGJ1Zi0+bGVuID0geGRyX2FkanVzdF9pb3ZlYyhzbmRidWYtPmhlYWQsIHApOworCisJLyogQ29weSB0aGUgcGFnZSBhcnJheSAqLworCXhkcl9lbmNvZGVfcGFnZXMoc25kYnVmLCBhcmdzLT5wYWdlcywgYXJncy0+cGdiYXNlLCBjb3VudCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFbmNvZGUgQ1JFQVRFIGFyZ3VtZW50cworICovCitzdGF0aWMgaW50CituZnMzX3hkcl9jcmVhdGVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX2NyZWF0ZWFyZ3MgKmFyZ3MpCit7CisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CisJcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+bmFtZSwgYXJncy0+bGVuKTsKKworCSpwKysgPSBodG9ubChhcmdzLT5jcmVhdGVtb2RlKTsKKwlpZiAoYXJncy0+Y3JlYXRlbW9kZSA9PSBORlMzX0NSRUFURV9FWENMVVNJVkUpIHsKKwkJKnArKyA9IGFyZ3MtPnZlcmlmaWVyWzBdOworCQkqcCsrID0gYXJncy0+dmVyaWZpZXJbMV07CisJfSBlbHNlCisJCXAgPSB4ZHJfZW5jb2RlX3NhdHRyKHAsIGFyZ3MtPnNhdHRyKTsKKworCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEVuY29kZSBNS0RJUiBhcmd1bWVudHMKKyAqLworc3RhdGljIGludAorbmZzM194ZHJfbWtkaXJhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX21rZGlyYXJncyAqYXJncykKK3sKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKKwlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uYW1lLCBhcmdzLT5sZW4pOworCXAgPSB4ZHJfZW5jb2RlX3NhdHRyKHAsIGFyZ3MtPnNhdHRyKTsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFbmNvZGUgU1lNTElOSyBhcmd1bWVudHMKKyAqLworc3RhdGljIGludAorbmZzM194ZHJfc3ltbGlua2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfc3ltbGlua2FyZ3MgKmFyZ3MpCit7CisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5mcm9tZmgpOworCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPmZyb21uYW1lLCBhcmdzLT5mcm9tbGVuKTsKKwlwID0geGRyX2VuY29kZV9zYXR0cihwLCBhcmdzLT5zYXR0cik7CisJcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+dG9wYXRoLCBhcmdzLT50b2xlbik7CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCisvKgorICogRW5jb2RlIE1LTk9EIGFyZ3VtZW50cworICovCitzdGF0aWMgaW50CituZnMzX3hkcl9ta25vZGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfbWtub2RhcmdzICphcmdzKQoreworCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOworCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPm5hbWUsIGFyZ3MtPmxlbik7CisJKnArKyA9IGh0b25sKGFyZ3MtPnR5cGUpOworCXAgPSB4ZHJfZW5jb2RlX3NhdHRyKHAsIGFyZ3MtPnNhdHRyKTsKKwlpZiAoYXJncy0+dHlwZSA9PSBORjNDSFIgfHwgYXJncy0+dHlwZSA9PSBORjNCTEspIHsKKwkJKnArKyA9IGh0b25sKE1BSk9SKGFyZ3MtPnJkZXYpKTsKKwkJKnArKyA9IGh0b25sKE1JTk9SKGFyZ3MtPnJkZXYpKTsKKwl9CisKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFbmNvZGUgUkVOQU1FIGFyZ3VtZW50cworICovCitzdGF0aWMgaW50CituZnMzX3hkcl9yZW5hbWVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX3JlbmFtZWFyZ3MgKmFyZ3MpCit7CisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5mcm9tZmgpOworCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPmZyb21uYW1lLCBhcmdzLT5mcm9tbGVuKTsKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPnRvZmgpOworCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPnRvbmFtZSwgYXJncy0+dG9sZW4pOworCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEVuY29kZSBMSU5LIGFyZ3VtZW50cworICovCitzdGF0aWMgaW50CituZnMzX3hkcl9saW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19saW5rYXJncyAqYXJncykKK3sKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZyb21maCk7CisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT50b2ZoKTsKKwlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT50b25hbWUsIGFyZ3MtPnRvbGVuKTsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFbmNvZGUgYXJndW1lbnRzIHRvIHJlYWRkaXIgY2FsbAorICovCitzdGF0aWMgaW50CituZnMzX3hkcl9yZWFkZGlyYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19yZWFkZGlyYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgcnBjX2F1dGgJKmF1dGggPSByZXEtPnJxX3Rhc2stPnRrX2F1dGg7CisJdW5zaWduZWQgaW50IHJlcGxlbjsKKwl1MzIgY291bnQgPSBhcmdzLT5jb3VudDsKKworCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOworCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGFyZ3MtPmNvb2tpZSk7CisJKnArKyA9IGFyZ3MtPnZlcmZbMF07CisJKnArKyA9IGFyZ3MtPnZlcmZbMV07CisJaWYgKGFyZ3MtPnBsdXMpIHsKKwkJLyogcmVhZGRpcnBsdXM6IG5lZWQgZGlyY291bnQgKyBidWZmZXIgc2l6ZS4KKwkJICogV2UganVzdCBtYWtlIHN1cmUgd2UgbWFrZSBkaXJjb3VudCBiaWcgZW5vdWdoICovCisJCSpwKysgPSBodG9ubChjb3VudCA+PiAzKTsKKwl9CisJKnArKyA9IGh0b25sKGNvdW50KTsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisKKwkvKiBJbmxpbmUgdGhlIHBhZ2UgYXJyYXkgKi8KKwlyZXBsZW4gPSAoUlBDX1JFUEhEUlNJWkUgKyBhdXRoLT5hdV9yc2xhY2sgKyBORlMzX3JlYWRkaXJyZXNfc3opIDw8IDI7CisJeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCByZXBsZW4sIGFyZ3MtPnBhZ2VzLCAwLCBjb3VudCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWNvZGUgdGhlIHJlc3VsdCBvZiBhIHJlYWRkaXIgY2FsbC4KKyAqIFdlIGp1c3QgY2hlY2sgZm9yIHN5bnRhY3RpY2FsIGNvcnJlY3RuZXNzLgorICovCitzdGF0aWMgaW50CituZnMzX3hkcl9yZWFkZGlycmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX3JlYWRkaXJyZXMgKnJlcykKK3sKKwlzdHJ1Y3QgeGRyX2J1ZiAqcmN2YnVmID0gJnJlcS0+cnFfcmN2X2J1ZjsKKwlzdHJ1Y3Qga3ZlYyAqaW92ID0gcmN2YnVmLT5oZWFkOworCXN0cnVjdCBwYWdlICoqcGFnZTsKKwlpbnQgaGRybGVuLCByZWN2ZDsKKwlpbnQgc3RhdHVzLCBucjsKKwl1bnNpZ25lZCBpbnQgbGVuLCBwZ2xlbjsKKwl1MzIgKmVudHJ5LCAqZW5kLCAqa2FkZHI7CisKKwlzdGF0dXMgPSBudG9obCgqcCsrKTsKKwkvKiBEZWNvZGUgcG9zdF9vcF9hdHRycyAqLworCXAgPSB4ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cihwLCByZXMtPmRpcl9hdHRyKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gLW5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CisJLyogRGVjb2RlIHZlcmlmaWVyIGNvb2tpZSAqLworCWlmIChyZXMtPnZlcmYpIHsKKwkJcmVzLT52ZXJmWzBdID0gKnArKzsKKwkJcmVzLT52ZXJmWzFdID0gKnArKzsKKwl9IGVsc2UgeworCQlwICs9IDI7CisJfQorCisJaGRybGVuID0gKHU4ICopIHAgLSAodTggKikgaW92LT5pb3ZfYmFzZTsKKwlpZiAoaW92LT5pb3ZfbGVuIDwgaGRybGVuKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUzogUkVBRERJUiByZXBseSBoZWFkZXIgb3ZlcmZsb3dlZDoiCisJCQkJImxlbmd0aCAlZCA+ICVadVxuIiwgaGRybGVuLCBpb3YtPmlvdl9sZW4pOworCQlyZXR1cm4gLWVycm5vX05GU0VSUl9JTzsKKwl9IGVsc2UgaWYgKGlvdi0+aW92X2xlbiAhPSBoZHJsZW4pIHsKKwkJZHByaW50aygiTkZTOiBSRUFERElSIGhlYWRlciBpcyBzaG9ydC4gaW92ZWMgd2lsbCBiZSBzaGlmdGVkLlxuIik7CisJCXhkcl9zaGlmdF9idWYocmN2YnVmLCBpb3YtPmlvdl9sZW4gLSBoZHJsZW4pOworCX0KKworCXBnbGVuID0gcmN2YnVmLT5wYWdlX2xlbjsKKwlyZWN2ZCA9IHJjdmJ1Zi0+bGVuIC0gaGRybGVuOworCWlmIChwZ2xlbiA+IHJlY3ZkKQorCQlwZ2xlbiA9IHJlY3ZkOworCXBhZ2UgPSByY3ZidWYtPnBhZ2VzOworCWthZGRyID0gcCA9ICh1MzIgKilrbWFwX2F0b21pYygqcGFnZSwgS01fVVNFUjApOworCWVuZCA9ICh1MzIgKikoKGNoYXIgKilwICsgcGdsZW4pOworCWVudHJ5ID0gcDsKKwlmb3IgKG5yID0gMDsgKnArKzsgbnIrKykgeworCQlpZiAocCArIDMgPiBlbmQpCisJCQlnb3RvIHNob3J0X3BrdDsKKwkJcCArPSAyOwkJCQkvKiBpbm9kZSAjICovCisJCWxlbiA9IG50b2hsKCpwKyspOwkJLyogc3RyaW5nIGxlbmd0aCAqLworCQlwICs9IFhEUl9RVUFETEVOKGxlbikgKyAyOwkvKiBuYW1lICsgY29va2llICovCisJCWlmIChsZW4gPiBORlMzX01BWE5BTUxFTikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBnaWFudCBmaWxlbmFtZSBpbiByZWFkZGlyIChsZW4gJXgpIVxuIiwKKwkJCQkJCWxlbik7CisJCQlnb3RvIGVycl91bm1hcDsKKwkJfQorCisJCWlmIChyZXMtPnBsdXMpIHsKKwkJCS8qIHBvc3Rfb3BfYXR0ciAqLworCQkJaWYgKHAgKyAyID4gZW5kKQorCQkJCWdvdG8gc2hvcnRfcGt0OworCQkJaWYgKCpwKyspIHsKKwkJCQlwICs9IDIxOworCQkJCWlmIChwICsgMSA+IGVuZCkKKwkJCQkJZ290byBzaG9ydF9wa3Q7CisJCQl9CisJCQkvKiBwb3N0X29wX2ZoMyAqLworCQkJaWYgKCpwKyspIHsKKwkJCQlpZiAocCArIDEgPiBlbmQpCisJCQkJCWdvdG8gc2hvcnRfcGt0OworCQkJCWxlbiA9IG50b2hsKCpwKyspOworCQkJCWlmIChsZW4gPiBORlMzX0ZIU0laRSkgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IGdpYW50IGZpbGVoYW5kbGUgaW4gIgorCQkJCQkJInJlYWRkaXIgKGxlbiAleCkhXG4iLCBsZW4pOworCQkJCQlnb3RvIGVycl91bm1hcDsKKwkJCQl9CisJCQkJcCArPSBYRFJfUVVBRExFTihsZW4pOworCQkJfQorCQl9CisKKwkJaWYgKHAgKyAyID4gZW5kKQorCQkJZ290byBzaG9ydF9wa3Q7CisJCWVudHJ5ID0gcDsKKwl9CisJaWYgKCFuciAmJiAoZW50cnlbMF0gIT0gMCB8fCBlbnRyeVsxXSA9PSAwKSkKKwkJZ290byBzaG9ydF9wa3Q7Cisgb3V0OgorCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwlyZXR1cm4gbnI7Cisgc2hvcnRfcGt0OgorCWVudHJ5WzBdID0gZW50cnlbMV0gPSAwOworCS8qIHRydW5jYXRlIGxpc3RpbmcgPyAqLworCWlmICghbnIpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJORlM6IHJlYWRkaXIgcmVwbHkgdHJ1bmNhdGVkIVxuIik7CisJCWVudHJ5WzFdID0gMTsKKwl9CisJZ290byBvdXQ7CitlcnJfdW5tYXA6CisJbnIgPSAtZXJybm9fTkZTRVJSX0lPOworCWdvdG8gb3V0OworfQorCit1MzIgKgorbmZzM19kZWNvZGVfZGlyZW50KHUzMiAqcCwgc3RydWN0IG5mc19lbnRyeSAqZW50cnksIGludCBwbHVzKQoreworCXN0cnVjdCBuZnNfZW50cnkgb2xkID0gKmVudHJ5OworCisJaWYgKCEqcCsrKSB7CisJCWlmICghKnApCisJCQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsKKwkJZW50cnktPmVvZiA9IDE7CisJCXJldHVybiBFUlJfUFRSKC1FQkFEQ09PS0lFKTsKKwl9CisKKwlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmZW50cnktPmlubyk7CisJZW50cnktPmxlbiAgPSBudG9obCgqcCsrKTsKKwllbnRyeS0+bmFtZSA9IChjb25zdCBjaGFyICopIHA7CisJcCArPSBYRFJfUVVBRExFTihlbnRyeS0+bGVuKTsKKwllbnRyeS0+cHJldl9jb29raWUgPSBlbnRyeS0+Y29va2llOworCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZlbnRyeS0+Y29va2llKTsKKworCWlmIChwbHVzKSB7CisJCWVudHJ5LT5mYXR0ci0+dmFsaWQgPSAwOworCQlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgZW50cnktPmZhdHRyKTsKKwkJLyogSW4gZmFjdCwgYSBwb3N0X29wX2ZoMzogKi8KKwkJaWYgKCpwKyspIHsKKwkJCXAgPSB4ZHJfZGVjb2RlX2ZoYW5kbGUocCwgZW50cnktPmZoKTsKKwkJCS8qIFVnaCAtLSBzZXJ2ZXIgcmVwbHkgd2FzIHRydW5jYXRlZCAqLworCQkJaWYgKHAgPT0gTlVMTCkgeworCQkJCWRwcmludGsoIk5GUzogRkggdHJ1bmNhdGVkXG4iKTsKKwkJCQkqZW50cnkgPSBvbGQ7CisJCQkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CisJCQl9CisJCX0gZWxzZQorCQkJbWVtc2V0KCh1OCopKGVudHJ5LT5maCksIDAsIHNpemVvZigqZW50cnktPmZoKSk7CisJfQorCisJZW50cnktPmVvZiA9ICFwWzBdICYmIHBbMV07CisJcmV0dXJuIHA7Cit9CisKKy8qCisgKiBFbmNvZGUgQ09NTUlUIGFyZ3VtZW50cworICovCitzdGF0aWMgaW50CituZnMzX3hkcl9jb21taXRhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQoreworCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOworCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGFyZ3MtPm9mZnNldCk7CisJKnArKyA9IGh0b25sKGFyZ3MtPmNvdW50KTsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBORlMgWERSIGRlY29kZSBmdW5jdGlvbnMKKyAqLworCisvKgorICogRGVjb2RlIGF0dHJzdGF0IHJlcGx5LgorICovCitzdGF0aWMgaW50CituZnMzX3hkcl9hdHRyc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlpbnQJc3RhdHVzOworCisJaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkpCisJCXJldHVybiAtbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKKwl4ZHJfZGVjb2RlX2ZhdHRyKHAsIGZhdHRyKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlY29kZSBzdGF0dXMrd2NjX2RhdGEgcmVwbHkKKyAqIFNBVFRSLCBSRU1PVkUsIFJNRElSCisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX3djY3N0YXQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJaW50CXN0YXR1czsKKworCWlmICgoc3RhdHVzID0gbnRvaGwoKnArKykpKQorCQlzdGF0dXMgPSAtbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKKwl4ZHJfZGVjb2RlX3djY19kYXRhKHAsIGZhdHRyKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRGVjb2RlIExPT0tVUCByZXBseQorICovCitzdGF0aWMgaW50CituZnMzX3hkcl9sb29rdXByZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfZGlyb3ByZXMgKnJlcykKK3sKKwlpbnQJc3RhdHVzOworCisJaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkpIHsKKwkJc3RhdHVzID0gLW5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CisJfSBlbHNlIHsKKwkJaWYgKCEocCA9IHhkcl9kZWNvZGVfZmhhbmRsZShwLCByZXMtPmZoKSkpCisJCQlyZXR1cm4gLWVycm5vX05GU0VSUl9JTzsKKwkJcCA9IHhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIHJlcy0+ZmF0dHIpOworCX0KKwl4ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cihwLCByZXMtPmRpcl9hdHRyKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRGVjb2RlIEFDQ0VTUyByZXBseQorICovCitzdGF0aWMgaW50CituZnMzX3hkcl9hY2Nlc3NyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfYWNjZXNzcmVzICpyZXMpCit7CisJaW50CXN0YXR1cyA9IG50b2hsKCpwKyspOworCisJcCA9IHhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIHJlcy0+ZmF0dHIpOworCWlmIChzdGF0dXMpCisJCXJldHVybiAtbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKKwlyZXMtPmFjY2VzcyA9IG50b2hsKCpwKyspOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CituZnMzX3hkcl9yZWFkbGlua2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfcmVhZGxpbmthcmdzICphcmdzKQoreworCXN0cnVjdCBycGNfYXV0aCAqYXV0aCA9IHJlcS0+cnFfdGFzay0+dGtfYXV0aDsKKwl1bnNpZ25lZCBpbnQgcmVwbGVuOworCisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCisJLyogSW5saW5lIHRoZSBwYWdlIGFycmF5ICovCisJcmVwbGVuID0gKFJQQ19SRVBIRFJTSVpFICsgYXV0aC0+YXVfcnNsYWNrICsgTkZTM19yZWFkbGlua3Jlc19zeikgPDwgMjsKKwl4ZHJfaW5saW5lX3BhZ2VzKCZyZXEtPnJxX3Jjdl9idWYsIHJlcGxlbiwgYXJncy0+cGFnZXMsIGFyZ3MtPnBnYmFzZSwgYXJncy0+cGdsZW4pOworCXJldHVybiAwOworfQorCisvKgorICogRGVjb2RlIFJFQURMSU5LIHJlcGx5CisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX3JlYWRsaW5rcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCXN0cnVjdCB4ZHJfYnVmICpyY3ZidWYgPSAmcmVxLT5ycV9yY3ZfYnVmOworCXN0cnVjdCBrdmVjICppb3YgPSByY3ZidWYtPmhlYWQ7CisJaW50IGhkcmxlbiwgbGVuLCByZWN2ZDsKKwljaGFyCSprYWRkcjsKKwlpbnQJc3RhdHVzOworCisJc3RhdHVzID0gbnRvaGwoKnArKyk7CisJcCA9IHhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIGZhdHRyKTsKKworCWlmIChzdGF0dXMgIT0gMCkKKwkJcmV0dXJuIC1uZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworCisJLyogQ29udmVydCBsZW5ndGggb2Ygc3ltbGluayAqLworCWxlbiA9IG50b2hsKCpwKyspOworCWlmIChsZW4gPj0gcmN2YnVmLT5wYWdlX2xlbiB8fCBsZW4gPD0gMCkgeworCQlkcHJpbnRrKEtFUk5fV0FSTklORyAibmZzOiBzZXJ2ZXIgcmV0dXJuZWQgZ2lhbnQgc3ltbGluayFcbiIpOworCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwl9CisKKwloZHJsZW4gPSAodTggKikgcCAtICh1OCAqKSBpb3YtPmlvdl9iYXNlOworCWlmIChpb3YtPmlvdl9sZW4gPCBoZHJsZW4pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBSRUFETElOSyByZXBseSBoZWFkZXIgb3ZlcmZsb3dlZDoiCisJCQkJImxlbmd0aCAlZCA+ICVadVxuIiwgaGRybGVuLCBpb3YtPmlvdl9sZW4pOworCQlyZXR1cm4gLWVycm5vX05GU0VSUl9JTzsKKwl9IGVsc2UgaWYgKGlvdi0+aW92X2xlbiAhPSBoZHJsZW4pIHsKKwkJZHByaW50aygiTkZTOiBSRUFETElOSyBoZWFkZXIgaXMgc2hvcnQuIGlvdmVjIHdpbGwgYmUgc2hpZnRlZC5cbiIpOworCQl4ZHJfc2hpZnRfYnVmKHJjdmJ1ZiwgaW92LT5pb3ZfbGVuIC0gaGRybGVuKTsKKwl9CisJcmVjdmQgPSByZXEtPnJxX3Jjdl9idWYubGVuIC0gaGRybGVuOworCWlmIChyZWN2ZCA8IGxlbikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IHNlcnZlciBjaGVhdGluZyBpbiByZWFkbGluayByZXBseTogIgorCQkJCSJjb3VudCAldSA+IHJlY3ZkICV1XG4iLCBsZW4sIHJlY3ZkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogTlVMTCB0ZXJtaW5hdGUgdGhlIHN0cmluZyB3ZSBnb3QgKi8KKwlrYWRkciA9IChjaGFyKilrbWFwX2F0b21pYyhyY3ZidWYtPnBhZ2VzWzBdLCBLTV9VU0VSMCk7CisJa2FkZHJbbGVuK3JjdmJ1Zi0+cGFnZV9iYXNlXSA9ICdcMCc7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCXJldHVybiAwOworfQorCisvKgorICogRGVjb2RlIFJFQUQgcmVwbHkKKyAqLworc3RhdGljIGludAorbmZzM194ZHJfcmVhZHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3JlYWRyZXMgKnJlcykKK3sKKwlzdHJ1Y3Qga3ZlYyAqaW92ID0gcmVxLT5ycV9yY3ZfYnVmLmhlYWQ7CisJaW50CXN0YXR1cywgY291bnQsIG9jb3VudCwgcmVjdmQsIGhkcmxlbjsKKworCXN0YXR1cyA9IG50b2hsKCpwKyspOworCXAgPSB4ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cihwLCByZXMtPmZhdHRyKTsKKworCWlmIChzdGF0dXMgIT0gMCkKKwkJcmV0dXJuIC1uZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworCisJLyogRGVjb2RlIHJlcGx5IGNvdWxkIGFuZCBFT0YgZmxhZy4gTkZTdjMgaXMgc29tZXdoYXQgcmVkdW5kYW50CisJICogaW4gdGhhdCBpdCBwdXRzIHRoZSBjb3VudCBib3RoIGluIHRoZSByZXMgc3RydWN0IGFuZCBpbiB0aGUKKwkgKiBvcGFxdWUgZGF0YSBjb3VudC4gKi8KKwljb3VudCAgICA9IG50b2hsKCpwKyspOworCXJlcy0+ZW9mID0gbnRvaGwoKnArKyk7CisJb2NvdW50ICAgPSBudG9obCgqcCsrKTsKKworCWlmIChvY291bnQgIT0gY291bnQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBSRUFEIGNvdW50IGRvZXNuJ3QgbWF0Y2ggUlBDIG9wYXF1ZSBjb3VudC5cbiIpOworCQlyZXR1cm4gLWVycm5vX05GU0VSUl9JTzsKKwl9CisKKwloZHJsZW4gPSAodTggKikgcCAtICh1OCAqKSBpb3YtPmlvdl9iYXNlOworCWlmIChpb3YtPmlvdl9sZW4gPCBoZHJsZW4pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBSRUFEIHJlcGx5IGhlYWRlciBvdmVyZmxvd2VkOiIKKwkJCQkibGVuZ3RoICVkID4gJVp1XG4iLCBoZHJsZW4sIGlvdi0+aW92X2xlbik7CisgICAgICAgCQlyZXR1cm4gLWVycm5vX05GU0VSUl9JTzsKKwl9IGVsc2UgaWYgKGlvdi0+aW92X2xlbiAhPSBoZHJsZW4pIHsKKwkJZHByaW50aygiTkZTOiBSRUFEIGhlYWRlciBpcyBzaG9ydC4gaW92ZWMgd2lsbCBiZSBzaGlmdGVkLlxuIik7CisJCXhkcl9zaGlmdF9idWYoJnJlcS0+cnFfcmN2X2J1ZiwgaW92LT5pb3ZfbGVuIC0gaGRybGVuKTsKKwl9CisKKwlyZWN2ZCA9IHJlcS0+cnFfcmN2X2J1Zi5sZW4gLSBoZHJsZW47CisJaWYgKGNvdW50ID4gcmVjdmQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBzZXJ2ZXIgY2hlYXRpbmcgaW4gcmVhZCByZXBseTogIgorCQkJImNvdW50ICVkID4gcmVjdmQgJWRcbiIsIGNvdW50LCByZWN2ZCk7CisJCWNvdW50ID0gcmVjdmQ7CisJCXJlcy0+ZW9mID0gMDsKKwl9CisKKwlpZiAoY291bnQgPCByZXMtPmNvdW50KQorCQlyZXMtPmNvdW50ID0gY291bnQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBEZWNvZGUgV1JJVEUgcmVzcG9uc2UKKyAqLworc3RhdGljIGludAorbmZzM194ZHJfd3JpdGVyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc193cml0ZXJlcyAqcmVzKQoreworCWludAlzdGF0dXM7CisKKwlzdGF0dXMgPSBudG9obCgqcCsrKTsKKwlwID0geGRyX2RlY29kZV93Y2NfZGF0YShwLCByZXMtPmZhdHRyKTsKKworCWlmIChzdGF0dXMgIT0gMCkKKwkJcmV0dXJuIC1uZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworCisJcmVzLT5jb3VudCA9IG50b2hsKCpwKyspOworCXJlcy0+dmVyZi0+Y29tbWl0dGVkID0gKGVudW0gbmZzM19zdGFibGVfaG93KW50b2hsKCpwKyspOworCXJlcy0+dmVyZi0+dmVyaWZpZXJbMF0gPSAqcCsrOworCXJlcy0+dmVyZi0+dmVyaWZpZXJbMV0gPSAqcCsrOworCisJcmV0dXJuIHJlcy0+Y291bnQ7Cit9CisKKy8qCisgKiBEZWNvZGUgYSBDUkVBVEUgcmVzcG9uc2UKKyAqLworc3RhdGljIGludAorbmZzM194ZHJfY3JlYXRlcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX2Rpcm9wcmVzICpyZXMpCit7CisJaW50CXN0YXR1czsKKworCXN0YXR1cyA9IG50b2hsKCpwKyspOworCWlmIChzdGF0dXMgPT0gMCkgeworCQlpZiAoKnArKykgeworCQkJaWYgKCEocCA9IHhkcl9kZWNvZGVfZmhhbmRsZShwLCByZXMtPmZoKSkpCisJCQkJcmV0dXJuIC1lcnJub19ORlNFUlJfSU87CisJCQlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgcmVzLT5mYXR0cik7CisJCX0gZWxzZSB7CisJCQltZW1zZXQocmVzLT5maCwgMCwgc2l6ZW9mKCpyZXMtPmZoKSk7CisJCQkvKiBEbyBkZWNvZGUgcG9zdF9vcF9hdHRyIGJ1dCBzZXQgaXQgdG8gTlVMTCAqLworCQkJcCA9IHhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIHJlcy0+ZmF0dHIpOworCQkJcmVzLT5mYXR0ci0+dmFsaWQgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gLW5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CisJfQorCXAgPSB4ZHJfZGVjb2RlX3djY19kYXRhKHAsIHJlcy0+ZGlyX2F0dHIpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEZWNvZGUgUkVOQU1FIHJlcGx5CisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX3JlbmFtZXJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19yZW5hbWVyZXMgKnJlcykKK3sKKwlpbnQJc3RhdHVzOworCisJaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkgIT0gMCkKKwkJc3RhdHVzID0gLW5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CisJcCA9IHhkcl9kZWNvZGVfd2NjX2RhdGEocCwgcmVzLT5mcm9tYXR0cik7CisJcCA9IHhkcl9kZWNvZGVfd2NjX2RhdGEocCwgcmVzLT50b2F0dHIpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEZWNvZGUgTElOSyByZXBseQorICovCitzdGF0aWMgaW50CituZnMzX3hkcl9saW5rcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX2xpbmtyZXMgKnJlcykKK3sKKwlpbnQJc3RhdHVzOworCisJaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkgIT0gMCkKKwkJc3RhdHVzID0gLW5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CisJcCA9IHhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIHJlcy0+ZmF0dHIpOworCXAgPSB4ZHJfZGVjb2RlX3djY19kYXRhKHAsIHJlcy0+ZGlyX2F0dHIpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEZWNvZGUgRlNTVEFUIHJlcGx5CisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX2Zzc3RhdHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX2Zzc3RhdCAqcmVzKQoreworCWludAkJc3RhdHVzOworCisJc3RhdHVzID0gbnRvaGwoKnArKyk7CisKKwlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgcmVzLT5mYXR0cik7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gLW5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CisKKwlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmcmVzLT50Ynl0ZXMpOworCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZyZXMtPmZieXRlcyk7CisJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJnJlcy0+YWJ5dGVzKTsKKwlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmcmVzLT50ZmlsZXMpOworCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZyZXMtPmZmaWxlcyk7CisJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJnJlcy0+YWZpbGVzKTsKKworCS8qIGlnbm9yZSBpbnZhcnNlYyAqLworCXJldHVybiAwOworfQorCisvKgorICogRGVjb2RlIEZTSU5GTyByZXBseQorICovCitzdGF0aWMgaW50CituZnMzX3hkcl9mc2luZm9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19mc2luZm8gKnJlcykKK3sKKwlpbnQJCXN0YXR1czsKKworCXN0YXR1cyA9IG50b2hsKCpwKyspOworCisJcCA9IHhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIHJlcy0+ZmF0dHIpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJcmV0dXJuIC1uZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworCisJcmVzLT5ydG1heCAgPSBudG9obCgqcCsrKTsKKwlyZXMtPnJ0cHJlZiA9IG50b2hsKCpwKyspOworCXJlcy0+cnRtdWx0ID0gbnRvaGwoKnArKyk7CisJcmVzLT53dG1heCAgPSBudG9obCgqcCsrKTsKKwlyZXMtPnd0cHJlZiA9IG50b2hsKCpwKyspOworCXJlcy0+d3RtdWx0ID0gbnRvaGwoKnArKyk7CisJcmVzLT5kdHByZWYgPSBudG9obCgqcCsrKTsKKwlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmcmVzLT5tYXhmaWxlc2l6ZSk7CisKKwkvKiBpZ25vcmUgdGltZV9kZWx0YSBhbmQgcHJvcGVydGllcyAqLworCXJlcy0+bGVhc2VfdGltZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWNvZGUgUEFUSENPTkYgcmVwbHkKKyAqLworc3RhdGljIGludAorbmZzM194ZHJfcGF0aGNvbmZyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19wYXRoY29uZiAqcmVzKQoreworCWludAkJc3RhdHVzOworCisJc3RhdHVzID0gbnRvaGwoKnArKyk7CisKKwlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgcmVzLT5mYXR0cik7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gLW5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CisJcmVzLT5tYXhfbGluayA9IG50b2hsKCpwKyspOworCXJlcy0+bWF4X25hbWVsZW4gPSBudG9obCgqcCsrKTsKKworCS8qIGlnbm9yZSByZW1haW5pbmcgZmllbGRzICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWNvZGUgQ09NTUlUIHJlcGx5CisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX2NvbW1pdHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXMpCit7CisJaW50CQlzdGF0dXM7CisKKwlzdGF0dXMgPSBudG9obCgqcCsrKTsKKwlwID0geGRyX2RlY29kZV93Y2NfZGF0YShwLCByZXMtPmZhdHRyKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCXJldHVybiAtbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKKworCXJlcy0+dmVyZi0+dmVyaWZpZXJbMF0gPSAqcCsrOworCXJlcy0+dmVyZi0+dmVyaWZpZXJbMV0gPSAqcCsrOworCXJldHVybiAwOworfQorCisjaWZuZGVmIE1BWAorIyBkZWZpbmUgTUFYKGEsIGIpCSgoKGEpID4gKGIpKT8gKGEpIDogKGIpKQorI2VuZGlmCisKKyNkZWZpbmUgUFJPQyhwcm9jLCBhcmd0eXBlLCByZXN0eXBlLCB0aW1lcikJCQkJXAorW05GUzNQUk9DXyMjcHJvY10gPSB7CQkJCQkJCVwKKwkucF9wcm9jICAgICAgPSBORlMzUFJPQ18jI3Byb2MsCQkJCQlcCisJLnBfZW5jb2RlICAgID0gKGt4ZHJwcm9jX3QpIG5mczNfeGRyXyMjYXJndHlwZSwJCQlcCisJLnBfZGVjb2RlICAgID0gKGt4ZHJwcm9jX3QpIG5mczNfeGRyXyMjcmVzdHlwZSwJCQlcCisJLnBfYnVmc2l6ICAgID0gTUFYKE5GUzNfIyNhcmd0eXBlIyNfc3osTkZTM18jI3Jlc3R5cGUjI19zeikgPDwgMiwJXAorCS5wX3RpbWVyICAgICA9IHRpbWVyCQkJCQkJXAorCX0KKworc3RydWN0IHJwY19wcm9jaW5mbwluZnMzX3Byb2NlZHVyZXNbXSA9IHsKKyAgUFJPQyhHRVRBVFRSLAkJZmhhbmRsZSwJYXR0cnN0YXQsIDEpLAorICBQUk9DKFNFVEFUVFIsIAlzYXR0cmFyZ3MsCXdjY3N0YXQsIDApLAorICBQUk9DKExPT0tVUCwJCWRpcm9wYXJncywJbG9va3VwcmVzLCAyKSwKKyAgUFJPQyhBQ0NFU1MsCQlhY2Nlc3NhcmdzLAlhY2Nlc3NyZXMsIDEpLAorICBQUk9DKFJFQURMSU5LLAlyZWFkbGlua2FyZ3MsCXJlYWRsaW5rcmVzLCAzKSwKKyAgUFJPQyhSRUFELAkJcmVhZGFyZ3MsCXJlYWRyZXMsIDMpLAorICBQUk9DKFdSSVRFLAkJd3JpdGVhcmdzLAl3cml0ZXJlcywgNCksCisgIFBST0MoQ1JFQVRFLAkJY3JlYXRlYXJncywJY3JlYXRlcmVzLCAwKSwKKyAgUFJPQyhNS0RJUiwJCW1rZGlyYXJncywJY3JlYXRlcmVzLCAwKSwKKyAgUFJPQyhTWU1MSU5LLAkJc3ltbGlua2FyZ3MsCWNyZWF0ZXJlcywgMCksCisgIFBST0MoTUtOT0QsCQlta25vZGFyZ3MsCWNyZWF0ZXJlcywgMCksCisgIFBST0MoUkVNT1ZFLAkJZGlyb3BhcmdzLAl3Y2NzdGF0LCAwKSwKKyAgUFJPQyhSTURJUiwJCWRpcm9wYXJncywJd2Njc3RhdCwgMCksCisgIFBST0MoUkVOQU1FLAkJcmVuYW1lYXJncywJcmVuYW1lcmVzLCAwKSwKKyAgUFJPQyhMSU5LLAkJbGlua2FyZ3MsCWxpbmtyZXMsIDApLAorICBQUk9DKFJFQURESVIsCQlyZWFkZGlyYXJncywJcmVhZGRpcnJlcywgMyksCisgIFBST0MoUkVBRERJUlBMVVMsCXJlYWRkaXJhcmdzLAlyZWFkZGlycmVzLCAzKSwKKyAgUFJPQyhGU1NUQVQsCQlmaGFuZGxlLAlmc3N0YXRyZXMsIDApLAorICBQUk9DKEZTSU5GTywgIAlmaGFuZGxlLAlmc2luZm9yZXMsIDApLAorICBQUk9DKFBBVEhDT05GLAlmaGFuZGxlLAlwYXRoY29uZnJlcywgMCksCisgIFBST0MoQ09NTUlULAkJY29tbWl0YXJncywJY29tbWl0cmVzLCA1KSwKK307CisKK3N0cnVjdCBycGNfdmVyc2lvbgkJbmZzX3ZlcnNpb24zID0geworCS5udW1iZXIJCQk9IDMsCisJLm5ycHJvY3MJCT0gc2l6ZW9mKG5mczNfcHJvY2VkdXJlcykvc2l6ZW9mKG5mczNfcHJvY2VkdXJlc1swXSksCisJLnByb2NzCQkJPSBuZnMzX3Byb2NlZHVyZXMKK307CisKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0cHJvYy5jIGIvZnMvbmZzL25mczRwcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ1Y2IzZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy9uZnM0cHJvYy5jCkBAIC0wLDAgKzEsMjc4NiBAQAorLyoKKyAqICBmcy9uZnMvbmZzNHByb2MuYworICoKKyAqICBDbGllbnQtc2lkZSBwcm9jZWR1cmUgZGVjbGFyYXRpb25zIGZvciBORlN2NC4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIEtlbmRyaWNrIFNtaXRoIDxrbXNtaXRoQHVtaWNoLmVkdT4KKyAqICBBbmR5IEFkYW1zb24gICA8YW5kcm9zQHVtaWNoLmVkdT4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqCisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiAgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzNC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorCisjaW5jbHVkZSAiZGVsZWdhdGlvbi5oIgorCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWQkJTkZTREJHX1BST0MKKworI2RlZmluZSBORlM0X1BPTExfUkVUUllfTUlOCSgxKkhaKQorI2RlZmluZSBORlM0X1BPTExfUkVUUllfTUFYCSgxNSpIWikKKworc3RhdGljIGludCBuZnM0X2RvX2ZzaW5mbyhzdHJ1Y3QgbmZzX3NlcnZlciAqLCBzdHJ1Y3QgbmZzX2ZoICosIHN0cnVjdCBuZnNfZnNpbmZvICopOworc3RhdGljIGludCBuZnM0X2FzeW5jX2hhbmRsZV9lcnJvcihzdHJ1Y3QgcnBjX3Rhc2sgKiwgc3RydWN0IG5mc19zZXJ2ZXIgKik7CitzdGF0aWMgaW50IF9uZnM0X3Byb2NfYWNjZXNzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBuZnNfYWNjZXNzX2VudHJ5ICplbnRyeSk7CitzdGF0aWMgaW50IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBpbnQgZXJyb3Jjb2RlLCBzdHJ1Y3QgbmZzNF9leGNlcHRpb24gKmV4Y2VwdGlvbik7CitleHRlcm4gdTMyICpuZnM0X2RlY29kZV9kaXJlbnQodTMyICpwLCBzdHJ1Y3QgbmZzX2VudHJ5ICplbnRyeSwgaW50IHBsdXMpOworZXh0ZXJuIHN0cnVjdCBycGNfcHJvY2luZm8gbmZzNF9wcm9jZWR1cmVzW107CisKK2V4dGVybiBuZnM0X3N0YXRlaWQgemVyb19zdGF0ZWlkOworCisvKiBQcmV2ZW50IGxlYWtzIG9mIE5GU3Y0IGVycm9ycyBpbnRvIHVzZXJsYW5kICovCitpbnQgbmZzNF9tYXBfZXJyb3JzKGludCBlcnIpCit7CisJaWYgKGVyciA8IC0xMDAwKSB7CisJCWRwcmludGsoIiVzIGNvdWxkIG5vdCBoYW5kbGUgTkZTdjQgZXJyb3IgJWRcbiIsCisJCQkJX19GVU5DVElPTl9fLCAtZXJyKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBUaGlzIGlzIG91ciBzdGFuZGFyZCBiaXRtYXAgZm9yIEdFVEFUVFIgcmVxdWVzdHMuCisgKi8KK2NvbnN0IHUzMiBuZnM0X2ZhdHRyX2JpdG1hcFsyXSA9IHsKKwlGQVRUUjRfV09SRDBfVFlQRQorCXwgRkFUVFI0X1dPUkQwX0NIQU5HRQorCXwgRkFUVFI0X1dPUkQwX1NJWkUKKwl8IEZBVFRSNF9XT1JEMF9GU0lECisJfCBGQVRUUjRfV09SRDBfRklMRUlELAorCUZBVFRSNF9XT1JEMV9NT0RFCisJfCBGQVRUUjRfV09SRDFfTlVNTElOS1MKKwl8IEZBVFRSNF9XT1JEMV9PV05FUgorCXwgRkFUVFI0X1dPUkQxX09XTkVSX0dST1VQCisJfCBGQVRUUjRfV09SRDFfUkFXREVWCisJfCBGQVRUUjRfV09SRDFfU1BBQ0VfVVNFRAorCXwgRkFUVFI0X1dPUkQxX1RJTUVfQUNDRVNTCisJfCBGQVRUUjRfV09SRDFfVElNRV9NRVRBREFUQQorCXwgRkFUVFI0X1dPUkQxX1RJTUVfTU9ESUZZCit9OworCitjb25zdCB1MzIgbmZzNF9zdGF0ZnNfYml0bWFwWzJdID0geworCUZBVFRSNF9XT1JEMF9GSUxFU19BVkFJTAorCXwgRkFUVFI0X1dPUkQwX0ZJTEVTX0ZSRUUKKwl8IEZBVFRSNF9XT1JEMF9GSUxFU19UT1RBTCwKKwlGQVRUUjRfV09SRDFfU1BBQ0VfQVZBSUwKKwl8IEZBVFRSNF9XT1JEMV9TUEFDRV9GUkVFCisJfCBGQVRUUjRfV09SRDFfU1BBQ0VfVE9UQUwKK307CisKK3UzMiBuZnM0X3BhdGhjb25mX2JpdG1hcFsyXSA9IHsKKwlGQVRUUjRfV09SRDBfTUFYTElOSworCXwgRkFUVFI0X1dPUkQwX01BWE5BTUUsCisJMAorfTsKKworY29uc3QgdTMyIG5mczRfZnNpbmZvX2JpdG1hcFsyXSA9IHsgRkFUVFI0X1dPUkQwX01BWEZJTEVTSVpFCisJCQl8IEZBVFRSNF9XT1JEMF9NQVhSRUFECisJCQl8IEZBVFRSNF9XT1JEMF9NQVhXUklURQorCQkJfCBGQVRUUjRfV09SRDBfTEVBU0VfVElNRSwKKwkJCTAKK307CisKK3N0YXRpYyB2b2lkIG5mczRfc2V0dXBfcmVhZGRpcih1NjQgY29va2llLCB1MzIgKnZlcmlmaWVyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCXN0cnVjdCBuZnM0X3JlYWRkaXJfYXJnICpyZWFkZGlyKQoreworCXUzMiAqc3RhcnQsICpwOworCisJQlVHX09OKHJlYWRkaXItPmNvdW50IDwgODApOworCWlmIChjb29raWUgPiAyKSB7CisJCXJlYWRkaXItPmNvb2tpZSA9IChjb29raWUgPiAyKSA/IGNvb2tpZSA6IDA7CisJCW1lbWNweSgmcmVhZGRpci0+dmVyaWZpZXIsIHZlcmlmaWVyLCBzaXplb2YocmVhZGRpci0+dmVyaWZpZXIpKTsKKwkJcmV0dXJuOworCX0KKworCXJlYWRkaXItPmNvb2tpZSA9IDA7CisJbWVtc2V0KCZyZWFkZGlyLT52ZXJpZmllciwgMCwgc2l6ZW9mKHJlYWRkaXItPnZlcmlmaWVyKSk7CisJaWYgKGNvb2tpZSA9PSAyKQorCQlyZXR1cm47CisJCisJLyoKKwkgKiBORlN2NCBzZXJ2ZXJzIGRvIG5vdCByZXR1cm4gZW50cmllcyBmb3IgJy4nIGFuZCAnLi4nCisJICogVGhlcmVmb3JlLCB3ZSBmYWtlIHRoZXNlIGVudHJpZXMgaGVyZS4gIFdlIGxldCAnLicKKwkgKiBoYXZlIGNvb2tpZSAwIGFuZCAnLi4nIGhhdmUgY29va2llIDEuICBOb3RlIHRoYXQKKwkgKiB3aGVuIHRhbGtpbmcgdG8gdGhlIHNlcnZlciwgd2UgYWx3YXlzIHNlbmQgY29va2llIDAKKwkgKiBpbnN0ZWFkIG9mIDEgb3IgMi4KKwkgKi8KKwlzdGFydCA9IHAgPSAodTMyICopa21hcF9hdG9taWMoKnJlYWRkaXItPnBhZ2VzLCBLTV9VU0VSMCk7CisJCisJaWYgKGNvb2tpZSA9PSAwKSB7CisJCSpwKysgPSB4ZHJfb25lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0ICovCisJCSpwKysgPSB4ZHJfemVybzsgICAgICAgICAgICAgICAgICAgLyogY29va2llLCBmaXJzdCB3b3JkICovCisJCSpwKysgPSB4ZHJfb25lOyAgICAgICAgICAgICAgICAgICAvKiBjb29raWUsIHNlY29uZCB3b3JkICovCisJCSpwKysgPSB4ZHJfb25lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW50cnkgbGVuICovCisJCW1lbWNweShwLCAiLlwwXDBcMCIsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVudHJ5ICovCisJCXArKzsKKwkJKnArKyA9IHhkcl9vbmU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpdG1hcCBsZW5ndGggKi8KKwkJKnArKyA9IGh0b25sKEZBVFRSNF9XT1JEMF9GSUxFSUQpOyAgICAgICAgICAgICAvKiBiaXRtYXAgKi8KKwkJKnArKyA9IGh0b25sKDgpOyAgICAgICAgICAgICAgLyogYXR0cmlidXRlIGJ1ZmZlciBsZW5ndGggKi8KKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgZGVudHJ5LT5kX2lub2RlLT5pX2lubyk7CisJfQorCQorCSpwKysgPSB4ZHJfb25lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0ICovCisJKnArKyA9IHhkcl96ZXJvOyAgICAgICAgICAgICAgICAgICAvKiBjb29raWUsIGZpcnN0IHdvcmQgKi8KKwkqcCsrID0geGRyX3R3bzsgICAgICAgICAgICAgICAgICAgLyogY29va2llLCBzZWNvbmQgd29yZCAqLworCSpwKysgPSB4ZHJfdHdvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW50cnkgbGVuICovCisJbWVtY3B5KHAsICIuLlwwXDAiLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW50cnkgKi8KKwlwKys7CisJKnArKyA9IHhkcl9vbmU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpdG1hcCBsZW5ndGggKi8KKwkqcCsrID0gaHRvbmwoRkFUVFI0X1dPUkQwX0ZJTEVJRCk7ICAgICAgICAgICAgIC8qIGJpdG1hcCAqLworCSpwKysgPSBodG9ubCg4KTsgICAgICAgICAgICAgIC8qIGF0dHJpYnV0ZSBidWZmZXIgbGVuZ3RoICovCisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZS0+aV9pbm8pOworCisJcmVhZGRpci0+cGdiYXNlID0gKGNoYXIgKilwIC0gKGNoYXIgKilzdGFydDsKKwlyZWFkZGlyLT5jb3VudCAtPSByZWFkZGlyLT5wZ2Jhc2U7CisJa3VubWFwX2F0b21pYyhzdGFydCwgS01fVVNFUjApOworfQorCitzdGF0aWMgdm9pZAorcmVuZXdfbGVhc2Uoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgdW5zaWduZWQgbG9uZyB0aW1lc3RhbXApCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBzZXJ2ZXItPm5mczRfc3RhdGU7CisJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCWlmICh0aW1lX2JlZm9yZShjbHAtPmNsX2xhc3RfcmVuZXdhbCx0aW1lc3RhbXApKQorCQljbHAtPmNsX2xhc3RfcmVuZXdhbCA9IHRpbWVzdGFtcDsKKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2NoYW5nZWF0dHIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5mczRfY2hhbmdlX2luZm8gKmNpbmZvKQoreworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisKKwlpZiAoY2luZm8tPmJlZm9yZSA9PSBuZnNpLT5jaGFuZ2VfYXR0ciAmJiBjaW5mby0+YXRvbWljKQorCQluZnNpLT5jaGFuZ2VfYXR0ciA9IGNpbmZvLT5hZnRlcjsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX29wZW5fc3RhdGVpZChzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIG5mczRfc3RhdGVpZCAqc3RhdGVpZCwgaW50IG9wZW5fZmxhZ3MpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHN0YXRlLT5pbm9kZTsKKworCW9wZW5fZmxhZ3MgJj0gKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOworCS8qIFByb3RlY3QgYWdhaW5zdCBuZnM0X2ZpbmRfc3RhdGUoKSAqLworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3RhdGUtPnN0YXRlIHw9IG9wZW5fZmxhZ3M7CisJLyogTkIhIExpc3QgcmVvcmRlcmluZyAtIHNlZSB0aGUgcmVjbGFpbSBjb2RlIGZvciB3aHkuICAqLworCWlmICgob3Blbl9mbGFncyAmIEZNT0RFX1dSSVRFKSAmJiAwID09IHN0YXRlLT5ud3JpdGVycysrKQorCQlsaXN0X21vdmUoJnN0YXRlLT5vcGVuX3N0YXRlcywgJnN0YXRlLT5vd25lci0+c29fc3RhdGVzKTsKKwlpZiAob3Blbl9mbGFncyAmIEZNT0RFX1JFQUQpCisJCXN0YXRlLT5ucmVhZGVycysrOworCW1lbWNweSgmc3RhdGUtPnN0YXRlaWQsIHN0YXRlaWQsIHNpemVvZihzdGF0ZS0+c3RhdGVpZCkpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKK30KKworLyoKKyAqIE9QRU5fUkVDTEFJTToKKyAqIAlyZWNsYWltIHN0YXRlIG9uIHRoZSBzZXJ2ZXIgYWZ0ZXIgYSByZWJvb3QuCisgKiAJQXNzdW1lcyBjYWxsZXIgaXMgaG9sZGluZyB0aGUgc3AtPnNvX3NlbQorICovCitzdGF0aWMgaW50IF9uZnM0X29wZW5fcmVjbGFpbShzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3AsIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc3RhdGUtPmlub2RlOworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGlub2RlKTsKKwlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24gPSBORlNfSShpbm9kZSktPmRlbGVnYXRpb247CisJc3RydWN0IG5mc19vcGVuYXJncyBvX2FyZyA9IHsKKwkJLmZoID0gTkZTX0ZIKGlub2RlKSwKKwkJLnNlcWlkID0gc3AtPnNvX3NlcWlkLAorCQkuaWQgPSBzcC0+c29faWQsCisJCS5vcGVuX2ZsYWdzID0gc3RhdGUtPnN0YXRlLAorCQkuY2xpZW50aWQgPSBzZXJ2ZXItPm5mczRfc3RhdGUtPmNsX2NsaWVudGlkLAorCQkuY2xhaW0gPSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVMsCisJCS5iaXRtYXNrID0gc2VydmVyLT5hdHRyX2JpdG1hc2ssCisJfTsKKwlzdHJ1Y3QgbmZzX29wZW5yZXMgb19yZXMgPSB7CisJCS5zZXJ2ZXIgPSBzZXJ2ZXIsCS8qIEdycnIgKi8KKwl9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyAgICAgICA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9PUEVOX05PQVRUUl0sCisJCS5ycGNfYXJncCAgICAgICA9ICZvX2FyZywKKwkJLnJwY19yZXNwCT0gJm9fcmVzLAorCQkucnBjX2NyZWQJPSBzcC0+c29fY3JlZCwKKwl9OworCWludCBzdGF0dXM7CisKKwlpZiAoZGVsZWdhdGlvbiAhPSBOVUxMKSB7CisJCWlmICghKGRlbGVnYXRpb24tPmZsYWdzICYgTkZTX0RFTEVHQVRJT05fTkVFRF9SRUNMQUlNKSkgeworCQkJbWVtY3B5KCZzdGF0ZS0+c3RhdGVpZCwgJmRlbGVnYXRpb24tPnN0YXRlaWQsCisJCQkJCXNpemVvZihzdGF0ZS0+c3RhdGVpZCkpOworCQkJc2V0X2JpdChORlNfREVMRUdBVEVEX1NUQVRFLCAmc3RhdGUtPmZsYWdzKTsKKwkJCXJldHVybiAwOworCQl9CisJCW9fYXJnLnUuZGVsZWdhdGlvbl90eXBlID0gZGVsZWdhdGlvbi0+dHlwZTsKKwl9CisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhzZXJ2ZXItPmNsaWVudCwgJm1zZywgUlBDX1RBU0tfTk9JTlRSKTsKKwluZnM0X2luY3JlbWVudF9zZXFpZChzdGF0dXMsIHNwKTsKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJbWVtY3B5KCZzdGF0ZS0+c3RhdGVpZCwgJm9fcmVzLnN0YXRlaWQsIHNpemVvZihzdGF0ZS0+c3RhdGVpZCkpOworCQlpZiAob19yZXMuZGVsZWdhdGlvbl90eXBlICE9IDApIHsKKwkJCW5mc19pbm9kZV9yZWNsYWltX2RlbGVnYXRpb24oaW5vZGUsIHNwLT5zb19jcmVkLCAmb19yZXMpOworCQkJLyogRGlkIHRoZSBzZXJ2ZXIgaXNzdWUgYW4gaW1tZWRpYXRlIGRlbGVnYXRpb24gcmVjYWxsPyAqLworCQkJaWYgKG9fcmVzLmRvX3JlY2FsbCkKKwkJCQluZnNfYXN5bmNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24oaW5vZGUsICZvX3Jlcy5zdGF0ZWlkKTsKKwkJfQorCX0KKwljbGVhcl9iaXQoTkZTX0RFTEVHQVRFRF9TVEFURSwgJnN0YXRlLT5mbGFncyk7CisJLyogRW5zdXJlIHdlIHVwZGF0ZSB0aGUgaW5vZGUgYXR0cmlidXRlcyAqLworCU5GU19DQUNIRUlOVihpbm9kZSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBuZnM0X29wZW5fcmVjbGFpbShzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3AsIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihzdGF0ZS0+aW5vZGUpOworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKwlkbyB7CisJCWVyciA9IF9uZnM0X29wZW5fcmVjbGFpbShzcCwgc3RhdGUpOworCQlzd2l0Y2ggKGVycikgeworCQkJY2FzZSAwOgorCQkJY2FzZSAtTkZTNEVSUl9TVEFMRV9DTElFTlRJRDoKKwkJCWNhc2UgLU5GUzRFUlJfU1RBTEVfU1RBVEVJRDoKKwkJCWNhc2UgLU5GUzRFUlJfRVhQSVJFRDoKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihzZXJ2ZXIsIGVyciwgJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9uZnM0X29wZW5fZGVsZWdhdGlvbl9yZWNhbGwoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IG5mczRfc3RhdGVfb3duZXIgICpzcCAgPSBzdGF0ZS0+b3duZXI7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihpbm9kZSk7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsKKwlzdHJ1Y3QgbmZzX29wZW5hcmdzIGFyZyA9IHsKKwkJLmZoID0gTkZTX0ZIKHBhcmVudC0+ZF9pbm9kZSksCisJCS5jbGllbnRpZCA9IHNlcnZlci0+bmZzNF9zdGF0ZS0+Y2xfY2xpZW50aWQsCisJCS5uYW1lID0gJmRlbnRyeS0+ZF9uYW1lLAorCQkuaWQgPSBzcC0+c29faWQsCisJCS5zZXJ2ZXIgPSBzZXJ2ZXIsCisJCS5iaXRtYXNrID0gc2VydmVyLT5hdHRyX2JpdG1hc2ssCisJCS5jbGFpbSA9IE5GUzRfT1BFTl9DTEFJTV9ERUxFR0FURV9DVVIsCisJfTsKKwlzdHJ1Y3QgbmZzX29wZW5yZXMgcmVzID0geworCQkuc2VydmVyID0gc2VydmVyLAorCX07CisJc3RydWN0IAlycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyAgICAgICA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9PUEVOX05PQVRUUl0sCisJCS5ycGNfYXJncCAgICAgICA9ICZhcmcsCisJCS5ycGNfcmVzcCAgICAgICA9ICZyZXMsCisJCS5ycGNfY3JlZAk9IHNwLT5zb19jcmVkLAorCX07CisJaW50IHN0YXR1cyA9IDA7CisKKwlkb3duKCZzcC0+c29fc2VtYSk7CisJaWYgKCF0ZXN0X2JpdChORlNfREVMRUdBVEVEX1NUQVRFLCAmc3RhdGUtPmZsYWdzKSkKKwkJZ290byBvdXQ7CisJaWYgKHN0YXRlLT5zdGF0ZSA9PSAwKQorCQlnb3RvIG91dDsKKwlhcmcuc2VxaWQgPSBzcC0+c29fc2VxaWQ7CisJYXJnLm9wZW5fZmxhZ3MgPSBzdGF0ZS0+c3RhdGU7CisJbWVtY3B5KGFyZy51LmRlbGVnYXRpb24uZGF0YSwgc3RhdGUtPnN0YXRlaWQuZGF0YSwgc2l6ZW9mKGFyZy51LmRlbGVnYXRpb24uZGF0YSkpOworCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoc2VydmVyLT5jbGllbnQsICZtc2csIFJQQ19UQVNLX05PSU5UUik7CisJbmZzNF9pbmNyZW1lbnRfc2VxaWQoc3RhdHVzLCBzcCk7CisJaWYgKHN0YXR1cyA+PSAwKSB7CisJCW1lbWNweShzdGF0ZS0+c3RhdGVpZC5kYXRhLCByZXMuc3RhdGVpZC5kYXRhLAorCQkJCXNpemVvZihzdGF0ZS0+c3RhdGVpZC5kYXRhKSk7CisJCWNsZWFyX2JpdChORlNfREVMRUdBVEVEX1NUQVRFLCAmc3RhdGUtPmZsYWdzKTsKKwl9CitvdXQ6CisJdXAoJnNwLT5zb19zZW1hKTsKKwlkcHV0KHBhcmVudCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IG5mczRfb3Blbl9kZWxlZ2F0aW9uX3JlY2FsbChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGRlbnRyeS0+ZF9pbm9kZSk7CisJaW50IGVycjsKKwlkbyB7CisJCWVyciA9IF9uZnM0X29wZW5fZGVsZWdhdGlvbl9yZWNhbGwoZGVudHJ5LCBzdGF0ZSk7CisJCXN3aXRjaCAoZXJyKSB7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuIGVycjsKKwkJCWNhc2UgLU5GUzRFUlJfU1RBTEVfQ0xJRU5USUQ6CisJCQljYXNlIC1ORlM0RVJSX1NUQUxFX1NUQVRFSUQ6CisJCQljYXNlIC1ORlM0RVJSX0VYUElSRUQ6CisJCQkJLyogRG9uJ3QgcmVjYWxsIGEgZGVsZWdhdGlvbiBpZiBpdCB3YXMgbG9zdCAqLworCQkJCW5mczRfc2NoZWR1bGVfc3RhdGVfcmVjb3Zlcnkoc2VydmVyLT5uZnM0X3N0YXRlKTsKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihzZXJ2ZXIsIGVyciwgJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIGludCBfbmZzNF9wcm9jX29wZW5fY29uZmlybShzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQsIGNvbnN0IHN0cnVjdCBuZnNfZmggKmZoLCBzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3AsIG5mczRfc3RhdGVpZCAqc3RhdGVpZCkKK3sKKwlzdHJ1Y3QgbmZzX29wZW5fY29uZmlybWFyZ3MgYXJnID0geworCQkuZmggICAgICAgICAgICAgPSBmaCwKKwkJLnNlcWlkICAgICAgICAgID0gc3AtPnNvX3NlcWlkLAorCQkuc3RhdGVpZAk9ICpzdGF0ZWlkLAorCX07CisJc3RydWN0IG5mc19vcGVuX2NvbmZpcm1yZXMgcmVzOworCXN0cnVjdCAJcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgICAgICAgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfT1BFTl9DT05GSVJNXSwKKwkJLnJwY19hcmdwICAgICAgID0gJmFyZywKKwkJLnJwY19yZXNwICAgICAgID0gJnJlcywKKwkJLnJwY19jcmVkCT0gc3AtPnNvX2NyZWQsCisJfTsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhjbG50LCAmbXNnLCBSUENfVEFTS19OT0lOVFIpOworCW5mczRfaW5jcmVtZW50X3NlcWlkKHN0YXR1cywgc3ApOworCWlmIChzdGF0dXMgPj0gMCkKKwkJbWVtY3B5KHN0YXRlaWQsICZyZXMuc3RhdGVpZCwgc2l6ZW9mKCpzdGF0ZWlkKSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfbmZzNF9wcm9jX29wZW4oc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICAqc3AsIHN0cnVjdCBuZnNfb3BlbmFyZ3MgKm9fYXJnLCBzdHJ1Y3QgbmZzX29wZW5yZXMgKm9fcmVzKQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGRpcik7CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jID0gJm5mczRfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX09QRU5dLAorCQkucnBjX2FyZ3AgPSBvX2FyZywKKwkJLnJwY19yZXNwID0gb19yZXMsCisJCS5ycGNfY3JlZCA9IHNwLT5zb19jcmVkLAorCX07CisJaW50IHN0YXR1czsKKworCS8qIFVwZGF0ZSBzZXF1ZW5jZSBpZC4gVGhlIGNhbGxlciBtdXN0IHNlcmlhbGl6ZSEgKi8KKwlvX2FyZy0+c2VxaWQgPSBzcC0+c29fc2VxaWQ7CisJb19hcmctPmlkID0gc3AtPnNvX2lkOworCW9fYXJnLT5jbGllbnRpZCA9IHNwLT5zb19jbGllbnQtPmNsX2NsaWVudGlkOworCisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhzZXJ2ZXItPmNsaWVudCwgJm1zZywgUlBDX1RBU0tfTk9JTlRSKTsKKwluZnM0X2luY3JlbWVudF9zZXFpZChzdGF0dXMsIHNwKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCWdvdG8gb3V0OworCXVwZGF0ZV9jaGFuZ2VhdHRyKGRpciwgJm9fcmVzLT5jaW5mbyk7CisJaWYob19yZXMtPnJmbGFncyAmIE5GUzRfT1BFTl9SRVNVTFRfQ09ORklSTSkgeworCQlzdGF0dXMgPSBfbmZzNF9wcm9jX29wZW5fY29uZmlybShzZXJ2ZXItPmNsaWVudCwgJm9fcmVzLT5maCwKKwkJCQlzcCwgJm9fcmVzLT5zdGF0ZWlkKTsKKwkJaWYgKHN0YXR1cyAhPSAwKQorCQkJZ290byBvdXQ7CisJfQorCWlmICghKG9fcmVzLT5mX2F0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFIpKQorCQlzdGF0dXMgPSBzZXJ2ZXItPnJwY19vcHMtPmdldGF0dHIoc2VydmVyLCAmb19yZXMtPmZoLCBvX3Jlcy0+Zl9hdHRyKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IF9uZnM0X2RvX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIGludCBvcGVuZmxhZ3MpCit7CisJc3RydWN0IG5mc19hY2Nlc3NfZW50cnkgY2FjaGU7CisJaW50IG1hc2sgPSAwOworCWludCBzdGF0dXM7CisKKwlpZiAob3BlbmZsYWdzICYgRk1PREVfUkVBRCkKKwkJbWFzayB8PSBNQVlfUkVBRDsKKwlpZiAob3BlbmZsYWdzICYgRk1PREVfV1JJVEUpCisJCW1hc2sgfD0gTUFZX1dSSVRFOworCXN0YXR1cyA9IG5mc19hY2Nlc3NfZ2V0X2NhY2hlZChpbm9kZSwgY3JlZCwgJmNhY2hlKTsKKwlpZiAoc3RhdHVzID09IDApCisJCWdvdG8gb3V0OworCisJLyogQmUgY2xldmVyOiBhc2sgc2VydmVyIHRvIGNoZWNrIGZvciBhbGwgcG9zc2libGUgcmlnaHRzICovCisJY2FjaGUubWFzayA9IE1BWV9FWEVDIHwgTUFZX1dSSVRFIHwgTUFZX1JFQUQ7CisJY2FjaGUuY3JlZCA9IGNyZWQ7CisJY2FjaGUuamlmZmllcyA9IGppZmZpZXM7CisJc3RhdHVzID0gX25mczRfcHJvY19hY2Nlc3MoaW5vZGUsICZjYWNoZSk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gc3RhdHVzOworCW5mc19hY2Nlc3NfYWRkX2NhY2hlKGlub2RlLCAmY2FjaGUpOworb3V0OgorCWlmICgoY2FjaGUubWFzayAmIG1hc2spID09IG1hc2spCisJCXJldHVybiAwOworCXJldHVybiAtRUFDQ0VTOworfQorCisvKgorICogT1BFTl9FWFBJUkVEOgorICogCXJlY2xhaW0gc3RhdGUgb24gdGhlIHNlcnZlciBhZnRlciBhIG5ldHdvcmsgcGFydGl0aW9uLgorICogCUFzc3VtZXMgY2FsbGVyIGhvbGRzIHRoZSBhcHByb3ByaWF0ZSBsb2NrCisgKi8KK3N0YXRpYyBpbnQgX25mczRfb3Blbl9leHBpcmVkKHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IHBhcmVudC0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc3RhdGUtPmlub2RlOworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGRpcik7CisJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uID0gTkZTX0koaW5vZGUpLT5kZWxlZ2F0aW9uOworCXN0cnVjdCBuZnNfZmF0dHIgICAgICAgIGZfYXR0ciA9IHsKKwkJLnZhbGlkID0gMCwKKwl9OworCXN0cnVjdCBuZnNfb3BlbmFyZ3Mgb19hcmcgPSB7CisJCS5maCA9IE5GU19GSChkaXIpLAorCQkub3Blbl9mbGFncyA9IHN0YXRlLT5zdGF0ZSwKKwkJLm5hbWUgPSAmZGVudHJ5LT5kX25hbWUsCisJCS5iaXRtYXNrID0gc2VydmVyLT5hdHRyX2JpdG1hc2ssCisJCS5jbGFpbSA9IE5GUzRfT1BFTl9DTEFJTV9OVUxMLAorCX07CisJc3RydWN0IG5mc19vcGVucmVzIG9fcmVzID0geworCQkuZl9hdHRyID0gJmZfYXR0ciwKKwkJLnNlcnZlciA9IHNlcnZlciwKKwl9OworCWludCBzdGF0dXMgPSAwOworCisJaWYgKGRlbGVnYXRpb24gIT0gTlVMTCAmJiAhKGRlbGVnYXRpb24tPmZsYWdzICYgTkZTX0RFTEVHQVRJT05fTkVFRF9SRUNMQUlNKSkgeworCQlzdGF0dXMgPSBfbmZzNF9kb19hY2Nlc3MoaW5vZGUsIHNwLT5zb19jcmVkLCBzdGF0ZS0+c3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gb3V0OworCQltZW1jcHkoJnN0YXRlLT5zdGF0ZWlkLCAmZGVsZWdhdGlvbi0+c3RhdGVpZCwgc2l6ZW9mKHN0YXRlLT5zdGF0ZWlkKSk7CisJCXNldF9iaXQoTkZTX0RFTEVHQVRFRF9TVEFURSwgJnN0YXRlLT5mbGFncyk7CisJCWdvdG8gb3V0OworCX0KKwlzdGF0dXMgPSBfbmZzNF9wcm9jX29wZW4oZGlyLCBzcCwgJm9fYXJnLCAmb19yZXMpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBvdXRfbm9kZWxlZzsKKwkvKiBDaGVjayBpZiBmaWxlcyBkaWZmZXIgKi8KKwlpZiAoKGZfYXR0ci5tb2RlICYgU19JRk1UKSAhPSAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkpCisJCWdvdG8gb3V0X3N0YWxlOworCS8qIEhhcyB0aGUgZmlsZSBoYW5kbGUgY2hhbmdlZD8gKi8KKwlpZiAobmZzX2NvbXBhcmVfZmgoJm9fcmVzLmZoLCBORlNfRkgoaW5vZGUpKSAhPSAwKSB7CisJCS8qIFZlcmlmeSBpZiB0aGUgY2hhbmdlIGF0dHJpYnV0ZXMgYXJlIHRoZSBzYW1lICovCisJCWlmIChmX2F0dHIuY2hhbmdlX2F0dHIgIT0gTkZTX0koaW5vZGUpLT5jaGFuZ2VfYXR0cikKKwkJCWdvdG8gb3V0X3N0YWxlOworCQlpZiAobmZzX3NpemVfdG9fbG9mZl90KGZfYXR0ci5zaXplKSAhPSBpbm9kZS0+aV9zaXplKQorCQkJZ290byBvdXRfc3RhbGU7CisJCS8qIExldHMganVzdCBwcmV0ZW5kIHRoYXQgdGhpcyBpcyB0aGUgc2FtZSBmaWxlICovCisJCW5mc19jb3B5X2ZoKE5GU19GSChpbm9kZSksICZvX3Jlcy5maCk7CisJCU5GU19JKGlub2RlKS0+ZmlsZWlkID0gZl9hdHRyLmZpbGVpZDsKKwl9CisJbWVtY3B5KCZzdGF0ZS0+c3RhdGVpZCwgJm9fcmVzLnN0YXRlaWQsIHNpemVvZihzdGF0ZS0+c3RhdGVpZCkpOworCWlmIChvX3Jlcy5kZWxlZ2F0aW9uX3R5cGUgIT0gMCkgeworCQlpZiAoIShkZWxlZ2F0aW9uLT5mbGFncyAmIE5GU19ERUxFR0FUSU9OX05FRURfUkVDTEFJTSkpCisJCQluZnNfaW5vZGVfc2V0X2RlbGVnYXRpb24oaW5vZGUsIHNwLT5zb19jcmVkLCAmb19yZXMpOworCQllbHNlCisJCQluZnNfaW5vZGVfcmVjbGFpbV9kZWxlZ2F0aW9uKGlub2RlLCBzcC0+c29fY3JlZCwgJm9fcmVzKTsKKwl9CitvdXRfbm9kZWxlZzoKKwljbGVhcl9iaXQoTkZTX0RFTEVHQVRFRF9TVEFURSwgJnN0YXRlLT5mbGFncyk7CitvdXQ6CisJZHB1dChwYXJlbnQpOworCXJldHVybiBzdGF0dXM7CitvdXRfc3RhbGU6CisJc3RhdHVzID0gLUVTVEFMRTsKKwkvKiBJbnZhbGlkYXRlIHRoZSBzdGF0ZSBvd25lciBzbyB3ZSBkb24ndCBldmVyIHVzZSBpdCBhZ2FpbiAqLworCW5mczRfZHJvcF9zdGF0ZV9vd25lcihzcCk7CisJZF9kcm9wKGRlbnRyeSk7CisJLyogU2hvdWxkIHdlIGJlIHRyeWluZyB0byBjbG9zZSB0aGF0IHN0YXRlaWQ/ICovCisJZ290byBvdXRfbm9kZWxlZzsKK30KKworc3RhdGljIGludCBuZnM0X29wZW5fZXhwaXJlZChzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3AsIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koc3RhdGUtPmlub2RlKTsKKwlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4OworCWludCBzdGF0dXM7CisKKwlzcGluX2xvY2soJnN0YXRlLT5pbm9kZS0+aV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0eCwgJm5mc2ktPm9wZW5fZmlsZXMsIGxpc3QpIHsKKwkJaWYgKGN0eC0+c3RhdGUgIT0gc3RhdGUpCisJCQljb250aW51ZTsKKwkJZ2V0X25mc19vcGVuX2NvbnRleHQoY3R4KTsKKwkJc3Bpbl91bmxvY2soJnN0YXRlLT5pbm9kZS0+aV9sb2NrKTsKKwkJc3RhdHVzID0gX25mczRfb3Blbl9leHBpcmVkKHNwLCBzdGF0ZSwgY3R4LT5kZW50cnkpOworCQlwdXRfbmZzX29wZW5fY29udGV4dChjdHgpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlzcGluX3VubG9jaygmc3RhdGUtPmlub2RlLT5pX2xvY2spOworCXJldHVybiAtRU5PRU5UOworfQorCisvKgorICogUmV0dXJucyBhbiBuZnM0X3N0YXRlICsgYW4gZXh0cmEgcmVmZXJlbmNlIHRvIHRoZSBpbm9kZQorICovCitzdGF0aWMgaW50IF9uZnM0X29wZW5fZGVsZWdhdGVkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmbGFncywgc3RydWN0IHJwY19jcmVkICpjcmVkLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqKnJlcykKK3sKKwlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoaW5vZGUpOworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnM0X3N0YXRlOworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisJc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwID0gTlVMTDsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUgPSBOVUxMOworCWludCBvcGVuX2ZsYWdzID0gZmxhZ3MgJiAoRk1PREVfUkVBRHxGTU9ERV9XUklURSk7CisJaW50IGVycjsKKworCS8qIFByb3RlY3QgYWdhaW5zdCByZWJvb3QgcmVjb3ZlcnkgLSBOT1RFIE9SREVSISAqLworCWRvd25fcmVhZCgmY2xwLT5jbF9zZW0pOworCS8qIFByb3RlY3QgYWdhaW5zdCBkZWxlZ2F0aW9uIHJlY2FsbCAqLworCWRvd25fcmVhZCgmbmZzaS0+cndzZW0pOworCWRlbGVnYXRpb24gPSBORlNfSShpbm9kZSktPmRlbGVnYXRpb247CisJZXJyID0gLUVOT0VOVDsKKwlpZiAoZGVsZWdhdGlvbiA9PSBOVUxMIHx8IChkZWxlZ2F0aW9uLT50eXBlICYgb3Blbl9mbGFncykgIT0gb3Blbl9mbGFncykKKwkJZ290byBvdXRfZXJyOworCWVyciA9IC1FTk9NRU07CisJaWYgKCEoc3AgPSBuZnM0X2dldF9zdGF0ZV9vd25lcihzZXJ2ZXIsIGNyZWQpKSkgeworCQlkcHJpbnRrKCIlczogbmZzNF9nZXRfc3RhdGVfb3duZXIgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXRfZXJyOworCX0KKwlkb3duKCZzcC0+c29fc2VtYSk7CisJc3RhdGUgPSBuZnM0X2dldF9vcGVuX3N0YXRlKGlub2RlLCBzcCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCWdvdG8gb3V0X2VycjsKKworCWVyciA9IC1FTk9FTlQ7CisJaWYgKChzdGF0ZS0+c3RhdGUgJiBvcGVuX2ZsYWdzKSA9PSBvcGVuX2ZsYWdzKSB7CisJCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJCWlmIChvcGVuX2ZsYWdzICYgRk1PREVfUkVBRCkKKwkJCXN0YXRlLT5ucmVhZGVycysrOworCQlpZiAob3Blbl9mbGFncyAmIEZNT0RFX1dSSVRFKQorCQkJc3RhdGUtPm53cml0ZXJzKys7CisJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJZ290byBvdXRfb2s7CisJfSBlbHNlIGlmIChzdGF0ZS0+c3RhdGUgIT0gMCkKKwkJZ290byBvdXRfZXJyOworCisJbG9ja19rZXJuZWwoKTsKKwllcnIgPSBfbmZzNF9kb19hY2Nlc3MoaW5vZGUsIGNyZWQsIG9wZW5fZmxhZ3MpOworCXVubG9ja19rZXJuZWwoKTsKKwlpZiAoZXJyICE9IDApCisJCWdvdG8gb3V0X2VycjsKKwlzZXRfYml0KE5GU19ERUxFR0FURURfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpOworCXVwZGF0ZV9vcGVuX3N0YXRlaWQoc3RhdGUsICZkZWxlZ2F0aW9uLT5zdGF0ZWlkLCBvcGVuX2ZsYWdzKTsKK291dF9vazoKKwl1cCgmc3AtPnNvX3NlbWEpOworCW5mczRfcHV0X3N0YXRlX293bmVyKHNwKTsKKwl1cF9yZWFkKCZuZnNpLT5yd3NlbSk7CisJdXBfcmVhZCgmY2xwLT5jbF9zZW0pOworCWlncmFiKGlub2RlKTsKKwkqcmVzID0gc3RhdGU7CisJcmV0dXJuIDA7IAorb3V0X2VycjoKKwlpZiAoc3AgIT0gTlVMTCkgeworCQlpZiAoc3RhdGUgIT0gTlVMTCkKKwkJCW5mczRfcHV0X29wZW5fc3RhdGUoc3RhdGUpOworCQl1cCgmc3AtPnNvX3NlbWEpOworCQluZnM0X3B1dF9zdGF0ZV9vd25lcihzcCk7CisJfQorCXVwX3JlYWQoJm5mc2ktPnJ3c2VtKTsKKwl1cF9yZWFkKCZjbHAtPmNsX3NlbSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlICpuZnM0X29wZW5fZGVsZWdhdGVkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmbGFncywgc3RydWN0IHJwY19jcmVkICpjcmVkKQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJc3RydWN0IG5mczRfc3RhdGUgKnJlczsKKwlpbnQgZXJyOworCisJZG8geworCQllcnIgPSBfbmZzNF9vcGVuX2RlbGVnYXRlZChpbm9kZSwgZmxhZ3MsIGNyZWQsICZyZXMpOworCQlpZiAoZXJyID09IDApCisJCQlicmVhazsKKwkJcmVzID0gRVJSX1BUUihuZnM0X2hhbmRsZV9leGNlcHRpb24oTkZTX1NFUlZFUihpbm9kZSksCisJCQkJCWVyciwgJmV4Y2VwdGlvbikpOworCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqIFJldHVybnMgYW4gbmZzNF9zdGF0ZSArIGFuIHJlZmVyZW5jZWQgaW5vZGUKKyAqLworc3RhdGljIGludCBfbmZzNF9kb19vcGVuKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBmbGFncywgc3RydWN0IGlhdHRyICpzYXR0ciwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqKnJlcykKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAgKnNwOworCXN0cnVjdCBuZnM0X3N0YXRlICAgICAqc3RhdGUgPSBOVUxMOworCXN0cnVjdCBuZnNfc2VydmVyICAgICAgICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGRpcik7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBzZXJ2ZXItPm5mczRfc3RhdGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJaW50ICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCXN0cnVjdCBuZnNfZmF0dHIgICAgICAgIGZfYXR0ciA9IHsKKwkJLnZhbGlkICAgICAgICAgID0gMCwKKwl9OworCXN0cnVjdCBuZnNfb3BlbmFyZ3Mgb19hcmcgPSB7CisJCS5maCAgICAgICAgICAgICA9IE5GU19GSChkaXIpLAorCQkub3Blbl9mbGFncwk9IGZsYWdzLAorCQkubmFtZSAgICAgICAgICAgPSAmZGVudHJ5LT5kX25hbWUsCisJCS5zZXJ2ZXIgICAgICAgICA9IHNlcnZlciwKKwkJLmJpdG1hc2sgPSBzZXJ2ZXItPmF0dHJfYml0bWFzaywKKwkJLmNsYWltID0gTkZTNF9PUEVOX0NMQUlNX05VTEwsCisJfTsKKwlzdHJ1Y3QgbmZzX29wZW5yZXMgb19yZXMgPSB7CisJCS5mX2F0dHIgICAgICAgICA9ICZmX2F0dHIsCisJCS5zZXJ2ZXIgICAgICAgICA9IHNlcnZlciwKKwl9OworCisJLyogUHJvdGVjdCBhZ2FpbnN0IHJlYm9vdCByZWNvdmVyeSBjb25mbGljdHMgKi8KKwlkb3duX3JlYWQoJmNscC0+Y2xfc2VtKTsKKwlzdGF0dXMgPSAtRU5PTUVNOworCWlmICghKHNwID0gbmZzNF9nZXRfc3RhdGVfb3duZXIoc2VydmVyLCBjcmVkKSkpIHsKKwkJZHByaW50aygibmZzNF9kb19vcGVuOiBuZnM0X2dldF9zdGF0ZV9vd25lciBmYWlsZWQhXG4iKTsKKwkJZ290byBvdXRfZXJyOworCX0KKwlpZiAoZmxhZ3MgJiBPX0VYQ0wpIHsKKwkJdTMyICpwID0gKHUzMiAqKSBvX2FyZy51LnZlcmlmaWVyLmRhdGE7CisJCXBbMF0gPSBqaWZmaWVzOworCQlwWzFdID0gY3VycmVudC0+cGlkOworCX0gZWxzZQorCQlvX2FyZy51LmF0dHJzID0gc2F0dHI7CisJLyogU2VyaWFsaXphdGlvbiBmb3IgdGhlIHNlcXVlbmNlIGlkICovCisJZG93bigmc3AtPnNvX3NlbWEpOworCisJc3RhdHVzID0gX25mczRfcHJvY19vcGVuKGRpciwgc3AsICZvX2FyZywgJm9fcmVzKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCWdvdG8gb3V0X2VycjsKKworCXN0YXR1cyA9IC1FTk9NRU07CisJaW5vZGUgPSBuZnNfZmhnZXQoZGlyLT5pX3NiLCAmb19yZXMuZmgsICZmX2F0dHIpOworCWlmICghaW5vZGUpCisJCWdvdG8gb3V0X2VycjsKKwlzdGF0ZSA9IG5mczRfZ2V0X29wZW5fc3RhdGUoaW5vZGUsIHNwKTsKKwlpZiAoIXN0YXRlKQorCQlnb3RvIG91dF9lcnI7CisJdXBkYXRlX29wZW5fc3RhdGVpZChzdGF0ZSwgJm9fcmVzLnN0YXRlaWQsIGZsYWdzKTsKKwlpZiAob19yZXMuZGVsZWdhdGlvbl90eXBlICE9IDApCisJCW5mc19pbm9kZV9zZXRfZGVsZWdhdGlvbihpbm9kZSwgY3JlZCwgJm9fcmVzKTsKKwl1cCgmc3AtPnNvX3NlbWEpOworCW5mczRfcHV0X3N0YXRlX293bmVyKHNwKTsKKwl1cF9yZWFkKCZjbHAtPmNsX3NlbSk7CisJKnJlcyA9IHN0YXRlOworCXJldHVybiAwOworb3V0X2VycjoKKwlpZiAoc3AgIT0gTlVMTCkgeworCQlpZiAoc3RhdGUgIT0gTlVMTCkKKwkJCW5mczRfcHV0X29wZW5fc3RhdGUoc3RhdGUpOworCQl1cCgmc3AtPnNvX3NlbWEpOworCQluZnM0X3B1dF9zdGF0ZV9vd25lcihzcCk7CisJfQorCS8qIE5vdGU6IGNscC0+Y2xfc2VtIG11c3QgYmUgcmVsZWFzZWQgYmVmb3JlIG5mczRfcHV0X29wZW5fc3RhdGUoKSEgKi8KKwl1cF9yZWFkKCZjbHAtPmNsX3NlbSk7CisJaWYgKGlub2RlICE9IE5VTEwpCisJCWlwdXQoaW5vZGUpOworCSpyZXMgPSBOVUxMOworCXJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlICpuZnM0X2RvX29wZW4oc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGZsYWdzLCBzdHJ1Y3QgaWF0dHIgKnNhdHRyLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQpCit7CisJc3RydWN0IG5mczRfZXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHsgfTsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZSAqcmVzOworCWludCBzdGF0dXM7CisKKwlkbyB7CisJCXN0YXR1cyA9IF9uZnM0X2RvX29wZW4oZGlyLCBkZW50cnksIGZsYWdzLCBzYXR0ciwgY3JlZCwgJnJlcyk7CisJCWlmIChzdGF0dXMgPT0gMCkKKwkJCWJyZWFrOworCQkvKiBOT1RFOiBCQURfU0VRSUQgbWVhbnMgdGhlIHNlcnZlciBhbmQgY2xpZW50IGRpc2FncmVlIGFib3V0IHRoZQorCQkgKiBib29rLWtlZXBpbmcgdy5yLnQuIHN0YXRlLWNoYW5naW5nIG9wZXJhdGlvbnMKKwkJICogKE9QRU4vQ0xPU0UvTE9DSy9MT0NLVS4uLikKKwkJICogSXQgaXMgYWN0dWFsbHkgYSBzaWduIG9mIGEgYnVnIG9uIHRoZSBjbGllbnQgb3Igb24gdGhlIHNlcnZlci4KKwkJICoKKwkJICogSWYgd2UgcmVjZWl2ZSBhIEJBRF9TRVFJRCBlcnJvciBpbiB0aGUgcGFydGljdWxhciBjYXNlIG9mCisJCSAqIGRvaW5nIGFuIE9QRU4sIHdlIGFzc3VtZSB0aGF0IG5mczRfaW5jcmVtZW50X3NlcWlkKCkgd2lsbAorCQkgKiBoYXZlIHVuaGFzaGVkIHRoZSBvbGQgc3RhdGVfb3duZXIgZm9yIHVzLCBhbmQgdGhhdCB3ZSBjYW4KKwkJICogdGhlcmVmb3JlIHNhZmVseSByZXRyeSB1c2luZyBhIG5ldyBvbmUuIFdlIHNob3VsZCBzdGlsbCB3YXJuCisJCSAqIHRoZSB1c2VyIHRob3VnaC4uLgorCQkgKi8KKwkJaWYgKHN0YXR1cyA9PSAtTkZTNEVSUl9CQURfU0VRSUQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUzogdjQgc2VydmVyIHJldHVybmVkIGEgYmFkIHNlcXVlbmNlLWlkIGVycm9yIVxuIik7CisJCQlleGNlcHRpb24ucmV0cnkgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJcmVzID0gRVJSX1BUUihuZnM0X2hhbmRsZV9leGNlcHRpb24oTkZTX1NFUlZFUihkaXIpLAorCQkJCQlzdGF0dXMsICZleGNlcHRpb24pKTsKKwl9IHdoaWxlIChleGNlcHRpb24ucmV0cnkpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgX25mczRfZG9fc2V0YXR0cihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0ciwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLCBzdHJ1Y3QgaWF0dHIgKnNhdHRyLAorICAgICAgICAgICAgICAgIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSkKK3sKKyAgICAgICAgc3RydWN0IG5mc19zZXRhdHRyYXJncyAgYXJnID0geworICAgICAgICAgICAgICAgIC5maCAgICAgICAgICAgICA9IGZoYW5kbGUsCisgICAgICAgICAgICAgICAgLmlhcCAgICAgICAgICAgID0gc2F0dHIsCisJCS5zZXJ2ZXIJCT0gc2VydmVyLAorCQkuYml0bWFzayA9IHNlcnZlci0+YXR0cl9iaXRtYXNrLAorICAgICAgICB9OworICAgICAgICBzdHJ1Y3QgbmZzX3NldGF0dHJyZXMgIHJlcyA9IHsKKwkJLmZhdHRyCQk9IGZhdHRyLAorCQkuc2VydmVyCQk9IHNlcnZlciwKKyAgICAgICAgfTsKKyAgICAgICAgc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKyAgICAgICAgICAgICAgICAucnBjX3Byb2MgICAgICAgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfU0VUQVRUUl0sCisgICAgICAgICAgICAgICAgLnJwY19hcmdwICAgICAgID0gJmFyZywKKyAgICAgICAgICAgICAgICAucnBjX3Jlc3AgICAgICAgPSAmcmVzLAorICAgICAgICB9OworCisgICAgICAgIGZhdHRyLT52YWxpZCA9IDA7CisKKwlpZiAoc3RhdGUgIT0gTlVMTCkKKwkJbXNnLnJwY19jcmVkID0gc3RhdGUtPm93bmVyLT5zb19jcmVkOworCWlmIChzYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpCisJCW5mczRfY29weV9zdGF0ZWlkKCZhcmcuc3RhdGVpZCwgc3RhdGUsIE5VTEwpOworCWVsc2UKKwkJbWVtY3B5KCZhcmcuc3RhdGVpZCwgJnplcm9fc3RhdGVpZCwgc2l6ZW9mKGFyZy5zdGF0ZWlkKSk7CisKKwlyZXR1cm4gcnBjX2NhbGxfc3luYyhzZXJ2ZXItPmNsaWVudCwgJm1zZywgMCk7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9kb19zZXRhdHRyKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyLAorICAgICAgICAgICAgICAgIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUsIHN0cnVjdCBpYXR0ciAqc2F0dHIsCisgICAgICAgICAgICAgICAgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKwlkbyB7CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihzZXJ2ZXIsCisJCQkJX25mczRfZG9fc2V0YXR0cihzZXJ2ZXIsIGZhdHRyLCBmaGFuZGxlLCBzYXR0ciwKKwkJCQkJc3RhdGUpLAorCQkJCSZleGNlcHRpb24pOworCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IG5mczRfY2xvc2VkYXRhIHsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgbmZzX2Nsb3NlYXJncyBhcmc7CisJc3RydWN0IG5mc19jbG9zZXJlcyByZXM7Cit9OworCitzdGF0aWMgdm9pZCBuZnM0X2Nsb3NlX2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBuZnM0X2Nsb3NlZGF0YSAqY2FsbGRhdGEgPSAoc3RydWN0IG5mczRfY2xvc2VkYXRhICopdGFzay0+dGtfY2FsbGRhdGE7CisJc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlID0gY2FsbGRhdGEtPnN0YXRlOworCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcCA9IHN0YXRlLT5vd25lcjsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihjYWxsZGF0YS0+aW5vZGUpOworCisgICAgICAgIC8qIGhtbS4gd2UgYXJlIGRvbmUgd2l0aCB0aGUgaW5vZGUsIGFuZCBpbiB0aGUgcHJvY2VzcyBvZiBmcmVlaW5nCisJICogdGhlIHN0YXRlX293bmVyLiB3ZSBrZWVwIHRoaXMgYXJvdW5kIHRvIHByb2Nlc3MgZXJyb3JzCisJICovCisJbmZzNF9pbmNyZW1lbnRfc2VxaWQodGFzay0+dGtfc3RhdHVzLCBzcCk7CisJc3dpdGNoICh0YXNrLT50a19zdGF0dXMpIHsKKwkJY2FzZSAwOgorCQkJbWVtY3B5KCZzdGF0ZS0+c3RhdGVpZCwgJmNhbGxkYXRhLT5yZXMuc3RhdGVpZCwKKwkJCQkJc2l6ZW9mKHN0YXRlLT5zdGF0ZWlkKSk7CisJCQlicmVhazsKKwkJY2FzZSAtTkZTNEVSUl9TVEFMRV9TVEFURUlEOgorCQljYXNlIC1ORlM0RVJSX0VYUElSRUQ6CisJCQlzdGF0ZS0+c3RhdGUgPSBjYWxsZGF0YS0+YXJnLm9wZW5fZmxhZ3M7CisJCQluZnM0X3NjaGVkdWxlX3N0YXRlX3JlY292ZXJ5KHNlcnZlci0+bmZzNF9zdGF0ZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChuZnM0X2FzeW5jX2hhbmRsZV9lcnJvcih0YXNrLCBzZXJ2ZXIpID09IC1FQUdBSU4pIHsKKwkJCQlycGNfcmVzdGFydF9jYWxsKHRhc2spOworCQkJCXJldHVybjsKKwkJCX0KKwl9CisJc3RhdGUtPnN0YXRlID0gY2FsbGRhdGEtPmFyZy5vcGVuX2ZsYWdzOworCW5mczRfcHV0X29wZW5fc3RhdGUoc3RhdGUpOworCXVwKCZzcC0+c29fc2VtYSk7CisJbmZzNF9wdXRfc3RhdGVfb3duZXIoc3ApOworCXVwX3JlYWQoJnNlcnZlci0+bmZzNF9zdGF0ZS0+Y2xfc2VtKTsKKwlrZnJlZShjYWxsZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5mczRfY2xvc2VfY2FsbChzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQsIHN0cnVjdCBuZnM0X2Nsb3NlZGF0YSAqY2FsbGRhdGEpCit7CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jID0gJm5mczRfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX0NMT1NFXSwKKwkJLnJwY19hcmdwID0gJmNhbGxkYXRhLT5hcmcsCisJCS5ycGNfcmVzcCA9ICZjYWxsZGF0YS0+cmVzLAorCQkucnBjX2NyZWQgPSBjYWxsZGF0YS0+c3RhdGUtPm93bmVyLT5zb19jcmVkLAorCX07CisJaWYgKGNhbGxkYXRhLT5hcmcub3Blbl9mbGFncyAhPSAwKQorCQltc2cucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfT1BFTl9ET1dOR1JBREVdOworCXJldHVybiBycGNfY2FsbF9hc3luYyhjbG50LCAmbXNnLCAwLCBuZnM0X2Nsb3NlX2RvbmUsIGNhbGxkYXRhKTsKK30KKworLyogCisgKiBJdCBpcyBwb3NzaWJsZSBmb3IgZGF0YSB0byBiZSByZWFkL3dyaXR0ZW4gZnJvbSBhIG1lbS1tYXBwZWQgZmlsZSAKKyAqIGFmdGVyIHRoZSBzeXNfY2xvc2UgY2FsbCAod2hpY2ggaGl0cyB0aGUgdmZzIGxheWVyIGFzIGEgZmx1c2gpLgorICogVGhpcyBtZWFucyB0aGF0IHdlIGNhbid0IHNhZmVseSBjYWxsIG5mc3Y0IGNsb3NlIG9uIGEgZmlsZSB1bnRpbCAKKyAqIHRoZSBpbm9kZSBpcyBjbGVhcmVkLiBUaGlzIGluIHR1cm4gbWVhbnMgdGhhdCB3ZSBhcmUgbm90IGdvb2QKKyAqIE5GU3Y0IGNpdGl6ZW5zIC0gd2UgZG8gbm90IGluZGljYXRlIHRvIHRoZSBzZXJ2ZXIgdG8gdXBkYXRlIHRoZSBmaWxlJ3MgCisgKiBzaGFyZSBzdGF0ZSBldmVuIHdoZW4gd2UgYXJlIGRvbmUgd2l0aCBvbmUgb2YgdGhlIHRocmVlIHNoYXJlIAorICogc3RhdGVpZCdzIGluIHRoZSBpbm9kZS4KKyAqCisgKiBOT1RFOiBDYWxsZXIgbXVzdCBiZSBob2xkaW5nIHRoZSBzcC0+c29fb3duZXIgc2VtYXBob3JlIQorICovCitpbnQgbmZzNF9kb19jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIG1vZGVfdCBtb2RlKSAKK3sKKwlzdHJ1Y3QgbmZzNF9jbG9zZWRhdGEgKmNhbGxkYXRhOworCWludCBzdGF0dXM7CisKKwkvKiBUZWxsIGNhbGxlciB3ZSdyZSBkb25lICovCisJaWYgKHRlc3RfYml0KE5GU19ERUxFR0FURURfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpKSB7CisJCXN0YXRlLT5zdGF0ZSA9IG1vZGU7CisJCXJldHVybiAwOworCX0KKwljYWxsZGF0YSA9IChzdHJ1Y3QgbmZzNF9jbG9zZWRhdGEgKilrbWFsbG9jKHNpemVvZigqY2FsbGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2FsbGRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJY2FsbGRhdGEtPmlub2RlID0gaW5vZGU7CisJY2FsbGRhdGEtPnN0YXRlID0gc3RhdGU7CisJY2FsbGRhdGEtPmFyZy5maCA9IE5GU19GSChpbm9kZSk7CisJLyogU2VyaWFsaXphdGlvbiBmb3IgdGhlIHNlcXVlbmNlIGlkICovCisJY2FsbGRhdGEtPmFyZy5zZXFpZCA9IHN0YXRlLT5vd25lci0+c29fc2VxaWQ7CisJY2FsbGRhdGEtPmFyZy5vcGVuX2ZsYWdzID0gbW9kZTsKKwltZW1jcHkoJmNhbGxkYXRhLT5hcmcuc3RhdGVpZCwgJnN0YXRlLT5zdGF0ZWlkLAorCQkJc2l6ZW9mKGNhbGxkYXRhLT5hcmcuc3RhdGVpZCkpOworCXN0YXR1cyA9IG5mczRfY2xvc2VfY2FsbChORlNfU0VSVkVSKGlub2RlKS0+Y2xpZW50LCBjYWxsZGF0YSk7CisJLyoKKwkgKiBSZXR1cm4gLUVJTlBST0dSRVNTIG9uIHN1Y2Nlc3MgaW4gb3JkZXIgdG8gaW5kaWNhdGUgdG8gdGhlCisJICogY2FsbGVyIHRoYXQgYW4gYXN5bmNocm9ub3VzIFJQQyBjYWxsIGhhcyBiZWVuIGxhdW5jaGVkLCBhbmQKKwkgKiB0aGF0IGl0IHdpbGwgcmVsZWFzZSB0aGUgc2VtYXBob3JlcyBvbiBjb21wbGV0aW9uLgorCSAqLworCXJldHVybiAoc3RhdHVzID09IDApID8gLUVJTlBST0dSRVNTIDogc3RhdHVzOworfQorCitzdHJ1Y3QgaW5vZGUgKgorbmZzNF9hdG9taWNfb3BlbihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgaWF0dHIgYXR0cjsKKwlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQ7CisJc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlOworCisJaWYgKG5kLT5mbGFncyAmIExPT0tVUF9DUkVBVEUpIHsKKwkJYXR0ci5pYV9tb2RlID0gbmQtPmludGVudC5vcGVuLmNyZWF0ZV9tb2RlOworCQlhdHRyLmlhX3ZhbGlkID0gQVRUUl9NT0RFOworCQlpZiAoIUlTX1BPU0lYQUNMKGRpcikpCisJCQlhdHRyLmlhX21vZGUgJj0gfmN1cnJlbnQtPmZzLT51bWFzazsKKwl9IGVsc2UgeworCQlhdHRyLmlhX3ZhbGlkID0gMDsKKwkJQlVHX09OKG5kLT5pbnRlbnQub3Blbi5mbGFncyAmIE9fQ1JFQVQpOworCX0KKworCWNyZWQgPSBycGNhdXRoX2xvb2t1cGNyZWQoTkZTX1NFUlZFUihkaXIpLT5jbGllbnQtPmNsX2F1dGgsIDApOworCWlmIChJU19FUlIoY3JlZCkpCisJCXJldHVybiAoc3RydWN0IGlub2RlICopY3JlZDsKKwlzdGF0ZSA9IG5mczRfZG9fb3BlbihkaXIsIGRlbnRyeSwgbmQtPmludGVudC5vcGVuLmZsYWdzLCAmYXR0ciwgY3JlZCk7CisJcHV0X3JwY2NyZWQoY3JlZCk7CisJaWYgKElTX0VSUihzdGF0ZSkpCisJCXJldHVybiAoc3RydWN0IGlub2RlICopc3RhdGU7CisJcmV0dXJuIHN0YXRlLT5pbm9kZTsKK30KKworaW50CituZnM0X29wZW5fcmV2YWxpZGF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgb3BlbmZsYWdzKQoreworCXN0cnVjdCBycGNfY3JlZCAqY3JlZDsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCWNyZWQgPSBycGNhdXRoX2xvb2t1cGNyZWQoTkZTX1NFUlZFUihkaXIpLT5jbGllbnQtPmNsX2F1dGgsIDApOworCWlmIChJU19FUlIoY3JlZCkpCisJCXJldHVybiBQVFJfRVJSKGNyZWQpOworCXN0YXRlID0gbmZzNF9vcGVuX2RlbGVnYXRlZChkZW50cnktPmRfaW5vZGUsIG9wZW5mbGFncywgY3JlZCk7CisJaWYgKElTX0VSUihzdGF0ZSkpCisJCXN0YXRlID0gbmZzNF9kb19vcGVuKGRpciwgZGVudHJ5LCBvcGVuZmxhZ3MsIE5VTEwsIGNyZWQpOworCXB1dF9ycGNjcmVkKGNyZWQpOworCWlmIChzdGF0ZSA9PSBFUlJfUFRSKC1FTk9FTlQpICYmIGRlbnRyeS0+ZF9pbm9kZSA9PSAwKQorCQlyZXR1cm4gMTsKKwlpZiAoSVNfRVJSKHN0YXRlKSkKKwkJcmV0dXJuIDA7CisJaW5vZGUgPSBzdGF0ZS0+aW5vZGU7CisJaWYgKGlub2RlID09IGRlbnRyeS0+ZF9pbm9kZSkgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIDE7CisJfQorCWRfZHJvcChkZW50cnkpOworCW5mczRfY2xvc2Vfc3RhdGUoc3RhdGUsIG9wZW5mbGFncyk7CisJaXB1dChpbm9kZSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBfbmZzNF9zZXJ2ZXJfY2FwYWJpbGl0aWVzKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCit7CisJc3RydWN0IG5mczRfc2VydmVyX2NhcHNfcmVzIHJlcyA9IHt9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9TRVJWRVJfQ0FQU10sCisJCS5ycGNfYXJncCA9IGZoYW5kbGUsCisJCS5ycGNfcmVzcCA9ICZyZXMsCisJfTsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhzZXJ2ZXItPmNsaWVudCwgJm1zZywgMCk7CisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCW1lbWNweShzZXJ2ZXItPmF0dHJfYml0bWFzaywgcmVzLmF0dHJfYml0bWFzaywgc2l6ZW9mKHNlcnZlci0+YXR0cl9iaXRtYXNrKSk7CisJCWlmIChyZXMuYXR0cl9iaXRtYXNrWzBdICYgRkFUVFI0X1dPUkQwX0FDTCkKKwkJCXNlcnZlci0+Y2FwcyB8PSBORlNfQ0FQX0FDTFM7CisJCWlmIChyZXMuaGFzX2xpbmtzICE9IDApCisJCQlzZXJ2ZXItPmNhcHMgfD0gTkZTX0NBUF9IQVJETElOS1M7CisJCWlmIChyZXMuaGFzX3N5bWxpbmtzICE9IDApCisJCQlzZXJ2ZXItPmNhcHMgfD0gTkZTX0NBUF9TWU1MSU5LUzsKKwkJc2VydmVyLT5hY2xfYml0bWFzayA9IHJlcy5hY2xfYml0bWFzazsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBuZnM0X3NlcnZlcl9jYXBhYmlsaXRpZXMoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSkKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCWludCBlcnI7CisJZG8geworCQllcnIgPSBuZnM0X2hhbmRsZV9leGNlcHRpb24oc2VydmVyLAorCQkJCV9uZnM0X3NlcnZlcl9jYXBhYmlsaXRpZXMoc2VydmVyLCBmaGFuZGxlKSwKKwkJCQkmZXhjZXB0aW9uKTsKKwl9IHdoaWxlIChleGNlcHRpb24ucmV0cnkpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX25mczRfbG9va3VwX3Jvb3Qoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwKKwkJc3RydWN0IG5mc19mc2luZm8gKmluZm8pCit7CisJc3RydWN0IG5mc19mYXR0ciAqCWZhdHRyID0gaW5mby0+ZmF0dHI7CisJc3RydWN0IG5mczRfbG9va3VwX3Jvb3RfYXJnIGFyZ3MgPSB7CisJCS5iaXRtYXNrID0gbmZzNF9mYXR0cl9iaXRtYXAsCisJfTsKKwlzdHJ1Y3QgbmZzNF9sb29rdXBfcmVzIHJlcyA9IHsKKwkJLnNlcnZlciA9IHNlcnZlciwKKwkJLmZhdHRyID0gZmF0dHIsCisJCS5maCA9IGZoYW5kbGUsCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfTE9PS1VQX1JPT1RdLAorCQkucnBjX2FyZ3AgPSAmYXJncywKKwkJLnJwY19yZXNwID0gJnJlcywKKwl9OworCWZhdHRyLT52YWxpZCA9IDA7CisJcmV0dXJuIHJwY19jYWxsX3N5bmMoc2VydmVyLT5jbGllbnQsICZtc2csIDApOworfQorCitzdGF0aWMgaW50IG5mczRfbG9va3VwX3Jvb3Qoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwKKwkJc3RydWN0IG5mc19mc2luZm8gKmluZm8pCit7CisJc3RydWN0IG5mczRfZXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHsgfTsKKwlpbnQgZXJyOworCWRvIHsKKwkJZXJyID0gbmZzNF9oYW5kbGVfZXhjZXB0aW9uKHNlcnZlciwKKwkJCQlfbmZzNF9sb29rdXBfcm9vdChzZXJ2ZXIsIGZoYW5kbGUsIGluZm8pLAorCQkJCSZleGNlcHRpb24pOworCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBuZnM0X3Byb2NfZ2V0X3Jvb3Qoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwKKwkJc3RydWN0IG5mc19mc2luZm8gKmluZm8pCit7CisJc3RydWN0IG5mc19mYXR0ciAqCWZhdHRyID0gaW5mby0+ZmF0dHI7CisJdW5zaWduZWQgY2hhciAqCQlwOworCXN0cnVjdCBxc3RyCQlxOworCXN0cnVjdCBuZnM0X2xvb2t1cF9hcmcgYXJncyA9IHsKKwkJLmRpcl9maCA9IGZoYW5kbGUsCisJCS5uYW1lID0gJnEsCisJCS5iaXRtYXNrID0gbmZzNF9mYXR0cl9iaXRtYXAsCisJfTsKKwlzdHJ1Y3QgbmZzNF9sb29rdXBfcmVzIHJlcyA9IHsKKwkJLnNlcnZlciA9IHNlcnZlciwKKwkJLmZhdHRyID0gZmF0dHIsCisJCS5maCA9IGZoYW5kbGUsCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfTE9PS1VQXSwKKwkJLnJwY19hcmdwID0gJmFyZ3MsCisJCS5ycGNfcmVzcCA9ICZyZXMsCisJfTsKKwlpbnQgc3RhdHVzOworCisJLyoKKwkgKiBOb3cgd2UgZG8gYSBzZXBhcmF0ZSBMT09LVVAgZm9yIGVhY2ggY29tcG9uZW50IG9mIHRoZSBtb3VudCBwYXRoLgorCSAqIFRoZSBMT09LVVBzIGFyZSBkb25lIHNlcGFyYXRlbHkgc28gdGhhdCB3ZSBjYW4gY29udmVuaWVudGx5CisJICogY2F0Y2ggYW4gRVJSX1dST05HU0VDIGlmIGl0IG9jY3VycyBhbG9uZyB0aGUgd2F5Li4uCisJICovCisJc3RhdHVzID0gbmZzNF9sb29rdXBfcm9vdChzZXJ2ZXIsIGZoYW5kbGUsIGluZm8pOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCisJcCA9IHNlcnZlci0+bW50X3BhdGg7CisJZm9yICg7OykgeworCQlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCisJCXdoaWxlICgqcCA9PSAnLycpCisJCQlwKys7CisJCWlmICghKnApCisJCQlicmVhazsKKwkJcS5uYW1lID0gcDsKKwkJd2hpbGUgKCpwICYmICgqcCAhPSAnLycpKQorCQkJcCsrOworCQlxLmxlbiA9IHAgLSBxLm5hbWU7CisKKwkJZG8geworCQkJZmF0dHItPnZhbGlkID0gMDsKKwkJCXN0YXR1cyA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihzZXJ2ZXIsCisJCQkJCXJwY19jYWxsX3N5bmMoc2VydmVyLT5jbGllbnQsICZtc2csIDApLAorCQkJCQkmZXhjZXB0aW9uKTsKKwkJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwkJaWYgKHN0YXR1cyA9PSAwKQorCQkJY29udGludWU7CisJCWlmIChzdGF0dXMgPT0gLUVOT0VOVCkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJORlM6IG1vdW50IHBhdGggJXMgZG9lcyBub3QgZXhpc3QhXG4iLCBzZXJ2ZXItPm1udF9wYXRoKTsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiTkZTOiBzdWdnZXN0aW9uOiB0cnkgbW91bnRpbmcgJy8nIGluc3RlYWQuXG4iKTsKKwkJfQorCQlicmVhazsKKwl9CisJaWYgKHN0YXR1cyA9PSAwKQorCQlzdGF0dXMgPSBuZnM0X3NlcnZlcl9jYXBhYmlsaXRpZXMoc2VydmVyLCBmaGFuZGxlKTsKKwlpZiAoc3RhdHVzID09IDApCisJCXN0YXR1cyA9IG5mczRfZG9fZnNpbmZvKHNlcnZlciwgZmhhbmRsZSwgaW5mbyk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfbmZzNF9wcm9jX2dldGF0dHIoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJc3RydWN0IG5mczRfZ2V0YXR0cl9hcmcgYXJncyA9IHsKKwkJLmZoID0gZmhhbmRsZSwKKwkJLmJpdG1hc2sgPSBzZXJ2ZXItPmF0dHJfYml0bWFzaywKKwl9OworCXN0cnVjdCBuZnM0X2dldGF0dHJfcmVzIHJlcyA9IHsKKwkJLmZhdHRyID0gZmF0dHIsCisJCS5zZXJ2ZXIgPSBzZXJ2ZXIsCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfR0VUQVRUUl0sCisJCS5ycGNfYXJncCA9ICZhcmdzLAorCQkucnBjX3Jlc3AgPSAmcmVzLAorCX07CisJCisJZmF0dHItPnZhbGlkID0gMDsKKwlyZXR1cm4gcnBjX2NhbGxfc3luYyhzZXJ2ZXItPmNsaWVudCwgJm1zZywgMCk7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9wcm9jX2dldGF0dHIoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJc3RydWN0IG5mczRfZXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHsgfTsKKwlpbnQgZXJyOworCWRvIHsKKwkJZXJyID0gbmZzNF9oYW5kbGVfZXhjZXB0aW9uKHNlcnZlciwKKwkJCQlfbmZzNF9wcm9jX2dldGF0dHIoc2VydmVyLCBmaGFuZGxlLCBmYXR0ciksCisJCQkJJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCisvKiAKKyAqIFRoZSBmaWxlIGlzIG5vdCBjbG9zZWQgaWYgaXQgaXMgb3BlbmVkIGR1ZSB0byB0aGUgYSByZXF1ZXN0IHRvIGNoYW5nZQorICogdGhlIHNpemUgb2YgdGhlIGZpbGUuIFRoZSBvcGVuIGNhbGwgd2lsbCBub3QgYmUgbmVlZGVkIG9uY2UgdGhlCisgKiBWRlMgbGF5ZXIgbG9va3VwLWludGVudHMgYXJlIGltcGxlbWVudGVkLgorICoKKyAqIENsb3NlIGlzIGNhbGxlZCB3aGVuIHRoZSBpbm9kZSBpcyBkZXN0cm95ZWQuCisgKiBJZiB3ZSBoYXZlbid0IG9wZW5lZCB0aGUgZmlsZSBmb3IgT19XUk9OTFksIHdlCisgKiBuZWVkIHRvIGluIHRoZSBzaXplX2NoYW5nZSBjYXNlIHRvIG9idGFpbiBhIHN0YXRlaWQuCisgKgorICogR290IHJhY2U/CisgKiBCZWNhdXNlIE9QRU4gaXMgYWx3YXlzIGRvbmUgYnkgbmFtZSBpbiBuZnN2NCwgaXQgaXMKKyAqIHBvc3NpYmxlIHRoYXQgd2Ugb3BlbmVkIGEgZGlmZmVyZW50IGZpbGUgYnkgdGhlIHNhbWUKKyAqIG5hbWUuICBXZSBjYW4gcmVjb2duaXplIHRoaXMgcmFjZSBjb25kaXRpb24sIGJ1dCB3ZQorICogY2FuJ3QgZG8gYW55dGhpbmcgYWJvdXQgaXQgYmVzaWRlcyByZXR1cm5pbmcgYW4gZXJyb3IuCisgKgorICogVGhpcyB3aWxsIGJlIGZpeGVkIHdpdGggVkZTIGNoYW5nZXMgKGxvb2t1cC1pbnRlbnQpLgorICovCitzdGF0aWMgaW50CituZnM0X3Byb2Nfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyLAorCQkgIHN0cnVjdCBpYXR0ciAqc2F0dHIpCit7CisJc3RydWN0IGlub2RlICoJCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludAkJCXNpemVfY2hhbmdlID0gc2F0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFOworCXN0cnVjdCBuZnM0X3N0YXRlCSpzdGF0ZSA9IE5VTEw7CisJaW50IG5lZWRfaXB1dCA9IDA7CisJaW50IHN0YXR1czsKKworCWZhdHRyLT52YWxpZCA9IDA7CisJCisJaWYgKHNpemVfY2hhbmdlKSB7CisJCXN0cnVjdCBycGNfY3JlZCAqY3JlZCA9IHJwY2F1dGhfbG9va3VwY3JlZChORlNfU0VSVkVSKGlub2RlKS0+Y2xpZW50LT5jbF9hdXRoLCAwKTsKKwkJaWYgKElTX0VSUihjcmVkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNyZWQpOworCQlzdGF0ZSA9IG5mczRfZmluZF9zdGF0ZShpbm9kZSwgY3JlZCwgRk1PREVfV1JJVEUpOworCQlpZiAoc3RhdGUgPT0gTlVMTCkgeworCQkJc3RhdGUgPSBuZnM0X29wZW5fZGVsZWdhdGVkKGRlbnRyeS0+ZF9pbm9kZSwKKwkJCQkJRk1PREVfV1JJVEUsIGNyZWQpOworCQkJaWYgKElTX0VSUihzdGF0ZSkpCisJCQkJc3RhdGUgPSBuZnM0X2RvX29wZW4oZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSwKKwkJCQkJCWRlbnRyeSwgRk1PREVfV1JJVEUsCisJCQkJCQlOVUxMLCBjcmVkKTsKKwkJCW5lZWRfaXB1dCA9IDE7CisJCX0KKwkJcHV0X3JwY2NyZWQoY3JlZCk7CisJCWlmIChJU19FUlIoc3RhdGUpKQorCQkJcmV0dXJuIFBUUl9FUlIoc3RhdGUpOworCisJCWlmIChzdGF0ZS0+aW5vZGUgIT0gaW5vZGUpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm5mczogcmFjZWQgaW4gc2V0YXR0ciAoJXAgIT0gJXApLCByZXR1cm5pbmcgLUVJT1xuIiwgaW5vZGUsIHN0YXRlLT5pbm9kZSk7CisJCQlzdGF0dXMgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJc3RhdHVzID0gbmZzNF9kb19zZXRhdHRyKE5GU19TRVJWRVIoaW5vZGUpLCBmYXR0ciwKKwkJCU5GU19GSChpbm9kZSksIHNhdHRyLCBzdGF0ZSk7CitvdXQ6CisJaWYgKHN0YXRlKSB7CisJCWlub2RlID0gc3RhdGUtPmlub2RlOworCQluZnM0X2Nsb3NlX3N0YXRlKHN0YXRlLCBGTU9ERV9XUklURSk7CisJCWlmIChuZWVkX2lwdXQpCisJCQlpcHV0KGlub2RlKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfbmZzNF9wcm9jX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKm5hbWUsCisJCXN0cnVjdCBuZnNfZmggKmZoYW5kbGUsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCWludAkJICAgICAgIHN0YXR1czsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihkaXIpOworCXN0cnVjdCBuZnM0X2xvb2t1cF9hcmcgYXJncyA9IHsKKwkJLmJpdG1hc2sgPSBzZXJ2ZXItPmF0dHJfYml0bWFzaywKKwkJLmRpcl9maCA9IE5GU19GSChkaXIpLAorCQkubmFtZSA9IG5hbWUsCisJfTsKKwlzdHJ1Y3QgbmZzNF9sb29rdXBfcmVzIHJlcyA9IHsKKwkJLnNlcnZlciA9IHNlcnZlciwKKwkJLmZhdHRyID0gZmF0dHIsCisJCS5maCA9IGZoYW5kbGUsCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfTE9PS1VQXSwKKwkJLnJwY19hcmdwID0gJmFyZ3MsCisJCS5ycGNfcmVzcCA9ICZyZXMsCisJfTsKKwkKKwlmYXR0ci0+dmFsaWQgPSAwOworCQorCWRwcmludGsoIk5GUyBjYWxsICBsb29rdXAgJXNcbiIsIG5hbWUtPm5hbWUpOworCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoTkZTX0NMSUVOVChkaXIpLCAmbXNnLCAwKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgbG9va3VwOiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mczRfcHJvY19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBxc3RyICpuYW1lLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCWludCBlcnI7CisJZG8geworCQllcnIgPSBuZnM0X2hhbmRsZV9leGNlcHRpb24oTkZTX1NFUlZFUihkaXIpLAorCQkJCV9uZnM0X3Byb2NfbG9va3VwKGRpciwgbmFtZSwgZmhhbmRsZSwgZmF0dHIpLAorCQkJCSZleGNlcHRpb24pOworCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfbmZzNF9wcm9jX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmZzX2FjY2Vzc19lbnRyeSAqZW50cnkpCit7CisJc3RydWN0IG5mczRfYWNjZXNzYXJncyBhcmdzID0geworCQkuZmggPSBORlNfRkgoaW5vZGUpLAorCX07CisJc3RydWN0IG5mczRfYWNjZXNzcmVzIHJlcyA9IHsgMCB9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9BQ0NFU1NdLAorCQkucnBjX2FyZ3AgPSAmYXJncywKKwkJLnJwY19yZXNwID0gJnJlcywKKwkJLnJwY19jcmVkID0gZW50cnktPmNyZWQsCisJfTsKKwlpbnQgbW9kZSA9IGVudHJ5LT5tYXNrOworCWludCBzdGF0dXM7CisKKwkvKgorCSAqIERldGVybWluZSB3aGljaCBhY2Nlc3MgYml0cyB3ZSB3YW50IHRvIGFzayBmb3IuLi4KKwkgKi8KKwlpZiAobW9kZSAmIE1BWV9SRUFEKQorCQlhcmdzLmFjY2VzcyB8PSBORlM0X0FDQ0VTU19SRUFEOworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWlmIChtb2RlICYgTUFZX1dSSVRFKQorCQkJYXJncy5hY2Nlc3MgfD0gTkZTNF9BQ0NFU1NfTU9ESUZZIHwgTkZTNF9BQ0NFU1NfRVhURU5EIHwgTkZTNF9BQ0NFU1NfREVMRVRFOworCQlpZiAobW9kZSAmIE1BWV9FWEVDKQorCQkJYXJncy5hY2Nlc3MgfD0gTkZTNF9BQ0NFU1NfTE9PS1VQOworCX0gZWxzZSB7CisJCWlmIChtb2RlICYgTUFZX1dSSVRFKQorCQkJYXJncy5hY2Nlc3MgfD0gTkZTNF9BQ0NFU1NfTU9ESUZZIHwgTkZTNF9BQ0NFU1NfRVhURU5EOworCQlpZiAobW9kZSAmIE1BWV9FWEVDKQorCQkJYXJncy5hY2Nlc3MgfD0gTkZTNF9BQ0NFU1NfRVhFQ1VURTsKKwl9CisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKGlub2RlKSwgJm1zZywgMCk7CisJaWYgKCFzdGF0dXMpIHsKKwkJZW50cnktPm1hc2sgPSAwOworCQlpZiAocmVzLmFjY2VzcyAmIE5GUzRfQUNDRVNTX1JFQUQpCisJCQllbnRyeS0+bWFzayB8PSBNQVlfUkVBRDsKKwkJaWYgKHJlcy5hY2Nlc3MgJiAoTkZTNF9BQ0NFU1NfTU9ESUZZIHwgTkZTNF9BQ0NFU1NfRVhURU5EIHwgTkZTNF9BQ0NFU1NfREVMRVRFKSkKKwkJCWVudHJ5LT5tYXNrIHw9IE1BWV9XUklURTsKKwkJaWYgKHJlcy5hY2Nlc3MgJiAoTkZTNF9BQ0NFU1NfTE9PS1VQfE5GUzRfQUNDRVNTX0VYRUNVVEUpKQorCQkJZW50cnktPm1hc2sgfD0gTUFZX0VYRUM7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9wcm9jX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmZzX2FjY2Vzc19lbnRyeSAqZW50cnkpCit7CisJc3RydWN0IG5mczRfZXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHsgfTsKKwlpbnQgZXJyOworCWRvIHsKKwkJZXJyID0gbmZzNF9oYW5kbGVfZXhjZXB0aW9uKE5GU19TRVJWRVIoaW5vZGUpLAorCQkJCV9uZnM0X3Byb2NfYWNjZXNzKGlub2RlLCBlbnRyeSksCisJCQkJJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogVE9ETzogRm9yIHRoZSB0aW1lIGJlaW5nLCB3ZSBkb24ndCB0cnkgdG8gZ2V0IGFueSBhdHRyaWJ1dGVzCisgKiBhbG9uZyB3aXRoIGFueSBvZiB0aGUgemVyby1jb3B5IG9wZXJhdGlvbnMgUkVBRCwgUkVBRERJUiwKKyAqIFJFQURMSU5LLCBXUklURS4KKyAqCisgKiBJbiB0aGUgY2FzZSBvZiB0aGUgZmlyc3QgdGhyZWUsIHdlIHdhbnQgdG8gcHV0IHRoZSBHRVRBVFRSCisgKiBhZnRlciB0aGUgcmVhZC10eXBlIG9wZXJhdGlvbiAtLSB0aGlzIGlzIGJlY2F1c2UgaXQgaXMgaGFyZAorICogdG8gcHJlZGljdCB0aGUgbGVuZ3RoIG9mIGEgR0VUQVRUUiByZXNwb25zZSBpbiB2NCwgYW5kIHRodXMKKyAqIGFsaWduIHRoZSBSRUFEIGRhdGEgY29ycmVjdGx5LiAgVGhpcyBtZWFucyB0aGF0IHRoZSBHRVRBVFRSCisgKiBtYXkgZW5kIHVwIHBhcnRpYWxseSBmYWxsaW5nIGludG8gdGhlIHBhZ2UgY2FjaGUsIGFuZCB3ZSBzaG91bGQKKyAqIHNoaWZ0IGl0IGludG8gdGhlICd0YWlsJyBvZiB0aGUgeGRyX2J1ZiBiZWZvcmUgcHJvY2Vzc2luZy4KKyAqIFRvIGRvIHRoaXMgZWZmaWNpZW50bHksIHdlIG5lZWQgdG8ga25vdyB0aGUgdG90YWwgbGVuZ3RoCisgKiBvZiBkYXRhIHJlY2VpdmVkLCB3aGljaCBkb2Vzbid0IHNlZW0gdG8gYmUgYXZhaWxhYmxlIG91dHNpZGUKKyAqIG9mIHRoZSBSUEMgbGF5ZXIuCisgKgorICogSW4gdGhlIGNhc2Ugb2YgV1JJVEUsIHdlIGFsc28gd2FudCB0byBwdXQgdGhlIEdFVEFUVFIgYWZ0ZXIKKyAqIHRoZSBvcGVyYXRpb24gLS0gaW4gdGhpcyBjYXNlIGJlY2F1c2Ugd2Ugd2FudCB0byBtYWtlIHN1cmUKKyAqIHdlIGdldCB0aGUgcG9zdC1vcGVyYXRpb24gbXRpbWUgYW5kIHNpemUuICBUaGlzIG1lYW5zIHRoYXQKKyAqIHdlIGNhbid0IHVzZSB4ZHJfZW5jb2RlX3BhZ2VzKCkgYXMgd3JpdHRlbjogd2UgbmVlZCBhIHZhcmlhbnQKKyAqIG9mIGl0IHdoaWNoIHdvdWxkIGxlYXZlIHJvb20gaW4gdGhlICd0YWlsJyBpb3ZlYy4KKyAqCisgKiBCb3RoIG9mIHRoZXNlIGNoYW5nZXMgdG8gdGhlIFhEUiBsYXllciB3b3VsZCBpbiBmYWN0IGJlIHF1aXRlCisgKiBtaW5vciwgYnV0IEkgZGVjaWRlZCB0byBsZWF2ZSB0aGVtIGZvciBhIHN1YnNlcXVlbnQgcGF0Y2guCisgKi8KK3N0YXRpYyBpbnQgX25mczRfcHJvY19yZWFkbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJdW5zaWduZWQgaW50IHBnYmFzZSwgdW5zaWduZWQgaW50IHBnbGVuKQoreworCXN0cnVjdCBuZnM0X3JlYWRsaW5rIGFyZ3MgPSB7CisJCS5maCAgICAgICA9IE5GU19GSChpbm9kZSksCisJCS5wZ2Jhc2UJICA9IHBnYmFzZSwKKwkJLnBnbGVuICAgID0gcGdsZW4sCisJCS5wYWdlcyAgICA9ICZwYWdlLAorCX07CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jID0gJm5mczRfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX1JFQURMSU5LXSwKKwkJLnJwY19hcmdwID0gJmFyZ3MsCisJCS5ycGNfcmVzcCA9IE5VTEwsCisJfTsKKworCXJldHVybiBycGNfY2FsbF9zeW5jKE5GU19DTElFTlQoaW5vZGUpLCAmbXNnLCAwKTsKK30KKworc3RhdGljIGludCBuZnM0X3Byb2NfcmVhZGxpbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCXVuc2lnbmVkIGludCBwZ2Jhc2UsIHVuc2lnbmVkIGludCBwZ2xlbikKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCWludCBlcnI7CisJZG8geworCQllcnIgPSBuZnM0X2hhbmRsZV9leGNlcHRpb24oTkZTX1NFUlZFUihpbm9kZSksCisJCQkJX25mczRfcHJvY19yZWFkbGluayhpbm9kZSwgcGFnZSwgcGdiYXNlLCBwZ2xlbiksCisJCQkJJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9uZnM0X3Byb2NfcmVhZChzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqcmRhdGEpCit7CisJaW50IGZsYWdzID0gcmRhdGEtPmZsYWdzOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSByZGF0YS0+aW5vZGU7CisJc3RydWN0IG5mc19mYXR0ciAqZmF0dHIgPSByZGF0YS0+cmVzLmZhdHRyOworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGlub2RlKTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MJPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfUkVBRF0sCisJCS5ycGNfYXJncAk9ICZyZGF0YS0+YXJncywKKwkJLnJwY19yZXNwCT0gJnJkYXRhLT5yZXMsCisJCS5ycGNfY3JlZAk9IHJkYXRhLT5jcmVkLAorCX07CisJdW5zaWduZWQgbG9uZyB0aW1lc3RhbXAgPSBqaWZmaWVzOworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgcmVhZCAlZCBAICVMZFxuIiwgcmRhdGEtPmFyZ3MuY291bnQsCisJCQkobG9uZyBsb25nKSByZGF0YS0+YXJncy5vZmZzZXQpOworCisJZmF0dHItPnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50LCAmbXNnLCBmbGFncyk7CisJaWYgKCFzdGF0dXMpCisJCXJlbmV3X2xlYXNlKHNlcnZlciwgdGltZXN0YW1wKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgcmVhZDogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBuZnM0X3Byb2NfcmVhZChzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqcmRhdGEpCit7CisJc3RydWN0IG5mczRfZXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHsgfTsKKwlpbnQgZXJyOworCWRvIHsKKwkJZXJyID0gbmZzNF9oYW5kbGVfZXhjZXB0aW9uKE5GU19TRVJWRVIocmRhdGEtPmlub2RlKSwKKwkJCQlfbmZzNF9wcm9jX3JlYWQocmRhdGEpLAorCQkJCSZleGNlcHRpb24pOworCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfbmZzNF9wcm9jX3dyaXRlKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqd2RhdGEpCit7CisJaW50IHJwY2ZsYWdzID0gd2RhdGEtPmZsYWdzOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSB3ZGF0YS0+aW5vZGU7CisJc3RydWN0IG5mc19mYXR0ciAqZmF0dHIgPSB3ZGF0YS0+cmVzLmZhdHRyOworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGlub2RlKTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MJPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfV1JJVEVdLAorCQkucnBjX2FyZ3AJPSAmd2RhdGEtPmFyZ3MsCisJCS5ycGNfcmVzcAk9ICZ3ZGF0YS0+cmVzLAorCQkucnBjX2NyZWQJPSB3ZGF0YS0+Y3JlZCwKKwl9OworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgd3JpdGUgJWQgQCAlTGRcbiIsIHdkYXRhLT5hcmdzLmNvdW50LAorCQkJKGxvbmcgbG9uZykgd2RhdGEtPmFyZ3Mub2Zmc2V0KTsKKworCWZhdHRyLT52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhzZXJ2ZXItPmNsaWVudCwgJm1zZywgcnBjZmxhZ3MpOworCWRwcmludGsoIk5GUyByZXBseSB3cml0ZTogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBuZnM0X3Byb2Nfd3JpdGUoc3RydWN0IG5mc193cml0ZV9kYXRhICp3ZGF0YSkKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCWludCBlcnI7CisJZG8geworCQllcnIgPSBuZnM0X2hhbmRsZV9leGNlcHRpb24oTkZTX1NFUlZFUih3ZGF0YS0+aW5vZGUpLAorCQkJCV9uZnM0X3Byb2Nfd3JpdGUod2RhdGEpLAorCQkJCSZleGNlcHRpb24pOworCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfbmZzNF9wcm9jX2NvbW1pdChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKmNkYXRhKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBjZGF0YS0+aW5vZGU7CisJc3RydWN0IG5mc19mYXR0ciAqZmF0dHIgPSBjZGF0YS0+cmVzLmZhdHRyOworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGlub2RlKTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MJPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfQ09NTUlUXSwKKwkJLnJwY19hcmdwCT0gJmNkYXRhLT5hcmdzLAorCQkucnBjX3Jlc3AJPSAmY2RhdGEtPnJlcywKKwkJLnJwY19jcmVkCT0gY2RhdGEtPmNyZWQsCisJfTsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIGNvbW1pdCAlZCBAICVMZFxuIiwgY2RhdGEtPmFyZ3MuY291bnQsCisJCQkobG9uZyBsb25nKSBjZGF0YS0+YXJncy5vZmZzZXQpOworCisJZmF0dHItPnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50LCAmbXNnLCAwKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgY29tbWl0OiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mczRfcHJvY19jb21taXQoc3RydWN0IG5mc193cml0ZV9kYXRhICpjZGF0YSkKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCWludCBlcnI7CisJZG8geworCQllcnIgPSBuZnM0X2hhbmRsZV9leGNlcHRpb24oTkZTX1NFUlZFUihjZGF0YS0+aW5vZGUpLAorCQkJCV9uZnM0X3Byb2NfY29tbWl0KGNkYXRhKSwKKwkJCQkmZXhjZXB0aW9uKTsKKwl9IHdoaWxlIChleGNlcHRpb24ucmV0cnkpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBHb3QgcmFjZT8KKyAqIFdlIHdpbGwgbmVlZCB0byBhcnJhbmdlIGZvciB0aGUgVkZTIGxheWVyIHRvIHByb3ZpZGUgYW4gYXRvbWljIG9wZW4uCisgKiBVbnRpbCB0aGVuLCB0aGlzIGNyZWF0ZS9vcGVuIG1ldGhvZCBpcyBwcm9uZSB0byBpbmVmZmljaWVuY3kgYW5kIHJhY2UKKyAqIGNvbmRpdGlvbnMgZHVlIHRvIHRoZSBsb29rdXAsIGNyZWF0ZSwgYW5kIG9wZW4gVkZTIGNhbGxzIGZyb20gc3lzX29wZW4oKQorICogcGxhY2VkIG9uIHRoZSB3aXJlLgorICoKKyAqIEdpdmVuIHRoZSBhYm92ZSBzb3JyeSBzdGF0ZSBvZiBhZmZhaXJzLCBJJ20gc2ltcGx5IHNlbmRpbmcgYW4gT1BFTi4KKyAqIFRoZSBmaWxlIHdpbGwgYmUgb3BlbmVkIGFnYWluIGluIHRoZSBzdWJzZXF1ZW50IFZGUyBvcGVuIGNhbGwKKyAqIChuZnM0X3Byb2NfZmlsZV9vcGVuKS4KKyAqCisgKiBUaGUgb3BlbiBmb3IgcmVhZCB3aWxsIGp1c3QgaGFuZyBhcm91bmQgdG8gYmUgdXNlZCBieSBhbnkgcHJvY2VzcyB0aGF0CisgKiBvcGVucyB0aGUgZmlsZSBPX1JET05MWS4gVGhpcyB3aWxsIGFsbCBiZSByZXNvbHZlZCB3aXRoIHRoZSBWRlMgY2hhbmdlcy4KKyAqLworCitzdGF0aWMgaW50CituZnM0X3Byb2NfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqc2F0dHIsCisgICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGU7CisJc3RydWN0IHJwY19jcmVkICpjcmVkOworCWludCBzdGF0dXMgPSAwOworCisJY3JlZCA9IHJwY2F1dGhfbG9va3VwY3JlZChORlNfU0VSVkVSKGRpciktPmNsaWVudC0+Y2xfYXV0aCwgMCk7CisJaWYgKElTX0VSUihjcmVkKSkgeworCQlzdGF0dXMgPSBQVFJfRVJSKGNyZWQpOworCQlnb3RvIG91dDsKKwl9CisJc3RhdGUgPSBuZnM0X2RvX29wZW4oZGlyLCBkZW50cnksIGZsYWdzLCBzYXR0ciwgY3JlZCk7CisJcHV0X3JwY2NyZWQoY3JlZCk7CisJaWYgKElTX0VSUihzdGF0ZSkpIHsKKwkJc3RhdHVzID0gUFRSX0VSUihzdGF0ZSk7CisJCWdvdG8gb3V0OworCX0KKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgc3RhdGUtPmlub2RlKTsKKwlpZiAoZmxhZ3MgJiBPX0VYQ0wpIHsKKwkJc3RydWN0IG5mc19mYXR0ciBmYXR0cjsKKwkJc3RhdHVzID0gbmZzNF9kb19zZXRhdHRyKE5GU19TRVJWRVIoZGlyKSwgJmZhdHRyLAorCQkgICAgICAgICAgICAgICAgICAgICBORlNfRkgoc3RhdGUtPmlub2RlKSwgc2F0dHIsIHN0YXRlKTsKKwkJaWYgKHN0YXR1cyA9PSAwKQorCQkJZ290byBvdXQ7CisJfSBlbHNlIGlmIChmbGFncyAhPSAwKQorCQlnb3RvIG91dDsKKwluZnM0X2Nsb3NlX3N0YXRlKHN0YXRlLCBmbGFncyk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfbmZzNF9wcm9jX3JlbW92ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKm5hbWUpCit7CisJc3RydWN0IG5mczRfcmVtb3ZlX2FyZyBhcmdzID0geworCQkuZmggPSBORlNfRkgoZGlyKSwKKwkJLm5hbWUgPSBuYW1lLAorCX07CisJc3RydWN0IG5mczRfY2hhbmdlX2luZm8JcmVzOworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYwk9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9SRU1PVkVdLAorCQkucnBjX2FyZ3AJPSAmYXJncywKKwkJLnJwY19yZXNwCT0gJnJlcywKKwl9OworCWludAkJCXN0YXR1czsKKworCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoTkZTX0NMSUVOVChkaXIpLCAmbXNnLCAwKTsKKwlpZiAoc3RhdHVzID09IDApCisJCXVwZGF0ZV9jaGFuZ2VhdHRyKGRpciwgJnJlcyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBuZnM0X3Byb2NfcmVtb3ZlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCWludCBlcnI7CisJZG8geworCQllcnIgPSBuZnM0X2hhbmRsZV9leGNlcHRpb24oTkZTX1NFUlZFUihkaXIpLAorCQkJCV9uZnM0X3Byb2NfcmVtb3ZlKGRpciwgbmFtZSksCisJCQkJJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgdW5saW5rX2Rlc2MgeworCXN0cnVjdCBuZnM0X3JlbW92ZV9hcmcJYXJnczsKKwlzdHJ1Y3QgbmZzNF9jaGFuZ2VfaW5mbwlyZXM7Cit9OworCitzdGF0aWMgaW50IG5mczRfcHJvY191bmxpbmtfc2V0dXAoc3RydWN0IHJwY19tZXNzYWdlICptc2csIHN0cnVjdCBkZW50cnkgKmRpciwKKwkJc3RydWN0IHFzdHIgKm5hbWUpCit7CisJc3RydWN0IHVubGlua19kZXNjICp1cDsKKworCXVwID0gKHN0cnVjdCB1bmxpbmtfZGVzYyAqKSBrbWFsbG9jKHNpemVvZigqdXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVwKQorCQlyZXR1cm4gLUVOT01FTTsKKwkKKwl1cC0+YXJncy5maCA9IE5GU19GSChkaXItPmRfaW5vZGUpOworCXVwLT5hcmdzLm5hbWUgPSBuYW1lOworCQorCW1zZy0+cnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfUkVNT1ZFXTsKKwltc2ctPnJwY19hcmdwID0gJnVwLT5hcmdzOworCW1zZy0+cnBjX3Jlc3AgPSAmdXAtPnJlczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZnM0X3Byb2NfdW5saW5rX2RvbmUoc3RydWN0IGRlbnRyeSAqZGlyLCBzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IHJwY19tZXNzYWdlICptc2cgPSAmdGFzay0+dGtfbXNnOworCXN0cnVjdCB1bmxpbmtfZGVzYyAqdXA7CisJCisJaWYgKG1zZy0+cnBjX3Jlc3AgIT0gTlVMTCkgeworCQl1cCA9IGNvbnRhaW5lcl9vZihtc2ctPnJwY19yZXNwLCBzdHJ1Y3QgdW5saW5rX2Rlc2MsIHJlcyk7CisJCXVwZGF0ZV9jaGFuZ2VhdHRyKGRpci0+ZF9pbm9kZSwgJnVwLT5yZXMpOworCQlrZnJlZSh1cCk7CisJCW1zZy0+cnBjX3Jlc3AgPSBOVUxMOworCQltc2ctPnJwY19hcmdwID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX25mczRfcHJvY19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgcXN0ciAqb2xkX25hbWUsCisJCXN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IHFzdHIgKm5ld19uYW1lKQoreworCXN0cnVjdCBuZnM0X3JlbmFtZV9hcmcgYXJnID0geworCQkub2xkX2RpciA9IE5GU19GSChvbGRfZGlyKSwKKwkJLm5ld19kaXIgPSBORlNfRkgobmV3X2RpciksCisJCS5vbGRfbmFtZSA9IG9sZF9uYW1lLAorCQkubmV3X25hbWUgPSBuZXdfbmFtZSwKKwl9OworCXN0cnVjdCBuZnM0X3JlbmFtZV9yZXMgcmVzID0geyB9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9SRU5BTUVdLAorCQkucnBjX2FyZ3AgPSAmYXJnLAorCQkucnBjX3Jlc3AgPSAmcmVzLAorCX07CisJaW50CQkJc3RhdHVzOworCQorCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoTkZTX0NMSUVOVChvbGRfZGlyKSwgJm1zZywgMCk7CisKKwlpZiAoIXN0YXR1cykgeworCQl1cGRhdGVfY2hhbmdlYXR0cihvbGRfZGlyLCAmcmVzLm9sZF9jaW5mbyk7CisJCXVwZGF0ZV9jaGFuZ2VhdHRyKG5ld19kaXIsICZyZXMubmV3X2NpbmZvKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBuZnM0X3Byb2NfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IHFzdHIgKm9sZF9uYW1lLAorCQlzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsIHN0cnVjdCBxc3RyICpuZXdfbmFtZSkKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCWludCBlcnI7CisJZG8geworCQllcnIgPSBuZnM0X2hhbmRsZV9leGNlcHRpb24oTkZTX1NFUlZFUihvbGRfZGlyKSwKKwkJCQlfbmZzNF9wcm9jX3JlbmFtZShvbGRfZGlyLCBvbGRfbmFtZSwKKwkJCQkJbmV3X2RpciwgbmV3X25hbWUpLAorCQkJCSZleGNlcHRpb24pOworCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfbmZzNF9wcm9jX2xpbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBxc3RyICpuYW1lKQoreworCXN0cnVjdCBuZnM0X2xpbmtfYXJnIGFyZyA9IHsKKwkJLmZoICAgICA9IE5GU19GSChpbm9kZSksCisJCS5kaXJfZmggPSBORlNfRkgoZGlyKSwKKwkJLm5hbWUgICA9IG5hbWUsCisJfTsKKwlzdHJ1Y3QgbmZzNF9jaGFuZ2VfaW5mbwljaW5mbyA9IHsgfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfTElOS10sCisJCS5ycGNfYXJncCA9ICZhcmcsCisJCS5ycGNfcmVzcCA9ICZjaW5mbywKKwl9OworCWludAkJCXN0YXR1czsKKworCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoTkZTX0NMSUVOVChpbm9kZSksICZtc2csIDApOworCWlmICghc3RhdHVzKQorCQl1cGRhdGVfY2hhbmdlYXR0cihkaXIsICZjaW5mbyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mczRfcHJvY19saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCWludCBlcnI7CisJZG8geworCQllcnIgPSBuZnM0X2hhbmRsZV9leGNlcHRpb24oTkZTX1NFUlZFUihpbm9kZSksCisJCQkJX25mczRfcHJvY19saW5rKGlub2RlLCBkaXIsIG5hbWUpLAorCQkJCSZleGNlcHRpb24pOworCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfbmZzNF9wcm9jX3N5bWxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBxc3RyICpuYW1lLAorCQlzdHJ1Y3QgcXN0ciAqcGF0aCwgc3RydWN0IGlhdHRyICpzYXR0ciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwKKwkJc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoZGlyKTsKKwlzdHJ1Y3QgbmZzNF9jcmVhdGVfYXJnIGFyZyA9IHsKKwkJLmRpcl9maCA9IE5GU19GSChkaXIpLAorCQkuc2VydmVyID0gc2VydmVyLAorCQkubmFtZSA9IG5hbWUsCisJCS5hdHRycyA9IHNhdHRyLAorCQkuZnR5cGUgPSBORjRMTkssCisJCS5iaXRtYXNrID0gc2VydmVyLT5hdHRyX2JpdG1hc2ssCisJfTsKKwlzdHJ1Y3QgbmZzNF9jcmVhdGVfcmVzIHJlcyA9IHsKKwkJLnNlcnZlciA9IHNlcnZlciwKKwkJLmZoID0gZmhhbmRsZSwKKwkJLmZhdHRyID0gZmF0dHIsCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfU1lNTElOS10sCisJCS5ycGNfYXJncCA9ICZhcmcsCisJCS5ycGNfcmVzcCA9ICZyZXMsCisJfTsKKwlpbnQJCQlzdGF0dXM7CisKKwlpZiAocGF0aC0+bGVuID4gTkZTNF9NQVhQQVRITEVOKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwlhcmcudS5zeW1saW5rID0gcGF0aDsKKwlmYXR0ci0+dmFsaWQgPSAwOworCQorCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoTkZTX0NMSUVOVChkaXIpLCAmbXNnLCAwKTsKKwlpZiAoIXN0YXR1cykKKwkJdXBkYXRlX2NoYW5nZWF0dHIoZGlyLCAmcmVzLmRpcl9jaW5mbyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBuZnM0X3Byb2Nfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKm5hbWUsCisJCXN0cnVjdCBxc3RyICpwYXRoLCBzdHJ1Y3QgaWF0dHIgKnNhdHRyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQlzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCWludCBlcnI7CisJZG8geworCQllcnIgPSBuZnM0X2hhbmRsZV9leGNlcHRpb24oTkZTX1NFUlZFUihkaXIpLAorCQkJCV9uZnM0X3Byb2Nfc3ltbGluayhkaXIsIG5hbWUsIHBhdGgsIHNhdHRyLAorCQkJCQlmaGFuZGxlLCBmYXR0ciksCisJCQkJJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9uZnM0X3Byb2NfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJc3RydWN0IGlhdHRyICpzYXR0cikKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihkaXIpOworCXN0cnVjdCBuZnNfZmggZmhhbmRsZTsKKwlzdHJ1Y3QgbmZzX2ZhdHRyIGZhdHRyOworCXN0cnVjdCBuZnM0X2NyZWF0ZV9hcmcgYXJnID0geworCQkuZGlyX2ZoID0gTkZTX0ZIKGRpciksCisJCS5zZXJ2ZXIgPSBzZXJ2ZXIsCisJCS5uYW1lID0gJmRlbnRyeS0+ZF9uYW1lLAorCQkuYXR0cnMgPSBzYXR0ciwKKwkJLmZ0eXBlID0gTkY0RElSLAorCQkuYml0bWFzayA9IHNlcnZlci0+YXR0cl9iaXRtYXNrLAorCX07CisJc3RydWN0IG5mczRfY3JlYXRlX3JlcyByZXMgPSB7CisJCS5zZXJ2ZXIgPSBzZXJ2ZXIsCisJCS5maCA9ICZmaGFuZGxlLAorCQkuZmF0dHIgPSAmZmF0dHIsCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfQ1JFQVRFXSwKKwkJLnJwY19hcmdwID0gJmFyZywKKwkJLnJwY19yZXNwID0gJnJlcywKKwl9OworCWludAkJCXN0YXR1czsKKworCWZhdHRyLnZhbGlkID0gMDsKKwkKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKE5GU19DTElFTlQoZGlyKSwgJm1zZywgMCk7CisJaWYgKCFzdGF0dXMpIHsKKwkJdXBkYXRlX2NoYW5nZWF0dHIoZGlyLCAmcmVzLmRpcl9jaW5mbyk7CisJCXN0YXR1cyA9IG5mc19pbnN0YW50aWF0ZShkZW50cnksICZmaGFuZGxlLCAmZmF0dHIpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mczRfcHJvY19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQlzdHJ1Y3QgaWF0dHIgKnNhdHRyKQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKwlkbyB7CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKGRpciksCisJCQkJX25mczRfcHJvY19ta2RpcihkaXIsIGRlbnRyeSwgc2F0dHIpLAorCQkJCSZleGNlcHRpb24pOworCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfbmZzNF9wcm9jX3JlYWRkaXIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsCisgICAgICAgICAgICAgICAgICB1NjQgY29va2llLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IGNvdW50LCBpbnQgcGx1cykKK3sKKwlzdHJ1Y3QgaW5vZGUJCSpkaXIgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5mczRfcmVhZGRpcl9hcmcgYXJncyA9IHsKKwkJLmZoID0gTkZTX0ZIKGRpciksCisJCS5wYWdlcyA9ICZwYWdlLAorCQkucGdiYXNlID0gMCwKKwkJLmNvdW50ID0gY291bnQsCisJCS5iaXRtYXNrID0gTkZTX1NFUlZFUihkZW50cnktPmRfaW5vZGUpLT5hdHRyX2JpdG1hc2ssCisJfTsKKwlzdHJ1Y3QgbmZzNF9yZWFkZGlyX3JlcyByZXM7CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jID0gJm5mczRfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX1JFQURESVJdLAorCQkucnBjX2FyZ3AgPSAmYXJncywKKwkJLnJwY19yZXNwID0gJnJlcywKKwkJLnJwY19jcmVkID0gY3JlZCwKKwl9OworCWludAkJCXN0YXR1czsKKworCWxvY2tfa2VybmVsKCk7CisJbmZzNF9zZXR1cF9yZWFkZGlyKGNvb2tpZSwgTkZTX0NPT0tJRVZFUkYoZGlyKSwgZGVudHJ5LCAmYXJncyk7CisJcmVzLnBnYmFzZSA9IGFyZ3MucGdiYXNlOworCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoTkZTX0NMSUVOVChkaXIpLCAmbXNnLCAwKTsKKwlpZiAoc3RhdHVzID09IDApCisJCW1lbWNweShORlNfQ09PS0lFVkVSRihkaXIpLCByZXMudmVyaWZpZXIuZGF0YSwgTkZTNF9WRVJJRklFUl9TSVpFKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBuZnM0X3Byb2NfcmVhZGRpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwKKyAgICAgICAgICAgICAgICAgIHU2NCBjb29raWUsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgY291bnQsIGludCBwbHVzKQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKwlkbyB7CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKGRlbnRyeS0+ZF9pbm9kZSksCisJCQkJX25mczRfcHJvY19yZWFkZGlyKGRlbnRyeSwgY3JlZCwgY29va2llLAorCQkJCQlwYWdlLCBjb3VudCwgcGx1cyksCisJCQkJJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9uZnM0X3Byb2NfbWtub2Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJc3RydWN0IGlhdHRyICpzYXR0ciwgZGV2X3QgcmRldikKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihkaXIpOworCXN0cnVjdCBuZnNfZmggZmg7CisJc3RydWN0IG5mc19mYXR0ciBmYXR0cjsKKwlzdHJ1Y3QgbmZzNF9jcmVhdGVfYXJnIGFyZyA9IHsKKwkJLmRpcl9maCA9IE5GU19GSChkaXIpLAorCQkuc2VydmVyID0gc2VydmVyLAorCQkubmFtZSA9ICZkZW50cnktPmRfbmFtZSwKKwkJLmF0dHJzID0gc2F0dHIsCisJCS5iaXRtYXNrID0gc2VydmVyLT5hdHRyX2JpdG1hc2ssCisJfTsKKwlzdHJ1Y3QgbmZzNF9jcmVhdGVfcmVzIHJlcyA9IHsKKwkJLnNlcnZlciA9IHNlcnZlciwKKwkJLmZoID0gJmZoLAorCQkuZmF0dHIgPSAmZmF0dHIsCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfQ1JFQVRFXSwKKwkJLnJwY19hcmdwID0gJmFyZywKKwkJLnJwY19yZXNwID0gJnJlcywKKwl9OworCWludAkJCXN0YXR1czsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBtb2RlID0gc2F0dHItPmlhX21vZGU7CisKKwlmYXR0ci52YWxpZCA9IDA7CisKKwlCVUdfT04oIShzYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpKTsKKwlCVUdfT04oIVNfSVNGSUZPKG1vZGUpICYmICFTX0lTQkxLKG1vZGUpICYmICFTX0lTQ0hSKG1vZGUpICYmICFTX0lTU09DSyhtb2RlKSk7CisJaWYgKFNfSVNGSUZPKG1vZGUpKQorCQlhcmcuZnR5cGUgPSBORjRGSUZPOworCWVsc2UgaWYgKFNfSVNCTEsobW9kZSkpIHsKKwkJYXJnLmZ0eXBlID0gTkY0QkxLOworCQlhcmcudS5kZXZpY2Uuc3BlY2RhdGExID0gTUFKT1IocmRldik7CisJCWFyZy51LmRldmljZS5zcGVjZGF0YTIgPSBNSU5PUihyZGV2KTsKKwl9CisJZWxzZSBpZiAoU19JU0NIUihtb2RlKSkgeworCQlhcmcuZnR5cGUgPSBORjRDSFI7CisJCWFyZy51LmRldmljZS5zcGVjZGF0YTEgPSBNQUpPUihyZGV2KTsKKwkJYXJnLnUuZGV2aWNlLnNwZWNkYXRhMiA9IE1JTk9SKHJkZXYpOworCX0KKwllbHNlCisJCWFyZy5mdHlwZSA9IE5GNFNPQ0s7CisJCisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKGRpciksICZtc2csIDApOworCWlmIChzdGF0dXMgPT0gMCkgeworCQl1cGRhdGVfY2hhbmdlYXR0cihkaXIsICZyZXMuZGlyX2NpbmZvKTsKKwkJc3RhdHVzID0gbmZzX2luc3RhbnRpYXRlKGRlbnRyeSwgJmZoLCAmZmF0dHIpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mczRfcHJvY19ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQlzdHJ1Y3QgaWF0dHIgKnNhdHRyLCBkZXZfdCByZGV2KQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKwlkbyB7CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKGRpciksCisJCQkJX25mczRfcHJvY19ta25vZChkaXIsIGRlbnRyeSwgc2F0dHIsIHJkZXYpLAorCQkJCSZleGNlcHRpb24pOworCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfbmZzNF9wcm9jX3N0YXRmcyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQkgc3RydWN0IG5mc19mc3N0YXQgKmZzc3RhdCkKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZnNfYXJnIGFyZ3MgPSB7CisJCS5maCA9IGZoYW5kbGUsCisJCS5iaXRtYXNrID0gc2VydmVyLT5hdHRyX2JpdG1hc2ssCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfU1RBVEZTXSwKKwkJLnJwY19hcmdwID0gJmFyZ3MsCisJCS5ycGNfcmVzcCA9IGZzc3RhdCwKKwl9OworCisJZnNzdGF0LT5mYXR0ci0+dmFsaWQgPSAwOworCXJldHVybiBycGNfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50LCAmbXNnLCAwKTsKK30KKworc3RhdGljIGludCBuZnM0X3Byb2Nfc3RhdGZzKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUsIHN0cnVjdCBuZnNfZnNzdGF0ICpmc3N0YXQpCit7CisJc3RydWN0IG5mczRfZXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHsgfTsKKwlpbnQgZXJyOworCWRvIHsKKwkJZXJyID0gbmZzNF9oYW5kbGVfZXhjZXB0aW9uKHNlcnZlciwKKwkJCQlfbmZzNF9wcm9jX3N0YXRmcyhzZXJ2ZXIsIGZoYW5kbGUsIGZzc3RhdCksCisJCQkJJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9uZnM0X2RvX2ZzaW5mbyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQlzdHJ1Y3QgbmZzX2ZzaW5mbyAqZnNpbmZvKQoreworCXN0cnVjdCBuZnM0X2ZzaW5mb19hcmcgYXJncyA9IHsKKwkJLmZoID0gZmhhbmRsZSwKKwkJLmJpdG1hc2sgPSBzZXJ2ZXItPmF0dHJfYml0bWFzaywKKwl9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9GU0lORk9dLAorCQkucnBjX2FyZ3AgPSAmYXJncywKKwkJLnJwY19yZXNwID0gZnNpbmZvLAorCX07CisKKwlyZXR1cm4gcnBjX2NhbGxfc3luYyhzZXJ2ZXItPmNsaWVudCwgJm1zZywgMCk7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9kb19mc2luZm8oc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwgc3RydWN0IG5mc19mc2luZm8gKmZzaW5mbykKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCWludCBlcnI7CisKKwlkbyB7CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihzZXJ2ZXIsCisJCQkJX25mczRfZG9fZnNpbmZvKHNlcnZlciwgZmhhbmRsZSwgZnNpbmZvKSwKKwkJCQkmZXhjZXB0aW9uKTsKKwl9IHdoaWxlIChleGNlcHRpb24ucmV0cnkpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9wcm9jX2ZzaW5mbyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLCBzdHJ1Y3QgbmZzX2ZzaW5mbyAqZnNpbmZvKQoreworCWZzaW5mby0+ZmF0dHItPnZhbGlkID0gMDsKKwlyZXR1cm4gbmZzNF9kb19mc2luZm8oc2VydmVyLCBmaGFuZGxlLCBmc2luZm8pOworfQorCitzdGF0aWMgaW50IF9uZnM0X3Byb2NfcGF0aGNvbmYoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwKKwkJc3RydWN0IG5mc19wYXRoY29uZiAqcGF0aGNvbmYpCit7CisJc3RydWN0IG5mczRfcGF0aGNvbmZfYXJnIGFyZ3MgPSB7CisJCS5maCA9IGZoYW5kbGUsCisJCS5iaXRtYXNrID0gc2VydmVyLT5hdHRyX2JpdG1hc2ssCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfUEFUSENPTkZdLAorCQkucnBjX2FyZ3AgPSAmYXJncywKKwkJLnJwY19yZXNwID0gcGF0aGNvbmYsCisJfTsKKworCS8qIE5vbmUgb2YgdGhlIHBhdGhjb25mIGF0dHJpYnV0ZXMgYXJlIG1hbmRhdG9yeSB0byBpbXBsZW1lbnQgKi8KKwlpZiAoKGFyZ3MuYml0bWFza1swXSAmIG5mczRfcGF0aGNvbmZfYml0bWFwWzBdKSA9PSAwKSB7CisJCW1lbXNldChwYXRoY29uZiwgMCwgc2l6ZW9mKCpwYXRoY29uZikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwYXRoY29uZi0+ZmF0dHItPnZhbGlkID0gMDsKKwlyZXR1cm4gcnBjX2NhbGxfc3luYyhzZXJ2ZXItPmNsaWVudCwgJm1zZywgMCk7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9wcm9jX3BhdGhjb25mKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUsCisJCXN0cnVjdCBuZnNfcGF0aGNvbmYgKnBhdGhjb25mKQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKworCWRvIHsKKwkJZXJyID0gbmZzNF9oYW5kbGVfZXhjZXB0aW9uKHNlcnZlciwKKwkJCQlfbmZzNF9wcm9jX3BhdGhjb25mKHNlcnZlciwgZmhhbmRsZSwgcGF0aGNvbmYpLAorCQkJCSZleGNlcHRpb24pOworCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQKK25mczRfcmVhZF9kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqKSB0YXNrLT50a19jYWxsZGF0YTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGF0YS0+aW5vZGU7CisKKwlpZiAobmZzNF9hc3luY19oYW5kbGVfZXJyb3IodGFzaywgTkZTX1NFUlZFUihpbm9kZSkpID09IC1FQUdBSU4pIHsKKwkJcnBjX3Jlc3RhcnRfY2FsbCh0YXNrKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodGFzay0+dGtfc3RhdHVzID4gMCkKKwkJcmVuZXdfbGVhc2UoTkZTX1NFUlZFUihpbm9kZSksIGRhdGEtPnRpbWVzdGFtcCk7CisJLyogQ2FsbCBiYWNrIGNvbW1vbiBORlMgcmVhZHBhZ2UgcHJvY2Vzc2luZyAqLworCW5mc19yZWFkcGFnZV9yZXN1bHQodGFzayk7Cit9CisKK3N0YXRpYyB2b2lkCituZnM0X3Byb2NfcmVhZF9zZXR1cChzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgcnBjX3Rhc2sJKnRhc2sgPSAmZGF0YS0+dGFzazsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfUkVBRF0sCisJCS5ycGNfYXJncCA9ICZkYXRhLT5hcmdzLAorCQkucnBjX3Jlc3AgPSAmZGF0YS0+cmVzLAorCQkucnBjX2NyZWQgPSBkYXRhLT5jcmVkLAorCX07CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRhdGEtPmlub2RlOworCWludCBmbGFnczsKKworCWRhdGEtPnRpbWVzdGFtcCAgID0gamlmZmllczsKKworCS8qIE4uQi4gRG8gd2UgbmVlZCB0byB0ZXN0PyBOZXZlciBjYWxsZWQgZm9yIHN3YXBmaWxlIGlub2RlICovCisJZmxhZ3MgPSBSUENfVEFTS19BU1lOQyB8IChJU19TV0FQRklMRShpbm9kZSk/IE5GU19SUENfU1dBUEZMQUdTIDogMCk7CisKKwkvKiBGaW5hbGl6ZSB0aGUgdGFzay4gKi8KKwlycGNfaW5pdF90YXNrKHRhc2ssIE5GU19DTElFTlQoaW5vZGUpLCBuZnM0X3JlYWRfZG9uZSwgZmxhZ3MpOworCXJwY19jYWxsX3NldHVwKHRhc2ssICZtc2csIDApOworfQorCitzdGF0aWMgdm9pZAorbmZzNF93cml0ZV9kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKmRhdGEgPSAoc3RydWN0IG5mc193cml0ZV9kYXRhICopIHRhc2stPnRrX2NhbGxkYXRhOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkYXRhLT5pbm9kZTsKKwkKKwlpZiAobmZzNF9hc3luY19oYW5kbGVfZXJyb3IodGFzaywgTkZTX1NFUlZFUihpbm9kZSkpID09IC1FQUdBSU4pIHsKKwkJcnBjX3Jlc3RhcnRfY2FsbCh0YXNrKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodGFzay0+dGtfc3RhdHVzID49IDApCisJCXJlbmV3X2xlYXNlKE5GU19TRVJWRVIoaW5vZGUpLCBkYXRhLT50aW1lc3RhbXApOworCS8qIENhbGwgYmFjayBjb21tb24gTkZTIHdyaXRlYmFjayBwcm9jZXNzaW5nICovCisJbmZzX3dyaXRlYmFja19kb25lKHRhc2spOworfQorCitzdGF0aWMgdm9pZAorbmZzNF9wcm9jX3dyaXRlX3NldHVwKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqZGF0YSwgaW50IGhvdykKK3sKKwlzdHJ1Y3QgcnBjX3Rhc2sJKnRhc2sgPSAmZGF0YS0+dGFzazsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfV1JJVEVdLAorCQkucnBjX2FyZ3AgPSAmZGF0YS0+YXJncywKKwkJLnJwY19yZXNwID0gJmRhdGEtPnJlcywKKwkJLnJwY19jcmVkID0gZGF0YS0+Y3JlZCwKKwl9OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkYXRhLT5pbm9kZTsKKwlpbnQgc3RhYmxlOworCWludCBmbGFnczsKKwkKKwlpZiAoaG93ICYgRkxVU0hfU1RBQkxFKSB7CisJCWlmICghTkZTX0koaW5vZGUpLT5uY29tbWl0KQorCQkJc3RhYmxlID0gTkZTX0ZJTEVfU1lOQzsKKwkJZWxzZQorCQkJc3RhYmxlID0gTkZTX0RBVEFfU1lOQzsKKwl9IGVsc2UKKwkJc3RhYmxlID0gTkZTX1VOU1RBQkxFOworCWRhdGEtPmFyZ3Muc3RhYmxlID0gc3RhYmxlOworCisJZGF0YS0+dGltZXN0YW1wICAgPSBqaWZmaWVzOworCisJLyogU2V0IHRoZSBpbml0aWFsIGZsYWdzIGZvciB0aGUgdGFzay4gICovCisJZmxhZ3MgPSAoaG93ICYgRkxVU0hfU1lOQykgPyAwIDogUlBDX1RBU0tfQVNZTkM7CisKKwkvKiBGaW5hbGl6ZSB0aGUgdGFzay4gKi8KKwlycGNfaW5pdF90YXNrKHRhc2ssIE5GU19DTElFTlQoaW5vZGUpLCBuZnM0X3dyaXRlX2RvbmUsIGZsYWdzKTsKKwlycGNfY2FsbF9zZXR1cCh0YXNrLCAmbXNnLCAwKTsKK30KKworc3RhdGljIHZvaWQKK25mczRfY29tbWl0X2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKikgdGFzay0+dGtfY2FsbGRhdGE7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRhdGEtPmlub2RlOworCQorCWlmIChuZnM0X2FzeW5jX2hhbmRsZV9lcnJvcih0YXNrLCBORlNfU0VSVkVSKGlub2RlKSkgPT0gLUVBR0FJTikgeworCQlycGNfcmVzdGFydF9jYWxsKHRhc2spOworCQlyZXR1cm47CisJfQorCS8qIENhbGwgYmFjayBjb21tb24gTkZTIHdyaXRlYmFjayBwcm9jZXNzaW5nICovCisJbmZzX2NvbW1pdF9kb25lKHRhc2spOworfQorCitzdGF0aWMgdm9pZAorbmZzNF9wcm9jX2NvbW1pdF9zZXR1cChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKmRhdGEsIGludCBob3cpCit7CisJc3RydWN0IHJwY190YXNrCSp0YXNrID0gJmRhdGEtPnRhc2s7CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jID0gJm5mczRfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX0NPTU1JVF0sCisJCS5ycGNfYXJncCA9ICZkYXRhLT5hcmdzLAorCQkucnBjX3Jlc3AgPSAmZGF0YS0+cmVzLAorCQkucnBjX2NyZWQgPSBkYXRhLT5jcmVkLAorCX07CQorCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkYXRhLT5pbm9kZTsKKwlpbnQgZmxhZ3M7CisJCisJLyogU2V0IHRoZSBpbml0aWFsIGZsYWdzIGZvciB0aGUgdGFzay4gICovCisJZmxhZ3MgPSAoaG93ICYgRkxVU0hfU1lOQykgPyAwIDogUlBDX1RBU0tfQVNZTkM7CisKKwkvKiBGaW5hbGl6ZSB0aGUgdGFzay4gKi8KKwlycGNfaW5pdF90YXNrKHRhc2ssIE5GU19DTElFTlQoaW5vZGUpLCBuZnM0X2NvbW1pdF9kb25lLCBmbGFncyk7CisJcnBjX2NhbGxfc2V0dXAodGFzaywgJm1zZywgMCk7CQorfQorCisvKgorICogbmZzNF9wcm9jX2FzeW5jX3JlbmV3KCk6IFRoaXMgaXMgbm90IG9uZSBvZiB0aGUgbmZzX3JwY19vcHM7IGl0IGlzIGEgc3BlY2lhbAorICogc3RhbmRhbG9uZSBwcm9jZWR1cmUgZm9yIHF1ZXVlaW5nIGFuIGFzeW5jaHJvbm91cyBSRU5FVy4KKyAqLworc3RhdGljIHZvaWQKK3JlbmV3X2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gKHN0cnVjdCBuZnM0X2NsaWVudCAqKXRhc2stPnRrX21zZy5ycGNfYXJncDsKKwl1bnNpZ25lZCBsb25nIHRpbWVzdGFtcCA9ICh1bnNpZ25lZCBsb25nKXRhc2stPnRrX2NhbGxkYXRhOworCisJaWYgKHRhc2stPnRrX3N0YXR1cyA8IDApIHsKKwkJc3dpdGNoICh0YXNrLT50a19zdGF0dXMpIHsKKwkJCWNhc2UgLU5GUzRFUlJfU1RBTEVfQ0xJRU5USUQ6CisJCQljYXNlIC1ORlM0RVJSX0VYUElSRUQ6CisJCQljYXNlIC1ORlM0RVJSX0NCX1BBVEhfRE9XTjoKKwkJCQluZnM0X3NjaGVkdWxlX3N0YXRlX3JlY292ZXJ5KGNscCk7CisJCX0KKwkJcmV0dXJuOworCX0KKwlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CisJaWYgKHRpbWVfYmVmb3JlKGNscC0+Y2xfbGFzdF9yZW5ld2FsLHRpbWVzdGFtcCkpCisJCWNscC0+Y2xfbGFzdF9yZW5ld2FsID0gdGltZXN0YW1wOworCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworfQorCitpbnQKK25mczRfcHJvY19hc3luY19yZW5ldyhzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MJPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfUkVORVddLAorCQkucnBjX2FyZ3AJPSBjbHAsCisJCS5ycGNfY3JlZAk9IGNscC0+Y2xfY3JlZCwKKwl9OworCisJcmV0dXJuIHJwY19jYWxsX2FzeW5jKGNscC0+Y2xfcnBjY2xpZW50LCAmbXNnLCBSUENfVEFTS19TT0ZULAorCQkJcmVuZXdfZG9uZSwgKHZvaWQgKilqaWZmaWVzKTsKK30KKworaW50CituZnM0X3Byb2NfcmVuZXcoc3RydWN0IG5mczRfY2xpZW50ICpjbHApCit7CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jCT0gJm5mczRfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX1JFTkVXXSwKKwkJLnJwY19hcmdwCT0gY2xwLAorCQkucnBjX2NyZWQJPSBjbHAtPmNsX2NyZWQsCisJfTsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoY2xwLT5jbF9ycGNjbGllbnQsICZtc2csIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwlpZiAodGltZV9iZWZvcmUoY2xwLT5jbF9sYXN0X3JlbmV3YWwsbm93KSkKKwkJY2xwLT5jbF9sYXN0X3JlbmV3YWwgPSBub3c7CisJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSB3aWxsIG5lZWQgdG8gYXJyYW5nZSBmb3IgdGhlIFZGUyBsYXllciB0byBwcm92aWRlIGFuIGF0b21pYyBvcGVuLgorICogVW50aWwgdGhlbiwgdGhpcyBvcGVuIG1ldGhvZCBpcyBwcm9uZSB0byBpbmVmZmljaWVuY3kgYW5kIHJhY2UgY29uZGl0aW9ucworICogZHVlIHRvIHRoZSBsb29rdXAsIHBvdGVudGlhbCBjcmVhdGUsIGFuZCBvcGVuIFZGUyBjYWxscyBmcm9tIHN5c19vcGVuKCkKKyAqIHBsYWNlZCBvbiB0aGUgd2lyZS4KKyAqLworc3RhdGljIGludAorbmZzNF9wcm9jX2ZpbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4OworCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSA9IE5VTEw7CisJc3RydWN0IHJwY19jcmVkICpjcmVkOworCWludCBzdGF0dXMgPSAtRU5PTUVNOworCisJZHByaW50aygibmZzNF9wcm9jX2ZpbGVfb3Blbjogc3RhcnRpbmcgb24gKCUuKnMvJS4qcylcbiIsCisJICAgICAgICAgICAgICAgICAgICAgICAoaW50KWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5sZW4sCisJICAgICAgICAgICAgICAgICAgICAgICBkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwKKwkgICAgICAgICAgICAgICAgICAgICAgIChpbnQpZGVudHJ5LT5kX25hbWUubGVuLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCisJLyogRmluZCBvdXIgb3BlbiBzdGF0ZWlkICovCisJY3JlZCA9IHJwY2F1dGhfbG9va3VwY3JlZChORlNfU0VSVkVSKGlub2RlKS0+Y2xpZW50LT5jbF9hdXRoLCAwKTsKKwlpZiAoSVNfRVJSKGNyZWQpKQorCQlyZXR1cm4gUFRSX0VSUihjcmVkKTsKKwljdHggPSBhbGxvY19uZnNfb3Blbl9jb250ZXh0KGRlbnRyeSwgY3JlZCk7CisJcHV0X3JwY2NyZWQoY3JlZCk7CisJaWYgKHVubGlrZWx5KGN0eCA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc3RhdHVzID0gLUVJTzsgLyogRVJBQ0UgYWN0dWFsbHkgKi8KKwlzdGF0ZSA9IG5mczRfZmluZF9zdGF0ZShpbm9kZSwgY3JlZCwgZmlscC0+Zl9tb2RlKTsKKwlpZiAodW5saWtlbHkoc3RhdGUgPT0gTlVMTCkpCisJCWdvdG8gbm9fc3RhdGU7CisJY3R4LT5zdGF0ZSA9IHN0YXRlOworCW5mczRfY2xvc2Vfc3RhdGUoc3RhdGUsIGZpbHAtPmZfbW9kZSk7CisJY3R4LT5tb2RlID0gZmlscC0+Zl9tb2RlOworCW5mc19maWxlX3NldF9vcGVuX2NvbnRleHQoZmlscCwgY3R4KTsKKwlwdXRfbmZzX29wZW5fY29udGV4dChjdHgpOworCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJbmZzX2JlZ2luX2RhdGFfdXBkYXRlKGlub2RlKTsKKwlyZXR1cm4gMDsKK25vX3N0YXRlOgorCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUzogdjQgcmFjZWQgaW4gZnVuY3Rpb24gJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJcHV0X25mc19vcGVuX2NvbnRleHQoY3R4KTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogUmVsZWFzZSBvdXIgc3RhdGUKKyAqLworc3RhdGljIGludAorbmZzNF9wcm9jX2ZpbGVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCW5mc19lbmRfZGF0YV91cGRhdGUoaW5vZGUpOworCW5mc19maWxlX2NsZWFyX29wZW5fY29udGV4dChmaWxwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmZzNF9hc3luY19oYW5kbGVfZXJyb3Ioc3RydWN0IHJwY190YXNrICp0YXNrLCBzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnM0X3N0YXRlOworCisJaWYgKCFjbHAgfHwgdGFzay0+dGtfc3RhdHVzID49IDApCisJCXJldHVybiAwOworCXN3aXRjaCh0YXNrLT50a19zdGF0dXMpIHsKKwkJY2FzZSAtTkZTNEVSUl9TVEFMRV9DTElFTlRJRDoKKwkJY2FzZSAtTkZTNEVSUl9TVEFMRV9TVEFURUlEOgorCQljYXNlIC1ORlM0RVJSX0VYUElSRUQ6CisJCQlycGNfc2xlZXBfb24oJmNscC0+Y2xfcnBjd2FpdHEsIHRhc2ssIE5VTEwsIE5VTEwpOworCQkJbmZzNF9zY2hlZHVsZV9zdGF0ZV9yZWNvdmVyeShjbHApOworCQkJaWYgKHRlc3RfYml0KE5GUzRDTE5UX09LLCAmY2xwLT5jbF9zdGF0ZSkpCisJCQkJcnBjX3dha2VfdXBfdGFzayh0YXNrKTsKKwkJCXRhc2stPnRrX3N0YXR1cyA9IDA7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJY2FzZSAtTkZTNEVSUl9HUkFDRToKKwkJY2FzZSAtTkZTNEVSUl9ERUxBWToKKwkJCXJwY19kZWxheSh0YXNrLCBORlM0X1BPTExfUkVUUllfTUFYKTsKKwkJCXRhc2stPnRrX3N0YXR1cyA9IDA7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJY2FzZSAtTkZTNEVSUl9PTERfU1RBVEVJRDoKKwkJCXRhc2stPnRrX3N0YXR1cyA9IDA7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJdGFzay0+dGtfc3RhdHVzID0gbmZzNF9tYXBfZXJyb3JzKHRhc2stPnRrX3N0YXR1cyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF93YWl0X2NsbnRfcmVjb3ZlcihzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQsIHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCURFRklORV9XQUlUKHdhaXQpOworCXNpZ3NldF90IG9sZHNldDsKKwlpbnQgaW50ZXJydXB0aWJsZSwgcmVzID0gMDsKKworCW1pZ2h0X3NsZWVwKCk7CisKKwlycGNfY2xudF9zaWdtYXNrKGNsbnQsICZvbGRzZXQpOworCWludGVycnVwdGlibGUgPSBUQVNLX1VOSU5URVJSVVBUSUJMRTsKKwlpZiAoY2xudC0+Y2xfaW50cikKKwkJaW50ZXJydXB0aWJsZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlwcmVwYXJlX3RvX3dhaXQoJmNscC0+Y2xfd2FpdHEsICZ3YWl0LCBpbnRlcnJ1cHRpYmxlKTsKKwluZnM0X3NjaGVkdWxlX3N0YXRlX3JlY292ZXJ5KGNscCk7CisJaWYgKGNsbnQtPmNsX2ludHIgJiYgc2lnbmFsbGVkKCkpCisJCXJlcyA9IC1FUkVTVEFSVFNZUzsKKwllbHNlIGlmICghdGVzdF9iaXQoTkZTNENMTlRfT0ssICZjbHAtPmNsX3N0YXRlKSkKKwkJc2NoZWR1bGUoKTsKKwlmaW5pc2hfd2FpdCgmY2xwLT5jbF93YWl0cSwgJndhaXQpOworCXJwY19jbG50X3NpZ3VubWFzayhjbG50LCAmb2xkc2V0KTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IG5mczRfZGVsYXkoc3RydWN0IHJwY19jbG50ICpjbG50LCBsb25nICp0aW1lb3V0KQoreworCXNpZ3NldF90IG9sZHNldDsKKwlpbnQgcmVzID0gMDsKKworCW1pZ2h0X3NsZWVwKCk7CisKKwlpZiAoKnRpbWVvdXQgPD0gMCkKKwkJKnRpbWVvdXQgPSBORlM0X1BPTExfUkVUUllfTUlOOworCWlmICgqdGltZW91dCA+IE5GUzRfUE9MTF9SRVRSWV9NQVgpCisJCSp0aW1lb3V0ID0gTkZTNF9QT0xMX1JFVFJZX01BWDsKKwlycGNfY2xudF9zaWdtYXNrKGNsbnQsICZvbGRzZXQpOworCWlmIChjbG50LT5jbF9pbnRyKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoKnRpbWVvdXQpOworCQlpZiAoc2lnbmFsbGVkKCkpCisJCQlyZXMgPSAtRVJFU1RBUlRTWVM7CisJfSBlbHNlIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KCp0aW1lb3V0KTsKKwl9CisJcnBjX2NsbnRfc2lndW5tYXNrKGNsbnQsICZvbGRzZXQpOworCSp0aW1lb3V0IDw8PSAxOworCXJldHVybiByZXM7Cit9CisKKy8qIFRoaXMgaXMgdGhlIGVycm9yIGhhbmRsaW5nIHJvdXRpbmUgZm9yIHByb2Nlc3NlcyB0aGF0IGFyZSBhbGxvd2VkCisgKiB0byBzbGVlcC4KKyAqLworaW50IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBpbnQgZXJyb3Jjb2RlLCBzdHJ1Y3QgbmZzNF9leGNlcHRpb24gKmV4Y2VwdGlvbikKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IHNlcnZlci0+bmZzNF9zdGF0ZTsKKwlpbnQgcmV0ID0gZXJyb3Jjb2RlOworCisJZXhjZXB0aW9uLT5yZXRyeSA9IDA7CisJc3dpdGNoKGVycm9yY29kZSkgeworCQljYXNlIDA6CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAtTkZTNEVSUl9TVEFMRV9DTElFTlRJRDoKKwkJY2FzZSAtTkZTNEVSUl9TVEFMRV9TVEFURUlEOgorCQljYXNlIC1ORlM0RVJSX0VYUElSRUQ6CisJCQlyZXQgPSBuZnM0X3dhaXRfY2xudF9yZWNvdmVyKHNlcnZlci0+Y2xpZW50LCBjbHApOworCQkJaWYgKHJldCA9PSAwKQorCQkJCWV4Y2VwdGlvbi0+cmV0cnkgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgLU5GUzRFUlJfR1JBQ0U6CisJCWNhc2UgLU5GUzRFUlJfREVMQVk6CisJCQlyZXQgPSBuZnM0X2RlbGF5KHNlcnZlci0+Y2xpZW50LCAmZXhjZXB0aW9uLT50aW1lb3V0KTsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlleGNlcHRpb24tPnJldHJ5ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIC1ORlM0RVJSX09MRF9TVEFURUlEOgorCQkJaWYgKHJldCA9PSAwKQorCQkJCWV4Y2VwdGlvbi0+cmV0cnkgPSAxOworCX0KKwkvKiBXZSBmYWlsZWQgdG8gaGFuZGxlIHRoZSBlcnJvciAqLworCXJldHVybiBuZnM0X21hcF9lcnJvcnMocmV0KTsKK30KKworaW50IG5mczRfcHJvY19zZXRjbGllbnRpZChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCwgdTMyIHByb2dyYW0sIHVuc2lnbmVkIHNob3J0IHBvcnQpCit7CisJbmZzNF92ZXJpZmllciBzY192ZXJpZmllcjsKKwlzdHJ1Y3QgbmZzNF9zZXRjbGllbnRpZCBzZXRjbGllbnRpZCA9IHsKKwkJLnNjX3ZlcmlmaWVyID0gJnNjX3ZlcmlmaWVyLAorCQkuc2NfcHJvZyA9IHByb2dyYW0sCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfU0VUQ0xJRU5USURdLAorCQkucnBjX2FyZ3AgPSAmc2V0Y2xpZW50aWQsCisJCS5ycGNfcmVzcCA9IGNscCwKKwkJLnJwY19jcmVkID0gY2xwLT5jbF9jcmVkLAorCX07CisJdTMyICpwOworCWludCBsb29wID0gMDsKKwlpbnQgc3RhdHVzOworCisJcCA9ICh1MzIqKXNjX3ZlcmlmaWVyLmRhdGE7CisJKnArKyA9IGh0b25sKCh1MzIpY2xwLT5jbF9ib290X3RpbWUudHZfc2VjKTsKKwkqcCA9IGh0b25sKCh1MzIpY2xwLT5jbF9ib290X3RpbWUudHZfbnNlYyk7CisKKwlmb3IoOzspIHsKKwkJc2V0Y2xpZW50aWQuc2NfbmFtZV9sZW4gPSBzY25wcmludGYoc2V0Y2xpZW50aWQuc2NfbmFtZSwKKwkJCQlzaXplb2Yoc2V0Y2xpZW50aWQuc2NfbmFtZSksICIlcy8ldS4ldS4ldS4ldSAlcyAldSIsCisJCQkJY2xwLT5jbF9pcGFkZHIsIE5JUFFVQUQoY2xwLT5jbF9hZGRyLnNfYWRkciksCisJCQkJY2xwLT5jbF9jcmVkLT5jcl9vcHMtPmNyX25hbWUsCisJCQkJY2xwLT5jbF9pZF91bmlxdWlmaWVyKTsKKwkJc2V0Y2xpZW50aWQuc2NfbmV0aWRfbGVuID0gc2NucHJpbnRmKHNldGNsaWVudGlkLnNjX25ldGlkLAorCQkJCXNpemVvZihzZXRjbGllbnRpZC5zY19uZXRpZCksICJ0Y3AiKTsKKwkJc2V0Y2xpZW50aWQuc2NfdWFkZHJfbGVuID0gc2NucHJpbnRmKHNldGNsaWVudGlkLnNjX3VhZGRyLAorCQkJCXNpemVvZihzZXRjbGllbnRpZC5zY191YWRkciksICIlcy4lZC4lZCIsCisJCQkJY2xwLT5jbF9pcGFkZHIsIHBvcnQgPj4gOCwgcG9ydCAmIDI1NSk7CisKKwkJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhjbHAtPmNsX3JwY2NsaWVudCwgJm1zZywgMCk7CisJCWlmIChzdGF0dXMgIT0gLU5GUzRFUlJfQ0xJRF9JTlVTRSkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsbGVkKCkpCisJCQlicmVhazsKKwkJaWYgKGxvb3ArKyAmIDEpCisJCQlzc2xlZXAoY2xwLT5jbF9sZWFzZV90aW1lICsgMSk7CisJCWVsc2UKKwkJCWlmICgrK2NscC0+Y2xfaWRfdW5pcXVpZmllciA9PSAwKQorCQkJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQKK25mczRfcHJvY19zZXRjbGllbnRpZF9jb25maXJtKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCXN0cnVjdCBuZnNfZnNpbmZvIGZzaW5mbzsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfU0VUQ0xJRU5USURfQ09ORklSTV0sCisJCS5ycGNfYXJncCA9IGNscCwKKwkJLnJwY19yZXNwID0gJmZzaW5mbywKKwkJLnJwY19jcmVkID0gY2xwLT5jbF9jcmVkLAorCX07CisJdW5zaWduZWQgbG9uZyBub3c7CisJaW50IHN0YXR1czsKKworCW5vdyA9IGppZmZpZXM7CisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhjbHAtPmNsX3JwY2NsaWVudCwgJm1zZywgMCk7CisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwkJY2xwLT5jbF9sZWFzZV90aW1lID0gZnNpbmZvLmxlYXNlX3RpbWUgKiBIWjsKKwkJY2xwLT5jbF9sYXN0X3JlbmV3YWwgPSBub3c7CisJCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IF9uZnM0X3Byb2NfZGVsZWdyZXR1cm4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBjb25zdCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQpCit7CisJc3RydWN0IG5mczRfZGVsZWdyZXR1cm5hcmdzIGFyZ3MgPSB7CisJCS5maGFuZGxlID0gTkZTX0ZIKGlub2RlKSwKKwkJLnN0YXRlaWQgPSBzdGF0ZWlkLAorCX07CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jID0gJm5mczRfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX0RFTEVHUkVUVVJOXSwKKwkJLnJwY19hcmdwID0gJmFyZ3MsCisJCS5ycGNfY3JlZCA9IGNyZWQsCisJfTsKKworCXJldHVybiBycGNfY2FsbF9zeW5jKE5GU19DTElFTlQoaW5vZGUpLCAmbXNnLCAwKTsKK30KKworaW50IG5mczRfcHJvY19kZWxlZ3JldHVybihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIGNvbnN0IG5mczRfc3RhdGVpZCAqc3RhdGVpZCkKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihpbm9kZSk7CisJc3RydWN0IG5mczRfZXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHsgfTsKKwlpbnQgZXJyOworCWRvIHsKKwkJZXJyID0gX25mczRfcHJvY19kZWxlZ3JldHVybihpbm9kZSwgY3JlZCwgc3RhdGVpZCk7CisJCXN3aXRjaCAoZXJyKSB7CisJCQljYXNlIC1ORlM0RVJSX1NUQUxFX1NUQVRFSUQ6CisJCQljYXNlIC1ORlM0RVJSX0VYUElSRUQ6CisJCQkJbmZzNF9zY2hlZHVsZV9zdGF0ZV9yZWNvdmVyeShzZXJ2ZXItPm5mczRfc3RhdGUpOworCQkJY2FzZSAwOgorCQkJCXJldHVybiAwOworCQl9CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihzZXJ2ZXIsIGVyciwgJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCisjZGVmaW5lIE5GUzRfTE9DS19NSU5USU1FT1VUICgxICogSFopCisjZGVmaW5lIE5GUzRfTE9DS19NQVhUSU1FT1VUICgzMCAqIEhaKQorCisvKiAKKyAqIHNsZWVwLCB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYsIGFuZCByZXRyeSB0aGUgTE9DSyBvcGVyYXRpb24uIAorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZworbmZzNF9zZXRfbG9ja190YXNrX3JldHJ5KHVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCXRpbWVvdXQgPDw9IDE7CisJaWYgKHRpbWVvdXQgPiBORlM0X0xPQ0tfTUFYVElNRU9VVCkKKwkJcmV0dXJuIE5GUzRfTE9DS19NQVhUSU1FT1VUOworCXJldHVybiB0aW1lb3V0OworfQorCitzdGF0aWMgaW5saW5lIGludAorbmZzNF9sY2tfdHlwZShpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpyZXF1ZXN0KQoreworCS8qIHNldCBsb2NrIHR5cGUgKi8KKwlzd2l0Y2ggKHJlcXVlc3QtPmZsX3R5cGUpIHsKKwkJY2FzZSBGX1JETENLOgorCQkJcmV0dXJuIElTX1NFVExLVyhjbWQpID8gTkZTNF9SRUFEV19MVCA6IE5GUzRfUkVBRF9MVDsKKwkJY2FzZSBGX1dSTENLOgorCQkJcmV0dXJuIElTX1NFVExLVyhjbWQpID8gTkZTNF9XUklURVdfTFQgOiBORlM0X1dSSVRFX0xUOworCQljYXNlIEZfVU5MQ0s6CisJCQlyZXR1cm4gTkZTNF9XUklURV9MVDsgCisJfQorCUJVRygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90CituZnM0X2xja19sZW5ndGgoc3RydWN0IGZpbGVfbG9jayAqcmVxdWVzdCkKK3sKKwlpZiAocmVxdWVzdC0+ZmxfZW5kID09IE9GRlNFVF9NQVgpCisJCXJldHVybiB+KHVpbnQ2NF90KTA7CisJcmV0dXJuIHJlcXVlc3QtPmZsX2VuZCAtIHJlcXVlc3QtPmZsX3N0YXJ0ICsgMTsKK30KKworc3RhdGljIGludCBfbmZzNF9wcm9jX2dldGxrKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc3RhdGUtPmlub2RlOworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGlub2RlKTsKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IHNlcnZlci0+bmZzNF9zdGF0ZTsKKwlzdHJ1Y3QgbmZzX2xvY2thcmdzIGFyZyA9IHsKKwkJLmZoID0gTkZTX0ZIKGlub2RlKSwKKwkJLnR5cGUgPSBuZnM0X2xja190eXBlKGNtZCwgcmVxdWVzdCksCisJCS5vZmZzZXQgPSByZXF1ZXN0LT5mbF9zdGFydCwKKwkJLmxlbmd0aCA9IG5mczRfbGNrX2xlbmd0aChyZXF1ZXN0KSwKKwl9OworCXN0cnVjdCBuZnNfbG9ja3JlcyByZXMgPSB7CisJCS5zZXJ2ZXIgPSBzZXJ2ZXIsCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MJPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfTE9DS1RdLAorCQkucnBjX2FyZ3AgICAgICAgPSAmYXJnLAorCQkucnBjX3Jlc3AgICAgICAgPSAmcmVzLAorCQkucnBjX2NyZWQJPSBzdGF0ZS0+b3duZXItPnNvX2NyZWQsCisJfTsKKwlzdHJ1Y3QgbmZzX2xvd25lciBubG87CisJc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqbHNwOworCWludCBzdGF0dXM7CisKKwlkb3duX3JlYWQoJmNscC0+Y2xfc2VtKTsKKwlubG8uY2xpZW50aWQgPSBjbHAtPmNsX2NsaWVudGlkOworCWRvd24oJnN0YXRlLT5sb2NrX3NlbWEpOworCWxzcCA9IG5mczRfZmluZF9sb2NrX3N0YXRlKHN0YXRlLCByZXF1ZXN0LT5mbF9vd25lcik7CisJaWYgKGxzcCkKKwkJbmxvLmlkID0gbHNwLT5sc19pZDsgCisJZWxzZSB7CisJCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwkJbmxvLmlkID0gbmZzNF9hbGxvY19sb2Nrb3duZXJfaWQoY2xwKTsKKwkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJfQorCWFyZy51LmxvY2t0ID0gJm5sbzsKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50LCAmbXNnLCAwKTsKKwlpZiAoIXN0YXR1cykgeworCQlyZXF1ZXN0LT5mbF90eXBlID0gRl9VTkxDSzsKKwl9IGVsc2UgaWYgKHN0YXR1cyA9PSAtTkZTNEVSUl9ERU5JRUQpIHsKKwkJaW50NjRfdCBsZW4sIHN0YXJ0LCBlbmQ7CisJCXN0YXJ0ID0gcmVzLnUuZGVuaWVkLm9mZnNldDsKKwkJbGVuID0gcmVzLnUuZGVuaWVkLmxlbmd0aDsKKwkJZW5kID0gc3RhcnQgKyBsZW4gLSAxOworCQlpZiAoZW5kIDwgMCB8fCBsZW4gPT0gMCkKKwkJCXJlcXVlc3QtPmZsX2VuZCA9IE9GRlNFVF9NQVg7CisJCWVsc2UKKwkJCXJlcXVlc3QtPmZsX2VuZCA9IChsb2ZmX3QpZW5kOworCQlyZXF1ZXN0LT5mbF9zdGFydCA9IChsb2ZmX3Qpc3RhcnQ7CisJCXJlcXVlc3QtPmZsX3R5cGUgPSBGX1dSTENLOworCQlpZiAocmVzLnUuZGVuaWVkLnR5cGUgJiAxKQorCQkJcmVxdWVzdC0+ZmxfdHlwZSA9IEZfUkRMQ0s7CisJCXJlcXVlc3QtPmZsX3BpZCA9IDA7CisJCXN0YXR1cyA9IDA7CisJfQorCWlmIChsc3ApCisJCW5mczRfcHV0X2xvY2tfc3RhdGUobHNwKTsKKwl1cCgmc3RhdGUtPmxvY2tfc2VtYSk7CisJdXBfcmVhZCgmY2xwLT5jbF9zZW0pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9wcm9jX2dldGxrKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCWludCBlcnI7CisKKwlkbyB7CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKHN0YXRlLT5pbm9kZSksCisJCQkJX25mczRfcHJvY19nZXRsayhzdGF0ZSwgY21kLCByZXF1ZXN0KSwKKwkJCQkmZXhjZXB0aW9uKTsKKwl9IHdoaWxlIChleGNlcHRpb24ucmV0cnkpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZG9fdmZzX2xvY2soc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCWludCByZXMgPSAwOworCXN3aXRjaCAoZmwtPmZsX2ZsYWdzICYgKEZMX1BPU0lYfEZMX0ZMT0NLKSkgeworCQljYXNlIEZMX1BPU0lYOgorCQkJcmVzID0gcG9zaXhfbG9ja19maWxlX3dhaXQoZmlsZSwgZmwpOworCQkJYnJlYWs7CisJCWNhc2UgRkxfRkxPQ0s6CisJCQlyZXMgPSBmbG9ja19sb2NrX2ZpbGVfd2FpdChmaWxlLCBmbCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCX0KKwlpZiAocmVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFZGUyBpcyBvdXQgb2Ygc3luYyB3aXRoIGxvY2sgbWFuYWdlciFcbiIsCisJCQkJX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IF9uZnM0X3Byb2NfdW5sY2soc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpyZXF1ZXN0KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzdGF0ZS0+aW5vZGU7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoaW5vZGUpOworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnM0X3N0YXRlOworCXN0cnVjdCBuZnNfbG9ja2FyZ3MgYXJnID0geworCQkuZmggPSBORlNfRkgoaW5vZGUpLAorCQkudHlwZSA9IG5mczRfbGNrX3R5cGUoY21kLCByZXF1ZXN0KSwKKwkJLm9mZnNldCA9IHJlcXVlc3QtPmZsX3N0YXJ0LAorCQkubGVuZ3RoID0gbmZzNF9sY2tfbGVuZ3RoKHJlcXVlc3QpLAorCX07CisJc3RydWN0IG5mc19sb2NrcmVzIHJlcyA9IHsKKwkJLnNlcnZlciA9IHNlcnZlciwKKwl9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYwk9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9MT0NLVV0sCisJCS5ycGNfYXJncCAgICAgICA9ICZhcmcsCisJCS5ycGNfcmVzcCAgICAgICA9ICZyZXMsCisJCS5ycGNfY3JlZAk9IHN0YXRlLT5vd25lci0+c29fY3JlZCwKKwl9OworCXN0cnVjdCBuZnM0X2xvY2tfc3RhdGUgKmxzcDsKKwlzdHJ1Y3QgbmZzX2xvY2t1X29wYXJncyBsdWFyZ3M7CisJaW50IHN0YXR1cyA9IDA7CisJCQkKKwlkb3duX3JlYWQoJmNscC0+Y2xfc2VtKTsKKwlkb3duKCZzdGF0ZS0+bG9ja19zZW1hKTsKKwlsc3AgPSBuZnM0X2ZpbmRfbG9ja19zdGF0ZShzdGF0ZSwgcmVxdWVzdC0+Zmxfb3duZXIpOworCWlmICghbHNwKQorCQlnb3RvIG91dDsKKwkvKiBXZSBtaWdodCBoYXZlIGxvc3QgdGhlIGxvY2tzISAqLworCWlmICgobHNwLT5sc19mbGFncyAmIE5GU19MT0NLX0lOSVRJQUxJWkVEKSAhPSAwKSB7CisJCWx1YXJncy5zZXFpZCA9IGxzcC0+bHNfc2VxaWQ7CisJCW1lbWNweSgmbHVhcmdzLnN0YXRlaWQsICZsc3AtPmxzX3N0YXRlaWQsIHNpemVvZihsdWFyZ3Muc3RhdGVpZCkpOworCQlhcmcudS5sb2NrdSA9ICZsdWFyZ3M7CisJCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoc2VydmVyLT5jbGllbnQsICZtc2csIFJQQ19UQVNLX05PSU5UUik7CisJCW5mczRfaW5jcmVtZW50X2xvY2tfc2VxaWQoc3RhdHVzLCBsc3ApOworCX0KKworCWlmIChzdGF0dXMgPT0gMCkgeworCQltZW1jcHkoJmxzcC0+bHNfc3RhdGVpZCwgICZyZXMudS5zdGF0ZWlkLCAKKwkJCQlzaXplb2YobHNwLT5sc19zdGF0ZWlkKSk7CisJCW5mczRfbm90aWZ5X3VubGNrKHN0YXRlLCByZXF1ZXN0LCBsc3ApOworCX0KKwluZnM0X3B1dF9sb2NrX3N0YXRlKGxzcCk7CitvdXQ6CisJdXAoJnN0YXRlLT5sb2NrX3NlbWEpOworCWlmIChzdGF0dXMgPT0gMCkKKwkJZG9fdmZzX2xvY2socmVxdWVzdC0+ZmxfZmlsZSwgcmVxdWVzdCk7CisJdXBfcmVhZCgmY2xwLT5jbF9zZW0pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9wcm9jX3VubGNrKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCWludCBlcnI7CisKKwlkbyB7CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKHN0YXRlLT5pbm9kZSksCisJCQkJX25mczRfcHJvY191bmxjayhzdGF0ZSwgY21kLCByZXF1ZXN0KSwKKwkJCQkmZXhjZXB0aW9uKTsKKwl9IHdoaWxlIChleGNlcHRpb24ucmV0cnkpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX25mczRfZG9fc2V0bGsoc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpyZXF1ZXN0LCBpbnQgcmVjbGFpbSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc3RhdGUtPmlub2RlOworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGlub2RlKTsKKwlzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICpsc3A7CisJc3RydWN0IG5mc19sb2NrYXJncyBhcmcgPSB7CisJCS5maCA9IE5GU19GSChpbm9kZSksCisJCS50eXBlID0gbmZzNF9sY2tfdHlwZShjbWQsIHJlcXVlc3QpLAorCQkub2Zmc2V0ID0gcmVxdWVzdC0+Zmxfc3RhcnQsCisJCS5sZW5ndGggPSBuZnM0X2xja19sZW5ndGgocmVxdWVzdCksCisJfTsKKwlzdHJ1Y3QgbmZzX2xvY2tyZXMgcmVzID0geworCQkuc2VydmVyID0gc2VydmVyLAorCX07CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jCT0gJm5mczRfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX0xPQ0tdLAorCQkucnBjX2FyZ3AgICAgICAgPSAmYXJnLAorCQkucnBjX3Jlc3AgICAgICAgPSAmcmVzLAorCQkucnBjX2NyZWQJPSBzdGF0ZS0+b3duZXItPnNvX2NyZWQsCisJfTsKKwlzdHJ1Y3QgbmZzX2xvY2tfb3BhcmdzIGxhcmdzID0geworCQkucmVjbGFpbSA9IHJlY2xhaW0sCisJCS5uZXdfbG9ja19vd25lciA9IDAsCisJfTsKKwlpbnQgc3RhdHVzOworCisJbHNwID0gbmZzNF9nZXRfbG9ja19zdGF0ZShzdGF0ZSwgcmVxdWVzdC0+Zmxfb3duZXIpOworCWlmIChsc3AgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCEobHNwLT5sc19mbGFncyAmIE5GU19MT0NLX0lOSVRJQUxJWkVEKSkgeworCQlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqb3duZXIgPSBzdGF0ZS0+b3duZXI7CisJCXN0cnVjdCBuZnNfb3Blbl90b19sb2NrIG90bCA9IHsKKwkJCS5sb2NrX293bmVyID0geworCQkJCS5jbGllbnRpZCA9IHNlcnZlci0+bmZzNF9zdGF0ZS0+Y2xfY2xpZW50aWQsCisJCQl9LAorCQl9OworCisJCW90bC5sb2NrX3NlcWlkID0gbHNwLT5sc19zZXFpZDsKKwkJb3RsLmxvY2tfb3duZXIuaWQgPSBsc3AtPmxzX2lkOworCQltZW1jcHkoJm90bC5vcGVuX3N0YXRlaWQsICZzdGF0ZS0+c3RhdGVpZCwgc2l6ZW9mKG90bC5vcGVuX3N0YXRlaWQpKTsKKwkJbGFyZ3MudS5vcGVuX2xvY2sgPSAmb3RsOworCQlsYXJncy5uZXdfbG9ja19vd25lciA9IDE7CisJCWFyZy51LmxvY2sgPSAmbGFyZ3M7CisJCWRvd24oJm93bmVyLT5zb19zZW1hKTsKKwkJb3RsLm9wZW5fc2VxaWQgPSBvd25lci0+c29fc2VxaWQ7CisJCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoc2VydmVyLT5jbGllbnQsICZtc2csIFJQQ19UQVNLX05PSU5UUik7CisJCS8qIGluY3JlbWVudCBvcGVuX293bmVyIHNlcWlkIG9uIHN1Y2Nlc3MsIGFuZCAKKwkJKiBzZXFpZCBtdXRhdGluZyBlcnJvcnMgKi8KKwkJbmZzNF9pbmNyZW1lbnRfc2VxaWQoc3RhdHVzLCBvd25lcik7CisJCXVwKCZvd25lci0+c29fc2VtYSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IG5mc19leGlzdF9sb2NrIGVsID0geworCQkJLnNlcWlkID0gbHNwLT5sc19zZXFpZCwKKwkJfTsKKwkJbWVtY3B5KCZlbC5zdGF0ZWlkLCAmbHNwLT5sc19zdGF0ZWlkLCBzaXplb2YoZWwuc3RhdGVpZCkpOworCQlsYXJncy51LmV4aXN0X2xvY2sgPSAmZWw7CisJCWxhcmdzLm5ld19sb2NrX293bmVyID0gMDsKKwkJYXJnLnUubG9jayA9ICZsYXJnczsKKwkJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhzZXJ2ZXItPmNsaWVudCwgJm1zZywgUlBDX1RBU0tfTk9JTlRSKTsKKwl9CisJLyogaW5jcmVtZW50IHNlcWlkIG9uIHN1Y2Nlc3MsIGFuZCAqIHNlcWlkIG11dGF0aW5nIGVycm9ycyovCisJbmZzNF9pbmNyZW1lbnRfbG9ja19zZXFpZChzdGF0dXMsIGxzcCk7CisJLyogc2F2ZSB0aGUgcmV0dXJuZWQgc3RhdGVpZC4gKi8KKwlpZiAoc3RhdHVzID09IDApIHsKKwkJbWVtY3B5KCZsc3AtPmxzX3N0YXRlaWQsICZyZXMudS5zdGF0ZWlkLCBzaXplb2YobmZzNF9zdGF0ZWlkKSk7CisJCWxzcC0+bHNfZmxhZ3MgfD0gTkZTX0xPQ0tfSU5JVElBTElaRUQ7CisJCWlmICghcmVjbGFpbSkKKwkJCW5mczRfbm90aWZ5X3NldGxrKHN0YXRlLCByZXF1ZXN0LCBsc3ApOworCX0gZWxzZSBpZiAoc3RhdHVzID09IC1ORlM0RVJSX0RFTklFRCkKKwkJc3RhdHVzID0gLUVBR0FJTjsKKwluZnM0X3B1dF9sb2NrX3N0YXRlKGxzcCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBuZnM0X2xvY2tfcmVjbGFpbShzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBmaWxlX2xvY2sgKnJlcXVlc3QpCit7CisJcmV0dXJuIF9uZnM0X2RvX3NldGxrKHN0YXRlLCBGX1NFVExLLCByZXF1ZXN0LCAxKTsKK30KKworc3RhdGljIGludCBuZnM0X2xvY2tfZXhwaXJlZChzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBmaWxlX2xvY2sgKnJlcXVlc3QpCit7CisJcmV0dXJuIF9uZnM0X2RvX3NldGxrKHN0YXRlLCBGX1NFVExLLCByZXF1ZXN0LCAwKTsKK30KKworc3RhdGljIGludCBfbmZzNF9wcm9jX3NldGxrKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IHN0YXRlLT5vd25lci0+c29fY2xpZW50OworCWludCBzdGF0dXM7CisKKwlkb3duX3JlYWQoJmNscC0+Y2xfc2VtKTsKKwlkb3duKCZzdGF0ZS0+bG9ja19zZW1hKTsKKwlzdGF0dXMgPSBfbmZzNF9kb19zZXRsayhzdGF0ZSwgY21kLCByZXF1ZXN0LCAwKTsKKwl1cCgmc3RhdGUtPmxvY2tfc2VtYSk7CisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCS8qIE5vdGU6IHdlIGFsd2F5cyB3YW50IHRvIHNsZWVwIGhlcmUhICovCisJCXJlcXVlc3QtPmZsX2ZsYWdzIHw9IEZMX1NMRUVQOworCQlpZiAoZG9fdmZzX2xvY2socmVxdWVzdC0+ZmxfZmlsZSwgcmVxdWVzdCkgPCAwKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFZGUyBpcyBvdXQgb2Ygc3luYyB3aXRoIGxvY2sgbWFuYWdlciFcbiIsIF9fRlVOQ1RJT05fXyk7CisJfQorCXVwX3JlYWQoJmNscC0+Y2xfc2VtKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mczRfcHJvY19zZXRsayhzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKnJlcXVlc3QpCit7CisJc3RydWN0IG5mczRfZXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHsgfTsKKwlpbnQgZXJyOworCisJZG8geworCQllcnIgPSBuZnM0X2hhbmRsZV9leGNlcHRpb24oTkZTX1NFUlZFUihzdGF0ZS0+aW5vZGUpLAorCQkJCV9uZnM0X3Byb2Nfc2V0bGsoc3RhdGUsIGNtZCwgcmVxdWVzdCksCisJCQkJJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CituZnM0X3Byb2NfbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4OworCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBORlM0X0xPQ0tfTUlOVElNRU9VVDsKKwlpbnQgc3RhdHVzOworCisJLyogdmVyaWZ5IG9wZW4gc3RhdGUgKi8KKwljdHggPSAoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKilmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RhdGUgPSBjdHgtPnN0YXRlOworCisJaWYgKHJlcXVlc3QtPmZsX3N0YXJ0IDwgMCB8fCByZXF1ZXN0LT5mbF9lbmQgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChJU19HRVRMSyhjbWQpKQorCQlyZXR1cm4gbmZzNF9wcm9jX2dldGxrKHN0YXRlLCBGX0dFVExLLCByZXF1ZXN0KTsKKworCWlmICghKElTX1NFVExLKGNtZCkgfHwgSVNfU0VUTEtXKGNtZCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChyZXF1ZXN0LT5mbF90eXBlID09IEZfVU5MQ0spCisJCXJldHVybiBuZnM0X3Byb2NfdW5sY2soc3RhdGUsIGNtZCwgcmVxdWVzdCk7CisKKwlkbyB7CisJCXN0YXR1cyA9IG5mczRfcHJvY19zZXRsayhzdGF0ZSwgY21kLCByZXF1ZXN0KTsKKwkJaWYgKChzdGF0dXMgIT0gLUVBR0FJTikgfHwgSVNfU0VUTEsoY21kKSkKKwkJCWJyZWFrOworCQl0aW1lb3V0ID0gbmZzNF9zZXRfbG9ja190YXNrX3JldHJ5KHRpbWVvdXQpOworCQlzdGF0dXMgPSAtRVJFU1RBUlRTWVM7CisJCWlmIChzaWduYWxsZWQoKSkKKwkJCWJyZWFrOworCX0gd2hpbGUoc3RhdHVzIDwgMCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdHJ1Y3QgbmZzNF9zdGF0ZV9yZWNvdmVyeV9vcHMgbmZzNF9yZWJvb3RfcmVjb3Zlcnlfb3BzID0geworCS5yZWNvdmVyX29wZW4JPSBuZnM0X29wZW5fcmVjbGFpbSwKKwkucmVjb3Zlcl9sb2NrCT0gbmZzNF9sb2NrX3JlY2xhaW0sCit9OworCitzdHJ1Y3QgbmZzNF9zdGF0ZV9yZWNvdmVyeV9vcHMgbmZzNF9uZXR3b3JrX3BhcnRpdGlvbl9yZWNvdmVyeV9vcHMgPSB7CisJLnJlY292ZXJfb3Blbgk9IG5mczRfb3Blbl9leHBpcmVkLAorCS5yZWNvdmVyX2xvY2sJPSBuZnM0X2xvY2tfZXhwaXJlZCwKK307CisKK3N0cnVjdCBuZnNfcnBjX29wcwluZnNfdjRfY2xpZW50b3BzID0geworCS52ZXJzaW9uCT0gNCwJCQkvKiBwcm90b2NvbCB2ZXJzaW9uICovCisJLmRlbnRyeV9vcHMJPSAmbmZzNF9kZW50cnlfb3BlcmF0aW9ucywKKwkuZGlyX2lub2RlX29wcwk9ICZuZnM0X2Rpcl9pbm9kZV9vcGVyYXRpb25zLAorCS5nZXRyb290CT0gbmZzNF9wcm9jX2dldF9yb290LAorCS5nZXRhdHRyCT0gbmZzNF9wcm9jX2dldGF0dHIsCisJLnNldGF0dHIJPSBuZnM0X3Byb2Nfc2V0YXR0ciwKKwkubG9va3VwCQk9IG5mczRfcHJvY19sb29rdXAsCisJLmFjY2VzcwkJPSBuZnM0X3Byb2NfYWNjZXNzLAorCS5yZWFkbGluawk9IG5mczRfcHJvY19yZWFkbGluaywKKwkucmVhZAkJPSBuZnM0X3Byb2NfcmVhZCwKKwkud3JpdGUJCT0gbmZzNF9wcm9jX3dyaXRlLAorCS5jb21taXQJCT0gbmZzNF9wcm9jX2NvbW1pdCwKKwkuY3JlYXRlCQk9IG5mczRfcHJvY19jcmVhdGUsCisJLnJlbW92ZQkJPSBuZnM0X3Byb2NfcmVtb3ZlLAorCS51bmxpbmtfc2V0dXAJPSBuZnM0X3Byb2NfdW5saW5rX3NldHVwLAorCS51bmxpbmtfZG9uZQk9IG5mczRfcHJvY191bmxpbmtfZG9uZSwKKwkucmVuYW1lCQk9IG5mczRfcHJvY19yZW5hbWUsCisJLmxpbmsJCT0gbmZzNF9wcm9jX2xpbmssCisJLnN5bWxpbmsJPSBuZnM0X3Byb2Nfc3ltbGluaywKKwkubWtkaXIJCT0gbmZzNF9wcm9jX21rZGlyLAorCS5ybWRpcgkJPSBuZnM0X3Byb2NfcmVtb3ZlLAorCS5yZWFkZGlyCT0gbmZzNF9wcm9jX3JlYWRkaXIsCisJLm1rbm9kCQk9IG5mczRfcHJvY19ta25vZCwKKwkuc3RhdGZzCQk9IG5mczRfcHJvY19zdGF0ZnMsCisJLmZzaW5mbwkJPSBuZnM0X3Byb2NfZnNpbmZvLAorCS5wYXRoY29uZgk9IG5mczRfcHJvY19wYXRoY29uZiwKKwkuZGVjb2RlX2RpcmVudAk9IG5mczRfZGVjb2RlX2RpcmVudCwKKwkucmVhZF9zZXR1cAk9IG5mczRfcHJvY19yZWFkX3NldHVwLAorCS53cml0ZV9zZXR1cAk9IG5mczRfcHJvY193cml0ZV9zZXR1cCwKKwkuY29tbWl0X3NldHVwCT0gbmZzNF9wcm9jX2NvbW1pdF9zZXR1cCwKKwkuZmlsZV9vcGVuICAgICAgPSBuZnM0X3Byb2NfZmlsZV9vcGVuLAorCS5maWxlX3JlbGVhc2UgICA9IG5mczRfcHJvY19maWxlX3JlbGVhc2UsCisJLmxvY2sJCT0gbmZzNF9wcm9jX2xvY2ssCit9OworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0cmVuZXdkLmMgYi9mcy9uZnMvbmZzNHJlbmV3ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2N2UwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvbmZzNHJlbmV3ZC5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogIGZzL25mcy9uZnM0cmVuZXdkLmMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIEtlbmRyaWNrIFNtaXRoIDxrbXNtaXRoQHVtaWNoLmVkdT4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqCisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiAgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTkZTdjQgInJlbmV3IGRhZW1vbiIsIHdoaWNoIHdha2VzIHVwIHBlcmlvZGljYWxseSB0bworICogc2VuZCBhIFJFTkVXLCB0byBrZWVwIHN0YXRlIGFsaXZlIG9uIHRoZSBzZXJ2ZXIuICBUaGUgZGFlbW9uIGlzIGltcGxlbWVudGVkCisgKiBhcyBhbiBycGNfdGFzaywgbm90IGEgcmVhbCBrZXJuZWwgdGhyZWFkLCBzbyBpdCBhbHdheXMgcnVucyBpbiBycGNpb2QncworICogY29udGV4dC4gIFRoZXJlIGlzIG9uZSByZW5ld2QgcGVyIG5mc19zZXJ2ZXIuCisgKgorICogVE9ETzogSWYgdGhlIHNlbmQgcXVldWUgZ2V0cyBiYWNrbG9nZ2VkIChlLmcuLCBpZiB0aGUgc2VydmVyIGdvZXMgZG93biksCisgKiB3ZSB3aWxsIGtlZXAgZmlsbGluZyB0aGUgcXVldWUgd2l0aCBwZXJpb2RpYyBSRU5FVyByZXF1ZXN0cy4gIFdlIG5lZWQgYQorICogbWVjaGFuaXNtIGZvciBlbnN1cmluZyB0aGF0IGlmIHJlbmV3ZCBzdWNjZXNzZnVsbHkgc2VuZHMgb2ZmIGEgcmVxdWVzdCwKKyAqIHRoZW4gaXQgb25seSB3YWtlcyB1cCB3aGVuIHRoZSByZXF1ZXN0IGlzIGZpbmlzaGVkLiAgTWF5YmUgdXNlIHRoZQorICogY2hpbGQgdGFzayBmcmFtZXdvcmsgb2YgdGhlIFJQQyBsYXllcj8KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnM0Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisKKyNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCU5GU0RCR19QUk9DCisKK3ZvaWQKK25mczRfcmVuZXdfc3RhdGUodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IChzdHJ1Y3QgbmZzNF9jbGllbnQgKilkYXRhOworCWxvbmcgbGVhc2UsIHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyBsYXN0LCBub3c7CisKKwlkb3duX3JlYWQoJmNscC0+Y2xfc2VtKTsKKwlkcHJpbnRrKCIlczogc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CisJLyogQXJlIHRoZXJlIGFueSBhY3RpdmUgc3VwZXJibG9ja3M/ICovCisJaWYgKGxpc3RfZW1wdHkoJmNscC0+Y2xfc3VwZXJibG9ja3MpKQorCQlnb3RvIG91dDsgCisJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCWxlYXNlID0gY2xwLT5jbF9sZWFzZV90aW1lOworCWxhc3QgPSBjbHAtPmNsX2xhc3RfcmVuZXdhbDsKKwlub3cgPSBqaWZmaWVzOworCXRpbWVvdXQgPSAoMiAqIGxlYXNlKSAvIDMgKyAobG9uZylsYXN0IC0gKGxvbmcpbm93OworCS8qIEFyZSB3ZSBjbG9zZSB0byBhIGxlYXNlIHRpbWVvdXQ/ICovCisJaWYgKHRpbWVfYWZ0ZXIobm93LCBsYXN0ICsgbGVhc2UvMykpIHsKKwkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJCS8qIFF1ZXVlIGFuIGFzeW5jaHJvbm91cyBSRU5FVy4gKi8KKwkJbmZzNF9wcm9jX2FzeW5jX3JlbmV3KGNscCk7CisJCXRpbWVvdXQgPSAoMiAqIGxlYXNlKSAvIDM7CisJCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwl9IGVsc2UKKwkJZHByaW50aygiJXM6IGZhaWxlZCB0byBjYWxsIHJlbmV3ZC4gUmVhc29uOiBsZWFzZSBub3QgZXhwaXJlZCBcbiIsCisJCQkJX19GVU5DVElPTl9fKTsKKwlpZiAodGltZW91dCA8IDUgKiBIWikgICAgLyogc2FmZWd1YXJkICovCisJCXRpbWVvdXQgPSA1ICogSFo7CisJZHByaW50aygiJXM6IHJlcXVldWVpbmcgd29yay4gTGVhc2UgcGVyaW9kID0gJWxkXG4iLAorCQkJX19GVU5DVElPTl9fLCAodGltZW91dCArIEhaIC0gMSkgLyBIWik7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmY2xwLT5jbF9yZW5ld2QpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2xwLT5jbF9yZW5ld2QsIHRpbWVvdXQpOworCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworb3V0OgorCXVwX3JlYWQoJmNscC0+Y2xfc2VtKTsKKwlkcHJpbnRrKCIlczogZG9uZVxuIiwgX19GVU5DVElPTl9fKTsKK30KKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBjbHAtPmNsX3NlbSBsb2NrZWQgZm9yIHdyaXRlcyAqLwordm9pZAorbmZzNF9zY2hlZHVsZV9zdGF0ZV9yZW5ld2FsKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCWxvbmcgdGltZW91dDsKKworCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwl0aW1lb3V0ID0gKDIgKiBjbHAtPmNsX2xlYXNlX3RpbWUpIC8gMyArIChsb25nKWNscC0+Y2xfbGFzdF9yZW5ld2FsCisJCS0gKGxvbmcpamlmZmllczsKKwlpZiAodGltZW91dCA8IDUgKiBIWikKKwkJdGltZW91dCA9IDUgKiBIWjsKKwlkcHJpbnRrKCIlczogcmVxdWV1ZWluZyB3b3JrLiBMZWFzZSBwZXJpb2QgPSAlbGRcbiIsCisJCQlfX0ZVTkNUSU9OX18sICh0aW1lb3V0ICsgSFogLSAxKSAvIEhaKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZjbHAtPmNsX3JlbmV3ZCk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjbHAtPmNsX3JlbmV3ZCwgdGltZW91dCk7CisJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7Cit9CisKK3ZvaWQKK25mczRfcmVuZXdkX3ByZXBhcmVfc2h1dGRvd24oc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IHNlcnZlci0+bmZzNF9zdGF0ZTsKKworCWlmICghY2xwKQorCQlyZXR1cm47CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwlkb3duX3dyaXRlKCZjbHAtPmNsX3NlbSk7CisJaWYgKCFsaXN0X2VtcHR5KCZzZXJ2ZXItPm5mczRfc2libGluZ3MpKQorCQlsaXN0X2RlbF9pbml0KCZzZXJ2ZXItPm5mczRfc2libGluZ3MpOworCXVwX3dyaXRlKCZjbHAtPmNsX3NlbSk7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggY2xwLT5jbF9zZW0gbG9ja2VkIGZvciB3cml0ZXMgKi8KK3ZvaWQKK25mczRfa2lsbF9yZW5ld2Qoc3RydWN0IG5mczRfY2xpZW50ICpjbHApCit7CisJZG93bl9yZWFkKCZjbHAtPmNsX3NlbSk7CisJaWYgKCFsaXN0X2VtcHR5KCZjbHAtPmNsX3N1cGVyYmxvY2tzKSkgeworCQl1cF9yZWFkKCZjbHAtPmNsX3NlbSk7CisJCXJldHVybjsKKwl9CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmY2xwLT5jbF9yZW5ld2QpOworCXVwX3JlYWQoJmNscC0+Y2xfc2VtKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworfQorCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogICBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHN0YXRlLmMgYi9mcy9uZnMvbmZzNHN0YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMxY2ViYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy9uZnM0c3RhdGUuYwpAQCAtMCwwICsxLDkzMiBAQAorLyoKKyAqICBmcy9uZnMvbmZzNHN0YXRlLmMKKyAqCisgKiAgQ2xpZW50LXNpZGUgWERSIGZvciBORlN2NC4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIEtlbmRyaWNrIFNtaXRoIDxrbXNtaXRoQHVtaWNoLmVkdT4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqCisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiAgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTkZTdjQgc3RhdGUgbW9kZWwuICBGb3IgdGhlIHRpbWUgYmVpbmcsCisgKiB0aGlzIGlzIG1pbmltYWwsIGJ1dCB3aWxsIGJlIG1hZGUgbXVjaCBtb3JlIGNvbXBsZXggaW4gYQorICogc3Vic2VxdWVudCBwYXRjaC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2lkbWFwLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlICJjYWxsYmFjay5oIgorI2luY2x1ZGUgImRlbGVnYXRpb24uaCIKKworI2RlZmluZSBPUEVOT1dORVJfUE9PTF9TSVpFCTgKKworc3RhdGljIERFRklORV9TUElOTE9DSyhzdGF0ZV9zcGlubG9jayk7CisKK25mczRfc3RhdGVpZCB6ZXJvX3N0YXRlaWQ7CisKKyNpZiAwCituZnM0X3N0YXRlaWQgb25lX3N0YXRlaWQgPQorCXsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9OworI2VuZGlmCisKK3N0YXRpYyBMSVNUX0hFQUQobmZzNF9jbGllbnRpZF9saXN0KTsKKworc3RhdGljIHZvaWQgbmZzNF9yZWNvdmVyX3N0YXRlKHZvaWQgKik7CitleHRlcm4gdm9pZCBuZnM0X3JlbmV3X3N0YXRlKHZvaWQgKik7CisKK3ZvaWQKK2luaXRfbmZzdjRfc3RhdGUoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKK3sKKwlzZXJ2ZXItPm5mczRfc3RhdGUgPSBOVUxMOworCUlOSVRfTElTVF9IRUFEKCZzZXJ2ZXItPm5mczRfc2libGluZ3MpOworfQorCit2b2lkCitkZXN0cm95X25mc3Y0X3N0YXRlKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIpCit7CisJaWYgKHNlcnZlci0+bW50X3BhdGgpIHsKKwkJa2ZyZWUoc2VydmVyLT5tbnRfcGF0aCk7CisJCXNlcnZlci0+bW50X3BhdGggPSBOVUxMOworCX0KKwlpZiAoc2VydmVyLT5uZnM0X3N0YXRlKSB7CisJCW5mczRfcHV0X2NsaWVudChzZXJ2ZXItPm5mczRfc3RhdGUpOworCQlzZXJ2ZXItPm5mczRfc3RhdGUgPSBOVUxMOworCX0KK30KKworLyoKKyAqIG5mczRfZ2V0X2NsaWVudCgpOiByZXR1cm5zIGFuIGVtcHR5IGNsaWVudCBzdHJ1Y3R1cmUKKyAqIG5mczRfcHV0X2NsaWVudCgpOiBkcm9wcyByZWZlcmVuY2UgdG8gY2xpZW50IHN0cnVjdHVyZQorICoKKyAqIFNpbmNlIHRoZXNlIGFyZSBhbGxvY2F0ZWQvZGVhbGxvY2F0ZWQgdmVyeSByYXJlbHksIHdlIGRvbid0CisgKiBib3RoZXIgcHV0dGluZyB0aGVtIGluIGEgc2xhYiBjYWNoZS4uLgorICovCitzdGF0aWMgc3RydWN0IG5mczRfY2xpZW50ICoKK25mczRfYWxsb2NfY2xpZW50KHN0cnVjdCBpbl9hZGRyICphZGRyKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwOworCisJaWYgKG5mc19jYWxsYmFja191cCgpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKChjbHAgPSBrbWFsbG9jKHNpemVvZigqY2xwKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJbmZzX2NhbGxiYWNrX2Rvd24oKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChjbHAsIDAsIHNpemVvZigqY2xwKSk7CisJbWVtY3B5KCZjbHAtPmNsX2FkZHIsIGFkZHIsIHNpemVvZihjbHAtPmNsX2FkZHIpKTsKKwlpbml0X3J3c2VtKCZjbHAtPmNsX3NlbSk7CisJSU5JVF9MSVNUX0hFQUQoJmNscC0+Y2xfZGVsZWdhdGlvbnMpOworCUlOSVRfTElTVF9IRUFEKCZjbHAtPmNsX3N0YXRlX293bmVycyk7CisJSU5JVF9MSVNUX0hFQUQoJmNscC0+Y2xfdW51c2VkKTsKKwlzcGluX2xvY2tfaW5pdCgmY2xwLT5jbF9sb2NrKTsKKwlhdG9taWNfc2V0KCZjbHAtPmNsX2NvdW50LCAxKTsKKwlJTklUX1dPUksoJmNscC0+Y2xfcmVjb3ZlcmQsIG5mczRfcmVjb3Zlcl9zdGF0ZSwgY2xwKTsKKwlJTklUX1dPUksoJmNscC0+Y2xfcmVuZXdkLCBuZnM0X3JlbmV3X3N0YXRlLCBjbHApOworCUlOSVRfTElTVF9IRUFEKCZjbHAtPmNsX3N1cGVyYmxvY2tzKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjbHAtPmNsX3dhaXRxKTsKKwlycGNfaW5pdF93YWl0X3F1ZXVlKCZjbHAtPmNsX3JwY3dhaXRxLCAiTkZTNCBjbGllbnQiKTsKKwljbHAtPmNsX2Jvb3RfdGltZSA9IENVUlJFTlRfVElNRTsKKwljbHAtPmNsX3N0YXRlID0gMSA8PCBORlM0Q0xOVF9PSzsKKwlyZXR1cm4gY2xwOworfQorCitzdGF0aWMgdm9pZAorbmZzNF9mcmVlX2NsaWVudChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3A7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmNscC0+Y2xfdW51c2VkKSkgeworCQlzcCA9IGxpc3RfZW50cnkoY2xwLT5jbF91bnVzZWQubmV4dCwKKwkJCQlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciwKKwkJCQlzb19saXN0KTsKKwkJbGlzdF9kZWwoJnNwLT5zb19saXN0KTsKKwkJa2ZyZWUoc3ApOworCX0KKwlCVUdfT04oIWxpc3RfZW1wdHkoJmNscC0+Y2xfc3RhdGVfb3duZXJzKSk7CisJaWYgKGNscC0+Y2xfY3JlZCkKKwkJcHV0X3JwY2NyZWQoY2xwLT5jbF9jcmVkKTsKKwluZnNfaWRtYXBfZGVsZXRlKGNscCk7CisJaWYgKGNscC0+Y2xfcnBjY2xpZW50KQorCQlycGNfc2h1dGRvd25fY2xpZW50KGNscC0+Y2xfcnBjY2xpZW50KTsKKwlrZnJlZShjbHApOworCW5mc19jYWxsYmFja19kb3duKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZzNF9jbGllbnQgKl9fbmZzNF9maW5kX2NsaWVudChzdHJ1Y3QgaW5fYWRkciAqYWRkcikKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNscCwgJm5mczRfY2xpZW50aWRfbGlzdCwgY2xfc2VydmVycykgeworCQlpZiAobWVtY21wKCZjbHAtPmNsX2FkZHIsIGFkZHIsIHNpemVvZihjbHAtPmNsX2FkZHIpKSA9PSAwKSB7CisJCQlhdG9taWNfaW5jKCZjbHAtPmNsX2NvdW50KTsKKwkJCXJldHVybiBjbHA7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBuZnM0X2NsaWVudCAqbmZzNF9maW5kX2NsaWVudChzdHJ1Y3QgaW5fYWRkciAqYWRkcikKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscDsKKwlzcGluX2xvY2soJnN0YXRlX3NwaW5sb2NrKTsKKwljbHAgPSBfX25mczRfZmluZF9jbGllbnQoYWRkcik7CisJc3Bpbl91bmxvY2soJnN0YXRlX3NwaW5sb2NrKTsKKwlyZXR1cm4gY2xwOworfQorCitzdHJ1Y3QgbmZzNF9jbGllbnQgKgorbmZzNF9nZXRfY2xpZW50KHN0cnVjdCBpbl9hZGRyICphZGRyKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCAqbmV3ID0gTlVMTDsKKworCXNwaW5fbG9jaygmc3RhdGVfc3BpbmxvY2spOworCWZvciAoOzspIHsKKwkJY2xwID0gX19uZnM0X2ZpbmRfY2xpZW50KGFkZHIpOworCQlpZiAoY2xwICE9IE5VTEwpCisJCQlicmVhazsKKwkJY2xwID0gbmV3OworCQlpZiAoY2xwICE9IE5VTEwpIHsKKwkJCWxpc3RfYWRkKCZjbHAtPmNsX3NlcnZlcnMsICZuZnM0X2NsaWVudGlkX2xpc3QpOworCQkJbmV3ID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCXNwaW5fdW5sb2NrKCZzdGF0ZV9zcGlubG9jayk7CisJCW5ldyA9IG5mczRfYWxsb2NfY2xpZW50KGFkZHIpOworCQlzcGluX2xvY2soJnN0YXRlX3NwaW5sb2NrKTsKKwkJaWYgKG5ldyA9PSBOVUxMKQorCQkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrKCZzdGF0ZV9zcGlubG9jayk7CisJaWYgKG5ldykKKwkJbmZzNF9mcmVlX2NsaWVudChuZXcpOworCXJldHVybiBjbHA7Cit9CisKK3ZvaWQKK25mczRfcHV0X2NsaWVudChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJmNscC0+Y2xfY291bnQsICZzdGF0ZV9zcGlubG9jaykpCisJCXJldHVybjsKKwlsaXN0X2RlbCgmY2xwLT5jbF9zZXJ2ZXJzKTsKKwlzcGluX3VubG9jaygmc3RhdGVfc3BpbmxvY2spOworCUJVR19PTighbGlzdF9lbXB0eSgmY2xwLT5jbF9zdXBlcmJsb2NrcykpOworCXdha2VfdXBfYWxsKCZjbHAtPmNsX3dhaXRxKTsKKwlycGNfd2FrZV91cCgmY2xwLT5jbF9ycGN3YWl0cSk7CisJbmZzNF9raWxsX3JlbmV3ZChjbHApOworCW5mczRfZnJlZV9jbGllbnQoY2xwKTsKK30KKworc3RhdGljIGludCBfX25mczRfaW5pdF9jbGllbnQoc3RydWN0IG5mczRfY2xpZW50ICpjbHApCit7CisJaW50IHN0YXR1cyA9IG5mczRfcHJvY19zZXRjbGllbnRpZChjbHAsIE5GUzRfQ0FMTEJBQ0ssIG5mc19jYWxsYmFja190Y3Bwb3J0KTsKKwlpZiAoc3RhdHVzID09IDApCisJCXN0YXR1cyA9IG5mczRfcHJvY19zZXRjbGllbnRpZF9jb25maXJtKGNscCk7CisJaWYgKHN0YXR1cyA9PSAwKQorCQluZnM0X3NjaGVkdWxlX3N0YXRlX3JlbmV3YWwoY2xwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgbmZzNF9pbml0X2NsaWVudChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlyZXR1cm4gbmZzNF9tYXBfZXJyb3JzKF9fbmZzNF9pbml0X2NsaWVudChjbHApKTsKK30KKwordTMyCituZnM0X2FsbG9jX2xvY2tvd25lcl9pZChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlyZXR1cm4gY2xwLT5jbF9sb2Nrb3duZXJfaWQgKys7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqCituZnM0X2NsaWVudF9ncmFiX3VudXNlZChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCwgc3RydWN0IHJwY19jcmVkICpjcmVkKQoreworCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcCA9IE5VTEw7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmNscC0+Y2xfdW51c2VkKSkgeworCQlzcCA9IGxpc3RfZW50cnkoY2xwLT5jbF91bnVzZWQubmV4dCwgc3RydWN0IG5mczRfc3RhdGVfb3duZXIsIHNvX2xpc3QpOworCQlhdG9taWNfaW5jKCZzcC0+c29fY291bnQpOworCQlzcC0+c29fY3JlZCA9IGNyZWQ7CisJCWxpc3RfbW92ZSgmc3AtPnNvX2xpc3QsICZjbHAtPmNsX3N0YXRlX293bmVycyk7CisJCWNscC0+Y2xfbnVudXNlZC0tOworCX0KKwlyZXR1cm4gc3A7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqCituZnM0X2ZpbmRfc3RhdGVfb3duZXIoc3RydWN0IG5mczRfY2xpZW50ICpjbHAsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCkKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3AsICpyZXMgPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzcCwgJmNscC0+Y2xfc3RhdGVfb3duZXJzLCBzb19saXN0KSB7CisJCWlmIChzcC0+c29fY3JlZCAhPSBjcmVkKQorCQkJY29udGludWU7CisJCWF0b21pY19pbmMoJnNwLT5zb19jb3VudCk7CisJCS8qIE1vdmUgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QgKi8KKwkJbGlzdF9tb3ZlKCZzcC0+c29fbGlzdCwgJmNscC0+Y2xfc3RhdGVfb3duZXJzKTsKKwkJcmVzID0gc3A7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmVzOworfQorCisvKgorICogbmZzNF9hbGxvY19zdGF0ZV9vd25lcigpOiB0aGlzIGlzIGNhbGxlZCBvbiB0aGUgT1BFTiBvciBDUkVBVEUgcGF0aCB0bworICogY3JlYXRlIGEgbmV3IHN0YXRlX293bmVyLgorICoKKyAqLworc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICoKK25mczRfYWxsb2Nfc3RhdGVfb3duZXIodm9pZCkKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3A7CisKKwlzcCA9IGttYWxsb2Moc2l6ZW9mKCpzcCksR0ZQX0tFUk5FTCk7CisJaWYgKCFzcCkKKwkJcmV0dXJuIE5VTEw7CisJaW5pdF9NVVRFWCgmc3AtPnNvX3NlbWEpOworCXNwLT5zb19zZXFpZCA9IDA7ICAgICAgICAgICAgICAgICAvKiBhcmJpdHJhcnkgKi8KKwlJTklUX0xJU1RfSEVBRCgmc3AtPnNvX3N0YXRlcyk7CisJSU5JVF9MSVNUX0hFQUQoJnNwLT5zb19kZWxlZ2F0aW9ucyk7CisJYXRvbWljX3NldCgmc3AtPnNvX2NvdW50LCAxKTsKKwlyZXR1cm4gc3A7Cit9CisKK3ZvaWQKK25mczRfZHJvcF9zdGF0ZV9vd25lcihzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3ApCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBzcC0+c29fY2xpZW50OworCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwlsaXN0X2RlbF9pbml0KCZzcC0+c29fbGlzdCk7CisJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7Cit9CisKKy8qCisgKiBOb3RlOiBtdXN0IGJlIGNhbGxlZCB3aXRoIGNscC0+Y2xfc2VtIGhlbGQgaW4gb3JkZXIgdG8gcHJldmVudCByYWNlcworICogICAgICAgd2l0aCByZWJvb3QgcmVjb3ZlcnkhCisgKi8KK3N0cnVjdCBuZnM0X3N0YXRlX293bmVyICpuZnM0X2dldF9zdGF0ZV9vd25lcihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQpCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBzZXJ2ZXItPm5mczRfc3RhdGU7CisJc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwLCAqbmV3OworCisJZ2V0X3JwY2NyZWQoY3JlZCk7CisJbmV3ID0gbmZzNF9hbGxvY19zdGF0ZV9vd25lcigpOworCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwlzcCA9IG5mczRfZmluZF9zdGF0ZV9vd25lcihjbHAsIGNyZWQpOworCWlmIChzcCA9PSBOVUxMKQorCQlzcCA9IG5mczRfY2xpZW50X2dyYWJfdW51c2VkKGNscCwgY3JlZCk7CisJaWYgKHNwID09IE5VTEwgJiYgbmV3ICE9IE5VTEwpIHsKKwkJbGlzdF9hZGQoJm5ldy0+c29fbGlzdCwgJmNscC0+Y2xfc3RhdGVfb3duZXJzKTsKKwkJbmV3LT5zb19jbGllbnQgPSBjbHA7CisJCW5ldy0+c29faWQgPSBuZnM0X2FsbG9jX2xvY2tvd25lcl9pZChjbHApOworCQluZXctPnNvX2NyZWQgPSBjcmVkOworCQlzcCA9IG5ldzsKKwkJbmV3ID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJaWYgKG5ldykKKwkJa2ZyZWUobmV3KTsKKwlpZiAoc3AgIT0gTlVMTCkKKwkJcmV0dXJuIHNwOworCXB1dF9ycGNjcmVkKGNyZWQpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBjbHAtPmNsX3NlbSBoZWxkIGluIG9yZGVyIHRvIGF2b2lkIHJhY2VzCisgKiB3aXRoIHN0YXRlIHJlY292ZXJ5Li4uCisgKi8KK3ZvaWQgbmZzNF9wdXRfc3RhdGVfb3duZXIoc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gc3AtPnNvX2NsaWVudDsKKwlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQgPSBzcC0+c29fY3JlZDsKKworCWlmICghYXRvbWljX2RlY19hbmRfbG9jaygmc3AtPnNvX2NvdW50LCAmY2xwLT5jbF9sb2NrKSkKKwkJcmV0dXJuOworCWlmIChjbHAtPmNsX251bnVzZWQgPj0gT1BFTk9XTkVSX1BPT0xfU0laRSkKKwkJZ290byBvdXRfZnJlZTsKKwlpZiAobGlzdF9lbXB0eSgmc3AtPnNvX2xpc3QpKQorCQlnb3RvIG91dF9mcmVlOworCWxpc3RfbW92ZSgmc3AtPnNvX2xpc3QsICZjbHAtPmNsX3VudXNlZCk7CisJY2xwLT5jbF9udW51c2VkKys7CisJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJcHV0X3JwY2NyZWQoY3JlZCk7CisJY3JlZCA9IE5VTEw7CisJcmV0dXJuOworb3V0X2ZyZWU6CisJbGlzdF9kZWwoJnNwLT5zb19saXN0KTsKKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKKwlwdXRfcnBjY3JlZChjcmVkKTsKKwlrZnJlZShzcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZzNF9zdGF0ZSAqCituZnM0X2FsbG9jX29wZW5fc3RhdGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGU7CisKKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKCpzdGF0ZSksIEdGUF9LRVJORUwpOworCWlmICghc3RhdGUpCisJCXJldHVybiBOVUxMOworCXN0YXRlLT5zdGF0ZSA9IDA7CisJc3RhdGUtPm5yZWFkZXJzID0gMDsKKwlzdGF0ZS0+bndyaXRlcnMgPSAwOworCXN0YXRlLT5mbGFncyA9IDA7CisJbWVtc2V0KHN0YXRlLT5zdGF0ZWlkLmRhdGEsIDAsIHNpemVvZihzdGF0ZS0+c3RhdGVpZC5kYXRhKSk7CisJYXRvbWljX3NldCgmc3RhdGUtPmNvdW50LCAxKTsKKwlJTklUX0xJU1RfSEVBRCgmc3RhdGUtPmxvY2tfc3RhdGVzKTsKKwlpbml0X01VVEVYKCZzdGF0ZS0+bG9ja19zZW1hKTsKKwlyd2xvY2tfaW5pdCgmc3RhdGUtPnN0YXRlX2xvY2spOworCXJldHVybiBzdGF0ZTsKK30KKworc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlICoKK19fbmZzNF9maW5kX3N0YXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwgbW9kZV90IG1vZGUpCit7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGU7CisKKwltb2RlICY9IChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0YXRlLCAmbmZzaS0+b3Blbl9zdGF0ZXMsIGlub2RlX3N0YXRlcykgeworCQlpZiAoc3RhdGUtPm93bmVyLT5zb19jcmVkICE9IGNyZWQpCisJCQljb250aW51ZTsKKwkJaWYgKChtb2RlICYgRk1PREVfUkVBRCkgIT0gMCAmJiBzdGF0ZS0+bnJlYWRlcnMgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoKG1vZGUgJiBGTU9ERV9XUklURSkgIT0gMCAmJiBzdGF0ZS0+bndyaXRlcnMgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoKHN0YXRlLT5zdGF0ZSAmIG1vZGUpICE9IG1vZGUpCisJCQljb250aW51ZTsKKwkJYXRvbWljX2luYygmc3RhdGUtPmNvdW50KTsKKwkJaWYgKG1vZGUgJiBGTU9ERV9SRUFEKQorCQkJc3RhdGUtPm5yZWFkZXJzKys7CisJCWlmIChtb2RlICYgRk1PREVfV1JJVEUpCisJCQlzdGF0ZS0+bndyaXRlcnMrKzsKKwkJcmV0dXJuIHN0YXRlOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlICoKK19fbmZzNF9maW5kX3N0YXRlX2J5b3duZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKm93bmVyKQoreworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisJc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzdGF0ZSwgJm5mc2ktPm9wZW5fc3RhdGVzLCBpbm9kZV9zdGF0ZXMpIHsKKwkJLyogSXMgdGhpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBmcmVlZD8gKi8KKwkJaWYgKHN0YXRlLT5ucmVhZGVycyA9PSAwICYmIHN0YXRlLT5ud3JpdGVycyA9PSAwKQorCQkJY29udGludWU7CisJCWlmIChzdGF0ZS0+b3duZXIgPT0gb3duZXIpIHsKKwkJCWF0b21pY19pbmMoJnN0YXRlLT5jb3VudCk7CisJCQlyZXR1cm4gc3RhdGU7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBuZnM0X3N0YXRlICoKK25mczRfZmluZF9zdGF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIG1vZGVfdCBtb2RlKQoreworCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZTsKKworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3RhdGUgPSBfX25mczRfZmluZF9zdGF0ZShpbm9kZSwgY3JlZCwgbW9kZSk7CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXJldHVybiBzdGF0ZTsKK30KKworc3RhdGljIHZvaWQKK25mczRfZnJlZV9vcGVuX3N0YXRlKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSkKK3sKKwlrZnJlZShzdGF0ZSk7Cit9CisKK3N0cnVjdCBuZnM0X3N0YXRlICoKK25mczRfZ2V0X29wZW5fc3RhdGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKm93bmVyKQoreworCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgKm5ldzsKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCisJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzdGF0ZSA9IF9fbmZzNF9maW5kX3N0YXRlX2J5b3duZXIoaW5vZGUsIG93bmVyKTsKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJaWYgKHN0YXRlKQorCQlnb3RvIG91dDsKKwluZXcgPSBuZnM0X2FsbG9jX29wZW5fc3RhdGUoKTsKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXN0YXRlID0gX19uZnM0X2ZpbmRfc3RhdGVfYnlvd25lcihpbm9kZSwgb3duZXIpOworCWlmIChzdGF0ZSA9PSBOVUxMICYmIG5ldyAhPSBOVUxMKSB7CisJCXN0YXRlID0gbmV3OworCQkvKiBDYWxsZXIgKm11c3QqIGJlIGhvbGRpbmcgb3duZXItPnNvX3NlbSAqLworCQkvKiBOb3RlOiBUaGUgcmVjbGFpbSBjb2RlIGRpY3RhdGVzIHRoYXQgd2UgYWRkIHN0YXRlbGVzcworCQkgKiBhbmQgcmVhZC1vbmx5IHN0YXRlaWRzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgKi8KKwkJbGlzdF9hZGRfdGFpbCgmc3RhdGUtPm9wZW5fc3RhdGVzLCAmb3duZXItPnNvX3N0YXRlcyk7CisJCXN0YXRlLT5vd25lciA9IG93bmVyOworCQlhdG9taWNfaW5jKCZvd25lci0+c29fY291bnQpOworCQlsaXN0X2FkZCgmc3RhdGUtPmlub2RlX3N0YXRlcywgJm5mc2ktPm9wZW5fc3RhdGVzKTsKKwkJc3RhdGUtPmlub2RlID0gaWdyYWIoaW5vZGUpOworCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlpZiAobmV3KQorCQkJbmZzNF9mcmVlX29wZW5fc3RhdGUobmV3KTsKKwl9CitvdXQ6CisJcmV0dXJuIHN0YXRlOworfQorCisvKgorICogQmV3YXJlISBDYWxsZXIgbXVzdCBiZSBob2xkaW5nIGV4YWN0bHkgb25lCisgKiByZWZlcmVuY2UgdG8gY2xwLT5jbF9zZW0gYW5kIG93bmVyLT5zb19zZW1hIQorICovCit2b2lkIG5mczRfcHV0X29wZW5fc3RhdGUoc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzdGF0ZS0+aW5vZGU7CisJc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKm93bmVyID0gc3RhdGUtPm93bmVyOworCisJaWYgKCFhdG9taWNfZGVjX2FuZF9sb2NrKCZzdGF0ZS0+Y291bnQsICZpbm9kZS0+aV9sb2NrKSkKKwkJcmV0dXJuOworCWlmICghbGlzdF9lbXB0eSgmc3RhdGUtPmlub2RlX3N0YXRlcykpCisJCWxpc3RfZGVsKCZzdGF0ZS0+aW5vZGVfc3RhdGVzKTsKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJbGlzdF9kZWwoJnN0YXRlLT5vcGVuX3N0YXRlcyk7CisJaXB1dChpbm9kZSk7CisJQlVHX09OIChzdGF0ZS0+c3RhdGUgIT0gMCk7CisJbmZzNF9mcmVlX29wZW5fc3RhdGUoc3RhdGUpOworCW5mczRfcHV0X3N0YXRlX293bmVyKG93bmVyKTsKK30KKworLyoKKyAqIEJld2FyZSEgQ2FsbGVyIG11c3QgYmUgaG9sZGluZyBubyByZWZlcmVuY2VzIHRvIGNscC0+Y2xfc2VtIQorICogb2Ygb3duZXItPnNvX3NlbWEhCisgKi8KK3ZvaWQgbmZzNF9jbG9zZV9zdGF0ZShzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIG1vZGVfdCBtb2RlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzdGF0ZS0+aW5vZGU7CisJc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKm93bmVyID0gc3RhdGUtPm93bmVyOworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gb3duZXItPnNvX2NsaWVudDsKKwlpbnQgbmV3c3RhdGU7CisKKwlhdG9taWNfaW5jKCZvd25lci0+c29fY291bnQpOworCWRvd25fcmVhZCgmY2xwLT5jbF9zZW0pOworCWRvd24oJm93bmVyLT5zb19zZW1hKTsKKwkvKiBQcm90ZWN0IGFnYWluc3QgbmZzNF9maW5kX3N0YXRlKCkgKi8KKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCWlmIChtb2RlICYgRk1PREVfUkVBRCkKKwkJc3RhdGUtPm5yZWFkZXJzLS07CisJaWYgKG1vZGUgJiBGTU9ERV9XUklURSkKKwkJc3RhdGUtPm53cml0ZXJzLS07CisJaWYgKHN0YXRlLT5ud3JpdGVycyA9PSAwKSB7CisJCWlmIChzdGF0ZS0+bnJlYWRlcnMgPT0gMCkKKwkJCWxpc3RfZGVsX2luaXQoJnN0YXRlLT5pbm9kZV9zdGF0ZXMpOworCQkvKiBTZWUgcmVjbGFpbSBjb2RlICovCisJCWxpc3RfbW92ZV90YWlsKCZzdGF0ZS0+b3Blbl9zdGF0ZXMsICZvd25lci0+c29fc3RhdGVzKTsKKwl9CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCW5ld3N0YXRlID0gMDsKKwlpZiAoc3RhdGUtPnN0YXRlICE9IDApIHsKKwkJaWYgKHN0YXRlLT5ucmVhZGVycykKKwkJCW5ld3N0YXRlIHw9IEZNT0RFX1JFQUQ7CisJCWlmIChzdGF0ZS0+bndyaXRlcnMpCisJCQluZXdzdGF0ZSB8PSBGTU9ERV9XUklURTsKKwkJaWYgKHN0YXRlLT5zdGF0ZSA9PSBuZXdzdGF0ZSkKKwkJCWdvdG8gb3V0OworCQlpZiAobmZzNF9kb19jbG9zZShpbm9kZSwgc3RhdGUsIG5ld3N0YXRlKSA9PSAtRUlOUFJPR1JFU1MpCisJCQlyZXR1cm47CisJfQorb3V0OgorCW5mczRfcHV0X29wZW5fc3RhdGUoc3RhdGUpOworCXVwKCZvd25lci0+c29fc2VtYSk7CisJbmZzNF9wdXRfc3RhdGVfb3duZXIob3duZXIpOworCXVwX3JlYWQoJmNscC0+Y2xfc2VtKTsKK30KKworLyoKKyAqIFNlYXJjaCB0aGUgc3RhdGUtPmxvY2tfc3RhdGVzIGZvciBhbiBleGlzdGluZyBsb2NrX293bmVyCisgKiB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCBjdXJyZW50LT5maWxlcworICovCitzdGF0aWMgc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqCitfX25mczRfZmluZF9sb2NrX3N0YXRlKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgZmxfb3duZXJfdCBmbF9vd25lcikKK3sKKwlzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICpwb3M7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZzdGF0ZS0+bG9ja19zdGF0ZXMsIGxzX2xvY2tzKSB7CisJCWlmIChwb3MtPmxzX293bmVyICE9IGZsX293bmVyKQorCQkJY29udGludWU7CisJCWF0b21pY19pbmMoJnBvcy0+bHNfY291bnQpOworCQlyZXR1cm4gcG9zOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqCituZnM0X2ZpbmRfbG9ja19zdGF0ZShzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIGZsX293bmVyX3QgZmxfb3duZXIpCit7CisJc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqbHNwOworCXJlYWRfbG9jaygmc3RhdGUtPnN0YXRlX2xvY2spOworCWxzcCA9IF9fbmZzNF9maW5kX2xvY2tfc3RhdGUoc3RhdGUsIGZsX293bmVyKTsKKwlyZWFkX3VubG9jaygmc3RhdGUtPnN0YXRlX2xvY2spOworCXJldHVybiBsc3A7Cit9CisKKy8qCisgKiBSZXR1cm4gYSBjb21wYXRpYmxlIGxvY2tfc3RhdGUuIElmIG5vIGluaXRpYWxpemVkIGxvY2tfc3RhdGUgc3RydWN0dXJlCisgKiBleGlzdHMsIHJldHVybiBhbiB1bmluaXRpYWxpemVkIG9uZS4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgYmUgaG9sZGluZyBzdGF0ZS0+bG9ja19zZW1hCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICpuZnM0X2FsbG9jX2xvY2tfc3RhdGUoc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBmbF9vd25lcl90IGZsX293bmVyKQoreworCXN0cnVjdCBuZnM0X2xvY2tfc3RhdGUgKmxzcDsKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IHN0YXRlLT5vd25lci0+c29fY2xpZW50OworCisJbHNwID0ga21hbGxvYyhzaXplb2YoKmxzcCksIEdGUF9LRVJORUwpOworCWlmIChsc3AgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJbHNwLT5sc19mbGFncyA9IDA7CisJbHNwLT5sc19zZXFpZCA9IDA7CS8qIGFyYml0cmFyeSAqLworCWxzcC0+bHNfaWQgPSAtMTsgCisJbWVtc2V0KGxzcC0+bHNfc3RhdGVpZC5kYXRhLCAwLCBzaXplb2YobHNwLT5sc19zdGF0ZWlkLmRhdGEpKTsKKwlhdG9taWNfc2V0KCZsc3AtPmxzX2NvdW50LCAxKTsKKwlsc3AtPmxzX293bmVyID0gZmxfb3duZXI7CisJSU5JVF9MSVNUX0hFQUQoJmxzcC0+bHNfbG9ja3MpOworCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwlsc3AtPmxzX2lkID0gbmZzNF9hbGxvY19sb2Nrb3duZXJfaWQoY2xwKTsKKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKKwlyZXR1cm4gbHNwOworfQorCisvKgorICogUmV0dXJuIGEgY29tcGF0aWJsZSBsb2NrX3N0YXRlLiBJZiBubyBpbml0aWFsaXplZCBsb2NrX3N0YXRlIHN0cnVjdHVyZQorICogZXhpc3RzLCByZXR1cm4gYW4gdW5pbml0aWFsaXplZCBvbmUuCisgKgorICogVGhlIGNhbGxlciBtdXN0IGJlIGhvbGRpbmcgc3RhdGUtPmxvY2tfc2VtYSBhbmQgY2xwLT5jbF9zZW0KKyAqLworc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqbmZzNF9nZXRfbG9ja19zdGF0ZShzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIGZsX293bmVyX3Qgb3duZXIpCit7CisJc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqIGxzcDsKKwkKKwlsc3AgPSBuZnM0X2ZpbmRfbG9ja19zdGF0ZShzdGF0ZSwgb3duZXIpOworCWlmIChsc3AgPT0gTlVMTCkKKwkJbHNwID0gbmZzNF9hbGxvY19sb2NrX3N0YXRlKHN0YXRlLCBvd25lcik7CisJcmV0dXJuIGxzcDsKK30KKworLyoKKyAqIEJ5dGUtcmFuZ2UgbG9jayBhd2FyZSB1dGlsaXR5IHRvIGluaXRpYWxpemUgdGhlIHN0YXRlaWQgb2YgcmVhZC93cml0ZQorICogcmVxdWVzdHMuCisgKi8KK3ZvaWQKK25mczRfY29weV9zdGF0ZWlkKG5mczRfc3RhdGVpZCAqZHN0LCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIGZsX293bmVyX3QgZmxfb3duZXIpCit7CisJaWYgKHRlc3RfYml0KExLX1NUQVRFX0lOX1VTRSwgJnN0YXRlLT5mbGFncykpIHsKKwkJc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqbHNwOworCisJCWxzcCA9IG5mczRfZmluZF9sb2NrX3N0YXRlKHN0YXRlLCBmbF9vd25lcik7CisJCWlmIChsc3ApIHsKKwkJCW1lbWNweShkc3QsICZsc3AtPmxzX3N0YXRlaWQsIHNpemVvZigqZHN0KSk7CisJCQluZnM0X3B1dF9sb2NrX3N0YXRlKGxzcCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJbWVtY3B5KGRzdCwgJnN0YXRlLT5zdGF0ZWlkLCBzaXplb2YoKmRzdCkpOworfQorCisvKgorKiBDYWxsZWQgd2l0aCBzdGF0ZS0+bG9ja19zZW1hIGFuZCBjbHAtPmNsX3NlbSBoZWxkLgorKi8KK3ZvaWQgbmZzNF9pbmNyZW1lbnRfbG9ja19zZXFpZChpbnQgc3RhdHVzLCBzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICpsc3ApCit7CisJaWYgKHN0YXR1cyA9PSBORlNfT0sgfHwgc2VxaWRfbXV0YXRpbmdfZXJyKC1zdGF0dXMpKQorCQlsc3AtPmxzX3NlcWlkKys7Cit9CisKKy8qIAorKiBDaGVjayB0byBzZWUgaWYgdGhlIHJlcXVlc3QgbG9jayAodHlwZSBGTF9VTkxLKSBlZmZlY3RzIHRoZSBmbCBsb2NrLgorKgorKiBmbCBhbmQgcmVxdWVzdCBtdXN0IGhhdmUgdGhlIHNhbWUgcG9zaXggb3duZXIKKyoKKyogcmV0dXJuOiAKKyogMCAtPiBmbCBub3QgZWZmZWN0ZWQgYnkgcmVxdWVzdAorKiAxIC0+IGZsIGNvbnN1bWVkIGJ5IHJlcXVlc3QKKyovCisKK3N0YXRpYyBpbnQKK25mczRfY2hlY2tfdW5sb2NrKHN0cnVjdCBmaWxlX2xvY2sgKmZsLCBzdHJ1Y3QgZmlsZV9sb2NrICpyZXF1ZXN0KQoreworCWlmIChmbC0+Zmxfc3RhcnQgPj0gcmVxdWVzdC0+Zmxfc3RhcnQgJiYgZmwtPmZsX2VuZCA8PSByZXF1ZXN0LT5mbF9lbmQpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKgorICogUG9zdCBhbiBpbml0aWFsaXplZCBsb2NrX3N0YXRlIG9uIHRoZSBzdGF0ZS0+bG9ja19zdGF0ZXMgbGlzdC4KKyAqLwordm9pZCBuZnM0X25vdGlmeV9zZXRsayhzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBmaWxlX2xvY2sgKnJlcXVlc3QsIHN0cnVjdCBuZnM0X2xvY2tfc3RhdGUgKmxzcCkKK3sKKwlpZiAoIWxpc3RfZW1wdHkoJmxzcC0+bHNfbG9ja3MpKQorCQlyZXR1cm47CisJYXRvbWljX2luYygmbHNwLT5sc19jb3VudCk7CisJd3JpdGVfbG9jaygmc3RhdGUtPnN0YXRlX2xvY2spOworCWxpc3RfYWRkKCZsc3AtPmxzX2xvY2tzLCAmc3RhdGUtPmxvY2tfc3RhdGVzKTsKKwlzZXRfYml0KExLX1NUQVRFX0lOX1VTRSwgJnN0YXRlLT5mbGFncyk7CisJd3JpdGVfdW5sb2NrKCZzdGF0ZS0+c3RhdGVfbG9jayk7Cit9CisKKy8qIAorICogdG8gZGVjaWRlIHRvICdyZWFwJyBsb2NrIHN0YXRlOgorICogMSkgc2VhcmNoIGlfZmxvY2sgZm9yIGZpbGVfbG9ja3Mgd2l0aCBmbC5sb2NrX3N0YXRlID0gdG8gbHMuCisgKiAyKSBkZXRlcm1pbmUgaWYgdW5sb2NrIHdpbGwgY29uc3VtZSBmb3VuZCBsb2NrLiAKKyAqIAlpZiBzbywgcmVhcAorICoKKyAqIAllbHNlLCBkb24ndCByZWFwLgorICoKKyAqLwordm9pZAorbmZzNF9ub3RpZnlfdW5sY2soc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgZmlsZV9sb2NrICpyZXF1ZXN0LCBzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICpsc3ApCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHN0YXRlLT5pbm9kZTsKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbDsKKworCWZvciAoZmwgPSBpbm9kZS0+aV9mbG9jazsgZmwgIT0gTlVMTDsgZmwgPSBmbC0+ZmxfbmV4dCkgeworCQlpZiAoIShmbC0+ZmxfZmxhZ3MgJiBGTF9QT1NJWCkpCisJCQljb250aW51ZTsKKwkJaWYgKGZsLT5mbF9vd25lciAhPSBsc3AtPmxzX293bmVyKQorCQkJY29udGludWU7CisJCS8qIEV4aXQgaWYgd2UgZmluZCBhdCBsZWFzdCBvbmUgbG9jayB3aGljaCBpcyBub3QgY29uc3VtZWQgKi8KKwkJaWYgKG5mczRfY2hlY2tfdW5sb2NrKGZsLHJlcXVlc3QpID09IDApCisJCQlyZXR1cm47CisJfQorCisJd3JpdGVfbG9jaygmc3RhdGUtPnN0YXRlX2xvY2spOworCWxpc3RfZGVsX2luaXQoJmxzcC0+bHNfbG9ja3MpOworCWlmIChsaXN0X2VtcHR5KCZzdGF0ZS0+bG9ja19zdGF0ZXMpKQorCQljbGVhcl9iaXQoTEtfU1RBVEVfSU5fVVNFLCAmc3RhdGUtPmZsYWdzKTsKKwl3cml0ZV91bmxvY2soJnN0YXRlLT5zdGF0ZV9sb2NrKTsKKwluZnM0X3B1dF9sb2NrX3N0YXRlKGxzcCk7Cit9CisKKy8qCisgKiBSZWxlYXNlIHJlZmVyZW5jZSB0byBsb2NrX3N0YXRlLCBhbmQgZnJlZSBpdCBpZiB3ZSBzZWUgdGhhdAorICogaXQgaXMgbm8gbG9uZ2VyIGluIHVzZQorICovCit2b2lkCituZnM0X3B1dF9sb2NrX3N0YXRlKHN0cnVjdCBuZnM0X2xvY2tfc3RhdGUgKmxzcCkKK3sKKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmxzcC0+bHNfY291bnQpKQorCQlyZXR1cm47CisJQlVHX09OICghbGlzdF9lbXB0eSgmbHNwLT5sc19sb2NrcykpOworCWtmcmVlKGxzcCk7Cit9CisKKy8qCisqIENhbGxlZCB3aXRoIHNwLT5zb19zZW1hIGFuZCBjbHAtPmNsX3NlbSBoZWxkLgorKgorKiBJbmNyZW1lbnQgdGhlIHNlcWlkIGlmIHRoZSBPUEVOL09QRU5fRE9XTkdSQURFL0NMT1NFIHN1Y2NlZWRlZCwgb3IKKyogZmFpbGVkIHdpdGggYSBzZXFpZCBpbmNyZW1lbnRpbmcgZXJyb3IgLQorKiBzZWUgY29tbWVudHMgbmZzX2ZzLmg6c2VxaWRfbXV0YXRpbmdfZXJyb3IoKQorKi8KK3ZvaWQgbmZzNF9pbmNyZW1lbnRfc2VxaWQoaW50IHN0YXR1cywgc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwKQoreworCWlmIChzdGF0dXMgPT0gTkZTX09LIHx8IHNlcWlkX211dGF0aW5nX2Vycigtc3RhdHVzKSkKKwkJc3AtPnNvX3NlcWlkKys7CisJLyogSWYgdGhlIHNlcnZlciByZXR1cm5zIEJBRF9TRVFJRCwgdW5oYXNoIHN0YXRlX293bmVyIGhlcmUgKi8KKwlpZiAoc3RhdHVzID09IC1ORlM0RVJSX0JBRF9TRVFJRCkKKwkJbmZzNF9kcm9wX3N0YXRlX293bmVyKHNwKTsKK30KKworc3RhdGljIGludCByZWNsYWltZXIodm9pZCAqKTsKK3N0cnVjdCByZWNsYWltZXJfYXJncyB7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHA7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGU7Cit9OworCisvKgorICogU3RhdGUgcmVjb3Zlcnkgcm91dGluZQorICovCit2b2lkCituZnM0X3JlY292ZXJfc3RhdGUodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IChzdHJ1Y3QgbmZzNF9jbGllbnQgKilkYXRhOworCXN0cnVjdCByZWNsYWltZXJfYXJncyBhcmdzID0geworCQkuY2xwID0gY2xwLAorCX07CisJbWlnaHRfc2xlZXAoKTsKKworCWluaXRfY29tcGxldGlvbigmYXJncy5jb21wbGV0ZSk7CisKKwlpZiAoa2VybmVsX3RocmVhZChyZWNsYWltZXIsICZhcmdzLCBDTE9ORV9LRVJORUwpIDwgMCkKKwkJZ290byBvdXRfZmFpbGVkX2NsZWFyOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFyZ3MuY29tcGxldGUpOworCXJldHVybjsKK291dF9mYWlsZWRfY2xlYXI6CisJc2V0X2JpdChORlM0Q0xOVF9PSywgJmNscC0+Y2xfc3RhdGUpOworCXdha2VfdXBfYWxsKCZjbHAtPmNsX3dhaXRxKTsKKwlycGNfd2FrZV91cCgmY2xwLT5jbF9ycGN3YWl0cSk7Cit9CisKKy8qCisgKiBTY2hlZHVsZSBhIHN0YXRlIHJlY292ZXJ5IGF0dGVtcHQKKyAqLwordm9pZAorbmZzNF9zY2hlZHVsZV9zdGF0ZV9yZWNvdmVyeShzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlpZiAoIWNscCkKKwkJcmV0dXJuOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTkZTNENMTlRfT0ssICZjbHAtPmNsX3N0YXRlKSkKKwkJc2NoZWR1bGVfd29yaygmY2xwLT5jbF9yZWNvdmVyZCk7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9yZWNsYWltX2xvY2tzKHN0cnVjdCBuZnM0X3N0YXRlX3JlY292ZXJ5X29wcyAqb3BzLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHN0YXRlLT5pbm9kZTsKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbDsKKwlpbnQgc3RhdHVzID0gMDsKKworCWZvciAoZmwgPSBpbm9kZS0+aV9mbG9jazsgZmwgIT0gMDsgZmwgPSBmbC0+ZmxfbmV4dCkgeworCQlpZiAoIShmbC0+ZmxfZmxhZ3MgJiBGTF9QT1NJWCkpCisJCQljb250aW51ZTsKKwkJaWYgKCgoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKilmbC0+ZmxfZmlsZS0+cHJpdmF0ZV9kYXRhKS0+c3RhdGUgIT0gc3RhdGUpCisJCQljb250aW51ZTsKKwkJc3RhdHVzID0gb3BzLT5yZWNvdmVyX2xvY2soc3RhdGUsIGZsKTsKKwkJaWYgKHN0YXR1cyA+PSAwKQorCQkJY29udGludWU7CisJCXN3aXRjaCAoc3RhdHVzKSB7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuaGFuZGxlZCBlcnJvciAlZC4gWmVyb2luZyBzdGF0ZVxuIiwKKwkJCQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCWNhc2UgLU5GUzRFUlJfRVhQSVJFRDoKKwkJCWNhc2UgLU5GUzRFUlJfTk9fR1JBQ0U6CisJCQljYXNlIC1ORlM0RVJSX1JFQ0xBSU1fQkFEOgorCQkJY2FzZSAtTkZTNEVSUl9SRUNMQUlNX0NPTkZMSUNUOgorCQkJCS8qIGtpbGxfcHJvYyhmbC0+Zmxfb3duZXIsIFNJR0xPU1QsIDEpOyAqLworCQkJCWJyZWFrOworCQkJY2FzZSAtTkZTNEVSUl9TVEFMRV9DTElFTlRJRDoKKwkJCQlnb3RvIG91dF9lcnI7CisJCX0KKwl9CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9yZWNsYWltX29wZW5fc3RhdGUoc3RydWN0IG5mczRfc3RhdGVfcmVjb3Zlcnlfb3BzICpvcHMsIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcCkKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGU7CisJc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqbG9jazsKKwlpbnQgc3RhdHVzID0gMDsKKworCS8qIE5vdGU6IHdlIHJlbHkgb24gdGhlIHNwLT5zb19zdGF0ZXMgbGlzdCBiZWluZyBvcmRlcmVkIAorCSAqIHNvIHRoYXQgd2UgYWx3YXlzIHJlY2xhaW0gb3BlbihPX1JEV1IpIGFuZC9vciBvcGVuKE9fV1JJVEUpCisJICogc3RhdGVzIGZpcnN0LgorCSAqIFRoaXMgaXMgbmVlZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBzZXJ2ZXIgd29uJ3QgZ2l2ZSB1cyBhbnkKKwkgKiByZWFkIGRlbGVnYXRpb25zIHRoYXQgd2UgaGF2ZSB0byByZXR1cm4gaWYsIHNheSwgd2UgYXJlCisJICogcmVjb3ZlcmluZyBhZnRlciBhIG5ldHdvcmsgcGFydGl0aW9uIG9yIGEgcmVib290IGZyb20gYQorCSAqIHNlcnZlciB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBhIGdyYWNlIHBlcmlvZC4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0YXRlLCAmc3AtPnNvX3N0YXRlcywgb3Blbl9zdGF0ZXMpIHsKKwkJaWYgKHN0YXRlLT5zdGF0ZSA9PSAwKQorCQkJY29udGludWU7CisJCXN0YXR1cyA9IG9wcy0+cmVjb3Zlcl9vcGVuKHNwLCBzdGF0ZSk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobG9jaywgJnN0YXRlLT5sb2NrX3N0YXRlcywgbHNfbG9ja3MpCisJCQlsb2NrLT5sc19mbGFncyAmPSB+TkZTX0xPQ0tfSU5JVElBTElaRUQ7CisJCWlmIChzdGF0dXMgPj0gMCkgeworCQkJc3RhdHVzID0gbmZzNF9yZWNsYWltX2xvY2tzKG9wcywgc3RhdGUpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBvdXRfZXJyOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NrLCAmc3RhdGUtPmxvY2tfc3RhdGVzLCBsc19sb2NrcykgeworCQkJCWlmICghKGxvY2stPmxzX2ZsYWdzICYgTkZTX0xPQ0tfSU5JVElBTElaRUQpKQorCQkJCQlwcmludGsoIiVzOiBMb2NrIHJlY2xhaW0gZmFpbGVkIVxuIiwKKwkJCQkJCQlfX0ZVTkNUSU9OX18pOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5oYW5kbGVkIGVycm9yICVkLiBaZXJvaW5nIHN0YXRlXG4iLAorCQkJCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJY2FzZSAtRU5PRU5UOgorCQkJY2FzZSAtTkZTNEVSUl9SRUNMQUlNX0JBRDoKKwkJCWNhc2UgLU5GUzRFUlJfUkVDTEFJTV9DT05GTElDVDoKKwkJCQkvKgorCQkJCSAqIE9wZW4gc3RhdGUgb24gdGhpcyBmaWxlIGNhbm5vdCBiZSByZWNvdmVyZWQKKwkJCQkgKiBBbGwgd2UgY2FuIGRvIGlzIHJldmVydCB0byB1c2luZyB0aGUgemVybyBzdGF0ZWlkLgorCQkJCSAqLworCQkJCW1lbXNldChzdGF0ZS0+c3RhdGVpZC5kYXRhLCAwLAorCQkJCQlzaXplb2Yoc3RhdGUtPnN0YXRlaWQuZGF0YSkpOworCQkJCS8qIE1hcmsgdGhlIGZpbGUgYXMgYmVpbmcgJ2Nsb3NlZCcgKi8KKwkJCQlzdGF0ZS0+c3RhdGUgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSAtTkZTNEVSUl9FWFBJUkVEOgorCQkJY2FzZSAtTkZTNEVSUl9OT19HUkFDRToKKwkJCWNhc2UgLU5GUzRFUlJfU1RBTEVfQ0xJRU5USUQ6CisJCQkJZ290byBvdXRfZXJyOworCQl9CisJfQorCXJldHVybiAwOworb3V0X2VycjoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHJlY2xhaW1lcih2b2lkICpwdHIpCit7CisJc3RydWN0IHJlY2xhaW1lcl9hcmdzICphcmdzID0gKHN0cnVjdCByZWNsYWltZXJfYXJncyAqKXB0cjsKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IGFyZ3MtPmNscDsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3A7CisJc3RydWN0IG5mczRfc3RhdGVfcmVjb3Zlcnlfb3BzICpvcHM7CisJaW50IHN0YXR1cyA9IDA7CisKKwlkYWVtb25pemUoIiV1LiV1LiV1LiV1LXJlY2xhaW0iLCBOSVBRVUFEKGNscC0+Y2xfYWRkcikpOworCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKKworCWF0b21pY19pbmMoJmNscC0+Y2xfY291bnQpOworCWNvbXBsZXRlKCZhcmdzLT5jb21wbGV0ZSk7CisKKwkvKiBFbnN1cmUgZXhjbHVzaXZlIGFjY2VzcyB0byBORlN2NCBzdGF0ZSAqLworCWxvY2tfa2VybmVsKCk7CisJZG93bl93cml0ZSgmY2xwLT5jbF9zZW0pOworCS8qIEFyZSB0aGVyZSBhbnkgTkZTIG1vdW50cyBvdXQgdGhlcmU/ICovCisJaWYgKGxpc3RfZW1wdHkoJmNscC0+Y2xfc3VwZXJibG9ja3MpKQorCQlnb3RvIG91dDsKK3Jlc3RhcnRfbG9vcDoKKwlzdGF0dXMgPSBuZnM0X3Byb2NfcmVuZXcoY2xwKTsKKwlzd2l0Y2ggKHN0YXR1cykgeworCQljYXNlIDA6CisJCWNhc2UgLU5GUzRFUlJfQ0JfUEFUSF9ET1dOOgorCQkJZ290byBvdXQ7CisJCWNhc2UgLU5GUzRFUlJfU1RBTEVfQ0xJRU5USUQ6CisJCWNhc2UgLU5GUzRFUlJfTEVBU0VfTU9WRUQ6CisJCQlvcHMgPSAmbmZzNF9yZWJvb3RfcmVjb3Zlcnlfb3BzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlvcHMgPSAmbmZzNF9uZXR3b3JrX3BhcnRpdGlvbl9yZWNvdmVyeV9vcHM7CisJfTsKKwlzdGF0dXMgPSBfX25mczRfaW5pdF9jbGllbnQoY2xwKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dF9lcnJvcjsKKwkvKiBNYXJrIGFsbCBkZWxlZ2F0aW9ucyBmb3IgcmVjbGFpbSAqLworCW5mc19kZWxlZ2F0aW9uX21hcmtfcmVjbGFpbShjbHApOworCS8qIE5vdGU6IGxpc3QgaXMgcHJvdGVjdGVkIGJ5IGV4Y2x1c2l2ZSBsb2NrIG9uIGNsLT5jbF9zZW0gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNwLCAmY2xwLT5jbF9zdGF0ZV9vd25lcnMsIHNvX2xpc3QpIHsKKwkJc3RhdHVzID0gbmZzNF9yZWNsYWltX29wZW5fc3RhdGUob3BzLCBzcCk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlpZiAoc3RhdHVzID09IC1ORlM0RVJSX05PX0dSQUNFKSB7CisJCQkJb3BzID0gJm5mczRfbmV0d29ya19wYXJ0aXRpb25fcmVjb3Zlcnlfb3BzOworCQkJCXN0YXR1cyA9IG5mczRfcmVjbGFpbV9vcGVuX3N0YXRlKG9wcywgc3ApOworCQkJfQorCQkJaWYgKHN0YXR1cyA9PSAtTkZTNEVSUl9TVEFMRV9DTElFTlRJRCkKKwkJCQlnb3RvIHJlc3RhcnRfbG9vcDsKKwkJCWlmIChzdGF0dXMgPT0gLU5GUzRFUlJfRVhQSVJFRCkKKwkJCQlnb3RvIHJlc3RhcnRfbG9vcDsKKwkJfQorCX0KKwluZnNfZGVsZWdhdGlvbl9yZWFwX3VuY2xhaW1lZChjbHApOworb3V0OgorCXNldF9iaXQoTkZTNENMTlRfT0ssICZjbHAtPmNsX3N0YXRlKTsKKwl1cF93cml0ZSgmY2xwLT5jbF9zZW0pOworCXVubG9ja19rZXJuZWwoKTsKKwl3YWtlX3VwX2FsbCgmY2xwLT5jbF93YWl0cSk7CisJcnBjX3dha2VfdXAoJmNscC0+Y2xfcnBjd2FpdHEpOworCWlmIChzdGF0dXMgPT0gLU5GUzRFUlJfQ0JfUEFUSF9ET1dOKQorCQluZnNfaGFuZGxlX2NiX3BhdGhkb3duKGNscCk7CisJbmZzNF9wdXRfY2xpZW50KGNscCk7CisJcmV0dXJuIDA7CitvdXRfZXJyb3I6CisJcHJpbnRrKEtFUk5fV0FSTklORyAiRXJyb3I6IHN0YXRlIHJlY292ZXJ5IGZhaWxlZCBvbiBORlN2NCBzZXJ2ZXIgJXUuJXUuJXUuJXUgd2l0aCBlcnJvciAlZFxuIiwKKwkJCQlOSVBRVUFEKGNscC0+Y2xfYWRkci5zX2FkZHIpLCAtc3RhdHVzKTsKKwlnb3RvIG91dDsKK30KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHhkci5jIGIvZnMvbmZzL25mczR4ZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjRkZTA1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL25mczR4ZHIuYwpAQCAtMCwwICsxLDQwMzQgQEAKKy8qCisgKiAgZnMvbmZzL25mczR4ZHIuYworICoKKyAqICBDbGllbnQtc2lkZSBYRFIgZm9yIE5GU3Y0LgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgS2VuZHJpY2sgU21pdGggPGttc21pdGhAdW1pY2guZWR1PgorICogIEFuZHkgQWRhbXNvbiAgIDxhbmRyb3NAdW1pY2guZWR1PgorICogCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqCisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiAgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzNC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19pZG1hcC5oPgorCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWQkJTkZTREJHX1hEUgorCisvKiBNYXBwaW5nIGZyb20gTkZTIGVycm9yIGNvZGUgdG8gImVycm5vIiBlcnJvciBjb2RlLiAqLworI2RlZmluZSBlcnJub19ORlNFUlJfSU8JCUVJTworCitzdGF0aWMgaW50IG5mc19zdGF0X3RvX2Vycm5vKGludCk7CisKKy8qIE5GU3Y0IENPTVBPVU5EIHRhZ3MgYXJlIG9ubHkgd2FudGVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgKi8KKyNpZmRlZiBERUJVRworI2RlZmluZSBORlM0X01BWFRBR0xFTgkJMjAKKyNlbHNlCisjZGVmaW5lIE5GUzRfTUFYVEFHTEVOCQkwCisjZW5kaWYKKworLyogbG9jayxvcGVuIG93bmVyIGlkOiAKKyAqIHdlIGN1cnJlbnRseSB1c2Ugc2l6ZSAxICh1MzIpIG91dCBvZiAoTkZTNF9PUEFRVUVfTElNSVQgID4+IDIpCisgKi8KKyNkZWZpbmUgb3duZXJfaWRfbWF4c3ogICAgICAgICAgKDEgKyAxKQorI2RlZmluZSBjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6CSgzICsgKE5GUzRfTUFYVEFHTEVOID4+IDIpKQorI2RlZmluZSBjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6CSgzICsgKE5GUzRfTUFYVEFHTEVOID4+IDIpKQorI2RlZmluZSBvcF9lbmNvZGVfaGRyX21heHN6CSgxKQorI2RlZmluZSBvcF9kZWNvZGVfaGRyX21heHN6CSgyKQorI2RlZmluZSBlbmNvZGVfcHV0ZmhfbWF4c3oJKG9wX2VuY29kZV9oZHJfbWF4c3ogKyAxICsgXAorCQkJCShORlM0X0ZIU0laRSA+PiAyKSkKKyNkZWZpbmUgZGVjb2RlX3B1dGZoX21heHN6CShvcF9kZWNvZGVfaGRyX21heHN6KQorI2RlZmluZSBlbmNvZGVfcHV0cm9vdGZoX21heHN6CShvcF9lbmNvZGVfaGRyX21heHN6KQorI2RlZmluZSBkZWNvZGVfcHV0cm9vdGZoX21heHN6CShvcF9kZWNvZGVfaGRyX21heHN6KQorI2RlZmluZSBlbmNvZGVfZ2V0ZmhfbWF4c3ogICAgICAob3BfZW5jb2RlX2hkcl9tYXhzeikKKyNkZWZpbmUgZGVjb2RlX2dldGZoX21heHN6ICAgICAgKG9wX2RlY29kZV9oZHJfbWF4c3ogKyAxICsgXAorCQkJCSgoMytORlM0X0ZIU0laRSkgPj4gMikpCisjZGVmaW5lIGVuY29kZV9nZXRhdHRyX21heHN6ICAgIChvcF9lbmNvZGVfaGRyX21heHN6ICsgMykKKyNkZWZpbmUgbmZzNF9uYW1lX21heHN6CQkoMSArICgoMyArIE5GUzRfTUFYTkFNTEVOKSA+PiAyKSkKKyNkZWZpbmUgbmZzNF9wYXRoX21heHN6CQkoMSArICgoMyArIE5GUzRfTUFYUEFUSExFTikgPj4gMikpCisjZGVmaW5lIG5mczRfZmF0dHJfYml0bWFwX21heHN6ICgzNiArIDIgKiBuZnM0X25hbWVfbWF4c3opCisjZGVmaW5lIGRlY29kZV9nZXRhdHRyX21heHN6ICAgIChvcF9kZWNvZGVfaGRyX21heHN6ICsgMyArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmZzNF9mYXR0cl9iaXRtYXBfbWF4c3opCisjZGVmaW5lIGVuY29kZV9zYXZlZmhfbWF4c3ogICAgIChvcF9lbmNvZGVfaGRyX21heHN6KQorI2RlZmluZSBkZWNvZGVfc2F2ZWZoX21heHN6ICAgICAob3BfZGVjb2RlX2hkcl9tYXhzeikKKyNkZWZpbmUgZW5jb2RlX2ZzaW5mb19tYXhzegkob3BfZW5jb2RlX2hkcl9tYXhzeiArIDIpCisjZGVmaW5lIGRlY29kZV9mc2luZm9fbWF4c3oJKG9wX2RlY29kZV9oZHJfbWF4c3ogKyAxMSkKKyNkZWZpbmUgZW5jb2RlX3JlbmV3X21heHN6CShvcF9lbmNvZGVfaGRyX21heHN6ICsgMykKKyNkZWZpbmUgZGVjb2RlX3JlbmV3X21heHN6CShvcF9kZWNvZGVfaGRyX21heHN6KQorI2RlZmluZSBlbmNvZGVfc2V0Y2xpZW50aWRfbWF4c3ogXAorCQkJCShvcF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCTQgLypzZXJ2ZXItPmlwX2FkZHIqLyArIFwKKwkJCQkxIC8qTmV0aWQqLyArIFwKKwkJCQk2IC8qdWFkZHIqLyArIFwKKwkJCQk2ICsgKE5GUzRfVkVSSUZJRVJfU0laRSA+PiAyKSkKKyNkZWZpbmUgZGVjb2RlX3NldGNsaWVudGlkX21heHN6IFwKKwkJCQkob3BfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQkyICsgXAorCQkJCTEwMjQpIC8qIGxhcmdlIHZhbHVlIGZvciBDTElEX0lOVVNFICovCisjZGVmaW5lIGVuY29kZV9zZXRjbGllbnRpZF9jb25maXJtX21heHN6IFwKKwkJCQkob3BfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQkzICsgKE5GUzRfVkVSSUZJRVJfU0laRSA+PiAyKSkKKyNkZWZpbmUgZGVjb2RlX3NldGNsaWVudGlkX2NvbmZpcm1fbWF4c3ogXAorCQkJCShvcF9kZWNvZGVfaGRyX21heHN6KQorI2RlZmluZSBlbmNvZGVfbG9va3VwX21heHN6CShvcF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCTEgKyAoKDMgKyBORlM0X0ZIU0laRSkgPj4gMikpCisjZGVmaW5lIGVuY29kZV9yZW1vdmVfbWF4c3oJKG9wX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJbmZzNF9uYW1lX21heHN6KQorI2RlZmluZSBlbmNvZGVfcmVuYW1lX21heHN6CShvcF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCTIgKiBuZnM0X25hbWVfbWF4c3opCisjZGVmaW5lIGRlY29kZV9yZW5hbWVfbWF4c3oJKG9wX2RlY29kZV9oZHJfbWF4c3ogKyA1ICsgNSkKKyNkZWZpbmUgZW5jb2RlX2xpbmtfbWF4c3oJKG9wX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJbmZzNF9uYW1lX21heHN6KQorI2RlZmluZSBkZWNvZGVfbGlua19tYXhzegkob3BfZGVjb2RlX2hkcl9tYXhzeiArIDUpCisjZGVmaW5lIGVuY29kZV9zeW1saW5rX21heHN6CShvcF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCTEgKyBuZnM0X25hbWVfbWF4c3ogKyBcCisJCQkJbmZzNF9wYXRoX21heHN6ICsgXAorCQkJCW5mczRfZmF0dHJfYml0bWFwX21heHN6KQorI2RlZmluZSBkZWNvZGVfc3ltbGlua19tYXhzegkob3BfZGVjb2RlX2hkcl9tYXhzeiArIDgpCisjZGVmaW5lIGVuY29kZV9jcmVhdGVfbWF4c3oJKG9wX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJMiArIG5mczRfbmFtZV9tYXhzeiArIFwKKwkJCQluZnM0X2ZhdHRyX2JpdG1hcF9tYXhzeikKKyNkZWZpbmUgZGVjb2RlX2NyZWF0ZV9tYXhzegkob3BfZGVjb2RlX2hkcl9tYXhzeiArIDgpCisjZGVmaW5lIGVuY29kZV9kZWxlZ3JldHVybl9tYXhzeiAob3BfZW5jb2RlX2hkcl9tYXhzeiArIDQpCisjZGVmaW5lIGRlY29kZV9kZWxlZ3JldHVybl9tYXhzeiAob3BfZGVjb2RlX2hkcl9tYXhzeikKKyNkZWZpbmUgTkZTNF9lbmNfY29tcG91bmRfc3oJKDEwMjQpICAvKiBYWFg6IGxhcmdlIGVub3VnaD8gKi8KKyNkZWZpbmUgTkZTNF9kZWNfY29tcG91bmRfc3oJKDEwMjQpICAvKiBYWFg6IGxhcmdlIGVub3VnaD8gKi8KKyNkZWZpbmUgTkZTNF9lbmNfcmVhZF9zegkoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQllbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJb3BfZW5jb2RlX2hkcl9tYXhzeiArIDcpCisjZGVmaW5lIE5GUzRfZGVjX3JlYWRfc3oJKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCW9wX2RlY29kZV9oZHJfbWF4c3ogKyAyKQorI2RlZmluZSBORlM0X2VuY19yZWFkbGlua19zegkoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQllbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJb3BfZW5jb2RlX2hkcl9tYXhzeikKKyNkZWZpbmUgTkZTNF9kZWNfcmVhZGxpbmtfc3oJKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCW9wX2RlY29kZV9oZHJfbWF4c3opCisjZGVmaW5lIE5GUzRfZW5jX3JlYWRkaXJfc3oJKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCW9wX2VuY29kZV9oZHJfbWF4c3ogKyA5KQorI2RlZmluZSBORlM0X2RlY19yZWFkZGlyX3N6CShjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCWRlY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQlvcF9kZWNvZGVfaGRyX21heHN6ICsgMikKKyNkZWZpbmUgTkZTNF9lbmNfd3JpdGVfc3oJKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCW9wX2VuY29kZV9oZHJfbWF4c3ogKyA4KQorI2RlZmluZSBORlM0X2RlY193cml0ZV9zegkoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJb3BfZGVjb2RlX2hkcl9tYXhzeiArIDQpCisjZGVmaW5lIE5GUzRfZW5jX2NvbW1pdF9zegkoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQllbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJb3BfZW5jb2RlX2hkcl9tYXhzeiArIDMpCisjZGVmaW5lIE5GUzRfZGVjX2NvbW1pdF9zegkoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJb3BfZGVjb2RlX2hkcl9tYXhzeiArIDIpCisjZGVmaW5lIE5GUzRfZW5jX29wZW5fc3ogICAgICAgIChjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2VuY29kZV9oZHJfbWF4c3ogKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzICsgMyArIDIgKyA2NCArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlX2dldGF0dHJfbWF4c3ogKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZV9nZXRmaF9tYXhzeikKKyNkZWZpbmUgTkZTNF9kZWNfb3Blbl9zeiAgICAgICAgKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9wdXRmaF9tYXhzeiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfZGVjb2RlX2hkcl9tYXhzeiArIDQgKyA1ICsgMiArIDMgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9nZXRhdHRyX21heHN6ICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfZ2V0ZmhfbWF4c3opCisjZGVmaW5lIE5GUzRfZW5jX29wZW5fY29uZmlybV9zeiAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZV9wdXRmaF9tYXhzeiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfZW5jb2RlX2hkcl9tYXhzeiArIDUpCisjZGVmaW5lIE5GUzRfZGVjX29wZW5fY29uZmlybV9zeiAgICAgICAgKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX3B1dGZoX21heHN6ICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2RlY29kZV9oZHJfbWF4c3ogKyA0KQorI2RlZmluZSBORlM0X2VuY19vcGVuX25vYXR0cl9zegkoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQkJZW5jb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCQlvcF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCQkxMSkKKyNkZWZpbmUgTkZTNF9kZWNfb3Blbl9ub2F0dHJfc3oJKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJCWRlY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQkJb3BfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQkJNCArIDUgKyAyICsgMykKKyNkZWZpbmUgTkZTNF9lbmNfb3Blbl9kb3duZ3JhZGVfc3ogXAorCQkJCShjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2VuY29kZV9oZHJfbWF4c3ogKyA3KQorI2RlZmluZSBORlM0X2RlY19vcGVuX2Rvd25ncmFkZV9zeiBcCisJCQkJKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9wdXRmaF9tYXhzeiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfZGVjb2RlX2hkcl9tYXhzeiArIDQpCisjZGVmaW5lIE5GUzRfZW5jX2Nsb3NlX3N6ICAgICAgIChjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2VuY29kZV9oZHJfbWF4c3ogKyA1KQorI2RlZmluZSBORlM0X2RlY19jbG9zZV9zeiAgICAgICAoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX3B1dGZoX21heHN6ICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9kZWNvZGVfaGRyX21heHN6ICsgNCkKKyNkZWZpbmUgTkZTNF9lbmNfc2V0YXR0cl9zeiAgICAgKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZV9wdXRmaF9tYXhzeiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfZW5jb2RlX2hkcl9tYXhzeiArIDQgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5mczRfZmF0dHJfYml0bWFwX21heHN6ICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVfZ2V0YXR0cl9tYXhzeikKKyNkZWZpbmUgTkZTNF9kZWNfc2V0YXR0cl9zeiAgICAgKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9wdXRmaF9tYXhzeiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfZGVjb2RlX2hkcl9tYXhzeiArIDMpCisjZGVmaW5lIE5GUzRfZW5jX2ZzaW5mb19zegkoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQllbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJZW5jb2RlX2ZzaW5mb19tYXhzeikKKyNkZWZpbmUgTkZTNF9kZWNfZnNpbmZvX3N6CShjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCWRlY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQlkZWNvZGVfZnNpbmZvX21heHN6KQorI2RlZmluZSBORlM0X2VuY19yZW5ld19zegkoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQllbmNvZGVfcmVuZXdfbWF4c3opCisjZGVmaW5lIE5GUzRfZGVjX3JlbmV3X3N6CShjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCWRlY29kZV9yZW5ld19tYXhzeikKKyNkZWZpbmUgTkZTNF9lbmNfc2V0Y2xpZW50aWRfc3oJKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3NldGNsaWVudGlkX21heHN6KQorI2RlZmluZSBORlM0X2RlY19zZXRjbGllbnRpZF9zegkoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfc2V0Y2xpZW50aWRfbWF4c3opCisjZGVmaW5lIE5GUzRfZW5jX3NldGNsaWVudGlkX2NvbmZpcm1fc3ogXAorCQkJCShjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCWVuY29kZV9zZXRjbGllbnRpZF9jb25maXJtX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRyb290ZmhfbWF4c3ogKyBcCisJCQkJZW5jb2RlX2ZzaW5mb19tYXhzeikKKyNkZWZpbmUgTkZTNF9kZWNfc2V0Y2xpZW50aWRfY29uZmlybV9zeiBcCisJCQkJKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3NldGNsaWVudGlkX2NvbmZpcm1fbWF4c3ogKyBcCisJCQkJZGVjb2RlX3B1dHJvb3RmaF9tYXhzeiArIFwKKwkJCQlkZWNvZGVfZnNpbmZvX21heHN6KQorI2RlZmluZSBORlM0X2VuY19sb2NrX3N6ICAgICAgICAoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQllbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJZW5jb2RlX2dldGF0dHJfbWF4c3ogKyBcCisJCQkJb3BfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQkxICsgMSArIDIgKyAyICsgXAorCQkJCTEgKyA0ICsgMSArIDIgKyBcCisJCQkJb3duZXJfaWRfbWF4c3opCisjZGVmaW5lIE5GUzRfZGVjX2xvY2tfc3ogICAgICAgIChjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCWRlY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQlkZWNvZGVfZ2V0YXR0cl9tYXhzeiArIFwKKwkJCQlvcF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCTIgKyAyICsgMSArIDIgKyBcCisJCQkJb3duZXJfaWRfbWF4c3opCisjZGVmaW5lIE5GUzRfZW5jX2xvY2t0X3N6ICAgICAgIChjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQllbmNvZGVfZ2V0YXR0cl9tYXhzeiArIFwKKwkJCQlvcF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCTEgKyAyICsgMiArIDIgKyBcCisJCQkJb3duZXJfaWRfbWF4c3opCisjZGVmaW5lIE5GUzRfZGVjX2xvY2t0X3N6ICAgICAgIChORlM0X2RlY19sb2NrX3N6KQorI2RlZmluZSBORlM0X2VuY19sb2NrdV9zeiAgICAgICAoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQllbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJZW5jb2RlX2dldGF0dHJfbWF4c3ogKyBcCisJCQkJb3BfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQkxICsgMSArIDQgKyAyICsgMikKKyNkZWZpbmUgTkZTNF9kZWNfbG9ja3Vfc3ogICAgICAgKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCWRlY29kZV9nZXRhdHRyX21heHN6ICsgXAorCQkJCW9wX2RlY29kZV9oZHJfbWF4c3ogKyA0KQorI2RlZmluZSBORlM0X2VuY19hY2Nlc3Nfc3oJKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCW9wX2VuY29kZV9oZHJfbWF4c3ogKyAxKQorI2RlZmluZSBORlM0X2RlY19hY2Nlc3Nfc3oJKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCW9wX2RlY29kZV9oZHJfbWF4c3ogKyAyKQorI2RlZmluZSBORlM0X2VuY19nZXRhdHRyX3N6CShjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQllbmNvZGVfZ2V0YXR0cl9tYXhzeikKKyNkZWZpbmUgTkZTNF9kZWNfZ2V0YXR0cl9zegkoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJZGVjb2RlX2dldGF0dHJfbWF4c3opCisjZGVmaW5lIE5GUzRfZW5jX2xvb2t1cF9zegkoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQllbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJZW5jb2RlX2xvb2t1cF9tYXhzeiArIFwKKwkJCQllbmNvZGVfZ2V0YXR0cl9tYXhzeiArIFwKKwkJCQllbmNvZGVfZ2V0ZmhfbWF4c3opCisjZGVmaW5lIE5GUzRfZGVjX2xvb2t1cF9zegkoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJb3BfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfZ2V0YXR0cl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfZ2V0ZmhfbWF4c3opCisjZGVmaW5lIE5GUzRfZW5jX2xvb2t1cF9yb290X3N6IChjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRyb290ZmhfbWF4c3ogKyBcCisJCQkJZW5jb2RlX2dldGF0dHJfbWF4c3ogKyBcCisJCQkJZW5jb2RlX2dldGZoX21heHN6KQorI2RlZmluZSBORlM0X2RlY19sb29rdXBfcm9vdF9zeiAoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfcHV0cm9vdGZoX21heHN6ICsgXAorCQkJCWRlY29kZV9nZXRhdHRyX21heHN6ICsgXAorCQkJCWRlY29kZV9nZXRmaF9tYXhzeikKKyNkZWZpbmUgTkZTNF9lbmNfcmVtb3ZlX3N6CShjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQllbmNvZGVfcmVtb3ZlX21heHN6KQorI2RlZmluZSBORlM0X2RlY19yZW1vdmVfc3oJKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCW9wX2RlY29kZV9oZHJfbWF4c3ogKyA1KQorI2RlZmluZSBORlM0X2VuY19yZW5hbWVfc3oJKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCWVuY29kZV9zYXZlZmhfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCWVuY29kZV9yZW5hbWVfbWF4c3opCisjZGVmaW5lIE5GUzRfZGVjX3JlbmFtZV9zegkoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3NhdmVmaF9tYXhzeiArIFwKKwkJCQlkZWNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3JlbmFtZV9tYXhzeikKKyNkZWZpbmUgTkZTNF9lbmNfbGlua19zegkoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQllbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3NhdmVmaF9tYXhzeiArIFwKKwkJCQllbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJZW5jb2RlX2xpbmtfbWF4c3opCisjZGVmaW5lIE5GUzRfZGVjX2xpbmtfc3oJKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCWRlY29kZV9zYXZlZmhfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCWRlY29kZV9saW5rX21heHN6KQorI2RlZmluZSBORlM0X2VuY19zeW1saW5rX3N6CShjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQllbmNvZGVfc3ltbGlua19tYXhzeiArIFwKKwkJCQllbmNvZGVfZ2V0YXR0cl9tYXhzeiArIFwKKwkJCQllbmNvZGVfZ2V0ZmhfbWF4c3opCisjZGVmaW5lIE5GUzRfZGVjX3N5bWxpbmtfc3oJKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCWRlY29kZV9zeW1saW5rX21heHN6ICsgXAorCQkJCWRlY29kZV9nZXRhdHRyX21heHN6ICsgXAorCQkJCWRlY29kZV9nZXRmaF9tYXhzeikKKyNkZWZpbmUgTkZTNF9lbmNfY3JlYXRlX3N6CShjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQllbmNvZGVfY3JlYXRlX21heHN6ICsgXAorCQkJCWVuY29kZV9nZXRhdHRyX21heHN6ICsgXAorCQkJCWVuY29kZV9nZXRmaF9tYXhzeikKKyNkZWZpbmUgTkZTNF9kZWNfY3JlYXRlX3N6CShjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCWRlY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQlkZWNvZGVfY3JlYXRlX21heHN6ICsgXAorCQkJCWRlY29kZV9nZXRhdHRyX21heHN6ICsgXAorCQkJCWRlY29kZV9nZXRmaF9tYXhzeikKKyNkZWZpbmUgTkZTNF9lbmNfcGF0aGNvbmZfc3oJKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCWVuY29kZV9nZXRhdHRyX21heHN6KQorI2RlZmluZSBORlM0X2RlY19wYXRoY29uZl9zegkoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJZGVjb2RlX2dldGF0dHJfbWF4c3opCisjZGVmaW5lIE5GUzRfZW5jX3N0YXRmc19zegkoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQllbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJZW5jb2RlX2dldGF0dHJfbWF4c3opCisjZGVmaW5lIE5GUzRfZGVjX3N0YXRmc19zegkoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJb3BfZGVjb2RlX2hkcl9tYXhzeiArIDEyKQorI2RlZmluZSBORlM0X2VuY19zZXJ2ZXJfY2Fwc19zeiAoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQllbmNvZGVfZ2V0YXR0cl9tYXhzeikKKyNkZWZpbmUgTkZTNF9kZWNfc2VydmVyX2NhcHNfc3ogKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZGVjb2RlX2dldGF0dHJfbWF4c3opCisjZGVmaW5lIE5GUzRfZW5jX2RlbGVncmV0dXJuX3N6CShjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQllbmNvZGVfZGVsZWdyZXR1cm5fbWF4c3opCisjZGVmaW5lIE5GUzRfZGVjX2RlbGVncmV0dXJuX3N6IChjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCWRlY29kZV9kZWxlZ3JldHVybl9tYXhzeikKKworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgaW50CW1vZGU7CisJdW5zaWduZWQgaW50CW5mczJ0eXBlOworfSBuZnNfdHlwZTJmbXRbXSA9IHsKKwl7IDAsCQlORk5PTgkgICAgIH0sCisJeyBTX0lGUkVHLAlORlJFRwkgICAgIH0sCisJeyBTX0lGRElSLAlORkRJUgkgICAgIH0sCisJeyBTX0lGQkxLLAlORkJMSwkgICAgIH0sCisJeyBTX0lGQ0hSLAlORkNIUgkgICAgIH0sCisJeyBTX0lGTE5LLAlORkxOSwkgICAgIH0sCisJeyBTX0lGU09DSywJTkZTT0NLCSAgICAgfSwKKwl7IFNfSUZJRk8sCU5GRklGTwkgICAgIH0sCisJeyAwLAkJTkZOT04JICAgICB9LAorCXsgMCwJCU5GTk9OCSAgICAgfSwKK307CisKK3N0cnVjdCBjb21wb3VuZF9oZHIgeworCWludDMyX3QJCXN0YXR1czsKKwl1aW50MzJfdAlub3BzOworCXVpbnQzMl90CXRhZ2xlbjsKKwljaGFyICoJCXRhZzsKK307CisKKy8qCisgKiBTVEFSVCBPRiAiR0VORVJJQyIgRU5DT0RFIFJPVVRJTkVTLgorICogICBUaGVzZSBtYXkgbG9vayBhIGxpdHRsZSB1Z2x5IHNpbmNlIHRoZXkgYXJlIGltcG9ydGVkIGZyb20gYSAiZ2VuZXJpYyIKKyAqIHNldCBvZiBYRFIgZW5jb2RlL2RlY29kZSByb3V0aW5lcyB3aGljaCBhcmUgaW50ZW5kZWQgdG8gYmUgc2hhcmVkIGJ5CisgKiBhbGwgb2Ygb3VyIE5GU3Y0IGltcGxlbWVudGF0aW9ucyAoT3BlbkJTRCwgTWFjT1MgWC4uLikuCisgKgorICogSWYgdGhlIHBhaW4gb2YgcmVhZGluZyB0aGVzZSBpcyB0b28gZ3JlYXQsIGl0IHNob3VsZCBiZSBhIHN0cmFpZ2h0Zm9yd2FyZAorICogdGFzayB0byB0cmFuc2xhdGUgdGhlbSBpbnRvIExpbnV4LXNwZWNpZmljIHZlcnNpb25zIHdoaWNoIGFyZSBtb3JlCisgKiBjb25zaXN0ZW50IHdpdGggdGhlIHN0eWxlIHVzZWQgaW4gTkZTdjIvdjMuLi4KKyAqLworI2RlZmluZSBXUklURTMyKG4pICAgICAgICAgICAgICAgKnArKyA9IGh0b25sKG4pCisjZGVmaW5lIFdSSVRFNjQobikgICAgICAgICAgICAgICBkbyB7CQkJCVwKKwkqcCsrID0gaHRvbmwoKHVpbnQzMl90KSgobikgPj4gMzIpKTsJCQkJXAorCSpwKysgPSBodG9ubCgodWludDMyX3QpKG4pKTsJCQkJCVwKK30gd2hpbGUgKDApCisjZGVmaW5lIFdSSVRFTUVNKHB0cixuYnl0ZXMpICAgICBkbyB7CQkJCVwKKwlwID0geGRyX2VuY29kZV9vcGFxdWVfZml4ZWQocCwgcHRyLCBuYnl0ZXMpOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBSRVNFUlZFX1NQQUNFKG5ieXRlcykJZG8gewkJCQlcCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgbmJ5dGVzKTsJCQlcCisJaWYgKCFwKSBwcmludGsoIlJFU0VSVkVfU1BBQ0UoJWQpIGZhaWxlZCBpbiBmdW5jdGlvbiAlc1xuIiwgKGludCkgKG5ieXRlcyksIF9fRlVOQ1RJT05fXyk7IFwKKwlCVUdfT04oIXApOwkJCQkJCVwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGVuY29kZV9zdHJpbmcoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqc3RyKQoreworCXVpbnQzMl90ICpwOworCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCArIGxlbik7CisJQlVHX09OKHAgPT0gTlVMTCk7CisJeGRyX2VuY29kZV9vcGFxdWUocCwgc3RyLCBsZW4pOworfQorCitzdGF0aWMgaW50IGVuY29kZV9jb21wb3VuZF9oZHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQoreworCXVpbnQzMl90ICpwOworCisJZHByaW50aygiZW5jb2RlX2NvbXBvdW5kOiB0YWc9JS4qc1xuIiwgKGludCloZHItPnRhZ2xlbiwgaGRyLT50YWcpOworCUJVR19PTihoZHItPnRhZ2xlbiA+IE5GUzRfTUFYVEFHTEVOKTsKKwlSRVNFUlZFX1NQQUNFKDEyKyhYRFJfUVVBRExFTihoZHItPnRhZ2xlbik8PDIpKTsKKwlXUklURTMyKGhkci0+dGFnbGVuKTsKKwlXUklURU1FTShoZHItPnRhZywgaGRyLT50YWdsZW4pOworCVdSSVRFMzIoTkZTNF9NSU5PUl9WRVJTSU9OKTsKKwlXUklURTMyKGhkci0+bm9wcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVuY29kZV9uZnM0X3ZlcmlmaWVyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IG5mczRfdmVyaWZpZXIgKnZlcmYpCit7CisJdWludDMyX3QgKnA7CisKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCBORlM0X1ZFUklGSUVSX1NJWkUpOworCUJVR19PTihwID09IE5VTEwpOworCXhkcl9lbmNvZGVfb3BhcXVlX2ZpeGVkKHAsIHZlcmYtPmRhdGEsIE5GUzRfVkVSSUZJRVJfU0laRSk7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2F0dHJzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBpYXR0ciAqaWFwLCBjb25zdCBzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKQoreworCWNoYXIgb3duZXJfbmFtZVtJRE1BUF9OQU1FU1pdOworCWNoYXIgb3duZXJfZ3JvdXBbSURNQVBfTkFNRVNaXTsKKwlpbnQgb3duZXJfbmFtZWxlbiA9IDA7CisJaW50IG93bmVyX2dyb3VwbGVuID0gMDsKKwl1aW50MzJfdCAqcDsKKwl1aW50MzJfdCAqcTsKKwlpbnQgbGVuOworCXVpbnQzMl90IGJtdmFsMCA9IDA7CisJdWludDMyX3QgYm12YWwxID0gMDsKKwlpbnQgc3RhdHVzOworCisJLyoKKwkgKiBXZSByZXNlcnZlIGVub3VnaCBzcGFjZSB0byB3cml0ZSB0aGUgZW50aXJlIGF0dHJpYnV0ZSBidWZmZXIgYXQgb25jZS4KKwkgKiBJbiB0aGUgd29yc3QtY2FzZSwgdGhpcyB3b3VsZCBiZQorCSAqICAgMTIoYml0bWFwKSArIDQoYXR0cmxlbikgKyA4KHNpemUpICsgNChtb2RlKSArIDQoYXRpbWUpICsgNChtdGltZSkKKwkgKiAgICAgICAgICA9IDM2IGJ5dGVzLCBwbHVzIGFueSBjb250cmlidXRpb24gZnJvbSB2YXJpYWJsZS1sZW5ndGggZmllbGRzCisJICogICAgICAgICAgICBzdWNoIGFzIG93bmVyL2dyb3VwL2FjbCdzLgorCSAqLworCWxlbiA9IDE2OworCisJLyogU2lnaCAqLworCWlmIChpYXAtPmlhX3ZhbGlkICYgQVRUUl9TSVpFKQorCQlsZW4gKz0gODsKKwlpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkKKwkJbGVuICs9IDQ7CisJaWYgKGlhcC0+aWFfdmFsaWQgJiBBVFRSX1VJRCkgeworCQlvd25lcl9uYW1lbGVuID0gbmZzX21hcF91aWRfdG9fbmFtZShzZXJ2ZXItPm5mczRfc3RhdGUsIGlhcC0+aWFfdWlkLCBvd25lcl9uYW1lKTsKKwkJaWYgKG93bmVyX25hbWVsZW4gPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJuZnM6IGNvdWxkbid0IHJlc29sdmUgdWlkICVkIHRvIHN0cmluZ1xuIiwKKwkJCSAgICAgICBpYXAtPmlhX3VpZCk7CisJCQkvKiBYWFggKi8KKwkJCXN0cmNweShvd25lcl9uYW1lLCAibm9ib2R5Iik7CisJCQlvd25lcl9uYW1lbGVuID0gc2l6ZW9mKCJub2JvZHkiKSAtIDE7CisJCQkvKiBnb3RvIG91dDsgKi8KKwkJfQorCQlsZW4gKz0gNCArIChYRFJfUVVBRExFTihvd25lcl9uYW1lbGVuKSA8PCAyKTsKKwl9CisJaWYgKGlhcC0+aWFfdmFsaWQgJiBBVFRSX0dJRCkgeworCQlvd25lcl9ncm91cGxlbiA9IG5mc19tYXBfZ2lkX3RvX2dyb3VwKHNlcnZlci0+bmZzNF9zdGF0ZSwgaWFwLT5pYV9naWQsIG93bmVyX2dyb3VwKTsKKwkJaWYgKG93bmVyX2dyb3VwbGVuIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibmZzNDogY291bGRuJ3QgcmVzb2x2ZSBnaWQgJWQgdG8gc3RyaW5nXG4iLAorCQkJICAgICAgIGlhcC0+aWFfZ2lkKTsKKwkJCXN0cmNweShvd25lcl9ncm91cCwgIm5vYm9keSIpOworCQkJb3duZXJfZ3JvdXBsZW4gPSBzaXplb2YoIm5vYm9keSIpIC0gMTsKKwkJCS8qIGdvdG8gb3V0OyAqLworCQl9CisJCWxlbiArPSA0ICsgKFhEUl9RVUFETEVOKG93bmVyX2dyb3VwbGVuKSA8PCAyKTsKKwl9CisJaWYgKGlhcC0+aWFfdmFsaWQgJiBBVFRSX0FUSU1FX1NFVCkKKwkJbGVuICs9IDE2OworCWVsc2UgaWYgKGlhcC0+aWFfdmFsaWQgJiBBVFRSX0FUSU1FKQorCQlsZW4gKz0gNDsKKwlpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfTVRJTUVfU0VUKQorCQlsZW4gKz0gMTY7CisJZWxzZSBpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfTVRJTUUpCisJCWxlbiArPSA0OworCVJFU0VSVkVfU1BBQ0UobGVuKTsKKworCS8qCisJICogV2Ugd3JpdGUgdGhlIGJpdG1hcCBsZW5ndGggbm93LCBidXQgbGVhdmUgdGhlIGJpdG1hcCBhbmQgdGhlIGF0dHJpYnV0ZQorCSAqIGJ1ZmZlciBsZW5ndGggdG8gYmUgYmFja2ZpbGxlZCBhdCB0aGUgZW5kIG9mIHRoaXMgcm91dGluZS4KKwkgKi8KKwlXUklURTMyKDIpOworCXEgPSBwOworCXAgKz0gMzsKKworCWlmIChpYXAtPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CisJCWJtdmFsMCB8PSBGQVRUUjRfV09SRDBfU0laRTsKKwkJV1JJVEU2NChpYXAtPmlhX3NpemUpOworCX0KKwlpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgeworCQlibXZhbDEgfD0gRkFUVFI0X1dPUkQxX01PREU7CisJCVdSSVRFMzIoaWFwLT5pYV9tb2RlKTsKKwl9CisJaWYgKGlhcC0+aWFfdmFsaWQgJiBBVFRSX1VJRCkgeworCQlibXZhbDEgfD0gRkFUVFI0X1dPUkQxX09XTkVSOworCQlXUklURTMyKG93bmVyX25hbWVsZW4pOworCQlXUklURU1FTShvd25lcl9uYW1lLCBvd25lcl9uYW1lbGVuKTsKKwl9CisJaWYgKGlhcC0+aWFfdmFsaWQgJiBBVFRSX0dJRCkgeworCQlibXZhbDEgfD0gRkFUVFI0X1dPUkQxX09XTkVSX0dST1VQOworCQlXUklURTMyKG93bmVyX2dyb3VwbGVuKTsKKwkJV1JJVEVNRU0ob3duZXJfZ3JvdXAsIG93bmVyX2dyb3VwbGVuKTsKKwl9CisJaWYgKGlhcC0+aWFfdmFsaWQgJiBBVFRSX0FUSU1FX1NFVCkgeworCQlibXZhbDEgfD0gRkFUVFI0X1dPUkQxX1RJTUVfQUNDRVNTX1NFVDsKKwkJV1JJVEUzMihORlM0X1NFVF9UT19DTElFTlRfVElNRSk7CisJCVdSSVRFMzIoMCk7CisJCVdSSVRFMzIoaWFwLT5pYV9tdGltZS50dl9zZWMpOworCQlXUklURTMyKGlhcC0+aWFfbXRpbWUudHZfbnNlYyk7CisJfQorCWVsc2UgaWYgKGlhcC0+aWFfdmFsaWQgJiBBVFRSX0FUSU1FKSB7CisJCWJtdmFsMSB8PSBGQVRUUjRfV09SRDFfVElNRV9BQ0NFU1NfU0VUOworCQlXUklURTMyKE5GUzRfU0VUX1RPX1NFUlZFUl9USU1FKTsKKwl9CisJaWYgKGlhcC0+aWFfdmFsaWQgJiBBVFRSX01USU1FX1NFVCkgeworCQlibXZhbDEgfD0gRkFUVFI0X1dPUkQxX1RJTUVfTU9ESUZZX1NFVDsKKwkJV1JJVEUzMihORlM0X1NFVF9UT19DTElFTlRfVElNRSk7CisJCVdSSVRFMzIoMCk7CisJCVdSSVRFMzIoaWFwLT5pYV9tdGltZS50dl9zZWMpOworCQlXUklURTMyKGlhcC0+aWFfbXRpbWUudHZfbnNlYyk7CisJfQorCWVsc2UgaWYgKGlhcC0+aWFfdmFsaWQgJiBBVFRSX01USU1FKSB7CisJCWJtdmFsMSB8PSBGQVRUUjRfV09SRDFfVElNRV9NT0RJRllfU0VUOworCQlXUklURTMyKE5GUzRfU0VUX1RPX1NFUlZFUl9USU1FKTsKKwl9CisJCisJLyoKKwkgKiBOb3cgd2UgYmFja2ZpbGwgdGhlIGJpdG1hcCBhbmQgdGhlIGF0dHJpYnV0ZSBidWZmZXIgbGVuZ3RoLgorCSAqLworCWlmIChsZW4gIT0gKChjaGFyICopcCAtIChjaGFyICopcSkgKyA0KSB7CisJCXByaW50ayAoImVuY29kZV9hdHRyOiBBdHRyIGxlbmd0aCBjYWxjdWxhdGlvbiBlcnJvciEgJXUgIT0gJVp1XG4iLAorCQkJCWxlbiwgKChjaGFyICopcCAtIChjaGFyICopcSkgKyA0KTsKKwkJQlVHKCk7CisJfQorCWxlbiA9IChjaGFyICopcCAtIChjaGFyICopcSAtIDEyOworCSpxKysgPSBodG9ubChibXZhbDApOworCSpxKysgPSBodG9ubChibXZhbDEpOworCSpxKysgPSBodG9ubChsZW4pOworCisJc3RhdHVzID0gMDsKKy8qIG91dDogKi8KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGVuY29kZV9hY2Nlc3Moc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdTMyIGFjY2VzcykKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoOCk7CisJV1JJVEUzMihPUF9BQ0NFU1MpOworCVdSSVRFMzIoYWNjZXNzKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfY2xvc2Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19jbG9zZWFyZ3MgKmFyZykKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoOCtzaXplb2YoYXJnLT5zdGF0ZWlkLmRhdGEpKTsKKwlXUklURTMyKE9QX0NMT1NFKTsKKwlXUklURTMyKGFyZy0+c2VxaWQpOworCVdSSVRFTUVNKGFyZy0+c3RhdGVpZC5kYXRhLCBzaXplb2YoYXJnLT5zdGF0ZWlkLmRhdGEpKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfY29tbWl0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQoreworCXVpbnQzMl90ICpwOworICAgICAgICAKKyAgICAgICAgUkVTRVJWRV9TUEFDRSgxNik7CisgICAgICAgIFdSSVRFMzIoT1BfQ09NTUlUKTsKKyAgICAgICAgV1JJVEU2NChhcmdzLT5vZmZzZXQpOworICAgICAgICBXUklURTMyKGFyZ3MtPmNvdW50KTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfY3JlYXRlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnM0X2NyZWF0ZV9hcmcgKmNyZWF0ZSkKK3sKKwl1aW50MzJfdCAqcDsKKwkKKwlSRVNFUlZFX1NQQUNFKDgpOworCVdSSVRFMzIoT1BfQ1JFQVRFKTsKKwlXUklURTMyKGNyZWF0ZS0+ZnR5cGUpOworCisJc3dpdGNoIChjcmVhdGUtPmZ0eXBlKSB7CisJY2FzZSBORjRMTks6CisJCVJFU0VSVkVfU1BBQ0UoNCArIGNyZWF0ZS0+dS5zeW1saW5rLT5sZW4pOworCQlXUklURTMyKGNyZWF0ZS0+dS5zeW1saW5rLT5sZW4pOworCQlXUklURU1FTShjcmVhdGUtPnUuc3ltbGluay0+bmFtZSwgY3JlYXRlLT51LnN5bWxpbmstPmxlbik7CisJCWJyZWFrOworCisJY2FzZSBORjRCTEs6IGNhc2UgTkY0Q0hSOgorCQlSRVNFUlZFX1NQQUNFKDgpOworCQlXUklURTMyKGNyZWF0ZS0+dS5kZXZpY2Uuc3BlY2RhdGExKTsKKwkJV1JJVEUzMihjcmVhdGUtPnUuZGV2aWNlLnNwZWNkYXRhMik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJUkVTRVJWRV9TUEFDRSg0ICsgY3JlYXRlLT5uYW1lLT5sZW4pOworCVdSSVRFMzIoY3JlYXRlLT5uYW1lLT5sZW4pOworCVdSSVRFTUVNKGNyZWF0ZS0+bmFtZS0+bmFtZSwgY3JlYXRlLT5uYW1lLT5sZW4pOworCisJcmV0dXJuIGVuY29kZV9hdHRycyh4ZHIsIGNyZWF0ZS0+YXR0cnMsIGNyZWF0ZS0+c2VydmVyKTsKK30KKworc3RhdGljIGludCBlbmNvZGVfZ2V0YXR0cl9vbmUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgYml0bWFwKQoreworICAgICAgICB1aW50MzJfdCAqcDsKKworICAgICAgICBSRVNFUlZFX1NQQUNFKDEyKTsKKyAgICAgICAgV1JJVEUzMihPUF9HRVRBVFRSKTsKKyAgICAgICAgV1JJVEUzMigxKTsKKyAgICAgICAgV1JJVEUzMihiaXRtYXApOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfZ2V0YXR0cl90d28oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgYm0wLCB1aW50MzJfdCBibTEpCit7CisgICAgICAgIHVpbnQzMl90ICpwOworCisgICAgICAgIFJFU0VSVkVfU1BBQ0UoMTYpOworICAgICAgICBXUklURTMyKE9QX0dFVEFUVFIpOworICAgICAgICBXUklURTMyKDIpOworICAgICAgICBXUklURTMyKGJtMCk7CisgICAgICAgIFdSSVRFMzIoYm0xKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2dldGZhdHRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHUzMiogYml0bWFzaykKK3sKKwlleHRlcm4gdTMyIG5mczRfZmF0dHJfYml0bWFwW107CisKKwlyZXR1cm4gZW5jb2RlX2dldGF0dHJfdHdvKHhkciwKKwkJCWJpdG1hc2tbMF0gJiBuZnM0X2ZhdHRyX2JpdG1hcFswXSwKKwkJCWJpdG1hc2tbMV0gJiBuZnM0X2ZhdHRyX2JpdG1hcFsxXSk7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2ZzaW5mbyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCB1MzIqIGJpdG1hc2spCit7CisJZXh0ZXJuIHUzMiBuZnM0X2ZzaW5mb19iaXRtYXBbXTsKKworCXJldHVybiBlbmNvZGVfZ2V0YXR0cl90d28oeGRyLCBiaXRtYXNrWzBdICYgbmZzNF9mc2luZm9fYml0bWFwWzBdLAorCQkJYml0bWFza1sxXSAmIG5mczRfZnNpbmZvX2JpdG1hcFsxXSk7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2dldGZoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCit7CisJdWludDMyX3QgKnA7CisKKwlSRVNFUlZFX1NQQUNFKDQpOworCVdSSVRFMzIoT1BfR0VURkgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2xpbmsoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUpCit7CisJdWludDMyX3QgKnA7CisKKwlSRVNFUlZFX1NQQUNFKDggKyBuYW1lLT5sZW4pOworCVdSSVRFMzIoT1BfTElOSyk7CisJV1JJVEUzMihuYW1lLT5sZW4pOworCVdSSVRFTUVNKG5hbWUtPm5hbWUsIG5hbWUtPmxlbik7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBvcGNvZGUsdHlwZSxyZWNsYWltLG9mZnNldCxsZW5ndGgsbmV3X2xvY2tfb3duZXIgPSAzMgorICogb3Blbl9zZXFpZCxvcGVuX3N0YXRlaWQsbG9ja19zZXFpZCxsb2NrX293bmVyLmNsaWVudGlkLCBsb2NrX293bmVyLmlkID0gNDAKKyAqLworc3RhdGljIGludCBlbmNvZGVfbG9jayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2xvY2thcmdzICphcmcpCit7CisJdWludDMyX3QgKnA7CisJc3RydWN0IG5mc19sb2NrX29wYXJncyAqb3BhcmdzID0gYXJnLT51LmxvY2s7CisKKwlSRVNFUlZFX1NQQUNFKDMyKTsKKwlXUklURTMyKE9QX0xPQ0spOworCVdSSVRFMzIoYXJnLT50eXBlKTsgCisJV1JJVEUzMihvcGFyZ3MtPnJlY2xhaW0pOworCVdSSVRFNjQoYXJnLT5vZmZzZXQpOworCVdSSVRFNjQoYXJnLT5sZW5ndGgpOworCVdSSVRFMzIob3BhcmdzLT5uZXdfbG9ja19vd25lcik7CisJaWYgKG9wYXJncy0+bmV3X2xvY2tfb3duZXIpeworCQlzdHJ1Y3QgbmZzX29wZW5fdG9fbG9jayAqb2wgPSBvcGFyZ3MtPnUub3Blbl9sb2NrOworCisJCVJFU0VSVkVfU1BBQ0UoNDApOworCQlXUklURTMyKG9sLT5vcGVuX3NlcWlkKTsKKwkJV1JJVEVNRU0oJm9sLT5vcGVuX3N0YXRlaWQsIHNpemVvZihvbC0+b3Blbl9zdGF0ZWlkKSk7CisJCVdSSVRFMzIob2wtPmxvY2tfc2VxaWQpOworCQlXUklURTY0KG9sLT5sb2NrX293bmVyLmNsaWVudGlkKTsKKwkJV1JJVEUzMig0KTsKKwkJV1JJVEUzMihvbC0+bG9ja19vd25lci5pZCk7CisJfQorCWVsc2UgeworCQlzdHJ1Y3QgbmZzX2V4aXN0X2xvY2sgKmVsID0gb3BhcmdzLT51LmV4aXN0X2xvY2s7CisKKwkJUkVTRVJWRV9TUEFDRSgyMCk7CisJCVdSSVRFTUVNKCZlbC0+c3RhdGVpZCwgc2l6ZW9mKGVsLT5zdGF0ZWlkKSk7CisJCVdSSVRFMzIoZWwtPnNlcWlkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfbG9ja3Qoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19sb2NrYXJncyAqYXJnKQoreworCXVpbnQzMl90ICpwOworCXN0cnVjdCBuZnNfbG93bmVyICpvcGFyZ3MgPSBhcmctPnUubG9ja3Q7CisKKwlSRVNFUlZFX1NQQUNFKDQwKTsKKwlXUklURTMyKE9QX0xPQ0tUKTsKKwlXUklURTMyKGFyZy0+dHlwZSk7CisJV1JJVEU2NChhcmctPm9mZnNldCk7CisJV1JJVEU2NChhcmctPmxlbmd0aCk7CisJV1JJVEU2NChvcGFyZ3MtPmNsaWVudGlkKTsKKwlXUklURTMyKDQpOworCVdSSVRFMzIob3BhcmdzLT5pZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfbG9ja3Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19sb2NrYXJncyAqYXJnKQoreworCXVpbnQzMl90ICpwOworCXN0cnVjdCBuZnNfbG9ja3Vfb3BhcmdzICpvcGFyZ3MgPSBhcmctPnUubG9ja3U7CisKKwlSRVNFUlZFX1NQQUNFKDQ0KTsKKwlXUklURTMyKE9QX0xPQ0tVKTsKKwlXUklURTMyKGFyZy0+dHlwZSk7CisJV1JJVEUzMihvcGFyZ3MtPnNlcWlkKTsKKwlXUklURU1FTSgmb3BhcmdzLT5zdGF0ZWlkLCBzaXplb2Yob3BhcmdzLT5zdGF0ZWlkKSk7CisJV1JJVEU2NChhcmctPm9mZnNldCk7CisJV1JJVEU2NChhcmctPmxlbmd0aCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfbG9va3VwKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lKQoreworCWludCBsZW4gPSBuYW1lLT5sZW47CisJdWludDMyX3QgKnA7CisKKwlSRVNFUlZFX1NQQUNFKDggKyBsZW4pOworCVdSSVRFMzIoT1BfTE9PS1VQKTsKKwlXUklURTMyKGxlbik7CisJV1JJVEVNRU0obmFtZS0+bmFtZSwgbGVuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbmNvZGVfc2hhcmVfYWNjZXNzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGludCBvcGVuX2ZsYWdzKQoreworCXVpbnQzMl90ICpwOworCisJUkVTRVJWRV9TUEFDRSg4KTsKKwlzd2l0Y2ggKG9wZW5fZmxhZ3MgJiAoRk1PREVfUkVBRHxGTU9ERV9XUklURSkpIHsKKwkJY2FzZSBGTU9ERV9SRUFEOgorCQkJV1JJVEUzMihORlM0X1NIQVJFX0FDQ0VTU19SRUFEKTsKKwkJCWJyZWFrOworCQljYXNlIEZNT0RFX1dSSVRFOgorCQkJV1JJVEUzMihORlM0X1NIQVJFX0FDQ0VTU19XUklURSk7CisJCQlicmVhazsKKwkJY2FzZSBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFOgorCQkJV1JJVEUzMihORlM0X1NIQVJFX0FDQ0VTU19CT1RIKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJfQorCVdSSVRFMzIoMCk7CQkvKiBmb3IgbGludXgsIHNoYXJlX2RlbnkgPSAwIGFsd2F5cyAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5jb2RlX29wZW5oZHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19vcGVuYXJncyAqYXJnKQoreworCXVpbnQzMl90ICpwOworIC8qCisgKiBvcGNvZGUgNCwgc2VxaWQgNCwgc2hhcmVfYWNjZXNzIDQsIHNoYXJlX2RlbnkgNCwgY2xpZW50aWQgOCwgb3duZXJsZW4gNCwKKyAqIG93bmVyIDQgPSAzMgorICovCisJUkVTRVJWRV9TUEFDRSg4KTsKKwlXUklURTMyKE9QX09QRU4pOworCVdSSVRFMzIoYXJnLT5zZXFpZCk7CisJZW5jb2RlX3NoYXJlX2FjY2Vzcyh4ZHIsIGFyZy0+b3Blbl9mbGFncyk7CisJUkVTRVJWRV9TUEFDRSgxNik7CisJV1JJVEU2NChhcmctPmNsaWVudGlkKTsKKwlXUklURTMyKDQpOworCVdSSVRFMzIoYXJnLT5pZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmNvZGVfY3JlYXRlbW9kZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX29wZW5hcmdzICphcmcpCit7CisJdWludDMyX3QgKnA7CisKKwlSRVNFUlZFX1NQQUNFKDQpOworCXN3aXRjaChhcmctPm9wZW5fZmxhZ3MgJiBPX0VYQ0wpIHsKKwkJY2FzZSAwOgorCQkJV1JJVEUzMihORlM0X0NSRUFURV9VTkNIRUNLRUQpOworCQkJZW5jb2RlX2F0dHJzKHhkciwgYXJnLT51LmF0dHJzLCBhcmctPnNlcnZlcik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVdSSVRFMzIoTkZTNF9DUkVBVEVfRVhDTFVTSVZFKTsKKwkJCWVuY29kZV9uZnM0X3ZlcmlmaWVyKHhkciwgJmFyZy0+dS52ZXJpZmllcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmNvZGVfb3BlbnR5cGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19vcGVuYXJncyAqYXJnKQoreworCXVpbnQzMl90ICpwOworCisJUkVTRVJWRV9TUEFDRSg0KTsKKwlzd2l0Y2ggKGFyZy0+b3Blbl9mbGFncyAmIE9fQ1JFQVQpIHsKKwkJY2FzZSAwOgorCQkJV1JJVEUzMihORlM0X09QRU5fTk9DUkVBVEUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUdfT04oYXJnLT5jbGFpbSAhPSBORlM0X09QRU5fQ0xBSU1fTlVMTCk7CisJCQlXUklURTMyKE5GUzRfT1BFTl9DUkVBVEUpOworCQkJZW5jb2RlX2NyZWF0ZW1vZGUoeGRyLCBhcmcpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuY29kZV9kZWxlZ2F0aW9uX3R5cGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgaW50IGRlbGVnYXRpb25fdHlwZSkKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoNCk7CisJc3dpdGNoIChkZWxlZ2F0aW9uX3R5cGUpIHsKKwkJY2FzZSAwOgorCQkJV1JJVEUzMihORlM0X09QRU5fREVMRUdBVEVfTk9ORSk7CisJCQlicmVhazsKKwkJY2FzZSBGTU9ERV9SRUFEOgorCQkJV1JJVEUzMihORlM0X09QRU5fREVMRUdBVEVfUkVBRCk7CisJCQlicmVhazsKKwkJY2FzZSBGTU9ERV9XUklURXxGTU9ERV9SRUFEOgorCQkJV1JJVEUzMihORlM0X09QRU5fREVMRUdBVEVfV1JJVEUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmNvZGVfY2xhaW1fbnVsbChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoNCk7CisJV1JJVEUzMihORlM0X09QRU5fQ0xBSU1fTlVMTCk7CisJZW5jb2RlX3N0cmluZyh4ZHIsIG5hbWUtPmxlbiwgbmFtZS0+bmFtZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmNvZGVfY2xhaW1fcHJldmlvdXMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgaW50IHR5cGUpCit7CisJdWludDMyX3QgKnA7CisKKwlSRVNFUlZFX1NQQUNFKDQpOworCVdSSVRFMzIoTkZTNF9PUEVOX0NMQUlNX1BSRVZJT1VTKTsKKwllbmNvZGVfZGVsZWdhdGlvbl90eXBlKHhkciwgdHlwZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmNvZGVfY2xhaW1fZGVsZWdhdGVfY3VyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lLCBjb25zdCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQpCit7CisJdWludDMyX3QgKnA7CisKKwlSRVNFUlZFX1NQQUNFKDQrc2l6ZW9mKHN0YXRlaWQtPmRhdGEpKTsKKwlXUklURTMyKE5GUzRfT1BFTl9DTEFJTV9ERUxFR0FURV9DVVIpOworCVdSSVRFTUVNKHN0YXRlaWQtPmRhdGEsIHNpemVvZihzdGF0ZWlkLT5kYXRhKSk7CisJZW5jb2RlX3N0cmluZyh4ZHIsIG5hbWUtPmxlbiwgbmFtZS0+bmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX29wZW4oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19vcGVuYXJncyAqYXJnKQoreworCWVuY29kZV9vcGVuaGRyKHhkciwgYXJnKTsKKwllbmNvZGVfb3BlbnR5cGUoeGRyLCBhcmcpOworCXN3aXRjaCAoYXJnLT5jbGFpbSkgeworCQljYXNlIE5GUzRfT1BFTl9DTEFJTV9OVUxMOgorCQkJZW5jb2RlX2NsYWltX251bGwoeGRyLCBhcmctPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgTkZTNF9PUEVOX0NMQUlNX1BSRVZJT1VTOgorCQkJZW5jb2RlX2NsYWltX3ByZXZpb3VzKHhkciwgYXJnLT51LmRlbGVnYXRpb25fdHlwZSk7CisJCQlicmVhazsKKwkJY2FzZSBORlM0X09QRU5fQ0xBSU1fREVMRUdBVEVfQ1VSOgorCQkJZW5jb2RlX2NsYWltX2RlbGVnYXRlX2N1cih4ZHIsIGFyZy0+bmFtZSwgJmFyZy0+dS5kZWxlZ2F0aW9uKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9vcGVuX2NvbmZpcm0oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19vcGVuX2NvbmZpcm1hcmdzICphcmcpCit7CisJdWludDMyX3QgKnA7CisKKwlSRVNFUlZFX1NQQUNFKDgrc2l6ZW9mKGFyZy0+c3RhdGVpZC5kYXRhKSk7CisJV1JJVEUzMihPUF9PUEVOX0NPTkZJUk0pOworCVdSSVRFTUVNKGFyZy0+c3RhdGVpZC5kYXRhLCBzaXplb2YoYXJnLT5zdGF0ZWlkLmRhdGEpKTsKKwlXUklURTMyKGFyZy0+c2VxaWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX29wZW5fZG93bmdyYWRlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfY2xvc2VhcmdzICphcmcpCit7CisJdWludDMyX3QgKnA7CisKKwlSRVNFUlZFX1NQQUNFKDgrc2l6ZW9mKGFyZy0+c3RhdGVpZC5kYXRhKSk7CisJV1JJVEUzMihPUF9PUEVOX0RPV05HUkFERSk7CisJV1JJVEVNRU0oYXJnLT5zdGF0ZWlkLmRhdGEsIHNpemVvZihhcmctPnN0YXRlaWQuZGF0YSkpOworCVdSSVRFMzIoYXJnLT5zZXFpZCk7CisJZW5jb2RlX3NoYXJlX2FjY2Vzcyh4ZHIsIGFyZy0+b3Blbl9mbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2VuY29kZV9wdXRmaChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaCkKK3sKKwlpbnQgbGVuID0gZmgtPnNpemU7CisJdWludDMyX3QgKnA7CisKKwlSRVNFUlZFX1NQQUNFKDggKyBsZW4pOworCVdSSVRFMzIoT1BfUFVURkgpOworCVdSSVRFMzIobGVuKTsKKwlXUklURU1FTShmaC0+ZGF0YSwgbGVuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9wdXRyb290Zmgoc3RydWN0IHhkcl9zdHJlYW0gKnhkcikKK3sKKyAgICAgICAgdWludDMyX3QgKnA7CisgICAgICAgIAorICAgICAgICBSRVNFUlZFX1NQQUNFKDQpOworICAgICAgICBXUklURTMyKE9QX1BVVFJPT1RGSCk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVuY29kZV9zdGF0ZWlkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgpCit7CisJZXh0ZXJuIG5mczRfc3RhdGVpZCB6ZXJvX3N0YXRlaWQ7CisJbmZzNF9zdGF0ZWlkIHN0YXRlaWQ7CisJdWludDMyX3QgKnA7CisKKwlSRVNFUlZFX1NQQUNFKDE2KTsKKwlpZiAoY3R4LT5zdGF0ZSAhPSBOVUxMKSB7CisJCW5mczRfY29weV9zdGF0ZWlkKCZzdGF0ZWlkLCBjdHgtPnN0YXRlLCBjdHgtPmxvY2tvd25lcik7CisJCVdSSVRFTUVNKHN0YXRlaWQuZGF0YSwgc2l6ZW9mKHN0YXRlaWQuZGF0YSkpOworCX0gZWxzZQorCQlXUklURU1FTSh6ZXJvX3N0YXRlaWQuZGF0YSwgc2l6ZW9mKHplcm9fc3RhdGVpZC5kYXRhKSk7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX3JlYWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19yZWFkYXJncyAqYXJncykKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoNCk7CisJV1JJVEUzMihPUF9SRUFEKTsKKworCWVuY29kZV9zdGF0ZWlkKHhkciwgYXJncy0+Y29udGV4dCk7CisKKwlSRVNFUlZFX1NQQUNFKDEyKTsKKwlXUklURTY0KGFyZ3MtPm9mZnNldCk7CisJV1JJVEUzMihhcmdzLT5jb3VudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfcmVhZGRpcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzNF9yZWFkZGlyX2FyZyAqcmVhZGRpciwgc3RydWN0IHJwY19ycXN0ICpyZXEpCit7CisJc3RydWN0IHJwY19hdXRoICphdXRoID0gcmVxLT5ycV90YXNrLT50a19hdXRoOworCWludCByZXBsZW47CisJdWludDMyX3QgKnA7CisKKwlSRVNFUlZFX1NQQUNFKDMyK3NpemVvZihuZnM0X3ZlcmlmaWVyKSk7CisJV1JJVEUzMihPUF9SRUFERElSKTsKKwlXUklURTY0KHJlYWRkaXItPmNvb2tpZSk7CisJV1JJVEVNRU0ocmVhZGRpci0+dmVyaWZpZXIuZGF0YSwgc2l6ZW9mKHJlYWRkaXItPnZlcmlmaWVyLmRhdGEpKTsKKwlXUklURTMyKHJlYWRkaXItPmNvdW50ID4+IDEpOyAgLyogV2UncmUgbm90IGRvaW5nIHJlYWRkaXJwbHVzICovCisJV1JJVEUzMihyZWFkZGlyLT5jb3VudCk7CisJV1JJVEUzMigyKTsKKwlpZiAocmVhZGRpci0+Yml0bWFza1sxXSAmIEZBVFRSNF9XT1JEMV9NT1VOVEVEX09OX0ZJTEVJRCkgeworCQlXUklURTMyKDApOworCQlXUklURTMyKEZBVFRSNF9XT1JEMV9NT1VOVEVEX09OX0ZJTEVJRCk7CisJfSBlbHNlIHsKKwkJV1JJVEUzMihGQVRUUjRfV09SRDBfRklMRUlEKTsKKwkJV1JJVEUzMigwKTsKKwl9CisKKwkvKiBzZXQgdXAgcmVwbHkga3ZlYworCSAqICAgIHRvcGxldmVsX3N0YXR1cyArIHRhZ2xlbiArIHJlc2NvdW50ICsgT1BfUFVURkggKyBzdGF0dXMKKwkgKiAgICAgICsgT1BfUkVBRERJUiArIHN0YXR1cyArIHZlcmlmZXIoMikgID0gOQorCSAqLworCXJlcGxlbiA9IChSUENfUkVQSERSU0laRSArIGF1dGgtPmF1X3JzbGFjayArIDkpIDw8IDI7CisJeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCByZXBsZW4sIHJlYWRkaXItPnBhZ2VzLAorCQkJIHJlYWRkaXItPnBnYmFzZSwgcmVhZGRpci0+Y291bnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX3JlYWRsaW5rKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnM0X3JlYWRsaW5rICpyZWFkbGluaywgc3RydWN0IHJwY19ycXN0ICpyZXEpCit7CisJc3RydWN0IHJwY19hdXRoICphdXRoID0gcmVxLT5ycV90YXNrLT50a19hdXRoOworCXVuc2lnbmVkIGludCByZXBsZW47CisJdWludDMyX3QgKnA7CisKKwlSRVNFUlZFX1NQQUNFKDQpOworCVdSSVRFMzIoT1BfUkVBRExJTkspOworCisJLyogc2V0IHVwIHJlcGx5IGt2ZWMKKwkgKiAgICB0b3BsZXZlbF9zdGF0dXMgKyB0YWdsZW4gKyByZXNjb3VudCArIE9QX1BVVEZIICsgc3RhdHVzCisJICogICAgICArIE9QX1JFQURMSU5LICsgc3RhdHVzICsgc3RyaW5nIGxlbmd0aCA9IDgKKwkgKi8KKwlyZXBsZW4gPSAoUlBDX1JFUEhEUlNJWkUgKyBhdXRoLT5hdV9yc2xhY2sgKyA4KSA8PCAyOworCXhkcl9pbmxpbmVfcGFnZXMoJnJlcS0+cnFfcmN2X2J1ZiwgcmVwbGVuLCByZWFkbGluay0+cGFnZXMsCisJCQlyZWFkbGluay0+cGdiYXNlLCByZWFkbGluay0+cGdsZW4pOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9yZW1vdmUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUpCit7CisJdWludDMyX3QgKnA7CisKKwlSRVNFUlZFX1NQQUNFKDggKyBuYW1lLT5sZW4pOworCVdSSVRFMzIoT1BfUkVNT1ZFKTsKKwlXUklURTMyKG5hbWUtPmxlbik7CisJV1JJVEVNRU0obmFtZS0+bmFtZSwgbmFtZS0+bGVuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9yZW5hbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IHFzdHIgKm9sZG5hbWUsIGNvbnN0IHN0cnVjdCBxc3RyICpuZXduYW1lKQoreworCXVpbnQzMl90ICpwOworCisJUkVTRVJWRV9TUEFDRSg4ICsgb2xkbmFtZS0+bGVuKTsKKwlXUklURTMyKE9QX1JFTkFNRSk7CisJV1JJVEUzMihvbGRuYW1lLT5sZW4pOworCVdSSVRFTUVNKG9sZG5hbWUtPm5hbWUsIG9sZG5hbWUtPmxlbik7CisJCisJUkVTRVJWRV9TUEFDRSg0ICsgbmV3bmFtZS0+bGVuKTsKKwlXUklURTMyKG5ld25hbWUtPmxlbik7CisJV1JJVEVNRU0obmV3bmFtZS0+bmFtZSwgbmV3bmFtZS0+bGVuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9yZW5ldyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzNF9jbGllbnQgKmNsaWVudF9zdGF0ZWlkKQoreworCXVpbnQzMl90ICpwOworCisJUkVTRVJWRV9TUEFDRSgxMik7CisJV1JJVEUzMihPUF9SRU5FVyk7CisJV1JJVEU2NChjbGllbnRfc3RhdGVpZC0+Y2xfY2xpZW50aWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2VuY29kZV9zYXZlZmgoc3RydWN0IHhkcl9zdHJlYW0gKnhkcikKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoNCk7CisJV1JJVEUzMihPUF9TQVZFRkgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX3NldGF0dHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19zZXRhdHRyYXJncyAqYXJnLCBjb25zdCBzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKQoreworCWludCBzdGF0dXM7CisJdWludDMyX3QgKnA7CisJCisgICAgICAgIFJFU0VSVkVfU1BBQ0UoNCtzaXplb2YoYXJnLT5zdGF0ZWlkLmRhdGEpKTsKKyAgICAgICAgV1JJVEUzMihPUF9TRVRBVFRSKTsKKwlXUklURU1FTShhcmctPnN0YXRlaWQuZGF0YSwgc2l6ZW9mKGFyZy0+c3RhdGVpZC5kYXRhKSk7CisKKyAgICAgICAgaWYgKChzdGF0dXMgPSBlbmNvZGVfYXR0cnMoeGRyLCBhcmctPmlhcCwgc2VydmVyKSkpCisJCXJldHVybiBzdGF0dXM7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX3NldGNsaWVudGlkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnM0X3NldGNsaWVudGlkICpzZXRjbGllbnRpZCkKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoNCArIHNpemVvZihzZXRjbGllbnRpZC0+c2NfdmVyaWZpZXItPmRhdGEpKTsKKwlXUklURTMyKE9QX1NFVENMSUVOVElEKTsKKwlXUklURU1FTShzZXRjbGllbnRpZC0+c2NfdmVyaWZpZXItPmRhdGEsIHNpemVvZihzZXRjbGllbnRpZC0+c2NfdmVyaWZpZXItPmRhdGEpKTsKKworCWVuY29kZV9zdHJpbmcoeGRyLCBzZXRjbGllbnRpZC0+c2NfbmFtZV9sZW4sIHNldGNsaWVudGlkLT5zY19uYW1lKTsKKwlSRVNFUlZFX1NQQUNFKDQpOworCVdSSVRFMzIoc2V0Y2xpZW50aWQtPnNjX3Byb2cpOworCWVuY29kZV9zdHJpbmcoeGRyLCBzZXRjbGllbnRpZC0+c2NfbmV0aWRfbGVuLCBzZXRjbGllbnRpZC0+c2NfbmV0aWQpOworCWVuY29kZV9zdHJpbmcoeGRyLCBzZXRjbGllbnRpZC0+c2NfdWFkZHJfbGVuLCBzZXRjbGllbnRpZC0+c2NfdWFkZHIpOworCVJFU0VSVkVfU1BBQ0UoNCk7CisJV1JJVEUzMihzZXRjbGllbnRpZC0+c2NfY2JfaWRlbnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX3NldGNsaWVudGlkX2NvbmZpcm0oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mczRfY2xpZW50ICpjbGllbnRfc3RhdGUpCit7CisgICAgICAgIHVpbnQzMl90ICpwOworCisgICAgICAgIFJFU0VSVkVfU1BBQ0UoMTIgKyBzaXplb2YoY2xpZW50X3N0YXRlLT5jbF9jb25maXJtLmRhdGEpKTsKKyAgICAgICAgV1JJVEUzMihPUF9TRVRDTElFTlRJRF9DT05GSVJNKTsKKyAgICAgICAgV1JJVEU2NChjbGllbnRfc3RhdGUtPmNsX2NsaWVudGlkKTsKKyAgICAgICAgV1JJVEVNRU0oY2xpZW50X3N0YXRlLT5jbF9jb25maXJtLmRhdGEsIHNpemVvZihjbGllbnRfc3RhdGUtPmNsX2NvbmZpcm0uZGF0YSkpOworCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV93cml0ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoNCk7CisJV1JJVEUzMihPUF9XUklURSk7CisKKwllbmNvZGVfc3RhdGVpZCh4ZHIsIGFyZ3MtPmNvbnRleHQpOworCisJUkVTRVJWRV9TUEFDRSgxNik7CisJV1JJVEU2NChhcmdzLT5vZmZzZXQpOworCVdSSVRFMzIoYXJncy0+c3RhYmxlKTsKKwlXUklURTMyKGFyZ3MtPmNvdW50KTsKKworCXhkcl93cml0ZV9wYWdlcyh4ZHIsIGFyZ3MtPnBhZ2VzLCBhcmdzLT5wZ2Jhc2UsIGFyZ3MtPmNvdW50KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9kZWxlZ3JldHVybihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQpCit7CisJdWludDMyX3QgKnA7CisKKwlSRVNFUlZFX1NQQUNFKDIwKTsKKworCVdSSVRFMzIoT1BfREVMRUdSRVRVUk4pOworCVdSSVRFTUVNKHN0YXRlaWQtPmRhdGEsIHNpemVvZihzdGF0ZWlkLT5kYXRhKSk7CisJcmV0dXJuIDA7CisKK30KKy8qCisgKiBFTkQgT0YgIkdFTkVSSUMiIEVOQ09ERSBST1VUSU5FUy4KKyAqLworCisvKgorICogRW5jb2RlIGFuIEFDQ0VTUyByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2FjY2VzcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2FjY2Vzc2FyZ3MgKmFyZ3MpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0geworCQkubm9wcyA9IDIsCisJfTsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKChzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgpKSA9PSAwKQorCQlzdGF0dXMgPSBlbmNvZGVfYWNjZXNzKCZ4ZHIsIGFyZ3MtPmFjY2Vzcyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEVuY29kZSBMT09LVVAgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19sb29rdXAoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9sb29rdXBfYXJnICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgPSA0LAorCX07CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmICgoc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmRpcl9maCkpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZW5jb2RlX2xvb2t1cCgmeGRyLCBhcmdzLT5uYW1lKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXMgPSBlbmNvZGVfZ2V0ZmgoJnhkcikpICE9IDApCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRW5jb2RlIExPT0tVUF9ST09UIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfbG9va3VwX3Jvb3Qoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9sb29rdXBfcm9vdF9hcmcgKmFyZ3MpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0geworCQkubm9wcyA9IDMsCisJfTsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKChzdGF0dXMgPSBlbmNvZGVfcHV0cm9vdGZoKCZ4ZHIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGVuY29kZV9nZXRmaCgmeGRyKSkgPT0gMCkKKwkJc3RhdHVzID0gZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2spOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBFbmNvZGUgUkVNT1ZFIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcmVtb3ZlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgY29uc3Qgc3RydWN0IG5mczRfcmVtb3ZlX2FyZyAqYXJncykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CisJCS5ub3BzID0gMiwKKwl9OworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlpZiAoKHN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCkpID09IDApCisJCXN0YXR1cyA9IGVuY29kZV9yZW1vdmUoJnhkciwgYXJncy0+bmFtZSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEVuY29kZSBSRU5BTUUgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19yZW5hbWUoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9yZW5hbWVfYXJnICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgPSA0LAorCX07CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmICgoc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPm9sZF9kaXIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGVuY29kZV9zYXZlZmgoJnhkcikpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPm5ld19kaXIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBlbmNvZGVfcmVuYW1lKCZ4ZHIsIGFyZ3MtPm9sZF9uYW1lLCBhcmdzLT5uZXdfbmFtZSk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEVuY29kZSBMSU5LIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfbGluayhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2xpbmtfYXJnICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgPSA0LAorCX07CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmICgoc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXMgPSBlbmNvZGVfc2F2ZWZoKCZ4ZHIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5kaXJfZmgpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBlbmNvZGVfbGluaygmeGRyLCBhcmdzLT5uYW1lKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRW5jb2RlIENSRUFURSByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2NyZWF0ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2NyZWF0ZV9hcmcgKmFyZ3MpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0geworCQkubm9wcyA9IDQsCisJfTsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKChzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZGlyX2ZoKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXMgPSBlbmNvZGVfY3JlYXRlKCZ4ZHIsIGFyZ3MpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGVuY29kZV9nZXRmaCgmeGRyKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2spOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBFbmNvZGUgU1lNTElOSyByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3N5bWxpbmsoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9jcmVhdGVfYXJnICphcmdzKQoreworCXJldHVybiBuZnM0X3hkcl9lbmNfY3JlYXRlKHJlcSwgcCwgYXJncyk7Cit9CisKKy8qCisgKiBFbmNvZGUgR0VUQVRUUiByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2dldGF0dHIoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9nZXRhdHRyX2FyZyAqYXJncykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CisJCS5ub3BzID0gMiwKKwl9OworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlpZiAoKHN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCkpID09IDApCisJCXN0YXR1cyA9IGVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRW5jb2RlIGEgQ0xPU0UgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19jbG9zZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfY2xvc2VhcmdzICphcmdzKQoreworICAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisgICAgICAgIHN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0geworICAgICAgICAgICAgICAgIC5ub3BzICAgPSAyLAorICAgICAgICB9OworICAgICAgICBpbnQgc3RhdHVzOworCisgICAgICAgIHhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKyAgICAgICAgZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKyAgICAgICAgc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKKyAgICAgICAgaWYoc3RhdHVzKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICBzdGF0dXMgPSBlbmNvZGVfY2xvc2UoJnhkciwgYXJncyk7CitvdXQ6CisgICAgICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBFbmNvZGUgYW4gT1BFTiByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX29wZW4oc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX29wZW5hcmdzICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgPSA0LAorCX07CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZW5jb2RlX29wZW4oJnhkciwgYXJncyk7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZW5jb2RlX2dldGZoKCZ4ZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRW5jb2RlIGFuIE9QRU5fQ09ORklSTSByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX29wZW5fY29uZmlybShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfb3Blbl9jb25maXJtYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CisJCS5ub3BzICAgPSAyLAorCX07CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7CisJaWYoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBlbmNvZGVfb3Blbl9jb25maXJtKCZ4ZHIsIGFyZ3MpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBFbmNvZGUgYW4gT1BFTiByZXF1ZXN0IHdpdGggbm8gYXR0cmlidXRlcy4KKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfb3Blbl9ub2F0dHIoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX29wZW5hcmdzICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgICA9IDIsCisJfTsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBlbmNvZGVfb3BlbigmeGRyLCBhcmdzKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRW5jb2RlIGFuIE9QRU5fRE9XTkdSQURFIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfb3Blbl9kb3duZ3JhZGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX2Nsb3NlYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CisJCS5ub3BzCT0gMiwKKwl9OworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGVuY29kZV9vcGVuX2Rvd25ncmFkZSgmeGRyLCBhcmdzKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRW5jb2RlIGEgTE9DSyByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xvY2soc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX2xvY2thcmdzICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgICA9IDIsCisJfTsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKKwlpZihzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGVuY29kZV9sb2NrKCZ4ZHIsIGFyZ3MpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBFbmNvZGUgYSBMT0NLVCByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xvY2t0KHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19sb2NrYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CisJCS5ub3BzICAgPSAyLAorCX07CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7CisJaWYoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBlbmNvZGVfbG9ja3QoJnhkciwgYXJncyk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEVuY29kZSBhIExPQ0tVIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfbG9ja3Uoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX2xvY2thcmdzICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgICA9IDIsCisJfTsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKKwlpZihzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGVuY29kZV9sb2NrdSgmeGRyLCBhcmdzKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRW5jb2RlIGEgUkVBRExJTksgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19yZWFkbGluayhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X3JlYWRsaW5rICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgPSAyLAorCX07CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7CisJaWYoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBlbmNvZGVfcmVhZGxpbmsoJnhkciwgYXJncywgcmVxKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRW5jb2RlIGEgUkVBRERJUiByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlYWRkaXIoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9yZWFkZGlyX2FyZyAqYXJncykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CisJCS5ub3BzID0gMiwKKwl9OworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgpOworCWlmKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZW5jb2RlX3JlYWRkaXIoJnhkciwgYXJncywgcmVxKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRW5jb2RlIGEgUkVBRCByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlYWQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX3JlYWRhcmdzICphcmdzKQoreworCXN0cnVjdCBycGNfYXV0aAkqYXV0aCA9IHJlcS0+cnFfdGFzay0+dGtfYXV0aDsKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CisJCS5ub3BzID0gMiwKKwl9OworCWludCByZXBsZW4sIHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZW5jb2RlX3JlYWQoJnhkciwgYXJncyk7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisKKwkvKiBzZXQgdXAgcmVwbHkga3ZlYworCSAqICAgIHRvcGxldmVsIHN0YXR1cyArIHRhZ2xlbj0wICsgcmVzY291bnQgKyBPUF9QVVRGSCArIHN0YXR1cworCSAqICAgICAgICsgT1BfUkVBRCArIHN0YXR1cyArIGVvZiArIGRhdGFsZW4gPSA5CisJICovCisJcmVwbGVuID0gKFJQQ19SRVBIRFJTSVpFICsgYXV0aC0+YXVfcnNsYWNrICsgTkZTNF9kZWNfcmVhZF9zeikgPDwgMjsKKwl4ZHJfaW5saW5lX3BhZ2VzKCZyZXEtPnJxX3Jjdl9idWYsIHJlcGxlbiwKKwkJCSBhcmdzLT5wYWdlcywgYXJncy0+cGdiYXNlLCBhcmdzLT5jb3VudCk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEVuY29kZSBhbiBTRVRBVFRSIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc2V0YXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfc2V0YXR0cmFyZ3MgKmFyZ3MpCisKK3sKKyAgICAgICAgc3RydWN0IHhkcl9zdHJlYW0geGRyOworICAgICAgICBzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKyAgICAgICAgICAgICAgICAubm9wcyAgID0gMywKKyAgICAgICAgfTsKKyAgICAgICAgaW50IHN0YXR1czsKKworICAgICAgICB4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisgICAgICAgIGVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisgICAgICAgIHN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7CisgICAgICAgIGlmKHN0YXR1cykKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgc3RhdHVzID0gZW5jb2RlX3NldGF0dHIoJnhkciwgYXJncywgYXJncy0+c2VydmVyKTsKKyAgICAgICAgaWYoc3RhdHVzKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCXN0YXR1cyA9IGVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrKTsKK291dDoKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEVuY29kZSBhIFdSSVRFIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfd3JpdGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CisJCS5ub3BzID0gMiwKKwl9OworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGVuY29kZV93cml0ZSgmeGRyLCBhcmdzKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogIGEgQ09NTUlUIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfY29tbWl0KHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc193cml0ZWFyZ3MgKmFyZ3MpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0geworCQkubm9wcyA9IDIsCisJfTsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBlbmNvZGVfY29tbWl0KCZ4ZHIsIGFyZ3MpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBGU0lORk8gcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19mc2luZm8oc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9mc2luZm9fYXJnICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMJPSAyLAorCX07CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGVuY29kZV9mc2luZm8oJnhkciwgYXJncy0+Yml0bWFzayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIGEgUEFUSENPTkYgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19wYXRoY29uZihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X3BhdGhjb25mX2FyZyAqYXJncykKK3sKKwlleHRlcm4gdTMyIG5mczRfcGF0aGNvbmZfYml0bWFwWzJdOworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgPSAyLAorCX07CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGVuY29kZV9nZXRhdHRyX29uZSgmeGRyLAorCQkJCWFyZ3MtPmJpdG1hc2tbMF0gJiBuZnM0X3BhdGhjb25mX2JpdG1hcFswXSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIGEgU1RBVEZTIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc3RhdGZzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgY29uc3Qgc3RydWN0IG5mczRfc3RhdGZzX2FyZyAqYXJncykKK3sKKwlleHRlcm4gdTMyIG5mczRfc3RhdGZzX2JpdG1hcFtdOworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgPSAyLAorCX07CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7CisJaWYgKHN0YXR1cyA9PSAwKQorCQlzdGF0dXMgPSBlbmNvZGVfZ2V0YXR0cl90d28oJnhkciwKKwkJCQlhcmdzLT5iaXRtYXNrWzBdICYgbmZzNF9zdGF0ZnNfYml0bWFwWzBdLAorCQkJCWFyZ3MtPmJpdG1hc2tbMV0gJiBuZnM0X3N0YXRmc19iaXRtYXBbMV0pOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBHRVRBVFRSX0JJVE1BUCByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3NlcnZlcl9jYXBzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgY29uc3Qgc3RydWN0IG5mc19maCAqZmhhbmRsZSkKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CisJCS5ub3BzID0gMiwKKwl9OworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgZmhhbmRsZSk7CisJaWYgKHN0YXR1cyA9PSAwKQorCQlzdGF0dXMgPSBlbmNvZGVfZ2V0YXR0cl9vbmUoJnhkciwgRkFUVFI0X1dPUkQwX1NVUFBPUlRFRF9BVFRSU3wKKwkJCQlGQVRUUjRfV09SRDBfTElOS19TVVBQT1JUfAorCQkJCUZBVFRSNF9XT1JEMF9TWU1MSU5LX1NVUFBPUlR8CisJCQkJRkFUVFI0X1dPUkQwX0FDTFNVUFBPUlQpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBhIFJFTkVXIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcmVuZXcoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CisJCS5ub3BzCT0gMSwKKwl9OworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJcmV0dXJuIGVuY29kZV9yZW5ldygmeGRyLCBjbHApOworfQorCisvKgorICogYSBTRVRDTElFTlRJRCByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3NldGNsaWVudGlkKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mczRfc2V0Y2xpZW50aWQgKnNjKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMJPSAxLAorCX07CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlyZXR1cm4gZW5jb2RlX3NldGNsaWVudGlkKCZ4ZHIsIHNjKTsKK30KKworLyoKKyAqIGEgU0VUQ0xJRU5USURfQ09ORklSTSByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3NldGNsaWVudGlkX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CisJCS5ub3BzCT0gMywKKwl9OworCWNvbnN0IHUzMiBsZWFzZV9iaXRtYXBbMl0gPSB7IEZBVFRSNF9XT1JEMF9MRUFTRV9USU1FLCAwIH07CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGVuY29kZV9zZXRjbGllbnRpZF9jb25maXJtKCZ4ZHIsIGNscCk7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGVuY29kZV9wdXRyb290ZmgoJnhkcik7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGVuY29kZV9mc2luZm8oJnhkciwgbGVhc2VfYml0bWFwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogREVMRUdSRVRVUk4gcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19kZWxlZ3JldHVybihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2RlbGVncmV0dXJuYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CisJCS5ub3BzID0gMiwKKwl9OworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlpZiAoKHN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maGFuZGxlKSkgPT0gMCkKKwkJc3RhdHVzID0gZW5jb2RlX2RlbGVncmV0dXJuKCZ4ZHIsIGFyZ3MtPnN0YXRlaWQpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBTVEFSVCBPRiAiR0VORVJJQyIgREVDT0RFIFJPVVRJTkVTLgorICogICBUaGVzZSBtYXkgbG9vayBhIGxpdHRsZSB1Z2x5IHNpbmNlIHRoZXkgYXJlIGltcG9ydGVkIGZyb20gYSAiZ2VuZXJpYyIKKyAqIHNldCBvZiBYRFIgZW5jb2RlL2RlY29kZSByb3V0aW5lcyB3aGljaCBhcmUgaW50ZW5kZWQgdG8gYmUgc2hhcmVkIGJ5CisgKiBhbGwgb2Ygb3VyIE5GU3Y0IGltcGxlbWVudGF0aW9ucyAoT3BlbkJTRCwgTWFjT1MgWC4uLikuCisgKgorICogSWYgdGhlIHBhaW4gb2YgcmVhZGluZyB0aGVzZSBpcyB0b28gZ3JlYXQsIGl0IHNob3VsZCBiZSBhIHN0cmFpZ2h0Zm9yd2FyZAorICogdGFzayB0byB0cmFuc2xhdGUgdGhlbSBpbnRvIExpbnV4LXNwZWNpZmljIHZlcnNpb25zIHdoaWNoIGFyZSBtb3JlCisgKiBjb25zaXN0ZW50IHdpdGggdGhlIHN0eWxlIHVzZWQgaW4gTkZTdjIvdjMuLi4KKyAqLworI2RlZmluZSBSRUFEMzIoeCkgICAgICAgICAoeCkgPSBudG9obCgqcCsrKQorI2RlZmluZSBSRUFENjQoeCkgICAgICAgICBkbyB7CQkJXAorCSh4KSA9ICh1NjQpbnRvaGwoKnArKykgPDwgMzI7CQlcCisJKHgpIHw9IG50b2hsKCpwKyspOwkJCVwKK30gd2hpbGUgKDApCisjZGVmaW5lIFJFQURUSU1FKHgpICAgICAgIGRvIHsJCQlcCisJcCsrOwkJCQkJXAorCSh4LnR2X3NlYykgPSBudG9obCgqcCsrKTsJCVwKKwkoeC50dl9uc2VjKSA9IG50b2hsKCpwKyspOwkJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgQ09QWU1FTSh4LG5ieXRlcykgZG8gewkJCVwKKwltZW1jcHkoKHgpLCBwLCBuYnl0ZXMpOwkJCVwKKwlwICs9IFhEUl9RVUFETEVOKG5ieXRlcyk7CQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFJFQURfQlVGKG5ieXRlcykgIGRvIHsgXAorCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIG5ieXRlcyk7IFwKKwlpZiAoIXApIHsgXAorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmVwbHkgYnVmZmVyIG92ZXJmbG93ZWQgaW4gbGluZSAlZC4iLCBcCisJCQkgICAgICAgCV9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBcCisJCXJldHVybiAtRUlPOyBcCisJfSBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgaW50IGRlY29kZV9vcGFxdWVfaW5saW5lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpsZW4sIGNoYXIgKipzdHJpbmcpCit7CisJdWludDMyX3QgKnA7CisKKwlSRUFEX0JVRig0KTsKKwlSRUFEMzIoKmxlbik7CisJUkVBRF9CVUYoKmxlbik7CisJKnN0cmluZyA9IChjaGFyICopcDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfY29tcG91bmRfaGRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBjb21wb3VuZF9oZHIgKmhkcikKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFQURfQlVGKDgpOworCVJFQUQzMihoZHItPnN0YXR1cyk7CisJUkVBRDMyKGhkci0+dGFnbGVuKTsKKwkKKwlSRUFEX0JVRihoZHItPnRhZ2xlbiArIDQpOworCWhkci0+dGFnID0gKGNoYXIgKilwOworCXAgKz0gWERSX1FVQURMRU4oaGRyLT50YWdsZW4pOworCVJFQUQzMihoZHItPm5vcHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9vcF9oZHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgZW51bSBuZnNfb3BudW00IGV4cGVjdGVkKQoreworCXVpbnQzMl90ICpwOworCXVpbnQzMl90IG9wbnVtOworCWludDMyX3QgbmZzZXJyOworCisJUkVBRF9CVUYoOCk7CisJUkVBRDMyKG9wbnVtKTsKKwlpZiAob3BudW0gIT0gZXhwZWN0ZWQpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFCisJCQkJIm5mczRfZGVjb2RlX29wX2hkcjogU2VydmVyIHJldHVybmVkIG9wZXJhdGlvbiIKKwkJCSAgICAgICAJIiAlZCBidXQgd2UgaXNzdWVkIGEgcmVxdWVzdCBmb3IgJWRcbiIsCisJCQkJb3BudW0sIGV4cGVjdGVkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCVJFQUQzMihuZnNlcnIpOworCWlmIChuZnNlcnIgIT0gTkZTX09LKQorCQlyZXR1cm4gLW5mc19zdGF0X3RvX2Vycm5vKG5mc2Vycik7CisJcmV0dXJuIDA7Cit9CisKKy8qIER1bW15IHJvdXRpbmUgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX2FjZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB2b2lkICphY2UsIHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCXVpbnQzMl90ICpwOworCXVpbnQzMl90IHN0cmxlbjsKKwljaGFyICpzdHI7CisKKwlSRUFEX0JVRigxMik7CisJcmV0dXJuIGRlY29kZV9vcGFxdWVfaW5saW5lKHhkciwgJnN0cmxlbiwgJnN0cik7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfYml0bWFwKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXApCit7CisJdWludDMyX3QgYm1sZW4sICpwOworCisJUkVBRF9CVUYoNCk7CisJUkVBRDMyKGJtbGVuKTsKKworCWJpdG1hcFswXSA9IGJpdG1hcFsxXSA9IDA7CisJUkVBRF9CVUYoKGJtbGVuIDw8IDIpKTsKKwlpZiAoYm1sZW4gPiAwKSB7CisJCVJFQUQzMihiaXRtYXBbMF0pOworCQlpZiAoYm1sZW4gPiAxKQorCQkJUkVBRDMyKGJpdG1hcFsxXSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkZWNvZGVfYXR0cl9sZW5ndGgoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmF0dHJsZW4sIHVpbnQzMl90ICoqc2F2ZXApCit7CisJdWludDMyX3QgKnA7CisKKwlSRUFEX0JVRig0KTsKKwlSRUFEMzIoKmF0dHJsZW4pOworCSpzYXZlcCA9IHhkci0+cDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9zdXBwb3J0ZWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDMyX3QgKmJpdG1hc2spCit7CisJaWYgKGxpa2VseShiaXRtYXBbMF0gJiBGQVRUUjRfV09SRDBfU1VQUE9SVEVEX0FUVFJTKSkgeworCQlkZWNvZGVfYXR0cl9iaXRtYXAoeGRyLCBiaXRtYXNrKTsKKwkJYml0bWFwWzBdICY9IH5GQVRUUjRfV09SRDBfU1VQUE9SVEVEX0FUVFJTOworCX0gZWxzZQorCQliaXRtYXNrWzBdID0gYml0bWFza1sxXSA9IDA7CisJZHByaW50aygiJXM6IGJpdG1hc2s9MHgleCV4XG4iLCBfX0ZVTkNUSU9OX18sIGJpdG1hc2tbMF0sIGJpdG1hc2tbMV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX3R5cGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDMyX3QgKnR5cGUpCit7CisJdWludDMyX3QgKnA7CisKKwkqdHlwZSA9IDA7CisJaWYgKHVubGlrZWx5KGJpdG1hcFswXSAmIChGQVRUUjRfV09SRDBfVFlQRSAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzBdICYgRkFUVFI0X1dPUkQwX1RZUEUpKSB7CisJCVJFQURfQlVGKDQpOworCQlSRUFEMzIoKnR5cGUpOworCQlpZiAoKnR5cGUgPCBORjRSRUcgfHwgKnR5cGUgPiBORjROQU1FREFUVFIpIHsKKwkJCWRwcmludGsoIiVzOiBiYWQgdHlwZSAlZFxuIiwgX19GVU5DVElPTl9fLCAqdHlwZSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQliaXRtYXBbMF0gJj0gfkZBVFRSNF9XT1JEMF9UWVBFOworCX0KKwlkcHJpbnRrKCIlczogdHlwZT0wJW9cbiIsIF9fRlVOQ1RJT05fXywgbmZzX3R5cGUyZm10Wyp0eXBlXS5uZnMydHlwZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfY2hhbmdlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQ2NF90ICpjaGFuZ2UpCit7CisJdWludDMyX3QgKnA7CisKKwkqY2hhbmdlID0gMDsKKwlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9DSEFOR0UgLSAxVSkpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobGlrZWx5KGJpdG1hcFswXSAmIEZBVFRSNF9XT1JEMF9DSEFOR0UpKSB7CisJCVJFQURfQlVGKDgpOworCQlSRUFENjQoKmNoYW5nZSk7CisJCWJpdG1hcFswXSAmPSB+RkFUVFI0X1dPUkQwX0NIQU5HRTsKKwl9CisJZHByaW50aygiJXM6IGNoYW5nZSBhdHRyaWJ1dGU9JUx1XG4iLCBfX0ZVTkNUSU9OX18sCisJCQkodW5zaWduZWQgbG9uZyBsb25nKSpjaGFuZ2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX3NpemUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKnNpemUpCit7CisJdWludDMyX3QgKnA7CisKKwkqc2l6ZSA9IDA7CisJaWYgKHVubGlrZWx5KGJpdG1hcFswXSAmIChGQVRUUjRfV09SRDBfU0laRSAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzBdICYgRkFUVFI0X1dPUkQwX1NJWkUpKSB7CisJCVJFQURfQlVGKDgpOworCQlSRUFENjQoKnNpemUpOworCQliaXRtYXBbMF0gJj0gfkZBVFRSNF9XT1JEMF9TSVpFOworCX0KKwlkcHJpbnRrKCIlczogZmlsZSBzaXplPSVMdVxuIiwgX19GVU5DVElPTl9fLCAodW5zaWduZWQgbG9uZyBsb25nKSpzaXplKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9saW5rX3N1cHBvcnQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDMyX3QgKnJlcykKK3sKKwl1aW50MzJfdCAqcDsKKworCSpyZXMgPSAwOworCWlmICh1bmxpa2VseShiaXRtYXBbMF0gJiAoRkFUVFI0X1dPUkQwX0xJTktfU1VQUE9SVCAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzBdICYgRkFUVFI0X1dPUkQwX0xJTktfU1VQUE9SVCkpIHsKKwkJUkVBRF9CVUYoNCk7CisJCVJFQUQzMigqcmVzKTsKKwkJYml0bWFwWzBdICY9IH5GQVRUUjRfV09SRDBfTElOS19TVVBQT1JUOworCX0KKwlkcHJpbnRrKCIlczogbGluayBzdXBwb3J0PSVzXG4iLCBfX0ZVTkNUSU9OX18sICpyZXMgPT0gMCA/ICJmYWxzZSIgOiAidHJ1ZSIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX3N5bWxpbmtfc3VwcG9ydChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50MzJfdCAqcmVzKQoreworCXVpbnQzMl90ICpwOworCisJKnJlcyA9IDA7CisJaWYgKHVubGlrZWx5KGJpdG1hcFswXSAmIChGQVRUUjRfV09SRDBfU1lNTElOS19TVVBQT1JUIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMF0gJiBGQVRUUjRfV09SRDBfU1lNTElOS19TVVBQT1JUKSkgeworCQlSRUFEX0JVRig0KTsKKwkJUkVBRDMyKCpyZXMpOworCQliaXRtYXBbMF0gJj0gfkZBVFRSNF9XT1JEMF9TWU1MSU5LX1NVUFBPUlQ7CisJfQorCWRwcmludGsoIiVzOiBzeW1saW5rIHN1cHBvcnQ9JXNcbiIsIF9fRlVOQ1RJT05fXywgKnJlcyA9PSAwID8gImZhbHNlIiA6ICJ0cnVlIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfZnNpZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCBzdHJ1Y3QgbmZzNF9mc2lkICpmc2lkKQoreworCXVpbnQzMl90ICpwOworCisJZnNpZC0+bWFqb3IgPSAwOworCWZzaWQtPm1pbm9yID0gMDsKKwlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9GU0lEIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMF0gJiBGQVRUUjRfV09SRDBfRlNJRCkpIHsKKwkJUkVBRF9CVUYoMTYpOworCQlSRUFENjQoZnNpZC0+bWFqb3IpOworCQlSRUFENjQoZnNpZC0+bWlub3IpOworCQliaXRtYXBbMF0gJj0gfkZBVFRSNF9XT1JEMF9GU0lEOworCX0KKwlkcHJpbnRrKCIlczogZnNpZD0oMHglTHgvMHglTHgpXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWZzaWQtPm1ham9yLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylmc2lkLT5taW5vcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfbGVhc2VfdGltZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50MzJfdCAqcmVzKQoreworCXVpbnQzMl90ICpwOworCisJKnJlcyA9IDYwOworCWlmICh1bmxpa2VseShiaXRtYXBbMF0gJiAoRkFUVFI0X1dPUkQwX0xFQVNFX1RJTUUgLSAxVSkpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobGlrZWx5KGJpdG1hcFswXSAmIEZBVFRSNF9XT1JEMF9MRUFTRV9USU1FKSkgeworCQlSRUFEX0JVRig0KTsKKwkJUkVBRDMyKCpyZXMpOworCQliaXRtYXBbMF0gJj0gfkZBVFRSNF9XT1JEMF9MRUFTRV9USU1FOworCX0KKwlkcHJpbnRrKCIlczogZmlsZSBzaXplPSV1XG4iLCBfX0ZVTkNUSU9OX18sICh1bnNpZ25lZCBpbnQpKnJlcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfYWNsc3VwcG9ydChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50MzJfdCAqcmVzKQoreworCXVpbnQzMl90ICpwOworCisJKnJlcyA9IEFDTDRfU1VQUE9SVF9BTExPV19BQ0x8QUNMNF9TVVBQT1JUX0RFTllfQUNMOworCWlmICh1bmxpa2VseShiaXRtYXBbMF0gJiAoRkFUVFI0X1dPUkQwX0FDTFNVUFBPUlQgLSAxVSkpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobGlrZWx5KGJpdG1hcFswXSAmIEZBVFRSNF9XT1JEMF9BQ0xTVVBQT1JUKSkgeworCQlSRUFEX0JVRig0KTsKKwkJUkVBRDMyKCpyZXMpOworCQliaXRtYXBbMF0gJj0gfkZBVFRSNF9XT1JEMF9BQ0xTVVBQT1JUOworCX0KKwlkcHJpbnRrKCIlczogQUNMcyBzdXBwb3J0ZWQ9JXVcbiIsIF9fRlVOQ1RJT05fXywgKHVuc2lnbmVkIGludCkqcmVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9maWxlaWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKmZpbGVpZCkKK3sKKwl1aW50MzJfdCAqcDsKKworCSpmaWxlaWQgPSAwOworCWlmICh1bmxpa2VseShiaXRtYXBbMF0gJiAoRkFUVFI0X1dPUkQwX0ZJTEVJRCAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzBdICYgRkFUVFI0X1dPUkQwX0ZJTEVJRCkpIHsKKwkJUkVBRF9CVUYoOCk7CisJCVJFQUQ2NCgqZmlsZWlkKTsKKwkJYml0bWFwWzBdICY9IH5GQVRUUjRfV09SRDBfRklMRUlEOworCX0KKwlkcHJpbnRrKCIlczogZmlsZWlkPSVMdVxuIiwgX19GVU5DVElPTl9fLCAodW5zaWduZWQgbG9uZyBsb25nKSpmaWxlaWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX2ZpbGVzX2F2YWlsKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQ2NF90ICpyZXMpCit7CisJdWludDMyX3QgKnA7CisJaW50IHN0YXR1cyA9IDA7CisKKwkqcmVzID0gMDsKKwlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9GSUxFU19BVkFJTCAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzBdICYgRkFUVFI0X1dPUkQwX0ZJTEVTX0FWQUlMKSkgeworCQlSRUFEX0JVRig4KTsKKwkJUkVBRDY0KCpyZXMpOworCQliaXRtYXBbMF0gJj0gfkZBVFRSNF9XT1JEMF9GSUxFU19BVkFJTDsKKwl9CisJZHByaW50aygiJXM6IGZpbGVzIGF2YWlsPSVMdVxuIiwgX19GVU5DVElPTl9fLCAodW5zaWduZWQgbG9uZyBsb25nKSpyZXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfZmlsZXNfZnJlZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50NjRfdCAqcmVzKQoreworCXVpbnQzMl90ICpwOworCWludCBzdGF0dXMgPSAwOworCisJKnJlcyA9IDA7CisJaWYgKHVubGlrZWx5KGJpdG1hcFswXSAmIChGQVRUUjRfV09SRDBfRklMRVNfRlJFRSAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzBdICYgRkFUVFI0X1dPUkQwX0ZJTEVTX0ZSRUUpKSB7CisJCVJFQURfQlVGKDgpOworCQlSRUFENjQoKnJlcyk7CisJCWJpdG1hcFswXSAmPSB+RkFUVFI0X1dPUkQwX0ZJTEVTX0ZSRUU7CisJfQorCWRwcmludGsoIiVzOiBmaWxlcyBmcmVlPSVMdVxuIiwgX19GVU5DVElPTl9fLCAodW5zaWduZWQgbG9uZyBsb25nKSpyZXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfZmlsZXNfdG90YWwoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKnJlcykKK3sKKwl1aW50MzJfdCAqcDsKKwlpbnQgc3RhdHVzID0gMDsKKworCSpyZXMgPSAwOworCWlmICh1bmxpa2VseShiaXRtYXBbMF0gJiAoRkFUVFI0X1dPUkQwX0ZJTEVTX1RPVEFMIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMF0gJiBGQVRUUjRfV09SRDBfRklMRVNfVE9UQUwpKSB7CisJCVJFQURfQlVGKDgpOworCQlSRUFENjQoKnJlcyk7CisJCWJpdG1hcFswXSAmPSB+RkFUVFI0X1dPUkQwX0ZJTEVTX1RPVEFMOworCX0KKwlkcHJpbnRrKCIlczogZmlsZXMgdG90YWw9JUx1XG4iLCBfX0ZVTkNUSU9OX18sICh1bnNpZ25lZCBsb25nIGxvbmcpKnJlcyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9tYXhmaWxlc2l6ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50NjRfdCAqcmVzKQoreworCXVpbnQzMl90ICpwOworCWludCBzdGF0dXMgPSAwOworCisJKnJlcyA9IDA7CisJaWYgKHVubGlrZWx5KGJpdG1hcFswXSAmIChGQVRUUjRfV09SRDBfTUFYRklMRVNJWkUgLSAxVSkpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobGlrZWx5KGJpdG1hcFswXSAmIEZBVFRSNF9XT1JEMF9NQVhGSUxFU0laRSkpIHsKKwkJUkVBRF9CVUYoOCk7CisJCVJFQUQ2NCgqcmVzKTsKKwkJYml0bWFwWzBdICY9IH5GQVRUUjRfV09SRDBfTUFYRklMRVNJWkU7CisJfQorCWRwcmludGsoIiVzOiBtYXhmaWxlc2l6ZT0lTHVcbiIsIF9fRlVOQ1RJT05fXywgKHVuc2lnbmVkIGxvbmcgbG9uZykqcmVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX21heGxpbmsoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDMyX3QgKm1heGxpbmspCit7CisJdWludDMyX3QgKnA7CisJaW50IHN0YXR1cyA9IDA7CisKKwkqbWF4bGluayA9IDE7CisJaWYgKHVubGlrZWx5KGJpdG1hcFswXSAmIChGQVRUUjRfV09SRDBfTUFYTElOSyAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzBdICYgRkFUVFI0X1dPUkQwX01BWExJTkspKSB7CisJCVJFQURfQlVGKDQpOworCQlSRUFEMzIoKm1heGxpbmspOworCQliaXRtYXBbMF0gJj0gfkZBVFRSNF9XT1JEMF9NQVhMSU5LOworCX0KKwlkcHJpbnRrKCIlczogbWF4bGluaz0ldVxuIiwgX19GVU5DVElPTl9fLCAqbWF4bGluayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9tYXhuYW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQzMl90ICptYXhuYW1lKQoreworCXVpbnQzMl90ICpwOworCWludCBzdGF0dXMgPSAwOworCisJKm1heG5hbWUgPSAxMDI0OworCWlmICh1bmxpa2VseShiaXRtYXBbMF0gJiAoRkFUVFI0X1dPUkQwX01BWE5BTUUgLSAxVSkpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobGlrZWx5KGJpdG1hcFswXSAmIEZBVFRSNF9XT1JEMF9NQVhOQU1FKSkgeworCQlSRUFEX0JVRig0KTsKKwkJUkVBRDMyKCptYXhuYW1lKTsKKwkJYml0bWFwWzBdICY9IH5GQVRUUjRfV09SRDBfTUFYTkFNRTsKKwl9CisJZHByaW50aygiJXM6IG1heG5hbWU9JXVcbiIsIF9fRlVOQ1RJT05fXywgKm1heG5hbWUpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfbWF4cmVhZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50MzJfdCAqcmVzKQoreworCXVpbnQzMl90ICpwOworCWludCBzdGF0dXMgPSAwOworCisJKnJlcyA9IDEwMjQ7CisJaWYgKHVubGlrZWx5KGJpdG1hcFswXSAmIChGQVRUUjRfV09SRDBfTUFYUkVBRCAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzBdICYgRkFUVFI0X1dPUkQwX01BWFJFQUQpKSB7CisJCXVpbnQ2NF90IG1heHJlYWQ7CisJCVJFQURfQlVGKDgpOworCQlSRUFENjQobWF4cmVhZCk7CisJCWlmIChtYXhyZWFkID4gMHg3RkZGRkZGRikKKwkJCW1heHJlYWQgPSAweDdGRkZGRkZGOworCQkqcmVzID0gKHVpbnQzMl90KW1heHJlYWQ7CisJCWJpdG1hcFswXSAmPSB+RkFUVFI0X1dPUkQwX01BWFJFQUQ7CisJfQorCWRwcmludGsoIiVzOiBtYXhyZWFkPSVsdVxuIiwgX19GVU5DVElPTl9fLCAodW5zaWduZWQgbG9uZykqcmVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX21heHdyaXRlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQzMl90ICpyZXMpCit7CisJdWludDMyX3QgKnA7CisJaW50IHN0YXR1cyA9IDA7CisKKwkqcmVzID0gMTAyNDsKKwlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9NQVhXUklURSAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzBdICYgRkFUVFI0X1dPUkQwX01BWFdSSVRFKSkgeworCQl1aW50NjRfdCBtYXh3cml0ZTsKKwkJUkVBRF9CVUYoOCk7CisJCVJFQUQ2NChtYXh3cml0ZSk7CisJCWlmIChtYXh3cml0ZSA+IDB4N0ZGRkZGRkYpCisJCQltYXh3cml0ZSA9IDB4N0ZGRkZGRkY7CisJCSpyZXMgPSAodWludDMyX3QpbWF4d3JpdGU7CisJCWJpdG1hcFswXSAmPSB+RkFUVFI0X1dPUkQwX01BWFdSSVRFOworCX0KKwlkcHJpbnRrKCIlczogbWF4d3JpdGU9JWx1XG4iLCBfX0ZVTkNUSU9OX18sICh1bnNpZ25lZCBsb25nKSpyZXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfbW9kZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50MzJfdCAqbW9kZSkKK3sKKwl1aW50MzJfdCAqcDsKKworCSptb2RlID0gMDsKKwlpZiAodW5saWtlbHkoYml0bWFwWzFdICYgKEZBVFRSNF9XT1JEMV9NT0RFIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMV0gJiBGQVRUUjRfV09SRDFfTU9ERSkpIHsKKwkJUkVBRF9CVUYoNCk7CisJCVJFQUQzMigqbW9kZSk7CisJCSptb2RlICY9IH5TX0lGTVQ7CisJCWJpdG1hcFsxXSAmPSB+RkFUVFI0X1dPUkQxX01PREU7CisJfQorCWRwcmludGsoIiVzOiBmaWxlIG1vZGU9MCVvXG4iLCBfX0ZVTkNUSU9OX18sICh1bnNpZ25lZCBpbnQpKm1vZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX25saW5rKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQzMl90ICpubGluaykKK3sKKwl1aW50MzJfdCAqcDsKKworCSpubGluayA9IDE7CisJaWYgKHVubGlrZWx5KGJpdG1hcFsxXSAmIChGQVRUUjRfV09SRDFfTlVNTElOS1MgLSAxVSkpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobGlrZWx5KGJpdG1hcFsxXSAmIEZBVFRSNF9XT1JEMV9OVU1MSU5LUykpIHsKKwkJUkVBRF9CVUYoNCk7CisJCVJFQUQzMigqbmxpbmspOworCQliaXRtYXBbMV0gJj0gfkZBVFRSNF9XT1JEMV9OVU1MSU5LUzsKKwl9CisJZHByaW50aygiJXM6IG5saW5rPSV1XG4iLCBfX0ZVTkNUSU9OX18sICh1bnNpZ25lZCBpbnQpKm5saW5rKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9vd25lcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCBzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCwgaW50MzJfdCAqdWlkKQoreworCXVpbnQzMl90IGxlbiwgKnA7CisKKwkqdWlkID0gLTI7CisJaWYgKHVubGlrZWx5KGJpdG1hcFsxXSAmIChGQVRUUjRfV09SRDFfT1dORVIgLSAxVSkpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobGlrZWx5KGJpdG1hcFsxXSAmIEZBVFRSNF9XT1JEMV9PV05FUikpIHsKKwkJUkVBRF9CVUYoNCk7CisJCVJFQUQzMihsZW4pOworCQlSRUFEX0JVRihsZW4pOworCQlpZiAobGVuIDwgWERSX01BWF9ORVRPQkopIHsKKwkJCWlmIChuZnNfbWFwX25hbWVfdG9fdWlkKGNscCwgKGNoYXIgKilwLCBsZW4sIHVpZCkgIT0gMCkKKwkJCQlkcHJpbnRrKCIlczogbmZzX21hcF9uYW1lX3RvX3VpZCBmYWlsZWQhXG4iLAorCQkJCQkJX19GVU5DVElPTl9fKTsKKwkJfSBlbHNlCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbmFtZSB0b28gbG9uZyAoJXUpIVxuIiwKKwkJCQkJX19GVU5DVElPTl9fLCBsZW4pOworCQliaXRtYXBbMV0gJj0gfkZBVFRSNF9XT1JEMV9PV05FUjsKKwl9CisJZHByaW50aygiJXM6IHVpZD0lZFxuIiwgX19GVU5DVElPTl9fLCAoaW50KSp1aWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX2dyb3VwKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCBpbnQzMl90ICpnaWQpCit7CisJdWludDMyX3QgbGVuLCAqcDsKKworCSpnaWQgPSAtMjsKKwlpZiAodW5saWtlbHkoYml0bWFwWzFdICYgKEZBVFRSNF9XT1JEMV9PV05FUl9HUk9VUCAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzFdICYgRkFUVFI0X1dPUkQxX09XTkVSX0dST1VQKSkgeworCQlSRUFEX0JVRig0KTsKKwkJUkVBRDMyKGxlbik7CisJCVJFQURfQlVGKGxlbik7CisJCWlmIChsZW4gPCBYRFJfTUFYX05FVE9CSikgeworCQkJaWYgKG5mc19tYXBfZ3JvdXBfdG9fZ2lkKGNscCwgKGNoYXIgKilwLCBsZW4sIGdpZCkgIT0gMCkKKwkJCQlkcHJpbnRrKCIlczogbmZzX21hcF9ncm91cF90b19naWQgZmFpbGVkIVxuIiwKKwkJCQkJCV9fRlVOQ1RJT05fXyk7CisJCX0gZWxzZQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG5hbWUgdG9vIGxvbmcgKCV1KSFcbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgbGVuKTsKKwkJYml0bWFwWzFdICY9IH5GQVRUUjRfV09SRDFfT1dORVJfR1JPVVA7CisJfQorCWRwcmludGsoIiVzOiBnaWQ9JWRcbiIsIF9fRlVOQ1RJT05fXywgKGludCkqZ2lkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9yZGV2KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIGRldl90ICpyZGV2KQoreworCXVpbnQzMl90IG1ham9yID0gMCwgbWlub3IgPSAwLCAqcDsKKworCSpyZGV2ID0gTUtERVYoMCwwKTsKKwlpZiAodW5saWtlbHkoYml0bWFwWzFdICYgKEZBVFRSNF9XT1JEMV9SQVdERVYgLSAxVSkpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobGlrZWx5KGJpdG1hcFsxXSAmIEZBVFRSNF9XT1JEMV9SQVdERVYpKSB7CisJCWRldl90IHRtcDsKKworCQlSRUFEX0JVRig4KTsKKwkJUkVBRDMyKG1ham9yKTsKKwkJUkVBRDMyKG1pbm9yKTsKKwkJdG1wID0gTUtERVYobWFqb3IsIG1pbm9yKTsKKwkJaWYgKE1BSk9SKHRtcCkgPT0gbWFqb3IgJiYgTUlOT1IodG1wKSA9PSBtaW5vcikKKwkJCSpyZGV2ID0gdG1wOworCQliaXRtYXBbMV0gJj0gfiBGQVRUUjRfV09SRDFfUkFXREVWOworCX0KKwlkcHJpbnRrKCIlczogcmRldj0oMHgleDoweCV4KVxuIiwgX19GVU5DVElPTl9fLCBtYWpvciwgbWlub3IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX3NwYWNlX2F2YWlsKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQ2NF90ICpyZXMpCit7CisJdWludDMyX3QgKnA7CisJaW50IHN0YXR1cyA9IDA7CisKKwkqcmVzID0gMDsKKwlpZiAodW5saWtlbHkoYml0bWFwWzFdICYgKEZBVFRSNF9XT1JEMV9TUEFDRV9BVkFJTCAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzFdICYgRkFUVFI0X1dPUkQxX1NQQUNFX0FWQUlMKSkgeworCQlSRUFEX0JVRig4KTsKKwkJUkVBRDY0KCpyZXMpOworCQliaXRtYXBbMV0gJj0gfkZBVFRSNF9XT1JEMV9TUEFDRV9BVkFJTDsKKwl9CisJZHByaW50aygiJXM6IHNwYWNlIGF2YWlsPSVMdVxuIiwgX19GVU5DVElPTl9fLCAodW5zaWduZWQgbG9uZyBsb25nKSpyZXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfc3BhY2VfZnJlZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50NjRfdCAqcmVzKQoreworCXVpbnQzMl90ICpwOworCWludCBzdGF0dXMgPSAwOworCisJKnJlcyA9IDA7CisJaWYgKHVubGlrZWx5KGJpdG1hcFsxXSAmIChGQVRUUjRfV09SRDFfU1BBQ0VfRlJFRSAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzFdICYgRkFUVFI0X1dPUkQxX1NQQUNFX0ZSRUUpKSB7CisJCVJFQURfQlVGKDgpOworCQlSRUFENjQoKnJlcyk7CisJCWJpdG1hcFsxXSAmPSB+RkFUVFI0X1dPUkQxX1NQQUNFX0ZSRUU7CisJfQorCWRwcmludGsoIiVzOiBzcGFjZSBmcmVlPSVMdVxuIiwgX19GVU5DVElPTl9fLCAodW5zaWduZWQgbG9uZyBsb25nKSpyZXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfc3BhY2VfdG90YWwoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKnJlcykKK3sKKwl1aW50MzJfdCAqcDsKKwlpbnQgc3RhdHVzID0gMDsKKworCSpyZXMgPSAwOworCWlmICh1bmxpa2VseShiaXRtYXBbMV0gJiAoRkFUVFI0X1dPUkQxX1NQQUNFX1RPVEFMIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMV0gJiBGQVRUUjRfV09SRDFfU1BBQ0VfVE9UQUwpKSB7CisJCVJFQURfQlVGKDgpOworCQlSRUFENjQoKnJlcyk7CisJCWJpdG1hcFsxXSAmPSB+RkFUVFI0X1dPUkQxX1NQQUNFX1RPVEFMOworCX0KKwlkcHJpbnRrKCIlczogc3BhY2UgdG90YWw9JUx1XG4iLCBfX0ZVTkNUSU9OX18sICh1bnNpZ25lZCBsb25nIGxvbmcpKnJlcyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9zcGFjZV91c2VkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQ2NF90ICp1c2VkKQoreworCXVpbnQzMl90ICpwOworCisJKnVzZWQgPSAwOworCWlmICh1bmxpa2VseShiaXRtYXBbMV0gJiAoRkFUVFI0X1dPUkQxX1NQQUNFX1VTRUQgLSAxVSkpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobGlrZWx5KGJpdG1hcFsxXSAmIEZBVFRSNF9XT1JEMV9TUEFDRV9VU0VEKSkgeworCQlSRUFEX0JVRig4KTsKKwkJUkVBRDY0KCp1c2VkKTsKKwkJYml0bWFwWzFdICY9IH5GQVRUUjRfV09SRDFfU1BBQ0VfVVNFRDsKKwl9CisJZHByaW50aygiJXM6IHNwYWNlIHVzZWQ9JUx1XG4iLCBfX0ZVTkNUSU9OX18sCisJCQkodW5zaWduZWQgbG9uZyBsb25nKSp1c2VkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl90aW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCB0aW1lc3BlYyAqdGltZSkKK3sKKwl1aW50MzJfdCAqcDsKKwl1aW50NjRfdCBzZWM7CisJdWludDMyX3QgbnNlYzsKKworCVJFQURfQlVGKDEyKTsKKwlSRUFENjQoc2VjKTsKKwlSRUFEMzIobnNlYyk7CisJdGltZS0+dHZfc2VjID0gKHRpbWVfdClzZWM7CisJdGltZS0+dHZfbnNlYyA9IChsb25nKW5zZWM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfdGltZV9hY2Nlc3Moc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgc3RydWN0IHRpbWVzcGVjICp0aW1lKQoreworCWludCBzdGF0dXMgPSAwOworCisJdGltZS0+dHZfc2VjID0gMDsKKwl0aW1lLT50dl9uc2VjID0gMDsKKwlpZiAodW5saWtlbHkoYml0bWFwWzFdICYgKEZBVFRSNF9XT1JEMV9USU1FX0FDQ0VTUyAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzFdICYgRkFUVFI0X1dPUkQxX1RJTUVfQUNDRVNTKSkgeworCQlzdGF0dXMgPSBkZWNvZGVfYXR0cl90aW1lKHhkciwgdGltZSk7CisJCWJpdG1hcFsxXSAmPSB+RkFUVFI0X1dPUkQxX1RJTUVfQUNDRVNTOworCX0KKwlkcHJpbnRrKCIlczogYXRpbWU9JWxkXG4iLCBfX0ZVTkNUSU9OX18sIChsb25nKXRpbWUtPnR2X3NlYyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl90aW1lX21ldGFkYXRhKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCXRpbWUtPnR2X3NlYyA9IDA7CisJdGltZS0+dHZfbnNlYyA9IDA7CisJaWYgKHVubGlrZWx5KGJpdG1hcFsxXSAmIChGQVRUUjRfV09SRDFfVElNRV9NRVRBREFUQSAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzFdICYgRkFUVFI0X1dPUkQxX1RJTUVfTUVUQURBVEEpKSB7CisJCXN0YXR1cyA9IGRlY29kZV9hdHRyX3RpbWUoeGRyLCB0aW1lKTsKKwkJYml0bWFwWzFdICY9IH5GQVRUUjRfV09SRDFfVElNRV9NRVRBREFUQTsKKwl9CisJZHByaW50aygiJXM6IGN0aW1lPSVsZFxuIiwgX19GVU5DVElPTl9fLCAobG9uZyl0aW1lLT50dl9zZWMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfdGltZV9tb2RpZnkoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgc3RydWN0IHRpbWVzcGVjICp0aW1lKQoreworCWludCBzdGF0dXMgPSAwOworCisJdGltZS0+dHZfc2VjID0gMDsKKwl0aW1lLT50dl9uc2VjID0gMDsKKwlpZiAodW5saWtlbHkoYml0bWFwWzFdICYgKEZBVFRSNF9XT1JEMV9USU1FX01PRElGWSAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzFdICYgRkFUVFI0X1dPUkQxX1RJTUVfTU9ESUZZKSkgeworCQlzdGF0dXMgPSBkZWNvZGVfYXR0cl90aW1lKHhkciwgdGltZSk7CisJCWJpdG1hcFsxXSAmPSB+RkFUVFI0X1dPUkQxX1RJTUVfTU9ESUZZOworCX0KKwlkcHJpbnRrKCIlczogbXRpbWU9JWxkXG4iLCBfX0ZVTkNUSU9OX18sIChsb25nKXRpbWUtPnR2X3NlYyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCB2ZXJpZnlfYXR0cl9sZW4oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKnNhdmVwLCB1aW50MzJfdCBhdHRybGVuKQoreworCXVuc2lnbmVkIGludCBhdHRyd29yZHMgPSBYRFJfUVVBRExFTihhdHRybGVuKTsKKwl1bnNpZ25lZCBpbnQgbndvcmRzID0geGRyLT5wIC0gc2F2ZXA7CisKKwlpZiAodW5saWtlbHkoYXR0cndvcmRzICE9IG53b3JkcykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNlcnZlciByZXR1cm5lZCBpbmNvcnJlY3QgYXR0cmlidXRlIGxlbmd0aDogJXUgJWMgJXVcbiIsCisJCQkJX19GVU5DVElPTl9fLAorCQkJCWF0dHJ3b3JkcyA8PCAyLAorCQkJCShhdHRyd29yZHMgPCBud29yZHMpID8gJzwnIDogJz4nLAorCQkJCW53b3JkcyA8PCAyKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9jaGFuZ2VfaW5mbyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9jaGFuZ2VfaW5mbyAqY2luZm8pCit7CisJdWludDMyX3QgKnA7CisKKwlSRUFEX0JVRigyMCk7CisJUkVBRDMyKGNpbmZvLT5hdG9taWMpOworCVJFQUQ2NChjaW5mby0+YmVmb3JlKTsKKwlSRUFENjQoY2luZm8tPmFmdGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYWNjZXNzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnM0X2FjY2Vzc3JlcyAqYWNjZXNzKQoreworCXVpbnQzMl90ICpwOworCXVpbnQzMl90IHN1cHAsIGFjYzsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0FDQ0VTUyk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKwlSRUFEX0JVRig4KTsKKwlSRUFEMzIoc3VwcCk7CisJUkVBRDMyKGFjYyk7CisJYWNjZXNzLT5zdXBwb3J0ZWQgPSBzdXBwOworCWFjY2Vzcy0+YWNjZXNzID0gYWNjOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9jbG9zZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2Nsb3NlcmVzICpyZXMpCit7CisJdWludDMyX3QgKnA7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9DTE9TRSk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKwlSRUFEX0JVRihzaXplb2YocmVzLT5zdGF0ZWlkLmRhdGEpKTsKKwlDT1BZTUVNKHJlcy0+c3RhdGVpZC5kYXRhLCBzaXplb2YocmVzLT5zdGF0ZWlkLmRhdGEpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfY29tbWl0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlcykKK3sKKwl1aW50MzJfdCAqcDsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0NPTU1JVCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKwlSRUFEX0JVRig4KTsKKwlDT1BZTUVNKHJlcy0+dmVyZi0+dmVyaWZpZXIsIDgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9jcmVhdGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mczRfY2hhbmdlX2luZm8gKmNpbmZvKQoreworCXVpbnQzMl90ICpwOworCXVpbnQzMl90IGJtbGVuOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfQ1JFQVRFKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2NoYW5nZV9pbmZvKHhkciwgY2luZm8pKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlSRUFEX0JVRig0KTsKKwlSRUFEMzIoYm1sZW4pOworCVJFQURfQlVGKGJtbGVuIDw8IDIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9zZXJ2ZXJfY2FwcyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9zZXJ2ZXJfY2Fwc19yZXMgKnJlcykKK3sKKwl1aW50MzJfdCAqc2F2ZXA7CisJdWludDMyX3QgYXR0cmxlbiwgCisJCSBiaXRtYXBbMl0gPSB7MH07CisJaW50IHN0YXR1czsKKworCWlmICgoc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0dFVEFUVFIpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX2JpdG1hcCh4ZHIsIGJpdG1hcCkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfbGVuZ3RoKHhkciwgJmF0dHJsZW4sICZzYXZlcCkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfc3VwcG9ydGVkKHhkciwgYml0bWFwLCByZXMtPmF0dHJfYml0bWFzaykpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfbGlua19zdXBwb3J0KHhkciwgYml0bWFwLCAmcmVzLT5oYXNfbGlua3MpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX3N5bWxpbmtfc3VwcG9ydCh4ZHIsIGJpdG1hcCwgJnJlcy0+aGFzX3N5bWxpbmtzKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9hY2xzdXBwb3J0KHhkciwgYml0bWFwLCAmcmVzLT5hY2xfYml0bWFzaykpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCXN0YXR1cyA9IHZlcmlmeV9hdHRyX2xlbih4ZHIsIHNhdmVwLCBhdHRybGVuKTsKK3hkcl9lcnJvcjoKKwlpZiAoc3RhdHVzICE9IDApCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHhkciBlcnJvciAlZCFcbiIsIF9fRlVOQ1RJT05fXywgLXN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKwkKK3N0YXRpYyBpbnQgZGVjb2RlX3N0YXRmcyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2Zzc3RhdCAqZnNzdGF0KQoreworCXVpbnQzMl90ICpzYXZlcDsKKwl1aW50MzJfdCBhdHRybGVuLCAKKwkJIGJpdG1hcFsyXSA9IHswfTsKKwlpbnQgc3RhdHVzOworCQorCWlmICgoc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0dFVEFUVFIpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX2JpdG1hcCh4ZHIsIGJpdG1hcCkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfbGVuZ3RoKHhkciwgJmF0dHJsZW4sICZzYXZlcCkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9maWxlc19hdmFpbCh4ZHIsIGJpdG1hcCwgJmZzc3RhdC0+YWZpbGVzKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9maWxlc19mcmVlKHhkciwgYml0bWFwLCAmZnNzdGF0LT5mZmlsZXMpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX2ZpbGVzX3RvdGFsKHhkciwgYml0bWFwLCAmZnNzdGF0LT50ZmlsZXMpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX3NwYWNlX2F2YWlsKHhkciwgYml0bWFwLCAmZnNzdGF0LT5hYnl0ZXMpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX3NwYWNlX2ZyZWUoeGRyLCBiaXRtYXAsICZmc3N0YXQtPmZieXRlcykpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfc3BhY2VfdG90YWwoeGRyLCBiaXRtYXAsICZmc3N0YXQtPnRieXRlcykpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCisJc3RhdHVzID0gdmVyaWZ5X2F0dHJfbGVuKHhkciwgc2F2ZXAsIGF0dHJsZW4pOworeGRyX2Vycm9yOgorCWlmIChzdGF0dXMgIT0gMCkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogeGRyIGVycm9yICVkIVxuIiwgX19GVU5DVElPTl9fLCAtc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGRlY29kZV9wYXRoY29uZihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX3BhdGhjb25mICpwYXRoY29uZikKK3sKKwl1aW50MzJfdCAqc2F2ZXA7CisJdWludDMyX3QgYXR0cmxlbiwgCisJCSBiaXRtYXBbMl0gPSB7MH07CisJaW50IHN0YXR1czsKKwkKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9HRVRBVFRSKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9iaXRtYXAoeGRyLCBiaXRtYXApKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX2xlbmd0aCh4ZHIsICZhdHRybGVuLCAmc2F2ZXApKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfbWF4bGluayh4ZHIsIGJpdG1hcCwgJnBhdGhjb25mLT5tYXhfbGluaykpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfbWF4bmFtZSh4ZHIsIGJpdG1hcCwgJnBhdGhjb25mLT5tYXhfbmFtZWxlbikpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCisJc3RhdHVzID0gdmVyaWZ5X2F0dHJfbGVuKHhkciwgc2F2ZXAsIGF0dHJsZW4pOworeGRyX2Vycm9yOgorCWlmIChzdGF0dXMgIT0gMCkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogeGRyIGVycm9yICVkIVxuIiwgX19GVU5DVElPTl9fLCAtc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGRlY29kZV9nZXRmYXR0cihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0ciwgY29uc3Qgc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKK3sKKwl1aW50MzJfdCAqc2F2ZXA7CisJdWludDMyX3QgYXR0cmxlbiwKKwkJIGJpdG1hcFsyXSA9IHswfSwKKwkJIHR5cGU7CisJaW50IHN0YXR1cywgZm1vZGUgPSAwOworCisJaWYgKChzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfR0VUQVRUUikpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfYml0bWFwKHhkciwgYml0bWFwKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisKKwlmYXR0ci0+Yml0bWFwWzBdID0gYml0bWFwWzBdOworCWZhdHRyLT5iaXRtYXBbMV0gPSBiaXRtYXBbMV07CisKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX2xlbmd0aCh4ZHIsICZhdHRybGVuLCAmc2F2ZXApKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKworCisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl90eXBlKHhkciwgYml0bWFwLCAmdHlwZSkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWZhdHRyLT50eXBlID0gbmZzX3R5cGUyZm10W3R5cGVdLm5mczJ0eXBlOworCWZtb2RlID0gbmZzX3R5cGUyZm10W3R5cGVdLm1vZGU7CisKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX2NoYW5nZSh4ZHIsIGJpdG1hcCwgJmZhdHRyLT5jaGFuZ2VfYXR0cikpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfc2l6ZSh4ZHIsIGJpdG1hcCwgJmZhdHRyLT5zaXplKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9mc2lkKHhkciwgYml0bWFwLCAmZmF0dHItPmZzaWRfdS5uZnM0KSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9maWxlaWQoeGRyLCBiaXRtYXAsICZmYXR0ci0+ZmlsZWlkKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9tb2RlKHhkciwgYml0bWFwLCAmZmF0dHItPm1vZGUpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlmYXR0ci0+bW9kZSB8PSBmbW9kZTsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX25saW5rKHhkciwgYml0bWFwLCAmZmF0dHItPm5saW5rKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9vd25lcih4ZHIsIGJpdG1hcCwgc2VydmVyLT5uZnM0X3N0YXRlLCAmZmF0dHItPnVpZCkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfZ3JvdXAoeGRyLCBiaXRtYXAsIHNlcnZlci0+bmZzNF9zdGF0ZSwgJmZhdHRyLT5naWQpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX3JkZXYoeGRyLCBiaXRtYXAsICZmYXR0ci0+cmRldikpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfc3BhY2VfdXNlZCh4ZHIsIGJpdG1hcCwgJmZhdHRyLT5kdS5uZnMzLnVzZWQpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX3RpbWVfYWNjZXNzKHhkciwgYml0bWFwLCAmZmF0dHItPmF0aW1lKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl90aW1lX21ldGFkYXRhKHhkciwgYml0bWFwLCAmZmF0dHItPmN0aW1lKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl90aW1lX21vZGlmeSh4ZHIsIGJpdG1hcCwgJmZhdHRyLT5tdGltZSkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gdmVyaWZ5X2F0dHJfbGVuKHhkciwgc2F2ZXAsIGF0dHJsZW4pKSA9PSAwKSB7CisJCWZhdHRyLT52YWxpZCA9IE5GU19BVFRSX0ZBVFRSIHwgTkZTX0FUVFJfRkFUVFJfVjMgfCBORlNfQVRUUl9GQVRUUl9WNDsKKwkJZmF0dHItPnRpbWVzdGFtcCA9IGppZmZpZXM7CisJfQoreGRyX2Vycm9yOgorCWlmIChzdGF0dXMgIT0gMCkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogeGRyIGVycm9yICVkIVxuIiwgX19GVU5DVElPTl9fLCAtc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZzaW5mbyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2ZzaW5mbyAqZnNpbmZvKQoreworCXVpbnQzMl90ICpzYXZlcDsKKwl1aW50MzJfdCBhdHRybGVuLCBiaXRtYXBbMl07CisJaW50IHN0YXR1czsKKworCWlmICgoc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0dFVEFUVFIpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX2JpdG1hcCh4ZHIsIGJpdG1hcCkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfbGVuZ3RoKHhkciwgJmF0dHJsZW4sICZzYXZlcCkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCisJZnNpbmZvLT5ydG11bHQgPSBmc2luZm8tPnd0bXVsdCA9IDUxMjsJLyogPz8/ICovCisKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX2xlYXNlX3RpbWUoeGRyLCBiaXRtYXAsICZmc2luZm8tPmxlYXNlX3RpbWUpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX21heGZpbGVzaXplKHhkciwgYml0bWFwLCAmZnNpbmZvLT5tYXhmaWxlc2l6ZSkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfbWF4cmVhZCh4ZHIsIGJpdG1hcCwgJmZzaW5mby0+cnRtYXgpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlmc2luZm8tPnJ0cHJlZiA9IGZzaW5mby0+ZHRwcmVmID0gZnNpbmZvLT5ydG1heDsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX21heHdyaXRlKHhkciwgYml0bWFwLCAmZnNpbmZvLT53dG1heCkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWZzaW5mby0+d3RwcmVmID0gZnNpbmZvLT53dG1heDsKKworCXN0YXR1cyA9IHZlcmlmeV9hdHRyX2xlbih4ZHIsIHNhdmVwLCBhdHRybGVuKTsKK3hkcl9lcnJvcjoKKwlpZiAoc3RhdHVzICE9IDApCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHhkciBlcnJvciAlZCFcbiIsIF9fRlVOQ1RJT05fXywgLXN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkZWNvZGVfZ2V0Zmgoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19maCAqZmgpCit7CisJdWludDMyX3QgKnA7CisJdWludDMyX3QgbGVuOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfR0VURkgpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisJLyogWmVybyBoYW5kbGUgZmlyc3QgdG8gYWxsb3cgY29tcGFyaXNvbnMgKi8KKwltZW1zZXQoZmgsIDAsIHNpemVvZigqZmgpKTsKKworCVJFQURfQlVGKDQpOworCVJFQUQzMihsZW4pOworCWlmIChsZW4gPiBORlM0X0ZIU0laRSkKKwkJcmV0dXJuIC1FSU87CisJZmgtPnNpemUgPSBsZW47CisJUkVBRF9CVUYobGVuKTsKKwlDT1BZTUVNKGZoLT5kYXRhLCBsZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9saW5rKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnM0X2NoYW5nZV9pbmZvICpjaW5mbykKK3sKKwlpbnQgc3RhdHVzOworCQorCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9MSU5LKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCXJldHVybiBkZWNvZGVfY2hhbmdlX2luZm8oeGRyLCBjaW5mbyk7Cit9CisKKy8qCisgKiBXZSBjcmVhdGUgdGhlIG93bmVyLCBzbyB3ZSBrbm93IGEgcHJvcGVyIG93bmVyLmlkIGxlbmd0aCBpcyA0LgorICovCitzdGF0aWMgaW50IGRlY29kZV9sb2NrX2RlbmllZCAoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19sb2NrX2RlbmllZCAqZGVuaWVkKQoreworCXVpbnQzMl90ICpwOworCXVpbnQzMl90IG5hbWVsZW47CisKKwlSRUFEX0JVRigzMik7CisJUkVBRDY0KGRlbmllZC0+b2Zmc2V0KTsKKwlSRUFENjQoZGVuaWVkLT5sZW5ndGgpOworCVJFQUQzMihkZW5pZWQtPnR5cGUpOworCVJFQUQ2NChkZW5pZWQtPm93bmVyLmNsaWVudGlkKTsKKwlSRUFEMzIobmFtZWxlbik7CisJUkVBRF9CVUYobmFtZWxlbik7CisJaWYgKG5hbWVsZW4gPT0gNCkKKwkJUkVBRDMyKGRlbmllZC0+b3duZXIuaWQpOworCXJldHVybiAtTkZTNEVSUl9ERU5JRUQ7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2xvY2soc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19sb2NrcmVzICpyZXMpCit7CisJdWludDMyX3QgKnA7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9MT0NLKTsKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJUkVBRF9CVUYoc2l6ZW9mKG5mczRfc3RhdGVpZCkpOworCQlDT1BZTUVNKCZyZXMtPnUuc3RhdGVpZCwgc2l6ZW9mKHJlcy0+dS5zdGF0ZWlkKSk7CisJfSBlbHNlIGlmIChzdGF0dXMgPT0gLU5GUzRFUlJfREVOSUVEKQorCQlyZXR1cm4gZGVjb2RlX2xvY2tfZGVuaWVkKHhkciwgJnJlcy0+dS5kZW5pZWQpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2xvY2t0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfbG9ja3JlcyAqcmVzKQoreworCWludCBzdGF0dXM7CisJc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0xPQ0tUKTsKKwlpZiAoc3RhdHVzID09IC1ORlM0RVJSX0RFTklFRCkKKwkJcmV0dXJuIGRlY29kZV9sb2NrX2RlbmllZCh4ZHIsICZyZXMtPnUuZGVuaWVkKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGRlY29kZV9sb2NrdShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2xvY2tyZXMgKnJlcykKK3sKKwl1aW50MzJfdCAqcDsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0xPQ0tVKTsKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJUkVBRF9CVUYoc2l6ZW9mKG5mczRfc3RhdGVpZCkpOworCQlDT1BZTUVNKCZyZXMtPnUuc3RhdGVpZCwgc2l6ZW9mKHJlcy0+dS5zdGF0ZWlkKSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2xvb2t1cChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQoreworCXJldHVybiBkZWNvZGVfb3BfaGRyKHhkciwgT1BfTE9PS1VQKTsKK30KKworLyogVGhpcyBpcyB0b28gc2ljayEgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3NwYWNlX2xpbWl0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHU2NCAqbWF4c2l6ZSkKK3sKKyAgICAgICAgdWludDMyX3QgKnA7CisJdWludDMyX3QgbGltaXRfdHlwZSwgbmJsb2NrcywgYmxvY2tzaXplOworCisJUkVBRF9CVUYoMTIpOworCVJFQUQzMihsaW1pdF90eXBlKTsKKwlzd2l0Y2ggKGxpbWl0X3R5cGUpIHsKKwkJY2FzZSAxOgorCQkJUkVBRDY0KCptYXhzaXplKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlSRUFEMzIobmJsb2Nrcyk7CisJCQlSRUFEMzIoYmxvY2tzaXplKTsKKwkJCSptYXhzaXplID0gKHVpbnQ2NF90KW5ibG9ja3MgKiAodWludDY0X3QpYmxvY2tzaXplOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfZGVsZWdhdGlvbihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX29wZW5yZXMgKnJlcykKK3sKKyAgICAgICAgdWludDMyX3QgKnA7CisgICAgICAgIHVpbnQzMl90IGRlbGVnYXRpb25fdHlwZTsKKworCVJFQURfQlVGKDQpOworCVJFQUQzMihkZWxlZ2F0aW9uX3R5cGUpOworCWlmIChkZWxlZ2F0aW9uX3R5cGUgPT0gTkZTNF9PUEVOX0RFTEVHQVRFX05PTkUpIHsKKwkJcmVzLT5kZWxlZ2F0aW9uX3R5cGUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJUkVBRF9CVUYoMjApOworCUNPUFlNRU0ocmVzLT5kZWxlZ2F0aW9uLmRhdGEsIHNpemVvZihyZXMtPmRlbGVnYXRpb24uZGF0YSkpOworCVJFQUQzMihyZXMtPmRvX3JlY2FsbCk7CisJc3dpdGNoIChkZWxlZ2F0aW9uX3R5cGUpIHsKKwkJY2FzZSBORlM0X09QRU5fREVMRUdBVEVfUkVBRDoKKwkJCXJlcy0+ZGVsZWdhdGlvbl90eXBlID0gRk1PREVfUkVBRDsKKwkJCWJyZWFrOworCQljYXNlIE5GUzRfT1BFTl9ERUxFR0FURV9XUklURToKKwkJCXJlcy0+ZGVsZWdhdGlvbl90eXBlID0gRk1PREVfV1JJVEV8Rk1PREVfUkVBRDsKKwkJCWlmIChkZWNvZGVfc3BhY2VfbGltaXQoeGRyLCAmcmVzLT5tYXhzaXplKSA8IDApCisJCQkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiBkZWNvZGVfYWNlKHhkciwgTlVMTCwgcmVzLT5zZXJ2ZXItPm5mczRfc3RhdGUpOworfQorCitzdGF0aWMgaW50IGRlY29kZV9vcGVuKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfb3BlbnJlcyAqcmVzKQoreworICAgICAgICB1aW50MzJfdCAqcDsKKyAgICAgICAgdWludDMyX3QgYm1sZW47CisgICAgICAgIGludCBzdGF0dXM7CisKKyAgICAgICAgc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX09QRU4pOworICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIFJFQURfQlVGKHNpemVvZihyZXMtPnN0YXRlaWQuZGF0YSkpOworICAgICAgICBDT1BZTUVNKHJlcy0+c3RhdGVpZC5kYXRhLCBzaXplb2YocmVzLT5zdGF0ZWlkLmRhdGEpKTsKKworICAgICAgICBkZWNvZGVfY2hhbmdlX2luZm8oeGRyLCAmcmVzLT5jaW5mbyk7CisKKyAgICAgICAgUkVBRF9CVUYoOCk7CisgICAgICAgIFJFQUQzMihyZXMtPnJmbGFncyk7CisgICAgICAgIFJFQUQzMihibWxlbik7CisgICAgICAgIGlmIChibWxlbiA+IDEwKQorICAgICAgICAgICAgICAgIGdvdG8geGRyX2Vycm9yOworCisgICAgICAgIFJFQURfQlVGKGJtbGVuIDw8IDIpOworICAgICAgICBwICs9IGJtbGVuOworCXJldHVybiBkZWNvZGVfZGVsZWdhdGlvbih4ZHIsIHJlcyk7Cit4ZHJfZXJyb3I6CisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogeGRyIGVycm9yIVxuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBkZWNvZGVfb3Blbl9jb25maXJtKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfb3Blbl9jb25maXJtcmVzICpyZXMpCit7CisgICAgICAgIHVpbnQzMl90ICpwOworCWludCBzdGF0dXM7CisKKyAgICAgICAgc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX09QRU5fQ09ORklSTSk7CisgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgUkVBRF9CVUYoc2l6ZW9mKHJlcy0+c3RhdGVpZC5kYXRhKSk7CisgICAgICAgIENPUFlNRU0ocmVzLT5zdGF0ZWlkLmRhdGEsIHNpemVvZihyZXMtPnN0YXRlaWQuZGF0YSkpOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfb3Blbl9kb3duZ3JhZGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19jbG9zZXJlcyAqcmVzKQoreworCXVpbnQzMl90ICpwOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfT1BFTl9ET1dOR1JBREUpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisJUkVBRF9CVUYoc2l6ZW9mKHJlcy0+c3RhdGVpZC5kYXRhKSk7CisJQ09QWU1FTShyZXMtPnN0YXRlaWQuZGF0YSwgc2l6ZW9mKHJlcy0+c3RhdGVpZC5kYXRhKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3B1dGZoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCit7CisJcmV0dXJuIGRlY29kZV9vcF9oZHIoeGRyLCBPUF9QVVRGSCk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3B1dHJvb3RmaChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQoreworCXJldHVybiBkZWNvZGVfb3BfaGRyKHhkciwgT1BfUFVUUk9PVEZIKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfcmVhZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IG5mc19yZWFkcmVzICpyZXMpCit7CisJc3RydWN0IGt2ZWMgKmlvdiA9IHJlcS0+cnFfcmN2X2J1Zi5oZWFkOworCXVpbnQzMl90ICpwOworCXVpbnQzMl90IGNvdW50LCBlb2YsIHJlY3ZkLCBoZHJsZW47CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9SRUFEKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCVJFQURfQlVGKDgpOworCVJFQUQzMihlb2YpOworCVJFQUQzMihjb3VudCk7CisJaGRybGVuID0gKHU4ICopIHAgLSAodTggKikgaW92LT5pb3ZfYmFzZTsKKwlyZWN2ZCA9IHJlcS0+cnFfcmN2X2J1Zi5sZW4gLSBoZHJsZW47CisJaWYgKGNvdW50ID4gcmVjdmQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBzZXJ2ZXIgY2hlYXRpbmcgaW4gcmVhZCByZXBseTogIgorCQkJCSJjb3VudCAldSA+IHJlY3ZkICV1XG4iLCBjb3VudCwgcmVjdmQpOworCQljb3VudCA9IHJlY3ZkOworCQllb2YgPSAwOworCX0KKwl4ZHJfcmVhZF9wYWdlcyh4ZHIsIGNvdW50KTsKKwlyZXMtPmVvZiA9IGVvZjsKKwlyZXMtPmNvdW50ID0gY291bnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3JlYWRkaXIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCBuZnM0X3JlYWRkaXJfcmVzICpyZWFkZGlyKQoreworCXN0cnVjdCB4ZHJfYnVmCSpyY3ZidWYgPSAmcmVxLT5ycV9yY3ZfYnVmOworCXN0cnVjdCBwYWdlCSpwYWdlID0gKnJjdmJ1Zi0+cGFnZXM7CisJc3RydWN0IGt2ZWMJKmlvdiA9IHJjdmJ1Zi0+aGVhZDsKKwl1bnNpZ25lZCBpbnQJbnIsIHBnbGVuID0gcmN2YnVmLT5wYWdlX2xlbjsKKwl1aW50MzJfdAkqZW5kLCAqZW50cnksICpwLCAqa2FkZHI7CisJdWludDMyX3QJbGVuLCBhdHRybGVuOworCWludCAJCWhkcmxlbiwgcmVjdmQsIHN0YXR1czsKKworCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9SRUFERElSKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCVJFQURfQlVGKDgpOworCUNPUFlNRU0ocmVhZGRpci0+dmVyaWZpZXIuZGF0YSwgOCk7CisKKwloZHJsZW4gPSAoY2hhciAqKSBwIC0gKGNoYXIgKikgaW92LT5pb3ZfYmFzZTsKKwlyZWN2ZCA9IHJjdmJ1Zi0+bGVuIC0gaGRybGVuOworCWlmIChwZ2xlbiA+IHJlY3ZkKQorCQlwZ2xlbiA9IHJlY3ZkOworCXhkcl9yZWFkX3BhZ2VzKHhkciwgcGdsZW4pOworCisJQlVHX09OKHBnbGVuICsgcmVhZGRpci0+cGdiYXNlID4gUEFHRV9DQUNIRV9TSVpFKTsKKwlrYWRkciA9IHAgPSAodWludDMyX3QgKikga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCWVuZCA9ICh1aW50MzJfdCAqKSAoKGNoYXIgKilwICsgcGdsZW4gKyByZWFkZGlyLT5wZ2Jhc2UpOworCWVudHJ5ID0gcDsKKwlmb3IgKG5yID0gMDsgKnArKzsgbnIrKykgeworCQlpZiAocCArIDMgPiBlbmQpCisJCQlnb3RvIHNob3J0X3BrdDsKKwkJcCArPSAyOwkJCS8qIGNvb2tpZSAqLworCQlsZW4gPSBudG9obCgqcCsrKTsJLyogZmlsZW5hbWUgbGVuZ3RoICovCisJCWlmIChsZW4gPiBORlM0X01BWE5BTUxFTikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBnaWFudCBmaWxlbmFtZSBpbiByZWFkZGlyIChsZW4gMHgleClcbiIsIGxlbik7CisJCQlnb3RvIGVycl91bm1hcDsKKwkJfQorCQlwICs9IFhEUl9RVUFETEVOKGxlbik7CisJCWlmIChwICsgMSA+IGVuZCkKKwkJCWdvdG8gc2hvcnRfcGt0OworCQlsZW4gPSBudG9obCgqcCsrKTsJLyogYml0bWFwIGxlbmd0aCAqLworCQlwICs9IGxlbjsKKwkJaWYgKHAgKyAxID4gZW5kKQorCQkJZ290byBzaG9ydF9wa3Q7CisJCWF0dHJsZW4gPSBYRFJfUVVBRExFTihudG9obCgqcCsrKSk7CisJCXAgKz0gYXR0cmxlbjsJCS8qIGF0dHJpYnV0ZXMgKi8KKwkJaWYgKHAgKyAyID4gZW5kKQorCQkJZ290byBzaG9ydF9wa3Q7CisJCWVudHJ5ID0gcDsKKwl9CisJaWYgKCFuciAmJiAoZW50cnlbMF0gIT0gMCB8fCBlbnRyeVsxXSA9PSAwKSkKKwkJZ290byBzaG9ydF9wa3Q7CitvdXQ6CQorCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwlyZXR1cm4gMDsKK3Nob3J0X3BrdDoKKwllbnRyeVswXSA9IGVudHJ5WzFdID0gMDsKKwkvKiB0cnVuY2F0ZSBsaXN0aW5nID8gKi8KKwlpZiAoIW5yKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiTkZTOiByZWFkZGlyIHJlcGx5IHRydW5jYXRlZCFcbiIpOworCQllbnRyeVsxXSA9IDE7CisJfQorCWdvdG8gb3V0OworZXJyX3VubWFwOgorCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwlyZXR1cm4gLWVycm5vX05GU0VSUl9JTzsKK30KKworc3RhdGljIGludCBkZWNvZGVfcmVhZGxpbmsoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IHJwY19ycXN0ICpyZXEpCit7CisJc3RydWN0IHhkcl9idWYgKnJjdmJ1ZiA9ICZyZXEtPnJxX3Jjdl9idWY7CisJc3RydWN0IGt2ZWMgKmlvdiA9IHJjdmJ1Zi0+aGVhZDsKKwlpbnQgaGRybGVuLCBsZW4sIHJlY3ZkOworCXVpbnQzMl90ICpwOworCWNoYXIgKmthZGRyOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfUkVBRExJTkspOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwkvKiBDb252ZXJ0IGxlbmd0aCBvZiBzeW1saW5rICovCisJUkVBRF9CVUYoNCk7CisJUkVBRDMyKGxlbik7CisJaWYgKGxlbiA+PSByY3ZidWYtPnBhZ2VfbGVuIHx8IGxlbiA8PSAwKSB7CisJCWRwcmludGsoS0VSTl9XQVJOSU5HICJuZnM6IHNlcnZlciByZXR1cm5lZCBnaWFudCBzeW1saW5rIVxuIik7CisJCXJldHVybiAtRU5BTUVUT09MT05HOworCX0KKwloZHJsZW4gPSAoY2hhciAqKSB4ZHItPnAgLSAoY2hhciAqKSBpb3YtPmlvdl9iYXNlOworCXJlY3ZkID0gcmVxLT5ycV9yY3ZfYnVmLmxlbiAtIGhkcmxlbjsKKwlpZiAocmVjdmQgPCBsZW4pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBzZXJ2ZXIgY2hlYXRpbmcgaW4gcmVhZGxpbmsgcmVwbHk6ICIKKwkJCQkiY291bnQgJXUgPiByZWN2ZCAldVxuIiwgbGVuLCByZWN2ZCk7CisJCXJldHVybiAtRUlPOworCX0KKwl4ZHJfcmVhZF9wYWdlcyh4ZHIsIGxlbik7CisJLyoKKwkgKiBUaGUgWERSIGVuY29kZSByb3V0aW5lIGhhcyBzZXQgdGhpbmdzIHVwIHNvIHRoYXQKKwkgKiB0aGUgbGluayB0ZXh0IHdpbGwgYmUgY29waWVkIGRpcmVjdGx5IGludG8gdGhlCisJICogYnVmZmVyLiAgV2UganVzdCBoYXZlIHRvIGRvIG92ZXJmbG93LWNoZWNraW5nLAorCSAqIGFuZCBhbmQgbnVsbC10ZXJtaW5hdGUgdGhlIHRleHQgKHRoZSBWRlMgZXhwZWN0cworCSAqIG51bGwtdGVybWluYXRpb24pLgorCSAqLworCWthZGRyID0gKGNoYXIgKilrbWFwX2F0b21pYyhyY3ZidWYtPnBhZ2VzWzBdLCBLTV9VU0VSMCk7CisJa2FkZHJbbGVuK3JjdmJ1Zi0+cGFnZV9iYXNlXSA9ICdcMCc7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9yZW1vdmUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mczRfY2hhbmdlX2luZm8gKmNpbmZvKQoreworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfUkVNT1ZFKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfY2hhbmdlX2luZm8oeGRyLCBjaW5mbyk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkZWNvZGVfcmVuYW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnM0X2NoYW5nZV9pbmZvICpvbGRfY2luZm8sCisJICAgICAgc3RydWN0IG5mczRfY2hhbmdlX2luZm8gKm5ld19jaW5mbykKK3sKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX1JFTkFNRSk7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfY2hhbmdlX2luZm8oeGRyLCBvbGRfY2luZm8pKSkKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX2NoYW5nZV9pbmZvKHhkciwgbmV3X2NpbmZvKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGRlY29kZV9yZW5ldyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQoreworCXJldHVybiBkZWNvZGVfb3BfaGRyKHhkciwgT1BfUkVORVcpOworfQorCitzdGF0aWMgaW50CitkZWNvZGVfc2F2ZWZoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCit7CisJcmV0dXJuIGRlY29kZV9vcF9oZHIoeGRyLCBPUF9TQVZFRkgpOworfQorCitzdGF0aWMgaW50IGRlY29kZV9zZXRhdHRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfc2V0YXR0cnJlcyAqcmVzKQoreworCXVpbnQzMl90ICpwOworCXVpbnQzMl90IGJtbGVuOworCWludCBzdGF0dXM7CisKKyAgICAgICAgCisJc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX1NFVEFUVFIpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisJUkVBRF9CVUYoNCk7CisJUkVBRDMyKGJtbGVuKTsKKwlSRUFEX0JVRihibWxlbiA8PCAyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfc2V0Y2xpZW50aWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mczRfY2xpZW50ICpjbHApCit7CisJdWludDMyX3QgKnA7CisJdWludDMyX3Qgb3BudW07CisJaW50MzJfdCBuZnNlcnI7CisKKwlSRUFEX0JVRig4KTsKKwlSRUFEMzIob3BudW0pOworCWlmIChvcG51bSAhPSBPUF9TRVRDTElFTlRJRCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCQkibmZzNF9kZWNvZGVfc2V0Y2xpZW50aWQ6IFNlcnZlciByZXR1cm5lZCBvcGVyYXRpb24iCisJCQkgICAgICAgCSIgJWRcbiIsIG9wbnVtKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCVJFQUQzMihuZnNlcnIpOworCWlmIChuZnNlcnIgPT0gTkZTX09LKSB7CisJCVJFQURfQlVGKDggKyBzaXplb2YoY2xwLT5jbF9jb25maXJtLmRhdGEpKTsKKwkJUkVBRDY0KGNscC0+Y2xfY2xpZW50aWQpOworCQlDT1BZTUVNKGNscC0+Y2xfY29uZmlybS5kYXRhLCBzaXplb2YoY2xwLT5jbF9jb25maXJtLmRhdGEpKTsKKwl9IGVsc2UgaWYgKG5mc2VyciA9PSBORlNFUlJfQ0xJRF9JTlVTRSkgeworCQl1aW50MzJfdCBsZW47CisKKwkJLyogc2tpcCBuZXRpZCBzdHJpbmcgKi8KKwkJUkVBRF9CVUYoNCk7CisJCVJFQUQzMihsZW4pOworCQlSRUFEX0JVRihsZW4pOworCisJCS8qIHNraXAgdWFkZHIgc3RyaW5nICovCisJCVJFQURfQlVGKDQpOworCQlSRUFEMzIobGVuKTsKKwkJUkVBRF9CVUYobGVuKTsKKwkJcmV0dXJuIC1ORlNFUlJfQ0xJRF9JTlVTRTsKKwl9IGVsc2UKKwkJcmV0dXJuIC1uZnNfc3RhdF90b19lcnJubyhuZnNlcnIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3NldGNsaWVudGlkX2NvbmZpcm0oc3RydWN0IHhkcl9zdHJlYW0gKnhkcikKK3sKKwlyZXR1cm4gZGVjb2RlX29wX2hkcih4ZHIsIE9QX1NFVENMSUVOVElEX0NPTkZJUk0pOworfQorCitzdGF0aWMgaW50IGRlY29kZV93cml0ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXMpCit7CisJdWludDMyX3QgKnA7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9XUklURSk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCVJFQURfQlVGKDE2KTsKKwlSRUFEMzIocmVzLT5jb3VudCk7CisJUkVBRDMyKHJlcy0+dmVyZi0+Y29tbWl0dGVkKTsKKwlDT1BZTUVNKHJlcy0+dmVyZi0+dmVyaWZpZXIsIDgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9kZWxlZ3JldHVybihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQoreworCXJldHVybiBkZWNvZGVfb3BfaGRyKHhkciwgT1BfREVMRUdSRVRVUk4pOworfQorCisvKgorICogRGVjb2RlIE9QRU5fRE9XTkdSQURFIHJlc3BvbnNlCisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX29wZW5fZG93bmdyYWRlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX2Nsb3NlcmVzICpyZXMpCit7CisgICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKyAgICAgICAgc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CisgICAgICAgIGludCBzdGF0dXM7CisKKyAgICAgICAgeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisgICAgICAgIHN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIHN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKyAgICAgICAgaWYgKHN0YXR1cykKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgc3RhdHVzID0gZGVjb2RlX29wZW5fZG93bmdyYWRlKCZ4ZHIsIHJlcyk7CitvdXQ6CisgICAgICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBFTkQgT0YgIkdFTkVSSUMiIERFQ09ERSBST1VUSU5FUy4KKyAqLworCisvKgorICogRGVjb2RlIEFDQ0VTUyByZXNwb25zZQorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19hY2Nlc3Moc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2FjY2Vzc3JlcyAqcmVzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOworCQorCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcikpID09IDApCisJCXN0YXR1cyA9IGRlY29kZV9hY2Nlc3MoJnhkciwgcmVzKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRGVjb2RlIExPT0tVUCByZXNwb25zZQorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb29rdXAoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2xvb2t1cF9yZXMgKnJlcykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CisJaW50IHN0YXR1czsKKwkKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcikpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9sb29rdXAoJnhkcikpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZGVjb2RlX2dldGZoKCZ4ZHIsIHJlcy0+ZmgpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgcmVzLT5mYXR0ciwgcmVzLT5zZXJ2ZXIpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEZWNvZGUgTE9PS1VQX1JPT1QgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfbG9va3VwX3Jvb3Qoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2xvb2t1cF9yZXMgKnJlcykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CisJaW50IHN0YXR1czsKKwkKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcikpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZGVjb2RlX3B1dHJvb3RmaCgmeGRyKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfZ2V0ZmgoJnhkciwgcmVzLT5maCkpID09IDApCisJCXN0YXR1cyA9IGRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlcik7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSBSRU1PVkUgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVtb3ZlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9jaGFuZ2VfaW5mbyAqY2luZm8pCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisJCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKSkgPT0gMCkKKwkJc3RhdHVzID0gZGVjb2RlX3JlbW92ZSgmeGRyLCBjaW5mbyk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSBSRU5BTUUgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVuYW1lKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9yZW5hbWVfcmVzICpyZXMpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisJCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfc2F2ZWZoKCZ4ZHIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX3JlbmFtZSgmeGRyLCAmcmVzLT5vbGRfY2luZm8sICZyZXMtPm5ld19jaW5mbyk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSBMSU5LIHJlc3BvbnNlCisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xpbmsoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2NoYW5nZV9pbmZvICpjaW5mbykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CisJaW50IHN0YXR1czsKKwkKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcikpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9zYXZlZmgoJnhkcikpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfbGluaygmeGRyLCBjaW5mbyk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSBDUkVBVEUgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfY3JlYXRlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9jcmVhdGVfcmVzICpyZXMpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisJCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfY3JlYXRlKCZ4ZHIsJnJlcy0+ZGlyX2NpbmZvKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfZ2V0ZmgoJnhkciwgcmVzLT5maCkpICE9IDApCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlcik7CisJaWYgKHN0YXR1cyA9PSBORlM0RVJSX0RFTEFZKQorCQlzdGF0dXMgPSAwOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEZWNvZGUgU1lNTElOSyByZXNwb25zZQorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19zeW1saW5rKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9jcmVhdGVfcmVzICpyZXMpCit7CisJcmV0dXJuIG5mczRfeGRyX2RlY19jcmVhdGUocnFzdHAsIHAsIHJlcyk7Cit9CisKKy8qCisgKiBEZWNvZGUgR0VUQVRUUiByZXNwb25zZQorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19nZXRhdHRyKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9nZXRhdHRyX3JlcyAqcmVzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOworCQorCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlcik7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKKworfQorCisKKy8qCisgKiBEZWNvZGUgQ0xPU0UgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfY2xvc2Uoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfY2xvc2VyZXMgKnJlcykKK3sKKyAgICAgICAgc3RydWN0IHhkcl9zdHJlYW0geGRyOworICAgICAgICBzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKyAgICAgICAgaW50IHN0YXR1czsKKworICAgICAgICB4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKyAgICAgICAgc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKyAgICAgICAgaWYgKHN0YXR1cykKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICBzdGF0dXMgPSBkZWNvZGVfY2xvc2UoJnhkciwgcmVzKTsKK291dDoKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSBPUEVOIHJlc3BvbnNlCisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX29wZW4oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfb3BlbnJlcyAqcmVzKQoreworICAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisgICAgICAgIHN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworICAgICAgICBpbnQgc3RhdHVzOworCisgICAgICAgIHhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOworICAgICAgICBzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICBzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIHN0YXR1cyA9IGRlY29kZV9vcGVuKCZ4ZHIsIHJlcyk7CisgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX2dldGZoKCZ4ZHIsICZyZXMtPmZoKTsKKyAgICAgICAgaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+Zl9hdHRyLCByZXMtPnNlcnZlcik7CisJaWYgKHN0YXR1cyA9PSBORlM0RVJSX0RFTEFZKQorCQlzdGF0dXMgPSAwOworb3V0OgorICAgICAgICByZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRGVjb2RlIE9QRU5fQ09ORklSTSByZXNwb25zZQorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfb3Blbl9jb25maXJtcmVzICpyZXMpCit7CisgICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKyAgICAgICAgc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CisgICAgICAgIGludCBzdGF0dXM7CisKKyAgICAgICAgeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisgICAgICAgIHN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIHN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKyAgICAgICAgaWYgKHN0YXR1cykKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgc3RhdHVzID0gZGVjb2RlX29wZW5fY29uZmlybSgmeGRyLCByZXMpOworb3V0OgorICAgICAgICByZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRGVjb2RlIE9QRU4gcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfb3Blbl9ub2F0dHIoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfb3BlbnJlcyAqcmVzKQoreworICAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisgICAgICAgIHN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworICAgICAgICBpbnQgc3RhdHVzOworCisgICAgICAgIHhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOworICAgICAgICBzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICBzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIHN0YXR1cyA9IGRlY29kZV9vcGVuKCZ4ZHIsIHJlcyk7CitvdXQ6CisgICAgICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEZWNvZGUgU0VUQVRUUiByZXNwb25zZQorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19zZXRhdHRyKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX3NldGF0dHJyZXMgKnJlcykKK3sKKyAgICAgICAgc3RydWN0IHhkcl9zdHJlYW0geGRyOworICAgICAgICBzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKyAgICAgICAgaW50IHN0YXR1czsKKworICAgICAgICB4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKyAgICAgICAgc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKyAgICAgICAgaWYgKHN0YXR1cykKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICBzdGF0dXMgPSBkZWNvZGVfc2V0YXR0cigmeGRyLCByZXMpOworICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlcik7CisJaWYgKHN0YXR1cyA9PSBORlM0RVJSX0RFTEFZKQorCQlzdGF0dXMgPSAwOworb3V0OgorICAgICAgICByZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRGVjb2RlIExPQ0sgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfbG9jayhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19sb2NrcmVzICpyZXMpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfbG9jaygmeGRyLCByZXMpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEZWNvZGUgTE9DS1QgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfbG9ja3Qoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfbG9ja3JlcyAqcmVzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX2xvY2t0KCZ4ZHIsIHJlcyk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSBMT0NLVSByZXNwb25zZQorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb2NrdShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19sb2NrcmVzICpyZXMpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfbG9ja3UoJnhkciwgcmVzKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRGVjb2RlIFJFQURMSU5LIHJlc3BvbnNlCisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlYWRsaW5rKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCB2b2lkICpyZXMpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfcmVhZGxpbmsoJnhkciwgcnFzdHApOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEZWNvZGUgUkVBRERJUiByZXNwb25zZQorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZWFkZGlyKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9yZWFkZGlyX3JlcyAqcmVzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX3JlYWRkaXIoJnhkciwgcnFzdHAsIHJlcyk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSBSZWFkIHJlc3BvbnNlCisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlYWQoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX3JlYWQoJnhkciwgcnFzdHAsIHJlcyk7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IHJlcy0+Y291bnQ7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSBXUklURSByZXNwb25zZQorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY193cml0ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc193cml0ZXJlcyAqcmVzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX3dyaXRlKCZ4ZHIsIHJlcyk7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IHJlcy0+Y291bnQ7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSBDT01NSVQgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfY29tbWl0KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXMpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfY29tbWl0KCZ4ZHIsIHJlcyk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEZTSU5GTyByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2ZzaW5mbyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfZnNpbmZvICpmc2luZm8pCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJlcS0+cnFfcmN2X2J1ZiwgcCk7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSBkZWNvZGVfZnNpbmZvKCZ4ZHIsIGZzaW5mbyk7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IC1uZnNfc3RhdF90b19lcnJubyhoZHIuc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogUEFUSENPTkYgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19wYXRoY29uZihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfcGF0aGNvbmYgKnBhdGhjb25mKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZyZXEtPnJxX3Jjdl9idWYsIHApOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gZGVjb2RlX3BhdGhjb25mKCZ4ZHIsIHBhdGhjb25mKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogU1RBVEZTIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfc3RhdGZzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19mc3N0YXQgKmZzc3RhdCkKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcmVxLT5ycV9yY3ZfYnVmLCBwKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGRlY29kZV9zdGF0ZnMoJnhkciwgZnNzdGF0KTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogR0VUQVRUUl9CSVRNQVAgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19zZXJ2ZXJfY2FwcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X3NlcnZlcl9jYXBzX3JlcyAqcmVzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZyZXEtPnJxX3Jjdl9idWYsIHApOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcikpICE9IDApCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9zZXJ2ZXJfY2FwcygmeGRyLCByZXMpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEZWNvZGUgUkVORVcgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVuZXcoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHZvaWQgKmR1bW15KQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gZGVjb2RlX3JlbmV3KCZ4ZHIpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBhIFNFVENMSUVOVElEIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfc2V0Y2xpZW50aWQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLAorCQlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcmVxLT5ycV9yY3ZfYnVmLCBwKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSBkZWNvZGVfc2V0Y2xpZW50aWQoJnhkciwgY2xwKTsKKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gLW5mc19zdGF0X3RvX2Vycm5vKGhkci5zdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBhIFNFVENMSUVOVElEX0NPTkZJUk0gcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19zZXRjbGllbnRpZF9jb25maXJtKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19mc2luZm8gKmZzaW5mbykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcmVxLT5ycV9yY3ZfYnVmLCBwKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSBkZWNvZGVfc2V0Y2xpZW50aWRfY29uZmlybSgmeGRyKTsKKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gZGVjb2RlX3B1dHJvb3RmaCgmeGRyKTsKKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gZGVjb2RlX2ZzaW5mbygmeGRyLCBmc2luZm8pOworCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSAtbmZzX3N0YXRfdG9fZXJybm8oaGRyLnN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERFTEVHUkVUVVJOIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZGVsZWdyZXR1cm4oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHZvaWQgKmR1bW15KQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCQlpZiAoc3RhdHVzID09IDApCisJCQlzdGF0dXMgPSBkZWNvZGVfZGVsZWdyZXR1cm4oJnhkcik7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3VpbnQzMl90ICpuZnM0X2RlY29kZV9kaXJlbnQodWludDMyX3QgKnAsIHN0cnVjdCBuZnNfZW50cnkgKmVudHJ5LCBpbnQgcGx1cykKK3sKKwl1aW50MzJfdCBiaXRtYXBbMl0gPSB7MH07CisJdWludDMyX3QgbGVuOworCisJaWYgKCEqcCsrKSB7CisJCWlmICghKnApCisJCQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsKKwkJZW50cnktPmVvZiA9IDE7CisJCXJldHVybiBFUlJfUFRSKC1FQkFEQ09PS0lFKTsKKwl9CisKKwllbnRyeS0+cHJldl9jb29raWUgPSBlbnRyeS0+Y29va2llOworCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZlbnRyeS0+Y29va2llKTsKKwllbnRyeS0+bGVuID0gbnRvaGwoKnArKyk7CisJZW50cnktPm5hbWUgPSAoY29uc3QgY2hhciAqKSBwOworCXAgKz0gWERSX1FVQURMRU4oZW50cnktPmxlbik7CisKKwkvKgorCSAqIEluIGNhc2UgdGhlIHNlcnZlciBkb2Vzbid0IHJldHVybiBhbiBpbm9kZSBudW1iZXIsCisJICogd2UgZmFrZSBvbmUgaGVyZS4gIChXZSBkb24ndCB1c2UgaW5vZGUgbnVtYmVyIDAsCisJICogc2luY2UgZ2xpYmMgc2VlbXMgdG8gY2hva2Ugb24gaXQuLi4pCisJICovCisJZW50cnktPmlubyA9IDE7CisKKwlsZW4gPSBudG9obCgqcCsrKTsJCS8qIGJpdG1hcCBsZW5ndGggKi8KKwlpZiAobGVuLS0gPiAwKSB7CisJCWJpdG1hcFswXSA9IG50b2hsKCpwKyspOworCQlpZiAobGVuLS0gPiAwKSB7CisJCQliaXRtYXBbMV0gPSBudG9obCgqcCsrKTsKKwkJCXAgKz0gbGVuOworCQl9CisJfQorCWxlbiA9IFhEUl9RVUFETEVOKG50b2hsKCpwKyspKTsJLyogYXR0cmlidXRlIGJ1ZmZlciBsZW5ndGggKi8KKwlpZiAobGVuID4gMCkgeworCQlpZiAoYml0bWFwWzBdID09IDAgJiYgYml0bWFwWzFdID09IEZBVFRSNF9XT1JEMV9NT1VOVEVEX09OX0ZJTEVJRCkKKwkJCXhkcl9kZWNvZGVfaHlwZXIocCwgJmVudHJ5LT5pbm8pOworCQllbHNlIGlmIChiaXRtYXBbMF0gPT0gRkFUVFI0X1dPUkQwX0ZJTEVJRCkKKwkJCXhkcl9kZWNvZGVfaHlwZXIocCwgJmVudHJ5LT5pbm8pOworCQlwICs9IGxlbjsKKwl9CisKKwllbnRyeS0+ZW9mID0gIXBbMF0gJiYgcFsxXTsKKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIFdlIG5lZWQgdG8gdHJhbnNsYXRlIGJldHdlZW4gbmZzIHN0YXR1cyByZXR1cm4gdmFsdWVzIGFuZAorICogdGhlIGxvY2FsIGVycm5vIHZhbHVlcyB3aGljaCBtYXkgbm90IGJlIHRoZSBzYW1lLgorICovCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgc3RhdDsKKwlpbnQgZXJybm87Cit9IG5mc19lcnJ0YmxbXSA9IHsKKwl7IE5GUzRfT0ssCQkwCQl9LAorCXsgTkZTNEVSUl9QRVJNLAkJRVBFUk0JCX0sCisJeyBORlM0RVJSX05PRU5ULAlFTk9FTlQJCX0sCisJeyBORlM0RVJSX0lPLAkJZXJybm9fTkZTRVJSX0lPCX0sCisJeyBORlM0RVJSX05YSU8sCQlFTlhJTwkJfSwKKwl7IE5GUzRFUlJfQUNDRVNTLAlFQUNDRVMJCX0sCisJeyBORlM0RVJSX0VYSVNULAlFRVhJU1QJCX0sCisJeyBORlM0RVJSX1hERVYsCQlFWERFVgkJfSwKKwl7IE5GUzRFUlJfTk9URElSLAlFTk9URElSCQl9LAorCXsgTkZTNEVSUl9JU0RJUiwJRUlTRElSCQl9LAorCXsgTkZTNEVSUl9JTlZBTCwJRUlOVkFMCQl9LAorCXsgTkZTNEVSUl9GQklHLAkJRUZCSUcJCX0sCisJeyBORlM0RVJSX05PU1BDLAlFTk9TUEMJCX0sCisJeyBORlM0RVJSX1JPRlMsCQlFUk9GUwkJfSwKKwl7IE5GUzRFUlJfTUxJTkssCUVNTElOSwkJfSwKKwl7IE5GUzRFUlJfTkFNRVRPT0xPTkcsCUVOQU1FVE9PTE9ORwl9LAorCXsgTkZTNEVSUl9OT1RFTVBUWSwJRU5PVEVNUFRZCX0sCisJeyBORlM0RVJSX0RRVU9ULAlFRFFVT1QJCX0sCisJeyBORlM0RVJSX1NUQUxFLAlFU1RBTEUJCX0sCisJeyBORlM0RVJSX0JBREhBTkRMRSwJRUJBREhBTkRMRQl9LAorCXsgTkZTNEVSUl9CQURfQ09PS0lFLAlFQkFEQ09PS0lFCX0sCisJeyBORlM0RVJSX05PVFNVUFAsCUVOT1RTVVBQCX0sCisJeyBORlM0RVJSX1RPT1NNQUxMLAlFVE9PU01BTEwJfSwKKwl7IE5GUzRFUlJfU0VSVkVSRkFVTFQsCUVTRVJWRVJGQVVMVAl9LAorCXsgTkZTNEVSUl9CQURUWVBFLAlFQkFEVFlQRQl9LAorCXsgTkZTNEVSUl9MT0NLRUQsCUVBR0FJTgkJfSwKKwl7IE5GUzRFUlJfUkVTT1VSQ0UsCUVSRU1PVEVJTwl9LAorCXsgTkZTNEVSUl9TWU1MSU5LLAlFTE9PUAkJfSwKKwl7IE5GUzRFUlJfT1BfSUxMRUdBTCwJRU9QTk9UU1VQUAl9LAorCXsgTkZTNEVSUl9ERUFETE9DSywJRURFQURMSwkJfSwKKwl7IE5GUzRFUlJfV1JPTkdTRUMsCUVQRVJNCQl9LCAvKiBGSVhNRTogdGhpcyBuZWVkcworCQkJCQkJICAgICogdG8gYmUgaGFuZGxlZCBieSBhCisJCQkJCQkgICAgKiBtaWRkbGUtbGF5ZXIuCisJCQkJCQkgICAgKi8KKwl7IC0xLAkJCUVJTwkJfQorfTsKKworLyoKKyAqIENvbnZlcnQgYW4gTkZTIGVycm9yIGNvZGUgdG8gYSBsb2NhbCBvbmUuCisgKiBUaGlzIG9uZSBpcyB1c2VkIGpvaW50bHkgYnkgTkZTdjIgYW5kIE5GU3YzLgorICovCitzdGF0aWMgaW50CituZnNfc3RhdF90b19lcnJubyhpbnQgc3RhdCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBuZnNfZXJydGJsW2ldLnN0YXQgIT0gLTE7IGkrKykgeworCQlpZiAobmZzX2VycnRibFtpXS5zdGF0ID09IHN0YXQpCisJCQlyZXR1cm4gbmZzX2VycnRibFtpXS5lcnJubzsKKwl9CisJaWYgKHN0YXQgPD0gMTAwMDAgfHwgc3RhdCA+IDEwMTAwKSB7CisJCS8qIFRoZSBzZXJ2ZXIgaXMgbG9vbmV5IHR1bmVzLiAqLworCQlyZXR1cm4gRVNFUlZFUkZBVUxUOworCX0KKwkvKiBJZiB3ZSBjYW5ub3QgdHJhbnNsYXRlIHRoZSBlcnJvciwgdGhlIHJlY292ZXJ5IHJvdXRpbmVzIHNob3VsZAorCSAqIGhhbmRsZSBpdC4KKwkgKiBOb3RlOiByZW1haW5pbmcgTkZTdjQgZXJyb3IgY29kZXMgaGF2ZSB2YWx1ZXMgPiAxMDAwMCwgc28gc2hvdWxkCisJICogbm90IGNvbmZsaWN0IHdpdGggbmF0aXZlIExpbnV4IGVycm9yIGNvZGVzLgorCSAqLworCXJldHVybiBzdGF0OworfQorCisjaWZuZGVmIE1BWAorIyBkZWZpbmUgTUFYKGEsIGIpCSgoKGEpID4gKGIpKT8gKGEpIDogKGIpKQorI2VuZGlmCisKKyNkZWZpbmUgUFJPQyhwcm9jLCBhcmd0eXBlLCByZXN0eXBlKQkJCQlcCitbTkZTUFJPQzRfQ0xOVF8jI3Byb2NdID0gewkJCQkJXAorCS5wX3Byb2MgICA9IE5GU1BST0M0X0NPTVBPVU5ELAkJCQlcCisJLnBfZW5jb2RlID0gKGt4ZHJwcm9jX3QpIG5mczRfeGRyXyMjYXJndHlwZSwJCVwKKwkucF9kZWNvZGUgPSAoa3hkcnByb2NfdCkgbmZzNF94ZHJfIyNyZXN0eXBlLAkJXAorCS5wX2J1ZnNpeiA9IE1BWChORlM0XyMjYXJndHlwZSMjX3N6LE5GUzRfIyNyZXN0eXBlIyNfc3opIDw8IDIsCVwKKyAgICB9CisKK3N0cnVjdCBycGNfcHJvY2luZm8JbmZzNF9wcm9jZWR1cmVzW10gPSB7CisgIFBST0MoUkVBRCwJCWVuY19yZWFkLAlkZWNfcmVhZCksCisgIFBST0MoV1JJVEUsCQllbmNfd3JpdGUsCWRlY193cml0ZSksCisgIFBST0MoQ09NTUlULAkJZW5jX2NvbW1pdCwJZGVjX2NvbW1pdCksCisgIFBST0MoT1BFTiwJCWVuY19vcGVuLAlkZWNfb3BlbiksCisgIFBST0MoT1BFTl9DT05GSVJNLAllbmNfb3Blbl9jb25maXJtLAlkZWNfb3Blbl9jb25maXJtKSwKKyAgUFJPQyhPUEVOX05PQVRUUiwJZW5jX29wZW5fbm9hdHRyLAlkZWNfb3Blbl9ub2F0dHIpLAorICBQUk9DKE9QRU5fRE9XTkdSQURFLAllbmNfb3Blbl9kb3duZ3JhZGUsCWRlY19vcGVuX2Rvd25ncmFkZSksCisgIFBST0MoQ0xPU0UsCQllbmNfY2xvc2UsCWRlY19jbG9zZSksCisgIFBST0MoU0VUQVRUUiwJCWVuY19zZXRhdHRyLAlkZWNfc2V0YXR0ciksCisgIFBST0MoRlNJTkZPLAkJZW5jX2ZzaW5mbywJZGVjX2ZzaW5mbyksCisgIFBST0MoUkVORVcsCQllbmNfcmVuZXcsCWRlY19yZW5ldyksCisgIFBST0MoU0VUQ0xJRU5USUQsCWVuY19zZXRjbGllbnRpZCwJZGVjX3NldGNsaWVudGlkKSwKKyAgUFJPQyhTRVRDTElFTlRJRF9DT05GSVJNLAllbmNfc2V0Y2xpZW50aWRfY29uZmlybSwJZGVjX3NldGNsaWVudGlkX2NvbmZpcm0pLAorICBQUk9DKExPQ0ssICAgICAgICAgICAgZW5jX2xvY2ssICAgICAgIGRlY19sb2NrKSwKKyAgUFJPQyhMT0NLVCwgICAgICAgICAgIGVuY19sb2NrdCwgICAgICBkZWNfbG9ja3QpLAorICBQUk9DKExPQ0tVLCAgICAgICAgICAgZW5jX2xvY2t1LCAgICAgIGRlY19sb2NrdSksCisgIFBST0MoQUNDRVNTLAkJZW5jX2FjY2VzcywJZGVjX2FjY2VzcyksCisgIFBST0MoR0VUQVRUUiwJCWVuY19nZXRhdHRyLAlkZWNfZ2V0YXR0ciksCisgIFBST0MoTE9PS1VQLAkJZW5jX2xvb2t1cCwJZGVjX2xvb2t1cCksCisgIFBST0MoTE9PS1VQX1JPT1QsCWVuY19sb29rdXBfcm9vdCwJZGVjX2xvb2t1cF9yb290KSwKKyAgUFJPQyhSRU1PVkUsCQllbmNfcmVtb3ZlLAlkZWNfcmVtb3ZlKSwKKyAgUFJPQyhSRU5BTUUsCQllbmNfcmVuYW1lLAlkZWNfcmVuYW1lKSwKKyAgUFJPQyhMSU5LLAkJZW5jX2xpbmssCWRlY19saW5rKSwKKyAgUFJPQyhTWU1MSU5LLAkJZW5jX3N5bWxpbmssCWRlY19zeW1saW5rKSwKKyAgUFJPQyhDUkVBVEUsCQllbmNfY3JlYXRlLAlkZWNfY3JlYXRlKSwKKyAgUFJPQyhQQVRIQ09ORiwJZW5jX3BhdGhjb25mLAlkZWNfcGF0aGNvbmYpLAorICBQUk9DKFNUQVRGUywJCWVuY19zdGF0ZnMsCWRlY19zdGF0ZnMpLAorICBQUk9DKFJFQURMSU5LLAllbmNfcmVhZGxpbmssCWRlY19yZWFkbGluayksCisgIFBST0MoUkVBRERJUiwJCWVuY19yZWFkZGlyLAlkZWNfcmVhZGRpciksCisgIFBST0MoU0VSVkVSX0NBUFMsCWVuY19zZXJ2ZXJfY2FwcywgZGVjX3NlcnZlcl9jYXBzKSwKKyAgUFJPQyhERUxFR1JFVFVSTiwJZW5jX2RlbGVncmV0dXJuLCBkZWNfZGVsZWdyZXR1cm4pLAorfTsKKworc3RydWN0IHJwY192ZXJzaW9uCQluZnNfdmVyc2lvbjQgPSB7CisJLm51bWJlcgkJCT0gNCwKKwkubnJwcm9jcwkJPSBzaXplb2YobmZzNF9wcm9jZWR1cmVzKS9zaXplb2YobmZzNF9wcm9jZWR1cmVzWzBdKSwKKwkucHJvY3MJCQk9IG5mczRfcHJvY2VkdXJlcworfTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzcm9vdC5jIGIvZnMvbmZzL25mc3Jvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDViYzU5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL25mc3Jvb3QuYwpAQCAtMCwwICsxLDUxMyBAQAorLyoKKyAqICAkSWQ6IG5mc3Jvb3QuYyx2IDEuNDUgMTk5OC8wMy8wNyAxMDo0NDo0NiBtaiBFeHAgJAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgIEdlcm8gS3VobG1hbm4gPGdlcm9AZ2ttaW5peC5oYW4uZGU+CisgKgorICogIEFsbG93IGFuIE5GUyBmaWxlc3lzdGVtIHRvIGJlIG1vdW50ZWQgYXMgcm9vdC4gVGhlIHdheSB0aGlzIHdvcmtzIGlzOgorICogICAgICgxKSBVc2UgdGhlIElQIGF1dG9jb25maWcgbWVjaGFuaXNtIHRvIHNldCBsb2NhbCBJUCBhZGRyZXNzZXMgYW5kIHJvdXRlcy4KKyAqICAgICAoMikgSGFuZGxlIFJQQyBuZWdvdGlhdGlvbiB3aXRoIHRoZSBzeXN0ZW0gd2hpY2ggcmVwbGllZCB0byBSQVJQIG9yCisgKiAgICAgICAgIHdhcyByZXBvcnRlZCBhcyBhIGJvb3Qgc2VydmVyIGJ5IEJPT1RQIG9yIG1hbnVhbGx5LgorICogICAgICgzKSBUaGUgYWN0dWFsIG1vdW50aW5nIGlzIGRvbmUgbGF0ZXIsIHdoZW4gaW5pdCgpIGlzIHJ1bm5pbmcuCisgKgorICoKKyAqCUNoYW5nZXM6CisgKgorICoJQWxhbiBDb3gJOglSZW1vdmVkIGdldF9hZGRyZXNzIG5hbWUgY2xhc2ggd2l0aCBGUFUuCisgKglBbGFuIENveAk6CVJlZm9ybWF0dGVkIGEgYml0LgorICoJR2VybyBLdWhsbWFubgk6CUNvZGUgY2xlYW51cAorICoJTWljaGFlbCBSYXVzY2ggIDoJRml4ZWQgcmVjb2duaXRpb24gb2YgYW4gaW5jb21pbmcgUkFSUCBhbnN3ZXIuCisgKglNYXJ0aW4gTWFyZXMJOiAoMi4wKQlBdXRvLWNvbmZpZ3VyYXRpb24gdmlhIEJPT1RQIHN1cHBvcnRlZC4KKyAqCU1hcnRpbiBNYXJlcwk6CU1hbnVhbCBzZWxlY3Rpb24gb2YgaW50ZXJmYWNlICYgQk9PVFAvUkFSUC4KKyAqCU1hcnRpbiBNYXJlcwk6CVVzaW5nIG5ldHdvcmsgcm91dGVzIGluc3RlYWQgb2YgaG9zdCByb3V0ZXMsCisgKgkJCQlhbGxvd2luZyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQKKyAqCQkJCWZvciBub3JtYWwgb3BlcmF0aW9uIG9mIHRoZSBob3N0LgorICoJTWFydGluIE1hcmVzCToJUmFuZG9taXplZCB0aW1lciB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYKKyAqCQkJCWluc3RhbGxlZCB0byBtaW5pbWl6ZSBuZXR3b3JrIGNvbmdlc3Rpb24uCisgKglNYXJ0aW4gTWFyZXMJOglDb2RlIGNsZWFudXAuCisgKglNYXJ0aW4gTWFyZXMJOiAoMi4xKQlCT09UUCBhbmQgUkFSUCBtYWRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyAqCU1hcnRpbiBNYXJlcwk6CVNlcnZlciBob3N0bmFtZSBnZW5lcmF0aW9uIGZpeGVkLgorICoJR2VyZCBLbm9ycgk6CUZpeGVkIHdpcmVkIGlub2RlIGhhbmRsaW5nCisgKglNYXJ0aW4gTWFyZXMJOiAoMi4yKQkiMC4wLjAuMCIgYWRkcmVzc2VzIGZyb20gY29tbWFuZCBsaW5lIGlnbm9yZWQuCisgKglNYXJ0aW4gTWFyZXMJOglSQVJQIHJlcGxpZXMgbm90IHRlc3RlZCBmb3Igc2VydmVyIGFkZHJlc3MuCisgKglHZXJvIEt1aGxtYW5uCTogKDIuMykgU29tZSBidWcgZml4ZXMgYW5kIGNvZGUgY2xlYW51cCBhZ2FpbiAocGxlYXNlCisgKgkJCQlzZW5kIG1lIHlvdXIgbmV3IHBhdGNoZXMgX2JlZm9yZV8gYm90aGVyaW5nCisgKgkJCQlMaW51cyBzbyB0aGF0IEkgZG9uJyBhbHdheXMgaGF2ZSB0byBjbGVhbnVwCisgKgkJCQlfYWZ0ZXJ3YXJkc18gLSB0aGFua3MpCisgKglHZXJvIEt1aGxtYW5uCToJTGFzdCBjaGFuZ2VzIG9mIE1hcnRpbiBNYXJlcyB1bmRvbmUuCisgKglHZXJvIEt1aGxtYW5uCTogCVJBUlAgcmVwbGllcyBhcmUgdGVzdGVkIGZvciBzcGVjaWZpZWQgc2VydmVyCisgKgkJCQlhZ2Fpbi4gSG93ZXZlciwgaXQncyBub3cgcG9zc2libGUgdG8gaGF2ZQorICoJCQkJZGlmZmVyZW50IFJBUlAgYW5kIE5GUyBzZXJ2ZXJzLgorICoJR2VybyBLdWhsbWFubgk6CSIwLjAuMC4wIiBhZGRyZXNzZXMgZnJvbSBjb21tYW5kIGxpbmUgYXJlCisgKgkJCQlub3cgbWFwcGVkIHRvIElOQUREUl9OT05FLgorICoJR2VybyBLdWhsbWFubgk6CUZpeGVkIGEgYnVnIHdoaWNoIHByZXZlbnRlZCBCT09UUCBwYXRoIG5hbWUKKyAqCQkJCWZyb20gYmVpbmcgdXNlZCAodGhhbmtzIHRvIExlbyBTcGlla21hbikKKyAqCUFuZHkgV2Fsa2VyCToJQWxsb3cgdG8gc3BlY2lmeSB0aGUgTkZTIHNlcnZlciBpbiBuZnNfcm9vdAorICoJCQkJd2l0aG91dCBnaXZpbmcgYSBwYXRoIG5hbWUKKyAqCVN3ZW4gVGj8bW1sZXIJOglBbGxvdyB0byBzcGVjaWZ5IHRoZSBORlMgb3B0aW9ucyBpbiBuZnNfcm9vdAorICoJCQkJd2l0aG91dCBnaXZpbmcgYSBwYXRoIG5hbWUuIEZpeCBCT09UUCByZXF1ZXN0CisgKgkJCQlmb3IgZG9tYWlubmFtZSAoZG9tYWlubmFtZSBpcyBOSVMgZG9tYWluLCBub3QKKyAqCQkJCUROUyBkb21haW4hKS4gU2tpcCBkdW1teSBkZXZpY2VzIGZvciBCT09UUC4KKyAqCUphY2VrIFphcGFsYQk6CUZpeGVkIGEgYnVnIHdoaWNoIHByZXZlbnRlZCBzZXJ2ZXItaXAgYWRkcmVzcworICoJCQkJZnJvbSBuZnNyb290IHBhcmFtZXRlciBmcm9tIGJlaW5nIHVzZWQuCisgKglPbGFmIEtpcmNoCToJQWRhcHRlZCB0byBuZXcgTkZTIGNvZGUuCisgKglKYWt1YiBKZWxpbmVrCToJRnJlZSB1c2VkIGNvZGUgc2VnbWVudC4KKyAqCU1hcmtvIEtvaHRhbGEJOglGaXhlZCBzb21lIGJ1Z3MuCisgKglNYXJ0aW4gTWFyZXMJOglEZWJ1ZyBtZXNzYWdlIGNsZWFudXAKKyAqCU1hcnRpbiBNYXJlcwk6CUNoYW5nZWQgdG8gdXNlIHRoZSBuZXcgZ2VuZXJpYyBJUCBsYXllciBhdXRvY29uZmlnCisgKgkJCQljb2RlLiBCT09UUCBhbmQgUkFSUCBtb3ZlZCB0aGVyZS4KKyAqCU1hcnRpbiBNYXJlcwk6CURlZmF1bHQgcGF0aCBub3cgY29udGFpbnMgaG9zdCBuYW1lIGluc3RlYWQgb2YKKyAqCQkJCWhvc3QgSVAgYWRkcmVzcyAoYnV0IGhvc3QgbmFtZSBkZWZhdWx0cyB0byBJUAorICoJCQkJYWRkcmVzcyBhbnl3YXkpLgorICoJTWFydGluIE1hcmVzCToJVXNlIHJvb3Rfc2VydmVyX2FkZHIgYXBwcm9wcmlhdGVseSBkdXJpbmcgc2V0dXAuCisgKglNYXJ0aW4gTWFyZXMJOglSZXdyb3RlIHBhcmFtZXRlciBwYXJzaW5nLCBub3cgaG9wZWZ1bGx5IGdpdmluZworICoJCQkJY29ycmVjdCBvdmVycmlkaW5nLgorICoJVHJvbmQgTXlrbGVidXN0IDoJQWRkIGluIHByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIE5GU3YzIGFuZCBUQ1AuCisgKgkJCQlGaXggYnVnIGluIHJvb3RfbmZzX2FkZHIoKS4gbmZzX2RhdGEubmFtbGVuCisgKgkJCQlpcyBOT1QgZm9yIHRoZSBsZW5ndGggb2YgdGhlIGhvc3RuYW1lLgorICoJSHVhIFFpbgkJOglTdXBwb3J0IGZvciBtb3VudGluZyByb290IGZpbGUgc3lzdGVtIHZpYQorICoJCQkJTkZTIG92ZXIgVENQLgorICoJRmFiaWFuIEZyZWRlcmljazoJT3B0aW9uIHBhcnNlciByZWJ1aWx0ICh1c2luZyBwYXJzZXIgbGliKQorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KKyNpbmNsdWRlIDxuZXQvaXBjb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKworLyogRGVmaW5lIHRoaXMgdG8gYWxsb3cgZGVidWdnaW5nIG91dHB1dCAqLworI3VuZGVmIE5GU1JPT1RfREVCVUcKKyNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZIE5GU0RCR19ST09UCisKKy8qIERlZmF1bHQgcGF0aCB3ZSB0cnkgdG8gbW91bnQuICIlcyIgZ2V0cyByZXBsYWNlZCBieSBvdXIgSVAgYWRkcmVzcyAqLworI2RlZmluZSBORlNfUk9PVAkJIi90ZnRwYm9vdC8lcyIKKworLyogUGFyYW1ldGVycyBwYXNzZWQgZnJvbSB0aGUga2VybmVsIGNvbW1hbmQgbGluZSAqLworc3RhdGljIGNoYXIgbmZzX3Jvb3RfbmFtZVsyNTZdIF9faW5pdGRhdGEgPSAiIjsKKworLyogQWRkcmVzcyBvZiBORlMgc2VydmVyICovCitzdGF0aWMgX191MzIgc2VydmFkZHIgX19pbml0ZGF0YSA9IDA7CisKKy8qIE5hbWUgb2YgZGlyZWN0b3J5IHRvIG1vdW50ICovCitzdGF0aWMgY2hhciBuZnNfcGF0aFtORlNfTUFYUEFUSExFTl0gX19pbml0ZGF0YSA9IHsgMCwgfTsKKworLyogTkZTLXJlbGF0ZWQgZGF0YSAqLworc3RhdGljIHN0cnVjdCBuZnNfbW91bnRfZGF0YSBuZnNfZGF0YSBfX2luaXRkYXRhID0geyAwLCB9Oy8qIE5GUyBtb3VudCBpbmZvICovCitzdGF0aWMgaW50IG5mc19wb3J0IF9faW5pdGRhdGEgPSAwOwkJLyogUG9ydCB0byBjb25uZWN0IHRvIGZvciBORlMgKi8KK3N0YXRpYyBpbnQgbW91bnRfcG9ydCBfX2luaXRkYXRhID0gMDsJCS8qIE1vdW50IGRhZW1vbiBwb3J0IG51bWJlciAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCQkJICAgICBQYXJzaW5nIG9mIG9wdGlvbnMKKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZW51bSB7CisJLyogT3B0aW9ucyB0aGF0IHRha2UgaW50ZWdlciBhcmd1bWVudHMgKi8KKwlPcHRfcG9ydCwgT3B0X3JzaXplLCBPcHRfd3NpemUsIE9wdF90aW1lbywgT3B0X3JldHJhbnMsIE9wdF9hY3JlZ21pbiwKKwlPcHRfYWNyZWdtYXgsIE9wdF9hY2Rpcm1pbiwgT3B0X2FjZGlybWF4LAorCS8qIE9wdGlvbnMgdGhhdCB0YWtlIG5vIGFyZ3VtZW50cyAqLworCU9wdF9zb2Z0LCBPcHRfaGFyZCwgT3B0X2ludHIsCisJT3B0X25vaW50ciwgT3B0X3Bvc2l4LCBPcHRfbm9wb3NpeCwgT3B0X2N0bywgT3B0X25vY3RvLCBPcHRfYWMsIAorCU9wdF9ub2FjLCBPcHRfbG9jaywgT3B0X25vbG9jaywgT3B0X3YyLCBPcHRfdjMsIE9wdF91ZHAsIE9wdF90Y3AsCisJLyogRXJyb3IgdG9rZW4gKi8KKwlPcHRfZXJyCit9OworCitzdGF0aWMgbWF0Y2hfdGFibGVfdCBfX2luaXRkYXRhIHRva2VucyA9IHsKKwl7T3B0X3BvcnQsICJwb3J0PSV1In0sCisJe09wdF9yc2l6ZSwgInJzaXplPSV1In0sCisJe09wdF93c2l6ZSwgIndzaXplPSV1In0sCisJe09wdF90aW1lbywgInRpbWVvPSV1In0sCisJe09wdF9yZXRyYW5zLCAicmV0cmFucz0ldSJ9LAorCXtPcHRfYWNyZWdtaW4sICJhY3JlZ21pbj0ldSJ9LAorCXtPcHRfYWNyZWdtYXgsICJhY3JlZ21heD0ldSJ9LAorCXtPcHRfYWNkaXJtaW4sICJhY2Rpcm1pbj0ldSJ9LAorCXtPcHRfYWNkaXJtYXgsICJhY2Rpcm1heD0ldSJ9LAorCXtPcHRfc29mdCwgInNvZnQifSwKKwl7T3B0X2hhcmQsICJoYXJkIn0sCisJe09wdF9pbnRyLCAiaW50ciJ9LAorCXtPcHRfbm9pbnRyLCAibm9pbnRyIn0sCisJe09wdF9wb3NpeCwgInBvc2l4In0sCisJe09wdF9ub3Bvc2l4LCAibm9wb3NpeCJ9LAorCXtPcHRfY3RvLCAiY3RvIn0sCisJe09wdF9ub2N0bywgIm5vY3RvIn0sCisJe09wdF9hYywgImFjIn0sCisJe09wdF9ub2FjLCAibm9hYyJ9LAorCXtPcHRfbG9jaywgImxvY2sifSwKKwl7T3B0X25vbG9jaywgIm5vbG9jayJ9LAorCXtPcHRfdjIsICJuZnN2ZXJzPTIifSwKKwl7T3B0X3YyLCAidjIifSwKKwl7T3B0X3YzLCAibmZzdmVycz0zIn0sCisJe09wdF92MywgInYzIn0sCisJe09wdF91ZHAsICJwcm90bz11ZHAifSwKKwl7T3B0X3VkcCwgInVkcCJ9LAorCXtPcHRfdGNwLCAicHJvdG89dGNwIn0sCisJe09wdF90Y3AsICJ0Y3AifSwKKwl7T3B0X2VyciwgTlVMTH0KKwkKK307CisKKy8qCisgKiAgUGFyc2Ugb3B0aW9uIHN0cmluZy4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCByb290X25mc19wYXJzZShjaGFyICpuYW1lLCBjaGFyICpidWYpCit7CisKKwljaGFyICpwOworCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKKwlpbnQgb3B0aW9uOworCisJaWYgKCFuYW1lKQorCQlyZXR1cm4gMTsKKworCS8qIFNldCB0aGUgTkZTIHJlbW90ZSBwYXRoICovCisJcCA9IHN0cnNlcCgmbmFtZSwgIiwiKTsKKwlpZiAocFswXSAhPSAnXDAnICYmIHN0cmNtcChwLCAiZGVmYXVsdCIpICE9IDApCisJCXN0cmxjcHkoYnVmLCBwLCBORlNfTUFYUEFUSExFTik7CisKKwl3aGlsZSAoKHAgPSBzdHJzZXAgKCZuYW1lLCAiLCIpKSAhPSBOVUxMKSB7CisJCWludCB0b2tlbjsgCisJCWlmICghKnApCisJCQljb250aW51ZTsKKwkJdG9rZW4gPSBtYXRjaF90b2tlbihwLCB0b2tlbnMsIGFyZ3MpOworCisJCS8qICV1IHRva2VucyBvbmx5LiBCZXdhcmUgaWYgeW91IGFkZCBuZXcgdG9rZW5zISAqLworCQlpZiAodG9rZW4gPCBPcHRfc29mdCAmJiBtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJcmV0dXJuIDA7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJCWNhc2UgT3B0X3BvcnQ6CisJCQkJbmZzX3BvcnQgPSBvcHRpb247CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9yc2l6ZToKKwkJCQluZnNfZGF0YS5yc2l6ZSA9IG9wdGlvbjsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X3dzaXplOgorCQkJCW5mc19kYXRhLndzaXplID0gb3B0aW9uOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfdGltZW86CisJCQkJbmZzX2RhdGEudGltZW8gPSBvcHRpb247CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9yZXRyYW5zOgorCQkJCW5mc19kYXRhLnJldHJhbnMgPSBvcHRpb247CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9hY3JlZ21pbjoKKwkJCQluZnNfZGF0YS5hY3JlZ21pbiA9IG9wdGlvbjsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X2FjcmVnbWF4OgorCQkJCW5mc19kYXRhLmFjcmVnbWF4ID0gb3B0aW9uOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfYWNkaXJtaW46CisJCQkJbmZzX2RhdGEuYWNkaXJtaW4gPSBvcHRpb247CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9hY2Rpcm1heDoKKwkJCQluZnNfZGF0YS5hY2Rpcm1heCA9IG9wdGlvbjsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X3NvZnQ6CisJCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX1NPRlQ7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9oYXJkOgorCQkJCW5mc19kYXRhLmZsYWdzICY9IH5ORlNfTU9VTlRfU09GVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X2ludHI6CisJCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX0lOVFI7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9ub2ludHI6CisJCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9JTlRSOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfcG9zaXg6CisJCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX1BPU0lYOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfbm9wb3NpeDoKKwkJCQluZnNfZGF0YS5mbGFncyAmPSB+TkZTX01PVU5UX1BPU0lYOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfY3RvOgorCQkJCW5mc19kYXRhLmZsYWdzICY9IH5ORlNfTU9VTlRfTk9DVE87CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9ub2N0bzoKKwkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfTk9DVE87CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9hYzoKKwkJCQluZnNfZGF0YS5mbGFncyAmPSB+TkZTX01PVU5UX05PQUM7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9ub2FjOgorCQkJCW5mc19kYXRhLmZsYWdzIHw9IE5GU19NT1VOVF9OT0FDOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfbG9jazoKKwkJCQluZnNfZGF0YS5mbGFncyAmPSB+TkZTX01PVU5UX05PTkxNOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfbm9sb2NrOgorCQkJCW5mc19kYXRhLmZsYWdzIHw9IE5GU19NT1VOVF9OT05MTTsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X3YyOgorCQkJCW5mc19kYXRhLmZsYWdzICY9IH5ORlNfTU9VTlRfVkVSMzsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X3YzOgorCQkJCW5mc19kYXRhLmZsYWdzIHw9IE5GU19NT1VOVF9WRVIzOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfdWRwOgorCQkJCW5mc19kYXRhLmZsYWdzICY9IH5ORlNfTU9VTlRfVENQOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfdGNwOgorCQkJCW5mc19kYXRhLmZsYWdzIHw9IE5GU19NT1VOVF9UQ1A7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDogCisJCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqICBQcmVwYXJlIHRoZSBORlMgZGF0YSBzdHJ1Y3R1cmUgYW5kIHBhcnNlIGFsbCBvcHRpb25zLgorICovCitzdGF0aWMgaW50IF9faW5pdCByb290X25mc19uYW1lKGNoYXIgKm5hbWUpCit7CisJc3RhdGljIGNoYXIgYnVmW05GU19NQVhQQVRITEVOXSBfX2luaXRkYXRhOworCWNoYXIgKmNwOworCisJLyogU2V0IHNvbWUgZGVmYXVsdCB2YWx1ZXMgKi8KKwltZW1zZXQoJm5mc19kYXRhLCAwLCBzaXplb2YobmZzX2RhdGEpKTsKKwluZnNfcG9ydCAgICAgICAgICA9IC0xOworCW5mc19kYXRhLnZlcnNpb24gID0gTkZTX01PVU5UX1ZFUlNJT047CisJbmZzX2RhdGEuZmxhZ3MgICAgPSBORlNfTU9VTlRfTk9OTE07CS8qIE5vIGxvY2tkIGluIG5mcyByb290IHlldCAqLworCW5mc19kYXRhLnJzaXplICAgID0gTkZTX0RFRl9GSUxFX0lPX0JVRkZFUl9TSVpFOworCW5mc19kYXRhLndzaXplICAgID0gTkZTX0RFRl9GSUxFX0lPX0JVRkZFUl9TSVpFOworCW5mc19kYXRhLmFjcmVnbWluID0gMzsKKwluZnNfZGF0YS5hY3JlZ21heCA9IDYwOworCW5mc19kYXRhLmFjZGlybWluID0gMzA7CisJbmZzX2RhdGEuYWNkaXJtYXggPSA2MDsKKwlzdHJjcHkoYnVmLCBORlNfUk9PVCk7CisKKwkvKiBQcm9jZXNzIG9wdGlvbnMgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlIHNlcnZlciAqLworCXJvb3RfbmZzX3BhcnNlKHJvb3Rfc2VydmVyX3BhdGgsIGJ1Zik7CisKKwkvKiBPdmVycmlkZSB0aGVtIGJ5IG9wdGlvbnMgc2V0IG9uIGtlcm5lbCBjb21tYW5kLWxpbmUgKi8KKwlyb290X25mc19wYXJzZShuYW1lLCBidWYpOworCisJY3AgPSBzeXN0ZW1fdXRzbmFtZS5ub2RlbmFtZTsKKwlpZiAoc3RybGVuKGJ1ZikgKyBzdHJsZW4oY3ApID4gTkZTX01BWFBBVEhMRU4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJSb290LU5GUzogUGF0aG5hbWUgZm9yIHJlbW90ZSBkaXJlY3RvcnkgdG9vIGxvbmcuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzcHJpbnRmKG5mc19wYXRoLCBidWYsIGNwKTsKKworCXJldHVybiAxOworfQorCisKKy8qCisgKiAgR2V0IE5GUyBzZXJ2ZXIgYWRkcmVzcy4KKyAqLworc3RhdGljIGludCBfX2luaXQgcm9vdF9uZnNfYWRkcih2b2lkKQoreworCWlmICgoc2VydmFkZHIgPSByb290X3NlcnZlcl9hZGRyKSA9PSBJTkFERFJfTk9ORSkgeworCQlwcmludGsoS0VSTl9FUlIgIlJvb3QtTkZTOiBObyBORlMgc2VydmVyIGF2YWlsYWJsZSwgZ2l2aW5nIHVwLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzbnByaW50ZihuZnNfZGF0YS5ob3N0bmFtZSwgc2l6ZW9mKG5mc19kYXRhLmhvc3RuYW1lKSwKKwkJICIldS4ldS4ldS4ldSIsIE5JUFFVQUQoc2VydmFkZHIpKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBUZWxsIHRoZSB1c2VyIHdoYXQncyBnb2luZyBvbi4KKyAqLworI2lmZGVmIE5GU1JPT1RfREVCVUcKK3N0YXRpYyB2b2lkIF9faW5pdCByb290X25mc19wcmludCh2b2lkKQoreworCXByaW50ayhLRVJOX05PVElDRSAiUm9vdC1ORlM6IE1vdW50aW5nICVzIG9uIHNlcnZlciAlcyBhcyByb290XG4iLAorCQluZnNfcGF0aCwgbmZzX2RhdGEuaG9zdG5hbWUpOworCXByaW50ayhLRVJOX05PVElDRSAiUm9vdC1ORlM6ICAgICByc2l6ZSA9ICVkLCB3c2l6ZSA9ICVkLCB0aW1lbyA9ICVkLCByZXRyYW5zID0gJWRcbiIsCisJCW5mc19kYXRhLnJzaXplLCBuZnNfZGF0YS53c2l6ZSwgbmZzX2RhdGEudGltZW8sIG5mc19kYXRhLnJldHJhbnMpOworCXByaW50ayhLRVJOX05PVElDRSAiUm9vdC1ORlM6ICAgICBhY3JlZyAobWluLG1heCkgPSAoJWQsJWQpLCBhY2RpciAobWluLG1heCkgPSAoJWQsJWQpXG4iLAorCQluZnNfZGF0YS5hY3JlZ21pbiwgbmZzX2RhdGEuYWNyZWdtYXgsCisJCW5mc19kYXRhLmFjZGlybWluLCBuZnNfZGF0YS5hY2Rpcm1heCk7CisJcHJpbnRrKEtFUk5fTk9USUNFICJSb290LU5GUzogICAgIG5mc2QgcG9ydCA9ICVkLCBtb3VudGQgcG9ydCA9ICVkLCBmbGFncyA9ICUwOHhcbiIsCisJCW5mc19wb3J0LCBtb3VudF9wb3J0LCBuZnNfZGF0YS5mbGFncyk7Cit9CisjZW5kaWYKKworCitzdGF0aWMgaW50IF9faW5pdCByb290X25mc19pbml0KHZvaWQpCit7CisjaWZkZWYgTkZTUk9PVF9ERUJVRworCW5mc19kZWJ1ZyB8PSBORlNEQkdfUk9PVDsKKyNlbmRpZgorCisJLyoKKwkgKiBEZWNvZGUgdGhlIHJvb3QgZGlyZWN0b3J5IHBhdGggbmFtZSBhbmQgTkZTIG9wdGlvbnMgZnJvbQorCSAqIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiBUaGlzIGhhcyB0byBnbyBoZXJlIGluIG9yZGVyIHRvCisJICogYmUgYWJsZSB0byB1c2UgdGhlIGNsaWVudCBJUCBhZGRyZXNzIGZvciB0aGUgcmVtb3RlIHJvb3QKKwkgKiBkaXJlY3RvcnkgKG5lY2Vzc2FyeSBmb3IgcHVyZSBSQVJQIGJvb3RpbmcpLgorCSAqLworCWlmIChyb290X25mc19uYW1lKG5mc19yb290X25hbWUpIDwgMCB8fAorCSAgICByb290X25mc19hZGRyKCkgPCAwKQorCQlyZXR1cm4gLTE7CisKKyNpZmRlZiBORlNST09UX0RFQlVHCisJcm9vdF9uZnNfcHJpbnQoKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICBQYXJzZSBORlMgc2VydmVyIGFuZCBkaXJlY3RvcnkgaW5mb3JtYXRpb24gcGFzc2VkIG9uIHRoZSBrZXJuZWwKKyAqICBjb21tYW5kIGxpbmUuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IG5mc19yb290X3NldHVwKGNoYXIgKmxpbmUpCit7CisJUk9PVF9ERVYgPSBSb290X05GUzsKKwlpZiAobGluZVswXSA9PSAnLycgfHwgbGluZVswXSA9PSAnLCcgfHwgKGxpbmVbMF0gPj0gJzAnICYmIGxpbmVbMF0gPD0gJzknKSkgeworCQlzdHJsY3B5KG5mc19yb290X25hbWUsIGxpbmUsIHNpemVvZihuZnNfcm9vdF9uYW1lKSk7CisJfSBlbHNlIHsKKwkJaW50IG4gPSBzdHJsZW4obGluZSkgKyBzaXplb2YoTkZTX1JPT1QpIC0gMTsKKwkJaWYgKG4gPj0gc2l6ZW9mKG5mc19yb290X25hbWUpKQorCQkJbGluZVtzaXplb2YobmZzX3Jvb3RfbmFtZSkgLSBzaXplb2YoTkZTX1JPT1QpIC0gMl0gPSAnXDAnOworCQlzcHJpbnRmKG5mc19yb290X25hbWUsIE5GU19ST09ULCBsaW5lKTsKKwl9CisJcm9vdF9zZXJ2ZXJfYWRkciA9IHJvb3RfbmZzX3BhcnNlX2FkZHIobmZzX3Jvb3RfbmFtZSk7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoIm5mc3Jvb3Q9IiwgbmZzX3Jvb3Rfc2V0dXApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwkgICAgICAgUm91dGluZXMgdG8gYWN0dWFsbHkgbW91bnQgdGhlIHJvb3QgZGlyZWN0b3J5CisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiAgQ29uc3RydWN0IHNvY2thZGRyX2luIGZyb20gYWRkcmVzcyBhbmQgcG9ydCBudW1iZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc2V0X3NvY2thZGRyKHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luLCBfX3UzMiBhZGRyLCBfX3UxNiBwb3J0KQoreworCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBhZGRyOworCXNpbi0+c2luX3BvcnQgPSBwb3J0OworfQorCisvKgorICogIFF1ZXJ5IHNlcnZlciBwb3J0bWFwcGVyIGZvciB0aGUgcG9ydCBvZiBhIGRhZW1vbiBwcm9ncmFtLgorICovCitzdGF0aWMgaW50IF9faW5pdCByb290X25mc19nZXRwb3J0KGludCBwcm9ncmFtLCBpbnQgdmVyc2lvbiwgaW50IHByb3RvKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIkxvb2tpbmcgdXAgcG9ydCBvZiBSUEMgJWQvJWQgb24gJXUuJXUuJXUuJXVcbiIsCisJCXByb2dyYW0sIHZlcnNpb24sIE5JUFFVQUQoc2VydmFkZHIpKTsKKwlzZXRfc29ja2FkZHIoJnNpbiwgc2VydmFkZHIsIDApOworCXJldHVybiBycGNfZ2V0cG9ydF9leHRlcm5hbCgmc2luLCBwcm9ncmFtLCB2ZXJzaW9uLCBwcm90byk7Cit9CisKKworLyoKKyAqICBVc2UgcG9ydG1hcHBlciB0byBmaW5kIG1vdW50ZCBhbmQgbmZzZCBwb3J0IG51bWJlcnMgaWYgbm90IG92ZXJyaWRlbgorICogIGJ5IHRoZSB1c2VyLiBVc2UgZGVmYXVsdHMgaWYgcG9ydG1hcHBlciBpcyBub3QgYXZhaWxhYmxlLgorICogIFhYWDogSXMgdGhlcmUgYW55IG5mcyBzZXJ2ZXIgd2l0aCBubyBwb3J0bWFwcGVyPworICovCitzdGF0aWMgaW50IF9faW5pdCByb290X25mc19wb3J0cyh2b2lkKQoreworCWludCBwb3J0OworCWludCBuZnNkX3ZlciwgbW91bnRkX3ZlcjsKKwlpbnQgbmZzZF9wb3J0LCBtb3VudGRfcG9ydDsKKwlpbnQgcHJvdG87CisKKwlpZiAobmZzX2RhdGEuZmxhZ3MgJiBORlNfTU9VTlRfVkVSMykgeworCQluZnNkX3ZlciA9IE5GUzNfVkVSU0lPTjsKKwkJbW91bnRkX3ZlciA9IE5GU19NTlQzX1ZFUlNJT047CisJCW5mc2RfcG9ydCA9IE5GU19QT1JUOworCQltb3VudGRfcG9ydCA9IE5GU19NTlRfUE9SVDsKKwl9IGVsc2UgeworCQluZnNkX3ZlciA9IE5GUzJfVkVSU0lPTjsKKwkJbW91bnRkX3ZlciA9IE5GU19NTlRfVkVSU0lPTjsKKwkJbmZzZF9wb3J0ID0gTkZTX1BPUlQ7CisJCW1vdW50ZF9wb3J0ID0gTkZTX01OVF9QT1JUOworCX0KKworCXByb3RvID0gKG5mc19kYXRhLmZsYWdzICYgTkZTX01PVU5UX1RDUCkgPyBJUFBST1RPX1RDUCA6IElQUFJPVE9fVURQOworCisJaWYgKG5mc19wb3J0IDwgMCkgeworCQlpZiAoKHBvcnQgPSByb290X25mc19nZXRwb3J0KE5GU19QUk9HUkFNLCBuZnNkX3ZlciwgcHJvdG8pKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiUm9vdC1ORlM6IFVuYWJsZSB0byBnZXQgbmZzZCBwb3J0ICIKKwkJCQkJIm51bWJlciBmcm9tIHNlcnZlciwgdXNpbmcgZGVmYXVsdFxuIik7CisJCQlwb3J0ID0gbmZzZF9wb3J0OworCQl9CisJCW5mc19wb3J0ID0gaHRvbnMocG9ydCk7CisJCWRwcmludGsoIlJvb3QtTkZTOiBQb3J0bWFwcGVyIG9uIHNlcnZlciByZXR1cm5lZCAlZCAiCisJCQkiYXMgbmZzZCBwb3J0XG4iLCBwb3J0KTsKKwl9CisKKwlpZiAoKHBvcnQgPSByb290X25mc19nZXRwb3J0KE5GU19NTlRfUFJPR1JBTSwgbW91bnRkX3ZlciwgcHJvdG8pKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJSb290LU5GUzogVW5hYmxlIHRvIGdldCBtb3VudGQgcG9ydCAiCisJCQkJIm51bWJlciBmcm9tIHNlcnZlciwgdXNpbmcgZGVmYXVsdFxuIik7CisJCXBvcnQgPSBtb3VudGRfcG9ydDsKKwl9CisJbW91bnRfcG9ydCA9IGh0b25zKHBvcnQpOworCWRwcmludGsoIlJvb3QtTkZTOiBtb3VudGQgcG9ydCBpcyAlZFxuIiwgcG9ydCk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogIEdldCBhIGZpbGUgaGFuZGxlIGZyb20gdGhlIHNlcnZlciBmb3IgdGhlIGRpcmVjdG9yeSB3aGljaCBpcyB0byBiZQorICogIG1vdW50ZWQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX2dldF9oYW5kbGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmZzX2ZoIGZoOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJaW50IHN0YXR1czsKKwlpbnQgcHJvdG9jb2wgPSAobmZzX2RhdGEuZmxhZ3MgJiBORlNfTU9VTlRfVENQKSA/CisJCQkJCUlQUFJPVE9fVENQIDogSVBQUk9UT19VRFA7CisJaW50IHZlcnNpb24gPSAobmZzX2RhdGEuZmxhZ3MgJiBORlNfTU9VTlRfVkVSMykgPworCQkJCQlORlNfTU5UM19WRVJTSU9OIDogTkZTX01OVF9WRVJTSU9OOworCisJc2V0X3NvY2thZGRyKCZzaW4sIHNlcnZhZGRyLCBtb3VudF9wb3J0KTsKKwlzdGF0dXMgPSBuZnNyb290X21vdW50KCZzaW4sIG5mc19wYXRoLCAmZmgsIHZlcnNpb24sIHByb3RvY29sKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJSb290LU5GUzogU2VydmVyIHJldHVybmVkIGVycm9yICVkICIKKwkJCQkid2hpbGUgbW91bnRpbmcgJXNcbiIsIHN0YXR1cywgbmZzX3BhdGgpOworCWVsc2UgeworCQluZnNfZGF0YS5yb290LnNpemUgPSBmaC5zaXplOworCQltZW1jcHkobmZzX2RhdGEucm9vdC5kYXRhLCBmaC5kYXRhLCBmaC5zaXplKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogIEdldCB0aGUgTkZTIHBvcnQgbnVtYmVycyBhbmQgZmlsZSBoYW5kbGUsIGFuZCByZXR1cm4gdGhlIHByZXBhcmVkICdkYXRhJworICogIGFyZ3VtZW50IGZvciBtb3VudCgpIGlmIGV2ZXJ5dGhpbmcgd2VudCBPSy4gUmV0dXJuIE5VTEwgb3RoZXJ3aXNlLgorICovCit2b2lkICogX19pbml0IG5mc19yb290X2RhdGEodm9pZCkKK3sKKwlpZiAocm9vdF9uZnNfaW5pdCgpIDwgMAorCSB8fCByb290X25mc19wb3J0cygpIDwgMAorCSB8fCByb290X25mc19nZXRfaGFuZGxlKCkgPCAwKQorCQlyZXR1cm4gTlVMTDsKKwlzZXRfc29ja2FkZHIoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmbmZzX2RhdGEuYWRkciwgc2VydmFkZHIsIG5mc19wb3J0KTsKKwlyZXR1cm4gKHZvaWQqKSZuZnNfZGF0YTsKK30KZGlmZiAtLWdpdCBhL2ZzL25mcy9wYWdlbGlzdC5jIGIvZnMvbmZzL3BhZ2VsaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxYmE3MgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy9wYWdlbGlzdC5jCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogbGludXgvZnMvbmZzL3BhZ2VsaXN0LmMKKyAqCisgKiBBIHNldCBvZiBoZWxwZXIgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyBORlMgcmVhZCBhbmQgd3JpdGUgcmVxdWVzdHMuCisgKiBUaGUgbWFpbiBwdXJwb3NlIG9mIHRoZXNlIHJvdXRpbmVzIGlzIHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlCisgKiBjb2FsZXNjaW5nIG9mIHNldmVyYWwgcmVxdWVzdHMgaW50byBhIHNpbmdsZSBSUEMgY2FsbC4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMCwgMjAwMSAoYykgVHJvbmQgTXlrbGVidXN0IDx0cm9uZC5teWtsZWJ1c3RAZnlzLnVpby5ubz4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzNC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX21vdW50Lmg+CisKKyNkZWZpbmUgTkZTX1BBUkFOT0lBIDEKKworc3RhdGljIGttZW1fY2FjaGVfdCAqbmZzX3BhZ2VfY2FjaGVwOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnNfcGFnZSAqCituZnNfcGFnZV9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBuZnNfcGFnZQkqcDsKKwlwID0ga21lbV9jYWNoZV9hbGxvYyhuZnNfcGFnZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpZiAocCkgeworCQltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CisJCUlOSVRfTElTVF9IRUFEKCZwLT53Yl9saXN0KTsKKwl9CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbmZzX3BhZ2VfZnJlZShzdHJ1Y3QgbmZzX3BhZ2UgKnApCit7CisJa21lbV9jYWNoZV9mcmVlKG5mc19wYWdlX2NhY2hlcCwgcCk7Cit9CisKKy8qKgorICogbmZzX2NyZWF0ZV9yZXF1ZXN0IC0gQ3JlYXRlIGFuIE5GUyByZWFkL3dyaXRlIHJlcXVlc3QuCisgKiBAZmlsZTogZmlsZSBkZXNjcmlwdG9yIHRvIHVzZQorICogQGlub2RlOiBpbm9kZSB0byB3aGljaCB0aGUgcmVxdWVzdCBpcyBhdHRhY2hlZAorICogQHBhZ2U6IHBhZ2UgdG8gd3JpdGUKKyAqIEBvZmZzZXQ6IHN0YXJ0aW5nIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2UgZm9yIHRoZSB3cml0ZQorICogQGNvdW50OiBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC93cml0ZQorICoKKyAqIFRoZSBwYWdlIG11c3QgYmUgbG9ja2VkIGJ5IHRoZSBjYWxsZXIuIFRoaXMgbWFrZXMgc3VyZSB3ZSBuZXZlcgorICogY3JlYXRlIHR3byBkaWZmZXJlbnQgcmVxdWVzdHMgZm9yIHRoZSBzYW1lIHBhZ2UsIGFuZCBhdm9pZHMKKyAqIGEgcG9zc2libGUgZGVhZGxvY2sgd2hlbiB3ZSByZWFjaCB0aGUgaGFyZCBsaW1pdCBvbiB0aGUgbnVtYmVyCisgKiBvZiBkaXJ0eSBwYWdlcy4KKyAqIFVzZXIgc2hvdWxkIGVuc3VyZSBpdCBpcyBzYWZlIHRvIHNsZWVwIGluIHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0cnVjdCBuZnNfcGFnZSAqCituZnNfY3JlYXRlX3JlcXVlc3Qoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJICAgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCSAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihpbm9kZSk7CisJc3RydWN0IG5mc19wYWdlCQkqcmVxOworCisJLyogRGVhbCB3aXRoIGhhcmQgbGltaXRzLiAgKi8KKwlmb3IgKDs7KSB7CisJCS8qIHRyeSB0byBhbGxvY2F0ZSB0aGUgcmVxdWVzdCBzdHJ1Y3QgKi8KKwkJcmVxID0gbmZzX3BhZ2VfYWxsb2MoKTsKKwkJaWYgKHJlcSAhPSBOVUxMKQorCQkJYnJlYWs7CisKKwkJLyogVHJ5IHRvIGZyZWUgdXAgYXQgbGVhc3Qgb25lIHJlcXVlc3QgaW4gb3JkZXIgdG8gc3RheQorCQkgKiBiZWxvdyB0aGUgaGFyZCBsaW1pdAorCQkgKi8KKwkJaWYgKHNpZ25hbGxlZCgpICYmIChzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX0lOVFIpKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVSRVNUQVJUU1lTKTsKKwkJeWllbGQoKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSByZXF1ZXN0IHN0cnVjdC4gSW5pdGlhbGx5LCB3ZSBhc3N1bWUgYQorCSAqIGxvbmcgd3JpdGUtYmFjayBkZWxheS4gVGhpcyB3aWxsIGJlIGFkanVzdGVkIGluCisJICogdXBkYXRlX25mc19yZXF1ZXN0IGJlbG93IGlmIHRoZSByZWdpb24gaXMgbm90IGxvY2tlZC4gKi8KKwlyZXEtPndiX3BhZ2UgICAgPSBwYWdlOworCWF0b21pY19zZXQoJnJlcS0+d2JfY29tcGxldGUsIDApOworCXJlcS0+d2JfaW5kZXgJPSBwYWdlLT5pbmRleDsKKwlwYWdlX2NhY2hlX2dldChwYWdlKTsKKwlyZXEtPndiX29mZnNldCAgPSBvZmZzZXQ7CisJcmVxLT53Yl9wZ2Jhc2UJPSBvZmZzZXQ7CisJcmVxLT53Yl9ieXRlcyAgID0gY291bnQ7CisJYXRvbWljX3NldCgmcmVxLT53Yl9jb3VudCwgMSk7CisJcmVxLT53Yl9jb250ZXh0ID0gZ2V0X25mc19vcGVuX2NvbnRleHQoY3R4KTsKKworCXJldHVybiByZXE7Cit9CisKKy8qKgorICogbmZzX3VubG9ja19yZXF1ZXN0IC0gVW5sb2NrIHJlcXVlc3QgYW5kIHdha2UgdXAgc2xlZXBlcnMuCisgKiBAcmVxOgorICovCit2b2lkIG5mc191bmxvY2tfcmVxdWVzdChzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSkKK3sKKwlpZiAoIU5GU19XQkFDS19CVVNZKHJlcSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJORlM6IEludmFsaWQgdW5sb2NrIGF0dGVtcHRlZFxuIik7CisJCUJVRygpOworCX0KKwlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsKKwljbGVhcl9iaXQoUEdfQlVTWSwgJnJlcS0+d2JfZmxhZ3MpOworCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7CisJd2FrZV91cF9hbGwoJnJlcS0+d2JfY29udGV4dC0+d2FpdHEpOworCW5mc19yZWxlYXNlX3JlcXVlc3QocmVxKTsKK30KKworLyoqCisgKiBuZnNfY2xlYXJfcmVxdWVzdCAtIEZyZWUgdXAgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgdG8gdGhlIHJlcXVlc3QKKyAqIEByZXE6CisgKgorICogUmVsZWFzZSBwYWdlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSB3cml0ZSByZXF1ZXN0IGFmdGVyIGl0CisgKiBoYXMgY29tcGxldGVkLgorICovCit2b2lkIG5mc19jbGVhcl9yZXF1ZXN0KHN0cnVjdCBuZnNfcGFnZSAqcmVxKQoreworCWlmIChyZXEtPndiX3BhZ2UpIHsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHJlcS0+d2JfcGFnZSk7CisJCXJlcS0+d2JfcGFnZSA9IE5VTEw7CisJfQorfQorCisKKy8qKgorICogbmZzX3JlbGVhc2VfcmVxdWVzdCAtIFJlbGVhc2UgdGhlIGNvdW50IG9uIGFuIE5GUyByZWFkL3dyaXRlIHJlcXVlc3QKKyAqIEByZXE6IHJlcXVlc3QgdG8gcmVsZWFzZQorICoKKyAqIE5vdGU6IFNob3VsZCBuZXZlciBiZSBjYWxsZWQgd2l0aCB0aGUgc3BpbmxvY2sgaGVsZCEKKyAqLwordm9pZAorbmZzX3JlbGVhc2VfcmVxdWVzdChzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSkKK3sKKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJnJlcS0+d2JfY291bnQpKQorCQlyZXR1cm47CisKKyNpZmRlZiBORlNfUEFSQU5PSUEKKwlCVUdfT04gKCFsaXN0X2VtcHR5KCZyZXEtPndiX2xpc3QpKTsKKwlCVUdfT04gKE5GU19XQkFDS19CVVNZKHJlcSkpOworI2VuZGlmCisKKwkvKiBSZWxlYXNlIHN0cnVjdCBmaWxlIG9yIGNhY2hlZCBjcmVkZW50aWFsICovCisJbmZzX2NsZWFyX3JlcXVlc3QocmVxKTsKKwlwdXRfbmZzX29wZW5fY29udGV4dChyZXEtPndiX2NvbnRleHQpOworCW5mc19wYWdlX2ZyZWUocmVxKTsKK30KKworLyoqCisgKiBuZnNfbGlzdF9hZGRfcmVxdWVzdCAtIEluc2VydCBhIHJlcXVlc3QgaW50byBhIHNvcnRlZCBsaXN0CisgKiBAcmVxOiByZXF1ZXN0CisgKiBAaGVhZDogaGVhZCBvZiBsaXN0IGludG8gd2hpY2ggdG8gaW5zZXJ0IHRoZSByZXF1ZXN0LgorICoKKyAqIE5vdGUgdGhhdCB0aGUgd2JfbGlzdCBpcyBzb3J0ZWQgYnkgcGFnZSBpbmRleCBpbiBvcmRlciB0byBmYWNpbGl0YXRlCisgKiBjb2FsZXNjaW5nIG9mIHJlcXVlc3RzLgorICogV2UgdXNlIGFuIGluc2VydGlvbiBzb3J0IHRoYXQgaXMgb3B0aW1pemVkIGZvciB0aGUgY2FzZSBvZiBhcHBlbmRlZAorICogd3JpdGVzLgorICovCit2b2lkCituZnNfbGlzdF9hZGRfcmVxdWVzdChzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisKKyNpZmRlZiBORlNfUEFSQU5PSUEKKwlpZiAoIWxpc3RfZW1wdHkoJnJlcS0+d2JfbGlzdCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJORlM6IEFkZCB0byBsaXN0IGZhaWxlZCFcbiIpOworCQlCVUcoKTsKKwl9CisjZW5kaWYKKwlsaXN0X2Zvcl9lYWNoX3ByZXYocG9zLCBoZWFkKSB7CisJCXN0cnVjdCBuZnNfcGFnZQkqcCA9IG5mc19saXN0X2VudHJ5KHBvcyk7CisJCWlmIChwLT53Yl9pbmRleCA8IHJlcS0+d2JfaW5kZXgpCisJCQlicmVhazsKKwl9CisJbGlzdF9hZGQoJnJlcS0+d2JfbGlzdCwgcG9zKTsKKwlyZXEtPndiX2xpc3RfaGVhZCA9IGhlYWQ7Cit9CisKKy8qKgorICogbmZzX3dhaXRfb25fcmVxdWVzdCAtIFdhaXQgZm9yIGEgcmVxdWVzdCB0byBjb21wbGV0ZS4KKyAqIEByZXE6IHJlcXVlc3QgdG8gd2FpdCB1cG9uLgorICoKKyAqIEludGVycnVwdGlibGUgYnkgc2lnbmFscyBvbmx5IGlmIG1vdW50ZWQgd2l0aCBpbnRyIGZsYWcuCisgKiBUaGUgdXNlciBpcyByZXNwb25zaWJsZSBmb3IgaG9sZGluZyBhIGNvdW50IG9uIHRoZSByZXF1ZXN0LgorICovCitpbnQKK25mc193YWl0X29uX3JlcXVlc3Qoc3RydWN0IG5mc19wYWdlICpyZXEpCit7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IHJlcS0+d2JfY29udGV4dC0+ZGVudHJ5LT5kX2lub2RlOworICAgICAgICBzdHJ1Y3QgcnBjX2NsbnQJKmNsbnQgPSBORlNfQ0xJRU5UKGlub2RlKTsKKworCWlmICghTkZTX1dCQUNLX0JVU1kocmVxKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIG5mc193YWl0X2V2ZW50KGNsbnQsIHJlcS0+d2JfY29udGV4dC0+d2FpdHEsICFORlNfV0JBQ0tfQlVTWShyZXEpKTsKK30KKworLyoqCisgKiBuZnNfY29hbGVzY2VfcmVxdWVzdHMgLSBTcGxpdCBjb2FsZXNjZWQgcmVxdWVzdHMgb3V0IGZyb20gYSBsaXN0LgorICogQGhlYWQ6IHNvdXJjZSBsaXN0CisgKiBAZHN0OiBkZXN0aW5hdGlvbiBsaXN0CisgKiBAbm1heDogbWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgdG8gY29hbGVzY2UKKyAqCisgKiBNb3ZlcyBhIG1heGltdW0gb2YgJ25tYXgnIGVsZW1lbnRzIGZyb20gb25lIGxpc3QgdG8gYW5vdGhlci4KKyAqIFRoZSBlbGVtZW50cyBhcmUgY2hlY2tlZCB0byBlbnN1cmUgdGhhdCB0aGV5IGZvcm0gYSBjb250aWd1b3VzIHNldAorICogb2YgcGFnZXMsIGFuZCB0aGF0IHRoZSBSUEMgY3JlZGVudGlhbHMgYXJlIHRoZSBzYW1lLgorICovCitpbnQKK25mc19jb2FsZXNjZV9yZXF1ZXN0cyhzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBzdHJ1Y3QgbGlzdF9oZWFkICpkc3QsCisJCSAgICAgIHVuc2lnbmVkIGludCBubWF4KQoreworCXN0cnVjdCBuZnNfcGFnZQkJKnJlcSA9IE5VTEw7CisJdW5zaWduZWQgaW50CQlucGFnZXMgPSAwOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KGhlYWQpKSB7CisJCXN0cnVjdCBuZnNfcGFnZQkqcHJldiA9IHJlcTsKKworCQlyZXEgPSBuZnNfbGlzdF9lbnRyeShoZWFkLT5uZXh0KTsKKwkJaWYgKHByZXYpIHsKKwkJCWlmIChyZXEtPndiX2NvbnRleHQtPmNyZWQgIT0gcHJldi0+d2JfY29udGV4dC0+Y3JlZCkKKwkJCQlicmVhazsKKwkJCWlmIChyZXEtPndiX2NvbnRleHQtPmxvY2tvd25lciAhPSBwcmV2LT53Yl9jb250ZXh0LT5sb2Nrb3duZXIpCisJCQkJYnJlYWs7CisJCQlpZiAocmVxLT53Yl9jb250ZXh0LT5zdGF0ZSAhPSBwcmV2LT53Yl9jb250ZXh0LT5zdGF0ZSkKKwkJCQlicmVhazsKKwkJCWlmIChyZXEtPndiX2luZGV4ICE9IChwcmV2LT53Yl9pbmRleCArIDEpKQorCQkJCWJyZWFrOworCisJCQlpZiAocmVxLT53Yl9wZ2Jhc2UgIT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQluZnNfbGlzdF9yZW1vdmVfcmVxdWVzdChyZXEpOworCQluZnNfbGlzdF9hZGRfcmVxdWVzdChyZXEsIGRzdCk7CisJCW5wYWdlcysrOworCQlpZiAocmVxLT53Yl9wZ2Jhc2UgKyByZXEtPndiX2J5dGVzICE9IFBBR0VfQ0FDSEVfU0laRSkKKwkJCWJyZWFrOworCQlpZiAobnBhZ2VzID49IG5tYXgpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIG5wYWdlczsKK30KKworLyoqCisgKiBuZnNfc2Nhbl9saXN0IC0gU2NhbiBhIGxpc3QgZm9yIG1hdGNoaW5nIHJlcXVlc3RzCisgKiBAaGVhZDogT25lIG9mIHRoZSBORlMgaW5vZGUgcmVxdWVzdCBsaXN0cworICogQGRzdDogRGVzdGluYXRpb24gbGlzdAorICogQGlkeF9zdGFydDogbG93ZXIgYm91bmQgb2YgcGFnZS0+aW5kZXggdG8gc2NhbgorICogQG5wYWdlczogaWR4X3N0YXJ0ICsgbnBhZ2VzIHNldHMgdGhlIHVwcGVyIGJvdW5kIHRvIHNjYW4uCisgKgorICogTW92ZXMgZWxlbWVudHMgZnJvbSBvbmUgb2YgdGhlIGlub2RlIHJlcXVlc3QgbGlzdHMuCisgKiBJZiB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIGlzIHNldCB0byAwLCB0aGUgZW50aXJlIGFkZHJlc3Nfc3BhY2UKKyAqIHN0YXJ0aW5nIGF0IGluZGV4IGlkeF9zdGFydCwgaXMgc2Nhbm5lZC4KKyAqIFRoZSByZXF1ZXN0cyBhcmUgKm5vdCogY2hlY2tlZCB0byBlbnN1cmUgdGhhdCB0aGV5IGZvcm0gYSBjb250aWd1b3VzIHNldC4KKyAqIFlvdSBtdXN0IGJlIGhvbGRpbmcgdGhlIGlub2RlJ3MgcmVxX2xvY2sgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKyAqLworaW50CituZnNfc2Nhbl9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBsaXN0X2hlYWQgKmRzdCwKKwkgICAgICB1bnNpZ25lZCBsb25nIGlkeF9zdGFydCwgdW5zaWduZWQgaW50IG5wYWdlcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCSpwb3MsICp0bXA7CisJc3RydWN0IG5mc19wYWdlCQkqcmVxOworCXVuc2lnbmVkIGxvbmcJCWlkeF9lbmQ7CisJaW50CQkJcmVzOworCisJcmVzID0gMDsKKwlpZiAobnBhZ2VzID09IDApCisJCWlkeF9lbmQgPSB+MDsKKwllbHNlCisJCWlkeF9lbmQgPSBpZHhfc3RhcnQgKyBucGFnZXMgLSAxOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCBoZWFkKSB7CisKKwkJcmVxID0gbmZzX2xpc3RfZW50cnkocG9zKTsKKworCQlpZiAocmVxLT53Yl9pbmRleCA8IGlkeF9zdGFydCkKKwkJCWNvbnRpbnVlOworCQlpZiAocmVxLT53Yl9pbmRleCA+IGlkeF9lbmQpCisJCQlicmVhazsKKworCQlpZiAoIW5mc19sb2NrX3JlcXVlc3QocmVxKSkKKwkJCWNvbnRpbnVlOworCQluZnNfbGlzdF9yZW1vdmVfcmVxdWVzdChyZXEpOworCQluZnNfbGlzdF9hZGRfcmVxdWVzdChyZXEsIGRzdCk7CisJCXJlcysrOworCX0KKwlyZXR1cm4gcmVzOworfQorCitpbnQgbmZzX2luaXRfbmZzcGFnZWNhY2hlKHZvaWQpCit7CisJbmZzX3BhZ2VfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoIm5mc19wYWdlIiwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgbmZzX3BhZ2UpLAorCQkJCQkgICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLAorCQkJCQkgICAgTlVMTCwgTlVMTCk7CisJaWYgKG5mc19wYWdlX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCit2b2lkIG5mc19kZXN0cm95X25mc3BhZ2VjYWNoZSh2b2lkKQoreworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kobmZzX3BhZ2VfY2FjaGVwKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAibmZzX3BhZ2U6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvbmZzL3Byb2MuYyBiL2ZzL25mcy9wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMxYjRkNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy9wcm9jLmMKQEAgLTAsMCArMSw2NTUgQEAKKy8qCisgKiAgbGludXgvZnMvbmZzL3Byb2MuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQgIFJpY2sgU2xhZGtleQorICoKKyAqICBPUy1pbmRlcGVuZGVudCBuZnMgcmVtb3RlIHByb2NlZHVyZSBjYWxsIGZ1bmN0aW9ucworICoKKyAqICBUdW5lZCBieSBBbGFuIENveCA8QS5Db3hAc3dhbnNlYS5hYy51az4gZm9yID4zSyBidWZmZXJzCisgKiAgc28gYXQgbGFzdCB3ZSBjYW4gaGF2ZSBkZWNlbnQoaXNoKSB0aHJvdWdocHV0IG9mZiBhIAorICogIFN1biBzZXJ2ZXIuCisgKgorICogIENvZGluZyBvcHRpbWl6ZWQgYW5kIGNsZWFuZWQgdXAgYnkgRmxvcmlhbiBMYSBSb2NoZS4KKyAqICBOb3RlOiBFcnJvciByZXR1cm5zIGFyZSBvcHRpbWl6ZWQgZm9yIE5GU19PSywgd2hpY2ggaXNuJ3QgdHJhbnNsYXRlZCB2aWEKKyAqICBuZnNfc3RhdF90b19lcnJubygpLCBidXQgaGFwcGVucyB0byBiZSBhbHJlYWR5IHRoZSByaWdodCByZXR1cm4gY29kZS4KKyAqCisgKiAgQWxzbywgdGhlIGNvZGUgY3VycmVudGx5IGRvZXNuJ3QgY2hlY2sgdGhlIHNpemUgb2YgdGhlIHBhY2tldCwgd2hlbgorICogIGl0IGRlY29kZXMgdGhlIHBhY2tldC4KKyAqCisgKiAgRmVlbCBmcmVlIHRvIGZpeCBpdCBhbmQgbWFpbCBtZSB0aGUgZGlmZnMgaWYgaXQgd29ycmllcyB5b3UuCisgKgorICogIENvbXBsZXRlbHkgcmV3cml0dGVuIHRvIHN1cHBvcnQgdGhlIG5ldyBSUEMgY2FsbCBpbnRlcmZhY2U7CisgKiAgcmV3cm90ZSBhbmQgbW92ZWQgdGhlIGVudGlyZSBYRFIgc3R1ZmYgdG8geGRyLmMKKyAqICAtLU9sYWYgS2lyY2ggSnVuZSAxOTk2CisgKgorICogIFRoZSBjb2RlIGJlbG93IGluaXRpYWxpemVzIGFsbCBhdXRvIHZhcmlhYmxlcyBleHBsaWNpdGx5LCBvdGhlcndpc2UKKyAqICBpdCB3aWxsIGZhaWwgdG8gd29yayBhcyBhIG1vZHVsZSAoZ2NjIGdlbmVyYXRlcyBhIG1lbXNldCBjYWxsIGZvciBhbgorICogIGluY29tcGxldGUgc3RydWN0KS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L25mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mczIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfcGFnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2JpbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWQkJTkZTREJHX1BST0MKKworZXh0ZXJuIHN0cnVjdCBycGNfcHJvY2luZm8gbmZzX3Byb2NlZHVyZXNbXTsKKworLyoKKyAqIEJhcmUtYm9uZXMgYWNjZXNzIHRvIGdldGF0dHI6IHRoaXMgaXMgZm9yIG5mc19yZWFkX3N1cGVyLgorICovCitzdGF0aWMgaW50CituZnNfcHJvY19nZXRfcm9vdChzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQkgIHN0cnVjdCBuZnNfZnNpbmZvICppbmZvKQoreworCXN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyID0gaW5mby0+ZmF0dHI7CisJc3RydWN0IG5mczJfZnNzdGF0IGZzaW5mbzsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygiJXM6IGNhbGwgZ2V0YXR0clxuIiwgX19GVU5DVElPTl9fKTsKKwlmYXR0ci0+dmFsaWQgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsKHNlcnZlci0+Y2xpZW50X3N5cywgTkZTUFJPQ19HRVRBVFRSLCBmaGFuZGxlLCBmYXR0ciwgMCk7CisJZHByaW50aygiJXM6IHJlcGx5IGdldGF0dHI6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKwlkcHJpbnRrKCIlczogY2FsbCBzdGF0ZnNcbiIsIF9fRlVOQ1RJT05fXyk7CisJc3RhdHVzID0gcnBjX2NhbGwoc2VydmVyLT5jbGllbnRfc3lzLCBORlNQUk9DX1NUQVRGUywgZmhhbmRsZSwgJmZzaW5mbywgMCk7CisJZHByaW50aygiJXM6IHJlcGx5IHN0YXRmczogJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCWluZm8tPnJ0bWF4ICA9IE5GU19NQVhEQVRBOworCWluZm8tPnJ0cHJlZiA9IGZzaW5mby50c2l6ZTsKKwlpbmZvLT5ydG11bHQgPSBmc2luZm8uYnNpemU7CisJaW5mby0+d3RtYXggID0gTkZTX01BWERBVEE7CisJaW5mby0+d3RwcmVmID0gZnNpbmZvLnRzaXplOworCWluZm8tPnd0bXVsdCA9IGZzaW5mby5ic2l6ZTsKKwlpbmZvLT5kdHByZWYgPSBmc2luZm8udHNpemU7CisJaW5mby0+bWF4ZmlsZXNpemUgPSAweDdGRkZGRkZGOworCWluZm8tPmxlYXNlX3RpbWUgPSAwOworCXJldHVybiAwOworfQorCisvKgorICogT25lIGZ1bmN0aW9uIGZvciBlYWNoIHByb2NlZHVyZSBpbiB0aGUgTkZTIHByb3RvY29sLgorICovCitzdGF0aWMgaW50CituZnNfcHJvY19nZXRhdHRyKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUsCisJCXN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCWludAlzdGF0dXM7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgZ2V0YXR0clxuIik7CisJZmF0dHItPnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbChzZXJ2ZXItPmNsaWVudCwgTkZTUFJPQ19HRVRBVFRSLAorCQkJCWZoYW5kbGUsIGZhdHRyLCAwKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgZ2V0YXR0cjogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmZzX3Byb2Nfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyLAorCQkgc3RydWN0IGlhdHRyICpzYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBuZnNfc2F0dHJhcmdzCWFyZyA9IHsgCisJCS5maAk9IE5GU19GSChpbm9kZSksCisJCS5zYXR0cgk9IHNhdHRyCisJfTsKKwlpbnQJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIHNldGF0dHJcbiIpOworCWZhdHRyLT52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGwoTkZTX0NMSUVOVChpbm9kZSksIE5GU1BST0NfU0VUQVRUUiwgJmFyZywgZmF0dHIsIDApOworCWRwcmludGsoIk5GUyByZXBseSBzZXRhdHRyOiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CituZnNfcHJvY19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBxc3RyICpuYW1lLAorCQlzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlzdHJ1Y3QgbmZzX2Rpcm9wYXJncwlhcmcgPSB7CisJCS5maAkJPSBORlNfRkgoZGlyKSwKKwkJLm5hbWUJCT0gbmFtZS0+bmFtZSwKKwkJLmxlbgkJPSBuYW1lLT5sZW4KKwl9OworCXN0cnVjdCBuZnNfZGlyb3BvawlyZXMgPSB7CisJCS5maAkJPSBmaGFuZGxlLAorCQkuZmF0dHIJCT0gZmF0dHIKKwl9OworCWludAkJCXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICBsb29rdXAgJXNcbiIsIG5hbWUtPm5hbWUpOworCWZhdHRyLT52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGwoTkZTX0NMSUVOVChkaXIpLCBORlNQUk9DX0xPT0tVUCwgJmFyZywgJnJlcywgMCk7CisJZHByaW50aygiTkZTIHJlcGx5IGxvb2t1cDogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBuZnNfcHJvY19yZWFkbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJdW5zaWduZWQgaW50IHBnYmFzZSwgdW5zaWduZWQgaW50IHBnbGVuKQoreworCXN0cnVjdCBuZnNfcmVhZGxpbmthcmdzCWFyZ3MgPSB7CisJCS5maAkJPSBORlNfRkgoaW5vZGUpLAorCQkucGdiYXNlCQk9IHBnYmFzZSwKKwkJLnBnbGVuCQk9IHBnbGVuLAorCQkucGFnZXMJCT0gJnBhZ2UKKwl9OworCWludAkJCXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICByZWFkbGlua1xuIik7CisJc3RhdHVzID0gcnBjX2NhbGwoTkZTX0NMSUVOVChpbm9kZSksIE5GU1BST0NfUkVBRExJTkssICZhcmdzLCBOVUxMLCAwKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgcmVhZGxpbms6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbmZzX3Byb2NfcmVhZChzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqcmRhdGEpCit7CisJaW50CQkJZmxhZ3MgPSByZGF0YS0+ZmxhZ3M7CisJc3RydWN0IGlub2RlICoJCWlub2RlID0gcmRhdGEtPmlub2RlOworCXN0cnVjdCBuZnNfZmF0dHIgKglmYXR0ciA9IHJkYXRhLT5yZXMuZmF0dHI7CisJc3RydWN0IHJwY19tZXNzYWdlCW1zZyA9IHsKKwkJLnJwY19wcm9jCT0gJm5mc19wcm9jZWR1cmVzW05GU1BST0NfUkVBRF0sCisJCS5ycGNfYXJncAk9ICZyZGF0YS0+YXJncywKKwkJLnJwY19yZXNwCT0gJnJkYXRhLT5yZXMsCisJCS5ycGNfY3JlZAk9IHJkYXRhLT5jcmVkLAorCX07CisJaW50CQkJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIHJlYWQgJWQgQCAlTGRcbiIsIHJkYXRhLT5hcmdzLmNvdW50LAorCQkJKGxvbmcgbG9uZykgcmRhdGEtPmFyZ3Mub2Zmc2V0KTsKKwlmYXR0ci0+dmFsaWQgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoTkZTX0NMSUVOVChpbm9kZSksICZtc2csIGZsYWdzKTsKKwlpZiAoc3RhdHVzID49IDApIHsKKwkJbmZzX3JlZnJlc2hfaW5vZGUoaW5vZGUsIGZhdHRyKTsKKwkJLyogRW11bGF0ZSB0aGUgZW9mIGZsYWcsIHdoaWNoIGlzbid0IG5vcm1hbGx5IG5lZWRlZCBpbiBORlN2MgorCQkgKiBhcyBpdCBpcyBndWFyYW50ZWVkIHRvIGFsd2F5cyByZXR1cm4gdGhlIGZpbGUgYXR0cmlidXRlcworCQkgKi8KKwkJaWYgKHJkYXRhLT5hcmdzLm9mZnNldCArIHJkYXRhLT5hcmdzLmNvdW50ID49IGZhdHRyLT5zaXplKQorCQkJcmRhdGEtPnJlcy5lb2YgPSAxOworCX0KKwlkcHJpbnRrKCJORlMgcmVwbHkgcmVhZDogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBuZnNfcHJvY193cml0ZShzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKndkYXRhKQoreworCWludAkJCWZsYWdzID0gd2RhdGEtPmZsYWdzOworCXN0cnVjdCBpbm9kZSAqCQlpbm9kZSA9IHdkYXRhLT5pbm9kZTsKKwlzdHJ1Y3QgbmZzX2ZhdHRyICoJZmF0dHIgPSB3ZGF0YS0+cmVzLmZhdHRyOworCXN0cnVjdCBycGNfbWVzc2FnZQltc2cgPSB7CisJCS5ycGNfcHJvYwk9ICZuZnNfcHJvY2VkdXJlc1tORlNQUk9DX1dSSVRFXSwKKwkJLnJwY19hcmdwCT0gJndkYXRhLT5hcmdzLAorCQkucnBjX3Jlc3AJPSAmd2RhdGEtPnJlcywKKwkJLnJwY19jcmVkCT0gd2RhdGEtPmNyZWQsCisJfTsKKwlpbnQJCQlzdGF0dXM7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgd3JpdGUgJWQgQCAlTGRcbiIsIHdkYXRhLT5hcmdzLmNvdW50LAorCQkJKGxvbmcgbG9uZykgd2RhdGEtPmFyZ3Mub2Zmc2V0KTsKKwlmYXR0ci0+dmFsaWQgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoTkZTX0NMSUVOVChpbm9kZSksICZtc2csIGZsYWdzKTsKKwlpZiAoc3RhdHVzID49IDApIHsKKwkJbmZzX3JlZnJlc2hfaW5vZGUoaW5vZGUsIGZhdHRyKTsKKwkJd2RhdGEtPnJlcy5jb3VudCA9IHdkYXRhLT5hcmdzLmNvdW50OworCQl3ZGF0YS0+dmVyZi5jb21taXR0ZWQgPSBORlNfRklMRV9TWU5DOworCX0KKwlkcHJpbnRrKCJORlMgcmVwbHkgd3JpdGU6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXMgPCAwPyBzdGF0dXMgOiB3ZGF0YS0+cmVzLmNvdW50OworfQorCitzdGF0aWMgaW50CituZnNfcHJvY19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICpzYXR0ciwKKwkJaW50IGZsYWdzKQoreworCXN0cnVjdCBuZnNfZmgJCWZoYW5kbGU7CisJc3RydWN0IG5mc19mYXR0cglmYXR0cjsKKwlzdHJ1Y3QgbmZzX2NyZWF0ZWFyZ3MJYXJnID0geworCQkuZmgJCT0gTkZTX0ZIKGRpciksCisJCS5uYW1lCQk9IGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCS5sZW4JCT0gZGVudHJ5LT5kX25hbWUubGVuLAorCQkuc2F0dHIJCT0gc2F0dHIKKwl9OworCXN0cnVjdCBuZnNfZGlyb3BvawlyZXMgPSB7CisJCS5maAkJPSAmZmhhbmRsZSwKKwkJLmZhdHRyCQk9ICZmYXR0cgorCX07CisJaW50CQkJc3RhdHVzOworCisJZmF0dHIudmFsaWQgPSAwOworCWRwcmludGsoIk5GUyBjYWxsICBjcmVhdGUgJXNcbiIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCXN0YXR1cyA9IHJwY19jYWxsKE5GU19DTElFTlQoZGlyKSwgTkZTUFJPQ19DUkVBVEUsICZhcmcsICZyZXMsIDApOworCWlmIChzdGF0dXMgPT0gMCkKKwkJc3RhdHVzID0gbmZzX2luc3RhbnRpYXRlKGRlbnRyeSwgJmZoYW5kbGUsICZmYXR0cik7CisJZHByaW50aygiTkZTIHJlcGx5IGNyZWF0ZTogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEluIE5GU3YyLCBta25vZCBpcyBncmFmdGVkIG9udG8gdGhlIGNyZWF0ZSBjYWxsLgorICovCitzdGF0aWMgaW50CituZnNfcHJvY19ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKnNhdHRyLAorCSAgICAgICBkZXZfdCByZGV2KQoreworCXN0cnVjdCBuZnNfZmggZmhhbmRsZTsKKwlzdHJ1Y3QgbmZzX2ZhdHRyIGZhdHRyOworCXN0cnVjdCBuZnNfY3JlYXRlYXJncwlhcmcgPSB7CisJCS5maAkJPSBORlNfRkgoZGlyKSwKKwkJLm5hbWUJCT0gZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJLmxlbgkJPSBkZW50cnktPmRfbmFtZS5sZW4sCisJCS5zYXR0cgkJPSBzYXR0cgorCX07CisJc3RydWN0IG5mc19kaXJvcG9rCXJlcyA9IHsKKwkJLmZoCQk9ICZmaGFuZGxlLAorCQkuZmF0dHIJCT0gJmZhdHRyCisJfTsKKwlpbnQgc3RhdHVzLCBtb2RlOworCisJZHByaW50aygiTkZTIGNhbGwgIG1rbm9kICVzXG4iLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCW1vZGUgPSBzYXR0ci0+aWFfbW9kZTsKKwlpZiAoU19JU0ZJRk8obW9kZSkpIHsKKwkJc2F0dHItPmlhX21vZGUgPSAobW9kZSAmIH5TX0lGTVQpIHwgU19JRkNIUjsKKwkJc2F0dHItPmlhX3ZhbGlkICY9IH5BVFRSX1NJWkU7CisJfSBlbHNlIGlmIChTX0lTQ0hSKG1vZGUpIHx8IFNfSVNCTEsobW9kZSkpIHsKKwkJc2F0dHItPmlhX3ZhbGlkIHw9IEFUVFJfU0laRTsKKwkJc2F0dHItPmlhX3NpemUgPSBuZXdfZW5jb2RlX2RldihyZGV2KTsvKiBnZXQgb3V0IHlvdXIgYmFyZiBiYWcgKi8KKwl9CisKKwlmYXR0ci52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGwoTkZTX0NMSUVOVChkaXIpLCBORlNQUk9DX0NSRUFURSwgJmFyZywgJnJlcywgMCk7CisKKwlpZiAoc3RhdHVzID09IC1FSU5WQUwgJiYgU19JU0ZJRk8obW9kZSkpIHsKKwkJc2F0dHItPmlhX21vZGUgPSBtb2RlOworCQlmYXR0ci52YWxpZCA9IDA7CisJCXN0YXR1cyA9IHJwY19jYWxsKE5GU19DTElFTlQoZGlyKSwgTkZTUFJPQ19DUkVBVEUsICZhcmcsICZyZXMsIDApOworCX0KKwlpZiAoc3RhdHVzID09IDApCisJCXN0YXR1cyA9IG5mc19pbnN0YW50aWF0ZShkZW50cnksICZmaGFuZGxlLCAmZmF0dHIpOworCWRwcmludGsoIk5GUyByZXBseSBta25vZDogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKyAgCitzdGF0aWMgaW50CituZnNfcHJvY19yZW1vdmUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBxc3RyICpuYW1lKQoreworCXN0cnVjdCBuZnNfZGlyb3BhcmdzCWFyZyA9IHsKKwkJLmZoCQk9IE5GU19GSChkaXIpLAorCQkubmFtZQkJPSBuYW1lLT5uYW1lLAorCQkubGVuCQk9IG5hbWUtPmxlbgorCX07CisJc3RydWN0IHJwY19tZXNzYWdlCW1zZyA9IHsgCisJCS5ycGNfcHJvYwk9ICZuZnNfcHJvY2VkdXJlc1tORlNQUk9DX1JFTU9WRV0sCisJCS5ycGNfYXJncAk9ICZhcmcsCisJCS5ycGNfcmVzcAk9IE5VTEwsCisJCS5ycGNfY3JlZAk9IE5VTEwKKwl9OworCWludAkJCXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICByZW1vdmUgJXNcbiIsIG5hbWUtPm5hbWUpOworCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoTkZTX0NMSUVOVChkaXIpLCAmbXNnLCAwKTsKKworCWRwcmludGsoIk5GUyByZXBseSByZW1vdmU6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mc19wcm9jX3VubGlua19zZXR1cChzdHJ1Y3QgcnBjX21lc3NhZ2UgKm1zZywgc3RydWN0IGRlbnRyeSAqZGlyLCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmZzX2Rpcm9wYXJncwkqYXJnOworCisJYXJnID0gKHN0cnVjdCBuZnNfZGlyb3BhcmdzICopa21hbGxvYyhzaXplb2YoKmFyZyksIEdGUF9LRVJORUwpOworCWlmICghYXJnKQorCQlyZXR1cm4gLUVOT01FTTsKKwlhcmctPmZoID0gTkZTX0ZIKGRpci0+ZF9pbm9kZSk7CisJYXJnLT5uYW1lID0gbmFtZS0+bmFtZTsKKwlhcmctPmxlbiA9IG5hbWUtPmxlbjsKKwltc2ctPnJwY19wcm9jID0gJm5mc19wcm9jZWR1cmVzW05GU1BST0NfUkVNT1ZFXTsKKwltc2ctPnJwY19hcmdwID0gYXJnOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CituZnNfcHJvY191bmxpbmtfZG9uZShzdHJ1Y3QgZGVudHJ5ICpkaXIsIHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgKm1zZyA9ICZ0YXNrLT50a19tc2c7CisJCisJaWYgKG1zZy0+cnBjX2FyZ3ApCisJCWtmcmVlKG1zZy0+cnBjX2FyZ3ApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CituZnNfcHJvY19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgcXN0ciAqb2xkX25hbWUsCisJCXN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IHFzdHIgKm5ld19uYW1lKQoreworCXN0cnVjdCBuZnNfcmVuYW1lYXJncwlhcmcgPSB7CisJCS5mcm9tZmgJCT0gTkZTX0ZIKG9sZF9kaXIpLAorCQkuZnJvbW5hbWUJPSBvbGRfbmFtZS0+bmFtZSwKKwkJLmZyb21sZW4JPSBvbGRfbmFtZS0+bGVuLAorCQkudG9maAkJPSBORlNfRkgobmV3X2RpciksCisJCS50b25hbWUJCT0gbmV3X25hbWUtPm5hbWUsCisJCS50b2xlbgkJPSBuZXdfbmFtZS0+bGVuCisJfTsKKwlpbnQJCQlzdGF0dXM7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgcmVuYW1lICVzIC0+ICVzXG4iLCBvbGRfbmFtZS0+bmFtZSwgbmV3X25hbWUtPm5hbWUpOworCXN0YXR1cyA9IHJwY19jYWxsKE5GU19DTElFTlQob2xkX2RpciksIE5GU1BST0NfUkVOQU1FLCAmYXJnLCBOVUxMLCAwKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgcmVuYW1lOiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CituZnNfcHJvY19saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmZzX2xpbmthcmdzCWFyZyA9IHsKKwkJLmZyb21maAkJPSBORlNfRkgoaW5vZGUpLAorCQkudG9maAkJPSBORlNfRkgoZGlyKSwKKwkJLnRvbmFtZQkJPSBuYW1lLT5uYW1lLAorCQkudG9sZW4JCT0gbmFtZS0+bGVuCisJfTsKKwlpbnQJCQlzdGF0dXM7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgbGluayAlc1xuIiwgbmFtZS0+bmFtZSk7CisJc3RhdHVzID0gcnBjX2NhbGwoTkZTX0NMSUVOVChpbm9kZSksIE5GU1BST0NfTElOSywgJmFyZywgTlVMTCwgMCk7CisJZHByaW50aygiTkZTIHJlcGx5IGxpbms6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mc19wcm9jX3N5bWxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBxc3RyICpuYW1lLCBzdHJ1Y3QgcXN0ciAqcGF0aCwKKwkJIHN0cnVjdCBpYXR0ciAqc2F0dHIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUsCisJCSBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlzdHJ1Y3QgbmZzX3N5bWxpbmthcmdzCWFyZyA9IHsKKwkJLmZyb21maAkJPSBORlNfRkgoZGlyKSwKKwkJLmZyb21uYW1lCT0gbmFtZS0+bmFtZSwKKwkJLmZyb21sZW4JPSBuYW1lLT5sZW4sCisJCS50b3BhdGgJCT0gcGF0aC0+bmFtZSwKKwkJLnRvbGVuCQk9IHBhdGgtPmxlbiwKKwkJLnNhdHRyCQk9IHNhdHRyCisJfTsKKwlpbnQJCQlzdGF0dXM7CisKKwlpZiAocGF0aC0+bGVuID4gTkZTMl9NQVhQQVRITEVOKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwlkcHJpbnRrKCJORlMgY2FsbCAgc3ltbGluayAlcyAtPiAlc1xuIiwgbmFtZS0+bmFtZSwgcGF0aC0+bmFtZSk7CisJZmF0dHItPnZhbGlkID0gMDsKKwlmaGFuZGxlLT5zaXplID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbChORlNfQ0xJRU5UKGRpciksIE5GU1BST0NfU1lNTElOSywgJmFyZywgTlVMTCwgMCk7CisJZHByaW50aygiTkZTIHJlcGx5IHN5bWxpbms6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mc19wcm9jX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqc2F0dHIpCit7CisJc3RydWN0IG5mc19maCBmaGFuZGxlOworCXN0cnVjdCBuZnNfZmF0dHIgZmF0dHI7CisJc3RydWN0IG5mc19jcmVhdGVhcmdzCWFyZyA9IHsKKwkJLmZoCQk9IE5GU19GSChkaXIpLAorCQkubmFtZQkJPSBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkubGVuCQk9IGRlbnRyeS0+ZF9uYW1lLmxlbiwKKwkJLnNhdHRyCQk9IHNhdHRyCisJfTsKKwlzdHJ1Y3QgbmZzX2Rpcm9wb2sJcmVzID0geworCQkuZmgJCT0gJmZoYW5kbGUsCisJCS5mYXR0cgkJPSAmZmF0dHIKKwl9OworCWludAkJCXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICBta2RpciAlc1xuIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJZmF0dHIudmFsaWQgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsKE5GU19DTElFTlQoZGlyKSwgTkZTUFJPQ19NS0RJUiwgJmFyZywgJnJlcywgMCk7CisJaWYgKHN0YXR1cyA9PSAwKQorCQlzdGF0dXMgPSBuZnNfaW5zdGFudGlhdGUoZGVudHJ5LCAmZmhhbmRsZSwgJmZhdHRyKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgbWtkaXI6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mc19wcm9jX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmZzX2Rpcm9wYXJncwlhcmcgPSB7CisJCS5maAkJPSBORlNfRkgoZGlyKSwKKwkJLm5hbWUJCT0gbmFtZS0+bmFtZSwKKwkJLmxlbgkJPSBuYW1lLT5sZW4KKwl9OworCWludAkJCXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICBybWRpciAlc1xuIiwgbmFtZS0+bmFtZSk7CisJc3RhdHVzID0gcnBjX2NhbGwoTkZTX0NMSUVOVChkaXIpLCBORlNQUk9DX1JNRElSLCAmYXJnLCBOVUxMLCAwKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgcm1kaXI6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBUaGUgUkVBRERJUiBpbXBsZW1lbnRhdGlvbiBpcyBzb21ld2hhdCBoYWNraXNoIC0gd2UgcGFzcyBhIHRlbXBvcmFyeQorICogYnVmZmVyIHRvIHRoZSBlbmNvZGUgZnVuY3Rpb24sIHdoaWNoIGluc3RhbGxzIGl0IGluIHRoZSByZWNlaXZlCisgKiB0aGUgcmVjZWl2ZSBpb3ZlYy4gVGhlIGRlY29kZSBmdW5jdGlvbiBqdXN0IHBhcnNlcyB0aGUgcmVwbHkgdG8gbWFrZQorICogc3VyZSBpdCBpcyBzeW50YWN0aWNhbGx5IGNvcnJlY3Q7IHRoZSBlbnRyaWVzIGl0c2VsZiBhcmUgZGVjb2RlZAorICogZnJvbSBuZnNfcmVhZGRpciBieSBjYWxsaW5nIHRoZSBkZWNvZGVfZW50cnkgZnVuY3Rpb24gZGlyZWN0bHkuCisgKi8KK3N0YXRpYyBpbnQKK25mc19wcm9jX3JlYWRkaXIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsCisJCSB1NjQgY29va2llLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IGNvdW50LCBpbnQgcGx1cykKK3sKKwlzdHJ1Y3QgaW5vZGUJCSpkaXIgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5mc19yZWFkZGlyYXJncwlhcmcgPSB7CisJCS5maAkJPSBORlNfRkgoZGlyKSwKKwkJLmNvb2tpZQkJPSBjb29raWUsCisJCS5jb3VudAkJPSBjb3VudCwKKwkJLnBhZ2VzCQk9ICZwYWdlCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UJbXNnID0geworCQkucnBjX3Byb2MJPSAmbmZzX3Byb2NlZHVyZXNbTkZTUFJPQ19SRUFERElSXSwKKwkJLnJwY19hcmdwCT0gJmFyZywKKwkJLnJwY19yZXNwCT0gTlVMTCwKKwkJLnJwY19jcmVkCT0gY3JlZAorCX07CisJaW50CQkJc3RhdHVzOworCisJbG9ja19rZXJuZWwoKTsKKworCWRwcmludGsoIk5GUyBjYWxsICByZWFkZGlyICVkXG4iLCAodW5zaWduZWQgaW50KWNvb2tpZSk7CisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKGRpciksICZtc2csIDApOworCisJZHByaW50aygiTkZTIHJlcGx5IHJlYWRkaXI6ICVkXG4iLCBzdGF0dXMpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CituZnNfcHJvY19zdGF0ZnMoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwKKwkJCXN0cnVjdCBuZnNfZnNzdGF0ICpzdGF0KQoreworCXN0cnVjdCBuZnMyX2Zzc3RhdCBmc2luZm87CisJaW50CXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICBzdGF0ZnNcbiIpOworCXN0YXQtPmZhdHRyLT52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGwoc2VydmVyLT5jbGllbnQsIE5GU1BST0NfU1RBVEZTLCBmaGFuZGxlLCAmZnNpbmZvLCAwKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgc3RhdGZzOiAlZFxuIiwgc3RhdHVzKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0LT50Ynl0ZXMgPSAodTY0KWZzaW5mby5ibG9ja3MgKiBmc2luZm8uYnNpemU7CisJc3RhdC0+ZmJ5dGVzID0gKHU2NClmc2luZm8uYmZyZWUgICogZnNpbmZvLmJzaXplOworCXN0YXQtPmFieXRlcyA9ICh1NjQpZnNpbmZvLmJhdmFpbCAqIGZzaW5mby5ic2l6ZTsKKwlzdGF0LT50ZmlsZXMgPSAwOworCXN0YXQtPmZmaWxlcyA9IDA7CisJc3RhdC0+YWZpbGVzID0gMDsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CituZnNfcHJvY19mc2luZm8oc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwKKwkJCXN0cnVjdCBuZnNfZnNpbmZvICppbmZvKQoreworCXN0cnVjdCBuZnMyX2Zzc3RhdCBmc2luZm87CisJaW50CXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICBmc2luZm9cbiIpOworCWluZm8tPmZhdHRyLT52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGwoc2VydmVyLT5jbGllbnQsIE5GU1BST0NfU1RBVEZTLCBmaGFuZGxlLCAmZnNpbmZvLCAwKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgZnNpbmZvOiAlZFxuIiwgc3RhdHVzKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlpbmZvLT5ydG1heCAgPSBORlNfTUFYREFUQTsKKwlpbmZvLT5ydHByZWYgPSBmc2luZm8udHNpemU7CisJaW5mby0+cnRtdWx0ID0gZnNpbmZvLmJzaXplOworCWluZm8tPnd0bWF4ICA9IE5GU19NQVhEQVRBOworCWluZm8tPnd0cHJlZiA9IGZzaW5mby50c2l6ZTsKKwlpbmZvLT53dG11bHQgPSBmc2luZm8uYnNpemU7CisJaW5mby0+ZHRwcmVmID0gZnNpbmZvLnRzaXplOworCWluZm8tPm1heGZpbGVzaXplID0gMHg3RkZGRkZGRjsKKwlpbmZvLT5sZWFzZV90aW1lID0gMDsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CituZnNfcHJvY19wYXRoY29uZihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQkgIHN0cnVjdCBuZnNfcGF0aGNvbmYgKmluZm8pCit7CisJaW5mby0+bWF4X2xpbmsgPSAwOworCWluZm8tPm1heF9uYW1lbGVuID0gTkZTMl9NQVhOQU1MRU47CisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiB1MzIgKiBuZnNfZGVjb2RlX2RpcmVudCh1MzIgKiwgc3RydWN0IG5mc19lbnRyeSAqLCBpbnQpOworCitzdGF0aWMgdm9pZAorbmZzX3JlYWRfZG9uZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGEgPSAoc3RydWN0IG5mc19yZWFkX2RhdGEgKikgdGFzay0+dGtfY2FsbGRhdGE7CisKKwlpZiAodGFzay0+dGtfc3RhdHVzID49IDApIHsKKwkJbmZzX3JlZnJlc2hfaW5vZGUoZGF0YS0+aW5vZGUsIGRhdGEtPnJlcy5mYXR0cik7CisJCS8qIEVtdWxhdGUgdGhlIGVvZiBmbGFnLCB3aGljaCBpc24ndCBub3JtYWxseSBuZWVkZWQgaW4gTkZTdjIKKwkJICogYXMgaXQgaXMgZ3VhcmFudGVlZCB0byBhbHdheXMgcmV0dXJuIHRoZSBmaWxlIGF0dHJpYnV0ZXMKKwkJICovCisJCWlmIChkYXRhLT5hcmdzLm9mZnNldCArIGRhdGEtPmFyZ3MuY291bnQgPj0gZGF0YS0+cmVzLmZhdHRyLT5zaXplKQorCQkJZGF0YS0+cmVzLmVvZiA9IDE7CisJfQorCW5mc19yZWFkcGFnZV9yZXN1bHQodGFzayk7Cit9CisKK3N0YXRpYyB2b2lkCituZnNfcHJvY19yZWFkX3NldHVwKHN0cnVjdCBuZnNfcmVhZF9kYXRhICpkYXRhKQoreworCXN0cnVjdCBycGNfdGFzawkJKnRhc2sgPSAmZGF0YS0+dGFzazsKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IGRhdGEtPmlub2RlOworCWludAkJCWZsYWdzOworCXN0cnVjdCBycGNfbWVzc2FnZQltc2cgPSB7CisJCS5ycGNfcHJvYwk9ICZuZnNfcHJvY2VkdXJlc1tORlNQUk9DX1JFQURdLAorCQkucnBjX2FyZ3AJPSAmZGF0YS0+YXJncywKKwkJLnJwY19yZXNwCT0gJmRhdGEtPnJlcywKKwkJLnJwY19jcmVkCT0gZGF0YS0+Y3JlZCwKKwl9OworCisJLyogTi5CLiBEbyB3ZSBuZWVkIHRvIHRlc3Q/IE5ldmVyIGNhbGxlZCBmb3Igc3dhcGZpbGUgaW5vZGUgKi8KKwlmbGFncyA9IFJQQ19UQVNLX0FTWU5DIHwgKElTX1NXQVBGSUxFKGlub2RlKT8gTkZTX1JQQ19TV0FQRkxBR1MgOiAwKTsKKworCS8qIEZpbmFsaXplIHRoZSB0YXNrLiAqLworCXJwY19pbml0X3Rhc2sodGFzaywgTkZTX0NMSUVOVChpbm9kZSksIG5mc19yZWFkX2RvbmUsIGZsYWdzKTsKKwlycGNfY2FsbF9zZXR1cCh0YXNrLCAmbXNnLCAwKTsKK30KKworc3RhdGljIHZvaWQKK25mc193cml0ZV9kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKmRhdGEgPSAoc3RydWN0IG5mc193cml0ZV9kYXRhICopIHRhc2stPnRrX2NhbGxkYXRhOworCisJaWYgKHRhc2stPnRrX3N0YXR1cyA+PSAwKQorCQluZnNfcmVmcmVzaF9pbm9kZShkYXRhLT5pbm9kZSwgZGF0YS0+cmVzLmZhdHRyKTsKKwluZnNfd3JpdGViYWNrX2RvbmUodGFzayk7Cit9CisKK3N0YXRpYyB2b2lkCituZnNfcHJvY193cml0ZV9zZXR1cChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKmRhdGEsIGludCBob3cpCit7CisJc3RydWN0IHJwY190YXNrCQkqdGFzayA9ICZkYXRhLT50YXNrOworCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gZGF0YS0+aW5vZGU7CisJaW50CQkJZmxhZ3M7CisJc3RydWN0IHJwY19tZXNzYWdlCW1zZyA9IHsKKwkJLnJwY19wcm9jCT0gJm5mc19wcm9jZWR1cmVzW05GU1BST0NfV1JJVEVdLAorCQkucnBjX2FyZ3AJPSAmZGF0YS0+YXJncywKKwkJLnJwY19yZXNwCT0gJmRhdGEtPnJlcywKKwkJLnJwY19jcmVkCT0gZGF0YS0+Y3JlZCwKKwl9OworCisJLyogTm90ZTogTkZTdjIgaWdub3JlcyBAc3RhYmxlIGFuZCBhbHdheXMgdXNlcyBORlNfRklMRV9TWU5DICovCisJZGF0YS0+YXJncy5zdGFibGUgPSBORlNfRklMRV9TWU5DOworCisJLyogU2V0IHRoZSBpbml0aWFsIGZsYWdzIGZvciB0aGUgdGFzay4gICovCisJZmxhZ3MgPSAoaG93ICYgRkxVU0hfU1lOQykgPyAwIDogUlBDX1RBU0tfQVNZTkM7CisKKwkvKiBGaW5hbGl6ZSB0aGUgdGFzay4gKi8KKwlycGNfaW5pdF90YXNrKHRhc2ssIE5GU19DTElFTlQoaW5vZGUpLCBuZnNfd3JpdGVfZG9uZSwgZmxhZ3MpOworCXJwY19jYWxsX3NldHVwKHRhc2ssICZtc2csIDApOworfQorCitzdGF0aWMgdm9pZAorbmZzX3Byb2NfY29tbWl0X3NldHVwKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqZGF0YSwgaW50IGhvdykKK3sKKwlCVUcoKTsKK30KKworc3RhdGljIGludAorbmZzX3Byb2NfbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJcmV0dXJuIG5sbWNsbnRfcHJvYyhmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSwgY21kLCBmbCk7Cit9CisKKworc3RydWN0IG5mc19ycGNfb3BzCW5mc192Ml9jbGllbnRvcHMgPSB7CisJLnZlcnNpb24JPSAyLAkJICAgICAgIC8qIHByb3RvY29sIHZlcnNpb24gKi8KKwkuZGVudHJ5X29wcwk9ICZuZnNfZGVudHJ5X29wZXJhdGlvbnMsCisJLmRpcl9pbm9kZV9vcHMJPSAmbmZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zLAorCS5nZXRyb290CT0gbmZzX3Byb2NfZ2V0X3Jvb3QsCisJLmdldGF0dHIJPSBuZnNfcHJvY19nZXRhdHRyLAorCS5zZXRhdHRyCT0gbmZzX3Byb2Nfc2V0YXR0ciwKKwkubG9va3VwCQk9IG5mc19wcm9jX2xvb2t1cCwKKwkuYWNjZXNzCQk9IE5VTEwsCQkgICAgICAgLyogYWNjZXNzICovCisJLnJlYWRsaW5rCT0gbmZzX3Byb2NfcmVhZGxpbmssCisJLnJlYWQJCT0gbmZzX3Byb2NfcmVhZCwKKwkud3JpdGUJCT0gbmZzX3Byb2Nfd3JpdGUsCisJLmNvbW1pdAkJPSBOVUxMLAkJICAgICAgIC8qIGNvbW1pdCAqLworCS5jcmVhdGUJCT0gbmZzX3Byb2NfY3JlYXRlLAorCS5yZW1vdmUJCT0gbmZzX3Byb2NfcmVtb3ZlLAorCS51bmxpbmtfc2V0dXAJPSBuZnNfcHJvY191bmxpbmtfc2V0dXAsCisJLnVubGlua19kb25lCT0gbmZzX3Byb2NfdW5saW5rX2RvbmUsCisJLnJlbmFtZQkJPSBuZnNfcHJvY19yZW5hbWUsCisJLmxpbmsJCT0gbmZzX3Byb2NfbGluaywKKwkuc3ltbGluawk9IG5mc19wcm9jX3N5bWxpbmssCisJLm1rZGlyCQk9IG5mc19wcm9jX21rZGlyLAorCS5ybWRpcgkJPSBuZnNfcHJvY19ybWRpciwKKwkucmVhZGRpcgk9IG5mc19wcm9jX3JlYWRkaXIsCisJLm1rbm9kCQk9IG5mc19wcm9jX21rbm9kLAorCS5zdGF0ZnMJCT0gbmZzX3Byb2Nfc3RhdGZzLAorCS5mc2luZm8JCT0gbmZzX3Byb2NfZnNpbmZvLAorCS5wYXRoY29uZgk9IG5mc19wcm9jX3BhdGhjb25mLAorCS5kZWNvZGVfZGlyZW50CT0gbmZzX2RlY29kZV9kaXJlbnQsCisJLnJlYWRfc2V0dXAJPSBuZnNfcHJvY19yZWFkX3NldHVwLAorCS53cml0ZV9zZXR1cAk9IG5mc19wcm9jX3dyaXRlX3NldHVwLAorCS5jb21taXRfc2V0dXAJPSBuZnNfcHJvY19jb21taXRfc2V0dXAsCisJLmZpbGVfb3Blbgk9IG5mc19vcGVuLAorCS5maWxlX3JlbGVhc2UJPSBuZnNfcmVsZWFzZSwKKwkubG9jawkJPSBuZnNfcHJvY19sb2NrLAorfTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9yZWFkLmMgYi9mcy9uZnMvcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDQyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvcmVhZC5jCkBAIC0wLDAgKzEsNjE4IEBACisvKgorICogbGludXgvZnMvbmZzL3JlYWQuYworICoKKyAqIEJsb2NrIEkvTyBmb3IgTkZTCisgKgorICogUGFydGlhbCBjb3B5IG9mIExpbnVzJyByZWFkIGNhY2hlIG1vZGlmaWNhdGlvbnMgdG8gZnMvbmZzL2ZpbGUuYworICogbW9kaWZpZWQgZm9yIGFzeW5jIFJQQyBieSBva2lyQG1vbmFkLnN3Yi5kZQorICoKKyAqIFdlIGRvIGFuIHVnbHkgaGFjayBoZXJlIGluIG9yZGVyIHRvIHJldHVybiBwcm9wZXIgZXJyb3IgY29kZXMgdG8gdGhlCisgKiB1c2VyIHByb2dyYW0gd2hlbiBhIHJlYWQgcmVxdWVzdCBmYWlsZWQ6IHNpbmNlIGdlbmVyaWNfZmlsZV9yZWFkCisgKiBvbmx5IGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGlub2RlLT5pX29wLT5yZWFkcGFnZSgpIHdoaWNoIGlzIGFsd2F5cyAwCisgKiBmb3IgYXN5bmMgUlBDLCB3ZSBzZXQgdGhlIGVycm9yIGJpdCBvZiB0aGUgcGFnZSB0byAxIHdoZW4gYW4gZXJyb3Igb2NjdXJzLAorICogYW5kIG1ha2UgbmZzX3JlYWRwYWdlIHRyYW5zbWl0IHJlcXVlc3RzIHN5bmNocm9ub3VzbHkgd2hlbiBlbmNvdW50ZXJpbmcgdGhpcy4KKyAqIFRoaXMgaXMgb25seSBhIHNtYWxsIHByb2JsZW0sIHRob3VnaCwgc2luY2Ugd2Ugbm93IHJldHJ5IGFsbCBvcGVyYXRpb25zCisgKiB3aXRoaW4gdGhlIFJQQyBjb2RlIHdoZW4gcm9vdCBzcXVhc2hpbmcgaXMgc3VzcGVjdGVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfcGFnZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCQlORlNEQkdfUEFHRUNBQ0hFCisKK3N0YXRpYyBpbnQgbmZzX3BhZ2Vpbl9vbmUoc3RydWN0IGxpc3RfaGVhZCAqLCBzdHJ1Y3QgaW5vZGUgKik7CitzdGF0aWMgdm9pZCBuZnNfcmVhZHBhZ2VfcmVzdWx0X3BhcnRpYWwoc3RydWN0IG5mc19yZWFkX2RhdGEgKiwgaW50KTsKK3N0YXRpYyB2b2lkIG5mc19yZWFkcGFnZV9yZXN1bHRfZnVsbChzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqLCBpbnQpOworCitzdGF0aWMga21lbV9jYWNoZV90ICpuZnNfcmRhdGFfY2FjaGVwOworbWVtcG9vbF90ICpuZnNfcmRhdGFfbWVtcG9vbDsKKworI2RlZmluZSBNSU5fUE9PTF9SRUFECSgzMikKKwordm9pZCBuZnNfcmVhZGRhdGFfcmVsZWFzZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisgICAgICAgIHN0cnVjdCBuZnNfcmVhZF9kYXRhICAgKmRhdGEgPSAoc3RydWN0IG5mc19yZWFkX2RhdGEgKil0YXNrLT50a19jYWxsZGF0YTsKKyAgICAgICAgbmZzX3JlYWRkYXRhX2ZyZWUoZGF0YSk7Cit9CisKK3N0YXRpYwordW5zaWduZWQgaW50IG5mc19wYWdlX2xlbmd0aChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlsb2ZmX3QgaV9zaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCXVuc2lnbmVkIGxvbmcgaWR4OworCisJaWYgKGlfc2l6ZSA8PSAwKQorCQlyZXR1cm4gMDsKKwlpZHggPSAoaV9zaXplIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlpZiAocGFnZS0+aW5kZXggPiBpZHgpCisJCXJldHVybiAwOworCWlmIChwYWdlLT5pbmRleCAhPSBpZHgpCisJCXJldHVybiBQQUdFX0NBQ0hFX1NJWkU7CisJcmV0dXJuIDEgKyAoKGlfc2l6ZSAtIDEpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsKK30KKworc3RhdGljCitpbnQgbmZzX3JldHVybl9lbXB0eV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCW1lbWNsZWFyX2hpZ2hwYWdlX2ZsdXNoKHBhZ2UsIDAsIFBBR0VfQ0FDSEVfU0laRSk7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiAwOworfQorCisvKgorICogUmVhZCBhIHBhZ2Ugc3luY2hyb25vdXNseS4KKyAqLworc3RhdGljIGludCBuZnNfcmVhZHBhZ2Vfc3luYyhzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQlzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwl1bnNpZ25lZCBpbnQJcnNpemUgPSBORlNfU0VSVkVSKGlub2RlKS0+cnNpemU7CisJdW5zaWduZWQgaW50CWNvdW50ID0gUEFHRV9DQUNIRV9TSVpFOworCWludAkJcmVzdWx0OworCXN0cnVjdCBuZnNfcmVhZF9kYXRhICpyZGF0YTsKKworCXJkYXRhID0gbmZzX3JlYWRkYXRhX2FsbG9jKCk7CisJaWYgKCFyZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQocmRhdGEsIDAsIHNpemVvZigqcmRhdGEpKTsKKwlyZGF0YS0+ZmxhZ3MgPSAoSVNfU1dBUEZJTEUoaW5vZGUpPyBORlNfUlBDX1NXQVBGTEFHUyA6IDApOworCXJkYXRhLT5jcmVkID0gY3R4LT5jcmVkOworCXJkYXRhLT5pbm9kZSA9IGlub2RlOworCUlOSVRfTElTVF9IRUFEKCZyZGF0YS0+cGFnZXMpOworCXJkYXRhLT5hcmdzLmZoID0gTkZTX0ZIKGlub2RlKTsKKwlyZGF0YS0+YXJncy5jb250ZXh0ID0gY3R4OworCXJkYXRhLT5hcmdzLnBhZ2VzID0gJnBhZ2U7CisJcmRhdGEtPmFyZ3MucGdiYXNlID0gMFVMOworCXJkYXRhLT5hcmdzLmNvdW50ID0gcnNpemU7CisJcmRhdGEtPnJlcy5mYXR0ciA9ICZyZGF0YS0+ZmF0dHI7CisKKwlkcHJpbnRrKCJORlM6IG5mc19yZWFkcGFnZV9zeW5jKCVwKVxuIiwgcGFnZSk7CisKKwkvKgorCSAqIFRoaXMgd29ya3Mgbm93IGJlY2F1c2UgdGhlIHNvY2tldCBsYXllciBuZXZlciB0cmllcyB0byBETUEKKwkgKiBpbnRvIHRoaXMgYnVmZmVyIGRpcmVjdGx5LgorCSAqLworCWRvIHsKKwkJaWYgKGNvdW50IDwgcnNpemUpCisJCQlyZGF0YS0+YXJncy5jb3VudCA9IGNvdW50OworCQlyZGF0YS0+cmVzLmNvdW50ID0gcmRhdGEtPmFyZ3MuY291bnQ7CisJCXJkYXRhLT5hcmdzLm9mZnNldCA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpICsgcmRhdGEtPmFyZ3MucGdiYXNlOworCisJCWRwcmludGsoIk5GUzogbmZzX3Byb2NfcmVhZCglcywgKCVzLyVMZCksICVMdSwgJXUpXG4iLAorCQkJTkZTX1NFUlZFUihpbm9kZSktPmhvc3RuYW1lLAorCQkJaW5vZGUtPmlfc2ItPnNfaWQsCisJCQkobG9uZyBsb25nKU5GU19GSUxFSUQoaW5vZGUpLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZGF0YS0+YXJncy5wZ2Jhc2UsCisJCQlyZGF0YS0+YXJncy5jb3VudCk7CisKKwkJbG9ja19rZXJuZWwoKTsKKwkJcmVzdWx0ID0gTkZTX1BST1RPKGlub2RlKS0+cmVhZChyZGF0YSk7CisJCXVubG9ja19rZXJuZWwoKTsKKworCQkvKgorCQkgKiBFdmVuIGlmIHdlIGhhZCBhIHBhcnRpYWwgc3VjY2VzcyB3ZSBjYW4ndCBtYXJrIHRoZSBwYWdlCisJCSAqIGNhY2hlIHZhbGlkLgorCQkgKi8KKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWlmIChyZXN1bHQgPT0gLUVJU0RJUikKKwkJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBpb19lcnJvcjsKKwkJfQorCQljb3VudCAtPSByZXN1bHQ7CisJCXJkYXRhLT5hcmdzLnBnYmFzZSArPSByZXN1bHQ7CisJCS8qIE5vdGU6IHJlc3VsdCA9PSAwIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB3ZSdyZSBjYWNoaW5nCisJCSAqIGEgd3JpdGUgdGhhdCBleHRlbmRzIHRoZSBmaWxlIGFuZCBwdW5jaGVzIGEgaG9sZS4KKwkJICovCisJCWlmIChyZGF0YS0+cmVzLmVvZiAhPSAwIHx8IHJlc3VsdCA9PSAwKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoY291bnQpOworCU5GU19GTEFHUyhpbm9kZSkgfD0gTkZTX0lOT19JTlZBTElEX0FUSU1FOworCisJaWYgKGNvdW50KQorCQltZW1jbGVhcl9oaWdocGFnZV9mbHVzaChwYWdlLCByZGF0YS0+YXJncy5wZ2Jhc2UsIGNvdW50KTsKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJaWYgKFBhZ2VFcnJvcihwYWdlKSkKKwkJQ2xlYXJQYWdlRXJyb3IocGFnZSk7CisJcmVzdWx0ID0gMDsKKworaW9fZXJyb3I6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJbmZzX3JlYWRkYXRhX2ZyZWUocmRhdGEpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbmZzX3JlYWRwYWdlX2FzeW5jKHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCXN0cnVjdCBwYWdlICpwYWdlKQoreworCUxJU1RfSEVBRChvbmVfcmVxdWVzdCk7CisJc3RydWN0IG5mc19wYWdlCSpuZXc7CisJdW5zaWduZWQgaW50IGxlbjsKKworCWxlbiA9IG5mc19wYWdlX2xlbmd0aChpbm9kZSwgcGFnZSk7CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gbmZzX3JldHVybl9lbXB0eV9wYWdlKHBhZ2UpOworCW5ldyA9IG5mc19jcmVhdGVfcmVxdWVzdChjdHgsIGlub2RlLCBwYWdlLCAwLCBsZW4pOworCWlmIChJU19FUlIobmV3KSkgeworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJcmV0dXJuIFBUUl9FUlIobmV3KTsKKwl9CisJaWYgKGxlbiA8IFBBR0VfQ0FDSEVfU0laRSkKKwkJbWVtY2xlYXJfaGlnaHBhZ2VfZmx1c2gocGFnZSwgbGVuLCBQQUdFX0NBQ0hFX1NJWkUgLSBsZW4pOworCisJbmZzX2xvY2tfcmVxdWVzdChuZXcpOworCW5mc19saXN0X2FkZF9yZXF1ZXN0KG5ldywgJm9uZV9yZXF1ZXN0KTsKKwluZnNfcGFnZWluX29uZSgmb25lX3JlcXVlc3QsIGlub2RlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmZzX3JlYWRwYWdlX3JlbGVhc2Uoc3RydWN0IG5mc19wYWdlICpyZXEpCit7CisJdW5sb2NrX3BhZ2UocmVxLT53Yl9wYWdlKTsKKworCW5mc19jbGVhcl9yZXF1ZXN0KHJlcSk7CisJbmZzX3JlbGVhc2VfcmVxdWVzdChyZXEpOworCW5mc191bmxvY2tfcmVxdWVzdChyZXEpOworCisJZHByaW50aygiTkZTOiByZWFkIGRvbmUgKCVzLyVMZCAlZEAlTGQpXG4iLAorCQkJcmVxLT53Yl9jb250ZXh0LT5kZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfaWQsCisJCQkobG9uZyBsb25nKU5GU19GSUxFSUQocmVxLT53Yl9jb250ZXh0LT5kZW50cnktPmRfaW5vZGUpLAorCQkJcmVxLT53Yl9ieXRlcywKKwkJCShsb25nIGxvbmcpcmVxX29mZnNldChyZXEpKTsKK30KKworLyoKKyAqIFNldCB1cCB0aGUgTkZTIHJlYWQgcmVxdWVzdCBzdHJ1Y3QKKyAqLworc3RhdGljIHZvaWQgbmZzX3JlYWRfcnBjc2V0dXAoc3RydWN0IG5mc19wYWdlICpyZXEsIHN0cnVjdCBuZnNfcmVhZF9kYXRhICpkYXRhLAorCQl1bnNpZ25lZCBpbnQgY291bnQsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IGlub2RlCQkqaW5vZGU7CisKKwlkYXRhLT5yZXEJICA9IHJlcTsKKwlkYXRhLT5pbm9kZQkgID0gaW5vZGUgPSByZXEtPndiX2NvbnRleHQtPmRlbnRyeS0+ZF9pbm9kZTsKKwlkYXRhLT5jcmVkCSAgPSByZXEtPndiX2NvbnRleHQtPmNyZWQ7CisKKwlkYXRhLT5hcmdzLmZoICAgICA9IE5GU19GSChpbm9kZSk7CisJZGF0YS0+YXJncy5vZmZzZXQgPSByZXFfb2Zmc2V0KHJlcSkgKyBvZmZzZXQ7CisJZGF0YS0+YXJncy5wZ2Jhc2UgPSByZXEtPndiX3BnYmFzZSArIG9mZnNldDsKKwlkYXRhLT5hcmdzLnBhZ2VzICA9IGRhdGEtPnBhZ2V2ZWM7CisJZGF0YS0+YXJncy5jb3VudCAgPSBjb3VudDsKKwlkYXRhLT5hcmdzLmNvbnRleHQgPSByZXEtPndiX2NvbnRleHQ7CisKKwlkYXRhLT5yZXMuZmF0dHIgICA9ICZkYXRhLT5mYXR0cjsKKwlkYXRhLT5yZXMuY291bnQgICA9IGNvdW50OworCWRhdGEtPnJlcy5lb2YgICAgID0gMDsKKworCU5GU19QUk9UTyhpbm9kZSktPnJlYWRfc2V0dXAoZGF0YSk7CisKKwlkYXRhLT50YXNrLnRrX2Nvb2tpZSA9ICh1bnNpZ25lZCBsb25nKWlub2RlOworCWRhdGEtPnRhc2sudGtfY2FsbGRhdGEgPSBkYXRhOworCS8qIFJlbGVhc2UgcmVxdWVzdHMgKi8KKwlkYXRhLT50YXNrLnRrX3JlbGVhc2UgPSBuZnNfcmVhZGRhdGFfcmVsZWFzZTsKKworCWRwcmludGsoIk5GUzogJTRkIGluaXRpYXRlZCByZWFkIGNhbGwgKHJlcSAlcy8lTGQsICV1IGJ5dGVzIEAgb2Zmc2V0ICVMdSlcbiIsCisJCQlkYXRhLT50YXNrLnRrX3BpZCwKKwkJCWlub2RlLT5pX3NiLT5zX2lkLAorCQkJKGxvbmcgbG9uZylORlNfRklMRUlEKGlub2RlKSwKKwkJCWNvdW50LAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkYXRhLT5hcmdzLm9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkCituZnNfYXN5bmNfcmVhZF9lcnJvcihzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBuZnNfcGFnZQkqcmVxOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KGhlYWQpKSB7CisJCXJlcSA9IG5mc19saXN0X2VudHJ5KGhlYWQtPm5leHQpOworCQluZnNfbGlzdF9yZW1vdmVfcmVxdWVzdChyZXEpOworCQlTZXRQYWdlRXJyb3IocmVxLT53Yl9wYWdlKTsKKwkJbmZzX3JlYWRwYWdlX3JlbGVhc2UocmVxKTsKKwl9Cit9CisKKy8qCisgKiBTdGFydCBhbiBhc3luYyByZWFkIG9wZXJhdGlvbgorICovCitzdGF0aWMgdm9pZCBuZnNfZXhlY3V0ZV9yZWFkKHN0cnVjdCBuZnNfcmVhZF9kYXRhICpkYXRhKQoreworCXN0cnVjdCBycGNfY2xudCAqY2xudCA9IE5GU19DTElFTlQoZGF0YS0+aW5vZGUpOworCXNpZ3NldF90IG9sZHNldDsKKworCXJwY19jbG50X3NpZ21hc2soY2xudCwgJm9sZHNldCk7CisJbG9ja19rZXJuZWwoKTsKKwlycGNfZXhlY3V0ZSgmZGF0YS0+dGFzayk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJwY19jbG50X3NpZ3VubWFzayhjbG50LCAmb2xkc2V0KTsKK30KKworLyoKKyAqIEdlbmVyYXRlIG11bHRpcGxlIHJlcXVlc3RzIHRvIGZpbGwgYSBzaW5nbGUgcGFnZS4KKyAqCisgKiBXZSBvcHRpbWl6ZSB0byByZWR1Y2UgdGhlIG51bWJlciBvZiByZWFkIG9wZXJhdGlvbnMgb24gdGhlIHdpcmUuICBJZiB3ZQorICogZGV0ZWN0IHRoYXQgd2UncmUgcmVhZGluZyBhIHBhZ2UsIG9yIGFuIGFyZWEgb2YgYSBwYWdlLCB0aGF0IGlzIHBhc3QgdGhlCisgKiBlbmQgb2YgZmlsZSwgd2UgZG8gbm90IGdlbmVyYXRlIE5GUyByZWFkIG9wZXJhdGlvbnMgYnV0IGp1c3QgY2xlYXIgdGhlCisgKiBwYXJ0cyBvZiB0aGUgcGFnZSB0aGF0IHdvdWxkIGhhdmUgY29tZSBiYWNrIHplcm8gZnJvbSB0aGUgc2VydmVyIGFueXdheS4KKyAqCisgKiBXZSByZWx5IG9uIHRoZSBjYWNoZWQgdmFsdWUgb2YgaV9zaXplIHRvIG1ha2UgdGhpcyBkZXRlcm1pbmF0aW9uOyBhbm90aGVyCisgKiBjbGllbnQgY2FuIGZpbGwgcGFnZXMgb24gdGhlIHNlcnZlciBwYXN0IG91ciBjYWNoZWQgZW5kLW9mLWZpbGUsIGJ1dCB3ZQorICogd29uJ3Qgc2VlIHRoZSBuZXcgZGF0YSB1bnRpbCBvdXIgYXR0cmlidXRlIGNhY2hlIGlzIHVwZGF0ZWQuICBUaGlzIGlzIG1vcmUKKyAqIG9yIGxlc3MgY29udmVudGlvbmFsIE5GUyBjbGllbnQgYmVoYXZpb3IuCisgKi8KK3N0YXRpYyBpbnQgbmZzX3BhZ2Vpbl9tdWx0aShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBuZnNfcGFnZSAqcmVxID0gbmZzX2xpc3RfZW50cnkoaGVhZC0+bmV4dCk7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSByZXEtPndiX3BhZ2U7CisJc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGE7CisJdW5zaWduZWQgaW50IHJzaXplID0gTkZTX1NFUlZFUihpbm9kZSktPnJzaXplOworCXVuc2lnbmVkIGludCBuYnl0ZXMsIG9mZnNldDsKKwlpbnQgcmVxdWVzdHMgPSAwOworCUxJU1RfSEVBRChsaXN0KTsKKworCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7CisKKwluYnl0ZXMgPSByZXEtPndiX2J5dGVzOworCWZvcig7OykgeworCQlkYXRhID0gbmZzX3JlYWRkYXRhX2FsbG9jKCk7CisJCWlmICghZGF0YSkKKwkJCWdvdG8gb3V0X2JhZDsKKwkJSU5JVF9MSVNUX0hFQUQoJmRhdGEtPnBhZ2VzKTsKKwkJbGlzdF9hZGQoJmRhdGEtPnBhZ2VzLCAmbGlzdCk7CisJCXJlcXVlc3RzKys7CisJCWlmIChuYnl0ZXMgPD0gcnNpemUpCisJCQlicmVhazsKKwkJbmJ5dGVzIC09IHJzaXplOworCX0KKwlhdG9taWNfc2V0KCZyZXEtPndiX2NvbXBsZXRlLCByZXF1ZXN0cyk7CisKKwlDbGVhclBhZ2VFcnJvcihwYWdlKTsKKwlvZmZzZXQgPSAwOworCW5ieXRlcyA9IHJlcS0+d2JfYnl0ZXM7CisJZG8geworCQlkYXRhID0gbGlzdF9lbnRyeShsaXN0Lm5leHQsIHN0cnVjdCBuZnNfcmVhZF9kYXRhLCBwYWdlcyk7CisJCWxpc3RfZGVsX2luaXQoJmRhdGEtPnBhZ2VzKTsKKworCQlkYXRhLT5wYWdldmVjWzBdID0gcGFnZTsKKwkJZGF0YS0+Y29tcGxldGUgPSBuZnNfcmVhZHBhZ2VfcmVzdWx0X3BhcnRpYWw7CisKKwkJaWYgKG5ieXRlcyA+IHJzaXplKSB7CisJCQluZnNfcmVhZF9ycGNzZXR1cChyZXEsIGRhdGEsIHJzaXplLCBvZmZzZXQpOworCQkJb2Zmc2V0ICs9IHJzaXplOworCQkJbmJ5dGVzIC09IHJzaXplOworCQl9IGVsc2UgeworCQkJbmZzX3JlYWRfcnBjc2V0dXAocmVxLCBkYXRhLCBuYnl0ZXMsIG9mZnNldCk7CisJCQluYnl0ZXMgPSAwOworCQl9CisJCW5mc19leGVjdXRlX3JlYWQoZGF0YSk7CisJfSB3aGlsZSAobmJ5dGVzICE9IDApOworCisJcmV0dXJuIDA7CisKK291dF9iYWQ6CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZsaXN0KSkgeworCQlkYXRhID0gbGlzdF9lbnRyeShsaXN0Lm5leHQsIHN0cnVjdCBuZnNfcmVhZF9kYXRhLCBwYWdlcyk7CisJCWxpc3RfZGVsKCZkYXRhLT5wYWdlcyk7CisJCW5mc19yZWFkZGF0YV9mcmVlKGRhdGEpOworCX0KKwlTZXRQYWdlRXJyb3IocGFnZSk7CisJbmZzX3JlYWRwYWdlX3JlbGVhc2UocmVxKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludCBuZnNfcGFnZWluX29uZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBuZnNfcGFnZQkJKnJlcTsKKwlzdHJ1Y3QgcGFnZQkJKipwYWdlczsKKwlzdHJ1Y3QgbmZzX3JlYWRfZGF0YQkqZGF0YTsKKwl1bnNpZ25lZCBpbnQJCWNvdW50OworCisJaWYgKE5GU19TRVJWRVIoaW5vZGUpLT5yc2l6ZSA8IFBBR0VfQ0FDSEVfU0laRSkKKwkJcmV0dXJuIG5mc19wYWdlaW5fbXVsdGkoaGVhZCwgaW5vZGUpOworCisJZGF0YSA9IG5mc19yZWFkZGF0YV9hbGxvYygpOworCWlmICghZGF0YSkKKwkJZ290byBvdXRfYmFkOworCisJSU5JVF9MSVNUX0hFQUQoJmRhdGEtPnBhZ2VzKTsKKwlwYWdlcyA9IGRhdGEtPnBhZ2V2ZWM7CisJY291bnQgPSAwOworCXdoaWxlICghbGlzdF9lbXB0eShoZWFkKSkgeworCQlyZXEgPSBuZnNfbGlzdF9lbnRyeShoZWFkLT5uZXh0KTsKKwkJbmZzX2xpc3RfcmVtb3ZlX3JlcXVlc3QocmVxKTsKKwkJbmZzX2xpc3RfYWRkX3JlcXVlc3QocmVxLCAmZGF0YS0+cGFnZXMpOworCQlDbGVhclBhZ2VFcnJvcihyZXEtPndiX3BhZ2UpOworCQkqcGFnZXMrKyA9IHJlcS0+d2JfcGFnZTsKKwkJY291bnQgKz0gcmVxLT53Yl9ieXRlczsKKwl9CisJcmVxID0gbmZzX2xpc3RfZW50cnkoZGF0YS0+cGFnZXMubmV4dCk7CisKKwlkYXRhLT5jb21wbGV0ZSA9IG5mc19yZWFkcGFnZV9yZXN1bHRfZnVsbDsKKwluZnNfcmVhZF9ycGNzZXR1cChyZXEsIGRhdGEsIGNvdW50LCAwKTsKKworCW5mc19leGVjdXRlX3JlYWQoZGF0YSk7CisJcmV0dXJuIDA7CitvdXRfYmFkOgorCW5mc19hc3luY19yZWFkX2Vycm9yKGhlYWQpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50CituZnNfcGFnZWluX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgaW50IHJwYWdlcykKK3sKKwlMSVNUX0hFQUQob25lX3JlcXVlc3QpOworCXN0cnVjdCBuZnNfcGFnZQkJKnJlcTsKKwlpbnQJCQllcnJvciA9IDA7CisJdW5zaWduZWQgaW50CQlwYWdlcyA9IDA7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKKwkJcGFnZXMgKz0gbmZzX2NvYWxlc2NlX3JlcXVlc3RzKGhlYWQsICZvbmVfcmVxdWVzdCwgcnBhZ2VzKTsKKwkJcmVxID0gbmZzX2xpc3RfZW50cnkob25lX3JlcXVlc3QubmV4dCk7CisJCWVycm9yID0gbmZzX3BhZ2Vpbl9vbmUoJm9uZV9yZXF1ZXN0LCByZXEtPndiX2NvbnRleHQtPmRlbnRyeS0+ZF9pbm9kZSk7CisJCWlmIChlcnJvciA8IDApCisJCQlicmVhazsKKwl9CisJaWYgKGVycm9yID49IDApCisJCXJldHVybiBwYWdlczsKKworCW5mc19hc3luY19yZWFkX2Vycm9yKGhlYWQpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEhhbmRsZSBhIHJlYWQgcmVwbHkgdGhhdCBmaWxscyBwYXJ0IG9mIGEgcGFnZS4KKyAqLworc3RhdGljIHZvaWQgbmZzX3JlYWRwYWdlX3Jlc3VsdF9wYXJ0aWFsKHN0cnVjdCBuZnNfcmVhZF9kYXRhICpkYXRhLCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBuZnNfcGFnZSAqcmVxID0gZGF0YS0+cmVxOworCXN0cnVjdCBwYWdlICpwYWdlID0gcmVxLT53Yl9wYWdlOworIAorCWlmIChzdGF0dXMgPj0gMCkgeworCQl1bnNpZ25lZCBpbnQgcmVxdWVzdCA9IGRhdGEtPmFyZ3MuY291bnQ7CisJCXVuc2lnbmVkIGludCByZXN1bHQgPSBkYXRhLT5yZXMuY291bnQ7CisKKwkJaWYgKHJlc3VsdCA8IHJlcXVlc3QpIHsKKwkJCW1lbWNsZWFyX2hpZ2hwYWdlX2ZsdXNoKHBhZ2UsCisJCQkJCQlkYXRhLT5hcmdzLnBnYmFzZSArIHJlc3VsdCwKKwkJCQkJCXJlcXVlc3QgLSByZXN1bHQpOworCQl9CisJfSBlbHNlCisJCVNldFBhZ2VFcnJvcihwYWdlKTsKKworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZyZXEtPndiX2NvbXBsZXRlKSkgeworCQlpZiAoIVBhZ2VFcnJvcihwYWdlKSkKKwkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJbmZzX3JlYWRwYWdlX3JlbGVhc2UocmVxKTsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBjYWxsYmFjayBmcm9tIFJQQyB0ZWxsaW5nIHVzIHdoZXRoZXIgYSByZXBseSB3YXMKKyAqIHJlY2VpdmVkIG9yIHNvbWUgZXJyb3Igb2NjdXJyZWQgKHRpbWVvdXQgb3Igc29ja2V0IHNodXRkb3duKS4KKyAqLworc3RhdGljIHZvaWQgbmZzX3JlYWRwYWdlX3Jlc3VsdF9mdWxsKHN0cnVjdCBuZnNfcmVhZF9kYXRhICpkYXRhLCBpbnQgc3RhdHVzKQoreworCXVuc2lnbmVkIGludCBjb3VudCA9IGRhdGEtPnJlcy5jb3VudDsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmZGF0YS0+cGFnZXMpKSB7CisJCXN0cnVjdCBuZnNfcGFnZSAqcmVxID0gbmZzX2xpc3RfZW50cnkoZGF0YS0+cGFnZXMubmV4dCk7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gcmVxLT53Yl9wYWdlOworCQluZnNfbGlzdF9yZW1vdmVfcmVxdWVzdChyZXEpOworCisJCWlmIChzdGF0dXMgPj0gMCkgeworCQkJaWYgKGNvdW50IDwgUEFHRV9DQUNIRV9TSVpFKSB7CisJCQkJaWYgKGNvdW50IDwgcmVxLT53Yl9ieXRlcykKKwkJCQkJbWVtY2xlYXJfaGlnaHBhZ2VfZmx1c2gocGFnZSwKKwkJCQkJCQlyZXEtPndiX3BnYmFzZSArIGNvdW50LAorCQkJCQkJCXJlcS0+d2JfYnl0ZXMgLSBjb3VudCk7CisJCQkJY291bnQgPSAwOworCQkJfSBlbHNlCisJCQkJY291bnQgLT0gUEFHRV9DQUNIRV9TSVpFOworCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCQl9IGVsc2UKKwkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJbmZzX3JlYWRwYWdlX3JlbGVhc2UocmVxKTsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBjYWxsYmFjayBmcm9tIFJQQyB0ZWxsaW5nIHVzIHdoZXRoZXIgYSByZXBseSB3YXMKKyAqIHJlY2VpdmVkIG9yIHNvbWUgZXJyb3Igb2NjdXJyZWQgKHRpbWVvdXQgb3Igc29ja2V0IHNodXRkb3duKS4KKyAqLwordm9pZCBuZnNfcmVhZHBhZ2VfcmVzdWx0KHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqKXRhc2stPnRrX2NhbGxkYXRhOworCXN0cnVjdCBuZnNfcmVhZGFyZ3MgKmFyZ3AgPSAmZGF0YS0+YXJnczsKKwlzdHJ1Y3QgbmZzX3JlYWRyZXMgKnJlc3AgPSAmZGF0YS0+cmVzOworCWludCBzdGF0dXMgPSB0YXNrLT50a19zdGF0dXM7CisKKwlkcHJpbnRrKCJORlM6ICU0ZCBuZnNfcmVhZHBhZ2VfcmVzdWx0LCAoc3RhdHVzICVkKVxuIiwKKwkJdGFzay0+dGtfcGlkLCBzdGF0dXMpOworCisJLyogSXMgdGhpcyBhIHNob3J0IHJlYWQ/ICovCisJaWYgKHRhc2stPnRrX3N0YXR1cyA+PSAwICYmIHJlc3AtPmNvdW50IDwgYXJncC0+Y291bnQgJiYgIXJlc3AtPmVvZikgeworCQkvKiBIYXMgdGhlIHNlcnZlciBhdCBsZWFzdCBtYWRlIHNvbWUgcHJvZ3Jlc3M/ICovCisJCWlmIChyZXNwLT5jb3VudCAhPSAwKSB7CisJCQkvKiBZZXMsIHNvIHJldHJ5IHRoZSByZWFkIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEgKi8KKwkJCWFyZ3AtPm9mZnNldCArPSByZXNwLT5jb3VudDsKKwkJCWFyZ3AtPnBnYmFzZSArPSByZXNwLT5jb3VudDsKKwkJCWFyZ3AtPmNvdW50IC09IHJlc3AtPmNvdW50OworCQkJcnBjX3Jlc3RhcnRfY2FsbCh0YXNrKTsKKwkJCXJldHVybjsKKwkJfQorCQl0YXNrLT50a19zdGF0dXMgPSAtRUlPOworCX0KKwlORlNfRkxBR1MoZGF0YS0+aW5vZGUpIHw9IE5GU19JTk9fSU5WQUxJRF9BVElNRTsKKwlkYXRhLT5jb21wbGV0ZShkYXRhLCBzdGF0dXMpOworfQorCisvKgorICogUmVhZCBhIHBhZ2Ugb3ZlciBORlMuCisgKiBXZSByZWFkIHRoZSBwYWdlIHN5bmNocm9ub3VzbHkgaW4gdGhlIGZvbGxvd2luZyBjYXNlOgorICogIC0JVGhlIGVycm9yIGZsYWcgaXMgc2V0IGZvciB0aGlzIHBhZ2UuIFRoaXMgaGFwcGVucyBvbmx5IHdoZW4gYQorICoJcHJldmlvdXMgYXN5bmMgcmVhZCBvcGVyYXRpb24gZmFpbGVkLgorICovCitpbnQgbmZzX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCWludAkJZXJyb3I7CisKKwlkcHJpbnRrKCJORlM6IG5mc19yZWFkcGFnZSAoJXAgJWxkQCVsdSlcbiIsCisJCXBhZ2UsIFBBR0VfQ0FDSEVfU0laRSwgcGFnZS0+aW5kZXgpOworCS8qCisJICogVHJ5IHRvIGZsdXNoIGFueSBwZW5kaW5nIHdyaXRlcyB0byB0aGUgZmlsZS4uCisJICoKKwkgKiBOT1RFISBCZWNhdXNlIHdlIG93biB0aGUgcGFnZSBsb2NrLCB0aGVyZSBjYW5ub3QKKwkgKiBiZSBhbnkgbmV3IHBlbmRpbmcgd3JpdGVzIGdlbmVyYXRlZCBhdCB0aGlzIHBvaW50CisJICogZm9yIHRoaXMgcGFnZSAob3RoZXIgcGFnZXMgY2FuIGJlIHdyaXR0ZW4gdG8pLgorCSAqLworCWVycm9yID0gbmZzX3diX3BhZ2UoaW5vZGUsIHBhZ2UpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfZXJyb3I7CisKKwlpZiAoZmlsZSA9PSBOVUxMKSB7CisJCWN0eCA9IG5mc19maW5kX29wZW5fY29udGV4dChpbm9kZSwgRk1PREVfUkVBRCk7CisJCWlmIChjdHggPT0gTlVMTCkKKwkJCXJldHVybiAtRUJBREY7CisJfSBlbHNlCisJCWN0eCA9IGdldF9uZnNfb3Blbl9jb250ZXh0KChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqKQorCQkJCWZpbGUtPnByaXZhdGVfZGF0YSk7CisJaWYgKCFJU19TWU5DKGlub2RlKSkgeworCQllcnJvciA9IG5mc19yZWFkcGFnZV9hc3luYyhjdHgsIGlub2RlLCBwYWdlKTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyb3IgPSBuZnNfcmVhZHBhZ2Vfc3luYyhjdHgsIGlub2RlLCBwYWdlKTsKKwlpZiAoZXJyb3IgPCAwICYmIElTX1NXQVBGSUxFKGlub2RlKSkKKwkJcHJpbnRrKCJBaWVlLi4gbmZzIHN3YXAtaW4gb2YgcGFnZSBmYWlsZWQhXG4iKTsKK291dDoKKwlwdXRfbmZzX29wZW5fY29udGV4dChjdHgpOworCXJldHVybiBlcnJvcjsKKworb3V0X2Vycm9yOgorCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiBlcnJvcjsKK30KKworc3RydWN0IG5mc19yZWFkZGVzYyB7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4OworfTsKKworc3RhdGljIGludAorcmVhZHBhZ2VfYXN5bmNfZmlsbGVyKHZvaWQgKmRhdGEsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBuZnNfcmVhZGRlc2MgKmRlc2MgPSAoc3RydWN0IG5mc19yZWFkZGVzYyAqKWRhdGE7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJc3RydWN0IG5mc19wYWdlICpuZXc7CisJdW5zaWduZWQgaW50IGxlbjsKKworCW5mc193Yl9wYWdlKGlub2RlLCBwYWdlKTsKKwlsZW4gPSBuZnNfcGFnZV9sZW5ndGgoaW5vZGUsIHBhZ2UpOworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIG5mc19yZXR1cm5fZW1wdHlfcGFnZShwYWdlKTsKKwluZXcgPSBuZnNfY3JlYXRlX3JlcXVlc3QoZGVzYy0+Y3R4LCBpbm9kZSwgcGFnZSwgMCwgbGVuKTsKKwlpZiAoSVNfRVJSKG5ldykpIHsKKwkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJcmV0dXJuIFBUUl9FUlIobmV3KTsKKwl9CisJaWYgKGxlbiA8IFBBR0VfQ0FDSEVfU0laRSkKKwkJbWVtY2xlYXJfaGlnaHBhZ2VfZmx1c2gocGFnZSwgbGVuLCBQQUdFX0NBQ0hFX1NJWkUgLSBsZW4pOworCW5mc19sb2NrX3JlcXVlc3QobmV3KTsKKwluZnNfbGlzdF9hZGRfcmVxdWVzdChuZXcsIGRlc2MtPmhlYWQpOworCXJldHVybiAwOworfQorCitpbnQgbmZzX3JlYWRwYWdlcyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCXN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzLCB1bnNpZ25lZCBucl9wYWdlcykKK3sKKwlMSVNUX0hFQUQoaGVhZCk7CisJc3RydWN0IG5mc19yZWFkZGVzYyBkZXNjID0geworCQkuaGVhZAkJPSAmaGVhZCwKKwl9OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGlub2RlKTsKKwlpbnQgcmV0OworCisJZHByaW50aygiTkZTOiBuZnNfcmVhZHBhZ2VzICglcy8lTGQgJWQpXG4iLAorCQkJaW5vZGUtPmlfc2ItPnNfaWQsCisJCQkobG9uZyBsb25nKU5GU19GSUxFSUQoaW5vZGUpLAorCQkJbnJfcGFnZXMpOworCisJaWYgKGZpbHAgPT0gTlVMTCkgeworCQlkZXNjLmN0eCA9IG5mc19maW5kX29wZW5fY29udGV4dChpbm9kZSwgRk1PREVfUkVBRCk7CisJCWlmIChkZXNjLmN0eCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FQkFERjsKKwl9IGVsc2UKKwkJZGVzYy5jdHggPSBnZXRfbmZzX29wZW5fY29udGV4dCgoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKikKKwkJCQlmaWxwLT5wcml2YXRlX2RhdGEpOworCXJldCA9IHJlYWRfY2FjaGVfcGFnZXMobWFwcGluZywgcGFnZXMsIHJlYWRwYWdlX2FzeW5jX2ZpbGxlciwgJmRlc2MpOworCWlmICghbGlzdF9lbXB0eSgmaGVhZCkpIHsKKwkJaW50IGVyciA9IG5mc19wYWdlaW5fbGlzdCgmaGVhZCwgc2VydmVyLT5ycGFnZXMpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGVycjsKKwl9CisJcHV0X25mc19vcGVuX2NvbnRleHQoZGVzYy5jdHgpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBuZnNfaW5pdF9yZWFkcGFnZWNhY2hlKHZvaWQpCit7CisJbmZzX3JkYXRhX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJuZnNfcmVhZF9kYXRhIiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IG5mc19yZWFkX2RhdGEpLAorCQkJCQkgICAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwKKwkJCQkJICAgICBOVUxMLCBOVUxMKTsKKwlpZiAobmZzX3JkYXRhX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5mc19yZGF0YV9tZW1wb29sID0gbWVtcG9vbF9jcmVhdGUoTUlOX1BPT0xfUkVBRCwKKwkJCQkJICAgbWVtcG9vbF9hbGxvY19zbGFiLAorCQkJCQkgICBtZW1wb29sX2ZyZWVfc2xhYiwKKwkJCQkJICAgbmZzX3JkYXRhX2NhY2hlcCk7CisJaWYgKG5mc19yZGF0YV9tZW1wb29sID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbmZzX2Rlc3Ryb3lfcmVhZHBhZ2VjYWNoZSh2b2lkKQoreworCW1lbXBvb2xfZGVzdHJveShuZnNfcmRhdGFfbWVtcG9vbCk7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShuZnNfcmRhdGFfY2FjaGVwKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAibmZzX3JlYWRfZGF0YTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL3N5bWxpbmsuYyBiL2ZzL25mcy9zeW1saW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmMTA2NQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy9zeW1saW5rLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiAgbGludXgvZnMvbmZzL3N5bWxpbmsuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTIgIFJpY2sgU2xhZGtleQorICoKKyAqICBPcHRpbWl6YXRpb24gY2hhbmdlcyBDb3B5cmlnaHQgKEMpIDE5OTQgRmxvcmlhbiBMYSBSb2NoZQorICoKKyAqICBKdW4gNyAxOTk5LCBjYWNoZSBzeW1saW5rIGxvb2t1cHMgaW4gdGhlIHBhZ2UgY2FjaGUuICAtRGF2ZU0KKyAqCisgKiAgbmZzIHN5bWxpbmsgaGFuZGxpbmcgY29kZQorICovCisKKyNkZWZpbmUgTkZTX05FRURfWERSX1RZUEVTCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMyLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisKKy8qIFN5bWxpbmsgY2FjaGluZyBpbiB0aGUgcGFnZSBjYWNoZSBpcyBldmVuIG1vcmUgc2ltcGxpc3RpYworICogYW5kIHN0cmFpZ2h0LWZvcndhcmQgdGhhbiByZWFkZGlyIGNhY2hpbmcuCisgKgorICogQXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFnZSB3ZSBzdG9yZSBwb2ludGVyIHRvIHN0cnVjdCBwYWdlIGluIHF1ZXN0aW9uLAorICogc2ltcGxpZnlpbmcgbmZzX3B1dF9saW5rKCkgKGlmIGlub2RlIGdvdCBpbnZhbGlkYXRlZCB3ZSBjYW4ndCBmaW5kIHRoZSBwYWdlCisgKiB0byBiZSBmcmVlZCB2aWEgcGFnZWNhY2hlIGxvb2t1cCkuCisgKiBUaGUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGZvbGxvd3MgaW1tZWRpYXRlbHkgdGhlcmVhZnRlci4KKyAqLworCitzdHJ1Y3QgbmZzX3N5bWxpbmsgeworCXN0cnVjdCBwYWdlICpwYWdlOworCWNoYXIgYm9keVswXTsKK307CisKK3N0YXRpYyBpbnQgbmZzX3N5bWxpbmtfZmlsbGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCWNvbnN0IHVuc2lnbmVkIGludCBwZ2Jhc2UgPSBvZmZzZXRvZihzdHJ1Y3QgbmZzX3N5bWxpbmssIGJvZHkpOworCWNvbnN0IHVuc2lnbmVkIGludCBwZ2xlbiA9IFBBR0VfU0laRSAtIHBnYmFzZTsKKwlpbnQgZXJyb3I7CisKKwlsb2NrX2tlcm5lbCgpOworCWVycm9yID0gTkZTX1BST1RPKGlub2RlKS0+cmVhZGxpbmsoaW5vZGUsIHBhZ2UsIHBnYmFzZSwgcGdsZW4pOworCXVubG9ja19rZXJuZWwoKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIGVycm9yOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJU2V0UGFnZUVycm9yKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IG5mc19mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IG5mc19zeW1saW5rICpwOworCXZvaWQgKmVyciA9IEVSUl9QVFIobmZzX3JldmFsaWRhdGVfaW5vZGUoTkZTX1NFUlZFUihpbm9kZSksIGlub2RlKSk7CisJaWYgKGVycikKKwkJZ290byByZWFkX2ZhaWxlZDsKKwlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKCZpbm9kZS0+aV9kYXRhLCAwLAorCQkJCShmaWxsZXJfdCAqKW5mc19zeW1saW5rX2ZpbGxlciwgaW5vZGUpOworCWlmIChJU19FUlIocGFnZSkpIHsKKwkJZXJyID0gcGFnZTsKKwkJZ290byByZWFkX2ZhaWxlZDsKKwl9CisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJZXJyID0gRVJSX1BUUigtRUlPKTsKKwkJZ290byBnZXRsaW5rX3JlYWRfZXJyb3I7CisJfQorCXAgPSBrbWFwKHBhZ2UpOworCXAtPnBhZ2UgPSBwYWdlOworCW5kX3NldF9saW5rKG5kLCBwLT5ib2R5KTsKKwlyZXR1cm4gMDsKKworZ2V0bGlua19yZWFkX2Vycm9yOgorCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKK3JlYWRfZmFpbGVkOgorCW5kX3NldF9saW5rKG5kLCBlcnIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuZnNfcHV0X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwljaGFyICpzID0gbmRfZ2V0X2xpbmsobmQpOworCWlmICghSVNfRVJSKHMpKSB7CisJCXN0cnVjdCBuZnNfc3ltbGluayAqcDsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkJcCA9IGNvbnRhaW5lcl9vZihzLCBzdHJ1Y3QgbmZzX3N5bWxpbmssIGJvZHlbMF0pOworCQlwYWdlID0gcC0+cGFnZTsKKworCQlrdW5tYXAocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9Cit9CisKKy8qCisgKiBzeW1saW5rcyBjYW4ndCBkbyBtdWNoLi4uCisgKi8KK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG5mc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBuZnNfZm9sbG93X2xpbmssCisJLnB1dF9saW5rCT0gbmZzX3B1dF9saW5rLAorCS5nZXRhdHRyCT0gbmZzX2dldGF0dHIsCisJLnNldGF0dHIJPSBuZnNfc2V0YXR0ciwKK307CmRpZmYgLS1naXQgYS9mcy9uZnMvdW5saW5rLmMgYi9mcy9uZnMvdW5saW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczMjU0MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy91bmxpbmsuYwpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqICBsaW51eC9mcy9uZnMvdW5saW5rLmMKKyAqCisgKiBuZnMgc2lsbHlkZWxldGUgaGFuZGxpbmcKKyAqCisgKiBOT1RFOiB3ZSByZWx5IG9uIGhvbGRpbmcgdGhlIEJLTCBmb3IgbGlzdCBtYW5pcHVsYXRpb24gcHJvdGVjdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisKKworc3RydWN0IG5mc191bmxpbmtkYXRhIHsKKwlzdHJ1Y3QgbmZzX3VubGlua2RhdGEJKm5leHQ7CisJc3RydWN0IGRlbnRyeQkqZGlyLCAqZGVudHJ5OworCXN0cnVjdCBxc3RyCW5hbWU7CisJc3RydWN0IHJwY190YXNrCXRhc2s7CisJc3RydWN0IHJwY19jcmVkCSpjcmVkOworCXVuc2lnbmVkIGludAljb3VudDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmZzX3VubGlua2RhdGEJKm5mc19kZWxldGVzOworc3RhdGljIFJQQ19XQUlUUShuZnNfZGVsZXRlX3F1ZXVlLCAibmZzX2RlbGV0ZV9xdWV1ZSIpOworCisvKioKKyAqIG5mc19kZXRhY2hfdW5saW5rZGF0YSAtIFJlbW92ZSBhc3luY2hyb25vdXMgdW5saW5rIGZyb20gZ2xvYmFsIGxpc3QKKyAqIEBkYXRhOiBwb2ludGVyIHRvIGRlc2NyaXB0b3IKKyAqLworc3RhdGljIGlubGluZSB2b2lkCituZnNfZGV0YWNoX3VubGlua2RhdGEoc3RydWN0IG5mc191bmxpbmtkYXRhICpkYXRhKQoreworCXN0cnVjdCBuZnNfdW5saW5rZGF0YQkqKnE7CisKKwlmb3IgKHEgPSAmbmZzX2RlbGV0ZXM7ICpxICE9IE5VTEw7IHEgPSAmKCgqcSktPm5leHQpKSB7CisJCWlmICgqcSA9PSBkYXRhKSB7CisJCQkqcSA9IGRhdGEtPm5leHQ7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoqCisgKiBuZnNfcHV0X3VubGlua2RhdGEgLSByZWxlYXNlIGRhdGEgZnJvbSBhIHNpbGx5ZGVsZXRlIG9wZXJhdGlvbi4KKyAqIEBkYXRhOiBwb2ludGVyIHRvIHVubGluayBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkCituZnNfcHV0X3VubGlua2RhdGEoc3RydWN0IG5mc191bmxpbmtkYXRhICpkYXRhKQoreworCWlmICgtLWRhdGEtPmNvdW50ID09IDApIHsKKwkJbmZzX2RldGFjaF91bmxpbmtkYXRhKGRhdGEpOworCQlpZiAoZGF0YS0+bmFtZS5uYW1lICE9IE5VTEwpCisJCQlrZnJlZShkYXRhLT5uYW1lLm5hbWUpOworCQlrZnJlZShkYXRhKTsKKwl9Cit9CisKKyNkZWZpbmUgTkFNRV9BTExPQ19MRU4obGVuKQkoKGxlbisxNikgJiB+MTUpCisvKioKKyAqIG5mc19jb3B5X2RuYW1lIC0gY29weSBkZW50cnkgbmFtZSB0byBkYXRhIHN0cnVjdHVyZQorICogQGRlbnRyeTogcG9pbnRlciB0byBkZW50cnkKKyAqIEBkYXRhOiBuZnNfdW5saW5rZGF0YQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK25mc19jb3B5X2RuYW1lKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5mc191bmxpbmtkYXRhICpkYXRhKQoreworCWNoYXIJCSpzdHI7CisJaW50CQlsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisKKwlzdHIgPSBrbWFsbG9jKE5BTUVfQUxMT0NfTEVOKGxlbiksIEdGUF9LRVJORUwpOworCWlmICghc3RyKQorCQlyZXR1cm47CisJbWVtY3B5KHN0ciwgZGVudHJ5LT5kX25hbWUubmFtZSwgbGVuKTsKKwlpZiAoIWRhdGEtPm5hbWUubGVuKSB7CisJCWRhdGEtPm5hbWUubGVuID0gbGVuOworCQlkYXRhLT5uYW1lLm5hbWUgPSBzdHI7CisJfSBlbHNlCisJCWtmcmVlKHN0cik7Cit9CisKKy8qKgorICogbmZzX2FzeW5jX3VubGlua19pbml0IC0gSW5pdGlhbGl6ZSB0aGUgUlBDIGluZm8KKyAqIEB0YXNrOiBycGNfdGFzayBvZiB0aGUgc2lsbHlkZWxldGUKKyAqCisgKiBXZSBkZWxheSBpbml0aWFsaXppbmcgUlBDIGluZm8gdW50aWwgYWZ0ZXIgdGhlIGNhbGwgdG8gZGVudHJ5X2lwdXQoKQorICogaW4gb3JkZXIgdG8gbWluaW1pemUgcmFjZXMgYWdhaW5zdCByZW5hbWUoKS4KKyAqLworc3RhdGljIHZvaWQKK25mc19hc3luY191bmxpbmtfaW5pdChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IG5mc191bmxpbmtkYXRhCSpkYXRhID0gKHN0cnVjdCBuZnNfdW5saW5rZGF0YSAqKXRhc2stPnRrX2NhbGxkYXRhOworCXN0cnVjdCBkZW50cnkJCSpkaXIgPSBkYXRhLT5kaXI7CisJc3RydWN0IHJwY19tZXNzYWdlCW1zZyA9IHsKKwkJLnJwY19jcmVkCT0gZGF0YS0+Y3JlZCwKKwl9OworCWludAkJCXN0YXR1cyA9IC1FTk9FTlQ7CisKKwlpZiAoIWRhdGEtPm5hbWUubGVuKQorCQlnb3RvIG91dF9lcnI7CisKKwlzdGF0dXMgPSBORlNfUFJPVE8oZGlyLT5kX2lub2RlKS0+dW5saW5rX3NldHVwKCZtc2csIGRpciwgJmRhdGEtPm5hbWUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIG91dF9lcnI7CisJbmZzX2JlZ2luX2RhdGFfdXBkYXRlKGRpci0+ZF9pbm9kZSk7CisJcnBjX2NhbGxfc2V0dXAodGFzaywgJm1zZywgMCk7CisJcmV0dXJuOworIG91dF9lcnI6CisJcnBjX2V4aXQodGFzaywgc3RhdHVzKTsKK30KKworLyoqCisgKiBuZnNfYXN5bmNfdW5saW5rX2RvbmUgLSBTaWxseWRlbGV0ZSBwb3N0LXByb2Nlc3NpbmcKKyAqIEB0YXNrOiBycGNfdGFzayBvZiB0aGUgc2lsbHlkZWxldGUKKyAqCisgKiBEbyB0aGUgZGlyZWN0b3J5IGF0dHJpYnV0ZSB1cGRhdGUuCisgKi8KK3N0YXRpYyB2b2lkCituZnNfYXN5bmNfdW5saW5rX2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBuZnNfdW5saW5rZGF0YQkqZGF0YSA9IChzdHJ1Y3QgbmZzX3VubGlua2RhdGEgKil0YXNrLT50a19jYWxsZGF0YTsKKwlzdHJ1Y3QgZGVudHJ5CQkqZGlyID0gZGF0YS0+ZGlyOworCXN0cnVjdCBpbm9kZQkJKmRpcl9pOworCisJaWYgKCFkaXIpCisJCXJldHVybjsKKwlkaXJfaSA9IGRpci0+ZF9pbm9kZTsKKwluZnNfZW5kX2RhdGFfdXBkYXRlKGRpcl9pKTsKKwlpZiAoTkZTX1BST1RPKGRpcl9pKS0+dW5saW5rX2RvbmUoZGlyLCB0YXNrKSkKKwkJcmV0dXJuOworCXB1dF9ycGNjcmVkKGRhdGEtPmNyZWQpOworCWRhdGEtPmNyZWQgPSBOVUxMOworCWRwdXQoZGlyKTsKK30KKworLyoqCisgKiBuZnNfYXN5bmNfdW5saW5rX3JlbGVhc2UgLSBSZWxlYXNlIHRoZSBzaWxseWRlbGV0ZSBkYXRhLgorICogQHRhc2s6IHJwY190YXNrIG9mIHRoZSBzaWxseWRlbGV0ZQorICoKKyAqIFdlIG5lZWQgdG8gY2FsbCBuZnNfcHV0X3VubGlua2RhdGEgYXMgYSAndGtfcmVsZWFzZScgdGFzayBzaW5jZSB0aGUKKyAqIHJwY190YXNrIHdvdWxkIGJlIGZyZWVkIHRvby4KKyAqLworc3RhdGljIHZvaWQKK25mc19hc3luY191bmxpbmtfcmVsZWFzZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IG5mc191bmxpbmtkYXRhCSpkYXRhID0gKHN0cnVjdCBuZnNfdW5saW5rZGF0YSAqKXRhc2stPnRrX2NhbGxkYXRhOworCW5mc19wdXRfdW5saW5rZGF0YShkYXRhKTsKK30KKworLyoqCisgKiBuZnNfYXN5bmNfdW5saW5rIC0gYXN5bmNocm9ub3VzIHVubGlua2luZyBvZiBhIGZpbGUKKyAqIEBkZW50cnk6IGRlbnRyeSB0byB1bmxpbmsKKyAqLworaW50CituZnNfYXN5bmNfdW5saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgZGVudHJ5CSpkaXIgPSBkZW50cnktPmRfcGFyZW50OworCXN0cnVjdCBuZnNfdW5saW5rZGF0YQkqZGF0YTsKKwlzdHJ1Y3QgcnBjX3Rhc2sJKnRhc2s7CisJc3RydWN0IHJwY19jbG50CSpjbG50ID0gTkZTX0NMSUVOVChkaXItPmRfaW5vZGUpOworCWludAkJc3RhdHVzID0gLUVOT01FTTsKKworCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJZ290byBvdXQ7CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZigqZGF0YSkpOworCisJZGF0YS0+Y3JlZCA9IHJwY2F1dGhfbG9va3VwY3JlZChjbG50LT5jbF9hdXRoLCAwKTsKKwlpZiAoSVNfRVJSKGRhdGEtPmNyZWQpKSB7CisJCXN0YXR1cyA9IFBUUl9FUlIoZGF0YS0+Y3JlZCk7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCWRhdGEtPmRpciA9IGRnZXQoZGlyKTsKKwlkYXRhLT5kZW50cnkgPSBkZW50cnk7CisKKwlkYXRhLT5uZXh0ID0gbmZzX2RlbGV0ZXM7CisJbmZzX2RlbGV0ZXMgPSBkYXRhOworCWRhdGEtPmNvdW50ID0gMTsKKworCXRhc2sgPSAmZGF0YS0+dGFzazsKKwlycGNfaW5pdF90YXNrKHRhc2ssIGNsbnQsIG5mc19hc3luY191bmxpbmtfZG9uZSAsIFJQQ19UQVNLX0FTWU5DKTsKKwl0YXNrLT50a19jYWxsZGF0YSA9IGRhdGE7CisJdGFzay0+dGtfYWN0aW9uID0gbmZzX2FzeW5jX3VubGlua19pbml0OworCXRhc2stPnRrX3JlbGVhc2UgPSBuZnNfYXN5bmNfdW5saW5rX3JlbGVhc2U7CisKKwlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlkZW50cnktPmRfZmxhZ3MgfD0gRENBQ0hFX05GU0ZTX1JFTkFNRUQ7CisJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKworCXJwY19zbGVlcF9vbigmbmZzX2RlbGV0ZV9xdWV1ZSwgdGFzaywgTlVMTCwgTlVMTCk7CisJc3RhdHVzID0gMDsKKyBvdXQ6CisJcmV0dXJuIHN0YXR1czsKK291dF9mcmVlOgorCWtmcmVlKGRhdGEpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogbmZzX2NvbXBsZXRlX3VubGluayAtIEluaXRpYWxpemUgY29tcGxldGlvbiBvZiB0aGUgc2lsbHlkZWxldGUKKyAqIEBkZW50cnk6IGRlbnRyeSB0byBkZWxldGUKKyAqCisgKiBTaW5jZSB3ZSdyZSBtb3N0IGxpa2VseSB0byBiZSBjYWxsZWQgYnkgZGVudHJ5X2lwdXQoKSwgd2UKKyAqIG9ubHkgdXNlIHRoZSBkZW50cnkgdG8gZmluZCB0aGUgc2lsbHlkZWxldGUuIFdlIHRoZW4gY29weSB0aGUgbmFtZQorICogaW50byB0aGUgcXN0ci4KKyAqLwordm9pZAorbmZzX2NvbXBsZXRlX3VubGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IG5mc191bmxpbmtkYXRhCSpkYXRhOworCisJZm9yKGRhdGEgPSBuZnNfZGVsZXRlczsgZGF0YSAhPSBOVUxMOyBkYXRhID0gZGF0YS0+bmV4dCkgeworCQlpZiAoZGVudHJ5ID09IGRhdGEtPmRlbnRyeSkKKwkJCWJyZWFrOworCX0KKwlpZiAoIWRhdGEpCisJCXJldHVybjsKKwlkYXRhLT5jb3VudCsrOworCW5mc19jb3B5X2RuYW1lKGRlbnRyeSwgZGF0YSk7CisJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJZGVudHJ5LT5kX2ZsYWdzICY9IH5EQ0FDSEVfTkZTRlNfUkVOQU1FRDsKKwlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCXJwY193YWtlX3VwX3Rhc2soJmRhdGEtPnRhc2spOworCW5mc19wdXRfdW5saW5rZGF0YShkYXRhKTsKK30KZGlmZiAtLWdpdCBhL2ZzL25mcy93cml0ZS5jIGIvZnMvbmZzL3dyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3YTRhZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy93cml0ZS5jCkBAIC0wLDAgKzEsMTQzMSBAQAorLyoKKyAqIGxpbnV4L2ZzL25mcy93cml0ZS5jCisgKgorICogV3JpdGluZyBmaWxlIGRhdGEgb3ZlciBORlMuCisgKgorICogV2UgZG8gaXQgbGlrZSB0aGlzOiBXaGVuIGEgKHVzZXIpIHByb2Nlc3Mgd2lzaGVzIHRvIHdyaXRlIGRhdGEgdG8gYW4KKyAqIE5GUyBmaWxlLCBhIHdyaXRlIHJlcXVlc3QgaXMgYWxsb2NhdGVkIHRoYXQgY29udGFpbnMgdGhlIFJQQyB0YXNrIGRhdGEKKyAqIHBsdXMgc29tZSBpbmZvIG9uIHRoZSBwYWdlIHRvIGJlIHdyaXR0ZW4sIGFuZCBhZGRlZCB0byB0aGUgaW5vZGUncworICogd3JpdGUgY2hhaW4uIElmIHRoZSBwcm9jZXNzIHdyaXRlcyBwYXN0IHRoZSBlbmQgb2YgdGhlIHBhZ2UsIGFuIGFzeW5jCisgKiBSUEMgY2FsbCB0byB3cml0ZSB0aGUgcGFnZSBpcyBzY2hlZHVsZWQgaW1tZWRpYXRlbHk7IG90aGVyd2lzZSwgdGhlIGNhbGwKKyAqIGlzIGRlbGF5ZWQgZm9yIGEgZmV3IHNlY29uZHMuCisgKgorICogSnVzdCBsaWtlIHJlYWRhaGVhZCwgbm8gYXN5bmMgSS9PIGlzIHBlcmZvcm1lZCBpZiB3c2l6ZSA8IFBBR0VfU0laRS4KKyAqCisgKiBXcml0ZSByZXF1ZXN0cyBhcmUga2VwdCBvbiB0aGUgaW5vZGUncyB3cml0ZWJhY2sgbGlzdC4gRWFjaCBlbnRyeSBpbgorICogdGhhdCBsaXN0IHJlZmVyZW5jZXMgdGhlIHBhZ2UgKHBvcnRpb24pIHRvIGJlIHdyaXR0ZW4uIFdoZW4gdGhlCisgKiBjYWNoZSB0aW1lb3V0IGhhcyBleHBpcmVkLCB0aGUgUlBDIHRhc2sgaXMgd29rZW4gdXAsIGFuZCB0cmllcyB0bworICogbG9jayB0aGUgcGFnZS4gQXMgc29vbiBhcyBpdCBtYW5hZ2VzIHRvIGRvIHNvLCB0aGUgcmVxdWVzdCBpcyBtb3ZlZAorICogZnJvbSB0aGUgd3JpdGViYWNrIGxpc3QgdG8gdGhlIHdyaXRlbG9jayBsaXN0LgorICoKKyAqIE5vdGU6IHdlIG11c3QgbWFrZSBzdXJlIG5ldmVyIHRvIGNvbmZ1c2UgdGhlIGlub2RlIHBhc3NlZCBpbiB0aGUKKyAqIHdyaXRlX3BhZ2UgcmVxdWVzdCB3aXRoIHRoZSBvbmUgaW4gcGFnZS0+aW5vZGUuIEFzIGZhciBhcyBJIHVuZGVyc3RhbmQKKyAqIGl0LCB0aGVzZSBhcmUgZGlmZmVyZW50IHdoZW4gZG9pbmcgYSBzd2FwLW91dC4KKyAqCisgKiBUbyB1bmRlcnN0YW5kIGV2ZXJ5dGhpbmcgdGhhdCBnb2VzIG9uIGhlcmUgYW5kIGluIHRoZSBORlMgcmVhZCBjb2RlLAorICogb25lIHNob3VsZCBiZSBhd2FyZSB0aGF0IGEgcGFnZSBpcyBsb2NrZWQgaW4gZXhhY3RseSBvbmUgb2YgdGhlIGZvbGxvd2luZworICogY2FzZXM6CisgKgorICogIC0JQSB3cml0ZSByZXF1ZXN0IGlzIGluIHByb2dyZXNzLgorICogIC0JQSB1c2VyIHByb2Nlc3MgaXMgaW4gZ2VuZXJpY19maWxlX3dyaXRlL25mc191cGRhdGVfcGFnZQorICogIC0JQSB1c2VyIHByb2Nlc3MgaXMgaW4gZ2VuZXJpY19maWxlX3JlYWQKKyAqCisgKiBBbHNvIG5vdGUgdGhhdCBiZWNhdXNlIG9mIHRoZSB3YXkgcGFnZXMgYXJlIGludmFsaWRhdGVkIGluCisgKiBuZnNfcmV2YWxpZGF0ZV9pbm9kZSwgdGhlIGZvbGxvd2luZyBhc3NlcnRpb25zIGhvbGQ6CisgKgorICogIC0JSWYgYSBwYWdlIGlzIGRpcnR5LCB0aGVyZSB3aWxsIGJlIG5vIHJlYWQgcmVxdWVzdHMgKGEgcGFnZSB3aWxsCisgKglub3QgYmUgcmUtcmVhZCB1bmxlc3MgaW52YWxpZGF0ZWQgYnkgbmZzX3JldmFsaWRhdGVfaW5vZGUpLgorICogIC0JSWYgdGhlIHBhZ2UgaXMgbm90IHVwdG9kYXRlLCB0aGVyZSB3aWxsIGJlIG5vIHBlbmRpbmcgd3JpdGUKKyAqCXJlcXVlc3RzLCBhbmQgbm8gcHJvY2VzcyB3aWxsIGJlIGluIG5mc191cGRhdGVfcGFnZS4KKyAqCisgKiBGSVhNRTogSW50ZXJhY3Rpb24gd2l0aCB0aGUgdm1zY2FuIHJvdXRpbmVzIGlzIG5vdCBvcHRpbWFsIHlldC4KKyAqIEVpdGhlciB2bXNjYW4gbXVzdCBiZSBtYWRlIG5mcy1zYXZ2eSwgb3Igd2UgbmVlZCBhIGRpZmZlcmVudCBwYWdlCisgKiByZWNsYWltIGNvbmNlcHQgdGhhdCBzdXBwb3J0cyBzb21ldGhpbmcgbGlrZSBGUy1pbmRlcGVuZGVudAorICogYnVmZmVyX2hlYWRzIHdpdGggYSBiX29wcy0+IGZpZWxkLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tcGFnZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgorCisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfcGFnZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworI2luY2x1ZGUgImRlbGVnYXRpb24uaCIKKworI2RlZmluZSBORlNEQkdfRkFDSUxJVFkJCU5GU0RCR19QQUdFQ0FDSEUKKworI2RlZmluZSBNSU5fUE9PTF9XUklURQkJKDMyKQorI2RlZmluZSBNSU5fUE9PTF9DT01NSVQJCSg0KQorCisvKgorICogTG9jYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmZzX3BhZ2UgKiBuZnNfdXBkYXRlX3JlcXVlc3Qoc3RydWN0IG5mc19vcGVuX2NvbnRleHQqLAorCQkJCQkgICAgc3RydWN0IGlub2RlICosCisJCQkJCSAgICBzdHJ1Y3QgcGFnZSAqLAorCQkJCQkgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworc3RhdGljIHZvaWQgbmZzX3dyaXRlYmFja19kb25lX3BhcnRpYWwoc3RydWN0IG5mc193cml0ZV9kYXRhICosIGludCk7CitzdGF0aWMgdm9pZCBuZnNfd3JpdGViYWNrX2RvbmVfZnVsbChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKiwgaW50KTsKK3N0YXRpYyBpbnQgbmZzX3dhaXRfb25fd3JpdGVfY29uZ2VzdGlvbihzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBpbnQpOworc3RhdGljIGludCBuZnNfd2FpdF9vbl9yZXF1ZXN0cyhzdHJ1Y3QgaW5vZGUgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgaW50KTsKK3N0YXRpYyBpbnQgbmZzX2ZsdXNoX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgaWR4X3N0YXJ0LAorCQkJICAgdW5zaWduZWQgaW50IG5wYWdlcywgaW50IGhvdyk7CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKm5mc193ZGF0YV9jYWNoZXA7CittZW1wb29sX3QgKm5mc193ZGF0YV9tZW1wb29sOworc3RhdGljIG1lbXBvb2xfdCAqbmZzX2NvbW1pdF9tZW1wb29sOworCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobmZzX3dyaXRlX2Nvbmdlc3Rpb24pOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqbmZzX2NvbW1pdF9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqcCA9IG1lbXBvb2xfYWxsb2MobmZzX2NvbW1pdF9tZW1wb29sLCBTTEFCX05PRlMpOworCWlmIChwKSB7CisJCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnAtPnBhZ2VzKTsKKwl9CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZnNfY29tbWl0X2ZyZWUoc3RydWN0IG5mc193cml0ZV9kYXRhICpwKQoreworCW1lbXBvb2xfZnJlZShwLCBuZnNfY29tbWl0X21lbXBvb2wpOworfQorCitzdGF0aWMgdm9pZCBuZnNfd3JpdGVkYXRhX3JlbGVhc2Uoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBuZnNfd3JpdGVfZGF0YQkqd2RhdGEgPSAoc3RydWN0IG5mc193cml0ZV9kYXRhICopdGFzay0+dGtfY2FsbGRhdGE7CisJbmZzX3dyaXRlZGF0YV9mcmVlKHdkYXRhKTsKK30KKworLyogQWRqdXN0IHRoZSBmaWxlIGxlbmd0aCBpZiB3ZSdyZSB3cml0aW5nIGJleW9uZCB0aGUgZW5kICovCitzdGF0aWMgdm9pZCBuZnNfZ3Jvd19maWxlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJbG9mZl90IGVuZCwgaV9zaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCXVuc2lnbmVkIGxvbmcgZW5kX2luZGV4ID0gKGlfc2l6ZSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisKKwlpZiAoaV9zaXplID4gMCAmJiBwYWdlLT5pbmRleCA8IGVuZF9pbmRleCkKKwkJcmV0dXJuOworCWVuZCA9ICgobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgKChsb2ZmX3Qpb2Zmc2V0K2NvdW50KTsKKwlpZiAoaV9zaXplID49IGVuZCkKKwkJcmV0dXJuOworCWlfc2l6ZV93cml0ZShpbm9kZSwgZW5kKTsKK30KKworLyogV2UgY2FuIHNldCB0aGUgUEdfdXB0b2RhdGUgZmxhZyBpZiB3ZSBzZWUgdGhhdCBhIHdyaXRlIHJlcXVlc3QKKyAqIGNvdmVycyB0aGUgZnVsbCBwYWdlLgorICovCitzdGF0aWMgdm9pZCBuZnNfbWFya191cHRvZGF0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlsb2ZmX3QgZW5kX29mZnM7CisKKwlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpKQorCQlyZXR1cm47CisJaWYgKGJhc2UgIT0gMCkKKwkJcmV0dXJuOworCWlmIChjb3VudCA9PSBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCQlyZXR1cm47CisJfQorCisJZW5kX29mZnMgPSBpX3NpemVfcmVhZChwYWdlLT5tYXBwaW5nLT5ob3N0KSAtIDE7CisJaWYgKGVuZF9vZmZzIDwgMCkKKwkJcmV0dXJuOworCS8qIElzIHRoaXMgdGhlIGxhc3QgcGFnZT8gKi8KKwlpZiAocGFnZS0+aW5kZXggIT0gKHVuc2lnbmVkIGxvbmcpKGVuZF9vZmZzID4+IFBBR0VfQ0FDSEVfU0hJRlQpKQorCQlyZXR1cm47CisJLyogVGhpcyBpcyB0aGUgbGFzdCBwYWdlOiBzZXQgUEdfdXB0b2RhdGUgaWYgd2UgY292ZXIgdGhlIGVudGlyZQorCSAqIGV4dGVudCBvZiB0aGUgZGF0YSwgdGhlbiB6ZXJvIHRoZSByZXN0IG9mIHRoZSBwYWdlLgorCSAqLworCWlmIChjb3VudCA9PSAodW5zaWduZWQgaW50KShlbmRfb2ZmcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgKyAxKSB7CisJCW1lbWNsZWFyX2hpZ2hwYWdlX2ZsdXNoKHBhZ2UsIGNvdW50LCBQQUdFX0NBQ0hFX1NJWkUgLSBjb3VudCk7CisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwl9Cit9CisKKy8qCisgKiBXcml0ZSBhIHBhZ2Ugc3luY2hyb25vdXNseS4KKyAqIE9mZnNldCBpcyB0aGUgZGF0YSBvZmZzZXQgd2l0aGluIHRoZSBwYWdlLgorICovCitzdGF0aWMgaW50IG5mc193cml0ZXBhZ2Vfc3luYyhzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGNvdW50LAorCQlpbnQgaG93KQoreworCXVuc2lnbmVkIGludAl3c2l6ZSA9IE5GU19TRVJWRVIoaW5vZGUpLT53c2l6ZTsKKwlpbnQJCXJlc3VsdCwgd3JpdHRlbiA9IDA7CisJc3RydWN0IG5mc193cml0ZV9kYXRhICp3ZGF0YTsKKworCXdkYXRhID0gbmZzX3dyaXRlZGF0YV9hbGxvYygpOworCWlmICghd2RhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJd2RhdGEtPmZsYWdzID0gaG93OworCXdkYXRhLT5jcmVkID0gY3R4LT5jcmVkOworCXdkYXRhLT5pbm9kZSA9IGlub2RlOworCXdkYXRhLT5hcmdzLmZoID0gTkZTX0ZIKGlub2RlKTsKKwl3ZGF0YS0+YXJncy5jb250ZXh0ID0gY3R4OworCXdkYXRhLT5hcmdzLnBhZ2VzID0gJnBhZ2U7CisJd2RhdGEtPmFyZ3Muc3RhYmxlID0gTkZTX0ZJTEVfU1lOQzsKKwl3ZGF0YS0+YXJncy5wZ2Jhc2UgPSBvZmZzZXQ7CisJd2RhdGEtPmFyZ3MuY291bnQgPSB3c2l6ZTsKKwl3ZGF0YS0+cmVzLmZhdHRyID0gJndkYXRhLT5mYXR0cjsKKwl3ZGF0YS0+cmVzLnZlcmYgPSAmd2RhdGEtPnZlcmY7CisKKwlkcHJpbnRrKCJORlM6ICAgICAgbmZzX3dyaXRlcGFnZV9zeW5jKCVzLyVMZCAlZEAlTGQpXG4iLAorCQlpbm9kZS0+aV9zYi0+c19pZCwKKwkJKGxvbmcgbG9uZylORlNfRklMRUlEKGlub2RlKSwKKwkJY291bnQsIChsb25nIGxvbmcpKHBhZ2Vfb2Zmc2V0KHBhZ2UpICsgb2Zmc2V0KSk7CisKKwluZnNfYmVnaW5fZGF0YV91cGRhdGUoaW5vZGUpOworCWRvIHsKKwkJaWYgKGNvdW50IDwgd3NpemUpCisJCQl3ZGF0YS0+YXJncy5jb3VudCA9IGNvdW50OworCQl3ZGF0YS0+YXJncy5vZmZzZXQgPSBwYWdlX29mZnNldChwYWdlKSArIHdkYXRhLT5hcmdzLnBnYmFzZTsKKworCQlyZXN1bHQgPSBORlNfUFJPVE8oaW5vZGUpLT53cml0ZSh3ZGF0YSk7CisKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCS8qIE11c3QgbWFyayB0aGUgcGFnZSBpbnZhbGlkIGFmdGVyIEkvTyBlcnJvciAqLworCQkJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CisJCQlnb3RvIGlvX2Vycm9yOworCQl9CisJCWlmIChyZXN1bHQgPCB3ZGF0YS0+YXJncy5jb3VudCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUzogc2hvcnQgd3JpdGUsIGNvdW50PSV1LCByZXN1bHQ9JWRcbiIsCisJCQkJCXdkYXRhLT5hcmdzLmNvdW50LCByZXN1bHQpOworCisJCXdkYXRhLT5hcmdzLm9mZnNldCArPSByZXN1bHQ7CisJICAgICAgICB3ZGF0YS0+YXJncy5wZ2Jhc2UgKz0gcmVzdWx0OworCQl3cml0dGVuICs9IHJlc3VsdDsKKwkJY291bnQgLT0gcmVzdWx0OworCX0gd2hpbGUgKGNvdW50KTsKKwkvKiBVcGRhdGUgZmlsZSBsZW5ndGggKi8KKwluZnNfZ3Jvd19maWxlKHBhZ2UsIG9mZnNldCwgd3JpdHRlbik7CisJLyogU2V0IHRoZSBQR191cHRvZGF0ZSBmbGFnPyAqLworCW5mc19tYXJrX3VwdG9kYXRlKHBhZ2UsIG9mZnNldCwgd3JpdHRlbik7CisKKwlpZiAoUGFnZUVycm9yKHBhZ2UpKQorCQlDbGVhclBhZ2VFcnJvcihwYWdlKTsKKworaW9fZXJyb3I6CisJbmZzX2VuZF9kYXRhX3VwZGF0ZV9kZWZlcihpbm9kZSk7CisJbmZzX3dyaXRlZGF0YV9mcmVlKHdkYXRhKTsKKwlyZXR1cm4gd3JpdHRlbiA/IHdyaXR0ZW4gOiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbmZzX3dyaXRlcGFnZV9hc3luYyhzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4LAorCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCBuZnNfcGFnZQkqcmVxOworCWludAkJc3RhdHVzOworCisJcmVxID0gbmZzX3VwZGF0ZV9yZXF1ZXN0KGN0eCwgaW5vZGUsIHBhZ2UsIG9mZnNldCwgY291bnQpOworCXN0YXR1cyA9IChJU19FUlIocmVxKSkgPyBQVFJfRVJSKHJlcSkgOiAwOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIG91dDsKKwkvKiBVcGRhdGUgZmlsZSBsZW5ndGggKi8KKwluZnNfZ3Jvd19maWxlKHBhZ2UsIG9mZnNldCwgY291bnQpOworCS8qIFNldCB0aGUgUEdfdXB0b2RhdGUgZmxhZz8gKi8KKwluZnNfbWFya191cHRvZGF0ZShwYWdlLCBvZmZzZXQsIGNvdW50KTsKKwluZnNfdW5sb2NrX3JlcXVlc3QocmVxKTsKKyBvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCB3Yl9wcmlvcml0eShzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlpZiAod2JjLT5mb3JfcmVjbGFpbSkKKwkJcmV0dXJuIEZMVVNIX0hJR0hQUkk7CisJaWYgKHdiYy0+Zm9yX2t1cGRhdGUpCisJCXJldHVybiBGTFVTSF9MT1dQUkk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXcml0ZSBhbiBtbWFwcGVkIHBhZ2UgdG8gdGhlIHNlcnZlci4KKyAqLworaW50IG5mc193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHg7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJdW5zaWduZWQgbG9uZyBlbmRfaW5kZXg7CisJdW5zaWduZWQgb2Zmc2V0ID0gUEFHRV9DQUNIRV9TSVpFOworCWxvZmZfdCBpX3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJaW50IGlub2RlX3JlZmVyZW5jZWQgPSAwOworCWludCBwcmlvcml0eSA9IHdiX3ByaW9yaXR5KHdiYyk7CisJaW50IGVycjsKKworCS8qCisJICogTm90ZTogV2UgbmVlZCB0byBlbnN1cmUgdGhhdCB3ZSBoYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBpbm9kZQorCSAqICAgICAgIGlmIHdlIGFyZSB0byBkbyBhc3luY2hyb25vdXMgd3JpdGVzLiBJZiBub3QsIHdhaXRpbmcKKwkgKiAgICAgICBpbiBuZnNfd2FpdF9vbl9yZXF1ZXN0KCkgbWF5IGRlYWRsb2NrIHdpdGggY2xlYXJfaW5vZGUoKS4KKwkgKgorCSAqICAgICAgIElmIGlncmFiKCkgZmFpbHMgaGVyZSwgdGhlbiBpdCBpcyBpbiBhbnkgY2FzZSBzYWZlIHRvCisJICogICAgICAgY2FsbCBuZnNfd2JfcGFnZSgpLCBzaW5jZSB0aGVyZSB3aWxsIGJlIG5vIHBlbmRpbmcgd3JpdGVzLgorCSAqLworCWlmIChpZ3JhYihpbm9kZSkgIT0gMCkKKwkJaW5vZGVfcmVmZXJlbmNlZCA9IDE7CisJZW5kX2luZGV4ID0gaV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisKKwkvKiBFbnN1cmUgd2UndmUgZmx1c2hlZCBvdXQgYW55IHByZXZpb3VzIHdyaXRlcyAqLworCW5mc193Yl9wYWdlX3ByaW9yaXR5KGlub2RlLCBwYWdlLCBwcmlvcml0eSk7CisKKwkvKiBlYXN5IGNhc2UgKi8KKwlpZiAocGFnZS0+aW5kZXggPCBlbmRfaW5kZXgpCisJCWdvdG8gZG9faXQ7CisJLyogdGhpbmdzIGdvdCBjb21wbGljYXRlZC4uLiAqLworCW9mZnNldCA9IGlfc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUtMSk7CisKKwkvKiBPSywgYXJlIHdlIGNvbXBsZXRlbHkgb3V0PyAqLworCWVyciA9IDA7IC8qIHBvdGVudGlhbCByYWNlIHdpdGggdHJ1bmNhdGUgLSBpZ25vcmUgKi8KKwlpZiAocGFnZS0+aW5kZXggPj0gZW5kX2luZGV4KzEgfHwgIW9mZnNldCkKKwkJZ290byBvdXQ7Citkb19pdDoKKwljdHggPSBuZnNfZmluZF9vcGVuX2NvbnRleHQoaW5vZGUsIEZNT0RFX1dSSVRFKTsKKwlpZiAoY3R4ID09IE5VTEwpIHsKKwkJZXJyID0gLUVCQURGOworCQlnb3RvIG91dDsKKwl9CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoIUlTX1NZTkMoaW5vZGUpICYmIGlub2RlX3JlZmVyZW5jZWQpIHsKKwkJZXJyID0gbmZzX3dyaXRlcGFnZV9hc3luYyhjdHgsIGlub2RlLCBwYWdlLCAwLCBvZmZzZXQpOworCQlpZiAoZXJyID49IDApIHsKKwkJCWVyciA9IDA7CisJCQlpZiAod2JjLT5mb3JfcmVjbGFpbSkKKwkJCQluZnNfZmx1c2hfaW5vZGUoaW5vZGUsIDAsIDAsIEZMVVNIX1NUQUJMRSk7CisJCX0KKwl9IGVsc2UgeworCQllcnIgPSBuZnNfd3JpdGVwYWdlX3N5bmMoY3R4LCBpbm9kZSwgcGFnZSwgMCwKKwkJCQkJCW9mZnNldCwgcHJpb3JpdHkpOworCQlpZiAoZXJyID49IDApIHsKKwkJCWlmIChlcnIgIT0gb2Zmc2V0KQorCQkJCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7CisJCQllcnIgPSAwOworCQl9CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlwdXRfbmZzX29wZW5fY29udGV4dChjdHgpOworb3V0OgorCXVubG9ja19wYWdlKHBhZ2UpOworCWlmIChpbm9kZV9yZWZlcmVuY2VkKQorCQlpcHV0KGlub2RlKTsKKwlyZXR1cm4gZXJyOyAKK30KKworLyoKKyAqIE5vdGU6IGNhdXNlcyBuZnNfdXBkYXRlX3JlcXVlc3QoKSB0byBibG9jayBvbiB0aGUgYXNzdW1wdGlvbgorICogCSB0aGF0IHRoZSB3cml0ZWJhY2sgaXMgZ2VuZXJhdGVkIGR1ZSB0byBtZW1vcnkgcHJlc3N1cmUuCisgKi8KK2ludCBuZnNfd3JpdGVwYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSA9IG1hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJaW50IGVycjsKKworCWVyciA9IGdlbmVyaWNfd3JpdGVwYWdlcyhtYXBwaW5nLCB3YmMpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoQkRJX3dyaXRlX2Nvbmdlc3RlZCwgJmJkaS0+c3RhdGUpICE9IDApIHsKKwkJaWYgKHdiYy0+bm9uYmxvY2tpbmcpCisJCQlyZXR1cm4gMDsKKwkJbmZzX3dhaXRfb25fd3JpdGVfY29uZ2VzdGlvbihtYXBwaW5nLCAwKTsKKwl9CisJZXJyID0gbmZzX2ZsdXNoX2lub2RlKGlub2RlLCAwLCAwLCB3Yl9wcmlvcml0eSh3YmMpKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisJd2JjLT5ucl90b193cml0ZSAtPSBlcnI7CisJaWYgKCF3YmMtPm5vbmJsb2NraW5nICYmIHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfQUxMKSB7CisJCWVyciA9IG5mc193YWl0X29uX3JlcXVlc3RzKGlub2RlLCAwLCAwKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dDsKKwl9CisJZXJyID0gbmZzX2NvbW1pdF9pbm9kZShpbm9kZSwgMCwgMCwgd2JfcHJpb3JpdHkod2JjKSk7CisJaWYgKGVyciA+IDApIHsKKwkJd2JjLT5ucl90b193cml0ZSAtPSBlcnI7CisJCWVyciA9IDA7CisJfQorb3V0OgorCWNsZWFyX2JpdChCRElfd3JpdGVfY29uZ2VzdGVkLCAmYmRpLT5zdGF0ZSk7CisJd2FrZV91cF9hbGwoJm5mc193cml0ZV9jb25nZXN0aW9uKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogSW5zZXJ0IGEgd3JpdGUgcmVxdWVzdCBpbnRvIGFuIGlub2RlCisgKi8KK3N0YXRpYyBpbnQgbmZzX2lub2RlX2FkZF9yZXF1ZXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBuZnNfcGFnZSAqcmVxKQoreworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisJaW50IGVycm9yOworCisJZXJyb3IgPSByYWRpeF90cmVlX2luc2VydCgmbmZzaS0+bmZzX3BhZ2VfdHJlZSwgcmVxLT53Yl9pbmRleCwgcmVxKTsKKwlCVUdfT04oZXJyb3IgPT0gLUVFWElTVCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJaWYgKCFuZnNpLT5ucGFnZXMpIHsKKwkJaWdyYWIoaW5vZGUpOworCQluZnNfYmVnaW5fZGF0YV91cGRhdGUoaW5vZGUpOworCQlpZiAobmZzX2hhdmVfZGVsZWdhdGlvbihpbm9kZSwgRk1PREVfV1JJVEUpKQorCQkJbmZzaS0+Y2hhbmdlX2F0dHIrKzsKKwl9CisJbmZzaS0+bnBhZ2VzKys7CisJYXRvbWljX2luYygmcmVxLT53Yl9jb3VudCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbnNlcnQgYSB3cml0ZSByZXF1ZXN0IGludG8gYW4gaW5vZGUKKyAqLworc3RhdGljIHZvaWQgbmZzX2lub2RlX3JlbW92ZV9yZXF1ZXN0KHN0cnVjdCBuZnNfcGFnZSAqcmVxKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSByZXEtPndiX2NvbnRleHQtPmRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCisJQlVHX09OICghTkZTX1dCQUNLX0JVU1kocmVxKSk7CisKKwlzcGluX2xvY2soJm5mc2ktPnJlcV9sb2NrKTsKKwlyYWRpeF90cmVlX2RlbGV0ZSgmbmZzaS0+bmZzX3BhZ2VfdHJlZSwgcmVxLT53Yl9pbmRleCk7CisJbmZzaS0+bnBhZ2VzLS07CisJaWYgKCFuZnNpLT5ucGFnZXMpIHsKKwkJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKKwkJbmZzX2VuZF9kYXRhX3VwZGF0ZV9kZWZlcihpbm9kZSk7CisJCWlwdXQoaW5vZGUpOworCX0gZWxzZQorCQlzcGluX3VubG9jaygmbmZzaS0+cmVxX2xvY2spOworCW5mc19jbGVhcl9yZXF1ZXN0KHJlcSk7CisJbmZzX3JlbGVhc2VfcmVxdWVzdChyZXEpOworfQorCisvKgorICogRmluZCBhIHJlcXVlc3QKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmZzX3BhZ2UgKgorX25mc19maW5kX3JlcXVlc3Qoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBpbmRleCkKK3sKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCXN0cnVjdCBuZnNfcGFnZSAqcmVxOworCisJcmVxID0gKHN0cnVjdCBuZnNfcGFnZSopcmFkaXhfdHJlZV9sb29rdXAoJm5mc2ktPm5mc19wYWdlX3RyZWUsIGluZGV4KTsKKwlpZiAocmVxKQorCQlhdG9taWNfaW5jKCZyZXEtPndiX2NvdW50KTsKKwlyZXR1cm4gcmVxOworfQorCitzdGF0aWMgc3RydWN0IG5mc19wYWdlICoKK25mc19maW5kX3JlcXVlc3Qoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBpbmRleCkKK3sKKwlzdHJ1Y3QgbmZzX3BhZ2UJCSpyZXE7CisJc3RydWN0IG5mc19pbm9kZQkqbmZzaSA9IE5GU19JKGlub2RlKTsKKworCXNwaW5fbG9jaygmbmZzaS0+cmVxX2xvY2spOworCXJlcSA9IF9uZnNfZmluZF9yZXF1ZXN0KGlub2RlLCBpbmRleCk7CisJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKKwlyZXR1cm4gcmVxOworfQorCisvKgorICogQWRkIGEgcmVxdWVzdCB0byB0aGUgaW5vZGUncyBkaXJ0eSBsaXN0LgorICovCitzdGF0aWMgdm9pZAorbmZzX21hcmtfcmVxdWVzdF9kaXJ0eShzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcmVxLT53Yl9jb250ZXh0LT5kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKworCXNwaW5fbG9jaygmbmZzaS0+cmVxX2xvY2spOworCW5mc19saXN0X2FkZF9yZXF1ZXN0KHJlcSwgJm5mc2ktPmRpcnR5KTsKKwluZnNpLT5uZGlydHkrKzsKKwlzcGluX3VubG9jaygmbmZzaS0+cmVxX2xvY2spOworCWluY19wYWdlX3N0YXRlKG5yX2RpcnR5KTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKK30KKworLyoKKyAqIENoZWNrIGlmIGEgcmVxdWVzdCBpcyBkaXJ0eQorICovCitzdGF0aWMgaW5saW5lIGludAorbmZzX2RpcnR5X3JlcXVlc3Qoc3RydWN0IG5mc19wYWdlICpyZXEpCit7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKHJlcS0+d2JfY29udGV4dC0+ZGVudHJ5LT5kX2lub2RlKTsKKwlyZXR1cm4gIWxpc3RfZW1wdHkoJnJlcS0+d2JfbGlzdCkgJiYgcmVxLT53Yl9saXN0X2hlYWQgPT0gJm5mc2ktPmRpcnR5OworfQorCisjaWYgZGVmaW5lZChDT05GSUdfTkZTX1YzKSB8fCBkZWZpbmVkKENPTkZJR19ORlNfVjQpCisvKgorICogQWRkIGEgcmVxdWVzdCB0byB0aGUgaW5vZGUncyBjb21taXQgbGlzdC4KKyAqLworc3RhdGljIHZvaWQKK25mc19tYXJrX3JlcXVlc3RfY29tbWl0KHN0cnVjdCBuZnNfcGFnZSAqcmVxKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSByZXEtPndiX2NvbnRleHQtPmRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCisJc3Bpbl9sb2NrKCZuZnNpLT5yZXFfbG9jayk7CisJbmZzX2xpc3RfYWRkX3JlcXVlc3QocmVxLCAmbmZzaS0+Y29tbWl0KTsKKwluZnNpLT5uY29tbWl0Kys7CisJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKKwlpbmNfcGFnZV9zdGF0ZShucl91bnN0YWJsZSk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Cit9CisjZW5kaWYKKworLyoKKyAqIFdhaXQgZm9yIGEgcmVxdWVzdCB0byBjb21wbGV0ZS4KKyAqCisgKiBJbnRlcnJ1cHRpYmxlIGJ5IHNpZ25hbHMgb25seSBpZiBtb3VudGVkIHdpdGggaW50ciBmbGFnLgorICovCitzdGF0aWMgaW50CituZnNfd2FpdF9vbl9yZXF1ZXN0cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGlkeF9zdGFydCwgdW5zaWduZWQgaW50IG5wYWdlcykKK3sKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCXN0cnVjdCBuZnNfcGFnZSAqcmVxOworCXVuc2lnbmVkIGxvbmcJCWlkeF9lbmQsIG5leHQ7CisJdW5zaWduZWQgaW50CQlyZXMgPSAwOworCWludAkJCWVycm9yOworCisJaWYgKG5wYWdlcyA9PSAwKQorCQlpZHhfZW5kID0gfjA7CisJZWxzZQorCQlpZHhfZW5kID0gaWR4X3N0YXJ0ICsgbnBhZ2VzIC0gMTsKKworCXNwaW5fbG9jaygmbmZzaS0+cmVxX2xvY2spOworCW5leHQgPSBpZHhfc3RhcnQ7CisJd2hpbGUgKHJhZGl4X3RyZWVfZ2FuZ19sb29rdXAoJm5mc2ktPm5mc19wYWdlX3RyZWUsICh2b2lkICoqKSZyZXEsIG5leHQsIDEpKSB7CisJCWlmIChyZXEtPndiX2luZGV4ID4gaWR4X2VuZCkKKwkJCWJyZWFrOworCisJCW5leHQgPSByZXEtPndiX2luZGV4ICsgMTsKKwkJaWYgKCFORlNfV0JBQ0tfQlVTWShyZXEpKQorCQkJY29udGludWU7CisKKwkJYXRvbWljX2luYygmcmVxLT53Yl9jb3VudCk7CisJCXNwaW5fdW5sb2NrKCZuZnNpLT5yZXFfbG9jayk7CisJCWVycm9yID0gbmZzX3dhaXRfb25fcmVxdWVzdChyZXEpOworCQluZnNfcmVsZWFzZV9yZXF1ZXN0KHJlcSk7CisJCWlmIChlcnJvciA8IDApCisJCQlyZXR1cm4gZXJyb3I7CisJCXNwaW5fbG9jaygmbmZzaS0+cmVxX2xvY2spOworCQlyZXMrKzsKKwl9CisJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogbmZzX3NjYW5fZGlydHkgLSBTY2FuIGFuIGlub2RlIGZvciBkaXJ0eSByZXF1ZXN0cworICogQGlub2RlOiBORlMgaW5vZGUgdG8gc2NhbgorICogQGRzdDogZGVzdGluYXRpb24gbGlzdAorICogQGlkeF9zdGFydDogbG93ZXIgYm91bmQgb2YgcGFnZS0+aW5kZXggdG8gc2Nhbi4KKyAqIEBucGFnZXM6IGlkeF9zdGFydCArIG5wYWdlcyBzZXRzIHRoZSB1cHBlciBib3VuZCB0byBzY2FuLgorICoKKyAqIE1vdmVzIHJlcXVlc3RzIGZyb20gdGhlIGlub2RlJ3MgZGlydHkgcGFnZSBsaXN0LgorICogVGhlIHJlcXVlc3RzIGFyZSAqbm90KiBjaGVja2VkIHRvIGVuc3VyZSB0aGF0IHRoZXkgZm9ybSBhIGNvbnRpZ3VvdXMgc2V0LgorICovCitzdGF0aWMgaW50CituZnNfc2Nhbl9kaXJ0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbGlzdF9oZWFkICpkc3QsIHVuc2lnbmVkIGxvbmcgaWR4X3N0YXJ0LCB1bnNpZ25lZCBpbnQgbnBhZ2VzKQoreworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisJaW50CXJlczsKKwlyZXMgPSBuZnNfc2Nhbl9saXN0KCZuZnNpLT5kaXJ0eSwgZHN0LCBpZHhfc3RhcnQsIG5wYWdlcyk7CisJbmZzaS0+bmRpcnR5IC09IHJlczsKKwlzdWJfcGFnZV9zdGF0ZShucl9kaXJ0eSxyZXMpOworCWlmICgobmZzaS0+bmRpcnR5ID09IDApICE9IGxpc3RfZW1wdHkoJm5mc2ktPmRpcnR5KSkKKwkJcHJpbnRrKEtFUk5fRVJSICJORlM6IGRlc3luY2hyb25pemVkIHZhbHVlIG9mIG5mc19pLm5kaXJ0eS5cbiIpOworCXJldHVybiByZXM7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjMpIHx8IGRlZmluZWQoQ09ORklHX05GU19WNCkKKy8qCisgKiBuZnNfc2Nhbl9jb21taXQgLSBTY2FuIGFuIGlub2RlIGZvciBjb21taXQgcmVxdWVzdHMKKyAqIEBpbm9kZTogTkZTIGlub2RlIHRvIHNjYW4KKyAqIEBkc3Q6IGRlc3RpbmF0aW9uIGxpc3QKKyAqIEBpZHhfc3RhcnQ6IGxvd2VyIGJvdW5kIG9mIHBhZ2UtPmluZGV4IHRvIHNjYW4uCisgKiBAbnBhZ2VzOiBpZHhfc3RhcnQgKyBucGFnZXMgc2V0cyB0aGUgdXBwZXIgYm91bmQgdG8gc2Nhbi4KKyAqCisgKiBNb3ZlcyByZXF1ZXN0cyBmcm9tIHRoZSBpbm9kZSdzICdjb21taXQnIHJlcXVlc3QgbGlzdC4KKyAqIFRoZSByZXF1ZXN0cyBhcmUgKm5vdCogY2hlY2tlZCB0byBlbnN1cmUgdGhhdCB0aGV5IGZvcm0gYSBjb250aWd1b3VzIHNldC4KKyAqLworc3RhdGljIGludAorbmZzX3NjYW5fY29tbWl0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBsaXN0X2hlYWQgKmRzdCwgdW5zaWduZWQgbG9uZyBpZHhfc3RhcnQsIHVuc2lnbmVkIGludCBucGFnZXMpCit7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKwlpbnQJcmVzOworCXJlcyA9IG5mc19zY2FuX2xpc3QoJm5mc2ktPmNvbW1pdCwgZHN0LCBpZHhfc3RhcnQsIG5wYWdlcyk7CisJbmZzaS0+bmNvbW1pdCAtPSByZXM7CisJaWYgKChuZnNpLT5uY29tbWl0ID09IDApICE9IGxpc3RfZW1wdHkoJm5mc2ktPmNvbW1pdCkpCisJCXByaW50ayhLRVJOX0VSUiAiTkZTOiBkZXN5bmNocm9uaXplZCB2YWx1ZSBvZiBuZnNfaS5uY29tbWl0LlxuIik7CisJcmV0dXJuIHJlczsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IG5mc193YWl0X29uX3dyaXRlX2Nvbmdlc3Rpb24oc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGludCBpbnRyKQoreworCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkgPSBtYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOworCURFRklORV9XQUlUKHdhaXQpOworCWludCByZXQgPSAwOworCisJbWlnaHRfc2xlZXAoKTsKKworCWlmICghYmRpX3dyaXRlX2Nvbmdlc3RlZChiZGkpKQorCQlyZXR1cm4gMDsKKwlpZiAoaW50cikgeworCQlzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQgPSBORlNfQ0xJRU5UKG1hcHBpbmctPmhvc3QpOworCQlzaWdzZXRfdCBvbGRzZXQ7CisKKwkJcnBjX2NsbnRfc2lnbWFzayhjbG50LCAmb2xkc2V0KTsKKwkJcHJlcGFyZV90b193YWl0KCZuZnNfd3JpdGVfY29uZ2VzdGlvbiwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChiZGlfd3JpdGVfY29uZ2VzdGVkKGJkaSkpIHsKKwkJCWlmIChzaWduYWxsZWQoKSkKKwkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQllbHNlCisJCQkJc2NoZWR1bGUoKTsKKwkJfQorCQlycGNfY2xudF9zaWd1bm1hc2soY2xudCwgJm9sZHNldCk7CisJfSBlbHNlIHsKKwkJcHJlcGFyZV90b193YWl0KCZuZnNfd3JpdGVfY29uZ2VzdGlvbiwgJndhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGJkaV93cml0ZV9jb25nZXN0ZWQoYmRpKSkKKwkJCXNjaGVkdWxlKCk7CisJfQorCWZpbmlzaF93YWl0KCZuZnNfd3JpdGVfY29uZ2VzdGlvbiwgJndhaXQpOworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIFRyeSB0byB1cGRhdGUgYW55IGV4aXN0aW5nIHdyaXRlIHJlcXVlc3QsIG9yIGNyZWF0ZSBvbmUgaWYgdGhlcmUgaXMgbm9uZS4KKyAqIEluIG9yZGVyIHRvIG1hdGNoLCB0aGUgcmVxdWVzdCdzIGNyZWRlbnRpYWxzIG11c3QgbWF0Y2ggdGhvc2Ugb2YKKyAqIHRoZSBjYWxsaW5nIHByb2Nlc3MuCisgKgorICogTm90ZTogU2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQgd2l0aCB0aGUgUGFnZSBMb2NrIGhlbGQhCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmZzX3BhZ2UgKiBuZnNfdXBkYXRlX3JlcXVlc3Qoc3RydWN0IG5mc19vcGVuX2NvbnRleHQqIGN0eCwKKwkJc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCXVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBieXRlcykKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihpbm9kZSk7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKwlzdHJ1Y3QgbmZzX3BhZ2UJCSpyZXEsICpuZXcgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcJCXJxZW5kLCBlbmQ7CisKKwllbmQgPSBvZmZzZXQgKyBieXRlczsKKworCWlmIChuZnNfd2FpdF9vbl93cml0ZV9jb25nZXN0aW9uKHBhZ2UtPm1hcHBpbmcsIHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfSU5UUikpCisJCXJldHVybiBFUlJfUFRSKC1FUkVTVEFSVFNZUyk7CisJZm9yICg7OykgeworCQkvKiBMb29wIG92ZXIgYWxsIGlub2RlIGVudHJpZXMgYW5kIHNlZSBpZiB3ZSBmaW5kCisJCSAqIEEgcmVxdWVzdCBmb3IgdGhlIHBhZ2Ugd2Ugd2lzaCB0byB1cGRhdGUKKwkJICovCisJCXNwaW5fbG9jaygmbmZzaS0+cmVxX2xvY2spOworCQlyZXEgPSBfbmZzX2ZpbmRfcmVxdWVzdChpbm9kZSwgcGFnZS0+aW5kZXgpOworCQlpZiAocmVxKSB7CisJCQlpZiAoIW5mc19sb2NrX3JlcXVlc3RfZG9udGdldChyZXEpKSB7CisJCQkJaW50IGVycm9yOworCQkJCXNwaW5fdW5sb2NrKCZuZnNpLT5yZXFfbG9jayk7CisJCQkJZXJyb3IgPSBuZnNfd2FpdF9vbl9yZXF1ZXN0KHJlcSk7CisJCQkJbmZzX3JlbGVhc2VfcmVxdWVzdChyZXEpOworCQkJCWlmIChlcnJvciA8IDApCisJCQkJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrKCZuZnNpLT5yZXFfbG9jayk7CisJCQlpZiAobmV3KQorCQkJCW5mc19yZWxlYXNlX3JlcXVlc3QobmV3KTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG5ldykgeworCQkJaW50IGVycm9yOworCQkJbmZzX2xvY2tfcmVxdWVzdF9kb250Z2V0KG5ldyk7CisJCQllcnJvciA9IG5mc19pbm9kZV9hZGRfcmVxdWVzdChpbm9kZSwgbmV3KTsKKwkJCWlmIChlcnJvcikgeworCQkJCXNwaW5fdW5sb2NrKCZuZnNpLT5yZXFfbG9jayk7CisJCQkJbmZzX3VubG9ja19yZXF1ZXN0KG5ldyk7CisJCQkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworCQkJfQorCQkJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKKwkJCW5mc19tYXJrX3JlcXVlc3RfZGlydHkobmV3KTsKKwkJCXJldHVybiBuZXc7CisJCX0KKwkJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKKworCQluZXcgPSBuZnNfY3JlYXRlX3JlcXVlc3QoY3R4LCBpbm9kZSwgcGFnZSwgb2Zmc2V0LCBieXRlcyk7CisJCWlmIChJU19FUlIobmV3KSkKKwkJCXJldHVybiBuZXc7CisJfQorCisJLyogV2UgaGF2ZSBhIHJlcXVlc3QgZm9yIG91ciBwYWdlLgorCSAqIElmIHRoZSBjcmVkcyBkb24ndCBtYXRjaCwgb3IgdGhlCisJICogcGFnZSBhZGRyZXNzZXMgZG9uJ3QgbWF0Y2gsCisJICogdGVsbCB0aGUgY2FsbGVyIHRvIHdhaXQgb24gdGhlIGNvbmZsaWN0aW5nCisJICogcmVxdWVzdC4KKwkgKi8KKwlycWVuZCA9IHJlcS0+d2Jfb2Zmc2V0ICsgcmVxLT53Yl9ieXRlczsKKwlpZiAocmVxLT53Yl9jb250ZXh0ICE9IGN0eAorCSAgICB8fCByZXEtPndiX3BhZ2UgIT0gcGFnZQorCSAgICB8fCAhbmZzX2RpcnR5X3JlcXVlc3QocmVxKQorCSAgICB8fCBvZmZzZXQgPiBycWVuZCB8fCBlbmQgPCByZXEtPndiX29mZnNldCkgeworCQluZnNfdW5sb2NrX3JlcXVlc3QocmVxKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKKwl9CisKKwkvKiBPa2F5LCB0aGUgcmVxdWVzdCBtYXRjaGVzLiBVcGRhdGUgdGhlIHJlZ2lvbiAqLworCWlmIChvZmZzZXQgPCByZXEtPndiX29mZnNldCkgeworCQlyZXEtPndiX29mZnNldCA9IG9mZnNldDsKKwkJcmVxLT53Yl9wZ2Jhc2UgPSBvZmZzZXQ7CisJCXJlcS0+d2JfYnl0ZXMgPSBycWVuZCAtIHJlcS0+d2Jfb2Zmc2V0OworCX0KKworCWlmIChlbmQgPiBycWVuZCkKKwkJcmVxLT53Yl9ieXRlcyA9IGVuZCAtIHJlcS0+d2Jfb2Zmc2V0OworCisJcmV0dXJuIHJlcTsKK30KKworaW50IG5mc19mbHVzaF9pbmNvbXBhdGlibGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHggPSAoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJc3RydWN0IG5mc19wYWdlCSpyZXE7CisJaW50CQlzdGF0dXMgPSAwOworCS8qCisJICogTG9vayBmb3IgYSByZXF1ZXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBwYWdlLiBJZiB0aGVyZQorCSAqIGlzIG9uZSwgYW5kIGl0IGJlbG9uZ3MgdG8gYW5vdGhlciBmaWxlLCB3ZSBmbHVzaCBpdCBvdXQKKwkgKiBiZWZvcmUgd2UgdHJ5IHRvIGNvcHkgYW55dGhpbmcgaW50byB0aGUgcGFnZS4gRG8gdGhpcworCSAqIGR1ZSB0byB0aGUgbGFjayBvZiBhbiBBQ0NFU1MtdHlwZSBjYWxsIGluIE5GU3YyLgorCSAqIEFsc28gZG8gdGhlIHNhbWUgaWYgd2UgZmluZCBhIHJlcXVlc3QgZnJvbSBhbiBleGlzdGluZworCSAqIGRyb3BwZWQgcGFnZS4KKwkgKi8KKwlyZXEgPSBuZnNfZmluZF9yZXF1ZXN0KGlub2RlLCBwYWdlLT5pbmRleCk7CisJaWYgKHJlcSkgeworCQlpZiAocmVxLT53Yl9wYWdlICE9IHBhZ2UgfHwgY3R4ICE9IHJlcS0+d2JfY29udGV4dCkKKwkJCXN0YXR1cyA9IG5mc193Yl9wYWdlKGlub2RlLCBwYWdlKTsKKwkJbmZzX3JlbGVhc2VfcmVxdWVzdChyZXEpOworCX0KKwlyZXR1cm4gKHN0YXR1cyA8IDApID8gc3RhdHVzIDogMDsKK30KKworLyoKKyAqIFVwZGF0ZSBhbmQgcG9zc2libHkgd3JpdGUgYSBjYWNoZWQgcGFnZSBvZiBhbiBORlMgZmlsZS4KKyAqCisgKiBYWFg6IEtlZXAgYW4gZXllIG9uIGdlbmVyaWNfZmlsZV9yZWFkIHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGRvIGJhZAorICogdGhpbmdzIHdpdGggYSBwYWdlIHNjaGVkdWxlZCBmb3IgYW4gUlBDIGNhbGwgKGUuZy4gaW52YWxpZGF0ZSBpdCkuCisgKi8KK2ludCBuZnNfdXBkYXRlcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCXVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4ID0gKHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZW50cnkJKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBuZnNfcGFnZQkqcmVxOworCWludAkJc3RhdHVzID0gMDsKKworCWRwcmludGsoIk5GUzogICAgICBuZnNfdXBkYXRlcGFnZSglcy8lcyAlZEAlTGQpXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJY291bnQsIChsb25nIGxvbmcpKHBhZ2Vfb2Zmc2V0KHBhZ2UpICtvZmZzZXQpKTsKKworCWlmIChJU19TWU5DKGlub2RlKSkgeworCQlzdGF0dXMgPSBuZnNfd3JpdGVwYWdlX3N5bmMoY3R4LCBpbm9kZSwgcGFnZSwgb2Zmc2V0LCBjb3VudCwgMCk7CisJCWlmIChzdGF0dXMgPiAwKSB7CisJCQlpZiAob2Zmc2V0ID09IDAgJiYgc3RhdHVzID09IFBBR0VfQ0FDSEVfU0laRSkKKwkJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIElmIHdlJ3JlIG5vdCB1c2luZyBieXRlIHJhbmdlIGxvY2tzLCBhbmQgd2Uga25vdyB0aGUgcGFnZQorCSAqIGlzIGVudGlyZWx5IGluIGNhY2hlLCBpdCBtYXkgYmUgbW9yZSBlZmZpY2llbnQgdG8gYXZvaWQKKwkgKiBmcmFnbWVudGluZyB3cml0ZSByZXF1ZXN0cy4KKwkgKi8KKwlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpICYmIGlub2RlLT5pX2Zsb2NrID09IE5VTEwpIHsKKwkJbG9mZl90IGVuZF9vZmZzID0gaV9zaXplX3JlYWQoaW5vZGUpIC0gMTsKKwkJdW5zaWduZWQgbG9uZyBlbmRfaW5kZXggPSBlbmRfb2ZmcyA+PiBQQUdFX0NBQ0hFX1NISUZUOworCisJCWNvdW50ICs9IG9mZnNldDsKKwkJb2Zmc2V0ID0gMDsKKwkJaWYgKHVubGlrZWx5KGVuZF9vZmZzIDwgMCkpIHsKKwkJCS8qIERvIG5vdGhpbmcgKi8KKwkJfSBlbHNlIGlmIChwYWdlLT5pbmRleCA9PSBlbmRfaW5kZXgpIHsKKwkJCXVuc2lnbmVkIGludCBwZ2xlbjsKKwkJCXBnbGVuID0gKHVuc2lnbmVkIGludCkoZW5kX29mZnMgJiAoUEFHRV9DQUNIRV9TSVpFLTEpKSArIDE7CisJCQlpZiAoY291bnQgPCBwZ2xlbikKKwkJCQljb3VudCA9IHBnbGVuOworCQl9IGVsc2UgaWYgKHBhZ2UtPmluZGV4IDwgZW5kX2luZGV4KQorCQkJY291bnQgPSBQQUdFX0NBQ0hFX1NJWkU7CisJfQorCisJLyoKKwkgKiBUcnkgdG8gZmluZCBhbiBORlMgcmVxdWVzdCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcGFnZQorCSAqIGFuZCB1cGRhdGUgaXQuCisJICogSWYgdGhlIGV4aXN0aW5nIHJlcXVlc3QgY2Fubm90IGJlIHVwZGF0ZWQsIHdlIG11c3QgZmx1c2gKKwkgKiBpdCBvdXQgbm93LgorCSAqLworCWRvIHsKKwkJcmVxID0gbmZzX3VwZGF0ZV9yZXF1ZXN0KGN0eCwgaW5vZGUsIHBhZ2UsIG9mZnNldCwgY291bnQpOworCQlzdGF0dXMgPSAoSVNfRVJSKHJlcSkpID8gUFRSX0VSUihyZXEpIDogMDsKKwkJaWYgKHN0YXR1cyAhPSAtRUJVU1kpCisJCQlicmVhazsKKwkJLyogUmVxdWVzdCBjb3VsZCBub3QgYmUgdXBkYXRlZC4gRmx1c2ggaXQgb3V0IGFuZCB0cnkgYWdhaW4gKi8KKwkJc3RhdHVzID0gbmZzX3diX3BhZ2UoaW5vZGUsIHBhZ2UpOworCX0gd2hpbGUgKHN0YXR1cyA+PSAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBkb25lOworCisJc3RhdHVzID0gMDsKKworCS8qIFVwZGF0ZSBmaWxlIGxlbmd0aCAqLworCW5mc19ncm93X2ZpbGUocGFnZSwgb2Zmc2V0LCBjb3VudCk7CisJLyogU2V0IHRoZSBQR191cHRvZGF0ZSBmbGFnPyAqLworCW5mc19tYXJrX3VwdG9kYXRlKHBhZ2UsIHJlcS0+d2JfcGdiYXNlLCByZXEtPndiX2J5dGVzKTsKKwluZnNfdW5sb2NrX3JlcXVlc3QocmVxKTsKK2RvbmU6CisgICAgICAgIGRwcmludGsoIk5GUzogICAgICBuZnNfdXBkYXRlcGFnZSByZXR1cm5zICVkIChpc2l6ZSAlTGQpXG4iLAorCQkJc3RhdHVzLCAobG9uZyBsb25nKWlfc2l6ZV9yZWFkKGlub2RlKSk7CisJaWYgKHN0YXR1cyA8IDApCisJCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIG5mc193cml0ZXBhZ2VfcmVsZWFzZShzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSkKK3sKKwllbmRfcGFnZV93cml0ZWJhY2socmVxLT53Yl9wYWdlKTsKKworI2lmIGRlZmluZWQoQ09ORklHX05GU19WMykgfHwgZGVmaW5lZChDT05GSUdfTkZTX1Y0KQorCWlmICghUGFnZUVycm9yKHJlcS0+d2JfcGFnZSkpIHsKKwkJaWYgKE5GU19ORUVEX1JFU0NIRUQocmVxKSkgeworCQkJbmZzX21hcmtfcmVxdWVzdF9kaXJ0eShyZXEpOworCQkJZ290byBvdXQ7CisJCX0gZWxzZSBpZiAoTkZTX05FRURfQ09NTUlUKHJlcSkpIHsKKwkJCW5mc19tYXJrX3JlcXVlc3RfY29tbWl0KHJlcSk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwluZnNfaW5vZGVfcmVtb3ZlX3JlcXVlc3QocmVxKTsKKworb3V0OgorCW5mc19jbGVhcl9jb21taXQocmVxKTsKKwluZnNfY2xlYXJfcmVzY2hlZHVsZShyZXEpOworI2Vsc2UKKwluZnNfaW5vZGVfcmVtb3ZlX3JlcXVlc3QocmVxKTsKKyNlbmRpZgorCW5mc191bmxvY2tfcmVxdWVzdChyZXEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmbHVzaF90YXNrX3ByaW9yaXR5KGludCBob3cpCit7CisJc3dpdGNoIChob3cgJiAoRkxVU0hfSElHSFBSSXxGTFVTSF9MT1dQUkkpKSB7CisJCWNhc2UgRkxVU0hfSElHSFBSSToKKwkJCXJldHVybiBSUENfUFJJT1JJVFlfSElHSDsKKwkJY2FzZSBGTFVTSF9MT1dQUkk6CisJCQlyZXR1cm4gUlBDX1BSSU9SSVRZX0xPVzsKKwl9CisJcmV0dXJuIFJQQ19QUklPUklUWV9OT1JNQUw7Cit9CisKKy8qCisgKiBTZXQgdXAgdGhlIGFyZ3VtZW50L3Jlc3VsdCBzdG9yYWdlIHJlcXVpcmVkIGZvciB0aGUgUlBDIGNhbGwuCisgKi8KK3N0YXRpYyB2b2lkIG5mc193cml0ZV9ycGNzZXR1cChzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSwKKwkJc3RydWN0IG5mc193cml0ZV9kYXRhICpkYXRhLAorCQl1bnNpZ25lZCBpbnQgY291bnQsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCWludCBob3cpCit7CisJc3RydWN0IHJwY190YXNrCQkqdGFzayA9ICZkYXRhLT50YXNrOworCXN0cnVjdCBpbm9kZQkJKmlub2RlOworCisJLyogU2V0IHVwIHRoZSBSUEMgYXJndW1lbnQgYW5kIHJlcGx5IHN0cnVjdHMKKwkgKiBOQjogdGFrZSBjYXJlIG5vdCB0byBtZXNzIGFib3V0IHdpdGggZGF0YS0+Y29tbWl0IGV0IGFsLiAqLworCisJZGF0YS0+cmVxID0gcmVxOworCWRhdGEtPmlub2RlID0gaW5vZGUgPSByZXEtPndiX2NvbnRleHQtPmRlbnRyeS0+ZF9pbm9kZTsKKwlkYXRhLT5jcmVkID0gcmVxLT53Yl9jb250ZXh0LT5jcmVkOworCisJZGF0YS0+YXJncy5maCAgICAgPSBORlNfRkgoaW5vZGUpOworCWRhdGEtPmFyZ3Mub2Zmc2V0ID0gcmVxX29mZnNldChyZXEpICsgb2Zmc2V0OworCWRhdGEtPmFyZ3MucGdiYXNlID0gcmVxLT53Yl9wZ2Jhc2UgKyBvZmZzZXQ7CisJZGF0YS0+YXJncy5wYWdlcyAgPSBkYXRhLT5wYWdldmVjOworCWRhdGEtPmFyZ3MuY291bnQgID0gY291bnQ7CisJZGF0YS0+YXJncy5jb250ZXh0ID0gcmVxLT53Yl9jb250ZXh0OworCisJZGF0YS0+cmVzLmZhdHRyICAgPSAmZGF0YS0+ZmF0dHI7CisJZGF0YS0+cmVzLmNvdW50ICAgPSBjb3VudDsKKwlkYXRhLT5yZXMudmVyZiAgICA9ICZkYXRhLT52ZXJmOworCisJTkZTX1BST1RPKGlub2RlKS0+d3JpdGVfc2V0dXAoZGF0YSwgaG93KTsKKworCWRhdGEtPnRhc2sudGtfcHJpb3JpdHkgPSBmbHVzaF90YXNrX3ByaW9yaXR5KGhvdyk7CisJZGF0YS0+dGFzay50a19jb29raWUgPSAodW5zaWduZWQgbG9uZylpbm9kZTsKKwlkYXRhLT50YXNrLnRrX2NhbGxkYXRhID0gZGF0YTsKKwkvKiBSZWxlYXNlIHJlcXVlc3RzICovCisJZGF0YS0+dGFzay50a19yZWxlYXNlID0gbmZzX3dyaXRlZGF0YV9yZWxlYXNlOworCisJZHByaW50aygiTkZTOiAlNGQgaW5pdGlhdGVkIHdyaXRlIGNhbGwgKHJlcSAlcy8lTGQsICV1IGJ5dGVzIEAgb2Zmc2V0ICVMdSlcbiIsCisJCXRhc2stPnRrX3BpZCwKKwkJaW5vZGUtPmlfc2ItPnNfaWQsCisJCShsb25nIGxvbmcpTkZTX0ZJTEVJRChpbm9kZSksCisJCWNvdW50LAorCQkodW5zaWduZWQgbG9uZyBsb25nKWRhdGEtPmFyZ3Mub2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgbmZzX2V4ZWN1dGVfd3JpdGUoc3RydWN0IG5mc193cml0ZV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBycGNfY2xudCAqY2xudCA9IE5GU19DTElFTlQoZGF0YS0+aW5vZGUpOworCXNpZ3NldF90IG9sZHNldDsKKworCXJwY19jbG50X3NpZ21hc2soY2xudCwgJm9sZHNldCk7CisJbG9ja19rZXJuZWwoKTsKKwlycGNfZXhlY3V0ZSgmZGF0YS0+dGFzayk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJwY19jbG50X3NpZ3VubWFzayhjbG50LCAmb2xkc2V0KTsKK30KKworLyoKKyAqIEdlbmVyYXRlIG11bHRpcGxlIHNtYWxsIHJlcXVlc3RzIHRvIHdyaXRlIG91dCBhIHNpbmdsZQorICogY29udGlndW91cyBkaXJ0eSBhcmVhIG9uIG9uZSBwYWdlLgorICovCitzdGF0aWMgaW50IG5mc19mbHVzaF9tdWx0aShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgaG93KQoreworCXN0cnVjdCBuZnNfcGFnZSAqcmVxID0gbmZzX2xpc3RfZW50cnkoaGVhZC0+bmV4dCk7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSByZXEtPndiX3BhZ2U7CisJc3RydWN0IG5mc193cml0ZV9kYXRhICpkYXRhOworCXVuc2lnbmVkIGludCB3c2l6ZSA9IE5GU19TRVJWRVIoaW5vZGUpLT53c2l6ZTsKKwl1bnNpZ25lZCBpbnQgbmJ5dGVzLCBvZmZzZXQ7CisJaW50IHJlcXVlc3RzID0gMDsKKwlMSVNUX0hFQUQobGlzdCk7CisKKwluZnNfbGlzdF9yZW1vdmVfcmVxdWVzdChyZXEpOworCisJbmJ5dGVzID0gcmVxLT53Yl9ieXRlczsKKwlmb3IgKDs7KSB7CisJCWRhdGEgPSBuZnNfd3JpdGVkYXRhX2FsbG9jKCk7CisJCWlmICghZGF0YSkKKwkJCWdvdG8gb3V0X2JhZDsKKwkJbGlzdF9hZGQoJmRhdGEtPnBhZ2VzLCAmbGlzdCk7CisJCXJlcXVlc3RzKys7CisJCWlmIChuYnl0ZXMgPD0gd3NpemUpCisJCQlicmVhazsKKwkJbmJ5dGVzIC09IHdzaXplOworCX0KKwlhdG9taWNfc2V0KCZyZXEtPndiX2NvbXBsZXRlLCByZXF1ZXN0cyk7CisKKwlDbGVhclBhZ2VFcnJvcihwYWdlKTsKKwlTZXRQYWdlV3JpdGViYWNrKHBhZ2UpOworCW9mZnNldCA9IDA7CisJbmJ5dGVzID0gcmVxLT53Yl9ieXRlczsKKwlkbyB7CisJCWRhdGEgPSBsaXN0X2VudHJ5KGxpc3QubmV4dCwgc3RydWN0IG5mc193cml0ZV9kYXRhLCBwYWdlcyk7CisJCWxpc3RfZGVsX2luaXQoJmRhdGEtPnBhZ2VzKTsKKworCQlkYXRhLT5wYWdldmVjWzBdID0gcGFnZTsKKwkJZGF0YS0+Y29tcGxldGUgPSBuZnNfd3JpdGViYWNrX2RvbmVfcGFydGlhbDsKKworCQlpZiAobmJ5dGVzID4gd3NpemUpIHsKKwkJCW5mc193cml0ZV9ycGNzZXR1cChyZXEsIGRhdGEsIHdzaXplLCBvZmZzZXQsIGhvdyk7CisJCQlvZmZzZXQgKz0gd3NpemU7CisJCQluYnl0ZXMgLT0gd3NpemU7CisJCX0gZWxzZSB7CisJCQluZnNfd3JpdGVfcnBjc2V0dXAocmVxLCBkYXRhLCBuYnl0ZXMsIG9mZnNldCwgaG93KTsKKwkJCW5ieXRlcyA9IDA7CisJCX0KKwkJbmZzX2V4ZWN1dGVfd3JpdGUoZGF0YSk7CisJfSB3aGlsZSAobmJ5dGVzICE9IDApOworCisJcmV0dXJuIDA7CisKK291dF9iYWQ6CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZsaXN0KSkgeworCQlkYXRhID0gbGlzdF9lbnRyeShsaXN0Lm5leHQsIHN0cnVjdCBuZnNfd3JpdGVfZGF0YSwgcGFnZXMpOworCQlsaXN0X2RlbCgmZGF0YS0+cGFnZXMpOworCQluZnNfd3JpdGVkYXRhX2ZyZWUoZGF0YSk7CisJfQorCW5mc19tYXJrX3JlcXVlc3RfZGlydHkocmVxKTsKKwluZnNfdW5sb2NrX3JlcXVlc3QocmVxKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoKKyAqIENyZWF0ZSBhbiBSUEMgdGFzayBmb3IgdGhlIGdpdmVuIHdyaXRlIHJlcXVlc3QgYW5kIGtpY2sgaXQuCisgKiBUaGUgcGFnZSBtdXN0IGhhdmUgYmVlbiBsb2NrZWQgYnkgdGhlIGNhbGxlci4KKyAqCisgKiBJdCBtYXkgaGFwcGVuIHRoYXQgdGhlIHBhZ2Ugd2UncmUgcGFzc2VkIGlzIG5vdCBtYXJrZWQgZGlydHkuCisgKiBUaGlzIGlzIHRoZSBjYXNlIGlmIG5mc191cGRhdGVwYWdlIGRldGVjdHMgYSBjb25mbGljdGluZyByZXF1ZXN0CisgKiB0aGF0IGhhcyBiZWVuIHdyaXR0ZW4gYnV0IG5vdCBjb21taXR0ZWQuCisgKi8KK3N0YXRpYyBpbnQgbmZzX2ZsdXNoX29uZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgaG93KQoreworCXN0cnVjdCBuZnNfcGFnZQkJKnJlcTsKKwlzdHJ1Y3QgcGFnZQkJKipwYWdlczsKKwlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEJKmRhdGE7CisJdW5zaWduZWQgaW50CQljb3VudDsKKworCWlmIChORlNfU0VSVkVSKGlub2RlKS0+d3NpemUgPCBQQUdFX0NBQ0hFX1NJWkUpCisJCXJldHVybiBuZnNfZmx1c2hfbXVsdGkoaGVhZCwgaW5vZGUsIGhvdyk7CisKKwlkYXRhID0gbmZzX3dyaXRlZGF0YV9hbGxvYygpOworCWlmICghZGF0YSkKKwkJZ290byBvdXRfYmFkOworCisJcGFnZXMgPSBkYXRhLT5wYWdldmVjOworCWNvdW50ID0gMDsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKKwkJcmVxID0gbmZzX2xpc3RfZW50cnkoaGVhZC0+bmV4dCk7CisJCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7CisJCW5mc19saXN0X2FkZF9yZXF1ZXN0KHJlcSwgJmRhdGEtPnBhZ2VzKTsKKwkJQ2xlYXJQYWdlRXJyb3IocmVxLT53Yl9wYWdlKTsKKwkJU2V0UGFnZVdyaXRlYmFjayhyZXEtPndiX3BhZ2UpOworCQkqcGFnZXMrKyA9IHJlcS0+d2JfcGFnZTsKKwkJY291bnQgKz0gcmVxLT53Yl9ieXRlczsKKwl9CisJcmVxID0gbmZzX2xpc3RfZW50cnkoZGF0YS0+cGFnZXMubmV4dCk7CisKKwlkYXRhLT5jb21wbGV0ZSA9IG5mc193cml0ZWJhY2tfZG9uZV9mdWxsOworCS8qIFNldCB1cCB0aGUgYXJndW1lbnQgc3RydWN0ICovCisJbmZzX3dyaXRlX3JwY3NldHVwKHJlcSwgZGF0YSwgY291bnQsIDAsIGhvdyk7CisKKwluZnNfZXhlY3V0ZV93cml0ZShkYXRhKTsKKwlyZXR1cm4gMDsKKyBvdXRfYmFkOgorCXdoaWxlICghbGlzdF9lbXB0eShoZWFkKSkgeworCQlzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSA9IG5mc19saXN0X2VudHJ5KGhlYWQtPm5leHQpOworCQluZnNfbGlzdF9yZW1vdmVfcmVxdWVzdChyZXEpOworCQluZnNfbWFya19yZXF1ZXN0X2RpcnR5KHJlcSk7CisJCW5mc191bmxvY2tfcmVxdWVzdChyZXEpOworCX0KKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludAorbmZzX2ZsdXNoX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgaW50IHdwYWdlcywgaW50IGhvdykKK3sKKwlMSVNUX0hFQUQob25lX3JlcXVlc3QpOworCXN0cnVjdCBuZnNfcGFnZQkJKnJlcTsKKwlpbnQJCQllcnJvciA9IDA7CisJdW5zaWduZWQgaW50CQlwYWdlcyA9IDA7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKKwkJcGFnZXMgKz0gbmZzX2NvYWxlc2NlX3JlcXVlc3RzKGhlYWQsICZvbmVfcmVxdWVzdCwgd3BhZ2VzKTsKKwkJcmVxID0gbmZzX2xpc3RfZW50cnkob25lX3JlcXVlc3QubmV4dCk7CisJCWVycm9yID0gbmZzX2ZsdXNoX29uZSgmb25lX3JlcXVlc3QsIHJlcS0+d2JfY29udGV4dC0+ZGVudHJ5LT5kX2lub2RlLCBob3cpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJYnJlYWs7CisJfQorCWlmIChlcnJvciA+PSAwKQorCQlyZXR1cm4gcGFnZXM7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKKwkJcmVxID0gbmZzX2xpc3RfZW50cnkoaGVhZC0+bmV4dCk7CisJCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7CisJCW5mc19tYXJrX3JlcXVlc3RfZGlydHkocmVxKTsKKwkJbmZzX3VubG9ja19yZXF1ZXN0KHJlcSk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEhhbmRsZSBhIHdyaXRlIHJlcGx5IHRoYXQgZmx1c2hlZCBwYXJ0IG9mIGEgcGFnZS4KKyAqLworc3RhdGljIHZvaWQgbmZzX3dyaXRlYmFja19kb25lX3BhcnRpYWwoc3RydWN0IG5mc193cml0ZV9kYXRhICpkYXRhLCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBuZnNfcGFnZQkJKnJlcSA9IGRhdGEtPnJlcTsKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2UgPSByZXEtPndiX3BhZ2U7CisKKwlkcHJpbnRrKCJORlM6IHdyaXRlICglcy8lTGQgJWRAJUxkKSIsCisJCXJlcS0+d2JfY29udGV4dC0+ZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX2lkLAorCQkobG9uZyBsb25nKU5GU19GSUxFSUQocmVxLT53Yl9jb250ZXh0LT5kZW50cnktPmRfaW5vZGUpLAorCQlyZXEtPndiX2J5dGVzLAorCQkobG9uZyBsb25nKXJlcV9vZmZzZXQocmVxKSk7CisKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJU2V0UGFnZUVycm9yKHBhZ2UpOworCQlyZXEtPndiX2NvbnRleHQtPmVycm9yID0gc3RhdHVzOworCQlkcHJpbnRrKCIsIGVycm9yID0gJWRcbiIsIHN0YXR1cyk7CisJfSBlbHNlIHsKKyNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjMpIHx8IGRlZmluZWQoQ09ORklHX05GU19WNCkKKwkJaWYgKGRhdGEtPnZlcmYuY29tbWl0dGVkIDwgTkZTX0ZJTEVfU1lOQykgeworCQkJaWYgKCFORlNfTkVFRF9DT01NSVQocmVxKSkgeworCQkJCW5mc19kZWZlcl9jb21taXQocmVxKTsKKwkJCQltZW1jcHkoJnJlcS0+d2JfdmVyZiwgJmRhdGEtPnZlcmYsIHNpemVvZihyZXEtPndiX3ZlcmYpKTsKKwkJCQlkcHJpbnRrKCIgZGVmZXIgY29tbWl0XG4iKTsKKwkJCX0gZWxzZSBpZiAobWVtY21wKCZyZXEtPndiX3ZlcmYsICZkYXRhLT52ZXJmLCBzaXplb2YocmVxLT53Yl92ZXJmKSkpIHsKKwkJCQluZnNfZGVmZXJfcmVzY2hlZHVsZShyZXEpOworCQkJCWRwcmludGsoIiBzZXJ2ZXIgcmVib290IGRldGVjdGVkXG4iKTsKKwkJCX0KKwkJfSBlbHNlCisjZW5kaWYKKwkJCWRwcmludGsoIiBPS1xuIik7CisJfQorCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJlcS0+d2JfY29tcGxldGUpKQorCQluZnNfd3JpdGVwYWdlX3JlbGVhc2UocmVxKTsKK30KKworLyoKKyAqIEhhbmRsZSBhIHdyaXRlIHJlcGx5IHRoYXQgZmx1c2hlcyBhIHdob2xlIHBhZ2UuCisgKgorICogRklYTUU6IFRoZXJlIGlzIGFuIGluaGVyZW50IHJhY2Ugd2l0aCBpbnZhbGlkYXRlX2lub2RlX3BhZ2VzIGFuZAorICoJICB3cml0ZWJhY2tzIHNpbmNlIHRoZSBwYWdlLT5jb3VudCBpcyBrZXB0ID4gMSBmb3IgYXMgbG9uZworICoJICBhcyB0aGUgcGFnZSBoYXMgYSB3cml0ZSByZXF1ZXN0IHBlbmRpbmcuCisgKi8KK3N0YXRpYyB2b2lkIG5mc193cml0ZWJhY2tfZG9uZV9mdWxsKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqZGF0YSwgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgbmZzX3BhZ2UJCSpyZXE7CisJc3RydWN0IHBhZ2UJCSpwYWdlOworCisJLyogVXBkYXRlIGF0dHJpYnV0ZXMgYXMgcmVzdWx0IG9mIHdyaXRlYmFjay4gKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmRhdGEtPnBhZ2VzKSkgeworCQlyZXEgPSBuZnNfbGlzdF9lbnRyeShkYXRhLT5wYWdlcy5uZXh0KTsKKwkJbmZzX2xpc3RfcmVtb3ZlX3JlcXVlc3QocmVxKTsKKwkJcGFnZSA9IHJlcS0+d2JfcGFnZTsKKworCQlkcHJpbnRrKCJORlM6IHdyaXRlICglcy8lTGQgJWRAJUxkKSIsCisJCQlyZXEtPndiX2NvbnRleHQtPmRlbnRyeS0+ZF9pbm9kZS0+aV9zYi0+c19pZCwKKwkJCShsb25nIGxvbmcpTkZTX0ZJTEVJRChyZXEtPndiX2NvbnRleHQtPmRlbnRyeS0+ZF9pbm9kZSksCisJCQlyZXEtPndiX2J5dGVzLAorCQkJKGxvbmcgbG9uZylyZXFfb2Zmc2V0KHJlcSkpOworCisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJCXJlcS0+d2JfY29udGV4dC0+ZXJyb3IgPSBzdGF0dXM7CisJCQllbmRfcGFnZV93cml0ZWJhY2socGFnZSk7CisJCQluZnNfaW5vZGVfcmVtb3ZlX3JlcXVlc3QocmVxKTsKKwkJCWRwcmludGsoIiwgZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCQllbmRfcGFnZV93cml0ZWJhY2socGFnZSk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjMpIHx8IGRlZmluZWQoQ09ORklHX05GU19WNCkKKwkJaWYgKGRhdGEtPmFyZ3Muc3RhYmxlICE9IE5GU19VTlNUQUJMRSB8fCBkYXRhLT52ZXJmLmNvbW1pdHRlZCA9PSBORlNfRklMRV9TWU5DKSB7CisJCQluZnNfaW5vZGVfcmVtb3ZlX3JlcXVlc3QocmVxKTsKKwkJCWRwcmludGsoIiBPS1xuIik7CisJCQlnb3RvIG5leHQ7CisJCX0KKwkJbWVtY3B5KCZyZXEtPndiX3ZlcmYsICZkYXRhLT52ZXJmLCBzaXplb2YocmVxLT53Yl92ZXJmKSk7CisJCW5mc19tYXJrX3JlcXVlc3RfY29tbWl0KHJlcSk7CisJCWRwcmludGsoIiBtYXJrZWQgZm9yIGNvbW1pdFxuIik7CisjZWxzZQorCQluZnNfaW5vZGVfcmVtb3ZlX3JlcXVlc3QocmVxKTsKKyNlbmRpZgorCW5leHQ6CisJCW5mc191bmxvY2tfcmVxdWVzdChyZXEpOworCX0KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIFdSSVRFIGNhbGwgaXMgY29tcGxldGUuCisgKi8KK3ZvaWQgbmZzX3dyaXRlYmFja19kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEJKmRhdGEgPSAoc3RydWN0IG5mc193cml0ZV9kYXRhICopIHRhc2stPnRrX2NhbGxkYXRhOworCXN0cnVjdCBuZnNfd3JpdGVhcmdzCSphcmdwID0gJmRhdGEtPmFyZ3M7CisJc3RydWN0IG5mc193cml0ZXJlcwkqcmVzcCA9ICZkYXRhLT5yZXM7CisKKwlkcHJpbnRrKCJORlM6ICU0ZCBuZnNfd3JpdGViYWNrX2RvbmUgKHN0YXR1cyAlZClcbiIsCisJCXRhc2stPnRrX3BpZCwgdGFzay0+dGtfc3RhdHVzKTsKKworI2lmIGRlZmluZWQoQ09ORklHX05GU19WMykgfHwgZGVmaW5lZChDT05GSUdfTkZTX1Y0KQorCWlmIChyZXNwLT52ZXJmLT5jb21taXR0ZWQgPCBhcmdwLT5zdGFibGUgJiYgdGFzay0+dGtfc3RhdHVzID49IDApIHsKKwkJLyogV2UgdHJpZWQgYSB3cml0ZSBjYWxsLCBidXQgdGhlIHNlcnZlciBkaWQgbm90CisJCSAqIGNvbW1pdCBkYXRhIHRvIHN0YWJsZSBzdG9yYWdlIGV2ZW4gdGhvdWdoIHdlCisJCSAqIHJlcXVlc3RlZCBpdC4KKwkJICogTm90ZTogVGhlcmUgaXMgYSBrbm93biBidWcgaW4gVHJ1NjQgPCA1LjAgaW4gd2hpY2gKKwkJICoJIHRoZSBzZXJ2ZXIgcmVwb3J0cyBORlNfREFUQV9TWU5DLCBidXQgcGVyZm9ybXMKKwkJICoJIE5GU19GSUxFX1NZTkMuIFdlIHRoZXJlZm9yZSBpbXBsZW1lbnQgdGhpcyBjaGVja2luZworCQkgKgkgYXMgYSBkcHJpbnRrKCkgaW4gb3JkZXIgdG8gYXZvaWQgZmlsbGluZyBzeXNsb2cuCisJCSAqLworCQlzdGF0aWMgdW5zaWduZWQgbG9uZyAgICBjb21wbGFpbjsKKworCQlpZiAodGltZV9iZWZvcmUoY29tcGxhaW4sIGppZmZpZXMpKSB7CisJCQlkcHJpbnRrKCJORlM6IGZhdWx0eSBORlMgc2VydmVyICVzOiIKKwkJCQkiIChjb21taXR0ZWQgPSAlZCkgIT0gKHN0YWJsZSA9ICVkKVxuIiwKKwkJCQlORlNfU0VSVkVSKGRhdGEtPmlub2RlKS0+aG9zdG5hbWUsCisJCQkJcmVzcC0+dmVyZi0+Y29tbWl0dGVkLCBhcmdwLT5zdGFibGUpOworCQkJY29tcGxhaW4gPSBqaWZmaWVzICsgMzAwICogSFo7CisJCX0KKwl9CisjZW5kaWYKKwkvKiBJcyB0aGlzIGEgc2hvcnQgd3JpdGU/ICovCisJaWYgKHRhc2stPnRrX3N0YXR1cyA+PSAwICYmIHJlc3AtPmNvdW50IDwgYXJncC0+Y291bnQpIHsKKwkJc3RhdGljIHVuc2lnbmVkIGxvbmcgICAgY29tcGxhaW47CisKKwkJLyogSGFzIHRoZSBzZXJ2ZXIgYXQgbGVhc3QgbWFkZSBzb21lIHByb2dyZXNzPyAqLworCQlpZiAocmVzcC0+Y291bnQgIT0gMCkgeworCQkJLyogV2FzIHRoaXMgYW4gTkZTdjIgd3JpdGUgb3IgYW4gTkZTdjMgc3RhYmxlIHdyaXRlPyAqLworCQkJaWYgKHJlc3AtPnZlcmYtPmNvbW1pdHRlZCAhPSBORlNfVU5TVEFCTEUpIHsKKwkJCQkvKiBSZXNlbmQgZnJvbSB3aGVyZSB0aGUgc2VydmVyIGxlZnQgb2ZmICovCisJCQkJYXJncC0+b2Zmc2V0ICs9IHJlc3AtPmNvdW50OworCQkJCWFyZ3AtPnBnYmFzZSArPSByZXNwLT5jb3VudDsKKwkJCQlhcmdwLT5jb3VudCAtPSByZXNwLT5jb3VudDsKKwkJCX0gZWxzZSB7CisJCQkJLyogUmVzZW5kIGFzIGEgc3RhYmxlIHdyaXRlIGluIG9yZGVyIHRvIGF2b2lkCisJCQkJICogaGVhZGFjaGVzIGluIHRoZSBjYXNlIG9mIGEgc2VydmVyIGNyYXNoLgorCQkJCSAqLworCQkJCWFyZ3AtPnN0YWJsZSA9IE5GU19GSUxFX1NZTkM7CisJCQl9CisJCQlycGNfcmVzdGFydF9jYWxsKHRhc2spOworCQkJcmV0dXJuOworCQl9CisJCWlmICh0aW1lX2JlZm9yZShjb21wbGFpbiwgamlmZmllcykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiTkZTOiBTZXJ2ZXIgd3JvdGUgemVybyBieXRlcywgZXhwZWN0ZWQgJXUuXG4iLAorCQkJCQlhcmdwLT5jb3VudCk7CisJCQljb21wbGFpbiA9IGppZmZpZXMgKyAzMDAgKiBIWjsKKwkJfQorCQkvKiBDYW4ndCBkbyBhbnl0aGluZyBhYm91dCBpdCBleGNlcHQgdGhyb3cgYW4gZXJyb3IuICovCisJCXRhc2stPnRrX3N0YXR1cyA9IC1FSU87CisJfQorCisJLyoKKwkgKiBQcm9jZXNzIHRoZSBuZnNfcGFnZSBsaXN0CisJICovCisJZGF0YS0+Y29tcGxldGUoZGF0YSwgdGFzay0+dGtfc3RhdHVzKTsKK30KKworCisjaWYgZGVmaW5lZChDT05GSUdfTkZTX1YzKSB8fCBkZWZpbmVkKENPTkZJR19ORlNfVjQpCitzdGF0aWMgdm9pZCBuZnNfY29tbWl0X3JlbGVhc2Uoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBuZnNfd3JpdGVfZGF0YQkqd2RhdGEgPSAoc3RydWN0IG5mc193cml0ZV9kYXRhICopdGFzay0+dGtfY2FsbGRhdGE7CisJbmZzX2NvbW1pdF9mcmVlKHdkYXRhKTsKK30KKworLyoKKyAqIFNldCB1cCB0aGUgYXJndW1lbnQvcmVzdWx0IHN0b3JhZ2UgcmVxdWlyZWQgZm9yIHRoZSBSUEMgY2FsbC4KKyAqLworc3RhdGljIHZvaWQgbmZzX2NvbW1pdF9ycGNzZXR1cChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLAorCQlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKmRhdGEsIGludCBob3cpCit7CisJc3RydWN0IHJwY190YXNrCQkqdGFzayA9ICZkYXRhLT50YXNrOworCXN0cnVjdCBuZnNfcGFnZQkJKmZpcnN0LCAqbGFzdDsKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZTsKKwlsb2ZmX3QJCQlzdGFydCwgZW5kLCBsZW47CisKKwkvKiBTZXQgdXAgdGhlIFJQQyBhcmd1bWVudCBhbmQgcmVwbHkgc3RydWN0cworCSAqIE5COiB0YWtlIGNhcmUgbm90IHRvIG1lc3MgYWJvdXQgd2l0aCBkYXRhLT5jb21taXQgZXQgYWwuICovCisKKwlsaXN0X3NwbGljZV9pbml0KGhlYWQsICZkYXRhLT5wYWdlcyk7CisJZmlyc3QgPSBuZnNfbGlzdF9lbnRyeShkYXRhLT5wYWdlcy5uZXh0KTsKKwlsYXN0ID0gbmZzX2xpc3RfZW50cnkoZGF0YS0+cGFnZXMucHJldik7CisJaW5vZGUgPSBmaXJzdC0+d2JfY29udGV4dC0+ZGVudHJ5LT5kX2lub2RlOworCisJLyoKKwkgKiBEZXRlcm1pbmUgdGhlIG9mZnNldCByYW5nZSBvZiByZXF1ZXN0cyBpbiB0aGUgQ09NTUlUIGNhbGwuCisJICogV2UgcmVseSBvbiB0aGUgZmFjdCB0aGF0IGRhdGEtPnBhZ2VzIGlzIGFuIG9yZGVyZWQgbGlzdC4uLgorCSAqLworCXN0YXJ0ID0gcmVxX29mZnNldChmaXJzdCk7CisJZW5kID0gcmVxX29mZnNldChsYXN0KSArIGxhc3QtPndiX2J5dGVzOworCWxlbiA9IGVuZCAtIHN0YXJ0OworCS8qIElmICdsZW4nIGlzIG5vdCBhIDMyLWJpdCBxdWFudGl0eSwgcGFzcyAnMCcgaW4gdGhlIENPTU1JVCBjYWxsICovCisJaWYgKGVuZCA+PSBpX3NpemVfcmVhZChpbm9kZSkgfHwgbGVuIDwgMCB8fCBsZW4gPiAofigodTMyKTApID4+IDEpKQorCQlsZW4gPSAwOworCisJZGF0YS0+aW5vZGUJICA9IGlub2RlOworCWRhdGEtPmNyZWQJICA9IGZpcnN0LT53Yl9jb250ZXh0LT5jcmVkOworCisJZGF0YS0+YXJncy5maCAgICAgPSBORlNfRkgoZGF0YS0+aW5vZGUpOworCWRhdGEtPmFyZ3Mub2Zmc2V0ID0gc3RhcnQ7CisJZGF0YS0+YXJncy5jb3VudCAgPSBsZW47CisJZGF0YS0+cmVzLmNvdW50ICAgPSBsZW47CisJZGF0YS0+cmVzLmZhdHRyICAgPSAmZGF0YS0+ZmF0dHI7CisJZGF0YS0+cmVzLnZlcmYgICAgPSAmZGF0YS0+dmVyZjsKKwkKKwlORlNfUFJPVE8oaW5vZGUpLT5jb21taXRfc2V0dXAoZGF0YSwgaG93KTsKKworCWRhdGEtPnRhc2sudGtfcHJpb3JpdHkgPSBmbHVzaF90YXNrX3ByaW9yaXR5KGhvdyk7CisJZGF0YS0+dGFzay50a19jb29raWUgPSAodW5zaWduZWQgbG9uZylpbm9kZTsKKwlkYXRhLT50YXNrLnRrX2NhbGxkYXRhID0gZGF0YTsKKwkvKiBSZWxlYXNlIHJlcXVlc3RzICovCisJZGF0YS0+dGFzay50a19yZWxlYXNlID0gbmZzX2NvbW1pdF9yZWxlYXNlOworCQorCWRwcmludGsoIk5GUzogJTRkIGluaXRpYXRlZCBjb21taXQgY2FsbFxuIiwgdGFzay0+dGtfcGlkKTsKK30KKworLyoKKyAqIENvbW1pdCBkaXJ0eSBwYWdlcworICovCitzdGF0aWMgaW50CituZnNfY29tbWl0X2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgaW50IGhvdykKK3sKKwlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEJKmRhdGE7CisJc3RydWN0IG5mc19wYWdlICAgICAgICAgKnJlcTsKKworCWRhdGEgPSBuZnNfY29tbWl0X2FsbG9jKCk7CisKKwlpZiAoIWRhdGEpCisJCWdvdG8gb3V0X2JhZDsKKworCS8qIFNldCB1cCB0aGUgYXJndW1lbnQgc3RydWN0ICovCisJbmZzX2NvbW1pdF9ycGNzZXR1cChoZWFkLCBkYXRhLCBob3cpOworCisJbmZzX2V4ZWN1dGVfd3JpdGUoZGF0YSk7CisJcmV0dXJuIDA7Cisgb3V0X2JhZDoKKwl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKKwkJcmVxID0gbmZzX2xpc3RfZW50cnkoaGVhZC0+bmV4dCk7CisJCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7CisJCW5mc19tYXJrX3JlcXVlc3RfY29tbWl0KHJlcSk7CisJCW5mc191bmxvY2tfcmVxdWVzdChyZXEpOworCX0KKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoKKyAqIENPTU1JVCBjYWxsIHJldHVybmVkCisgKi8KK3ZvaWQKK25mc19jb21taXRfZG9uZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IG5mc193cml0ZV9kYXRhCSpkYXRhID0gKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqKXRhc2stPnRrX2NhbGxkYXRhOworCXN0cnVjdCBuZnNfcGFnZQkJKnJlcTsKKwlpbnQgcmVzID0gMDsKKworICAgICAgICBkcHJpbnRrKCJORlM6ICU0ZCBuZnNfY29tbWl0X2RvbmUgKHN0YXR1cyAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2stPnRrX3BpZCwgdGFzay0+dGtfc3RhdHVzKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmZGF0YS0+cGFnZXMpKSB7CisJCXJlcSA9IG5mc19saXN0X2VudHJ5KGRhdGEtPnBhZ2VzLm5leHQpOworCQluZnNfbGlzdF9yZW1vdmVfcmVxdWVzdChyZXEpOworCisJCWRwcmludGsoIk5GUzogY29tbWl0ICglcy8lTGQgJWRAJUxkKSIsCisJCQlyZXEtPndiX2NvbnRleHQtPmRlbnRyeS0+ZF9pbm9kZS0+aV9zYi0+c19pZCwKKwkJCShsb25nIGxvbmcpTkZTX0ZJTEVJRChyZXEtPndiX2NvbnRleHQtPmRlbnRyeS0+ZF9pbm9kZSksCisJCQlyZXEtPndiX2J5dGVzLAorCQkJKGxvbmcgbG9uZylyZXFfb2Zmc2V0KHJlcSkpOworCQlpZiAodGFzay0+dGtfc3RhdHVzIDwgMCkgeworCQkJcmVxLT53Yl9jb250ZXh0LT5lcnJvciA9IHRhc2stPnRrX3N0YXR1czsKKwkJCW5mc19pbm9kZV9yZW1vdmVfcmVxdWVzdChyZXEpOworCQkJZHByaW50aygiLCBlcnJvciA9ICVkXG4iLCB0YXNrLT50a19zdGF0dXMpOworCQkJZ290byBuZXh0OworCQl9CisKKwkJLyogT2theSwgQ09NTUlUIHN1Y2NlZWRlZCwgYXBwYXJlbnRseS4gQ2hlY2sgdGhlIHZlcmlmaWVyCisJCSAqIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIgYWdhaW5zdCBhbGwgc3RvcmVkIHZlcmZzLiAqLworCQlpZiAoIW1lbWNtcChyZXEtPndiX3ZlcmYudmVyaWZpZXIsIGRhdGEtPnZlcmYudmVyaWZpZXIsIHNpemVvZihkYXRhLT52ZXJmLnZlcmlmaWVyKSkpIHsKKwkJCS8qIFdlIGhhdmUgYSBtYXRjaCAqLworCQkJbmZzX2lub2RlX3JlbW92ZV9yZXF1ZXN0KHJlcSk7CisJCQlkcHJpbnRrKCIgT0tcbiIpOworCQkJZ290byBuZXh0OworCQl9CisJCS8qIFdlIGhhdmUgYSBtaXNtYXRjaC4gV3JpdGUgdGhlIHBhZ2UgYWdhaW4gKi8KKwkJZHByaW50aygiIG1pc21hdGNoXG4iKTsKKwkJbmZzX21hcmtfcmVxdWVzdF9kaXJ0eShyZXEpOworCW5leHQ6CisJCW5mc191bmxvY2tfcmVxdWVzdChyZXEpOworCQlyZXMrKzsKKwl9CisJc3ViX3BhZ2Vfc3RhdGUobnJfdW5zdGFibGUscmVzKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IG5mc19mbHVzaF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGlkeF9zdGFydCwKKwkJCSAgIHVuc2lnbmVkIGludCBucGFnZXMsIGludCBob3cpCit7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKwlMSVNUX0hFQUQoaGVhZCk7CisJaW50CQkJcmVzLAorCQkJCWVycm9yID0gMDsKKworCXNwaW5fbG9jaygmbmZzaS0+cmVxX2xvY2spOworCXJlcyA9IG5mc19zY2FuX2RpcnR5KGlub2RlLCAmaGVhZCwgaWR4X3N0YXJ0LCBucGFnZXMpOworCXNwaW5fdW5sb2NrKCZuZnNpLT5yZXFfbG9jayk7CisJaWYgKHJlcykKKwkJZXJyb3IgPSBuZnNfZmx1c2hfbGlzdCgmaGVhZCwgTkZTX1NFUlZFUihpbm9kZSktPndwYWdlcywgaG93KTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIHJlczsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX05GU19WMykgfHwgZGVmaW5lZChDT05GSUdfTkZTX1Y0KQoraW50IG5mc19jb21taXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBpZHhfc3RhcnQsCisJCSAgICB1bnNpZ25lZCBpbnQgbnBhZ2VzLCBpbnQgaG93KQoreworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisJTElTVF9IRUFEKGhlYWQpOworCWludAkJCXJlcywKKwkJCQllcnJvciA9IDA7CisKKwlzcGluX2xvY2soJm5mc2ktPnJlcV9sb2NrKTsKKwlyZXMgPSBuZnNfc2Nhbl9jb21taXQoaW5vZGUsICZoZWFkLCBpZHhfc3RhcnQsIG5wYWdlcyk7CisJaWYgKHJlcykgeworCQlyZXMgKz0gbmZzX3NjYW5fY29tbWl0KGlub2RlLCAmaGVhZCwgMCwgMCk7CisJCXNwaW5fdW5sb2NrKCZuZnNpLT5yZXFfbG9jayk7CisJCWVycm9yID0gbmZzX2NvbW1pdF9saXN0KCZoZWFkLCBob3cpOworCX0gZWxzZQorCQlzcGluX3VubG9jaygmbmZzaS0+cmVxX2xvY2spOworCWlmIChlcnJvciA8IDApCisJCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gcmVzOworfQorI2VuZGlmCisKK2ludCBuZnNfc3luY19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGlkeF9zdGFydCwKKwkJICB1bnNpZ25lZCBpbnQgbnBhZ2VzLCBpbnQgaG93KQoreworCWludAllcnJvciwKKwkJd2FpdDsKKworCXdhaXQgPSBob3cgJiBGTFVTSF9XQUlUOworCWhvdyAmPSB+RkxVU0hfV0FJVDsKKworCWRvIHsKKwkJZXJyb3IgPSAwOworCQlpZiAod2FpdCkKKwkJCWVycm9yID0gbmZzX3dhaXRfb25fcmVxdWVzdHMoaW5vZGUsIGlkeF9zdGFydCwgbnBhZ2VzKTsKKwkJaWYgKGVycm9yID09IDApCisJCQllcnJvciA9IG5mc19mbHVzaF9pbm9kZShpbm9kZSwgaWR4X3N0YXJ0LCBucGFnZXMsIGhvdyk7CisjaWYgZGVmaW5lZChDT05GSUdfTkZTX1YzKSB8fCBkZWZpbmVkKENPTkZJR19ORlNfVjQpCisJCWlmIChlcnJvciA9PSAwKQorCQkJZXJyb3IgPSBuZnNfY29tbWl0X2lub2RlKGlub2RlLCBpZHhfc3RhcnQsIG5wYWdlcywgaG93KTsKKyNlbmRpZgorCX0gd2hpbGUgKGVycm9yID4gMCk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgbmZzX2luaXRfd3JpdGVwYWdlY2FjaGUodm9pZCkKK3sKKwluZnNfd2RhdGFfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoIm5mc193cml0ZV9kYXRhIiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IG5mc193cml0ZV9kYXRhKSwKKwkJCQkJICAgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJCSAgICAgTlVMTCwgTlVMTCk7CisJaWYgKG5mc193ZGF0YV9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwluZnNfd2RhdGFfbWVtcG9vbCA9IG1lbXBvb2xfY3JlYXRlKE1JTl9QT09MX1dSSVRFLAorCQkJCQkgICBtZW1wb29sX2FsbG9jX3NsYWIsCisJCQkJCSAgIG1lbXBvb2xfZnJlZV9zbGFiLAorCQkJCQkgICBuZnNfd2RhdGFfY2FjaGVwKTsKKwlpZiAobmZzX3dkYXRhX21lbXBvb2wgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwluZnNfY29tbWl0X21lbXBvb2wgPSBtZW1wb29sX2NyZWF0ZShNSU5fUE9PTF9DT01NSVQsCisJCQkJCSAgIG1lbXBvb2xfYWxsb2Nfc2xhYiwKKwkJCQkJICAgbWVtcG9vbF9mcmVlX3NsYWIsCisJCQkJCSAgIG5mc193ZGF0YV9jYWNoZXApOworCWlmIChuZnNfY29tbWl0X21lbXBvb2wgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBuZnNfZGVzdHJveV93cml0ZXBhZ2VjYWNoZSh2b2lkKQoreworCW1lbXBvb2xfZGVzdHJveShuZnNfY29tbWl0X21lbXBvb2wpOworCW1lbXBvb2xfZGVzdHJveShuZnNfd2RhdGFfbWVtcG9vbCk7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShuZnNfd2RhdGFfY2FjaGVwKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAibmZzX3dyaXRlX2RhdGE6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvbmZzY3RsLmMgYi9mcy9uZnNjdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjE0OTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzY3RsLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKglmcy9uZnNjdGwuYworICoKKyAqCVRoaXMgc2hvdWxkIGV2ZW50dWFsbHkgbW92ZSB0byB1c2VybGFuZC4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9zeXNjYWxsLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qCisgKiBvcGVuIGEgZmlsZSBvbiBuZnNkIGZzCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlICpkb19vcGVuKGNoYXIgKm5hbWUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCBlcnJvcjsKKworCW5kLm1udCA9IGRvX2tlcm5fbW91bnQoIm5mc2QiLCAwLCAibmZzZCIsIE5VTEwpOworCisJaWYgKElTX0VSUihuZC5tbnQpKQorCQlyZXR1cm4gKHN0cnVjdCBmaWxlICopbmQubW50OworCisJbmQuZGVudHJ5ID0gZGdldChuZC5tbnQtPm1udF9yb290KTsKKwluZC5sYXN0X3R5cGUgPSBMQVNUX1JPT1Q7CisJbmQuZmxhZ3MgPSAwOworCW5kLmRlcHRoID0gMDsKKworCWVycm9yID0gcGF0aF93YWxrKG5hbWUsICZuZCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7CisKKwlpZiAoZmxhZ3MgPT0gT19SRFdSKQorCQllcnJvciA9IG1heV9vcGVuKCZuZCxNQVlfUkVBRHxNQVlfV1JJVEUsRk1PREVfUkVBRHxGTU9ERV9XUklURSk7CisJZWxzZQorCQllcnJvciA9IG1heV9vcGVuKCZuZCwgTUFZX1dSSVRFLCBGTU9ERV9XUklURSk7CisKKwlpZiAoIWVycm9yKQorCQlyZXR1cm4gZGVudHJ5X29wZW4obmQuZGVudHJ5LCBuZC5tbnQsIGZsYWdzKTsKKworCXBhdGhfcmVsZWFzZSgmbmQpOworCXJldHVybiBFUlJfUFRSKGVycm9yKTsKK30KKworc3RhdGljIHN0cnVjdCB7CisJY2hhciAqbmFtZTsgaW50IHdzaXplOyBpbnQgcnNpemU7Cit9IG1hcFtdID0geworCVtORlNDVExfU1ZDXSA9IHsKKwkJLm5hbWUJPSAiLnN2YyIsCisJCS53c2l6ZQk9IHNpemVvZihzdHJ1Y3QgbmZzY3RsX3N2YykKKwl9LAorCVtORlNDVExfQUREQ0xJRU5UXSA9IHsKKwkJLm5hbWUJPSAiLmFkZCIsCisJCS53c2l6ZQk9IHNpemVvZihzdHJ1Y3QgbmZzY3RsX2NsaWVudCkKKwl9LAorCVtORlNDVExfREVMQ0xJRU5UXSA9IHsKKwkJLm5hbWUJPSAiLmRlbCIsCisJCS53c2l6ZQk9IHNpemVvZihzdHJ1Y3QgbmZzY3RsX2NsaWVudCkKKwl9LAorCVtORlNDVExfRVhQT1JUXSA9IHsKKwkJLm5hbWUJPSAiLmV4cG9ydCIsCisJCS53c2l6ZQk9IHNpemVvZihzdHJ1Y3QgbmZzY3RsX2V4cG9ydCkKKwl9LAorCVtORlNDVExfVU5FWFBPUlRdID0geworCQkubmFtZQk9ICIudW5leHBvcnQiLAorCQkud3NpemUJPSBzaXplb2Yoc3RydWN0IG5mc2N0bF9leHBvcnQpCisJfSwKKwlbTkZTQ1RMX0dFVEZEXSA9IHsKKwkJLm5hbWUJPSAiLmdldGZkIiwKKwkJLndzaXplCT0gc2l6ZW9mKHN0cnVjdCBuZnNjdGxfZmRwYXJtKSwKKwkJLnJzaXplCT0gTkZTX0ZIU0laRQorCX0sCisJW05GU0NUTF9HRVRGU10gPSB7CisJCS5uYW1lCT0gIi5nZXRmcyIsCisJCS53c2l6ZQk9IHNpemVvZihzdHJ1Y3QgbmZzY3RsX2ZzcGFybSksCisJCS5yc2l6ZQk9IHNpemVvZihzdHJ1Y3Qga25mc2RfZmgpCisJfSwKK307CisKK2xvbmcKK2FzbWxpbmthZ2Ugc3lzX25mc3NlcnZjdGwoaW50IGNtZCwgc3RydWN0IG5mc2N0bF9hcmcgX191c2VyICphcmcsIHZvaWQgX191c2VyICpyZXMpCit7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJdm9pZCBfX3VzZXIgKnAgPSAmYXJnLT51OworCWludCB2ZXJzaW9uOworCWludCBlcnI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnZlcnNpb24sICZhcmctPmNhX3ZlcnNpb24sIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAodmVyc2lvbiAhPSBORlNDVExfVkVSU0lPTikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJuZnNkOiBpbmNvbXBhdGlibGUgdmVyc2lvbiBpbiBzeXNjYWxsLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjbWQgPCAwIHx8IGNtZCA+PSBzaXplb2YobWFwKS9zaXplb2YobWFwWzBdKSB8fCAhbWFwW2NtZF0ubmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmaWxlID0gZG9fb3BlbihtYXBbY21kXS5uYW1lLCBtYXBbY21kXS5yc2l6ZSA/IE9fUkRXUiA6IE9fV1JPTkxZKTsJCisJaWYgKElTX0VSUihmaWxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoZmlsZSk7CisJZXJyID0gZmlsZS0+Zl9vcC0+d3JpdGUoZmlsZSwgcCwgbWFwW2NtZF0ud3NpemUsICZmaWxlLT5mX3Bvcyk7CisJaWYgKGVyciA+PSAwICYmIG1hcFtjbWRdLnJzaXplKQorCQllcnIgPSBmaWxlLT5mX29wLT5yZWFkKGZpbGUsIHJlcywgbWFwW2NtZF0ucnNpemUsICZmaWxlLT5mX3Bvcyk7CisJaWYgKGVyciA+PSAwKQorCQllcnIgPSAwOworCWZwdXQoZmlsZSk7CisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2ZzL25mc2QvTWFrZWZpbGUgYi9mcy9uZnNkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NjgwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnNkL01ha2VmaWxlCkBAIC0wLDAgKzEsMTIgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBuZnMgc2VydmVyCisjCisKK29iai0kKENPTkZJR19ORlNEKQkrPSBuZnNkLm8KKworbmZzZC15IAkJCTo9IG5mc3N2Yy5vIG5mc2N0bC5vIG5mc3Byb2MubyBuZnNmaC5vIHZmcy5vIFwKKwkJCSAgIGV4cG9ydC5vIGF1dGgubyBsb2NrZC5vIG5mc2NhY2hlLm8gbmZzeGRyLm8gc3RhdHMubworbmZzZC0kKENPTkZJR19ORlNEX1YzKQkrPSBuZnMzcHJvYy5vIG5mczN4ZHIubworbmZzZC0kKENPTkZJR19ORlNEX1Y0KQkrPSBuZnM0cHJvYy5vIG5mczR4ZHIubyBuZnM0c3RhdGUubyBuZnM0aWRtYXAubyBcCisJCQkgICBuZnM0YWNsLm8gbmZzNGNhbGxiYWNrLm8KK25mc2Qtb2JqcwkJOj0gJChuZnNkLXkpCmRpZmYgLS1naXQgYS9mcy9uZnNkL2F1dGguYyBiL2ZzL25mc2QvYXV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZTljZTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnNkL2F1dGguYwpAQCAtMCwwICsxLDYzIEBACisvKgorICogbGludXgvZnMvbmZzZC9hdXRoLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y2F1dGguaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKworI2RlZmluZQlDQVBfTkZTRF9NQVNLIChDQVBfRlNfTUFTS3xDQVBfVE9fTUFTSyhDQVBfU1lTX1JFU09VUkNFKSkKKworaW50IG5mc2Rfc2V0dXNlcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwKQoreworCXN0cnVjdCBzdmNfY3JlZAkqY3JlZCA9ICZycXN0cC0+cnFfY3JlZDsKKwlpbnQgaTsKKwlpbnQgcmV0OworCisJaWYgKGV4cC0+ZXhfZmxhZ3MgJiBORlNFWFBfQUxMU1FVQVNIKSB7CisJCWNyZWQtPmNyX3VpZCA9IGV4cC0+ZXhfYW5vbl91aWQ7CisJCWNyZWQtPmNyX2dpZCA9IGV4cC0+ZXhfYW5vbl9naWQ7CisJCXB1dF9ncm91cF9pbmZvKGNyZWQtPmNyX2dyb3VwX2luZm8pOworCQljcmVkLT5jcl9ncm91cF9pbmZvID0gZ3JvdXBzX2FsbG9jKDApOworCX0gZWxzZSBpZiAoZXhwLT5leF9mbGFncyAmIE5GU0VYUF9ST09UU1FVQVNIKSB7CisJCXN0cnVjdCBncm91cF9pbmZvICpnaTsKKwkJaWYgKCFjcmVkLT5jcl91aWQpCisJCQljcmVkLT5jcl91aWQgPSBleHAtPmV4X2Fub25fdWlkOworCQlpZiAoIWNyZWQtPmNyX2dpZCkKKwkJCWNyZWQtPmNyX2dpZCA9IGV4cC0+ZXhfYW5vbl9naWQ7CisJCWdpID0gZ3JvdXBzX2FsbG9jKGNyZWQtPmNyX2dyb3VwX2luZm8tPm5ncm91cHMpOworCQlpZiAoZ2kpCisJCQlmb3IgKGkgPSAwOyBpIDwgY3JlZC0+Y3JfZ3JvdXBfaW5mby0+bmdyb3VwczsgaSsrKSB7CisJCQkJaWYgKCFHUk9VUF9BVChjcmVkLT5jcl9ncm91cF9pbmZvLCBpKSkKKwkJCQkJR1JPVVBfQVQoZ2ksIGkpID0gZXhwLT5leF9hbm9uX2dpZDsKKwkJCQllbHNlCisJCQkJCUdST1VQX0FUKGdpLCBpKSA9IEdST1VQX0FUKGNyZWQtPmNyX2dyb3VwX2luZm8sIGkpOworCQkJfQorCQlwdXRfZ3JvdXBfaW5mbyhjcmVkLT5jcl9ncm91cF9pbmZvKTsKKwkJY3JlZC0+Y3JfZ3JvdXBfaW5mbyA9IGdpOworCX0KKworCWlmIChjcmVkLT5jcl91aWQgIT0gKHVpZF90KSAtMSkKKwkJY3VycmVudC0+ZnN1aWQgPSBjcmVkLT5jcl91aWQ7CisJZWxzZQorCQljdXJyZW50LT5mc3VpZCA9IGV4cC0+ZXhfYW5vbl91aWQ7CisJaWYgKGNyZWQtPmNyX2dpZCAhPSAoZ2lkX3QpIC0xKQorCQljdXJyZW50LT5mc2dpZCA9IGNyZWQtPmNyX2dpZDsKKwllbHNlCisJCWN1cnJlbnQtPmZzZ2lkID0gZXhwLT5leF9hbm9uX2dpZDsKKworCWlmICghY3JlZC0+Y3JfZ3JvdXBfaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0ID0gc2V0X2N1cnJlbnRfZ3JvdXBzKGNyZWQtPmNyX2dyb3VwX2luZm8pOworCWlmICgoY3JlZC0+Y3JfdWlkKSkgeworCQljYXBfdChjdXJyZW50LT5jYXBfZWZmZWN0aXZlKSAmPSB+Q0FQX05GU0RfTUFTSzsKKwl9IGVsc2UgeworCQljYXBfdChjdXJyZW50LT5jYXBfZWZmZWN0aXZlKSB8PSAoQ0FQX05GU0RfTUFTSyAmCisJCQkJCQkgIGN1cnJlbnQtPmNhcF9wZXJtaXR0ZWQpOworCX0KKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9leHBvcnQuYyBiL2ZzL25mc2QvZXhwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExMWFhMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mc2QvZXhwb3J0LmMKQEAgLTAsMCArMSwxMjAwIEBACisjZGVmaW5lIE1TTkZTCS8qIEhBQ0sgSEFDSyAqLworLyoKKyAqIGxpbnV4L2ZzL25mc2QvZXhwb3J0LmMKKyAqCisgKiBORlMgZXhwb3J0aW5nIGFuZCB2YWxpZGF0aW9uLgorICoKKyAqIFdlIG1haW50YWluIGEgbGlzdCBvZiBjbGllbnRzLCBlYWNoIG9mIHdoaWNoIGhhcyBhIGxpc3Qgb2YKKyAqIGV4cG9ydHMuIFRvIGV4cG9ydCBhbiBmcyB0byBhIGdpdmVuIGNsaWVudCwgeW91IGZpcnN0IGhhdmUKKyAqIHRvIGNyZWF0ZSB0aGUgY2xpZW50IGVudHJ5IHdpdGggTkZTQ1RMX0FERENMSUVOVCwgd2hpY2gKKyAqIGNyZWF0ZXMgYSBjbGllbnQgY29udHJvbCBibG9jayBhbmQgYWRkcyBpdCB0byB0aGUgaGFzaAorICogdGFibGUuIFRoZW4sIHlvdSBjYWxsIE5GU0NUTF9FWFBPUlQgZm9yIGVhY2ggZnMuCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBPbGFmIEtpcmNoLCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNmaC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2Qvc3lzY2FsbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2JpbmQuaD4KKworI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZCU5GU0REQkdfRVhQT1JUCisjZGVmaW5lIE5GU0RfUEFSQU5PSUEgMQorCit0eXBlZGVmIHN0cnVjdCBhdXRoX2RvbWFpbglzdmNfY2xpZW50OwordHlwZWRlZiBzdHJ1Y3Qgc3ZjX2V4cG9ydAlzdmNfZXhwb3J0OworCitzdGF0aWMgdm9pZAkJZXhwX2RvX3VuZXhwb3J0KHN2Y19leHBvcnQgKnVuZXhwKTsKK3N0YXRpYyBpbnQJCWV4cF92ZXJpZnlfc3RyaW5nKGNoYXIgKmNwLCBpbnQgbWF4KTsKKworLyoKKyAqIFdlIGhhdmUgdHdvIGNhY2hlcy4KKyAqIE9uZSBtYXBzIGNsaWVudCt2ZnNtbnQrZGVudHJ5IHRvIGV4cG9ydCBvcHRpb25zIC0gdGhlIGV4cG9ydCBtYXAKKyAqIFRoZSBvdGhlciBtYXBzIGNsaWVudCtmaWxlaGFuZGxlLWZyYWdtZW50IHRvIGV4cG9ydCBvcHRpb25zLiAtIHRoZSBleHBrZXkgbWFwCisgKgorICogVGhlIGV4cG9ydCBvcHRpb25zIGFyZSBhY3R1YWxseSBzdG9yZWQgaW4gdGhlIGZpcnN0IG1hcCwgYW5kIHRoZQorICogc2Vjb25kIG1hcCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgZW50cnkgaW4gdGhlIGZpcnN0IG1hcC4KKyAqLworCisjZGVmaW5lCUVYUEtFWV9IQVNIQklUUwkJOAorI2RlZmluZQlFWFBLRVlfSEFTSE1BWAkJKDEgPDwgRVhQS0VZX0hBU0hCSVRTKQorI2RlZmluZQlFWFBLRVlfSEFTSE1BU0sJCShFWFBLRVlfSEFTSE1BWCAtMSkKK3N0YXRpYyBzdHJ1Y3QgY2FjaGVfaGVhZCAqZXhwa2V5X3RhYmxlW0VYUEtFWV9IQVNITUFYXTsKKworc3RhdGljIGlubGluZSBpbnQgc3ZjX2V4cGtleV9oYXNoKHN0cnVjdCBzdmNfZXhwa2V5ICppdGVtKQoreworCWludCBoYXNoID0gaXRlbS0+ZWtfZnNpZHR5cGU7CisJY2hhciAqIGNwID0gKGNoYXIqKWl0ZW0tPmVrX2ZzaWQ7CisJaW50IGxlbiA9IGtleV9sZW4oaXRlbS0+ZWtfZnNpZHR5cGUpOworCisJaGFzaCBePSBoYXNoX21lbShjcCwgbGVuLCBFWFBLRVlfSEFTSEJJVFMpOworCWhhc2ggXj0gaGFzaF9wdHIoaXRlbS0+ZWtfY2xpZW50LCBFWFBLRVlfSEFTSEJJVFMpOworCXJldHVybiBoYXNoICYgRVhQS0VZX0hBU0hNQVNLOworfQorCit2b2lkIGV4cGtleV9wdXQoc3RydWN0IGNhY2hlX2hlYWQgKml0ZW0sIHN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkKQoreworCWlmIChjYWNoZV9wdXQoaXRlbSwgY2QpKSB7CisJCXN0cnVjdCBzdmNfZXhwa2V5ICprZXkgPSBjb250YWluZXJfb2YoaXRlbSwgc3RydWN0IHN2Y19leHBrZXksIGgpOworCQlpZiAodGVzdF9iaXQoQ0FDSEVfVkFMSUQsICZpdGVtLT5mbGFncykgJiYKKwkJICAgICF0ZXN0X2JpdChDQUNIRV9ORUdBVElWRSwgJml0ZW0tPmZsYWdzKSkKKwkJCWV4cF9wdXQoa2V5LT5la19leHBvcnQpOworCQlhdXRoX2RvbWFpbl9wdXQoa2V5LT5la19jbGllbnQpOworCQlrZnJlZShrZXkpOworCX0KK30KKworc3RhdGljIHZvaWQgZXhwa2V5X3JlcXVlc3Qoc3RydWN0IGNhY2hlX2RldGFpbCAqY2QsCisJCQkgICBzdHJ1Y3QgY2FjaGVfaGVhZCAqaCwKKwkJCSAgIGNoYXIgKipicHAsIGludCAqYmxlbikKK3sKKwkvKiBjbGllbnQgZnNpZHR5cGUgXHhmc2lkICovCisJc3RydWN0IHN2Y19leHBrZXkgKmVrID0gY29udGFpbmVyX29mKGgsIHN0cnVjdCBzdmNfZXhwa2V5LCBoKTsKKwljaGFyIHR5cGVbNV07CisKKwlxd29yZF9hZGQoYnBwLCBibGVuLCBlay0+ZWtfY2xpZW50LT5uYW1lKTsKKwlzbnByaW50Zih0eXBlLCA1LCAiJWQiLCBlay0+ZWtfZnNpZHR5cGUpOworCXF3b3JkX2FkZChicHAsIGJsZW4sIHR5cGUpOworCXF3b3JkX2FkZGhleChicHAsIGJsZW4sIChjaGFyKillay0+ZWtfZnNpZCwga2V5X2xlbihlay0+ZWtfZnNpZHR5cGUpKTsKKwkoKmJwcClbLTFdID0gJ1xuJzsKK30KKworc3RhdGljIHN0cnVjdCBzdmNfZXhwa2V5ICpzdmNfZXhwa2V5X2xvb2t1cChzdHJ1Y3Qgc3ZjX2V4cGtleSAqLCBpbnQpOworc3RhdGljIGludCBleHBrZXlfcGFyc2Uoc3RydWN0IGNhY2hlX2RldGFpbCAqY2QsIGNoYXIgKm1lc2csIGludCBtbGVuKQoreworCS8qIGNsaWVudCBmc2lkdHlwZSBmc2lkIFtwYXRoXSAqLworCWNoYXIgKmJ1ZjsKKwlpbnQgbGVuOworCXN0cnVjdCBhdXRoX2RvbWFpbiAqZG9tID0gTlVMTDsKKwlpbnQgZXJyOworCWludCBmc2lkdHlwZTsKKwljaGFyICplcDsKKwlzdHJ1Y3Qgc3ZjX2V4cGtleSBrZXk7CisKKwlpZiAobWVzZ1ttbGVuLTFdICE9ICdcbicpCisJCXJldHVybiAtRUlOVkFMOworCW1lc2dbbWxlbi0xXSA9IDA7CisKKwlidWYgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWJ1ZikgZ290byBvdXQ7CisKKwllcnIgPSAtRUlOVkFMOworCWlmICgobGVuPXF3b3JkX2dldCgmbWVzZywgYnVmLCBQQUdFX1NJWkUpKSA8PSAwKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FTk9FTlQ7CisJZG9tID0gYXV0aF9kb21haW5fZmluZChidWYpOworCWlmICghZG9tKQorCQlnb3RvIG91dDsKKwlkcHJpbnRrKCJmb3VuZCBkb21haW4gJXNcbiIsIGJ1Zik7CisKKwllcnIgPSAtRUlOVkFMOworCWlmICgobGVuPXF3b3JkX2dldCgmbWVzZywgYnVmLCBQQUdFX1NJWkUpKSA8PSAwKQorCQlnb3RvIG91dDsKKwlmc2lkdHlwZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVwLCAxMCk7CisJaWYgKCplcCkKKwkJZ290byBvdXQ7CisJZHByaW50aygiZm91bmQgZnNpZHR5cGUgJWRcbiIsIGZzaWR0eXBlKTsKKwlpZiAoZnNpZHR5cGUgPiAyKQorCQlnb3RvIG91dDsKKwlpZiAoKGxlbj1xd29yZF9nZXQoJm1lc2csIGJ1ZiwgUEFHRV9TSVpFKSkgPD0gMCkKKwkJZ290byBvdXQ7CisJZHByaW50aygiZm91bmQgZnNpZCBsZW5ndGggJWRcbiIsIGxlbik7CisJaWYgKGxlbiAhPSBrZXlfbGVuKGZzaWR0eXBlKSkKKwkJZ290byBvdXQ7CisKKwkvKiBPSywgd2Ugc2VlbSB0byBoYXZlIGEgdmFsaWQga2V5ICovCisJa2V5LmguZmxhZ3MgPSAwOworCWtleS5oLmV4cGlyeV90aW1lID0gZ2V0X2V4cGlyeSgmbWVzZyk7CisJaWYgKGtleS5oLmV4cGlyeV90aW1lID09IDApCisJCWdvdG8gb3V0OworCisJa2V5LmVrX2NsaWVudCA9IGRvbTsJCisJa2V5LmVrX2ZzaWR0eXBlID0gZnNpZHR5cGU7CisJbWVtY3B5KGtleS5la19mc2lkLCBidWYsIGxlbik7CisKKwkvKiBub3cgd2Ugd2FudCBhIHBhdGhuYW1lLCBvciBlbXB0eSBtZWFuaW5nIE5FR0FUSVZFICAqLworCWlmICgobGVuPXF3b3JkX2dldCgmbWVzZywgYnVmLCBQQUdFX1NJWkUpKSA8IDApCisJCWdvdG8gb3V0OworCWRwcmludGsoIlBhdGggc2VlbXMgdG8gYmUgPCVzPlxuIiwgYnVmKTsKKwllcnIgPSAwOworCWlmIChsZW4gPT0gMCkgeworCQlzdHJ1Y3Qgc3ZjX2V4cGtleSAqZWs7CisJCXNldF9iaXQoQ0FDSEVfTkVHQVRJVkUsICZrZXkuaC5mbGFncyk7CisJCWVrID0gc3ZjX2V4cGtleV9sb29rdXAoJmtleSwgMSk7CisJCWlmIChlaykKKwkJCWV4cGtleV9wdXQoJmVrLT5oLCAmc3ZjX2V4cGtleV9jYWNoZSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwkJc3RydWN0IHN2Y19leHBrZXkgKmVrOworCQlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwOworCQllcnIgPSBwYXRoX2xvb2t1cChidWYsIDAsICZuZCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKworCQlkcHJpbnRrKCJGb3VuZCB0aGUgcGF0aCAlc1xuIiwgYnVmKTsKKwkJZXhwID0gZXhwX2dldF9ieV9uYW1lKGRvbSwgbmQubW50LCBuZC5kZW50cnksIE5VTEwpOworCisJCWVyciA9IC1FTk9FTlQ7CisJCWlmICghZXhwKQorCQkJZ290byBvdXRfbmQ7CisJCWtleS5la19leHBvcnQgPSBleHA7CisJCWRwcmludGsoIkFuZCBmb3VuZCBleHBvcnRcbiIpOworCQkKKwkJZWsgPSBzdmNfZXhwa2V5X2xvb2t1cCgma2V5LCAxKTsKKwkJaWYgKGVrKQorCQkJZXhwa2V5X3B1dCgmZWstPmgsICZzdmNfZXhwa2V5X2NhY2hlKTsKKwkJZXhwX3B1dChleHApOworCQllcnIgPSAwOworCW91dF9uZDoKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJfQorCWNhY2hlX2ZsdXNoKCk7Cisgb3V0OgorCWlmIChkb20pCisJCWF1dGhfZG9tYWluX3B1dChkb20pOworCWlmIChidWYpCisJCWtmcmVlKGJ1Zik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBleHBrZXlfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sCisJCSAgICAgICBzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCwKKwkJICAgICAgIHN0cnVjdCBjYWNoZV9oZWFkICpoKQoreworCXN0cnVjdCBzdmNfZXhwa2V5ICplayA7CisKKwlpZiAoaCA9PU5VTEwpIHsKKwkJc2VxX3B1dHMobSwgIiNkb21haW4gZnNpZHR5cGUgZnNpZCBbcGF0aF1cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJZWsgPSBjb250YWluZXJfb2YoaCwgc3RydWN0IHN2Y19leHBrZXksIGgpOworCXNlcV9wcmludGYobSwgIiVzICVkIDB4JTA4eCIsIGVrLT5la19jbGllbnQtPm5hbWUsCisJCSAgIGVrLT5la19mc2lkdHlwZSwgZWstPmVrX2ZzaWRbMF0pOworCWlmIChlay0+ZWtfZnNpZHR5cGUgIT0gMSkKKwkJc2VxX3ByaW50ZihtLCAiJTA4eCIsIGVrLT5la19mc2lkWzFdKTsKKwlpZiAoZWstPmVrX2ZzaWR0eXBlID09IDIpCisJCXNlcV9wcmludGYobSwgIiUwOHgiLCBlay0+ZWtfZnNpZFsyXSk7CisJaWYgKHRlc3RfYml0KENBQ0hFX1ZBTElELCAmaC0+ZmxhZ3MpICYmIAorCSAgICAhdGVzdF9iaXQoQ0FDSEVfTkVHQVRJVkUsICZoLT5mbGFncykpIHsKKwkJc2VxX3ByaW50ZihtLCAiICIpOworCQlzZXFfcGF0aChtLCBlay0+ZWtfZXhwb3J0LT5leF9tbnQsIGVrLT5la19leHBvcnQtPmV4X2RlbnRyeSwgIlxcIFx0XG4iKTsKKwl9CisJc2VxX3ByaW50ZihtLCAiXG4iKTsKKwlyZXR1cm4gMDsKK30KKwkKK3N0cnVjdCBjYWNoZV9kZXRhaWwgc3ZjX2V4cGtleV9jYWNoZSA9IHsKKwkuaGFzaF9zaXplCT0gRVhQS0VZX0hBU0hNQVgsCisJLmhhc2hfdGFibGUJPSBleHBrZXlfdGFibGUsCisJLm5hbWUJCT0gIm5mc2QuZmgiLAorCS5jYWNoZV9wdXQJPSBleHBrZXlfcHV0LAorCS5jYWNoZV9yZXF1ZXN0CT0gZXhwa2V5X3JlcXVlc3QsCisJLmNhY2hlX3BhcnNlCT0gZXhwa2V5X3BhcnNlLAorCS5jYWNoZV9zaG93CT0gZXhwa2V5X3Nob3csCit9OworCitzdGF0aWMgaW5saW5lIGludCBzdmNfZXhwa2V5X21hdGNoIChzdHJ1Y3Qgc3ZjX2V4cGtleSAqYSwgc3RydWN0IHN2Y19leHBrZXkgKmIpCit7CisJaWYgKGEtPmVrX2ZzaWR0eXBlICE9IGItPmVrX2ZzaWR0eXBlIHx8CisJICAgIGEtPmVrX2NsaWVudCAhPSBiLT5la19jbGllbnQgfHwKKwkgICAgbWVtY21wKGEtPmVrX2ZzaWQsIGItPmVrX2ZzaWQsIGtleV9sZW4oYS0+ZWtfZnNpZHR5cGUpKSAhPSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN2Y19leHBrZXlfaW5pdChzdHJ1Y3Qgc3ZjX2V4cGtleSAqbmV3LCBzdHJ1Y3Qgc3ZjX2V4cGtleSAqaXRlbSkKK3sKKwljYWNoZV9nZXQoJml0ZW0tPmVrX2NsaWVudC0+aCk7CisJbmV3LT5la19jbGllbnQgPSBpdGVtLT5la19jbGllbnQ7CisJbmV3LT5la19mc2lkdHlwZSA9IGl0ZW0tPmVrX2ZzaWR0eXBlOworCW5ldy0+ZWtfZnNpZFswXSA9IGl0ZW0tPmVrX2ZzaWRbMF07CisJbmV3LT5la19mc2lkWzFdID0gaXRlbS0+ZWtfZnNpZFsxXTsKKwluZXctPmVrX2ZzaWRbMl0gPSBpdGVtLT5la19mc2lkWzJdOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3ZjX2V4cGtleV91cGRhdGUoc3RydWN0IHN2Y19leHBrZXkgKm5ldywgc3RydWN0IHN2Y19leHBrZXkgKml0ZW0pCit7CisJY2FjaGVfZ2V0KCZpdGVtLT5la19leHBvcnQtPmgpOworCW5ldy0+ZWtfZXhwb3J0ID0gaXRlbS0+ZWtfZXhwb3J0OworfQorCitzdGF0aWMgRGVmaW5lU2ltcGxlQ2FjaGVMb29rdXAoc3ZjX2V4cGtleSwwKSAvKiBubyBpbnBsYWNlIHVwZGF0ZXMgKi8KKworI2RlZmluZQlFWFBPUlRfSEFTSEJJVFMJCTgKKyNkZWZpbmUJRVhQT1JUX0hBU0hNQVgJCSgxPDwgRVhQT1JUX0hBU0hCSVRTKQorI2RlZmluZQlFWFBPUlRfSEFTSE1BU0sJCShFWFBPUlRfSEFTSE1BWCAtMSkKKworc3RhdGljIHN0cnVjdCBjYWNoZV9oZWFkICpleHBvcnRfdGFibGVbRVhQT1JUX0hBU0hNQVhdOworCitzdGF0aWMgaW5saW5lIGludCBzdmNfZXhwb3J0X2hhc2goc3RydWN0IHN2Y19leHBvcnQgKml0ZW0pCit7CisJaW50IHJ2OworCisJcnYgPSBoYXNoX3B0cihpdGVtLT5leF9jbGllbnQsIEVYUE9SVF9IQVNIQklUUyk7CisJcnYgXj0gaGFzaF9wdHIoaXRlbS0+ZXhfZGVudHJ5LCBFWFBPUlRfSEFTSEJJVFMpOworCXJ2IF49IGhhc2hfcHRyKGl0ZW0tPmV4X21udCwgRVhQT1JUX0hBU0hCSVRTKTsKKwlyZXR1cm4gcnY7Cit9CisKK3ZvaWQgc3ZjX2V4cG9ydF9wdXQoc3RydWN0IGNhY2hlX2hlYWQgKml0ZW0sIHN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkKQoreworCWlmIChjYWNoZV9wdXQoaXRlbSwgY2QpKSB7CisJCXN0cnVjdCBzdmNfZXhwb3J0ICpleHAgPSBjb250YWluZXJfb2YoaXRlbSwgc3RydWN0IHN2Y19leHBvcnQsIGgpOworCQlkcHV0KGV4cC0+ZXhfZGVudHJ5KTsKKwkJbW50cHV0KGV4cC0+ZXhfbW50KTsKKwkJYXV0aF9kb21haW5fcHV0KGV4cC0+ZXhfY2xpZW50KTsKKwkJa2ZyZWUoZXhwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN2Y19leHBvcnRfcmVxdWVzdChzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCwKKwkJCSAgICAgICBzdHJ1Y3QgY2FjaGVfaGVhZCAqaCwKKwkJCSAgICAgICBjaGFyICoqYnBwLCBpbnQgKmJsZW4pCit7CisJLyogIGNsaWVudCBwYXRoICovCisJc3RydWN0IHN2Y19leHBvcnQgKmV4cCA9IGNvbnRhaW5lcl9vZihoLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCwgaCk7CisJY2hhciAqcHRoOworCisJcXdvcmRfYWRkKGJwcCwgYmxlbiwgZXhwLT5leF9jbGllbnQtPm5hbWUpOworCXB0aCA9IGRfcGF0aChleHAtPmV4X2RlbnRyeSwgZXhwLT5leF9tbnQsICpicHAsICpibGVuKTsKKwlpZiAoSVNfRVJSKHB0aCkpIHsKKwkJLyogaXMgdGhpcyBjb3JyZWN0PyAqLworCQkoKmJwcClbMF0gPSAnXG4nOworCQlyZXR1cm47CisJfQorCXF3b3JkX2FkZChicHAsIGJsZW4sIHB0aCk7CisJKCpicHApWy0xXSA9ICdcbic7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqc3ZjX2V4cG9ydF9sb29rdXAoc3RydWN0IHN2Y19leHBvcnQgKiwgaW50KTsKKworc3RhdGljIGludCBjaGVja19leHBvcnQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZsYWdzKQoreworCisJLyogV2UgY3VycmVudGx5IGV4cG9ydCBvbmx5IGRpcnMgYW5kIHJlZ3VsYXIgZmlsZXMuCisJICogVGhpcyBpcyB3aGF0IHVtb3VudGQgZG9lcy4KKwkgKi8KKwlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYKKwkgICAgIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRU5PVERJUjsKKworCS8qIFRoZXJlIGFyZSB0d28gcmVxdWlyZW1lbnRzIG9uIGEgZmlsZXN5c3RlbSB0byBiZSBleHBvcnRhYmxlLgorCSAqIDE6ICBXZSBtdXN0IGJlIGFibGUgdG8gaWRlbnRpZnkgdGhlIGZpbGVzeXN0ZW0gZnJvbSBhIG51bWJlci4KKwkgKiAgICAgICBlaXRoZXIgYSBkZXZpY2UgbnVtYmVyIChzbyBGU19SRVFVSVJFU19ERVYgbmVlZGVkKQorCSAqICAgICAgIG9yIGFuIEZTSUQgbnVtYmVyIChzbyBORlNFWFBfRlNJRCBuZWVkZWQpLgorCSAqIDI6ICBXZSBtdXN0IGJlIGFibGUgdG8gZmluZCBhbiBpbm9kZSBmcm9tIGEgZmlsZWhhbmRsZS4KKwkgKiAgICAgICBUaGlzIG1lYW5zIHRoYXQgc19leHBvcnRfb3AgbXVzdCBiZSBzZXQuCisJICovCisJaWYgKCEoaW5vZGUtPmlfc2ItPnNfdHlwZS0+ZnNfZmxhZ3MgJiBGU19SRVFVSVJFU19ERVYpICYmCisJICAgICEoZmxhZ3MgJiBORlNFWFBfRlNJRCkpIHsKKwkJZHByaW50aygiZXhwX2V4cG9ydDogZXhwb3J0IG9mIG5vbi1kZXYgZnMgd2l0aG91dCBmc2lkIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIWlub2RlLT5pX3NiLT5zX2V4cG9ydF9vcCkgeworCQlkcHJpbnRrKCJleHBfZXhwb3J0OiBleHBvcnQgb2YgaW52YWxpZCBmcyB0eXBlLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIE9rLCB3ZSBjYW4gZXhwb3J0IGl0ICovOworCWlmICghaW5vZGUtPmlfc2ItPnNfZXhwb3J0X29wLT5maW5kX2V4cG9ydGVkX2RlbnRyeSkKKwkJaW5vZGUtPmlfc2ItPnNfZXhwb3J0X29wLT5maW5kX2V4cG9ydGVkX2RlbnRyeSA9CisJCQlmaW5kX2V4cG9ydGVkX2RlbnRyeTsKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IHN2Y19leHBvcnRfcGFyc2Uoc3RydWN0IGNhY2hlX2RldGFpbCAqY2QsIGNoYXIgKm1lc2csIGludCBtbGVuKQoreworCS8qIGNsaWVudCBwYXRoIGV4cGlyeSBbZmxhZ3MgYW5vbnVpZCBhbm9uZ2lkIGZzaWRdICovCisJY2hhciAqYnVmOworCWludCBsZW47CisJaW50IGVycjsKKwlzdHJ1Y3QgYXV0aF9kb21haW4gKmRvbSA9IE5VTEw7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlzdHJ1Y3Qgc3ZjX2V4cG9ydCBleHAsICpleHBwOworCWludCBhbl9pbnQ7CisKKwluZC5kZW50cnkgPSBOVUxMOworCisJaWYgKG1lc2dbbWxlbi0xXSAhPSAnXG4nKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltZXNnW21sZW4tMV0gPSAwOworCisJYnVmID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFidWYpIGdvdG8gb3V0OworCisJLyogY2xpZW50ICovCisJbGVuID0gcXdvcmRfZ2V0KCZtZXNnLCBidWYsIFBBR0VfU0laRSk7CisJZXJyID0gLUVJTlZBTDsKKwlpZiAobGVuIDw9IDApIGdvdG8gb3V0OworCisJZXJyID0gLUVOT0VOVDsKKwlkb20gPSBhdXRoX2RvbWFpbl9maW5kKGJ1Zik7CisJaWYgKCFkb20pCisJCWdvdG8gb3V0OworCisJLyogcGF0aCAqLworCWVyciA9IC1FSU5WQUw7CisJaWYgKChsZW49cXdvcmRfZ2V0KCZtZXNnLCBidWYsIFBBR0VfU0laRSkpIDw9IDApCisJCWdvdG8gb3V0OworCWVyciA9IHBhdGhfbG9va3VwKGJ1ZiwgMCwgJm5kKTsKKwlpZiAoZXJyKSBnb3RvIG91dDsKKworCWV4cC5oLmZsYWdzID0gMDsKKwlleHAuZXhfY2xpZW50ID0gZG9tOworCWV4cC5leF9tbnQgPSBuZC5tbnQ7CisJZXhwLmV4X2RlbnRyeSA9IG5kLmRlbnRyeTsKKworCS8qIGV4cGlyeSAqLworCWVyciA9IC1FSU5WQUw7CisJZXhwLmguZXhwaXJ5X3RpbWUgPSBnZXRfZXhwaXJ5KCZtZXNnKTsKKwlpZiAoZXhwLmguZXhwaXJ5X3RpbWUgPT0gMCkKKwkJZ290byBvdXQ7CisKKwkvKiBmbGFncyAqLworCWVyciA9IGdldF9pbnQoJm1lc2csICZhbl9pbnQpOworCWlmIChlcnIgPT0gLUVOT0VOVCkKKwkJc2V0X2JpdChDQUNIRV9ORUdBVElWRSwgJmV4cC5oLmZsYWdzKTsKKwllbHNlIHsKKwkJaWYgKGVyciB8fCBhbl9pbnQgPCAwKSBnb3RvIG91dDsJCisJCWV4cC5leF9mbGFncz0gYW5faW50OworCQorCQkvKiBhbm9uIHVpZCAqLworCQllcnIgPSBnZXRfaW50KCZtZXNnLCAmYW5faW50KTsKKwkJaWYgKGVycikgZ290byBvdXQ7CisJCWV4cC5leF9hbm9uX3VpZD0gYW5faW50OworCisJCS8qIGFub24gZ2lkICovCisJCWVyciA9IGdldF9pbnQoJm1lc2csICZhbl9pbnQpOworCQlpZiAoZXJyKSBnb3RvIG91dDsKKwkJZXhwLmV4X2Fub25fZ2lkPSBhbl9pbnQ7CisKKwkJLyogZnNpZCAqLworCQllcnIgPSBnZXRfaW50KCZtZXNnLCAmYW5faW50KTsKKwkJaWYgKGVycikgZ290byBvdXQ7CisJCWV4cC5leF9mc2lkID0gYW5faW50OworCisJCWVyciA9IGNoZWNrX2V4cG9ydChuZC5kZW50cnktPmRfaW5vZGUsIGV4cC5leF9mbGFncyk7CisJCWlmIChlcnIpIGdvdG8gb3V0OworCX0KKworCWV4cHAgPSBzdmNfZXhwb3J0X2xvb2t1cCgmZXhwLCAxKTsKKwlpZiAoZXhwcCkKKwkJZXhwX3B1dChleHBwKTsKKwllcnIgPSAwOworCWNhY2hlX2ZsdXNoKCk7Cisgb3V0OgorCWlmIChuZC5kZW50cnkpCisJCXBhdGhfcmVsZWFzZSgmbmQpOworCWlmIChkb20pCisJCWF1dGhfZG9tYWluX3B1dChkb20pOworCWlmIChidWYpCisJCWtmcmVlKGJ1Zik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZXhwX2ZsYWdzKHN0cnVjdCBzZXFfZmlsZSAqbSwgaW50IGZsYWcsIGludCBmc2lkLCB1aWRfdCBhbm9udSwgdWlkX3QgYW5vbmcpOworCitzdGF0aWMgaW50IHN2Y19leHBvcnRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sCisJCQkgICBzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCwKKwkJCSAgIHN0cnVjdCBjYWNoZV9oZWFkICpoKQoreworCXN0cnVjdCBzdmNfZXhwb3J0ICpleHAgOworCisJaWYgKGggPT1OVUxMKSB7CisJCXNlcV9wdXRzKG0sICIjcGF0aCBkb21haW4oZmxhZ3MpXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWV4cCA9IGNvbnRhaW5lcl9vZihoLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCwgaCk7CisJc2VxX3BhdGgobSwgZXhwLT5leF9tbnQsIGV4cC0+ZXhfZGVudHJ5LCAiIFx0XG5cXCIpOworCXNlcV9wdXRjKG0sICdcdCcpOworCXNlcV9lc2NhcGUobSwgZXhwLT5leF9jbGllbnQtPm5hbWUsICIgXHRcblxcIik7CisJc2VxX3B1dGMobSwgJygnKTsKKwlpZiAodGVzdF9iaXQoQ0FDSEVfVkFMSUQsICZoLT5mbGFncykgJiYgCisJICAgICF0ZXN0X2JpdChDQUNIRV9ORUdBVElWRSwgJmgtPmZsYWdzKSkKKwkJZXhwX2ZsYWdzKG0sIGV4cC0+ZXhfZmxhZ3MsIGV4cC0+ZXhfZnNpZCwgCisJCQkgIGV4cC0+ZXhfYW5vbl91aWQsIGV4cC0+ZXhfYW5vbl9naWQpOworCXNlcV9wdXRzKG0sICIpXG4iKTsKKwlyZXR1cm4gMDsKK30KK3N0cnVjdCBjYWNoZV9kZXRhaWwgc3ZjX2V4cG9ydF9jYWNoZSA9IHsKKwkuaGFzaF9zaXplCT0gRVhQT1JUX0hBU0hNQVgsCisJLmhhc2hfdGFibGUJPSBleHBvcnRfdGFibGUsCisJLm5hbWUJCT0gIm5mc2QuZXhwb3J0IiwKKwkuY2FjaGVfcHV0CT0gc3ZjX2V4cG9ydF9wdXQsCisJLmNhY2hlX3JlcXVlc3QJPSBzdmNfZXhwb3J0X3JlcXVlc3QsCisJLmNhY2hlX3BhcnNlCT0gc3ZjX2V4cG9ydF9wYXJzZSwKKwkuY2FjaGVfc2hvdwk9IHN2Y19leHBvcnRfc2hvdywKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHN2Y19leHBvcnRfbWF0Y2goc3RydWN0IHN2Y19leHBvcnQgKmEsIHN0cnVjdCBzdmNfZXhwb3J0ICpiKQoreworCXJldHVybiBhLT5leF9jbGllbnQgPT0gYi0+ZXhfY2xpZW50ICYmCisJCWEtPmV4X2RlbnRyeSA9PSBiLT5leF9kZW50cnkgJiYKKwkJYS0+ZXhfbW50ID09IGItPmV4X21udDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzdmNfZXhwb3J0X2luaXQoc3RydWN0IHN2Y19leHBvcnQgKm5ldywgc3RydWN0IHN2Y19leHBvcnQgKml0ZW0pCit7CisJY2FjaGVfZ2V0KCZpdGVtLT5leF9jbGllbnQtPmgpOworCW5ldy0+ZXhfY2xpZW50ID0gaXRlbS0+ZXhfY2xpZW50OworCW5ldy0+ZXhfZGVudHJ5ID0gZGdldChpdGVtLT5leF9kZW50cnkpOworCW5ldy0+ZXhfbW50ID0gbW50Z2V0KGl0ZW0tPmV4X21udCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdmNfZXhwb3J0X3VwZGF0ZShzdHJ1Y3Qgc3ZjX2V4cG9ydCAqbmV3LCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqaXRlbSkKK3sKKwluZXctPmV4X2ZsYWdzID0gaXRlbS0+ZXhfZmxhZ3M7CisJbmV3LT5leF9hbm9uX3VpZCA9IGl0ZW0tPmV4X2Fub25fdWlkOworCW5ldy0+ZXhfYW5vbl9naWQgPSBpdGVtLT5leF9hbm9uX2dpZDsKKwluZXctPmV4X2ZzaWQgPSBpdGVtLT5leF9mc2lkOworfQorCitzdGF0aWMgRGVmaW5lU2ltcGxlQ2FjaGVMb29rdXAoc3ZjX2V4cG9ydCwxKSAvKiBhbGxvdyBpbnBsYWNlIHVwZGF0ZXMgKi8KKworCitzdHJ1Y3Qgc3ZjX2V4cGtleSAqCitleHBfZmluZF9rZXkoc3ZjX2NsaWVudCAqY2xwLCBpbnQgZnNpZF90eXBlLCB1MzIgKmZzaWR2LCBzdHJ1Y3QgY2FjaGVfcmVxICpyZXFwKQoreworCXN0cnVjdCBzdmNfZXhwa2V5IGtleSwgKmVrOworCWludCBlcnI7CisJCisJaWYgKCFjbHApCisJCXJldHVybiBOVUxMOworCisJa2V5LmVrX2NsaWVudCA9IGNscDsKKwlrZXkuZWtfZnNpZHR5cGUgPSBmc2lkX3R5cGU7CisJbWVtY3B5KGtleS5la19mc2lkLCBmc2lkdiwga2V5X2xlbihmc2lkX3R5cGUpKTsKKworCWVrID0gc3ZjX2V4cGtleV9sb29rdXAoJmtleSwgMCk7CisJaWYgKGVrICE9IE5VTEwpCisJCWlmICgoZXJyID0gY2FjaGVfY2hlY2soJnN2Y19leHBrZXlfY2FjaGUsICZlay0+aCwgcmVxcCkpKQorCQkJZWsgPSBFUlJfUFRSKGVycik7CisJcmV0dXJuIGVrOworfQorCitzdGF0aWMgaW50IGV4cF9zZXRfa2V5KHN2Y19jbGllbnQgKmNscCwgaW50IGZzaWRfdHlwZSwgdTMyICpmc2lkdiwKKwkJICAgICAgIHN0cnVjdCBzdmNfZXhwb3J0ICpleHApCit7CisJc3RydWN0IHN2Y19leHBrZXkga2V5LCAqZWs7CisKKwlrZXkuZWtfY2xpZW50ID0gY2xwOworCWtleS5la19mc2lkdHlwZSA9IGZzaWRfdHlwZTsKKwltZW1jcHkoa2V5LmVrX2ZzaWQsIGZzaWR2LCBrZXlfbGVuKGZzaWRfdHlwZSkpOworCWtleS5la19leHBvcnQgPSBleHA7CisJa2V5LmguZXhwaXJ5X3RpbWUgPSBORVZFUjsKKwlrZXkuaC5mbGFncyA9IDA7CisKKwllayA9IHN2Y19leHBrZXlfbG9va3VwKCZrZXksIDEpOworCWlmIChlaykgeworCQlleHBrZXlfcHV0KCZlay0+aCwgJnN2Y19leHBrZXlfY2FjaGUpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qCisgKiBGaW5kIHRoZSBjbGllbnQncyBleHBvcnQgZW50cnkgbWF0Y2hpbmcgeGRldi94aW5vLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzdmNfZXhwa2V5ICoKK2V4cF9nZXRfa2V5KHN2Y19jbGllbnQgKmNscCwgZGV2X3QgZGV2LCBpbm9fdCBpbm8pCit7CisJdTMyIGZzaWR2WzNdOworCQorCWlmIChvbGRfdmFsaWRfZGV2KGRldikpIHsKKwkJbWtfZnNpZF92MChmc2lkdiwgZGV2LCBpbm8pOworCQlyZXR1cm4gZXhwX2ZpbmRfa2V5KGNscCwgMCwgZnNpZHYsIE5VTEwpOworCX0KKwlta19mc2lkX3YzKGZzaWR2LCBkZXYsIGlubyk7CisJcmV0dXJuIGV4cF9maW5kX2tleShjbHAsIDMsIGZzaWR2LCBOVUxMKTsKK30KKworLyoKKyAqIEZpbmQgdGhlIGNsaWVudCdzIGV4cG9ydCBlbnRyeSBtYXRjaGluZyBmc2lkCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN2Y19leHBrZXkgKgorZXhwX2dldF9mc2lkX2tleShzdmNfY2xpZW50ICpjbHAsIGludCBmc2lkKQoreworCXUzMiBmc2lkdlsyXTsKKworCW1rX2ZzaWRfdjEoZnNpZHYsIGZzaWQpOworCisJcmV0dXJuIGV4cF9maW5kX2tleShjbHAsIDEsIGZzaWR2LCBOVUxMKTsKK30KKworc3ZjX2V4cG9ydCAqCitleHBfZ2V0X2J5X25hbWUoc3ZjX2NsaWVudCAqY2xwLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQlzdHJ1Y3QgY2FjaGVfcmVxICpyZXFwKQoreworCXN0cnVjdCBzdmNfZXhwb3J0ICpleHAsIGtleTsKKwkKKwlpZiAoIWNscCkKKwkJcmV0dXJuIE5VTEw7CisKKwlrZXkuZXhfY2xpZW50ID0gY2xwOworCWtleS5leF9tbnQgPSBtbnQ7CisJa2V5LmV4X2RlbnRyeSA9IGRlbnRyeTsKKworCWV4cCA9IHN2Y19leHBvcnRfbG9va3VwKCZrZXksIDApOworCWlmIChleHAgIT0gTlVMTCkgCisJCXN3aXRjaCAoY2FjaGVfY2hlY2soJnN2Y19leHBvcnRfY2FjaGUsICZleHAtPmgsIHJlcXApKSB7CisJCWNhc2UgMDogYnJlYWs7CisJCWNhc2UgLUVBR0FJTjoKKwkJCWV4cCA9IEVSUl9QVFIoLUVBR0FJTik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWV4cCA9IE5VTEw7CisJCX0KKworCXJldHVybiBleHA7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBleHBvcnQgZW50cnkgZm9yIGEgZ2l2ZW4gZGVudHJ5LgorICovCitzdHJ1Y3Qgc3ZjX2V4cG9ydCAqCitleHBfcGFyZW50KHN2Y19jbGllbnQgKmNscCwgc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkgICBzdHJ1Y3QgY2FjaGVfcmVxICpyZXFwKQoreworCXN2Y19leHBvcnQgKmV4cDsKKworCWRnZXQoZGVudHJ5KTsKKwlleHAgPSBleHBfZ2V0X2J5X25hbWUoY2xwLCBtbnQsIGRlbnRyeSwgcmVxcCk7CisKKwl3aGlsZSAoZXhwID09IE5VTEwgJiYgIUlTX1JPT1QoZGVudHJ5KSkgeworCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CisKKwkJcGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsKKwkJZHB1dChkZW50cnkpOworCQlkZW50cnkgPSBwYXJlbnQ7CisJCWV4cCA9IGV4cF9nZXRfYnlfbmFtZShjbHAsIG1udCwgZGVudHJ5LCByZXFwKTsKKwl9CisJZHB1dChkZW50cnkpOworCXJldHVybiBleHA7Cit9CisKKy8qCisgKiBIYXNodGFibGUgbG9ja2luZy4gV3JpdGUgbG9ja3MgYXJlIHBsYWNlZCBvbmx5IGJ5IHVzZXIgcHJvY2Vzc2VzCisgKiB3YW50aW5nIHRvIG1vZGlmeSBleHBvcnQgaW5mb3JtYXRpb24uCisgKiBXcml0ZSBsb2NraW5nIG9ubHkgZG9uZSBpbiB0aGlzIGZpbGUuICBSZWFkIGxvY2tpbmcKKyAqIG5lZWRlZCBleHRlcm5hbGx5LgorICovCisKK3N0YXRpYyBERUNMQVJFX1JXU0VNKGhhc2hfc2VtKTsKKwordm9pZAorZXhwX3JlYWRsb2NrKHZvaWQpCit7CisJZG93bl9yZWFkKCZoYXNoX3NlbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZXhwX3dyaXRlbG9jayh2b2lkKQoreworCWRvd25fd3JpdGUoJmhhc2hfc2VtKTsKK30KKwordm9pZAorZXhwX3JlYWR1bmxvY2sodm9pZCkKK3sKKwl1cF9yZWFkKCZoYXNoX3NlbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZXhwX3dyaXRldW5sb2NrKHZvaWQpCit7CisJdXBfd3JpdGUoJmhhc2hfc2VtKTsKK30KKworc3RhdGljIHZvaWQgZXhwX2ZzaWRfdW5oYXNoKHN0cnVjdCBzdmNfZXhwb3J0ICpleHApCit7CisJc3RydWN0IHN2Y19leHBrZXkgKmVrOworCisJaWYgKChleHAtPmV4X2ZsYWdzICYgTkZTRVhQX0ZTSUQpID09IDApCisJCXJldHVybjsKKworCWVrID0gZXhwX2dldF9mc2lkX2tleShleHAtPmV4X2NsaWVudCwgZXhwLT5leF9mc2lkKTsKKwlpZiAoZWsgJiYgIUlTX0VSUihlaykpIHsKKwkJZWstPmguZXhwaXJ5X3RpbWUgPSBnZXRfc2Vjb25kcygpLTE7CisJCWV4cGtleV9wdXQoJmVrLT5oLCAmc3ZjX2V4cGtleV9jYWNoZSk7CisJfQorCXN2Y19leHBrZXlfY2FjaGUubmV4dGNoZWNrID0gZ2V0X3NlY29uZHMoKTsKK30KKworc3RhdGljIGludCBleHBfZnNpZF9oYXNoKHN2Y19jbGllbnQgKmNscCwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCkKK3sKKwl1MzIgZnNpZFsyXTsKKyAKKwlpZiAoKGV4cC0+ZXhfZmxhZ3MgJiBORlNFWFBfRlNJRCkgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlta19mc2lkX3YxKGZzaWQsIGV4cC0+ZXhfZnNpZCk7CisJcmV0dXJuIGV4cF9zZXRfa2V5KGNscCwgMSwgZnNpZCwgZXhwKTsKK30KKworc3RhdGljIGludCBleHBfaGFzaChzdHJ1Y3QgYXV0aF9kb21haW4gKmNscCwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCkKK3sKKwl1MzIgZnNpZFsyXTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZXhwLT5leF9kZW50cnktPmRfaW5vZGU7CisJZGV2X3QgZGV2ID0gaW5vZGUtPmlfc2ItPnNfZGV2OworCisJaWYgKG9sZF92YWxpZF9kZXYoZGV2KSkgeworCQlta19mc2lkX3YwKGZzaWQsIGRldiwgaW5vZGUtPmlfaW5vKTsKKwkJcmV0dXJuIGV4cF9zZXRfa2V5KGNscCwgMCwgZnNpZCwgZXhwKTsKKwl9CisJbWtfZnNpZF92Myhmc2lkLCBkZXYsIGlub2RlLT5pX2lubyk7CisJcmV0dXJuIGV4cF9zZXRfa2V5KGNscCwgMywgZnNpZCwgZXhwKTsKK30KKworc3RhdGljIHZvaWQgZXhwX3VuaGFzaChzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwKQoreworCXN0cnVjdCBzdmNfZXhwa2V5ICplazsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZXhwLT5leF9kZW50cnktPmRfaW5vZGU7CisKKwllayA9IGV4cF9nZXRfa2V5KGV4cC0+ZXhfY2xpZW50LCBpbm9kZS0+aV9zYi0+c19kZXYsIGlub2RlLT5pX2lubyk7CisJaWYgKGVrICYmICFJU19FUlIoZWspKSB7CisJCWVrLT5oLmV4cGlyeV90aW1lID0gZ2V0X3NlY29uZHMoKS0xOworCQlleHBrZXlfcHV0KCZlay0+aCwgJnN2Y19leHBrZXlfY2FjaGUpOworCX0KKwlzdmNfZXhwa2V5X2NhY2hlLm5leHRjaGVjayA9IGdldF9zZWNvbmRzKCk7Cit9CisJCisvKgorICogRXhwb3J0IGEgZmlsZSBzeXN0ZW0uCisgKi8KK2ludAorZXhwX2V4cG9ydChzdHJ1Y3QgbmZzY3RsX2V4cG9ydCAqbnhwKQoreworCXN2Y19jbGllbnQJKmNscDsKKwlzdHJ1Y3Qgc3ZjX2V4cG9ydAkqZXhwID0gTlVMTDsKKwlzdHJ1Y3Qgc3ZjX2V4cG9ydAluZXc7CisJc3RydWN0IHN2Y19leHBrZXkJKmZzaWRfa2V5ID0gTlVMTDsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludAkJZXJyOworCisJLyogQ29uc2lzdGVuY3kgY2hlY2sgKi8KKwllcnIgPSAtRUlOVkFMOworCWlmICghZXhwX3ZlcmlmeV9zdHJpbmcobnhwLT5leF9wYXRoLCBORlNfTUFYUEFUSExFTikgfHwKKwkgICAgIWV4cF92ZXJpZnlfc3RyaW5nKG54cC0+ZXhfY2xpZW50LCBORlNDTE5UX0lETUFYKSkKKwkJZ290byBvdXQ7CisKKwlkcHJpbnRrKCJleHBfZXhwb3J0IGNhbGxlZCBmb3IgJXM6JXMgKCV4LyVsZCBmbCAleCkuXG4iLAorCQkJbnhwLT5leF9jbGllbnQsIG54cC0+ZXhfcGF0aCwKKwkJCSh1bnNpZ25lZClueHAtPmV4X2RldiwgKGxvbmcpbnhwLT5leF9pbm8sCisJCQlueHAtPmV4X2ZsYWdzKTsKKworCS8qIFRyeSB0byBsb2NrIHRoZSBleHBvcnQgdGFibGUgZm9yIHVwZGF0ZSAqLworCWV4cF93cml0ZWxvY2soKTsKKworCS8qIExvb2sgdXAgY2xpZW50IGluZm8gKi8KKwlpZiAoIShjbHAgPSBhdXRoX2RvbWFpbl9maW5kKG54cC0+ZXhfY2xpZW50KSkpCisJCWdvdG8gb3V0X3VubG9jazsKKworCisJLyogTG9vayB1cCB0aGUgZGVudHJ5ICovCisJZXJyID0gcGF0aF9sb29rdXAobnhwLT5leF9wYXRoLCAwLCAmbmQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VubG9jazsKKwllcnIgPSAtRUlOVkFMOworCisJZXhwID0gZXhwX2dldF9ieV9uYW1lKGNscCwgbmQubW50LCBuZC5kZW50cnksIE5VTEwpOworCisJLyogbXVzdCBtYWtlIHN1cmUgdGhlcmUgd29uJ3QgYmUgYW4gZXhfZnNpZCBjbGFzaCAqLworCWlmICgobnhwLT5leF9mbGFncyAmIE5GU0VYUF9GU0lEKSAmJgorCSAgICAoZnNpZF9rZXkgPSBleHBfZ2V0X2ZzaWRfa2V5KGNscCwgbnhwLT5leF9kZXYpKSAmJgorCSAgICAhSVNfRVJSKGZzaWRfa2V5KSAmJgorCSAgICBmc2lkX2tleS0+ZWtfZXhwb3J0ICYmCisJICAgIGZzaWRfa2V5LT5la19leHBvcnQgIT0gZXhwKQorCQlnb3RvIGZpbmlzaDsKKworCWlmIChleHApIHsKKwkJLyoganVzdCBhIGZsYWdzL2lkL2ZzaWQgdXBkYXRlICovCisKKwkJZXhwX2ZzaWRfdW5oYXNoKGV4cCk7CisJCWV4cC0+ZXhfZmxhZ3MgICAgPSBueHAtPmV4X2ZsYWdzOworCQlleHAtPmV4X2Fub25fdWlkID0gbnhwLT5leF9hbm9uX3VpZDsKKwkJZXhwLT5leF9hbm9uX2dpZCA9IG54cC0+ZXhfYW5vbl9naWQ7CisJCWV4cC0+ZXhfZnNpZCAgICAgPSBueHAtPmV4X2RldjsKKworCQllcnIgPSBleHBfZnNpZF9oYXNoKGNscCwgZXhwKTsKKwkJZ290byBmaW5pc2g7CisJfQorCisJZXJyID0gY2hlY2tfZXhwb3J0KG5kLmRlbnRyeS0+ZF9pbm9kZSwgbnhwLT5leF9mbGFncyk7CisJaWYgKGVycikgZ290byBmaW5pc2g7CisKKwllcnIgPSAtRU5PTUVNOworCisJZHByaW50aygibmZzZDogY3JlYXRpbmcgZXhwb3J0IGVudHJ5ICVwIGZvciBjbGllbnQgJXBcbiIsIGV4cCwgY2xwKTsKKworCW5ldy5oLmV4cGlyeV90aW1lID0gTkVWRVI7CisJbmV3LmguZmxhZ3MgPSAwOworCW5ldy5leF9jbGllbnQgPSBjbHA7CisJbmV3LmV4X21udCA9IG5kLm1udDsKKwluZXcuZXhfZGVudHJ5ID0gbmQuZGVudHJ5OworCW5ldy5leF9mbGFncyA9IG54cC0+ZXhfZmxhZ3M7CisJbmV3LmV4X2Fub25fdWlkID0gbnhwLT5leF9hbm9uX3VpZDsKKwluZXcuZXhfYW5vbl9naWQgPSBueHAtPmV4X2Fub25fZ2lkOworCW5ldy5leF9mc2lkID0gbnhwLT5leF9kZXY7CisKKwlleHAgPSBzdmNfZXhwb3J0X2xvb2t1cCgmbmV3LCAxKTsKKworCWlmIChleHAgPT0gTlVMTCkKKwkJZ290byBmaW5pc2g7CisKKwllcnIgPSAwOworCisJaWYgKGV4cF9oYXNoKGNscCwgZXhwKSB8fAorCSAgICBleHBfZnNpZF9oYXNoKGNscCwgZXhwKSkgeworCQkvKiBmYWlsZWQgdG8gY3JlYXRlIGF0IGxlYXN0IG9uZSBpbmRleCAqLworCQlleHBfZG9fdW5leHBvcnQoZXhwKTsKKwkJY2FjaGVfZmx1c2goKTsKKwkJZXJyID0gLUVOT01FTTsKKwl9CisKK2ZpbmlzaDoKKwlpZiAoZXhwKQorCQlleHBfcHV0KGV4cCk7CisJaWYgKGZzaWRfa2V5ICYmICFJU19FUlIoZnNpZF9rZXkpKQorCQlleHBrZXlfcHV0KCZmc2lkX2tleS0+aCwgJnN2Y19leHBrZXlfY2FjaGUpOworCWlmIChjbHApCisJCWF1dGhfZG9tYWluX3B1dChjbHApOworCXBhdGhfcmVsZWFzZSgmbmQpOworb3V0X3VubG9jazoKKwlleHBfd3JpdGV1bmxvY2soKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogVW5leHBvcnQgYSBmaWxlIHN5c3RlbS4gVGhlIGV4cG9ydCBlbnRyeSBoYXMgYWxyZWFkeQorICogYmVlbiByZW1vdmVkIGZyb20gdGhlIGNsaWVudCdzIGxpc3Qgb2YgZXhwb3J0ZWQgZnMncy4KKyAqLworc3RhdGljIHZvaWQKK2V4cF9kb191bmV4cG9ydChzdmNfZXhwb3J0ICp1bmV4cCkKK3sKKwl1bmV4cC0+aC5leHBpcnlfdGltZSA9IGdldF9zZWNvbmRzKCktMTsKKwlzdmNfZXhwb3J0X2NhY2hlLm5leHRjaGVjayA9IGdldF9zZWNvbmRzKCk7CisJZXhwX3VuaGFzaCh1bmV4cCk7CisJZXhwX2ZzaWRfdW5oYXNoKHVuZXhwKTsKK30KKworCisvKgorICogdW5leHBvcnQgc3lzY2FsbC4KKyAqLworaW50CitleHBfdW5leHBvcnQoc3RydWN0IG5mc2N0bF9leHBvcnQgKm54cCkKK3sKKwlzdHJ1Y3QgYXV0aF9kb21haW4gKmRvbTsKKwlzdmNfZXhwb3J0ICpleHA7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQJCWVycjsKKworCS8qIENvbnNpc3RlbmN5IGNoZWNrICovCisJaWYgKCFleHBfdmVyaWZ5X3N0cmluZyhueHAtPmV4X3BhdGgsIE5GU19NQVhQQVRITEVOKSB8fAorCSAgICAhZXhwX3ZlcmlmeV9zdHJpbmcobnhwLT5leF9jbGllbnQsIE5GU0NMTlRfSURNQVgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWV4cF93cml0ZWxvY2soKTsKKworCWVyciA9IC1FSU5WQUw7CisJZG9tID0gYXV0aF9kb21haW5fZmluZChueHAtPmV4X2NsaWVudCk7CisJaWYgKCFkb20pIHsKKwkJZHByaW50aygibmZzZDogdW5leHBvcnQgY291bGRuJ3QgZmluZCAlc1xuIiwgbnhwLT5leF9jbGllbnQpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJZXJyID0gcGF0aF9sb29rdXAobnhwLT5leF9wYXRoLCAwLCAmbmQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2RvbWFpbjsKKworCWVyciA9IC1FSU5WQUw7CisJZXhwID0gZXhwX2dldF9ieV9uYW1lKGRvbSwgbmQubW50LCBuZC5kZW50cnksIE5VTEwpOworCXBhdGhfcmVsZWFzZSgmbmQpOworCWlmICghZXhwKQorCQlnb3RvIG91dF9kb21haW47CisKKwlleHBfZG9fdW5leHBvcnQoZXhwKTsKKwlleHBfcHV0KGV4cCk7CisJZXJyID0gMDsKKworb3V0X2RvbWFpbjoKKwlhdXRoX2RvbWFpbl9wdXQoZG9tKTsKKwljYWNoZV9mbHVzaCgpOworb3V0X3VubG9jazoKKwlleHBfd3JpdGV1bmxvY2soKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogT2J0YWluIHRoZSByb290IGZoIG9uIGJlaGFsZiBvZiBhIGNsaWVudC4KKyAqIFRoaXMgY291bGQgYmUgZG9uZSBpbiB1c2VyIHNwYWNlLCBidXQgSSBmZWVsIHRoYXQgaXQgYWRkcyBzb21lIHNhZmV0eQorICogc2luY2UgaXRzIGhhcmRlciB0byBmb29sIGEga2VybmVsIG1vZHVsZSB0aGFuIGEgdXNlciBzcGFjZSBwcm9ncmFtLgorICovCitpbnQKK2V4cF9yb290Zmgoc3ZjX2NsaWVudCAqY2xwLCBjaGFyICpwYXRoLCBzdHJ1Y3Qga25mc2RfZmggKmYsIGludCBtYXhzaXplKQoreworCXN0cnVjdCBzdmNfZXhwb3J0CSpleHA7CisJc3RydWN0IG5hbWVpZGF0YQluZDsKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZTsKKwlzdHJ1Y3Qgc3ZjX2ZoCQlmaDsKKwlpbnQJCQllcnI7CisKKwllcnIgPSAtRVBFUk07CisJLyogTkI6IHdlIHByb2JhYmx5IG91Z2h0IHRvIGNoZWNrIHRoYXQgaXQncyBOVUwtdGVybWluYXRlZCAqLworCWlmIChwYXRoX2xvb2t1cChwYXRoLCAwLCAmbmQpKSB7CisJCXByaW50aygibmZzZDogZXhwX3Jvb3RmaCBwYXRoIG5vdCBmb3VuZCAlcyIsIHBhdGgpOworCQlyZXR1cm4gZXJyOworCX0KKwlpbm9kZSA9IG5kLmRlbnRyeS0+ZF9pbm9kZTsKKworCWRwcmludGsoIm5mc2Q6IGV4cF9yb290ZmgoJXMgWyVwXSAlczolcy8lbGQpXG4iLAorCQkgcGF0aCwgbmQuZGVudHJ5LCBjbHAtPm5hbWUsCisJCSBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsKKwlleHAgPSBleHBfcGFyZW50KGNscCwgbmQubW50LCBuZC5kZW50cnksIE5VTEwpOworCWlmICghZXhwKSB7CisJCWRwcmludGsoIm5mc2Q6IGV4cF9yb290ZmggZXhwb3J0IG5vdCBmb3VuZC5cbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIGZoIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgZmhfY29tcG9zZQorCSAqLworCWZoX2luaXQoJmZoLCBtYXhzaXplKTsKKwlpZiAoZmhfY29tcG9zZSgmZmgsIGV4cCwgbmQuZGVudHJ5LCBOVUxMKSkKKwkJZXJyID0gLUVJTlZBTDsKKwllbHNlCisJCWVyciA9IDA7CisJbWVtY3B5KGYsICZmaC5maF9oYW5kbGUsIHNpemVvZihzdHJ1Y3Qga25mc2RfZmgpKTsKKwlmaF9wdXQoJmZoKTsKKwlleHBfcHV0KGV4cCk7CitvdXQ6CisJcGF0aF9yZWxlYXNlKCZuZCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIHdlIG5lZWQgdGhlIGZpbGVoYW5kbGUgZm9yIHRoZSByb290IG9mIHRoZSBwc2V1ZG9mcywKKyAqIGZvciBhIGdpdmVuIE5GU3Y0IGNsaWVudC4gICBUaGUgcm9vdCBpcyBkZWZpbmVkIHRvIGJlIHRoZQorICogZXhwb3J0IHBvaW50IHdpdGggZnNpZD09MAorICovCitpbnQKK2V4cF9wc2V1ZG9yb290KHN0cnVjdCBhdXRoX2RvbWFpbiAqY2xwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsCisJICAgICAgIHN0cnVjdCBjYWNoZV9yZXEgKmNyZXEpCit7CisJc3RydWN0IHN2Y19leHBrZXkgKmZzaWRfa2V5OworCWludCBydjsKKwl1MzIgZnNpZHZbMl07CisKKwlta19mc2lkX3YxKGZzaWR2LCAwKTsKKworCWZzaWRfa2V5ID0gZXhwX2ZpbmRfa2V5KGNscCwgMSwgZnNpZHYsIGNyZXEpOworCWlmIChJU19FUlIoZnNpZF9rZXkpICYmIFBUUl9FUlIoZnNpZF9rZXkpID09IC1FQUdBSU4pCisJCXJldHVybiBuZnNlcnJfZHJvcGl0OworCWlmICghZnNpZF9rZXkgfHwgSVNfRVJSKGZzaWRfa2V5KSkKKwkJcmV0dXJuIG5mc2Vycl9wZXJtOworCisJcnYgPSBmaF9jb21wb3NlKGZocCwgZnNpZF9rZXktPmVrX2V4cG9ydCwgCisJCQkgIGZzaWRfa2V5LT5la19leHBvcnQtPmV4X2RlbnRyeSwgTlVMTCk7CisJZXhwa2V5X3B1dCgmZnNpZF9rZXktPmgsICZzdmNfZXhwa2V5X2NhY2hlKTsKKwlyZXR1cm4gcnY7Cit9CisKKy8qIEl0ZXJhdG9yICovCisKK3N0YXRpYyB2b2lkICplX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCit7CisJbG9mZl90IG4gPSAqcG9zOworCXVuc2lnbmVkIGhhc2gsIGV4cG9ydDsKKwlzdHJ1Y3QgY2FjaGVfaGVhZCAqY2g7CisJCisJZXhwX3JlYWRsb2NrKCk7CisJcmVhZF9sb2NrKCZzdmNfZXhwb3J0X2NhY2hlLmhhc2hfbG9jayk7CisJaWYgKCFuLS0pCisJCXJldHVybiAodm9pZCAqKTE7CisJaGFzaCA9IG4gPj4gMzI7CisJZXhwb3J0ID0gbiAmICgoMUxMPDwzMikgLSAxKTsKKworCQorCWZvciAoY2g9ZXhwb3J0X3RhYmxlW2hhc2hdOyBjaDsgY2g9Y2gtPm5leHQpCisJCWlmICghZXhwb3J0LS0pCisJCQlyZXR1cm4gY2g7CisJbiAmPSB+KCgxTEw8PDMyKSAtIDEpOworCWRvIHsKKwkJaGFzaCsrOworCQluICs9IDFMTDw8MzI7CisJfSB3aGlsZShoYXNoIDwgRVhQT1JUX0hBU0hNQVggJiYgZXhwb3J0X3RhYmxlW2hhc2hdPT1OVUxMKTsKKwlpZiAoaGFzaCA+PSBFWFBPUlRfSEFTSE1BWCkKKwkJcmV0dXJuIE5VTEw7CisJKnBvcyA9IG4rMTsKKwlyZXR1cm4gZXhwb3J0X3RhYmxlW2hhc2hdOworfQorCitzdGF0aWMgdm9pZCAqZV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGNhY2hlX2hlYWQgKmNoID0gcDsKKwlpbnQgaGFzaCA9ICgqcG9zID4+IDMyKTsKKworCWlmIChwID09ICh2b2lkICopMSkKKwkJaGFzaCA9IDA7CisJZWxzZSBpZiAoY2gtPm5leHQgPT0gTlVMTCkgeworCQloYXNoKys7CisJCSpwb3MgKz0gMUxMPDwzMjsKKwl9IGVsc2UgeworCQkrKypwb3M7CisJCXJldHVybiBjaC0+bmV4dDsKKwl9CisJKnBvcyAmPSB+KCgxTEw8PDMyKSAtIDEpOworCXdoaWxlIChoYXNoIDwgRVhQT1JUX0hBU0hNQVggJiYgZXhwb3J0X3RhYmxlW2hhc2hdID09IE5VTEwpIHsKKwkJaGFzaCsrOworCQkqcG9zICs9IDFMTDw8MzI7CisJfQorCWlmIChoYXNoID49IEVYUE9SVF9IQVNITUFYKQorCQlyZXR1cm4gTlVMTDsKKwkrKypwb3M7CisJcmV0dXJuIGV4cG9ydF90YWJsZVtoYXNoXTsKK30KKworc3RhdGljIHZvaWQgZV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKK3sKKwlyZWFkX3VubG9jaygmc3ZjX2V4cG9ydF9jYWNoZS5oYXNoX2xvY2spOworCWV4cF9yZWFkdW5sb2NrKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmxhZ3MgeworCWludCBmbGFnOworCWNoYXIgKm5hbWVbMl07Cit9IGV4cGZsYWdzW10gPSB7CisJeyBORlNFWFBfUkVBRE9OTFksIHsicm8iLCAicncifX0sCisJeyBORlNFWFBfSU5TRUNVUkVfUE9SVCwgeyJpbnNlY3VyZSIsICIifX0sCisJeyBORlNFWFBfUk9PVFNRVUFTSCwgeyJyb290X3NxdWFzaCIsICJub19yb290X3NxdWFzaCJ9fSwKKwl7IE5GU0VYUF9BTExTUVVBU0gsIHsiYWxsX3NxdWFzaCIsICIifX0sCisJeyBORlNFWFBfQVNZTkMsIHsiYXN5bmMiLCAic3luYyJ9fSwKKwl7IE5GU0VYUF9HQVRIRVJFRF9XUklURVMsIHsid2RlbGF5IiwgIm5vX3dkZWxheSJ9fSwKKwl7IE5GU0VYUF9OT0hJREUsIHsibm9oaWRlIiwgIiJ9fSwKKwl7IE5GU0VYUF9DUk9TU01PVU5ULCB7ImNyb3NzbW50IiwgIiJ9fSwKKwl7IE5GU0VYUF9OT1NVQlRSRUVDSEVDSywgeyJub19zdWJ0cmVlX2NoZWNrIiwgIiJ9fSwKKwl7IE5GU0VYUF9OT0FVVEhOTE0sIHsiaW5zZWN1cmVfbG9ja3MiLCAiIn19LAorI2lmZGVmIE1TTkZTCisJeyBORlNFWFBfTVNORlMsIHsibXNuZnMiLCAiIn19LAorI2VuZGlmCisJeyAwLCB7IiIsICIifX0KK307CisKK3N0YXRpYyB2b2lkIGV4cF9mbGFncyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGludCBmbGFnLCBpbnQgZnNpZCwgdWlkX3QgYW5vbnUsIHVpZF90IGFub25nKQoreworCWludCBmaXJzdCA9IDA7CisJc3RydWN0IGZsYWdzICpmbGc7CisKKwlmb3IgKGZsZyA9IGV4cGZsYWdzOyBmbGctPmZsYWc7IGZsZysrKSB7CisJCWludCBzdGF0ZSA9IChmbGctPmZsYWcgJiBmbGFnKT8wOjE7CisJCWlmICgqZmxnLT5uYW1lW3N0YXRlXSkKKwkJCXNlcV9wcmludGYobSwgIiVzJXMiLCBmaXJzdCsrPyIsIjoiIiwgZmxnLT5uYW1lW3N0YXRlXSk7CisJfQorCWlmIChmbGFnICYgTkZTRVhQX0ZTSUQpCisJCXNlcV9wcmludGYobSwgIiVzZnNpZD0lZCIsIGZpcnN0Kys/IiwiOiIiLCBmc2lkKTsKKwlpZiAoYW5vbnUgIT0gKHVpZF90KS0yICYmIGFub251ICE9ICgweDEwMDAwLTIpKQorCQlzZXFfcHJpbnRmKG0sICIlc2Fub251aWQ9JWQiLCBmaXJzdCsrPyIsIjoiIiwgYW5vbnUpOworCWlmIChhbm9uZyAhPSAoZ2lkX3QpLTIgJiYgYW5vbmcgIT0gKDB4MTAwMDAtMikpCisJCXNlcV9wcmludGYobSwgIiVzYW5vbmdpZD0lZCIsIGZpcnN0Kys/IiwiOiIiLCBhbm9uZyk7Cit9CisKK3N0YXRpYyBpbnQgZV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgY2FjaGVfaGVhZCAqY3AgPSBwOworCXN0cnVjdCBzdmNfZXhwb3J0ICpleHAgPSBjb250YWluZXJfb2YoY3AsIHN0cnVjdCBzdmNfZXhwb3J0LCBoKTsKKwlzdmNfY2xpZW50ICpjbHA7CisKKwlpZiAocCA9PSAodm9pZCAqKTEpIHsKKwkJc2VxX3B1dHMobSwgIiMgVmVyc2lvbiAxLjFcbiIpOworCQlzZXFfcHV0cyhtLCAiIyBQYXRoIENsaWVudChGbGFncykgIyBJUHNcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwljbHAgPSBleHAtPmV4X2NsaWVudDsKKwljYWNoZV9nZXQoJmV4cC0+aCk7CisJaWYgKGNhY2hlX2NoZWNrKCZzdmNfZXhwb3J0X2NhY2hlLCAmZXhwLT5oLCBOVUxMKSkKKwkJcmV0dXJuIDA7CisJaWYgKGNhY2hlX3B1dCgmZXhwLT5oLCAmc3ZjX2V4cG9ydF9jYWNoZSkpIEJVRygpOworCXJldHVybiBzdmNfZXhwb3J0X3Nob3cobSwgJnN2Y19leHBvcnRfY2FjaGUsIGNwKTsKK30KKworc3RydWN0IHNlcV9vcGVyYXRpb25zIG5mc19leHBvcnRzX29wID0geworCS5zdGFydAk9IGVfc3RhcnQsCisJLm5leHQJPSBlX25leHQsCisJLnN0b3AJPSBlX3N0b3AsCisJLnNob3cJPSBlX3Nob3csCit9OworCisvKgorICogQWRkIG9yIG1vZGlmeSBhIGNsaWVudC4KKyAqIENoYW5nZSByZXF1ZXN0cyBtYXkgaW52b2x2ZSB0aGUgbGlzdCBvZiBob3N0IGFkZHJlc3Nlcy4gVGhlIGxpc3Qgb2YKKyAqIGV4cG9ydHMgYW5kIHBvc3NpYmx5IGV4aXN0aW5nIHVpZCBtYXBzIGFyZSBsZWZ0IHVudG91Y2hlZC4KKyAqLworaW50CitleHBfYWRkY2xpZW50KHN0cnVjdCBuZnNjdGxfY2xpZW50ICpuY3ApCit7CisJc3RydWN0IGF1dGhfZG9tYWluCSpkb207CisJaW50CQkJaSwgZXJyOworCisJLyogRmlyc3QsIGNvbnNpc3RlbmN5IGNoZWNrLiAqLworCWVyciA9IC1FSU5WQUw7CisJaWYgKCEgZXhwX3ZlcmlmeV9zdHJpbmcobmNwLT5jbF9pZGVudCwgTkZTQ0xOVF9JRE1BWCkpCisJCWdvdG8gb3V0OworCWlmIChuY3AtPmNsX25hZGRyID4gTkZTQ0xOVF9BRERSTUFYKQorCQlnb3RvIG91dDsKKworCS8qIExvY2sgdGhlIGhhc2h0YWJsZSAqLworCWV4cF93cml0ZWxvY2soKTsKKworCWRvbSA9IHVuaXhfZG9tYWluX2ZpbmQobmNwLT5jbF9pZGVudCk7CisKKwllcnIgPSAtRU5PTUVNOworCWlmICghZG9tKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwkvKiBJbnNlcnQgY2xpZW50IGludG8gaGFzaHRhYmxlLiAqLworCWZvciAoaSA9IDA7IGkgPCBuY3AtPmNsX25hZGRyOyBpKyspCisJCWF1dGhfdW5peF9hZGRfYWRkcihuY3AtPmNsX2FkZHJsaXN0W2ldLCBkb20pOworCisJYXV0aF91bml4X2ZvcmdldF9vbGQoZG9tKTsKKwlhdXRoX2RvbWFpbl9wdXQoZG9tKTsKKworCWVyciA9IDA7CisKK291dF91bmxvY2s6CisJZXhwX3dyaXRldW5sb2NrKCk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIERlbGV0ZSBhIGNsaWVudCBnaXZlbiBhbiBpZGVudGlmaWVyLgorICovCitpbnQKK2V4cF9kZWxjbGllbnQoc3RydWN0IG5mc2N0bF9jbGllbnQgKm5jcCkKK3sKKwlpbnQJCWVycjsKKwlzdHJ1Y3QgYXV0aF9kb21haW4gKmRvbTsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKCFleHBfdmVyaWZ5X3N0cmluZyhuY3AtPmNsX2lkZW50LCBORlNDTE5UX0lETUFYKSkKKwkJZ290byBvdXQ7CisKKwkvKiBMb2NrIHRoZSBoYXNodGFibGUgKi8KKwlleHBfd3JpdGVsb2NrKCk7CisKKwlkb20gPSBhdXRoX2RvbWFpbl9maW5kKG5jcC0+Y2xfaWRlbnQpOworCS8qIGp1c3QgbWFrZSBzdXJlIHRoYXQgbm8gYWRkcmVzc2VzIHdvcmsgCisJICogYW5kIHRoYXQgaXQgd2lsbCBleHBpcmUgc29vbiAKKwkgKi8KKwlpZiAoZG9tKSB7CisJCWVyciA9IGF1dGhfdW5peF9mb3JnZXRfb2xkKGRvbSk7CisJCWRvbS0+aC5leHBpcnlfdGltZSA9IGdldF9zZWNvbmRzKCk7CisJCWF1dGhfZG9tYWluX3B1dChkb20pOworCX0KKworCWV4cF93cml0ZXVubG9jaygpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBWZXJpZnkgdGhhdCBzdHJpbmcgaXMgbm9uLWVtcHR5IGFuZCBkb2VzIG5vdCBleGNlZWQgbWF4IGxlbmd0aC4KKyAqLworc3RhdGljIGludAorZXhwX3ZlcmlmeV9zdHJpbmcoY2hhciAqY3AsIGludCBtYXgpCit7CisJaW50CWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspCisJCWlmICghY3BbaV0pCisJCQlyZXR1cm4gaTsKKwljcFtpXSA9IDA7CisJcHJpbnRrKEtFUk5fTk9USUNFICJuZnNkOiBjb3VsZG4ndCB2YWxpZGF0ZSBzdHJpbmcgJXNcbiIsIGNwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGV4cG9ydHMgbW9kdWxlLgorICovCit2b2lkCituZnNkX2V4cG9ydF9pbml0KHZvaWQpCit7CisJZHByaW50aygibmZzZDogaW5pdGlhbGl6aW5nIGV4cG9ydCBtb2R1bGUuXG4iKTsKKworCWNhY2hlX3JlZ2lzdGVyKCZzdmNfZXhwb3J0X2NhY2hlKTsKKwljYWNoZV9yZWdpc3Rlcigmc3ZjX2V4cGtleV9jYWNoZSk7CisKK30KKworLyoKKyAqIEZsdXNoIGV4cG9ydHMgdGFibGUgLSBjYWxsZWQgd2hlbiBsYXN0IG5mc2QgdGhyZWFkIGlzIGtpbGxlZAorICovCit2b2lkCituZnNkX2V4cG9ydF9mbHVzaCh2b2lkKQoreworCWV4cF93cml0ZWxvY2soKTsKKwljYWNoZV9wdXJnZSgmc3ZjX2V4cGtleV9jYWNoZSk7CisJY2FjaGVfcHVyZ2UoJnN2Y19leHBvcnRfY2FjaGUpOworCWV4cF93cml0ZXVubG9jaygpOworfQorCisvKgorICogU2h1dGRvd24gdGhlIGV4cG9ydHMgbW9kdWxlLgorICovCit2b2lkCituZnNkX2V4cG9ydF9zaHV0ZG93bih2b2lkKQoreworCisJZHByaW50aygibmZzZDogc2h1dHRpbmcgZG93biBleHBvcnQgbW9kdWxlLlxuIik7CisKKwlleHBfd3JpdGVsb2NrKCk7CisKKwlpZiAoY2FjaGVfdW5yZWdpc3Rlcigmc3ZjX2V4cGtleV9jYWNoZSkpCisJCXByaW50ayhLRVJOX0VSUiAibmZzZDogZmFpbGVkIHRvIHVucmVnaXN0ZXIgZXhwa2V5IGNhY2hlXG4iKTsKKwlpZiAoY2FjaGVfdW5yZWdpc3Rlcigmc3ZjX2V4cG9ydF9jYWNoZSkpCisJCXByaW50ayhLRVJOX0VSUiAibmZzZDogZmFpbGVkIHRvIHVucmVnaXN0ZXIgZXhwb3J0IGNhY2hlXG4iKTsKKwlzdmNhdXRoX3VuaXhfcHVyZ2UoKTsKKworCWV4cF93cml0ZXVubG9jaygpOworCWRwcmludGsoIm5mc2Q6IGV4cG9ydCBzaHV0ZG93biBjb21wbGV0ZS5cbiIpOworfQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9sb2NrZC5jIGIvZnMvbmZzZC9sb2NrZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiODg5ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnNkL2xvY2tkLmMKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIGxpbnV4L2ZzL25mc2QvbG9ja2QuYworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIHN0dWJzIG5lZWRlZCB3aGVuIGNvbW11bmljYXRpbmcgd2l0aCBsb2NrZC4KKyAqIFRoaXMgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gaXMgbmVjZXNzYXJ5IHNvIHdlIGNhbiBydW4gbmZzZCtsb2NrZCB3aXRob3V0CisgKiByZXF1aXJpbmcgdGhlIG5mcyBjbGllbnQgdG8gYmUgY29tcGlsZWQgaW4vbG9hZGVkLCBhbmQgdmljZSB2ZXJzYS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2QvYmluZC5oPgorCisjZGVmaW5lIE5GU0REQkdfRkFDSUxJVFkJCU5GU0REQkdfTE9DS0QKKworLyoKKyAqIE5vdGU6IHdlIGhvbGQgdGhlIGRlbnRyeSB1c2UgY291bnQgd2hpbGUgdGhlIGZpbGUgaXMgb3Blbi4KKyAqLworc3RhdGljIHUzMgorbmxtX2ZvcGVuKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNfZmggKmYsIHN0cnVjdCBmaWxlICoqZmlscCkKK3sKKwl1MzIJCW5mc2VycjsKKwlzdHJ1Y3Qgc3ZjX2ZoCWZoOworCisJLyogbXVzdCBpbml0aWFsaXplIGJlZm9yZSB1c2luZyEgYnV0IG1heHNpemUgZG9lc24ndCBtYXR0ZXIgKi8KKwlmaF9pbml0KCZmaCwwKTsKKwlmaC5maF9oYW5kbGUuZmhfc2l6ZSA9IGYtPnNpemU7CisJbWVtY3B5KChjaGFyKikmZmguZmhfaGFuZGxlLmZoX2Jhc2UsIGYtPmRhdGEsIGYtPnNpemUpOworCWZoLmZoX2V4cG9ydCA9IE5VTEw7CisKKwlleHBfcmVhZGxvY2soKTsKKwluZnNlcnIgPSBuZnNkX29wZW4ocnFzdHAsICZmaCwgU19JRlJFRywgTUFZX0xPQ0ssIGZpbHApOworCWZoX3B1dCgmZmgpOworCXJxc3RwLT5ycV9jbGllbnQgPSBOVUxMOworCWV4cF9yZWFkdW5sb2NrKCk7CisgCS8qIG5sbSBhbmQgbmZzZCBkb24ndCBzaGFyZSBlcnJvciBjb2Rlcy4KKwkgKiB3ZSBpbnZlbnQ6IDAgPSBubyBlcnJvcgorCSAqICAgICAgICAgICAgMSA9IHN0YWxlIGZpbGUgaGFuZGxlCisJICoJICAgICAgMiA9IG90aGVyIGVycm9yCisJICovCisJc3dpdGNoIChuZnNlcnIpIHsKKwljYXNlIG5mc19vazoKKwkJcmV0dXJuIDA7CisJY2FzZSBuZnNlcnJfc3RhbGU6CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAyOworCX0KK30KKworc3RhdGljIHZvaWQKK25sbV9mY2xvc2Uoc3RydWN0IGZpbGUgKmZpbHApCit7CisJZnB1dChmaWxwKTsKK30KKworc3RhdGljIHN0cnVjdCBubG1zdmNfYmluZGluZwluZnNkX25sbV9vcHMgPSB7CisJLmZvcGVuCQk9IG5sbV9mb3BlbiwJCS8qIG9wZW4gZmlsZSBmb3IgbG9ja2luZyAqLworCS5mY2xvc2UJCT0gbmxtX2ZjbG9zZSwJCS8qIGNsb3NlIGZpbGUgKi8KK307CisKK3ZvaWQKK25mc2RfbG9ja2RfaW5pdCh2b2lkKQoreworCWRwcmludGsoIm5mc2Q6IGluaXRpYWxpemluZyBsb2NrZFxuIik7CisJbmxtc3ZjX29wcyA9ICZuZnNkX25sbV9vcHM7Cit9CisKK3ZvaWQKK25mc2RfbG9ja2Rfc2h1dGRvd24odm9pZCkKK3sKKwlubG1zdmNfb3BzID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzM3Byb2MuYyBiL2ZzL25mc2QvbmZzM3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDEzODBmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzZC9uZnMzcHJvYy5jCkBAIC0wLDAgKzEsNzAyIEBACisvKgorICogbGludXgvZnMvbmZzZC9uZnMzcHJvYy5jCisgKgorICogUHJvY2VzcyB2ZXJzaW9uIDMgTkZTIHJlcXVlc3RzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXh0Ml9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QveGRyMy5oPgorI2luY2x1ZGUgPGxpbnV4L25mczMuaD4KKworI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZCQlORlNEREJHX1BST0MKKworI2RlZmluZSBSRVRVUk5fU1RBVFVTKHN0KQl7IHJlc3AtPnN0YXR1cyA9IChzdCk7IHJldHVybiAoc3QpOyB9CisKK3N0YXRpYyBpbnQJbmZzM19mdHlwZXNbXSA9IHsKKwkwLAkJCS8qIE5GM05PTiAqLworCVNfSUZSRUcsCQkvKiBORjNSRUcgKi8KKwlTX0lGRElSLAkJLyogTkYzRElSICovCisJU19JRkJMSywJCS8qIE5GM0JMSyAqLworCVNfSUZDSFIsCQkvKiBORjNDSFIgKi8KKwlTX0lGTE5LLAkJLyogTkYzTE5LICovCisJU19JRlNPQ0ssCQkvKiBORjNTT0NLICovCisJU19JRklGTywJCS8qIE5GM0ZJRk8gKi8KK307CisKKy8qCisgKiBOVUxMIGNhbGwuCisgKi8KK3N0YXRpYyBpbnQKK25mc2QzX3Byb2NfbnVsbChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB2b2lkICphcmdwLCB2b2lkICpyZXNwKQoreworCXJldHVybiBuZnNfb2s7Cit9CisKKy8qCisgKiBHZXQgYSBmaWxlJ3MgYXR0cmlidXRlcworICovCitzdGF0aWMgaW50CituZnNkM19wcm9jX2dldGF0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2RfZmhhbmRsZSAgKmFyZ3AsCisJCQkJCSAgIHN0cnVjdCBuZnNkM19hdHRyc3RhdCAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyOworCisJZHByaW50aygibmZzZDogR0VUQVRUUigzKSAgJXNcbiIsCisJCQkJU1ZDRkhfZm10KCZhcmdwLT5maCkpOworCisJZmhfY29weSgmcmVzcC0+ZmgsICZhcmdwLT5maCk7CisJbmZzZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCAmcmVzcC0+ZmgsIDAsIE1BWV9OT1ApOworCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKK30KKworLyoKKyAqIFNldCBhIGZpbGUncyBhdHRyaWJ1dGVzCisgKi8KK3N0YXRpYyBpbnQKK25mc2QzX3Byb2Nfc2V0YXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfc2F0dHJhcmdzICphcmdwLAorCQkJCQkgICBzdHJ1Y3QgbmZzZDNfYXR0cnN0YXQgICpyZXNwKQoreworCWludAluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBTRVRBVFRSKDMpICAlc1xuIiwKKwkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSk7CisKKwlmaF9jb3B5KCZyZXNwLT5maCwgJmFyZ3AtPmZoKTsKKwluZnNlcnIgPSBuZnNkX3NldGF0dHIocnFzdHAsICZyZXNwLT5maCwgJmFyZ3AtPmF0dHJzLAorCQkJICAgICAgYXJncC0+Y2hlY2tfZ3VhcmQsIGFyZ3AtPmd1YXJkdGltZSk7CisJUkVUVVJOX1NUQVRVUyhuZnNlcnIpOworfQorCisvKgorICogTG9vayB1cCBhIHBhdGggbmFtZSBjb21wb25lbnQKKyAqLworc3RhdGljIGludAorbmZzZDNfcHJvY19sb29rdXAoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2QzX2Rpcm9wYXJncyAqYXJncCwKKwkJCQkJICBzdHJ1Y3QgbmZzZDNfZGlyb3ByZXMgICpyZXNwKQoreworCWludAluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBMT09LVVAoMykgICAlcyAlLipzXG4iLAorCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLAorCQkJCWFyZ3AtPmxlbiwKKwkJCQlhcmdwLT5uYW1lKTsKKworCWZoX2NvcHkoJnJlc3AtPmRpcmZoLCAmYXJncC0+ZmgpOworCWZoX2luaXQoJnJlc3AtPmZoLCBORlMzX0ZIU0laRSk7CisKKwluZnNlcnIgPSBuZnNkX2xvb2t1cChycXN0cCwgJnJlc3AtPmRpcmZoLAorCQkJCSAgICBhcmdwLT5uYW1lLAorCQkJCSAgICBhcmdwLT5sZW4sCisJCQkJICAgICZyZXNwLT5maCk7CisJUkVUVVJOX1NUQVRVUyhuZnNlcnIpOworfQorCisvKgorICogQ2hlY2sgZmlsZSBhY2Nlc3MKKyAqLworc3RhdGljIGludAorbmZzZDNfcHJvY19hY2Nlc3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2QzX2FjY2Vzc2FyZ3MgKmFyZ3AsCisJCQkJCSAgc3RydWN0IG5mc2QzX2FjY2Vzc3JlcyAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyOworCisJZHByaW50aygibmZzZDogQUNDRVNTKDMpICAgJXMgMHgleFxuIiwKKwkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKKwkJCQlhcmdwLT5hY2Nlc3MpOworCisJZmhfY29weSgmcmVzcC0+ZmgsICZhcmdwLT5maCk7CisJcmVzcC0+YWNjZXNzID0gYXJncC0+YWNjZXNzOworCW5mc2VyciA9IG5mc2RfYWNjZXNzKHJxc3RwLCAmcmVzcC0+ZmgsICZyZXNwLT5hY2Nlc3MsIE5VTEwpOworCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKK30KKworLyoKKyAqIFJlYWQgYSBzeW1saW5rLgorICovCitzdGF0aWMgaW50CituZnNkM19wcm9jX3JlYWRsaW5rKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19yZWFkbGlua2FyZ3MgKmFyZ3AsCisJCQkJCSAgIHN0cnVjdCBuZnNkM19yZWFkbGlua3JlcyAqcmVzcCkKK3sKKwlpbnQgbmZzZXJyOworCisJZHByaW50aygibmZzZDogUkVBRExJTksoMykgJXNcbiIsIFNWQ0ZIX2ZtdCgmYXJncC0+ZmgpKTsKKworCS8qIFJlYWQgdGhlIHN5bWxpbmsuICovCisJZmhfY29weSgmcmVzcC0+ZmgsICZhcmdwLT5maCk7CisJcmVzcC0+bGVuID0gTkZTM19NQVhQQVRITEVOOworCW5mc2VyciA9IG5mc2RfcmVhZGxpbmsocnFzdHAsICZyZXNwLT5maCwgYXJncC0+YnVmZmVyLCAmcmVzcC0+bGVuKTsKKwlSRVRVUk5fU1RBVFVTKG5mc2Vycik7Cit9CisKKy8qCisgKiBSZWFkIGEgcG9ydGlvbiBvZiBhIGZpbGUuCisgKi8KK3N0YXRpYyBpbnQKK25mc2QzX3Byb2NfcmVhZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfcmVhZGFyZ3MgKmFyZ3AsCisJCQkJICAgICAgICBzdHJ1Y3QgbmZzZDNfcmVhZHJlcyAgKnJlc3ApCit7CisJaW50CW5mc2VycjsKKworCWRwcmludGsoIm5mc2Q6IFJFQUQoMykgJXMgJWx1IGJ5dGVzIGF0ICVsdVxuIiwKKwkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKKwkJCQkodW5zaWduZWQgbG9uZykgYXJncC0+Y291bnQsCisJCQkJKHVuc2lnbmVkIGxvbmcpIGFyZ3AtPm9mZnNldCk7CisKKwkvKiBPYnRhaW4gYnVmZmVyIHBvaW50ZXIgZm9yIHBheWxvYWQuCisJICogMSAoc3RhdHVzKSArIDIyIChwb3N0X29wX2F0dHIpICsgMSAoY291bnQpICsgMSAoZW9mKQorCSAqICsgMSAoeGRyIG9wYXF1ZSBieXRlIGNvdW50KSA9IDI2CisJICovCisKKwlyZXNwLT5jb3VudCA9IGFyZ3AtPmNvdW50OworCWlmIChORlNTVkNfTUFYQkxLU0laRSA8IHJlc3AtPmNvdW50KQorCQlyZXNwLT5jb3VudCA9IE5GU1NWQ19NQVhCTEtTSVpFOworCisJc3ZjX3Jlc2VydmUocnFzdHAsICgoMSArIE5GUzNfUE9TVF9PUF9BVFRSX1dPUkRTICsgMyk8PDIpICsgcmVzcC0+Y291bnQgKzQpOworCisJZmhfY29weSgmcmVzcC0+ZmgsICZhcmdwLT5maCk7CisJbmZzZXJyID0gbmZzZF9yZWFkKHJxc3RwLCAmcmVzcC0+ZmgsIE5VTEwsCisJCQkJICBhcmdwLT5vZmZzZXQsCisJCQkgICAJICBhcmdwLT52ZWMsIGFyZ3AtPnZsZW4sCisJCQkJICAmcmVzcC0+Y291bnQpOworCWlmIChuZnNlcnIgPT0gMCkgeworCQlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gcmVzcC0+ZmguZmhfZGVudHJ5LT5kX2lub2RlOworCisJCXJlc3AtPmVvZiA9IChhcmdwLT5vZmZzZXQgKyByZXNwLT5jb3VudCkgPj0gaW5vZGUtPmlfc2l6ZTsKKwl9CisKKwlSRVRVUk5fU1RBVFVTKG5mc2Vycik7Cit9CisKKy8qCisgKiBXcml0ZSBkYXRhIHRvIGEgZmlsZQorICovCitzdGF0aWMgaW50CituZnNkM19wcm9jX3dyaXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM193cml0ZWFyZ3MgKmFyZ3AsCisJCQkJCSBzdHJ1Y3QgbmZzZDNfd3JpdGVyZXMgICpyZXNwKQoreworCWludAluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBXUklURSgzKSAgICAlcyAlZCBieXRlcyBhdCAlbGQlc1xuIiwKKwkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKKwkJCQlhcmdwLT5sZW4sCisJCQkJKHVuc2lnbmVkIGxvbmcpIGFyZ3AtPm9mZnNldCwKKwkJCQlhcmdwLT5zdGFibGU/ICIgc3RhYmxlIiA6ICIiKTsKKworCWZoX2NvcHkoJnJlc3AtPmZoLCAmYXJncC0+ZmgpOworCXJlc3AtPmNvbW1pdHRlZCA9IGFyZ3AtPnN0YWJsZTsKKwluZnNlcnIgPSBuZnNkX3dyaXRlKHJxc3RwLCAmcmVzcC0+ZmgsIE5VTEwsCisJCQkJICAgYXJncC0+b2Zmc2V0LAorCQkJCSAgIGFyZ3AtPnZlYywgYXJncC0+dmxlbiwKKwkJCQkgICBhcmdwLT5sZW4sCisJCQkJICAgJnJlc3AtPmNvbW1pdHRlZCk7CisJcmVzcC0+Y291bnQgPSBhcmdwLT5jb3VudDsKKwlSRVRVUk5fU1RBVFVTKG5mc2Vycik7Cit9CisKKy8qCisgKiBXaXRoIE5GU3YzLCBDUkVBVEUgcHJvY2Vzc2luZyBpcyBhIGxvdCBlYXNpZXIgdGhhbiB3aXRoIE5GU3YyLgorICogQXQgbGVhc3QgaW4gdGhlb3J5OyB3ZSdsbCBzZWUgaG93IGl0IGZhcmVzIGluIHByYWN0aWNlIHdoZW4gdGhlCisgKiBmaXJzdCByZXBvcnRzIGFib3V0IFN1bk9TIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgc3RhcnQgdG8gcG91ciBpbi4uLgorICovCitzdGF0aWMgaW50CituZnNkM19wcm9jX2NyZWF0ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfY3JlYXRlYXJncyAqYXJncCwKKwkJCQkJICBzdHJ1Y3QgbmZzZDNfZGlyb3ByZXMgICAqcmVzcCkKK3sKKwlzdmNfZmgJCSpkaXJmaHAsICpuZXdmaHAgPSBOVUxMOworCXN0cnVjdCBpYXR0cgkqYXR0cjsKKwl1MzIJCW5mc2VycjsKKworCWRwcmludGsoIm5mc2Q6IENSRUFURSgzKSAgICVzICUuKnNcbiIsCisJCQkJU1ZDRkhfZm10KCZhcmdwLT5maCksCisJCQkJYXJncC0+bGVuLAorCQkJCWFyZ3AtPm5hbWUpOworCisJZGlyZmhwID0gZmhfY29weSgmcmVzcC0+ZGlyZmgsICZhcmdwLT5maCk7CisJbmV3ZmhwID0gZmhfaW5pdCgmcmVzcC0+ZmgsIE5GUzNfRkhTSVpFKTsKKwlhdHRyICAgPSAmYXJncC0+YXR0cnM7CisKKwkvKiBHZXQgdGhlIGRpcmVjdG9yeSBpbm9kZSAqLworCW5mc2VyciA9IGZoX3ZlcmlmeShycXN0cCwgZGlyZmhwLCBTX0lGRElSLCBNQVlfQ1JFQVRFKTsKKwlpZiAobmZzZXJyKQorCQlSRVRVUk5fU1RBVFVTKG5mc2Vycik7CisKKwkvKiBVbmZ1ZGdlIHRoZSBtb2RlIGJpdHMgKi8KKwlhdHRyLT5pYV9tb2RlICY9IH5TX0lGTVQ7CisJaWYgKCEoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpKSB7IAorCQlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX01PREU7CisJCWF0dHItPmlhX21vZGUgPSBTX0lGUkVHOworCX0gZWxzZSB7CisJCWF0dHItPmlhX21vZGUgPSAoYXR0ci0+aWFfbW9kZSAmIH5TX0lGTVQpIHwgU19JRlJFRzsKKwl9CisKKwkvKiBOb3cgY3JlYXRlIHRoZSBmaWxlIGFuZCBzZXQgYXR0cmlidXRlcyAqLworCW5mc2VyciA9IG5mc2RfY3JlYXRlX3YzKHJxc3RwLCBkaXJmaHAsIGFyZ3AtPm5hbWUsIGFyZ3AtPmxlbiwKKwkJCQlhdHRyLCBuZXdmaHAsCisJCQkJYXJncC0+Y3JlYXRlbW9kZSwgYXJncC0+dmVyZiwgTlVMTCk7CisKKwlSRVRVUk5fU1RBVFVTKG5mc2Vycik7Cit9CisKKy8qCisgKiBNYWtlIGRpcmVjdG9yeS4gVGhpcyBvcGVyYXRpb24gaXMgbm90IGlkZW1wb3RlbnQuCisgKi8KK3N0YXRpYyBpbnQKK25mc2QzX3Byb2NfbWtkaXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2QzX2NyZWF0ZWFyZ3MgKmFyZ3AsCisJCQkJCSBzdHJ1Y3QgbmZzZDNfZGlyb3ByZXMgICAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyOworCisJZHByaW50aygibmZzZDogTUtESVIoMykgICAgJXMgJS4qc1xuIiwKKwkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKKwkJCQlhcmdwLT5sZW4sCisJCQkJYXJncC0+bmFtZSk7CisKKwlhcmdwLT5hdHRycy5pYV92YWxpZCAmPSB+QVRUUl9TSVpFOworCWZoX2NvcHkoJnJlc3AtPmRpcmZoLCAmYXJncC0+ZmgpOworCWZoX2luaXQoJnJlc3AtPmZoLCBORlMzX0ZIU0laRSk7CisJbmZzZXJyID0gbmZzZF9jcmVhdGUocnFzdHAsICZyZXNwLT5kaXJmaCwgYXJncC0+bmFtZSwgYXJncC0+bGVuLAorCQkJCSAgICAmYXJncC0+YXR0cnMsIFNfSUZESVIsIDAsICZyZXNwLT5maCk7CisKKwlSRVRVUk5fU1RBVFVTKG5mc2Vycik7Cit9CisKK3N0YXRpYyBpbnQKK25mc2QzX3Byb2Nfc3ltbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfc3ltbGlua2FyZ3MgKmFyZ3AsCisJCQkJCSAgIHN0cnVjdCBuZnNkM19kaXJvcHJlcyAgICAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyOworCisJZHByaW50aygibmZzZDogU1lNTElOSygzKSAgJXMgJS4qcyAtPiAlLipzXG4iLAorCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmZoKSwKKwkJCQlhcmdwLT5mbGVuLCBhcmdwLT5mbmFtZSwKKwkJCQlhcmdwLT50bGVuLCBhcmdwLT50bmFtZSk7CisKKwlmaF9jb3B5KCZyZXNwLT5kaXJmaCwgJmFyZ3AtPmZmaCk7CisJZmhfaW5pdCgmcmVzcC0+ZmgsIE5GUzNfRkhTSVpFKTsKKwluZnNlcnIgPSBuZnNkX3N5bWxpbmsocnFzdHAsICZyZXNwLT5kaXJmaCwgYXJncC0+Zm5hbWUsIGFyZ3AtPmZsZW4sCisJCQkJCQkgICBhcmdwLT50bmFtZSwgYXJncC0+dGxlbiwKKwkJCQkJCSAgICZyZXNwLT5maCwgJmFyZ3AtPmF0dHJzKTsKKwlSRVRVUk5fU1RBVFVTKG5mc2Vycik7Cit9CisKKy8qCisgKiBNYWtlIHNvY2tldC9maWZvL2RldmljZS4KKyAqLworc3RhdGljIGludAorbmZzZDNfcHJvY19ta25vZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfbWtub2RhcmdzICphcmdwLAorCQkJCQkgc3RydWN0IG5mc2QzX2Rpcm9wcmVzICAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyLCB0eXBlOworCWRldl90CXJkZXYgPSAwOworCisJZHByaW50aygibmZzZDogTUtOT0QoMykgICAgJXMgJS4qc1xuIiwKKwkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKKwkJCQlhcmdwLT5sZW4sCisJCQkJYXJncC0+bmFtZSk7CisKKwlmaF9jb3B5KCZyZXNwLT5kaXJmaCwgJmFyZ3AtPmZoKTsKKwlmaF9pbml0KCZyZXNwLT5maCwgTkZTM19GSFNJWkUpOworCisJaWYgKGFyZ3AtPmZ0eXBlID09IDAgfHwgYXJncC0+ZnR5cGUgPj0gTkYzQkFEKQorCQlSRVRVUk5fU1RBVFVTKG5mc2Vycl9pbnZhbCk7CisJaWYgKGFyZ3AtPmZ0eXBlID09IE5GM0NIUiB8fCBhcmdwLT5mdHlwZSA9PSBORjNCTEspIHsKKwkJcmRldiA9IE1LREVWKGFyZ3AtPm1ham9yLCBhcmdwLT5taW5vcik7CisJCWlmIChNQUpPUihyZGV2KSAhPSBhcmdwLT5tYWpvciB8fAorCQkgICAgTUlOT1IocmRldikgIT0gYXJncC0+bWlub3IpCisJCQlSRVRVUk5fU1RBVFVTKG5mc2Vycl9pbnZhbCk7CisJfSBlbHNlCisJCWlmIChhcmdwLT5mdHlwZSAhPSBORjNTT0NLICYmIGFyZ3AtPmZ0eXBlICE9IE5GM0ZJRk8pCisJCQlSRVRVUk5fU1RBVFVTKG5mc2Vycl9pbnZhbCk7CisKKwl0eXBlID0gbmZzM19mdHlwZXNbYXJncC0+ZnR5cGVdOworCW5mc2VyciA9IG5mc2RfY3JlYXRlKHJxc3RwLCAmcmVzcC0+ZGlyZmgsIGFyZ3AtPm5hbWUsIGFyZ3AtPmxlbiwKKwkJCQkgICAgJmFyZ3AtPmF0dHJzLCB0eXBlLCByZGV2LCAmcmVzcC0+ZmgpOworCisJUkVUVVJOX1NUQVRVUyhuZnNlcnIpOworfQorCisvKgorICogUmVtb3ZlIGZpbGUvZmlmby9zb2NrZXQgZXRjLgorICovCitzdGF0aWMgaW50CituZnNkM19wcm9jX3JlbW92ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfZGlyb3BhcmdzICphcmdwLAorCQkJCQkgIHN0cnVjdCBuZnNkM19hdHRyc3RhdCAgKnJlc3ApCit7CisJaW50CW5mc2VycjsKKworCWRwcmludGsoIm5mc2Q6IFJFTU9WRSgzKSAgICVzICUuKnNcbiIsCisJCQkJU1ZDRkhfZm10KCZhcmdwLT5maCksCisJCQkJYXJncC0+bGVuLAorCQkJCWFyZ3AtPm5hbWUpOworCisJLyogVW5saW5rLiAtU19JRkRJUiBtZWFucyBmaWxlIG11c3Qgbm90IGJlIGEgZGlyZWN0b3J5ICovCisJZmhfY29weSgmcmVzcC0+ZmgsICZhcmdwLT5maCk7CisJbmZzZXJyID0gbmZzZF91bmxpbmsocnFzdHAsICZyZXNwLT5maCwgLVNfSUZESVIsIGFyZ3AtPm5hbWUsIGFyZ3AtPmxlbik7CisJUkVUVVJOX1NUQVRVUyhuZnNlcnIpOworfQorCisvKgorICogUmVtb3ZlIGEgZGlyZWN0b3J5CisgKi8KK3N0YXRpYyBpbnQKK25mc2QzX3Byb2Nfcm1kaXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2QzX2Rpcm9wYXJncyAqYXJncCwKKwkJCQkJIHN0cnVjdCBuZnNkM19hdHRyc3RhdCAgKnJlc3ApCit7CisJaW50CW5mc2VycjsKKworCWRwcmludGsoIm5mc2Q6IFJNRElSKDMpICAgICVzICUuKnNcbiIsCisJCQkJU1ZDRkhfZm10KCZhcmdwLT5maCksCisJCQkJYXJncC0+bGVuLAorCQkJCWFyZ3AtPm5hbWUpOworCisJZmhfY29weSgmcmVzcC0+ZmgsICZhcmdwLT5maCk7CisJbmZzZXJyID0gbmZzZF91bmxpbmsocnFzdHAsICZyZXNwLT5maCwgU19JRkRJUiwgYXJncC0+bmFtZSwgYXJncC0+bGVuKTsKKwlSRVRVUk5fU1RBVFVTKG5mc2Vycik7Cit9CisKK3N0YXRpYyBpbnQKK25mc2QzX3Byb2NfcmVuYW1lKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19yZW5hbWVhcmdzICphcmdwLAorCQkJCQkgIHN0cnVjdCBuZnNkM19yZW5hbWVyZXMgICpyZXNwKQoreworCWludAluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBSRU5BTUUoMykgICAlcyAlLipzIC0+XG4iLAorCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmZoKSwKKwkJCQlhcmdwLT5mbGVuLAorCQkJCWFyZ3AtPmZuYW1lKTsKKwlkcHJpbnRrKCJuZnNkOiAtPiAlcyAlLipzXG4iLAorCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+dGZoKSwKKwkJCQlhcmdwLT50bGVuLAorCQkJCWFyZ3AtPnRuYW1lKTsKKworCWZoX2NvcHkoJnJlc3AtPmZmaCwgJmFyZ3AtPmZmaCk7CisJZmhfY29weSgmcmVzcC0+dGZoLCAmYXJncC0+dGZoKTsKKwluZnNlcnIgPSBuZnNkX3JlbmFtZShycXN0cCwgJnJlc3AtPmZmaCwgYXJncC0+Zm5hbWUsIGFyZ3AtPmZsZW4sCisJCQkJICAgICZyZXNwLT50ZmgsIGFyZ3AtPnRuYW1lLCBhcmdwLT50bGVuKTsKKwlSRVRVUk5fU1RBVFVTKG5mc2Vycik7Cit9CisKK3N0YXRpYyBpbnQKK25mc2QzX3Byb2NfbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfbGlua2FyZ3MgKmFyZ3AsCisJCQkJCXN0cnVjdCBuZnNkM19saW5rcmVzICAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyOworCisJZHByaW50aygibmZzZDogTElOSygzKSAgICAgJXMgLT5cbiIsCisJCQkJU1ZDRkhfZm10KCZhcmdwLT5mZmgpKTsKKwlkcHJpbnRrKCJuZnNkOiAgIC0+ICVzICUuKnNcbiIsCisJCQkJU1ZDRkhfZm10KCZhcmdwLT50ZmgpLAorCQkJCWFyZ3AtPnRsZW4sCisJCQkJYXJncC0+dG5hbWUpOworCisJZmhfY29weSgmcmVzcC0+ZmgsICAmYXJncC0+ZmZoKTsKKwlmaF9jb3B5KCZyZXNwLT50ZmgsICZhcmdwLT50ZmgpOworCW5mc2VyciA9IG5mc2RfbGluayhycXN0cCwgJnJlc3AtPnRmaCwgYXJncC0+dG5hbWUsIGFyZ3AtPnRsZW4sCisJCQkJICAmcmVzcC0+ZmgpOworCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKK30KKworLyoKKyAqIFJlYWQgYSBwb3J0aW9uIG9mIGEgZGlyZWN0b3J5LgorICovCitzdGF0aWMgaW50CituZnNkM19wcm9jX3JlYWRkaXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2QzX3JlYWRkaXJhcmdzICphcmdwLAorCQkJCQkgICBzdHJ1Y3QgbmZzZDNfcmVhZGRpcnJlcyAgKnJlc3ApCit7CisJaW50CQluZnNlcnIsIGNvdW50OworCisJZHByaW50aygibmZzZDogUkVBRERJUigzKSAgJXMgJWQgYnl0ZXMgYXQgJWRcbiIsCisJCQkJU1ZDRkhfZm10KCZhcmdwLT5maCksCisJCQkJYXJncC0+Y291bnQsICh1MzIpIGFyZ3AtPmNvb2tpZSk7CisKKwkvKiBNYWtlIHN1cmUgd2UndmUgcm9vbSBmb3IgdGhlIE5VTEwgcHRyICYgZW9mIGZsYWcsIGFuZCBzaHJpbmsgdG8KKwkgKiBjbGllbnQgcmVhZCBzaXplICovCisJY291bnQgPSAoYXJncC0+Y291bnQgPj4gMikgLSAyOworCisJLyogUmVhZCBkaXJlY3RvcnkgYW5kIGVuY29kZSBlbnRyaWVzIG9uIHRoZSBmbHkgKi8KKwlmaF9jb3B5KCZyZXNwLT5maCwgJmFyZ3AtPmZoKTsKKworCXJlc3AtPmJ1ZmxlbiA9IGNvdW50OworCXJlc3AtPmNvbW1vbi5lcnIgPSBuZnNfb2s7CisJcmVzcC0+YnVmZmVyID0gYXJncC0+YnVmZmVyOworCXJlc3AtPnJxc3RwID0gcnFzdHA7CisJbmZzZXJyID0gbmZzZF9yZWFkZGlyKHJxc3RwLCAmcmVzcC0+ZmgsIChsb2ZmX3QqKSAmYXJncC0+Y29va2llLCAKKwkJCQkJJnJlc3AtPmNvbW1vbiwgbmZzM3N2Y19lbmNvZGVfZW50cnkpOworCW1lbWNweShyZXNwLT52ZXJmLCBhcmdwLT52ZXJmLCA4KTsKKwlyZXNwLT5jb3VudCA9IHJlc3AtPmJ1ZmZlciAtIGFyZ3AtPmJ1ZmZlcjsKKwlpZiAocmVzcC0+b2Zmc2V0KQorCQl4ZHJfZW5jb2RlX2h5cGVyKHJlc3AtPm9mZnNldCwgYXJncC0+Y29va2llKTsKKworCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKK30KKworLyoKKyAqIFJlYWQgYSBwb3J0aW9uIG9mIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgZmlsZSBoYW5kbGVzIGFuZCBhdHRycy4KKyAqIEZvciBub3csIHdlIGNob29zZSB0byBpZ25vcmUgdGhlIGRpcmNvdW50IHBhcmFtZXRlci4KKyAqLworc3RhdGljIGludAorbmZzZDNfcHJvY19yZWFkZGlycGx1cyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfcmVhZGRpcmFyZ3MgKmFyZ3AsCisJCQkJCSAgICAgICBzdHJ1Y3QgbmZzZDNfcmVhZGRpcnJlcyAgKnJlc3ApCit7CisJaW50CW5mc2VyciwgY291bnQgPSAwOworCWxvZmZfdAlvZmZzZXQ7CisJaW50CWk7CisJY2FkZHJfdAlwYWdlX2FkZHIgPSBOVUxMOworCisJZHByaW50aygibmZzZDogUkVBRERJUisoMykgJXMgJWQgYnl0ZXMgYXQgJWRcbiIsCisJCQkJU1ZDRkhfZm10KCZhcmdwLT5maCksCisJCQkJYXJncC0+Y291bnQsICh1MzIpIGFyZ3AtPmNvb2tpZSk7CisKKwkvKiBDb252ZXJ0IGJ5dGUgY291bnQgdG8gbnVtYmVyIG9mIHdvcmRzIChpLmUuID4+IDIpLAorCSAqIGFuZCByZXNlcnZlIHJvb20gZm9yIHRoZSBOVUxMIHB0ciAmIGVvZiBmbGFnICgtMiB3b3JkcykgKi8KKwlyZXNwLT5jb3VudCA9IChhcmdwLT5jb3VudCA+PiAyKSAtIDI7CisKKwkvKiBSZWFkIGRpcmVjdG9yeSBhbmQgZW5jb2RlIGVudHJpZXMgb24gdGhlIGZseSAqLworCWZoX2NvcHkoJnJlc3AtPmZoLCAmYXJncC0+ZmgpOworCisJcmVzcC0+Y29tbW9uLmVyciA9IG5mc19vazsKKwlyZXNwLT5idWZmZXIgPSBhcmdwLT5idWZmZXI7CisJcmVzcC0+YnVmbGVuID0gcmVzcC0+Y291bnQ7CisJcmVzcC0+cnFzdHAgPSBycXN0cDsKKwlvZmZzZXQgPSBhcmdwLT5jb29raWU7CisJbmZzZXJyID0gbmZzZF9yZWFkZGlyKHJxc3RwLCAmcmVzcC0+ZmgsCisJCQkJICAgICAmb2Zmc2V0LAorCQkJCSAgICAgJnJlc3AtPmNvbW1vbiwKKwkJCQkgICAgIG5mczNzdmNfZW5jb2RlX2VudHJ5X3BsdXMpOworCW1lbWNweShyZXNwLT52ZXJmLCBhcmdwLT52ZXJmLCA4KTsKKwlmb3IgKGk9MTsgaTxycXN0cC0+cnFfcmVzdXNlZCA7IGkrKykgeworCQlwYWdlX2FkZHIgPSBwYWdlX2FkZHJlc3MocnFzdHAtPnJxX3Jlc3BhZ2VzW2ldKTsKKworCQlpZiAoKChjYWRkcl90KXJlc3AtPmJ1ZmZlciA+PSBwYWdlX2FkZHIpICYmCisJCSAgICAoKGNhZGRyX3QpcmVzcC0+YnVmZmVyIDwgcGFnZV9hZGRyICsgUEFHRV9TSVpFKSkgeworCQkJY291bnQgKz0gKGNhZGRyX3QpcmVzcC0+YnVmZmVyIC0gcGFnZV9hZGRyOworCQkJYnJlYWs7CisJCX0KKwkJY291bnQgKz0gUEFHRV9TSVpFOworCX0KKwlyZXNwLT5jb3VudCA9IGNvdW50ID4+IDI7CisJaWYgKHJlc3AtPm9mZnNldCkgeworCQlpZiAodW5saWtlbHkocmVzcC0+b2Zmc2V0MSkpIHsKKwkJCS8qIHdlIGVuZGVkIHVwIHdpdGggb2Zmc2V0IG9uIGEgcGFnZSBib3VuZGFyeSAqLworCQkJKnJlc3AtPm9mZnNldCA9IGh0b25sKG9mZnNldCA+PiAzMik7CisJCQkqcmVzcC0+b2Zmc2V0MSA9IGh0b25sKG9mZnNldCAmIDB4ZmZmZmZmZmYpOworCQkJcmVzcC0+b2Zmc2V0MSA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQl4ZHJfZW5jb2RlX2h5cGVyKHJlc3AtPm9mZnNldCwgb2Zmc2V0KTsKKwkJfQorCX0KKworCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKK30KKworLyoKKyAqIEdldCBmaWxlIHN5c3RlbSBzdGF0cworICovCitzdGF0aWMgaW50CituZnNkM19wcm9jX2Zzc3RhdChzdHJ1Y3Qgc3ZjX3Jxc3QgKiBycXN0cCwgc3RydWN0IG5mc2RfZmhhbmRsZSAgICAqYXJncCwKKwkJCQkJICAgc3RydWN0IG5mc2QzX2Zzc3RhdHJlcyAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyOworCisJZHByaW50aygibmZzZDogRlNTVEFUKDMpICAgJXNcbiIsCisJCQkJU1ZDRkhfZm10KCZhcmdwLT5maCkpOworCisJbmZzZXJyID0gbmZzZF9zdGF0ZnMocnFzdHAsICZhcmdwLT5maCwgJnJlc3AtPnN0YXRzKTsKKwlmaF9wdXQoJmFyZ3AtPmZoKTsKKwlSRVRVUk5fU1RBVFVTKG5mc2Vycik7Cit9CisKKy8qCisgKiBHZXQgZmlsZSBzeXN0ZW0gaW5mbworICovCitzdGF0aWMgaW50CituZnNkM19wcm9jX2ZzaW5mbyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiBycXN0cCwgc3RydWN0IG5mc2RfZmhhbmRsZSAgICAqYXJncCwKKwkJCQkJICAgc3RydWN0IG5mc2QzX2ZzaW5mb3JlcyAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyOworCisJZHByaW50aygibmZzZDogRlNJTkZPKDMpICAgJXNcbiIsCisJCQkJU1ZDRkhfZm10KCZhcmdwLT5maCkpOworCisJcmVzcC0+Zl9ydG1heCAgPSBORlNTVkNfTUFYQkxLU0laRTsKKwlyZXNwLT5mX3J0cHJlZiA9IE5GU1NWQ19NQVhCTEtTSVpFOworCXJlc3AtPmZfcnRtdWx0ID0gUEFHRV9TSVpFOworCXJlc3AtPmZfd3RtYXggID0gTkZTU1ZDX01BWEJMS1NJWkU7CisJcmVzcC0+Zl93dHByZWYgPSBORlNTVkNfTUFYQkxLU0laRTsKKwlyZXNwLT5mX3d0bXVsdCA9IFBBR0VfU0laRTsKKwlyZXNwLT5mX2R0cHJlZiA9IFBBR0VfU0laRTsKKwlyZXNwLT5mX21heGZpbGVzaXplID0gfih1MzIpIDA7CisJcmVzcC0+Zl9wcm9wZXJ0aWVzID0gTkZTM19GU0ZfREVGQVVMVDsKKworCW5mc2VyciA9IGZoX3ZlcmlmeShycXN0cCwgJmFyZ3AtPmZoLCAwLCBNQVlfTk9QKTsKKworCS8qIENoZWNrIHNwZWNpYWwgZmVhdHVyZXMgb2YgdGhlIGZpbGUgc3lzdGVtLiBNYXkgcmVxdWVzdAorCSAqIGRpZmZlcmVudCByZWFkL3dyaXRlIHNpemVzIGZvciBmaWxlIHN5c3RlbXMga25vd24gdG8gaGF2ZQorCSAqIHByb2JsZW1zIHdpdGggbGFyZ2UgYmxvY2tzICovCisJaWYgKG5mc2VyciA9PSAwKSB7CisJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBhcmdwLT5maC5maF9kZW50cnktPmRfaW5vZGUtPmlfc2I7CisKKwkJLyogTm90ZSB0aGF0IHdlIGRvbid0IGNhcmUgZm9yIHJlbW90ZSBmcydzIGhlcmUgKi8KKwkJaWYgKHNiLT5zX21hZ2ljID09IDB4NGQ0NCAvKiBNU0RPU19TVVBFUl9NQUdJQyAqLykgeworCQkJcmVzcC0+Zl9wcm9wZXJ0aWVzID0gTkZTM19GU0ZfQklMTFlCT1k7CisJCX0KKwkJcmVzcC0+Zl9tYXhmaWxlc2l6ZSA9IHNiLT5zX21heGJ5dGVzOworCX0KKworCWZoX3B1dCgmYXJncC0+ZmgpOworCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKK30KKworLyoKKyAqIEdldCBwYXRoY29uZiBpbmZvIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUKKyAqLworc3RhdGljIGludAorbmZzZDNfcHJvY19wYXRoY29uZihzdHJ1Y3Qgc3ZjX3Jxc3QgKiBycXN0cCwgc3RydWN0IG5mc2RfZmhhbmRsZSAgICAgICphcmdwLAorCQkJCQkgICAgIHN0cnVjdCBuZnNkM19wYXRoY29uZnJlcyAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyOworCisJZHByaW50aygibmZzZDogUEFUSENPTkYoMykgJXNcbiIsCisJCQkJU1ZDRkhfZm10KCZhcmdwLT5maCkpOworCisJLyogU2V0IGRlZmF1bHQgcGF0aGNvbmYgKi8KKwlyZXNwLT5wX2xpbmtfbWF4ID0gMjU1OwkJLyogYXQgbGVhc3QgKi8KKwlyZXNwLT5wX25hbWVfbWF4ID0gMjU1OwkJLyogYXQgbGVhc3QgKi8KKwlyZXNwLT5wX25vX3RydW5jID0gMDsKKwlyZXNwLT5wX2Nob3duX3Jlc3RyaWN0ZWQgPSAxOworCXJlc3AtPnBfY2FzZV9pbnNlbnNpdGl2ZSA9IDA7CisJcmVzcC0+cF9jYXNlX3ByZXNlcnZpbmcgPSAxOworCisJbmZzZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCAmYXJncC0+ZmgsIDAsIE1BWV9OT1ApOworCisJaWYgKG5mc2VyciA9PSAwKSB7CisJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBhcmdwLT5maC5maF9kZW50cnktPmRfaW5vZGUtPmlfc2I7CisKKwkJLyogTm90ZSB0aGF0IHdlIGRvbid0IGNhcmUgZm9yIHJlbW90ZSBmcydzIGhlcmUgKi8KKwkJc3dpdGNoIChzYi0+c19tYWdpYykgeworCQljYXNlIEVYVDJfU1VQRVJfTUFHSUM6CisJCQlyZXNwLT5wX2xpbmtfbWF4ID0gRVhUMl9MSU5LX01BWDsKKwkJCXJlc3AtPnBfbmFtZV9tYXggPSBFWFQyX05BTUVfTEVOOworCQkJYnJlYWs7CisJCWNhc2UgMHg0ZDQ0OgkvKiBNU0RPU19TVVBFUl9NQUdJQyAqLworCQkJcmVzcC0+cF9jYXNlX2luc2Vuc2l0aXZlID0gMTsKKwkJCXJlc3AtPnBfY2FzZV9wcmVzZXJ2aW5nICA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCWZoX3B1dCgmYXJncC0+ZmgpOworCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKK30KKworCisvKgorICogQ29tbWl0IGEgZmlsZSAocmFuZ2UpIHRvIHN0YWJsZSBzdG9yYWdlLgorICovCitzdGF0aWMgaW50CituZnNkM19wcm9jX2NvbW1pdChzdHJ1Y3Qgc3ZjX3Jxc3QgKiBycXN0cCwgc3RydWN0IG5mc2QzX2NvbW1pdGFyZ3MgKmFyZ3AsCisJCQkJCSAgIHN0cnVjdCBuZnNkM19jb21taXRyZXMgICpyZXNwKQoreworCWludAluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBDT01NSVQoMykgICAlcyAldUAlTHVcbiIsCisJCQkJU1ZDRkhfZm10KCZhcmdwLT5maCksCisJCQkJYXJncC0+Y291bnQsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgYXJncC0+b2Zmc2V0KTsKKworCWlmIChhcmdwLT5vZmZzZXQgPiBORlNfT0ZGU0VUX01BWCkKKwkJUkVUVVJOX1NUQVRVUyhuZnNlcnJfaW52YWwpOworCisJZmhfY29weSgmcmVzcC0+ZmgsICZhcmdwLT5maCk7CisJbmZzZXJyID0gbmZzZF9jb21taXQocnFzdHAsICZyZXNwLT5maCwgYXJncC0+b2Zmc2V0LCBhcmdwLT5jb3VudCk7CisKKwlSRVRVUk5fU1RBVFVTKG5mc2Vycik7Cit9CisKKworLyoKKyAqIE5GU3YzIFNlcnZlciBwcm9jZWR1cmVzLgorICogT25seSB0aGUgcmVzdWx0cyBvZiBub24taWRlbXBvdGVudCBvcGVyYXRpb25zIGFyZSBjYWNoZWQuCisgKi8KKyNkZWZpbmUgbmZzM3N2Y19kZWNvZGVfdm9pZGFyZ3MJCU5VTEwKKyNkZWZpbmUgbmZzM3N2Y19yZWxlYXNlX3ZvaWQJCU5VTEwKKyNkZWZpbmUgbmZzM3N2Y19kZWNvZGVfZmhhbmRsZWFyZ3MJbmZzM3N2Y19kZWNvZGVfZmhhbmRsZQorI2RlZmluZSBuZnMzc3ZjX2VuY29kZV9hdHRyc3RhdHJlcwluZnMzc3ZjX2VuY29kZV9hdHRyc3RhdAorI2RlZmluZSBuZnMzc3ZjX2VuY29kZV93Y2NzdGF0cmVzCW5mczNzdmNfZW5jb2RlX3djY3N0YXQKKyNkZWZpbmUgbmZzZDNfbWtkaXJhcmdzCQkJbmZzZDNfY3JlYXRlYXJncworI2RlZmluZSBuZnNkM19yZWFkZGlycGx1c2FyZ3MJCW5mc2QzX3JlYWRkaXJhcmdzCisjZGVmaW5lIG5mc2QzX2ZoYW5kbGVhcmdzCQluZnNkX2ZoYW5kbGUKKyNkZWZpbmUgbmZzZDNfZmhhbmRsZXJlcwkJbmZzZDNfYXR0cnN0YXQKKyNkZWZpbmUgbmZzZDNfYXR0cnN0YXRyZXMJCW5mc2QzX2F0dHJzdGF0CisjZGVmaW5lIG5mc2QzX3djY3N0YXRyZXMJCW5mc2QzX2F0dHJzdGF0CisjZGVmaW5lIG5mc2QzX2NyZWF0ZXJlcwkJCW5mc2QzX2Rpcm9wcmVzCisjZGVmaW5lIG5mc2QzX3ZvaWRyZXMJCQluZnNkM192b2lkYXJncworc3RydWN0IG5mc2QzX3ZvaWRhcmdzIHsgaW50IGR1bW15OyB9OworCisjZGVmaW5lIFBST0MobmFtZSwgYXJndCwgcmVzdCwgcmVsdCwgY2FjaGUsIHJlc3BzaXplKQlcCisgeyAoc3ZjX3Byb2NmdW5jKSBuZnNkM19wcm9jXyMjbmFtZSwJCVwKKyAgIChreGRycHJvY190KSBuZnMzc3ZjX2RlY29kZV8jI2FyZ3QjI2FyZ3MsCVwKKyAgIChreGRycHJvY190KSBuZnMzc3ZjX2VuY29kZV8jI3Jlc3QjI3JlcywJXAorICAgKGt4ZHJwcm9jX3QpIG5mczNzdmNfcmVsZWFzZV8jI3JlbHQsCQlcCisgICBzaXplb2Yoc3RydWN0IG5mc2QzXyMjYXJndCMjYXJncyksCQlcCisgICBzaXplb2Yoc3RydWN0IG5mc2QzXyMjcmVzdCMjcmVzKSwJCVwKKyAgIDAsCQkJCQkJXAorICAgY2FjaGUsCQkJCQlcCisgICByZXNwc2l6ZSwJCQkJCVwKKyB9CisKKyNkZWZpbmUgU1QgMQkJLyogc3RhdHVzKi8KKyNkZWZpbmUgRkggMTcJCS8qIGZpbGVoYW5kbGUgd2l0aCBsZW5ndGggKi8KKyNkZWZpbmUgQVQgMjEJCS8qIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgcEFUICgxK0FUKQkvKiBwb3N0IGF0dHJpYnV0ZXMgLSBjb25kaXRpb25hbCAqLworI2RlZmluZSBXQyAoNytwQVQpCS8qIFdDQyBhdHRyaWJ1dGVzICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3ZjX3Byb2NlZHVyZQkJbmZzZF9wcm9jZWR1cmVzM1syMl0gPSB7CisgIFBST0MobnVsbCwJIHZvaWQsCQl2b2lkLAkJdm9pZCwJICBSQ19OT0NBQ0hFLCBTVCksCisgIFBST0MoZ2V0YXR0ciwJIGZoYW5kbGUsCWF0dHJzdGF0LAlmaGFuZGxlLCAgUkNfTk9DQUNIRSwgU1QrQVQpLAorICBQUk9DKHNldGF0dHIsICBzYXR0ciwJCXdjY3N0YXQsCWZoYW5kbGUsICBSQ19SRVBMQlVGRiwgU1QrV0MpLAorICBQUk9DKGxvb2t1cCwJIGRpcm9wLAkJZGlyb3AsCQlmaGFuZGxlMiwgUkNfTk9DQUNIRSwgU1QrRkgrcEFUK3BBVCksCisgIFBST0MoYWNjZXNzLAkgYWNjZXNzLAlhY2Nlc3MsCQlmaGFuZGxlLCAgUkNfTk9DQUNIRSwgU1QrcEFUKzEpLAorICBQUk9DKHJlYWRsaW5rLCByZWFkbGluaywJcmVhZGxpbmssCWZoYW5kbGUsICBSQ19OT0NBQ0hFLCBTVCtwQVQrMStORlMzX01BWFBBVEhMRU4vNCksCisgIFBST0MocmVhZCwJIHJlYWQsCQlyZWFkLAkJZmhhbmRsZSwgIFJDX05PQ0FDSEUsIFNUK3BBVCs0K05GU1NWQ19NQVhCTEtTSVpFKSwKKyAgUFJPQyh3cml0ZSwJIHdyaXRlLAkJd3JpdGUsCQlmaGFuZGxlLCAgUkNfUkVQTEJVRkYsIFNUK1dDKzQpLAorICBQUk9DKGNyZWF0ZSwJIGNyZWF0ZSwJY3JlYXRlLAkJZmhhbmRsZTIsIFJDX1JFUExCVUZGLCBTVCsoMStGSCtwQVQpK1dDKSwKKyAgUFJPQyhta2RpciwJIG1rZGlyLAkJY3JlYXRlLAkJZmhhbmRsZTIsIFJDX1JFUExCVUZGLCBTVCsoMStGSCtwQVQpK1dDKSwKKyAgUFJPQyhzeW1saW5rLAkgc3ltbGluaywJY3JlYXRlLAkJZmhhbmRsZTIsIFJDX1JFUExCVUZGLCBTVCsoMStGSCtwQVQpK1dDKSwKKyAgUFJPQyhta25vZCwJIG1rbm9kLAkJY3JlYXRlLAkJZmhhbmRsZTIsIFJDX1JFUExCVUZGLCBTVCsoMStGSCtwQVQpK1dDKSwKKyAgUFJPQyhyZW1vdmUsCSBkaXJvcCwJCXdjY3N0YXQsCWZoYW5kbGUsICBSQ19SRVBMQlVGRiwgU1QrV0MpLAorICBQUk9DKHJtZGlyLAkgZGlyb3AsCQl3Y2NzdGF0LAlmaGFuZGxlLCAgUkNfUkVQTEJVRkYsIFNUK1dDKSwKKyAgUFJPQyhyZW5hbWUsCSByZW5hbWUsCXJlbmFtZSwJCWZoYW5kbGUyLCBSQ19SRVBMQlVGRiwgU1QrV0MrV0MpLAorICBQUk9DKGxpbmssCSBsaW5rLAkJbGluaywJCWZoYW5kbGUyLCBSQ19SRVBMQlVGRiwgU1QrcEFUK1dDKSwKKyAgUFJPQyhyZWFkZGlyLAkgcmVhZGRpciwJcmVhZGRpciwJZmhhbmRsZSwgIFJDX05PQ0FDSEUsIDApLAorICBQUk9DKHJlYWRkaXJwbHVzLHJlYWRkaXJwbHVzLAlyZWFkZGlyLAlmaGFuZGxlLCAgUkNfTk9DQUNIRSwgMCksCisgIFBST0MoZnNzdGF0LAkgZmhhbmRsZSwJZnNzdGF0LAkJdm9pZCwgICAgIFJDX05PQ0FDSEUsIFNUK3BBVCsyKjYrMSksCisgIFBST0MoZnNpbmZvLCAgIGZoYW5kbGUsCWZzaW5mbywJCXZvaWQsICAgICBSQ19OT0NBQ0hFLCBTVCtwQVQrMTIpLAorICBQUk9DKHBhdGhjb25mLCBmaGFuZGxlLAlwYXRoY29uZiwJdm9pZCwgICAgIFJDX05PQ0FDSEUsIFNUK3BBVCs2KSwKKyAgUFJPQyhjb21taXQsCSBjb21taXQsCWNvbW1pdCwJCWZoYW5kbGUsICBSQ19OT0NBQ0hFLCBTVCtXQysyKSwKK307CisKK3N0cnVjdCBzdmNfdmVyc2lvbgluZnNkX3ZlcnNpb24zID0geworCQkudnNfdmVycwk9IDMsCisJCS52c19ucHJvYwk9IDIyLAorCQkudnNfcHJvYwk9IG5mc2RfcHJvY2VkdXJlczMsCisJCS52c19kaXNwYXRjaAk9IG5mc2RfZGlzcGF0Y2gsCisJCS52c194ZHJzaXplCT0gTkZTM19TVkNfWERSU0laRSwKK307CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczN4ZHIuYyBiL2ZzL25mc2QvbmZzM3hkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZjgwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnNkL25mczN4ZHIuYwpAQCAtMCwwICsxLDEwOTIgQEAKKy8qCisgKiBsaW51eC9mcy9uZnNkL25mczN4ZHIuYworICoKKyAqIFhEUiBzdXBwb3J0IGZvciBuZnNkL3Byb3RvY29sIHZlcnNpb24gMy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKgorICogMjAwMy0wOC0wOSBKYW1pZSBMb2tpZXI6IFVzZSBodG9ubCgpIGZvciBuYW5vc2Vjb25kcywgbm90IGh0b25zKCkhCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L25mczMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3hkci5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL3hkcjMuaD4KKworI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZCQlORlNEREJHX1hEUgorCisjaWZkZWYgTkZTRF9PUFRJTUlaRV9TUEFDRQorIyBkZWZpbmUgaW5saW5lCisjZW5kaWYKKworCisvKgorICogTWFwcGluZyBvZiBTX0lGKiB0eXBlcyB0byBORlMgZmlsZSB0eXBlcworICovCitzdGF0aWMgdTMyCW5mczNfZnR5cGVzW10gPSB7CisJTkYzTk9OLCAgTkYzRklGTywgTkYzQ0hSLCBORjNCQUQsCisJTkYzRElSLCAgTkYzQkFELCAgTkYzQkxLLCBORjNCQUQsCisJTkYzUkVHLCAgTkYzQkFELCAgTkYzTE5LLCBORjNCQUQsCisJTkYzU09DSywgTkYzQkFELCAgTkYzTE5LLCBORjNCQUQsCit9OworCisvKgorICogWERSIGZ1bmN0aW9ucyBmb3IgYmFzaWMgTkZTIHR5cGVzCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyICoKK2VuY29kZV90aW1lMyh1MzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZSkKK3sKKwkqcCsrID0gaHRvbmwoKHUzMikgdGltZS0+dHZfc2VjKTsgKnArKyA9IGh0b25sKHRpbWUtPnR2X25zZWMpOworCXJldHVybiBwOworfQorCitzdGF0aWMgaW5saW5lIHUzMiAqCitkZWNvZGVfdGltZTModTMyICpwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpCit7CisJdGltZS0+dHZfc2VjID0gbnRvaGwoKnArKyk7CisJdGltZS0+dHZfbnNlYyA9IG50b2hsKCpwKyspOworCXJldHVybiBwOworfQorCitzdGF0aWMgaW5saW5lIHUzMiAqCitkZWNvZGVfZmgodTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCit7CisJdW5zaWduZWQgaW50IHNpemU7CisJZmhfaW5pdChmaHAsIE5GUzNfRkhTSVpFKTsKKwlzaXplID0gbnRvaGwoKnArKyk7CisJaWYgKHNpemUgPiBORlMzX0ZIU0laRSkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1jcHkoJmZocC0+ZmhfaGFuZGxlLmZoX2Jhc2UsIHAsIHNpemUpOworCWZocC0+ZmhfaGFuZGxlLmZoX3NpemUgPSBzaXplOworCXJldHVybiBwICsgWERSX1FVQURMRU4oc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK2VuY29kZV9maCh1MzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IGZocC0+ZmhfaGFuZGxlLmZoX3NpemU7CisJKnArKyA9IGh0b25sKHNpemUpOworCWlmIChzaXplKSBwW1hEUl9RVUFETEVOKHNpemUpLTFdPTA7CisJbWVtY3B5KHAsICZmaHAtPmZoX2hhbmRsZS5maF9iYXNlLCBzaXplKTsKKwlyZXR1cm4gcCArIFhEUl9RVUFETEVOKHNpemUpOworfQorCisvKgorICogRGVjb2RlIGEgZmlsZSBuYW1lIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGUgcGF0aCBjb250YWlucworICogbm8gc2xhc2hlcyBvciBudWxsIGJ5dGVzLgorICovCitzdGF0aWMgaW5saW5lIHUzMiAqCitkZWNvZGVfZmlsZW5hbWUodTMyICpwLCBjaGFyICoqbmFtcCwgaW50ICpsZW5wKQoreworCWNoYXIJCSpuYW1lOworCWludAkJaTsKKworCWlmICgocCA9IHhkcl9kZWNvZGVfc3RyaW5nX2lucGxhY2UocCwgbmFtcCwgbGVucCwgTkZTM19NQVhOQU1MRU4pKSAhPSBOVUxMKSB7CisJCWZvciAoaSA9IDAsIG5hbWUgPSAqbmFtcDsgaSA8ICpsZW5wOyBpKyssIG5hbWUrKykgeworCQkJaWYgKCpuYW1lID09ICdcMCcgfHwgKm5hbWUgPT0gJy8nKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK2RlY29kZV9zYXR0cjModTMyICpwLCBzdHJ1Y3QgaWF0dHIgKmlhcCkKK3sKKwl1MzIJdG1wOworCisJaWFwLT5pYV92YWxpZCA9IDA7CisKKwlpZiAoKnArKykgeworCQlpYXAtPmlhX3ZhbGlkIHw9IEFUVFJfTU9ERTsKKwkJaWFwLT5pYV9tb2RlID0gbnRvaGwoKnArKyk7CisJfQorCWlmICgqcCsrKSB7CisJCWlhcC0+aWFfdmFsaWQgfD0gQVRUUl9VSUQ7CisJCWlhcC0+aWFfdWlkID0gbnRvaGwoKnArKyk7CisJfQorCWlmICgqcCsrKSB7CisJCWlhcC0+aWFfdmFsaWQgfD0gQVRUUl9HSUQ7CisJCWlhcC0+aWFfZ2lkID0gbnRvaGwoKnArKyk7CisJfQorCWlmICgqcCsrKSB7CisJCXU2NAluZXdzaXplOworCisJCWlhcC0+aWFfdmFsaWQgfD0gQVRUUl9TSVpFOworCQlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmbmV3c2l6ZSk7CisJCWlmIChuZXdzaXplIDw9IE5GU19PRkZTRVRfTUFYKQorCQkJaWFwLT5pYV9zaXplID0gbmV3c2l6ZTsKKwkJZWxzZQorCQkJaWFwLT5pYV9zaXplID0gTkZTX09GRlNFVF9NQVg7CisJfQorCWlmICgodG1wID0gbnRvaGwoKnArKykpID09IDEpIHsJLyogc2V0IHRvIHNlcnZlciB0aW1lICovCisJCWlhcC0+aWFfdmFsaWQgfD0gQVRUUl9BVElNRTsKKwl9IGVsc2UgaWYgKHRtcCA9PSAyKSB7CQkvKiBzZXQgdG8gY2xpZW50IHRpbWUgKi8KKwkJaWFwLT5pYV92YWxpZCB8PSBBVFRSX0FUSU1FIHwgQVRUUl9BVElNRV9TRVQ7CisJCWlhcC0+aWFfYXRpbWUudHZfc2VjID0gbnRvaGwoKnArKyk7CisJCWlhcC0+aWFfYXRpbWUudHZfbnNlYyA9IG50b2hsKCpwKyspOworCX0KKwlpZiAoKHRtcCA9IG50b2hsKCpwKyspKSA9PSAxKSB7CS8qIHNldCB0byBzZXJ2ZXIgdGltZSAqLworCQlpYXAtPmlhX3ZhbGlkIHw9IEFUVFJfTVRJTUU7CisJfSBlbHNlIGlmICh0bXAgPT0gMikgewkJLyogc2V0IHRvIGNsaWVudCB0aW1lICovCisJCWlhcC0+aWFfdmFsaWQgfD0gQVRUUl9NVElNRSB8IEFUVFJfTVRJTUVfU0VUOworCQlpYXAtPmlhX210aW1lLnR2X3NlYyA9IG50b2hsKCpwKyspOworCQlpYXAtPmlhX210aW1lLnR2X25zZWMgPSBudG9obCgqcCsrKTsKKwl9CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK2VuY29kZV9mYXR0cjMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCit7CisJc3RydWN0IHZmc21vdW50ICptbnQgPSBmaHAtPmZoX2V4cG9ydC0+ZXhfbW50OworCXN0cnVjdCBkZW50cnkJKmRlbnRyeSA9IGZocC0+ZmhfZGVudHJ5OworCXN0cnVjdCBrc3RhdCBzdGF0OworCXN0cnVjdCB0aW1lc3BlYyB0aW1lOworCisJdmZzX2dldGF0dHIobW50LCBkZW50cnksICZzdGF0KTsKKworCSpwKysgPSBodG9ubChuZnMzX2Z0eXBlc1soc3RhdC5tb2RlICYgU19JRk1UKSA+PiAxMl0pOworCSpwKysgPSBodG9ubCgodTMyKSBzdGF0Lm1vZGUpOworCSpwKysgPSBodG9ubCgodTMyKSBzdGF0Lm5saW5rKTsKKwkqcCsrID0gaHRvbmwoKHUzMikgbmZzZF9ydWlkKHJxc3RwLCBzdGF0LnVpZCkpOworCSpwKysgPSBodG9ubCgodTMyKSBuZnNkX3JnaWQocnFzdHAsIHN0YXQuZ2lkKSk7CisJaWYgKFNfSVNMTksoc3RhdC5tb2RlKSAmJiBzdGF0LnNpemUgPiBORlMzX01BWFBBVEhMRU4pIHsKKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgKHU2NCkgTkZTM19NQVhQQVRITEVOKTsKKwl9IGVsc2UgeworCQlwID0geGRyX2VuY29kZV9oeXBlcihwLCAodTY0KSBzdGF0LnNpemUpOworCX0KKwlwID0geGRyX2VuY29kZV9oeXBlcihwLCAoKHU2NClzdGF0LmJsb2NrcykgPDwgOSk7CisJKnArKyA9IGh0b25sKCh1MzIpIE1BSk9SKHN0YXQucmRldikpOworCSpwKysgPSBodG9ubCgodTMyKSBNSU5PUihzdGF0LnJkZXYpKTsKKwlpZiAoaXNfZnNpZChmaHAsIHJxc3RwLT5ycV9yZWZmaCkpCisJCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsICh1NjQpIGZocC0+ZmhfZXhwb3J0LT5leF9mc2lkKTsKKwllbHNlCisJCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsICh1NjQpIGh1Z2VfZW5jb2RlX2RldihzdGF0LmRldikpOworCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsICh1NjQpIHN0YXQuaW5vKTsKKwlwID0gZW5jb2RlX3RpbWUzKHAsICZzdGF0LmF0aW1lKTsKKwlsZWFzZV9nZXRfbXRpbWUoZGVudHJ5LT5kX2lub2RlLCAmdGltZSk7IAorCXAgPSBlbmNvZGVfdGltZTMocCwgJnRpbWUpOworCXAgPSBlbmNvZGVfdGltZTMocCwgJnN0YXQuY3RpbWUpOworCisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK2VuY29kZV9zYXZlZF9wb3N0X2F0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCit7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IGZocC0+ZmhfZGVudHJ5LT5kX2lub2RlOworCisJLyogQXR0cmlidXRlcyB0byBmb2xsb3cgKi8KKwkqcCsrID0geGRyX29uZTsKKworCSpwKysgPSBodG9ubChuZnMzX2Z0eXBlc1soZmhwLT5maF9wb3N0X21vZGUgJiBTX0lGTVQpID4+IDEyXSk7CisJKnArKyA9IGh0b25sKCh1MzIpIGZocC0+ZmhfcG9zdF9tb2RlKTsKKwkqcCsrID0gaHRvbmwoKHUzMikgZmhwLT5maF9wb3N0X25saW5rKTsKKwkqcCsrID0gaHRvbmwoKHUzMikgbmZzZF9ydWlkKHJxc3RwLCBmaHAtPmZoX3Bvc3RfdWlkKSk7CisJKnArKyA9IGh0b25sKCh1MzIpIG5mc2RfcmdpZChycXN0cCwgZmhwLT5maF9wb3N0X2dpZCkpOworCWlmIChTX0lTTE5LKGZocC0+ZmhfcG9zdF9tb2RlKSAmJiBmaHAtPmZoX3Bvc3Rfc2l6ZSA+IE5GUzNfTUFYUEFUSExFTikgeworCQlwID0geGRyX2VuY29kZV9oeXBlcihwLCAodTY0KSBORlMzX01BWFBBVEhMRU4pOworCX0gZWxzZSB7CisJCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsICh1NjQpIGZocC0+ZmhfcG9zdF9zaXplKTsKKwl9CisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgKCh1NjQpZmhwLT5maF9wb3N0X2Jsb2NrcykgPDwgOSk7CisJKnArKyA9IGZocC0+ZmhfcG9zdF9yZGV2WzBdOworCSpwKysgPSBmaHAtPmZoX3Bvc3RfcmRldlsxXTsKKwlpZiAoaXNfZnNpZChmaHAsIHJxc3RwLT5ycV9yZWZmaCkpCisJCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsICh1NjQpIGZocC0+ZmhfZXhwb3J0LT5leF9mc2lkKTsKKwllbHNlCisJCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsICh1NjQpaHVnZV9lbmNvZGVfZGV2KGlub2RlLT5pX3NiLT5zX2RldikpOworCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsICh1NjQpIGlub2RlLT5pX2lubyk7CisJcCA9IGVuY29kZV90aW1lMyhwLCAmZmhwLT5maF9wb3N0X2F0aW1lKTsKKwlwID0gZW5jb2RlX3RpbWUzKHAsICZmaHAtPmZoX3Bvc3RfbXRpbWUpOworCXAgPSBlbmNvZGVfdGltZTMocCwgJmZocC0+ZmhfcG9zdF9jdGltZSk7CisKKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIEVuY29kZSBwb3N0LW9wZXJhdGlvbiBhdHRyaWJ1dGVzLgorICogVGhlIGlub2RlIG1heSBiZSBOVUxMIGlmIHRoZSBjYWxsIGZhaWxlZCBiZWNhdXNlIG9mIGEgc3RhbGUgZmlsZQorICogaGFuZGxlLiBJbiB0aGlzIGNhc2UsIG5vIGF0dHJpYnV0ZXMgYXJlIHJldHVybmVkLgorICovCitzdGF0aWMgdTMyICoKK2VuY29kZV9wb3N0X29wX2F0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmhwLT5maF9kZW50cnk7CisJaWYgKGRlbnRyeSAmJiBkZW50cnktPmRfaW5vZGUgIT0gTlVMTCkgeworCQkqcCsrID0geGRyX29uZTsJCS8qIGF0dHJpYnV0ZXMgZm9sbG93ICovCisJCXJldHVybiBlbmNvZGVfZmF0dHIzKHJxc3RwLCBwLCBmaHApOworCX0KKwkqcCsrID0geGRyX3plcm87CisJcmV0dXJuIHA7Cit9CisKKy8qCisgKiBFbm9jZGUgd2VhayBjYWNoZSBjb25zaXN0ZW5jeSBkYXRhCisgKi8KK3N0YXRpYyB1MzIgKgorZW5jb2RlX3djY19kYXRhKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKQoreworCXN0cnVjdCBkZW50cnkJKmRlbnRyeSA9IGZocC0+ZmhfZGVudHJ5OworCisJaWYgKGRlbnRyeSAmJiBkZW50cnktPmRfaW5vZGUgJiYgZmhwLT5maF9wb3N0X3NhdmVkKSB7CisJCWlmIChmaHAtPmZoX3ByZV9zYXZlZCkgeworCQkJKnArKyA9IHhkcl9vbmU7CisJCQlwID0geGRyX2VuY29kZV9oeXBlcihwLCAodTY0KSBmaHAtPmZoX3ByZV9zaXplKTsKKwkJCXAgPSBlbmNvZGVfdGltZTMocCwgJmZocC0+ZmhfcHJlX210aW1lKTsKKwkJCXAgPSBlbmNvZGVfdGltZTMocCwgJmZocC0+ZmhfcHJlX2N0aW1lKTsKKwkJfSBlbHNlIHsKKwkJCSpwKysgPSB4ZHJfemVybzsKKwkJfQorCQlyZXR1cm4gZW5jb2RlX3NhdmVkX3Bvc3RfYXR0cihycXN0cCwgcCwgZmhwKTsKKwl9CisJLyogbm8gcHJlLSBvciBwb3N0LWF0dHJzICovCisJKnArKyA9IHhkcl96ZXJvOworCXJldHVybiBlbmNvZGVfcG9zdF9vcF9hdHRyKHJxc3RwLCBwLCBmaHApOworfQorCisKKy8qCisgKiBYRFIgZGVjb2RlIGZ1bmN0aW9ucworICovCitpbnQKK25mczNzdmNfZGVjb2RlX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmZzZF9maGFuZGxlICphcmdzKQoreworCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkpCisJCXJldHVybiAwOworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzM3N2Y19kZWNvZGVfc2F0dHJhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2QzX3NhdHRyYXJncyAqYXJncykKK3sKKwlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpCisJIHx8ICEocCA9IGRlY29kZV9zYXR0cjMocCwgJmFyZ3MtPmF0dHJzKSkpCisJCXJldHVybiAwOworCisJaWYgKChhcmdzLT5jaGVja19ndWFyZCA9IG50b2hsKCpwKyspKSAhPSAwKSB7IAorCQlzdHJ1Y3QgdGltZXNwZWMgdGltZTsgCisJCXAgPSBkZWNvZGVfdGltZTMocCwgJnRpbWUpOworCQlhcmdzLT5ndWFyZHRpbWUgPSB0aW1lLnR2X3NlYzsKKwl9CisKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25mczNzdmNfZGVjb2RlX2Rpcm9wYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19kaXJvcGFyZ3MgKmFyZ3MpCit7CisJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKQorCSB8fCAhKHAgPSBkZWNvZGVfZmlsZW5hbWUocCwgJmFyZ3MtPm5hbWUsICZhcmdzLT5sZW4pKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25mczNzdmNfZGVjb2RlX2FjY2Vzc2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfYWNjZXNzYXJncyAqYXJncykKK3sKKwlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpKQorCQlyZXR1cm4gMDsKKwlhcmdzLT5hY2Nlc3MgPSBudG9obCgqcCsrKTsKKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzM3N2Y19kZWNvZGVfcmVhZGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfcmVhZGFyZ3MgKmFyZ3MpCit7CisJdW5zaWduZWQgaW50IGxlbjsKKwlpbnQgdixwbjsKKworCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkKKwkgfHwgIShwID0geGRyX2RlY29kZV9oeXBlcihwLCAmYXJncy0+b2Zmc2V0KSkpCisJCXJldHVybiAwOworCisJbGVuID0gYXJncy0+Y291bnQgPSBudG9obCgqcCsrKTsKKworCWlmIChsZW4gPiBORlNTVkNfTUFYQkxLU0laRSkKKwkJbGVuID0gTkZTU1ZDX01BWEJMS1NJWkU7CisKKwkvKiBzZXQgdXAgdGhlIGt2ZWMgKi8KKwl2PTA7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJcG4gPSBycXN0cC0+cnFfcmVzdXNlZDsKKwkJc3ZjX3Rha2VfcGFnZShycXN0cCk7CisJCWFyZ3MtPnZlY1t2XS5pb3ZfYmFzZSA9IHBhZ2VfYWRkcmVzcyhycXN0cC0+cnFfcmVzcGFnZXNbcG5dKTsKKwkJYXJncy0+dmVjW3ZdLmlvdl9sZW4gPSBsZW4gPCBQQUdFX1NJWkU/IGxlbiA6IFBBR0VfU0laRTsKKwkJbGVuIC09IGFyZ3MtPnZlY1t2XS5pb3ZfbGVuOworCQl2Kys7CisJfQorCWFyZ3MtPnZsZW4gPSB2OworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzM3N2Y19kZWNvZGVfd3JpdGVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2QzX3dyaXRlYXJncyAqYXJncykKK3sKKwl1bnNpZ25lZCBpbnQgbGVuLCB2LCBoZHI7CisKKwlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpCisJIHx8ICEocCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmFyZ3MtPm9mZnNldCkpKQorCQlyZXR1cm4gMDsKKworCWFyZ3MtPmNvdW50ID0gbnRvaGwoKnArKyk7CisJYXJncy0+c3RhYmxlID0gbnRvaGwoKnArKyk7CisJbGVuID0gYXJncy0+bGVuID0gbnRvaGwoKnArKyk7CisKKwloZHIgPSAodm9pZCopcCAtIHJxc3RwLT5ycV9hcmcuaGVhZFswXS5pb3ZfYmFzZTsKKwlpZiAocnFzdHAtPnJxX2FyZy5sZW4gPCBsZW4gKyBoZHIpCisJCXJldHVybiAwOworCisJYXJncy0+dmVjWzBdLmlvdl9iYXNlID0gKHZvaWQqKXA7CisJYXJncy0+dmVjWzBdLmlvdl9sZW4gPSBycXN0cC0+cnFfYXJnLmhlYWRbMF0uaW92X2xlbiAtIGhkcjsKKworCWlmIChsZW4gPiBORlNTVkNfTUFYQkxLU0laRSkKKwkJbGVuID0gTkZTU1ZDX01BWEJMS1NJWkU7CisJdj0gIDA7CisJd2hpbGUgKGxlbiA+IGFyZ3MtPnZlY1t2XS5pb3ZfbGVuKSB7CisJCWxlbiAtPSBhcmdzLT52ZWNbdl0uaW92X2xlbjsKKwkJdisrOworCQlhcmdzLT52ZWNbdl0uaW92X2Jhc2UgPSBwYWdlX2FkZHJlc3MocnFzdHAtPnJxX2FyZ3BhZ2VzW3ZdKTsKKwkJYXJncy0+dmVjW3ZdLmlvdl9sZW4gPSBQQUdFX1NJWkU7CisJfQorCWFyZ3MtPnZlY1t2XS5pb3ZfbGVuID0gbGVuOworCWFyZ3MtPnZsZW4gPSB2KzE7CisKKwlyZXR1cm4gYXJncy0+Y291bnQgPT0gYXJncy0+bGVuICYmIGFyZ3MtPnZlY1swXS5pb3ZfbGVuID4gMDsKK30KKworaW50CituZnMzc3ZjX2RlY29kZV9jcmVhdGVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2QzX2NyZWF0ZWFyZ3MgKmFyZ3MpCit7CisJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKQorCSB8fCAhKHAgPSBkZWNvZGVfZmlsZW5hbWUocCwgJmFyZ3MtPm5hbWUsICZhcmdzLT5sZW4pKSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGFyZ3MtPmNyZWF0ZW1vZGUgPSBudG9obCgqcCsrKSkgeworCWNhc2UgTkZTM19DUkVBVEVfVU5DSEVDS0VEOgorCWNhc2UgTkZTM19DUkVBVEVfR1VBUkRFRDoKKwkJaWYgKCEocCA9IGRlY29kZV9zYXR0cjMocCwgJmFyZ3MtPmF0dHJzKSkpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSBORlMzX0NSRUFURV9FWENMVVNJVkU6CisJCWFyZ3MtPnZlcmYgPSBwOworCQlwICs9IDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CitpbnQKK25mczNzdmNfZGVjb2RlX21rZGlyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19jcmVhdGVhcmdzICphcmdzKQoreworCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkKKwkgfHwgIShwID0gZGVjb2RlX2ZpbGVuYW1lKHAsICZhcmdzLT5uYW1lLCAmYXJncy0+bGVuKSkKKwkgfHwgIShwID0gZGVjb2RlX3NhdHRyMyhwLCAmYXJncy0+YXR0cnMpKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25mczNzdmNfZGVjb2RlX3N5bWxpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2QzX3N5bWxpbmthcmdzICphcmdzKQoreworCXVuc2lnbmVkIGludCBsZW47CisJaW50IGF2YWlsOworCWNoYXIgKm9sZCwgKm5ldzsKKwlzdHJ1Y3Qga3ZlYyAqdmVjOworCisJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmZoKSkKKwkgfHwgIShwID0gZGVjb2RlX2ZpbGVuYW1lKHAsICZhcmdzLT5mbmFtZSwgJmFyZ3MtPmZsZW4pKQorCSB8fCAhKHAgPSBkZWNvZGVfc2F0dHIzKHAsICZhcmdzLT5hdHRycykpCisJCSkKKwkJcmV0dXJuIDA7CisJLyogbm93IGRlY29kZSB0aGUgcGF0aG5hbWUsIHdoaWNoIG1pZ2h0IGJlIGxhcmdlciB0aGFuIHRoZSBmaXJzdCBwYWdlLgorCSAqIEFzIHdlIGhhdmUgdG8gY2hlY2sgZm9yIG51bCdzIGFueXdheSwgd2UgY29weSBpdCBpbnRvIGEgbmV3IHBhZ2UKKwkgKiBUaGlzIHBhZ2UgYXBwZWFycyBpbiB0aGUgcnFfcmVzLnBhZ2VzIGxpc3QsIGJ1dCBhcyBwYWdlc19sZW4gaXMgYWx3YXlzCisJICogMCwgaXQgd29uJ3QgZ2V0IGluIHRoZSB3YXkKKwkgKi8KKwlzdmNfdGFrZV9wYWdlKHJxc3RwKTsKKwlsZW4gPSBudG9obCgqcCsrKTsKKwlpZiAobGVuID09IDAgfHwgbGVuID4gTkZTM19NQVhQQVRITEVOIHx8IGxlbiA+PSBQQUdFX1NJWkUpCisJCXJldHVybiAwOworCWFyZ3MtPnRuYW1lID0gbmV3ID0gcGFnZV9hZGRyZXNzKHJxc3RwLT5ycV9yZXNwYWdlc1tycXN0cC0+cnFfcmVzdXNlZC0xXSk7CisJYXJncy0+dGxlbiA9IGxlbjsKKwkvKiBmaXJzdCBjb3B5IGFuZCBjaGVjayBmcm9tIHRoZSBmaXJzdCBwYWdlICovCisJb2xkID0gKGNoYXIqKXA7CisJdmVjID0gJnJxc3RwLT5ycV9hcmcuaGVhZFswXTsKKwlhdmFpbCA9IHZlYy0+aW92X2xlbiAtIChvbGQgLSAoY2hhciopdmVjLT5pb3ZfYmFzZSk7CisJd2hpbGUgKGxlbiAmJiBhdmFpbCAmJiAqb2xkKSB7CisJCSpuZXcrKyA9ICpvbGQrKzsKKwkJbGVuLS07CisJCWF2YWlsLS07CisJfQorCS8qIG5vdyBjb3B5IG5leHQgcGFnZSBpZiB0aGVyZSBpcyBvbmUgKi8KKwlpZiAobGVuICYmICFhdmFpbCAmJiBycXN0cC0+cnFfYXJnLnBhZ2VfbGVuKSB7CisJCWF2YWlsID0gcnFzdHAtPnJxX2FyZy5wYWdlX2xlbjsKKwkJaWYgKGF2YWlsID4gUEFHRV9TSVpFKSBhdmFpbCA9IFBBR0VfU0laRTsKKwkJb2xkID0gcGFnZV9hZGRyZXNzKHJxc3RwLT5ycV9hcmcucGFnZXNbMF0pOworCX0KKwl3aGlsZSAobGVuICYmIGF2YWlsICYmICpvbGQpIHsKKwkJKm5ldysrID0gKm9sZCsrOworCQlsZW4tLTsKKwkJYXZhaWwtLTsKKwl9CisJKm5ldyA9ICdcMCc7CisJaWYgKGxlbikKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworaW50CituZnMzc3ZjX2RlY29kZV9ta25vZGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfbWtub2RhcmdzICphcmdzKQoreworCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkKKwkgfHwgIShwID0gZGVjb2RlX2ZpbGVuYW1lKHAsICZhcmdzLT5uYW1lLCAmYXJncy0+bGVuKSkpCisJCXJldHVybiAwOworCisJYXJncy0+ZnR5cGUgPSBudG9obCgqcCsrKTsKKworCWlmIChhcmdzLT5mdHlwZSA9PSBORjNCTEsgIHx8IGFyZ3MtPmZ0eXBlID09IE5GM0NIUgorCSB8fCBhcmdzLT5mdHlwZSA9PSBORjNTT0NLIHx8IGFyZ3MtPmZ0eXBlID09IE5GM0ZJRk8pIHsKKwkJaWYgKCEocCA9IGRlY29kZV9zYXR0cjMocCwgJmFyZ3MtPmF0dHJzKSkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoYXJncy0+ZnR5cGUgPT0gTkYzQkxLIHx8IGFyZ3MtPmZ0eXBlID09IE5GM0NIUikgeworCQlhcmdzLT5tYWpvciA9IG50b2hsKCpwKyspOworCQlhcmdzLT5taW5vciA9IG50b2hsKCpwKyspOworCX0KKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzM3N2Y19kZWNvZGVfcmVuYW1lYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19yZW5hbWVhcmdzICphcmdzKQoreworCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZmaCkpCisJIHx8ICEocCA9IGRlY29kZV9maWxlbmFtZShwLCAmYXJncy0+Zm5hbWUsICZhcmdzLT5mbGVuKSkKKwkgfHwgIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT50ZmgpKQorCSB8fCAhKHAgPSBkZWNvZGVfZmlsZW5hbWUocCwgJmFyZ3MtPnRuYW1lLCAmYXJncy0+dGxlbikpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzM3N2Y19kZWNvZGVfcmVhZGxpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2QzX3JlYWRsaW5rYXJncyAqYXJncykKK3sKKwlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpKQorCQlyZXR1cm4gMDsKKwlzdmNfdGFrZV9wYWdlKHJxc3RwKTsKKwlhcmdzLT5idWZmZXIgPSBwYWdlX2FkZHJlc3MocnFzdHAtPnJxX3Jlc3BhZ2VzW3Jxc3RwLT5ycV9yZXN1c2VkLTFdKTsKKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzM3N2Y19kZWNvZGVfbGlua2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfbGlua2FyZ3MgKmFyZ3MpCit7CisJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmZoKSkKKwkgfHwgIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT50ZmgpKQorCSB8fCAhKHAgPSBkZWNvZGVfZmlsZW5hbWUocCwgJmFyZ3MtPnRuYW1lLCAmYXJncy0+dGxlbikpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzM3N2Y19kZWNvZGVfcmVhZGRpcmFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfcmVhZGRpcmFyZ3MgKmFyZ3MpCit7CisJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKSkKKwkJcmV0dXJuIDA7CisJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmFyZ3MtPmNvb2tpZSk7CisJYXJncy0+dmVyZiAgID0gcDsgcCArPSAyOworCWFyZ3MtPmRpcmNvdW50ID0gfjA7CisJYXJncy0+Y291bnQgID0gbnRvaGwoKnArKyk7CisKKwlpZiAoYXJncy0+Y291bnQgPiBQQUdFX1NJWkUpCisJCWFyZ3MtPmNvdW50ID0gUEFHRV9TSVpFOworCisJc3ZjX3Rha2VfcGFnZShycXN0cCk7CisJYXJncy0+YnVmZmVyID0gcGFnZV9hZGRyZXNzKHJxc3RwLT5ycV9yZXNwYWdlc1tycXN0cC0+cnFfcmVzdXNlZC0xXSk7CisKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25mczNzdmNfZGVjb2RlX3JlYWRkaXJwbHVzYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19yZWFkZGlyYXJncyAqYXJncykKK3sKKwlpbnQgbGVuLCBwbjsKKworCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkpCisJCXJldHVybiAwOworCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZhcmdzLT5jb29raWUpOworCWFyZ3MtPnZlcmYgICAgID0gcDsgcCArPSAyOworCWFyZ3MtPmRpcmNvdW50ID0gbnRvaGwoKnArKyk7CisJYXJncy0+Y291bnQgICAgPSBudG9obCgqcCsrKTsKKworCWxlbiA9IChhcmdzLT5jb3VudCA+IE5GU1NWQ19NQVhCTEtTSVpFKSA/IE5GU1NWQ19NQVhCTEtTSVpFIDoKKwkJCQkJCSAgYXJncy0+Y291bnQ7CisJYXJncy0+Y291bnQgPSBsZW47CisKKwl3aGlsZSAobGVuID4gMCkgeworCQlwbiA9IHJxc3RwLT5ycV9yZXN1c2VkOworCQlzdmNfdGFrZV9wYWdlKHJxc3RwKTsKKwkJaWYgKCFhcmdzLT5idWZmZXIpCisJCQlhcmdzLT5idWZmZXIgPSBwYWdlX2FkZHJlc3MocnFzdHAtPnJxX3Jlc3BhZ2VzW3BuXSk7CisJCWxlbiAtPSBQQUdFX1NJWkU7CisJfQorCisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CituZnMzc3ZjX2RlY29kZV9jb21taXRhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2QzX2NvbW1pdGFyZ3MgKmFyZ3MpCit7CisJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKSkKKwkJcmV0dXJuIDA7CisJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmFyZ3MtPm9mZnNldCk7CisJYXJncy0+Y291bnQgPSBudG9obCgqcCsrKTsKKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKKy8qCisgKiBYRFIgZW5jb2RlIGZ1bmN0aW9ucworICovCisvKgorICogVGhlcmUgbXVzdCBiZSBhbiBlbmNvZGluZyBmdW5jdGlvbiBmb3Igdm9pZCByZXN1bHRzIHNvIHN2Y19wcm9jZXNzCisgKiB3aWxsIHdvcmsgcHJvcGVybHkuCisgKi8KK2ludAorbmZzM3N2Y19lbmNvZGVfdm9pZHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHZvaWQgKmR1bW15KQoreworCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKKy8qIEdFVEFUVFIgKi8KK2ludAorbmZzM3N2Y19lbmNvZGVfYXR0cnN0YXQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfYXR0cnN0YXQgKnJlc3ApCit7CisJaWYgKHJlc3AtPnN0YXR1cyA9PSAwKQorCQlwID0gZW5jb2RlX2ZhdHRyMyhycXN0cCwgcCwgJnJlc3AtPmZoKTsKKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCisvKiBTRVRBVFRSLCBSRU1PVkUsIFJNRElSICovCitpbnQKK25mczNzdmNfZW5jb2RlX3djY3N0YXQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfYXR0cnN0YXQgKnJlc3ApCit7CisJcCA9IGVuY29kZV93Y2NfZGF0YShycXN0cCwgcCwgJnJlc3AtPmZoKTsKKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCisvKiBMT09LVVAgKi8KK2ludAorbmZzM3N2Y19lbmNvZGVfZGlyb3ByZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfZGlyb3ByZXMgKnJlc3ApCit7CisJaWYgKHJlc3AtPnN0YXR1cyA9PSAwKSB7CisJCXAgPSBlbmNvZGVfZmgocCwgJnJlc3AtPmZoKTsKKwkJcCA9IGVuY29kZV9wb3N0X29wX2F0dHIocnFzdHAsIHAsICZyZXNwLT5maCk7CisJfQorCXAgPSBlbmNvZGVfcG9zdF9vcF9hdHRyKHJxc3RwLCBwLCAmcmVzcC0+ZGlyZmgpOworCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKKy8qIEFDQ0VTUyAqLworaW50CituZnMzc3ZjX2VuY29kZV9hY2Nlc3NyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfYWNjZXNzcmVzICpyZXNwKQoreworCXAgPSBlbmNvZGVfcG9zdF9vcF9hdHRyKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOworCWlmIChyZXNwLT5zdGF0dXMgPT0gMCkKKwkJKnArKyA9IGh0b25sKHJlc3AtPmFjY2Vzcyk7CisJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworLyogUkVBRExJTksgKi8KK2ludAorbmZzM3N2Y19lbmNvZGVfcmVhZGxpbmtyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfcmVhZGxpbmtyZXMgKnJlc3ApCit7CisJcCA9IGVuY29kZV9wb3N0X29wX2F0dHIocnFzdHAsIHAsICZyZXNwLT5maCk7CisJaWYgKHJlc3AtPnN0YXR1cyA9PSAwKSB7CisJCSpwKysgPSBodG9ubChyZXNwLT5sZW4pOworCQl4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7CisJCXJxc3RwLT5ycV9yZXMucGFnZV9sZW4gPSByZXNwLT5sZW47CisJCWlmIChyZXNwLT5sZW4gJiAzKSB7CisJCQkvKiBuZWVkIHRvIHBhZCB0aGUgdGFpbCAqLworCQkJcnFzdHAtPnJxX3Jlc3RhaWxwYWdlID0gMDsKKwkJCXJxc3RwLT5ycV9yZXMudGFpbFswXS5pb3ZfYmFzZSA9IHA7CisJCQkqcCA9IDA7CisJCQlycXN0cC0+cnFfcmVzLnRhaWxbMF0uaW92X2xlbiA9IDQgLSAocmVzcC0+bGVuJjMpOworCQl9CisJCXJldHVybiAxOworCX0gZWxzZQorCQlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCisvKiBSRUFEICovCitpbnQKK25mczNzdmNfZW5jb2RlX3JlYWRyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfcmVhZHJlcyAqcmVzcCkKK3sKKwlwID0gZW5jb2RlX3Bvc3Rfb3BfYXR0cihycXN0cCwgcCwgJnJlc3AtPmZoKTsKKwlpZiAocmVzcC0+c3RhdHVzID09IDApIHsKKwkJKnArKyA9IGh0b25sKHJlc3AtPmNvdW50KTsKKwkJKnArKyA9IGh0b25sKHJlc3AtPmVvZik7CisJCSpwKysgPSBodG9ubChyZXNwLT5jb3VudCk7CS8qIHhkciBvcGFxdWUgY291bnQgKi8KKwkJeGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworCQkvKiBub3cgdXBkYXRlIHJxc3RwLT5ycV9yZXMgdG8gcmVmbGVjdCBkYXRhIGFzd2VsbCAqLworCQlycXN0cC0+cnFfcmVzLnBhZ2VfbGVuID0gcmVzcC0+Y291bnQ7CisJCWlmIChyZXNwLT5jb3VudCAmIDMpIHsKKwkJCS8qIG5lZWQgdG8gcGFkIHRoZSB0YWlsICovCisJCQlycXN0cC0+cnFfcmVzdGFpbHBhZ2UgPSAwOworCQkJcnFzdHAtPnJxX3Jlcy50YWlsWzBdLmlvdl9iYXNlID0gcDsKKwkJCSpwID0gMDsKKwkJCXJxc3RwLT5ycV9yZXMudGFpbFswXS5pb3ZfbGVuID0gNCAtIChyZXNwLT5jb3VudCAmIDMpOworCQl9CisJCXJldHVybiAxOworCX0gZWxzZQorCQlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCisvKiBXUklURSAqLworaW50CituZnMzc3ZjX2VuY29kZV93cml0ZXJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM193cml0ZXJlcyAqcmVzcCkKK3sKKwlwID0gZW5jb2RlX3djY19kYXRhKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOworCWlmIChyZXNwLT5zdGF0dXMgPT0gMCkgeworCQkqcCsrID0gaHRvbmwocmVzcC0+Y291bnQpOworCQkqcCsrID0gaHRvbmwocmVzcC0+Y29tbWl0dGVkKTsKKwkJKnArKyA9IGh0b25sKG5mc3N2Y19ib290LnR2X3NlYyk7CisJCSpwKysgPSBodG9ubChuZnNzdmNfYm9vdC50dl91c2VjKTsKKwl9CisJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworLyogQ1JFQVRFLCBNS0RJUiwgU1lNTElOSywgTUtOT0QgKi8KK2ludAorbmZzM3N2Y19lbmNvZGVfY3JlYXRlcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2QzX2Rpcm9wcmVzICpyZXNwKQoreworCWlmIChyZXNwLT5zdGF0dXMgPT0gMCkgeworCQkqcCsrID0geGRyX29uZTsKKwkJcCA9IGVuY29kZV9maChwLCAmcmVzcC0+ZmgpOworCQlwID0gZW5jb2RlX3Bvc3Rfb3BfYXR0cihycXN0cCwgcCwgJnJlc3AtPmZoKTsKKwl9CisJcCA9IGVuY29kZV93Y2NfZGF0YShycXN0cCwgcCwgJnJlc3AtPmRpcmZoKTsKKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCisvKiBSRU5BTUUgKi8KK2ludAorbmZzM3N2Y19lbmNvZGVfcmVuYW1lcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2QzX3JlbmFtZXJlcyAqcmVzcCkKK3sKKwlwID0gZW5jb2RlX3djY19kYXRhKHJxc3RwLCBwLCAmcmVzcC0+ZmZoKTsKKwlwID0gZW5jb2RlX3djY19kYXRhKHJxc3RwLCBwLCAmcmVzcC0+dGZoKTsKKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCisvKiBMSU5LICovCitpbnQKK25mczNzdmNfZW5jb2RlX2xpbmtyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfbGlua3JlcyAqcmVzcCkKK3sKKwlwID0gZW5jb2RlX3Bvc3Rfb3BfYXR0cihycXN0cCwgcCwgJnJlc3AtPmZoKTsKKwlwID0gZW5jb2RlX3djY19kYXRhKHJxc3RwLCBwLCAmcmVzcC0+dGZoKTsKKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCisvKiBSRUFERElSICovCitpbnQKK25mczNzdmNfZW5jb2RlX3JlYWRkaXJyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfcmVhZGRpcnJlcyAqcmVzcCkKK3sKKwlwID0gZW5jb2RlX3Bvc3Rfb3BfYXR0cihycXN0cCwgcCwgJnJlc3AtPmZoKTsKKworCWlmIChyZXNwLT5zdGF0dXMgPT0gMCkgeworCQkvKiBzdHVwaWQgcmVhZGRpciBjb29raWUgKi8KKwkJbWVtY3B5KHAsIHJlc3AtPnZlcmYsIDgpOyBwICs9IDI7CisJCXhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKKwkJaWYgKHJxc3RwLT5ycV9yZXMuaGVhZFswXS5pb3ZfbGVuICsgKDI8PDIpID4gUEFHRV9TSVpFKQorCQkJcmV0dXJuIDE7IC8qTm8gcm9vbSBmb3IgdHJhaWxlciAqLworCQlycXN0cC0+cnFfcmVzLnBhZ2VfbGVuID0gKHJlc3AtPmNvdW50KSA8PCAyOworCisJCS8qIGFkZCB0aGUgJ3RhaWwnIHRvIHRoZSBlbmQgb2YgdGhlICdoZWFkJyBwYWdlIC0gcGFnZSAwLiAqLworCQlycXN0cC0+cnFfcmVzdGFpbHBhZ2UgPSAwOworCQlycXN0cC0+cnFfcmVzLnRhaWxbMF0uaW92X2Jhc2UgPSBwOworCQkqcCsrID0gMDsJCS8qIG5vIG1vcmUgZW50cmllcyAqLworCQkqcCsrID0gaHRvbmwocmVzcC0+Y29tbW9uLmVyciA9PSBuZnNlcnJfZW9mKTsKKwkJcnFzdHAtPnJxX3Jlcy50YWlsWzBdLmlvdl9sZW4gPSAyPDwyOworCQlyZXR1cm4gMTsKKwl9IGVsc2UKKwkJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgKgorZW5jb2RlX2VudHJ5X2JhZ2dhZ2Uoc3RydWN0IG5mc2QzX3JlYWRkaXJyZXMgKmNkLCB1MzIgKnAsIGNvbnN0IGNoYXIgKm5hbWUsCisJICAgICBpbnQgbmFtbGVuLCBpbm9fdCBpbm8pCit7CisJKnArKyA9IHhkcl9vbmU7CQkJCSAvKiBtYXJrIGVudHJ5IHByZXNlbnQgKi8KKwlwICAgID0geGRyX2VuY29kZV9oeXBlcihwLCBpbm8pOwkgLyogZmlsZSBpZCAqLworCXAgICAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIG5hbWUsIG5hbWxlbik7LyogbmFtZSBsZW5ndGggJiBuYW1lICovCisKKwljZC0+b2Zmc2V0ID0gcDsJCQkJLyogcmVtZW1iZXIgcG9pbnRlciAqLworCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIE5GU19PRkZTRVRfTUFYKTsvKiBvZmZzZXQgb2YgbmV4dCBlbnRyeSAqLworCisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK2VuY29kZV9lbnRyeXBsdXNfYmFnZ2FnZShzdHJ1Y3QgbmZzZDNfcmVhZGRpcnJlcyAqY2QsIHUzMiAqcCwKKwkJc3RydWN0IHN2Y19maCAqZmhwKQoreworCQlwID0gZW5jb2RlX3Bvc3Rfb3BfYXR0cihjZC0+cnFzdHAsIHAsIGZocCk7CisJCSpwKysgPSB4ZHJfb25lOwkJCS8qIHllcywgYSBmaWxlIGhhbmRsZSBmb2xsb3dzICovCisJCXAgPSBlbmNvZGVfZmgocCwgZmhwKTsKKwkJZmhfcHV0KGZocCk7CisJCXJldHVybiBwOworfQorCitzdGF0aWMgaW50Citjb21wb3NlX2VudHJ5X2ZoKHN0cnVjdCBuZnNkM19yZWFkZGlycmVzICpjZCwgc3RydWN0IHN2Y19maCAqZmhwLAorCQljb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuKQoreworCXN0cnVjdCBzdmNfZXhwb3J0CSpleHA7CisJc3RydWN0IGRlbnRyeQkJKmRwYXJlbnQsICpkY2hpbGQ7CisJaW50IHJ2ID0gMDsKKworCWRwYXJlbnQgPSBjZC0+ZmguZmhfZGVudHJ5OworCWV4cCAgPSBjZC0+ZmguZmhfZXhwb3J0OworCisJZmhfaW5pdChmaHAsIE5GUzNfRkhTSVpFKTsKKwlpZiAoaXNkb3RlbnQobmFtZSwgbmFtbGVuKSkgeworCQlpZiAobmFtbGVuID09IDIpIHsKKwkJCWRjaGlsZCA9IGRnZXRfcGFyZW50KGRwYXJlbnQpOworCQkJaWYgKGRjaGlsZCA9PSBkcGFyZW50KSB7CisJCQkJLyogZmlsZXN5c3RlbSByb290IC0gY2Fubm90IHJldHVybiBmaWxlaGFuZGxlIGZvciAiLi4iICovCisJCQkJZHB1dChkY2hpbGQpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9IGVsc2UKKwkJCWRjaGlsZCA9IGRnZXQoZHBhcmVudCk7CisJfSBlbHNlCisJCWRjaGlsZCA9IGxvb2t1cF9vbmVfbGVuKG5hbWUsIGRwYXJlbnQsIG5hbWxlbik7CisJaWYgKElTX0VSUihkY2hpbGQpKQorCQlyZXR1cm4gMTsKKwlpZiAoZF9tb3VudHBvaW50KGRjaGlsZCkgfHwKKwkgICAgZmhfY29tcG9zZShmaHAsIGV4cCwgZGNoaWxkLCAmY2QtPmZoKSAhPSAwIHx8CisJICAgICFkY2hpbGQtPmRfaW5vZGUpCisJCXJ2ID0gMTsKKwlkcHV0KGRjaGlsZCk7CisJcmV0dXJuIHJ2OworfQorCisvKgorICogRW5jb2RlIGEgZGlyZWN0b3J5IGVudHJ5LiBUaGlzIG9uZSB3b3JrcyBmb3IgYm90aCBub3JtYWwgcmVhZGRpcgorICogYW5kIHJlYWRkaXJwbHVzLgorICogVGhlIG5vcm1hbCByZWFkZGlyIHJlcGx5IHJlcXVpcmVzIDIgKGZpbGVpZCkgKyAxIChzdHJpbmdsZW4pCisgKiArIHN0cmluZyArIDIgKGNvb2tpZSkgKyAxIChuZXh0KSB3b3JkcywgaS5lLiA2ICsgc3RybGVuLgorICogCisgKiBUaGUgcmVhZGRpcnBsdXMgYmFnZ2FnZSBpcyAxKzIxIHdvcmRzIGZvciBwb3N0X29wX2F0dHIsIHBsdXMgdGhlCisgKiBmaWxlIGhhbmRsZS4KKyAqLworCisjZGVmaW5lIE5GUzNfRU5UUllfQkFHR0FHRQkoMiArIDEgKyAyICsgMSkKKyNkZWZpbmUgTkZTM19FTlRSWVBMVVNfQkFHR0FHRQkoMSArIDIxICsgMSArIChORlMzX0ZIU0laRSA+PiAyKSkKK3N0YXRpYyBpbnQKK2VuY29kZV9lbnRyeShzdHJ1Y3QgcmVhZGRpcl9jZCAqY2NkLCBjb25zdCBjaGFyICpuYW1lLAorCSAgICAgaW50IG5hbWxlbiwgb2ZmX3Qgb2Zmc2V0LCBpbm9fdCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUsIGludCBwbHVzKQoreworCXN0cnVjdCBuZnNkM19yZWFkZGlycmVzICpjZCA9IGNvbnRhaW5lcl9vZihjY2QsIHN0cnVjdCBuZnNkM19yZWFkZGlycmVzLAorCQkgICAgICAgCQkJCQljb21tb24pOworCXUzMgkJKnAgPSBjZC0+YnVmZmVyOworCWNhZGRyX3QJCWN1cnJfcGFnZV9hZGRyID0gTlVMTDsKKwlpbnQJCXBuOwkJLyogY3VycmVudCBwYWdlIG51bWJlciAqLworCWludAkJc2xlbjsJCS8qIHN0cmluZyAobmFtZSkgbGVuZ3RoICovCisJaW50CQllbGVuOwkJLyogZXN0aW1hdGVkIGVudHJ5IGxlbmd0aCBpbiB3b3JkcyAqLworCWludAkJbnVtX2VudHJ5X3dvcmRzID0gMDsJLyogYWN0dWFsIG51bWJlciBvZiB3b3JkcyAqLworCisJaWYgKGNkLT5vZmZzZXQpIHsKKwkJdTY0IG9mZnNldDY0ID0gb2Zmc2V0OworCisJCWlmICh1bmxpa2VseShjZC0+b2Zmc2V0MSkpIHsKKwkJCS8qIHdlIGVuZGVkIHVwIHdpdGggb2Zmc2V0IG9uIGEgcGFnZSBib3VuZGFyeSAqLworCQkJKmNkLT5vZmZzZXQgPSBodG9ubChvZmZzZXQ2NCA+PiAzMik7CisJCQkqY2QtPm9mZnNldDEgPSBodG9ubChvZmZzZXQ2NCAmIDB4ZmZmZmZmZmYpOworCQkJY2QtPm9mZnNldDEgPSBOVUxMOworCQl9IGVsc2UgeworCQkJeGRyX2VuY29kZV9oeXBlcihjZC0+b2Zmc2V0LCAodTY0KSBvZmZzZXQpOworCQl9CisJfQorCisJLyoKKwlkcHJpbnRrKCJlbmNvZGVfZW50cnkoJS4qcyBAJWxkJXMpXG4iLAorCQluYW1sZW4sIG5hbWUsIChsb25nKSBvZmZzZXQsIHBsdXM/ICIgcGx1cyIgOiAiIik7CisJICovCisKKwkvKiB0cnVuY2F0ZSBmaWxlbmFtZSBpZiB0b28gbG9uZyAqLworCWlmIChuYW1sZW4gPiBORlMzX01BWE5BTUxFTikKKwkJbmFtbGVuID0gTkZTM19NQVhOQU1MRU47CisKKwlzbGVuID0gWERSX1FVQURMRU4obmFtbGVuKTsKKwllbGVuID0gc2xlbiArIE5GUzNfRU5UUllfQkFHR0FHRQorCQkrIChwbHVzPyBORlMzX0VOVFJZUExVU19CQUdHQUdFIDogMCk7CisKKwlpZiAoY2QtPmJ1ZmxlbiA8IGVsZW4pIHsKKwkJY2QtPmNvbW1vbi5lcnIgPSBuZnNlcnJfdG9vc21hbGw7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGRldGVybWluZSB3aGljaCBwYWdlIGluIHJxX3Jlc3BhZ2VzW10gd2UgYXJlIGN1cnJlbnRseSBmaWxsaW5nICovCisJZm9yIChwbj0xOyBwbiA8IGNkLT5ycXN0cC0+cnFfcmVzdXNlZDsgcG4rKykgeworCQljdXJyX3BhZ2VfYWRkciA9IHBhZ2VfYWRkcmVzcyhjZC0+cnFzdHAtPnJxX3Jlc3BhZ2VzW3BuXSk7CisKKwkJaWYgKCgoY2FkZHJfdCljZC0+YnVmZmVyID49IGN1cnJfcGFnZV9hZGRyKSAmJgorCQkgICAgKChjYWRkcl90KWNkLT5idWZmZXIgPCAgY3Vycl9wYWdlX2FkZHIgKyBQQUdFX1NJWkUpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKChjYWRkcl90KShjZC0+YnVmZmVyICsgZWxlbikgPCAoY3Vycl9wYWdlX2FkZHIgKyBQQUdFX1NJWkUpKSB7CisJCS8qIGVuY29kZSBlbnRyeSBpbiBjdXJyZW50IHBhZ2UgKi8KKworCQlwID0gZW5jb2RlX2VudHJ5X2JhZ2dhZ2UoY2QsIHAsIG5hbWUsIG5hbWxlbiwgaW5vKTsKKworCQkvKiB0aHJvdyBpbiByZWFkZGlycGx1cyBiYWdnYWdlICovCisJCWlmIChwbHVzKSB7CisJCQlzdHJ1Y3Qgc3ZjX2ZoCWZoOworCisJCQlpZiAoY29tcG9zZV9lbnRyeV9maChjZCwgJmZoLCBuYW1lLCBuYW1sZW4pID4gMCkgeworCQkJCSpwKysgPSAwOworCQkJCSpwKysgPSAwOworCQkJfSBlbHNlCisJCQkJcCA9IGVuY29kZV9lbnRyeXBsdXNfYmFnZ2FnZShjZCwgcCwgJmZoKTsKKwkJfQorCQludW1fZW50cnlfd29yZHMgPSBwIC0gY2QtPmJ1ZmZlcjsKKwl9IGVsc2UgaWYgKGNkLT5ycXN0cC0+cnFfcmVzcGFnZXNbcG4rMV0gIT0gTlVMTCkgeworCQkvKiB0ZW1wb3JhcmlseSBlbmNvZGUgZW50cnkgaW50byBuZXh0IHBhZ2UsIHRoZW4gbW92ZSBiYWNrIHRvCisJCSAqIGN1cnJlbnQgYW5kIG5leHQgcGFnZSBpbiBycV9yZXNwYWdlc1tdICovCisJCXUzMiAqcDEsICp0bXA7CisJCWludCBsZW4xLCBsZW4yOworCisJCS8qIGdyYWIgbmV4dCBwYWdlIGZvciB0ZW1wb3Jhcnkgc3RvcmFnZSBvZiBlbnRyeSAqLworCQlwMSA9IHRtcCA9IHBhZ2VfYWRkcmVzcyhjZC0+cnFzdHAtPnJxX3Jlc3BhZ2VzW3BuKzFdKTsKKworCQlwMSA9IGVuY29kZV9lbnRyeV9iYWdnYWdlKGNkLCBwMSwgbmFtZSwgbmFtbGVuLCBpbm8pOworCisJCS8qIHRocm93IGluIHJlYWRkaXJwbHVzIGJhZ2dhZ2UgKi8KKwkJaWYgKHBsdXMpIHsKKwkJCXN0cnVjdCBzdmNfZmgJZmg7CisKKwkJCWlmIChjb21wb3NlX2VudHJ5X2ZoKGNkLCAmZmgsIG5hbWUsIG5hbWxlbikgPiAwKSB7CisJCQkJLyogemVybyBvdXQgdGhlIGZpbGVoYW5kbGUgKi8KKwkJCQkqcDErKyA9IDA7CisJCQkJKnAxKysgPSAwOworCQkJfSBlbHNlCisJCQkJcDEgPSBlbmNvZGVfZW50cnlwbHVzX2JhZ2dhZ2UoY2QsIHAxLCAmZmgpOworCQl9CisKKwkJLyogZGV0ZXJtaW5lIGVudHJ5IHdvcmQgbGVuZ3RoIGFuZCBsZW5ndGhzIHRvIGdvIGluIHBhZ2VzICovCisJCW51bV9lbnRyeV93b3JkcyA9IHAxIC0gdG1wOworCQlsZW4xID0gY3Vycl9wYWdlX2FkZHIgKyBQQUdFX1NJWkUgLSAoY2FkZHJfdCljZC0+YnVmZmVyOworCQlpZiAoKG51bV9lbnRyeV93b3JkcyA8PCAyKSA8IGxlbjEpIHsKKwkJCS8qIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHdvcmRzIGluIHRoZSBlbnRyeSBpcyBsZXNzCisJCQkgKiB0aGFuIGVsZW4gYW5kIGNhbiBzdGlsbCBmaXQgaW4gdGhlIGN1cnJlbnQgcGFnZQorCQkJICovCisJCQltZW1tb3ZlKHAsIHRtcCwgbnVtX2VudHJ5X3dvcmRzIDw8IDIpOworCQkJcCArPSBudW1fZW50cnlfd29yZHM7CisKKwkJCS8qIHVwZGF0ZSBvZmZzZXQgKi8KKwkJCWNkLT5vZmZzZXQgPSBjZC0+YnVmZmVyICsgKGNkLT5vZmZzZXQgLSB0bXApOworCQl9IGVsc2UgeworCQkJdW5zaWduZWQgaW50IG9mZnNldF9yID0gKGNkLT5vZmZzZXQgLSB0bXApIDw8IDI7CisKKwkJCS8qIHVwZGF0ZSBwb2ludGVyIHRvIG9mZnNldCBsb2NhdGlvbi4KKwkJCSAqIFRoaXMgaXMgYSA2NGJpdCBxdWFudGl0eSwgc28gd2UgbmVlZCB0bworCQkJICogZGVhbCB3aXRoIDMgY2FzZXM6CisJCQkgKiAgLQllbnRpcmVseSBpbiBmaXJzdCBwYWdlCisJCQkgKiAgLQllbnRpcmVseSBpbiBzZWNvbmQgcGFnZQorCQkJICogIC0JNCBieXRlcyBpbiBlYWNoIHBhZ2UKKwkJCSAqLworCQkJaWYgKG9mZnNldF9yICsgOCA8PSBsZW4xKSB7CisJCQkJY2QtPm9mZnNldCA9IHAgKyAoY2QtPm9mZnNldCAtIHRtcCk7CisJCQl9IGVsc2UgaWYgKG9mZnNldF9yID49IGxlbjEpIHsKKwkJCQljZC0+b2Zmc2V0IC09IGxlbjEgPj4gMjsKKwkJCX0gZWxzZSB7CisJCQkJLyogc2l0dGluZyBvbiB0aGUgZmVuY2UgKi8KKwkJCQlCVUdfT04ob2Zmc2V0X3IgIT0gbGVuMSAtIDQpOworCQkJCWNkLT5vZmZzZXQgPSBwICsgKGNkLT5vZmZzZXQgLSB0bXApOworCQkJCWNkLT5vZmZzZXQxID0gdG1wOworCQkJfQorCisJCQlsZW4yID0gKG51bV9lbnRyeV93b3JkcyA8PCAyKSAtIGxlbjE7CisKKwkJCS8qIG1vdmUgZnJvbSB0ZW1wIHBhZ2UgdG8gY3VycmVudCBhbmQgbmV4dCBwYWdlcyAqLworCQkJbWVtbW92ZShwLCB0bXAsIGxlbjEpOworCQkJbWVtbW92ZSh0bXAsIChjYWRkcl90KXRtcCtsZW4xLCBsZW4yKTsKKworCQkJcCA9IHRtcCArIChsZW4yID4+IDIpOworCQl9CisJfQorCWVsc2UgeworCQljZC0+Y29tbW9uLmVyciA9IG5mc2Vycl90b29zbWFsbDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2QtPmJ1ZmxlbiAtPSBudW1fZW50cnlfd29yZHM7CisJY2QtPmJ1ZmZlciA9IHA7CisJY2QtPmNvbW1vbi5lcnIgPSBuZnNfb2s7CisJcmV0dXJuIDA7CisKK30KKworaW50CituZnMzc3ZjX2VuY29kZV9lbnRyeShzdHJ1Y3QgcmVhZGRpcl9jZCAqY2QsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgaW50IG5hbWxlbiwgbG9mZl90IG9mZnNldCwgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQoreworCXJldHVybiBlbmNvZGVfZW50cnkoY2QsIG5hbWUsIG5hbWxlbiwgb2Zmc2V0LCBpbm8sIGRfdHlwZSwgMCk7Cit9CisKK2ludAorbmZzM3N2Y19lbmNvZGVfZW50cnlfcGx1cyhzdHJ1Y3QgcmVhZGRpcl9jZCAqY2QsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgIGludCBuYW1sZW4sIGxvZmZfdCBvZmZzZXQsIGlub190IGlubywgdW5zaWduZWQgaW50IGRfdHlwZSkKK3sKKwlyZXR1cm4gZW5jb2RlX2VudHJ5KGNkLCBuYW1lLCBuYW1sZW4sIG9mZnNldCwgaW5vLCBkX3R5cGUsIDEpOworfQorCisvKiBGU1NUQVQgKi8KK2ludAorbmZzM3N2Y19lbmNvZGVfZnNzdGF0cmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2QzX2Zzc3RhdHJlcyAqcmVzcCkKK3sKKwlzdHJ1Y3Qga3N0YXRmcwkqcyA9ICZyZXNwLT5zdGF0czsKKwl1NjQJCWJzID0gcy0+Zl9ic2l6ZTsKKworCSpwKysgPSB4ZHJfemVybzsJLyogbm8gcG9zdF9vcF9hdHRyICovCisKKwlpZiAocmVzcC0+c3RhdHVzID09IDApIHsKKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgYnMgKiBzLT5mX2Jsb2Nrcyk7CS8qIHRvdGFsIGJ5dGVzICovCisJCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGJzICogcy0+Zl9iZnJlZSk7CS8qIGZyZWUgYnl0ZXMgKi8KKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgYnMgKiBzLT5mX2JhdmFpbCk7CS8qIHVzZXIgYXZhaWxhYmxlIGJ5dGVzICovCisJCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIHMtPmZfZmlsZXMpOwkvKiB0b3RhbCBpbm9kZXMgKi8KKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgcy0+Zl9mZnJlZSk7CS8qIGZyZWUgaW5vZGVzICovCisJCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIHMtPmZfZmZyZWUpOwkvKiB1c2VyIGF2YWlsYWJsZSBpbm9kZXMgKi8KKwkJKnArKyA9IGh0b25sKHJlc3AtPmludmFyc2VjKTsJLyogbWVhbiB1bmNoYW5nZWQgdGltZSAqLworCX0KKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCisvKiBGU0lORk8gKi8KK2ludAorbmZzM3N2Y19lbmNvZGVfZnNpbmZvcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2QzX2ZzaW5mb3JlcyAqcmVzcCkKK3sKKwkqcCsrID0geGRyX3plcm87CS8qIG5vIHBvc3Rfb3BfYXR0ciAqLworCisJaWYgKHJlc3AtPnN0YXR1cyA9PSAwKSB7CisJCSpwKysgPSBodG9ubChyZXNwLT5mX3J0bWF4KTsKKwkJKnArKyA9IGh0b25sKHJlc3AtPmZfcnRwcmVmKTsKKwkJKnArKyA9IGh0b25sKHJlc3AtPmZfcnRtdWx0KTsKKwkJKnArKyA9IGh0b25sKHJlc3AtPmZfd3RtYXgpOworCQkqcCsrID0gaHRvbmwocmVzcC0+Zl93dHByZWYpOworCQkqcCsrID0gaHRvbmwocmVzcC0+Zl93dG11bHQpOworCQkqcCsrID0gaHRvbmwocmVzcC0+Zl9kdHByZWYpOworCQlwID0geGRyX2VuY29kZV9oeXBlcihwLCByZXNwLT5mX21heGZpbGVzaXplKTsKKwkJKnArKyA9IHhkcl9vbmU7CisJCSpwKysgPSB4ZHJfemVybzsKKwkJKnArKyA9IGh0b25sKHJlc3AtPmZfcHJvcGVydGllcyk7CisJfQorCisJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworLyogUEFUSENPTkYgKi8KK2ludAorbmZzM3N2Y19lbmNvZGVfcGF0aGNvbmZyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfcGF0aGNvbmZyZXMgKnJlc3ApCit7CisJKnArKyA9IHhkcl96ZXJvOwkvKiBubyBwb3N0X29wX2F0dHIgKi8KKworCWlmIChyZXNwLT5zdGF0dXMgPT0gMCkgeworCQkqcCsrID0gaHRvbmwocmVzcC0+cF9saW5rX21heCk7CisJCSpwKysgPSBodG9ubChyZXNwLT5wX25hbWVfbWF4KTsKKwkJKnArKyA9IGh0b25sKHJlc3AtPnBfbm9fdHJ1bmMpOworCQkqcCsrID0gaHRvbmwocmVzcC0+cF9jaG93bl9yZXN0cmljdGVkKTsKKwkJKnArKyA9IGh0b25sKHJlc3AtPnBfY2FzZV9pbnNlbnNpdGl2ZSk7CisJCSpwKysgPSBodG9ubChyZXNwLT5wX2Nhc2VfcHJlc2VydmluZyk7CisJfQorCisJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworLyogQ09NTUlUICovCitpbnQKK25mczNzdmNfZW5jb2RlX2NvbW1pdHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19jb21taXRyZXMgKnJlc3ApCit7CisJcCA9IGVuY29kZV93Y2NfZGF0YShycXN0cCwgcCwgJnJlc3AtPmZoKTsKKwkvKiBXcml0ZSB2ZXJpZmllciAqLworCWlmIChyZXNwLT5zdGF0dXMgPT0gMCkgeworCQkqcCsrID0gaHRvbmwobmZzc3ZjX2Jvb3QudHZfc2VjKTsKKwkJKnArKyA9IGh0b25sKG5mc3N2Y19ib290LnR2X3VzZWMpOworCX0KKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCisvKgorICogWERSIHJlbGVhc2UgZnVuY3Rpb25zCisgKi8KK2ludAorbmZzM3N2Y19yZWxlYXNlX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfYXR0cnN0YXQgKnJlc3ApCit7CisJZmhfcHV0KCZyZXNwLT5maCk7CisJcmV0dXJuIDE7Cit9CisKK2ludAorbmZzM3N2Y19yZWxlYXNlX2ZoYW5kbGUyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2QzX2ZoYW5kbGVfcGFpciAqcmVzcCkKK3sKKwlmaF9wdXQoJnJlc3AtPmZoMSk7CisJZmhfcHV0KCZyZXNwLT5maDIpOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0YWNsLmMgYi9mcy9uZnNkL25mczRhY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWViZjZjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzZC9uZnM0YWNsLmMKQEAgLTAsMCArMSw5NTQgQEAKKy8qCisgKiAgZnMvbmZzNGFjbC9hY2wuYworICoKKyAqICBDb21tb24gTkZTdjQgQUNMIGhhbmRsaW5nIGNvZGUuCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBNYXJpdXMgQWFtb2R0IEVyaWtzZW4gPG1hcml1c0B1bWljaC5lZHU+CisgKiAgSmVmZiBTZWRsYWsgPGpzZWRsYWtAdW1pY2guZWR1PgorICogIEouIEJydWNlIEZpZWxkcyA8YmZpZWxkc0B1bWljaC5lZHU+CisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbC5oPgorI2luY2x1ZGUgPGxpbnV4L25mczQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnM0X2FjbC5oPgorCisKKy8qIG1vZGUgYml0IHRyYW5zbGF0aW9uczogKi8KKyNkZWZpbmUgTkZTNF9SRUFEX01PREUgKE5GUzRfQUNFX1JFQURfREFUQSkKKyNkZWZpbmUgTkZTNF9XUklURV9NT0RFIChORlM0X0FDRV9XUklURV9EQVRBIHwgTkZTNF9BQ0VfQVBQRU5EX0RBVEEpCisjZGVmaW5lIE5GUzRfRVhFQ1VURV9NT0RFIE5GUzRfQUNFX0VYRUNVVEUKKyNkZWZpbmUgTkZTNF9BTllPTkVfTU9ERSAoTkZTNF9BQ0VfUkVBRF9BVFRSSUJVVEVTIHwgTkZTNF9BQ0VfUkVBRF9BQ0wgfCBORlM0X0FDRV9TWU5DSFJPTklaRSkKKyNkZWZpbmUgTkZTNF9PV05FUl9NT0RFIChORlM0X0FDRV9XUklURV9BVFRSSUJVVEVTIHwgTkZTNF9BQ0VfV1JJVEVfQUNMKQorCisvKiBXZSBkb24ndCBzdXBwb3J0IHRoZXNlIGJpdHM7IGluc2lzdCB0aGV5IGJlIG5laXRoZXIgYWxsb3dlZCBub3IgZGVuaWVkICovCisjZGVmaW5lIE5GUzRfTUFTS19VTlNVUFAgKE5GUzRfQUNFX0RFTEVURSB8IE5GUzRfQUNFX1dSSVRFX09XTkVSIFwKKwkJfCBORlM0X0FDRV9SRUFEX05BTUVEX0FUVFJTIHwgTkZTNF9BQ0VfV1JJVEVfTkFNRURfQVRUUlMpCisKKy8qIGZsYWdzIHVzZWQgdG8gc2ltdWxhdGUgcG9zaXggZGVmYXVsdCBBQ0xzICovCisjZGVmaW5lIE5GUzRfSU5IRVJJVEFOQ0VfRkxBR1MgKE5GUzRfQUNFX0ZJTEVfSU5IRVJJVF9BQ0UgXAorCQl8IE5GUzRfQUNFX0RJUkVDVE9SWV9JTkhFUklUX0FDRSB8IE5GUzRfQUNFX0lOSEVSSVRfT05MWV9BQ0UpCisKKyNkZWZpbmUgTUFTS19FUVVBTChtYXNrMSwgbWFzazIpIFwKKwkoICgobWFzazEpICYgTkZTNF9BQ0VfTUFTS19BTEwpID09ICgobWFzazIpICYgTkZTNF9BQ0VfTUFTS19BTEwpICkKKworc3RhdGljIHUzMgorbWFza19mcm9tX3Bvc2l4KHVuc2lnbmVkIHNob3J0IHBlcm0sIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpbnQgbWFzayA9IE5GUzRfQU5ZT05FX01PREU7CisKKwlpZiAoZmxhZ3MgJiBORlM0X0FDTF9PV05FUikKKwkJbWFzayB8PSBORlM0X09XTkVSX01PREU7CisJaWYgKHBlcm0gJiBBQ0xfUkVBRCkKKwkJbWFzayB8PSBORlM0X1JFQURfTU9ERTsKKwlpZiAocGVybSAmIEFDTF9XUklURSkKKwkJbWFzayB8PSBORlM0X1dSSVRFX01PREU7CisJaWYgKChwZXJtICYgQUNMX1dSSVRFKSAmJiAoZmxhZ3MgJiBORlM0X0FDTF9ESVIpKQorCQltYXNrIHw9IE5GUzRfQUNFX0RFTEVURV9DSElMRDsKKwlpZiAocGVybSAmIEFDTF9FWEVDVVRFKQorCQltYXNrIHw9IE5GUzRfRVhFQ1VURV9NT0RFOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgdTMyCitkZW55X21hc2sodTMyIGFsbG93X21hc2ssIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwl1MzIgcmV0ID0gfmFsbG93X21hc2sgJiB+TkZTNF9NQVNLX1VOU1VQUDsKKwlpZiAoIShmbGFncyAmIE5GUzRfQUNMX0RJUikpCisJCXJldCAmPSB+TkZTNF9BQ0VfREVMRVRFX0NISUxEOworCXJldHVybiByZXQ7Cit9CisKKy8qIFhYWDogbW9kaWZ5IGZ1bmN0aW9ucyB0byByZXR1cm4gTkZTIGVycm9yczsgdGhleSdyZSBvbmx5IGV2ZXIKKyAqIHVzZWQgYnkgbmZzIGNvZGUsIGFmdGVyIGFsbC4uLi4gKi8KKworc3RhdGljIGludAorbW9kZV9mcm9tX25mczQodTMyIHBlcm0sIHVuc2lnbmVkIHNob3J0ICptb2RlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJdTMyIGlnbm9yZSA9IDA7CisKKwlpZiAoIShmbGFncyAmIE5GUzRfQUNMX0RJUikpCisJCWlnbm9yZSB8PSBORlM0X0FDRV9ERUxFVEVfQ0hJTEQ7IC8qIGlnbm9yZSBpdCAqLworCXBlcm0gfD0gaWdub3JlOworCSptb2RlID0gMDsKKwlpZiAoKHBlcm0gJiBORlM0X1JFQURfTU9ERSkgPT0gTkZTNF9SRUFEX01PREUpCisJCSptb2RlIHw9IEFDTF9SRUFEOworCWlmICgocGVybSAmIE5GUzRfV1JJVEVfTU9ERSkgPT0gTkZTNF9XUklURV9NT0RFKQorCQkqbW9kZSB8PSBBQ0xfV1JJVEU7CisJaWYgKChwZXJtICYgTkZTNF9FWEVDVVRFX01PREUpID09IE5GUzRfRVhFQ1VURV9NT0RFKQorCQkqbW9kZSB8PSBBQ0xfRVhFQ1VURTsKKwlpZiAoIU1BU0tfRVFVQUwocGVybSwgaWdub3JlfG1hc2tfZnJvbV9wb3NpeCgqbW9kZSwgZmxhZ3MpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBhY2VfY29udGFpbmVyIHsKKwlzdHJ1Y3QgbmZzNF9hY2UgICphY2U7CisJc3RydWN0IGxpc3RfaGVhZCAgYWNlX2w7Cit9OworCitzdGF0aWMgc2hvcnQgYWNlMnR5cGUoc3RydWN0IG5mczRfYWNlICopOworc3RhdGljIGludCBfcG9zaXhfdG9fbmZzdjRfb25lKHN0cnVjdCBwb3NpeF9hY2wgKiwgc3RydWN0IG5mczRfYWNsICosIHVuc2lnbmVkIGludCk7CitzdGF0aWMgc3RydWN0IHBvc2l4X2FjbCAqX25mc3Y0X3RvX3Bvc2l4X29uZShzdHJ1Y3QgbmZzNF9hY2wgKiwgdW5zaWduZWQgaW50KTsKK2ludCBuZnM0X2FjbF9hZGRfYWNlKHN0cnVjdCBuZnM0X2FjbCAqLCB1MzIsIHUzMiwgdTMyLCBpbnQsIHVpZF90KTsKK2ludCBuZnM0X2FjbF9zcGxpdChzdHJ1Y3QgbmZzNF9hY2wgKiwgc3RydWN0IG5mczRfYWNsICopOworCitzdHJ1Y3QgbmZzNF9hY2wgKgorbmZzNF9hY2xfcG9zaXhfdG9fbmZzdjQoc3RydWN0IHBvc2l4X2FjbCAqcGFjbCwgc3RydWN0IHBvc2l4X2FjbCAqZHBhY2wsCisJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IG5mczRfYWNsICphY2w7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKworCWlmICgocGFjbCAhPSBOVUxMICYmCisJCShwb3NpeF9hY2xfdmFsaWQocGFjbCkgPCAwIHx8IHBhY2wtPmFfY291bnQgPT0gMCkpIHx8CisJICAgIChkcGFjbCAhPSBOVUxMICYmCisJCShwb3NpeF9hY2xfdmFsaWQoZHBhY2wpIDwgMCB8fCBkcGFjbC0+YV9jb3VudCA9PSAwKSkpCisJCWdvdG8gb3V0X2VycjsKKworCWFjbCA9IG5mczRfYWNsX25ldygpOworCWlmIChhY2wgPT0gTlVMTCkgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlpZiAocGFjbCAhPSBOVUxMKSB7CisJCWVycm9yID0gX3Bvc2l4X3RvX25mc3Y0X29uZShwYWNsLCBhY2wsCisJCQkJCQlmbGFncyAmIH5ORlM0X0FDTF9UWVBFX0RFRkFVTFQpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXRfYWNsOworCX0KKworCWlmIChkcGFjbCAhPSBOVUxMKSB7CisJCWVycm9yID0gX3Bvc2l4X3RvX25mc3Y0X29uZShkcGFjbCwgYWNsLAorCQkJCQkJZmxhZ3MgfCBORlM0X0FDTF9UWVBFX0RFRkFVTFQpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXRfYWNsOworCX0KKworCXJldHVybiBhY2w7CisKK291dF9hY2w6CisJbmZzNF9hY2xfZnJlZShhY2wpOworb3V0X2VycjoKKwlhY2wgPSBFUlJfUFRSKGVycm9yKTsKKworCXJldHVybiBhY2w7Cit9CisKK3N0YXRpYyBpbnQKK25mczRfYWNsX2FkZF9wYWlyKHN0cnVjdCBuZnM0X2FjbCAqYWNsLCBpbnQgZWZsYWcsIHUzMiBtYXNrLCBpbnQgd2hvdHlwZSwKKwkJdWlkX3Qgb3duZXIsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IG5mczRfYWNsX2FkZF9hY2UoYWNsLCBORlM0X0FDRV9BQ0NFU1NfQUxMT1dFRF9BQ0VfVFlQRSwKKwkJCQkgZWZsYWcsIG1hc2ssIHdob3R5cGUsIG93bmVyKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisJZXJyb3IgPSBuZnM0X2FjbF9hZGRfYWNlKGFjbCwgTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRSwKKwkJCQllZmxhZywgZGVueV9tYXNrKG1hc2ssIGZsYWdzKSwgd2hvdHlwZSwgb3duZXIpOworCXJldHVybiBlcnJvcjsKK30KKworLyogV2UgYXNzdW1lIHRoZSBhY2wgaGFzIGJlZW4gdmVyaWZpZWQgd2l0aCBwb3NpeF9hY2xfdmFsaWQuICovCitzdGF0aWMgaW50CitfcG9zaXhfdG9fbmZzdjRfb25lKHN0cnVjdCBwb3NpeF9hY2wgKnBhY2wsIHN0cnVjdCBuZnM0X2FjbCAqYWNsLAorCQkJCQkJdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBwb3NpeF9hY2xfZW50cnkgKnBhLCAqcGUsICpncm91cF9vd25lcl9lbnRyeTsKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCXUzMiBtYXNrLCBtYXNrX21hc2s7CisJaW50IGVmbGFnID0gKChmbGFncyAmIE5GUzRfQUNMX1RZUEVfREVGQVVMVCkgPworCQkJCQlORlM0X0lOSEVSSVRBTkNFX0ZMQUdTIDogMCk7CisKKwlCVUdfT04ocGFjbC0+YV9jb3VudCA8IDMpOworCXBlID0gcGFjbC0+YV9lbnRyaWVzICsgcGFjbC0+YV9jb3VudDsKKwlwYSA9IHBlIC0gMjsgLyogaWYgbWFzayBlbnRyeSBleGlzdHMsIGl0J3Mgc2Vjb25kIGZyb20gdGhlIGxhc3QuICovCisJaWYgKHBhLT5lX3RhZyA9PSBBQ0xfTUFTSykKKwkJbWFza19tYXNrID0gZGVueV9tYXNrKG1hc2tfZnJvbV9wb3NpeChwYS0+ZV9wZXJtLCBmbGFncyksIGZsYWdzKTsKKwllbHNlCisJCW1hc2tfbWFzayA9IDA7CisKKwlwYSA9IHBhY2wtPmFfZW50cmllczsKKwlCVUdfT04ocGEtPmVfdGFnICE9IEFDTF9VU0VSX09CSik7CisJbWFzayA9IG1hc2tfZnJvbV9wb3NpeChwYS0+ZV9wZXJtLCBmbGFncyB8IE5GUzRfQUNMX09XTkVSKTsKKwllcnJvciA9IG5mczRfYWNsX2FkZF9wYWlyKGFjbCwgZWZsYWcsIG1hc2ssIE5GUzRfQUNMX1dIT19PV05FUiwgMCwgZmxhZ3MpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCXBhKys7CisKKwl3aGlsZSAocGEtPmVfdGFnID09IEFDTF9VU0VSKSB7CisJCW1hc2sgPSBtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSwgZmxhZ3MpOworCQllcnJvciA9IG5mczRfYWNsX2FkZF9hY2UoYWNsLCBORlM0X0FDRV9BQ0NFU1NfREVOSUVEX0FDRV9UWVBFLAorCQkJCWVmbGFnLCAgbWFza19tYXNrLCBORlM0X0FDTF9XSE9fTkFNRUQsIHBhLT5lX2lkKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gb3V0OworCisKKwkJZXJyb3IgPSBuZnM0X2FjbF9hZGRfcGFpcihhY2wsIGVmbGFnLCBtYXNrLAorCQkJCU5GUzRfQUNMX1dIT19OQU1FRCwgcGEtPmVfaWQsIGZsYWdzKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gb3V0OworCQlwYSsrOworCX0KKworCS8qIEluIHRoZSBjYXNlIG9mIGdyb3Vwcywgd2UgYXBwbHkgYWxsb3cgQUNFcyBmaXJzdCwgdGhlbiBkZW55IEFDRXMsCisJICogc2luY2UgYSB1c2VyIGNhbiBiZSBpbiBtb3JlIHRoYW4gb25lIGdyb3VwLiAgKi8KKworCS8qIGFsbG93IEFDRXMgKi8KKworCWlmIChwYWNsLT5hX2NvdW50ID4gMykgeworCQlCVUdfT04ocGEtPmVfdGFnICE9IEFDTF9HUk9VUF9PQkopOworCQllcnJvciA9IG5mczRfYWNsX2FkZF9hY2UoYWNsLCBORlM0X0FDRV9BQ0NFU1NfREVOSUVEX0FDRV9UWVBFLAorCQkJCU5GUzRfQUNFX0lERU5USUZJRVJfR1JPVVAgfCBlZmxhZywgbWFza19tYXNrLAorCQkJCU5GUzRfQUNMX1dIT19HUk9VUCwgMCk7CisJCWlmIChlcnJvciA8IDApCisJCQlnb3RvIG91dDsKKwl9CisJZ3JvdXBfb3duZXJfZW50cnkgPSBwYTsKKwltYXNrID0gbWFza19mcm9tX3Bvc2l4KHBhLT5lX3Blcm0sIGZsYWdzKTsKKwllcnJvciA9IG5mczRfYWNsX2FkZF9hY2UoYWNsLCBORlM0X0FDRV9BQ0NFU1NfQUxMT1dFRF9BQ0VfVFlQRSwKKwkJCU5GUzRfQUNFX0lERU5USUZJRVJfR1JPVVAgfCBlZmxhZywgbWFzaywKKwkJCU5GUzRfQUNMX1dIT19HUk9VUCwgMCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisJcGErKzsKKworCXdoaWxlIChwYS0+ZV90YWcgPT0gQUNMX0dST1VQKSB7CisJCW1hc2sgPSBtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSwgZmxhZ3MpOworCQllcnJvciA9IG5mczRfYWNsX2FkZF9hY2UoYWNsLCBORlM0X0FDRV9BQ0NFU1NfREVOSUVEX0FDRV9UWVBFLAorCQkJCU5GUzRfQUNFX0lERU5USUZJRVJfR1JPVVAgfCBlZmxhZywgbWFza19tYXNrLAorCQkJCU5GUzRfQUNMX1dIT19OQU1FRCwgcGEtPmVfaWQpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJZXJyb3IgPSBuZnM0X2FjbF9hZGRfYWNlKGFjbCwgTkZTNF9BQ0VfQUNDRVNTX0FMTE9XRURfQUNFX1RZUEUsCisJCSAgICAJCU5GUzRfQUNFX0lERU5USUZJRVJfR1JPVVAgfCBlZmxhZywgbWFzaywKKwkJICAgIAkJTkZTNF9BQ0xfV0hPX05BTUVELCBwYS0+ZV9pZCk7CisJCWlmIChlcnJvciA8IDApCisJCQlnb3RvIG91dDsKKwkJcGErKzsKKwl9CisKKwkvKiBkZW55IEFDRXMgKi8KKworCXBhID0gZ3JvdXBfb3duZXJfZW50cnk7CisJbWFzayA9IG1hc2tfZnJvbV9wb3NpeChwYS0+ZV9wZXJtLCBmbGFncyk7CisJZXJyb3IgPSBuZnM0X2FjbF9hZGRfYWNlKGFjbCwgTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRSwKKwkJCU5GUzRfQUNFX0lERU5USUZJRVJfR1JPVVAgfCBlZmxhZywKKwkJCWRlbnlfbWFzayhtYXNrLCBmbGFncyksIE5GUzRfQUNMX1dIT19HUk9VUCwgMCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisJcGErKzsKKwl3aGlsZSAocGEtPmVfdGFnID09IEFDTF9HUk9VUCkgeworCQltYXNrID0gbWFza19mcm9tX3Bvc2l4KHBhLT5lX3Blcm0sIGZsYWdzKTsKKwkJZXJyb3IgPSBuZnM0X2FjbF9hZGRfYWNlKGFjbCwgTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRSwKKwkJICAgIAkJTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCB8IGVmbGFnLAorCQkgICAgCQlkZW55X21hc2sobWFzaywgZmxhZ3MpLCBORlM0X0FDTF9XSE9fTkFNRUQsIHBhLT5lX2lkKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gb3V0OworCQlwYSsrOworCX0KKworCWlmIChwYS0+ZV90YWcgPT0gQUNMX01BU0spCisJCXBhKys7CisJQlVHX09OKHBhLT5lX3RhZyAhPSBBQ0xfT1RIRVIpOworCW1hc2sgPSBtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSwgZmxhZ3MpOworCWVycm9yID0gbmZzNF9hY2xfYWRkX3BhaXIoYWNsLCBlZmxhZywgbWFzaywgTkZTNF9BQ0xfV0hPX0VWRVJZT05FLCAwLCBmbGFncyk7CisKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkCitzb3J0X3BhY2xfcmFuZ2Uoc3RydWN0IHBvc2l4X2FjbCAqcGFjbCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisJaW50IHNvcnRlZCA9IDAsIGk7CisJc3RydWN0IHBvc2l4X2FjbF9lbnRyeSB0bXA7CisKKwkvKiBXZSBqdXN0IGRvIGEgYnViYmxlIHNvcnQ7IGVhc3kgdG8gZG8gaW4gcGxhY2UsIGFuZCB3ZSdyZSBub3QKKwkgKiBleHBlY3RpbmcgYWNsJ3MgdG8gYmUgbG9uZyBlbm91Z2ggdG8ganVzdGlmeSBhbnl0aGluZyBtb3JlLiAqLworCXdoaWxlICghc29ydGVkKSB7CisJCXNvcnRlZCA9IDE7CisJCWZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKKwkJCWlmIChwYWNsLT5hX2VudHJpZXNbaV0uZV9pZAorCQkJCQk+IHBhY2wtPmFfZW50cmllc1tpKzFdLmVfaWQpIHsKKwkJCQlzb3J0ZWQgPSAwOworCQkJCXRtcCA9IHBhY2wtPmFfZW50cmllc1tpXTsKKwkJCQlwYWNsLT5hX2VudHJpZXNbaV0gPSBwYWNsLT5hX2VudHJpZXNbaSsxXTsKKwkJCQlwYWNsLT5hX2VudHJpZXNbaSsxXSA9IHRtcDsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK3NvcnRfcGFjbChzdHJ1Y3QgcG9zaXhfYWNsICpwYWNsKQoreworCS8qIHBvc2l4X2FjbF92YWxpZCByZXF1aXJlcyB0aGF0IHVzZXJzIGFuZCBncm91cHMgYmUgaW4gb3JkZXIKKwkgKiBieSB1aWQvZ2lkLiAqLworCWludCBpLCBqOworCisJaWYgKHBhY2wtPmFfY291bnQgPD0gNCkKKwkJcmV0dXJuOyAvKiBubyB1c2VycyBvciBncm91cHMgKi8KKwlpID0gMTsKKwl3aGlsZSAocGFjbC0+YV9lbnRyaWVzW2ldLmVfdGFnID09IEFDTF9VU0VSKQorCQlpKys7CisJc29ydF9wYWNsX3JhbmdlKHBhY2wsIDEsIGktMSk7CisKKwlCVUdfT04ocGFjbC0+YV9lbnRyaWVzW2ldLmVfdGFnICE9IEFDTF9HUk9VUF9PQkopOworCWogPSBpKys7CisJd2hpbGUgKHBhY2wtPmFfZW50cmllc1tqXS5lX3RhZyA9PSBBQ0xfR1JPVVApCisJCWorKzsKKwlzb3J0X3BhY2xfcmFuZ2UocGFjbCwgaSwgai0xKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK3dyaXRlX3BhY2Uoc3RydWN0IG5mczRfYWNlICphY2UsIHN0cnVjdCBwb3NpeF9hY2wgKnBhY2wsCisJCXN0cnVjdCBwb3NpeF9hY2xfZW50cnkgKipwYWNlLCBzaG9ydCB0YWcsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICp0aGlzID0gKnBhY2U7CisKKwlpZiAoKnBhY2UgPT0gcGFjbC0+YV9lbnRyaWVzICsgcGFjbC0+YV9jb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7IC8qIGZlbGwgb2ZmIHRoZSBlbmQgKi8KKwkoKnBhY2UpKys7CisJdGhpcy0+ZV90YWcgPSB0YWc7CisJaWYgKHRhZyA9PSBBQ0xfVVNFUl9PQkopCisJCWZsYWdzIHw9IE5GUzRfQUNMX09XTkVSOworCWlmIChtb2RlX2Zyb21fbmZzNChhY2UtPmFjY2Vzc19tYXNrLCAmdGhpcy0+ZV9wZXJtLCBmbGFncykpCisJCXJldHVybiAtRUlOVkFMOworCXRoaXMtPmVfaWQgPSAodGFnID09IEFDTF9VU0VSIHx8IHRhZyA9PSBBQ0xfR1JPVVAgPworCQkJYWNlLT53aG8gOiBBQ0xfVU5ERUZJTkVEX0lEKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZnM0X2FjZSAqCitnZXRfbmV4dF92NF9hY2Uoc3RydWN0IGxpc3RfaGVhZCAqKnAsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IG5mczRfYWNlICphY2U7CisKKwkqcCA9ICgqcCktPm5leHQ7CisJaWYgKCpwID09IGhlYWQpCisJCXJldHVybiBOVUxMOworCWFjZSA9IGxpc3RfZW50cnkoKnAsIHN0cnVjdCBuZnM0X2FjZSwgbF9hY2UpOworCisJcmV0dXJuIGFjZTsKK30KKworaW50CituZnM0X2FjbF9uZnN2NF90b19wb3NpeChzdHJ1Y3QgbmZzNF9hY2wgKmFjbCwgc3RydWN0IHBvc2l4X2FjbCAqKnBhY2wsCisJCXN0cnVjdCBwb3NpeF9hY2wgKipkcGFjbCwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBuZnM0X2FjbCAqZGFjbDsKKwlpbnQgZXJyb3IgPSAtRU5PTUVNOworCisJKnBhY2wgPSBOVUxMOworCSpkcGFjbCA9IE5VTEw7CisKKwlkYWNsID0gbmZzNF9hY2xfbmV3KCk7CisJaWYgKGRhY2wgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IG5mczRfYWNsX3NwbGl0KGFjbCwgZGFjbCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXRfYWNsOworCisJaWYgKHBhY2wgIT0gTlVMTCkgeworCQlpZiAoYWNsLT5uYWNlcyA9PSAwKSB7CisJCQllcnJvciA9IC1FTk9EQVRBOworCQkJZ290byB0cnlfZHBhY2w7CisJCX0KKworCQkqcGFjbCA9IF9uZnN2NF90b19wb3NpeF9vbmUoYWNsLCBmbGFncyk7CisJCWlmIChJU19FUlIoKnBhY2wpKSB7CisJCQllcnJvciA9IFBUUl9FUlIoKnBhY2wpOworCQkJKnBhY2wgPSBOVUxMOworCQkJZ290byBvdXRfYWNsOworCQl9CisJfQorCit0cnlfZHBhY2w6CisJaWYgKGRwYWNsICE9IE5VTEwpIHsKKwkJaWYgKGRhY2wtPm5hY2VzID09IDApIHsKKwkJCWlmIChwYWNsID09IE5VTEwgfHwgKnBhY2wgPT0gTlVMTCkKKwkJCQllcnJvciA9IC1FTk9EQVRBOworCQkJZ290byBvdXRfYWNsOworCQl9CisKKwkJZXJyb3IgPSAwOworCQkqZHBhY2wgPSBfbmZzdjRfdG9fcG9zaXhfb25lKGRhY2wsIGZsYWdzKTsKKwkJaWYgKElTX0VSUigqZHBhY2wpKSB7CisJCQllcnJvciA9IFBUUl9FUlIoKmRwYWNsKTsKKwkJCSpkcGFjbCA9IE5VTEw7CisJCQlnb3RvIG91dF9hY2w7CisJCX0KKwl9CisKK291dF9hY2w6CisJaWYgKGVycm9yICYmIHBhY2wpIHsKKwkJcG9zaXhfYWNsX3JlbGVhc2UoKnBhY2wpOworCQkqcGFjbCA9IE5VTEw7CisJfQorCW5mczRfYWNsX2ZyZWUoZGFjbCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50CitzYW1lX3dobyhzdHJ1Y3QgbmZzNF9hY2UgKmEsIHN0cnVjdCBuZnM0X2FjZSAqYikKK3sKKwlyZXR1cm4gYS0+d2hvdHlwZSA9PSBiLT53aG90eXBlICYmCisJCShhLT53aG90eXBlICE9IE5GUzRfQUNMX1dIT19OQU1FRCB8fCBhLT53aG8gPT0gYi0+d2hvKTsKK30KKworc3RhdGljIGludAorY29tcGxlbWVudGFyeV9hY2VfcGFpcihzdHJ1Y3QgbmZzNF9hY2UgKmFsbG93LCBzdHJ1Y3QgbmZzNF9hY2UgKmRlbnksCisJCXVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpbnQgaWdub3JlID0gMDsKKwlpZiAoIShmbGFncyAmIE5GUzRfQUNMX0RJUikpCisJCWlnbm9yZSB8PSBORlM0X0FDRV9ERUxFVEVfQ0hJTEQ7CisJcmV0dXJuIE1BU0tfRVFVQUwoaWdub3JlfGRlbnlfbWFzayhhbGxvdy0+YWNjZXNzX21hc2ssIGZsYWdzKSwKKwkJCSAgaWdub3JlfGRlbnktPmFjY2Vzc19tYXNrKSAmJgorCQlhbGxvdy0+dHlwZSA9PSBORlM0X0FDRV9BQ0NFU1NfQUxMT1dFRF9BQ0VfVFlQRSAmJgorCQlkZW55LT50eXBlID09IE5GUzRfQUNFX0FDQ0VTU19ERU5JRURfQUNFX1RZUEUgJiYKKwkJYWxsb3ctPmZsYWcgPT0gZGVueS0+ZmxhZyAmJgorCQlzYW1lX3dobyhhbGxvdywgZGVueSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit1c2VyX29ial9mcm9tX3Y0KHN0cnVjdCBuZnM0X2FjbCAqbjRhY2wsIHN0cnVjdCBsaXN0X2hlYWQgKipwLAorCQlzdHJ1Y3QgcG9zaXhfYWNsICpwYWNsLCBzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICoqcGFjZSwKKwkJdW5zaWduZWQgaW50IGZsYWdzKQoreworCWludCBlcnJvciA9IC1FSU5WQUw7CisJc3RydWN0IG5mczRfYWNlICphY2UsICphY2UyOworCisJYWNlID0gZ2V0X25leHRfdjRfYWNlKHAsICZuNGFjbC0+YWNlX2hlYWQpOworCWlmIChhY2UgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJaWYgKGFjZTJ0eXBlKGFjZSkgIT0gQUNMX1VTRVJfT0JKKQorCQlnb3RvIG91dDsKKwllcnJvciA9IHdyaXRlX3BhY2UoYWNlLCBwYWNsLCBwYWNlLCBBQ0xfVVNFUl9PQkosIGZsYWdzKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKwllcnJvciA9IC1FSU5WQUw7CisJYWNlMiA9IGdldF9uZXh0X3Y0X2FjZShwLCAmbjRhY2wtPmFjZV9oZWFkKTsKKwlpZiAoYWNlMiA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlpZiAoIWNvbXBsZW1lbnRhcnlfYWNlX3BhaXIoYWNlLCBhY2UyLCBmbGFncykpCisJCWdvdG8gb3V0OworCWVycm9yID0gMDsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit1c2Vyc19mcm9tX3Y0KHN0cnVjdCBuZnM0X2FjbCAqbjRhY2wsIHN0cnVjdCBsaXN0X2hlYWQgKipwLAorCQlzdHJ1Y3QgbmZzNF9hY2UgKiptYXNrX2FjZSwKKwkJc3RydWN0IHBvc2l4X2FjbCAqcGFjbCwgc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqKnBhY2UsCisJCXVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCXN0cnVjdCBuZnM0X2FjZSAqYWNlLCAqYWNlMjsKKworCWFjZSA9IGdldF9uZXh0X3Y0X2FjZShwLCAmbjRhY2wtPmFjZV9oZWFkKTsKKwlpZiAoYWNlID09IE5VTEwpCisJCWdvdG8gb3V0OworCXdoaWxlIChhY2UydHlwZShhY2UpID09IEFDTF9VU0VSKSB7CisJCWlmIChhY2UtPnR5cGUgIT0gTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRSkKKwkJCWdvdG8gb3V0OworCQlpZiAoKm1hc2tfYWNlICYmCisJCQkhTUFTS19FUVVBTChhY2UtPmFjY2Vzc19tYXNrLCAoKm1hc2tfYWNlKS0+YWNjZXNzX21hc2spKQorCQkJZ290byBvdXQ7CisJCSptYXNrX2FjZSA9IGFjZTsKKwkJYWNlID0gZ2V0X25leHRfdjRfYWNlKHAsICZuNGFjbC0+YWNlX2hlYWQpOworCQlpZiAoYWNlID09IE5VTEwpCisJCQlnb3RvIG91dDsKKwkJaWYgKGFjZS0+dHlwZSAhPSBORlM0X0FDRV9BQ0NFU1NfQUxMT1dFRF9BQ0VfVFlQRSkKKwkJCWdvdG8gb3V0OworCQllcnJvciA9IHdyaXRlX3BhY2UoYWNlLCBwYWNsLCBwYWNlLCBBQ0xfVVNFUiwgZmxhZ3MpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXQ7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJYWNlMiA9IGdldF9uZXh0X3Y0X2FjZShwLCAmbjRhY2wtPmFjZV9oZWFkKTsKKwkJaWYgKGFjZTIgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCQlpZiAoIWNvbXBsZW1lbnRhcnlfYWNlX3BhaXIoYWNlLCBhY2UyLCBmbGFncykpCisJCQlnb3RvIG91dDsKKwkJaWYgKCgqbWFza19hY2UpLT5mbGFnICE9IGFjZTItPmZsYWcgfHwKKwkJCQkhc2FtZV93aG8oKm1hc2tfYWNlLCBhY2UyKSkKKwkJCWdvdG8gb3V0OworCQlhY2UgPSBnZXRfbmV4dF92NF9hY2UocCwgJm40YWNsLT5hY2VfaGVhZCk7CisJCWlmIChhY2UgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCX0KKwllcnJvciA9IDA7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW5saW5lIGludAorZ3JvdXBfb2JqX2FuZF9ncm91cHNfZnJvbV92NChzdHJ1Y3QgbmZzNF9hY2wgKm40YWNsLCBzdHJ1Y3QgbGlzdF9oZWFkICoqcCwKKwkJc3RydWN0IG5mczRfYWNlICoqbWFza19hY2UsCisJCXN0cnVjdCBwb3NpeF9hY2wgKnBhY2wsIHN0cnVjdCBwb3NpeF9hY2xfZW50cnkgKipwYWNlLAorCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKwlzdHJ1Y3QgbmZzNF9hY2UgKmFjZSwgKmFjZTI7CisJc3RydWN0IGFjZV9jb250YWluZXIgKmFjOworCXN0cnVjdCBsaXN0X2hlYWQgZ3JvdXBfbDsKKworCUlOSVRfTElTVF9IRUFEKCZncm91cF9sKTsKKwlhY2UgPSBsaXN0X2VudHJ5KCpwLCBzdHJ1Y3QgbmZzNF9hY2UsIGxfYWNlKTsKKworCS8qIGdyb3VwIG93bmVyIChtYXNrIGFuZCBhbGxvdyBhY2VzKSAqLworCisJaWYgKHBhY2wtPmFfY291bnQgIT0gMykgeworCQkvKiB0aGVuIHRoZSBncm91cCBvd25lciBzaG91bGQgYmUgcHJlY2VkZWQgYnkgbWFzayAqLworCQlpZiAoYWNlLT50eXBlICE9IE5GUzRfQUNFX0FDQ0VTU19ERU5JRURfQUNFX1RZUEUpCisJCQlnb3RvIG91dDsKKwkJaWYgKCptYXNrX2FjZSAmJgorCQkJIU1BU0tfRVFVQUwoYWNlLT5hY2Nlc3NfbWFzaywgKCptYXNrX2FjZSktPmFjY2Vzc19tYXNrKSkKKwkJCWdvdG8gb3V0OworCQkqbWFza19hY2UgPSBhY2U7CisJCWFjZSA9IGdldF9uZXh0X3Y0X2FjZShwLCAmbjRhY2wtPmFjZV9oZWFkKTsKKwkJaWYgKGFjZSA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKCgqbWFza19hY2UpLT5mbGFnICE9IGFjZS0+ZmxhZyB8fCAhc2FtZV93aG8oKm1hc2tfYWNlLCBhY2UpKQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKGFjZTJ0eXBlKGFjZSkgIT0gQUNMX0dST1VQX09CSikKKwkJZ290byBvdXQ7CisKKwlhYyA9IGttYWxsb2Moc2l6ZW9mKCphYyksIEdGUF9LRVJORUwpOworCWVycm9yID0gLUVOT01FTTsKKwlpZiAoYWMgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJYWMtPmFjZSA9IGFjZTsKKwlsaXN0X2FkZF90YWlsKCZhYy0+YWNlX2wsICZncm91cF9sKTsKKworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoYWNlLT50eXBlICE9IE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gd3JpdGVfcGFjZShhY2UsIHBhY2wsIHBhY2UsIEFDTF9HUk9VUF9PQkosIGZsYWdzKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gLUVJTlZBTDsKKwlhY2UgPSBnZXRfbmV4dF92NF9hY2UocCwgJm40YWNsLT5hY2VfaGVhZCk7CisJaWYgKGFjZSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCS8qIGdyb3VwcyAobWFzayBhbmQgYWxsb3cgYWNlcykgKi8KKworCXdoaWxlIChhY2UydHlwZShhY2UpID09IEFDTF9HUk9VUCkgeworCQlpZiAoKm1hc2tfYWNlID09IE5VTEwpCisJCQlnb3RvIG91dDsKKworCQlpZiAoYWNlLT50eXBlICE9IE5GUzRfQUNFX0FDQ0VTU19ERU5JRURfQUNFX1RZUEUgfHwKKwkJCSFNQVNLX0VRVUFMKGFjZS0+YWNjZXNzX21hc2ssICgqbWFza19hY2UpLT5hY2Nlc3NfbWFzaykpCisJCQlnb3RvIG91dDsKKwkJKm1hc2tfYWNlID0gYWNlOworCisJCWFjZSA9IGdldF9uZXh0X3Y0X2FjZShwLCAmbjRhY2wtPmFjZV9oZWFkKTsKKwkJaWYgKGFjZSA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCWFjID0ga21hbGxvYyhzaXplb2YoKmFjKSwgR0ZQX0tFUk5FTCk7CisJCWVycm9yID0gLUVOT01FTTsKKwkJaWYgKGFjID09IE5VTEwpCisJCQlnb3RvIG91dDsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlpZiAoYWNlLT50eXBlICE9IE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFIHx8CisJCQkJIXNhbWVfd2hvKGFjZSwgKm1hc2tfYWNlKSkKKwkJCWdvdG8gb3V0OworCisJCWFjLT5hY2UgPSBhY2U7CisJCWxpc3RfYWRkX3RhaWwoJmFjLT5hY2VfbCwgJmdyb3VwX2wpOworCisJCWVycm9yID0gd3JpdGVfcGFjZShhY2UsIHBhY2wsIHBhY2UsIEFDTF9HUk9VUCwgZmxhZ3MpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXQ7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJYWNlID0gZ2V0X25leHRfdjRfYWNlKHAsICZuNGFjbC0+YWNlX2hlYWQpOworCQlpZiAoYWNlID09IE5VTEwpCisJCQlnb3RvIG91dDsKKwl9CisKKwkvKiBncm91cCBvd25lciAoZGVueSBhY2UpICovCisKKwlpZiAoYWNlMnR5cGUoYWNlKSAhPSBBQ0xfR1JPVVBfT0JKKQorCQlnb3RvIG91dDsKKwlhYyA9IGxpc3RfZW50cnkoZ3JvdXBfbC5uZXh0LCBzdHJ1Y3QgYWNlX2NvbnRhaW5lciwgYWNlX2wpOworCWFjZTIgPSBhYy0+YWNlOworCWlmICghY29tcGxlbWVudGFyeV9hY2VfcGFpcihhY2UyLCBhY2UsIGZsYWdzKSkKKwkJZ290byBvdXQ7CisJbGlzdF9kZWwoZ3JvdXBfbC5uZXh0KTsKKwlrZnJlZShhYyk7CisKKwkvKiBncm91cHMgKGRlbnkgYWNlcykgKi8KKworCXdoaWxlICghbGlzdF9lbXB0eSgmZ3JvdXBfbCkpIHsKKwkJYWNlID0gZ2V0X25leHRfdjRfYWNlKHAsICZuNGFjbC0+YWNlX2hlYWQpOworCQlpZiAoYWNlID09IE5VTEwpCisJCQlnb3RvIG91dDsKKwkJaWYgKGFjZTJ0eXBlKGFjZSkgIT0gQUNMX0dST1VQKQorCQkJZ290byBvdXQ7CisJCWFjID0gbGlzdF9lbnRyeShncm91cF9sLm5leHQsIHN0cnVjdCBhY2VfY29udGFpbmVyLCBhY2VfbCk7CisJCWFjZTIgPSBhYy0+YWNlOworCQlpZiAoIWNvbXBsZW1lbnRhcnlfYWNlX3BhaXIoYWNlMiwgYWNlLCBmbGFncykpCisJCQlnb3RvIG91dDsKKwkJbGlzdF9kZWwoZ3JvdXBfbC5uZXh0KTsKKwkJa2ZyZWUoYWMpOworCX0KKworCWFjZSA9IGdldF9uZXh0X3Y0X2FjZShwLCAmbjRhY2wtPmFjZV9oZWFkKTsKKwlpZiAoYWNlID09IE5VTEwpCisJCWdvdG8gb3V0OworCWlmIChhY2UydHlwZShhY2UpICE9IEFDTF9PVEhFUikKKwkJZ290byBvdXQ7CisJZXJyb3IgPSAwOworb3V0OgorCXdoaWxlICghbGlzdF9lbXB0eSgmZ3JvdXBfbCkpIHsKKwkJYWMgPSBsaXN0X2VudHJ5KGdyb3VwX2wubmV4dCwgc3RydWN0IGFjZV9jb250YWluZXIsIGFjZV9sKTsKKwkJbGlzdF9kZWwoZ3JvdXBfbC5uZXh0KTsKKwkJa2ZyZWUoYWMpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CittYXNrX2Zyb21fdjQoc3RydWN0IG5mczRfYWNsICpuNGFjbCwgc3RydWN0IGxpc3RfaGVhZCAqKnAsCisJCXN0cnVjdCBuZnM0X2FjZSAqKm1hc2tfYWNlLAorCQlzdHJ1Y3QgcG9zaXhfYWNsICpwYWNsLCBzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICoqcGFjZSwKKwkJdW5zaWduZWQgaW50IGZsYWdzKQoreworCWludCBlcnJvciA9IC1FSU5WQUw7CisJc3RydWN0IG5mczRfYWNlICphY2U7CisKKwlhY2UgPSBsaXN0X2VudHJ5KCpwLCBzdHJ1Y3QgbmZzNF9hY2UsIGxfYWNlKTsKKwlpZiAocGFjbC0+YV9jb3VudCAhPSAzKSB7CisJCWlmICgqbWFza19hY2UgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCQkoKm1hc2tfYWNlKS0+YWNjZXNzX21hc2sgPSBkZW55X21hc2soKCptYXNrX2FjZSktPmFjY2Vzc19tYXNrLCBmbGFncyk7CisJCXdyaXRlX3BhY2UoKm1hc2tfYWNlLCBwYWNsLCBwYWNlLCBBQ0xfTUFTSywgZmxhZ3MpOworCX0KKwllcnJvciA9IDA7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW5saW5lIGludAorb3RoZXJfZnJvbV92NChzdHJ1Y3QgbmZzNF9hY2wgKm40YWNsLCBzdHJ1Y3QgbGlzdF9oZWFkICoqcCwKKwkJc3RydWN0IHBvc2l4X2FjbCAqcGFjbCwgc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqKnBhY2UsCisJCXVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCXN0cnVjdCBuZnM0X2FjZSAqYWNlLCAqYWNlMjsKKworCWFjZSA9IGxpc3RfZW50cnkoKnAsIHN0cnVjdCBuZnM0X2FjZSwgbF9hY2UpOworCWlmIChhY2UtPnR5cGUgIT0gTkZTNF9BQ0VfQUNDRVNTX0FMTE9XRURfQUNFX1RZUEUpCisJCWdvdG8gb3V0OworCWVycm9yID0gd3JpdGVfcGFjZShhY2UsIHBhY2wsIHBhY2UsIEFDTF9PVEhFUiwgZmxhZ3MpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCWVycm9yID0gLUVJTlZBTDsKKwlhY2UyID0gZ2V0X25leHRfdjRfYWNlKHAsICZuNGFjbC0+YWNlX2hlYWQpOworCWlmIChhY2UyID09IE5VTEwpCisJCWdvdG8gb3V0OworCWlmICghY29tcGxlbWVudGFyeV9hY2VfcGFpcihhY2UsIGFjZTIsIGZsYWdzKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSAwOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludAorY2FsY3VsYXRlX3Bvc2l4X2FjZV9jb3VudChzdHJ1Y3QgbmZzNF9hY2wgKm40YWNsKQoreworCWlmIChuNGFjbC0+bmFjZXMgPT0gNikgLyogb3duZXIsIG93bmVyIGdyb3VwLCBhbmQgb3RoZXIgb25seSAqLworCQlyZXR1cm4gMzsKKwllbHNlIHsgLyogT3RoZXJ3aXNlIHRoZXJlIG11c3QgYmUgYSBtYXNrIGVudHJ5LiAqLworCQkvKiBBbHNvLCB0aGUgcmVtYWluaW5nIGVudHJpZXMgYXJlIGZvciBuYW1lZCB1c2VycyBhbmQKKwkJICogZ3JvdXBzLCBhbmQgY29tZSBpbiB0aHJlZXMgKG1hc2ssIGFsbG93LCBkZW55KTogKi8KKwkJaWYgKG40YWNsLT5uYWNlcyA8IDcpCisJCQlyZXR1cm4gLTE7CisJCWlmICgobjRhY2wtPm5hY2VzIC0gNykgJSAzKQorCQkJcmV0dXJuIC0xOworCQlyZXR1cm4gNCArIChuNGFjbC0+bmFjZXMgLSA3KS8zOworCX0KK30KKworCitzdGF0aWMgc3RydWN0IHBvc2l4X2FjbCAqCitfbmZzdjRfdG9fcG9zaXhfb25lKHN0cnVjdCBuZnM0X2FjbCAqbjRhY2wsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgcG9zaXhfYWNsICpwYWNsOworCWludCBlcnJvciA9IC1FSU5WQUwsIG5hY2UgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IG5mczRfYWNlICptYXNrX2FjZSA9IE5VTEw7CisJc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqcGFjZTsKKworCW5hY2UgPSBjYWxjdWxhdGVfcG9zaXhfYWNlX2NvdW50KG40YWNsKTsKKwlpZiAobmFjZSA8IDApCisJCWdvdG8gb3V0X2VycjsKKworCXBhY2wgPSBwb3NpeF9hY2xfYWxsb2MobmFjZSwgR0ZQX0tFUk5FTCk7CisJZXJyb3IgPSAtRU5PTUVNOworCWlmIChwYWNsID09IE5VTEwpCisJCWdvdG8gb3V0X2VycjsKKworCXBhY2UgPSAmcGFjbC0+YV9lbnRyaWVzWzBdOworCXAgPSAmbjRhY2wtPmFjZV9oZWFkOworCisJZXJyb3IgPSB1c2VyX29ial9mcm9tX3Y0KG40YWNsLCAmcCwgcGFjbCwgJnBhY2UsIGZsYWdzKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2FjbDsKKworCWVycm9yID0gdXNlcnNfZnJvbV92NChuNGFjbCwgJnAsICZtYXNrX2FjZSwgcGFjbCwgJnBhY2UsIGZsYWdzKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2FjbDsKKworCWVycm9yID0gZ3JvdXBfb2JqX2FuZF9ncm91cHNfZnJvbV92NChuNGFjbCwgJnAsICZtYXNrX2FjZSwgcGFjbCwgJnBhY2UsCisJCQkJCQlmbGFncyk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9hY2w7CisKKwllcnJvciA9IG1hc2tfZnJvbV92NChuNGFjbCwgJnAsICZtYXNrX2FjZSwgcGFjbCwgJnBhY2UsIGZsYWdzKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2FjbDsKKwllcnJvciA9IG90aGVyX2Zyb21fdjQobjRhY2wsICZwLCBwYWNsLCAmcGFjZSwgZmxhZ3MpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfYWNsOworCisJZXJyb3IgPSAtRUlOVkFMOworCWlmIChwLT5uZXh0ICE9ICZuNGFjbC0+YWNlX2hlYWQpCisJCWdvdG8gb3V0X2FjbDsKKwlpZiAocGFjZSAhPSBwYWNsLT5hX2VudHJpZXMgKyBwYWNsLT5hX2NvdW50KQorCQlnb3RvIG91dF9hY2w7CisKKwlzb3J0X3BhY2wocGFjbCk7CisKKwlyZXR1cm4gcGFjbDsKK291dF9hY2w6CisJcG9zaXhfYWNsX3JlbGVhc2UocGFjbCk7CitvdXRfZXJyOgorCXBhY2wgPSBFUlJfUFRSKGVycm9yKTsKKwlyZXR1cm4gcGFjbDsKK30KKworaW50CituZnM0X2FjbF9zcGxpdChzdHJ1Y3QgbmZzNF9hY2wgKmFjbCwgc3RydWN0IG5mczRfYWNsICpkYWNsKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmgsICpuOworCXN0cnVjdCBuZnM0X2FjZSAqYWNlOworCWludCBlcnJvciA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoaCwgbiwgJmFjbC0+YWNlX2hlYWQpIHsKKwkJYWNlID0gbGlzdF9lbnRyeShoLCBzdHJ1Y3QgbmZzNF9hY2UsIGxfYWNlKTsKKworCQlpZiAoKGFjZS0+ZmxhZyAmIE5GUzRfSU5IRVJJVEFOQ0VfRkxBR1MpCisJCQkJIT0gTkZTNF9JTkhFUklUQU5DRV9GTEFHUykKKwkJCWNvbnRpbnVlOworCisJCWVycm9yID0gbmZzNF9hY2xfYWRkX2FjZShkYWNsLCBhY2UtPnR5cGUsIGFjZS0+ZmxhZywKKwkJCQlhY2UtPmFjY2Vzc19tYXNrLCBhY2UtPndob3R5cGUsIGFjZS0+d2hvKSA9PSAtMTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gb3V0OworCisJCWxpc3RfZGVsKGgpOworCQlrZnJlZShhY2UpOworCQlhY2wtPm5hY2VzLS07CisJfQorCitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgc2hvcnQKK2FjZTJ0eXBlKHN0cnVjdCBuZnM0X2FjZSAqYWNlKQoreworCXN3aXRjaCAoYWNlLT53aG90eXBlKSB7CisJCWNhc2UgTkZTNF9BQ0xfV0hPX05BTUVEOgorCQkJcmV0dXJuIChhY2UtPmZsYWcgJiBORlM0X0FDRV9JREVOVElGSUVSX0dST1VQID8KKwkJCQkJQUNMX0dST1VQIDogQUNMX1VTRVIpOworCQljYXNlIE5GUzRfQUNMX1dIT19PV05FUjoKKwkJCXJldHVybiBBQ0xfVVNFUl9PQko7CisJCWNhc2UgTkZTNF9BQ0xfV0hPX0dST1VQOgorCQkJcmV0dXJuIEFDTF9HUk9VUF9PQko7CisJCWNhc2UgTkZTNF9BQ0xfV0hPX0VWRVJZT05FOgorCQkJcmV0dXJuIEFDTF9PVEhFUjsKKwl9CisJQlVHKCk7CisJcmV0dXJuIC0xOworfQorCitFWFBPUlRfU1lNQk9MKG5mczRfYWNsX3Bvc2l4X3RvX25mc3Y0KTsKK0VYUE9SVF9TWU1CT0wobmZzNF9hY2xfbmZzdjRfdG9fcG9zaXgpOworCitzdHJ1Y3QgbmZzNF9hY2wgKgorbmZzNF9hY2xfbmV3KHZvaWQpCit7CisJc3RydWN0IG5mczRfYWNsICphY2w7CisKKwlpZiAoKGFjbCA9IGttYWxsb2Moc2l6ZW9mKCphY2wpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlhY2wtPm5hY2VzID0gMDsKKwlJTklUX0xJU1RfSEVBRCgmYWNsLT5hY2VfaGVhZCk7CisKKwlyZXR1cm4gYWNsOworfQorCit2b2lkCituZnM0X2FjbF9mcmVlKHN0cnVjdCBuZnM0X2FjbCAqYWNsKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmg7CisJc3RydWN0IG5mczRfYWNlICphY2U7CisKKwlpZiAoIWFjbCkKKwkJcmV0dXJuOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZhY2wtPmFjZV9oZWFkKSkgeworCQloID0gYWNsLT5hY2VfaGVhZC5uZXh0OworCQlsaXN0X2RlbChoKTsKKwkJYWNlID0gbGlzdF9lbnRyeShoLCBzdHJ1Y3QgbmZzNF9hY2UsIGxfYWNlKTsKKwkJa2ZyZWUoYWNlKTsKKwl9CisKKwlrZnJlZShhY2wpOworCisJcmV0dXJuOworfQorCitpbnQKK25mczRfYWNsX2FkZF9hY2Uoc3RydWN0IG5mczRfYWNsICphY2wsIHUzMiB0eXBlLCB1MzIgZmxhZywgdTMyIGFjY2Vzc19tYXNrLAorCQlpbnQgd2hvdHlwZSwgdWlkX3Qgd2hvKQoreworCXN0cnVjdCBuZnM0X2FjZSAqYWNlOworCisJaWYgKChhY2UgPSBrbWFsbG9jKHNpemVvZigqYWNlKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWFjZS0+dHlwZSA9IHR5cGU7CisJYWNlLT5mbGFnID0gZmxhZzsKKwlhY2UtPmFjY2Vzc19tYXNrID0gYWNjZXNzX21hc2s7CisJYWNlLT53aG90eXBlID0gd2hvdHlwZTsKKwlhY2UtPndobyA9IHdobzsKKworCWxpc3RfYWRkX3RhaWwoJmFjZS0+bF9hY2UsICZhY2wtPmFjZV9oZWFkKTsKKwlhY2wtPm5hY2VzKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB7CisJY2hhciAqc3RyaW5nOworCWludCAgIHN0cmluZ2xlbjsKKwlpbnQgdHlwZTsKK30gczJ0X21hcFtdID0geworCXsKKwkJLnN0cmluZyAgICA9ICJPV05FUkAiLAorCQkuc3RyaW5nbGVuID0gc2l6ZW9mKCJPV05FUkAiKSAtIDEsCisJCS50eXBlICAgICAgPSBORlM0X0FDTF9XSE9fT1dORVIsCisJfSwKKwl7CisJCS5zdHJpbmcgICAgPSAiR1JPVVBAIiwKKwkJLnN0cmluZ2xlbiA9IHNpemVvZigiR1JPVVBAIikgLSAxLAorCQkudHlwZSAgICAgID0gTkZTNF9BQ0xfV0hPX0dST1VQLAorCX0sCisJeworCQkuc3RyaW5nICAgID0gIkVWRVJZT05FQCIsCisJCS5zdHJpbmdsZW4gPSBzaXplb2YoIkVWRVJZT05FQCIpIC0gMSwKKwkJLnR5cGUgICAgICA9IE5GUzRfQUNMX1dIT19FVkVSWU9ORSwKKwl9LAorfTsKKworaW50CituZnM0X2FjbF9nZXRfd2hvdHlwZShjaGFyICpwLCB1MzIgbGVuKQoreworCWludCBpOworCisJZm9yIChpPTA7IGkgPCBzaXplb2YoczJ0X21hcCkgLyBzaXplb2YoKnMydF9tYXApOyBpKyspIHsKKwkJaWYgKHMydF9tYXBbaV0uc3RyaW5nbGVuID09IGxlbiAmJgorCQkJCTAgPT0gbWVtY21wKHMydF9tYXBbaV0uc3RyaW5nLCBwLCBsZW4pKQorCQkJcmV0dXJuIHMydF9tYXBbaV0udHlwZTsKKwl9CisJcmV0dXJuIE5GUzRfQUNMX1dIT19OQU1FRDsKK30KKworaW50CituZnM0X2FjbF93cml0ZV93aG8oaW50IHdobywgY2hhciAqcCkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpIDwgc2l6ZW9mKHMydF9tYXApIC8gc2l6ZW9mKCpzMnRfbWFwKTsgaSsrKSB7CisJCWlmIChzMnRfbWFwW2ldLnR5cGUgPT0gd2hvKSB7CisJCQltZW1jcHkocCwgczJ0X21hcFtpXS5zdHJpbmcsIHMydF9tYXBbaV0uc3RyaW5nbGVuKTsKKwkJCXJldHVybiBzMnRfbWFwW2ldLnN0cmluZ2xlbjsKKwkJfQorCX0KKwlCVUcoKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CittYXRjaF93aG8oc3RydWN0IG5mczRfYWNlICphY2UsIHVpZF90IG93bmVyLCBnaWRfdCBncm91cCwgdWlkX3Qgd2hvKQoreworCXN3aXRjaCAoYWNlLT53aG90eXBlKSB7CisJCWNhc2UgTkZTNF9BQ0xfV0hPX05BTUVEOgorCQkJcmV0dXJuIHdobyA9PSBhY2UtPndobzsKKwkJY2FzZSBORlM0X0FDTF9XSE9fT1dORVI6CisJCQlyZXR1cm4gd2hvID09IG93bmVyOworCQljYXNlIE5GUzRfQUNMX1dIT19HUk9VUDoKKwkJCXJldHVybiB3aG8gPT0gZ3JvdXA7CisJCWNhc2UgTkZTNF9BQ0xfV0hPX0VWRVJZT05FOgorCQkJcmV0dXJuIDE7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwl9Cit9CisKK0VYUE9SVF9TWU1CT0wobmZzNF9hY2xfbmV3KTsKK0VYUE9SVF9TWU1CT0wobmZzNF9hY2xfZnJlZSk7CitFWFBPUlRfU1lNQk9MKG5mczRfYWNsX2FkZF9hY2UpOworRVhQT1JUX1NZTUJPTChuZnM0X2FjbF9nZXRfd2hvdHlwZSk7CitFWFBPUlRfU1lNQk9MKG5mczRfYWNsX3dyaXRlX3dobyk7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRjYWxsYmFjay5jIGIvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzBkZTljCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYwpAQCAtMCwwICsxLDU0NyBAQAorLyoKKyAqICBsaW51eC9mcy9uZnNkL25mczRjYWxsYmFjay5jCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBLZW5kcmljayBTbWl0aCA8a21zbWl0aEB1bWljaC5lZHU+CisgKiAgQW5keSBBZGFtc29uIDxhbmRyb3NAdW1pY2guZWR1PgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMveGRyLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9zdGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L25mczQuaD4KKworI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZICAgICAgICAgICAgICAgIE5GU0REQkdfUFJPQworCisjZGVmaW5lIE5GU1BST0M0X0NCX05VTEwgMAorI2RlZmluZSBORlNQUk9DNF9DQl9DT01QT1VORCAxCisKKy8qIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIHZvaWQgbmZzNF9jYl9udWxsKHN0cnVjdCBycGNfdGFzayAqdGFzayk7CitleHRlcm4gc3BpbmxvY2tfdCByZWNhbGxfbG9jazsKKworLyogSW5kZXggb2YgcHJlZGVmaW5lZCBMaW51eCBjYWxsYmFjayBjbGllbnQgb3BlcmF0aW9ucyAqLworCitlbnVtIHsKKyAgICAgICAgTkZTUFJPQzRfQ0xOVF9DQl9OVUxMID0gMCwKKwlORlNQUk9DNF9DTE5UX0NCX1JFQ0FMTCwKK307CisKK2VudW0gbmZzX2NiX29wbnVtNCB7CisJT1BfQ0JfUkVDQUxMICAgICAgICAgICAgPSA0LAorfTsKKworI2RlZmluZSBORlM0X01BWFRBR0xFTgkJMjAKKworI2RlZmluZSBORlM0X2VuY19jYl9udWxsX3N6CQkwCisjZGVmaW5lIE5GUzRfZGVjX2NiX251bGxfc3oJCTAKKyNkZWZpbmUgY2JfY29tcG91bmRfZW5jX2hkcl9zegkJNAorI2RlZmluZSBjYl9jb21wb3VuZF9kZWNfaGRyX3N6CQkoMyArIChORlM0X01BWFRBR0xFTiA+PiAyKSkKKyNkZWZpbmUgb3BfZW5jX3N6CQkJMQorI2RlZmluZSBvcF9kZWNfc3oJCQkyCisjZGVmaW5lIGVuY19uZnM0X2ZoX3N6CQkJKDEgKyAoTkZTNF9GSFNJWkUgPj4gMikpCisjZGVmaW5lIGVuY19zdGF0ZWlkX3N6CQkJMTYKKyNkZWZpbmUgTkZTNF9lbmNfY2JfcmVjYWxsX3N6CQkoY2JfY29tcG91bmRfZW5jX2hkcl9zeiArICAgICAgIFwKKwkJCQkJMSArIGVuY19zdGF0ZWlkX3N6ICsgICAgICAgICAgICBcCisJCQkJCWVuY19uZnM0X2ZoX3N6KQorCisjZGVmaW5lIE5GUzRfZGVjX2NiX3JlY2FsbF9zegkJKGNiX2NvbXBvdW5kX2RlY19oZHJfc3ogICsgICAgICBcCisJCQkJCW9wX2RlY19zeikKKworLyoKKyogR2VuZXJpYyBlbmNvZGUgcm91dGluZXMgZnJvbSBmcy9uZnMvbmZzNHhkci5jCisqLworc3RhdGljIGlubGluZSB1MzIgKgoreGRyX3dyaXRlbWVtKHUzMiAqcCwgY29uc3Qgdm9pZCAqcHRyLCBpbnQgbmJ5dGVzKQoreworCWludCB0bXAgPSBYRFJfUVVBRExFTihuYnl0ZXMpOworCWlmICghdG1wKQorCQlyZXR1cm4gcDsKKwlwW3RtcC0xXSA9IDA7CisJbWVtY3B5KHAsIHB0ciwgbmJ5dGVzKTsKKwlyZXR1cm4gcCArIHRtcDsKK30KKworI2RlZmluZSBXUklURTMyKG4pICAgICAgICAgICAgICAgKnArKyA9IGh0b25sKG4pCisjZGVmaW5lIFdSSVRFTUVNKHB0cixuYnl0ZXMpICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXAgPSB4ZHJfd3JpdGVtZW0ocCwgcHRyLCBuYnl0ZXMpOyAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgUkVTRVJWRV9TUEFDRShuYnl0ZXMpICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgbmJ5dGVzKTsgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKCFwKSBkcHJpbnRrKCJORlNEOiBSRVNFUlZFX1NQQUNFKCVkKSBmYWlsZWQgaW4gZnVuY3Rpb24gJXNcbiIsIChpbnQpIChuYnl0ZXMpLCBfX0ZVTkNUSU9OX18pOyBcCisJQlVHX09OKCFwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKgorICogR2VuZXJpYyBkZWNvZGUgcm91dGluZXMgZnJvbSBmcy9uZnMvbmZzNHhkci5jCisgKi8KKyNkZWZpbmUgREVDT0RFX1RBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdGF0dXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorb3V0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCit4ZHJfZXJyb3I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZHByaW50aygiTkZTRDogeGRyIGVycm9yISAoJXM6JWQpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCisJc3RhdHVzID0gLUVJTzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlnb3RvIG91dAorCisjZGVmaW5lIFJFQUQzMih4KSAgICAgICAgICh4KSA9IG50b2hsKCpwKyspCisjZGVmaW5lIFJFQUQ2NCh4KSAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICBcCisJKHgpID0gKHU2NCludG9obCgqcCsrKSA8PCAzMjsgICAgICAgICAgIFwKKwkoeCkgfD0gbnRvaGwoKnArKyk7ICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgUkVBRFRJTUUoeCkgICAgICAgZG8geyAgICAgICAgICAgICAgICAgIFwKKwlwKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSh4LnR2X3NlYykgPSBudG9obCgqcCsrKTsgICAgICAgICAgICAgICBcCisJKHgudHZfbnNlYykgPSBudG9obCgqcCsrKTsgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFJFQURfQlVGKG5ieXRlcykgIGRvIHsgXAorCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIG5ieXRlcyk7IFwKKwlpZiAoIXApIHsgXAorCQlkcHJpbnRrKCJORlNEOiAlczogcmVwbHkgYnVmZmVyIG92ZXJmbG93ZWQgaW4gbGluZSAlZC4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAorCQlyZXR1cm4gLUVJTzsgXAorCX0gXAorfSB3aGlsZSAoMCkKKworc3RydWN0IG5mczRfY2JfY29tcG91bmRfaGRyIHsKKwlpbnQJCXN0YXR1czsKKwl1MzIJCWlkZW50OworCXUzMgkJbm9wczsKKwl1MzIJCXRhZ2xlbjsKKwljaGFyICoJCXRhZzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgeworaW50IHN0YXQ7CitpbnQgZXJybm87Cit9IG5mc19jYl9lcnJ0YmxbXSA9IHsKKwl7IE5GUzRfT0ssCQkwICAgICAgICAgICAgICAgfSwKKwl7IE5GUzRFUlJfUEVSTSwJCUVQRVJNICAgICAgICAgICB9LAorCXsgTkZTNEVSUl9OT0VOVCwJRU5PRU5UICAgICAgICAgIH0sCisJeyBORlM0RVJSX0lPLAkJRUlPICAgICAgICAgICAgIH0sCisJeyBORlM0RVJSX05YSU8sCQlFTlhJTyAgICAgICAgICAgfSwKKwl7IE5GUzRFUlJfQUNDRVNTLAlFQUNDRVMgICAgICAgICAgfSwKKwl7IE5GUzRFUlJfRVhJU1QsCUVFWElTVCAgICAgICAgICB9LAorCXsgTkZTNEVSUl9YREVWLAkJRVhERVYgICAgICAgICAgIH0sCisJeyBORlM0RVJSX05PVERJUiwJRU5PVERJUiAgICAgICAgIH0sCisJeyBORlM0RVJSX0lTRElSLAlFSVNESVIgICAgICAgICAgfSwKKwl7IE5GUzRFUlJfSU5WQUwsCUVJTlZBTCAgICAgICAgICB9LAorCXsgTkZTNEVSUl9GQklHLAkJRUZCSUcgICAgICAgICAgIH0sCisJeyBORlM0RVJSX05PU1BDLAlFTk9TUEMgICAgICAgICAgfSwKKwl7IE5GUzRFUlJfUk9GUywJCUVST0ZTICAgICAgICAgICB9LAorCXsgTkZTNEVSUl9NTElOSywJRU1MSU5LICAgICAgICAgIH0sCisJeyBORlM0RVJSX05BTUVUT09MT05HLAlFTkFNRVRPT0xPTkcgICAgfSwKKwl7IE5GUzRFUlJfTk9URU1QVFksCUVOT1RFTVBUWSAgICAgICB9LAorCXsgTkZTNEVSUl9EUVVPVCwJRURRVU9UICAgICAgICAgIH0sCisJeyBORlM0RVJSX1NUQUxFLAlFU1RBTEUgICAgICAgICAgfSwKKwl7IE5GUzRFUlJfQkFESEFORExFLAlFQkFESEFORExFICAgICAgfSwKKwl7IE5GUzRFUlJfQkFEX0NPT0tJRSwJRUJBRENPT0tJRSAgICAgIH0sCisJeyBORlM0RVJSX05PVFNVUFAsCUVOT1RTVVBQICAgICAgICB9LAorCXsgTkZTNEVSUl9UT09TTUFMTCwJRVRPT1NNQUxMICAgICAgIH0sCisJeyBORlM0RVJSX1NFUlZFUkZBVUxULAlFU0VSVkVSRkFVTFQgICAgfSwKKwl7IE5GUzRFUlJfQkFEVFlQRSwJRUJBRFRZUEUgICAgICAgIH0sCisJeyBORlM0RVJSX0xPQ0tFRCwJRUFHQUlOICAgICAgICAgIH0sCisJeyBORlM0RVJSX1JFU09VUkNFLAlFUkVNT1RFSU8gICAgICAgfSwKKwl7IE5GUzRFUlJfU1lNTElOSywJRUxPT1AgICAgICAgICAgIH0sCisJeyBORlM0RVJSX09QX0lMTEVHQUwsCUVPUE5PVFNVUFAgICAgICB9LAorCXsgTkZTNEVSUl9ERUFETE9DSywJRURFQURMSyAgICAgICAgIH0sCisJeyAtMSwgICAgICAgICAgICAgICAgICAgRUlPICAgICAgICAgICAgIH0KK307CisKK3N0YXRpYyBpbnQKK25mc19jYl9zdGF0X3RvX2Vycm5vKGludCBzdGF0KQoreworCWludCBpOworCWZvciAoaSA9IDA7IG5mc19jYl9lcnJ0YmxbaV0uc3RhdCAhPSAtMTsgaSsrKSB7CisJCWlmIChuZnNfY2JfZXJydGJsW2ldLnN0YXQgPT0gc3RhdCkKKwkJCXJldHVybiBuZnNfY2JfZXJydGJsW2ldLmVycm5vOworCX0KKwkvKiBJZiB3ZSBjYW5ub3QgdHJhbnNsYXRlIHRoZSBlcnJvciwgdGhlIHJlY292ZXJ5IHJvdXRpbmVzIHNob3VsZAorCSogaGFuZGxlIGl0LgorCSogTm90ZTogcmVtYWluaW5nIE5GU3Y0IGVycm9yIGNvZGVzIGhhdmUgdmFsdWVzID4gMTAwMDAsIHNvIHNob3VsZAorCSogbm90IGNvbmZsaWN0IHdpdGggbmF0aXZlIExpbnV4IGVycm9yIGNvZGVzLgorCSovCisJcmV0dXJuIHN0YXQ7Cit9CisKKy8qCisgKiBYRFIgZW5jb2RlCisgKi8KKworc3RhdGljIGludAorZW5jb2RlX2NiX2NvbXBvdW5kX2hkcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9jYl9jb21wb3VuZF9oZHIgKmhkcikKK3sKKwl1MzIgKiBwOworCisJUkVTRVJWRV9TUEFDRSgxNik7CisJV1JJVEUzMigwKTsgICAgICAgICAgICAvKiB0YWcgbGVuZ3RoIGlzIGFsd2F5cyAwICovCisJV1JJVEUzMihORlM0X01JTk9SX1ZFUlNJT04pOworCVdSSVRFMzIoaGRyLT5pZGVudCk7CisJV1JJVEUzMihoZHItPm5vcHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitlbmNvZGVfY2JfcmVjYWxsKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnM0X2NiX3JlY2FsbCAqY2JfcmVjKQoreworCXUzMiAqcDsKKwlpbnQgbGVuID0gY2JfcmVjLT5jYnJfZmhsZW47CisKKwlSRVNFUlZFX1NQQUNFKDEyK3NpemVvZihjYl9yZWMtPmNicl9zdGF0ZWlkKSArIGxlbik7CisJV1JJVEUzMihPUF9DQl9SRUNBTEwpOworCVdSSVRFTUVNKCZjYl9yZWMtPmNicl9zdGF0ZWlkLCBzaXplb2Yoc3RhdGVpZF90KSk7CisJV1JJVEUzMihjYl9yZWMtPmNicl90cnVuYyk7CisJV1JJVEUzMihsZW4pOworCVdSSVRFTUVNKGNiX3JlYy0+Y2JyX2ZodmFsLCBsZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CituZnM0X3hkcl9lbmNfY2JfbnVsbChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcnMsICp4ZHIgPSAmeGRyczsKKworCXhkcl9pbml0X2VuY29kZSgmeGRycywgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisgICAgICAgIFJFU0VSVkVfU1BBQ0UoMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25mczRfeGRyX2VuY19jYl9yZWNhbGwoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczRfY2JfcmVjYWxsICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgbmZzNF9jYl9jb21wb3VuZF9oZHIgaGRyID0geworCQkuaWRlbnQgPSBhcmdzLT5jYnJfaWRlbnQsCisJCS5ub3BzICAgPSAxLAorCX07CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJZW5jb2RlX2NiX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlyZXR1cm4gKGVuY29kZV9jYl9yZWNhbGwoJnhkciwgYXJncykpOworfQorCisKK3N0YXRpYyBpbnQKK2RlY29kZV9jYl9jb21wb3VuZF9oZHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mczRfY2JfY29tcG91bmRfaGRyICpoZHIpeworICAgICAgICB1MzIgKnA7CisKKyAgICAgICAgUkVBRF9CVUYoOCk7CisgICAgICAgIFJFQUQzMihoZHItPnN0YXR1cyk7CisgICAgICAgIFJFQUQzMihoZHItPnRhZ2xlbik7CisgICAgICAgIFJFQURfQlVGKGhkci0+dGFnbGVuICsgNCk7CisgICAgICAgIGhkci0+dGFnID0gKGNoYXIgKilwOworICAgICAgICBwICs9IFhEUl9RVUFETEVOKGhkci0+dGFnbGVuKTsKKyAgICAgICAgUkVBRDMyKGhkci0+bm9wcyk7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkZWNvZGVfY2Jfb3BfaGRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGVudW0gbmZzX29wbnVtNCBleHBlY3RlZCkKK3sKKwl1MzIgKnA7CisJdTMyIG9wOworCWludDMyX3QgbmZzZXJyOworCisJUkVBRF9CVUYoOCk7CisJUkVBRDMyKG9wKTsKKwlpZiAob3AgIT0gZXhwZWN0ZWQpIHsKKwkJZHByaW50aygiTkZTRDogZGVjb2RlX2NiX29wX2hkcjogQ2FsbGJhY2sgc2VydmVyIHJldHVybmVkICIKKwkJICAgICAgICAgIiBvcGVyYXRpb24gJWQgYnV0IHdlIGlzc3VlZCBhIHJlcXVlc3QgZm9yICVkXG4iLAorCQkgICAgICAgICBvcCwgZXhwZWN0ZWQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJUkVBRDMyKG5mc2Vycik7CisJaWYgKG5mc2VyciAhPSBORlNfT0spCisJCXJldHVybiAtbmZzX2NiX3N0YXRfdG9fZXJybm8obmZzZXJyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmZzNF94ZHJfZGVjX2NiX251bGwoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmZzNF94ZHJfZGVjX2NiX3JlY2FsbChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1MzIgKnApCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBuZnM0X2NiX2NvbXBvdW5kX2hkciBoZHI7CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOworCXN0YXR1cyA9IGRlY29kZV9jYl9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX2NiX29wX2hkcigmeGRyLCBPUF9DQl9SRUNBTEwpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBSUEMgcHJvY2VkdXJlIHRhYmxlcworICovCisjaWZuZGVmIE1BWAorIyBkZWZpbmUgTUFYKGEsIGIpICAgICAgKCgoYSkgPiAoYikpPyAoYSkgOiAoYikpCisjZW5kaWYKKworI2RlZmluZSBQUk9DKHByb2MsIGNhbGwsIGFyZ3R5cGUsIHJlc3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorW05GU1BST0M0X0NMTlRfIyNwcm9jXSA9IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisgICAgICAgIC5wX3Byb2MgICA9IE5GU1BST0M0X0NCXyMjY2FsbCwJCQkJCVwKKyAgICAgICAgLnBfZW5jb2RlID0gKGt4ZHJwcm9jX3QpIG5mczRfeGRyXyMjYXJndHlwZSwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLnBfZGVjb2RlID0gKGt4ZHJwcm9jX3QpIG5mczRfeGRyXyMjcmVzdHlwZSwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLnBfYnVmc2l6ID0gTUFYKE5GUzRfIyNhcmd0eXBlIyNfc3osTkZTNF8jI3Jlc3R5cGUjI19zeikgPDwgMiwgIFwKK30KKworc3RydWN0IHJwY19wcm9jaW5mbyAgICAgbmZzNF9jYl9wcm9jZWR1cmVzW10gPSB7CisgICAgUFJPQyhDQl9OVUxMLCAgICAgIE5VTEwsICAgICBlbmNfY2JfbnVsbCwgICAgIGRlY19jYl9udWxsKSwKKyAgICBQUk9DKENCX1JFQ0FMTCwgICAgQ09NUE9VTkQsICAgZW5jX2NiX3JlY2FsbCwgICAgICBkZWNfY2JfcmVjYWxsKSwKK307CisKK3N0cnVjdCBycGNfdmVyc2lvbiAgICAgICAgICAgICAgbmZzX2NiX3ZlcnNpb240ID0geworICAgICAgICAubnVtYmVyICAgICAgICAgICAgICAgICA9IDEsCisgICAgICAgIC5ucnByb2NzICAgICAgICAgICAgICAgID0gc2l6ZW9mKG5mczRfY2JfcHJvY2VkdXJlcykvc2l6ZW9mKG5mczRfY2JfcHJvY2VkdXJlc1swXSksCisgICAgICAgIC5wcm9jcyAgICAgICAgICAgICAgICAgID0gbmZzNF9jYl9wcm9jZWR1cmVzCit9OworCitzdGF0aWMgc3RydWN0IHJwY192ZXJzaW9uICoJbmZzX2NiX3ZlcnNpb25bXSA9IHsKKwlOVUxMLAorCSZuZnNfY2JfdmVyc2lvbjQsCit9OworCisvKgorICogVXNlIHRoZSBTRVRDTElFTlRJRCBjcmVkZW50aWFsCisgKi8KK3N0cnVjdCBycGNfY3JlZCAqCituZnNkNF9sb29rdXBjcmVkKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCBpbnQgdGFza2ZsYWdzKQoreworICAgICAgICBzdHJ1Y3QgYXV0aF9jcmVkIGFjcmVkOworCXN0cnVjdCBycGNfY2xudCAqY2xudCA9IGNscC0+Y2xfY2FsbGJhY2suY2JfY2xpZW50OworCXN0cnVjdCBycGNfY3JlZCAqcmV0OworCisgICAgICAgIGdldF9ncm91cF9pbmZvKGNscC0+Y2xfY3JlZC5jcl9ncm91cF9pbmZvKTsKKyAgICAgICAgYWNyZWQudWlkID0gY2xwLT5jbF9jcmVkLmNyX3VpZDsKKyAgICAgICAgYWNyZWQuZ2lkID0gY2xwLT5jbF9jcmVkLmNyX2dpZDsKKyAgICAgICAgYWNyZWQuZ3JvdXBfaW5mbyA9IGNscC0+Y2xfY3JlZC5jcl9ncm91cF9pbmZvOworCisgICAgICAgIGRwcmludGsoIk5GU0Q6ICAgICBsb29raW5nIHVwICVzIGNyZWRcbiIsCisgICAgICAgICAgICAgICAgY2xudC0+Y2xfYXV0aC0+YXVfb3BzLT5hdV9uYW1lKTsKKyAgICAgICAgcmV0ID0gcnBjYXV0aF9sb29rdXBfY3JlZGNhY2hlKGNsbnQtPmNsX2F1dGgsICZhY3JlZCwgdGFza2ZsYWdzKTsKKyAgICAgICAgcHV0X2dyb3VwX2luZm8oY2xwLT5jbF9jcmVkLmNyX2dyb3VwX2luZm8pOworICAgICAgICByZXR1cm4gcmV0OworfQorCisvKgorICogU2V0IHVwIHRoZSBjYWxsYmFjayBjbGllbnQgYW5kIHB1dCBhIE5GU1BST0M0X0NCX05VTEwgb24gdGhlIHdpcmUuLi4KKyAqLwordm9pZAorbmZzZDRfcHJvYmVfY2FsbGJhY2soc3RydWN0IG5mczRfY2xpZW50ICpjbHApCit7CisJc3RydWN0IHNvY2thZGRyX2luCWFkZHI7CisJc3RydWN0IG5mczRfY2FsbGJhY2sgICAgKmNiID0gJmNscC0+Y2xfY2FsbGJhY2s7CisJc3RydWN0IHJwY190aW1lb3V0CXRpbWVwYXJtczsKKwlzdHJ1Y3QgcnBjX3hwcnQgKgl4cHJ0OworCXN0cnVjdCBycGNfcHJvZ3JhbSAqCXByb2dyYW0gPSAmY2ItPmNiX3Byb2dyYW07CisJc3RydWN0IHJwY19zdGF0ICoJc3RhdCA9ICZjYi0+Y2Jfc3RhdDsKKwlzdHJ1Y3QgcnBjX2NsbnQgKgljbG50OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyAgICAgICA9ICZuZnM0X2NiX3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9DQl9OVUxMXSwKKwkJLnJwY19hcmdwICAgICAgID0gY2xwLAorCX07CisJY2hhciAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWVbMzJdOworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKCJORlNEOiBwcm9iZV9jYWxsYmFjay4gY2JfcGFyc2VkICVkIGNiX3NldCAlZFxuIiwKKwkJCWNiLT5jYl9wYXJzZWQsIGF0b21pY19yZWFkKCZjYi0+Y2Jfc2V0KSk7CisJaWYgKCFjYi0+Y2JfcGFyc2VkIHx8IGF0b21pY19yZWFkKCZjYi0+Y2Jfc2V0KSkKKwkJcmV0dXJuOworCisJLyogSW5pdGlhbGl6ZSBhZGRyZXNzICovCisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJYWRkci5zaW5fcG9ydCA9IGh0b25zKGNiLT5jYl9wb3J0KTsKKwlhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKGNiLT5jYl9hZGRyKTsKKworCS8qIEluaXRpYWxpemUgdGltZW91dCAqLworCXRpbWVwYXJtcy50b19pbml0dmFsID0gKE5GU0RfTEVBU0VfVElNRS80KSAqIEhaOworCXRpbWVwYXJtcy50b19yZXRyaWVzID0gMDsKKwl0aW1lcGFybXMudG9fbWF4dmFsID0gKE5GU0RfTEVBU0VfVElNRS8yKSAqIEhaOworCXRpbWVwYXJtcy50b19leHBvbmVudGlhbCA9IDE7CisKKwkvKiBDcmVhdGUgUlBDIHRyYW5zcG9ydCAqLworCWlmICghKHhwcnQgPSB4cHJ0X2NyZWF0ZV9wcm90byhJUFBST1RPX1RDUCwgJmFkZHIsICZ0aW1lcGFybXMpKSkgeworCQlkcHJpbnRrKCJORlNEOiBjb3VsZG4ndCBjcmVhdGUgY2FsbGJhY2sgdHJhbnNwb3J0IVxuIik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwkvKiBJbml0aWFsaXplIHJwY19wcm9ncmFtICovCisJcHJvZ3JhbS0+bmFtZSA9ICJuZnM0X2NiIjsKKwlwcm9ncmFtLT5udW1iZXIgPSBjYi0+Y2JfcHJvZzsKKwlwcm9ncmFtLT5ucnZlcnMgPSBzaXplb2YobmZzX2NiX3ZlcnNpb24pL3NpemVvZihuZnNfY2JfdmVyc2lvblswXSk7CisJcHJvZ3JhbS0+dmVyc2lvbiA9IG5mc19jYl92ZXJzaW9uOworCXByb2dyYW0tPnN0YXRzID0gc3RhdDsKKworCS8qIEluaXRpYWxpemUgcnBjX3N0YXQgKi8KKwltZW1zZXQoc3RhdCwgMCwgc2l6ZW9mKHN0cnVjdCBycGNfc3RhdCkpOworCXN0YXQtPnByb2dyYW0gPSBwcm9ncmFtOworCisJLyogQ3JlYXRlIFJQQyBjbGllbnQKKyAJICoKKwkgKiBYWFggQVVUSF9VTklYIG9ubHkgLSBuZWVkIEFVVEhfR1NTLi4uLgorCSAqLworCXNwcmludGYoaG9zdG5hbWUsICIldS4ldS4ldS4ldSIsIE5JUFFVQUQoYWRkci5zaW5fYWRkci5zX2FkZHIpKTsKKwlpZiAoIShjbG50ID0gcnBjX2NyZWF0ZV9jbGllbnQoeHBydCwgaG9zdG5hbWUsIHByb2dyYW0sIDEsIFJQQ19BVVRIX1VOSVgpKSkgeworCQlkcHJpbnRrKCJORlNEOiBjb3VsZG4ndCBjcmVhdGUgY2FsbGJhY2sgY2xpZW50XG4iKTsKKwkJZ290byBvdXRfeHBydDsKKwl9CisJY2xudC0+Y2xfaW50ciA9IDA7CisJY2xudC0+Y2xfc29mdHJ0cnkgPSAxOworCWNsbnQtPmNsX2NoYXR0eSA9IDE7CisKKwkvKiBLaWNrIHJwY2lvZCwgcHV0IHRoZSBjYWxsIG9uIHRoZSB3aXJlLiAqLworCisJaWYgKHJwY2lvZF91cCgpICE9IDApIHsKKwkJZHByaW50aygibmZzZDogY291bGRuJ3Qgc3RhcnQgcnBjaW9kIGZvciBjYWxsYmFja3MhXG4iKTsKKwkJZ290byBvdXRfY2xudDsKKwl9CisKKwkvKiB0aGUgdGFzayBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgbmZzNF9jbGllbnQgc3RydWN0ICovCisJY2ItPmNiX2NsaWVudCA9IGNsbnQ7CisJYXRvbWljX2luYygmY2xwLT5jbF9jb3VudCk7CisKKwltc2cucnBjX2NyZWQgPSBuZnNkNF9sb29rdXBjcmVkKGNscCwwKTsKKwlpZiAoSVNfRVJSKG1zZy5ycGNfY3JlZCkpCisJCWdvdG8gb3V0X3JwY2lvZDsKKwlzdGF0dXMgPSBycGNfY2FsbF9hc3luYyhjbG50LCAmbXNnLCBSUENfVEFTS19BU1lOQywgbmZzNF9jYl9udWxsLCBOVUxMKTsKKwlwdXRfcnBjY3JlZChtc2cucnBjX2NyZWQpOworCisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWRwcmludGsoIk5GU0Q6IGFzeW5jaHJvbm91cyBORlNQUk9DNF9DQl9OVUxMIGZhaWxlZCFcbiIpOworCQlnb3RvIG91dF9ycGNpb2Q7CisJfQorCXJldHVybjsKKworb3V0X3JwY2lvZDoKKwlhdG9taWNfZGVjKCZjbHAtPmNsX2NvdW50KTsKKwlycGNpb2RfZG93bigpOworb3V0X2NsbnQ6CisJcnBjX3NodXRkb3duX2NsaWVudChjbG50KTsKKwlnb3RvIG91dF9lcnI7CitvdXRfeHBydDoKKwl4cHJ0X2Rlc3Ryb3koeHBydCk7CitvdXRfZXJyOgorCWRwcmludGsoIk5GU0Q6IHdhcm5pbmc6IG5vIGNhbGxiYWNrIHBhdGggdG8gY2xpZW50ICUuKnNcbiIsCisJCShpbnQpY2xwLT5jbF9uYW1lLmxlbiwgY2xwLT5jbF9uYW1lLmRhdGEpOworCWNiLT5jYl9jbGllbnQgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorbmZzNF9jYl9udWxsKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IChzdHJ1Y3QgbmZzNF9jbGllbnQgKil0YXNrLT50a19tc2cucnBjX2FyZ3A7CisJc3RydWN0IG5mczRfY2FsbGJhY2sgKmNiID0gJmNscC0+Y2xfY2FsbGJhY2s7CisJdTMyIGFkZHIgPSBodG9ubChjYi0+Y2JfYWRkcik7CisKKwlkcHJpbnRrKCJORlNEOiBuZnM0X2NiX251bGwgdGFzay0+dGtfc3RhdHVzICVkXG4iLCB0YXNrLT50a19zdGF0dXMpOworCisJaWYgKHRhc2stPnRrX3N0YXR1cyA8IDApIHsKKwkJZHByaW50aygiTkZTRDogY2FsbGJhY2sgZXN0YWJsaXNobWVudCB0byBjbGllbnQgJS4qcyBmYWlsZWRcbiIsCisJCQkoaW50KWNscC0+Y2xfbmFtZS5sZW4sIGNscC0+Y2xfbmFtZS5kYXRhKTsKKwkJZ290byBvdXQ7CisJfQorCWF0b21pY19zZXQoJmNiLT5jYl9zZXQsIDEpOworCWRwcmludGsoIk5GU0Q6IGNhbGxiYWNrIHNldCB0byBjbGllbnQgJXUuJXUuJXUuJXVcbiIsIE5JUFFVQUQoYWRkcikpOworb3V0OgorCXB1dF9uZnM0X2NsaWVudChjbHApOworfQorCisvKgorICogY2FsbGVkIHdpdGggZHAtPmRsX2NvdW50IGluYydlZC4KKyAqIG5mczRfbG9ja19zdGF0ZSgpIG1heSBvciBtYXkgbm90IGhhdmUgYmVlbiBjYWxsZWQuCisgKi8KK3ZvaWQKK25mc2Q0X2NiX3JlY2FsbChzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcCkKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IGRwLT5kbF9jbGllbnQ7CisJc3RydWN0IHJwY19jbG50ICpjbG50ID0gY2xwLT5jbF9jYWxsYmFjay5jYl9jbGllbnQ7CisJc3RydWN0IG5mczRfY2JfcmVjYWxsICpjYnIgPSAmZHAtPmRsX3JlY2FsbDsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9jYl9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfQ0JfUkVDQUxMXSwKKwkJLnJwY19hcmdwID0gY2JyLAorCX07CisJaW50IHJldHJpZXMgPSAxOworCWludCBzdGF0dXMgPSAwOworCisJaWYgKCghYXRvbWljX3JlYWQoJmNscC0+Y2xfY2FsbGJhY2suY2Jfc2V0KSkgfHwgIWNsbnQpCisJCXJldHVybjsKKworCW1zZy5ycGNfY3JlZCA9IG5mc2Q0X2xvb2t1cGNyZWQoY2xwLCAwKTsKKwlpZiAoSVNfRVJSKG1zZy5ycGNfY3JlZCkpCisJCWdvdG8gb3V0OworCisJY2JyLT5jYnJfdHJ1bmMgPSAwOyAvKiBYWFggbmVlZCB0byBpbXBsZW1lbnQgdHJ1bmNhdGUgb3B0aW1pemF0aW9uICovCisJY2JyLT5jYnJfZHAgPSBkcDsKKworCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoY2xudCwgJm1zZywgUlBDX1RBU0tfU09GVCk7CisJd2hpbGUgKHJldHJpZXMtLSkgeworCQlzd2l0Y2ggKHN0YXR1cykgeworCQkJY2FzZSAtRUlPOgorCQkJCS8qIE5ldHdvcmsgcGFydGl0aW9uPyAqLworCQkJY2FzZSAtRUJBREhBTkRMRToKKwkJCWNhc2UgLU5GUzRFUlJfQkFEX1NUQVRFSUQ6CisJCQkJLyogUmFjZTogY2xpZW50IHByb2JhYmx5IGdvdCBjYl9yZWNhbGwKKwkJCQkgKiBiZWZvcmUgb3BlbiByZXBseSBncmFudGluZyBkZWxlZ2F0aW9uICovCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gb3V0X3B1dF9jcmVkOworCQl9CisJCXNzbGVlcCgyKTsKKwkJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhjbG50LCAmbXNnLCBSUENfVEFTS19TT0ZUKTsKKwl9CitvdXRfcHV0X2NyZWQ6CisJcHV0X3JwY2NyZWQobXNnLnJwY19jcmVkKTsKK291dDoKKwlpZiAoc3RhdHVzID09IC1FSU8pCisJCWF0b21pY19zZXQoJmNscC0+Y2xfY2FsbGJhY2suY2Jfc2V0LCAwKTsKKwkvKiBTdWNjZXNzIG9yIGZhaWx1cmUsIG5vdyB3ZSdyZSBlaXRoZXIgd2FpdGluZyBmb3IgbGVhc2UgZXhwaXJhdGlvbgorCSAqIG9yIGRlbGVnX3JldHVybi4gKi8KKwlkcHJpbnRrKCJORlNEOiBuZnM0X2NiX3JlY2FsbDogZHAgJXAgZGxfZmxvY2sgJXAgZGxfY291bnQgJWRcbiIsZHAsIGRwLT5kbF9mbG9jaywgYXRvbWljX3JlYWQoJmRwLT5kbF9jb3VudCkpOworCW5mczRfcHV0X2RlbGVnYXRpb24oZHApOworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNGlkbWFwLmMgYi9mcy9uZnNkL25mczRpZG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYTU0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnNkL25mczRpZG1hcC5jCkBAIC0wLDAgKzEsNTg4IEBACisvKgorICogIGZzL25mc2QvbmZzNGlkbWFwLmMKKyAqCisgKiAgTWFwcGluZyBvZiBVSUQvR0lEcyB0byBuYW1lIGFuZCB2aWNlIHZlcnNhLgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YKKyAqICBNaWNoaWdhbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIE1hcml1cyBBYW1vZHQgRXJpa3NlbiA8bWFyaXVzQHVtaWNoLmVkdT4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqCisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiAgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L25mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mczQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfcGFnZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZF9pZG1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNhdXRoLmg+CisKKy8qCisgKiBDYWNoZSBlbnRyeQorICovCisKKy8qCisgKiBYWFggd2Uga25vdyB0aGF0IElETUFQX05BTUVTWiA8IFBBR0VfU0laRSwgYnV0IGl0J3MgdWdseSB0byByZWx5IG9uCisgKiB0aGF0LgorICovCisKKyNkZWZpbmUgSURNQVBfVFlQRV9VU0VSICAwCisjZGVmaW5lIElETUFQX1RZUEVfR1JPVVAgMQorCitzdHJ1Y3QgZW50IHsKKwlzdHJ1Y3QgY2FjaGVfaGVhZCBoOworCWludCAgICAgICAgICAgICAgIHR5cGU7CQkgICAgICAgLyogVXNlciAvIEdyb3VwICovCisJdWlkX3QgICAgICAgICAgICAgaWQ7CisJY2hhciAgICAgICAgICAgICAgbmFtZVtJRE1BUF9OQU1FU1pdOworCWNoYXIgICAgICAgICAgICAgIGF1dGhuYW1lW0lETUFQX05BTUVTWl07Cit9OworCisjZGVmaW5lIERlZmluZVNpbXBsZUNhY2hlTG9va3VwTWFwKFNUUlVDVCwgRlVOQykJCQlcCisgICAgICAgIERlZmluZUNhY2hlTG9va3VwKHN0cnVjdCBTVFJVQ1QsIGgsIEZVTkMjI19sb29rdXAsCQlcCisgICAgICAgIChzdHJ1Y3QgU1RSVUNUICppdGVtLCBpbnQgc2V0KSwgLypubyBzZXR1cCAqLywJCQlcCisJJiBGVU5DIyNfY2FjaGUsIEZVTkMjI19oYXNoKGl0ZW0pLCBGVU5DIyNfbWF0Y2goaXRlbSwgdG1wKSwJXAorCVNUUlVDVCMjX2luaXQobmV3LCBpdGVtKSwgU1RSVUNUIyNfdXBkYXRlKHRtcCwgaXRlbSksIDApCisKKy8qIENvbW1vbiBlbnRyeSBoYW5kbGluZyAqLworCisjZGVmaW5lIEVOVF9IQVNIQklUUyAgICAgICAgICA4CisjZGVmaW5lIEVOVF9IQVNITUFYICAgICAgICAgICAoMSA8PCBFTlRfSEFTSEJJVFMpCisjZGVmaW5lIEVOVF9IQVNITUFTSyAgICAgICAgICAoRU5UX0hBU0hNQVggLSAxKQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2VudF9pbml0KHN0cnVjdCBlbnQgKm5ldywgc3RydWN0IGVudCAqaXRtKQoreworCW5ldy0+aWQgPSBpdG0tPmlkOworCW5ldy0+dHlwZSA9IGl0bS0+dHlwZTsKKworCXN0cmxjcHkobmV3LT5uYW1lLCBpdG0tPm5hbWUsIHNpemVvZihuZXctPm5hbWUpKTsKKwlzdHJsY3B5KG5ldy0+YXV0aG5hbWUsIGl0bS0+YXV0aG5hbWUsIHNpemVvZihuZXctPm5hbWUpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitlbnRfdXBkYXRlKHN0cnVjdCBlbnQgKm5ldywgc3RydWN0IGVudCAqaXRtKQoreworCWVudF9pbml0KG5ldywgaXRtKTsKK30KKwordm9pZAorZW50X3B1dChzdHJ1Y3QgY2FjaGVfaGVhZCAqY2gsIHN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkKQoreworCWlmIChjYWNoZV9wdXQoY2gsIGNkKSkgeworCQlzdHJ1Y3QgZW50ICptYXAgPSBjb250YWluZXJfb2YoY2gsIHN0cnVjdCBlbnQsIGgpOworCQlrZnJlZShtYXApOworCX0KK30KKworLyoKKyAqIElEIC0+IE5hbWUgY2FjaGUKKyAqLworCitzdGF0aWMgc3RydWN0IGNhY2hlX2hlYWQgKmlkdG9uYW1lX3RhYmxlW0VOVF9IQVNITUFYXTsKKworc3RhdGljIHVpbnQzMl90CitpZHRvbmFtZV9oYXNoKHN0cnVjdCBlbnQgKmVudCkKK3sKKwl1aW50MzJfdCBoYXNoOworCisJaGFzaCA9IGhhc2hfc3RyKGVudC0+YXV0aG5hbWUsIEVOVF9IQVNIQklUUyk7CisJaGFzaCA9IGhhc2hfbG9uZyhoYXNoIF4gZW50LT5pZCwgRU5UX0hBU0hCSVRTKTsKKworCS8qIEZsaXAgTFNCIGZvciB1c2VyL2dyb3VwICovCisJaWYgKGVudC0+dHlwZSA9PSBJRE1BUF9UWVBFX0dST1VQKQorCQloYXNoIF49IDE7CisKKwlyZXR1cm4gaGFzaDsKK30KKworc3RhdGljIHZvaWQKK2lkdG9uYW1lX3JlcXVlc3Qoc3RydWN0IGNhY2hlX2RldGFpbCAqY2QsIHN0cnVjdCBjYWNoZV9oZWFkICpjaCwgY2hhciAqKmJwcCwKKyAgICBpbnQgKmJsZW4pCit7CisgCXN0cnVjdCBlbnQgKmVudCA9IGNvbnRhaW5lcl9vZihjaCwgc3RydWN0IGVudCwgaCk7CisJY2hhciBpZHN0clsxMV07CisKKwlxd29yZF9hZGQoYnBwLCBibGVuLCBlbnQtPmF1dGhuYW1lKTsKKwlzbnByaW50ZihpZHN0ciwgc2l6ZW9mKGlkc3RyKSwgIiVkIiwgZW50LT5pZCk7CisJcXdvcmRfYWRkKGJwcCwgYmxlbiwgZW50LT50eXBlID09IElETUFQX1RZUEVfR1JPVVAgPyAiZ3JvdXAiIDogInVzZXIiKTsKKwlxd29yZF9hZGQoYnBwLCBibGVuLCBpZHN0cik7CisKKwkoKmJwcClbLTFdID0gJ1xuJzsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lkdG9uYW1lX21hdGNoKHN0cnVjdCBlbnQgKmEsIHN0cnVjdCBlbnQgKmIpCit7CisJcmV0dXJuIChhLT5pZCA9PSBiLT5pZCAmJiBhLT50eXBlID09IGItPnR5cGUgJiYKKwkgICAgc3RyY21wKGEtPmF1dGhuYW1lLCBiLT5hdXRobmFtZSkgPT0gMCk7Cit9CisKK3N0YXRpYyBpbnQKK2lkdG9uYW1lX3Nob3coc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCwgc3RydWN0IGNhY2hlX2hlYWQgKmgpCit7CisJc3RydWN0IGVudCAqZW50OworCisJaWYgKGggPT0gTlVMTCkgeworCQlzZXFfcHV0cyhtLCAiI2RvbWFpbiB0eXBlIGlkIFtuYW1lXVxuIik7CisJCXJldHVybiAwOworCX0KKwllbnQgPSBjb250YWluZXJfb2YoaCwgc3RydWN0IGVudCwgaCk7CisJc2VxX3ByaW50ZihtLCAiJXMgJXMgJWQiLCBlbnQtPmF1dGhuYW1lLAorCQkJZW50LT50eXBlID09IElETUFQX1RZUEVfR1JPVVAgPyAiZ3JvdXAiIDogInVzZXIiLAorCQkJZW50LT5pZCk7CisJaWYgKHRlc3RfYml0KENBQ0hFX1ZBTElELCAmaC0+ZmxhZ3MpKQorCQlzZXFfcHJpbnRmKG0sICIgJXMiLCBlbnQtPm5hbWUpOworCXNlcV9wcmludGYobSwgIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit3YXJuX25vX2lkbWFwZChzdHJ1Y3QgY2FjaGVfZGV0YWlsICpkZXRhaWwpCit7CisJcHJpbnRrKCJuZnNkOiBuZnN2NCBpZG1hcHBpbmcgZmFpbGluZzogaGFzIGlkbWFwZCAlcz9cbiIsCisJCQlkZXRhaWwtPmxhc3RfY2xvc2U/ICJkaWVkIiA6ICJub3QgYmVlbiBzdGFydGVkIik7Cit9CisKKworc3RhdGljIGludCAgICAgICAgIGlkdG9uYW1lX3BhcnNlKHN0cnVjdCBjYWNoZV9kZXRhaWwgKiwgY2hhciAqLCBpbnQpOworc3RhdGljIHN0cnVjdCBlbnQgKmlkdG9uYW1lX2xvb2t1cChzdHJ1Y3QgZW50ICosIGludCk7CisKK3N0cnVjdCBjYWNoZV9kZXRhaWwgaWR0b25hbWVfY2FjaGUgPSB7CisJLmhhc2hfc2l6ZQk9IEVOVF9IQVNITUFYLAorCS5oYXNoX3RhYmxlCT0gaWR0b25hbWVfdGFibGUsCisJLm5hbWUJCT0gIm5mczQuaWR0b25hbWUiLAorCS5jYWNoZV9wdXQJPSBlbnRfcHV0LAorCS5jYWNoZV9yZXF1ZXN0CT0gaWR0b25hbWVfcmVxdWVzdCwKKwkuY2FjaGVfcGFyc2UJPSBpZHRvbmFtZV9wYXJzZSwKKwkuY2FjaGVfc2hvdwk9IGlkdG9uYW1lX3Nob3csCisJLndhcm5fbm9fbGlzdGVuZXIgPSB3YXJuX25vX2lkbWFwZCwKK307CisKK2ludAoraWR0b25hbWVfcGFyc2Uoc3RydWN0IGNhY2hlX2RldGFpbCAqY2QsIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwlzdHJ1Y3QgZW50IGVudCwgKnJlczsKKwljaGFyICpidWYxLCAqYnA7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKworCWlmIChidWZbYnVmbGVuIC0gMV0gIT0gJ1xuJykKKwkJcmV0dXJuICgtRUlOVkFMKTsKKwlidWZbYnVmbGVuIC0gMV09ICdcMCc7CisKKwlidWYxID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWlmIChidWYxID09IE5VTEwpCisJCXJldHVybiAoLUVOT01FTSk7CisKKwltZW1zZXQoJmVudCwgMCwgc2l6ZW9mKGVudCkpOworCisJLyogQXV0aGVudGljYXRpb24gbmFtZSAqLworCWlmIChxd29yZF9nZXQoJmJ1ZiwgYnVmMSwgUEFHRV9TSVpFKSA8PSAwKQorCQlnb3RvIG91dDsKKwltZW1jcHkoZW50LmF1dGhuYW1lLCBidWYxLCBzaXplb2YoZW50LmF1dGhuYW1lKSk7CisKKwkvKiBUeXBlICovCisJaWYgKHF3b3JkX2dldCgmYnVmLCBidWYxLCBQQUdFX1NJWkUpIDw9IDApCisJCWdvdG8gb3V0OworCWVudC50eXBlID0gc3RyY21wKGJ1ZjEsICJ1c2VyIikgPT0gMCA/CisJCUlETUFQX1RZUEVfVVNFUiA6IElETUFQX1RZUEVfR1JPVVA7CisKKwkvKiBJRCAqLworCWlmIChxd29yZF9nZXQoJmJ1ZiwgYnVmMSwgUEFHRV9TSVpFKSA8PSAwKQorCQlnb3RvIG91dDsKKwllbnQuaWQgPSBzaW1wbGVfc3RydG91bChidWYxLCAmYnAsIDEwKTsKKwlpZiAoYnAgPT0gYnVmMSkKKwkJZ290byBvdXQ7CisKKwkvKiBleHBpcnkgKi8KKwllbnQuaC5leHBpcnlfdGltZSA9IGdldF9leHBpcnkoJmJ1Zik7CisJaWYgKGVudC5oLmV4cGlyeV90aW1lID09IDApCisJCWdvdG8gb3V0OworCisJLyogTmFtZSAqLworCWVycm9yID0gcXdvcmRfZ2V0KCZidWYsIGJ1ZjEsIFBBR0VfU0laRSk7CisJaWYgKGVycm9yID09IC1FSU5WQUwpCisJCWdvdG8gb3V0OworCWlmIChlcnJvciA9PSAtRU5PRU5UKQorCQlzZXRfYml0KENBQ0hFX05FR0FUSVZFLCAmZW50LmguZmxhZ3MpOworCWVsc2UgeworCQlpZiAoZXJyb3IgPj0gSURNQVBfTkFNRVNaKSB7CisJCQllcnJvciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQltZW1jcHkoZW50Lm5hbWUsIGJ1ZjEsIHNpemVvZihlbnQubmFtZSkpOworCX0KKwllcnJvciA9IC1FTk9NRU07CisJaWYgKChyZXMgPSBpZHRvbmFtZV9sb29rdXAoJmVudCwgMSkpID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJZW50X3B1dCgmcmVzLT5oLCAmaWR0b25hbWVfY2FjaGUpOworCisJZXJyb3IgPSAwOworb3V0OgorCWtmcmVlKGJ1ZjEpOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgRGVmaW5lU2ltcGxlQ2FjaGVMb29rdXBNYXAoZW50LCBpZHRvbmFtZSk7CisKKy8qCisgKiBOYW1lIC0+IElEIGNhY2hlCisgKi8KKworc3RhdGljIHN0cnVjdCBjYWNoZV9oZWFkICpuYW1ldG9pZF90YWJsZVtFTlRfSEFTSE1BWF07CisKK3N0YXRpYyBpbmxpbmUgaW50CituYW1ldG9pZF9oYXNoKHN0cnVjdCBlbnQgKmVudCkKK3sKKwlyZXR1cm4gaGFzaF9zdHIoZW50LT5uYW1lLCBFTlRfSEFTSEJJVFMpOworfQorCit2b2lkCituYW1ldG9pZF9yZXF1ZXN0KHN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkLCBzdHJ1Y3QgY2FjaGVfaGVhZCAqY2gsIGNoYXIgKipicHAsCisgICAgaW50ICpibGVuKQoreworIAlzdHJ1Y3QgZW50ICplbnQgPSBjb250YWluZXJfb2YoY2gsIHN0cnVjdCBlbnQsIGgpOworCisJcXdvcmRfYWRkKGJwcCwgYmxlbiwgZW50LT5hdXRobmFtZSk7CisJcXdvcmRfYWRkKGJwcCwgYmxlbiwgZW50LT50eXBlID09IElETUFQX1RZUEVfR1JPVVAgPyAiZ3JvdXAiIDogInVzZXIiKTsKKwlxd29yZF9hZGQoYnBwLCBibGVuLCBlbnQtPm5hbWUpOworCisJKCpicHApWy0xXSA9ICdcbic7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituYW1ldG9pZF9tYXRjaChzdHJ1Y3QgZW50ICphLCBzdHJ1Y3QgZW50ICpiKQoreworCXJldHVybiAoYS0+dHlwZSA9PSBiLT50eXBlICYmIHN0cmNtcChhLT5uYW1lLCBiLT5uYW1lKSA9PSAwICYmCisJICAgIHN0cmNtcChhLT5hdXRobmFtZSwgYi0+YXV0aG5hbWUpID09IDApOworfQorCitzdGF0aWMgaW50CituYW1ldG9pZF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGNhY2hlX2RldGFpbCAqY2QsIHN0cnVjdCBjYWNoZV9oZWFkICpoKQoreworCXN0cnVjdCBlbnQgKmVudDsKKworCWlmIChoID09IE5VTEwpIHsKKwkJc2VxX3B1dHMobSwgIiNkb21haW4gdHlwZSBuYW1lIFtpZF1cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJZW50ID0gY29udGFpbmVyX29mKGgsIHN0cnVjdCBlbnQsIGgpOworCXNlcV9wcmludGYobSwgIiVzICVzICVzIiwgZW50LT5hdXRobmFtZSwKKwkJCWVudC0+dHlwZSA9PSBJRE1BUF9UWVBFX0dST1VQID8gImdyb3VwIiA6ICJ1c2VyIiwKKwkJCWVudC0+bmFtZSk7CisJaWYgKHRlc3RfYml0KENBQ0hFX1ZBTElELCAmaC0+ZmxhZ3MpKQorCQlzZXFfcHJpbnRmKG0sICIgJWQiLCBlbnQtPmlkKTsKKwlzZXFfcHJpbnRmKG0sICJcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVudCAqbmFtZXRvaWRfbG9va3VwKHN0cnVjdCBlbnQgKiwgaW50KTsKK2ludCAgICAgICAgICAgICAgICBuYW1ldG9pZF9wYXJzZShzdHJ1Y3QgY2FjaGVfZGV0YWlsICosIGNoYXIgKiwgaW50KTsKKworc3RydWN0IGNhY2hlX2RldGFpbCBuYW1ldG9pZF9jYWNoZSA9IHsKKwkuaGFzaF9zaXplCT0gRU5UX0hBU0hNQVgsCisJLmhhc2hfdGFibGUJPSBuYW1ldG9pZF90YWJsZSwKKwkubmFtZQkJPSAibmZzNC5uYW1ldG9pZCIsCisJLmNhY2hlX3B1dAk9IGVudF9wdXQsCisJLmNhY2hlX3JlcXVlc3QJPSBuYW1ldG9pZF9yZXF1ZXN0LAorCS5jYWNoZV9wYXJzZQk9IG5hbWV0b2lkX3BhcnNlLAorCS5jYWNoZV9zaG93CT0gbmFtZXRvaWRfc2hvdywKKwkud2Fybl9ub19saXN0ZW5lciA9IHdhcm5fbm9faWRtYXBkLAorfTsKKworaW50CituYW1ldG9pZF9wYXJzZShzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQoreworCXN0cnVjdCBlbnQgZW50LCAqcmVzOworCWNoYXIgKmJ1ZjE7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKworCWlmIChidWZbYnVmbGVuIC0gMV0gIT0gJ1xuJykKKwkJcmV0dXJuICgtRUlOVkFMKTsKKwlidWZbYnVmbGVuIC0gMV09ICdcMCc7CisKKwlidWYxID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWlmIChidWYxID09IE5VTEwpCisJCXJldHVybiAoLUVOT01FTSk7CisKKwltZW1zZXQoJmVudCwgMCwgc2l6ZW9mKGVudCkpOworCisJLyogQXV0aGVudGljYXRpb24gbmFtZSAqLworCWlmIChxd29yZF9nZXQoJmJ1ZiwgYnVmMSwgUEFHRV9TSVpFKSA8PSAwKQorCQlnb3RvIG91dDsKKwltZW1jcHkoZW50LmF1dGhuYW1lLCBidWYxLCBzaXplb2YoZW50LmF1dGhuYW1lKSk7CisKKwkvKiBUeXBlICovCisJaWYgKHF3b3JkX2dldCgmYnVmLCBidWYxLCBQQUdFX1NJWkUpIDw9IDApCisJCWdvdG8gb3V0OworCWVudC50eXBlID0gc3RyY21wKGJ1ZjEsICJ1c2VyIikgPT0gMCA/CisJCUlETUFQX1RZUEVfVVNFUiA6IElETUFQX1RZUEVfR1JPVVA7CisKKwkvKiBOYW1lICovCisJZXJyb3IgPSBxd29yZF9nZXQoJmJ1ZiwgYnVmMSwgUEFHRV9TSVpFKTsKKwlpZiAoZXJyb3IgPD0gMCB8fCBlcnJvciA+PSBJRE1BUF9OQU1FU1opCisJCWdvdG8gb3V0OworCW1lbWNweShlbnQubmFtZSwgYnVmMSwgc2l6ZW9mKGVudC5uYW1lKSk7CisKKwkvKiBleHBpcnkgKi8KKwllbnQuaC5leHBpcnlfdGltZSA9IGdldF9leHBpcnkoJmJ1Zik7CisJaWYgKGVudC5oLmV4cGlyeV90aW1lID09IDApCisJCWdvdG8gb3V0OworCisJLyogSUQgKi8KKwllcnJvciA9IGdldF9pbnQoJmJ1ZiwgJmVudC5pZCk7CisJaWYgKGVycm9yID09IC1FSU5WQUwpCisJCWdvdG8gb3V0OworCWlmIChlcnJvciA9PSAtRU5PRU5UKQorCQlzZXRfYml0KENBQ0hFX05FR0FUSVZFLCAmZW50LmguZmxhZ3MpOworCisJZXJyb3IgPSAtRU5PTUVNOworCWlmICgocmVzID0gbmFtZXRvaWRfbG9va3VwKCZlbnQsIDEpKSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWVudF9wdXQoJnJlcy0+aCwgJm5hbWV0b2lkX2NhY2hlKTsKKwllcnJvciA9IDA7CitvdXQ6CisJa2ZyZWUoYnVmMSk7CisKKwlyZXR1cm4gKGVycm9yKTsKK30KKworc3RhdGljIERlZmluZVNpbXBsZUNhY2hlTG9va3VwTWFwKGVudCwgbmFtZXRvaWQpOworCisvKgorICogRXhwb3J0ZWQgQVBJCisgKi8KKwordm9pZAorbmZzZF9pZG1hcF9pbml0KHZvaWQpCit7CisJY2FjaGVfcmVnaXN0ZXIoJmlkdG9uYW1lX2NhY2hlKTsKKwljYWNoZV9yZWdpc3RlcigmbmFtZXRvaWRfY2FjaGUpOworfQorCit2b2lkCituZnNkX2lkbWFwX3NodXRkb3duKHZvaWQpCit7CisJY2FjaGVfdW5yZWdpc3RlcigmaWR0b25hbWVfY2FjaGUpOworCWNhY2hlX3VucmVnaXN0ZXIoJm5hbWV0b2lkX2NhY2hlKTsKK30KKworLyoKKyAqIERlZmVycmVkIHJlcXVlc3QgaGFuZGxpbmcKKyAqLworCitzdHJ1Y3QgaWRtYXBfZGVmZXJfcmVxIHsKKyAgICAgICBzdHJ1Y3QgY2FjaGVfcmVxCQlyZXE7CisgICAgICAgc3RydWN0IGNhY2hlX2RlZmVycmVkX3JlcSBkZWZlcnJlZF9yZXE7CisgICAgICAgd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdHE7CisgICAgICAgYXRvbWljX3QJCQljb3VudDsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcHV0X21kcihzdHJ1Y3QgaWRtYXBfZGVmZXJfcmVxICptZHIpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJm1kci0+Y291bnQpKQorCQlrZnJlZShtZHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2dldF9tZHIoc3RydWN0IGlkbWFwX2RlZmVyX3JlcSAqbWRyKQoreworCWF0b21pY19pbmMoJm1kci0+Y291bnQpOworfQorCitzdGF0aWMgdm9pZAoraWRtYXBfcmV2aXNpdChzdHJ1Y3QgY2FjaGVfZGVmZXJyZWRfcmVxICpkcmVxLCBpbnQgdG9vbWFueSkKK3sKKwlzdHJ1Y3QgaWRtYXBfZGVmZXJfcmVxICptZHIgPQorCQljb250YWluZXJfb2YoZHJlcSwgc3RydWN0IGlkbWFwX2RlZmVyX3JlcSwgZGVmZXJyZWRfcmVxKTsKKworCXdha2VfdXAoJm1kci0+d2FpdHEpOworCXB1dF9tZHIobWRyKTsKK30KKworc3RhdGljIHN0cnVjdCBjYWNoZV9kZWZlcnJlZF9yZXEgKgoraWRtYXBfZGVmZXIoc3RydWN0IGNhY2hlX3JlcSAqcmVxKQoreworCXN0cnVjdCBpZG1hcF9kZWZlcl9yZXEgKm1kciA9CisJCWNvbnRhaW5lcl9vZihyZXEsIHN0cnVjdCBpZG1hcF9kZWZlcl9yZXEsIHJlcSk7CisKKwltZHItPmRlZmVycmVkX3JlcS5yZXZpc2l0ID0gaWRtYXBfcmV2aXNpdDsKKwlnZXRfbWRyKG1kcik7CisJcmV0dXJuICgmbWRyLT5kZWZlcnJlZF9yZXEpOworfQorCitzdGF0aWMgaW5saW5lIGludAorZG9faWRtYXBfbG9va3VwKHN0cnVjdCBlbnQgKigqbG9va3VwX2ZuKShzdHJ1Y3QgZW50ICosIGludCksIHN0cnVjdCBlbnQgKmtleSwKKwkJc3RydWN0IGNhY2hlX2RldGFpbCAqZGV0YWlsLCBzdHJ1Y3QgZW50ICoqaXRlbSwKKwkJc3RydWN0IGlkbWFwX2RlZmVyX3JlcSAqbWRyKQoreworCSppdGVtID0gbG9va3VwX2ZuKGtleSwgMCk7CisJaWYgKCEqaXRlbSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIGNhY2hlX2NoZWNrKGRldGFpbCwgJigqaXRlbSktPmgsICZtZHItPnJlcSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citkb19pZG1hcF9sb29rdXBfbm93YWl0KHN0cnVjdCBlbnQgKigqbG9va3VwX2ZuKShzdHJ1Y3QgZW50ICosIGludCksCisJCQlzdHJ1Y3QgZW50ICprZXksIHN0cnVjdCBjYWNoZV9kZXRhaWwgKmRldGFpbCwKKwkJCXN0cnVjdCBlbnQgKippdGVtKQoreworCWludCByZXQgPSAtRU5PTUVNOworCisJKml0ZW0gPSBsb29rdXBfZm4oa2V5LCAwKTsKKwlpZiAoISppdGVtKQorCQlnb3RvIG91dF9lcnI7CisJcmV0ID0gLUVUSU1FRE9VVDsKKwlpZiAoIXRlc3RfYml0KENBQ0hFX1ZBTElELCAmKCppdGVtKS0+aC5mbGFncykKKwkJCXx8ICgqaXRlbSktPmguZXhwaXJ5X3RpbWUgPCBnZXRfc2Vjb25kcygpCisJCQl8fCBkZXRhaWwtPmZsdXNoX3RpbWUgPiAoKml0ZW0pLT5oLmxhc3RfcmVmcmVzaCkKKwkJZ290byBvdXRfcHV0OworCXJldCA9IC1FTk9FTlQ7CisJaWYgKHRlc3RfYml0KENBQ0hFX05FR0FUSVZFLCAmKCppdGVtKS0+aC5mbGFncykpCisJCWdvdG8gb3V0X3B1dDsKKwlyZXR1cm4gMDsKK291dF9wdXQ6CisJZW50X3B1dCgmKCppdGVtKS0+aCwgZGV0YWlsKTsKK291dF9lcnI6CisJKml0ZW0gPSBOVUxMOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2lkbWFwX2xvb2t1cChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAorCQlzdHJ1Y3QgZW50ICooKmxvb2t1cF9mbikoc3RydWN0IGVudCAqLCBpbnQpLCBzdHJ1Y3QgZW50ICprZXksCisJCXN0cnVjdCBjYWNoZV9kZXRhaWwgKmRldGFpbCwgc3RydWN0IGVudCAqKml0ZW0pCit7CisJc3RydWN0IGlkbWFwX2RlZmVyX3JlcSAqbWRyOworCWludCByZXQ7CisKKwltZHIgPSBrbWFsbG9jKHNpemVvZigqbWRyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtZHIpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChtZHIsIDAsIHNpemVvZigqbWRyKSk7CisJYXRvbWljX3NldCgmbWRyLT5jb3VudCwgMSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbWRyLT53YWl0cSk7CisJbWRyLT5yZXEuZGVmZXIgPSBpZG1hcF9kZWZlcjsKKwlyZXQgPSBkb19pZG1hcF9sb29rdXAobG9va3VwX2ZuLCBrZXksIGRldGFpbCwgaXRlbSwgbWRyKTsKKwlpZiAocmV0ID09IC1FQUdBSU4pIHsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQobWRyLT53YWl0cSwKKwkJCXRlc3RfYml0KENBQ0hFX1ZBTElELCAmKCppdGVtKS0+aC5mbGFncyksIDEgKiBIWik7CisJCXJldCA9IGRvX2lkbWFwX2xvb2t1cF9ub3dhaXQobG9va3VwX2ZuLCBrZXksIGRldGFpbCwgaXRlbSk7CisJfQorCXB1dF9tZHIobWRyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitpZG1hcF9uYW1lX3RvX2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGludCB0eXBlLCBjb25zdCBjaGFyICpuYW1lLCB1MzIgbmFtZWxlbiwKKwkJdWlkX3QgKmlkKQoreworCXN0cnVjdCBlbnQgKml0ZW0sIGtleSA9IHsKKwkJLnR5cGUgPSB0eXBlLAorCX07CisJaW50IHJldDsKKworCWlmIChuYW1lbGVuICsgMSA+IHNpemVvZihrZXkubmFtZSkpCisJCXJldHVybiAtRUlOVkFMOworCW1lbWNweShrZXkubmFtZSwgbmFtZSwgbmFtZWxlbik7CisJa2V5Lm5hbWVbbmFtZWxlbl0gPSAnXDAnOworCXN0cmxjcHkoa2V5LmF1dGhuYW1lLCBycXN0cC0+cnFfY2xpZW50LT5uYW1lLCBzaXplb2Yoa2V5LmF1dGhuYW1lKSk7CisJcmV0ID0gaWRtYXBfbG9va3VwKHJxc3RwLCBuYW1ldG9pZF9sb29rdXAsICZrZXksICZuYW1ldG9pZF9jYWNoZSwgJml0ZW0pOworCWlmIChyZXQgPT0gLUVOT0VOVCkKKwkJcmV0ID0gLUVTUkNIOyAvKiBuZnNlcnJfYmFkbmFtZSAqLworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJKmlkID0gaXRlbS0+aWQ7CisJZW50X3B1dCgmaXRlbS0+aCwgJm5hbWV0b2lkX2NhY2hlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraWRtYXBfaWRfdG9fbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBpbnQgdHlwZSwgdWlkX3QgaWQsIGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGVudCAqaXRlbSwga2V5ID0geworCQkuaWQgPSBpZCwKKwkJLnR5cGUgPSB0eXBlLAorCX07CisJaW50IHJldDsKKworCXN0cmxjcHkoa2V5LmF1dGhuYW1lLCBycXN0cC0+cnFfY2xpZW50LT5uYW1lLCBzaXplb2Yoa2V5LmF1dGhuYW1lKSk7CisJcmV0ID0gaWRtYXBfbG9va3VwKHJxc3RwLCBpZHRvbmFtZV9sb29rdXAsICZrZXksICZpZHRvbmFtZV9jYWNoZSwgJml0ZW0pOworCWlmIChyZXQgPT0gLUVOT0VOVCkKKwkJcmV0dXJuIHNwcmludGYobmFtZSwgIiV1IiwgaWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gc3RybGVuKGl0ZW0tPm5hbWUpOworCUJVR19PTihyZXQgPiBJRE1BUF9OQU1FU1opOworCW1lbWNweShuYW1lLCBpdGVtLT5uYW1lLCByZXQpOworCWVudF9wdXQoJml0ZW0tPmgsICZpZHRvbmFtZV9jYWNoZSk7CisJcmV0dXJuIHJldDsKK30KKworaW50CituZnNkX21hcF9uYW1lX3RvX3VpZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZWxlbiwKKwkJX191MzIgKmlkKQoreworCXJldHVybiBpZG1hcF9uYW1lX3RvX2lkKHJxc3RwLCBJRE1BUF9UWVBFX1VTRVIsIG5hbWUsIG5hbWVsZW4sIGlkKTsKK30KKworaW50CituZnNkX21hcF9uYW1lX3RvX2dpZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZWxlbiwKKwkJX191MzIgKmlkKQoreworCXJldHVybiBpZG1hcF9uYW1lX3RvX2lkKHJxc3RwLCBJRE1BUF9UWVBFX0dST1VQLCBuYW1lLCBuYW1lbGVuLCBpZCk7Cit9CisKK2ludAorbmZzZF9tYXBfdWlkX3RvX25hbWUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX191MzIgaWQsIGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIGlkbWFwX2lkX3RvX25hbWUocnFzdHAsIElETUFQX1RZUEVfVVNFUiwgaWQsIG5hbWUpOworfQorCitpbnQKK25mc2RfbWFwX2dpZF90b19uYW1lKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fdTMyIGlkLCBjaGFyICpuYW1lKQoreworCXJldHVybiBpZG1hcF9pZF90b19uYW1lKHJxc3RwLCBJRE1BUF9UWVBFX0dST1VQLCBpZCwgbmFtZSk7Cit9CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRwcm9jLmMgYi9mcy9uZnNkL25mczRwcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxNTg3NAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mc2QvbmZzNHByb2MuYwpAQCAtMCwwICsxLDk4NCBAQAorLyoKKyAqICBmcy9uZnNkL25mczRwcm9jLmMKKyAqCisgKiAgU2VydmVyLXNpZGUgcHJvY2VkdXJlcyBmb3IgTkZTdjQuCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBLZW5kcmljayBTbWl0aCA8a21zbWl0aEB1bWljaC5lZHU+CisgKiAgQW5keSBBZGFtc29uICAgPGFuZHJvc0B1bWljaC5lZHU+CisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogTm90ZTogc29tZSByb3V0aW5lcyBpbiB0aGlzIGZpbGUgYXJlIGp1c3QgdHJpdmlhbCB3cmFwcGVycworICogKGUuZy4gbmZzZDRfbG9va3VwKCkpIGRlZmluZWQgc29sZWx5IGZvciB0aGUgc2FrZSBvZiBjb25zaXN0ZW50CisgKiBuYW1pbmcuICBTaW5jZSBhbGwgc3VjaCByb3V0aW5lcyBoYXZlIGJlZW4gZGVjbGFyZWQgImlubGluZSIsCisgKiB0aGVyZSBzaG91bGRuJ3QgYmUgYW55IGFzc29jaWF0ZWQgb3ZlcmhlYWQuICBBdCBzb21lIHBvaW50IGluCisgKiB0aGUgZnV0dXJlLCBJIG1pZ2h0IGlubGluZSB0aGVzZSAiYnkgaGFuZCIgdG8gY2xlYW4gdXAgYQorICogbGl0dGxlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnM0Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9zdGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QveGRyNC5oPgorI2luY2x1ZGUgPGxpbnV4L25mczRfYWNsLmg+CisKKyNkZWZpbmUgTkZTRERCR19GQUNJTElUWQkJTkZTRERCR19QUk9DCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZmhfZHVwMihzdHJ1Y3Qgc3ZjX2ZoICpkc3QsIHN0cnVjdCBzdmNfZmggKnNyYykKK3sKKwlmaF9wdXQoZHN0KTsKKwlkZ2V0KHNyYy0+ZmhfZGVudHJ5KTsKKwlpZiAoc3JjLT5maF9leHBvcnQpCisJCWNhY2hlX2dldCgmc3JjLT5maF9leHBvcnQtPmgpOworCSpkc3QgPSAqc3JjOworfQorCitzdGF0aWMgaW50Citkb19vcGVuX3Blcm1pc3Npb24oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pCit7CisJaW50IGFjY21vZGUsIHN0YXR1czsKKworCWlmIChvcGVuLT5vcF90cnVuY2F0ZSAmJgorCQkhKG9wZW4tPm9wX3NoYXJlX2FjY2VzcyAmIE5GUzRfU0hBUkVfQUNDRVNTX1dSSVRFKSkKKwkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKKworCWFjY21vZGUgPSBNQVlfTk9QOworCWlmIChvcGVuLT5vcF9zaGFyZV9hY2Nlc3MgJiBORlM0X1NIQVJFX0FDQ0VTU19SRUFEKQorCQlhY2Ntb2RlID0gTUFZX1JFQUQ7CisJaWYgKG9wZW4tPm9wX3NoYXJlX2RlbnkgJiBORlM0X1NIQVJFX0FDQ0VTU19XUklURSkKKwkJYWNjbW9kZSB8PSAoTUFZX1dSSVRFIHwgTUFZX1RSVU5DKTsKKwlhY2Ntb2RlIHw9IE1BWV9PV05FUl9PVkVSUklERTsKKworCXN0YXR1cyA9IGZoX3ZlcmlmeShycXN0cCwgY3VycmVudF9maCwgU19JRlJFRywgYWNjbW9kZSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50Citkb19vcGVuX2xvb2t1cChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbikKK3sKKwlzdHJ1Y3Qgc3ZjX2ZoIHJlc2ZoOworCWludCBzdGF0dXM7CisKKwlmaF9pbml0KCZyZXNmaCwgTkZTNF9GSFNJWkUpOworCW9wZW4tPm9wX3RydW5jYXRlID0gMDsKKworCWlmIChvcGVuLT5vcF9jcmVhdGUpIHsKKwkJLyoKKwkJICogTm90ZTogY3JlYXRlIG1vZGVzIChVTkNIRUNLRUQsR1VBUkRFRC4uLikgYXJlIHRoZSBzYW1lCisJCSAqIGluIE5GU3Y0IGFzIGluIHYzLgorCQkgKi8KKwkJc3RhdHVzID0gbmZzZF9jcmVhdGVfdjMocnFzdHAsIGN1cnJlbnRfZmgsIG9wZW4tPm9wX2ZuYW1lLmRhdGEsCisJCQkJCW9wZW4tPm9wX2ZuYW1lLmxlbiwgJm9wZW4tPm9wX2lhdHRyLAorCQkJCQkmcmVzZmgsIG9wZW4tPm9wX2NyZWF0ZW1vZGUsCisJCQkJCSh1MzIgKilvcGVuLT5vcF92ZXJmLmRhdGEsICZvcGVuLT5vcF90cnVuY2F0ZSk7CisJfQorCWVsc2UgeworCQlzdGF0dXMgPSBuZnNkX2xvb2t1cChycXN0cCwgY3VycmVudF9maCwKKwkJCQkgICAgIG9wZW4tPm9wX2ZuYW1lLmRhdGEsIG9wZW4tPm9wX2ZuYW1lLmxlbiwgJnJlc2ZoKTsKKwkJZmhfdW5sb2NrKGN1cnJlbnRfZmgpOworCX0KKworCWlmICghc3RhdHVzKSB7CisJCXNldF9jaGFuZ2VfaW5mbygmb3Blbi0+b3BfY2luZm8sIGN1cnJlbnRfZmgpOworCisJCS8qIHNldCByZXBseSBjYWNoZSAqLworCQlmaF9kdXAyKGN1cnJlbnRfZmgsICZyZXNmaCk7CisJCW9wZW4tPm9wX3N0YXRlb3duZXItPnNvX3JlcGxheS5ycF9vcGVuZmhfbGVuID0KKwkJCXJlc2ZoLmZoX2hhbmRsZS5maF9zaXplOworCQltZW1jcHkob3Blbi0+b3Bfc3RhdGVvd25lci0+c29fcmVwbGF5LnJwX29wZW5maCwKKwkJCQkmcmVzZmguZmhfaGFuZGxlLmZoX2Jhc2UsCisJCQkJcmVzZmguZmhfaGFuZGxlLmZoX3NpemUpOworCisJCXN0YXR1cyA9IGRvX29wZW5fcGVybWlzc2lvbihycXN0cCwgY3VycmVudF9maCwgb3Blbik7CisJfQorCisJZmhfcHV0KCZyZXNmaCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorZG9fb3Blbl9maGFuZGxlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKQoreworCWludCBzdGF0dXM7CisKKwkvKiBPbmx5IHJlY2xhaW1zIGZyb20gcHJldmlvdXNseSBjb25maXJtZWQgY2xpZW50cyBhcmUgdmFsaWQgKi8KKwlpZiAoKHN0YXR1cyA9IG5mczRfY2hlY2tfb3Blbl9yZWNsYWltKCZvcGVuLT5vcF9jbGllbnRpZCkpKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogV2UgZG9uJ3Qga25vdyB0aGUgdGFyZ2V0IGRpcmVjdG9yeSwgYW5kIHRoZXJlZm9yZSBjYW4gbm90CisJKiBzZXQgdGhlIGNoYW5nZSBpbmZvCisJKi8KKworCW1lbXNldCgmb3Blbi0+b3BfY2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgbmZzZDRfY2hhbmdlX2luZm8pKTsKKworCS8qIHNldCByZXBsYXkgY2FjaGUgKi8KKwlvcGVuLT5vcF9zdGF0ZW93bmVyLT5zb19yZXBsYXkucnBfb3BlbmZoX2xlbiA9IGN1cnJlbnRfZmgtPmZoX2hhbmRsZS5maF9zaXplOworCW1lbWNweShvcGVuLT5vcF9zdGF0ZW93bmVyLT5zb19yZXBsYXkucnBfb3BlbmZoLAorCQkmY3VycmVudF9maC0+ZmhfaGFuZGxlLmZoX2Jhc2UsCisJCWN1cnJlbnRfZmgtPmZoX2hhbmRsZS5maF9zaXplKTsKKworCW9wZW4tPm9wX3RydW5jYXRlID0gKG9wZW4tPm9wX2lhdHRyLmlhX3ZhbGlkICYgQVRUUl9TSVpFKSAmJgorCQkob3Blbi0+b3BfaWF0dHIuaWFfc2l6ZSA9PSAwKTsKKworCXN0YXR1cyA9IGRvX29wZW5fcGVybWlzc2lvbihycXN0cCwgY3VycmVudF9maCwgb3Blbik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF9vcGVuKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKQoreworCWludCBzdGF0dXM7CisJZHByaW50aygiTkZTRDogbmZzZDRfb3BlbiBmaWxlbmFtZSAlLipzIG9wX3N0YXRlb3duZXIgJXBcbiIsCisJCShpbnQpb3Blbi0+b3BfZm5hbWUubGVuLCBvcGVuLT5vcF9mbmFtZS5kYXRhLAorCQlvcGVuLT5vcF9zdGF0ZW93bmVyKTsKKworCWlmIChuZnM0X2luX2dyYWNlKCkgJiYgb3Blbi0+b3BfY2xhaW1fdHlwZSAhPSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVMpCisJCXJldHVybiBuZnNlcnJfZ3JhY2U7CisKKwlpZiAoIW5mczRfaW5fZ3JhY2UoKSAmJiBvcGVuLT5vcF9jbGFpbV90eXBlID09IE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUykKKwkJcmV0dXJuIG5mc2Vycl9ub19ncmFjZTsKKworCS8qIFRoaXMgY2hlY2sgcmVxdWlyZWQgYnkgc3BlYy4gKi8KKwlpZiAob3Blbi0+b3BfY3JlYXRlICYmIG9wZW4tPm9wX2NsYWltX3R5cGUgIT0gTkZTNF9PUEVOX0NMQUlNX05VTEwpCisJCXJldHVybiBuZnNlcnJfaW52YWw7CisKKwluZnM0X2xvY2tfc3RhdGUoKTsKKworCS8qIGNoZWNrIHNlcWlkIGZvciByZXBsYXkuIHNldCBuZnM0X293bmVyICovCisJc3RhdHVzID0gbmZzZDRfcHJvY2Vzc19vcGVuMShvcGVuKTsKKwlpZiAoc3RhdHVzID09IE5GU0VSUl9SRVBMQVlfTUUpIHsKKwkJc3RydWN0IG5mczRfcmVwbGF5ICpycCA9ICZvcGVuLT5vcF9zdGF0ZW93bmVyLT5zb19yZXBsYXk7CisJCWZoX3B1dChjdXJyZW50X2ZoKTsKKwkJY3VycmVudF9maC0+ZmhfaGFuZGxlLmZoX3NpemUgPSBycC0+cnBfb3BlbmZoX2xlbjsKKwkJbWVtY3B5KCZjdXJyZW50X2ZoLT5maF9oYW5kbGUuZmhfYmFzZSwgcnAtPnJwX29wZW5maCwKKwkJCQlycC0+cnBfb3BlbmZoX2xlbik7CisJCXN0YXR1cyA9IGZoX3ZlcmlmeShycXN0cCwgY3VycmVudF9maCwgMCwgTUFZX05PUCk7CisJCWlmIChzdGF0dXMpCisJCQlkcHJpbnRrKCJuZnNkNF9vcGVuOiByZXBsYXkgZmFpbGVkIgorCQkJCSIgcmVzdG9yaW5nIHByZXZpb3VzIGZpbGVoYW5kbGVcbiIpOworCQllbHNlCisJCQlzdGF0dXMgPSBORlNFUlJfUkVQTEFZX01FOworCX0KKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzd2l0Y2ggKG9wZW4tPm9wX2NsYWltX3R5cGUpIHsKKwkJY2FzZSBORlM0X09QRU5fQ0xBSU1fTlVMTDoKKwkJCS8qCisJCQkgKiAoMSkgc2V0IENVUlJFTlRfRkggdG8gdGhlIGZpbGUgYmVpbmcgb3BlbmVkLAorCQkJICogY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LCAoMikgc2V0IG9wZW4tPm9wX2NpbmZvLAorCQkJICogKDMpIHNldCBvcGVuLT5vcF90cnVuY2F0ZSBpZiB0aGUgZmlsZSBpcyB0byBiZQorCQkJICogdHJ1bmNhdGVkIGFmdGVyIG9wZW5pbmcsICg0KSBkbyBwZXJtaXNzaW9uIGNoZWNraW5nLgorCQkJICovCisJCQlzdGF0dXMgPSBkb19vcGVuX2xvb2t1cChycXN0cCwgY3VycmVudF9maCwgb3Blbik7CisJCQlpZiAoc3RhdHVzKQorCQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CisJCWNhc2UgTkZTNF9PUEVOX0NMQUlNX1BSRVZJT1VTOgorCQkJLyoKKwkJCSAqIFRoZSBDVVJSRU5UX0ZIIGlzIGFscmVhZHkgc2V0IHRvIHRoZSBmaWxlIGJlaW5nCisJCQkgKiBvcGVuZWQuICAoMSkgc2V0IG9wZW4tPm9wX2NpbmZvLCAoMikgc2V0CisJCQkgKiBvcGVuLT5vcF90cnVuY2F0ZSBpZiB0aGUgZmlsZSBpcyB0byBiZSB0cnVuY2F0ZWQKKwkJCSAqIGFmdGVyIG9wZW5pbmcsICgzKSBkbyBwZXJtaXNzaW9uIGNoZWNraW5nLgorCQkJKi8KKwkJCXN0YXR1cyA9IGRvX29wZW5fZmhhbmRsZShycXN0cCwgY3VycmVudF9maCwgb3Blbik7CisJCQlpZiAoc3RhdHVzKQorCQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CisJCWNhc2UgTkZTNF9PUEVOX0NMQUlNX0RFTEVHQVRFX0NVUjoKKyAgICAgICAgICAgICAJY2FzZSBORlM0X09QRU5fQ0xBSU1fREVMRUdBVEVfUFJFVjoKKwkJCXByaW50aygiTkZTRDogdW5zdXBwb3J0ZWQgT1BFTiBjbGFpbSB0eXBlICVkXG4iLAorCQkJCW9wZW4tPm9wX2NsYWltX3R5cGUpOworCQkJc3RhdHVzID0gbmZzZXJyX25vdHN1cHA7CisJCQlnb3RvIG91dDsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiTkZTRDogSW52YWxpZCBPUEVOIGNsYWltIHR5cGUgJWRcbiIsCisJCQkJb3Blbi0+b3BfY2xhaW1fdHlwZSk7CisJCQlzdGF0dXMgPSBuZnNlcnJfaW52YWw7CisJCQlnb3RvIG91dDsKKwl9CisJLyoKKwkgKiBuZnNkNF9wcm9jZXNzX29wZW4yKCkgZG9lcyB0aGUgYWN0dWFsIG9wZW5pbmcgb2YgdGhlIGZpbGUuICBJZgorCSAqIHN1Y2Nlc3NmdWwsIGl0ICgxKSB0cnVuY2F0ZXMgdGhlIGZpbGUgaWYgb3Blbi0+b3BfdHJ1bmNhdGUgd2FzCisJICogc2V0LCAoMikgc2V0cyBvcGVuLT5vcF9zdGF0ZWlkLCAoMykgc2V0cyBvcGVuLT5vcF9kZWxlZ2F0aW9uLgorCSAqLworCXN0YXR1cyA9IG5mc2Q0X3Byb2Nlc3Nfb3BlbjIocnFzdHAsIGN1cnJlbnRfZmgsIG9wZW4pOworb3V0OgorCWlmIChvcGVuLT5vcF9zdGF0ZW93bmVyKQorCQluZnM0X2dldF9zdGF0ZW93bmVyKG9wZW4tPm9wX3N0YXRlb3duZXIpOworCW5mczRfdW5sb2NrX3N0YXRlKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIGZpbGVoYW5kbGUtbWFuaXB1bGF0aW5nIG9wcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK25mc2Q0X2dldGZoKHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBzdmNfZmggKipnZXRmaCkKK3sKKwlpZiAoIWN1cnJlbnRfZmgtPmZoX2RlbnRyeSkKKwkJcmV0dXJuIG5mc2Vycl9ub2ZpbGVoYW5kbGU7CisKKwkqZ2V0ZmggPSBjdXJyZW50X2ZoOworCXJldHVybiBuZnNfb2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF9wdXRmaChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfcHV0ZmggKnB1dGZoKQoreworCWZoX3B1dChjdXJyZW50X2ZoKTsKKwljdXJyZW50X2ZoLT5maF9oYW5kbGUuZmhfc2l6ZSA9IHB1dGZoLT5wZl9maGxlbjsKKwltZW1jcHkoJmN1cnJlbnRfZmgtPmZoX2hhbmRsZS5maF9iYXNlLCBwdXRmaC0+cGZfZmh2YWwsIHB1dGZoLT5wZl9maGxlbik7CisJcmV0dXJuIGZoX3ZlcmlmeShycXN0cCwgY3VycmVudF9maCwgMCwgTUFZX05PUCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF9wdXRyb290Zmgoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCkKK3sKKwlpbnQgc3RhdHVzOworCisJZmhfcHV0KGN1cnJlbnRfZmgpOworCXN0YXR1cyA9IGV4cF9wc2V1ZG9yb290KHJxc3RwLT5ycV9jbGllbnQsIGN1cnJlbnRfZmgsCisJCQkgICAgICAmcnFzdHAtPnJxX2NoYW5kbGUpOworCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSBuZnNlcnJubyhuZnNkX3NldHVzZXIocnFzdHAsIGN1cnJlbnRfZmgtPmZoX2V4cG9ydCkpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF9yZXN0b3JlZmgoc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IHN2Y19maCAqc2F2ZV9maCkKK3sKKwlpZiAoIXNhdmVfZmgtPmZoX2RlbnRyeSkKKwkJcmV0dXJuIG5mc2Vycl9yZXN0b3JlZmg7CisKKwlmaF9kdXAyKGN1cnJlbnRfZmgsIHNhdmVfZmgpOworCXJldHVybiBuZnNfb2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF9zYXZlZmgoc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IHN2Y19maCAqc2F2ZV9maCkKK3sKKwlpZiAoIWN1cnJlbnRfZmgtPmZoX2RlbnRyeSkKKwkJcmV0dXJuIG5mc2Vycl9ub2ZpbGVoYW5kbGU7CisKKwlmaF9kdXAyKHNhdmVfZmgsIGN1cnJlbnRfZmgpOworCXJldHVybiBuZnNfb2s7Cit9CisKKy8qCisgKiBtaXNjIG5mc3Y0IG9wcworICovCitzdGF0aWMgaW5saW5lIGludAorbmZzZDRfYWNjZXNzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9hY2Nlc3MgKmFjY2VzcykKK3sKKwlpZiAoYWNjZXNzLT5hY19yZXFfYWNjZXNzICYgfk5GUzNfQUNDRVNTX0ZVTEwpCisJCXJldHVybiBuZnNlcnJfaW52YWw7CisKKwlhY2Nlc3MtPmFjX3Jlc3BfYWNjZXNzID0gYWNjZXNzLT5hY19yZXFfYWNjZXNzOworCXJldHVybiBuZnNkX2FjY2VzcyhycXN0cCwgY3VycmVudF9maCwgJmFjY2Vzcy0+YWNfcmVzcF9hY2Nlc3MsICZhY2Nlc3MtPmFjX3N1cHBvcnRlZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF9jb21taXQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X2NvbW1pdCAqY29tbWl0KQoreworCWludCBzdGF0dXM7CisKKwl1MzIgKnAgPSAodTMyICopY29tbWl0LT5jb192ZXJmLmRhdGE7CisJKnArKyA9IG5mc3N2Y19ib290LnR2X3NlYzsKKwkqcCsrID0gbmZzc3ZjX2Jvb3QudHZfdXNlYzsKKworCXN0YXR1cyA9IG5mc2RfY29tbWl0KHJxc3RwLCBjdXJyZW50X2ZoLCBjb21taXQtPmNvX29mZnNldCwgY29tbWl0LT5jb19jb3VudCk7CisJaWYgKHN0YXR1cyA9PSBuZnNlcnJfc3ltbGluaykKKwkJc3RhdHVzID0gbmZzZXJyX2ludmFsOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2NyZWF0ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfY3JlYXRlICpjcmVhdGUpCit7CisJc3RydWN0IHN2Y19maCByZXNmaDsKKwlpbnQgc3RhdHVzOworCWRldl90IHJkZXY7CisKKwlmaF9pbml0KCZyZXNmaCwgTkZTNF9GSFNJWkUpOworCisJc3RhdHVzID0gZmhfdmVyaWZ5KHJxc3RwLCBjdXJyZW50X2ZoLCBTX0lGRElSLCBNQVlfQ1JFQVRFKTsKKwlpZiAoc3RhdHVzID09IG5mc2Vycl9zeW1saW5rKQorCQlzdGF0dXMgPSBuZnNlcnJfbm90ZGlyOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwlzd2l0Y2ggKGNyZWF0ZS0+Y3JfdHlwZSkgeworCWNhc2UgTkY0TE5LOgorCQkvKiB1Z2ghIHdlIGhhdmUgdG8gbnVsbC10ZXJtaW5hdGUgdGhlIGxpbmt0ZXh0LCBvcgorCQkgKiB2ZnNfc3ltbGluaygpIHdpbGwgY2hva2UuICBpdCBpcyBhbHdheXMgc2FmZSB0bworCQkgKiBudWxsLXRlcm1pbmF0ZSBieSBicnV0ZSBmb3JjZSwgc2luY2UgYXQgd29yc3Qgd2UKKwkJICogd2lsbCBvdmVyd3JpdGUgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGNyZWF0ZSBuYW1lbGVuCisJCSAqIGluIHRoZSBYRFIgYnVmZmVyLCB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGV4dHJhY3RlZAorCQkgKiBkdXJpbmcgWERSIGRlY29kZS4KKwkJICovCisJCWNyZWF0ZS0+Y3JfbGlua25hbWVbY3JlYXRlLT5jcl9saW5rbGVuXSA9IDA7CisKKwkJc3RhdHVzID0gbmZzZF9zeW1saW5rKHJxc3RwLCBjdXJyZW50X2ZoLCBjcmVhdGUtPmNyX25hbWUsCisJCQkJICAgICAgY3JlYXRlLT5jcl9uYW1lbGVuLCBjcmVhdGUtPmNyX2xpbmtuYW1lLAorCQkJCSAgICAgIGNyZWF0ZS0+Y3JfbGlua2xlbiwgJnJlc2ZoLCAmY3JlYXRlLT5jcl9pYXR0cik7CisJCWJyZWFrOworCisJY2FzZSBORjRCTEs6CisJCXJkZXYgPSBNS0RFVihjcmVhdGUtPmNyX3NwZWNkYXRhMSwgY3JlYXRlLT5jcl9zcGVjZGF0YTIpOworCQlpZiAoTUFKT1IocmRldikgIT0gY3JlYXRlLT5jcl9zcGVjZGF0YTEgfHwKKwkJICAgIE1JTk9SKHJkZXYpICE9IGNyZWF0ZS0+Y3Jfc3BlY2RhdGEyKQorCQkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKKwkJc3RhdHVzID0gbmZzZF9jcmVhdGUocnFzdHAsIGN1cnJlbnRfZmgsIGNyZWF0ZS0+Y3JfbmFtZSwKKwkJCQkgICAgIGNyZWF0ZS0+Y3JfbmFtZWxlbiwgJmNyZWF0ZS0+Y3JfaWF0dHIsCisJCQkJICAgICBTX0lGQkxLLCByZGV2LCAmcmVzZmgpOworCQlicmVhazsKKworCWNhc2UgTkY0Q0hSOgorCQlyZGV2ID0gTUtERVYoY3JlYXRlLT5jcl9zcGVjZGF0YTEsIGNyZWF0ZS0+Y3Jfc3BlY2RhdGEyKTsKKwkJaWYgKE1BSk9SKHJkZXYpICE9IGNyZWF0ZS0+Y3Jfc3BlY2RhdGExIHx8CisJCSAgICBNSU5PUihyZGV2KSAhPSBjcmVhdGUtPmNyX3NwZWNkYXRhMikKKwkJCXJldHVybiBuZnNlcnJfaW52YWw7CisJCXN0YXR1cyA9IG5mc2RfY3JlYXRlKHJxc3RwLCBjdXJyZW50X2ZoLCBjcmVhdGUtPmNyX25hbWUsCisJCQkJICAgICBjcmVhdGUtPmNyX25hbWVsZW4sICZjcmVhdGUtPmNyX2lhdHRyLAorCQkJCSAgICAgU19JRkNIUiwgcmRldiwgJnJlc2ZoKTsKKwkJYnJlYWs7CisKKwljYXNlIE5GNFNPQ0s6CisJCXN0YXR1cyA9IG5mc2RfY3JlYXRlKHJxc3RwLCBjdXJyZW50X2ZoLCBjcmVhdGUtPmNyX25hbWUsCisJCQkJICAgICBjcmVhdGUtPmNyX25hbWVsZW4sICZjcmVhdGUtPmNyX2lhdHRyLAorCQkJCSAgICAgU19JRlNPQ0ssIDAsICZyZXNmaCk7CisJCWJyZWFrOworCisJY2FzZSBORjRGSUZPOgorCQlzdGF0dXMgPSBuZnNkX2NyZWF0ZShycXN0cCwgY3VycmVudF9maCwgY3JlYXRlLT5jcl9uYW1lLAorCQkJCSAgICAgY3JlYXRlLT5jcl9uYW1lbGVuLCAmY3JlYXRlLT5jcl9pYXR0ciwKKwkJCQkgICAgIFNfSUZJRk8sIDAsICZyZXNmaCk7CisJCWJyZWFrOworCisJY2FzZSBORjRESVI6CisJCWNyZWF0ZS0+Y3JfaWF0dHIuaWFfdmFsaWQgJj0gfkFUVFJfU0laRTsKKwkJc3RhdHVzID0gbmZzZF9jcmVhdGUocnFzdHAsIGN1cnJlbnRfZmgsIGNyZWF0ZS0+Y3JfbmFtZSwKKwkJCQkgICAgIGNyZWF0ZS0+Y3JfbmFtZWxlbiwgJmNyZWF0ZS0+Y3JfaWF0dHIsCisJCQkJICAgICBTX0lGRElSLCAwLCAmcmVzZmgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IG5mc2Vycl9iYWR0eXBlOworCX0KKworCWlmICghc3RhdHVzKSB7CisJCWZoX3VubG9jayhjdXJyZW50X2ZoKTsKKwkJc2V0X2NoYW5nZV9pbmZvKCZjcmVhdGUtPmNyX2NpbmZvLCBjdXJyZW50X2ZoKTsKKwkJZmhfZHVwMihjdXJyZW50X2ZoLCAmcmVzZmgpOworCX0KKworCWZoX3B1dCgmcmVzZmgpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF9nZXRhdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9nZXRhdHRyICpnZXRhdHRyKQoreworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBmaF92ZXJpZnkocnFzdHAsIGN1cnJlbnRfZmgsIDAsIE1BWV9OT1ApOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwlpZiAoZ2V0YXR0ci0+Z2FfYm12YWxbMV0gJiBORlNEX1dSSVRFT05MWV9BVFRSU19XT1JEMSkKKwkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKKworCWdldGF0dHItPmdhX2JtdmFsWzBdICY9IE5GU0RfU1VQUE9SVEVEX0FUVFJTX1dPUkQwOworCWdldGF0dHItPmdhX2JtdmFsWzFdICY9IE5GU0RfU1VQUE9SVEVEX0FUVFJTX1dPUkQxOworCisJZ2V0YXR0ci0+Z2FfZmhwID0gY3VycmVudF9maDsKKwlyZXR1cm4gbmZzX29rOworfQorCitzdGF0aWMgaW5saW5lIGludAorbmZzZDRfbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLAorCSAgIHN0cnVjdCBzdmNfZmggKnNhdmVfZmgsIHN0cnVjdCBuZnNkNF9saW5rICpsaW5rKQoreworCWludCBzdGF0dXMgPSBuZnNlcnJfbm9maWxlaGFuZGxlOworCisJaWYgKCFzYXZlX2ZoLT5maF9kZW50cnkpCisJCXJldHVybiBzdGF0dXM7CisJc3RhdHVzID0gbmZzZF9saW5rKHJxc3RwLCBjdXJyZW50X2ZoLCBsaW5rLT5saV9uYW1lLCBsaW5rLT5saV9uYW1lbGVuLCBzYXZlX2ZoKTsKKwlpZiAoIXN0YXR1cykKKwkJc2V0X2NoYW5nZV9pbmZvKCZsaW5rLT5saV9jaW5mbywgY3VycmVudF9maCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmZzZDRfbG9va3VwcChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoKQoreworCXN0cnVjdCBzdmNfZmggdG1wX2ZoOworCWludCByZXQ7CisKKwlmaF9pbml0KCZ0bXBfZmgsIE5GUzRfRkhTSVpFKTsKKwlpZigocmV0ID0gZXhwX3BzZXVkb3Jvb3QocnFzdHAtPnJxX2NsaWVudCwgJnRtcF9maCwKKwkJCSAgICAgICZycXN0cC0+cnFfY2hhbmRsZSkpICE9IDApCisJCXJldHVybiByZXQ7CisJaWYgKHRtcF9maC5maF9kZW50cnkgPT0gY3VycmVudF9maC0+ZmhfZGVudHJ5KSB7CisJCWZoX3B1dCgmdG1wX2ZoKTsKKwkJcmV0dXJuIG5mc2Vycl9ub2VudDsKKwl9CisJZmhfcHV0KCZ0bXBfZmgpOworCXJldHVybiBuZnNkX2xvb2t1cChycXN0cCwgY3VycmVudF9maCwgIi4uIiwgMiwgY3VycmVudF9maCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF9sb29rdXAoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X2xvb2t1cCAqbG9va3VwKQoreworCXJldHVybiBuZnNkX2xvb2t1cChycXN0cCwgY3VycmVudF9maCwgbG9va3VwLT5sb19uYW1lLCBsb29rdXAtPmxvX2xlbiwgY3VycmVudF9maCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF9yZWFkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9yZWFkICpyZWFkKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IGZpbGUgKmZpbHAgPSBOVUxMOworCisJLyogbm8gbmVlZCB0byBjaGVjayBwZXJtaXNzaW9uIC0gdGhpcyB3aWxsIGJlIGRvbmUgaW4gbmZzZF9yZWFkKCkgKi8KKworCWlmIChyZWFkLT5yZF9vZmZzZXQgPj0gT0ZGU0VUX01BWCkKKwkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKKworCW5mczRfbG9ja19zdGF0ZSgpOworCS8qIGNoZWNrIHN0YXRlaWQgKi8KKwlpZiAoKHN0YXR1cyA9IG5mczRfcHJlcHJvY2Vzc19zdGF0ZWlkX29wKGN1cnJlbnRfZmgsICZyZWFkLT5yZF9zdGF0ZWlkLAorCQkJCQlDSEVDS19GSCB8IFJEX1NUQVRFLCAmZmlscCkpKSB7CisJCWRwcmludGsoIk5GU0Q6IG5mc2Q0X3JlYWQ6IGNvdWxkbid0IHByb2Nlc3Mgc3RhdGVpZCFcbiIpOworCQlnb3RvIG91dDsKKwl9CisJc3RhdHVzID0gbmZzX29rOworb3V0OgorCW5mczRfdW5sb2NrX3N0YXRlKCk7CisJcmVhZC0+cmRfcnFzdHAgPSBycXN0cDsKKwlyZWFkLT5yZF9maHAgPSBjdXJyZW50X2ZoOworCXJlYWQtPnJkX2ZpbHAgPSBmaWxwOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF9yZWFkZGlyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9yZWFkZGlyICpyZWFkZGlyKQoreworCXU2NCBjb29raWUgPSByZWFkZGlyLT5yZF9jb29raWU7CisJc3RhdGljIGNvbnN0IG5mczRfdmVyaWZpZXIgemVyb3ZlcmY7CisKKwkvKiBubyBuZWVkIHRvIGNoZWNrIHBlcm1pc3Npb24gLSB0aGlzIHdpbGwgYmUgZG9uZSBpbiBuZnNkX3JlYWRkaXIoKSAqLworCisJaWYgKHJlYWRkaXItPnJkX2JtdmFsWzFdICYgTkZTRF9XUklURU9OTFlfQVRUUlNfV09SRDEpCisJCXJldHVybiBuZnNlcnJfaW52YWw7CisKKwlyZWFkZGlyLT5yZF9ibXZhbFswXSAmPSBORlNEX1NVUFBPUlRFRF9BVFRSU19XT1JEMDsKKwlyZWFkZGlyLT5yZF9ibXZhbFsxXSAmPSBORlNEX1NVUFBPUlRFRF9BVFRSU19XT1JEMTsKKworCWlmICgoY29va2llID4gfih1MzIpMCkgfHwgKGNvb2tpZSA9PSAxKSB8fCAoY29va2llID09IDIpIHx8CisJICAgIChjb29raWUgPT0gMCAmJiBtZW1jbXAocmVhZGRpci0+cmRfdmVyZi5kYXRhLCB6ZXJvdmVyZi5kYXRhLCBORlM0X1ZFUklGSUVSX1NJWkUpKSkKKwkJcmV0dXJuIG5mc2Vycl9iYWRfY29va2llOworCisJcmVhZGRpci0+cmRfcnFzdHAgPSBycXN0cDsKKwlyZWFkZGlyLT5yZF9maHAgPSBjdXJyZW50X2ZoOworCXJldHVybiBuZnNfb2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF9yZWFkbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfcmVhZGxpbmsgKnJlYWRsaW5rKQoreworCXJlYWRsaW5rLT5ybF9ycXN0cCA9IHJxc3RwOworCXJlYWRsaW5rLT5ybF9maHAgPSBjdXJyZW50X2ZoOworCXJldHVybiBuZnNfb2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF9yZW1vdmUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X3JlbW92ZSAqcmVtb3ZlKQoreworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBuZnNkX3VubGluayhycXN0cCwgY3VycmVudF9maCwgMCwgcmVtb3ZlLT5ybV9uYW1lLCByZW1vdmUtPnJtX25hbWVsZW4pOworCWlmIChzdGF0dXMgPT0gbmZzZXJyX3N5bWxpbmspCisJCXJldHVybiBuZnNlcnJfbm90ZGlyOworCWlmICghc3RhdHVzKSB7CisJCWZoX3VubG9jayhjdXJyZW50X2ZoKTsKKwkJc2V0X2NoYW5nZV9pbmZvKCZyZW1vdmUtPnJtX2NpbmZvLCBjdXJyZW50X2ZoKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mc2Q0X3JlbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLAorCSAgICAgc3RydWN0IHN2Y19maCAqc2F2ZV9maCwgc3RydWN0IG5mc2Q0X3JlbmFtZSAqcmVuYW1lKQoreworCWludCBzdGF0dXMgPSBuZnNlcnJfbm9maWxlaGFuZGxlOworCisJaWYgKCFzYXZlX2ZoLT5maF9kZW50cnkpCisJCXJldHVybiBzdGF0dXM7CisJc3RhdHVzID0gbmZzZF9yZW5hbWUocnFzdHAsIHNhdmVfZmgsIHJlbmFtZS0+cm5fc25hbWUsCisJCQkgICAgIHJlbmFtZS0+cm5fc25hbWVsZW4sIGN1cnJlbnRfZmgsCisJCQkgICAgIHJlbmFtZS0+cm5fdG5hbWUsIHJlbmFtZS0+cm5fdG5hbWVsZW4pOworCisJLyogdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSByZXR1cm5zIGRpZmZlcmVudCBlcnJvcidzIHRoYW4gcmVxdWlyZWQKKwkgKiBieSBORlN2NC4gYm90aCBzYXZlX2ZoIGFuZCBjdXJyZW50X2ZoIGhhdmUgYmVlbiB2ZXJpZmllZC4uICovCisJaWYgKHN0YXR1cyA9PSBuZnNlcnJfaXNkaXIpCisJCXN0YXR1cyA9IG5mc2Vycl9leGlzdDsKKwllbHNlIGlmICgoc3RhdHVzID09IG5mc2Vycl9ub3RkaXIpICYmCisgICAgICAgICAgICAgICAgICAoU19JU0RJUihzYXZlX2ZoLT5maF9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgJiYKKyAgICAgICAgICAgICAgICAgICBTX0lTRElSKGN1cnJlbnRfZmgtPmZoX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkpCisJCXN0YXR1cyA9IG5mc2Vycl9leGlzdDsKKwllbHNlIGlmIChzdGF0dXMgPT0gbmZzZXJyX3N5bWxpbmspCisJCXN0YXR1cyA9IG5mc2Vycl9ub3RkaXI7CisKKwlpZiAoIXN0YXR1cykgeworCQlzZXRfY2hhbmdlX2luZm8oJnJlbmFtZS0+cm5fc2luZm8sIGN1cnJlbnRfZmgpOworCQlzZXRfY2hhbmdlX2luZm8oJnJlbmFtZS0+cm5fdGluZm8sIHNhdmVfZmgpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW5saW5lIGludAorbmZzZDRfc2V0YXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfc2V0YXR0ciAqc2V0YXR0cikKK3sKKwlpbnQgc3RhdHVzID0gbmZzX29rOworCisJaWYgKCFjdXJyZW50X2ZoLT5maF9kZW50cnkpCisJCXJldHVybiBuZnNlcnJfbm9maWxlaGFuZGxlOworCisJc3RhdHVzID0gbmZzX29rOworCWlmIChzZXRhdHRyLT5zYV9pYXR0ci5pYV92YWxpZCAmIEFUVFJfU0laRSkgeworCQluZnM0X2xvY2tfc3RhdGUoKTsKKwkJaWYgKChzdGF0dXMgPSBuZnM0X3ByZXByb2Nlc3Nfc3RhdGVpZF9vcChjdXJyZW50X2ZoLAorCQkJCQkJJnNldGF0dHItPnNhX3N0YXRlaWQsCisJCQkJCQlDSEVDS19GSCB8IFdSX1NUQVRFLCBOVUxMKSkpIHsKKwkJCWRwcmludGsoIk5GU0Q6IG5mc2Q0X3NldGF0dHI6IGNvdWxkbid0IHByb2Nlc3Mgc3RhdGVpZCFcbiIpOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJCW5mczRfdW5sb2NrX3N0YXRlKCk7CisJfQorCXN0YXR1cyA9IG5mc19vazsKKwlpZiAoc2V0YXR0ci0+c2FfYWNsICE9IE5VTEwpCisJCXN0YXR1cyA9IG5mc2Q0X3NldF9uZnM0X2FjbChycXN0cCwgY3VycmVudF9maCwgc2V0YXR0ci0+c2FfYWNsKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBuZnNkX3NldGF0dHIocnFzdHAsIGN1cnJlbnRfZmgsICZzZXRhdHRyLT5zYV9pYXR0ciwKKwkJCQkwLCAodGltZV90KTApOworb3V0OgorCXJldHVybiBzdGF0dXM7CitvdXRfdW5sb2NrOgorCW5mczRfdW5sb2NrX3N0YXRlKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mc2Q0X3dyaXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF93cml0ZSAqd3JpdGUpCit7CisJc3RhdGVpZF90ICpzdGF0ZWlkID0gJndyaXRlLT53cl9zdGF0ZWlkOworCXN0cnVjdCBmaWxlICpmaWxwID0gTlVMTDsKKwl1MzIgKnA7CisJaW50IHN0YXR1cyA9IG5mc19vazsKKworCS8qIG5vIG5lZWQgdG8gY2hlY2sgcGVybWlzc2lvbiAtIHRoaXMgd2lsbCBiZSBkb25lIGluIG5mc2Rfd3JpdGUoKSAqLworCisJaWYgKHdyaXRlLT53cl9vZmZzZXQgPj0gT0ZGU0VUX01BWCkKKwkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKKworCW5mczRfbG9ja19zdGF0ZSgpOworCWlmICgoc3RhdHVzID0gbmZzNF9wcmVwcm9jZXNzX3N0YXRlaWRfb3AoY3VycmVudF9maCwgc3RhdGVpZCwKKwkJCQkJQ0hFQ0tfRkggfCBXUl9TVEFURSwgJmZpbHApKSkgeworCQlkcHJpbnRrKCJORlNEOiBuZnNkNF93cml0ZTogY291bGRuJ3QgcHJvY2VzcyBzdGF0ZWlkIVxuIik7CisJCWdvdG8gb3V0OworCX0KKwluZnM0X3VubG9ja19zdGF0ZSgpOworCisJd3JpdGUtPndyX2J5dGVzX3dyaXR0ZW4gPSB3cml0ZS0+d3JfYnVmbGVuOworCXdyaXRlLT53cl9ob3dfd3JpdHRlbiA9IHdyaXRlLT53cl9zdGFibGVfaG93OworCXAgPSAodTMyICopd3JpdGUtPndyX3ZlcmlmaWVyLmRhdGE7CisJKnArKyA9IG5mc3N2Y19ib290LnR2X3NlYzsKKwkqcCsrID0gbmZzc3ZjX2Jvb3QudHZfdXNlYzsKKworCXN0YXR1cyA9ICBuZnNkX3dyaXRlKHJxc3RwLCBjdXJyZW50X2ZoLCBmaWxwLCB3cml0ZS0+d3Jfb2Zmc2V0LAorCQkJd3JpdGUtPndyX3ZlYywgd3JpdGUtPndyX3ZsZW4sIHdyaXRlLT53cl9idWZsZW4sCisJCQkmd3JpdGUtPndyX2hvd193cml0dGVuKTsKKworCWlmIChzdGF0dXMgPT0gbmZzZXJyX3N5bWxpbmspCisJCXN0YXR1cyA9IG5mc2Vycl9pbnZhbDsKKwlyZXR1cm4gc3RhdHVzOworb3V0OgorCW5mczRfdW5sb2NrX3N0YXRlKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogVGhpcyByb3V0aW5lIG5ldmVyIHJldHVybnMgTkZTX09LISAgSWYgdGhlcmUgYXJlIG5vIG90aGVyIGVycm9ycywgaXQKKyAqIHdpbGwgcmV0dXJuIE5GU0VSUl9TQU1FIG9yIE5GU0VSUl9OT1RfU0FNRSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUKKyAqIGF0dHJpYnV0ZXMgbWF0Y2hlZC4gIFZFUklGWSBpcyBpbXBsZW1lbnRlZCBieSBtYXBwaW5nIE5GU0VSUl9TQU1FCisgKiB0byBORlNfT0sgYWZ0ZXIgdGhlIGNhbGw7IE5WRVJJRlkgYnkgbWFwcGluZyBORlNFUlJfTk9UX1NBTUUgdG8gTkZTX09LLgorICovCitzdGF0aWMgaW50CituZnNkNF92ZXJpZnkoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X3ZlcmlmeSAqdmVyaWZ5KQoreworCXUzMiAqYnVmLCAqcDsKKwlpbnQgY291bnQ7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGZoX3ZlcmlmeShycXN0cCwgY3VycmVudF9maCwgMCwgTUFZX05PUCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmICgodmVyaWZ5LT52ZV9ibXZhbFswXSAmIH5ORlNEX1NVUFBPUlRFRF9BVFRSU19XT1JEMCkKKwkgICAgfHwgKHZlcmlmeS0+dmVfYm12YWxbMV0gJiB+TkZTRF9TVVBQT1JURURfQVRUUlNfV09SRDEpKQorCQlyZXR1cm4gbmZzZXJyX2F0dHJub3RzdXBwOworCWlmICgodmVyaWZ5LT52ZV9ibXZhbFswXSAmIEZBVFRSNF9XT1JEMF9SREFUVFJfRVJST1IpCisJICAgIHx8ICh2ZXJpZnktPnZlX2JtdmFsWzFdICYgTkZTRF9XUklURU9OTFlfQVRUUlNfV09SRDEpKQorCQlyZXR1cm4gbmZzZXJyX2ludmFsOworCWlmICh2ZXJpZnktPnZlX2F0dHJsZW4gJiAzKQorCQlyZXR1cm4gbmZzZXJyX2ludmFsOworCisJLyogY291bnQgaW4gd29yZHM6CisJICogICBiaXRtYXBfbGVuKDEpICsgYml0bWFwKDIpICsgYXR0cl9sZW4oMSkgPSA0CisJICovCisJY291bnQgPSA0ICsgKHZlcmlmeS0+dmVfYXR0cmxlbiA+PiAyKTsKKwlidWYgPSBrbWFsbG9jKGNvdW50IDw8IDIsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gbmZzZXJyX3Jlc291cmNlOworCisJc3RhdHVzID0gbmZzZDRfZW5jb2RlX2ZhdHRyKGN1cnJlbnRfZmgsIGN1cnJlbnRfZmgtPmZoX2V4cG9ydCwKKwkJCQkgICAgY3VycmVudF9maC0+ZmhfZGVudHJ5LCBidWYsCisJCQkJICAgICZjb3VudCwgdmVyaWZ5LT52ZV9ibXZhbCwKKwkJCQkgICAgcnFzdHApOworCisJLyogdGhpcyBtZWFucyB0aGF0IG5mc2Q0X2VuY29kZV9mYXR0cigpIHJhbiBvdXQgb2Ygc3BhY2UgKi8KKwlpZiAoc3RhdHVzID09IG5mc2Vycl9yZXNvdXJjZSAmJiBjb3VudCA9PSAwKQorCQlzdGF0dXMgPSBuZnNlcnJfbm90X3NhbWU7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXRfa2ZyZWU7CisKKwlwID0gYnVmICsgMzsKKwlzdGF0dXMgPSBuZnNlcnJfbm90X3NhbWU7CisJaWYgKG50b2hsKCpwKyspICE9IHZlcmlmeS0+dmVfYXR0cmxlbikKKwkJZ290byBvdXRfa2ZyZWU7CisJaWYgKCFtZW1jbXAocCwgdmVyaWZ5LT52ZV9hdHRydmFsLCB2ZXJpZnktPnZlX2F0dHJsZW4pKQorCQlzdGF0dXMgPSBuZnNlcnJfc2FtZTsKKworb3V0X2tmcmVlOgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIE5VTEwgY2FsbC4KKyAqLworc3RhdGljIGludAorbmZzZDRfcHJvY19udWxsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHZvaWQgKmFyZ3AsIHZvaWQgKnJlc3ApCit7CisJcmV0dXJuIG5mc19vazsKK30KKworCisvKgorICogQ09NUE9VTkQgY2FsbC4KKyAqLworc3RhdGljIGludAorbmZzZDRfcHJvY19jb21wb3VuZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAorCQkgICAgc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncywKKwkJICAgIHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmZzZDRfb3AJKm9wOworCXN0cnVjdCBzdmNfZmgJKmN1cnJlbnRfZmggPSBOVUxMOworCXN0cnVjdCBzdmNfZmgJKnNhdmVfZmggPSBOVUxMOworCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnJlcGxheV9vd25lciA9IE5VTEw7CisJaW50CQlzbGFja19zcGFjZTsgICAgLyogaW4gd29yZHMsIG5vdCBieXRlcyEgKi8KKwlpbnQJCXN0YXR1czsKKworCXN0YXR1cyA9IG5mc2Vycl9yZXNvdXJjZTsKKwljdXJyZW50X2ZoID0ga21hbGxvYyhzaXplb2YoKmN1cnJlbnRfZmgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY3VycmVudF9maCA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlmaF9pbml0KGN1cnJlbnRfZmgsIE5GUzRfRkhTSVpFKTsKKwlzYXZlX2ZoID0ga21hbGxvYyhzaXplb2YoKnNhdmVfZmgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2F2ZV9maCA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlmaF9pbml0KHNhdmVfZmgsIE5GUzRfRkhTSVpFKTsKKworCXJlc3AtPnhidWYgPSAmcnFzdHAtPnJxX3JlczsKKwlyZXNwLT5wID0gcnFzdHAtPnJxX3Jlcy5oZWFkWzBdLmlvdl9iYXNlICsgcnFzdHAtPnJxX3Jlcy5oZWFkWzBdLmlvdl9sZW47CisJcmVzcC0+dGFncCA9IHJlc3AtPnA7CisJLyogcmVzZXJ2ZSBzcGFjZSBmb3I6IHRhZ2xlbiwgdGFnLCBhbmQgb3BjbnQgKi8KKwlyZXNwLT5wICs9IDIgKyBYRFJfUVVBRExFTihhcmdzLT50YWdsZW4pOworCXJlc3AtPmVuZCA9IHJxc3RwLT5ycV9yZXMuaGVhZFswXS5pb3ZfYmFzZSArIFBBR0VfU0laRTsKKwlyZXNwLT50YWdsZW4gPSBhcmdzLT50YWdsZW47CisJcmVzcC0+dGFnID0gYXJncy0+dGFnOworCXJlc3AtPm9wY250ID0gMDsKKwlyZXNwLT5ycXN0cCA9IHJxc3RwOworCisJLyoKKwkgKiBBY2NvcmRpbmcgdG8gUkZDMzAxMCwgdGhpcyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYWxsIG90aGVyIGVycm9ycy4KKwkgKi8KKwlzdGF0dXMgPSBuZnNlcnJfbWlub3JfdmVyc19taXNtYXRjaDsKKwlpZiAoYXJncy0+bWlub3J2ZXJzaW9uID4gTkZTRF9TVVBQT1JURURfTUlOT1JfVkVSU0lPTikKKwkJZ290byBvdXQ7CisKKwlzdGF0dXMgPSBuZnNfb2s7CisJd2hpbGUgKCFzdGF0dXMgJiYgcmVzcC0+b3BjbnQgPCBhcmdzLT5vcGNudCkgeworCQlvcCA9ICZhcmdzLT5vcHNbcmVzcC0+b3BjbnQrK107CisKKwkJLyoKKwkJICogVGhlIFhEUiBkZWNvZGUgcm91dGluZXMgbWF5IGhhdmUgcHJlLXNldCBvcC0+c3RhdHVzOworCQkgKiBmb3IgZXhhbXBsZSwgaWYgdGhlcmUgaXMgYSBtaXNjZWxsYW5lb3VzIFhEUiBlcnJvcgorCQkgKiBpdCB3aWxsIGJlIHNldCB0byBuZnNlcnJfYmFkX3hkci4KKwkJICovCisJCWlmIChvcC0+c3RhdHVzKQorCQkJZ290byBlbmNvZGVfb3A7CisKKwkJLyogV2UgbXVzdCBiZSBhYmxlIHRvIGVuY29kZSBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgdG8KKwkJICogdGhpcyBvcGVyYXRpb24sIHdpdGggZW5vdWdoIHJvb20gbGVmdCBvdmVyIHRvIGVuY29kZSBhCisJCSAqIGZhaWxlZCByZXNwb25zZSB0byB0aGUgbmV4dCBvcGVyYXRpb24uICBJZiB3ZSBkb24ndAorCQkgKiBoYXZlIGVub3VnaCByb29tLCBmYWlsIHdpdGggRVJSX1JFU09VUkNFLgorCQkgKi8KKy8qIEZJWE1FIC0gaXMgc2xhY2tfc3BhY2UgKnJlYWxseSogd29yZHMsIG9yIGJ5dGVzPz8/IC0gbmVpbGIgKi8KKwkJc2xhY2tfc3BhY2UgPSAoY2hhciAqKXJlc3AtPmVuZCAtIChjaGFyICopcmVzcC0+cDsKKwkJaWYgKHNsYWNrX3NwYWNlIDwgQ09NUE9VTkRfU0xBQ0tfU1BBQ0UgKyBDT01QT1VORF9FUlJfU0xBQ0tfU1BBQ0UpIHsKKwkJCUJVR19PTihzbGFja19zcGFjZSA8IENPTVBPVU5EX0VSUl9TTEFDS19TUEFDRSk7CisJCQlvcC0+c3RhdHVzID0gbmZzZXJyX3Jlc291cmNlOworCQkJZ290byBlbmNvZGVfb3A7CisJCX0KKworCQkvKiBBbGwgb3BlcmF0aW9ucyBleGNlcHQgUkVORVcsIFNFVENMSUVOVElELCBSRVNUT1JFRkgKKwkJKiBTRVRDTElFTlRJRF9DT05GSVJNLCBQVVRGSCBhbmQgUFVUUk9PVEZICisJCSogcmVxdWlyZSBhIHZhbGlkIGN1cnJlbnQgZmlsZWhhbmRsZQorCQkqCisJCSogU0VUQVRUUiBOT0ZJTEVIQU5ETEUgZXJyb3IgaGFuZGxlZCBpbiBuZnNkNF9zZXRhdHRyCisJCSogZHVlIHRvIHJlcXVpcmVkIHJldHVybmVkIGJpdG1hcCBhcmd1bWVudAorCQkqLworCQlpZiAoKCFjdXJyZW50X2ZoLT5maF9kZW50cnkpICYmCisJCSAgICEoKG9wLT5vcG51bSA9PSBPUF9QVVRGSCkgfHwgKG9wLT5vcG51bSA9PSBPUF9QVVRST09URkgpIHx8CisJCSAgIChvcC0+b3BudW0gPT0gT1BfU0VUQ0xJRU5USUQpIHx8CisJCSAgIChvcC0+b3BudW0gPT0gT1BfU0VUQ0xJRU5USURfQ09ORklSTSkgfHwKKwkJICAgKG9wLT5vcG51bSA9PSBPUF9SRU5FVykgfHwgKG9wLT5vcG51bSA9PSBPUF9SRVNUT1JFRkgpIHx8CisJCSAgIChvcC0+b3BudW0gPT0gT1BfUkVMRUFTRV9MT0NLT1dORVIpIHx8CisJCSAgIChvcC0+b3BudW0gPT0gT1BfU0VUQVRUUikpKSB7CisJCQlvcC0+c3RhdHVzID0gbmZzZXJyX25vZmlsZWhhbmRsZTsKKwkJCWdvdG8gZW5jb2RlX29wOworCQl9CisJCXN3aXRjaCAob3AtPm9wbnVtKSB7CisJCWNhc2UgT1BfQUNDRVNTOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2FjY2VzcyhycXN0cCwgY3VycmVudF9maCwgJm9wLT51LmFjY2Vzcyk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9DTE9TRToKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9jbG9zZShycXN0cCwgY3VycmVudF9maCwgJm9wLT51LmNsb3NlKTsKKwkJCXJlcGxheV9vd25lciA9IG9wLT51LmNsb3NlLmNsX3N0YXRlb3duZXI7CisJCQlicmVhazsKKwkJY2FzZSBPUF9DT01NSVQ6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfY29tbWl0KHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUuY29tbWl0KTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0NSRUFURToKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9jcmVhdGUocnFzdHAsIGN1cnJlbnRfZmgsICZvcC0+dS5jcmVhdGUpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfREVMRUdSRVRVUk46CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVsZWdyZXR1cm4ocnFzdHAsIGN1cnJlbnRfZmgsICZvcC0+dS5kZWxlZ3JldHVybik7CisJCQlicmVhazsKKwkJY2FzZSBPUF9HRVRBVFRSOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2dldGF0dHIocnFzdHAsIGN1cnJlbnRfZmgsICZvcC0+dS5nZXRhdHRyKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0dFVEZIOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2dldGZoKGN1cnJlbnRfZmgsICZvcC0+dS5nZXRmaCk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9MSU5LOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2xpbmsocnFzdHAsIGN1cnJlbnRfZmgsIHNhdmVfZmgsICZvcC0+dS5saW5rKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0xPQ0s6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfbG9jayhycXN0cCwgY3VycmVudF9maCwgJm9wLT51LmxvY2spOworCQkJcmVwbGF5X293bmVyID0gb3AtPnUubG9jay5sa19zdGF0ZW93bmVyOworCQkJYnJlYWs7CisJCWNhc2UgT1BfTE9DS1Q6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfbG9ja3QocnFzdHAsIGN1cnJlbnRfZmgsICZvcC0+dS5sb2NrdCk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9MT0NLVToKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9sb2NrdShycXN0cCwgY3VycmVudF9maCwgJm9wLT51LmxvY2t1KTsKKwkJCXJlcGxheV9vd25lciA9IG9wLT51LmxvY2t1Lmx1X3N0YXRlb3duZXI7CisJCQlicmVhazsKKwkJY2FzZSBPUF9MT09LVVA6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfbG9va3VwKHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUubG9va3VwKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0xPT0tVUFA6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfbG9va3VwcChycXN0cCwgY3VycmVudF9maCk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9OVkVSSUZZOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X3ZlcmlmeShycXN0cCwgY3VycmVudF9maCwgJm9wLT51Lm52ZXJpZnkpOworCQkJaWYgKG9wLT5zdGF0dXMgPT0gbmZzZXJyX25vdF9zYW1lKQorCQkJCW9wLT5zdGF0dXMgPSBuZnNfb2s7CisJCQlicmVhazsKKwkJY2FzZSBPUF9PUEVOOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X29wZW4ocnFzdHAsIGN1cnJlbnRfZmgsICZvcC0+dS5vcGVuKTsKKwkJCXJlcGxheV9vd25lciA9IG9wLT51Lm9wZW4ub3Bfc3RhdGVvd25lcjsKKwkJCWJyZWFrOworCQljYXNlIE9QX09QRU5fQ09ORklSTToKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9vcGVuX2NvbmZpcm0ocnFzdHAsIGN1cnJlbnRfZmgsICZvcC0+dS5vcGVuX2NvbmZpcm0pOworCQkJcmVwbGF5X293bmVyID0gb3AtPnUub3Blbl9jb25maXJtLm9jX3N0YXRlb3duZXI7CisJCQlicmVhazsKKwkJY2FzZSBPUF9PUEVOX0RPV05HUkFERToKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9vcGVuX2Rvd25ncmFkZShycXN0cCwgY3VycmVudF9maCwgJm9wLT51Lm9wZW5fZG93bmdyYWRlKTsKKwkJCXJlcGxheV9vd25lciA9IG9wLT51Lm9wZW5fZG93bmdyYWRlLm9kX3N0YXRlb3duZXI7CisJCQlicmVhazsKKwkJY2FzZSBPUF9QVVRGSDoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9wdXRmaChycXN0cCwgY3VycmVudF9maCwgJm9wLT51LnB1dGZoKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX1BVVFJPT1RGSDoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9wdXRyb290ZmgocnFzdHAsIGN1cnJlbnRfZmgpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfUkVBRDoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9yZWFkKHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUucmVhZCk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9SRUFERElSOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X3JlYWRkaXIocnFzdHAsIGN1cnJlbnRfZmgsICZvcC0+dS5yZWFkZGlyKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX1JFQURMSU5LOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X3JlYWRsaW5rKHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUucmVhZGxpbmspOworCQkJYnJlYWs7CisJCWNhc2UgT1BfUkVNT1ZFOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X3JlbW92ZShycXN0cCwgY3VycmVudF9maCwgJm9wLT51LnJlbW92ZSk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9SRU5BTUU6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfcmVuYW1lKHJxc3RwLCBjdXJyZW50X2ZoLCBzYXZlX2ZoLCAmb3AtPnUucmVuYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX1JFTkVXOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X3JlbmV3KCZvcC0+dS5yZW5ldyk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9SRVNUT1JFRkg6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfcmVzdG9yZWZoKGN1cnJlbnRfZmgsIHNhdmVfZmgpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfU0FWRUZIOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X3NhdmVmaChjdXJyZW50X2ZoLCBzYXZlX2ZoKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX1NFVEFUVFI6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfc2V0YXR0cihycXN0cCwgY3VycmVudF9maCwgJm9wLT51LnNldGF0dHIpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfU0VUQ0xJRU5USUQ6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfc2V0Y2xpZW50aWQocnFzdHAsICZvcC0+dS5zZXRjbGllbnRpZCk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9TRVRDTElFTlRJRF9DT05GSVJNOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X3NldGNsaWVudGlkX2NvbmZpcm0ocnFzdHAsICZvcC0+dS5zZXRjbGllbnRpZF9jb25maXJtKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX1ZFUklGWToKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF92ZXJpZnkocnFzdHAsIGN1cnJlbnRfZmgsICZvcC0+dS52ZXJpZnkpOworCQkJaWYgKG9wLT5zdGF0dXMgPT0gbmZzZXJyX3NhbWUpCisJCQkJb3AtPnN0YXR1cyA9IG5mc19vazsKKwkJCWJyZWFrOworCQljYXNlIE9QX1dSSVRFOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X3dyaXRlKHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUud3JpdGUpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfUkVMRUFTRV9MT0NLT1dORVI6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfcmVsZWFzZV9sb2Nrb3duZXIocnFzdHAsICZvcC0+dS5yZWxlYXNlX2xvY2tvd25lcik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJVR19PTihvcC0+c3RhdHVzID09IG5mc19vayk7CisJCQlicmVhazsKKwkJfQorCitlbmNvZGVfb3A6CisJCWlmIChvcC0+c3RhdHVzID09IE5GU0VSUl9SRVBMQVlfTUUpIHsKKwkJCW9wLT5yZXBsYXkgPSAmcmVwbGF5X293bmVyLT5zb19yZXBsYXk7CisJCQluZnNkNF9lbmNvZGVfcmVwbGF5KHJlc3AsIG9wKTsKKwkJCXN0YXR1cyA9IG9wLT5zdGF0dXMgPSBvcC0+cmVwbGF5LT5ycF9zdGF0dXM7CisJCX0gZWxzZSB7CisJCQluZnNkNF9lbmNvZGVfb3BlcmF0aW9uKHJlc3AsIG9wKTsKKwkJCXN0YXR1cyA9IG9wLT5zdGF0dXM7CisJCX0KKwkJaWYgKHJlcGxheV9vd25lciAmJiAocmVwbGF5X293bmVyICE9ICh2b2lkICopKC0xKSkpIHsKKwkJCW5mczRfcHV0X3N0YXRlb3duZXIocmVwbGF5X293bmVyKTsKKwkJCXJlcGxheV9vd25lciA9IE5VTEw7CisJCX0KKwl9CisKK291dDoKKwluZnNkNF9yZWxlYXNlX2NvbXBvdW5kYXJncyhhcmdzKTsKKwlpZiAoY3VycmVudF9maCkKKwkJZmhfcHV0KGN1cnJlbnRfZmgpOworCWtmcmVlKGN1cnJlbnRfZmgpOworCWlmIChzYXZlX2ZoKQorCQlmaF9wdXQoc2F2ZV9maCk7CisJa2ZyZWUoc2F2ZV9maCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworI2RlZmluZSBuZnM0c3ZjX2RlY29kZV92b2lkYXJncwkJTlVMTAorI2RlZmluZSBuZnM0c3ZjX3JlbGVhc2Vfdm9pZAkJTlVMTAorI2RlZmluZSBuZnNkNF92b2lkcmVzCQkJbmZzZDRfdm9pZGFyZ3MKKyNkZWZpbmUgbmZzNHN2Y19yZWxlYXNlX2NvbXBvdW5kCU5VTEwKK3N0cnVjdCBuZnNkNF92b2lkYXJncyB7IGludCBkdW1teTsgfTsKKworI2RlZmluZSBQUk9DKG5hbWUsIGFyZ3QsIHJlc3QsIHJlbHQsIGNhY2hlLCByZXNwc2l6ZSkJXAorIHsgKHN2Y19wcm9jZnVuYykgbmZzZDRfcHJvY18jI25hbWUsCQlcCisgICAoa3hkcnByb2NfdCkgbmZzNHN2Y19kZWNvZGVfIyNhcmd0IyNhcmdzLAlcCisgICAoa3hkcnByb2NfdCkgbmZzNHN2Y19lbmNvZGVfIyNyZXN0IyNyZXMsCVwKKyAgIChreGRycHJvY190KSBuZnM0c3ZjX3JlbGVhc2VfIyNyZWx0LAkJXAorICAgc2l6ZW9mKHN0cnVjdCBuZnNkNF8jI2FyZ3QjI2FyZ3MpLAkJXAorICAgc2l6ZW9mKHN0cnVjdCBuZnNkNF8jI3Jlc3QjI3JlcyksCQlcCisgICAwLAkJCQkJCVwKKyAgIGNhY2hlLAkJCQkJXAorICAgcmVzcHNpemUsCQkJCQlcCisgfQorCisvKgorICogVE9ETzogQXQgdGhlIHByZXNlbnQgdGltZSwgdGhlIE5GU3Y0IHNlcnZlciBkb2VzIG5vdCBkbyBYSUQgY2FjaGluZworICogb2YgcmVxdWVzdHMuICBJbXBsZW1lbnRpbmcgWElEIGNhY2hpbmcgd291bGQgbm90IGJlIGEgc2VyaW91cyBwcm9ibGVtLAorICogYWx0aG91Z2ggaXQgd291bGQgcmVxdWlyZSBhIG1pbGQgY2hhbmdlIGluIGludGVyZmFjZXMgc2luY2Ugb25lCisgKiBkb2Vzbid0IGtub3cgd2hldGhlciBhbiBORlN2NCByZXF1ZXN0IGlzIGlkZW1wb3RlbnQgdW50aWwgYWZ0ZXIgdGhlCisgKiBYRFIgZGVjb2RlLiAgSG93ZXZlciwgWElEIGNhY2hpbmcgdG90YWxseSBjb25mdXNlcyBweW5mcyAoUGV0ZXIKKyAqIEFzdHJhbmQncyByZWdyZXNzaW9uIHRlc3RzdWl0ZSBmb3IgTkZTdjQgc2VydmVycyksIHdoaWNoIHJldXNlcworICogWElEJ3MgbGliZXJhbGx5LCBzbyBJJ3ZlIGxlZnQgaXQgdW5pbXBsZW1lbnRlZCB1bnRpbCBweW5mcyBnZW5lcmF0ZXMKKyAqIGJldHRlciBYSUQncy4KKyAqLworc3RhdGljIHN0cnVjdCBzdmNfcHJvY2VkdXJlCQluZnNkX3Byb2NlZHVyZXM0WzJdID0geworICBQUk9DKG51bGwsCSB2b2lkLAkJdm9pZCwJCXZvaWQsCSAgUkNfTk9DQUNIRSwgMSksCisgIFBST0MoY29tcG91bmQsIGNvbXBvdW5kLAljb21wb3VuZCwJY29tcG91bmQsIFJDX05PQ0FDSEUsIE5GU0RfQlVGU0laRSkKK307CisKK3N0cnVjdCBzdmNfdmVyc2lvbgluZnNkX3ZlcnNpb240ID0geworCQkudnNfdmVycwk9IDQsCisJCS52c19ucHJvYwk9IDIsCisJCS52c19wcm9jCT0gbmZzZF9wcm9jZWR1cmVzNCwKKwkJLnZzX2Rpc3BhdGNoCT0gbmZzZF9kaXNwYXRjaCwKKwkJLnZzX3hkcnNpemUJPSBORlM0X1NWQ19YRFJTSVpFLAorfTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRzdGF0ZS5jIGIvZnMvbmZzZC9uZnM0c3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzlmN2ZlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzZC9uZnM0c3RhdGUuYwpAQCAtMCwwICsxLDMzMjAgQEAKKy8qCisqICBsaW51eC9mcy9uZnNkL25mczRzdGF0ZS5jCisqCisqICBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiAgS2VuZHJpY2sgU21pdGggPGttc21pdGhAdW1pY2guZWR1PgorKiAgQW5keSBBZGFtc29uIDxrYW5kcm9zQHVtaWNoLmVkdT4KKyoKKyogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisqICBhcmUgbWV0OgorKgorKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKiAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisqICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisqICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyogIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyogIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyogIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKi8KKworI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvbmZzNC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2Qvc3RhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL3hkcjQuaD4KKworI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZICAgICAgICAgICAgICAgIE5GU0REQkdfUFJPQworCisvKiBHbG9iYWxzICovCitzdGF0aWMgdGltZV90IGxlYXNlX3RpbWUgPSA5MDsgICAgIC8qIGRlZmF1bHQgbGVhc2UgdGltZSAqLworc3RhdGljIHRpbWVfdCBvbGRfbGVhc2VfdGltZSA9IDkwOyAvKiBwYXN0IGluY2FybmF0aW9uIGxlYXNlIHRpbWUgKi8KK3N0YXRpYyB1MzIgbmZzNF9yZWNsYWltX2luaXQgPSAwOwordGltZV90IGJvb3RfdGltZTsKK3N0YXRpYyB0aW1lX3QgZ3JhY2VfZW5kID0gMDsKK3N0YXRpYyB1MzIgY3VycmVudF9jbGllbnRpZCA9IDE7CitzdGF0aWMgdTMyIGN1cnJlbnRfb3duZXJpZCA9IDE7CitzdGF0aWMgdTMyIGN1cnJlbnRfZmlsZWlkID0gMTsKK3N0YXRpYyB1MzIgY3VycmVudF9kZWxlZ2lkID0gMTsKK3N0YXRpYyB1MzIgbmZzNF9pbml0Oworc3RhdGVpZF90IHplcm9zdGF0ZWlkOyAgICAgICAgICAgICAvKiBiaXRzIGFsbCAwICovCitzdGF0ZWlkX3Qgb25lc3RhdGVpZDsgICAgICAgICAgICAgIC8qIGJpdHMgYWxsIDEgKi8KKworLyogZGVidWcgY291bnRlcnMgKi8KK3UzMiBsaXN0X2FkZF9wZXJmaWxlID0gMDsgCit1MzIgbGlzdF9kZWxfcGVyZmlsZSA9IDA7Cit1MzIgYWRkX3BlcmNsaWVudCA9IDA7Cit1MzIgZGVsX3BlcmNsaWVudCA9IDA7Cit1MzIgYWxsb2NfZmlsZSA9IDA7Cit1MzIgZnJlZV9maWxlID0gMDsKK3UzMiB2ZnNvcGVuID0gMDsKK3UzMiB2ZnNjbG9zZSA9IDA7Cit1MzIgYWxsb2NfZGVsZWdhdGlvbj0gMDsKK3UzMiBmcmVlX2RlbGVnYXRpb249IDA7CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCitzdHJ1Y3QgbmZzNF9zdGF0ZWlkICogZmluZF9zdGF0ZWlkKHN0YXRlaWRfdCAqc3RpZCwgaW50IGZsYWdzKTsKK3N0YXRpYyBzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICogZmluZF9kZWxlZ2F0aW9uX3N0YXRlaWQoc3RydWN0IGlub2RlICppbm8sIHN0YXRlaWRfdCAqc3RpZCk7CitzdGF0aWMgdm9pZCByZWxlYXNlX3N0YXRlaWRfbG9ja293bmVycyhzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpvcGVuX3N0cCk7CisKKy8qIExvY2tpbmc6CisgKgorICogY2xpZW50X3NlbWE6IAorICogCXByb3RlY3RzIGNsaWVudGlkX2hhc2h0YmxbXSwgY2xpZW50c3RyX2hhc2h0YmxbXSwKKyAqIAl1bmNvbmZzdHJfaGFzaHRibFtdLCB1bmNvZmlkX2hhc2h0YmxbXS4KKyAqLworc3RhdGljIERFQ0xBUkVfTVVURVgoY2xpZW50X3NlbWEpOworCit2b2lkCituZnM0X2xvY2tfc3RhdGUodm9pZCkKK3sKKwlkb3duKCZjbGllbnRfc2VtYSk7Cit9CisKK3ZvaWQKK25mczRfdW5sb2NrX3N0YXRlKHZvaWQpCit7CisJdXAoJmNsaWVudF9zZW1hKTsKK30KKworc3RhdGljIGlubGluZSB1MzIKK29wYXF1ZV9oYXNodmFsKGNvbnN0IHZvaWQgKnB0ciwgaW50IG5ieXRlcykKK3sKKwl1bnNpZ25lZCBjaGFyICpjcHRyID0gKHVuc2lnbmVkIGNoYXIgKikgcHRyOworCisJdTMyIHggPSAwOworCXdoaWxlIChuYnl0ZXMtLSkgeworCQl4ICo9IDM3OworCQl4ICs9ICpjcHRyKys7CisJfQorCXJldHVybiB4OworfQorCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIHZvaWQgcmVsZWFzZV9zdGF0ZW93bmVyKHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcCk7CitzdGF0aWMgdm9pZCByZWxlYXNlX3N0YXRlaWQoc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwLCBpbnQgZmxhZ3MpOworc3RhdGljIHZvaWQgcmVsZWFzZV9maWxlKHN0cnVjdCBuZnM0X2ZpbGUgKmZwKTsKKworLyoKKyAqIERlbGVnYXRpb24gc3RhdGUKKyAqLworCisvKiByZWNhbGxfbG9jayBwcm90ZWN0cyB0aGUgZGVsX3JlY2FsbF9scnUgKi8KK3NwaW5sb2NrX3QgcmVjYWxsX2xvY2s7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBkZWxfcmVjYWxsX2xydTsKKworc3RhdGljIHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKgorYWxsb2NfaW5pdF9kZWxlZyhzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCwgc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCB1MzIgdHlwZSkKK3sKKwlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcDsKKwlzdHJ1Y3QgbmZzNF9maWxlICpmcCA9IHN0cC0+c3RfZmlsZTsKKwlzdHJ1Y3QgbmZzNF9jYWxsYmFjayAqY2IgPSAmc3RwLT5zdF9zdGF0ZW93bmVyLT5zb19jbGllbnQtPmNsX2NhbGxiYWNrOworCisJZHByaW50aygiTkZTRCBhbGxvY19pbml0X2RlbGVnXG4iKTsKKwlpZiAoKGRwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5mczRfZGVsZWdhdGlvbiksCisJCUdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gZHA7CisJSU5JVF9MSVNUX0hFQUQoJmRwLT5kbF9kZWxfcGVyZmlsZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRwLT5kbF9kZWxfcGVyY2xudCk7CisJSU5JVF9MSVNUX0hFQUQoJmRwLT5kbF9yZWNhbGxfbHJ1KTsKKwlkcC0+ZGxfY2xpZW50ID0gY2xwOworCWRwLT5kbF9maWxlID0gZnA7CisJZHAtPmRsX2Zsb2NrID0gTlVMTDsKKwlnZXRfZmlsZShzdHAtPnN0X3Zmc19maWxlKTsKKwlkcC0+ZGxfdmZzX2ZpbGUgPSBzdHAtPnN0X3Zmc19maWxlOworCWRwLT5kbF90eXBlID0gdHlwZTsKKwlkcC0+ZGxfcmVjYWxsLmNicl9kcCA9IE5VTEw7CisJZHAtPmRsX3JlY2FsbC5jYnJfaWRlbnQgPSBjYi0+Y2JfaWRlbnQ7CisJZHAtPmRsX3JlY2FsbC5jYnJfdHJ1bmMgPSAwOworCWRwLT5kbF9zdGF0ZWlkLnNpX2Jvb3QgPSBib290X3RpbWU7CisJZHAtPmRsX3N0YXRlaWQuc2lfc3RhdGVvd25lcmlkID0gY3VycmVudF9kZWxlZ2lkKys7CisJZHAtPmRsX3N0YXRlaWQuc2lfZmlsZWlkID0gMDsKKwlkcC0+ZGxfc3RhdGVpZC5zaV9nZW5lcmF0aW9uID0gMDsKKwlkcC0+ZGxfZmhsZW4gPSBjdXJyZW50X2ZoLT5maF9oYW5kbGUuZmhfc2l6ZTsKKwltZW1jcHkoZHAtPmRsX2ZodmFsLCAmY3VycmVudF9maC0+ZmhfaGFuZGxlLmZoX2Jhc2UsCisJCSAgICAgICAgY3VycmVudF9maC0+ZmhfaGFuZGxlLmZoX3NpemUpOworCWRwLT5kbF90aW1lID0gMDsKKwlhdG9taWNfc2V0KCZkcC0+ZGxfY291bnQsIDEpOworCWxpc3RfYWRkKCZkcC0+ZGxfZGVsX3BlcmZpbGUsICZmcC0+ZmlfZGVsX3BlcmZpbGUpOworCWxpc3RfYWRkKCZkcC0+ZGxfZGVsX3BlcmNsbnQsICZjbHAtPmNsX2RlbF9wZXJjbG50KTsKKwlhbGxvY19kZWxlZ2F0aW9uKys7CisJcmV0dXJuIGRwOworfQorCit2b2lkCituZnM0X3B1dF9kZWxlZ2F0aW9uKHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkcC0+ZGxfY291bnQpKSB7CisJCWRwcmludGsoIk5GU0Q6IGZyZWVpbmcgZHAgJXBcbiIsZHApOworCQlrZnJlZShkcCk7CisJCWZyZWVfZGVsZWdhdGlvbisrOworCX0KK30KKworLyogUmVtb3ZlIHRoZSBhc3NvY2lhdGVkIGZpbGVfbG9jayBmaXJzdCwgdGhlbiByZW1vdmUgdGhlIGRlbGVnYXRpb24uCisgKiBsZWFzZV9tb2RpZnkoKSBpcyBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBGU19MRUFTRSBmaWxlX2xvY2sgZnJvbQorICogdGhlIGlfZmxvY2sgbGlzdCwgZXZlbnR1YWxseSBjYWxsaW5nIG5mc2QncyBsb2NrX21hbmFnZXIKKyAqIGZsX3JlbGVhc2VfY2FsbGJhY2suCisgKi8KK3N0YXRpYyB2b2lkCituZnM0X2Nsb3NlX2RlbGVnYXRpb24oc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHApCit7CisJc3RydWN0IGZpbGUgKmZpbHAgPSBkcC0+ZGxfdmZzX2ZpbGU7CisKKwlkcHJpbnRrKCJORlNEOiBjbG9zZV9kZWxlZ2F0aW9uIGRwICVwXG4iLGRwKTsKKwlkcC0+ZGxfdmZzX2ZpbGUgPSBOVUxMOworCS8qIFRoZSBmb2xsb3dpbmcgbmZzZF9jbG9zZSBtYXkgbm90IGFjdHVhbGx5IGNsb3NlIHRoZSBmaWxlLAorCSAqIGJ1dCB3ZSB3YW50IHRvIHJlbW92ZSB0aGUgbGVhc2UgaW4gYW55IGNhc2UuICovCisJc2V0bGVhc2UoZmlscCwgRl9VTkxDSywgJmRwLT5kbF9mbG9jayk7CisJbmZzZF9jbG9zZShmaWxwKTsKKwl2ZnNjbG9zZSsrOworfQorCisvKiBDYWxsZWQgdW5kZXIgdGhlIHN0YXRlIGxvY2suICovCitzdGF0aWMgdm9pZAordW5oYXNoX2RlbGVnYXRpb24oc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHApCit7CisJbGlzdF9kZWxfaW5pdCgmZHAtPmRsX2RlbF9wZXJmaWxlKTsKKwlsaXN0X2RlbF9pbml0KCZkcC0+ZGxfZGVsX3BlcmNsbnQpOworCXNwaW5fbG9jaygmcmVjYWxsX2xvY2spOworCWxpc3RfZGVsX2luaXQoJmRwLT5kbF9yZWNhbGxfbHJ1KTsKKwlzcGluX3VubG9jaygmcmVjYWxsX2xvY2spOworCW5mczRfY2xvc2VfZGVsZWdhdGlvbihkcCk7CisJbmZzNF9wdXRfZGVsZWdhdGlvbihkcCk7Cit9CisKKy8qIAorICogU0VUQ0xJRU5USUQgc3RhdGUgCisgKi8KKworLyogSGFzaCB0YWJsZXMgZm9yIG5mczRfY2xpZW50aWQgc3RhdGUgKi8KKyNkZWZpbmUgQ0xJRU5UX0hBU0hfQklUUyAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDTElFTlRfSEFTSF9TSVpFICAgICAgICAgICAgICAgICgxIDw8IENMSUVOVF9IQVNIX0JJVFMpCisjZGVmaW5lIENMSUVOVF9IQVNIX01BU0sgICAgICAgICAgICAgICAgKENMSUVOVF9IQVNIX1NJWkUgLSAxKQorCisjZGVmaW5lIGNsaWVudGlkX2hhc2h2YWwoaWQpIFwKKwkoKGlkKSAmIENMSUVOVF9IQVNIX01BU0spCisjZGVmaW5lIGNsaWVudHN0cl9oYXNodmFsKG5hbWUsIG5hbWVsZW4pIFwKKwkob3BhcXVlX2hhc2h2YWwoKG5hbWUpLCAobmFtZWxlbikpICYgQ0xJRU5UX0hBU0hfTUFTSykKKy8qCisgKiByZWNsYWltX3N0cl9oYXNodGJsW10gaG9sZHMga25vd24gY2xpZW50IGluZm8gZnJvbSBwcmV2aW91cyByZXNldC9yZWJvb3QKKyAqIHVzZWQgaW4gcmVib290L3Jlc2V0IGxlYXNlIGdyYWNlIHBlcmlvZCBwcm9jZXNzaW5nCisgKgorICogY29uZl9pZF9oYXNodGJsW10sIGFuZCBjb25mX3N0cl9oYXNodGJsW10gaG9sZCBjb25maXJtZWQKKyAqIHNldGNsaWVudGlkX2NvbmZpcm1lZCBpbmZvLiAKKyAqCisgKiB1bmNvbmZfc3RyX2hhc3RibFtdIGFuZCB1bmNvbmZfaWRfaGFzaHRibFtdIGhvbGQgdW5jb25maXJtZWQgCisgKiBzZXRjbGllbnRpZCBpbmZvLgorICoKKyAqIGNsaWVudF9scnUgaG9sZHMgY2xpZW50IHF1ZXVlIG9yZGVyZWQgYnkgbmZzNF9jbGllbnQuY2xfdGltZQorICogZm9yIGxlYXNlIHJlbmV3YWwuCisgKgorICogY2xvc2VfbHJ1IGhvbGRzIChvcGVuKSBzdGF0ZW93bmVyIHF1ZXVlIG9yZGVyZWQgYnkgbmZzNF9zdGF0ZW93bmVyLnNvX3RpbWUKKyAqIGZvciBsYXN0IGNsb3NlIHJlcGxheS4KKyAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQJcmVjbGFpbV9zdHJfaGFzaHRibFtDTElFTlRfSEFTSF9TSVpFXTsKK3N0YXRpYyBpbnQgcmVjbGFpbV9zdHJfaGFzaHRibF9zaXplID0gMDsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkCWNvbmZfaWRfaGFzaHRibFtDTElFTlRfSEFTSF9TSVpFXTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkCWNvbmZfc3RyX2hhc2h0YmxbQ0xJRU5UX0hBU0hfU0laRV07CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZAl1bmNvbmZfc3RyX2hhc2h0YmxbQ0xJRU5UX0hBU0hfU0laRV07CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZAl1bmNvbmZfaWRfaGFzaHRibFtDTElFTlRfSEFTSF9TSVpFXTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGNsaWVudF9scnU7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBjbG9zZV9scnU7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcmVuZXdfY2xpZW50KHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCS8qCisJKiBNb3ZlIGNsaWVudCB0byB0aGUgZW5kIHRvIHRoZSBMUlUgbGlzdC4KKwkqLworCWRwcmludGsoInJlbmV3aW5nIGNsaWVudCAoY2xpZW50aWQgJTA4eC8lMDh4KVxuIiwgCisJCQljbHAtPmNsX2NsaWVudGlkLmNsX2Jvb3QsIAorCQkJY2xwLT5jbF9jbGllbnRpZC5jbF9pZCk7CisJbGlzdF9tb3ZlX3RhaWwoJmNscC0+Y2xfbHJ1LCAmY2xpZW50X2xydSk7CisJY2xwLT5jbF90aW1lID0gZ2V0X3NlY29uZHMoKTsKK30KKworLyogU0VUQ0xJRU5USUQgYW5kIFNFVENMSUVOVElEX0NPTkZJUk0gSGVscGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGludAorU1RBTEVfQ0xJRU5USUQoY2xpZW50aWRfdCAqY2xpZCkKK3sKKwlpZiAoY2xpZC0+Y2xfYm9vdCA9PSBib290X3RpbWUpCisJCXJldHVybiAwOworCWRwcmludGsoIk5GU0Qgc3RhbGUgY2xpZW50aWQgKCUwOHgvJTA4eClcbiIsIAorCQkJY2xpZC0+Y2xfYm9vdCwgY2xpZC0+Y2xfaWQpOworCXJldHVybiAxOworfQorCisvKiAKKyAqIFhYWCBTaG91bGQgd2UgdXNlIGEgc2xhYiBjYWNoZSA/CisgKiBUaGlzIHR5cGUgb2YgbWVtb3J5IG1hbmFnZW1lbnQgaXMgc29tZXdoYXQgaW5lZmZpY2llbnQsIGJ1dCB3ZSB1c2UgaXQKKyAqIGFueXdheSBzaW5jZSBTRVRDTElFTlRJRCBpcyBub3QgYSBjb21tb24gb3BlcmF0aW9uLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnM0X2NsaWVudCAqCithbGxvY19jbGllbnQoc3RydWN0IHhkcl9uZXRvYmogbmFtZSkKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscDsKKworCWlmICgoY2xwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5mczRfY2xpZW50KSwgR0ZQX0tFUk5FTCkpIT0gTlVMTCkgeworCQltZW1zZXQoY2xwLCAwLCBzaXplb2YoKmNscCkpOworCQlpZiAoKGNscC0+Y2xfbmFtZS5kYXRhID0ga21hbGxvYyhuYW1lLmxlbiwgR0ZQX0tFUk5FTCkpICE9IE5VTEwpIHsKKwkJCW1lbWNweShjbHAtPmNsX25hbWUuZGF0YSwgbmFtZS5kYXRhLCBuYW1lLmxlbik7CisJCQljbHAtPmNsX25hbWUubGVuID0gbmFtZS5sZW47CisJCX0KKwkJZWxzZSB7CisJCQlrZnJlZShjbHApOworCQkJY2xwID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gY2xwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZyZWVfY2xpZW50KHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCWlmIChjbHAtPmNsX2NyZWQuY3JfZ3JvdXBfaW5mbykKKwkJcHV0X2dyb3VwX2luZm8oY2xwLT5jbF9jcmVkLmNyX2dyb3VwX2luZm8pOworCWtmcmVlKGNscC0+Y2xfbmFtZS5kYXRhKTsKKwlrZnJlZShjbHApOworfQorCit2b2lkCitwdXRfbmZzNF9jbGllbnQoc3RydWN0IG5mczRfY2xpZW50ICpjbHApCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNscC0+Y2xfY291bnQpKQorCQlmcmVlX2NsaWVudChjbHApOworfQorCitzdGF0aWMgdm9pZAorZXhwaXJlX2NsaWVudChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3A7CisJc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHA7CisJc3RydWN0IG5mczRfY2FsbGJhY2sgKmNiID0gJmNscC0+Y2xfY2FsbGJhY2s7CisJc3RydWN0IHJwY19jbG50ICpjbG50ID0gY2xwLT5jbF9jYWxsYmFjay5jYl9jbGllbnQ7CisJc3RydWN0IGxpc3RfaGVhZCByZWFwbGlzdDsKKworCWRwcmludGsoIk5GU0Q6IGV4cGlyZV9jbGllbnQgY2xfY291bnQgJWRcbiIsCisJICAgICAgICAgICAgICAgICAgICBhdG9taWNfcmVhZCgmY2xwLT5jbF9jb3VudCkpOworCisJLyogc2h1dGRvd24gcnBjIGNsaWVudCwgZW5kaW5nIGFueSBvdXRzdGFuZGluZyByZWNhbGwgcnBjcyAqLworCWlmIChhdG9taWNfcmVhZCgmY2ItPmNiX3NldCkgPT0gMSAmJiBjbG50KSB7CisJCXJwY19zaHV0ZG93bl9jbGllbnQoY2xudCk7CisJCWNsbnQgPSBjbHAtPmNsX2NhbGxiYWNrLmNiX2NsaWVudCA9IE5VTEw7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJnJlYXBsaXN0KTsKKwlzcGluX2xvY2soJnJlY2FsbF9sb2NrKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmNscC0+Y2xfZGVsX3BlcmNsbnQpKSB7CisJCWRwID0gbGlzdF9lbnRyeShjbHAtPmNsX2RlbF9wZXJjbG50Lm5leHQsIHN0cnVjdCBuZnM0X2RlbGVnYXRpb24sIGRsX2RlbF9wZXJjbG50KTsKKwkJZHByaW50aygiTkZTRDogZXhwaXJlIGNsaWVudC4gZHAgJXAsIGZwICVwXG4iLCBkcCwKKwkJCQlkcC0+ZGxfZmxvY2spOworCQlsaXN0X2RlbF9pbml0KCZkcC0+ZGxfZGVsX3BlcmNsbnQpOworCQlsaXN0X21vdmUoJmRwLT5kbF9yZWNhbGxfbHJ1LCAmcmVhcGxpc3QpOworCX0KKwlzcGluX3VubG9jaygmcmVjYWxsX2xvY2spOworCXdoaWxlICghbGlzdF9lbXB0eSgmcmVhcGxpc3QpKSB7CisJCWRwID0gbGlzdF9lbnRyeShyZWFwbGlzdC5uZXh0LCBzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uLCBkbF9yZWNhbGxfbHJ1KTsKKwkJbGlzdF9kZWxfaW5pdCgmZHAtPmRsX3JlY2FsbF9scnUpOworCQl1bmhhc2hfZGVsZWdhdGlvbihkcCk7CisJfQorCWxpc3RfZGVsKCZjbHAtPmNsX2lkaGFzaCk7CisJbGlzdF9kZWwoJmNscC0+Y2xfc3RyaGFzaCk7CisJbGlzdF9kZWwoJmNscC0+Y2xfbHJ1KTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmNscC0+Y2xfcGVyY2xpZW50KSkgeworCQlzb3AgPSBsaXN0X2VudHJ5KGNscC0+Y2xfcGVyY2xpZW50Lm5leHQsIHN0cnVjdCBuZnM0X3N0YXRlb3duZXIsIHNvX3BlcmNsaWVudCk7CisJCXJlbGVhc2Vfc3RhdGVvd25lcihzb3ApOworCX0KKwlwdXRfbmZzNF9jbGllbnQoY2xwKTsKK30KKworc3RhdGljIHN0cnVjdCBuZnM0X2NsaWVudCAqCitjcmVhdGVfY2xpZW50KHN0cnVjdCB4ZHJfbmV0b2JqIG5hbWUpIHsKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscDsKKworCWlmICghKGNscCA9IGFsbG9jX2NsaWVudChuYW1lKSkpCisJCWdvdG8gb3V0OworCWF0b21pY19zZXQoJmNscC0+Y2xfY291bnQsIDEpOworCWF0b21pY19zZXQoJmNscC0+Y2xfY2FsbGJhY2suY2Jfc2V0LCAwKTsKKwljbHAtPmNsX2NhbGxiYWNrLmNiX3BhcnNlZCA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJmNscC0+Y2xfaWRoYXNoKTsKKwlJTklUX0xJU1RfSEVBRCgmY2xwLT5jbF9zdHJoYXNoKTsKKwlJTklUX0xJU1RfSEVBRCgmY2xwLT5jbF9wZXJjbGllbnQpOworCUlOSVRfTElTVF9IRUFEKCZjbHAtPmNsX2RlbF9wZXJjbG50KTsKKwlJTklUX0xJU1RfSEVBRCgmY2xwLT5jbF9scnUpOworb3V0OgorCXJldHVybiBjbHA7Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5X3ZlcmYoc3RydWN0IG5mczRfY2xpZW50ICp0YXJnZXQsIG5mczRfdmVyaWZpZXIgKnNvdXJjZSkgeworCW1lbWNweSh0YXJnZXQtPmNsX3ZlcmlmaWVyLmRhdGEsIHNvdXJjZS0+ZGF0YSwgc2l6ZW9mKHRhcmdldC0+Y2xfdmVyaWZpZXIuZGF0YSkpOworfQorCitzdGF0aWMgdm9pZAorY29weV9jbGlkKHN0cnVjdCBuZnM0X2NsaWVudCAqdGFyZ2V0LCBzdHJ1Y3QgbmZzNF9jbGllbnQgKnNvdXJjZSkgeworCXRhcmdldC0+Y2xfY2xpZW50aWQuY2xfYm9vdCA9IHNvdXJjZS0+Y2xfY2xpZW50aWQuY2xfYm9vdDsgCisJdGFyZ2V0LT5jbF9jbGllbnRpZC5jbF9pZCA9IHNvdXJjZS0+Y2xfY2xpZW50aWQuY2xfaWQ7IAorfQorCitzdGF0aWMgdm9pZAorY29weV9jcmVkKHN0cnVjdCBzdmNfY3JlZCAqdGFyZ2V0LCBzdHJ1Y3Qgc3ZjX2NyZWQgKnNvdXJjZSkgeworCisJdGFyZ2V0LT5jcl91aWQgPSBzb3VyY2UtPmNyX3VpZDsKKwl0YXJnZXQtPmNyX2dpZCA9IHNvdXJjZS0+Y3JfZ2lkOworCXRhcmdldC0+Y3JfZ3JvdXBfaW5mbyA9IHNvdXJjZS0+Y3JfZ3JvdXBfaW5mbzsKKwlnZXRfZ3JvdXBfaW5mbyh0YXJnZXQtPmNyX2dyb3VwX2luZm8pOworfQorCitzdGF0aWMgaW50CitjbXBfbmFtZShzdHJ1Y3QgeGRyX25ldG9iaiAqbjEsIHN0cnVjdCB4ZHJfbmV0b2JqICpuMikgeworCWlmICghbjEgfHwgIW4yKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4oKG4xLT5sZW4gPT0gbjItPmxlbikgJiYgIW1lbWNtcChuMS0+ZGF0YSwgbjItPmRhdGEsIG4yLT5sZW4pKTsKK30KKworc3RhdGljIGludAorY21wX3ZlcmYobmZzNF92ZXJpZmllciAqdjEsIG5mczRfdmVyaWZpZXIgKnYyKSB7CisJcmV0dXJuKCFtZW1jbXAodjEtPmRhdGEsdjItPmRhdGEsc2l6ZW9mKHYxLT5kYXRhKSkpOworfQorCitzdGF0aWMgaW50CitjbXBfY2xpZChjbGllbnRpZF90ICogY2wxLCBjbGllbnRpZF90ICogY2wyKSB7CisJcmV0dXJuKChjbDEtPmNsX2Jvb3QgPT0gY2wyLT5jbF9ib290KSAmJgorCSAgIAkoY2wxLT5jbF9pZCA9PSBjbDItPmNsX2lkKSk7Cit9CisKKy8qIFhYWCB3aGF0IGFib3V0IE5HUk9VUCAqLworc3RhdGljIGludAorY21wX2NyZWRzKHN0cnVjdCBzdmNfY3JlZCAqY3IxLCBzdHJ1Y3Qgc3ZjX2NyZWQgKmNyMil7CisJcmV0dXJuKGNyMS0+Y3JfdWlkID09IGNyMi0+Y3JfdWlkKTsKKworfQorCitzdGF0aWMgdm9pZAorZ2VuX2NsaWQoc3RydWN0IG5mczRfY2xpZW50ICpjbHApIHsKKwljbHAtPmNsX2NsaWVudGlkLmNsX2Jvb3QgPSBib290X3RpbWU7CisJY2xwLT5jbF9jbGllbnRpZC5jbF9pZCA9IGN1cnJlbnRfY2xpZW50aWQrKzsgCit9CisKK3N0YXRpYyB2b2lkCitnZW5fY29uZmlybShzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkgeworCXN0cnVjdCB0aW1lc3BlYyAJdHY7CisJdTMyICoJCQlwOworCisJdHYgPSBDVVJSRU5UX1RJTUU7CisJcCA9ICh1MzIgKiljbHAtPmNsX2NvbmZpcm0uZGF0YTsKKwkqcCsrID0gdHYudHZfc2VjOworCSpwKysgPSB0di50dl9uc2VjOworfQorCitzdGF0aWMgaW50CitjaGVja19uYW1lKHN0cnVjdCB4ZHJfbmV0b2JqIG5hbWUpIHsKKworCWlmIChuYW1lLmxlbiA9PSAwKSAKKwkJcmV0dXJuIDA7CisJaWYgKG5hbWUubGVuID4gTkZTNF9PUEFRVUVfTElNSVQpIHsKKwkJcHJpbnRrKCJORlNEOiBjaGVja19uYW1lOiBuYW1lIHRvbyBsb25nKCVkKSFcbiIsIG5hbWUubGVuKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCit2b2lkCithZGRfdG9fdW5jb25maXJtZWQoc3RydWN0IG5mczRfY2xpZW50ICpjbHAsIHVuc2lnbmVkIGludCBzdHJoYXNodmFsKQoreworCXVuc2lnbmVkIGludCBpZGhhc2h2YWw7CisKKwlsaXN0X2FkZCgmY2xwLT5jbF9zdHJoYXNoLCAmdW5jb25mX3N0cl9oYXNodGJsW3N0cmhhc2h2YWxdKTsKKwlpZGhhc2h2YWwgPSBjbGllbnRpZF9oYXNodmFsKGNscC0+Y2xfY2xpZW50aWQuY2xfaWQpOworCWxpc3RfYWRkKCZjbHAtPmNsX2lkaGFzaCwgJnVuY29uZl9pZF9oYXNodGJsW2lkaGFzaHZhbF0pOworCWxpc3RfYWRkX3RhaWwoJmNscC0+Y2xfbHJ1LCAmY2xpZW50X2xydSk7CisJY2xwLT5jbF90aW1lID0gZ2V0X3NlY29uZHMoKTsKK30KKwordm9pZAorbW92ZV90b19jb25maXJtZWQoc3RydWN0IG5mczRfY2xpZW50ICpjbHApCit7CisJdW5zaWduZWQgaW50IGlkaGFzaHZhbCA9IGNsaWVudGlkX2hhc2h2YWwoY2xwLT5jbF9jbGllbnRpZC5jbF9pZCk7CisJdW5zaWduZWQgaW50IHN0cmhhc2h2YWw7CisKKwlkcHJpbnRrKCJORlNEOiBtb3ZlX3RvX2NvbmZpcm0gbmZzNF9jbGllbnQgJXBcbiIsIGNscCk7CisJbGlzdF9kZWxfaW5pdCgmY2xwLT5jbF9zdHJoYXNoKTsKKwlsaXN0X2RlbF9pbml0KCZjbHAtPmNsX2lkaGFzaCk7CisJbGlzdF9hZGQoJmNscC0+Y2xfaWRoYXNoLCAmY29uZl9pZF9oYXNodGJsW2lkaGFzaHZhbF0pOworCXN0cmhhc2h2YWwgPSBjbGllbnRzdHJfaGFzaHZhbChjbHAtPmNsX25hbWUuZGF0YSwgCisJCQljbHAtPmNsX25hbWUubGVuKTsKKwlsaXN0X2FkZCgmY2xwLT5jbF9zdHJoYXNoLCAmY29uZl9zdHJfaGFzaHRibFtzdHJoYXNodmFsXSk7CisJcmVuZXdfY2xpZW50KGNscCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZzNF9jbGllbnQgKgorZmluZF9jb25maXJtZWRfY2xpZW50KGNsaWVudGlkX3QgKmNsaWQpCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHA7CisJdW5zaWduZWQgaW50IGlkaGFzaHZhbCA9IGNsaWVudGlkX2hhc2h2YWwoY2xpZC0+Y2xfaWQpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbHAsICZjb25mX2lkX2hhc2h0YmxbaWRoYXNodmFsXSwgY2xfaWRoYXNoKSB7CisJCWlmIChjbXBfY2xpZCgmY2xwLT5jbF9jbGllbnRpZCwgY2xpZCkpCisJCQlyZXR1cm4gY2xwOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBuZnM0X2NsaWVudCAqCitmaW5kX3VuY29uZmlybWVkX2NsaWVudChjbGllbnRpZF90ICpjbGlkKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwOworCXVuc2lnbmVkIGludCBpZGhhc2h2YWwgPSBjbGllbnRpZF9oYXNodmFsKGNsaWQtPmNsX2lkKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xwLCAmdW5jb25mX2lkX2hhc2h0YmxbaWRoYXNodmFsXSwgY2xfaWRoYXNoKSB7CisJCWlmIChjbXBfY2xpZCgmY2xwLT5jbF9jbGllbnRpZCwgY2xpZCkpCisJCQlyZXR1cm4gY2xwOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHBhcnNlX2NhbGxiYWNrICovCitzdGF0aWMgaW50CitwYXJzZV9vY3RldCh1bnNpZ25lZCBpbnQgKmxlbnAsIGNoYXIgKiphZGRycCkKK3sKKwl1bnNpZ25lZCBpbnQgbGVuID0gKmxlbnA7CisJY2hhciAqcCA9ICphZGRycDsKKwlpbnQgbiA9IC0xOworCWNoYXIgYzsKKworCWZvciAoOzspIHsKKwkJaWYgKCFsZW4pCisJCQlicmVhazsKKwkJbGVuLS07CisJCWMgPSAqcCsrOworCQlpZiAoYyA9PSAnLicpCisJCQlicmVhazsKKwkJaWYgKChjIDwgJzAnKSB8fCAoYyA+ICc5JykpIHsKKwkJCW4gPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChuIDwgMCkKKwkJCW4gPSAwOworCQluID0gKG4gKiAxMCkgKyAoYyAtICcwJyk7CisJCWlmIChuID4gMjU1KSB7CisJCQluID0gLTE7CisJCQlicmVhazsKKwkJfQorCX0KKwkqbGVucCA9IGxlbjsKKwkqYWRkcnAgPSBwOworCXJldHVybiBuOworfQorCisvKiBwYXJzZSBhbmQgc2V0IHRoZSBzZXRjbGllbnRpZCBpcHY0IGNhbGxiYWNrIGFkZHJlc3MgKi8KK2ludAorcGFyc2VfaXB2NCh1bnNpZ25lZCBpbnQgYWRkcl9sZW4sIGNoYXIgKmFkZHJfdmFsLCB1bnNpZ25lZCBpbnQgKmNiYWRkcnAsIHVuc2lnbmVkIHNob3J0ICpjYnBvcnRwKQoreworCWludCB0ZW1wID0gMDsKKwl1MzIgY2JhZGRyID0gMDsKKwl1MTYgY2Jwb3J0ID0gMDsKKwl1MzIgYWRkcmxlbiA9IGFkZHJfbGVuOworCWNoYXIgKmFkZHIgPSBhZGRyX3ZhbDsKKwlpbnQgaSwgc2hpZnQ7CisKKwkvKiBpcGFkZHJlc3MgKi8KKwlzaGlmdCA9IDI0OworCWZvcihpID0gNDsgaSA+IDAgIDsgaS0tKSB7CisJCWlmICgodGVtcCA9IHBhcnNlX29jdGV0KCZhZGRybGVuLCAmYWRkcikpIDwgMCkgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2JhZGRyIHw9ICh0ZW1wIDw8IHNoaWZ0KTsKKwkJaWYgKHNoaWZ0ID4gMCkKKwkJc2hpZnQgLT0gODsKKwl9CisJKmNiYWRkcnAgPSBjYmFkZHI7CisKKwkvKiBwb3J0ICovCisJc2hpZnQgPSA4OworCWZvcihpID0gMjsgaSA+IDAgIDsgaS0tKSB7CisJCWlmICgodGVtcCA9IHBhcnNlX29jdGV0KCZhZGRybGVuLCAmYWRkcikpIDwgMCkgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2Jwb3J0IHw9ICh0ZW1wIDw8IHNoaWZ0KTsKKwkJaWYgKHNoaWZ0ID4gMCkKKwkJCXNoaWZ0IC09IDg7CisJfQorCSpjYnBvcnRwID0gY2Jwb3J0OworCXJldHVybiAxOworfQorCit2b2lkCitnZW5fY2FsbGJhY2soc3RydWN0IG5mczRfY2xpZW50ICpjbHAsIHN0cnVjdCBuZnNkNF9zZXRjbGllbnRpZCAqc2UpCit7CisJc3RydWN0IG5mczRfY2FsbGJhY2sgKmNiID0gJmNscC0+Y2xfY2FsbGJhY2s7CisKKwkvKiBDdXJyZW50bHksIHdlIG9ubHkgc3VwcG9ydCB0Y3AgZm9yIHRoZSBjYWxsYmFjayBjaGFubmVsICovCisJaWYgKChzZS0+c2VfY2FsbGJhY2tfbmV0aWRfbGVuICE9IDMpIHx8IG1lbWNtcCgoY2hhciAqKXNlLT5zZV9jYWxsYmFja19uZXRpZF92YWwsICJ0Y3AiLCAzKSkKKwkJZ290byBvdXRfZXJyOworCisJaWYgKCAhKHBhcnNlX2lwdjQoc2UtPnNlX2NhbGxiYWNrX2FkZHJfbGVuLCBzZS0+c2VfY2FsbGJhY2tfYWRkcl92YWwsCisJICAgICAgICAgICAgICAgICAmY2ItPmNiX2FkZHIsICZjYi0+Y2JfcG9ydCkpKQorCQlnb3RvIG91dF9lcnI7CisJY2ItPmNiX3Byb2cgPSBzZS0+c2VfY2FsbGJhY2tfcHJvZzsKKwljYi0+Y2JfaWRlbnQgPSBzZS0+c2VfY2FsbGJhY2tfaWRlbnQ7CisJY2ItPmNiX3BhcnNlZCA9IDE7CisJcmV0dXJuOworb3V0X2VycjoKKwlwcmludGsoS0VSTl9JTkZPICJORlNEOiB0aGlzIGNsaWVudCAoY2xpZW50aWQgJTA4eC8lMDh4KSAiCisJCSJ3aWxsIG5vdCByZWNlaXZlIGRlbGVnYXRpb25zXG4iLAorCQljbHAtPmNsX2NsaWVudGlkLmNsX2Jvb3QsIGNscC0+Y2xfY2xpZW50aWQuY2xfaWQpOworCisJY2ItPmNiX3BhcnNlZCA9IDA7CisJcmV0dXJuOworfQorCisvKgorICogUkZDIDMwMTAgaGFzIGEgY29tcGxleCBpbXBsbWVudGF0aW9uIGRlc2NyaXB0aW9uIG9mIHByb2Nlc3NpbmcgYSAKKyAqIFNFVENMSUVOVElEIHJlcXVlc3QgY29uc2lzdGluZyBvZiA1IGJ1bGxldHMsIGxhYmVsZWQgYXMgCisgKiBDQVNFMCAtIENBU0U0IGJlbG93LgorICoKKyAqIE5PVEVTOgorICogCWNhbGxiYWNrIGluZm9ybWF0aW9uIHdpbGwgYmUgcHJvY2Vzc2VkIGluIGEgZnV0dXJlIHBhdGNoCisgKgorICoJYW4gdW5jb25maXJtZWQgcmVjb3JkIGlzIGFkZGVkIHdoZW46CisgKiAgICAgIE5PUk1BTCAocGFydCBvZiBDQVNFIDQpOiB0aGVyZSBpcyBubyBjb25maXJtZWQgbm9yIHVuY29uZmlybWVkIHJlY29yZC4KKyAqCUNBU0UgMTogY29uZmlybWVkIHJlY29yZCBmb3VuZCB3aXRoIG1hdGNoaW5nIG5hbWUsIHByaW5jaXBhbCwKKyAqCQl2ZXJpZmllciwgYW5kIGNsaWVudGlkLgorICoJQ0FTRSAyOiBjb25maXJtZWQgcmVjb3JkIGZvdW5kIHdpdGggbWF0Y2hpbmcgbmFtZSwgcHJpbmNpcGFsLAorICoJCWFuZCB0aGVyZSBpcyBubyB1bmNvbmZpcm1lZCByZWNvcmQgd2l0aCBtYXRjaGluZworICoJCW5hbWUgYW5kIHByaW5jaXBhbAorICoKKyAqICAgICAgYW4gdW5jb25maXJtZWQgcmVjb3JkIGlzIHJlcGxhY2VkIHdoZW46CisgKglDQVNFIDM6IGNvbmZpcm1lZCByZWNvcmQgZm91bmQgd2l0aCBtYXRjaGluZyBuYW1lLCBwcmluY2lwYWwsCisgKgkJYW5kIGFuIHVuY29uZmlybWVkIHJlY29yZCBpcyBmb3VuZCB3aXRoIG1hdGNoaW5nIAorICoJCW5hbWUsIHByaW5jaXBhbCwgYW5kIHdpdGggY2xpZW50aWQgYW5kCisgKgkJY29uZmlybSB0aGF0IGRvZXMgbm90IG1hdGNoIHRoZSBjb25maXJtZWQgcmVjb3JkLgorICoJQ0FTRSA0OiB0aGVyZSBpcyBubyBjb25maXJtZWQgcmVjb3JkIHdpdGggbWF0Y2hpbmcgbmFtZSBhbmQgCisgKgkJcHJpbmNpcGFsLiB0aGVyZSBpcyBhbiB1bmNvbmZpcm1lZCByZWNvcmQgd2l0aCAKKyAqCQltYXRjaGluZyBuYW1lLCBwcmluY2lwYWwuCisgKgorICoJYW4gdW5jb25maXJtZWQgcmVjb3JkIGlzIGRlbGV0ZWQgd2hlbjoKKyAqCUNBU0UgMTogYW4gdW5jb25maXJtZWQgcmVjb3JkIHRoYXQgbWF0Y2hlcyBpbnB1dCBuYW1lLCB2ZXJpZmllciwKKyAqCQlhbmQgY29uZmlybWVkIGNsaWVudGlkLgorICoJQ0FTRSA0OiBhbnkgdW5jb25maXJtZWQgcmVjb3JkcyB3aXRoIG1hdGNoaW5nIG5hbWUgYW5kIHByaW5jaXBhbAorICoJCXRoYXQgZXhpc3QgYWZ0ZXIgYW4gdW5jb25maXJtZWQgcmVjb3JkIGhhcyBiZWVuIHJlcGxhY2VkCisgKgkJYXMgZGVzY3JpYmVkIGFib3ZlLgorICoKKyAqLworaW50CituZnNkNF9zZXRjbGllbnRpZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfc2V0Y2xpZW50aWQgKnNldGNsaWQpCit7CisJdTMyIAkJCWlwX2FkZHIgPSBycXN0cC0+cnFfYWRkci5zaW5fYWRkci5zX2FkZHI7CisJc3RydWN0IHhkcl9uZXRvYmogCWNsbmFtZSA9IHsgCisJCS5sZW4gPSBzZXRjbGlkLT5zZV9uYW1lbGVuLAorCQkuZGF0YSA9IHNldGNsaWQtPnNlX25hbWUsCisJfTsKKwluZnM0X3ZlcmlmaWVyCQljbHZlcmlmaWVyID0gc2V0Y2xpZC0+c2VfdmVyZjsKKwl1bnNpZ25lZCBpbnQgCQlzdHJoYXNodmFsOworCXN0cnVjdCBuZnM0X2NsaWVudCAqCWNvbmYsICogdW5jb25mLCAqIG5ldywgKiBjbHA7CisJaW50IAkJCXN0YXR1czsKKwkKKwlzdGF0dXMgPSBuZnNlcnJfaW52YWw7CisJaWYgKCFjaGVja19uYW1lKGNsbmFtZSkpCisJCWdvdG8gb3V0OworCisJLyogCisJICogWFhYIFRoZSBEdXBsaWNhdGUgUmVxdWVzdCBDYWNoZSAoRFJDKSBoYXMgYmVlbiBjaGVja2VkICg/PykKKwkgKiBXZSBnZXQgaGVyZSBvbiBhIERSQyBtaXNzLgorCSAqLworCisJc3RyaGFzaHZhbCA9IGNsaWVudHN0cl9oYXNodmFsKGNsbmFtZS5kYXRhLCBjbG5hbWUubGVuKTsKKworCWNvbmYgPSBOVUxMOworCW5mczRfbG9ja19zdGF0ZSgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xwLCAmY29uZl9zdHJfaGFzaHRibFtzdHJoYXNodmFsXSwgY2xfc3RyaGFzaCkgeworCQlpZiAoIWNtcF9uYW1lKCZjbHAtPmNsX25hbWUsICZjbG5hbWUpKQorCQkJY29udGludWU7CisJCS8qIAorCQkgKiBDQVNFIDA6CisJCSAqIGNsbmFtZSBtYXRjaCwgY29uZmlybWVkLCBkaWZmZXJlbnQgcHJpbmNpcGFsCisJCSAqIG9yIGRpZmZlcmVudCBpcF9hZGRyZXNzCisJCSAqLworCQlzdGF0dXMgPSBuZnNlcnJfY2xpZF9pbnVzZTsKKwkJaWYgKCFjbXBfY3JlZHMoJmNscC0+Y2xfY3JlZCwmcnFzdHAtPnJxX2NyZWQpKSB7CisJCQlwcmludGsoIk5GU0Q6IHNldGNsaWVudGlkOiBzdHJpbmcgaW4gdXNlIGJ5IGNsaWVudCIKKwkJCSIoY2xpZW50aWQgJTA4eC8lMDh4KVxuIiwKKwkJCWNscC0+Y2xfY2xpZW50aWQuY2xfYm9vdCwgY2xwLT5jbF9jbGllbnRpZC5jbF9pZCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoY2xwLT5jbF9hZGRyICE9IGlwX2FkZHIpIHsgCisJCQlwcmludGsoIk5GU0Q6IHNldGNsaWVudGlkOiBzdHJpbmcgaW4gdXNlIGJ5IGNsaWVudCIKKwkJCSIoY2xpZW50aWQgJTA4eC8lMDh4KVxuIiwKKwkJCWNscC0+Y2xfY2xpZW50aWQuY2xfYm9vdCwgY2xwLT5jbF9jbGllbnRpZC5jbF9pZCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIAorCSAJICogY2xfbmFtZSBtYXRjaCBmcm9tIGEgcHJldmlvdXMgU0VUQ0xJRU5USUQgb3BlcmF0aW9uCisJIAkgKiBYWFggY2hlY2sgZm9yIGFkZGl0aW9uYWwgbWF0Y2hlcz8KKwkJICovCisJCWNvbmYgPSBjbHA7CisJCWJyZWFrOworCX0KKwl1bmNvbmYgPSBOVUxMOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xwLCAmdW5jb25mX3N0cl9oYXNodGJsW3N0cmhhc2h2YWxdLCBjbF9zdHJoYXNoKSB7CisJCWlmICghY21wX25hbWUoJmNscC0+Y2xfbmFtZSwgJmNsbmFtZSkpCisJCQljb250aW51ZTsKKwkJLyogY2xfbmFtZSBtYXRjaCBmcm9tIGEgcHJldmlvdXMgU0VUQ0xJRU5USUQgb3BlcmF0aW9uICovCisJCXVuY29uZiA9IGNscDsKKwkJYnJlYWs7CisJfQorCXN0YXR1cyA9IG5mc2Vycl9yZXNvdXJjZTsKKwlpZiAoIWNvbmYpIHsKKwkJLyogCisJCSAqIENBU0UgNDoKKwkJICogcGxhY2VkIGZpcnN0LCBiZWNhdXNlIGl0IGlzIHRoZSBub3JtYWwgY2FzZS4KKwkJICovCisJCWlmICh1bmNvbmYpCisJCQlleHBpcmVfY2xpZW50KHVuY29uZik7CisJCWlmICghKG5ldyA9IGNyZWF0ZV9jbGllbnQoY2xuYW1lKSkpCisJCQlnb3RvIG91dDsKKwkJY29weV92ZXJmKG5ldywgJmNsdmVyaWZpZXIpOworCQluZXctPmNsX2FkZHIgPSBpcF9hZGRyOworCQljb3B5X2NyZWQoJm5ldy0+Y2xfY3JlZCwmcnFzdHAtPnJxX2NyZWQpOworCQlnZW5fY2xpZChuZXcpOworCQlnZW5fY29uZmlybShuZXcpOworCQlnZW5fY2FsbGJhY2sobmV3LCBzZXRjbGlkKTsKKwkJYWRkX3RvX3VuY29uZmlybWVkKG5ldywgc3RyaGFzaHZhbCk7CisJfSBlbHNlIGlmIChjbXBfdmVyZigmY29uZi0+Y2xfdmVyaWZpZXIsICZjbHZlcmlmaWVyKSkgeworCQkvKgorCQkgKiBDQVNFIDE6CisJCSAqIGNsX25hbWUgbWF0Y2gsIGNvbmZpcm1lZCwgcHJpbmNpcGFsIG1hdGNoCisJCSAqIHZlcmlmaWVyIG1hdGNoOiBwcm9iYWJsZSBjYWxsYmFjayB1cGRhdGUKKwkJICoKKwkJICogcmVtb3ZlIGFueSB1bmNvbmZpcm1lZCBuZnM0X2NsaWVudCB3aXRoIAorCQkgKiBtYXRjaGluZyBjbF9uYW1lLCBjbF92ZXJpZmllciwgYW5kIGNsX2NsaWVudGlkCisJCSAqCisJCSAqIGNyZWF0ZSBhbmQgaW5zZXJ0IGFuIHVuY29uZmlybWVkIG5mczRfY2xpZW50IHdpdGggc2FtZSAKKwkJICogY2xfbmFtZSwgY2xfdmVyaWZpZXIsIGFuZCBjbF9jbGllbnRpZCBhcyBleGlzdGluZyAKKwkJICogbmZzNF9jbGllbnQsICBidXQgd2l0aCB0aGUgbmV3IGNhbGxiYWNrIGluZm8gYW5kIGEgCisJCSAqIG5ldyBjbF9jb25maXJtCisJCSAqLworCQlpZiAoKHVuY29uZikgJiYgCisJCSAgICBjbXBfdmVyZigmdW5jb25mLT5jbF92ZXJpZmllciwgJmNvbmYtPmNsX3ZlcmlmaWVyKSAmJgorCQkgICAgIGNtcF9jbGlkKCZ1bmNvbmYtPmNsX2NsaWVudGlkLCAmY29uZi0+Y2xfY2xpZW50aWQpKSB7CisJCQkJZXhwaXJlX2NsaWVudCh1bmNvbmYpOworCQl9CisJCWlmICghKG5ldyA9IGNyZWF0ZV9jbGllbnQoY2xuYW1lKSkpCisJCQlnb3RvIG91dDsKKwkJY29weV92ZXJmKG5ldywmY29uZi0+Y2xfdmVyaWZpZXIpOworCQluZXctPmNsX2FkZHIgPSBpcF9hZGRyOworCQljb3B5X2NyZWQoJm5ldy0+Y2xfY3JlZCwmcnFzdHAtPnJxX2NyZWQpOworCQljb3B5X2NsaWQobmV3LCBjb25mKTsKKwkJZ2VuX2NvbmZpcm0obmV3KTsKKwkJZ2VuX2NhbGxiYWNrKG5ldywgc2V0Y2xpZCk7CisJCWFkZF90b191bmNvbmZpcm1lZChuZXcsc3RyaGFzaHZhbCk7CisJfSBlbHNlIGlmICghdW5jb25mKSB7CisJCS8qCisJCSAqIENBU0UgMjoKKwkJICogY2xuYW1lIG1hdGNoLCBjb25maXJtZWQsIHByaW5jaXBhbCBtYXRjaAorCQkgKiB2ZXJmaWVyIGRvZXMgbm90IG1hdGNoCisJCSAqIG5vIHVuY29uZmlybWVkLiBjcmVhdGUgYSBuZXcgdW5jb25maXJtZWQgbmZzNF9jbGllbnQKKwkJICogdXNpbmcgaW5wdXQgY2x2ZXJpZmllciwgY2xuYW1lLCBhbmQgY2FsbGJhY2sgaW5mbworCQkgKiBhbmQgZ2VuZXJhdGUgYSBuZXcgY2xfY2xpZW50aWQgYW5kIGNsX2NvbmZpcm0uCisJCSAqLworCQlpZiAoIShuZXcgPSBjcmVhdGVfY2xpZW50KGNsbmFtZSkpKQorCQkJZ290byBvdXQ7CisJCWNvcHlfdmVyZihuZXcsJmNsdmVyaWZpZXIpOworCQluZXctPmNsX2FkZHIgPSBpcF9hZGRyOworCQljb3B5X2NyZWQoJm5ldy0+Y2xfY3JlZCwmcnFzdHAtPnJxX2NyZWQpOworCQlnZW5fY2xpZChuZXcpOworCQlnZW5fY29uZmlybShuZXcpOworCQlnZW5fY2FsbGJhY2sobmV3LCBzZXRjbGlkKTsKKwkJYWRkX3RvX3VuY29uZmlybWVkKG5ldywgc3RyaGFzaHZhbCk7CisJfSBlbHNlIGlmICghY21wX3ZlcmYoJmNvbmYtPmNsX2NvbmZpcm0sICZ1bmNvbmYtPmNsX2NvbmZpcm0pKSB7CisJCS8qCQorCQkgKiBDQVNFMzoKKwkJICogY29uZmlybWVkIGZvdW5kIChuYW1lLCBwcmluY2lwYWwgbWF0Y2gpCisJCSAqIGNvbmZpcm1lZCB2ZXJpZmllciBkb2VzIG5vdCBtYXRjaCBpbnB1dCBjbHZlcmlmaWVyCisJCSAqCisJCSAqIHVuY29uZmlybWVkIGZvdW5kIChuYW1lIG1hdGNoKQorCQkgKiBjb25maXJtZWQtPmNsX2NvbmZpcm0gIT0gdW5jb25maXJtZWQtPmNsX2NvbmZpcm0KKwkJICoKKwkJICogcmVtb3ZlIHVuY29uZmlybWVkLgorCQkgKgorCQkgKiBjcmVhdGUgYW4gdW5jb25maXJtZWQgbmZzNF9jbGllbnQgCisJCSAqIHdpdGggc2FtZSBjbF9uYW1lIGFzIGV4aXN0aW5nIGNvbmZpcm1lZCBuZnM0X2NsaWVudCwgCisJCSAqIGJ1dCB3aXRoIG5ldyBjYWxsYmFjayBpbmZvLCBuZXcgY2xfY2xpZW50aWQsCisJCSAqIG5ldyBjbF92ZXJpZmllciBhbmQgYSBuZXcgY2xfY29uZmlybQorCQkgKi8KKwkJZXhwaXJlX2NsaWVudCh1bmNvbmYpOworCQlpZiAoIShuZXcgPSBjcmVhdGVfY2xpZW50KGNsbmFtZSkpKQorCQkJZ290byBvdXQ7CisJCWNvcHlfdmVyZihuZXcsJmNsdmVyaWZpZXIpOworCQluZXctPmNsX2FkZHIgPSBpcF9hZGRyOworCQljb3B5X2NyZWQoJm5ldy0+Y2xfY3JlZCwmcnFzdHAtPnJxX2NyZWQpOworCQlnZW5fY2xpZChuZXcpOworCQlnZW5fY29uZmlybShuZXcpOworCQlnZW5fY2FsbGJhY2sobmV3LCBzZXRjbGlkKTsKKwkJYWRkX3RvX3VuY29uZmlybWVkKG5ldywgc3RyaGFzaHZhbCk7CisJfSBlbHNlIHsKKwkJLyogTm8gY2FzZXMgaGl0ICEhISAqLworCQlzdGF0dXMgPSBuZnNlcnJfaW52YWw7CisJCWdvdG8gb3V0OworCisJfQorCXNldGNsaWQtPnNlX2NsaWVudGlkLmNsX2Jvb3QgPSBuZXctPmNsX2NsaWVudGlkLmNsX2Jvb3Q7CisJc2V0Y2xpZC0+c2VfY2xpZW50aWQuY2xfaWQgPSBuZXctPmNsX2NsaWVudGlkLmNsX2lkOworCW1lbWNweShzZXRjbGlkLT5zZV9jb25maXJtLmRhdGEsIG5ldy0+Y2xfY29uZmlybS5kYXRhLCBzaXplb2Yoc2V0Y2xpZC0+c2VfY29uZmlybS5kYXRhKSk7CisJc3RhdHVzID0gbmZzX29rOworb3V0OgorCW5mczRfdW5sb2NrX3N0YXRlKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKgorICogUkZDIDMwMTAgaGFzIGEgY29tcGxleCBpbXBsbWVudGF0aW9uIGRlc2NyaXB0aW9uIG9mIHByb2Nlc3NpbmcgYSAKKyAqIFNFVENMSUVOVElEX0NPTkZJUk0gcmVxdWVzdCBjb25zaXN0aW5nIG9mIDQgYnVsbGV0cyBkZXNjcmliaW5nCisgKiBwcm9jZXNzaW5nIG9uIGEgRFJDIG1pc3MsIGxhYmVsZWQgYXMgQ0FTRTEgLSBDQVNFNCBiZWxvdy4KKyAqCisgKiBOT1RFOiBjYWxsYmFjayBpbmZvcm1hdGlvbiB3aWxsIGJlIHByb2Nlc3NlZCBoZXJlIGluIGEgZnV0dXJlIHBhdGNoCisgKi8KK2ludAorbmZzZDRfc2V0Y2xpZW50aWRfY29uZmlybShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfc2V0Y2xpZW50aWRfY29uZmlybSAqc2V0Y2xpZW50aWRfY29uZmlybSkKK3sKKwl1MzIgaXBfYWRkciA9IHJxc3RwLT5ycV9hZGRyLnNpbl9hZGRyLnNfYWRkcjsKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCwgKmNvbmYgPSBOVUxMLCAqdW5jb25mID0gTlVMTDsKKwluZnM0X3ZlcmlmaWVyIGNvbmZpcm0gPSBzZXRjbGllbnRpZF9jb25maXJtLT5zY19jb25maXJtOyAKKwljbGllbnRpZF90ICogY2xpZCA9ICZzZXRjbGllbnRpZF9jb25maXJtLT5zY19jbGllbnRpZDsKKwlpbnQgc3RhdHVzOworCisJaWYgKFNUQUxFX0NMSUVOVElEKGNsaWQpKQorCQlyZXR1cm4gbmZzZXJyX3N0YWxlX2NsaWVudGlkOworCS8qIAorCSAqIFhYWCBUaGUgRHVwbGljYXRlIFJlcXVlc3QgQ2FjaGUgKERSQykgaGFzIGJlZW4gY2hlY2tlZCAoPz8pCisJICogV2UgZ2V0IGhlcmUgb24gYSBEUkMgbWlzcy4KKwkgKi8KKworCW5mczRfbG9ja19zdGF0ZSgpOworCWNscCA9IGZpbmRfY29uZmlybWVkX2NsaWVudChjbGlkKTsKKwlpZiAoY2xwKSB7CisJCXN0YXR1cyA9IG5mc2Vycl9pbnZhbDsKKwkJLyogCisJCSAqIEZvdW5kIGEgcmVjb3JkIGZvciB0aGlzIGNsaWVudGlkLiBJZiB0aGUgSVAgYWRkcmVzc2VzCisJCSAqIGRvbid0IG1hdGNoLCByZXR1cm4gRVJSX0lOVkFMIGp1c3QgYXMgaWYgdGhlIHJlY29yZCBoYWQKKwkJICogbm90IGJlZW4gZm91bmQuCisJCSAqLworCQlpZiAoY2xwLT5jbF9hZGRyICE9IGlwX2FkZHIpIHsgCisJCQlwcmludGsoIk5GU0Q6IHNldGNsaWVudGlkOiBzdHJpbmcgaW4gdXNlIGJ5IGNsaWVudCIKKwkJCSIoY2xpZW50aWQgJTA4eC8lMDh4KVxuIiwKKwkJCWNscC0+Y2xfY2xpZW50aWQuY2xfYm9vdCwgY2xwLT5jbF9jbGllbnRpZC5jbF9pZCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQljb25mID0gY2xwOworCX0KKwljbHAgPSBmaW5kX3VuY29uZmlybWVkX2NsaWVudChjbGlkKTsKKwlpZiAoY2xwKSB7CisJCXN0YXR1cyA9IG5mc2Vycl9pbnZhbDsKKwkJaWYgKGNscC0+Y2xfYWRkciAhPSBpcF9hZGRyKSB7IAorCQkJcHJpbnRrKCJORlNEOiBzZXRjbGllbnRpZDogc3RyaW5nIGluIHVzZSBieSBjbGllbnQiCisJCQkiKGNsaWVudGlkICUwOHgvJTA4eClcbiIsCisJCQljbHAtPmNsX2NsaWVudGlkLmNsX2Jvb3QsIGNscC0+Y2xfY2xpZW50aWQuY2xfaWQpOworCQkJZ290byBvdXQ7CisJCX0KKwkJdW5jb25mID0gY2xwOworCX0KKwkvKiBDQVNFIDE6IAorCSogdW5jb25mIHJlY29yZCB0aGF0IG1hdGNoZXMgaW5wdXQgY2xpZW50aWQgYW5kIGlucHV0IGNvbmZpcm0uCisJKiBjb25mIHJlY29yZCB0aGF0IG1hdGNoZXMgaW5wdXQgY2xpZW50aWQuCisJKiBjb25mICBhbmQgdW5jb25mIHJlY29yZHMgbWF0Y2ggbmFtZXMsIHZlcmlmaWVycyAKKwkqLworCWlmICgoY29uZiAmJiB1bmNvbmYpICYmIAorCSAgICAoY21wX3ZlcmYoJnVuY29uZi0+Y2xfY29uZmlybSwgJmNvbmZpcm0pKSAmJgorCSAgICAoY21wX3ZlcmYoJmNvbmYtPmNsX3ZlcmlmaWVyLCAmdW5jb25mLT5jbF92ZXJpZmllcikpICYmCisJICAgIChjbXBfbmFtZSgmY29uZi0+Y2xfbmFtZSwmdW5jb25mLT5jbF9uYW1lKSkgICYmCisJICAgICghY21wX3ZlcmYoJmNvbmYtPmNsX2NvbmZpcm0sICZ1bmNvbmYtPmNsX2NvbmZpcm0pKSkgeworCQlpZiAoIWNtcF9jcmVkcygmY29uZi0+Y2xfY3JlZCwgJnVuY29uZi0+Y2xfY3JlZCkpIAorCQkJc3RhdHVzID0gbmZzZXJyX2NsaWRfaW51c2U7CisJCWVsc2UgeworCQkJZXhwaXJlX2NsaWVudChjb25mKTsKKwkJCWNscCA9IHVuY29uZjsKKwkJCW1vdmVfdG9fY29uZmlybWVkKHVuY29uZik7CisJCQlzdGF0dXMgPSBuZnNfb2s7CisJCX0KKwkJZ290byBvdXQ7CisJfSAKKwkvKiBDQVNFIDI6CisJICogY29uZiByZWNvcmQgdGhhdCBtYXRjaGVzIGlucHV0IGNsaWVudGlkLgorCSAqIGlmIHVuY29uZiByZWNvcmQgdGhhdCBtYXRjaGVzIGlucHV0IGNsaWVudGlkLCB0aGVuIHVuY29uZi0+Y2xfbmFtZQorCSAqIG9yIHVuY29uZi0+Y2xfdmVyaWZpZXIgZG9uJ3QgbWF0Y2ggdGhlIGNvbmYgcmVjb3JkLgorCSAqLworCWlmICgoY29uZiAmJiAhdW5jb25mKSB8fCAKKwkgICAgKChjb25mICYmIHVuY29uZikgJiYgCisJICAgICAoIWNtcF92ZXJmKCZjb25mLT5jbF92ZXJpZmllciwgJnVuY29uZi0+Y2xfdmVyaWZpZXIpIHx8CisJICAgICAgIWNtcF9uYW1lKCZjb25mLT5jbF9uYW1lLCAmdW5jb25mLT5jbF9uYW1lKSkpKSB7CisJCWlmICghY21wX2NyZWRzKCZjb25mLT5jbF9jcmVkLCZycXN0cC0+cnFfY3JlZCkpIHsKKwkJCXN0YXR1cyA9IG5mc2Vycl9jbGlkX2ludXNlOworCQl9IGVsc2UgeworCQkJY2xwID0gY29uZjsKKwkJCXN0YXR1cyA9IG5mc19vazsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisJLyogQ0FTRSAzOgorCSAqIGNvbmYgcmVjb3JkIG5vdCBmb3VuZC4KKwkgKiB1bmNvbmYgcmVjb3JkIGZvdW5kLiAKKwkgKiB1bmNvbmYtPmNsX2NvbmZpcm0gbWF0Y2hlcyBpbnB1dCBjb25maXJtCisJICovIAorCWlmICghY29uZiAmJiB1bmNvbmYgJiYgY21wX3ZlcmYoJnVuY29uZi0+Y2xfY29uZmlybSwgJmNvbmZpcm0pKSB7CisJCWlmICghY21wX2NyZWRzKCZ1bmNvbmYtPmNsX2NyZWQsICZycXN0cC0+cnFfY3JlZCkpIHsKKwkJCXN0YXR1cyA9IG5mc2Vycl9jbGlkX2ludXNlOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gbmZzX29rOworCQkJY2xwID0gdW5jb25mOworCQkJbW92ZV90b19jb25maXJtZWQodW5jb25mKTsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisJLyogQ0FTRSA0OgorCSAqIGNvbmYgcmVjb3JkIG5vdCBmb3VuZCwgb3IgaWYgY29uZiwgdGhlbiBjb25mLT5jbF9jb25maXJtIGRvZXMgbm90CisJICogbWF0Y2ggaW5wdXQgY29uZmlybS4KKwkgKiB1bmNvbmYgcmVjb3JkIG5vdCBmb3VuZCwgb3IgaWYgdW5jb25mLCB0aGVuIHVuY29uZi0+Y2xfY29uZmlybSAKKwkgKiBkb2VzIG5vdCBtYXRjaCBpbnB1dCBjb25maXJtLgorCSAqLworCWlmICgoIWNvbmYgfHwgKGNvbmYgJiYgIWNtcF92ZXJmKCZjb25mLT5jbF9jb25maXJtLCAmY29uZmlybSkpKSAmJgorCSAgICAoIXVuY29uZiB8fCAodW5jb25mICYmICFjbXBfdmVyZigmdW5jb25mLT5jbF9jb25maXJtLCAmY29uZmlybSkpKSkgeworCQlzdGF0dXMgPSBuZnNlcnJfc3RhbGVfY2xpZW50aWQ7CisJCWdvdG8gb3V0OworCX0KKwkvKiBjaGVjayB0aGF0IHdlIGhhdmUgaGl0IG9uZSBvZiB0aGUgY2FzZXMuLi4qLworCXN0YXR1cyA9IG5mc2Vycl9pbnZhbDsKKwlnb3RvIG91dDsKK291dDoKKwlpZiAoIXN0YXR1cykKKwkJbmZzZDRfcHJvYmVfY2FsbGJhY2soY2xwKTsKKwluZnM0X3VubG9ja19zdGF0ZSgpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIAorICogT3BlbiBvd25lciBzdGF0ZSAoc2hhcmUgbG9ja3MpCisgKi8KKworLyogaGFzaCB0YWJsZXMgZm9yIG5mczRfc3RhdGVvd25lciAqLworI2RlZmluZSBPV05FUl9IQVNIX0JJVFMgICAgICAgICAgICAgIDgKKyNkZWZpbmUgT1dORVJfSEFTSF9TSVpFICAgICAgICAgICAgICgxIDw8IE9XTkVSX0hBU0hfQklUUykKKyNkZWZpbmUgT1dORVJfSEFTSF9NQVNLICAgICAgICAgICAgIChPV05FUl9IQVNIX1NJWkUgLSAxKQorCisjZGVmaW5lIG93bmVyaWRfaGFzaHZhbChpZCkgXAorICAgICAgICAoKGlkKSAmIE9XTkVSX0hBU0hfTUFTSykKKyNkZWZpbmUgb3duZXJzdHJfaGFzaHZhbChjbGllbnRpZCwgb3duZXJuYW1lKSBcCisgICAgICAgICgoKGNsaWVudGlkKSArIG9wYXF1ZV9oYXNodmFsKChvd25lcm5hbWUuZGF0YSksIChvd25lcm5hbWUubGVuKSkpICYgT1dORVJfSEFTSF9NQVNLKQorCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZAlvd25lcmlkX2hhc2h0YmxbT1dORVJfSEFTSF9TSVpFXTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkCW93bmVyc3RyX2hhc2h0YmxbT1dORVJfSEFTSF9TSVpFXTsKKworLyogaGFzaCB0YWJsZSBmb3IgbmZzNF9maWxlICovCisjZGVmaW5lIEZJTEVfSEFTSF9CSVRTICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgRklMRV9IQVNIX1NJWkUgICAgICAgICAgICAgICAgICAoMSA8PCBGSUxFX0hBU0hfQklUUykKKyNkZWZpbmUgRklMRV9IQVNIX01BU0sgICAgICAgICAgICAgICAgICAoRklMRV9IQVNIX1NJWkUgLSAxKQorLyogaGFzaCB0YWJsZSBmb3IgKG9wZW4pbmZzNF9zdGF0ZWlkICovCisjZGVmaW5lIFNUQVRFSURfSEFTSF9CSVRTICAgICAgICAgICAgICAxMAorI2RlZmluZSBTVEFURUlEX0hBU0hfU0laRSAgICAgICAgICAgICAgKDEgPDwgU1RBVEVJRF9IQVNIX0JJVFMpCisjZGVmaW5lIFNUQVRFSURfSEFTSF9NQVNLICAgICAgICAgICAgICAoU1RBVEVJRF9IQVNIX1NJWkUgLSAxKQorCisjZGVmaW5lIGZpbGVfaGFzaHZhbCh4KSBcCisgICAgICAgIGhhc2hfcHRyKHgsIEZJTEVfSEFTSF9CSVRTKQorI2RlZmluZSBzdGF0ZWlkX2hhc2h2YWwob3duZXJfaWQsIGZpbGVfaWQpICBcCisgICAgICAgICgoKG93bmVyX2lkKSArIChmaWxlX2lkKSkgJiBTVEFURUlEX0hBU0hfTUFTSykKKworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgZmlsZV9oYXNodGJsW0ZJTEVfSEFTSF9TSVpFXTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHN0YXRlaWRfaGFzaHRibFtTVEFURUlEX0hBU0hfU0laRV07CisKKy8qIE9QRU4gU2hhcmUgc3RhdGUgaGVscGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmZzNF9maWxlICoKK2FsbG9jX2luaXRfZmlsZShzdHJ1Y3QgaW5vZGUgKmlubykKK3sKKwlzdHJ1Y3QgbmZzNF9maWxlICpmcDsKKwl1bnNpZ25lZCBpbnQgaGFzaHZhbCA9IGZpbGVfaGFzaHZhbChpbm8pOworCisJaWYgKChmcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZnM0X2ZpbGUpLEdGUF9LRVJORUwpKSkgeworCQlJTklUX0xJU1RfSEVBRCgmZnAtPmZpX2hhc2gpOworCQlJTklUX0xJU1RfSEVBRCgmZnAtPmZpX3BlcmZpbGUpOworCQlJTklUX0xJU1RfSEVBRCgmZnAtPmZpX2RlbF9wZXJmaWxlKTsKKwkJbGlzdF9hZGQoJmZwLT5maV9oYXNoLCAmZmlsZV9oYXNodGJsW2hhc2h2YWxdKTsKKwkJZnAtPmZpX2lub2RlID0gaWdyYWIoaW5vKTsKKwkJZnAtPmZpX2lkID0gY3VycmVudF9maWxlaWQrKzsKKwkJYWxsb2NfZmlsZSsrOworCQlyZXR1cm4gZnA7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorcmVsZWFzZV9hbGxfZmlsZXModm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbmZzNF9maWxlICpmcDsKKworCWZvciAoaT0wO2k8RklMRV9IQVNIX1NJWkU7aSsrKSB7CisJCXdoaWxlICghbGlzdF9lbXB0eSgmZmlsZV9oYXNodGJsW2ldKSkgeworCQkJZnAgPSBsaXN0X2VudHJ5KGZpbGVfaGFzaHRibFtpXS5uZXh0LCBzdHJ1Y3QgbmZzNF9maWxlLCBmaV9oYXNoKTsKKwkJCS8qIHRoaXMgc2hvdWxkIG5ldmVyIGJlIG1vcmUgdGhhbiBvbmNlLi4uICovCisJCQlpZiAoIWxpc3RfZW1wdHkoJmZwLT5maV9wZXJmaWxlKSB8fCAhbGlzdF9lbXB0eSgmZnAtPmZpX2RlbF9wZXJmaWxlKSkgeworCQkJCXByaW50aygiRVJST1I6IHJlbGVhc2VfYWxsX2ZpbGVzOiBmaWxlICVwIGlzIG9wZW4sIGNyZWF0aW5nIGRhbmdsaW5nIHN0YXRlICEhIVxuIixmcCk7CisJCQl9CisJCQlyZWxlYXNlX2ZpbGUoZnApOworCQl9CisJfQorfQorCitrbWVtX2NhY2hlX3QgKnN0YXRlb3duZXJfc2xhYiA9IE5VTEw7CisKK3N0YXRpYyBpbnQKK25mc2Q0X2luaXRfc2xhYnModm9pZCkKK3sKKwlzdGF0ZW93bmVyX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibmZzZDRfc3RhdGVvd25lcnMiLAorCQkJc2l6ZW9mKHN0cnVjdCBuZnM0X3N0YXRlb3duZXIpLCAwLCAwLCBOVUxMLCBOVUxMKTsKKwlpZiAoc3RhdGVvd25lcl9zbGFiID09IE5VTEwpIHsKKwkJZHByaW50aygibmZzZDQ6IG91dCBvZiBtZW1vcnkgd2hpbGUgaW5pdGlhbGl6aW5nIG5mc3Y0XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbmZzZDRfZnJlZV9zbGFicyh2b2lkKQoreworCWludCBzdGF0dXMgPSAwOworCisJaWYgKHN0YXRlb3duZXJfc2xhYikKKwkJc3RhdHVzID0ga21lbV9jYWNoZV9kZXN0cm95KHN0YXRlb3duZXJfc2xhYik7CisJc3RhdGVvd25lcl9zbGFiID0gTlVMTDsKKwlCVUdfT04oc3RhdHVzKTsKK30KKwordm9pZAorbmZzNF9mcmVlX3N0YXRlb3duZXIoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IG5mczRfc3RhdGVvd25lciAqc29wID0KKwkJY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBuZnM0X3N0YXRlb3duZXIsIHNvX3JlZik7CisJa2ZyZWUoc29wLT5zb19vd25lci5kYXRhKTsKKwlrbWVtX2NhY2hlX2ZyZWUoc3RhdGVvd25lcl9zbGFiLCBzb3ApOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKgorYWxsb2Nfc3RhdGVvd25lcihzdHJ1Y3QgeGRyX25ldG9iaiAqb3duZXIpCit7CisJc3RydWN0IG5mczRfc3RhdGVvd25lciAqc29wOworCisJaWYgKChzb3AgPSBrbWVtX2NhY2hlX2FsbG9jKHN0YXRlb3duZXJfc2xhYiwgR0ZQX0tFUk5FTCkpKSB7CisJCWlmICgoc29wLT5zb19vd25lci5kYXRhID0ga21hbGxvYyhvd25lci0+bGVuLCBHRlBfS0VSTkVMKSkpIHsKKwkJCW1lbWNweShzb3AtPnNvX293bmVyLmRhdGEsIG93bmVyLT5kYXRhLCBvd25lci0+bGVuKTsKKwkJCXNvcC0+c29fb3duZXIubGVuID0gb3duZXItPmxlbjsKKwkJCWtyZWZfaW5pdCgmc29wLT5zb19yZWYpOworCQkJcmV0dXJuIHNvcDsKKwkJfSAKKwkJa21lbV9jYWNoZV9mcmVlKHN0YXRlb3duZXJfc2xhYiwgc29wKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoKK2FsbG9jX2luaXRfb3Blbl9zdGF0ZW93bmVyKHVuc2lnbmVkIGludCBzdHJoYXNodmFsLCBzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pIHsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3A7CisJc3RydWN0IG5mczRfcmVwbGF5ICpycDsKKwl1bnNpZ25lZCBpbnQgaWRoYXNodmFsOworCisJaWYgKCEoc29wID0gYWxsb2Nfc3RhdGVvd25lcigmb3Blbi0+b3Bfb3duZXIpKSkKKwkJcmV0dXJuIE5VTEw7CisJaWRoYXNodmFsID0gb3duZXJpZF9oYXNodmFsKGN1cnJlbnRfb3duZXJpZCk7CisJSU5JVF9MSVNUX0hFQUQoJnNvcC0+c29faWRoYXNoKTsKKwlJTklUX0xJU1RfSEVBRCgmc29wLT5zb19zdHJoYXNoKTsKKwlJTklUX0xJU1RfSEVBRCgmc29wLT5zb19wZXJjbGllbnQpOworCUlOSVRfTElTVF9IRUFEKCZzb3AtPnNvX3BlcmZpbGVzdGF0ZSk7CisJSU5JVF9MSVNUX0hFQUQoJnNvcC0+c29fcGVybG9ja293bmVyKTsgIC8qIG5vdCB1c2VkICovCisJSU5JVF9MSVNUX0hFQUQoJnNvcC0+c29fY2xvc2VfbHJ1KTsKKwlzb3AtPnNvX3RpbWUgPSAwOworCWxpc3RfYWRkKCZzb3AtPnNvX2lkaGFzaCwgJm93bmVyaWRfaGFzaHRibFtpZGhhc2h2YWxdKTsKKwlsaXN0X2FkZCgmc29wLT5zb19zdHJoYXNoLCAmb3duZXJzdHJfaGFzaHRibFtzdHJoYXNodmFsXSk7CisJbGlzdF9hZGQoJnNvcC0+c29fcGVyY2xpZW50LCAmY2xwLT5jbF9wZXJjbGllbnQpOworCWFkZF9wZXJjbGllbnQrKzsKKwlzb3AtPnNvX2lzX29wZW5fb3duZXIgPSAxOworCXNvcC0+c29faWQgPSBjdXJyZW50X293bmVyaWQrKzsKKwlzb3AtPnNvX2NsaWVudCA9IGNscDsKKwlzb3AtPnNvX3NlcWlkID0gb3Blbi0+b3Bfc2VxaWQ7CisJc29wLT5zb19jb25maXJtZWQgPSAwOworCXJwID0gJnNvcC0+c29fcmVwbGF5OworCXJwLT5ycF9zdGF0dXMgPSBORlNFUlJfU0VSVkVSRkFVTFQ7CisJcnAtPnJwX2J1ZmxlbiA9IDA7CisJcnAtPnJwX2J1ZiA9IHJwLT5ycF9pYnVmOworCXJldHVybiBzb3A7Cit9CisKK3N0YXRpYyB2b2lkCityZWxlYXNlX3N0YXRlaWRfbG9ja293bmVycyhzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpvcGVuX3N0cCkKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpsb2NrX3NvcDsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmb3Blbl9zdHAtPnN0X3BlcmxvY2tvd25lcikpIHsKKwkJbG9ja19zb3AgPSBsaXN0X2VudHJ5KG9wZW5fc3RwLT5zdF9wZXJsb2Nrb3duZXIubmV4dCwKKwkJCQlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyLCBzb19wZXJsb2Nrb3duZXIpOworCQkvKiBsaXN0X2RlbCgmb3Blbl9zdHAtPnN0X3BlcmxvY2tvd25lcik7ICAqLworCQlCVUdfT04obG9ja19zb3AtPnNvX2lzX29wZW5fb3duZXIpOworCQlyZWxlYXNlX3N0YXRlb3duZXIobG9ja19zb3ApOworCX0KK30KKworc3RhdGljIHZvaWQKK3VuaGFzaF9zdGF0ZW93bmVyKHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcCkKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHA7CisKKwlsaXN0X2RlbCgmc29wLT5zb19pZGhhc2gpOworCWxpc3RfZGVsKCZzb3AtPnNvX3N0cmhhc2gpOworCWlmIChzb3AtPnNvX2lzX29wZW5fb3duZXIpIHsKKwkJbGlzdF9kZWwoJnNvcC0+c29fcGVyY2xpZW50KTsKKwkJZGVsX3BlcmNsaWVudCsrOworCX0KKwlsaXN0X2RlbCgmc29wLT5zb19wZXJsb2Nrb3duZXIpOworCXdoaWxlICghbGlzdF9lbXB0eSgmc29wLT5zb19wZXJmaWxlc3RhdGUpKSB7CisJCXN0cCA9IGxpc3RfZW50cnkoc29wLT5zb19wZXJmaWxlc3RhdGUubmV4dCwgCisJCQlzdHJ1Y3QgbmZzNF9zdGF0ZWlkLCBzdF9wZXJmaWxlc3RhdGUpOworCQlpZiAoc29wLT5zb19pc19vcGVuX293bmVyKQorCQkJcmVsZWFzZV9zdGF0ZWlkKHN0cCwgT1BFTl9TVEFURSk7CisJCWVsc2UKKwkJCXJlbGVhc2Vfc3RhdGVpZChzdHAsIExPQ0tfU1RBVEUpOworCX0KK30KKworc3RhdGljIHZvaWQKK3JlbGVhc2Vfc3RhdGVvd25lcihzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3ApCit7CisJdW5oYXNoX3N0YXRlb3duZXIoc29wKTsKKwlsaXN0X2RlbCgmc29wLT5zb19jbG9zZV9scnUpOworCW5mczRfcHV0X3N0YXRlb3duZXIoc29wKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbml0X3N0YXRlaWQoc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwLCBzdHJ1Y3QgbmZzNF9maWxlICpmcCwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pIHsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3AgPSBvcGVuLT5vcF9zdGF0ZW93bmVyOworCXVuc2lnbmVkIGludCBoYXNodmFsID0gc3RhdGVpZF9oYXNodmFsKHNvcC0+c29faWQsIGZwLT5maV9pZCk7CisKKwlJTklUX0xJU1RfSEVBRCgmc3RwLT5zdF9oYXNoKTsKKwlJTklUX0xJU1RfSEVBRCgmc3RwLT5zdF9wZXJmaWxlc3RhdGUpOworCUlOSVRfTElTVF9IRUFEKCZzdHAtPnN0X3BlcmxvY2tvd25lcik7CisJSU5JVF9MSVNUX0hFQUQoJnN0cC0+c3RfcGVyZmlsZSk7CisJbGlzdF9hZGQoJnN0cC0+c3RfaGFzaCwgJnN0YXRlaWRfaGFzaHRibFtoYXNodmFsXSk7CisJbGlzdF9hZGQoJnN0cC0+c3RfcGVyZmlsZXN0YXRlLCAmc29wLT5zb19wZXJmaWxlc3RhdGUpOworCWxpc3RfYWRkX3BlcmZpbGUrKzsKKwlsaXN0X2FkZCgmc3RwLT5zdF9wZXJmaWxlLCAmZnAtPmZpX3BlcmZpbGUpOworCXN0cC0+c3Rfc3RhdGVvd25lciA9IHNvcDsKKwlzdHAtPnN0X2ZpbGUgPSBmcDsKKwlzdHAtPnN0X3N0YXRlaWQuc2lfYm9vdCA9IGJvb3RfdGltZTsKKwlzdHAtPnN0X3N0YXRlaWQuc2lfc3RhdGVvd25lcmlkID0gc29wLT5zb19pZDsKKwlzdHAtPnN0X3N0YXRlaWQuc2lfZmlsZWlkID0gZnAtPmZpX2lkOworCXN0cC0+c3Rfc3RhdGVpZC5zaV9nZW5lcmF0aW9uID0gMDsKKwlzdHAtPnN0X2FjY2Vzc19ibWFwID0gMDsKKwlzdHAtPnN0X2RlbnlfYm1hcCA9IDA7CisJX19zZXRfYml0KG9wZW4tPm9wX3NoYXJlX2FjY2VzcywgJnN0cC0+c3RfYWNjZXNzX2JtYXApOworCV9fc2V0X2JpdChvcGVuLT5vcF9zaGFyZV9kZW55LCAmc3RwLT5zdF9kZW55X2JtYXApOworfQorCitzdGF0aWMgdm9pZAorcmVsZWFzZV9zdGF0ZWlkKHN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBmaWxlICpmaWxwID0gc3RwLT5zdF92ZnNfZmlsZTsKKworCWxpc3RfZGVsKCZzdHAtPnN0X2hhc2gpOworCWxpc3RfZGVsX3BlcmZpbGUrKzsKKwlsaXN0X2RlbCgmc3RwLT5zdF9wZXJmaWxlKTsKKwlsaXN0X2RlbCgmc3RwLT5zdF9wZXJmaWxlc3RhdGUpOworCWlmIChmbGFncyAmIE9QRU5fU1RBVEUpIHsKKwkJcmVsZWFzZV9zdGF0ZWlkX2xvY2tvd25lcnMoc3RwKTsKKwkJc3RwLT5zdF92ZnNfZmlsZSA9IE5VTEw7CisJCW5mc2RfY2xvc2UoZmlscCk7CisJCXZmc2Nsb3NlKys7CisJfSBlbHNlIGlmIChmbGFncyAmIExPQ0tfU1RBVEUpCisJCWxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCAoZmxfb3duZXJfdCkgc3RwLT5zdF9zdGF0ZW93bmVyKTsKKwlrZnJlZShzdHApOworCXN0cCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCityZWxlYXNlX2ZpbGUoc3RydWN0IG5mczRfZmlsZSAqZnApCit7CisJZnJlZV9maWxlKys7CisJbGlzdF9kZWwoJmZwLT5maV9oYXNoKTsKKwlpcHV0KGZwLT5maV9pbm9kZSk7CisJa2ZyZWUoZnApOworfQkKKwordm9pZAorbW92ZV90b19jbG9zZV9scnUoc3RydWN0IG5mczRfc3RhdGVvd25lciAqc29wKQoreworCWRwcmludGsoIk5GU0Q6IG1vdmVfdG9fY2xvc2VfbHJ1IG5mczRfc3RhdGVvd25lciAlcFxuIiwgc29wKTsKKworCXVuaGFzaF9zdGF0ZW93bmVyKHNvcCk7CisJbGlzdF9hZGRfdGFpbCgmc29wLT5zb19jbG9zZV9scnUsICZjbG9zZV9scnUpOworCXNvcC0+c29fdGltZSA9IGdldF9zZWNvbmRzKCk7Cit9CisKK3ZvaWQKK3JlbGVhc2Vfc3RhdGVfb3duZXIoc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwLCBpbnQgZmxhZykKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3AgPSBzdHAtPnN0X3N0YXRlb3duZXI7CisJc3RydWN0IG5mczRfZmlsZSAqZnAgPSBzdHAtPnN0X2ZpbGU7CisKKwlkcHJpbnRrKCJORlNEOiByZWxlYXNlX3N0YXRlX293bmVyXG4iKTsKKwlyZWxlYXNlX3N0YXRlaWQoc3RwLCBmbGFnKTsKKworCS8qIHBsYWNlIHVudXNlZCBuZnM0X3N0YXRlb3duZXJzIG9uIHNvX2Nsb3NlX2xydSBsaXN0IHRvIGJlCisJICogcmVsZWFzZWQgYnkgdGhlIGxhdW5kcm9tYXQgc2VydmljZSBhZnRlciB0aGUgbGVhc2UgcGVyaW9kCisJICogdG8gZW5hYmxlIHVzIHRvIGhhbmRsZSBDTE9TRSByZXBsYXkKKwkgKi8KKwlpZiAoc29wLT5zb19jb25maXJtZWQgJiYgbGlzdF9lbXB0eSgmc29wLT5zb19wZXJmaWxlc3RhdGUpKQorCQltb3ZlX3RvX2Nsb3NlX2xydShzb3ApOworCS8qIHVudXNlZCBuZnM0X2ZpbGUncyBhcmUgcmVsZXNlZWQuIFhYWCBzbGFiIGNhY2hlPyAqLworCWlmIChsaXN0X2VtcHR5KCZmcC0+ZmlfcGVyZmlsZSkgJiYgbGlzdF9lbXB0eSgmZnAtPmZpX2RlbF9wZXJmaWxlKSkgeworCQlyZWxlYXNlX2ZpbGUoZnApOworCX0KK30KKworc3RhdGljIGludAorY21wX293bmVyX3N0cihzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3AsIHN0cnVjdCB4ZHJfbmV0b2JqICpvd25lciwgY2xpZW50aWRfdCAqY2xpZCkgeworCXJldHVybiAoKHNvcC0+c29fb3duZXIubGVuID09IG93bmVyLT5sZW4pICYmIAorCSAhbWVtY21wKHNvcC0+c29fb3duZXIuZGF0YSwgb3duZXItPmRhdGEsIG93bmVyLT5sZW4pICYmIAorCSAgKHNvcC0+c29fY2xpZW50LT5jbF9jbGllbnRpZC5jbF9pZCA9PSBjbGlkLT5jbF9pZCkpOworfQorCitzdGF0aWMgc3RydWN0IG5mczRfc3RhdGVvd25lciAqCitmaW5kX29wZW5zdGF0ZW93bmVyX3N0cih1bnNpZ25lZCBpbnQgaGFzaHZhbCwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pCit7CisJc3RydWN0IG5mczRfc3RhdGVvd25lciAqc28gPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzbywgJm93bmVyc3RyX2hhc2h0YmxbaGFzaHZhbF0sIHNvX3N0cmhhc2gpIHsKKwkJaWYgKGNtcF9vd25lcl9zdHIoc28sICZvcGVuLT5vcF9vd25lciwgJm9wZW4tPm9wX2NsaWVudGlkKSkKKwkJCXJldHVybiBzbzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIHNlYXJjaCBmaWxlX2hhc2h0YmxbXSBmb3IgZmlsZSAqLworc3RhdGljIHN0cnVjdCBuZnM0X2ZpbGUgKgorZmluZF9maWxlKHN0cnVjdCBpbm9kZSAqaW5vKQoreworCXVuc2lnbmVkIGludCBoYXNodmFsID0gZmlsZV9oYXNodmFsKGlubyk7CisJc3RydWN0IG5mczRfZmlsZSAqZnA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZwLCAmZmlsZV9oYXNodGJsW2hhc2h2YWxdLCBmaV9oYXNoKSB7CisJCWlmIChmcC0+ZmlfaW5vZGUgPT0gaW5vKQorCQkJcmV0dXJuIGZwOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworI2RlZmluZSBURVNUX0FDQ0VTUyh4KSAoKHggPiAwIHx8IHggPCA0KT8xOjApCisjZGVmaW5lIFRFU1RfREVOWSh4KSAoKHggPj0gMCB8fCB4IDwgNSk/MTowKQorCit2b2lkCitzZXRfYWNjZXNzKHVuc2lnbmVkIGludCAqYWNjZXNzLCB1bnNpZ25lZCBsb25nIGJtYXApIHsKKwlpbnQgaTsKKworCSphY2Nlc3MgPSAwOworCWZvciAoaSA9IDE7IGkgPCA0OyBpKyspIHsKKwkJaWYgKHRlc3RfYml0KGksICZibWFwKSkKKwkJCSphY2Nlc3MgfD0gaTsKKwl9Cit9CisKK3ZvaWQKK3NldF9kZW55KHVuc2lnbmVkIGludCAqZGVueSwgdW5zaWduZWQgbG9uZyBibWFwKSB7CisJaW50IGk7CisKKwkqZGVueSA9IDA7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAodGVzdF9iaXQoaSwgJmJtYXApKQorCQkJKmRlbnkgfD0gaSA7CisJfQorfQorCitzdGF0aWMgaW50Cit0ZXN0X3NoYXJlKHN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cCwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pIHsKKwl1bnNpZ25lZCBpbnQgYWNjZXNzLCBkZW55OworCisJc2V0X2FjY2VzcygmYWNjZXNzLCBzdHAtPnN0X2FjY2Vzc19ibWFwKTsKKwlzZXRfZGVueSgmZGVueSwgc3RwLT5zdF9kZW55X2JtYXApOworCWlmICgoYWNjZXNzICYgb3Blbi0+b3Bfc2hhcmVfZGVueSkgfHwgKGRlbnkgJiBvcGVuLT5vcF9zaGFyZV9hY2Nlc3MpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIENhbGxlZCB0byBjaGVjayBkZW55IHdoZW4gUkVBRCB3aXRoIGFsbCB6ZXJvIHN0YXRlaWQgb3IKKyAqIFdSSVRFIHdpdGggYWxsIHplcm8gb3IgYWxsIG9uZSBzdGF0ZWlkCisgKi8KK2ludAorbmZzNF9zaGFyZV9jb25mbGljdChzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCB1bnNpZ25lZCBpbnQgZGVueV90eXBlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vID0gY3VycmVudF9maC0+ZmhfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBuZnM0X2ZpbGUgKmZwOworCXN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cDsKKworCWRwcmludGsoIk5GU0Q6IG5mczRfc2hhcmVfY29uZmxpY3RcbiIpOworCisJZnAgPSBmaW5kX2ZpbGUoaW5vKTsKKwlpZiAoZnApIHsKKwkvKiBTZWFyY2ggZm9yIGNvbmZsaWN0aW5nIHNoYXJlIHJlc2VydmF0aW9ucyAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0cCwgJmZwLT5maV9wZXJmaWxlLCBzdF9wZXJmaWxlKSB7CisJCQlpZiAodGVzdF9iaXQoZGVueV90eXBlLCAmc3RwLT5zdF9kZW55X2JtYXApIHx8CisJCQkgICAgdGVzdF9iaXQoTkZTNF9TSEFSRV9ERU5ZX0JPVEgsICZzdHAtPnN0X2RlbnlfYm1hcCkpCisJCQkJcmV0dXJuIG5mc2Vycl9zaGFyZV9kZW5pZWQ7CisJCX0KKwl9CisJcmV0dXJuIG5mc19vazsKK30KKworc3RhdGljIGlubGluZSB2b2lkCituZnM0X2ZpbGVfZG93bmdyYWRlKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgc2hhcmVfYWNjZXNzKQoreworCWlmIChzaGFyZV9hY2Nlc3MgJiBORlM0X1NIQVJFX0FDQ0VTU19XUklURSkgeworCQlwdXRfd3JpdGVfYWNjZXNzKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwkJZmlscC0+Zl9tb2RlID0gKGZpbHAtPmZfbW9kZSB8IEZNT0RFX1JFQUQpICYgfkZNT0RFX1dSSVRFOworCX0KK30KKworLyoKKyAqIFJlY2FsbCBhIGRlbGVnYXRpb24KKyAqLworc3RhdGljIGludAorZG9fcmVjYWxsKHZvaWQgKl9fZHApCit7CisJc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHAgPSBfX2RwOworCisJZGFlbW9uaXplKCJuZnN2NC1yZWNhbGwiKTsKKworCW5mc2Q0X2NiX3JlY2FsbChkcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTcGF3biBhIHRocmVhZCB0byBwZXJmb3JtIGEgcmVjYWxsIG9uIHRoZSBkZWxlZ2F0aW9uIHJlcHJlc2VudGVkCisgKiBieSB0aGUgbGVhc2UgKGZpbGVfbG9jaykKKyAqCisgKiBDYWxsZWQgZnJvbSBicmVha19sZWFzZSgpIHdpdGggbG9ja19rZXJuZWwoKSBoZWxkLgorICogTm90ZTogd2UgYXNzdW1lIGJyZWFrX2xlYXNlIHdpbGwgb25seSBjYWxsIHRoaXMgKm9uY2UqIGZvciBhbnkgZ2l2ZW4KKyAqIGxlYXNlLgorICovCitzdGF0aWMKK3ZvaWQgbmZzZF9icmVha19kZWxlZ19jYihzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcD0gIChzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICopZmwtPmZsX293bmVyOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKKworCWRwcmludGsoIk5GU0QgbmZzZF9icmVha19kZWxlZ19jYjogZHAgJXAgZmwgJXBcbiIsZHAsZmwpOworCWlmICghZHApCisJCXJldHVybjsKKworCS8qIFdlJ3JlIGFzc3VtaW5nIHRoZSBzdGF0ZSBjb2RlIG5ldmVyIGRyb3BzIGl0cyByZWZlcmVuY2UKKwkgKiB3aXRob3V0IGZpcnN0IHJlbW92aW5nIHRoZSBsZWFzZS4gIFNpbmNlIHdlJ3JlIGluIHRoaXMgbGVhc2UKKwkgKiBjYWxsYmFjayAoYW5kIHNpbmNlIHRoZSBsZWFzZSBjb2RlIGlzIHNlcmlhbGl6ZWQgYnkgdGhlIGtlcm5lbAorCSAqIGxvY2spIHdlIGtub3cgdGhlIHNlcnZlciBoYXNuJ3QgcmVtb3ZlZCB0aGUgbGVhc2UgeWV0LCB3ZSBrbm93CisJICogaXQncyBzYWZlIHRvIHRha2UgYSByZWZlcmVuY2U6ICovCisJYXRvbWljX2luYygmZHAtPmRsX2NvdW50KTsKKworCXNwaW5fbG9jaygmcmVjYWxsX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmRwLT5kbF9yZWNhbGxfbHJ1LCAmZGVsX3JlY2FsbF9scnUpOworCXNwaW5fdW5sb2NrKCZyZWNhbGxfbG9jayk7CisKKwkvKiBvbmx5IHBsYWNlIGRsX3RpbWUgaXMgc2V0LiBwcm90ZWN0ZWQgYnkgbG9ja19rZXJuZWwqLworCWRwLT5kbF90aW1lID0gZ2V0X3NlY29uZHMoKTsKKworCS8qIFhYWCBuZWVkIHRvIG1lcmdlIE5GU0RfTEVBU0VfVElNRSB3aXRoIGZzL2xvY2tzLmM6bGVhc2VfYnJlYWtfdGltZSAqLworCWZsLT5mbF9icmVha190aW1lID0gamlmZmllcyArIE5GU0RfTEVBU0VfVElNRSAqIEhaOworCisJdCA9IGt0aHJlYWRfcnVuKGRvX3JlY2FsbCwgZHAsICIlcyIsICJuZnM0X2NiX3JlY2FsbCIpOworCWlmIChJU19FUlIodCkpIHsKKwkJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBkcC0+ZGxfY2xpZW50OworCisJCXByaW50ayhLRVJOX0lORk8gIk5GU0Q6IENhbGxiYWNrIHRocmVhZCBmYWlsZWQgZm9yICIKKwkJCSJmb3IgY2xpZW50IChjbGllbnRpZCAlMDh4LyUwOHgpXG4iLAorCQkJY2xwLT5jbF9jbGllbnRpZC5jbF9ib290LCBjbHAtPmNsX2NsaWVudGlkLmNsX2lkKTsKKwkJbmZzNF9wdXRfZGVsZWdhdGlvbihkcCk7CisJfQorfQorCisvKgorICogVGhlIGZpbGVfbG9jayBpcyBiZWluZyByZWFwZC4KKyAqCisgKiBDYWxsZWQgYnkgbG9ja3NfZnJlZV9sb2NrKCkgd2l0aCBsb2NrX2tlcm5lbCgpIGhlbGQuCisgKi8KK3N0YXRpYwordm9pZCBuZnNkX3JlbGVhc2VfZGVsZWdfY2Ioc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHAgPSAoc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqKWZsLT5mbF9vd25lcjsKKworCWRwcmludGsoIk5GU0QgbmZzZF9yZWxlYXNlX2RlbGVnX2NiOiBmbCAlcCBkcCAlcCBkbF9jb3VudCAlZFxuIiwgZmwsZHAsIGF0b21pY19yZWFkKCZkcC0+ZGxfY291bnQpKTsKKworCWlmICghKGZsLT5mbF9mbGFncyAmIEZMX0xFQVNFKSB8fCAhZHApCisJCXJldHVybjsKKwlkcC0+ZGxfZmxvY2sgPSBOVUxMOworfQorCisvKgorICogU2V0IHRoZSBkZWxlZ2F0aW9uIGZpbGVfbG9jayBiYWNrIHBvaW50ZXIuCisgKgorICogQ2FsbGVkIGZyb20gX19zZXRsZWFzZSgpIHdpdGggbG9ja19rZXJuZWwoKSBoZWxkLgorICovCitzdGF0aWMKK3ZvaWQgbmZzZF9jb3B5X2xvY2tfZGVsZWdfY2Ioc3RydWN0IGZpbGVfbG9jayAqbmV3LCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcCA9IChzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICopbmV3LT5mbF9vd25lcjsKKworCWRwcmludGsoIk5GU0Q6IG5mc2RfY29weV9sb2NrX2RlbGVnX2NiOiBuZXcgZmwgJXAgZHAgJXBcbiIsIG5ldywgZHApOworCWlmICghZHApCisJCXJldHVybjsKKwlkcC0+ZGxfZmxvY2sgPSBuZXc7Cit9CisKKy8qCisgKiBDYWxsZWQgZnJvbSBfX3NldGxlYXNlKCkgd2l0aCBsb2NrX2tlcm5lbCgpIGhlbGQKKyAqLworc3RhdGljCitpbnQgbmZzZF9zYW1lX2NsaWVudF9kZWxlZ19jYihzdHJ1Y3QgZmlsZV9sb2NrICpvbmxpc3QsIHN0cnVjdCBmaWxlX2xvY2sgKnRyeSkKK3sKKwlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpvbmxpc3RkID0KKwkJKHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKilvbmxpc3QtPmZsX293bmVyOworCXN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKnRyeWQgPQorCQkoc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqKXRyeS0+Zmxfb3duZXI7CisKKwlpZiAob25saXN0LT5mbF9sbW9wcyAhPSB0cnktPmZsX2xtb3BzKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBvbmxpc3RkLT5kbF9jbGllbnQgPT0gdHJ5ZC0+ZGxfY2xpZW50OworfQorCisKK3N0YXRpYworaW50IG5mc2RfY2hhbmdlX2RlbGVnX2NiKHN0cnVjdCBmaWxlX2xvY2sgKipvbmxpc3QsIGludCBhcmcpCit7CisJaWYgKGFyZyAmIEZfVU5MQ0spCisJCXJldHVybiBsZWFzZV9tb2RpZnkob25saXN0LCBhcmcpOworCWVsc2UKKwkJcmV0dXJuIC1FQUdBSU47Cit9CisKK3N0cnVjdCBsb2NrX21hbmFnZXJfb3BlcmF0aW9ucyBuZnNkX2xlYXNlX21uZ19vcHMgPSB7CisJLmZsX2JyZWFrID0gbmZzZF9icmVha19kZWxlZ19jYiwKKwkuZmxfcmVsZWFzZV9wcml2YXRlID0gbmZzZF9yZWxlYXNlX2RlbGVnX2NiLAorCS5mbF9jb3B5X2xvY2sgPSBuZnNkX2NvcHlfbG9ja19kZWxlZ19jYiwKKwkuZmxfbXlsZWFzZSA9IG5mc2Rfc2FtZV9jbGllbnRfZGVsZWdfY2IsCisJLmZsX2NoYW5nZSA9IG5mc2RfY2hhbmdlX2RlbGVnX2NiLAorfTsKKworCisvKgorICogbmZzZDRfcHJvY2Vzc19vcGVuMSgpCisgKiAJbG9va3VwIHN0YXRlb3duZXIuCisgKiAJCWZvdW5kOgorICogCQkJY2hlY2sgY29uZmlybWVkIAorICogCQkJCWNvbmZpcm1lZDoKKyAqIAkJCQkJY2hlY2sgc2VxaWQKKyAqIAkJCQlub3QgY29uZmlybWVkOgorICogCQkJCQlkZWxldGUgb3duZXIKKyAqIAkJCQkJY3JlYXRlIG5ldyBvd25lcgorICogCQlub3Rmb3VuZDoKKyAqIAkJCXZlcmlmeSBjbGllbnRpZAorICogCQkJY3JlYXRlIG5ldyBvd25lcgorICoKKyAqIGNhbGxlZCB3aXRoIG5mczRfbG9ja19zdGF0ZSgpIGhlbGQuCisgKi8KK2ludAorbmZzZDRfcHJvY2Vzc19vcGVuMShzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbikKK3sKKwlpbnQgc3RhdHVzOworCWNsaWVudGlkX3QgKmNsaWVudGlkID0gJm9wZW4tPm9wX2NsaWVudGlkOworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgc3RyaGFzaHZhbDsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3AgPSBOVUxMOworCisJc3RhdHVzID0gbmZzZXJyX2ludmFsOworCWlmICghY2hlY2tfbmFtZShvcGVuLT5vcF9vd25lcikpCisJCWdvdG8gb3V0OworCisJaWYgKFNUQUxFX0NMSUVOVElEKCZvcGVuLT5vcF9jbGllbnRpZCkpCisJCXJldHVybiBuZnNlcnJfc3RhbGVfY2xpZW50aWQ7CisKKwlzdHJoYXNodmFsID0gb3duZXJzdHJfaGFzaHZhbChjbGllbnRpZC0+Y2xfaWQsIG9wZW4tPm9wX293bmVyKTsKKwlzb3AgPSBmaW5kX29wZW5zdGF0ZW93bmVyX3N0cihzdHJoYXNodmFsLCBvcGVuKTsKKwlpZiAoc29wKSB7CisJCW9wZW4tPm9wX3N0YXRlb3duZXIgPSBzb3A7CisJCS8qIGNoZWNrIGZvciByZXBsYXkgKi8KKwkJaWYgKG9wZW4tPm9wX3NlcWlkID09IHNvcC0+c29fc2VxaWQpeworCQkJaWYgKHNvcC0+c29fcmVwbGF5LnJwX2J1ZmxlbikKKwkJCQlyZXR1cm4gTkZTRVJSX1JFUExBWV9NRTsKKwkJCWVsc2UgeworCQkJCS8qIFRoZSBvcmlnaW5hbCBPUEVOIGZhaWxlZCBzbyBzcGVjdGFjdWxhcmx5CisJCQkJICogdGhhdCB3ZSBkb24ndCBldmVuIGhhdmUgcmVwbGF5IGRhdGEgc2F2ZWQhCisJCQkJICogVGhlcmVmb3JlLCB3ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8gY29udGludWUKKwkJCQkgKiBwcm9jZXNzaW5nIHRoaXMgT1BFTjsgcHJlc3VtYWJseSwgd2UnbGwKKwkJCQkgKiBmYWlsIGFnYWluIGZvciB0aGUgc2FtZSByZWFzb24uCisJCQkJICovCisJCQkJZHByaW50aygibmZzZDRfcHJvY2Vzc19vcGVuMToiCisJCQkJCSIgcmVwbGF5IHdpdGggbm8gcmVwbGF5IGNhY2hlXG4iKTsKKwkJCQlnb3RvIHJlbmV3OworCQkJfQorCQl9IGVsc2UgaWYgKHNvcC0+c29fY29uZmlybWVkKSB7CisJCQlpZiAob3Blbi0+b3Bfc2VxaWQgPT0gc29wLT5zb19zZXFpZCArIDEpCisJCQkJZ290byByZW5ldzsKKwkJCXN0YXR1cyA9IG5mc2Vycl9iYWRfc2VxaWQ7CisJCQlnb3RvIG91dDsKKwkJfSBlbHNlIHsKKwkJCS8qIElmIHdlIGdldCBoZXJlLCB3ZSByZWNlaXZlZCBhbiBPUEVOIGZvciBhbgorCQkJICogdW5jb25maXJtZWQgbmZzNF9zdGF0ZW93bmVyLiBTaW5jZSB0aGUgc2VxaWQncyBhcmUKKwkJCSAqIGRpZmZlcmVudCwgcHVyZ2UgdGhlIGV4aXN0aW5nIG5mczRfc3RhdGVvd25lciwgYW5kCisJCQkgKiBpbnN0YW50aWF0ZSBhIG5ldyBvbmUuCisJCQkgKi8KKwkJCWNscCA9IHNvcC0+c29fY2xpZW50OworCQkJcmVsZWFzZV9zdGF0ZW93bmVyKHNvcCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBuZnM0X3N0YXRlb3duZXIgbm90IGZvdW5kLgorCQkgKiBWZXJpZnkgY2xpZW50aWQgYW5kIGluc3RhbnRpYXRlIG5ldyBuZnM0X3N0YXRlb3duZXIuCisJCSAqIElmIHZlcmlmeSBmYWlscyB0aGlzIGlzIHByZXN1bWFibHkgdGhlIHJlc3VsdCBvZiB0aGUKKwkJICogY2xpZW50J3MgbGVhc2UgZXhwaXJpbmcuCisJCSAqLworCQlzdGF0dXMgPSBuZnNlcnJfZXhwaXJlZDsKKwkJY2xwID0gZmluZF9jb25maXJtZWRfY2xpZW50KGNsaWVudGlkKTsKKwkJaWYgKGNscCA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJfQorCXN0YXR1cyA9IG5mc2Vycl9yZXNvdXJjZTsKKwlzb3AgPSBhbGxvY19pbml0X29wZW5fc3RhdGVvd25lcihzdHJoYXNodmFsLCBjbHAsIG9wZW4pOworCWlmIChzb3AgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJb3Blbi0+b3Bfc3RhdGVvd25lciA9IHNvcDsKK3JlbmV3OgorCXN0YXR1cyA9IG5mc19vazsKKwlyZW5ld19jbGllbnQoc29wLT5zb19jbGllbnQpOworb3V0OgorCWlmIChzdGF0dXMgJiYgb3Blbi0+b3BfY2xhaW1fdHlwZSA9PSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVMpCisJCXN0YXR1cyA9IG5mc2Vycl9yZWNsYWltX2JhZDsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CituZnM0X2NoZWNrX29wZW4oc3RydWN0IG5mczRfZmlsZSAqZnAsIHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuLCBzdHJ1Y3QgbmZzNF9zdGF0ZWlkICoqc3RwcCkKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpsb2NhbDsKKwlpbnQgc3RhdHVzID0gbmZzZXJyX3NoYXJlX2RlbmllZDsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3AgPSBvcGVuLT5vcF9zdGF0ZW93bmVyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NhbCwgJmZwLT5maV9wZXJmaWxlLCBzdF9wZXJmaWxlKSB7CisJCS8qIGlnbm9yZSBsb2NrIG93bmVycyAqLworCQlpZiAobG9jYWwtPnN0X3N0YXRlb3duZXItPnNvX2lzX29wZW5fb3duZXIgPT0gMCkKKwkJCWNvbnRpbnVlOworCQkvKiByZW1lbWJlciBpZiB3ZSBoYXZlIHNlZW4gdGhpcyBvcGVuIG93bmVyICovCisJCWlmIChsb2NhbC0+c3Rfc3RhdGVvd25lciA9PSBzb3ApCisJCQkqc3RwcCA9IGxvY2FsOworCQkvKiBjaGVjayBmb3IgY29uZmxpY3Rpbmcgc2hhcmUgcmVzZXJ2YXRpb25zICovCisJCWlmICghdGVzdF9zaGFyZShsb2NhbCwgb3BlbikpCisJCQlnb3RvIG91dDsKKwl9CisJc3RhdHVzID0gMDsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CituZnM0X25ld19vcGVuKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnM0X3N0YXRlaWQgKipzdHBwLAorCQlzdHJ1Y3Qgc3ZjX2ZoICpjdXJfZmgsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHA7CisJaW50IHN0YXR1czsKKworCXN0cCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZnM0X3N0YXRlaWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RwID09IE5VTEwpCisJCXJldHVybiBuZnNlcnJfcmVzb3VyY2U7CisKKwlzdGF0dXMgPSBuZnNkX29wZW4ocnFzdHAsIGN1cl9maCwgU19JRlJFRywgZmxhZ3MsICZzdHAtPnN0X3Zmc19maWxlKTsKKwlpZiAoc3RhdHVzKSB7CisJCWlmIChzdGF0dXMgPT0gbmZzZXJyX2Ryb3BpdCkKKwkJCXN0YXR1cyA9IG5mc2Vycl9qdWtlYm94OworCQlrZnJlZShzdHApOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwl2ZnNvcGVuKys7CisJKnN0cHAgPSBzdHA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF90cnVuY2F0ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaCwKKwkJc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pCit7CisJc3RydWN0IGlhdHRyIGlhdHRyID0geworCQkuaWFfdmFsaWQgPSBBVFRSX1NJWkUsCisJCS5pYV9zaXplID0gMCwKKwl9OworCWlmICghb3Blbi0+b3BfdHJ1bmNhdGUpCisJCXJldHVybiAwOworCWlmICghKG9wZW4tPm9wX3NoYXJlX2FjY2VzcyAmIE5GUzRfU0hBUkVfQUNDRVNTX1dSSVRFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIG5mc2Rfc2V0YXR0cihycXN0cCwgZmgsICZpYXR0ciwgMCwgKHRpbWVfdCkwKTsKK30KKworc3RhdGljIGludAorbmZzNF91cGdyYWRlX29wZW4oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VyX2ZoLCBzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHAsIHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKQoreworCXN0cnVjdCBmaWxlICpmaWxwID0gc3RwLT5zdF92ZnNfZmlsZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJdW5zaWduZWQgaW50IHNoYXJlX2FjY2VzczsKKwlpbnQgc3RhdHVzOworCisJc2V0X2FjY2Vzcygmc2hhcmVfYWNjZXNzLCBzdHAtPnN0X2FjY2Vzc19ibWFwKTsKKwlzaGFyZV9hY2Nlc3MgPSB+c2hhcmVfYWNjZXNzOworCXNoYXJlX2FjY2VzcyAmPSBvcGVuLT5vcF9zaGFyZV9hY2Nlc3M7CisKKwlpZiAoIShzaGFyZV9hY2Nlc3MgJiBORlM0X1NIQVJFX0FDQ0VTU19XUklURSkpCisJCXJldHVybiBuZnNkNF90cnVuY2F0ZShycXN0cCwgY3VyX2ZoLCBvcGVuKTsKKworCXN0YXR1cyA9IGdldF93cml0ZV9hY2Nlc3MoaW5vZGUpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBuZnNlcnJubyhzdGF0dXMpOworCXN0YXR1cyA9IG5mc2Q0X3RydW5jYXRlKHJxc3RwLCBjdXJfZmgsIG9wZW4pOworCWlmIChzdGF0dXMpIHsKKwkJcHV0X3dyaXRlX2FjY2Vzcyhpbm9kZSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCS8qIHJlbWVtYmVyIHRoZSBvcGVuICovCisJZmlscC0+Zl9tb2RlID0gKGZpbHAtPmZfbW9kZSB8IEZNT0RFX1dSSVRFKSAmIH5GTU9ERV9SRUFEOworCXNldF9iaXQob3Blbi0+b3Bfc2hhcmVfYWNjZXNzLCAmc3RwLT5zdF9hY2Nlc3NfYm1hcCk7CisJc2V0X2JpdChvcGVuLT5vcF9zaGFyZV9kZW55LCAmc3RwLT5zdF9kZW55X2JtYXApOworCisJcmV0dXJuIG5mc19vazsKK30KKworCisvKiBkZWNyZW1lbnQgc2VxaWQgb24gc3VjY2Vzc2Z1bCByZWNsYWltLCBpdCB3aWxsIGJlIGJ1bXBlZCBpbiBlbmNvZGVfb3BlbiAqLworc3RhdGljIHZvaWQKK25mczRfc2V0X2NsYWltX3ByZXYoc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4sIGludCAqc3RhdHVzKQoreworCWlmIChvcGVuLT5vcF9jbGFpbV90eXBlID09IE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUykgeworCQlpZiAoKnN0YXR1cykKKwkJCSpzdGF0dXMgPSBuZnNlcnJfcmVjbGFpbV9iYWQ7CisJCWVsc2UgeworCQkJb3Blbi0+b3Bfc3RhdGVvd25lci0+c29fY29uZmlybWVkID0gMTsKKwkJCW9wZW4tPm9wX3N0YXRlb3duZXItPnNvX3NlcWlkLS07CisJCX0KKwl9Cit9CisKKy8qCisgKiBBdHRlbXB0IHRvIGhhbmQgb3V0IGEgZGVsZWdhdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK25mczRfb3Blbl9kZWxlZ2F0aW9uKHN0cnVjdCBzdmNfZmggKmZoLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3Blbiwgc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwKQoreworCXN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwOworCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcCA9IHN0cC0+c3Rfc3RhdGVvd25lcjsKKwlzdHJ1Y3QgbmZzNF9jYWxsYmFjayAqY2IgPSAmc29wLT5zb19jbGllbnQtPmNsX2NhbGxiYWNrOworCXN0cnVjdCBmaWxlX2xvY2sgZmwsICpmbHAgPSAmZmw7CisJaW50IHN0YXR1cywgZmxhZyA9IDA7CisKKwlmbGFnID0gTkZTNF9PUEVOX0RFTEVHQVRFX05PTkU7CisJaWYgKG9wZW4tPm9wX2NsYWltX3R5cGUgIT0gTkZTNF9PUEVOX0NMQUlNX05VTEwKKwkgICAgIHx8ICFhdG9taWNfcmVhZCgmY2ItPmNiX3NldCkgfHwgIXNvcC0+c29fY29uZmlybWVkKQorCQlnb3RvIG91dDsKKworCWlmIChvcGVuLT5vcF9zaGFyZV9hY2Nlc3MgJiBORlM0X1NIQVJFX0FDQ0VTU19XUklURSkKKwkJZmxhZyA9IE5GUzRfT1BFTl9ERUxFR0FURV9XUklURTsKKwllbHNlCisJCWZsYWcgPSBORlM0X09QRU5fREVMRUdBVEVfUkVBRDsKKworCWRwID0gYWxsb2NfaW5pdF9kZWxlZyhzb3AtPnNvX2NsaWVudCwgc3RwLCBmaCwgZmxhZyk7CisJaWYgKGRwID09IE5VTEwpIHsKKwkJZmxhZyA9IE5GUzRfT1BFTl9ERUxFR0FURV9OT05FOworCQlnb3RvIG91dDsKKwl9CisJbG9ja3NfaW5pdF9sb2NrKCZmbCk7CisJZmwuZmxfbG1vcHMgPSAmbmZzZF9sZWFzZV9tbmdfb3BzOworCWZsLmZsX2ZsYWdzID0gRkxfTEVBU0U7CisJZmwuZmxfZW5kID0gT0ZGU0VUX01BWDsKKwlmbC5mbF9vd25lciA9ICAoZmxfb3duZXJfdClkcDsKKwlmbC5mbF9maWxlID0gc3RwLT5zdF92ZnNfZmlsZTsKKwlmbC5mbF9waWQgPSBjdXJyZW50LT50Z2lkOworCisJLyogc2V0bGVhc2UgY2hlY2tzIHRvIHNlZSBpZiBkZWxlZ2F0aW9uIHNob3VsZCBiZSBoYW5kZWQgb3V0LgorCSAqIHRoZSBsb2NrX21hbmFnZXIgY2FsbGJhY2tzIGZsX215bGVhc2UgYW5kIGZsX2NoYW5nZSBhcmUgdXNlZAorCSAqLworCWlmICgoc3RhdHVzID0gc2V0bGVhc2Uoc3RwLT5zdF92ZnNfZmlsZSwKKwkJZmxhZyA9PSBORlM0X09QRU5fREVMRUdBVEVfUkVBRD8gRl9SRExDSzogRl9XUkxDSywgJmZscCkpKSB7CisJCWRwcmludGsoIk5GU0Q6IHNldGxlYXNlIGZhaWxlZCBbJWRdLCBubyBkZWxlZ2F0aW9uXG4iLCBzdGF0dXMpOworCQlsaXN0X2RlbCgmZHAtPmRsX2RlbF9wZXJmaWxlKTsKKwkJbGlzdF9kZWwoJmRwLT5kbF9kZWxfcGVyY2xudCk7CisJCW5mczRfcHV0X2RlbGVnYXRpb24oZHApOworCQlmcmVlX2RlbGVnYXRpb24rKzsKKwkJZmxhZyA9IE5GUzRfT1BFTl9ERUxFR0FURV9OT05FOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1jcHkoJm9wZW4tPm9wX2RlbGVnYXRlX3N0YXRlaWQsICZkcC0+ZGxfc3RhdGVpZCwgc2l6ZW9mKGRwLT5kbF9zdGF0ZWlkKSk7CisKKwlkcHJpbnRrKCJORlNEOiBkZWxlZ2F0aW9uIHN0YXRlaWQ9KCUwOHgvJTA4eC8lMDh4LyUwOHgpXG5cbiIsCisJICAgICAgICAgICAgIGRwLT5kbF9zdGF0ZWlkLnNpX2Jvb3QsCisJICAgICAgICAgICAgIGRwLT5kbF9zdGF0ZWlkLnNpX3N0YXRlb3duZXJpZCwKKwkgICAgICAgICAgICAgZHAtPmRsX3N0YXRlaWQuc2lfZmlsZWlkLAorCSAgICAgICAgICAgICBkcC0+ZGxfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKK291dDoKKwlvcGVuLT5vcF9kZWxlZ2F0ZV90eXBlID0gZmxhZzsKK30KKworLyoKKyAqIGNhbGxlZCB3aXRoIG5mczRfbG9ja19zdGF0ZSgpIGhlbGQuCisgKi8KK2ludAorbmZzZDRfcHJvY2Vzc19vcGVuMihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbikKK3sKKwlzdHJ1Y3QgbmZzNF9maWxlICpmcCA9IE5VTEw7CisJc3RydWN0IGlub2RlICppbm8gPSBjdXJyZW50X2ZoLT5maF9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwID0gTlVMTDsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gbmZzZXJyX2ludmFsOworCWlmICghVEVTVF9BQ0NFU1Mob3Blbi0+b3Bfc2hhcmVfYWNjZXNzKSB8fCAhVEVTVF9ERU5ZKG9wZW4tPm9wX3NoYXJlX2RlbnkpKQorCQlnb3RvIG91dDsKKwkvKgorCSAqIExvb2t1cCBmaWxlOyBpZiBmb3VuZCwgbG9va3VwIHN0YXRlaWQgYW5kIGNoZWNrIG9wZW4gcmVxdWVzdCwKKwkgKiBhbmQgY2hlY2sgZm9yIGRlbGVnYXRpb25zIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHJlY2FsbGVkLgorCSAqIElmIG5vdCBmb3VuZCwgY3JlYXRlIHRoZSBuZnM0X2ZpbGUgc3RydWN0CisJICovCisJZnAgPSBmaW5kX2ZpbGUoaW5vKTsKKwlpZiAoZnApIHsKKwkJaWYgKChzdGF0dXMgPSBuZnM0X2NoZWNrX29wZW4oZnAsIG9wZW4sICZzdHApKSkKKwkJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCXN0YXR1cyA9IG5mc2Vycl9yZXNvdXJjZTsKKwkJZnAgPSBhbGxvY19pbml0X2ZpbGUoaW5vKTsKKwkJaWYgKGZwID09IE5VTEwpCisJCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIE9QRU4gdGhlIGZpbGUsIG9yIHVwZ3JhZGUgYW4gZXhpc3RpbmcgT1BFTi4KKwkgKiBJZiB0cnVuY2F0ZSBmYWlscywgdGhlIE9QRU4gZmFpbHMuCisJICovCisJaWYgKHN0cCkgeworCQkvKiBTdGF0ZWlkIHdhcyBmb3VuZCwgdGhpcyBpcyBhbiBPUEVOIHVwZ3JhZGUgKi8KKwkJc3RhdHVzID0gbmZzNF91cGdyYWRlX29wZW4ocnFzdHAsIGN1cnJlbnRfZmgsIHN0cCwgb3Blbik7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQkvKiBTdGF0ZWlkIHdhcyBub3QgZm91bmQsIHRoaXMgaXMgYSBuZXcgT1BFTiAqLworCQlpbnQgZmxhZ3MgPSAwOworCQlpZiAob3Blbi0+b3Bfc2hhcmVfYWNjZXNzICYgTkZTNF9TSEFSRV9BQ0NFU1NfV1JJVEUpCisJCQlmbGFncyA9IE1BWV9XUklURTsKKwkJZWxzZQorCQkJZmxhZ3MgPSBNQVlfUkVBRDsKKwkJaWYgKChzdGF0dXMgPSBuZnM0X25ld19vcGVuKHJxc3RwLCAmc3RwLCBjdXJyZW50X2ZoLCBmbGFncykpKQorCQkJZ290byBvdXQ7CisJCWluaXRfc3RhdGVpZChzdHAsIGZwLCBvcGVuKTsKKwkJc3RhdHVzID0gbmZzZDRfdHJ1bmNhdGUocnFzdHAsIGN1cnJlbnRfZmgsIG9wZW4pOworCQlpZiAoc3RhdHVzKSB7CisJCQlyZWxlYXNlX3N0YXRlaWQoc3RwLCBPUEVOX1NUQVRFKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCW1lbWNweSgmb3Blbi0+b3Bfc3RhdGVpZCwgJnN0cC0+c3Rfc3RhdGVpZCwgc2l6ZW9mKHN0YXRlaWRfdCkpOworCisJLyoKKwkqIEF0dGVtcHQgdG8gaGFuZCBvdXQgYSBkZWxlZ2F0aW9uLiBObyBlcnJvciByZXR1cm4sIGJlY2F1c2UgdGhlCisJKiBPUEVOIHN1Y2NlZWRzIGV2ZW4gaWYgd2UgZmFpbC4KKwkqLworCW5mczRfb3Blbl9kZWxlZ2F0aW9uKGN1cnJlbnRfZmgsIG9wZW4sIHN0cCk7CisKKwlzdGF0dXMgPSBuZnNfb2s7CisKKwlkcHJpbnRrKCJuZnM0X3Byb2Nlc3Nfb3BlbjI6IHN0YXRlaWQ9KCUwOHgvJTA4eC8lMDh4LyUwOHgpXG4iLAorCSAgICAgICAgICAgIHN0cC0+c3Rfc3RhdGVpZC5zaV9ib290LCBzdHAtPnN0X3N0YXRlaWQuc2lfc3RhdGVvd25lcmlkLAorCSAgICAgICAgICAgIHN0cC0+c3Rfc3RhdGVpZC5zaV9maWxlaWQsIHN0cC0+c3Rfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKK291dDoKKwkvKiB0YWtlIHRoZSBvcHBvcnR1bml0eSB0byBjbGVhbiB1cCB1bnVzZWQgc3RhdGUgKi8KKwlpZiAoZnAgJiYgbGlzdF9lbXB0eSgmZnAtPmZpX3BlcmZpbGUpICYmIGxpc3RfZW1wdHkoJmZwLT5maV9kZWxfcGVyZmlsZSkpCisJCXJlbGVhc2VfZmlsZShmcCk7CisKKwkvKiBDTEFJTV9QUkVWSU9VUyBoYXMgZGlmZmVyZW50IGVycm9yIHJldHVybnMgKi8KKwluZnM0X3NldF9jbGFpbV9wcmV2KG9wZW4sICZzdGF0dXMpOworCS8qCisJKiBUbyBmaW5pc2ggdGhlIG9wZW4gcmVzcG9uc2UsIHdlIGp1c3QgbmVlZCB0byBzZXQgdGhlIHJmbGFncy4KKwkqLworCW9wZW4tPm9wX3JmbGFncyA9IE5GUzRfT1BFTl9SRVNVTFRfTE9DS1RZUEVfUE9TSVg7CisJaWYgKCFvcGVuLT5vcF9zdGF0ZW93bmVyLT5zb19jb25maXJtZWQpCisJCW9wZW4tPm9wX3JmbGFncyB8PSBORlM0X09QRU5fUkVTVUxUX0NPTkZJUk07CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IGxhdW5kcm9tYXRfd29yazsKK3N0YXRpYyB2b2lkIGxhdW5kcm9tYXRfbWFpbih2b2lkICopOworc3RhdGljIERFQ0xBUkVfV09SSyhsYXVuZHJvbWF0X3dvcmssIGxhdW5kcm9tYXRfbWFpbiwgTlVMTCk7CisKK2ludCAKK25mc2Q0X3JlbmV3KGNsaWVudGlkX3QgKmNsaWQpCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHA7CisJaW50IHN0YXR1czsKKworCW5mczRfbG9ja19zdGF0ZSgpOworCWRwcmludGsoInByb2Nlc3NfcmVuZXcoJTA4eC8lMDh4KTogc3RhcnRpbmdcbiIsIAorCQkJY2xpZC0+Y2xfYm9vdCwgY2xpZC0+Y2xfaWQpOworCXN0YXR1cyA9IG5mc2Vycl9zdGFsZV9jbGllbnRpZDsKKwlpZiAoU1RBTEVfQ0xJRU5USUQoY2xpZCkpCisJCWdvdG8gb3V0OworCWNscCA9IGZpbmRfY29uZmlybWVkX2NsaWVudChjbGlkKTsKKwlzdGF0dXMgPSBuZnNlcnJfZXhwaXJlZDsKKwlpZiAoY2xwID09IE5VTEwpIHsKKwkJLyogV2UgYXNzdW1lIHRoZSBjbGllbnQgdG9vayB0b28gbG9uZyB0byBSRU5FVy4gKi8KKwkJZHByaW50aygibmZzZDRfcmVuZXc6IGNsaWVudGlkIG5vdCBmb3VuZCFcbiIpOworCQlnb3RvIG91dDsKKwl9CisJcmVuZXdfY2xpZW50KGNscCk7CisJc3RhdHVzID0gbmZzZXJyX2NiX3BhdGhfZG93bjsKKwlpZiAoIWxpc3RfZW1wdHkoJmNscC0+Y2xfZGVsX3BlcmNsbnQpCisJCQkmJiAhYXRvbWljX3JlYWQoJmNscC0+Y2xfY2FsbGJhY2suY2Jfc2V0KSkKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gbmZzX29rOworb3V0OgorCW5mczRfdW5sb2NrX3N0YXRlKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKwordGltZV90CituZnM0X2xhdW5kcm9tYXQodm9pZCkKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscDsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3A7CisJc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHA7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqbmV4dCwgcmVhcGxpc3Q7CisJdGltZV90IGN1dG9mZiA9IGdldF9zZWNvbmRzKCkgLSBORlNEX0xFQVNFX1RJTUU7CisJdGltZV90IHQsIGNsaWVudGlkX3ZhbCA9IE5GU0RfTEVBU0VfVElNRTsKKwl0aW1lX3QgdSwgdGVzdF92YWwgPSBORlNEX0xFQVNFX1RJTUU7CisKKwluZnM0X2xvY2tfc3RhdGUoKTsKKworCWRwcmludGsoIk5GU0Q6IGxhdW5kcm9tYXQgc2VydmljZSAtIHN0YXJ0aW5nXG4iKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuZXh0LCAmY2xpZW50X2xydSkgeworCQljbHAgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IG5mczRfY2xpZW50LCBjbF9scnUpOworCQlpZiAodGltZV9hZnRlcigodW5zaWduZWQgbG9uZyljbHAtPmNsX3RpbWUsICh1bnNpZ25lZCBsb25nKWN1dG9mZikpIHsKKwkJCXQgPSBjbHAtPmNsX3RpbWUgLSBjdXRvZmY7CisJCQlpZiAoY2xpZW50aWRfdmFsID4gdCkKKwkJCQljbGllbnRpZF92YWwgPSB0OworCQkJYnJlYWs7CisJCX0KKwkJZHByaW50aygiTkZTRDogcHVyZ2luZyB1bnVzZWQgY2xpZW50IChjbGllbnRpZCAlMDh4KVxuIiwKKwkJCWNscC0+Y2xfY2xpZW50aWQuY2xfaWQpOworCQlleHBpcmVfY2xpZW50KGNscCk7CisJfQorCUlOSVRfTElTVF9IRUFEKCZyZWFwbGlzdCk7CisJc3Bpbl9sb2NrKCZyZWNhbGxfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbmV4dCwgJmRlbF9yZWNhbGxfbHJ1KSB7CisJCWRwID0gbGlzdF9lbnRyeSAocG9zLCBzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uLCBkbF9yZWNhbGxfbHJ1KTsKKwkJaWYgKHRpbWVfYWZ0ZXIoKHVuc2lnbmVkIGxvbmcpZHAtPmRsX3RpbWUsICh1bnNpZ25lZCBsb25nKWN1dG9mZikpIHsKKwkJCXUgPSBkcC0+ZGxfdGltZSAtIGN1dG9mZjsKKwkJCWlmICh0ZXN0X3ZhbCA+IHUpCisJCQkJdGVzdF92YWwgPSB1OworCQkJYnJlYWs7CisJCX0KKwkJZHByaW50aygiTkZTRDogcHVyZ2luZyB1bnVzZWQgZGVsZWdhdGlvbiBkcCAlcCwgZnAgJXBcbiIsCisJCQkgICAgICAgICAgICBkcCwgZHAtPmRsX2Zsb2NrKTsKKwkJbGlzdF9tb3ZlKCZkcC0+ZGxfcmVjYWxsX2xydSwgJnJlYXBsaXN0KTsKKwl9CisJc3Bpbl91bmxvY2soJnJlY2FsbF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuZXh0LCAmcmVhcGxpc3QpIHsKKwkJZHAgPSBsaXN0X2VudHJ5IChwb3MsIHN0cnVjdCBuZnM0X2RlbGVnYXRpb24sIGRsX3JlY2FsbF9scnUpOworCQlsaXN0X2RlbF9pbml0KCZkcC0+ZGxfcmVjYWxsX2xydSk7CisJCXVuaGFzaF9kZWxlZ2F0aW9uKGRwKTsKKwl9CisJdGVzdF92YWwgPSBORlNEX0xFQVNFX1RJTUU7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbmV4dCwgJmNsb3NlX2xydSkgeworCQlzb3AgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IG5mczRfc3RhdGVvd25lciwgc29fY2xvc2VfbHJ1KTsKKwkJaWYgKHRpbWVfYWZ0ZXIoKHVuc2lnbmVkIGxvbmcpc29wLT5zb190aW1lLCAodW5zaWduZWQgbG9uZyljdXRvZmYpKSB7CisJCQl1ID0gc29wLT5zb190aW1lIC0gY3V0b2ZmOworCQkJaWYgKHRlc3RfdmFsID4gdSkKKwkJCQl0ZXN0X3ZhbCA9IHU7CisJCQlicmVhazsKKwkJfQorCQlkcHJpbnRrKCJORlNEOiBwdXJnaW5nIHVudXNlZCBvcGVuIHN0YXRlb3duZXIgKHNvX2lkICVkKVxuIiwKKwkJCXNvcC0+c29faWQpOworCQlsaXN0X2RlbCgmc29wLT5zb19jbG9zZV9scnUpOworCQluZnM0X3B1dF9zdGF0ZW93bmVyKHNvcCk7CisJfQorCWlmIChjbGllbnRpZF92YWwgPCBORlNEX0xBVU5EUk9NQVRfTUlOVElNRU9VVCkKKwkJY2xpZW50aWRfdmFsID0gTkZTRF9MQVVORFJPTUFUX01JTlRJTUVPVVQ7CisJbmZzNF91bmxvY2tfc3RhdGUoKTsKKwlyZXR1cm4gY2xpZW50aWRfdmFsOworfQorCit2b2lkCitsYXVuZHJvbWF0X21haW4odm9pZCAqbm90X3VzZWQpCit7CisJdGltZV90IHQ7CisKKwl0ID0gbmZzNF9sYXVuZHJvbWF0KCk7CisJZHByaW50aygiTkZTRDogbGF1bmRyb21hdF9tYWluIC0gc2xlZXBpbmcgZm9yICVsZCBzZWNvbmRzXG4iLCB0KTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmxhdW5kcm9tYXRfd29yaywgdCpIWik7Cit9CisKKy8qIHNlYXJjaCBvd25lcmlkX2hhc2h0YmxbXSBhbmQgY2xvc2VfbHJ1IGZvciBzdGF0ZWlkIG93bmVyCisgKiAoc3RhdGVpZC0+c2lfc3RhdGVvd25lcmlkKQorICovCitzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoKK2ZpbmRfb3BlbnN0YXRlb3duZXJfaWQodTMyIHN0X2lkLCBpbnQgZmxhZ3MpIHsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpsb2NhbCA9IE5VTEw7CisKKwlkcHJpbnRrKCJORlNEOiBmaW5kX29wZW5zdGF0ZW93bmVyX2lkICVkXG4iLCBzdF9pZCk7CisJaWYgKGZsYWdzICYgQ0xPU0VfU1RBVEUpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NhbCwgJmNsb3NlX2xydSwgc29fY2xvc2VfbHJ1KSB7CisJCQlpZiAobG9jYWwtPnNvX2lkID09IHN0X2lkKQorCQkJCXJldHVybiBsb2NhbDsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mczRfY2hlY2tfZmgoc3RydWN0IHN2Y19maCAqZmhwLCBzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHApCit7CisJcmV0dXJuIGZocC0+ZmhfZGVudHJ5LT5kX2lub2RlICE9IHN0cC0+c3RfdmZzX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworfQorCitzdGF0aWMgaW50CitTVEFMRV9TVEFURUlEKHN0YXRlaWRfdCAqc3RhdGVpZCkKK3sKKwlpZiAoc3RhdGVpZC0+c2lfYm9vdCA9PSBib290X3RpbWUpCisJCXJldHVybiAwOworCXByaW50aygiTkZTRDogc3RhbGUgc3RhdGVpZCAoJTA4eC8lMDh4LyUwOHgvJTA4eCkhXG4iLAorCQlzdGF0ZWlkLT5zaV9ib290LCBzdGF0ZWlkLT5zaV9zdGF0ZW93bmVyaWQsIHN0YXRlaWQtPnNpX2ZpbGVpZCwKKwkJc3RhdGVpZC0+c2lfZ2VuZXJhdGlvbik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CithY2Nlc3NfcGVybWl0X3JlYWQodW5zaWduZWQgbG9uZyBhY2Nlc3NfYm1hcCkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoTkZTNF9TSEFSRV9BQ0NFU1NfUkVBRCwgJmFjY2Vzc19ibWFwKSB8fAorCQl0ZXN0X2JpdChORlM0X1NIQVJFX0FDQ0VTU19CT1RILCAmYWNjZXNzX2JtYXApIHx8CisJCXRlc3RfYml0KE5GUzRfU0hBUkVfQUNDRVNTX1dSSVRFLCAmYWNjZXNzX2JtYXApOworfQorCitzdGF0aWMgaW5saW5lIGludAorYWNjZXNzX3Blcm1pdF93cml0ZSh1bnNpZ25lZCBsb25nIGFjY2Vzc19ibWFwKQoreworCXJldHVybiB0ZXN0X2JpdChORlM0X1NIQVJFX0FDQ0VTU19XUklURSwgJmFjY2Vzc19ibWFwKSB8fAorCQl0ZXN0X2JpdChORlM0X1NIQVJFX0FDQ0VTU19CT1RILCAmYWNjZXNzX2JtYXApOworfQorCitzdGF0aWMKK2ludCBuZnM0X2NoZWNrX29wZW5tb2RlKHN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cCwgaW50IGZsYWdzKQoreworICAgICAgICBpbnQgc3RhdHVzID0gbmZzZXJyX29wZW5tb2RlOworCisJaWYgKChmbGFncyAmIFdSX1NUQVRFKSAmJiAoIWFjY2Vzc19wZXJtaXRfd3JpdGUoc3RwLT5zdF9hY2Nlc3NfYm1hcCkpKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCWlmICgoZmxhZ3MgJiBSRF9TVEFURSkgJiYgKCFhY2Nlc3NfcGVybWl0X3JlYWQoc3RwLT5zdF9hY2Nlc3NfYm1hcCkpKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCXN0YXR1cyA9IG5mc19vazsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW5saW5lIGludAorbmZzNF9jaGVja19kZWxlZ21vZGUoc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHAsIGludCBmbGFncykKK3sKKwlpZiAoKGZsYWdzICYgV1JfU1RBVEUpICYmIChkcC0+ZGxfdHlwZSA9PSBORlM0X09QRU5fREVMRUdBVEVfUkVBRCkpCisJCXJldHVybiBuZnNlcnJfb3Blbm1vZGU7CisJZWxzZQorCQlyZXR1cm4gbmZzX29rOworfQorCitzdGF0aWMgaW5saW5lIGludAorY2hlY2tfc3BlY2lhbF9zdGF0ZWlkcyhzdmNfZmggKmN1cnJlbnRfZmgsIHN0YXRlaWRfdCAqc3RhdGVpZCwgaW50IGZsYWdzKQoreworCS8qIFRyeWluZyB0byBjYWxsIGRlbGVncmV0dXJuIHdpdGggYSBzcGVjaWFsIHN0YXRlaWQ/IFl1Y2g6ICovCisJaWYgKCEoZmxhZ3MgJiAoUkRfU1RBVEUgfCBXUl9TVEFURSkpKQorCQlyZXR1cm4gbmZzZXJyX2JhZF9zdGF0ZWlkOworCWVsc2UgaWYgKE9ORV9TVEFURUlEKHN0YXRlaWQpICYmIChmbGFncyAmIFJEX1NUQVRFKSkKKwkJcmV0dXJuIG5mc19vazsKKwllbHNlIGlmIChuZnM0X2luX2dyYWNlKCkpIHsKKwkJLyogQW5zd2VyIGluIHJlbWFpbmluZyBjYXNlcyBkZXBlbmRzIG9uIGV4aXN0YW5jZSBvZgorCQkgKiBjb25mbGljdGluZyBzdGF0ZTsgc28gd2UgbXVzdCB3YWl0IG91dCB0aGUgZ3JhY2UgcGVyaW9kLiAqLworCQlyZXR1cm4gbmZzZXJyX2dyYWNlOworCX0gZWxzZSBpZiAoZmxhZ3MgJiBXUl9TVEFURSkKKwkJcmV0dXJuIG5mczRfc2hhcmVfY29uZmxpY3QoY3VycmVudF9maCwKKwkJCQlORlM0X1NIQVJFX0RFTllfV1JJVEUpOworCWVsc2UgLyogKGZsYWdzICYgUkRfU1RBVEUpICYmIFpFUk9fU1RBVEVJRChzdGF0ZWlkKSAqLworCQlyZXR1cm4gbmZzNF9zaGFyZV9jb25mbGljdChjdXJyZW50X2ZoLAorCQkJCU5GUzRfU0hBUkVfREVOWV9SRUFEKTsKK30KKworLyoKKyAqIEFsbG93IFJFQUQvV1JJVEUgZHVyaW5nIGdyYWNlIHBlcmlvZCBvbiByZWNvdmVyZWQgc3RhdGUgb25seSBmb3IgZmlsZXMKKyAqIHRoYXQgYXJlIG5vdCBhYmxlIHRvIHByb3ZpZGUgbWFuZGF0b3J5IGxvY2tpbmcuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citpb19kdXJpbmdfZ3JhY2VfZGlzYWxsb3dlZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIG5mczRfaW5fZ3JhY2UoKSAmJiAoZmxhZ3MgJiAoUkRfU1RBVEUgfCBXUl9TVEFURSkpCisJCSYmIE1BTkRBVE9SWV9MT0NLKGlub2RlKTsKK30KKworLyoKKyogQ2hlY2tzIGZvciBzdGF0ZWlkIG9wZXJhdGlvbnMKKyovCitpbnQKK25mczRfcHJlcHJvY2Vzc19zdGF0ZWlkX29wKHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0YXRlaWRfdCAqc3RhdGVpZCwgaW50IGZsYWdzLCBzdHJ1Y3QgZmlsZSAqKmZpbHBwKQoreworCXN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cCA9IE5VTEw7CisJc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHAgPSBOVUxMOworCXN0YXRlaWRfdCAqc3RpZHA7CisJc3RydWN0IGlub2RlICppbm8gPSBjdXJyZW50X2ZoLT5maF9kZW50cnktPmRfaW5vZGU7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc3RhdGVpZF9vcDogc3RhdGVpZCA9ICglMDh4LyUwOHgvJTA4eC8lMDh4KVxuIiwKKwkJc3RhdGVpZC0+c2lfYm9vdCwgc3RhdGVpZC0+c2lfc3RhdGVvd25lcmlkLCAKKwkJc3RhdGVpZC0+c2lfZmlsZWlkLCBzdGF0ZWlkLT5zaV9nZW5lcmF0aW9uKTsgCisJaWYgKGZpbHBwKQorCQkqZmlscHAgPSBOVUxMOworCisJaWYgKGlvX2R1cmluZ19ncmFjZV9kaXNhbGxvd2VkKGlubywgZmxhZ3MpKQorCQlyZXR1cm4gbmZzZXJyX2dyYWNlOworCisJaWYgKFpFUk9fU1RBVEVJRChzdGF0ZWlkKSB8fCBPTkVfU1RBVEVJRChzdGF0ZWlkKSkKKwkJcmV0dXJuIGNoZWNrX3NwZWNpYWxfc3RhdGVpZHMoY3VycmVudF9maCwgc3RhdGVpZCwgZmxhZ3MpOworCisJLyogU1RBTEUgU1RBVEVJRCAqLworCXN0YXR1cyA9IG5mc2Vycl9zdGFsZV9zdGF0ZWlkOworCWlmIChTVEFMRV9TVEFURUlEKHN0YXRlaWQpKSAKKwkJZ290byBvdXQ7CisKKwkvKiBCQUQgU1RBVEVJRCAqLworCXN0YXR1cyA9IG5mc2Vycl9iYWRfc3RhdGVpZDsKKwlpZiAoIXN0YXRlaWQtPnNpX2ZpbGVpZCkgeyAvKiBkZWxlZ2F0aW9uIHN0YXRlaWQgKi8KKwkJaWYoIShkcCA9IGZpbmRfZGVsZWdhdGlvbl9zdGF0ZWlkKGlubywgc3RhdGVpZCkpKSB7CisJCQlkcHJpbnRrKCJORlNEOiBkZWxlZ2F0aW9uIHN0YXRlaWQgbm90IGZvdW5kXG4iKTsKKwkJCWlmIChuZnM0X2luX2dyYWNlKCkpCisJCQkJc3RhdHVzID0gbmZzZXJyX2dyYWNlOworCQkJZ290byBvdXQ7CisJCX0KKwkJc3RpZHAgPSAmZHAtPmRsX3N0YXRlaWQ7CisJfSBlbHNlIHsgLyogb3BlbiBvciBsb2NrIHN0YXRlaWQgKi8KKwkJaWYgKCEoc3RwID0gZmluZF9zdGF0ZWlkKHN0YXRlaWQsIGZsYWdzKSkpIHsKKwkJCWRwcmludGsoIk5GU0Q6IG9wZW4gb3IgbG9jayBzdGF0ZWlkIG5vdCBmb3VuZFxuIik7CisJCQlpZiAobmZzNF9pbl9ncmFjZSgpKQorCQkJCXN0YXR1cyA9IG5mc2Vycl9ncmFjZTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmICgoZmxhZ3MgJiBDSEVDS19GSCkgJiYgbmZzNF9jaGVja19maChjdXJyZW50X2ZoLCBzdHApKQorCQkJZ290byBvdXQ7CisJCWlmICghc3RwLT5zdF9zdGF0ZW93bmVyLT5zb19jb25maXJtZWQpCisJCQlnb3RvIG91dDsKKwkJc3RpZHAgPSAmc3RwLT5zdF9zdGF0ZWlkOworCX0KKwlpZiAoc3RhdGVpZC0+c2lfZ2VuZXJhdGlvbiA+IHN0aWRwLT5zaV9nZW5lcmF0aW9uKQorCQlnb3RvIG91dDsKKworCS8qIE9MRCBTVEFURUlEICovCisJc3RhdHVzID0gbmZzZXJyX29sZF9zdGF0ZWlkOworCWlmIChzdGF0ZWlkLT5zaV9nZW5lcmF0aW9uIDwgc3RpZHAtPnNpX2dlbmVyYXRpb24pCisJCWdvdG8gb3V0OworCWlmIChzdHApIHsKKwkJaWYgKChzdGF0dXMgPSBuZnM0X2NoZWNrX29wZW5tb2RlKHN0cCxmbGFncykpKQorCQkJZ290byBvdXQ7CisJCXJlbmV3X2NsaWVudChzdHAtPnN0X3N0YXRlb3duZXItPnNvX2NsaWVudCk7CisJCWlmIChmaWxwcCkKKwkJCSpmaWxwcCA9IHN0cC0+c3RfdmZzX2ZpbGU7CisJfSBlbHNlIGlmIChkcCkgeworCQlpZiAoKHN0YXR1cyA9IG5mczRfY2hlY2tfZGVsZWdtb2RlKGRwLCBmbGFncykpKQorCQkJZ290byBvdXQ7CisJCXJlbmV3X2NsaWVudChkcC0+ZGxfY2xpZW50KTsKKwkJaWYgKGZsYWdzICYgREVMRUdfUkVUKQorCQkJdW5oYXNoX2RlbGVnYXRpb24oZHApOworCQlpZiAoZmlscHApCisJCQkqZmlscHAgPSBkcC0+ZGxfdmZzX2ZpbGU7CisJfQorCXN0YXR1cyA9IG5mc19vazsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qIAorICogQ2hlY2tzIGZvciBzZXF1ZW5jZSBpZCBtdXRhdGluZyBvcGVyYXRpb25zLiAKKyAqLworaW50CituZnM0X3ByZXByb2Nlc3Nfc2VxaWRfb3Aoc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgdTMyIHNlcWlkLCBzdGF0ZWlkX3QgKnN0YXRlaWQsIGludCBmbGFncywgc3RydWN0IG5mczRfc3RhdGVvd25lciAqKnNvcHAsIHN0cnVjdCBuZnM0X3N0YXRlaWQgKipzdHBwLCBjbGllbnRpZF90ICpsb2NrY2xpZCkKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cDsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3A7CisKKwlkcHJpbnRrKCJORlNEOiBwcmVwcm9jZXNzX3NlcWlkX29wOiBzZXFpZD0lZCAiIAorCQkJInN0YXRlaWQgPSAoJTA4eC8lMDh4LyUwOHgvJTA4eClcbiIsIHNlcWlkLAorCQlzdGF0ZWlkLT5zaV9ib290LCBzdGF0ZWlkLT5zaV9zdGF0ZW93bmVyaWQsIHN0YXRlaWQtPnNpX2ZpbGVpZCwKKwkJc3RhdGVpZC0+c2lfZ2VuZXJhdGlvbik7CisJCQkgICAgICAgIAorCSpzdHBwID0gTlVMTDsKKwkqc29wcCA9IE5VTEw7CisKKwlzdGF0dXMgPSBuZnNlcnJfYmFkX3N0YXRlaWQ7CisJaWYgKFpFUk9fU1RBVEVJRChzdGF0ZWlkKSB8fCBPTkVfU1RBVEVJRChzdGF0ZWlkKSkgeworCQlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IG1hZ2ljIHN0YXRlaWQhXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3RhdHVzID0gbmZzZXJyX3N0YWxlX3N0YXRlaWQ7CisJaWYgKFNUQUxFX1NUQVRFSUQoc3RhdGVpZCkpCisJCWdvdG8gb3V0OworCS8qCisJKiBXZSByZXR1cm4gQkFEX1NUQVRFSUQgaWYgZmlsZWhhbmRsZSBkb2Vzbid0IG1hdGNoIHN0YXRlaWQsIAorCSogdGhlIGNvbmZpcm1lZCBmbGFnIGlzIGluY29ycmVjbHkgc2V0LCBvciB0aGUgZ2VuZXJhdGlvbiAKKwkqIG51bWJlciBpcyBpbmNvcnJlY3QuICAKKwkqIElmIHRoZXJlIGlzIG5vIGVudHJ5IGluIHRoZSBvcGVuZmlsZSB0YWJsZSBmb3IgdGhpcyBpZCwgCisJKiB3ZSBjYW4ndCBhbHdheXMgcmV0dXJuIEJBRF9TVEFURUlEOworCSogdGhpcyBtaWdodCBiZSBhIHJldHJhbnNtaXR0ZWQgQ0xPU0Ugd2hpY2ggaGFzIGFycml2ZWQgYWZ0ZXIgCisJKiB0aGUgb3BlbmZpbGUgaGFzIGJlZW4gcmVsZWFzZWQuCisJKi8KKwlpZiAoIShzdHAgPSBmaW5kX3N0YXRlaWQoc3RhdGVpZCwgZmxhZ3MpKSkKKwkJZ290byBub19uZnM0X3N0YXRlaWQ7CisKKwlzdGF0dXMgPSBuZnNlcnJfYmFkX3N0YXRlaWQ7CisKKwkvKiBmb3IgbmV3IGxvY2sgc3RhdGVvd25lcnM6CisJICogY2hlY2sgdGhhdCB0aGUgbG9jay0+di5uZXcub3Blbl9zdGF0ZWlkCisJICogcmVmZXJzIHRvIGFuIG9wZW4gc3RhdGVvd25lcgorCSAqCisJICogY2hlY2sgdGhhdCB0aGUgbG9ja2NsaWQgKG5mczRfbG9jay0+di5uZXcuY2xpZW50aWQpIGlzIHRoZSBzYW1lCisJICogYXMgdGhlIG9wZW5fc3RhdGVpZC0+c3Rfc3RhdGVvd25lci0+c29fY2xpZW50LT5jbGllbnRpZAorCSAqLworCWlmIChsb2NrY2xpZCkgeworCQlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3AgPSBzdHAtPnN0X3N0YXRlb3duZXI7CisJCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gc29wLT5zb19jbGllbnQ7CisKKwkJaWYgKCFzb3AtPnNvX2lzX29wZW5fb3duZXIpCisJCQlnb3RvIG91dDsKKwkJaWYgKCFjbXBfY2xpZCgmY2xwLT5jbF9jbGllbnRpZCwgbG9ja2NsaWQpKQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKChmbGFncyAmIENIRUNLX0ZIKSAmJiBuZnM0X2NoZWNrX2ZoKGN1cnJlbnRfZmgsIHN0cCkpIHsKKwkJcHJpbnRrKCJORlNEOiBwcmVwcm9jZXNzX3NlcWlkX29wOiBmaC1zdGF0ZWlkIG1pc21hdGNoIVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCSpzdHBwID0gc3RwOworCSpzb3BwID0gc29wID0gc3RwLT5zdF9zdGF0ZW93bmVyOworCisJLyoKKwkqICBXZSBub3cgdmFsaWRhdGUgdGhlIHNlcWlkIGFuZCBzdGF0ZWlkIGdlbmVyYXRpb24gbnVtYmVycy4KKwkqICBGb3IgdGhlIG1vbWVudCwgd2UgaWdub3JlIHRoZSBwb3NzaWJpbGl0eSBvZiAKKwkqICBnZW5lcmF0aW9uIG51bWJlciB3cmFwYXJvdW5kLgorCSovCisJaWYgKHNlcWlkICE9IHNvcC0+c29fc2VxaWQgKyAxKQorCQlnb3RvIGNoZWNrX3JlcGxheTsKKworCWlmIChzb3AtPnNvX2NvbmZpcm1lZCkgeworCQlpZiAoZmxhZ3MgJiBDT05GSVJNKSB7CisJCQlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IGV4cGVjdGVkIHVuY29uZmlybWVkIHN0YXRlb3duZXIhXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWVsc2UgeworCQlpZiAoIShmbGFncyAmIENPTkZJUk0pKSB7CisJCQlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IHN0YXRlb3duZXIgbm90IGNvbmZpcm1lZCB5ZXQhXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWlmIChzdGF0ZWlkLT5zaV9nZW5lcmF0aW9uID4gc3RwLT5zdF9zdGF0ZWlkLnNpX2dlbmVyYXRpb24pIHsKKwkJcHJpbnRrKCJORlNEOiBwcmVwcm9jZXNzX3NlcWlkX29wOiBmdXR1cmUgc3RhdGVpZD8hXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3RhdHVzID0gbmZzZXJyX29sZF9zdGF0ZWlkOworCWlmIChzdGF0ZWlkLT5zaV9nZW5lcmF0aW9uIDwgc3RwLT5zdF9zdGF0ZWlkLnNpX2dlbmVyYXRpb24pIHsKKwkJcHJpbnRrKCJORlNEOiBwcmVwcm9jZXNzX3NlcWlkX29wOiBvbGQgc3RhdGVpZCFcbiIpOworCQlnb3RvIG91dDsKKwl9CisJLyogWFhYIHJlbmV3IHRoZSBjbGllbnQgbGVhc2UgaGVyZSAqLworCXN0YXR1cyA9IG5mc19vazsKKworb3V0OgorCXJldHVybiBzdGF0dXM7CisKK25vX25mczRfc3RhdGVpZDoKKworCS8qCisJKiBXZSBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGEgYmFkIHN0YXRlaWQgb3IgYSByZXBsYXksIAorCSogc3RhcnRpbmcgYnkgdHJ5aW5nIHRvIGxvb2sgdXAgdGhlIHN0YXRlb3duZXIuCisJKiBJZiBzdGF0ZW93bmVyIGlzIG5vdCBmb3VuZCAtIHN0YXRlaWQgaXMgYmFkLgorCSovCisJaWYgKCEoc29wID0gZmluZF9vcGVuc3RhdGVvd25lcl9pZChzdGF0ZWlkLT5zaV9zdGF0ZW93bmVyaWQsIGZsYWdzKSkpIHsKKwkJcHJpbnRrKCJORlNEOiBwcmVwcm9jZXNzX3NlcWlkX29wOiBubyBzdGF0ZW93bmVyIG9yIG5mczRfc3RhdGVpZCFcbiIpOworCQlzdGF0dXMgPSBuZnNlcnJfYmFkX3N0YXRlaWQ7CisJCWdvdG8gb3V0OworCX0KKwkqc29wcCA9IHNvcDsKKworY2hlY2tfcmVwbGF5OgorCWlmIChzZXFpZCA9PSBzb3AtPnNvX3NlcWlkKSB7CisJCXByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zZXFpZF9vcDogcmV0cmFuc21pc3Npb24/XG4iKTsKKwkJLyogaW5kaWNhdGUgcmVwbGF5IHRvIGNhbGxpbmcgZnVuY3Rpb24gKi8KKwkJc3RhdHVzID0gTkZTRVJSX1JFUExBWV9NRTsKKwl9IGVsc2UgIHsKKwkJcHJpbnRrKCJORlNEOiBwcmVwcm9jZXNzX3NlcWlkX29wOiBiYWQgc2VxaWQgKGV4cGVjdGVkICVkLCBnb3QgJWRcbiIsIHNvcC0+c29fc2VxaWQgKzEsIHNlcWlkKTsKKworCQkqc29wcCA9IE5VTEw7CisJCXN0YXR1cyA9IG5mc2Vycl9iYWRfc2VxaWQ7CisJfQorCWdvdG8gb3V0OworfQorCitpbnQKK25mc2Q0X29wZW5fY29uZmlybShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfb3Blbl9jb25maXJtICpvYykKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcDsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHA7CisKKwlkcHJpbnRrKCJORlNEOiBuZnNkNF9vcGVuX2NvbmZpcm0gb24gZmlsZSAlLipzXG4iLAorCQkJKGludCljdXJyZW50X2ZoLT5maF9kZW50cnktPmRfbmFtZS5sZW4sCisJCQljdXJyZW50X2ZoLT5maF9kZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWlmICgoc3RhdHVzID0gZmhfdmVyaWZ5KHJxc3RwLCBjdXJyZW50X2ZoLCBTX0lGUkVHLCAwKSkpCisJCWdvdG8gb3V0OworCisJbmZzNF9sb2NrX3N0YXRlKCk7CisKKwlpZiAoKHN0YXR1cyA9IG5mczRfcHJlcHJvY2Vzc19zZXFpZF9vcChjdXJyZW50X2ZoLCBvYy0+b2Nfc2VxaWQsCisJCQkJCSZvYy0+b2NfcmVxX3N0YXRlaWQsCisJCQkJCUNIRUNLX0ZIIHwgQ09ORklSTSB8IE9QRU5fU1RBVEUsCisJCQkJCSZvYy0+b2Nfc3RhdGVvd25lciwgJnN0cCwgTlVMTCkpKQorCQlnb3RvIG91dDsgCisKKwlzb3AgPSBvYy0+b2Nfc3RhdGVvd25lcjsKKwlzb3AtPnNvX2NvbmZpcm1lZCA9IDE7CisJdXBkYXRlX3N0YXRlaWQoJnN0cC0+c3Rfc3RhdGVpZCk7CisJbWVtY3B5KCZvYy0+b2NfcmVzcF9zdGF0ZWlkLCAmc3RwLT5zdF9zdGF0ZWlkLCBzaXplb2Yoc3RhdGVpZF90KSk7CisJZHByaW50aygiTkZTRDogbmZzZDRfb3Blbl9jb25maXJtOiBzdWNjZXNzLCBzZXFpZD0lZCAiIAorCQkic3RhdGVpZD0oJTA4eC8lMDh4LyUwOHgvJTA4eClcbiIsIG9jLT5vY19zZXFpZCwKKwkJICAgICAgICAgc3RwLT5zdF9zdGF0ZWlkLnNpX2Jvb3QsCisJCSAgICAgICAgIHN0cC0+c3Rfc3RhdGVpZC5zaV9zdGF0ZW93bmVyaWQsCisJCSAgICAgICAgIHN0cC0+c3Rfc3RhdGVpZC5zaV9maWxlaWQsCisJCSAgICAgICAgIHN0cC0+c3Rfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKK291dDoKKwlpZiAob2MtPm9jX3N0YXRlb3duZXIpCisJCW5mczRfZ2V0X3N0YXRlb3duZXIob2MtPm9jX3N0YXRlb3duZXIpOworCW5mczRfdW5sb2NrX3N0YXRlKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKgorICogdW5zZXQgYWxsIGJpdHMgaW4gdW5pb24gYml0bWFwIChibWFwKSB0aGF0CisgKiBkbyBub3QgZXhpc3QgaW4gc2hhcmUgKGZyb20gc3VjY2Vzc2Z1bCBPUEVOX0RPV05HUkFERSkKKyAqLworc3RhdGljIHZvaWQKK3Jlc2V0X3VuaW9uX2JtYXBfYWNjZXNzKHVuc2lnbmVkIGxvbmcgYWNjZXNzLCB1bnNpZ25lZCBsb25nICpibWFwKQoreworCWludCBpOworCWZvciAoaSA9IDE7IGkgPCA0OyBpKyspIHsKKwkJaWYgKChpICYgYWNjZXNzKSAhPSBpKQorCQkJX19jbGVhcl9iaXQoaSwgYm1hcCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorcmVzZXRfdW5pb25fYm1hcF9kZW55KHVuc2lnbmVkIGxvbmcgZGVueSwgdW5zaWduZWQgbG9uZyAqYm1hcCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmICgoaSAmIGRlbnkpICE9IGkpCisJCQlfX2NsZWFyX2JpdChpLCBibWFwKTsKKwl9Cit9CisKK2ludAorbmZzZDRfb3Blbl9kb3duZ3JhZGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X29wZW5fZG93bmdyYWRlICpvZCkKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cDsKKwl1bnNpZ25lZCBpbnQgc2hhcmVfYWNjZXNzOworCisJZHByaW50aygiTkZTRDogbmZzZDRfb3Blbl9kb3duZ3JhZGUgb24gZmlsZSAlLipzXG4iLCAKKwkJCShpbnQpY3VycmVudF9maC0+ZmhfZGVudHJ5LT5kX25hbWUubGVuLAorCQkJY3VycmVudF9maC0+ZmhfZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlpZiAoIVRFU1RfQUNDRVNTKG9kLT5vZF9zaGFyZV9hY2Nlc3MpIHx8ICFURVNUX0RFTlkob2QtPm9kX3NoYXJlX2RlbnkpKQorCQlyZXR1cm4gbmZzZXJyX2ludmFsOworCisJbmZzNF9sb2NrX3N0YXRlKCk7CisJaWYgKChzdGF0dXMgPSBuZnM0X3ByZXByb2Nlc3Nfc2VxaWRfb3AoY3VycmVudF9maCwgb2QtPm9kX3NlcWlkLCAKKwkJCQkJJm9kLT5vZF9zdGF0ZWlkLCAKKwkJCQkJQ0hFQ0tfRkggfCBPUEVOX1NUQVRFLCAKKwkJCQkJJm9kLT5vZF9zdGF0ZW93bmVyLCAmc3RwLCBOVUxMKSkpCisJCWdvdG8gb3V0OyAKKworCXN0YXR1cyA9IG5mc2Vycl9pbnZhbDsKKwlpZiAoIXRlc3RfYml0KG9kLT5vZF9zaGFyZV9hY2Nlc3MsICZzdHAtPnN0X2FjY2Vzc19ibWFwKSkgeworCQlkcHJpbnRrKCJORlNEOmFjY2VzcyBub3QgYSBzdWJzZXQgY3VycmVudCBiaXRtYXA6IDB4JWx4LCBpbnB1dCBhY2Nlc3M9JTA4eFxuIiwKKwkJCXN0cC0+c3RfYWNjZXNzX2JtYXAsIG9kLT5vZF9zaGFyZV9hY2Nlc3MpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKCF0ZXN0X2JpdChvZC0+b2Rfc2hhcmVfZGVueSwgJnN0cC0+c3RfZGVueV9ibWFwKSkgeworCQlkcHJpbnRrKCJORlNEOmRlbnkgbm90IGEgc3Vic2V0IGN1cnJlbnQgYml0bWFwOiAweCVseCwgaW5wdXQgZGVueT0lMDh4XG4iLAorCQkJc3RwLT5zdF9kZW55X2JtYXAsIG9kLT5vZF9zaGFyZV9kZW55KTsKKwkJZ290byBvdXQ7CisJfQorCXNldF9hY2Nlc3MoJnNoYXJlX2FjY2Vzcywgc3RwLT5zdF9hY2Nlc3NfYm1hcCk7CisJbmZzNF9maWxlX2Rvd25ncmFkZShzdHAtPnN0X3Zmc19maWxlLAorCSAgICAgICAgICAgICAgICAgICAgc2hhcmVfYWNjZXNzICYgfm9kLT5vZF9zaGFyZV9hY2Nlc3MpOworCisJcmVzZXRfdW5pb25fYm1hcF9hY2Nlc3Mob2QtPm9kX3NoYXJlX2FjY2VzcywgJnN0cC0+c3RfYWNjZXNzX2JtYXApOworCXJlc2V0X3VuaW9uX2JtYXBfZGVueShvZC0+b2Rfc2hhcmVfZGVueSwgJnN0cC0+c3RfZGVueV9ibWFwKTsKKworCXVwZGF0ZV9zdGF0ZWlkKCZzdHAtPnN0X3N0YXRlaWQpOworCW1lbWNweSgmb2QtPm9kX3N0YXRlaWQsICZzdHAtPnN0X3N0YXRlaWQsIHNpemVvZihzdGF0ZWlkX3QpKTsKKwlzdGF0dXMgPSBuZnNfb2s7CitvdXQ6CisJaWYgKG9kLT5vZF9zdGF0ZW93bmVyKQorCQluZnM0X2dldF9zdGF0ZW93bmVyKG9kLT5vZF9zdGF0ZW93bmVyKTsKKwluZnM0X3VubG9ja19zdGF0ZSgpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBuZnM0X3VubG9ja19zdGF0ZSgpIGNhbGxlZCBhZnRlciBlbmNvZGUKKyAqLworaW50CituZnNkNF9jbG9zZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfY2xvc2UgKmNsb3NlKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwOworCisJZHByaW50aygiTkZTRDogbmZzZDRfY2xvc2Ugb24gZmlsZSAlLipzXG4iLCAKKwkJCShpbnQpY3VycmVudF9maC0+ZmhfZGVudHJ5LT5kX25hbWUubGVuLAorCQkJY3VycmVudF9maC0+ZmhfZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwluZnM0X2xvY2tfc3RhdGUoKTsKKwkvKiBjaGVjayBjbG9zZV9scnUgZm9yIHJlcGxheSAqLworCWlmICgoc3RhdHVzID0gbmZzNF9wcmVwcm9jZXNzX3NlcWlkX29wKGN1cnJlbnRfZmgsIGNsb3NlLT5jbF9zZXFpZCwgCisJCQkJCSZjbG9zZS0+Y2xfc3RhdGVpZCwgCisJCQkJCUNIRUNLX0ZIIHwgT1BFTl9TVEFURSB8IENMT1NFX1NUQVRFLAorCQkJCQkmY2xvc2UtPmNsX3N0YXRlb3duZXIsICZzdHAsIE5VTEwpKSkKKwkJZ290byBvdXQ7IAorCS8qCisJKiAgUmV0dXJuIHN1Y2Nlc3MsIGJ1dCBmaXJzdCB1cGRhdGUgdGhlIHN0YXRlaWQuCisJKi8KKwlzdGF0dXMgPSBuZnNfb2s7CisJdXBkYXRlX3N0YXRlaWQoJnN0cC0+c3Rfc3RhdGVpZCk7CisJbWVtY3B5KCZjbG9zZS0+Y2xfc3RhdGVpZCwgJnN0cC0+c3Rfc3RhdGVpZCwgc2l6ZW9mKHN0YXRlaWRfdCkpOworCisJLyogcmVsZWFzZV9zdGF0ZV9vd25lcigpIGNhbGxzIG5mc2RfY2xvc2UoKSBpZiBuZWVkZWQgKi8KKwlyZWxlYXNlX3N0YXRlX293bmVyKHN0cCwgT1BFTl9TVEFURSk7CitvdXQ6CisJaWYgKGNsb3NlLT5jbF9zdGF0ZW93bmVyKQorCQluZnM0X2dldF9zdGF0ZW93bmVyKGNsb3NlLT5jbF9zdGF0ZW93bmVyKTsKKwluZnM0X3VubG9ja19zdGF0ZSgpOworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludAorbmZzZDRfZGVsZWdyZXR1cm4oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X2RlbGVncmV0dXJuICpkcikKK3sKKwlpbnQgc3RhdHVzOworCisJaWYgKChzdGF0dXMgPSBmaF92ZXJpZnkocnFzdHAsIGN1cnJlbnRfZmgsIFNfSUZSRUcsIDApKSkKKwkJZ290byBvdXQ7CisKKwluZnM0X2xvY2tfc3RhdGUoKTsKKwlzdGF0dXMgPSBuZnM0X3ByZXByb2Nlc3Nfc3RhdGVpZF9vcChjdXJyZW50X2ZoLCAmZHItPmRyX3N0YXRlaWQsIERFTEVHX1JFVCwgTlVMTCk7CisJbmZzNF91bmxvY2tfc3RhdGUoKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qIAorICogTG9jayBvd25lciBzdGF0ZSAoYnl0ZS1yYW5nZSBsb2NrcykKKyAqLworI2RlZmluZSBMT0ZGX09WRVJGTE9XKHN0YXJ0LCBsZW4pICAgICAgKCh1NjQpKGxlbikgPiB+KHU2NCkoc3RhcnQpKQorI2RlZmluZSBMT0NLX0hBU0hfQklUUyAgICAgICAgICAgICAgOAorI2RlZmluZSBMT0NLX0hBU0hfU0laRSAgICAgICAgICAgICAoMSA8PCBMT0NLX0hBU0hfQklUUykKKyNkZWZpbmUgTE9DS19IQVNIX01BU0sgICAgICAgICAgICAgKExPQ0tfSEFTSF9TSVpFIC0gMSkKKworI2RlZmluZSBsb2Nrb3duZXJpZF9oYXNodmFsKGlkKSBcCisgICAgICAgICgoaWQpICYgTE9DS19IQVNIX01BU0spCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Citsb2NrX293bmVyc3RyX2hhc2h2YWwoc3RydWN0IGlub2RlICppbm9kZSwgdTMyIGNsX2lkLAorCQlzdHJ1Y3QgeGRyX25ldG9iaiAqb3duZXJuYW1lKQoreworCXJldHVybiAoZmlsZV9oYXNodmFsKGlub2RlKSArIGNsX2lkCisJCQkrIG9wYXF1ZV9oYXNodmFsKG93bmVybmFtZS0+ZGF0YSwgb3duZXJuYW1lLT5sZW4pKQorCQkmIExPQ0tfSEFTSF9NQVNLOworfQorCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBsb2NrX293bmVyaWRfaGFzaHRibFtMT0NLX0hBU0hfU0laRV07CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZAlsb2NrX293bmVyc3RyX2hhc2h0YmxbTE9DS19IQVNIX1NJWkVdOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgbG9ja3N0YXRlaWRfaGFzaHRibFtTVEFURUlEX0hBU0hfU0laRV07CisKK3N0cnVjdCBuZnM0X3N0YXRlaWQgKgorZmluZF9zdGF0ZWlkKHN0YXRlaWRfdCAqc3RpZCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBuZnM0X3N0YXRlaWQgKmxvY2FsID0gTlVMTDsKKwl1MzIgc3RfaWQgPSBzdGlkLT5zaV9zdGF0ZW93bmVyaWQ7CisJdTMyIGZfaWQgPSBzdGlkLT5zaV9maWxlaWQ7CisJdW5zaWduZWQgaW50IGhhc2h2YWw7CisKKwlkcHJpbnRrKCJORlNEOiBmaW5kX3N0YXRlaWQgZmxhZ3MgMHgleFxuIixmbGFncyk7CisJaWYgKChmbGFncyAmIExPQ0tfU1RBVEUpIHx8IChmbGFncyAmIFJEX1NUQVRFKSB8fCAoZmxhZ3MgJiBXUl9TVEFURSkpIHsKKwkJaGFzaHZhbCA9IHN0YXRlaWRfaGFzaHZhbChzdF9pZCwgZl9pZCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobG9jYWwsICZsb2Nrc3RhdGVpZF9oYXNodGJsW2hhc2h2YWxdLCBzdF9oYXNoKSB7CisJCQlpZiAoKGxvY2FsLT5zdF9zdGF0ZWlkLnNpX3N0YXRlb3duZXJpZCA9PSBzdF9pZCkgJiYKKwkJCSAgICAobG9jYWwtPnN0X3N0YXRlaWQuc2lfZmlsZWlkID09IGZfaWQpKQorCQkJCXJldHVybiBsb2NhbDsKKwkJfQorCX0gCisJaWYgKChmbGFncyAmIE9QRU5fU1RBVEUpIHx8IChmbGFncyAmIFJEX1NUQVRFKSB8fCAoZmxhZ3MgJiBXUl9TVEFURSkpIHsKKwkJaGFzaHZhbCA9IHN0YXRlaWRfaGFzaHZhbChzdF9pZCwgZl9pZCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobG9jYWwsICZzdGF0ZWlkX2hhc2h0YmxbaGFzaHZhbF0sIHN0X2hhc2gpIHsKKwkJCWlmICgobG9jYWwtPnN0X3N0YXRlaWQuc2lfc3RhdGVvd25lcmlkID09IHN0X2lkKSAmJgorCQkJICAgIChsb2NhbC0+c3Rfc3RhdGVpZC5zaV9maWxlaWQgPT0gZl9pZCkpCisJCQkJcmV0dXJuIGxvY2FsOworCQl9CisJfSBlbHNlCisJCXByaW50aygiTkZTRDogZmluZF9zdGF0ZWlkOiBFUlJPUjogbm8gc3RhdGUgZmxhZ1xuIik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICoKK2ZpbmRfZGVsZWdhdGlvbl9zdGF0ZWlkKHN0cnVjdCBpbm9kZSAqaW5vLCBzdGF0ZWlkX3QgKnN0aWQpCit7CisJc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHAgPSBOVUxMOworCXN0cnVjdCBuZnM0X2ZpbGUgKmZwID0gTlVMTDsKKwl1MzIgc3RfaWQ7CisKKwlkcHJpbnRrKCJORlNEOmZpbmRfZGVsZWdhdGlvbl9zdGF0ZWlkIHN0YXRlaWQ9KCUwOHgvJTA4eC8lMDh4LyUwOHgpXG4iLAorICAgICAgICAgICAgICAgICAgICBzdGlkLT5zaV9ib290LCBzdGlkLT5zaV9zdGF0ZW93bmVyaWQsCisgICAgICAgICAgICAgICAgICAgIHN0aWQtPnNpX2ZpbGVpZCwgc3RpZC0+c2lfZ2VuZXJhdGlvbik7CisKKwlzdF9pZCA9IHN0aWQtPnNpX3N0YXRlb3duZXJpZDsKKwlmcCA9IGZpbmRfZmlsZShpbm8pOworCWlmIChmcCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRwLCAmZnAtPmZpX2RlbF9wZXJmaWxlLCBkbF9kZWxfcGVyZmlsZSkgeworCQkJaWYoZHAtPmRsX3N0YXRlaWQuc2lfc3RhdGVvd25lcmlkID09IHN0X2lkKSB7CisJCQkJZHByaW50aygiTkZTRDogZmluZF9kZWxlZ2F0aW9uIGRwICVwXG4iLGRwKTsKKwkJCQlyZXR1cm4gZHA7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBUT0RPOiBMaW51eCBmaWxlIG9mZnNldHMgYXJlIF9zaWduZWRfIDY0LWJpdCBxdWFudGl0aWVzLCB3aGljaCBtZWFucyB0aGF0CisgKiB3ZSBjYW4ndCBwcm9wZXJseSBoYW5kbGUgbG9jayByZXF1ZXN0cyB0aGF0IGdvIGJleW9uZCB0aGUgKDJeNjMgLSAxKS10aAorICogYnl0ZSwgYmVjYXVzZSBvZiBzaWduIGV4dGVuc2lvbiBwcm9ibGVtcy4gIFNpbmNlIE5GU3Y0IGNhbGxzIGZvciA2NC1iaXQKKyAqIGxvY2tpbmcsIHRoaXMgcHJldmVudHMgdXMgZnJvbSBiZWluZyBjb21wbGV0ZWx5IHByb3RvY29sLWNvbXBsaWFudC4gIFRoZQorICogcmVhbCBzb2x1dGlvbiB0byB0aGlzIHByb2JsZW0gaXMgdG8gc3RhcnQgdXNpbmcgdW5zaWduZWQgZmlsZSBvZmZzZXRzIGluCisgKiB0aGUgVkZTLCBidXQgdGhpcyBpcyBhIHZlcnkgZGVlcCBjaGFuZ2UhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbmZzNF90cmFuc2Zvcm1fbG9ja19vZmZzZXQoc3RydWN0IGZpbGVfbG9jayAqbG9jaykKK3sKKwlpZiAobG9jay0+Zmxfc3RhcnQgPCAwKQorCQlsb2NrLT5mbF9zdGFydCA9IE9GRlNFVF9NQVg7CisJaWYgKGxvY2stPmZsX2VuZCA8IDApCisJCWxvY2stPmZsX2VuZCA9IE9GRlNFVF9NQVg7Cit9CisKK2ludAorbmZzNF92ZXJpZnlfbG9ja19zdGF0ZW93bmVyKHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcCwgdW5zaWduZWQgaW50IGhhc2h2YWwpCit7CisJc3RydWN0IG5mczRfc3RhdGVvd25lciAqbG9jYWwgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCQkJICAgICAgICAKKwlpZiAoaGFzaHZhbCA+PSBMT0NLX0hBU0hfU0laRSkKKwkJZ290byBvdXQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NhbCwgJmxvY2tfb3duZXJpZF9oYXNodGJsW2hhc2h2YWxdLCBzb19pZGhhc2gpIHsKKwkJaWYgKGxvY2FsID09IHNvcCkgeworCQkJc3RhdHVzID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkCituZnM0X3NldF9sb2NrX2RlbmllZChzdHJ1Y3QgZmlsZV9sb2NrICpmbCwgc3RydWN0IG5mc2Q0X2xvY2tfZGVuaWVkICpkZW55KQoreworCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcCA9IChzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICopIGZsLT5mbF9vd25lcjsKKwl1bnNpZ25lZCBpbnQgaHZhbCA9IGxvY2tvd25lcmlkX2hhc2h2YWwoc29wLT5zb19pZCk7CisKKwlkZW55LT5sZF9zb3AgPSBOVUxMOworCWlmIChuZnM0X3ZlcmlmeV9sb2NrX3N0YXRlb3duZXIoc29wLCBodmFsKSkgeworCQlrcmVmX2dldCgmc29wLT5zb19yZWYpOworCQlkZW55LT5sZF9zb3AgPSBzb3A7CisJCWRlbnktPmxkX2NsaWVudGlkID0gc29wLT5zb19jbGllbnQtPmNsX2NsaWVudGlkOworCX0KKwlkZW55LT5sZF9zdGFydCA9IGZsLT5mbF9zdGFydDsKKwlkZW55LT5sZF9sZW5ndGggPSB+KHU2NCkwOworCWlmIChmbC0+ZmxfZW5kICE9IH4odTY0KTApCisJCWRlbnktPmxkX2xlbmd0aCA9IGZsLT5mbF9lbmQgLSBmbC0+Zmxfc3RhcnQgKyAxOyAgICAgICAgCisJZGVueS0+bGRfdHlwZSA9IE5GUzRfUkVBRF9MVDsKKwlpZiAoZmwtPmZsX3R5cGUgIT0gRl9SRExDSykKKwkJZGVueS0+bGRfdHlwZSA9IE5GUzRfV1JJVEVfTFQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoKK2ZpbmRfbG9ja3N0YXRlb3duZXIoc3RydWN0IHhkcl9uZXRvYmogKm93bmVyLCBjbGllbnRpZF90ICpjbGlkKQoreworCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKmxvY2FsID0gTlVMTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBMT0NLX0hBU0hfU0laRTsgaSsrKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobG9jYWwsICZsb2NrX293bmVyaWRfaGFzaHRibFtpXSwgc29faWRoYXNoKSB7CisJCQlpZiAoIWNtcF9vd25lcl9zdHIobG9jYWwsIG93bmVyLCBjbGlkKSkKKwkJCQljb250aW51ZTsKKwkJCXJldHVybiBsb2NhbDsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKgorZmluZF9sb2Nrc3RhdGVvd25lcl9zdHIoc3RydWN0IGlub2RlICppbm9kZSwgY2xpZW50aWRfdCAqY2xpZCwKKwkJc3RydWN0IHhkcl9uZXRvYmogKm93bmVyKQoreworCXVuc2lnbmVkIGludCBoYXNodmFsID0gbG9ja19vd25lcnN0cl9oYXNodmFsKGlub2RlLCBjbGlkLT5jbF9pZCwgb3duZXIpOworCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKm9wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShvcCwgJmxvY2tfb3duZXJzdHJfaGFzaHRibFtoYXNodmFsXSwgc29fc3RyaGFzaCkgeworCQlpZiAoY21wX293bmVyX3N0cihvcCwgb3duZXIsIGNsaWQpKQorCQkJcmV0dXJuIG9wOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEFsbG9jIGEgbG9jayBvd25lciBzdHJ1Y3R1cmUuCisgKiBDYWxsZWQgaW4gbmZzZDRfbG9jayAtIHRoZXJlZm9yZSwgT1BFTiBhbmQgT1BFTl9DT05GSVJNIChpZiBuZWVkZWQpIGhhcyAKKyAqIG9jY3VyZWQuIAorICoKKyAqIHN0cmhhc2h2YWwgPSBsb2NrX293bmVyc3RyX2hhc2h2YWwgCisgKiBzb19zZXFpZCA9IGxvY2stPmxrX25ld19sb2NrX3NlcWlkIC0gMTogaXQgZ2V0cyBidW1wZWQgaW4gZW5jb2RlIAorICovCisKK3N0YXRpYyBzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoKK2FsbG9jX2luaXRfbG9ja19zdGF0ZW93bmVyKHVuc2lnbmVkIGludCBzdHJoYXNodmFsLCBzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCwgc3RydWN0IG5mczRfc3RhdGVpZCAqb3Blbl9zdHAsIHN0cnVjdCBuZnNkNF9sb2NrICpsb2NrKSB7CisJc3RydWN0IG5mczRfc3RhdGVvd25lciAqc29wOworCXN0cnVjdCBuZnM0X3JlcGxheSAqcnA7CisJdW5zaWduZWQgaW50IGlkaGFzaHZhbDsKKworCWlmICghKHNvcCA9IGFsbG9jX3N0YXRlb3duZXIoJmxvY2stPmxrX25ld19vd25lcikpKQorCQlyZXR1cm4gTlVMTDsKKwlpZGhhc2h2YWwgPSBsb2Nrb3duZXJpZF9oYXNodmFsKGN1cnJlbnRfb3duZXJpZCk7CisJSU5JVF9MSVNUX0hFQUQoJnNvcC0+c29faWRoYXNoKTsKKwlJTklUX0xJU1RfSEVBRCgmc29wLT5zb19zdHJoYXNoKTsKKwlJTklUX0xJU1RfSEVBRCgmc29wLT5zb19wZXJjbGllbnQpOworCUlOSVRfTElTVF9IRUFEKCZzb3AtPnNvX3BlcmZpbGVzdGF0ZSk7CisJSU5JVF9MSVNUX0hFQUQoJnNvcC0+c29fcGVybG9ja293bmVyKTsKKwlJTklUX0xJU1RfSEVBRCgmc29wLT5zb19jbG9zZV9scnUpOyAvKiBub3QgdXNlZCAqLworCXNvcC0+c29fdGltZSA9IDA7CisJbGlzdF9hZGQoJnNvcC0+c29faWRoYXNoLCAmbG9ja19vd25lcmlkX2hhc2h0YmxbaWRoYXNodmFsXSk7CisJbGlzdF9hZGQoJnNvcC0+c29fc3RyaGFzaCwgJmxvY2tfb3duZXJzdHJfaGFzaHRibFtzdHJoYXNodmFsXSk7CisJbGlzdF9hZGQoJnNvcC0+c29fcGVybG9ja293bmVyLCAmb3Blbl9zdHAtPnN0X3BlcmxvY2tvd25lcik7CisJc29wLT5zb19pc19vcGVuX293bmVyID0gMDsKKwlzb3AtPnNvX2lkID0gY3VycmVudF9vd25lcmlkKys7CisJc29wLT5zb19jbGllbnQgPSBjbHA7CisJc29wLT5zb19zZXFpZCA9IGxvY2stPmxrX25ld19sb2NrX3NlcWlkIC0gMTsKKwlzb3AtPnNvX2NvbmZpcm1lZCA9IDE7CisJcnAgPSAmc29wLT5zb19yZXBsYXk7CisJcnAtPnJwX3N0YXR1cyA9IE5GU0VSUl9TRVJWRVJGQVVMVDsKKwlycC0+cnBfYnVmbGVuID0gMDsKKwlycC0+cnBfYnVmID0gcnAtPnJwX2lidWY7CisJcmV0dXJuIHNvcDsKK30KKworc3RydWN0IG5mczRfc3RhdGVpZCAqCithbGxvY19pbml0X2xvY2tfc3RhdGVpZChzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3AsIHN0cnVjdCBuZnM0X2ZpbGUgKmZwLCBzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpvcGVuX3N0cCkKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHA7CisJdW5zaWduZWQgaW50IGhhc2h2YWwgPSBzdGF0ZWlkX2hhc2h2YWwoc29wLT5zb19pZCwgZnAtPmZpX2lkKTsKKworCWlmICgoc3RwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5mczRfc3RhdGVpZCksIAorCQkJCQlHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJSU5JVF9MSVNUX0hFQUQoJnN0cC0+c3RfaGFzaCk7CisJSU5JVF9MSVNUX0hFQUQoJnN0cC0+c3RfcGVyZmlsZSk7CisJSU5JVF9MSVNUX0hFQUQoJnN0cC0+c3RfcGVyZmlsZXN0YXRlKTsKKwlJTklUX0xJU1RfSEVBRCgmc3RwLT5zdF9wZXJsb2Nrb3duZXIpOyAvKiBub3QgdXNlZCAqLworCWxpc3RfYWRkKCZzdHAtPnN0X2hhc2gsICZsb2Nrc3RhdGVpZF9oYXNodGJsW2hhc2h2YWxdKTsKKwlsaXN0X2FkZCgmc3RwLT5zdF9wZXJmaWxlLCAmZnAtPmZpX3BlcmZpbGUpOworCWxpc3RfYWRkX3BlcmZpbGUrKzsKKwlsaXN0X2FkZCgmc3RwLT5zdF9wZXJmaWxlc3RhdGUsICZzb3AtPnNvX3BlcmZpbGVzdGF0ZSk7CisJc3RwLT5zdF9zdGF0ZW93bmVyID0gc29wOworCXN0cC0+c3RfZmlsZSA9IGZwOworCXN0cC0+c3Rfc3RhdGVpZC5zaV9ib290ID0gYm9vdF90aW1lOworCXN0cC0+c3Rfc3RhdGVpZC5zaV9zdGF0ZW93bmVyaWQgPSBzb3AtPnNvX2lkOworCXN0cC0+c3Rfc3RhdGVpZC5zaV9maWxlaWQgPSBmcC0+ZmlfaWQ7CisJc3RwLT5zdF9zdGF0ZWlkLnNpX2dlbmVyYXRpb24gPSAwOworCXN0cC0+c3RfdmZzX2ZpbGUgPSBvcGVuX3N0cC0+c3RfdmZzX2ZpbGU7IC8qIEZJWE1FIHJlZmNvdW50Pz8gKi8KKwlzdHAtPnN0X2FjY2Vzc19ibWFwID0gb3Blbl9zdHAtPnN0X2FjY2Vzc19ibWFwOworCXN0cC0+c3RfZGVueV9ibWFwID0gb3Blbl9zdHAtPnN0X2RlbnlfYm1hcDsKKworb3V0OgorCXJldHVybiBzdHA7Cit9CisKK2ludAorY2hlY2tfbG9ja19sZW5ndGgodTY0IG9mZnNldCwgdTY0IGxlbmd0aCkKK3sKKwlyZXR1cm4gKChsZW5ndGggPT0gMCkgIHx8ICgobGVuZ3RoICE9IH4odTY0KTApICYmCisJICAgICBMT0ZGX09WRVJGTE9XKG9mZnNldCwgbGVuZ3RoKSkpOworfQorCisvKgorICogIExPQ0sgb3BlcmF0aW9uIAorICovCitpbnQKK25mc2Q0X2xvY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X2xvY2sgKmxvY2spCit7CisJc3RydWN0IG5mczRfc3RhdGVvd25lciAqbG9ja19zb3AgPSBOVUxMLCAqb3Blbl9zb3AgPSBOVUxMOworCXN0cnVjdCBuZnM0X3N0YXRlaWQgKmxvY2tfc3RwOworCXN0cnVjdCBmaWxlICpmaWxwOworCXN0cnVjdCBmaWxlX2xvY2sgZmlsZV9sb2NrOworCXN0cnVjdCBmaWxlX2xvY2sgKmNvbmZsb2NrOworCWludCBzdGF0dXMgPSAwOworCXVuc2lnbmVkIGludCBzdHJoYXNodmFsOworCisJZHByaW50aygiTkZTRDogbmZzZDRfbG9jazogc3RhcnQ9JUxkIGxlbmd0aD0lTGRcbiIsCisJCShsb25nIGxvbmcpIGxvY2stPmxrX29mZnNldCwKKwkJKGxvbmcgbG9uZykgbG9jay0+bGtfbGVuZ3RoKTsKKworCWlmIChuZnM0X2luX2dyYWNlKCkgJiYgIWxvY2stPmxrX3JlY2xhaW0pCisJCXJldHVybiBuZnNlcnJfZ3JhY2U7CisJaWYgKCFuZnM0X2luX2dyYWNlKCkgJiYgbG9jay0+bGtfcmVjbGFpbSkKKwkJcmV0dXJuIG5mc2Vycl9ub19ncmFjZTsKKworCWlmIChjaGVja19sb2NrX2xlbmd0aChsb2NrLT5sa19vZmZzZXQsIGxvY2stPmxrX2xlbmd0aCkpCisJCSByZXR1cm4gbmZzZXJyX2ludmFsOworCisJbmZzNF9sb2NrX3N0YXRlKCk7CisKKwlpZiAobG9jay0+bGtfaXNfbmV3KSB7CisJLyoKKwkgKiBDbGllbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyBpcyBhIG5ldyBsb2Nrb3duZXIuCisJICogVXNlIG9wZW4gb3duZXIgYW5kIG9wZW4gc3RhdGVpZCB0byBjcmVhdGUgbG9jayBvd25lciBhbmQgbG9jayAKKwkgKiBzdGF0ZWlkLgorCSAqLworCQlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpvcGVuX3N0cCA9IE5VTEw7CisJCXN0cnVjdCBuZnM0X2ZpbGUgKmZwOworCQkKKwkJc3RhdHVzID0gbmZzZXJyX3N0YWxlX2NsaWVudGlkOworCQlpZiAoU1RBTEVfQ0xJRU5USUQoJmxvY2stPmxrX25ld19jbGllbnRpZCkpIHsKKwkJCXByaW50aygiTkZTRDogbmZzZDRfbG9jazogY2xpZW50aWQgaXMgc3RhbGUhXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogaXMgdGhlIG5ldyBsb2NrIHNlcWlkIHByZXNlbnRlZCBieSB0aGUgY2xpZW50IHplcm8/ICovCisJCXN0YXR1cyA9IG5mc2Vycl9iYWRfc2VxaWQ7CisJCWlmIChsb2NrLT52Lm5ldy5sb2NrX3NlcWlkICE9IDApCisJCQlnb3RvIG91dDsKKworCQkvKiB2YWxpZGF0ZSBhbmQgdXBkYXRlIG9wZW4gc3RhdGVpZCBhbmQgb3BlbiBzZXFpZCAqLworCQlzdGF0dXMgPSBuZnM0X3ByZXByb2Nlc3Nfc2VxaWRfb3AoY3VycmVudF9maCwgCisJCQkJICAgICAgICBsb2NrLT5sa19uZXdfb3Blbl9zZXFpZCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgJmxvY2stPmxrX25ld19vcGVuX3N0YXRlaWQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0ZIIHwgT1BFTl9TVEFURSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgJm9wZW5fc29wLCAmb3Blbl9zdHAsCisJCQkJCSZsb2NrLT52Lm5ldy5jbGllbnRpZCk7CisJCWlmIChzdGF0dXMpIHsKKwkJCWlmIChsb2NrLT5sa19yZWNsYWltKQorCQkJCXN0YXR1cyA9IG5mc2Vycl9yZWNsYWltX2JhZDsKKwkJCWdvdG8gb3V0OworCQl9CisJCS8qIGNyZWF0ZSBsb2Nrb3duZXIgYW5kIGxvY2sgc3RhdGVpZCAqLworCQlmcCA9IG9wZW5fc3RwLT5zdF9maWxlOworCQlzdHJoYXNodmFsID0gbG9ja19vd25lcnN0cl9oYXNodmFsKGZwLT5maV9pbm9kZSwgCisJCQkJb3Blbl9zb3AtPnNvX2NsaWVudC0+Y2xfY2xpZW50aWQuY2xfaWQsIAorCQkJCSZsb2NrLT52Lm5ldy5vd25lcik7CisJCS8qIAorCQkgKiBJZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBsb2NrIG93bmVyLCB0aGUgY2xpZW50IGlzIGluIAorCQkgKiBlcnJvciAob3Igb3VyIGJvb2tlZXBpbmcgaXMgd3JvbmchKSAKKwkJICogZm9yIGFza2luZyBmb3IgYSAnbmV3IGxvY2snLgorCQkgKi8KKwkJc3RhdHVzID0gbmZzZXJyX2JhZF9zdGF0ZWlkOworCQlsb2NrX3NvcCA9IGZpbmRfbG9ja3N0YXRlb3duZXIoJmxvY2stPnYubmV3Lm93bmVyLAorCQkJCQkJJmxvY2stPnYubmV3LmNsaWVudGlkKTsKKwkJaWYgKGxvY2tfc29wKQorCQkJZ290byBvdXQ7CisJCXN0YXR1cyA9IG5mc2Vycl9yZXNvdXJjZTsKKwkJaWYgKCEobG9jay0+bGtfc3RhdGVvd25lciA9IGFsbG9jX2luaXRfbG9ja19zdGF0ZW93bmVyKHN0cmhhc2h2YWwsIG9wZW5fc29wLT5zb19jbGllbnQsIG9wZW5fc3RwLCBsb2NrKSkpCisJCQlnb3RvIG91dDsKKwkJaWYgKChsb2NrX3N0cCA9IGFsbG9jX2luaXRfbG9ja19zdGF0ZWlkKGxvY2stPmxrX3N0YXRlb3duZXIsIAorCQkJCQkJZnAsIG9wZW5fc3RwKSkgPT0gTlVMTCkgeworCQkJcmVsZWFzZV9zdGF0ZW93bmVyKGxvY2stPmxrX3N0YXRlb3duZXIpOworCQkJbG9jay0+bGtfc3RhdGVvd25lciA9IE5VTEw7CisJCQlnb3RvIG91dDsKKwkJfQorCQkvKiBidW1wIHRoZSBvcGVuIHNlcWlkIHVzZWQgdG8gY3JlYXRlIHRoZSBsb2NrICovCisJCW9wZW5fc29wLT5zb19zZXFpZCsrOworCX0gZWxzZSB7CisJCS8qIGxvY2sgKGxvY2sgb3duZXIgKyBsb2NrIHN0YXRlaWQpIGFscmVhZHkgZXhpc3RzICovCisJCXN0YXR1cyA9IG5mczRfcHJlcHJvY2Vzc19zZXFpZF9vcChjdXJyZW50X2ZoLAorCQkJCSAgICAgICBsb2NrLT5sa19vbGRfbG9ja19zZXFpZCwgCisJCQkJICAgICAgICZsb2NrLT5sa19vbGRfbG9ja19zdGF0ZWlkLCAKKwkJCQkgICAgICAgQ0hFQ0tfRkggfCBMT0NLX1NUQVRFLCAKKwkJCQkgICAgICAgJmxvY2stPmxrX3N0YXRlb3duZXIsICZsb2NrX3N0cCwgTlVMTCk7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIG91dDsKKwl9CisJLyogbG9jay0+bGtfc3RhdGVvd25lciBhbmQgbG9ja19zdHAgaGF2ZSBiZWVuIGNyZWF0ZWQgb3IgZm91bmQgKi8KKwlmaWxwID0gbG9ja19zdHAtPnN0X3Zmc19maWxlOworCisJaWYgKChzdGF0dXMgPSBmaF92ZXJpZnkocnFzdHAsIGN1cnJlbnRfZmgsIFNfSUZSRUcsIE1BWV9MT0NLKSkpIHsKKwkJcHJpbnRrKCJORlNEOiBuZnNkNF9sb2NrOiBwZXJtaXNzaW9uIGRlbmllZCFcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlsb2Nrc19pbml0X2xvY2soJmZpbGVfbG9jayk7CisJc3dpdGNoIChsb2NrLT5sa190eXBlKSB7CisJCWNhc2UgTkZTNF9SRUFEX0xUOgorCQljYXNlIE5GUzRfUkVBRFdfTFQ6CisJCQlmaWxlX2xvY2suZmxfdHlwZSA9IEZfUkRMQ0s7CisJCWJyZWFrOworCQljYXNlIE5GUzRfV1JJVEVfTFQ6CisJCWNhc2UgTkZTNF9XUklURVdfTFQ6CisJCQlmaWxlX2xvY2suZmxfdHlwZSA9IEZfV1JMQ0s7CisJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3RhdHVzID0gbmZzZXJyX2ludmFsOworCQlnb3RvIG91dDsKKwl9CisJZmlsZV9sb2NrLmZsX293bmVyID0gKGZsX293bmVyX3QpIGxvY2stPmxrX3N0YXRlb3duZXI7CisJZmlsZV9sb2NrLmZsX3BpZCA9IGN1cnJlbnQtPnRnaWQ7CisJZmlsZV9sb2NrLmZsX2ZpbGUgPSBmaWxwOworCWZpbGVfbG9jay5mbF9mbGFncyA9IEZMX1BPU0lYOworCisJZmlsZV9sb2NrLmZsX3N0YXJ0ID0gbG9jay0+bGtfb2Zmc2V0OworCWlmICgobG9jay0+bGtfbGVuZ3RoID09IH4odTY0KTApIHx8IAorCQkJTE9GRl9PVkVSRkxPVyhsb2NrLT5sa19vZmZzZXQsIGxvY2stPmxrX2xlbmd0aCkpCisJCWZpbGVfbG9jay5mbF9lbmQgPSB+KHU2NCkwOworCWVsc2UKKwkJZmlsZV9sb2NrLmZsX2VuZCA9IGxvY2stPmxrX29mZnNldCArIGxvY2stPmxrX2xlbmd0aCAtIDE7CisJbmZzNF90cmFuc2Zvcm1fbG9ja19vZmZzZXQoJmZpbGVfbG9jayk7CisKKwkvKgorCSogVHJ5IHRvIGxvY2sgdGhlIGZpbGUgaW4gdGhlIFZGUy4KKwkqIE5vdGU6IGxvY2tzLmMgdXNlcyB0aGUgQktMIHRvIHByb3RlY3QgdGhlIGlub2RlJ3MgbG9jayBsaXN0LgorCSovCisKKwlzdGF0dXMgPSBwb3NpeF9sb2NrX2ZpbGUoZmlscCwgJmZpbGVfbG9jayk7CisJaWYgKGZpbGVfbG9jay5mbF9vcHMgJiYgZmlsZV9sb2NrLmZsX29wcy0+ZmxfcmVsZWFzZV9wcml2YXRlKQorCQlmaWxlX2xvY2suZmxfb3BzLT5mbF9yZWxlYXNlX3ByaXZhdGUoJmZpbGVfbG9jayk7CisJZHByaW50aygiTkZTRDogbmZzZDRfbG9jazogcG9zaXhfbG9ja19maWxlIHN0YXR1cyAlZFxuIixzdGF0dXMpOworCXN3aXRjaCAoLXN0YXR1cykgeworCWNhc2UgMDogLyogc3VjY2VzcyEgKi8KKwkJdXBkYXRlX3N0YXRlaWQoJmxvY2tfc3RwLT5zdF9zdGF0ZWlkKTsKKwkJbWVtY3B5KCZsb2NrLT5sa19yZXNwX3N0YXRlaWQsICZsb2NrX3N0cC0+c3Rfc3RhdGVpZCwgCisJCQkJc2l6ZW9mKHN0YXRlaWRfdCkpOworCQlnb3RvIG91dDsKKwljYXNlIChFQUdBSU4pOgorCQlnb3RvIGNvbmZsaWN0aW5nX2xvY2s7CisJY2FzZSAoRURFQURMSyk6CisJCXN0YXR1cyA9IG5mc2Vycl9kZWFkbG9jazsKKwlkZWZhdWx0OiAgICAgICAgCisJCWRwcmludGsoIk5GU0Q6IG5mc2Q0X2xvY2s6IHBvc2l4X2xvY2tfZmlsZSgpIGZhaWxlZCEgc3RhdHVzICVkXG4iLHN0YXR1cyk7CisJCWdvdG8gb3V0X2Rlc3Ryb3lfbmV3X3N0YXRlaWQ7CisJfQorCitjb25mbGljdGluZ19sb2NrOgorCWRwcmludGsoIk5GU0Q6IG5mc2Q0X2xvY2s6IGNvbmZsaWN0aW5nIGxvY2sgZm91bmQhXG4iKTsKKwlzdGF0dXMgPSBuZnNlcnJfZGVuaWVkOworCS8qIFhYWCBUaGVyZSBpcyBhIHJhY2UgaGVyZS4gRnV0dXJlIHBhdGNoIG5lZWRlZCB0byBwcm92aWRlIAorCSAqIGFuIGF0b21pYyBwb3NpeF9sb2NrX2FuZF90ZXN0X2ZpbGUKKwkgKi8KKwlpZiAoIShjb25mbG9jayA9IHBvc2l4X3Rlc3RfbG9jayhmaWxwLCAmZmlsZV9sb2NrKSkpIHsKKwkJc3RhdHVzID0gbmZzZXJyX3NlcnZlcmZhdWx0OworCQlnb3RvIG91dDsKKwl9CisJbmZzNF9zZXRfbG9ja19kZW5pZWQoY29uZmxvY2ssICZsb2NrLT5sa19kZW5pZWQpOworCitvdXRfZGVzdHJveV9uZXdfc3RhdGVpZDoKKwlpZiAobG9jay0+bGtfaXNfbmV3KSB7CisJCWRwcmludGsoIk5GU0Q6IG5mc2Q0X2xvY2s6IGRlc3Ryb3kgbmV3IHN0YXRlaWQhXG4iKTsKKwkvKgorCSogQW4gZXJyb3IgZW5jb3VudGVyZWQgYWZ0ZXIgaW5zdGFudGlhdGlvbiBvZiB0aGUgbmV3CisJKiBzdGF0ZWlkIGhhcyBmb3JjZWQgdXMgdG8gZGVzdHJveSBpdC4KKwkqLworCQlpZiAoIXNlcWlkX211dGF0aW5nX2VycihzdGF0dXMpKQorCQkJb3Blbl9zb3AtPnNvX3NlcWlkLS07CisKKwkJcmVsZWFzZV9zdGF0ZV9vd25lcihsb2NrX3N0cCwgTE9DS19TVEFURSk7CisJfQorb3V0OgorCWlmIChsb2NrLT5sa19zdGF0ZW93bmVyKQorCQluZnM0X2dldF9zdGF0ZW93bmVyKGxvY2stPmxrX3N0YXRlb3duZXIpOworCW5mczRfdW5sb2NrX3N0YXRlKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIExPQ0tUIG9wZXJhdGlvbgorICovCitpbnQKK25mc2Q0X2xvY2t0KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9sb2NrdCAqbG9ja3QpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZmlsZSBmaWxlOworCXN0cnVjdCBmaWxlX2xvY2sgZmlsZV9sb2NrOworCXN0cnVjdCBmaWxlX2xvY2sgKmNvbmZsaWN0aW5nX2xvY2s7CisJaW50IHN0YXR1czsKKworCWlmIChuZnM0X2luX2dyYWNlKCkpCisJCXJldHVybiBuZnNlcnJfZ3JhY2U7CisKKwlpZiAoY2hlY2tfbG9ja19sZW5ndGgobG9ja3QtPmx0X29mZnNldCwgbG9ja3QtPmx0X2xlbmd0aCkpCisJCSByZXR1cm4gbmZzZXJyX2ludmFsOworCisJbG9ja3QtPmx0X3N0YXRlb3duZXIgPSBOVUxMOworCW5mczRfbG9ja19zdGF0ZSgpOworCisJc3RhdHVzID0gbmZzZXJyX3N0YWxlX2NsaWVudGlkOworCWlmIChTVEFMRV9DTElFTlRJRCgmbG9ja3QtPmx0X2NsaWVudGlkKSkgeworCQlwcmludGsoIk5GU0Q6IG5mc2Q0X2xvY2t0OiBjbGllbnRpZCBpcyBzdGFsZSFcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKHN0YXR1cyA9IGZoX3ZlcmlmeShycXN0cCwgY3VycmVudF9maCwgU19JRlJFRywgMCkpKSB7CisJCXByaW50aygiTkZTRDogbmZzZDRfbG9ja3Q6IGZoX3ZlcmlmeSgpIGZhaWxlZCFcbiIpOworCQlpZiAoc3RhdHVzID09IG5mc2Vycl9zeW1saW5rKQorCQkJc3RhdHVzID0gbmZzZXJyX2ludmFsOworCQlnb3RvIG91dDsKKwl9CisKKwlpbm9kZSA9IGN1cnJlbnRfZmgtPmZoX2RlbnRyeS0+ZF9pbm9kZTsKKwlsb2Nrc19pbml0X2xvY2soJmZpbGVfbG9jayk7CisJc3dpdGNoIChsb2NrdC0+bHRfdHlwZSkgeworCQljYXNlIE5GUzRfUkVBRF9MVDoKKwkJY2FzZSBORlM0X1JFQURXX0xUOgorCQkJZmlsZV9sb2NrLmZsX3R5cGUgPSBGX1JETENLOworCQlicmVhazsKKwkJY2FzZSBORlM0X1dSSVRFX0xUOgorCQljYXNlIE5GUzRfV1JJVEVXX0xUOgorCQkJZmlsZV9sb2NrLmZsX3R5cGUgPSBGX1dSTENLOworCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiTkZTRDogbmZzNF9sb2NrdDogYmFkIGxvY2sgdHlwZSFcbiIpOworCQkJc3RhdHVzID0gbmZzZXJyX2ludmFsOworCQlnb3RvIG91dDsKKwl9CisKKwlsb2NrdC0+bHRfc3RhdGVvd25lciA9IGZpbmRfbG9ja3N0YXRlb3duZXJfc3RyKGlub2RlLAorCQkJJmxvY2t0LT5sdF9jbGllbnRpZCwgJmxvY2t0LT5sdF9vd25lcik7CisJaWYgKGxvY2t0LT5sdF9zdGF0ZW93bmVyKQorCQlmaWxlX2xvY2suZmxfb3duZXIgPSAoZmxfb3duZXJfdClsb2NrdC0+bHRfc3RhdGVvd25lcjsKKwlmaWxlX2xvY2suZmxfcGlkID0gY3VycmVudC0+dGdpZDsKKwlmaWxlX2xvY2suZmxfZmxhZ3MgPSBGTF9QT1NJWDsKKworCWZpbGVfbG9jay5mbF9zdGFydCA9IGxvY2t0LT5sdF9vZmZzZXQ7CisJaWYgKChsb2NrdC0+bHRfbGVuZ3RoID09IH4odTY0KTApIHx8IExPRkZfT1ZFUkZMT1cobG9ja3QtPmx0X29mZnNldCwgbG9ja3QtPmx0X2xlbmd0aCkpCisJCWZpbGVfbG9jay5mbF9lbmQgPSB+KHU2NCkwOworCWVsc2UKKwkJZmlsZV9sb2NrLmZsX2VuZCA9IGxvY2t0LT5sdF9vZmZzZXQgKyBsb2NrdC0+bHRfbGVuZ3RoIC0gMTsKKworCW5mczRfdHJhbnNmb3JtX2xvY2tfb2Zmc2V0KCZmaWxlX2xvY2spOworCisJLyogcG9zaXhfdGVzdF9sb2NrIHVzZXMgdGhlIHN0cnVjdCBmaWxlIF9vbmx5XyB0byByZXNvbHZlIHRoZSBpbm9kZS4KKwkgKiBzaW5jZSBMT0NLVCBkb2Vzbid0IHJlcXVpcmUgYW4gT1BFTiwgYW5kIHRoZXJlZm9yZSBhIHN0cnVjdAorCSAqIGZpbGUgbWF5IG5vdCBleGlzdCwgcGFzcyBwb3NpeF90ZXN0X2xvY2sgYSBzdHJ1Y3QgZmlsZSB3aXRoCisJICogb25seSB0aGUgZGVudHJ5Omlub2RlIHNldC4KKwkgKi8KKwltZW1zZXQoJmZpbGUsIDAsIHNpemVvZiAoc3RydWN0IGZpbGUpKTsKKwlmaWxlLmZfZGVudHJ5ID0gY3VycmVudF9maC0+ZmhfZGVudHJ5OworCisJc3RhdHVzID0gbmZzX29rOworCWNvbmZsaWN0aW5nX2xvY2sgPSBwb3NpeF90ZXN0X2xvY2soJmZpbGUsICZmaWxlX2xvY2spOworCWlmIChjb25mbGljdGluZ19sb2NrKSB7CisJCXN0YXR1cyA9IG5mc2Vycl9kZW5pZWQ7CisJCW5mczRfc2V0X2xvY2tfZGVuaWVkKGNvbmZsaWN0aW5nX2xvY2ssICZsb2NrdC0+bHRfZGVuaWVkKTsKKwl9CitvdXQ6CisJbmZzNF91bmxvY2tfc3RhdGUoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQKK25mc2Q0X2xvY2t1KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9sb2NrdSAqbG9ja3UpCit7CisJc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwOworCXN0cnVjdCBmaWxlICpmaWxwID0gTlVMTDsKKwlzdHJ1Y3QgZmlsZV9sb2NrIGZpbGVfbG9jazsKKwlpbnQgc3RhdHVzOworCQkJCQkJICAgICAgICAKKwlkcHJpbnRrKCJORlNEOiBuZnNkNF9sb2NrdTogc3RhcnQ9JUxkIGxlbmd0aD0lTGRcbiIsCisJCShsb25nIGxvbmcpIGxvY2t1LT5sdV9vZmZzZXQsCisJCShsb25nIGxvbmcpIGxvY2t1LT5sdV9sZW5ndGgpOworCisJaWYgKGNoZWNrX2xvY2tfbGVuZ3RoKGxvY2t1LT5sdV9vZmZzZXQsIGxvY2t1LT5sdV9sZW5ndGgpKQorCQkgcmV0dXJuIG5mc2Vycl9pbnZhbDsKKworCW5mczRfbG9ja19zdGF0ZSgpOworCQkJCQkJCQkJICAgICAgICAKKwlpZiAoKHN0YXR1cyA9IG5mczRfcHJlcHJvY2Vzc19zZXFpZF9vcChjdXJyZW50X2ZoLCAKKwkJCQkJbG9ja3UtPmx1X3NlcWlkLCAKKwkJCQkJJmxvY2t1LT5sdV9zdGF0ZWlkLCAKKwkJCQkJQ0hFQ0tfRkggfCBMT0NLX1NUQVRFLCAKKwkJCQkJJmxvY2t1LT5sdV9zdGF0ZW93bmVyLCAmc3RwLCBOVUxMKSkpCisJCWdvdG8gb3V0OworCisJZmlscCA9IHN0cC0+c3RfdmZzX2ZpbGU7CisJQlVHX09OKCFmaWxwKTsKKwlsb2Nrc19pbml0X2xvY2soJmZpbGVfbG9jayk7CisJZmlsZV9sb2NrLmZsX3R5cGUgPSBGX1VOTENLOworCWZpbGVfbG9jay5mbF9vd25lciA9IChmbF9vd25lcl90KSBsb2NrdS0+bHVfc3RhdGVvd25lcjsKKwlmaWxlX2xvY2suZmxfcGlkID0gY3VycmVudC0+dGdpZDsKKwlmaWxlX2xvY2suZmxfZmlsZSA9IGZpbHA7CisJZmlsZV9sb2NrLmZsX2ZsYWdzID0gRkxfUE9TSVg7IAorCWZpbGVfbG9jay5mbF9zdGFydCA9IGxvY2t1LT5sdV9vZmZzZXQ7CisKKwlpZiAoKGxvY2t1LT5sdV9sZW5ndGggPT0gfih1NjQpMCkgfHwgTE9GRl9PVkVSRkxPVyhsb2NrdS0+bHVfb2Zmc2V0LCBsb2NrdS0+bHVfbGVuZ3RoKSkKKwkJZmlsZV9sb2NrLmZsX2VuZCA9IH4odTY0KTA7CisJZWxzZQorCQlmaWxlX2xvY2suZmxfZW5kID0gbG9ja3UtPmx1X29mZnNldCArIGxvY2t1LT5sdV9sZW5ndGggLSAxOworCW5mczRfdHJhbnNmb3JtX2xvY2tfb2Zmc2V0KCZmaWxlX2xvY2spOworCisJLyoKKwkqICBUcnkgdG8gdW5sb2NrIHRoZSBmaWxlIGluIHRoZSBWRlMuCisJKi8KKwlzdGF0dXMgPSBwb3NpeF9sb2NrX2ZpbGUoZmlscCwgJmZpbGVfbG9jayk7IAorCWlmIChmaWxlX2xvY2suZmxfb3BzICYmIGZpbGVfbG9jay5mbF9vcHMtPmZsX3JlbGVhc2VfcHJpdmF0ZSkKKwkJZmlsZV9sb2NrLmZsX29wcy0+ZmxfcmVsZWFzZV9wcml2YXRlKCZmaWxlX2xvY2spOworCWlmIChzdGF0dXMpIHsKKwkJcHJpbnRrKCJORlNEOiBuZnM0X2xvY2t1OiBwb3NpeF9sb2NrX2ZpbGUgZmFpbGVkIVxuIik7CisJCWdvdG8gb3V0X25mc2VycjsKKwl9CisJLyoKKwkqIE9LLCB1bmxvY2sgc3VjY2VlZGVkOyB0aGUgb25seSB0aGluZyBsZWZ0IHRvIGRvIGlzIHVwZGF0ZSB0aGUgc3RhdGVpZC4KKwkqLworCXVwZGF0ZV9zdGF0ZWlkKCZzdHAtPnN0X3N0YXRlaWQpOworCW1lbWNweSgmbG9ja3UtPmx1X3N0YXRlaWQsICZzdHAtPnN0X3N0YXRlaWQsIHNpemVvZihzdGF0ZWlkX3QpKTsKKworb3V0OgorCWlmIChsb2NrdS0+bHVfc3RhdGVvd25lcikKKwkJbmZzNF9nZXRfc3RhdGVvd25lcihsb2NrdS0+bHVfc3RhdGVvd25lcik7CisJbmZzNF91bmxvY2tfc3RhdGUoKTsKKwlyZXR1cm4gc3RhdHVzOworCitvdXRfbmZzZXJyOgorCXN0YXR1cyA9IG5mc2Vycm5vKHN0YXR1cyk7CisJZ290byBvdXQ7Cit9CisKKy8qCisgKiByZXR1cm5zCisgKiAJMTogbG9ja3MgaGVsZCBieSBsb2Nrb3duZXIKKyAqIAkwOiBubyBsb2NrcyBoZWxkIGJ5IGxvY2tvd25lcgorICovCitzdGF0aWMgaW50CitjaGVja19mb3JfbG9ja3Moc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKmxvd25lcikKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrICoqZmxwcDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW50IHN0YXR1cyA9IDA7CisKKwlsb2NrX2tlcm5lbCgpOworCWZvciAoZmxwcCA9ICZpbm9kZS0+aV9mbG9jazsgKmZscHAgIT0gTlVMTDsgZmxwcCA9ICYoKmZscHApLT5mbF9uZXh0KSB7CisJCWlmICgoKmZscHApLT5mbF9vd25lciA9PSAoZmxfb3duZXJfdClsb3duZXIpCisJCQlzdGF0dXMgPSAxOworCQkJZ290byBvdXQ7CisJfQorb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQKK25mc2Q0X3JlbGVhc2VfbG9ja293bmVyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9yZWxlYXNlX2xvY2tvd25lciAqcmxvY2tvd25lcikKK3sKKwljbGllbnRpZF90ICpjbGlkID0gJnJsb2Nrb3duZXItPnJsX2NsaWVudGlkOworCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKmxvY2FsID0gTlVMTDsKKwlzdHJ1Y3QgeGRyX25ldG9iaiAqb3duZXIgPSAmcmxvY2tvd25lci0+cmxfb3duZXI7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoIm5mc2Q0X3JlbGVhc2VfbG9ja293bmVyIGNsaWVudGlkOiAoJTA4eC8lMDh4KTpcbiIsCisJCWNsaWQtPmNsX2Jvb3QsIGNsaWQtPmNsX2lkKTsKKworCS8qIFhYWCBjaGVjayBmb3IgbGVhc2UgZXhwaXJhdGlvbiAqLworCisJc3RhdHVzID0gbmZzZXJyX3N0YWxlX2NsaWVudGlkOworCWlmIChTVEFMRV9DTElFTlRJRChjbGlkKSkgeworCQlwcmludGsoIk5GU0Q6IG5mc2Q0X3JlbGVhc2VfbG9ja293bmVyOiBjbGllbnRpZCBpcyBzdGFsZSFcbiIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCW5mczRfbG9ja19zdGF0ZSgpOworCisJc3RhdHVzID0gbmZzX29rOworCWxvY2FsID0gZmluZF9sb2Nrc3RhdGVvd25lcihvd25lciwgY2xpZCk7CisJaWYgKGxvY2FsKSB7CisJCXN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cDsKKworCQkvKiBjaGVjayBmb3IgYW55IGxvY2tzIGhlbGQgYnkgYW55IHN0YXRlaWQKKwkJICogYXNzb2NpYXRlZCB3aXRoIHRoZSAobG9jaykgc3RhdGVvd25lciAqLworCQlzdGF0dXMgPSBuZnNlcnJfbG9ja3NfaGVsZDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShzdHAsICZsb2NhbC0+c29fcGVyZmlsZXN0YXRlLAorCQkJCXN0X3BlcmZpbGVzdGF0ZSkgeworCQkJaWYgKGNoZWNrX2Zvcl9sb2NrcyhzdHAtPnN0X3Zmc19maWxlLCBsb2NhbCkpCisJCQkJZ290byBvdXQ7CisJCX0KKwkJLyogbm8gbG9ja3MgaGVsZCBieSAobG9jaykgc3RhdGVvd25lciAqLworCQlzdGF0dXMgPSBuZnNfb2s7CisJCXJlbGVhc2Vfc3RhdGVvd25lcihsb2NhbCk7CisJfQorb3V0OgorCW5mczRfdW5sb2NrX3N0YXRlKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmZzNF9jbGllbnRfcmVjbGFpbSAqCithbGxvY19yZWNsYWltKGludCBuYW1lbGVuKQoreworCXN0cnVjdCBuZnM0X2NsaWVudF9yZWNsYWltICpjcnAgPSBOVUxMOworCisJY3JwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5mczRfY2xpZW50X3JlY2xhaW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNycCkKKwkJcmV0dXJuIE5VTEw7CisJY3JwLT5jcl9uYW1lLmRhdGEgPSBrbWFsbG9jKG5hbWVsZW4sIEdGUF9LRVJORUwpOworCWlmICghY3JwLT5jcl9uYW1lLmRhdGEpIHsKKwkJa2ZyZWUoY3JwKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBjcnA7Cit9CisKKy8qCisgKiBmYWlsdXJlID0+IGFsbCByZXNldCBiZXRzIGFyZSBvZmYsIG5mc2Vycl9ub19ncmFjZS4uLgorICovCitzdGF0aWMgaW50CituZnM0X2NsaWVudF90b19yZWNsYWltKGNoYXIgKm5hbWUsIGludCBuYW1sZW4pCit7CisJdW5zaWduZWQgaW50IHN0cmhhc2h2YWw7CisJc3RydWN0IG5mczRfY2xpZW50X3JlY2xhaW0gKmNycCA9IE5VTEw7CisKKwlkcHJpbnRrKCJORlNEIG5mczRfY2xpZW50X3RvX3JlY2xhaW0gTkFNRTogJS4qc1xuIiwgbmFtbGVuLCBuYW1lKTsKKwljcnAgPSBhbGxvY19yZWNsYWltKG5hbWxlbik7CisJaWYgKCFjcnApCisJCXJldHVybiAwOworCXN0cmhhc2h2YWwgPSBjbGllbnRzdHJfaGFzaHZhbChuYW1lLCBuYW1sZW4pOworCUlOSVRfTElTVF9IRUFEKCZjcnAtPmNyX3N0cmhhc2gpOworCWxpc3RfYWRkKCZjcnAtPmNyX3N0cmhhc2gsICZyZWNsYWltX3N0cl9oYXNodGJsW3N0cmhhc2h2YWxdKTsKKwltZW1jcHkoY3JwLT5jcl9uYW1lLmRhdGEsIG5hbWUsIG5hbWxlbik7CisJY3JwLT5jcl9uYW1lLmxlbiA9IG5hbWxlbjsKKwlyZWNsYWltX3N0cl9oYXNodGJsX3NpemUrKzsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK25mczRfcmVsZWFzZV9yZWNsYWltKHZvaWQpCit7CisJc3RydWN0IG5mczRfY2xpZW50X3JlY2xhaW0gKmNycCA9IE5VTEw7CisJaW50IGk7CisKKwlCVUdfT04oIW5mczRfcmVjbGFpbV9pbml0KTsKKwlmb3IgKGkgPSAwOyBpIDwgQ0xJRU5UX0hBU0hfU0laRTsgaSsrKSB7CisJCXdoaWxlICghbGlzdF9lbXB0eSgmcmVjbGFpbV9zdHJfaGFzaHRibFtpXSkpIHsKKwkJCWNycCA9IGxpc3RfZW50cnkocmVjbGFpbV9zdHJfaGFzaHRibFtpXS5uZXh0LAorCQkJICAgICAgICAgICAgICAgIHN0cnVjdCBuZnM0X2NsaWVudF9yZWNsYWltLCBjcl9zdHJoYXNoKTsKKwkJCWxpc3RfZGVsKCZjcnAtPmNyX3N0cmhhc2gpOworCQkJa2ZyZWUoY3JwLT5jcl9uYW1lLmRhdGEpOworCQkJa2ZyZWUoY3JwKTsKKwkJCXJlY2xhaW1fc3RyX2hhc2h0Ymxfc2l6ZS0tOworCQl9CisJfQorCUJVR19PTihyZWNsYWltX3N0cl9oYXNodGJsX3NpemUpOworfQorCisvKgorICogY2FsbGVkIGZyb20gT1BFTiwgQ0xBSU1fUFJFVklPVVMgd2l0aCBhIG5ldyBjbGllbnRpZC4gKi8KK3N0cnVjdCBuZnM0X2NsaWVudF9yZWNsYWltICoKK25mczRfZmluZF9yZWNsYWltX2NsaWVudChjbGllbnRpZF90ICpjbGlkKQoreworCXVuc2lnbmVkIGludCBzdHJoYXNodmFsOworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwOworCXN0cnVjdCBuZnM0X2NsaWVudF9yZWNsYWltICpjcnAgPSBOVUxMOworCisKKwkvKiBmaW5kIGNsaWVudGlkIGluIGNvbmZfaWRfaGFzaHRibCAqLworCWNscCA9IGZpbmRfY29uZmlybWVkX2NsaWVudChjbGlkKTsKKwlpZiAoY2xwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJZHByaW50aygiTkZTRDogbmZzNF9maW5kX3JlY2xhaW1fY2xpZW50IGZvciAlLipzXG4iLAorCQkgICAgICAgICAgICBjbHAtPmNsX25hbWUubGVuLCBjbHAtPmNsX25hbWUuZGF0YSk7CisKKwkvKiBmaW5kIGNscC0+Y2xfbmFtZSBpbiByZWNsYWltX3N0cl9oYXNodGJsICovCisJc3RyaGFzaHZhbCA9IGNsaWVudHN0cl9oYXNodmFsKGNscC0+Y2xfbmFtZS5kYXRhLCBjbHAtPmNsX25hbWUubGVuKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNycCwgJnJlY2xhaW1fc3RyX2hhc2h0Ymxbc3RyaGFzaHZhbF0sIGNyX3N0cmhhc2gpIHsKKwkJaWYgKGNtcF9uYW1lKCZjcnAtPmNyX25hbWUsICZjbHAtPmNsX25hbWUpKSB7CisJCQlyZXR1cm4gY3JwOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorKiBDYWxsZWQgZnJvbSBPUEVOLiBMb29rIGZvciBjbGllbnRpZCBpbiByZWNsYWltIGxpc3QuCisqLworaW50CituZnM0X2NoZWNrX29wZW5fcmVjbGFpbShjbGllbnRpZF90ICpjbGlkKQoreworCXN0cnVjdCBuZnM0X2NsaWVudF9yZWNsYWltICpjcnA7CisKKwlpZiAoKGNycCA9IG5mczRfZmluZF9yZWNsYWltX2NsaWVudChjbGlkKSkgPT0gTlVMTCkKKwkJcmV0dXJuIG5mc2Vycl9yZWNsYWltX2JhZDsKKwlyZXR1cm4gbmZzX29rOworfQorCisKKy8qIAorICogU3RhcnQgYW5kIHN0b3Agcm91dGluZXMKKyAqLworCitzdGF0aWMgdm9pZAorX19uZnM0X3N0YXRlX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwl0aW1lX3QgZ3JhY2VfdGltZTsKKworCWlmICghbmZzNF9yZWNsYWltX2luaXQpIHsKKwkJZm9yIChpID0gMDsgaSA8IENMSUVOVF9IQVNIX1NJWkU7IGkrKykKKwkJCUlOSVRfTElTVF9IRUFEKCZyZWNsYWltX3N0cl9oYXNodGJsW2ldKTsKKwkJcmVjbGFpbV9zdHJfaGFzaHRibF9zaXplID0gMDsKKwkJbmZzNF9yZWNsYWltX2luaXQgPSAxOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgQ0xJRU5UX0hBU0hfU0laRTsgaSsrKSB7CisJCUlOSVRfTElTVF9IRUFEKCZjb25mX2lkX2hhc2h0YmxbaV0pOworCQlJTklUX0xJU1RfSEVBRCgmY29uZl9zdHJfaGFzaHRibFtpXSk7CisJCUlOSVRfTElTVF9IRUFEKCZ1bmNvbmZfc3RyX2hhc2h0YmxbaV0pOworCQlJTklUX0xJU1RfSEVBRCgmdW5jb25mX2lkX2hhc2h0YmxbaV0pOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgRklMRV9IQVNIX1NJWkU7IGkrKykgeworCQlJTklUX0xJU1RfSEVBRCgmZmlsZV9oYXNodGJsW2ldKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IE9XTkVSX0hBU0hfU0laRTsgaSsrKSB7CisJCUlOSVRfTElTVF9IRUFEKCZvd25lcnN0cl9oYXNodGJsW2ldKTsKKwkJSU5JVF9MSVNUX0hFQUQoJm93bmVyaWRfaGFzaHRibFtpXSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBTVEFURUlEX0hBU0hfU0laRTsgaSsrKSB7CisJCUlOSVRfTElTVF9IRUFEKCZzdGF0ZWlkX2hhc2h0YmxbaV0pOworCQlJTklUX0xJU1RfSEVBRCgmbG9ja3N0YXRlaWRfaGFzaHRibFtpXSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBMT0NLX0hBU0hfU0laRTsgaSsrKSB7CisJCUlOSVRfTElTVF9IRUFEKCZsb2NrX293bmVyaWRfaGFzaHRibFtpXSk7CisJCUlOSVRfTElTVF9IRUFEKCZsb2NrX293bmVyc3RyX2hhc2h0YmxbaV0pOworCX0KKwltZW1zZXQoJnplcm9zdGF0ZWlkLCAwLCBzaXplb2Yoc3RhdGVpZF90KSk7CisJbWVtc2V0KCZvbmVzdGF0ZWlkLCB+MCwgc2l6ZW9mKHN0YXRlaWRfdCkpOworCisJSU5JVF9MSVNUX0hFQUQoJmNsb3NlX2xydSk7CisJSU5JVF9MSVNUX0hFQUQoJmNsaWVudF9scnUpOworCUlOSVRfTElTVF9IRUFEKCZkZWxfcmVjYWxsX2xydSk7CisJc3Bpbl9sb2NrX2luaXQoJnJlY2FsbF9sb2NrKTsKKwlib290X3RpbWUgPSBnZXRfc2Vjb25kcygpOworCWdyYWNlX3RpbWUgPSBtYXgob2xkX2xlYXNlX3RpbWUsIGxlYXNlX3RpbWUpOworCWlmIChyZWNsYWltX3N0cl9oYXNodGJsX3NpemUgPT0gMCkKKwkJZ3JhY2VfdGltZSA9IDA7CisJaWYgKGdyYWNlX3RpbWUpCisJCXByaW50aygiTkZTRDogc3RhcnRpbmcgJWxkLXNlY29uZCBncmFjZSBwZXJpb2RcbiIsIGdyYWNlX3RpbWUpOworCWdyYWNlX2VuZCA9IGJvb3RfdGltZSArIGdyYWNlX3RpbWU7CisJSU5JVF9XT1JLKCZsYXVuZHJvbWF0X3dvcmssbGF1bmRyb21hdF9tYWluLCBOVUxMKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmxhdW5kcm9tYXRfd29yaywgTkZTRF9MRUFTRV9USU1FKkhaKTsKK30KKworaW50CituZnM0X3N0YXRlX2luaXQodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCisJaWYgKG5mczRfaW5pdCkKKwkJcmV0dXJuIDA7CisJc3RhdHVzID0gbmZzZDRfaW5pdF9zbGFicygpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisJX19uZnM0X3N0YXRlX2luaXQoKTsKKwluZnM0X2luaXQgPSAxOworCXJldHVybiAwOworfQorCitpbnQKK25mczRfaW5fZ3JhY2Uodm9pZCkKK3sKKwlyZXR1cm4gZ2V0X3NlY29uZHMoKSA8IGdyYWNlX2VuZDsKK30KKwordm9pZAorc2V0X25vX2dyYWNlKHZvaWQpCit7CisJcHJpbnRrKCJORlNEOiBFUlJPUiBpbiByZWJvb3QgcmVjb3ZlcnkuICBTdGF0ZSByZWNsYWltcyB3aWxsIGZhaWwuXG4iKTsKKwlncmFjZV9lbmQgPSBnZXRfc2Vjb25kcygpOworfQorCit0aW1lX3QKK25mczRfbGVhc2VfdGltZSh2b2lkKQoreworCXJldHVybiBsZWFzZV90aW1lOworfQorCitzdGF0aWMgdm9pZAorX19uZnM0X3N0YXRlX3NodXRkb3duKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBOVUxMOworCXN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwID0gTlVMTDsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3AgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKm5leHQsIHJlYXBsaXN0OworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbmV4dCwgJmNsb3NlX2xydSkgeworCQlzb3AgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IG5mczRfc3RhdGVvd25lciwgc29fY2xvc2VfbHJ1KTsKKwkJbGlzdF9kZWwoJnNvcC0+c29fY2xvc2VfbHJ1KTsKKwkJbmZzNF9wdXRfc3RhdGVvd25lcihzb3ApOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBDTElFTlRfSEFTSF9TSVpFOyBpKyspIHsKKwkJd2hpbGUgKCFsaXN0X2VtcHR5KCZjb25mX2lkX2hhc2h0YmxbaV0pKSB7CisJCQljbHAgPSBsaXN0X2VudHJ5KGNvbmZfaWRfaGFzaHRibFtpXS5uZXh0LCBzdHJ1Y3QgbmZzNF9jbGllbnQsIGNsX2lkaGFzaCk7CisJCQlleHBpcmVfY2xpZW50KGNscCk7CisJCX0KKwkJd2hpbGUgKCFsaXN0X2VtcHR5KCZ1bmNvbmZfc3RyX2hhc2h0YmxbaV0pKSB7CisJCQljbHAgPSBsaXN0X2VudHJ5KHVuY29uZl9zdHJfaGFzaHRibFtpXS5uZXh0LCBzdHJ1Y3QgbmZzNF9jbGllbnQsIGNsX3N0cmhhc2gpOworCQkJZXhwaXJlX2NsaWVudChjbHApOworCQl9CisJfQorCUlOSVRfTElTVF9IRUFEKCZyZWFwbGlzdCk7CisJc3Bpbl9sb2NrKCZyZWNhbGxfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbmV4dCwgJmRlbF9yZWNhbGxfbHJ1KSB7CisJCWRwID0gbGlzdF9lbnRyeSAocG9zLCBzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uLCBkbF9yZWNhbGxfbHJ1KTsKKwkJbGlzdF9tb3ZlKCZkcC0+ZGxfcmVjYWxsX2xydSwgJnJlYXBsaXN0KTsKKwl9CisJc3Bpbl91bmxvY2soJnJlY2FsbF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuZXh0LCAmcmVhcGxpc3QpIHsKKwkJZHAgPSBsaXN0X2VudHJ5IChwb3MsIHN0cnVjdCBuZnM0X2RlbGVnYXRpb24sIGRsX3JlY2FsbF9scnUpOworCQlsaXN0X2RlbF9pbml0KCZkcC0+ZGxfcmVjYWxsX2xydSk7CisJCXVuaGFzaF9kZWxlZ2F0aW9uKGRwKTsKKwl9CisKKwlyZWxlYXNlX2FsbF9maWxlcygpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmxhdW5kcm9tYXRfd29yayk7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwluZnM0X2luaXQgPSAwOworCWRwcmludGsoIk5GU0Q6IGxpc3RfYWRkX3BlcmZpbGUgJWQgbGlzdF9kZWxfcGVyZmlsZSAlZFxuIiwKKwkJCWxpc3RfYWRkX3BlcmZpbGUsIGxpc3RfZGVsX3BlcmZpbGUpOworCWRwcmludGsoIk5GU0Q6IGFkZF9wZXJjbGllbnQgJWQgZGVsX3BlcmNsaWVudCAlZFxuIiwKKwkJCWFkZF9wZXJjbGllbnQsIGRlbF9wZXJjbGllbnQpOworCWRwcmludGsoIk5GU0Q6IGFsbG9jX2ZpbGUgJWQgZnJlZV9maWxlICVkXG4iLAorCQkJYWxsb2NfZmlsZSwgZnJlZV9maWxlKTsKKwlkcHJpbnRrKCJORlNEOiB2ZnNvcGVuICVkIHZmc2Nsb3NlICVkXG4iLAorCQkJdmZzb3BlbiwgdmZzY2xvc2UpOworCWRwcmludGsoIk5GU0Q6IGFsbG9jX2RlbGVnYXRpb24gJWQgZnJlZV9kZWxlZ2F0aW9uICVkXG4iLAorCQkJYWxsb2NfZGVsZWdhdGlvbiwgZnJlZV9kZWxlZ2F0aW9uKTsKKworfQorCit2b2lkCituZnM0X3N0YXRlX3NodXRkb3duKHZvaWQpCit7CisJbmZzNF9sb2NrX3N0YXRlKCk7CisJbmZzNF9yZWxlYXNlX3JlY2xhaW0oKTsKKwlfX25mczRfc3RhdGVfc2h1dGRvd24oKTsKKwluZnNkNF9mcmVlX3NsYWJzKCk7CisJbmZzNF91bmxvY2tfc3RhdGUoKTsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIGxlYXNldGltZSBpcyBjaGFuZ2VkLgorICoKKyAqIGlmIG5mc2QgaXMgbm90IHN0YXJ0ZWQsIHNpbXBseSBzZXQgdGhlIGdsb2JhbCBsZWFzZS4KKyAqCisgKiBpZiBuZnNkKHMpIGFyZSBydW5uaW5nLCBsZWFzZSBjaGFuZ2UgcmVxdWlyZXMgbmZzdjQgc3RhdGUgdG8gYmUgcmVzZXQuCisgKiBlLmc6IGJvb3RfdGltZSBpcyByZXNldCwgZXhpc3RpbmcgbmZzNF9jbGllbnQgc3RydWN0cyBhcmUKKyAqIHVzZWQgdG8gZmlsbCByZWNsYWltX3N0cl9oYXNodGJsLCB0aGVuIGFsbCBzdGF0ZSAoZXhjZXB0IGZvciB0aGUKKyAqIHJlY2xhaW1fc3RyX2hhc2h0YmwpIGlzIHJlLWluaXRpYWxpemVkLgorICoKKyAqIGlmIHRoZSBvbGQgbGVhc2UgdGltZSBpcyBncmVhdGVyIHRoYW4gdGhlIG5ldyBsZWFzZSB0aW1lLCB0aGUgZ3JhY2UKKyAqIHBlcmlvZCBuZWVkcyB0byBiZSBzZXQgdG8gdGhlIG9sZCBsZWFzZSB0aW1lIHRvIGFsbG93IGNsaWVudHMgdG8gcmVjbGFpbQorICogdGhlaXIgc3RhdGUuIFhYWCAtIHdlIG1heSB3YW50IHRvIHNldCB0aGUgZ3JhY2UgcGVyaW9kID09IGxlYXNlIHRpbWUKKyAqIGFmdGVyIGFuIGluaXRpYWwgZ3JhY2UgcGVyaW9kID09IG9sZCBsZWFzZSB0aW1lCisgKgorICogaWYgYW4gZXJyb3Igb2NjdXJzIGluIHRoaXMgcHJvY2VzcywgdGhlIG5ldyBsZWFzZSBpcyBzZXQsIGJ1dCB0aGUgc2VydmVyCisgKiB3aWxsIG5vdCBob25vciBPUEVOIG9yIExPQ0sgcmVjbGFpbXMsIGFuZCB3aWxsIHJldHVybiBuZnNlcnJfbm9fZ3JhY2UKKyAqIHdoaWNoIG1lYW5zIE9QRU4vTE9DSy9SRUFEL1dSSVRFIHdpbGwgZmFpbCBkdXJpbmcgZ3JhY2UgcGVyaW9kLgorICoKKyAqIGNsaWVudHMgd2lsbCBhdHRlbXB0IHRvIHJlc2V0IGFsbCBzdGF0ZSB3aXRoIFNFVENMSUVOVElEL0NPTkZJUk0sIGFuZAorICogT1BFTiBhbmQgTE9DSyByZWNsYWltcy4KKyAqLwordm9pZAorbmZzNF9yZXNldF9sZWFzZSh0aW1lX3QgbGVhc2V0aW1lKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwOworCWludCBpOworCisJcHJpbnRrKCJORlNEOiBOZXcgbGVhc2V0aW1lICVsZFxuIixsZWFzZXRpbWUpOworCWlmICghbmZzNF9pbml0KQorCQlyZXR1cm47CisJbmZzNF9sb2NrX3N0YXRlKCk7CisJb2xkX2xlYXNlX3RpbWUgPSBsZWFzZV90aW1lOworCWxlYXNlX3RpbWUgPSBsZWFzZXRpbWU7CisKKwluZnM0X3JlbGVhc2VfcmVjbGFpbSgpOworCisJLyogcG9wdWxhdGUgcmVjbGFpbV9zdHJfaGFzaHRibCB3aXRoIGN1cnJlbnQgY29uZmlybWVkIG5mczRfY2xpZW50aWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ0xJRU5UX0hBU0hfU0laRTsgaSsrKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xwLCAmY29uZl9pZF9oYXNodGJsW2ldLCBjbF9pZGhhc2gpIHsKKwkJCWlmICghbmZzNF9jbGllbnRfdG9fcmVjbGFpbShjbHAtPmNsX25hbWUuZGF0YSwKKwkJCQkJCWNscC0+Y2xfbmFtZS5sZW4pKSB7CisJCQkJbmZzNF9yZWxlYXNlX3JlY2xhaW0oKTsKKwkJCQlnb3RvIGluaXRfc3RhdGU7CisJCQl9CisJCX0KKwl9Citpbml0X3N0YXRlOgorCV9fbmZzNF9zdGF0ZV9zaHV0ZG93bigpOworCV9fbmZzNF9zdGF0ZV9pbml0KCk7CisJbmZzNF91bmxvY2tfc3RhdGUoKTsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0eGRyLmMgYi9mcy9uZnNkL25mczR4ZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmEwNThhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzZC9uZnM0eGRyLmMKQEAgLTAsMCArMSwyNTM2IEBACisvKgorICogIGZzL25mcy9uZnM0eGRyLmMKKyAqCisgKiAgU2VydmVyLXNpZGUgWERSIGZvciBORlN2NAorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgS2VuZHJpY2sgU21pdGggPGttc21pdGhAdW1pY2guZWR1PgorICogIEFuZHkgQWRhbXNvbiAgIDxhbmRyb3NAdW1pY2guZWR1PgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRPRE86IE5laWwgQnJvd24gbWFkZSB0aGUgZm9sbG93aW5nIG9ic2VydmF0aW9uOiAgV2UgY3VycmVudGx5CisgKiBpbml0aWFsbHkgcmVzZXJ2ZSBORlNEX0JVRlNJWkUgc3BhY2Ugb24gdGhlIHRyYW5zbWl0IHF1ZXVlIGFuZAorICogbmV2ZXIgcmVsZWFzZSBhbnkgb2YgdGhhdCB1bnRpbCB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZS4KKyAqIEl0IHdvdWxkIGJlIGdvb2QgdG8gY2FsY3VsYXRlIGEgbmV3IG1heGltdW0gcmVzcG9uc2Ugc2l6ZSB3aGlsZQorICogZGVjb2RpbmcgdGhlIENPTVBPVU5ELCBhbmQgY2FsbCBzdmNfcmVzZXJ2ZSB3aXRoIHRoaXMgbnVtYmVyCisgKiBhdCB0aGUgZW5kIG9mIG5mczRzdmNfZGVjb2RlX2NvbXBvdW5kYXJncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMveGRyLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9zdGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QveGRyNC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2RfaWRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnM0Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzNF9hY2wuaD4KKworI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZCQlORlNEREJHX1hEUgorCitzdGF0aWMgaW50CitjaGVja19maWxlbmFtZShjaGFyICpzdHIsIGludCBsZW4sIGludCBlcnIpCit7CisJaW50IGk7CisKKwlpZiAobGVuID09IDApCisJCXJldHVybiBuZnNlcnJfaW52YWw7CisJaWYgKGlzZG90ZW50KHN0ciwgbGVuKSkKKwkJcmV0dXJuIGVycjsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWlmIChzdHJbaV0gPT0gJy8nKQorCQkJcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNUQVJUIE9GICJHRU5FUklDIiBERUNPREUgUk9VVElORVMuCisgKiAgIFRoZXNlIG1heSBsb29rIGEgbGl0dGxlIHVnbHkgc2luY2UgdGhleSBhcmUgaW1wb3J0ZWQgZnJvbSBhICJnZW5lcmljIgorICogc2V0IG9mIFhEUiBlbmNvZGUvZGVjb2RlIHJvdXRpbmVzIHdoaWNoIGFyZSBpbnRlbmRlZCB0byBiZSBzaGFyZWQgYnkKKyAqIGFsbCBvZiBvdXIgTkZTdjQgaW1wbGVtZW50YXRpb25zIChPcGVuQlNELCBNYWNPUyBYLi4uKS4KKyAqCisgKiBJZiB0aGUgcGFpbiBvZiByZWFkaW5nIHRoZXNlIGlzIHRvbyBncmVhdCwgaXQgc2hvdWxkIGJlIGEgc3RyYWlnaHRmb3J3YXJkCisgKiB0YXNrIHRvIHRyYW5zbGF0ZSB0aGVtIGludG8gTGludXgtc3BlY2lmaWMgdmVyc2lvbnMgd2hpY2ggYXJlIG1vcmUKKyAqIGNvbnNpc3RlbnQgd2l0aCB0aGUgc3R5bGUgdXNlZCBpbiBORlN2Mi92My4uLgorICovCisjZGVmaW5lIERFQ09ERV9IRUFECQkJCVwKKwl1MzIgKnA7CQkJCQlcCisJaW50IHN0YXR1cworI2RlZmluZSBERUNPREVfVEFJTAkJCQlcCisJc3RhdHVzID0gMDsJCQkJXAorb3V0OgkJCQkJCVwKKwlyZXR1cm4gc3RhdHVzOwkJCQlcCit4ZHJfZXJyb3I6CQkJCQlcCisJcHJpbnRrKEtFUk5fTk9USUNFICJ4ZHIgZXJyb3IhICglczolZClcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7CVwKKwlzdGF0dXMgPSBuZnNlcnJfYmFkX3hkcjsJCVwKKwlnb3RvIG91dAorCisjZGVmaW5lIFJFQUQzMih4KSAgICAgICAgICh4KSA9IG50b2hsKCpwKyspCisjZGVmaW5lIFJFQUQ2NCh4KSAgICAgICAgIGRvIHsJCQlcCisJKHgpID0gKHU2NCludG9obCgqcCsrKSA8PCAzMjsJCVwKKwkoeCkgfD0gbnRvaGwoKnArKyk7CQkJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgUkVBRFRJTUUoeCkgICAgICAgZG8gewkJCVwKKwlwKys7CQkJCQlcCisJKHgpID0gbnRvaGwoKnArKyk7CQkJXAorCXArKzsJCQkJCVwKK30gd2hpbGUgKDApCisjZGVmaW5lIFJFQURNRU0oeCxuYnl0ZXMpIGRvIHsJCQlcCisJeCA9IChjaGFyICopcDsJCQkJXAorCXAgKz0gWERSX1FVQURMRU4obmJ5dGVzKTsJCVwKK30gd2hpbGUgKDApCisjZGVmaW5lIFNBVkVNRU0oeCxuYnl0ZXMpIGRvIHsJCQlcCisJaWYgKCEoeCA9IChwPT1hcmdwLT50bXAgfHwgcCA9PSBhcmdwLT50bXBwKSA/IFwKKyAJCXNhdmVtZW0oYXJncCwgcCwgbmJ5dGVzKSA6CVwKKyAJCShjaGFyICopcCkpIHsJCQlcCisJCXByaW50ayhLRVJOX05PVElDRSAieGRyIGVycm9yISAoJXM6JWQpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCisJCWdvdG8geGRyX2Vycm9yOwkJCVwKKwkJfQkJCQlcCisJcCArPSBYRFJfUVVBRExFTihuYnl0ZXMpOwkJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgQ09QWU1FTSh4LG5ieXRlcykgZG8gewkJCVwKKwltZW1jcHkoKHgpLCBwLCBuYnl0ZXMpOwkJCVwKKwlwICs9IFhEUl9RVUFETEVOKG5ieXRlcyk7CQlcCit9IHdoaWxlICgwKQorCisvKiBSRUFEX0JVRiwgcmVhZF9idWYoKTogbmJ5dGVzIG11c3QgYmUgPD0gUEFHRV9TSVpFICovCisjZGVmaW5lIFJFQURfQlVGKG5ieXRlcykgIGRvIHsJCQlcCisJaWYgKG5ieXRlcyA8PSAodTMyKSgoY2hhciAqKWFyZ3AtPmVuZCAtIChjaGFyICopYXJncC0+cCkpIHsJXAorCQlwID0gYXJncC0+cDsJCQlcCisJCWFyZ3AtPnAgKz0gWERSX1FVQURMRU4obmJ5dGVzKTsJXAorCX0gZWxzZSBpZiAoIShwID0gcmVhZF9idWYoYXJncCwgbmJ5dGVzKSkpIHsgXAorCQlwcmludGsoS0VSTl9OT1RJQ0UgInhkciBlcnJvciEgKCVzOiVkKVxuIiwgX19GSUxFX18sIF9fTElORV9fKTsgXAorCQlnb3RvIHhkcl9lcnJvcjsJCQlcCisJfQkJCQkJXAorfSB3aGlsZSAoMCkKKwordTMyICpyZWFkX2J1ZihzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBpbnQgbmJ5dGVzKQoreworCS8qIFdlIHdhbnQgbW9yZSBieXRlcyB0aGFuIHNlZW0gdG8gYmUgYXZhaWxhYmxlLgorCSAqIE1heWJlIHdlIG5lZWQgYSBuZXcgcGFnZSwgbWF5YmUgd2UgaGF2ZSBqdXN0IHJ1biBvdXQKKwkgKi8KKwlpbnQgYXZhaWwgPSAoY2hhciopYXJncC0+ZW5kIC0gKGNoYXIqKWFyZ3AtPnA7CisJdTMyICpwOworCWlmIChhdmFpbCArIGFyZ3AtPnBhZ2VsZW4gPCBuYnl0ZXMpCisJCXJldHVybiBOVUxMOworCWlmIChhdmFpbCArIFBBR0VfU0laRSA8IG5ieXRlcykgLyogbmVlZCBtb3JlIHRoYW4gYSBwYWdlICEhICovCisJCXJldHVybiBOVUxMOworCS8qIG9rLCB3ZSBjYW4gZG8gaXQgd2l0aCB0aGUgY3VycmVudCBwbHVzIHRoZSBuZXh0IHBhZ2UgKi8KKwlpZiAobmJ5dGVzIDw9IHNpemVvZihhcmdwLT50bXApKQorCQlwID0gYXJncC0+dG1wOworCWVsc2UgeworCQlpZiAoYXJncC0+dG1wcCkKKwkJCWtmcmVlKGFyZ3AtPnRtcHApOworCQlwID0gYXJncC0+dG1wcCA9IGttYWxsb2MobmJ5dGVzLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwKQorCQkJcmV0dXJuIE5VTEw7CisJCQorCX0KKwltZW1jcHkocCwgYXJncC0+cCwgYXZhaWwpOworCS8qIHN0ZXAgdG8gbmV4dCBwYWdlICovCisJYXJncC0+cCA9IHBhZ2VfYWRkcmVzcyhhcmdwLT5wYWdlbGlzdFswXSk7CisJYXJncC0+cGFnZWxpc3QrKzsKKwlpZiAoYXJncC0+cGFnZWxlbiA8IFBBR0VfU0laRSkgeworCQlhcmdwLT5lbmQgPSBwICsgKGFyZ3AtPnBhZ2VsZW4+PjIpOworCQlhcmdwLT5wYWdlbGVuID0gMDsKKwl9IGVsc2UgeworCQlhcmdwLT5lbmQgPSBwICsgKFBBR0VfU0laRT4+Mik7CisJCWFyZ3AtPnBhZ2VsZW4gLT0gUEFHRV9TSVpFOworCX0KKwltZW1jcHkoKChjaGFyKilwKSthdmFpbCwgYXJncC0+cCwgKG5ieXRlcyAtIGF2YWlsKSk7CisJYXJncC0+cCArPSBYRFJfUVVBRExFTihuYnl0ZXMgLSBhdmFpbCk7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbnQKK2RlZmVyX2ZyZWUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwKKwkJdm9pZCAoKnJlbGVhc2UpKGNvbnN0IHZvaWQgKiksIHZvaWQgKnApCit7CisJc3RydWN0IHRtcGJ1ZiAqdGI7CisKKwl0YiA9IGttYWxsb2Moc2l6ZW9mKCp0YiksIEdGUF9LRVJORUwpOworCWlmICghdGIpCisJCXJldHVybiAtRU5PTUVNOworCXRiLT5idWYgPSBwOworCXRiLT5yZWxlYXNlID0gcmVsZWFzZTsKKwl0Yi0+bmV4dCA9IGFyZ3AtPnRvX2ZyZWU7CisJYXJncC0+dG9fZnJlZSA9IHRiOworCXJldHVybiAwOworfQorCitjaGFyICpzYXZlbWVtKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHUzMiAqcCwgaW50IG5ieXRlcykKK3sKKwl2b2lkICpuZXcgPSBOVUxMOworCWlmIChwID09IGFyZ3AtPnRtcCkgeworCQluZXcgPSBrbWFsbG9jKG5ieXRlcywgR0ZQX0tFUk5FTCk7CisJCWlmICghbmV3KSByZXR1cm4gTlVMTDsKKwkJcCA9IG5ldzsKKwkJbWVtY3B5KHAsIGFyZ3AtPnRtcCwgbmJ5dGVzKTsKKwl9IGVsc2UgeworCQlpZiAocCAhPSBhcmdwLT50bXBwKQorCQkJQlVHKCk7CisJCWFyZ3AtPnRtcHAgPSBOVUxMOworCX0KKwlpZiAoZGVmZXJfZnJlZShhcmdwLCBrZnJlZSwgcCkpIHsKKwkJa2ZyZWUobmV3KTsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlCisJCXJldHVybiAoY2hhciAqKXA7Cit9CisKKworc3RhdGljIGludAorbmZzZDRfZGVjb2RlX2JpdG1hcChzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCB1MzIgKmJtdmFsKQoreworCXUzMiBibWxlbjsKKwlERUNPREVfSEVBRDsKKworCWJtdmFsWzBdID0gMDsKKwlibXZhbFsxXSA9IDA7CisKKwlSRUFEX0JVRig0KTsKKwlSRUFEMzIoYm1sZW4pOworCWlmIChibWxlbiA+IDEwMDApCisJCWdvdG8geGRyX2Vycm9yOworCisJUkVBRF9CVUYoYm1sZW4gPDwgMik7CisJaWYgKGJtbGVuID4gMCkKKwkJUkVBRDMyKGJtdmFsWzBdKTsKKwlpZiAoYm1sZW4gPiAxKQorCQlSRUFEMzIoYm12YWxbMV0pOworCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2RlY29kZV9mYXR0cihzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCB1MzIgKmJtdmFsLCBzdHJ1Y3QgaWF0dHIgKmlhdHRyLAorICAgIHN0cnVjdCBuZnM0X2FjbCAqKmFjbCkKK3sKKwlpbnQgZXhwZWN0ZWRfbGVuLCBsZW4gPSAwOworCXUzMiBkdW1teTMyOworCWNoYXIgKmJ1ZjsKKworCURFQ09ERV9IRUFEOworCWlhdHRyLT5pYV92YWxpZCA9IDA7CisJaWYgKChzdGF0dXMgPSBuZnNkNF9kZWNvZGVfYml0bWFwKGFyZ3AsIGJtdmFsKSkpCisJCXJldHVybiBzdGF0dXM7CisKKwkvKgorCSAqIEFjY29yZGluZyB0byBzcGVjLCB1bnN1cHBvcnRlZCBhdHRyaWJ1dGVzIHJldHVybiBFUlJfTk9UU1VQUDsKKwkgKiByZWFkLW9ubHkgYXR0cmlidXRlcyByZXR1cm4gRVJSX0lOVkFMLgorCSAqLworCWlmICgoYm12YWxbMF0gJiB+TkZTRF9TVVBQT1JURURfQVRUUlNfV09SRDApIHx8IChibXZhbFsxXSAmIH5ORlNEX1NVUFBPUlRFRF9BVFRSU19XT1JEMSkpCisJCXJldHVybiBuZnNlcnJfYXR0cm5vdHN1cHA7CisJaWYgKChibXZhbFswXSAmIH5ORlNEX1dSSVRFQUJMRV9BVFRSU19XT1JEMCkgfHwgKGJtdmFsWzFdICYgfk5GU0RfV1JJVEVBQkxFX0FUVFJTX1dPUkQxKSkKKwkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKKworCVJFQURfQlVGKDQpOworCVJFQUQzMihleHBlY3RlZF9sZW4pOworCisJaWYgKGJtdmFsWzBdICYgRkFUVFI0X1dPUkQwX1NJWkUpIHsKKwkJUkVBRF9CVUYoOCk7CisJCWxlbiArPSA4OworCQlSRUFENjQoaWF0dHItPmlhX3NpemUpOworCQlpYXR0ci0+aWFfdmFsaWQgfD0gQVRUUl9TSVpFOworCX0KKwlpZiAoYm12YWxbMF0gJiBGQVRUUjRfV09SRDBfQUNMKSB7CisJCWludCBuYWNlLCBpOworCQlzdHJ1Y3QgbmZzNF9hY2UgYWNlOworCisJCVJFQURfQlVGKDQpOyBsZW4gKz0gNDsKKwkJUkVBRDMyKG5hY2UpOworCisJCSphY2wgPSBuZnM0X2FjbF9uZXcoKTsKKwkJaWYgKCphY2wgPT0gTlVMTCkgeworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X25mc2VycjsKKwkJfQorCQlkZWZlcl9mcmVlKGFyZ3AsICh2b2lkICgqKShjb25zdCB2b2lkICopKW5mczRfYWNsX2ZyZWUsICphY2wpOworCisJCWZvciAoaSA9IDA7IGkgPCBuYWNlOyBpKyspIHsKKwkJCVJFQURfQlVGKDE2KTsgbGVuICs9IDE2OworCQkJUkVBRDMyKGFjZS50eXBlKTsKKwkJCVJFQUQzMihhY2UuZmxhZyk7CisJCQlSRUFEMzIoYWNlLmFjY2Vzc19tYXNrKTsKKwkJCVJFQUQzMihkdW1teTMyKTsKKwkJCVJFQURfQlVGKGR1bW15MzIpOworCQkJbGVuICs9IFhEUl9RVUFETEVOKGR1bW15MzIpIDw8IDI7CisJCQlSRUFETUVNKGJ1ZiwgZHVtbXkzMik7CisJCQlhY2Uud2hvdHlwZSA9IG5mczRfYWNsX2dldF93aG90eXBlKGJ1ZiwgZHVtbXkzMik7CisJCQlzdGF0dXMgPSAwOworCQkJaWYgKGFjZS53aG90eXBlICE9IE5GUzRfQUNMX1dIT19OQU1FRCkKKwkJCQlhY2Uud2hvID0gMDsKKwkJCWVsc2UgaWYgKGFjZS5mbGFnICYgTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCkKKwkJCQlzdGF0dXMgPSBuZnNkX21hcF9uYW1lX3RvX2dpZChhcmdwLT5ycXN0cCwKKwkJCQkJCWJ1ZiwgZHVtbXkzMiwgJmFjZS53aG8pOworCQkJZWxzZQorCQkJCXN0YXR1cyA9IG5mc2RfbWFwX25hbWVfdG9fdWlkKGFyZ3AtPnJxc3RwLAorCQkJCQkJYnVmLCBkdW1teTMyLCAmYWNlLndobyk7CisJCQlpZiAoc3RhdHVzKQorCQkJCWdvdG8gb3V0X25mc2VycjsKKwkJCWlmIChuZnM0X2FjbF9hZGRfYWNlKCphY2wsIGFjZS50eXBlLCBhY2UuZmxhZywKKwkJCQkgYWNlLmFjY2Vzc19tYXNrLCBhY2Uud2hvdHlwZSwgYWNlLndobykgIT0gMCkgeworCQkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQkJZ290byBvdXRfbmZzZXJyOworCQkJfQorCQl9CisJfSBlbHNlCisJCSphY2wgPSBOVUxMOworCWlmIChibXZhbFsxXSAmIEZBVFRSNF9XT1JEMV9NT0RFKSB7CisJCVJFQURfQlVGKDQpOworCQlsZW4gKz0gNDsKKwkJUkVBRDMyKGlhdHRyLT5pYV9tb2RlKTsKKwkJaWF0dHItPmlhX21vZGUgJj0gKFNfSUZNVCB8IFNfSUFMTFVHTyk7CisJCWlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX01PREU7CisJfQorCWlmIChibXZhbFsxXSAmIEZBVFRSNF9XT1JEMV9PV05FUikgeworCQlSRUFEX0JVRig0KTsKKwkJbGVuICs9IDQ7CisJCVJFQUQzMihkdW1teTMyKTsKKwkJUkVBRF9CVUYoZHVtbXkzMik7CisJCWxlbiArPSAoWERSX1FVQURMRU4oZHVtbXkzMikgPDwgMik7CisJCVJFQURNRU0oYnVmLCBkdW1teTMyKTsKKwkJaWYgKChzdGF0dXMgPSBuZnNkX21hcF9uYW1lX3RvX3VpZChhcmdwLT5ycXN0cCwgYnVmLCBkdW1teTMyLCAmaWF0dHItPmlhX3VpZCkpKQorCQkJZ290byBvdXRfbmZzZXJyOworCQlpYXR0ci0+aWFfdmFsaWQgfD0gQVRUUl9VSUQ7CisJfQorCWlmIChibXZhbFsxXSAmIEZBVFRSNF9XT1JEMV9PV05FUl9HUk9VUCkgeworCQlSRUFEX0JVRig0KTsKKwkJbGVuICs9IDQ7CisJCVJFQUQzMihkdW1teTMyKTsKKwkJUkVBRF9CVUYoZHVtbXkzMik7CisJCWxlbiArPSAoWERSX1FVQURMRU4oZHVtbXkzMikgPDwgMik7CisJCVJFQURNRU0oYnVmLCBkdW1teTMyKTsKKwkJaWYgKChzdGF0dXMgPSBuZnNkX21hcF9uYW1lX3RvX2dpZChhcmdwLT5ycXN0cCwgYnVmLCBkdW1teTMyLCAmaWF0dHItPmlhX2dpZCkpKQorCQkJZ290byBvdXRfbmZzZXJyOworCQlpYXR0ci0+aWFfdmFsaWQgfD0gQVRUUl9HSUQ7CisJfQorCWlmIChibXZhbFsxXSAmIEZBVFRSNF9XT1JEMV9USU1FX0FDQ0VTU19TRVQpIHsKKwkJUkVBRF9CVUYoNCk7CisJCWxlbiArPSA0OworCQlSRUFEMzIoZHVtbXkzMik7CisJCXN3aXRjaCAoZHVtbXkzMikgeworCQljYXNlIE5GUzRfU0VUX1RPX0NMSUVOVF9USU1FOgorCQkJLyogV2UgcmVxdWlyZSB0aGUgaGlnaCAzMiBiaXRzIG9mICdzZWNvbmRzJyB0byBiZSAwLCBhbmQgd2UgaWdub3JlCisJCQkgICBhbGwgMzIgYml0cyBvZiAnbnNlY29uZHMnLiAqLworCQkJUkVBRF9CVUYoMTIpOworCQkJbGVuICs9IDEyOworCQkJUkVBRDMyKGR1bW15MzIpOworCQkJaWYgKGR1bW15MzIpCisJCQkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKKwkJCVJFQUQzMihpYXR0ci0+aWFfYXRpbWUudHZfc2VjKTsKKwkJCVJFQUQzMihpYXR0ci0+aWFfYXRpbWUudHZfbnNlYyk7CisJCQlpZiAoaWF0dHItPmlhX2F0aW1lLnR2X25zZWMgPj0gKHUzMikxMDAwMDAwMDAwKQorCQkJCXJldHVybiBuZnNlcnJfaW52YWw7CisJCQlpYXR0ci0+aWFfdmFsaWQgfD0gKEFUVFJfQVRJTUUgfCBBVFRSX0FUSU1FX1NFVCk7CisJCQlicmVhazsKKwkJY2FzZSBORlM0X1NFVF9UT19TRVJWRVJfVElNRToKKwkJCWlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX0FUSU1FOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIHhkcl9lcnJvcjsKKwkJfQorCX0KKwlpZiAoYm12YWxbMV0gJiBGQVRUUjRfV09SRDFfVElNRV9NRVRBREFUQSkgeworCQkvKiBXZSByZXF1aXJlIHRoZSBoaWdoIDMyIGJpdHMgb2YgJ3NlY29uZHMnIHRvIGJlIDAsIGFuZCB3ZSBpZ25vcmUKKwkJICAgYWxsIDMyIGJpdHMgb2YgJ25zZWNvbmRzJy4gKi8KKwkJUkVBRF9CVUYoMTIpOworCQlsZW4gKz0gMTI7CisJCVJFQUQzMihkdW1teTMyKTsKKwkJaWYgKGR1bW15MzIpCisJCQlyZXR1cm4gbmZzZXJyX2ludmFsOworCQlSRUFEMzIoaWF0dHItPmlhX2N0aW1lLnR2X3NlYyk7CisJCVJFQUQzMihpYXR0ci0+aWFfY3RpbWUudHZfbnNlYyk7CisJCWlmIChpYXR0ci0+aWFfY3RpbWUudHZfbnNlYyA+PSAodTMyKTEwMDAwMDAwMDApCisJCQlyZXR1cm4gbmZzZXJyX2ludmFsOworCQlpYXR0ci0+aWFfdmFsaWQgfD0gQVRUUl9DVElNRTsKKwl9CisJaWYgKGJtdmFsWzFdICYgRkFUVFI0X1dPUkQxX1RJTUVfTU9ESUZZX1NFVCkgeworCQlSRUFEX0JVRig0KTsKKwkJbGVuICs9IDQ7CisJCVJFQUQzMihkdW1teTMyKTsKKwkJc3dpdGNoIChkdW1teTMyKSB7CisJCWNhc2UgTkZTNF9TRVRfVE9fQ0xJRU5UX1RJTUU6CisJCQkvKiBXZSByZXF1aXJlIHRoZSBoaWdoIDMyIGJpdHMgb2YgJ3NlY29uZHMnIHRvIGJlIDAsIGFuZCB3ZSBpZ25vcmUKKwkJCSAgIGFsbCAzMiBiaXRzIG9mICduc2Vjb25kcycuICovCisJCQlSRUFEX0JVRigxMik7CisJCQlsZW4gKz0gMTI7CisJCQlSRUFEMzIoZHVtbXkzMik7CisJCQlpZiAoZHVtbXkzMikKKwkJCQlyZXR1cm4gbmZzZXJyX2ludmFsOworCQkJUkVBRDMyKGlhdHRyLT5pYV9tdGltZS50dl9zZWMpOworCQkJUkVBRDMyKGlhdHRyLT5pYV9tdGltZS50dl9uc2VjKTsKKwkJCWlmIChpYXR0ci0+aWFfbXRpbWUudHZfbnNlYyA+PSAodTMyKTEwMDAwMDAwMDApCisJCQkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKKwkJCWlhdHRyLT5pYV92YWxpZCB8PSAoQVRUUl9NVElNRSB8IEFUVFJfTVRJTUVfU0VUKTsKKwkJCWJyZWFrOworCQljYXNlIE5GUzRfU0VUX1RPX1NFUlZFUl9USU1FOgorCQkJaWF0dHItPmlhX3ZhbGlkIHw9IEFUVFJfTVRJTUU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8geGRyX2Vycm9yOworCQl9CisJfQorCWlmIChsZW4gIT0gZXhwZWN0ZWRfbGVuKQorCQlnb3RvIHhkcl9lcnJvcjsKKworCURFQ09ERV9UQUlMOworCitvdXRfbmZzZXJyOgorCXN0YXR1cyA9IG5mc2Vycm5vKHN0YXR1cyk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2RlY29kZV9hY2Nlc3Moc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X2FjY2VzcyAqYWNjZXNzKQoreworCURFQ09ERV9IRUFEOworCisJUkVBRF9CVUYoNCk7CisJUkVBRDMyKGFjY2Vzcy0+YWNfcmVxX2FjY2Vzcyk7CisKKwlERUNPREVfVEFJTDsKK30KKworc3RhdGljIGludAorbmZzZDRfZGVjb2RlX2Nsb3NlKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9jbG9zZSAqY2xvc2UpCit7CisJREVDT0RFX0hFQUQ7CisKKwljbG9zZS0+Y2xfc3RhdGVvd25lciA9IE5VTEw7CisJUkVBRF9CVUYoNCArIHNpemVvZihzdGF0ZWlkX3QpKTsKKwlSRUFEMzIoY2xvc2UtPmNsX3NlcWlkKTsKKwlSRUFEMzIoY2xvc2UtPmNsX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7CisJQ09QWU1FTSgmY2xvc2UtPmNsX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCisJREVDT0RFX1RBSUw7Cit9CisKKworc3RhdGljIGludAorbmZzZDRfZGVjb2RlX2NvbW1pdChzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfY29tbWl0ICpjb21taXQpCit7CisJREVDT0RFX0hFQUQ7CisKKwlSRUFEX0JVRigxMik7CisJUkVBRDY0KGNvbW1pdC0+Y29fb2Zmc2V0KTsKKwlSRUFEMzIoY29tbWl0LT5jb19jb3VudCk7CisKKwlERUNPREVfVEFJTDsKK30KKworc3RhdGljIGludAorbmZzZDRfZGVjb2RlX2NyZWF0ZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfY3JlYXRlICpjcmVhdGUpCit7CisJREVDT0RFX0hFQUQ7CisKKwlSRUFEX0JVRig0KTsKKwlSRUFEMzIoY3JlYXRlLT5jcl90eXBlKTsKKwlzd2l0Y2ggKGNyZWF0ZS0+Y3JfdHlwZSkgeworCWNhc2UgTkY0TE5LOgorCQlSRUFEX0JVRig0KTsKKwkJUkVBRDMyKGNyZWF0ZS0+Y3JfbGlua2xlbik7CisJCVJFQURfQlVGKGNyZWF0ZS0+Y3JfbGlua2xlbik7CisJCVNBVkVNRU0oY3JlYXRlLT5jcl9saW5rbmFtZSwgY3JlYXRlLT5jcl9saW5rbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBORjRCTEs6CisJY2FzZSBORjRDSFI6CisJCVJFQURfQlVGKDgpOworCQlSRUFEMzIoY3JlYXRlLT5jcl9zcGVjZGF0YTEpOworCQlSRUFEMzIoY3JlYXRlLT5jcl9zcGVjZGF0YTIpOworCQlicmVhazsKKwljYXNlIE5GNFNPQ0s6CisJY2FzZSBORjRGSUZPOgorCWNhc2UgTkY0RElSOgorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCVJFQURfQlVGKDQpOworCVJFQUQzMihjcmVhdGUtPmNyX25hbWVsZW4pOworCVJFQURfQlVGKGNyZWF0ZS0+Y3JfbmFtZWxlbik7CisJU0FWRU1FTShjcmVhdGUtPmNyX25hbWUsIGNyZWF0ZS0+Y3JfbmFtZWxlbik7CisJaWYgKChzdGF0dXMgPSBjaGVja19maWxlbmFtZShjcmVhdGUtPmNyX25hbWUsIGNyZWF0ZS0+Y3JfbmFtZWxlbiwgbmZzZXJyX2ludmFsKSkpCisJCXJldHVybiBzdGF0dXM7CisKKwlpZiAoKHN0YXR1cyA9IG5mc2Q0X2RlY29kZV9mYXR0cihhcmdwLCBjcmVhdGUtPmNyX2JtdmFsLCAmY3JlYXRlLT5jcl9pYXR0ciwgJmNyZWF0ZS0+Y3JfYWNsKSkpCisJCWdvdG8gb3V0OworCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF9kZWNvZGVfZGVsZWdyZXR1cm4oc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X2RlbGVncmV0dXJuICpkcikKK3sKKwlERUNPREVfSEVBRDsKKworCVJFQURfQlVGKHNpemVvZihzdGF0ZWlkX3QpKTsKKwlSRUFEMzIoZHItPmRyX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7CisJQ09QWU1FTSgmZHItPmRyX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF9kZWNvZGVfZ2V0YXR0cihzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfZ2V0YXR0ciAqZ2V0YXR0cikKK3sKKwlyZXR1cm4gbmZzZDRfZGVjb2RlX2JpdG1hcChhcmdwLCBnZXRhdHRyLT5nYV9ibXZhbCk7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2RlY29kZV9saW5rKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9saW5rICpsaW5rKQoreworCURFQ09ERV9IRUFEOworCisJUkVBRF9CVUYoNCk7CisJUkVBRDMyKGxpbmstPmxpX25hbWVsZW4pOworCVJFQURfQlVGKGxpbmstPmxpX25hbWVsZW4pOworCVNBVkVNRU0obGluay0+bGlfbmFtZSwgbGluay0+bGlfbmFtZWxlbik7CisJaWYgKChzdGF0dXMgPSBjaGVja19maWxlbmFtZShsaW5rLT5saV9uYW1lLCBsaW5rLT5saV9uYW1lbGVuLCBuZnNlcnJfaW52YWwpKSkKKwkJcmV0dXJuIHN0YXR1czsKKworCURFQ09ERV9UQUlMOworfQorCitzdGF0aWMgaW50CituZnNkNF9kZWNvZGVfbG9jayhzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfbG9jayAqbG9jaykKK3sKKwlERUNPREVfSEVBRDsKKworCWxvY2stPmxrX3N0YXRlb3duZXIgPSBOVUxMOworCS8qCisJKiB0eXBlLCByZWNsYWltKGJvb2xlYW4pLCBvZmZzZXQsIGxlbmd0aCwgbmV3X2xvY2tfb3duZXIoYm9vbGVhbikKKwkqLworCVJFQURfQlVGKDI4KTsKKwlSRUFEMzIobG9jay0+bGtfdHlwZSk7CisJaWYgKChsb2NrLT5sa190eXBlIDwgTkZTNF9SRUFEX0xUKSB8fCAobG9jay0+bGtfdHlwZSA+IE5GUzRfV1JJVEVXX0xUKSkKKwkJZ290byB4ZHJfZXJyb3I7CisJUkVBRDMyKGxvY2stPmxrX3JlY2xhaW0pOworCVJFQUQ2NChsb2NrLT5sa19vZmZzZXQpOworCVJFQUQ2NChsb2NrLT5sa19sZW5ndGgpOworCVJFQUQzMihsb2NrLT5sa19pc19uZXcpOworCisJaWYgKGxvY2stPmxrX2lzX25ldykgeworCQlSRUFEX0JVRigzNik7CisJCVJFQUQzMihsb2NrLT5sa19uZXdfb3Blbl9zZXFpZCk7CisJCVJFQUQzMihsb2NrLT5sa19uZXdfb3Blbl9zdGF0ZWlkLnNpX2dlbmVyYXRpb24pOworCisJCUNPUFlNRU0oJmxvY2stPmxrX25ld19vcGVuX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCQlSRUFEMzIobG9jay0+bGtfbmV3X2xvY2tfc2VxaWQpOworCQlDT1BZTUVNKCZsb2NrLT5sa19uZXdfY2xpZW50aWQsIHNpemVvZihjbGllbnRpZF90KSk7CisJCVJFQUQzMihsb2NrLT5sa19uZXdfb3duZXIubGVuKTsKKwkJUkVBRF9CVUYobG9jay0+bGtfbmV3X293bmVyLmxlbik7CisJCVJFQURNRU0obG9jay0+bGtfbmV3X293bmVyLmRhdGEsIGxvY2stPmxrX25ld19vd25lci5sZW4pOworCX0gZWxzZSB7CisJCVJFQURfQlVGKDIwKTsKKwkJUkVBRDMyKGxvY2stPmxrX29sZF9sb2NrX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7CisJCUNPUFlNRU0oJmxvY2stPmxrX29sZF9sb2NrX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCQlSRUFEMzIobG9jay0+bGtfb2xkX2xvY2tfc2VxaWQpOworCX0KKworCURFQ09ERV9UQUlMOworfQorCitzdGF0aWMgaW50CituZnNkNF9kZWNvZGVfbG9ja3Qoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X2xvY2t0ICpsb2NrdCkKK3sKKwlERUNPREVfSEVBRDsKKwkJICAgICAgICAKKwlSRUFEX0JVRigzMik7CisJUkVBRDMyKGxvY2t0LT5sdF90eXBlKTsKKwlpZigobG9ja3QtPmx0X3R5cGUgPCBORlM0X1JFQURfTFQpIHx8IChsb2NrdC0+bHRfdHlwZSA+IE5GUzRfV1JJVEVXX0xUKSkKKwkJZ290byB4ZHJfZXJyb3I7CisJUkVBRDY0KGxvY2t0LT5sdF9vZmZzZXQpOworCVJFQUQ2NChsb2NrdC0+bHRfbGVuZ3RoKTsKKwlDT1BZTUVNKCZsb2NrdC0+bHRfY2xpZW50aWQsIDgpOworCVJFQUQzMihsb2NrdC0+bHRfb3duZXIubGVuKTsKKwlSRUFEX0JVRihsb2NrdC0+bHRfb3duZXIubGVuKTsKKwlSRUFETUVNKGxvY2t0LT5sdF9vd25lci5kYXRhLCBsb2NrdC0+bHRfb3duZXIubGVuKTsKKworCURFQ09ERV9UQUlMOworfQorCitzdGF0aWMgaW50CituZnNkNF9kZWNvZGVfbG9ja3Uoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X2xvY2t1ICpsb2NrdSkKK3sKKwlERUNPREVfSEVBRDsKKworCWxvY2t1LT5sdV9zdGF0ZW93bmVyID0gTlVMTDsKKwlSRUFEX0JVRigyNCArIHNpemVvZihzdGF0ZWlkX3QpKTsKKwlSRUFEMzIobG9ja3UtPmx1X3R5cGUpOworCWlmICgobG9ja3UtPmx1X3R5cGUgPCBORlM0X1JFQURfTFQpIHx8IChsb2NrdS0+bHVfdHlwZSA+IE5GUzRfV1JJVEVXX0xUKSkKKwkJZ290byB4ZHJfZXJyb3I7CisJUkVBRDMyKGxvY2t1LT5sdV9zZXFpZCk7CisJUkVBRDMyKGxvY2t1LT5sdV9zdGF0ZWlkLnNpX2dlbmVyYXRpb24pOworCUNPUFlNRU0oJmxvY2t1LT5sdV9zdGF0ZWlkLnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKKwlSRUFENjQobG9ja3UtPmx1X29mZnNldCk7CisJUkVBRDY0KGxvY2t1LT5sdV9sZW5ndGgpOworCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2RlY29kZV9sb29rdXAoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X2xvb2t1cCAqbG9va3VwKQoreworCURFQ09ERV9IRUFEOworCisJUkVBRF9CVUYoNCk7CisJUkVBRDMyKGxvb2t1cC0+bG9fbGVuKTsKKwlSRUFEX0JVRihsb29rdXAtPmxvX2xlbik7CisJU0FWRU1FTShsb29rdXAtPmxvX25hbWUsIGxvb2t1cC0+bG9fbGVuKTsKKwlpZiAoKHN0YXR1cyA9IGNoZWNrX2ZpbGVuYW1lKGxvb2t1cC0+bG9fbmFtZSwgbG9va3VwLT5sb19sZW4sIG5mc2Vycl9ub2VudCkpKQorCQlyZXR1cm4gc3RhdHVzOworCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2RlY29kZV9vcGVuKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKQoreworCURFQ09ERV9IRUFEOworCisJbWVtc2V0KG9wZW4tPm9wX2JtdmFsLCAwLCBzaXplb2Yob3Blbi0+b3BfYm12YWwpKTsKKwlvcGVuLT5vcF9pYXR0ci5pYV92YWxpZCA9IDA7CisJb3Blbi0+b3Bfc3RhdGVvd25lciA9IE5VTEw7CisKKwkvKiBzZXFpZCwgc2hhcmVfYWNjZXNzLCBzaGFyZV9kZW55LCBjbGllbnRpZCwgb3duZXJsZW4gKi8KKwlSRUFEX0JVRigxNiArIHNpemVvZihjbGllbnRpZF90KSk7CisJUkVBRDMyKG9wZW4tPm9wX3NlcWlkKTsKKwlSRUFEMzIob3Blbi0+b3Bfc2hhcmVfYWNjZXNzKTsKKwlSRUFEMzIob3Blbi0+b3Bfc2hhcmVfZGVueSk7CisJQ09QWU1FTSgmb3Blbi0+b3BfY2xpZW50aWQsIHNpemVvZihjbGllbnRpZF90KSk7CisJUkVBRDMyKG9wZW4tPm9wX293bmVyLmxlbik7CisKKwkvKiBvd25lciwgb3Blbl9mbGFnICovCisJUkVBRF9CVUYob3Blbi0+b3Bfb3duZXIubGVuICsgNCk7CisJU0FWRU1FTShvcGVuLT5vcF9vd25lci5kYXRhLCBvcGVuLT5vcF9vd25lci5sZW4pOworCVJFQUQzMihvcGVuLT5vcF9jcmVhdGUpOworCXN3aXRjaCAob3Blbi0+b3BfY3JlYXRlKSB7CisJY2FzZSBORlM0X09QRU5fTk9DUkVBVEU6CisJCWJyZWFrOworCWNhc2UgTkZTNF9PUEVOX0NSRUFURToKKwkJUkVBRF9CVUYoNCk7CisJCVJFQUQzMihvcGVuLT5vcF9jcmVhdGVtb2RlKTsKKwkJc3dpdGNoIChvcGVuLT5vcF9jcmVhdGVtb2RlKSB7CisJCWNhc2UgTkZTNF9DUkVBVEVfVU5DSEVDS0VEOgorCQljYXNlIE5GUzRfQ1JFQVRFX0dVQVJERUQ6CisJCQlpZiAoKHN0YXR1cyA9IG5mc2Q0X2RlY29kZV9mYXR0cihhcmdwLCBvcGVuLT5vcF9ibXZhbCwgJm9wZW4tPm9wX2lhdHRyLCAmb3Blbi0+b3BfYWNsKSkpCisJCQkJZ290byBvdXQ7CisJCQlicmVhazsKKwkJY2FzZSBORlM0X0NSRUFURV9FWENMVVNJVkU6CisJCQlSRUFEX0JVRig4KTsKKwkJCUNPUFlNRU0ob3Blbi0+b3BfdmVyZi5kYXRhLCA4KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byB4ZHJfZXJyb3I7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byB4ZHJfZXJyb3I7CisJfQorCisJLyogb3Blbl9jbGFpbSAqLworCVJFQURfQlVGKDQpOworCVJFQUQzMihvcGVuLT5vcF9jbGFpbV90eXBlKTsKKwlzd2l0Y2ggKG9wZW4tPm9wX2NsYWltX3R5cGUpIHsKKwljYXNlIE5GUzRfT1BFTl9DTEFJTV9OVUxMOgorCWNhc2UgTkZTNF9PUEVOX0NMQUlNX0RFTEVHQVRFX1BSRVY6CisJCVJFQURfQlVGKDQpOworCQlSRUFEMzIob3Blbi0+b3BfZm5hbWUubGVuKTsKKwkJUkVBRF9CVUYob3Blbi0+b3BfZm5hbWUubGVuKTsKKwkJU0FWRU1FTShvcGVuLT5vcF9mbmFtZS5kYXRhLCBvcGVuLT5vcF9mbmFtZS5sZW4pOworCQlpZiAoKHN0YXR1cyA9IGNoZWNrX2ZpbGVuYW1lKG9wZW4tPm9wX2ZuYW1lLmRhdGEsIG9wZW4tPm9wX2ZuYW1lLmxlbiwgbmZzZXJyX2ludmFsKSkpCisJCQlyZXR1cm4gc3RhdHVzOworCQlicmVhazsKKwljYXNlIE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUzoKKwkJUkVBRF9CVUYoNCk7CisJCVJFQUQzMihvcGVuLT5vcF9kZWxlZ2F0ZV90eXBlKTsKKwkJYnJlYWs7CisJY2FzZSBORlM0X09QRU5fQ0xBSU1fREVMRUdBVEVfQ1VSOgorCQlSRUFEX0JVRihzaXplb2Yoc3RhdGVpZF90KSArIDQpOworCQlDT1BZTUVNKCZvcGVuLT5vcF9kZWxlZ2F0ZV9zdGF0ZWlkLCBzaXplb2Yoc3RhdGVpZF90KSk7CisJCVJFQUQzMihvcGVuLT5vcF9mbmFtZS5sZW4pOworCQlSRUFEX0JVRihvcGVuLT5vcF9mbmFtZS5sZW4pOworCQlTQVZFTUVNKG9wZW4tPm9wX2ZuYW1lLmRhdGEsIG9wZW4tPm9wX2ZuYW1lLmxlbik7CisJCWlmICgoc3RhdHVzID0gY2hlY2tfZmlsZW5hbWUob3Blbi0+b3BfZm5hbWUuZGF0YSwgb3Blbi0+b3BfZm5hbWUubGVuLCBuZnNlcnJfaW52YWwpKSkKKwkJCXJldHVybiBzdGF0dXM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8geGRyX2Vycm9yOworCX0KKworCURFQ09ERV9UQUlMOworfQorCitzdGF0aWMgaW50CituZnNkNF9kZWNvZGVfb3Blbl9jb25maXJtKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9vcGVuX2NvbmZpcm0gKm9wZW5fY29uZikKK3sKKwlERUNPREVfSEVBRDsKKwkJICAgIAorCW9wZW5fY29uZi0+b2Nfc3RhdGVvd25lciA9IE5VTEw7CisJUkVBRF9CVUYoNCArIHNpemVvZihzdGF0ZWlkX3QpKTsKKwlSRUFEMzIob3Blbl9jb25mLT5vY19yZXFfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKKwlDT1BZTUVNKCZvcGVuX2NvbmYtPm9jX3JlcV9zdGF0ZWlkLnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKKwlSRUFEMzIob3Blbl9jb25mLT5vY19zZXFpZCk7CisJCQkJCQkgICAgICAgIAorCURFQ09ERV9UQUlMOworfQorCitzdGF0aWMgaW50CituZnNkNF9kZWNvZGVfb3Blbl9kb3duZ3JhZGUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X29wZW5fZG93bmdyYWRlICpvcGVuX2Rvd24pCit7CisJREVDT0RFX0hFQUQ7CisJCSAgICAKKwlvcGVuX2Rvd24tPm9kX3N0YXRlb3duZXIgPSBOVUxMOworCVJFQURfQlVGKDEyICsgc2l6ZW9mKHN0YXRlaWRfdCkpOworCVJFQUQzMihvcGVuX2Rvd24tPm9kX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7CisJQ09QWU1FTSgmb3Blbl9kb3duLT5vZF9zdGF0ZWlkLnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKKwlSRUFEMzIob3Blbl9kb3duLT5vZF9zZXFpZCk7CisJUkVBRDMyKG9wZW5fZG93bi0+b2Rfc2hhcmVfYWNjZXNzKTsKKwlSRUFEMzIob3Blbl9kb3duLT5vZF9zaGFyZV9kZW55KTsKKwkJCQkJCSAgICAgICAgCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2RlY29kZV9wdXRmaChzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfcHV0ZmggKnB1dGZoKQoreworCURFQ09ERV9IRUFEOworCisJUkVBRF9CVUYoNCk7CisJUkVBRDMyKHB1dGZoLT5wZl9maGxlbik7CisJaWYgKHB1dGZoLT5wZl9maGxlbiA+IE5GUzRfRkhTSVpFKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlSRUFEX0JVRihwdXRmaC0+cGZfZmhsZW4pOworCVNBVkVNRU0ocHV0ZmgtPnBmX2ZodmFsLCBwdXRmaC0+cGZfZmhsZW4pOworCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2RlY29kZV9yZWFkKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9yZWFkICpyZWFkKQoreworCURFQ09ERV9IRUFEOworCisJUkVBRF9CVUYoc2l6ZW9mKHN0YXRlaWRfdCkgKyAxMik7CisJUkVBRDMyKHJlYWQtPnJkX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7CisJQ09QWU1FTSgmcmVhZC0+cmRfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisJUkVBRDY0KHJlYWQtPnJkX29mZnNldCk7CisJUkVBRDMyKHJlYWQtPnJkX2xlbmd0aCk7CisKKwlERUNPREVfVEFJTDsKK30KKworc3RhdGljIGludAorbmZzZDRfZGVjb2RlX3JlYWRkaXIoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X3JlYWRkaXIgKnJlYWRkaXIpCit7CisJREVDT0RFX0hFQUQ7CisKKwlSRUFEX0JVRigyNCk7CisJUkVBRDY0KHJlYWRkaXItPnJkX2Nvb2tpZSk7CisJQ09QWU1FTShyZWFkZGlyLT5yZF92ZXJmLmRhdGEsIHNpemVvZihyZWFkZGlyLT5yZF92ZXJmLmRhdGEpKTsKKwlSRUFEMzIocmVhZGRpci0+cmRfZGlyY291bnQpOyAgICAvKiBqdXN0IGluIGNhc2UgeW91IG5lZWRlZCBhIHVzZWxlc3MgZmllbGQuLi4gKi8KKwlSRUFEMzIocmVhZGRpci0+cmRfbWF4Y291bnQpOworCWlmICgoc3RhdHVzID0gbmZzZDRfZGVjb2RlX2JpdG1hcChhcmdwLCByZWFkZGlyLT5yZF9ibXZhbCkpKQorCQlnb3RvIG91dDsKKworCURFQ09ERV9UQUlMOworfQorCitzdGF0aWMgaW50CituZnNkNF9kZWNvZGVfcmVtb3ZlKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9yZW1vdmUgKnJlbW92ZSkKK3sKKwlERUNPREVfSEVBRDsKKworCVJFQURfQlVGKDQpOworCVJFQUQzMihyZW1vdmUtPnJtX25hbWVsZW4pOworCVJFQURfQlVGKHJlbW92ZS0+cm1fbmFtZWxlbik7CisJU0FWRU1FTShyZW1vdmUtPnJtX25hbWUsIHJlbW92ZS0+cm1fbmFtZWxlbik7CisJaWYgKChzdGF0dXMgPSBjaGVja19maWxlbmFtZShyZW1vdmUtPnJtX25hbWUsIHJlbW92ZS0+cm1fbmFtZWxlbiwgbmZzZXJyX25vZW50KSkpCisJCXJldHVybiBzdGF0dXM7CisKKwlERUNPREVfVEFJTDsKK30KKworc3RhdGljIGludAorbmZzZDRfZGVjb2RlX3JlbmFtZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfcmVuYW1lICpyZW5hbWUpCit7CisJREVDT0RFX0hFQUQ7CisKKwlSRUFEX0JVRig0KTsKKwlSRUFEMzIocmVuYW1lLT5ybl9zbmFtZWxlbik7CisJUkVBRF9CVUYocmVuYW1lLT5ybl9zbmFtZWxlbiArIDQpOworCVNBVkVNRU0ocmVuYW1lLT5ybl9zbmFtZSwgcmVuYW1lLT5ybl9zbmFtZWxlbik7CisJUkVBRDMyKHJlbmFtZS0+cm5fdG5hbWVsZW4pOworCVJFQURfQlVGKHJlbmFtZS0+cm5fdG5hbWVsZW4pOworCVNBVkVNRU0ocmVuYW1lLT5ybl90bmFtZSwgcmVuYW1lLT5ybl90bmFtZWxlbik7CisJaWYgKChzdGF0dXMgPSBjaGVja19maWxlbmFtZShyZW5hbWUtPnJuX3NuYW1lLCByZW5hbWUtPnJuX3NuYW1lbGVuLCBuZnNlcnJfbm9lbnQpKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAoKHN0YXR1cyA9IGNoZWNrX2ZpbGVuYW1lKHJlbmFtZS0+cm5fdG5hbWUsIHJlbmFtZS0+cm5fdG5hbWVsZW4sIG5mc2Vycl9pbnZhbCkpKQorCQlyZXR1cm4gc3RhdHVzOworCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2RlY29kZV9yZW5ldyhzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBjbGllbnRpZF90ICpjbGllbnRpZCkKK3sKKwlERUNPREVfSEVBRDsKKworCVJFQURfQlVGKHNpemVvZihjbGllbnRpZF90KSk7CisJQ09QWU1FTShjbGllbnRpZCwgc2l6ZW9mKGNsaWVudGlkX3QpKTsKKworCURFQ09ERV9UQUlMOworfQorCitzdGF0aWMgaW50CituZnNkNF9kZWNvZGVfc2V0YXR0cihzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfc2V0YXR0ciAqc2V0YXR0cikKK3sKKwlERUNPREVfSEVBRDsKKworCVJFQURfQlVGKHNpemVvZihzdGF0ZWlkX3QpKTsKKwlSRUFEMzIoc2V0YXR0ci0+c2Ffc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKKwlDT1BZTUVNKCZzZXRhdHRyLT5zYV9zdGF0ZWlkLnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKKwlpZiAoKHN0YXR1cyA9IG5mc2Q0X2RlY29kZV9mYXR0cihhcmdwLCBzZXRhdHRyLT5zYV9ibXZhbCwgJnNldGF0dHItPnNhX2lhdHRyLCAmc2V0YXR0ci0+c2FfYWNsKSkpCisJCWdvdG8gb3V0OworCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2RlY29kZV9zZXRjbGllbnRpZChzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfc2V0Y2xpZW50aWQgKnNldGNsaWVudGlkKQoreworCURFQ09ERV9IRUFEOworCisJUkVBRF9CVUYoMTIpOworCUNPUFlNRU0oc2V0Y2xpZW50aWQtPnNlX3ZlcmYuZGF0YSwgOCk7CisJUkVBRDMyKHNldGNsaWVudGlkLT5zZV9uYW1lbGVuKTsKKworCVJFQURfQlVGKHNldGNsaWVudGlkLT5zZV9uYW1lbGVuICsgOCk7CisJU0FWRU1FTShzZXRjbGllbnRpZC0+c2VfbmFtZSwgc2V0Y2xpZW50aWQtPnNlX25hbWVsZW4pOworCVJFQUQzMihzZXRjbGllbnRpZC0+c2VfY2FsbGJhY2tfcHJvZyk7CisJUkVBRDMyKHNldGNsaWVudGlkLT5zZV9jYWxsYmFja19uZXRpZF9sZW4pOworCisJUkVBRF9CVUYoc2V0Y2xpZW50aWQtPnNlX2NhbGxiYWNrX25ldGlkX2xlbiArIDQpOworCVNBVkVNRU0oc2V0Y2xpZW50aWQtPnNlX2NhbGxiYWNrX25ldGlkX3ZhbCwgc2V0Y2xpZW50aWQtPnNlX2NhbGxiYWNrX25ldGlkX2xlbik7CisJUkVBRDMyKHNldGNsaWVudGlkLT5zZV9jYWxsYmFja19hZGRyX2xlbik7CisKKwlSRUFEX0JVRihzZXRjbGllbnRpZC0+c2VfY2FsbGJhY2tfYWRkcl9sZW4gKyA0KTsKKwlTQVZFTUVNKHNldGNsaWVudGlkLT5zZV9jYWxsYmFja19hZGRyX3ZhbCwgc2V0Y2xpZW50aWQtPnNlX2NhbGxiYWNrX2FkZHJfbGVuKTsKKwlSRUFEMzIoc2V0Y2xpZW50aWQtPnNlX2NhbGxiYWNrX2lkZW50KTsKKworCURFQ09ERV9UQUlMOworfQorCitzdGF0aWMgaW50CituZnNkNF9kZWNvZGVfc2V0Y2xpZW50aWRfY29uZmlybShzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfc2V0Y2xpZW50aWRfY29uZmlybSAqc2NkX2MpCit7CisJREVDT0RFX0hFQUQ7CisKKwlSRUFEX0JVRig4ICsgc2l6ZW9mKG5mczRfdmVyaWZpZXIpKTsKKwlDT1BZTUVNKCZzY2RfYy0+c2NfY2xpZW50aWQsIDgpOworCUNPUFlNRU0oJnNjZF9jLT5zY19jb25maXJtLCBzaXplb2YobmZzNF92ZXJpZmllcikpOworCisJREVDT0RFX1RBSUw7Cit9CisKKy8qIEFsc28gdXNlZCBmb3IgTlZFUklGWSAqLworc3RhdGljIGludAorbmZzZDRfZGVjb2RlX3ZlcmlmeShzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfdmVyaWZ5ICp2ZXJpZnkpCit7CisjaWYgMAorCXN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3Mgc2F2ZSA9IHsKKwkJLnAgPSBhcmdwLT5wLAorCQkuZW5kID0gYXJncC0+ZW5kLAorCQkucnFzdHAgPSBhcmdwLT5ycXN0cCwKKwl9OworCXUzMiAgICAgICAgICAgICB2ZV9ibXZhbFsyXTsKKwlzdHJ1Y3QgaWF0dHIgICAgdmVfaWF0dHI7ICAgICAgICAgICAvKiByZXF1ZXN0ICovCisJc3RydWN0IG5mczRfYWNsICp2ZV9hY2w7ICAgICAgICAgICAgLyogcmVxdWVzdCAqLworI2VuZGlmCisJREVDT0RFX0hFQUQ7CisKKwlpZiAoKHN0YXR1cyA9IG5mc2Q0X2RlY29kZV9iaXRtYXAoYXJncCwgdmVyaWZ5LT52ZV9ibXZhbCkpKQorCQlnb3RvIG91dDsKKworCS8qIEZvciBjb252ZW5pZW5jZSdzIHNha2UsIHdlIGNvbXBhcmUgcmF3IHhkcidkIGF0dHJpYnV0ZXMgaW4KKwkgKiBuZnNkNF9wcm9jX3ZlcmlmeTsgaG93ZXZlciB3ZSBzdGlsbCBkZWNvZGUgaGVyZSBqdXN0IHRvIHJldHVybgorCSAqIGNvcnJlY3QgZXJyb3IgaW4gY2FzZSBvZiBiYWQgeGRyLiAqLworI2lmIDAKKwlzdGF0dXMgPSBuZnNkNF9kZWNvZGVfZmF0dHIodmVfYm12YWwsICZ2ZV9pYXR0ciwgJnZlX2FjbCk7CisJaWYgKHN0YXR1cyA9PSBuZnNlcnJfaW52YWwpIHsKKwkJc3RhdHVzID0gbmZzZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorI2VuZGlmCisJUkVBRF9CVUYoNCk7CisJUkVBRDMyKHZlcmlmeS0+dmVfYXR0cmxlbik7CisJUkVBRF9CVUYodmVyaWZ5LT52ZV9hdHRybGVuKTsKKwlTQVZFTUVNKHZlcmlmeS0+dmVfYXR0cnZhbCwgdmVyaWZ5LT52ZV9hdHRybGVuKTsKKworCURFQ09ERV9UQUlMOworfQorCitzdGF0aWMgaW50CituZnNkNF9kZWNvZGVfd3JpdGUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X3dyaXRlICp3cml0ZSkKK3sKKwlpbnQgYXZhaWw7CisJaW50IHY7CisJaW50IGxlbjsKKwlERUNPREVfSEVBRDsKKworCVJFQURfQlVGKHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSArIDIwKTsKKwlSRUFEMzIod3JpdGUtPndyX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7CisJQ09QWU1FTSgmd3JpdGUtPndyX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCVJFQUQ2NCh3cml0ZS0+d3Jfb2Zmc2V0KTsKKwlSRUFEMzIod3JpdGUtPndyX3N0YWJsZV9ob3cpOworCWlmICh3cml0ZS0+d3Jfc3RhYmxlX2hvdyA+IDIpCisJCWdvdG8geGRyX2Vycm9yOworCVJFQUQzMih3cml0ZS0+d3JfYnVmbGVuKTsKKworCS8qIFNvcnJ5IC4uIG5vIG1hZ2ljIG1hY3JvcyBmb3IgdGhpcy4uICoKKwkgKiBSRUFEX0JVRih3cml0ZS0+d3JfYnVmbGVuKTsKKwkgKiBTQVZFTUVNKHdyaXRlLT53cl9idWYsIHdyaXRlLT53cl9idWZsZW4pOworCSAqLworCWF2YWlsID0gKGNoYXIqKWFyZ3AtPmVuZCAtIChjaGFyKilhcmdwLT5wOworCWlmIChhdmFpbCArIGFyZ3AtPnBhZ2VsZW4gPCB3cml0ZS0+d3JfYnVmbGVuKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAieGRyIGVycm9yISAoJXM6JWQpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOyAKKwkJZ290byB4ZHJfZXJyb3I7CisJfQorCXdyaXRlLT53cl92ZWNbMF0uaW92X2Jhc2UgPSBwOworCXdyaXRlLT53cl92ZWNbMF0uaW92X2xlbiA9IGF2YWlsOworCXYgPSAwOworCWxlbiA9IHdyaXRlLT53cl9idWZsZW47CisJd2hpbGUgKGxlbiA+IHdyaXRlLT53cl92ZWNbdl0uaW92X2xlbikgeworCQlsZW4gLT0gd3JpdGUtPndyX3ZlY1t2XS5pb3ZfbGVuOworCQl2Kys7CisJCXdyaXRlLT53cl92ZWNbdl0uaW92X2Jhc2UgPSBwYWdlX2FkZHJlc3MoYXJncC0+cGFnZWxpc3RbMF0pOworCQlhcmdwLT5wYWdlbGlzdCsrOworCQlpZiAoYXJncC0+cGFnZWxlbiA+PSBQQUdFX1NJWkUpIHsKKwkJCXdyaXRlLT53cl92ZWNbdl0uaW92X2xlbiA9IFBBR0VfU0laRTsKKwkJCWFyZ3AtPnBhZ2VsZW4gLT0gUEFHRV9TSVpFOworCQl9IGVsc2UgeworCQkJd3JpdGUtPndyX3ZlY1t2XS5pb3ZfbGVuID0gYXJncC0+cGFnZWxlbjsKKwkJCWFyZ3AtPnBhZ2VsZW4gLT0gbGVuOworCQl9CisJfQorCWFyZ3AtPmVuZCA9ICh1MzIqKSAod3JpdGUtPndyX3ZlY1t2XS5pb3ZfYmFzZSArIHdyaXRlLT53cl92ZWNbdl0uaW92X2xlbik7CisJYXJncC0+cCA9ICh1MzIqKSAgKHdyaXRlLT53cl92ZWNbdl0uaW92X2Jhc2UgKyAoWERSX1FVQURMRU4obGVuKSA8PCAyKSk7CisJd3JpdGUtPndyX3ZlY1t2XS5pb3ZfbGVuID0gbGVuOworCXdyaXRlLT53cl92bGVuID0gdisxOworCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2RlY29kZV9yZWxlYXNlX2xvY2tvd25lcihzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfcmVsZWFzZV9sb2Nrb3duZXIgKnJsb2Nrb3duZXIpCit7CisJREVDT0RFX0hFQUQ7CisKKwlSRUFEX0JVRigxMik7CisJQ09QWU1FTSgmcmxvY2tvd25lci0+cmxfY2xpZW50aWQsIHNpemVvZihjbGllbnRpZF90KSk7CisJUkVBRDMyKHJsb2Nrb3duZXItPnJsX293bmVyLmxlbik7CisJUkVBRF9CVUYocmxvY2tvd25lci0+cmxfb3duZXIubGVuKTsKKwlSRUFETUVNKHJsb2Nrb3duZXItPnJsX293bmVyLmRhdGEsIHJsb2Nrb3duZXItPnJsX293bmVyLmxlbik7CisKKwlERUNPREVfVEFJTDsKK30KKworc3RhdGljIGludAorbmZzZDRfZGVjb2RlX2NvbXBvdW5kKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3ApCit7CisJREVDT0RFX0hFQUQ7CisJc3RydWN0IG5mc2Q0X29wICpvcDsKKwlpbnQgaTsKKworCS8qCisJICogWFhYOiBBY2NvcmRpbmcgdG8gc3BlYywgd2Ugc2hvdWxkIGNoZWNrIHRoZSB0YWcKKwkgKiBmb3IgVVRGLTggY29tcGxpYW5jZS4gIEknbSBwb3N0cG9uaW5nIHRoaXMgZm9yCisJICogbm93IGJlY2F1c2UgaXQgc2VlbXMgdGhhdCBzb21lIGNsaWVudHMgZG8gdXNlCisJICogYmluYXJ5IHRhZ3MuCisJICovCisJUkVBRF9CVUYoNCk7CisJUkVBRDMyKGFyZ3AtPnRhZ2xlbik7CisJUkVBRF9CVUYoYXJncC0+dGFnbGVuICsgOCk7CisJU0FWRU1FTShhcmdwLT50YWcsIGFyZ3AtPnRhZ2xlbik7CisJUkVBRDMyKGFyZ3AtPm1pbm9ydmVyc2lvbik7CisJUkVBRDMyKGFyZ3AtPm9wY250KTsKKworCWlmIChhcmdwLT50YWdsZW4gPiBORlNENF9NQVhfVEFHTEVOKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoYXJncC0+b3BjbnQgPiAxMDApCisJCWdvdG8geGRyX2Vycm9yOworCisJaWYgKGFyZ3AtPm9wY250ID4gc2l6ZW9mKGFyZ3AtPmlvcHMpL3NpemVvZihhcmdwLT5pb3BzWzBdKSkgeworCQlhcmdwLT5vcHMgPSBrbWFsbG9jKGFyZ3AtPm9wY250ICogc2l6ZW9mKCphcmdwLT5vcHMpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFhcmdwLT5vcHMpIHsKKwkJCWFyZ3AtPm9wcyA9IGFyZ3AtPmlvcHM7CisJCQlwcmludGsoS0VSTl9JTkZPICJuZnNkOiBjb3VsZG4ndCBhbGxvY2F0ZSByb29tIGZvciBDT01QT1VORFxuIik7CisJCQlnb3RvIHhkcl9lcnJvcjsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBhcmdwLT5vcGNudDsgaSsrKSB7CisJCW9wID0gJmFyZ3AtPm9wc1tpXTsKKwkJb3AtPnJlcGxheSA9IE5VTEw7CisKKwkJLyoKKwkJICogV2UgY2FuJ3QgdXNlIFJFQURfQlVGKCkgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdG8gaGFuZGxlCisJCSAqIGEgbWlzc2luZyBvcGNvZGUgYXMgYW4gT1BfV1JJVEUgKyAxLiBTbyB3ZSBuZWVkIHRvIGNoZWNrCisJCSAqIHRvIHNlZSBpZiB3ZSdyZSB0cnVseSBhdCB0aGUgZW5kIG9mIG91ciBidWZmZXIgb3IgaWYgdGhlcmUKKwkJICogaXMgYW5vdGhlciBwYWdlIHdlIG5lZWQgdG8gZmxpcCB0by4KKwkJICovCisKKwkJaWYgKGFyZ3AtPnAgPT0gYXJncC0+ZW5kKSB7CisJCQlpZiAoYXJncC0+cGFnZWxlbiA8IDQpIHsKKwkJCQkvKiBUaGVyZSBpc24ndCBhbiBvcGNvZGUgc3RpbGwgb24gdGhlIHdpcmUgKi8KKwkJCQlvcC0+b3BudW0gPSBPUF9XUklURSArIDE7CisJCQkJb3AtPnN0YXR1cyA9IG5mc2Vycl9iYWRfeGRyOworCQkJCWFyZ3AtPm9wY250ID0gaSsxOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogRmFsc2UgYWxhcm0uIFdlIGp1c3QgaGl0IGEgcGFnZSBib3VuZGFyeSwgYnV0IHRoZXJlCisJCQkgKiBpcyBzdGlsbCBkYXRhIGF2YWlsYWJsZS4gIE1vdmUgcG9pbnRlciBhY3Jvc3MgcGFnZQorCQkJICogYm91bmRhcnkuICAqc25pcCBmcm9tIFJFQURfQlVGKgorCQkJICovCisJCQlhcmdwLT5wID0gcGFnZV9hZGRyZXNzKGFyZ3AtPnBhZ2VsaXN0WzBdKTsKKwkJCWFyZ3AtPnBhZ2VsaXN0Kys7CisJCQlpZiAoYXJncC0+cGFnZWxlbiA8IFBBR0VfU0laRSkgeworCQkJCWFyZ3AtPmVuZCA9IHAgKyAoYXJncC0+cGFnZWxlbj4+Mik7CisJCQkJYXJncC0+cGFnZWxlbiA9IDA7CisJCQl9IGVsc2UgeworCQkJCWFyZ3AtPmVuZCA9IHAgKyAoUEFHRV9TSVpFPj4yKTsKKwkJCQlhcmdwLT5wYWdlbGVuIC09IFBBR0VfU0laRTsKKwkJCX0KKwkJfQorCQlvcC0+b3BudW0gPSBudG9obCgqYXJncC0+cCsrKTsKKworCQlzd2l0Y2ggKG9wLT5vcG51bSkgeworCQljYXNlIDI6IC8qIFJlc2VydmVkIG9wZXJhdGlvbiAqLworCQkJb3AtPm9wbnVtID0gT1BfSUxMRUdBTDsKKwkJCWlmIChhcmdwLT5taW5vcnZlcnNpb24gPT0gMCkKKwkJCQlvcC0+c3RhdHVzID0gbmZzZXJyX29wX2lsbGVnYWw7CisJCQllbHNlCisJCQkJb3AtPnN0YXR1cyA9IG5mc2Vycl9taW5vcl92ZXJzX21pc21hdGNoOworCQkJYnJlYWs7CisJCWNhc2UgT1BfQUNDRVNTOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV9hY2Nlc3MoYXJncCwgJm9wLT51LmFjY2Vzcyk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9DTE9TRToKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfY2xvc2UoYXJncCwgJm9wLT51LmNsb3NlKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0NPTU1JVDoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfY29tbWl0KGFyZ3AsICZvcC0+dS5jb21taXQpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfQ1JFQVRFOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV9jcmVhdGUoYXJncCwgJm9wLT51LmNyZWF0ZSk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9ERUxFR1JFVFVSTjoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfZGVsZWdyZXR1cm4oYXJncCwgJm9wLT51LmRlbGVncmV0dXJuKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0dFVEFUVFI6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX2dldGF0dHIoYXJncCwgJm9wLT51LmdldGF0dHIpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfR0VURkg6CisJCQlvcC0+c3RhdHVzID0gbmZzX29rOworCQkJYnJlYWs7CisJCWNhc2UgT1BfTElOSzoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfbGluayhhcmdwLCAmb3AtPnUubGluayk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9MT0NLOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV9sb2NrKGFyZ3AsICZvcC0+dS5sb2NrKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0xPQ0tUOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV9sb2NrdChhcmdwLCAmb3AtPnUubG9ja3QpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfTE9DS1U6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX2xvY2t1KGFyZ3AsICZvcC0+dS5sb2NrdSk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9MT09LVVA6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX2xvb2t1cChhcmdwLCAmb3AtPnUubG9va3VwKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0xPT0tVUFA6CisJCQlvcC0+c3RhdHVzID0gbmZzX29rOworCQkJYnJlYWs7CisJCWNhc2UgT1BfTlZFUklGWToKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfdmVyaWZ5KGFyZ3AsICZvcC0+dS5udmVyaWZ5KTsKKwkJCWJyZWFrOworCQljYXNlIE9QX09QRU46CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX29wZW4oYXJncCwgJm9wLT51Lm9wZW4pOworCQkJYnJlYWs7CisJCWNhc2UgT1BfT1BFTl9DT05GSVJNOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV9vcGVuX2NvbmZpcm0oYXJncCwgJm9wLT51Lm9wZW5fY29uZmlybSk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9PUEVOX0RPV05HUkFERToKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfb3Blbl9kb3duZ3JhZGUoYXJncCwgJm9wLT51Lm9wZW5fZG93bmdyYWRlKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX1BVVEZIOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV9wdXRmaChhcmdwLCAmb3AtPnUucHV0ZmgpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfUFVUUk9PVEZIOgorCQkJb3AtPnN0YXR1cyA9IG5mc19vazsKKwkJCWJyZWFrOworCQljYXNlIE9QX1JFQUQ6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX3JlYWQoYXJncCwgJm9wLT51LnJlYWQpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfUkVBRERJUjoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfcmVhZGRpcihhcmdwLCAmb3AtPnUucmVhZGRpcik7CisJCQlicmVhazsKKwkJY2FzZSBPUF9SRUFETElOSzoKKwkJCW9wLT5zdGF0dXMgPSBuZnNfb2s7CisJCQlicmVhazsKKwkJY2FzZSBPUF9SRU1PVkU6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX3JlbW92ZShhcmdwLCAmb3AtPnUucmVtb3ZlKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX1JFTkFNRToKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfcmVuYW1lKGFyZ3AsICZvcC0+dS5yZW5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfUkVTVE9SRUZIOgorCQkJb3AtPnN0YXR1cyA9IG5mc19vazsKKwkJCWJyZWFrOworCQljYXNlIE9QX1JFTkVXOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV9yZW5ldyhhcmdwLCAmb3AtPnUucmVuZXcpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfU0FWRUZIOgorCQkJb3AtPnN0YXR1cyA9IG5mc19vazsKKwkJCWJyZWFrOworCQljYXNlIE9QX1NFVEFUVFI6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX3NldGF0dHIoYXJncCwgJm9wLT51LnNldGF0dHIpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfU0VUQ0xJRU5USUQ6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX3NldGNsaWVudGlkKGFyZ3AsICZvcC0+dS5zZXRjbGllbnRpZCk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9TRVRDTElFTlRJRF9DT05GSVJNOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV9zZXRjbGllbnRpZF9jb25maXJtKGFyZ3AsICZvcC0+dS5zZXRjbGllbnRpZF9jb25maXJtKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX1ZFUklGWToKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfdmVyaWZ5KGFyZ3AsICZvcC0+dS52ZXJpZnkpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfV1JJVEU6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX3dyaXRlKGFyZ3AsICZvcC0+dS53cml0ZSk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9SRUxFQVNFX0xPQ0tPV05FUjoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfcmVsZWFzZV9sb2Nrb3duZXIoYXJncCwgJm9wLT51LnJlbGVhc2VfbG9ja293bmVyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJb3AtPm9wbnVtID0gT1BfSUxMRUdBTDsKKwkJCW9wLT5zdGF0dXMgPSBuZnNlcnJfb3BfaWxsZWdhbDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG9wLT5zdGF0dXMpIHsKKwkJCWFyZ3AtPm9wY250ID0gaSsxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlERUNPREVfVEFJTDsKK30KKy8qCisgKiBFTkQgT0YgIkdFTkVSSUMiIERFQ09ERSBST1VUSU5FUy4KKyAqLworCisvKgorICogU1RBUlQgT0YgIkdFTkVSSUMiIEVOQ09ERSBST1VUSU5FUy4KKyAqICAgVGhlc2UgbWF5IGxvb2sgYSBsaXR0bGUgdWdseSBzaW5jZSB0aGV5IGFyZSBpbXBvcnRlZCBmcm9tIGEgImdlbmVyaWMiCisgKiBzZXQgb2YgWERSIGVuY29kZS9kZWNvZGUgcm91dGluZXMgd2hpY2ggYXJlIGludGVuZGVkIHRvIGJlIHNoYXJlZCBieQorICogYWxsIG9mIG91ciBORlN2NCBpbXBsZW1lbnRhdGlvbnMgKE9wZW5CU0QsIE1hY09TIFguLi4pLgorICoKKyAqIElmIHRoZSBwYWluIG9mIHJlYWRpbmcgdGhlc2UgaXMgdG9vIGdyZWF0LCBpdCBzaG91bGQgYmUgYSBzdHJhaWdodGZvcndhcmQKKyAqIHRhc2sgdG8gdHJhbnNsYXRlIHRoZW0gaW50byBMaW51eC1zcGVjaWZpYyB2ZXJzaW9ucyB3aGljaCBhcmUgbW9yZQorICogY29uc2lzdGVudCB3aXRoIHRoZSBzdHlsZSB1c2VkIGluIE5GU3YyL3YzLi4uCisgKi8KKyNkZWZpbmUgRU5DT0RFX0hFQUQgICAgICAgICAgICAgIHUzMiAqcAorCisjZGVmaW5lIFdSSVRFMzIobikgICAgICAgICAgICAgICAqcCsrID0gaHRvbmwobikKKyNkZWZpbmUgV1JJVEU2NChuKSAgICAgICAgICAgICAgIGRvIHsJCQkJXAorCSpwKysgPSBodG9ubCgodTMyKSgobikgPj4gMzIpKTsJCQkJXAorCSpwKysgPSBodG9ubCgodTMyKShuKSk7CQkJCQlcCit9IHdoaWxlICgwKQorI2RlZmluZSBXUklURU1FTShwdHIsbmJ5dGVzKSAgICAgZG8gewkJCQlcCisJKihwICsgWERSX1FVQURMRU4obmJ5dGVzKSAtMSkgPSAwOyAgICAgICAgICAgICAgICAgICAgICBcCisJbWVtY3B5KHAsIHB0ciwgbmJ5dGVzKTsJCQkJCVwKKwlwICs9IFhEUl9RVUFETEVOKG5ieXRlcyk7CQkJCVwKK30gd2hpbGUgKDApCisjZGVmaW5lIFdSSVRFQ0lORk8oYykJCWRvIHsJCQkJXAorCSpwKysgPSBodG9ubChjLmF0b21pYyk7CQkJCQlcCisJKnArKyA9IGh0b25sKGMuYmVmb3JlX2N0aW1lX3NlYyk7CQkJCVwKKwkqcCsrID0gaHRvbmwoYy5iZWZvcmVfY3RpbWVfbnNlYyk7CQkJCVwKKwkqcCsrID0gaHRvbmwoYy5hZnRlcl9jdGltZV9zZWMpOwkJCQlcCisJKnArKyA9IGh0b25sKGMuYWZ0ZXJfY3RpbWVfbnNlYyk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUkVTRVJWRV9TUEFDRShuYnl0ZXMpCWRvIHsJCQkJXAorCXAgPSByZXNwLT5wOwkJCQkJCVwKKwlCVUdfT04ocCArIFhEUl9RVUFETEVOKG5ieXRlcykgPiByZXNwLT5lbmQpOwkJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgQURKVVNUX0FSR1MoKQkJcmVzcC0+cCA9IHAKKworLyoKKyAqIEhlYWRlciByb3V0aW5lIHRvIHNldHVwIHNlcWlkIG9wZXJhdGlvbiByZXBsYXkgY2FjaGUKKyAqLworI2RlZmluZSBFTkNPREVfU0VRSURfT1BfSEVBRAkJCQkJXAorCXUzMiAqcDsJCQkJCQkJXAorCXUzMiAqc2F2ZTsJCQkJCQlcCisJCQkJCQkJCVwKKwlzYXZlID0gcmVzcC0+cDsKKworLyoKKyAqIFJvdXRpbmUgZm9yIGVuY29kaW5nIHRoZSByZXN1bHQgb2YgYQorICogInNlcWlkLW11dGF0aW5nIiBORlN2NCBvcGVyYXRpb24uICBUaGlzIGlzCisgKiB3aGVyZSBzZXFpZHMgYXJlIGluY3JlbWVudGVkLCBhbmQgdGhlCisgKiByZXBsYXkgY2FjaGUgaXMgZmlsbGVkLgorICovCisKKyNkZWZpbmUgRU5DT0RFX1NFUUlEX09QX1RBSUwoc3RhdGVvd25lcikgZG8gewkJCVwKKwlpZiAoc2VxaWRfbXV0YXRpbmdfZXJyKG5mc2VycikgJiYgc3RhdGVvd25lcikgeyAJXAorCQlpZiAoc3RhdGVvd25lci0+c29fY29uZmlybWVkKQkJCVwKKwkJCXN0YXRlb3duZXItPnNvX3NlcWlkKys7CQkJXAorCQlzdGF0ZW93bmVyLT5zb19yZXBsYXkucnBfc3RhdHVzID0gbmZzZXJyOyAgIAlcCisJCXN0YXRlb3duZXItPnNvX3JlcGxheS5ycF9idWZsZW4gPSAJCVwKKwkJCSAgKCgoY2hhciAqKShyZXNwKS0+cCAtIChjaGFyICopc2F2ZSkpOyBcCisJCW1lbWNweShzdGF0ZW93bmVyLT5zb19yZXBsYXkucnBfYnVmLCBzYXZlLCAgICAgIFwKKyAJCQlzdGF0ZW93bmVyLT5zb19yZXBsYXkucnBfYnVmbGVuKTsgCVwKKwl9IH0gd2hpbGUgKDApOworCisKK3N0YXRpYyB1MzIgbmZzNF9mdHlwZXNbMTZdID0geworICAgICAgICBORjRCQUQsICBORjRGSUZPLCBORjRDSFIsIE5GNEJBRCwKKyAgICAgICAgTkY0RElSLCAgTkY0QkFELCAgTkY0QkxLLCBORjRCQUQsCisgICAgICAgIE5GNFJFRywgIE5GNEJBRCwgIE5GNExOSywgTkY0QkFELAorICAgICAgICBORjRTT0NLLCBORjRCQUQsICBORjRMTkssIE5GNEJBRCwKK307CisKK3N0YXRpYyBpbnQKK25mc2Q0X2VuY29kZV9uYW1lKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGludCB3aG90eXBlLCB1aWRfdCBpZCwgaW50IGdyb3VwLAorCQkJdTMyICoqcCwgaW50ICpidWZsZW4pCit7CisJaW50IHN0YXR1czsKKworCWlmICgqYnVmbGVuIDwgKFhEUl9RVUFETEVOKElETUFQX05BTUVTWikgPDwgMikgKyA0KQorCQlyZXR1cm4gbmZzZXJyX3Jlc291cmNlOworCWlmICh3aG90eXBlICE9IE5GUzRfQUNMX1dIT19OQU1FRCkKKwkJc3RhdHVzID0gbmZzNF9hY2xfd3JpdGVfd2hvKHdob3R5cGUsICh1OCAqKSgqcCArIDEpKTsKKwllbHNlIGlmIChncm91cCkKKwkJc3RhdHVzID0gbmZzZF9tYXBfZ2lkX3RvX25hbWUocnFzdHAsIGlkLCAodTggKikoKnAgKyAxKSk7CisJZWxzZQorCQlzdGF0dXMgPSBuZnNkX21hcF91aWRfdG9fbmFtZShycXN0cCwgaWQsICh1OCAqKSgqcCArIDEpKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIG5mc2Vycm5vKHN0YXR1cyk7CisJKnAgPSB4ZHJfZW5jb2RlX29wYXF1ZSgqcCwgTlVMTCwgc3RhdHVzKTsKKwkqYnVmbGVuIC09IChYRFJfUVVBRExFTihzdGF0dXMpIDw8IDIpICsgNDsKKwlCVUdfT04oKmJ1ZmxlbiA8IDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorbmZzZDRfZW5jb2RlX3VzZXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdWlkX3QgdWlkLCB1MzIgKipwLCBpbnQgKmJ1ZmxlbikKK3sKKwlyZXR1cm4gbmZzZDRfZW5jb2RlX25hbWUocnFzdHAsIE5GUzRfQUNMX1dIT19OQU1FRCwgdWlkLCAwLCBwLCBidWZsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGludAorbmZzZDRfZW5jb2RlX2dyb3VwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHVpZF90IGdpZCwgdTMyICoqcCwgaW50ICpidWZsZW4pCit7CisJcmV0dXJuIG5mc2Q0X2VuY29kZV9uYW1lKHJxc3RwLCBORlM0X0FDTF9XSE9fTkFNRUQsIGdpZCwgMSwgcCwgYnVmbGVuKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mc2Q0X2VuY29kZV9hY2xuYW1lKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGludCB3aG90eXBlLCB1aWRfdCBpZCwgaW50IGdyb3VwLAorCQl1MzIgKipwLCBpbnQgKmJ1ZmxlbikKK3sKKwlyZXR1cm4gbmZzZDRfZW5jb2RlX25hbWUocnFzdHAsIHdob3R5cGUsIGlkLCBncm91cCwgcCwgYnVmbGVuKTsKK30KKworCisvKgorICogTm90ZTogQGZocCBjYW4gYmUgTlVMTDsgaW4gdGhpcyBjYXNlLCB3ZSBtaWdodCBoYXZlIHRvIGNvbXBvc2UgdGhlIGZpbGVoYW5kbGUKKyAqIG91cnNlbHZlcy4KKyAqCisgKiBAY291bnRwIGlzIHRoZSBidWZmZXIgc2l6ZSBpbiBfd29yZHNfOyB1cG9uIHN1Y2Nlc3NmdWwgcmV0dXJuIHRoaXMgYmVjb21lcworICogcmVwbGFjZWQgd2l0aCB0aGUgbnVtYmVyIG9mIHdvcmRzIHdyaXR0ZW4uCisgKi8KK2ludAorbmZzZDRfZW5jb2RlX2ZhdHRyKHN0cnVjdCBzdmNfZmggKmZocCwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCwKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCB1MzIgKmJ1ZmZlciwgaW50ICpjb3VudHAsIHUzMiAqYm12YWwsCisJCXN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCit7CisJdTMyIGJtdmFsMCA9IGJtdmFsWzBdOworCXUzMiBibXZhbDEgPSBibXZhbFsxXTsKKwlzdHJ1Y3Qga3N0YXQgc3RhdDsKKwlzdHJ1Y3Qgc3ZjX2ZoIHRlbXBmaDsKKwlzdHJ1Y3Qga3N0YXRmcyBzdGF0ZnM7CisJaW50IGJ1ZmxlbiA9ICpjb3VudHAgPDwgMjsKKwl1MzIgKmF0dHJsZW5wOworCXUzMiBkdW1teTsKKwl1NjQgZHVtbXk2NDsKKwl1MzIgKnAgPSBidWZmZXI7CisJaW50IHN0YXR1czsKKwlpbnQgYWNsc3VwcG9ydCA9IDA7CisJc3RydWN0IG5mczRfYWNsICphY2wgPSBOVUxMOworCisJQlVHX09OKGJtdmFsMSAmIE5GU0RfV1JJVEVPTkxZX0FUVFJTX1dPUkQxKTsKKwlCVUdfT04oYm12YWwwICYgfk5GU0RfU1VQUE9SVEVEX0FUVFJTX1dPUkQwKTsKKwlCVUdfT04oYm12YWwxICYgfk5GU0RfU1VQUE9SVEVEX0FUVFJTX1dPUkQxKTsKKworCXN0YXR1cyA9IHZmc19nZXRhdHRyKGV4cC0+ZXhfbW50LCBkZW50cnksICZzdGF0KTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dF9uZnNlcnI7CisJaWYgKChibXZhbDAgJiAoRkFUVFI0X1dPUkQwX0ZJTEVTX0ZSRUUgfCBGQVRUUjRfV09SRDBfRklMRVNfVE9UQUwpKSB8fAorCSAgICAoYm12YWwxICYgKEZBVFRSNF9XT1JEMV9TUEFDRV9BVkFJTCB8IEZBVFRSNF9XT1JEMV9TUEFDRV9GUkVFIHwKKwkJICAgICAgIEZBVFRSNF9XT1JEMV9TUEFDRV9UT1RBTCkpKSB7CisJCXN0YXR1cyA9IHZmc19zdGF0ZnMoZGVudHJ5LT5kX2lub2RlLT5pX3NiLCAmc3RhdGZzKTsKKwkJaWYgKHN0YXR1cykKKwkJCWdvdG8gb3V0X25mc2VycjsKKwl9CisJaWYgKChibXZhbDAgJiAoRkFUVFI0X1dPUkQwX0ZJTEVIQU5ETEUgfCBGQVRUUjRfV09SRDBfRlNJRCkpICYmICFmaHApIHsKKwkJZmhfaW5pdCgmdGVtcGZoLCBORlM0X0ZIU0laRSk7CisJCXN0YXR1cyA9IGZoX2NvbXBvc2UoJnRlbXBmaCwgZXhwLCBkZW50cnksIE5VTEwpOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBvdXQ7CisJCWZocCA9ICZ0ZW1wZmg7CisJfQorCWlmIChibXZhbDAgJiAoRkFUVFI0X1dPUkQwX0FDTCB8IEZBVFRSNF9XT1JEMF9BQ0xTVVBQT1JUCisJCQl8IEZBVFRSNF9XT1JEMF9TVVBQT1JURURfQVRUUlMpKSB7CisJCXN0YXR1cyA9IG5mc2Q0X2dldF9uZnM0X2FjbChycXN0cCwgZGVudHJ5LCAmYWNsKTsKKwkJYWNsc3VwcG9ydCA9IChzdGF0dXMgPT0gMCk7CisJCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfQUNMKSB7CisJCQlpZiAoc3RhdHVzID09IC1FT1BOT1RTVVBQKQorCQkJCWJtdmFsMCAmPSB+RkFUVFI0X1dPUkQwX0FDTDsKKwkJCWVsc2UgaWYgKHN0YXR1cyA9PSAtRUlOVkFMKSB7CisJCQkJc3RhdHVzID0gbmZzZXJyX2F0dHJub3RzdXBwOworCQkJCWdvdG8gb3V0OworCQkJfSBlbHNlIGlmIChzdGF0dXMgIT0gMCkKKwkJCQlnb3RvIG91dF9uZnNlcnI7CisJCX0KKwl9CisJaWYgKChidWZsZW4gLT0gMTYpIDwgMCkKKwkJZ290byBvdXRfcmVzb3VyY2U7CisKKwlXUklURTMyKDIpOworCVdSSVRFMzIoYm12YWwwKTsKKwlXUklURTMyKGJtdmFsMSk7CisJYXR0cmxlbnAgPSBwKys7ICAgICAgICAgICAgICAgIC8qIHRvIGJlIGJhY2tmaWxsZWQgbGF0ZXIgKi8KKworCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfU1VQUE9SVEVEX0FUVFJTKSB7CisJCWlmICgoYnVmbGVuIC09IDEyKSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMigyKTsKKwkJV1JJVEUzMihhY2xzdXBwb3J0ID8KKwkJCU5GU0RfU1VQUE9SVEVEX0FUVFJTX1dPUkQwIDoKKwkJCU5GU0RfU1VQUE9SVEVEX0FUVFJTX1dPUkQwICYgfkZBVFRSNF9XT1JEMF9BQ0wpOworCQlXUklURTMyKE5GU0RfU1VQUE9SVEVEX0FUVFJTX1dPUkQxKTsKKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9UWVBFKSB7CisJCWlmICgoYnVmbGVuIC09IDQpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlkdW1teSA9IG5mczRfZnR5cGVzWyhzdGF0Lm1vZGUgJiBTX0lGTVQpID4+IDEyXTsKKwkJaWYgKGR1bW15ID09IE5GNEJBRCkKKwkJCWdvdG8gb3V0X3NlcnZlcmZhdWx0OworCQlXUklURTMyKGR1bW15KTsKKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9GSF9FWFBJUkVfVFlQRSkgeworCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMiggTkZTNF9GSF9OT0VYUElSRV9XSVRIX09QRU4gfCBORlM0X0ZIX1ZPTF9SRU5BTUUgKTsKKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9DSEFOR0UpIHsKKwkJLyoKKwkJICogTm90ZTogVGhpcyBfbXVzdF8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBzY2hlbWUgZm9yIHdyaXRpbmcKKwkJICogY2hhbmdlX2luZm8sIHNvIGFueSBjaGFuZ2VzIG1hZGUgaGVyZSBtdXN0IGJlIHJlZmxlY3RlZCB0aGVyZQorCQkgKiBhcyB3ZWxsLiAgKFNlZSB4ZHI0Lmg6c2V0X2NoYW5nZV9pbmZvKCkgYW5kIHRoZSBXUklURUNJTkZPKCkKKwkJICogbWFjcm8gYWJvdmUuKQorCQkgKi8KKwkJaWYgKChidWZsZW4gLT0gOCkgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCVdSSVRFMzIoc3RhdC5jdGltZS50dl9zZWMpOworCQlXUklURTMyKHN0YXQuY3RpbWUudHZfbnNlYyk7CisJfQorCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfU0laRSkgeworCQlpZiAoKGJ1ZmxlbiAtPSA4KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEU2NChzdGF0LnNpemUpOworCX0KKwlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX0xJTktfU1VQUE9SVCkgeworCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMigxKTsKKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9TWU1MSU5LX1NVUFBPUlQpIHsKKwkJaWYgKChidWZsZW4gLT0gNCkgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCVdSSVRFMzIoMSk7CisJfQorCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfTkFNRURfQVRUUikgeworCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMigwKTsKKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9GU0lEKSB7CisJCWlmICgoYnVmbGVuIC09IDE2KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJaWYgKGlzX2ZzaWQoZmhwLCBycXN0cC0+cnFfcmVmZmgpKSB7CisJCQlXUklURTY0KCh1NjQpZXhwLT5leF9mc2lkKTsKKwkJCVdSSVRFNjQoKHU2NCkwKTsKKwkJfSBlbHNlIHsKKwkJCVdSSVRFMzIoMCk7CisJCQlXUklURTMyKE1BSk9SKHN0YXQuZGV2KSk7CisJCQlXUklURTMyKDApOworCQkJV1JJVEUzMihNSU5PUihzdGF0LmRldikpOworCQl9CisJfQorCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfVU5JUVVFX0hBTkRMRVMpIHsKKwkJaWYgKChidWZsZW4gLT0gNCkgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCVdSSVRFMzIoMCk7CisJfQorCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfTEVBU0VfVElNRSkgeworCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMihORlNEX0xFQVNFX1RJTUUpOworCX0KKwlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX1JEQVRUUl9FUlJPUikgeworCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMigwKTsKKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9BQ0wpIHsKKwkJc3RydWN0IG5mczRfYWNlICphY2U7CisJCXN0cnVjdCBsaXN0X2hlYWQgKmg7CisKKwkJaWYgKGFjbCA9PSBOVUxMKSB7CisJCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCisJCQkJZ290byBvdXRfcmVzb3VyY2U7CisKKwkJCVdSSVRFMzIoMCk7CisJCQlnb3RvIG91dF9hY2w7CisJCX0KKwkJaWYgKChidWZsZW4gLT0gNCkgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCVdSSVRFMzIoYWNsLT5uYWNlcyk7CisKKwkJbGlzdF9mb3JfZWFjaChoLCAmYWNsLT5hY2VfaGVhZCkgeworCQkJYWNlID0gbGlzdF9lbnRyeShoLCBzdHJ1Y3QgbmZzNF9hY2UsIGxfYWNlKTsKKworCQkJaWYgKChidWZsZW4gLT0gNCozKSA8IDApCisJCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCQlXUklURTMyKGFjZS0+dHlwZSk7CisJCQlXUklURTMyKGFjZS0+ZmxhZyk7CisJCQlXUklURTMyKGFjZS0+YWNjZXNzX21hc2sgJiBORlM0X0FDRV9NQVNLX0FMTCk7CisJCQlzdGF0dXMgPSBuZnNkNF9lbmNvZGVfYWNsbmFtZShycXN0cCwgYWNlLT53aG90eXBlLAorCQkJCWFjZS0+d2hvLCBhY2UtPmZsYWcgJiBORlM0X0FDRV9JREVOVElGSUVSX0dST1VQLAorCQkJCSZwLCAmYnVmbGVuKTsKKwkJCWlmIChzdGF0dXMgPT0gbmZzZXJyX3Jlc291cmNlKQorCQkJCWdvdG8gb3V0X3Jlc291cmNlOworCQkJaWYgKHN0YXR1cykKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KK291dF9hY2w6CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9BQ0xTVVBQT1JUKSB7CisJCWlmICgoYnVmbGVuIC09IDQpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTMyKGFjbHN1cHBvcnQgPworCQkJQUNMNF9TVVBQT1JUX0FMTE9XX0FDTHxBQ0w0X1NVUFBPUlRfREVOWV9BQ0wgOiAwKTsKKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9DQU5TRVRUSU1FKSB7CisJCWlmICgoYnVmbGVuIC09IDQpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTMyKDEpOworCX0KKwlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX0NBU0VfSU5TRU5TSVRJVkUpIHsKKwkJaWYgKChidWZsZW4gLT0gNCkgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCVdSSVRFMzIoMSk7CisJfQorCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfQ0FTRV9QUkVTRVJWSU5HKSB7CisJCWlmICgoYnVmbGVuIC09IDQpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTMyKDEpOworCX0KKwlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX0NIT1dOX1JFU1RSSUNURUQpIHsKKwkJaWYgKChidWZsZW4gLT0gNCkgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCVdSSVRFMzIoMSk7CisJfQorCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfRklMRUhBTkRMRSkgeworCQlidWZsZW4gLT0gKFhEUl9RVUFETEVOKGZocC0+ZmhfaGFuZGxlLmZoX3NpemUpIDw8IDIpICsgNDsKKwkJaWYgKGJ1ZmxlbiA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMihmaHAtPmZoX2hhbmRsZS5maF9zaXplKTsKKwkJV1JJVEVNRU0oJmZocC0+ZmhfaGFuZGxlLmZoX2Jhc2UsIGZocC0+ZmhfaGFuZGxlLmZoX3NpemUpOworCX0KKwlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX0ZJTEVJRCkgeworCQlpZiAoKGJ1ZmxlbiAtPSA4KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEU2NCgodTY0KSBzdGF0Lmlubyk7CisJfQorCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfRklMRVNfQVZBSUwpIHsKKwkJaWYgKChidWZsZW4gLT0gOCkgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCVdSSVRFNjQoKHU2NCkgc3RhdGZzLmZfZmZyZWUpOworCX0KKwlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX0ZJTEVTX0ZSRUUpIHsKKwkJaWYgKChidWZsZW4gLT0gOCkgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCVdSSVRFNjQoKHU2NCkgc3RhdGZzLmZfZmZyZWUpOworCX0KKwlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX0ZJTEVTX1RPVEFMKSB7CisJCWlmICgoYnVmbGVuIC09IDgpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTY0KCh1NjQpIHN0YXRmcy5mX2ZpbGVzKTsKKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9IT01PR0VORU9VUykgeworCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMigxKTsKKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9NQVhGSUxFU0laRSkgeworCQlpZiAoKGJ1ZmxlbiAtPSA4KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEU2NCh+KHU2NCkwKTsKKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9NQVhMSU5LKSB7CisJCWlmICgoYnVmbGVuIC09IDQpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTMyKDI1NSk7CisJfQorCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfTUFYTkFNRSkgeworCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMih+KHUzMikgMCk7CisJfQorCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfTUFYUkVBRCkgeworCQlpZiAoKGJ1ZmxlbiAtPSA4KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEU2NCgodTY0KSBORlNTVkNfTUFYQkxLU0laRSk7CisJfQorCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfTUFYV1JJVEUpIHsKKwkJaWYgKChidWZsZW4gLT0gOCkgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCVdSSVRFNjQoKHU2NCkgTkZTU1ZDX01BWEJMS1NJWkUpOworCX0KKwlpZiAoYm12YWwxICYgRkFUVFI0X1dPUkQxX01PREUpIHsKKwkJaWYgKChidWZsZW4gLT0gNCkgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCVdSSVRFMzIoc3RhdC5tb2RlICYgU19JQUxMVUdPKTsKKwl9CisJaWYgKGJtdmFsMSAmIEZBVFRSNF9XT1JEMV9OT19UUlVOQykgeworCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMigxKTsKKwl9CisJaWYgKGJtdmFsMSAmIEZBVFRSNF9XT1JEMV9OVU1MSU5LUykgeworCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMihzdGF0Lm5saW5rKTsKKwl9CisJaWYgKGJtdmFsMSAmIEZBVFRSNF9XT1JEMV9PV05FUikgeworCQlzdGF0dXMgPSBuZnNkNF9lbmNvZGVfdXNlcihycXN0cCwgc3RhdC51aWQsICZwLCAmYnVmbGVuKTsKKwkJaWYgKHN0YXR1cyA9PSBuZnNlcnJfcmVzb3VyY2UpCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJaWYgKHN0YXR1cykKKwkJCWdvdG8gb3V0OworCX0KKwlpZiAoYm12YWwxICYgRkFUVFI0X1dPUkQxX09XTkVSX0dST1VQKSB7CisJCXN0YXR1cyA9IG5mc2Q0X2VuY29kZV9ncm91cChycXN0cCwgc3RhdC5naWQsICZwLCAmYnVmbGVuKTsKKwkJaWYgKHN0YXR1cyA9PSBuZnNlcnJfcmVzb3VyY2UpCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJaWYgKHN0YXR1cykKKwkJCWdvdG8gb3V0OworCX0KKwlpZiAoYm12YWwxICYgRkFUVFI0X1dPUkQxX1JBV0RFVikgeworCQlpZiAoKGJ1ZmxlbiAtPSA4KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMigodTMyKSBNQUpPUihzdGF0LnJkZXYpKTsKKwkJV1JJVEUzMigodTMyKSBNSU5PUihzdGF0LnJkZXYpKTsKKwl9CisJaWYgKGJtdmFsMSAmIEZBVFRSNF9XT1JEMV9TUEFDRV9BVkFJTCkgeworCQlpZiAoKGJ1ZmxlbiAtPSA4KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJZHVtbXk2NCA9ICh1NjQpc3RhdGZzLmZfYmF2YWlsICogKHU2NClzdGF0ZnMuZl9ic2l6ZTsKKwkJV1JJVEU2NChkdW1teTY0KTsKKwl9CisJaWYgKGJtdmFsMSAmIEZBVFRSNF9XT1JEMV9TUEFDRV9GUkVFKSB7CisJCWlmICgoYnVmbGVuIC09IDgpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlkdW1teTY0ID0gKHU2NClzdGF0ZnMuZl9iZnJlZSAqICh1NjQpc3RhdGZzLmZfYnNpemU7CisJCVdSSVRFNjQoZHVtbXk2NCk7CisJfQorCWlmIChibXZhbDEgJiBGQVRUUjRfV09SRDFfU1BBQ0VfVE9UQUwpIHsKKwkJaWYgKChidWZsZW4gLT0gOCkgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCWR1bW15NjQgPSAodTY0KXN0YXRmcy5mX2Jsb2NrcyAqICh1NjQpc3RhdGZzLmZfYnNpemU7CisJCVdSSVRFNjQoZHVtbXk2NCk7CisJfQorCWlmIChibXZhbDEgJiBGQVRUUjRfV09SRDFfU1BBQ0VfVVNFRCkgeworCQlpZiAoKGJ1ZmxlbiAtPSA4KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJZHVtbXk2NCA9ICh1NjQpc3RhdC5ibG9ja3MgPDwgOTsKKwkJV1JJVEU2NChkdW1teTY0KTsKKwl9CisJaWYgKGJtdmFsMSAmIEZBVFRSNF9XT1JEMV9USU1FX0FDQ0VTUykgeworCQlpZiAoKGJ1ZmxlbiAtPSAxMikgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCVdSSVRFMzIoMCk7CisJCVdSSVRFMzIoc3RhdC5hdGltZS50dl9zZWMpOworCQlXUklURTMyKHN0YXQuYXRpbWUudHZfbnNlYyk7CisJfQorCWlmIChibXZhbDEgJiBGQVRUUjRfV09SRDFfVElNRV9ERUxUQSkgeworCQlpZiAoKGJ1ZmxlbiAtPSAxMikgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCVdSSVRFMzIoMCk7CisJCVdSSVRFMzIoMSk7CisJCVdSSVRFMzIoMCk7CisJfQorCWlmIChibXZhbDEgJiBGQVRUUjRfV09SRDFfVElNRV9NRVRBREFUQSkgeworCQlpZiAoKGJ1ZmxlbiAtPSAxMikgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCVdSSVRFMzIoMCk7CisJCVdSSVRFMzIoc3RhdC5jdGltZS50dl9zZWMpOworCQlXUklURTMyKHN0YXQuY3RpbWUudHZfbnNlYyk7CisJfQorCWlmIChibXZhbDEgJiBGQVRUUjRfV09SRDFfVElNRV9NT0RJRlkpIHsKKwkJaWYgKChidWZsZW4gLT0gMTIpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTMyKDApOworCQlXUklURTMyKHN0YXQubXRpbWUudHZfc2VjKTsKKwkJV1JJVEUzMihzdGF0Lm10aW1lLnR2X25zZWMpOworCX0KKwlpZiAoYm12YWwxICYgRkFUVFI0X1dPUkQxX01PVU5URURfT05fRklMRUlEKSB7CisJCXN0cnVjdCBkZW50cnkgKm1udF9wbnQsICptbnRfcm9vdDsKKworCQlpZiAoKGJ1ZmxlbiAtPSA4KSA8IDApCisgICAgICAgICAgICAgICAgCWdvdG8gb3V0X3Jlc291cmNlOworCQltbnRfcm9vdCA9IGV4cC0+ZXhfbW50LT5tbnRfcm9vdDsKKwkJaWYgKG1udF9yb290LT5kX2lub2RlID09IGRlbnRyeS0+ZF9pbm9kZSkgeworCQkJbW50X3BudCA9IGV4cC0+ZXhfbW50LT5tbnRfbW91bnRwb2ludDsKKwkJCVdSSVRFNjQoKHU2NCkgbW50X3BudC0+ZF9pbm9kZS0+aV9pbm8pOworCQl9IGVsc2UKKyAgICAgICAgICAgICAgICAJV1JJVEU2NCgodTY0KSBzdGF0Lmlubyk7CisJfQorCSphdHRybGVucCA9IGh0b25sKChjaGFyICopcCAtIChjaGFyICopYXR0cmxlbnAgLSA0KTsKKwkqY291bnRwID0gcCAtIGJ1ZmZlcjsKKwlzdGF0dXMgPSBuZnNfb2s7CisKK291dDoKKwluZnM0X2FjbF9mcmVlKGFjbCk7CisJaWYgKGZocCA9PSAmdGVtcGZoKQorCQlmaF9wdXQoJnRlbXBmaCk7CisJcmV0dXJuIHN0YXR1czsKK291dF9uZnNlcnI6CisJc3RhdHVzID0gbmZzZXJybm8oc3RhdHVzKTsKKwlnb3RvIG91dDsKK291dF9yZXNvdXJjZToKKwkqY291bnRwID0gMDsKKwlzdGF0dXMgPSBuZnNlcnJfcmVzb3VyY2U7CisJZ290byBvdXQ7CitvdXRfc2VydmVyZmF1bHQ6CisJc3RhdHVzID0gbmZzZXJyX3NlcnZlcmZhdWx0OworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50CituZnNkNF9lbmNvZGVfZGlyZW50X2ZhdHRyKHN0cnVjdCBuZnNkNF9yZWFkZGlyICpjZCwKKwkJY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWxlbiwgdTMyICpwLCBpbnQgKmJ1ZmxlbikKK3sKKwlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwID0gY2QtPnJkX2ZocC0+ZmhfZXhwb3J0OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlpbnQgbmZzZXJyOworCisJZGVudHJ5ID0gbG9va3VwX29uZV9sZW4obmFtZSwgY2QtPnJkX2ZocC0+ZmhfZGVudHJ5LCBuYW1sZW4pOworCWlmIChJU19FUlIoZGVudHJ5KSkKKwkJcmV0dXJuIG5mc2Vycm5vKFBUUl9FUlIoZGVudHJ5KSk7CisKKwlleHBfZ2V0KGV4cCk7CisJaWYgKGRfbW91bnRwb2ludChkZW50cnkpKSB7CisJCWlmIChuZnNkX2Nyb3NzX21udChjZC0+cmRfcnFzdHAsICZkZW50cnksICZleHApKSB7CisJCS8qCisJCSAqIC1FQUdBSU4gaXMgdGhlIG9ubHkgZXJyb3IgcmV0dXJuZWQgZnJvbQorCQkgKiBuZnNkX2Nyb3NzX21udCgpIGFuZCBpdCBpbmRpY2F0ZXMgdGhhdCBhbgorCQkgKiB1cC1jYWxsIGhhcyAgYmVlbiBpbml0aWF0ZWQgdG8gZmlsbCBpbiB0aGUgZXhwb3J0CisJCSAqIG9wdGlvbnMgb24gZXhwLiAgV2hlbiB0aGUgYW5zd2VyIGNvbWVzIGJhY2ssCisJCSAqIHRoaXMgY2FsbCB3aWxsIGJlIHJldHJpZWQuCisJCSAqLworCQkJbmZzZXJyID0gbmZzZXJyX2Ryb3BpdDsKKwkJCWdvdG8gb3V0X3B1dDsKKwkJfQorCisJfQorCW5mc2VyciA9IG5mc2Q0X2VuY29kZV9mYXR0cihOVUxMLCBleHAsIGRlbnRyeSwgcCwgYnVmbGVuLCBjZC0+cmRfYm12YWwsCisJCQkJCWNkLT5yZF9ycXN0cCk7CitvdXRfcHV0OgorCWRwdXQoZGVudHJ5KTsKKwlleHBfcHV0KGV4cCk7CisJcmV0dXJuIG5mc2VycjsKK30KKworc3RhdGljIHUzMiAqCituZnNkNF9lbmNvZGVfcmRhdHRyX2Vycm9yKHUzMiAqcCwgaW50IGJ1ZmxlbiwgaW50IG5mc2VycikKK3sKKwl1MzIgKmF0dHJsZW5wOworCisJaWYgKGJ1ZmxlbiA8IDYpCisJCXJldHVybiBOVUxMOworCSpwKysgPSBodG9ubCgyKTsKKwkqcCsrID0gaHRvbmwoRkFUVFI0X1dPUkQwX1JEQVRUUl9FUlJPUik7IC8qIGJtdmFsMCAqLworCSpwKysgPSBodG9ubCgwKTsJCQkgLyogYm12YWwxICovCisKKwlhdHRybGVucCA9IHArKzsKKwkqcCsrID0gbmZzZXJyOyAgICAgICAvKiBubyBodG9ubCAqLworCSphdHRybGVucCA9IGh0b25sKChjaGFyICopcCAtIChjaGFyICopYXR0cmxlbnAgLSA0KTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGludAorbmZzZDRfZW5jb2RlX2RpcmVudChzdHJ1Y3QgcmVhZGRpcl9jZCAqY2NkLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLAorCQkgICAgbG9mZl90IG9mZnNldCwgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQoreworCXN0cnVjdCBuZnNkNF9yZWFkZGlyICpjZCA9IGNvbnRhaW5lcl9vZihjY2QsIHN0cnVjdCBuZnNkNF9yZWFkZGlyLCBjb21tb24pOworCWludCBidWZsZW47CisJdTMyICpwID0gY2QtPmJ1ZmZlcjsKKwlpbnQgbmZzZXJyID0gbmZzZXJyX3Rvb3NtYWxsOworCisJLyogSW4gbmZzdjQsICIuIiBhbmQgIi4uIiBuZXZlciBtYWtlIGl0IG9udG8gdGhlIHdpcmUuLiAqLworCWlmIChuYW1lICYmIGlzZG90ZW50KG5hbWUsIG5hbWxlbikpIHsKKwkJY2QtPmNvbW1vbi5lcnIgPSBuZnNfb2s7CisJCXJldHVybiAwOworCX0KKworCWlmIChjZC0+b2Zmc2V0KQorCQl4ZHJfZW5jb2RlX2h5cGVyKGNkLT5vZmZzZXQsICh1NjQpIG9mZnNldCk7CisKKwlidWZsZW4gPSBjZC0+YnVmbGVuIC0gNCAtIFhEUl9RVUFETEVOKG5hbWxlbik7CisJaWYgKGJ1ZmxlbiA8IDApCisJCWdvdG8gZmFpbDsKKworCSpwKysgPSB4ZHJfb25lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFyayBlbnRyeSBwcmVzZW50ICovCisJY2QtPm9mZnNldCA9IHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1lbWJlciBwb2ludGVyICovCisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgTkZTX09GRlNFVF9NQVgpOyAgICAvKiBvZmZzZXQgb2YgbmV4dCBlbnRyeSAqLworCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIG5hbWUsIG5hbWxlbik7ICAgICAgLyogbmFtZSBsZW5ndGggJiBuYW1lICovCisKKwluZnNlcnIgPSBuZnNkNF9lbmNvZGVfZGlyZW50X2ZhdHRyKGNkLCBuYW1lLCBuYW1sZW4sIHAsICZidWZsZW4pOworCXN3aXRjaCAobmZzZXJyKSB7CisJY2FzZSBuZnNfb2s6CisJCXAgKz0gYnVmbGVuOworCQlicmVhazsKKwljYXNlIG5mc2Vycl9yZXNvdXJjZToKKwkJbmZzZXJyID0gbmZzZXJyX3Rvb3NtYWxsOworCQlnb3RvIGZhaWw7CisJY2FzZSBuZnNlcnJfZHJvcGl0OgorCQlnb3RvIGZhaWw7CisJZGVmYXVsdDoKKwkJLyoKKwkJICogSWYgdGhlIGNsaWVudCByZXF1ZXN0ZWQgdGhlIFJEQVRUUl9FUlJPUiBhdHRyaWJ1dGUsCisJCSAqIHdlIHN0dWZmIHRoZSBlcnJvciBjb2RlIGludG8gdGhpcyBhdHRyaWJ1dGUKKwkJICogYW5kIGNvbnRpbnVlLiAgSWYgdGhpcyBhdHRyaWJ1dGUgd2FzIG5vdCByZXF1ZXN0ZWQsCisJCSAqIHRoZW4gaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBzcGVjLCB3ZSBmYWlsIHRoZQorCQkgKiBlbnRpcmUgUkVBRERJUiBvcGVyYXRpb24oISkKKwkJICovCisJCWlmICghKGNkLT5yZF9ibXZhbFswXSAmIEZBVFRSNF9XT1JEMF9SREFUVFJfRVJST1IpKQorCQkJZ290byBmYWlsOworCQluZnNlcnIgPSBuZnNlcnJfdG9vc21hbGw7CisJCXAgPSBuZnNkNF9lbmNvZGVfcmRhdHRyX2Vycm9yKHAsIGJ1ZmxlbiwgbmZzZXJyKTsKKwkJaWYgKHAgPT0gTlVMTCkKKwkJCWdvdG8gZmFpbDsKKwl9CisJY2QtPmJ1ZmxlbiAtPSAocCAtIGNkLT5idWZmZXIpOworCWNkLT5idWZmZXIgPSBwOworCWNkLT5jb21tb24uZXJyID0gbmZzX29rOworCXJldHVybiAwOworZmFpbDoKKwljZC0+Y29tbW9uLmVyciA9IG5mc2VycjsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQKK25mc2Q0X2VuY29kZV9hY2Nlc3Moc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfYWNjZXNzICphY2Nlc3MpCit7CisJRU5DT0RFX0hFQUQ7CisKKwlpZiAoIW5mc2VycikgeworCQlSRVNFUlZFX1NQQUNFKDgpOworCQlXUklURTMyKGFjY2Vzcy0+YWNfc3VwcG9ydGVkKTsKKwkJV1JJVEUzMihhY2Nlc3MtPmFjX3Jlc3BfYWNjZXNzKTsKKwkJQURKVVNUX0FSR1MoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCituZnNkNF9lbmNvZGVfY2xvc2Uoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfY2xvc2UgKmNsb3NlKQoreworCUVOQ09ERV9TRVFJRF9PUF9IRUFEOworCisJaWYgKCFuZnNlcnIpIHsKKwkJUkVTRVJWRV9TUEFDRShzaXplb2Yoc3RhdGVpZF90KSk7CisJCVdSSVRFMzIoY2xvc2UtPmNsX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7CisJCVdSSVRFTUVNKCZjbG9zZS0+Y2xfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisJCUFESlVTVF9BUkdTKCk7CisJfQorCUVOQ09ERV9TRVFJRF9PUF9UQUlMKGNsb3NlLT5jbF9zdGF0ZW93bmVyKTsKK30KKworCitzdGF0aWMgdm9pZAorbmZzZDRfZW5jb2RlX2NvbW1pdChzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9jb21taXQgKmNvbW1pdCkKK3sKKwlFTkNPREVfSEVBRDsKKworCWlmICghbmZzZXJyKSB7CisJCVJFU0VSVkVfU1BBQ0UoOCk7CisJCVdSSVRFTUVNKGNvbW1pdC0+Y29fdmVyZi5kYXRhLCA4KTsKKwkJQURKVVNUX0FSR1MoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCituZnNkNF9lbmNvZGVfY3JlYXRlKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X2NyZWF0ZSAqY3JlYXRlKQoreworCUVOQ09ERV9IRUFEOworCisJaWYgKCFuZnNlcnIpIHsKKwkJUkVTRVJWRV9TUEFDRSgzMik7CisJCVdSSVRFQ0lORk8oY3JlYXRlLT5jcl9jaW5mbyk7CisJCVdSSVRFMzIoMik7CisJCVdSSVRFMzIoY3JlYXRlLT5jcl9ibXZhbFswXSk7CisJCVdSSVRFMzIoY3JlYXRlLT5jcl9ibXZhbFsxXSk7CisJCUFESlVTVF9BUkdTKCk7CisJfQorfQorCitzdGF0aWMgaW50CituZnNkNF9lbmNvZGVfZ2V0YXR0cihzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9nZXRhdHRyICpnZXRhdHRyKQoreworCXN0cnVjdCBzdmNfZmggKmZocCA9IGdldGF0dHItPmdhX2ZocDsKKwlpbnQgYnVmbGVuOworCisJaWYgKG5mc2VycikKKwkJcmV0dXJuIG5mc2VycjsKKworCWJ1ZmxlbiA9IHJlc3AtPmVuZCAtIHJlc3AtPnAgLSAoQ09NUE9VTkRfRVJSX1NMQUNLX1NQQUNFID4+IDIpOworCW5mc2VyciA9IG5mc2Q0X2VuY29kZV9mYXR0cihmaHAsIGZocC0+ZmhfZXhwb3J0LCBmaHAtPmZoX2RlbnRyeSwKKwkJCQkgICAgcmVzcC0+cCwgJmJ1ZmxlbiwgZ2V0YXR0ci0+Z2FfYm12YWwsCisJCQkJICAgIHJlc3AtPnJxc3RwKTsKKworCWlmICghbmZzZXJyKQorCQlyZXNwLT5wICs9IGJ1ZmxlbjsKKwlyZXR1cm4gbmZzZXJyOworfQorCitzdGF0aWMgdm9pZAorbmZzZDRfZW5jb2RlX2dldGZoKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IHN2Y19maCAqZmhwKQoreworCXVuc2lnbmVkIGludCBsZW47CisJRU5DT0RFX0hFQUQ7CisKKwlpZiAoIW5mc2VycikgeworCQlsZW4gPSBmaHAtPmZoX2hhbmRsZS5maF9zaXplOworCQlSRVNFUlZFX1NQQUNFKGxlbiArIDQpOworCQlXUklURTMyKGxlbik7CisJCVdSSVRFTUVNKCZmaHAtPmZoX2hhbmRsZS5maF9iYXNlLCBsZW4pOworCQlBREpVU1RfQVJHUygpOworCX0KK30KKworLyoKKyogSW5jbHVkaW5nIGFsbCBmaWVsZHMgb3RoZXIgdGhhbiB0aGUgbmFtZSwgYSBMT0NLNGRlbmllZCBzdHJ1Y3R1cmUgcmVxdWlyZXMKKyogICA4KGNsaWVudGlkKSArIDQobmFtZWxlbikgKyA4KG9mZnNldCkgKyA4KGxlbmd0aCkgKyA0KHR5cGUpID0gMzIgYnl0ZXMuCisqLworc3RhdGljIHZvaWQKK25mc2Q0X2VuY29kZV9sb2NrX2RlbmllZChzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIHN0cnVjdCBuZnNkNF9sb2NrX2RlbmllZCAqbGQpCit7CisJRU5DT0RFX0hFQUQ7CisKKwlSRVNFUlZFX1NQQUNFKDMyICsgWERSX0xFTihsZC0+bGRfc29wID8gbGQtPmxkX3NvcC0+c29fb3duZXIubGVuIDogMCkpOworCVdSSVRFNjQobGQtPmxkX3N0YXJ0KTsKKwlXUklURTY0KGxkLT5sZF9sZW5ndGgpOworCVdSSVRFMzIobGQtPmxkX3R5cGUpOworCWlmIChsZC0+bGRfc29wKSB7CisJCVdSSVRFTUVNKCZsZC0+bGRfY2xpZW50aWQsIDgpOworCQlXUklURTMyKGxkLT5sZF9zb3AtPnNvX293bmVyLmxlbik7CisJCVdSSVRFTUVNKGxkLT5sZF9zb3AtPnNvX293bmVyLmRhdGEsIGxkLT5sZF9zb3AtPnNvX293bmVyLmxlbik7CisJCWtyZWZfcHV0KCZsZC0+bGRfc29wLT5zb19yZWYsIG5mczRfZnJlZV9zdGF0ZW93bmVyKTsKKwl9ICBlbHNlIHsgIC8qIG5vbiAtIG5mc3Y0IGxvY2sgaW4gY29uZmxpY3QsIG5vIGNsaWVudGlkIG5vciBvd25lciAqLworCQlXUklURTY0KCh1NjQpMCk7IC8qIGNsaWVudGlkICovCisJCVdSSVRFMzIoMCk7IC8qIGxlbmd0aCBvZiBvd25lciBuYW1lICovCisJfQorCUFESlVTVF9BUkdTKCk7Cit9CisKK3N0YXRpYyB2b2lkCituZnNkNF9lbmNvZGVfbG9jayhzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9sb2NrICpsb2NrKQoreworCisJRU5DT0RFX1NFUUlEX09QX0hFQUQ7CisKKwlpZiAoIW5mc2VycikgeworCQlSRVNFUlZFX1NQQUNFKDQgKyBzaXplb2Yoc3RhdGVpZF90KSk7CisJCVdSSVRFMzIobG9jay0+bGtfcmVzcF9zdGF0ZWlkLnNpX2dlbmVyYXRpb24pOworCQlXUklURU1FTSgmbG9jay0+bGtfcmVzcF9zdGF0ZWlkLnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKKwkJQURKVVNUX0FSR1MoKTsKKwl9IGVsc2UgaWYgKG5mc2VyciA9PSBuZnNlcnJfZGVuaWVkKQorCQluZnNkNF9lbmNvZGVfbG9ja19kZW5pZWQocmVzcCwgJmxvY2stPmxrX2RlbmllZCk7CisKKwlFTkNPREVfU0VRSURfT1BfVEFJTChsb2NrLT5sa19zdGF0ZW93bmVyKTsKK30KKworc3RhdGljIHZvaWQKK25mc2Q0X2VuY29kZV9sb2NrdChzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9sb2NrdCAqbG9ja3QpCit7CisJaWYgKG5mc2VyciA9PSBuZnNlcnJfZGVuaWVkKQorCQluZnNkNF9lbmNvZGVfbG9ja19kZW5pZWQocmVzcCwgJmxvY2t0LT5sdF9kZW5pZWQpOworfQorCitzdGF0aWMgdm9pZAorbmZzZDRfZW5jb2RlX2xvY2t1KHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X2xvY2t1ICpsb2NrdSkKK3sKKwlFTkNPREVfU0VRSURfT1BfSEVBRDsKKworCWlmICghbmZzZXJyKSB7CisJCVJFU0VSVkVfU1BBQ0Uoc2l6ZW9mKHN0YXRlaWRfdCkpOworCQlXUklURTMyKGxvY2t1LT5sdV9zdGF0ZWlkLnNpX2dlbmVyYXRpb24pOworCQlXUklURU1FTSgmbG9ja3UtPmx1X3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCQlBREpVU1RfQVJHUygpOworCX0KKwkJCQkgICAgICAgIAorCUVOQ09ERV9TRVFJRF9PUF9UQUlMKGxvY2t1LT5sdV9zdGF0ZW93bmVyKTsKK30KKworCitzdGF0aWMgdm9pZAorbmZzZDRfZW5jb2RlX2xpbmsoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfbGluayAqbGluaykKK3sKKwlFTkNPREVfSEVBRDsKKworCWlmICghbmZzZXJyKSB7CisJCVJFU0VSVkVfU1BBQ0UoMjApOworCQlXUklURUNJTkZPKGxpbmstPmxpX2NpbmZvKTsKKwkJQURKVVNUX0FSR1MoKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQKK25mc2Q0X2VuY29kZV9vcGVuKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pCit7CisJRU5DT0RFX1NFUUlEX09QX0hFQUQ7CisKKwlpZiAobmZzZXJyKQorCQlnb3RvIG91dDsKKworCVJFU0VSVkVfU1BBQ0UoMzYgKyBzaXplb2Yoc3RhdGVpZF90KSk7CisJV1JJVEUzMihvcGVuLT5vcF9zdGF0ZWlkLnNpX2dlbmVyYXRpb24pOworCVdSSVRFTUVNKCZvcGVuLT5vcF9zdGF0ZWlkLnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKKwlXUklURUNJTkZPKG9wZW4tPm9wX2NpbmZvKTsKKwlXUklURTMyKG9wZW4tPm9wX3JmbGFncyk7CisJV1JJVEUzMigyKTsKKwlXUklURTMyKG9wZW4tPm9wX2JtdmFsWzBdKTsKKwlXUklURTMyKG9wZW4tPm9wX2JtdmFsWzFdKTsKKwlXUklURTMyKG9wZW4tPm9wX2RlbGVnYXRlX3R5cGUpOworCUFESlVTVF9BUkdTKCk7CisKKwlzd2l0Y2ggKG9wZW4tPm9wX2RlbGVnYXRlX3R5cGUpIHsKKwljYXNlIE5GUzRfT1BFTl9ERUxFR0FURV9OT05FOgorCQlicmVhazsKKwljYXNlIE5GUzRfT1BFTl9ERUxFR0FURV9SRUFEOgorCQlSRVNFUlZFX1NQQUNFKDIwICsgc2l6ZW9mKHN0YXRlaWRfdCkpOworCQlXUklURU1FTSgmb3Blbi0+b3BfZGVsZWdhdGVfc3RhdGVpZCwgc2l6ZW9mKHN0YXRlaWRfdCkpOworCQlXUklURTMyKDApOworCisJCS8qCisJCSAqIFRPRE86IEFDRSdzIGluIGRlbGVnYXRpb25zCisJCSAqLworCQlXUklURTMyKE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFKTsKKwkJV1JJVEUzMigwKTsKKwkJV1JJVEUzMigwKTsKKwkJV1JJVEUzMigwKTsgICAvKiBYWFg6IGlzIE5VTEwgcHJpbmNpcGFsIG9rPyAqLworCQlBREpVU1RfQVJHUygpOworCQlicmVhazsKKwljYXNlIE5GUzRfT1BFTl9ERUxFR0FURV9XUklURToKKwkJUkVTRVJWRV9TUEFDRSgzMiArIHNpemVvZihzdGF0ZWlkX3QpKTsKKwkJV1JJVEVNRU0oJm9wZW4tPm9wX2RlbGVnYXRlX3N0YXRlaWQsIHNpemVvZihzdGF0ZWlkX3QpKTsKKwkJV1JJVEUzMigwKTsKKworCQkvKgorCQkgKiBUT0RPOiBzcGFjZV9saW1pdCdzIGluIGRlbGVnYXRpb25zCisJCSAqLworCQlXUklURTMyKE5GUzRfTElNSVRfU0laRSk7CisJCVdSSVRFMzIofih1MzIpMCk7CisJCVdSSVRFMzIofih1MzIpMCk7CisKKwkJLyoKKwkJICogVE9ETzogQUNFJ3MgaW4gZGVsZWdhdGlvbnMKKwkJICovCisJCVdSSVRFMzIoTkZTNF9BQ0VfQUNDRVNTX0FMTE9XRURfQUNFX1RZUEUpOworCQlXUklURTMyKDApOworCQlXUklURTMyKDApOworCQlXUklURTMyKDApOyAgIC8qIFhYWDogaXMgTlVMTCBwcmluY2lwYWwgb2s/ICovCisJCUFESlVTVF9BUkdTKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKwkvKiBYWFggc2F2ZSBmaWxlaGFuZGxlIGhlcmUgKi8KK291dDoKKwlFTkNPREVfU0VRSURfT1BfVEFJTChvcGVuLT5vcF9zdGF0ZW93bmVyKTsKK30KKworc3RhdGljIHZvaWQKK25mc2Q0X2VuY29kZV9vcGVuX2NvbmZpcm0oc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfb3Blbl9jb25maXJtICpvYykKK3sKKwlFTkNPREVfU0VRSURfT1BfSEVBRDsKKwkJCQkgICAgICAgIAorCWlmICghbmZzZXJyKSB7CisJCVJFU0VSVkVfU1BBQ0Uoc2l6ZW9mKHN0YXRlaWRfdCkpOworCQlXUklURTMyKG9jLT5vY19yZXNwX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7CisJCVdSSVRFTUVNKCZvYy0+b2NfcmVzcF9zdGF0ZWlkLnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKKwkJQURKVVNUX0FSR1MoKTsKKwl9CisKKwlFTkNPREVfU0VRSURfT1BfVEFJTChvYy0+b2Nfc3RhdGVvd25lcik7Cit9CisKK3N0YXRpYyB2b2lkCituZnNkNF9lbmNvZGVfb3Blbl9kb3duZ3JhZGUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfb3Blbl9kb3duZ3JhZGUgKm9kKQoreworCUVOQ09ERV9TRVFJRF9PUF9IRUFEOworCQkJCSAgICAgICAgCisJaWYgKCFuZnNlcnIpIHsKKwkJUkVTRVJWRV9TUEFDRShzaXplb2Yoc3RhdGVpZF90KSk7CisJCVdSSVRFMzIob2QtPm9kX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7CisJCVdSSVRFTUVNKCZvZC0+b2Rfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisJCUFESlVTVF9BUkdTKCk7CisJfQorCisJRU5DT0RFX1NFUUlEX09QX1RBSUwob2QtPm9kX3N0YXRlb3duZXIpOworfQorCitzdGF0aWMgaW50CituZnNkNF9lbmNvZGVfcmVhZChzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9yZWFkICpyZWFkKQoreworCXUzMiBlb2Y7CisJaW50IHYsIHBuOworCXVuc2lnbmVkIGxvbmcgbWF4Y291bnQ7IAorCWxvbmcgbGVuOworCUVOQ09ERV9IRUFEOworCisJaWYgKG5mc2VycikKKwkJcmV0dXJuIG5mc2VycjsKKwlpZiAocmVzcC0+eGJ1Zi0+cGFnZV9sZW4pCisJCXJldHVybiBuZnNlcnJfcmVzb3VyY2U7CisKKwlSRVNFUlZFX1NQQUNFKDgpOyAvKiBlb2YgZmxhZyBhbmQgYnl0ZSBjb3VudCAqLworCisJbWF4Y291bnQgPSBORlNTVkNfTUFYQkxLU0laRTsKKwlpZiAobWF4Y291bnQgPiByZWFkLT5yZF9sZW5ndGgpCisJCW1heGNvdW50ID0gcmVhZC0+cmRfbGVuZ3RoOworCisJbGVuID0gbWF4Y291bnQ7CisJdiA9IDA7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJcG4gPSByZXNwLT5ycXN0cC0+cnFfcmVzdXNlZDsKKwkJc3ZjX3Rha2VfcGFnZShyZXNwLT5ycXN0cCk7CisJCXJlYWQtPnJkX2lvdlt2XS5pb3ZfYmFzZSA9IHBhZ2VfYWRkcmVzcyhyZXNwLT5ycXN0cC0+cnFfcmVzcGFnZXNbcG5dKTsKKwkJcmVhZC0+cmRfaW92W3ZdLmlvdl9sZW4gPSBsZW4gPCBQQUdFX1NJWkUgPyBsZW4gOiBQQUdFX1NJWkU7CisJCXYrKzsKKwkJbGVuIC09IFBBR0VfU0laRTsKKwl9CisJcmVhZC0+cmRfdmxlbiA9IHY7CisKKwluZnNlcnIgPSBuZnNkX3JlYWQocmVhZC0+cmRfcnFzdHAsIHJlYWQtPnJkX2ZocCwgcmVhZC0+cmRfZmlscCwKKwkJCXJlYWQtPnJkX29mZnNldCwgcmVhZC0+cmRfaW92LCByZWFkLT5yZF92bGVuLAorCQkJJm1heGNvdW50KTsKKworCWlmIChuZnNlcnIgPT0gbmZzZXJyX3N5bWxpbmspCisJCW5mc2VyciA9IG5mc2Vycl9pbnZhbDsKKwlpZiAobmZzZXJyKQorCQlyZXR1cm4gbmZzZXJyOworCWVvZiA9IChyZWFkLT5yZF9vZmZzZXQgKyBtYXhjb3VudCA+PSByZWFkLT5yZF9maHAtPmZoX2RlbnRyeS0+ZF9pbm9kZS0+aV9zaXplKTsKKworCVdSSVRFMzIoZW9mKTsKKwlXUklURTMyKG1heGNvdW50KTsKKwlBREpVU1RfQVJHUygpOworCXJlc3AtPnhidWYtPmhlYWRbMF0uaW92X2xlbiA9ICgoY2hhciopcmVzcC0+cCkgLSAoY2hhciopcmVzcC0+eGJ1Zi0+aGVhZFswXS5pb3ZfYmFzZTsKKworCXJlc3AtPnhidWYtPnBhZ2VfbGVuID0gbWF4Y291bnQ7CisKKwkvKiByZWFkIHplcm8gYnl0ZXMgLT4gZG9uJ3Qgc2V0IHVwIHRhaWwgKi8KKwlpZighbWF4Y291bnQpCisJCXJldHVybiAwOyAgICAgICAgCisKKwkvKiBzZXQgdXAgcGFnZSBmb3IgcmVtYWluaW5nIHJlc3BvbnNlcyAqLworCXN2Y190YWtlX3BhZ2UocmVzcC0+cnFzdHApOworCXJlc3AtPnhidWYtPnRhaWxbMF0uaW92X2Jhc2UgPSAKKwkJcGFnZV9hZGRyZXNzKHJlc3AtPnJxc3RwLT5ycV9yZXNwYWdlc1tyZXNwLT5ycXN0cC0+cnFfcmVzdXNlZC0xXSk7CisJcmVzcC0+cnFzdHAtPnJxX3Jlc3RhaWxwYWdlID0gcmVzcC0+cnFzdHAtPnJxX3Jlc3VzZWQtMTsKKwlyZXNwLT54YnVmLT50YWlsWzBdLmlvdl9sZW4gPSAwOworCXJlc3AtPnAgPSByZXNwLT54YnVmLT50YWlsWzBdLmlvdl9iYXNlOworCXJlc3AtPmVuZCA9IHJlc3AtPnAgKyBQQUdFX1NJWkUvNDsKKworCWlmIChtYXhjb3VudCYzKSB7CisJCSoocmVzcC0+cCkrKyA9IDA7CisJCXJlc3AtPnhidWYtPnRhaWxbMF0uaW92X2Jhc2UgKz0gbWF4Y291bnQmMzsKKwkJcmVzcC0+eGJ1Zi0+dGFpbFswXS5pb3ZfbGVuID0gNCAtIChtYXhjb3VudCYzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2VuY29kZV9yZWFkbGluayhzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9yZWFkbGluayAqcmVhZGxpbmspCit7CisJaW50IG1heGNvdW50OworCWNoYXIgKnBhZ2U7CisJRU5DT0RFX0hFQUQ7CisKKwlpZiAobmZzZXJyKQorCQlyZXR1cm4gbmZzZXJyOworCWlmIChyZXNwLT54YnVmLT5wYWdlX2xlbikKKwkJcmV0dXJuIG5mc2Vycl9yZXNvdXJjZTsKKworCXN2Y190YWtlX3BhZ2UocmVzcC0+cnFzdHApOworCXBhZ2UgPSBwYWdlX2FkZHJlc3MocmVzcC0+cnFzdHAtPnJxX3Jlc3BhZ2VzW3Jlc3AtPnJxc3RwLT5ycV9yZXN1c2VkLTFdKTsKKworCW1heGNvdW50ID0gUEFHRV9TSVpFOworCVJFU0VSVkVfU1BBQ0UoNCk7CisKKwkvKgorCSAqIFhYWDogQnkgZGVmYXVsdCwgdGhlIC0+cmVhZGxpbmsoKSBWRlMgb3Agd2lsbCB0cnVuY2F0ZSBzeW1saW5rcworCSAqIGlmIHRoZXkgd291bGQgb3ZlcmZsb3cgdGhlIGJ1ZmZlci4gIElzIHRoaXMga29zaGVyIGluIE5GU3Y0PyAgSWYKKwkgKiBub3QsIG9uZSBlYXN5IGZpeCBpczogaWYgLT5yZWFkbGluaygpIHByZWNpc2VseSBmaWxscyB0aGUgYnVmZmVyLAorCSAqIGFzc3VtZSB0aGF0IHRydW5jYXRpb24gb2NjdXJyZWQsIGFuZCByZXR1cm4gTkZTNEVSUl9SRVNPVVJDRS4KKwkgKi8KKwluZnNlcnIgPSBuZnNkX3JlYWRsaW5rKHJlYWRsaW5rLT5ybF9ycXN0cCwgcmVhZGxpbmstPnJsX2ZocCwgcGFnZSwgJm1heGNvdW50KTsKKwlpZiAobmZzZXJyID09IG5mc2Vycl9pc2RpcikKKwkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKKwlpZiAobmZzZXJyKQorCQlyZXR1cm4gbmZzZXJyOworCisJV1JJVEUzMihtYXhjb3VudCk7CisJQURKVVNUX0FSR1MoKTsKKwlyZXNwLT54YnVmLT5oZWFkWzBdLmlvdl9sZW4gPSAoKGNoYXIqKXJlc3AtPnApIC0gKGNoYXIqKXJlc3AtPnhidWYtPmhlYWRbMF0uaW92X2Jhc2U7CisKKwlzdmNfdGFrZV9wYWdlKHJlc3AtPnJxc3RwKTsKKwlyZXNwLT54YnVmLT50YWlsWzBdLmlvdl9iYXNlID0gCisJCXBhZ2VfYWRkcmVzcyhyZXNwLT5ycXN0cC0+cnFfcmVzcGFnZXNbcmVzcC0+cnFzdHAtPnJxX3Jlc3VzZWQtMV0pOworCXJlc3AtPnJxc3RwLT5ycV9yZXN0YWlscGFnZSA9IHJlc3AtPnJxc3RwLT5ycV9yZXN1c2VkLTE7CisJcmVzcC0+eGJ1Zi0+dGFpbFswXS5pb3ZfbGVuID0gMDsKKwlyZXNwLT5wID0gcmVzcC0+eGJ1Zi0+dGFpbFswXS5pb3ZfYmFzZTsKKwlyZXNwLT5lbmQgPSByZXNwLT5wICsgUEFHRV9TSVpFLzQ7CisKKwlyZXNwLT54YnVmLT5wYWdlX2xlbiA9IG1heGNvdW50OworCWlmIChtYXhjb3VudCYzKSB7CisJCSoocmVzcC0+cCkrKyA9IDA7CisJCXJlc3AtPnhidWYtPnRhaWxbMF0uaW92X2Jhc2UgKz0gbWF4Y291bnQmMzsKKwkJcmVzcC0+eGJ1Zi0+dGFpbFswXS5pb3ZfbGVuID0gNCAtIChtYXhjb3VudCYzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2VuY29kZV9yZWFkZGlyKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X3JlYWRkaXIgKnJlYWRkaXIpCit7CisJaW50IG1heGNvdW50OworCWxvZmZfdCBvZmZzZXQ7CisJdTMyICpwYWdlLCAqc2F2ZXA7CisJRU5DT0RFX0hFQUQ7CisKKwlpZiAobmZzZXJyKQorCQlyZXR1cm4gbmZzZXJyOworCWlmIChyZXNwLT54YnVmLT5wYWdlX2xlbikKKwkJcmV0dXJuIG5mc2Vycl9yZXNvdXJjZTsKKworCVJFU0VSVkVfU1BBQ0UoOCk7ICAvKiB2ZXJpZmllciAqLworCXNhdmVwID0gcDsKKworCS8qIFhYWDogRm9sbG93aW5nIE5GU3YzLCB3ZSBpZ25vcmUgdGhlIFJFQURESVIgdmVyaWZpZXIgZm9yIG5vdy4gKi8KKwlXUklURTMyKDApOworCVdSSVRFMzIoMCk7CisJQURKVVNUX0FSR1MoKTsKKwlyZXNwLT54YnVmLT5oZWFkWzBdLmlvdl9sZW4gPSAoKGNoYXIqKXJlc3AtPnApIC0gKGNoYXIqKXJlc3AtPnhidWYtPmhlYWRbMF0uaW92X2Jhc2U7CisKKwltYXhjb3VudCA9IFBBR0VfU0laRTsKKwlpZiAobWF4Y291bnQgPiByZWFkZGlyLT5yZF9tYXhjb3VudCkKKwkJbWF4Y291bnQgPSByZWFkZGlyLT5yZF9tYXhjb3VudDsKKworCS8qCisJICogQ29udmVydCBmcm9tIGJ5dGVzIHRvIHdvcmRzLCBhY2NvdW50IGZvciB0aGUgdHdvIHdvcmRzIGFscmVhZHkKKwkgKiB3cml0dGVuLCBtYWtlIHN1cmUgdG8gbGVhdmUgdHdvIHdvcmRzIGF0IHRoZSBlbmQgZm9yIHRoZSBuZXh0CisJICogcG9pbnRlciBhbmQgZW9mIGZpZWxkLgorCSAqLworCW1heGNvdW50ID0gKG1heGNvdW50ID4+IDIpIC0gNDsKKwlpZiAobWF4Y291bnQgPCAwKSB7CisJCW5mc2VyciA9ICBuZnNlcnJfdG9vc21hbGw7CisJCWdvdG8gZXJyX25vX3ZlcmY7CisJfQorCisJc3ZjX3Rha2VfcGFnZShyZXNwLT5ycXN0cCk7CisJcGFnZSA9IHBhZ2VfYWRkcmVzcyhyZXNwLT5ycXN0cC0+cnFfcmVzcGFnZXNbcmVzcC0+cnFzdHAtPnJxX3Jlc3VzZWQtMV0pOworCXJlYWRkaXItPmNvbW1vbi5lcnIgPSAwOworCXJlYWRkaXItPmJ1ZmxlbiA9IG1heGNvdW50OworCXJlYWRkaXItPmJ1ZmZlciA9IHBhZ2U7CisJcmVhZGRpci0+b2Zmc2V0ID0gTlVMTDsKKworCW9mZnNldCA9IHJlYWRkaXItPnJkX2Nvb2tpZTsKKwluZnNlcnIgPSBuZnNkX3JlYWRkaXIocmVhZGRpci0+cmRfcnFzdHAsIHJlYWRkaXItPnJkX2ZocCwKKwkJCSAgICAgICZvZmZzZXQsCisJCQkgICAgICAmcmVhZGRpci0+Y29tbW9uLCBuZnNkNF9lbmNvZGVfZGlyZW50KTsKKwlpZiAobmZzZXJyID09IG5mc19vayAmJgorCSAgICByZWFkZGlyLT5jb21tb24uZXJyID09IG5mc2Vycl90b29zbWFsbCAmJgorCSAgICByZWFkZGlyLT5idWZmZXIgPT0gcGFnZSkgCisJCW5mc2VyciA9IG5mc2Vycl90b29zbWFsbDsKKwlpZiAobmZzZXJyID09IG5mc2Vycl9zeW1saW5rKQorCQluZnNlcnIgPSBuZnNlcnJfbm90ZGlyOworCWlmIChuZnNlcnIpCisJCWdvdG8gZXJyX25vX3ZlcmY7CisKKwlpZiAocmVhZGRpci0+b2Zmc2V0KQorCQl4ZHJfZW5jb2RlX2h5cGVyKHJlYWRkaXItPm9mZnNldCwgb2Zmc2V0KTsKKworCXAgPSByZWFkZGlyLT5idWZmZXI7CisJKnArKyA9IDA7CS8qIG5vIG1vcmUgZW50cmllcyAqLworCSpwKysgPSBodG9ubChyZWFkZGlyLT5jb21tb24uZXJyID09IG5mc2Vycl9lb2YpOworCXJlc3AtPnhidWYtPnBhZ2VfbGVuID0gKChjaGFyKilwKSAtIChjaGFyKilwYWdlX2FkZHJlc3MocmVzcC0+cnFzdHAtPnJxX3Jlc3BhZ2VzW3Jlc3AtPnJxc3RwLT5ycV9yZXN1c2VkLTFdKTsKKworCS8qIGFsbG9jYXRlIGEgcGFnZSBmb3IgdGhlIHRhaWwgKi8KKwlzdmNfdGFrZV9wYWdlKHJlc3AtPnJxc3RwKTsKKwlyZXNwLT54YnVmLT50YWlsWzBdLmlvdl9iYXNlID0gCisJCXBhZ2VfYWRkcmVzcyhyZXNwLT5ycXN0cC0+cnFfcmVzcGFnZXNbcmVzcC0+cnFzdHAtPnJxX3Jlc3VzZWQtMV0pOworCXJlc3AtPnJxc3RwLT5ycV9yZXN0YWlscGFnZSA9IHJlc3AtPnJxc3RwLT5ycV9yZXN1c2VkLTE7CisJcmVzcC0+eGJ1Zi0+dGFpbFswXS5pb3ZfbGVuID0gMDsKKwlyZXNwLT5wID0gcmVzcC0+eGJ1Zi0+dGFpbFswXS5pb3ZfYmFzZTsKKwlyZXNwLT5lbmQgPSByZXNwLT5wICsgUEFHRV9TSVpFLzQ7CisKKwlyZXR1cm4gMDsKK2Vycl9ub192ZXJmOgorCXAgPSBzYXZlcDsKKwlBREpVU1RfQVJHUygpOworCXJldHVybiBuZnNlcnI7Cit9CisKK3N0YXRpYyB2b2lkCituZnNkNF9lbmNvZGVfcmVtb3ZlKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X3JlbW92ZSAqcmVtb3ZlKQoreworCUVOQ09ERV9IRUFEOworCisJaWYgKCFuZnNlcnIpIHsKKwkJUkVTRVJWRV9TUEFDRSgyMCk7CisJCVdSSVRFQ0lORk8ocmVtb3ZlLT5ybV9jaW5mbyk7CisJCUFESlVTVF9BUkdTKCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorbmZzZDRfZW5jb2RlX3JlbmFtZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9yZW5hbWUgKnJlbmFtZSkKK3sKKwlFTkNPREVfSEVBRDsKKworCWlmICghbmZzZXJyKSB7CisJCVJFU0VSVkVfU1BBQ0UoNDApOworCQlXUklURUNJTkZPKHJlbmFtZS0+cm5fc2luZm8pOworCQlXUklURUNJTkZPKHJlbmFtZS0+cm5fdGluZm8pOworCQlBREpVU1RfQVJHUygpOworCX0KK30KKworLyoKKyAqIFRoZSBTRVRBVFRSIGVuY29kZSByb3V0aW5lIGlzIHNwZWNpYWwgLS0gaXQgYWx3YXlzIGVuY29kZXMgYSBiaXRtYXAsCisgKiByZWdhcmRsZXNzIG9mIHRoZSBlcnJvciBzdGF0dXMuCisgKi8KK3N0YXRpYyB2b2lkCituZnNkNF9lbmNvZGVfc2V0YXR0cihzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9zZXRhdHRyICpzZXRhdHRyKQoreworCUVOQ09ERV9IRUFEOworCisJUkVTRVJWRV9TUEFDRSgxMik7CisJaWYgKG5mc2VycikgeworCQlXUklURTMyKDIpOworCQlXUklURTMyKDApOworCQlXUklURTMyKDApOworCX0KKwllbHNlIHsKKwkJV1JJVEUzMigyKTsKKwkJV1JJVEUzMihzZXRhdHRyLT5zYV9ibXZhbFswXSk7CisJCVdSSVRFMzIoc2V0YXR0ci0+c2FfYm12YWxbMV0pOworCX0KKwlBREpVU1RfQVJHUygpOworfQorCitzdGF0aWMgdm9pZAorbmZzZDRfZW5jb2RlX3NldGNsaWVudGlkKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X3NldGNsaWVudGlkICpzY2QpCit7CisJRU5DT0RFX0hFQUQ7CisKKwlpZiAoIW5mc2VycikgeworCQlSRVNFUlZFX1NQQUNFKDggKyBzaXplb2YobmZzNF92ZXJpZmllcikpOworCQlXUklURU1FTSgmc2NkLT5zZV9jbGllbnRpZCwgOCk7CisJCVdSSVRFTUVNKCZzY2QtPnNlX2NvbmZpcm0sIHNpemVvZihuZnM0X3ZlcmlmaWVyKSk7CisJCUFESlVTVF9BUkdTKCk7CisJfQorCWVsc2UgaWYgKG5mc2VyciA9PSBuZnNlcnJfY2xpZF9pbnVzZSkgeworCQlSRVNFUlZFX1NQQUNFKDgpOworCQlXUklURTMyKDApOworCQlXUklURTMyKDApOworCQlBREpVU1RfQVJHUygpOworCX0KK30KKworc3RhdGljIHZvaWQKK25mc2Q0X2VuY29kZV93cml0ZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF93cml0ZSAqd3JpdGUpCit7CisJRU5DT0RFX0hFQUQ7CisKKwlpZiAoIW5mc2VycikgeworCQlSRVNFUlZFX1NQQUNFKDE2KTsKKwkJV1JJVEUzMih3cml0ZS0+d3JfYnl0ZXNfd3JpdHRlbik7CisJCVdSSVRFMzIod3JpdGUtPndyX2hvd193cml0dGVuKTsKKwkJV1JJVEVNRU0od3JpdGUtPndyX3ZlcmlmaWVyLmRhdGEsIDgpOworCQlBREpVU1RfQVJHUygpOworCX0KK30KKwordm9pZAorbmZzZDRfZW5jb2RlX29wZXJhdGlvbihzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIHN0cnVjdCBuZnNkNF9vcCAqb3ApCit7CisJdTMyICpzdGF0cDsKKwlFTkNPREVfSEVBRDsKKworCVJFU0VSVkVfU1BBQ0UoOCk7CisJV1JJVEUzMihvcC0+b3BudW0pOworCXN0YXRwID0gcCsrOwkvKiB0byBiZSBiYWNrZmlsbGVkIGF0IHRoZSBlbmQgKi8KKwlBREpVU1RfQVJHUygpOworCisJc3dpdGNoIChvcC0+b3BudW0pIHsKKwljYXNlIE9QX0FDQ0VTUzoKKwkJbmZzZDRfZW5jb2RlX2FjY2VzcyhyZXNwLCBvcC0+c3RhdHVzLCAmb3AtPnUuYWNjZXNzKTsKKwkJYnJlYWs7CisJY2FzZSBPUF9DTE9TRToKKwkJbmZzZDRfZW5jb2RlX2Nsb3NlKHJlc3AsIG9wLT5zdGF0dXMsICZvcC0+dS5jbG9zZSk7CisJCWJyZWFrOworCWNhc2UgT1BfQ09NTUlUOgorCQluZnNkNF9lbmNvZGVfY29tbWl0KHJlc3AsIG9wLT5zdGF0dXMsICZvcC0+dS5jb21taXQpOworCQlicmVhazsKKwljYXNlIE9QX0NSRUFURToKKwkJbmZzZDRfZW5jb2RlX2NyZWF0ZShyZXNwLCBvcC0+c3RhdHVzLCAmb3AtPnUuY3JlYXRlKTsKKwkJYnJlYWs7CisJY2FzZSBPUF9ERUxFR1JFVFVSTjoKKwkJYnJlYWs7CisJY2FzZSBPUF9HRVRBVFRSOgorCQlvcC0+c3RhdHVzID0gbmZzZDRfZW5jb2RlX2dldGF0dHIocmVzcCwgb3AtPnN0YXR1cywgJm9wLT51LmdldGF0dHIpOworCQlicmVhazsKKwljYXNlIE9QX0dFVEZIOgorCQluZnNkNF9lbmNvZGVfZ2V0ZmgocmVzcCwgb3AtPnN0YXR1cywgb3AtPnUuZ2V0ZmgpOworCQlicmVhazsKKwljYXNlIE9QX0xJTks6CisJCW5mc2Q0X2VuY29kZV9saW5rKHJlc3AsIG9wLT5zdGF0dXMsICZvcC0+dS5saW5rKTsKKwkJYnJlYWs7CisJY2FzZSBPUF9MT0NLOgorCQluZnNkNF9lbmNvZGVfbG9jayhyZXNwLCBvcC0+c3RhdHVzLCAmb3AtPnUubG9jayk7CisJCWJyZWFrOworCWNhc2UgT1BfTE9DS1Q6CisJCW5mc2Q0X2VuY29kZV9sb2NrdChyZXNwLCBvcC0+c3RhdHVzLCAmb3AtPnUubG9ja3QpOworCQlicmVhazsKKwljYXNlIE9QX0xPQ0tVOgorCQluZnNkNF9lbmNvZGVfbG9ja3UocmVzcCwgb3AtPnN0YXR1cywgJm9wLT51LmxvY2t1KTsKKwkJYnJlYWs7CisJY2FzZSBPUF9MT09LVVA6CisJCWJyZWFrOworCWNhc2UgT1BfTE9PS1VQUDoKKwkJYnJlYWs7CisJY2FzZSBPUF9OVkVSSUZZOgorCQlicmVhazsKKwljYXNlIE9QX09QRU46CisJCW5mc2Q0X2VuY29kZV9vcGVuKHJlc3AsIG9wLT5zdGF0dXMsICZvcC0+dS5vcGVuKTsKKwkJYnJlYWs7CisJY2FzZSBPUF9PUEVOX0NPTkZJUk06CisJCW5mc2Q0X2VuY29kZV9vcGVuX2NvbmZpcm0ocmVzcCwgb3AtPnN0YXR1cywgJm9wLT51Lm9wZW5fY29uZmlybSk7CisJCWJyZWFrOworCWNhc2UgT1BfT1BFTl9ET1dOR1JBREU6CisJCW5mc2Q0X2VuY29kZV9vcGVuX2Rvd25ncmFkZShyZXNwLCBvcC0+c3RhdHVzLCAmb3AtPnUub3Blbl9kb3duZ3JhZGUpOworCQlicmVhazsKKwljYXNlIE9QX1BVVEZIOgorCQlicmVhazsKKwljYXNlIE9QX1BVVFJPT1RGSDoKKwkJYnJlYWs7CisJY2FzZSBPUF9SRUFEOgorCQlvcC0+c3RhdHVzID0gbmZzZDRfZW5jb2RlX3JlYWQocmVzcCwgb3AtPnN0YXR1cywgJm9wLT51LnJlYWQpOworCQlicmVhazsKKwljYXNlIE9QX1JFQURESVI6CisJCW9wLT5zdGF0dXMgPSBuZnNkNF9lbmNvZGVfcmVhZGRpcihyZXNwLCBvcC0+c3RhdHVzLCAmb3AtPnUucmVhZGRpcik7CisJCWJyZWFrOworCWNhc2UgT1BfUkVBRExJTks6CisJCW9wLT5zdGF0dXMgPSBuZnNkNF9lbmNvZGVfcmVhZGxpbmsocmVzcCwgb3AtPnN0YXR1cywgJm9wLT51LnJlYWRsaW5rKTsKKwkJYnJlYWs7CisJY2FzZSBPUF9SRU1PVkU6CisJCW5mc2Q0X2VuY29kZV9yZW1vdmUocmVzcCwgb3AtPnN0YXR1cywgJm9wLT51LnJlbW92ZSk7CisJCWJyZWFrOworCWNhc2UgT1BfUkVOQU1FOgorCQluZnNkNF9lbmNvZGVfcmVuYW1lKHJlc3AsIG9wLT5zdGF0dXMsICZvcC0+dS5yZW5hbWUpOworCQlicmVhazsKKwljYXNlIE9QX1JFTkVXOgorCQlicmVhazsKKwljYXNlIE9QX1JFU1RPUkVGSDoKKwkJYnJlYWs7CisJY2FzZSBPUF9TQVZFRkg6CisJCWJyZWFrOworCWNhc2UgT1BfU0VUQVRUUjoKKwkJbmZzZDRfZW5jb2RlX3NldGF0dHIocmVzcCwgb3AtPnN0YXR1cywgJm9wLT51LnNldGF0dHIpOworCQlicmVhazsKKwljYXNlIE9QX1NFVENMSUVOVElEOgorCQluZnNkNF9lbmNvZGVfc2V0Y2xpZW50aWQocmVzcCwgb3AtPnN0YXR1cywgJm9wLT51LnNldGNsaWVudGlkKTsKKwkJYnJlYWs7CisJY2FzZSBPUF9TRVRDTElFTlRJRF9DT05GSVJNOgorCQlicmVhazsKKwljYXNlIE9QX1ZFUklGWToKKwkJYnJlYWs7CisJY2FzZSBPUF9XUklURToKKwkJbmZzZDRfZW5jb2RlX3dyaXRlKHJlc3AsIG9wLT5zdGF0dXMsICZvcC0+dS53cml0ZSk7CisJCWJyZWFrOworCWNhc2UgT1BfUkVMRUFTRV9MT0NLT1dORVI6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCS8qCisJICogTm90ZTogV2Ugd3JpdGUgdGhlIHN0YXR1cyBkaXJlY3RseSwgaW5zdGVhZCBvZiB1c2luZyBXUklURTMyKCksCisJICogc2luY2UgaXQgaXMgYWxyZWFkeSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisJICovCisJKnN0YXRwID0gb3AtPnN0YXR1czsKK30KKworLyogCisgKiBFbmNvZGUgdGhlIHJlcGx5IHN0b3JlZCBpbiB0aGUgc3RhdGVvd25lciByZXBseSBjYWNoZSAKKyAqIAorICogWERSIG5vdGU6IGRvIG5vdCBlbmNvZGUgcnAtPnJwX2J1ZmxlbjogdGhlIGJ1ZmZlciBjb250YWlucyB0aGUKKyAqIHByZXZpb3VzbHkgc2VudCBhbHJlYWR5IGVuY29kZWQgb3BlcmF0aW9uLgorICoKKyAqIGNhbGxlZCB3aXRoIG5mczRfbG9ja19zdGF0ZSgpIGhlbGQKKyAqLwordm9pZAorbmZzZDRfZW5jb2RlX3JlcGxheShzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIHN0cnVjdCBuZnNkNF9vcCAqb3ApCit7CisJRU5DT0RFX0hFQUQ7CisJc3RydWN0IG5mczRfcmVwbGF5ICpycCA9IG9wLT5yZXBsYXk7CisKKwlCVUdfT04oIXJwKTsKKworCVJFU0VSVkVfU1BBQ0UoOCk7CisJV1JJVEUzMihvcC0+b3BudW0pOworCSpwKysgPSBycC0+cnBfc3RhdHVzOyAgLyogYWxyZWFkeSB4ZHInZWQgKi8KKwlBREpVU1RfQVJHUygpOworCisJUkVTRVJWRV9TUEFDRShycC0+cnBfYnVmbGVuKTsKKwlXUklURU1FTShycC0+cnBfYnVmLCBycC0+cnBfYnVmbGVuKTsKKwlBREpVU1RfQVJHUygpOworfQorCisvKgorICogRU5EIE9GICJHRU5FUklDIiBFTkNPREUgUk9VVElORVMuCisgKi8KKworaW50CituZnM0c3ZjX2VuY29kZV92b2lkcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgdm9pZCAqZHVtbXkpCit7CisgICAgICAgIHJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK3ZvaWQgbmZzZDRfcmVsZWFzZV9jb21wb3VuZGFyZ3Moc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncykKK3sKKwlpZiAoYXJncy0+b3BzICE9IGFyZ3MtPmlvcHMpIHsKKwkJa2ZyZWUoYXJncy0+b3BzKTsKKwkJYXJncy0+b3BzID0gYXJncy0+aW9wczsKKwl9CisJaWYgKGFyZ3MtPnRtcHApIHsKKwkJa2ZyZWUoYXJncy0+dG1wcCk7CisJCWFyZ3MtPnRtcHAgPSBOVUxMOworCX0KKwl3aGlsZSAoYXJncy0+dG9fZnJlZSkgeworCQlzdHJ1Y3QgdG1wYnVmICp0YiA9IGFyZ3MtPnRvX2ZyZWU7CisJCWFyZ3MtPnRvX2ZyZWUgPSB0Yi0+bmV4dDsKKwkJdGItPnJlbGVhc2UodGItPmJ1Zik7CisJCWtmcmVlKHRiKTsKKwl9Cit9CisKK2ludAorbmZzNHN2Y19kZWNvZGVfY29tcG91bmRhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncykKK3sKKwlpbnQgc3RhdHVzOworCisJYXJncy0+cCA9IHA7CisJYXJncy0+ZW5kID0gcnFzdHAtPnJxX2FyZy5oZWFkWzBdLmlvdl9iYXNlICsgcnFzdHAtPnJxX2FyZy5oZWFkWzBdLmlvdl9sZW47CisJYXJncy0+cGFnZWxpc3QgPSBycXN0cC0+cnFfYXJnLnBhZ2VzOworCWFyZ3MtPnBhZ2VsZW4gPSBycXN0cC0+cnFfYXJnLnBhZ2VfbGVuOworCWFyZ3MtPnRtcHAgPSBOVUxMOworCWFyZ3MtPnRvX2ZyZWUgPSBOVUxMOworCWFyZ3MtPm9wcyA9IGFyZ3MtPmlvcHM7CisJYXJncy0+cnFzdHAgPSBycXN0cDsKKworCXN0YXR1cyA9IG5mc2Q0X2RlY29kZV9jb21wb3VuZChhcmdzKTsKKwlpZiAoc3RhdHVzKSB7CisJCW5mc2Q0X3JlbGVhc2VfY29tcG91bmRhcmdzKGFyZ3MpOworCX0KKwlyZXR1cm4gIXN0YXR1czsKK30KKworaW50CituZnM0c3ZjX2VuY29kZV9jb21wb3VuZHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCkKK3sKKwkvKgorCSAqIEFsbCB0aGF0IHJlbWFpbnMgaXMgdG8gd3JpdGUgdGhlIHRhZyBhbmQgb3BlcmF0aW9uIGNvdW50Li4uCisJICovCisJc3RydWN0IGt2ZWMgKmlvdjsKKwlwID0gcmVzcC0+dGFncDsKKwkqcCsrID0gaHRvbmwocmVzcC0+dGFnbGVuKTsKKwltZW1jcHkocCwgcmVzcC0+dGFnLCByZXNwLT50YWdsZW4pOworCXAgKz0gWERSX1FVQURMRU4ocmVzcC0+dGFnbGVuKTsKKwkqcCsrID0gaHRvbmwocmVzcC0+b3BjbnQpOworCisJaWYgKHJxc3RwLT5ycV9yZXMucGFnZV9sZW4pIAorCQlpb3YgPSAmcnFzdHAtPnJxX3Jlcy50YWlsWzBdOworCWVsc2UKKwkJaW92ID0gJnJxc3RwLT5ycV9yZXMuaGVhZFswXTsKKwlpb3YtPmlvdl9sZW4gPSAoKGNoYXIqKXJlc3AtPnApIC0gKGNoYXIqKWlvdi0+aW92X2Jhc2U7CisJQlVHX09OKGlvdi0+aW92X2xlbiA+IFBBR0VfU0laRSk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNjYWNoZS5jIGIvZnMvbmZzZC9uZnNjYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOWU0ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnNkL25mc2NhY2hlLmMKQEAgLTAsMCArMSwzMjggQEAKKy8qCisgKiBsaW51eC9mcy9uZnNkL25mc2NhY2hlLmMKKyAqCisgKiBSZXF1ZXN0IHJlcGx5IGNhY2hlLiBUaGlzIGlzIGN1cnJlbnRseSBhIGdsb2JhbCBjYWNoZSwgYnV0IHRoaXMgbWF5CisgKiBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSBhbmQgYmUgYSBwZXItY2xpZW50IGNhY2hlLgorICoKKyAqIFRoaXMgY29kZSBpcyBoZWF2aWx5IGluc3BpcmVkIGJ5IHRoZSA0NEJTRCBpbXBsZW1lbnRhdGlvbiwgYWx0aG91Z2gKKyAqIGl0IGRvZXMgdGhpbmdzIGEgYml0IGRpZmZlcmVudGx5LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL2NhY2hlLmg+CisKKy8qIFNpemUgb2YgcmVwbHkgY2FjaGUuIENvbW1vbiB2YWx1ZXMgYXJlOgorICogNC4zQlNEOgkxMjgKKyAqIDQuNEJTRDoJMjU2CisgKiBTb2xhcmlzMjoJMTAyNAorICogREVDIFVuaXg6CTUxMi00MDk2CisgKi8KKyNkZWZpbmUgQ0FDSEVTSVpFCQkxMDI0CisjZGVmaW5lIEhBU0hTSVpFCQk2NAorI2RlZmluZSBSRVFIQVNIKHhpZCkJCSgoKCh4aWQpID4+IDI0KSBeICh4aWQpKSAmIChIQVNIU0laRS0xKSkKKworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICoJaGFzaF9saXN0Oworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgCWxydV9oZWFkOworc3RhdGljIGludAkJCWNhY2hlX2Rpc2FibGVkID0gMTsKKworc3RhdGljIGludAluZnNkX2NhY2hlX2FwcGVuZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qga3ZlYyAqdmVjKTsKKworLyogCisgKiBsb2NraW5nIGZvciB0aGUgcmVwbHkgY2FjaGU6CisgKiBBIGNhY2hlIGVudHJ5IGlzICJzaW5nbGUgdXNlIiBpZiBjX3N0YXRlID09IFJDX0lOUFJPRworICogT3RoZXJ3aXNlLCBpdCB3aGVuIGFjY2Vzc2luZyBfcHJldiBvciBfbmV4dCwgdGhlIGxvY2sgbXVzdCBiZSBoZWxkLgorICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNhY2hlX2xvY2spOworCit2b2lkCituZnNkX2NhY2hlX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc3ZjX2NhY2hlcmVwCSpycDsKKwlpbnQJCQlpOworCisJSU5JVF9MSVNUX0hFQUQoJmxydV9oZWFkKTsKKwlpID0gQ0FDSEVTSVpFOworCXdoaWxlKGkpIHsKKwkJcnAgPSBrbWFsbG9jKHNpemVvZigqcnApLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFycCkgYnJlYWs7CisJCWxpc3RfYWRkKCZycC0+Y19scnUsICZscnVfaGVhZCk7CisJCXJwLT5jX3N0YXRlID0gUkNfVU5VU0VEOworCQlycC0+Y190eXBlID0gUkNfTk9DQUNIRTsKKwkJSU5JVF9ITElTVF9OT0RFKCZycC0+Y19oYXNoKTsKKwkJaS0tOworCX0KKworCWlmIChpKQorCQlwcmludGsgKEtFUk5fRVJSICJuZnNkOiBjYW5ub3QgYWxsb2NhdGUgYWxsICVkIGNhY2hlIGVudHJpZXMsIG9ubHkgZ290ICVkXG4iLAorCQkJQ0FDSEVTSVpFLCBDQUNIRVNJWkUtaSk7CisKKwloYXNoX2xpc3QgPSBrbWFsbG9jIChIQVNIU0laRSAqIHNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCksIEdGUF9LRVJORUwpOworCWlmICghaGFzaF9saXN0KSB7CisJCW5mc2RfY2FjaGVfc2h1dGRvd24oKTsKKwkJcHJpbnRrIChLRVJOX0VSUiAibmZzZDogY2Fubm90IGFsbG9jYXRlICVaZCBieXRlcyBmb3IgaGFzaCBsaXN0XG4iLAorCQkJSEFTSFNJWkUgKiBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpKTsKKwkJcmV0dXJuOworCX0KKwltZW1zZXQoaGFzaF9saXN0LCAwLCBIQVNIU0laRSAqIHNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCkpOworCisJY2FjaGVfZGlzYWJsZWQgPSAwOworfQorCit2b2lkCituZnNkX2NhY2hlX3NodXRkb3duKHZvaWQpCit7CisJc3RydWN0IHN2Y19jYWNoZXJlcAkqcnA7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmxydV9oZWFkKSkgeworCQlycCA9IGxpc3RfZW50cnkobHJ1X2hlYWQubmV4dCwgc3RydWN0IHN2Y19jYWNoZXJlcCwgY19scnUpOworCQlpZiAocnAtPmNfc3RhdGUgPT0gUkNfRE9ORSAmJiBycC0+Y190eXBlID09IFJDX1JFUExCVUZGKQorCQkJa2ZyZWUocnAtPmNfcmVwbHZlYy5pb3ZfYmFzZSk7CisJCWxpc3RfZGVsKCZycC0+Y19scnUpOworCQlrZnJlZShycCk7CisJfQorCisJY2FjaGVfZGlzYWJsZWQgPSAxOworCisJaWYgKGhhc2hfbGlzdCkKKwkJa2ZyZWUgKGhhc2hfbGlzdCk7CisJaGFzaF9saXN0ID0gTlVMTDsKK30KKworLyoKKyAqIE1vdmUgY2FjaGUgZW50cnkgdG8gZW5kIG9mIExSVSBsaXN0CisgKi8KK3N0YXRpYyB2b2lkCitscnVfcHV0X2VuZChzdHJ1Y3Qgc3ZjX2NhY2hlcmVwICpycCkKK3sKKwlsaXN0X2RlbCgmcnAtPmNfbHJ1KTsKKwlsaXN0X2FkZF90YWlsKCZycC0+Y19scnUsICZscnVfaGVhZCk7Cit9CisKKy8qCisgKiBNb3ZlIGEgY2FjaGUgZW50cnkgZnJvbSBvbmUgaGFzaCBsaXN0IHRvIGFub3RoZXIKKyAqLworc3RhdGljIHZvaWQKK2hhc2hfcmVmaWxlKHN0cnVjdCBzdmNfY2FjaGVyZXAgKnJwKQoreworCWhsaXN0X2RlbF9pbml0KCZycC0+Y19oYXNoKTsKKwlobGlzdF9hZGRfaGVhZCgmcnAtPmNfaGFzaCwgaGFzaF9saXN0ICsgUkVRSEFTSChycC0+Y194aWQpKTsKK30KKworLyoKKyAqIFRyeSB0byBmaW5kIGFuIGVudHJ5IG1hdGNoaW5nIHRoZSBjdXJyZW50IGNhbGwgaW4gdGhlIGNhY2hlLiBXaGVuIG5vbmUKKyAqIGlzIGZvdW5kLCB3ZSBncmFiIHRoZSBvbGRlc3QgdW5sb2NrZWQgZW50cnkgb2ZmIHRoZSBMUlUgbGlzdC4KKyAqIE5vdGUgdGhhdCBubyBvcGVyYXRpb24gd2l0aGluIHRoZSBsb29wIG1heSBzbGVlcC4KKyAqLworaW50CituZnNkX2NhY2hlX2xvb2t1cChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgaGxpc3Rfbm9kZQkqaG47CisJc3RydWN0IGhsaXN0X2hlYWQgCSpyaDsKKwlzdHJ1Y3Qgc3ZjX2NhY2hlcmVwCSpycDsKKwl1MzIJCQl4aWQgPSBycXN0cC0+cnFfeGlkLAorCQkJCXByb3RvID0gIHJxc3RwLT5ycV9wcm90LAorCQkJCXZlcnMgPSBycXN0cC0+cnFfdmVycywKKwkJCQlwcm9jID0gcnFzdHAtPnJxX3Byb2M7CisJdW5zaWduZWQgbG9uZwkJYWdlOworCWludCBydG47CisKKwlycXN0cC0+cnFfY2FjaGVyZXAgPSBOVUxMOworCWlmIChjYWNoZV9kaXNhYmxlZCB8fCB0eXBlID09IFJDX05PQ0FDSEUpIHsKKwkJbmZzZHN0YXRzLnJjbm9jYWNoZSsrOworCQlyZXR1cm4gUkNfRE9JVDsKKwl9CisKKwlzcGluX2xvY2soJmNhY2hlX2xvY2spOworCXJ0biA9IFJDX0RPSVQ7CisKKwlyaCA9ICZoYXNoX2xpc3RbUkVRSEFTSCh4aWQpXTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShycCwgaG4sIHJoLCBjX2hhc2gpIHsKKwkJaWYgKHJwLT5jX3N0YXRlICE9IFJDX1VOVVNFRCAmJgorCQkgICAgeGlkID09IHJwLT5jX3hpZCAmJiBwcm9jID09IHJwLT5jX3Byb2MgJiYKKwkJICAgIHByb3RvID09IHJwLT5jX3Byb3QgJiYgdmVycyA9PSBycC0+Y192ZXJzICYmCisJCSAgICB0aW1lX2JlZm9yZShqaWZmaWVzLCBycC0+Y190aW1lc3RhbXAgKyAxMjAqSFopICYmCisJCSAgICBtZW1jbXAoKGNoYXIqKSZycXN0cC0+cnFfYWRkciwgKGNoYXIqKSZycC0+Y19hZGRyLCBzaXplb2YocnAtPmNfYWRkcikpPT0wKSB7CisJCQluZnNkc3RhdHMucmNoaXRzKys7CisJCQlnb3RvIGZvdW5kX2VudHJ5OworCQl9CisJfQorCW5mc2RzdGF0cy5yY21pc3NlcysrOworCisJLyogVGhpcyBsb29wIHNob3VsZG4ndCB0YWtlIG1vcmUgdGhhbiBhIGZldyBpdGVyYXRpb25zIG5vcm1hbGx5ICovCisJeworCWludAlzYWZlID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJwLCAmbHJ1X2hlYWQsIGNfbHJ1KSB7CisJCWlmIChycC0+Y19zdGF0ZSAhPSBSQ19JTlBST0cpCisJCQlicmVhazsKKwkJaWYgKHNhZmUrKyA+IENBQ0hFU0laRSkgeworCQkJcHJpbnRrKCJuZnNkOiBsb29wIGluIHJlcGNhY2hlIExSVSBsaXN0XG4iKTsKKwkJCWNhY2hlX2Rpc2FibGVkID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCX0KKworCS8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwlpZiAocnAgPT0gTlVMTCkgeworCQlzdGF0aWMgaW50CWNvbXBsYWludHM7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibmZzZDogYWxsIHJlcGNhY2hlIGVudHJpZXMgbG9ja2VkIVxuIik7CisJCWlmICgrK2NvbXBsYWludHMgPiA1KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJuZnNkOiBkaXNhYmxpbmcgcmVwY2FjaGUuXG4iKTsKKwkJCWNhY2hlX2Rpc2FibGVkID0gMTsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisKKwlycXN0cC0+cnFfY2FjaGVyZXAgPSBycDsKKwlycC0+Y19zdGF0ZSA9IFJDX0lOUFJPRzsKKwlycC0+Y194aWQgPSB4aWQ7CisJcnAtPmNfcHJvYyA9IHByb2M7CisJcnAtPmNfYWRkciA9IHJxc3RwLT5ycV9hZGRyOworCXJwLT5jX3Byb3QgPSBwcm90bzsKKwlycC0+Y192ZXJzID0gdmVyczsKKwlycC0+Y190aW1lc3RhbXAgPSBqaWZmaWVzOworCisJaGFzaF9yZWZpbGUocnApOworCisJLyogcmVsZWFzZSBhbnkgYnVmZmVyICovCisJaWYgKHJwLT5jX3R5cGUgPT0gUkNfUkVQTEJVRkYpIHsKKwkJa2ZyZWUocnAtPmNfcmVwbHZlYy5pb3ZfYmFzZSk7CisJCXJwLT5jX3JlcGx2ZWMuaW92X2Jhc2UgPSBOVUxMOworCX0KKwlycC0+Y190eXBlID0gUkNfTk9DQUNIRTsKKyBvdXQ6CisJc3Bpbl91bmxvY2soJmNhY2hlX2xvY2spOworCXJldHVybiBydG47CisKK2ZvdW5kX2VudHJ5OgorCS8qIFdlIGZvdW5kIGEgbWF0Y2hpbmcgZW50cnkgd2hpY2ggaXMgZWl0aGVyIGluIHByb2dyZXNzIG9yIGRvbmUuICovCisJYWdlID0gamlmZmllcyAtIHJwLT5jX3RpbWVzdGFtcDsKKwlycC0+Y190aW1lc3RhbXAgPSBqaWZmaWVzOworCWxydV9wdXRfZW5kKHJwKTsKKworCXJ0biA9IFJDX0RST1BJVDsKKwkvKiBSZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZCBvciBleGNlc3NpdmUgcmV4bWl0cyAqLworCWlmIChycC0+Y19zdGF0ZSA9PSBSQ19JTlBST0cgfHwgYWdlIDwgUkNfREVMQVkpCisJCWdvdG8gb3V0OworCisJLyogRnJvbSB0aGUgaGFsbCBvZiBmYW1lIG9mIGltcHJhY3RpY2FsIGF0dGFja3M6CisJICogSXMgdGhpcyBhIHVzZXIgd2hvIHRyaWVzIHRvIHNub29wIG9uIHRoZSBjYWNoZT8gKi8KKwlydG4gPSBSQ19ET0lUOworCWlmICghcnFzdHAtPnJxX3NlY3VyZSAmJiBycC0+Y19zZWN1cmUpCisJCWdvdG8gb3V0OworCisJLyogQ29tcG9zZSBSUEMgcmVwbHkgaGVhZGVyICovCisJc3dpdGNoIChycC0+Y190eXBlKSB7CisJY2FzZSBSQ19OT0NBQ0hFOgorCQlicmVhazsKKwljYXNlIFJDX1JFUExTVEFUOgorCQlzdmNfcHV0dTMyKCZycXN0cC0+cnFfcmVzLmhlYWRbMF0sIHJwLT5jX3JlcGxzdGF0KTsKKwkJcnRuID0gUkNfUkVQTFk7CisJCWJyZWFrOworCWNhc2UgUkNfUkVQTEJVRkY6CisJCWlmICghbmZzZF9jYWNoZV9hcHBlbmQocnFzdHAsICZycC0+Y19yZXBsdmVjKSkKKwkJCWdvdG8gb3V0OwkvKiBzaG91bGQgbm90IGhhcHBlbiAqLworCQlydG4gPSBSQ19SRVBMWTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibmZzZDogYmFkIHJlcGNhY2hlIHR5cGUgJWRcbiIsIHJwLT5jX3R5cGUpOworCQlycC0+Y19zdGF0ZSA9IFJDX1VOVVNFRDsKKwl9CisKKwlnb3RvIG91dDsKK30KKworLyoKKyAqIFVwZGF0ZSBhIGNhY2hlIGVudHJ5LiBUaGlzIGlzIGNhbGxlZCBmcm9tIG5mc2RfZGlzcGF0Y2ggd2hlbgorICogdGhlIHByb2NlZHVyZSBoYXMgYmVlbiBleGVjdXRlZCBhbmQgdGhlIGNvbXBsZXRlIHJlcGx5IGlzIGluCisgKiBycXN0cC0+cnFfcmVzLgorICoKKyAqIFdlJ3JlIGNvcHlpbmcgYXJvdW5kIGRhdGEgaGVyZSByYXRoZXIgdGhhbiBzd2FwcGluZyBidWZmZXJzIGJlY2F1c2UKKyAqIHRoZSB0b3BsZXZlbCBsb29wIHJlcXVpcmVzIG1heC1zaXplZCBidWZmZXJzLCB3aGljaCB3b3VsZCBiZSBhIHdhc3RlCisgKiBvZiBtZW1vcnkgZm9yIGEgY2FjaGUgd2l0aCBhIG1heCByZXBseSBzaXplIG9mIDEwMCBieXRlcyAoZGlyb3Bva3JlcykuCisgKgorICogSWYgd2Ugc2hvdWxkIHN0YXJ0IHRvIHVzZSBkaWZmZXJlbnQgdHlwZXMgb2YgY2FjaGUgZW50cmllcyB0YWlsb3JlZAorICogc3BlY2lmaWNhbGx5IGZvciBhdHRyc3RhdCBhbmQgZmgncywgd2UgbWF5IHNhdmUgZXZlbiBtb3JlIHNwYWNlLgorICoKKyAqIEFsc28gbm90ZSB0aGF0IGEgY2FjaGV0eXBlIG9mIFJDX05PQ0FDSEUgY2FuIGxlZ2FsbHkgYmUgcGFzc2VkIHdoZW4KKyAqIG5mc2QgZmFpbGVkIHRvIGVuY29kZSBhIHJlcGx5IHRoYXQgb3RoZXJ3aXNlIHdvdWxkIGhhdmUgYmVlbiBjYWNoZWQuCisgKiBJbiB0aGlzIGNhc2UsIG5mc2RfY2FjaGVfdXBkYXRlIGlzIGNhbGxlZCB3aXRoIHN0YXRwID09IE5VTEwuCisgKi8KK3ZvaWQKK25mc2RfY2FjaGVfdXBkYXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGludCBjYWNoZXR5cGUsIHUzMiAqc3RhdHApCit7CisJc3RydWN0IHN2Y19jYWNoZXJlcCAqcnA7CisJc3RydWN0IGt2ZWMJKnJlc3YgPSAmcnFzdHAtPnJxX3Jlcy5oZWFkWzBdLCAqY2FjaHY7CisJaW50CQlsZW47CisKKwlpZiAoIShycCA9IHJxc3RwLT5ycV9jYWNoZXJlcCkgfHwgY2FjaGVfZGlzYWJsZWQpCisJCXJldHVybjsKKworCWxlbiA9IHJlc3YtPmlvdl9sZW4gLSAoKGNoYXIqKXN0YXRwIC0gKGNoYXIqKXJlc3YtPmlvdl9iYXNlKTsKKwlsZW4gPj49IDI7CisJCisJLyogRG9uJ3QgY2FjaGUgZXhjZXNzaXZlIGFtb3VudHMgb2YgZGF0YSBhbmQgWERSIGZhaWx1cmVzICovCisJaWYgKCFzdGF0cCB8fCBsZW4gPiAoMjU2ID4+IDIpKSB7CisJCXJwLT5jX3N0YXRlID0gUkNfVU5VU0VEOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChjYWNoZXR5cGUpIHsKKwljYXNlIFJDX1JFUExTVEFUOgorCQlpZiAobGVuICE9IDEpCisJCQlwcmludGsoIm5mc2Q6IFJDX1JFUExTVEFUL3JlcGx5IGxlbiAlZCFcbiIsbGVuKTsKKwkJcnAtPmNfcmVwbHN0YXQgPSAqc3RhdHA7CisJCWJyZWFrOworCWNhc2UgUkNfUkVQTEJVRkY6CisJCWNhY2h2ID0gJnJwLT5jX3JlcGx2ZWM7CisJCWNhY2h2LT5pb3ZfYmFzZSA9IGttYWxsb2MobGVuIDw8IDIsIEdGUF9LRVJORUwpOworCQlpZiAoIWNhY2h2LT5pb3ZfYmFzZSkgeworCQkJc3Bpbl9sb2NrKCZjYWNoZV9sb2NrKTsKKwkJCXJwLT5jX3N0YXRlID0gUkNfVU5VU0VEOworCQkJc3Bpbl91bmxvY2soJmNhY2hlX2xvY2spOworCQkJcmV0dXJuOworCQl9CisJCWNhY2h2LT5pb3ZfbGVuID0gbGVuIDw8IDI7CisJCW1lbWNweShjYWNodi0+aW92X2Jhc2UsIHN0YXRwLCBsZW4gPDwgMik7CisJCWJyZWFrOworCX0KKwlzcGluX2xvY2soJmNhY2hlX2xvY2spOworCWxydV9wdXRfZW5kKHJwKTsKKwlycC0+Y19zZWN1cmUgPSBycXN0cC0+cnFfc2VjdXJlOworCXJwLT5jX3R5cGUgPSBjYWNoZXR5cGU7CisJcnAtPmNfc3RhdGUgPSBSQ19ET05FOworCXJwLT5jX3RpbWVzdGFtcCA9IGppZmZpZXM7CisJc3Bpbl91bmxvY2soJmNhY2hlX2xvY2spOworCXJldHVybjsKK30KKworLyoKKyAqIENvcHkgY2FjaGVkIHJlcGx5IHRvIGN1cnJlbnQgcmVwbHkgYnVmZmVyLiBTaG91bGQgYWx3YXlzIGZpdC4KKyAqIEZJWE1FIGFzIHJlcGx5IGlzIGluIGEgcGFnZSwgd2Ugc2hvdWxkIGp1c3QgYXR0YWNoIHRoZSBwYWdlLCBhbmQKKyAqIGtlZXAgYSByZWZjb3VudC4uLi4KKyAqLworc3RhdGljIGludAorbmZzZF9jYWNoZV9hcHBlbmQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IGt2ZWMgKmRhdGEpCit7CisJc3RydWN0IGt2ZWMJKnZlYyA9ICZycXN0cC0+cnFfcmVzLmhlYWRbMF07CisKKwlpZiAodmVjLT5pb3ZfbGVuICsgZGF0YS0+aW92X2xlbiA+IFBBR0VfU0laRSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJuZnNkOiBjYWNoZWQgcmVwbHkgdG9vIGxhcmdlICglWmQpLlxuIiwKKwkJCQlkYXRhLT5pb3ZfbGVuKTsKKwkJcmV0dXJuIDA7CisJfQorCW1lbWNweSgoY2hhciopdmVjLT5pb3ZfYmFzZSArIHZlYy0+aW92X2xlbiwgZGF0YS0+aW92X2Jhc2UsIGRhdGEtPmlvdl9sZW4pOworCXZlYy0+aW92X2xlbiArPSBkYXRhLT5pb3ZfbGVuOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNjdGwuYyBiL2ZzL25mc2QvbmZzY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxYWZkYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mc2QvbmZzY3RsLmMKQEAgLTAsMCArMSw0MzggQEAKKy8qCisgKiBsaW51eC9mcy9uZnNkL25mc2N0bC5jCisgKgorICogU3lzY2FsbCBpbnRlcmZhY2UgdG8ga25mc2QuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvbmZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZF9pZG1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC94ZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL2ludGVyZmFjZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyoKKyAqCVdlIGhhdmUgYSBzaW5nbGUgZGlyZWN0b3J5IHdpdGggOSBub2RlcyBpbiBpdC4KKyAqLworZW51bSB7CisJTkZTRF9Sb290ID0gMSwKKwlORlNEX1N2YywKKwlORlNEX0FkZCwKKwlORlNEX0RlbCwKKwlORlNEX0V4cG9ydCwKKwlORlNEX1VuZXhwb3J0LAorCU5GU0RfR2V0ZmQsCisJTkZTRF9HZXRmcywKKwlORlNEX0xpc3QsCisJTkZTRF9GaCwKKwlORlNEX1RocmVhZHMsCisJTkZTRF9MZWFzZXRpbWUsCit9OworCisvKgorICogd3JpdGUoKSBmb3IgdGhlc2Ugbm9kZXMuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHdyaXRlX3N2YyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CitzdGF0aWMgc3NpemVfdCB3cml0ZV9hZGQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOworc3RhdGljIHNzaXplX3Qgd3JpdGVfZGVsKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2V4cG9ydChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CitzdGF0aWMgc3NpemVfdCB3cml0ZV91bmV4cG9ydChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CitzdGF0aWMgc3NpemVfdCB3cml0ZV9nZXRmZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CitzdGF0aWMgc3NpemVfdCB3cml0ZV9nZXRmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CitzdGF0aWMgc3NpemVfdCB3cml0ZV9maWxlaGFuZGxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX3RocmVhZHMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOworc3RhdGljIHNzaXplX3Qgd3JpdGVfbGVhc2V0aW1lKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKKworc3RhdGljIHNzaXplX3QgKCp3cml0ZV9vcFtdKShzdHJ1Y3QgZmlsZSAqLCBjaGFyICosIHNpemVfdCkgPSB7CisJW05GU0RfU3ZjXSA9IHdyaXRlX3N2YywKKwlbTkZTRF9BZGRdID0gd3JpdGVfYWRkLAorCVtORlNEX0RlbF0gPSB3cml0ZV9kZWwsCisJW05GU0RfRXhwb3J0XSA9IHdyaXRlX2V4cG9ydCwKKwlbTkZTRF9VbmV4cG9ydF0gPSB3cml0ZV91bmV4cG9ydCwKKwlbTkZTRF9HZXRmZF0gPSB3cml0ZV9nZXRmZCwKKwlbTkZTRF9HZXRmc10gPSB3cml0ZV9nZXRmcywKKwlbTkZTRF9GaF0gPSB3cml0ZV9maWxlaGFuZGxlLAorCVtORlNEX1RocmVhZHNdID0gd3JpdGVfdGhyZWFkcywKKwlbTkZTRF9MZWFzZXRpbWVdID0gd3JpdGVfbGVhc2V0aW1lLAorfTsKKworc3RhdGljIHNzaXplX3QgbmZzY3RsX3RyYW5zYWN0aW9uX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3Qgc2l6ZSwgbG9mZl90ICpwb3MpCit7CisJaW5vX3QgaW5vID0gIGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2lubzsKKwljaGFyICpkYXRhOworCXNzaXplX3QgcnY7CisKKwlpZiAoaW5vID49IHNpemVvZih3cml0ZV9vcCkvc2l6ZW9mKHdyaXRlX29wWzBdKSB8fCAhd3JpdGVfb3BbaW5vXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkYXRhID0gc2ltcGxlX3RyYW5zYWN0aW9uX2dldChmaWxlLCBidWYsIHNpemUpOworCWlmIChJU19FUlIoZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEpOworCisJcnYgPSAgd3JpdGVfb3BbaW5vXShmaWxlLCBkYXRhLCBzaXplKTsKKwlpZiAocnY+MCkgeworCQlzaW1wbGVfdHJhbnNhY3Rpb25fc2V0KGZpbGUsIHJ2KTsKKwkJcnYgPSBzaXplOworCX0KKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRyYW5zYWN0aW9uX29wcyA9IHsKKwkud3JpdGUJCT0gbmZzY3RsX3RyYW5zYWN0aW9uX3dyaXRlLAorCS5yZWFkCQk9IHNpbXBsZV90cmFuc2FjdGlvbl9yZWFkLAorCS5yZWxlYXNlCT0gc2ltcGxlX3RyYW5zYWN0aW9uX3JlbGVhc2UsCit9OworCitleHRlcm4gc3RydWN0IHNlcV9vcGVyYXRpb25zIG5mc19leHBvcnRzX29wOworc3RhdGljIGludCBleHBvcnRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZuZnNfZXhwb3J0c19vcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV4cG9ydHNfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBleHBvcnRzX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogcGF5bG9hZCAtIHdyaXRlIG1ldGhvZHMKKyAqIElmIHRoZSBtZXRob2QgaGFzIGEgcmVzcG9uc2UsIHRoZSByZXNwb25zZSBzaG91bGQgYmUgcHV0IGluIGJ1ZiwKKyAqIGFuZCB0aGUgbGVuZ3RoIHJldHVybmVkLiAgT3RoZXJ3aXNlIHJldHVybiAwIG9yIGFuZCAtZXJyb3IuCisgKi8KKworc3RhdGljIHNzaXplX3Qgd3JpdGVfc3ZjKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBuZnNjdGxfc3ZjICpkYXRhOworCWlmIChzaXplIDwgc2l6ZW9mKCpkYXRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGF0YSA9IChzdHJ1Y3QgbmZzY3RsX3N2YyopIGJ1ZjsKKwlyZXR1cm4gbmZzZF9zdmMoZGF0YS0+c3ZjX3BvcnQsIGRhdGEtPnN2Y19udGhyZWFkcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2FkZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgbmZzY3RsX2NsaWVudCAqZGF0YTsKKwlpZiAoc2l6ZSA8IHNpemVvZigqZGF0YSkpCisJCXJldHVybiAtRUlOVkFMOworCWRhdGEgPSAoc3RydWN0IG5mc2N0bF9jbGllbnQgKilidWY7CisJcmV0dXJuIGV4cF9hZGRjbGllbnQoZGF0YSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2RlbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgbmZzY3RsX2NsaWVudCAqZGF0YTsKKwlpZiAoc2l6ZSA8IHNpemVvZigqZGF0YSkpCisJCXJldHVybiAtRUlOVkFMOworCWRhdGEgPSAoc3RydWN0IG5mc2N0bF9jbGllbnQgKilidWY7CisJcmV0dXJuIGV4cF9kZWxjbGllbnQoZGF0YSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2V4cG9ydChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgbmZzY3RsX2V4cG9ydCAqZGF0YTsKKwlpZiAoc2l6ZSA8IHNpemVvZigqZGF0YSkpCisJCXJldHVybiAtRUlOVkFMOworCWRhdGEgPSAoc3RydWN0IG5mc2N0bF9leHBvcnQqKWJ1ZjsKKwlyZXR1cm4gZXhwX2V4cG9ydChkYXRhKTsKK30KKworc3RhdGljIHNzaXplX3Qgd3JpdGVfdW5leHBvcnQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG5mc2N0bF9leHBvcnQgKmRhdGE7CisKKwlpZiAoc2l6ZSA8IHNpemVvZigqZGF0YSkpCisJCXJldHVybiAtRUlOVkFMOworCWRhdGEgPSAoc3RydWN0IG5mc2N0bF9leHBvcnQqKWJ1ZjsKKwlyZXR1cm4gZXhwX3VuZXhwb3J0KGRhdGEpOworfQorCitzdGF0aWMgc3NpemVfdCB3cml0ZV9nZXRmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgbmZzY3RsX2ZzcGFybSAqZGF0YTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKKwlzdHJ1Y3QgYXV0aF9kb21haW4gKmNscDsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3Qga25mc2RfZmggKnJlczsKKworCWlmIChzaXplIDwgc2l6ZW9mKCpkYXRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGF0YSA9IChzdHJ1Y3QgbmZzY3RsX2ZzcGFybSopYnVmOworCWVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7CisJaWYgKGRhdGEtPmdkX2FkZHIuc2FfZmFtaWx5ICE9IEFGX0lORVQpCisJCWdvdG8gb3V0OworCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZGF0YS0+Z2RfYWRkcjsKKwlpZiAoZGF0YS0+Z2RfbWF4bGVuID4gTkZTM19GSFNJWkUpCisJCWRhdGEtPmdkX21heGxlbiA9IE5GUzNfRkhTSVpFOworCisJcmVzID0gKHN0cnVjdCBrbmZzZF9maCopYnVmOworCisJZXhwX3JlYWRsb2NrKCk7CisJaWYgKCEoY2xwID0gYXV0aF91bml4X2xvb2t1cChzaW4tPnNpbl9hZGRyKSkpCisJCWVyciA9IC1FUEVSTTsKKwllbHNlIHsKKwkJZXJyID0gZXhwX3Jvb3RmaChjbHAsIGRhdGEtPmdkX3BhdGgsIHJlcywgZGF0YS0+Z2RfbWF4bGVuKTsKKwkJYXV0aF9kb21haW5fcHV0KGNscCk7CisJfQorCWV4cF9yZWFkdW5sb2NrKCk7CisJaWYgKGVyciA9PSAwKQorCQllcnIgPSByZXMtPmZoX3NpemUgKyAoaW50KSYoKHN0cnVjdCBrbmZzZF9maCopMCktPmZoX2Jhc2U7Cisgb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2dldGZkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBuZnNjdGxfZmRwYXJtICpkYXRhOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luOworCXN0cnVjdCBhdXRoX2RvbWFpbiAqY2xwOworCWludCBlcnIgPSAwOworCXN0cnVjdCBrbmZzZF9maCBmaDsKKwljaGFyICpyZXM7CisKKwlpZiAoc2l6ZSA8IHNpemVvZigqZGF0YSkpCisJCXJldHVybiAtRUlOVkFMOworCWRhdGEgPSAoc3RydWN0IG5mc2N0bF9mZHBhcm0qKWJ1ZjsKKwllcnIgPSAtRVBST1RPTk9TVVBQT1JUOworCWlmIChkYXRhLT5nZF9hZGRyLnNhX2ZhbWlseSAhPSBBRl9JTkVUKQorCQlnb3RvIG91dDsKKwllcnIgPSAtRUlOVkFMOworCWlmIChkYXRhLT5nZF92ZXJzaW9uIDwgMiB8fCBkYXRhLT5nZF92ZXJzaW9uID4gTkZTU1ZDX01BWFZFUlMpCisJCWdvdG8gb3V0OworCisJcmVzID0gYnVmOworCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZGF0YS0+Z2RfYWRkcjsKKwlleHBfcmVhZGxvY2soKTsKKwlpZiAoIShjbHAgPSBhdXRoX3VuaXhfbG9va3VwKHNpbi0+c2luX2FkZHIpKSkKKwkJZXJyID0gLUVQRVJNOworCWVsc2UgeworCQllcnIgPSBleHBfcm9vdGZoKGNscCwgZGF0YS0+Z2RfcGF0aCwgJmZoLCBORlNfRkhTSVpFKTsKKwkJYXV0aF9kb21haW5fcHV0KGNscCk7CisJfQorCWV4cF9yZWFkdW5sb2NrKCk7CisKKwlpZiAoZXJyID09IDApIHsKKwkJbWVtc2V0KHJlcywwLCBORlNfRkhTSVpFKTsKKwkJbWVtY3B5KHJlcywgJmZoLmZoX2Jhc2UsIGZoLmZoX3NpemUpOworCQllcnIgPSBORlNfRkhTSVpFOworCX0KKyBvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHNzaXplX3Qgd3JpdGVfZmlsZWhhbmRsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwkvKiByZXF1ZXN0IGlzOgorCSAqICAgZG9tYWluIHBhdGggbWF4c2l6ZQorCSAqIHJlc3BvbnNlIGlzCisJICogICBmaWxlaGFuZGxlCisJICoKKwkgKiBxd29yZCBxdW90aW5nIGlzIHVzZWQsIHNvIGZpbGVoYW5kbGUgd2lsbCBiZSBceC4uLi4KKwkgKi8KKwljaGFyICpkbmFtZSwgKnBhdGg7CisJaW50IG1heHNpemU7CisJY2hhciAqbWVzZyA9IGJ1ZjsKKwlpbnQgbGVuOworCXN0cnVjdCBhdXRoX2RvbWFpbiAqZG9tOworCXN0cnVjdCBrbmZzZF9maCBmaDsKKworCWlmIChidWZbc2l6ZS0xXSAhPSAnXG4nKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlidWZbc2l6ZS0xXSA9IDA7CisKKwlkbmFtZSA9IG1lc2c7CisJbGVuID0gcXdvcmRfZ2V0KCZtZXNnLCBkbmFtZSwgc2l6ZSk7CisJaWYgKGxlbiA8PSAwKSByZXR1cm4gLUVJTlZBTDsKKwkKKwlwYXRoID0gZG5hbWUrbGVuKzE7CisJbGVuID0gcXdvcmRfZ2V0KCZtZXNnLCBwYXRoLCBzaXplKTsKKwlpZiAobGVuIDw9IDApIHJldHVybiAtRUlOVkFMOworCisJbGVuID0gZ2V0X2ludCgmbWVzZywgJm1heHNpemUpOworCWlmIChsZW4pCisJCXJldHVybiBsZW47CisKKwlpZiAobWF4c2l6ZSA8IE5GU19GSFNJWkUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChtYXhzaXplID4gTkZTM19GSFNJWkUpCisJCW1heHNpemUgPSBORlMzX0ZIU0laRTsKKworCWlmIChxd29yZF9nZXQoJm1lc2csIG1lc2csIHNpemUpPjApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogd2UgaGF2ZSBhbGwgdGhlIHdvcmRzLCB0aGV5IGFyZSBpbiBidWYuLiAqLworCWRvbSA9IHVuaXhfZG9tYWluX2ZpbmQoZG5hbWUpOworCWlmICghZG9tKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxlbiA9IGV4cF9yb290ZmgoZG9tLCBwYXRoLCAmZmgsICBtYXhzaXplKTsKKwlhdXRoX2RvbWFpbl9wdXQoZG9tKTsKKwlpZiAobGVuKQorCQlyZXR1cm4gbGVuOworCQorCW1lc2cgPSBidWY7IGxlbiA9IFNJTVBMRV9UUkFOU0FDVElPTl9MSU1JVDsKKwlxd29yZF9hZGRoZXgoJm1lc2csICZsZW4sIChjaGFyKikmZmguZmhfYmFzZSwgZmguZmhfc2l6ZSk7CisJbWVzZ1stMV0gPSAnXG4nOworCXJldHVybiBtZXNnIC0gYnVmOwkKK30KKworZXh0ZXJuIGludCBuZnNkX25ydGhyZWFkcyh2b2lkKTsKKworc3RhdGljIHNzaXplX3Qgd3JpdGVfdGhyZWFkcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwkvKiBpZiBzaXplID4gMCwgbG9vayBmb3IgYSBudW1iZXIgb2YgdGhyZWFkcyBhbmQgY2FsbCBuZnNkX3N2YworCSAqIHRoZW4gd3JpdGUgb3V0IG51bWJlciBvZiB0aHJlYWRzIGFzIHJlcGx5CisJICovCisJY2hhciAqbWVzZyA9IGJ1ZjsKKwlpbnQgcnY7CisJaWYgKHNpemUgPiAwKSB7CisJCWludCBuZXd0aHJlYWRzOworCQlydiA9IGdldF9pbnQoJm1lc2csICZuZXd0aHJlYWRzKTsKKwkJaWYgKHJ2KQorCQkJcmV0dXJuIHJ2OworCQlpZiAobmV3dGhyZWFkcyA8MCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlydiA9IG5mc2Rfc3ZjKDIwNDksIG5ld3RocmVhZHMpOworCQlpZiAocnYpCisJCQlyZXR1cm4gcnY7CisJfQorCXNwcmludGYoYnVmLCAiJWRcbiIsIG5mc2RfbnJ0aHJlYWRzKCkpOworCXJldHVybiBzdHJsZW4oYnVmKTsKK30KKworZXh0ZXJuIHRpbWVfdCBuZnM0X2xlYXNldGltZSh2b2lkKTsKKworc3RhdGljIHNzaXplX3Qgd3JpdGVfbGVhc2V0aW1lKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCS8qIGlmIHNpemUgPiAxMCBzZWNvbmRzLCBjYWxsCisJICogbmZzNF9yZXNldF9sZWFzZSgpIHRoZW4gd3JpdGUgb3V0IHRoZSBuZXcgbGVhc2UgKHNlY29uZHMpIGFzIHJlcGx5CisJICovCisJY2hhciAqbWVzZyA9IGJ1ZjsKKwlpbnQgcnY7CisKKwlpZiAoc2l6ZSA+IDApIHsKKwkJaW50IGxlYXNlOworCQlydiA9IGdldF9pbnQoJm1lc2csICZsZWFzZSk7CisJCWlmIChydikKKwkJCXJldHVybiBydjsKKwkJaWYgKGxlYXNlIDwgMTAgfHwgbGVhc2UgPiAzNjAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW5mczRfcmVzZXRfbGVhc2UobGVhc2UpOworCX0KKwlzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgbmZzNF9sZWFzZV90aW1lKCkpOworCXJldHVybiBzdHJsZW4oYnVmKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKglwb3B1bGF0aW5nIHRoZSBmaWxlc3lzdGVtLgorICovCisKK3N0YXRpYyBpbnQgbmZzZF9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCB2b2lkICogZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdGF0aWMgc3RydWN0IHRyZWVfZGVzY3IgbmZzZF9maWxlc1tdID0geworCQlbTkZTRF9TdmNdID0geyIuc3ZjIiwgJnRyYW5zYWN0aW9uX29wcywgU19JV1VTUn0sCisJCVtORlNEX0FkZF0gPSB7Ii5hZGQiLCAmdHJhbnNhY3Rpb25fb3BzLCBTX0lXVVNSfSwKKwkJW05GU0RfRGVsXSA9IHsiLmRlbCIsICZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J9LAorCQlbTkZTRF9FeHBvcnRdID0geyIuZXhwb3J0IiwgJnRyYW5zYWN0aW9uX29wcywgU19JV1VTUn0sCisJCVtORlNEX1VuZXhwb3J0XSA9IHsiLnVuZXhwb3J0IiwgJnRyYW5zYWN0aW9uX29wcywgU19JV1VTUn0sCisJCVtORlNEX0dldGZkXSA9IHsiLmdldGZkIiwgJnRyYW5zYWN0aW9uX29wcywgU19JV1VTUnxTX0lSVVNSfSwKKwkJW05GU0RfR2V0ZnNdID0geyIuZ2V0ZnMiLCAmdHJhbnNhY3Rpb25fb3BzLCBTX0lXVVNSfFNfSVJVU1J9LAorCQlbTkZTRF9MaXN0XSA9IHsiZXhwb3J0cyIsICZleHBvcnRzX29wZXJhdGlvbnMsIFNfSVJVR099LAorCQlbTkZTRF9GaF0gPSB7ImZpbGVoYW5kbGUiLCAmdHJhbnNhY3Rpb25fb3BzLCBTX0lXVVNSfFNfSVJVU1J9LAorCQlbTkZTRF9UaHJlYWRzXSA9IHsidGhyZWFkcyIsICZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J8U19JUlVTUn0sCisjaWZkZWYgQ09ORklHX05GU0RfVjQKKwkJW05GU0RfTGVhc2V0aW1lXSA9IHsibmZzdjRsZWFzZXRpbWUiLCAmdHJhbnNhY3Rpb25fb3BzLCBTX0lXVVNSfFNfSVJVU1J9LAorI2VuZGlmCisJCS8qIGxhc3Qgb25lICovIHsiIn0KKwl9OworCXJldHVybiBzaW1wbGVfZmlsbF9zdXBlcihzYiwgMHg2ZTY2NzM2NCwgbmZzZF9maWxlcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKm5mc2RfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIG5mc2RfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBuZnNkX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJuZnNkIiwKKwkuZ2V0X3NiCQk9IG5mc2RfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9saXR0ZXJfc3VwZXIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25mc2Qodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCXByaW50ayhLRVJOX0lORk8gIkluc3RhbGxpbmcga25mc2QgKGNvcHlyaWdodCAoQykgMTk5NiBva2lyQG1vbmFkLnN3Yi5kZSkuXG4iKTsKKworCW5mc2Rfc3RhdF9pbml0KCk7CS8qIFN0YXRpc3RpY3MgKi8KKwluZnNkX2NhY2hlX2luaXQoKTsJLyogUlBDIHJlcGx5IGNhY2hlICovCisJbmZzZF9leHBvcnRfaW5pdCgpOwkvKiBFeHBvcnRzIHRhYmxlICovCisJbmZzZF9sb2NrZF9pbml0KCk7CS8qIGxvY2tkLT5uZnNkIGNhbGxiYWNrcyAqLworI2lmZGVmIENPTkZJR19ORlNEX1Y0CisJbmZzZF9pZG1hcF9pbml0KCk7ICAgICAgLyogTmFtZSB0byBJRCBtYXBwaW5nICovCisjZW5kaWYgLyogQ09ORklHX05GU0RfVjQgKi8KKwlpZiAocHJvY19ta2RpcigiZnMvbmZzIiwgTlVMTCkpIHsKKwkJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKKwkJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiZnMvbmZzL2V4cG9ydHMiLCAwLCBOVUxMKTsKKwkJaWYgKGVudHJ5KQorCQkJZW50cnktPnByb2NfZm9wcyA9ICAmZXhwb3J0c19vcGVyYXRpb25zOworCX0KKwlyZXR2YWwgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZuZnNkX2ZzX3R5cGUpOworCWlmIChyZXR2YWwpIHsKKwkJbmZzZF9leHBvcnRfc2h1dGRvd24oKTsKKwkJbmZzZF9jYWNoZV9zaHV0ZG93bigpOworCQlyZW1vdmVfcHJvY19lbnRyeSgiZnMvbmZzL2V4cG9ydHMiLCBOVUxMKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImZzL25mcyIsIE5VTEwpOworCQluZnNkX3N0YXRfc2h1dGRvd24oKTsKKwkJbmZzZF9sb2NrZF9zaHV0ZG93bigpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9uZnNkKHZvaWQpCit7CisJbmZzZF9leHBvcnRfc2h1dGRvd24oKTsKKwluZnNkX2NhY2hlX3NodXRkb3duKCk7CisJcmVtb3ZlX3Byb2NfZW50cnkoImZzL25mcy9leHBvcnRzIiwgTlVMTCk7CisJcmVtb3ZlX3Byb2NfZW50cnkoImZzL25mcyIsIE5VTEwpOworCW5mc2Rfc3RhdF9zaHV0ZG93bigpOworCW5mc2RfbG9ja2Rfc2h1dGRvd24oKTsKKyNpZmRlZiBDT05GSUdfTkZTRF9WNAorCW5mc2RfaWRtYXBfc2h1dGRvd24oKTsKKyNlbmRpZiAvKiBDT05GSUdfTkZTRF9WNCAqLworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmbmZzZF9mc190eXBlKTsKK30KKworTU9EVUxFX0FVVEhPUigiT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfaW5pdChpbml0X25mc2QpCittb2R1bGVfZXhpdChleGl0X25mc2QpCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2ZoLmMgYi9mcy9uZnNkL25mc2ZoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EzZTM5NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mc2QvbmZzZmguYwpAQCAtMCwwICsxLDUzMiBAQAorLyoKKyAqIGxpbnV4L2ZzL25mc2QvbmZzZmguYworICoKKyAqIE5GUyBzZXJ2ZXIgZmlsZSBoYW5kbGUgdHJlYXRtZW50LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMTk5OSBHLiBBbGxlbiBNb3JyaXMgSUlJIDxnYW0zQGFjbS5vcmc+CisgKiBFeHRlbnNpdmUgcmV3cml0ZSBieSBOZWlsIEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+IFNvdXRoZXJuLVNwcmluZyAxOTk5CisgKiAuLi4gYW5kIGFnYWluIFNvdXRoZXJuLVdpbnRlciAyMDAxIHRvIHN1cHBvcnQgZXhwb3J0X29wZXJhdGlvbnMKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CisKKyNkZWZpbmUgTkZTRERCR19GQUNJTElUWQkJTkZTRERCR19GSAorI2RlZmluZSBORlNEX1BBUkFOT0lBIDEKKy8qICNkZWZpbmUgTkZTRF9ERUJVR19WRVJCT1NFIDEgKi8KKworCitzdGF0aWMgaW50IG5mc2RfbnJfdmVyaWZpZWQ7CitzdGF0aWMgaW50IG5mc2RfbnJfcHV0OworCitleHRlcm4gc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGV4cG9ydF9vcF9kZWZhdWx0OworCisjZGVmaW5lCUNBTEwob3BzLGZ1bikgKChvcHMtPmZ1bik/KG9wcy0+ZnVuKTpleHBvcnRfb3BfZGVmYXVsdC5mdW4pCisKKy8qCisgKiBvdXIgYWNjZXB0YWJpbGl0eSBmdW5jdGlvbi4KKyAqIGlmIE5PU1VCVFJFRUNIRUNLLCBhY2NlcHQgYW55dGhpbmcKKyAqIGlmIG5vdCwgcmVxdWlyZSB0aGF0IHdlIGNhbiB3YWxrIHVwIHRvIGV4cC0+ZXhfZGVudHJ5CisgKiBkb2luZyBzb21lIGNoZWNrcyBvbiB0aGUgJ3gnIGJpdHMKKyAqLworc3RhdGljIGludCBuZnNkX2FjY2VwdGFibGUodm9pZCAqZXhwdiwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBzdmNfZXhwb3J0ICpleHAgPSBleHB2OworCWludCBydjsKKwlzdHJ1Y3QgZGVudHJ5ICp0ZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKworCWlmIChleHAtPmV4X2ZsYWdzICYgTkZTRVhQX05PU1VCVFJFRUNIRUNLKQorCQlyZXR1cm4gMTsKKworCXRkZW50cnkgPSBkZ2V0KGRlbnRyeSk7CisJd2hpbGUgKHRkZW50cnkgIT0gZXhwLT5leF9kZW50cnkgJiYgISBJU19ST09UKHRkZW50cnkpKSB7CisJCS8qIG1ha2Ugc3VyZSBwYXJlbnRzIGdpdmUgeCBwZXJtaXNzaW9uIHRvIHVzZXIgKi8KKwkJaW50IGVycjsKKwkJcGFyZW50ID0gZGdldF9wYXJlbnQodGRlbnRyeSk7CisJCWVyciA9IHBlcm1pc3Npb24ocGFyZW50LT5kX2lub2RlLCBNQVlfRVhFQywgTlVMTCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlkcHV0KHBhcmVudCk7CisJCQlicmVhazsKKwkJfQorCQlkcHV0KHRkZW50cnkpOworCQl0ZGVudHJ5ID0gcGFyZW50OworCX0KKwlpZiAodGRlbnRyeSAhPSBleHAtPmV4X2RlbnRyeSkKKwkJZHByaW50aygibmZzZF9hY2NlcHRhYmxlIGZhaWxlZCBhdCAlcCAlc1xuIiwgdGRlbnRyeSwgdGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCXJ2ID0gKHRkZW50cnkgPT0gZXhwLT5leF9kZW50cnkpOworCWRwdXQodGRlbnRyeSk7CisJcmV0dXJuIHJ2OworfQorCisvKiBUeXBlIGNoZWNrLiBUaGUgY29ycmVjdCBlcnJvciByZXR1cm4gZm9yIHR5cGUgbWlzbWF0Y2hlcyBkb2VzIG5vdCBzZWVtIHRvIGJlCisgKiBnZW5lcmFsbHkgYWdyZWVkIHVwb24uIFN1bk9TIHNlZW1zIHRvIHVzZSBFSVNESVIgaWYgZmlsZSBpc24ndCBTX0lGUkVHOyBhCisgKiBjb21tZW50IGluIHRoZSBORlN2MyBzcGVjIHNheXMgdGhpcyBpcyBpbmNvcnJlY3QgKGltcGxlbWVudGF0aW9uIG5vdGVzIGZvcgorICogdGhlIHdyaXRlIGNhbGwpLgorICovCitzdGF0aWMgaW5saW5lIGludAorbmZzZF9tb2RlX2NoZWNrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHVtb2RlX3QgbW9kZSwgaW50IHR5cGUpCit7CisJLyogVHlwZSBjYW4gYmUgbmVnYXRpdmUgd2hlbiBjcmVhdGluZyBoYXJkbGlua3MgLSBub3QgdG8gYSBkaXIgKi8KKwlpZiAodHlwZSA+IDAgJiYgKG1vZGUgJiBTX0lGTVQpICE9IHR5cGUpIHsKKwkJaWYgKHJxc3RwLT5ycV92ZXJzID09IDQgJiYgKG1vZGUgJiBTX0lGTVQpID09IFNfSUZMTkspCisJCQlyZXR1cm4gbmZzZXJyX3N5bWxpbms7CisJCWVsc2UgaWYgKHR5cGUgPT0gU19JRkRJUikKKwkJCXJldHVybiBuZnNlcnJfbm90ZGlyOworCQllbHNlIGlmICgobW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUikKKwkJCXJldHVybiBuZnNlcnJfaXNkaXI7CisJCWVsc2UKKwkJCXJldHVybiBuZnNlcnJfaW52YWw7CisJfQorCWlmICh0eXBlIDwgMCAmJiAobW9kZSAmIFNfSUZNVCkgPT0gLXR5cGUpIHsKKwkJaWYgKHJxc3RwLT5ycV92ZXJzID09IDQgJiYgKG1vZGUgJiBTX0lGTVQpID09IFNfSUZMTkspCisJCQlyZXR1cm4gbmZzZXJyX3N5bWxpbms7CisJCWVsc2UgaWYgKHR5cGUgPT0gLVNfSUZESVIpCisJCQlyZXR1cm4gbmZzZXJyX2lzZGlyOworCQllbHNlCisJCQlyZXR1cm4gbmZzZXJyX25vdGRpcjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQZXJmb3JtIHNhbml0eSBjaGVja3Mgb24gdGhlIGRlbnRyeSBpbiBhIGNsaWVudCdzIGZpbGUgaGFuZGxlLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgZmlsZSBoYW5kbGUgZGVudHJ5IG1heSBuZWVkIHRvIGJlIGZyZWVkIGV2ZW4gYWZ0ZXIKKyAqIGFuIGVycm9yIHJldHVybi4KKyAqCisgKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBhbiBuZnNwcm9jIGNhbGwsIHNvIGZocCBwb2ludHMgdG8KKyAqIGEgc3ZjX2ZoIHdoaWNoIGlzIGFsbCAwIGV4Y2VwdCBmb3IgdGhlIG92ZXItdGhlLXdpcmUgZmlsZSBoYW5kbGUuCisgKi8KK3UzMgorZmhfdmVyaWZ5KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgaW50IHR5cGUsIGludCBhY2Nlc3MpCit7CisJc3RydWN0IGtuZnNkX2ZoCSpmaCA9ICZmaHAtPmZoX2hhbmRsZTsKKwlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwID0gTlVMTDsKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnk7CisJdTMyCQllcnJvciA9IDA7CisKKwlkcHJpbnRrKCJuZnNkOiBmaF92ZXJpZnkoJXMpXG4iLCBTVkNGSF9mbXQoZmhwKSk7CisKKwkvKiBrZWVwIHRoaXMgZmlsZWhhbmRsZSBmb3IgcG9zc2libGUgcmVmZXJlbmNlICB3aGVuIGVuY29kaW5nIGF0dHJpYnV0ZXMgKi8KKwlycXN0cC0+cnFfcmVmZmggPSBmaDsKKworCWlmICghZmhwLT5maF9kZW50cnkpIHsKKwkJX191MzIgKmRhdGFwPU5VTEw7CisJCV9fdTMyIHRmaFszXTsJCS8qIGZpbGVoYW5kbGUgZnJhZ21lbnQgZm9yIG9sZHN0eWxlIGZpbGVoYW5kbGVzICovCisJCWludCBmaWxlaWRfdHlwZTsKKwkJaW50IGRhdGFfbGVmdCA9IGZoLT5maF9zaXplLzQ7CisKKwkJZXJyb3IgPSBuZnNlcnJfc3RhbGU7CisJCWlmIChycXN0cC0+cnFfY2xpZW50ID09IE5VTEwpCisJCQlnb3RvIG91dDsKKwkJaWYgKHJxc3RwLT5ycV92ZXJzID4gMikKKwkJCWVycm9yID0gbmZzZXJyX2JhZGhhbmRsZTsKKwkJaWYgKHJxc3RwLT5ycV92ZXJzID09IDQgJiYgZmgtPmZoX3NpemUgPT0gMCkKKwkJCXJldHVybiBuZnNlcnJfbm9maWxlaGFuZGxlOworCisJCWlmIChmaC0+ZmhfdmVyc2lvbiA9PSAxKSB7CisJCQlpbnQgbGVuOworCQkJZGF0YXAgPSBmaC0+ZmhfYXV0aDsKKwkJCWlmICgtLWRhdGFfbGVmdDwwKSBnb3RvIG91dDsKKwkJCXN3aXRjaCAoZmgtPmZoX2F1dGhfdHlwZSkgeworCQkJY2FzZSAwOiBicmVhazsKKwkJCWRlZmF1bHQ6IGdvdG8gb3V0OworCQkJfQorCQkJbGVuID0ga2V5X2xlbihmaC0+ZmhfZnNpZF90eXBlKSAvIDQ7CisJCQlpZiAobGVuID09IDApIGdvdG8gb3V0OworCQkJaWYgIChmaC0+ZmhfZnNpZF90eXBlID09IDIpIHsKKwkJCQkvKiBkZXByZWNhdGVkLCBjb252ZXJ0IHRvIHR5cGUgMyAqLworCQkJCWxlbiA9IDM7CisJCQkJZmgtPmZoX2ZzaWRfdHlwZSA9IDM7CisJCQkJZmgtPmZoX2ZzaWRbMF0gPSBuZXdfZW5jb2RlX2RldihNS0RFVihudG9obChmaC0+ZmhfZnNpZFswXSksIG50b2hsKGZoLT5maF9mc2lkWzFdKSkpOworCQkJCWZoLT5maF9mc2lkWzFdID0gZmgtPmZoX2ZzaWRbMl07CisJCQl9CisJCQlpZiAoKGRhdGFfbGVmdCAtPSBsZW4pPDApIGdvdG8gb3V0OworCQkJZXhwID0gZXhwX2ZpbmQocnFzdHAtPnJxX2NsaWVudCwgZmgtPmZoX2ZzaWRfdHlwZSwgZGF0YXAsICZycXN0cC0+cnFfY2hhbmRsZSk7CisJCQlkYXRhcCArPSBsZW47CisJCX0gZWxzZSB7CisJCQlkZXZfdCB4ZGV2OworCQkJaW5vX3QgeGlubzsKKwkJCWlmIChmaC0+Zmhfc2l6ZSAhPSBORlNfRkhTSVpFKQorCQkJCWdvdG8gb3V0OworCQkJLyogYXNzdW1lIG9sZCBmaWxlaGFuZGxlIGZvcm1hdCAqLworCQkJeGRldiA9IG9sZF9kZWNvZGVfZGV2KGZoLT5vZmhfeGRldik7CisJCQl4aW5vID0gdTMyX3RvX2lub190KGZoLT5vZmhfeGlubyk7CisJCQlta19mc2lkX3YwKHRmaCwgeGRldiwgeGlubyk7CisJCQlleHAgPSBleHBfZmluZChycXN0cC0+cnFfY2xpZW50LCAwLCB0ZmgsICZycXN0cC0+cnFfY2hhbmRsZSk7CisJCX0KKworCQllcnJvciA9IG5mc2Vycl9kcm9waXQ7CisJCWlmIChJU19FUlIoZXhwKSAmJiBQVFJfRVJSKGV4cCkgPT0gLUVBR0FJTikKKwkJCWdvdG8gb3V0OworCisJCWVycm9yID0gbmZzZXJyX3N0YWxlOyAKKwkJaWYgKCFleHAgfHwgSVNfRVJSKGV4cCkpCisJCQlnb3RvIG91dDsKKworCQkvKiBDaGVjayBpZiB0aGUgcmVxdWVzdCBvcmlnaW5hdGVkIGZyb20gYSBzZWN1cmUgcG9ydC4gKi8KKwkJZXJyb3IgPSBuZnNlcnJfcGVybTsKKwkJaWYgKCFycXN0cC0+cnFfc2VjdXJlICYmIEVYX1NFQ1VSRShleHApKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIm5mc2Q6IHJlcXVlc3QgZnJvbSBpbnNlY3VyZSBwb3J0ICgldS4ldS4ldS4ldTolZCkhXG4iLAorCQkJICAgICAgIE5JUFFVQUQocnFzdHAtPnJxX2FkZHIuc2luX2FkZHIuc19hZGRyKSwKKwkJCSAgICAgICBudG9ocyhycXN0cC0+cnFfYWRkci5zaW5fcG9ydCkpOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBTZXQgdXNlciBjcmVkcyBmb3IgdGhpcyBleHBvcnRwb2ludCAqLworCQllcnJvciA9IG5mc2Rfc2V0dXNlcihycXN0cCwgZXhwKTsKKwkJaWYgKGVycm9yKSB7CisJCQllcnJvciA9IG5mc2Vycm5vKGVycm9yKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogTG9vayB1cCB0aGUgZGVudHJ5IHVzaW5nIHRoZSBORlMgZmlsZSBoYW5kbGUuCisJCSAqLworCQllcnJvciA9IG5mc2Vycl9zdGFsZTsKKwkJaWYgKHJxc3RwLT5ycV92ZXJzID4gMikKKwkJCWVycm9yID0gbmZzZXJyX2JhZGhhbmRsZTsKKworCQlpZiAoZmgtPmZoX3ZlcnNpb24gIT0gMSkgeworCQkJdGZoWzBdID0gZmgtPm9maF9pbm87CisJCQl0ZmhbMV0gPSBmaC0+b2ZoX2dlbmVyYXRpb247CisJCQl0ZmhbMl0gPSBmaC0+b2ZoX2RpcmlubzsKKwkJCWRhdGFwID0gdGZoOworCQkJZGF0YV9sZWZ0ID0gMzsKKwkJCWlmIChmaC0+b2ZoX2RpcmlubyA9PSAwKQorCQkJCWZpbGVpZF90eXBlID0gMTsKKwkJCWVsc2UKKwkJCQlmaWxlaWRfdHlwZSA9IDI7CisJCX0gZWxzZQorCQkJZmlsZWlkX3R5cGUgPSBmaC0+ZmhfZmlsZWlkX3R5cGU7CisJCQorCQlpZiAoZmlsZWlkX3R5cGUgPT0gMCkKKwkJCWRlbnRyeSA9IGRnZXQoZXhwLT5leF9kZW50cnkpOworCQllbHNlIHsKKwkJCXN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyAqbm9wID0gZXhwLT5leF9tbnQtPm1udF9zYi0+c19leHBvcnRfb3A7CisJCQlkZW50cnkgPSBDQUxMKG5vcCxkZWNvZGVfZmgpKGV4cC0+ZXhfbW50LT5tbnRfc2IsCisJCQkJCQkgICAgIGRhdGFwLCBkYXRhX2xlZnQsCisJCQkJCQkgICAgIGZpbGVpZF90eXBlLAorCQkJCQkJICAgICBuZnNkX2FjY2VwdGFibGUsIGV4cCk7CisJCX0KKwkJaWYgKGRlbnRyeSA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCWlmIChJU19FUlIoZGVudHJ5KSkgeworCQkJaWYgKFBUUl9FUlIoZGVudHJ5KSAhPSAtRUlOVkFMKQorCQkJCWVycm9yID0gbmZzZXJybm8oUFRSX0VSUihkZW50cnkpKTsKKwkJCWdvdG8gb3V0OworCQl9CisjaWZkZWYgTkZTRF9QQVJBTk9JQQorCQlpZiAoU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgJiYKKwkJICAgIChkZW50cnktPmRfZmxhZ3MgJiBEQ0FDSEVfRElTQ09OTkVDVEVEKSkgeworCQkJcHJpbnRrKCJuZnNkOiBmaW5kX2ZoX2RlbnRyeSByZXR1cm5lZCBhIERJU0NPTk5FQ1RFRCBkaXJlY3Rvcnk6ICVzLyVzXG4iLAorCQkJICAgICAgIGRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJfQorI2VuZGlmCisKKwkJZmhwLT5maF9kZW50cnkgPSBkZW50cnk7CisJCWZocC0+ZmhfZXhwb3J0ID0gZXhwOworCQluZnNkX25yX3ZlcmlmaWVkKys7CisJfSBlbHNlIHsKKwkJLyoganVzdCByZWNoZWNraW5nIHBlcm1pc3Npb25zCisJCSAqIChlLmcuIG5mc3Byb2NfY3JlYXRlIGNhbGxzIGZoX3ZlcmlmeSwgdGhlbiBuZnNkX2NyZWF0ZSBkb2VzIGFzIHdlbGwpCisJCSAqLworCQlkcHJpbnRrKCJuZnNkOiBmaF92ZXJpZnkgLSBqdXN0IGNoZWNraW5nXG4iKTsKKwkJZGVudHJ5ID0gZmhwLT5maF9kZW50cnk7CisJCWV4cCA9IGZocC0+ZmhfZXhwb3J0OworCX0KKwljYWNoZV9nZXQoJmV4cC0+aCk7CisKKwllcnJvciA9IG5mc2RfbW9kZV9jaGVjayhycXN0cCwgZGVudHJ5LT5kX2lub2RlLT5pX21vZGUsIHR5cGUpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwkvKiBGaW5hbGx5LCBjaGVjayBhY2Nlc3MgcGVybWlzc2lvbnMuICovCisJZXJyb3IgPSBuZnNkX3Blcm1pc3Npb24oZXhwLCBkZW50cnksIGFjY2Vzcyk7CisKKyNpZmRlZiBORlNEX1BBUkFOT0lBX0VYVFJFTUUKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKCJmaF92ZXJpZnk6ICVzLyVzIHBlcm1pc3Npb24gZmFpbHVyZSwgYWNjPSV4LCBlcnJvcj0lZFxuIiwKKwkJICAgICAgIGRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLCBhY2Nlc3MsIChlcnJvciA+PiAyNCkpOworCX0KKyNlbmRpZgorb3V0OgorCWlmIChleHAgJiYgIUlTX0VSUihleHApKQorCQlleHBfcHV0KGV4cCk7CisJaWYgKGVycm9yID09IG5mc2Vycl9zdGFsZSkKKwkJbmZzZHN0YXRzLmZoX3N0YWxlKys7CisJcmV0dXJuIGVycm9yOworfQorCisKKy8qCisgKiBDb21wb3NlIGEgZmlsZSBoYW5kbGUgZm9yIGFuIE5GUyByZXBseS4KKyAqCisgKiBOb3RlIHRoYXQgd2hlbiBmaXJzdCBjb21wb3NlZCwgdGhlIGRlbnRyeSBtYXkgbm90IHlldCBoYXZlCisgKiBhbiBpbm9kZS4gIEluIHRoaXMgY2FzZSBhIGNhbGwgdG8gZmhfdXBkYXRlIHNob3VsZCBiZSBtYWRlCisgKiBiZWZvcmUgdGhlIGZoIGdvZXMgb3V0IG9uIHRoZSB3aXJlIC4uLgorICovCitzdGF0aWMgaW5saW5lIGludCBfZmhfdXBkYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCwKKwkJCSAgICAgX191MzIgKmRhdGFwLCBpbnQgKm1heHNpemUpCit7CisJc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zICpub3AgPSBleHAtPmV4X21udC0+bW50X3NiLT5zX2V4cG9ydF9vcDsKKwkKKwlpZiAoZGVudHJ5ID09IGV4cC0+ZXhfZGVudHJ5KSB7CisJCSptYXhzaXplID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIENBTEwobm9wLGVuY29kZV9maCkoZGVudHJ5LCBkYXRhcCwgbWF4c2l6ZSwKKwkJCSAgIShleHAtPmV4X2ZsYWdzJk5GU0VYUF9OT1NVQlRSRUVDSEVDSykpOworfQorCisvKgorICogZm9yIGNvbXBvc2luZyBvbGQgc3R5bGUgZmlsZSBoYW5kbGVzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfZmhfdXBkYXRlX29sZChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJICBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwLAorCQkJCSAgc3RydWN0IGtuZnNkX2ZoICpmaCkKK3sKKwlmaC0+b2ZoX2lubyA9IGlub190X3RvX3UzMihkZW50cnktPmRfaW5vZGUtPmlfaW5vKTsKKwlmaC0+b2ZoX2dlbmVyYXRpb24gPSBkZW50cnktPmRfaW5vZGUtPmlfZ2VuZXJhdGlvbjsKKwlpZiAoU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgfHwKKwkgICAgKGV4cC0+ZXhfZmxhZ3MgJiBORlNFWFBfTk9TVUJUUkVFQ0hFQ0spKQorCQlmaC0+b2ZoX2RpcmlubyA9IDA7Cit9CisKK2ludAorZmhfY29tcG9zZShzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBzdmNfZXhwb3J0ICpleHAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHN2Y19maCAqcmVmX2ZoKQoreworCS8qIHJlZl9maCBpcyBhIHJlZmVyZW5jZSBmaWxlIGhhbmRsZS4KKwkgKiBpZiBpdCBpcyBub24tbnVsbCwgdGhlbiB3ZSBzaG91bGQgY29tcG9zZSBhIGZpbGVoYW5kbGUgd2hpY2ggaXMKKwkgKiBvZiB0aGUgc2FtZSB2ZXJzaW9uLCB3aGVyZSBwb3NzaWJsZS4KKwkgKiBDdXJyZW50bHksIHRoYXQgbWVhbnMgdGhhdCBpZiByZWZfZmgtPmZoX2hhbmRsZS5maF92ZXJzaW9uID09IDB4Y2EKKwkgKiBUaGVuIGNyZWF0ZSBhIDMyYnl0ZSBmaWxlaGFuZGxlIHVzaW5nIG5mc19maGJhc2Vfb2xkCisJICoKKwkgKi8KKworCXU4IHJlZl9maF92ZXJzaW9uID0gMDsKKwl1OCByZWZfZmhfZnNpZF90eXBlID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OworCV9fdTMyICpkYXRhcDsKKwlkZXZfdCBleF9kZXYgPSBleHAtPmV4X2RlbnRyeS0+ZF9pbm9kZS0+aV9zYi0+c19kZXY7CisKKwlkcHJpbnRrKCJuZnNkOiBmaF9jb21wb3NlKGV4cCAlMDJ4OiUwMngvJWxkICVzLyVzLCBpbm89JWxkKVxuIiwKKwkJTUFKT1IoZXhfZGV2KSwgTUlOT1IoZXhfZGV2KSwKKwkJKGxvbmcpIGV4cC0+ZXhfZGVudHJ5LT5kX2lub2RlLT5pX2lubywKKwkJcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJKGlub2RlID8gaW5vZGUtPmlfaW5vIDogMCkpOworCisJaWYgKHJlZl9maCkgeworCQlyZWZfZmhfdmVyc2lvbiA9IHJlZl9maC0+ZmhfaGFuZGxlLmZoX3ZlcnNpb247CisJCWlmIChyZWZfZmhfdmVyc2lvbiA9PSAweGNhKQorCQkJcmVmX2ZoX2ZzaWRfdHlwZSA9IDA7CisJCWVsc2UKKwkJCXJlZl9maF9mc2lkX3R5cGUgPSByZWZfZmgtPmZoX2hhbmRsZS5maF9mc2lkX3R5cGU7CisJCWlmIChyZWZfZmhfZnNpZF90eXBlID4gMykKKwkJCXJlZl9maF9mc2lkX3R5cGUgPSAwOworCisJCS8qIG1ha2Ugc3VyZSByZWZfZmggdHlwZSB3b3JrcyBmb3IgZ2l2ZW4gZXhwb3J0ICovCisJCWlmIChyZWZfZmhfZnNpZF90eXBlID09IDEgJiYKKwkJICAgICEoZXhwLT5leF9mbGFncyAmIE5GU0VYUF9GU0lEKSkgeworCQkJLyogaWYgd2UgZG9uJ3QgaGF2ZSBhbiBmc2lkLCB3ZSBjYW5ub3QgcHJvdmlkZSBvbmUuLi4gKi8KKwkJCXJlZl9maF9mc2lkX3R5cGUgPSAwOworCQl9CisJfSBlbHNlIGlmIChleHAtPmV4X2ZsYWdzICYgTkZTRVhQX0ZTSUQpCisJCXJlZl9maF9mc2lkX3R5cGUgPSAxOworCisJaWYgKCFvbGRfdmFsaWRfZGV2KGV4X2RldikgJiYgcmVmX2ZoX2ZzaWRfdHlwZSA9PSAwKSB7CisJCS8qIGZvciBuZXdlciBkZXZpY2UgbnVtYmVycywgd2UgbXVzdCB1c2UgYSBuZXdlciBmc2lkIGZvcm1hdCAqLworCQlyZWZfZmhfdmVyc2lvbiA9IDE7CisJCXJlZl9maF9mc2lkX3R5cGUgPSAzOworCX0KKwlpZiAob2xkX3ZhbGlkX2RldihleF9kZXYpICYmCisJICAgIChyZWZfZmhfZnNpZF90eXBlID09IDIgfHwgcmVmX2ZoX2ZzaWRfdHlwZSA9PSAzKSkKKwkJLyogbXVzdCB1c2UgdHlwZTEgZm9yIHNtYWxsZXIgZGV2aWNlIG51bWJlcnMgKi8KKwkJcmVmX2ZoX2ZzaWRfdHlwZSA9IDA7CisKKwlpZiAocmVmX2ZoID09IGZocCkKKwkJZmhfcHV0KHJlZl9maCk7CisKKwlpZiAoZmhwLT5maF9sb2NrZWQgfHwgZmhwLT5maF9kZW50cnkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmaF9jb21wb3NlOiBmaCAlcy8lcyBub3QgaW5pdGlhbGl6ZWQhXG4iLAorCQkJcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJfQorCWlmIChmaHAtPmZoX21heHNpemUgPCBORlNfRkhTSVpFKQorCQlwcmludGsoS0VSTl9FUlIgImZoX2NvbXBvc2U6IGNhbGxlZCB3aXRoIG1heHNpemUgJWQhICVzLyVzXG4iLAorCQkgICAgICAgZmhwLT5maF9tYXhzaXplLCBwYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWZocC0+ZmhfZGVudHJ5ID0gZGdldChkZW50cnkpOyAvKiBvdXIgaW50ZXJuYWwgY29weSAqLworCWZocC0+ZmhfZXhwb3J0ID0gZXhwOworCWNhY2hlX2dldCgmZXhwLT5oKTsKKworCWlmIChyZWZfZmhfdmVyc2lvbiA9PSAweGNhKSB7CisJCS8qIG9sZCBzdHlsZSBmaWxlaGFuZGxlIHBsZWFzZSAqLworCQltZW1zZXQoJmZocC0+ZmhfaGFuZGxlLmZoX2Jhc2UsIDAsIE5GU19GSFNJWkUpOworCQlmaHAtPmZoX2hhbmRsZS5maF9zaXplID0gTkZTX0ZIU0laRTsKKwkJZmhwLT5maF9oYW5kbGUub2ZoX2Rjb29raWUgPSAweGZlZWJiYWNhOworCQlmaHAtPmZoX2hhbmRsZS5vZmhfZGV2ID0gIG9sZF9lbmNvZGVfZGV2KGV4X2Rldik7CisJCWZocC0+ZmhfaGFuZGxlLm9maF94ZGV2ID0gZmhwLT5maF9oYW5kbGUub2ZoX2RldjsKKwkJZmhwLT5maF9oYW5kbGUub2ZoX3hpbm8gPSBpbm9fdF90b191MzIoZXhwLT5leF9kZW50cnktPmRfaW5vZGUtPmlfaW5vKTsKKwkJZmhwLT5maF9oYW5kbGUub2ZoX2RpcmlubyA9IGlub190X3RvX3UzMihwYXJlbnRfaW5vKGRlbnRyeSkpOworCQlpZiAoaW5vZGUpCisJCQlfZmhfdXBkYXRlX29sZChkZW50cnksIGV4cCwgJmZocC0+ZmhfaGFuZGxlKTsKKwl9IGVsc2UgeworCQlpbnQgbGVuOworCQlmaHAtPmZoX2hhbmRsZS5maF92ZXJzaW9uID0gMTsKKwkJZmhwLT5maF9oYW5kbGUuZmhfYXV0aF90eXBlID0gMDsKKwkJZGF0YXAgPSBmaHAtPmZoX2hhbmRsZS5maF9hdXRoKzA7CisJCWZocC0+ZmhfaGFuZGxlLmZoX2ZzaWRfdHlwZSA9IHJlZl9maF9mc2lkX3R5cGU7CisJCXN3aXRjaCAocmVmX2ZoX2ZzaWRfdHlwZSkgeworCQkJY2FzZSAwOgorCQkJCS8qCisJCQkJICogZnNpZF90eXBlIDA6CisJCQkJICogMmJ5dGUgbWFqb3IsIDJieXRlIG1pbm9yLCA0Ynl0ZSBpbm9kZQorCQkJCSAqLworCQkJCW1rX2ZzaWRfdjAoZGF0YXAsIGV4X2RldiwKKwkJCQkJZXhwLT5leF9kZW50cnktPmRfaW5vZGUtPmlfaW5vKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQkvKiBmc2lkX3R5cGUgMSA9PSA0IGJ5dGVzIGZpbGVzeXN0ZW0gaWQgKi8KKwkJCQlta19mc2lkX3YxKGRhdGFwLCBleHAtPmV4X2ZzaWQpOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCS8qCisJCQkJICogZnNpZF90eXBlIDI6CisJCQkJICogNGJ5dGUgbWFqb3IsIDRieXRlIG1pbm9yLCA0Ynl0ZSBpbm9kZQorCQkJCSAqLworCQkJCW1rX2ZzaWRfdjIoZGF0YXAsIGV4X2RldiwKKwkJCQkJZXhwLT5leF9kZW50cnktPmRfaW5vZGUtPmlfaW5vKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQkvKgorCQkJCSAqIGZzaWRfdHlwZSAzOgorCQkJCSAqIDRieXRlIGRldmljZW51bWJlciwgNGJ5dGUgaW5vZGUKKwkJCQkgKi8KKwkJCQlta19mc2lkX3YzKGRhdGFwLCBleF9kZXYsCisJCQkJCWV4cC0+ZXhfZGVudHJ5LT5kX2lub2RlLT5pX2lubyk7CisJCQkJYnJlYWs7CisJCX0KKwkJbGVuID0ga2V5X2xlbihyZWZfZmhfZnNpZF90eXBlKTsKKwkJZGF0YXAgKz0gbGVuLzQ7CisJCWZocC0+ZmhfaGFuZGxlLmZoX3NpemUgPSA0ICsgbGVuOworCisJCWlmIChpbm9kZSkgeworCQkJaW50IHNpemUgPSAoZmhwLT5maF9tYXhzaXplLWxlbi00KS80OworCQkJZmhwLT5maF9oYW5kbGUuZmhfZmlsZWlkX3R5cGUgPQorCQkJCV9maF91cGRhdGUoZGVudHJ5LCBleHAsIGRhdGFwLCAmc2l6ZSk7CisJCQlmaHAtPmZoX2hhbmRsZS5maF9zaXplICs9IHNpemUqNDsKKwkJfQorCQlpZiAoZmhwLT5maF9oYW5kbGUuZmhfZmlsZWlkX3R5cGUgPT0gMjU1KQorCQkJcmV0dXJuIG5mc2Vycl9vcG5vdHN1cHA7CisJfQorCisJbmZzZF9ucl92ZXJpZmllZCsrOworCXJldHVybiAwOworfQorCisvKgorICogVXBkYXRlIGZpbGUgaGFuZGxlIGluZm9ybWF0aW9uIGFmdGVyIGNoYW5naW5nIGEgZGVudHJ5LgorICogVGhpcyBpcyBvbmx5IGNhbGxlZCBieSBuZnNkX2NyZWF0ZSwgbmZzZF9jcmVhdGVfdjMgYW5kIG5mc2RfcHJvY19jcmVhdGUKKyAqLworaW50CitmaF91cGRhdGUoc3RydWN0IHN2Y19maCAqZmhwKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlfX3UzMiAqZGF0YXA7CisJCisJaWYgKCFmaHAtPmZoX2RlbnRyeSkKKwkJZ290byBvdXRfYmFkOworCisJZGVudHJ5ID0gZmhwLT5maF9kZW50cnk7CisJaWYgKCFkZW50cnktPmRfaW5vZGUpCisJCWdvdG8gb3V0X25lZ2F0aXZlOworCWlmIChmaHAtPmZoX2hhbmRsZS5maF92ZXJzaW9uICE9IDEpIHsKKwkJX2ZoX3VwZGF0ZV9vbGQoZGVudHJ5LCBmaHAtPmZoX2V4cG9ydCwgJmZocC0+ZmhfaGFuZGxlKTsKKwl9IGVsc2UgeworCQlpbnQgc2l6ZTsKKwkJaWYgKGZocC0+ZmhfaGFuZGxlLmZoX2ZpbGVpZF90eXBlICE9IDApCisJCQlnb3RvIG91dF91cHRvZGF0ZTsKKwkJZGF0YXAgPSBmaHAtPmZoX2hhbmRsZS5maF9hdXRoKworCQkJZmhwLT5maF9oYW5kbGUuZmhfc2l6ZS80IC0xOworCQlzaXplID0gKGZocC0+ZmhfbWF4c2l6ZSAtIGZocC0+ZmhfaGFuZGxlLmZoX3NpemUpLzQ7CisJCWZocC0+ZmhfaGFuZGxlLmZoX2ZpbGVpZF90eXBlID0KKwkJCV9maF91cGRhdGUoZGVudHJ5LCBmaHAtPmZoX2V4cG9ydCwgZGF0YXAsICZzaXplKTsKKwkJZmhwLT5maF9oYW5kbGUuZmhfc2l6ZSArPSBzaXplKjQ7CisJCWlmIChmaHAtPmZoX2hhbmRsZS5maF9maWxlaWRfdHlwZSA9PSAyNTUpCisJCQlyZXR1cm4gbmZzZXJyX29wbm90c3VwcDsKKwl9CitvdXQ6CisJcmV0dXJuIDA7CisKK291dF9iYWQ6CisJcHJpbnRrKEtFUk5fRVJSICJmaF91cGRhdGU6IGZoIG5vdCB2ZXJpZmllZCFcbiIpOworCWdvdG8gb3V0Oworb3V0X25lZ2F0aXZlOgorCXByaW50ayhLRVJOX0VSUiAiZmhfdXBkYXRlOiAlcy8lcyBzdGlsbCBuZWdhdGl2ZSFcbiIsCisJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwlnb3RvIG91dDsKK291dF91cHRvZGF0ZToKKwlwcmludGsoS0VSTl9FUlIgImZoX3VwZGF0ZTogJXMvJXMgYWxyZWFkeSB1cC10by1kYXRlIVxuIiwKKwkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWdvdG8gb3V0OworfQorCisvKgorICogUmVsZWFzZSBhIGZpbGUgaGFuZGxlLgorICovCit2b2lkCitmaF9wdXQoc3RydWN0IHN2Y19maCAqZmhwKQoreworCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBmaHAtPmZoX2RlbnRyeTsKKwlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqIGV4cCA9IGZocC0+ZmhfZXhwb3J0OworCWlmIChkZW50cnkpIHsKKwkJZmhfdW5sb2NrKGZocCk7CisJCWZocC0+ZmhfZGVudHJ5ID0gTlVMTDsKKwkJZHB1dChkZW50cnkpOworI2lmZGVmIENPTkZJR19ORlNEX1YzCisJCWZocC0+ZmhfcHJlX3NhdmVkID0gMDsKKwkJZmhwLT5maF9wb3N0X3NhdmVkID0gMDsKKyNlbmRpZgorCQluZnNkX25yX3B1dCsrOworCX0KKwlpZiAoZXhwKSB7CisJCXN2Y19leHBvcnRfcHV0KCZleHAtPmgsICZzdmNfZXhwb3J0X2NhY2hlKTsKKwkJZmhwLT5maF9leHBvcnQgPSBOVUxMOworCX0KKwlyZXR1cm47Cit9CisKKy8qCisgKiBTaG9ydGhhbmQgZm9yIGRwcmludGsoKSdzCisgKi8KK2NoYXIgKiBTVkNGSF9mbXQoc3RydWN0IHN2Y19maCAqZmhwKQoreworCXN0cnVjdCBrbmZzZF9maCAqZmggPSAmZmhwLT5maF9oYW5kbGU7CisKKwlzdGF0aWMgY2hhciBidWZbODBdOworCXNwcmludGYoYnVmLCAiJWQ6ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4IiwKKwkJZmgtPmZoX3NpemUsCisJCWZoLT5maF9iYXNlLmZoX3BhZFswXSwKKwkJZmgtPmZoX2Jhc2UuZmhfcGFkWzFdLAorCQlmaC0+ZmhfYmFzZS5maF9wYWRbMl0sCisJCWZoLT5maF9iYXNlLmZoX3BhZFszXSwKKwkJZmgtPmZoX2Jhc2UuZmhfcGFkWzRdLAorCQlmaC0+ZmhfYmFzZS5maF9wYWRbNV0pOworCXJldHVybiBidWY7Cit9CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc3Byb2MuYyBiL2ZzL25mc2QvbmZzcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1N2Y5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnNkL25mc3Byb2MuYwpAQCAtMCwwICsxLDYwNSBAQAorLyoKKyAqIG5mc3Byb2MyLmMJUHJvY2VzcyB2ZXJzaW9uIDIgTkZTIHJlcXVlc3RzLgorICogbGludXgvZnMvbmZzZC9uZnMycHJvYy5jCisgKiAKKyAqIFByb2Nlc3MgdmVyc2lvbiAyIE5GUyByZXF1ZXN0cy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC94ZHIuaD4KKwordHlwZWRlZiBzdHJ1Y3Qgc3ZjX3Jxc3QJc3ZjX3Jxc3Q7Cit0eXBlZGVmIHN0cnVjdCBzdmNfYnVmCXN2Y19idWY7CisKKyNkZWZpbmUgTkZTRERCR19GQUNJTElUWQkJTkZTRERCR19QUk9DCisKKworc3RhdGljIGludAorbmZzZF9wcm9jX251bGwoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdm9pZCAqYXJncCwgdm9pZCAqcmVzcCkKK3sKKwlyZXR1cm4gbmZzX29rOworfQorCisvKgorICogR2V0IGEgZmlsZSdzIGF0dHJpYnV0ZXMKKyAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIHJlc3AtPmZoIG5lZWRzIGFuIGZoX3B1dAorICovCitzdGF0aWMgaW50CituZnNkX3Byb2NfZ2V0YXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9maGFuZGxlICAqYXJncCwKKwkJCQkJICBzdHJ1Y3QgbmZzZF9hdHRyc3RhdCAqcmVzcCkKK3sKKwlkcHJpbnRrKCJuZnNkOiBHRVRBVFRSICAlc1xuIiwgU1ZDRkhfZm10KCZhcmdwLT5maCkpOworCisJZmhfY29weSgmcmVzcC0+ZmgsICZhcmdwLT5maCk7CisJcmV0dXJuIGZoX3ZlcmlmeShycXN0cCwgJnJlc3AtPmZoLCAwLCBNQVlfTk9QKTsKK30KKworLyoKKyAqIFNldCBhIGZpbGUncyBhdHRyaWJ1dGVzCisgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCByZXNwLT5maCBuZWVkcyBhbiBmaF9wdXQKKyAqLworc3RhdGljIGludAorbmZzZF9wcm9jX3NldGF0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2Rfc2F0dHJhcmdzICphcmdwLAorCQkJCQkgIHN0cnVjdCBuZnNkX2F0dHJzdGF0ICAqcmVzcCkKK3sKKwlkcHJpbnRrKCJuZnNkOiBTRVRBVFRSICAlcywgdmFsaWQ9JXgsIHNpemU9JWxkXG4iLAorCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKKwkJYXJncC0+YXR0cnMuaWFfdmFsaWQsIChsb25nKSBhcmdwLT5hdHRycy5pYV9zaXplKTsKKworCWZoX2NvcHkoJnJlc3AtPmZoLCAmYXJncC0+ZmgpOworCXJldHVybiBuZnNkX3NldGF0dHIocnFzdHAsICZyZXNwLT5maCwgJmFyZ3AtPmF0dHJzLDAsICh0aW1lX3QpMCk7Cit9CisKKy8qCisgKiBMb29rIHVwIGEgcGF0aCBuYW1lIGNvbXBvbmVudAorICogTm90ZTogdGhlIGRlbnRyeSBpbiB0aGUgcmVzcC0+ZmggbWF5IGJlIG5lZ2F0aXZlIGlmIHRoZSBmaWxlCisgKiBkb2Vzbid0IGV4aXN0IHlldC4KKyAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIHJlc3AtPmZoIG5lZWRzIGFuIGZoX3B1dAorICovCitzdGF0aWMgaW50CituZnNkX3Byb2NfbG9va3VwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX2Rpcm9wYXJncyAqYXJncCwKKwkJCQkJIHN0cnVjdCBuZnNkX2Rpcm9wcmVzICAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyOworCisJZHByaW50aygibmZzZDogTE9PS1VQICAgJXMgJS4qc1xuIiwKKwkJU1ZDRkhfZm10KCZhcmdwLT5maCksIGFyZ3AtPmxlbiwgYXJncC0+bmFtZSk7CisKKwlmaF9pbml0KCZyZXNwLT5maCwgTkZTX0ZIU0laRSk7CisJbmZzZXJyID0gbmZzZF9sb29rdXAocnFzdHAsICZhcmdwLT5maCwgYXJncC0+bmFtZSwgYXJncC0+bGVuLAorCQkJCSAmcmVzcC0+ZmgpOworCisJZmhfcHV0KCZhcmdwLT5maCk7CisJcmV0dXJuIG5mc2VycjsKK30KKworLyoKKyAqIFJlYWQgYSBzeW1saW5rLgorICovCitzdGF0aWMgaW50CituZnNkX3Byb2NfcmVhZGxpbmsoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2RfcmVhZGxpbmthcmdzICphcmdwLAorCQkJCQkgICBzdHJ1Y3QgbmZzZF9yZWFkbGlua3JlcyAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyOworCisJZHByaW50aygibmZzZDogUkVBRExJTksgJXNcbiIsIFNWQ0ZIX2ZtdCgmYXJncC0+ZmgpKTsKKworCS8qIFJlYWQgdGhlIHN5bWxpbmsuICovCisJcmVzcC0+bGVuID0gTkZTX01BWFBBVEhMRU47CisJbmZzZXJyID0gbmZzZF9yZWFkbGluayhycXN0cCwgJmFyZ3AtPmZoLCBhcmdwLT5idWZmZXIsICZyZXNwLT5sZW4pOworCisJZmhfcHV0KCZhcmdwLT5maCk7CisJcmV0dXJuIG5mc2VycjsKK30KKworLyoKKyAqIFJlYWQgYSBwb3J0aW9uIG9mIGEgZmlsZS4KKyAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIHJlc3AtPmZoIG5lZWRzIGFuIGZoX3B1dAorICovCitzdGF0aWMgaW50CituZnNkX3Byb2NfcmVhZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9yZWFkYXJncyAqYXJncCwKKwkJCQkgICAgICAgc3RydWN0IG5mc2RfcmVhZHJlcyAgKnJlc3ApCit7CisJaW50CW5mc2VycjsKKworCWRwcmludGsoIm5mc2Q6IFJFQUQgICAgJXMgJWQgYnl0ZXMgYXQgJWRcbiIsCisJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLAorCQlhcmdwLT5jb3VudCwgYXJncC0+b2Zmc2V0KTsKKworCS8qIE9idGFpbiBidWZmZXIgcG9pbnRlciBmb3IgcGF5bG9hZC4gMTkgaXMgMSB3b3JkIGZvcgorCSAqIHN0YXR1cywgMTcgd29yZHMgZm9yIGZhdHRyLCBhbmQgMSB3b3JkIGZvciB0aGUgYnl0ZSBjb3VudC4KKwkgKi8KKworCWlmIChORlNTVkNfTUFYQkxLU0laRSA8IGFyZ3AtPmNvdW50KSB7CisJCXByaW50ayhLRVJOX05PVElDRQorCQkJIm92ZXJzaXplZCByZWFkIHJlcXVlc3QgZnJvbSAldS4ldS4ldS4ldTolZCAoJWQgYnl0ZXMpXG4iLAorCQkJCU5JUFFVQUQocnFzdHAtPnJxX2FkZHIuc2luX2FkZHIuc19hZGRyKSwKKwkJCQludG9ocyhycXN0cC0+cnFfYWRkci5zaW5fcG9ydCksCisJCQkJYXJncC0+Y291bnQpOworCQlhcmdwLT5jb3VudCA9IE5GU1NWQ19NQVhCTEtTSVpFOworCX0KKwlzdmNfcmVzZXJ2ZShycXN0cCwgKDE5PDwyKSArIGFyZ3AtPmNvdW50ICsgNCk7CisKKwlyZXNwLT5jb3VudCA9IGFyZ3AtPmNvdW50OworCW5mc2VyciA9IG5mc2RfcmVhZChycXN0cCwgZmhfY29weSgmcmVzcC0+ZmgsICZhcmdwLT5maCksIE5VTEwsCisJCQkJICBhcmdwLT5vZmZzZXQsCisJCQkgICAJICBhcmdwLT52ZWMsIGFyZ3AtPnZsZW4sCisJCQkJICAmcmVzcC0+Y291bnQpOworCisJcmV0dXJuIG5mc2VycjsKK30KKworLyoKKyAqIFdyaXRlIGRhdGEgdG8gYSBmaWxlCisgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCByZXNwLT5maCBuZWVkcyBhbiBmaF9wdXQKKyAqLworc3RhdGljIGludAorbmZzZF9wcm9jX3dyaXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX3dyaXRlYXJncyAqYXJncCwKKwkJCQkJc3RydWN0IG5mc2RfYXR0cnN0YXQgICpyZXNwKQoreworCWludAluZnNlcnI7CisJaW50CXN0YWJsZSA9IDE7CisKKwlkcHJpbnRrKCJuZnNkOiBXUklURSAgICAlcyAlZCBieXRlcyBhdCAlZFxuIiwKKwkJU1ZDRkhfZm10KCZhcmdwLT5maCksCisJCWFyZ3AtPmxlbiwgYXJncC0+b2Zmc2V0KTsKKworCW5mc2VyciA9IG5mc2Rfd3JpdGUocnFzdHAsIGZoX2NvcHkoJnJlc3AtPmZoLCAmYXJncC0+ZmgpLCBOVUxMLAorCQkJCSAgIGFyZ3AtPm9mZnNldCwKKwkJCQkgICBhcmdwLT52ZWMsIGFyZ3AtPnZsZW4sCisJCQkJICAgYXJncC0+bGVuLAorCQkJCSAgICZzdGFibGUpOworCXJldHVybiBuZnNlcnI7Cit9CisKKy8qCisgKiBDUkVBVEUgcHJvY2Vzc2luZyBpcyBjb21wbGljYXRlZC4gVGhlIGtleXdvcmQgaGVyZSBpcyBgb3ZlcmxvYWRlZC4nCisgKiBUaGUgcGFyZW50IGRpcmVjdG9yeSBpcyBrZXB0IGxvY2tlZCBiZXR3ZWVuIHRoZSBjaGVjayBmb3IgZXhpc3RlbmNlCisgKiBhbmQgdGhlIGFjdHVhbCBjcmVhdGUoKSBjYWxsIGluIGNvbXBsaWFuY2Ugd2l0aCBWRlMgcHJvdG9jb2xzLgorICogTi5CLiBBZnRlciB0aGlzIGNhbGwgX2JvdGhfIGFyZ3AtPmZoIGFuZCByZXNwLT5maCBuZWVkIGFuIGZoX3B1dAorICovCitzdGF0aWMgaW50CituZnNkX3Byb2NfY3JlYXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX2NyZWF0ZWFyZ3MgKmFyZ3AsCisJCQkJCSBzdHJ1Y3QgbmZzZF9kaXJvcHJlcyAgICpyZXNwKQoreworCXN2Y19maAkJKmRpcmZocCA9ICZhcmdwLT5maDsKKwlzdmNfZmgJCSpuZXdmaHAgPSAmcmVzcC0+Zmg7CisJc3RydWN0IGlhdHRyCSphdHRyID0gJmFyZ3AtPmF0dHJzOworCXN0cnVjdCBpbm9kZQkqaW5vZGU7CisJc3RydWN0IGRlbnRyeQkqZGNoaWxkOworCWludAkJbmZzZXJyLCB0eXBlLCBtb2RlOworCWRldl90CQlyZGV2ID0gMCwgd2FudGVkID0gbmV3X2RlY29kZV9kZXYoYXR0ci0+aWFfc2l6ZSk7CisKKwlkcHJpbnRrKCJuZnNkOiBDUkVBVEUgICAlcyAlLipzXG4iLAorCQlTVkNGSF9mbXQoZGlyZmhwKSwgYXJncC0+bGVuLCBhcmdwLT5uYW1lKTsKKworCS8qIEZpcnN0IHZlcmlmeSB0aGUgcGFyZW50IGZpbGUgaGFuZGxlICovCisJbmZzZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCBkaXJmaHAsIFNfSUZESVIsIE1BWV9FWEVDKTsKKwlpZiAobmZzZXJyKQorCQlnb3RvIGRvbmU7IC8qIG11c3QgZmhfcHV0IGRpcmZocCBldmVuIG9uIGVycm9yICovCisKKwkvKiBDaGVjayBmb3IgTUFZX1dSSVRFIGluIG5mc2RfY3JlYXRlIGlmIG5lY2Vzc2FyeSAqLworCisJbmZzZXJyID0gbmZzZXJyX2FjY2VzOworCWlmICghYXJncC0+bGVuKQorCQlnb3RvIGRvbmU7CisJbmZzZXJyID0gbmZzZXJyX2V4aXN0OworCWlmIChpc2RvdGVudChhcmdwLT5uYW1lLCBhcmdwLT5sZW4pKQorCQlnb3RvIGRvbmU7CisJZmhfbG9jayhkaXJmaHApOworCWRjaGlsZCA9IGxvb2t1cF9vbmVfbGVuKGFyZ3AtPm5hbWUsIGRpcmZocC0+ZmhfZGVudHJ5LCBhcmdwLT5sZW4pOworCWlmIChJU19FUlIoZGNoaWxkKSkgeworCQluZnNlcnIgPSBuZnNlcnJubyhQVFJfRVJSKGRjaGlsZCkpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCWZoX2luaXQobmV3ZmhwLCBORlNfRkhTSVpFKTsKKwluZnNlcnIgPSBmaF9jb21wb3NlKG5ld2ZocCwgZGlyZmhwLT5maF9leHBvcnQsIGRjaGlsZCwgZGlyZmhwKTsKKwlpZiAoIW5mc2VyciAmJiAhZGNoaWxkLT5kX2lub2RlKQorCQluZnNlcnIgPSBuZnNlcnJfbm9lbnQ7CisJZHB1dChkY2hpbGQpOworCWlmIChuZnNlcnIpIHsKKwkJaWYgKG5mc2VyciAhPSBuZnNlcnJfbm9lbnQpCisJCQlnb3RvIG91dF91bmxvY2s7CisJCS8qCisJCSAqIElmIHRoZSBuZXcgZmlsZSBoYW5kbGUgd2Fzbid0IHZlcmlmaWVkLCB3ZSBjYW4ndCB0ZWxsCisJCSAqIHdoZXRoZXIgdGhlIGZpbGUgZXhpc3RzIG9yIG5vdC4gVGltZSB0byBiYWlsIC4uLgorCQkgKi8KKwkJbmZzZXJyID0gbmZzZXJyX2FjY2VzOworCQlpZiAoIW5ld2ZocC0+ZmhfZGVudHJ5KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIAorCQkJCSJuZnNkX3Byb2NfY3JlYXRlOiBmaWxlIGhhbmRsZSBub3QgdmVyaWZpZWRcbiIpOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJfQorCisJaW5vZGUgPSBuZXdmaHAtPmZoX2RlbnRyeS0+ZF9pbm9kZTsKKworCS8qIFVuZnVkZ2UgdGhlIG1vZGUgYml0cyAqLworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgeworCQl0eXBlID0gYXR0ci0+aWFfbW9kZSAmIFNfSUZNVDsKKwkJbW9kZSA9IGF0dHItPmlhX21vZGUgJiB+U19JRk1UOworCQlpZiAoIXR5cGUpIHsKKwkJCS8qIG5vIHR5cGUsIHNvIGlmIHRhcmdldCBleGlzdHMsIGFzc3VtZSBzYW1lIGFzIHRoYXQsCisJCQkgKiBlbHNlIGFzc3VtZSBhIGZpbGUgKi8KKwkJCWlmIChpbm9kZSkgeworCQkJCXR5cGUgPSBpbm9kZS0+aV9tb2RlICYgU19JRk1UOworCQkJCXN3aXRjaCh0eXBlKSB7CisJCQkJY2FzZSBTX0lGQ0hSOgorCQkJCWNhc2UgU19JRkJMSzoKKwkJCQkJLyogcmVzZXJ2ZSByZGV2IGZvciBsYXRlciBjaGVja2luZyAqLworCQkJCQlyZGV2ID0gaW5vZGUtPmlfcmRldjsKKwkJCQkJYXR0ci0+aWFfdmFsaWQgfD0gQVRUUl9TSVpFOworCisJCQkJCS8qIEZBTExUSFJPVUdIICovCisJCQkJY2FzZSBTX0lGSUZPOgorCQkJCQkvKiB0aGlzIGlzIHByb2JhYmx5IGEgcGVybWlzc2lvbiBjaGVjay4uCisJCQkJCSAqIGF0IGxlYXN0IElSSVggaW1wbGVtZW50cyBwZXJtIGNoZWNraW5nIG9uCisJCQkJCSAqICAgZWNobyB0aGluZyA+IGRldmljZS1zcGVjaWFsLWZpbGUtb3ItcGlwZQorCQkJCQkgKiBieSBkb2luZyBhIENSRUFURSB3aXRoIHR5cGU9PTAKKwkJCQkJICovCisJCQkJCW5mc2VyciA9IG5mc2RfcGVybWlzc2lvbihuZXdmaHAtPmZoX2V4cG9ydCwKKwkJCQkJCQkJIG5ld2ZocC0+ZmhfZGVudHJ5LAorCQkJCQkJCQkgTUFZX1dSSVRFfE1BWV9MT0NBTF9BQ0NFU1MpOworCQkJCQlpZiAobmZzZXJyICYmIG5mc2VyciAhPSBuZnNlcnJfcm9mcykKKwkJCQkJCWdvdG8gb3V0X3VubG9jazsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQl0eXBlID0gU19JRlJFRzsKKwkJfQorCX0gZWxzZSBpZiAoaW5vZGUpIHsKKwkJdHlwZSA9IGlub2RlLT5pX21vZGUgJiBTX0lGTVQ7CisJCW1vZGUgPSBpbm9kZS0+aV9tb2RlICYgflNfSUZNVDsKKwl9IGVsc2UgeworCQl0eXBlID0gU19JRlJFRzsKKwkJbW9kZSA9IDA7CS8qID8/PyAqLworCX0KKworCWF0dHItPmlhX3ZhbGlkIHw9IEFUVFJfTU9ERTsKKwlhdHRyLT5pYV9tb2RlID0gbW9kZTsKKworCS8qIFNwZWNpYWwgdHJlYXRtZW50IGZvciBub24tcmVndWxhciBmaWxlcyBhY2NvcmRpbmcgdG8gdGhlCisJICogZ29zcGVsIG9mIHN1biBtaWNybworCSAqLworCWlmICh0eXBlICE9IFNfSUZSRUcpIHsKKwkJaW50CWlzX2JvcmMgPSAwOworCQlpZiAodHlwZSAhPSBTX0lGQkxLICYmIHR5cGUgIT0gU19JRkNIUikgeworCQkJcmRldiA9IDA7CisJCX0gZWxzZSBpZiAodHlwZSA9PSBTX0lGQ0hSICYmICEoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpKSB7CisJCQkvKiBJZiB5b3UgdGhpbmsgeW91J3ZlIHNlZW4gdGhlIHdvcnN0LCBncm9rIHRoaXMuICovCisJCQl0eXBlID0gU19JRklGTzsKKwkJfSBlbHNlIHsKKwkJCS8qIE9rYXksIGNoYXIgb3IgYmxvY2sgc3BlY2lhbCAqLworCQkJaXNfYm9yYyA9IDE7CisJCQlpZiAoIXJkZXYpCisJCQkJcmRldiA9IHdhbnRlZDsKKwkJfQorCisJCS8qIHdlJ3ZlIHVzZWQgdGhlIFNJWkUgaW5mb3JtYXRpb24sIHNvIGRpc2NhcmQgaXQgKi8KKwkJYXR0ci0+aWFfdmFsaWQgJj0gfkFUVFJfU0laRTsKKworCQkvKiBNYWtlIHN1cmUgdGhlIHR5cGUgYW5kIGRldmljZSBtYXRjaGVzICovCisJCW5mc2VyciA9IG5mc2Vycl9leGlzdDsKKwkJaWYgKGlub2RlICYmIHR5cGUgIT0gKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpKQorCQkJZ290byBvdXRfdW5sb2NrOworCX0KKworCW5mc2VyciA9IDA7CisJaWYgKCFpbm9kZSkgeworCQkvKiBGaWxlIGRvZXNuJ3QgZXhpc3QuIENyZWF0ZSBpdCBhbmQgc2V0IGF0dHJzICovCisJCW5mc2VyciA9IG5mc2RfY3JlYXRlKHJxc3RwLCBkaXJmaHAsIGFyZ3AtPm5hbWUsIGFyZ3AtPmxlbiwKKwkJCQkJYXR0ciwgdHlwZSwgcmRldiwgbmV3ZmhwKTsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gU19JRlJFRykgeworCQlkcHJpbnRrKCJuZnNkOiAgIGV4aXN0aW5nICVzLCB2YWxpZD0leCwgc2l6ZT0lbGRcbiIsCisJCQlhcmdwLT5uYW1lLCBhdHRyLT5pYV92YWxpZCwgKGxvbmcpIGF0dHItPmlhX3NpemUpOworCQkvKiBGaWxlIGFscmVhZHkgZXhpc3RzLiBXZSBpZ25vcmUgYWxsIGF0dHJpYnV0ZXMgZXhjZXB0CisJCSAqIHNpemUsIHNvIHRoYXQgY3JlYXQoKSBiZWhhdmVzIGV4YWN0bHkgbGlrZQorCQkgKiBvcGVuKC4uLiwgT19DUkVBVHxPX1RSVU5DfE9fV1JPTkxZKS4KKwkJICovCisJCWF0dHItPmlhX3ZhbGlkICY9IEFUVFJfU0laRTsKKwkJaWYgKGF0dHItPmlhX3ZhbGlkKQorCQkJbmZzZXJyID0gbmZzZF9zZXRhdHRyKHJxc3RwLCBuZXdmaHAsIGF0dHIsIDAsICh0aW1lX3QpMCk7CisJfQorCitvdXRfdW5sb2NrOgorCS8qIFdlIGRvbid0IHJlYWxseSBuZWVkIHRvIHVubG9jaywgYXMgZmhfcHV0IGRvZXMgaXQuICovCisJZmhfdW5sb2NrKGRpcmZocCk7CisKK2RvbmU6CisJZmhfcHV0KGRpcmZocCk7CisJcmV0dXJuIG5mc2VycjsKK30KKworc3RhdGljIGludAorbmZzZF9wcm9jX3JlbW92ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9kaXJvcGFyZ3MgKmFyZ3AsCisJCQkJCSB2b2lkCQkgICAgICAgKnJlc3ApCit7CisJaW50CW5mc2VycjsKKworCWRwcmludGsoIm5mc2Q6IFJFTU9WRSAgICVzICUuKnNcbiIsIFNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLAorCQlhcmdwLT5sZW4sIGFyZ3AtPm5hbWUpOworCisJLyogVW5saW5rLiAtU0lGRElSIG1lYW5zIGZpbGUgbXVzdCBub3QgYmUgYSBkaXJlY3RvcnkgKi8KKwluZnNlcnIgPSBuZnNkX3VubGluayhycXN0cCwgJmFyZ3AtPmZoLCAtU19JRkRJUiwgYXJncC0+bmFtZSwgYXJncC0+bGVuKTsKKwlmaF9wdXQoJmFyZ3AtPmZoKTsKKwlyZXR1cm4gbmZzZXJyOworfQorCitzdGF0aWMgaW50CituZnNkX3Byb2NfcmVuYW1lKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX3JlbmFtZWFyZ3MgKmFyZ3AsCisJCQkJICAJIHZvaWQJCSAgICAgICAgKnJlc3ApCit7CisJaW50CW5mc2VycjsKKworCWRwcmludGsoIm5mc2Q6IFJFTkFNRSAgICVzICUuKnMgLT4gXG4iLAorCQlTVkNGSF9mbXQoJmFyZ3AtPmZmaCksIGFyZ3AtPmZsZW4sIGFyZ3AtPmZuYW1lKTsKKwlkcHJpbnRrKCJuZnNkOiAgICAgICAgLT4gICVzICUuKnNcbiIsCisJCVNWQ0ZIX2ZtdCgmYXJncC0+dGZoKSwgYXJncC0+dGxlbiwgYXJncC0+dG5hbWUpOworCisJbmZzZXJyID0gbmZzZF9yZW5hbWUocnFzdHAsICZhcmdwLT5mZmgsIGFyZ3AtPmZuYW1lLCBhcmdwLT5mbGVuLAorCQkJCSAgICAmYXJncC0+dGZoLCBhcmdwLT50bmFtZSwgYXJncC0+dGxlbik7CisJZmhfcHV0KCZhcmdwLT5mZmgpOworCWZoX3B1dCgmYXJncC0+dGZoKTsKKwlyZXR1cm4gbmZzZXJyOworfQorCitzdGF0aWMgaW50CituZnNkX3Byb2NfbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9saW5rYXJncyAqYXJncCwKKwkJCQl2b2lkCQkJICAgICpyZXNwKQoreworCWludAluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBMSU5LICAgICAlcyAtPlxuIiwKKwkJU1ZDRkhfZm10KCZhcmdwLT5mZmgpKTsKKwlkcHJpbnRrKCJuZnNkOiAgICAlcyAlLipzXG4iLAorCQlTVkNGSF9mbXQoJmFyZ3AtPnRmaCksCisJCWFyZ3AtPnRsZW4sCisJCWFyZ3AtPnRuYW1lKTsKKworCW5mc2VyciA9IG5mc2RfbGluayhycXN0cCwgJmFyZ3AtPnRmaCwgYXJncC0+dG5hbWUsIGFyZ3AtPnRsZW4sCisJCQkJICAmYXJncC0+ZmZoKTsKKwlmaF9wdXQoJmFyZ3AtPmZmaCk7CisJZmhfcHV0KCZhcmdwLT50ZmgpOworCXJldHVybiBuZnNlcnI7Cit9CisKK3N0YXRpYyBpbnQKK25mc2RfcHJvY19zeW1saW5rKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX3N5bWxpbmthcmdzICphcmdwLAorCQkJCSAgICAgICAgICB2b2lkCQkJICAqcmVzcCkKK3sKKwlzdHJ1Y3Qgc3ZjX2ZoCW5ld2ZoOworCWludAkJbmZzZXJyOworCisJZHByaW50aygibmZzZDogU1lNTElOSyAgJXMgJS4qcyAtPiAlLipzXG4iLAorCQlTVkNGSF9mbXQoJmFyZ3AtPmZmaCksIGFyZ3AtPmZsZW4sIGFyZ3AtPmZuYW1lLAorCQlhcmdwLT50bGVuLCBhcmdwLT50bmFtZSk7CisKKwlmaF9pbml0KCZuZXdmaCwgTkZTX0ZIU0laRSk7CisJLyoKKwkgKiBDcmVhdGUgdGhlIGxpbmssIGxvb2sgdXAgbmV3IGZpbGUgYW5kIHNldCBhdHRycy4KKwkgKi8KKwluZnNlcnIgPSBuZnNkX3N5bWxpbmsocnFzdHAsICZhcmdwLT5mZmgsIGFyZ3AtPmZuYW1lLCBhcmdwLT5mbGVuLAorCQkJCQkJIGFyZ3AtPnRuYW1lLCBhcmdwLT50bGVuLAorCQkJCSAJCSAmbmV3ZmgsICZhcmdwLT5hdHRycyk7CisKKworCWZoX3B1dCgmYXJncC0+ZmZoKTsKKwlmaF9wdXQoJm5ld2ZoKTsKKwlyZXR1cm4gbmZzZXJyOworfQorCisvKgorICogTWFrZSBkaXJlY3RvcnkuIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBpZGVtcG90ZW50LgorICogTi5CLiBBZnRlciB0aGlzIGNhbGwgcmVzcC0+ZmggbmVlZHMgYW4gZmhfcHV0CisgKi8KK3N0YXRpYyBpbnQKK25mc2RfcHJvY19ta2RpcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9jcmVhdGVhcmdzICphcmdwLAorCQkJCQlzdHJ1Y3QgbmZzZF9kaXJvcHJlcyAgICpyZXNwKQoreworCWludAluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBNS0RJUiAgICAlcyAlLipzXG4iLCBTVkNGSF9mbXQoJmFyZ3AtPmZoKSwgYXJncC0+bGVuLCBhcmdwLT5uYW1lKTsKKworCWlmIChyZXNwLT5maC5maF9kZW50cnkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIm5mc2RfcHJvY19ta2RpcjogcmVzcG9uc2UgYWxyZWFkeSB2ZXJpZmllZD8/XG4iKTsKKwl9CisKKwlhcmdwLT5hdHRycy5pYV92YWxpZCAmPSB+QVRUUl9TSVpFOworCWZoX2luaXQoJnJlc3AtPmZoLCBORlNfRkhTSVpFKTsKKwluZnNlcnIgPSBuZnNkX2NyZWF0ZShycXN0cCwgJmFyZ3AtPmZoLCBhcmdwLT5uYW1lLCBhcmdwLT5sZW4sCisJCQkJICAgICZhcmdwLT5hdHRycywgU19JRkRJUiwgMCwgJnJlc3AtPmZoKTsKKwlmaF9wdXQoJmFyZ3AtPmZoKTsKKwlyZXR1cm4gbmZzZXJyOworfQorCisvKgorICogUmVtb3ZlIGEgZGlyZWN0b3J5CisgKi8KK3N0YXRpYyBpbnQKK25mc2RfcHJvY19ybWRpcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9kaXJvcGFyZ3MgKmFyZ3AsCisJCQkJIAl2b2lkCQkgICAgICAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyOworCisJZHByaW50aygibmZzZDogUk1ESVIgICAgJXMgJS4qc1xuIiwgU1ZDRkhfZm10KCZhcmdwLT5maCksIGFyZ3AtPmxlbiwgYXJncC0+bmFtZSk7CisKKwluZnNlcnIgPSBuZnNkX3VubGluayhycXN0cCwgJmFyZ3AtPmZoLCBTX0lGRElSLCBhcmdwLT5uYW1lLCBhcmdwLT5sZW4pOworCWZoX3B1dCgmYXJncC0+ZmgpOworCXJldHVybiBuZnNlcnI7Cit9CisKKy8qCisgKiBSZWFkIGEgcG9ydGlvbiBvZiBhIGRpcmVjdG9yeS4KKyAqLworc3RhdGljIGludAorbmZzZF9wcm9jX3JlYWRkaXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2RfcmVhZGRpcmFyZ3MgKmFyZ3AsCisJCQkJCSAgc3RydWN0IG5mc2RfcmVhZGRpcnJlcyAgKnJlc3ApCit7CisJaW50CQluZnNlcnIsIGNvdW50OworCWxvZmZfdAkJb2Zmc2V0OworCisJZHByaW50aygibmZzZDogUkVBRERJUiAgJXMgJWQgYnl0ZXMgYXQgJWRcbiIsCisJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLAkJCisJCWFyZ3AtPmNvdW50LCBhcmdwLT5jb29raWUpOworCisJLyogU2hyaW5rIHRvIHRoZSBjbGllbnQgcmVhZCBzaXplICovCisJY291bnQgPSAoYXJncC0+Y291bnQgPj4gMikgLSAyOworCisJLyogTWFrZSBzdXJlIHdlJ3ZlIHJvb20gZm9yIHRoZSBOVUxMIHB0ciAmIGVvZiBmbGFnICovCisJY291bnQgLT0gMjsKKwlpZiAoY291bnQgPCAwKQorCQljb3VudCA9IDA7CisKKwlyZXNwLT5idWZmZXIgPSBhcmdwLT5idWZmZXI7CisJcmVzcC0+b2Zmc2V0ID0gTlVMTDsKKwlyZXNwLT5idWZsZW4gPSBjb3VudDsKKwlyZXNwLT5jb21tb24uZXJyID0gbmZzX29rOworCS8qIFJlYWQgZGlyZWN0b3J5IGFuZCBlbmNvZGUgZW50cmllcyBvbiB0aGUgZmx5ICovCisJb2Zmc2V0ID0gYXJncC0+Y29va2llOworCW5mc2VyciA9IG5mc2RfcmVhZGRpcihycXN0cCwgJmFyZ3AtPmZoLCAmb2Zmc2V0LCAKKwkJCSAgICAgICZyZXNwLT5jb21tb24sIG5mc3N2Y19lbmNvZGVfZW50cnkpOworCisJcmVzcC0+Y291bnQgPSByZXNwLT5idWZmZXIgLSBhcmdwLT5idWZmZXI7CisJaWYgKHJlc3AtPm9mZnNldCkKKwkJKnJlc3AtPm9mZnNldCA9IGh0b25sKG9mZnNldCk7CisKKwlmaF9wdXQoJmFyZ3AtPmZoKTsKKwlyZXR1cm4gbmZzZXJyOworfQorCisvKgorICogR2V0IGZpbGUgc3lzdGVtIGluZm8KKyAqLworc3RhdGljIGludAorbmZzZF9wcm9jX3N0YXRmcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiBycXN0cCwgc3RydWN0IG5mc2RfZmhhbmRsZSAgICphcmdwLAorCQkJCQkgIHN0cnVjdCBuZnNkX3N0YXRmc3JlcyAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyOworCisJZHByaW50aygibmZzZDogU1RBVEZTICAgJXNcbiIsIFNWQ0ZIX2ZtdCgmYXJncC0+ZmgpKTsKKworCW5mc2VyciA9IG5mc2Rfc3RhdGZzKHJxc3RwLCAmYXJncC0+ZmgsICZyZXNwLT5zdGF0cyk7CisJZmhfcHV0KCZhcmdwLT5maCk7CisJcmV0dXJuIG5mc2VycjsKK30KKworLyoKKyAqIE5GU3YyIFNlcnZlciBwcm9jZWR1cmVzLgorICogT25seSB0aGUgcmVzdWx0cyBvZiBub24taWRlbXBvdGVudCBvcGVyYXRpb25zIGFyZSBjYWNoZWQuCisgKi8KKyNkZWZpbmUgbmZzZF9wcm9jX25vbmUJCU5VTEwKKyNkZWZpbmUgbmZzc3ZjX3JlbGVhc2Vfbm9uZQlOVUxMCitzdHJ1Y3QgbmZzZF92b2lkIHsgaW50IGR1bW15OyB9OworCisjZGVmaW5lIFBST0MobmFtZSwgYXJndCwgcmVzdCwgcmVsdCwgY2FjaGUsIHJlc3BzaXplKQlcCisgeyAoc3ZjX3Byb2NmdW5jKSBuZnNkX3Byb2NfIyNuYW1lLAkJXAorICAgKGt4ZHJwcm9jX3QpIG5mc3N2Y19kZWNvZGVfIyNhcmd0LAkJXAorICAgKGt4ZHJwcm9jX3QpIG5mc3N2Y19lbmNvZGVfIyNyZXN0LAkJXAorICAgKGt4ZHJwcm9jX3QpIG5mc3N2Y19yZWxlYXNlXyMjcmVsdCwJCVwKKyAgIHNpemVvZihzdHJ1Y3QgbmZzZF8jI2FyZ3QpLAkJCVwKKyAgIHNpemVvZihzdHJ1Y3QgbmZzZF8jI3Jlc3QpLAkJCVwKKyAgIDAsCQkJCQkJXAorICAgY2FjaGUsCQkJCQlcCisgICByZXNwc2l6ZSwJCQkJICAgICAgIAlcCisgfQorCisjZGVmaW5lIFNUIDEJCS8qIHN0YXR1cyAqLworI2RlZmluZSBGSCA4CQkvKiBmaWxlaGFuZGxlICovCisjZGVmaW5lCUFUIDE4CQkvKiBhdHRyaWJ1dGVzICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3ZjX3Byb2NlZHVyZQkJbmZzZF9wcm9jZWR1cmVzMlsxOF0gPSB7CisgIFBST0MobnVsbCwJIHZvaWQsCQl2b2lkLAkJbm9uZSwJCVJDX05PQ0FDSEUsIFNUKSwKKyAgUFJPQyhnZXRhdHRyLAkgZmhhbmRsZSwJYXR0cnN0YXQsCWZoYW5kbGUsCVJDX05PQ0FDSEUsIFNUK0FUKSwKKyAgUFJPQyhzZXRhdHRyLCAgc2F0dHJhcmdzLAlhdHRyc3RhdCwJZmhhbmRsZSwJUkNfUkVQTEJVRkYsIFNUK0FUKSwKKyAgUFJPQyhub25lLAkgdm9pZCwJCXZvaWQsCQlub25lLAkJUkNfTk9DQUNIRSwgU1QpLAorICBQUk9DKGxvb2t1cCwJIGRpcm9wYXJncywJZGlyb3ByZXMsCWZoYW5kbGUsCVJDX05PQ0FDSEUsIFNUK0ZIK0FUKSwKKyAgUFJPQyhyZWFkbGluaywgcmVhZGxpbmthcmdzLAlyZWFkbGlua3JlcywJbm9uZSwJCVJDX05PQ0FDSEUsIFNUKzErTkZTX01BWFBBVEhMRU4vNCksCisgIFBST0MocmVhZCwJIHJlYWRhcmdzLAlyZWFkcmVzLAlmaGFuZGxlLAlSQ19OT0NBQ0hFLCBTVCtBVCsxK05GU1NWQ19NQVhCTEtTSVpFKSwKKyAgUFJPQyhub25lLAkgdm9pZCwJCXZvaWQsCQlub25lLAkJUkNfTk9DQUNIRSwgU1QpLAorICBQUk9DKHdyaXRlLAkgd3JpdGVhcmdzLAlhdHRyc3RhdCwJZmhhbmRsZSwJUkNfUkVQTEJVRkYsIFNUK0FUKSwKKyAgUFJPQyhjcmVhdGUsCSBjcmVhdGVhcmdzLAlkaXJvcHJlcywJZmhhbmRsZSwJUkNfUkVQTEJVRkYsIFNUK0ZIK0FUKSwKKyAgUFJPQyhyZW1vdmUsCSBkaXJvcGFyZ3MsCXZvaWQsCQlub25lLAkJUkNfUkVQTFNUQVQsIFNUKSwKKyAgUFJPQyhyZW5hbWUsCSByZW5hbWVhcmdzLAl2b2lkLAkJbm9uZSwJCVJDX1JFUExTVEFULCBTVCksCisgIFBST0MobGluaywJIGxpbmthcmdzLAl2b2lkLAkJbm9uZSwJCVJDX1JFUExTVEFULCBTVCksCisgIFBST0Moc3ltbGluaywJIHN5bWxpbmthcmdzLAl2b2lkLAkJbm9uZSwJCVJDX1JFUExTVEFULCBTVCksCisgIFBST0MobWtkaXIsCSBjcmVhdGVhcmdzLAlkaXJvcHJlcywJZmhhbmRsZSwJUkNfUkVQTEJVRkYsIFNUK0ZIK0FUKSwKKyAgUFJPQyhybWRpciwJIGRpcm9wYXJncywJdm9pZCwJCW5vbmUsCQlSQ19SRVBMU1RBVCwgU1QpLAorICBQUk9DKHJlYWRkaXIsCSByZWFkZGlyYXJncywJcmVhZGRpcnJlcywJbm9uZSwJCVJDX05PQ0FDSEUsIDApLAorICBQUk9DKHN0YXRmcywJIGZoYW5kbGUsCXN0YXRmc3JlcywJbm9uZSwJCVJDX05PQ0FDSEUsIFNUKzUpLAorfTsKKworCitzdHJ1Y3Qgc3ZjX3ZlcnNpb24JbmZzZF92ZXJzaW9uMiA9IHsKKwkJLnZzX3ZlcnMJPSAyLAorCQkudnNfbnByb2MJPSAxOCwKKwkJLnZzX3Byb2MJPSBuZnNkX3Byb2NlZHVyZXMyLAorCQkudnNfZGlzcGF0Y2gJPSBuZnNkX2Rpc3BhdGNoLAorCQkudnNfeGRyc2l6ZQk9IE5GUzJfU1ZDX1hEUlNJWkUsCit9OworCisvKgorICogTWFwIGVycm5vcyB0byBORlMgZXJybm9zLgorICovCitpbnQKK25mc2Vycm5vIChpbnQgZXJybm8pCit7CisJc3RhdGljIHN0cnVjdCB7CisJCWludAluZnNlcnI7CisJCWludAlzeXNlcnI7CisJfSBuZnNfZXJydGJsW10gPSB7CisJCXsgbmZzX29rLCAwIH0sCisJCXsgbmZzZXJyX3Blcm0sIC1FUEVSTSB9LAorCQl7IG5mc2Vycl9ub2VudCwgLUVOT0VOVCB9LAorCQl7IG5mc2Vycl9pbywgLUVJTyB9LAorCQl7IG5mc2Vycl9ueGlvLCAtRU5YSU8gfSwKKwkJeyBuZnNlcnJfYWNjZXMsIC1FQUNDRVMgfSwKKwkJeyBuZnNlcnJfZXhpc3QsIC1FRVhJU1QgfSwKKwkJeyBuZnNlcnJfeGRldiwgLUVYREVWIH0sCisJCXsgbmZzZXJyX21saW5rLCAtRU1MSU5LIH0sCisJCXsgbmZzZXJyX25vZGV2LCAtRU5PREVWIH0sCisJCXsgbmZzZXJyX25vdGRpciwgLUVOT1RESVIgfSwKKwkJeyBuZnNlcnJfaXNkaXIsIC1FSVNESVIgfSwKKwkJeyBuZnNlcnJfaW52YWwsIC1FSU5WQUwgfSwKKwkJeyBuZnNlcnJfZmJpZywgLUVGQklHIH0sCisJCXsgbmZzZXJyX25vc3BjLCAtRU5PU1BDIH0sCisJCXsgbmZzZXJyX3JvZnMsIC1FUk9GUyB9LAorCQl7IG5mc2Vycl9tbGluaywgLUVNTElOSyB9LAorCQl7IG5mc2Vycl9uYW1ldG9vbG9uZywgLUVOQU1FVE9PTE9ORyB9LAorCQl7IG5mc2Vycl9ub3RlbXB0eSwgLUVOT1RFTVBUWSB9LAorI2lmZGVmIEVEUVVPVAorCQl7IG5mc2Vycl9kcXVvdCwgLUVEUVVPVCB9LAorI2VuZGlmCisJCXsgbmZzZXJyX3N0YWxlLCAtRVNUQUxFIH0sCisJCXsgbmZzZXJyX2p1a2Vib3gsIC1FVElNRURPVVQgfSwKKwkJeyBuZnNlcnJfZHJvcGl0LCAtRUFHQUlOIH0sCisJCXsgbmZzZXJyX2Ryb3BpdCwgLUVOT01FTSB9LAorCQl7IG5mc2Vycl9iYWRuYW1lLCAtRVNSQ0ggfSwKKwkJeyBuZnNlcnJfaW8sIC1FVFhUQlNZIH0sCisJCXsgLTEsIC1FSU8gfQorCX07CisJaW50CWk7CisKKwlmb3IgKGkgPSAwOyBuZnNfZXJydGJsW2ldLm5mc2VyciAhPSAtMTsgaSsrKSB7CisJCWlmIChuZnNfZXJydGJsW2ldLnN5c2VyciA9PSBlcnJubykKKwkJCXJldHVybiBuZnNfZXJydGJsW2ldLm5mc2VycjsKKwl9CisJcHJpbnRrIChLRVJOX0lORk8gIm5mc2Q6IG5vbi1zdGFuZGFyZCBlcnJubzogJWRcbiIsIGVycm5vKTsKKwlyZXR1cm4gbmZzZXJyX2lvOworfQorCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc3N2Yy5jIGIvZnMvbmZzZC9uZnNzdmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTU1MTY1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzZC9uZnNzdmMuYwpAQCAtMCwwICsxLDM4NSBAQAorLyoKKyAqIGxpbnV4L2ZzL25mc2QvbmZzc3ZjLmMKKyAqCisgKiBDZW50cmFsIHByb2Nlc3NpbmcgZm9yIG5mc2QuCisgKgorICogQXV0aG9yczoJT2xhZiBLaXJjaCAob2tpckBtb25hZC5zd2IuZGUpCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZnNfc3RydWN0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3RhdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y3NvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL3N0YXRzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2JpbmQuaD4KKworI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZCU5GU0REQkdfU1ZDCisKKy8qIHRoZXNlIHNpZ25hbHMgd2lsbCBiZSBkZWxpdmVyZWQgdG8gYW4gbmZzZCB0aHJlYWQgCisgKiB3aGVuIGhhbmRsaW5nIGEgcmVxdWVzdAorICovCisjZGVmaW5lIEFMTE9XRURfU0lHUwkoc2lnbWFzayhTSUdLSUxMKSkKKy8qIHRoZXNlIHNpZ25hbHMgd2lsbCBiZSBkZWxpdmVyZWQgdG8gYW4gbmZzZCB0aHJlYWQKKyAqIHdoZW4gbm90IGhhbmRsaW5nIGEgcmVxdWVzdC4gaS5lLiB3aGVuIHdhaXRpbmcKKyAqLworI2RlZmluZSBTSFVURE9XTl9TSUdTCShzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdIVVApIHwgc2lnbWFzayhTSUdJTlQpIHwgc2lnbWFzayhTSUdRVUlUKSkKKy8qIGlmIHRoZSBsYXN0IHRocmVhZCBkaWVzIHdpdGggU0lHSFVQLCB0aGVuIHRoZSBleHBvcnRzIHRhYmxlIGlzCisgKiBsZWZ0IHVuY2hhbmdlZCAoIGxpa2UgMi40LXswLTl9ICkuICBBbnkgb3RoZXIgc2lnbmFsIHdpbGwgY2xlYXIKKyAqIHRoZSBleHBvcnRzIHRhYmxlIChsaWtlIDIuMikuCisgKi8KKyNkZWZpbmUJU0lHX05PQ0xFQU4JU0lHSFVQCisKK2V4dGVybiBzdHJ1Y3Qgc3ZjX3Byb2dyYW0JbmZzZF9wcm9ncmFtOworc3RhdGljIHZvaWQJCQluZnNkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApOworc3RydWN0IHRpbWV2YWwJCQluZnNzdmNfYm9vdDsKK3N0YXRpYyBzdHJ1Y3Qgc3ZjX3NlcnYgCQkqbmZzZF9zZXJ2Oworc3RhdGljIGF0b21pY190CQkJbmZzZF9idXN5Oworc3RhdGljIHVuc2lnbmVkIGxvbmcJCW5mc2RfbGFzdF9jYWxsOworc3RhdGljIERFRklORV9TUElOTE9DSyhuZnNkX2NhbGxfbG9jayk7CisKK3N0cnVjdCBuZnNkX2xpc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgCWxpc3Q7CisJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOworfTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIG5mc2RfbGlzdCA9IExJU1RfSEVBRF9JTklUKG5mc2RfbGlzdCk7CisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBuZnNkIHByb2Nlc3NlcworICovCisjZGVmaW5lCU5GU0RfTUFYU0VSVlMJCTgxOTIKKworaW50IG5mc2RfbnJ0aHJlYWRzKHZvaWQpCit7CisJaWYgKG5mc2Rfc2VydiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiBuZnNkX3NlcnYtPnN2X25ydGhyZWFkczsKK30KKworaW50CituZnNkX3N2Yyh1bnNpZ25lZCBzaG9ydCBwb3J0LCBpbnQgbnJzZXJ2cykKK3sKKwlpbnQJZXJyb3I7CisJaW50CW5vbmVfbGVmdDsJCisJc3RydWN0IGxpc3RfaGVhZCAqdmljdGltOworCQorCWxvY2tfa2VybmVsKCk7CisJZHByaW50aygibmZzZDogY3JlYXRpbmcgc2VydmljZVxuIik7CisJZXJyb3IgPSAtRUlOVkFMOworCWlmIChucnNlcnZzIDw9IDApCisJCW5yc2VydnMgPSAwOworCWlmIChucnNlcnZzID4gTkZTRF9NQVhTRVJWUykKKwkJbnJzZXJ2cyA9IE5GU0RfTUFYU0VSVlM7CisJCisJLyogUmVhZGFoZWFkIHBhcmFtIGNhY2hlIC0gd2lsbCBuby1vcCBpZiBpdCBhbHJlYWR5IGV4aXN0cyAqLworCWVycm9yID0JbmZzZF9yYWNhY2hlX2luaXQoMipucnNlcnZzKTsKKwlpZiAoZXJyb3I8MCkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBuZnM0X3N0YXRlX2luaXQoKTsKKwlpZiAoZXJyb3I8MCkKKwkJZ290byBvdXQ7CisJaWYgKCFuZnNkX3NlcnYpIHsKKwkJYXRvbWljX3NldCgmbmZzZF9idXN5LCAwKTsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQluZnNkX3NlcnYgPSBzdmNfY3JlYXRlKCZuZnNkX3Byb2dyYW0sIE5GU0RfQlVGU0laRSk7CisJCWlmIChuZnNkX3NlcnYgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCQllcnJvciA9IHN2Y19tYWtlc29jayhuZnNkX3NlcnYsIElQUFJPVE9fVURQLCBwb3J0KTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gZmFpbHVyZTsKKworI2lmZGVmIENPTkZJR19ORlNEX1RDUAorCQllcnJvciA9IHN2Y19tYWtlc29jayhuZnNkX3NlcnYsIElQUFJPVE9fVENQLCBwb3J0KTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gZmFpbHVyZTsKKyNlbmRpZgorCQlkb19nZXR0aW1lb2ZkYXkoJm5mc3N2Y19ib290KTsJCS8qIHJlY29yZCBib290IHRpbWUgKi8KKwl9IGVsc2UKKwkJbmZzZF9zZXJ2LT5zdl9ucnRocmVhZHMrKzsKKwlucnNlcnZzIC09IChuZnNkX3NlcnYtPnN2X25ydGhyZWFkcy0xKTsKKwl3aGlsZSAobnJzZXJ2cyA+IDApIHsKKwkJbnJzZXJ2cy0tOworCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCQllcnJvciA9IHN2Y19jcmVhdGVfdGhyZWFkKG5mc2QsIG5mc2Rfc2Vydik7CisJCWlmIChlcnJvciA8IDApIHsKKwkJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCQkJYnJlYWs7CisJCX0KKwl9CisJdmljdGltID0gbmZzZF9saXN0Lm5leHQ7CisJd2hpbGUgKG5yc2VydnMgPCAwICYmIHZpY3RpbSAhPSAmbmZzZF9saXN0KSB7CisJCXN0cnVjdCBuZnNkX2xpc3QgKm5sID0KKwkJCWxpc3RfZW50cnkodmljdGltLHN0cnVjdCBuZnNkX2xpc3QsIGxpc3QpOworCQl2aWN0aW0gPSB2aWN0aW0tPm5leHQ7CisJCXNlbmRfc2lnKFNJR19OT0NMRUFOLCBubC0+dGFzaywgMSk7CisJCW5yc2VydnMrKzsKKwl9CisgZmFpbHVyZToKKwlub25lX2xlZnQgPSAobmZzZF9zZXJ2LT5zdl9ucnRocmVhZHMgPT0gMSk7CisJc3ZjX2Rlc3Ryb3kobmZzZF9zZXJ2KTsJCS8qIFJlbGVhc2Ugc2VydmVyICovCisJaWYgKG5vbmVfbGVmdCkgeworCQluZnNkX3NlcnYgPSBOVUxMOworCQluZnNkX3JhY2FjaGVfc2h1dGRvd24oKTsKKwkJbmZzNF9zdGF0ZV9zaHV0ZG93bigpOworCX0KKyBvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit1cGRhdGVfdGhyZWFkX3VzYWdlKGludCBidXN5X3RocmVhZHMpCit7CisJdW5zaWduZWQgbG9uZyBwcmV2X2NhbGw7CisJdW5zaWduZWQgbG9uZyBkaWZmOworCWludCBkZWNpbGU7CisKKwlzcGluX2xvY2soJm5mc2RfY2FsbF9sb2NrKTsKKwlwcmV2X2NhbGwgPSBuZnNkX2xhc3RfY2FsbDsKKwluZnNkX2xhc3RfY2FsbCA9IGppZmZpZXM7CisJZGVjaWxlID0gYnVzeV90aHJlYWRzKjEwL25mc2RzdGF0cy50aF9jbnQ7CisJaWYgKGRlY2lsZT4wICYmIGRlY2lsZSA8PSAxMCkgeworCQlkaWZmID0gbmZzZF9sYXN0X2NhbGwgLSBwcmV2X2NhbGw7CisJCWlmICggKG5mc2RzdGF0cy50aF91c2FnZVtkZWNpbGUtMV0gKz0gZGlmZikgPj0gTkZTRF9VU0FHRV9XUkFQKQorCQkJbmZzZHN0YXRzLnRoX3VzYWdlW2RlY2lsZS0xXSAtPSBORlNEX1VTQUdFX1dSQVA7CisJCWlmIChkZWNpbGUgPT0gMTApCisJCQluZnNkc3RhdHMudGhfZnVsbGNudCsrOworCX0KKwlzcGluX3VubG9jaygmbmZzZF9jYWxsX2xvY2spOworfQorCisvKgorICogVGhpcyBpcyB0aGUgTkZTIHNlcnZlciBrZXJuZWwgdGhyZWFkCisgKi8KK3N0YXRpYyB2b2lkCituZnNkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCit7CisJc3RydWN0IHN2Y19zZXJ2CSpzZXJ2ID0gcnFzdHAtPnJxX3NlcnZlcjsKKwlzdHJ1Y3QgZnNfc3RydWN0ICpmc3A7CisJaW50CQllcnI7CisJc3RydWN0IG5mc2RfbGlzdCBtZTsKKwlzaWdzZXRfdCBzaHV0ZG93bl9tYXNrLCBhbGxvd2VkX21hc2s7CisKKwkvKiBMb2NrIG1vZHVsZSBhbmQgc2V0IHVwIGtlcm5lbCB0aHJlYWQgKi8KKwlsb2NrX2tlcm5lbCgpOworCWRhZW1vbml6ZSgibmZzZCIpOworCisJLyogQWZ0ZXIgZGFlbW9uaXplKCkgdGhpcyBrZXJuZWwgdGhyZWFkIHNoYXJlcyBjdXJyZW50LT5mcworCSAqIHdpdGggdGhlIGluaXQgcHJvY2Vzcy4gV2UgbmVlZCB0byBjcmVhdGUgZmlsZXMgd2l0aCBhCisJICogdW1hc2sgb2YgMCBpbnN0ZWFkIG9mIGluaXQncyB1bWFzay4gKi8KKwlmc3AgPSBjb3B5X2ZzX3N0cnVjdChjdXJyZW50LT5mcyk7CisJaWYgKCFmc3ApIHsKKwkJcHJpbnRrKCJVbmFibGUgdG8gc3RhcnQgbmZzZCB0aHJlYWQ6IG91dCBvZiBtZW1vcnlcbiIpOworCQlnb3RvIG91dDsKKwl9CisJZXhpdF9mcyhjdXJyZW50KTsKKwljdXJyZW50LT5mcyA9IGZzcDsKKwljdXJyZW50LT5mcy0+dW1hc2sgPSAwOworCisJc2lnaW5pdHNldGludigmc2h1dGRvd25fbWFzaywgU0hVVERPV05fU0lHUyk7CisJc2lnaW5pdHNldGludigmYWxsb3dlZF9tYXNrLCBBTExPV0VEX1NJR1MpOworCisJbmZzZHN0YXRzLnRoX2NudCsrOworCisJbG9ja2RfdXAoKTsJCQkJLyogc3RhcnQgbG9ja2QgKi8KKworCW1lLnRhc2sgPSBjdXJyZW50OworCWxpc3RfYWRkKCZtZS5saXN0LCAmbmZzZF9saXN0KTsKKworCXVubG9ja19rZXJuZWwoKTsKKworCS8qCisJICogV2Ugd2FudCBsZXNzIHRocm90dGxpbmcgaW4gYmFsYW5jZV9kaXJ0eV9wYWdlcygpIHNvIHRoYXQgbmZzIHRvCisJICogbG9jYWxob3N0IGRvZXNuJ3QgY2F1c2UgbmZzZCB0byBsb2NrIHVwIGR1ZSB0byBhbGwgdGhlIGNsaWVudCdzCisJICogZGlydHkgcGFnZXMuCisJICovCisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTEVTU19USFJPVFRMRTsKKworCS8qCisJICogVGhlIG1haW4gcmVxdWVzdCBsb29wCisJICovCisJZm9yICg7OykgeworCQkvKiBCbG9jayBhbGwgYnV0IHRoZSBzaHV0ZG93biBzaWduYWxzICovCisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmc2h1dGRvd25fbWFzaywgTlVMTCk7CisKKwkJLyoKKwkJICogRmluZCBhIHNvY2tldCB3aXRoIGRhdGEgYXZhaWxhYmxlIGFuZCBjYWxsIGl0cworCQkgKiByZWN2ZnJvbSByb3V0aW5lLgorCQkgKi8KKwkJd2hpbGUgKChlcnIgPSBzdmNfcmVjdihzZXJ2LCBycXN0cCwKKwkJCQkgICAgICAgNjAqNjAqSFopKSA9PSAtRUFHQUlOKQorCQkJOworCQlpZiAoZXJyIDwgMCkKKwkJCWJyZWFrOworCQl1cGRhdGVfdGhyZWFkX3VzYWdlKGF0b21pY19yZWFkKCZuZnNkX2J1c3kpKTsKKwkJYXRvbWljX2luYygmbmZzZF9idXN5KTsKKworCQkvKiBMb2NrIHRoZSBleHBvcnQgaGFzaCB0YWJsZXMgZm9yIHJlYWRpbmcuICovCisJCWV4cF9yZWFkbG9jaygpOworCisJCS8qIFByb2Nlc3MgcmVxdWVzdCB3aXRoIHNpZ25hbHMgYmxvY2tlZC4gICovCisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmYWxsb3dlZF9tYXNrLCBOVUxMKTsKKworCQlzdmNfcHJvY2VzcyhzZXJ2LCBycXN0cCk7CisKKwkJLyogVW5sb2NrIGV4cG9ydCBoYXNoIHRhYmxlcyAqLworCQlleHBfcmVhZHVubG9jaygpOworCQl1cGRhdGVfdGhyZWFkX3VzYWdlKGF0b21pY19yZWFkKCZuZnNkX2J1c3kpKTsKKwkJYXRvbWljX2RlYygmbmZzZF9idXN5KTsKKwl9CisKKwlpZiAoZXJyICE9IC1FSU5UUikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJuZnNkOiB0ZXJtaW5hdGluZyBvbiBlcnJvciAlZFxuIiwgLWVycik7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaW50CXNpZ25vOworCisJCWZvciAoc2lnbm8gPSAxOyBzaWdubyA8PSBfTlNJRzsgc2lnbm8rKykKKwkJCWlmIChzaWdpc21lbWJlcigmY3VycmVudC0+cGVuZGluZy5zaWduYWwsIHNpZ25vKSAmJgorCQkJICAgICFzaWdpc21lbWJlcigmY3VycmVudC0+YmxvY2tlZCwgc2lnbm8pKQorCQkJCWJyZWFrOworCQllcnIgPSBzaWdubzsKKwl9CisKKwlsb2NrX2tlcm5lbCgpOworCisJLyogUmVsZWFzZSBsb2NrZCAqLworCWxvY2tkX2Rvd24oKTsKKworCS8qIENoZWNrIGlmIHRoaXMgaXMgbGFzdCB0aHJlYWQgKi8KKwlpZiAoc2Vydi0+c3ZfbnJ0aHJlYWRzPT0xKSB7CisJCQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJuZnNkOiBsYXN0IHNlcnZlciBoYXMgZXhpdGVkXG4iKTsKKwkJaWYgKGVyciAhPSBTSUdfTk9DTEVBTikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibmZzZDogdW5leHBvcnRpbmcgYWxsIGZpbGVzeXN0ZW1zXG4iKTsKKwkJCW5mc2RfZXhwb3J0X2ZsdXNoKCk7CisJCX0KKwkJbmZzZF9zZXJ2ID0gTlVMTDsKKwkgICAgICAgIG5mc2RfcmFjYWNoZV9zaHV0ZG93bigpOwkvKiByZWxlYXNlIHJlYWQtYWhlYWQgY2FjaGUgKi8KKwkJbmZzNF9zdGF0ZV9zaHV0ZG93bigpOworCX0KKwlsaXN0X2RlbCgmbWUubGlzdCk7CisJbmZzZHN0YXRzLnRoX2NudCAtLTsKKworb3V0OgorCS8qIFJlbGVhc2UgdGhlIHRocmVhZCAqLworCXN2Y19leGl0X3RocmVhZChycXN0cCk7CisKKwkvKiBSZWxlYXNlIG1vZHVsZSAqLworCW1vZHVsZV9wdXRfYW5kX2V4aXQoMCk7Cit9CisKK2ludAorbmZzZF9kaXNwYXRjaChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnN0YXRwKQoreworCXN0cnVjdCBzdmNfcHJvY2VkdXJlCSpwcm9jOworCWt4ZHJwcm9jX3QJCXhkcjsKKwl1MzIJCQluZnNlcnI7CisJdTMyCQkJKm5mc2VycnA7CisKKwlkcHJpbnRrKCJuZnNkX2Rpc3BhdGNoOiB2ZXJzICVkIHByb2MgJWRcbiIsCisJCQkJcnFzdHAtPnJxX3ZlcnMsIHJxc3RwLT5ycV9wcm9jKTsKKwlwcm9jID0gcnFzdHAtPnJxX3Byb2NpbmZvOworCisJLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHRoaXMgY2FsbCBpbiB0aGUgY2FjaGUuICovCisJc3dpdGNoIChuZnNkX2NhY2hlX2xvb2t1cChycXN0cCwgcHJvYy0+cGNfY2FjaGV0eXBlKSkgeworCWNhc2UgUkNfSU5UUjoKKwljYXNlIFJDX0RST1BJVDoKKwkJcmV0dXJuIDA7CisJY2FzZSBSQ19SRVBMWToKKwkJcmV0dXJuIDE7CisJY2FzZSBSQ19ET0lUOjsKKwkJLyogZG8gaXQgKi8KKwl9CisKKwkvKiBEZWNvZGUgYXJndW1lbnRzICovCisJeGRyID0gcHJvYy0+cGNfZGVjb2RlOworCWlmICh4ZHIgJiYgIXhkcihycXN0cCwgKHUzMiopcnFzdHAtPnJxX2FyZy5oZWFkWzBdLmlvdl9iYXNlLAorCQkJcnFzdHAtPnJxX2FyZ3ApKSB7CisJCWRwcmludGsoIm5mc2Q6IGZhaWxlZCB0byBkZWNvZGUgYXJndW1lbnRzIVxuIik7CisJCW5mc2RfY2FjaGVfdXBkYXRlKHJxc3RwLCBSQ19OT0NBQ0hFLCBOVUxMKTsKKwkJKnN0YXRwID0gcnBjX2dhcmJhZ2VfYXJnczsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogbmVlZCB0byBncmFiIHRoZSBsb2NhdGlvbiB0byBzdG9yZSB0aGUgc3RhdHVzLCBhcworCSAqIG5mc3Y0IGRvZXMgc29tZSBlbmNvZGluZyB3aGlsZSBwcm9jZXNzaW5nIAorCSAqLworCW5mc2VycnAgPSBycXN0cC0+cnFfcmVzLmhlYWRbMF0uaW92X2Jhc2UKKwkJKyBycXN0cC0+cnFfcmVzLmhlYWRbMF0uaW92X2xlbjsKKwlycXN0cC0+cnFfcmVzLmhlYWRbMF0uaW92X2xlbiArPSBzaXplb2YodTMyKTsKKworCS8qIE5vdyBjYWxsIHRoZSBwcm9jZWR1cmUgaGFuZGxlciwgYW5kIGVuY29kZSBORlMgc3RhdHVzLiAqLworCW5mc2VyciA9IHByb2MtPnBjX2Z1bmMocnFzdHAsIHJxc3RwLT5ycV9hcmdwLCBycXN0cC0+cnFfcmVzcCk7CisJaWYgKG5mc2VyciA9PSBuZnNlcnJfanVrZWJveCAmJiBycXN0cC0+cnFfdmVycyA9PSAyKQorCQluZnNlcnIgPSBuZnNlcnJfZHJvcGl0OworCWlmIChuZnNlcnIgPT0gbmZzZXJyX2Ryb3BpdCkgeworCQlkcHJpbnRrKCJuZnNkOiBEcm9wcGluZyByZXF1ZXN0IGR1ZSB0byBtYWxsb2MgZmFpbHVyZSFcbiIpOworCQluZnNkX2NhY2hlX3VwZGF0ZShycXN0cCwgUkNfTk9DQUNIRSwgTlVMTCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChycXN0cC0+cnFfcHJvYyAhPSAwKQorCQkqbmZzZXJycCsrID0gbmZzZXJyOworCisJLyogRW5jb2RlIHJlc3VsdC4KKwkgKiBGb3IgTkZTdjIsIGFkZGl0aW9uYWwgaW5mbyBpcyBuZXZlciByZXR1cm5lZCBpbiBjYXNlIG9mIGFuIGVycm9yLgorCSAqLworCWlmICghKG5mc2VyciAmJiBycXN0cC0+cnFfdmVycyA9PSAyKSkgeworCQl4ZHIgPSBwcm9jLT5wY19lbmNvZGU7CisJCWlmICh4ZHIgJiYgIXhkcihycXN0cCwgbmZzZXJycCwKKwkJCQlycXN0cC0+cnFfcmVzcCkpIHsKKwkJCS8qIEZhaWxlZCB0byBlbmNvZGUgcmVzdWx0LiBSZWxlYXNlIGNhY2hlIGVudHJ5ICovCisJCQlkcHJpbnRrKCJuZnNkOiBmYWlsZWQgdG8gZW5jb2RlIHJlc3VsdCFcbiIpOworCQkJbmZzZF9jYWNoZV91cGRhdGUocnFzdHAsIFJDX05PQ0FDSEUsIE5VTEwpOworCQkJKnN0YXRwID0gcnBjX3N5c3RlbV9lcnI7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8qIFN0b3JlIHJlcGx5IGluIGNhY2hlLiAqLworCW5mc2RfY2FjaGVfdXBkYXRlKHJxc3RwLCBwcm9jLT5wY19jYWNoZXR5cGUsIHN0YXRwICsgMSk7CisJcmV0dXJuIDE7Cit9CisKK2V4dGVybiBzdHJ1Y3Qgc3ZjX3ZlcnNpb24gbmZzZF92ZXJzaW9uMiwgbmZzZF92ZXJzaW9uMywgbmZzZF92ZXJzaW9uNDsKKworc3RhdGljIHN0cnVjdCBzdmNfdmVyc2lvbiAqCW5mc2RfdmVyc2lvbltdID0geworCVsyXSA9ICZuZnNkX3ZlcnNpb24yLAorI2lmIGRlZmluZWQoQ09ORklHX05GU0RfVjMpCisJWzNdID0gJm5mc2RfdmVyc2lvbjMsCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19ORlNEX1Y0KQorCVs0XSA9ICZuZnNkX3ZlcnNpb240LAorI2VuZGlmCit9OworCisjZGVmaW5lIE5GU0RfTlJWRVJTCQkoc2l6ZW9mKG5mc2RfdmVyc2lvbikvc2l6ZW9mKG5mc2RfdmVyc2lvblswXSkpCitzdHJ1Y3Qgc3ZjX3Byb2dyYW0JCW5mc2RfcHJvZ3JhbSA9IHsKKwkucGdfcHJvZwkJPSBORlNfUFJPR1JBTSwJCS8qIHByb2dyYW0gbnVtYmVyICovCisJLnBnX252ZXJzCQk9IE5GU0RfTlJWRVJTLAkJLyogbnIgb2YgZW50cmllcyBpbiBuZnNkX3ZlcnNpb24gKi8KKwkucGdfdmVycwkJPSBuZnNkX3ZlcnNpb24sCQkvKiB2ZXJzaW9uIHRhYmxlICovCisJLnBnX25hbWUJCT0gIm5mc2QiLAkJLyogcHJvZ3JhbSBuYW1lICovCisJLnBnX2NsYXNzCQk9ICJuZnNkIiwJCS8qIGF1dGhlbnRpY2F0aW9uIGNsYXNzICovCisJLnBnX3N0YXRzCQk9ICZuZnNkX3N2Y3N0YXRzLAkvKiB2ZXJzaW9uIHRhYmxlICovCisJLnBnX2F1dGhlbnRpY2F0ZQk9ICZzdmNfc2V0X2NsaWVudCwJLyogZXhwb3J0IGF1dGhlbnRpY2F0aW9uICovCisKK307CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc3hkci5jIGIvZnMvbmZzZC9uZnN4ZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDhiMDgyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzZC9uZnN4ZHIuYwpAQCAtMCwwICsxLDUxMSBAQAorLyoKKyAqIGxpbnV4L2ZzL25mc2QveGRyLmMKKyAqCisgKiBYRFIgc3VwcG9ydCBmb3IgbmZzZAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbmZzLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3hkci5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL3hkci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNkZWZpbmUgTkZTRERCR19GQUNJTElUWQkJTkZTRERCR19YRFIKKworCisjaWZkZWYgTkZTRF9PUFRJTUlaRV9TUEFDRQorIyBkZWZpbmUgaW5saW5lCisjZW5kaWYKKworLyoKKyAqIE1hcHBpbmcgb2YgU19JRiogdHlwZXMgdG8gTkZTIGZpbGUgdHlwZXMKKyAqLworc3RhdGljIHUzMgluZnNfZnR5cGVzW10gPSB7CisJTkZOT04sICBORkNIUiwgIE5GQ0hSLCBORkJBRCwKKwlORkRJUiwgIE5GQkFELCAgTkZCTEssIE5GQkFELAorCU5GUkVHLCAgTkZCQUQsICBORkxOSywgTkZCQUQsCisJTkZTT0NLLCBORkJBRCwgIE5GTE5LLCBORkJBRCwKK307CisKKworLyoKKyAqIFhEUiBmdW5jdGlvbnMgZm9yIGJhc2ljIE5GUyB0eXBlcworICovCitzdGF0aWMgaW5saW5lIHUzMiAqCitkZWNvZGVfZmgodTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCit7CisJZmhfaW5pdChmaHAsIE5GU19GSFNJWkUpOworCW1lbWNweSgmZmhwLT5maF9oYW5kbGUuZmhfYmFzZSwgcCwgTkZTX0ZIU0laRSk7CisJZmhwLT5maF9oYW5kbGUuZmhfc2l6ZSA9IE5GU19GSFNJWkU7CisKKwkvKiBGSVhNRTogTG9vayB1cCBleHBvcnQgcG9pbnRlciBoZXJlIGFuZCB2ZXJpZnkKKwkgKiBTdW4gU2VjdXJlIFJQQyBpZiByZXF1ZXN0ZWQgKi8KKwlyZXR1cm4gcCArIChORlNfRkhTSVpFID4+IDIpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiAqCitlbmNvZGVfZmgodTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCit7CisJbWVtY3B5KHAsICZmaHAtPmZoX2hhbmRsZS5maF9iYXNlLCBORlNfRkhTSVpFKTsKKwlyZXR1cm4gcCArIChORlNfRkhTSVpFPj4gMik7Cit9CisKKy8qCisgKiBEZWNvZGUgYSBmaWxlIG5hbWUgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSBwYXRoIGNvbnRhaW5zCisgKiBubyBzbGFzaGVzIG9yIG51bGwgYnl0ZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyICoKK2RlY29kZV9maWxlbmFtZSh1MzIgKnAsIGNoYXIgKipuYW1wLCBpbnQgKmxlbnApCit7CisJY2hhcgkJKm5hbWU7CisJaW50CQlpOworCisJaWYgKChwID0geGRyX2RlY29kZV9zdHJpbmdfaW5wbGFjZShwLCBuYW1wLCBsZW5wLCBORlNfTUFYTkFNTEVOKSkgIT0gTlVMTCkgeworCQlmb3IgKGkgPSAwLCBuYW1lID0gKm5hbXA7IGkgPCAqbGVucDsgaSsrLCBuYW1lKyspIHsKKwkJCWlmICgqbmFtZSA9PSAnXDAnIHx8ICpuYW1lID09ICcvJykKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiBwOworfQorCitzdGF0aWMgaW5saW5lIHUzMiAqCitkZWNvZGVfcGF0aG5hbWUodTMyICpwLCBjaGFyICoqbmFtcCwgaW50ICpsZW5wKQoreworCWNoYXIJCSpuYW1lOworCWludAkJaTsKKworCWlmICgocCA9IHhkcl9kZWNvZGVfc3RyaW5nX2lucGxhY2UocCwgbmFtcCwgbGVucCwgTkZTX01BWFBBVEhMRU4pKSAhPSBOVUxMKSB7CisJCWZvciAoaSA9IDAsIG5hbWUgPSAqbmFtcDsgaSA8ICpsZW5wOyBpKyssIG5hbWUrKykgeworCQkJaWYgKCpuYW1lID09ICdcMCcpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGlubGluZSB1MzIgKgorZGVjb2RlX3NhdHRyKHUzMiAqcCwgc3RydWN0IGlhdHRyICppYXApCit7CisJdTMyCXRtcCwgdG1wMTsKKworCWlhcC0+aWFfdmFsaWQgPSAwOworCisJLyogU3VuIGNsaWVudCBidWcgY29tcGF0aWJpbGl0eSBjaGVjazogc29tZSBzdW4gY2xpZW50cyBzZWVtIHRvCisJICogcHV0IDB4ZmZmZiBpbiB0aGUgbW9kZSBmaWVsZCB3aGVuIHRoZXkgbWVhbiAweGZmZmZmZmZmLgorCSAqIFF1b3RpbmcgdGhlIDQuNEJTRCBuZnMgc2VydmVyIGNvZGU6IE5haCBuYWggbmFoIG5haCBuYSBuYWguCisJICovCisJaWYgKCh0bXAgPSBudG9obCgqcCsrKSkgIT0gKHUzMiktMSAmJiB0bXAgIT0gMHhmZmZmKSB7CisJCWlhcC0+aWFfdmFsaWQgfD0gQVRUUl9NT0RFOworCQlpYXAtPmlhX21vZGUgPSB0bXA7CisJfQorCWlmICgodG1wID0gbnRvaGwoKnArKykpICE9ICh1MzIpLTEpIHsKKwkJaWFwLT5pYV92YWxpZCB8PSBBVFRSX1VJRDsKKwkJaWFwLT5pYV91aWQgPSB0bXA7CisJfQorCWlmICgodG1wID0gbnRvaGwoKnArKykpICE9ICh1MzIpLTEpIHsKKwkJaWFwLT5pYV92YWxpZCB8PSBBVFRSX0dJRDsKKwkJaWFwLT5pYV9naWQgPSB0bXA7CisJfQorCWlmICgodG1wID0gbnRvaGwoKnArKykpICE9ICh1MzIpLTEpIHsKKwkJaWFwLT5pYV92YWxpZCB8PSBBVFRSX1NJWkU7CisJCWlhcC0+aWFfc2l6ZSA9IHRtcDsKKwl9CisJdG1wICA9IG50b2hsKCpwKyspOyB0bXAxID0gbnRvaGwoKnArKyk7CisJaWYgKHRtcCAhPSAodTMyKS0xICYmIHRtcDEgIT0gKHUzMiktMSkgeworCQlpYXAtPmlhX3ZhbGlkIHw9IEFUVFJfQVRJTUUgfCBBVFRSX0FUSU1FX1NFVDsKKwkJaWFwLT5pYV9hdGltZS50dl9zZWMgPSB0bXA7CisJCWlhcC0+aWFfYXRpbWUudHZfbnNlYyA9IHRtcDEgKiAxMDAwOyAKKwl9CisJdG1wICA9IG50b2hsKCpwKyspOyB0bXAxID0gbnRvaGwoKnArKyk7CisJaWYgKHRtcCAhPSAodTMyKS0xICYmIHRtcDEgIT0gKHUzMiktMSkgeworCQlpYXAtPmlhX3ZhbGlkIHw9IEFUVFJfTVRJTUUgfCBBVFRSX01USU1FX1NFVDsKKwkJaWFwLT5pYV9tdGltZS50dl9zZWMgPSB0bXA7CisJCWlhcC0+aWFfbXRpbWUudHZfbnNlYyA9IHRtcDEgKiAxMDAwOyAKKwkJLyoKKwkJICogUGFzc2luZyB0aGUgaW52YWxpZCB2YWx1ZSB1c2Vjb25kcz0xMDAwMDAwIGZvciBtdGltZQorCQkgKiBpcyBhIFN1biBjb252ZW50aW9uIGZvciAic2V0IGJvdGggbXRpbWUgYW5kIGF0aW1lIHRvCisJCSAqIGN1cnJlbnQgc2VydmVyIHRpbWUiLiAgSXQncyBuZWVkZWQgdG8gbWFrZSBwZXJtaXNzaW9ucworCQkgKiBjaGVja3MgZm9yIHRoZSAidG91Y2giIHByb2dyYW0gYWNyb3NzIHYyIG1vdW50cyB0bworCQkgKiBTb2xhcmlzIGFuZCBJcml4IGJveGVzIHdvcmsgY29ycmVjdGx5LiBTZWUgZGVzY3JpcHRpb24gb2YKKwkJICogc2F0dHIgaW4gc2VjdGlvbiA2LjEgb2YgIk5GUyBJbGx1c3RyYXRlZCIgYnkKKwkJICogQnJlbnQgQ2FsbGFnaGFuLCBBZGRpc29uLVdlc2xleSwgSVNCTiAwLTIwMS0zMjc1MC01CisJCSAqLworCQlpZiAodG1wMSA9PSAxMDAwMDAwKQorCQkJaWFwLT5pYV92YWxpZCAmPSB+KEFUVFJfQVRJTUVfU0VUfEFUVFJfTVRJTUVfU0VUKTsKKwl9CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK2VuY29kZV9mYXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IGZocC0+ZmhfZXhwb3J0LT5leF9tbnQ7CisJc3RydWN0IGRlbnRyeQkqZGVudHJ5ID0gZmhwLT5maF9kZW50cnk7CisJc3RydWN0IGtzdGF0IHN0YXQ7CisJaW50IHR5cGU7CisJc3RydWN0IHRpbWVzcGVjIHRpbWU7CisKKwl2ZnNfZ2V0YXR0cihtbnQsIGRlbnRyeSwgJnN0YXQpOworCXR5cGUgPSAoc3RhdC5tb2RlICYgU19JRk1UKTsKKworCSpwKysgPSBodG9ubChuZnNfZnR5cGVzW3R5cGUgPj4gMTJdKTsKKwkqcCsrID0gaHRvbmwoKHUzMikgc3RhdC5tb2RlKTsKKwkqcCsrID0gaHRvbmwoKHUzMikgc3RhdC5ubGluayk7CisJKnArKyA9IGh0b25sKCh1MzIpIG5mc2RfcnVpZChycXN0cCwgc3RhdC51aWQpKTsKKwkqcCsrID0gaHRvbmwoKHUzMikgbmZzZF9yZ2lkKHJxc3RwLCBzdGF0LmdpZCkpOworCisJaWYgKFNfSVNMTksodHlwZSkgJiYgc3RhdC5zaXplID4gTkZTX01BWFBBVEhMRU4pIHsKKwkJKnArKyA9IGh0b25sKE5GU19NQVhQQVRITEVOKTsKKwl9IGVsc2UgeworCQkqcCsrID0gaHRvbmwoKHUzMikgc3RhdC5zaXplKTsKKwl9CisJKnArKyA9IGh0b25sKCh1MzIpIHN0YXQuYmxrc2l6ZSk7CisJaWYgKFNfSVNDSFIodHlwZSkgfHwgU19JU0JMSyh0eXBlKSkKKwkJKnArKyA9IGh0b25sKG5ld19lbmNvZGVfZGV2KHN0YXQucmRldikpOworCWVsc2UKKwkJKnArKyA9IGh0b25sKDB4ZmZmZmZmZmYpOworCSpwKysgPSBodG9ubCgodTMyKSBzdGF0LmJsb2Nrcyk7CisJaWYgKGlzX2ZzaWQoZmhwLCBycXN0cC0+cnFfcmVmZmgpKQorCQkqcCsrID0gaHRvbmwoKHUzMikgZmhwLT5maF9leHBvcnQtPmV4X2ZzaWQpOworCWVsc2UKKwkJKnArKyA9IGh0b25sKG5ld19lbmNvZGVfZGV2KHN0YXQuZGV2KSk7CisJKnArKyA9IGh0b25sKCh1MzIpIHN0YXQuaW5vKTsKKwkqcCsrID0gaHRvbmwoKHUzMikgc3RhdC5hdGltZS50dl9zZWMpOworCSpwKysgPSBodG9ubChzdGF0LmF0aW1lLnR2X25zZWMgPyBzdGF0LmF0aW1lLnR2X25zZWMgLyAxMDAwIDogMCk7CisJbGVhc2VfZ2V0X210aW1lKGRlbnRyeS0+ZF9pbm9kZSwgJnRpbWUpOyAKKwkqcCsrID0gaHRvbmwoKHUzMikgdGltZS50dl9zZWMpOworCSpwKysgPSBodG9ubCh0aW1lLnR2X25zZWMgPyB0aW1lLnR2X25zZWMgLyAxMDAwIDogMCk7IAorCSpwKysgPSBodG9ubCgodTMyKSBzdGF0LmN0aW1lLnR2X3NlYyk7CisJKnArKyA9IGh0b25sKHN0YXQuY3RpbWUudHZfbnNlYyA/IHN0YXQuY3RpbWUudHZfbnNlYyAvIDEwMDAgOiAwKTsKKworCXJldHVybiBwOworfQorCisKKy8qCisgKiBYRFIgZGVjb2RlIGZ1bmN0aW9ucworICovCitpbnQKK25mc3N2Y19kZWNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHZvaWQgKmR1bW15KQoreworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzc3ZjX2RlY29kZV9maGFuZGxlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5mc2RfZmhhbmRsZSAqYXJncykKK3sKKwlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25mc3N2Y19kZWNvZGVfc2F0dHJhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2Rfc2F0dHJhcmdzICphcmdzKQoreworCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkKKwkgfHwgIShwID0gZGVjb2RlX3NhdHRyKHAsICZhcmdzLT5hdHRycykpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzc3ZjX2RlY29kZV9kaXJvcGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZF9kaXJvcGFyZ3MgKmFyZ3MpCit7CisJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKQorCSB8fCAhKHAgPSBkZWNvZGVfZmlsZW5hbWUocCwgJmFyZ3MtPm5hbWUsICZhcmdzLT5sZW4pKSkKKwkJcmV0dXJuIDA7CisKKwkgcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CituZnNzdmNfZGVjb2RlX3JlYWRhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2RfcmVhZGFyZ3MgKmFyZ3MpCit7CisJdW5zaWduZWQgaW50IGxlbjsKKwlpbnQgdixwbjsKKwlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpKQorCQlyZXR1cm4gMDsKKworCWFyZ3MtPm9mZnNldCAgICA9IG50b2hsKCpwKyspOworCWxlbiA9IGFyZ3MtPmNvdW50ICAgICA9IG50b2hsKCpwKyspOworCXArKzsgLyogdG90YWxjb3VudCAtIHVudXNlZCAqLworCisJaWYgKGxlbiA+IE5GU1NWQ19NQVhCTEtTSVpFKQorCQlsZW4gPSBORlNTVkNfTUFYQkxLU0laRTsKKworCS8qIHNldCB1cCBzb21ld2hlcmUgdG8gc3RvcmUgcmVzcG9uc2UuCisJICogV2UgdGFrZSBwYWdlcywgcHV0IHRoZW0gb24gcmVzbGlzdCBhbmQgaW5jbHVkZSBpbiBpb3ZlYworCSAqLworCXY9MDsKKwl3aGlsZSAobGVuID4gMCkgeworCQlwbj1ycXN0cC0+cnFfcmVzdXNlZDsKKwkJc3ZjX3Rha2VfcGFnZShycXN0cCk7CisJCWFyZ3MtPnZlY1t2XS5pb3ZfYmFzZSA9IHBhZ2VfYWRkcmVzcyhycXN0cC0+cnFfcmVzcGFnZXNbcG5dKTsKKwkJYXJncy0+dmVjW3ZdLmlvdl9sZW4gPSBsZW4gPCBQQUdFX1NJWkU/bGVuOlBBR0VfU0laRTsKKwkJbGVuIC09IGFyZ3MtPnZlY1t2XS5pb3ZfbGVuOworCQl2Kys7CisJfQorCWFyZ3MtPnZsZW4gPSB2OworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzc3ZjX2RlY29kZV93cml0ZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZF93cml0ZWFyZ3MgKmFyZ3MpCit7CisJdW5zaWduZWQgaW50IGxlbjsKKwlpbnQgdjsKKwlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpKQorCQlyZXR1cm4gMDsKKworCXArKzsJCQkJLyogYmVnaW5vZmZzZXQgKi8KKwlhcmdzLT5vZmZzZXQgPSBudG9obCgqcCsrKTsJLyogb2Zmc2V0ICovCisJcCsrOwkJCQkvKiB0b3RhbGNvdW50ICovCisJbGVuID0gYXJncy0+bGVuID0gbnRvaGwoKnArKyk7CisJYXJncy0+dmVjWzBdLmlvdl9iYXNlID0gKHZvaWQqKXA7CisJYXJncy0+dmVjWzBdLmlvdl9sZW4gPSBycXN0cC0+cnFfYXJnLmhlYWRbMF0uaW92X2xlbiAtCisJCQkJKCgodm9pZCopcCkgLSBycXN0cC0+cnFfYXJnLmhlYWRbMF0uaW92X2Jhc2UpOworCWlmIChsZW4gPiBORlNTVkNfTUFYQkxLU0laRSkKKwkJbGVuID0gTkZTU1ZDX01BWEJMS1NJWkU7CisJdiA9IDA7CisJd2hpbGUgKGxlbiA+IGFyZ3MtPnZlY1t2XS5pb3ZfbGVuKSB7CisJCWxlbiAtPSBhcmdzLT52ZWNbdl0uaW92X2xlbjsKKwkJdisrOworCQlhcmdzLT52ZWNbdl0uaW92X2Jhc2UgPSBwYWdlX2FkZHJlc3MocnFzdHAtPnJxX2FyZ3BhZ2VzW3ZdKTsKKwkJYXJncy0+dmVjW3ZdLmlvdl9sZW4gPSBQQUdFX1NJWkU7CisJfQorCWFyZ3MtPnZlY1t2XS5pb3ZfbGVuID0gbGVuOworCWFyZ3MtPnZsZW4gPSB2KzE7CisJcmV0dXJuIGFyZ3MtPnZlY1swXS5pb3ZfbGVuID4gMDsKK30KKworaW50CituZnNzdmNfZGVjb2RlX2NyZWF0ZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZF9jcmVhdGVhcmdzICphcmdzKQoreworCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkKKwkgfHwgIShwID0gZGVjb2RlX2ZpbGVuYW1lKHAsICZhcmdzLT5uYW1lLCAmYXJncy0+bGVuKSkKKwkgfHwgIShwID0gZGVjb2RlX3NhdHRyKHAsICZhcmdzLT5hdHRycykpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzc3ZjX2RlY29kZV9yZW5hbWVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2RfcmVuYW1lYXJncyAqYXJncykKK3sKKwlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5mZmgpKQorCSB8fCAhKHAgPSBkZWNvZGVfZmlsZW5hbWUocCwgJmFyZ3MtPmZuYW1lLCAmYXJncy0+ZmxlbikpCisJIHx8ICEocCA9IGRlY29kZV9maChwLCAmYXJncy0+dGZoKSkKKwkgfHwgIShwID0gZGVjb2RlX2ZpbGVuYW1lKHAsICZhcmdzLT50bmFtZSwgJmFyZ3MtPnRsZW4pKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25mc3N2Y19kZWNvZGVfcmVhZGxpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5mc2RfcmVhZGxpbmthcmdzICphcmdzKQoreworCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkpCisJCXJldHVybiAwOworCXN2Y190YWtlX3BhZ2UocnFzdHApOworCWFyZ3MtPmJ1ZmZlciA9IHBhZ2VfYWRkcmVzcyhycXN0cC0+cnFfcmVzcGFnZXNbcnFzdHAtPnJxX3Jlc3VzZWQtMV0pOworCisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CituZnNzdmNfZGVjb2RlX2xpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2RfbGlua2FyZ3MgKmFyZ3MpCit7CisJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmZoKSkKKwkgfHwgIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT50ZmgpKQorCSB8fCAhKHAgPSBkZWNvZGVfZmlsZW5hbWUocCwgJmFyZ3MtPnRuYW1lLCAmYXJncy0+dGxlbikpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzc3ZjX2RlY29kZV9zeW1saW5rYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkX3N5bWxpbmthcmdzICphcmdzKQoreworCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZmaCkpCisJIHx8ICEocCA9IGRlY29kZV9maWxlbmFtZShwLCAmYXJncy0+Zm5hbWUsICZhcmdzLT5mbGVuKSkKKwkgfHwgIShwID0gZGVjb2RlX3BhdGhuYW1lKHAsICZhcmdzLT50bmFtZSwgJmFyZ3MtPnRsZW4pKQorCSB8fCAhKHAgPSBkZWNvZGVfc2F0dHIocCwgJmFyZ3MtPmF0dHJzKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CituZnNzdmNfZGVjb2RlX3JlYWRkaXJhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2RfcmVhZGRpcmFyZ3MgKmFyZ3MpCit7CisJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKSkKKwkJcmV0dXJuIDA7CisJYXJncy0+Y29va2llID0gbnRvaGwoKnArKyk7CisJYXJncy0+Y291bnQgID0gbnRvaGwoKnArKyk7CisJaWYgKGFyZ3MtPmNvdW50ID4gUEFHRV9TSVpFKQorCQlhcmdzLT5jb3VudCA9IFBBR0VfU0laRTsKKworCXN2Y190YWtlX3BhZ2UocnFzdHApOworCWFyZ3MtPmJ1ZmZlciA9IHBhZ2VfYWRkcmVzcyhycXN0cC0+cnFfcmVzcGFnZXNbcnFzdHAtPnJxX3Jlc3VzZWQtMV0pOworCisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworLyoKKyAqIFhEUiBlbmNvZGUgZnVuY3Rpb25zCisgKi8KK2ludAorbmZzc3ZjX2VuY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgdm9pZCAqZHVtbXkpCit7CisJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CituZnNzdmNfZW5jb2RlX2F0dHJzdGF0KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2RfYXR0cnN0YXQgKnJlc3ApCit7CisJcCA9IGVuY29kZV9mYXR0cihycXN0cCwgcCwgJnJlc3AtPmZoKTsKKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25mc3N2Y19lbmNvZGVfZGlyb3ByZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZF9kaXJvcHJlcyAqcmVzcCkKK3sKKwlwID0gZW5jb2RlX2ZoKHAsICZyZXNwLT5maCk7CisJcCA9IGVuY29kZV9mYXR0cihycXN0cCwgcCwgJnJlc3AtPmZoKTsKKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25mc3N2Y19lbmNvZGVfcmVhZGxpbmtyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZF9yZWFkbGlua3JlcyAqcmVzcCkKK3sKKwkqcCsrID0gaHRvbmwocmVzcC0+bGVuKTsKKwl4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7CisJcnFzdHAtPnJxX3Jlcy5wYWdlX2xlbiA9IHJlc3AtPmxlbjsKKwlpZiAocmVzcC0+bGVuICYgMykgeworCQkvKiBuZWVkIHRvIHBhZCB0aGUgdGFpbCAqLworCQlycXN0cC0+cnFfcmVzdGFpbHBhZ2UgPSAwOworCQlycXN0cC0+cnFfcmVzLnRhaWxbMF0uaW92X2Jhc2UgPSBwOworCQkqcCA9IDA7CisJCXJxc3RwLT5ycV9yZXMudGFpbFswXS5pb3ZfbGVuID0gNCAtIChyZXNwLT5sZW4mMyk7CisJfQorCXJldHVybiAxOworfQorCitpbnQKK25mc3N2Y19lbmNvZGVfcmVhZHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkX3JlYWRyZXMgKnJlc3ApCit7CisJcCA9IGVuY29kZV9mYXR0cihycXN0cCwgcCwgJnJlc3AtPmZoKTsKKwkqcCsrID0gaHRvbmwocmVzcC0+Y291bnQpOworCXhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKKworCS8qIG5vdyB1cGRhdGUgcnFzdHAtPnJxX3JlcyB0byByZWZsZWN0IGRhdGEgYXN3ZWxsICovCisJcnFzdHAtPnJxX3Jlcy5wYWdlX2xlbiA9IHJlc3AtPmNvdW50OworCWlmIChyZXNwLT5jb3VudCAmIDMpIHsKKwkJLyogbmVlZCB0byBwYWQgdGhlIHRhaWwgKi8KKwkJcnFzdHAtPnJxX3Jlc3RhaWxwYWdlID0gMDsKKwkJcnFzdHAtPnJxX3Jlcy50YWlsWzBdLmlvdl9iYXNlID0gcDsKKwkJKnAgPSAwOworCQlycXN0cC0+cnFfcmVzLnRhaWxbMF0uaW92X2xlbiA9IDQgLSAocmVzcC0+Y291bnQmMyk7CisJfQorCXJldHVybiAxOworfQorCitpbnQKK25mc3N2Y19lbmNvZGVfcmVhZGRpcnJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkX3JlYWRkaXJyZXMgKnJlc3ApCit7CisJeGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworCXAgPSByZXNwLT5idWZmZXI7CisJKnArKyA9IDA7CQkJLyogbm8gbW9yZSBlbnRyaWVzICovCisJKnArKyA9IGh0b25sKChyZXNwLT5jb21tb24uZXJyID09IG5mc2Vycl9lb2YpKTsKKwlycXN0cC0+cnFfcmVzLnBhZ2VfbGVuID0gKCgodW5zaWduZWQgbG9uZylwLTEpICYgflBBR0VfTUFTSykrMTsKKworCXJldHVybiAxOworfQorCitpbnQKK25mc3N2Y19lbmNvZGVfc3RhdGZzcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2Rfc3RhdGZzcmVzICpyZXNwKQoreworCXN0cnVjdCBrc3RhdGZzCSpzdGF0ID0gJnJlc3AtPnN0YXRzOworCisJKnArKyA9IGh0b25sKE5GU1NWQ19NQVhCTEtTSVpFKTsJLyogbWF4IHRyYW5zZmVyIHNpemUgKi8KKwkqcCsrID0gaHRvbmwoc3RhdC0+Zl9ic2l6ZSk7CisJKnArKyA9IGh0b25sKHN0YXQtPmZfYmxvY2tzKTsKKwkqcCsrID0gaHRvbmwoc3RhdC0+Zl9iZnJlZSk7CisJKnArKyA9IGh0b25sKHN0YXQtPmZfYmF2YWlsKTsKKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25mc3N2Y19lbmNvZGVfZW50cnkoc3RydWN0IHJlYWRkaXJfY2QgKmNjZCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgIGludCBuYW1sZW4sIGxvZmZfdCBvZmZzZXQsIGlub190IGlubywgdW5zaWduZWQgaW50IGRfdHlwZSkKK3sKKwlzdHJ1Y3QgbmZzZF9yZWFkZGlycmVzICpjZCA9IGNvbnRhaW5lcl9vZihjY2QsIHN0cnVjdCBuZnNkX3JlYWRkaXJyZXMsIGNvbW1vbik7CisJdTMyCSpwID0gY2QtPmJ1ZmZlcjsKKwlpbnQJYnVmbGVuLCBzbGVuOworCisJLyoKKwlkcHJpbnRrKCJuZnNkOiBlbnRyeSglLipzIG9mZiAlbGQgaW5vICVsZClcbiIsCisJCQluYW1sZW4sIG5hbWUsIG9mZnNldCwgaW5vKTsKKwkgKi8KKworCWlmIChvZmZzZXQgPiB+KCh1MzIpIDApKSB7CisJCWNkLT5jb21tb24uZXJyID0gbmZzZXJyX2ZiaWc7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoY2QtPm9mZnNldCkKKwkJKmNkLT5vZmZzZXQgPSBodG9ubChvZmZzZXQpOworCWlmIChuYW1sZW4gPiBORlMyX01BWE5BTUxFTikKKwkJbmFtbGVuID0gTkZTMl9NQVhOQU1MRU47LyogdHJ1bmNhdGUgZmlsZW5hbWUgKi8KKworCXNsZW4gPSBYRFJfUVVBRExFTihuYW1sZW4pOworCWlmICgoYnVmbGVuID0gY2QtPmJ1ZmxlbiAtIHNsZW4gLSA0KSA8IDApIHsKKwkJY2QtPmNvbW1vbi5lcnIgPSBuZnNlcnJfdG9vc21hbGw7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkqcCsrID0geGRyX29uZTsJCQkJLyogbWFyayBlbnRyeSBwcmVzZW50ICovCisJKnArKyA9IGh0b25sKCh1MzIpIGlubyk7CQkvKiBmaWxlIGlkICovCisJcCAgICA9IHhkcl9lbmNvZGVfYXJyYXkocCwgbmFtZSwgbmFtbGVuKTsvKiBuYW1lIGxlbmd0aCAmIG5hbWUgKi8KKwljZC0+b2Zmc2V0ID0gcDsJCQkvKiByZW1lbWJlciBwb2ludGVyICovCisJKnArKyA9IH4odTMyKSAwOwkJLyogb2Zmc2V0IG9mIG5leHQgZW50cnkgKi8KKworCWNkLT5idWZsZW4gPSBidWZsZW47CisJY2QtPmJ1ZmZlciA9IHA7CisJY2QtPmNvbW1vbi5lcnIgPSBuZnNfb2s7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBYRFIgcmVsZWFzZSBmdW5jdGlvbnMKKyAqLworaW50CituZnNzdmNfcmVsZWFzZV9maGFuZGxlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2RfZmhhbmRsZSAqcmVzcCkKK3sKKwlmaF9wdXQoJnJlc3AtPmZoKTsKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2ZzL25mc2Qvc3RhdHMuYyBiL2ZzL25mc2Qvc3RhdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2Y5NTViCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzZC9zdGF0cy5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogbGludXgvZnMvbmZzZC9zdGF0cy5jCisgKgorICogcHJvY2ZzLWJhc2VkIHVzZXIgYWNjZXNzIHRvIGtuZnNkIHN0YXRpc3RpY3MKKyAqCisgKiAvcHJvYy9uZXQvcnBjL25mc2QKKyAqCisgKiBGb3JtYXQ6CisgKglyYyA8aGl0cz4gPG1pc3Nlcz4gPG5vY2FjaGU+CisgKgkJCVN0YXRpc3RzaWNzIGZvciB0aGUgcmVwbHkgY2FjaGUKKyAqCWZoIDxzdGFsZT4gPHRvdGFsLWxvb2t1cHM+IDxhbm9ubG9va3Vwcz4gPGRpci1ub3QtaW4tZGNhY2hlPiA8bm9uZGlyLW5vdC1pbi1kY2FjaGU+CisgKgkJCXN0YXRpc3RpY3MgZm9yIGZpbGVoYW5kbGUgbG9va3VwCisgKglpbyA8Ynl0ZXMtcmVhZD4gPGJ5dGVzLXdyaXR0dGVuPgorICoJCQlzdGF0aXN0aWNzIGZvciBJTyB0aHJvdWdocHV0CisgKgl0aCA8dGhyZWFkcz4gPGZ1bGxjbnQ+IDwxMCUtMjAlPiA8MjAlLTMwJT4gLi4uIDw5MCUtMTAwJT4gPDEwMCU+IAorICoJCQl0aW1lIChzZWNvbmRzKSB3aGVuIG5mc2QgdGhyZWFkIHVzYWdlIGFib3ZlIHRocmVzaG9sZHMKKyAqCQkJYW5kIG51bWJlciBvZiB0aW1lcyB0aGF0IGFsbCB0aHJlYWRzIHdlcmUgaW4gdXNlCisgKglyYSBjYWNoZS1zaXplICA8MTAlICA8MjAlICA8MzAlIC4uLiA8MTAwJSBub3QtZm91bmQKKyAqCQkJbnVtYmVyIG9mIHRpbWVzIHRoYXQgcmVhZC1haGVhZCBlbnRyeSB3YXMgZm91bmQgdGhhdCBkZWVwIGluCisgKgkJCXRoZSBjYWNoZS4KKyAqCXBsdXMgZ2VuZXJpYyBSUEMgc3RhdHMgKHNlZSBuZXQvc3VucnBjL3N0YXRzLmMpCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdGF0cy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2Qvc3RhdHMuaD4KKworc3RydWN0IG5mc2Rfc3RhdHMJbmZzZHN0YXRzOworc3RydWN0IHN2Y19zdGF0CQluZnNkX3N2Y3N0YXRzID0geworCS5wcm9ncmFtCT0gJm5mc2RfcHJvZ3JhbSwKK307CisKK3N0YXRpYyBpbnQgbmZzZF9wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJaW50IGk7CisKKwlzZXFfcHJpbnRmKHNlcSwgInJjICV1ICV1ICV1XG5maCAldSAldSAldSAldSAldVxuaW8gJXUgJXVcbiIsCisJCSAgICAgIG5mc2RzdGF0cy5yY2hpdHMsCisJCSAgICAgIG5mc2RzdGF0cy5yY21pc3NlcywKKwkJICAgICAgbmZzZHN0YXRzLnJjbm9jYWNoZSwKKwkJICAgICAgbmZzZHN0YXRzLmZoX3N0YWxlLAorCQkgICAgICBuZnNkc3RhdHMuZmhfbG9va3VwLAorCQkgICAgICBuZnNkc3RhdHMuZmhfYW5vbiwKKwkJICAgICAgbmZzZHN0YXRzLmZoX25vY2FjaGVfZGlyLAorCQkgICAgICBuZnNkc3RhdHMuZmhfbm9jYWNoZV9ub25kaXIsCisJCSAgICAgIG5mc2RzdGF0cy5pb19yZWFkLAorCQkgICAgICBuZnNkc3RhdHMuaW9fd3JpdGUpOworCS8qIHRocmVhZCB1c2FnZTogKi8KKwlzZXFfcHJpbnRmKHNlcSwgInRoICV1ICV1IiwgbmZzZHN0YXRzLnRoX2NudCwgbmZzZHN0YXRzLnRoX2Z1bGxjbnQpOworCWZvciAoaT0wOyBpPDEwOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IGppZnMgPSBuZnNkc3RhdHMudGhfdXNhZ2VbaV07CisJCXVuc2lnbmVkIGludCBzZWMgPSBqaWZzIC8gSFosIG1zZWMgPSAoamlmcyAlIEhaKSoxMDAwL0haOworCQlzZXFfcHJpbnRmKHNlcSwgIiAldS4lMDN1Iiwgc2VjLCBtc2VjKTsKKwl9CisKKwkvKiBuZXdsaW5lIGFuZCByYS1jYWNoZSAqLworCXNlcV9wcmludGYoc2VxLCAiXG5yYSAldSIsIG5mc2RzdGF0cy5yYV9zaXplKTsKKwlmb3IgKGk9MDsgaTwxMTsgaSsrKQorCQlzZXFfcHJpbnRmKHNlcSwgIiAldSIsIG5mc2RzdGF0cy5yYV9kZXB0aFtpXSk7CisJc2VxX3B1dGMoc2VxLCAnXG4nKTsKKwkKKwkvKiBzaG93IG15IHJwYyBpbmZvICovCisJc3ZjX3NlcV9zaG93KHNlcSwgJm5mc2Rfc3Zjc3RhdHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmZzZF9wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIG5mc2RfcHJvY19zaG93LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbmZzZF9wcm9jX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBuZnNkX3Byb2Nfb3BlbiwKKwkucmVhZCAgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCit2b2lkCituZnNkX3N0YXRfaW5pdCh2b2lkKQoreworCXN2Y19wcm9jX3JlZ2lzdGVyKCZuZnNkX3N2Y3N0YXRzLCAmbmZzZF9wcm9jX2ZvcHMpOworfQorCit2b2lkCituZnNkX3N0YXRfc2h1dGRvd24odm9pZCkKK3sKKwlzdmNfcHJvY191bnJlZ2lzdGVyKCJuZnNkIik7Cit9CmRpZmYgLS1naXQgYS9mcy9uZnNkL3Zmcy5jIGIvZnMvbmZzZC92ZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2U5ZDIxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzZC92ZnMuYwpAQCAtMCwwICsxLDE4NTkgQEAKKyNkZWZpbmUgTVNORlMJLyogSEFDSyBIQUNLICovCisvKgorICogbGludXgvZnMvbmZzZC92ZnMuYworICoKKyAqIEZpbGUgb3BlcmF0aW9ucyB1c2VkIGJ5IG5mc2QuIFNvbWUgb2YgdGhlc2UgaGF2ZSBiZWVuIHJpcHBlZCBmcm9tCisgKiBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsIGJlY2F1c2UgdGhleSB3ZXJlbid0IGV4cG9ydGVkLCBvdGhlcnMKKyAqIGFyZSBwYXJ0aWFsIGR1cGxpY2F0ZXMgd2l0aCBhZGRlZCBvciBjaGFuZ2VkIGZ1bmN0aW9uYWxpdHkuCisgKgorICogTm90ZSB0aGF0IHNldmVyYWwgZnVuY3Rpb25zIGRnZXQoKSB0aGUgZGVudHJ5IHVwb24gd2hpY2ggdGhleSB3YW50CisgKiB0byBhY3QsIG1vc3Qgbm90YWJseSB0aG9zZSB0aGF0IGNyZWF0ZSBkaXJlY3RvcnkgZW50cmllcy4gUmVzcG9uc2UKKyAqIGRlbnRyeSdzIGFyZSBkcHV0KCknZCBpZiBuZWNlc3NhcnkgaW4gdGhlIHJlbGVhc2UgY2FsbGJhY2suCisgKiBTbyBpZiB5b3Ugbm90aWNlIGNvZGUgcGF0aHMgdGhhdCBhcHBhcmVudGx5IGZhaWwgdG8gZHB1dCgpIHRoZQorICogZGVudHJ5LCBkb24ndCB3b3JyeS0tdGhleSBoYXZlIGJlZW4gdGFrZW4gY2FyZSBvZi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqIFplcm9jcHkgTkZTIHN1cHBvcnQgKEMpIDIwMDIgSGlyb2thenUgVGFrYWhhc2hpIDx0YWthQHZhbGludXguY28uanA+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQyX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZC5oPgorI2lmZGVmIENPTkZJR19ORlNEX1YzCisjaW5jbHVkZSA8bGludXgvbmZzMy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QveGRyMy5oPgorI2VuZGlmIC8qIENPTkZJR19ORlNEX1YzICovCisjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNmaC5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvZG5vdGlmeS5oPgorI2lmZGVmIENPTkZJR19ORlNEX1Y0CisjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsLmg+CisjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsX3hhdHRyLmg+CisjaW5jbHVkZSA8bGludXgveGF0dHJfYWNsLmg+CisjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnM0Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzNF9hY2wuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkX2lkbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNlbmRpZiAvKiBDT05GSUdfTkZTRF9WNCAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZCQlORlNEREJHX0ZJTEVPUAorI2RlZmluZSBORlNEX1BBUkFOT0lBCisKKworLyogV2UgbXVzdCBpZ25vcmUgZmlsZXMgKGJ1dCBvbmx5IGZpbGVzKSB3aGljaCBtaWdodCBoYXZlIG1hbmRhdG9yeQorICogbG9ja3Mgb24gdGhlbSBiZWNhdXNlIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IGlmIHRoZSBhY2Nlc3NlciBoYXMKKyAqIHRoZSBsb2NrLgorICovCisjZGVmaW5lIElTX0lTTU5ETEsoaSkJKFNfSVNSRUcoKGkpLT5pX21vZGUpICYmIE1BTkRBVE9SWV9MT0NLKGkpKQorCisvKgorICogVGhpcyBpcyBhIGNhY2hlIG9mIHJlYWRhaGVhZCBwYXJhbXMgdGhhdCBoZWxwIHVzIGNob29zZSB0aGUgcHJvcGVyCisgKiByZWFkYWhlYWQgc3RyYXRlZ3kuIEluaXRpYWxseSwgd2Ugc2V0IGFsbCByZWFkYWhlYWQgcGFyYW1ldGVycyB0byAwCisgKiBhbmQgbGV0IHRoZSBWRlMgaGFuZGxlIHRoaW5ncy4KKyAqIElmIHlvdSBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGNhY2hlZCBmaWxlcyB2ZXJ5IG11Y2gsIHlvdSdsbCBuZWVkIHRvCisgKiBhZGQgYSBoYXNoIHRhYmxlIGhlcmUuCisgKi8KK3N0cnVjdCByYXBhcm1zIHsKKwlzdHJ1Y3QgcmFwYXJtcwkJKnBfbmV4dDsKKwl1bnNpZ25lZCBpbnQJCXBfY291bnQ7CisJaW5vX3QJCQlwX2lubzsKKwlkZXZfdAkJCXBfZGV2OworCWludAkJCXBfc2V0OworCXN0cnVjdCBmaWxlX3JhX3N0YXRlCXBfcmE7Cit9OworCitzdGF0aWMgc3RydWN0IHJhcGFybXMgKgkJcmFwYXJtbDsKK3N0YXRpYyBzdHJ1Y3QgcmFwYXJtcyAqCQlyYXBhcm1fY2FjaGU7CisKKy8qIAorICogQ2FsbGVkIGZyb20gbmZzZF9sb29rdXAgYW5kIGVuY29kZV9kaXJlbnQuIENoZWNrIGlmIHdlIGhhdmUgY3Jvc3NlZCAKKyAqIGEgbW91bnQgcG9pbnQuCisgKiBSZXR1cm5zIC1FQUdBSU4gbGVhdmluZyAqZHBwIGFuZCAqZXhwcCB1bmNoYW5nZWQsIAorICogIG9yIG5mc19vayBoYXZpbmcgcG9zc2libHkgY2hhbmdlZCAqZHBwIGFuZCAqZXhwcAorICovCitpbnQKK25mc2RfY3Jvc3NfbW50KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBkZW50cnkgKipkcHAsIAorCQkgICAgICAgIHN0cnVjdCBzdmNfZXhwb3J0ICoqZXhwcCkKK3sKKwlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwID0gKmV4cHAsICpleHAyID0gTlVMTDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSAqZHBwOworCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gbW50Z2V0KGV4cC0+ZXhfbW50KTsKKwlzdHJ1Y3QgZGVudHJ5ICptb3VudHMgPSBkZ2V0KGRlbnRyeSk7CisJaW50IGVyciA9IG5mc19vazsKKworCXdoaWxlIChmb2xsb3dfZG93bigmbW50LCZtb3VudHMpJiZkX21vdW50cG9pbnQobW91bnRzKSk7CisKKwlleHAyID0gZXhwX2dldF9ieV9uYW1lKGV4cC0+ZXhfY2xpZW50LCBtbnQsIG1vdW50cywgJnJxc3RwLT5ycV9jaGFuZGxlKTsKKwlpZiAoSVNfRVJSKGV4cDIpKSB7CisJCWVyciA9IFBUUl9FUlIoZXhwMik7CisJCWRwdXQobW91bnRzKTsKKwkJbW50cHV0KG1udCk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoZXhwMiAmJiAoKGV4cC0+ZXhfZmxhZ3MgJiBORlNFWFBfQ1JPU1NNT1VOVCkgfHwgRVhfTk9ISURFKGV4cDIpKSkgeworCQkvKiBzdWNjZXNzZnVsbHkgY3Jvc3NlZCBtb3VudCBwb2ludCAqLworCQlleHBfcHV0KGV4cCk7CisJCSpleHBwID0gZXhwMjsKKwkJZHB1dChkZW50cnkpOworCQkqZHBwID0gbW91bnRzOworCX0gZWxzZSB7CisJCWlmIChleHAyKSBleHBfcHV0KGV4cDIpOworCQlkcHV0KG1vdW50cyk7CisJfQorCW1udHB1dChtbnQpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBMb29rIHVwIG9uZSBjb21wb25lbnQgb2YgYSBwYXRobmFtZS4KKyAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIF9ib3RoXyBmaHAgYW5kIHJlc2ZoIG5lZWQgYW4gZmhfcHV0CisgKgorICogSWYgdGhlIGxvb2t1cCB3b3VsZCBjcm9zcyBhIG1vdW50cG9pbnQsIGFuZCB0aGUgbW91bnRlZCBmaWxlc3lzdGVtCisgKiBpcyBleHBvcnRlZCB0byB0aGUgY2xpZW50IHdpdGggTkZTRVhQX05PSElERSwgdGhlbiB0aGUgbG9va3VwIGlzCisgKiBhY2NlcHRlZCBhcyBpdCBzdGFuZHMgYW5kIHRoZSBtb3VudGVkIGRpcmVjdG9yeSBpcworICogcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgY292ZXJlZCBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCisgKiBOT1RFOiB0aGlzIG1vdW50cG9pbnQgY3Jvc3NpbmcgaXMgbm90IHN1cHBvcnRlZCBwcm9wZXJseSBieSBhbGwKKyAqICAgY2xpZW50cyBhbmQgaXMgZXhwbGljaXRseSBkaXNhbGxvd2VkIGZvciBORlN2MworICogICAgICBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKyAqLworaW50CituZnNkX2xvb2t1cChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCWludCBsZW4sIHN0cnVjdCBzdmNfZmggKnJlc2ZoKQoreworCXN0cnVjdCBzdmNfZXhwb3J0CSpleHA7CisJc3RydWN0IGRlbnRyeQkJKmRwYXJlbnQ7CisJc3RydWN0IGRlbnRyeQkJKmRlbnRyeTsKKwlpbnQJCQllcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBuZnNkX2xvb2t1cChmaCAlcywgJS4qcylcbiIsIFNWQ0ZIX2ZtdChmaHApLCBsZW4sbmFtZSk7CisKKwkvKiBPYnRhaW4gZGVudHJ5IGFuZCBleHBvcnQuICovCisJZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCBmaHAsIFNfSUZESVIsIE1BWV9FWEVDKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZHBhcmVudCA9IGZocC0+ZmhfZGVudHJ5OworCWV4cCAgPSBmaHAtPmZoX2V4cG9ydDsKKwlleHBfZ2V0KGV4cCk7CisKKwllcnIgPSBuZnNlcnJfYWNjZXM7CisKKwkvKiBMb29rdXAgdGhlIG5hbWUsIGJ1dCBkb24ndCBmb2xsb3cgbGlua3MgKi8KKwlpZiAoaXNkb3RlbnQobmFtZSwgbGVuKSkgeworCQlpZiAobGVuPT0xKQorCQkJZGVudHJ5ID0gZGdldChkcGFyZW50KTsKKwkJZWxzZSBpZiAoZHBhcmVudCAhPSBleHAtPmV4X2RlbnRyeSkgeworCQkJZGVudHJ5ID0gZGdldF9wYXJlbnQoZHBhcmVudCk7CisJCX0gZWxzZSAgaWYgKCFFWF9OT0hJREUoZXhwKSkKKwkJCWRlbnRyeSA9IGRnZXQoZHBhcmVudCk7IC8qIC4uID09IC4ganVzdCBsaWtlIGF0IC8gKi8KKwkJZWxzZSB7CisJCQkvKiBjaGVja2luZyBtb3VudHBvaW50IGNyb3NzaW5nIGlzIHZlcnkgZGlmZmVyZW50IHdoZW4gc3RlcHBpbmcgdXAgKi8KKwkJCXN0cnVjdCBzdmNfZXhwb3J0ICpleHAyID0gTlVMTDsKKwkJCXN0cnVjdCBkZW50cnkgKmRwOworCQkJc3RydWN0IHZmc21vdW50ICptbnQgPSBtbnRnZXQoZXhwLT5leF9tbnQpOworCQkJZGVudHJ5ID0gZGdldChkcGFyZW50KTsKKwkJCXdoaWxlKGRlbnRyeSA9PSBtbnQtPm1udF9yb290ICYmIGZvbGxvd191cCgmbW50LCAmZGVudHJ5KSkKKwkJCQk7CisJCQlkcCA9IGRnZXRfcGFyZW50KGRlbnRyeSk7CisJCQlkcHV0KGRlbnRyeSk7CisJCQlkZW50cnkgPSBkcDsKKworCQkJZXhwMiA9IGV4cF9wYXJlbnQoZXhwLT5leF9jbGllbnQsIG1udCwgZGVudHJ5LAorCQkJCQkgICZycXN0cC0+cnFfY2hhbmRsZSk7CisJCQlpZiAoSVNfRVJSKGV4cDIpKSB7CisJCQkJZXJyID0gUFRSX0VSUihleHAyKTsKKwkJCQlkcHV0KGRlbnRyeSk7CisJCQkJbW50cHV0KG1udCk7CisJCQkJZ290byBvdXRfbmZzZXJyOworCQkJfQorCQkJaWYgKCFleHAyKSB7CisJCQkJZHB1dChkZW50cnkpOworCQkJCWRlbnRyeSA9IGRnZXQoZHBhcmVudCk7CisJCQl9IGVsc2UgeworCQkJCWV4cF9wdXQoZXhwKTsKKwkJCQlleHAgPSBleHAyOworCQkJfQorCQkJbW50cHV0KG1udCk7CisJCX0KKwl9IGVsc2UgeworCQlmaF9sb2NrKGZocCk7CisJCWRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKG5hbWUsIGRwYXJlbnQsIGxlbik7CisJCWVyciA9IFBUUl9FUlIoZGVudHJ5KTsKKwkJaWYgKElTX0VSUihkZW50cnkpKQorCQkJZ290byBvdXRfbmZzZXJyOworCQkvKgorCQkgKiBjaGVjayBpZiB3ZSBoYXZlIGNyb3NzZWQgYSBtb3VudCBwb2ludCAuLi4KKwkJICovCisJCWlmIChkX21vdW50cG9pbnQoZGVudHJ5KSkgeworCQkJaWYgKChlcnIgPSBuZnNkX2Nyb3NzX21udChycXN0cCwgJmRlbnRyeSwgJmV4cCkpKSB7CisJCQkJZHB1dChkZW50cnkpOworCQkJCWdvdG8gb3V0X25mc2VycjsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIE5vdGU6IHdlIGNvbXBvc2UgdGhlIGZpbGUgaGFuZGxlIG5vdywgYnV0IGFzIHRoZQorCSAqIGRlbnRyeSBtYXkgYmUgbmVnYXRpdmUsIGl0IG1heSBuZWVkIHRvIGJlIHVwZGF0ZWQuCisJICovCisJZXJyID0gZmhfY29tcG9zZShyZXNmaCwgZXhwLCBkZW50cnksIGZocCk7CisJaWYgKCFlcnIgJiYgIWRlbnRyeS0+ZF9pbm9kZSkKKwkJZXJyID0gbmZzZXJyX25vZW50OworCWRwdXQoZGVudHJ5KTsKK291dDoKKwlleHBfcHV0KGV4cCk7CisJcmV0dXJuIGVycjsKKworb3V0X25mc2VycjoKKwllcnIgPSBuZnNlcnJubyhlcnIpOworCWdvdG8gb3V0OworfQorCisvKgorICogU2V0IHZhcmlvdXMgZmlsZSBhdHRyaWJ1dGVzLgorICogTi5CLiBBZnRlciB0aGlzIGNhbGwgZmhwIG5lZWRzIGFuIGZoX3B1dAorICovCitpbnQKK25mc2Rfc2V0YXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBpYXR0ciAqaWFwLAorCSAgICAgaW50IGNoZWNrX2d1YXJkLCB0aW1lX3QgZ3VhcmR0aW1lKQoreworCXN0cnVjdCBkZW50cnkJKmRlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlOworCWludAkJYWNjbW9kZSA9IE1BWV9TQVRUUjsKKwlpbnQJCWZ0eXBlID0gMDsKKwlpbnQJCWltb2RlOworCWludAkJZXJyOworCWludAkJc2l6ZV9jaGFuZ2UgPSAwOworCisJaWYgKGlhcC0+aWFfdmFsaWQgJiAoQVRUUl9BVElNRSB8IEFUVFJfTVRJTUUgfCBBVFRSX1NJWkUpKQorCQlhY2Ntb2RlIHw9IE1BWV9XUklURXxNQVlfT1dORVJfT1ZFUlJJREU7CisJaWYgKGlhcC0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpCisJCWZ0eXBlID0gU19JRlJFRzsKKworCS8qIEdldCBpbm9kZSAqLworCWVyciA9IGZoX3ZlcmlmeShycXN0cCwgZmhwLCBmdHlwZSwgYWNjbW9kZSk7CisJaWYgKGVyciB8fCAhaWFwLT5pYV92YWxpZCkKKwkJZ290byBvdXQ7CisKKwlkZW50cnkgPSBmaHAtPmZoX2RlbnRyeTsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCS8qIE5GU3YyIGRvZXMgbm90IGRpZmZlcmVudGlhdGUgYmV0d2VlbiAic2V0LVthY110aW1lLXRvLW5vdyIKKwkgKiB3aGljaCBvbmx5IHJlcXVpcmVzIGFjY2VzcywgYW5kICJzZXQtW2FjXXRpbWUtdG8tWCIgd2hpY2gKKwkgKiByZXF1aXJlcyBvd25lcnNoaXAuCisJICogU28gaWYgaXQgbG9va3MgbGlrZSBpdCBtaWdodCBiZSAic2V0IGJvdGggdG8gdGhlIHNhbWUgdGltZSB3aGljaAorCSAqIGlzIGNsb3NlIHRvIG5vdyIsIGFuZCBpZiBpbm9kZV9jaGFuZ2Vfb2sgZmFpbHMsIHRoZW4gd2UKKwkgKiBjb252ZXJ0IHRvICJzZXQgdG8gbm93IiBpbnN0ZWFkIG9mICJzZXQgdG8gZXhwbGljaXQgdGltZSIKKwkgKgorCSAqIFdlIG9ubHkgY2FsbCBpbm9kZV9jaGFuZ2Vfb2sgYXMgdGhlIGxhc3QgdGVzdCBhcyB0ZWNobmljYWxseQorCSAqIGl0IGlzIG5vdCBhbiBpbnRlcmZhY2UgdGhhdCB3ZSBzaG91bGQgYmUgdXNpbmcuICBJdCBpcyBvbmx5CisJICogdmFsaWQgaWYgdGhlIGZpbGVzeXN0ZW0gZG9lcyBub3QgZGVmaW5lIGl0J3Mgb3duIGlfb3AtPnNldGF0dHIuCisJICovCisjZGVmaW5lIEJPVEhfVElNRV9TRVQgKEFUVFJfQVRJTUVfU0VUIHwgQVRUUl9NVElNRV9TRVQpCisjZGVmaW5lCU1BWF9UT1VDSF9USU1FX0VSUk9SICgzMCo2MCkKKwlpZiAoKGlhcC0+aWFfdmFsaWQgJiBCT1RIX1RJTUVfU0VUKSA9PSBCT1RIX1RJTUVfU0VUCisJICAgICYmIGlhcC0+aWFfbXRpbWUudHZfc2VjID09IGlhcC0+aWFfYXRpbWUudHZfc2VjCisJICAgICkgeworCSAgICAvKiBMb29rcyBwcm9iYWJsZS4gIE5vdyBqdXN0IG1ha2Ugc3VyZSB0aW1lIGlzIGluIHRoZSByaWdodCBiYWxscGFyay4KKwkgICAgICogU29sYXJpcywgYXQgbGVhc3QsIGRvZXNuJ3Qgc2VlbSB0byBjYXJlIHdoYXQgdGhlIHRpbWUgcmVxdWVzdCBpcy4KKwkgICAgICogV2UgcmVxdWlyZSBpdCBiZSB3aXRoaW4gMzAgbWludXRlcyBvZiBub3cuCisJICAgICAqLworCSAgICB0aW1lX3QgZGVsdGEgPSBpYXAtPmlhX2F0aW1lLnR2X3NlYyAtIGdldF9zZWNvbmRzKCk7CisJICAgIGlmIChkZWx0YTwwKSBkZWx0YSA9IC1kZWx0YTsKKwkgICAgaWYgKGRlbHRhIDwgTUFYX1RPVUNIX1RJTUVfRVJST1IgJiYKKwkJaW5vZGVfY2hhbmdlX29rKGlub2RlLCBpYXApICE9IDApIHsKKwkJLyogdHVybiBvZmYgQVRUUl9bQU1dVElNRV9TRVQgYnV0IGxlYXZlIEFUVFJfW0FNXVRJTUUKKwkJICogdGhpcyB3aWxsIGNhdXNlIG5vdGlmeV9jaGFuZ2UgdG8gc2V0IHRoZXNlIHRpbWVzIHRvICJub3ciCisJCSAqLworCQlpYXAtPmlhX3ZhbGlkICY9IH5CT1RIX1RJTUVfU0VUOworCSAgICB9CisJfQorCSAgICAKKwkvKiBUaGUgc2l6ZSBjYXNlIGlzIHNwZWNpYWwuIEl0IGNoYW5nZXMgdGhlIGZpbGUgYXMgd2VsbCBhcyB0aGUgYXR0cmlidXRlcy4gICovCisJaWYgKGlhcC0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKKwkJaWYgKGlhcC0+aWFfc2l6ZSA8IGlub2RlLT5pX3NpemUpIHsKKwkJCWVyciA9IG5mc2RfcGVybWlzc2lvbihmaHAtPmZoX2V4cG9ydCwgZGVudHJ5LCBNQVlfVFJVTkN8TUFZX09XTkVSX09WRVJSSURFKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisJCX0KKworCQkvKgorCQkgKiBJZiB3ZSBhcmUgY2hhbmdpbmcgdGhlIHNpemUgb2YgdGhlIGZpbGUsIHRoZW4KKwkJICogd2UgbmVlZCB0byBicmVhayBhbGwgbGVhc2VzLgorCQkgKi8KKwkJZXJyID0gYnJlYWtfbGVhc2UoaW5vZGUsIEZNT0RFX1dSSVRFIHwgT19OT05CTE9DSyk7CisJCWlmIChlcnIgPT0gLUVXT1VMREJMT0NLKQorCQkJZXJyID0gLUVUSU1FRE9VVDsKKwkJaWYgKGVycikgLyogRU5PTUVNIG9yIEVXT1VMREJMT0NLICovCisJCQlnb3RvIG91dF9uZnNlcnI7CisKKwkJZXJyID0gZ2V0X3dyaXRlX2FjY2Vzcyhpbm9kZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9uZnNlcnI7CisKKwkJc2l6ZV9jaGFuZ2UgPSAxOworCQllcnIgPSBsb2Nrc192ZXJpZnlfdHJ1bmNhdGUoaW5vZGUsIE5VTEwsIGlhcC0+aWFfc2l6ZSk7CisJCWlmIChlcnIpIHsKKwkJCXB1dF93cml0ZV9hY2Nlc3MoaW5vZGUpOworCQkJZ290byBvdXRfbmZzZXJyOworCQl9CisJCURRVU9UX0lOSVQoaW5vZGUpOworCX0KKworCWltb2RlID0gaW5vZGUtPmlfbW9kZTsKKwlpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgeworCQlpYXAtPmlhX21vZGUgJj0gU19JQUxMVUdPOworCQlpbW9kZSA9IGlhcC0+aWFfbW9kZSB8PSAoaW1vZGUgJiB+U19JQUxMVUdPKTsKKwl9CisKKwkvKiBSZXZva2Ugc2V0dWlkL3NldGdpZCBiaXQgb24gY2hvd24vY2hncnAgKi8KKwlpZiAoKGlhcC0+aWFfdmFsaWQgJiBBVFRSX1VJRCkgJiYgaWFwLT5pYV91aWQgIT0gaW5vZGUtPmlfdWlkKQorCQlpYXAtPmlhX3ZhbGlkIHw9IEFUVFJfS0lMTF9TVUlEOworCWlmICgoaWFwLT5pYV92YWxpZCAmIEFUVFJfR0lEKSAmJiBpYXAtPmlhX2dpZCAhPSBpbm9kZS0+aV9naWQpCisJCWlhcC0+aWFfdmFsaWQgfD0gQVRUUl9LSUxMX1NHSUQ7CisKKwkvKiBDaGFuZ2UgdGhlIGF0dHJpYnV0ZXMuICovCisKKwlpYXAtPmlhX3ZhbGlkIHw9IEFUVFJfQ1RJTUU7CisKKwllcnIgPSBuZnNlcnJfbm90c3luYzsKKwlpZiAoIWNoZWNrX2d1YXJkIHx8IGd1YXJkdGltZSA9PSBpbm9kZS0+aV9jdGltZS50dl9zZWMpIHsKKwkJZmhfbG9jayhmaHApOworCQllcnIgPSBub3RpZnlfY2hhbmdlKGRlbnRyeSwgaWFwKTsKKwkJZXJyID0gbmZzZXJybm8oZXJyKTsKKwkJZmhfdW5sb2NrKGZocCk7CisJfQorCWlmIChzaXplX2NoYW5nZSkKKwkJcHV0X3dyaXRlX2FjY2Vzcyhpbm9kZSk7CisJaWYgKCFlcnIpCisJCWlmIChFWF9JU1NZTkMoZmhwLT5maF9leHBvcnQpKQorCQkJd3JpdGVfaW5vZGVfbm93KGlub2RlLCAxKTsKK291dDoKKwlyZXR1cm4gZXJyOworCitvdXRfbmZzZXJyOgorCWVyciA9IG5mc2Vycm5vKGVycik7CisJZ290byBvdXQ7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19ORlNEX1Y0KQorCitzdGF0aWMgaW50CitzZXRfbmZzdjRfYWNsX29uZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwb3NpeF9hY2wgKnBhY2wsIGNoYXIgKmtleSkKK3sKKwlpbnQgbGVuOworCXNpemVfdCBidWZsZW47CisJY2hhciAqYnVmID0gTlVMTDsKKwlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisKKwlidWZsZW4gPSBwb3NpeF9hY2xfeGF0dHJfc2l6ZShwYWNsLT5hX2NvdW50KTsKKwlidWYgPSBrbWFsbG9jKGJ1ZmxlbiwgR0ZQX0tFUk5FTCk7CisJZXJyb3IgPSAtRU5PTUVNOworCWlmIChidWYgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlsZW4gPSBwb3NpeF9hY2xfdG9feGF0dHIocGFjbCwgYnVmLCBidWZsZW4pOworCWlmIChsZW4gPCAwKSB7CisJCWVycm9yID0gbGVuOworCQlnb3RvIG91dDsKKwl9CisKKwllcnJvciA9IC1FT1BOT1RTVVBQOworCWlmIChpbm9kZS0+aV9vcCAmJiBpbm9kZS0+aV9vcC0+c2V0eGF0dHIpIHsKKwkJZG93bigmaW5vZGUtPmlfc2VtKTsKKwkJc2VjdXJpdHlfaW5vZGVfc2V0eGF0dHIoZGVudHJ5LCBrZXksIGJ1ZiwgbGVuLCAwKTsKKwkJZXJyb3IgPSBpbm9kZS0+aV9vcC0+c2V0eGF0dHIoZGVudHJ5LCBrZXksIGJ1ZiwgbGVuLCAwKTsKKwkJaWYgKCFlcnJvcikKKwkJCXNlY3VyaXR5X2lub2RlX3Bvc3Rfc2V0eGF0dHIoZGVudHJ5LCBrZXksIGJ1ZiwgbGVuLCAwKTsKKwkJdXAoJmlub2RlLT5pX3NlbSk7CisJfQorb3V0OgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQKK25mc2Q0X3NldF9uZnM0X2FjbChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsCisgICAgc3RydWN0IG5mczRfYWNsICphY2wpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBwb3NpeF9hY2wgKnBhY2wgPSBOVUxMLCAqZHBhY2wgPSBOVUxMOworCXVuc2lnbmVkIGludCBmbGFncyA9IDA7CisKKwkvKiBHZXQgaW5vZGUgKi8KKwllcnJvciA9IGZoX3ZlcmlmeShycXN0cCwgZmhwLCAwIC8qIFNfSUZSRUcgKi8sIE1BWV9TQVRUUik7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCWRlbnRyeSA9IGZocC0+ZmhfZGVudHJ5OworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlmbGFncyA9IE5GUzRfQUNMX0RJUjsKKworCWVycm9yID0gbmZzNF9hY2xfbmZzdjRfdG9fcG9zaXgoYWNsLCAmcGFjbCwgJmRwYWNsLCBmbGFncyk7CisJaWYgKGVycm9yID09IC1FSU5WQUwpIHsKKwkJZXJyb3IgPSBuZnNlcnJfYXR0cm5vdHN1cHA7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dF9uZnNlcnI7CisKKwlpZiAocGFjbCkgeworCQllcnJvciA9IHNldF9uZnN2NF9hY2xfb25lKGRlbnRyeSwgcGFjbCwgWEFUVFJfTkFNRV9BQ0xfQUNDRVNTKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gb3V0X25mc2VycjsKKwl9CisKKwlpZiAoZHBhY2wpIHsKKwkJZXJyb3IgPSBzZXRfbmZzdjRfYWNsX29uZShkZW50cnksIGRwYWNsLCBYQVRUUl9OQU1FX0FDTF9ERUZBVUxUKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gb3V0X25mc2VycjsKKwl9CisKKwllcnJvciA9IG5mc19vazsKKworb3V0OgorCXBvc2l4X2FjbF9yZWxlYXNlKHBhY2wpOworCXBvc2l4X2FjbF9yZWxlYXNlKGRwYWNsKTsKKwlyZXR1cm4gKGVycm9yKTsKK291dF9uZnNlcnI6CisJZXJyb3IgPSBuZnNlcnJubyhlcnJvcik7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcG9zaXhfYWNsICoKK19nZXRfcG9zaXhfYWNsKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqa2V5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJY2hhciAqYnVmID0gTlVMTDsKKwlpbnQgYnVmbGVuLCBlcnJvciA9IDA7CisJc3RydWN0IHBvc2l4X2FjbCAqcGFjbCA9IE5VTEw7CisKKwllcnJvciA9IC1FT1BOT1RTVVBQOworCWlmIChpbm9kZS0+aV9vcCA9PSBOVUxMKQorCQlnb3RvIG91dF9lcnI7CisJaWYgKGlub2RlLT5pX29wLT5nZXR4YXR0ciA9PSBOVUxMKQorCQlnb3RvIG91dF9lcnI7CisKKwllcnJvciA9IHNlY3VyaXR5X2lub2RlX2dldHhhdHRyKGRlbnRyeSwga2V5KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2VycjsKKworCWJ1ZmxlbiA9IGlub2RlLT5pX29wLT5nZXR4YXR0cihkZW50cnksIGtleSwgTlVMTCwgMCk7CisJaWYgKGJ1ZmxlbiA8PSAwKSB7CisJCWVycm9yID0gYnVmbGVuIDwgMCA/IGJ1ZmxlbiA6IC1FTk9EQVRBOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJYnVmID0ga21hbGxvYyhidWZsZW4sIEdGUF9LRVJORUwpOworCWlmIChidWYgPT0gTlVMTCkgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwllcnJvciA9IGlub2RlLT5pX29wLT5nZXR4YXR0cihkZW50cnksIGtleSwgYnVmLCBidWZsZW4pOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0X2VycjsKKworCXBhY2wgPSBwb3NpeF9hY2xfZnJvbV94YXR0cihidWYsIGJ1Zmxlbik7Cisgb3V0OgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHBhY2w7Cisgb3V0X2VycjoKKwlwYWNsID0gRVJSX1BUUihlcnJvcik7CisJZ290byBvdXQ7Cit9CisKK2ludAorbmZzZDRfZ2V0X25mczRfYWNsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5mczRfYWNsICoqYWNsKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGVycm9yID0gMDsKKwlzdHJ1Y3QgcG9zaXhfYWNsICpwYWNsID0gTlVMTCwgKmRwYWNsID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOworCisJcGFjbCA9IF9nZXRfcG9zaXhfYWNsKGRlbnRyeSwgWEFUVFJfTkFNRV9BQ0xfQUNDRVNTKTsKKwlpZiAoSVNfRVJSKHBhY2wpICYmIFBUUl9FUlIocGFjbCkgPT0gLUVOT0RBVEEpCisJCXBhY2wgPSBwb3NpeF9hY2xfZnJvbV9tb2RlKGlub2RlLT5pX21vZGUsIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIocGFjbCkpIHsKKwkJZXJyb3IgPSBQVFJfRVJSKHBhY2wpOworCQlwYWNsID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJZHBhY2wgPSBfZ2V0X3Bvc2l4X2FjbChkZW50cnksIFhBVFRSX05BTUVfQUNMX0RFRkFVTFQpOworCQlpZiAoSVNfRVJSKGRwYWNsKSAmJiBQVFJfRVJSKGRwYWNsKSA9PSAtRU5PREFUQSkKKwkJCWRwYWNsID0gTlVMTDsKKwkJZWxzZSBpZiAoSVNfRVJSKGRwYWNsKSkgeworCQkJZXJyb3IgPSBQVFJfRVJSKGRwYWNsKTsKKwkJCWRwYWNsID0gTlVMTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZsYWdzID0gTkZTNF9BQ0xfRElSOworCX0KKworCSphY2wgPSBuZnM0X2FjbF9wb3NpeF90b19uZnN2NChwYWNsLCBkcGFjbCwgZmxhZ3MpOworCWlmIChJU19FUlIoKmFjbCkpIHsKKwkJZXJyb3IgPSBQVFJfRVJSKCphY2wpOworCQkqYWNsID0gTlVMTDsKKwl9Cisgb3V0OgorCXBvc2l4X2FjbF9yZWxlYXNlKHBhY2wpOworCXBvc2l4X2FjbF9yZWxlYXNlKGRwYWNsKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19ORlNfVjQpICovCisKKyNpZmRlZiBDT05GSUdfTkZTRF9WMworLyoKKyAqIENoZWNrIHNlcnZlciBhY2Nlc3MgcmlnaHRzIHRvIGEgZmlsZSBzeXN0ZW0gb2JqZWN0CisgKi8KK3N0cnVjdCBhY2Nlc3NtYXAgeworCXUzMgkJYWNjZXNzOworCWludAkJaG93OworfTsKK3N0YXRpYyBzdHJ1Y3QgYWNjZXNzbWFwCW5mczNfcmVnYWNjZXNzW10gPSB7CisgICAgewlORlMzX0FDQ0VTU19SRUFELAlNQVlfUkVBRAkJCX0sCisgICAgewlORlMzX0FDQ0VTU19FWEVDVVRFLAlNQVlfRVhFQwkJCX0sCisgICAgewlORlMzX0FDQ0VTU19NT0RJRlksCU1BWV9XUklURXxNQVlfVFJVTkMJCX0sCisgICAgewlORlMzX0FDQ0VTU19FWFRFTkQsCU1BWV9XUklURQkJCX0sCisKKyAgICB7CTAsCQkJMAkJCQl9Cit9OworCitzdGF0aWMgc3RydWN0IGFjY2Vzc21hcAluZnMzX2RpcmFjY2Vzc1tdID0geworICAgIHsJTkZTM19BQ0NFU1NfUkVBRCwJTUFZX1JFQUQJCQl9LAorICAgIHsJTkZTM19BQ0NFU1NfTE9PS1VQLAlNQVlfRVhFQwkJCX0sCisgICAgewlORlMzX0FDQ0VTU19NT0RJRlksCU1BWV9FWEVDfE1BWV9XUklURXxNQVlfVFJVTkMJfSwKKyAgICB7CU5GUzNfQUNDRVNTX0VYVEVORCwJTUFZX0VYRUN8TUFZX1dSSVRFCQl9LAorICAgIHsJTkZTM19BQ0NFU1NfREVMRVRFLAlNQVlfUkVNT1ZFCQkJfSwKKworICAgIHsJMCwJCQkwCQkJCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNjZXNzbWFwCW5mczNfYW55YWNjZXNzW10gPSB7CisJLyogU29tZSBjbGllbnRzIC0gU29sYXJpcyAyLjYgYXQgbGVhc3QsIG1ha2UgYW4gYWNjZXNzIGNhbGwKKwkgKiB0byB0aGUgc2VydmVyIHRvIGNoZWNrIGZvciBhY2Nlc3MgZm9yIHRoaW5ncyBsaWtlIC9kZXYvbnVsbAorCSAqICh3aGljaCByZWFsbHksIHRoZSBzZXJ2ZXIgZG9lc24ndCBjYXJlIGFib3V0KS4gIFNvCisJICogV2UgcHJvdmlkZSBzaW1wbGUgYWNjZXNzIGNoZWNraW5nIGZvciB0aGVtLCBsb29raW5nCisJICogbWFpbmx5IGF0IG1vZGUgYml0cywgYW5kIHdlIG1ha2Ugc3VyZSB0byBpZ25vcmUgcmVhZC1vbmx5CisJICogZmlsZXN5c3RlbSBjaGVja3MKKwkgKi8KKyAgICB7CU5GUzNfQUNDRVNTX1JFQUQsCU1BWV9SRUFECQkJfSwKKyAgICB7CU5GUzNfQUNDRVNTX0VYRUNVVEUsCU1BWV9FWEVDCQkJfSwKKyAgICB7CU5GUzNfQUNDRVNTX01PRElGWSwJTUFZX1dSSVRFfE1BWV9MT0NBTF9BQ0NFU1MJfSwKKyAgICB7CU5GUzNfQUNDRVNTX0VYVEVORCwJTUFZX1dSSVRFfE1BWV9MT0NBTF9BQ0NFU1MJfSwKKworICAgIHsJMCwJCQkwCQkJCX0KK307CisKK2ludAorbmZzZF9hY2Nlc3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCB1MzIgKmFjY2VzcywgdTMyICpzdXBwb3J0ZWQpCit7CisJc3RydWN0IGFjY2Vzc21hcAkqbWFwOworCXN0cnVjdCBzdmNfZXhwb3J0CSpleHBvcnQ7CisJc3RydWN0IGRlbnRyeQkJKmRlbnRyeTsKKwl1MzIJCQlxdWVyeSwgcmVzdWx0ID0gMCwgc3Jlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50CQllcnJvcjsKKworCWVycm9yID0gZmhfdmVyaWZ5KHJxc3RwLCBmaHAsIDAsIE1BWV9OT1ApOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwlleHBvcnQgPSBmaHAtPmZoX2V4cG9ydDsKKwlkZW50cnkgPSBmaHAtPmZoX2RlbnRyeTsKKworCWlmIChTX0lTUkVHKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJbWFwID0gbmZzM19yZWdhY2Nlc3M7CisJZWxzZSBpZiAoU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisJCW1hcCA9IG5mczNfZGlyYWNjZXNzOworCWVsc2UKKwkJbWFwID0gbmZzM19hbnlhY2Nlc3M7CisKKworCXF1ZXJ5ID0gKmFjY2VzczsKKwlmb3IgICg7IG1hcC0+YWNjZXNzOyBtYXArKykgeworCQlpZiAobWFwLT5hY2Nlc3MgJiBxdWVyeSkgeworCQkJdW5zaWduZWQgaW50IGVycjI7CisKKwkJCXNyZXN1bHQgfD0gbWFwLT5hY2Nlc3M7CisKKwkJCWVycjIgPSBuZnNkX3Blcm1pc3Npb24oZXhwb3J0LCBkZW50cnksIG1hcC0+aG93KTsKKwkJCXN3aXRjaCAoZXJyMikgeworCQkJY2FzZSBuZnNfb2s6CisJCQkJcmVzdWx0IHw9IG1hcC0+YWNjZXNzOworCQkJCWJyZWFrOworCQkJCQorCQkJLyogdGhlIGZvbGxvd2luZyBlcnJvciBjb2RlcyBqdXN0IG1lYW4gdGhlIGFjY2VzcyB3YXMgbm90IGFsbG93ZWQsCisJCQkgKiByYXRoZXIgdGhhbiBhbiBlcnJvciBvY2N1cnJlZCAqLworCQkJY2FzZSBuZnNlcnJfcm9mczoKKwkJCWNhc2UgbmZzZXJyX2FjY2VzOgorCQkJY2FzZSBuZnNlcnJfcGVybToKKwkJCQkvKiBzaW1wbHkgZG9uJ3QgIm9yIiBpbiB0aGUgYWNjZXNzIGJpdC4gKi8KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZXJyb3IgPSBlcnIyOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorCSphY2Nlc3MgPSByZXN1bHQ7CisJaWYgKHN1cHBvcnRlZCkKKwkJKnN1cHBvcnRlZCA9IHNyZXN1bHQ7CisKKyBvdXQ6CisJcmV0dXJuIGVycm9yOworfQorI2VuZGlmIC8qIENPTkZJR19ORlNEX1YzICovCisKKworCisvKgorICogT3BlbiBhbiBleGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeS4KKyAqIFRoZSBhY2Nlc3MgYXJndW1lbnQgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIG9wZW4gKHJlYWQvd3JpdGUvbG9jaykKKyAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIGZocCBuZWVkcyBhbiBmaF9wdXQKKyAqLworaW50CituZnNkX29wZW4oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBpbnQgdHlwZSwKKwkJCWludCBhY2Nlc3MsIHN0cnVjdCBmaWxlICoqZmlscCkKK3sKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnk7CisJc3RydWN0IGlub2RlCSppbm9kZTsKKwlpbnQJCWZsYWdzID0gT19SRE9OTFl8T19MQVJHRUZJTEUsIGVycjsKKworCS8qCisJICogSWYgd2UgZ2V0IGhlcmUsIHRoZW4gdGhlIGNsaWVudCBoYXMgYWxyZWFkeSBkb25lIGFuICJvcGVuIiwKKwkgKiBhbmQgKGhvcGVmdWxseSkgY2hlY2tlZCBwZXJtaXNzaW9uIC0gc28gYWxsb3cgT1dORVJfT1ZFUlJJREUKKwkgKiBpbiBjYXNlIGEgY2htb2QgaGFzIG5vdyByZXZva2VkIHBlcm1pc3Npb24uCisJICovCisJZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCBmaHAsIHR5cGUsIGFjY2VzcyB8IE1BWV9PV05FUl9PVkVSUklERSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlkZW50cnkgPSBmaHAtPmZoX2RlbnRyeTsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCS8qIERpc2FsbG93IHdyaXRlIGFjY2VzcyB0byBmaWxlcyB3aXRoIHRoZSBhcHBlbmQtb25seSBiaXQgc2V0CisJICogb3IgYW55IGFjY2VzcyB3aGVuIG1hbmRhdG9yeSBsb2NraW5nIGVuYWJsZWQKKwkgKi8KKwllcnIgPSBuZnNlcnJfcGVybTsKKwlpZiAoSVNfQVBQRU5EKGlub2RlKSAmJiAoYWNjZXNzICYgTUFZX1dSSVRFKSkKKwkJZ290byBvdXQ7CisJaWYgKElTX0lTTU5ETEsoaW5vZGUpKQorCQlnb3RvIG91dDsKKworCWlmICghaW5vZGUtPmlfZm9wKQorCQlnb3RvIG91dDsKKworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgbGVhc2VzIG9uIHRoaXMgZmlsZS4KKwkgKiBUaGlzIG1heSBibG9jayB3aGlsZSBsZWFzZXMgYXJlIGJyb2tlbi4KKwkgKi8KKwllcnIgPSBicmVha19sZWFzZShpbm9kZSwgT19OT05CTE9DSyB8ICgoYWNjZXNzICYgTUFZX1dSSVRFKSA/IEZNT0RFX1dSSVRFIDogMCkpOworCWlmIChlcnIgPT0gLUVXT1VMREJMT0NLKQorCQllcnIgPSAtRVRJTUVET1VUOworCWlmIChlcnIpIC8qIE5PTUVNIG9yIFdPVUxEQkxPQ0sgKi8KKwkJZ290byBvdXRfbmZzZXJyOworCisJaWYgKGFjY2VzcyAmIE1BWV9XUklURSkgeworCQlmbGFncyA9IE9fV1JPTkxZfE9fTEFSR0VGSUxFOworCisJCURRVU9UX0lOSVQoaW5vZGUpOworCX0KKwkqZmlscCA9IGRlbnRyeV9vcGVuKGRnZXQoZGVudHJ5KSwgbW50Z2V0KGZocC0+ZmhfZXhwb3J0LT5leF9tbnQpLCBmbGFncyk7CisJaWYgKElTX0VSUigqZmlscCkpCisJCWVyciA9IFBUUl9FUlIoKmZpbHApOworb3V0X25mc2VycjoKKwlpZiAoZXJyKQorCQllcnIgPSBuZnNlcnJubyhlcnIpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDbG9zZSBhIGZpbGUuCisgKi8KK3ZvaWQKK25mc2RfY2xvc2Uoc3RydWN0IGZpbGUgKmZpbHApCit7CisJZnB1dChmaWxwKTsKK30KKworLyoKKyAqIFN5bmMgYSBmaWxlCisgKiBBcyB0aGlzIGNhbGxzIGZzeW5jIChub3QgZmRhdGFzeW5jKSB0aGVyZSBpcyBubyBuZWVkIGZvciBhIHdyaXRlX2lub2RlCisgKiBhZnRlciBpdC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG5mc2RfZG9zeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgZGVudHJ5ICpkcCwKKwkJCSAgICAgICBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3ApCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRwLT5kX2lub2RlOworCWludCAoKmZzeW5jKSAoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOworCisJZmlsZW1hcF9mZGF0YXdyaXRlKGlub2RlLT5pX21hcHBpbmcpOworCWlmIChmb3AgJiYgKGZzeW5jID0gZm9wLT5mc3luYykpCisJCWZzeW5jKGZpbHAsIGRwLCAwKTsKKwlmaWxlbWFwX2ZkYXRhd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKK30KKwkKKworc3RhdGljIHZvaWQKK25mc2Rfc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJZHByaW50aygibmZzZDogc3luYyBmaWxlICVzXG4iLCBmaWxwLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWRvd24oJmlub2RlLT5pX3NlbSk7CisJbmZzZF9kb3N5bmMoZmlscCwgZmlscC0+Zl9kZW50cnksIGZpbHAtPmZfb3ApOworCXVwKCZpbm9kZS0+aV9zZW0pOworfQorCitzdGF0aWMgdm9pZAorbmZzZF9zeW5jX2RpcihzdHJ1Y3QgZGVudHJ5ICpkcCkKK3sKKwluZnNkX2Rvc3luYyhOVUxMLCBkcCwgZHAtPmRfaW5vZGUtPmlfZm9wKTsKK30KKworLyoKKyAqIE9idGFpbiB0aGUgcmVhZGFoZWFkIHBhcmFtZXRlcnMgZm9yIHRoZSBmaWxlCisgKiBzcGVjaWZpZWQgYnkgKGRldiwgaW5vKS4KKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhyYV9sb2NrKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmFwYXJtcyAqCituZnNkX2dldF9yYXBhcm1zKGRldl90IGRldiwgaW5vX3QgaW5vKQoreworCXN0cnVjdCByYXBhcm1zCSpyYSwgKipyYXAsICoqZnJhcCA9IE5VTEw7CisJaW50IGRlcHRoID0gMDsKKworCXNwaW5fbG9jaygmcmFfbG9jayk7CisJZm9yIChyYXAgPSAmcmFwYXJtX2NhY2hlOyAocmEgPSAqcmFwKTsgcmFwID0gJnJhLT5wX25leHQpIHsKKwkJaWYgKHJhLT5wX2lubyA9PSBpbm8gJiYgcmEtPnBfZGV2ID09IGRldikKKwkJCWdvdG8gZm91bmQ7CisJCWRlcHRoKys7CisJCWlmIChyYS0+cF9jb3VudCA9PSAwKQorCQkJZnJhcCA9IHJhcDsKKwl9CisJZGVwdGggPSBuZnNkc3RhdHMucmFfc2l6ZSoxMS8xMDsKKwlpZiAoIWZyYXApIHsJCisJCXNwaW5fdW5sb2NrKCZyYV9sb2NrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJhcCA9IGZyYXA7CisJcmEgPSAqZnJhcDsKKwlyYS0+cF9kZXYgPSBkZXY7CisJcmEtPnBfaW5vID0gaW5vOworCXJhLT5wX3NldCA9IDA7Citmb3VuZDoKKwlpZiAocmFwICE9ICZyYXBhcm1fY2FjaGUpIHsKKwkJKnJhcCA9IHJhLT5wX25leHQ7CisJCXJhLT5wX25leHQgICA9IHJhcGFybV9jYWNoZTsKKwkJcmFwYXJtX2NhY2hlID0gcmE7CisJfQorCXJhLT5wX2NvdW50Kys7CisJbmZzZHN0YXRzLnJhX2RlcHRoW2RlcHRoKjEwL25mc2RzdGF0cy5yYV9zaXplXSsrOworCXNwaW5fdW5sb2NrKCZyYV9sb2NrKTsKKwlyZXR1cm4gcmE7Cit9CisKKy8qCisgKiBHcmFiIGFuZCBrZWVwIGNhY2hlZCBwYWdlcyBhc3Nvc2lhdGVkIHdpdGggYSBmaWxlIGluIHRoZSBzdmNfcnFzdAorICogc28gdGhhdCB0aGV5IGNhbiBiZSBwYXNzZWQgdG8gdGhlIG5ldG93b3JrIHNlbmRtc2cvc2VuZHBhZ2Ugcm91dGluZXMKKyAqIGRpcmVjdHJseS4gVGhleSB3aWxsIGJlIHJlbGVhc2VkIGFmdGVyIHRoZSBzZW5kaW5nIGhhcyBjb21wbGV0ZWQuCisgKi8KK3N0YXRpYyBpbnQKK25mc2RfcmVhZF9hY3RvcihyZWFkX2Rlc2NyaXB0b3JfdCAqZGVzYywgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0ICwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgY291bnQgPSBkZXNjLT5jb3VudDsKKwlzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwID0gZGVzYy0+YXJnLmRhdGE7CisKKwlpZiAoc2l6ZSA+IGNvdW50KQorCQlzaXplID0gY291bnQ7CisKKwlpZiAocnFzdHAtPnJxX3Jlcy5wYWdlX2xlbiA9PSAwKSB7CisJCWdldF9wYWdlKHBhZ2UpOworCQlycXN0cC0+cnFfcmVzcGFnZXNbcnFzdHAtPnJxX3Jlc3VzZWQrK10gPSBwYWdlOworCQlycXN0cC0+cnFfcmVzLnBhZ2VfYmFzZSA9IG9mZnNldDsKKwkJcnFzdHAtPnJxX3Jlcy5wYWdlX2xlbiA9IHNpemU7CisJfSBlbHNlIGlmIChwYWdlICE9IHJxc3RwLT5ycV9yZXNwYWdlc1tycXN0cC0+cnFfcmVzdXNlZC0xXSkgeworCQlnZXRfcGFnZShwYWdlKTsKKwkJcnFzdHAtPnJxX3Jlc3BhZ2VzW3Jxc3RwLT5ycV9yZXN1c2VkKytdID0gcGFnZTsKKwkJcnFzdHAtPnJxX3Jlcy5wYWdlX2xlbiArPSBzaXplOworCX0gZWxzZSB7CisJCXJxc3RwLT5ycV9yZXMucGFnZV9sZW4gKz0gc2l6ZTsKKwl9CisKKwlkZXNjLT5jb3VudCA9IGNvdW50IC0gc2l6ZTsKKwlkZXNjLT53cml0dGVuICs9IHNpemU7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkX3Zmc19yZWFkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgc3RydWN0IGZpbGUgKmZpbGUsCisgICAgICAgICAgICAgIGxvZmZfdCBvZmZzZXQsIHN0cnVjdCBrdmVjICp2ZWMsIGludCB2bGVuLCB1bnNpZ25lZCBsb25nICpjb3VudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCByYXBhcm1zCSpyYTsKKwltbV9zZWdtZW50X3QJb2xkZnM7CisJaW50CQllcnI7CisKKwllcnIgPSBuZnNlcnJfcGVybTsKKwlpbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworI2lmZGVmIE1TTkZTCisJaWYgKChmaHAtPmZoX2V4cG9ydC0+ZXhfZmxhZ3MgJiBORlNFWFBfTVNORlMpICYmCisJCSghbG9ja19tYXlfcmVhZChpbm9kZSwgb2Zmc2V0LCAqY291bnQpKSkKKwkJZ290byBvdXQ7CisjZW5kaWYKKworCS8qIEdldCByZWFkYWhlYWQgcGFyYW1ldGVycyAqLworCXJhID0gbmZzZF9nZXRfcmFwYXJtcyhpbm9kZS0+aV9zYi0+c19kZXYsIGlub2RlLT5pX2lubyk7CisKKwlpZiAocmEgJiYgcmEtPnBfc2V0KQorCQlmaWxlLT5mX3JhID0gcmEtPnBfcmE7CisKKwlpZiAoZmlsZS0+Zl9vcC0+c2VuZGZpbGUpIHsKKwkJc3ZjX3B1c2hiYWNrX3VudXNlZF9wYWdlcyhycXN0cCk7CisJCWVyciA9IGZpbGUtPmZfb3AtPnNlbmRmaWxlKGZpbGUsICZvZmZzZXQsICpjb3VudCwKKwkJCQkJCSBuZnNkX3JlYWRfYWN0b3IsIHJxc3RwKTsKKwl9IGVsc2UgeworCQlvbGRmcyA9IGdldF9mcygpOworCQlzZXRfZnMoS0VSTkVMX0RTKTsKKwkJZXJyID0gdmZzX3JlYWR2KGZpbGUsIChzdHJ1Y3QgaW92ZWMgX191c2VyICopdmVjLCB2bGVuLCAmb2Zmc2V0KTsKKwkJc2V0X2ZzKG9sZGZzKTsKKwl9CisKKwkvKiBXcml0ZSBiYWNrIHJlYWRhaGVhZCBwYXJhbXMgKi8KKwlpZiAocmEpIHsKKwkJc3Bpbl9sb2NrKCZyYV9sb2NrKTsKKwkJcmEtPnBfcmEgPSBmaWxlLT5mX3JhOworCQlyYS0+cF9zZXQgPSAxOworCQlyYS0+cF9jb3VudC0tOworCQlzcGluX3VubG9jaygmcmFfbG9jayk7CisJfQorCisJaWYgKGVyciA+PSAwKSB7CisJCW5mc2RzdGF0cy5pb19yZWFkICs9IGVycjsKKwkJKmNvdW50ID0gZXJyOworCQllcnIgPSAwOworCQlkbm90aWZ5X3BhcmVudChmaWxlLT5mX2RlbnRyeSwgRE5fQUNDRVNTKTsKKwl9IGVsc2UgCisJCWVyciA9IG5mc2Vycm5vKGVycik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mc2RfdmZzX3dyaXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJbG9mZl90IG9mZnNldCwgc3RydWN0IGt2ZWMgKnZlYywgaW50IHZsZW4sCisJICAgCQkJdW5zaWduZWQgbG9uZyBjbnQsIGludCAqc3RhYmxlcCkKK3sKKwlzdHJ1Y3Qgc3ZjX2V4cG9ydAkqZXhwOworCXN0cnVjdCBkZW50cnkJCSpkZW50cnk7CisJc3RydWN0IGlub2RlCQkqaW5vZGU7CisJbW1fc2VnbWVudF90CQlvbGRmczsKKwlpbnQJCQllcnIgPSAwOworCWludAkJCXN0YWJsZSA9ICpzdGFibGVwOworCisJZXJyID0gbmZzZXJyX3Blcm07CisKKyNpZmRlZiBNU05GUworCWlmICgoZmhwLT5maF9leHBvcnQtPmV4X2ZsYWdzICYgTkZTRVhQX01TTkZTKSAmJgorCQkoIWxvY2tfbWF5X3dyaXRlKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBvZmZzZXQsIGNudCkpKQorCQlnb3RvIG91dDsKKyNlbmRpZgorCisJZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJZXhwICAgPSBmaHAtPmZoX2V4cG9ydDsKKworCS8qCisJICogUmVxdWVzdCBzeW5jIHdyaXRlcyBpZgorCSAqICAtCXRoZSBzeW5jIGV4cG9ydCBvcHRpb24gaGFzIGJlZW4gc2V0LCBvcgorCSAqICAtCXRoZSBjbGllbnQgcmVxdWVzdGVkIE9fU1lOQyBiZWhhdmlvciAoTkZTdjMgZmVhdHVyZSkuCisJICogIC0gICBUaGUgZmlsZSBzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IGZzeW5jKCkuCisJICogV2hlbiBnYXRoZXJlZCB3cml0ZXMgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgZm9yIHRoaXMgdm9sdW1lLAorCSAqIGZsdXNoaW5nIHRoZSBkYXRhIHRvIGRpc2sgaXMgaGFuZGxlZCBzZXBhcmF0ZWx5IGJlbG93LgorCSAqLworCisJaWYgKGZpbGUtPmZfb3AtPmZzeW5jID09IDApIHsvKiBDT01NSVQzIGNhbm5vdCB3b3JrICovCisJICAgICAgIHN0YWJsZSA9IDI7CisJICAgICAgICpzdGFibGVwID0gMjsgLyogRklMRV9TWU5DICovCisJfQorCisJaWYgKCFFWF9JU1NZTkMoZXhwKSkKKwkJc3RhYmxlID0gMDsKKwlpZiAoc3RhYmxlICYmICFFWF9XR0FUSEVSKGV4cCkpCisJCWZpbGUtPmZfZmxhZ3MgfD0gT19TWU5DOworCisJLyogV3JpdGUgdGhlIGRhdGEuICovCisJb2xkZnMgPSBnZXRfZnMoKTsgc2V0X2ZzKEtFUk5FTF9EUyk7CisJZXJyID0gdmZzX3dyaXRldihmaWxlLCAoc3RydWN0IGlvdmVjIF9fdXNlciAqKXZlYywgdmxlbiwgJm9mZnNldCk7CisJc2V0X2ZzKG9sZGZzKTsKKwlpZiAoZXJyID49IDApIHsKKwkJbmZzZHN0YXRzLmlvX3dyaXRlICs9IGNudDsKKwkJZG5vdGlmeV9wYXJlbnQoZmlsZS0+Zl9kZW50cnksIEROX01PRElGWSk7CisJfQorCisJLyogY2xlYXIgc2V0dWlkL3NldGdpZCBmbGFnIGFmdGVyIHdyaXRlICovCisJaWYgKGVyciA+PSAwICYmIChpbm9kZS0+aV9tb2RlICYgKFNfSVNVSUQgfCBTX0lTR0lEKSkpIHsKKwkJc3RydWN0IGlhdHRyCWlhOworCQlpYS5pYV92YWxpZCA9IEFUVFJfS0lMTF9TVUlEIHwgQVRUUl9LSUxMX1NHSUQ7CisKKwkJZG93bigmaW5vZGUtPmlfc2VtKTsKKwkJbm90aWZ5X2NoYW5nZShkZW50cnksICZpYSk7CisJCXVwKCZpbm9kZS0+aV9zZW0pOworCX0KKworCWlmIChlcnIgPj0gMCAmJiBzdGFibGUpIHsKKwkJc3RhdGljIGlub190CWxhc3RfaW5vOworCQlzdGF0aWMgZGV2X3QJbGFzdF9kZXY7CisKKwkJLyoKKwkJICogR2F0aGVyZWQgd3JpdGVzOiBJZiBhbm90aGVyIHByb2Nlc3MgaXMgY3VycmVudGx5CisJCSAqIHdyaXRpbmcgdG8gdGhlIGZpbGUsIHRoZXJlJ3MgYSBoaWdoIGNoYW5jZQorCQkgKiB0aGlzIGlzIGFub3RoZXIgbmZzZCAodHJpZ2dlcmVkIGJ5IGEgYnVsayB3cml0ZQorCQkgKiBmcm9tIGEgY2xpZW50J3MgYmlvZCkuIFJhdGhlciB0aGFuIHN5bmNpbmcgdGhlCisJCSAqIGZpbGUgd2l0aCBlYWNoIHdyaXRlIHJlcXVlc3QsIHdlIHNsZWVwIGZvciAxMCBtc2VjLgorCQkgKgorCQkgKiBJIGRvbid0IGtub3cgaWYgdGhpcyByb3VnaGx5IGFwcHJveGltYXRlcworCQkgKiBDLiBKdXN6YWsncyBpZGVhIG9mIGdhdGhlcmVkIHdyaXRlcywgYnV0IGl0J3MgYQorCQkgKiBuaWNlIGFuZCBzaW1wbGUgc29sdXRpb24gKElNSE8pLCBhbmQgaXQgc2VlbXMgdG8KKwkJICogd29yazotKQorCQkgKi8KKwkJaWYgKEVYX1dHQVRIRVIoZXhwKSkgeworCQkJaWYgKGF0b21pY19yZWFkKCZpbm9kZS0+aV93cml0ZWNvdW50KSA+IDEKKwkJCSAgICB8fCAobGFzdF9pbm8gPT0gaW5vZGUtPmlfaW5vICYmIGxhc3RfZGV2ID09IGlub2RlLT5pX3NiLT5zX2RldikpIHsKKwkJCQlkcHJpbnRrKCJuZnNkOiB3cml0ZSBkZWZlciAlZFxuIiwgY3VycmVudC0+cGlkKTsKKwkJCQltc2xlZXAoMTApOworCQkJCWRwcmludGsoIm5mc2Q6IHdyaXRlIHJlc3VtZSAlZFxuIiwgY3VycmVudC0+cGlkKTsKKwkJCX0KKworCQkJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWSkgeworCQkJCWRwcmludGsoIm5mc2Q6IHdyaXRlIHN5bmMgJWRcbiIsIGN1cnJlbnQtPnBpZCk7CisJCQkJbmZzZF9zeW5jKGZpbGUpOworCQkJfQorI2lmIDAKKwkJCXdha2VfdXAoJmlub2RlLT5pX3dhaXQpOworI2VuZGlmCisJCX0KKwkJbGFzdF9pbm8gPSBpbm9kZS0+aV9pbm87CisJCWxhc3RfZGV2ID0gaW5vZGUtPmlfc2ItPnNfZGV2OworCX0KKworCWRwcmludGsoIm5mc2Q6IHdyaXRlIGNvbXBsZXRlIGVycj0lZFxuIiwgZXJyKTsKKwlpZiAoZXJyID49IDApCisJCWVyciA9IDA7CisJZWxzZSAKKwkJZXJyID0gbmZzZXJybm8oZXJyKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogUmVhZCBkYXRhIGZyb20gYSBmaWxlLiBjb3VudCBtdXN0IGNvbnRhaW4gdGhlIHJlcXVlc3RlZCByZWFkIGNvdW50CisgKiBvbiBlbnRyeS4gT24gcmV0dXJuLCAqY291bnQgY29udGFpbnMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLgorICogTi5CLiBBZnRlciB0aGlzIGNhbGwgZmhwIG5lZWRzIGFuIGZoX3B1dAorICovCitpbnQKK25mc2RfcmVhZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBmaWxlICpmaWxlLAorCQlsb2ZmX3Qgb2Zmc2V0LCBzdHJ1Y3Qga3ZlYyAqdmVjLCBpbnQgdmxlbiwKKwkJdW5zaWduZWQgbG9uZyAqY291bnQpCit7CisJaW50CQllcnI7CisKKwlpZiAoZmlsZSkgeworCQllcnIgPSBuZnNkX3Blcm1pc3Npb24oZmhwLT5maF9leHBvcnQsIGZocC0+ZmhfZGVudHJ5LAorCQkJCU1BWV9SRUFEfE1BWV9PV05FUl9PVkVSUklERSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJZXJyID0gbmZzZF92ZnNfcmVhZChycXN0cCwgZmhwLCBmaWxlLCBvZmZzZXQsIHZlYywgdmxlbiwgY291bnQpOworCX0gZWxzZSB7CisJCWVyciA9IG5mc2Rfb3BlbihycXN0cCwgZmhwLCBTX0lGUkVHLCBNQVlfUkVBRCwgJmZpbGUpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCWVyciA9IG5mc2RfdmZzX3JlYWQocnFzdHAsIGZocCwgZmlsZSwgb2Zmc2V0LCB2ZWMsIHZsZW4sIGNvdW50KTsKKwkJbmZzZF9jbG9zZShmaWxlKTsKKwl9CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFdyaXRlIGRhdGEgdG8gYSBmaWxlLgorICogVGhlIHN0YWJsZSBmbGFnIHJlcXVlc3RzIHN5bmNocm9ub3VzIHdyaXRlcy4KKyAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIGZocCBuZWVkcyBhbiBmaF9wdXQKKyAqLworaW50CituZnNkX3dyaXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgc3RydWN0IGZpbGUgKmZpbGUsCisJCWxvZmZfdCBvZmZzZXQsIHN0cnVjdCBrdmVjICp2ZWMsIGludCB2bGVuLCB1bnNpZ25lZCBsb25nIGNudCwKKwkJaW50ICpzdGFibGVwKQoreworCWludAkJCWVyciA9IDA7CisKKwlpZiAoZmlsZSkgeworCQllcnIgPSBuZnNkX3Blcm1pc3Npb24oZmhwLT5maF9leHBvcnQsIGZocC0+ZmhfZGVudHJ5LAorCQkJCU1BWV9XUklURXxNQVlfT1dORVJfT1ZFUlJJREUpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCWVyciA9IG5mc2RfdmZzX3dyaXRlKHJxc3RwLCBmaHAsIGZpbGUsIG9mZnNldCwgdmVjLCB2bGVuLCBjbnQsCisJCQkJc3RhYmxlcCk7CisJfSBlbHNlIHsKKwkJZXJyID0gbmZzZF9vcGVuKHJxc3RwLCBmaHAsIFNfSUZSRUcsIE1BWV9XUklURSwgJmZpbGUpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKGNudCkKKwkJCWVyciA9IG5mc2RfdmZzX3dyaXRlKHJxc3RwLCBmaHAsIGZpbGUsIG9mZnNldCwgdmVjLCB2bGVuLAorCQkJCQkgICAgIGNudCwgc3RhYmxlcCk7CisJCW5mc2RfY2xvc2UoZmlsZSk7CisJfQorb3V0OgorCXJldHVybiBlcnI7Cit9CisKKyNpZmRlZiBDT05GSUdfTkZTRF9WMworLyoKKyAqIENvbW1pdCBhbGwgcGVuZGluZyB3cml0ZXMgdG8gc3RhYmxlIHN0b3JhZ2UuCisgKiBTdHJpY3RseSBzcGVha2luZywgd2UgY291bGQgc3luYyBqdXN0IHRoZSBpbmRpY2F0ZWQgZmlsZSByZWdpb24gaGVyZSwKKyAqIGJ1dCB0aGVyZSdzIGN1cnJlbnRseSBubyB3YXkgd2UgY2FuIGFzayB0aGUgVkZTIHRvIGRvIHNvLgorICoKKyAqIFVuZm9ydHVuYXRlbHkgd2UgY2Fubm90IGxvY2sgdGhlIGZpbGUgdG8gbWFrZSBzdXJlIHdlIHJldHVybiBmdWxsIFdDQworICogZGF0YSB0byB0aGUgY2xpZW50LCBhcyBsb2NraW5nIGhhcHBlbnMgbG93ZXIgZG93biBpbiB0aGUgZmlsZXN5c3RlbS4KKyAqLworaW50CituZnNkX2NvbW1pdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsCisgICAgICAgICAgICAgICBsb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCXN0cnVjdCBmaWxlCSpmaWxlOworCWludAkJZXJyOworCisJaWYgKCh1NjQpY291bnQgPiB+KHU2NClvZmZzZXQpCisJCXJldHVybiBuZnNlcnJfaW52YWw7CisKKwlpZiAoKGVyciA9IG5mc2Rfb3BlbihycXN0cCwgZmhwLCBTX0lGUkVHLCBNQVlfV1JJVEUsICZmaWxlKSkgIT0gMCkKKwkJcmV0dXJuIGVycjsKKwlpZiAoRVhfSVNTWU5DKGZocC0+ZmhfZXhwb3J0KSkgeworCQlpZiAoZmlsZS0+Zl9vcCAmJiBmaWxlLT5mX29wLT5mc3luYykgeworCQkJbmZzZF9zeW5jKGZpbGUpOworCQl9IGVsc2UgeworCQkJZXJyID0gbmZzZXJyX25vdHN1cHA7CisJCX0KKwl9CisKKwluZnNkX2Nsb3NlKGZpbGUpOworCXJldHVybiBlcnI7Cit9CisjZW5kaWYgLyogQ09ORklHX05GU0RfVjMgKi8KKworLyoKKyAqIENyZWF0ZSBhIGZpbGUgKHJlZ3VsYXIsIGRpcmVjdG9yeSwgZGV2aWNlLCBmaWZvKTsgVU5JWCBzb2NrZXRzIAorICogbm90IHlldCBpbXBsZW1lbnRlZC4KKyAqIElmIHRoZSByZXNwb25zZSBmaCBoYXMgYmVlbiB2ZXJpZmllZCwgdGhlIHBhcmVudCBkaXJlY3Rvcnkgc2hvdWxkCisgKiBhbHJlYWR5IGJlIGxvY2tlZC4gTm90ZSB0aGF0IHRoZSBwYXJlbnQgZGlyZWN0b3J5IGlzIGxlZnQgbG9ja2VkLgorICoKKyAqIE4uQi4gRXZlcnkgY2FsbCB0byBuZnNkX2NyZWF0ZSBuZWVkcyBhbiBmaF9wdXQgZm9yIF9ib3RoXyBmaHAgYW5kIHJlc2ZocAorICovCitpbnQKK25mc2RfY3JlYXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwKKwkJY2hhciAqZm5hbWUsIGludCBmbGVuLCBzdHJ1Y3QgaWF0dHIgKmlhcCwKKwkJaW50IHR5cGUsIGRldl90IHJkZXYsIHN0cnVjdCBzdmNfZmggKnJlc2ZocCkKK3sKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnksICpkY2hpbGQgPSBOVUxMOworCXN0cnVjdCBpbm9kZQkqZGlycDsKKwlpbnQJCWVycjsKKworCWVyciA9IG5mc2Vycl9wZXJtOworCWlmICghZmxlbikKKwkJZ290byBvdXQ7CisJZXJyID0gbmZzZXJyX2V4aXN0OworCWlmIChpc2RvdGVudChmbmFtZSwgZmxlbikpCisJCWdvdG8gb3V0OworCisJZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCBmaHAsIFNfSUZESVIsIE1BWV9DUkVBVEUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZGVudHJ5ID0gZmhwLT5maF9kZW50cnk7CisJZGlycCA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWVyciA9IG5mc2Vycl9ub3RkaXI7CisJaWYoIWRpcnAtPmlfb3AgfHwgIWRpcnAtPmlfb3AtPmxvb2t1cCkKKwkJZ290byBvdXQ7CisJLyoKKwkgKiBDaGVjayB3aGV0aGVyIHRoZSByZXNwb25zZSBmaWxlIGhhbmRsZSBoYXMgYmVlbiB2ZXJpZmllZCB5ZXQuCisJICogSWYgaXQgaGFzLCB0aGUgcGFyZW50IGRpcmVjdG9yeSBzaG91bGQgYWxyZWFkeSBiZSBsb2NrZWQuCisJICovCisJaWYgKCFyZXNmaHAtPmZoX2RlbnRyeSkgeworCQkvKiBjYWxsZWQgZnJvbSBuZnNkX3Byb2NfbWtkaXIsIG9yIHBvc3NpYmx5IG5mc2QzX3Byb2NfY3JlYXRlICovCisJCWZoX2xvY2soZmhwKTsKKwkJZGNoaWxkID0gbG9va3VwX29uZV9sZW4oZm5hbWUsIGRlbnRyeSwgZmxlbik7CisJCWVyciA9IFBUUl9FUlIoZGNoaWxkKTsKKwkJaWYgKElTX0VSUihkY2hpbGQpKQorCQkJZ290byBvdXRfbmZzZXJyOworCQllcnIgPSBmaF9jb21wb3NlKHJlc2ZocCwgZmhwLT5maF9leHBvcnQsIGRjaGlsZCwgZmhwKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCS8qIGNhbGxlZCBmcm9tIG5mc2RfcHJvY19jcmVhdGUgKi8KKwkJZGNoaWxkID0gZGdldChyZXNmaHAtPmZoX2RlbnRyeSk7CisJCWlmICghZmhwLT5maF9sb2NrZWQpIHsKKwkJCS8qIG5vdCBhY3R1YWxseSBwb3NzaWJsZSAqLworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJIm5mc2RfY3JlYXRlOiBwYXJlbnQgJXMvJXMgbm90IGxvY2tlZCFcbiIsCisJCQkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsCisJCQkJZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIGNoaWxkIGRlbnRyeSBpcyBzdGlsbCBuZWdhdGl2ZSAuLi4KKwkgKi8KKwllcnIgPSBuZnNlcnJfZXhpc3Q7CisJaWYgKGRjaGlsZC0+ZF9pbm9kZSkgeworCQlkcHJpbnRrKCJuZnNkX2NyZWF0ZTogZGVudHJ5ICVzLyVzIG5vdCBuZWdhdGl2ZSFcbiIsCisJCQlkZW50cnktPmRfbmFtZS5uYW1lLCBkY2hpbGQtPmRfbmFtZS5uYW1lKTsKKwkJZ290byBvdXQ7IAorCX0KKworCWlmICghKGlhcC0+aWFfdmFsaWQgJiBBVFRSX01PREUpKQorCQlpYXAtPmlhX21vZGUgPSAwOworCWlhcC0+aWFfbW9kZSA9IChpYXAtPmlhX21vZGUgJiBTX0lBTExVR08pIHwgdHlwZTsKKworCS8qCisJICogR2V0IHRoZSBkaXIgb3AgZnVuY3Rpb24gcG9pbnRlci4KKwkgKi8KKwllcnIgPSBuZnNlcnJfcGVybTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNfSUZSRUc6CisJCWVyciA9IHZmc19jcmVhdGUoZGlycCwgZGNoaWxkLCBpYXAtPmlhX21vZGUsIE5VTEwpOworCQlicmVhazsKKwljYXNlIFNfSUZESVI6CisJCWVyciA9IHZmc19ta2RpcihkaXJwLCBkY2hpbGQsIGlhcC0+aWFfbW9kZSk7CisJCWJyZWFrOworCWNhc2UgU19JRkNIUjoKKwljYXNlIFNfSUZCTEs6CisJY2FzZSBTX0lGSUZPOgorCWNhc2UgU19JRlNPQ0s6CisJCWVyciA9IHZmc19ta25vZChkaXJwLCBkY2hpbGQsIGlhcC0+aWFfbW9kZSwgcmRldik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJICAgICAgICBwcmludGsoIm5mc2Q6IGJhZCBmaWxlIHR5cGUgJW8gaW4gbmZzZF9jcmVhdGVcbiIsIHR5cGUpOworCQllcnIgPSAtRUlOVkFMOworCX0KKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfbmZzZXJyOworCisJaWYgKEVYX0lTU1lOQyhmaHAtPmZoX2V4cG9ydCkpIHsKKwkJbmZzZF9zeW5jX2RpcihkZW50cnkpOworCQl3cml0ZV9pbm9kZV9ub3coZGNoaWxkLT5kX2lub2RlLCAxKTsKKwl9CisKKworCS8qIFNldCBmaWxlIGF0dHJpYnV0ZXMuIE1vZGUgaGFzIGFscmVhZHkgYmVlbiBzZXQgYW5kCisJICogc2V0dGluZyB1aWQvZ2lkIHdvcmtzIG9ubHkgZm9yIHJvb3QuIElyaXggYXBwZWFycyB0bworCSAqIHNlbmQgYWxvbmcgdGhlIGdpZCB3aGVuIGl0IHRyaWVzIHRvIGltcGxlbWVudCBzZXRnaWQKKwkgKiBkaXJlY3RvcmllcyB2aWEgTkZTLgorCSAqLworCWVyciA9IDA7CisJaWYgKChpYXAtPmlhX3ZhbGlkICY9IH4oQVRUUl9VSUR8QVRUUl9HSUR8QVRUUl9NT0RFKSkgIT0gMCkKKwkJZXJyID0gbmZzZF9zZXRhdHRyKHJxc3RwLCByZXNmaHAsIGlhcCwgMCwgKHRpbWVfdCkwKTsKKwkvKgorCSAqIFVwZGF0ZSB0aGUgZmlsZSBoYW5kbGUgdG8gZ2V0IHRoZSBuZXcgaW5vZGUgaW5mby4KKwkgKi8KKwlpZiAoIWVycikKKwkJZXJyID0gZmhfdXBkYXRlKHJlc2ZocCk7CitvdXQ6CisJaWYgKGRjaGlsZCAmJiAhSVNfRVJSKGRjaGlsZCkpCisJCWRwdXQoZGNoaWxkKTsKKwlyZXR1cm4gZXJyOworCitvdXRfbmZzZXJyOgorCWVyciA9IG5mc2Vycm5vKGVycik7CisJZ290byBvdXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfTkZTRF9WMworLyoKKyAqIE5GU3YzIHZlcnNpb24gb2YgbmZzZF9jcmVhdGUKKyAqLworaW50CituZnNkX2NyZWF0ZV92MyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsCisJCWNoYXIgKmZuYW1lLCBpbnQgZmxlbiwgc3RydWN0IGlhdHRyICppYXAsCisJCXN0cnVjdCBzdmNfZmggKnJlc2ZocCwgaW50IGNyZWF0ZW1vZGUsIHUzMiAqdmVyaWZpZXIsCisJICAgICAgICBpbnQgKnRydW5jcCkKK3sKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnksICpkY2hpbGQgPSBOVUxMOworCXN0cnVjdCBpbm9kZQkqZGlycDsKKwlpbnQJCWVycjsKKwlfX3UzMgkJdl9tdGltZT0wLCB2X2F0aW1lPTA7CisJaW50CQl2X21vZGU9MDsKKworCWVyciA9IG5mc2Vycl9wZXJtOworCWlmICghZmxlbikKKwkJZ290byBvdXQ7CisJZXJyID0gbmZzZXJyX2V4aXN0OworCWlmIChpc2RvdGVudChmbmFtZSwgZmxlbikpCisJCWdvdG8gb3V0OworCWlmICghKGlhcC0+aWFfdmFsaWQgJiBBVFRSX01PREUpKQorCQlpYXAtPmlhX21vZGUgPSAwOworCWVyciA9IGZoX3ZlcmlmeShycXN0cCwgZmhwLCBTX0lGRElSLCBNQVlfQ1JFQVRFKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWRlbnRyeSA9IGZocC0+ZmhfZGVudHJ5OworCWRpcnAgPSBkZW50cnktPmRfaW5vZGU7CisKKwkvKiBHZXQgYWxsIHRoZSBzYW5pdHkgY2hlY2tzIG91dCBvZiB0aGUgd2F5IGJlZm9yZQorCSAqIHdlIGxvY2sgdGhlIHBhcmVudC4gKi8KKwllcnIgPSBuZnNlcnJfbm90ZGlyOworCWlmKCFkaXJwLT5pX29wIHx8ICFkaXJwLT5pX29wLT5sb29rdXApCisJCWdvdG8gb3V0OworCWZoX2xvY2soZmhwKTsKKworCS8qCisJICogQ29tcG9zZSB0aGUgcmVzcG9uc2UgZmlsZSBoYW5kbGUuCisJICovCisJZGNoaWxkID0gbG9va3VwX29uZV9sZW4oZm5hbWUsIGRlbnRyeSwgZmxlbik7CisJZXJyID0gUFRSX0VSUihkY2hpbGQpOworCWlmIChJU19FUlIoZGNoaWxkKSkKKwkJZ290byBvdXRfbmZzZXJyOworCisJZXJyID0gZmhfY29tcG9zZShyZXNmaHAsIGZocC0+ZmhfZXhwb3J0LCBkY2hpbGQsIGZocCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlpZiAoY3JlYXRlbW9kZSA9PSBORlMzX0NSRUFURV9FWENMVVNJVkUpIHsKKwkJLyogd2hpbGUgdGhlIHZlcmlmaWVyIHdvdWxkIGZpdCBpbiBtdGltZSthdGltZSwKKwkJICogc29sYXJpczcgZ2V0cyBjb25mdXNlZCAoYnVnaWQgNDIxODUwOCkgaWYgdGhlc2UgaGF2ZQorCQkgKiB0aGUgaGlnaCBiaXQgc2V0LCBzbyB3ZSB1c2UgdGhlIG1vZGUgYXMgd2VsbAorCQkgKi8KKwkJdl9tdGltZSA9IHZlcmlmaWVyWzBdJjB4N2ZmZmZmZmY7CisJCXZfYXRpbWUgPSB2ZXJpZmllclsxXSYweDdmZmZmZmZmOworCQl2X21vZGUgID0gU19JRlJFRworCQkJfCAoKHZlcmlmaWVyWzBdJjB4ODAwMDAwMDApID4+ICgzMi03KSkgLyogdSt4ICovCisJCQl8ICgodmVyaWZpZXJbMV0mMHg4MDAwMDAwMCkgPj4gKDMyLTkpKSAvKiB1K3IgKi8KKwkJCTsKKwl9CisJCisJaWYgKGRjaGlsZC0+ZF9pbm9kZSkgeworCQllcnIgPSAwOworCisJCXN3aXRjaCAoY3JlYXRlbW9kZSkgeworCQljYXNlIE5GUzNfQ1JFQVRFX1VOQ0hFQ0tFRDoKKwkJCWlmICghIFNfSVNSRUcoZGNoaWxkLT5kX2lub2RlLT5pX21vZGUpKQorCQkJCWVyciA9IG5mc2Vycl9leGlzdDsKKwkJCWVsc2UgaWYgKHRydW5jcCkgeworCQkJCS8qIGluIG5mc3Y0LCB3ZSBuZWVkIHRvIHRyZWF0IHRoaXMgY2FzZSBhIGxpdHRsZQorCQkJCSAqIGRpZmZlcmVudGx5LiAgd2UgZG9uJ3Qgd2FudCB0byB0cnVuY2F0ZSB0aGUKKwkJCQkgKiBmaWxlIG5vdzsgdGhpcyB3b3VsZCBiZSB3cm9uZyBpZiB0aGUgT1BFTgorCQkJCSAqIGZhaWxzIGZvciBzb21lIG90aGVyIHJlYXNvbi4gIGZ1cnRoZXJtb3JlLAorCQkJCSAqIGlmIHRoZSBzaXplIGlzIG5vbnplcm8sIHdlIHNob3VsZCBpZ25vcmUgaXQKKwkJCQkgKiBhY2NvcmRpbmcgdG8gc3BlYyEKKwkJCQkgKi8KKwkJCQkqdHJ1bmNwID0gKGlhcC0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpICYmICFpYXAtPmlhX3NpemU7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpYXAtPmlhX3ZhbGlkICY9IEFUVFJfU0laRTsKKwkJCQlnb3RvIHNldF9hdHRyOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTkZTM19DUkVBVEVfRVhDTFVTSVZFOgorCQkJaWYgKCAgIGRjaGlsZC0+ZF9pbm9kZS0+aV9tdGltZS50dl9zZWMgPT0gdl9tdGltZQorCQkJICAgICYmIGRjaGlsZC0+ZF9pbm9kZS0+aV9hdGltZS50dl9zZWMgPT0gdl9hdGltZQorCQkJICAgICYmIGRjaGlsZC0+ZF9pbm9kZS0+aV9tb2RlICA9PSB2X21vZGUKKwkJCSAgICAmJiBkY2hpbGQtPmRfaW5vZGUtPmlfc2l6ZSAgPT0gMCApCisJCQkJYnJlYWs7CisJCQkgLyogZmFsbHRocnUgKi8KKwkJY2FzZSBORlMzX0NSRUFURV9HVUFSREVEOgorCQkJZXJyID0gbmZzZXJyX2V4aXN0OworCQl9CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IHZmc19jcmVhdGUoZGlycCwgZGNoaWxkLCBpYXAtPmlhX21vZGUsIE5VTEwpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9uZnNlcnI7CisKKwlpZiAoRVhfSVNTWU5DKGZocC0+ZmhfZXhwb3J0KSkgeworCQluZnNkX3N5bmNfZGlyKGRlbnRyeSk7CisJCS8qIHNldGF0dHIgd2lsbCBzeW5jIHRoZSBjaGlsZCAob3Igbm90KSAqLworCX0KKworCS8qCisJICogVXBkYXRlIHRoZSBmaWxlaGFuZGxlIHRvIGdldCB0aGUgbmV3IGlub2RlIGluZm8uCisJICovCisJZXJyID0gZmhfdXBkYXRlKHJlc2ZocCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlpZiAoY3JlYXRlbW9kZSA9PSBORlMzX0NSRUFURV9FWENMVVNJVkUpIHsKKwkJLyogQ3JhbSB0aGUgdmVyaWZpZXIgaW50byBhdGltZS9tdGltZS9tb2RlICovCisJCWlhcC0+aWFfdmFsaWQgPSBBVFRSX01USU1FfEFUVFJfQVRJTUUKKwkJCXwgQVRUUl9NVElNRV9TRVR8QVRUUl9BVElNRV9TRVQKKwkJCXwgQVRUUl9NT0RFOworCQkvKiBYWFggc29tZW9uZSB3aG8ga25vd3MgdGhpcyBiZXR0ZXIgcGxlYXNlIGZpeCBpdCBmb3IgbnNlYyAqLyAKKwkJaWFwLT5pYV9tdGltZS50dl9zZWMgPSB2X210aW1lOworCQlpYXAtPmlhX2F0aW1lLnR2X3NlYyA9IHZfYXRpbWU7CisJCWlhcC0+aWFfbXRpbWUudHZfbnNlYyA9IDA7CisJCWlhcC0+aWFfYXRpbWUudHZfbnNlYyA9IDA7CisJCWlhcC0+aWFfbW9kZSAgPSB2X21vZGU7CisJfQorCisJLyogU2V0IGZpbGUgYXR0cmlidXRlcy4KKwkgKiBNb2RlIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ1dCB3ZSBtaWdodCBuZWVkIHRvIHJlc2V0IGl0CisJICogZm9yIENSRUFURV9FWENMVVNJVkUKKwkgKiBJcml4IGFwcGVhcnMgdG8gc2VuZCBhbG9uZyB0aGUgZ2lkIHdoZW4gaXQgdHJpZXMgdG8KKwkgKiBpbXBsZW1lbnQgc2V0Z2lkIGRpcmVjdG9yaWVzIHZpYSBORlMuIENsZWFyIG91dCBhbGwgdGhhdCBjcnVmdC4KKwkgKi8KKyBzZXRfYXR0cjoKKwlpZiAoKGlhcC0+aWFfdmFsaWQgJj0gfihBVFRSX1VJRHxBVFRSX0dJRCkpICE9IDApCisgCQllcnIgPSBuZnNkX3NldGF0dHIocnFzdHAsIHJlc2ZocCwgaWFwLCAwLCAodGltZV90KTApOworCisgb3V0OgorCWZoX3VubG9jayhmaHApOworCWlmIChkY2hpbGQgJiYgIUlTX0VSUihkY2hpbGQpKQorCQlkcHV0KGRjaGlsZCk7CisgCXJldHVybiBlcnI7CisgCisgb3V0X25mc2VycjoKKwllcnIgPSBuZnNlcnJubyhlcnIpOworCWdvdG8gb3V0OworfQorI2VuZGlmIC8qIENPTkZJR19ORlNEX1YzICovCisKKy8qCisgKiBSZWFkIGEgc3ltbGluay4gT24gZW50cnksICpsZW5wIG11c3QgY29udGFpbiB0aGUgbWF4aW11bSBwYXRoIGxlbmd0aCB0aGF0CisgKiBmaXRzIGludG8gdGhlIGJ1ZmZlci4gT24gcmV0dXJuLCBpdCBjb250YWlucyB0aGUgdHJ1ZSBsZW5ndGguCisgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCBmaHAgbmVlZHMgYW4gZmhfcHV0CisgKi8KK2ludAorbmZzZF9yZWFkbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIGNoYXIgKmJ1ZiwgaW50ICpsZW5wKQoreworCXN0cnVjdCBkZW50cnkJKmRlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlOworCW1tX3NlZ21lbnRfdAlvbGRmczsKKwlpbnQJCWVycjsKKworCWVyciA9IGZoX3ZlcmlmeShycXN0cCwgZmhwLCBTX0lGTE5LLCBNQVlfTk9QKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWRlbnRyeSA9IGZocC0+ZmhfZGVudHJ5OworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJZXJyID0gbmZzZXJyX2ludmFsOworCWlmICghaW5vZGUtPmlfb3AgfHwgIWlub2RlLT5pX29wLT5yZWFkbGluaykKKwkJZ290byBvdXQ7CisKKwl0b3VjaF9hdGltZShmaHAtPmZoX2V4cG9ydC0+ZXhfbW50LCBkZW50cnkpOworCS8qIE4uQi4gV2h5IGRvZXMgdGhpcyBjYWxsIG5lZWQgYSBnZXRfZnMoKT8/CisJICogUmVtb3ZlIHRoZSBzZXRfZnMgYW5kIHdhdGNoIHRoZSBmaXJld29ya3M6LSkgLS1va2lyCisJICovCisKKwlvbGRmcyA9IGdldF9mcygpOyBzZXRfZnMoS0VSTkVMX0RTKTsKKwllcnIgPSBpbm9kZS0+aV9vcC0+cmVhZGxpbmsoZGVudHJ5LCBidWYsICpsZW5wKTsKKwlzZXRfZnMob2xkZnMpOworCisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X25mc2VycjsKKwkqbGVucCA9IGVycjsKKwllcnIgPSAwOworb3V0OgorCXJldHVybiBlcnI7CisKK291dF9uZnNlcnI6CisJZXJyID0gbmZzZXJybm8oZXJyKTsKKwlnb3RvIG91dDsKK30KKworLyoKKyAqIENyZWF0ZSBhIHN5bWxpbmsgYW5kIGxvb2sgdXAgaXRzIGlub2RlCisgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCBfYm90aF8gZmhwIGFuZCByZXNmaHAgbmVlZCBhbiBmaF9wdXQKKyAqLworaW50CituZnNkX3N5bWxpbmsoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLAorCQkJCWNoYXIgKmZuYW1lLCBpbnQgZmxlbiwKKwkJCQljaGFyICpwYXRoLCAgaW50IHBsZW4sCisJCQkJc3RydWN0IHN2Y19maCAqcmVzZmhwLAorCQkJCXN0cnVjdCBpYXR0ciAqaWFwKQoreworCXN0cnVjdCBkZW50cnkJKmRlbnRyeSwgKmRuZXc7CisJaW50CQllcnIsIGNlcnI7CisJdW1vZGVfdAkJbW9kZTsKKworCWVyciA9IG5mc2Vycl9ub2VudDsKKwlpZiAoIWZsZW4gfHwgIXBsZW4pCisJCWdvdG8gb3V0OworCWVyciA9IG5mc2Vycl9leGlzdDsKKwlpZiAoaXNkb3RlbnQoZm5hbWUsIGZsZW4pKQorCQlnb3RvIG91dDsKKworCWVyciA9IGZoX3ZlcmlmeShycXN0cCwgZmhwLCBTX0lGRElSLCBNQVlfQ1JFQVRFKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlmaF9sb2NrKGZocCk7CisJZGVudHJ5ID0gZmhwLT5maF9kZW50cnk7CisJZG5ldyA9IGxvb2t1cF9vbmVfbGVuKGZuYW1lLCBkZW50cnksIGZsZW4pOworCWVyciA9IFBUUl9FUlIoZG5ldyk7CisJaWYgKElTX0VSUihkbmV3KSkKKwkJZ290byBvdXRfbmZzZXJyOworCisJbW9kZSA9IFNfSUFMTFVHTzsKKwkvKiBPbmx5IHRoZSBNT0RFIEFUVFJpYnV0ZSBpcyBldmVuIHZhZ3VlbHkgbWVhbmluZ2Z1bCAqLworCWlmIChpYXAgJiYgKGlhcC0+aWFfdmFsaWQgJiBBVFRSX01PREUpKQorCQltb2RlID0gaWFwLT5pYV9tb2RlICYgU19JQUxMVUdPOworCisJaWYgKHVubGlrZWx5KHBhdGhbcGxlbl0gIT0gMCkpIHsKKwkJY2hhciAqcGF0aF9hbGxvY2VkID0ga21hbGxvYyhwbGVuKzEsIEdGUF9LRVJORUwpOworCQlpZiAocGF0aF9hbGxvY2VkID09IE5VTEwpCisJCQllcnIgPSAtRU5PTUVNOworCQllbHNlIHsKKwkJCXN0cm5jcHkocGF0aF9hbGxvY2VkLCBwYXRoLCBwbGVuKTsKKwkJCXBhdGhfYWxsb2NlZFtwbGVuXSA9IDA7CisJCQllcnIgPSB2ZnNfc3ltbGluayhkZW50cnktPmRfaW5vZGUsIGRuZXcsIHBhdGhfYWxsb2NlZCwgbW9kZSk7CisJCQlrZnJlZShwYXRoX2FsbG9jZWQpOworCQl9CisJfSBlbHNlCisJCWVyciA9IHZmc19zeW1saW5rKGRlbnRyeS0+ZF9pbm9kZSwgZG5ldywgcGF0aCwgbW9kZSk7CisKKwlpZiAoIWVycikgeworCQlpZiAoRVhfSVNTWU5DKGZocC0+ZmhfZXhwb3J0KSkKKwkJCW5mc2Rfc3luY19kaXIoZGVudHJ5KTsKKwl9IGVsc2UKKwkJZXJyID0gbmZzZXJybm8oZXJyKTsKKwlmaF91bmxvY2soZmhwKTsKKworCWNlcnIgPSBmaF9jb21wb3NlKHJlc2ZocCwgZmhwLT5maF9leHBvcnQsIGRuZXcsIGZocCk7CisJZHB1dChkbmV3KTsKKwlpZiAoZXJyPT0wKSBlcnIgPSBjZXJyOworb3V0OgorCXJldHVybiBlcnI7CisKK291dF9uZnNlcnI6CisJZXJyID0gbmZzZXJybm8oZXJyKTsKKwlnb3RvIG91dDsKK30KKworLyoKKyAqIENyZWF0ZSBhIGhhcmRsaW5rCisgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCBfYm90aF8gZmZocCBhbmQgdGZocCBuZWVkIGFuIGZoX3B1dAorICovCitpbnQKK25mc2RfbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmZmhwLAorCQkJCWNoYXIgKm5hbWUsIGludCBsZW4sIHN0cnVjdCBzdmNfZmggKnRmaHApCit7CisJc3RydWN0IGRlbnRyeQkqZGRpciwgKmRuZXcsICpkb2xkOworCXN0cnVjdCBpbm9kZQkqZGlycCwgKmRlc3Q7CisJaW50CQllcnI7CisKKwllcnIgPSBmaF92ZXJpZnkocnFzdHAsIGZmaHAsIFNfSUZESVIsIE1BWV9DUkVBVEUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IGZoX3ZlcmlmeShycXN0cCwgdGZocCwgLVNfSUZESVIsIE1BWV9OT1ApOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gbmZzZXJyX3Blcm07CisJaWYgKCFsZW4pCisJCWdvdG8gb3V0OworCWVyciA9IG5mc2Vycl9leGlzdDsKKwlpZiAoaXNkb3RlbnQobmFtZSwgbGVuKSkKKwkJZ290byBvdXQ7CisKKwlmaF9sb2NrKGZmaHApOworCWRkaXIgPSBmZmhwLT5maF9kZW50cnk7CisJZGlycCA9IGRkaXItPmRfaW5vZGU7CisKKwlkbmV3ID0gbG9va3VwX29uZV9sZW4obmFtZSwgZGRpciwgbGVuKTsKKwllcnIgPSBQVFJfRVJSKGRuZXcpOworCWlmIChJU19FUlIoZG5ldykpCisJCWdvdG8gb3V0X25mc2VycjsKKworCWRvbGQgPSB0ZmhwLT5maF9kZW50cnk7CisJZGVzdCA9IGRvbGQtPmRfaW5vZGU7CisKKwllcnIgPSB2ZnNfbGluayhkb2xkLCBkaXJwLCBkbmV3KTsKKwlpZiAoIWVycikgeworCQlpZiAoRVhfSVNTWU5DKGZmaHAtPmZoX2V4cG9ydCkpIHsKKwkJCW5mc2Rfc3luY19kaXIoZGRpcik7CisJCQl3cml0ZV9pbm9kZV9ub3coZGVzdCwgMSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZXJyID09IC1FWERFViAmJiBycXN0cC0+cnFfdmVycyA9PSAyKQorCQkJZXJyID0gbmZzZXJyX2FjY2VzOworCQllbHNlCisJCQllcnIgPSBuZnNlcnJubyhlcnIpOworCX0KKworCWZoX3VubG9jayhmZmhwKTsKKwlkcHV0KGRuZXcpOworb3V0OgorCXJldHVybiBlcnI7CisKK291dF9uZnNlcnI6CisJZXJyID0gbmZzZXJybm8oZXJyKTsKKwlnb3RvIG91dDsKK30KKworLyoKKyAqIFJlbmFtZSBhIGZpbGUKKyAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIF9ib3RoXyBmZmhwIGFuZCB0ZmhwIG5lZWQgYW4gZmhfcHV0CisgKi8KK2ludAorbmZzZF9yZW5hbWUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmZocCwgY2hhciAqZm5hbWUsIGludCBmbGVuLAorCQkJICAgIHN0cnVjdCBzdmNfZmggKnRmaHAsIGNoYXIgKnRuYW1lLCBpbnQgdGxlbikKK3sKKwlzdHJ1Y3QgZGVudHJ5CSpmZGVudHJ5LCAqdGRlbnRyeSwgKm9kZW50cnksICpuZGVudHJ5LCAqdHJhcDsKKwlzdHJ1Y3QgaW5vZGUJKmZkaXIsICp0ZGlyOworCWludAkJZXJyOworCisJZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCBmZmhwLCBTX0lGRElSLCBNQVlfUkVNT1ZFKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSBmaF92ZXJpZnkocnFzdHAsIHRmaHAsIFNfSUZESVIsIE1BWV9DUkVBVEUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZmRlbnRyeSA9IGZmaHAtPmZoX2RlbnRyeTsKKwlmZGlyID0gZmRlbnRyeS0+ZF9pbm9kZTsKKworCXRkZW50cnkgPSB0ZmhwLT5maF9kZW50cnk7CisJdGRpciA9IHRkZW50cnktPmRfaW5vZGU7CisKKwllcnIgPSAocnFzdHAtPnJxX3ZlcnMgPT0gMikgPyBuZnNlcnJfYWNjZXMgOiBuZnNlcnJfeGRldjsKKwlpZiAoZmRpci0+aV9zYiAhPSB0ZGlyLT5pX3NiKQorCQlnb3RvIG91dDsKKworCWVyciA9IG5mc2Vycl9wZXJtOworCWlmICghZmxlbiB8fCBpc2RvdGVudChmbmFtZSwgZmxlbikgfHwgIXRsZW4gfHwgaXNkb3RlbnQodG5hbWUsIHRsZW4pKQorCQlnb3RvIG91dDsKKworCS8qIGNhbm5vdCB1c2UgZmhfbG9jayBhcyB3ZSBuZWVkIGRlYWRsb2NrIHByb3RlY3RpdmUgb3JkZXJpbmcKKwkgKiBzbyBkbyBpdCBieSBoYW5kICovCisJdHJhcCA9IGxvY2tfcmVuYW1lKHRkZW50cnksIGZkZW50cnkpOworCWZmaHAtPmZoX2xvY2tlZCA9IHRmaHAtPmZoX2xvY2tlZCA9IDE7CisJZmlsbF9wcmVfd2NjKGZmaHApOworCWZpbGxfcHJlX3djYyh0ZmhwKTsKKworCW9kZW50cnkgPSBsb29rdXBfb25lX2xlbihmbmFtZSwgZmRlbnRyeSwgZmxlbik7CisJZXJyID0gUFRSX0VSUihvZGVudHJ5KTsKKwlpZiAoSVNfRVJSKG9kZW50cnkpKQorCQlnb3RvIG91dF9uZnNlcnI7CisKKwllcnIgPSAtRU5PRU5UOworCWlmICghb2RlbnRyeS0+ZF9pbm9kZSkKKwkJZ290byBvdXRfZHB1dF9vbGQ7CisJZXJyID0gLUVJTlZBTDsKKwlpZiAob2RlbnRyeSA9PSB0cmFwKQorCQlnb3RvIG91dF9kcHV0X29sZDsKKworCW5kZW50cnkgPSBsb29rdXBfb25lX2xlbih0bmFtZSwgdGRlbnRyeSwgdGxlbik7CisJZXJyID0gUFRSX0VSUihuZGVudHJ5KTsKKwlpZiAoSVNfRVJSKG5kZW50cnkpKQorCQlnb3RvIG91dF9kcHV0X29sZDsKKwllcnIgPSAtRU5PVEVNUFRZOworCWlmIChuZGVudHJ5ID09IHRyYXApCisJCWdvdG8gb3V0X2RwdXRfbmV3OworCisjaWZkZWYgTVNORlMKKwlpZiAoKGZmaHAtPmZoX2V4cG9ydC0+ZXhfZmxhZ3MgJiBORlNFWFBfTVNORlMpICYmCisJCSgoYXRvbWljX3JlYWQoJm9kZW50cnktPmRfY291bnQpID4gMSkKKwkJIHx8IChhdG9taWNfcmVhZCgmbmRlbnRyeS0+ZF9jb3VudCkgPiAxKSkpIHsKKwkJCWVyciA9IG5mc2Vycl9wZXJtOworCX0gZWxzZQorI2VuZGlmCisJZXJyID0gdmZzX3JlbmFtZShmZGlyLCBvZGVudHJ5LCB0ZGlyLCBuZGVudHJ5KTsKKwlpZiAoIWVyciAmJiBFWF9JU1NZTkModGZocC0+ZmhfZXhwb3J0KSkgeworCQluZnNkX3N5bmNfZGlyKHRkZW50cnkpOworCQluZnNkX3N5bmNfZGlyKGZkZW50cnkpOworCX0KKworIG91dF9kcHV0X25ldzoKKwlkcHV0KG5kZW50cnkpOworIG91dF9kcHV0X29sZDoKKwlkcHV0KG9kZW50cnkpOworIG91dF9uZnNlcnI6CisJaWYgKGVycikKKwkJZXJyID0gbmZzZXJybm8oZXJyKTsKKworCS8qIHdlIGNhbm5vdCByZXBseSBvbiBmaF91bmxvY2sgb24gdGhlIHR3byBmaWxlaGFuZGxlcywKKwkgKiBhcyB0aGF0IHdvdWxkIGRvIHRoZSB3cm9uZyB0aGluZyBpZiB0aGUgdHdvIGRpcmVjdG9yaWVzCisJICogd2VyZSB0aGUgc2FtZSwgc28gYWdhaW4gd2UgZG8gaXQgYnkgaGFuZAorCSAqLworCWZpbGxfcG9zdF93Y2MoZmZocCk7CisJZmlsbF9wb3N0X3djYyh0ZmhwKTsKKwl1bmxvY2tfcmVuYW1lKHRkZW50cnksIGZkZW50cnkpOworCWZmaHAtPmZoX2xvY2tlZCA9IHRmaHAtPmZoX2xvY2tlZCA9IDA7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogVW5saW5rIGEgZmlsZSBvciBkaXJlY3RvcnkKKyAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIGZocCBuZWVkcyBhbiBmaF9wdXQKKyAqLworaW50CituZnNkX3VubGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIGludCB0eXBlLAorCQkJCWNoYXIgKmZuYW1lLCBpbnQgZmxlbikKK3sKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnksICpyZGVudHJ5OworCXN0cnVjdCBpbm9kZQkqZGlycDsKKwlpbnQJCWVycjsKKworCWVyciA9IG5mc2Vycl9hY2NlczsKKwlpZiAoIWZsZW4gfHwgaXNkb3RlbnQoZm5hbWUsIGZsZW4pKQorCQlnb3RvIG91dDsKKwllcnIgPSBmaF92ZXJpZnkocnFzdHAsIGZocCwgU19JRkRJUiwgTUFZX1JFTU9WRSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlmaF9sb2NrKGZocCk7CisJZGVudHJ5ID0gZmhwLT5maF9kZW50cnk7CisJZGlycCA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCXJkZW50cnkgPSBsb29rdXBfb25lX2xlbihmbmFtZSwgZGVudHJ5LCBmbGVuKTsKKwllcnIgPSBQVFJfRVJSKHJkZW50cnkpOworCWlmIChJU19FUlIocmRlbnRyeSkpCisJCWdvdG8gb3V0X25mc2VycjsKKworCWlmICghcmRlbnRyeS0+ZF9pbm9kZSkgeworCQlkcHV0KHJkZW50cnkpOworCQllcnIgPSBuZnNlcnJfbm9lbnQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghdHlwZSkKKwkJdHlwZSA9IHJkZW50cnktPmRfaW5vZGUtPmlfbW9kZSAmIFNfSUZNVDsKKworCWlmICh0eXBlICE9IFNfSUZESVIpIHsgLyogSXQncyBVTkxJTksgKi8KKyNpZmRlZiBNU05GUworCQlpZiAoKGZocC0+ZmhfZXhwb3J0LT5leF9mbGFncyAmIE5GU0VYUF9NU05GUykgJiYKKwkJCShhdG9taWNfcmVhZCgmcmRlbnRyeS0+ZF9jb3VudCkgPiAxKSkgeworCQkJZXJyID0gbmZzZXJyX3Blcm07CisJCX0gZWxzZQorI2VuZGlmCisJCWVyciA9IHZmc191bmxpbmsoZGlycCwgcmRlbnRyeSk7CisJfSBlbHNlIHsgLyogSXQncyBSTURJUiAqLworCQllcnIgPSB2ZnNfcm1kaXIoZGlycCwgcmRlbnRyeSk7CisJfQorCisJZHB1dChyZGVudHJ5KTsKKworCWlmIChlcnIpCisJCWdvdG8gb3V0X25mc2VycjsKKwlpZiAoRVhfSVNTWU5DKGZocC0+ZmhfZXhwb3J0KSkgCisJCW5mc2Rfc3luY19kaXIoZGVudHJ5KTsKKworb3V0OgorCXJldHVybiBlcnI7CisKK291dF9uZnNlcnI6CisJZXJyID0gbmZzZXJybm8oZXJyKTsKKwlnb3RvIG91dDsKK30KKworLyoKKyAqIFJlYWQgZW50cmllcyBmcm9tIGEgZGlyZWN0b3J5LgorICogVGhlICBORlN2My80IHZlcmlmaWVyIHdlIGlnbm9yZSBmb3Igbm93LgorICovCitpbnQKK25mc2RfcmVhZGRpcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIGxvZmZfdCAqb2Zmc2V0cCwgCisJICAgICBzdHJ1Y3QgcmVhZGRpcl9jZCAqY2RwLCBlbmNvZGVfZGVudF9mbiBmdW5jKQoreworCWludAkJZXJyOworCXN0cnVjdCBmaWxlCSpmaWxlOworCWxvZmZfdAkJb2Zmc2V0ID0gKm9mZnNldHA7CisKKwllcnIgPSBuZnNkX29wZW4ocnFzdHAsIGZocCwgU19JRkRJUiwgTUFZX1JFQUQsICZmaWxlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCW9mZnNldCA9IHZmc19sbHNlZWsoZmlsZSwgb2Zmc2V0LCAwKTsKKwlpZiAob2Zmc2V0IDwgMCkgeworCQllcnIgPSBuZnNlcnJubygoaW50KW9mZnNldCk7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKworCS8qCisJICogUmVhZCB0aGUgZGlyZWN0b3J5IGVudHJpZXMuIFRoaXMgc2lsbHkgbG9vcCBpcyBuZWNlc3NhcnkgYmVjYXVzZQorCSAqIHJlYWRkaXIoKSBpcyBub3QgZ3VhcmFudGVlZCB0byBmaWxsIHVwIHRoZSBlbnRpcmUgYnVmZmVyLCBidXQKKwkgKiBtYXkgY2hvb3NlIHRvIGRvIGxlc3MuCisJICovCisKKwlkbyB7CisJCWNkcC0+ZXJyID0gbmZzZXJyX2VvZjsgLyogd2lsbCBiZSBjbGVhcmVkIG9uIHN1Y2Nlc3NmdWwgcmVhZCAqLworCQllcnIgPSB2ZnNfcmVhZGRpcihmaWxlLCAoZmlsbGRpcl90KSBmdW5jLCBjZHApOworCX0gd2hpbGUgKGVyciA+PTAgJiYgY2RwLT5lcnIgPT0gbmZzX29rKTsKKwlpZiAoZXJyKQorCQllcnIgPSBuZnNlcnJubyhlcnIpOworCWVsc2UKKwkJZXJyID0gY2RwLT5lcnI7CisJKm9mZnNldHAgPSB2ZnNfbGxzZWVrKGZpbGUsIDAsIDEpOworCisJaWYgKGVyciA9PSBuZnNlcnJfZW9mIHx8IGVyciA9PSBuZnNlcnJfdG9vc21hbGwpCisJCWVyciA9IG5mc19vazsgLyogY2FuIHN0aWxsIGJlIGZvdW5kIGluIC0+ZXJyICovCitvdXRfY2xvc2U6CisJbmZzZF9jbG9zZShmaWxlKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogR2V0IGZpbGUgc3lzdGVtIHN0YXRzCisgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCBmaHAgbmVlZHMgYW4gZmhfcHV0CisgKi8KK2ludAorbmZzZF9zdGF0ZnMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBzdHJ1Y3Qga3N0YXRmcyAqc3RhdCkKK3sKKwlpbnQgZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCBmaHAsIDAsIE1BWV9OT1ApOworCWlmICghZXJyICYmIHZmc19zdGF0ZnMoZmhwLT5maF9kZW50cnktPmRfaW5vZGUtPmlfc2Isc3RhdCkpCisJCWVyciA9IG5mc2Vycl9pbzsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogQ2hlY2sgZm9yIGEgdXNlcidzIGFjY2VzcyBwZXJtaXNzaW9ucyB0byB0aGlzIGlub2RlLgorICovCitpbnQKK25mc2RfcGVybWlzc2lvbihzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBhY2MpCit7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQJCWVycjsKKworCWlmIChhY2MgPT0gTUFZX05PUCkKKwkJcmV0dXJuIDA7CisjaWYgMAorCWRwcmludGsoIm5mc2Q6IHBlcm1pc3Npb24gMHgleCVzJXMlcyVzJXMlcyVzIG1vZGUgMCVvJXMlcyVzXG4iLAorCQlhY2MsCisJCShhY2MgJiBNQVlfUkVBRCk/CSIgcmVhZCIgIDogIiIsCisJCShhY2MgJiBNQVlfV1JJVEUpPwkiIHdyaXRlIiA6ICIiLAorCQkoYWNjICYgTUFZX0VYRUMpPwkiIGV4ZWMiICA6ICIiLAorCQkoYWNjICYgTUFZX1NBVFRSKT8JIiBzYXR0ciIgOiAiIiwKKwkJKGFjYyAmIE1BWV9UUlVOQyk/CSIgdHJ1bmMiIDogIiIsCisJCShhY2MgJiBNQVlfTE9DSyk/CSIgbG9jayIgIDogIiIsCisJCShhY2MgJiBNQVlfT1dORVJfT1ZFUlJJREUpPyAiIG93bmVyb3ZlcnJpZGUiIDogIiIsCisJCWlub2RlLT5pX21vZGUsCisJCUlTX0lNTVVUQUJMRShpbm9kZSk/CSIgaW1tdXQiIDogIiIsCisJCUlTX0FQUEVORChpbm9kZSk/CSIgYXBwZW5kIiA6ICIiLAorCQlJU19SRE9OTFkoaW5vZGUpPwkiIHJvIiA6ICIiKTsKKwlkcHJpbnRrKCIgICAgICBvd25lciAlZC8lZCB1c2VyICVkLyVkXG4iLAorCQlpbm9kZS0+aV91aWQsIGlub2RlLT5pX2dpZCwgY3VycmVudC0+ZnN1aWQsIGN1cnJlbnQtPmZzZ2lkKTsKKyNlbmRpZgorCisJLyogTm9ybWFsbHkgd2UgcmVqZWN0IGFueSB3cml0ZS9zYXR0ciBldGMgYWNjZXNzIG9uIGEgcmVhZC1vbmx5IGZpbGUKKwkgKiBzeXN0ZW0uICBCdXQgaWYgaXQgaXMgSVJJWCBkb2luZyBjaGVjayBvbiB3cml0ZS1hY2Nlc3MgZm9yIGEgCisJICogZGV2aWNlIHNwZWNpYWwgZmlsZSwgd2UgaWdub3JlIHJvZnMuCisJICovCisJaWYgKCEoYWNjICYgTUFZX0xPQ0FMX0FDQ0VTUykpCisJCWlmIChhY2MgJiAoTUFZX1dSSVRFIHwgTUFZX1NBVFRSIHwgTUFZX1RSVU5DKSkgeworCQkJaWYgKEVYX1JET05MWShleHApIHx8IElTX1JET05MWShpbm9kZSkpCisJCQkJcmV0dXJuIG5mc2Vycl9yb2ZzOworCQkJaWYgKC8qIChhY2MgJiBNQVlfV1JJVEUpICYmICovIElTX0lNTVVUQUJMRShpbm9kZSkpCisJCQkJcmV0dXJuIG5mc2Vycl9wZXJtOworCQl9CisJaWYgKChhY2MgJiBNQVlfVFJVTkMpICYmIElTX0FQUEVORChpbm9kZSkpCisJCXJldHVybiBuZnNlcnJfcGVybTsKKworCWlmIChhY2MgJiBNQVlfTE9DSykgeworCQkvKiBJZiB3ZSBjYW5ub3QgcmVseSBvbiBhdXRoZW50aWNhdGlvbiBpbiBOTE0gcmVxdWVzdHMsCisJCSAqIGp1c3QgYWxsb3cgbG9ja3MsIG90aGVyd2lzZSByZXF1aXJlIHJlYWQgcGVybWlzc2lvbiwgb3IKKwkJICogb3duZXJzaGlwCisJCSAqLworCQlpZiAoZXhwLT5leF9mbGFncyAmIE5GU0VYUF9OT0FVVEhOTE0pCisJCQlyZXR1cm4gMDsKKwkJZWxzZQorCQkJYWNjID0gTUFZX1JFQUQgfCBNQVlfT1dORVJfT1ZFUlJJREU7CisJfQorCS8qCisJICogVGhlIGZpbGUgb3duZXIgYWx3YXlzIGdldHMgYWNjZXNzIHBlcm1pc3Npb24gZm9yIGFjY2Vzc2VzIHRoYXQKKwkgKiB3b3VsZCBub3JtYWxseSBiZSBjaGVja2VkIGF0IG9wZW4gdGltZS4gVGhpcyBpcyB0byBtYWtlCisJICogZmlsZSBhY2Nlc3Mgd29yayBldmVuIHdoZW4gdGhlIGNsaWVudCBoYXMgZG9uZSBhIGZjaG1vZChmZCwgMCkuCisJICoKKwkgKiBIb3dldmVyLCBgY3AgZm9vIGJhcicgc2hvdWxkIGZhaWwgbmV2ZXJ0aGVsZXNzIHdoZW4gYmFyIGlzCisJICogcmVhZG9ubHkuIEEgc2Vuc2libGUgd2F5IHRvIGRvIHRoaXMgbWlnaHQgYmUgdG8gcmVqZWN0IGFsbAorCSAqIGF0dGVtcHRzIHRvIHRydW5jYXRlIGEgcmVhZC1vbmx5IGZpbGUsIGJlY2F1c2UgYSBjcmVhdCgpIGNhbGwKKwkgKiBhbHdheXMgaW1wbGllcyBmaWxlIHRydW5jYXRpb24uCisJICogLi4uIGJ1dCB0aGlzIGlzbid0IHJlYWxseSBmYWlyLiAgQSBwcm9jZXNzIG1heSByZWFzb25hYmx5IGNhbGwKKwkgKiBmdHJ1bmNhdGUgb24gYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3Igb24gYSBmaWxlIHdpdGggcGVybSAwMDAuCisJICogV2UgbXVzdCB0cnVzdCB0aGUgY2xpZW50IHRvIGRvIHBlcm1pc3Npb24gY2hlY2tpbmcgLSB1c2luZyAiQUNDRVNTIgorCSAqIHdpdGggTkZTdjMuCisJICovCisJaWYgKChhY2MgJiBNQVlfT1dORVJfT1ZFUlJJREUpICYmCisJICAgIGlub2RlLT5pX3VpZCA9PSBjdXJyZW50LT5mc3VpZCkKKwkJcmV0dXJuIDA7CisKKwllcnIgPSBwZXJtaXNzaW9uKGlub2RlLCBhY2MgJiAoTUFZX1JFQUR8TUFZX1dSSVRFfE1BWV9FWEVDKSwgTlVMTCk7CisKKwkvKiBBbGxvdyByZWFkIGFjY2VzcyB0byBiaW5hcmllcyBldmVuIHdoZW4gbW9kZSAxMTEgKi8KKwlpZiAoZXJyID09IC1FQUNDRVMgJiYgU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJgorCSAgICBhY2MgPT0gKE1BWV9SRUFEIHwgTUFZX09XTkVSX09WRVJSSURFKSkKKwkJZXJyID0gcGVybWlzc2lvbihpbm9kZSwgTUFZX0VYRUMsIE5VTEwpOworCisJcmV0dXJuIGVycj8gbmZzZXJybm8oZXJyKSA6IDA7Cit9CisKK3ZvaWQKK25mc2RfcmFjYWNoZV9zaHV0ZG93bih2b2lkKQoreworCWlmICghcmFwYXJtX2NhY2hlKQorCQlyZXR1cm47CisJZHByaW50aygibmZzZDogZnJlZWluZyByZWFkYWhlYWQgYnVmZmVycy5cbiIpOworCWtmcmVlKHJhcGFybWwpOworCXJhcGFybV9jYWNoZSA9IHJhcGFybWwgPSBOVUxMOworfQorLyoKKyAqIEluaXRpYWxpemUgcmVhZGFoZWFkIHBhcmFtIGNhY2hlCisgKi8KK2ludAorbmZzZF9yYWNhY2hlX2luaXQoaW50IGNhY2hlX3NpemUpCit7CisJaW50CWk7CisKKwlpZiAocmFwYXJtX2NhY2hlKQorCQlyZXR1cm4gMDsKKwlyYXBhcm1sID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJhcGFybXMpICogY2FjaGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAocmFwYXJtbCAhPSBOVUxMKSB7CisJCWRwcmludGsoIm5mc2Q6IGFsbG9jYXRpbmcgJWQgcmVhZGFoZWFkIGJ1ZmZlcnMuXG4iLAorCQkJY2FjaGVfc2l6ZSk7CisJCW1lbXNldChyYXBhcm1sLCAwLCBzaXplb2Yoc3RydWN0IHJhcGFybXMpICogY2FjaGVfc2l6ZSk7CisJCWZvciAoaSA9IDA7IGkgPCBjYWNoZV9zaXplIC0gMTsgaSsrKSB7CisJCQlyYXBhcm1sW2ldLnBfbmV4dCA9IHJhcGFybWwgKyBpICsgMTsKKwkJfQorCQlyYXBhcm1fY2FjaGUgPSByYXBhcm1sOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJuZnNkOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IHJlYWQtYWhlYWQgY2FjaGUuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW5mc2RzdGF0cy5yYV9zaXplID0gY2FjaGVfc2l6ZTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL25scy9LY29uZmlnIGIvZnMvbmxzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiOGYwMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9LY29uZmlnCkBAIC0wLDAgKzEsNTA0IEBACisjCisjIE5hdGl2ZSBsYW5ndWFnZSBzdXBwb3J0IGNvbmZpZ3VyYXRpb24KKyMKKworbWVudSAiTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCisKK2NvbmZpZyBOTFMKKwl0cmlzdGF0ZSAiQmFzZSBuYXRpdmUgbGFuZ3VhZ2Ugc3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBUaGUgYmFzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydC4gQSBudW1iZXIgb2YgZmlsZXN5c3RlbXMKKwkgIGRlcGVuZCBvbiBpdCAoZS5nLiBGQVQsIEpPTElFVCwgTlQsIEJFT1MgZmlsZXN5c3RlbXMpLCBhcyB3ZWxsCisJICBhcyB0aGUgYWJpbGl0eSBvZiBzb21lIGZpbGVzeXN0ZW1zIHRvIHVzZSBuYXRpdmUgbGFuZ3VhZ2VzCisJICAoTkNQLCBTTUIpLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbmxzX2Jhc2UuCisKK2NvbmZpZyBOTFNfREVGQVVMVAorCXN0cmluZyAiRGVmYXVsdCBOTFMgT3B0aW9uIgorCWRlcGVuZHMgb24gTkxTCisJZGVmYXVsdCAiaXNvODg1OS0xIgorCS0tLWhlbHAtLS0KKwkgIFRoZSBkZWZhdWx0IE5MUyB1c2VkIHdoZW4gbW91bnRpbmcgZmlsZSBzeXN0ZW0uIE5vdGUsIHRoYXQgdGhpcyBpcworCSAgdGhlIE5MUyB1c2VkIGJ5IHlvdXIgY29uc29sZSwgbm90IHRoZSBOTFMgdXNlZCBieSBhIHNwZWNpZmljIGZpbGUKKwkgIHN5c3RlbSAoaWYgZGlmZmVyZW50KSB0byBzdG9yZSBkYXRhIChmaWxlbmFtZXMpIG9uIGEgZGlzay4KKwkgIEN1cnJlbnRseSwgdGhlIHZhbGlkIHZhbHVlcyBhcmU6CisJICBiaWc1LCBjcDQzNywgY3A3MzcsIGNwNzc1LCBjcDg1MCwgY3A4NTIsIGNwODU1LCBjcDg1NywgY3A4NjAsIGNwODYxLAorCSAgY3A4NjIsIGNwODYzLCBjcDg2NCwgY3A4NjUsIGNwODY2LCBjcDg2OSwgY3A4NzQsIGNwOTMyLCBjcDkzNiwKKwkgIGNwOTQ5LCBjcDk1MCwgY3AxMjUxLCBjcDEyNTUsIGV1Yy1qcCwgZXVjLWtyLCBnYjIzMTIsIGlzbzg4NTktMSwKKwkgIGlzbzg4NTktMiwgaXNvODg1OS0zLCBpc284ODU5LTQsIGlzbzg4NTktNSwgaXNvODg1OS02LCBpc284ODU5LTcsCisJICBpc284ODU5LTgsIGlzbzg4NTktOSwgaXNvODg1OS0xMywgaXNvODg1OS0xNCwgaXNvODg1OS0xNSwKKwkgIGtvaTgtciwga29pOC1ydSwga29pOC11LCBzamlzLCB0aXMtNjIwLCB1dGY4LgorCSAgSWYgeW91IHNwZWNpZnkgYSB3cm9uZyB2YWx1ZSwgaXQgd2lsbCB1c2UgdGhlIGJ1aWx0LWluIE5MUzsKKwkgIGNvbXBhdGlibGUgd2l0aCBpc284ODU5LTEuCisKKwkgIElmIHVuc3VyZSwgc3BlY2lmeSBpdCBhcyAiaXNvODg1OS0xIi4KKworY29uZmlnIE5MU19DT0RFUEFHRV80MzcKKwl0cmlzdGF0ZSAiQ29kZXBhZ2UgNDM3IChVbml0ZWQgU3RhdGVzLCBDYW5hZGEpIgorCWRlcGVuZHMgb24gTkxTCisJaGVscAorCSAgVGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IGNhbiBkZWFsIHdpdGggZmlsZW5hbWVzIGluCisJICBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVyIHNldHMuIFRoZXNlIGNoYXJhY3RlciBzZXRzIGFyZSBzdG9yZWQKKwkgIGluIHNvLWNhbGxlZCBET1MgY29kZXBhZ2VzLiBZb3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgY29kZXBhZ2UgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byByZWFkL3dyaXRlIHRoZXNlIGZpbGVuYW1lcyBvbgorCSAgRE9TL1dpbmRvd3MgcGFydGl0aW9ucyBjb3JyZWN0bHkuIFRoaXMgZG9lcyBhcHBseSB0byB0aGUgZmlsZW5hbWVzCisJICBvbmx5LCBub3QgdG8gdGhlIGZpbGUgY29udGVudHMuIFlvdSBjYW4gaW5jbHVkZSBzZXZlcmFsIGNvZGVwYWdlczsKKwkgIHNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSB0aGUgRE9TIGNvZGVwYWdlIHRoYXQgaXMgdXNlZCBpbgorCSAgdGhlIFVuaXRlZCBTdGF0ZXMgYW5kIHBhcnRzIG9mIENhbmFkYS4gVGhpcyBpcyByZWNvbW1lbmRlZC4KKworY29uZmlnIE5MU19DT0RFUEFHRV83MzcKKwl0cmlzdGF0ZSAiQ29kZXBhZ2UgNzM3IChHcmVlaykiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBUaGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgY2FuIGRlYWwgd2l0aCBmaWxlbmFtZXMgaW4KKwkgIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXIgc2V0cy4gVGhlc2UgY2hhcmFjdGVyIHNldHMgYXJlIHN0b3JlZAorCSAgaW4gc28tY2FsbGVkIERPUyBjb2RlcGFnZXMuIFlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBjb2RlcGFnZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQvd3JpdGUgdGhlc2UgZmlsZW5hbWVzIG9uCisJICBET1MvV2luZG93cyBwYXJ0aXRpb25zIGNvcnJlY3RseS4gVGhpcyBkb2VzIGFwcGx5IHRvIHRoZSBmaWxlbmFtZXMKKwkgIG9ubHksIG5vdCB0byB0aGUgZmlsZSBjb250ZW50cy4gWW91IGNhbiBpbmNsdWRlIHNldmVyYWwgY29kZXBhZ2VzOworCSAgc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBET1MgY29kZXBhZ2UgdGhhdCBpcyB1c2VkIGZvcgorCSAgR3JlZWsuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBOTFNfQ09ERVBBR0VfNzc1CisJdHJpc3RhdGUgIkNvZGVwYWdlIDc3NSAoQmFsdGljIFJpbSkiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBUaGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgY2FuIGRlYWwgd2l0aCBmaWxlbmFtZXMgaW4KKwkgIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXIgc2V0cy4gVGhlc2UgY2hhcmFjdGVyIHNldHMgYXJlIHN0b3JlZAorCSAgaW4gc28tY2FsbGVkIERPUyBjb2RlcGFnZXMuIFlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBjb2RlcGFnZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQvd3JpdGUgdGhlc2UgZmlsZW5hbWVzIG9uCisJICBET1MvV2luZG93cyBwYXJ0aXRpb25zIGNvcnJlY3RseS4gVGhpcyBkb2VzIGFwcGx5IHRvIHRoZSBmaWxlbmFtZXMKKwkgIG9ubHksIG5vdCB0byB0aGUgZmlsZSBjb250ZW50cy4gWW91IGNhbiBpbmNsdWRlIHNldmVyYWwgY29kZXBhZ2VzOworCSAgc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBET1MgY29kZXBhZ2UgdGhhdCBpcyB1c2VkCisJICBmb3IgdGhlIEJhbHRpYyBSaW0gTGFuZ3VhZ2VzIChMYXR2aWFuIGFuZCBMaXRodWFuaWFuKS4gSWYgdW5zdXJlLAorCSAgc2F5IE4uCisKK2NvbmZpZyBOTFNfQ09ERVBBR0VfODUwCisJdHJpc3RhdGUgIkNvZGVwYWdlIDg1MCAoRXVyb3BlKSIKKwlkZXBlbmRzIG9uIE5MUworCS0tLWhlbHAtLS0KKwkgIFRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBjYW4gZGVhbCB3aXRoIGZpbGVuYW1lcyBpbgorCSAgbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlciBzZXRzLiBUaGVzZSBjaGFyYWN0ZXIgc2V0cyBhcmUgc3RvcmVkIGluCisJICBzby1jYWxsZWQgRE9TIGNvZGVwYWdlcy4gWW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGNvZGVwYWdlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcmVhZC93cml0ZSB0aGVzZSBmaWxlbmFtZXMgb24KKwkgIERPUy9XaW5kb3dzIHBhcnRpdGlvbnMgY29ycmVjdGx5LiBUaGlzIGRvZXMgYXBwbHkgdG8gdGhlIGZpbGVuYW1lcworCSAgb25seSwgbm90IHRvIHRoZSBmaWxlIGNvbnRlbnRzLiBZb3UgY2FuIGluY2x1ZGUgc2V2ZXJhbCBjb2RlcGFnZXM7CisJICBzYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIERPUyBjb2RlcGFnZSB0aGF0IGlzIHVzZWQgZm9yCisJICBtdWNoIG9mIEV1cm9wZSAtLSBVbml0ZWQgS2luZ2RvbSwgR2VybWFueSwgU3BhaW4sIEl0YWx5LCBhbmQgW2FkZAorCSAgbW9yZSBjb3VudHJpZXMgaGVyZV0uIEl0IGhhcyBzb21lIGNoYXJhY3RlcnMgdXNlZnVsIHRvIG1hbnkgRXVyb3BlYW4KKwkgIGxhbmd1YWdlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgVVMgY29kZXBhZ2UgNDM3LgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgTkxTX0NPREVQQUdFXzg1MgorCXRyaXN0YXRlICJDb2RlcGFnZSA4NTIgKENlbnRyYWwvRWFzdGVybiBFdXJvcGUpIgorCWRlcGVuZHMgb24gTkxTCisJLS0taGVscC0tLQorCSAgVGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IGNhbiBkZWFsIHdpdGggZmlsZW5hbWVzIGluCisJICBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVyIHNldHMuIFRoZXNlIGNoYXJhY3RlciBzZXRzIGFyZSBzdG9yZWQgaW4KKwkgIHNvLWNhbGxlZCBET1MgY29kZXBhZ2VzLiBZb3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgY29kZXBhZ2UgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byByZWFkL3dyaXRlIHRoZXNlIGZpbGVuYW1lcyBvbgorCSAgRE9TL1dpbmRvd3MgcGFydGl0aW9ucyBjb3JyZWN0bHkuIFRoaXMgZG9lcyBhcHBseSB0byB0aGUgZmlsZW5hbWVzCisJICBvbmx5LCBub3QgdG8gdGhlIGZpbGUgY29udGVudHMuIFlvdSBjYW4gaW5jbHVkZSBzZXZlcmFsIGNvZGVwYWdlczsKKwkgIHNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSB0aGUgTGF0aW4gMiBjb2RlcGFnZSB1c2VkIGJ5IERPUworCSAgZm9yIG11Y2ggb2YgQ2VudHJhbCBhbmQgRWFzdGVybiBFdXJvcGUuIEl0IGhhcyBhbGwgdGhlIHJlcXVpcmVkCisJICBjaGFyYWN0ZXJzIGZvciB0aGVzZSBsYW5ndWFnZXM6IEFsYmFuaWFuLCBDcm9hdGlhbiwgQ3plY2gsIEVuZ2xpc2gsCisJICBGaW5uaXNoLCBIdW5nYXJpYW4sIElyaXNoLCBHZXJtYW4sIFBvbGlzaCwgUm9tYW5pYW4sIFNlcmJpYW4gKExhdGluCisJICB0cmFuc2NyaXB0aW9uKSwgU2xvdmFrLCBTbG92ZW5pYW4sIGFuZCBTb3JiaWFuLgorCitjb25maWcgTkxTX0NPREVQQUdFXzg1NQorCXRyaXN0YXRlICJDb2RlcGFnZSA4NTUgKEN5cmlsbGljKSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIFRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBjYW4gZGVhbCB3aXRoIGZpbGVuYW1lcyBpbgorCSAgbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlciBzZXRzLiBUaGVzZSBjaGFyYWN0ZXIgc2V0cyBhcmUgc3RvcmVkIGluCisJICBzby1jYWxsZWQgRE9TIGNvZGVwYWdlcy4gWW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGNvZGVwYWdlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcmVhZC93cml0ZSB0aGVzZSBmaWxlbmFtZXMgb24KKwkgIERPUy9XaW5kb3dzIHBhcnRpdGlvbnMgY29ycmVjdGx5LiBUaGlzIGRvZXMgYXBwbHkgdG8gdGhlIGZpbGVuYW1lcworCSAgb25seSwgbm90IHRvIHRoZSBmaWxlIGNvbnRlbnRzLiBZb3UgY2FuIGluY2x1ZGUgc2V2ZXJhbCBjb2RlcGFnZXM7CisJICBzYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIERPUyBjb2RlcGFnZSBmb3IgQ3lyaWxsaWMuCisKK2NvbmZpZyBOTFNfQ09ERVBBR0VfODU3CisJdHJpc3RhdGUgIkNvZGVwYWdlIDg1NyAoVHVya2lzaCkiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBUaGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgY2FuIGRlYWwgd2l0aCBmaWxlbmFtZXMgaW4KKwkgIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXIgc2V0cy4gVGhlc2UgY2hhcmFjdGVyIHNldHMgYXJlIHN0b3JlZCBpbgorCSAgc28tY2FsbGVkIERPUyBjb2RlcGFnZXMuIFlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBjb2RlcGFnZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQvd3JpdGUgdGhlc2UgZmlsZW5hbWVzIG9uCisJICBET1MvV2luZG93cyBwYXJ0aXRpb25zIGNvcnJlY3RseS4gVGhpcyBkb2VzIGFwcGx5IHRvIHRoZSBmaWxlbmFtZXMKKwkgIG9ubHksIG5vdCB0byB0aGUgZmlsZSBjb250ZW50cy4gWW91IGNhbiBpbmNsdWRlIHNldmVyYWwgY29kZXBhZ2VzOworCSAgc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBET1MgY29kZXBhZ2UgZm9yIFR1cmtpc2guCisKK2NvbmZpZyBOTFNfQ09ERVBBR0VfODYwCisJdHJpc3RhdGUgIkNvZGVwYWdlIDg2MCAoUG9ydHVndWVzZSkiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBUaGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgY2FuIGRlYWwgd2l0aCBmaWxlbmFtZXMgaW4KKwkgIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXIgc2V0cy4gVGhlc2UgY2hhcmFjdGVyIHNldHMgYXJlIHN0b3JlZCBpbgorCSAgc28tY2FsbGVkIERPUyBjb2RlcGFnZXMuIFlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBjb2RlcGFnZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQvd3JpdGUgdGhlc2UgZmlsZW5hbWVzIG9uCisJICBET1MvV2luZG93cyBwYXJ0aXRpb25zIGNvcnJlY3RseS4gVGhpcyBkb2VzIGFwcGx5IHRvIHRoZSBmaWxlbmFtZXMKKwkgIG9ubHksIG5vdCB0byB0aGUgZmlsZSBjb250ZW50cy4gWW91IGNhbiBpbmNsdWRlIHNldmVyYWwgY29kZXBhZ2VzOworCSAgc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBET1MgY29kZXBhZ2UgZm9yIFBvcnR1Z3Vlc2UuCisKK2NvbmZpZyBOTFNfQ09ERVBBR0VfODYxCisJdHJpc3RhdGUgIkNvZGVwYWdlIDg2MSAoSWNlbGFuZGljKSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIFRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBjYW4gZGVhbCB3aXRoIGZpbGVuYW1lcyBpbgorCSAgbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlciBzZXRzLiBUaGVzZSBjaGFyYWN0ZXIgc2V0cyBhcmUgc3RvcmVkIGluCisJICBzby1jYWxsZWQgRE9TIGNvZGVwYWdlcy4gWW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGNvZGVwYWdlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcmVhZC93cml0ZSB0aGVzZSBmaWxlbmFtZXMgb24KKwkgIERPUy9XaW5kb3dzIHBhcnRpdGlvbnMgY29ycmVjdGx5LiBUaGlzIGRvZXMgYXBwbHkgdG8gdGhlIGZpbGVuYW1lcworCSAgb25seSwgbm90IHRvIHRoZSBmaWxlIGNvbnRlbnRzLiBZb3UgY2FuIGluY2x1ZGUgc2V2ZXJhbCBjb2RlcGFnZXM7CisJICBzYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIERPUyBjb2RlcGFnZSBmb3IgSWNlbGFuZGljLgorCitjb25maWcgTkxTX0NPREVQQUdFXzg2MgorCXRyaXN0YXRlICJDb2RlcGFnZSA4NjIgKEhlYnJldykiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBUaGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgY2FuIGRlYWwgd2l0aCBmaWxlbmFtZXMgaW4KKwkgIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXIgc2V0cy4gVGhlc2UgY2hhcmFjdGVyIHNldHMgYXJlIHN0b3JlZCBpbgorCSAgc28tY2FsbGVkIERPUyBjb2RlcGFnZXMuIFlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBjb2RlcGFnZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQvd3JpdGUgdGhlc2UgZmlsZW5hbWVzIG9uCisJICBET1MvV2luZG93cyBwYXJ0aXRpb25zIGNvcnJlY3RseS4gVGhpcyBkb2VzIGFwcGx5IHRvIHRoZSBmaWxlbmFtZXMKKwkgIG9ubHksIG5vdCB0byB0aGUgZmlsZSBjb250ZW50cy4gWW91IGNhbiBpbmNsdWRlIHNldmVyYWwgY29kZXBhZ2VzOworCSAgc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBET1MgY29kZXBhZ2UgZm9yIEhlYnJldy4KKworY29uZmlnIE5MU19DT0RFUEFHRV84NjMKKwl0cmlzdGF0ZSAiQ29kZXBhZ2UgODYzIChDYW5hZGlhbiBGcmVuY2gpIgorCWRlcGVuZHMgb24gTkxTCisJaGVscAorCSAgVGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IGNhbiBkZWFsIHdpdGggZmlsZW5hbWVzIGluCisJICBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVyIHNldHMuIFRoZXNlIGNoYXJhY3RlciBzZXRzIGFyZSBzdG9yZWQgaW4KKwkgIHNvLWNhbGxlZCBET1MgY29kZXBhZ2VzLiBZb3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgY29kZXBhZ2UgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byByZWFkL3dyaXRlIHRoZXNlIGZpbGVuYW1lcyBvbgorCSAgRE9TL1dpbmRvd3MgcGFydGl0aW9ucyBjb3JyZWN0bHkuIFRoaXMgZG9lcyBhcHBseSB0byB0aGUgZmlsZW5hbWVzCisJICBvbmx5LCBub3QgdG8gdGhlIGZpbGUgY29udGVudHMuIFlvdSBjYW4gaW5jbHVkZSBzZXZlcmFsIGNvZGVwYWdlczsKKwkgIHNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSB0aGUgRE9TIGNvZGVwYWdlIGZvciBDYW5hZGlhbgorCSAgRnJlbmNoLgorCitjb25maWcgTkxTX0NPREVQQUdFXzg2NAorCXRyaXN0YXRlICJDb2RlcGFnZSA4NjQgKEFyYWJpYykiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBUaGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgY2FuIGRlYWwgd2l0aCBmaWxlbmFtZXMgaW4KKwkgIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXIgc2V0cy4gVGhlc2UgY2hhcmFjdGVyIHNldHMgYXJlIHN0b3JlZCBpbgorCSAgc28tY2FsbGVkIERPUyBjb2RlcGFnZXMuIFlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBjb2RlcGFnZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQvd3JpdGUgdGhlc2UgZmlsZW5hbWVzIG9uCisJICBET1MvV2luZG93cyBwYXJ0aXRpb25zIGNvcnJlY3RseS4gVGhpcyBkb2VzIGFwcGx5IHRvIHRoZSBmaWxlbmFtZXMKKwkgIG9ubHksIG5vdCB0byB0aGUgZmlsZSBjb250ZW50cy4gWW91IGNhbiBpbmNsdWRlIHNldmVyYWwgY29kZXBhZ2VzOworCSAgc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBET1MgY29kZXBhZ2UgZm9yIEFyYWJpYy4KKworY29uZmlnIE5MU19DT0RFUEFHRV84NjUKKwl0cmlzdGF0ZSAiQ29kZXBhZ2UgODY1IChOb3J3ZWdpYW4sIERhbmlzaCkiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBUaGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgY2FuIGRlYWwgd2l0aCBmaWxlbmFtZXMgaW4KKwkgIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXIgc2V0cy4gVGhlc2UgY2hhcmFjdGVyIHNldHMgYXJlIHN0b3JlZCBpbgorCSAgc28tY2FsbGVkIERPUyBjb2RlcGFnZXMuIFlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBjb2RlcGFnZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQvd3JpdGUgdGhlc2UgZmlsZW5hbWVzIG9uCisJICBET1MvV2luZG93cyBwYXJ0aXRpb25zIGNvcnJlY3RseS4gVGhpcyBkb2VzIGFwcGx5IHRvIHRoZSBmaWxlbmFtZXMKKwkgIG9ubHksIG5vdCB0byB0aGUgZmlsZSBjb250ZW50cy4gWW91IGNhbiBpbmNsdWRlIHNldmVyYWwgY29kZXBhZ2VzOworCSAgc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBET1MgY29kZXBhZ2UgZm9yIHRoZSBOb3JkaWMKKwkgIEV1cm9wZWFuIGNvdW50cmllcy4KKworY29uZmlnIE5MU19DT0RFUEFHRV84NjYKKwl0cmlzdGF0ZSAiQ29kZXBhZ2UgODY2IChDeXJpbGxpYy9SdXNzaWFuKSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIFRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBjYW4gZGVhbCB3aXRoIGZpbGVuYW1lcyBpbgorCSAgbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlciBzZXRzLiBUaGVzZSBjaGFyYWN0ZXIgc2V0cyBhcmUgc3RvcmVkIGluCisJICBzby1jYWxsZWQgRE9TIGNvZGVwYWdlcy4gWW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGNvZGVwYWdlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcmVhZC93cml0ZSB0aGVzZSBmaWxlbmFtZXMgb24KKwkgIERPUy9XaW5kb3dzIHBhcnRpdGlvbnMgY29ycmVjdGx5LiBUaGlzIGRvZXMgYXBwbHkgdG8gdGhlIGZpbGVuYW1lcworCSAgb25seSwgbm90IHRvIHRoZSBmaWxlIGNvbnRlbnRzLiBZb3UgY2FuIGluY2x1ZGUgc2V2ZXJhbCBjb2RlcGFnZXM7CisJICBzYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIERPUyBjb2RlcGFnZSBmb3IKKwkgIEN5cmlsbGljL1J1c3NpYW4uCisKK2NvbmZpZyBOTFNfQ09ERVBBR0VfODY5CisJdHJpc3RhdGUgIkNvZGVwYWdlIDg2OSAoR3JlZWspIgorCWRlcGVuZHMgb24gTkxTCisJaGVscAorCSAgVGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IGNhbiBkZWFsIHdpdGggZmlsZW5hbWVzIGluCisJICBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVyIHNldHMuIFRoZXNlIGNoYXJhY3RlciBzZXRzIGFyZSBzdG9yZWQgaW4KKwkgIHNvLWNhbGxlZCBET1MgY29kZXBhZ2VzLiBZb3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgY29kZXBhZ2UgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byByZWFkL3dyaXRlIHRoZXNlIGZpbGVuYW1lcyBvbgorCSAgRE9TL1dpbmRvd3MgcGFydGl0aW9ucyBjb3JyZWN0bHkuIFRoaXMgZG9lcyBhcHBseSB0byB0aGUgZmlsZW5hbWVzCisJICBvbmx5LCBub3QgdG8gdGhlIGZpbGUgY29udGVudHMuIFlvdSBjYW4gaW5jbHVkZSBzZXZlcmFsIGNvZGVwYWdlczsKKwkgIHNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSB0aGUgRE9TIGNvZGVwYWdlIGZvciBHcmVlay4KKworY29uZmlnIE5MU19DT0RFUEFHRV85MzYKKwl0cmlzdGF0ZSAiU2ltcGxpZmllZCBDaGluZXNlIGNoYXJzZXQgKENQOTM2LCBHQjIzMTIpIgorCWRlcGVuZHMgb24gTkxTCisJaGVscAorCSAgVGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IGNhbiBkZWFsIHdpdGggZmlsZW5hbWVzIGluCisJICBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVyIHNldHMuIFRoZXNlIGNoYXJhY3RlciBzZXRzIGFyZSBzdG9yZWQgaW4KKwkgIHNvLWNhbGxlZCBET1MgY29kZXBhZ2VzLiBZb3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgY29kZXBhZ2UgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byByZWFkL3dyaXRlIHRoZXNlIGZpbGVuYW1lcyBvbgorCSAgRE9TL1dpbmRvd3MgcGFydGl0aW9ucyBjb3JyZWN0bHkuIFRoaXMgZG9lcyBhcHBseSB0byB0aGUgZmlsZW5hbWVzCisJICBvbmx5LCBub3QgdG8gdGhlIGZpbGUgY29udGVudHMuIFlvdSBjYW4gaW5jbHVkZSBzZXZlcmFsIGNvZGVwYWdlczsKKwkgIHNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSB0aGUgRE9TIGNvZGVwYWdlIGZvciBTaW1wbGlmaWVkCisJICBDaGluZXNlKEdCSykuCisKK2NvbmZpZyBOTFNfQ09ERVBBR0VfOTUwCisJdHJpc3RhdGUgIlRyYWRpdGlvbmFsIENoaW5lc2UgY2hhcnNldCAoQmlnNSkiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBUaGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgY2FuIGRlYWwgd2l0aCBmaWxlbmFtZXMgaW4KKwkgIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXIgc2V0cy4gVGhlc2UgY2hhcmFjdGVyIHNldHMgYXJlIHN0b3JlZCBpbgorCSAgc28tY2FsbGVkIERPUyBjb2RlcGFnZXMuIFlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBjb2RlcGFnZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQvd3JpdGUgdGhlc2UgZmlsZW5hbWVzIG9uCisJICBET1MvV2luZG93cyBwYXJ0aXRpb25zIGNvcnJlY3RseS4gVGhpcyBkb2VzIGFwcGx5IHRvIHRoZSBmaWxlbmFtZXMKKwkgIG9ubHksIG5vdCB0byB0aGUgZmlsZSBjb250ZW50cy4gWW91IGNhbiBpbmNsdWRlIHNldmVyYWwgY29kZXBhZ2VzOworCSAgc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBET1MgY29kZXBhZ2UgZm9yIFRyYWRpdGlvbmFsCisJICBDaGluZXNlKEJpZzUpLgorCitjb25maWcgTkxTX0NPREVQQUdFXzkzMgorCXRyaXN0YXRlICJKYXBhbmVzZSBjaGFyc2V0cyAoU2hpZnQtSklTLCBFVUMtSlApIgorCWRlcGVuZHMgb24gTkxTCisJaGVscAorCSAgVGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IGNhbiBkZWFsIHdpdGggZmlsZW5hbWVzIGluCisJICBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVyIHNldHMuIFRoZXNlIGNoYXJhY3RlciBzZXRzIGFyZSBzdG9yZWQgaW4KKwkgIHNvLWNhbGxlZCBET1MgY29kZXBhZ2VzLiBZb3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgY29kZXBhZ2UgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byByZWFkL3dyaXRlIHRoZXNlIGZpbGVuYW1lcyBvbgorCSAgRE9TL1dpbmRvd3MgcGFydGl0aW9ucyBjb3JyZWN0bHkuIFRoaXMgZG9lcyBhcHBseSB0byB0aGUgZmlsZW5hbWVzCisJICBvbmx5LCBub3QgdG8gdGhlIGZpbGUgY29udGVudHMuIFlvdSBjYW4gaW5jbHVkZSBzZXZlcmFsIGNvZGVwYWdlczsKKwkgIHNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSB0aGUgRE9TIGNvZGVwYWdlIGZvciBTaGlmdC1KSVMKKwkgIG9yIEVVQy1KUC4gVG8gdXNlIEVVQy1KUCwgeW91IGNhbiB1c2UgJ2V1Yy1qcCcgYXMgbW91bnQgb3B0aW9uIG9yCisJICBOTFMgRGVmYXVsdCB2YWx1ZSBkdXJpbmcga2VybmVsIGNvbmZpZ3VyYXRpb24sIGluc3RlYWQgb2YgJ2NwOTMyJy4KKworY29uZmlnIE5MU19DT0RFUEFHRV85NDkKKwl0cmlzdGF0ZSAiS29yZWFuIGNoYXJzZXQgKENQOTQ5LCBFVUMtS1IpIgorCWRlcGVuZHMgb24gTkxTCisJaGVscAorCSAgVGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IGNhbiBkZWFsIHdpdGggZmlsZW5hbWVzIGluCisJICBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVyIHNldHMuIFRoZXNlIGNoYXJhY3RlciBzZXRzIGFyZSBzdG9yZWQgaW4KKwkgIHNvLWNhbGxlZCBET1MgY29kZXBhZ2VzLiBZb3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgY29kZXBhZ2UgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byByZWFkL3dyaXRlIHRoZXNlIGZpbGVuYW1lcyBvbgorCSAgRE9TL1dpbmRvd3MgcGFydGl0aW9ucyBjb3JyZWN0bHkuIFRoaXMgZG9lcyBhcHBseSB0byB0aGUgZmlsZW5hbWVzCisJICBvbmx5LCBub3QgdG8gdGhlIGZpbGUgY29udGVudHMuIFlvdSBjYW4gaW5jbHVkZSBzZXZlcmFsIGNvZGVwYWdlczsKKwkgIHNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSB0aGUgRE9TIGNvZGVwYWdlIGZvciBVSEMuCisKK2NvbmZpZyBOTFNfQ09ERVBBR0VfODc0CisJdHJpc3RhdGUgIlRoYWkgY2hhcnNldCAoQ1A4NzQsIFRJUy02MjApIgorCWRlcGVuZHMgb24gTkxTCisJaGVscAorCSAgVGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IGNhbiBkZWFsIHdpdGggZmlsZW5hbWVzIGluCisJICBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVyIHNldHMuIFRoZXNlIGNoYXJhY3RlciBzZXRzIGFyZSBzdG9yZWQgaW4KKwkgIHNvLWNhbGxlZCBET1MgY29kZXBhZ2VzLiBZb3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgY29kZXBhZ2UgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byByZWFkL3dyaXRlIHRoZXNlIGZpbGVuYW1lcyBvbgorCSAgRE9TL1dpbmRvd3MgcGFydGl0aW9ucyBjb3JyZWN0bHkuIFRoaXMgZG9lcyBhcHBseSB0byB0aGUgZmlsZW5hbWVzCisJICBvbmx5LCBub3QgdG8gdGhlIGZpbGUgY29udGVudHMuIFlvdSBjYW4gaW5jbHVkZSBzZXZlcmFsIGNvZGVwYWdlczsKKwkgIHNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSB0aGUgRE9TIGNvZGVwYWdlIGZvciBUaGFpLgorCitjb25maWcgTkxTX0lTTzg4NTlfOAorCXRyaXN0YXRlICJIZWJyZXcgY2hhcnNldHMgKElTTy04ODU5LTgsIENQMTI1NSkiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBJZiB5b3Ugd2FudCB0byBkaXNwbGF5IGZpbGVuYW1lcyB3aXRoIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXJzCisJICBmcm9tIHRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBvciBmcm9tIEpPTElFVCBDRC1ST01zCisJICBjb3JyZWN0bHkgb24gdGhlIHNjcmVlbiwgeW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGlucHV0L291dHB1dCBjaGFyYWN0ZXIgc2V0cy4gU2F5IFkgaGVyZSBmb3IgSVNPODg1OS04LCB0aGUgSGVicmV3CisJICBjaGFyYWN0ZXIgc2V0LgorCitjb25maWcgTkxTX0NPREVQQUdFXzEyNTAKKwl0cmlzdGF0ZSAiV2luZG93cyBDUDEyNTAgKFNsYXZpYy9DZW50cmFsIEV1cm9wZWFuIExhbmd1YWdlcykiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBJZiB5b3Ugd2FudCB0byBkaXNwbGF5IGZpbGVuYW1lcyB3aXRoIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXJzCisJICBmcm9tIHRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBvciBmcm9tIEpPTElFVCBDRFJPTXMKKwkgIGNvcnJlY3RseSBvbiB0aGUgc2NyZWVuLCB5b3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgaW5wdXQvb3V0cHV0IGNoYXJhY3RlciBzZXRzLiBTYXkgWSBoZXJlIGZvciB0aGUgV2luZG93cyBDUC0xMjUwCisJICBjaGFyYWN0ZXIgc2V0LCB3aGljaCB3b3JrcyBmb3IgbW9zdCBMYXRpbi13cml0dGVuIFNsYXZpYyBhbmQgQ2VudHJhbAorCSAgRXVyb3BlYW4gbGFuZ3VhZ2VzOiBDemVjaCwgR2VybWFuLCBIdW5nYXJpYW4sIFBvbGlzaCwgUnVtYW5pYW4sIENyb2F0aWFuLAorCSAgU2xvdmFrLCBTbG92ZW5lLgorCitjb25maWcgTkxTX0NPREVQQUdFXzEyNTEKKwl0cmlzdGF0ZSAiV2luZG93cyBDUDEyNTEgKEJ1bGdhcmlhbiwgQmVsYXJ1c2lhbikiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBUaGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgY2FuIGRlYWwgd2l0aCBmaWxlbmFtZXMgaW4KKwkgIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXIgc2V0cy4gVGhlc2UgY2hhcmFjdGVyIHNldHMgYXJlIHN0b3JlZCBpbgorCSAgc28tY2FsbGVkIERPUyBjb2RlcGFnZXMuIFlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBjb2RlcGFnZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQvd3JpdGUgdGhlc2UgZmlsZW5hbWVzIG9uCisJICBET1MvV2luZG93cyBwYXJ0aXRpb25zIGNvcnJlY3RseS4gVGhpcyBkb2VzIGFwcGx5IHRvIHRoZSBmaWxlbmFtZXMKKwkgIG9ubHksIG5vdCB0byB0aGUgZmlsZSBjb250ZW50cy4gWW91IGNhbiBpbmNsdWRlIHNldmVyYWwgY29kZXBhZ2VzOworCSAgc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBET1MgY29kZXBhZ2UgZm9yIFJ1c3NpYW4gYW5kCisJICBCdWxnYXJpYW4gYW5kIEJlbGFydXNpYW4uCisKK2NvbmZpZyBOTFNfQVNDSUkKKwl0cmlzdGF0ZSAiQVNDSUkgKFVuaXRlZCBTdGF0ZXMpIgorCWRlcGVuZHMgb24gTkxTCisJaGVscAorCSAgQW4gQVNDSUkgTkxTIG1vZHVsZSBpcyBuZWVkZWQgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCisJICBERUZBVUxUIE5MUyB3aXRoIHRoaXMgdmVyeSBiYXNpYyBjaGFyc2V0IGFuZCBkb24ndCB3YW50IGFueQorCSAgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgdG8gYmUgdHJhbnNsYXRlZC4KKworY29uZmlnIE5MU19JU084ODU5XzEKKwl0cmlzdGF0ZSAiTkxTIElTTyA4ODU5LTEgIChMYXRpbiAxOyBXZXN0ZXJuIEV1cm9wZWFuIExhbmd1YWdlcykiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBJZiB5b3Ugd2FudCB0byBkaXNwbGF5IGZpbGVuYW1lcyB3aXRoIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXJzCisJICBmcm9tIHRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBvciBmcm9tIEpPTElFVCBDRC1ST01zCisJICBjb3JyZWN0bHkgb24gdGhlIHNjcmVlbiwgeW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGlucHV0L291dHB1dCBjaGFyYWN0ZXIgc2V0cy4gU2F5IFkgaGVyZSBmb3IgdGhlIExhdGluIDEgY2hhcmFjdGVyCisJICBzZXQsIHdoaWNoIGNvdmVycyBtb3N0IFdlc3QgRXVyb3BlYW4gbGFuZ3VhZ2VzIHN1Y2ggYXMgQWxiYW5pYW4sCisJICBDYXRhbGFuLCBEYW5pc2gsIER1dGNoLCBFbmdsaXNoLCBGYWVyb2VzZSwgRmlubmlzaCwgRnJlbmNoLCBHZXJtYW4sCisJICBHYWxpY2lhbiwgSXJpc2gsIEljZWxhbmRpYywgSXRhbGlhbiwgTm9yd2VnaWFuLCBQb3J0dWd1ZXNlLCBTcGFuaXNoLAorCSAgYW5kIFN3ZWRpc2guIEl0IGlzIGFsc28gdGhlIGRlZmF1bHQgZm9yIHRoZSBVUy4gSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIE5MU19JU084ODU5XzIKKwl0cmlzdGF0ZSAiTkxTIElTTyA4ODU5LTIgIChMYXRpbiAyOyBTbGF2aWMvQ2VudHJhbCBFdXJvcGVhbiBMYW5ndWFnZXMpIgorCWRlcGVuZHMgb24gTkxTCisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gZGlzcGxheSBmaWxlbmFtZXMgd2l0aCBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVycworCSAgZnJvbSB0aGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgb3IgZnJvbSBKT0xJRVQgQ0QtUk9NcworCSAgY29ycmVjdGx5IG9uIHRoZSBzY3JlZW4sIHlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBpbnB1dC9vdXRwdXQgY2hhcmFjdGVyIHNldHMuIFNheSBZIGhlcmUgZm9yIHRoZSBMYXRpbiAyIGNoYXJhY3RlcgorCSAgc2V0LCB3aGljaCB3b3JrcyBmb3IgbW9zdCBMYXRpbi13cml0dGVuIFNsYXZpYyBhbmQgQ2VudHJhbCBFdXJvcGVhbgorCSAgbGFuZ3VhZ2VzOiBDemVjaCwgR2VybWFuLCBIdW5nYXJpYW4sIFBvbGlzaCwgUnVtYW5pYW4sIENyb2F0aWFuLAorCSAgU2xvdmFrLCBTbG92ZW5lLgorCitjb25maWcgTkxTX0lTTzg4NTlfMworCXRyaXN0YXRlICJOTFMgSVNPIDg4NTktMyAgKExhdGluIDM7IEVzcGVyYW50bywgR2FsaWNpYW4sIE1hbHRlc2UsIFR1cmtpc2gpIgorCWRlcGVuZHMgb24gTkxTCisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gZGlzcGxheSBmaWxlbmFtZXMgd2l0aCBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVycworCSAgZnJvbSB0aGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgb3IgZnJvbSBKT0xJRVQgQ0QtUk9NcworCSAgY29ycmVjdGx5IG9uIHRoZSBzY3JlZW4sIHlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBpbnB1dC9vdXRwdXQgY2hhcmFjdGVyIHNldHMuIFNheSBZIGhlcmUgZm9yIHRoZSBMYXRpbiAzIGNoYXJhY3RlcgorCSAgc2V0LCB3aGljaCBpcyBwb3B1bGFyIHdpdGggYXV0aG9ycyBvZiBFc3BlcmFudG8sIEdhbGljaWFuLCBNYWx0ZXNlLAorCSAgYW5kIFR1cmtpc2guCisKK2NvbmZpZyBOTFNfSVNPODg1OV80CisJdHJpc3RhdGUgIk5MUyBJU08gODg1OS00ICAoTGF0aW4gNDsgb2xkIEJhbHRpYyBjaGFyc2V0KSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIGRpc3BsYXkgZmlsZW5hbWVzIHdpdGggbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlcnMKKwkgIGZyb20gdGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IG9yIGZyb20gSk9MSUVUIENELVJPTXMKKwkgIGNvcnJlY3RseSBvbiB0aGUgc2NyZWVuLCB5b3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgaW5wdXQvb3V0cHV0IGNoYXJhY3RlciBzZXRzLiBTYXkgWSBoZXJlIGZvciB0aGUgTGF0aW4gNCBjaGFyYWN0ZXIKKwkgIHNldCB3aGljaCBpbnRyb2R1Y2VzIGxldHRlcnMgZm9yIEVzdG9uaWFuLCBMYXR2aWFuLCBhbmQKKwkgIExpdGh1YW5pYW4uIEl0IGlzIGFuIGluY29tcGxldGUgcHJlZGVjZXNzb3Igb2YgTGF0aW4gNy4KKworY29uZmlnIE5MU19JU084ODU5XzUKKwl0cmlzdGF0ZSAiTkxTIElTTyA4ODU5LTUgIChDeXJpbGxpYykiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBJZiB5b3Ugd2FudCB0byBkaXNwbGF5IGZpbGVuYW1lcyB3aXRoIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXJzCisJICBmcm9tIHRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBvciBmcm9tIEpPTElFVCBDRC1ST01zCisJICBjb3JyZWN0bHkgb24gdGhlIHNjcmVlbiwgeW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGlucHV0L291dHB1dCBjaGFyYWN0ZXIgc2V0cy4gU2F5IFkgaGVyZSBmb3IgSVNPODg1OS01LCBhIEN5cmlsbGljCisJICBjaGFyYWN0ZXIgc2V0IHdpdGggd2hpY2ggeW91IGNhbiB0eXBlIEJ1bGdhcmlhbiwgQmVsYXJ1c2lhbiwKKwkgIE1hY2Vkb25pYW4sIFJ1c3NpYW4sIFNlcmJpYW4sIGFuZCBVa3JhaW5pYW4uIE5vdGUgdGhhdCB0aGUgY2hhcnNldAorCSAgS09JOC1SIGlzIHByZWZlcnJlZCBpbiBSdXNzaWEuCisKK2NvbmZpZyBOTFNfSVNPODg1OV82CisJdHJpc3RhdGUgIk5MUyBJU08gODg1OS02ICAoQXJhYmljKSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIGRpc3BsYXkgZmlsZW5hbWVzIHdpdGggbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlcnMKKwkgIGZyb20gdGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IG9yIGZyb20gSk9MSUVUIENELVJPTXMKKwkgIGNvcnJlY3RseSBvbiB0aGUgc2NyZWVuLCB5b3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgaW5wdXQvb3V0cHV0IGNoYXJhY3RlciBzZXRzLiBTYXkgWSBoZXJlIGZvciBJU084ODU5LTYsIHRoZSBBcmFiaWMKKwkgIGNoYXJhY3RlciBzZXQuCisKK2NvbmZpZyBOTFNfSVNPODg1OV83CisJdHJpc3RhdGUgIk5MUyBJU08gODg1OS03ICAoTW9kZXJuIEdyZWVrKSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIGRpc3BsYXkgZmlsZW5hbWVzIHdpdGggbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlcnMKKwkgIGZyb20gdGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IG9yIGZyb20gSk9MSUVUIENELVJPTXMKKwkgIGNvcnJlY3RseSBvbiB0aGUgc2NyZWVuLCB5b3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgaW5wdXQvb3V0cHV0IGNoYXJhY3RlciBzZXRzLiBTYXkgWSBoZXJlIGZvciBJU084ODU5LTcsIHRoZSBNb2Rlcm4KKwkgIEdyZWVrIGNoYXJhY3RlciBzZXQuCisKK2NvbmZpZyBOTFNfSVNPODg1OV85CisJdHJpc3RhdGUgIk5MUyBJU08gODg1OS05ICAoTGF0aW4gNTsgVHVya2lzaCkiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBJZiB5b3Ugd2FudCB0byBkaXNwbGF5IGZpbGVuYW1lcyB3aXRoIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXJzCisJICBmcm9tIHRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBvciBmcm9tIEpPTElFVCBDRC1ST01zCisJICBjb3JyZWN0bHkgb24gdGhlIHNjcmVlbiwgeW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGlucHV0L291dHB1dCBjaGFyYWN0ZXIgc2V0cy4gU2F5IFkgaGVyZSBmb3IgdGhlIExhdGluIDUgY2hhcmFjdGVyCisJICBzZXQsIGFuZCBpdCByZXBsYWNlcyB0aGUgcmFyZWx5IG5lZWRlZCBJY2VsYW5kaWMgbGV0dGVycyBpbiBMYXRpbiAxCisJICB3aXRoIHRoZSBUdXJraXNoIG9uZXMuIFVzZWZ1bCBpbiBUdXJrZXkuCisKK2NvbmZpZyBOTFNfSVNPODg1OV8xMworCXRyaXN0YXRlICJOTFMgSVNPIDg4NTktMTMgKExhdGluIDc7IEJhbHRpYykiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBJZiB5b3Ugd2FudCB0byBkaXNwbGF5IGZpbGVuYW1lcyB3aXRoIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXJzCisJICBmcm9tIHRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBvciBmcm9tIEpPTElFVCBDRC1ST01zCisJICBjb3JyZWN0bHkgb24gdGhlIHNjcmVlbiwgeW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGlucHV0L291dHB1dCBjaGFyYWN0ZXIgc2V0cy4gU2F5IFkgaGVyZSBmb3IgdGhlIExhdGluIDcgY2hhcmFjdGVyCisJICBzZXQsIHdoaWNoIHN1cHBvcnRzIG1vZGVybiBCYWx0aWMgbGFuZ3VhZ2VzIGluY2x1ZGluZyBMYXR2aWFuCisJICBhbmQgTGl0aHVhbmlhbi4KKworY29uZmlnIE5MU19JU084ODU5XzE0CisJdHJpc3RhdGUgIk5MUyBJU08gODg1OS0xNCAoTGF0aW4gODsgQ2VsdGljKSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIGRpc3BsYXkgZmlsZW5hbWVzIHdpdGggbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlcnMKKwkgIGZyb20gdGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IG9yIGZyb20gSk9MSUVUIENELVJPTXMKKwkgIGNvcnJlY3RseSBvbiB0aGUgc2NyZWVuLCB5b3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgaW5wdXQvb3V0cHV0IGNoYXJhY3RlciBzZXRzLiBTYXkgWSBoZXJlIGZvciB0aGUgTGF0aW4gOCBjaGFyYWN0ZXIKKwkgIHNldCwgd2hpY2ggYWRkcyB0aGUgbGFzdCBhY2NlbnRlZCB2b3dlbHMgZm9yIFdlbHNoIChha2EgQ3ltcmFlZykKKwkgIChhbmQgTWFueCBHYWVsaWMpIHRoYXQgd2VyZSBtaXNzaW5nIGluIExhdGluIDEuCisJICA8aHR0cDovL2xpbnV4LnNwZWVjaC5jeW1ydS5vcmcvPiBoYXMgZnVydGhlciBpbmZvcm1hdGlvbi4KKworY29uZmlnIE5MU19JU084ODU5XzE1CisJdHJpc3RhdGUgIk5MUyBJU08gODg1OS0xNSAoTGF0aW4gOTsgV2VzdGVybiBFdXJvcGVhbiBMYW5ndWFnZXMgd2l0aCBFdXJvKSIKKwlkZXBlbmRzIG9uIE5MUworCS0tLWhlbHAtLS0KKwkgIElmIHlvdSB3YW50IHRvIGRpc3BsYXkgZmlsZW5hbWVzIHdpdGggbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlcnMKKwkgIGZyb20gdGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IG9yIGZyb20gSk9MSUVUIENELVJPTXMKKwkgIGNvcnJlY3RseSBvbiB0aGUgc2NyZWVuLCB5b3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgaW5wdXQvb3V0cHV0IGNoYXJhY3RlciBzZXRzLiBTYXkgWSBoZXJlIGZvciB0aGUgTGF0aW4gOSBjaGFyYWN0ZXIKKwkgIHNldCwgd2hpY2ggY292ZXJzIG1vc3QgV2VzdCBFdXJvcGVhbiBsYW5ndWFnZXMgc3VjaCBhcyBBbGJhbmlhbiwKKwkgIENhdGFsYW4sIERhbmlzaCwgRHV0Y2gsIEVuZ2xpc2gsIEVzdG9uaWFuLCBGYWVyb2VzZSwgRmlubmlzaCwKKwkgIEZyZW5jaCwgR2VybWFuLCBHYWxpY2lhbiwgSXJpc2gsIEljZWxhbmRpYywgSXRhbGlhbiwgTm9yd2VnaWFuLAorCSAgUG9ydHVndWVzZSwgU3BhbmlzaCwgYW5kIFN3ZWRpc2guIExhdGluIDkgaXMgYW4gdXBkYXRlIHRvCisJICBMYXRpbiAxIChJU08gODg1OS0xKSB0aGF0IHJlbW92ZXMgYSBoYW5kZnVsIG9mIHJhcmVseSB1c2VkCisJICBjaGFyYWN0ZXJzIGFuZCBpbnN0ZWFkIGFkZHMgc3VwcG9ydCBmb3IgRXN0b25pYW4sIGNvcnJlY3RzIHRoZQorCSAgc3VwcG9ydCBmb3IgRnJlbmNoIGFuZCBGaW5uaXNoLCBhbmQgYWRkcyB0aGUgbmV3IEV1cm8gY2hhcmFjdGVyLgorCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIE5MU19LT0k4X1IKKwl0cmlzdGF0ZSAiTkxTIEtPSTgtUiAoUnVzc2lhbikiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBJZiB5b3Ugd2FudCB0byBkaXNwbGF5IGZpbGVuYW1lcyB3aXRoIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXJzCisJICBmcm9tIHRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBvciBmcm9tIEpPTElFVCBDRC1ST01zCisJICBjb3JyZWN0bHkgb24gdGhlIHNjcmVlbiwgeW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGlucHV0L291dHB1dCBjaGFyYWN0ZXIgc2V0cy4gU2F5IFkgaGVyZSBmb3IgdGhlIHByZWZlcnJlZCBSdXNzaWFuCisJICBjaGFyYWN0ZXIgc2V0LgorCitjb25maWcgTkxTX0tPSThfVQorCXRyaXN0YXRlICJOTFMgS09JOC1VL1JVIChVa3JhaW5pYW4sIEJlbGFydXNpYW4pIgorCWRlcGVuZHMgb24gTkxTCisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gZGlzcGxheSBmaWxlbmFtZXMgd2l0aCBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVycworCSAgZnJvbSB0aGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgb3IgZnJvbSBKT0xJRVQgQ0QtUk9NcworCSAgY29ycmVjdGx5IG9uIHRoZSBzY3JlZW4sIHlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBpbnB1dC9vdXRwdXQgY2hhcmFjdGVyIHNldHMuIFNheSBZIGhlcmUgZm9yIHRoZSBwcmVmZXJyZWQgVWtyYWluaWFuCisJICAoa29pOC11KSBhbmQgQmVsYXJ1c2lhbiAoa29pOC1ydSkgY2hhcmFjdGVyIHNldHMuCisKK2NvbmZpZyBOTFNfVVRGOAorCXRyaXN0YXRlICJOTFMgVVRGOCIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIGRpc3BsYXkgZmlsZW5hbWVzIHdpdGggbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlcnMKKwkgIGZyb20gdGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IG9yIGZyb20gSk9MSUVUIENELVJPTXMKKwkgIGNvcnJlY3RseSBvbiB0aGUgc2NyZWVuLCB5b3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgaW5wdXQvb3V0cHV0IGNoYXJhY3RlciBzZXRzLiBTYXkgWSBoZXJlIGZvciB0aGUgVVRGLTggZW5jb2Rpbmcgb2YKKwkgIHRoZSBVbmljb2RlL0lTTzk2NDYgdW5pdmVyc2FsIGNoYXJhY3RlciBzZXQuCisKK2VuZG1lbnUKKwpkaWZmIC0tZ2l0IGEvZnMvbmxzL01ha2VmaWxlIGIvZnMvbmxzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YWRlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvTWFrZWZpbGUKQEAgLTAsMCArMSw0NiBAQAorIworIyBNYWtlZmlsZSBmb3IgbmF0aXZlIGxhbmd1YWdlIHN1cHBvcnQKKyMKKworb2JqLSQoQ09ORklHX05MUykJCSs9IG5sc19iYXNlLm8KKworb2JqLSQoQ09ORklHX05MU19DT0RFUEFHRV80MzcpCSs9IG5sc19jcDQzNy5vCitvYmotJChDT05GSUdfTkxTX0NPREVQQUdFXzczNykJKz0gbmxzX2NwNzM3Lm8KK29iai0kKENPTkZJR19OTFNfQ09ERVBBR0VfNzc1KQkrPSBubHNfY3A3NzUubworb2JqLSQoQ09ORklHX05MU19DT0RFUEFHRV84NTApCSs9IG5sc19jcDg1MC5vCitvYmotJChDT05GSUdfTkxTX0NPREVQQUdFXzg1MikJKz0gbmxzX2NwODUyLm8KK29iai0kKENPTkZJR19OTFNfQ09ERVBBR0VfODU1KQkrPSBubHNfY3A4NTUubworb2JqLSQoQ09ORklHX05MU19DT0RFUEFHRV84NTcpCSs9IG5sc19jcDg1Ny5vCitvYmotJChDT05GSUdfTkxTX0NPREVQQUdFXzg2MCkJKz0gbmxzX2NwODYwLm8KK29iai0kKENPTkZJR19OTFNfQ09ERVBBR0VfODYxKQkrPSBubHNfY3A4NjEubworb2JqLSQoQ09ORklHX05MU19DT0RFUEFHRV84NjIpCSs9IG5sc19jcDg2Mi5vCitvYmotJChDT05GSUdfTkxTX0NPREVQQUdFXzg2MykJKz0gbmxzX2NwODYzLm8KK29iai0kKENPTkZJR19OTFNfQ09ERVBBR0VfODY0KQkrPSBubHNfY3A4NjQubworb2JqLSQoQ09ORklHX05MU19DT0RFUEFHRV84NjUpCSs9IG5sc19jcDg2NS5vCitvYmotJChDT05GSUdfTkxTX0NPREVQQUdFXzg2NikJKz0gbmxzX2NwODY2Lm8KK29iai0kKENPTkZJR19OTFNfQ09ERVBBR0VfODY5KQkrPSBubHNfY3A4Njkubworb2JqLSQoQ09ORklHX05MU19DT0RFUEFHRV84NzQpCSs9IG5sc19jcDg3NC5vCitvYmotJChDT05GSUdfTkxTX0NPREVQQUdFXzkzMikJKz0gbmxzX2NwOTMyLm8gbmxzX2V1Yy1qcC5vCitvYmotJChDT05GSUdfTkxTX0NPREVQQUdFXzkzNikJKz0gbmxzX2NwOTM2Lm8KK29iai0kKENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5KQkrPSBubHNfY3A5NDkubworb2JqLSQoQ09ORklHX05MU19DT0RFUEFHRV85NTApCSs9IG5sc19jcDk1MC5vCitvYmotJChDT05GSUdfTkxTX0NPREVQQUdFXzEyNTApICs9IG5sc19jcDEyNTAubworb2JqLSQoQ09ORklHX05MU19DT0RFUEFHRV8xMjUxKQkrPSBubHNfY3AxMjUxLm8KK29iai0kKENPTkZJR19OTFNfQVNDSUkpCQkrPSBubHNfYXNjaWkubworb2JqLSQoQ09ORklHX05MU19JU084ODU5XzEpCSs9IG5sc19pc284ODU5LTEubworb2JqLSQoQ09ORklHX05MU19JU084ODU5XzIpCSs9IG5sc19pc284ODU5LTIubworb2JqLSQoQ09ORklHX05MU19JU084ODU5XzMpCSs9IG5sc19pc284ODU5LTMubworb2JqLSQoQ09ORklHX05MU19JU084ODU5XzQpCSs9IG5sc19pc284ODU5LTQubworb2JqLSQoQ09ORklHX05MU19JU084ODU5XzUpCSs9IG5sc19pc284ODU5LTUubworb2JqLSQoQ09ORklHX05MU19JU084ODU5XzYpCSs9IG5sc19pc284ODU5LTYubworb2JqLSQoQ09ORklHX05MU19JU084ODU5XzcpCSs9IG5sc19pc284ODU5LTcubworb2JqLSQoQ09ORklHX05MU19JU084ODU5XzgpCSs9IG5sc19jcDEyNTUubworb2JqLSQoQ09ORklHX05MU19JU084ODU5XzkpCSs9IG5sc19pc284ODU5LTkubworb2JqLSQoQ09ORklHX05MU19JU084ODU5XzEwKQkrPSBubHNfaXNvODg1OS0xMC5vCitvYmotJChDT05GSUdfTkxTX0lTTzg4NTlfMTMpCSs9IG5sc19pc284ODU5LTEzLm8KK29iai0kKENPTkZJR19OTFNfSVNPODg1OV8xNCkJKz0gbmxzX2lzbzg4NTktMTQubworb2JqLSQoQ09ORklHX05MU19JU084ODU5XzE1KQkrPSBubHNfaXNvODg1OS0xNS5vCitvYmotJChDT05GSUdfTkxTX0tPSThfUikJKz0gbmxzX2tvaTgtci5vCitvYmotJChDT05GSUdfTkxTX0tPSThfVSkJKz0gbmxzX2tvaTgtdS5vIG5sc19rb2k4LXJ1Lm8KK29iai0kKENPTkZJR19OTFNfQUJDKQkJKz0gbmxzX2FiYy5vCitvYmotJChDT05GSUdfTkxTX1VURjgpCQkrPSBubHNfdXRmOC5vCmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2FzY2lpLmMgYi9mcy9ubHMvbmxzX2FzY2lpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzMzgxYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfYXNjaWkuYwpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19hc2NpaS5jCisgKgorICogQ2hhcnNldCBhc2NpaSB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworfTsKKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSAmIDB4MDBmZjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaSAmIDB4ZmYwMCkgPj4gODsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXVuaTJjaGFyc2V0ID0gcGFnZV91bmkyY2hhcnNldFtjaF07CisJaWYgKHVuaTJjaGFyc2V0ICYmIHVuaTJjaGFyc2V0W2NsXSkKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2xdOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKwkqdW5pID0gY2hhcnNldDJ1bmlbKnJhd3N0cmluZ107CisJaWYgKCp1bmkgPT0gMHgwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAiYXNjaWkiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfYXNjaWkodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sc19hc2NpaSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2FzY2lpKQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfYXNjaWkpCisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfYmFzZS5jIGIvZnMvbmxzL25sc19iYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3NTEyNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfYmFzZS5jCkBAIC0wLDAgKzEsNDk3IEBACisvKgorICogbGludXgvZnMvbmxzX2Jhc2UuYworICoKKyAqIE5hdGl2ZSBsYW5ndWFnZSBzdXBwb3J0LS1jaGFyc2V0cyBhbmQgdW5pY29kZSB0cmFuc2xhdGlvbnMuCisgKiBCeSBHb3Jkb24gQ2hhZmZlZSAxOTk2LCAxOTk3CisgKgorICogVW5pY29kZSBiYXNlZCBjYXNlIGNvbnZlcnNpb24gMTk5OSBieSBXb2xmcmFtIFBpZW5rb3NzCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2lmZGVmIENPTkZJR19LTU9ECisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgZGVmYXVsdF90YWJsZTsKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlICp0YWJsZXMgPSAmZGVmYXVsdF90YWJsZTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobmxzX2xvY2spOworCisvKgorICogU2FtcGxlIGltcGxlbWVudGF0aW9uIGZyb20gVW5pY29kZSBob21lIHBhZ2UuCisgKiBodHRwOi8vd3d3LnN0b25laGFuZC5jb20vdW5pY29kZS9zdGFuZGFyZC9mc3MtdXRmLmh0bWwKKyAqLworc3RydWN0IHV0ZjhfdGFibGUgeworCWludCAgICAgY21hc2s7CisJaW50ICAgICBjdmFsOworCWludCAgICAgc2hpZnQ7CisJbG9uZyAgICBsbWFzazsKKwlsb25nICAgIGx2YWw7Cit9OworCitzdGF0aWMgc3RydWN0IHV0ZjhfdGFibGUgdXRmOF90YWJsZVtdID0KK3sKKyAgICB7MHg4MCwgIDB4MDAsICAgMCo2LCAgICAweDdGLCAgICAgICAgICAgMCwgICAgICAgICAvKiAxIGJ5dGUgc2VxdWVuY2UgKi99LAorICAgIHsweEUwLCAgMHhDMCwgICAxKjYsICAgIDB4N0ZGLCAgICAgICAgICAweDgwLCAgICAgIC8qIDIgYnl0ZSBzZXF1ZW5jZSAqL30sCisgICAgezB4RjAsICAweEUwLCAgIDIqNiwgICAgMHhGRkZGLCAgICAgICAgIDB4ODAwLCAgICAgLyogMyBieXRlIHNlcXVlbmNlICovfSwKKyAgICB7MHhGOCwgIDB4RjAsICAgMyo2LCAgICAweDFGRkZGRiwgICAgICAgMHgxMDAwMCwgICAvKiA0IGJ5dGUgc2VxdWVuY2UgKi99LAorICAgIHsweEZDLCAgMHhGOCwgICA0KjYsICAgIDB4M0ZGRkZGRiwgICAgICAweDIwMDAwMCwgIC8qIDUgYnl0ZSBzZXF1ZW5jZSAqL30sCisgICAgezB4RkUsICAweEZDLCAgIDUqNiwgICAgMHg3RkZGRkZGRiwgICAgIDB4NDAwMDAwMCwgLyogNiBieXRlIHNlcXVlbmNlICovfSwKKyAgICB7MCwJCQkJCQkgICAgICAgLyogZW5kIG9mIHRhYmxlICAgICovfQorfTsKKworaW50Cit1dGY4X21idG93Yyh3Y2hhcl90ICpwLCBjb25zdCBfX3U4ICpzLCBpbnQgbikKK3sKKwlsb25nIGw7CisJaW50IGMwLCBjLCBuYzsKKwlzdHJ1Y3QgdXRmOF90YWJsZSAqdDsKKyAgCisJbmMgPSAwOworCWMwID0gKnM7CisJbCA9IGMwOworCWZvciAodCA9IHV0ZjhfdGFibGU7IHQtPmNtYXNrOyB0KyspIHsKKwkJbmMrKzsKKwkJaWYgKChjMCAmIHQtPmNtYXNrKSA9PSB0LT5jdmFsKSB7CisJCQlsICY9IHQtPmxtYXNrOworCQkJaWYgKGwgPCB0LT5sdmFsKQorCQkJCXJldHVybiAtMTsKKwkJCSpwID0gbDsKKwkJCXJldHVybiBuYzsKKwkJfQorCQlpZiAobiA8PSBuYykKKwkJCXJldHVybiAtMTsKKwkJcysrOworCQljID0gKCpzIF4gMHg4MCkgJiAweEZGOworCQlpZiAoYyAmIDB4QzApCisJCQlyZXR1cm4gLTE7CisJCWwgPSAobCA8PCA2KSB8IGM7CisJfQorCXJldHVybiAtMTsKK30KKworaW50Cit1dGY4X21ic3Rvd2NzKHdjaGFyX3QgKnB3Y3MsIGNvbnN0IF9fdTggKnMsIGludCBuKQoreworCV9fdTE2ICpvcDsKKwljb25zdCBfX3U4ICppcDsKKwlpbnQgc2l6ZTsKKworCW9wID0gcHdjczsKKwlpcCA9IHM7CisJd2hpbGUgKCppcCAmJiBuID4gMCkgeworCQlpZiAoKmlwICYgMHg4MCkgeworCQkJc2l6ZSA9IHV0ZjhfbWJ0b3djKG9wLCBpcCwgbik7CisJCQlpZiAoc2l6ZSA9PSAtMSkgeworCQkJCS8qIElnbm9yZSBjaGFyYWN0ZXIgYW5kIG1vdmUgb24gKi8KKwkJCQlpcCsrOworCQkJCW4tLTsKKwkJCX0gZWxzZSB7CisJCQkJb3ArKzsKKwkJCQlpcCArPSBzaXplOworCQkJCW4gLT0gc2l6ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSpvcCsrID0gKmlwKys7CisJCQluLS07CisJCX0KKwl9CisJcmV0dXJuIChvcCAtIHB3Y3MpOworfQorCitpbnQKK3V0Zjhfd2N0b21iKF9fdTggKnMsIHdjaGFyX3Qgd2MsIGludCBtYXhsZW4pCit7CisJbG9uZyBsOworCWludCBjLCBuYzsKKwlzdHJ1Y3QgdXRmOF90YWJsZSAqdDsKKyAgCisJaWYgKHMgPT0gMCkKKwkJcmV0dXJuIDA7CisgIAorCWwgPSB3YzsKKwluYyA9IDA7CisJZm9yICh0ID0gdXRmOF90YWJsZTsgdC0+Y21hc2sgJiYgbWF4bGVuOyB0KyssIG1heGxlbi0tKSB7CisJCW5jKys7CisJCWlmIChsIDw9IHQtPmxtYXNrKSB7CisJCQljID0gdC0+c2hpZnQ7CisJCQkqcyA9IHQtPmN2YWwgfCAobCA+PiBjKTsKKwkJCXdoaWxlIChjID4gMCkgeworCQkJCWMgLT0gNjsKKwkJCQlzKys7CisJCQkJKnMgPSAweDgwIHwgKChsID4+IGMpICYgMHgzRik7CisJCQl9CisJCQlyZXR1cm4gbmM7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCitpbnQKK3V0Zjhfd2NzdG9tYnMoX191OCAqcywgY29uc3Qgd2NoYXJfdCAqcHdjcywgaW50IG1heGxlbikKK3sKKwljb25zdCBfX3UxNiAqaXA7CisJX191OCAqb3A7CisJaW50IHNpemU7CisKKwlvcCA9IHM7CisJaXAgPSBwd2NzOworCXdoaWxlICgqaXAgJiYgbWF4bGVuID4gMCkgeworCQlpZiAoKmlwID4gMHg3ZikgeworCQkJc2l6ZSA9IHV0Zjhfd2N0b21iKG9wLCAqaXAsIG1heGxlbik7CisJCQlpZiAoc2l6ZSA9PSAtMSkgeworCQkJCS8qIElnbm9yZSBjaGFyYWN0ZXIgYW5kIG1vdmUgb24gKi8KKwkJCQltYXhsZW4tLTsKKwkJCX0gZWxzZSB7CisJCQkJb3AgKz0gc2l6ZTsKKwkJCQltYXhsZW4gLT0gc2l6ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSpvcCsrID0gKF9fdTgpICppcDsKKwkJfQorCQlpcCsrOworCX0KKwlyZXR1cm4gKG9wIC0gcyk7Cit9CisKK2ludCByZWdpc3Rlcl9ubHMoc3RydWN0IG5sc190YWJsZSAqIG5scykKK3sKKwlzdHJ1Y3QgbmxzX3RhYmxlICoqIHRtcCA9ICZ0YWJsZXM7CisKKwlpZiAoIW5scykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG5scy0+bmV4dCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXNwaW5fbG9jaygmbmxzX2xvY2spOworCXdoaWxlICgqdG1wKSB7CisJCWlmIChubHMgPT0gKnRtcCkgeworCQkJc3Bpbl91bmxvY2soJm5sc19sb2NrKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJdG1wID0gJigqdG1wKS0+bmV4dDsKKwl9CisJbmxzLT5uZXh0ID0gdGFibGVzOworCXRhYmxlcyA9IG5sczsKKwlzcGluX3VubG9jaygmbmxzX2xvY2spOworCXJldHVybiAwOwkKK30KKworaW50IHVucmVnaXN0ZXJfbmxzKHN0cnVjdCBubHNfdGFibGUgKiBubHMpCit7CisJc3RydWN0IG5sc190YWJsZSAqKiB0bXAgPSAmdGFibGVzOworCisJc3Bpbl9sb2NrKCZubHNfbG9jayk7CisJd2hpbGUgKCp0bXApIHsKKwkJaWYgKG5scyA9PSAqdG1wKSB7CisJCQkqdG1wID0gbmxzLT5uZXh0OworCQkJc3Bpbl91bmxvY2soJm5sc19sb2NrKTsKKwkJCXJldHVybiAwOworCQl9CisJCXRtcCA9ICYoKnRtcCktPm5leHQ7CisJfQorCXNwaW5fdW5sb2NrKCZubHNfbG9jayk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlICpmaW5kX25scyhjaGFyICpjaGFyc2V0KQoreworCXN0cnVjdCBubHNfdGFibGUgKm5sczsKKwlzcGluX2xvY2soJm5sc19sb2NrKTsKKwlmb3IgKG5scyA9IHRhYmxlczsgbmxzOyBubHMgPSBubHMtPm5leHQpIHsKKwkJaWYgKCFzdHJjbXAobmxzLT5jaGFyc2V0LCBjaGFyc2V0KSkKKwkJCWJyZWFrOworCQlpZiAobmxzLT5hbGlhcyAmJiAhc3RyY21wKG5scy0+YWxpYXMsIGNoYXJzZXQpKQorCQkJYnJlYWs7CisJfQorCWlmIChubHMgJiYgIXRyeV9tb2R1bGVfZ2V0KG5scy0+b3duZXIpKQorCQlubHMgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZubHNfbG9jayk7CisJcmV0dXJuIG5sczsKK30KKworc3RydWN0IG5sc190YWJsZSAqbG9hZF9ubHMoY2hhciAqY2hhcnNldCkKK3sKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHM7CisjaWZkZWYgQ09ORklHX0tNT0QKKwlpbnQgcmV0OworI2VuZGlmCisKKwlubHMgPSBmaW5kX25scyhjaGFyc2V0KTsKKwlpZiAobmxzKQorCQlyZXR1cm4gbmxzOworCisjaWZkZWYgQ09ORklHX0tNT0QKKwlyZXQgPSByZXF1ZXN0X21vZHVsZSgibmxzXyVzIiwgY2hhcnNldCk7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50aygiVW5hYmxlIHRvIGxvYWQgTkxTIGNoYXJzZXQgJXNcbiIsIGNoYXJzZXQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbmxzID0gZmluZF9ubHMoY2hhcnNldCk7CisjZW5kaWYKKwlyZXR1cm4gbmxzOworfQorCit2b2lkIHVubG9hZF9ubHMoc3RydWN0IG5sc190YWJsZSAqbmxzKQoreworCW1vZHVsZV9wdXQobmxzLT5vd25lcik7Cit9CisKK3djaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDA4MCwgMHgwMDgxLCAweDAwODIsIDB4MDA4MywKKwkweDAwODQsIDB4MDA4NSwgMHgwMDg2LCAweDAwODcsCisJMHgwMDg4LCAweDAwODksIDB4MDA4YSwgMHgwMDhiLAorCTB4MDA4YywgMHgwMDhkLCAweDAwOGUsIDB4MDA4ZiwKKwkvKiAweDkwKi8KKwkweDAwOTAsIDB4MDA5MSwgMHgwMDkyLCAweDAwOTMsCisJMHgwMDk0LCAweDAwOTUsIDB4MDA5NiwgMHgwMDk3LAorCTB4MDA5OCwgMHgwMDk5LCAweDAwOWEsIDB4MDA5YiwKKwkweDAwOWMsIDB4MDA5ZCwgMHgwMDllLCAweDAwOWYsCisJLyogMHhhMCovCisJMHgwMGEwLCAweDAwYTEsIDB4MDBhMiwgMHgwMGEzLAorCTB4MDBhNCwgMHgwMGE1LCAweDAwYTYsIDB4MDBhNywKKwkweDAwYTgsIDB4MDBhOSwgMHgwMGFhLCAweDAwYWIsCisJMHgwMGFjLCAweDAwYWQsIDB4MDBhZSwgMHgwMGFmLAorCS8qIDB4YjAqLworCTB4MDBiMCwgMHgwMGIxLCAweDAwYjIsIDB4MDBiMywKKwkweDAwYjQsIDB4MDBiNSwgMHgwMGI2LCAweDAwYjcsCisJMHgwMGI4LCAweDAwYjksIDB4MDBiYSwgMHgwMGJiLAorCTB4MDBiYywgMHgwMGJkLCAweDAwYmUsIDB4MDBiZiwKKwkvKiAweGMwKi8KKwkweDAwYzAsIDB4MDBjMSwgMHgwMGMyLCAweDAwYzMsCisJMHgwMGM0LCAweDAwYzUsIDB4MDBjNiwgMHgwMGM3LAorCTB4MDBjOCwgMHgwMGM5LCAweDAwY2EsIDB4MDBjYiwKKwkweDAwY2MsIDB4MDBjZCwgMHgwMGNlLCAweDAwY2YsCisJLyogMHhkMCovCisJMHgwMGQwLCAweDAwZDEsIDB4MDBkMiwgMHgwMGQzLAorCTB4MDBkNCwgMHgwMGQ1LCAweDAwZDYsIDB4MDBkNywKKwkweDAwZDgsIDB4MDBkOSwgMHgwMGRhLCAweDAwZGIsCisJMHgwMGRjLCAweDAwZGQsIDB4MDBkZSwgMHgwMGRmLAorCS8qIDB4ZTAqLworCTB4MDBlMCwgMHgwMGUxLCAweDAwZTIsIDB4MDBlMywKKwkweDAwZTQsIDB4MDBlNSwgMHgwMGU2LCAweDAwZTcsCisJMHgwMGU4LCAweDAwZTksIDB4MDBlYSwgMHgwMGViLAorCTB4MDBlYywgMHgwMGVkLCAweDAwZWUsIDB4MDBlZiwKKwkvKiAweGYwKi8KKwkweDAwZjAsIDB4MDBmMSwgMHgwMGYyLCAweDAwZjMsCisJMHgwMGY0LCAweDAwZjUsIDB4MDBmNiwgMHgwMGY3LAorCTB4MDBmOCwgMHgwMGY5LCAweDAwZmEsIDB4MDBmYiwKKwkweDAwZmMsIDB4MDBmZCwgMHgwMGZlLCAweDAwZmYsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIGRlZmF1bHRfdGFibGUgPSB7CisJLmNoYXJzZXQJPSAiZGVmYXVsdCIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKK307CisKKy8qIFJldHVybnMgYSBzaW1wbGUgZGVmYXVsdCB0cmFuc2xhdGlvbiB0YWJsZSAqLworc3RydWN0IG5sc190YWJsZSAqbG9hZF9ubHNfZGVmYXVsdCh2b2lkKQoreworCXN0cnVjdCBubHNfdGFibGUgKmRlZmF1bHRfbmxzOworCQorCWRlZmF1bHRfbmxzID0gbG9hZF9ubHMoQ09ORklHX05MU19ERUZBVUxUKTsKKwlpZiAoZGVmYXVsdF9ubHMgIT0gTlVMTCkKKwkJcmV0dXJuIGRlZmF1bHRfbmxzOworCWVsc2UKKwkJcmV0dXJuICZkZWZhdWx0X3RhYmxlOworfQorCitFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX25scyk7CitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfbmxzKTsKK0VYUE9SVF9TWU1CT0wodW5sb2FkX25scyk7CitFWFBPUlRfU1lNQk9MKGxvYWRfbmxzKTsKK0VYUE9SVF9TWU1CT0wobG9hZF9ubHNfZGVmYXVsdCk7CitFWFBPUlRfU1lNQk9MKHV0ZjhfbWJ0b3djKTsKK0VYUE9SVF9TWU1CT0wodXRmOF9tYnN0b3djcyk7CitFWFBPUlRfU1lNQk9MKHV0Zjhfd2N0b21iKTsKK0VYUE9SVF9TWU1CT0wodXRmOF93Y3N0b21icyk7CisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfY3AxMjUwLmMgYi9mcy9ubHMvbmxzX2NwMTI1MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZTc4Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwMTI1MC5jCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICogbGludXgvZnMvbmxzX2NwMTI1MC5jCisgKgorICogQ2hhcnNldCBjcDEyNTAgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsIAorCTB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywgCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLCAKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsIAorCS8qIDB4MTAqLworCTB4MDAxMCwgMHgwMDExLCAweDAwMTIsIDB4MDAxMywgCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LCAKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsIAorCTB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwgCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsIAorCTB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwgCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLCAKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIAorCTB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLCAKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsIAorCS8qIDB4NDAqLworCTB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LCAKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIAorCTB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwgCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwgCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLCAKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIAorCTB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLCAKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsIAorCS8qIDB4NzAqLworCTB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LCAKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsIAorCTB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDA3ZiwgCisJLyogMHg4MCovCisJMHgyMGFjLCAweDAwMDAsIDB4MjAxYSwgMHgwMDAwLCAKKwkweDIwMWUsIDB4MjAyNiwgMHgyMDIwLCAweDIwMjEsIAorCTB4MDAwMCwgMHgyMDMwLCAweDAxNjAsIDB4MjAzOSwgCisJMHgwMTVhLCAweDAxNjQsIDB4MDE3ZCwgMHgwMTc5LCAKKwkvKiAweDkwKi8KKwkweDAwMDAsIDB4MjAxOCwgMHgyMDE5LCAweDIwMWMsIAorCTB4MjAxZCwgMHgyMDIyLCAweDIwMTMsIDB4MjAxNCwgCisJMHgwMDAwLCAweDIxMjIsIDB4MDE2MSwgMHgyMDNhLCAKKwkweDAxNWIsIDB4MDE2NSwgMHgwMTdlLCAweDAxN2EsIAorCS8qIDB4YTAqLworCTB4MDBhMCwgMHgwMmM3LCAweDAyZDgsIDB4MDE0MSwgCisJMHgwMGE0LCAweDAxMDQsIDB4MDBhNiwgMHgwMGE3LCAKKwkweDAwYTgsIDB4MDBhOSwgMHgwMTVlLCAweDAwYWIsIAorCTB4MDBhYywgMHgwMGFkLCAweDAwYWUsIDB4MDE3YiwgCisJLyogMHhiMCovCisJMHgwMGIwLCAweDAwYjEsIDB4MDJkYiwgMHgwMTQyLCAKKwkweDAwYjQsIDB4MDBiNSwgMHgwMGI2LCAweDAwYjcsIAorCTB4MDBiOCwgMHgwMTA1LCAweDAxNWYsIDB4MDBiYiwgCisJMHgwMTNkLCAweDAyZGQsIDB4MDEzZSwgMHgwMTdjLCAKKwkvKiAweGMwKi8KKwkweDAxNTQsIDB4MDBjMSwgMHgwMGMyLCAweDAxMDIsIAorCTB4MDBjNCwgMHgwMTM5LCAweDAxMDYsIDB4MDBjNywgCisJMHgwMTBjLCAweDAwYzksIDB4MDExOCwgMHgwMGNiLCAKKwkweDAxMWEsIDB4MDBjZCwgMHgwMGNlLCAweDAxMGUsIAorCS8qIDB4ZDAqLworCTB4MDExMCwgMHgwMTQzLCAweDAxNDcsIDB4MDBkMywgCisJMHgwMGQ0LCAweDAxNTAsIDB4MDBkNiwgMHgwMGQ3LCAKKwkweDAxNTgsIDB4MDE2ZSwgMHgwMGRhLCAweDAxNzAsIAorCTB4MDBkYywgMHgwMGRkLCAweDAxNjIsIDB4MDBkZiwgCisJLyogMHhlMCovCisJMHgwMTU1LCAweDAwZTEsIDB4MDBlMiwgMHgwMTAzLCAKKwkweDAwZTQsIDB4MDEzYSwgMHgwMTA3LCAweDAwZTcsIAorCTB4MDEwZCwgMHgwMGU5LCAweDAxMTksIDB4MDBlYiwgCisJMHgwMTFiLCAweDAwZWQsIDB4MDBlZSwgMHgwMTBmLCAKKwkvKiAweGYwKi8KKwkweDAxMTEsIDB4MDE0NCwgMHgwMTQ4LCAweDAwZjMsIAorCTB4MDBmNCwgMHgwMTUxLCAweDAwZjYsIDB4MDBmNywgCisJMHgwMTU5LCAweDAxNmYsIDB4MDBmYSwgMHgwMTcxLCAKKwkweDAwZmMsIDB4MDBmZCwgMHgwMTYzLCAweDAyZDksIAorCX07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwMCwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHgwMCwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHgwMCwgMHgwMCwgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHgwMCwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHhjMSwgMHhjMiwgMHgwMCwgMHhjNCwgMHgwMCwgMHgwMCwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHhjOSwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjZCwgMHhjZSwgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhkMywgMHhkNCwgMHgwMCwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHgwMCwgMHgwMCwgMHhkYSwgMHgwMCwgMHhkYywgMHhkZCwgMHgwMCwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHgwMCwgMHhlMSwgMHhlMiwgMHgwMCwgMHhlNCwgMHgwMCwgMHgwMCwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHgwMCwgMHhlOSwgMHgwMCwgMHhlYiwgMHgwMCwgMHhlZCwgMHhlZSwgMHgwMCwgLyogMHhlOC0weGVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhmMywgMHhmNCwgMHgwMCwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHgwMCwgMHgwMCwgMHhmYSwgMHgwMCwgMHhmYywgMHhmZCwgMHgwMCwgMHgwMCwgLyogMHhmOC0weGZmICovCisJfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAxWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHhjMywgMHhlMywgMHhhNSwgMHhiOSwgMHhjNiwgMHhlNiwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjOCwgMHhlOCwgMHhjZiwgMHhlZiwgLyogMHgwOC0weDBmICovCisJMHhkMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHhjYSwgMHhlYSwgMHhjYywgMHhlYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHhjNSwgMHhlNSwgMHgwMCwgMHgwMCwgMHhiYywgMHhiZSwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHhhMywgMHhiMywgMHhkMSwgMHhmMSwgMHgwMCwgMHgwMCwgMHhkMiwgLyogMHg0MC0weDQ3ICovCisJMHhmMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHhkNSwgMHhmNSwgMHgwMCwgMHgwMCwgMHhjMCwgMHhlMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHhkOCwgMHhmOCwgMHg4YywgMHg5YywgMHgwMCwgMHgwMCwgMHhhYSwgMHhiYSwgLyogMHg1OC0weDVmICovCisJMHg4YSwgMHg5YSwgMHhkZSwgMHhmZSwgMHg4ZCwgMHg5ZCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkOSwgMHhmOSwgLyogMHg2OC0weDZmICovCisJMHhkYiwgMHhmYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHg4ZiwgMHg5ZiwgMHhhZiwgMHhiZiwgMHg4ZSwgMHg5ZSwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwl9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDJbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTEsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZDAtMHhkNyAqLworCTB4YTIsIDB4ZmYsIDB4MDAsIDB4YjIsIDB4MDAsIDB4YmQsIDB4MDAsIDB4MDAsIC8qIDB4ZDgtMHhkZiAqLworCX07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMFsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4OTcsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4OTEsIDB4OTIsIDB4ODIsIDB4MDAsIDB4OTMsIDB4OTQsIDB4ODQsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4ODYsIDB4ODcsIDB4OTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODUsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4ODksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4OGIsIDB4OWIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIxWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsCXBhZ2UwMSwJcGFnZTAyLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAorCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCisJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwKKwlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAorCXBhZ2UyMCwJcGFnZTIxLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAorCX07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4MDAsIDB4ODIsIDB4MDAsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4ODksIDB4OWEsIDB4OGIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YjMsIDB4YTQsIDB4YjksIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YmEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YmYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmUsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4YzAtMHhjNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4YzgtMHhjZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworCX07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4MDAsIDB4ODIsIDB4MDAsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4OTksIDB4OGEsIDB4OWIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YTMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YTUsIDB4YWEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmMsIDB4YWYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4MDAsIC8qIDB4ZDgtMHhkZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4ZTAtMHhlNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworCX07CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworICAgICAgICB1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjbCA9IHVuaSAmIDB4MDBmZjsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKyAgICAgICAgaWYgKGJvdW5kbGVuIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKyAgICAgICAgdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKyAgICAgICAgaWYgKHVuaTJjaGFyc2V0ICYmIHVuaTJjaGFyc2V0W2NsXSkKKyAgICAgICAgICAgICAgICBvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKyAgICAgICAgKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworICAgICAgICBpZiAoKnVuaSA9PSAweDAwMDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIHJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDEyNTAiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfY3AxMjUwKHZvaWQpCit7CisgICAgICAgIHJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sc19jcDEyNTAodm9pZCkKK3sKKyAgICAgICAgdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfY3AxMjUwKQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfY3AxMjUwKQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2NwMTI1MS5jIGIvZnMvbmxzL25sc19jcDEyNTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjQxYzhhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19jcDEyNTEuYwpAQCAtMCwwICsxLDMwMiBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19jcDEyNTEuYworICoKKyAqIENoYXJzZXQgY3AxMjUxIHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIFVuaWNvZGUgYW5kIGNoYXJzZXQKKyAqIHRhYmxlcyBmcm9tIHRoZSBVbmljb2RlIE9yZ2FuaXphdGlvbiAod3d3LnVuaWNvZGUub3JnKS4KKyAqIFRoZSBVbmljb2RlIHRvIGNoYXJzZXQgdGFibGUgaGFzIG9ubHkgZXhhY3QgbWFwcGluZ3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGNoYXJzZXQydW5pWzI1Nl0gPSB7CisJLyogMHgwMCovCisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLCAKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsIAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwgCisJMHgwMDBjLCAweDAwMGQsIDB4MDAwZSwgMHgwMDBmLCAKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsIAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywgCisJMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLCAKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsIAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgCisJMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LCAKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsIAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwgCisJLyogMHgzMCovCisJMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwgCisJMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLCAKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgCisJMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLCAKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsIAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgCisJMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsIAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwgCisJLyogMHg2MCovCisJMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwgCisJMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLCAKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgCisJMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLCAKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsIAorCS8qIDB4ODAqLworCTB4MDQwMiwgMHgwNDAzLCAweDIwMWEsIDB4MDQ1MywgCisJMHgyMDFlLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAKKwkweDIwYWMsIDB4MjAzMCwgMHgwNDA5LCAweDIwMzksIAorCTB4MDQwYSwgMHgwNDBjLCAweDA0MGIsIDB4MDQwZiwgCisJLyogMHg5MCovCisJMHgwNDUyLCAweDIwMTgsIDB4MjAxOSwgMHgyMDFjLCAKKwkweDIwMWQsIDB4MjAyMiwgMHgyMDEzLCAweDIwMTQsIAorCTB4MDAwMCwgMHgyMTIyLCAweDA0NTksIDB4MjAzYSwgCisJMHgwNDVhLCAweDA0NWMsIDB4MDQ1YiwgMHgwNDVmLCAKKwkvKiAweGEwKi8KKwkweDAwYTAsIDB4MDQwZSwgMHgwNDVlLCAweDA0MDgsIAorCTB4MDBhNCwgMHgwNDkwLCAweDAwYTYsIDB4MDBhNywgCisJMHgwNDAxLCAweDAwYTksIDB4MDQwNCwgMHgwMGFiLCAKKwkweDAwYWMsIDB4MDBhZCwgMHgwMGFlLCAweDA0MDcsIAorCS8qIDB4YjAqLworCTB4MDBiMCwgMHgwMGIxLCAweDA0MDYsIDB4MDQ1NiwgCisJMHgwNDkxLCAweDAwYjUsIDB4MDBiNiwgMHgwMGI3LCAKKwkweDA0NTEsIDB4MjExNiwgMHgwNDU0LCAweDAwYmIsIAorCTB4MDQ1OCwgMHgwNDA1LCAweDA0NTUsIDB4MDQ1NywgCisJLyogMHhjMCovCisJMHgwNDEwLCAweDA0MTEsIDB4MDQxMiwgMHgwNDEzLCAKKwkweDA0MTQsIDB4MDQxNSwgMHgwNDE2LCAweDA0MTcsIAorCTB4MDQxOCwgMHgwNDE5LCAweDA0MWEsIDB4MDQxYiwgCisJMHgwNDFjLCAweDA0MWQsIDB4MDQxZSwgMHgwNDFmLCAKKwkvKiAweGQwKi8KKwkweDA0MjAsIDB4MDQyMSwgMHgwNDIyLCAweDA0MjMsIAorCTB4MDQyNCwgMHgwNDI1LCAweDA0MjYsIDB4MDQyNywgCisJMHgwNDI4LCAweDA0MjksIDB4MDQyYSwgMHgwNDJiLCAKKwkweDA0MmMsIDB4MDQyZCwgMHgwNDJlLCAweDA0MmYsIAorCS8qIDB4ZTAqLworCTB4MDQzMCwgMHgwNDMxLCAweDA0MzIsIDB4MDQzMywgCisJMHgwNDM0LCAweDA0MzUsIDB4MDQzNiwgMHgwNDM3LCAKKwkweDA0MzgsIDB4MDQzOSwgMHgwNDNhLCAweDA0M2IsIAorCTB4MDQzYywgMHgwNDNkLCAweDA0M2UsIDB4MDQzZiwgCisJLyogMHhmMCovCisJMHgwNDQwLCAweDA0NDEsIDB4MDQ0MiwgMHgwNDQzLCAKKwkweDA0NDQsIDB4MDQ0NSwgMHgwNDQ2LCAweDA0NDcsIAorCTB4MDQ0OCwgMHgwNDQ5LCAweDA0NGEsIDB4MDQ0YiwgCisJMHgwNDRjLCAweDA0NGQsIDB4MDQ0ZSwgMHgwNDRmLCAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwMCwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHhhOSwgMHgwMCwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkMC0weGQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkOC0weGRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhlMC0weGU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhlOC0weGVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhmMC0weGY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDRbMjU2XSA9IHsKKwkweDAwLCAweGE4LCAweDgwLCAweDgxLCAweGFhLCAweGJkLCAweGIyLCAweGFmLCAvKiAweDAwLTB4MDcgKi8KKwkweGEzLCAweDhhLCAweDhjLCAweDhlLCAweDhkLCAweDAwLCAweGExLCAweDhmLCAvKiAweDA4LTB4MGYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweDEwLTB4MTcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweDE4LTB4MWYgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweDIwLTB4MjcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweDI4LTB4MmYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweDMwLTB4MzcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweDM4LTB4M2YgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweDQwLTB4NDcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweGI4LCAweDkwLCAweDgzLCAweGJhLCAweGJlLCAweGIzLCAweGJmLCAvKiAweDUwLTB4NTcgKi8KKwkweGJjLCAweDlhLCAweDljLCAweDllLCAweDlkLCAweDAwLCAweGEyLCAweDlmLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4YTUsIDB4YjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg5NywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHg5MSwgMHg5MiwgMHg4MiwgMHgwMCwgMHg5MywgMHg5NCwgMHg4NCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHg4NiwgMHg4NywgMHg5NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NSwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHg4OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHg4YiwgMHg5YiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjFbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI5LCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBwYWdlMDQsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCXBhZ2UyMCwgcGFnZTIxLCBOVUxMLAlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisJMHg5MCwgMHg4MywgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg5YSwgMHg4YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMiwgMHhhMiwgMHhiYywgMHhhNCwgMHhiNCwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhiOCwgMHhhOSwgMHhiYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhiZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMywgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZSwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhjMC0weGM3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhjOC0weGNmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhkMC0weGQ3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MSwgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg4MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg4YSwgMHg5YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMSwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMiwgMHhhNSwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhhOCwgMHhiOSwgMHhhYSwgMHhiYiwgMHhhMywgMHhiZCwgMHhiZCwgMHhhZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhlMC0weGU3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhlOC0weGVmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhmMC0weGY3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDEyNTEiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfY3AxMjUxKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfY3AxMjUxKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfY3AxMjUxKQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfY3AxMjUxKQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2NwMTI1NS5jIGIvZnMvbmxzL25sc19jcDEyNTUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmRlZWZlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19jcDEyNTUuYwpAQCAtMCwwICsxLDM4NSBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19jcDEyNTUuYworICoKKyAqIENoYXJzZXQgY3AxMjU1IHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIFRoZSBVbmljb2RlIHRvIGNoYXJzZXQgdGFibGUgaGFzIG9ubHkgZXhhY3QgbWFwcGluZ3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGNoYXJzZXQydW5pWzI1Nl0gPSB7CisJLyogMHgwMCovCisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLAorCTB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsCisJMHgwMDBjLCAweDAwMGQsIDB4MDAwZSwgMHgwMDBmLAorCS8qIDB4MTAqLworCTB4MDAxMCwgMHgwMDExLCAweDAwMTIsIDB4MDAxMywKKwkweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisJMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLAorCTB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwKKwkvKiAweDIwKi8KKwkweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsCisJMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorCTB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwKKwkweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisJLyogMHgzMCovCisJMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLAorCTB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKwkweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsCisJMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorCS8qIDB4NDAqLworCTB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywKKwkweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisJMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLAorCTB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKwkvKiAweDUwKi8KKwkweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsCisJMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwKKwkweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisJLyogMHg2MCovCisJMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAorCTB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKwkweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsCisJMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLAorCS8qIDB4NzAqLworCTB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywKKwkweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisJMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLAorCTB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDA3ZiwKKwkvKiAweDgwKi8KKwkweDIwYWMsIDB4MDAwMCwgMHgyMDFhLCAweDAxOTIsCisJMHgyMDFlLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLAorCTB4MDJjNiwgMHgyMDMwLCAweDAwMDAsIDB4MjAzOSwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogMHg5MCovCisJMHgwMDAwLCAweDIwMTgsIDB4MjAxOSwgMHgyMDFjLAorCTB4MjAxZCwgMHgyMDIyLCAweDIwMTMsIDB4MjAxNCwKKwkweDAyZGMsIDB4MjEyMiwgMHgwMDAwLCAweDIwM2EsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIDB4YTAqLworCTB4MDBhMCwgMHgwMGExLCAweDAwYTIsIDB4MDBhMywKKwkweDIwYWEsIDB4MDBhNSwgMHgwMGE2LCAweDAwYTcsCisJMHgwMGE4LCAweDAwYTksIDB4MDBkNywgMHgwMGFiLAorCTB4MDBhYywgMHgwMGFkLCAweDAwYWUsIDB4MjAzZSwKKwkvKiAweGIwKi8KKwkweDAwYjAsIDB4MDBiMSwgMHgwMGIyLCAweDAwYjMsCisJMHgwMGI0LCAweDAwYjUsIDB4MDBiNiwgMHgwMGI3LAorCTB4MDBiOCwgMHgwMGI5LCAweDAwZjcsIDB4MDBiYiwKKwkweDAwYmMsIDB4MDBiZCwgMHgwMGJlLCAweDAwYmYsCisJLyogMHhjMCovCisJMHgwNWIwLCAweDA1YjEsIDB4MDViMiwgMHgwNWIzLAorCTB4MDViNCwgMHgwNWI1LCAweDA1YjYsIDB4MDViNywKKwkweDA1YjgsIDB4MDViOSwgMHgwMDAwLCAweDA1YmIsCisJMHgwNWJjLCAweDA1YmQsIDB4MDViZSwgMHgwNWJmLAorCS8qIDB4ZDAqLworCTB4MDVjMCwgMHgwNWMxLCAweDA1YzIsIDB4MDVjMywKKwkweDA1ZjAsIDB4MDVmMSwgMHgwNWYyLCAweDA1ZjMsCisJMHgwNWY0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjAxNywKKwkvKiAweGUwKi8KKwkweDA1ZDAsIDB4MDVkMSwgMHgwNWQyLCAweDA1ZDMsCisJMHgwNWQ0LCAweDA1ZDUsIDB4MDVkNiwgMHgwNWQ3LAorCTB4MDVkOCwgMHgwNWQ5LCAweDA1ZGEsIDB4MDVkYiwKKwkweDA1ZGMsIDB4MDVkZCwgMHgwNWRlLCAweDA1ZGYsCisJLyogMHhmMCovCisJMHgwNWUwLCAweDA1ZTEsIDB4MDVlMiwgMHgwNWUzLAorCTB4MDVlNCwgMHgwNWU1LCAweDA1ZTYsIDB4MDVlNywKKwkweDA1ZTgsIDB4MDVlOSwgMHgwNWVhLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweDAwLCAweGEyLCAweGEzLCAweDAwLCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweDAwLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweDAwLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGMwLTB4YzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGFhLCAvKiAweGQwLTB4ZDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGUwLTB4ZTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGU4LTB4ZWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGJhLCAvKiAweGYwLTB4ZjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMVsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHg4MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDJbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4MDAsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZDAtMHhkNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTgsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZDgtMHhkZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTA1WzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGIwLTB4YjcgKi8KKwkweGM4LCAweGM5LCAweDAwLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGI4LTB4YmYgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGMwLTB4YzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGU4LTB4ZWYgKi8KKwkweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweDAwLCAweDAwLCAweDAwLCAvKiAweGYwLTB4ZjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMFsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmQsIDB4ZmUsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4OTcsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4OTEsIDB4OTIsIDB4ODIsIDB4MDAsIDB4OTMsIDB4OTQsIDB4ODQsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4ODYsIDB4ODcsIDB4OTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODUsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4ODksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4OGIsIDB4OWIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHgwMCwgMHhhNCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjFbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI5LCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBwYWdlMDEsIHBhZ2UwMiwgTlVMTCwgICBOVUxMLCAgIHBhZ2UwNSwgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCXBhZ2UyMCwgcGFnZTIxLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4MDAsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZDAtMHhkNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHgwMCwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHgwMCwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkMC0weGQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDEyNTUiLAorCS5hbGlhcwkJPSAiaXNvODg1OS04IiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2NwMTI1NSh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2NwMTI1NSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2NwMTI1NSkKK21vZHVsZV9leGl0KGV4aXRfbmxzX2NwMTI1NSkKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX0FMSUFTX05MUyhpc284ODU5LTgpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19jcDQzNy5jIGIvZnMvbmxzL25sc19jcDQzNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNGExY2QKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwNDM3LmMKQEAgLTAsMCArMSwzODggQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfY3A0MzcuYworICoKKyAqIENoYXJzZXQgY3A0MzcgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDBjNywgMHgwMGZjLCAweDAwZTksIDB4MDBlMiwKKwkweDAwZTQsIDB4MDBlMCwgMHgwMGU1LCAweDAwZTcsCisJMHgwMGVhLCAweDAwZWIsIDB4MDBlOCwgMHgwMGVmLAorCTB4MDBlZSwgMHgwMGVjLCAweDAwYzQsIDB4MDBjNSwKKwkvKiAweDkwKi8KKwkweDAwYzksIDB4MDBlNiwgMHgwMGM2LCAweDAwZjQsCisJMHgwMGY2LCAweDAwZjIsIDB4MDBmYiwgMHgwMGY5LAorCTB4MDBmZiwgMHgwMGQ2LCAweDAwZGMsIDB4MDBhMiwKKwkweDAwYTMsIDB4MDBhNSwgMHgyMGE3LCAweDAxOTIsCisJLyogMHhhMCovCisJMHgwMGUxLCAweDAwZWQsIDB4MDBmMywgMHgwMGZhLAorCTB4MDBmMSwgMHgwMGQxLCAweDAwYWEsIDB4MDBiYSwKKwkweDAwYmYsIDB4MjMxMCwgMHgwMGFjLCAweDAwYmQsCisJMHgwMGJjLCAweDAwYTEsIDB4MDBhYiwgMHgwMGJiLAorCS8qIDB4YjAqLworCTB4MjU5MSwgMHgyNTkyLCAweDI1OTMsIDB4MjUwMiwKKwkweDI1MjQsIDB4MjU2MSwgMHgyNTYyLCAweDI1NTYsCisJMHgyNTU1LCAweDI1NjMsIDB4MjU1MSwgMHgyNTU3LAorCTB4MjU1ZCwgMHgyNTVjLCAweDI1NWIsIDB4MjUxMCwKKwkvKiAweGMwKi8KKwkweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsCisJMHgyNTAwLCAweDI1M2MsIDB4MjU1ZSwgMHgyNTVmLAorCTB4MjU1YSwgMHgyNTU0LCAweDI1NjksIDB4MjU2NiwKKwkweDI1NjAsIDB4MjU1MCwgMHgyNTZjLCAweDI1NjcsCisJLyogMHhkMCovCisJMHgyNTY4LCAweDI1NjQsIDB4MjU2NSwgMHgyNTU5LAorCTB4MjU1OCwgMHgyNTUyLCAweDI1NTMsIDB4MjU2YiwKKwkweDI1NmEsIDB4MjUxOCwgMHgyNTBjLCAweDI1ODgsCisJMHgyNTg0LCAweDI1OGMsIDB4MjU5MCwgMHgyNTgwLAorCS8qIDB4ZTAqLworCTB4MDNiMSwgMHgwMGRmLCAweDAzOTMsIDB4MDNjMCwKKwkweDAzYTMsIDB4MDNjMywgMHgwMGI1LCAweDAzYzQsCisJMHgwM2E2LCAweDAzOTgsIDB4MDNhOSwgMHgwM2I0LAorCTB4MjIxZSwgMHgwM2M2LCAweDAzYjUsIDB4MjIyOSwKKwkvKiAweGYwKi8KKwkweDIyNjEsIDB4MDBiMSwgMHgyMjY1LCAweDIyNjQsCisJMHgyMzIwLCAweDIzMjEsIDB4MDBmNywgMHgyMjQ4LAorCTB4MDBiMCwgMHgyMjE5LCAweDAwYjcsIDB4MjIxYSwKKwkweDIwN2YsIDB4MDBiMiwgMHgyNWEwLCAweDAwYTAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmYsIDB4YWQsIDB4OWIsIDB4OWMsIDB4MDAsIDB4OWQsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4YTYsIDB4YWUsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4ZjgsIDB4ZjEsIDB4ZmQsIDB4MDAsIDB4MDAsIDB4ZTYsIDB4MDAsIDB4ZmEsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4YTcsIDB4YWYsIDB4YWMsIDB4YWIsIDB4MDAsIDB4YTgsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGUsIDB4OGYsIDB4OTIsIDB4ODAsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4OTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4YTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTksIDB4MDAsIC8qIDB4ZDAtMHhkNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OWEsIDB4MDAsIDB4MDAsIDB4ZTEsIC8qIDB4ZDgtMHhkZiAqLworCTB4ODUsIDB4YTAsIDB4ODMsIDB4MDAsIDB4ODQsIDB4ODYsIDB4OTEsIDB4ODcsIC8qIDB4ZTAtMHhlNyAqLworCTB4OGEsIDB4ODIsIDB4ODgsIDB4ODksIDB4OGQsIDB4YTEsIDB4OGMsIDB4OGIsIC8qIDB4ZTgtMHhlZiAqLworCTB4MDAsIDB4YTQsIDB4OTUsIDB4YTIsIDB4OTMsIDB4MDAsIDB4OTQsIDB4ZjYsIC8qIDB4ZjAtMHhmNyAqLworCTB4MDAsIDB4OTcsIDB4YTMsIDB4OTYsIDB4ODEsIDB4MDAsIDB4MDAsIDB4OTgsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAxWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDlmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwM1syNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhlMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHhlOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhlNCwgMHgwMCwgMHgwMCwgMHhlOCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHhlYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHgwMCwgMHhlMCwgMHgwMCwgMHgwMCwgMHhlYiwgMHhlZSwgMHgwMCwgMHgwMCwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHhlMywgMHgwMCwgMHgwMCwgMHhlNSwgMHhlNywgMHgwMCwgMHhlZCwgMHgwMCwgLyogMHhjMC0weGM3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjBbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZjLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OWUsIC8qIDB4YTAtMHhhNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHhmOSwgMHhmYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhlYywgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHhlZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHhmNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHhmMywgMHhmMiwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjNbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweGE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweGY0LCAweGY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyNVsyNTZdID0geworCTB4YzQsIDB4MDAsIDB4YjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGEsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4YmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4ZDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzMsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjQsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzIsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzEsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzUsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4Y2QsIDB4YmEsIDB4ZDUsIDB4ZDYsIDB4YzksIDB4YjgsIDB4YjcsIDB4YmIsIC8qIDB4NTAtMHg1NyAqLworCTB4ZDQsIDB4ZDMsIDB4YzgsIDB4YmUsIDB4YmQsIDB4YmMsIDB4YzYsIDB4YzcsIC8qIDB4NTgtMHg1ZiAqLworCTB4Y2MsIDB4YjUsIDB4YjYsIDB4YjksIDB4ZDEsIDB4ZDIsIDB4Y2IsIDB4Y2YsIC8qIDB4NjAtMHg2NyAqLworCTB4ZDAsIDB4Y2EsIDB4ZDgsIDB4ZDcsIDB4Y2UsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHhkZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkYywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHhkYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkZCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHhkZSwgMHhiMCwgMHhiMSwgMHhiMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhmZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFnZV91bmkyY2hhcnNldFsyNTZdID0geworCXBhZ2UwMCwgcGFnZTAxLCBOVUxMLCAgIHBhZ2UwMywgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlwYWdlMjAsIE5VTEwsICAgcGFnZTIyLCBwYWdlMjMsIE5VTEwsICAgcGFnZTI1LCBOVUxMLCAgIE5VTEwsICAgCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg0MC0weDQ3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg0OC0weDRmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg1MC0weDU3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDg3LCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDg0LCAweDg2LCAvKiAweDg4LTB4OGYgKi8KKwkweDgyLCAweDkxLCAweDkxLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk0LCAweDgxLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE0LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweDAwLCAweGUzLCAweGU1LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGVkLCAweDAwLCAweDAwLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4OWEsIDB4OTAsIDB4MDAsIDB4OGUsIDB4MDAsIDB4OGYsIDB4ODAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTIsIDB4OTIsIDB4MDAsIDB4OTksIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTUsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4MDAsIDB4ZTEsIDB4ZTIsIDB4MDAsIDB4ZTQsIDB4ZTQsIDB4MDAsIDB4MDAsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4MDAsIDB4ZWMsIDB4ZTgsIDB4MDAsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSAmIDB4MDBmZjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaSAmIDB4ZmYwMCkgPj4gODsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXVuaTJjaGFyc2V0ID0gcGFnZV91bmkyY2hhcnNldFtjaF07CisJaWYgKHVuaTJjaGFyc2V0ICYmIHVuaTJjaGFyc2V0W2NsXSkKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2xdOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKwkqdW5pID0gY2hhcnNldDJ1bmlbKnJhd3N0cmluZ107CisJaWYgKCp1bmkgPT0gMHgwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAiY3A0MzciLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfY3A0Mzcodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sc19jcDQzNyh2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2NwNDM3KQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfY3A0MzcpCisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfY3A3MzcuYyBiL2ZzL25scy9ubHNfY3A3MzcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGIzY2E4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19jcDczNy5jCkBAIC0wLDAgKzEsMzUxIEBACisvKgorICogbGludXgvZnMvbmxzX2NwNzM3LmMKKyAqCisgKiBDaGFyc2V0IGNwNzM3IHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIFVuaWNvZGUgYW5kIGNoYXJzZXQKKyAqIHRhYmxlcyBmcm9tIHRoZSBVbmljb2RlIE9yZ2FuaXphdGlvbiAod3d3LnVuaWNvZGUub3JnKS4KKyAqIFRoZSBVbmljb2RlIHRvIGNoYXJzZXQgdGFibGUgaGFzIG9ubHkgZXhhY3QgbWFwcGluZ3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGNoYXJzZXQydW5pWzI1Nl0gPSB7CisJLyogMHgwMCovCisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLAorCTB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsCisJMHgwMDBjLCAweDAwMGQsIDB4MDAwZSwgMHgwMDBmLAorCS8qIDB4MTAqLworCTB4MDAxMCwgMHgwMDExLCAweDAwMTIsIDB4MDAxMywKKwkweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisJMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLAorCTB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwKKwkvKiAweDIwKi8KKwkweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsCisJMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorCTB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwKKwkweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisJLyogMHgzMCovCisJMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLAorCTB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKwkweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsCisJMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorCS8qIDB4NDAqLworCTB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywKKwkweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisJMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLAorCTB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKwkvKiAweDUwKi8KKwkweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsCisJMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwKKwkweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisJLyogMHg2MCovCisJMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAorCTB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKwkweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsCisJMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLAorCS8qIDB4NzAqLworCTB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywKKwkweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisJMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLAorCTB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDA3ZiwKKwkvKiAweDgwKi8KKwkweDAzOTEsIDB4MDM5MiwgMHgwMzkzLCAweDAzOTQsCisJMHgwMzk1LCAweDAzOTYsIDB4MDM5NywgMHgwMzk4LAorCTB4MDM5OSwgMHgwMzlhLCAweDAzOWIsIDB4MDM5YywKKwkweDAzOWQsIDB4MDM5ZSwgMHgwMzlmLCAweDAzYTAsCisJLyogMHg5MCovCisJMHgwM2ExLCAweDAzYTMsIDB4MDNhNCwgMHgwM2E1LAorCTB4MDNhNiwgMHgwM2E3LCAweDAzYTgsIDB4MDNhOSwKKwkweDAzYjEsIDB4MDNiMiwgMHgwM2IzLCAweDAzYjQsCisJMHgwM2I1LCAweDAzYjYsIDB4MDNiNywgMHgwM2I4LAorCS8qIDB4YTAqLworCTB4MDNiOSwgMHgwM2JhLCAweDAzYmIsIDB4MDNiYywKKwkweDAzYmQsIDB4MDNiZSwgMHgwM2JmLCAweDAzYzAsCisJMHgwM2MxLCAweDAzYzMsIDB4MDNjMiwgMHgwM2M0LAorCTB4MDNjNSwgMHgwM2M2LCAweDAzYzcsIDB4MDNjOCwKKwkvKiAweGIwKi8KKwkweDI1OTEsIDB4MjU5MiwgMHgyNTkzLCAweDI1MDIsCisJMHgyNTI0LCAweDI1NjEsIDB4MjU2MiwgMHgyNTU2LAorCTB4MjU1NSwgMHgyNTYzLCAweDI1NTEsIDB4MjU1NywKKwkweDI1NWQsIDB4MjU1YywgMHgyNTViLCAweDI1MTAsCisJLyogMHhjMCovCisJMHgyNTE0LCAweDI1MzQsIDB4MjUyYywgMHgyNTFjLAorCTB4MjUwMCwgMHgyNTNjLCAweDI1NWUsIDB4MjU1ZiwKKwkweDI1NWEsIDB4MjU1NCwgMHgyNTY5LCAweDI1NjYsCisJMHgyNTYwLCAweDI1NTAsIDB4MjU2YywgMHgyNTY3LAorCS8qIDB4ZDAqLworCTB4MjU2OCwgMHgyNTY0LCAweDI1NjUsIDB4MjU1OSwKKwkweDI1NTgsIDB4MjU1MiwgMHgyNTUzLCAweDI1NmIsCisJMHgyNTZhLCAweDI1MTgsIDB4MjUwYywgMHgyNTg4LAorCTB4MjU4NCwgMHgyNThjLCAweDI1OTAsIDB4MjU4MCwKKwkvKiAweGUwKi8KKwkweDAzYzksIDB4MDNhYywgMHgwM2FkLCAweDAzYWUsCisJMHgwM2NhLCAweDAzYWYsIDB4MDNjYywgMHgwM2NkLAorCTB4MDNjYiwgMHgwM2NlLCAweDAzODYsIDB4MDM4OCwKKwkweDAzODksIDB4MDM4YSwgMHgwMzhjLCAweDAzOGUsCisJLyogMHhmMCovCisJMHgwMzhmLCAweDAwYjEsIDB4MjI2NSwgMHgyMjY0LAorCTB4MDNhYSwgMHgwM2FiLCAweDAwZjcsIDB4MjI0OCwKKwkweDAwYjAsIDB4MjIxOSwgMHgwMGI3LCAweDIyMWEsCisJMHgyMDdmLCAweDAwYjIsIDB4MjVhMCwgMHgwMGEwLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweGY4LCAweGYxLCAweGZkLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZhLCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGMwLTB4YzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQwLTB4ZDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGUwLTB4ZTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGU4LTB4ZWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGY2LCAvKiAweGYwLTB4ZjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwM1syNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhlYSwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHhlYiwgMHhlYywgMHhlZCwgMHgwMCwgMHhlZSwgMHgwMCwgMHhlZiwgMHhmMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgLyogMHg5MC0weDk3ICovCisJMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgLyogMHg5OC0weDlmICovCisJMHg4ZiwgMHg5MCwgMHgwMCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgLyogMHhhMC0weGE3ICovCisJMHg5NiwgMHg5NywgMHhmNCwgMHhmNSwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNSwgLyogMHhhOC0weGFmICovCisJMHgwMCwgMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgLyogMHhiMC0weGI3ICovCisJMHg5ZiwgMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgLyogMHhiOC0weGJmICovCisJMHhhNywgMHhhOCwgMHhhYSwgMHhhOSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgLyogMHhjMC0weGM3ICovCisJMHhhZiwgMHhlMCwgMHhlNCwgMHhlOCwgMHhlNiwgMHhlNywgMHhlOSwgMHgwMCwgLyogMHhjOC0weGNmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjBbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZjLCAvKiAweDc4LTB4N2YgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMlsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4ZjksIDB4ZmIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4ZjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjMsIDB4ZjIsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTI1WzI1Nl0gPSB7CisJMHhjNCwgMHgwMCwgMHhiMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkYSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHhiZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHhkOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjNSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHhjZCwgMHhiYSwgMHhkNSwgMHhkNiwgMHhjOSwgMHhiOCwgMHhiNywgMHhiYiwgLyogMHg1MC0weDU3ICovCisJMHhkNCwgMHhkMywgMHhjOCwgMHhiZSwgMHhiZCwgMHhiYywgMHhjNiwgMHhjNywgLyogMHg1OC0weDVmICovCisJMHhjYywgMHhiNSwgMHhiNiwgMHhiOSwgMHhkMSwgMHhkMiwgMHhjYiwgMHhjZiwgLyogMHg2MC0weDY3ICovCisJMHhkMCwgMHhjYSwgMHhkOCwgMHhkNywgMHhjZSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweGRmLCAweDAwLCAweDAwLCAweDAwLCAweGRjLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweGRiLCAweDAwLCAweDAwLCAweDAwLCAweGRkLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweGRlLCAweGIwLCAweGIxLCAweGIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBOVUxMLCAgIE5VTEwsICAgcGFnZTAzLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCXBhZ2UyMCwgTlVMTCwgICBwYWdlMjIsIE5VTEwsICAgTlVMTCwgICBwYWdlMjUsIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4ODAtMHg4NyAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4ODgtMHg4ZiAqLworCTB4YTgsIDB4YTksIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIDB4ZTAsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZTksIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZTQsIDB4ZTgsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg5OC0weDlmICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHhhMC0weGE3ICovCisJMHg5MCwgMHg5MSwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHg5NywgMHhlYSwgMHhlYiwgMHhlYywgMHhmNCwgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlMC0weGU3ICovCisJMHhmNSwgMHhmMCwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDczNyIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19jcDczNyh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2NwNzM3KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfY3A3MzcpCittb2R1bGVfZXhpdChleGl0X25sc19jcDczNykKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19jcDc3NS5jIGIvZnMvbmxzL25sc19jcDc3NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYjI5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwNzc1LmMKQEAgLTAsMCArMSwzMjAgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfY3A3NzUuYworICoKKyAqIENoYXJzZXQgY3A3NzUgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDEwNiwgMHgwMGZjLCAweDAwZTksIDB4MDEwMSwKKwkweDAwZTQsIDB4MDEyMywgMHgwMGU1LCAweDAxMDcsCisJMHgwMTQyLCAweDAxMTMsIDB4MDE1NiwgMHgwMTU3LAorCTB4MDEyYiwgMHgwMTc5LCAweDAwYzQsIDB4MDBjNSwKKwkvKiAweDkwKi8KKwkweDAwYzksIDB4MDBlNiwgMHgwMGM2LCAweDAxNGQsCisJMHgwMGY2LCAweDAxMjIsIDB4MDBhMiwgMHgwMTVhLAorCTB4MDE1YiwgMHgwMGQ2LCAweDAwZGMsIDB4MDBmOCwKKwkweDAwYTMsIDB4MDBkOCwgMHgwMGQ3LCAweDAwYTQsCisJLyogMHhhMCovCisJMHgwMTAwLCAweDAxMmEsIDB4MDBmMywgMHgwMTdiLAorCTB4MDE3YywgMHgwMTdhLCAweDIwMWQsIDB4MDBhNiwKKwkweDAwYTksIDB4MDBhZSwgMHgwMGFjLCAweDAwYmQsCisJMHgwMGJjLCAweDAxNDEsIDB4MDBhYiwgMHgwMGJiLAorCS8qIDB4YjAqLworCTB4MjU5MSwgMHgyNTkyLCAweDI1OTMsIDB4MjUwMiwKKwkweDI1MjQsIDB4MDEwNCwgMHgwMTBjLCAweDAxMTgsCisJMHgwMTE2LCAweDI1NjMsIDB4MjU1MSwgMHgyNTU3LAorCTB4MjU1ZCwgMHgwMTJlLCAweDAxNjAsIDB4MjUxMCwKKwkvKiAweGMwKi8KKwkweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsCisJMHgyNTAwLCAweDI1M2MsIDB4MDE3MiwgMHgwMTZhLAorCTB4MjU1YSwgMHgyNTU0LCAweDI1NjksIDB4MjU2NiwKKwkweDI1NjAsIDB4MjU1MCwgMHgyNTZjLCAweDAxN2QsCisJLyogMHhkMCovCisJMHgwMTA1LCAweDAxMGQsIDB4MDExOSwgMHgwMTE3LAorCTB4MDEyZiwgMHgwMTYxLCAweDAxNzMsIDB4MDE2YiwKKwkweDAxN2UsIDB4MjUxOCwgMHgyNTBjLCAweDI1ODgsCisJMHgyNTg0LCAweDI1OGMsIDB4MjU5MCwgMHgyNTgwLAorCS8qIDB4ZTAqLworCTB4MDBkMywgMHgwMGRmLCAweDAxNGMsIDB4MDE0MywKKwkweDAwZjUsIDB4MDBkNSwgMHgwMGI1LCAweDAxNDQsCisJMHgwMTM2LCAweDAxMzcsIDB4MDEzYiwgMHgwMTNjLAorCTB4MDE0NiwgMHgwMTEyLCAweDAxNDUsIDB4MjAxOSwKKwkvKiAweGYwKi8KKwkweDAwYWQsIDB4MDBiMSwgMHgyMDFjLCAweDAwYmUsCisJMHgwMGI2LCAweDAwYTcsIDB4MDBmNywgMHgyMDFlLAorCTB4MDBiMCwgMHgyMjE5LCAweDAwYjcsIDB4MDBiOSwKKwkweDAwYjMsIDB4MDBiMiwgMHgyNWEwLCAweDAwYTAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmYsIDB4MDAsIDB4OTYsIDB4OWMsIDB4OWYsIDB4MDAsIDB4YTcsIDB4ZjUsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4YTgsIDB4MDAsIDB4YWUsIDB4YWEsIDB4ZjAsIDB4YTksIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4ZjgsIDB4ZjEsIDB4ZmQsIDB4ZmMsIDB4MDAsIDB4ZTYsIDB4ZjQsIDB4ZmEsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4ZmIsIDB4MDAsIDB4YWYsIDB4YWMsIDB4YWIsIDB4ZjMsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGUsIDB4OGYsIDB4OTIsIDB4MDAsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4OTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4ZTUsIDB4OTksIDB4OWUsIC8qIDB4ZDAtMHhkNyAqLworCTB4OWQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OWEsIDB4MDAsIDB4MDAsIDB4ZTEsIC8qIDB4ZDgtMHhkZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODQsIDB4ODYsIDB4OTEsIDB4MDAsIC8qIDB4ZTAtMHhlNyAqLworCTB4MDAsIDB4ODIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZTgtMHhlZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4YTIsIDB4MDAsIDB4ZTQsIDB4OTQsIDB4ZjYsIC8qIDB4ZjAtMHhmNyAqLworCTB4OWIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAxWzI1Nl0gPSB7CisJMHhhMCwgMHg4MywgMHgwMCwgMHgwMCwgMHhiNSwgMHhkMCwgMHg4MCwgMHg4NywgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNiwgMHhkMSwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHhlZCwgMHg4OSwgMHgwMCwgMHgwMCwgMHhiOCwgMHhkMywgLyogMHgxMC0weDE3ICovCisJMHhiNywgMHhkMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHg4NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhhMSwgMHg4YywgMHgwMCwgMHgwMCwgMHhiZCwgMHhkNCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhlOCwgMHhlOSwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhlYSwgMHhlYiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHhhZCwgMHg4OCwgMHhlMywgMHhlNywgMHhlZSwgMHhlYywgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhlMiwgMHg5MywgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4YSwgMHg4YiwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHg5OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHhiZSwgMHhkNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhjNywgMHhkNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHhjNiwgMHhkNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHg4ZCwgMHhhNSwgMHhhMywgMHhhNCwgMHhjZiwgMHhkOCwgMHgwMCwgLyogMHg3OC0weDdmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjBbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweGVmLCAweDAwLCAweDAwLCAweGYyLCAweGE2LCAweGY3LCAweDAwLCAvKiAweDE4LTB4MWYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMlsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4ZjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTI1WzI1Nl0gPSB7CisJMHhjNCwgMHgwMCwgMHhiMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkYSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHhiZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHhkOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjNSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHhjZCwgMHhiYSwgMHgwMCwgMHgwMCwgMHhjOSwgMHgwMCwgMHgwMCwgMHhiYiwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhjOCwgMHgwMCwgMHgwMCwgMHhiYywgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHhjYywgMHgwMCwgMHgwMCwgMHhiOSwgMHgwMCwgMHgwMCwgMHhjYiwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHhjYSwgMHgwMCwgMHgwMCwgMHhjZSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweGRmLCAweDAwLCAweDAwLCAweDAwLCAweGRjLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweGRiLCAweDAwLCAweDAwLCAweDAwLCAweGRkLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweGRlLCAweGIwLCAweGIxLCAweGIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBwYWdlMDEsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCXBhZ2UyMCwgTlVMTCwgICBwYWdlMjIsIE5VTEwsICAgTlVMTCwgICBwYWdlMjUsIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODcsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGIsIDB4OGIsIDB4OGMsIDB4YTUsIDB4ODQsIDB4ODYsIC8qIDB4ODgtMHg4ZiAqLworCTB4ODIsIDB4OTEsIDB4OTEsIDB4OTMsIDB4OTQsIDB4ODUsIDB4OTYsIDB4OTgsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTQsIDB4ODEsIDB4OWIsIDB4OWMsIDB4OWIsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4ODMsIDB4OGMsIDB4YTIsIDB4YTQsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4ODgsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4ZDAsIDB4ZDEsIDB4ZDIsIC8qIDB4YjAtMHhiNyAqLworCTB4ZDMsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4ZDQsIDB4ZDUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4ZDYsIDB4ZDcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4ZDgsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4YTIsIDB4ZTEsIDB4OTMsIDB4ZTcsIDB4ZTQsIDB4ZTQsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTksIDB4ZTksIDB4ZWIsIDB4ZWIsIDB4ZWMsIDB4ODksIDB4ZWMsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg5YSwgMHg5MCwgMHhhMCwgMHg4ZSwgMHg5NSwgMHg4ZiwgMHg4MCwgLyogMHg4MC0weDg3ICovCisJMHhhZCwgMHhlZCwgMHg4YSwgMHg4YSwgMHhhMSwgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MiwgMHg5MiwgMHhlMiwgMHg5OSwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5NywgMHg5OSwgMHg5YSwgMHg5ZCwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhlMCwgMHhhMywgMHhhMywgMHg4ZCwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiZCwgMHhiZSwgMHhjNiwgMHhjNywgLyogMHhkMC0weGQ3ICovCisJMHhjZiwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNSwgMHhlNSwgMHgwMCwgMHhlMywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOCwgMHhlYSwgMHhlYSwgMHhlZSwgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDc3NSIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19jcDc3NSh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2NwNzc1KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfY3A3NzUpCittb2R1bGVfZXhpdChleGl0X25sc19jcDc3NSkKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19jcDg1MC5jIGIvZnMvbmxzL25sc19jcDg1MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZGVhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwODUwLmMKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfY3A4NTAuYworICoKKyAqIENoYXJzZXQgY3A4NTAgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDBjNywgMHgwMGZjLCAweDAwZTksIDB4MDBlMiwKKwkweDAwZTQsIDB4MDBlMCwgMHgwMGU1LCAweDAwZTcsCisJMHgwMGVhLCAweDAwZWIsIDB4MDBlOCwgMHgwMGVmLAorCTB4MDBlZSwgMHgwMGVjLCAweDAwYzQsIDB4MDBjNSwKKwkvKiAweDkwKi8KKwkweDAwYzksIDB4MDBlNiwgMHgwMGM2LCAweDAwZjQsCisJMHgwMGY2LCAweDAwZjIsIDB4MDBmYiwgMHgwMGY5LAorCTB4MDBmZiwgMHgwMGQ2LCAweDAwZGMsIDB4MDBmOCwKKwkweDAwYTMsIDB4MDBkOCwgMHgwMGQ3LCAweDAxOTIsCisJLyogMHhhMCovCisJMHgwMGUxLCAweDAwZWQsIDB4MDBmMywgMHgwMGZhLAorCTB4MDBmMSwgMHgwMGQxLCAweDAwYWEsIDB4MDBiYSwKKwkweDAwYmYsIDB4MDBhZSwgMHgwMGFjLCAweDAwYmQsCisJMHgwMGJjLCAweDAwYTEsIDB4MDBhYiwgMHgwMGJiLAorCS8qIDB4YjAqLworCTB4MjU5MSwgMHgyNTkyLCAweDI1OTMsIDB4MjUwMiwKKwkweDI1MjQsIDB4MDBjMSwgMHgwMGMyLCAweDAwYzAsCisJMHgwMGE5LCAweDI1NjMsIDB4MjU1MSwgMHgyNTU3LAorCTB4MjU1ZCwgMHgwMGEyLCAweDAwYTUsIDB4MjUxMCwKKwkvKiAweGMwKi8KKwkweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsCisJMHgyNTAwLCAweDI1M2MsIDB4MDBlMywgMHgwMGMzLAorCTB4MjU1YSwgMHgyNTU0LCAweDI1NjksIDB4MjU2NiwKKwkweDI1NjAsIDB4MjU1MCwgMHgyNTZjLCAweDAwYTQsCisJLyogMHhkMCovCisJMHgwMGYwLCAweDAwZDAsIDB4MDBjYSwgMHgwMGNiLAorCTB4MDBjOCwgMHgwMTMxLCAweDAwY2QsIDB4MDBjZSwKKwkweDAwY2YsIDB4MjUxOCwgMHgyNTBjLCAweDI1ODgsCisJMHgyNTg0LCAweDAwYTYsIDB4MDBjYywgMHgyNTgwLAorCS8qIDB4ZTAqLworCTB4MDBkMywgMHgwMGRmLCAweDAwZDQsIDB4MDBkMiwKKwkweDAwZjUsIDB4MDBkNSwgMHgwMGI1LCAweDAwZmUsCisJMHgwMGRlLCAweDAwZGEsIDB4MDBkYiwgMHgwMGQ5LAorCTB4MDBmZCwgMHgwMGRkLCAweDAwYWYsIDB4MDBiNCwKKwkvKiAweGYwKi8KKwkweDAwYWQsIDB4MDBiMSwgMHgyMDE3LCAweDAwYmUsCisJMHgwMGI2LCAweDAwYTcsIDB4MDBmNywgMHgwMGI4LAorCTB4MDBiMCwgMHgwMGE4LCAweDAwYjcsIDB4MDBiOSwKKwkweDAwYjMsIDB4MDBiMiwgMHgyNWEwLCAweDAwYTAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmYsIDB4YWQsIDB4YmQsIDB4OWMsIDB4Y2YsIDB4YmUsIDB4ZGQsIDB4ZjUsIC8qIDB4YTAtMHhhNyAqLworCTB4ZjksIDB4YjgsIDB4YTYsIDB4YWUsIDB4YWEsIDB4ZjAsIDB4YTksIDB4ZWUsIC8qIDB4YTgtMHhhZiAqLworCTB4ZjgsIDB4ZjEsIDB4ZmQsIDB4ZmMsIDB4ZWYsIDB4ZTYsIDB4ZjQsIDB4ZmEsIC8qIDB4YjAtMHhiNyAqLworCTB4ZjcsIDB4ZmIsIDB4YTcsIDB4YWYsIDB4YWMsIDB4YWIsIDB4ZjMsIDB4YTgsIC8qIDB4YjgtMHhiZiAqLworCTB4YjcsIDB4YjUsIDB4YjYsIDB4YzcsIDB4OGUsIDB4OGYsIDB4OTIsIDB4ODAsIC8qIDB4YzAtMHhjNyAqLworCTB4ZDQsIDB4OTAsIDB4ZDIsIDB4ZDMsIDB4ZGUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDEsIDB4YTUsIDB4ZTMsIDB4ZTAsIDB4ZTIsIDB4ZTUsIDB4OTksIDB4OWUsIC8qIDB4ZDAtMHhkNyAqLworCTB4OWQsIDB4ZWIsIDB4ZTksIDB4ZWEsIDB4OWEsIDB4ZWQsIDB4ZTgsIDB4ZTEsIC8qIDB4ZDgtMHhkZiAqLworCTB4ODUsIDB4YTAsIDB4ODMsIDB4YzYsIDB4ODQsIDB4ODYsIDB4OTEsIDB4ODcsIC8qIDB4ZTAtMHhlNyAqLworCTB4OGEsIDB4ODIsIDB4ODgsIDB4ODksIDB4OGQsIDB4YTEsIDB4OGMsIDB4OGIsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZDAsIDB4YTQsIDB4OTUsIDB4YTIsIDB4OTMsIDB4ZTQsIDB4OTQsIDB4ZjYsIC8qIDB4ZjAtMHhmNyAqLworCTB4OWIsIDB4OTcsIDB4YTMsIDB4OTYsIDB4ODEsIDB4ZWMsIDB4ZTcsIDB4OTgsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAxWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHhkNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDlmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMFsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjIsIC8qIDB4MTAtMHgxNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTI1WzI1Nl0gPSB7CisJMHhjNCwgMHgwMCwgMHhiMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkYSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHhiZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHhkOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjNSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHhjZCwgMHhiYSwgMHgwMCwgMHgwMCwgMHhjOSwgMHgwMCwgMHgwMCwgMHhiYiwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhjOCwgMHgwMCwgMHgwMCwgMHhiYywgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHhjYywgMHgwMCwgMHgwMCwgMHhiOSwgMHgwMCwgMHgwMCwgMHhjYiwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHhjYSwgMHgwMCwgMHgwMCwgMHhjZSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweGRmLCAweDAwLCAweDAwLCAweDAwLCAweGRjLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweGRiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweGIwLCAweGIxLCAweGIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBwYWdlMDEsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCXBhZ2UyMCwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBwYWdlMjUsIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODcsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4ODQsIDB4ODYsIC8qIDB4ODgtMHg4ZiAqLworCTB4ODIsIDB4OTEsIDB4OTEsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTQsIDB4ODEsIDB4OWIsIDB4OWMsIDB4OWIsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTQsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YTAsIDB4ODMsIDB4ODUsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzYsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDAsIDB4ODgsIDB4ODksIDB4OGEsIDB4ZDUsIDB4YTEsIDB4OGMsIC8qIDB4ZDAtMHhkNyAqLworCTB4OGIsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4OGQsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4YTIsIDB4ZTEsIDB4OTMsIDB4OTUsIDB4ZTQsIDB4ZTQsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTcsIDB4YTMsIDB4OTYsIDB4OTcsIDB4ZWMsIDB4ZWMsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg5YSwgMHg5MCwgMHhiNiwgMHg4ZSwgMHhiNywgMHg4ZiwgMHg4MCwgLyogMHg4MC0weDg3ICovCisJMHhkMiwgMHhkMywgMHhkNCwgMHhkOCwgMHhkNywgMHhkZSwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MiwgMHg5MiwgMHhlMiwgMHg5OSwgMHhlMywgMHhlYSwgMHhlYiwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHg5OSwgMHg5YSwgMHg5ZCwgMHg5YywgMHg5ZCwgMHg5ZSwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhiNSwgMHhkNiwgMHhlMCwgMHhlOSwgMHhhNSwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNywgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMSwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHg0OSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNSwgMHhlNSwgMHgwMCwgMHhlOCwgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlZCwgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDg1MCIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19jcDg1MCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2NwODUwKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfY3A4NTApCittb2R1bGVfZXhpdChleGl0X25sc19jcDg1MCkKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19jcDg1Mi5jIGIvZnMvbmxzL25sc19jcDg1Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MjJhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwODUyLmMKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfY3A4NTIuYworICoKKyAqIENoYXJzZXQgY3A4NTIgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDBjNywgMHgwMGZjLCAweDAwZTksIDB4MDBlMiwKKwkweDAwZTQsIDB4MDE2ZiwgMHgwMTA3LCAweDAwZTcsCisJMHgwMTQyLCAweDAwZWIsIDB4MDE1MCwgMHgwMTUxLAorCTB4MDBlZSwgMHgwMTc5LCAweDAwYzQsIDB4MDEwNiwKKwkvKiAweDkwKi8KKwkweDAwYzksIDB4MDEzOSwgMHgwMTNhLCAweDAwZjQsCisJMHgwMGY2LCAweDAxM2QsIDB4MDEzZSwgMHgwMTVhLAorCTB4MDE1YiwgMHgwMGQ2LCAweDAwZGMsIDB4MDE2NCwKKwkweDAxNjUsIDB4MDE0MSwgMHgwMGQ3LCAweDAxMGQsCisJLyogMHhhMCovCisJMHgwMGUxLCAweDAwZWQsIDB4MDBmMywgMHgwMGZhLAorCTB4MDEwNCwgMHgwMTA1LCAweDAxN2QsIDB4MDE3ZSwKKwkweDAxMTgsIDB4MDExOSwgMHgwMGFjLCAweDAxN2EsCisJMHgwMTBjLCAweDAxNWYsIDB4MDBhYiwgMHgwMGJiLAorCS8qIDB4YjAqLworCTB4MjU5MSwgMHgyNTkyLCAweDI1OTMsIDB4MjUwMiwKKwkweDI1MjQsIDB4MDBjMSwgMHgwMGMyLCAweDAxMWEsCisJMHgwMTVlLCAweDI1NjMsIDB4MjU1MSwgMHgyNTU3LAorCTB4MjU1ZCwgMHgwMTdiLCAweDAxN2MsIDB4MjUxMCwKKwkvKiAweGMwKi8KKwkweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsCisJMHgyNTAwLCAweDI1M2MsIDB4MDEwMiwgMHgwMTAzLAorCTB4MjU1YSwgMHgyNTU0LCAweDI1NjksIDB4MjU2NiwKKwkweDI1NjAsIDB4MjU1MCwgMHgyNTZjLCAweDAwYTQsCisJLyogMHhkMCovCisJMHgwMTExLCAweDAxMTAsIDB4MDEwZSwgMHgwMGNiLAorCTB4MDEwZiwgMHgwMTQ3LCAweDAwY2QsIDB4MDBjZSwKKwkweDAxMWIsIDB4MjUxOCwgMHgyNTBjLCAweDI1ODgsCisJMHgyNTg0LCAweDAxNjIsIDB4MDE2ZSwgMHgyNTgwLAorCS8qIDB4ZTAqLworCTB4MDBkMywgMHgwMGRmLCAweDAwZDQsIDB4MDE0MywKKwkweDAxNDQsIDB4MDE0OCwgMHgwMTYwLCAweDAxNjEsCisJMHgwMTU0LCAweDAwZGEsIDB4MDE1NSwgMHgwMTcwLAorCTB4MDBmZCwgMHgwMGRkLCAweDAxNjMsIDB4MDBiNCwKKwkvKiAweGYwKi8KKwkweDAwYWQsIDB4MDJkZCwgMHgwMmRiLCAweDAyYzcsCisJMHgwMmQ4LCAweDAwYTcsIDB4MDBmNywgMHgwMGI4LAorCTB4MDBiMCwgMHgwMGE4LCAweDAyZDksIDB4MDE3MSwKKwkweDAxNTgsIDB4MDE1OSwgMHgyNWEwLCAweDAwYTAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Y2YsIDB4MDAsIDB4MDAsIDB4ZjUsIC8qIDB4YTAtMHhhNyAqLworCTB4ZjksIDB4MDAsIDB4MDAsIDB4YWUsIDB4YWEsIDB4ZjAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjAtMHhiNyAqLworCTB4ZjcsIDB4MDAsIDB4MDAsIDB4YWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4YjUsIDB4YjYsIDB4MDAsIDB4OGUsIDB4MDAsIDB4MDAsIDB4ODAsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4OTAsIDB4MDAsIDB4ZDMsIDB4MDAsIDB4ZDYsIDB4ZDcsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4ZTIsIDB4MDAsIDB4OTksIDB4OWUsIC8qIDB4ZDAtMHhkNyAqLworCTB4MDAsIDB4MDAsIDB4ZTksIDB4MDAsIDB4OWEsIDB4ZWQsIDB4MDAsIDB4ZTEsIC8qIDB4ZDgtMHhkZiAqLworCTB4MDAsIDB4YTAsIDB4ODMsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDAsIDB4ODcsIC8qIDB4ZTAtMHhlNyAqLworCTB4MDAsIDB4ODIsIDB4MDAsIDB4ODksIDB4MDAsIDB4YTEsIDB4OGMsIDB4MDAsIC8qIDB4ZTgtMHhlZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4YTIsIDB4OTMsIDB4MDAsIDB4OTQsIDB4ZjYsIC8qIDB4ZjAtMHhmNyAqLworCTB4MDAsIDB4MDAsIDB4YTMsIDB4MDAsIDB4ODEsIDB4ZWMsIDB4MDAsIDB4MDAsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAxWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHhjNiwgMHhjNywgMHhhNCwgMHhhNSwgMHg4ZiwgMHg4NiwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhYywgMHg5ZiwgMHhkMiwgMHhkNCwgLyogMHgwOC0weDBmICovCisJMHhkMSwgMHhkMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHhhOCwgMHhhOSwgMHhiNywgMHhkOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHg5MSwgMHg5MiwgMHgwMCwgMHgwMCwgMHg5NSwgMHg5NiwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHg5ZCwgMHg4OCwgMHhlMywgMHhlNCwgMHgwMCwgMHgwMCwgMHhkNSwgLyogMHg0MC0weDQ3ICovCisJMHhlNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHg4YSwgMHg4YiwgMHgwMCwgMHgwMCwgMHhlOCwgMHhlYSwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHhmYywgMHhmZCwgMHg5NywgMHg5OCwgMHgwMCwgMHgwMCwgMHhiOCwgMHhhZCwgLyogMHg1OC0weDVmICovCisJMHhlNiwgMHhlNywgMHhkZCwgMHhlZSwgMHg5YiwgMHg5YywgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkZSwgMHg4NSwgLyogMHg2OC0weDZmICovCisJMHhlYiwgMHhmYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHg4ZCwgMHhhYiwgMHhiZCwgMHhiZSwgMHhhNiwgMHhhNywgMHgwMCwgLyogMHg3OC0weDdmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDJbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjMsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZjQsIDB4ZmEsIDB4MDAsIDB4ZjIsIDB4MDAsIDB4ZjEsIDB4MDAsIDB4MDAsIC8qIDB4ZDgtMHhkZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTI1WzI1Nl0gPSB7CisJMHhjNCwgMHgwMCwgMHhiMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkYSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHhiZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHhkOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjNSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHhjZCwgMHhiYSwgMHgwMCwgMHgwMCwgMHhjOSwgMHgwMCwgMHgwMCwgMHhiYiwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhjOCwgMHgwMCwgMHgwMCwgMHhiYywgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHhjYywgMHgwMCwgMHgwMCwgMHhiOSwgMHgwMCwgMHgwMCwgMHhjYiwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHhjYSwgMHgwMCwgMHgwMCwgMHhjZSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweGRmLCAweDAwLCAweDAwLCAweDAwLCAweGRjLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweGRiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweGIwLCAweGIxLCAweGIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBwYWdlMDEsIHBhZ2UwMiwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBwYWdlMjUsIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODcsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGIsIDB4OGIsIDB4OGMsIDB4YWIsIDB4ODQsIDB4ODYsIC8qIDB4ODgtMHg4ZiAqLworCTB4ODIsIDB4OTIsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTYsIDB4OTYsIDB4OTgsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTQsIDB4ODEsIDB4OWMsIDB4OWMsIDB4ODgsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTUsIDB4YTUsIDB4YTcsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTksIDB4YTksIDB4YWEsIDB4YWIsIDB4OWYsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YTAsIDB4ODMsIDB4ZDgsIC8qIDB4YjAtMHhiNyAqLworCTB4YWQsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmUsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzcsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDAsIDB4ZDQsIDB4ODksIDB4ZDQsIDB4ZTUsIDB4YTEsIDB4OGMsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZWUsIDB4ODUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4YTIsIDB4ZTEsIDB4OTMsIDB4ZTQsIDB4ZTQsIDB4ZTUsIDB4ZTcsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZWEsIDB4YTMsIDB4ZWEsIDB4ZmIsIDB4ZWMsIDB4ZWMsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmQsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg5YSwgMHg5MCwgMHhiNiwgMHg4ZSwgMHhkZSwgMHg4ZiwgMHg4MCwgLyogMHg4MC0weDg3ICovCisJMHg5ZCwgMHhkMywgMHg4YSwgMHg4YSwgMHhkNywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MSwgMHhlMiwgMHg5OSwgMHg5NSwgMHg5NSwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5NywgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YiwgMHg5ZCwgMHg5ZSwgMHhhYywgLyogMHg5OC0weDlmICovCisJMHhiNSwgMHhkNiwgMHhlMCwgMHhlOSwgMHhhNCwgMHhhNCwgMHhhNiwgMHhhNiwgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOCwgMHhhYSwgMHg4ZCwgMHhhYywgMHhiOCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZCwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNiwgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMSwgMHhkMSwgMHhkMiwgMHhkMywgMHhkMiwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhiNywgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlMywgMHhkNSwgMHhlNiwgMHhlNiwgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlOCwgMHhlYiwgMHhlZCwgMHhlZCwgMHhkZCwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhlYiwgMHhmYywgMHhmYywgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDg1MiIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19jcDg1Mih2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2NwODUyKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfY3A4NTIpCittb2R1bGVfZXhpdChleGl0X25sc19jcDg1MikKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19jcDg1NS5jIGIvZnMvbmxzL25sc19jcDg1NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NjQxYjcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwODU1LmMKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfY3A4NTUuYworICoKKyAqIENoYXJzZXQgY3A4NTUgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDQ1MiwgMHgwNDAyLCAweDA0NTMsIDB4MDQwMywKKwkweDA0NTEsIDB4MDQwMSwgMHgwNDU0LCAweDA0MDQsCisJMHgwNDU1LCAweDA0MDUsIDB4MDQ1NiwgMHgwNDA2LAorCTB4MDQ1NywgMHgwNDA3LCAweDA0NTgsIDB4MDQwOCwKKwkvKiAweDkwKi8KKwkweDA0NTksIDB4MDQwOSwgMHgwNDVhLCAweDA0MGEsCisJMHgwNDViLCAweDA0MGIsIDB4MDQ1YywgMHgwNDBjLAorCTB4MDQ1ZSwgMHgwNDBlLCAweDA0NWYsIDB4MDQwZiwKKwkweDA0NGUsIDB4MDQyZSwgMHgwNDRhLCAweDA0MmEsCisJLyogMHhhMCovCisJMHgwNDMwLCAweDA0MTAsIDB4MDQzMSwgMHgwNDExLAorCTB4MDQ0NiwgMHgwNDI2LCAweDA0MzQsIDB4MDQxNCwKKwkweDA0MzUsIDB4MDQxNSwgMHgwNDQ0LCAweDA0MjQsCisJMHgwNDMzLCAweDA0MTMsIDB4MDBhYiwgMHgwMGJiLAorCS8qIDB4YjAqLworCTB4MjU5MSwgMHgyNTkyLCAweDI1OTMsIDB4MjUwMiwKKwkweDI1MjQsIDB4MDQ0NSwgMHgwNDI1LCAweDA0MzgsCisJMHgwNDE4LCAweDI1NjMsIDB4MjU1MSwgMHgyNTU3LAorCTB4MjU1ZCwgMHgwNDM5LCAweDA0MTksIDB4MjUxMCwKKwkvKiAweGMwKi8KKwkweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsCisJMHgyNTAwLCAweDI1M2MsIDB4MDQzYSwgMHgwNDFhLAorCTB4MjU1YSwgMHgyNTU0LCAweDI1NjksIDB4MjU2NiwKKwkweDI1NjAsIDB4MjU1MCwgMHgyNTZjLCAweDAwYTQsCisJLyogMHhkMCovCisJMHgwNDNiLCAweDA0MWIsIDB4MDQzYywgMHgwNDFjLAorCTB4MDQzZCwgMHgwNDFkLCAweDA0M2UsIDB4MDQxZSwKKwkweDA0M2YsIDB4MjUxOCwgMHgyNTBjLCAweDI1ODgsCisJMHgyNTg0LCAweDA0MWYsIDB4MDQ0ZiwgMHgyNTgwLAorCS8qIDB4ZTAqLworCTB4MDQyZiwgMHgwNDQwLCAweDA0MjAsIDB4MDQ0MSwKKwkweDA0MjEsIDB4MDQ0MiwgMHgwNDIyLCAweDA0NDMsCisJMHgwNDIzLCAweDA0MzYsIDB4MDQxNiwgMHgwNDMyLAorCTB4MDQxMiwgMHgwNDRjLCAweDA0MmMsIDB4MjExNiwKKwkvKiAweGYwKi8KKwkweDAwYWQsIDB4MDQ0YiwgMHgwNDJiLCAweDA0MzcsCisJMHgwNDE3LCAweDA0NDgsIDB4MDQyOCwgMHgwNDRkLAorCTB4MDQyZCwgMHgwNDQ5LCAweDA0MjksIDB4MDQ0NywKKwkweDA0MjcsIDB4MDBhNywgMHgyNWEwLCAweDAwYTAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Y2YsIDB4MDAsIDB4MDAsIDB4ZmQsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4YWUsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4YWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTA0WzI1Nl0gPSB7CisJMHgwMCwgMHg4NSwgMHg4MSwgMHg4MywgMHg4NywgMHg4OSwgMHg4YiwgMHg4ZCwgLyogMHgwMC0weDA3ICovCisJMHg4ZiwgMHg5MSwgMHg5MywgMHg5NSwgMHg5NywgMHgwMCwgMHg5OSwgMHg5YiwgLyogMHgwOC0weDBmICovCisJMHhhMSwgMHhhMywgMHhlYywgMHhhZCwgMHhhNywgMHhhOSwgMHhlYSwgMHhmNCwgLyogMHgxMC0weDE3ICovCisJMHhiOCwgMHhiZSwgMHhjNywgMHhkMSwgMHhkMywgMHhkNSwgMHhkNywgMHhkZCwgLyogMHgxOC0weDFmICovCisJMHhlMiwgMHhlNCwgMHhlNiwgMHhlOCwgMHhhYiwgMHhiNiwgMHhhNSwgMHhmYywgLyogMHgyMC0weDI3ICovCisJMHhmNiwgMHhmYSwgMHg5ZiwgMHhmMiwgMHhlZSwgMHhmOCwgMHg5ZCwgMHhlMCwgLyogMHgyOC0weDJmICovCisJMHhhMCwgMHhhMiwgMHhlYiwgMHhhYywgMHhhNiwgMHhhOCwgMHhlOSwgMHhmMywgLyogMHgzMC0weDM3ICovCisJMHhiNywgMHhiZCwgMHhjNiwgMHhkMCwgMHhkMiwgMHhkNCwgMHhkNiwgMHhkOCwgLyogMHgzOC0weDNmICovCisJMHhlMSwgMHhlMywgMHhlNSwgMHhlNywgMHhhYSwgMHhiNSwgMHhhNCwgMHhmYiwgLyogMHg0MC0weDQ3ICovCisJMHhmNSwgMHhmOSwgMHg5ZSwgMHhmMSwgMHhlZCwgMHhmNywgMHg5YywgMHhkZSwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHg4NCwgMHg4MCwgMHg4MiwgMHg4NiwgMHg4OCwgMHg4YSwgMHg4YywgLyogMHg1MC0weDU3ICovCisJMHg4ZSwgMHg5MCwgMHg5MiwgMHg5NCwgMHg5NiwgMHgwMCwgMHg5OCwgMHg5YSwgLyogMHg1OC0weDVmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjFbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGVmLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyNVsyNTZdID0geworCTB4YzQsIDB4MDAsIDB4YjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGEsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4YmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4ZDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzMsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjQsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzIsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzEsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzUsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4Y2QsIDB4YmEsIDB4MDAsIDB4MDAsIDB4YzksIDB4MDAsIDB4MDAsIDB4YmIsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4YzgsIDB4MDAsIDB4MDAsIDB4YmMsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4Y2MsIDB4MDAsIDB4MDAsIDB4YjksIDB4MDAsIDB4MDAsIDB4Y2IsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4Y2EsIDB4MDAsIDB4MDAsIDB4Y2UsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHhkZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkYywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHhkYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHhiMCwgMHhiMSwgMHhiMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhmZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFnZV91bmkyY2hhcnNldFsyNTZdID0geworCXBhZ2UwMCwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgcGFnZTA0LCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIHBhZ2UyMSwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgcGFnZTI1LCBOVUxMLCAgIE5VTEwsICAgCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg0MC0weDQ3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg0OC0weDRmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg1MC0weDU3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgwLCAweDgyLCAweDgyLCAweDg0LCAweDg0LCAweDg2LCAweDg2LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg4LCAweDhhLCAweDhhLCAweDhjLCAweDhjLCAweDhlLCAweDhlLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkwLCAweDkyLCAweDkyLCAweDk0LCAweDk0LCAweDk2LCAweDk2LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk4LCAweDlhLCAweDlhLCAweDljLCAweDljLCAweDllLCAweDllLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGEwLCAweGEyLCAweGEyLCAweGE0LCAweGE0LCAweGE2LCAweGE2LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE4LCAweGFhLCAweGFhLCAweGFjLCAweGFjLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI1LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI3LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJkLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM2LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQwLCAweGQyLCAweGQyLCAweGQ0LCAweGQ0LCAweGQ2LCAweGQ2LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGQ4LCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGRlLCAweGUxLCAweGUxLCAweGUzLCAweGUzLCAweGU1LCAweGU1LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU3LCAweGU5LCAweGU5LCAweGViLCAweGViLCAweGVkLCAweGVkLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYxLCAweGYzLCAweGYzLCAweGY1LCAweGY1LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY3LCAweGY5LCAweGY5LCAweGZiLCAweGZiLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODEsIDB4ODEsIDB4ODMsIDB4ODMsIDB4ODUsIDB4ODUsIDB4ODcsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODksIDB4ODksIDB4OGIsIDB4OGIsIDB4OGQsIDB4OGQsIDB4OGYsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTEsIDB4OTEsIDB4OTMsIDB4OTMsIDB4OTUsIDB4OTUsIDB4OTcsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTksIDB4OTksIDB4OWIsIDB4OWIsIDB4OWQsIDB4OWQsIDB4OWYsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTEsIDB4YTEsIDB4YTMsIDB4YTMsIDB4YTUsIDB4YTUsIDB4YTcsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTksIDB4YTksIDB4YWIsIDB4YWIsIDB4YWQsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjYsIDB4YjYsIDB4YjgsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmUsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzcsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDEsIDB4ZDEsIDB4ZDMsIDB4ZDMsIDB4ZDUsIDB4ZDUsIDB4ZDcsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZGQsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZTAsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTIsIDB4ZTIsIDB4ZTQsIDB4ZTQsIDB4ZTYsIDB4ZTYsIDB4ZTgsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZWEsIDB4ZWEsIDB4ZWMsIDB4ZWMsIDB4ZWUsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjIsIDB4ZjIsIDB4ZjQsIDB4ZjQsIDB4ZjYsIDB4ZjYsIDB4ZjgsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZmEsIDB4ZmEsIDB4ZmMsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSAmIDB4MDBmZjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaSAmIDB4ZmYwMCkgPj4gODsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXVuaTJjaGFyc2V0ID0gcGFnZV91bmkyY2hhcnNldFtjaF07CisJaWYgKHVuaTJjaGFyc2V0ICYmIHVuaTJjaGFyc2V0W2NsXSkKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2xdOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKwkqdW5pID0gY2hhcnNldDJ1bmlbKnJhd3N0cmluZ107CisJaWYgKCp1bmkgPT0gMHgwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAiY3A4NTUiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfY3A4NTUodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sc19jcDg1NSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2NwODU1KQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfY3A4NTUpCisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfY3A4NTcuYyBiL2ZzL25scy9ubHNfY3A4NTcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmE1ODllCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19jcDg1Ny5jCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogbGludXgvZnMvbmxzX2NwODU3LmMKKyAqCisgKiBDaGFyc2V0IGNwODU3IHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIFVuaWNvZGUgYW5kIGNoYXJzZXQKKyAqIHRhYmxlcyBmcm9tIHRoZSBVbmljb2RlIE9yZ2FuaXphdGlvbiAod3d3LnVuaWNvZGUub3JnKS4KKyAqIFRoZSBVbmljb2RlIHRvIGNoYXJzZXQgdGFibGUgaGFzIG9ubHkgZXhhY3QgbWFwcGluZ3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGNoYXJzZXQydW5pWzI1Nl0gPSB7CisJLyogMHgwMCovCisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLAorCTB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsCisJMHgwMDBjLCAweDAwMGQsIDB4MDAwZSwgMHgwMDBmLAorCS8qIDB4MTAqLworCTB4MDAxMCwgMHgwMDExLCAweDAwMTIsIDB4MDAxMywKKwkweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisJMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLAorCTB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwKKwkvKiAweDIwKi8KKwkweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsCisJMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorCTB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwKKwkweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisJLyogMHgzMCovCisJMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLAorCTB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKwkweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsCisJMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorCS8qIDB4NDAqLworCTB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywKKwkweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisJMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLAorCTB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKwkvKiAweDUwKi8KKwkweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsCisJMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwKKwkweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisJLyogMHg2MCovCisJMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAorCTB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKwkweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsCisJMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLAorCS8qIDB4NzAqLworCTB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywKKwkweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisJMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLAorCTB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDA3ZiwKKwkvKiAweDgwKi8KKwkweDAwYzcsIDB4MDBmYywgMHgwMGU5LCAweDAwZTIsCisJMHgwMGU0LCAweDAwZTAsIDB4MDBlNSwgMHgwMGU3LAorCTB4MDBlYSwgMHgwMGViLCAweDAwZTgsIDB4MDBlZiwKKwkweDAwZWUsIDB4MDEzMSwgMHgwMGM0LCAweDAwYzUsCisJLyogMHg5MCovCisJMHgwMGM5LCAweDAwZTYsIDB4MDBjNiwgMHgwMGY0LAorCTB4MDBmNiwgMHgwMGYyLCAweDAwZmIsIDB4MDBmOSwKKwkweDAxMzAsIDB4MDBkNiwgMHgwMGRjLCAweDAwZjgsCisJMHgwMGEzLCAweDAwZDgsIDB4MDE1ZSwgMHgwMTVmLAorCS8qIDB4YTAqLworCTB4MDBlMSwgMHgwMGVkLCAweDAwZjMsIDB4MDBmYSwKKwkweDAwZjEsIDB4MDBkMSwgMHgwMTFlLCAweDAxMWYsCisJMHgwMGJmLCAweDAwYWUsIDB4MDBhYywgMHgwMGJkLAorCTB4MDBiYywgMHgwMGExLCAweDAwYWIsIDB4MDBiYiwKKwkvKiAweGIwKi8KKwkweDI1OTEsIDB4MjU5MiwgMHgyNTkzLCAweDI1MDIsCisJMHgyNTI0LCAweDAwYzEsIDB4MDBjMiwgMHgwMGMwLAorCTB4MDBhOSwgMHgyNTYzLCAweDI1NTEsIDB4MjU1NywKKwkweDI1NWQsIDB4MDBhMiwgMHgwMGE1LCAweDI1MTAsCisJLyogMHhjMCovCisJMHgyNTE0LCAweDI1MzQsIDB4MjUyYywgMHgyNTFjLAorCTB4MjUwMCwgMHgyNTNjLCAweDAwZTMsIDB4MDBjMywKKwkweDI1NWEsIDB4MjU1NCwgMHgyNTY5LCAweDI1NjYsCisJMHgyNTYwLCAweDI1NTAsIDB4MjU2YywgMHgwMGE0LAorCS8qIDB4ZDAqLworCTB4MDBiYSwgMHgwMGFhLCAweDAwY2EsIDB4MDBjYiwKKwkweDAwYzgsIDB4MDAwMCwgMHgwMGNkLCAweDAwY2UsCisJMHgwMGNmLCAweDI1MTgsIDB4MjUwYywgMHgyNTg4LAorCTB4MjU4NCwgMHgwMGE2LCAweDAwY2MsIDB4MjU4MCwKKwkvKiAweGUwKi8KKwkweDAwZDMsIDB4MDBkZiwgMHgwMGQ0LCAweDAwZDIsCisJMHgwMGY1LCAweDAwZDUsIDB4MDBiNSwgMHgwMDAwLAorCTB4MDBkNywgMHgwMGRhLCAweDAwZGIsIDB4MDBkOSwKKwkweDAwZWMsIDB4MDBmZiwgMHgwMGFmLCAweDAwYjQsCisJLyogMHhmMCovCisJMHgwMGFkLCAweDAwYjEsIDB4MDAwMCwgMHgwMGJlLAorCTB4MDBiNiwgMHgwMGE3LCAweDAwZjcsIDB4MDBiOCwKKwkweDAwYjAsIDB4MDBhOCwgMHgwMGI3LCAweDAwYjksCisJMHgwMGIzLCAweDAwYjIsIDB4MjVhMCwgMHgwMGEwLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGZmLCAweGFkLCAweGJkLCAweDljLCAweGNmLCAweGJlLCAweGRkLCAweGY1LCAvKiAweGEwLTB4YTcgKi8KKwkweGY5LCAweGI4LCAweGQxLCAweGFlLCAweGFhLCAweGYwLCAweGE5LCAweGVlLCAvKiAweGE4LTB4YWYgKi8KKwkweGY4LCAweGYxLCAweGZkLCAweGZjLCAweGVmLCAweGU2LCAweGY0LCAweGZhLCAvKiAweGIwLTB4YjcgKi8KKwkweGY3LCAweGZiLCAweGQwLCAweGFmLCAweGFjLCAweGFiLCAweGYzLCAweGE4LCAvKiAweGI4LTB4YmYgKi8KKwkweGI3LCAweGI1LCAweGI2LCAweGM3LCAweDhlLCAweDhmLCAweDkyLCAweDgwLCAvKiAweGMwLTB4YzcgKi8KKwkweGQ0LCAweDkwLCAweGQyLCAweGQzLCAweGRlLCAweGQ2LCAweGQ3LCAweGQ4LCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweGE1LCAweGUzLCAweGUwLCAweGUyLCAweGU1LCAweDk5LCAweGU4LCAvKiAweGQwLTB4ZDcgKi8KKwkweDlkLCAweGViLCAweGU5LCAweGVhLCAweDlhLCAweDAwLCAweDAwLCAweGUxLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDg1LCAweGEwLCAweDgzLCAweGM2LCAweDg0LCAweDg2LCAweDkxLCAweDg3LCAvKiAweGUwLTB4ZTcgKi8KKwkweDhhLCAweDgyLCAweDg4LCAweDg5LCAweGVjLCAweGExLCAweDhjLCAweDhiLCAvKiAweGU4LTB4ZWYgKi8KKwkweDAwLCAweGE0LCAweDk1LCAweGEyLCAweDkzLCAweGU0LCAweDk0LCAweGY2LCAvKiAweGYwLTB4ZjcgKi8KKwkweDliLCAweDk3LCAweGEzLCAweDk2LCAweDgxLCAweDAwLCAweDAwLCAweGVkLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMVsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTYsIDB4YTcsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4OTgsIDB4OGQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OWUsIDB4OWYsIC8qIDB4NTgtMHg1ZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTI1WzI1Nl0gPSB7CisJMHhjNCwgMHgwMCwgMHhiMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkYSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHhiZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHhkOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjNSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHhjZCwgMHhiYSwgMHgwMCwgMHgwMCwgMHhjOSwgMHgwMCwgMHgwMCwgMHhiYiwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhjOCwgMHgwMCwgMHgwMCwgMHhiYywgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHhjYywgMHgwMCwgMHgwMCwgMHhiOSwgMHgwMCwgMHgwMCwgMHhjYiwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHhjYSwgMHgwMCwgMHgwMCwgMHhjZSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweGRmLCAweDAwLCAweDAwLCAweDAwLCAweGRjLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweGRiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweGIwLCAweGIxLCAweGIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBwYWdlMDEsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBwYWdlMjUsIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODcsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4ODQsIDB4ODYsIC8qIDB4ODgtMHg4ZiAqLworCTB4ODIsIDB4OTEsIDB4OTEsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4NjksIDB4OTQsIDB4ODEsIDB4OWIsIDB4OWMsIDB4OWIsIDB4OWYsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTQsIDB4YTcsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YTAsIDB4ODMsIDB4ODUsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzYsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ODgsIDB4ODksIDB4OGEsIDB4MDAsIDB4YTEsIDB4OGMsIC8qIDB4ZDAtMHhkNyAqLworCTB4OGIsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZWMsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4YTIsIDB4ZTEsIDB4OTMsIDB4OTUsIDB4ZTQsIDB4ZTQsIDB4ZTYsIDB4MDAsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4YTMsIDB4OTYsIDB4OTcsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4MDAsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg5YSwgMHg5MCwgMHhiNiwgMHg4ZSwgMHhiNywgMHg4ZiwgMHg4MCwgLyogMHg4MC0weDg3ICovCisJMHhkMiwgMHhkMywgMHhkNCwgMHhkOCwgMHhkNywgMHg0OSwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MiwgMHg5MiwgMHhlMiwgMHg5OSwgMHhlMywgMHhlYSwgMHhlYiwgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5ZCwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZSwgLyogMHg5OC0weDlmICovCisJMHhiNSwgMHhkNiwgMHhlMCwgMHhlOSwgMHhhNSwgMHhhNSwgMHhhNiwgMHhhNiwgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNywgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHgwMCwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNSwgMHhlNSwgMHgwMCwgMHgwMCwgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhkZSwgMHgwMCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHgwMCwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDg1NyIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19jcDg1Nyh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2NwODU3KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfY3A4NTcpCittb2R1bGVfZXhpdChleGl0X25sc19jcDg1NykKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19jcDg2MC5jIGIvZnMvbmxzL25sc19jcDg2MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOWU0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwODYwLmMKQEAgLTAsMCArMSwzNjUgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfY3A4NjAuYworICoKKyAqIENoYXJzZXQgY3A4NjAgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDBjNywgMHgwMGZjLCAweDAwZTksIDB4MDBlMiwKKwkweDAwZTMsIDB4MDBlMCwgMHgwMGMxLCAweDAwZTcsCisJMHgwMGVhLCAweDAwY2EsIDB4MDBlOCwgMHgwMGNkLAorCTB4MDBkNCwgMHgwMGVjLCAweDAwYzMsIDB4MDBjMiwKKwkvKiAweDkwKi8KKwkweDAwYzksIDB4MDBjMCwgMHgwMGM4LCAweDAwZjQsCisJMHgwMGY1LCAweDAwZjIsIDB4MDBkYSwgMHgwMGY5LAorCTB4MDBjYywgMHgwMGQ1LCAweDAwZGMsIDB4MDBhMiwKKwkweDAwYTMsIDB4MDBkOSwgMHgyMGE3LCAweDAwZDMsCisJLyogMHhhMCovCisJMHgwMGUxLCAweDAwZWQsIDB4MDBmMywgMHgwMGZhLAorCTB4MDBmMSwgMHgwMGQxLCAweDAwYWEsIDB4MDBiYSwKKwkweDAwYmYsIDB4MDBkMiwgMHgwMGFjLCAweDAwYmQsCisJMHgwMGJjLCAweDAwYTEsIDB4MDBhYiwgMHgwMGJiLAorCS8qIDB4YjAqLworCTB4MjU5MSwgMHgyNTkyLCAweDI1OTMsIDB4MjUwMiwKKwkweDI1MjQsIDB4MjU2MSwgMHgyNTYyLCAweDI1NTYsCisJMHgyNTU1LCAweDI1NjMsIDB4MjU1MSwgMHgyNTU3LAorCTB4MjU1ZCwgMHgyNTVjLCAweDI1NWIsIDB4MjUxMCwKKwkvKiAweGMwKi8KKwkweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsCisJMHgyNTAwLCAweDI1M2MsIDB4MjU1ZSwgMHgyNTVmLAorCTB4MjU1YSwgMHgyNTU0LCAweDI1NjksIDB4MjU2NiwKKwkweDI1NjAsIDB4MjU1MCwgMHgyNTZjLCAweDI1NjcsCisJLyogMHhkMCovCisJMHgyNTY4LCAweDI1NjQsIDB4MjU2NSwgMHgyNTU5LAorCTB4MjU1OCwgMHgyNTUyLCAweDI1NTMsIDB4MjU2YiwKKwkweDI1NmEsIDB4MjUxOCwgMHgyNTBjLCAweDI1ODgsCisJMHgyNTg0LCAweDI1OGMsIDB4MjU5MCwgMHgyNTgwLAorCS8qIDB4ZTAqLworCTB4MDNiMSwgMHgwMGRmLCAweDAzOTMsIDB4MDNjMCwKKwkweDAzYTMsIDB4MDNjMywgMHgwMGI1LCAweDAzYzQsCisJMHgwM2E2LCAweDAzOTgsIDB4MDNhOSwgMHgwM2I0LAorCTB4MjIxZSwgMHgwM2M2LCAweDAzYjUsIDB4MjIyOSwKKwkvKiAweGYwKi8KKwkweDIyNjEsIDB4MDBiMSwgMHgyMjY1LCAweDIyNjQsCisJMHgyMzIwLCAweDIzMjEsIDB4MDBmNywgMHgyMjQ4LAorCTB4MDBiMCwgMHgyMjE5LCAweDAwYjcsIDB4MjIxYSwKKwkweDIwN2YsIDB4MDBiMiwgMHgyNWEwLCAweDAwYTAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmYsIDB4YWQsIDB4OWIsIDB4OWMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4YTYsIDB4YWUsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4ZjgsIDB4ZjEsIDB4ZmQsIDB4MDAsIDB4MDAsIDB4ZTYsIDB4MDAsIDB4ZmEsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4YTcsIDB4YWYsIDB4YWMsIDB4YWIsIDB4MDAsIDB4YTgsIC8qIDB4YjgtMHhiZiAqLworCTB4OTEsIDB4ODYsIDB4OGYsIDB4OGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIC8qIDB4YzAtMHhjNyAqLworCTB4OTIsIDB4OTAsIDB4ODksIDB4MDAsIDB4OTgsIDB4OGIsIDB4MDAsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4YTUsIDB4YTksIDB4OWYsIDB4OGMsIDB4OTksIDB4MDAsIDB4MDAsIC8qIDB4ZDAtMHhkNyAqLworCTB4MDAsIDB4OWQsIDB4OTYsIDB4MDAsIDB4OWEsIDB4MDAsIDB4MDAsIDB4ZTEsIC8qIDB4ZDgtMHhkZiAqLworCTB4ODUsIDB4YTAsIDB4ODMsIDB4ODQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODcsIC8qIDB4ZTAtMHhlNyAqLworCTB4OGEsIDB4ODIsIDB4ODgsIDB4MDAsIDB4OGQsIDB4YTEsIDB4MDAsIDB4MDAsIC8qIDB4ZTgtMHhlZiAqLworCTB4MDAsIDB4YTQsIDB4OTUsIDB4YTIsIDB4OTMsIDB4OTQsIDB4MDAsIDB4ZjYsIC8qIDB4ZjAtMHhmNyAqLworCTB4MDAsIDB4OTcsIDB4YTMsIDB4MDAsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAzWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweGU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGU0LCAweDAwLCAweDAwLCAweGU4LCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweGVhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweDAwLCAweGUwLCAweDAwLCAweDAwLCAweGViLCAweGVlLCAweDAwLCAweDAwLCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweGUzLCAweDAwLCAweDAwLCAweGU1LCAweGU3LCAweDAwLCAweGVkLCAweDAwLCAvKiAweGMwLTB4YzcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMFsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmMsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5ZSwgLyogMHhhMC0weGE3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjJbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweGY5LCAweGZiLCAweDAwLCAweDAwLCAweDAwLCAweGVjLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweGVmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweGY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweGYwLCAweDAwLCAweDAwLCAweGYzLCAweGYyLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyM1syNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4ZjQsIDB4ZjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTI1WzI1Nl0gPSB7CisJMHhjNCwgMHgwMCwgMHhiMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkYSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHhiZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHhkOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjNSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHhjZCwgMHhiYSwgMHhkNSwgMHhkNiwgMHhjOSwgMHhiOCwgMHhiNywgMHhiYiwgLyogMHg1MC0weDU3ICovCisJMHhkNCwgMHhkMywgMHhjOCwgMHhiZSwgMHhiZCwgMHhiYywgMHhjNiwgMHhjNywgLyogMHg1OC0weDVmICovCisJMHhjYywgMHhiNSwgMHhiNiwgMHhiOSwgMHhkMSwgMHhkMiwgMHhjYiwgMHhjZiwgLyogMHg2MC0weDY3ICovCisJMHhkMCwgMHhjYSwgMHhkOCwgMHhkNywgMHhjZSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweGRmLCAweDAwLCAweDAwLCAweDAwLCAweGRjLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweGRiLCAweDAwLCAweDAwLCAweDAwLCAweGRkLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweGRlLCAweGIwLCAweGIxLCAweGIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBOVUxMLCAgIE5VTEwsICAgcGFnZTAzLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCXBhZ2UyMCwgTlVMTCwgICBwYWdlMjIsIHBhZ2UyMywgTlVMTCwgICBwYWdlMjUsIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODcsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4YTAsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODgsIDB4OGEsIDB4YTEsIDB4OTMsIDB4OGQsIDB4ODQsIDB4ODMsIC8qIDB4ODgtMHg4ZiAqLworCTB4ODIsIDB4ODUsIDB4OGEsIDB4OTMsIDB4OTQsIDB4OTUsIDB4YTMsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OGQsIDB4OTQsIDB4ODEsIDB4OWIsIDB4OWMsIDB4OTcsIDB4OWUsIDB4YTIsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTQsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4OTUsIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4MDAsIDB4ZTMsIDB4ZTUsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZWQsIDB4MDAsIDB4MDAsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg5YSwgMHg5MCwgMHg4ZiwgMHg4ZSwgMHg5MSwgMHg4NiwgMHg4MCwgLyogMHg4MC0weDg3ICovCisJMHg4OSwgMHg4OSwgMHg5MiwgMHg4YiwgMHg4YywgMHg5OCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg4YywgMHg5OSwgMHhhOSwgMHg5NiwgMHg5ZCwgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHg4NiwgMHg4YiwgMHg5ZiwgMHg5NiwgMHhhNSwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHgwMCwgMHhlMSwgMHhlMiwgMHgwMCwgMHhlNCwgMHhlNCwgMHgwMCwgMHgwMCwgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHgwMCwgMHhlYywgMHhlOCwgMHgwMCwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDg2MCIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19jcDg2MCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2NwODYwKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfY3A4NjApCittb2R1bGVfZXhpdChleGl0X25sc19jcDg2MCkKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19jcDg2MS5jIGIvZnMvbmxzL25sc19jcDg2MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OWZmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwODYxLmMKQEAgLTAsMCArMSwzODggQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfY3A4NjEuYworICoKKyAqIENoYXJzZXQgY3A4NjEgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDBjNywgMHgwMGZjLCAweDAwZTksIDB4MDBlMiwKKwkweDAwZTQsIDB4MDBlMCwgMHgwMGU1LCAweDAwZTcsCisJMHgwMGVhLCAweDAwZWIsIDB4MDBlOCwgMHgwMGQwLAorCTB4MDBmMCwgMHgwMGRlLCAweDAwYzQsIDB4MDBjNSwKKwkvKiAweDkwKi8KKwkweDAwYzksIDB4MDBlNiwgMHgwMGM2LCAweDAwZjQsCisJMHgwMGY2LCAweDAwZmUsIDB4MDBmYiwgMHgwMGRkLAorCTB4MDBmZCwgMHgwMGQ2LCAweDAwZGMsIDB4MDBmOCwKKwkweDAwYTMsIDB4MDBkOCwgMHgyMGE3LCAweDAxOTIsCisJLyogMHhhMCovCisJMHgwMGUxLCAweDAwZWQsIDB4MDBmMywgMHgwMGZhLAorCTB4MDBjMSwgMHgwMGNkLCAweDAwZDMsIDB4MDBkYSwKKwkweDAwYmYsIDB4MjMxMCwgMHgwMGFjLCAweDAwYmQsCisJMHgwMGJjLCAweDAwYTEsIDB4MDBhYiwgMHgwMGJiLAorCS8qIDB4YjAqLworCTB4MjU5MSwgMHgyNTkyLCAweDI1OTMsIDB4MjUwMiwKKwkweDI1MjQsIDB4MjU2MSwgMHgyNTYyLCAweDI1NTYsCisJMHgyNTU1LCAweDI1NjMsIDB4MjU1MSwgMHgyNTU3LAorCTB4MjU1ZCwgMHgyNTVjLCAweDI1NWIsIDB4MjUxMCwKKwkvKiAweGMwKi8KKwkweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsCisJMHgyNTAwLCAweDI1M2MsIDB4MjU1ZSwgMHgyNTVmLAorCTB4MjU1YSwgMHgyNTU0LCAweDI1NjksIDB4MjU2NiwKKwkweDI1NjAsIDB4MjU1MCwgMHgyNTZjLCAweDI1NjcsCisJLyogMHhkMCovCisJMHgyNTY4LCAweDI1NjQsIDB4MjU2NSwgMHgyNTU5LAorCTB4MjU1OCwgMHgyNTUyLCAweDI1NTMsIDB4MjU2YiwKKwkweDI1NmEsIDB4MjUxOCwgMHgyNTBjLCAweDI1ODgsCisJMHgyNTg0LCAweDI1OGMsIDB4MjU5MCwgMHgyNTgwLAorCS8qIDB4ZTAqLworCTB4MDNiMSwgMHgwMGRmLCAweDAzOTMsIDB4MDNjMCwKKwkweDAzYTMsIDB4MDNjMywgMHgwMGI1LCAweDAzYzQsCisJMHgwM2E2LCAweDAzOTgsIDB4MDNhOSwgMHgwM2I0LAorCTB4MjIxZSwgMHgwM2M2LCAweDAzYjUsIDB4MjIyOSwKKwkvKiAweGYwKi8KKwkweDIyNjEsIDB4MDBiMSwgMHgyMjY1LCAweDIyNjQsCisJMHgyMzIwLCAweDIzMjEsIDB4MDBmNywgMHgyMjQ4LAorCTB4MDBiMCwgMHgyMjE5LCAweDAwYjcsIDB4MjIxYSwKKwkweDIwN2YsIDB4MDBiMiwgMHgyNWEwLCAweDAwYTAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmYsIDB4YWQsIDB4MDAsIDB4OWMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4YWUsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4ZjgsIDB4ZjEsIDB4ZmQsIDB4MDAsIDB4MDAsIDB4ZTYsIDB4MDAsIDB4ZmEsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4YWYsIDB4YWMsIDB4YWIsIDB4MDAsIDB4YTgsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4YTQsIDB4MDAsIDB4MDAsIDB4OGUsIDB4OGYsIDB4OTIsIDB4ODAsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4OTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTUsIDB4MDAsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4OGIsIDB4MDAsIDB4MDAsIDB4YTYsIDB4MDAsIDB4MDAsIDB4OTksIDB4MDAsIC8qIDB4ZDAtMHhkNyAqLworCTB4OWQsIDB4MDAsIDB4YTcsIDB4MDAsIDB4OWEsIDB4OTcsIDB4OGQsIDB4ZTEsIC8qIDB4ZDgtMHhkZiAqLworCTB4ODUsIDB4YTAsIDB4ODMsIDB4MDAsIDB4ODQsIDB4ODYsIDB4OTEsIDB4ODcsIC8qIDB4ZTAtMHhlNyAqLworCTB4OGEsIDB4ODIsIDB4ODgsIDB4ODksIDB4MDAsIDB4YTEsIDB4MDAsIDB4MDAsIC8qIDB4ZTgtMHhlZiAqLworCTB4OGMsIDB4MDAsIDB4MDAsIDB4YTIsIDB4OTMsIDB4MDAsIDB4OTQsIDB4ZjYsIC8qIDB4ZjAtMHhmNyAqLworCTB4OWIsIDB4MDAsIDB4YTMsIDB4OTYsIDB4ODEsIDB4OTgsIDB4OTUsIDB4MDAsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAxWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDlmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwM1syNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhlMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHhlOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhlNCwgMHgwMCwgMHgwMCwgMHhlOCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHhlYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHgwMCwgMHhlMCwgMHgwMCwgMHgwMCwgMHhlYiwgMHhlZSwgMHgwMCwgMHgwMCwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHhlMywgMHgwMCwgMHgwMCwgMHhlNSwgMHhlNywgMHgwMCwgMHhlZCwgMHgwMCwgLyogMHhjMC0weGM3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjBbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZjLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OWUsIC8qIDB4YTAtMHhhNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHhmOSwgMHhmYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhlYywgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHhlZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHhmNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHhmMywgMHhmMiwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjNbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweGE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweGY0LCAweGY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyNVsyNTZdID0geworCTB4YzQsIDB4MDAsIDB4YjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGEsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4YmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4ZDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzMsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjQsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzIsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzEsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzUsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4Y2QsIDB4YmEsIDB4ZDUsIDB4ZDYsIDB4YzksIDB4YjgsIDB4YjcsIDB4YmIsIC8qIDB4NTAtMHg1NyAqLworCTB4ZDQsIDB4ZDMsIDB4YzgsIDB4YmUsIDB4YmQsIDB4YmMsIDB4YzYsIDB4YzcsIC8qIDB4NTgtMHg1ZiAqLworCTB4Y2MsIDB4YjUsIDB4YjYsIDB4YjksIDB4ZDEsIDB4ZDIsIDB4Y2IsIDB4Y2YsIC8qIDB4NjAtMHg2NyAqLworCTB4ZDAsIDB4Y2EsIDB4ZDgsIDB4ZDcsIDB4Y2UsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHhkZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkYywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHhkYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkZCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHhkZSwgMHhiMCwgMHhiMSwgMHhiMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhmZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFnZV91bmkyY2hhcnNldFsyNTZdID0geworCXBhZ2UwMCwgcGFnZTAxLCBOVUxMLCAgIHBhZ2UwMywgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlwYWdlMjAsIE5VTEwsICAgcGFnZTIyLCBwYWdlMjMsIE5VTEwsICAgcGFnZTI1LCBOVUxMLCAgIE5VTEwsICAgCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg0MC0weDQ3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg0OC0weDRmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg1MC0weDU3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDg3LCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhjLCAweDhjLCAweDk1LCAweDg0LCAweDg2LCAvKiAweDg4LTB4OGYgKi8KKwkweDgyLCAweDkxLCAweDkxLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk4LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk0LCAweDgxLCAweDliLCAweDljLCAweDliLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGEwLCAweGExLCAweGEyLCAweGEzLCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweDAwLCAweGUzLCAweGU1LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGVkLCAweDAwLCAweDAwLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4OWEsIDB4OTAsIDB4MDAsIDB4OGUsIDB4MDAsIDB4OGYsIDB4ODAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4OGIsIDB4OGIsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTIsIDB4OTIsIDB4MDAsIDB4OTksIDB4OGQsIDB4MDAsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTcsIDB4OTksIDB4OWEsIDB4OWQsIDB4OWMsIDB4OWQsIDB4OWUsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4MDAsIDB4ZTEsIDB4ZTIsIDB4MDAsIDB4ZTQsIDB4ZTQsIDB4MDAsIDB4MDAsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4MDAsIDB4ZWMsIDB4ZTgsIDB4MDAsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSAmIDB4MDBmZjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaSAmIDB4ZmYwMCkgPj4gODsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXVuaTJjaGFyc2V0ID0gcGFnZV91bmkyY2hhcnNldFtjaF07CisJaWYgKHVuaTJjaGFyc2V0ICYmIHVuaTJjaGFyc2V0W2NsXSkKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2xdOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKwkqdW5pID0gY2hhcnNldDJ1bmlbKnJhd3N0cmluZ107CisJaWYgKCp1bmkgPT0gMHgwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAiY3A4NjEiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfY3A4NjEodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sc19jcDg2MSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2NwODYxKQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfY3A4NjEpCisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfY3A4NjIuYyBiL2ZzL25scy9ubHNfY3A4NjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTY5MjhmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19jcDg2Mi5jCkBAIC0wLDAgKzEsNDIyIEBACisvKgorICogbGludXgvZnMvbmxzX2NwODYyLmMKKyAqCisgKiBDaGFyc2V0IGNwODYyIHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIFVuaWNvZGUgYW5kIGNoYXJzZXQKKyAqIHRhYmxlcyBmcm9tIHRoZSBVbmljb2RlIE9yZ2FuaXphdGlvbiAod3d3LnVuaWNvZGUub3JnKS4KKyAqIFRoZSBVbmljb2RlIHRvIGNoYXJzZXQgdGFibGUgaGFzIG9ubHkgZXhhY3QgbWFwcGluZ3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGNoYXJzZXQydW5pWzI1Nl0gPSB7CisJLyogMHgwMCovCisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLAorCTB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsCisJMHgwMDBjLCAweDAwMGQsIDB4MDAwZSwgMHgwMDBmLAorCS8qIDB4MTAqLworCTB4MDAxMCwgMHgwMDExLCAweDAwMTIsIDB4MDAxMywKKwkweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisJMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLAorCTB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwKKwkvKiAweDIwKi8KKwkweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsCisJMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorCTB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwKKwkweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisJLyogMHgzMCovCisJMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLAorCTB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKwkweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsCisJMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorCS8qIDB4NDAqLworCTB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywKKwkweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisJMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLAorCTB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKwkvKiAweDUwKi8KKwkweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsCisJMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwKKwkweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisJLyogMHg2MCovCisJMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAorCTB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKwkweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsCisJMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLAorCS8qIDB4NzAqLworCTB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywKKwkweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisJMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLAorCTB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDA3ZiwKKwkvKiAweDgwKi8KKwkweDA1ZDAsIDB4MDVkMSwgMHgwNWQyLCAweDA1ZDMsCisJMHgwNWQ0LCAweDA1ZDUsIDB4MDVkNiwgMHgwNWQ3LAorCTB4MDVkOCwgMHgwNWQ5LCAweDA1ZGEsIDB4MDVkYiwKKwkweDA1ZGMsIDB4MDVkZCwgMHgwNWRlLCAweDA1ZGYsCisJLyogMHg5MCovCisJMHgwNWUwLCAweDA1ZTEsIDB4MDVlMiwgMHgwNWUzLAorCTB4MDVlNCwgMHgwNWU1LCAweDA1ZTYsIDB4MDVlNywKKwkweDA1ZTgsIDB4MDVlOSwgMHgwNWVhLCAweDAwYTIsCisJMHgwMGEzLCAweDAwYTUsIDB4MjBhNywgMHgwMTkyLAorCS8qIDB4YTAqLworCTB4MDBlMSwgMHgwMGVkLCAweDAwZjMsIDB4MDBmYSwKKwkweDAwZjEsIDB4MDBkMSwgMHgwMGFhLCAweDAwYmEsCisJMHgwMGJmLCAweDIzMTAsIDB4MDBhYywgMHgwMGJkLAorCTB4MDBiYywgMHgwMGExLCAweDAwYWIsIDB4MDBiYiwKKwkvKiAweGIwKi8KKwkweDI1OTEsIDB4MjU5MiwgMHgyNTkzLCAweDI1MDIsCisJMHgyNTI0LCAweDI1NjEsIDB4MjU2MiwgMHgyNTU2LAorCTB4MjU1NSwgMHgyNTYzLCAweDI1NTEsIDB4MjU1NywKKwkweDI1NWQsIDB4MjU1YywgMHgyNTViLCAweDI1MTAsCisJLyogMHhjMCovCisJMHgyNTE0LCAweDI1MzQsIDB4MjUyYywgMHgyNTFjLAorCTB4MjUwMCwgMHgyNTNjLCAweDI1NWUsIDB4MjU1ZiwKKwkweDI1NWEsIDB4MjU1NCwgMHgyNTY5LCAweDI1NjYsCisJMHgyNTYwLCAweDI1NTAsIDB4MjU2YywgMHgyNTY3LAorCS8qIDB4ZDAqLworCTB4MjU2OCwgMHgyNTY0LCAweDI1NjUsIDB4MjU1OSwKKwkweDI1NTgsIDB4MjU1MiwgMHgyNTUzLCAweDI1NmIsCisJMHgyNTZhLCAweDI1MTgsIDB4MjUwYywgMHgyNTg4LAorCTB4MjU4NCwgMHgyNThjLCAweDI1OTAsIDB4MjU4MCwKKwkvKiAweGUwKi8KKwkweDAzYjEsIDB4MDBkZiwgMHgwMzkzLCAweDAzYzAsCisJMHgwM2EzLCAweDAzYzMsIDB4MDBiNSwgMHgwM2M0LAorCTB4MDNhNiwgMHgwMzk4LCAweDAzYTksIDB4MDNiNCwKKwkweDIyMWUsIDB4MDNjNiwgMHgwM2I1LCAweDIyMjksCisJLyogMHhmMCovCisJMHgyMjYxLCAweDAwYjEsIDB4MjI2NSwgMHgyMjY0LAorCTB4MjMyMCwgMHgyMzIxLCAweDAwZjcsIDB4MjI0OCwKKwkweDAwYjAsIDB4MjIxOSwgMHgwMGI3LCAweDIyMWEsCisJMHgyMDdmLCAweDAwYjIsIDB4MjVhMCwgMHgwMGEwLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGZmLCAweGFkLCAweDliLCAweDljLCAweDAwLCAweDlkLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweDAwLCAweGE2LCAweGFlLCAweGFhLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweGY4LCAweGYxLCAweGZkLCAweDAwLCAweDAwLCAweGU2LCAweDAwLCAweGZhLCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweGE3LCAweGFmLCAweGFjLCAweGFiLCAweDAwLCAweGE4LCAvKiAweGI4LTB4YmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGMwLTB4YzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweGE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQwLTB4ZDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGUxLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDAwLCAweGEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGUwLTB4ZTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGExLCAweDAwLCAweDAwLCAvKiAweGU4LTB4ZWYgKi8KKwkweDAwLCAweGE0LCAweDAwLCAweGEyLCAweDAwLCAweDAwLCAweDAwLCAweGY2LCAvKiAweGYwLTB4ZjcgKi8KKwkweDAwLCAweDAwLCAweGEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMVsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHg5ZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDNbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4ZTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4ZTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4ZTQsIDB4MDAsIDB4MDAsIDB4ZTgsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4ZWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4MDAsIDB4ZTAsIDB4MDAsIDB4MDAsIDB4ZWIsIDB4ZWUsIDB4MDAsIDB4MDAsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4ZTMsIDB4MDAsIDB4MDAsIDB4ZTUsIDB4ZTcsIDB4MDAsIDB4ZWQsIDB4MDAsIC8qIDB4YzAtMHhjNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTA1WzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGMwLTB4YzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweGQwLTB4ZDcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweGUwLTB4ZTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGU4LTB4ZWYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMFsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmMsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5ZSwgLyogMHhhMC0weGE3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjJbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweGY5LCAweGZiLCAweDAwLCAweDAwLCAweDAwLCAweGVjLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweGVmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweGY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweGYwLCAweDAwLCAweDAwLCAweGYzLCAweGYyLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyM1syNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4YTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4ZjQsIDB4ZjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTI1WzI1Nl0gPSB7CisJMHhjNCwgMHgwMCwgMHhiMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkYSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHhiZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHhkOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjNSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHhjZCwgMHhiYSwgMHhkNSwgMHhkNiwgMHhjOSwgMHhiOCwgMHhiNywgMHhiYiwgLyogMHg1MC0weDU3ICovCisJMHhkNCwgMHhkMywgMHhjOCwgMHhiZSwgMHhiZCwgMHhiYywgMHhjNiwgMHhjNywgLyogMHg1OC0weDVmICovCisJMHhjYywgMHhiNSwgMHhiNiwgMHhiOSwgMHhkMSwgMHhkMiwgMHhjYiwgMHhjZiwgLyogMHg2MC0weDY3ICovCisJMHhkMCwgMHhjYSwgMHhkOCwgMHhkNywgMHhjZSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweGRmLCAweDAwLCAweDAwLCAweDAwLCAweGRjLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweGRiLCAweDAwLCAweDAwLCAweDAwLCAweGRkLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweGRlLCAweGIwLCAweGIxLCAweGIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBwYWdlMDEsIE5VTEwsICAgcGFnZTAzLCBOVUxMLCAgIHBhZ2UwNSwgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCXBhZ2UyMCwgTlVMTCwgICBwYWdlMjIsIHBhZ2UyMywgTlVMTCwgICBwYWdlMjUsIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTQsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4MDAsIDB4ZTMsIDB4ZTUsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZWQsIDB4MDAsIDB4MDAsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNSwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHgwMCwgMHhlMSwgMHhlMiwgMHgwMCwgMHhlNCwgMHhlNCwgMHgwMCwgMHgwMCwgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHgwMCwgMHhlYywgMHhlOCwgMHgwMCwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDg2MiIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19jcDg2Mih2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2NwODYyKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfY3A4NjIpCittb2R1bGVfZXhpdChleGl0X25sc19jcDg2MikKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19jcDg2My5jIGIvZnMvbmxzL25sc19jcDg2My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYTZlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwODYzLmMKQEAgLTAsMCArMSwzODIgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfY3A4NjMuYworICoKKyAqIENoYXJzZXQgY3A4NjMgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDBjNywgMHgwMGZjLCAweDAwZTksIDB4MDBlMiwKKwkweDAwYzIsIDB4MDBlMCwgMHgwMGI2LCAweDAwZTcsCisJMHgwMGVhLCAweDAwZWIsIDB4MDBlOCwgMHgwMGVmLAorCTB4MDBlZSwgMHgyMDE3LCAweDAwYzAsIDB4MDBhNywKKwkvKiAweDkwKi8KKwkweDAwYzksIDB4MDBjOCwgMHgwMGNhLCAweDAwZjQsCisJMHgwMGNiLCAweDAwY2YsIDB4MDBmYiwgMHgwMGY5LAorCTB4MDBhNCwgMHgwMGQ0LCAweDAwZGMsIDB4MDBhMiwKKwkweDAwYTMsIDB4MDBkOSwgMHgwMGRiLCAweDAxOTIsCisJLyogMHhhMCovCisJMHgwMGE2LCAweDAwYjQsIDB4MDBmMywgMHgwMGZhLAorCTB4MDBhOCwgMHgwMGI4LCAweDAwYjMsIDB4MDBhZiwKKwkweDAwY2UsIDB4MjMxMCwgMHgwMGFjLCAweDAwYmQsCisJMHgwMGJjLCAweDAwYmUsIDB4MDBhYiwgMHgwMGJiLAorCS8qIDB4YjAqLworCTB4MjU5MSwgMHgyNTkyLCAweDI1OTMsIDB4MjUwMiwKKwkweDI1MjQsIDB4MjU2MSwgMHgyNTYyLCAweDI1NTYsCisJMHgyNTU1LCAweDI1NjMsIDB4MjU1MSwgMHgyNTU3LAorCTB4MjU1ZCwgMHgyNTVjLCAweDI1NWIsIDB4MjUxMCwKKwkvKiAweGMwKi8KKwkweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsCisJMHgyNTAwLCAweDI1M2MsIDB4MjU1ZSwgMHgyNTVmLAorCTB4MjU1YSwgMHgyNTU0LCAweDI1NjksIDB4MjU2NiwKKwkweDI1NjAsIDB4MjU1MCwgMHgyNTZjLCAweDI1NjcsCisJLyogMHhkMCovCisJMHgyNTY4LCAweDI1NjQsIDB4MjU2NSwgMHgyNTU5LAorCTB4MjU1OCwgMHgyNTUyLCAweDI1NTMsIDB4MjU2YiwKKwkweDI1NmEsIDB4MjUxOCwgMHgyNTBjLCAweDI1ODgsCisJMHgyNTg0LCAweDI1OGMsIDB4MjU5MCwgMHgyNTgwLAorCS8qIDB4ZTAqLworCTB4MDNiMSwgMHgwMGRmLCAweDAzOTMsIDB4MDNjMCwKKwkweDAzYTMsIDB4MDNjMywgMHgwMGI1LCAweDAzYzQsCisJMHgwM2E2LCAweDAzOTgsIDB4MDNhOSwgMHgwM2I0LAorCTB4MjIxZSwgMHgwM2M2LCAweDAzYjUsIDB4MjIyOSwKKwkvKiAweGYwKi8KKwkweDIyNjEsIDB4MDBiMSwgMHgyMjY1LCAweDIyNjQsCisJMHgyMzIwLCAweDIzMjEsIDB4MDBmNywgMHgyMjQ4LAorCTB4MDBiMCwgMHgyMjE5LCAweDAwYjcsIDB4MjIxYSwKKwkweDIwN2YsIDB4MDBiMiwgMHgyNWEwLCAweDAwYTAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmYsIDB4MDAsIDB4OWIsIDB4OWMsIDB4OTgsIDB4MDAsIDB4YTAsIDB4OGYsIC8qIDB4YTAtMHhhNyAqLworCTB4YTQsIDB4MDAsIDB4MDAsIDB4YWUsIDB4YWEsIDB4MDAsIDB4MDAsIDB4YTcsIC8qIDB4YTgtMHhhZiAqLworCTB4ZjgsIDB4ZjEsIDB4ZmQsIDB4YTYsIDB4YTEsIDB4ZTYsIDB4ODYsIDB4ZmEsIC8qIDB4YjAtMHhiNyAqLworCTB4YTUsIDB4MDAsIDB4MDAsIDB4YWYsIDB4YWMsIDB4YWIsIDB4YWQsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4OGUsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIC8qIDB4YzAtMHhjNyAqLworCTB4OTEsIDB4OTAsIDB4OTIsIDB4OTQsIDB4MDAsIDB4MDAsIDB4YTgsIDB4OTUsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTksIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZDAtMHhkNyAqLworCTB4MDAsIDB4OWQsIDB4MDAsIDB4OWUsIDB4OWEsIDB4MDAsIDB4MDAsIDB4ZTEsIC8qIDB4ZDgtMHhkZiAqLworCTB4ODUsIDB4MDAsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODcsIC8qIDB4ZTAtMHhlNyAqLworCTB4OGEsIDB4ODIsIDB4ODgsIDB4ODksIDB4MDAsIDB4MDAsIDB4OGMsIDB4OGIsIC8qIDB4ZTgtMHhlZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4YTIsIDB4OTMsIDB4MDAsIDB4MDAsIDB4ZjYsIC8qIDB4ZjAtMHhmNyAqLworCTB4MDAsIDB4OTcsIDB4YTMsIDB4OTYsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAxWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDlmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwM1syNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhlMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHhlOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhlNCwgMHgwMCwgMHgwMCwgMHhlOCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHhlYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHgwMCwgMHhlMCwgMHgwMCwgMHgwMCwgMHhlYiwgMHhlZSwgMHgwMCwgMHgwMCwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHhlMywgMHgwMCwgMHgwMCwgMHhlNSwgMHhlNywgMHgwMCwgMHhlZCwgMHgwMCwgLyogMHhjMC0weGM3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjBbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhkLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZjLCAvKiAweDc4LTB4N2YgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMlsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4ZjksIDB4ZmIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZWMsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4ZjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjMsIDB4ZjIsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIzWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHhhOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHhmNCwgMHhmNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjVbMjU2XSA9IHsKKwkweGM0LCAweDAwLCAweGIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRhLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweGJmLCAweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweGQ5LCAweDAwLCAweDAwLCAweDAwLCAweGMzLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI0LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMyLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMxLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGM1LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweGNkLCAweGJhLCAweGQ1LCAweGQ2LCAweGM5LCAweGI4LCAweGI3LCAweGJiLCAvKiAweDUwLTB4NTcgKi8KKwkweGQ0LCAweGQzLCAweGM4LCAweGJlLCAweGJkLCAweGJjLCAweGM2LCAweGM3LCAvKiAweDU4LTB4NWYgKi8KKwkweGNjLCAweGI1LCAweGI2LCAweGI5LCAweGQxLCAweGQyLCAweGNiLCAweGNmLCAvKiAweDYwLTB4NjcgKi8KKwkweGQwLCAweGNhLCAweGQ4LCAweGQ3LCAweGNlLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ZGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGMsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4ZGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4ZGUsIDB4YjAsIDB4YjEsIDB4YjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIHBhZ2UwMSwgTlVMTCwgICBwYWdlMDMsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJcGFnZTIwLCBOVUxMLCAgIHBhZ2UyMiwgcGFnZTIzLCBOVUxMLCAgIHBhZ2UyNSwgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4NywgMHg4MSwgMHg4MiwgMHg4MywgMHg4MywgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4NSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg4MiwgMHg4YSwgMHg4OCwgMHg5MywgMHg4OSwgMHg4YiwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5MywgMHg4MSwgMHg5YiwgMHg5YywgMHg5NywgMHg5NiwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHg4YywgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHgwMCwgMHhlMywgMHhlNSwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlZCwgMHgwMCwgMHgwMCwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDlhLCAweDkwLCAweDg0LCAweDg0LCAweDhlLCAweDg2LCAweDgwLCAvKiAweDgwLTB4ODcgKi8KKwkweDkyLCAweDk0LCAweDkxLCAweDk1LCAweGE4LCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDk5LCAweDk0LCAweDk1LCAweDllLCAweDlkLCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweDAwLCAweDAwLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDAwLCAweGUxLCAweGUyLCAweDAwLCAweGU0LCAweGU0LCAweDAwLCAweDAwLCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweDAwLCAweGVjLCAweGU4LCAweDAwLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImNwODYzIiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2NwODYzKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfY3A4NjModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19jcDg2MykKK21vZHVsZV9leGl0KGV4aXRfbmxzX2NwODYzKQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2NwODY0LmMgYi9mcy9ubHMvbmxzX2NwODY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkYWJiMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfY3A4NjQuYwpAQCAtMCwwICsxLDQwOCBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19jcDg2NC5jCisgKgorICogQ2hhcnNldCBjcDg2NCB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwNjZhLCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwMGIwLCAweDAwYjcsIDB4MjIxOSwgMHgyMjFhLAorCTB4MjU5MiwgMHgyNTAwLCAweDI1MDIsIDB4MjUzYywKKwkweDI1MjQsIDB4MjUyYywgMHgyNTFjLCAweDI1MzQsCisJMHgyNTEwLCAweDI1MGMsIDB4MjUxNCwgMHgyNTE4LAorCS8qIDB4OTAqLworCTB4MDNiMiwgMHgyMjFlLCAweDAzYzYsIDB4MDBiMSwKKwkweDAwYmQsIDB4MDBiYywgMHgyMjQ4LCAweDAwYWIsCisJMHgwMGJiLCAweGZlZjcsIDB4ZmVmOCwgMHgwMDAwLAorCTB4MDAwMCwgMHhmZWZiLCAweGZlZmMsIDB4MDAwMCwKKwkvKiAweGEwKi8KKwkweDAwYTAsIDB4MDBhZCwgMHhmZTgyLCAweDAwYTMsCisJMHgwMGE0LCAweGZlODQsIDB4MDAwMCwgMHgwMDAwLAorCTB4ZmU4ZSwgMHhmZThmLCAweGZlOTUsIDB4ZmU5OSwKKwkweDA2MGMsIDB4ZmU5ZCwgMHhmZWExLCAweGZlYTUsCisJLyogMHhiMCovCisJMHgwNjYwLCAweDA2NjEsIDB4MDY2MiwgMHgwNjYzLAorCTB4MDY2NCwgMHgwNjY1LCAweDA2NjYsIDB4MDY2NywKKwkweDA2NjgsIDB4MDY2OSwgMHhmZWQxLCAweDA2MWIsCisJMHhmZWIxLCAweGZlYjUsIDB4ZmViOSwgMHgwNjFmLAorCS8qIDB4YzAqLworCTB4MDBhMiwgMHhmZTgwLCAweGZlODEsIDB4ZmU4MywKKwkweGZlODUsIDB4ZmVjYSwgMHhmZThiLCAweGZlOGQsCisJMHhmZTkxLCAweGZlOTMsIDB4ZmU5NywgMHhmZTliLAorCTB4ZmU5ZiwgMHhmZWEzLCAweGZlYTcsIDB4ZmVhOSwKKwkvKiAweGQwKi8KKwkweGZlYWIsIDB4ZmVhZCwgMHhmZWFmLCAweGZlYjMsCisJMHhmZWI3LCAweGZlYmIsIDB4ZmViZiwgMHhmZWMxLAorCTB4ZmVjNSwgMHhmZWNiLCAweGZlY2YsIDB4MDBhNiwKKwkweDAwYWMsIDB4MDBmNywgMHgwMGQ3LCAweGZlYzksCisJLyogMHhlMCovCisJMHgwNjQwLCAweGZlZDMsIDB4ZmVkNywgMHhmZWRiLAorCTB4ZmVkZiwgMHhmZWUzLCAweGZlZTcsIDB4ZmVlYiwKKwkweGZlZWQsIDB4ZmVlZiwgMHhmZWYzLCAweGZlYmQsCisJMHhmZWNjLCAweGZlY2UsIDB4ZmVjZCwgMHhmZWUxLAorCS8qIDB4ZjAqLworCTB4ZmU3ZCwgMHgwNjUxLCAweGZlZTUsIDB4ZmVlOSwKKwkweGZlZWMsIDB4ZmVmMCwgMHhmZWYyLCAweGZlZDAsCisJMHhmZWQ1LCAweGZlZjUsIDB4ZmVmNiwgMHhmZWRkLAorCTB4ZmVkOSwgMHhmZWYxLCAweDI1YTAsIDB4MDAwMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MDAsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHgwMCwgMHhjMCwgMHhhMywgMHhhNCwgMHgwMCwgMHhkYiwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHhkYywgMHhhMSwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHg4MCwgMHg5MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MSwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHg5OCwgMHg5NSwgMHg5NCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkZSwgLyogMHhkMC0weGQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkOC0weGRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhlMC0weGU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhlOC0weGVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkZCwgLyogMHhmMC0weGY3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDNbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4MDAsIDB4MDAsIDB4OTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4MDAsIC8qIDB4YzAtMHhjNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTA2WzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhYywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiZiwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHhlMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHhmMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHg2MC0weDY3ICovCisJMHhiOCwgMHhiOSwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjJbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDgyLCAweDgzLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyNVsyNTZdID0geworCTB4ODUsIDB4MDAsIDB4ODYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGQsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4OGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGUsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4OGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGEsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGIsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODcsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHg4NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhmZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlZmVbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4YzEsIDB4YzIsIDB4YTIsIDB4YzMsIDB4YTUsIDB4YzQsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4YzYsIDB4MDAsIDB4YzcsIDB4YTgsIDB4YTksIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4YzgsIDB4MDAsIDB4YzksIDB4MDAsIDB4YWEsIDB4MDAsIDB4Y2EsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4YWIsIDB4MDAsIDB4Y2IsIDB4MDAsIDB4YWQsIDB4MDAsIDB4Y2MsIC8qIDB4OTgtMHg5ZiAqLworCTB4MDAsIDB4YWUsIDB4MDAsIDB4Y2QsIDB4MDAsIDB4YWYsIDB4MDAsIDB4Y2UsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4Y2YsIDB4MDAsIDB4ZDAsIDB4MDAsIDB4ZDEsIDB4MDAsIDB4ZDIsIC8qIDB4YTgtMHhhZiAqLworCTB4MDAsIDB4YmMsIDB4MDAsIDB4ZDMsIDB4MDAsIDB4YmQsIDB4MDAsIDB4ZDQsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4YmUsIDB4MDAsIDB4ZDUsIDB4MDAsIDB4ZWIsIDB4MDAsIDB4ZDYsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4ZDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZDgsIDB4MDAsIDB4MDAsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4ZGYsIDB4YzUsIDB4ZDksIDB4ZWMsIDB4ZWUsIDB4ZWQsIDB4ZGEsIC8qIDB4YzgtMHhjZiAqLworCTB4ZjcsIDB4YmEsIDB4MDAsIDB4ZTEsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4ZTIsIC8qIDB4ZDAtMHhkNyAqLworCTB4MDAsIDB4ZmMsIDB4MDAsIDB4ZTMsIDB4MDAsIDB4ZmIsIDB4MDAsIDB4ZTQsIC8qIDB4ZDgtMHhkZiAqLworCTB4MDAsIDB4ZWYsIDB4MDAsIDB4ZTUsIDB4MDAsIDB4ZjIsIDB4MDAsIDB4ZTYsIC8qIDB4ZTAtMHhlNyAqLworCTB4MDAsIDB4ZjMsIDB4MDAsIDB4ZTcsIDB4ZjQsIDB4ZTgsIDB4MDAsIDB4ZTksIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjUsIDB4ZmQsIDB4ZjYsIDB4ZWEsIDB4MDAsIDB4ZjksIDB4ZmEsIDB4OTksIC8qIDB4ZjAtMHhmNyAqLworCTB4OWEsIDB4MDAsIDB4MDAsIDB4OWQsIDB4OWUsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIE5VTEwsICAgTlVMTCwgICBwYWdlMDMsIE5VTEwsICAgTlVMTCwgICBwYWdlMDYsIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIHBhZ2UyMiwgTlVMTCwgICBOVUxMLCAgIHBhZ2UyNSwgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgcGFnZWZlLCBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHgwMCwgMHgwMCwgMHg5ZCwgMHg5ZSwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDkxLCAweDAwLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDAwLCAweDAwLCAweDlkLCAweDllLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweDAwLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImNwODY0IiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2NwODY0KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfY3A4NjQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19jcDg2NCkKK21vZHVsZV9leGl0KGV4aXRfbmxzX2NwODY0KQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2NwODY1LmMgYi9mcy9ubHMvbmxzX2NwODY1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhZWFmYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfY3A4NjUuYwpAQCAtMCwwICsxLDM4OCBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19jcDg2NS5jCisgKgorICogQ2hhcnNldCBjcDg2NSB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwMGM3LCAweDAwZmMsIDB4MDBlOSwgMHgwMGUyLAorCTB4MDBlNCwgMHgwMGUwLCAweDAwZTUsIDB4MDBlNywKKwkweDAwZWEsIDB4MDBlYiwgMHgwMGU4LCAweDAwZWYsCisJMHgwMGVlLCAweDAwZWMsIDB4MDBjNCwgMHgwMGM1LAorCS8qIDB4OTAqLworCTB4MDBjOSwgMHgwMGU2LCAweDAwYzYsIDB4MDBmNCwKKwkweDAwZjYsIDB4MDBmMiwgMHgwMGZiLCAweDAwZjksCisJMHgwMGZmLCAweDAwZDYsIDB4MDBkYywgMHgwMGY4LAorCTB4MDBhMywgMHgwMGQ4LCAweDIwYTcsIDB4MDE5MiwKKwkvKiAweGEwKi8KKwkweDAwZTEsIDB4MDBlZCwgMHgwMGYzLCAweDAwZmEsCisJMHgwMGYxLCAweDAwZDEsIDB4MDBhYSwgMHgwMGJhLAorCTB4MDBiZiwgMHgyMzEwLCAweDAwYWMsIDB4MDBiZCwKKwkweDAwYmMsIDB4MDBhMSwgMHgwMGFiLCAweDAwYTQsCisJLyogMHhiMCovCisJMHgyNTkxLCAweDI1OTIsIDB4MjU5MywgMHgyNTAyLAorCTB4MjUyNCwgMHgyNTYxLCAweDI1NjIsIDB4MjU1NiwKKwkweDI1NTUsIDB4MjU2MywgMHgyNTUxLCAweDI1NTcsCisJMHgyNTVkLCAweDI1NWMsIDB4MjU1YiwgMHgyNTEwLAorCS8qIDB4YzAqLworCTB4MjUxNCwgMHgyNTM0LCAweDI1MmMsIDB4MjUxYywKKwkweDI1MDAsIDB4MjUzYywgMHgyNTVlLCAweDI1NWYsCisJMHgyNTVhLCAweDI1NTQsIDB4MjU2OSwgMHgyNTY2LAorCTB4MjU2MCwgMHgyNTUwLCAweDI1NmMsIDB4MjU2NywKKwkvKiAweGQwKi8KKwkweDI1NjgsIDB4MjU2NCwgMHgyNTY1LCAweDI1NTksCisJMHgyNTU4LCAweDI1NTIsIDB4MjU1MywgMHgyNTZiLAorCTB4MjU2YSwgMHgyNTE4LCAweDI1MGMsIDB4MjU4OCwKKwkweDI1ODQsIDB4MjU4YywgMHgyNTkwLCAweDI1ODAsCisJLyogMHhlMCovCisJMHgwM2IxLCAweDAwZGYsIDB4MDM5MywgMHgwM2MwLAorCTB4MDNhMywgMHgwM2MzLCAweDAwYjUsIDB4MDNjNCwKKwkweDAzYTYsIDB4MDM5OCwgMHgwM2E5LCAweDAzYjQsCisJMHgyMjFlLCAweDAzYzYsIDB4MDNiNSwgMHgyMjI5LAorCS8qIDB4ZjAqLworCTB4MjI2MSwgMHgwMGIxLCAweDIyNjUsIDB4MjI2NCwKKwkweDIzMjAsIDB4MjMyMSwgMHgwMGY3LCAweDIyNDgsCisJMHgwMGIwLCAweDIyMTksIDB4MDBiNywgMHgyMjFhLAorCTB4MjA3ZiwgMHgwMGIyLCAweDI1YTAsIDB4MDBhMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhmZiwgMHhhZCwgMHgwMCwgMHg5YywgMHhhZiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHgwMCwgMHhhNiwgMHhhZSwgMHhhYSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHhmOCwgMHhmMSwgMHhmZCwgMHgwMCwgMHgwMCwgMHhlNiwgMHgwMCwgMHhmYSwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHhhNywgMHgwMCwgMHhhYywgMHhhYiwgMHgwMCwgMHhhOCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZSwgMHg4ZiwgMHg5MiwgMHg4MCwgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHhhNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHgwMCwgLyogMHhkMC0weGQ3ICovCisJMHg5ZCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5YSwgMHgwMCwgMHgwMCwgMHhlMSwgLyogMHhkOC0weGRmICovCisJMHg4NSwgMHhhMCwgMHg4MywgMHgwMCwgMHg4NCwgMHg4NiwgMHg5MSwgMHg4NywgLyogMHhlMC0weGU3ICovCisJMHg4YSwgMHg4MiwgMHg4OCwgMHg4OSwgMHg4ZCwgMHhhMSwgMHg4YywgMHg4YiwgLyogMHhlOC0weGVmICovCisJMHgwMCwgMHhhNCwgMHg5NSwgMHhhMiwgMHg5MywgMHgwMCwgMHg5NCwgMHhmNiwgLyogMHhmMC0weGY3ICovCisJMHg5YiwgMHg5NywgMHhhMywgMHg5NiwgMHg4MSwgMHgwMCwgMHgwMCwgMHg5OCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDFbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4OWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAzWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweGU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGU0LCAweDAwLCAweDAwLCAweGU4LCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweGVhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweDAwLCAweGUwLCAweDAwLCAweDAwLCAweGViLCAweGVlLCAweDAwLCAweDAwLCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweGUzLCAweDAwLCAweDAwLCAweGU1LCAweGU3LCAweDAwLCAweGVkLCAweDAwLCAvKiAweGMwLTB4YzcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMFsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmMsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5ZSwgLyogMHhhMC0weGE3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjJbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweGY5LCAweGZiLCAweDAwLCAweDAwLCAweDAwLCAweGVjLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweGVmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweGY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweGYwLCAweDAwLCAweDAwLCAweGYzLCAweGYyLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyM1syNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4YTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4ZjQsIDB4ZjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTI1WzI1Nl0gPSB7CisJMHhjNCwgMHgwMCwgMHhiMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkYSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHhiZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHhkOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjNSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHhjZCwgMHhiYSwgMHhkNSwgMHhkNiwgMHhjOSwgMHhiOCwgMHhiNywgMHhiYiwgLyogMHg1MC0weDU3ICovCisJMHhkNCwgMHhkMywgMHhjOCwgMHhiZSwgMHhiZCwgMHhiYywgMHhjNiwgMHhjNywgLyogMHg1OC0weDVmICovCisJMHhjYywgMHhiNSwgMHhiNiwgMHhiOSwgMHhkMSwgMHhkMiwgMHhjYiwgMHhjZiwgLyogMHg2MC0weDY3ICovCisJMHhkMCwgMHhjYSwgMHhkOCwgMHhkNywgMHhjZSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweGRmLCAweDAwLCAweDAwLCAweDAwLCAweGRjLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweGRiLCAweDAwLCAweDAwLCAweDAwLCAweGRkLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweGRlLCAweGIwLCAweGIxLCAweGIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBwYWdlMDEsIE5VTEwsICAgcGFnZTAzLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCXBhZ2UyMCwgTlVMTCwgICBwYWdlMjIsIHBhZ2UyMywgTlVMTCwgICBwYWdlMjUsIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODcsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4ODQsIDB4ODYsIC8qIDB4ODgtMHg4ZiAqLworCTB4ODIsIDB4OTEsIDB4OTEsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTQsIDB4ODEsIDB4OWIsIDB4OWMsIDB4OWIsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTQsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4MDAsIDB4ZTMsIDB4ZTUsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZWQsIDB4MDAsIDB4MDAsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg5YSwgMHg5MCwgMHgwMCwgMHg4ZSwgMHgwMCwgMHg4ZiwgMHg4MCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MiwgMHg5MiwgMHgwMCwgMHg5OSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHg5OSwgMHg5YSwgMHg5ZCwgMHg5YywgMHg5ZCwgMHg5ZSwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNSwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHgwMCwgMHhlMSwgMHhlMiwgMHgwMCwgMHhlNCwgMHhlNCwgMHgwMCwgMHgwMCwgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHgwMCwgMHhlYywgMHhlOCwgMHgwMCwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDg2NSIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19jcDg2NSh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2NwODY1KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfY3A4NjUpCittb2R1bGVfZXhpdChleGl0X25sc19jcDg2NSkKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19jcDg2Ni5jIGIvZnMvbmxzL25sc19jcDg2Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYjRhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwODY2LmMKQEAgLTAsMCArMSwzMDYgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfY3A4NjYuYworICoKKyAqIENoYXJzZXQgY3A4NjYgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDQxMCwgMHgwNDExLCAweDA0MTIsIDB4MDQxMywKKwkweDA0MTQsIDB4MDQxNSwgMHgwNDE2LCAweDA0MTcsCisJMHgwNDE4LCAweDA0MTksIDB4MDQxYSwgMHgwNDFiLAorCTB4MDQxYywgMHgwNDFkLCAweDA0MWUsIDB4MDQxZiwKKwkvKiAweDkwKi8KKwkweDA0MjAsIDB4MDQyMSwgMHgwNDIyLCAweDA0MjMsCisJMHgwNDI0LCAweDA0MjUsIDB4MDQyNiwgMHgwNDI3LAorCTB4MDQyOCwgMHgwNDI5LCAweDA0MmEsIDB4MDQyYiwKKwkweDA0MmMsIDB4MDQyZCwgMHgwNDJlLCAweDA0MmYsCisJLyogMHhhMCovCisJMHgwNDMwLCAweDA0MzEsIDB4MDQzMiwgMHgwNDMzLAorCTB4MDQzNCwgMHgwNDM1LCAweDA0MzYsIDB4MDQzNywKKwkweDA0MzgsIDB4MDQzOSwgMHgwNDNhLCAweDA0M2IsCisJMHgwNDNjLCAweDA0M2QsIDB4MDQzZSwgMHgwNDNmLAorCS8qIDB4YjAqLworCTB4MjU5MSwgMHgyNTkyLCAweDI1OTMsIDB4MjUwMiwKKwkweDI1MjQsIDB4MjU2MSwgMHgyNTYyLCAweDI1NTYsCisJMHgyNTU1LCAweDI1NjMsIDB4MjU1MSwgMHgyNTU3LAorCTB4MjU1ZCwgMHgyNTVjLCAweDI1NWIsIDB4MjUxMCwKKwkvKiAweGMwKi8KKwkweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsCisJMHgyNTAwLCAweDI1M2MsIDB4MjU1ZSwgMHgyNTVmLAorCTB4MjU1YSwgMHgyNTU0LCAweDI1NjksIDB4MjU2NiwKKwkweDI1NjAsIDB4MjU1MCwgMHgyNTZjLCAweDI1NjcsCisJLyogMHhkMCovCisJMHgyNTY4LCAweDI1NjQsIDB4MjU2NSwgMHgyNTU5LAorCTB4MjU1OCwgMHgyNTUyLCAweDI1NTMsIDB4MjU2YiwKKwkweDI1NmEsIDB4MjUxOCwgMHgyNTBjLCAweDI1ODgsCisJMHgyNTg0LCAweDI1OGMsIDB4MjU5MCwgMHgyNTgwLAorCS8qIDB4ZTAqLworCTB4MDQ0MCwgMHgwNDQxLCAweDA0NDIsIDB4MDQ0MywKKwkweDA0NDQsIDB4MDQ0NSwgMHgwNDQ2LCAweDA0NDcsCisJMHgwNDQ4LCAweDA0NDksIDB4MDQ0YSwgMHgwNDRiLAorCTB4MDQ0YywgMHgwNDRkLCAweDA0NGUsIDB4MDQ0ZiwKKwkvKiAweGYwKi8KKwkweDA0MDEsIDB4MDQ1MSwgMHgwNDA0LCAweDA0NTQsCisJMHgwNDA3LCAweDA0NTcsIDB4MDQwZSwgMHgwNDVlLAorCTB4MDBiMCwgMHgyMjE5LCAweDAwYjcsIDB4MjIxYSwKKwkweDIxMTYsIDB4MDBhNCwgMHgyNWEwLCAweDAwYTAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmQsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmEsIC8qIDB4YjAtMHhiNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTA0WzI1Nl0gPSB7CisJMHgwMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHhmMiwgMHgwMCwgMHgwMCwgMHhmNCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmNiwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHgxMC0weDE3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHgxOC0weDFmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHgyMC0weDI3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHgyOC0weDJmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHgzMC0weDM3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHgzOC0weDNmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHg0MC0weDQ3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHhmMSwgMHgwMCwgMHgwMCwgMHhmMywgMHgwMCwgMHgwMCwgMHhmNSwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmNywgMHgwMCwgLyogMHg1OC0weDVmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjFbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZjLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMlsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4ZjksIDB4ZmIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTI1WzI1Nl0gPSB7CisJMHhjNCwgMHgwMCwgMHhiMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkYSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHhiZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHhkOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjNSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHhjZCwgMHhiYSwgMHhkNSwgMHhkNiwgMHhjOSwgMHhiOCwgMHhiNywgMHhiYiwgLyogMHg1MC0weDU3ICovCisJMHhkNCwgMHhkMywgMHhjOCwgMHhiZSwgMHhiZCwgMHhiYywgMHhjNiwgMHhjNywgLyogMHg1OC0weDVmICovCisJMHhjYywgMHhiNSwgMHhiNiwgMHhiOSwgMHhkMSwgMHhkMiwgMHhjYiwgMHhjZiwgLyogMHg2MC0weDY3ICovCisJMHhkMCwgMHhjYSwgMHhkOCwgMHhkNywgMHhjZSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweGRmLCAweDAwLCAweDAwLCAweDAwLCAweGRjLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweGRiLCAweDAwLCAweDAwLCAweDAwLCAweGRkLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweGRlLCAweGIwLCAweGIxLCAweGIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBwYWdlMDQsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgcGFnZTIxLCBwYWdlMjIsIE5VTEwsICAgTlVMTCwgICBwYWdlMjUsIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4ODAtMHg4NyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4ODgtMHg4ZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4OTAtMHg5NyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjEsIDB4ZjEsIDB4ZjMsIDB4ZjMsIDB4ZjUsIDB4ZjUsIDB4ZjcsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHhhMC0weGE3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHhlMC0weGU3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMCwgMHhmMiwgMHhmMiwgMHhmNCwgMHhmNCwgMHhmNiwgMHhmNiwgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDg2NiIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19jcDg2Nih2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2NwODY2KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfY3A4NjYpCittb2R1bGVfZXhpdChleGl0X25sc19jcDg2NikKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19jcDg2OS5jIGIvZnMvbmxzL25sc19jcDg2OS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYjQzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwODY5LmMKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfY3A4NjkuYworICoKKyAqIENoYXJzZXQgY3A4NjkgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMzg2LCAweDAwMDAsCisJMHgwMGI3LCAweDAwYWMsIDB4MDBhNiwgMHgyMDE4LAorCTB4MjAxOSwgMHgwMzg4LCAweDIwMTUsIDB4MDM4OSwKKwkvKiAweDkwKi8KKwkweDAzOGEsIDB4MDNhYSwgMHgwMzhjLCAweDAwMDAsCisJMHgwMDAwLCAweDAzOGUsIDB4MDNhYiwgMHgwMGE5LAorCTB4MDM4ZiwgMHgwMGIyLCAweDAwYjMsIDB4MDNhYywKKwkweDAwYTMsIDB4MDNhZCwgMHgwM2FlLCAweDAzYWYsCisJLyogMHhhMCovCisJMHgwM2NhLCAweDAzOTAsIDB4MDNjYywgMHgwM2NkLAorCTB4MDM5MSwgMHgwMzkyLCAweDAzOTMsIDB4MDM5NCwKKwkweDAzOTUsIDB4MDM5NiwgMHgwMzk3LCAweDAwYmQsCisJMHgwMzk4LCAweDAzOTksIDB4MDBhYiwgMHgwMGJiLAorCS8qIDB4YjAqLworCTB4MjU5MSwgMHgyNTkyLCAweDI1OTMsIDB4MjUwMiwKKwkweDI1MjQsIDB4MDM5YSwgMHgwMzliLCAweDAzOWMsCisJMHgwMzlkLCAweDI1NjMsIDB4MjU1MSwgMHgyNTU3LAorCTB4MjU1ZCwgMHgwMzllLCAweDAzOWYsIDB4MjUxMCwKKwkvKiAweGMwKi8KKwkweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsCisJMHgyNTAwLCAweDI1M2MsIDB4MDNhMCwgMHgwM2ExLAorCTB4MjU1YSwgMHgyNTU0LCAweDI1NjksIDB4MjU2NiwKKwkweDI1NjAsIDB4MjU1MCwgMHgyNTZjLCAweDAzYTMsCisJLyogMHhkMCovCisJMHgwM2E0LCAweDAzYTUsIDB4MDNhNiwgMHgwM2E3LAorCTB4MDNhOCwgMHgwM2E5LCAweDAzYjEsIDB4MDNiMiwKKwkweDAzYjMsIDB4MjUxOCwgMHgyNTBjLCAweDI1ODgsCisJMHgyNTg0LCAweDAzYjQsIDB4MDNiNSwgMHgyNTgwLAorCS8qIDB4ZTAqLworCTB4MDNiNiwgMHgwM2I3LCAweDAzYjgsIDB4MDNiOSwKKwkweDAzYmEsIDB4MDNiYiwgMHgwM2JjLCAweDAzYmQsCisJMHgwM2JlLCAweDAzYmYsIDB4MDNjMCwgMHgwM2MxLAorCTB4MDNjMywgMHgwM2MyLCAweDAzYzQsIDB4MDM4NCwKKwkvKiAweGYwKi8KKwkweDAwYWQsIDB4MDBiMSwgMHgwM2M1LCAweDAzYzYsCisJMHgwM2M3LCAweDAwYTcsIDB4MDNjOCwgMHgwMzg1LAorCTB4MDBiMCwgMHgwMGE4LCAweDAzYzksIDB4MDNjYiwKKwkweDAzYjAsIDB4MDNjZSwgMHgyNWEwLCAweDAwYTAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmYsIDB4MDAsIDB4MDAsIDB4OWMsIDB4MDAsIDB4MDAsIDB4OGEsIDB4ZjUsIC8qIDB4YTAtMHhhNyAqLworCTB4ZjksIDB4OTcsIDB4MDAsIDB4YWUsIDB4ODksIDB4ZjAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4ZjgsIDB4ZjEsIDB4OTksIDB4OWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4YWYsIDB4MDAsIDB4YWIsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAzWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGVmLCAweGY3LCAweDg2LCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDhkLCAweDhmLCAweDkwLCAweDAwLCAweDkyLCAweDAwLCAweDk1LCAweDk4LCAvKiAweDg4LTB4OGYgKi8KKwkweGExLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAvKiAweDkwLTB4OTcgKi8KKwkweGFjLCAweGFkLCAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGJkLCAweGJlLCAvKiAweDk4LTB4OWYgKi8KKwkweGM2LCAweGM3LCAweDAwLCAweGNmLCAweGQwLCAweGQxLCAweGQyLCAweGQzLCAvKiAweGEwLTB4YTcgKi8KKwkweGQ0LCAweGQ1LCAweDkxLCAweDk2LCAweDliLCAweDlkLCAweDllLCAweDlmLCAvKiAweGE4LTB4YWYgKi8KKwkweGZjLCAweGQ2LCAweGQ3LCAweGQ4LCAweGRkLCAweGRlLCAweGUwLCAweGUxLCAvKiAweGIwLTB4YjcgKi8KKwkweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAvKiAweGI4LTB4YmYgKi8KKwkweGVhLCAweGViLCAweGVkLCAweGVjLCAweGVlLCAweGYyLCAweGYzLCAweGY0LCAvKiAweGMwLTB4YzcgKi8KKwkweGY2LCAweGZhLCAweGEwLCAweGZiLCAweGEyLCAweGEzLCAweGZkLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMFsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGUsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4OGIsIDB4OGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTI1WzI1Nl0gPSB7CisJMHhjNCwgMHgwMCwgMHhiMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkYSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHhiZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHhkOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjNSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHhjZCwgMHhiYSwgMHgwMCwgMHgwMCwgMHhjOSwgMHgwMCwgMHgwMCwgMHhiYiwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhjOCwgMHgwMCwgMHgwMCwgMHhiYywgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHhjYywgMHgwMCwgMHgwMCwgMHhiOSwgMHgwMCwgMHgwMCwgMHhjYiwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHhjYSwgMHgwMCwgMHgwMCwgMHhjZSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweGRmLCAweDAwLCAweDAwLCAweDAwLCAweGRjLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweGRiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweGIwLCAweGIxLCAweGIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBOVUxMLCAgIE5VTEwsICAgcGFnZTAzLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCXBhZ2UyMCwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBwYWdlMjUsIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OWIsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OWQsIDB4OGUsIDB4OWUsIC8qIDB4ODgtMHg4ZiAqLworCTB4OWYsIDB4YTAsIDB4YTIsIDB4MDAsIDB4MDAsIDB4YTMsIDB4ZmIsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4ZmQsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZGQsIC8qIDB4YTAtMHhhNyAqLworCTB4ZGUsIDB4ZTAsIDB4ZTEsIDB4YWIsIDB4ZTIsIDB4ZTMsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4ZTQsIDB4ZTUsIDB4ZTYsIC8qIDB4YjAtMHhiNyAqLworCTB4ZTcsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4ZTgsIDB4ZTksIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4ZWEsIDB4ZWIsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4ZWMsIC8qIDB4YzgtMHhjZiAqLworCTB4ZWUsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjYsIDB4ZmEsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NiwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHgwMCwgMHgwMCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg4NiwgMHg5YywgMHg4ZCwgMHg4ZiwgMHg5MCwgLyogMHg5OC0weDlmICovCisJMHg5MSwgMHhhMSwgMHg5MiwgMHg5NSwgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhhNCwgMHhhNSwgLyogMHhkMC0weGQ3ICovCisJMHhhNiwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhhNywgMHhhOCwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhhOSwgMHhhYSwgMHhhYywgMHhhZCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgLyogMHhlMC0weGU3ICovCisJMHhiZCwgMHhiZSwgMHhjNiwgMHhjNywgMHhjZiwgMHhjZiwgMHhkMCwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhkMSwgMHhkMiwgMHhkMywgMHhmNSwgMHhkNCwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhkNSwgMHg5NiwgMHhmYywgMHg5OCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDg2OSIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19jcDg2OSh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2NwODY5KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfY3A4NjkpCittb2R1bGVfZXhpdChleGl0X25sc19jcDg2OSkKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19jcDg3NC5jIGIvZnMvbmxzL25sc19jcDg3NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NzY2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwODc0LmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfY3A4NzQuYworICoKKyAqIENoYXJzZXQgY3A4NzQgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MjAyNiwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiAweDkwKi8KKwkweDAwMDAsIDB4MjAxOCwgMHgyMDE5LCAweDIwMWMsCisJMHgyMDFkLCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogMHhhMCovCisJMHgwMGEwLCAweDBlMDEsIDB4MGUwMiwgMHgwZTAzLAorCTB4MGUwNCwgMHgwZTA1LCAweDBlMDYsIDB4MGUwNywKKwkweDBlMDgsIDB4MGUwOSwgMHgwZTBhLCAweDBlMGIsCisJMHgwZTBjLCAweDBlMGQsIDB4MGUwZSwgMHgwZTBmLAorCS8qIDB4YjAqLworCTB4MGUxMCwgMHgwZTExLCAweDBlMTIsIDB4MGUxMywKKwkweDBlMTQsIDB4MGUxNSwgMHgwZTE2LCAweDBlMTcsCisJMHgwZTE4LCAweDBlMTksIDB4MGUxYSwgMHgwZTFiLAorCTB4MGUxYywgMHgwZTFkLCAweDBlMWUsIDB4MGUxZiwKKwkvKiAweGMwKi8KKwkweDBlMjAsIDB4MGUyMSwgMHgwZTIyLCAweDBlMjMsCisJMHgwZTI0LCAweDBlMjUsIDB4MGUyNiwgMHgwZTI3LAorCTB4MGUyOCwgMHgwZTI5LCAweDBlMmEsIDB4MGUyYiwKKwkweDBlMmMsIDB4MGUyZCwgMHgwZTJlLCAweDBlMmYsCisJLyogMHhkMCovCisJMHgwZTMwLCAweDBlMzEsIDB4MGUzMiwgMHgwZTMzLAorCTB4MGUzNCwgMHgwZTM1LCAweDBlMzYsIDB4MGUzNywKKwkweDBlMzgsIDB4MGUzOSwgMHgwZTNhLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwZTNmLAorCS8qIDB4ZTAqLworCTB4MGU0MCwgMHgwZTQxLCAweDBlNDIsIDB4MGU0MywKKwkweDBlNDQsIDB4MGU0NSwgMHgwZTQ2LCAweDBlNDcsCisJMHgwZTQ4LCAweDBlNDksIDB4MGU0YSwgMHgwZTRiLAorCTB4MGU0YywgMHgwZTRkLCAweDBlNGUsIDB4MGU0ZiwKKwkvKiAweGYwKi8KKwkweDBlNTAsIDB4MGU1MSwgMHgwZTUyLCAweDBlNTMsCisJMHgwZTU0LCAweDBlNTUsIDB4MGU1NiwgMHgwZTU3LAorCTB4MGU1OCwgMHgwZTU5LCAweDBlNWEsIDB4MGU1YiwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTBlWzI1Nl0gPSB7CisJMHgwMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHgwMC0weDA3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHgwOC0weDBmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHgxMC0weDE3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHgxOC0weDFmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHgyMC0weDI3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHgyOC0weDJmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHgzMC0weDM3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkZiwgLyogMHgzOC0weDNmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHg0MC0weDQ3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHg0OC0weDRmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHg1MC0weDU3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjBbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDk3LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDkxLCAweDkyLCAweDAwLCAweDAwLCAweDkzLCAweDk0LCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweDAwLCAweDAwLCAweDAwLCAweDg1LCAweDAwLCAvKiAweDIwLTB4MjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIHBhZ2UwZSwgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCXBhZ2UyMCwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODUsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NSwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDg3NCIsCisJLmFsaWFzCQk9ICJ0aXMtNjIwIiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2NwODc0KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfY3A4NzQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19jcDg3NCkKK21vZHVsZV9leGl0KGV4aXRfbmxzX2NwODc0KQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfQUxJQVNfTkxTKHRpcy02MjApOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19jcDkzMi5jIGIvZnMvbmxzL25sc19jcDkzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMWExN2MKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwOTMyLmMKQEAgLTAsMCArMSw3OTM0IEBACisvKgorICogbGludXgvZnMvbmxzX2NwOTMyLmMKKyAqCisgKiBDaGFyc2V0IGNwOTMyIHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIFRoaXMgdHJhbnNsYXRpb24gdGFibGUgd2FzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LCB0aGUKKyAqIG9yaWdpbmFsIHRhYmxlIGNhbiBiZSBkb3dubG9hZCBmcm9tIHRoZSBNaWNyb3NvZnQgd2Vic2l0ZS4KKyAqIChodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS91bmljb2RlL3VuaWNvZGVjcC5odG0pCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGMydV84MVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDMwMDAsMHgzMDAxLDB4MzAwMiwweEZGMEMsMHhGRjBFLDB4MzBGQiwweEZGMUEsMHhGRjFCLC8qIDB4NDAtMHg0NyAqLworCTB4RkYxRiwweEZGMDEsMHgzMDlCLDB4MzA5QywweDAwQjQsMHhGRjQwLDB4MDBBOCwweEZGM0UsLyogMHg0OC0weDRGICovCisJMHhGRkUzLDB4RkYzRiwweDMwRkQsMHgzMEZFLDB4MzA5RCwweDMwOUUsMHgzMDAzLDB4NEVERCwvKiAweDUwLTB4NTcgKi8KKwkweDMwMDUsMHgzMDA2LDB4MzAwNywweDMwRkMsMHgyMDE1LDB4MjAxMCwweEZGMEYsMHhGRjNDLC8qIDB4NTgtMHg1RiAqLworCTB4RkY1RSwweDIyMjUsMHhGRjVDLDB4MjAyNiwweDIwMjUsMHgyMDE4LDB4MjAxOSwweDIwMUMsLyogMHg2MC0weDY3ICovCisJMHgyMDFELDB4RkYwOCwweEZGMDksMHgzMDE0LDB4MzAxNSwweEZGM0IsMHhGRjNELDB4RkY1QiwvKiAweDY4LTB4NkYgKi8KKwkweEZGNUQsMHgzMDA4LDB4MzAwOSwweDMwMEEsMHgzMDBCLDB4MzAwQywweDMwMEQsMHgzMDBFLC8qIDB4NzAtMHg3NyAqLworCTB4MzAwRiwweDMwMTAsMHgzMDExLDB4RkYwQiwweEZGMEQsMHgwMEIxLDB4MDBENywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwRjcsMHhGRjFELDB4MjI2MCwweEZGMUMsMHhGRjFFLDB4MjI2NiwweDIyNjcsMHgyMjFFLC8qIDB4ODAtMHg4NyAqLworCTB4MjIzNCwweDI2NDIsMHgyNjQwLDB4MDBCMCwweDIwMzIsMHgyMDMzLDB4MjEwMywweEZGRTUsLyogMHg4OC0weDhGICovCisJMHhGRjA0LDB4RkZFMCwweEZGRTEsMHhGRjA1LDB4RkYwMywweEZGMDYsMHhGRjBBLDB4RkYyMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwQTcsMHgyNjA2LDB4MjYwNSwweDI1Q0IsMHgyNUNGLDB4MjVDRSwweDI1QzcsMHgyNUM2LC8qIDB4OTgtMHg5RiAqLworCTB4MjVBMSwweDI1QTAsMHgyNUIzLDB4MjVCMiwweDI1QkQsMHgyNUJDLDB4MjAzQiwweDMwMTIsLyogMHhBMC0weEE3ICovCisJMHgyMTkyLDB4MjE5MCwweDIxOTEsMHgyMTkzLDB4MzAxMywweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEE4LTB4QUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QjAtMHhCNyAqLworCTB4MjIwOCwweDIyMEIsMHgyMjg2LDB4MjI4NywweDIyODIsMHgyMjgzLDB4MjIyQSwweDIyMjksLyogMHhCOC0weEJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEMwLTB4QzcgKi8KKwkweDIyMjcsMHgyMjI4LDB4RkZFMiwweDIxRDIsMHgyMUQ0LDB4MjIwMCwweDIyMDMsMHgwMDAwLC8qIDB4QzgtMHhDRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhEMC0weEQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDIyMjAsMHgyMkE1LDB4MjMxMiwweDIyMDIsMHgyMjA3LDB4MjI2MSwvKiAweEQ4LTB4REYgKi8KKwkweDIyNTIsMHgyMjZBLDB4MjI2QiwweDIyMUEsMHgyMjNELDB4MjIxRCwweDIyMzUsMHgyMjJCLC8qIDB4RTAtMHhFNyAqLworCTB4MjIyQywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhFOC0weEVGICovCisJMHgyMTJCLDB4MjAzMCwweDI2NkYsMHgyNjZELDB4MjY2QSwweDIwMjAsMHgyMDIxLDB4MDBCNiwvKiAweEYwLTB4RjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgyNUVGLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzgyWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4RkYxMCwvKiAweDQ4LTB4NEYgKi8KKwkweEZGMTEsMHhGRjEyLDB4RkYxMywweEZGMTQsMHhGRjE1LDB4RkYxNiwweEZGMTcsMHhGRjE4LC8qIDB4NTAtMHg1NyAqLworCTB4RkYxOSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHhGRjIxLDB4RkYyMiwweEZGMjMsMHhGRjI0LDB4RkYyNSwweEZGMjYsMHhGRjI3LDB4RkYyOCwvKiAweDYwLTB4NjcgKi8KKwkweEZGMjksMHhGRjJBLDB4RkYyQiwweEZGMkMsMHhGRjJELDB4RkYyRSwweEZGMkYsMHhGRjMwLC8qIDB4NjgtMHg2RiAqLworCTB4RkYzMSwweEZGMzIsMHhGRjMzLDB4RkYzNCwweEZGMzUsMHhGRjM2LDB4RkYzNywweEZGMzgsLyogMHg3MC0weDc3ICovCisJMHhGRjM5LDB4RkYzQSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEZGNDEsMHhGRjQyLDB4RkY0MywweEZGNDQsMHhGRjQ1LDB4RkY0NiwweEZGNDcsLyogMHg4MC0weDg3ICovCisJMHhGRjQ4LDB4RkY0OSwweEZGNEEsMHhGRjRCLDB4RkY0QywweEZGNEQsMHhGRjRFLDB4RkY0RiwvKiAweDg4LTB4OEYgKi8KKwkweEZGNTAsMHhGRjUxLDB4RkY1MiwweEZGNTMsMHhGRjU0LDB4RkY1NSwweEZGNTYsMHhGRjU3LC8qIDB4OTAtMHg5NyAqLworCTB4RkY1OCwweEZGNTksMHhGRjVBLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDMwNDEsLyogMHg5OC0weDlGICovCisJMHgzMDQyLDB4MzA0MywweDMwNDQsMHgzMDQ1LDB4MzA0NiwweDMwNDcsMHgzMDQ4LDB4MzA0OSwvKiAweEEwLTB4QTcgKi8KKwkweDMwNEEsMHgzMDRCLDB4MzA0QywweDMwNEQsMHgzMDRFLDB4MzA0RiwweDMwNTAsMHgzMDUxLC8qIDB4QTgtMHhBRiAqLworCTB4MzA1MiwweDMwNTMsMHgzMDU0LDB4MzA1NSwweDMwNTYsMHgzMDU3LDB4MzA1OCwweDMwNTksLyogMHhCMC0weEI3ICovCisJMHgzMDVBLDB4MzA1QiwweDMwNUMsMHgzMDVELDB4MzA1RSwweDMwNUYsMHgzMDYwLDB4MzA2MSwvKiAweEI4LTB4QkYgKi8KKwkweDMwNjIsMHgzMDYzLDB4MzA2NCwweDMwNjUsMHgzMDY2LDB4MzA2NywweDMwNjgsMHgzMDY5LC8qIDB4QzAtMHhDNyAqLworCTB4MzA2QSwweDMwNkIsMHgzMDZDLDB4MzA2RCwweDMwNkUsMHgzMDZGLDB4MzA3MCwweDMwNzEsLyogMHhDOC0weENGICovCisJMHgzMDcyLDB4MzA3MywweDMwNzQsMHgzMDc1LDB4MzA3NiwweDMwNzcsMHgzMDc4LDB4MzA3OSwvKiAweEQwLTB4RDcgKi8KKwkweDMwN0EsMHgzMDdCLDB4MzA3QywweDMwN0QsMHgzMDdFLDB4MzA3RiwweDMwODAsMHgzMDgxLC8qIDB4RDgtMHhERiAqLworCTB4MzA4MiwweDMwODMsMHgzMDg0LDB4MzA4NSwweDMwODYsMHgzMDg3LDB4MzA4OCwweDMwODksLyogMHhFMC0weEU3ICovCisJMHgzMDhBLDB4MzA4QiwweDMwOEMsMHgzMDhELDB4MzA4RSwweDMwOEYsMHgzMDkwLDB4MzA5MSwvKiAweEU4LTB4RUYgKi8KKwkweDMwOTIsMHgzMDkzLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjAtMHhGNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzgzWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MzBBMSwweDMwQTIsMHgzMEEzLDB4MzBBNCwweDMwQTUsMHgzMEE2LDB4MzBBNywweDMwQTgsLyogMHg0MC0weDQ3ICovCisJMHgzMEE5LDB4MzBBQSwweDMwQUIsMHgzMEFDLDB4MzBBRCwweDMwQUUsMHgzMEFGLDB4MzBCMCwvKiAweDQ4LTB4NEYgKi8KKwkweDMwQjEsMHgzMEIyLDB4MzBCMywweDMwQjQsMHgzMEI1LDB4MzBCNiwweDMwQjcsMHgzMEI4LC8qIDB4NTAtMHg1NyAqLworCTB4MzBCOSwweDMwQkEsMHgzMEJCLDB4MzBCQywweDMwQkQsMHgzMEJFLDB4MzBCRiwweDMwQzAsLyogMHg1OC0weDVGICovCisJMHgzMEMxLDB4MzBDMiwweDMwQzMsMHgzMEM0LDB4MzBDNSwweDMwQzYsMHgzMEM3LDB4MzBDOCwvKiAweDYwLTB4NjcgKi8KKwkweDMwQzksMHgzMENBLDB4MzBDQiwweDMwQ0MsMHgzMENELDB4MzBDRSwweDMwQ0YsMHgzMEQwLC8qIDB4NjgtMHg2RiAqLworCTB4MzBEMSwweDMwRDIsMHgzMEQzLDB4MzBENCwweDMwRDUsMHgzMEQ2LDB4MzBENywweDMwRDgsLyogMHg3MC0weDc3ICovCisJMHgzMEQ5LDB4MzBEQSwweDMwREIsMHgzMERDLDB4MzBERCwweDMwREUsMHgzMERGLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MzBFMCwweDMwRTEsMHgzMEUyLDB4MzBFMywweDMwRTQsMHgzMEU1LDB4MzBFNiwweDMwRTcsLyogMHg4MC0weDg3ICovCisJMHgzMEU4LDB4MzBFOSwweDMwRUEsMHgzMEVCLDB4MzBFQywweDMwRUQsMHgzMEVFLDB4MzBFRiwvKiAweDg4LTB4OEYgKi8KKwkweDMwRjAsMHgzMEYxLDB4MzBGMiwweDMwRjMsMHgzMEY0LDB4MzBGNSwweDMwRjYsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAzOTEsLyogMHg5OC0weDlGICovCisJMHgwMzkyLDB4MDM5MywweDAzOTQsMHgwMzk1LDB4MDM5NiwweDAzOTcsMHgwMzk4LDB4MDM5OSwvKiAweEEwLTB4QTcgKi8KKwkweDAzOUEsMHgwMzlCLDB4MDM5QywweDAzOUQsMHgwMzlFLDB4MDM5RiwweDAzQTAsMHgwM0ExLC8qIDB4QTgtMHhBRiAqLworCTB4MDNBMywweDAzQTQsMHgwM0E1LDB4MDNBNiwweDAzQTcsMHgwM0E4LDB4MDNBOSwweDAwMDAsLyogMHhCMC0weEI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDNCMSwvKiAweEI4LTB4QkYgKi8KKwkweDAzQjIsMHgwM0IzLDB4MDNCNCwweDAzQjUsMHgwM0I2LDB4MDNCNywweDAzQjgsMHgwM0I5LC8qIDB4QzAtMHhDNyAqLworCTB4MDNCQSwweDAzQkIsMHgwM0JDLDB4MDNCRCwweDAzQkUsMHgwM0JGLDB4MDNDMCwweDAzQzEsLyogMHhDOC0weENGICovCisJMHgwM0MzLDB4MDNDNCwweDAzQzUsMHgwM0M2LDB4MDNDNywweDAzQzgsMHgwM0M5LDB4MDAwMCwvKiAweEQwLTB4RDcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84NFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDA0MTAsMHgwNDExLDB4MDQxMiwweDA0MTMsMHgwNDE0LDB4MDQxNSwweDA0MDEsMHgwNDE2LC8qIDB4NDAtMHg0NyAqLworCTB4MDQxNywweDA0MTgsMHgwNDE5LDB4MDQxQSwweDA0MUIsMHgwNDFDLDB4MDQxRCwweDA0MUUsLyogMHg0OC0weDRGICovCisJMHgwNDFGLDB4MDQyMCwweDA0MjEsMHgwNDIyLDB4MDQyMywweDA0MjQsMHgwNDI1LDB4MDQyNiwvKiAweDUwLTB4NTcgKi8KKwkweDA0MjcsMHgwNDI4LDB4MDQyOSwweDA0MkEsMHgwNDJCLDB4MDQyQywweDA0MkQsMHgwNDJFLC8qIDB4NTgtMHg1RiAqLworCTB4MDQyRiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDA0MzAsMHgwNDMxLDB4MDQzMiwweDA0MzMsMHgwNDM0LDB4MDQzNSwweDA0NTEsMHgwNDM2LC8qIDB4NzAtMHg3NyAqLworCTB4MDQzNywweDA0MzgsMHgwNDM5LDB4MDQzQSwweDA0M0IsMHgwNDNDLDB4MDQzRCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDA0M0UsMHgwNDNGLDB4MDQ0MCwweDA0NDEsMHgwNDQyLDB4MDQ0MywweDA0NDQsMHgwNDQ1LC8qIDB4ODAtMHg4NyAqLworCTB4MDQ0NiwweDA0NDcsMHgwNDQ4LDB4MDQ0OSwweDA0NEEsMHgwNDRCLDB4MDQ0QywweDA0NEQsLyogMHg4OC0weDhGICovCisJMHgwNDRFLDB4MDQ0RiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgyNTAwLC8qIDB4OTgtMHg5RiAqLworCTB4MjUwMiwweDI1MEMsMHgyNTEwLDB4MjUxOCwweDI1MTQsMHgyNTFDLDB4MjUyQywweDI1MjQsLyogMHhBMC0weEE3ICovCisJMHgyNTM0LDB4MjUzQywweDI1MDEsMHgyNTAzLDB4MjUwRiwweDI1MTMsMHgyNTFCLDB4MjUxNywvKiAweEE4LTB4QUYgKi8KKwkweDI1MjMsMHgyNTMzLDB4MjUyQiwweDI1M0IsMHgyNTRCLDB4MjUyMCwweDI1MkYsMHgyNTI4LC8qIDB4QjAtMHhCNyAqLworCTB4MjUzNywweDI1M0YsMHgyNTFELDB4MjUzMCwweDI1MjUsMHgyNTM4LDB4MjU0MiwweDAwMDAsLyogMHhCOC0weEJGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfODdbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgyNDYwLDB4MjQ2MSwweDI0NjIsMHgyNDYzLDB4MjQ2NCwweDI0NjUsMHgyNDY2LDB4MjQ2NywvKiAweDQwLTB4NDcgKi8KKwkweDI0NjgsMHgyNDY5LDB4MjQ2QSwweDI0NkIsMHgyNDZDLDB4MjQ2RCwweDI0NkUsMHgyNDZGLC8qIDB4NDgtMHg0RiAqLworCTB4MjQ3MCwweDI0NzEsMHgyNDcyLDB4MjQ3MywweDIxNjAsMHgyMTYxLDB4MjE2MiwweDIxNjMsLyogMHg1MC0weDU3ICovCisJMHgyMTY0LDB4MjE2NSwweDIxNjYsMHgyMTY3LDB4MjE2OCwweDIxNjksMHgwMDAwLDB4MzM0OSwvKiAweDU4LTB4NUYgKi8KKwkweDMzMTQsMHgzMzIyLDB4MzM0RCwweDMzMTgsMHgzMzI3LDB4MzMwMywweDMzMzYsMHgzMzUxLC8qIDB4NjAtMHg2NyAqLworCTB4MzM1NywweDMzMEQsMHgzMzI2LDB4MzMyMywweDMzMkIsMHgzMzRBLDB4MzMzQiwweDMzOUMsLyogMHg2OC0weDZGICovCisJMHgzMzlELDB4MzM5RSwweDMzOEUsMHgzMzhGLDB4MzNDNCwweDMzQTEsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDMzN0IsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgzMDFELDB4MzAxRiwweDIxMTYsMHgzM0NELDB4MjEyMSwweDMyQTQsMHgzMkE1LDB4MzJBNiwvKiAweDgwLTB4ODcgKi8KKwkweDMyQTcsMHgzMkE4LDB4MzIzMSwweDMyMzIsMHgzMjM5LDB4MzM3RSwweDMzN0QsMHgzMzdDLC8qIDB4ODgtMHg4RiAqLworCTB4MjI1MiwweDIyNjEsMHgyMjJCLDB4MjIyRSwweDIyMTEsMHgyMjFBLDB4MjJBNSwweDIyMjAsLyogMHg5MC0weDk3ICovCisJMHgyMjFGLDB4MjJCRiwweDIyMzUsMHgyMjI5LDB4MjIyQSwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84OFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHg0RTlDLC8qIDB4OTgtMHg5RiAqLworCTB4NTUxNiwweDVBMDMsMHg5NjNGLDB4NTRDMCwweDYxMUIsMHg2MzI4LDB4NTlGNiwweDkwMjIsLyogMHhBMC0weEE3ICovCisJMHg4NDc1LDB4ODMxQywweDdBNTAsMHg2MEFBLDB4NjNFMSwweDZFMjUsMHg2NUVELDB4ODQ2NiwvKiAweEE4LTB4QUYgKi8KKwkweDgyQTYsMHg5QkY1LDB4Njg5MywweDU3MjcsMHg2NUExLDB4NjI3MSwweDVCOUIsMHg1OUQwLC8qIDB4QjAtMHhCNyAqLworCTB4ODY3QiwweDk4RjQsMHg3RDYyLDB4N0RCRSwweDlCOEUsMHg2MjE2LDB4N0M5RiwweDg4QjcsLyogMHhCOC0weEJGICovCisJMHg1Qjg5LDB4NUVCNSwweDYzMDksMHg2Njk3LDB4Njg0OCwweDk1QzcsMHg5NzhELDB4Njc0RiwvKiAweEMwLTB4QzcgKi8KKwkweDRFRTUsMHg0RjBBLDB4NEY0RCwweDRGOUQsMHg1MDQ5LDB4NTZGMiwweDU5MzcsMHg1OUQ0LC8qIDB4QzgtMHhDRiAqLworCTB4NUEwMSwweDVDMDksMHg2MERGLDB4NjEwRiwweDYxNzAsMHg2NjEzLDB4NjkwNSwweDcwQkEsLyogMHhEMC0weEQ3ICovCisJMHg3NTRGLDB4NzU3MCwweDc5RkIsMHg3REFELDB4N0RFRiwweDgwQzMsMHg4NDBFLDB4ODg2MywvKiAweEQ4LTB4REYgKi8KKwkweDhCMDIsMHg5MDU1LDB4OTA3QSwweDUzM0IsMHg0RTk1LDB4NEVBNSwweDU3REYsMHg4MEIyLC8qIDB4RTAtMHhFNyAqLworCTB4OTBDMSwweDc4RUYsMHg0RTAwLDB4NThGMSwweDZFQTIsMHg5MDM4LDB4N0EzMiwweDgzMjgsLyogMHhFOC0weEVGICovCisJMHg4MjhCLDB4OUMyRiwweDUxNDEsMHg1MzcwLDB4NTRCRCwweDU0RTEsMHg1NkUwLDB4NTlGQiwvKiAweEYwLTB4RjcgKi8KKwkweDVGMTUsMHg5OEYyLDB4NkRFQiwweDgwRTQsMHg4NTJELDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzg5WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTY2MiwweDk2NzAsMHg5NkEwLDB4OTdGQiwweDU0MEIsMHg1M0YzLDB4NUI4NywweDcwQ0YsLyogMHg0MC0weDQ3ICovCisJMHg3RkJELDB4OEZDMiwweDk2RTgsMHg1MzZGLDB4OUQ1QywweDdBQkEsMHg0RTExLDB4Nzg5MywvKiAweDQ4LTB4NEYgKi8KKwkweDgxRkMsMHg2RTI2LDB4NTYxOCwweDU1MDQsMHg2QjFELDB4ODUxQSwweDlDM0IsMHg1OUU1LC8qIDB4NTAtMHg1NyAqLworCTB4NTNBOSwweDZENjYsMHg3NERDLDB4OTU4RiwweDU2NDIsMHg0RTkxLDB4OTA0QiwweDk2RjIsLyogMHg1OC0weDVGICovCisJMHg4MzRGLDB4OTkwQywweDUzRTEsMHg1NUI2LDB4NUIzMCwweDVGNzEsMHg2NjIwLDB4NjZGMywvKiAweDYwLTB4NjcgKi8KKwkweDY4MDQsMHg2QzM4LDB4NkNGMywweDZEMjksMHg3NDVCLDB4NzZDOCwweDdBNEUsMHg5ODM0LC8qIDB4NjgtMHg2RiAqLworCTB4ODJGMSwweDg4NUIsMHg4QTYwLDB4OTJFRCwweDZEQjIsMHg3NUFCLDB4NzZDQSwweDk5QzUsLyogMHg3MC0weDc3ICovCisJMHg2MEE2LDB4OEIwMSwweDhEOEEsMHg5NUIyLDB4Njk4RSwweDUzQUQsMHg1MTg2LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NTcxMiwweDU4MzAsMHg1OTQ0LDB4NUJCNCwweDVFRjYsMHg2MDI4LDB4NjNBOSwweDYzRjQsLyogMHg4MC0weDg3ICovCisJMHg2Q0JGLDB4NkYxNCwweDcwOEUsMHg3MTE0LDB4NzE1OSwweDcxRDUsMHg3MzNGLDB4N0UwMSwvKiAweDg4LTB4OEYgKi8KKwkweDgyNzYsMHg4MkQxLDB4ODU5NywweDkwNjAsMHg5MjVCLDB4OUQxQiwweDU4NjksMHg2NUJDLC8qIDB4OTAtMHg5NyAqLworCTB4NkM1QSwweDc1MjUsMHg1MUY5LDB4NTkyRSwweDU5NjUsMHg1RjgwLDB4NUZEQywweDYyQkMsLyogMHg5OC0weDlGICovCisJMHg2NUZBLDB4NkEyQSwweDZCMjcsMHg2QkI0LDB4NzM4QiwweDdGQzEsMHg4OTU2LDB4OUQyQywvKiAweEEwLTB4QTcgKi8KKwkweDlEMEUsMHg5RUM0LDB4NUNBMSwweDZDOTYsMHg4MzdCLDB4NTEwNCwweDVDNEIsMHg2MUI2LC8qIDB4QTgtMHhBRiAqLworCTB4ODFDNiwweDY4NzYsMHg3MjYxLDB4NEU1OSwweDRGRkEsMHg1Mzc4LDB4NjA2OSwweDZFMjksLyogMHhCMC0weEI3ICovCisJMHg3QTRGLDB4OTdGMywweDRFMEIsMHg1MzE2LDB4NEVFRSwweDRGNTUsMHg0RjNELDB4NEZBMSwvKiAweEI4LTB4QkYgKi8KKwkweDRGNzMsMHg1MkEwLDB4NTNFRiwweDU2MDksMHg1OTBGLDB4NUFDMSwweDVCQjYsMHg1QkUxLC8qIDB4QzAtMHhDNyAqLworCTB4NzlEMSwweDY2ODcsMHg2NzlDLDB4NjdCNiwweDZCNEMsMHg2Q0IzLDB4NzA2QiwweDczQzIsLyogMHhDOC0weENGICovCisJMHg3OThELDB4NzlCRSwweDdBM0MsMHg3Qjg3LDB4ODJCMSwweDgyREIsMHg4MzA0LDB4ODM3NywvKiAweEQwLTB4RDcgKi8KKwkweDgzRUYsMHg4M0QzLDB4ODc2NiwweDhBQjIsMHg1NjI5LDB4OENBOCwweDhGRTYsMHg5MDRFLC8qIDB4RDgtMHhERiAqLworCTB4OTcxRSwweDg2OEEsMHg0RkM0LDB4NUNFOCwweDYyMTEsMHg3MjU5LDB4NzUzQiwweDgxRTUsLyogMHhFMC0weEU3ICovCisJMHg4MkJELDB4ODZGRSwweDhDQzAsMHg5NkM1LDB4OTkxMywweDk5RDUsMHg0RUNCLDB4NEYxQSwvKiAweEU4LTB4RUYgKi8KKwkweDg5RTMsMHg1NkRFLDB4NTg0QSwweDU4Q0EsMHg1RUZCLDB4NUZFQiwweDYwMkEsMHg2MDk0LC8qIDB4RjAtMHhGNyAqLworCTB4NjA2MiwweDYxRDAsMHg2MjEyLDB4NjJEMCwweDY1MzksMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOEFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5QjQxLDB4NjY2NiwweDY4QjAsMHg2RDc3LDB4NzA3MCwweDc1NEMsMHg3Njg2LDB4N0Q3NSwvKiAweDQwLTB4NDcgKi8KKwkweDgyQTUsMHg4N0Y5LDB4OTU4QiwweDk2OEUsMHg4QzlELDB4NTFGMSwweDUyQkUsMHg1OTE2LC8qIDB4NDgtMHg0RiAqLworCTB4NTRCMywweDVCQjMsMHg1RDE2LDB4NjE2OCwweDY5ODIsMHg2REFGLDB4Nzg4RCwweDg0Q0IsLyogMHg1MC0weDU3ICovCisJMHg4ODU3LDB4OEE3MiwweDkzQTcsMHg5QUI4LDB4NkQ2QywweDk5QTgsMHg4NkQ5LDB4NTdBMywvKiAweDU4LTB4NUYgKi8KKwkweDY3RkYsMHg4NkNFLDB4OTIwRSwweDUyODMsMHg1Njg3LDB4NTQwNCwweDVFRDMsMHg2MkUxLC8qIDB4NjAtMHg2NyAqLworCTB4NjRCOSwweDY4M0MsMHg2ODM4LDB4NkJCQiwweDczNzIsMHg3OEJBLDB4N0E2QiwweDg5OUEsLyogMHg2OC0weDZGICovCisJMHg4OUQyLDB4OEQ2QiwweDhGMDMsMHg5MEVELDB4OTVBMywweDk2OTQsMHg5NzY5LDB4NUI2NiwvKiAweDcwLTB4NzcgKi8KKwkweDVDQjMsMHg2OTdELDB4OTg0RCwweDk4NEUsMHg2MzlCLDB4N0IyMCwweDZBMkIsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg2QTdGLDB4NjhCNiwweDlDMEQsMHg2RjVGLDB4NTI3MiwweDU1OUQsMHg2MDcwLDB4NjJFQywvKiAweDgwLTB4ODcgKi8KKwkweDZEM0IsMHg2RTA3LDB4NkVEMSwweDg0NUIsMHg4OTEwLDB4OEY0NCwweDRFMTQsMHg5QzM5LC8qIDB4ODgtMHg4RiAqLworCTB4NTNGNiwweDY5MUIsMHg2QTNBLDB4OTc4NCwweDY4MkEsMHg1MTVDLDB4N0FDMywweDg0QjIsLyogMHg5MC0weDk3ICovCisJMHg5MURDLDB4OTM4QywweDU2NUIsMHg5RDI4LDB4NjgyMiwweDgzMDUsMHg4NDMxLDB4N0NBNSwvKiAweDk4LTB4OUYgKi8KKwkweDUyMDgsMHg4MkM1LDB4NzRFNiwweDRFN0UsMHg0RjgzLDB4NTFBMCwweDVCRDIsMHg1MjBBLC8qIDB4QTAtMHhBNyAqLworCTB4NTJEOCwweDUyRTcsMHg1REZCLDB4NTU5QSwweDU4MkEsMHg1OUU2LDB4NUI4QywweDVCOTgsLyogMHhBOC0weEFGICovCisJMHg1QkRCLDB4NUU3MiwweDVFNzksMHg2MEEzLDB4NjExRiwweDYxNjMsMHg2MUJFLDB4NjNEQiwvKiAweEIwLTB4QjcgKi8KKwkweDY1NjIsMHg2N0QxLDB4Njg1MywweDY4RkEsMHg2QjNFLDB4NkI1MywweDZDNTcsMHg2RjIyLC8qIDB4QjgtMHhCRiAqLworCTB4NkY5NywweDZGNDUsMHg3NEIwLDB4NzUxOCwweDc2RTMsMHg3NzBCLDB4N0FGRiwweDdCQTEsLyogMHhDMC0weEM3ICovCisJMHg3QzIxLDB4N0RFOSwweDdGMzYsMHg3RkYwLDB4ODA5RCwweDgyNjYsMHg4MzlFLDB4ODlCMywvKiAweEM4LTB4Q0YgKi8KKwkweDhBQ0MsMHg4Q0FCLDB4OTA4NCwweDk0NTEsMHg5NTkzLDB4OTU5MSwweDk1QTIsMHg5NjY1LC8qIDB4RDAtMHhENyAqLworCTB4OTdEMywweDk5MjgsMHg4MjE4LDB4NEUzOCwweDU0MkIsMHg1Q0I4LDB4NURDQywweDczQTksLyogMHhEOC0weERGICovCisJMHg3NjRDLDB4NzczQywweDVDQTksMHg3RkVCLDB4OEQwQiwweDk2QzEsMHg5ODExLDB4OTg1NCwvKiAweEUwLTB4RTcgKi8KKwkweDk4NTgsMHg0RjAxLDB4NEYwRSwweDUzNzEsMHg1NTlDLDB4NTY2OCwweDU3RkEsMHg1OTQ3LC8qIDB4RTgtMHhFRiAqLworCTB4NUIwOSwweDVCQzQsMHg1QzkwLDB4NUUwQywweDVFN0UsMHg1RkNDLDB4NjNFRSwweDY3M0EsLyogMHhGMC0weEY3ICovCisJMHg2NUQ3LDB4NjVFMiwweDY3MUYsMHg2OENCLDB4NjhDNCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84QlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDZBNUYsMHg1RTMwLDB4NkJDNSwweDZDMTcsMHg2QzdELDB4NzU3RiwweDc5NDgsMHg1QjYzLC8qIDB4NDAtMHg0NyAqLworCTB4N0EwMCwweDdEMDAsMHg1RkJELDB4ODk4RiwweDhBMTgsMHg4Q0I0LDB4OEQ3NywweDhFQ0MsLyogMHg0OC0weDRGICovCisJMHg4RjFELDB4OThFMiwweDlBMEUsMHg5QjNDLDB4NEU4MCwweDUwN0QsMHg1MTAwLDB4NTk5MywvKiAweDUwLTB4NTcgKi8KKwkweDVCOUMsMHg2MjJGLDB4NjI4MCwweDY0RUMsMHg2QjNBLDB4NzJBMCwweDc1OTEsMHg3OTQ3LC8qIDB4NTgtMHg1RiAqLworCTB4N0ZBOSwweDg3RkIsMHg4QUJDLDB4OEI3MCwweDYzQUMsMHg4M0NBLDB4OTdBMCwweDU0MDksLyogMHg2MC0weDY3ICovCisJMHg1NDAzLDB4NTVBQiwweDY4NTQsMHg2QTU4LDB4OEE3MCwweDc4MjcsMHg2Nzc1LDB4OUVDRCwvKiAweDY4LTB4NkYgKi8KKwkweDUzNzQsMHg1QkEyLDB4ODExQSwweDg2NTAsMHg5MDA2LDB4NEUxOCwweDRFNDUsMHg0RUM3LC8qIDB4NzAtMHg3NyAqLworCTB4NEYxMSwweDUzQ0EsMHg1NDM4LDB4NUJBRSwweDVGMTMsMHg2MDI1LDB4NjU1MSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDY3M0QsMHg2QzQyLDB4NkM3MiwweDZDRTMsMHg3MDc4LDB4NzQwMywweDdBNzYsMHg3QUFFLC8qIDB4ODAtMHg4NyAqLworCTB4N0IwOCwweDdEMUEsMHg3Q0ZFLDB4N0Q2NiwweDY1RTcsMHg3MjVCLDB4NTNCQiwweDVDNDUsLyogMHg4OC0weDhGICovCisJMHg1REU4LDB4NjJEMiwweDYyRTAsMHg2MzE5LDB4NkUyMCwweDg2NUEsMHg4QTMxLDB4OERERCwvKiAweDkwLTB4OTcgKi8KKwkweDkyRjgsMHg2RjAxLDB4NzlBNiwweDlCNUEsMHg0RUE4LDB4NEVBQiwweDRFQUMsMHg0RjlCLC8qIDB4OTgtMHg5RiAqLworCTB4NEZBMCwweDUwRDEsMHg1MTQ3LDB4N0FGNiwweDUxNzEsMHg1MUY2LDB4NTM1NCwweDUzMjEsLyogMHhBMC0weEE3ICovCisJMHg1MzdGLDB4NTNFQiwweDU1QUMsMHg1ODgzLDB4NUNFMSwweDVGMzcsMHg1RjRBLDB4NjAyRiwvKiAweEE4LTB4QUYgKi8KKwkweDYwNTAsMHg2MDZELDB4NjMxRiwweDY1NTksMHg2QTRCLDB4NkNDMSwweDcyQzIsMHg3MkVELC8qIDB4QjAtMHhCNyAqLworCTB4NzdFRiwweDgwRjgsMHg4MTA1LDB4ODIwOCwweDg1NEUsMHg5MEY3LDB4OTNFMSwweDk3RkYsLyogMHhCOC0weEJGICovCisJMHg5OTU3LDB4OUE1QSwweDRFRjAsMHg1MURELDB4NUMyRCwweDY2ODEsMHg2OTZELDB4NUM0MCwvKiAweEMwLTB4QzcgKi8KKwkweDY2RjIsMHg2OTc1LDB4NzM4OSwweDY4NTAsMHg3QzgxLDB4NTBDNSwweDUyRTQsMHg1NzQ3LC8qIDB4QzgtMHhDRiAqLworCTB4NURGRSwweDkzMjYsMHg2NUE0LDB4NkIyMywweDZCM0QsMHg3NDM0LDB4Nzk4MSwweDc5QkQsLyogMHhEMC0weEQ3ICovCisJMHg3QjRCLDB4N0RDQSwweDgyQjksMHg4M0NDLDB4ODg3RiwweDg5NUYsMHg4QjM5LDB4OEZEMSwvKiAweEQ4LTB4REYgKi8KKwkweDkxRDEsMHg1NDFGLDB4OTI4MCwweDRFNUQsMHg1MDM2LDB4NTNFNSwweDUzM0EsMHg3MkQ3LC8qIDB4RTAtMHhFNyAqLworCTB4NzM5NiwweDc3RTksMHg4MkU2LDB4OEVBRiwweDk5QzYsMHg5OUM4LDB4OTlEMiwweDUxNzcsLyogMHhFOC0weEVGICovCisJMHg2MTFBLDB4ODY1RSwweDU1QjAsMHg3QTdBLDB4NTA3NiwweDVCRDMsMHg5MDQ3LDB4OTY4NSwvKiAweEYwLTB4RjcgKi8KKwkweDRFMzIsMHg2QURCLDB4OTFFNywweDVDNTEsMHg1QzQ4LDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzhDWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NjM5OCwweDdBOUYsMHg2QzkzLDB4OTc3NCwweDhGNjEsMHg3QUFBLDB4NzE4QSwweDk2ODgsLyogMHg0MC0weDQ3ICovCisJMHg3QzgyLDB4NjgxNywweDdFNzAsMHg2ODUxLDB4OTM2QywweDUyRjIsMHg1NDFCLDB4ODVBQiwvKiAweDQ4LTB4NEYgKi8KKwkweDhBMTMsMHg3RkE0LDB4OEVDRCwweDkwRTEsMHg1MzY2LDB4ODg4OCwweDc5NDEsMHg0RkMyLC8qIDB4NTAtMHg1NyAqLworCTB4NTBCRSwweDUyMTEsMHg1MTQ0LDB4NTU1MywweDU3MkQsMHg3M0VBLDB4NTc4QiwweDU5NTEsLyogMHg1OC0weDVGICovCisJMHg1RjYyLDB4NUY4NCwweDYwNzUsMHg2MTc2LDB4NjE2NywweDYxQTksMHg2M0IyLDB4NjQzQSwvKiAweDYwLTB4NjcgKi8KKwkweDY1NkMsMHg2NjZGLDB4Njg0MiwweDZFMTMsMHg3NTY2LDB4N0EzRCwweDdDRkIsMHg3RDRDLC8qIDB4NjgtMHg2RiAqLworCTB4N0Q5OSwweDdFNEIsMHg3RjZCLDB4ODMwRSwweDgzNEEsMHg4NkNELDB4OEEwOCwweDhBNjMsLyogMHg3MC0weDc3ICovCisJMHg4QjY2LDB4OEVGRCwweDk4MUEsMHg5RDhGLDB4ODJCOCwweDhGQ0UsMHg5QkU4LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NTI4NywweDYyMUYsMHg2NDgzLDB4NkZDMCwweDk2OTksMHg2ODQxLDB4NTA5MSwweDZCMjAsLyogMHg4MC0weDg3ICovCisJMHg2QzdBLDB4NkY1NCwweDdBNzQsMHg3RDUwLDB4ODg0MCwweDhBMjMsMHg2NzA4LDB4NEVGNiwvKiAweDg4LTB4OEYgKi8KKwkweDUwMzksMHg1MDI2LDB4NTA2NSwweDUxN0MsMHg1MjM4LDB4NTI2MywweDU1QTcsMHg1NzBGLC8qIDB4OTAtMHg5NyAqLworCTB4NTgwNSwweDVBQ0MsMHg1RUZBLDB4NjFCMiwweDYxRjgsMHg2MkYzLDB4NjM3MiwweDY5MUMsLyogMHg5OC0weDlGICovCisJMHg2QTI5LDB4NzI3RCwweDcyQUMsMHg3MzJFLDB4NzgxNCwweDc4NkYsMHg3RDc5LDB4NzcwQywvKiAweEEwLTB4QTcgKi8KKwkweDgwQTksMHg4OThCLDB4OEIxOSwweDhDRTIsMHg4RUQyLDB4OTA2MywweDkzNzUsMHg5NjdBLC8qIDB4QTgtMHhBRiAqLworCTB4OTg1NSwweDlBMTMsMHg5RTc4LDB4NTE0MywweDUzOUYsMHg1M0IzLDB4NUU3QiwweDVGMjYsLyogMHhCMC0weEI3ICovCisJMHg2RTFCLDB4NkU5MCwweDczODQsMHg3M0ZFLDB4N0Q0MywweDgyMzcsMHg4QTAwLDB4OEFGQSwvKiAweEI4LTB4QkYgKi8KKwkweDk2NTAsMHg0RTRFLDB4NTAwQiwweDUzRTQsMHg1NDdDLDB4NTZGQSwweDU5RDEsMHg1QjY0LC8qIDB4QzAtMHhDNyAqLworCTB4NURGMSwweDVFQUIsMHg1RjI3LDB4NjIzOCwweDY1NDUsMHg2N0FGLDB4NkU1NiwweDcyRDAsLyogMHhDOC0weENGICovCisJMHg3Q0NBLDB4ODhCNCwweDgwQTEsMHg4MEUxLDB4ODNGMCwweDg2NEUsMHg4QTg3LDB4OERFOCwvKiAweEQwLTB4RDcgKi8KKwkweDkyMzcsMHg5NkM3LDB4OTg2NywweDlGMTMsMHg0RTk0LDB4NEU5MiwweDRGMEQsMHg1MzQ4LC8qIDB4RDgtMHhERiAqLworCTB4NTQ0OSwweDU0M0UsMHg1QTJGLDB4NUY4QywweDVGQTEsMHg2MDlGLDB4NjhBNywweDZBOEUsLyogMHhFMC0weEU3ICovCisJMHg3NDVBLDB4Nzg4MSwweDhBOUUsMHg4QUE0LDB4OEI3NywweDkxOTAsMHg0RTVFLDB4OUJDOSwvKiAweEU4LTB4RUYgKi8KKwkweDRFQTQsMHg0RjdDLDB4NEZBRiwweDUwMTksMHg1MDE2LDB4NTE0OSwweDUxNkMsMHg1MjlGLC8qIDB4RjAtMHhGNyAqLworCTB4NTJCOSwweDUyRkUsMHg1MzlBLDB4NTNFMywweDU0MTEsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOERbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1NDBFLDB4NTU4OSwweDU3NTEsMHg1N0EyLDB4NTk3RCwweDVCNTQsMHg1QjVELDB4NUI4RiwvKiAweDQwLTB4NDcgKi8KKwkweDVERTUsMHg1REU3LDB4NURGNywweDVFNzgsMHg1RTgzLDB4NUU5QSwweDVFQjcsMHg1RjE4LC8qIDB4NDgtMHg0RiAqLworCTB4NjA1MiwweDYxNEMsMHg2Mjk3LDB4NjJEOCwweDYzQTcsMHg2NTNCLDB4NjYwMiwweDY2NDMsLyogMHg1MC0weDU3ICovCisJMHg2NkY0LDB4Njc2RCwweDY4MjEsMHg2ODk3LDB4NjlDQiwweDZDNUYsMHg2RDJBLDB4NkQ2OSwvKiAweDU4LTB4NUYgKi8KKwkweDZFMkYsMHg2RTlELDB4NzUzMiwweDc2ODcsMHg3ODZDLDB4N0EzRiwweDdDRTAsMHg3RDA1LC8qIDB4NjAtMHg2NyAqLworCTB4N0QxOCwweDdENUUsMHg3REIxLDB4ODAxNSwweDgwMDMsMHg4MEFGLDB4ODBCMSwweDgxNTQsLyogMHg2OC0weDZGICovCisJMHg4MThGLDB4ODIyQSwweDgzNTIsMHg4ODRDLDB4ODg2MSwweDhCMUIsMHg4Q0EyLDB4OENGQywvKiAweDcwLTB4NzcgKi8KKwkweDkwQ0EsMHg5MTc1LDB4OTI3MSwweDc4M0YsMHg5MkZDLDB4OTVBNCwweDk2NEQsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5ODA1LDB4OTk5OSwweDlBRDgsMHg5RDNCLDB4NTI1QiwweDUyQUIsMHg1M0Y3LDB4NTQwOCwvKiAweDgwLTB4ODcgKi8KKwkweDU4RDUsMHg2MkY3LDB4NkZFMCwweDhDNkEsMHg4RjVGLDB4OUVCOSwweDUxNEIsMHg1MjNCLC8qIDB4ODgtMHg4RiAqLworCTB4NTQ0QSwweDU2RkQsMHg3QTQwLDB4OTE3NywweDlENjAsMHg5RUQyLDB4NzM0NCwweDZGMDksLyogMHg5MC0weDk3ICovCisJMHg4MTcwLDB4NzUxMSwweDVGRkQsMHg2MERBLDB4OUFBOCwweDcyREIsMHg4RkJDLDB4NkI2NCwvKiAweDk4LTB4OUYgKi8KKwkweDk4MDMsMHg0RUNBLDB4NTZGMCwweDU3NjQsMHg1OEJFLDB4NUE1QSwweDYwNjgsMHg2MUM3LC8qIDB4QTAtMHhBNyAqLworCTB4NjYwRiwweDY2MDYsMHg2ODM5LDB4NjhCMSwweDZERjcsMHg3NUQ1LDB4N0QzQSwweDgyNkUsLyogMHhBOC0weEFGICovCisJMHg5QjQyLDB4NEU5QiwweDRGNTAsMHg1M0M5LDB4NTUwNiwweDVENkYsMHg1REU2LDB4NURFRSwvKiAweEIwLTB4QjcgKi8KKwkweDY3RkIsMHg2Qzk5LDB4NzQ3MywweDc4MDIsMHg4QTUwLDB4OTM5NiwweDg4REYsMHg1NzUwLC8qIDB4QjgtMHhCRiAqLworCTB4NUVBNywweDYzMkIsMHg1MEI1LDB4NTBBQywweDUxOEQsMHg2NzAwLDB4NTRDOSwweDU4NUUsLyogMHhDMC0weEM3ICovCisJMHg1OUJCLDB4NUJCMCwweDVGNjksMHg2MjRELDB4NjNBMSwweDY4M0QsMHg2QjczLDB4NkUwOCwvKiAweEM4LTB4Q0YgKi8KKwkweDcwN0QsMHg5MUM3LDB4NzI4MCwweDc4MTUsMHg3ODI2LDB4Nzk2RCwweDY1OEUsMHg3RDMwLC8qIDB4RDAtMHhENyAqLworCTB4ODNEQywweDg4QzEsMHg4RjA5LDB4OTY5QiwweDUyNjQsMHg1NzI4LDB4Njc1MCwweDdGNkEsLyogMHhEOC0weERGICovCisJMHg4Q0ExLDB4NTFCNCwweDU3NDIsMHg5NjJBLDB4NTgzQSwweDY5OEEsMHg4MEI0LDB4NTRCMiwvKiAweEUwLTB4RTcgKi8KKwkweDVEMEUsMHg1N0ZDLDB4Nzg5NSwweDlERkEsMHg0RjVDLDB4NTI0QSwweDU0OEIsMHg2NDNFLC8qIDB4RTgtMHhFRiAqLworCTB4NjYyOCwweDY3MTQsMHg2N0Y1LDB4N0E4NCwweDdCNTYsMHg3RDIyLDB4OTMyRiwweDY4NUMsLyogMHhGMC0weEY3ICovCisJMHg5QkFELDB4N0IzOSwweDUzMTksMHg1MThBLDB4NTIzNywweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84RVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDVCREYsMHg2MkY2LDB4NjRBRSwweDY0RTYsMHg2NzJELDB4NkJCQSwweDg1QTksMHg5NkQxLC8qIDB4NDAtMHg0NyAqLworCTB4NzY5MCwweDlCRDYsMHg2MzRDLDB4OTMwNiwweDlCQUIsMHg3NkJGLDB4NjY1MiwweDRFMDksLyogMHg0OC0weDRGICovCisJMHg1MDk4LDB4NTNDMiwweDVDNzEsMHg2MEU4LDB4NjQ5MiwweDY1NjMsMHg2ODVGLDB4NzFFNiwvKiAweDUwLTB4NTcgKi8KKwkweDczQ0EsMHg3NTIzLDB4N0I5NywweDdFODIsMHg4Njk1LDB4OEI4MywweDhDREIsMHg5MTc4LC8qIDB4NTgtMHg1RiAqLworCTB4OTkxMCwweDY1QUMsMHg2NkFCLDB4NkI4QiwweDRFRDUsMHg0RUQ0LDB4NEYzQSwweDRGN0YsLyogMHg2MC0weDY3ICovCisJMHg1MjNBLDB4NTNGOCwweDUzRjIsMHg1NUUzLDB4NTZEQiwweDU4RUIsMHg1OUNCLDB4NTlDOSwvKiAweDY4LTB4NkYgKi8KKwkweDU5RkYsMHg1QjUwLDB4NUM0RCwweDVFMDIsMHg1RTJCLDB4NUZENywweDYwMUQsMHg2MzA3LC8qIDB4NzAtMHg3NyAqLworCTB4NjUyRiwweDVCNUMsMHg2NUFGLDB4NjVCRCwweDY1RTgsMHg2NzlELDB4NkI2MiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDZCN0IsMHg2QzBGLDB4NzM0NSwweDc5NDksMHg3OUMxLDB4N0NGOCwweDdEMTksMHg3RDJCLC8qIDB4ODAtMHg4NyAqLworCTB4ODBBMiwweDgxMDIsMHg4MUYzLDB4ODk5NiwweDhBNUUsMHg4QTY5LDB4OEE2NiwweDhBOEMsLyogMHg4OC0weDhGICovCisJMHg4QUVFLDB4OENDNywweDhDREMsMHg5NkNDLDB4OThGQywweDZCNkYsMHg0RThCLDB4NEYzQywvKiAweDkwLTB4OTcgKi8KKwkweDRGOEQsMHg1MTUwLDB4NUI1NywweDVCRkEsMHg2MTQ4LDB4NjMwMSwweDY2NDIsMHg2QjIxLC8qIDB4OTgtMHg5RiAqLworCTB4NkVDQiwweDZDQkIsMHg3MjNFLDB4NzRCRCwweDc1RDQsMHg3OEMxLDB4NzkzQSwweDgwMEMsLyogMHhBMC0weEE3ICovCisJMHg4MDMzLDB4ODFFQSwweDg0OTQsMHg4RjlFLDB4NkM1MCwweDlFN0YsMHg1RjBGLDB4OEI1OCwvKiAweEE4LTB4QUYgKi8KKwkweDlEMkIsMHg3QUZBLDB4OEVGOCwweDVCOEQsMHg5NkVCLDB4NEUwMywweDUzRjEsMHg1N0Y3LC8qIDB4QjAtMHhCNyAqLworCTB4NTkzMSwweDVBQzksMHg1QkE0LDB4NjA4OSwweDZFN0YsMHg2RjA2LDB4NzVCRSwweDhDRUEsLyogMHhCOC0weEJGICovCisJMHg1QjlGLDB4ODUwMCwweDdCRTAsMHg1MDcyLDB4NjdGNCwweDgyOUQsMHg1QzYxLDB4ODU0QSwvKiAweEMwLTB4QzcgKi8KKwkweDdFMUUsMHg4MjBFLDB4NTE5OSwweDVDMDQsMHg2MzY4LDB4OEQ2NiwweDY1OUMsMHg3MTZFLC8qIDB4QzgtMHhDRiAqLworCTB4NzkzRSwweDdEMTcsMHg4MDA1LDB4OEIxRCwweDhFQ0EsMHg5MDZFLDB4ODZDNywweDkwQUEsLyogMHhEMC0weEQ3ICovCisJMHg1MDFGLDB4NTJGQSwweDVDM0EsMHg2NzUzLDB4NzA3QywweDcyMzUsMHg5MTRDLDB4OTFDOCwvKiAweEQ4LTB4REYgKi8KKwkweDkzMkIsMHg4MkU1LDB4NUJDMiwweDVGMzEsMHg2MEY5LDB4NEUzQiwweDUzRDYsMHg1Qjg4LC8qIDB4RTAtMHhFNyAqLworCTB4NjI0QiwweDY3MzEsMHg2QjhBLDB4NzJFOSwweDczRTAsMHg3QTJFLDB4ODE2QiwweDhEQTMsLyogMHhFOC0weEVGICovCisJMHg5MTUyLDB4OTk5NiwweDUxMTIsMHg1M0Q3LDB4NTQ2QSwweDVCRkYsMHg2Mzg4LDB4NkEzOSwvKiAweEYwLTB4RjcgKi8KKwkweDdEQUMsMHg5NzAwLDB4NTZEQSwweDUzQ0UsMHg1NDY4LDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzhGWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NUI5NywweDVDMzEsMHg1RERFLDB4NEZFRSwweDYxMDEsMHg2MkZFLDB4NkQzMiwweDc5QzAsLyogMHg0MC0weDQ3ICovCisJMHg3OUNCLDB4N0Q0MiwweDdFNEQsMHg3RkQyLDB4ODFFRCwweDgyMUYsMHg4NDkwLDB4ODg0NiwvKiAweDQ4LTB4NEYgKi8KKwkweDg5NzIsMHg4QjkwLDB4OEU3NCwweDhGMkYsMHg5MDMxLDB4OTE0QiwweDkxNkMsMHg5NkM2LC8qIDB4NTAtMHg1NyAqLworCTB4OTE5QywweDRFQzAsMHg0RjRGLDB4NTE0NSwweDUzNDEsMHg1RjkzLDB4NjIwRSwweDY3RDQsLyogMHg1OC0weDVGICovCisJMHg2QzQxLDB4NkUwQiwweDczNjMsMHg3RTI2LDB4OTFDRCwweDkyODMsMHg1M0Q0LDB4NTkxOSwvKiAweDYwLTB4NjcgKi8KKwkweDVCQkYsMHg2REQxLDB4Nzk1RCwweDdFMkUsMHg3QzlCLDB4NTg3RSwweDcxOUYsMHg1MUZBLC8qIDB4NjgtMHg2RiAqLworCTB4ODg1MywweDhGRjAsMHg0RkNBLDB4NUNGQiwweDY2MjUsMHg3N0FDLDB4N0FFMywweDgyMUMsLyogMHg3MC0weDc3ICovCisJMHg5OUZGLDB4NTFDNiwweDVGQUEsMHg2NUVDLDB4Njk2RiwweDZCODksMHg2REYzLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NkU5NiwweDZGNjQsMHg3NkZFLDB4N0QxNCwweDVERTEsMHg5MDc1LDB4OTE4NywweDk4MDYsLyogMHg4MC0weDg3ICovCisJMHg1MUU2LDB4NTIxRCwweDYyNDAsMHg2NjkxLDB4NjZEOSwweDZFMUEsMHg1RUI2LDB4N0REMiwvKiAweDg4LTB4OEYgKi8KKwkweDdGNzIsMHg2NkY4LDB4ODVBRiwweDg1RjcsMHg4QUY4LDB4NTJBOSwweDUzRDksMHg1OTczLC8qIDB4OTAtMHg5NyAqLworCTB4NUU4RiwweDVGOTAsMHg2MDU1LDB4OTJFNCwweDk2NjQsMHg1MEI3LDB4NTExRiwweDUyREQsLyogMHg5OC0weDlGICovCisJMHg1MzIwLDB4NTM0NywweDUzRUMsMHg1NEU4LDB4NTU0NiwweDU1MzEsMHg1NjE3LDB4NTk2OCwvKiAweEEwLTB4QTcgKi8KKwkweDU5QkUsMHg1QTNDLDB4NUJCNSwweDVDMDYsMHg1QzBGLDB4NUMxMSwweDVDMUEsMHg1RTg0LC8qIDB4QTgtMHhBRiAqLworCTB4NUU4QSwweDVFRTAsMHg1RjcwLDB4NjI3RiwweDYyODQsMHg2MkRCLDB4NjM4QywweDYzNzcsLyogMHhCMC0weEI3ICovCisJMHg2NjA3LDB4NjYwQywweDY2MkQsMHg2Njc2LDB4Njc3RSwweDY4QTIsMHg2QTFGLDB4NkEzNSwvKiAweEI4LTB4QkYgKi8KKwkweDZDQkMsMHg2RDg4LDB4NkUwOSwweDZFNTgsMHg3MTNDLDB4NzEyNiwweDcxNjcsMHg3NUM3LC8qIDB4QzAtMHhDNyAqLworCTB4NzcwMSwweDc4NUQsMHg3OTAxLDB4Nzk2NSwweDc5RjAsMHg3QUUwLDB4N0IxMSwweDdDQTcsLyogMHhDOC0weENGICovCisJMHg3RDM5LDB4ODA5NiwweDgzRDYsMHg4NDhCLDB4ODU0OSwweDg4NUQsMHg4OEYzLDB4OEExRiwvKiAweEQwLTB4RDcgKi8KKwkweDhBM0MsMHg4QTU0LDB4OEE3MywweDhDNjEsMHg4Q0RFLDB4OTFBNCwweDkyNjYsMHg5MzdFLC8qIDB4RDgtMHhERiAqLworCTB4OTQxOCwweDk2OUMsMHg5Nzk4LDB4NEUwQSwweDRFMDgsMHg0RTFFLDB4NEU1NywweDUxOTcsLyogMHhFMC0weEU3ICovCisJMHg1MjcwLDB4NTdDRSwweDU4MzQsMHg1OENDLDB4NUIyMiwweDVFMzgsMHg2MEM1LDB4NjRGRSwvKiAweEU4LTB4RUYgKi8KKwkweDY3NjEsMHg2NzU2LDB4NkQ0NCwweDcyQjYsMHg3NTczLDB4N0E2MywweDg0QjgsMHg4QjcyLC8qIDB4RjAtMHhGNyAqLworCTB4OTFCOCwweDkzMjAsMHg1NjMxLDB4NTdGNCwweDk4RkUsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOTBbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2MkVELDB4NjkwRCwweDZCOTYsMHg3MUVELDB4N0U1NCwweDgwNzcsMHg4MjcyLDB4ODlFNiwvKiAweDQwLTB4NDcgKi8KKwkweDk4REYsMHg4NzU1LDB4OEZCMSwweDVDM0IsMHg0RjM4LDB4NEZFMSwweDRGQjUsMHg1NTA3LC8qIDB4NDgtMHg0RiAqLworCTB4NUEyMCwweDVCREQsMHg1QkU5LDB4NUZDMywweDYxNEUsMHg2MzJGLDB4NjVCMCwweDY2NEIsLyogMHg1MC0weDU3ICovCisJMHg2OEVFLDB4Njk5QiwweDZENzgsMHg2REYxLDB4NzUzMywweDc1QjksMHg3NzFGLDB4Nzk1RSwvKiAweDU4LTB4NUYgKi8KKwkweDc5RTYsMHg3RDMzLDB4ODFFMywweDgyQUYsMHg4NUFBLDB4ODlBQSwweDhBM0EsMHg4RUFCLC8qIDB4NjAtMHg2NyAqLworCTB4OEY5QiwweDkwMzIsMHg5MURELDB4OTcwNywweDRFQkEsMHg0RUMxLDB4NTIwMywweDU4NzUsLyogMHg2OC0weDZGICovCisJMHg1OEVDLDB4NUMwQiwweDc1MUEsMHg1QzNELDB4ODE0RSwweDhBMEEsMHg4RkM1LDB4OTY2MywvKiAweDcwLTB4NzcgKi8KKwkweDk3NkQsMHg3QjI1LDB4OEFDRiwweDk4MDgsMHg5MTYyLDB4NTZGMywweDUzQTgsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5MDE3LDB4NTQzOSwweDU3ODIsMHg1RTI1LDB4NjNBOCwweDZDMzQsMHg3MDhBLDB4Nzc2MSwvKiAweDgwLTB4ODcgKi8KKwkweDdDOEIsMHg3RkUwLDB4ODg3MCwweDkwNDIsMHg5MTU0LDB4OTMxMCwweDkzMTgsMHg5NjhGLC8qIDB4ODgtMHg4RiAqLworCTB4NzQ1RSwweDlBQzQsMHg1RDA3LDB4NUQ2OSwweDY1NzAsMHg2N0EyLDB4OERBOCwweDk2REIsLyogMHg5MC0weDk3ICovCisJMHg2MzZFLDB4Njc0OSwweDY5MTksMHg4M0M1LDB4OTgxNywweDk2QzAsMHg4OEZFLDB4NkY4NCwvKiAweDk4LTB4OUYgKi8KKwkweDY0N0EsMHg1QkY4LDB4NEUxNiwweDcwMkMsMHg3NTVELDB4NjYyRiwweDUxQzQsMHg1MjM2LC8qIDB4QTAtMHhBNyAqLworCTB4NTJFMiwweDU5RDMsMHg1RjgxLDB4NjAyNywweDYyMTAsMHg2NTNGLDB4NjU3NCwweDY2MUYsLyogMHhBOC0weEFGICovCisJMHg2Njc0LDB4NjhGMiwweDY4MTYsMHg2QjYzLDB4NkUwNSwweDcyNzIsMHg3NTFGLDB4NzZEQiwvKiAweEIwLTB4QjcgKi8KKwkweDdDQkUsMHg4MDU2LDB4NThGMCwweDg4RkQsMHg4OTdGLDB4OEFBMCwweDhBOTMsMHg4QUNCLC8qIDB4QjgtMHhCRiAqLworCTB4OTAxRCwweDkxOTIsMHg5NzUyLDB4OTc1OSwweDY1ODksMHg3QTBFLDB4ODEwNiwweDk2QkIsLyogMHhDMC0weEM3ICovCisJMHg1RTJELDB4NjBEQywweDYyMUEsMHg2NUE1LDB4NjYxNCwweDY3OTAsMHg3N0YzLDB4N0E0RCwvKiAweEM4LTB4Q0YgKi8KKwkweDdDNEQsMHg3RTNFLDB4ODEwQSwweDhDQUMsMHg4RDY0LDB4OERFMSwweDhFNUYsMHg3OEE5LC8qIDB4RDAtMHhENyAqLworCTB4NTIwNywweDYyRDksMHg2M0E1LDB4NjQ0MiwweDYyOTgsMHg4QTJELDB4N0E4MywweDdCQzAsLyogMHhEOC0weERGICovCisJMHg4QUFDLDB4OTZFQSwweDdENzYsMHg4MjBDLDB4ODc0OSwweDRFRDksMHg1MTQ4LDB4NTM0MywvKiAweEUwLTB4RTcgKi8KKwkweDUzNjAsMHg1QkEzLDB4NUMwMiwweDVDMTYsMHg1RERELDB4NjIyNiwweDYyNDcsMHg2NEIwLC8qIDB4RTgtMHhFRiAqLworCTB4NjgxMywweDY4MzQsMHg2Q0M5LDB4NkQ0NSwweDZEMTcsMHg2N0QzLDB4NkY1QywweDcxNEUsLyogMHhGMC0weEY3ICovCisJMHg3MTdELDB4NjVDQiwweDdBN0YsMHg3QkFELDB4N0REQSwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85MVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDdFNEEsMHg3RkE4LDB4ODE3QSwweDgyMUIsMHg4MjM5LDB4ODVBNiwweDhBNkUsMHg4Q0NFLC8qIDB4NDAtMHg0NyAqLworCTB4OERGNSwweDkwNzgsMHg5MDc3LDB4OTJBRCwweDkyOTEsMHg5NTgzLDB4OUJBRSwweDUyNEQsLyogMHg0OC0weDRGICovCisJMHg1NTg0LDB4NkYzOCwweDcxMzYsMHg1MTY4LDB4Nzk4NSwweDdFNTUsMHg4MUIzLDB4N0NDRSwvKiAweDUwLTB4NTcgKi8KKwkweDU2NEMsMHg1ODUxLDB4NUNBOCwweDYzQUEsMHg2NkZFLDB4NjZGRCwweDY5NUEsMHg3MkQ5LC8qIDB4NTgtMHg1RiAqLworCTB4NzU4RiwweDc1OEUsMHg3OTBFLDB4Nzk1NiwweDc5REYsMHg3Qzk3LDB4N0QyMCwweDdENDQsLyogMHg2MC0weDY3ICovCisJMHg4NjA3LDB4OEEzNCwweDk2M0IsMHg5MDYxLDB4OUYyMCwweDUwRTcsMHg1Mjc1LDB4NTNDQywvKiAweDY4LTB4NkYgKi8KKwkweDUzRTIsMHg1MDA5LDB4NTVBQSwweDU4RUUsMHg1OTRGLDB4NzIzRCwweDVCOEIsMHg1QzY0LC8qIDB4NzAtMHg3NyAqLworCTB4NTMxRCwweDYwRTMsMHg2MEYzLDB4NjM1QywweDYzODMsMHg2MzNGLDB4NjNCQiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDY0Q0QsMHg2NUU5LDB4NjZGOSwweDVERTMsMHg2OUNELDB4NjlGRCwweDZGMTUsMHg3MUU1LC8qIDB4ODAtMHg4NyAqLworCTB4NEU4OSwweDc1RTksMHg3NkY4LDB4N0E5MywweDdDREYsMHg3RENGLDB4N0Q5QywweDgwNjEsLyogMHg4OC0weDhGICovCisJMHg4MzQ5LDB4ODM1OCwweDg0NkMsMHg4NEJDLDB4ODVGQiwweDg4QzUsMHg4RDcwLDB4OTAwMSwvKiAweDkwLTB4OTcgKi8KKwkweDkwNkQsMHg5Mzk3LDB4OTcxQywweDlBMTIsMHg1MENGLDB4NTg5NywweDYxOEUsMHg4MUQzLC8qIDB4OTgtMHg5RiAqLworCTB4ODUzNSwweDhEMDgsMHg5MDIwLDB4NEZDMywweDUwNzQsMHg1MjQ3LDB4NTM3MywweDYwNkYsLyogMHhBMC0weEE3ICovCisJMHg2MzQ5LDB4Njc1RiwweDZFMkMsMHg4REIzLDB4OTAxRiwweDRGRDcsMHg1QzVFLDB4OENDQSwvKiAweEE4LTB4QUYgKi8KKwkweDY1Q0YsMHg3RDlBLDB4NTM1MiwweDg4OTYsMHg1MTc2LDB4NjNDMywweDVCNTgsMHg1QjZCLC8qIDB4QjAtMHhCNyAqLworCTB4NUMwQSwweDY0MEQsMHg2NzUxLDB4OTA1QywweDRFRDYsMHg1OTFBLDB4NTkyQSwweDZDNzAsLyogMHhCOC0weEJGICovCisJMHg4QTUxLDB4NTUzRSwweDU4MTUsMHg1OUE1LDB4NjBGMCwweDYyNTMsMHg2N0MxLDB4ODIzNSwvKiAweEMwLTB4QzcgKi8KKwkweDY5NTUsMHg5NjQwLDB4OTlDNCwweDlBMjgsMHg0RjUzLDB4NTgwNiwweDVCRkUsMHg4MDEwLC8qIDB4QzgtMHhDRiAqLworCTB4NUNCMSwweDVFMkYsMHg1Rjg1LDB4NjAyMCwweDYxNEIsMHg2MjM0LDB4NjZGRiwweDZDRjAsLyogMHhEMC0weEQ3ICovCisJMHg2RURFLDB4ODBDRSwweDgxN0YsMHg4MkQ0LDB4ODg4QiwweDhDQjgsMHg5MDAwLDB4OTAyRSwvKiAweEQ4LTB4REYgKi8KKwkweDk2OEEsMHg5RURCLDB4OUJEQiwweDRFRTMsMHg1M0YwLDB4NTkyNywweDdCMkMsMHg5MThELC8qIDB4RTAtMHhFNyAqLworCTB4OTg0QywweDlERjksMHg2RURELDB4NzAyNywweDUzNTMsMHg1NTQ0LDB4NUI4NSwweDYyNTgsLyogMHhFOC0weEVGICovCisJMHg2MjlFLDB4NjJEMywweDZDQTIsMHg2RkVGLDB4NzQyMiwweDhBMTcsMHg5NDM4LDB4NkZDMSwvKiAweEYwLTB4RjcgKi8KKwkweDhBRkUsMHg4MzM4LDB4NTFFNywweDg2RjgsMHg1M0VBLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzkyWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NTNFOSwweDRGNDYsMHg5MDU0LDB4OEZCMCwweDU5NkEsMHg4MTMxLDB4NURGRCwweDdBRUEsLyogMHg0MC0weDQ3ICovCisJMHg4RkJGLDB4NjhEQSwweDhDMzcsMHg3MkY4LDB4OUM0OCwweDZBM0QsMHg4QUIwLDB4NEUzOSwvKiAweDQ4LTB4NEYgKi8KKwkweDUzNTgsMHg1NjA2LDB4NTc2NiwweDYyQzUsMHg2M0EyLDB4NjVFNiwweDZCNEUsMHg2REUxLC8qIDB4NTAtMHg1NyAqLworCTB4NkU1QiwweDcwQUQsMHg3N0VELDB4N0FFRiwweDdCQUEsMHg3REJCLDB4ODAzRCwweDgwQzYsLyogMHg1OC0weDVGICovCisJMHg4NkNCLDB4OEE5NSwweDkzNUIsMHg1NkUzLDB4NThDNywweDVGM0UsMHg2NUFELDB4NjY5NiwvKiAweDYwLTB4NjcgKi8KKwkweDZBODAsMHg2QkI1LDB4NzUzNywweDhBQzcsMHg1MDI0LDB4NzdFNSwweDU3MzAsMHg1RjFCLC8qIDB4NjgtMHg2RiAqLworCTB4NjA2NSwweDY2N0EsMHg2QzYwLDB4NzVGNCwweDdBMUEsMHg3RjZFLDB4ODFGNCwweDg3MTgsLyogMHg3MC0weDc3ICovCisJMHg5MDQ1LDB4OTlCMywweDdCQzksMHg3NTVDLDB4N0FGOSwweDdCNTEsMHg4NEM0LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OTAxMCwweDc5RTksMHg3QTkyLDB4ODMzNiwweDVBRTEsMHg3NzQwLDB4NEUyRCwweDRFRjIsLyogMHg4MC0weDg3ICovCisJMHg1Qjk5LDB4NUZFMCwweDYyQkQsMHg2NjNDLDB4NjdGMSwweDZDRTgsMHg4NjZCLDB4ODg3NywvKiAweDg4LTB4OEYgKi8KKwkweDhBM0IsMHg5MTRFLDB4OTJGMywweDk5RDAsMHg2QTE3LDB4NzAyNiwweDczMkEsMHg4MkU3LC8qIDB4OTAtMHg5NyAqLworCTB4ODQ1NywweDhDQUYsMHg0RTAxLDB4NTE0NiwweDUxQ0IsMHg1NThCLDB4NUJGNSwweDVFMTYsLyogMHg5OC0weDlGICovCisJMHg1RTMzLDB4NUU4MSwweDVGMTQsMHg1RjM1LDB4NUY2QiwweDVGQjQsMHg2MUYyLDB4NjMxMSwvKiAweEEwLTB4QTcgKi8KKwkweDY2QTIsMHg2NzFELDB4NkY2RSwweDcyNTIsMHg3NTNBLDB4NzczQSwweDgwNzQsMHg4MTM5LC8qIDB4QTgtMHhBRiAqLworCTB4ODE3OCwweDg3NzYsMHg4QUJGLDB4OEFEQywweDhEODUsMHg4REYzLDB4OTI5QSwweDk1NzcsLyogMHhCMC0weEI3ICovCisJMHg5ODAyLDB4OUNFNSwweDUyQzUsMHg2MzU3LDB4NzZGNCwweDY3MTUsMHg2Qzg4LDB4NzNDRCwvKiAweEI4LTB4QkYgKi8KKwkweDhDQzMsMHg5M0FFLDB4OTY3MywweDZEMjUsMHg1ODlDLDB4NjkwRSwweDY5Q0MsMHg4RkZELC8qIDB4QzAtMHhDNyAqLworCTB4OTM5QSwweDc1REIsMHg5MDFBLDB4NTg1QSwweDY4MDIsMHg2M0I0LDB4NjlGQiwweDRGNDMsLyogMHhDOC0weENGICovCisJMHg2RjJDLDB4NjdEOCwweDhGQkIsMHg4NTI2LDB4N0RCNCwweDkzNTQsMHg2OTNGLDB4NkY3MCwvKiAweEQwLTB4RDcgKi8KKwkweDU3NkEsMHg1OEY3LDB4NUIyQywweDdEMkMsMHg3MjJBLDB4NTQwQSwweDkxRTMsMHg5REI0LC8qIDB4RDgtMHhERiAqLworCTB4NEVBRCwweDRGNEUsMHg1MDVDLDB4NTA3NSwweDUyNDMsMHg4QzlFLDB4NTQ0OCwweDU4MjQsLyogMHhFMC0weEU3ICovCisJMHg1QjlBLDB4NUUxRCwweDVFOTUsMHg1RUFELDB4NUVGNywweDVGMUYsMHg2MDhDLDB4NjJCNSwvKiAweEU4LTB4RUYgKi8KKwkweDYzM0EsMHg2M0QwLDB4NjhBRiwweDZDNDAsMHg3ODg3LDB4Nzk4RSwweDdBMEIsMHg3REUwLC8qIDB4RjAtMHhGNyAqLworCTB4ODI0NywweDhBMDIsMHg4QUU2LDB4OEU0NCwweDkwMTMsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOTNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5MEI4LDB4OTEyRCwweDkxRDgsMHg5RjBFLDB4NkNFNSwweDY0NTgsMHg2NEUyLDB4NjU3NSwvKiAweDQwLTB4NDcgKi8KKwkweDZFRjQsMHg3Njg0LDB4N0IxQiwweDkwNjksMHg5M0QxLDB4NkVCQSwweDU0RjIsMHg1RkI5LC8qIDB4NDgtMHg0RiAqLworCTB4NjRBNCwweDhGNEQsMHg4RkVELDB4OTI0NCwweDUxNzgsMHg1ODZCLDB4NTkyOSwweDVDNTUsLyogMHg1MC0weDU3ICovCisJMHg1RTk3LDB4NkRGQiwweDdFOEYsMHg3NTFDLDB4OENCQywweDhFRTIsMHg5ODVCLDB4NzBCOSwvKiAweDU4LTB4NUYgKi8KKwkweDRGMUQsMHg2QkJGLDB4NkZCMSwweDc1MzAsMHg5NkZCLDB4NTE0RSwweDU0MTAsMHg1ODM1LC8qIDB4NjAtMHg2NyAqLworCTB4NTg1NywweDU5QUMsMHg1QzYwLDB4NUY5MiwweDY1OTcsMHg2NzVDLDB4NkUyMSwweDc2N0IsLyogMHg2OC0weDZGICovCisJMHg4M0RGLDB4OENFRCwweDkwMTQsMHg5MEZELDB4OTM0RCwweDc4MjUsMHg3ODNBLDB4NTJBQSwvKiAweDcwLTB4NzcgKi8KKwkweDVFQTYsMHg1NzFGLDB4NTk3NCwweDYwMTIsMHg1MDEyLDB4NTE1QSwweDUxQUMsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg1MUNELDB4NTIwMCwweDU1MTAsMHg1ODU0LDB4NTg1OCwweDU5NTcsMHg1Qjk1LDB4NUNGNiwvKiAweDgwLTB4ODcgKi8KKwkweDVEOEIsMHg2MEJDLDB4NjI5NSwweDY0MkQsMHg2NzcxLDB4Njg0MywweDY4QkMsMHg2OERGLC8qIDB4ODgtMHg4RiAqLworCTB4NzZENywweDZERDgsMHg2RTZGLDB4NkQ5QiwweDcwNkYsMHg3MUM4LDB4NUY1MywweDc1RDgsLyogMHg5MC0weDk3ICovCisJMHg3OTc3LDB4N0I0OSwweDdCNTQsMHg3QjUyLDB4N0NENiwweDdENzEsMHg1MjMwLDB4ODQ2MywvKiAweDk4LTB4OUYgKi8KKwkweDg1NjksMHg4NUU0LDB4OEEwRSwweDhCMDQsMHg4QzQ2LDB4OEUwRiwweDkwMDMsMHg5MDBGLC8qIDB4QTAtMHhBNyAqLworCTB4OTQxOSwweDk2NzYsMHg5ODJELDB4OUEzMCwweDk1RDgsMHg1MENELDB4NTJENSwweDU0MEMsLyogMHhBOC0weEFGICovCisJMHg1ODAyLDB4NUMwRSwweDYxQTcsMHg2NDlFLDB4NkQxRSwweDc3QjMsMHg3QUU1LDB4ODBGNCwvKiAweEIwLTB4QjcgKi8KKwkweDg0MDQsMHg5MDUzLDB4OTI4NSwweDVDRTAsMHg5RDA3LDB4NTMzRiwweDVGOTcsMHg1RkIzLC8qIDB4QjgtMHhCRiAqLworCTB4NkQ5QywweDcyNzksMHg3NzYzLDB4NzlCRiwweDdCRTQsMHg2QkQyLDB4NzJFQywweDhBQUQsLyogMHhDMC0weEM3ICovCisJMHg2ODAzLDB4NkE2MSwweDUxRjgsMHg3QTgxLDB4NjkzNCwweDVDNEEsMHg5Q0Y2LDB4ODJFQiwvKiAweEM4LTB4Q0YgKi8KKwkweDVCQzUsMHg5MTQ5LDB4NzAxRSwweDU2NzgsMHg1QzZGLDB4NjBDNywweDY1NjYsMHg2QzhDLC8qIDB4RDAtMHhENyAqLworCTB4OEM1QSwweDkwNDEsMHg5ODEzLDB4NTQ1MSwweDY2QzcsMHg5MjBELDB4NTk0OCwweDkwQTMsLyogMHhEOC0weERGICovCisJMHg1MTg1LDB4NEU0RCwweDUxRUEsMHg4NTk5LDB4OEIwRSwweDcwNTgsMHg2MzdBLDB4OTM0QiwvKiAweEUwLTB4RTcgKi8KKwkweDY5NjIsMHg5OUI0LDB4N0UwNCwweDc1NzcsMHg1MzU3LDB4Njk2MCwweDhFREYsMHg5NkUzLC8qIDB4RTgtMHhFRiAqLworCTB4NkM1RCwweDRFOEMsMHg1QzNDLDB4NUYxMCwweDhGRTksMHg1MzAyLDB4OENEMSwweDgwODksLyogMHhGMC0weEY3ICovCisJMHg4Njc5LDB4NUVGRiwweDY1RTUsMHg0RTczLDB4NTE2NSwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85NFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDU5ODIsMHg1QzNGLDB4OTdFRSwweDRFRkIsMHg1OThBLDB4NUZDRCwweDhBOEQsMHg2RkUxLC8qIDB4NDAtMHg0NyAqLworCTB4NzlCMCwweDc5NjIsMHg1QkU3LDB4ODQ3MSwweDczMkIsMHg3MUIxLDB4NUU3NCwweDVGRjUsLyogMHg0OC0weDRGICovCisJMHg2MzdCLDB4NjQ5QSwweDcxQzMsMHg3Qzk4LDB4NEU0MywweDVFRkMsMHg0RTRCLDB4NTdEQywvKiAweDUwLTB4NTcgKi8KKwkweDU2QTIsMHg2MEE5LDB4NkZDMywweDdEMEQsMHg4MEZELDB4ODEzMywweDgxQkYsMHg4RkIyLC8qIDB4NTgtMHg1RiAqLworCTB4ODk5NywweDg2QTQsMHg1REY0LDB4NjI4QSwweDY0QUQsMHg4OTg3LDB4Njc3NywweDZDRTIsLyogMHg2MC0weDY3ICovCisJMHg2RDNFLDB4NzQzNiwweDc4MzQsMHg1QTQ2LDB4N0Y3NSwweDgyQUQsMHg5OUFDLDB4NEZGMywvKiAweDY4LTB4NkYgKi8KKwkweDVFQzMsMHg2MkRELDB4NjM5MiwweDY1NTcsMHg2NzZGLDB4NzZDMywweDcyNEMsMHg4MENDLC8qIDB4NzAtMHg3NyAqLworCTB4ODBCQSwweDhGMjksMHg5MTRELDB4NTAwRCwweDU3RjksMHg1QTkyLDB4Njg4NSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDY5NzMsMHg3MTY0LDB4NzJGRCwweDhDQjcsMHg1OEYyLDB4OENFMCwweDk2NkEsMHg5MDE5LC8qIDB4ODAtMHg4NyAqLworCTB4ODc3RiwweDc5RTQsMHg3N0U3LDB4ODQyOSwweDRGMkYsMHg1MjY1LDB4NTM1QSwweDYyQ0QsLyogMHg4OC0weDhGICovCisJMHg2N0NGLDB4NkNDQSwweDc2N0QsMHg3Qjk0LDB4N0M5NSwweDgyMzYsMHg4NTg0LDB4OEZFQiwvKiAweDkwLTB4OTcgKi8KKwkweDY2REQsMHg2RjIwLDB4NzIwNiwweDdFMUIsMHg4M0FCLDB4OTlDMSwweDlFQTYsMHg1MUZELC8qIDB4OTgtMHg5RiAqLworCTB4N0JCMSwweDc4NzIsMHg3QkI4LDB4ODA4NywweDdCNDgsMHg2QUU4LDB4NUU2MSwweDgwOEMsLyogMHhBMC0weEE3ICovCisJMHg3NTUxLDB4NzU2MCwweDUxNkIsMHg5MjYyLDB4NkU4QywweDc2N0EsMHg5MTk3LDB4OUFFQSwvKiAweEE4LTB4QUYgKi8KKwkweDRGMTAsMHg3RjcwLDB4NjI5QywweDdCNEYsMHg5NUE1LDB4OUNFOSwweDU2N0EsMHg1ODU5LC8qIDB4QjAtMHhCNyAqLworCTB4ODZFNCwweDk2QkMsMHg0RjM0LDB4NTIyNCwweDUzNEEsMHg1M0NELDB4NTNEQiwweDVFMDYsLyogMHhCOC0weEJGICovCisJMHg2NDJDLDB4NjU5MSwweDY3N0YsMHg2QzNFLDB4NkM0RSwweDcyNDgsMHg3MkFGLDB4NzNFRCwvKiAweEMwLTB4QzcgKi8KKwkweDc1NTQsMHg3RTQxLDB4ODIyQywweDg1RTksMHg4Q0E5LDB4N0JDNCwweDkxQzYsMHg3MTY5LC8qIDB4QzgtMHhDRiAqLworCTB4OTgxMiwweDk4RUYsMHg2MzNELDB4NjY2OSwweDc1NkEsMHg3NkU0LDB4NzhEMCwweDg1NDMsLyogMHhEMC0weEQ3ICovCisJMHg4NkVFLDB4NTMyQSwweDUzNTEsMHg1NDI2LDB4NTk4MywweDVFODcsMHg1RjdDLDB4NjBCMiwvKiAweEQ4LTB4REYgKi8KKwkweDYyNDksMHg2Mjc5LDB4NjJBQiwweDY1OTAsMHg2QkQ0LDB4NkNDQywweDc1QjIsMHg3NkFFLC8qIDB4RTAtMHhFNyAqLworCTB4Nzg5MSwweDc5RDgsMHg3RENCLDB4N0Y3NywweDgwQTUsMHg4OEFCLDB4OEFCOSwweDhDQkIsLyogMHhFOC0weEVGICovCisJMHg5MDdGLDB4OTc1RSwweDk4REIsMHg2QTBCLDB4N0MzOCwweDUwOTksMHg1QzNFLDB4NUZBRSwvKiAweEYwLTB4RjcgKi8KKwkweDY3ODcsMHg2QkQ4LDB4NzQzNSwweDc3MDksMHg3RjhFLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzk1WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OUYzQiwweDY3Q0EsMHg3QTE3LDB4NTMzOSwweDc1OEIsMHg5QUVELDB4NUY2NiwweDgxOUQsLyogMHg0MC0weDQ3ICovCisJMHg4M0YxLDB4ODA5OCwweDVGM0MsMHg1RkM1LDB4NzU2MiwweDdCNDYsMHg5MDNDLDB4Njg2NywvKiAweDQ4LTB4NEYgKi8KKwkweDU5RUIsMHg1QTlCLDB4N0QxMCwweDc2N0UsMHg4QjJDLDB4NEZGNSwweDVGNkEsMHg2QTE5LC8qIDB4NTAtMHg1NyAqLworCTB4NkMzNywweDZGMDIsMHg3NEUyLDB4Nzk2OCwweDg4NjgsMHg4QTU1LDB4OEM3OSwweDVFREYsLyogMHg1OC0weDVGICovCisJMHg2M0NGLDB4NzVDNSwweDc5RDIsMHg4MkQ3LDB4OTMyOCwweDkyRjIsMHg4NDlDLDB4ODZFRCwvKiAweDYwLTB4NjcgKi8KKwkweDlDMkQsMHg1NEMxLDB4NUY2QywweDY1OEMsMHg2RDVDLDB4NzAxNSwweDhDQTcsMHg4Q0QzLC8qIDB4NjgtMHg2RiAqLworCTB4OTgzQiwweDY1NEYsMHg3NEY2LDB4NEUwRCwweDRFRDgsMHg1N0UwLDB4NTkyQiwweDVBNjYsLyogMHg3MC0weDc3ICovCisJMHg1QkNDLDB4NTFBOCwweDVFMDMsMHg1RTlDLDB4NjAxNiwweDYyNzYsMHg2NTc3LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NjVBNywweDY2NkUsMHg2RDZFLDB4NzIzNiwweDdCMjYsMHg4MTUwLDB4ODE5QSwweDgyOTksLyogMHg4MC0weDg3ICovCisJMHg4QjVDLDB4OENBMCwweDhDRTYsMHg4RDc0LDB4OTYxQywweDk2NDQsMHg0RkFFLDB4NjRBQiwvKiAweDg4LTB4OEYgKi8KKwkweDZCNjYsMHg4MjFFLDB4ODQ2MSwweDg1NkEsMHg5MEU4LDB4NUMwMSwweDY5NTMsMHg5OEE4LC8qIDB4OTAtMHg5NyAqLworCTB4ODQ3QSwweDg1NTcsMHg0RjBGLDB4NTI2RiwweDVGQTksMHg1RTQ1LDB4NjcwRCwweDc5OEYsLyogMHg5OC0weDlGICovCisJMHg4MTc5LDB4ODkwNywweDg5ODYsMHg2REY1LDB4NUYxNywweDYyNTUsMHg2Q0I4LDB4NEVDRiwvKiAweEEwLTB4QTcgKi8KKwkweDcyNjksMHg5QjkyLDB4NTIwNiwweDU0M0IsMHg1Njc0LDB4NThCMywweDYxQTQsMHg2MjZFLC8qIDB4QTgtMHhBRiAqLworCTB4NzExQSwweDU5NkUsMHg3Qzg5LDB4N0NERSwweDdEMUIsMHg5NkYwLDB4NjU4NywweDgwNUUsLyogMHhCMC0weEI3ICovCisJMHg0RTE5LDB4NEY3NSwweDUxNzUsMHg1ODQwLDB4NUU2MywweDVFNzMsMHg1RjBBLDB4NjdDNCwvKiAweEI4LTB4QkYgKi8KKwkweDRFMjYsMHg4NTNELDB4OTU4OSwweDk2NUIsMHg3QzczLDB4OTgwMSwweDUwRkIsMHg1OEMxLC8qIDB4QzAtMHhDNyAqLworCTB4NzY1NiwweDc4QTcsMHg1MjI1LDB4NzdBNSwweDg1MTEsMHg3Qjg2LDB4NTA0RiwweDU5MDksLyogMHhDOC0weENGICovCisJMHg3MjQ3LDB4N0JDNywweDdERTgsMHg4RkJBLDB4OEZENCwweDkwNEQsMHg0RkJGLDB4NTJDOSwvKiAweEQwLTB4RDcgKi8KKwkweDVBMjksMHg1RjAxLDB4OTdBRCwweDRGREQsMHg4MjE3LDB4OTJFQSwweDU3MDMsMHg2MzU1LC8qIDB4RDgtMHhERiAqLworCTB4NkI2OSwweDc1MkIsMHg4OERDLDB4OEYxNCwweDdBNDIsMHg1MkRGLDB4NTg5MywweDYxNTUsLyogMHhFMC0weEU3ICovCisJMHg2MjBBLDB4NjZBRSwweDZCQ0QsMHg3QzNGLDB4ODNFOSwweDUwMjMsMHg0RkY4LDB4NTMwNSwvKiAweEU4LTB4RUYgKi8KKwkweDU0NDYsMHg1ODMxLDB4NTk0OSwweDVCOUQsMHg1Q0YwLDB4NUNFRiwweDVEMjksMHg1RTk2LC8qIDB4RjAtMHhGNyAqLworCTB4NjJCMSwweDYzNjcsMHg2NTNFLDB4NjVCOSwweDY3MEIsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOTZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2Q0Q1LDB4NkNFMSwweDcwRjksMHg3ODMyLDB4N0UyQiwweDgwREUsMHg4MkIzLDB4ODQwQywvKiAweDQwLTB4NDcgKi8KKwkweDg0RUMsMHg4NzAyLDB4ODkxMiwweDhBMkEsMHg4QzRBLDB4OTBBNiwweDkyRDIsMHg5OEZELC8qIDB4NDgtMHg0RiAqLworCTB4OUNGMywweDlENkMsMHg0RTRGLDB4NEVBMSwweDUwOEQsMHg1MjU2LDB4NTc0QSwweDU5QTgsLyogMHg1MC0weDU3ICovCisJMHg1RTNELDB4NUZEOCwweDVGRDksMHg2MjNGLDB4NjZCNCwweDY3MUIsMHg2N0QwLDB4NjhEMiwvKiAweDU4LTB4NUYgKi8KKwkweDUxOTIsMHg3RDIxLDB4ODBBQSwweDgxQTgsMHg4QjAwLDB4OEM4QywweDhDQkYsMHg5MjdFLC8qIDB4NjAtMHg2NyAqLworCTB4OTYzMiwweDU0MjAsMHg5ODJDLDB4NTMxNywweDUwRDUsMHg1MzVDLDB4NThBOCwweDY0QjIsLyogMHg2OC0weDZGICovCisJMHg2NzM0LDB4NzI2NywweDc3NjYsMHg3QTQ2LDB4OTFFNiwweDUyQzMsMHg2Q0ExLDB4NkI4NiwvKiAweDcwLTB4NzcgKi8KKwkweDU4MDAsMHg1RTRDLDB4NTk1NCwweDY3MkMsMHg3RkZCLDB4NTFFMSwweDc2QzYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg2NDY5LDB4NzhFOCwweDlCNTQsMHg5RUJCLDB4NTdDQiwweDU5QjksMHg2NjI3LDB4Njc5QSwvKiAweDgwLTB4ODcgKi8KKwkweDZCQ0UsMHg1NEU5LDB4NjlEOSwweDVFNTUsMHg4MTlDLDB4Njc5NSwweDlCQUEsMHg2N0ZFLC8qIDB4ODgtMHg4RiAqLworCTB4OUM1MiwweDY4NUQsMHg0RUE2LDB4NEZFMywweDUzQzgsMHg2MkI5LDB4NjcyQiwweDZDQUIsLyogMHg5MC0weDk3ICovCisJMHg4RkM0LDB4NEZBRCwweDdFNkQsMHg5RUJGLDB4NEUwNywweDYxNjIsMHg2RTgwLDB4NkYyQiwvKiAweDk4LTB4OUYgKi8KKwkweDg1MTMsMHg1NDczLDB4NjcyQSwweDlCNDUsMHg1REYzLDB4N0I5NSwweDVDQUMsMHg1QkM2LC8qIDB4QTAtMHhBNyAqLworCTB4ODcxQywweDZFNEEsMHg4NEQxLDB4N0ExNCwweDgxMDgsMHg1OTk5LDB4N0M4RCwweDZDMTEsLyogMHhBOC0weEFGICovCisJMHg3NzIwLDB4NTJEOSwweDU5MjIsMHg3MTIxLDB4NzI1RiwweDc3REIsMHg5NzI3LDB4OUQ2MSwvKiAweEIwLTB4QjcgKi8KKwkweDY5MEIsMHg1QTdGLDB4NUExOCwweDUxQTUsMHg1NDBELDB4NTQ3RCwweDY2MEUsMHg3NkRGLC8qIDB4QjgtMHhCRiAqLworCTB4OEZGNywweDkyOTgsMHg5Q0Y0LDB4NTlFQSwweDcyNUQsMHg2RUM1LDB4NTE0RCwweDY4QzksLyogMHhDMC0weEM3ICovCisJMHg3REJGLDB4N0RFQywweDk3NjIsMHg5RUJBLDB4NjQ3OCwweDZBMjEsMHg4MzAyLDB4NTk4NCwvKiAweEM4LTB4Q0YgKi8KKwkweDVCNUYsMHg2QkRCLDB4NzMxQiwweDc2RjIsMHg3REIyLDB4ODAxNywweDg0OTksMHg1MTMyLC8qIDB4RDAtMHhENyAqLworCTB4NjcyOCwweDlFRDksMHg3NkVFLDB4Njc2MiwweDUyRkYsMHg5OTA1LDB4NUMyNCwweDYyM0IsLyogMHhEOC0weERGICovCisJMHg3QzdFLDB4OENCMCwweDU1NEYsMHg2MEI2LDB4N0QwQiwweDk1ODAsMHg1MzAxLDB4NEU1RiwvKiAweEUwLTB4RTcgKi8KKwkweDUxQjYsMHg1OTFDLDB4NzIzQSwweDgwMzYsMHg5MUNFLDB4NUYyNSwweDc3RTIsMHg1Mzg0LC8qIDB4RTgtMHhFRiAqLworCTB4NUY3OSwweDdEMDQsMHg4NUFDLDB4OEEzMywweDhFOEQsMHg5NzU2LDB4NjdGMywweDg1QUUsLyogMHhGMC0weEY3ICovCisJMHg5NDUzLDB4NjEwOSwweDYxMDgsMHg2Q0I5LDB4NzY1MiwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85N1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDhBRUQsMHg4RjM4LDB4NTUyRiwweDRGNTEsMHg1MTJBLDB4NTJDNywweDUzQ0IsMHg1QkE1LC8qIDB4NDAtMHg0NyAqLworCTB4NUU3RCwweDYwQTAsMHg2MTgyLDB4NjNENiwweDY3MDksMHg2N0RBLDB4NkU2NywweDZEOEMsLyogMHg0OC0weDRGICovCisJMHg3MzM2LDB4NzMzNywweDc1MzEsMHg3OTUwLDB4ODhENSwweDhBOTgsMHg5MDRBLDB4OTA5MSwvKiAweDUwLTB4NTcgKi8KKwkweDkwRjUsMHg5NkM0LDB4ODc4RCwweDU5MTUsMHg0RTg4LDB4NEY1OSwweDRFMEUsMHg4QTg5LC8qIDB4NTgtMHg1RiAqLworCTB4OEYzRiwweDk4MTAsMHg1MEFELDB4NUU3QywweDU5OTYsMHg1QkI5LDB4NUVCOCwweDYzREEsLyogMHg2MC0weDY3ICovCisJMHg2M0ZBLDB4NjRDMSwweDY2REMsMHg2OTRBLDB4NjlEOCwweDZEMEIsMHg2RUI2LDB4NzE5NCwvKiAweDY4LTB4NkYgKi8KKwkweDc1MjgsMHg3QUFGLDB4N0Y4QSwweDgwMDAsMHg4NDQ5LDB4ODRDOSwweDg5ODEsMHg4QjIxLC8qIDB4NzAtMHg3NyAqLworCTB4OEUwQSwweDkwNjUsMHg5NjdELDB4OTkwQSwweDYxN0UsMHg2MjkxLDB4NkIzMiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDZDODMsMHg2RDc0LDB4N0ZDQywweDdGRkMsMHg2REMwLDB4N0Y4NSwweDg3QkEsMHg4OEY4LC8qIDB4ODAtMHg4NyAqLworCTB4Njc2NSwweDgzQjEsMHg5ODNDLDB4OTZGNywweDZEMUIsMHg3RDYxLDB4ODQzRCwweDkxNkEsLyogMHg4OC0weDhGICovCisJMHg0RTcxLDB4NTM3NSwweDVENTAsMHg2QjA0LDB4NkZFQiwweDg1Q0QsMHg4NjJELDB4ODlBNywvKiAweDkwLTB4OTcgKi8KKwkweDUyMjksMHg1NDBGLDB4NUM2NSwweDY3NEUsMHg2OEE4LDB4NzQwNiwweDc0ODMsMHg3NUUyLC8qIDB4OTgtMHg5RiAqLworCTB4ODhDRiwweDg4RTEsMHg5MUNDLDB4OTZFMiwweDk2NzgsMHg1RjhCLDB4NzM4NywweDdBQ0IsLyogMHhBMC0weEE3ICovCisJMHg4NDRFLDB4NjNBMCwweDc1NjUsMHg1Mjg5LDB4NkQ0MSwweDZFOUMsMHg3NDA5LDB4NzU1OSwvKiAweEE4LTB4QUYgKi8KKwkweDc4NkIsMHg3QzkyLDB4OTY4NiwweDdBREMsMHg5RjhELDB4NEZCNiwweDYxNkUsMHg2NUM1LC8qIDB4QjAtMHhCNyAqLworCTB4ODY1QywweDRFODYsMHg0RUFFLDB4NTBEQSwweDRFMjEsMHg1MUNDLDB4NUJFRSwweDY1OTksLyogMHhCOC0weEJGICovCisJMHg2ODgxLDB4NkRCQywweDczMUYsMHg3NjQyLDB4NzdBRCwweDdBMUMsMHg3Q0U3LDB4ODI2RiwvKiAweEMwLTB4QzcgKi8KKwkweDhBRDIsMHg5MDdDLDB4OTFDRiwweDk2NzUsMHg5ODE4LDB4NTI5QiwweDdERDEsMHg1MDJCLC8qIDB4QzgtMHhDRiAqLworCTB4NTM5OCwweDY3OTcsMHg2RENCLDB4NzFEMCwweDc0MzMsMHg4MUU4LDB4OEYyQSwweDk2QTMsLyogMHhEMC0weEQ3ICovCisJMHg5QzU3LDB4OUU5RiwweDc0NjAsMHg1ODQxLDB4NkQ5OSwweDdEMkYsMHg5ODVFLDB4NEVFNCwvKiAweEQ4LTB4REYgKi8KKwkweDRGMzYsMHg0RjhCLDB4NTFCNywweDUyQjEsMHg1REJBLDB4NjAxQywweDczQjIsMHg3OTNDLC8qIDB4RTAtMHhFNyAqLworCTB4ODJEMywweDkyMzQsMHg5NkI3LDB4OTZGNiwweDk3MEEsMHg5RTk3LDB4OUY2MiwweDY2QTYsLyogMHhFOC0weEVGICovCisJMHg2Qjc0LDB4NTIxNywweDUyQTMsMHg3MEM4LDB4ODhDMiwweDVFQzksMHg2MDRCLDB4NjE5MCwvKiAweEYwLTB4RjcgKi8KKwkweDZGMjMsMHg3MTQ5LDB4N0MzRSwweDdERjQsMHg4MDZGLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzk4WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4ODRFRSwweDkwMjMsMHg5MzJDLDB4NTQ0MiwweDlCNkYsMHg2QUQzLDB4NzA4OSwweDhDQzIsLyogMHg0MC0weDQ3ICovCisJMHg4REVGLDB4OTczMiwweDUyQjQsMHg1QTQxLDB4NUVDQSwweDVGMDQsMHg2NzE3LDB4Njk3QywvKiAweDQ4LTB4NEYgKi8KKwkweDY5OTQsMHg2RDZBLDB4NkYwRiwweDcyNjIsMHg3MkZDLDB4N0JFRCwweDgwMDEsMHg4MDdFLC8qIDB4NTAtMHg1NyAqLworCTB4ODc0QiwweDkwQ0UsMHg1MTZELDB4OUU5MywweDc5ODQsMHg4MDhCLDB4OTMzMiwweDhBRDYsLyogMHg1OC0weDVGICovCisJMHg1MDJELDB4NTQ4QywweDhBNzEsMHg2QjZBLDB4OENDNCwweDgxMDcsMHg2MEQxLDB4NjdBMCwvKiAweDYwLTB4NjcgKi8KKwkweDlERjIsMHg0RTk5LDB4NEU5OCwweDlDMTAsMHg4QTZCLDB4ODVDMSwweDg1NjgsMHg2OTAwLC8qIDB4NjgtMHg2RiAqLworCTB4NkU3RSwweDc4OTcsMHg4MTU1LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDVGMEMsLyogMHg5OC0weDlGICovCisJMHg0RTEwLDB4NEUxNSwweDRFMkEsMHg0RTMxLDB4NEUzNiwweDRFM0MsMHg0RTNGLDB4NEU0MiwvKiAweEEwLTB4QTcgKi8KKwkweDRFNTYsMHg0RTU4LDB4NEU4MiwweDRFODUsMHg4QzZCLDB4NEU4QSwweDgyMTIsMHg1RjBELC8qIDB4QTgtMHhBRiAqLworCTB4NEU4RSwweDRFOUUsMHg0RTlGLDB4NEVBMCwweDRFQTIsMHg0RUIwLDB4NEVCMywweDRFQjYsLyogMHhCMC0weEI3ICovCisJMHg0RUNFLDB4NEVDRCwweDRFQzQsMHg0RUM2LDB4NEVDMiwweDRFRDcsMHg0RURFLDB4NEVFRCwvKiAweEI4LTB4QkYgKi8KKwkweDRFREYsMHg0RUY3LDB4NEYwOSwweDRGNUEsMHg0RjMwLDB4NEY1QiwweDRGNUQsMHg0RjU3LC8qIDB4QzAtMHhDNyAqLworCTB4NEY0NywweDRGNzYsMHg0Rjg4LDB4NEY4RiwweDRGOTgsMHg0RjdCLDB4NEY2OSwweDRGNzAsLyogMHhDOC0weENGICovCisJMHg0RjkxLDB4NEY2RiwweDRGODYsMHg0Rjk2LDB4NTExOCwweDRGRDQsMHg0RkRGLDB4NEZDRSwvKiAweEQwLTB4RDcgKi8KKwkweDRGRDgsMHg0RkRCLDB4NEZEMSwweDRGREEsMHg0RkQwLDB4NEZFNCwweDRGRTUsMHg1MDFBLC8qIDB4RDgtMHhERiAqLworCTB4NTAyOCwweDUwMTQsMHg1MDJBLDB4NTAyNSwweDUwMDUsMHg0RjFDLDB4NEZGNiwweDUwMjEsLyogMHhFMC0weEU3ICovCisJMHg1MDI5LDB4NTAyQywweDRGRkUsMHg0RkVGLDB4NTAxMSwweDUwMDYsMHg1MDQzLDB4NTA0NywvKiAweEU4LTB4RUYgKi8KKwkweDY3MDMsMHg1MDU1LDB4NTA1MCwweDUwNDgsMHg1MDVBLDB4NTA1NiwweDUwNkMsMHg1MDc4LC8qIDB4RjAtMHhGNyAqLworCTB4NTA4MCwweDUwOUEsMHg1MDg1LDB4NTBCNCwweDUwQjIsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOTlbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1MEM5LDB4NTBDQSwweDUwQjMsMHg1MEMyLDB4NTBENiwweDUwREUsMHg1MEU1LDB4NTBFRCwvKiAweDQwLTB4NDcgKi8KKwkweDUwRTMsMHg1MEVFLDB4NTBGOSwweDUwRjUsMHg1MTA5LDB4NTEwMSwweDUxMDIsMHg1MTE2LC8qIDB4NDgtMHg0RiAqLworCTB4NTExNSwweDUxMTQsMHg1MTFBLDB4NTEyMSwweDUxM0EsMHg1MTM3LDB4NTEzQywweDUxM0IsLyogMHg1MC0weDU3ICovCisJMHg1MTNGLDB4NTE0MCwweDUxNTIsMHg1MTRDLDB4NTE1NCwweDUxNjIsMHg3QUY4LDB4NTE2OSwvKiAweDU4LTB4NUYgKi8KKwkweDUxNkEsMHg1MTZFLDB4NTE4MCwweDUxODIsMHg1NkQ4LDB4NTE4QywweDUxODksMHg1MThGLC8qIDB4NjAtMHg2NyAqLworCTB4NTE5MSwweDUxOTMsMHg1MTk1LDB4NTE5NiwweDUxQTQsMHg1MUE2LDB4NTFBMiwweDUxQTksLyogMHg2OC0weDZGICovCisJMHg1MUFBLDB4NTFBQiwweDUxQjMsMHg1MUIxLDB4NTFCMiwweDUxQjAsMHg1MUI1LDB4NTFCRCwvKiAweDcwLTB4NzcgKi8KKwkweDUxQzUsMHg1MUM5LDB4NTFEQiwweDUxRTAsMHg4NjU1LDB4NTFFOSwweDUxRUQsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg1MUYwLDB4NTFGNSwweDUxRkUsMHg1MjA0LDB4NTIwQiwweDUyMTQsMHg1MjBFLDB4NTIyNywvKiAweDgwLTB4ODcgKi8KKwkweDUyMkEsMHg1MjJFLDB4NTIzMywweDUyMzksMHg1MjRGLDB4NTI0NCwweDUyNEIsMHg1MjRDLC8qIDB4ODgtMHg4RiAqLworCTB4NTI1RSwweDUyNTQsMHg1MjZBLDB4NTI3NCwweDUyNjksMHg1MjczLDB4NTI3RiwweDUyN0QsLyogMHg5MC0weDk3ICovCisJMHg1MjhELDB4NTI5NCwweDUyOTIsMHg1MjcxLDB4NTI4OCwweDUyOTEsMHg4RkE4LDB4OEZBNywvKiAweDk4LTB4OUYgKi8KKwkweDUyQUMsMHg1MkFELDB4NTJCQywweDUyQjUsMHg1MkMxLDB4NTJDRCwweDUyRDcsMHg1MkRFLC8qIDB4QTAtMHhBNyAqLworCTB4NTJFMywweDUyRTYsMHg5OEVELDB4NTJFMCwweDUyRjMsMHg1MkY1LDB4NTJGOCwweDUyRjksLyogMHhBOC0weEFGICovCisJMHg1MzA2LDB4NTMwOCwweDc1MzgsMHg1MzBELDB4NTMxMCwweDUzMEYsMHg1MzE1LDB4NTMxQSwvKiAweEIwLTB4QjcgKi8KKwkweDUzMjMsMHg1MzJGLDB4NTMzMSwweDUzMzMsMHg1MzM4LDB4NTM0MCwweDUzNDYsMHg1MzQ1LC8qIDB4QjgtMHhCRiAqLworCTB4NEUxNywweDUzNDksMHg1MzRELDB4NTFENiwweDUzNUUsMHg1MzY5LDB4NTM2RSwweDU5MTgsLyogMHhDMC0weEM3ICovCisJMHg1MzdCLDB4NTM3NywweDUzODIsMHg1Mzk2LDB4NTNBMCwweDUzQTYsMHg1M0E1LDB4NTNBRSwvKiAweEM4LTB4Q0YgKi8KKwkweDUzQjAsMHg1M0I2LDB4NTNDMywweDdDMTIsMHg5NkQ5LDB4NTNERiwweDY2RkMsMHg3MUVFLC8qIDB4RDAtMHhENyAqLworCTB4NTNFRSwweDUzRTgsMHg1M0VELDB4NTNGQSwweDU0MDEsMHg1NDNELDB4NTQ0MCwweDU0MkMsLyogMHhEOC0weERGICovCisJMHg1NDJELDB4NTQzQywweDU0MkUsMHg1NDM2LDB4NTQyOSwweDU0MUQsMHg1NDRFLDB4NTQ4RiwvKiAweEUwLTB4RTcgKi8KKwkweDU0NzUsMHg1NDhFLDB4NTQ1RiwweDU0NzEsMHg1NDc3LDB4NTQ3MCwweDU0OTIsMHg1NDdCLC8qIDB4RTgtMHhFRiAqLworCTB4NTQ4MCwweDU0NzYsMHg1NDg0LDB4NTQ5MCwweDU0ODYsMHg1NEM3LDB4NTRBMiwweDU0QjgsLyogMHhGMC0weEY3ICovCisJMHg1NEE1LDB4NTRBQywweDU0QzQsMHg1NEM4LDB4NTRBOCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85QVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDU0QUIsMHg1NEMyLDB4NTRBNCwweDU0QkUsMHg1NEJDLDB4NTREOCwweDU0RTUsMHg1NEU2LC8qIDB4NDAtMHg0NyAqLworCTB4NTUwRiwweDU1MTQsMHg1NEZELDB4NTRFRSwweDU0RUQsMHg1NEZBLDB4NTRFMiwweDU1MzksLyogMHg0OC0weDRGICovCisJMHg1NTQwLDB4NTU2MywweDU1NEMsMHg1NTJFLDB4NTU1QywweDU1NDUsMHg1NTU2LDB4NTU1NywvKiAweDUwLTB4NTcgKi8KKwkweDU1MzgsMHg1NTMzLDB4NTU1RCwweDU1OTksMHg1NTgwLDB4NTRBRiwweDU1OEEsMHg1NTlGLC8qIDB4NTgtMHg1RiAqLworCTB4NTU3QiwweDU1N0UsMHg1NTk4LDB4NTU5RSwweDU1QUUsMHg1NTdDLDB4NTU4MywweDU1QTksLyogMHg2MC0weDY3ICovCisJMHg1NTg3LDB4NTVBOCwweDU1REEsMHg1NUM1LDB4NTVERiwweDU1QzQsMHg1NURDLDB4NTVFNCwvKiAweDY4LTB4NkYgKi8KKwkweDU1RDQsMHg1NjE0LDB4NTVGNywweDU2MTYsMHg1NUZFLDB4NTVGRCwweDU2MUIsMHg1NUY5LC8qIDB4NzAtMHg3NyAqLworCTB4NTY0RSwweDU2NTAsMHg3MURGLDB4NTYzNCwweDU2MzYsMHg1NjMyLDB4NTYzOCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDU2NkIsMHg1NjY0LDB4NTYyRiwweDU2NkMsMHg1NjZBLDB4NTY4NiwweDU2ODAsMHg1NjhBLC8qIDB4ODAtMHg4NyAqLworCTB4NTZBMCwweDU2OTQsMHg1NjhGLDB4NTZBNSwweDU2QUUsMHg1NkI2LDB4NTZCNCwweDU2QzIsLyogMHg4OC0weDhGICovCisJMHg1NkJDLDB4NTZDMSwweDU2QzMsMHg1NkMwLDB4NTZDOCwweDU2Q0UsMHg1NkQxLDB4NTZEMywvKiAweDkwLTB4OTcgKi8KKwkweDU2RDcsMHg1NkVFLDB4NTZGOSwweDU3MDAsMHg1NkZGLDB4NTcwNCwweDU3MDksMHg1NzA4LC8qIDB4OTgtMHg5RiAqLworCTB4NTcwQiwweDU3MEQsMHg1NzEzLDB4NTcxOCwweDU3MTYsMHg1NUM3LDB4NTcxQywweDU3MjYsLyogMHhBMC0weEE3ICovCisJMHg1NzM3LDB4NTczOCwweDU3NEUsMHg1NzNCLDB4NTc0MCwweDU3NEYsMHg1NzY5LDB4NTdDMCwvKiAweEE4LTB4QUYgKi8KKwkweDU3ODgsMHg1NzYxLDB4NTc3RiwweDU3ODksMHg1NzkzLDB4NTdBMCwweDU3QjMsMHg1N0E0LC8qIDB4QjAtMHhCNyAqLworCTB4NTdBQSwweDU3QjAsMHg1N0MzLDB4NTdDNiwweDU3RDQsMHg1N0QyLDB4NTdEMywweDU4MEEsLyogMHhCOC0weEJGICovCisJMHg1N0Q2LDB4NTdFMywweDU4MEIsMHg1ODE5LDB4NTgxRCwweDU4NzIsMHg1ODIxLDB4NTg2MiwvKiAweEMwLTB4QzcgKi8KKwkweDU4NEIsMHg1ODcwLDB4NkJDMCwweDU4NTIsMHg1ODNELDB4NTg3OSwweDU4ODUsMHg1OEI5LC8qIDB4QzgtMHhDRiAqLworCTB4NTg5RiwweDU4QUIsMHg1OEJBLDB4NThERSwweDU4QkIsMHg1OEI4LDB4NThBRSwweDU4QzUsLyogMHhEMC0weEQ3ICovCisJMHg1OEQzLDB4NThEMSwweDU4RDcsMHg1OEQ5LDB4NThEOCwweDU4RTUsMHg1OERDLDB4NThFNCwvKiAweEQ4LTB4REYgKi8KKwkweDU4REYsMHg1OEVGLDB4NThGQSwweDU4RjksMHg1OEZCLDB4NThGQywweDU4RkQsMHg1OTAyLC8qIDB4RTAtMHhFNyAqLworCTB4NTkwQSwweDU5MTAsMHg1OTFCLDB4NjhBNiwweDU5MjUsMHg1OTJDLDB4NTkyRCwweDU5MzIsLyogMHhFOC0weEVGICovCisJMHg1OTM4LDB4NTkzRSwweDdBRDIsMHg1OTU1LDB4NTk1MCwweDU5NEUsMHg1OTVBLDB4NTk1OCwvKiAweEYwLTB4RjcgKi8KKwkweDU5NjIsMHg1OTYwLDB4NTk2NywweDU5NkMsMHg1OTY5LDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzlCWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NTk3OCwweDU5ODEsMHg1OTlELDB4NEY1RSwweDRGQUIsMHg1OUEzLDB4NTlCMiwweDU5QzYsLyogMHg0MC0weDQ3ICovCisJMHg1OUU4LDB4NTlEQywweDU5OEQsMHg1OUQ5LDB4NTlEQSwweDVBMjUsMHg1QTFGLDB4NUExMSwvKiAweDQ4LTB4NEYgKi8KKwkweDVBMUMsMHg1QTA5LDB4NUExQSwweDVBNDAsMHg1QTZDLDB4NUE0OSwweDVBMzUsMHg1QTM2LC8qIDB4NTAtMHg1NyAqLworCTB4NUE2MiwweDVBNkEsMHg1QTlBLDB4NUFCQywweDVBQkUsMHg1QUNCLDB4NUFDMiwweDVBQkQsLyogMHg1OC0weDVGICovCisJMHg1QUUzLDB4NUFENywweDVBRTYsMHg1QUU5LDB4NUFENiwweDVBRkEsMHg1QUZCLDB4NUIwQywvKiAweDYwLTB4NjcgKi8KKwkweDVCMEIsMHg1QjE2LDB4NUIzMiwweDVBRDAsMHg1QjJBLDB4NUIzNiwweDVCM0UsMHg1QjQzLC8qIDB4NjgtMHg2RiAqLworCTB4NUI0NSwweDVCNDAsMHg1QjUxLDB4NUI1NSwweDVCNUEsMHg1QjVCLDB4NUI2NSwweDVCNjksLyogMHg3MC0weDc3ICovCisJMHg1QjcwLDB4NUI3MywweDVCNzUsMHg1Qjc4LDB4NjU4OCwweDVCN0EsMHg1QjgwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NUI4MywweDVCQTYsMHg1QkI4LDB4NUJDMywweDVCQzcsMHg1QkM5LDB4NUJENCwweDVCRDAsLyogMHg4MC0weDg3ICovCisJMHg1QkU0LDB4NUJFNiwweDVCRTIsMHg1QkRFLDB4NUJFNSwweDVCRUIsMHg1QkYwLDB4NUJGNiwvKiAweDg4LTB4OEYgKi8KKwkweDVCRjMsMHg1QzA1LDB4NUMwNywweDVDMDgsMHg1QzBELDB4NUMxMywweDVDMjAsMHg1QzIyLC8qIDB4OTAtMHg5NyAqLworCTB4NUMyOCwweDVDMzgsMHg1QzM5LDB4NUM0MSwweDVDNDYsMHg1QzRFLDB4NUM1MywweDVDNTAsLyogMHg5OC0weDlGICovCisJMHg1QzRGLDB4NUI3MSwweDVDNkMsMHg1QzZFLDB4NEU2MiwweDVDNzYsMHg1Qzc5LDB4NUM4QywvKiAweEEwLTB4QTcgKi8KKwkweDVDOTEsMHg1Qzk0LDB4NTk5QiwweDVDQUIsMHg1Q0JCLDB4NUNCNiwweDVDQkMsMHg1Q0I3LC8qIDB4QTgtMHhBRiAqLworCTB4NUNDNSwweDVDQkUsMHg1Q0M3LDB4NUNEOSwweDVDRTksMHg1Q0ZELDB4NUNGQSwweDVDRUQsLyogMHhCMC0weEI3ICovCisJMHg1RDhDLDB4NUNFQSwweDVEMEIsMHg1RDE1LDB4NUQxNywweDVENUMsMHg1RDFGLDB4NUQxQiwvKiAweEI4LTB4QkYgKi8KKwkweDVEMTEsMHg1RDE0LDB4NUQyMiwweDVEMUEsMHg1RDE5LDB4NUQxOCwweDVENEMsMHg1RDUyLC8qIDB4QzAtMHhDNyAqLworCTB4NUQ0RSwweDVENEIsMHg1RDZDLDB4NUQ3MywweDVENzYsMHg1RDg3LDB4NUQ4NCwweDVEODIsLyogMHhDOC0weENGICovCisJMHg1REEyLDB4NUQ5RCwweDVEQUMsMHg1REFFLDB4NURCRCwweDVEOTAsMHg1REI3LDB4NURCQywvKiAweEQwLTB4RDcgKi8KKwkweDVEQzksMHg1RENELDB4NUREMywweDVERDIsMHg1REQ2LDB4NUREQiwweDVERUIsMHg1REYyLC8qIDB4RDgtMHhERiAqLworCTB4NURGNSwweDVFMEIsMHg1RTFBLDB4NUUxOSwweDVFMTEsMHg1RTFCLDB4NUUzNiwweDVFMzcsLyogMHhFMC0weEU3ICovCisJMHg1RTQ0LDB4NUU0MywweDVFNDAsMHg1RTRFLDB4NUU1NywweDVFNTQsMHg1RTVGLDB4NUU2MiwvKiAweEU4LTB4RUYgKi8KKwkweDVFNjQsMHg1RTQ3LDB4NUU3NSwweDVFNzYsMHg1RTdBLDB4OUVCQywweDVFN0YsMHg1RUEwLC8qIDB4RjAtMHhGNyAqLworCTB4NUVDMSwweDVFQzIsMHg1RUM4LDB4NUVEMCwweDVFQ0YsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOUNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1RUQ2LDB4NUVFMywweDVFREQsMHg1RURBLDB4NUVEQiwweDVFRTIsMHg1RUUxLDB4NUVFOCwvKiAweDQwLTB4NDcgKi8KKwkweDVFRTksMHg1RUVDLDB4NUVGMSwweDVFRjMsMHg1RUYwLDB4NUVGNCwweDVFRjgsMHg1RUZFLC8qIDB4NDgtMHg0RiAqLworCTB4NUYwMywweDVGMDksMHg1RjVELDB4NUY1QywweDVGMEIsMHg1RjExLDB4NUYxNiwweDVGMjksLyogMHg1MC0weDU3ICovCisJMHg1RjJELDB4NUYzOCwweDVGNDEsMHg1RjQ4LDB4NUY0QywweDVGNEUsMHg1RjJGLDB4NUY1MSwvKiAweDU4LTB4NUYgKi8KKwkweDVGNTYsMHg1RjU3LDB4NUY1OSwweDVGNjEsMHg1RjZELDB4NUY3MywweDVGNzcsMHg1RjgzLC8qIDB4NjAtMHg2NyAqLworCTB4NUY4MiwweDVGN0YsMHg1RjhBLDB4NUY4OCwweDVGOTEsMHg1Rjg3LDB4NUY5RSwweDVGOTksLyogMHg2OC0weDZGICovCisJMHg1Rjk4LDB4NUZBMCwweDVGQTgsMHg1RkFELDB4NUZCQywweDVGRDYsMHg1RkZCLDB4NUZFNCwvKiAweDcwLTB4NzcgKi8KKwkweDVGRjgsMHg1RkYxLDB4NUZERCwweDYwQjMsMHg1RkZGLDB4NjAyMSwweDYwNjAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg2MDE5LDB4NjAxMCwweDYwMjksMHg2MDBFLDB4NjAzMSwweDYwMUIsMHg2MDE1LDB4NjAyQiwvKiAweDgwLTB4ODcgKi8KKwkweDYwMjYsMHg2MDBGLDB4NjAzQSwweDYwNUEsMHg2MDQxLDB4NjA2QSwweDYwNzcsMHg2MDVGLC8qIDB4ODgtMHg4RiAqLworCTB4NjA0QSwweDYwNDYsMHg2MDRELDB4NjA2MywweDYwNDMsMHg2MDY0LDB4NjA0MiwweDYwNkMsLyogMHg5MC0weDk3ICovCisJMHg2MDZCLDB4NjA1OSwweDYwODEsMHg2MDhELDB4NjBFNywweDYwODMsMHg2MDlBLDB4NjA4NCwvKiAweDk4LTB4OUYgKi8KKwkweDYwOUIsMHg2MDk2LDB4NjA5NywweDYwOTIsMHg2MEE3LDB4NjA4QiwweDYwRTEsMHg2MEI4LC8qIDB4QTAtMHhBNyAqLworCTB4NjBFMCwweDYwRDMsMHg2MEI0LDB4NUZGMCwweDYwQkQsMHg2MEM2LDB4NjBCNSwweDYwRDgsLyogMHhBOC0weEFGICovCisJMHg2MTRELDB4NjExNSwweDYxMDYsMHg2MEY2LDB4NjBGNywweDYxMDAsMHg2MEY0LDB4NjBGQSwvKiAweEIwLTB4QjcgKi8KKwkweDYxMDMsMHg2MTIxLDB4NjBGQiwweDYwRjEsMHg2MTBELDB4NjEwRSwweDYxNDcsMHg2MTNFLC8qIDB4QjgtMHhCRiAqLworCTB4NjEyOCwweDYxMjcsMHg2MTRBLDB4NjEzRiwweDYxM0MsMHg2MTJDLDB4NjEzNCwweDYxM0QsLyogMHhDMC0weEM3ICovCisJMHg2MTQyLDB4NjE0NCwweDYxNzMsMHg2MTc3LDB4NjE1OCwweDYxNTksMHg2MTVBLDB4NjE2QiwvKiAweEM4LTB4Q0YgKi8KKwkweDYxNzQsMHg2MTZGLDB4NjE2NSwweDYxNzEsMHg2MTVGLDB4NjE1RCwweDYxNTMsMHg2MTc1LC8qIDB4RDAtMHhENyAqLworCTB4NjE5OSwweDYxOTYsMHg2MTg3LDB4NjFBQywweDYxOTQsMHg2MTlBLDB4NjE4QSwweDYxOTEsLyogMHhEOC0weERGICovCisJMHg2MUFCLDB4NjFBRSwweDYxQ0MsMHg2MUNBLDB4NjFDOSwweDYxRjcsMHg2MUM4LDB4NjFDMywvKiAweEUwLTB4RTcgKi8KKwkweDYxQzYsMHg2MUJBLDB4NjFDQiwweDdGNzksMHg2MUNELDB4NjFFNiwweDYxRTMsMHg2MUY2LC8qIDB4RTgtMHhFRiAqLworCTB4NjFGQSwweDYxRjQsMHg2MUZGLDB4NjFGRCwweDYxRkMsMHg2MUZFLDB4NjIwMCwweDYyMDgsLyogMHhGMC0weEY3ICovCisJMHg2MjA5LDB4NjIwRCwweDYyMEMsMHg2MjE0LDB4NjIxQiwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85RFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDYyMUUsMHg2MjIxLDB4NjIyQSwweDYyMkUsMHg2MjMwLDB4NjIzMiwweDYyMzMsMHg2MjQxLC8qIDB4NDAtMHg0NyAqLworCTB4NjI0RSwweDYyNUUsMHg2MjYzLDB4NjI1QiwweDYyNjAsMHg2MjY4LDB4NjI3QywweDYyODIsLyogMHg0OC0weDRGICovCisJMHg2Mjg5LDB4NjI3RSwweDYyOTIsMHg2MjkzLDB4NjI5NiwweDYyRDQsMHg2MjgzLDB4NjI5NCwvKiAweDUwLTB4NTcgKi8KKwkweDYyRDcsMHg2MkQxLDB4NjJCQiwweDYyQ0YsMHg2MkZGLDB4NjJDNiwweDY0RDQsMHg2MkM4LC8qIDB4NTgtMHg1RiAqLworCTB4NjJEQywweDYyQ0MsMHg2MkNBLDB4NjJDMiwweDYyQzcsMHg2MjlCLDB4NjJDOSwweDYzMEMsLyogMHg2MC0weDY3ICovCisJMHg2MkVFLDB4NjJGMSwweDYzMjcsMHg2MzAyLDB4NjMwOCwweDYyRUYsMHg2MkY1LDB4NjM1MCwvKiAweDY4LTB4NkYgKi8KKwkweDYzM0UsMHg2MzRELDB4NjQxQywweDYzNEYsMHg2Mzk2LDB4NjM4RSwweDYzODAsMHg2M0FCLC8qIDB4NzAtMHg3NyAqLworCTB4NjM3NiwweDYzQTMsMHg2MzhGLDB4NjM4OSwweDYzOUYsMHg2M0I1LDB4NjM2QiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDYzNjksMHg2M0JFLDB4NjNFOSwweDYzQzAsMHg2M0M2LDB4NjNFMywweDYzQzksMHg2M0QyLC8qIDB4ODAtMHg4NyAqLworCTB4NjNGNiwweDYzQzQsMHg2NDE2LDB4NjQzNCwweDY0MDYsMHg2NDEzLDB4NjQyNiwweDY0MzYsLyogMHg4OC0weDhGICovCisJMHg2NTFELDB4NjQxNywweDY0MjgsMHg2NDBGLDB4NjQ2NywweDY0NkYsMHg2NDc2LDB4NjQ0RSwvKiAweDkwLTB4OTcgKi8KKwkweDY1MkEsMHg2NDk1LDB4NjQ5MywweDY0QTUsMHg2NEE5LDB4NjQ4OCwweDY0QkMsMHg2NERBLC8qIDB4OTgtMHg5RiAqLworCTB4NjREMiwweDY0QzUsMHg2NEM3LDB4NjRCQiwweDY0RDgsMHg2NEMyLDB4NjRGMSwweDY0RTcsLyogMHhBMC0weEE3ICovCisJMHg4MjA5LDB4NjRFMCwweDY0RTEsMHg2MkFDLDB4NjRFMywweDY0RUYsMHg2NTJDLDB4NjRGNiwvKiAweEE4LTB4QUYgKi8KKwkweDY0RjQsMHg2NEYyLDB4NjRGQSwweDY1MDAsMHg2NEZELDB4NjUxOCwweDY1MUMsMHg2NTA1LC8qIDB4QjAtMHhCNyAqLworCTB4NjUyNCwweDY1MjMsMHg2NTJCLDB4NjUzNCwweDY1MzUsMHg2NTM3LDB4NjUzNiwweDY1MzgsLyogMHhCOC0weEJGICovCisJMHg3NTRCLDB4NjU0OCwweDY1NTYsMHg2NTU1LDB4NjU0RCwweDY1NTgsMHg2NTVFLDB4NjU1RCwvKiAweEMwLTB4QzcgKi8KKwkweDY1NzIsMHg2NTc4LDB4NjU4MiwweDY1ODMsMHg4QjhBLDB4NjU5QiwweDY1OUYsMHg2NUFCLC8qIDB4QzgtMHhDRiAqLworCTB4NjVCNywweDY1QzMsMHg2NUM2LDB4NjVDMSwweDY1QzQsMHg2NUNDLDB4NjVEMiwweDY1REIsLyogMHhEMC0weEQ3ICovCisJMHg2NUQ5LDB4NjVFMCwweDY1RTEsMHg2NUYxLDB4Njc3MiwweDY2MEEsMHg2NjAzLDB4NjVGQiwvKiAweEQ4LTB4REYgKi8KKwkweDY3NzMsMHg2NjM1LDB4NjYzNiwweDY2MzQsMHg2NjFDLDB4NjY0RiwweDY2NDQsMHg2NjQ5LC8qIDB4RTAtMHhFNyAqLworCTB4NjY0MSwweDY2NUUsMHg2NjVELDB4NjY2NCwweDY2NjcsMHg2NjY4LDB4NjY1RiwweDY2NjIsLyogMHhFOC0weEVGICovCisJMHg2NjcwLDB4NjY4MywweDY2ODgsMHg2NjhFLDB4NjY4OSwweDY2ODQsMHg2Njk4LDB4NjY5RCwvKiAweEYwLTB4RjcgKi8KKwkweDY2QzEsMHg2NkI5LDB4NjZDOSwweDY2QkUsMHg2NkJDLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzlFWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NjZDNCwweDY2QjgsMHg2NkQ2LDB4NjZEQSwweDY2RTAsMHg2NjNGLDB4NjZFNiwweDY2RTksLyogMHg0MC0weDQ3ICovCisJMHg2NkYwLDB4NjZGNSwweDY2RjcsMHg2NzBGLDB4NjcxNiwweDY3MUUsMHg2NzI2LDB4NjcyNywvKiAweDQ4LTB4NEYgKi8KKwkweDk3MzgsMHg2NzJFLDB4NjczRiwweDY3MzYsMHg2NzQxLDB4NjczOCwweDY3MzcsMHg2NzQ2LC8qIDB4NTAtMHg1NyAqLworCTB4Njc1RSwweDY3NjAsMHg2NzU5LDB4Njc2MywweDY3NjQsMHg2Nzg5LDB4Njc3MCwweDY3QTksLyogMHg1OC0weDVGICovCisJMHg2NzdDLDB4Njc2QSwweDY3OEMsMHg2NzhCLDB4NjdBNiwweDY3QTEsMHg2Nzg1LDB4NjdCNywvKiAweDYwLTB4NjcgKi8KKwkweDY3RUYsMHg2N0I0LDB4NjdFQywweDY3QjMsMHg2N0U5LDB4NjdCOCwweDY3RTQsMHg2N0RFLC8qIDB4NjgtMHg2RiAqLworCTB4NjdERCwweDY3RTIsMHg2N0VFLDB4NjdCOSwweDY3Q0UsMHg2N0M2LDB4NjdFNywweDZBOUMsLyogMHg3MC0weDc3ICovCisJMHg2ODFFLDB4Njg0NiwweDY4MjksMHg2ODQwLDB4Njg0RCwweDY4MzIsMHg2ODRFLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NjhCMywweDY4MkIsMHg2ODU5LDB4Njg2MywweDY4NzcsMHg2ODdGLDB4Njg5RiwweDY4OEYsLyogMHg4MC0weDg3ICovCisJMHg2OEFELDB4Njg5NCwweDY4OUQsMHg2ODlCLDB4Njg4MywweDZBQUUsMHg2OEI5LDB4Njg3NCwvKiAweDg4LTB4OEYgKi8KKwkweDY4QjUsMHg2OEEwLDB4NjhCQSwweDY5MEYsMHg2ODhELDB4Njg3RSwweDY5MDEsMHg2OENBLC8qIDB4OTAtMHg5NyAqLworCTB4NjkwOCwweDY4RDgsMHg2OTIyLDB4NjkyNiwweDY4RTEsMHg2OTBDLDB4NjhDRCwweDY4RDQsLyogMHg5OC0weDlGICovCisJMHg2OEU3LDB4NjhENSwweDY5MzYsMHg2OTEyLDB4NjkwNCwweDY4RDcsMHg2OEUzLDB4NjkyNSwvKiAweEEwLTB4QTcgKi8KKwkweDY4RjksMHg2OEUwLDB4NjhFRiwweDY5MjgsMHg2OTJBLDB4NjkxQSwweDY5MjMsMHg2OTIxLC8qIDB4QTgtMHhBRiAqLworCTB4NjhDNiwweDY5NzksMHg2OTc3LDB4Njk1QywweDY5NzgsMHg2OTZCLDB4Njk1NCwweDY5N0UsLyogMHhCMC0weEI3ICovCisJMHg2OTZFLDB4NjkzOSwweDY5NzQsMHg2OTNELDB4Njk1OSwweDY5MzAsMHg2OTYxLDB4Njk1RSwvKiAweEI4LTB4QkYgKi8KKwkweDY5NUQsMHg2OTgxLDB4Njk2QSwweDY5QjIsMHg2OUFFLDB4NjlEMCwweDY5QkYsMHg2OUMxLC8qIDB4QzAtMHhDNyAqLworCTB4NjlEMywweDY5QkUsMHg2OUNFLDB4NUJFOCwweDY5Q0EsMHg2OURELDB4NjlCQiwweDY5QzMsLyogMHhDOC0weENGICovCisJMHg2OUE3LDB4NkEyRSwweDY5OTEsMHg2OUEwLDB4Njk5QywweDY5OTUsMHg2OUI0LDB4NjlERSwvKiAweEQwLTB4RDcgKi8KKwkweDY5RTgsMHg2QTAyLDB4NkExQiwweDY5RkYsMHg2QjBBLDB4NjlGOSwweDY5RjIsMHg2OUU3LC8qIDB4RDgtMHhERiAqLworCTB4NkEwNSwweDY5QjEsMHg2QTFFLDB4NjlFRCwweDZBMTQsMHg2OUVCLDB4NkEwQSwweDZBMTIsLyogMHhFMC0weEU3ICovCisJMHg2QUMxLDB4NkEyMywweDZBMTMsMHg2QTQ0LDB4NkEwQywweDZBNzIsMHg2QTM2LDB4NkE3OCwvKiAweEU4LTB4RUYgKi8KKwkweDZBNDcsMHg2QTYyLDB4NkE1OSwweDZBNjYsMHg2QTQ4LDB4NkEzOCwweDZBMjIsMHg2QTkwLC8qIDB4RjAtMHhGNyAqLworCTB4NkE4RCwweDZBQTAsMHg2QTg0LDB4NkFBMiwweDZBQTMsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOUZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2QTk3LDB4ODYxNywweDZBQkIsMHg2QUMzLDB4NkFDMiwweDZBQjgsMHg2QUIzLDB4NkFBQywvKiAweDQwLTB4NDcgKi8KKwkweDZBREUsMHg2QUQxLDB4NkFERiwweDZBQUEsMHg2QURBLDB4NkFFQSwweDZBRkIsMHg2QjA1LC8qIDB4NDgtMHg0RiAqLworCTB4ODYxNiwweDZBRkEsMHg2QjEyLDB4NkIxNiwweDlCMzEsMHg2QjFGLDB4NkIzOCwweDZCMzcsLyogMHg1MC0weDU3ICovCisJMHg3NkRDLDB4NkIzOSwweDk4RUUsMHg2QjQ3LDB4NkI0MywweDZCNDksMHg2QjUwLDB4NkI1OSwvKiAweDU4LTB4NUYgKi8KKwkweDZCNTQsMHg2QjVCLDB4NkI1RiwweDZCNjEsMHg2Qjc4LDB4NkI3OSwweDZCN0YsMHg2QjgwLC8qIDB4NjAtMHg2NyAqLworCTB4NkI4NCwweDZCODMsMHg2QjhELDB4NkI5OCwweDZCOTUsMHg2QjlFLDB4NkJBNCwweDZCQUEsLyogMHg2OC0weDZGICovCisJMHg2QkFCLDB4NkJBRiwweDZCQjIsMHg2QkIxLDB4NkJCMywweDZCQjcsMHg2QkJDLDB4NkJDNiwvKiAweDcwLTB4NzcgKi8KKwkweDZCQ0IsMHg2QkQzLDB4NkJERiwweDZCRUMsMHg2QkVCLDB4NkJGMywweDZCRUYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5RUJFLDB4NkMwOCwweDZDMTMsMHg2QzE0LDB4NkMxQiwweDZDMjQsMHg2QzIzLDB4NkM1RSwvKiAweDgwLTB4ODcgKi8KKwkweDZDNTUsMHg2QzYyLDB4NkM2QSwweDZDODIsMHg2QzhELDB4NkM5QSwweDZDODEsMHg2QzlCLC8qIDB4ODgtMHg4RiAqLworCTB4NkM3RSwweDZDNjgsMHg2QzczLDB4NkM5MiwweDZDOTAsMHg2Q0M0LDB4NkNGMSwweDZDRDMsLyogMHg5MC0weDk3ICovCisJMHg2Q0JELDB4NkNENywweDZDQzUsMHg2Q0RELDB4NkNBRSwweDZDQjEsMHg2Q0JFLDB4NkNCQSwvKiAweDk4LTB4OUYgKi8KKwkweDZDREIsMHg2Q0VGLDB4NkNEOSwweDZDRUEsMHg2RDFGLDB4ODg0RCwweDZEMzYsMHg2RDJCLC8qIDB4QTAtMHhBNyAqLworCTB4NkQzRCwweDZEMzgsMHg2RDE5LDB4NkQzNSwweDZEMzMsMHg2RDEyLDB4NkQwQywweDZENjMsLyogMHhBOC0weEFGICovCisJMHg2RDkzLDB4NkQ2NCwweDZENUEsMHg2RDc5LDB4NkQ1OSwweDZEOEUsMHg2RDk1LDB4NkZFNCwvKiAweEIwLTB4QjcgKi8KKwkweDZEODUsMHg2REY5LDB4NkUxNSwweDZFMEEsMHg2REI1LDB4NkRDNywweDZERTYsMHg2REI4LC8qIDB4QjgtMHhCRiAqLworCTB4NkRDNiwweDZERUMsMHg2RERFLDB4NkRDQywweDZERTgsMHg2REQyLDB4NkRDNSwweDZERkEsLyogMHhDMC0weEM3ICovCisJMHg2REQ5LDB4NkRFNCwweDZERDUsMHg2REVBLDB4NkRFRSwweDZFMkQsMHg2RTZFLDB4NkUyRSwvKiAweEM4LTB4Q0YgKi8KKwkweDZFMTksMHg2RTcyLDB4NkU1RiwweDZFM0UsMHg2RTIzLDB4NkU2QiwweDZFMkIsMHg2RTc2LC8qIDB4RDAtMHhENyAqLworCTB4NkU0RCwweDZFMUYsMHg2RTQzLDB4NkUzQSwweDZFNEUsMHg2RTI0LDB4NkVGRiwweDZFMUQsLyogMHhEOC0weERGICovCisJMHg2RTM4LDB4NkU4MiwweDZFQUEsMHg2RTk4LDB4NkVDOSwweDZFQjcsMHg2RUQzLDB4NkVCRCwvKiAweEUwLTB4RTcgKi8KKwkweDZFQUYsMHg2RUM0LDB4NkVCMiwweDZFRDQsMHg2RUQ1LDB4NkU4RiwweDZFQTUsMHg2RUMyLC8qIDB4RTgtMHhFRiAqLworCTB4NkU5RiwweDZGNDEsMHg2RjExLDB4NzA0QywweDZFRUMsMHg2RUY4LDB4NkVGRSwweDZGM0YsLyogMHhGMC0weEY3ICovCisJMHg2RUYyLDB4NkYzMSwweDZFRUYsMHg2RjMyLDB4NkVDQywweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FMFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDZGM0UsMHg2RjEzLDB4NkVGNywweDZGODYsMHg2RjdBLDB4NkY3OCwweDZGODEsMHg2RjgwLC8qIDB4NDAtMHg0NyAqLworCTB4NkY2RiwweDZGNUIsMHg2RkYzLDB4NkY2RCwweDZGODIsMHg2RjdDLDB4NkY1OCwweDZGOEUsLyogMHg0OC0weDRGICovCisJMHg2RjkxLDB4NkZDMiwweDZGNjYsMHg2RkIzLDB4NkZBMywweDZGQTEsMHg2RkE0LDB4NkZCOSwvKiAweDUwLTB4NTcgKi8KKwkweDZGQzYsMHg2RkFBLDB4NkZERiwweDZGRDUsMHg2RkVDLDB4NkZENCwweDZGRDgsMHg2RkYxLC8qIDB4NTgtMHg1RiAqLworCTB4NkZFRSwweDZGREIsMHg3MDA5LDB4NzAwQiwweDZGRkEsMHg3MDExLDB4NzAwMSwweDcwMEYsLyogMHg2MC0weDY3ICovCisJMHg2RkZFLDB4NzAxQiwweDcwMUEsMHg2Rjc0LDB4NzAxRCwweDcwMTgsMHg3MDFGLDB4NzAzMCwvKiAweDY4LTB4NkYgKi8KKwkweDcwM0UsMHg3MDMyLDB4NzA1MSwweDcwNjMsMHg3MDk5LDB4NzA5MiwweDcwQUYsMHg3MEYxLC8qIDB4NzAtMHg3NyAqLworCTB4NzBBQywweDcwQjgsMHg3MEIzLDB4NzBBRSwweDcwREYsMHg3MENCLDB4NzBERCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDcwRDksMHg3MTA5LDB4NzBGRCwweDcxMUMsMHg3MTE5LDB4NzE2NSwweDcxNTUsMHg3MTg4LC8qIDB4ODAtMHg4NyAqLworCTB4NzE2NiwweDcxNjIsMHg3MTRDLDB4NzE1NiwweDcxNkMsMHg3MThGLDB4NzFGQiwweDcxODQsLyogMHg4OC0weDhGICovCisJMHg3MTk1LDB4NzFBOCwweDcxQUMsMHg3MUQ3LDB4NzFCOSwweDcxQkUsMHg3MUQyLDB4NzFDOSwvKiAweDkwLTB4OTcgKi8KKwkweDcxRDQsMHg3MUNFLDB4NzFFMCwweDcxRUMsMHg3MUU3LDB4NzFGNSwweDcxRkMsMHg3MUY5LC8qIDB4OTgtMHg5RiAqLworCTB4NzFGRiwweDcyMEQsMHg3MjEwLDB4NzIxQiwweDcyMjgsMHg3MjJELDB4NzIyQywweDcyMzAsLyogMHhBMC0weEE3ICovCisJMHg3MjMyLDB4NzIzQiwweDcyM0MsMHg3MjNGLDB4NzI0MCwweDcyNDYsMHg3MjRCLDB4NzI1OCwvKiAweEE4LTB4QUYgKi8KKwkweDcyNzQsMHg3MjdFLDB4NzI4MiwweDcyODEsMHg3Mjg3LDB4NzI5MiwweDcyOTYsMHg3MkEyLC8qIDB4QjAtMHhCNyAqLworCTB4NzJBNywweDcyQjksMHg3MkIyLDB4NzJDMywweDcyQzYsMHg3MkM0LDB4NzJDRSwweDcyRDIsLyogMHhCOC0weEJGICovCisJMHg3MkUyLDB4NzJFMCwweDcyRTEsMHg3MkY5LDB4NzJGNywweDUwMEYsMHg3MzE3LDB4NzMwQSwvKiAweEMwLTB4QzcgKi8KKwkweDczMUMsMHg3MzE2LDB4NzMxRCwweDczMzQsMHg3MzJGLDB4NzMyOSwweDczMjUsMHg3MzNFLC8qIDB4QzgtMHhDRiAqLworCTB4NzM0RSwweDczNEYsMHg5RUQ4LDB4NzM1NywweDczNkEsMHg3MzY4LDB4NzM3MCwweDczNzgsLyogMHhEMC0weEQ3ICovCisJMHg3Mzc1LDB4NzM3QiwweDczN0EsMHg3M0M4LDB4NzNCMywweDczQ0UsMHg3M0JCLDB4NzNDMCwvKiAweEQ4LTB4REYgKi8KKwkweDczRTUsMHg3M0VFLDB4NzNERSwweDc0QTIsMHg3NDA1LDB4NzQ2RiwweDc0MjUsMHg3M0Y4LC8qIDB4RTAtMHhFNyAqLworCTB4NzQzMiwweDc0M0EsMHg3NDU1LDB4NzQzRiwweDc0NUYsMHg3NDU5LDB4NzQ0MSwweDc0NUMsLyogMHhFOC0weEVGICovCisJMHg3NDY5LDB4NzQ3MCwweDc0NjMsMHg3NDZBLDB4NzQ3NiwweDc0N0UsMHg3NDhCLDB4NzQ5RSwvKiAweEYwLTB4RjcgKi8KKwkweDc0QTcsMHg3NENBLDB4NzRDRiwweDc0RDQsMHg3M0YxLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0UxWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NzRFMCwweDc0RTMsMHg3NEU3LDB4NzRFOSwweDc0RUUsMHg3NEYyLDB4NzRGMCwweDc0RjEsLyogMHg0MC0weDQ3ICovCisJMHg3NEY4LDB4NzRGNywweDc1MDQsMHg3NTAzLDB4NzUwNSwweDc1MEMsMHg3NTBFLDB4NzUwRCwvKiAweDQ4LTB4NEYgKi8KKwkweDc1MTUsMHg3NTEzLDB4NzUxRSwweDc1MjYsMHg3NTJDLDB4NzUzQywweDc1NDQsMHg3NTRELC8qIDB4NTAtMHg1NyAqLworCTB4NzU0QSwweDc1NDksMHg3NTVCLDB4NzU0NiwweDc1NUEsMHg3NTY5LDB4NzU2NCwweDc1NjcsLyogMHg1OC0weDVGICovCisJMHg3NTZCLDB4NzU2RCwweDc1NzgsMHg3NTc2LDB4NzU4NiwweDc1ODcsMHg3NTc0LDB4NzU4QSwvKiAweDYwLTB4NjcgKi8KKwkweDc1ODksMHg3NTgyLDB4NzU5NCwweDc1OUEsMHg3NTlELDB4NzVBNSwweDc1QTMsMHg3NUMyLC8qIDB4NjgtMHg2RiAqLworCTB4NzVCMywweDc1QzMsMHg3NUI1LDB4NzVCRCwweDc1QjgsMHg3NUJDLDB4NzVCMSwweDc1Q0QsLyogMHg3MC0weDc3ICovCisJMHg3NUNBLDB4NzVEMiwweDc1RDksMHg3NUUzLDB4NzVERSwweDc1RkUsMHg3NUZGLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NzVGQywweDc2MDEsMHg3NUYwLDB4NzVGQSwweDc1RjIsMHg3NUYzLDB4NzYwQiwweDc2MEQsLyogMHg4MC0weDg3ICovCisJMHg3NjA5LDB4NzYxRiwweDc2MjcsMHg3NjIwLDB4NzYyMSwweDc2MjIsMHg3NjI0LDB4NzYzNCwvKiAweDg4LTB4OEYgKi8KKwkweDc2MzAsMHg3NjNCLDB4NzY0NywweDc2NDgsMHg3NjQ2LDB4NzY1QywweDc2NTgsMHg3NjYxLC8qIDB4OTAtMHg5NyAqLworCTB4NzY2MiwweDc2NjgsMHg3NjY5LDB4NzY2QSwweDc2NjcsMHg3NjZDLDB4NzY3MCwweDc2NzIsLyogMHg5OC0weDlGICovCisJMHg3Njc2LDB4NzY3OCwweDc2N0MsMHg3NjgwLDB4NzY4MywweDc2ODgsMHg3NjhCLDB4NzY4RSwvKiAweEEwLTB4QTcgKi8KKwkweDc2OTYsMHg3NjkzLDB4NzY5OSwweDc2OUEsMHg3NkIwLDB4NzZCNCwweDc2QjgsMHg3NkI5LC8qIDB4QTgtMHhBRiAqLworCTB4NzZCQSwweDc2QzIsMHg3NkNELDB4NzZENiwweDc2RDIsMHg3NkRFLDB4NzZFMSwweDc2RTUsLyogMHhCMC0weEI3ICovCisJMHg3NkU3LDB4NzZFQSwweDg2MkYsMHg3NkZCLDB4NzcwOCwweDc3MDcsMHg3NzA0LDB4NzcyOSwvKiAweEI4LTB4QkYgKi8KKwkweDc3MjQsMHg3NzFFLDB4NzcyNSwweDc3MjYsMHg3NzFCLDB4NzczNywweDc3MzgsMHg3NzQ3LC8qIDB4QzAtMHhDNyAqLworCTB4Nzc1QSwweDc3NjgsMHg3NzZCLDB4Nzc1QiwweDc3NjUsMHg3NzdGLDB4Nzc3RSwweDc3NzksLyogMHhDOC0weENGICovCisJMHg3NzhFLDB4Nzc4QiwweDc3OTEsMHg3N0EwLDB4Nzc5RSwweDc3QjAsMHg3N0I2LDB4NzdCOSwvKiAweEQwLTB4RDcgKi8KKwkweDc3QkYsMHg3N0JDLDB4NzdCRCwweDc3QkIsMHg3N0M3LDB4NzdDRCwweDc3RDcsMHg3N0RBLC8qIDB4RDgtMHhERiAqLworCTB4NzdEQywweDc3RTMsMHg3N0VFLDB4NzdGQywweDc4MEMsMHg3ODEyLDB4NzkyNiwweDc4MjAsLyogMHhFMC0weEU3ICovCisJMHg3OTJBLDB4Nzg0NSwweDc4OEUsMHg3ODc0LDB4Nzg4NiwweDc4N0MsMHg3ODlBLDB4Nzg4QywvKiAweEU4LTB4RUYgKi8KKwkweDc4QTMsMHg3OEI1LDB4NzhBQSwweDc4QUYsMHg3OEQxLDB4NzhDNiwweDc4Q0IsMHg3OEQ0LC8qIDB4RjAtMHhGNyAqLworCTB4NzhCRSwweDc4QkMsMHg3OEM1LDB4NzhDQSwweDc4RUMsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3OEU3LDB4NzhEQSwweDc4RkQsMHg3OEY0LDB4NzkwNywweDc5MTIsMHg3OTExLDB4NzkxOSwvKiAweDQwLTB4NDcgKi8KKwkweDc5MkMsMHg3OTJCLDB4Nzk0MCwweDc5NjAsMHg3OTU3LDB4Nzk1RiwweDc5NUEsMHg3OTU1LC8qIDB4NDgtMHg0RiAqLworCTB4Nzk1MywweDc5N0EsMHg3OTdGLDB4Nzk4QSwweDc5OUQsMHg3OUE3LDB4OUY0QiwweDc5QUEsLyogMHg1MC0weDU3ICovCisJMHg3OUFFLDB4NzlCMywweDc5QjksMHg3OUJBLDB4NzlDOSwweDc5RDUsMHg3OUU3LDB4NzlFQywvKiAweDU4LTB4NUYgKi8KKwkweDc5RTEsMHg3OUUzLDB4N0EwOCwweDdBMEQsMHg3QTE4LDB4N0ExOSwweDdBMjAsMHg3QTFGLC8qIDB4NjAtMHg2NyAqLworCTB4Nzk4MCwweDdBMzEsMHg3QTNCLDB4N0EzRSwweDdBMzcsMHg3QTQzLDB4N0E1NywweDdBNDksLyogMHg2OC0weDZGICovCisJMHg3QTYxLDB4N0E2MiwweDdBNjksMHg5RjlELDB4N0E3MCwweDdBNzksMHg3QTdELDB4N0E4OCwvKiAweDcwLTB4NzcgKi8KKwkweDdBOTcsMHg3QTk1LDB4N0E5OCwweDdBOTYsMHg3QUE5LDB4N0FDOCwweDdBQjAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3QUI2LDB4N0FDNSwweDdBQzQsMHg3QUJGLDB4OTA4MywweDdBQzcsMHg3QUNBLDB4N0FDRCwvKiAweDgwLTB4ODcgKi8KKwkweDdBQ0YsMHg3QUQ1LDB4N0FEMywweDdBRDksMHg3QURBLDB4N0FERCwweDdBRTEsMHg3QUUyLC8qIDB4ODgtMHg4RiAqLworCTB4N0FFNiwweDdBRUQsMHg3QUYwLDB4N0IwMiwweDdCMEYsMHg3QjBBLDB4N0IwNiwweDdCMzMsLyogMHg5MC0weDk3ICovCisJMHg3QjE4LDB4N0IxOSwweDdCMUUsMHg3QjM1LDB4N0IyOCwweDdCMzYsMHg3QjUwLDB4N0I3QSwvKiAweDk4LTB4OUYgKi8KKwkweDdCMDQsMHg3QjRELDB4N0IwQiwweDdCNEMsMHg3QjQ1LDB4N0I3NSwweDdCNjUsMHg3Qjc0LC8qIDB4QTAtMHhBNyAqLworCTB4N0I2NywweDdCNzAsMHg3QjcxLDB4N0I2QywweDdCNkUsMHg3QjlELDB4N0I5OCwweDdCOUYsLyogMHhBOC0weEFGICovCisJMHg3QjhELDB4N0I5QywweDdCOUEsMHg3QjhCLDB4N0I5MiwweDdCOEYsMHg3QjVELDB4N0I5OSwvKiAweEIwLTB4QjcgKi8KKwkweDdCQ0IsMHg3QkMxLDB4N0JDQywweDdCQ0YsMHg3QkI0LDB4N0JDNiwweDdCREQsMHg3QkU5LC8qIDB4QjgtMHhCRiAqLworCTB4N0MxMSwweDdDMTQsMHg3QkU2LDB4N0JFNSwweDdDNjAsMHg3QzAwLDB4N0MwNywweDdDMTMsLyogMHhDMC0weEM3ICovCisJMHg3QkYzLDB4N0JGNywweDdDMTcsMHg3QzBELDB4N0JGNiwweDdDMjMsMHg3QzI3LDB4N0MyQSwvKiAweEM4LTB4Q0YgKi8KKwkweDdDMUYsMHg3QzM3LDB4N0MyQiwweDdDM0QsMHg3QzRDLDB4N0M0MywweDdDNTQsMHg3QzRGLC8qIDB4RDAtMHhENyAqLworCTB4N0M0MCwweDdDNTAsMHg3QzU4LDB4N0M1RiwweDdDNjQsMHg3QzU2LDB4N0M2NSwweDdDNkMsLyogMHhEOC0weERGICovCisJMHg3Qzc1LDB4N0M4MywweDdDOTAsMHg3Q0E0LDB4N0NBRCwweDdDQTIsMHg3Q0FCLDB4N0NBMSwvKiAweEUwLTB4RTcgKi8KKwkweDdDQTgsMHg3Q0IzLDB4N0NCMiwweDdDQjEsMHg3Q0FFLDB4N0NCOSwweDdDQkQsMHg3Q0MwLC8qIDB4RTgtMHhFRiAqLworCTB4N0NDNSwweDdDQzIsMHg3Q0Q4LDB4N0NEMiwweDdDREMsMHg3Q0UyLDB4OUIzQiwweDdDRUYsLyogMHhGMC0weEY3ICovCisJMHg3Q0YyLDB4N0NGNCwweDdDRjYsMHg3Q0ZBLDB4N0QwNiwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FM1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDdEMDIsMHg3RDFDLDB4N0QxNSwweDdEMEEsMHg3RDQ1LDB4N0Q0QiwweDdEMkUsMHg3RDMyLC8qIDB4NDAtMHg0NyAqLworCTB4N0QzRiwweDdEMzUsMHg3RDQ2LDB4N0Q3MywweDdENTYsMHg3RDRFLDB4N0Q3MiwweDdENjgsLyogMHg0OC0weDRGICovCisJMHg3RDZFLDB4N0Q0RiwweDdENjMsMHg3RDkzLDB4N0Q4OSwweDdENUIsMHg3RDhGLDB4N0Q3RCwvKiAweDUwLTB4NTcgKi8KKwkweDdEOUIsMHg3REJBLDB4N0RBRSwweDdEQTMsMHg3REI1LDB4N0RDNywweDdEQkQsMHg3REFCLC8qIDB4NTgtMHg1RiAqLworCTB4N0UzRCwweDdEQTIsMHg3REFGLDB4N0REQywweDdEQjgsMHg3RDlGLDB4N0RCMCwweDdERDgsLyogMHg2MC0weDY3ICovCisJMHg3RERELDB4N0RFNCwweDdEREUsMHg3REZCLDB4N0RGMiwweDdERTEsMHg3RTA1LDB4N0UwQSwvKiAweDY4LTB4NkYgKi8KKwkweDdFMjMsMHg3RTIxLDB4N0UxMiwweDdFMzEsMHg3RTFGLDB4N0UwOSwweDdFMEIsMHg3RTIyLC8qIDB4NzAtMHg3NyAqLworCTB4N0U0NiwweDdFNjYsMHg3RTNCLDB4N0UzNSwweDdFMzksMHg3RTQzLDB4N0UzNywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDdFMzIsMHg3RTNBLDB4N0U2NywweDdFNUQsMHg3RTU2LDB4N0U1RSwweDdFNTksMHg3RTVBLC8qIDB4ODAtMHg4NyAqLworCTB4N0U3OSwweDdFNkEsMHg3RTY5LDB4N0U3QywweDdFN0IsMHg3RTgzLDB4N0RENSwweDdFN0QsLyogMHg4OC0weDhGICovCisJMHg4RkFFLDB4N0U3RiwweDdFODgsMHg3RTg5LDB4N0U4QywweDdFOTIsMHg3RTkwLDB4N0U5MywvKiAweDkwLTB4OTcgKi8KKwkweDdFOTQsMHg3RTk2LDB4N0U4RSwweDdFOUIsMHg3RTlDLDB4N0YzOCwweDdGM0EsMHg3RjQ1LC8qIDB4OTgtMHg5RiAqLworCTB4N0Y0QywweDdGNEQsMHg3RjRFLDB4N0Y1MCwweDdGNTEsMHg3RjU1LDB4N0Y1NCwweDdGNTgsLyogMHhBMC0weEE3ICovCisJMHg3RjVGLDB4N0Y2MCwweDdGNjgsMHg3RjY5LDB4N0Y2NywweDdGNzgsMHg3RjgyLDB4N0Y4NiwvKiAweEE4LTB4QUYgKi8KKwkweDdGODMsMHg3Rjg4LDB4N0Y4NywweDdGOEMsMHg3Rjk0LDB4N0Y5RSwweDdGOUQsMHg3RjlBLC8qIDB4QjAtMHhCNyAqLworCTB4N0ZBMywweDdGQUYsMHg3RkIyLDB4N0ZCOSwweDdGQUUsMHg3RkI2LDB4N0ZCOCwweDhCNzEsLyogMHhCOC0weEJGICovCisJMHg3RkM1LDB4N0ZDNiwweDdGQ0EsMHg3RkQ1LDB4N0ZENCwweDdGRTEsMHg3RkU2LDB4N0ZFOSwvKiAweEMwLTB4QzcgKi8KKwkweDdGRjMsMHg3RkY5LDB4OThEQywweDgwMDYsMHg4MDA0LDB4ODAwQiwweDgwMTIsMHg4MDE4LC8qIDB4QzgtMHhDRiAqLworCTB4ODAxOSwweDgwMUMsMHg4MDIxLDB4ODAyOCwweDgwM0YsMHg4MDNCLDB4ODA0QSwweDgwNDYsLyogMHhEMC0weEQ3ICovCisJMHg4MDUyLDB4ODA1OCwweDgwNUEsMHg4MDVGLDB4ODA2MiwweDgwNjgsMHg4MDczLDB4ODA3MiwvKiAweEQ4LTB4REYgKi8KKwkweDgwNzAsMHg4MDc2LDB4ODA3OSwweDgwN0QsMHg4MDdGLDB4ODA4NCwweDgwODYsMHg4MDg1LC8qIDB4RTAtMHhFNyAqLworCTB4ODA5QiwweDgwOTMsMHg4MDlBLDB4ODBBRCwweDUxOTAsMHg4MEFDLDB4ODBEQiwweDgwRTUsLyogMHhFOC0weEVGICovCisJMHg4MEQ5LDB4ODBERCwweDgwQzQsMHg4MERBLDB4ODBENiwweDgxMDksMHg4MEVGLDB4ODBGMSwvKiAweEYwLTB4RjcgKi8KKwkweDgxMUIsMHg4MTI5LDB4ODEyMywweDgxMkYsMHg4MTRCLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0U0WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTY4QiwweDgxNDYsMHg4MTNFLDB4ODE1MywweDgxNTEsMHg4MEZDLDB4ODE3MSwweDgxNkUsLyogMHg0MC0weDQ3ICovCisJMHg4MTY1LDB4ODE2NiwweDgxNzQsMHg4MTgzLDB4ODE4OCwweDgxOEEsMHg4MTgwLDB4ODE4MiwvKiAweDQ4LTB4NEYgKi8KKwkweDgxQTAsMHg4MTk1LDB4ODFBNCwweDgxQTMsMHg4MTVGLDB4ODE5MywweDgxQTksMHg4MUIwLC8qIDB4NTAtMHg1NyAqLworCTB4ODFCNSwweDgxQkUsMHg4MUI4LDB4ODFCRCwweDgxQzAsMHg4MUMyLDB4ODFCQSwweDgxQzksLyogMHg1OC0weDVGICovCisJMHg4MUNELDB4ODFEMSwweDgxRDksMHg4MUQ4LDB4ODFDOCwweDgxREEsMHg4MURGLDB4ODFFMCwvKiAweDYwLTB4NjcgKi8KKwkweDgxRTcsMHg4MUZBLDB4ODFGQiwweDgxRkUsMHg4MjAxLDB4ODIwMiwweDgyMDUsMHg4MjA3LC8qIDB4NjgtMHg2RiAqLworCTB4ODIwQSwweDgyMEQsMHg4MjEwLDB4ODIxNiwweDgyMjksMHg4MjJCLDB4ODIzOCwweDgyMzMsLyogMHg3MC0weDc3ICovCisJMHg4MjQwLDB4ODI1OSwweDgyNTgsMHg4MjVELDB4ODI1QSwweDgyNUYsMHg4MjY0LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4ODI2MiwweDgyNjgsMHg4MjZBLDB4ODI2QiwweDgyMkUsMHg4MjcxLDB4ODI3NywweDgyNzgsLyogMHg4MC0weDg3ICovCisJMHg4MjdFLDB4ODI4RCwweDgyOTIsMHg4MkFCLDB4ODI5RiwweDgyQkIsMHg4MkFDLDB4ODJFMSwvKiAweDg4LTB4OEYgKi8KKwkweDgyRTMsMHg4MkRGLDB4ODJEMiwweDgyRjQsMHg4MkYzLDB4ODJGQSwweDgzOTMsMHg4MzAzLC8qIDB4OTAtMHg5NyAqLworCTB4ODJGQiwweDgyRjksMHg4MkRFLDB4ODMwNiwweDgyREMsMHg4MzA5LDB4ODJEOSwweDgzMzUsLyogMHg5OC0weDlGICovCisJMHg4MzM0LDB4ODMxNiwweDgzMzIsMHg4MzMxLDB4ODM0MCwweDgzMzksMHg4MzUwLDB4ODM0NSwvKiAweEEwLTB4QTcgKi8KKwkweDgzMkYsMHg4MzJCLDB4ODMxNywweDgzMTgsMHg4Mzg1LDB4ODM5QSwweDgzQUEsMHg4MzlGLC8qIDB4QTgtMHhBRiAqLworCTB4ODNBMiwweDgzOTYsMHg4MzIzLDB4ODM4RSwweDgzODcsMHg4MzhBLDB4ODM3QywweDgzQjUsLyogMHhCMC0weEI3ICovCisJMHg4MzczLDB4ODM3NSwweDgzQTAsMHg4Mzg5LDB4ODNBOCwweDgzRjQsMHg4NDEzLDB4ODNFQiwvKiAweEI4LTB4QkYgKi8KKwkweDgzQ0UsMHg4M0ZELDB4ODQwMywweDgzRDgsMHg4NDBCLDB4ODNDMSwweDgzRjcsMHg4NDA3LC8qIDB4QzAtMHhDNyAqLworCTB4ODNFMCwweDgzRjIsMHg4NDBELDB4ODQyMiwweDg0MjAsMHg4M0JELDB4ODQzOCwweDg1MDYsLyogMHhDOC0weENGICovCisJMHg4M0ZCLDB4ODQ2RCwweDg0MkEsMHg4NDNDLDB4ODU1QSwweDg0ODQsMHg4NDc3LDB4ODQ2QiwvKiAweEQwLTB4RDcgKi8KKwkweDg0QUQsMHg4NDZFLDB4ODQ4MiwweDg0NjksMHg4NDQ2LDB4ODQyQywweDg0NkYsMHg4NDc5LC8qIDB4RDgtMHhERiAqLworCTB4ODQzNSwweDg0Q0EsMHg4NDYyLDB4ODRCOSwweDg0QkYsMHg4NDlGLDB4ODREOSwweDg0Q0QsLyogMHhFMC0weEU3ICovCisJMHg4NEJCLDB4ODREQSwweDg0RDAsMHg4NEMxLDB4ODRDNiwweDg0RDYsMHg4NEExLDB4ODUyMSwvKiAweEU4LTB4RUYgKi8KKwkweDg0RkYsMHg4NEY0LDB4ODUxNywweDg1MTgsMHg4NTJDLDB4ODUxRiwweDg1MTUsMHg4NTE0LC8qIDB4RjAtMHhGNyAqLworCTB4ODRGQywweDg1NDAsMHg4NTYzLDB4ODU1OCwweDg1NDgsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4NTQxLDB4ODYwMiwweDg1NEIsMHg4NTU1LDB4ODU4MCwweDg1QTQsMHg4NTg4LDB4ODU5MSwvKiAweDQwLTB4NDcgKi8KKwkweDg1OEEsMHg4NUE4LDB4ODU2RCwweDg1OTQsMHg4NTlCLDB4ODVFQSwweDg1ODcsMHg4NTlDLC8qIDB4NDgtMHg0RiAqLworCTB4ODU3NywweDg1N0UsMHg4NTkwLDB4ODVDOSwweDg1QkEsMHg4NUNGLDB4ODVCOSwweDg1RDAsLyogMHg1MC0weDU3ICovCisJMHg4NUQ1LDB4ODVERCwweDg1RTUsMHg4NURDLDB4ODVGOSwweDg2MEEsMHg4NjEzLDB4ODYwQiwvKiAweDU4LTB4NUYgKi8KKwkweDg1RkUsMHg4NUZBLDB4ODYwNiwweDg2MjIsMHg4NjFBLDB4ODYzMCwweDg2M0YsMHg4NjRELC8qIDB4NjAtMHg2NyAqLworCTB4NEU1NSwweDg2NTQsMHg4NjVGLDB4ODY2NywweDg2NzEsMHg4NjkzLDB4ODZBMywweDg2QTksLyogMHg2OC0weDZGICovCisJMHg4NkFBLDB4ODY4QiwweDg2OEMsMHg4NkI2LDB4ODZBRiwweDg2QzQsMHg4NkM2LDB4ODZCMCwvKiAweDcwLTB4NzcgKi8KKwkweDg2QzksMHg4ODIzLDB4ODZBQiwweDg2RDQsMHg4NkRFLDB4ODZFOSwweDg2RUMsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4NkRGLDB4ODZEQiwweDg2RUYsMHg4NzEyLDB4ODcwNiwweDg3MDgsMHg4NzAwLDB4ODcwMywvKiAweDgwLTB4ODcgKi8KKwkweDg2RkIsMHg4NzExLDB4ODcwOSwweDg3MEQsMHg4NkY5LDB4ODcwQSwweDg3MzQsMHg4NzNGLC8qIDB4ODgtMHg4RiAqLworCTB4ODczNywweDg3M0IsMHg4NzI1LDB4ODcyOSwweDg3MUEsMHg4NzYwLDB4ODc1RiwweDg3NzgsLyogMHg5MC0weDk3ICovCisJMHg4NzRDLDB4ODc0RSwweDg3NzQsMHg4NzU3LDB4ODc2OCwweDg3NkUsMHg4NzU5LDB4ODc1MywvKiAweDk4LTB4OUYgKi8KKwkweDg3NjMsMHg4NzZBLDB4ODgwNSwweDg3QTIsMHg4NzlGLDB4ODc4MiwweDg3QUYsMHg4N0NCLC8qIDB4QTAtMHhBNyAqLworCTB4ODdCRCwweDg3QzAsMHg4N0QwLDB4OTZENiwweDg3QUIsMHg4N0M0LDB4ODdCMywweDg3QzcsLyogMHhBOC0weEFGICovCisJMHg4N0M2LDB4ODdCQiwweDg3RUYsMHg4N0YyLDB4ODdFMCwweDg4MEYsMHg4ODBELDB4ODdGRSwvKiAweEIwLTB4QjcgKi8KKwkweDg3RjYsMHg4N0Y3LDB4ODgwRSwweDg3RDIsMHg4ODExLDB4ODgxNiwweDg4MTUsMHg4ODIyLC8qIDB4QjgtMHhCRiAqLworCTB4ODgyMSwweDg4MzEsMHg4ODM2LDB4ODgzOSwweDg4MjcsMHg4ODNCLDB4ODg0NCwweDg4NDIsLyogMHhDMC0weEM3ICovCisJMHg4ODUyLDB4ODg1OSwweDg4NUUsMHg4ODYyLDB4ODg2QiwweDg4ODEsMHg4ODdFLDB4ODg5RSwvKiAweEM4LTB4Q0YgKi8KKwkweDg4NzUsMHg4ODdELDB4ODhCNSwweDg4NzIsMHg4ODgyLDB4ODg5NywweDg4OTIsMHg4OEFFLC8qIDB4RDAtMHhENyAqLworCTB4ODg5OSwweDg4QTIsMHg4ODhELDB4ODhBNCwweDg4QjAsMHg4OEJGLDB4ODhCMSwweDg4QzMsLyogMHhEOC0weERGICovCisJMHg4OEM0LDB4ODhENCwweDg4RDgsMHg4OEQ5LDB4ODhERCwweDg4RjksMHg4OTAyLDB4ODhGQywvKiAweEUwLTB4RTcgKi8KKwkweDg4RjQsMHg4OEU4LDB4ODhGMiwweDg5MDQsMHg4OTBDLDB4ODkwQSwweDg5MTMsMHg4OTQzLC8qIDB4RTgtMHhFRiAqLworCTB4ODkxRSwweDg5MjUsMHg4OTJBLDB4ODkyQiwweDg5NDEsMHg4OTQ0LDB4ODkzQiwweDg5MzYsLyogMHhGMC0weEY3ICovCisJMHg4OTM4LDB4ODk0QywweDg5MUQsMHg4OTYwLDB4ODk1RSwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FNlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDg5NjYsMHg4OTY0LDB4ODk2RCwweDg5NkEsMHg4OTZGLDB4ODk3NCwweDg5NzcsMHg4OTdFLC8qIDB4NDAtMHg0NyAqLworCTB4ODk4MywweDg5ODgsMHg4OThBLDB4ODk5MywweDg5OTgsMHg4OUExLDB4ODlBOSwweDg5QTYsLyogMHg0OC0weDRGICovCisJMHg4OUFDLDB4ODlBRiwweDg5QjIsMHg4OUJBLDB4ODlCRCwweDg5QkYsMHg4OUMwLDB4ODlEQSwvKiAweDUwLTB4NTcgKi8KKwkweDg5REMsMHg4OURELDB4ODlFNywweDg5RjQsMHg4OUY4LDB4OEEwMywweDhBMTYsMHg4QTEwLC8qIDB4NTgtMHg1RiAqLworCTB4OEEwQywweDhBMUIsMHg4QTFELDB4OEEyNSwweDhBMzYsMHg4QTQxLDB4OEE1QiwweDhBNTIsLyogMHg2MC0weDY3ICovCisJMHg4QTQ2LDB4OEE0OCwweDhBN0MsMHg4QTZELDB4OEE2QywweDhBNjIsMHg4QTg1LDB4OEE4MiwvKiAweDY4LTB4NkYgKi8KKwkweDhBODQsMHg4QUE4LDB4OEFBMSwweDhBOTEsMHg4QUE1LDB4OEFBNiwweDhBOUEsMHg4QUEzLC8qIDB4NzAtMHg3NyAqLworCTB4OEFDNCwweDhBQ0QsMHg4QUMyLDB4OEFEQSwweDhBRUIsMHg4QUYzLDB4OEFFNywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDhBRTQsMHg4QUYxLDB4OEIxNCwweDhBRTAsMHg4QUUyLDB4OEFGNywweDhBREUsMHg4QURCLC8qIDB4ODAtMHg4NyAqLworCTB4OEIwQywweDhCMDcsMHg4QjFBLDB4OEFFMSwweDhCMTYsMHg4QjEwLDB4OEIxNywweDhCMjAsLyogMHg4OC0weDhGICovCisJMHg4QjMzLDB4OTdBQiwweDhCMjYsMHg4QjJCLDB4OEIzRSwweDhCMjgsMHg4QjQxLDB4OEI0QywvKiAweDkwLTB4OTcgKi8KKwkweDhCNEYsMHg4QjRFLDB4OEI0OSwweDhCNTYsMHg4QjVCLDB4OEI1QSwweDhCNkIsMHg4QjVGLC8qIDB4OTgtMHg5RiAqLworCTB4OEI2QywweDhCNkYsMHg4Qjc0LDB4OEI3RCwweDhCODAsMHg4QjhDLDB4OEI4RSwweDhCOTIsLyogMHhBMC0weEE3ICovCisJMHg4QjkzLDB4OEI5NiwweDhCOTksMHg4QjlBLDB4OEMzQSwweDhDNDEsMHg4QzNGLDB4OEM0OCwvKiAweEE4LTB4QUYgKi8KKwkweDhDNEMsMHg4QzRFLDB4OEM1MCwweDhDNTUsMHg4QzYyLDB4OEM2QywweDhDNzgsMHg4QzdBLC8qIDB4QjAtMHhCNyAqLworCTB4OEM4MiwweDhDODksMHg4Qzg1LDB4OEM4QSwweDhDOEQsMHg4QzhFLDB4OEM5NCwweDhDN0MsLyogMHhCOC0weEJGICovCisJMHg4Qzk4LDB4NjIxRCwweDhDQUQsMHg4Q0FBLDB4OENCRCwweDhDQjIsMHg4Q0IzLDB4OENBRSwvKiAweEMwLTB4QzcgKi8KKwkweDhDQjYsMHg4Q0M4LDB4OENDMSwweDhDRTQsMHg4Q0UzLDB4OENEQSwweDhDRkQsMHg4Q0ZBLC8qIDB4QzgtMHhDRiAqLworCTB4OENGQiwweDhEMDQsMHg4RDA1LDB4OEQwQSwweDhEMDcsMHg4RDBGLDB4OEQwRCwweDhEMTAsLyogMHhEMC0weEQ3ICovCisJMHg5RjRFLDB4OEQxMywweDhDQ0QsMHg4RDE0LDB4OEQxNiwweDhENjcsMHg4RDZELDB4OEQ3MSwvKiAweEQ4LTB4REYgKi8KKwkweDhENzMsMHg4RDgxLDB4OEQ5OSwweDhEQzIsMHg4REJFLDB4OERCQSwweDhEQ0YsMHg4RERBLC8qIDB4RTAtMHhFNyAqLworCTB4OERENiwweDhEQ0MsMHg4RERCLDB4OERDQiwweDhERUEsMHg4REVCLDB4OERERiwweDhERTMsLyogMHhFOC0weEVGICovCisJMHg4REZDLDB4OEUwOCwweDhFMDksMHg4REZGLDB4OEUxRCwweDhFMUUsMHg4RTEwLDB4OEUxRiwvKiAweEYwLTB4RjcgKi8KKwkweDhFNDIsMHg4RTM1LDB4OEUzMCwweDhFMzQsMHg4RTRBLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0U3WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OEU0NywweDhFNDksMHg4RTRDLDB4OEU1MCwweDhFNDgsMHg4RTU5LDB4OEU2NCwweDhFNjAsLyogMHg0MC0weDQ3ICovCisJMHg4RTJBLDB4OEU2MywweDhFNTUsMHg4RTc2LDB4OEU3MiwweDhFN0MsMHg4RTgxLDB4OEU4NywvKiAweDQ4LTB4NEYgKi8KKwkweDhFODUsMHg4RTg0LDB4OEU4QiwweDhFOEEsMHg4RTkzLDB4OEU5MSwweDhFOTQsMHg4RTk5LC8qIDB4NTAtMHg1NyAqLworCTB4OEVBQSwweDhFQTEsMHg4RUFDLDB4OEVCMCwweDhFQzYsMHg4RUIxLDB4OEVCRSwweDhFQzUsLyogMHg1OC0weDVGICovCisJMHg4RUM4LDB4OEVDQiwweDhFREIsMHg4RUUzLDB4OEVGQywweDhFRkIsMHg4RUVCLDB4OEVGRSwvKiAweDYwLTB4NjcgKi8KKwkweDhGMEEsMHg4RjA1LDB4OEYxNSwweDhGMTIsMHg4RjE5LDB4OEYxMywweDhGMUMsMHg4RjFGLC8qIDB4NjgtMHg2RiAqLworCTB4OEYxQiwweDhGMEMsMHg4RjI2LDB4OEYzMywweDhGM0IsMHg4RjM5LDB4OEY0NSwweDhGNDIsLyogMHg3MC0weDc3ICovCisJMHg4RjNFLDB4OEY0QywweDhGNDksMHg4RjQ2LDB4OEY0RSwweDhGNTcsMHg4RjVDLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OEY2MiwweDhGNjMsMHg4RjY0LDB4OEY5QywweDhGOUYsMHg4RkEzLDB4OEZBRCwweDhGQUYsLyogMHg4MC0weDg3ICovCisJMHg4RkI3LDB4OEZEQSwweDhGRTUsMHg4RkUyLDB4OEZFQSwweDhGRUYsMHg5MDg3LDB4OEZGNCwvKiAweDg4LTB4OEYgKi8KKwkweDkwMDUsMHg4RkY5LDB4OEZGQSwweDkwMTEsMHg5MDE1LDB4OTAyMSwweDkwMEQsMHg5MDFFLC8qIDB4OTAtMHg5NyAqLworCTB4OTAxNiwweDkwMEIsMHg5MDI3LDB4OTAzNiwweDkwMzUsMHg5MDM5LDB4OEZGOCwweDkwNEYsLyogMHg5OC0weDlGICovCisJMHg5MDUwLDB4OTA1MSwweDkwNTIsMHg5MDBFLDB4OTA0OSwweDkwM0UsMHg5MDU2LDB4OTA1OCwvKiAweEEwLTB4QTcgKi8KKwkweDkwNUUsMHg5MDY4LDB4OTA2RiwweDkwNzYsMHg5NkE4LDB4OTA3MiwweDkwODIsMHg5MDdELC8qIDB4QTgtMHhBRiAqLworCTB4OTA4MSwweDkwODAsMHg5MDhBLDB4OTA4OSwweDkwOEYsMHg5MEE4LDB4OTBBRiwweDkwQjEsLyogMHhCMC0weEI3ICovCisJMHg5MEI1LDB4OTBFMiwweDkwRTQsMHg2MjQ4LDB4OTBEQiwweDkxMDIsMHg5MTEyLDB4OTExOSwvKiAweEI4LTB4QkYgKi8KKwkweDkxMzIsMHg5MTMwLDB4OTE0QSwweDkxNTYsMHg5MTU4LDB4OTE2MywweDkxNjUsMHg5MTY5LC8qIDB4QzAtMHhDNyAqLworCTB4OTE3MywweDkxNzIsMHg5MThCLDB4OTE4OSwweDkxODIsMHg5MUEyLDB4OTFBQiwweDkxQUYsLyogMHhDOC0weENGICovCisJMHg5MUFBLDB4OTFCNSwweDkxQjQsMHg5MUJBLDB4OTFDMCwweDkxQzEsMHg5MUM5LDB4OTFDQiwvKiAweEQwLTB4RDcgKi8KKwkweDkxRDAsMHg5MUQ2LDB4OTFERiwweDkxRTEsMHg5MURCLDB4OTFGQywweDkxRjUsMHg5MUY2LC8qIDB4RDgtMHhERiAqLworCTB4OTIxRSwweDkxRkYsMHg5MjE0LDB4OTIyQywweDkyMTUsMHg5MjExLDB4OTI1RSwweDkyNTcsLyogMHhFMC0weEU3ICovCisJMHg5MjQ1LDB4OTI0OSwweDkyNjQsMHg5MjQ4LDB4OTI5NSwweDkyM0YsMHg5MjRCLDB4OTI1MCwvKiAweEU4LTB4RUYgKi8KKwkweDkyOUMsMHg5Mjk2LDB4OTI5MywweDkyOUIsMHg5MjVBLDB4OTJDRiwweDkyQjksMHg5MkI3LC8qIDB4RjAtMHhGNyAqLworCTB4OTJFOSwweDkzMEYsMHg5MkZBLDB4OTM0NCwweDkzMkUsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRThbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5MzE5LDB4OTMyMiwweDkzMUEsMHg5MzIzLDB4OTMzQSwweDkzMzUsMHg5MzNCLDB4OTM1QywvKiAweDQwLTB4NDcgKi8KKwkweDkzNjAsMHg5MzdDLDB4OTM2RSwweDkzNTYsMHg5M0IwLDB4OTNBQywweDkzQUQsMHg5Mzk0LC8qIDB4NDgtMHg0RiAqLworCTB4OTNCOSwweDkzRDYsMHg5M0Q3LDB4OTNFOCwweDkzRTUsMHg5M0Q4LDB4OTNDMywweDkzREQsLyogMHg1MC0weDU3ICovCisJMHg5M0QwLDB4OTNDOCwweDkzRTQsMHg5NDFBLDB4OTQxNCwweDk0MTMsMHg5NDAzLDB4OTQwNywvKiAweDU4LTB4NUYgKi8KKwkweDk0MTAsMHg5NDM2LDB4OTQyQiwweDk0MzUsMHg5NDIxLDB4OTQzQSwweDk0NDEsMHg5NDUyLC8qIDB4NjAtMHg2NyAqLworCTB4OTQ0NCwweDk0NUIsMHg5NDYwLDB4OTQ2MiwweDk0NUUsMHg5NDZBLDB4OTIyOSwweDk0NzAsLyogMHg2OC0weDZGICovCisJMHg5NDc1LDB4OTQ3NywweDk0N0QsMHg5NDVBLDB4OTQ3QywweDk0N0UsMHg5NDgxLDB4OTQ3RiwvKiAweDcwLTB4NzcgKi8KKwkweDk1ODIsMHg5NTg3LDB4OTU4QSwweDk1OTQsMHg5NTk2LDB4OTU5OCwweDk1OTksMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5NUEwLDB4OTVBOCwweDk1QTcsMHg5NUFELDB4OTVCQywweDk1QkIsMHg5NUI5LDB4OTVCRSwvKiAweDgwLTB4ODcgKi8KKwkweDk1Q0EsMHg2RkY2LDB4OTVDMywweDk1Q0QsMHg5NUNDLDB4OTVENSwweDk1RDQsMHg5NUQ2LC8qIDB4ODgtMHg4RiAqLworCTB4OTVEQywweDk1RTEsMHg5NUU1LDB4OTVFMiwweDk2MjEsMHg5NjI4LDB4OTYyRSwweDk2MkYsLyogMHg5MC0weDk3ICovCisJMHg5NjQyLDB4OTY0QywweDk2NEYsMHg5NjRCLDB4OTY3NywweDk2NUMsMHg5NjVFLDB4OTY1RCwvKiAweDk4LTB4OUYgKi8KKwkweDk2NUYsMHg5NjY2LDB4OTY3MiwweDk2NkMsMHg5NjhELDB4OTY5OCwweDk2OTUsMHg5Njk3LC8qIDB4QTAtMHhBNyAqLworCTB4OTZBQSwweDk2QTcsMHg5NkIxLDB4OTZCMiwweDk2QjAsMHg5NkI0LDB4OTZCNiwweDk2QjgsLyogMHhBOC0weEFGICovCisJMHg5NkI5LDB4OTZDRSwweDk2Q0IsMHg5NkM5LDB4OTZDRCwweDg5NEQsMHg5NkRDLDB4OTcwRCwvKiAweEIwLTB4QjcgKi8KKwkweDk2RDUsMHg5NkY5LDB4OTcwNCwweDk3MDYsMHg5NzA4LDB4OTcxMywweDk3MEUsMHg5NzExLC8qIDB4QjgtMHhCRiAqLworCTB4OTcwRiwweDk3MTYsMHg5NzE5LDB4OTcyNCwweDk3MkEsMHg5NzMwLDB4OTczOSwweDk3M0QsLyogMHhDMC0weEM3ICovCisJMHg5NzNFLDB4OTc0NCwweDk3NDYsMHg5NzQ4LDB4OTc0MiwweDk3NDksMHg5NzVDLDB4OTc2MCwvKiAweEM4LTB4Q0YgKi8KKwkweDk3NjQsMHg5NzY2LDB4OTc2OCwweDUyRDIsMHg5NzZCLDB4OTc3MSwweDk3NzksMHg5Nzg1LC8qIDB4RDAtMHhENyAqLworCTB4OTc3QywweDk3ODEsMHg5NzdBLDB4OTc4NiwweDk3OEIsMHg5NzhGLDB4OTc5MCwweDk3OUMsLyogMHhEOC0weERGICovCisJMHg5N0E4LDB4OTdBNiwweDk3QTMsMHg5N0IzLDB4OTdCNCwweDk3QzMsMHg5N0M2LDB4OTdDOCwvKiAweEUwLTB4RTcgKi8KKwkweDk3Q0IsMHg5N0RDLDB4OTdFRCwweDlGNEYsMHg5N0YyLDB4N0FERiwweDk3RjYsMHg5N0Y1LC8qIDB4RTgtMHhFRiAqLworCTB4OTgwRiwweDk4MEMsMHg5ODM4LDB4OTgyNCwweDk4MjEsMHg5ODM3LDB4OTgzRCwweDk4NDYsLyogMHhGMC0weEY3ICovCisJMHg5ODRGLDB4OTg0QiwweDk4NkIsMHg5ODZGLDB4OTg3MCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FOVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDk4NzEsMHg5ODc0LDB4OTg3MywweDk4QUEsMHg5OEFGLDB4OThCMSwweDk4QjYsMHg5OEM0LC8qIDB4NDAtMHg0NyAqLworCTB4OThDMywweDk4QzYsMHg5OEU5LDB4OThFQiwweDk5MDMsMHg5OTA5LDB4OTkxMiwweDk5MTQsLyogMHg0OC0weDRGICovCisJMHg5OTE4LDB4OTkyMSwweDk5MUQsMHg5OTFFLDB4OTkyNCwweDk5MjAsMHg5OTJDLDB4OTkyRSwvKiAweDUwLTB4NTcgKi8KKwkweDk5M0QsMHg5OTNFLDB4OTk0MiwweDk5NDksMHg5OTQ1LDB4OTk1MCwweDk5NEIsMHg5OTUxLC8qIDB4NTgtMHg1RiAqLworCTB4OTk1MiwweDk5NEMsMHg5OTU1LDB4OTk5NywweDk5OTgsMHg5OUE1LDB4OTlBRCwweDk5QUUsLyogMHg2MC0weDY3ICovCisJMHg5OUJDLDB4OTlERiwweDk5REIsMHg5OURELDB4OTlEOCwweDk5RDEsMHg5OUVELDB4OTlFRSwvKiAweDY4LTB4NkYgKi8KKwkweDk5RjEsMHg5OUYyLDB4OTlGQiwweDk5RjgsMHg5QTAxLDB4OUEwRiwweDlBMDUsMHg5OUUyLC8qIDB4NzAtMHg3NyAqLworCTB4OUExOSwweDlBMkIsMHg5QTM3LDB4OUE0NSwweDlBNDIsMHg5QTQwLDB4OUE0MywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDlBM0UsMHg5QTU1LDB4OUE0RCwweDlBNUIsMHg5QTU3LDB4OUE1RiwweDlBNjIsMHg5QTY1LC8qIDB4ODAtMHg4NyAqLworCTB4OUE2NCwweDlBNjksMHg5QTZCLDB4OUE2QSwweDlBQUQsMHg5QUIwLDB4OUFCQywweDlBQzAsLyogMHg4OC0weDhGICovCisJMHg5QUNGLDB4OUFEMSwweDlBRDMsMHg5QUQ0LDB4OUFERSwweDlBREYsMHg5QUUyLDB4OUFFMywvKiAweDkwLTB4OTcgKi8KKwkweDlBRTYsMHg5QUVGLDB4OUFFQiwweDlBRUUsMHg5QUY0LDB4OUFGMSwweDlBRjcsMHg5QUZCLC8qIDB4OTgtMHg5RiAqLworCTB4OUIwNiwweDlCMTgsMHg5QjFBLDB4OUIxRiwweDlCMjIsMHg5QjIzLDB4OUIyNSwweDlCMjcsLyogMHhBMC0weEE3ICovCisJMHg5QjI4LDB4OUIyOSwweDlCMkEsMHg5QjJFLDB4OUIyRiwweDlCMzIsMHg5QjQ0LDB4OUI0MywvKiAweEE4LTB4QUYgKi8KKwkweDlCNEYsMHg5QjRELDB4OUI0RSwweDlCNTEsMHg5QjU4LDB4OUI3NCwweDlCOTMsMHg5QjgzLC8qIDB4QjAtMHhCNyAqLworCTB4OUI5MSwweDlCOTYsMHg5Qjk3LDB4OUI5RiwweDlCQTAsMHg5QkE4LDB4OUJCNCwweDlCQzAsLyogMHhCOC0weEJGICovCisJMHg5QkNBLDB4OUJCOSwweDlCQzYsMHg5QkNGLDB4OUJEMSwweDlCRDIsMHg5QkUzLDB4OUJFMiwvKiAweEMwLTB4QzcgKi8KKwkweDlCRTQsMHg5QkQ0LDB4OUJFMSwweDlDM0EsMHg5QkYyLDB4OUJGMSwweDlCRjAsMHg5QzE1LC8qIDB4QzgtMHhDRiAqLworCTB4OUMxNCwweDlDMDksMHg5QzEzLDB4OUMwQywweDlDMDYsMHg5QzA4LDB4OUMxMiwweDlDMEEsLyogMHhEMC0weEQ3ICovCisJMHg5QzA0LDB4OUMyRSwweDlDMUIsMHg5QzI1LDB4OUMyNCwweDlDMjEsMHg5QzMwLDB4OUM0NywvKiAweEQ4LTB4REYgKi8KKwkweDlDMzIsMHg5QzQ2LDB4OUMzRSwweDlDNUEsMHg5QzYwLDB4OUM2NywweDlDNzYsMHg5Qzc4LC8qIDB4RTAtMHhFNyAqLworCTB4OUNFNywweDlDRUMsMHg5Q0YwLDB4OUQwOSwweDlEMDgsMHg5Q0VCLDB4OUQwMywweDlEMDYsLyogMHhFOC0weEVGICovCisJMHg5RDJBLDB4OUQyNiwweDlEQUYsMHg5RDIzLDB4OUQxRiwweDlENDQsMHg5RDE1LDB4OUQxMiwvKiAweEYwLTB4RjcgKi8KKwkweDlENDEsMHg5RDNGLDB4OUQzRSwweDlENDYsMHg5RDQ4LDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0VBWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OUQ1RCwweDlENUUsMHg5RDY0LDB4OUQ1MSwweDlENTAsMHg5RDU5LDB4OUQ3MiwweDlEODksLyogMHg0MC0weDQ3ICovCisJMHg5RDg3LDB4OURBQiwweDlENkYsMHg5RDdBLDB4OUQ5QSwweDlEQTQsMHg5REE5LDB4OURCMiwvKiAweDQ4LTB4NEYgKi8KKwkweDlEQzQsMHg5REMxLDB4OURCQiwweDlEQjgsMHg5REJBLDB4OURDNiwweDlEQ0YsMHg5REMyLC8qIDB4NTAtMHg1NyAqLworCTB4OUREOSwweDlERDMsMHg5REY4LDB4OURFNiwweDlERUQsMHg5REVGLDB4OURGRCwweDlFMUEsLyogMHg1OC0weDVGICovCisJMHg5RTFCLDB4OUUxRSwweDlFNzUsMHg5RTc5LDB4OUU3RCwweDlFODEsMHg5RTg4LDB4OUU4QiwvKiAweDYwLTB4NjcgKi8KKwkweDlFOEMsMHg5RTkyLDB4OUU5NSwweDlFOTEsMHg5RTlELDB4OUVBNSwweDlFQTksMHg5RUI4LC8qIDB4NjgtMHg2RiAqLworCTB4OUVBQSwweDlFQUQsMHg5NzYxLDB4OUVDQywweDlFQ0UsMHg5RUNGLDB4OUVEMCwweDlFRDQsLyogMHg3MC0weDc3ICovCisJMHg5RURDLDB4OUVERSwweDlFREQsMHg5RUUwLDB4OUVFNSwweDlFRTgsMHg5RUVGLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OUVGNCwweDlFRjYsMHg5RUY3LDB4OUVGOSwweDlFRkIsMHg5RUZDLDB4OUVGRCwweDlGMDcsLyogMHg4MC0weDg3ICovCisJMHg5RjA4LDB4NzZCNywweDlGMTUsMHg5RjIxLDB4OUYyQywweDlGM0UsMHg5RjRBLDB4OUY1MiwvKiAweDg4LTB4OEYgKi8KKwkweDlGNTQsMHg5RjYzLDB4OUY1RiwweDlGNjAsMHg5RjYxLDB4OUY2NiwweDlGNjcsMHg5RjZDLC8qIDB4OTAtMHg5NyAqLworCTB4OUY2QSwweDlGNzcsMHg5RjcyLDB4OUY3NiwweDlGOTUsMHg5RjlDLDB4OUZBMCwweDU4MkYsLyogMHg5OC0weDlGICovCisJMHg2OUM3LDB4OTA1OSwweDc0NjQsMHg1MURDLDB4NzE5OSwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEEwLTB4QTcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FRFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDdFOEEsMHg4OTFDLDB4OTM0OCwweDkyODgsMHg4NERDLDB4NEZDOSwweDcwQkIsMHg2NjMxLC8qIDB4NDAtMHg0NyAqLworCTB4NjhDOCwweDkyRjksMHg2NkZCLDB4NUY0NSwweDRFMjgsMHg0RUUxLDB4NEVGQywweDRGMDAsLyogMHg0OC0weDRGICovCisJMHg0RjAzLDB4NEYzOSwweDRGNTYsMHg0RjkyLDB4NEY4QSwweDRGOUEsMHg0Rjk0LDB4NEZDRCwvKiAweDUwLTB4NTcgKi8KKwkweDUwNDAsMHg1MDIyLDB4NEZGRiwweDUwMUUsMHg1MDQ2LDB4NTA3MCwweDUwNDIsMHg1MDk0LC8qIDB4NTgtMHg1RiAqLworCTB4NTBGNCwweDUwRDgsMHg1MTRBLDB4NTE2NCwweDUxOUQsMHg1MUJFLDB4NTFFQywweDUyMTUsLyogMHg2MC0weDY3ICovCisJMHg1MjlDLDB4NTJBNiwweDUyQzAsMHg1MkRCLDB4NTMwMCwweDUzMDcsMHg1MzI0LDB4NTM3MiwvKiAweDY4LTB4NkYgKi8KKwkweDUzOTMsMHg1M0IyLDB4NTNERCwweEZBMEUsMHg1NDlDLDB4NTQ4QSwweDU0QTksMHg1NEZGLC8qIDB4NzAtMHg3NyAqLworCTB4NTU4NiwweDU3NTksMHg1NzY1LDB4NTdBQywweDU3QzgsMHg1N0M3LDB4RkEwRiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweEZBMTAsMHg1ODlFLDB4NThCMiwweDU5MEIsMHg1OTUzLDB4NTk1QiwweDU5NUQsMHg1OTYzLC8qIDB4ODAtMHg4NyAqLworCTB4NTlBNCwweDU5QkEsMHg1QjU2LDB4NUJDMCwweDc1MkYsMHg1QkQ4LDB4NUJFQywweDVDMUUsLyogMHg4OC0weDhGICovCisJMHg1Q0E2LDB4NUNCQSwweDVDRjUsMHg1RDI3LDB4NUQ1MywweEZBMTEsMHg1RDQyLDB4NUQ2RCwvKiAweDkwLTB4OTcgKi8KKwkweDVEQjgsMHg1REI5LDB4NUREMCwweDVGMjEsMHg1RjM0LDB4NUY2NywweDVGQjcsMHg1RkRFLC8qIDB4OTgtMHg5RiAqLworCTB4NjA1RCwweDYwODUsMHg2MDhBLDB4NjBERSwweDYwRDUsMHg2MTIwLDB4NjBGMiwweDYxMTEsLyogMHhBMC0weEE3ICovCisJMHg2MTM3LDB4NjEzMCwweDYxOTgsMHg2MjEzLDB4NjJBNiwweDYzRjUsMHg2NDYwLDB4NjQ5RCwvKiAweEE4LTB4QUYgKi8KKwkweDY0Q0UsMHg2NTRFLDB4NjYwMCwweDY2MTUsMHg2NjNCLDB4NjYwOSwweDY2MkUsMHg2NjFFLC8qIDB4QjAtMHhCNyAqLworCTB4NjYyNCwweDY2NjUsMHg2NjU3LDB4NjY1OSwweEZBMTIsMHg2NjczLDB4NjY5OSwweDY2QTAsLyogMHhCOC0weEJGICovCisJMHg2NkIyLDB4NjZCRiwweDY2RkEsMHg2NzBFLDB4RjkyOSwweDY3NjYsMHg2N0JCLDB4Njg1MiwvKiAweEMwLTB4QzcgKi8KKwkweDY3QzAsMHg2ODAxLDB4Njg0NCwweDY4Q0YsMHhGQTEzLDB4Njk2OCwweEZBMTQsMHg2OTk4LC8qIDB4QzgtMHhDRiAqLworCTB4NjlFMiwweDZBMzAsMHg2QTZCLDB4NkE0NiwweDZBNzMsMHg2QTdFLDB4NkFFMiwweDZBRTQsLyogMHhEMC0weEQ3ICovCisJMHg2QkQ2LDB4NkMzRiwweDZDNUMsMHg2Qzg2LDB4NkM2RiwweDZDREEsMHg2RDA0LDB4NkQ4NywvKiAweEQ4LTB4REYgKi8KKwkweDZENkYsMHg2RDk2LDB4NkRBQywweDZEQ0YsMHg2REY4LDB4NkRGMiwweDZERkMsMHg2RTM5LC8qIDB4RTAtMHhFNyAqLworCTB4NkU1QywweDZFMjcsMHg2RTNDLDB4NkVCRiwweDZGODgsMHg2RkI1LDB4NkZGNSwweDcwMDUsLyogMHhFOC0weEVGICovCisJMHg3MDA3LDB4NzAyOCwweDcwODUsMHg3MEFCLDB4NzEwRiwweDcxMDQsMHg3MTVDLDB4NzE0NiwvKiAweEYwLTB4RjcgKi8KKwkweDcxNDcsMHhGQTE1LDB4NzFDMSwweDcxRkUsMHg3MkIxLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0VFWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NzJCRSwweDczMjQsMHhGQTE2LDB4NzM3NywweDczQkQsMHg3M0M5LDB4NzNENiwweDczRTMsLyogMHg0MC0weDQ3ICovCisJMHg3M0QyLDB4NzQwNywweDczRjUsMHg3NDI2LDB4NzQyQSwweDc0MjksMHg3NDJFLDB4NzQ2MiwvKiAweDQ4LTB4NEYgKi8KKwkweDc0ODksMHg3NDlGLDB4NzUwMSwweDc1NkYsMHg3NjgyLDB4NzY5QywweDc2OUUsMHg3NjlCLC8qIDB4NTAtMHg1NyAqLworCTB4NzZBNiwweEZBMTcsMHg3NzQ2LDB4NTJBRiwweDc4MjEsMHg3ODRFLDB4Nzg2NCwweDc4N0EsLyogMHg1OC0weDVGICovCisJMHg3OTMwLDB4RkExOCwweEZBMTksMHhGQTFBLDB4Nzk5NCwweEZBMUIsMHg3OTlCLDB4N0FEMSwvKiAweDYwLTB4NjcgKi8KKwkweDdBRTcsMHhGQTFDLDB4N0FFQiwweDdCOUUsMHhGQTFELDB4N0Q0OCwweDdENUMsMHg3REI3LC8qIDB4NjgtMHg2RiAqLworCTB4N0RBMCwweDdERDYsMHg3RTUyLDB4N0Y0NywweDdGQTEsMHhGQTFFLDB4ODMwMSwweDgzNjIsLyogMHg3MC0weDc3ICovCisJMHg4MzdGLDB4ODNDNywweDgzRjYsMHg4NDQ4LDB4ODRCNCwweDg1NTMsMHg4NTU5LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4ODU2QiwweEZBMUYsMHg4NUIwLDB4RkEyMCwweEZBMjEsMHg4ODA3LDB4ODhGNSwweDhBMTIsLyogMHg4MC0weDg3ICovCisJMHg4QTM3LDB4OEE3OSwweDhBQTcsMHg4QUJFLDB4OEFERiwweEZBMjIsMHg4QUY2LDB4OEI1MywvKiAweDg4LTB4OEYgKi8KKwkweDhCN0YsMHg4Q0YwLDB4OENGNCwweDhEMTIsMHg4RDc2LDB4RkEyMywweDhFQ0YsMHhGQTI0LC8qIDB4OTAtMHg5NyAqLworCTB4RkEyNSwweDkwNjcsMHg5MERFLDB4RkEyNiwweDkxMTUsMHg5MTI3LDB4OTFEQSwweDkxRDcsLyogMHg5OC0weDlGICovCisJMHg5MURFLDB4OTFFRCwweDkxRUUsMHg5MUU0LDB4OTFFNSwweDkyMDYsMHg5MjEwLDB4OTIwQSwvKiAweEEwLTB4QTcgKi8KKwkweDkyM0EsMHg5MjQwLDB4OTIzQywweDkyNEUsMHg5MjU5LDB4OTI1MSwweDkyMzksMHg5MjY3LC8qIDB4QTgtMHhBRiAqLworCTB4OTJBNywweDkyNzcsMHg5Mjc4LDB4OTJFNywweDkyRDcsMHg5MkQ5LDB4OTJEMCwweEZBMjcsLyogMHhCMC0weEI3ICovCisJMHg5MkQ1LDB4OTJFMCwweDkyRDMsMHg5MzI1LDB4OTMyMSwweDkyRkIsMHhGQTI4LDB4OTMxRSwvKiAweEI4LTB4QkYgKi8KKwkweDkyRkYsMHg5MzFELDB4OTMwMiwweDkzNzAsMHg5MzU3LDB4OTNBNCwweDkzQzYsMHg5M0RFLC8qIDB4QzAtMHhDNyAqLworCTB4OTNGOCwweDk0MzEsMHg5NDQ1LDB4OTQ0OCwweDk1OTIsMHhGOURDLDB4RkEyOSwweDk2OUQsLyogMHhDOC0weENGICovCisJMHg5NkFGLDB4OTczMywweDk3M0IsMHg5NzQzLDB4OTc0RCwweDk3NEYsMHg5NzUxLDB4OTc1NSwvKiAweEQwLTB4RDcgKi8KKwkweDk4NTcsMHg5ODY1LDB4RkEyQSwweEZBMkIsMHg5OTI3LDB4RkEyQywweDk5OUUsMHg5QTRFLC8qIDB4RDgtMHhERiAqLworCTB4OUFEOSwweDlBREMsMHg5Qjc1LDB4OUI3MiwweDlCOEYsMHg5QkIxLDB4OUJCQiwweDlDMDAsLyogMHhFMC0weEU3ICovCisJMHg5RDcwLDB4OUQ2QiwweEZBMkQsMHg5RTE5LDB4OUVEMSwweDAwMDAsMHgwMDAwLDB4MjE3MCwvKiAweEU4LTB4RUYgKi8KKwkweDIxNzEsMHgyMTcyLDB4MjE3MywweDIxNzQsMHgyMTc1LDB4MjE3NiwweDIxNzcsMHgyMTc4LC8qIDB4RjAtMHhGNyAqLworCTB4MjE3OSwweEZGRTIsMHhGRkU0LDB4RkYwNywweEZGMDIsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRkFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgyMTcwLDB4MjE3MSwweDIxNzIsMHgyMTczLDB4MjE3NCwweDIxNzUsMHgyMTc2LDB4MjE3NywvKiAweDQwLTB4NDcgKi8KKwkweDIxNzgsMHgyMTc5LDB4MjE2MCwweDIxNjEsMHgyMTYyLDB4MjE2MywweDIxNjQsMHgyMTY1LC8qIDB4NDgtMHg0RiAqLworCTB4MjE2NiwweDIxNjcsMHgyMTY4LDB4MjE2OSwweEZGRTIsMHhGRkU0LDB4RkYwNywweEZGMDIsLyogMHg1MC0weDU3ICovCisJMHgzMjMxLDB4MjExNiwweDIxMjEsMHgyMjM1LDB4N0U4QSwweDg5MUMsMHg5MzQ4LDB4OTI4OCwvKiAweDU4LTB4NUYgKi8KKwkweDg0REMsMHg0RkM5LDB4NzBCQiwweDY2MzEsMHg2OEM4LDB4OTJGOSwweDY2RkIsMHg1RjQ1LC8qIDB4NjAtMHg2NyAqLworCTB4NEUyOCwweDRFRTEsMHg0RUZDLDB4NEYwMCwweDRGMDMsMHg0RjM5LDB4NEY1NiwweDRGOTIsLyogMHg2OC0weDZGICovCisJMHg0RjhBLDB4NEY5QSwweDRGOTQsMHg0RkNELDB4NTA0MCwweDUwMjIsMHg0RkZGLDB4NTAxRSwvKiAweDcwLTB4NzcgKi8KKwkweDUwNDYsMHg1MDcwLDB4NTA0MiwweDUwOTQsMHg1MEY0LDB4NTBEOCwweDUxNEEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg1MTY0LDB4NTE5RCwweDUxQkUsMHg1MUVDLDB4NTIxNSwweDUyOUMsMHg1MkE2LDB4NTJDMCwvKiAweDgwLTB4ODcgKi8KKwkweDUyREIsMHg1MzAwLDB4NTMwNywweDUzMjQsMHg1MzcyLDB4NTM5MywweDUzQjIsMHg1M0RELC8qIDB4ODgtMHg4RiAqLworCTB4RkEwRSwweDU0OUMsMHg1NDhBLDB4NTRBOSwweDU0RkYsMHg1NTg2LDB4NTc1OSwweDU3NjUsLyogMHg5MC0weDk3ICovCisJMHg1N0FDLDB4NTdDOCwweDU3QzcsMHhGQTBGLDB4RkExMCwweDU4OUUsMHg1OEIyLDB4NTkwQiwvKiAweDk4LTB4OUYgKi8KKwkweDU5NTMsMHg1OTVCLDB4NTk1RCwweDU5NjMsMHg1OUE0LDB4NTlCQSwweDVCNTYsMHg1QkMwLC8qIDB4QTAtMHhBNyAqLworCTB4NzUyRiwweDVCRDgsMHg1QkVDLDB4NUMxRSwweDVDQTYsMHg1Q0JBLDB4NUNGNSwweDVEMjcsLyogMHhBOC0weEFGICovCisJMHg1RDUzLDB4RkExMSwweDVENDIsMHg1RDZELDB4NURCOCwweDVEQjksMHg1REQwLDB4NUYyMSwvKiAweEIwLTB4QjcgKi8KKwkweDVGMzQsMHg1RjY3LDB4NUZCNywweDVGREUsMHg2MDVELDB4NjA4NSwweDYwOEEsMHg2MERFLC8qIDB4QjgtMHhCRiAqLworCTB4NjBENSwweDYxMjAsMHg2MEYyLDB4NjExMSwweDYxMzcsMHg2MTMwLDB4NjE5OCwweDYyMTMsLyogMHhDMC0weEM3ICovCisJMHg2MkE2LDB4NjNGNSwweDY0NjAsMHg2NDlELDB4NjRDRSwweDY1NEUsMHg2NjAwLDB4NjYxNSwvKiAweEM4LTB4Q0YgKi8KKwkweDY2M0IsMHg2NjA5LDB4NjYyRSwweDY2MUUsMHg2NjI0LDB4NjY2NSwweDY2NTcsMHg2NjU5LC8qIDB4RDAtMHhENyAqLworCTB4RkExMiwweDY2NzMsMHg2Njk5LDB4NjZBMCwweDY2QjIsMHg2NkJGLDB4NjZGQSwweDY3MEUsLyogMHhEOC0weERGICovCisJMHhGOTI5LDB4Njc2NiwweDY3QkIsMHg2ODUyLDB4NjdDMCwweDY4MDEsMHg2ODQ0LDB4NjhDRiwvKiAweEUwLTB4RTcgKi8KKwkweEZBMTMsMHg2OTY4LDB4RkExNCwweDY5OTgsMHg2OUUyLDB4NkEzMCwweDZBNkIsMHg2QTQ2LC8qIDB4RTgtMHhFRiAqLworCTB4NkE3MywweDZBN0UsMHg2QUUyLDB4NkFFNCwweDZCRDYsMHg2QzNGLDB4NkM1QywweDZDODYsLyogMHhGMC0weEY3ICovCisJMHg2QzZGLDB4NkNEQSwweDZEMDQsMHg2RDg3LDB4NkQ2RiwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GQlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDZEOTYsMHg2REFDLDB4NkRDRiwweDZERjgsMHg2REYyLDB4NkRGQywweDZFMzksMHg2RTVDLC8qIDB4NDAtMHg0NyAqLworCTB4NkUyNywweDZFM0MsMHg2RUJGLDB4NkY4OCwweDZGQjUsMHg2RkY1LDB4NzAwNSwweDcwMDcsLyogMHg0OC0weDRGICovCisJMHg3MDI4LDB4NzA4NSwweDcwQUIsMHg3MTBGLDB4NzEwNCwweDcxNUMsMHg3MTQ2LDB4NzE0NywvKiAweDUwLTB4NTcgKi8KKwkweEZBMTUsMHg3MUMxLDB4NzFGRSwweDcyQjEsMHg3MkJFLDB4NzMyNCwweEZBMTYsMHg3Mzc3LC8qIDB4NTgtMHg1RiAqLworCTB4NzNCRCwweDczQzksMHg3M0Q2LDB4NzNFMywweDczRDIsMHg3NDA3LDB4NzNGNSwweDc0MjYsLyogMHg2MC0weDY3ICovCisJMHg3NDJBLDB4NzQyOSwweDc0MkUsMHg3NDYyLDB4NzQ4OSwweDc0OUYsMHg3NTAxLDB4NzU2RiwvKiAweDY4LTB4NkYgKi8KKwkweDc2ODIsMHg3NjlDLDB4NzY5RSwweDc2OUIsMHg3NkE2LDB4RkExNywweDc3NDYsMHg1MkFGLC8qIDB4NzAtMHg3NyAqLworCTB4NzgyMSwweDc4NEUsMHg3ODY0LDB4Nzg3QSwweDc5MzAsMHhGQTE4LDB4RkExOSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweEZBMUEsMHg3OTk0LDB4RkExQiwweDc5OUIsMHg3QUQxLDB4N0FFNywweEZBMUMsMHg3QUVCLC8qIDB4ODAtMHg4NyAqLworCTB4N0I5RSwweEZBMUQsMHg3RDQ4LDB4N0Q1QywweDdEQjcsMHg3REEwLDB4N0RENiwweDdFNTIsLyogMHg4OC0weDhGICovCisJMHg3RjQ3LDB4N0ZBMSwweEZBMUUsMHg4MzAxLDB4ODM2MiwweDgzN0YsMHg4M0M3LDB4ODNGNiwvKiAweDkwLTB4OTcgKi8KKwkweDg0NDgsMHg4NEI0LDB4ODU1MywweDg1NTksMHg4NTZCLDB4RkExRiwweDg1QjAsMHhGQTIwLC8qIDB4OTgtMHg5RiAqLworCTB4RkEyMSwweDg4MDcsMHg4OEY1LDB4OEExMiwweDhBMzcsMHg4QTc5LDB4OEFBNywweDhBQkUsLyogMHhBMC0weEE3ICovCisJMHg4QURGLDB4RkEyMiwweDhBRjYsMHg4QjUzLDB4OEI3RiwweDhDRjAsMHg4Q0Y0LDB4OEQxMiwvKiAweEE4LTB4QUYgKi8KKwkweDhENzYsMHhGQTIzLDB4OEVDRiwweEZBMjQsMHhGQTI1LDB4OTA2NywweDkwREUsMHhGQTI2LC8qIDB4QjAtMHhCNyAqLworCTB4OTExNSwweDkxMjcsMHg5MURBLDB4OTFENywweDkxREUsMHg5MUVELDB4OTFFRSwweDkxRTQsLyogMHhCOC0weEJGICovCisJMHg5MUU1LDB4OTIwNiwweDkyMTAsMHg5MjBBLDB4OTIzQSwweDkyNDAsMHg5MjNDLDB4OTI0RSwvKiAweEMwLTB4QzcgKi8KKwkweDkyNTksMHg5MjUxLDB4OTIzOSwweDkyNjcsMHg5MkE3LDB4OTI3NywweDkyNzgsMHg5MkU3LC8qIDB4QzgtMHhDRiAqLworCTB4OTJENywweDkyRDksMHg5MkQwLDB4RkEyNywweDkyRDUsMHg5MkUwLDB4OTJEMywweDkzMjUsLyogMHhEMC0weEQ3ICovCisJMHg5MzIxLDB4OTJGQiwweEZBMjgsMHg5MzFFLDB4OTJGRiwweDkzMUQsMHg5MzAyLDB4OTM3MCwvKiAweEQ4LTB4REYgKi8KKwkweDkzNTcsMHg5M0E0LDB4OTNDNiwweDkzREUsMHg5M0Y4LDB4OTQzMSwweDk0NDUsMHg5NDQ4LC8qIDB4RTAtMHhFNyAqLworCTB4OTU5MiwweEY5REMsMHhGQTI5LDB4OTY5RCwweDk2QUYsMHg5NzMzLDB4OTczQiwweDk3NDMsLyogMHhFOC0weEVGICovCisJMHg5NzRELDB4OTc0RiwweDk3NTEsMHg5NzU1LDB4OTg1NywweDk4NjUsMHhGQTJBLDB4RkEyQiwvKiAweEYwLTB4RjcgKi8KKwkweDk5MjcsMHhGQTJDLDB4OTk5RSwweDlBNEUsMHg5QUQ5LDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0ZDWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OUFEQywweDlCNzUsMHg5QjcyLDB4OUI4RiwweDlCQjEsMHg5QkJCLDB4OUMwMCwweDlENzAsLyogMHg0MC0weDQ3ICovCisJMHg5RDZCLDB4RkEyRCwweDlFMTksMHg5RUQxLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90ICpwYWdlX2NoYXJzZXQydW5pWzI1Nl0gPSB7CisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgYzJ1XzgxLCBjMnVfODIsIGMydV84MywgYzJ1Xzg0LCBOVUxMLCAgIE5VTEwsICAgYzJ1Xzg3LCAKKwljMnVfODgsIGMydV84OSwgYzJ1XzhBLCBjMnVfOEIsIGMydV84QywgYzJ1XzhELCBjMnVfOEUsIGMydV84RiwgCisJYzJ1XzkwLCBjMnVfOTEsIGMydV85MiwgYzJ1XzkzLCBjMnVfOTQsIGMydV85NSwgYzJ1Xzk2LCBjMnVfOTcsIAorCWMydV85OCwgYzJ1Xzk5LCBjMnVfOUEsIGMydV85QiwgYzJ1XzlDLCBjMnVfOUQsIGMydV85RSwgYzJ1XzlGLCAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCWMydV9FMCwgYzJ1X0UxLCBjMnVfRTIsIGMydV9FMywgYzJ1X0U0LCBjMnVfRTUsIGMydV9FNiwgYzJ1X0U3LCAKKwljMnVfRTgsIGMydV9FOSwgYzJ1X0VBLCBOVUxMLCAgIE5VTEwsICAgYzJ1X0VELCBjMnVfRUUsIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBjMnVfRkEsIGMydV9GQiwgYzJ1X0ZDLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18wMGhpWzI1NiAtIDB4QTBdWzJdID0geworCXsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHg4MSwgMHg5MX0sIHsweDgxLCAweDkyfSwvKiAweEEwLTB4QTMgKi8KKwl7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHg4MSwgMHg5OH0sLyogMHhBNC0weEE3ICovCisJezB4ODEsIDB4NEV9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LC8qIDB4QTgtMHhBQiAqLworCXsweDgxLCAweENBfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwvKiAweEFDLTB4QUYgKi8KKwl7MHg4MSwgMHg4Qn0sIHsweDgxLCAweDdEfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sLyogMHhCMC0weEIzICovCisJezB4ODEsIDB4NEN9LCB7MHgwMCwgMHgwMH0sIHsweDgxLCAweEY3fSwgezB4MDAsIDB4MDB9LC8qIDB4QjQtMHhCNyAqLworCXsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwvKiAweEI4LTB4QkIgKi8KKwl7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sLyogMHhCQy0weEJGICovCisJezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LC8qIDB4QzAtMHhDMyAqLworCXsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwvKiAweEM0LTB4QzcgKi8KKwl7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sLyogMHhDOC0weENCICovCisJezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LC8qIDB4Q0MtMHhDRiAqLworCXsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwvKiAweEQwLTB4RDMgKi8KKwl7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHg4MSwgMHg3RX0sLyogMHhENC0weEQ3ICovCisJezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LC8qIDB4RDgtMHhEQiAqLworCXsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwvKiAweERDLTB4REYgKi8KKwl7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sLyogMHhFMC0weEUzICovCisJezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LC8qIDB4RTQtMHhFNyAqLworCXsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwvKiAweEU4LTB4RUIgKi8KKwl7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sLyogMHhFQy0weEVGICovCisJezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LC8qIDB4RjAtMHhGMyAqLworCXsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDgxLCAweDgwfSwvKiAweEY0LTB4RjcgKi8KKwl7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sLyogMHhGOC0weEZCICovCisJezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzAzWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHg4MywgMHg5RiwgMHg4MywgMHhBMCwgMHg4MywgMHhBMSwgLyogMHg5MC0weDkzICovCisJMHg4MywgMHhBMiwgMHg4MywgMHhBMywgMHg4MywgMHhBNCwgMHg4MywgMHhBNSwgLyogMHg5NC0weDk3ICovCisJMHg4MywgMHhBNiwgMHg4MywgMHhBNywgMHg4MywgMHhBOCwgMHg4MywgMHhBOSwgLyogMHg5OC0weDlCICovCisJMHg4MywgMHhBQSwgMHg4MywgMHhBQiwgMHg4MywgMHhBQywgMHg4MywgMHhBRCwgLyogMHg5Qy0weDlGICovCisJMHg4MywgMHhBRSwgMHg4MywgMHhBRiwgMHgwMCwgMHgwMCwgMHg4MywgMHhCMCwgLyogMHhBMC0weEEzICovCisJMHg4MywgMHhCMSwgMHg4MywgMHhCMiwgMHg4MywgMHhCMywgMHg4MywgMHhCNCwgLyogMHhBNC0weEE3ICovCisJMHg4MywgMHhCNSwgMHg4MywgMHhCNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHg4MywgMHhCRiwgMHg4MywgMHhDMCwgMHg4MywgMHhDMSwgLyogMHhCMC0weEIzICovCisJMHg4MywgMHhDMiwgMHg4MywgMHhDMywgMHg4MywgMHhDNCwgMHg4MywgMHhDNSwgLyogMHhCNC0weEI3ICovCisJMHg4MywgMHhDNiwgMHg4MywgMHhDNywgMHg4MywgMHhDOCwgMHg4MywgMHhDOSwgLyogMHhCOC0weEJCICovCisJMHg4MywgMHhDQSwgMHg4MywgMHhDQiwgMHg4MywgMHhDQywgMHg4MywgMHhDRCwgLyogMHhCQy0weEJGICovCisJMHg4MywgMHhDRSwgMHg4MywgMHhDRiwgMHgwMCwgMHgwMCwgMHg4MywgMHhEMCwgLyogMHhDMC0weEMzICovCisJMHg4MywgMHhEMSwgMHg4MywgMHhEMiwgMHg4MywgMHhEMywgMHg4MywgMHhENCwgLyogMHhDNC0weEM3ICovCisJMHg4MywgMHhENSwgMHg4MywgMHhENiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMDRbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDg0LCAweDQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDg0LCAweDQwLCAweDg0LCAweDQxLCAweDg0LCAweDQyLCAweDg0LCAweDQzLCAvKiAweDEwLTB4MTMgKi8KKwkweDg0LCAweDQ0LCAweDg0LCAweDQ1LCAweDg0LCAweDQ3LCAweDg0LCAweDQ4LCAvKiAweDE0LTB4MTcgKi8KKwkweDg0LCAweDQ5LCAweDg0LCAweDRBLCAweDg0LCAweDRCLCAweDg0LCAweDRDLCAvKiAweDE4LTB4MUIgKi8KKwkweDg0LCAweDRELCAweDg0LCAweDRFLCAweDg0LCAweDRGLCAweDg0LCAweDUwLCAvKiAweDFDLTB4MUYgKi8KKwkweDg0LCAweDUxLCAweDg0LCAweDUyLCAweDg0LCAweDUzLCAweDg0LCAweDU0LCAvKiAweDIwLTB4MjMgKi8KKwkweDg0LCAweDU1LCAweDg0LCAweDU2LCAweDg0LCAweDU3LCAweDg0LCAweDU4LCAvKiAweDI0LTB4MjcgKi8KKwkweDg0LCAweDU5LCAweDg0LCAweDVBLCAweDg0LCAweDVCLCAweDg0LCAweDVDLCAvKiAweDI4LTB4MkIgKi8KKwkweDg0LCAweDVELCAweDg0LCAweDVFLCAweDg0LCAweDVGLCAweDg0LCAweDYwLCAvKiAweDJDLTB4MkYgKi8KKwkweDg0LCAweDcwLCAweDg0LCAweDcxLCAweDg0LCAweDcyLCAweDg0LCAweDczLCAvKiAweDMwLTB4MzMgKi8KKwkweDg0LCAweDc0LCAweDg0LCAweDc1LCAweDg0LCAweDc3LCAweDg0LCAweDc4LCAvKiAweDM0LTB4MzcgKi8KKwkweDg0LCAweDc5LCAweDg0LCAweDdBLCAweDg0LCAweDdCLCAweDg0LCAweDdDLCAvKiAweDM4LTB4M0IgKi8KKwkweDg0LCAweDdELCAweDg0LCAweDdFLCAweDg0LCAweDgwLCAweDg0LCAweDgxLCAvKiAweDNDLTB4M0YgKi8KKwkweDg0LCAweDgyLCAweDg0LCAweDgzLCAweDg0LCAweDg0LCAweDg0LCAweDg1LCAvKiAweDQwLTB4NDMgKi8KKwkweDg0LCAweDg2LCAweDg0LCAweDg3LCAweDg0LCAweDg4LCAweDg0LCAweDg5LCAvKiAweDQ0LTB4NDcgKi8KKwkweDg0LCAweDhBLCAweDg0LCAweDhCLCAweDg0LCAweDhDLCAweDg0LCAweDhELCAvKiAweDQ4LTB4NEIgKi8KKwkweDg0LCAweDhFLCAweDg0LCAweDhGLCAweDg0LCAweDkwLCAweDg0LCAweDkxLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDg0LCAweDc2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18yMFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4ODEsIDB4NUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4ODEsIDB4NUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4ODEsIDB4NjUsIDB4ODEsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4ODEsIDB4NjcsIDB4ODEsIDB4NjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4ODEsIDB4RjUsIDB4ODEsIDB4RjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4ODEsIDB4NjQsIDB4ODEsIDB4NjMsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4ODEsIDB4RjEsIDB4MDAsIDB4MDAsIDB4ODEsIDB4OEMsIDB4ODEsIDB4OEQsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODEsIDB4QTYsIC8qIDB4MzgtMHgzQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzIxWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4RSwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQSwgMHg1OSwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhGQSwgMHg1QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MSwgMHhGMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhGQSwgMHg0QSwgMHhGQSwgMHg0QiwgMHhGQSwgMHg0QywgMHhGQSwgMHg0RCwgLyogMHg2MC0weDYzICovCisJMHhGQSwgMHg0RSwgMHhGQSwgMHg0RiwgMHhGQSwgMHg1MCwgMHhGQSwgMHg1MSwgLyogMHg2NC0weDY3ICovCisJMHhGQSwgMHg1MiwgMHhGQSwgMHg1MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhFRSwgMHhFRiwgMHhFRSwgMHhGMCwgMHhFRSwgMHhGMSwgMHhFRSwgMHhGMiwgLyogMHg3MC0weDczICovCisJMHhFRSwgMHhGMywgMHhFRSwgMHhGNCwgMHhFRSwgMHhGNSwgMHhFRSwgMHhGNiwgLyogMHg3NC0weDc3ICovCisJMHhFRSwgMHhGNywgMHhFRSwgMHhGOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHg4MSwgMHhBOSwgMHg4MSwgMHhBQSwgMHg4MSwgMHhBOCwgMHg4MSwgMHhBQiwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MSwgMHhDQiwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHg4MSwgMHhDQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMjJbNTEyXSA9IHsKKwkweDgxLCAweENELCAweDAwLCAweDAwLCAweDgxLCAweERELCAweDgxLCAweENFLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgxLCAweERFLCAvKiAweDA0LTB4MDcgKi8KKwkweDgxLCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgxLCAweEI5LCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDg3LCAweDk0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg3LCAweDk1LCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDgxLCAweEU1LCAweDgxLCAweDg3LCAweDg3LCAweDk4LCAvKiAweDFDLTB4MUYgKi8KKwkweDg3LCAweDk3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDgxLCAweDYxLCAweDAwLCAweDAwLCAweDgxLCAweEM4LCAvKiAweDI0LTB4MjcgKi8KKwkweDgxLCAweEM5LCAweDg3LCAweDlCLCAweDg3LCAweDlDLCAweDg3LCAweDkyLCAvKiAweDI4LTB4MkIgKi8KKwkweDgxLCAweEU4LCAweDAwLCAweDAwLCAweDg3LCAweDkzLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDgxLCAweDg4LCAweEZBLCAweDVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDgxLCAweEU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg3LCAweDkwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDgxLCAweDgyLCAweDg3LCAweDkxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgxLCAweDg1LCAweDgxLCAweDg2LCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgxLCAweEUxLCAweDgxLCAweEUyLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgxLCAweEJDLCAweDgxLCAweEJELCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgxLCAweEJBLCAweDgxLCAweEJCLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDg3LCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg3LCAweDk5LCAvKiAweEJDLTB4QkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18yM1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODEsIDB4REMsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzI0WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHg4NywgMHg0MCwgMHg4NywgMHg0MSwgMHg4NywgMHg0MiwgMHg4NywgMHg0MywgLyogMHg2MC0weDYzICovCisJMHg4NywgMHg0NCwgMHg4NywgMHg0NSwgMHg4NywgMHg0NiwgMHg4NywgMHg0NywgLyogMHg2NC0weDY3ICovCisJMHg4NywgMHg0OCwgMHg4NywgMHg0OSwgMHg4NywgMHg0QSwgMHg4NywgMHg0QiwgLyogMHg2OC0weDZCICovCisJMHg4NywgMHg0QywgMHg4NywgMHg0RCwgMHg4NywgMHg0RSwgMHg4NywgMHg0RiwgLyogMHg2Qy0weDZGICovCisJMHg4NywgMHg1MCwgMHg4NywgMHg1MSwgMHg4NywgMHg1MiwgMHg4NywgMHg1MywgLyogMHg3MC0weDczICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMjVbNTEyXSA9IHsKKwkweDg0LCAweDlGLCAweDg0LCAweEFBLCAweDg0LCAweEEwLCAweDg0LCAweEFCLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDg0LCAweEExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg0LCAweEFDLCAvKiAweDBDLTB4MEYgKi8KKwkweDg0LCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg0LCAweEFELCAvKiAweDEwLTB4MTMgKi8KKwkweDg0LCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg0LCAweEFGLCAvKiAweDE0LTB4MTcgKi8KKwkweDg0LCAweEEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg0LCAweEFFLCAvKiAweDE4LTB4MUIgKi8KKwkweDg0LCAweEE1LCAweDg0LCAweEJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDg0LCAweEI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg0LCAweEIwLCAvKiAweDIwLTB4MjMgKi8KKwkweDg0LCAweEE3LCAweDg0LCAweEJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDg0LCAweEI3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg0LCAweEIyLCAvKiAweDI4LTB4MkIgKi8KKwkweDg0LCAweEE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg0LCAweEI2LCAvKiAweDJDLTB4MkYgKi8KKwkweDg0LCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg0LCAweEIxLCAvKiAweDMwLTB4MzMgKi8KKwkweDg0LCAweEE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg0LCAweEI4LCAvKiAweDM0LTB4MzcgKi8KKwkweDg0LCAweEJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg0LCAweEIzLCAvKiAweDM4LTB4M0IgKi8KKwkweDg0LCAweEE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg0LCAweEI5LCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg0LCAweEJFLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg0LCAweEI0LCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDgxLCAweEExLCAweDgxLCAweEEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgxLCAweEEzLCAweDgxLCAweEEyLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDgxLCAweEE1LCAweDgxLCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgxLCAweDlGLCAweDgxLCAweDlFLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgxLCAweDlCLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgxLCAweDlELCAweDgxLCAweDlDLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgxLCAweEZDLCAvKiAweEVDLTB4RUYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18yNls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4ODEsIDB4OUEsIDB4ODEsIDB4OTksIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4ODEsIDB4OEEsIDB4MDAsIDB4MDAsIDB4ODEsIDB4ODksIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODEsIDB4RjQsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4ODEsIDB4RjMsIDB4MDAsIDB4MDAsIDB4ODEsIDB4RjIsIC8qIDB4NkMtMHg2RiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzMwWzUxMl0gPSB7CisJMHg4MSwgMHg0MCwgMHg4MSwgMHg0MSwgMHg4MSwgMHg0MiwgMHg4MSwgMHg1NiwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHg4MSwgMHg1OCwgMHg4MSwgMHg1OSwgMHg4MSwgMHg1QSwgLyogMHgwNC0weDA3ICovCisJMHg4MSwgMHg3MSwgMHg4MSwgMHg3MiwgMHg4MSwgMHg3MywgMHg4MSwgMHg3NCwgLyogMHgwOC0weDBCICovCisJMHg4MSwgMHg3NSwgMHg4MSwgMHg3NiwgMHg4MSwgMHg3NywgMHg4MSwgMHg3OCwgLyogMHgwQy0weDBGICovCisJMHg4MSwgMHg3OSwgMHg4MSwgMHg3QSwgMHg4MSwgMHhBNywgMHg4MSwgMHhBQywgLyogMHgxMC0weDEzICovCisJMHg4MSwgMHg2QiwgMHg4MSwgMHg2QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHg4NywgMHg4MCwgMHgwMCwgMHgwMCwgMHg4NywgMHg4MSwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHg4MiwgMHg5RiwgMHg4MiwgMHhBMCwgMHg4MiwgMHhBMSwgLyogMHg0MC0weDQzICovCisJMHg4MiwgMHhBMiwgMHg4MiwgMHhBMywgMHg4MiwgMHhBNCwgMHg4MiwgMHhBNSwgLyogMHg0NC0weDQ3ICovCisJMHg4MiwgMHhBNiwgMHg4MiwgMHhBNywgMHg4MiwgMHhBOCwgMHg4MiwgMHhBOSwgLyogMHg0OC0weDRCICovCisJMHg4MiwgMHhBQSwgMHg4MiwgMHhBQiwgMHg4MiwgMHhBQywgMHg4MiwgMHhBRCwgLyogMHg0Qy0weDRGICovCisJMHg4MiwgMHhBRSwgMHg4MiwgMHhBRiwgMHg4MiwgMHhCMCwgMHg4MiwgMHhCMSwgLyogMHg1MC0weDUzICovCisJMHg4MiwgMHhCMiwgMHg4MiwgMHhCMywgMHg4MiwgMHhCNCwgMHg4MiwgMHhCNSwgLyogMHg1NC0weDU3ICovCisJMHg4MiwgMHhCNiwgMHg4MiwgMHhCNywgMHg4MiwgMHhCOCwgMHg4MiwgMHhCOSwgLyogMHg1OC0weDVCICovCisJMHg4MiwgMHhCQSwgMHg4MiwgMHhCQiwgMHg4MiwgMHhCQywgMHg4MiwgMHhCRCwgLyogMHg1Qy0weDVGICovCisJMHg4MiwgMHhCRSwgMHg4MiwgMHhCRiwgMHg4MiwgMHhDMCwgMHg4MiwgMHhDMSwgLyogMHg2MC0weDYzICovCisJMHg4MiwgMHhDMiwgMHg4MiwgMHhDMywgMHg4MiwgMHhDNCwgMHg4MiwgMHhDNSwgLyogMHg2NC0weDY3ICovCisJMHg4MiwgMHhDNiwgMHg4MiwgMHhDNywgMHg4MiwgMHhDOCwgMHg4MiwgMHhDOSwgLyogMHg2OC0weDZCICovCisJMHg4MiwgMHhDQSwgMHg4MiwgMHhDQiwgMHg4MiwgMHhDQywgMHg4MiwgMHhDRCwgLyogMHg2Qy0weDZGICovCisJMHg4MiwgMHhDRSwgMHg4MiwgMHhDRiwgMHg4MiwgMHhEMCwgMHg4MiwgMHhEMSwgLyogMHg3MC0weDczICovCisJMHg4MiwgMHhEMiwgMHg4MiwgMHhEMywgMHg4MiwgMHhENCwgMHg4MiwgMHhENSwgLyogMHg3NC0weDc3ICovCisJMHg4MiwgMHhENiwgMHg4MiwgMHhENywgMHg4MiwgMHhEOCwgMHg4MiwgMHhEOSwgLyogMHg3OC0weDdCICovCisJMHg4MiwgMHhEQSwgMHg4MiwgMHhEQiwgMHg4MiwgMHhEQywgMHg4MiwgMHhERCwgLyogMHg3Qy0weDdGICovCisJCisJMHg4MiwgMHhERSwgMHg4MiwgMHhERiwgMHg4MiwgMHhFMCwgMHg4MiwgMHhFMSwgLyogMHg4MC0weDgzICovCisJMHg4MiwgMHhFMiwgMHg4MiwgMHhFMywgMHg4MiwgMHhFNCwgMHg4MiwgMHhFNSwgLyogMHg4NC0weDg3ICovCisJMHg4MiwgMHhFNiwgMHg4MiwgMHhFNywgMHg4MiwgMHhFOCwgMHg4MiwgMHhFOSwgLyogMHg4OC0weDhCICovCisJMHg4MiwgMHhFQSwgMHg4MiwgMHhFQiwgMHg4MiwgMHhFQywgMHg4MiwgMHhFRCwgLyogMHg4Qy0weDhGICovCisJMHg4MiwgMHhFRSwgMHg4MiwgMHhFRiwgMHg4MiwgMHhGMCwgMHg4MiwgMHhGMSwgLyogMHg5MC0weDkzICovCisJMHg4MywgMHg5NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MSwgMHg0QSwgLyogMHg5OC0weDlCICovCisJMHg4MSwgMHg0QiwgMHg4MSwgMHg1NCwgMHg4MSwgMHg1NSwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHg4MywgMHg0MCwgMHg4MywgMHg0MSwgMHg4MywgMHg0MiwgLyogMHhBMC0weEEzICovCisJMHg4MywgMHg0MywgMHg4MywgMHg0NCwgMHg4MywgMHg0NSwgMHg4MywgMHg0NiwgLyogMHhBNC0weEE3ICovCisJMHg4MywgMHg0NywgMHg4MywgMHg0OCwgMHg4MywgMHg0OSwgMHg4MywgMHg0QSwgLyogMHhBOC0weEFCICovCisJMHg4MywgMHg0QiwgMHg4MywgMHg0QywgMHg4MywgMHg0RCwgMHg4MywgMHg0RSwgLyogMHhBQy0weEFGICovCisJMHg4MywgMHg0RiwgMHg4MywgMHg1MCwgMHg4MywgMHg1MSwgMHg4MywgMHg1MiwgLyogMHhCMC0weEIzICovCisJMHg4MywgMHg1MywgMHg4MywgMHg1NCwgMHg4MywgMHg1NSwgMHg4MywgMHg1NiwgLyogMHhCNC0weEI3ICovCisJMHg4MywgMHg1NywgMHg4MywgMHg1OCwgMHg4MywgMHg1OSwgMHg4MywgMHg1QSwgLyogMHhCOC0weEJCICovCisJMHg4MywgMHg1QiwgMHg4MywgMHg1QywgMHg4MywgMHg1RCwgMHg4MywgMHg1RSwgLyogMHhCQy0weEJGICovCisJMHg4MywgMHg1RiwgMHg4MywgMHg2MCwgMHg4MywgMHg2MSwgMHg4MywgMHg2MiwgLyogMHhDMC0weEMzICovCisJMHg4MywgMHg2MywgMHg4MywgMHg2NCwgMHg4MywgMHg2NSwgMHg4MywgMHg2NiwgLyogMHhDNC0weEM3ICovCisJMHg4MywgMHg2NywgMHg4MywgMHg2OCwgMHg4MywgMHg2OSwgMHg4MywgMHg2QSwgLyogMHhDOC0weENCICovCisJMHg4MywgMHg2QiwgMHg4MywgMHg2QywgMHg4MywgMHg2RCwgMHg4MywgMHg2RSwgLyogMHhDQy0weENGICovCisJMHg4MywgMHg2RiwgMHg4MywgMHg3MCwgMHg4MywgMHg3MSwgMHg4MywgMHg3MiwgLyogMHhEMC0weEQzICovCisJMHg4MywgMHg3MywgMHg4MywgMHg3NCwgMHg4MywgMHg3NSwgMHg4MywgMHg3NiwgLyogMHhENC0weEQ3ICovCisJMHg4MywgMHg3NywgMHg4MywgMHg3OCwgMHg4MywgMHg3OSwgMHg4MywgMHg3QSwgLyogMHhEOC0weERCICovCisJMHg4MywgMHg3QiwgMHg4MywgMHg3QywgMHg4MywgMHg3RCwgMHg4MywgMHg3RSwgLyogMHhEQy0weERGICovCisJMHg4MywgMHg4MCwgMHg4MywgMHg4MSwgMHg4MywgMHg4MiwgMHg4MywgMHg4MywgLyogMHhFMC0weEUzICovCisJMHg4MywgMHg4NCwgMHg4MywgMHg4NSwgMHg4MywgMHg4NiwgMHg4MywgMHg4NywgLyogMHhFNC0weEU3ICovCisJMHg4MywgMHg4OCwgMHg4MywgMHg4OSwgMHg4MywgMHg4QSwgMHg4MywgMHg4QiwgLyogMHhFOC0weEVCICovCisJMHg4MywgMHg4QywgMHg4MywgMHg4RCwgMHg4MywgMHg4RSwgMHg4MywgMHg4RiwgLyogMHhFQy0weEVGICovCisJMHg4MywgMHg5MCwgMHg4MywgMHg5MSwgMHg4MywgMHg5MiwgMHg4MywgMHg5MywgLyogMHhGMC0weEYzICovCisJMHg4MywgMHg5NCwgMHg4MywgMHg5NSwgMHg4MywgMHg5NiwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MSwgMHg0NSwgLyogMHhGOC0weEZCICovCisJMHg4MSwgMHg1QiwgMHg4MSwgMHg1MiwgMHg4MSwgMHg1MywgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMzJbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEZBLCAweDU4LCAweDg3LCAweDhCLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDg3LCAweDhDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDg3LCAweDg1LCAweDg3LCAweDg2LCAweDg3LCAweDg3LCAweDg3LCAweDg4LCAvKiAweEE0LTB4QTcgKi8KKwkweDg3LCAweDg5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18zM1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODcsIDB4NjUsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4ODcsIDB4NjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4ODcsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4ODcsIDB4NjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODcsIDB4NjEsIDB4ODcsIDB4NkIsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODcsIDB4NkEsIDB4ODcsIDB4NjQsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODcsIDB4NkMsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODcsIDB4NjYsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODcsIDB4NkUsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4ODcsIDB4NUYsIDB4ODcsIDB4NkQsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4ODcsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4ODcsIDB4NjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODcsIDB4NjgsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODcsIDB4N0UsIC8qIDB4NzgtMHg3QiAqLworCTB4ODcsIDB4OEYsIDB4ODcsIDB4OEUsIDB4ODcsIDB4OEQsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODcsIDB4NzIsIDB4ODcsIDB4NzMsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4ODcsIDB4NkYsIDB4ODcsIDB4NzAsIDB4ODcsIDB4NzEsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4ODcsIDB4NzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4ODcsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4ODcsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzRFWzUxMl0gPSB7CisJMHg4OCwgMHhFQSwgMHg5MiwgMHg5QSwgMHgwMCwgMHgwMCwgMHg4RSwgMHhCNSwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg5QywgLyogMHgwNC0weDA3ICovCisJMHg4RiwgMHhFNCwgMHg4RSwgMHg0RiwgMHg4RiwgMHhFMywgMHg4OSwgMHhCQSwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHg3MywgMHg5NywgMHg1RSwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHg5OCwgMHhBMCwgMHg4OSwgMHg0RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHg4QSwgMHg4RSwgMHg5OCwgMHhBMSwgMHg5MCwgMHhBMiwgMHg5OSwgMHhDMCwgLyogMHgxNC0weDE3ICovCisJMHg4QiwgMHg3NSwgMHg5NSwgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHhFNSwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHhCQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHhDMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhFRCwgMHg0QywgMHgwMCwgMHgwMCwgMHg5OCwgMHhBMiwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHg5MiwgMHg4NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHg5OCwgMHhBMywgMHg4QiwgMHhGOCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OCwgMHhBNCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHg4QSwgMHhEQiwgMHg5MiwgMHg0RiwgMHgwMCwgMHgwMCwgMHg4RSwgMHhFNSwgLyogMHgzOC0weDNCICovCisJMHg5OCwgMHhBNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OCwgMHhBNiwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OCwgMHhBNywgMHg5NCwgMHg1NCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHg3NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHg1NiwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHhFMSwgMHg4QywgMHhDMSwgMHg5NiwgMHg1MiwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHg2OCwgMHg5OCwgMHhBOCwgMHg4RiwgMHhFNiwgLyogMHg1NC0weDU3ICovCisJMHg5OCwgMHhBOSwgMHg4OSwgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHhFMywgMHg4QywgMHhFRSwgMHg5NiwgMHhFNywgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHhBNCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHg5MCwgMHgwMCwgMHgwMCwgMHg5MywgMHhGQiwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHhBMywgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHg4QiwgMHg1NCwgMHgwMCwgMHgwMCwgMHg5OCwgMHhBQSwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHg5OCwgMHhBQiwgMHg5NywgMHhCOSwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHg5NywgMHg1QywgMHg5MSwgMHg4OCwgMHg5OCwgMHhBRCwgMHg4RSwgMHg5NiwgLyogMHg4OC0weDhCICovCisJMHg5MywgMHhGMSwgMHgwMCwgMHgwMCwgMHg5OCwgMHhCMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHg4OSwgMHg1RCwgMHg4QywgMHhERCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHg4QywgMHhEQywgMHg4OCwgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHg5OCwgMHg2QSwgMHg5OCwgMHg2OSwgMHgwMCwgMHgwMCwgMHg4RCwgMHhCMSwgLyogMHg5OC0weDlCICovCisJMHg4OCwgMHg5RiwgMHgwMCwgMHgwMCwgMHg5OCwgMHhCMSwgMHg5OCwgMHhCMiwgLyogMHg5Qy0weDlGICovCisJMHg5OCwgMHhCMywgMHg5NiwgMHg1MywgMHg5OCwgMHhCNCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHg4QywgMHhGMCwgMHg4OCwgMHhFNSwgMHg5NiwgMHg5MiwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHg4QiwgMHg5QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHg5RCwgLyogMHhBOC0weEFCICovCisJMHg4QiwgMHg5RSwgMHg5MiwgMHhFMCwgMHg5NywgMHhCQSwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHg5OCwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OCwgMHhCNiwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OCwgMHhCNywgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg2QywgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHg4RiwgMHg1OSwgMHg5MCwgMHg2RCwgMHg5OCwgMHhCQywgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHg5OCwgMHhCQSwgMHgwMCwgMHgwMCwgMHg5OCwgMHhCQiwgMHg4QiwgMHg3NywgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RCwgMHhBMSwgMHg4OSwgMHhFRSwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHg5OCwgMHhCOSwgMHg5OCwgMHhCOCwgMHg5NSwgMHhBNywgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHg4RSwgMHg2NSwgMHg4RSwgMHg2NCwgMHg5MSwgMHhCQywgMHg5OCwgMHhCRCwgLyogMHhENC0weEQ3ICovCisJMHg5NSwgMHg3NCwgMHg5MCwgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHg4MSwgMHg1NywgMHg5OCwgMHhCRSwgMHg5OCwgMHhDMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHg0RCwgMHgwMCwgMHgwMCwgMHg5MSwgMHhFMywgLyogMHhFMC0weEUzICovCisJMHg5NywgMHhERiwgMHg4OCwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHg5OCwgMHhCRiwgMHg4OSwgMHhCQywgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHg4QiwgMHhDMiwgMHgwMCwgMHgwMCwgMHg5MiwgMHg4NywgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHg4RiwgMHg5OCwgMHhDMSwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHg0MywgLyogMHhGOC0weEZCICovCisJMHhFRCwgMHg0RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNEZbNTEyXSA9IHsKKwkweEVELCAweDRGLCAweDhBLCAweEU5LCAweDAwLCAweDAwLCAweEVELCAweDUwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDk4LCAweEMyLCAweDg4LCAweEM5LCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDhDLCAweERFLCAweDhBLCAweEVBLCAweDk1LCAweDlBLCAvKiAweDBDLTB4MEYgKi8KKwkweDk0LCAweEIwLCAweDhCLCAweDc4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweEVGLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDk4LCAweEU1LCAweDkzLCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweDhDLCAvKiAweDJDLTB4MkYgKi8KKwkweDk4LCAweEM0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDk0LCAweEJBLCAweDAwLCAweDAwLCAweDk3LCAweEUwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDkwLCAweDRDLCAweEVELCAweDUxLCAweDhFLCAweDY2LCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDhFLCAweDk3LCAweDg5LCAweEJFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweENGLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDQxLCAweDk4LCAweEM4LCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDg4LCAweENBLCAweDkyLCAweEUxLCAweDhGLCAweDVBLCAvKiAweDRDLTB4NEYgKi8KKwkweDhELCAweEIyLCAweDk3LCAweDQzLCAweDAwLCAweDAwLCAweDkxLCAweENDLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDg5LCAweEJELCAweEVELCAweDUyLCAweDk4LCAweEM3LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweDVELCAweDk4LCAweEMzLCAweDk4LCAweEM1LCAvKiAweDU4LTB4NUIgKi8KKwkweDhELCAweEVDLCAweDk4LCAweEM2LCAweDlCLCAweDQzLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDk4LCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk4LCAweEQxLCAvKiAweDZDLTB4NkYgKi8KKwkweDk4LCAweENGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweEMwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweEI5LCAweDk4LCAweEM5LCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk4LCAweENELCAvKiAweDc4LTB4N0IgKi8KKwkweDhDLCAweEYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDY3LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweEE0LCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk4LCAweEQyLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDk4LCAweENBLCAweDAwLCAweDAwLCAweEVELCAweDU0LCAweDk3LCAweEUxLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDhFLCAweDk4LCAweDAwLCAweDAwLCAweDk4LCAweENCLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDk4LCAweEQwLCAweEVELCAweDUzLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEVELCAweDU2LCAweDAwLCAweDAwLCAweDk4LCAweEQzLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDk4LCAweENDLCAweDAwLCAweDAwLCAweEVELCAweDU1LCAweDhCLCAweDlGLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDg4LCAweENCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDhCLCAweEEwLCAweDg5LCAweEJGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweDQ0LCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDk2LCAweDk5LCAweDk1LCAweDhFLCAweDhDLCAweEYyLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweDRFLCAweDk3LCAweEI1LCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweEQ2LCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweDU3LCAweDkxLCAweEEzLCAvKiAweEMwLTB4QzMgKi8KKwkweDg5LCAweEUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEVELCAweDQ1LCAweDhGLCAweDcyLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweEVELCAweDU3LCAweDk4LCAweEQ3LCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDk4LCAweERDLCAweDk4LCAweERBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDk4LCAweEQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweEFELCAvKiAweEQ0LTB4RDcgKi8KKwkweDk4LCAweEQ4LCAweDAwLCAweDAwLCAweDk4LCAweERCLCAweDk4LCAweEQ5LCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweERCLCAweDAwLCAweDAwLCAweDk4LCAweEQ2LCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweDRELCAweDAwLCAweDAwLCAweDk2LCAweDkzLCAvKiAweEUwLTB4RTMgKi8KKwkweDk4LCAweERELCAweDk4LCAweERFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweDQzLCAweDk4LCAweEVCLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweDZGLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweDU1LCAweDk4LCAweEU2LCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDk1LCAweEVFLCAweDAwLCAweDAwLCAweDg5LCAweEI0LCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk4LCAweEVBLCAweEVELCAweDVBLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181MFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4OTgsIDB4RTQsIDB4OTgsIDB4RUQsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4OTEsIDB4NzEsIDB4MDAsIDB4MDAsIDB4OEMsIDB4QzIsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4OTQsIDB4N0IsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QzUsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4OTgsIDB4RUMsIDB4OTMsIDB4N0MsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4OTgsIDB4RTEsIDB4MDAsIDB4MDAsIDB4OEMsIDB4RjQsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4RjMsIDB4OTgsIDB4REYsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4NUIsIDB4OEUsIDB4RDgsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4OTgsIDB4RTcsIDB4RUQsIDB4NTksIDB4OTUsIDB4RUQsIC8qIDB4MjAtMHgyMyAqLworCTB4OTIsIDB4NkMsIDB4OTgsIDB4RTMsIDB4OEMsIDB4OTEsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4OTgsIDB4RTAsIDB4OTgsIDB4RTgsIDB4OTgsIDB4RTIsIDB4OTcsIDB4Q0YsIC8qIDB4MjgtMHgyQiAqLworCTB4OTgsIDB4RTksIDB4OTgsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4RTQsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4OTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4RUQsIDB4NTgsIDB4MDAsIDB4MDAsIDB4RUQsIDB4NUUsIDB4OTgsIDB4RUUsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4NUMsIDB4OTgsIDB4RUYsIC8qIDB4NDQtMHg0NyAqLworCTB4OTgsIDB4RjMsIDB4ODgsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4Q0UsIC8qIDB4NEMtMHg0RiAqLworCTB4OTgsIDB4RjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4OTgsIDB4RjEsIDB4OTgsIDB4RjUsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTgsIDB4RjQsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4OTIsIDB4RTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4OTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4OTgsIDB4RjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4RUQsIDB4NUQsIDB4MDAsIDB4MDAsIDB4OEUsIDB4QzMsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4OTEsIDB4QTQsIDB4OTIsIDB4RTMsIDB4OEIsIDB4RjQsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4OTgsIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4OEIsIDB4NTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OTgsIDB4RjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4OTgsIDB4RkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4OTYsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4ODYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4RUQsIDB4NUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4OEUsIDB4NTAsIDB4OTQsIDB4RjUsIDB4OTgsIDB4RjksIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4OEQsIDB4QzMsIDB4OTcsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTgsIDB4RkMsIDB4OTksIDB4NDIsIC8qIDB4QjAtMHhCMyAqLworCTB4OTgsIDB4RkIsIDB4OEQsIDB4QzIsIDB4MDAsIDB4MDAsIDB4OEYsIDB4OUQsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4NTgsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTksIDB4NDMsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4OEIsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4NDAsIDB4OTksIDB4NDEsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4QUQsIDB4MDAsIDB4MDAsIDB4OTEsIDB4OUMsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4OEIsIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4OTYsIDB4NkMsIDB4OTksIDB4NDQsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4RUQsIDB4NjEsIDB4MDAsIDB4MDAsIDB4OTcsIDB4QkIsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTksIDB4NDUsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTksIDB4NDgsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4NDYsIDB4MDAsIDB4MDAsIDB4OTEsIDB4NkQsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4NDcsIDB4OTksIDB4NDksIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RUQsIDB4NjAsIDB4OTksIDB4NEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4NEEsIDB4MDAsIDB4MDAsIDB4OTUsIDB4QzYsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzUxWzUxMl0gPSB7CisJMHg4QiwgMHg1NiwgMHg5OSwgMHg0RCwgMHg5OSwgMHg0RSwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHg4OSwgMHhBRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHg0QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHhGMiwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHg5OSwgMHg1MSwgMHg5OSwgMHg1MCwgMHg5OSwgMHg0RiwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHg5OCwgMHhENCwgMHgwMCwgMHgwMCwgMHg5OSwgMHg1MiwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHg5RSwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHg1MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHg0NCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHhENywgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHg1NSwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHg1NCwgMHg5OSwgMHg1NywgLyogMHgzOC0weDNCICovCisJMHg5OSwgMHg1NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHg1OCwgLyogMHgzQy0weDNGICovCisJMHg5OSwgMHg1OSwgMHg4OCwgMHhGMiwgMHgwMCwgMHgwMCwgMHg4QywgMHhCMywgLyogMHg0MC0weDQzICovCisJMHg4QywgMHg1QSwgMHg4RiwgMHg1QiwgMHg5MiwgMHg5QiwgMHg4QiwgMHhBMiwgLyogMHg0NC0weDQ3ICovCisJMHg5MCwgMHhFNiwgMHg4QywgMHhGNSwgMHhFRCwgMHg2MiwgMHg4RCwgMHg4RSwgLyogMHg0OC0weDRCICovCisJMHg5OSwgMHg1QiwgMHg5NiwgMHhDNiwgMHg5MywgMHg2NSwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHg4RSwgMHg5OSwgMHgwMCwgMHgwMCwgMHg5OSwgMHg1QSwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHg5OSwgMHg1QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHg3RCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHg4QSwgMHg5NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHg1RCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhFRCwgMHg2MywgMHg5MywgMHhGQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHg5MSwgMHg1MywgMHg5OSwgMHg1RiwgMHg5OSwgMHg2MCwgMHg5NCwgMHhBQSwgLyogMHg2OC0weDZCICovCisJMHg4QywgMHhGNiwgMHg5OCwgMHg1QSwgMHg5OSwgMHg2MSwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHhCQSwgMHg5MSwgMHhCNCwgMHg4QiwgMHhFRiwgLyogMHg3NC0weDc3ICovCisJMHg5MywgMHg1NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHg4QywgMHg5MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHg5OSwgMHg2MiwgMHgwMCwgMHgwMCwgMHg5OSwgMHg2MywgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHhFMCwgMHg4OSwgMHg3RSwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHg2NiwgMHg4RCwgMHhGQiwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHg5OSwgMHg2NSwgMHg4RCwgMHhDNCwgMHgwMCwgMHgwMCwgMHg5OSwgMHg2NywgLyogMHg4Qy0weDhGICovCisJMHhFMywgMHhFQywgMHg5OSwgMHg2OCwgMHg5NiwgMHg2MCwgMHg5OSwgMHg2OSwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHg2QSwgMHg5OSwgMHg2QiwgMHg4RiwgMHhFNywgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHg4RSwgMHhDQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHg4QSwgMHhBNSwgMHgwMCwgMHgwMCwgMHg5OSwgMHg2RSwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHg5OSwgMHg2QywgMHg5NiwgMHhCQiwgMHg5OSwgMHg2RCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHg5NSwgMHg3OSwgMHg5OSwgMHg2RiwgMHg5OSwgMHg3MCwgMHg5OSwgMHg3MSwgLyogMHhBOC0weEFCICovCisJMHg5MywgMHg3RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHg5OSwgMHg3NSwgMHg5OSwgMHg3MywgMHg5OSwgMHg3NCwgMHg5OSwgMHg3MiwgLyogMHhCMC0weEIzICovCisJMHg4RCwgMHhFMSwgMHg5OSwgMHg3NiwgMHg5NiwgMHhFOCwgMHg5NywgMHhFMiwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHg3NywgMHhFRCwgMHg2NSwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHg5MCwgMHhBNiwgMHg5OSwgMHg3OCwgMHg4RiwgMHg3OSwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHg3OSwgMHgwMCwgMHgwMCwgMHg5MiwgMHg5QywgLyogMHhDOC0weENCICovCisJMHg5NywgMHhCRCwgMHg5MywgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHhDMywgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHg3QSwgLyogMHhEOC0weERCICovCisJMHhFQSwgMHhBMywgMHg4QiwgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHg5OSwgMHg3QiwgMHg5NiwgMHg3RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHg4OCwgMHg5MSwgMHhGQSwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHg3RCwgMHg5MywgMHhFMiwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHhFRCwgMHg2NiwgMHg5OSwgMHg3RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHg5OSwgMHg4MCwgMHg4QSwgMHg0RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHg4MSwgMHg4QiwgMHhBNSwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHg5MywgMHhDQSwgMHg4OSwgMHg5QSwgMHg4RiwgMHg2RiwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHg5RiwgMHg5OSwgMHg4MiwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTJbNTEyXSA9IHsKKwkweDkzLCAweDgxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweDZFLCAvKiAweDAwLTB4MDMgKi8KKwkweDk5LCAweDgzLCAweDAwLCAweDAwLCAweDk1LCAweEFBLCAweDkwLCAweEQ4LCAvKiAweDA0LTB4MDcgKi8KKwkweDhBLCAweEEwLCAweDAwLCAweDAwLCAweDhBLCAweEE3LCAweDk5LCAweDg0LCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweDg2LCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDhDLCAweDU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDk5LCAweDg1LCAweEVELCAweDY3LCAweDAwLCAweDAwLCAweDk3LCAweEYxLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweDg5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDk0LCAweEJCLCAweDk1LCAweENBLCAweDAwLCAweDAwLCAweDk5LCAweDg3LCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweDk4LCAweDk5LCAweDg4LCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweDg5LCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDkzLCAweDlFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweDhBLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweEE3LCAweDhELCAweEZDLCAvKiAweDM0LTB4MzcgKi8KKwkweDhDLCAweDk0LCAweDk5LCAweDhCLCAweDhFLCAweDY4LCAweDhELCAweDhGLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweEU0LCAvKiAweDQwLTB4NDMgKi8KKwkweDk5LCAweDhELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweEE1LCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweEVELCAweDk5LCAweDhFLCAvKiAweDQ4LTB4NEIgKi8KKwkweDk5LCAweDhGLCAweDkxLCAweDRGLCAweDAwLCAweDAwLCAweDk5LCAweDhDLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDk5LCAweDkxLCAweDAwLCAweDAwLCAweDk2LCAweDU1LCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweDg0LCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweDkwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweDk1LCAvKiAweDYwLTB4NjMgKi8KKwkweDhELCAweERDLCAweDk0LCAweDhELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweDk0LCAweDk5LCAweDkyLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweDlCLCAvKiAweDZDLTB4NkYgKi8KKwkweDhGLCAweEU4LCAweDk5LCAweDlCLCAweDhBLCAweDg0LCAweDk5LCAweDk1LCAvKiAweDcwLTB4NzMgKi8KKwkweDk5LCAweDkzLCAweDkxLCAweDZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweDk3LCAweDAwLCAweDAwLCAweDk5LCAweDk2LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweDYzLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweDgwLCAvKiAweDg0LTB4ODcgKi8KKwkweDk5LCAweDlDLCAweDk3LCAweEFCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweDk4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweDlELCAweDk5LCAweDlBLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDk5LCAweDk5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweENELCAvKiAweDk4LTB4OUIgKi8KKwkweEVELCAweDY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweEY3LCAvKiAweDlDLTB4OUYgKi8KKwkweDg5LCAweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweEYyLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweDY5LCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweDk1LCAweDkzLCAweDc3LCAweDhELCAweDg1LCAvKiAweEE4LTB4QUIgKi8KKwkweDk5LCAweEEwLCAweDk5LCAweEExLCAweDAwLCAweDAwLCAweEVFLCAweDVCLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweEUzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDk4LCAweDRBLCAweDk5LCAweEEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDhDLCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDk5LCAweEEyLCAweDAwLCAweDAwLCAweDhBLCAweDRFLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweEVELCAweDZBLCAweDk5LCAweEE0LCAweDAwLCAweDAwLCAweDk2LCAweDc1LCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweEJBLCAweDAwLCAweDAwLCAweDk3LCAweDQ1LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweEQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEQzLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDkzLCAweEFFLCAweDAwLCAweDAwLCAweDk5LCAweEE2LCAvKiAweEQ0LTB4RDcgKi8KKwkweDhBLCAweEE4LCAweDk2LCAweEIxLCAweDAwLCAweDAwLCAweEVELCAweDZCLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweDlGLCAweDk5LCAweEE3LCAweDk1LCAweEU1LCAvKiAweERDLTB4REYgKi8KKwkweDk5LCAweEFCLCAweDAwLCAweDAwLCAweDkwLCAweEE4LCAweDk5LCAweEE4LCAvKiAweEUwLTB4RTMgKi8KKwkweDhCLCAweENFLCAweDAwLCAweDAwLCAweDk5LCAweEE5LCAweDhBLCAweEE5LCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweDRELCAweDk5LCAweEFDLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweEFELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDk5LCAweEFFLCAweDk5LCAweEFGLCAweDhFLCAweEQ5LCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweEY5LCAweDk2LCAweERDLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181M1s1MTJdID0geworCTB4RUQsIDB4NkMsIDB4OTYsIDB4RTYsIDB4OTMsIDB4RjUsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4RUYsIDB4OTksIDB4QjAsIDB4RUQsIDB4NkQsIC8qIDB4MDQtMHgwNyAqLworCTB4OTksIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4QjMsIDB4MDAsIDB4MDAsIDB4OTksIDB4QjUsIC8qIDB4MEMtMHgwRiAqLworCTB4OTksIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4QjYsIDB4ODksIDB4QkIsIDB4OTYsIDB4NkIsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4RkEsIDB4OTksIDB4QjcsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4OTEsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4OEYsIDB4QTAsIDB4OEIsIDB4QTcsIDB4MDAsIDB4MDAsIDB4OTksIDB4QjgsIC8qIDB4MjAtMHgyMyAqLworCTB4RUQsIDB4NkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4RDksIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTksIDB4QjksIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4QkEsIDB4MDAsIDB4MDAsIDB4OTksIDB4QkIsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4OTksIDB4QkMsIDB4OTUsIDB4NDMsIDB4OEIsIDB4RTYsIDB4ODgsIDB4RTMsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4QkQsIC8qIDB4M0MtMHgzRiAqLworCTB4OTksIDB4QkQsIDB4OEYsIDB4NUMsIDB4MDAsIDB4MDAsIDB4OTAsIDB4RTcsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4QkYsIDB4OTksIDB4QkUsIDB4OEYsIDB4QTEsIC8qIDB4NDQtMHg0NyAqLworCTB4OEMsIDB4REYsIDB4OTksIDB4QzEsIDB4OTQsIDB4QkMsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4OTQsIDB4REEsIDB4OTEsIDB4QjIsIDB4OTEsIDB4RUMsIC8qIDB4NTAtMHg1MyAqLworCTB4OEIsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4RUMsIC8qIDB4NTQtMHg1NyAqLworCTB4OTIsIDB4NTAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4OEUsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4OTYsIDB4NkQsIDB4MDAsIDB4MDAsIDB4OTksIDB4QzQsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4OTAsIDB4RTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4NTQsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTksIDB4QzYsIDB4ODksIDB4NEIsIC8qIDB4NkMtMHg2RiAqLworCTB4ODgsIDB4RjMsIDB4OEEsIDB4RUIsIDB4RUQsIDB4NkYsIDB4OTEsIDB4QTYsIC8qIDB4NzAtMHg3MyAqLworCTB4OEIsIDB4NzAsIDB4OTcsIDB4OTEsIDB4MDAsIDB4MDAsIDB4OTksIDB4QzksIC8qIDB4NzQtMHg3NyAqLworCTB4ODksIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTksIDB4QzgsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4QTgsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTksIDB4Q0EsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4OTYsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4NzAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTksIDB4Q0IsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4OTcsIDB4RDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4RkEsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4QjQsIC8qIDB4OUMtMHg5RiAqLworCTB4OTksIDB4Q0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4Q0UsIDB4OTksIDB4Q0QsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4OTAsIDB4N0UsIDB4ODksIDB4NTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4N0QsIDB4OTksIDB4Q0YsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4OTksIDB4RDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4NzEsIDB4OEMsIDB4QjUsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTksIDB4RDEsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4OEUsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4NTEsIDB4OTksIDB4RDIsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4OTYsIDB4OTQsIDB4OEQsIDB4QjMsIDB4OEIsIDB4NzksIDB4OTcsIDB4NDYsIC8qIDB4QzgtMHhDQiAqLworCTB4OTEsIDB4NkYsIDB4OTQsIDB4QkQsIDB4OEUsIDB4RkIsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4OEYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4OEUsIDB4RTYsIDB4OEUsIDB4RjMsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4OEYsIDB4OTYsIDB4MDAsIDB4MDAsIDB4OTQsIDB4QkUsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4NzIsIDB4MDAsIDB4MDAsIDB4OTksIDB4RDUsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4NjIsIDB4OTEsIDB4NzAsIDB4OEMsIDB4RkIsIC8qIDB4RTAtMHhFMyAqLworCTB4OEMsIDB4QzMsIDB4OEIsIDB4RTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4OTksIDB4RDksIDB4OTIsIDB4NDAsIDB4OTEsIDB4RkMsIDB4OEIsIDB4QTksIC8qIDB4RTgtMHhFQiAqLworCTB4OEYsIDB4QTIsIDB4OTksIDB4REEsIDB4OTksIDB4RDgsIDB4ODksIDB4QzIsIC8qIDB4RUMtMHhFRiAqLworCTB4OTEsIDB4RTQsIDB4OEUsIDB4QjYsIDB4OEUsIDB4NkEsIDB4ODksIDB4NDUsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4OTAsIDB4OEQsIDB4ODYsIC8qIDB4RjQtMHhGNyAqLworCTB4OEUsIDB4NjksIDB4MDAsIDB4MDAsIDB4OTksIDB4REIsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzU0WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHg5OSwgMHhEQywgMHgwMCwgMHgwMCwgMHg4QiwgMHg2OCwgLyogMHgwMC0weDAzICovCisJMHg4QSwgMHg2NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHg4RCwgMHg4NywgMHg4QiwgMHg2NywgMHg5MiwgMHhERCwgMHg4OSwgMHg0NCwgLyogMHgwOC0weDBCICovCisJMHg5MywgMHhBRiwgMHg5NiwgMHhCQywgMHg4RCwgMHg0MCwgMHg5NywgMHg5OSwgLyogMHgwQy0weDBGICovCisJMHg5MywgMHg2NiwgMHg4QywgMHhGQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHg0RSwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHhFNSwgMHgwMCwgMHgwMCwgMHg4QiwgMHhFMSwgLyogMHgxQy0weDFGICovCisJMHg5NiwgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHhEQiwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHhFNCwgMHgwMCwgMHgwMCwgMHg4QSwgMHhEQywgLyogMHgyOC0weDJCICovCisJMHg5OSwgMHhERiwgMHg5OSwgMHhFMCwgMHg5OSwgMHhFMiwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHhFMywgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHg4QiwgMHg3QSwgMHg5MCwgMHg4MSwgMHgwMCwgMHgwMCwgMHg5NSwgMHhBQiwgLyogMHgzOC0weDNCICovCisJMHg5OSwgMHhFMSwgMHg5OSwgMHhERCwgMHg4QywgMHhFMSwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHg5OSwgMHhERSwgMHgwMCwgMHgwMCwgMHg5OCwgMHg0MywgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHhGMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHg5MiwgMHhFNiwgMHg4QywgMHhFMCwgMHg4RCwgMHg5MCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHhFNiwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHhEQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHhFQSwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHg4RSwgMHhGQywgMHgwMCwgMHgwMCwgMHg4RSwgMHhGNCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHg5OSwgMHhFRCwgMHg5OSwgMHhFQiwgMHgwMCwgMHgwMCwgMHg5NiwgMHhBMSwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHhFOCwgMHg5OSwgMHhGMSwgMHg5OSwgMHhFQywgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHhFRiwgLyogMHg3OC0weDdCICovCisJMHg4QywgMHhDNCwgMHg5NiwgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHg5OSwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHg5OSwgMHhGMiwgMHgwMCwgMHgwMCwgMHg5OSwgMHhGNCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHg3NSwgMHg4RCwgMHhFRSwgLyogMHg4OC0weDhCICovCisJMHg5OCwgMHg2MSwgMHgwMCwgMHgwMCwgMHg5OSwgMHhFOSwgMHg5OSwgMHhFNywgLyogMHg4Qy0weDhGICovCisJMHg5OSwgMHhGMywgMHgwMCwgMHgwMCwgMHg5OSwgMHhFRSwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhFRCwgMHg3NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHhGNiwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHg5QSwgMHg0MiwgMHg5OSwgMHhGOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHg5OSwgMHhGQywgMHhFRCwgMHg3NiwgMHgwMCwgMHgwMCwgMHg5QSwgMHg0MCwgLyogMHhBOC0weEFCICovCisJMHg5OSwgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHg1RCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RCwgMHhFNywgMHg4QSwgMHg1MCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHg5OSwgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHg5QSwgMHg0NCwgMHg4OCwgMHhGNCwgMHg5QSwgMHg0MywgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHg4OCwgMHhBMywgMHg5NSwgMHg2OSwgMHg5QSwgMHg0MSwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHg5OSwgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHhGNSwgLyogMHhDNC0weEM3ICovCisJMHg5OSwgMHhGQiwgMHg4RCwgMHhDNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHg5QSwgMHg0NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHg4OCwgMHhGNSwgMHg5QSwgMHg0RSwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHg5QSwgMHg0NiwgMHg5QSwgMHg0NywgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHg4RiwgMHhBMywgMHg5NiwgMHg4OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHg5QSwgMHg0QywgMHg5QSwgMHg0QiwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHg0RSwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHg0RCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHg5QSwgMHg0QSwgMHgwMCwgMHgwMCwgMHhFRCwgMHg3NywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTVbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDg5LCAweDUzLCAweDAwLCAweDAwLCAweDhELCAweEI0LCAweDkwLCAweDRGLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweDQ4LCAvKiAweDBDLTB4MEYgKi8KKwkweDkzLCAweDgyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDlBLCAweDQ5LCAweDAwLCAweDAwLCAweDg4LCAweEEwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweDUzLCAweDk3LCAweDQyLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweEE1LCAweDAwLCAweDAwLCAweDlBLCAweDU5LCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDlBLCAweDU4LCAweDlBLCAweDRGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweEMxLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDlBLCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDkxLCAweEVELCAweDlBLCAweDU1LCAweDhGLCAweEE0LCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDlBLCAweDUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweEUyLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweDVCLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweDU2LCAweDlBLCAweDU3LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDlBLCAweDU0LCAweDlBLCAweDVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweDUxLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweDYwLCAvKiAweDc4LTB4N0IgKi8KKwkweDlBLCAweDY1LCAweDAwLCAweDAwLCAweDlBLCAweDYxLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDlBLCAweDVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweDY2LCAvKiAweDgwLTB4ODMgKi8KKwkweDkxLCAweDUwLCAweDAwLCAweDAwLCAweEVELCAweDc4LCAweDlBLCAweDY4LCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDhELCAweDQxLCAweDlBLCAweDVFLCAweDkyLCAweDlELCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDlBLCAweDYyLCAweDlBLCAweDVCLCAweDhBLCAweEFCLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDhBLCAweEVDLCAweDhBLCAweDg1LCAweDlBLCAweDYzLCAweDlBLCAweDVGLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweDk2LCAvKiAweEE0LTB4QTcgKi8KKwkweDlBLCAweDY5LCAweDlBLCAweDY3LCAweDkxLCAweDcyLCAweDhCLCAweDY5LCAvKiAweEE4LTB4QUIgKi8KKwkweDhCLCAweEFBLCAweDAwLCAweDAwLCAweDlBLCAweDY0LCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDhCLCAweEYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDYzLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDlBLCAweDZELCAweDlBLCAweDZCLCAweDAwLCAweDAwLCAweDlBLCAweEE1LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDlBLCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweDZBLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDlBLCAweDZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweDZDLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDZCLCAvKiAweEUwLTB4RTMgKi8KKwkweDlBLCAweDZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweDcyLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDlBLCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDlBLCAweDc1LCAweDlBLCAweDc0LCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181Nls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4NTEsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4OUEsIDB4NzEsIDB4MDAsIDB4MDAsIDB4OUEsIDB4NzMsIDB4OEYsIDB4QTYsIC8qIDB4MTQtMHgxNyAqLworCTB4ODksIDB4NTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4NzYsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4REMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4ODIsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4OEYsIDB4RkEsIDB4OUEsIDB4N0QsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4OUEsIDB4N0IsIDB4MDAsIDB4MDAsIDB4OUEsIDB4N0MsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4OUEsIDB4N0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4NUMsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4OTEsIDB4NTgsIDB4MDAsIDB4MDAsIDB4OUEsIDB4NzgsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4OUEsIDB4NzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4OUEsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4OUEsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4OEEsIDB4RUQsIDB4MDAsIDB4MDAsIDB4OUEsIDB4ODQsIDB4OUEsIDB4ODAsIC8qIDB4NjgtMHg2QiAqLworCTB4OUEsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4OTUsIDB4QUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4OTMsIDB4RDMsIDB4MDAsIDB4MDAsIDB4OTQsIDB4QjYsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OUEsIDB4ODYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4ODUsIDB4OEEsIDB4NjQsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4ODcsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4OEEsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4OUEsIDB4ODksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4OUEsIDB4ODgsIDB4MDAsIDB4MDAsIDB4OTQsIDB4NTgsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4OUEsIDB4OEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4OEMsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4OUEsIDB4OEUsIDB4MDAsIDB4MDAsIDB4OUEsIDB4OEQsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4OUEsIDB4OTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4OUEsIDB4OTMsIDB4OUEsIDB4OTEsIDB4OUEsIDB4OEYsIDB4OUEsIDB4OTIsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4OUEsIDB4OTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4OTUsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4OUEsIDB4OTYsIDB4MDAsIDB4MDAsIDB4OUEsIDB4OTcsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4OTgsIC8qIDB4RDQtMHhENyAqLworCTB4OTksIDB4NjQsIDB4MDAsIDB4MDAsIDB4OEUsIDB4RkEsIDB4OEUsIDB4NkMsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4ODgsIDB4RjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4NjMsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4OTksIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4OEQsIDB4QTIsIDB4MDAsIDB4MDAsIDB4ODgsIDB4Q0QsIDB4OTAsIDB4N0QsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4OUEsIDB4OUEsIDB4OEMsIDB4QzUsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4OTEsIDB4MDAsIDB4MDAsIDB4OUEsIDB4OUMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzU3WzUxMl0gPSB7CisJMHg5QSwgMHg5QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHhERSwgLyogMHgwMC0weDAzICovCisJMHg5QSwgMHg5RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHg5QSwgMHg5RiwgMHg5QSwgMHg5RSwgMHgwMCwgMHgwMCwgMHg5QSwgMHhBMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHg5QSwgMHhBMSwgMHgwMCwgMHgwMCwgMHg4QywgMHg5NywgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHg4MCwgMHg5QSwgMHhBMiwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHhBNCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHg5QSwgMHhBMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHg5QSwgMHhBNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHg3OSwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHhBNywgMHg4OCwgMHhCMywgLyogMHgyNC0weDI3ICovCisJMHg4RCwgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHg4QywgMHg1QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHg5MiwgMHg2RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHhBOCwgLyogMHgzNC0weDM3ICovCisJMHg5QSwgMHhBOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHhBQiwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHg5QSwgMHhBQywgMHgwMCwgMHgwMCwgMHg4RCwgMHhFMiwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHhDRiwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg1NiwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHhBQSwgMHg5QSwgMHhBRCwgLyogMHg0Qy0weDRGICovCisJMHg4RCwgMHhCRiwgMHg4RCwgMHg0MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHg3OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHg5QSwgMHhCMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHg4RCwgMHhBMywgMHhFRCwgMHg3QSwgMHg5MiwgMHg1MiwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHg5QSwgMHhBRSwgMHg5MiwgMHhEOCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHhCMiwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg4MiwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHg5QSwgMHhCMCwgMHg5QSwgMHhCMywgMHgwMCwgMHgwMCwgMHg4QywgMHg1RSwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHhCNCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHg5QSwgMHhCNSwgMHgwMCwgMHgwMCwgMHg4RCwgMHg0MywgMHg4QSwgMHg1RiwgLyogMHhBMC0weEEzICovCisJMHg5QSwgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHhCOCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhFRCwgMHg3QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHg5QSwgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHhCNiwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHg5QSwgMHhBRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHhCQSwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHhCQiwgMHhFRCwgMHg3RCwgLyogMHhDNC0weEM3ICovCisJMHhFRCwgMHg3QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg4NCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHhFOSwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHhCRCwgMHg5QSwgMHhCRSwgLyogMHhEMC0weEQzICovCisJMHg5QSwgMHhCQywgMHgwMCwgMHgwMCwgMHg5QSwgMHhDMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHg5NCwgMHg1NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHhFNiwgLyogMHhEQy0weERGICovCisJMHg5NSwgMHg3NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHhDMSwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHg4RiwgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHhCNywgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHg3QywgMHg4QSwgMHhFRSwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHg4RCwgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNThbNTEyXSA9IHsKKwkweDk2LCAweDc4LCAweDAwLCAweDAwLCAweDkzLCAweEIwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDhDLCAweDk4LCAweDkxLCAweENELCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweEJGLCAweDlBLCAweEMyLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDkxLCAweEMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDlBLCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDlBLCAweEM0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDlBLCAweEM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDkyLCAweEU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweEFDLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDlGLCAvKiAweDJDLTB4MkYgKi8KKwkweDg5LCAweDgxLCAweDk1LCAweEYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDhGLCAweEVBLCAweDkzLCAweDY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweEU0LCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDlBLCAweENDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDk1LCAweEJCLCAweDk3LCAweERCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweEYyLCAweDlBLCAweEM4LCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDkxLCAweDU5LCAweDlBLCAweENCLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDkzLCAweDgzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweDY4LCAvKiAweDU0LTB4NTcgKi8KKwkweDkzLCAweDg0LCAweDk0LCAweEI3LCAweDkyLCAweENCLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweEM3LCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweEM3LCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDg5LCAweDk2LCAweDAwLCAweDAwLCAweDkzLCAweDU1LCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDlBLCAweEM5LCAweDAwLCAweDAwLCAweDlBLCAweEM1LCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweDZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDlBLCAweENELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweDZELCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweEFCLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDlBLCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweEU2LCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweDlELCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDkyLCAweEM0LCAweDAwLCAweDAwLCAweEVELCAweDgxLCAweDlBLCAweEQwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDk2LCAweDZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweEQxLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweEQ2LCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweDgyLCAweDk1LCAweEFELCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDlBLCAweEQ1LCAweDlBLCAweENGLCAweDlBLCAweEQyLCAweDlBLCAweEQ0LCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweEE0LCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweEM3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDlBLCAweEQ3LCAweDAwLCAweDAwLCAweDkyLCAweDY0LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweEYzLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDhGLCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDlBLCAweEQ5LCAweDAwLCAweDAwLCAweDlBLCAweEQ4LCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDhELCAweDg4LCAweDAwLCAweDAwLCAweDlBLCAweERBLCAvKiAweEQ0LTB4RDcgKi8KKwkweDlBLCAweERDLCAweDlBLCAweERCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDlBLCAweERFLCAweDAwLCAweDAwLCAweDlBLCAweEQzLCAweDlBLCAweEUwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDlBLCAweERGLCAweDlBLCAweERELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDZELCAvKiAweEU4LTB4RUIgKi8KKwkweDkwLCAweDcwLCAweDAwLCAweDAwLCAweDkxLCAweDczLCAweDlBLCAweEUxLCAvKiAweEVDLTB4RUYgKi8KKwkweDkwLCAweEJBLCAweDg4LCAweEVCLCAweDk0LCAweDg0LCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweEQ5LCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDlBLCAweEUzLCAweDlBLCAweEUyLCAweDlBLCAweEU0LCAvKiAweEY4LTB4RkIgKi8KKwkweDlBLCAweEU1LCAweDlBLCAweEU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181OVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4RTcsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4Q0YsIDB4OUEsIDB4RTgsIDB4RUQsIDB4ODMsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4QzQsIC8qIDB4MEMtMHgwRiAqLworCTB4OUEsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4OTcsIDB4NUIsIDB4OEEsIDB4NEYsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4OTksIDB4QzcsIDB4OEYsIDB4NjcsIDB4OTEsIDB4QkQsIDB4OUEsIDB4RUEsIC8qIDB4MTgtMHgxQiAqLworCTB4OTYsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4QjIsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4OUEsIDB4RUMsIDB4MDAsIDB4MDAsIDB4OTEsIDB4RTUsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4NTYsIDB4OTEsIDB4QkUsIDB4OTUsIDB4NzYsIC8qIDB4MjgtMHgyQiAqLworCTB4OUEsIDB4RUQsIDB4OUEsIDB4RUUsIDB4ODksIDB4OUIsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4OEUsIDB4QjgsIDB4OUEsIDB4RUYsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4Q0UsIC8qIDB4MzQtMHgzNyAqLworCTB4OUEsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4ODksIDB4ODIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4RUYsIC8qIDB4NDQtMHg0NyAqLworCTB4OTMsIDB4REUsIDB4OTUsIDB4RjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4RjUsIDB4OTEsIDB4NzQsIC8qIDB4NEMtMHg0RiAqLworCTB4OUEsIDB4RjQsIDB4OEMsIDB4NUYsIDB4MDAsIDB4MDAsIDB4RUQsIDB4ODQsIC8qIDB4NTAtMHg1MyAqLworCTB4OTYsIDB4N0EsIDB4OUEsIDB4RjMsIDB4MDAsIDB4MDAsIDB4OTMsIDB4ODUsIC8qIDB4NTQtMHg1NyAqLworCTB4OUEsIDB4RjcsIDB4MDAsIDB4MDAsIDB4OUEsIDB4RjYsIDB4RUQsIDB4ODUsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4ODYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4OUEsIDB4RjksIDB4MDAsIDB4MDAsIDB4OUEsIDB4RjgsIDB4RUQsIDB4ODcsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4OUMsIDB4MDAsIDB4MDAsIDB4OUEsIDB4RkEsIC8qIDB4NjQtMHg2NyAqLworCTB4OEYsIDB4QTcsIDB4OUEsIDB4RkMsIDB4OTIsIDB4NDQsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4OUEsIDB4RkIsIDB4MDAsIDB4MDAsIDB4OTUsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4OTcsIC8qIDB4NzAtMHg3MyAqLworCTB4OTMsIDB4N0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4OUIsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4OUIsIDB4NDEsIDB4OTQsIDB4NDAsIDB4OTQsIDB4REMsIC8qIDB4ODAtMHg4MyAqLworCTB4OTYsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4NDQsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4OUIsIDB4NEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4NTcsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4NjQsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4OTYsIDB4QUQsIDB4MDAsIDB4MDAsIDB4OUIsIDB4QUEsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4OUIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4NDUsIC8qIDB4QTAtMHhBMyAqLworCTB4RUQsIDB4ODgsIDB4OTEsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4OTYsIDB4NTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4OTMsIDB4NjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4NDYsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4OTYsIDB4ODUsIDB4RUQsIDB4ODksIDB4OEQsIDB4QzgsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4QTgsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4NDcsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4OEUsIDB4NkYsIDB4MDAsIDB4MDAsIDB4OEUsIDB4NkUsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4ODgsIDB4QjcsIDB4OEMsIDB4QzYsIDB4MDAsIDB4MDAsIDB4OTAsIDB4QTksIC8qIDB4RDAtMHhEMyAqLworCTB4ODgsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4OUIsIDB4NEIsIDB4OUIsIDB4NEMsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4OUIsIDB4NDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4NTcsIDB4OEEsIDB4QUQsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4OUIsIDB4NDgsIDB4MDAsIDB4MDAsIDB4OTYsIDB4QzMsIDB4OTUsIDB4NTAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4RjcsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4NzAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzVBWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHg4OCwgMHhEMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHhBMSwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHg5QiwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHg5QiwgMHg0RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHg5NiwgMHhCQSwgMHgwMCwgMHgwMCwgMHg5QiwgMHg1MiwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHg5QiwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHg0RSwgLyogMHgxQy0weDFGICovCisJMHg5MCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHg5QiwgMHg0RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHhEOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHhFMiwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHg5QiwgMHg1NiwgMHg5QiwgMHg1NywgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHg4RiwgMHhBOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHg5QiwgMHg1MywgMHg5OCwgMHg0QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHg2QiwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHg5QiwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RCwgMHhBNSwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHg1OCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHg3NywgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHg1OSwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHg5QiwgMHg1NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHhCOSwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHg3RCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHg1QSwgMHg5NSwgMHg1MSwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHg5QiwgMHg1QiwgMHg5QiwgMHg1RiwgMHg5QiwgMHg1QywgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHg4OSwgMHhDNSwgMHg5QiwgMHg1RSwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHg4RSwgMHhCOSwgMHgwMCwgMHgwMCwgMHg5QiwgMHg1RCwgLyogMHhDOC0weENCICovCisJMHg4QywgMHg5OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHg5QiwgMHg2QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHg2NCwgMHg5QiwgMHg2MSwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHg5MiwgMHg4NCwgMHgwMCwgMHgwMCwgMHg5QiwgMHg2MCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHg2MiwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHg5QiwgMHg2MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHg2NSwgMHg5QiwgMHg2NiwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNUJbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDhBLCAweEYwLCAweDAwLCAweDAwLCAweDlCLCAweDY4LCAvKiAweDA4LTB4MEIgKi8KKwkweDlCLCAweDY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweDY5LCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweEVDLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweDZDLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDkyLCAweERBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDg5LCAweDY0LCAweDAwLCAweDAwLCAweDlCLCAweDZBLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweDZELCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweDZFLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDlCLCAweDcxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweDZGLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDlCLCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDhFLCAweDcxLCAweDlCLCAweDcyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDhELCAweDQ1LCAweDlCLCAweDczLCAweEVELCAweDhBLCAweDhFLCAweDlBLCAvKiAweDU0LTB4NTcgKi8KKwkweDkxLCAweEI2LCAweDAwLCAweDAwLCAweDlCLCAweDc0LCAweDlCLCAweDc1LCAvKiAweDU4LTB4NUIgKi8KKwkweDhFLCAweDc5LCAweDhELCAweDQ2LCAweDAwLCAweDAwLCAweDk2LCAweEQwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweDQ3LCAvKiAweDYwLTB4NjMgKi8KKwkweDhDLCAweEM3LCAweDlCLCAweDc2LCAweDhBLCAweDc3LCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDlCLCAweDc3LCAweDAwLCAweDAwLCAweDkxLCAweEI3LCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDlCLCAweDc4LCAweDlCLCAweEExLCAweDAwLCAweDAwLCAweDlCLCAweDc5LCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDlCLCAweDdBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDlCLCAweDdCLCAweDAwLCAweDAwLCAweDlCLCAweDdELCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDlCLCAweDdFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweDgwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDkxLCAweEVFLCAweDAwLCAweDAwLCAweDg5LCAweDQ2LCAvKiAweDg0LTB4ODcgKi8KKwkweDhFLCAweEU3LCAweDg4LCAweEMwLCAweDAwLCAweDAwLCAweDkxLCAweDc2LCAvKiAweDg4LTB4OEIgKi8KKwkweDhBLCAweEFFLCAweDhFLCAweEIzLCAweDAwLCAweDAwLCAweDhELCAweDQ3LCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDkzLCAweDg2LCAweDAwLCAweDAwLCAweDhGLCAweDQwLCAvKiAweDk0LTB4OTcgKi8KKwkweDhBLCAweEFGLCAweDkyLCAweDg4LCAweDkyLCAweEU4LCAweDg4LCAweEI2LCAvKiAweDk4LTB4OUIgKi8KKwkweDhCLCAweDU4LCAweDk1LCAweEYzLCAweDAwLCAweDAwLCAweDhFLCAweEMwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweDcxLCAweDkwLCAweEU5LCAvKiAweEEwLTB4QTMgKi8KKwkweDhFLCAweEJBLCAweDk3LCAweDQ3LCAweDlCLCAweDgxLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweDdCLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDhELCAweEM5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweDUxLCAvKiAweEIwLTB4QjMgKi8KKwkweDg5LCAweDgzLCAweDhGLCAweEFBLCAweDg5LCAweEM2LCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDlCLCAweDgyLCAweDk3LCAweDY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweDY4LCAvKiAweEJDLTB4QkYgKi8KKwkweEVELCAweDhCLCAweDAwLCAweDAwLCAweDhFLCAweEUyLCAweDlCLCAweDgzLCAvKiAweEMwLTB4QzMgKi8KKwkweDhBLCAweEYxLCAweDkzLCAweEQwLCAweDk2LCAweEE3LCAweDlCLCAweDg0LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDlCLCAweDg1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDk1LCAweDc4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDlCLCAweDg3LCAweDAwLCAweDAwLCAweDhBLCAweEE2LCAweDhCLCAweEY1LCAvKiAweEQwLTB4RDMgKi8KKwkweDlCLCAweDg2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEVELCAweDhELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweEIwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweDUxLCAweDlCLCAweDhCLCAweDhFLCAweDQwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDg5LCAweEM3LCAweDlCLCAweDhBLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDlCLCAweDg4LCAweDlCLCAweDhDLCAweDlCLCAweDg5LCAweDk0LCAweDRBLCAvKiAweEU0LTB4RTcgKi8KKwkweDlFLCAweENCLCAweDkwLCAweDUyLCAweDAwLCAweDAwLCAweDlCLCAweDhELCAvKiAweEU4LTB4RUIgKi8KKwkweEVELCAweDhFLCAweDAwLCAweDAwLCAweDk3LCAweEJFLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDlCLCAweDhFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweDkwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweDlFLCAweDlCLCAweDhGLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDkwLCAweEExLCAweDAwLCAweDAwLCAweDhFLCAweDlCLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweENFLCAweDhFLCAweEY1LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181Q1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4OTUsIDB4OTUsIDB4OTAsIDB4RUEsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4OEUsIDB4Q0IsIDB4OUIsIDB4OTEsIDB4OEYsIDB4QUIsIDB4OUIsIDB4OTIsIC8qIDB4MDQtMHgwNyAqLworCTB4OUIsIDB4OTMsIDB4ODgsIDB4RDEsIDB4OTEsIDB4QjgsIDB4OTAsIDB4NzEsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4OUIsIDB4OTQsIDB4OTMsIDB4QjEsIDB4OEYsIDB4QUMsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4OEYsIDB4QUQsIDB4MDAsIDB4MDAsIDB4OUIsIDB4OTUsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4RUIsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4QUUsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4OEYsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4OUIsIDB4OTYsIDB4MDAsIDB4MDAsIDB4OUIsIDB4OTcsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4OTYsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4OUIsIDB4OTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4OEIsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4OEYsIDB4NDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4OUIsIDB4OTksIDB4OUIsIDB4OUEsIDB4OEUsIDB4REEsIDB4OTAsIDB4NEIsIC8qIDB4MzgtMHgzQiAqLworCTB4OTMsIDB4RjIsIDB4OTAsIDB4NzMsIDB4OTQsIDB4RjYsIDB4OTQsIDB4NDEsIC8qIDB4M0MtMHgzRiAqLworCTB4OEIsIDB4QzcsIDB4OUIsIDB4OUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4OEIsIDB4OEYsIDB4OUIsIDB4OUMsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4OEIsIDB4RkMsIDB4MDAsIDB4MDAsIDB4OTMsIDB4Q0QsIDB4ODksIDB4QUUsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4OEUsIDB4NzIsIDB4OUIsIDB4OUQsIDB4OUIsIDB4QTAsIC8qIDB4NEMtMHg0RiAqLworCTB4OUIsIDB4OUYsIDB4OEIsIDB4RkIsIDB4MDAsIDB4MDAsIDB4OUIsIDB4OUUsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4NTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4QUUsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4OTMsIDB4NkEsIDB4OEUsIDB4QzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4OTEsIDB4NzcsIDB4OTcsIDB4OUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4OUIsIDB4QTIsIDB4MDAsIDB4MDAsIDB4OUIsIDB4QTMsIDB4OTMsIDB4RDQsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4OEUsIDB4NTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4QTUsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4OUIsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4OUIsIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4OEEsIDB4RjIsIDB4OUIsIDB4QTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4OUIsIDB4QTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4OTAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4OTEsIDB4NUEsIDB4OEEsIDB4RTIsIDB4MDAsIDB4MDAsIDB4OUIsIDB4QUIsIC8qIDB4QTgtMHhBQiAqLworCTB4OTYsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4OTEsIDB4RDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4NzgsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4QUQsIDB4OUIsIDB4QUYsIC8qIDB4QjQtMHhCNyAqLworCTB4OEEsIDB4REQsIDB4MDAsIDB4MDAsIDB4RUQsIDB4OTEsIDB4OUIsIDB4QUMsIC8qIDB4QjgtMHhCQiAqLworCTB4OUIsIDB4QUUsIDB4MDAsIDB4MDAsIDB4OUIsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4OUIsIDB4QjAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4QjIsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4OUIsIDB4QjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4OTMsIDB4QkIsIDB4OEIsIDB4QUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4ODksIDB4RTMsIDB4OUIsIDB4QjQsIDB4OUIsIDB4QjksIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4OUIsIDB4QjcsIDB4MDAsIDB4MDAsIDB4OTUsIDB4RjUsIC8qIDB4RUMtMHhFRiAqLworCTB4OTUsIDB4RjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4OTIsIDB4OTMsIDB4ODcsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4QjYsIDB4OEYsIDB4NzMsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4OUIsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzVEWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg5MiwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHhCQSwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RCwgMHhFOCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHg5QiwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHg5QiwgMHhDMSwgMHg5QiwgMHhCQiwgMHg4QSwgMHg1MiwgMHg5QiwgMHhCQywgLyogMHgxNC0weDE3ICovCisJMHg5QiwgMHhDNSwgMHg5QiwgMHhDNCwgMHg5QiwgMHhDMywgMHg5QiwgMHhCRiwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHhCRSwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHhDMiwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHg5MywgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHhGNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHg5NiwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHhDOSwgLyogMHg0OC0weDRCICovCisJMHg5QiwgMHhDNiwgMHgwMCwgMHgwMCwgMHg5QiwgMHhDOCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHg5NywgMHg5MiwgMHgwMCwgMHgwMCwgMHg5QiwgMHhDNywgMHhFRCwgMHg5NCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHg5QiwgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHg5MCwgMHg5MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHg5QiwgMHhDQSwgMHhFRCwgMHg5NywgMHgwMCwgMHgwMCwgMHg4RCwgMHhCNSwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHhDQiwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHhDQywgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHhDRiwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHg5QiwgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHhDRCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHg4OCwgLyogMHg4OC0weDhCICovCisJMHg5QiwgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHg5QiwgMHhENSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHg5QiwgMHhEMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHhEMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHg5QiwgMHhEMiwgMHgwMCwgMHgwMCwgMHg5QiwgMHhEMywgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHhENiwgLyogMHhCNC0weEI3ICovCisJMHhFRCwgMHg5OCwgMHhFRCwgMHg5OSwgMHg5NywgMHhFNCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHg5QiwgMHhENywgMHg5QiwgMHhENCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHg5QiwgMHhEOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHg4QSwgMHhERSwgMHg5QiwgMHhEOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHhFRCwgMHg5QSwgMHgwMCwgMHgwMCwgMHg5QiwgMHhEQiwgMHg5QiwgMHhEQSwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHhEQywgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHhERCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHg5MCwgMHhFQywgMHg4RiwgMHg0MiwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHg4RiwgMHg4NCwgMHgwMCwgMHgwMCwgMHg5MSwgMHg4MywgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHg4RCwgMHg0OCwgMHg4RCwgMHhCNiwgMHg4RCwgMHg0OSwgLyogMHhFNC0weEU3ICovCisJMHg4QiwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHhERSwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RCwgMHhCNywgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHg4QywgMHhDOCwgMHg5QiwgMHhERiwgMHg5NiwgMHhBNCwgLyogMHhGMC0weEYzICovCisJMHg5NCwgMHg2MiwgMHg5QiwgMHhFMCwgMHgwMCwgMHgwMCwgMHg4RCwgMHg0QSwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHhBQSwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHg5MiwgMHg0NiwgMHg4QiwgMHhEMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNUVbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDczLCAweDk1LCAweDdBLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweEJGLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweEUxLCAvKiAweDA4LTB4MEIgKi8KKwkweDhBLCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDlCLCAweEU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDlGLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDlCLCAweEUzLCAweDlCLCAweEUyLCAweDlCLCAweEU1LCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweDgzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDc0LCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweEM4LCAweDAwLCAweDAwLCAweDkxLCAweEQxLCAvKiAweDJDLTB4MkYgKi8KKwkweDhCLCAweDQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweEEwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweEU2LCAweDlCLCAweEU3LCAvKiAweDM0LTB4MzcgKi8KKwkweDhGLCAweEVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDk2LCAweDU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDlCLCAweEVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweEU5LCAvKiAweDQwLTB4NDMgKi8KKwkweDlCLCAweEU4LCAweDk1LCAweDlELCAweDAwLCAweDAwLCAweDlCLCAweEYxLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDk2LCAweDc5LCAweDAwLCAweDAwLCAweDlCLCAweEVCLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDlCLCAweEVELCAweDk2LCAweDhCLCAweDAwLCAweDAwLCAweDlCLCAweEVDLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweEVFLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweEE2LCAweDlCLCAweEVGLCAweDk1LCAweEJDLCAvKiAweDYwLTB4NjMgKi8KKwkweDlCLCAweEYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweEIxLCAweDk1LCAweEJELCAvKiAweDcwLTB4NzMgKi8KKwkweDk0LCAweDRFLCAweDlCLCAweEYyLCAweDlCLCAweEYzLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDhELCAweDRCLCAweDhBLCAweEIyLCAweDlCLCAweEY0LCAweDhDLCAweEI2LCAvKiAweDc4LTB4N0IgKi8KKwkweDk3LCAweDYzLCAweDk3LCAweDQ4LCAweDhBLCAweEY0LCAweDlCLCAweEY2LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDkyLCAweEExLCAweDAwLCAweDAwLCAweDhELCAweDRDLCAvKiAweDgwLTB4ODMgKi8KKwkweDhGLCAweEFGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweERELCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweEIwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweDk4LCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweEVBLCAweDk1LCAweEY3LCAweDkzLCAweDU4LCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweDRELCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDk1LCAweDdCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDlCLCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweDc4LCAweDhELCAweEMwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweEM5LCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDg4LCAweEMxLCAweDhGLCAweDhFLCAweDhELCAweDRFLCAvKiAweEI0LTB4QjcgKi8KKwkweDk3LCAweDY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDlCLCAweEY4LCAweDlCLCAweEY5LCAweDk0LCAweDcwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDlCLCAweEZBLCAweDk3LCAweEY1LCAweDk4LCAweDRDLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweEZDLCAvKiAweENDLTB4Q0YgKi8KKwkweDlCLCAweEZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweDY2LCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweDQwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweDQzLCAweDlDLCAweDQ0LCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDlDLCAweDQyLCAweDAwLCAweDAwLCAweDk1LCAweDVGLCAvKiAweERDLTB4REYgKi8KKwkweDhGLCAweEIxLCAweDlDLCAweDQ2LCAweDlDLCAweDQ1LCAweDlDLCAweDQxLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDlDLCAweDQ3LCAweDlDLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDlDLCAweDQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDlDLCAweDRDLCAweDlDLCAweDRBLCAweDAwLCAweDAwLCAweDlDLCAweDRCLCAvKiAweEYwLTB4RjMgKi8KKwkweDlDLCAweDRELCAweDAwLCAweDAwLCAweDg5LCAweDg0LCAweDkyLCAweEVDLCAvKiAweEY0LTB4RjcgKi8KKwkweDlDLCAweDRFLCAweDAwLCAweDAwLCAweDhDLCAweDlBLCAweDg5LCAweEY0LCAvKiAweEY4LTB4RkIgKi8KKwkweDk0LCAweDU1LCAweDAwLCAweDAwLCAweDlDLCAweDRGLCAweDkzLCAweEY5LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181Rls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4OTUsIDB4RDksIDB4MDAsIDB4MDAsIDB4OUMsIDB4NTAsIC8qIDB4MDAtMHgwMyAqLworCTB4OTgsIDB4NEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4OUMsIDB4NTEsIDB4OTUsIDB4QkUsIDB4OUMsIDB4NTQsIC8qIDB4MDgtMHgwQiAqLworCTB4OTgsIDB4OUYsIDB4OTgsIDB4QUYsIDB4MDAsIDB4MDAsIDB4OEUsIDB4QUUsIC8qIDB4MEMtMHgwRiAqLworCTB4OTMsIDB4RjMsIDB4OUMsIDB4NTUsIDB4MDAsIDB4MDAsIDB4OEIsIDB4N0MsIC8qIDB4MTAtMHgxMyAqLworCTB4OTIsIDB4QTIsIDB4ODgsIDB4RjgsIDB4OUMsIDB4NTYsIDB4OTUsIDB4QTQsIC8qIDB4MTQtMHgxNyAqLworCTB4OEQsIDB4NEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4NkYsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4RUQsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4OUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4OTYsIDB4RUQsIDB4OEMsIDB4QjcsIDB4OEMsIDB4Q0EsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4OUMsIDB4NTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4OUMsIDB4NTgsIDB4MDAsIDB4MDAsIDB4OUMsIDB4NUUsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4OEUsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4RUQsIDB4OUMsIDB4OTIsIDB4QTMsIDB4MDAsIDB4MDAsIDB4OEIsIDB4QUQsIC8qIDB4MzQtMHgzNyAqLworCTB4OUMsIDB4NTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4OTUsIDB4NEEsIDB4MDAsIDB4MDAsIDB4OTIsIDB4NjUsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4OUMsIDB4NUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4NEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4OUMsIDB4NUIsIDB4MDAsIDB4MDAsIDB4OEIsIDB4QUUsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4OUMsIDB4NUMsIDB4MDAsIDB4MDAsIDB4OUMsIDB4NUQsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4OUMsIDB4NUYsIDB4MDAsIDB4MDAsIDB4OTMsIDB4OTYsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4NjAsIDB4OUMsIDB4NjEsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4OUMsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4OUMsIDB4NTMsIDB4OUMsIDB4NTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4OUMsIDB4NjMsIDB4OEMsIDB4NjAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4NDYsIDB4RUQsIDB4OUQsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4Q0EsIDB4OTUsIDB4NTYsIDB4OTIsIDB4QTQsIC8qIDB4NjgtMHg2QiAqLworCTB4OTUsIDB4NkEsIDB4OUMsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4OEYsIDB4QjIsIDB4ODksIDB4NjUsIDB4MDAsIDB4MDAsIDB4OUMsIDB4NjUsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4NjYsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4OTYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4OTQsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4NjksIC8qIDB4N0MtMHg3RiAqLworCQorCTB4ODksIDB4OUQsIDB4OTAsIDB4QUEsIDB4OUMsIDB4NjgsIDB4OUMsIDB4NjcsIC8qIDB4ODAtMHg4MyAqLworCTB4OEMsIDB4NjEsIDB4OTEsIDB4RDIsIDB4MDAsIDB4MDAsIDB4OUMsIDB4NkQsIC8qIDB4ODQtMHg4NyAqLworCTB4OUMsIDB4NkIsIDB4MDAsIDB4MDAsIDB4OUMsIDB4NkEsIDB4OTcsIDB4QTUsIC8qIDB4ODgtMHg4QiAqLworCTB4OEMsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4OEYsIDB4OTksIDB4OUMsIDB4NkMsIDB4OTMsIDB4NkIsIDB4OEYsIDB4NUQsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4QkUsIC8qIDB4OTQtMHg5NyAqLworCTB4OUMsIDB4NzAsIDB4OUMsIDB4NkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4NkUsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4OUMsIDB4NzEsIDB4OEMsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4OUMsIDB4NzIsIDB4OTUsIDB4OUMsIDB4OEYsIDB4N0EsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4OUMsIDB4NzMsIDB4OTQsIDB4RjcsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4QkYsIC8qIDB4QjAtMHhCMyAqLworCTB4OTIsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4OUUsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4NEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4OUMsIDB4NzQsIDB4OEIsIDB4NEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4NTMsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4NEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4OEEsIDB4RjUsIDB4OTQsIDB4NDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4NzUsIDB4OEUsIDB4NzUsIC8qIDB4RDQtMHhENyAqLworCTB4OTYsIDB4NTksIDB4OTYsIDB4NUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4ODksIDB4OUUsIDB4OUMsIDB4N0EsIDB4RUQsIDB4OUYsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4OTIsIDB4ODksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4OUMsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4RjUsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4OUMsIDB4QUIsIDB4OUMsIDB4NzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4OTQsIDB4NEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4OUMsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4NzYsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4OUEsIDB4MDAsIDB4MDAsIDB4OUMsIDB4N0MsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzYwWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QywgMHg4MywgMHg5QywgMHg4OSwgLyogMHgwQy0weDBGICovCisJMHg5QywgMHg4MSwgMHgwMCwgMHgwMCwgMHg5MywgMHg3QiwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHg5QywgMHg4NiwgMHg5NSwgMHg3QywgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHg5QywgMHg4MCwgMHgwMCwgMHgwMCwgMHg5QywgMHg4NSwgLyogMHgxOC0weDFCICovCisJMHg5NywgMHhFNSwgMHg4RSwgMHg3NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHg5MSwgMHhEMywgMHg5QywgMHg3RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHg3RCwgMHg5QywgMHg4OCwgMHg5MCwgMHhBQiwgLyogMHgyNC0weDI3ICovCisJMHg4OSwgMHg4NSwgMHg5QywgMHg4MiwgMHg4OSwgMHhGNiwgMHg5QywgMHg4NywgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHhBRiwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHg5QywgMHg4NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QywgMHg4QSwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHg5QywgMHg4QywgMHg5QywgMHg5NiwgMHg5QywgMHg5NCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QywgMHg5MSwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QywgMHg5MCwgMHg5NywgMHhGNiwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHg5QywgMHg5MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHg4QiwgMHhCMCwgMHgwMCwgMHgwMCwgMHg4RCwgMHg1MCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHg4RiwgMHg5QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHg5QywgMHg5OSwgMHg5QywgMHg4QiwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhBMCwgMHgwMCwgMHgwMCwgMHg5QywgMHg4RiwgLyogMHg1Qy0weDVGICovCisJMHg5QywgMHg3RSwgMHgwMCwgMHgwMCwgMHg4OSwgMHhGOCwgMHg5QywgMHg5MywgLyogMHg2MC0weDYzICovCisJMHg5QywgMHg5NSwgMHg5MiwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHg4RCwgMHhBNiwgMHg4OSwgMHhCNiwgMHg5QywgMHg4RCwgMHg5QywgMHg5OCwgLyogMHg2OC0weDZCICovCisJMHg5QywgMHg5NywgMHg4QiwgMHhCMSwgMHgwMCwgMHgwMCwgMHg5MSwgMHhBNywgLyogMHg2Qy0weDZGICovCisJMHg4QSwgMHg4NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHg4QywgMHg2MiwgMHgwMCwgMHgwMCwgMHg5QywgMHg4RSwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHg5QywgMHg5QSwgMHgwMCwgMHgwMCwgMHg5QywgMHg5RCwgLyogMHg4MC0weDgzICovCisJMHg5QywgMHg5RiwgMHhFRCwgMHhBMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHg4RSwgMHhCQiwgMHhFRCwgMHhBMiwgMHg5QywgMHhBNSwgLyogMHg4OC0weDhCICovCisJMHg5MiwgMHhFRSwgMHg5QywgMHg5QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QywgMHhBMywgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHg4OSwgMHhGNywgMHgwMCwgMHgwMCwgMHg5QywgMHhBMSwgMHg5QywgMHhBMiwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QywgMHg5RSwgMHg5QywgMHhBMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHhFNSwgLyogMHg5Qy0weDlGICovCisJMHg5NywgMHg0OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHhCMywgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHg3OCwgMHg5QywgMHhBNCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHg1OSwgMHg4OCwgMHhBQiwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHhERiwgMHg5QywgMHg3QiwgLyogMHhCMC0weEIzICovCisJMHg5QywgMHhBQSwgMHg5QywgMHhBRSwgMHg5NiwgMHhFMywgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHg5QywgMHhBNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHg5MywgMHg4OSwgMHg5QywgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHg4RiwgMHhFRSwgMHg5QywgMHhBRCwgMHg5MywgMHhENSwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHg5OCwgMHg2NiwgMHgwMCwgMHgwMCwgMHg5QywgMHhBOSwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHg5QywgMHhBRiwgMHgwMCwgMHgwMCwgMHg4RCwgMHg5QiwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHg5MCwgMHhDOSwgMHgwMCwgMHgwMCwgMHhFRCwgMHhBMywgMHg4OCwgMHhEMiwgLyogMHhEQy0weERGICovCisJMHg5QywgMHhBOCwgMHg5QywgMHhBNiwgMHgwMCwgMHgwMCwgMHg5MSwgMHg3OSwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QywgMHg5QywgLyogMHhFNC0weEU3ICovCisJMHg4RSwgMHg1MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHg5MSwgMHhDNCwgMHg5QywgMHhCQiwgMHhFRCwgMHhBNiwgMHg5MSwgMHg3QSwgLyogMHhGMC0weEYzICovCisJMHg5QywgMHhCNiwgMHgwMCwgMHgwMCwgMHg5QywgMHhCMywgMHg5QywgMHhCNCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHg4RSwgMHhFNCwgMHg5QywgMHhCNywgMHg5QywgMHhCQSwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjFbNTEyXSA9IHsKKwkweDlDLCAweEI1LCAweDhGLCAweDQ0LCAweDAwLCAweDAwLCAweDlDLCAweEI4LCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweEIyLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDk2LCAweEZBLCAweDk2LCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDlDLCAweEJDLCAweDlDLCAweEJELCAweDg4LCAweEQzLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEVELCAweEE3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDlDLCAweEIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweEYwLCAweDg4LCAweEE0LCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweEI0LCAvKiAweDFDLTB4MUYgKi8KKwkweEVELCAweEE1LCAweDlDLCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweEMxLCAvKiAweDI0LTB4MjcgKi8KKwkweDlDLCAweEMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDlDLCAweEM1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEVELCAweEE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDlDLCAweEM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEE4LCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDlDLCAweEM0LCAweDlDLCAweEM3LCAweDlDLCAweEJGLCAweDlDLCAweEMzLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweEM4LCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDlDLCAweEM5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweEJFLCAvKiAweDQ0LTB4NDcgKi8KKwkweDhFLCAweDlDLCAweDAwLCAweDAwLCAweDlDLCAweEMyLCAweDkxLCAweEQ0LCAvKiAweDQ4LTB4NEIgKi8KKwkweDhELCAweDUxLCAweDlDLCAweEIwLCAweDkwLCAweDU0LCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweEQ2LCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweEU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDlDLCAweENDLCAweDlDLCAweENELCAweDlDLCAweENFLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDlDLCAweEQ1LCAweDAwLCAweDAwLCAweDlDLCAweEQ0LCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDlELCAweDhBLCAweEI1LCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDlDLCAweEQyLCAweDAwLCAweDAwLCAweDhDLCAweDY0LCAvKiAweDY0LTB4NjcgKi8KKwkweDhBLCAweDUzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweENGLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweEI2LCAweDlDLCAweEQxLCAvKiAweDZDLTB4NkYgKi8KKwkweDg4LCAweEQ0LCAweDlDLCAweEQzLCAweDAwLCAweDAwLCAweDlDLCAweENBLCAvKiAweDcwLTB4NzMgKi8KKwkweDlDLCAweEQwLCAweDlDLCAweEQ3LCAweDhDLCAweDYzLCAweDlDLCAweENCLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweDdDLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweDRBLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweERBLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweERFLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweDlFLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDk3LCAweEY3LCAweDlDLCAweERGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDlDLCAweERDLCAweDAwLCAweDAwLCAweDlDLCAweEQ5LCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweEVELCAweEFBLCAweDlDLCAweEQ4LCAweDlDLCAweERELCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDk1LCAweEFFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweEIyLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDhDLCAweDY1LCAweDAwLCAweDAwLCAweDlDLCAweEUwLCAvKiAweEE4LTB4QUIgKi8KKwkweDlDLCAweERCLCAweDAwLCAweDAwLCAweDlDLCAweEUxLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweDlCLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweEFGLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweEU5LCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweEI2LCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweEU3LCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweEU4LCAweDhELCAweEE3LCAvKiAweEM0LTB4QzcgKi8KKwkweDlDLCAweEU2LCAweDlDLCAweEU0LCAweDlDLCAweEUzLCAweDlDLCAweEVBLCAvKiAweEM4LTB4Q0IgKi8KKwkweDlDLCAweEUyLCAweDlDLCAweEVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDg5LCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweEVFLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweEVELCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweEE2LCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDlDLCAweEYxLCAweDAwLCAweDAwLCAweDlDLCAweEVGLCAweDlDLCAweEU1LCAvKiAweEY0LTB4RjcgKi8KKwkweDhDLCAweDlDLCAweDAwLCAweDAwLCAweDlDLCAweEYwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDlDLCAweEY0LCAweDlDLCAweEYzLCAweDlDLCAweEY1LCAweDlDLCAweEYyLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182Mls1MTJdID0geworCTB4OUMsIDB4RjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4OUMsIDB4RjcsIDB4OUMsIDB4RjgsIDB4OTUsIDB4RTgsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4OUMsIDB4RkEsIDB4OUMsIDB4RjksIDB4OEYsIDB4NUUsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4OTAsIDB4QUMsIDB4ODksIDB4RTQsIDB4ODksIDB4RkEsIDB4RUQsIDB4QUIsIC8qIDB4MTAtMHgxMyAqLworCTB4OUMsIDB4RkIsIDB4MDAsIDB4MDAsIDB4ODgsIDB4QkQsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4Q0EsIDB4OUMsIDB4RkMsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4QzEsIDB4OUQsIDB4NDAsIDB4OEMsIDB4ODEsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4OUQsIDB4NDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4RUQsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4NDIsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4NDMsIDB4OEIsIDB4NTksIC8qIDB4MkMtMHgyRiAqLworCTB4OUQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4OUQsIDB4NDUsIDB4OUQsIDB4NDYsIC8qIDB4MzAtMHgzMyAqLworCTB4OTEsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4OEMsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4REYsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4NUIsIC8qIDB4M0MtMHgzRiAqLworCTB4OEYsIDB4OEEsIDB4OUQsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4RUUsIC8qIDB4NDQtMHg0NyAqLworCTB4RTcsIDB4QkIsIDB4OTQsIDB4RTAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4RTgsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4Q0IsIDB4OUQsIDB4NDgsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4QzUsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4OTEsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4NEIsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4NDksIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4OUQsIDB4NEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4NEEsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4OUQsIDB4NEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4QUYsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4ODgsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4N0QsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4OTQsIDB4RTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4OUQsIDB4NEUsIDB4MDAsIDB4MDAsIDB4OUQsIDB4NTEsIDB4OEYsIDB4QjMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OEIsIDB4NUEsIDB4MDAsIDB4MDAsIDB4OUQsIDB4NEYsIDB4OUQsIDB4NTYsIC8qIDB4ODAtMHg4MyAqLworCTB4OEYsIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4OUQsIDB4NTAsIDB4OTQsIDB4NjMsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4OTcsIDB4N0QsIDB4OUQsIDB4NTIsIDB4OUQsIDB4NTMsIC8qIDB4OTAtMHg5MyAqLworCTB4OUQsIDB4NTcsIDB4OTMsIDB4OEEsIDB4OUQsIDB4NTQsIDB4OEQsIDB4NTIsIC8qIDB4OTQtMHg5NyAqLworCTB4OTAsIDB4REMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4NjUsIC8qIDB4OTgtMHg5QiAqLworCTB4OTQsIDB4QjIsIDB4MDAsIDB4MDAsIDB4OTEsIDB4RjAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4QUMsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4RTIsIC8qIDB4QTgtMHhBQiAqLworCTB4OUQsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4RjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4OTIsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4OTYsIDB4OTUsIDB4MDAsIDB4MDAsIDB4OUQsIDB4NUEsIC8qIDB4QjgtMHhCQiAqLworCTB4ODksIDB4OUYsIDB4OTIsIDB4OEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4NjMsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4OTIsIDB4NTMsIDB4OUQsIDB4NUQsIDB4OUQsIDB4NjQsIC8qIDB4QzQtMHhDNyAqLworCTB4OUQsIDB4NUYsIDB4OUQsIDB4NjYsIDB4OUQsIDB4NjIsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4OUQsIDB4NjEsIDB4OTQsIDB4OEYsIDB4MDAsIDB4MDAsIDB4OUQsIDB4NUIsIC8qIDB4Q0MtMHhDRiAqLworCTB4ODksIDB4RkIsIDB4OUQsIDB4NTksIDB4OEIsIDB4OTEsIDB4OTEsIDB4RjEsIC8qIDB4RDAtMHhEMyAqLworCTB4OUQsIDB4NTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4NTgsIC8qIDB4RDQtMHhENyAqLworCTB4OEQsIDB4NTMsIDB4OTAsIDB4RDksIDB4MDAsIDB4MDAsIDB4OEYsIDB4QjUsIC8qIDB4RDgtMHhEQiAqLworCTB4OUQsIDB4NjAsIDB4OTQsIDB4NzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4OEIsIDB4OTIsIDB4OEEsIDB4NjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4OEEsIDB4ODcsIDB4OTAsIDB4NDAsIDB4OUQsIDB4NjgsIDB4OUQsIDB4NkQsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4OUQsIDB4NjksIDB4MDAsIDB4MDAsIDB4OEMsIDB4OUQsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4OUQsIDB4NkUsIDB4OEUsIDB4NDEsIDB4OEQsIDB4ODksIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4NDUsIDB4OUQsIDB4NUMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzYzWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHg4RSwgMHg5RCwgMHg5RCwgMHg2QiwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHg3NywgLyogMHgwNC0weDA3ICovCisJMHg5RCwgMHg2QywgMHg4OCwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHg5RCwgMHg2NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHg5MiwgMHhBNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHg5MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHhCMiwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHg2QSwgLyogMHgyNC0weDI3ICovCisJMHg4OCwgMHhBNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RCwgMHhDMSwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg1NSwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHhGMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHhEMiwgMHg5RCwgMHg3MCwgMHg5MSwgMHg3RCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHg5MSwgMHhBOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHg4RSwgMHg0QSwgMHg5RCwgMHg3MSwgMHgwMCwgMHgwMCwgMHg5RCwgMHg3MywgLyogMHg0Qy0weDRGICovCisJMHg5RCwgMHg2RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHhERiwgMHgwMCwgMHgwMCwgMHg5MiwgMHhCQiwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHg5MSwgMHg3QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHhGOSwgLyogMHg2NC0weDY3ICovCisJMHg4RSwgMHhDQywgMHg5RCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg5RCwgMHg3RSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg5OCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHg5RSwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHg3OCwgMHg4RiwgMHhCNywgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHhFNiwgMHg5NCwgMHg1MCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHg5RCwgMHg3NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHg3QywgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHg4RSwgMHhGNiwgMHg5RCwgMHg3QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHg4RiwgMHhCNiwgMHgwMCwgMHgwMCwgMHg5RCwgMHg3NSwgMHg5RCwgMHg3QSwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHg3MiwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHg3NCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHg4QywgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHg3QywgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHg3QywgLyogMHg5Qy0weDlGICovCisJMHg5NywgMHhBOSwgMHg4RCwgMHhDQywgMHg5MiwgMHg1NCwgMHg5RCwgMHg3OSwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHg5MCwgMHhEQSwgMHgwMCwgMHgwMCwgMHg4RCwgMHg1NCwgLyogMHhBNC0weEE3ICovCisJMHg5MCwgMHg4NCwgMHg4OSwgMHg4NiwgMHg5MSwgMHg1QiwgMHg5RCwgMHg3NywgLyogMHhBOC0weEFCICovCisJMHg4QiwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHg2NiwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHg5MiwgMHhDRCwgMHg5RCwgMHg3RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHg3RSwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHg4MSwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHg5RCwgMHg4MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHhCNSwgLyogMHhDMC0weEMzICovCisJMHg5RCwgMHg4OSwgMHgwMCwgMHgwMCwgMHg5RCwgMHg4NCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHg5RCwgMHg4NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHg2MCwgLyogMHhDQy0weENGICovCisJMHg5MiwgMHhGMSwgMHgwMCwgMHgwMCwgMHg5RCwgMHg4NywgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHg0QiwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHg2NywgMHg4QSwgMHhCNywgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHg4OCwgMHhBQywgMHgwMCwgMHgwMCwgMHg5RCwgMHg4NSwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHg5RCwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHhGNiwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHg4OSwgMHg4NywgMHhFRCwgMHhBRCwgMHg5RCwgMHg4OCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHg2OCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjRbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweDhDLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDkxLCAweEI5LCAweDAwLCAweDAwLCAweDlELCAweDkzLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweDhELCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweDhBLCAweDlELCAweDkxLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDlELCAweDcyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweDhFLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDlELCAweDkyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDk0LCAweEMwLCAweDkzLCAweDhCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDlELCAweDhCLCAweDAwLCAweDAwLCAweDlELCAweDhGLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweDY3LCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweEVGLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweERCLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweDk3LCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDkzLCAweDQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEVELCAweEFFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweDk0LCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDk2LCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweDk1LCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweDk2LCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDk2LCAweENDLCAweDAwLCAweDAwLCAweDkwLCAweEEwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweDgyLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDlELCAweDlELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDU0LCAweDlELCAweDlBLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDlELCAweDk5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweDUxLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweEVELCAweEFGLCAweDkzLCAweEIzLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDkzLCAweDUwLCAweDlELCAweDlCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDlELCAweDlDLCAweDAwLCAweDAwLCAweDk1LCAweDhGLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweDY0LCAweDhFLCAweDQyLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDkwLCAweEVGLCAweDAwLCAweDAwLCAweDk2LCAweDZGLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDhBLCAweDY4LCAweDAwLCAweDAwLCAweDlELCAweEEzLCAvKiAweEI4LTB4QkIgKi8KKwkweDlELCAweDlFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweDY5LCAweDlELCAweEE1LCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDlELCAweEExLCAweDAwLCAweDAwLCAweDlELCAweEEyLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDkxLCAweDgwLCAweEVELCAweEIwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweEEwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDlELCAweDVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDlELCAweEE0LCAweDAwLCAweDAwLCAweDlELCAweDlGLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDlELCAweEE5LCAweDlELCAweEFBLCAweDkzLCAweDQ2LCAweDlELCAweEFDLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDQzLCAweDlELCAweEE3LCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDhCLCAweDVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweEFELCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDlELCAweEE2LCAweDlELCAweEIxLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDlELCAweEIwLCAweDAwLCAweDAwLCAweDlELCAweEFGLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweEIyLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDlELCAweEI0LCAweDhGLCAweEVGLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182NVs1MTJdID0geworCTB4OUQsIDB4QjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4OUQsIDB4QjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4OUQsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4OUQsIDB4QjYsIDB4OUQsIDB4OTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4QjksIC8qIDB4MjAtMHgyMyAqLworCTB4OUQsIDB4QjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4OTgsIDB4OUQsIDB4QkEsIC8qIDB4MjgtMHgyQiAqLworCTB4OUQsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4NzgsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4OUQsIDB4QkIsIDB4OUQsIDB4QkMsIDB4OUQsIDB4QkUsIDB4OUQsIDB4QkQsIC8qIDB4MzQtMHgzNyAqLworCTB4OUQsIDB4QkYsIDB4ODksIDB4RkMsIDB4MDAsIDB4MDAsIDB4OEQsIDB4NTUsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4RkEsIDB4OTAsIDB4QUQsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4OUQsIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4OUQsIDB4QzQsIDB4RUQsIDB4QjEsIDB4OTUsIDB4NzEsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4OEIsIDB4N0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4OUQsIDB4QzMsIDB4OUQsIDB4QzIsIDB4OTQsIDB4NzMsIC8qIDB4NTQtMHg1NyAqLworCTB4OUQsIDB4QzUsIDB4OEIsIDB4QjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4OUQsIDB4QzcsIDB4OUQsIDB4QzYsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4QjgsIDB4OEUsIDB4NTUsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4RDYsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4OEMsIDB4NjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4OTAsIDB4OTQsIDB4MDAsIDB4MDAsIDB4OUQsIDB4QzgsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4OTAsIDB4QUUsIDB4OTMsIDB4NDcsIDB4MDAsIDB4MDAsIDB4OTUsIDB4N0UsIC8qIDB4NzQtMHg3NyAqLworCTB4OUQsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4Q0EsIDB4OUQsIDB4Q0IsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4QjYsIC8qIDB4ODQtMHg4NyAqLworCTB4OUIsIDB4N0MsIDB4OTAsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4OTUsIDB4NkIsIDB4MDAsIDB4MDAsIDB4OEQsIDB4RDYsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4OTQsIDB4RTMsIDB4OTQsIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4NkMsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4OTcsIDB4QkYsIDB4MDAsIDB4MDAsIDB4OUQsIDB4Q0QsIC8qIDB4OTgtMHg5QiAqLworCTB4OEUsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4Q0UsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4ODgsIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4OEIsIDB4RDIsIDB4OTAsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4OTUsIDB4ODAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4Q0YsIC8qIDB4QTgtMHhBQiAqLworCTB4OEUsIDB4NjEsIDB4OTIsIDB4NjYsIDB4MDAsIDB4MDAsIDB4OEUsIDB4N0EsIC8qIDB4QUMtMHhBRiAqLworCTB4OTAsIDB4NTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4RDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4ODksIDB4OTcsIDB4OEUsIDB4N0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4OUQsIDB4RDMsIDB4MDAsIDB4MDAsIDB4OUQsIDB4RDEsIC8qIDB4QzAtMHhDMyAqLworCTB4OUQsIDB4RDQsIDB4OTcsIDB4QjcsIDB4OUQsIDB4RDIsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4RjksIC8qIDB4QzgtMHhDQiAqLworCTB4OUQsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4QjAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4RDYsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4RjgsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4OUQsIDB4RDgsIDB4MDAsIDB4MDAsIDB4OUQsIDB4RDcsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4OUQsIDB4RDksIDB4OUQsIDB4REEsIDB4OEEsIDB4RjksIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4RkEsIDB4OTIsIDB4NTUsIDB4OEIsIDB4OEMsIC8qIDB4RTQtMHhFNyAqLworCTB4OEUsIDB4N0MsIDB4OTEsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4OEYsIDB4N0IsIDB4ODgsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4OUQsIDB4REIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4QTAsIDB4OUQsIDB4REYsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzY2WzUxMl0gPSB7CisJMHhFRCwgMHhCMiwgMHgwMCwgMHgwMCwgMHg4RCwgMHg1NiwgMHg5RCwgMHhERSwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RCwgMHhBOSwgMHg4RiwgMHhCOCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhCNSwgMHg5RCwgMHhERCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHg4RiwgMHhCOSwgMHgwMCwgMHgwMCwgMHg5NiwgMHhCRSwgMHg4RCwgMHhBOCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHhENSwgLyogMHgxMC0weDEzICovCisJMHg5MCwgMHhDQywgMHhFRCwgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHg5RCwgMHhFNCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhCNywgMHg5MCwgMHhBRiwgLyogMHgxQy0weDFGICovCisJMHg4OSwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHhFRCwgMHhCOCwgMHg4RiwgMHg3NCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg4NiwgLyogMHgyNC0weDI3ICovCisJMHg4RCwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHg4RiwgMHhCQSwgMHhFRCwgMHhCNiwgMHg5MCwgMHhBNSwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHg5RCwgMHhFMywgMHg5RCwgMHhFMSwgMHg5RCwgMHhFMiwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhCNCwgLyogMHgzOC0weDNCICovCisJMHg5MiwgMHg4QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHg0NSwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHg5RCwgMHhFOCwgMHg4RSwgMHg5RSwgMHg4RCwgMHg1NywgLyogMHg0MC0weDQzICovCisJMHg5RCwgMHhFNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHg5RCwgMHhFNywgMHgwMCwgMHgwMCwgMHg5MCwgMHg1NywgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHhFNSwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHg0RSwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhCQSwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHg5RCwgMHhFQSwgMHg5RCwgMHhFOSwgMHg5RCwgMHhFRSwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHhFRiwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHg5RCwgMHhFQiwgMHhFRCwgMHhCOSwgMHg4QSwgMHg0MSwgMHg5RCwgMHhFQywgLyogMHg2NC0weDY3ICovCisJMHg5RCwgMHhFRCwgMHg5NCwgMHhEMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHg4MSwgMHg4QywgMHg2OSwgLyogMHg2Qy0weDZGICovCisJMHg5RCwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhCRCwgLyogMHg3MC0weDczICovCisJMHg5MCwgMHhCMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHhCQiwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHg3MSwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHg4QiwgMHhDNSwgMHgwMCwgMHgwMCwgMHg5RCwgMHhGMSwgLyogMHg4MC0weDgzICovCisJMHg5RCwgMHhGNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHhDOSwgLyogMHg4NC0weDg3ICovCisJMHg5RCwgMHhGMiwgMHg5RCwgMHhGNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHhGMywgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHg4RiwgMHg4QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHg2NywgMHg4OCwgMHhDMywgLyogMHg5NC0weDk3ICovCisJMHg5RCwgMHhGNiwgMHhFRCwgMHhCRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHg5RCwgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhFRCwgMHhCRiwgMHgwMCwgMHgwMCwgMHg5MiwgMHhBOCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHhFRiwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHg2MiwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHhFOSwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhDMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHg5NiwgMHg1QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHg5RSwgMHg0MSwgMHg5RCwgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHg5RCwgMHhGQywgMHgwMCwgMHgwMCwgMHg5RCwgMHhGQiwgMHhFRCwgMHhDMSwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHg5RCwgMHhGOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHg5RSwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHhEQywgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHg5RCwgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHg0MiwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHg4RiwgMHg4QywgMHg5RSwgMHg0MywgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHg5NywgMHg2QSwgMHg5NCwgMHg5OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHg5RSwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHg0NiwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHg5RSwgMHg0OCwgMHgwMCwgMHgwMCwgMHg4QiwgMHhDOCwgMHg4OSwgMHg2NywgLyogMHhGMC0weEYzICovCisJMHg4RCwgMHg1OCwgMHg5RSwgMHg0OSwgMHgwMCwgMHgwMCwgMHg5RSwgMHg0QSwgLyogMHhGNC0weEY3ICovCisJMHg4RiwgMHg5MSwgMHg5MSwgMHg4MiwgMHhFRCwgMHhDMiwgMHhFRCwgMHg0QSwgLyogMHhGOC0weEZCICovCisJMHg5OSwgMHhENiwgMHg5MSwgMHg1RCwgMHg5MSwgMHg1QywgMHg5MSwgMHhENiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjdbNTEyXSA9IHsKKwkweDhELCAweEM1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk4LCAweEYwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDhDLCAweDhFLCAweDk3LCAweDRDLCAweDAwLCAweDAwLCAweDk1LCAweEZDLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweDlFLCAweEVELCAweEMzLCAweDlFLCAweDRCLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDhELCAweEYxLCAweDkyLCAweEJELCAweDlFLCAweDRDLCAweDk4LCAweDRFLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDVELCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweEE5LCAweDlFLCAweDRELCAweDhBLCAweEZBLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweDRFLCAweDlFLCAweDRGLCAvKiAweDI0LTB4MjcgKi8KKwkweDk2LCAweEQ4LCAweDAwLCAweDAwLCAweDk2LCAweEEyLCAweDk2LCAweDk2LCAvKiAweDI4LTB4MkIgKi8KKwkweDk2LCAweDdCLCAweDhFLCAweDQ0LCAweDlFLCAweDUxLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDhFLCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDk2LCAweDcwLCAweDAwLCAweDAwLCAweDlFLCAweDUzLCAweDlFLCAweDU2LCAvKiAweDM0LTB4MzcgKi8KKwkweDlFLCAweDU1LCAweDAwLCAweDAwLCAweDhBLCAweEY3LCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDhCLCAweDgwLCAweDAwLCAweDAwLCAweDlFLCAweDUyLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweDU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweDU3LCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweDk5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweDlCLCAweDg4LCAweEM3LCAvKiAweDRDLTB4NEYgKi8KKwkweDhELCAweERFLCAweDkxLCAweEJBLCAweDAwLCAweDAwLCAweDhFLCAweERCLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweEYxLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweDVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDkzLCAweDZELCAweDAwLCAweDAwLCAweDlFLCAweDU4LCAweDkxLCAweEE5LCAvKiAweDVDLTB4NUYgKi8KKwkweDlFLCAweDU5LCAweDhGLCAweEYwLCAweDk2LCAweERCLCAweDlFLCAweDVCLCAvKiAweDYwLTB4NjMgKi8KKwkweDlFLCAweDVDLCAweDk3LCAweDg4LCAweEVELCAweEM1LCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweDYxLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDhELCAweDU5LCAweDAwLCAweDAwLCAweDk0LCAweDc0LCAvKiAweDZDLTB4NkYgKi8KKwkweDlFLCAweDVFLCAweDkzLCAweDhDLCAweDlELCAweERDLCAweDlELCAweEUwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDhCLCAweDZFLCAweDAwLCAweDAwLCAweDk0LCAweDY2LCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDlFLCAweDYwLCAweDAwLCAweDAwLCAweDhGLCAweEJDLCAweDk0LCAweEMyLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweDY2LCAweDAwLCAweDAwLCAweDk0LCAweEY4LCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweDVELCAweDAwLCAweDAwLCAweDlFLCAweDYzLCAvKiAweDg4LTB4OEIgKi8KKwkweDlFLCAweDYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDkwLCAweENELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDk2LCAweDhELCAweDAwLCAweDAwLCAweDk3LCAweEQxLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDg3LCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDg5LCAweENBLCAweDhFLCAweDdELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDk4LCAweDY3LCAweDlFLCAweDY1LCAweDkwLCAweDk1LCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweDY0LCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweDVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweENELCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweDZCLCAvKiAweEIwLTB4QjMgKi8KKwkweDlFLCAweDY5LCAweDAwLCAweDAwLCAweDg5LCAweENCLCAweDlFLCAweDY3LCAvKiAweEI0LTB4QjcgKi8KKwkweDlFLCAweDZELCAweDlFLCAweDczLCAweDAwLCAweDAwLCAweEVELCAweEM2LCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweEVELCAweEM4LCAweDkxLCAweEM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDk1LCAweEJGLCAweDAwLCAweDAwLCAweDlFLCAweDc1LCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweDQxLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweDc0LCAweDk0LCAweDkwLCAvKiAweENDLTB4Q0YgKi8KKwkweDk2LCAweDVFLCAweDhBLCAweEI5LCAweDAwLCAweDAwLCAweDkwLCAweEY1LCAvKiAweEQwLTB4RDMgKi8KKwkweDhGLCAweDVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDkyLCAweEQxLCAweDAwLCAweDAwLCAweDk3LCAweDRELCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweDcwLCAweDlFLCAweDZGLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweDcxLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDlFLCAweDZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweDc2LCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweDZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDlFLCAweDZBLCAweDAwLCAweDAwLCAweDlFLCAweDcyLCAweDlFLCAweDY4LCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweDhDLCAweDAwLCAweDAwLCAweDk2LCAweEY2LCAvKiAweEYwLTB4RjMgKi8KKwkweDhFLCAweEM0LCAweDhELCAweEYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweEI4LCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDhGLCAweDhBLCAweDYwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182OFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4RUQsIDB4QzksIDB4OTIsIDB4Q0MsIDB4OTMsIDB4QzgsIC8qIDB4MDAtMHgwMyAqLworCTB4ODksIDB4NjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4RjAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4QjIsIDB4OEMsIDB4NDksIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4NzgsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4NUEsIDB4OEEsIDB4OUMsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4N0EsIDB4OEEsIDB4OTQsIDB4OUUsIDB4ODEsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4N0QsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4OTAsIDB4RjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4OEEsIDB4NkEsIDB4OEQsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4OEEsIDB4NjksIDB4OEQsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4OUUsIDB4N0IsIDB4OEMsIDB4ODUsIDB4OEMsIDB4NkEsIDB4OTMsIDB4OEQsIC8qIDB4NDAtMHg0MyAqLworCTB4RUQsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4OUUsIDB4NzksIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4ODgsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4N0MsIDB4OUUsIDB4N0UsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4OEIsIDB4Q0IsIDB4OEMsIDB4NEIsIDB4RUQsIDB4QzcsIDB4OEEsIDB4QkEsIC8qIDB4NTAtMHg1MyAqLworCTB4OEIsIDB4NkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4ODIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4OEQsIDB4RjcsIDB4OTYsIDB4OTEsIDB4MDAsIDB4MDAsIDB4OEUsIDB4NTYsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4ODMsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4NEYsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4OUUsIDB4OEYsIDB4MDAsIDB4MDAsIDB4ODksIDB4QjEsIDB4OUUsIDB4ODQsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4OTUsIDB4OUUsIDB4ODUsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4OTcsIDB4QzAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4OEMsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4OTQsIDB4N0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4OTQsIDB4MDAsIDB4MDAsIDB4OUUsIDB4ODcsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4QjIsIC8qIDB4OTAtMHg5MyAqLworCTB4OUUsIDB4ODksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEQsIDB4NUIsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4OEIsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4OEEsIDB4MDAsIDB4MDAsIDB4OUUsIDB4ODYsIC8qIDB4OUMtMHg5RiAqLworCTB4OUUsIDB4OTEsIDB4MDAsIDB4MDAsIDB4OEYsIDB4QkQsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4RUIsIDB4OEMsIDB4RTYsIC8qIDB4QTQtMHhBNyAqLworCTB4OTcsIDB4OUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4ODgsIDB4MDAsIDB4MDAsIDB4OTIsIDB4RjIsIC8qIDB4QUMtMHhBRiAqLworCTB4OEEsIDB4NDIsIDB4OEQsIDB4QUIsIDB4MDAsIDB4MDAsIDB4OUUsIDB4ODAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4OTAsIDB4OEEsIDB4ODEsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4OEUsIDB4OUUsIDB4OTIsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4OTMsIDB4OEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4OEEsIDB4RkMsIDB4MDAsIDB4MDAsIDB4OUUsIDB4QjAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4RUQsIDB4NDgsIDB4OTYsIDB4QzcsIDB4OUUsIDB4OTcsIDB4OEEsIDB4RkIsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4OUUsIDB4MDAsIDB4MDAsIDB4RUQsIDB4Q0IsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4NUYsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4OUUsIDB4OUYsIDB4OUUsIDB4QTEsIDB4MDAsIDB4MDAsIDB4OUUsIDB4QTUsIC8qIDB4RDQtMHhENyAqLworCTB4OUUsIDB4OTksIDB4MDAsIDB4MDAsIDB4OTIsIDB4NDksIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4OEYsIC8qIDB4REMtMHhERiAqLworCTB4OUUsIDB4QTksIDB4OUUsIDB4OUMsIDB4MDAsIDB4MDAsIDB4OUUsIDB4QTYsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4QTAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4NTgsIDB4OUUsIDB4QUEsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4QTgsIDB4OEEsIDB4QkIsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzY5WzUxMl0gPSB7CisJMHg5OCwgMHg2RiwgMHg5RSwgMHg5NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHg5RSwgMHhBNCwgMHg4OCwgMHhENiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHg5RSwgMHg5OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHhCOCwgLyogMHgwOC0weDBCICovCisJMHg5RSwgMHg5RCwgMHg5MCwgMHg0MSwgMHg5MiwgMHhDNSwgMHg5RSwgMHg5MywgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHhBMywgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHg5MCwgMHg5QSwgMHg5RSwgMHhBRCwgMHg4QSwgMHg5MSwgLyogMHgxOC0weDFCICovCisJMHg4QywgMHg5RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHhBRiwgMHg5RSwgMHg5QSwgMHg5RSwgMHhBRSwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHhBNywgMHg5RSwgMHg5QiwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHg5RSwgMHhBQiwgMHgwMCwgMHgwMCwgMHg5RSwgMHhBQywgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHg5RSwgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHg5MywgMHhDQywgMHgwMCwgMHgwMCwgMHg5RSwgMHhBMiwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHhCQiwgMHgwMCwgMHgwMCwgMHg5MiwgMHhENiwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHg2QiwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHg5NiwgLyogMHg1MC0weDUzICovCisJMHg5RSwgMHhCNiwgMHg5MSwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHhCQywgMHg5MSwgMHg1RSwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHg5RSwgMHhCMywgMHg5RSwgMHhDMCwgMHg5RSwgMHhCRiwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHg5MywgMHhFRCwgMHg5RSwgMHhCRSwgMHg5MywgMHhFOCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhFRCwgMHhDRCwgMHgwMCwgMHgwMCwgMHg5RSwgMHhDMiwgMHg5RSwgMHhCNSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHhDNiwgMHg5RSwgMHhCOCwgMHg4RiwgMHg3QywgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHg4MCwgLyogMHg3MC0weDczICovCisJMHg5RSwgMHhCQSwgMHg4QiwgMHhDOSwgMHgwMCwgMHgwMCwgMHg5RSwgMHhCMiwgLyogMHg3NC0weDc3ICovCisJMHg5RSwgMHhCNCwgMHg5RSwgMHhCMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHg5OCwgMHg0RiwgMHg4QSwgMHg3OSwgMHg5RSwgMHhCNywgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHg5RSwgMHhDMSwgMHg4QSwgMHg1NCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RCwgMHhFNSwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHg3QywgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHhEMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHg5OCwgMHg1MCwgMHg5RSwgMHhENSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhFRCwgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg1OSwgLyogMHg5OC0weDlCICovCisJMHg5RSwgMHhENCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHg5RSwgMHhEMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHhEMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHhDNCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHhFMSwgMHg5RSwgMHhDMywgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHg5RSwgMHhENiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHhDRSwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHhDOSwgMHg5RSwgMHhDNiwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHhDNywgMHgwMCwgMHgwMCwgMHg5RSwgMHhDRiwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhBMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHhDQywgMHg4RCwgMHg1QywgLyogMHhDOC0weENCICovCisJMHg5MiwgMHhDNiwgMHg5MSwgMHg4NCwgMHg5RSwgMHhDQSwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHg5RSwgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHhDOCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHg5NywgMHg2QywgMHg5NiwgMHg4QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHhDRCwgMHg5RSwgMHhENywgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhEMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHhERiwgLyogMHhFNC0weEU3ICovCisJMHg5RSwgMHhEOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHhFNSwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHhERSwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHhERCwgMHgwMCwgMHgwMCwgMHg5MiwgMHhDRSwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHg5MSwgMHg4NSwgMHgwMCwgMHgwMCwgMHg5RSwgMHhEQiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNkFbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweEQ5LCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweEU2LCAweDk0LCAweEYzLCAvKiAweDA4LTB4MEIgKi8KKwkweDlFLCAweEVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweEU3LCAweDlFLCAweEVBLCAvKiAweDEwLTB4MTMgKi8KKwkweDlFLCAweEU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDk0LCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweDU3LCAweDAwLCAweDAwLCAweDlFLCAweERBLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweEUyLCAweDhGLCAweEJFLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDk2LCAweENELCAweDlFLCAweEY2LCAweDlFLCAweEU5LCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDhDLCAweEEwLCAweDg5LCAweEExLCAweDhBLCAweDdFLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweEQxLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEVELCAweEQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweEJGLCAweDlFLCAweEVFLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDlFLCAweEY1LCAweDhFLCAweEY3LCAweDhBLCAweDkyLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweDRELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDlFLCAweEVCLCAweDAwLCAweDAwLCAweEVELCAweEQzLCAweDlFLCAweEYwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDlFLCAweEY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweEI0LCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDhCLCAweDZCLCAweDlFLCAweEYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweDQwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDkzLCAweEM5LCAweDlFLCAweEYxLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweEYzLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEQyLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweEVELCAweEVELCAweEQ0LCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDlFLCAweEVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEQ1LCAweDhBLCAweDgwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDkyLCAweDY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDlFLCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweEY4LCAweDhDLCAweEU3LCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDlFLCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlGLCAweDQwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDlFLCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDlFLCAweEY5LCAweDAwLCAweDAwLCAweDlFLCAweEZCLCAweDlFLCAweEZDLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlGLCAweDRCLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDlGLCAweDQ3LCAweDAwLCAweDAwLCAweDlFLCAweDhELCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlGLCAweDQ2LCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDlGLCAweDQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlGLCAweDQyLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweEU4LCAweDlGLCAweDQ0LCAweDlGLCAweDQzLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDlGLCAweDQ5LCAweDAwLCAweDAwLCAweDk4LCAweDQ1LCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlGLCAweDRDLCAweDhCLCAweEY5LCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlGLCAweDQ4LCAweDlGLCAweDRBLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEQ2LCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweEVELCAweEQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDk0LCAweEE1LCAweDAwLCAweDAwLCAweDlGLCAweDRELCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlGLCAweDUxLCAweDlGLCAweDRFLCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182Qls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4OTcsIDB4OTMsIDB4OUYsIDB4NEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4REMsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NTIsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NTMsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4NTQsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NTUsIC8qIDB4MUMtMHgxRiAqLworCTB4OEMsIDB4ODcsIDB4OEUsIDB4OUYsIDB4MDAsIDB4MDAsIDB4OEIsIDB4RDMsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4QTIsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4N0UsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NTcsIC8qIDB4MzQtMHgzNyAqLworCTB4OUYsIDB4NTYsIDB4OUYsIDB4NTksIDB4OEIsIDB4NUMsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4OEIsIDB4RDQsIDB4OEEsIDB4QkMsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NUMsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NUIsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4NUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4ODksIDB4Q0MsIDB4MDAsIDB4MDAsIDB4OTIsIDB4NTYsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4OUYsIDB4NUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4QkQsIC8qIDB4NTAtMHg1MyAqLworCTB4OUYsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4NUYsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NjEsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NjIsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4NjMsIDB4OEUsIDB4N0UsIDB4OTAsIDB4QjMsIC8qIDB4NjAtMHg2MyAqLworCTB4OEQsIDB4OUYsIDB4MDAsIDB4MDAsIDB4OTUsIDB4OTAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4RTAsIDB4OTgsIDB4NjMsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4OTUsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEQsIDB4Q0UsIC8qIDB4NzAtMHg3MyAqLworCTB4OTcsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4OUYsIDB4NjQsIDB4OUYsIDB4NjUsIDB4MDAsIDB4MDAsIDB4OEUsIDB4ODAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NjYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OUYsIDB4NjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NjksIC8qIDB4ODAtMHg4MyAqLworCTB4OUYsIDB4NjgsIDB4MDAsIDB4MDAsIDB4OTYsIDB4NzcsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4OEYsIDB4N0QsIDB4OEUsIDB4RUEsIDB4OEUsIDB4NjMsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4NkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4NkMsIDB4OTAsIDB4NDIsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4OUYsIDB4NkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NkQsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4OUYsIDB4NkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NkYsIDB4OUYsIDB4NzAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NzEsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4NzMsIDB4OUYsIDB4NzIsIDB4OUYsIDB4NzQsIC8qIDB4QjAtMHhCMyAqLworCTB4ODksIDB4QTMsIDB4OTIsIDB4NjksIDB4MDAsIDB4MDAsIDB4OUYsIDB4NzUsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4NDUsIDB4OEEsIDB4NkIsIC8qIDB4QjgtMHhCQiAqLworCTB4OUYsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4NjEsIC8qIDB4QkMtMHhCRiAqLworCTB4OUEsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4OEIsIDB4NDIsIDB4OUYsIDB4NzcsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NzgsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4RUEsIDB4OTYsIDB4ODgsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4QzUsIDB4OUYsIDB4NzksIC8qIDB4RDAtMHhEMyAqLworCTB4OTQsIDB4RTQsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RDgsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4OTQsIDB4RjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4RDEsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4N0EsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4N0MsIC8qIDB4RTgtMHhFQiAqLworCTB4OUYsIDB4N0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4N0UsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4N0QsIC8qIDB4RjAtMHhGMyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzZDWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHg5RiwgMHg4MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHg4MSwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHg5NiwgMHhBRiwgMHgwMCwgMHgwMCwgMHg5RiwgMHg4MiwgLyogMHgxMC0weDEzICovCisJMHg5RiwgMHg4MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHg0MywgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg4NCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg4NiwgLyogMHgyMC0weDIzICovCisJMHg5RiwgMHg4NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHg5MCwgMHg4NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHg1OCwgLyogMHgzNC0weDM3ICovCisJMHg4OSwgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHhDMywgMHhFRCwgMHhEOSwgLyogMHgzQy0weDNGICovCisJMHg5MiwgMHhGMywgMHg4RiwgMHg2MCwgMHg4QiwgMHg4MSwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHhDNCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHg4RSwgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4QSwgMHhCRSwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHg5OCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHhFRCwgMHhEQSwgMHg5MywgMHhGMCwgMHg5RiwgMHg4NywgMHg4RCwgMHg1RCwgLyogMHg1Qy0weDVGICovCisJMHg5MiwgMHg3MiwgMHgwMCwgMHgwMCwgMHg5RiwgMHg4OSwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHg5RiwgMHg5MSwgMHgwMCwgMHgwMCwgMHg5RiwgMHg4QSwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhEQywgLyogMHg2Qy0weDZGICovCisJMHg5MSwgMHhCRiwgMHgwMCwgMHgwMCwgMHg4QiwgMHg4MiwgMHg5RiwgMHg5MiwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHg4OCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHg0NCwgMHg5RiwgMHg5MCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHg5RiwgMHg4RSwgMHg5RiwgMHg4QiwgMHg5NywgMHg4MCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhEQiwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHg5MiwgMHhCRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHg5MywgMHhENywgMHg5RiwgMHg4QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHg5RiwgMHg5NCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg5MywgMHg4QywgMHg0MiwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHhBQiwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHg4RCwgMHhCOSwgMHg5RiwgMHg4RCwgMHg5RiwgMHg4RiwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHg5NiwgMHg3NiwgMHg5MSwgMHhGMiwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg5NywgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg5QywgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHg5RCwgMHgwMCwgMHgwMCwgMHg4OSwgMHhDRCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHg5NSwgMHhBNiwgMHg5NiwgMHhGQiwgMHg5RiwgMHg5RiwgMHg4RSwgMHhBMSwgLyogMHhCOC0weEJCICovCisJMHg4RiwgMHhDMCwgMHg5RiwgMHg5OCwgMHg5RiwgMHg5RSwgMHg4OSwgMHg4OCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHg5RiwgMHg5NSwgMHg5RiwgMHg5QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHg5MCwgMHhGMiwgMHg5NCwgMHg5MSwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHg5NCwgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg5NywgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHg5NiwgMHg0MCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg5OSwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHhBMiwgMHhFRCwgMHhERCwgMHg5RiwgMHhBMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHg5QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHg5NiwgMHg0MSwgMHg5NCwgMHg2NywgMHg4QiwgMHg4MywgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHg5MiwgMHg4RCwgMHgwMCwgMHgwMCwgMHg5RiwgMHhBMywgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHhBMSwgLyogMHhFQy0weEVGICovCisJMHg5MSwgMHhENywgMHg5RiwgMHg5NiwgMHgwMCwgMHgwMCwgMHg4OSwgMHg2QSwgLyogMHhGMC0weEYzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNkRbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEVELCAweERFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweDZELCAvKiAweDA4LTB4MEIgKi8KKwkweDlGLCAweEFFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlGLCAweEFELCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweEY0LCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDlGLCAweEFBLCAweDAwLCAweDAwLCAweDk3LCAweDhDLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweEI0LCAweDlGLCAweEE0LCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDg5LCAweDZCLCAweDhELCAweDVFLCAweDlGLCAweEE3LCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweDQ2LCAweDlGLCAweEFDLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDlGLCAweEFCLCAweDlGLCAweEE2LCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDlGLCAweEE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweDg4LCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDlGLCAweEE4LCAweDk0LCAweDY4LCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweEFDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDhGLCAweEYyLCAweDkwLCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDlGLCAweEI0LCAweDlGLCAweEIyLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDk1LCAweDZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlGLCAweEFGLCAvKiAweDYwLTB4NjMgKi8KKwkweDlGLCAweEIxLCAweDAwLCAweDAwLCAweDg5LCAweDU5LCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDhELCAweDVGLCAweDk4LCAweDUxLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDhBLCAweDVDLCAweDAwLCAweDAwLCAweDk1LCAweDgyLCAweEVELCAweEUwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDk3LCAweDgxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweDQzLCAvKiAweDc0LTB4NzcgKi8KKwkweDkwLCAweDVBLCAweDlGLCAweEIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDlGLCAweEI4LCAweDAwLCAweDAwLCAweEVELCAweERGLCAvKiAweDg0LTB4ODcgKi8KKwkweDhGLCAweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDk3LCAweDRGLCAweDAwLCAweDAwLCAweDlGLCAweEI1LCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlGLCAweEIwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDlGLCAweEI2LCAweEVELCAweEUxLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweERDLCAweDAwLCAweDAwLCAweDkzLCAweDkzLCAvKiAweDk4LTB4OUIgKi8KKwkweDkzLCAweEMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweEVELCAweEUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweDU1LCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDc0LCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDlGLCAweEJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDlGLCAweEJGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDk3LCAweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDk3LCAweDg0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDlGLCAweEM2LCAweDlGLCAweEMwLCAweDlGLCAweEJELCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweEQyLCAvKiAweEM4LTB4Q0IgKi8KKwkweDlGLCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEUzLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweDY5LCAweDlGLCAweEM1LCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDlGLCAweENBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDkzLCAweDkxLCAweDlGLCAweEM4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlGLCAweEMyLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweDU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDlGLCAweEM5LCAweDAwLCAweDAwLCAweDlGLCAweEJFLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDlGLCAweEM0LCAweDAwLCAweDAwLCAweDlGLCAweENCLCAweDg4LCAweEZBLCAvKiAweEU4LTB4RUIgKi8KKwkweDlGLCAweEMxLCAweDAwLCAweDAwLCAweDlGLCAweENDLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweDVCLCAweEVELCAweEU1LCAweDhGLCAweDdFLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweEEzLCAweDAwLCAweDAwLCAweDhELCAweEFDLCAvKiAweEY0LTB4RjcgKi8KKwkweEVELCAweEU0LCAweDlGLCAweEI5LCAweDlGLCAweEM3LCAweDkzLCAweDU5LCAvKiAweEY4LTB4RkIgKi8KKwkweEVELCAweEU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182RVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4OTAsIDB4QjQsIDB4MDAsIDB4MDAsIDB4OEEsIDB4ODksIC8qIDB4MDQtMHgwNyAqLworCTB4OEQsIDB4Q0YsIDB4OEYsIDB4QzIsIDB4OUYsIDB4QkIsIDB4OEYsIDB4NjEsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4NkIsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4QkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4RDAsIDB4OEYsIDB4OEQsIDB4OEMsIDB4QjgsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4REYsIDB4MDAsIDB4MDAsIDB4OUYsIDB4RDksIC8qIDB4MUMtMHgxRiAqLworCTB4OEIsIDB4OTQsIDB4OTMsIDB4NkUsIDB4MDAsIDB4MDAsIDB4OUYsIDB4RDQsIC8qIDB4MjAtMHgyMyAqLworCTB4OUYsIDB4REQsIDB4ODgsIDB4QUQsIDB4ODksIDB4NTEsIDB4RUQsIDB4RTksIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4QjcsIDB4MDAsIDB4MDAsIDB4OUYsIDB4RDYsIC8qIDB4MjgtMHgyQiAqLworCTB4OTEsIDB4QUEsIDB4OUYsIDB4Q0QsIDB4OUYsIDB4Q0YsIDB4OEQsIDB4NjAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4OUYsIDB4RTAsIDB4RUQsIDB4RTcsIDB4OUYsIDB4REIsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4RUQsIDB4RUEsIDB4MDAsIDB4MDAsIDB4OUYsIDB4RDMsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4REEsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4QTksIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4RDgsIDB4OUYsIDB4REMsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4Q0UsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4OEYsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4NTgsIC8qIDB4NTgtMHg1QiAqLworCTB4RUQsIDB4RTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4RDIsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4NEUsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4RDUsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4Q0UsIDB4OTMsIDB4OTIsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4RDEsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4RDcsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTgsIDB4NzAsIDB4OEUsIDB4QkMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OTYsIDB4OUUsIDB4MDAsIDB4MDAsIDB4OUYsIDB4RTEsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4OTQsIDB4QUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4RUQsIC8qIDB4OEMtMHg4RiAqLworCTB4OEMsIDB4QjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4ODAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4OUYsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4OTcsIDB4QUQsIDB4OEQsIDB4NjEsIDB4MDAsIDB4MDAsIDB4OUYsIDB4RjAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4RUMsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4RUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4RTIsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4RTgsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4RUEsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4NkUsIDB4OUYsIDB4RTUsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4NEQsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4RTcsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RUIsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4RUYsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4OUYsIDB4RTksIDB4OTYsIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4RTQsIDB4MDAsIDB4MDAsIDB4OEUsIDB4QTAsIC8qIDB4QzgtMHhDQiAqLworCTB4OUYsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4OEEsIDB4OEEsIDB4MDAsIDB4MDAsIDB4OUYsIDB4RTYsIC8qIDB4RDAtMHhEMyAqLworCTB4OUYsIDB4RUIsIDB4OUYsIDB4RUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4OTEsIDB4RUEsIDB4OTEsIDB4RDgsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4OUYsIDB4RjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4RkEsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4RjgsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4OTMsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4NDIsIC8qIDB4RjQtMHhGNyAqLworCTB4OUYsIDB4RjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4RjYsIDB4OUYsIDB4REUsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzZGWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHg4QiwgMHg5OSwgMHg5NSwgMHg1OSwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHhCRCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHg4RCwgMHg5NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OCwgMHg1MiwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHhGMiwgMHgwMCwgMHgwMCwgMHhFMCwgMHg0MSwgLyogMHgxMC0weDEzICovCisJMHg4OSwgMHg4OSwgMHg5MSwgMHg4NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHg5NCwgMHg5OSwgMHgwMCwgMHgwMCwgMHg4QSwgMHhCRiwgMHg5NywgMHhGOCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg5RiwgLyogMHgyOC0weDJCICovCisJMHg5MiwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHhGOSwgMHg5RiwgMHhGQiwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHg5MSwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHg0MCwgMHg5RiwgMHhGNywgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHg4QSwgMHhDMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHg4QywgMHg4OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhFMCwgMHg0RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHg0OSwgLyogMHg1OC0weDVCICovCisJMHg5MCwgMHhGNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHg4MywgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHg4RiwgMHg4MSwgMHgwMCwgMHgwMCwgMHhFMCwgMHg1MiwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHg0QiwgMHg5MiwgMHhBQSwgMHhFMCwgMHg0OCwgLyogMHg2Qy0weDZGICovCisJMHg5MiwgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhFMCwgMHg2QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHhFMCwgMHg0NSwgMHgwMCwgMHgwMCwgMHhFMCwgMHg0NCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhFMCwgMHg0RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhFMCwgMHg0NywgMHhFMCwgMHg0NiwgMHhFMCwgMHg0QywgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHg5MCwgMHg5RiwgMHgwMCwgMHgwMCwgMHhFMCwgMHg0MywgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhFRCwgMHhFQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHg0RiwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHhDMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHg1NSwgMHgwMCwgMHgwMCwgMHhFMCwgMHg1NCwgLyogMHhBMC0weEEzICovCisJMHhFMCwgMHg1NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHg1OSwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHg2MiwgMHgwMCwgMHgwMCwgMHhFMCwgMHg1MywgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhFRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHg1NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHg4QywgMHg4MywgMHg5MSwgMHhGNywgMHhFMCwgMHg1MSwgMHg5NCwgMHg1QSwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHg1OCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhFMCwgMHg1RCwgMHhFMCwgMHg1QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhFMCwgMHg1RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHg2MSwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHg1QSwgLyogMHhEQy0weERGICovCisJMHg4RCwgMHg4QSwgMHg5NCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHg5RiwgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHg5NCwgLyogMHhFOC0weEVCICovCisJMHhFMCwgMHg1QywgMHgwMCwgMHgwMCwgMHhFMCwgMHg2MCwgMHg5MSwgMHhGMywgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHg1RiwgMHgwMCwgMHgwMCwgMHhFMCwgMHg0QSwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhFRSwgMHhFOCwgMHg4OSwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHg2NCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHg2OCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzBbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEUwLCAweDY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEVELCAweEVGLCAweDAwLCAweDAwLCAweEVELCAweEYwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweDYyLCAweDAwLCAweDAwLCAweEUwLCAweDYzLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweDY3LCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweDY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweDZELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweEUwLCAweDZELCAweDAwLCAweDAwLCAweEUwLCAweDZBLCAweEUwLCAweDY5LCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweDZDLCAweDkzLCAweEQyLCAweEUwLCAweDZFLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDk1LCAweDkxLCAweEVCLCAvKiAweDI0LTB4MjcgKi8KKwkweEVELCAweEYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDkwLCAweEEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEUwLCAweDZGLCAweDAwLCAweDAwLCAweEUwLCAweDcxLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweDcwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDlGLCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweDcyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDkzLCAweEU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweDczLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweENFLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweDk0LCAvKiAweDZDLTB4NkYgKi8KKwkweDhBLCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDhCLCAweDg0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDhFLCAweERDLCAweDhELCAweEQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweEVELCAweEYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDk4LCAweDQ2LCAweDkwLCAweDg2LCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDhBLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweDc1LCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweDc0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEYzLCAvKiAweEE4LTB4QUIgKi8KKwkweEUwLCAweDc4LCAweDkyLCAweDU5LCAweEUwLCAweDdCLCAweEUwLCAweDc2LCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweDdBLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweEUwLCAweDc5LCAweDkzLCAweDVGLCAweDg4LCAweEQ3LCAweEVELCAweDQ2LCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDk3LCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweDdELCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDQ3LCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweDdFLCAweDAwLCAweDAwLCAweEUwLCAweDdDLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDk2LCAweDQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweDgyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183MVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RUQsIDB4RjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RjQsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4ODksIDB4OEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4ODQsIDB4OTUsIDB4QjAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4RTAsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4OTYsIDB4QjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4QzUsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4NTIsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4OEYsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RjcsIDB4RUQsIDB4RjgsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4OTcsIDB4RjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4RTAsIDB4OEEsIDB4MDAsIDB4MDAsIDB4OTAsIDB4RjcsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4ODYsIDB4RTAsIDB4OEIsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4OEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4RUQsIDB4RjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4ODksIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4OTQsIDB4ODEsIDB4RTAsIDB4ODUsIDB4RTAsIDB4ODgsIDB4OEYsIDB4QzYsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4OTQsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4RTAsIDB4OEMsIDB4MDAsIDB4MDAsIDB4OEUsIDB4Q0YsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4OTAsIDB4RjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4RTAsIDB4OEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4RTAsIDB4ODcsIDB4MDAsIDB4MDAsIDB4OEMsIDB4NDYsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4OEQsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4OTcsIDB4NkYsIDB4RTAsIDB4OTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4NkUsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4RTAsIDB4OTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4RTAsIDB4OTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4OTQsIDB4NEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4OTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4OTUsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4RkEsIDB4MDAsIDB4MDAsIDB4OTQsIDB4NTIsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4OTMsIDB4OTUsIDB4RTAsIDB4OTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4OTksIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4OTcsIDB4RDMsIDB4MDAsIDB4MDAsIDB4RTAsIDB4OTYsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RTAsIDB4OTgsIDB4ODksIDB4OEQsIDB4MDAsIDB4MDAsIDB4RTAsIDB4OTMsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4N0EsIC8qIDB4REMtMHhERiAqLworCTB4RTAsIDB4OUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4OTEsIDB4ODcsIDB4OEUsIDB4NTcsIDB4RTAsIDB4OUMsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4RTAsIDB4OUIsIDB4OTAsIDB4NDMsIDB4OTksIDB4RDcsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4OUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4OUYsIDB4MDAsIDB4MDAsIDB4RTAsIDB4OEUsIC8qIDB4RjgtMHhGQiAqLworCTB4RTAsIDB4OUUsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RkIsIDB4RTAsIDB4QTAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzcyWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHg5QSwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhBMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhFMCwgMHhBMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhBMywgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhFMCwgMHhBNCwgMHgwMCwgMHgwMCwgMHg5MiwgMHhEQywgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhFMCwgMHhBNiwgMHhFMCwgMHhBNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhFMCwgMHhBNywgMHgwMCwgMHgwMCwgMHhFMCwgMHhBOCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHg4RSwgMHhERCwgMHg5NSwgMHg4MywgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHhFQSwgMHhFMCwgMHhBOSwgLyogMHgzOC0weDNCICovCisJMHhFMCwgMHhBQSwgMHg5MSwgMHg3NSwgMHg4RSwgMHhBMiwgMHhFMCwgMHhBQiwgLyogMHgzQy0weDNGICovCisJMHhFMCwgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhBRCwgMHg5NSwgMHhEMCwgLyogMHg0NC0weDQ3ICovCisJMHg5NCwgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhBRSwgLyogMHg0OC0weDRCICovCisJMHg5NCwgMHg3NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHhBQiwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhFMCwgMHhBRiwgMHg4OSwgMHhFNSwgMHgwMCwgMHgwMCwgMHg4QiwgMHg4RCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHg5NiwgMHhDNCwgMHgwMCwgMHgwMCwgMHg5NiwgMHhCNCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHg4OSwgMHhCMiwgMHg5OCwgMHg1MywgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg3MSwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHhBOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHhCNSwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhFMCwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHhDMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHg4QywgMHhBMSwgMHhFMCwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHg4RCwgMHhEMiwgMHhFMCwgMHhCMywgMHhFMCwgMHhCMiwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhCNCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhCNSwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhCNiwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHg4QiwgMHg1RCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhCNywgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhCOCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHg4QywgMHhBMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHhDNiwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhGQywgMHhFMCwgMHhCQSwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHhGMywgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHg0MCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHhCNiwgMHhFMCwgMHhCQiwgLyogMHhDMC0weEMzICovCisJMHhFMCwgMHhCRCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhCQywgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhCRSwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHg4QywgMHhDRiwgMHgwMCwgMHgwMCwgMHhFMCwgMHhCRiwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHhFNywgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHg5MSwgMHg1RiwgMHgwMCwgMHgwMCwgMHg4RCwgMHg5RCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHhFMCwgMHhDMSwgMHhFMCwgMHhDMiwgMHhFMCwgMHhDMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHg4RSwgMHhFQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHg5MywgMHhDNiwgMHg4QiwgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhDNCwgLyogMHhGNC0weEY3ICovCisJMHg5MiwgMHg0QiwgMHhFMCwgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHg5OCwgMHg1NCwgMHg5NCwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEM3LCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEM5LCAweEUwLCAweEM2LCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweEQyLCAvKiAweDE4LTB4MUIgKi8KKwkweEUwLCAweEM4LCAweEUwLCAweENBLCAweDAwLCAweDAwLCAweDk3LCAweEMyLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweEVFLCAweDQxLCAweEUwLCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweENELCAweDkyLCAweDk2LCAweDk0LCAweDRDLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweEEzLCAweEUwLCAweENDLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweEUwLCAweENCLCAweDAwLCAweDAwLCAweDk3LCAweDUwLCAweDk3LCAweDUxLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweENGLCAweDg5LCAweDhFLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDhELCAweDk2LCAweDhFLCAweDgyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEQwLCAweEUwLCAweEQxLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEQzLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweDYyLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEUwLCAweEQ1LCAweDAwLCAweDAwLCAweEUwLCAweEQ0LCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEUwLCAweEQ2LCAweDAwLCAweDAwLCAweDhBLCAweDZDLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweEQ4LCAweDAwLCAweDAwLCAweEVFLCAweDQzLCAvKiAweDc0LTB4NzcgKi8KKwkweEUwLCAweEQ3LCAweDAwLCAweDAwLCAweEUwLCAweERBLCAweEUwLCAweEQ5LCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDhDLCAweEJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweEE2LCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDhCLCAweENBLCAweDAwLCAweDAwLCAweDg5LCAweEE0LCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweEU4LCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDhBLCAweERGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweEU2LCAweEUwLCAweERDLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweERFLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweEUwLCAweERGLCAweDAwLCAweDAwLCAweDg5LCAweENGLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweEUwLCAweERCLCAweEVFLCAweDQ1LCAweDhFLCAweDU4LCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweEJGLCAweEUwLCAweERELCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweDQ4LCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweDQ2LCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEUyLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDhFLCAweEVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweDQ3LCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweDVELCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweEM3LCAweEUwLCAweEUxLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweEZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweDRBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEUwLCAweEU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweEJCLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183NFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4ODUsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RTQsIDB4OTcsIDB4OUQsIDB4RUUsIDB4NDksIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4OTcsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4RjQsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RTYsIDB4RUUsIDB4NEIsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4NEQsIDB4RUUsIDB4NEMsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NEUsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RTgsIDB4OTcsIDB4RDQsIC8qIDB4MzAtMHgzMyAqLworCTB4OEIsIDB4RDUsIDB4OTQsIDB4RkEsIDB4OTQsIDB4NjksIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RTksIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RUIsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RUQsIDB4OEMsIDB4RTgsIDB4ODksIDB4NkMsIC8qIDB4NTgtMHg1QiAqLworCTB4RTAsIDB4RUYsIDB4MDAsIDB4MDAsIDB4OTAsIDB4OTAsIDB4RTAsIDB4RUMsIC8qIDB4NUMtMHg1RiAqLworCTB4OTcsIDB4REEsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NEYsIDB4RTAsIDB4RjIsIC8qIDB4NjAtMHg2MyAqLworCTB4RUEsIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RjAsIDB4RTAsIDB4RjMsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RTUsIC8qIDB4NkMtMHg2RiAqLworCTB4RTAsIDB4RjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEQsIDB4QkEsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RjQsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RjUsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4OUUsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4NTAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RjYsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RjcsIDB4RUUsIDB4NTEsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RTMsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RjgsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4OEEsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4OEUsIDB4QTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RjksIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RkEsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RTAsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4ODksIDB4NUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4RTEsIDB4NDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4NUEsIDB4RTEsIDB4NDEsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4QTIsIDB4RTEsIDB4NDIsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4NDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4NDQsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4RTEsIDB4NDYsIDB4RTEsIDB4NDcsIDB4RTEsIDB4NDUsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4NzIsIDB4RTEsIDB4NDksIC8qIDB4RjQtMHhGNyAqLworCTB4RTEsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzc1WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhFRSwgMHg1MiwgMHgwMCwgMHgwMCwgMHhFMSwgMHg0QiwgLyogMHgwMC0weDAzICovCisJMHhFMSwgMHg0QSwgMHhFMSwgMHg0QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhFMSwgMHg0RCwgMHhFMSwgMHg0RiwgMHhFMSwgMHg0RSwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHg4RCwgMHg5OSwgMHgwMCwgMHgwMCwgMHhFMSwgMHg1MSwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHg4QSwgMHhDMywgMHgwMCwgMHgwMCwgMHg5MCwgMHg3MiwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHg5MywgMHg1QiwgMHgwMCwgMHgwMCwgMHhFMSwgMHg1MiwgMHg5MCwgMHhCNiwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHg1OSwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHg4OSwgMHg5OSwgMHhFMSwgMHg1MywgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHg5NywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHhFMSwgLyogMHgyOC0weDJCICovCisJMHhFMSwgMHg1NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHg4QywgLyogMHgyQy0weDJGICovCisJMHg5MywgMHg2MywgMHg5NywgMHg1MiwgMHg4RCwgMHg2MiwgMHg5MCwgMHg1QywgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHg2QSwgLyogMHgzNC0weDM3ICovCisJMHg5OSwgMHhCMiwgMHgwMCwgMHgwMCwgMHg5MiwgMHhBQywgMHg4OSwgMHhFNiwgLyogMHgzOC0weDNCICovCisJMHhFMSwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhFMSwgMHg1NiwgMHgwMCwgMHgwMCwgMHhFMSwgMHg1QiwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHg1OSwgMHhFMSwgMHg1OCwgMHg5RCwgMHhDMCwgLyogMHg0OC0weDRCICovCisJMHg4QSwgMHg0NSwgMHhFMSwgMHg1NywgMHgwMCwgMHgwMCwgMHg4OCwgMHhEOCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHhBOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHg5NCwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHhBRiwgMHhFMSwgMHg1QywgMHhFMSwgMHg1QSwgLyogMHg1OC0weDVCICovCisJMHg5MiwgMHg3QiwgMHg5MCwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHg5NCwgMHhBOSwgMHgwMCwgMHgwMCwgMHg5NSwgMHg0QywgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhFMSwgMHg1RSwgMHg5NywgMHhBQSwgMHg4QywgMHg2QywgMHhFMSwgMHg1RiwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHg1RCwgMHg5NCwgMHhENCwgMHhFMSwgMHg2MCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHg2MSwgMHgwMCwgMHgwMCwgMHhFRSwgMHg1MywgLyogMHg2Qy0weDZGICovCisJMHg4OCwgMHhEOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHhGNCwgLyogMHg3MC0weDczICovCisJMHhFMSwgMHg2NiwgMHgwMCwgMHgwMCwgMHhFMSwgMHg2MywgMHg5MywgMHhFQiwgLyogMHg3NC0weDc3ICovCisJMHhFMSwgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHg0NSwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHg2OSwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHg2NCwgMHhFMSwgMHg2NSwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHg2OCwgMHhFMSwgMHg2NywgMHg5NSwgMHg0NCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHg2MSwgMHg5MSwgMHg2MCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHg1RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhFMSwgMHg2QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHg2QiwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHg2QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHg2RSwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHg2RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHg3NSwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHg3NiwgMHg5NCwgMHhFNiwgMHhFMSwgMHg3MCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHg3MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhFMSwgMHg3NCwgMHg5MCwgMHg1RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHhFMSwgMHg3NSwgMHhFMSwgMHg3MywgMHg4RSwgMHhCRSwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHg2RiwgMHhFMSwgMHg3MSwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHg2MSwgMHgwMCwgMHgwMCwgMHg4RiwgMHhDNywgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHg3OCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHg3OSwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHg4RSwgMHhBNCwgMHg4RCwgMHhBRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHg5MywgMHg5NywgMHhFMSwgMHg3QSwgMHgwMCwgMHgwMCwgMHg5MiwgMHhDOSwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHg3QywgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHg5RiwgMHhFMSwgMHg3QiwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHg5MSwgMHg4OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhFMSwgMHg4MiwgMHgwMCwgMHgwMCwgMHhFMSwgMHg4NCwgMHhFMSwgMHg4NSwgLyogMHhGMC0weEYzICovCisJMHg5MiwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHg4MywgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHhFMSwgMHg4MCwgMHgwMCwgMHgwMCwgMHhFMSwgMHg3RCwgMHhFMSwgMHg3RSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzZbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEUxLCAweDgxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweDg4LCAweDAwLCAweDAwLCAweEUxLCAweDg2LCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweDg3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweDg5LCAvKiAweDFDLTB4MUYgKi8KKwkweEUxLCAweDhCLCAweEUxLCAweDhDLCAweEUxLCAweDhELCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweEUxLCAweDhFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweDhBLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEUxLCAweDkwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweEUxLCAweDhGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweDkxLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweEMzLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweDk0LCAweEUxLCAweDkyLCAvKiAweDQ0LTB4NDcgKi8KKwkweEUxLCAweDkzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDhBLCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweEZDLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweEM4LCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEUxLCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweEUxLCAweDk1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweDk3LCAweEUxLCAweDk4LCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweDlDLCAvKiAweDY0LTB4NjcgKi8KKwkweEUxLCAweDk5LCAweEUxLCAweDlBLCAweEUxLCAweDlCLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEUxLCAweDlELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEUxLCAweDlFLCAweDAwLCAweDAwLCAweEUxLCAweDlGLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEEwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweEUxLCAweEExLCAweDAwLCAweDAwLCAweDk0LCAweEFELCAweDkzLCAweDZGLCAvKiAweDc4LTB4N0IgKi8KKwkweEUxLCAweEEyLCAweDk0LCAweDkyLCAweDk1LCAweDUzLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEUxLCAweEEzLCAweDAwLCAweDAwLCAweEVFLCAweDU0LCAweEUxLCAweEE0LCAvKiAweDgwLTB4ODMgKi8KKwkweDkzLCAweDQ5LCAweDAwLCAweDAwLCAweDhBLCAweDQ2LCAweDhELCAweDYzLCAvKiAweDg0LTB4ODcgKi8KKwkweEUxLCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEE2LCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEE3LCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDhFLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEE5LCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEE4LCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEFBLCAweEUxLCAweEFCLCAweEVFLCAweDU3LCAvKiAweDk4LTB4OUIgKi8KKwkweEVFLCAweDU1LCAweDAwLCAweDAwLCAweEVFLCAweDU2LCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweDU4LCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweEU3LCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweEUxLCAweEFDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweEUxLCAweEFELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDg5LCAvKiAweEI0LTB4QjcgKi8KKwkweEUxLCAweEFFLCAweEUxLCAweEFGLCAweEUxLCAweEIwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDRELCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEIxLCAweDk0LCAweDc1LCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDdFLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDg5LCAweDZELCAweDAwLCAweDAwLCAweDg5LCAweDc2LCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEI0LCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEIzLCAweDkzLCAweDkwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweEI3LCAvKiAweEQ4LTB4REIgKi8KKwkweDlGLCAweDU4LCAweDAwLCAweDAwLCAweEUxLCAweEI1LCAweDk2LCAweEJGLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEI2LCAweDAwLCAweDAwLCAweDhBLCAweEM0LCAvKiAweEUwLTB4RTMgKi8KKwkweDk0LCAweEQ1LCAweEUxLCAweEI3LCAweDAwLCAweDAwLCAweEUxLCAweEI4LCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEI5LCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweERBLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweEQzLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDkyLCAweEJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDkxLCAweDhBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEJCLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweDgyLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183N1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4OEYsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RTEsIDB4QkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QkQsIC8qIDB4MDQtMHgwNyAqLworCTB4RTEsIDB4QkMsIDB4OTQsIDB4RkIsIDB4MDAsIDB4MDAsIDB4OEEsIDB4QzUsIC8qIDB4MDgtMHgwQiAqLworCTB4OEMsIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QzQsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QzEsIDB4OTAsIDB4NUUsIC8qIDB4MUMtMHgxRiAqLworCTB4OTYsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4RTEsIDB4QzAsIDB4RTEsIDB4QzIsIDB4RTEsIDB4QzMsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QzUsIC8qIDB4MzQtMHgzNyAqLworCTB4RTEsIDB4QzYsIDB4MDAsIDB4MDAsIDB4OTIsIDB4QUQsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4OEEsIDB4RTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4OTIsIDB4ODUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NUEsIDB4RTEsIDB4QzcsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QzgsIDB4RTEsIDB4Q0IsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4OTAsIDB4ODcsIDB4MDAsIDB4MDAsIDB4OTMsIDB4QzIsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4Q0MsIDB4OTYsIDB4NzIsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4RTEsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4Q0EsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4Q0UsIDB4RTEsIDB4Q0QsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4RDEsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4RDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4RDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4RDQsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4RTEsIDB4RDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4OEYsIDB4NzUsIDB4OTcsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4RTEsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4QjUsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4RDYsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4RDcsIDB4MDAsIDB4MDAsIDB4RTEsIDB4REIsIC8qIDB4QjgtMHhCQiAqLworCTB4RTEsIDB4RDksIDB4RTEsIDB4REEsIDB4MDAsIDB4MDAsIDB4RTEsIDB4RDgsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4REMsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4REQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4REUsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4REYsIDB4OTYsIDB4QjUsIC8qIDB4RDgtMHhEQiAqLworCTB4RTEsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4RUUsIDB4RTEsIDB4RTEsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4OTIsIDB4NkQsIDB4MDAsIDB4MDAsIDB4OTQsIDB4OEEsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4OEIsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4OTIsIDB4NUEsIDB4RTEsIDB4RTIsIDB4OEIsIDB4QjgsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4Q0UsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4RTEsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzc4WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RCwgMHhCQiwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhFMSwgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhFNSwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHg4QywgMHhBNCwgMHg4RCwgMHhEMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhFMSwgMHhFNywgMHhFRSwgMHg1QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHg3NSwgMHg4RCwgMHhENCwgMHg4QiwgMHg2RCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg0MywgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHg5NCwgMHg2QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHg3NiwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RCwgMHg3QiwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHg1RCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHg4RiwgMHhDOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhFRSwgMHg1RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHhCMCwgLyogMHg2OC0weDZCICovCisJMHg4RCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHhBNSwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHhBMSwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhFMSwgMHhFQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHg1RiwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhFMSwgMHhFRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHg4QywgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhFQywgMHg5MiwgMHhGNCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHhFMSwgMHhFRiwgMHg4QSwgMHg1NiwgMHhFMSwgMHhFQSwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHhFOCwgMHgwMCwgMHgwMCwgMHg4OSwgMHg0RiwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHg4RCwgMHhFQSwgMHgwMCwgMHgwMCwgMHg5OCwgMHg3MSwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhFRSwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhGMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHhDOSwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHg5MCwgMHhENywgMHhFMSwgMHhGMiwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhGMywgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHg2RCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHhFMSwgMHhGOSwgMHgwMCwgMHgwMCwgMHhFMSwgMHhGOCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHg4RSwgMHhBNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhGQSwgMHhFMSwgMHhGNSwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhGQiwgMHhFMSwgMHhGNiwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHg5NCwgMHhENiwgMHhFMSwgMHhGNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhFMSwgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHg0MSwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHg0MCwgLyogMHhFNC0weEU3ICovCisJMHg5NiwgMHg4MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHhFMSwgMHhGQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHhFOSwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhFMiwgMHg0MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzlbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDhGLCAweENBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweDQ0LCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweDYyLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweDQ2LCAweEUyLCAweDQ1LCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEU2LCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEU4LCAweEUyLCAweDQ5LCAvKiAweDI4LTB4MkIgKi8KKwkweEUyLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEVFLCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweEE2LCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDk3LCAweEU3LCAweDAwLCAweDAwLCAweDhFLCAweEQwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweEUyLCAweDRBLCAweDhDLCAweDU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweDVGLCAvKiAweDQ0LTB4NDcgKi8KKwkweDhCLCAweDQ2LCAweDhFLCAweDgzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDk3LCAweDUzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweDUwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweDRGLCAweDkxLCAweDYzLCAweEUyLCAweDRDLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweDRFLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweDZBLCAweDkwLCAweDVGLCAweEUyLCAweDRELCAvKiAweDVDLTB4NUYgKi8KKwkweEUyLCAweDRCLCAweDAwLCAweDAwLCAweDk0LCAweDQ5LCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweENCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDk1LCAweDVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDhELCAweEQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweDk4LCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweDUxLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweDUyLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEUyLCAweDY4LCAweDhCLCAweEQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDk4LCAweDVDLCAweDkxLCAweDU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweDUzLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDg5LCAweEQwLCAweDkyLCAweEY1LCAweDk1LCAweDlGLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEVFLCAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweDY2LCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweDU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweDlBLCAweEUyLCAweDU1LCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweDU3LCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweDU4LCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDk0LCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweDU5LCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweDVBLCAweEUyLCAweDVCLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDhCLCAweEQ3LCAweDg5LCAweEQxLCAweDkzLCAweEMzLCAvKiAweEJDLTB4QkYgKi8KKwkweDhGLCAweDQ3LCAweDhFLCAweDg0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweDVDLCAweDAwLCAweDAwLCAweDhGLCAweDQ4LCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDg5LCAweEM4LCAweDk1LCAweDYyLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweDVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDk0LCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweDY0LCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweDYwLCAweDAwLCAweDAwLCAweEUyLCAweDYxLCAvKiAweEUwLTB4RTMgKi8KKwkweDk0LCAweDg5LCAweDAwLCAweDAwLCAweDkwLCAweDYwLCAweEUyLCAweDVFLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweDgxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweEUyLCAweDVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDhGLCAweENDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweERBLCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183QVs1MTJdID0geworCTB4OEIsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4RTIsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4RjYsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NjMsIDB4OTAsIDB4QzUsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4OTYsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4NDIsIC8qIDB4MTQtMHgxNyAqLworCTB4RTIsIDB4NjQsIDB4RTIsIDB4NjUsIDB4OTIsIDB4NzQsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4OTcsIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NjcsIC8qIDB4MUMtMHgxRiAqLworCTB4RTIsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4RUQsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NjksIDB4ODgsIDB4RUUsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NkMsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NkEsIC8qIDB4MzgtMHgzQiAqLworCTB4ODksIDB4RDIsIDB4OEMsIDB4NkQsIDB4RTIsIDB4NkIsIDB4OEQsIDB4NjUsIC8qIDB4M0MtMHgzRiAqLworCTB4OEQsIDB4OTIsIDB4MDAsIDB4MDAsIDB4OTUsIDB4RTQsIDB4RTIsIDB4NkQsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4NzMsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4OTAsIDB4Q0YsIDB4ODksIDB4NkUsIDB4ODksIDB4QjgsIC8qIDB4NEMtMHg0RiAqLworCTB4ODgsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NkUsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NzAsIDB4RTIsIDB4NzEsIDB4OEYsIDB4RjUsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NzIsIDB4MDAsIDB4MDAsIDB4OEEsIDB4NkUsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4RTIsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4OEMsIDB4OEEsIDB4MDAsIDB4MDAsIDB4OEIsIDB4ODYsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NzUsIDB4OEIsIDB4RjMsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NzYsIDB4MDAsIDB4MDAsIDB4OTAsIDB4RkEsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4OTMsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4OTAsIDB4REUsIC8qIDB4ODAtMHg4MyAqLworCTB4OEQsIDB4RjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4RTIsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4ODIsIDB4OTEsIDB4OEIsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NzksIDB4RTIsIDB4N0IsIDB4RTIsIDB4NzgsIC8qIDB4OTQtMHg5NyAqLworCTB4RTIsIDB4N0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4NDEsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4N0MsIDB4OEMsIDB4NDUsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4ODcsIDB4OTcsIDB4NzEsIC8qIDB4QUMtMHhBRiAqLworCTB4RTIsIDB4N0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4ODAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4NEQsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4ODMsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4OTYsIC8qIDB4QzAtMHhDMyAqLworCTB4RTIsIDB4ODIsIDB4RTIsIDB4ODEsIDB4MDAsIDB4MDAsIDB4RTIsIDB4ODUsIC8qIDB4QzQtMHhDNyAqLworCTB4RTIsIDB4N0QsIDB4MDAsIDB4MDAsIDB4RTIsIDB4ODYsIDB4OTcsIDB4QTcsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4ODcsIDB4MDAsIDB4MDAsIDB4RTIsIDB4ODgsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4NjcsIDB4OUEsIDB4RjIsIDB4RTIsIDB4OEEsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4ODksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4OEIsIDB4RTIsIDB4OEMsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4OTcsIDB4QjMsIDB4RTIsIDB4OEQsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RUQsIC8qIDB4REMtMHhERiAqLworCTB4OEYsIDB4Q0QsIDB4RTIsIDB4OEUsIDB4RTIsIDB4OEYsIDB4OEYsIDB4NzYsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4QjYsIDB4RTIsIDB4OTAsIDB4RUUsIDB4NjgsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4NDcsIDB4RUUsIDB4NkEsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4OTEsIDB4MDAsIDB4MDAsIDB4OTIsIDB4NUIsIC8qIDB4RUMtMHhFRiAqLworCTB4RTIsIDB4OTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4QTMsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4OTksIDB4NUUsIDB4OTIsIDB4N0MsIDB4OEUsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4QzYsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzdCWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHg5MywgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhFMiwgMHhBMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHg5NiwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHg4QiwgMHg4OCwgMHgwMCwgMHgwMCwgMHhFMiwgMHg5NSwgMHhFMiwgMHhBMiwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHg5NCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHg4RiwgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhFMiwgMHg5OCwgMHhFMiwgMHg5OSwgMHgwMCwgMHgwMCwgMHg5MywgMHg0QSwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHg5QSwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHg4QSwgMHg3RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHg5MCwgMHg3OSwgMHg5NSwgMHg4NCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhFMiwgMHg5QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHg5MSwgMHhFNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHg5NywgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg5QiwgMHhFMiwgMHg5RCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHg4RCwgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhBNCwgMHg5NSwgMHg0RCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHg5NCwgMHhBNCwgMHg5MywgMHg5OSwgMHgwMCwgMHgwMCwgMHg4QiwgMHhEOCwgLyogMHg0OC0weDRCICovCisJMHhFMiwgMHhBMywgMHhFMiwgMHhBMSwgMHgwMCwgMHgwMCwgMHg5NCwgMHhCMywgLyogMHg0Qy0weDRGICovCisJMHhFMiwgMHg5RSwgMHg5MiwgMHg3RCwgMHg5MywgMHg5QiwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHg5MywgMHg5QSwgMHgwMCwgMHgwMCwgMHg4RCwgMHhGNCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhCNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhBNiwgMHgwMCwgMHgwMCwgMHhFMiwgMHhBOCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhFMiwgMHhBQiwgMHgwMCwgMHgwMCwgMHhFMiwgMHhBQywgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhFMiwgMHhBOSwgMHhFMiwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhFMiwgMHhBNywgMHhFMiwgMHhBNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHg5RiwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHhDRCwgMHg4OSwgMHhEMywgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhCMywgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhCMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhCNSwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhCNCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHg5NCwgMHg5MywgMHg5NiwgMHhBNSwgMHgwMCwgMHgwMCwgMHg4RSwgMHg1QSwgLyogMHg5NC0weDk3ICovCisJMHhFMiwgMHhBRSwgMHhFMiwgMHhCNywgMHhFMiwgMHhCMiwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhFMiwgMHhCMSwgMHhFMiwgMHhBRCwgMHhFRSwgMHg2QiwgMHhFMiwgMHhBRiwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHg4QSwgMHhDNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHg1QywgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHg5MCwgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHhFMiwgMHhCQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHg5NCwgMHhBMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHg5MCwgMHhERiwgMHhFMiwgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHg5NCwgMHhDRCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhCRCwgMHg5NSwgMHhEMSwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHg5MiwgMHg3QSwgMHgwMCwgMHgwMCwgMHhFMiwgMHhCOCwgLyogMHhDOC0weENCICovCisJMHhFMiwgMHhCQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhCQiwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhCRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHg4RSwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHg5MywgMHhDNCwgMHhFMiwgMHhDMywgMHhFMiwgMHhDMiwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhCRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHg5OCwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhDOCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhDQywgMHhFMiwgMHhDOSwgLyogMHhGNC0weEY3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfN0NbNTEyXSA9IHsKKwkweEUyLCAweEM1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEM2LCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweENCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEMwLCAweDk5LCAweEQzLCAweEUyLCAweEM3LCAvKiAweDEwLTB4MTMgKi8KKwkweEUyLCAweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweENBLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEQwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDhBLCAweEM4LCAweDAwLCAweDAwLCAweEUyLCAweENELCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweENFLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweENGLCAweEUyLCAweEQyLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEQxLCAvKiAweDM0LTB4MzcgKi8KKwkweDk0LCAweEY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEQzLCAweDk3LCAweEZBLCAweDk1LCAweEVCLCAvKiAweDNDLTB4M0YgKi8KKwkweEUyLCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEQ1LCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEUyLCAweEQ0LCAweDkwLCAweEQwLCAweDAwLCAweDAwLCAweEUyLCAweEQ3LCAvKiAweDRDLTB4NEYgKi8KKwkweEUyLCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweEUyLCAweEQ2LCAweDAwLCAweDAwLCAweEUyLCAweERELCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEUyLCAweERBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweERCLCAvKiAweDVDLTB4NUYgKi8KKwkweEUyLCAweEM0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEUyLCAweERDLCAweEUyLCAweERFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEUyLCAweERGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweEM0LCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweEUwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDhCLCAweENDLCAweDhDLCAweDQ4LCAweEUyLCAweEUxLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweEIyLCAweDAwLCAweDAwLCAweDkwLCAweDg4LCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDk2LCAweEFFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweEUyLCAweEUyLCAweDAwLCAweDAwLCAweDk3LCAweEIxLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweDk0LCAweDAwLCAweDAwLCAweDkxLCAweDY1LCAvKiAweDk0LTB4OTcgKi8KKwkweDk0LCAweDUzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweDZDLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweEJFLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEU3LCAweEUyLCAweEU1LCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEUyLCAweEUzLCAweDhBLCAweDlGLCAweDAwLCAweDAwLCAweDhGLCAweENGLCAvKiAweEE0LTB4QTcgKi8KKwkweEUyLCAweEU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEU2LCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEU0LCAweEUyLCAweEVDLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEVCLCAweEUyLCAweEVBLCAweEUyLCAweEU5LCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEVFLCAweDkwLCAweEI4LCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweEUyLCAweEVGLCAweDAwLCAweDAwLCAweEUyLCAweEYxLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweEQwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweDU3LCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEYzLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweDlDLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEUyLCAweEYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweEUyLCAweEY0LCAweDAwLCAweDAwLCAweDk1LCAweEIzLCAweDkxLCAweDhDLCAvKiAweERDLTB4REYgKi8KKwkweDhELCAweDY2LCAweDAwLCAweDAwLCAweEUyLCAweEY1LCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweEM2LCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEY3LCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEY4LCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEUyLCAweEY5LCAweDAwLCAweDAwLCAweEUyLCAweEZBLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDhFLCAweDg1LCAweDAwLCAweDAwLCAweEUyLCAweEZCLCAweDhDLCAweDZFLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweDhBLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183RFs1MTJdID0geworCTB4OEIsIDB4NDksIDB4MDAsIDB4MDAsIDB4RTMsIDB4NDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4OTYsIDB4RjEsIDB4OEQsIDB4NjcsIDB4RTIsIDB4RkMsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NDMsIDB4OTYsIDB4RTQsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4OTQsIDB4NUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4OTUsIDB4NTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4OEYsIDB4ODMsIDB4RTMsIDB4NDIsIDB4MDAsIDB4MDAsIDB4OEUsIDB4RDEsIC8qIDB4MTQtMHgxNyAqLworCTB4OEQsIDB4NjgsIDB4OEUsIDB4ODYsIDB4OEIsIDB4ODksIDB4OTUsIDB4QjQsIC8qIDB4MTgtMHgxQiAqLworCTB4RTMsIDB4NDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4OTEsIDB4NjYsIDB4OTYsIDB4NjEsIDB4OEQsIDB4RjUsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4ODcsIC8qIDB4MjgtMHgyQiAqLworCTB4OTIsIDB4REIsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NDYsIDB4OTcsIDB4REQsIC8qIDB4MkMtMHgyRiAqLworCTB4OEQsIDB4RDcsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NDcsIDB4OTAsIDB4NjEsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4NDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4OEYsIDB4RDAsIDB4OEQsIDB4QUUsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NDgsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4NDksIDB4OEMsIDB4QkMsIC8qIDB4NDAtMHg0MyAqLworCTB4OTEsIDB4NjcsIDB4RTMsIDB4NDQsIDB4RTMsIDB4NEEsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RUUsIDB4NkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NDUsIC8qIDB4NDgtMHg0QiAqLworCTB4OEMsIDB4NkYsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NEQsIDB4RTMsIDB4NTEsIC8qIDB4NEMtMHg0RiAqLworCTB4OEMsIDB4OEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NEMsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NTUsIC8qIDB4NTgtMHg1QiAqLworCTB4RUUsIDB4NkUsIDB4MDAsIDB4MDAsIDB4OEQsIDB4NjksIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4OTcsIDB4OEQsIDB4ODgsIDB4QkEsIDB4RTMsIDB4NTIsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4OEIsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4RTMsIDB4NEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NTAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4OUQsIDB4RTMsIDB4NEUsIDB4RTMsIDB4NEIsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4OEEsIDB4NDcsIDB4OTAsIDB4RTIsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4NTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NTYsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NTMsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4NzAsIDB4OTEsIDB4QjEsIDB4RTMsIDB4NTgsIC8qIDB4OTgtMHg5QiAqLworCTB4OTEsIDB4OEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NjUsIC8qIDB4OUMtMHg5RiAqLworCTB4RUUsIDB4NzAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NjEsIDB4RTMsIDB4NUIsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NUYsIC8qIDB4QTgtMHhBQiAqLworCTB4OEUsIDB4RjgsIDB4ODgsIDB4REIsIDB4RTMsIDB4NUEsIDB4RTMsIDB4NjIsIC8qIDB4QUMtMHhBRiAqLworCTB4RTMsIDB4NjYsIDB4OEQsIDB4NkEsIDB4OTYsIDB4RDQsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4OTIsIDB4RDQsIDB4RTMsIDB4NUMsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NkYsIC8qIDB4QjQtMHhCNyAqLworCTB4RTMsIDB4NjQsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NTksIDB4OTIsIDB4NUQsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4NUUsIDB4ODgsIDB4QkIsIDB4OTYsIDB4QzgsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NUQsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4RDksIDB4OTQsIDB4RUEsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4OEQsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4OTcsIDB4Q0UsIDB4OEYsIDB4OEYsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4OEUsIDB4RUUsIDB4NzEsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4RTMsIDB4NjcsIDB4MDAsIDB4MDAsIDB4OTAsIDB4RkMsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4RTMsIDB4NjMsIDB4RTMsIDB4NjgsIDB4RTMsIDB4NkEsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4OTIsIDB4RjcsIDB4RTMsIDB4NkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4RTMsIDB4NjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4OTUsIDB4RDIsIDB4OEEsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4OTYsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4REMsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NkMsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4OTcsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NkIsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzdFWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHg4OSwgMHg4RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHg5MywgMHhFQSwgMHhFMywgMHg2RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHg3NSwgMHhFMywgMHg2RiwgMHhFMywgMHg3NiwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHg3MiwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHg5QiwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHhDOCwgMHhFMywgMHg3NCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHg3MSwgMHhFMywgMHg3NywgMHhFMywgMHg3MCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHg2MywgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg0NCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHg2QiwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHg3MywgMHhFMywgMHg4MCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHg3QiwgMHgwMCwgMHgwMCwgMHhFMywgMHg3RSwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHg3QywgMHhFMywgMHg4MSwgMHhFMywgMHg3QSwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHg2MCwgMHg5MCwgMHhEMSwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHhDOSwgMHgwMCwgMHgwMCwgMHhFMywgMHg3RCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHg3OCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHg0MCwgMHg4QywgMHg3MSwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHg4RiwgMHg0QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHg3MiwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHg5MCwgMHg0NCwgMHg5MSwgMHg1NSwgMHhFMywgMHg4NCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHg4NiwgMHhFMywgMHg4NywgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHg4MywgMHhFMywgMHg4NSwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHg3OSwgMHhFMywgMHg4MiwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHg4QSwgMHhFMywgMHg4OSwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHg5NiwgMHg5QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHg4QywgMHg0QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHg4OCwgMHgwMCwgMHgwMCwgMHhFMywgMHg4QywgLyogMHg3OC0weDdCICovCisJMHhFMywgMHg4QiwgMHhFMywgMHg4RiwgMHgwMCwgMHgwMCwgMHhFMywgMHg5MSwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHg1QiwgMHhFMywgMHg4RCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhFMywgMHg5MiwgMHhFMywgMHg5MywgMHhFRCwgMHg0MCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHhFMywgMHg5NCwgMHgwMCwgMHgwMCwgMHhFMywgMHg5QSwgMHg5MywgMHg1QSwgLyogMHg4Qy0weDhGICovCisJMHhFMywgMHg5NiwgMHgwMCwgMHgwMCwgMHhFMywgMHg5NSwgMHhFMywgMHg5NywgLyogMHg5MC0weDkzICovCisJMHhFMywgMHg5OCwgMHgwMCwgMHgwMCwgMHhFMywgMHg5OSwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHg5QiwgLyogMHg5OC0weDlCICovCisJMHhFMywgMHg5QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfN0ZbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweENBLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEUzLCAweDlELCAweDAwLCAweDAwLCAweEUzLCAweDlFLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweDlGLCAweDAwLCAweDAwLCAweEVFLCAweDczLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEUzLCAweEEwLCAweEUzLCAweEExLCAweEUzLCAweEEyLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEUzLCAweEEzLCAweEUzLCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweEUzLCAweEE2LCAweEUzLCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEUzLCAweEE3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEE4LCAvKiAweDVDLTB4NUYgKi8KKwkweEUzLCAweEE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEFDLCAvKiAweDY0LTB4NjcgKi8KKwkweEUzLCAweEFBLCAweEUzLCAweEFCLCAweDhELCAweERGLCAweDhDLCAweDcyLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDc1LCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDk0LCAweEIxLCAweDAwLCAweDAwLCAweDhGLCAweDkwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweDZDLCAweDAwLCAweDAwLCAweDk0LCAweEVCLCAvKiAweDc0LTB4NzcgKi8KKwkweEUzLCAweEFELCAweDlDLCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEFFLCAweEUzLCAweEIwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweDg1LCAweEUzLCAweEFGLCAweEUzLCAweEIyLCAvKiAweDg0LTB4ODcgKi8KKwkweEUzLCAweEIxLCAweDAwLCAweDAwLCAweDk3LCAweDcyLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweEUzLCAweEIzLCAweDAwLCAweDAwLCAweDk0LCAweEZDLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEUzLCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEI3LCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweEI2LCAweEUzLCAweEI1LCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweDc0LCAweDAwLCAweDAwLCAweEUzLCAweEI4LCAvKiAweEEwLTB4QTMgKi8KKwkweDhDLCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDkxLCAweDQxLCAweDhCLCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEJDLCAweEUzLCAweEI5LCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEJBLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEJELCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweEUzLCAweEJFLCAweEUzLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDg5LCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDg5LCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweEMwLCAweEUzLCAweEMxLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEMyLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDk3LCAweDgyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweDRCLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEUzLCAweEM0LCAweEUzLCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDkwLCAweDg5LCAweEUzLCAweEM1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEM2LCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweEM3LCAweDAwLCAweDAwLCAweDhBLCAweEUzLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDhBLCAweENCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEM4LCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweEM5LCAweDAwLCAweDAwLCAweDk2LCAweDdDLCAvKiAweEY4LTB4RkIgKi8KKwkweDk3LCAweDgzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184MFs1MTJdID0geworCTB4OTcsIDB4NzMsIDB4OTgsIDB4NTYsIDB4MDAsIDB4MDAsIDB4OEQsIDB4NkMsIC8qIDB4MDAtMHgwMyAqLworCTB4RTMsIDB4Q0MsIDB4OEUsIDB4RDIsIDB4RTMsIDB4Q0IsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4Q0QsIC8qIDB4MDgtMHgwQiAqLworCTB4OEUsIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4OTEsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4RTMsIDB4Q0UsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4NkIsIDB4MDAsIDB4MDAsIDB4OTYsIDB4RDUsIC8qIDB4MTQtMHgxNyAqLworCTB4RTMsIDB4Q0YsIDB4RTMsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4RTMsIDB4RDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4RDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4RTMsIDB4RDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4QTgsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4RUIsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RDUsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4OTIsIDB4NUUsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RDQsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RDcsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RDYsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RDgsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4QjksIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4RTMsIDB4RDksIDB4MDAsIDB4MDAsIDB4RTMsIDB4REEsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4QjcsIDB4RTMsIDB4REIsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4OTEsIDB4OEYsIDB4RTMsIDB4REMsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4RTMsIDB4REQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4RkMsIC8qIDB4NkMtMHg2RiAqLworCTB4RTMsIDB4RTAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4REYsIDB4RTMsIDB4REUsIC8qIDB4NzAtMHg3MyAqLworCTB4OTIsIDB4QUUsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RTEsIDB4OTAsIDB4NDUsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4RTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4RTMsIDB4OTgsIDB4NTcsIDB4RTMsIDB4RTQsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4RTMsIDB4RTUsIDB4RTMsIDB4RTcsIDB4RTMsIDB4RTYsIDB4OTQsIDB4QTMsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4RjcsIDB4MDAsIDB4MDAsIDB4OTgsIDB4NUQsIC8qIDB4ODgtMHg4QiAqLworCTB4OTQsIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RTksIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4RDEsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4OTUsIDB4NDksIDB4MDAsIDB4MDAsIDB4RTMsIDB4RUEsIDB4RTMsIDB4RTgsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4OEEsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4RDIsIDB4OEUsIDB4ODgsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4OTQsIDB4RUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4QTgsIDB4OTYsIDB4NjIsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4RTMsIDB4RUQsIDB4RTMsIDB4RUIsIDB4MDAsIDB4MDAsIDB4OEQsIDB4NkQsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4NkUsIDB4ODgsIDB4RTcsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4OEQsIDB4RTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4NzgsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4REQsIC8qIDB4QzAtMHhDMyAqLworCTB4RTMsIDB4RjIsIDB4MDAsIDB4MDAsIDB4OTIsIDB4NUYsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4OTQsIDB4NzcsIDB4MDAsIDB4MDAsIDB4OTEsIDB4RDksIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RjQsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4RjAsIDB4RTMsIDB4RjMsIDB4RTMsIDB4RUUsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4RjEsIDB4OTYsIDB4NDUsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4RDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4ODgsIDB4RkIsIDB4RTMsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RjYsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4OTMsIDB4QjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4OEIsIDB4QjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4RTQsIDB4NDUsIDB4OTQsIDB4NUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzgxWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHg4OSwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHhCQSwgMHg5MCwgMHhDNiwgMHg5OCwgMHg2NSwgLyogMHgwNC0weDA3ICovCisJMHg5NiwgMHhBQywgMHhFMywgMHhGNSwgMHg5MCwgMHhEMiwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHg3MiwgMHhFMywgMHhGOCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhGQSwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhGQiwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHg5MiwgMHg0NSwgMHgwMCwgMHgwMCwgMHg5NCwgMHg1RCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHg5MiwgMHhBRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHg0MiwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHg0MSwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhGQywgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg3NCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHg5NSwgMHg4NSwgMHhFNCwgMHg0NCwgMHgwMCwgMHgwMCwgMHhFNCwgMHg0MywgLyogMHg1MC0weDUzICovCisJMHg4RCwgMHg2RiwgMHg5OCwgMHg3MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHg1NCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHg0OCwgMHhFNCwgMHg0OSwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHhFRSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHg0NywgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHg4RCwgMHg5OCwgMHhFNCwgMHg0NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhFNCwgMHg0QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHg5MiwgMHhCMCwgMHg5NSwgMHhBMCwgMHg5MSwgMHg0MiwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHhEQSwgLyogMHg3Qy0weDdGICovCisJCisJMHhFNCwgMHg0RSwgMHgwMCwgMHgwMCwgMHhFNCwgMHg0RiwgMHhFNCwgMHg0QiwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhFNCwgMHg0QywgMHgwMCwgMHgwMCwgMHhFNCwgMHg0RCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RCwgMHg3MCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHg1NSwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHg4NiwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHg5NiwgMHg4QywgMHg5NSwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhFNCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHg1MywgLyogMHhBMC0weEEzICovCisJMHhFNCwgMHg1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHg5NiwgMHg2MywgMHhFNCwgMHg1NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhFNCwgMHg1NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHg1NiwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHg1OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhFNCwgMHg1QSwgMHgwMCwgMHgwMCwgMHhFNCwgMHg1RSwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHg1QiwgMHhFNCwgMHg1OSwgMHg5NCwgMHg1RSwgLyogMHhCQy0weEJGICovCisJMHhFNCwgMHg1QywgMHgwMCwgMHgwMCwgMHhFNCwgMHg1RCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHhCMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHhFNCwgMHg2NCwgMHhFNCwgMHg1RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHg2MSwgMHgwMCwgMHgwMCwgMHg5MSwgMHg5RiwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhFNCwgMHg2MywgMHhFNCwgMHg2MiwgMHhFNCwgMHg2NSwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHg2NiwgLyogMHhEQy0weERGICovCisJMHhFNCwgMHg2NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg2MiwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHg4OSwgMHhFNywgMHgwMCwgMHgwMCwgMHhFNCwgMHg2OCwgLyogMHhFNC0weEU3ICovCisJMHg5NywgMHhENSwgMHgwMCwgMHgwMCwgMHg4RSwgMHhBOSwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHg4RiwgMHg0QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHg4QSwgLyogMHhGMC0weEYzICovCisJMHg5MiwgMHg3NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHg2OSwgMHhFNCwgMHg2QSwgLyogMHhGOC0weEZCICovCisJMHg4OSwgMHg1MCwgMHgwMCwgMHgwMCwgMHhFNCwgMHg2QiwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODJbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEU0LCAweDZDLCAweEU0LCAweDZELCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweDZFLCAweDAwLCAweDAwLCAweEU0LCAweDZGLCAvKiAweDA0LTB4MDcgKi8KKwkweDhCLCAweEJCLCAweDlELCAweEE4LCAweEU0LCAweDcwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDkwLCAweEUzLCAweEU0LCAweDcxLCAweDhFLCAweEM5LCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEU0LCAweDcyLCAweDAwLCAweDAwLCAweDk4LCAweEFFLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweDczLCAweDk1LCAweERDLCAvKiAweDE0LTB4MTcgKi8KKwkweDhBLCAweERBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweDQzLCAvKiAweDE4LTB4MUIgKi8KKwkweDhGLCAweDc3LCAweDAwLCAweDAwLCAweDk1LCAweDkxLCAweDhGLCAweDRELCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweDc0LCAweDhELCAweDcxLCAweEU0LCAweDc1LCAvKiAweDI4LTB4MkIgKi8KKwkweDk0LCAweENBLCAweDAwLCAweDAwLCAweEU0LCAweDg0LCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweDc3LCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDkxLCAweEM3LCAweDk0LCAweDk1LCAweDhDLCAweEJELCAvKiAweDM0LTB4MzcgKi8KKwkweEU0LCAweDc2LCAweDkxLCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweEU0LCAweDc4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweEY4LCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEU0LCAweDdBLCAweEU0LCAweDc5LCAweEU0LCAweDdDLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweDdCLCAweDAwLCAweDAwLCAweEU0LCAweDdELCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweDgwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEU0LCAweDdFLCAweDAwLCAweDAwLCAweDhBLCAweENELCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEU0LCAweDgxLCAweDAwLCAweDAwLCAweEU0LCAweDgyLCAweEU0LCAweDgzLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweEFGLCAweDk3LCAweEM3LCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweDg1LCAweDkwLCAweDQ2LCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDkwLCAweEU0LCAweDg2LCAvKiAweDc0LTB4NzcgKi8KKwkweEU0LCAweDg3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweDg4LCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweEYwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweDg5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweDhBLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweDg3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDhFLCAweEM1LCAweDAwLCAweDAwLCAweEU0LCAweDhDLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDhBLCAweDQ4LCAweDg4LCAweEIwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweDhCLCAvKiAweEE4LTB4QUIgKi8KKwkweEU0LCAweDhFLCAweDk0LCAweDZELCAweDAwLCAweDAwLCAweDkwLCAweDYzLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDg5LCAweEQ0LCAweDAwLCAweDAwLCAweDk2LCAweDQ2LCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDhDLCAweDdDLCAweDhCLCAweERBLCAweDAwLCAweDAwLCAweEU0LCAweDhELCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDg5LCAweEU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDhBLCAweEExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDg5LCAweDkxLCAweEU0LCAweDkyLCAweDk3LCAweEU4LCAvKiAweEQwLTB4RDMgKi8KKwkweDkxLCAweERCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweDYzLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweDlFLCAweDAwLCAweDAwLCAweDg5LCAweEQ1LCAvKiAweEQ4LTB4REIgKi8KKwkweEU0LCAweDlDLCAweDAwLCAweDAwLCAweEU0LCAweDlBLCAweEU0LCAweDkxLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweDhGLCAweDAwLCAweDAwLCAweEU0LCAweDkwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDhFLCAweEUxLCAweDhCLCAweEVBLCAweDkyLCAweDk3LCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweENGLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDg5LCAweDcwLCAweDAwLCAweDAwLCAweEU0LCAweDk0LCAvKiAweEYwLTB4RjMgKi8KKwkweEU0LCAweDkzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweDk5LCAweEU0LCAweDk1LCAweEU0LCAweDk4LCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184M1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4RUUsIDB4NzYsIDB4OTYsIDB4Q0UsIDB4RTQsIDB4OTcsIC8qIDB4MDAtMHgwMyAqLworCTB4ODksIDB4RDYsIDB4OEEsIDB4OUQsIDB4RTQsIDB4OUIsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4OUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4NzMsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QTEsIDB4RTQsIDB4QUEsIC8qIDB4MTQtMHgxNyAqLworCTB4RTQsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4ODgsIDB4QTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QjIsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4ODgsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QTksIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QTgsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4QTMsIDB4RTQsIDB4QTIsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4RTQsIDB4QTAsIDB4RTQsIDB4OUYsIDB4OTIsIDB4ODMsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4OTEsIDB4RjksIDB4RTQsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4RTQsIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4OTEsIDB4OTAsIDB4OEMsIDB4NzQsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4NjAsIC8qIDB4NEMtMHg0RiAqLworCTB4RTQsIDB4QTYsIDB4MDAsIDB4MDAsIDB4OEQsIDB4NzIsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4OTEsIDB4OTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NzcsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QjgsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4QjksIDB4MDAsIDB4MDAsIDB4ODksIDB4RDcsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4QUMsIC8qIDB4NzgtMHg3QiAqLworCTB4RTQsIDB4QjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NzgsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4QUMsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QjQsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4QkIsIDB4RTQsIDB4QjUsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QjMsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4OTYsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QUQsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4Q0UsIDB4RTQsIDB4QUYsIC8qIDB4OUMtMHg5RiAqLworCTB4RTQsIDB4QkEsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QjAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4RTQsIDB4QkMsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QUUsIDB4OTQsIDB4OUMsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4OTcsIDB4ODksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4QjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4OTAsIDB4OUIsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NzksIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4NjUsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4OEIsIDB4REIsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QzAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4RDksIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4RDIsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4RTQsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4OEQsIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4NzAsIC8qIDB4REMtMHhERiAqLworCTB4RTQsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4RUMsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QkYsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4RDgsIC8qIDB4RUMtMHhFRiAqLworCTB4OEMsIDB4RDQsIDB4OTUsIDB4NDgsIDB4RTQsIDB4QzksIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RTQsIDB4QkQsIDB4MDAsIDB4MDAsIDB4RUUsIDB4N0EsIDB4RTQsIDB4QzYsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4RDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzg0WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhDMiwgLyogMHgwMC0weDAzICovCisJMHg5MywgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhDNywgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhDNCwgLyogMHgwOC0weDBCICovCisJMHg5NiwgMHg0NywgMHhFNCwgMHhDQSwgMHg4OCwgMHhERSwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhCRSwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhFNCwgMHhDQywgMHgwMCwgMHgwMCwgMHhFNCwgMHhDQiwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHg4QiwgMHhFNCwgMHhEMiwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhFNCwgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHg4QSwgMHg5RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhFNCwgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhFNCwgMHhEMywgMHg5NywgMHg4RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhEQywgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhFRSwgMHg3QiwgMHg5NywgMHg3NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHhBOCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHg5OCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHg4QiwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHg5MiwgMHhFNCwgMHhFMiwgMHg5MywgMHg5RiwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHhBRiwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhEQiwgMHgwMCwgMHgwMCwgMHhFNCwgMHhENywgLyogMHg2OC0weDZCICovCisJMHg5MSwgMHg5MiwgMHhFNCwgMHhEMSwgMHhFNCwgMHhEOSwgMHhFNCwgMHhERSwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHg0QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHg4OCwgMHhBOCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhENiwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhERiwgMHg5NSwgMHg5OCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhEQSwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhFNCwgMHhENSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHhEMywgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHg4RiwgMHg0RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHg4RSwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHg5NiwgMHhENiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHg5NSwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhFNSwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhFRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhEOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHg5NywgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHhFRSwgMHg3QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHg4RiwgMHhGNiwgMHhFNCwgMHhFMywgMHgwMCwgMHgwMCwgMHhFNCwgMHhFOCwgLyogMHhCOC0weEJCICovCisJMHg5MSwgMHg5MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhFNCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhFQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHg5MiwgMHg3RSwgMHgwMCwgMHgwMCwgMHhFNCwgMHhFQywgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHg3NSwgMHhFNCwgMHhFMSwgMHg4QSwgMHg1NywgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhFNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHhFNCwgMHhFQSwgMHg5NiwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhFRCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhFNiwgMHhFNCwgMHhFOSwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhFRCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHg5NiwgMHg0OCwgMHgwMCwgMHgwMCwgMHg5OCwgMHg0MCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhFNCwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHhFNCwgMHhGOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhGMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODVbNTEyXSA9IHsKKwkweDhFLCAweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweENGLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweENDLCAweDAwLCAweDAwLCAweDk2LCAweEEwLCAvKiAweDEwLTB4MTMgKi8KKwkweEU0LCAweEY3LCAweEU0LCAweEY2LCAweDAwLCAweDAwLCAweEU0LCAweEYyLCAvKiAweDE0LTB4MTcgKi8KKwkweEU0LCAweEYzLCAweDAwLCAweDAwLCAweDg5LCAweDU1LCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEY1LCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweEVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweEQzLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweEU0LCAweEY0LCAweDg4LCAweEZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDkxLCAweEEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweEU0LCAweEY5LCAweEU1LCAweDQwLCAweDAwLCAweDAwLCAweDk0LCAweEQ3LCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEU0LCAweEZDLCAweDhGLCAweEQ0LCAweDhFLCAweEM3LCAweEU1LCAweDQyLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweEJDLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweDdELCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweDQzLCAweDAwLCAweDAwLCAweDk1LCAweDk5LCAvKiAweDU0LTB4NTcgKi8KKwkweEU0LCAweEZCLCAweEVFLCAweDdFLCAweEU0LCAweEQ0LCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEZBLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDk4LCAweDZFLCAweDkzLCAweEEwLCAweDk1LCAweDkzLCAweEVFLCAweDgwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweDRBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweDUwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweDUxLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEU1LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDk0LCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweDRFLCAvKiAweDg0LTB4ODcgKi8KKwkweEU1LCAweDQ2LCAweDAwLCAweDAwLCAweEU1LCAweDQ4LCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweEU1LCAweDUyLCAweEU1LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEU1LCAweDRCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDkyLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDkzLCAweEUzLCAweDAwLCAweDAwLCAweEU1LCAweDRDLCAvKiAweDk4LTB4OUIgKi8KKwkweEU1LCAweDRGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEU1LCAweDQ1LCAweDAwLCAweDAwLCAweDkxLCAweDQ1LCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEU1LCAweDQ5LCAweDhFLCAweDQ2LCAweDkwLCAweDY0LCAweDhDLCAweDRGLCAvKiAweEE4LTB4QUIgKi8KKwkweDk2LCAweEYyLCAweDAwLCAweDAwLCAweDk2LCAweEY3LCAweDhGLCAweDkyLCAvKiAweEFDLTB4QUYgKi8KKwkweEVFLCAweDgyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweDU2LCAweEU1LCAweDU0LCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDk4LCAweDZELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweDUzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweDk1LCAweDAwLCAweDAwLCAweEU1LCAweDU1LCAvKiAweENDLTB4Q0YgKi8KKwkweEU1LCAweDU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweDU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweEU1LCAweDVCLCAweEU1LCAweDU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDkzLCAweEExLCAweEU1LCAweDVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweENCLCAweEU1LCAweDRELCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweDkzLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweDVDLCAweEU1LCAweDYxLCAweDkxLCAweDk0LCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweDYwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184Nls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NDEsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NjIsIDB4OTEsIDB4NjgsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NUQsIDB4RTUsIDB4NUYsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NUUsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NTAsIDB4OUYsIDB4NDEsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NjQsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NjMsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4OTcsIDB4OTYsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QkEsIC8qIDB4MkMtMHgyRiAqLworCTB4RTUsIDB4NjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NjYsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4NjcsIDB4OEMsIDB4RDUsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4OEIsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4RTUsIDB4NjksIDB4OTksIDB4N0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4OTUsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4OTcsIDB4QjgsIDB4MDAsIDB4MDAsIDB4OEIsIDB4RjEsIDB4RTUsIDB4NkEsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NkIsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4OEUsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4NkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4RjgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4QjgsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4RTEsIDB4RTUsIDB4NzEsIC8qIDB4ODgtMHg4QiAqLworCTB4RTUsIDB4NzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NkQsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4OEUsIDB4NUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NkUsIC8qIDB4QTAtMHhBMyAqLworCTB4OTQsIDB4NjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4NkYsIDB4RTUsIDB4NzAsIDB4RTUsIDB4N0EsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NzQsIC8qIDB4QUMtMHhBRiAqLworCTB4RTUsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NzMsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RTUsIDB4NzUsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NzYsIDB4OEUsIDB4RDYsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4NzgsIDB4MDAsIDB4MDAsIDB4OTIsIDB4NjAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4NzUsIDB4OEEsIDB4NjEsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RTUsIDB4N0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4OEEsIDB4NUUsIDB4MDAsIDB4MDAsIDB4RTUsIDB4ODEsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4N0MsIDB4RTUsIDB4ODAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4OTQsIDB4QjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4N0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4RTUsIDB4N0UsIDB4OTUsIDB4NjcsIDB4OTQsIDB4RDgsIDB4RTUsIDB4ODIsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4OTEsIDB4RkIsIDB4RTUsIDB4OEMsIDB4MDAsIDB4MDAsIDB4RTUsIDB4ODgsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4RTksIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzg3WzUxMl0gPSB7CisJMHhFNSwgMHg4NiwgMHgwMCwgMHgwMCwgMHg5NiwgMHg0OSwgMHhFNSwgMHg4NywgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg4NCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhFNSwgMHg4NSwgMHhFNSwgMHg4QSwgMHhFNSwgMHg4RCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHg4QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHg4OSwgMHhFNSwgMHg4MywgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHg5MiwgMHg3NywgMHgwMCwgMHgwMCwgMHhFNSwgMHg5NCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHg5NiwgMHhBOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHg5MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHg5MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhFNSwgMHg4RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg5MCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg5MSwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg4RiwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHg5MCwgMHhFNCwgMHgwMCwgMHgwMCwgMHg5OCwgMHg1OCwgLyogMHg0OC0weDRCICovCisJMHhFNSwgMHg5OCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg5OSwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg5RiwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHg5MCwgMHg0OSwgMHgwMCwgMHgwMCwgMHhFNSwgMHg5QiwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHg5RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg5NiwgLyogMHg1Qy0weDVGICovCisJMHhFNSwgMHg5NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhBMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHhEQSwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhFNSwgMHg5QywgMHgwMCwgMHgwMCwgMHhFNSwgMHhBMSwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg5RCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhFNSwgMHg5QSwgMHgwMCwgMHgwMCwgMHg5MiwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHhFNSwgMHg5NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHg4OCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhBNSwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHg1QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhBNCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhBMywgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhBQywgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhBNiwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhBRSwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHg4NiwgMHhFNSwgMHhCMSwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHhBOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhFNSwgMHhBOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhFNSwgMHhBRCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhCMCwgMHhFNSwgMHhBRiwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhBNywgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHhFNSwgMHhBQSwgMHgwMCwgMHgwMCwgMHhFNSwgMHhCQiwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHhFNSwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhCMiwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhCMywgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhCOCwgMHhFNSwgMHhCOSwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHg4QSwgMHg0OSwgMHgwMCwgMHgwMCwgMHg4QiwgMHg2MSwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhCNywgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODhbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEEyLCAweDAwLCAweDAwLCAweEVFLCAweDg1LCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEI2LCAweEU1LCAweEJBLCAweEU1LCAweEI1LCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEJFLCAweEU1LCAweEJELCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEMwLCAweEU1LCAweEJGLCAweEU1LCAweDc5LCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEM0LCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEMyLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEMzLCAweDAwLCAweDAwLCAweEU1LCAweEM1LCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDhDLCAweDhDLCAweDAwLCAweDAwLCAweEU1LCAweEM3LCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEU1LCAweEM2LCAweDAwLCAweDAwLCAweDhGLCAweDRGLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDhELCAweDczLCAweDlGLCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEM4LCAweDhGLCAweDcwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweDU4LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEM5LCAweDAwLCAweDAwLCAweDg5LCAweDcxLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweEQ1LCAweEU1LCAweENBLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDhELCAweDc0LCAweEU1LCAweENCLCAweDg4LCAweERGLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDk1LCAweDVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweENDLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDkwLCAweDhBLCAweDAwLCAweDAwLCAweEU1LCAweEQzLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEQwLCAweDAwLCAweDAwLCAweDkyLCAweDhGLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEQxLCAweEU1LCAweENFLCAweDhCLCAweERDLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweEU1LCAweENELCAweEU1LCAweEQ0LCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDhDLCAweDU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweERDLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweERBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEQ2LCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweEIzLCAweEU1LCAweEQ1LCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweENGLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEQ5LCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEU1LCAweERCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweEVELCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEQ3LCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweEU1LCAweERDLCAweEU1LCAweERFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDhDLCAweEQxLCAweEU1LCAweEQyLCAweDAwLCAweDAwLCAweDg4LCAweEJGLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweERELCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDhELCAweEQ5LCAweDk3LCAweEY0LCAweEU1LCAweERGLCAvKiAweEMwLTB4QzMgKi8KKwkweEU1LCAweEUwLCAweDkxLCAweDk1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweEEwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEU1LCAweEUxLCAweDk3LCAweDU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEU1LCAweEUyLCAweEU1LCAweEUzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDk1LCAweEUyLCAweEU1LCAweEU0LCAweDAwLCAweDAwLCAweDhELCAweEJFLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweEExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEU1LCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEVBLCAweDhGLCAweEQ2LCAvKiAweEYwLTB4RjMgKi8KKwkweEU1LCAweEU4LCAweEVFLCAweDg2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDk3LCAweDg3LCAweEU1LCAweEU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweEU1LCAweEU3LCAweDkwLCAweEJCLCAweDkwLCAweDlFLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184OVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RTYsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RTUsIDB4RUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4QTEsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RUQsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4RTUsIDB4RUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4OEEsIDB4OEMsIDB4MDAsIDB4MDAsIDB4OTYsIDB4NEEsIDB4RTUsIDB4RUUsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4RUQsIDB4NDEsIDB4RTUsIDB4RkEsIDB4RTUsIDB4RjAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4RjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RjIsIDB4RTUsIDB4RjMsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RjcsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4RTUsIDB4RjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RjYsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4RjQsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RUYsIC8qIDB4NDAtMHg0MyAqLworCTB4RTUsIDB4RjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4RTUsIDB4RjksIDB4RTgsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RkMsIDB4OEIsIDB4REQsIC8qIDB4NUMtMHg1RiAqLworCTB4RTUsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4RTYsIDB4NDEsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NDMsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4NDIsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NDQsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4NTAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4RTYsIDB4NDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NDYsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NDcsIDB4OTAsIDB4QkMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4OTcsIDB4NzYsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NDgsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4QTIsIDB4OTQsIDB4NjUsIC8qIDB4ODQtMHg4NyAqLworCTB4RTYsIDB4NDksIDB4MDAsIDB4MDAsIDB4RTYsIDB4NEEsIDB4OEMsIDB4QTksIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4NEIsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NEIsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4OEIsIDB4OTQsIDB4NjAsIC8qIDB4OTQtMHg5NyAqLworCTB4RTYsIDB4NEMsIDB4MDAsIDB4MDAsIDB4OEEsIDB4NkYsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4NEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NEYsIDB4OTcsIDB4OTcsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4NEUsIDB4OTAsIDB4NjUsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4RTYsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NTEsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NTIsIDB4OEEsIDB4Q0YsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NTMsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4NTQsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NTUsIC8qIDB4QkMtMHhCRiAqLworCTB4RTYsIDB4NTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4NzAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NTcsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4RTYsIDB4NTgsIDB4RTYsIDB4NTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4RjAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4NDcsIDB4RTYsIDB4NUEsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RTYsIDB4NUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4RTYsIDB4NUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzhBWzUxMl0gPSB7CisJMHg4QywgMHhCRSwgMHgwMCwgMHgwMCwgMHg5MiwgMHhGOSwgMHhFNiwgMHg1RCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHg4QywgMHg3NiwgMHgwMCwgMHgwMCwgMHg5MCwgMHg3NSwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhFNiwgMHg2MCwgMHgwMCwgMHgwMCwgMHg5MywgMHhBMiwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhFNiwgMHg1RiwgMHgwMCwgMHgwMCwgMHhFRSwgMHg4NywgMHg4QywgMHg1MCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHg1RSwgMHg5MSwgMHhGNSwgLyogMHgxNC0weDE3ICovCisJMHg4QiwgMHg0QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHg2MSwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHg2MiwgMHgwMCwgMHgwMCwgMHg4RiwgMHhENywgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHg4RCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHg2MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg0QiwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHg5MCwgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHg5NiwgMHgwMCwgMHgwMCwgMHg5NiwgMHhGMywgLyogMHgzMC0weDMzICovCisJMHg5MSwgMHg2OSwgMHgwMCwgMHgwMCwgMHhFNiwgMHg2NCwgMHhFRSwgMHg4OCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg2NiwgMHg5MiwgMHg5MCwgLyogMHgzOC0weDNCICovCisJMHg4RiwgMHhEOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHg2NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHg2OCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhFNiwgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHg4RCwgMHhCQywgMHg5MSwgMHhDMCwgMHhFNiwgMHg2NywgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHg4RiwgMHhEOSwgMHg5NSwgMHg1RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHg2NiwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHg4QywgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHg4OSwgMHg3MiwgMHgwMCwgMHgwMCwgMHhFNiwgMHg2RCwgMHg4QywgMHg3NywgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHg4RSwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHg4RSwgMHg4RCwgMHgwMCwgMHgwMCwgMHg5OCwgMHg2QywgLyogMHg2OC0weDZCICovCisJMHhFNiwgMHg2QywgMHhFNiwgMHg2QiwgMHg5MSwgMHg0NiwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHg4QiwgMHg2QywgMHg5OCwgMHg2MiwgMHg4QSwgMHg1OSwgMHg4RiwgMHhEQSwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHg4OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhFNiwgMHg2QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHg2RiwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhFNiwgMHg3MCwgMHhFNiwgMHg2RSwgMHgwMCwgMHgwMCwgMHg4QywgMHhENiwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHg1RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHg4RSwgMHg4RiwgMHg5NCwgMHg0NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHg3MywgMHgwMCwgMHgwMCwgMHg5MCwgMHhCRSwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHg5MiwgMHg2MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHg5NywgMHg1NSwgMHgwMCwgMHgwMCwgMHhFNiwgMHg3NiwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHhFQSwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHg5MCwgMHhCRCwgMHhFNiwgMHg3MiwgMHgwMCwgMHgwMCwgMHhFNiwgMHg3NywgLyogMHhBMC0weEEzICovCisJMHg4QywgMHhFQiwgMHhFNiwgMHg3NCwgMHhFNiwgMHg3NSwgMHhFRSwgMHg4QSwgLyogMHhBNC0weEE3ICovCisJMHhFNiwgMHg3MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHg5MCwgMHhFMCwgMHg5MywgMHhDNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHg5MiwgMHg0RSwgMHgwMCwgMHgwMCwgMHg4OSwgMHhEQiwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHhFRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHg4QiwgMHg2MiwgMHgwMCwgMHgwMCwgMHhFRSwgMHg4QiwgMHg5MiwgMHhCMiwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHg3QSwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhFNiwgMHg3OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHg2QiwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHhCRiwgLyogMHhDOC0weENCICovCisJMHg4QSwgMHhEMCwgMHhFNiwgMHg3OSwgMHgwMCwgMHgwMCwgMHg5MCwgMHg3QSwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHhDOCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OCwgMHg1RiwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHg3QiwgMHhFNiwgMHg4NywgLyogMHhEOC0weERCICovCisJMHg5MiwgMHhCMywgMHgwMCwgMHgwMCwgMHhFNiwgMHg4NiwgMHhFRSwgMHg4QywgLyogMHhEQy0weERGICovCisJMHhFNiwgMHg4MywgMHhFNiwgMHg4QiwgMHhFNiwgMHg4NCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHhFNiwgMHg4MCwgMHgwMCwgMHgwMCwgMHg5MiwgMHhGQSwgMHhFNiwgMHg3RSwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHg3QywgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHg0MCwgMHg4RSwgMHg5MCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHg4MSwgMHgwMCwgMHgwMCwgMHhFNiwgMHg3RCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHg4RSwgMHhFNiwgMHg4NSwgLyogMHhGNC0weEY3ICovCisJMHg4RiwgMHg5NCwgMHgwMCwgMHgwMCwgMHg4QywgMHhCRiwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHhGOCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOEJbNTEyXSA9IHsKKwkweDk2LCAweDY0LCAweDg5LCAweDc5LCAweDg4LCAweEUwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDkzLCAweEEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweDg5LCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEU2LCAweDg4LCAweDAwLCAweDAwLCAweDkzLCAweEU0LCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEU2LCAweDhELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweEU2LCAweDgyLCAweDAwLCAweDAwLCAweEU2LCAweDhDLCAweEU2LCAweDhFLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDhDLCAweEFBLCAweEU2LCAweDhBLCAweDhELCAweDc1LCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDhFLCAweEQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEU2LCAweDhGLCAweDk3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweDkyLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweEU2LCAweDk1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweDkzLCAvKiAweDI4LTB4MkIgKi8KKwkweDk1LCAweDU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweDkwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDhCLCAweERFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweDk0LCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweDlBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEU2LCAweDk3LCAweDAwLCAweDAwLCAweEU2LCAweDk5LCAweEU2LCAweDk4LCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweDhGLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweDlCLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDhFLCAweEFGLCAweDAwLCAweDAwLCAweEU2LCAweDlELCAweEU2LCAweDlDLCAvKiAweDU4LTB4NUIgKi8KKwkweDk1LCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweDlGLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweDc4LCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweDlFLCAvKiAweDY4LTB4NkIgKi8KKwkweEU2LCAweEEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEExLCAvKiAweDZDLTB4NkYgKi8KKwkweDhCLCAweDYzLCAweEUzLCAweEJGLCAweDhGLCAweEY3LCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEU2LCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweEVDLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEEzLCAweDAwLCAweDAwLCAweEVFLCAweDkwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEU2LCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDVELCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweENDLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweEU2LCAweEE1LCAweDAwLCAweDAwLCAweEU2LCAweEE2LCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDhGLCAweDUxLCAweDAwLCAweDAwLCAweEU2LCAweEE3LCAweEU2LCAweEE4LCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEE5LCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEFBLCAweEU2LCAweEFCLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184Q1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4NEEsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4QUMsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4QUUsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4QTQsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RTYsIDB4QUYsIDB4MDAsIDB4MDAsIDB4OTYsIDB4NEMsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4RTYsIDB4QjAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4RTYsIDB4QjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4QjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4RDgsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4OEYsIDB4REIsIDB4RTYsIDB4QjQsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEQsIDB4OEIsIDB4OTgsIDB4QUMsIC8qIDB4NjgtMHg2QiAqLworCTB4RTYsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4RTYsIDB4QjYsIDB4OTUsIDB4NUUsIDB4RTYsIDB4QjcsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4RTYsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4QjgsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4QkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4QjksIDB4RTYsIDB4QkIsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4OTYsIDB4NjUsIDB4RTYsIDB4QkMsIDB4RTYsIDB4QkQsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4RTYsIDB4QkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4RTYsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4OEEsIDB4NEMsIDB4OTIsIDB4RTUsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4OTUsIDB4ODksIDB4OEQsIDB4RTAsIDB4OEQsIDB4NzYsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4NkUsIC8qIDB4QTQtMHhBNyAqLworCTB4ODksIDB4REQsIDB4OTQsIDB4Q0MsIDB4RTYsIDB4QzMsIDB4OEEsIDB4RDEsIC8qIDB4QTgtMHhBQiAqLworCTB4OTAsIDB4RDMsIDB4RTYsIDB4QzIsIDB4RTYsIDB4QzcsIDB4OTIsIDB4OTksIC8qIDB4QUMtMHhBRiAqLworCTB4OTYsIDB4RTEsIDB4MDAsIDB4MDAsIDB4RTYsIDB4QzUsIDB4RTYsIDB4QzYsIC8qIDB4QjAtMHhCMyAqLworCTB4OEIsIDB4NEQsIDB4MDAsIDB4MDAsIDB4RTYsIDB4QzgsIDB4OTQsIDB4ODMsIC8qIDB4QjQtMHhCNyAqLworCTB4OTEsIDB4REQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4RUYsIC8qIDB4QjgtMHhCQiAqLworCTB4OTMsIDB4NUMsIDB4RTYsIDB4QzQsIDB4MDAsIDB4MDAsIDB4OTYsIDB4NjYsIC8qIDB4QkMtMHhCRiAqLworCTB4ODksIDB4RUEsIDB4RTYsIDB4Q0EsIDB4OTgsIDB4NDcsIDB4OTIsIDB4QzAsIC8qIDB4QzAtMHhDMyAqLworCTB4OTgsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4OTEsIC8qIDB4QzQtMHhDNyAqLworCTB4RTYsIDB4QzksIDB4MDAsIDB4MDAsIDB4OTEsIDB4QUYsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4REEsIDB4OTEsIDB4NDcsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4RjYsIDB4MDAsIDB4MDAsIDB4OTUsIDB4NkYsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4Q0QsIDB4OEUsIDB4NUUsIC8qIDB4RDgtMHhEQiAqLworCTB4OEUsIDB4OTIsIDB4MDAsIDB4MDAsIDB4OEYsIDB4REMsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4OTQsIDB4ODUsIDB4MDAsIDB4MDAsIDB4OEMsIDB4QUIsIDB4RTYsIDB4Q0MsIC8qIDB4RTAtMHhFMyAqLworCTB4RTYsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4OTUsIDB4OEEsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4QkYsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4NzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4RUUsIDB4OTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RUUsIDB4OTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4Q0YsIDB4RTYsIDB4RDAsIC8qIDB4RjgtMHhGQiAqLworCTB4OEQsIDB4NzcsIDB4RTYsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzhEWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhFNiwgMHhEMSwgMHhFNiwgMHhEMiwgMHgwMCwgMHgwMCwgMHhFNiwgMHhENCwgLyogMHgwNC0weDA3ICovCisJMHg5MSwgMHhBMSwgMHgwMCwgMHgwMCwgMHhFNiwgMHhEMywgMHg4QSwgMHhFNCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhENiwgMHgwMCwgMHgwMCwgMHhFNiwgMHhENSwgLyogMHgwQy0weDBGICovCisJMHhFNiwgMHhENywgMHgwMCwgMHgwMCwgMHhFRSwgMHg5MywgMHhFNiwgMHhEOSwgLyogMHgxMC0weDEzICovCisJMHhFNiwgMHhEQiwgMHgwMCwgMHgwMCwgMHhFNiwgMHhEQywgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHg5MCwgMHhENCwgMHgwMCwgMHgwMCwgMHg4RSwgMHhDRCwgMHhFNiwgMHhERCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHg3MSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhERSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHg5MSwgMHg5NiwgMHhFNiwgMHhERiwgMHgwMCwgMHgwMCwgMHhFNiwgMHhFMCwgLyogMHg3MC0weDczICovCisJMHg5NSwgMHg4QiwgMHgwMCwgMHgwMCwgMHhFRSwgMHg5NCwgMHg4QiwgMHg0RSwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhFMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHg5MiwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHg3QSwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhFMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHhFRiwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHg5MCwgMHg5NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHhBQiwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhFNSwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhFNCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhFMywgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhFQiwgLyogMHhDOC0weENCICovCisJMHhFNiwgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhFNiwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhFOCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhFNywgMHhFNiwgMHhFQSwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHg5NywgMHgwMCwgMHgwMCwgMHhFNiwgMHhFRSwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHg5MCwgMHhENSwgMHgwMCwgMHgwMCwgMHhFNiwgMHhFRiwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHg4QywgMHhENywgMHgwMCwgMHgwMCwgMHhFNiwgMHhFQywgMHhFNiwgMHhFRCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OCwgMHg0OCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHhCNSwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHg5MSwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHhFNiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhGMywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOEVbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEU2LCAweEYxLCAweEU2LCAweEYyLCAweDk3LCAweDc4LCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweEE1LCAvKiAweDBDLTB4MEYgKi8KKwkweEU2LCAweEY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEY0LCAweEU2LCAweEY1LCAweEU2LCAweEY3LCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweDQ4LCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEU2LCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweEU2LCAweEZCLCAweEU2LCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEY4LCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDkyLCAweEZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweDQwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEU3LCAweDQ0LCAweEU3LCAweDQxLCAweEU2LCAweEZDLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEU3LCAweDQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEU3LCAweDQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweDRBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweDQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweEQ2LCAvKiAweDVDLTB4NUYgKi8KKwkweEU3LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweDQ5LCAvKiAweDYwLTB4NjMgKi8KKwkweEU3LCAweDQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweDRDLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDhGLCAweDUyLCAweDAwLCAweDAwLCAweEU3LCAweDRCLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEU3LCAweDRELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweEU3LCAweDRFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEU3LCAweDUxLCAweEU3LCAweDUwLCAweDAwLCAweDAwLCAweEU3LCAweDRGLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweDUzLCAweEU3LCAweDUyLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDk2LCAweEY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweDU1LCAweDAwLCAweDAwLCAweEU3LCAweDU0LCAvKiAweDkwLTB4OTMgKi8KKwkweEU3LCAweDU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweDU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweDU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweDU4LCAweDkwLCAweDY3LCAvKiAweEE4LTB4QUIgKi8KKwkweEU3LCAweDVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweEVCLCAvKiAweEFDLTB4QUYgKi8KKwkweEU3LCAweDVCLCAweEU3LCAweDVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweDVFLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweDVGLCAweEU3LCAweDVDLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweEU3LCAweDYwLCAweDAwLCAweDAwLCAweDhFLCAweEQ0LCAweEU3LCAweDYxLCAvKiAweEM4LTB4Q0IgKi8KKwkweDhCLCAweDRGLCAweDhDLCAweDUyLCAweDAwLCAweDAwLCAweEVFLCAweDk2LCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweEFDLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweDYyLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweEVFLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweDVELCAweEU3LCAweDYzLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweDY2LCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDhFLCAweEIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweDY1LCAvKiAweEY4LTB4RkIgKi8KKwkweEU3LCAweDY0LCAweDhDLCAweDc5LCAweEU3LCAweDY3LCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184Rls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4NzIsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4NjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4REEsIDB4RTcsIDB4NjgsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4RTcsIDB4NzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NkIsIDB4RTcsIDB4NkQsIC8qIDB4MTAtMHgxMyAqLworCTB4OTUsIDB4RTMsIDB4RTcsIDB4NkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4NkMsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NzAsIC8qIDB4MTgtMHgxQiAqLworCTB4RTcsIDB4NkUsIDB4OEIsIDB4NTAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NkYsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NzIsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4OTQsIDB4NzksIDB4OTcsIDB4RDYsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4NTMsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NzMsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4OTcsIDB4NDEsIDB4RTcsIDB4NzUsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NzQsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NzgsIDB4OTcsIDB4NjAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NzcsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4OEEsIDB4OEQsIDB4RTcsIDB4NzYsIDB4RTcsIDB4N0IsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4N0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4RTcsIDB4NzksIDB4OTMsIDB4NTEsIDB4RTcsIDB4N0MsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4N0QsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4RTcsIDB4N0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEQsIDB4OEMsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4NDQsIDB4RTcsIDB4ODAsIDB4RTcsIDB4ODEsIC8qIDB4NjAtMHg2MyAqLworCTB4RTcsIDB4ODIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4NjgsIC8qIDB4OTgtMHg5QiAqLworCTB4RTcsIDB4ODMsIDB4MDAsIDB4MDAsIDB4OEUsIDB4QUIsIDB4RTcsIDB4ODQsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4ODUsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTksIDB4OUYsIC8qIDB4QTQtMHhBNyAqLworCTB4OTksIDB4OUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4ODYsIDB4RTMsIDB4OTAsIDB4RTcsIDB4ODcsIC8qIDB4QUMtMHhBRiAqLworCTB4OTIsIDB4NDMsIDB4OTAsIDB4NEEsIDB4OTQsIDB4NUYsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4ODgsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4RDMsIDB4OTIsIDB4RDIsIC8qIDB4QjgtMHhCQiAqLworCTB4OEQsIDB4OUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4NDgsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4NDksIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4OTYsIDB4OTgsIDB4OTAsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4N0QsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4OEIsIDB4REYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4OTUsIDB4RDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4ODksIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4OEIsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4OEEsIDB4ODksIDB4REUsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4RjQsIDB4RTcsIDB4OEMsIDB4OTQsIDB4OTcsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4NTIsIDB4MDAsIDB4MDAsIDB4RTcsIDB4OEQsIC8qIDB4RUMtMHhFRiAqLworCTB4OEYsIDB4NzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RTcsIDB4OEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4QzAsIC8qIDB4RjQtMHhGNyAqLworCTB4RTcsIDB4OUUsIDB4RTcsIDB4OTEsIDB4RTcsIDB4OTIsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4OTIsIDB4QzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzkwWzUxMl0gPSB7CisJMHg5MSwgMHhERSwgMHg5MSwgMHg5NywgMHgwMCwgMHgwMCwgMHg5MywgMHhBNiwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHg5MCwgMHg4QiwgMHg3NCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHg5OSwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHg5NiwgMHhFNywgMHhBMywgMHg5MywgMHhBNywgLyogMHgwQy0weDBGICovCisJMHg5MiwgMHg4MCwgMHhFNywgMHg5MywgMHgwMCwgMHgwMCwgMHg5MiwgMHhGQywgLyogMHgxMC0weDEzICovCisJMHg5MywgMHg3MiwgMHhFNywgMHg5NCwgMHhFNywgMHg5OCwgMHg5MCwgMHg4MCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHg4NywgMHg5MiwgMHhDQSwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHg5MCwgMHhDMCwgMHhFNywgMHg5NywgMHg5MSwgMHhBQywgLyogMHgxQy0weDFGICovCisJMHg5MSwgMHhBMiwgMHhFNywgMHg5NSwgMHg4OCwgMHhBNywgMHg5OCwgMHg0MSwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHg5QSwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHhERiwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHg4RiwgMHg1NCwgMHg5MCwgMHg2OSwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHg5QywgMHhFNywgMHg5QiwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHg4OCwgMHhFRCwgMHhFNywgMHg5RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHg5NSwgMHg0RSwgMHgwMCwgMHgwMCwgMHhFNywgMHhBNSwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHhEOSwgMHg5MCwgMHg4QiwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHg5MiwgMHg3OCwgMHgwMCwgMHgwMCwgMHg4QiwgMHhGNiwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHhBNCwgMHg5NywgMHg1NiwgMHg4OSwgMHg1RSwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHhENSwgMHg4OSwgMHhERiwgMHhFNywgMHg5RiwgLyogMHg0Qy0weDRGICovCisJMHhFNywgMHhBMCwgMHhFNywgMHhBMSwgMHhFNywgMHhBMiwgMHg5MywgMHhCOSwgLyogMHg1MC0weDUzICovCisJMHg5MiwgMHg0MiwgMHg4OCwgMHhFMSwgMHhFNywgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhFNywgMHhBNywgMHhFQSwgMHhBMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHg5MSwgMHhCQiwgMHgwMCwgMHgwMCwgMHhFNywgMHhBOCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHg4OSwgMHg5MywgMHg5MSwgMHg2QiwgMHgwMCwgMHgwMCwgMHg4QywgMHhBRCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHg3OSwgMHgwMCwgMHgwMCwgMHhFRSwgMHg5OSwgLyogMHg2NC0weDY3ICovCisJMHhFNywgMHhBOSwgMHg5MywgMHg0QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHg5MSwgMHg5OCwgMHg4RSwgMHhENSwgMHhFNywgMHhBQSwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhBRCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHg4RiwgMHg4NSwgMHhFNywgMHhBQiwgMHg5MSwgMHg0QSwgLyogMHg3NC0weDc3ICovCisJMHg5MSwgMHg0OSwgMHgwMCwgMHgwMCwgMHg4OCwgMHhFMiwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHg5NywgMHhDOSwgMHhFNywgMHhBRiwgMHgwMCwgMHgwMCwgMHg5NCwgMHhGMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhFNywgMHhCMSwgMHhFNywgMHhCMCwgMHhFNywgMHhBRSwgMHhFMiwgMHg4NCwgLyogMHg4MC0weDgzICovCisJMHg4QSwgMHhEMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHg4RSwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHhCMywgMHhFNywgMHhCMiwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhCNCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHg1NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHhERiwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg0RCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhFNywgMHhCNSwgMHgwMCwgMHgwMCwgMHg4RSwgMHhENywgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhCNiwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHg5MywgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHg4OCwgMHhFOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RCwgMHg3OCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OCwgMHg1OSwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhCQywgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHg5QSwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHg4QywgMHg1MywgMHhFNywgMHhCOSwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHhFNywgMHhCQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHg5NSwgMHg5NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHg4QSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHg1OCwgMHgwMCwgMHgwMCwgMHg4QiwgMHhCRCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTFbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEJELCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEJFLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweDlDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweEJGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweDlELCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDkzLCAweDQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEU3LCAweEMxLCAweDAwLCAweDAwLCAweEU3LCAweEMwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDkzLCAweEQxLCAweEU3LCAweEMyLCAweDhGLCAweDU1LCAvKiAweDQ4LTB4NEIgKi8KKwkweDhFLCAweERFLCAweDk0LCAweDdBLCAweDkyLCAweDkxLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweEYwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDkwLCAweDhDLCAweDAwLCAweDAwLCAweEU3LCAweEMzLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEU3LCAweEM0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweDdDLCAweEU3LCAweEM1LCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweEM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweEM3LCAweDk3LCAweDhGLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDhGLCAweDU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEM5LCAweEU3LCAweEM4LCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDhELCAweDc5LCAweDAwLCAweDAwLCAweDhELCAweDkzLCAvKiAweDc0LTB4NzcgKi8KKwkweDhFLCAweDVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweENDLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweDg2LCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweENCLCAweDAwLCAweDAwLCAweEU3LCAweENBLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDkxLCAweEU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDhDLCAweEVELCAweDAwLCAweDAwLCAweDkwLCAweEMxLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweEFFLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDhGLCAweDU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweENELCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDhGLCAweERELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEQwLCAweEU3LCAweENFLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweENGLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweEU3LCAweEQyLCAweEU3LCAweEQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDhGLCAweEY4LCAweDAwLCAweDAwLCAweEU3LCAweEQzLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweEU3LCAweEQ0LCAweEU3LCAweEQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweENFLCAweDhELCAweEQxLCAvKiAweEM0LTB4QzcgKi8KKwkweDhFLCAweERGLCAweEU3LCAweEQ2LCAweDAwLCAweDAwLCAweEU3LCAweEQ3LCAvKiAweEM4LTB4Q0IgKi8KKwkweDk3LCAweEEyLCAweDhGLCAweDY0LCAweDk2LCAweEVDLCAweDk3LCAweENBLCAvKiAweENDLTB4Q0YgKi8KKwkweEU3LCAweEQ4LCAweDhCLCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEQ5LCAweEVFLCAweDlGLCAvKiAweEQ0LTB4RDcgKi8KKwkweDkzLCAweDQyLCAweDAwLCAweDAwLCAweEVFLCAweDlFLCAweEU3LCAweERDLCAvKiAweEQ4LTB4REIgKi8KKwkweDhBLCAweDk4LCAweDkwLCAweDZBLCAweEVFLCAweEEwLCAweEU3LCAweERBLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweERCLCAweDAwLCAweDAwLCAweDkyLCAweERFLCAvKiAweEUwLTB4RTMgKi8KKwkweEVFLCAweEEzLCAweEVFLCAweEE0LCAweDk2LCAweDc0LCAweDhCLCAweEZBLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEExLCAweEVFLCAweEEyLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweERFLCAweEU3LCAweERGLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweEU3LCAweERELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEUxLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185Mls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4QTUsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4QTcsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4REQsIDB4OEEsIDB4NjIsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4RUUsIDB4QTYsIDB4RTcsIDB4RTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4RTcsIDB4RTIsIDB4RTcsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RTAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4NkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4RTcsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4OTcsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4RDgsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4QUUsIDB4RUUsIDB4QTgsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4RUUsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RUQsIC8qIDB4M0MtMHgzRiAqLworCTB4RUUsIDB4QTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4OTMsIDB4NTMsIDB4RTcsIDB4RTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RTcsIDB4RUIsIDB4RTcsIDB4RTksIDB4MDAsIDB4MDAsIDB4RTcsIDB4RUUsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4QUIsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4RTcsIDB4RUYsIDB4RUUsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RTcsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4QUMsIDB4RTcsIDB4RjQsIDB4ODksIDB4OTQsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RTYsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4QUIsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4RTcsIDB4RUEsIDB4MDAsIDB4MDAsIDB4OEYsIDB4REUsIDB4RUUsIDB4QUYsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4N0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4QjEsIC8qIDB4NzQtMHg3NyAqLworCTB4RUUsIDB4QjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4NjcsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OEIsIDB4RTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4NjUsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4QkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4RUQsIDB4NDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4OTEsIDB4NEMsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RjIsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4RUMsIDB4RTcsIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4OTYsIDB4QzEsIDB4MDAsIDB4MDAsIDB4OTIsIDB4QjYsIDB4RTcsIDB4RjMsIC8qIDB4OTgtMHg5QiAqLworCTB4RTcsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4QjAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4OTEsIDB4NEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RjcsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4RjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RjUsIC8qIDB4Q0MtMHhDRiAqLworCTB4RUUsIDB4QjYsIDB4MDAsIDB4MDAsIDB4OTYsIDB4NEUsIDB4RUUsIDB4QkEsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4QjgsIDB4MDAsIDB4MDAsIDB4RUUsIDB4QjQsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4RUUsIDB4QjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4OEYsIDB4OUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4QjMsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4RjgsIDB4OTUsIDB4REQsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4NjUsIDB4OTIsIDB4OTIsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4OEIsIDB4OTgsIDB4RUQsIDB4NDksIDB4RTcsIDB4RkEsIDB4RUUsIDB4QkQsIC8qIDB4RjgtMHhGQiAqLworCTB4OEQsIDB4N0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4QzAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzkzWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhDMiwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHg0QiwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhGOSwgLyogMHgwQy0weDBGICovCisJMHg5MCwgMHg4RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHg5MCwgMHg4RSwgMHhFOCwgMHg0MCwgMHhFOCwgMHg0MiwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhDMSwgMHhFRSwgMHhCRiwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHg4RiwgMHhGOSwgMHhFRSwgMHhCQywgMHhFOCwgMHg0MSwgMHhFOCwgMHg0MywgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhCQiwgMHg4QiwgMHhEMSwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHg5NSwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHhFMCwgLyogMHgyOC0weDJCICovCisJMHg5OCwgMHg0MiwgMHgwMCwgMHgwMCwgMHhFNywgMHhGQywgMHg4RCwgMHhGNiwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OCwgMHg1RSwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHg0NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHg0NCwgMHhFOCwgMHg0NiwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhFNywgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhFRCwgMHg0MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHhFNywgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHg3NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHg5MiwgMHhENSwgMHgwMCwgMHgwMCwgMHhFOCwgMHg0QiwgMHhFRSwgMHhDNCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHg2MiwgLyogMHg1OC0weDVCICovCisJMHhFOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhFOCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHg4QywgMHg0QywgMHgwMCwgMHgwMCwgMHhFOCwgMHg0QSwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhFRSwgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHg4QywgMHhBRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhFOCwgMHg0OSwgMHgwMCwgMHgwMCwgMHg4RiwgMHhERiwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHg4QSwgMHg5OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhFOCwgMHg0RiwgMHgwMCwgMHgwMCwgMHg4RCwgMHhCRCwgMHg5MSwgMHg5OSwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHhDOCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhFRSwgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHg1QSwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhFOCwgMHg0RCwgMHhFOCwgMHg0RSwgMHg5MiwgMHhDMSwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhFOCwgMHg0QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHg1NiwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhDNiwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHhFOCwgMHg1OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHhFOCwgMHg1OCwgMHg5MywgMHg0QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHg1MSwgMHhFOCwgMHg1MiwgLyogMHhENC0weEQ3ICovCisJMHhFOCwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHg1NywgMHhFRSwgMHhDNywgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHhCRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHhFOCwgMHg1QSwgMHhFOCwgMHg1NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhFOCwgMHg1MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHhFRSwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTRbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweDVFLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweDVGLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEU4LCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweDVELCAvKiAweDEwLTB4MTMgKi8KKwkweEU4LCAweDVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDhGLCAweEUwLCAweDkzLCAweEE4LCAweEU4LCAweDVCLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweDYyLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEM5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweDYzLCAweEU4LCAweDYxLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDkxLCAweEY2LCAweDAwLCAweDAwLCAweEU4LCAweDY1LCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweDY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEU4LCAweDY4LCAweEVFLCAweENBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEVFLCAweENCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDhBLCAweEQzLCAweEU4LCAweDY3LCAweDk2LCAweEY4LCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweDczLCAweEU4LCAweDY5LCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweDZDLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEU4LCAweDZBLCAweDAwLCAweDAwLCAweEU4LCAweDZCLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweDZELCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEU4LCAweDZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweDcwLCAweDAwLCAweDAwLCAweEU4LCAweDcxLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEU4LCAweDc0LCAweEU4LCAweDcyLCAweEU4LCAweDc1LCAweEU4LCAweDc3LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweEU4LCAweDc2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185NVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4QjcsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OTYsIDB4RTUsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NzgsIDB4OTEsIDB4NEQsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NzksIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4QzIsIDB4RTgsIDB4N0EsIDB4OEEsIDB4NEEsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4NUIsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4OEEsIDB4RDUsIDB4RUUsIDB4Q0MsIDB4OEEsIDB4RDQsIC8qIDB4OTAtMHg5MyAqLworCTB4RTgsIDB4N0IsIDB4MDAsIDB4MDAsIDB4RTgsIDB4N0MsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4RTgsIDB4N0QsIDB4RTgsIDB4N0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4RTgsIDB4ODAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4RDYsIDB4OEEsIDB4NzQsIC8qIDB4QTAtMHhBMyAqLworCTB4OEQsIDB4N0QsIDB4OTQsIDB4QjQsIDB4MDAsIDB4MDAsIDB4RTgsIDB4ODIsIC8qIDB4QTQtMHhBNyAqLworCTB4RTgsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4N0IsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4ODYsIDB4MDAsIDB4MDAsIDB4RTgsIDB4ODUsIC8qIDB4QjgtMHhCQiAqLworCTB4RTgsIDB4ODQsIDB4MDAsIDB4MDAsIDB4RTgsIDB4ODcsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4OEEsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4QzUsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4ODgsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4RTgsIDB4OEMsIDB4RTgsIDB4OEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RTgsIDB4OEUsIDB4RTgsIDB4OEQsIDB4RTgsIDB4OEYsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4OTMsIDB4QUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4RTgsIDB4OTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4OTEsIDB4RTgsIDB4OTMsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4OTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzk2WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHg5NSwgMHg4QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHg5NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhFOCwgMHg5NSwgMHgwMCwgMHgwMCwgMHg4RCwgMHhFMywgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHg5NiwgMHhFOCwgMHg5NywgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg2OCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHg2QSwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHhBMiwgLyogMHgzQy0weDNGICovCisJMHg5MSwgMHhDOSwgMHgwMCwgMHgwMCwgMHhFOCwgMHg5OCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHg5NSwgMHg4RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHg5QiwgLyogMHg0OC0weDRCICovCisJMHhFOCwgMHg5OSwgMHg4RCwgMHg3RSwgMHgwMCwgMHgwMCwgMHhFOCwgMHg5QSwgLyogMHg0Qy0weDRGICovCisJMHg4QywgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHhDMywgLyogMHg1OC0weDVCICovCisJMHhFOCwgMHg5RCwgMHhFOCwgMHg5RiwgMHhFOCwgMHg5RSwgMHhFOCwgMHhBMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHg0MCwgMHg5MCwgMHg3NywgLyogMHg2MC0weDYzICovCisJMHg4RiwgMHg5QywgMHg4QSwgMHhENywgMHhFOCwgMHhBMSwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHg4NiwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhFOCwgMHhBMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHg4OSwgMHg0MSwgMHgwMCwgMHgwMCwgMHhFOCwgMHhBMiwgMHg5MiwgMHhDMiwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHhDQiwgMHg5MywgMHhBOSwgMHhFOCwgMHg5QywgLyogMHg3NC0weDc3ICovCisJMHg5NywgMHhBNCwgMHgwMCwgMHgwMCwgMHg4QywgMHhBRiwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHg3QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHhGNywgMHg5NywgMHhCMiwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHg4QywgMHg0NywgMHgwMCwgMHgwMCwgMHg5MSwgMHhFMCwgMHhFNCwgMHg0MCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhBNCwgMHg4QSwgMHg0QiwgMHg5MCwgMHg4RiwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHg4QSwgMHg3NSwgMHhFOCwgMHhBNiwgMHgwMCwgMHgwMCwgMHhFOCwgMHhBNywgLyogMHg5NC0weDk3ICovCisJMHhFOCwgMHhBNSwgMHg4QywgMHg4NCwgMHgwMCwgMHgwMCwgMHg4RCwgMHhEQiwgLyogMHg5OC0weDlCICovCisJMHg4RiwgMHhFMSwgMHhFRSwgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHg4OSwgMHg0MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHhENywgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhBOSwgLyogMHhBNC0weEE3ICovCisJMHhFNywgMHhBQywgMHgwMCwgMHgwMCwgMHhFOCwgMHhBOCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhEMCwgLyogMHhBQy0weEFGICovCisJMHhFOCwgMHhBQywgMHhFOCwgMHhBQSwgMHhFOCwgMHhBQiwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHhFOCwgMHhBRCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhBRSwgMHg5NywgMHhFQSwgLyogMHhCNC0weEI3ICovCisJMHhFOCwgMHhBRiwgMHhFOCwgMHhCMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHhDNywgLyogMHhCOC0weEJCICovCisJMHg5NCwgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHg5MCwgMHg5RCwgMHg4QSwgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHg5NywgMHg1OSwgMHg4OSwgMHhFQiwgMHg4RiwgMHg1NywgMHg4QywgMHhEOSwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhCMywgMHgwMCwgMHgwMCwgMHhFOCwgMHhCMiwgLyogMHhDOC0weENCICovCisJMHg4RSwgMHg5MywgMHhFOCwgMHhCNCwgMHhFOCwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHg4RSwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhCOCwgMHhFNSwgMHhBQiwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHhENCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg5NywgLyogMHhEOC0weERCICovCisJMHhFOCwgMHhCNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHhBMywgMHg5MywgMHhFRiwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHg4OSwgMHg0QSwgMHgwMCwgMHgwMCwgMHg5MCwgMHhFMSwgMHg4RSwgMHhCNCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHg5NSwgMHhCNSwgMHgwMCwgMHgwMCwgMHg4OSwgMHg1RiwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHhFQiwgMHg5NywgMHg4QiwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhCOSwgMHgwMCwgMHgwMCwgMHg5MywgMHg2NCwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTdbNTEyXSA9IHsKKwkweDhFLCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEU4LCAweEJBLCAweDAwLCAweDAwLCAweEU4LCAweEJCLCAweDkwLCAweDZCLCAvKiAweDA0LTB4MDcgKi8KKwkweEU4LCAweEJDLCAweDAwLCAweDAwLCAweDk3LCAweEVDLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEI3LCAweEU4LCAweEJFLCAweEU4LCAweEMwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEJGLCAweDAwLCAweDAwLCAweEU4LCAweEJELCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEMxLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDkxLCAweDlBLCAweDAwLCAweDAwLCAweDg5LCAweEUwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweEU4LCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweEI2LCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEM0LCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEU4LCAweEM1LCAweDAwLCAweDAwLCAweDk4LCAweDQ5LCAweEVFLCAweEQxLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDlFLCAweDUwLCAweEU4LCAweEM2LCAweDAwLCAweDAwLCAweEVFLCAweEQyLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEM3LCAweEU4LCAweEM4LCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweENDLCAweEVFLCAweEQzLCAvKiAweDQwLTB4NDMgKi8KKwkweEU4LCAweEM5LCAweDAwLCAweDAwLCAweEU4LCAweENBLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEU4LCAweENCLCAweEU4LCAweENELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEQ0LCAweDAwLCAweDAwLCAweEVFLCAweEQ1LCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEQ2LCAweDkwLCAweEMyLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEQ3LCAweDk2LCAweEY1LCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweEU4LCAweENFLCAweDAwLCAweDAwLCAweDk0LCAweEYxLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEU4LCAweENGLCAweEVBLCAweDcyLCAweDk2LCAweENBLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEU4LCAweEQwLCAweDAwLCAweDAwLCAweEU4LCAweEQxLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEU4LCAweEQyLCAweDhBLCAweDc2LCAweDAwLCAweDAwLCAweEU4LCAweEQ0LCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweDc4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDhDLCAweDQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEQ2LCAweEU4LCAweERBLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEU4LCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweEU4LCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDhBLCAweDkzLCAweEU4LCAweEQ3LCAweEU4LCAweERCLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweERDLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDg4LCAweEM2LCAweDAwLCAweDAwLCAweEU4LCAweERELCAvKiAweDhDLTB4OEYgKi8KKwkweEU4LCAweERFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDhGLCAweEUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEU4LCAweERGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDhCLCAweDY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEUyLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEUxLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEU4LCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweDkxLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweERBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEUzLCAvKiAweEIwLTB4QjMgKi8KKwkweEU4LCAweEU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEU1LCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEU2LCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweEU4LCAweEU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEU4LCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweEQ4LCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweEU4LCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEVBLCAweDk0LCAweDQyLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEVDLCAweDg5LCAweEI5LCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEVGLCAweEU4LCAweEVFLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDQzLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweEJGLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185OFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4OTUsIDB4QzUsIDB4OTIsIDB4QjgsIDB4OEQsIDB4QTAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4ODAsIDB4OEYsIDB4ODcsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4OTAsIDB4N0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4RTgsIDB4RjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RjAsIC8qIDB4MEMtMHgwRiAqLworCTB4OTcsIDB4NjEsIDB4OEEsIDB4RTYsIDB4OTQsIDB4RDAsIDB4OTMsIDB4REEsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4OUMsIC8qIDB4MTQtMHgxNyAqLworCTB4OTcsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4OEMsIDB4N0EsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4RjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4RTgsIDB4RjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4OTYsIDB4NkEsIDB4OTMsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4ODksIDB4NkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RjUsIC8qIDB4MzQtMHgzNyAqLworCTB4RTgsIDB4RjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4NzAsIC8qIDB4MzgtMHgzQiAqLworCTB4OTcsIDB4OEEsIDB4RTgsIDB4RjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RjcsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RjksIC8qIDB4NDgtMHg0QiAqLworCTB4OTEsIDB4RTgsIDB4OEEsIDB4N0EsIDB4OEEsIDB4N0IsIDB4RTgsIDB4RjgsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4OEEsIDB4RTcsIDB4OEMsIDB4QjAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4RDgsIC8qIDB4NTQtMHg1NyAqLworCTB4OEEsIDB4RTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4NUUsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4REUsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4RDksIDB4MDAsIDB4MDAsIDB4OEMsIDB4REEsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RkEsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RkIsIC8qIDB4NkMtMHg2RiAqLworCTB4RTgsIDB4RkMsIDB4RTksIDB4NDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4NDIsIC8qIDB4NzAtMHg3MyAqLworCTB4RTksIDB4NDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4OTUsIDB4OTcsIDB4MDAsIDB4MDAsIDB4RTksIDB4NDMsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4NDQsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4NDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4NDYsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4NDgsIC8qIDB4QzAtMHhDMyAqLworCTB4RTksIDB4NDcsIDB4MDAsIDB4MDAsIDB4RTksIDB4NDksIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4RjIsIC8qIDB4RDgtMHhEQiAqLworCTB4RTMsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4NDgsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4NTEsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4NEEsIDB4MDAsIDB4MDAsIDB4RTksIDB4NEIsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4QUEsIDB4OUYsIDB4NUEsIDB4OTQsIDB4RDEsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4RjksIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4ODgsIDB4QjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4OEUsIDB4OTQsIDB4OTYsIDB4NEYsIDB4OEYsIDB4RkMsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzk5WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHg0QywgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHg5NiwgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHg0RCwgMHg5NywgMHg3QiwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHg4OSwgMHg2MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHg4RSwgMHg2MCwgMHgwMCwgMHgwMCwgMHhFOSwgMHg0RSwgMHg4OSwgMHhFQywgLyogMHgxMC0weDEzICovCisJMHhFOSwgMHg0RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhFOSwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHg1MiwgMHhFOSwgMHg1MywgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhFOSwgMHg1NSwgMHhFOSwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHhFOSwgMHg1NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhEQywgLyogMHgyNC0weDI3ICovCisJMHg4QSwgMHhEOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhFOSwgMHg1NiwgMHgwMCwgMHgwMCwgMHhFOSwgMHg1NywgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHg1OCwgMHhFOSwgMHg1OSwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHg1QSwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHg1QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHg1QiwgMHgwMCwgMHgwMCwgMHhFOSwgMHg1RSwgLyogMHg0OC0weDRCICovCisJMHhFOSwgMHg2MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhFOSwgMHg1RCwgMHhFOSwgMHg1RiwgMHhFOSwgMHg2MCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHg2MiwgMHgwMCwgMHgwMCwgMHg4QiwgMHhDMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHhGMSwgMHhFOSwgMHg2MywgLyogMHg5NC0weDk3ICovCisJMHhFOSwgMHg2NCwgMHg4RCwgMHg4MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhERSwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHg2NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHg4QSwgMHg1RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHg5NCwgMHg2RSwgMHhFOSwgMHg2NiwgMHhFOSwgMHg2NywgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHg3OSwgLyogMHhCMC0weEIzICovCisJMHg5MywgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHhFOSwgMHg2OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHg5RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHg5MSwgMHhDQSwgMHg4OSwgMHg3NywgMHg4QiwgMHhFQywgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHg4QiwgMHhFRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHg5MiwgMHg5MywgMHhFOSwgMHg2RCwgMHg4QiwgMHhFRSwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHg4OSwgMHhFRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhFOSwgMHg2QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHg2QSwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHg2QiwgMHgwMCwgMHgwMCwgMHhFOSwgMHg2OSwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHg3NywgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHg2RSwgMHhFOSwgMHg2RiwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHg3MCwgMHhFOSwgMHg3MSwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHhFOSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHg3MiwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHg3OCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOUFbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEU5LCAweDc0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDc2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweDUyLCAweEU5LCAweDc1LCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweDlCLCAweDhDLCAweEIxLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDc4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDkxLCAweENCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweDc5LCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDkzLCAweEFCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweDdBLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweDgwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweEU5LCAweDdELCAweDAwLCAweDAwLCAweEU5LCAweDdDLCAweEU5LCAweDdFLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDdCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDgyLCAweEVFLCAweERGLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDgxLCAweDAwLCAweDAwLCAweEU5LCAweDg0LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweEMxLCAweEU5LCAweDgzLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweDg1LCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweDg2LCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEU5LCAweDg4LCAweEU5LCAweDg3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDg5LCAweEU5LCAweDhCLCAweEU5LCAweDhBLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDhELCAweDlDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDhDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweEU5LCAweDhELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDhBLCAweDVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweEU5LCAweDhFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweEU5LCAweDhGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDkwLCAweDkxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweDkwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDkxLCAweDAwLCAweDAwLCAweEU5LCAweDkyLCAvKiAweEQwLTB4RDMgKi8KKwkweEU5LCAweDkzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDhELCAweDgyLCAweEVFLCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweEVFLCAweEUxLCAweDAwLCAweDAwLCAweEU5LCAweDk0LCAweEU5LCAweDk1LCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweDk2LCAweEU5LCAweDk3LCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweDk4LCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweEFGLCAweEU5LCAweDlBLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweDQ1LCAweEU5LCAweDlCLCAweEU5LCAweDk5LCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDlELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEU5LCAweDlDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweDlFLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweDlGLCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185Qls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4QTAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4RTksIDB4QTEsIDB4MDAsIDB4MDAsIDB4RTksIDB4QTIsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4QTMsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4QTQsIDB4RTksIDB4QTUsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4QTYsIDB4MDAsIDB4MDAsIDB4RTksIDB4QTcsIC8qIDB4MjQtMHgyNyAqLworCTB4RTksIDB4QTgsIDB4RTksIDB4QTksIDB4RTksIDB4QUEsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4QUIsIDB4RTksIDB4QUMsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4NTQsIDB4RTksIDB4QUQsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RjYsIC8qIDB4MzgtMHgzQiAqLworCTB4OEIsIDB4NTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4OEEsIDB4NDAsIDB4OEQsIDB4QjAsIDB4RTksIDB4QUYsIC8qIDB4NDAtMHg0MyAqLworCTB4RTksIDB4QUUsIDB4OTYsIDB4QTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4QjEsIDB4RTksIDB4QjIsIDB4RTksIDB4QjAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4QjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4OTYsIDB4ODIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4RTksIDB4QjQsIDB4MDAsIDB4MDAsIDB4OEIsIDB4OUIsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTgsIDB4NDQsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4RTMsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4RTksIDB4QjUsIDB4RUUsIDB4RTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4QjcsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4QkMsIDB4RUUsIDB4RTQsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4QjgsIDB4OTUsIDB4QTksIDB4RTksIDB4QjYsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4QjksIDB4RTksIDB4QkEsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4QkIsIC8qIDB4OUMtMHg5RiAqLworCTB4RTksIDB4QkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4RTksIDB4QkQsIDB4MDAsIDB4MDAsIDB4OTYsIDB4OEUsIDB4OEUsIDB4NEMsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4RjgsIDB4OTEsIDB4NEUsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4RTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4RTksIDB4QkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4QzEsIDB4MDAsIDB4MDAsIDB4RUUsIDB4RTYsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4RTksIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4QzIsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4RUYsIDB4RTksIDB4QzAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4QzMsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4QzQsIDB4RTksIDB4QzUsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RTksIDB4QzksIDB4MDAsIDB4MDAsIDB4OEUsIDB4NDksIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4RTIsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4Q0EsIDB4RTksIDB4QzcsIDB4RTksIDB4QzYsIC8qIDB4RTAtMHhFMyAqLworCTB4RTksIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4OEMsIDB4N0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4RTksIDB4Q0UsIDB4RTksIDB4Q0QsIDB4RTksIDB4Q0MsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4ODgsIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzlDWzUxMl0gPSB7CisJMHhFRSwgMHhFNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhFOSwgMHhEOCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhENCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhFOSwgMHhENSwgMHhFOSwgMHhEMSwgMHhFOSwgMHhENywgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhFOSwgMHhEMywgMHg4QSwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHg5OCwgMHg2QiwgMHgwMCwgMHgwMCwgMHhFOSwgMHhENiwgMHhFOSwgMHhEMiwgLyogMHgxMC0weDEzICovCisJMHhFOSwgMHhEMCwgMHhFOSwgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhEQSwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHhFOSwgMHhEQywgMHhFOSwgMHhEQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHg2OCwgMHhFOSwgMHhEOSwgMHg4OCwgMHhGMSwgLyogMHgyQy0weDJGICovCisJMHhFOSwgMHhERSwgMHgwMCwgMHgwMCwgMHhFOSwgMHhFMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHg4QSwgMHg4RiwgMHhFOSwgMHhDQiwgMHg4OSwgMHg1NiwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhFMiwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhFMSwgMHhFOSwgMHhERiwgLyogMHg0NC0weDQ3ICovCisJMHg5MiwgMHg0QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg5MCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHhEOCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhFMywgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhFOSwgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhFNSwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhFNiwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHhFOSwgMHhFNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHg5MiwgMHhCOSwgMHgwMCwgMHgwMCwgMHhFOSwgMHhFOCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHhCNSwgMHgwMCwgMHgwMCwgMHhFOSwgMHhFRCwgLyogMHhFOC0weEVCICovCisJMHhFOSwgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhFOSwgMHhFQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg1MCwgLyogMHhGMC0weEYzICovCisJMHg5NiwgMHhDMiwgMHgwMCwgMHgwMCwgMHg5MywgMHhDRSwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOURbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEVFLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEVGLCAweDkzLCAweEJDLCAvKiAweDA0LTB4MDcgKi8KKwkweEU5LCAweEVDLCAweEU5LCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweEE4LCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEY3LCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweEY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDk1LCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEY0LCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEYzLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEYxLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDhBLCAweDlCLCAweDAwLCAweDAwLCAweEU5LCAweEYwLCAweDhFLCAweEIwLCAvKiAweDI4LTB4MkIgKi8KKwkweDg5LCAweEE3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweDgzLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEZBLCAweEU5LCAweEY5LCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEU5LCAweEY1LCAweDAwLCAweDAwLCAweEU5LCAweEZCLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEU5LCAweEZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEVBLCAweDQ0LCAweEVBLCAweDQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweDQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDg5LCAweDRDLCAweEVBLCAweDQwLCAweEVBLCAweDQxLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDhELCAweDk0LCAweDk2LCAweEI3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEVBLCAweDQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweEU5LCAvKiAweDY4LTB4NkIgKi8KKwkweDk2LCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDRBLCAvKiAweDZDLTB4NkYgKi8KKwkweEVFLCAweEU4LCAweDAwLCAweDAwLCAweEVBLCAweDQ2LCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDRCLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDQ4LCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweDdCLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDRDLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEVBLCAweDRELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweDRFLCAweDAwLCAweDAwLCAweEVBLCAweDQ5LCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEYyLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDRGLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDkyLCAweERGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweEVBLCAweDUzLCAweDAwLCAweDAwLCAweEVBLCAweDU0LCAweEVBLCAweDUyLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweDUxLCAweEVBLCAweDU3LCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEVBLCAweDUwLCAweDAwLCAweDAwLCAweEVBLCAweDU1LCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDU2LCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDU5LCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweDU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDVCLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweDVDLCAweDAwLCAweDAwLCAweEVBLCAweDVELCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk4LCAweDY4LCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEVBLCAweDVBLCAweDkxLCAweEU5LCAweDhELCAweEVCLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweDVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185RVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4RUIsIDB4RUEsIDB4NUYsIDB4RUEsIDB4NjAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4NjEsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4OEMsIDB4QjIsIDB4RUEsIDB4NjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4NjQsIDB4MDAsIDB4MDAsIDB4OEUsIDB4QUQsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4RUEsIDB4NjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4RUEsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4NjcsIC8qIDB4ODgtMHg4QiAqLworCTB4RUEsIDB4NjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4NkIsIDB4RUEsIDB4NjksIDB4OTgsIDB4NUIsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4NkEsIDB4MDAsIDB4MDAsIDB4OTcsIDB4RUQsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4NkMsIDB4MDAsIDB4MDAsIDB4OTcsIDB4RDksIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4NkQsIDB4OTQsIDB4OUUsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4NkUsIDB4RUEsIDB4NzAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4NzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4RUEsIDB4NkYsIDB4OEQsIDB4OEQsIDB4OTYsIDB4Q0IsIDB4OTYsIDB4ODMsIC8qIDB4QjgtMHhCQiAqLworCTB4OUIsIDB4RjUsIDB4MDAsIDB4MDAsIDB4OUYsIDB4ODAsIDB4OTYsIDB4OUIsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4ODksIDB4QTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4RUEsIDB4NzMsIDB4OEIsIDB4NkYsIDB4RUEsIDB4NzQsIDB4RUEsIDB4NzUsIC8qIDB4Q0MtMHhDRiAqLworCTB4RUEsIDB4NzYsIDB4RUUsIDB4RUMsIDB4OEQsIDB4OTUsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RUEsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4RTAsIDB4RDIsIDB4OTYsIDB4RDksIDB4MDAsIDB4MDAsIDB4OTEsIDB4RTEsIC8qIDB4RDgtMHhEQiAqLworCTB4RUEsIDB4NzgsIDB4RUEsIDB4N0EsIDB4RUEsIDB4NzksIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4RUEsIDB4N0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4N0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4RUEsIDB4N0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4N0UsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RUEsIDB4ODAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4ODEsIDB4RUEsIDB4ODIsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4ODMsIDB4MDAsIDB4MDAsIDB4RUEsIDB4ODQsIC8qIDB4RjgtMHhGQiAqLworCTB4RUEsIDB4ODUsIDB4RUEsIDB4ODYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzlGWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHg4NywgLyogMHgwNC0weDA3ICovCisJMHhFQSwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHg0MywgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHhEQiwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHg4QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHg5MSwgMHg2QywgMHhFQSwgMHg4QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhFQSwgMHg4QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHg0MCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHg4RCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHg4RSwgMHhFMiwgMHg1NiwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhEOCwgMHhFOCwgMHhFQiwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHg4RiwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhFQSwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHg5MiwgLyogMHg1Qy0weDVGICovCisJMHhFQSwgMHg5MywgMHhFQSwgMHg5NCwgMHg5NywgMHhFRSwgMHhFQSwgMHg5MSwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHg5NSwgMHhFQSwgMHg5NiwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHg5OCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhFQSwgMHg5NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHg5QSwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHg5QiwgMHhFQSwgMHg5OSwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHg5QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhFQSwgMHg5RCwgMHhFMiwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhFQSwgMHg5RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfRENbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19GOVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4RUUsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0ZBWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHg3MywgMHhFRCwgMHg3RSwgLyogMHgwQy0weDBGICovCisJMHhFRCwgMHg4MCwgMHhFRCwgMHg5NSwgMHhFRCwgMHhCQywgMHhFRCwgMHhDQywgLyogMHgxMC0weDEzICovCisJMHhFRCwgMHhDRSwgMHhFRCwgMHhGOSwgMHhFRSwgMHg0MiwgMHhFRSwgMHg1OSwgLyogMHgxNC0weDE3ICovCisJMHhFRSwgMHg2MSwgMHhFRSwgMHg2MiwgMHhFRSwgMHg2MywgMHhFRSwgMHg2NSwgLyogMHgxOC0weDFCICovCisJMHhFRSwgMHg2OSwgMHhFRSwgMHg2QywgMHhFRSwgMHg3NSwgMHhFRSwgMHg4MSwgLyogMHgxQy0weDFGICovCisJMHhFRSwgMHg4MywgMHhFRSwgMHg4NCwgMHhFRSwgMHg4RCwgMHhFRSwgMHg5NSwgLyogMHgyMC0weDIzICovCisJMHhFRSwgMHg5NywgMHhFRSwgMHg5OCwgMHhFRSwgMHg5QiwgMHhFRSwgMHhCNywgLyogMHgyNC0weDI3ICovCisJMHhFRSwgMHhCRSwgMHhFRSwgMHhDRSwgMHhFRSwgMHhEQSwgMHhFRSwgMHhEQiwgLyogMHgyOC0weDJCICovCisJMHhFRSwgMHhERCwgMHhFRSwgMHhFQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfRkZbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDgxLCAweDQ5LCAweEVFLCAweEZDLCAweDgxLCAweDk0LCAvKiAweDAwLTB4MDMgKi8KKwkweDgxLCAweDkwLCAweDgxLCAweDkzLCAweDgxLCAweDk1LCAweEVFLCAweEZCLCAvKiAweDA0LTB4MDcgKi8KKwkweDgxLCAweDY5LCAweDgxLCAweDZBLCAweDgxLCAweDk2LCAweDgxLCAweDdCLCAvKiAweDA4LTB4MEIgKi8KKwkweDgxLCAweDQzLCAweDgxLCAweDdDLCAweDgxLCAweDQ0LCAweDgxLCAweDVFLCAvKiAweDBDLTB4MEYgKi8KKwkweDgyLCAweDRGLCAweDgyLCAweDUwLCAweDgyLCAweDUxLCAweDgyLCAweDUyLCAvKiAweDEwLTB4MTMgKi8KKwkweDgyLCAweDUzLCAweDgyLCAweDU0LCAweDgyLCAweDU1LCAweDgyLCAweDU2LCAvKiAweDE0LTB4MTcgKi8KKwkweDgyLCAweDU3LCAweDgyLCAweDU4LCAweDgxLCAweDQ2LCAweDgxLCAweDQ3LCAvKiAweDE4LTB4MUIgKi8KKwkweDgxLCAweDgzLCAweDgxLCAweDgxLCAweDgxLCAweDg0LCAweDgxLCAweDQ4LCAvKiAweDFDLTB4MUYgKi8KKwkweDgxLCAweDk3LCAweDgyLCAweDYwLCAweDgyLCAweDYxLCAweDgyLCAweDYyLCAvKiAweDIwLTB4MjMgKi8KKwkweDgyLCAweDYzLCAweDgyLCAweDY0LCAweDgyLCAweDY1LCAweDgyLCAweDY2LCAvKiAweDI0LTB4MjcgKi8KKwkweDgyLCAweDY3LCAweDgyLCAweDY4LCAweDgyLCAweDY5LCAweDgyLCAweDZBLCAvKiAweDI4LTB4MkIgKi8KKwkweDgyLCAweDZCLCAweDgyLCAweDZDLCAweDgyLCAweDZELCAweDgyLCAweDZFLCAvKiAweDJDLTB4MkYgKi8KKwkweDgyLCAweDZGLCAweDgyLCAweDcwLCAweDgyLCAweDcxLCAweDgyLCAweDcyLCAvKiAweDMwLTB4MzMgKi8KKwkweDgyLCAweDczLCAweDgyLCAweDc0LCAweDgyLCAweDc1LCAweDgyLCAweDc2LCAvKiAweDM0LTB4MzcgKi8KKwkweDgyLCAweDc3LCAweDgyLCAweDc4LCAweDgyLCAweDc5LCAweDgxLCAweDZELCAvKiAweDM4LTB4M0IgKi8KKwkweDgxLCAweDVGLCAweDgxLCAweDZFLCAweDgxLCAweDRGLCAweDgxLCAweDUxLCAvKiAweDNDLTB4M0YgKi8KKwkweDgxLCAweDRELCAweDgyLCAweDgxLCAweDgyLCAweDgyLCAweDgyLCAweDgzLCAvKiAweDQwLTB4NDMgKi8KKwkweDgyLCAweDg0LCAweDgyLCAweDg1LCAweDgyLCAweDg2LCAweDgyLCAweDg3LCAvKiAweDQ0LTB4NDcgKi8KKwkweDgyLCAweDg4LCAweDgyLCAweDg5LCAweDgyLCAweDhBLCAweDgyLCAweDhCLCAvKiAweDQ4LTB4NEIgKi8KKwkweDgyLCAweDhDLCAweDgyLCAweDhELCAweDgyLCAweDhFLCAweDgyLCAweDhGLCAvKiAweDRDLTB4NEYgKi8KKwkweDgyLCAweDkwLCAweDgyLCAweDkxLCAweDgyLCAweDkyLCAweDgyLCAweDkzLCAvKiAweDUwLTB4NTMgKi8KKwkweDgyLCAweDk0LCAweDgyLCAweDk1LCAweDgyLCAweDk2LCAweDgyLCAweDk3LCAvKiAweDU0LTB4NTcgKi8KKwkweDgyLCAweDk4LCAweDgyLCAweDk5LCAweDgyLCAweDlBLCAweDgxLCAweDZGLCAvKiAweDU4LTB4NUIgKi8KKwkweDgxLCAweDYyLCAweDgxLCAweDcwLCAweDgxLCAweDYwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweEExLCAweDAwLCAweEEyLCAweDAwLCAweEEzLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweEE0LCAweDAwLCAweEE1LCAweDAwLCAweEE2LCAweDAwLCAweEE3LCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweEE4LCAweDAwLCAweEE5LCAweDAwLCAweEFBLCAweDAwLCAweEFCLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweEFDLCAweDAwLCAweEFELCAweDAwLCAweEFFLCAweDAwLCAweEFGLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweEIwLCAweDAwLCAweEIxLCAweDAwLCAweEIyLCAweDAwLCAweEIzLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweEI0LCAweDAwLCAweEI1LCAweDAwLCAweEI2LCAweDAwLCAweEI3LCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweEI4LCAweDAwLCAweEI5LCAweDAwLCAweEJBLCAweDAwLCAweEJCLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweEJDLCAweDAwLCAweEJELCAweDAwLCAweEJFLCAweDAwLCAweEJGLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweEMwLCAweDAwLCAweEMxLCAweDAwLCAweEMyLCAweDAwLCAweEMzLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweEM0LCAweDAwLCAweEM1LCAweDAwLCAweEM2LCAweDAwLCAweEM3LCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweEM4LCAweDAwLCAweEM5LCAweDAwLCAweENBLCAweDAwLCAweENCLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweENDLCAweDAwLCAweENELCAweDAwLCAweENFLCAweDAwLCAweENGLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweEQwLCAweDAwLCAweEQxLCAweDAwLCAweEQyLCAweDAwLCAweEQzLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweEQ0LCAweDAwLCAweEQ1LCAweDAwLCAweEQ2LCAweDAwLCAweEQ3LCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweEQ4LCAweDAwLCAweEQ5LCAweDAwLCAweERBLCAweDAwLCAweERCLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweERDLCAweDAwLCAweERELCAweDAwLCAweERFLCAweDAwLCAweERGLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDgxLCAweDkxLCAweDgxLCAweDkyLCAweDgxLCAweENBLCAweDgxLCAweDUwLCAvKiAweEUwLTB4RTMgKi8KKwkweEVFLCAweEZBLCAweDgxLCAweDhGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgdTJjXzAzLCB1MmNfMDQsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCXUyY18yMCwgdTJjXzIxLCB1MmNfMjIsIHUyY18yMywgdTJjXzI0LCB1MmNfMjUsIHUyY18yNiwgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJdTJjXzMwLCBOVUxMLCAgIHUyY18zMiwgdTJjXzMzLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgdTJjXzRFLCB1MmNfNEYsIAorCXUyY181MCwgdTJjXzUxLCB1MmNfNTIsIHUyY181MywgdTJjXzU0LCB1MmNfNTUsIHUyY181NiwgdTJjXzU3LCAKKwl1MmNfNTgsIHUyY181OSwgdTJjXzVBLCB1MmNfNUIsIHUyY181QywgdTJjXzVELCB1MmNfNUUsIHUyY181RiwgCisJdTJjXzYwLCB1MmNfNjEsIHUyY182MiwgdTJjXzYzLCB1MmNfNjQsIHUyY182NSwgdTJjXzY2LCB1MmNfNjcsIAorCXUyY182OCwgdTJjXzY5LCB1MmNfNkEsIHUyY182QiwgdTJjXzZDLCB1MmNfNkQsIHUyY182RSwgdTJjXzZGLCAKKwl1MmNfNzAsIHUyY183MSwgdTJjXzcyLCB1MmNfNzMsIHUyY183NCwgdTJjXzc1LCB1MmNfNzYsIHUyY183NywgCisJdTJjXzc4LCB1MmNfNzksIHUyY183QSwgdTJjXzdCLCB1MmNfN0MsIHUyY183RCwgdTJjXzdFLCB1MmNfN0YsIAorCXUyY184MCwgdTJjXzgxLCB1MmNfODIsIHUyY184MywgdTJjXzg0LCB1MmNfODUsIHUyY184NiwgdTJjXzg3LCAKKwl1MmNfODgsIHUyY184OSwgdTJjXzhBLCB1MmNfOEIsIHUyY184QywgdTJjXzhELCB1MmNfOEUsIHUyY184RiwgCisJdTJjXzkwLCB1MmNfOTEsIHUyY185MiwgdTJjXzkzLCB1MmNfOTQsIHUyY185NSwgdTJjXzk2LCB1MmNfOTcsIAorCXUyY185OCwgdTJjXzk5LCB1MmNfOUEsIHUyY185QiwgdTJjXzlDLCB1MmNfOUQsIHUyY185RSwgdTJjXzlGLCAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICB1MmNfREMsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgdTJjX0Y5LCB1MmNfRkEsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgdTJjX0ZGLCB9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg0MC0weDQ3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg0OC0weDRmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg1MC0weDU3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIGludCB1bmkyY2hhcihjb25zdCB3Y2hhcl90IHVuaSwKKwkJICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkmMHhGRjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaT4+OCkmMHhGRjsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCWlmIChjaCA9PSAweEZGICYmIDB4NjEgPD0gY2wgJiYgY2wgPD0gMHg5RikgeworCQlvdXRbMF0gPSBjbCArIDB4NDA7CisJCXJldHVybiAxOworCX0KKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCkgeworCQlpZiAoYm91bmRsZW4gPCAyKQorCQkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2wqMl07CisJCW91dFsxXSA9IHVuaTJjaGFyc2V0W2NsKjIrMV07CisJCWlmIChvdXRbMF0gPT0gMHgwMCAmJiBvdXRbMV0gPT0gMHgwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMjsKKwl9IGVsc2UgaWYgKGNoID09IDApIHsKKwkJaWYgKGNsIDw9IDB4N0YpIHsKKwkJCW91dFswXSA9IGNsOworCQkJcmV0dXJuIDE7CisJCX0gZWxzZSBpZiAoMHhBMCA8PSBjbCkgeworCQkJb3V0WzBdID0gdTJjXzAwaGlbY2wgLSAweEEwXVswXTsKKwkJCW91dFsxXSA9IHUyY18wMGhpW2NsIC0gMHhBMF1bMV07CisJCQlpZiAob3V0WzBdICYmIG91dFsxXSkKKwkJCQlyZXR1cm4gMjsKKwkJfQorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwKKwkJICAgIHdjaGFyX3QgKnVuaSkKK3sKKwl1bnNpZ25lZCBjaGFyIGNoLCBjbDsKKwl3Y2hhcl90ICpjaGFyc2V0MnVuaTsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCWlmIChyYXdzdHJpbmdbMF0gPD0gMHg3RikgeworCQkqdW5pID0gcmF3c3RyaW5nWzBdOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKDB4QTEgPD0gcmF3c3RyaW5nWzBdICYmIHJhd3N0cmluZ1swXSA8PSAweERGKSB7CisJCSp1bmkgPSAweEZGMDAgfCAocmF3c3RyaW5nWzBdIC0gMHg0MCk7CisJCXJldHVybiAxOworCX0KKworCWlmIChib3VuZGxlbiA8IDIpCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCWNoID0gcmF3c3RyaW5nWzBdOworCWNsID0gcmF3c3RyaW5nWzFdOworCWNoYXJzZXQydW5pID0gcGFnZV9jaGFyc2V0MnVuaVtjaF07CisJaWYgKGNoYXJzZXQydW5pICYmIGNsKSB7CisJCSp1bmkgPSBjaGFyc2V0MnVuaVtjbF07CisJCWlmICgqdW5pID09IDB4MDAwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMjsKKwl9CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAiY3A5MzIiLAorCS5hbGlhcwkJPSAic2ppcyIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19jcDkzMih2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2NwOTMyKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfY3A5MzIpCittb2R1bGVfZXhpdChleGl0X25sc19jcDkzMikKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX0FMSUFTX05MUyhzamlzKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfY3A5MzYuYyBiL2ZzL25scy9ubHNfY3A5MzYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjRjZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19jcDkzNi5jCkBAIC0wLDAgKzEsMTEwMTkgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfY3A5MzYuYworICoKKyAqIENoYXJzZXQgY3A5MzYgdHJhbnNsYXRpb24gdGFibGVzLgorICogVGhpcyB0cmFuc2xhdGlvbiB0YWJsZSB3YXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHksIHRoZQorICogb3JpZ2luYWwgdGFibGUgY2FuIGJlIGRvd25sb2FkIGZyb20gdGhlIE1pY3Jvc29mdCB3ZWJzaXRlLgorICogKGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L3VuaWNvZGUvdW5pY29kZWNwLmh0bSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgYzJ1XzgxWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NEUwMiwweDRFMDQsMHg0RTA1LDB4NEUwNiwweDRFMEYsMHg0RTEyLDB4NEUxNywweDRFMUYsLyogMHg0MC0weDQ3ICovCisJMHg0RTIwLDB4NEUyMSwweDRFMjMsMHg0RTI2LDB4NEUyOSwweDRFMkUsMHg0RTJGLDB4NEUzMSwvKiAweDQ4LTB4NEYgKi8KKwkweDRFMzMsMHg0RTM1LDB4NEUzNywweDRFM0MsMHg0RTQwLDB4NEU0MSwweDRFNDIsMHg0RTQ0LC8qIDB4NTAtMHg1NyAqLworCTB4NEU0NiwweDRFNEEsMHg0RTUxLDB4NEU1NSwweDRFNTcsMHg0RTVBLDB4NEU1QiwweDRFNjIsLyogMHg1OC0weDVGICovCisJMHg0RTYzLDB4NEU2NCwweDRFNjUsMHg0RTY3LDB4NEU2OCwweDRFNkEsMHg0RTZCLDB4NEU2QywvKiAweDYwLTB4NjcgKi8KKwkweDRFNkQsMHg0RTZFLDB4NEU2RiwweDRFNzIsMHg0RTc0LDB4NEU3NSwweDRFNzYsMHg0RTc3LC8qIDB4NjgtMHg2RiAqLworCTB4NEU3OCwweDRFNzksMHg0RTdBLDB4NEU3QiwweDRFN0MsMHg0RTdELDB4NEU3RiwweDRFODAsLyogMHg3MC0weDc3ICovCisJMHg0RTgxLDB4NEU4MiwweDRFODMsMHg0RTg0LDB4NEU4NSwweDRFODcsMHg0RThBLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NEU5MCwweDRFOTYsMHg0RTk3LDB4NEU5OSwweDRFOUMsMHg0RTlELDB4NEU5RSwweDRFQTMsLyogMHg4MC0weDg3ICovCisJMHg0RUFBLDB4NEVBRiwweDRFQjAsMHg0RUIxLDB4NEVCNCwweDRFQjYsMHg0RUI3LDB4NEVCOCwvKiAweDg4LTB4OEYgKi8KKwkweDRFQjksMHg0RUJDLDB4NEVCRCwweDRFQkUsMHg0RUM4LDB4NEVDQywweDRFQ0YsMHg0RUQwLC8qIDB4OTAtMHg5NyAqLworCTB4NEVEMiwweDRFREEsMHg0RURCLDB4NEVEQywweDRFRTAsMHg0RUUyLDB4NEVFNiwweDRFRTcsLyogMHg5OC0weDlGICovCisJMHg0RUU5LDB4NEVFRCwweDRFRUUsMHg0RUVGLDB4NEVGMSwweDRFRjQsMHg0RUY4LDB4NEVGOSwvKiAweEEwLTB4QTcgKi8KKwkweDRFRkEsMHg0RUZDLDB4NEVGRSwweDRGMDAsMHg0RjAyLDB4NEYwMywweDRGMDQsMHg0RjA1LC8qIDB4QTgtMHhBRiAqLworCTB4NEYwNiwweDRGMDcsMHg0RjA4LDB4NEYwQiwweDRGMEMsMHg0RjEyLDB4NEYxMywweDRGMTQsLyogMHhCMC0weEI3ICovCisJMHg0RjE1LDB4NEYxNiwweDRGMUMsMHg0RjFELDB4NEYyMSwweDRGMjMsMHg0RjI4LDB4NEYyOSwvKiAweEI4LTB4QkYgKi8KKwkweDRGMkMsMHg0RjJELDB4NEYyRSwweDRGMzEsMHg0RjMzLDB4NEYzNSwweDRGMzcsMHg0RjM5LC8qIDB4QzAtMHhDNyAqLworCTB4NEYzQiwweDRGM0UsMHg0RjNGLDB4NEY0MCwweDRGNDEsMHg0RjQyLDB4NEY0NCwweDRGNDUsLyogMHhDOC0weENGICovCisJMHg0RjQ3LDB4NEY0OCwweDRGNDksMHg0RjRBLDB4NEY0QiwweDRGNEMsMHg0RjUyLDB4NEY1NCwvKiAweEQwLTB4RDcgKi8KKwkweDRGNTYsMHg0RjYxLDB4NEY2MiwweDRGNjYsMHg0RjY4LDB4NEY2QSwweDRGNkIsMHg0RjZELC8qIDB4RDgtMHhERiAqLworCTB4NEY2RSwweDRGNzEsMHg0RjcyLDB4NEY3NSwweDRGNzcsMHg0Rjc4LDB4NEY3OSwweDRGN0EsLyogMHhFMC0weEU3ICovCisJMHg0RjdELDB4NEY4MCwweDRGODEsMHg0RjgyLDB4NEY4NSwweDRGODYsMHg0Rjg3LDB4NEY4QSwvKiAweEU4LTB4RUYgKi8KKwkweDRGOEMsMHg0RjhFLDB4NEY5MCwweDRGOTIsMHg0RjkzLDB4NEY5NSwweDRGOTYsMHg0Rjk4LC8qIDB4RjAtMHhGNyAqLworCTB4NEY5OSwweDRGOUEsMHg0RjlDLDB4NEY5RSwweDRGOUYsMHg0RkExLDB4NEZBMiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfODJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg0RkE0LDB4NEZBQiwweDRGQUQsMHg0RkIwLDB4NEZCMSwweDRGQjIsMHg0RkIzLDB4NEZCNCwvKiAweDQwLTB4NDcgKi8KKwkweDRGQjYsMHg0RkI3LDB4NEZCOCwweDRGQjksMHg0RkJBLDB4NEZCQiwweDRGQkMsMHg0RkJELC8qIDB4NDgtMHg0RiAqLworCTB4NEZCRSwweDRGQzAsMHg0RkMxLDB4NEZDMiwweDRGQzYsMHg0RkM3LDB4NEZDOCwweDRGQzksLyogMHg1MC0weDU3ICovCisJMHg0RkNCLDB4NEZDQywweDRGQ0QsMHg0RkQyLDB4NEZEMywweDRGRDQsMHg0RkQ1LDB4NEZENiwvKiAweDU4LTB4NUYgKi8KKwkweDRGRDksMHg0RkRCLDB4NEZFMCwweDRGRTIsMHg0RkU0LDB4NEZFNSwweDRGRTcsMHg0RkVCLC8qIDB4NjAtMHg2NyAqLworCTB4NEZFQywweDRGRjAsMHg0RkYyLDB4NEZGNCwweDRGRjUsMHg0RkY2LDB4NEZGNywweDRGRjksLyogMHg2OC0weDZGICovCisJMHg0RkZCLDB4NEZGQywweDRGRkQsMHg0RkZGLDB4NTAwMCwweDUwMDEsMHg1MDAyLDB4NTAwMywvKiAweDcwLTB4NzcgKi8KKwkweDUwMDQsMHg1MDA1LDB4NTAwNiwweDUwMDcsMHg1MDA4LDB4NTAwOSwweDUwMEEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg1MDBCLDB4NTAwRSwweDUwMTAsMHg1MDExLDB4NTAxMywweDUwMTUsMHg1MDE2LDB4NTAxNywvKiAweDgwLTB4ODcgKi8KKwkweDUwMUIsMHg1MDFELDB4NTAxRSwweDUwMjAsMHg1MDIyLDB4NTAyMywweDUwMjQsMHg1MDI3LC8qIDB4ODgtMHg4RiAqLworCTB4NTAyQiwweDUwMkYsMHg1MDMwLDB4NTAzMSwweDUwMzIsMHg1MDMzLDB4NTAzNCwweDUwMzUsLyogMHg5MC0weDk3ICovCisJMHg1MDM2LDB4NTAzNywweDUwMzgsMHg1MDM5LDB4NTAzQiwweDUwM0QsMHg1MDNGLDB4NTA0MCwvKiAweDk4LTB4OUYgKi8KKwkweDUwNDEsMHg1MDQyLDB4NTA0NCwweDUwNDUsMHg1MDQ2LDB4NTA0OSwweDUwNEEsMHg1MDRCLC8qIDB4QTAtMHhBNyAqLworCTB4NTA0RCwweDUwNTAsMHg1MDUxLDB4NTA1MiwweDUwNTMsMHg1MDU0LDB4NTA1NiwweDUwNTcsLyogMHhBOC0weEFGICovCisJMHg1MDU4LDB4NTA1OSwweDUwNUIsMHg1MDVELDB4NTA1RSwweDUwNUYsMHg1MDYwLDB4NTA2MSwvKiAweEIwLTB4QjcgKi8KKwkweDUwNjIsMHg1MDYzLDB4NTA2NCwweDUwNjYsMHg1MDY3LDB4NTA2OCwweDUwNjksMHg1MDZBLC8qIDB4QjgtMHhCRiAqLworCTB4NTA2QiwweDUwNkQsMHg1MDZFLDB4NTA2RiwweDUwNzAsMHg1MDcxLDB4NTA3MiwweDUwNzMsLyogMHhDMC0weEM3ICovCisJMHg1MDc0LDB4NTA3NSwweDUwNzgsMHg1MDc5LDB4NTA3QSwweDUwN0MsMHg1MDdELDB4NTA4MSwvKiAweEM4LTB4Q0YgKi8KKwkweDUwODIsMHg1MDgzLDB4NTA4NCwweDUwODYsMHg1MDg3LDB4NTA4OSwweDUwOEEsMHg1MDhCLC8qIDB4RDAtMHhENyAqLworCTB4NTA4QywweDUwOEUsMHg1MDhGLDB4NTA5MCwweDUwOTEsMHg1MDkyLDB4NTA5MywweDUwOTQsLyogMHhEOC0weERGICovCisJMHg1MDk1LDB4NTA5NiwweDUwOTcsMHg1MDk4LDB4NTA5OSwweDUwOUEsMHg1MDlCLDB4NTA5QywvKiAweEUwLTB4RTcgKi8KKwkweDUwOUQsMHg1MDlFLDB4NTA5RiwweDUwQTAsMHg1MEExLDB4NTBBMiwweDUwQTQsMHg1MEE2LC8qIDB4RTgtMHhFRiAqLworCTB4NTBBQSwweDUwQUIsMHg1MEFELDB4NTBBRSwweDUwQUYsMHg1MEIwLDB4NTBCMSwweDUwQjMsLyogMHhGMC0weEY3ICovCisJMHg1MEI0LDB4NTBCNSwweDUwQjYsMHg1MEI3LDB4NTBCOCwweDUwQjksMHg1MEJDLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84M1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDUwQkQsMHg1MEJFLDB4NTBCRiwweDUwQzAsMHg1MEMxLDB4NTBDMiwweDUwQzMsMHg1MEM0LC8qIDB4NDAtMHg0NyAqLworCTB4NTBDNSwweDUwQzYsMHg1MEM3LDB4NTBDOCwweDUwQzksMHg1MENBLDB4NTBDQiwweDUwQ0MsLyogMHg0OC0weDRGICovCisJMHg1MENELDB4NTBDRSwweDUwRDAsMHg1MEQxLDB4NTBEMiwweDUwRDMsMHg1MEQ0LDB4NTBENSwvKiAweDUwLTB4NTcgKi8KKwkweDUwRDcsMHg1MEQ4LDB4NTBEOSwweDUwREIsMHg1MERDLDB4NTBERCwweDUwREUsMHg1MERGLC8qIDB4NTgtMHg1RiAqLworCTB4NTBFMCwweDUwRTEsMHg1MEUyLDB4NTBFMywweDUwRTQsMHg1MEU1LDB4NTBFOCwweDUwRTksLyogMHg2MC0weDY3ICovCisJMHg1MEVBLDB4NTBFQiwweDUwRUYsMHg1MEYwLDB4NTBGMSwweDUwRjIsMHg1MEY0LDB4NTBGNiwvKiAweDY4LTB4NkYgKi8KKwkweDUwRjcsMHg1MEY4LDB4NTBGOSwweDUwRkEsMHg1MEZDLDB4NTBGRCwweDUwRkUsMHg1MEZGLC8qIDB4NzAtMHg3NyAqLworCTB4NTEwMCwweDUxMDEsMHg1MTAyLDB4NTEwMywweDUxMDQsMHg1MTA1LDB4NTEwOCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDUxMDksMHg1MTBBLDB4NTEwQywweDUxMEQsMHg1MTBFLDB4NTEwRiwweDUxMTAsMHg1MTExLC8qIDB4ODAtMHg4NyAqLworCTB4NTExMywweDUxMTQsMHg1MTE1LDB4NTExNiwweDUxMTcsMHg1MTE4LDB4NTExOSwweDUxMUEsLyogMHg4OC0weDhGICovCisJMHg1MTFCLDB4NTExQywweDUxMUQsMHg1MTFFLDB4NTExRiwweDUxMjAsMHg1MTIyLDB4NTEyMywvKiAweDkwLTB4OTcgKi8KKwkweDUxMjQsMHg1MTI1LDB4NTEyNiwweDUxMjcsMHg1MTI4LDB4NTEyOSwweDUxMkEsMHg1MTJCLC8qIDB4OTgtMHg5RiAqLworCTB4NTEyQywweDUxMkQsMHg1MTJFLDB4NTEyRiwweDUxMzAsMHg1MTMxLDB4NTEzMiwweDUxMzMsLyogMHhBMC0weEE3ICovCisJMHg1MTM0LDB4NTEzNSwweDUxMzYsMHg1MTM3LDB4NTEzOCwweDUxMzksMHg1MTNBLDB4NTEzQiwvKiAweEE4LTB4QUYgKi8KKwkweDUxM0MsMHg1MTNELDB4NTEzRSwweDUxNDIsMHg1MTQ3LDB4NTE0QSwweDUxNEMsMHg1MTRFLC8qIDB4QjAtMHhCNyAqLworCTB4NTE0RiwweDUxNTAsMHg1MTUyLDB4NTE1MywweDUxNTcsMHg1MTU4LDB4NTE1OSwweDUxNUIsLyogMHhCOC0weEJGICovCisJMHg1MTVELDB4NTE1RSwweDUxNUYsMHg1MTYwLDB4NTE2MSwweDUxNjMsMHg1MTY0LDB4NTE2NiwvKiAweEMwLTB4QzcgKi8KKwkweDUxNjcsMHg1MTY5LDB4NTE2QSwweDUxNkYsMHg1MTcyLDB4NTE3QSwweDUxN0UsMHg1MTdGLC8qIDB4QzgtMHhDRiAqLworCTB4NTE4MywweDUxODQsMHg1MTg2LDB4NTE4NywweDUxOEEsMHg1MThCLDB4NTE4RSwweDUxOEYsLyogMHhEMC0weEQ3ICovCisJMHg1MTkwLDB4NTE5MSwweDUxOTMsMHg1MTk0LDB4NTE5OCwweDUxOUEsMHg1MTlELDB4NTE5RSwvKiAweEQ4LTB4REYgKi8KKwkweDUxOUYsMHg1MUExLDB4NTFBMywweDUxQTYsMHg1MUE3LDB4NTFBOCwweDUxQTksMHg1MUFBLC8qIDB4RTAtMHhFNyAqLworCTB4NTFBRCwweDUxQUUsMHg1MUI0LDB4NTFCOCwweDUxQjksMHg1MUJBLDB4NTFCRSwweDUxQkYsLyogMHhFOC0weEVGICovCisJMHg1MUMxLDB4NTFDMiwweDUxQzMsMHg1MUM1LDB4NTFDOCwweDUxQ0EsMHg1MUNELDB4NTFDRSwvKiAweEYwLTB4RjcgKi8KKwkweDUxRDAsMHg1MUQyLDB4NTFEMywweDUxRDQsMHg1MUQ1LDB4NTFENiwweDUxRDcsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzg0WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NTFEOCwweDUxRDksMHg1MURBLDB4NTFEQywweDUxREUsMHg1MURGLDB4NTFFMiwweDUxRTMsLyogMHg0MC0weDQ3ICovCisJMHg1MUU1LDB4NTFFNiwweDUxRTcsMHg1MUU4LDB4NTFFOSwweDUxRUEsMHg1MUVDLDB4NTFFRSwvKiAweDQ4LTB4NEYgKi8KKwkweDUxRjEsMHg1MUYyLDB4NTFGNCwweDUxRjcsMHg1MUZFLDB4NTIwNCwweDUyMDUsMHg1MjA5LC8qIDB4NTAtMHg1NyAqLworCTB4NTIwQiwweDUyMEMsMHg1MjBGLDB4NTIxMCwweDUyMTMsMHg1MjE0LDB4NTIxNSwweDUyMUMsLyogMHg1OC0weDVGICovCisJMHg1MjFFLDB4NTIxRiwweDUyMjEsMHg1MjIyLDB4NTIyMywweDUyMjUsMHg1MjI2LDB4NTIyNywvKiAweDYwLTB4NjcgKi8KKwkweDUyMkEsMHg1MjJDLDB4NTIyRiwweDUyMzEsMHg1MjMyLDB4NTIzNCwweDUyMzUsMHg1MjNDLC8qIDB4NjgtMHg2RiAqLworCTB4NTIzRSwweDUyNDQsMHg1MjQ1LDB4NTI0NiwweDUyNDcsMHg1MjQ4LDB4NTI0OSwweDUyNEIsLyogMHg3MC0weDc3ICovCisJMHg1MjRFLDB4NTI0RiwweDUyNTIsMHg1MjUzLDB4NTI1NSwweDUyNTcsMHg1MjU4LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NTI1OSwweDUyNUEsMHg1MjVCLDB4NTI1RCwweDUyNUYsMHg1MjYwLDB4NTI2MiwweDUyNjMsLyogMHg4MC0weDg3ICovCisJMHg1MjY0LDB4NTI2NiwweDUyNjgsMHg1MjZCLDB4NTI2QywweDUyNkQsMHg1MjZFLDB4NTI3MCwvKiAweDg4LTB4OEYgKi8KKwkweDUyNzEsMHg1MjczLDB4NTI3NCwweDUyNzUsMHg1Mjc2LDB4NTI3NywweDUyNzgsMHg1Mjc5LC8qIDB4OTAtMHg5NyAqLworCTB4NTI3QSwweDUyN0IsMHg1MjdDLDB4NTI3RSwweDUyODAsMHg1MjgzLDB4NTI4NCwweDUyODUsLyogMHg5OC0weDlGICovCisJMHg1Mjg2LDB4NTI4NywweDUyODksMHg1MjhBLDB4NTI4QiwweDUyOEMsMHg1MjhELDB4NTI4RSwvKiAweEEwLTB4QTcgKi8KKwkweDUyOEYsMHg1MjkxLDB4NTI5MiwweDUyOTQsMHg1Mjk1LDB4NTI5NiwweDUyOTcsMHg1Mjk4LC8qIDB4QTgtMHhBRiAqLworCTB4NTI5OSwweDUyOUEsMHg1MjlDLDB4NTJBNCwweDUyQTUsMHg1MkE2LDB4NTJBNywweDUyQUUsLyogMHhCMC0weEI3ICovCisJMHg1MkFGLDB4NTJCMCwweDUyQjQsMHg1MkI1LDB4NTJCNiwweDUyQjcsMHg1MkI4LDB4NTJCOSwvKiAweEI4LTB4QkYgKi8KKwkweDUyQkEsMHg1MkJCLDB4NTJCQywweDUyQkQsMHg1MkMwLDB4NTJDMSwweDUyQzIsMHg1MkM0LC8qIDB4QzAtMHhDNyAqLworCTB4NTJDNSwweDUyQzYsMHg1MkM4LDB4NTJDQSwweDUyQ0MsMHg1MkNELDB4NTJDRSwweDUyQ0YsLyogMHhDOC0weENGICovCisJMHg1MkQxLDB4NTJEMywweDUyRDQsMHg1MkQ1LDB4NTJENywweDUyRDksMHg1MkRBLDB4NTJEQiwvKiAweEQwLTB4RDcgKi8KKwkweDUyREMsMHg1MkRELDB4NTJERSwweDUyRTAsMHg1MkUxLDB4NTJFMiwweDUyRTMsMHg1MkU1LC8qIDB4RDgtMHhERiAqLworCTB4NTJFNiwweDUyRTcsMHg1MkU4LDB4NTJFOSwweDUyRUEsMHg1MkVCLDB4NTJFQywweDUyRUQsLyogMHhFMC0weEU3ICovCisJMHg1MkVFLDB4NTJFRiwweDUyRjEsMHg1MkYyLDB4NTJGMywweDUyRjQsMHg1MkY1LDB4NTJGNiwvKiAweEU4LTB4RUYgKi8KKwkweDUyRjcsMHg1MkY4LDB4NTJGQiwweDUyRkMsMHg1MkZELDB4NTMwMSwweDUzMDIsMHg1MzAzLC8qIDB4RjAtMHhGNyAqLworCTB4NTMwNCwweDUzMDcsMHg1MzA5LDB4NTMwQSwweDUzMEIsMHg1MzBDLDB4NTMwRSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfODVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1MzExLDB4NTMxMiwweDUzMTMsMHg1MzE0LDB4NTMxOCwweDUzMUIsMHg1MzFDLDB4NTMxRSwvKiAweDQwLTB4NDcgKi8KKwkweDUzMUYsMHg1MzIyLDB4NTMyNCwweDUzMjUsMHg1MzI3LDB4NTMyOCwweDUzMjksMHg1MzJCLC8qIDB4NDgtMHg0RiAqLworCTB4NTMyQywweDUzMkQsMHg1MzJGLDB4NTMzMCwweDUzMzEsMHg1MzMyLDB4NTMzMywweDUzMzQsLyogMHg1MC0weDU3ICovCisJMHg1MzM1LDB4NTMzNiwweDUzMzcsMHg1MzM4LDB4NTMzQywweDUzM0QsMHg1MzQwLDB4NTM0MiwvKiAweDU4LTB4NUYgKi8KKwkweDUzNDQsMHg1MzQ2LDB4NTM0QiwweDUzNEMsMHg1MzRELDB4NTM1MCwweDUzNTQsMHg1MzU4LC8qIDB4NjAtMHg2NyAqLworCTB4NTM1OSwweDUzNUIsMHg1MzVELDB4NTM2NSwweDUzNjgsMHg1MzZBLDB4NTM2QywweDUzNkQsLyogMHg2OC0weDZGICovCisJMHg1MzcyLDB4NTM3NiwweDUzNzksMHg1MzdCLDB4NTM3QywweDUzN0QsMHg1MzdFLDB4NTM4MCwvKiAweDcwLTB4NzcgKi8KKwkweDUzODEsMHg1MzgzLDB4NTM4NywweDUzODgsMHg1MzhBLDB4NTM4RSwweDUzOEYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg1MzkwLDB4NTM5MSwweDUzOTIsMHg1MzkzLDB4NTM5NCwweDUzOTYsMHg1Mzk3LDB4NTM5OSwvKiAweDgwLTB4ODcgKi8KKwkweDUzOUIsMHg1MzlDLDB4NTM5RSwweDUzQTAsMHg1M0ExLDB4NTNBNCwweDUzQTcsMHg1M0FBLC8qIDB4ODgtMHg4RiAqLworCTB4NTNBQiwweDUzQUMsMHg1M0FELDB4NTNBRiwweDUzQjAsMHg1M0IxLDB4NTNCMiwweDUzQjMsLyogMHg5MC0weDk3ICovCisJMHg1M0I0LDB4NTNCNSwweDUzQjcsMHg1M0I4LDB4NTNCOSwweDUzQkEsMHg1M0JDLDB4NTNCRCwvKiAweDk4LTB4OUYgKi8KKwkweDUzQkUsMHg1M0MwLDB4NTNDMywweDUzQzQsMHg1M0M1LDB4NTNDNiwweDUzQzcsMHg1M0NFLC8qIDB4QTAtMHhBNyAqLworCTB4NTNDRiwweDUzRDAsMHg1M0QyLDB4NTNEMywweDUzRDUsMHg1M0RBLDB4NTNEQywweDUzREQsLyogMHhBOC0weEFGICovCisJMHg1M0RFLDB4NTNFMSwweDUzRTIsMHg1M0U3LDB4NTNGNCwweDUzRkEsMHg1M0ZFLDB4NTNGRiwvKiAweEIwLTB4QjcgKi8KKwkweDU0MDAsMHg1NDAyLDB4NTQwNSwweDU0MDcsMHg1NDBCLDB4NTQxNCwweDU0MTgsMHg1NDE5LC8qIDB4QjgtMHhCRiAqLworCTB4NTQxQSwweDU0MUMsMHg1NDIyLDB4NTQyNCwweDU0MjUsMHg1NDJBLDB4NTQzMCwweDU0MzMsLyogMHhDMC0weEM3ICovCisJMHg1NDM2LDB4NTQzNywweDU0M0EsMHg1NDNELDB4NTQzRiwweDU0NDEsMHg1NDQyLDB4NTQ0NCwvKiAweEM4LTB4Q0YgKi8KKwkweDU0NDUsMHg1NDQ3LDB4NTQ0OSwweDU0NEMsMHg1NDRELDB4NTQ0RSwweDU0NEYsMHg1NDUxLC8qIDB4RDAtMHhENyAqLworCTB4NTQ1QSwweDU0NUQsMHg1NDVFLDB4NTQ1RiwweDU0NjAsMHg1NDYxLDB4NTQ2MywweDU0NjUsLyogMHhEOC0weERGICovCisJMHg1NDY3LDB4NTQ2OSwweDU0NkEsMHg1NDZCLDB4NTQ2QywweDU0NkQsMHg1NDZFLDB4NTQ2RiwvKiAweEUwLTB4RTcgKi8KKwkweDU0NzAsMHg1NDc0LDB4NTQ3OSwweDU0N0EsMHg1NDdFLDB4NTQ3RiwweDU0ODEsMHg1NDgzLC8qIDB4RTgtMHhFRiAqLworCTB4NTQ4NSwweDU0ODcsMHg1NDg4LDB4NTQ4OSwweDU0OEEsMHg1NDhELDB4NTQ5MSwweDU0OTMsLyogMHhGMC0weEY3ICovCisJMHg1NDk3LDB4NTQ5OCwweDU0OUMsMHg1NDlFLDB4NTQ5RiwweDU0QTAsMHg1NEExLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84NlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDU0QTIsMHg1NEE1LDB4NTRBRSwweDU0QjAsMHg1NEIyLDB4NTRCNSwweDU0QjYsMHg1NEI3LC8qIDB4NDAtMHg0NyAqLworCTB4NTRCOSwweDU0QkEsMHg1NEJDLDB4NTRCRSwweDU0QzMsMHg1NEM1LDB4NTRDQSwweDU0Q0IsLyogMHg0OC0weDRGICovCisJMHg1NEQ2LDB4NTREOCwweDU0REIsMHg1NEUwLDB4NTRFMSwweDU0RTIsMHg1NEUzLDB4NTRFNCwvKiAweDUwLTB4NTcgKi8KKwkweDU0RUIsMHg1NEVDLDB4NTRFRiwweDU0RjAsMHg1NEYxLDB4NTRGNCwweDU0RjUsMHg1NEY2LC8qIDB4NTgtMHg1RiAqLworCTB4NTRGNywweDU0RjgsMHg1NEY5LDB4NTRGQiwweDU0RkUsMHg1NTAwLDB4NTUwMiwweDU1MDMsLyogMHg2MC0weDY3ICovCisJMHg1NTA0LDB4NTUwNSwweDU1MDgsMHg1NTBBLDB4NTUwQiwweDU1MEMsMHg1NTBELDB4NTUwRSwvKiAweDY4LTB4NkYgKi8KKwkweDU1MTIsMHg1NTEzLDB4NTUxNSwweDU1MTYsMHg1NTE3LDB4NTUxOCwweDU1MTksMHg1NTFBLC8qIDB4NzAtMHg3NyAqLworCTB4NTUxQywweDU1MUQsMHg1NTFFLDB4NTUxRiwweDU1MjEsMHg1NTI1LDB4NTUyNiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDU1MjgsMHg1NTI5LDB4NTUyQiwweDU1MkQsMHg1NTMyLDB4NTUzNCwweDU1MzUsMHg1NTM2LC8qIDB4ODAtMHg4NyAqLworCTB4NTUzOCwweDU1MzksMHg1NTNBLDB4NTUzQiwweDU1M0QsMHg1NTQwLDB4NTU0MiwweDU1NDUsLyogMHg4OC0weDhGICovCisJMHg1NTQ3LDB4NTU0OCwweDU1NEIsMHg1NTRDLDB4NTU0RCwweDU1NEUsMHg1NTRGLDB4NTU1MSwvKiAweDkwLTB4OTcgKi8KKwkweDU1NTIsMHg1NTUzLDB4NTU1NCwweDU1NTcsMHg1NTU4LDB4NTU1OSwweDU1NUEsMHg1NTVCLC8qIDB4OTgtMHg5RiAqLworCTB4NTU1RCwweDU1NUUsMHg1NTVGLDB4NTU2MCwweDU1NjIsMHg1NTYzLDB4NTU2OCwweDU1NjksLyogMHhBMC0weEE3ICovCisJMHg1NTZCLDB4NTU2RiwweDU1NzAsMHg1NTcxLDB4NTU3MiwweDU1NzMsMHg1NTc0LDB4NTU3OSwvKiAweEE4LTB4QUYgKi8KKwkweDU1N0EsMHg1NTdELDB4NTU3RiwweDU1ODUsMHg1NTg2LDB4NTU4QywweDU1OEQsMHg1NThFLC8qIDB4QjAtMHhCNyAqLworCTB4NTU5MCwweDU1OTIsMHg1NTkzLDB4NTU5NSwweDU1OTYsMHg1NTk3LDB4NTU5QSwweDU1OUIsLyogMHhCOC0weEJGICovCisJMHg1NTlFLDB4NTVBMCwweDU1QTEsMHg1NUEyLDB4NTVBMywweDU1QTQsMHg1NUE1LDB4NTVBNiwvKiAweEMwLTB4QzcgKi8KKwkweDU1QTgsMHg1NUE5LDB4NTVBQSwweDU1QUIsMHg1NUFDLDB4NTVBRCwweDU1QUUsMHg1NUFGLC8qIDB4QzgtMHhDRiAqLworCTB4NTVCMCwweDU1QjIsMHg1NUI0LDB4NTVCNiwweDU1QjgsMHg1NUJBLDB4NTVCQywweDU1QkYsLyogMHhEMC0weEQ3ICovCisJMHg1NUMwLDB4NTVDMSwweDU1QzIsMHg1NUMzLDB4NTVDNiwweDU1QzcsMHg1NUM4LDB4NTVDQSwvKiAweEQ4LTB4REYgKi8KKwkweDU1Q0IsMHg1NUNFLDB4NTVDRiwweDU1RDAsMHg1NUQ1LDB4NTVENywweDU1RDgsMHg1NUQ5LC8qIDB4RTAtMHhFNyAqLworCTB4NTVEQSwweDU1REIsMHg1NURFLDB4NTVFMCwweDU1RTIsMHg1NUU3LDB4NTVFOSwweDU1RUQsLyogMHhFOC0weEVGICovCisJMHg1NUVFLDB4NTVGMCwweDU1RjEsMHg1NUY0LDB4NTVGNiwweDU1RjgsMHg1NUY5LDB4NTVGQSwvKiAweEYwLTB4RjcgKi8KKwkweDU1RkIsMHg1NUZDLDB4NTVGRiwweDU2MDIsMHg1NjAzLDB4NTYwNCwweDU2MDUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzg3WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NTYwNiwweDU2MDcsMHg1NjBBLDB4NTYwQiwweDU2MEQsMHg1NjEwLDB4NTYxMSwweDU2MTIsLyogMHg0MC0weDQ3ICovCisJMHg1NjEzLDB4NTYxNCwweDU2MTUsMHg1NjE2LDB4NTYxNywweDU2MTksMHg1NjFBLDB4NTYxQywvKiAweDQ4LTB4NEYgKi8KKwkweDU2MUQsMHg1NjIwLDB4NTYyMSwweDU2MjIsMHg1NjI1LDB4NTYyNiwweDU2MjgsMHg1NjI5LC8qIDB4NTAtMHg1NyAqLworCTB4NTYyQSwweDU2MkIsMHg1NjJFLDB4NTYyRiwweDU2MzAsMHg1NjMzLDB4NTYzNSwweDU2MzcsLyogMHg1OC0weDVGICovCisJMHg1NjM4LDB4NTYzQSwweDU2M0MsMHg1NjNELDB4NTYzRSwweDU2NDAsMHg1NjQxLDB4NTY0MiwvKiAweDYwLTB4NjcgKi8KKwkweDU2NDMsMHg1NjQ0LDB4NTY0NSwweDU2NDYsMHg1NjQ3LDB4NTY0OCwweDU2NDksMHg1NjRBLC8qIDB4NjgtMHg2RiAqLworCTB4NTY0QiwweDU2NEYsMHg1NjUwLDB4NTY1MSwweDU2NTIsMHg1NjUzLDB4NTY1NSwweDU2NTYsLyogMHg3MC0weDc3ICovCisJMHg1NjVBLDB4NTY1QiwweDU2NUQsMHg1NjVFLDB4NTY1RiwweDU2NjAsMHg1NjYxLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NTY2MywweDU2NjUsMHg1NjY2LDB4NTY2NywweDU2NkQsMHg1NjZFLDB4NTY2RiwweDU2NzAsLyogMHg4MC0weDg3ICovCisJMHg1NjcyLDB4NTY3MywweDU2NzQsMHg1Njc1LDB4NTY3NywweDU2NzgsMHg1Njc5LDB4NTY3QSwvKiAweDg4LTB4OEYgKi8KKwkweDU2N0QsMHg1NjdFLDB4NTY3RiwweDU2ODAsMHg1NjgxLDB4NTY4MiwweDU2ODMsMHg1Njg0LC8qIDB4OTAtMHg5NyAqLworCTB4NTY4NywweDU2ODgsMHg1Njg5LDB4NTY4QSwweDU2OEIsMHg1NjhDLDB4NTY4RCwweDU2OTAsLyogMHg5OC0weDlGICovCisJMHg1NjkxLDB4NTY5MiwweDU2OTQsMHg1Njk1LDB4NTY5NiwweDU2OTcsMHg1Njk4LDB4NTY5OSwvKiAweEEwLTB4QTcgKi8KKwkweDU2OUEsMHg1NjlCLDB4NTY5QywweDU2OUQsMHg1NjlFLDB4NTY5RiwweDU2QTAsMHg1NkExLC8qIDB4QTgtMHhBRiAqLworCTB4NTZBMiwweDU2QTQsMHg1NkE1LDB4NTZBNiwweDU2QTcsMHg1NkE4LDB4NTZBOSwweDU2QUEsLyogMHhCMC0weEI3ICovCisJMHg1NkFCLDB4NTZBQywweDU2QUQsMHg1NkFFLDB4NTZCMCwweDU2QjEsMHg1NkIyLDB4NTZCMywvKiAweEI4LTB4QkYgKi8KKwkweDU2QjQsMHg1NkI1LDB4NTZCNiwweDU2QjgsMHg1NkI5LDB4NTZCQSwweDU2QkIsMHg1NkJELC8qIDB4QzAtMHhDNyAqLworCTB4NTZCRSwweDU2QkYsMHg1NkMwLDB4NTZDMSwweDU2QzIsMHg1NkMzLDB4NTZDNCwweDU2QzUsLyogMHhDOC0weENGICovCisJMHg1NkM2LDB4NTZDNywweDU2QzgsMHg1NkM5LDB4NTZDQiwweDU2Q0MsMHg1NkNELDB4NTZDRSwvKiAweEQwLTB4RDcgKi8KKwkweDU2Q0YsMHg1NkQwLDB4NTZEMSwweDU2RDIsMHg1NkQzLDB4NTZENSwweDU2RDYsMHg1NkQ4LC8qIDB4RDgtMHhERiAqLworCTB4NTZEOSwweDU2REMsMHg1NkUzLDB4NTZFNSwweDU2RTYsMHg1NkU3LDB4NTZFOCwweDU2RTksLyogMHhFMC0weEU3ICovCisJMHg1NkVBLDB4NTZFQywweDU2RUUsMHg1NkVGLDB4NTZGMiwweDU2RjMsMHg1NkY2LDB4NTZGNywvKiAweEU4LTB4RUYgKi8KKwkweDU2RjgsMHg1NkZCLDB4NTZGQywweDU3MDAsMHg1NzAxLDB4NTcwMiwweDU3MDUsMHg1NzA3LC8qIDB4RjAtMHhGNyAqLworCTB4NTcwQiwweDU3MEMsMHg1NzBELDB4NTcwRSwweDU3MEYsMHg1NzEwLDB4NTcxMSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfODhbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1NzEyLDB4NTcxMywweDU3MTQsMHg1NzE1LDB4NTcxNiwweDU3MTcsMHg1NzE4LDB4NTcxOSwvKiAweDQwLTB4NDcgKi8KKwkweDU3MUEsMHg1NzFCLDB4NTcxRCwweDU3MUUsMHg1NzIwLDB4NTcyMSwweDU3MjIsMHg1NzI0LC8qIDB4NDgtMHg0RiAqLworCTB4NTcyNSwweDU3MjYsMHg1NzI3LDB4NTcyQiwweDU3MzEsMHg1NzMyLDB4NTczNCwweDU3MzUsLyogMHg1MC0weDU3ICovCisJMHg1NzM2LDB4NTczNywweDU3MzgsMHg1NzNDLDB4NTczRCwweDU3M0YsMHg1NzQxLDB4NTc0MywvKiAweDU4LTB4NUYgKi8KKwkweDU3NDQsMHg1NzQ1LDB4NTc0NiwweDU3NDgsMHg1NzQ5LDB4NTc0QiwweDU3NTIsMHg1NzUzLC8qIDB4NjAtMHg2NyAqLworCTB4NTc1NCwweDU3NTUsMHg1NzU2LDB4NTc1OCwweDU3NTksMHg1NzYyLDB4NTc2MywweDU3NjUsLyogMHg2OC0weDZGICovCisJMHg1NzY3LDB4NTc2QywweDU3NkUsMHg1NzcwLDB4NTc3MSwweDU3NzIsMHg1Nzc0LDB4NTc3NSwvKiAweDcwLTB4NzcgKi8KKwkweDU3NzgsMHg1Nzc5LDB4NTc3QSwweDU3N0QsMHg1NzdFLDB4NTc3RiwweDU3ODAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg1NzgxLDB4NTc4NywweDU3ODgsMHg1Nzg5LDB4NTc4QSwweDU3OEQsMHg1NzhFLDB4NTc4RiwvKiAweDgwLTB4ODcgKi8KKwkweDU3OTAsMHg1NzkxLDB4NTc5NCwweDU3OTUsMHg1Nzk2LDB4NTc5NywweDU3OTgsMHg1Nzk5LC8qIDB4ODgtMHg4RiAqLworCTB4NTc5QSwweDU3OUMsMHg1NzlELDB4NTc5RSwweDU3OUYsMHg1N0E1LDB4NTdBOCwweDU3QUEsLyogMHg5MC0weDk3ICovCisJMHg1N0FDLDB4NTdBRiwweDU3QjAsMHg1N0IxLDB4NTdCMywweDU3QjUsMHg1N0I2LDB4NTdCNywvKiAweDk4LTB4OUYgKi8KKwkweDU3QjksMHg1N0JBLDB4NTdCQiwweDU3QkMsMHg1N0JELDB4NTdCRSwweDU3QkYsMHg1N0MwLC8qIDB4QTAtMHhBNyAqLworCTB4NTdDMSwweDU3QzQsMHg1N0M1LDB4NTdDNiwweDU3QzcsMHg1N0M4LDB4NTdDOSwweDU3Q0EsLyogMHhBOC0weEFGICovCisJMHg1N0NDLDB4NTdDRCwweDU3RDAsMHg1N0QxLDB4NTdEMywweDU3RDYsMHg1N0Q3LDB4NTdEQiwvKiAweEIwLTB4QjcgKi8KKwkweDU3REMsMHg1N0RFLDB4NTdFMSwweDU3RTIsMHg1N0UzLDB4NTdFNSwweDU3RTYsMHg1N0U3LC8qIDB4QjgtMHhCRiAqLworCTB4NTdFOCwweDU3RTksMHg1N0VBLDB4NTdFQiwweDU3RUMsMHg1N0VFLDB4NTdGMCwweDU3RjEsLyogMHhDMC0weEM3ICovCisJMHg1N0YyLDB4NTdGMywweDU3RjUsMHg1N0Y2LDB4NTdGNywweDU3RkIsMHg1N0ZDLDB4NTdGRSwvKiAweEM4LTB4Q0YgKi8KKwkweDU3RkYsMHg1ODAxLDB4NTgwMywweDU4MDQsMHg1ODA1LDB4NTgwOCwweDU4MDksMHg1ODBBLC8qIDB4RDAtMHhENyAqLworCTB4NTgwQywweDU4MEUsMHg1ODBGLDB4NTgxMCwweDU4MTIsMHg1ODEzLDB4NTgxNCwweDU4MTYsLyogMHhEOC0weERGICovCisJMHg1ODE3LDB4NTgxOCwweDU4MUEsMHg1ODFCLDB4NTgxQywweDU4MUQsMHg1ODFGLDB4NTgyMiwvKiAweEUwLTB4RTcgKi8KKwkweDU4MjMsMHg1ODI1LDB4NTgyNiwweDU4MjcsMHg1ODI4LDB4NTgyOSwweDU4MkIsMHg1ODJDLC8qIDB4RTgtMHhFRiAqLworCTB4NTgyRCwweDU4MkUsMHg1ODJGLDB4NTgzMSwweDU4MzIsMHg1ODMzLDB4NTgzNCwweDU4MzYsLyogMHhGMC0weEY3ICovCisJMHg1ODM3LDB4NTgzOCwweDU4MzksMHg1ODNBLDB4NTgzQiwweDU4M0MsMHg1ODNELDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84OVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDU4M0UsMHg1ODNGLDB4NTg0MCwweDU4NDEsMHg1ODQyLDB4NTg0MywweDU4NDUsMHg1ODQ2LC8qIDB4NDAtMHg0NyAqLworCTB4NTg0NywweDU4NDgsMHg1ODQ5LDB4NTg0QSwweDU4NEIsMHg1ODRFLDB4NTg0RiwweDU4NTAsLyogMHg0OC0weDRGICovCisJMHg1ODUyLDB4NTg1MywweDU4NTUsMHg1ODU2LDB4NTg1NywweDU4NTksMHg1ODVBLDB4NTg1QiwvKiAweDUwLTB4NTcgKi8KKwkweDU4NUMsMHg1ODVELDB4NTg1RiwweDU4NjAsMHg1ODYxLDB4NTg2MiwweDU4NjMsMHg1ODY0LC8qIDB4NTgtMHg1RiAqLworCTB4NTg2NiwweDU4NjcsMHg1ODY4LDB4NTg2OSwweDU4NkEsMHg1ODZELDB4NTg2RSwweDU4NkYsLyogMHg2MC0weDY3ICovCisJMHg1ODcwLDB4NTg3MSwweDU4NzIsMHg1ODczLDB4NTg3NCwweDU4NzUsMHg1ODc2LDB4NTg3NywvKiAweDY4LTB4NkYgKi8KKwkweDU4NzgsMHg1ODc5LDB4NTg3QSwweDU4N0IsMHg1ODdDLDB4NTg3RCwweDU4N0YsMHg1ODgyLC8qIDB4NzAtMHg3NyAqLworCTB4NTg4NCwweDU4ODYsMHg1ODg3LDB4NTg4OCwweDU4OEEsMHg1ODhCLDB4NTg4QywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDU4OEQsMHg1ODhFLDB4NTg4RiwweDU4OTAsMHg1ODkxLDB4NTg5NCwweDU4OTUsMHg1ODk2LC8qIDB4ODAtMHg4NyAqLworCTB4NTg5NywweDU4OTgsMHg1ODlCLDB4NTg5QywweDU4OUQsMHg1OEEwLDB4NThBMSwweDU4QTIsLyogMHg4OC0weDhGICovCisJMHg1OEEzLDB4NThBNCwweDU4QTUsMHg1OEE2LDB4NThBNywweDU4QUEsMHg1OEFCLDB4NThBQywvKiAweDkwLTB4OTcgKi8KKwkweDU4QUQsMHg1OEFFLDB4NThBRiwweDU4QjAsMHg1OEIxLDB4NThCMiwweDU4QjMsMHg1OEI0LC8qIDB4OTgtMHg5RiAqLworCTB4NThCNSwweDU4QjYsMHg1OEI3LDB4NThCOCwweDU4QjksMHg1OEJBLDB4NThCQiwweDU4QkQsLyogMHhBMC0weEE3ICovCisJMHg1OEJFLDB4NThCRiwweDU4QzAsMHg1OEMyLDB4NThDMywweDU4QzQsMHg1OEM2LDB4NThDNywvKiAweEE4LTB4QUYgKi8KKwkweDU4QzgsMHg1OEM5LDB4NThDQSwweDU4Q0IsMHg1OENDLDB4NThDRCwweDU4Q0UsMHg1OENGLC8qIDB4QjAtMHhCNyAqLworCTB4NThEMCwweDU4RDIsMHg1OEQzLDB4NThENCwweDU4RDYsMHg1OEQ3LDB4NThEOCwweDU4RDksLyogMHhCOC0weEJGICovCisJMHg1OERBLDB4NThEQiwweDU4REMsMHg1OERELDB4NThERSwweDU4REYsMHg1OEUwLDB4NThFMSwvKiAweEMwLTB4QzcgKi8KKwkweDU4RTIsMHg1OEUzLDB4NThFNSwweDU4RTYsMHg1OEU3LDB4NThFOCwweDU4RTksMHg1OEVBLC8qIDB4QzgtMHhDRiAqLworCTB4NThFRCwweDU4RUYsMHg1OEYxLDB4NThGMiwweDU4RjQsMHg1OEY1LDB4NThGNywweDU4RjgsLyogMHhEMC0weEQ3ICovCisJMHg1OEZBLDB4NThGQiwweDU4RkMsMHg1OEZELDB4NThGRSwweDU4RkYsMHg1OTAwLDB4NTkwMSwvKiAweEQ4LTB4REYgKi8KKwkweDU5MDMsMHg1OTA1LDB4NTkwNiwweDU5MDgsMHg1OTA5LDB4NTkwQSwweDU5MEIsMHg1OTBDLC8qIDB4RTAtMHhFNyAqLworCTB4NTkwRSwweDU5MTAsMHg1OTExLDB4NTkxMiwweDU5MTMsMHg1OTE3LDB4NTkxOCwweDU5MUIsLyogMHhFOC0weEVGICovCisJMHg1OTFELDB4NTkxRSwweDU5MjAsMHg1OTIxLDB4NTkyMiwweDU5MjMsMHg1OTI2LDB4NTkyOCwvKiAweEYwLTB4RjcgKi8KKwkweDU5MkMsMHg1OTMwLDB4NTkzMiwweDU5MzMsMHg1OTM1LDB4NTkzNiwweDU5M0IsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzhBWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NTkzRCwweDU5M0UsMHg1OTNGLDB4NTk0MCwweDU5NDMsMHg1OTQ1LDB4NTk0NiwweDU5NEEsLyogMHg0MC0weDQ3ICovCisJMHg1OTRDLDB4NTk0RCwweDU5NTAsMHg1OTUyLDB4NTk1MywweDU5NTksMHg1OTVCLDB4NTk1QywvKiAweDQ4LTB4NEYgKi8KKwkweDU5NUQsMHg1OTVFLDB4NTk1RiwweDU5NjEsMHg1OTYzLDB4NTk2NCwweDU5NjYsMHg1OTY3LC8qIDB4NTAtMHg1NyAqLworCTB4NTk2OCwweDU5NjksMHg1OTZBLDB4NTk2QiwweDU5NkMsMHg1OTZELDB4NTk2RSwweDU5NkYsLyogMHg1OC0weDVGICovCisJMHg1OTcwLDB4NTk3MSwweDU5NzIsMHg1OTc1LDB4NTk3NywweDU5N0EsMHg1OTdCLDB4NTk3QywvKiAweDYwLTB4NjcgKi8KKwkweDU5N0UsMHg1OTdGLDB4NTk4MCwweDU5ODUsMHg1OTg5LDB4NTk4QiwweDU5OEMsMHg1OThFLC8qIDB4NjgtMHg2RiAqLworCTB4NTk4RiwweDU5OTAsMHg1OTkxLDB4NTk5NCwweDU5OTUsMHg1OTk4LDB4NTk5QSwweDU5OUIsLyogMHg3MC0weDc3ICovCisJMHg1OTlDLDB4NTk5RCwweDU5OUYsMHg1OUEwLDB4NTlBMSwweDU5QTIsMHg1OUE2LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NTlBNywweDU5QUMsMHg1OUFELDB4NTlCMCwweDU5QjEsMHg1OUIzLDB4NTlCNCwweDU5QjUsLyogMHg4MC0weDg3ICovCisJMHg1OUI2LDB4NTlCNywweDU5QjgsMHg1OUJBLDB4NTlCQywweDU5QkQsMHg1OUJGLDB4NTlDMCwvKiAweDg4LTB4OEYgKi8KKwkweDU5QzEsMHg1OUMyLDB4NTlDMywweDU5QzQsMHg1OUM1LDB4NTlDNywweDU5QzgsMHg1OUM5LC8qIDB4OTAtMHg5NyAqLworCTB4NTlDQywweDU5Q0QsMHg1OUNFLDB4NTlDRiwweDU5RDUsMHg1OUQ2LDB4NTlEOSwweDU5REIsLyogMHg5OC0weDlGICovCisJMHg1OURFLDB4NTlERiwweDU5RTAsMHg1OUUxLDB4NTlFMiwweDU5RTQsMHg1OUU2LDB4NTlFNywvKiAweEEwLTB4QTcgKi8KKwkweDU5RTksMHg1OUVBLDB4NTlFQiwweDU5RUQsMHg1OUVFLDB4NTlFRiwweDU5RjAsMHg1OUYxLC8qIDB4QTgtMHhBRiAqLworCTB4NTlGMiwweDU5RjMsMHg1OUY0LDB4NTlGNSwweDU5RjYsMHg1OUY3LDB4NTlGOCwweDU5RkEsLyogMHhCMC0weEI3ICovCisJMHg1OUZDLDB4NTlGRCwweDU5RkUsMHg1QTAwLDB4NUEwMiwweDVBMEEsMHg1QTBCLDB4NUEwRCwvKiAweEI4LTB4QkYgKi8KKwkweDVBMEUsMHg1QTBGLDB4NUExMCwweDVBMTIsMHg1QTE0LDB4NUExNSwweDVBMTYsMHg1QTE3LC8qIDB4QzAtMHhDNyAqLworCTB4NUExOSwweDVBMUEsMHg1QTFCLDB4NUExRCwweDVBMUUsMHg1QTIxLDB4NUEyMiwweDVBMjQsLyogMHhDOC0weENGICovCisJMHg1QTI2LDB4NUEyNywweDVBMjgsMHg1QTJBLDB4NUEyQiwweDVBMkMsMHg1QTJELDB4NUEyRSwvKiAweEQwLTB4RDcgKi8KKwkweDVBMkYsMHg1QTMwLDB4NUEzMywweDVBMzUsMHg1QTM3LDB4NUEzOCwweDVBMzksMHg1QTNBLC8qIDB4RDgtMHhERiAqLworCTB4NUEzQiwweDVBM0QsMHg1QTNFLDB4NUEzRiwweDVBNDEsMHg1QTQyLDB4NUE0MywweDVBNDQsLyogMHhFMC0weEU3ICovCisJMHg1QTQ1LDB4NUE0NywweDVBNDgsMHg1QTRCLDB4NUE0QywweDVBNEQsMHg1QTRFLDB4NUE0RiwvKiAweEU4LTB4RUYgKi8KKwkweDVBNTAsMHg1QTUxLDB4NUE1MiwweDVBNTMsMHg1QTU0LDB4NUE1NiwweDVBNTcsMHg1QTU4LC8qIDB4RjAtMHhGNyAqLworCTB4NUE1OSwweDVBNUIsMHg1QTVDLDB4NUE1RCwweDVBNUUsMHg1QTVGLDB4NUE2MCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOEJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1QTYxLDB4NUE2MywweDVBNjQsMHg1QTY1LDB4NUE2NiwweDVBNjgsMHg1QTY5LDB4NUE2QiwvKiAweDQwLTB4NDcgKi8KKwkweDVBNkMsMHg1QTZELDB4NUE2RSwweDVBNkYsMHg1QTcwLDB4NUE3MSwweDVBNzIsMHg1QTczLC8qIDB4NDgtMHg0RiAqLworCTB4NUE3OCwweDVBNzksMHg1QTdCLDB4NUE3QywweDVBN0QsMHg1QTdFLDB4NUE4MCwweDVBODEsLyogMHg1MC0weDU3ICovCisJMHg1QTgyLDB4NUE4MywweDVBODQsMHg1QTg1LDB4NUE4NiwweDVBODcsMHg1QTg4LDB4NUE4OSwvKiAweDU4LTB4NUYgKi8KKwkweDVBOEEsMHg1QThCLDB4NUE4QywweDVBOEQsMHg1QThFLDB4NUE4RiwweDVBOTAsMHg1QTkxLC8qIDB4NjAtMHg2NyAqLworCTB4NUE5MywweDVBOTQsMHg1QTk1LDB4NUE5NiwweDVBOTcsMHg1QTk4LDB4NUE5OSwweDVBOUMsLyogMHg2OC0weDZGICovCisJMHg1QTlELDB4NUE5RSwweDVBOUYsMHg1QUEwLDB4NUFBMSwweDVBQTIsMHg1QUEzLDB4NUFBNCwvKiAweDcwLTB4NzcgKi8KKwkweDVBQTUsMHg1QUE2LDB4NUFBNywweDVBQTgsMHg1QUE5LDB4NUFBQiwweDVBQUMsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg1QUFELDB4NUFBRSwweDVBQUYsMHg1QUIwLDB4NUFCMSwweDVBQjQsMHg1QUI2LDB4NUFCNywvKiAweDgwLTB4ODcgKi8KKwkweDVBQjksMHg1QUJBLDB4NUFCQiwweDVBQkMsMHg1QUJELDB4NUFCRiwweDVBQzAsMHg1QUMzLC8qIDB4ODgtMHg4RiAqLworCTB4NUFDNCwweDVBQzUsMHg1QUM2LDB4NUFDNywweDVBQzgsMHg1QUNBLDB4NUFDQiwweDVBQ0QsLyogMHg5MC0weDk3ICovCisJMHg1QUNFLDB4NUFDRiwweDVBRDAsMHg1QUQxLDB4NUFEMywweDVBRDUsMHg1QUQ3LDB4NUFEOSwvKiAweDk4LTB4OUYgKi8KKwkweDVBREEsMHg1QURCLDB4NUFERCwweDVBREUsMHg1QURGLDB4NUFFMiwweDVBRTQsMHg1QUU1LC8qIDB4QTAtMHhBNyAqLworCTB4NUFFNywweDVBRTgsMHg1QUVBLDB4NUFFQywweDVBRUQsMHg1QUVFLDB4NUFFRiwweDVBRjAsLyogMHhBOC0weEFGICovCisJMHg1QUYyLDB4NUFGMywweDVBRjQsMHg1QUY1LDB4NUFGNiwweDVBRjcsMHg1QUY4LDB4NUFGOSwvKiAweEIwLTB4QjcgKi8KKwkweDVBRkEsMHg1QUZCLDB4NUFGQywweDVBRkQsMHg1QUZFLDB4NUFGRiwweDVCMDAsMHg1QjAxLC8qIDB4QjgtMHhCRiAqLworCTB4NUIwMiwweDVCMDMsMHg1QjA0LDB4NUIwNSwweDVCMDYsMHg1QjA3LDB4NUIwOCwweDVCMEEsLyogMHhDMC0weEM3ICovCisJMHg1QjBCLDB4NUIwQywweDVCMEQsMHg1QjBFLDB4NUIwRiwweDVCMTAsMHg1QjExLDB4NUIxMiwvKiAweEM4LTB4Q0YgKi8KKwkweDVCMTMsMHg1QjE0LDB4NUIxNSwweDVCMTgsMHg1QjE5LDB4NUIxQSwweDVCMUIsMHg1QjFDLC8qIDB4RDAtMHhENyAqLworCTB4NUIxRCwweDVCMUUsMHg1QjFGLDB4NUIyMCwweDVCMjEsMHg1QjIyLDB4NUIyMywweDVCMjQsLyogMHhEOC0weERGICovCisJMHg1QjI1LDB4NUIyNiwweDVCMjcsMHg1QjI4LDB4NUIyOSwweDVCMkEsMHg1QjJCLDB4NUIyQywvKiAweEUwLTB4RTcgKi8KKwkweDVCMkQsMHg1QjJFLDB4NUIyRiwweDVCMzAsMHg1QjMxLDB4NUIzMywweDVCMzUsMHg1QjM2LC8qIDB4RTgtMHhFRiAqLworCTB4NUIzOCwweDVCMzksMHg1QjNBLDB4NUIzQiwweDVCM0MsMHg1QjNELDB4NUIzRSwweDVCM0YsLyogMHhGMC0weEY3ICovCisJMHg1QjQxLDB4NUI0MiwweDVCNDMsMHg1QjQ0LDB4NUI0NSwweDVCNDYsMHg1QjQ3LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84Q1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDVCNDgsMHg1QjQ5LDB4NUI0QSwweDVCNEIsMHg1QjRDLDB4NUI0RCwweDVCNEUsMHg1QjRGLC8qIDB4NDAtMHg0NyAqLworCTB4NUI1MiwweDVCNTYsMHg1QjVFLDB4NUI2MCwweDVCNjEsMHg1QjY3LDB4NUI2OCwweDVCNkIsLyogMHg0OC0weDRGICovCisJMHg1QjZELDB4NUI2RSwweDVCNkYsMHg1QjcyLDB4NUI3NCwweDVCNzYsMHg1Qjc3LDB4NUI3OCwvKiAweDUwLTB4NTcgKi8KKwkweDVCNzksMHg1QjdCLDB4NUI3QywweDVCN0UsMHg1QjdGLDB4NUI4MiwweDVCODYsMHg1QjhBLC8qIDB4NTgtMHg1RiAqLworCTB4NUI4RCwweDVCOEUsMHg1QjkwLDB4NUI5MSwweDVCOTIsMHg1Qjk0LDB4NUI5NiwweDVCOUYsLyogMHg2MC0weDY3ICovCisJMHg1QkE3LDB4NUJBOCwweDVCQTksMHg1QkFDLDB4NUJBRCwweDVCQUUsMHg1QkFGLDB4NUJCMSwvKiAweDY4LTB4NkYgKi8KKwkweDVCQjIsMHg1QkI3LDB4NUJCQSwweDVCQkIsMHg1QkJDLDB4NUJDMCwweDVCQzEsMHg1QkMzLC8qIDB4NzAtMHg3NyAqLworCTB4NUJDOCwweDVCQzksMHg1QkNBLDB4NUJDQiwweDVCQ0QsMHg1QkNFLDB4NUJDRiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDVCRDEsMHg1QkQ0LDB4NUJENSwweDVCRDYsMHg1QkQ3LDB4NUJEOCwweDVCRDksMHg1QkRBLC8qIDB4ODAtMHg4NyAqLworCTB4NUJEQiwweDVCREMsMHg1QkUwLDB4NUJFMiwweDVCRTMsMHg1QkU2LDB4NUJFNywweDVCRTksLyogMHg4OC0weDhGICovCisJMHg1QkVBLDB4NUJFQiwweDVCRUMsMHg1QkVELDB4NUJFRiwweDVCRjEsMHg1QkYyLDB4NUJGMywvKiAweDkwLTB4OTcgKi8KKwkweDVCRjQsMHg1QkY1LDB4NUJGNiwweDVCRjcsMHg1QkZELDB4NUJGRSwweDVDMDAsMHg1QzAyLC8qIDB4OTgtMHg5RiAqLworCTB4NUMwMywweDVDMDUsMHg1QzA3LDB4NUMwOCwweDVDMEIsMHg1QzBDLDB4NUMwRCwweDVDMEUsLyogMHhBMC0weEE3ICovCisJMHg1QzEwLDB4NUMxMiwweDVDMTMsMHg1QzE3LDB4NUMxOSwweDVDMUIsMHg1QzFFLDB4NUMxRiwvKiAweEE4LTB4QUYgKi8KKwkweDVDMjAsMHg1QzIxLDB4NUMyMywweDVDMjYsMHg1QzI4LDB4NUMyOSwweDVDMkEsMHg1QzJCLC8qIDB4QjAtMHhCNyAqLworCTB4NUMyRCwweDVDMkUsMHg1QzJGLDB4NUMzMCwweDVDMzIsMHg1QzMzLDB4NUMzNSwweDVDMzYsLyogMHhCOC0weEJGICovCisJMHg1QzM3LDB4NUM0MywweDVDNDQsMHg1QzQ2LDB4NUM0NywweDVDNEMsMHg1QzRELDB4NUM1MiwvKiAweEMwLTB4QzcgKi8KKwkweDVDNTMsMHg1QzU0LDB4NUM1NiwweDVDNTcsMHg1QzU4LDB4NUM1QSwweDVDNUIsMHg1QzVDLC8qIDB4QzgtMHhDRiAqLworCTB4NUM1RCwweDVDNUYsMHg1QzYyLDB4NUM2NCwweDVDNjcsMHg1QzY4LDB4NUM2OSwweDVDNkEsLyogMHhEMC0weEQ3ICovCisJMHg1QzZCLDB4NUM2QywweDVDNkQsMHg1QzcwLDB4NUM3MiwweDVDNzMsMHg1Qzc0LDB4NUM3NSwvKiAweEQ4LTB4REYgKi8KKwkweDVDNzYsMHg1Qzc3LDB4NUM3OCwweDVDN0IsMHg1QzdDLDB4NUM3RCwweDVDN0UsMHg1QzgwLC8qIDB4RTAtMHhFNyAqLworCTB4NUM4MywweDVDODQsMHg1Qzg1LDB4NUM4NiwweDVDODcsMHg1Qzg5LDB4NUM4QSwweDVDOEIsLyogMHhFOC0weEVGICovCisJMHg1QzhFLDB4NUM4RiwweDVDOTIsMHg1QzkzLDB4NUM5NSwweDVDOUQsMHg1QzlFLDB4NUM5RiwvKiAweEYwLTB4RjcgKi8KKwkweDVDQTAsMHg1Q0ExLDB4NUNBNCwweDVDQTUsMHg1Q0E2LDB4NUNBNywweDVDQTgsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzhEWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NUNBQSwweDVDQUUsMHg1Q0FGLDB4NUNCMCwweDVDQjIsMHg1Q0I0LDB4NUNCNiwweDVDQjksLyogMHg0MC0weDQ3ICovCisJMHg1Q0JBLDB4NUNCQiwweDVDQkMsMHg1Q0JFLDB4NUNDMCwweDVDQzIsMHg1Q0MzLDB4NUNDNSwvKiAweDQ4LTB4NEYgKi8KKwkweDVDQzYsMHg1Q0M3LDB4NUNDOCwweDVDQzksMHg1Q0NBLDB4NUNDQywweDVDQ0QsMHg1Q0NFLC8qIDB4NTAtMHg1NyAqLworCTB4NUNDRiwweDVDRDAsMHg1Q0QxLDB4NUNEMywweDVDRDQsMHg1Q0Q1LDB4NUNENiwweDVDRDcsLyogMHg1OC0weDVGICovCisJMHg1Q0Q4LDB4NUNEQSwweDVDREIsMHg1Q0RDLDB4NUNERCwweDVDREUsMHg1Q0RGLDB4NUNFMCwvKiAweDYwLTB4NjcgKi8KKwkweDVDRTIsMHg1Q0UzLDB4NUNFNywweDVDRTksMHg1Q0VCLDB4NUNFQywweDVDRUUsMHg1Q0VGLC8qIDB4NjgtMHg2RiAqLworCTB4NUNGMSwweDVDRjIsMHg1Q0YzLDB4NUNGNCwweDVDRjUsMHg1Q0Y2LDB4NUNGNywweDVDRjgsLyogMHg3MC0weDc3ICovCisJMHg1Q0Y5LDB4NUNGQSwweDVDRkMsMHg1Q0ZELDB4NUNGRSwweDVDRkYsMHg1RDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NUQwMSwweDVEMDQsMHg1RDA1LDB4NUQwOCwweDVEMDksMHg1RDBBLDB4NUQwQiwweDVEMEMsLyogMHg4MC0weDg3ICovCisJMHg1RDBELDB4NUQwRiwweDVEMTAsMHg1RDExLDB4NUQxMiwweDVEMTMsMHg1RDE1LDB4NUQxNywvKiAweDg4LTB4OEYgKi8KKwkweDVEMTgsMHg1RDE5LDB4NUQxQSwweDVEMUMsMHg1RDFELDB4NUQxRiwweDVEMjAsMHg1RDIxLC8qIDB4OTAtMHg5NyAqLworCTB4NUQyMiwweDVEMjMsMHg1RDI1LDB4NUQyOCwweDVEMkEsMHg1RDJCLDB4NUQyQywweDVEMkYsLyogMHg5OC0weDlGICovCisJMHg1RDMwLDB4NUQzMSwweDVEMzIsMHg1RDMzLDB4NUQzNSwweDVEMzYsMHg1RDM3LDB4NUQzOCwvKiAweEEwLTB4QTcgKi8KKwkweDVEMzksMHg1RDNBLDB4NUQzQiwweDVEM0MsMHg1RDNGLDB4NUQ0MCwweDVENDEsMHg1RDQyLC8qIDB4QTgtMHhBRiAqLworCTB4NUQ0MywweDVENDQsMHg1RDQ1LDB4NUQ0NiwweDVENDgsMHg1RDQ5LDB4NUQ0RCwweDVENEUsLyogMHhCMC0weEI3ICovCisJMHg1RDRGLDB4NUQ1MCwweDVENTEsMHg1RDUyLDB4NUQ1MywweDVENTQsMHg1RDU1LDB4NUQ1NiwvKiAweEI4LTB4QkYgKi8KKwkweDVENTcsMHg1RDU5LDB4NUQ1QSwweDVENUMsMHg1RDVFLDB4NUQ1RiwweDVENjAsMHg1RDYxLC8qIDB4QzAtMHhDNyAqLworCTB4NUQ2MiwweDVENjMsMHg1RDY0LDB4NUQ2NSwweDVENjYsMHg1RDY3LDB4NUQ2OCwweDVENkEsLyogMHhDOC0weENGICovCisJMHg1RDZELDB4NUQ2RSwweDVENzAsMHg1RDcxLDB4NUQ3MiwweDVENzMsMHg1RDc1LDB4NUQ3NiwvKiAweEQwLTB4RDcgKi8KKwkweDVENzcsMHg1RDc4LDB4NUQ3OSwweDVEN0EsMHg1RDdCLDB4NUQ3QywweDVEN0QsMHg1RDdFLC8qIDB4RDgtMHhERiAqLworCTB4NUQ3RiwweDVEODAsMHg1RDgxLDB4NUQ4MywweDVEODQsMHg1RDg1LDB4NUQ4NiwweDVEODcsLyogMHhFMC0weEU3ICovCisJMHg1RDg4LDB4NUQ4OSwweDVEOEEsMHg1RDhCLDB4NUQ4QywweDVEOEQsMHg1RDhFLDB4NUQ4RiwvKiAweEU4LTB4RUYgKi8KKwkweDVEOTAsMHg1RDkxLDB4NUQ5MiwweDVEOTMsMHg1RDk0LDB4NUQ5NSwweDVEOTYsMHg1RDk3LC8qIDB4RjAtMHhGNyAqLworCTB4NUQ5OCwweDVEOUEsMHg1RDlCLDB4NUQ5QywweDVEOUUsMHg1RDlGLDB4NURBMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOEVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1REExLDB4NURBMiwweDVEQTMsMHg1REE0LDB4NURBNSwweDVEQTYsMHg1REE3LDB4NURBOCwvKiAweDQwLTB4NDcgKi8KKwkweDVEQTksMHg1REFBLDB4NURBQiwweDVEQUMsMHg1REFELDB4NURBRSwweDVEQUYsMHg1REIwLC8qIDB4NDgtMHg0RiAqLworCTB4NURCMSwweDVEQjIsMHg1REIzLDB4NURCNCwweDVEQjUsMHg1REI2LDB4NURCOCwweDVEQjksLyogMHg1MC0weDU3ICovCisJMHg1REJBLDB4NURCQiwweDVEQkMsMHg1REJELDB4NURCRSwweDVEQkYsMHg1REMwLDB4NURDMSwvKiAweDU4LTB4NUYgKi8KKwkweDVEQzIsMHg1REMzLDB4NURDNCwweDVEQzYsMHg1REM3LDB4NURDOCwweDVEQzksMHg1RENBLC8qIDB4NjAtMHg2NyAqLworCTB4NURDQiwweDVEQ0MsMHg1RENFLDB4NURDRiwweDVERDAsMHg1REQxLDB4NUREMiwweDVERDMsLyogMHg2OC0weDZGICovCisJMHg1REQ0LDB4NURENSwweDVERDYsMHg1REQ3LDB4NUREOCwweDVERDksMHg1RERBLDB4NUREQywvKiAweDcwLTB4NzcgKi8KKwkweDVEREYsMHg1REUwLDB4NURFMywweDVERTQsMHg1REVBLDB4NURFQywweDVERUQsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg1REYwLDB4NURGNSwweDVERjYsMHg1REY4LDB4NURGOSwweDVERkEsMHg1REZCLDB4NURGQywvKiAweDgwLTB4ODcgKi8KKwkweDVERkYsMHg1RTAwLDB4NUUwNCwweDVFMDcsMHg1RTA5LDB4NUUwQSwweDVFMEIsMHg1RTBELC8qIDB4ODgtMHg4RiAqLworCTB4NUUwRSwweDVFMTIsMHg1RTEzLDB4NUUxNywweDVFMUUsMHg1RTFGLDB4NUUyMCwweDVFMjEsLyogMHg5MC0weDk3ICovCisJMHg1RTIyLDB4NUUyMywweDVFMjQsMHg1RTI1LDB4NUUyOCwweDVFMjksMHg1RTJBLDB4NUUyQiwvKiAweDk4LTB4OUYgKi8KKwkweDVFMkMsMHg1RTJGLDB4NUUzMCwweDVFMzIsMHg1RTMzLDB4NUUzNCwweDVFMzUsMHg1RTM2LC8qIDB4QTAtMHhBNyAqLworCTB4NUUzOSwweDVFM0EsMHg1RTNFLDB4NUUzRiwweDVFNDAsMHg1RTQxLDB4NUU0MywweDVFNDYsLyogMHhBOC0weEFGICovCisJMHg1RTQ3LDB4NUU0OCwweDVFNDksMHg1RTRBLDB4NUU0QiwweDVFNEQsMHg1RTRFLDB4NUU0RiwvKiAweEIwLTB4QjcgKi8KKwkweDVFNTAsMHg1RTUxLDB4NUU1MiwweDVFNTMsMHg1RTU2LDB4NUU1NywweDVFNTgsMHg1RTU5LC8qIDB4QjgtMHhCRiAqLworCTB4NUU1QSwweDVFNUMsMHg1RTVELDB4NUU1RiwweDVFNjAsMHg1RTYzLDB4NUU2NCwweDVFNjUsLyogMHhDMC0weEM3ICovCisJMHg1RTY2LDB4NUU2NywweDVFNjgsMHg1RTY5LDB4NUU2QSwweDVFNkIsMHg1RTZDLDB4NUU2RCwvKiAweEM4LTB4Q0YgKi8KKwkweDVFNkUsMHg1RTZGLDB4NUU3MCwweDVFNzEsMHg1RTc1LDB4NUU3NywweDVFNzksMHg1RTdFLC8qIDB4RDAtMHhENyAqLworCTB4NUU4MSwweDVFODIsMHg1RTgzLDB4NUU4NSwweDVFODgsMHg1RTg5LDB4NUU4QywweDVFOEQsLyogMHhEOC0weERGICovCisJMHg1RThFLDB4NUU5MiwweDVFOTgsMHg1RTlCLDB4NUU5RCwweDVFQTEsMHg1RUEyLDB4NUVBMywvKiAweEUwLTB4RTcgKi8KKwkweDVFQTQsMHg1RUE4LDB4NUVBOSwweDVFQUEsMHg1RUFCLDB4NUVBQywweDVFQUUsMHg1RUFGLC8qIDB4RTgtMHhFRiAqLworCTB4NUVCMCwweDVFQjEsMHg1RUIyLDB4NUVCNCwweDVFQkEsMHg1RUJCLDB4NUVCQywweDVFQkQsLyogMHhGMC0weEY3ICovCisJMHg1RUJGLDB4NUVDMCwweDVFQzEsMHg1RUMyLDB4NUVDMywweDVFQzQsMHg1RUM1LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84RlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDVFQzYsMHg1RUM3LDB4NUVDOCwweDVFQ0IsMHg1RUNDLDB4NUVDRCwweDVFQ0UsMHg1RUNGLC8qIDB4NDAtMHg0NyAqLworCTB4NUVEMCwweDVFRDQsMHg1RUQ1LDB4NUVENywweDVFRDgsMHg1RUQ5LDB4NUVEQSwweDVFREMsLyogMHg0OC0weDRGICovCisJMHg1RURELDB4NUVERSwweDVFREYsMHg1RUUwLDB4NUVFMSwweDVFRTIsMHg1RUUzLDB4NUVFNCwvKiAweDUwLTB4NTcgKi8KKwkweDVFRTUsMHg1RUU2LDB4NUVFNywweDVFRTksMHg1RUVCLDB4NUVFQywweDVFRUQsMHg1RUVFLC8qIDB4NTgtMHg1RiAqLworCTB4NUVFRiwweDVFRjAsMHg1RUYxLDB4NUVGMiwweDVFRjMsMHg1RUY1LDB4NUVGOCwweDVFRjksLyogMHg2MC0weDY3ICovCisJMHg1RUZCLDB4NUVGQywweDVFRkQsMHg1RjA1LDB4NUYwNiwweDVGMDcsMHg1RjA5LDB4NUYwQywvKiAweDY4LTB4NkYgKi8KKwkweDVGMEQsMHg1RjBFLDB4NUYxMCwweDVGMTIsMHg1RjE0LDB4NUYxNiwweDVGMTksMHg1RjFBLC8qIDB4NzAtMHg3NyAqLworCTB4NUYxQywweDVGMUQsMHg1RjFFLDB4NUYyMSwweDVGMjIsMHg1RjIzLDB4NUYyNCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDVGMjgsMHg1RjJCLDB4NUYyQywweDVGMkUsMHg1RjMwLDB4NUYzMiwweDVGMzMsMHg1RjM0LC8qIDB4ODAtMHg4NyAqLworCTB4NUYzNSwweDVGMzYsMHg1RjM3LDB4NUYzOCwweDVGM0IsMHg1RjNELDB4NUYzRSwweDVGM0YsLyogMHg4OC0weDhGICovCisJMHg1RjQxLDB4NUY0MiwweDVGNDMsMHg1RjQ0LDB4NUY0NSwweDVGNDYsMHg1RjQ3LDB4NUY0OCwvKiAweDkwLTB4OTcgKi8KKwkweDVGNDksMHg1RjRBLDB4NUY0QiwweDVGNEMsMHg1RjRELDB4NUY0RSwweDVGNEYsMHg1RjUxLC8qIDB4OTgtMHg5RiAqLworCTB4NUY1NCwweDVGNTksMHg1RjVBLDB4NUY1QiwweDVGNUMsMHg1RjVFLDB4NUY1RiwweDVGNjAsLyogMHhBMC0weEE3ICovCisJMHg1RjYzLDB4NUY2NSwweDVGNjcsMHg1RjY4LDB4NUY2QiwweDVGNkUsMHg1RjZGLDB4NUY3MiwvKiAweEE4LTB4QUYgKi8KKwkweDVGNzQsMHg1Rjc1LDB4NUY3NiwweDVGNzgsMHg1RjdBLDB4NUY3RCwweDVGN0UsMHg1RjdGLC8qIDB4QjAtMHhCNyAqLworCTB4NUY4MywweDVGODYsMHg1RjhELDB4NUY4RSwweDVGOEYsMHg1RjkxLDB4NUY5MywweDVGOTQsLyogMHhCOC0weEJGICovCisJMHg1Rjk2LDB4NUY5QSwweDVGOUIsMHg1RjlELDB4NUY5RSwweDVGOUYsMHg1RkEwLDB4NUZBMiwvKiAweEMwLTB4QzcgKi8KKwkweDVGQTMsMHg1RkE0LDB4NUZBNSwweDVGQTYsMHg1RkE3LDB4NUZBOSwweDVGQUIsMHg1RkFDLC8qIDB4QzgtMHhDRiAqLworCTB4NUZBRiwweDVGQjAsMHg1RkIxLDB4NUZCMiwweDVGQjMsMHg1RkI0LDB4NUZCNiwweDVGQjgsLyogMHhEMC0weEQ3ICovCisJMHg1RkI5LDB4NUZCQSwweDVGQkIsMHg1RkJFLDB4NUZCRiwweDVGQzAsMHg1RkMxLDB4NUZDMiwvKiAweEQ4LTB4REYgKi8KKwkweDVGQzcsMHg1RkM4LDB4NUZDQSwweDVGQ0IsMHg1RkNFLDB4NUZEMywweDVGRDQsMHg1RkQ1LC8qIDB4RTAtMHhFNyAqLworCTB4NUZEQSwweDVGREIsMHg1RkRDLDB4NUZERSwweDVGREYsMHg1RkUyLDB4NUZFMywweDVGRTUsLyogMHhFOC0weEVGICovCisJMHg1RkU2LDB4NUZFOCwweDVGRTksMHg1RkVDLDB4NUZFRiwweDVGRjAsMHg1RkYyLDB4NUZGMywvKiAweEYwLTB4RjcgKi8KKwkweDVGRjQsMHg1RkY2LDB4NUZGNywweDVGRjksMHg1RkZBLDB4NUZGQywweDYwMDcsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzkwWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NjAwOCwweDYwMDksMHg2MDBCLDB4NjAwQywweDYwMTAsMHg2MDExLDB4NjAxMywweDYwMTcsLyogMHg0MC0weDQ3ICovCisJMHg2MDE4LDB4NjAxQSwweDYwMUUsMHg2MDFGLDB4NjAyMiwweDYwMjMsMHg2MDI0LDB4NjAyQywvKiAweDQ4LTB4NEYgKi8KKwkweDYwMkQsMHg2MDJFLDB4NjAzMCwweDYwMzEsMHg2MDMyLDB4NjAzMywweDYwMzQsMHg2MDM2LC8qIDB4NTAtMHg1NyAqLworCTB4NjAzNywweDYwMzgsMHg2MDM5LDB4NjAzQSwweDYwM0QsMHg2MDNFLDB4NjA0MCwweDYwNDQsLyogMHg1OC0weDVGICovCisJMHg2MDQ1LDB4NjA0NiwweDYwNDcsMHg2MDQ4LDB4NjA0OSwweDYwNEEsMHg2MDRDLDB4NjA0RSwvKiAweDYwLTB4NjcgKi8KKwkweDYwNEYsMHg2MDUxLDB4NjA1MywweDYwNTQsMHg2MDU2LDB4NjA1NywweDYwNTgsMHg2MDVCLC8qIDB4NjgtMHg2RiAqLworCTB4NjA1QywweDYwNUUsMHg2MDVGLDB4NjA2MCwweDYwNjEsMHg2MDY1LDB4NjA2NiwweDYwNkUsLyogMHg3MC0weDc3ICovCisJMHg2MDcxLDB4NjA3MiwweDYwNzQsMHg2MDc1LDB4NjA3NywweDYwN0UsMHg2MDgwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NjA4MSwweDYwODIsMHg2MDg1LDB4NjA4NiwweDYwODcsMHg2MDg4LDB4NjA4QSwweDYwOEIsLyogMHg4MC0weDg3ICovCisJMHg2MDhFLDB4NjA4RiwweDYwOTAsMHg2MDkxLDB4NjA5MywweDYwOTUsMHg2MDk3LDB4NjA5OCwvKiAweDg4LTB4OEYgKi8KKwkweDYwOTksMHg2MDlDLDB4NjA5RSwweDYwQTEsMHg2MEEyLDB4NjBBNCwweDYwQTUsMHg2MEE3LC8qIDB4OTAtMHg5NyAqLworCTB4NjBBOSwweDYwQUEsMHg2MEFFLDB4NjBCMCwweDYwQjMsMHg2MEI1LDB4NjBCNiwweDYwQjcsLyogMHg5OC0weDlGICovCisJMHg2MEI5LDB4NjBCQSwweDYwQkQsMHg2MEJFLDB4NjBCRiwweDYwQzAsMHg2MEMxLDB4NjBDMiwvKiAweEEwLTB4QTcgKi8KKwkweDYwQzMsMHg2MEM0LDB4NjBDNywweDYwQzgsMHg2MEM5LDB4NjBDQywweDYwQ0QsMHg2MENFLC8qIDB4QTgtMHhBRiAqLworCTB4NjBDRiwweDYwRDAsMHg2MEQyLDB4NjBEMywweDYwRDQsMHg2MEQ2LDB4NjBENywweDYwRDksLyogMHhCMC0weEI3ICovCisJMHg2MERCLDB4NjBERSwweDYwRTEsMHg2MEUyLDB4NjBFMywweDYwRTQsMHg2MEU1LDB4NjBFQSwvKiAweEI4LTB4QkYgKi8KKwkweDYwRjEsMHg2MEYyLDB4NjBGNSwweDYwRjcsMHg2MEY4LDB4NjBGQiwweDYwRkMsMHg2MEZELC8qIDB4QzAtMHhDNyAqLworCTB4NjBGRSwweDYwRkYsMHg2MTAyLDB4NjEwMywweDYxMDQsMHg2MTA1LDB4NjEwNywweDYxMEEsLyogMHhDOC0weENGICovCisJMHg2MTBCLDB4NjEwQywweDYxMTAsMHg2MTExLDB4NjExMiwweDYxMTMsMHg2MTE0LDB4NjExNiwvKiAweEQwLTB4RDcgKi8KKwkweDYxMTcsMHg2MTE4LDB4NjExOSwweDYxMUIsMHg2MTFDLDB4NjExRCwweDYxMUUsMHg2MTIxLC8qIDB4RDgtMHhERiAqLworCTB4NjEyMiwweDYxMjUsMHg2MTI4LDB4NjEyOSwweDYxMkEsMHg2MTJDLDB4NjEyRCwweDYxMkUsLyogMHhFMC0weEU3ICovCisJMHg2MTJGLDB4NjEzMCwweDYxMzEsMHg2MTMyLDB4NjEzMywweDYxMzQsMHg2MTM1LDB4NjEzNiwvKiAweEU4LTB4RUYgKi8KKwkweDYxMzcsMHg2MTM4LDB4NjEzOSwweDYxM0EsMHg2MTNCLDB4NjEzQywweDYxM0QsMHg2MTNFLC8qIDB4RjAtMHhGNyAqLworCTB4NjE0MCwweDYxNDEsMHg2MTQyLDB4NjE0MywweDYxNDQsMHg2MTQ1LDB4NjE0NiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOTFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2MTQ3LDB4NjE0OSwweDYxNEIsMHg2MTRELDB4NjE0RiwweDYxNTAsMHg2MTUyLDB4NjE1MywvKiAweDQwLTB4NDcgKi8KKwkweDYxNTQsMHg2MTU2LDB4NjE1NywweDYxNTgsMHg2MTU5LDB4NjE1QSwweDYxNUIsMHg2MTVDLC8qIDB4NDgtMHg0RiAqLworCTB4NjE1RSwweDYxNUYsMHg2MTYwLDB4NjE2MSwweDYxNjMsMHg2MTY0LDB4NjE2NSwweDYxNjYsLyogMHg1MC0weDU3ICovCisJMHg2MTY5LDB4NjE2QSwweDYxNkIsMHg2MTZDLDB4NjE2RCwweDYxNkUsMHg2MTZGLDB4NjE3MSwvKiAweDU4LTB4NUYgKi8KKwkweDYxNzIsMHg2MTczLDB4NjE3NCwweDYxNzYsMHg2MTc4LDB4NjE3OSwweDYxN0EsMHg2MTdCLC8qIDB4NjAtMHg2NyAqLworCTB4NjE3QywweDYxN0QsMHg2MTdFLDB4NjE3RiwweDYxODAsMHg2MTgxLDB4NjE4MiwweDYxODMsLyogMHg2OC0weDZGICovCisJMHg2MTg0LDB4NjE4NSwweDYxODYsMHg2MTg3LDB4NjE4OCwweDYxODksMHg2MThBLDB4NjE4QywvKiAweDcwLTB4NzcgKi8KKwkweDYxOEQsMHg2MThGLDB4NjE5MCwweDYxOTEsMHg2MTkyLDB4NjE5MywweDYxOTUsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg2MTk2LDB4NjE5NywweDYxOTgsMHg2MTk5LDB4NjE5QSwweDYxOUIsMHg2MTlDLDB4NjE5RSwvKiAweDgwLTB4ODcgKi8KKwkweDYxOUYsMHg2MUEwLDB4NjFBMSwweDYxQTIsMHg2MUEzLDB4NjFBNCwweDYxQTUsMHg2MUE2LC8qIDB4ODgtMHg4RiAqLworCTB4NjFBQSwweDYxQUIsMHg2MUFELDB4NjFBRSwweDYxQUYsMHg2MUIwLDB4NjFCMSwweDYxQjIsLyogMHg5MC0weDk3ICovCisJMHg2MUIzLDB4NjFCNCwweDYxQjUsMHg2MUI2LDB4NjFCOCwweDYxQjksMHg2MUJBLDB4NjFCQiwvKiAweDk4LTB4OUYgKi8KKwkweDYxQkMsMHg2MUJELDB4NjFCRiwweDYxQzAsMHg2MUMxLDB4NjFDMywweDYxQzQsMHg2MUM1LC8qIDB4QTAtMHhBNyAqLworCTB4NjFDNiwweDYxQzcsMHg2MUM5LDB4NjFDQywweDYxQ0QsMHg2MUNFLDB4NjFDRiwweDYxRDAsLyogMHhBOC0weEFGICovCisJMHg2MUQzLDB4NjFENSwweDYxRDYsMHg2MUQ3LDB4NjFEOCwweDYxRDksMHg2MURBLDB4NjFEQiwvKiAweEIwLTB4QjcgKi8KKwkweDYxREMsMHg2MURELDB4NjFERSwweDYxREYsMHg2MUUwLDB4NjFFMSwweDYxRTIsMHg2MUUzLC8qIDB4QjgtMHhCRiAqLworCTB4NjFFNCwweDYxRTUsMHg2MUU3LDB4NjFFOCwweDYxRTksMHg2MUVBLDB4NjFFQiwweDYxRUMsLyogMHhDMC0weEM3ICovCisJMHg2MUVELDB4NjFFRSwweDYxRUYsMHg2MUYwLDB4NjFGMSwweDYxRjIsMHg2MUYzLDB4NjFGNCwvKiAweEM4LTB4Q0YgKi8KKwkweDYxRjYsMHg2MUY3LDB4NjFGOCwweDYxRjksMHg2MUZBLDB4NjFGQiwweDYxRkMsMHg2MUZELC8qIDB4RDAtMHhENyAqLworCTB4NjFGRSwweDYyMDAsMHg2MjAxLDB4NjIwMiwweDYyMDMsMHg2MjA0LDB4NjIwNSwweDYyMDcsLyogMHhEOC0weERGICovCisJMHg2MjA5LDB4NjIxMywweDYyMTQsMHg2MjE5LDB4NjIxQywweDYyMUQsMHg2MjFFLDB4NjIyMCwvKiAweEUwLTB4RTcgKi8KKwkweDYyMjMsMHg2MjI2LDB4NjIyNywweDYyMjgsMHg2MjI5LDB4NjIyQiwweDYyMkQsMHg2MjJGLC8qIDB4RTgtMHhFRiAqLworCTB4NjIzMCwweDYyMzEsMHg2MjMyLDB4NjIzNSwweDYyMzYsMHg2MjM4LDB4NjIzOSwweDYyM0EsLyogMHhGMC0weEY3ICovCisJMHg2MjNCLDB4NjIzQywweDYyNDIsMHg2MjQ0LDB4NjI0NSwweDYyNDYsMHg2MjRBLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85MlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDYyNEYsMHg2MjUwLDB4NjI1NSwweDYyNTYsMHg2MjU3LDB4NjI1OSwweDYyNUEsMHg2MjVDLC8qIDB4NDAtMHg0NyAqLworCTB4NjI1RCwweDYyNUUsMHg2MjVGLDB4NjI2MCwweDYyNjEsMHg2MjYyLDB4NjI2NCwweDYyNjUsLyogMHg0OC0weDRGICovCisJMHg2MjY4LDB4NjI3MSwweDYyNzIsMHg2Mjc0LDB4NjI3NSwweDYyNzcsMHg2Mjc4LDB4NjI3QSwvKiAweDUwLTB4NTcgKi8KKwkweDYyN0IsMHg2MjdELDB4NjI4MSwweDYyODIsMHg2MjgzLDB4NjI4NSwweDYyODYsMHg2Mjg3LC8qIDB4NTgtMHg1RiAqLworCTB4NjI4OCwweDYyOEIsMHg2MjhDLDB4NjI4RCwweDYyOEUsMHg2MjhGLDB4NjI5MCwweDYyOTQsLyogMHg2MC0weDY3ICovCisJMHg2Mjk5LDB4NjI5QywweDYyOUQsMHg2MjlFLDB4NjJBMywweDYyQTYsMHg2MkE3LDB4NjJBOSwvKiAweDY4LTB4NkYgKi8KKwkweDYyQUEsMHg2MkFELDB4NjJBRSwweDYyQUYsMHg2MkIwLDB4NjJCMiwweDYyQjMsMHg2MkI0LC8qIDB4NzAtMHg3NyAqLworCTB4NjJCNiwweDYyQjcsMHg2MkI4LDB4NjJCQSwweDYyQkUsMHg2MkMwLDB4NjJDMSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDYyQzMsMHg2MkNCLDB4NjJDRiwweDYyRDEsMHg2MkQ1LDB4NjJERCwweDYyREUsMHg2MkUwLC8qIDB4ODAtMHg4NyAqLworCTB4NjJFMSwweDYyRTQsMHg2MkVBLDB4NjJFQiwweDYyRjAsMHg2MkYyLDB4NjJGNSwweDYyRjgsLyogMHg4OC0weDhGICovCisJMHg2MkY5LDB4NjJGQSwweDYyRkIsMHg2MzAwLDB4NjMwMywweDYzMDQsMHg2MzA1LDB4NjMwNiwvKiAweDkwLTB4OTcgKi8KKwkweDYzMEEsMHg2MzBCLDB4NjMwQywweDYzMEQsMHg2MzBGLDB4NjMxMCwweDYzMTIsMHg2MzEzLC8qIDB4OTgtMHg5RiAqLworCTB4NjMxNCwweDYzMTUsMHg2MzE3LDB4NjMxOCwweDYzMTksMHg2MzFDLDB4NjMyNiwweDYzMjcsLyogMHhBMC0weEE3ICovCisJMHg2MzI5LDB4NjMyQywweDYzMkQsMHg2MzJFLDB4NjMzMCwweDYzMzEsMHg2MzMzLDB4NjMzNCwvKiAweEE4LTB4QUYgKi8KKwkweDYzMzUsMHg2MzM2LDB4NjMzNywweDYzMzgsMHg2MzNCLDB4NjMzQywweDYzM0UsMHg2MzNGLC8qIDB4QjAtMHhCNyAqLworCTB4NjM0MCwweDYzNDEsMHg2MzQ0LDB4NjM0NywweDYzNDgsMHg2MzRBLDB4NjM1MSwweDYzNTIsLyogMHhCOC0weEJGICovCisJMHg2MzUzLDB4NjM1NCwweDYzNTYsMHg2MzU3LDB4NjM1OCwweDYzNTksMHg2MzVBLDB4NjM1QiwvKiAweEMwLTB4QzcgKi8KKwkweDYzNUMsMHg2MzVELDB4NjM2MCwweDYzNjQsMHg2MzY1LDB4NjM2NiwweDYzNjgsMHg2MzZBLC8qIDB4QzgtMHhDRiAqLworCTB4NjM2QiwweDYzNkMsMHg2MzZGLDB4NjM3MCwweDYzNzIsMHg2MzczLDB4NjM3NCwweDYzNzUsLyogMHhEMC0weEQ3ICovCisJMHg2Mzc4LDB4NjM3OSwweDYzN0MsMHg2MzdELDB4NjM3RSwweDYzN0YsMHg2MzgxLDB4NjM4MywvKiAweEQ4LTB4REYgKi8KKwkweDYzODQsMHg2Mzg1LDB4NjM4NiwweDYzOEIsMHg2MzhELDB4NjM5MSwweDYzOTMsMHg2Mzk0LC8qIDB4RTAtMHhFNyAqLworCTB4NjM5NSwweDYzOTcsMHg2Mzk5LDB4NjM5QSwweDYzOUIsMHg2MzlDLDB4NjM5RCwweDYzOUUsLyogMHhFOC0weEVGICovCisJMHg2MzlGLDB4NjNBMSwweDYzQTQsMHg2M0E2LDB4NjNBQiwweDYzQUYsMHg2M0IxLDB4NjNCMiwvKiAweEYwLTB4RjcgKi8KKwkweDYzQjUsMHg2M0I2LDB4NjNCOSwweDYzQkIsMHg2M0JELDB4NjNCRiwweDYzQzAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzkzWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NjNDMSwweDYzQzIsMHg2M0MzLDB4NjNDNSwweDYzQzcsMHg2M0M4LDB4NjNDQSwweDYzQ0IsLyogMHg0MC0weDQ3ICovCisJMHg2M0NDLDB4NjNEMSwweDYzRDMsMHg2M0Q0LDB4NjNENSwweDYzRDcsMHg2M0Q4LDB4NjNEOSwvKiAweDQ4LTB4NEYgKi8KKwkweDYzREEsMHg2M0RCLDB4NjNEQywweDYzREQsMHg2M0RGLDB4NjNFMiwweDYzRTQsMHg2M0U1LC8qIDB4NTAtMHg1NyAqLworCTB4NjNFNiwweDYzRTcsMHg2M0U4LDB4NjNFQiwweDYzRUMsMHg2M0VFLDB4NjNFRiwweDYzRjAsLyogMHg1OC0weDVGICovCisJMHg2M0YxLDB4NjNGMywweDYzRjUsMHg2M0Y3LDB4NjNGOSwweDYzRkEsMHg2M0ZCLDB4NjNGQywvKiAweDYwLTB4NjcgKi8KKwkweDYzRkUsMHg2NDAzLDB4NjQwNCwweDY0MDYsMHg2NDA3LDB4NjQwOCwweDY0MDksMHg2NDBBLC8qIDB4NjgtMHg2RiAqLworCTB4NjQwRCwweDY0MEUsMHg2NDExLDB4NjQxMiwweDY0MTUsMHg2NDE2LDB4NjQxNywweDY0MTgsLyogMHg3MC0weDc3ICovCisJMHg2NDE5LDB4NjQxQSwweDY0MUQsMHg2NDFGLDB4NjQyMiwweDY0MjMsMHg2NDI0LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NjQyNSwweDY0MjcsMHg2NDI4LDB4NjQyOSwweDY0MkIsMHg2NDJFLDB4NjQyRiwweDY0MzAsLyogMHg4MC0weDg3ICovCisJMHg2NDMxLDB4NjQzMiwweDY0MzMsMHg2NDM1LDB4NjQzNiwweDY0MzcsMHg2NDM4LDB4NjQzOSwvKiAweDg4LTB4OEYgKi8KKwkweDY0M0IsMHg2NDNDLDB4NjQzRSwweDY0NDAsMHg2NDQyLDB4NjQ0MywweDY0NDksMHg2NDRCLC8qIDB4OTAtMHg5NyAqLworCTB4NjQ0QywweDY0NEQsMHg2NDRFLDB4NjQ0RiwweDY0NTAsMHg2NDUxLDB4NjQ1MywweDY0NTUsLyogMHg5OC0weDlGICovCisJMHg2NDU2LDB4NjQ1NywweDY0NTksMHg2NDVBLDB4NjQ1QiwweDY0NUMsMHg2NDVELDB4NjQ1RiwvKiAweEEwLTB4QTcgKi8KKwkweDY0NjAsMHg2NDYxLDB4NjQ2MiwweDY0NjMsMHg2NDY0LDB4NjQ2NSwweDY0NjYsMHg2NDY4LC8qIDB4QTgtMHhBRiAqLworCTB4NjQ2QSwweDY0NkIsMHg2NDZDLDB4NjQ2RSwweDY0NkYsMHg2NDcwLDB4NjQ3MSwweDY0NzIsLyogMHhCMC0weEI3ICovCisJMHg2NDczLDB4NjQ3NCwweDY0NzUsMHg2NDc2LDB4NjQ3NywweDY0N0IsMHg2NDdDLDB4NjQ3RCwvKiAweEI4LTB4QkYgKi8KKwkweDY0N0UsMHg2NDdGLDB4NjQ4MCwweDY0ODEsMHg2NDgzLDB4NjQ4NiwweDY0ODgsMHg2NDg5LC8qIDB4QzAtMHhDNyAqLworCTB4NjQ4QSwweDY0OEIsMHg2NDhDLDB4NjQ4RCwweDY0OEUsMHg2NDhGLDB4NjQ5MCwweDY0OTMsLyogMHhDOC0weENGICovCisJMHg2NDk0LDB4NjQ5NywweDY0OTgsMHg2NDlBLDB4NjQ5QiwweDY0OUMsMHg2NDlELDB4NjQ5RiwvKiAweEQwLTB4RDcgKi8KKwkweDY0QTAsMHg2NEExLDB4NjRBMiwweDY0QTMsMHg2NEE1LDB4NjRBNiwweDY0QTcsMHg2NEE4LC8qIDB4RDgtMHhERiAqLworCTB4NjRBQSwweDY0QUIsMHg2NEFGLDB4NjRCMSwweDY0QjIsMHg2NEIzLDB4NjRCNCwweDY0QjYsLyogMHhFMC0weEU3ICovCisJMHg2NEI5LDB4NjRCQiwweDY0QkQsMHg2NEJFLDB4NjRCRiwweDY0QzEsMHg2NEMzLDB4NjRDNCwvKiAweEU4LTB4RUYgKi8KKwkweDY0QzYsMHg2NEM3LDB4NjRDOCwweDY0QzksMHg2NENBLDB4NjRDQiwweDY0Q0MsMHg2NENGLC8qIDB4RjAtMHhGNyAqLworCTB4NjREMSwweDY0RDMsMHg2NEQ0LDB4NjRENSwweDY0RDYsMHg2NEQ5LDB4NjREQSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOTRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2NERCLDB4NjREQywweDY0REQsMHg2NERGLDB4NjRFMCwweDY0RTEsMHg2NEUzLDB4NjRFNSwvKiAweDQwLTB4NDcgKi8KKwkweDY0RTcsMHg2NEU4LDB4NjRFOSwweDY0RUEsMHg2NEVCLDB4NjRFQywweDY0RUQsMHg2NEVFLC8qIDB4NDgtMHg0RiAqLworCTB4NjRFRiwweDY0RjAsMHg2NEYxLDB4NjRGMiwweDY0RjMsMHg2NEY0LDB4NjRGNSwweDY0RjYsLyogMHg1MC0weDU3ICovCisJMHg2NEY3LDB4NjRGOCwweDY0RjksMHg2NEZBLDB4NjRGQiwweDY0RkMsMHg2NEZELDB4NjRGRSwvKiAweDU4LTB4NUYgKi8KKwkweDY0RkYsMHg2NTAxLDB4NjUwMiwweDY1MDMsMHg2NTA0LDB4NjUwNSwweDY1MDYsMHg2NTA3LC8qIDB4NjAtMHg2NyAqLworCTB4NjUwOCwweDY1MEEsMHg2NTBCLDB4NjUwQywweDY1MEQsMHg2NTBFLDB4NjUwRiwweDY1MTAsLyogMHg2OC0weDZGICovCisJMHg2NTExLDB4NjUxMywweDY1MTQsMHg2NTE1LDB4NjUxNiwweDY1MTcsMHg2NTE5LDB4NjUxQSwvKiAweDcwLTB4NzcgKi8KKwkweDY1MUIsMHg2NTFDLDB4NjUxRCwweDY1MUUsMHg2NTFGLDB4NjUyMCwweDY1MjEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg2NTIyLDB4NjUyMywweDY1MjQsMHg2NTI2LDB4NjUyNywweDY1MjgsMHg2NTI5LDB4NjUyQSwvKiAweDgwLTB4ODcgKi8KKwkweDY1MkMsMHg2NTJELDB4NjUzMCwweDY1MzEsMHg2NTMyLDB4NjUzMywweDY1MzcsMHg2NTNBLC8qIDB4ODgtMHg4RiAqLworCTB4NjUzQywweDY1M0QsMHg2NTQwLDB4NjU0MSwweDY1NDIsMHg2NTQzLDB4NjU0NCwweDY1NDYsLyogMHg5MC0weDk3ICovCisJMHg2NTQ3LDB4NjU0QSwweDY1NEIsMHg2NTRELDB4NjU0RSwweDY1NTAsMHg2NTUyLDB4NjU1MywvKiAweDk4LTB4OUYgKi8KKwkweDY1NTQsMHg2NTU3LDB4NjU1OCwweDY1NUEsMHg2NTVDLDB4NjU1RiwweDY1NjAsMHg2NTYxLC8qIDB4QTAtMHhBNyAqLworCTB4NjU2NCwweDY1NjUsMHg2NTY3LDB4NjU2OCwweDY1NjksMHg2NTZBLDB4NjU2RCwweDY1NkUsLyogMHhBOC0weEFGICovCisJMHg2NTZGLDB4NjU3MSwweDY1NzMsMHg2NTc1LDB4NjU3NiwweDY1NzgsMHg2NTc5LDB4NjU3QSwvKiAweEIwLTB4QjcgKi8KKwkweDY1N0IsMHg2NTdDLDB4NjU3RCwweDY1N0UsMHg2NTdGLDB4NjU4MCwweDY1ODEsMHg2NTgyLC8qIDB4QjgtMHhCRiAqLworCTB4NjU4MywweDY1ODQsMHg2NTg1LDB4NjU4NiwweDY1ODgsMHg2NTg5LDB4NjU4QSwweDY1OEQsLyogMHhDMC0weEM3ICovCisJMHg2NThFLDB4NjU4RiwweDY1OTIsMHg2NTk0LDB4NjU5NSwweDY1OTYsMHg2NTk4LDB4NjU5QSwvKiAweEM4LTB4Q0YgKi8KKwkweDY1OUQsMHg2NTlFLDB4NjVBMCwweDY1QTIsMHg2NUEzLDB4NjVBNiwweDY1QTgsMHg2NUFBLC8qIDB4RDAtMHhENyAqLworCTB4NjVBQywweDY1QUUsMHg2NUIxLDB4NjVCMiwweDY1QjMsMHg2NUI0LDB4NjVCNSwweDY1QjYsLyogMHhEOC0weERGICovCisJMHg2NUI3LDB4NjVCOCwweDY1QkEsMHg2NUJCLDB4NjVCRSwweDY1QkYsMHg2NUMwLDB4NjVDMiwvKiAweEUwLTB4RTcgKi8KKwkweDY1QzcsMHg2NUM4LDB4NjVDOSwweDY1Q0EsMHg2NUNELDB4NjVEMCwweDY1RDEsMHg2NUQzLC8qIDB4RTgtMHhFRiAqLworCTB4NjVENCwweDY1RDUsMHg2NUQ4LDB4NjVEOSwweDY1REEsMHg2NURCLDB4NjVEQywweDY1REQsLyogMHhGMC0weEY3ICovCisJMHg2NURFLDB4NjVERiwweDY1RTEsMHg2NUUzLDB4NjVFNCwweDY1RUEsMHg2NUVCLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85NVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDY1RjIsMHg2NUYzLDB4NjVGNCwweDY1RjUsMHg2NUY4LDB4NjVGOSwweDY1RkIsMHg2NUZDLC8qIDB4NDAtMHg0NyAqLworCTB4NjVGRCwweDY1RkUsMHg2NUZGLDB4NjYwMSwweDY2MDQsMHg2NjA1LDB4NjYwNywweDY2MDgsLyogMHg0OC0weDRGICovCisJMHg2NjA5LDB4NjYwQiwweDY2MEQsMHg2NjEwLDB4NjYxMSwweDY2MTIsMHg2NjE2LDB4NjYxNywvKiAweDUwLTB4NTcgKi8KKwkweDY2MTgsMHg2NjFBLDB4NjYxQiwweDY2MUMsMHg2NjFFLDB4NjYyMSwweDY2MjIsMHg2NjIzLC8qIDB4NTgtMHg1RiAqLworCTB4NjYyNCwweDY2MjYsMHg2NjI5LDB4NjYyQSwweDY2MkIsMHg2NjJDLDB4NjYyRSwweDY2MzAsLyogMHg2MC0weDY3ICovCisJMHg2NjMyLDB4NjYzMywweDY2MzcsMHg2NjM4LDB4NjYzOSwweDY2M0EsMHg2NjNCLDB4NjYzRCwvKiAweDY4LTB4NkYgKi8KKwkweDY2M0YsMHg2NjQwLDB4NjY0MiwweDY2NDQsMHg2NjQ1LDB4NjY0NiwweDY2NDcsMHg2NjQ4LC8qIDB4NzAtMHg3NyAqLworCTB4NjY0OSwweDY2NEEsMHg2NjRELDB4NjY0RSwweDY2NTAsMHg2NjUxLDB4NjY1OCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDY2NTksMHg2NjVCLDB4NjY1QywweDY2NUQsMHg2NjVFLDB4NjY2MCwweDY2NjIsMHg2NjYzLC8qIDB4ODAtMHg4NyAqLworCTB4NjY2NSwweDY2NjcsMHg2NjY5LDB4NjY2QSwweDY2NkIsMHg2NjZDLDB4NjY2RCwweDY2NzEsLyogMHg4OC0weDhGICovCisJMHg2NjcyLDB4NjY3MywweDY2NzUsMHg2Njc4LDB4NjY3OSwweDY2N0IsMHg2NjdDLDB4NjY3RCwvKiAweDkwLTB4OTcgKi8KKwkweDY2N0YsMHg2NjgwLDB4NjY4MSwweDY2ODMsMHg2Njg1LDB4NjY4NiwweDY2ODgsMHg2Njg5LC8qIDB4OTgtMHg5RiAqLworCTB4NjY4QSwweDY2OEIsMHg2NjhELDB4NjY4RSwweDY2OEYsMHg2NjkwLDB4NjY5MiwweDY2OTMsLyogMHhBMC0weEE3ICovCisJMHg2Njk0LDB4NjY5NSwweDY2OTgsMHg2Njk5LDB4NjY5QSwweDY2OUIsMHg2NjlDLDB4NjY5RSwvKiAweEE4LTB4QUYgKi8KKwkweDY2OUYsMHg2NkEwLDB4NjZBMSwweDY2QTIsMHg2NkEzLDB4NjZBNCwweDY2QTUsMHg2NkE2LC8qIDB4QjAtMHhCNyAqLworCTB4NjZBOSwweDY2QUEsMHg2NkFCLDB4NjZBQywweDY2QUQsMHg2NkFGLDB4NjZCMCwweDY2QjEsLyogMHhCOC0weEJGICovCisJMHg2NkIyLDB4NjZCMywweDY2QjUsMHg2NkI2LDB4NjZCNywweDY2QjgsMHg2NkJBLDB4NjZCQiwvKiAweEMwLTB4QzcgKi8KKwkweDY2QkMsMHg2NkJELDB4NjZCRiwweDY2QzAsMHg2NkMxLDB4NjZDMiwweDY2QzMsMHg2NkM0LC8qIDB4QzgtMHhDRiAqLworCTB4NjZDNSwweDY2QzYsMHg2NkM3LDB4NjZDOCwweDY2QzksMHg2NkNBLDB4NjZDQiwweDY2Q0MsLyogMHhEMC0weEQ3ICovCisJMHg2NkNELDB4NjZDRSwweDY2Q0YsMHg2NkQwLDB4NjZEMSwweDY2RDIsMHg2NkQzLDB4NjZENCwvKiAweEQ4LTB4REYgKi8KKwkweDY2RDUsMHg2NkQ2LDB4NjZENywweDY2RDgsMHg2NkRBLDB4NjZERSwweDY2REYsMHg2NkUwLC8qIDB4RTAtMHhFNyAqLworCTB4NjZFMSwweDY2RTIsMHg2NkUzLDB4NjZFNCwweDY2RTUsMHg2NkU3LDB4NjZFOCwweDY2RUEsLyogMHhFOC0weEVGICovCisJMHg2NkVCLDB4NjZFQywweDY2RUQsMHg2NkVFLDB4NjZFRiwweDY2RjEsMHg2NkY1LDB4NjZGNiwvKiAweEYwLTB4RjcgKi8KKwkweDY2RjgsMHg2NkZBLDB4NjZGQiwweDY2RkQsMHg2NzAxLDB4NjcwMiwweDY3MDMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzk2WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NjcwNCwweDY3MDUsMHg2NzA2LDB4NjcwNywweDY3MEMsMHg2NzBFLDB4NjcwRiwweDY3MTEsLyogMHg0MC0weDQ3ICovCisJMHg2NzEyLDB4NjcxMywweDY3MTYsMHg2NzE4LDB4NjcxOSwweDY3MUEsMHg2NzFDLDB4NjcxRSwvKiAweDQ4LTB4NEYgKi8KKwkweDY3MjAsMHg2NzIxLDB4NjcyMiwweDY3MjMsMHg2NzI0LDB4NjcyNSwweDY3MjcsMHg2NzI5LC8qIDB4NTAtMHg1NyAqLworCTB4NjcyRSwweDY3MzAsMHg2NzMyLDB4NjczMywweDY3MzYsMHg2NzM3LDB4NjczOCwweDY3MzksLyogMHg1OC0weDVGICovCisJMHg2NzNCLDB4NjczQywweDY3M0UsMHg2NzNGLDB4Njc0MSwweDY3NDQsMHg2NzQ1LDB4Njc0NywvKiAweDYwLTB4NjcgKi8KKwkweDY3NEEsMHg2NzRCLDB4Njc0RCwweDY3NTIsMHg2NzU0LDB4Njc1NSwweDY3NTcsMHg2NzU4LC8qIDB4NjgtMHg2RiAqLworCTB4Njc1OSwweDY3NUEsMHg2NzVCLDB4Njc1RCwweDY3NjIsMHg2NzYzLDB4Njc2NCwweDY3NjYsLyogMHg3MC0weDc3ICovCisJMHg2NzY3LDB4Njc2QiwweDY3NkMsMHg2NzZFLDB4Njc3MSwweDY3NzQsMHg2Nzc2LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4Njc3OCwweDY3NzksMHg2NzdBLDB4Njc3QiwweDY3N0QsMHg2NzgwLDB4Njc4MiwweDY3ODMsLyogMHg4MC0weDg3ICovCisJMHg2Nzg1LDB4Njc4NiwweDY3ODgsMHg2NzhBLDB4Njc4QywweDY3OEQsMHg2NzhFLDB4Njc4RiwvKiAweDg4LTB4OEYgKi8KKwkweDY3OTEsMHg2NzkyLDB4Njc5MywweDY3OTQsMHg2Nzk2LDB4Njc5OSwweDY3OUIsMHg2NzlGLC8qIDB4OTAtMHg5NyAqLworCTB4NjdBMCwweDY3QTEsMHg2N0E0LDB4NjdBNiwweDY3QTksMHg2N0FDLDB4NjdBRSwweDY3QjEsLyogMHg5OC0weDlGICovCisJMHg2N0IyLDB4NjdCNCwweDY3QjksMHg2N0JBLDB4NjdCQiwweDY3QkMsMHg2N0JELDB4NjdCRSwvKiAweEEwLTB4QTcgKi8KKwkweDY3QkYsMHg2N0MwLDB4NjdDMiwweDY3QzUsMHg2N0M2LDB4NjdDNywweDY3QzgsMHg2N0M5LC8qIDB4QTgtMHhBRiAqLworCTB4NjdDQSwweDY3Q0IsMHg2N0NDLDB4NjdDRCwweDY3Q0UsMHg2N0Q1LDB4NjdENiwweDY3RDcsLyogMHhCMC0weEI3ICovCisJMHg2N0RCLDB4NjdERiwweDY3RTEsMHg2N0UzLDB4NjdFNCwweDY3RTYsMHg2N0U3LDB4NjdFOCwvKiAweEI4LTB4QkYgKi8KKwkweDY3RUEsMHg2N0VCLDB4NjdFRCwweDY3RUUsMHg2N0YyLDB4NjdGNSwweDY3RjYsMHg2N0Y3LC8qIDB4QzAtMHhDNyAqLworCTB4NjdGOCwweDY3RjksMHg2N0ZBLDB4NjdGQiwweDY3RkMsMHg2N0ZFLDB4NjgwMSwweDY4MDIsLyogMHhDOC0weENGICovCisJMHg2ODAzLDB4NjgwNCwweDY4MDYsMHg2ODBELDB4NjgxMCwweDY4MTIsMHg2ODE0LDB4NjgxNSwvKiAweEQwLTB4RDcgKi8KKwkweDY4MTgsMHg2ODE5LDB4NjgxQSwweDY4MUIsMHg2ODFDLDB4NjgxRSwweDY4MUYsMHg2ODIwLC8qIDB4RDgtMHhERiAqLworCTB4NjgyMiwweDY4MjMsMHg2ODI0LDB4NjgyNSwweDY4MjYsMHg2ODI3LDB4NjgyOCwweDY4MkIsLyogMHhFMC0weEU3ICovCisJMHg2ODJDLDB4NjgyRCwweDY4MkUsMHg2ODJGLDB4NjgzMCwweDY4MzEsMHg2ODM0LDB4NjgzNSwvKiAweEU4LTB4RUYgKi8KKwkweDY4MzYsMHg2ODNBLDB4NjgzQiwweDY4M0YsMHg2ODQ3LDB4Njg0QiwweDY4NEQsMHg2ODRGLC8qIDB4RjAtMHhGNyAqLworCTB4Njg1MiwweDY4NTYsMHg2ODU3LDB4Njg1OCwweDY4NTksMHg2ODVBLDB4Njg1QiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOTdbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2ODVDLDB4Njg1RCwweDY4NUUsMHg2ODVGLDB4Njg2QSwweDY4NkMsMHg2ODZELDB4Njg2RSwvKiAweDQwLTB4NDcgKi8KKwkweDY4NkYsMHg2ODcwLDB4Njg3MSwweDY4NzIsMHg2ODczLDB4Njg3NSwweDY4NzgsMHg2ODc5LC8qIDB4NDgtMHg0RiAqLworCTB4Njg3QSwweDY4N0IsMHg2ODdDLDB4Njg3RCwweDY4N0UsMHg2ODdGLDB4Njg4MCwweDY4ODIsLyogMHg1MC0weDU3ICovCisJMHg2ODg0LDB4Njg4NywweDY4ODgsMHg2ODg5LDB4Njg4QSwweDY4OEIsMHg2ODhDLDB4Njg4RCwvKiAweDU4LTB4NUYgKi8KKwkweDY4OEUsMHg2ODkwLDB4Njg5MSwweDY4OTIsMHg2ODk0LDB4Njg5NSwweDY4OTYsMHg2ODk4LC8qIDB4NjAtMHg2NyAqLworCTB4Njg5OSwweDY4OUEsMHg2ODlCLDB4Njg5QywweDY4OUQsMHg2ODlFLDB4Njg5RiwweDY4QTAsLyogMHg2OC0weDZGICovCisJMHg2OEExLDB4NjhBMywweDY4QTQsMHg2OEE1LDB4NjhBOSwweDY4QUEsMHg2OEFCLDB4NjhBQywvKiAweDcwLTB4NzcgKi8KKwkweDY4QUUsMHg2OEIxLDB4NjhCMiwweDY4QjQsMHg2OEI2LDB4NjhCNywweDY4QjgsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg2OEI5LDB4NjhCQSwweDY4QkIsMHg2OEJDLDB4NjhCRCwweDY4QkUsMHg2OEJGLDB4NjhDMSwvKiAweDgwLTB4ODcgKi8KKwkweDY4QzMsMHg2OEM0LDB4NjhDNSwweDY4QzYsMHg2OEM3LDB4NjhDOCwweDY4Q0EsMHg2OENDLC8qIDB4ODgtMHg4RiAqLworCTB4NjhDRSwweDY4Q0YsMHg2OEQwLDB4NjhEMSwweDY4RDMsMHg2OEQ0LDB4NjhENiwweDY4RDcsLyogMHg5MC0weDk3ICovCisJMHg2OEQ5LDB4NjhEQiwweDY4REMsMHg2OERELDB4NjhERSwweDY4REYsMHg2OEUxLDB4NjhFMiwvKiAweDk4LTB4OUYgKi8KKwkweDY4RTQsMHg2OEU1LDB4NjhFNiwweDY4RTcsMHg2OEU4LDB4NjhFOSwweDY4RUEsMHg2OEVCLC8qIDB4QTAtMHhBNyAqLworCTB4NjhFQywweDY4RUQsMHg2OEVGLDB4NjhGMiwweDY4RjMsMHg2OEY0LDB4NjhGNiwweDY4RjcsLyogMHhBOC0weEFGICovCisJMHg2OEY4LDB4NjhGQiwweDY4RkQsMHg2OEZFLDB4NjhGRiwweDY5MDAsMHg2OTAyLDB4NjkwMywvKiAweEIwLTB4QjcgKi8KKwkweDY5MDQsMHg2OTA2LDB4NjkwNywweDY5MDgsMHg2OTA5LDB4NjkwQSwweDY5MEMsMHg2OTBGLC8qIDB4QjgtMHhCRiAqLworCTB4NjkxMSwweDY5MTMsMHg2OTE0LDB4NjkxNSwweDY5MTYsMHg2OTE3LDB4NjkxOCwweDY5MTksLyogMHhDMC0weEM3ICovCisJMHg2OTFBLDB4NjkxQiwweDY5MUMsMHg2OTFELDB4NjkxRSwweDY5MjEsMHg2OTIyLDB4NjkyMywvKiAweEM4LTB4Q0YgKi8KKwkweDY5MjUsMHg2OTI2LDB4NjkyNywweDY5MjgsMHg2OTI5LDB4NjkyQSwweDY5MkIsMHg2OTJDLC8qIDB4RDAtMHhENyAqLworCTB4NjkyRSwweDY5MkYsMHg2OTMxLDB4NjkzMiwweDY5MzMsMHg2OTM1LDB4NjkzNiwweDY5MzcsLyogMHhEOC0weERGICovCisJMHg2OTM4LDB4NjkzQSwweDY5M0IsMHg2OTNDLDB4NjkzRSwweDY5NDAsMHg2OTQxLDB4Njk0MywvKiAweEUwLTB4RTcgKi8KKwkweDY5NDQsMHg2OTQ1LDB4Njk0NiwweDY5NDcsMHg2OTQ4LDB4Njk0OSwweDY5NEEsMHg2OTRCLC8qIDB4RTgtMHhFRiAqLworCTB4Njk0QywweDY5NEQsMHg2OTRFLDB4Njk0RiwweDY5NTAsMHg2OTUxLDB4Njk1MiwweDY5NTMsLyogMHhGMC0weEY3ICovCisJMHg2OTU1LDB4Njk1NiwweDY5NTgsMHg2OTU5LDB4Njk1QiwweDY5NUMsMHg2OTVGLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85OFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDY5NjEsMHg2OTYyLDB4Njk2NCwweDY5NjUsMHg2OTY3LDB4Njk2OCwweDY5NjksMHg2OTZBLC8qIDB4NDAtMHg0NyAqLworCTB4Njk2QywweDY5NkQsMHg2OTZGLDB4Njk3MCwweDY5NzIsMHg2OTczLDB4Njk3NCwweDY5NzUsLyogMHg0OC0weDRGICovCisJMHg2OTc2LDB4Njk3QSwweDY5N0IsMHg2OTdELDB4Njk3RSwweDY5N0YsMHg2OTgxLDB4Njk4MywvKiAweDUwLTB4NTcgKi8KKwkweDY5ODUsMHg2OThBLDB4Njk4QiwweDY5OEMsMHg2OThFLDB4Njk4RiwweDY5OTAsMHg2OTkxLC8qIDB4NTgtMHg1RiAqLworCTB4Njk5MiwweDY5OTMsMHg2OTk2LDB4Njk5NywweDY5OTksMHg2OTlBLDB4Njk5RCwweDY5OUUsLyogMHg2MC0weDY3ICovCisJMHg2OTlGLDB4NjlBMCwweDY5QTEsMHg2OUEyLDB4NjlBMywweDY5QTQsMHg2OUE1LDB4NjlBNiwvKiAweDY4LTB4NkYgKi8KKwkweDY5QTksMHg2OUFBLDB4NjlBQywweDY5QUUsMHg2OUFGLDB4NjlCMCwweDY5QjIsMHg2OUIzLC8qIDB4NzAtMHg3NyAqLworCTB4NjlCNSwweDY5QjYsMHg2OUI4LDB4NjlCOSwweDY5QkEsMHg2OUJDLDB4NjlCRCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDY5QkUsMHg2OUJGLDB4NjlDMCwweDY5QzIsMHg2OUMzLDB4NjlDNCwweDY5QzUsMHg2OUM2LC8qIDB4ODAtMHg4NyAqLworCTB4NjlDNywweDY5QzgsMHg2OUM5LDB4NjlDQiwweDY5Q0QsMHg2OUNGLDB4NjlEMSwweDY5RDIsLyogMHg4OC0weDhGICovCisJMHg2OUQzLDB4NjlENSwweDY5RDYsMHg2OUQ3LDB4NjlEOCwweDY5RDksMHg2OURBLDB4NjlEQywvKiAweDkwLTB4OTcgKi8KKwkweDY5REQsMHg2OURFLDB4NjlFMSwweDY5RTIsMHg2OUUzLDB4NjlFNCwweDY5RTUsMHg2OUU2LC8qIDB4OTgtMHg5RiAqLworCTB4NjlFNywweDY5RTgsMHg2OUU5LDB4NjlFQSwweDY5RUIsMHg2OUVDLDB4NjlFRSwweDY5RUYsLyogMHhBMC0weEE3ICovCisJMHg2OUYwLDB4NjlGMSwweDY5RjMsMHg2OUY0LDB4NjlGNSwweDY5RjYsMHg2OUY3LDB4NjlGOCwvKiAweEE4LTB4QUYgKi8KKwkweDY5RjksMHg2OUZBLDB4NjlGQiwweDY5RkMsMHg2OUZFLDB4NkEwMCwweDZBMDEsMHg2QTAyLC8qIDB4QjAtMHhCNyAqLworCTB4NkEwMywweDZBMDQsMHg2QTA1LDB4NkEwNiwweDZBMDcsMHg2QTA4LDB4NkEwOSwweDZBMEIsLyogMHhCOC0weEJGICovCisJMHg2QTBDLDB4NkEwRCwweDZBMEUsMHg2QTBGLDB4NkExMCwweDZBMTEsMHg2QTEyLDB4NkExMywvKiAweEMwLTB4QzcgKi8KKwkweDZBMTQsMHg2QTE1LDB4NkExNiwweDZBMTksMHg2QTFBLDB4NkExQiwweDZBMUMsMHg2QTFELC8qIDB4QzgtMHhDRiAqLworCTB4NkExRSwweDZBMjAsMHg2QTIyLDB4NkEyMywweDZBMjQsMHg2QTI1LDB4NkEyNiwweDZBMjcsLyogMHhEMC0weEQ3ICovCisJMHg2QTI5LDB4NkEyQiwweDZBMkMsMHg2QTJELDB4NkEyRSwweDZBMzAsMHg2QTMyLDB4NkEzMywvKiAweEQ4LTB4REYgKi8KKwkweDZBMzQsMHg2QTM2LDB4NkEzNywweDZBMzgsMHg2QTM5LDB4NkEzQSwweDZBM0IsMHg2QTNDLC8qIDB4RTAtMHhFNyAqLworCTB4NkEzRiwweDZBNDAsMHg2QTQxLDB4NkE0MiwweDZBNDMsMHg2QTQ1LDB4NkE0NiwweDZBNDgsLyogMHhFOC0weEVGICovCisJMHg2QTQ5LDB4NkE0QSwweDZBNEIsMHg2QTRDLDB4NkE0RCwweDZBNEUsMHg2QTRGLDB4NkE1MSwvKiAweEYwLTB4RjcgKi8KKwkweDZBNTIsMHg2QTUzLDB4NkE1NCwweDZBNTUsMHg2QTU2LDB4NkE1NywweDZBNUEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzk5WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NkE1QywweDZBNUQsMHg2QTVFLDB4NkE1RiwweDZBNjAsMHg2QTYyLDB4NkE2MywweDZBNjQsLyogMHg0MC0weDQ3ICovCisJMHg2QTY2LDB4NkE2NywweDZBNjgsMHg2QTY5LDB4NkE2QSwweDZBNkIsMHg2QTZDLDB4NkE2RCwvKiAweDQ4LTB4NEYgKi8KKwkweDZBNkUsMHg2QTZGLDB4NkE3MCwweDZBNzIsMHg2QTczLDB4NkE3NCwweDZBNzUsMHg2QTc2LC8qIDB4NTAtMHg1NyAqLworCTB4NkE3NywweDZBNzgsMHg2QTdBLDB4NkE3QiwweDZBN0QsMHg2QTdFLDB4NkE3RiwweDZBODEsLyogMHg1OC0weDVGICovCisJMHg2QTgyLDB4NkE4MywweDZBODUsMHg2QTg2LDB4NkE4NywweDZBODgsMHg2QTg5LDB4NkE4QSwvKiAweDYwLTB4NjcgKi8KKwkweDZBOEIsMHg2QThDLDB4NkE4RCwweDZBOEYsMHg2QTkyLDB4NkE5MywweDZBOTQsMHg2QTk1LC8qIDB4NjgtMHg2RiAqLworCTB4NkE5NiwweDZBOTgsMHg2QTk5LDB4NkE5QSwweDZBOUIsMHg2QTlDLDB4NkE5RCwweDZBOUUsLyogMHg3MC0weDc3ICovCisJMHg2QTlGLDB4NkFBMSwweDZBQTIsMHg2QUEzLDB4NkFBNCwweDZBQTUsMHg2QUE2LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NkFBNywweDZBQTgsMHg2QUFBLDB4NkFBRCwweDZBQUUsMHg2QUFGLDB4NkFCMCwweDZBQjEsLyogMHg4MC0weDg3ICovCisJMHg2QUIyLDB4NkFCMywweDZBQjQsMHg2QUI1LDB4NkFCNiwweDZBQjcsMHg2QUI4LDB4NkFCOSwvKiAweDg4LTB4OEYgKi8KKwkweDZBQkEsMHg2QUJCLDB4NkFCQywweDZBQkQsMHg2QUJFLDB4NkFCRiwweDZBQzAsMHg2QUMxLC8qIDB4OTAtMHg5NyAqLworCTB4NkFDMiwweDZBQzMsMHg2QUM0LDB4NkFDNSwweDZBQzYsMHg2QUM3LDB4NkFDOCwweDZBQzksLyogMHg5OC0weDlGICovCisJMHg2QUNBLDB4NkFDQiwweDZBQ0MsMHg2QUNELDB4NkFDRSwweDZBQ0YsMHg2QUQwLDB4NkFEMSwvKiAweEEwLTB4QTcgKi8KKwkweDZBRDIsMHg2QUQzLDB4NkFENCwweDZBRDUsMHg2QUQ2LDB4NkFENywweDZBRDgsMHg2QUQ5LC8qIDB4QTgtMHhBRiAqLworCTB4NkFEQSwweDZBREIsMHg2QURDLDB4NkFERCwweDZBREUsMHg2QURGLDB4NkFFMCwweDZBRTEsLyogMHhCMC0weEI3ICovCisJMHg2QUUyLDB4NkFFMywweDZBRTQsMHg2QUU1LDB4NkFFNiwweDZBRTcsMHg2QUU4LDB4NkFFOSwvKiAweEI4LTB4QkYgKi8KKwkweDZBRUEsMHg2QUVCLDB4NkFFQywweDZBRUQsMHg2QUVFLDB4NkFFRiwweDZBRjAsMHg2QUYxLC8qIDB4QzAtMHhDNyAqLworCTB4NkFGMiwweDZBRjMsMHg2QUY0LDB4NkFGNSwweDZBRjYsMHg2QUY3LDB4NkFGOCwweDZBRjksLyogMHhDOC0weENGICovCisJMHg2QUZBLDB4NkFGQiwweDZBRkMsMHg2QUZELDB4NkFGRSwweDZBRkYsMHg2QjAwLDB4NkIwMSwvKiAweEQwLTB4RDcgKi8KKwkweDZCMDIsMHg2QjAzLDB4NkIwNCwweDZCMDUsMHg2QjA2LDB4NkIwNywweDZCMDgsMHg2QjA5LC8qIDB4RDgtMHhERiAqLworCTB4NkIwQSwweDZCMEIsMHg2QjBDLDB4NkIwRCwweDZCMEUsMHg2QjBGLDB4NkIxMCwweDZCMTEsLyogMHhFMC0weEU3ICovCisJMHg2QjEyLDB4NkIxMywweDZCMTQsMHg2QjE1LDB4NkIxNiwweDZCMTcsMHg2QjE4LDB4NkIxOSwvKiAweEU4LTB4RUYgKi8KKwkweDZCMUEsMHg2QjFCLDB4NkIxQywweDZCMUQsMHg2QjFFLDB4NkIxRiwweDZCMjUsMHg2QjI2LC8qIDB4RjAtMHhGNyAqLworCTB4NkIyOCwweDZCMjksMHg2QjJBLDB4NkIyQiwweDZCMkMsMHg2QjJELDB4NkIyRSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOUFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2QjJGLDB4NkIzMCwweDZCMzEsMHg2QjMzLDB4NkIzNCwweDZCMzUsMHg2QjM2LDB4NkIzOCwvKiAweDQwLTB4NDcgKi8KKwkweDZCM0IsMHg2QjNDLDB4NkIzRCwweDZCM0YsMHg2QjQwLDB4NkI0MSwweDZCNDIsMHg2QjQ0LC8qIDB4NDgtMHg0RiAqLworCTB4NkI0NSwweDZCNDgsMHg2QjRBLDB4NkI0QiwweDZCNEQsMHg2QjRFLDB4NkI0RiwweDZCNTAsLyogMHg1MC0weDU3ICovCisJMHg2QjUxLDB4NkI1MiwweDZCNTMsMHg2QjU0LDB4NkI1NSwweDZCNTYsMHg2QjU3LDB4NkI1OCwvKiAweDU4LTB4NUYgKi8KKwkweDZCNUEsMHg2QjVCLDB4NkI1QywweDZCNUQsMHg2QjVFLDB4NkI1RiwweDZCNjAsMHg2QjYxLC8qIDB4NjAtMHg2NyAqLworCTB4NkI2OCwweDZCNjksMHg2QjZCLDB4NkI2QywweDZCNkQsMHg2QjZFLDB4NkI2RiwweDZCNzAsLyogMHg2OC0weDZGICovCisJMHg2QjcxLDB4NkI3MiwweDZCNzMsMHg2Qjc0LDB4NkI3NSwweDZCNzYsMHg2Qjc3LDB4NkI3OCwvKiAweDcwLTB4NzcgKi8KKwkweDZCN0EsMHg2QjdELDB4NkI3RSwweDZCN0YsMHg2QjgwLDB4NkI4NSwweDZCODgsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg2QjhDLDB4NkI4RSwweDZCOEYsMHg2QjkwLDB4NkI5MSwweDZCOTQsMHg2Qjk1LDB4NkI5NywvKiAweDgwLTB4ODcgKi8KKwkweDZCOTgsMHg2Qjk5LDB4NkI5QywweDZCOUQsMHg2QjlFLDB4NkI5RiwweDZCQTAsMHg2QkEyLC8qIDB4ODgtMHg4RiAqLworCTB4NkJBMywweDZCQTQsMHg2QkE1LDB4NkJBNiwweDZCQTcsMHg2QkE4LDB4NkJBOSwweDZCQUIsLyogMHg5MC0weDk3ICovCisJMHg2QkFDLDB4NkJBRCwweDZCQUUsMHg2QkFGLDB4NkJCMCwweDZCQjEsMHg2QkIyLDB4NkJCNiwvKiAweDk4LTB4OUYgKi8KKwkweDZCQjgsMHg2QkI5LDB4NkJCQSwweDZCQkIsMHg2QkJDLDB4NkJCRCwweDZCQkUsMHg2QkMwLC8qIDB4QTAtMHhBNyAqLworCTB4NkJDMywweDZCQzQsMHg2QkM2LDB4NkJDNywweDZCQzgsMHg2QkM5LDB4NkJDQSwweDZCQ0MsLyogMHhBOC0weEFGICovCisJMHg2QkNFLDB4NkJEMCwweDZCRDEsMHg2QkQ4LDB4NkJEQSwweDZCREMsMHg2QkRELDB4NkJERSwvKiAweEIwLTB4QjcgKi8KKwkweDZCREYsMHg2QkUwLDB4NkJFMiwweDZCRTMsMHg2QkU0LDB4NkJFNSwweDZCRTYsMHg2QkU3LC8qIDB4QjgtMHhCRiAqLworCTB4NkJFOCwweDZCRTksMHg2QkVDLDB4NkJFRCwweDZCRUUsMHg2QkYwLDB4NkJGMSwweDZCRjIsLyogMHhDMC0weEM3ICovCisJMHg2QkY0LDB4NkJGNiwweDZCRjcsMHg2QkY4LDB4NkJGQSwweDZCRkIsMHg2QkZDLDB4NkJGRSwvKiAweEM4LTB4Q0YgKi8KKwkweDZCRkYsMHg2QzAwLDB4NkMwMSwweDZDMDIsMHg2QzAzLDB4NkMwNCwweDZDMDgsMHg2QzA5LC8qIDB4RDAtMHhENyAqLworCTB4NkMwQSwweDZDMEIsMHg2QzBDLDB4NkMwRSwweDZDMTIsMHg2QzE3LDB4NkMxQywweDZDMUQsLyogMHhEOC0weERGICovCisJMHg2QzFFLDB4NkMyMCwweDZDMjMsMHg2QzI1LDB4NkMyQiwweDZDMkMsMHg2QzJELDB4NkMzMSwvKiAweEUwLTB4RTcgKi8KKwkweDZDMzMsMHg2QzM2LDB4NkMzNywweDZDMzksMHg2QzNBLDB4NkMzQiwweDZDM0MsMHg2QzNFLC8qIDB4RTgtMHhFRiAqLworCTB4NkMzRiwweDZDNDMsMHg2QzQ0LDB4NkM0NSwweDZDNDgsMHg2QzRCLDB4NkM0QywweDZDNEQsLyogMHhGMC0weEY3ICovCisJMHg2QzRFLDB4NkM0RiwweDZDNTEsMHg2QzUyLDB4NkM1MywweDZDNTYsMHg2QzU4LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85QlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDZDNTksMHg2QzVBLDB4NkM2MiwweDZDNjMsMHg2QzY1LDB4NkM2NiwweDZDNjcsMHg2QzZCLC8qIDB4NDAtMHg0NyAqLworCTB4NkM2QywweDZDNkQsMHg2QzZFLDB4NkM2RiwweDZDNzEsMHg2QzczLDB4NkM3NSwweDZDNzcsLyogMHg0OC0weDRGICovCisJMHg2Qzc4LDB4NkM3QSwweDZDN0IsMHg2QzdDLDB4NkM3RiwweDZDODAsMHg2Qzg0LDB4NkM4NywvKiAweDUwLTB4NTcgKi8KKwkweDZDOEEsMHg2QzhCLDB4NkM4RCwweDZDOEUsMHg2QzkxLDB4NkM5MiwweDZDOTUsMHg2Qzk2LC8qIDB4NTgtMHg1RiAqLworCTB4NkM5NywweDZDOTgsMHg2QzlBLDB4NkM5QywweDZDOUQsMHg2QzlFLDB4NkNBMCwweDZDQTIsLyogMHg2MC0weDY3ICovCisJMHg2Q0E4LDB4NkNBQywweDZDQUYsMHg2Q0IwLDB4NkNCNCwweDZDQjUsMHg2Q0I2LDB4NkNCNywvKiAweDY4LTB4NkYgKi8KKwkweDZDQkEsMHg2Q0MwLDB4NkNDMSwweDZDQzIsMHg2Q0MzLDB4NkNDNiwweDZDQzcsMHg2Q0M4LC8qIDB4NzAtMHg3NyAqLworCTB4NkNDQiwweDZDQ0QsMHg2Q0NFLDB4NkNDRiwweDZDRDEsMHg2Q0QyLDB4NkNEOCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDZDRDksMHg2Q0RBLDB4NkNEQywweDZDREQsMHg2Q0RGLDB4NkNFNCwweDZDRTYsMHg2Q0U3LC8qIDB4ODAtMHg4NyAqLworCTB4NkNFOSwweDZDRUMsMHg2Q0VELDB4NkNGMiwweDZDRjQsMHg2Q0Y5LDB4NkNGRiwweDZEMDAsLyogMHg4OC0weDhGICovCisJMHg2RDAyLDB4NkQwMywweDZEMDUsMHg2RDA2LDB4NkQwOCwweDZEMDksMHg2RDBBLDB4NkQwRCwvKiAweDkwLTB4OTcgKi8KKwkweDZEMEYsMHg2RDEwLDB4NkQxMSwweDZEMTMsMHg2RDE0LDB4NkQxNSwweDZEMTYsMHg2RDE4LC8qIDB4OTgtMHg5RiAqLworCTB4NkQxQywweDZEMUQsMHg2RDFGLDB4NkQyMCwweDZEMjEsMHg2RDIyLDB4NkQyMywweDZEMjQsLyogMHhBMC0weEE3ICovCisJMHg2RDI2LDB4NkQyOCwweDZEMjksMHg2RDJDLDB4NkQyRCwweDZEMkYsMHg2RDMwLDB4NkQzNCwvKiAweEE4LTB4QUYgKi8KKwkweDZEMzYsMHg2RDM3LDB4NkQzOCwweDZEM0EsMHg2RDNGLDB4NkQ0MCwweDZENDIsMHg2RDQ0LC8qIDB4QjAtMHhCNyAqLworCTB4NkQ0OSwweDZENEMsMHg2RDUwLDB4NkQ1NSwweDZENTYsMHg2RDU3LDB4NkQ1OCwweDZENUIsLyogMHhCOC0weEJGICovCisJMHg2RDVELDB4NkQ1RiwweDZENjEsMHg2RDYyLDB4NkQ2NCwweDZENjUsMHg2RDY3LDB4NkQ2OCwvKiAweEMwLTB4QzcgKi8KKwkweDZENkIsMHg2RDZDLDB4NkQ2RCwweDZENzAsMHg2RDcxLDB4NkQ3MiwweDZENzMsMHg2RDc1LC8qIDB4QzgtMHhDRiAqLworCTB4NkQ3NiwweDZENzksMHg2RDdBLDB4NkQ3QiwweDZEN0QsMHg2RDdFLDB4NkQ3RiwweDZEODAsLyogMHhEMC0weEQ3ICovCisJMHg2RDgxLDB4NkQ4MywweDZEODQsMHg2RDg2LDB4NkQ4NywweDZEOEEsMHg2RDhCLDB4NkQ4RCwvKiAweEQ4LTB4REYgKi8KKwkweDZEOEYsMHg2RDkwLDB4NkQ5MiwweDZEOTYsMHg2RDk3LDB4NkQ5OCwweDZEOTksMHg2RDlBLC8qIDB4RTAtMHhFNyAqLworCTB4NkQ5QywweDZEQTIsMHg2REE1LDB4NkRBQywweDZEQUQsMHg2REIwLDB4NkRCMSwweDZEQjMsLyogMHhFOC0weEVGICovCisJMHg2REI0LDB4NkRCNiwweDZEQjcsMHg2REI5LDB4NkRCQSwweDZEQkIsMHg2REJDLDB4NkRCRCwvKiAweEYwLTB4RjcgKi8KKwkweDZEQkUsMHg2REMxLDB4NkRDMiwweDZEQzMsMHg2REM4LDB4NkRDOSwweDZEQ0EsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzlDWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NkRDRCwweDZEQ0UsMHg2RENGLDB4NkREMCwweDZERDIsMHg2REQzLDB4NkRENCwweDZERDUsLyogMHg0MC0weDQ3ICovCisJMHg2REQ3LDB4NkREQSwweDZEREIsMHg2RERDLDB4NkRERiwweDZERTIsMHg2REUzLDB4NkRFNSwvKiAweDQ4LTB4NEYgKi8KKwkweDZERTcsMHg2REU4LDB4NkRFOSwweDZERUEsMHg2REVELDB4NkRFRiwweDZERjAsMHg2REYyLC8qIDB4NTAtMHg1NyAqLworCTB4NkRGNCwweDZERjUsMHg2REY2LDB4NkRGOCwweDZERkEsMHg2REZELDB4NkRGRSwweDZERkYsLyogMHg1OC0weDVGICovCisJMHg2RTAwLDB4NkUwMSwweDZFMDIsMHg2RTAzLDB4NkUwNCwweDZFMDYsMHg2RTA3LDB4NkUwOCwvKiAweDYwLTB4NjcgKi8KKwkweDZFMDksMHg2RTBCLDB4NkUwRiwweDZFMTIsMHg2RTEzLDB4NkUxNSwweDZFMTgsMHg2RTE5LC8qIDB4NjgtMHg2RiAqLworCTB4NkUxQiwweDZFMUMsMHg2RTFFLDB4NkUxRiwweDZFMjIsMHg2RTI2LDB4NkUyNywweDZFMjgsLyogMHg3MC0weDc3ICovCisJMHg2RTJBLDB4NkUyQywweDZFMkUsMHg2RTMwLDB4NkUzMSwweDZFMzMsMHg2RTM1LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NkUzNiwweDZFMzcsMHg2RTM5LDB4NkUzQiwweDZFM0MsMHg2RTNELDB4NkUzRSwweDZFM0YsLyogMHg4MC0weDg3ICovCisJMHg2RTQwLDB4NkU0MSwweDZFNDIsMHg2RTQ1LDB4NkU0NiwweDZFNDcsMHg2RTQ4LDB4NkU0OSwvKiAweDg4LTB4OEYgKi8KKwkweDZFNEEsMHg2RTRCLDB4NkU0QywweDZFNEYsMHg2RTUwLDB4NkU1MSwweDZFNTIsMHg2RTU1LC8qIDB4OTAtMHg5NyAqLworCTB4NkU1NywweDZFNTksMHg2RTVBLDB4NkU1QywweDZFNUQsMHg2RTVFLDB4NkU2MCwweDZFNjEsLyogMHg5OC0weDlGICovCisJMHg2RTYyLDB4NkU2MywweDZFNjQsMHg2RTY1LDB4NkU2NiwweDZFNjcsMHg2RTY4LDB4NkU2OSwvKiAweEEwLTB4QTcgKi8KKwkweDZFNkEsMHg2RTZDLDB4NkU2RCwweDZFNkYsMHg2RTcwLDB4NkU3MSwweDZFNzIsMHg2RTczLC8qIDB4QTgtMHhBRiAqLworCTB4NkU3NCwweDZFNzUsMHg2RTc2LDB4NkU3NywweDZFNzgsMHg2RTc5LDB4NkU3QSwweDZFN0IsLyogMHhCMC0weEI3ICovCisJMHg2RTdDLDB4NkU3RCwweDZFODAsMHg2RTgxLDB4NkU4MiwweDZFODQsMHg2RTg3LDB4NkU4OCwvKiAweEI4LTB4QkYgKi8KKwkweDZFOEEsMHg2RThCLDB4NkU4QywweDZFOEQsMHg2RThFLDB4NkU5MSwweDZFOTIsMHg2RTkzLC8qIDB4QzAtMHhDNyAqLworCTB4NkU5NCwweDZFOTUsMHg2RTk2LDB4NkU5NywweDZFOTksMHg2RTlBLDB4NkU5QiwweDZFOUQsLyogMHhDOC0weENGICovCisJMHg2RTlFLDB4NkVBMCwweDZFQTEsMHg2RUEzLDB4NkVBNCwweDZFQTYsMHg2RUE4LDB4NkVBOSwvKiAweEQwLTB4RDcgKi8KKwkweDZFQUIsMHg2RUFDLDB4NkVBRCwweDZFQUUsMHg2RUIwLDB4NkVCMywweDZFQjUsMHg2RUI4LC8qIDB4RDgtMHhERiAqLworCTB4NkVCOSwweDZFQkMsMHg2RUJFLDB4NkVCRiwweDZFQzAsMHg2RUMzLDB4NkVDNCwweDZFQzUsLyogMHhFMC0weEU3ICovCisJMHg2RUM2LDB4NkVDOCwweDZFQzksMHg2RUNBLDB4NkVDQywweDZFQ0QsMHg2RUNFLDB4NkVEMCwvKiAweEU4LTB4RUYgKi8KKwkweDZFRDIsMHg2RUQ2LDB4NkVEOCwweDZFRDksMHg2RURCLDB4NkVEQywweDZFREQsMHg2RUUzLC8qIDB4RjAtMHhGNyAqLworCTB4NkVFNywweDZFRUEsMHg2RUVCLDB4NkVFQywweDZFRUQsMHg2RUVFLDB4NkVFRiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOURbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2RUYwLDB4NkVGMSwweDZFRjIsMHg2RUYzLDB4NkVGNSwweDZFRjYsMHg2RUY3LDB4NkVGOCwvKiAweDQwLTB4NDcgKi8KKwkweDZFRkEsMHg2RUZCLDB4NkVGQywweDZFRkQsMHg2RUZFLDB4NkVGRiwweDZGMDAsMHg2RjAxLC8qIDB4NDgtMHg0RiAqLworCTB4NkYwMywweDZGMDQsMHg2RjA1LDB4NkYwNywweDZGMDgsMHg2RjBBLDB4NkYwQiwweDZGMEMsLyogMHg1MC0weDU3ICovCisJMHg2RjBELDB4NkYwRSwweDZGMTAsMHg2RjExLDB4NkYxMiwweDZGMTYsMHg2RjE3LDB4NkYxOCwvKiAweDU4LTB4NUYgKi8KKwkweDZGMTksMHg2RjFBLDB4NkYxQiwweDZGMUMsMHg2RjFELDB4NkYxRSwweDZGMUYsMHg2RjIxLC8qIDB4NjAtMHg2NyAqLworCTB4NkYyMiwweDZGMjMsMHg2RjI1LDB4NkYyNiwweDZGMjcsMHg2RjI4LDB4NkYyQywweDZGMkUsLyogMHg2OC0weDZGICovCisJMHg2RjMwLDB4NkYzMiwweDZGMzQsMHg2RjM1LDB4NkYzNywweDZGMzgsMHg2RjM5LDB4NkYzQSwvKiAweDcwLTB4NzcgKi8KKwkweDZGM0IsMHg2RjNDLDB4NkYzRCwweDZGM0YsMHg2RjQwLDB4NkY0MSwweDZGNDIsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg2RjQzLDB4NkY0NCwweDZGNDUsMHg2RjQ4LDB4NkY0OSwweDZGNEEsMHg2RjRDLDB4NkY0RSwvKiAweDgwLTB4ODcgKi8KKwkweDZGNEYsMHg2RjUwLDB4NkY1MSwweDZGNTIsMHg2RjUzLDB4NkY1NCwweDZGNTUsMHg2RjU2LC8qIDB4ODgtMHg4RiAqLworCTB4NkY1NywweDZGNTksMHg2RjVBLDB4NkY1QiwweDZGNUQsMHg2RjVGLDB4NkY2MCwweDZGNjEsLyogMHg5MC0weDk3ICovCisJMHg2RjYzLDB4NkY2NCwweDZGNjUsMHg2RjY3LDB4NkY2OCwweDZGNjksMHg2RjZBLDB4NkY2QiwvKiAweDk4LTB4OUYgKi8KKwkweDZGNkMsMHg2RjZGLDB4NkY3MCwweDZGNzEsMHg2RjczLDB4NkY3NSwweDZGNzYsMHg2Rjc3LC8qIDB4QTAtMHhBNyAqLworCTB4NkY3OSwweDZGN0IsMHg2RjdELDB4NkY3RSwweDZGN0YsMHg2RjgwLDB4NkY4MSwweDZGODIsLyogMHhBOC0weEFGICovCisJMHg2RjgzLDB4NkY4NSwweDZGODYsMHg2Rjg3LDB4NkY4QSwweDZGOEIsMHg2RjhGLDB4NkY5MCwvKiAweEIwLTB4QjcgKi8KKwkweDZGOTEsMHg2RjkyLDB4NkY5MywweDZGOTQsMHg2Rjk1LDB4NkY5NiwweDZGOTcsMHg2Rjk4LC8qIDB4QjgtMHhCRiAqLworCTB4NkY5OSwweDZGOUEsMHg2RjlCLDB4NkY5RCwweDZGOUUsMHg2RjlGLDB4NkZBMCwweDZGQTIsLyogMHhDMC0weEM3ICovCisJMHg2RkEzLDB4NkZBNCwweDZGQTUsMHg2RkE2LDB4NkZBOCwweDZGQTksMHg2RkFBLDB4NkZBQiwvKiAweEM4LTB4Q0YgKi8KKwkweDZGQUMsMHg2RkFELDB4NkZBRSwweDZGQUYsMHg2RkIwLDB4NkZCMSwweDZGQjIsMHg2RkI0LC8qIDB4RDAtMHhENyAqLworCTB4NkZCNSwweDZGQjcsMHg2RkI4LDB4NkZCQSwweDZGQkIsMHg2RkJDLDB4NkZCRCwweDZGQkUsLyogMHhEOC0weERGICovCisJMHg2RkJGLDB4NkZDMSwweDZGQzMsMHg2RkM0LDB4NkZDNSwweDZGQzYsMHg2RkM3LDB4NkZDOCwvKiAweEUwLTB4RTcgKi8KKwkweDZGQ0EsMHg2RkNCLDB4NkZDQywweDZGQ0QsMHg2RkNFLDB4NkZDRiwweDZGRDAsMHg2RkQzLC8qIDB4RTgtMHhFRiAqLworCTB4NkZENCwweDZGRDUsMHg2RkQ2LDB4NkZENywweDZGRDgsMHg2RkQ5LDB4NkZEQSwweDZGREIsLyogMHhGMC0weEY3ICovCisJMHg2RkRDLDB4NkZERCwweDZGREYsMHg2RkUyLDB4NkZFMywweDZGRTQsMHg2RkU1LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85RVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDZGRTYsMHg2RkU3LDB4NkZFOCwweDZGRTksMHg2RkVBLDB4NkZFQiwweDZGRUMsMHg2RkVELC8qIDB4NDAtMHg0NyAqLworCTB4NkZGMCwweDZGRjEsMHg2RkYyLDB4NkZGMywweDZGRjQsMHg2RkY1LDB4NkZGNiwweDZGRjcsLyogMHg0OC0weDRGICovCisJMHg2RkY4LDB4NkZGOSwweDZGRkEsMHg2RkZCLDB4NkZGQywweDZGRkQsMHg2RkZFLDB4NkZGRiwvKiAweDUwLTB4NTcgKi8KKwkweDcwMDAsMHg3MDAxLDB4NzAwMiwweDcwMDMsMHg3MDA0LDB4NzAwNSwweDcwMDYsMHg3MDA3LC8qIDB4NTgtMHg1RiAqLworCTB4NzAwOCwweDcwMDksMHg3MDBBLDB4NzAwQiwweDcwMEMsMHg3MDBELDB4NzAwRSwweDcwMEYsLyogMHg2MC0weDY3ICovCisJMHg3MDEwLDB4NzAxMiwweDcwMTMsMHg3MDE0LDB4NzAxNSwweDcwMTYsMHg3MDE3LDB4NzAxOCwvKiAweDY4LTB4NkYgKi8KKwkweDcwMTksMHg3MDFDLDB4NzAxRCwweDcwMUUsMHg3MDFGLDB4NzAyMCwweDcwMjEsMHg3MDIyLC8qIDB4NzAtMHg3NyAqLworCTB4NzAyNCwweDcwMjUsMHg3MDI2LDB4NzAyNywweDcwMjgsMHg3MDI5LDB4NzAyQSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDcwMkIsMHg3MDJDLDB4NzAyRCwweDcwMkUsMHg3MDJGLDB4NzAzMCwweDcwMzEsMHg3MDMyLC8qIDB4ODAtMHg4NyAqLworCTB4NzAzMywweDcwMzQsMHg3MDM2LDB4NzAzNywweDcwMzgsMHg3MDNBLDB4NzAzQiwweDcwM0MsLyogMHg4OC0weDhGICovCisJMHg3MDNELDB4NzAzRSwweDcwM0YsMHg3MDQwLDB4NzA0MSwweDcwNDIsMHg3MDQzLDB4NzA0NCwvKiAweDkwLTB4OTcgKi8KKwkweDcwNDUsMHg3MDQ2LDB4NzA0NywweDcwNDgsMHg3MDQ5LDB4NzA0QSwweDcwNEIsMHg3MDRELC8qIDB4OTgtMHg5RiAqLworCTB4NzA0RSwweDcwNTAsMHg3MDUxLDB4NzA1MiwweDcwNTMsMHg3MDU0LDB4NzA1NSwweDcwNTYsLyogMHhBMC0weEE3ICovCisJMHg3MDU3LDB4NzA1OCwweDcwNTksMHg3MDVBLDB4NzA1QiwweDcwNUMsMHg3MDVELDB4NzA1RiwvKiAweEE4LTB4QUYgKi8KKwkweDcwNjAsMHg3MDYxLDB4NzA2MiwweDcwNjMsMHg3MDY0LDB4NzA2NSwweDcwNjYsMHg3MDY3LC8qIDB4QjAtMHhCNyAqLworCTB4NzA2OCwweDcwNjksMHg3MDZBLDB4NzA2RSwweDcwNzEsMHg3MDcyLDB4NzA3MywweDcwNzQsLyogMHhCOC0weEJGICovCisJMHg3MDc3LDB4NzA3OSwweDcwN0EsMHg3MDdCLDB4NzA3RCwweDcwODEsMHg3MDgyLDB4NzA4MywvKiAweEMwLTB4QzcgKi8KKwkweDcwODQsMHg3MDg2LDB4NzA4NywweDcwODgsMHg3MDhCLDB4NzA4QywweDcwOEQsMHg3MDhGLC8qIDB4QzgtMHhDRiAqLworCTB4NzA5MCwweDcwOTEsMHg3MDkzLDB4NzA5NywweDcwOTgsMHg3MDlBLDB4NzA5QiwweDcwOUUsLyogMHhEMC0weEQ3ICovCisJMHg3MDlGLDB4NzBBMCwweDcwQTEsMHg3MEEyLDB4NzBBMywweDcwQTQsMHg3MEE1LDB4NzBBNiwvKiAweEQ4LTB4REYgKi8KKwkweDcwQTcsMHg3MEE4LDB4NzBBOSwweDcwQUEsMHg3MEIwLDB4NzBCMiwweDcwQjQsMHg3MEI1LC8qIDB4RTAtMHhFNyAqLworCTB4NzBCNiwweDcwQkEsMHg3MEJFLDB4NzBCRiwweDcwQzQsMHg3MEM1LDB4NzBDNiwweDcwQzcsLyogMHhFOC0weEVGICovCisJMHg3MEM5LDB4NzBDQiwweDcwQ0MsMHg3MENELDB4NzBDRSwweDcwQ0YsMHg3MEQwLDB4NzBEMSwvKiAweEYwLTB4RjcgKi8KKwkweDcwRDIsMHg3MEQzLDB4NzBENCwweDcwRDUsMHg3MEQ2LDB4NzBENywweDcwREEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzlGWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NzBEQywweDcwREQsMHg3MERFLDB4NzBFMCwweDcwRTEsMHg3MEUyLDB4NzBFMywweDcwRTUsLyogMHg0MC0weDQ3ICovCisJMHg3MEVBLDB4NzBFRSwweDcwRjAsMHg3MEYxLDB4NzBGMiwweDcwRjMsMHg3MEY0LDB4NzBGNSwvKiAweDQ4LTB4NEYgKi8KKwkweDcwRjYsMHg3MEY4LDB4NzBGQSwweDcwRkIsMHg3MEZDLDB4NzBGRSwweDcwRkYsMHg3MTAwLC8qIDB4NTAtMHg1NyAqLworCTB4NzEwMSwweDcxMDIsMHg3MTAzLDB4NzEwNCwweDcxMDUsMHg3MTA2LDB4NzEwNywweDcxMDgsLyogMHg1OC0weDVGICovCisJMHg3MTBCLDB4NzEwQywweDcxMEQsMHg3MTBFLDB4NzEwRiwweDcxMTEsMHg3MTEyLDB4NzExNCwvKiAweDYwLTB4NjcgKi8KKwkweDcxMTcsMHg3MTFCLDB4NzExQywweDcxMUQsMHg3MTFFLDB4NzExRiwweDcxMjAsMHg3MTIxLC8qIDB4NjgtMHg2RiAqLworCTB4NzEyMiwweDcxMjMsMHg3MTI0LDB4NzEyNSwweDcxMjcsMHg3MTI4LDB4NzEyOSwweDcxMkEsLyogMHg3MC0weDc3ICovCisJMHg3MTJCLDB4NzEyQywweDcxMkQsMHg3MTJFLDB4NzEzMiwweDcxMzMsMHg3MTM0LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NzEzNSwweDcxMzcsMHg3MTM4LDB4NzEzOSwweDcxM0EsMHg3MTNCLDB4NzEzQywweDcxM0QsLyogMHg4MC0weDg3ICovCisJMHg3MTNFLDB4NzEzRiwweDcxNDAsMHg3MTQxLDB4NzE0MiwweDcxNDMsMHg3MTQ0LDB4NzE0NiwvKiAweDg4LTB4OEYgKi8KKwkweDcxNDcsMHg3MTQ4LDB4NzE0OSwweDcxNEIsMHg3MTRELDB4NzE0RiwweDcxNTAsMHg3MTUxLC8qIDB4OTAtMHg5NyAqLworCTB4NzE1MiwweDcxNTMsMHg3MTU0LDB4NzE1NSwweDcxNTYsMHg3MTU3LDB4NzE1OCwweDcxNTksLyogMHg5OC0weDlGICovCisJMHg3MTVBLDB4NzE1QiwweDcxNUQsMHg3MTVGLDB4NzE2MCwweDcxNjEsMHg3MTYyLDB4NzE2MywvKiAweEEwLTB4QTcgKi8KKwkweDcxNjUsMHg3MTY5LDB4NzE2QSwweDcxNkIsMHg3MTZDLDB4NzE2RCwweDcxNkYsMHg3MTcwLC8qIDB4QTgtMHhBRiAqLworCTB4NzE3MSwweDcxNzQsMHg3MTc1LDB4NzE3NiwweDcxNzcsMHg3MTc5LDB4NzE3QiwweDcxN0MsLyogMHhCMC0weEI3ICovCisJMHg3MTdFLDB4NzE3RiwweDcxODAsMHg3MTgxLDB4NzE4MiwweDcxODMsMHg3MTg1LDB4NzE4NiwvKiAweEI4LTB4QkYgKi8KKwkweDcxODcsMHg3MTg4LDB4NzE4OSwweDcxOEIsMHg3MThDLDB4NzE4RCwweDcxOEUsMHg3MTkwLC8qIDB4QzAtMHhDNyAqLworCTB4NzE5MSwweDcxOTIsMHg3MTkzLDB4NzE5NSwweDcxOTYsMHg3MTk3LDB4NzE5QSwweDcxOUIsLyogMHhDOC0weENGICovCisJMHg3MTlDLDB4NzE5RCwweDcxOUUsMHg3MUExLDB4NzFBMiwweDcxQTMsMHg3MUE0LDB4NzFBNSwvKiAweEQwLTB4RDcgKi8KKwkweDcxQTYsMHg3MUE3LDB4NzFBOSwweDcxQUEsMHg3MUFCLDB4NzFBRCwweDcxQUUsMHg3MUFGLC8qIDB4RDgtMHhERiAqLworCTB4NzFCMCwweDcxQjEsMHg3MUIyLDB4NzFCNCwweDcxQjYsMHg3MUI3LDB4NzFCOCwweDcxQkEsLyogMHhFMC0weEU3ICovCisJMHg3MUJCLDB4NzFCQywweDcxQkQsMHg3MUJFLDB4NzFCRiwweDcxQzAsMHg3MUMxLDB4NzFDMiwvKiAweEU4LTB4RUYgKi8KKwkweDcxQzQsMHg3MUM1LDB4NzFDNiwweDcxQzcsMHg3MUM4LDB4NzFDOSwweDcxQ0EsMHg3MUNCLC8qIDB4RjAtMHhGNyAqLworCTB4NzFDQywweDcxQ0QsMHg3MUNGLDB4NzFEMCwweDcxRDEsMHg3MUQyLDB4NzFEMywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQTBbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3MUQ2LDB4NzFENywweDcxRDgsMHg3MUQ5LDB4NzFEQSwweDcxREIsMHg3MURDLDB4NzFERCwvKiAweDQwLTB4NDcgKi8KKwkweDcxREUsMHg3MURGLDB4NzFFMSwweDcxRTIsMHg3MUUzLDB4NzFFNCwweDcxRTYsMHg3MUU4LC8qIDB4NDgtMHg0RiAqLworCTB4NzFFOSwweDcxRUEsMHg3MUVCLDB4NzFFQywweDcxRUQsMHg3MUVGLDB4NzFGMCwweDcxRjEsLyogMHg1MC0weDU3ICovCisJMHg3MUYyLDB4NzFGMywweDcxRjQsMHg3MUY1LDB4NzFGNiwweDcxRjcsMHg3MUY4LDB4NzFGQSwvKiAweDU4LTB4NUYgKi8KKwkweDcxRkIsMHg3MUZDLDB4NzFGRCwweDcxRkUsMHg3MUZGLDB4NzIwMCwweDcyMDEsMHg3MjAyLC8qIDB4NjAtMHg2NyAqLworCTB4NzIwMywweDcyMDQsMHg3MjA1LDB4NzIwNywweDcyMDgsMHg3MjA5LDB4NzIwQSwweDcyMEIsLyogMHg2OC0weDZGICovCisJMHg3MjBDLDB4NzIwRCwweDcyMEUsMHg3MjBGLDB4NzIxMCwweDcyMTEsMHg3MjEyLDB4NzIxMywvKiAweDcwLTB4NzcgKi8KKwkweDcyMTQsMHg3MjE1LDB4NzIxNiwweDcyMTcsMHg3MjE4LDB4NzIxOSwweDcyMUEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3MjFCLDB4NzIxQywweDcyMUUsMHg3MjFGLDB4NzIyMCwweDcyMjEsMHg3MjIyLDB4NzIyMywvKiAweDgwLTB4ODcgKi8KKwkweDcyMjQsMHg3MjI1LDB4NzIyNiwweDcyMjcsMHg3MjI5LDB4NzIyQiwweDcyMkQsMHg3MjJFLC8qIDB4ODgtMHg4RiAqLworCTB4NzIyRiwweDcyMzIsMHg3MjMzLDB4NzIzNCwweDcyM0EsMHg3MjNDLDB4NzIzRSwweDcyNDAsLyogMHg5MC0weDk3ICovCisJMHg3MjQxLDB4NzI0MiwweDcyNDMsMHg3MjQ0LDB4NzI0NSwweDcyNDYsMHg3MjQ5LDB4NzI0QSwvKiAweDk4LTB4OUYgKi8KKwkweDcyNEIsMHg3MjRFLDB4NzI0RiwweDcyNTAsMHg3MjUxLDB4NzI1MywweDcyNTQsMHg3MjU1LC8qIDB4QTAtMHhBNyAqLworCTB4NzI1NywweDcyNTgsMHg3MjVBLDB4NzI1QywweDcyNUUsMHg3MjYwLDB4NzI2MywweDcyNjQsLyogMHhBOC0weEFGICovCisJMHg3MjY1LDB4NzI2OCwweDcyNkEsMHg3MjZCLDB4NzI2QywweDcyNkQsMHg3MjcwLDB4NzI3MSwvKiAweEIwLTB4QjcgKi8KKwkweDcyNzMsMHg3Mjc0LDB4NzI3NiwweDcyNzcsMHg3Mjc4LDB4NzI3QiwweDcyN0MsMHg3MjdELC8qIDB4QjgtMHhCRiAqLworCTB4NzI4MiwweDcyODMsMHg3Mjg1LDB4NzI4NiwweDcyODcsMHg3Mjg4LDB4NzI4OSwweDcyOEMsLyogMHhDMC0weEM3ICovCisJMHg3MjhFLDB4NzI5MCwweDcyOTEsMHg3MjkzLDB4NzI5NCwweDcyOTUsMHg3Mjk2LDB4NzI5NywvKiAweEM4LTB4Q0YgKi8KKwkweDcyOTgsMHg3Mjk5LDB4NzI5QSwweDcyOUIsMHg3MjlDLDB4NzI5RCwweDcyOUUsMHg3MkEwLC8qIDB4RDAtMHhENyAqLworCTB4NzJBMSwweDcyQTIsMHg3MkEzLDB4NzJBNCwweDcyQTUsMHg3MkE2LDB4NzJBNywweDcyQTgsLyogMHhEOC0weERGICovCisJMHg3MkE5LDB4NzJBQSwweDcyQUIsMHg3MkFFLDB4NzJCMSwweDcyQjIsMHg3MkIzLDB4NzJCNSwvKiAweEUwLTB4RTcgKi8KKwkweDcyQkEsMHg3MkJCLDB4NzJCQywweDcyQkQsMHg3MkJFLDB4NzJCRiwweDcyQzAsMHg3MkM1LC8qIDB4RTgtMHhFRiAqLworCTB4NzJDNiwweDcyQzcsMHg3MkM5LDB4NzJDQSwweDcyQ0IsMHg3MkNDLDB4NzJDRiwweDcyRDEsLyogMHhGMC0weEY3ICovCisJMHg3MkQzLDB4NzJENCwweDcyRDUsMHg3MkQ2LDB4NzJEOCwweDcyREEsMHg3MkRCLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BMVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDMwMDAsMHgzMDAxLDB4MzAwMiwweDAwQjcsMHgwMkM5LDB4MDJDNywweDAwQTgsLyogMHhBMC0weEE3ICovCisJMHgzMDAzLDB4MzAwNSwweDIwMTQsMHhGRjVFLDB4MjAxNiwweDIwMjYsMHgyMDE4LDB4MjAxOSwvKiAweEE4LTB4QUYgKi8KKwkweDIwMUMsMHgyMDFELDB4MzAxNCwweDMwMTUsMHgzMDA4LDB4MzAwOSwweDMwMEEsMHgzMDBCLC8qIDB4QjAtMHhCNyAqLworCTB4MzAwQywweDMwMEQsMHgzMDBFLDB4MzAwRiwweDMwMTYsMHgzMDE3LDB4MzAxMCwweDMwMTEsLyogMHhCOC0weEJGICovCisJMHgwMEIxLDB4MDBENywweDAwRjcsMHgyMjM2LDB4MjIyNywweDIyMjgsMHgyMjExLDB4MjIwRiwvKiAweEMwLTB4QzcgKi8KKwkweDIyMkEsMHgyMjI5LDB4MjIwOCwweDIyMzcsMHgyMjFBLDB4MjJBNSwweDIyMjUsMHgyMjIwLC8qIDB4QzgtMHhDRiAqLworCTB4MjMxMiwweDIyOTksMHgyMjJCLDB4MjIyRSwweDIyNjEsMHgyMjRDLDB4MjI0OCwweDIyM0QsLyogMHhEMC0weEQ3ICovCisJMHgyMjFELDB4MjI2MCwweDIyNkUsMHgyMjZGLDB4MjI2NCwweDIyNjUsMHgyMjFFLDB4MjIzNSwvKiAweEQ4LTB4REYgKi8KKwkweDIyMzQsMHgyNjQyLDB4MjY0MCwweDAwQjAsMHgyMDMyLDB4MjAzMywweDIxMDMsMHhGRjA0LC8qIDB4RTAtMHhFNyAqLworCTB4MDBBNCwweEZGRTAsMHhGRkUxLDB4MjAzMCwweDAwQTcsMHgyMTE2LDB4MjYwNiwweDI2MDUsLyogMHhFOC0weEVGICovCisJMHgyNUNCLDB4MjVDRiwweDI1Q0UsMHgyNUM3LDB4MjVDNiwweDI1QTEsMHgyNUEwLDB4MjVCMywvKiAweEYwLTB4RjcgKi8KKwkweDI1QjIsMHgyMDNCLDB4MjE5MiwweDIxOTAsMHgyMTkxLDB4MjE5MywweDMwMTMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0EyWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4MjE3MCwweDIxNzEsMHgyMTcyLDB4MjE3MywweDIxNzQsMHgyMTc1LDB4MjE3NiwvKiAweEEwLTB4QTcgKi8KKwkweDIxNzcsMHgyMTc4LDB4MjE3OSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QTgtMHhBRiAqLworCTB4MDAwMCwweDI0ODgsMHgyNDg5LDB4MjQ4QSwweDI0OEIsMHgyNDhDLDB4MjQ4RCwweDI0OEUsLyogMHhCMC0weEI3ICovCisJMHgyNDhGLDB4MjQ5MCwweDI0OTEsMHgyNDkyLDB4MjQ5MywweDI0OTQsMHgyNDk1LDB4MjQ5NiwvKiAweEI4LTB4QkYgKi8KKwkweDI0OTcsMHgyNDk4LDB4MjQ5OSwweDI0OUEsMHgyNDlCLDB4MjQ3NCwweDI0NzUsMHgyNDc2LC8qIDB4QzAtMHhDNyAqLworCTB4MjQ3NywweDI0NzgsMHgyNDc5LDB4MjQ3QSwweDI0N0IsMHgyNDdDLDB4MjQ3RCwweDI0N0UsLyogMHhDOC0weENGICovCisJMHgyNDdGLDB4MjQ4MCwweDI0ODEsMHgyNDgyLDB4MjQ4MywweDI0ODQsMHgyNDg1LDB4MjQ4NiwvKiAweEQwLTB4RDcgKi8KKwkweDI0ODcsMHgyNDYwLDB4MjQ2MSwweDI0NjIsMHgyNDYzLDB4MjQ2NCwweDI0NjUsMHgyNDY2LC8qIDB4RDgtMHhERiAqLworCTB4MjQ2NywweDI0NjgsMHgyNDY5LDB4MDAwMCwweDAwMDAsMHgzMjIwLDB4MzIyMSwweDMyMjIsLyogMHhFMC0weEU3ICovCisJMHgzMjIzLDB4MzIyNCwweDMyMjUsMHgzMjI2LDB4MzIyNywweDMyMjgsMHgzMjI5LDB4MDAwMCwvKiAweEU4LTB4RUYgKi8KKwkweDAwMDAsMHgyMTYwLDB4MjE2MSwweDIxNjIsMHgyMTYzLDB4MjE2NCwweDIxNjUsMHgyMTY2LC8qIDB4RjAtMHhGNyAqLworCTB4MjE2NywweDIxNjgsMHgyMTY5LDB4MjE2QSwweDIxNkIsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQTNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHhGRjAxLDB4RkYwMiwweEZGMDMsMHhGRkU1LDB4RkYwNSwweEZGMDYsMHhGRjA3LC8qIDB4QTAtMHhBNyAqLworCTB4RkYwOCwweEZGMDksMHhGRjBBLDB4RkYwQiwweEZGMEMsMHhGRjBELDB4RkYwRSwweEZGMEYsLyogMHhBOC0weEFGICovCisJMHhGRjEwLDB4RkYxMSwweEZGMTIsMHhGRjEzLDB4RkYxNCwweEZGMTUsMHhGRjE2LDB4RkYxNywvKiAweEIwLTB4QjcgKi8KKwkweEZGMTgsMHhGRjE5LDB4RkYxQSwweEZGMUIsMHhGRjFDLDB4RkYxRCwweEZGMUUsMHhGRjFGLC8qIDB4QjgtMHhCRiAqLworCTB4RkYyMCwweEZGMjEsMHhGRjIyLDB4RkYyMywweEZGMjQsMHhGRjI1LDB4RkYyNiwweEZGMjcsLyogMHhDMC0weEM3ICovCisJMHhGRjI4LDB4RkYyOSwweEZGMkEsMHhGRjJCLDB4RkYyQywweEZGMkQsMHhGRjJFLDB4RkYyRiwvKiAweEM4LTB4Q0YgKi8KKwkweEZGMzAsMHhGRjMxLDB4RkYzMiwweEZGMzMsMHhGRjM0LDB4RkYzNSwweEZGMzYsMHhGRjM3LC8qIDB4RDAtMHhENyAqLworCTB4RkYzOCwweEZGMzksMHhGRjNBLDB4RkYzQiwweEZGM0MsMHhGRjNELDB4RkYzRSwweEZGM0YsLyogMHhEOC0weERGICovCisJMHhGRjQwLDB4RkY0MSwweEZGNDIsMHhGRjQzLDB4RkY0NCwweEZGNDUsMHhGRjQ2LDB4RkY0NywvKiAweEUwLTB4RTcgKi8KKwkweEZGNDgsMHhGRjQ5LDB4RkY0QSwweEZGNEIsMHhGRjRDLDB4RkY0RCwweEZGNEUsMHhGRjRGLC8qIDB4RTgtMHhFRiAqLworCTB4RkY1MCwweEZGNTEsMHhGRjUyLDB4RkY1MywweEZGNTQsMHhGRjU1LDB4RkY1NiwweEZGNTcsLyogMHhGMC0weEY3ICovCisJMHhGRjU4LDB4RkY1OSwweEZGNUEsMHhGRjVCLDB4RkY1QywweEZGNUQsMHhGRkUzLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BNFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDMwNDEsMHgzMDQyLDB4MzA0MywweDMwNDQsMHgzMDQ1LDB4MzA0NiwweDMwNDcsLyogMHhBMC0weEE3ICovCisJMHgzMDQ4LDB4MzA0OSwweDMwNEEsMHgzMDRCLDB4MzA0QywweDMwNEQsMHgzMDRFLDB4MzA0RiwvKiAweEE4LTB4QUYgKi8KKwkweDMwNTAsMHgzMDUxLDB4MzA1MiwweDMwNTMsMHgzMDU0LDB4MzA1NSwweDMwNTYsMHgzMDU3LC8qIDB4QjAtMHhCNyAqLworCTB4MzA1OCwweDMwNTksMHgzMDVBLDB4MzA1QiwweDMwNUMsMHgzMDVELDB4MzA1RSwweDMwNUYsLyogMHhCOC0weEJGICovCisJMHgzMDYwLDB4MzA2MSwweDMwNjIsMHgzMDYzLDB4MzA2NCwweDMwNjUsMHgzMDY2LDB4MzA2NywvKiAweEMwLTB4QzcgKi8KKwkweDMwNjgsMHgzMDY5LDB4MzA2QSwweDMwNkIsMHgzMDZDLDB4MzA2RCwweDMwNkUsMHgzMDZGLC8qIDB4QzgtMHhDRiAqLworCTB4MzA3MCwweDMwNzEsMHgzMDcyLDB4MzA3MywweDMwNzQsMHgzMDc1LDB4MzA3NiwweDMwNzcsLyogMHhEMC0weEQ3ICovCisJMHgzMDc4LDB4MzA3OSwweDMwN0EsMHgzMDdCLDB4MzA3QywweDMwN0QsMHgzMDdFLDB4MzA3RiwvKiAweEQ4LTB4REYgKi8KKwkweDMwODAsMHgzMDgxLDB4MzA4MiwweDMwODMsMHgzMDg0LDB4MzA4NSwweDMwODYsMHgzMDg3LC8qIDB4RTAtMHhFNyAqLworCTB4MzA4OCwweDMwODksMHgzMDhBLDB4MzA4QiwweDMwOEMsMHgzMDhELDB4MzA4RSwweDMwOEYsLyogMHhFOC0weEVGICovCisJMHgzMDkwLDB4MzA5MSwweDMwOTIsMHgzMDkzLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEYwLTB4RjcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BNVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDMwQTEsMHgzMEEyLDB4MzBBMywweDMwQTQsMHgzMEE1LDB4MzBBNiwweDMwQTcsLyogMHhBMC0weEE3ICovCisJMHgzMEE4LDB4MzBBOSwweDMwQUEsMHgzMEFCLDB4MzBBQywweDMwQUQsMHgzMEFFLDB4MzBBRiwvKiAweEE4LTB4QUYgKi8KKwkweDMwQjAsMHgzMEIxLDB4MzBCMiwweDMwQjMsMHgzMEI0LDB4MzBCNSwweDMwQjYsMHgzMEI3LC8qIDB4QjAtMHhCNyAqLworCTB4MzBCOCwweDMwQjksMHgzMEJBLDB4MzBCQiwweDMwQkMsMHgzMEJELDB4MzBCRSwweDMwQkYsLyogMHhCOC0weEJGICovCisJMHgzMEMwLDB4MzBDMSwweDMwQzIsMHgzMEMzLDB4MzBDNCwweDMwQzUsMHgzMEM2LDB4MzBDNywvKiAweEMwLTB4QzcgKi8KKwkweDMwQzgsMHgzMEM5LDB4MzBDQSwweDMwQ0IsMHgzMENDLDB4MzBDRCwweDMwQ0UsMHgzMENGLC8qIDB4QzgtMHhDRiAqLworCTB4MzBEMCwweDMwRDEsMHgzMEQyLDB4MzBEMywweDMwRDQsMHgzMEQ1LDB4MzBENiwweDMwRDcsLyogMHhEMC0weEQ3ICovCisJMHgzMEQ4LDB4MzBEOSwweDMwREEsMHgzMERCLDB4MzBEQywweDMwREQsMHgzMERFLDB4MzBERiwvKiAweEQ4LTB4REYgKi8KKwkweDMwRTAsMHgzMEUxLDB4MzBFMiwweDMwRTMsMHgzMEU0LDB4MzBFNSwweDMwRTYsMHgzMEU3LC8qIDB4RTAtMHhFNyAqLworCTB4MzBFOCwweDMwRTksMHgzMEVBLDB4MzBFQiwweDMwRUMsMHgzMEVELDB4MzBFRSwweDMwRUYsLyogMHhFOC0weEVGICovCisJMHgzMEYwLDB4MzBGMSwweDMwRjIsMHgzMEYzLDB4MzBGNCwweDMwRjUsMHgzMEY2LDB4MDAwMCwvKiAweEYwLTB4RjcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BNlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDAzOTEsMHgwMzkyLDB4MDM5MywweDAzOTQsMHgwMzk1LDB4MDM5NiwweDAzOTcsLyogMHhBMC0weEE3ICovCisJMHgwMzk4LDB4MDM5OSwweDAzOUEsMHgwMzlCLDB4MDM5QywweDAzOUQsMHgwMzlFLDB4MDM5RiwvKiAweEE4LTB4QUYgKi8KKwkweDAzQTAsMHgwM0ExLDB4MDNBMywweDAzQTQsMHgwM0E1LDB4MDNBNiwweDAzQTcsMHgwM0E4LC8qIDB4QjAtMHhCNyAqLworCTB4MDNBOSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhCOC0weEJGICovCisJMHgwMDAwLDB4MDNCMSwweDAzQjIsMHgwM0IzLDB4MDNCNCwweDAzQjUsMHgwM0I2LDB4MDNCNywvKiAweEMwLTB4QzcgKi8KKwkweDAzQjgsMHgwM0I5LDB4MDNCQSwweDAzQkIsMHgwM0JDLDB4MDNCRCwweDAzQkUsMHgwM0JGLC8qIDB4QzgtMHhDRiAqLworCTB4MDNDMCwweDAzQzEsMHgwM0MzLDB4MDNDNCwweDAzQzUsMHgwM0M2LDB4MDNDNywweDAzQzgsLyogMHhEMC0weEQ3ICovCisJMHgwM0M5LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEQ4LTB4REYgKi8KKwkweEZFMzUsMHhGRTM2LDB4RkUzOSwweEZFM0EsMHhGRTNGLDB4RkU0MCwweEZFM0QsMHhGRTNFLC8qIDB4RTAtMHhFNyAqLworCTB4RkU0MSwweEZFNDIsMHhGRTQzLDB4RkU0NCwweDAwMDAsMHgwMDAwLDB4RkUzQiwweEZFM0MsLyogMHhFOC0weEVGICovCisJMHhGRTM3LDB4RkUzOCwweEZFMzEsMHgwMDAwLDB4RkUzMywweEZFMzQsMHgwMDAwLDB4MDAwMCwvKiAweEYwLTB4RjcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BN1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDA0MTAsMHgwNDExLDB4MDQxMiwweDA0MTMsMHgwNDE0LDB4MDQxNSwweDA0MDEsLyogMHhBMC0weEE3ICovCisJMHgwNDE2LDB4MDQxNywweDA0MTgsMHgwNDE5LDB4MDQxQSwweDA0MUIsMHgwNDFDLDB4MDQxRCwvKiAweEE4LTB4QUYgKi8KKwkweDA0MUUsMHgwNDFGLDB4MDQyMCwweDA0MjEsMHgwNDIyLDB4MDQyMywweDA0MjQsMHgwNDI1LC8qIDB4QjAtMHhCNyAqLworCTB4MDQyNiwweDA0MjcsMHgwNDI4LDB4MDQyOSwweDA0MkEsMHgwNDJCLDB4MDQyQywweDA0MkQsLyogMHhCOC0weEJGICovCisJMHgwNDJFLDB4MDQyRiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEMwLTB4QzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QzgtMHhDRiAqLworCTB4MDAwMCwweDA0MzAsMHgwNDMxLDB4MDQzMiwweDA0MzMsMHgwNDM0LDB4MDQzNSwweDA0NTEsLyogMHhEMC0weEQ3ICovCisJMHgwNDM2LDB4MDQzNywweDA0MzgsMHgwNDM5LDB4MDQzQSwweDA0M0IsMHgwNDNDLDB4MDQzRCwvKiAweEQ4LTB4REYgKi8KKwkweDA0M0UsMHgwNDNGLDB4MDQ0MCwweDA0NDEsMHgwNDQyLDB4MDQ0MywweDA0NDQsMHgwNDQ1LC8qIDB4RTAtMHhFNyAqLworCTB4MDQ0NiwweDA0NDcsMHgwNDQ4LDB4MDQ0OSwweDA0NEEsMHgwNDRCLDB4MDQ0QywweDA0NEQsLyogMHhFOC0weEVGICovCisJMHgwNDRFLDB4MDQ0RiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEYwLTB4RjcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BOFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAyQ0EsMHgwMkNCLDB4MDJEOSwweDIwMTMsMHgyMDE1LDB4MjAyNSwweDIwMzUsMHgyMTA1LC8qIDB4NDAtMHg0NyAqLworCTB4MjEwOSwweDIxOTYsMHgyMTk3LDB4MjE5OCwweDIxOTksMHgyMjE1LDB4MjIxRiwweDIyMjMsLyogMHg0OC0weDRGICovCisJMHgyMjUyLDB4MjI2NiwweDIyNjcsMHgyMkJGLDB4MjU1MCwweDI1NTEsMHgyNTUyLDB4MjU1MywvKiAweDUwLTB4NTcgKi8KKwkweDI1NTQsMHgyNTU1LDB4MjU1NiwweDI1NTcsMHgyNTU4LDB4MjU1OSwweDI1NUEsMHgyNTVCLC8qIDB4NTgtMHg1RiAqLworCTB4MjU1QywweDI1NUQsMHgyNTVFLDB4MjU1RiwweDI1NjAsMHgyNTYxLDB4MjU2MiwweDI1NjMsLyogMHg2MC0weDY3ICovCisJMHgyNTY0LDB4MjU2NSwweDI1NjYsMHgyNTY3LDB4MjU2OCwweDI1NjksMHgyNTZBLDB4MjU2QiwvKiAweDY4LTB4NkYgKi8KKwkweDI1NkMsMHgyNTZELDB4MjU2RSwweDI1NkYsMHgyNTcwLDB4MjU3MSwweDI1NzIsMHgyNTczLC8qIDB4NzAtMHg3NyAqLworCTB4MjU4MSwweDI1ODIsMHgyNTgzLDB4MjU4NCwweDI1ODUsMHgyNTg2LDB4MjU4NywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDI1ODgsMHgyNTg5LDB4MjU4QSwweDI1OEIsMHgyNThDLDB4MjU4RCwweDI1OEUsMHgyNThGLC8qIDB4ODAtMHg4NyAqLworCTB4MjU5MywweDI1OTQsMHgyNTk1LDB4MjVCQywweDI1QkQsMHgyNUUyLDB4MjVFMywweDI1RTQsLyogMHg4OC0weDhGICovCisJMHgyNUU1LDB4MjYwOSwweDIyOTUsMHgzMDEyLDB4MzAxRCwweDMwMUUsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDAxMDEsMHgwMEUxLDB4MDFDRSwweDAwRTAsMHgwMTEzLDB4MDBFOSwweDAxMUIsLyogMHhBMC0weEE3ICovCisJMHgwMEU4LDB4MDEyQiwweDAwRUQsMHgwMUQwLDB4MDBFQywweDAxNEQsMHgwMEYzLDB4MDFEMiwvKiAweEE4LTB4QUYgKi8KKwkweDAwRjIsMHgwMTZCLDB4MDBGQSwweDAxRDQsMHgwMEY5LDB4MDFENiwweDAxRDgsMHgwMURBLC8qIDB4QjAtMHhCNyAqLworCTB4MDFEQywweDAwRkMsMHgwMEVBLDB4MDI1MSwweDAwMDAsMHgwMTQ0LDB4MDE0OCwweDAwMDAsLyogMHhCOC0weEJGICovCisJMHgwMjYxLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDMxMDUsMHgzMTA2LDB4MzEwNywvKiAweEMwLTB4QzcgKi8KKwkweDMxMDgsMHgzMTA5LDB4MzEwQSwweDMxMEIsMHgzMTBDLDB4MzEwRCwweDMxMEUsMHgzMTBGLC8qIDB4QzgtMHhDRiAqLworCTB4MzExMCwweDMxMTEsMHgzMTEyLDB4MzExMywweDMxMTQsMHgzMTE1LDB4MzExNiwweDMxMTcsLyogMHhEMC0weEQ3ICovCisJMHgzMTE4LDB4MzExOSwweDMxMUEsMHgzMTFCLDB4MzExQywweDMxMUQsMHgzMTFFLDB4MzExRiwvKiAweEQ4LTB4REYgKi8KKwkweDMxMjAsMHgzMTIxLDB4MzEyMiwweDMxMjMsMHgzMTI0LDB4MzEyNSwweDMxMjYsMHgzMTI3LC8qIDB4RTAtMHhFNyAqLworCTB4MzEyOCwweDMxMjksMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhFOC0weEVGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQTlbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgzMDIxLDB4MzAyMiwweDMwMjMsMHgzMDI0LDB4MzAyNSwweDMwMjYsMHgzMDI3LDB4MzAyOCwvKiAweDQwLTB4NDcgKi8KKwkweDMwMjksMHgzMkEzLDB4MzM4RSwweDMzOEYsMHgzMzlDLDB4MzM5RCwweDMzOUUsMHgzM0ExLC8qIDB4NDgtMHg0RiAqLworCTB4MzNDNCwweDMzQ0UsMHgzM0QxLDB4MzNEMiwweDMzRDUsMHhGRTMwLDB4RkZFMiwweEZGRTQsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MjEyMSwweDMyMzEsMHgwMDAwLDB4MjAxMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDMwRkMsMHgzMDlCLDB4MzA5QywweDMwRkQsMHgzMEZFLDB4MzAwNiwweDMwOUQsMHgzMDlFLC8qIDB4NjAtMHg2NyAqLworCTB4RkU0OSwweEZFNEEsMHhGRTRCLDB4RkU0QywweEZFNEQsMHhGRTRFLDB4RkU0RiwweEZFNTAsLyogMHg2OC0weDZGICovCisJMHhGRTUxLDB4RkU1MiwweEZFNTQsMHhGRTU1LDB4RkU1NiwweEZFNTcsMHhGRTU5LDB4RkU1QSwvKiAweDcwLTB4NzcgKi8KKwkweEZFNUIsMHhGRTVDLDB4RkU1RCwweEZFNUUsMHhGRTVGLDB4RkU2MCwweEZFNjEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHhGRTYyLDB4RkU2MywweEZFNjQsMHhGRTY1LDB4RkU2NiwweEZFNjgsMHhGRTY5LDB4RkU2QSwvKiAweDgwLTB4ODcgKi8KKwkweEZFNkIsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MzAwNywweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgyNTAwLDB4MjUwMSwweDI1MDIsMHgyNTAzLC8qIDB4QTAtMHhBNyAqLworCTB4MjUwNCwweDI1MDUsMHgyNTA2LDB4MjUwNywweDI1MDgsMHgyNTA5LDB4MjUwQSwweDI1MEIsLyogMHhBOC0weEFGICovCisJMHgyNTBDLDB4MjUwRCwweDI1MEUsMHgyNTBGLDB4MjUxMCwweDI1MTEsMHgyNTEyLDB4MjUxMywvKiAweEIwLTB4QjcgKi8KKwkweDI1MTQsMHgyNTE1LDB4MjUxNiwweDI1MTcsMHgyNTE4LDB4MjUxOSwweDI1MUEsMHgyNTFCLC8qIDB4QjgtMHhCRiAqLworCTB4MjUxQywweDI1MUQsMHgyNTFFLDB4MjUxRiwweDI1MjAsMHgyNTIxLDB4MjUyMiwweDI1MjMsLyogMHhDMC0weEM3ICovCisJMHgyNTI0LDB4MjUyNSwweDI1MjYsMHgyNTI3LDB4MjUyOCwweDI1MjksMHgyNTJBLDB4MjUyQiwvKiAweEM4LTB4Q0YgKi8KKwkweDI1MkMsMHgyNTJELDB4MjUyRSwweDI1MkYsMHgyNTMwLDB4MjUzMSwweDI1MzIsMHgyNTMzLC8qIDB4RDAtMHhENyAqLworCTB4MjUzNCwweDI1MzUsMHgyNTM2LDB4MjUzNywweDI1MzgsMHgyNTM5LDB4MjUzQSwweDI1M0IsLyogMHhEOC0weERGICovCisJMHgyNTNDLDB4MjUzRCwweDI1M0UsMHgyNTNGLDB4MjU0MCwweDI1NDEsMHgyNTQyLDB4MjU0MywvKiAweEUwLTB4RTcgKi8KKwkweDI1NDQsMHgyNTQ1LDB4MjU0NiwweDI1NDcsMHgyNTQ4LDB4MjU0OSwweDI1NEEsMHgyNTRCLC8qIDB4RTgtMHhFRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0FBWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NzJEQywweDcyREQsMHg3MkRGLDB4NzJFMiwweDcyRTMsMHg3MkU0LDB4NzJFNSwweDcyRTYsLyogMHg0MC0weDQ3ICovCisJMHg3MkU3LDB4NzJFQSwweDcyRUIsMHg3MkY1LDB4NzJGNiwweDcyRjksMHg3MkZELDB4NzJGRSwvKiAweDQ4LTB4NEYgKi8KKwkweDcyRkYsMHg3MzAwLDB4NzMwMiwweDczMDQsMHg3MzA1LDB4NzMwNiwweDczMDcsMHg3MzA4LC8qIDB4NTAtMHg1NyAqLworCTB4NzMwOSwweDczMEIsMHg3MzBDLDB4NzMwRCwweDczMEYsMHg3MzEwLDB4NzMxMSwweDczMTIsLyogMHg1OC0weDVGICovCisJMHg3MzE0LDB4NzMxOCwweDczMTksMHg3MzFBLDB4NzMxRiwweDczMjAsMHg3MzIzLDB4NzMyNCwvKiAweDYwLTB4NjcgKi8KKwkweDczMjYsMHg3MzI3LDB4NzMyOCwweDczMkQsMHg3MzJGLDB4NzMzMCwweDczMzIsMHg3MzMzLC8qIDB4NjgtMHg2RiAqLworCTB4NzMzNSwweDczMzYsMHg3MzNBLDB4NzMzQiwweDczM0MsMHg3MzNELDB4NzM0MCwweDczNDEsLyogMHg3MC0weDc3ICovCisJMHg3MzQyLDB4NzM0MywweDczNDQsMHg3MzQ1LDB4NzM0NiwweDczNDcsMHg3MzQ4LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NzM0OSwweDczNEEsMHg3MzRCLDB4NzM0QywweDczNEUsMHg3MzRGLDB4NzM1MSwweDczNTMsLyogMHg4MC0weDg3ICovCisJMHg3MzU0LDB4NzM1NSwweDczNTYsMHg3MzU4LDB4NzM1OSwweDczNUEsMHg3MzVCLDB4NzM1QywvKiAweDg4LTB4OEYgKi8KKwkweDczNUQsMHg3MzVFLDB4NzM1RiwweDczNjEsMHg3MzYyLDB4NzM2MywweDczNjQsMHg3MzY1LC8qIDB4OTAtMHg5NyAqLworCTB4NzM2NiwweDczNjcsMHg3MzY4LDB4NzM2OSwweDczNkEsMHg3MzZCLDB4NzM2RSwweDczNzAsLyogMHg5OC0weDlGICovCisJMHg3MzcxLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEEwLTB4QTcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BQlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDczNzIsMHg3MzczLDB4NzM3NCwweDczNzUsMHg3Mzc2LDB4NzM3NywweDczNzgsMHg3Mzc5LC8qIDB4NDAtMHg0NyAqLworCTB4NzM3QSwweDczN0IsMHg3MzdDLDB4NzM3RCwweDczN0YsMHg3MzgwLDB4NzM4MSwweDczODIsLyogMHg0OC0weDRGICovCisJMHg3MzgzLDB4NzM4NSwweDczODYsMHg3Mzg4LDB4NzM4QSwweDczOEMsMHg3MzhELDB4NzM4RiwvKiAweDUwLTB4NTcgKi8KKwkweDczOTAsMHg3MzkyLDB4NzM5MywweDczOTQsMHg3Mzk1LDB4NzM5NywweDczOTgsMHg3Mzk5LC8qIDB4NTgtMHg1RiAqLworCTB4NzM5QSwweDczOUMsMHg3MzlELDB4NzM5RSwweDczQTAsMHg3M0ExLDB4NzNBMywweDczQTQsLyogMHg2MC0weDY3ICovCisJMHg3M0E1LDB4NzNBNiwweDczQTcsMHg3M0E4LDB4NzNBQSwweDczQUMsMHg3M0FELDB4NzNCMSwvKiAweDY4LTB4NkYgKi8KKwkweDczQjQsMHg3M0I1LDB4NzNCNiwweDczQjgsMHg3M0I5LDB4NzNCQywweDczQkQsMHg3M0JFLC8qIDB4NzAtMHg3NyAqLworCTB4NzNCRiwweDczQzEsMHg3M0MzLDB4NzNDNCwweDczQzUsMHg3M0M2LDB4NzNDNywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDczQ0IsMHg3M0NDLDB4NzNDRSwweDczRDIsMHg3M0QzLDB4NzNENCwweDczRDUsMHg3M0Q2LC8qIDB4ODAtMHg4NyAqLworCTB4NzNENywweDczRDgsMHg3M0RBLDB4NzNEQiwweDczREMsMHg3M0RELDB4NzNERiwweDczRTEsLyogMHg4OC0weDhGICovCisJMHg3M0UyLDB4NzNFMywweDczRTQsMHg3M0U2LDB4NzNFOCwweDczRUEsMHg3M0VCLDB4NzNFQywvKiAweDkwLTB4OTcgKi8KKwkweDczRUUsMHg3M0VGLDB4NzNGMCwweDczRjEsMHg3M0YzLDB4NzNGNCwweDczRjUsMHg3M0Y2LC8qIDB4OTgtMHg5RiAqLworCTB4NzNGNywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhBMC0weEE3ICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQUNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3M0Y4LDB4NzNGOSwweDczRkEsMHg3M0ZCLDB4NzNGQywweDczRkQsMHg3M0ZFLDB4NzNGRiwvKiAweDQwLTB4NDcgKi8KKwkweDc0MDAsMHg3NDAxLDB4NzQwMiwweDc0MDQsMHg3NDA3LDB4NzQwOCwweDc0MEIsMHg3NDBDLC8qIDB4NDgtMHg0RiAqLworCTB4NzQwRCwweDc0MEUsMHg3NDExLDB4NzQxMiwweDc0MTMsMHg3NDE0LDB4NzQxNSwweDc0MTYsLyogMHg1MC0weDU3ICovCisJMHg3NDE3LDB4NzQxOCwweDc0MTksMHg3NDFDLDB4NzQxRCwweDc0MUUsMHg3NDFGLDB4NzQyMCwvKiAweDU4LTB4NUYgKi8KKwkweDc0MjEsMHg3NDIzLDB4NzQyNCwweDc0MjcsMHg3NDI5LDB4NzQyQiwweDc0MkQsMHg3NDJGLC8qIDB4NjAtMHg2NyAqLworCTB4NzQzMSwweDc0MzIsMHg3NDM3LDB4NzQzOCwweDc0MzksMHg3NDNBLDB4NzQzQiwweDc0M0QsLyogMHg2OC0weDZGICovCisJMHg3NDNFLDB4NzQzRiwweDc0NDAsMHg3NDQyLDB4NzQ0MywweDc0NDQsMHg3NDQ1LDB4NzQ0NiwvKiAweDcwLTB4NzcgKi8KKwkweDc0NDcsMHg3NDQ4LDB4NzQ0OSwweDc0NEEsMHg3NDRCLDB4NzQ0QywweDc0NEQsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3NDRFLDB4NzQ0RiwweDc0NTAsMHg3NDUxLDB4NzQ1MiwweDc0NTMsMHg3NDU0LDB4NzQ1NiwvKiAweDgwLTB4ODcgKi8KKwkweDc0NTgsMHg3NDVELDB4NzQ2MCwweDc0NjEsMHg3NDYyLDB4NzQ2MywweDc0NjQsMHg3NDY1LC8qIDB4ODgtMHg4RiAqLworCTB4NzQ2NiwweDc0NjcsMHg3NDY4LDB4NzQ2OSwweDc0NkEsMHg3NDZCLDB4NzQ2QywweDc0NkUsLyogMHg5MC0weDk3ICovCisJMHg3NDZGLDB4NzQ3MSwweDc0NzIsMHg3NDczLDB4NzQ3NCwweDc0NzUsMHg3NDc4LDB4NzQ3OSwvKiAweDk4LTB4OUYgKi8KKwkweDc0N0EsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QTAtMHhBNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0FEWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NzQ3QiwweDc0N0MsMHg3NDdELDB4NzQ3RiwweDc0ODIsMHg3NDg0LDB4NzQ4NSwweDc0ODYsLyogMHg0MC0weDQ3ICovCisJMHg3NDg4LDB4NzQ4OSwweDc0OEEsMHg3NDhDLDB4NzQ4RCwweDc0OEYsMHg3NDkxLDB4NzQ5MiwvKiAweDQ4LTB4NEYgKi8KKwkweDc0OTMsMHg3NDk0LDB4NzQ5NSwweDc0OTYsMHg3NDk3LDB4NzQ5OCwweDc0OTksMHg3NDlBLC8qIDB4NTAtMHg1NyAqLworCTB4NzQ5QiwweDc0OUQsMHg3NDlGLDB4NzRBMCwweDc0QTEsMHg3NEEyLDB4NzRBMywweDc0QTQsLyogMHg1OC0weDVGICovCisJMHg3NEE1LDB4NzRBNiwweDc0QUEsMHg3NEFCLDB4NzRBQywweDc0QUQsMHg3NEFFLDB4NzRBRiwvKiAweDYwLTB4NjcgKi8KKwkweDc0QjAsMHg3NEIxLDB4NzRCMiwweDc0QjMsMHg3NEI0LDB4NzRCNSwweDc0QjYsMHg3NEI3LC8qIDB4NjgtMHg2RiAqLworCTB4NzRCOCwweDc0QjksMHg3NEJCLDB4NzRCQywweDc0QkQsMHg3NEJFLDB4NzRCRiwweDc0QzAsLyogMHg3MC0weDc3ICovCisJMHg3NEMxLDB4NzRDMiwweDc0QzMsMHg3NEM0LDB4NzRDNSwweDc0QzYsMHg3NEM3LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NzRDOCwweDc0QzksMHg3NENBLDB4NzRDQiwweDc0Q0MsMHg3NENELDB4NzRDRSwweDc0Q0YsLyogMHg4MC0weDg3ICovCisJMHg3NEQwLDB4NzREMSwweDc0RDMsMHg3NEQ0LDB4NzRENSwweDc0RDYsMHg3NEQ3LDB4NzREOCwvKiAweDg4LTB4OEYgKi8KKwkweDc0RDksMHg3NERBLDB4NzREQiwweDc0REQsMHg3NERGLDB4NzRFMSwweDc0RTUsMHg3NEU3LC8qIDB4OTAtMHg5NyAqLworCTB4NzRFOCwweDc0RTksMHg3NEVBLDB4NzRFQiwweDc0RUMsMHg3NEVELDB4NzRGMCwweDc0RjEsLyogMHg5OC0weDlGICovCisJMHg3NEYyLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEEwLTB4QTcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BRVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDc0RjMsMHg3NEY1LDB4NzRGOCwweDc0RjksMHg3NEZBLDB4NzRGQiwweDc0RkMsMHg3NEZELC8qIDB4NDAtMHg0NyAqLworCTB4NzRGRSwweDc1MDAsMHg3NTAxLDB4NzUwMiwweDc1MDMsMHg3NTA1LDB4NzUwNiwweDc1MDcsLyogMHg0OC0weDRGICovCisJMHg3NTA4LDB4NzUwOSwweDc1MEEsMHg3NTBCLDB4NzUwQywweDc1MEUsMHg3NTEwLDB4NzUxMiwvKiAweDUwLTB4NTcgKi8KKwkweDc1MTQsMHg3NTE1LDB4NzUxNiwweDc1MTcsMHg3NTFCLDB4NzUxRCwweDc1MUUsMHg3NTIwLC8qIDB4NTgtMHg1RiAqLworCTB4NzUyMSwweDc1MjIsMHg3NTIzLDB4NzUyNCwweDc1MjYsMHg3NTI3LDB4NzUyQSwweDc1MkUsLyogMHg2MC0weDY3ICovCisJMHg3NTM0LDB4NzUzNiwweDc1MzksMHg3NTNDLDB4NzUzRCwweDc1M0YsMHg3NTQxLDB4NzU0MiwvKiAweDY4LTB4NkYgKi8KKwkweDc1NDMsMHg3NTQ0LDB4NzU0NiwweDc1NDcsMHg3NTQ5LDB4NzU0QSwweDc1NEQsMHg3NTUwLC8qIDB4NzAtMHg3NyAqLworCTB4NzU1MSwweDc1NTIsMHg3NTUzLDB4NzU1NSwweDc1NTYsMHg3NTU3LDB4NzU1OCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDc1NUQsMHg3NTVFLDB4NzU1RiwweDc1NjAsMHg3NTYxLDB4NzU2MiwweDc1NjMsMHg3NTY0LC8qIDB4ODAtMHg4NyAqLworCTB4NzU2NywweDc1NjgsMHg3NTY5LDB4NzU2QiwweDc1NkMsMHg3NTZELDB4NzU2RSwweDc1NkYsLyogMHg4OC0weDhGICovCisJMHg3NTcwLDB4NzU3MSwweDc1NzMsMHg3NTc1LDB4NzU3NiwweDc1NzcsMHg3NTdBLDB4NzU3QiwvKiAweDkwLTB4OTcgKi8KKwkweDc1N0MsMHg3NTdELDB4NzU3RSwweDc1ODAsMHg3NTgxLDB4NzU4MiwweDc1ODQsMHg3NTg1LC8qIDB4OTgtMHg5RiAqLworCTB4NzU4NywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhBMC0weEE3ICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQUZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3NTg4LDB4NzU4OSwweDc1OEEsMHg3NThDLDB4NzU4RCwweDc1OEUsMHg3NTkwLDB4NzU5MywvKiAweDQwLTB4NDcgKi8KKwkweDc1OTUsMHg3NTk4LDB4NzU5QiwweDc1OUMsMHg3NTlFLDB4NzVBMiwweDc1QTYsMHg3NUE3LC8qIDB4NDgtMHg0RiAqLworCTB4NzVBOCwweDc1QTksMHg3NUFBLDB4NzVBRCwweDc1QjYsMHg3NUI3LDB4NzVCQSwweDc1QkIsLyogMHg1MC0weDU3ICovCisJMHg3NUJGLDB4NzVDMCwweDc1QzEsMHg3NUM2LDB4NzVDQiwweDc1Q0MsMHg3NUNFLDB4NzVDRiwvKiAweDU4LTB4NUYgKi8KKwkweDc1RDAsMHg3NUQxLDB4NzVEMywweDc1RDcsMHg3NUQ5LDB4NzVEQSwweDc1REMsMHg3NURELC8qIDB4NjAtMHg2NyAqLworCTB4NzVERiwweDc1RTAsMHg3NUUxLDB4NzVFNSwweDc1RTksMHg3NUVDLDB4NzVFRCwweDc1RUUsLyogMHg2OC0weDZGICovCisJMHg3NUVGLDB4NzVGMiwweDc1RjMsMHg3NUY1LDB4NzVGNiwweDc1RjcsMHg3NUY4LDB4NzVGQSwvKiAweDcwLTB4NzcgKi8KKwkweDc1RkIsMHg3NUZELDB4NzVGRSwweDc2MDIsMHg3NjA0LDB4NzYwNiwweDc2MDcsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3NjA4LDB4NzYwOSwweDc2MEIsMHg3NjBELDB4NzYwRSwweDc2MEYsMHg3NjExLDB4NzYxMiwvKiAweDgwLTB4ODcgKi8KKwkweDc2MTMsMHg3NjE0LDB4NzYxNiwweDc2MUEsMHg3NjFDLDB4NzYxRCwweDc2MUUsMHg3NjIxLC8qIDB4ODgtMHg4RiAqLworCTB4NzYyMywweDc2MjcsMHg3NjI4LDB4NzYyQywweDc2MkUsMHg3NjJGLDB4NzYzMSwweDc2MzIsLyogMHg5MC0weDk3ICovCisJMHg3NjM2LDB4NzYzNywweDc2MzksMHg3NjNBLDB4NzYzQiwweDc2M0QsMHg3NjQxLDB4NzY0MiwvKiAweDk4LTB4OUYgKi8KKwkweDc2NDQsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QTAtMHhBNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0IwWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NzY0NSwweDc2NDYsMHg3NjQ3LDB4NzY0OCwweDc2NDksMHg3NjRBLDB4NzY0QiwweDc2NEUsLyogMHg0MC0weDQ3ICovCisJMHg3NjRGLDB4NzY1MCwweDc2NTEsMHg3NjUyLDB4NzY1MywweDc2NTUsMHg3NjU3LDB4NzY1OCwvKiAweDQ4LTB4NEYgKi8KKwkweDc2NTksMHg3NjVBLDB4NzY1QiwweDc2NUQsMHg3NjVGLDB4NzY2MCwweDc2NjEsMHg3NjYyLC8qIDB4NTAtMHg1NyAqLworCTB4NzY2NCwweDc2NjUsMHg3NjY2LDB4NzY2NywweDc2NjgsMHg3NjY5LDB4NzY2QSwweDc2NkMsLyogMHg1OC0weDVGICovCisJMHg3NjZELDB4NzY2RSwweDc2NzAsMHg3NjcxLDB4NzY3MiwweDc2NzMsMHg3Njc0LDB4NzY3NSwvKiAweDYwLTB4NjcgKi8KKwkweDc2NzYsMHg3Njc3LDB4NzY3OSwweDc2N0EsMHg3NjdDLDB4NzY3RiwweDc2ODAsMHg3NjgxLC8qIDB4NjgtMHg2RiAqLworCTB4NzY4MywweDc2ODUsMHg3Njg5LDB4NzY4QSwweDc2OEMsMHg3NjhELDB4NzY4RiwweDc2OTAsLyogMHg3MC0weDc3ICovCisJMHg3NjkyLDB4NzY5NCwweDc2OTUsMHg3Njk3LDB4NzY5OCwweDc2OUEsMHg3NjlCLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NzY5QywweDc2OUQsMHg3NjlFLDB4NzY5RiwweDc2QTAsMHg3NkExLDB4NzZBMiwweDc2QTMsLyogMHg4MC0weDg3ICovCisJMHg3NkE1LDB4NzZBNiwweDc2QTcsMHg3NkE4LDB4NzZBOSwweDc2QUEsMHg3NkFCLDB4NzZBQywvKiAweDg4LTB4OEYgKi8KKwkweDc2QUQsMHg3NkFGLDB4NzZCMCwweDc2QjMsMHg3NkI1LDB4NzZCNiwweDc2QjcsMHg3NkI4LC8qIDB4OTAtMHg5NyAqLworCTB4NzZCOSwweDc2QkEsMHg3NkJCLDB4NzZCQywweDc2QkQsMHg3NkJFLDB4NzZDMCwweDc2QzEsLyogMHg5OC0weDlGICovCisJMHg3NkMzLDB4NTU0QSwweDk2M0YsMHg1N0MzLDB4NjMyOCwweDU0Q0UsMHg1NTA5LDB4NTRDMCwvKiAweEEwLTB4QTcgKi8KKwkweDc2OTEsMHg3NjRDLDB4ODUzQywweDc3RUUsMHg4MjdFLDB4Nzg4RCwweDcyMzEsMHg5Njk4LC8qIDB4QTgtMHhBRiAqLworCTB4OTc4RCwweDZDMjgsMHg1Qjg5LDB4NEZGQSwweDYzMDksMHg2Njk3LDB4NUNCOCwweDgwRkEsLyogMHhCMC0weEI3ICovCisJMHg2ODQ4LDB4ODBBRSwweDY2MDIsMHg3NkNFLDB4NTFGOSwweDY1NTYsMHg3MUFDLDB4N0ZGMSwvKiAweEI4LTB4QkYgKi8KKwkweDg4ODQsMHg1MEIyLDB4NTk2NSwweDYxQ0EsMHg2RkIzLDB4ODJBRCwweDYzNEMsMHg2MjUyLC8qIDB4QzAtMHhDNyAqLworCTB4NTNFRCwweDU0MjcsMHg3QjA2LDB4NTE2QiwweDc1QTQsMHg1REY0LDB4NjJENCwweDhEQ0IsLyogMHhDOC0weENGICovCisJMHg5Nzc2LDB4NjI4QSwweDgwMTksMHg1NzVELDB4OTczOCwweDdGNjIsMHg3MjM4LDB4NzY3RCwvKiAweEQwLTB4RDcgKi8KKwkweDY3Q0YsMHg3NjdFLDB4NjQ0NiwweDRGNzAsMHg4RDI1LDB4NjJEQywweDdBMTcsMHg2NTkxLC8qIDB4RDgtMHhERiAqLworCTB4NzNFRCwweDY0MkMsMHg2MjczLDB4ODIyQywweDk4ODEsMHg2NzdGLDB4NzI0OCwweDYyNkUsLyogMHhFMC0weEU3ICovCisJMHg2MkNDLDB4NEYzNCwweDc0RTMsMHg1MzRBLDB4NTI5RSwweDdFQ0EsMHg5MEE2LDB4NUUyRSwvKiAweEU4LTB4RUYgKi8KKwkweDY4ODYsMHg2OTlDLDB4ODE4MCwweDdFRDEsMHg2OEQyLDB4NzhDNSwweDg2OEMsMHg5NTUxLC8qIDB4RjAtMHhGNyAqLworCTB4NTA4RCwweDhDMjQsMHg4MkRFLDB4ODBERSwweDUzMDUsMHg4OTEyLDB4NTI2NSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3NkM0LDB4NzZDNywweDc2QzksMHg3NkNCLDB4NzZDQywweDc2RDMsMHg3NkQ1LDB4NzZEOSwvKiAweDQwLTB4NDcgKi8KKwkweDc2REEsMHg3NkRDLDB4NzZERCwweDc2REUsMHg3NkUwLDB4NzZFMSwweDc2RTIsMHg3NkUzLC8qIDB4NDgtMHg0RiAqLworCTB4NzZFNCwweDc2RTYsMHg3NkU3LDB4NzZFOCwweDc2RTksMHg3NkVBLDB4NzZFQiwweDc2RUMsLyogMHg1MC0weDU3ICovCisJMHg3NkVELDB4NzZGMCwweDc2RjMsMHg3NkY1LDB4NzZGNiwweDc2RjcsMHg3NkZBLDB4NzZGQiwvKiAweDU4LTB4NUYgKi8KKwkweDc2RkQsMHg3NkZGLDB4NzcwMCwweDc3MDIsMHg3NzAzLDB4NzcwNSwweDc3MDYsMHg3NzBBLC8qIDB4NjAtMHg2NyAqLworCTB4NzcwQywweDc3MEUsMHg3NzBGLDB4NzcxMCwweDc3MTEsMHg3NzEyLDB4NzcxMywweDc3MTQsLyogMHg2OC0weDZGICovCisJMHg3NzE1LDB4NzcxNiwweDc3MTcsMHg3NzE4LDB4NzcxQiwweDc3MUMsMHg3NzFELDB4NzcxRSwvKiAweDcwLTB4NzcgKi8KKwkweDc3MjEsMHg3NzIzLDB4NzcyNCwweDc3MjUsMHg3NzI3LDB4NzcyQSwweDc3MkIsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3NzJDLDB4NzcyRSwweDc3MzAsMHg3NzMxLDB4NzczMiwweDc3MzMsMHg3NzM0LDB4NzczOSwvKiAweDgwLTB4ODcgKi8KKwkweDc3M0IsMHg3NzNELDB4NzczRSwweDc3M0YsMHg3NzQyLDB4Nzc0NCwweDc3NDUsMHg3NzQ2LC8qIDB4ODgtMHg4RiAqLworCTB4Nzc0OCwweDc3NDksMHg3NzRBLDB4Nzc0QiwweDc3NEMsMHg3NzRELDB4Nzc0RSwweDc3NEYsLyogMHg5MC0weDk3ICovCisJMHg3NzUyLDB4Nzc1MywweDc3NTQsMHg3NzU1LDB4Nzc1NiwweDc3NTcsMHg3NzU4LDB4Nzc1OSwvKiAweDk4LTB4OUYgKi8KKwkweDc3NUMsMHg4NTg0LDB4OTZGOSwweDRGREQsMHg1ODIxLDB4OTk3MSwweDVCOUQsMHg2MkIxLC8qIDB4QTAtMHhBNyAqLworCTB4NjJBNSwweDY2QjQsMHg4Qzc5LDB4OUM4RCwweDcyMDYsMHg2NzZGLDB4Nzg5MSwweDYwQjIsLyogMHhBOC0weEFGICovCisJMHg1MzUxLDB4NTMxNywweDhGODgsMHg4MENDLDB4OEQxRCwweDk0QTEsMHg1MDBELDB4NzJDOCwvKiAweEIwLTB4QjcgKi8KKwkweDU5MDcsMHg2MEVCLDB4NzExOSwweDg4QUIsMHg1OTU0LDB4ODJFRiwweDY3MkMsMHg3QjI4LC8qIDB4QjgtMHhCRiAqLworCTB4NUQyOSwweDdFRjcsMHg3NTJELDB4NkNGNSwweDhFNjYsMHg4RkY4LDB4OTAzQywweDlGM0IsLyogMHhDMC0weEM3ICovCisJMHg2QkQ0LDB4OTExOSwweDdCMTQsMHg1RjdDLDB4NzhBNywweDg0RDYsMHg4NTNELDB4NkJENSwvKiAweEM4LTB4Q0YgKi8KKwkweDZCRDksMHg2QkQ2LDB4NUUwMSwweDVFODcsMHg3NUY5LDB4OTVFRCwweDY1NUQsMHg1RjBBLC8qIDB4RDAtMHhENyAqLworCTB4NUZDNSwweDhGOUYsMHg1OEMxLDB4ODFDMiwweDkwN0YsMHg5NjVCLDB4OTdBRCwweDhGQjksLyogMHhEOC0weERGICovCisJMHg3RjE2LDB4OEQyQywweDYyNDEsMHg0RkJGLDB4NTNEOCwweDUzNUUsMHg4RkE4LDB4OEZBOSwvKiAweEUwLTB4RTcgKi8KKwkweDhGQUIsMHg5MDRELDB4NjgwNywweDVGNkEsMHg4MTk4LDB4ODg2OCwweDlDRDYsMHg2MThCLC8qIDB4RTgtMHhFRiAqLworCTB4NTIyQiwweDc2MkEsMHg1RjZDLDB4NjU4QywweDZGRDIsMHg2RUU4LDB4NUJCRSwweDY0NDgsLyogMHhGMC0weEY3ICovCisJMHg1MTc1LDB4NTFCMCwweDY3QzQsMHg0RTE5LDB4NzlDOSwweDk5N0MsMHg3MEIzLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CMlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDc3NUQsMHg3NzVFLDB4Nzc1RiwweDc3NjAsMHg3NzY0LDB4Nzc2NywweDc3NjksMHg3NzZBLC8qIDB4NDAtMHg0NyAqLworCTB4Nzc2RCwweDc3NkUsMHg3NzZGLDB4Nzc3MCwweDc3NzEsMHg3NzcyLDB4Nzc3MywweDc3NzQsLyogMHg0OC0weDRGICovCisJMHg3Nzc1LDB4Nzc3NiwweDc3NzcsMHg3Nzc4LDB4Nzc3QSwweDc3N0IsMHg3NzdDLDB4Nzc4MSwvKiAweDUwLTB4NTcgKi8KKwkweDc3ODIsMHg3NzgzLDB4Nzc4NiwweDc3ODcsMHg3Nzg4LDB4Nzc4OSwweDc3OEEsMHg3NzhCLC8qIDB4NTgtMHg1RiAqLworCTB4Nzc4RiwweDc3OTAsMHg3NzkzLDB4Nzc5NCwweDc3OTUsMHg3Nzk2LDB4Nzc5NywweDc3OTgsLyogMHg2MC0weDY3ICovCisJMHg3Nzk5LDB4Nzc5QSwweDc3OUIsMHg3NzlDLDB4Nzc5RCwweDc3OUUsMHg3N0ExLDB4NzdBMywvKiAweDY4LTB4NkYgKi8KKwkweDc3QTQsMHg3N0E2LDB4NzdBOCwweDc3QUIsMHg3N0FELDB4NzdBRSwweDc3QUYsMHg3N0IxLC8qIDB4NzAtMHg3NyAqLworCTB4NzdCMiwweDc3QjQsMHg3N0I2LDB4NzdCNywweDc3QjgsMHg3N0I5LDB4NzdCQSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDc3QkMsMHg3N0JFLDB4NzdDMCwweDc3QzEsMHg3N0MyLDB4NzdDMywweDc3QzQsMHg3N0M1LC8qIDB4ODAtMHg4NyAqLworCTB4NzdDNiwweDc3QzcsMHg3N0M4LDB4NzdDOSwweDc3Q0EsMHg3N0NCLDB4NzdDQywweDc3Q0UsLyogMHg4OC0weDhGICovCisJMHg3N0NGLDB4NzdEMCwweDc3RDEsMHg3N0QyLDB4NzdEMywweDc3RDQsMHg3N0Q1LDB4NzdENiwvKiAweDkwLTB4OTcgKi8KKwkweDc3RDgsMHg3N0Q5LDB4NzdEQSwweDc3REQsMHg3N0RFLDB4NzdERiwweDc3RTAsMHg3N0UxLC8qIDB4OTgtMHg5RiAqLworCTB4NzdFNCwweDc1QzUsMHg1RTc2LDB4NzNCQiwweDgzRTAsMHg2NEFELDB4NjJFOCwweDk0QjUsLyogMHhBMC0weEE3ICovCisJMHg2Q0UyLDB4NTM1QSwweDUyQzMsMHg2NDBGLDB4OTRDMiwweDdCOTQsMHg0RjJGLDB4NUUxQiwvKiAweEE4LTB4QUYgKi8KKwkweDgyMzYsMHg4MTE2LDB4ODE4QSwweDZFMjQsMHg2Q0NBLDB4OUE3MywweDYzNTUsMHg1MzVDLC8qIDB4QjAtMHhCNyAqLworCTB4NTRGQSwweDg4NjUsMHg1N0UwLDB4NEUwRCwweDVFMDMsMHg2QjY1LDB4N0MzRiwweDkwRTgsLyogMHhCOC0weEJGICovCisJMHg2MDE2LDB4NjRFNiwweDczMUMsMHg4OEMxLDB4Njc1MCwweDYyNEQsMHg4RDIyLDB4Nzc2QywvKiAweEMwLTB4QzcgKi8KKwkweDhFMjksMHg5MUM3LDB4NUY2OSwweDgzREMsMHg4NTIxLDB4OTkxMCwweDUzQzIsMHg4Njk1LC8qIDB4QzgtMHhDRiAqLworCTB4NkI4QiwweDYwRUQsMHg2MEU4LDB4NzA3RiwweDgyQ0QsMHg4MjMxLDB4NEVEMywweDZDQTcsLyogMHhEMC0weEQ3ICovCisJMHg4NUNGLDB4NjRDRCwweDdDRDksMHg2OUZELDB4NjZGOSwweDgzNDksMHg1Mzk1LDB4N0I1NiwvKiAweEQ4LTB4REYgKi8KKwkweDRGQTcsMHg1MThDLDB4NkQ0QiwweDVDNDIsMHg4RTZELDB4NjNEMiwweDUzQzksMHg4MzJDLC8qIDB4RTAtMHhFNyAqLworCTB4ODMzNiwweDY3RTUsMHg3OEI0LDB4NjQzRCwweDVCREYsMHg1Qzk0LDB4NURFRSwweDhCRTcsLyogMHhFOC0weEVGICovCisJMHg2MkM2LDB4NjdGNCwweDhDN0EsMHg2NDAwLDB4NjNCQSwweDg3NDksMHg5OThCLDB4OEMxNywvKiAweEYwLTB4RjcgKi8KKwkweDdGMjAsMHg5NEYyLDB4NEVBNywweDk2MTAsMHg5OEE0LDB4NjYwQywweDczMTYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0IzWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NzdFNiwweDc3RTgsMHg3N0VBLDB4NzdFRiwweDc3RjAsMHg3N0YxLDB4NzdGMiwweDc3RjQsLyogMHg0MC0weDQ3ICovCisJMHg3N0Y1LDB4NzdGNywweDc3RjksMHg3N0ZBLDB4NzdGQiwweDc3RkMsMHg3ODAzLDB4NzgwNCwvKiAweDQ4LTB4NEYgKi8KKwkweDc4MDUsMHg3ODA2LDB4NzgwNywweDc4MDgsMHg3ODBBLDB4NzgwQiwweDc4MEUsMHg3ODBGLC8qIDB4NTAtMHg1NyAqLworCTB4NzgxMCwweDc4MTMsMHg3ODE1LDB4NzgxOSwweDc4MUIsMHg3ODFFLDB4NzgyMCwweDc4MjEsLyogMHg1OC0weDVGICovCisJMHg3ODIyLDB4NzgyNCwweDc4MjgsMHg3ODJBLDB4NzgyQiwweDc4MkUsMHg3ODJGLDB4NzgzMSwvKiAweDYwLTB4NjcgKi8KKwkweDc4MzIsMHg3ODMzLDB4NzgzNSwweDc4MzYsMHg3ODNELDB4NzgzRiwweDc4NDEsMHg3ODQyLC8qIDB4NjgtMHg2RiAqLworCTB4Nzg0MywweDc4NDQsMHg3ODQ2LDB4Nzg0OCwweDc4NDksMHg3ODRBLDB4Nzg0QiwweDc4NEQsLyogMHg3MC0weDc3ICovCisJMHg3ODRGLDB4Nzg1MSwweDc4NTMsMHg3ODU0LDB4Nzg1OCwweDc4NTksMHg3ODVBLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4Nzg1QiwweDc4NUMsMHg3ODVFLDB4Nzg1RiwweDc4NjAsMHg3ODYxLDB4Nzg2MiwweDc4NjMsLyogMHg4MC0weDg3ICovCisJMHg3ODY0LDB4Nzg2NSwweDc4NjYsMHg3ODY3LDB4Nzg2OCwweDc4NjksMHg3ODZGLDB4Nzg3MCwvKiAweDg4LTB4OEYgKi8KKwkweDc4NzEsMHg3ODcyLDB4Nzg3MywweDc4NzQsMHg3ODc1LDB4Nzg3NiwweDc4NzgsMHg3ODc5LC8qIDB4OTAtMHg5NyAqLworCTB4Nzg3QSwweDc4N0IsMHg3ODdELDB4Nzg3RSwweDc4N0YsMHg3ODgwLDB4Nzg4MSwweDc4ODIsLyogMHg5OC0weDlGICovCisJMHg3ODgzLDB4NTczQSwweDVDMUQsMHg1RTM4LDB4OTU3RiwweDUwN0YsMHg4MEEwLDB4NTM4MiwvKiAweEEwLTB4QTcgKi8KKwkweDY1NUUsMHg3NTQ1LDB4NTUzMSwweDUwMjEsMHg4RDg1LDB4NjI4NCwweDk0OUUsMHg2NzFELC8qIDB4QTgtMHhBRiAqLworCTB4NTYzMiwweDZGNkUsMHg1REUyLDB4NTQzNSwweDcwOTIsMHg4RjY2LDB4NjI2RiwweDY0QTQsLyogMHhCMC0weEI3ICovCisJMHg2M0EzLDB4NUY3QiwweDZGODgsMHg5MEY0LDB4ODFFMywweDhGQjAsMHg1QzE4LDB4NjY2OCwvKiAweEI4LTB4QkYgKi8KKwkweDVGRjEsMHg2Qzg5LDB4OTY0OCwweDhEODEsMHg4ODZDLDB4NjQ5MSwweDc5RjAsMHg1N0NFLC8qIDB4QzAtMHhDNyAqLworCTB4NkE1OSwweDYyMTAsMHg1NDQ4LDB4NEU1OCwweDdBMEIsMHg2MEU5LDB4NkY4NCwweDhCREEsLyogMHhDOC0weENGICovCisJMHg2MjdGLDB4OTAxRSwweDlBOEIsMHg3OUU0LDB4NTQwMywweDc1RjQsMHg2MzAxLDB4NTMxOSwvKiAweEQwLTB4RDcgKi8KKwkweDZDNjAsMHg4RkRGLDB4NUYxQiwweDlBNzAsMHg4MDNCLDB4OUY3RiwweDRGODgsMHg1QzNBLC8qIDB4RDgtMHhERiAqLworCTB4OEQ2NCwweDdGQzUsMHg2NUE1LDB4NzBCRCwweDUxNDUsMHg1MUIyLDB4ODY2QiwweDVEMDcsLyogMHhFMC0weEU3ICovCisJMHg1QkEwLDB4NjJCRCwweDkxNkMsMHg3NTc0LDB4OEUwQywweDdBMjAsMHg2MTAxLDB4N0I3OSwvKiAweEU4LTB4RUYgKi8KKwkweDRFQzcsMHg3RUY4LDB4Nzc4NSwweDRFMTEsMHg4MUVELDB4NTIxRCwweDUxRkEsMHg2QTcxLC8qIDB4RjAtMHhGNyAqLworCTB4NTNBOCwweDhFODcsMHg5NTA0LDB4OTZDRiwweDZFQzEsMHg5NjY0LDB4Njk1QSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3ODg0LDB4Nzg4NSwweDc4ODYsMHg3ODg4LDB4Nzg4QSwweDc4OEIsMHg3ODhGLDB4Nzg5MCwvKiAweDQwLTB4NDcgKi8KKwkweDc4OTIsMHg3ODk0LDB4Nzg5NSwweDc4OTYsMHg3ODk5LDB4Nzg5RCwweDc4OUUsMHg3OEEwLC8qIDB4NDgtMHg0RiAqLworCTB4NzhBMiwweDc4QTQsMHg3OEE2LDB4NzhBOCwweDc4QTksMHg3OEFBLDB4NzhBQiwweDc4QUMsLyogMHg1MC0weDU3ICovCisJMHg3OEFELDB4NzhBRSwweDc4QUYsMHg3OEI1LDB4NzhCNiwweDc4QjcsMHg3OEI4LDB4NzhCQSwvKiAweDU4LTB4NUYgKi8KKwkweDc4QkIsMHg3OEJDLDB4NzhCRCwweDc4QkYsMHg3OEMwLDB4NzhDMiwweDc4QzMsMHg3OEM0LC8qIDB4NjAtMHg2NyAqLworCTB4NzhDNiwweDc4QzcsMHg3OEM4LDB4NzhDQywweDc4Q0QsMHg3OENFLDB4NzhDRiwweDc4RDEsLyogMHg2OC0weDZGICovCisJMHg3OEQyLDB4NzhEMywweDc4RDYsMHg3OEQ3LDB4NzhEOCwweDc4REEsMHg3OERCLDB4NzhEQywvKiAweDcwLTB4NzcgKi8KKwkweDc4REQsMHg3OERFLDB4NzhERiwweDc4RTAsMHg3OEUxLDB4NzhFMiwweDc4RTMsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3OEU0LDB4NzhFNSwweDc4RTYsMHg3OEU3LDB4NzhFOSwweDc4RUEsMHg3OEVCLDB4NzhFRCwvKiAweDgwLTB4ODcgKi8KKwkweDc4RUUsMHg3OEVGLDB4NzhGMCwweDc4RjEsMHg3OEYzLDB4NzhGNSwweDc4RjYsMHg3OEY4LC8qIDB4ODgtMHg4RiAqLworCTB4NzhGOSwweDc4RkIsMHg3OEZDLDB4NzhGRCwweDc4RkUsMHg3OEZGLDB4NzkwMCwweDc5MDIsLyogMHg5MC0weDk3ICovCisJMHg3OTAzLDB4NzkwNCwweDc5MDYsMHg3OTA3LDB4NzkwOCwweDc5MDksMHg3OTBBLDB4NzkwQiwvKiAweDk4LTB4OUYgKi8KKwkweDc5MEMsMHg3ODQwLDB4NTBBOCwweDc3RDcsMHg2NDEwLDB4ODlFNiwweDU5MDQsMHg2M0UzLC8qIDB4QTAtMHhBNyAqLworCTB4NURERCwweDdBN0YsMHg2OTNELDB4NEYyMCwweDgyMzksMHg1NTk4LDB4NEUzMiwweDc1QUUsLyogMHhBOC0weEFGICovCisJMHg3QTk3LDB4NUU2MiwweDVFOEEsMHg5NUVGLDB4NTIxQiwweDU0MzksMHg3MDhBLDB4NjM3NiwvKiAweEIwLTB4QjcgKi8KKwkweDk1MjQsMHg1NzgyLDB4NjYyNSwweDY5M0YsMHg5MTg3LDB4NTUwNywweDZERjMsMHg3RUFGLC8qIDB4QjgtMHhCRiAqLworCTB4ODgyMiwweDYyMzMsMHg3RUYwLDB4NzVCNSwweDgzMjgsMHg3OEMxLDB4OTZDQywweDhGOUUsLyogMHhDMC0weEM3ICovCisJMHg2MTQ4LDB4NzRGNywweDhCQ0QsMHg2QjY0LDB4NTIzQSwweDhENTAsMHg2QjIxLDB4ODA2QSwvKiAweEM4LTB4Q0YgKi8KKwkweDg0NzEsMHg1NkYxLDB4NTMwNiwweDRFQ0UsMHg0RTFCLDB4NTFEMSwweDdDOTcsMHg5MThCLC8qIDB4RDAtMHhENyAqLworCTB4N0MwNywweDRGQzMsMHg4RTdGLDB4N0JFMSwweDdBOUMsMHg2NDY3LDB4NUQxNCwweDUwQUMsLyogMHhEOC0weERGICovCisJMHg4MTA2LDB4NzYwMSwweDdDQjksMHg2REVDLDB4N0ZFMCwweDY3NTEsMHg1QjU4LDB4NUJGOCwvKiAweEUwLTB4RTcgKi8KKwkweDc4Q0IsMHg2NEFFLDB4NjQxMywweDYzQUEsMHg2MzJCLDB4OTUxOSwweDY0MkQsMHg4RkJFLC8qIDB4RTgtMHhFRiAqLworCTB4N0I1NCwweDc2MjksMHg2MjUzLDB4NTkyNywweDU0NDYsMHg2Qjc5LDB4NTBBMywweDYyMzQsLyogMHhGMC0weEY3ICovCisJMHg1RTI2LDB4NkI4NiwweDRFRTMsMHg4RDM3LDB4ODg4QiwweDVGODUsMHg5MDJFLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CNVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDc5MEQsMHg3OTBFLDB4NzkwRiwweDc5MTAsMHg3OTExLDB4NzkxMiwweDc5MTQsMHg3OTE1LC8qIDB4NDAtMHg0NyAqLworCTB4NzkxNiwweDc5MTcsMHg3OTE4LDB4NzkxOSwweDc5MUEsMHg3OTFCLDB4NzkxQywweDc5MUQsLyogMHg0OC0weDRGICovCisJMHg3OTFGLDB4NzkyMCwweDc5MjEsMHg3OTIyLDB4NzkyMywweDc5MjUsMHg3OTI2LDB4NzkyNywvKiAweDUwLTB4NTcgKi8KKwkweDc5MjgsMHg3OTI5LDB4NzkyQSwweDc5MkIsMHg3OTJDLDB4NzkyRCwweDc5MkUsMHg3OTJGLC8qIDB4NTgtMHg1RiAqLworCTB4NzkzMCwweDc5MzEsMHg3OTMyLDB4NzkzMywweDc5MzUsMHg3OTM2LDB4NzkzNywweDc5MzgsLyogMHg2MC0weDY3ICovCisJMHg3OTM5LDB4NzkzRCwweDc5M0YsMHg3OTQyLDB4Nzk0MywweDc5NDQsMHg3OTQ1LDB4Nzk0NywvKiAweDY4LTB4NkYgKi8KKwkweDc5NEEsMHg3OTRCLDB4Nzk0QywweDc5NEQsMHg3OTRFLDB4Nzk0RiwweDc5NTAsMHg3OTUxLC8qIDB4NzAtMHg3NyAqLworCTB4Nzk1MiwweDc5NTQsMHg3OTU1LDB4Nzk1OCwweDc5NTksMHg3OTYxLDB4Nzk2MywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDc5NjQsMHg3OTY2LDB4Nzk2OSwweDc5NkEsMHg3OTZCLDB4Nzk2QywweDc5NkUsMHg3OTcwLC8qIDB4ODAtMHg4NyAqLworCTB4Nzk3MSwweDc5NzIsMHg3OTczLDB4Nzk3NCwweDc5NzUsMHg3OTc2LDB4Nzk3OSwweDc5N0IsLyogMHg4OC0weDhGICovCisJMHg3OTdDLDB4Nzk3RCwweDc5N0UsMHg3OTdGLDB4Nzk4MiwweDc5ODMsMHg3OTg2LDB4Nzk4NywvKiAweDkwLTB4OTcgKi8KKwkweDc5ODgsMHg3OTg5LDB4Nzk4QiwweDc5OEMsMHg3OThELDB4Nzk4RSwweDc5OTAsMHg3OTkxLC8qIDB4OTgtMHg5RiAqLworCTB4Nzk5MiwweDYwMjAsMHg4MDNELDB4NjJDNSwweDRFMzksMHg1MzU1LDB4OTBGOCwweDYzQjgsLyogMHhBMC0weEE3ICovCisJMHg4MEM2LDB4NjVFNiwweDZDMkUsMHg0RjQ2LDB4NjBFRSwweDZERTEsMHg4QkRFLDB4NUYzOSwvKiAweEE4LTB4QUYgKi8KKwkweDg2Q0IsMHg1RjUzLDB4NjMyMSwweDUxNUEsMHg4MzYxLDB4Njg2MywweDUyMDAsMHg2MzYzLC8qIDB4QjAtMHhCNyAqLworCTB4OEU0OCwweDUwMTIsMHg1QzlCLDB4Nzk3NywweDVCRkMsMHg1MjMwLDB4N0EzQiwweDYwQkMsLyogMHhCOC0weEJGICovCisJMHg5MDUzLDB4NzZENywweDVGQjcsMHg1Rjk3LDB4NzY4NCwweDhFNkMsMHg3MDZGLDB4NzY3QiwvKiAweEMwLTB4QzcgKi8KKwkweDdCNDksMHg3N0FBLDB4NTFGMywweDkwOTMsMHg1ODI0LDB4NEY0RSwweDZFRjQsMHg4RkVBLC8qIDB4QzgtMHhDRiAqLworCTB4NjU0QywweDdCMUIsMHg3MkM0LDB4NkRBNCwweDdGREYsMHg1QUUxLDB4NjJCNSwweDVFOTUsLyogMHhEMC0weEQ3ICovCisJMHg1NzMwLDB4ODQ4MiwweDdCMkMsMHg1RTFELDB4NUYxRiwweDkwMTIsMHg3RjE0LDB4OThBMCwvKiAweEQ4LTB4REYgKi8KKwkweDYzODIsMHg2RUM3LDB4Nzg5OCwweDcwQjksMHg1MTc4LDB4OTc1QiwweDU3QUIsMHg3NTM1LC8qIDB4RTAtMHhFNyAqLworCTB4NEY0MywweDc1MzgsMHg1RTk3LDB4NjBFNiwweDU5NjAsMHg2REMwLDB4NkJCRiwweDc4ODksLyogMHhFOC0weEVGICovCisJMHg1M0ZDLDB4OTZENSwweDUxQ0IsMHg1MjAxLDB4NjM4OSwweDU0MEEsMHg5NDkzLDB4OEMwMywvKiAweEYwLTB4RjcgKi8KKwkweDhEQ0MsMHg3MjM5LDB4Nzg5RiwweDg3NzYsMHg4RkVELDB4OEMwRCwweDUzRTAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0I2WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4Nzk5MywweDc5OTQsMHg3OTk1LDB4Nzk5NiwweDc5OTcsMHg3OTk4LDB4Nzk5OSwweDc5OUIsLyogMHg0MC0weDQ3ICovCisJMHg3OTlDLDB4Nzk5RCwweDc5OUUsMHg3OTlGLDB4NzlBMCwweDc5QTEsMHg3OUEyLDB4NzlBMywvKiAweDQ4LTB4NEYgKi8KKwkweDc5QTQsMHg3OUE1LDB4NzlBNiwweDc5QTgsMHg3OUE5LDB4NzlBQSwweDc5QUIsMHg3OUFDLC8qIDB4NTAtMHg1NyAqLworCTB4NzlBRCwweDc5QUUsMHg3OUFGLDB4NzlCMCwweDc5QjEsMHg3OUIyLDB4NzlCNCwweDc5QjUsLyogMHg1OC0weDVGICovCisJMHg3OUI2LDB4NzlCNywweDc5QjgsMHg3OUJDLDB4NzlCRiwweDc5QzIsMHg3OUM0LDB4NzlDNSwvKiAweDYwLTB4NjcgKi8KKwkweDc5QzcsMHg3OUM4LDB4NzlDQSwweDc5Q0MsMHg3OUNFLDB4NzlDRiwweDc5RDAsMHg3OUQzLC8qIDB4NjgtMHg2RiAqLworCTB4NzlENCwweDc5RDYsMHg3OUQ3LDB4NzlEOSwweDc5REEsMHg3OURCLDB4NzlEQywweDc5REQsLyogMHg3MC0weDc3ICovCisJMHg3OURFLDB4NzlFMCwweDc5RTEsMHg3OUUyLDB4NzlFNSwweDc5RTgsMHg3OUVBLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NzlFQywweDc5RUUsMHg3OUYxLDB4NzlGMiwweDc5RjMsMHg3OUY0LDB4NzlGNSwweDc5RjYsLyogMHg4MC0weDg3ICovCisJMHg3OUY3LDB4NzlGOSwweDc5RkEsMHg3OUZDLDB4NzlGRSwweDc5RkYsMHg3QTAxLDB4N0EwNCwvKiAweDg4LTB4OEYgKi8KKwkweDdBMDUsMHg3QTA3LDB4N0EwOCwweDdBMDksMHg3QTBBLDB4N0EwQywweDdBMEYsMHg3QTEwLC8qIDB4OTAtMHg5NyAqLworCTB4N0ExMSwweDdBMTIsMHg3QTEzLDB4N0ExNSwweDdBMTYsMHg3QTE4LDB4N0ExOSwweDdBMUIsLyogMHg5OC0weDlGICovCisJMHg3QTFDLDB4NEUwMSwweDc2RUYsMHg1M0VFLDB4OTQ4OSwweDk4NzYsMHg5RjBFLDB4OTUyRCwvKiAweEEwLTB4QTcgKi8KKwkweDVCOUEsMHg4QkEyLDB4NEUyMiwweDRFMUMsMHg1MUFDLDB4ODQ2MywweDYxQzIsMHg1MkE4LC8qIDB4QTgtMHhBRiAqLworCTB4NjgwQiwweDRGOTcsMHg2MDZCLDB4NTFCQiwweDZEMUUsMHg1MTVDLDB4NjI5NiwweDY1OTcsLyogMHhCMC0weEI3ICovCisJMHg5NjYxLDB4OEM0NiwweDkwMTcsMHg3NUQ4LDB4OTBGRCwweDc3NjMsMHg2QkQyLDB4NzI4QSwvKiAweEI4LTB4QkYgKi8KKwkweDcyRUMsMHg4QkZCLDB4NTgzNSwweDc3NzksMHg4RDRDLDB4Njc1QywweDk1NDAsMHg4MDlBLC8qIDB4QzAtMHhDNyAqLworCTB4NUVBNiwweDZFMjEsMHg1OTkyLDB4N0FFRiwweDc3RUQsMHg5NTNCLDB4NkJCNSwweDY1QUQsLyogMHhDOC0weENGICovCisJMHg3RjBFLDB4NTgwNiwweDUxNTEsMHg5NjFGLDB4NUJGOSwweDU4QTksMHg1NDI4LDB4OEU3MiwvKiAweEQwLTB4RDcgKi8KKwkweDY1NjYsMHg5ODdGLDB4NTZFNCwweDk0OUQsMHg3NkZFLDB4OTA0MSwweDYzODcsMHg1NEM2LC8qIDB4RDgtMHhERiAqLworCTB4NTkxQSwweDU5M0EsMHg1NzlCLDB4OEVCMiwweDY3MzUsMHg4REZBLDB4ODIzNSwweDUyNDEsLyogMHhFMC0weEU3ICovCisJMHg2MEYwLDB4NTgxNSwweDg2RkUsMHg1Q0U4LDB4OUU0NSwweDRGQzQsMHg5ODlELDB4OEJCOSwvKiAweEU4LTB4RUYgKi8KKwkweDVBMjUsMHg2MDc2LDB4NTM4NCwweDYyN0MsMHg5MDRGLDB4OTEwMiwweDk5N0YsMHg2MDY5LC8qIDB4RjAtMHhGNyAqLworCTB4ODAwQywweDUxM0YsMHg4MDMzLDB4NUMxNCwweDk5NzUsMHg2RDMxLDB4NEU4QywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjdbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3QTFELDB4N0ExRiwweDdBMjEsMHg3QTIyLDB4N0EyNCwweDdBMjUsMHg3QTI2LDB4N0EyNywvKiAweDQwLTB4NDcgKi8KKwkweDdBMjgsMHg3QTI5LDB4N0EyQSwweDdBMkIsMHg3QTJDLDB4N0EyRCwweDdBMkUsMHg3QTJGLC8qIDB4NDgtMHg0RiAqLworCTB4N0EzMCwweDdBMzEsMHg3QTMyLDB4N0EzNCwweDdBMzUsMHg3QTM2LDB4N0EzOCwweDdBM0EsLyogMHg1MC0weDU3ICovCisJMHg3QTNFLDB4N0E0MCwweDdBNDEsMHg3QTQyLDB4N0E0MywweDdBNDQsMHg3QTQ1LDB4N0E0NywvKiAweDU4LTB4NUYgKi8KKwkweDdBNDgsMHg3QTQ5LDB4N0E0QSwweDdBNEIsMHg3QTRDLDB4N0E0RCwweDdBNEUsMHg3QTRGLC8qIDB4NjAtMHg2NyAqLworCTB4N0E1MCwweDdBNTIsMHg3QTUzLDB4N0E1NCwweDdBNTUsMHg3QTU2LDB4N0E1OCwweDdBNTksLyogMHg2OC0weDZGICovCisJMHg3QTVBLDB4N0E1QiwweDdBNUMsMHg3QTVELDB4N0E1RSwweDdBNUYsMHg3QTYwLDB4N0E2MSwvKiAweDcwLTB4NzcgKi8KKwkweDdBNjIsMHg3QTYzLDB4N0E2NCwweDdBNjUsMHg3QTY2LDB4N0E2NywweDdBNjgsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3QTY5LDB4N0E2QSwweDdBNkIsMHg3QTZDLDB4N0E2RCwweDdBNkUsMHg3QTZGLDB4N0E3MSwvKiAweDgwLTB4ODcgKi8KKwkweDdBNzIsMHg3QTczLDB4N0E3NSwweDdBN0IsMHg3QTdDLDB4N0E3RCwweDdBN0UsMHg3QTgyLC8qIDB4ODgtMHg4RiAqLworCTB4N0E4NSwweDdBODcsMHg3QTg5LDB4N0E4QSwweDdBOEIsMHg3QThDLDB4N0E4RSwweDdBOEYsLyogMHg5MC0weDk3ICovCisJMHg3QTkwLDB4N0E5MywweDdBOTQsMHg3QTk5LDB4N0E5QSwweDdBOUIsMHg3QTlFLDB4N0FBMSwvKiAweDk4LTB4OUYgKi8KKwkweDdBQTIsMHg4RDMwLDB4NTNEMSwweDdGNUEsMHg3QjRGLDB4NEYxMCwweDRFNEYsMHg5NjAwLC8qIDB4QTAtMHhBNyAqLworCTB4NkNENSwweDczRDAsMHg4NUU5LDB4NUUwNiwweDc1NkEsMHg3RkZCLDB4NkEwQSwweDc3RkUsLyogMHhBOC0weEFGICovCisJMHg5NDkyLDB4N0U0MSwweDUxRTEsMHg3MEU2LDB4NTNDRCwweDhGRDQsMHg4MzAzLDB4OEQyOSwvKiAweEIwLTB4QjcgKi8KKwkweDcyQUYsMHg5OTZELDB4NkNEQiwweDU3NEEsMHg4MkIzLDB4NjVCOSwweDgwQUEsMHg2MjNGLC8qIDB4QjgtMHhCRiAqLworCTB4OTYzMiwweDU5QTgsMHg0RUZGLDB4OEJCRiwweDdFQkEsMHg2NTNFLDB4ODNGMiwweDk3NUUsLyogMHhDMC0weEM3ICovCisJMHg1NTYxLDB4OThERSwweDgwQTUsMHg1MzJBLDB4OEJGRCwweDU0MjAsMHg4MEJBLDB4NUU5RiwvKiAweEM4LTB4Q0YgKi8KKwkweDZDQjgsMHg4RDM5LDB4ODJBQywweDkxNUEsMHg1NDI5LDB4NkMxQiwweDUyMDYsMHg3RUI3LC8qIDB4RDAtMHhENyAqLworCTB4NTc1RiwweDcxMUEsMHg2QzdFLDB4N0M4OSwweDU5NEIsMHg0RUZELDB4NUZGRiwweDYxMjQsLyogMHhEOC0weERGICovCisJMHg3Q0FBLDB4NEUzMCwweDVDMDEsMHg2N0FCLDB4ODcwMiwweDVDRjAsMHg5NTBCLDB4OThDRSwvKiAweEUwLTB4RTcgKi8KKwkweDc1QUYsMHg3MEZELDB4OTAyMiwweDUxQUYsMHg3RjFELDB4OEJCRCwweDU5NDksMHg1MUU0LC8qIDB4RTgtMHhFRiAqLworCTB4NEY1QiwweDU0MjYsMHg1OTJCLDB4NjU3NywweDgwQTQsMHg1Qjc1LDB4NjI3NiwweDYyQzIsLyogMHhGMC0weEY3ICovCisJMHg4RjkwLDB4NUU0NSwweDZDMUYsMHg3QjI2LDB4NEYwRiwweDRGRDgsMHg2NzBELDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9COFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDdBQTMsMHg3QUE0LDB4N0FBNywweDdBQTksMHg3QUFBLDB4N0FBQiwweDdBQUUsMHg3QUFGLC8qIDB4NDAtMHg0NyAqLworCTB4N0FCMCwweDdBQjEsMHg3QUIyLDB4N0FCNCwweDdBQjUsMHg3QUI2LDB4N0FCNywweDdBQjgsLyogMHg0OC0weDRGICovCisJMHg3QUI5LDB4N0FCQSwweDdBQkIsMHg3QUJDLDB4N0FCRCwweDdBQkUsMHg3QUMwLDB4N0FDMSwvKiAweDUwLTB4NTcgKi8KKwkweDdBQzIsMHg3QUMzLDB4N0FDNCwweDdBQzUsMHg3QUM2LDB4N0FDNywweDdBQzgsMHg3QUM5LC8qIDB4NTgtMHg1RiAqLworCTB4N0FDQSwweDdBQ0MsMHg3QUNELDB4N0FDRSwweDdBQ0YsMHg3QUQwLDB4N0FEMSwweDdBRDIsLyogMHg2MC0weDY3ICovCisJMHg3QUQzLDB4N0FENCwweDdBRDUsMHg3QUQ3LDB4N0FEOCwweDdBREEsMHg3QURCLDB4N0FEQywvKiAweDY4LTB4NkYgKi8KKwkweDdBREQsMHg3QUUxLDB4N0FFMiwweDdBRTQsMHg3QUU3LDB4N0FFOCwweDdBRTksMHg3QUVBLC8qIDB4NzAtMHg3NyAqLworCTB4N0FFQiwweDdBRUMsMHg3QUVFLDB4N0FGMCwweDdBRjEsMHg3QUYyLDB4N0FGMywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDdBRjQsMHg3QUY1LDB4N0FGNiwweDdBRjcsMHg3QUY4LDB4N0FGQiwweDdBRkMsMHg3QUZFLC8qIDB4ODAtMHg4NyAqLworCTB4N0IwMCwweDdCMDEsMHg3QjAyLDB4N0IwNSwweDdCMDcsMHg3QjA5LDB4N0IwQywweDdCMEQsLyogMHg4OC0weDhGICovCisJMHg3QjBFLDB4N0IxMCwweDdCMTIsMHg3QjEzLDB4N0IxNiwweDdCMTcsMHg3QjE4LDB4N0IxQSwvKiAweDkwLTB4OTcgKi8KKwkweDdCMUMsMHg3QjFELDB4N0IxRiwweDdCMjEsMHg3QjIyLDB4N0IyMywweDdCMjcsMHg3QjI5LC8qIDB4OTgtMHg5RiAqLworCTB4N0IyRCwweDZENkUsMHg2REFBLDB4Nzk4RiwweDg4QjEsMHg1RjE3LDB4NzUyQiwweDYyOUEsLyogMHhBMC0weEE3ICovCisJMHg4Rjg1LDB4NEZFRiwweDkxREMsMHg2NUE3LDB4ODEyRiwweDgxNTEsMHg1RTlDLDB4ODE1MCwvKiAweEE4LTB4QUYgKi8KKwkweDhENzQsMHg1MjZGLDB4ODk4NiwweDhENEIsMHg1OTBELDB4NTA4NSwweDRFRDgsMHg5NjFDLC8qIDB4QjAtMHhCNyAqLworCTB4NzIzNiwweDgxNzksMHg4RDFGLDB4NUJDQywweDhCQTMsMHg5NjQ0LDB4NTk4NywweDdGMUEsLyogMHhCOC0weEJGICovCisJMHg1NDkwLDB4NTY3NiwweDU2MEUsMHg4QkU1LDB4NjUzOSwweDY5ODIsMHg5NDk5LDB4NzZENiwvKiAweEMwLTB4QzcgKi8KKwkweDZFODksMHg1RTcyLDB4NzUxOCwweDY3NDYsMHg2N0QxLDB4N0FGRiwweDgwOUQsMHg4RDc2LC8qIDB4QzgtMHhDRiAqLworCTB4NjExRiwweDc5QzYsMHg2NTYyLDB4OEQ2MywweDUxODgsMHg1MjFBLDB4OTRBMiwweDdGMzgsLyogMHhEMC0weEQ3ICovCisJMHg4MDlCLDB4N0VCMiwweDVDOTcsMHg2RTJGLDB4Njc2MCwweDdCRDksMHg3NjhCLDB4OUFEOCwvKiAweEQ4LTB4REYgKi8KKwkweDgxOEYsMHg3Rjk0LDB4N0NENSwweDY0MUUsMHg5NTUwLDB4N0EzRiwweDU0NEEsMHg1NEU1LC8qIDB4RTAtMHhFNyAqLworCTB4NkI0QywweDY0MDEsMHg2MjA4LDB4OUUzRCwweDgwRjMsMHg3NTk5LDB4NTI3MiwweDk3NjksLyogMHhFOC0weEVGICovCisJMHg4NDVCLDB4NjgzQywweDg2RTQsMHg5NjAxLDB4OTY5NCwweDk0RUMsMHg0RTJBLDB4NTQwNCwvKiAweEYwLTB4RjcgKi8KKwkweDdFRDksMHg2ODM5LDB4OERERiwweDgwMTUsMHg2NkY0LDB4NUU5QSwweDdGQjksMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0I5WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4N0IyRiwweDdCMzAsMHg3QjMyLDB4N0IzNCwweDdCMzUsMHg3QjM2LDB4N0IzNywweDdCMzksLyogMHg0MC0weDQ3ICovCisJMHg3QjNCLDB4N0IzRCwweDdCM0YsMHg3QjQwLDB4N0I0MSwweDdCNDIsMHg3QjQzLDB4N0I0NCwvKiAweDQ4LTB4NEYgKi8KKwkweDdCNDYsMHg3QjQ4LDB4N0I0QSwweDdCNEQsMHg3QjRFLDB4N0I1MywweDdCNTUsMHg3QjU3LC8qIDB4NTAtMHg1NyAqLworCTB4N0I1OSwweDdCNUMsMHg3QjVFLDB4N0I1RiwweDdCNjEsMHg3QjYzLDB4N0I2NCwweDdCNjUsLyogMHg1OC0weDVGICovCisJMHg3QjY2LDB4N0I2NywweDdCNjgsMHg3QjY5LDB4N0I2QSwweDdCNkIsMHg3QjZDLDB4N0I2RCwvKiAweDYwLTB4NjcgKi8KKwkweDdCNkYsMHg3QjcwLDB4N0I3MywweDdCNzQsMHg3Qjc2LDB4N0I3OCwweDdCN0EsMHg3QjdDLC8qIDB4NjgtMHg2RiAqLworCTB4N0I3RCwweDdCN0YsMHg3QjgxLDB4N0I4MiwweDdCODMsMHg3Qjg0LDB4N0I4NiwweDdCODcsLyogMHg3MC0weDc3ICovCisJMHg3Qjg4LDB4N0I4OSwweDdCOEEsMHg3QjhCLDB4N0I4QywweDdCOEUsMHg3QjhGLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4N0I5MSwweDdCOTIsMHg3QjkzLDB4N0I5NiwweDdCOTgsMHg3Qjk5LDB4N0I5QSwweDdCOUIsLyogMHg4MC0weDg3ICovCisJMHg3QjlFLDB4N0I5RiwweDdCQTAsMHg3QkEzLDB4N0JBNCwweDdCQTUsMHg3QkFFLDB4N0JBRiwvKiAweDg4LTB4OEYgKi8KKwkweDdCQjAsMHg3QkIyLDB4N0JCMywweDdCQjUsMHg3QkI2LDB4N0JCNywweDdCQjksMHg3QkJBLC8qIDB4OTAtMHg5NyAqLworCTB4N0JCQiwweDdCQkMsMHg3QkJELDB4N0JCRSwweDdCQkYsMHg3QkMwLDB4N0JDMiwweDdCQzMsLyogMHg5OC0weDlGICovCisJMHg3QkM0LDB4NTdDMiwweDgwM0YsMHg2ODk3LDB4NURFNSwweDY1M0IsMHg1MjlGLDB4NjA2RCwvKiAweEEwLTB4QTcgKi8KKwkweDlGOUEsMHg0RjlCLDB4OEVBQywweDUxNkMsMHg1QkFCLDB4NUYxMywweDVERTksMHg2QzVFLC8qIDB4QTgtMHhBRiAqLworCTB4NjJGMSwweDhEMjEsMHg1MTcxLDB4OTRBOSwweDUyRkUsMHg2QzlGLDB4ODJERiwweDcyRDcsLyogMHhCMC0weEI3ICovCisJMHg1N0EyLDB4Njc4NCwweDhEMkQsMHg1OTFGLDB4OEY5QywweDgzQzcsMHg1NDk1LDB4N0I4RCwvKiAweEI4LTB4QkYgKi8KKwkweDRGMzAsMHg2Q0JELDB4NUI2NCwweDU5RDEsMHg5RjEzLDB4NTNFNCwweDg2Q0EsMHg5QUE4LC8qIDB4QzAtMHhDNyAqLworCTB4OEMzNywweDgwQTEsMHg2NTQ1LDB4OTg3RSwweDU2RkEsMHg5NkM3LDB4NTIyRSwweDc0REMsLyogMHhDOC0weENGICovCisJMHg1MjUwLDB4NUJFMSwweDYzMDIsMHg4OTAyLDB4NEU1NiwweDYyRDAsMHg2MDJBLDB4NjhGQSwvKiAweEQwLTB4RDcgKi8KKwkweDUxNzMsMHg1Qjk4LDB4NTFBMCwweDg5QzIsMHg3QkExLDB4OTk4NiwweDdGNTAsMHg2MEVGLC8qIDB4RDgtMHhERiAqLworCTB4NzA0QywweDhEMkYsMHg1MTQ5LDB4NUU3RiwweDkwMUIsMHg3NDcwLDB4ODlDNCwweDU3MkQsLyogMHhFMC0weEU3ICovCisJMHg3ODQ1LDB4NUY1MiwweDlGOUYsMHg5NUZBLDB4OEY2OCwweDlCM0MsMHg4QkUxLDB4NzY3OCwvKiAweEU4LTB4RUYgKi8KKwkweDY4NDIsMHg2N0RDLDB4OERFQSwweDhEMzUsMHg1MjNELDB4OEY4QSwweDZFREEsMHg2OENELC8qIDB4RjAtMHhGNyAqLworCTB4OTUwNSwweDkwRUQsMHg1NkZELDB4Njc5QywweDg4RjksMHg4RkM3LDB4NTRDOCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQkFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3QkM1LDB4N0JDOCwweDdCQzksMHg3QkNBLDB4N0JDQiwweDdCQ0QsMHg3QkNFLDB4N0JDRiwvKiAweDQwLTB4NDcgKi8KKwkweDdCRDAsMHg3QkQyLDB4N0JENCwweDdCRDUsMHg3QkQ2LDB4N0JENywweDdCRDgsMHg3QkRCLC8qIDB4NDgtMHg0RiAqLworCTB4N0JEQywweDdCREUsMHg3QkRGLDB4N0JFMCwweDdCRTIsMHg3QkUzLDB4N0JFNCwweDdCRTcsLyogMHg1MC0weDU3ICovCisJMHg3QkU4LDB4N0JFOSwweDdCRUIsMHg3QkVDLDB4N0JFRCwweDdCRUYsMHg3QkYwLDB4N0JGMiwvKiAweDU4LTB4NUYgKi8KKwkweDdCRjMsMHg3QkY0LDB4N0JGNSwweDdCRjYsMHg3QkY4LDB4N0JGOSwweDdCRkEsMHg3QkZCLC8qIDB4NjAtMHg2NyAqLworCTB4N0JGRCwweDdCRkYsMHg3QzAwLDB4N0MwMSwweDdDMDIsMHg3QzAzLDB4N0MwNCwweDdDMDUsLyogMHg2OC0weDZGICovCisJMHg3QzA2LDB4N0MwOCwweDdDMDksMHg3QzBBLDB4N0MwRCwweDdDMEUsMHg3QzEwLDB4N0MxMSwvKiAweDcwLTB4NzcgKi8KKwkweDdDMTIsMHg3QzEzLDB4N0MxNCwweDdDMTUsMHg3QzE3LDB4N0MxOCwweDdDMTksMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3QzFBLDB4N0MxQiwweDdDMUMsMHg3QzFELDB4N0MxRSwweDdDMjAsMHg3QzIxLDB4N0MyMiwvKiAweDgwLTB4ODcgKi8KKwkweDdDMjMsMHg3QzI0LDB4N0MyNSwweDdDMjgsMHg3QzI5LDB4N0MyQiwweDdDMkMsMHg3QzJELC8qIDB4ODgtMHg4RiAqLworCTB4N0MyRSwweDdDMkYsMHg3QzMwLDB4N0MzMSwweDdDMzIsMHg3QzMzLDB4N0MzNCwweDdDMzUsLyogMHg5MC0weDk3ICovCisJMHg3QzM2LDB4N0MzNywweDdDMzksMHg3QzNBLDB4N0MzQiwweDdDM0MsMHg3QzNELDB4N0MzRSwvKiAweDk4LTB4OUYgKi8KKwkweDdDNDIsMHg5QUI4LDB4NUI2OSwweDZENzcsMHg2QzI2LDB4NEVBNSwweDVCQjMsMHg5QTg3LC8qIDB4QTAtMHhBNyAqLworCTB4OTE2MywweDYxQTgsMHg5MEFGLDB4OTdFOSwweDU0MkIsMHg2REI1LDB4NUJEMiwweDUxRkQsLyogMHhBOC0weEFGICovCisJMHg1NThBLDB4N0Y1NSwweDdGRjAsMHg2NEJDLDB4NjM0RCwweDY1RjEsMHg2MUJFLDB4NjA4RCwvKiAweEIwLTB4QjcgKi8KKwkweDcxMEEsMHg2QzU3LDB4NkM0OSwweDU5MkYsMHg2NzZELDB4ODIyQSwweDU4RDUsMHg1NjhFLC8qIDB4QjgtMHhCRiAqLworCTB4OEM2QSwweDZCRUIsMHg5MERELDB4NTk3RCwweDgwMTcsMHg1M0Y3LDB4NkQ2OSwweDU0NzUsLyogMHhDMC0weEM3ICovCisJMHg1NTlELDB4ODM3NywweDgzQ0YsMHg2ODM4LDB4NzlCRSwweDU0OEMsMHg0RjU1LDB4NTQwOCwvKiAweEM4LTB4Q0YgKi8KKwkweDc2RDIsMHg4Qzg5LDB4OTYwMiwweDZDQjMsMHg2REI4LDB4OEQ2QiwweDg5MTAsMHg5RTY0LC8qIDB4RDAtMHhENyAqLworCTB4OEQzQSwweDU2M0YsMHg5RUQxLDB4NzVENSwweDVGODgsMHg3MkUwLDB4NjA2OCwweDU0RkMsLyogMHhEOC0weERGICovCisJMHg0RUE4LDB4NkEyQSwweDg4NjEsMHg2MDUyLDB4OEY3MCwweDU0QzQsMHg3MEQ4LDB4ODY3OSwvKiAweEUwLTB4RTcgKi8KKwkweDlFM0YsMHg2RDJBLDB4NUI4RiwweDVGMTgsMHg3RUEyLDB4NTU4OSwweDRGQUYsMHg3MzM0LC8qIDB4RTgtMHhFRiAqLworCTB4NTQzQywweDUzOUEsMHg1MDE5LDB4NTQwRSwweDU0N0MsMHg0RTRFLDB4NUZGRCwweDc0NUEsLyogMHhGMC0weEY3ICovCisJMHg1OEY2LDB4ODQ2QiwweDgwRTEsMHg4Nzc0LDB4NzJEMCwweDdDQ0EsMHg2RTU2LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CQlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDdDNDMsMHg3QzQ0LDB4N0M0NSwweDdDNDYsMHg3QzQ3LDB4N0M0OCwweDdDNDksMHg3QzRBLC8qIDB4NDAtMHg0NyAqLworCTB4N0M0QiwweDdDNEMsMHg3QzRFLDB4N0M0RiwweDdDNTAsMHg3QzUxLDB4N0M1MiwweDdDNTMsLyogMHg0OC0weDRGICovCisJMHg3QzU0LDB4N0M1NSwweDdDNTYsMHg3QzU3LDB4N0M1OCwweDdDNTksMHg3QzVBLDB4N0M1QiwvKiAweDUwLTB4NTcgKi8KKwkweDdDNUMsMHg3QzVELDB4N0M1RSwweDdDNUYsMHg3QzYwLDB4N0M2MSwweDdDNjIsMHg3QzYzLC8qIDB4NTgtMHg1RiAqLworCTB4N0M2NCwweDdDNjUsMHg3QzY2LDB4N0M2NywweDdDNjgsMHg3QzY5LDB4N0M2QSwweDdDNkIsLyogMHg2MC0weDY3ICovCisJMHg3QzZDLDB4N0M2RCwweDdDNkUsMHg3QzZGLDB4N0M3MCwweDdDNzEsMHg3QzcyLDB4N0M3NSwvKiAweDY4LTB4NkYgKi8KKwkweDdDNzYsMHg3Qzc3LDB4N0M3OCwweDdDNzksMHg3QzdBLDB4N0M3RSwweDdDN0YsMHg3QzgwLC8qIDB4NzAtMHg3NyAqLworCTB4N0M4MSwweDdDODIsMHg3QzgzLDB4N0M4NCwweDdDODUsMHg3Qzg2LDB4N0M4NywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDdDODgsMHg3QzhBLDB4N0M4QiwweDdDOEMsMHg3QzhELDB4N0M4RSwweDdDOEYsMHg3QzkwLC8qIDB4ODAtMHg4NyAqLworCTB4N0M5MywweDdDOTQsMHg3Qzk2LDB4N0M5OSwweDdDOUEsMHg3QzlCLDB4N0NBMCwweDdDQTEsLyogMHg4OC0weDhGICovCisJMHg3Q0EzLDB4N0NBNiwweDdDQTcsMHg3Q0E4LDB4N0NBOSwweDdDQUIsMHg3Q0FDLDB4N0NBRCwvKiAweDkwLTB4OTcgKi8KKwkweDdDQUYsMHg3Q0IwLDB4N0NCNCwweDdDQjUsMHg3Q0I2LDB4N0NCNywweDdDQjgsMHg3Q0JBLC8qIDB4OTgtMHg5RiAqLworCTB4N0NCQiwweDVGMjcsMHg4NjRFLDB4NTUyQywweDYyQTQsMHg0RTkyLDB4NkNBQSwweDYyMzcsLyogMHhBMC0weEE3ICovCisJMHg4MkIxLDB4NTRENywweDUzNEUsMHg3MzNFLDB4NkVEMSwweDc1M0IsMHg1MjEyLDB4NTMxNiwvKiAweEE4LTB4QUYgKi8KKwkweDhCREQsMHg2OUQwLDB4NUY4QSwweDYwMDAsMHg2REVFLDB4NTc0RiwweDZCMjIsMHg3M0FGLC8qIDB4QjAtMHhCNyAqLworCTB4Njg1MywweDhGRDgsMHg3RjEzLDB4NjM2MiwweDYwQTMsMHg1NTI0LDB4NzVFQSwweDhDNjIsLyogMHhCOC0weEJGICovCisJMHg3MTE1LDB4NkRBMywweDVCQTYsMHg1RTdCLDB4ODM1MiwweDYxNEMsMHg5RUM0LDB4NzhGQSwvKiAweEMwLTB4QzcgKi8KKwkweDg3NTcsMHg3QzI3LDB4NzY4NywweDUxRjAsMHg2MEY2LDB4NzE0QywweDY2NDMsMHg1RTRDLC8qIDB4QzgtMHhDRiAqLworCTB4NjA0RCwweDhDMEUsMHg3MDcwLDB4NjMyNSwweDhGODksMHg1RkJELDB4NjA2MiwweDg2RDQsLyogMHhEMC0weEQ3ICovCisJMHg1NkRFLDB4NkJDMSwweDYwOTQsMHg2MTY3LDB4NTM0OSwweDYwRTAsMHg2NjY2LDB4OEQzRiwvKiAweEQ4LTB4REYgKi8KKwkweDc5RkQsMHg0RjFBLDB4NzBFOSwweDZDNDcsMHg4QkIzLDB4OEJGMiwweDdFRDgsMHg4MzY0LC8qIDB4RTAtMHhFNyAqLworCTB4NjYwRiwweDVBNUEsMHg5QjQyLDB4NkQ1MSwweDZERjcsMHg4QzQxLDB4NkQzQiwweDRGMTksLyogMHhFOC0weEVGICovCisJMHg3MDZCLDB4ODNCNywweDYyMTYsMHg2MEQxLDB4OTcwRCwweDhEMjcsMHg3OTc4LDB4NTFGQiwvKiAweEYwLTB4RjcgKi8KKwkweDU3M0UsMHg1N0ZBLDB4NjczQSwweDc1NzgsMHg3QTNELDB4NzlFRiwweDdCOTUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0JDWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4N0NCRiwweDdDQzAsMHg3Q0MyLDB4N0NDMywweDdDQzQsMHg3Q0M2LDB4N0NDOSwweDdDQ0IsLyogMHg0MC0weDQ3ICovCisJMHg3Q0NFLDB4N0NDRiwweDdDRDAsMHg3Q0QxLDB4N0NEMiwweDdDRDMsMHg3Q0Q0LDB4N0NEOCwvKiAweDQ4LTB4NEYgKi8KKwkweDdDREEsMHg3Q0RCLDB4N0NERCwweDdDREUsMHg3Q0UxLDB4N0NFMiwweDdDRTMsMHg3Q0U0LC8qIDB4NTAtMHg1NyAqLworCTB4N0NFNSwweDdDRTYsMHg3Q0U3LDB4N0NFOSwweDdDRUEsMHg3Q0VCLDB4N0NFQywweDdDRUQsLyogMHg1OC0weDVGICovCisJMHg3Q0VFLDB4N0NGMCwweDdDRjEsMHg3Q0YyLDB4N0NGMywweDdDRjQsMHg3Q0Y1LDB4N0NGNiwvKiAweDYwLTB4NjcgKi8KKwkweDdDRjcsMHg3Q0Y5LDB4N0NGQSwweDdDRkMsMHg3Q0ZELDB4N0NGRSwweDdDRkYsMHg3RDAwLC8qIDB4NjgtMHg2RiAqLworCTB4N0QwMSwweDdEMDIsMHg3RDAzLDB4N0QwNCwweDdEMDUsMHg3RDA2LDB4N0QwNywweDdEMDgsLyogMHg3MC0weDc3ICovCisJMHg3RDA5LDB4N0QwQiwweDdEMEMsMHg3RDBELDB4N0QwRSwweDdEMEYsMHg3RDEwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4N0QxMSwweDdEMTIsMHg3RDEzLDB4N0QxNCwweDdEMTUsMHg3RDE2LDB4N0QxNywweDdEMTgsLyogMHg4MC0weDg3ICovCisJMHg3RDE5LDB4N0QxQSwweDdEMUIsMHg3RDFDLDB4N0QxRCwweDdEMUUsMHg3RDFGLDB4N0QyMSwvKiAweDg4LTB4OEYgKi8KKwkweDdEMjMsMHg3RDI0LDB4N0QyNSwweDdEMjYsMHg3RDI4LDB4N0QyOSwweDdEMkEsMHg3RDJDLC8qIDB4OTAtMHg5NyAqLworCTB4N0QyRCwweDdEMkUsMHg3RDMwLDB4N0QzMSwweDdEMzIsMHg3RDMzLDB4N0QzNCwweDdEMzUsLyogMHg5OC0weDlGICovCisJMHg3RDM2LDB4ODA4QywweDk5NjUsMHg4RkY5LDB4NkZDMCwweDhCQTUsMHg5RTIxLDB4NTlFQywvKiAweEEwLTB4QTcgKi8KKwkweDdFRTksMHg3RjA5LDB4NTQwOSwweDY3ODEsMHg2OEQ4LDB4OEY5MSwweDdDNEQsMHg5NkM2LC8qIDB4QTgtMHhBRiAqLworCTB4NTNDQSwweDYwMjUsMHg3NUJFLDB4NkM3MiwweDUzNzMsMHg1QUM5LDB4N0VBNywweDYzMjQsLyogMHhCMC0weEI3ICovCisJMHg1MUUwLDB4ODEwQSwweDVERjEsMHg4NERGLDB4NjI4MCwweDUxODAsMHg1QjYzLDB4NEYwRSwvKiAweEI4LTB4QkYgKi8KKwkweDc5NkQsMHg1MjQyLDB4NjBCOCwweDZENEUsMHg1QkM0LDB4NUJDMiwweDhCQTEsMHg4QkIwLC8qIDB4QzAtMHhDNyAqLworCTB4NjVFMiwweDVGQ0MsMHg5NjQ1LDB4NTk5MywweDdFRTcsMHg3RUFBLDB4NTYwOSwweDY3QjcsLyogMHhDOC0weENGICovCisJMHg1OTM5LDB4NEY3MywweDVCQjYsMHg1MkEwLDB4ODM1QSwweDk4OEEsMHg4RDNFLDB4NzUzMiwvKiAweEQwLTB4RDcgKi8KKwkweDk0QkUsMHg1MDQ3LDB4N0EzQywweDRFRjcsMHg2N0I2LDB4OUE3RSwweDVBQzEsMHg2QjdDLC8qIDB4RDgtMHhERiAqLworCTB4NzZEMSwweDU3NUEsMHg1QzE2LDB4N0IzQSwweDk1RjQsMHg3MTRFLDB4NTE3QywweDgwQTksLyogMHhFMC0weEU3ICovCisJMHg4MjcwLDB4NTk3OCwweDdGMDQsMHg4MzI3LDB4NjhDMCwweDY3RUMsMHg3OEIxLDB4Nzg3NywvKiAweEU4LTB4RUYgKi8KKwkweDYyRTMsMHg2MzYxLDB4N0I4MCwweDRGRUQsMHg1MjZBLDB4NTFDRiwweDgzNTAsMHg2OURCLC8qIDB4RjAtMHhGNyAqLworCTB4OTI3NCwweDhERjUsMHg4RDMxLDB4ODlDMSwweDk1MkUsMHg3QkFELDB4NEVGNiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQkRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3RDM3LDB4N0QzOCwweDdEMzksMHg3RDNBLDB4N0QzQiwweDdEM0MsMHg3RDNELDB4N0QzRSwvKiAweDQwLTB4NDcgKi8KKwkweDdEM0YsMHg3RDQwLDB4N0Q0MSwweDdENDIsMHg3RDQzLDB4N0Q0NCwweDdENDUsMHg3RDQ2LC8qIDB4NDgtMHg0RiAqLworCTB4N0Q0NywweDdENDgsMHg3RDQ5LDB4N0Q0QSwweDdENEIsMHg3RDRDLDB4N0Q0RCwweDdENEUsLyogMHg1MC0weDU3ICovCisJMHg3RDRGLDB4N0Q1MCwweDdENTEsMHg3RDUyLDB4N0Q1MywweDdENTQsMHg3RDU1LDB4N0Q1NiwvKiAweDU4LTB4NUYgKi8KKwkweDdENTcsMHg3RDU4LDB4N0Q1OSwweDdENUEsMHg3RDVCLDB4N0Q1QywweDdENUQsMHg3RDVFLC8qIDB4NjAtMHg2NyAqLworCTB4N0Q1RiwweDdENjAsMHg3RDYxLDB4N0Q2MiwweDdENjMsMHg3RDY0LDB4N0Q2NSwweDdENjYsLyogMHg2OC0weDZGICovCisJMHg3RDY3LDB4N0Q2OCwweDdENjksMHg3RDZBLDB4N0Q2QiwweDdENkMsMHg3RDZELDB4N0Q2RiwvKiAweDcwLTB4NzcgKi8KKwkweDdENzAsMHg3RDcxLDB4N0Q3MiwweDdENzMsMHg3RDc0LDB4N0Q3NSwweDdENzYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3RDc4LDB4N0Q3OSwweDdEN0EsMHg3RDdCLDB4N0Q3QywweDdEN0QsMHg3RDdFLDB4N0Q3RiwvKiAweDgwLTB4ODcgKi8KKwkweDdEODAsMHg3RDgxLDB4N0Q4MiwweDdEODMsMHg3RDg0LDB4N0Q4NSwweDdEODYsMHg3RDg3LC8qIDB4ODgtMHg4RiAqLworCTB4N0Q4OCwweDdEODksMHg3RDhBLDB4N0Q4QiwweDdEOEMsMHg3RDhELDB4N0Q4RSwweDdEOEYsLyogMHg5MC0weDk3ICovCisJMHg3RDkwLDB4N0Q5MSwweDdEOTIsMHg3RDkzLDB4N0Q5NCwweDdEOTUsMHg3RDk2LDB4N0Q5NywvKiAweDk4LTB4OUYgKi8KKwkweDdEOTgsMHg1MDY1LDB4ODIzMCwweDUyNTEsMHg5OTZGLDB4NkUxMCwweDZFODUsMHg2REE3LC8qIDB4QTAtMHhBNyAqLworCTB4NUVGQSwweDUwRjUsMHg1OURDLDB4NUMwNiwweDZENDYsMHg2QzVGLDB4NzU4NiwweDg0OEIsLyogMHhBOC0weEFGICovCisJMHg2ODY4LDB4NTk1NiwweDhCQjIsMHg1MzIwLDB4OTE3MSwweDk2NEQsMHg4NTQ5LDB4NjkxMiwvKiAweEIwLTB4QjcgKi8KKwkweDc5MDEsMHg3MTI2LDB4ODBGNiwweDRFQTQsMHg5MENBLDB4NkQ0NywweDlBODQsMHg1QTA3LC8qIDB4QjgtMHhCRiAqLworCTB4NTZCQywweDY0MDUsMHg5NEYwLDB4NzdFQiwweDRGQTUsMHg4MTFBLDB4NzJFMSwweDg5RDIsLyogMHhDMC0weEM3ICovCisJMHg5OTdBLDB4N0YzNCwweDdFREUsMHg1MjdGLDB4NjU1OSwweDkxNzUsMHg4RjdGLDB4OEY4MywvKiAweEM4LTB4Q0YgKi8KKwkweDUzRUIsMHg3QTk2LDB4NjNFRCwweDYzQTUsMHg3Njg2LDB4NzlGOCwweDg4NTcsMHg5NjM2LC8qIDB4RDAtMHhENyAqLworCTB4NjIyQSwweDUyQUIsMHg4MjgyLDB4Njg1NCwweDY3NzAsMHg2Mzc3LDB4Nzc2QiwweDdBRUQsLyogMHhEOC0weERGICovCisJMHg2RDAxLDB4N0VEMywweDg5RTMsMHg1OUQwLDB4NjIxMiwweDg1QzksMHg4MkE1LDB4NzU0QywvKiAweEUwLTB4RTcgKi8KKwkweDUwMUYsMHg0RUNCLDB4NzVBNSwweDhCRUIsMHg1QzRBLDB4NURGRSwweDdCNEIsMHg2NUE0LC8qIDB4RTgtMHhFRiAqLworCTB4OTFEMSwweDRFQ0EsMHg2RDI1LDB4ODk1RiwweDdEMjcsMHg5NTI2LDB4NEVDNSwweDhDMjgsLyogMHhGMC0weEY3ICovCisJMHg4RkRCLDB4OTc3MywweDY2NEIsMHg3OTgxLDB4OEZEMSwweDcwRUMsMHg2RDc4LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CRVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDdEOTksMHg3RDlBLDB4N0Q5QiwweDdEOUMsMHg3RDlELDB4N0Q5RSwweDdEOUYsMHg3REEwLC8qIDB4NDAtMHg0NyAqLworCTB4N0RBMSwweDdEQTIsMHg3REEzLDB4N0RBNCwweDdEQTUsMHg3REE3LDB4N0RBOCwweDdEQTksLyogMHg0OC0weDRGICovCisJMHg3REFBLDB4N0RBQiwweDdEQUMsMHg3REFELDB4N0RBRiwweDdEQjAsMHg3REIxLDB4N0RCMiwvKiAweDUwLTB4NTcgKi8KKwkweDdEQjMsMHg3REI0LDB4N0RCNSwweDdEQjYsMHg3REI3LDB4N0RCOCwweDdEQjksMHg3REJBLC8qIDB4NTgtMHg1RiAqLworCTB4N0RCQiwweDdEQkMsMHg3REJELDB4N0RCRSwweDdEQkYsMHg3REMwLDB4N0RDMSwweDdEQzIsLyogMHg2MC0weDY3ICovCisJMHg3REMzLDB4N0RDNCwweDdEQzUsMHg3REM2LDB4N0RDNywweDdEQzgsMHg3REM5LDB4N0RDQSwvKiAweDY4LTB4NkYgKi8KKwkweDdEQ0IsMHg3RENDLDB4N0RDRCwweDdEQ0UsMHg3RENGLDB4N0REMCwweDdERDEsMHg3REQyLC8qIDB4NzAtMHg3NyAqLworCTB4N0REMywweDdERDQsMHg3REQ1LDB4N0RENiwweDdERDcsMHg3REQ4LDB4N0REOSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDdEREEsMHg3RERCLDB4N0REQywweDdEREQsMHg3RERFLDB4N0RERiwweDdERTAsMHg3REUxLC8qIDB4ODAtMHg4NyAqLworCTB4N0RFMiwweDdERTMsMHg3REU0LDB4N0RFNSwweDdERTYsMHg3REU3LDB4N0RFOCwweDdERTksLyogMHg4OC0weDhGICovCisJMHg3REVBLDB4N0RFQiwweDdERUMsMHg3REVELDB4N0RFRSwweDdERUYsMHg3REYwLDB4N0RGMSwvKiAweDkwLTB4OTcgKi8KKwkweDdERjIsMHg3REYzLDB4N0RGNCwweDdERjUsMHg3REY2LDB4N0RGNywweDdERjgsMHg3REY5LC8qIDB4OTgtMHg5RiAqLworCTB4N0RGQSwweDVDM0QsMHg1MkIyLDB4ODM0NiwweDUxNjIsMHg4MzBFLDB4Nzc1QiwweDY2NzYsLyogMHhBMC0weEE3ICovCisJMHg5Q0I4LDB4NEVBQywweDYwQ0EsMHg3Q0JFLDB4N0NCMywweDdFQ0YsMHg0RTk1LDB4OEI2NiwvKiAweEE4LTB4QUYgKi8KKwkweDY2NkYsMHg5ODg4LDB4OTc1OSwweDU4ODMsMHg2NTZDLDB4OTU1QywweDVGODQsMHg3NUM5LC8qIDB4QjAtMHhCNyAqLworCTB4OTc1NiwweDdBREYsMHg3QURFLDB4NTFDMCwweDcwQUYsMHg3QTk4LDB4NjNFQSwweDdBNzYsLyogMHhCOC0weEJGICovCisJMHg3RUEwLDB4NzM5NiwweDk3RUQsMHg0RTQ1LDB4NzA3OCwweDRFNUQsMHg5MTUyLDB4NTNBOSwvKiAweEMwLTB4QzcgKi8KKwkweDY1NTEsMHg2NUU3LDB4ODFGQywweDgyMDUsMHg1NDhFLDB4NUMzMSwweDc1OUEsMHg5N0EwLC8qIDB4QzgtMHhDRiAqLworCTB4NjJEOCwweDcyRDksMHg3NUJELDB4NUM0NSwweDlBNzksMHg4M0NBLDB4NUM0MCwweDU0ODAsLyogMHhEMC0weEQ3ICovCisJMHg3N0U5LDB4NEUzRSwweDZDQUUsMHg4MDVBLDB4NjJEMiwweDYzNkUsMHg1REU4LDB4NTE3NywvKiAweEQ4LTB4REYgKi8KKwkweDhEREQsMHg4RTFFLDB4OTUyRiwweDRGRjEsMHg1M0U1LDB4NjBFNywweDcwQUMsMHg1MjY3LC8qIDB4RTAtMHhFNyAqLworCTB4NjM1MCwweDlFNDMsMHg1QTFGLDB4NTAyNiwweDc3MzcsMHg1Mzc3LDB4N0VFMiwweDY0ODUsLyogMHhFOC0weEVGICovCisJMHg2NTJCLDB4NjI4OSwweDYzOTgsMHg1MDE0LDB4NzIzNSwweDg5QzksMHg1MUIzLDB4OEJDMCwvKiAweEYwLTB4RjcgKi8KKwkweDdFREQsMHg1NzQ3LDB4ODNDQywweDk0QTcsMHg1MTlCLDB4NTQxQiwweDVDRkIsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0JGWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4N0RGQiwweDdERkMsMHg3REZELDB4N0RGRSwweDdERkYsMHg3RTAwLDB4N0UwMSwweDdFMDIsLyogMHg0MC0weDQ3ICovCisJMHg3RTAzLDB4N0UwNCwweDdFMDUsMHg3RTA2LDB4N0UwNywweDdFMDgsMHg3RTA5LDB4N0UwQSwvKiAweDQ4LTB4NEYgKi8KKwkweDdFMEIsMHg3RTBDLDB4N0UwRCwweDdFMEUsMHg3RTBGLDB4N0UxMCwweDdFMTEsMHg3RTEyLC8qIDB4NTAtMHg1NyAqLworCTB4N0UxMywweDdFMTQsMHg3RTE1LDB4N0UxNiwweDdFMTcsMHg3RTE4LDB4N0UxOSwweDdFMUEsLyogMHg1OC0weDVGICovCisJMHg3RTFCLDB4N0UxQywweDdFMUQsMHg3RTFFLDB4N0UxRiwweDdFMjAsMHg3RTIxLDB4N0UyMiwvKiAweDYwLTB4NjcgKi8KKwkweDdFMjMsMHg3RTI0LDB4N0UyNSwweDdFMjYsMHg3RTI3LDB4N0UyOCwweDdFMjksMHg3RTJBLC8qIDB4NjgtMHg2RiAqLworCTB4N0UyQiwweDdFMkMsMHg3RTJELDB4N0UyRSwweDdFMkYsMHg3RTMwLDB4N0UzMSwweDdFMzIsLyogMHg3MC0weDc3ICovCisJMHg3RTMzLDB4N0UzNCwweDdFMzUsMHg3RTM2LDB4N0UzNywweDdFMzgsMHg3RTM5LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4N0UzQSwweDdFM0MsMHg3RTNELDB4N0UzRSwweDdFM0YsMHg3RTQwLDB4N0U0MiwweDdFNDMsLyogMHg4MC0weDg3ICovCisJMHg3RTQ0LDB4N0U0NSwweDdFNDYsMHg3RTQ4LDB4N0U0OSwweDdFNEEsMHg3RTRCLDB4N0U0QywvKiAweDg4LTB4OEYgKi8KKwkweDdFNEQsMHg3RTRFLDB4N0U0RiwweDdFNTAsMHg3RTUxLDB4N0U1MiwweDdFNTMsMHg3RTU0LC8qIDB4OTAtMHg5NyAqLworCTB4N0U1NSwweDdFNTYsMHg3RTU3LDB4N0U1OCwweDdFNTksMHg3RTVBLDB4N0U1QiwweDdFNUMsLyogMHg5OC0weDlGICovCisJMHg3RTVELDB4NEZDQSwweDdBRTMsMHg2RDVBLDB4OTBFMSwweDlBOEYsMHg1NTgwLDB4NTQ5NiwvKiAweEEwLTB4QTcgKi8KKwkweDUzNjEsMHg1NEFGLDB4NUYwMCwweDYzRTksMHg2OTc3LDB4NTFFRiwweDYxNjgsMHg1MjBBLC8qIDB4QTgtMHhBRiAqLworCTB4NTgyQSwweDUyRDgsMHg1NzRFLDB4NzgwRCwweDc3MEIsMHg1RUI3LDB4NjE3NywweDdDRTAsLyogMHhCMC0weEI3ICovCisJMHg2MjVCLDB4NjI5NywweDRFQTIsMHg3MDk1LDB4ODAwMywweDYyRjcsMHg3MEU0LDB4OTc2MCwvKiAweEI4LTB4QkYgKi8KKwkweDU3NzcsMHg4MkRCLDB4NjdFRiwweDY4RjUsMHg3OEQ1LDB4OTg5NywweDc5RDEsMHg1OEYzLC8qIDB4QzAtMHhDNyAqLworCTB4NTRCMywweDUzRUYsMHg2RTM0LDB4NTE0QiwweDUyM0IsMHg1QkEyLDB4OEJGRSwweDgwQUYsLyogMHhDOC0weENGICovCisJMHg1NTQzLDB4NTdBNiwweDYwNzMsMHg1NzUxLDB4NTQyRCwweDdBN0EsMHg2MDUwLDB4NUI1NCwvKiAweEQwLTB4RDcgKi8KKwkweDYzQTcsMHg2MkEwLDB4NTNFMywweDYyNjMsMHg1QkM3LDB4NjdBRiwweDU0RUQsMHg3QTlGLC8qIDB4RDgtMHhERiAqLworCTB4ODJFNiwweDkxNzcsMHg1RTkzLDB4ODhFNCwweDU5MzgsMHg1N0FFLDB4NjMwRSwweDhERTgsLyogMHhFMC0weEU3ICovCisJMHg4MEVGLDB4NTc1NywweDdCNzcsMHg0RkE5LDB4NUZFQiwweDVCQkQsMHg2QjNFLDB4NTMyMSwvKiAweEU4LTB4RUYgKi8KKwkweDdCNTAsMHg3MkMyLDB4Njg0NiwweDc3RkYsMHg3NzM2LDB4NjVGNywweDUxQjUsMHg0RThGLC8qIDB4RjAtMHhGNyAqLworCTB4NzZENCwweDVDQkYsMHg3QUE1LDB4ODQ3NSwweDU5NEUsMHg5QjQxLDB4NTA4MCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQzBbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3RTVFLDB4N0U1RiwweDdFNjAsMHg3RTYxLDB4N0U2MiwweDdFNjMsMHg3RTY0LDB4N0U2NSwvKiAweDQwLTB4NDcgKi8KKwkweDdFNjYsMHg3RTY3LDB4N0U2OCwweDdFNjksMHg3RTZBLDB4N0U2QiwweDdFNkMsMHg3RTZELC8qIDB4NDgtMHg0RiAqLworCTB4N0U2RSwweDdFNkYsMHg3RTcwLDB4N0U3MSwweDdFNzIsMHg3RTczLDB4N0U3NCwweDdFNzUsLyogMHg1MC0weDU3ICovCisJMHg3RTc2LDB4N0U3NywweDdFNzgsMHg3RTc5LDB4N0U3QSwweDdFN0IsMHg3RTdDLDB4N0U3RCwvKiAweDU4LTB4NUYgKi8KKwkweDdFN0UsMHg3RTdGLDB4N0U4MCwweDdFODEsMHg3RTgzLDB4N0U4NCwweDdFODUsMHg3RTg2LC8qIDB4NjAtMHg2NyAqLworCTB4N0U4NywweDdFODgsMHg3RTg5LDB4N0U4QSwweDdFOEIsMHg3RThDLDB4N0U4RCwweDdFOEUsLyogMHg2OC0weDZGICovCisJMHg3RThGLDB4N0U5MCwweDdFOTEsMHg3RTkyLDB4N0U5MywweDdFOTQsMHg3RTk1LDB4N0U5NiwvKiAweDcwLTB4NzcgKi8KKwkweDdFOTcsMHg3RTk4LDB4N0U5OSwweDdFOUEsMHg3RTlDLDB4N0U5RCwweDdFOUUsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3RUFFLDB4N0VCNCwweDdFQkIsMHg3RUJDLDB4N0VENiwweDdFRTQsMHg3RUVDLDB4N0VGOSwvKiAweDgwLTB4ODcgKi8KKwkweDdGMEEsMHg3RjEwLDB4N0YxRSwweDdGMzcsMHg3RjM5LDB4N0YzQiwweDdGM0MsMHg3RjNELC8qIDB4ODgtMHg4RiAqLworCTB4N0YzRSwweDdGM0YsMHg3RjQwLDB4N0Y0MSwweDdGNDMsMHg3RjQ2LDB4N0Y0NywweDdGNDgsLyogMHg5MC0weDk3ICovCisJMHg3RjQ5LDB4N0Y0QSwweDdGNEIsMHg3RjRDLDB4N0Y0RCwweDdGNEUsMHg3RjRGLDB4N0Y1MiwvKiAweDk4LTB4OUYgKi8KKwkweDdGNTMsMHg5OTg4LDB4NjEyNywweDZFODMsMHg1NzY0LDB4NjYwNiwweDYzNDYsMHg1NkYwLC8qIDB4QTAtMHhBNyAqLworCTB4NjJFQywweDYyNjksMHg1RUQzLDB4OTYxNCwweDU3ODMsMHg2MkM5LDB4NTU4NywweDg3MjEsLyogMHhBOC0weEFGICovCisJMHg4MTRBLDB4OEZBMywweDU1NjYsMHg4M0IxLDB4Njc2NSwweDhENTYsMHg4NERELDB4NUE2QSwvKiAweEIwLTB4QjcgKi8KKwkweDY4MEYsMHg2MkU2LDB4N0JFRSwweDk2MTEsMHg1MTcwLDB4NkY5QywweDhDMzAsMHg2M0ZELC8qIDB4QjgtMHhCRiAqLworCTB4ODlDOCwweDYxRDIsMHg3RjA2LDB4NzBDMiwweDZFRTUsMHg3NDA1LDB4Njk5NCwweDcyRkMsLyogMHhDMC0weEM3ICovCisJMHg1RUNBLDB4OTBDRSwweDY3MTcsMHg2RDZBLDB4NjM1RSwweDUyQjMsMHg3MjYyLDB4ODAwMSwvKiAweEM4LTB4Q0YgKi8KKwkweDRGNkMsMHg1OUU1LDB4OTE2QSwweDcwRDksMHg2RDlELDB4NTJEMiwweDRFNTAsMHg5NkY3LC8qIDB4RDAtMHhENyAqLworCTB4OTU2RCwweDg1N0UsMHg3OENBLDB4N0QyRiwweDUxMjEsMHg1NzkyLDB4NjRDMiwweDgwOEIsLyogMHhEOC0weERGICovCisJMHg3QzdCLDB4NkNFQSwweDY4RjEsMHg2OTVFLDB4NTFCNywweDUzOTgsMHg2OEE4LDB4NzI4MSwvKiAweEUwLTB4RTcgKi8KKwkweDlFQ0UsMHg3QkYxLDB4NzJGOCwweDc5QkIsMHg2RjEzLDB4NzQwNiwweDY3NEUsMHg5MUNDLC8qIDB4RTgtMHhFRiAqLworCTB4OUNBNCwweDc5M0MsMHg4Mzg5LDB4ODM1NCwweDU0MEYsMHg2ODE3LDB4NEUzRCwweDUzODksLyogMHhGMC0weEY3ICovCisJMHg1MkIxLDB4NzgzRSwweDUzODYsMHg1MjI5LDB4NTA4OCwweDRGOEIsMHg0RkQwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DMVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDdGNTYsMHg3RjU5LDB4N0Y1QiwweDdGNUMsMHg3RjVELDB4N0Y1RSwweDdGNjAsMHg3RjYzLC8qIDB4NDAtMHg0NyAqLworCTB4N0Y2NCwweDdGNjUsMHg3RjY2LDB4N0Y2NywweDdGNkIsMHg3RjZDLDB4N0Y2RCwweDdGNkYsLyogMHg0OC0weDRGICovCisJMHg3RjcwLDB4N0Y3MywweDdGNzUsMHg3Rjc2LDB4N0Y3NywweDdGNzgsMHg3RjdBLDB4N0Y3QiwvKiAweDUwLTB4NTcgKi8KKwkweDdGN0MsMHg3RjdELDB4N0Y3RiwweDdGODAsMHg3RjgyLDB4N0Y4MywweDdGODQsMHg3Rjg1LC8qIDB4NTgtMHg1RiAqLworCTB4N0Y4NiwweDdGODcsMHg3Rjg4LDB4N0Y4OSwweDdGOEIsMHg3RjhELDB4N0Y4RiwweDdGOTAsLyogMHg2MC0weDY3ICovCisJMHg3RjkxLDB4N0Y5MiwweDdGOTMsMHg3Rjk1LDB4N0Y5NiwweDdGOTcsMHg3Rjk4LDB4N0Y5OSwvKiAweDY4LTB4NkYgKi8KKwkweDdGOUIsMHg3RjlDLDB4N0ZBMCwweDdGQTIsMHg3RkEzLDB4N0ZBNSwweDdGQTYsMHg3RkE4LC8qIDB4NzAtMHg3NyAqLworCTB4N0ZBOSwweDdGQUEsMHg3RkFCLDB4N0ZBQywweDdGQUQsMHg3RkFFLDB4N0ZCMSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDdGQjMsMHg3RkI0LDB4N0ZCNSwweDdGQjYsMHg3RkI3LDB4N0ZCQSwweDdGQkIsMHg3RkJFLC8qIDB4ODAtMHg4NyAqLworCTB4N0ZDMCwweDdGQzIsMHg3RkMzLDB4N0ZDNCwweDdGQzYsMHg3RkM3LDB4N0ZDOCwweDdGQzksLyogMHg4OC0weDhGICovCisJMHg3RkNCLDB4N0ZDRCwweDdGQ0YsMHg3RkQwLDB4N0ZEMSwweDdGRDIsMHg3RkQzLDB4N0ZENiwvKiAweDkwLTB4OTcgKi8KKwkweDdGRDcsMHg3RkQ5LDB4N0ZEQSwweDdGREIsMHg3RkRDLDB4N0ZERCwweDdGREUsMHg3RkUyLC8qIDB4OTgtMHg5RiAqLworCTB4N0ZFMywweDc1RTIsMHg3QUNCLDB4N0M5MiwweDZDQTUsMHg5NkI2LDB4NTI5QiwweDc0ODMsLyogMHhBMC0weEE3ICovCisJMHg1NEU5LDB4NEZFOSwweDgwNTQsMHg4M0IyLDB4OEZERSwweDk1NzAsMHg1RUM5LDB4NjAxQywvKiAweEE4LTB4QUYgKi8KKwkweDZEOUYsMHg1RTE4LDB4NjU1QiwweDgxMzgsMHg5NEZFLDB4NjA0QiwweDcwQkMsMHg3RUMzLC8qIDB4QjAtMHhCNyAqLworCTB4N0NBRSwweDUxQzksMHg2ODgxLDB4N0NCMSwweDgyNkYsMHg0RTI0LDB4OEY4NiwweDkxQ0YsLyogMHhCOC0weEJGICovCisJMHg2NjdFLDB4NEVBRSwweDhDMDUsMHg2NEE5LDB4ODA0QSwweDUwREEsMHg3NTk3LDB4NzFDRSwvKiAweEMwLTB4QzcgKi8KKwkweDVCRTUsMHg4RkJELDB4NkY2NiwweDRFODYsMHg2NDgyLDB4OTU2MywweDVFRDYsMHg2NTk5LC8qIDB4QzgtMHhDRiAqLworCTB4NTIxNywweDg4QzIsMHg3MEM4LDB4NTJBMywweDczMEUsMHg3NDMzLDB4Njc5NywweDc4RjcsLyogMHhEMC0weEQ3ICovCisJMHg5NzE2LDB4NEUzNCwweDkwQkIsMHg5Q0RFLDB4NkRDQiwweDUxREIsMHg4RDQxLDB4NTQxRCwvKiAweEQ4LTB4REYgKi8KKwkweDYyQ0UsMHg3M0IyLDB4ODNGMSwweDk2RjYsMHg5Rjg0LDB4OTRDMywweDRGMzYsMHg3RjlBLC8qIDB4RTAtMHhFNyAqLworCTB4NTFDQywweDcwNzUsMHg5Njc1LDB4NUNBRCwweDk4ODYsMHg1M0U2LDB4NEVFNCwweDZFOUMsLyogMHhFOC0weEVGICovCisJMHg3NDA5LDB4NjlCNCwweDc4NkIsMHg5OThGLDB4NzU1OSwweDUyMTgsMHg3NjI0LDB4NkQ0MSwvKiAweEYwLTB4RjcgKi8KKwkweDY3RjMsMHg1MTZELDB4OUY5OSwweDgwNEIsMHg1NDk5LDB4N0IzQywweDdBQkYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0MyWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4N0ZFNCwweDdGRTcsMHg3RkU4LDB4N0ZFQSwweDdGRUIsMHg3RkVDLDB4N0ZFRCwweDdGRUYsLyogMHg0MC0weDQ3ICovCisJMHg3RkYyLDB4N0ZGNCwweDdGRjUsMHg3RkY2LDB4N0ZGNywweDdGRjgsMHg3RkY5LDB4N0ZGQSwvKiAweDQ4LTB4NEYgKi8KKwkweDdGRkQsMHg3RkZFLDB4N0ZGRiwweDgwMDIsMHg4MDA3LDB4ODAwOCwweDgwMDksMHg4MDBBLC8qIDB4NTAtMHg1NyAqLworCTB4ODAwRSwweDgwMEYsMHg4MDExLDB4ODAxMywweDgwMUEsMHg4MDFCLDB4ODAxRCwweDgwMUUsLyogMHg1OC0weDVGICovCisJMHg4MDFGLDB4ODAyMSwweDgwMjMsMHg4MDI0LDB4ODAyQiwweDgwMkMsMHg4MDJELDB4ODAyRSwvKiAweDYwLTB4NjcgKi8KKwkweDgwMkYsMHg4MDMwLDB4ODAzMiwweDgwMzQsMHg4MDM5LDB4ODAzQSwweDgwM0MsMHg4MDNFLC8qIDB4NjgtMHg2RiAqLworCTB4ODA0MCwweDgwNDEsMHg4MDQ0LDB4ODA0NSwweDgwNDcsMHg4MDQ4LDB4ODA0OSwweDgwNEUsLyogMHg3MC0weDc3ICovCisJMHg4MDRGLDB4ODA1MCwweDgwNTEsMHg4MDUzLDB4ODA1NSwweDgwNTYsMHg4MDU3LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4ODA1OSwweDgwNUIsMHg4MDVDLDB4ODA1RCwweDgwNUUsMHg4MDVGLDB4ODA2MCwweDgwNjEsLyogMHg4MC0weDg3ICovCisJMHg4MDYyLDB4ODA2MywweDgwNjQsMHg4MDY1LDB4ODA2NiwweDgwNjcsMHg4MDY4LDB4ODA2QiwvKiAweDg4LTB4OEYgKi8KKwkweDgwNkMsMHg4MDZELDB4ODA2RSwweDgwNkYsMHg4MDcwLDB4ODA3MiwweDgwNzMsMHg4MDc0LC8qIDB4OTAtMHg5NyAqLworCTB4ODA3NSwweDgwNzYsMHg4MDc3LDB4ODA3OCwweDgwNzksMHg4MDdBLDB4ODA3QiwweDgwN0MsLyogMHg5OC0weDlGICovCisJMHg4MDdELDB4OTY4NiwweDU3ODQsMHg2MkUyLDB4OTY0NywweDY5N0MsMHg1QTA0LDB4NjQwMiwvKiAweEEwLTB4QTcgKi8KKwkweDdCRDMsMHg2RjBGLDB4OTY0QiwweDgyQTYsMHg1MzYyLDB4OTg4NSwweDVFOTAsMHg3MDg5LC8qIDB4QTgtMHhBRiAqLworCTB4NjNCMywweDUzNjQsMHg4NjRGLDB4OUM4MSwweDlFOTMsMHg3ODhDLDB4OTczMiwweDhERUYsLyogMHhCMC0weEI3ICovCisJMHg4RDQyLDB4OUU3RiwweDZGNUUsMHg3OTg0LDB4NUY1NSwweDk2NDYsMHg2MjJFLDB4OUE3NCwvKiAweEI4LTB4QkYgKi8KKwkweDU0MTUsMHg5NERELDB4NEZBMywweDY1QzUsMHg1QzY1LDB4NUM2MSwweDdGMTUsMHg4NjUxLC8qIDB4QzAtMHhDNyAqLworCTB4NkMyRiwweDVGOEIsMHg3Mzg3LDB4NkVFNCwweDdFRkYsMHg1Q0U2LDB4NjMxQiwweDVCNkEsLyogMHhDOC0weENGICovCisJMHg2RUU2LDB4NTM3NSwweDRFNzEsMHg2M0EwLDB4NzU2NSwweDYyQTEsMHg4RjZFLDB4NEYyNiwvKiAweEQwLTB4RDcgKi8KKwkweDRFRDEsMHg2Q0E2LDB4N0VCNiwweDhCQkEsMHg4NDFELDB4ODdCQSwweDdGNTcsMHg5MDNCLC8qIDB4RDgtMHhERiAqLworCTB4OTUyMywweDdCQTksMHg5QUExLDB4ODhGOCwweDg0M0QsMHg2RDFCLDB4OUE4NiwweDdFREMsLyogMHhFMC0weEU3ICovCisJMHg1OTg4LDB4OUVCQiwweDczOUIsMHg3ODAxLDB4ODY4MiwweDlBNkMsMHg5QTgyLDB4NTYxQiwvKiAweEU4LTB4RUYgKi8KKwkweDU0MTcsMHg1N0NCLDB4NEU3MCwweDlFQTYsMHg1MzU2LDB4OEZDOCwweDgxMDksMHg3NzkyLC8qIDB4RjAtMHhGNyAqLworCTB4OTk5MiwweDg2RUUsMHg2RUUxLDB4ODUxMywweDY2RkMsMHg2MTYyLDB4NkYyQiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQzNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4MDdFLDB4ODA4MSwweDgwODIsMHg4MDg1LDB4ODA4OCwweDgwOEEsMHg4MDhELDB4ODA4RSwvKiAweDQwLTB4NDcgKi8KKwkweDgwOEYsMHg4MDkwLDB4ODA5MSwweDgwOTIsMHg4MDk0LDB4ODA5NSwweDgwOTcsMHg4MDk5LC8qIDB4NDgtMHg0RiAqLworCTB4ODA5RSwweDgwQTMsMHg4MEE2LDB4ODBBNywweDgwQTgsMHg4MEFDLDB4ODBCMCwweDgwQjMsLyogMHg1MC0weDU3ICovCisJMHg4MEI1LDB4ODBCNiwweDgwQjgsMHg4MEI5LDB4ODBCQiwweDgwQzUsMHg4MEM3LDB4ODBDOCwvKiAweDU4LTB4NUYgKi8KKwkweDgwQzksMHg4MENBLDB4ODBDQiwweDgwQ0YsMHg4MEQwLDB4ODBEMSwweDgwRDIsMHg4MEQzLC8qIDB4NjAtMHg2NyAqLworCTB4ODBENCwweDgwRDUsMHg4MEQ4LDB4ODBERiwweDgwRTAsMHg4MEUyLDB4ODBFMywweDgwRTYsLyogMHg2OC0weDZGICovCisJMHg4MEVFLDB4ODBGNSwweDgwRjcsMHg4MEY5LDB4ODBGQiwweDgwRkUsMHg4MEZGLDB4ODEwMCwvKiAweDcwLTB4NzcgKi8KKwkweDgxMDEsMHg4MTAzLDB4ODEwNCwweDgxMDUsMHg4MTA3LDB4ODEwOCwweDgxMEIsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4MTBDLDB4ODExNSwweDgxMTcsMHg4MTE5LDB4ODExQiwweDgxMUMsMHg4MTFELDB4ODExRiwvKiAweDgwLTB4ODcgKi8KKwkweDgxMjAsMHg4MTIxLDB4ODEyMiwweDgxMjMsMHg4MTI0LDB4ODEyNSwweDgxMjYsMHg4MTI3LC8qIDB4ODgtMHg4RiAqLworCTB4ODEyOCwweDgxMjksMHg4MTJBLDB4ODEyQiwweDgxMkQsMHg4MTJFLDB4ODEzMCwweDgxMzMsLyogMHg5MC0weDk3ICovCisJMHg4MTM0LDB4ODEzNSwweDgxMzcsMHg4MTM5LDB4ODEzQSwweDgxM0IsMHg4MTNDLDB4ODEzRCwvKiAweDk4LTB4OUYgKi8KKwkweDgxM0YsMHg4QzI5LDB4ODI5MiwweDgzMkIsMHg3NkYyLDB4NkMxMywweDVGRDksMHg4M0JELC8qIDB4QTAtMHhBNyAqLworCTB4NzMyQiwweDgzMDUsMHg5NTFBLDB4NkJEQiwweDc3REIsMHg5NEM2LDB4NTM2RiwweDgzMDIsLyogMHhBOC0weEFGICovCisJMHg1MTkyLDB4NUUzRCwweDhDOEMsMHg4RDM4LDB4NEU0OCwweDczQUIsMHg2NzlBLDB4Njg4NSwvKiAweEIwLTB4QjcgKi8KKwkweDkxNzYsMHg5NzA5LDB4NzE2NCwweDZDQTEsMHg3NzA5LDB4NUE5MiwweDk1NDEsMHg2QkNGLC8qIDB4QjgtMHhCRiAqLworCTB4N0Y4RSwweDY2MjcsMHg1QkQwLDB4NTlCOSwweDVBOUEsMHg5NUU4LDB4OTVGNywweDRFRUMsLyogMHhDMC0weEM3ICovCisJMHg4NDBDLDB4ODQ5OSwweDZBQUMsMHg3NkRGLDB4OTUzMCwweDczMUIsMHg2OEE2LDB4NUI1RiwvKiAweEM4LTB4Q0YgKi8KKwkweDc3MkYsMHg5MTlBLDB4OTc2MSwweDdDREMsMHg4RkY3LDB4OEMxQywweDVGMjUsMHg3QzczLC8qIDB4RDAtMHhENyAqLworCTB4NzlEOCwweDg5QzUsMHg2Q0NDLDB4ODcxQywweDVCQzYsMHg1RTQyLDB4NjhDOSwweDc3MjAsLyogMHhEOC0weERGICovCisJMHg3RUY1LDB4NTE5NSwweDUxNEQsMHg1MkM5LDB4NUEyOSwweDdGMDUsMHg5NzYyLDB4ODJENywvKiAweEUwLTB4RTcgKi8KKwkweDYzQ0YsMHg3Nzg0LDB4ODVEMCwweDc5RDIsMHg2RTNBLDB4NUU5OSwweDU5OTksMHg4NTExLC8qIDB4RTgtMHhFRiAqLworCTB4NzA2RCwweDZDMTEsMHg2MkJGLDB4NzZCRiwweDY1NEYsMHg2MEFGLDB4OTVGRCwweDY2MEUsLyogMHhGMC0weEY3ICovCisJMHg4NzlGLDB4OUUyMywweDk0RUQsMHg1NDBELDB4NTQ3RCwweDhDMkMsMHg2NDc4LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DNFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDgxNDAsMHg4MTQxLDB4ODE0MiwweDgxNDMsMHg4MTQ0LDB4ODE0NSwweDgxNDcsMHg4MTQ5LC8qIDB4NDAtMHg0NyAqLworCTB4ODE0RCwweDgxNEUsMHg4MTRGLDB4ODE1MiwweDgxNTYsMHg4MTU3LDB4ODE1OCwweDgxNUIsLyogMHg0OC0weDRGICovCisJMHg4MTVDLDB4ODE1RCwweDgxNUUsMHg4MTVGLDB4ODE2MSwweDgxNjIsMHg4MTYzLDB4ODE2NCwvKiAweDUwLTB4NTcgKi8KKwkweDgxNjYsMHg4MTY4LDB4ODE2QSwweDgxNkIsMHg4MTZDLDB4ODE2RiwweDgxNzIsMHg4MTczLC8qIDB4NTgtMHg1RiAqLworCTB4ODE3NSwweDgxNzYsMHg4MTc3LDB4ODE3OCwweDgxODEsMHg4MTgzLDB4ODE4NCwweDgxODUsLyogMHg2MC0weDY3ICovCisJMHg4MTg2LDB4ODE4NywweDgxODksMHg4MThCLDB4ODE4QywweDgxOEQsMHg4MThFLDB4ODE5MCwvKiAweDY4LTB4NkYgKi8KKwkweDgxOTIsMHg4MTkzLDB4ODE5NCwweDgxOTUsMHg4MTk2LDB4ODE5NywweDgxOTksMHg4MTlBLC8qIDB4NzAtMHg3NyAqLworCTB4ODE5RSwweDgxOUYsMHg4MUEwLDB4ODFBMSwweDgxQTIsMHg4MUE0LDB4ODFBNSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDgxQTcsMHg4MUE5LDB4ODFBQiwweDgxQUMsMHg4MUFELDB4ODFBRSwweDgxQUYsMHg4MUIwLC8qIDB4ODAtMHg4NyAqLworCTB4ODFCMSwweDgxQjIsMHg4MUI0LDB4ODFCNSwweDgxQjYsMHg4MUI3LDB4ODFCOCwweDgxQjksLyogMHg4OC0weDhGICovCisJMHg4MUJDLDB4ODFCRCwweDgxQkUsMHg4MUJGLDB4ODFDNCwweDgxQzUsMHg4MUM3LDB4ODFDOCwvKiAweDkwLTB4OTcgKi8KKwkweDgxQzksMHg4MUNCLDB4ODFDRCwweDgxQ0UsMHg4MUNGLDB4ODFEMCwweDgxRDEsMHg4MUQyLC8qIDB4OTgtMHg5RiAqLworCTB4ODFEMywweDY0NzksMHg4NjExLDB4NkEyMSwweDgxOUMsMHg3OEU4LDB4NjQ2OSwweDlCNTQsLyogMHhBMC0weEE3ICovCisJMHg2MkI5LDB4NjcyQiwweDgzQUIsMHg1OEE4LDB4OUVEOCwweDZDQUIsMHg2RjIwLDB4NUJERSwvKiAweEE4LTB4QUYgKi8KKwkweDk2NEMsMHg4QzBCLDB4NzI1RiwweDY3RDAsMHg2MkM3LDB4NzI2MSwweDRFQTksMHg1OUM2LC8qIDB4QjAtMHhCNyAqLworCTB4NkJDRCwweDU4OTMsMHg2NkFFLDB4NUU1NSwweDUyREYsMHg2MTU1LDB4NjcyOCwweDc2RUUsLyogMHhCOC0weEJGICovCisJMHg3NzY2LDB4NzI2NywweDdBNDYsMHg2MkZGLDB4NTRFQSwweDU0NTAsMHg5NEEwLDB4OTBBMywvKiAweEMwLTB4QzcgKi8KKwkweDVBMUMsMHg3RUIzLDB4NkMxNiwweDRFNDMsMHg1OTc2LDB4ODAxMCwweDU5NDgsMHg1MzU3LC8qIDB4QzgtMHhDRiAqLworCTB4NzUzNywweDk2QkUsMHg1NkNBLDB4NjMyMCwweDgxMTEsMHg2MDdDLDB4OTVGOSwweDZERDYsLyogMHhEMC0weEQ3ICovCisJMHg1NDYyLDB4OTk4MSwweDUxODUsMHg1QUU5LDB4ODBGRCwweDU5QUUsMHg5NzEzLDB4NTAyQSwvKiAweEQ4LTB4REYgKi8KKwkweDZDRTUsMHg1QzNDLDB4NjJERiwweDRGNjAsMHg1MzNGLDB4ODE3QiwweDkwMDYsMHg2RUJBLC8qIDB4RTAtMHhFNyAqLworCTB4ODUyQiwweDYyQzgsMHg1RTc0LDB4NzhCRSwweDY0QjUsMHg2MzdCLDB4NUZGNSwweDVBMTgsLyogMHhFOC0weEVGICovCisJMHg5MTdGLDB4OUUxRiwweDVDM0YsMHg2MzRGLDB4ODA0MiwweDVCN0QsMHg1NTZFLDB4OTU0QSwvKiAweEYwLTB4RjcgKi8KKwkweDk1NEQsMHg2RDg1LDB4NjBBOCwweDY3RTAsMHg3MkRFLDB4NTFERCwweDVCODEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0M1WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4ODFENCwweDgxRDUsMHg4MUQ2LDB4ODFENywweDgxRDgsMHg4MUQ5LDB4ODFEQSwweDgxREIsLyogMHg0MC0weDQ3ICovCisJMHg4MURDLDB4ODFERCwweDgxREUsMHg4MURGLDB4ODFFMCwweDgxRTEsMHg4MUUyLDB4ODFFNCwvKiAweDQ4LTB4NEYgKi8KKwkweDgxRTUsMHg4MUU2LDB4ODFFOCwweDgxRTksMHg4MUVCLDB4ODFFRSwweDgxRUYsMHg4MUYwLC8qIDB4NTAtMHg1NyAqLworCTB4ODFGMSwweDgxRjIsMHg4MUY1LDB4ODFGNiwweDgxRjcsMHg4MUY4LDB4ODFGOSwweDgxRkEsLyogMHg1OC0weDVGICovCisJMHg4MUZELDB4ODFGRiwweDgyMDMsMHg4MjA3LDB4ODIwOCwweDgyMDksMHg4MjBBLDB4ODIwQiwvKiAweDYwLTB4NjcgKi8KKwkweDgyMEUsMHg4MjBGLDB4ODIxMSwweDgyMTMsMHg4MjE1LDB4ODIxNiwweDgyMTcsMHg4MjE4LC8qIDB4NjgtMHg2RiAqLworCTB4ODIxOSwweDgyMUEsMHg4MjFELDB4ODIyMCwweDgyMjQsMHg4MjI1LDB4ODIyNiwweDgyMjcsLyogMHg3MC0weDc3ICovCisJMHg4MjI5LDB4ODIyRSwweDgyMzIsMHg4MjNBLDB4ODIzQywweDgyM0QsMHg4MjNGLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4ODI0MCwweDgyNDEsMHg4MjQyLDB4ODI0MywweDgyNDUsMHg4MjQ2LDB4ODI0OCwweDgyNEEsLyogMHg4MC0weDg3ICovCisJMHg4MjRDLDB4ODI0RCwweDgyNEUsMHg4MjUwLDB4ODI1MSwweDgyNTIsMHg4MjUzLDB4ODI1NCwvKiAweDg4LTB4OEYgKi8KKwkweDgyNTUsMHg4MjU2LDB4ODI1NywweDgyNTksMHg4MjVCLDB4ODI1QywweDgyNUQsMHg4MjVFLC8qIDB4OTAtMHg5NyAqLworCTB4ODI2MCwweDgyNjEsMHg4MjYyLDB4ODI2MywweDgyNjQsMHg4MjY1LDB4ODI2NiwweDgyNjcsLyogMHg5OC0weDlGICovCisJMHg4MjY5LDB4NjJFNywweDZDREUsMHg3MjVCLDB4NjI2RCwweDk0QUUsMHg3RUJELDB4ODExMywvKiAweEEwLTB4QTcgKi8KKwkweDZENTMsMHg1MTlDLDB4NUYwNCwweDU5NzQsMHg1MkFBLDB4NjAxMiwweDU5NzMsMHg2Njk2LC8qIDB4QTgtMHhBRiAqLworCTB4ODY1MCwweDc1OUYsMHg2MzJBLDB4NjFFNiwweDdDRUYsMHg4QkZBLDB4NTRFNiwweDZCMjcsLyogMHhCMC0weEI3ICovCisJMHg5RTI1LDB4NkJCNCwweDg1RDUsMHg1NDU1LDB4NTA3NiwweDZDQTQsMHg1NTZBLDB4OERCNCwvKiAweEI4LTB4QkYgKi8KKwkweDcyMkMsMHg1RTE1LDB4NjAxNSwweDc0MzYsMHg2MkNELDB4NjM5MiwweDcyNEMsMHg1Rjk4LC8qIDB4QzAtMHhDNyAqLworCTB4NkU0MywweDZEM0UsMHg2NTAwLDB4NkY1OCwweDc2RDgsMHg3OEQwLDB4NzZGQywweDc1NTQsLyogMHhDOC0weENGICovCisJMHg1MjI0LDB4NTNEQiwweDRFNTMsMHg1RTlFLDB4NjVDMSwweDgwMkEsMHg4MEQ2LDB4NjI5QiwvKiAweEQwLTB4RDcgKi8KKwkweDU0ODYsMHg1MjI4LDB4NzBBRSwweDg4OEQsMHg4REQxLDB4NkNFMSwweDU0NzgsMHg4MERBLC8qIDB4RDgtMHhERiAqLworCTB4NTdGOSwweDg4RjQsMHg4RDU0LDB4OTY2QSwweDkxNEQsMHg0RjY5LDB4NkM5QiwweDU1QjcsLyogMHhFMC0weEU3ICovCisJMHg3NkM2LDB4NzgzMCwweDYyQTgsMHg3MEY5LDB4NkY4RSwweDVGNkQsMHg4NEVDLDB4NjhEQSwvKiAweEU4LTB4RUYgKi8KKwkweDc4N0MsMHg3QkY3LDB4ODFBOCwweDY3MEIsMHg5RTRGLDB4NjM2NywweDc4QjAsMHg1NzZGLC8qIDB4RjAtMHhGNyAqLworCTB4NzgxMiwweDk3MzksMHg2Mjc5LDB4NjJBQiwweDUyODgsMHg3NDM1LDB4NkJENywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQzZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4MjZBLDB4ODI2QiwweDgyNkMsMHg4MjZELDB4ODI3MSwweDgyNzUsMHg4Mjc2LDB4ODI3NywvKiAweDQwLTB4NDcgKi8KKwkweDgyNzgsMHg4MjdCLDB4ODI3QywweDgyODAsMHg4MjgxLDB4ODI4MywweDgyODUsMHg4Mjg2LC8qIDB4NDgtMHg0RiAqLworCTB4ODI4NywweDgyODksMHg4MjhDLDB4ODI5MCwweDgyOTMsMHg4Mjk0LDB4ODI5NSwweDgyOTYsLyogMHg1MC0weDU3ICovCisJMHg4MjlBLDB4ODI5QiwweDgyOUUsMHg4MkEwLDB4ODJBMiwweDgyQTMsMHg4MkE3LDB4ODJCMiwvKiAweDU4LTB4NUYgKi8KKwkweDgyQjUsMHg4MkI2LDB4ODJCQSwweDgyQkIsMHg4MkJDLDB4ODJCRiwweDgyQzAsMHg4MkMyLC8qIDB4NjAtMHg2NyAqLworCTB4ODJDMywweDgyQzUsMHg4MkM2LDB4ODJDOSwweDgyRDAsMHg4MkQ2LDB4ODJEOSwweDgyREEsLyogMHg2OC0weDZGICovCisJMHg4MkRELDB4ODJFMiwweDgyRTcsMHg4MkU4LDB4ODJFOSwweDgyRUEsMHg4MkVDLDB4ODJFRCwvKiAweDcwLTB4NzcgKi8KKwkweDgyRUUsMHg4MkYwLDB4ODJGMiwweDgyRjMsMHg4MkY1LDB4ODJGNiwweDgyRjgsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4MkZBLDB4ODJGQywweDgyRkQsMHg4MkZFLDB4ODJGRiwweDgzMDAsMHg4MzBBLDB4ODMwQiwvKiAweDgwLTB4ODcgKi8KKwkweDgzMEQsMHg4MzEwLDB4ODMxMiwweDgzMTMsMHg4MzE2LDB4ODMxOCwweDgzMTksMHg4MzFELC8qIDB4ODgtMHg4RiAqLworCTB4ODMxRSwweDgzMUYsMHg4MzIwLDB4ODMyMSwweDgzMjIsMHg4MzIzLDB4ODMyNCwweDgzMjUsLyogMHg5MC0weDk3ICovCisJMHg4MzI2LDB4ODMyOSwweDgzMkEsMHg4MzJFLDB4ODMzMCwweDgzMzIsMHg4MzM3LDB4ODMzQiwvKiAweDk4LTB4OUYgKi8KKwkweDgzM0QsMHg1NTY0LDB4ODEzRSwweDc1QjIsMHg3NkFFLDB4NTMzOSwweDc1REUsMHg1MEZCLC8qIDB4QTAtMHhBNyAqLworCTB4NUM0MSwweDhCNkMsMHg3QkM3LDB4NTA0RiwweDcyNDcsMHg5QTk3LDB4OThEOCwweDZGMDIsLyogMHhBOC0weEFGICovCisJMHg3NEUyLDB4Nzk2OCwweDY0ODcsMHg3N0E1LDB4NjJGQywweDk4OTEsMHg4RDJCLDB4NTRDMSwvKiAweEIwLTB4QjcgKi8KKwkweDgwNTgsMHg0RTUyLDB4NTc2QSwweDgyRjksMHg4NDBELDB4NUU3MywweDUxRUQsMHg3NEY2LC8qIDB4QjgtMHhCRiAqLworCTB4OEJDNCwweDVDNEYsMHg1NzYxLDB4NkNGQywweDk4ODcsMHg1QTQ2LDB4NzgzNCwweDlCNDQsLyogMHhDMC0weEM3ICovCisJMHg4RkVCLDB4N0M5NSwweDUyNTYsMHg2MjUxLDB4OTRGQSwweDRFQzYsMHg4Mzg2LDB4ODQ2MSwvKiAweEM4LTB4Q0YgKi8KKwkweDgzRTksMHg4NEIyLDB4NTdENCwweDY3MzQsMHg1NzAzLDB4NjY2RSwweDZENjYsMHg4QzMxLC8qIDB4RDAtMHhENyAqLworCTB4NjZERCwweDcwMTEsMHg2NzFGLDB4NkIzQSwweDY4MTYsMHg2MjFBLDB4NTlCQiwweDRFMDMsLyogMHhEOC0weERGICovCisJMHg1MUM0LDB4NkYwNiwweDY3RDIsMHg2QzhGLDB4NTE3NiwweDY4Q0IsMHg1OTQ3LDB4NkI2NywvKiAweEUwLTB4RTcgKi8KKwkweDc1NjYsMHg1RDBFLDB4ODExMCwweDlGNTAsMHg2NUQ3LDB4Nzk0OCwweDc5NDEsMHg5QTkxLC8qIDB4RTgtMHhFRiAqLworCTB4OEQ3NywweDVDODIsMHg0RTVFLDB4NEYwMSwweDU0MkYsMHg1OTUxLDB4NzgwQywweDU2NjgsLyogMHhGMC0weEY3ICovCisJMHg2QzE0LDB4OEZDNCwweDVGMDMsMHg2QzdELDB4NkNFMywweDhCQUIsMHg2MzkwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DN1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDgzM0UsMHg4MzNGLDB4ODM0MSwweDgzNDIsMHg4MzQ0LDB4ODM0NSwweDgzNDgsMHg4MzRBLC8qIDB4NDAtMHg0NyAqLworCTB4ODM0QiwweDgzNEMsMHg4MzRELDB4ODM0RSwweDgzNTMsMHg4MzU1LDB4ODM1NiwweDgzNTcsLyogMHg0OC0weDRGICovCisJMHg4MzU4LDB4ODM1OSwweDgzNUQsMHg4MzYyLDB4ODM3MCwweDgzNzEsMHg4MzcyLDB4ODM3MywvKiAweDUwLTB4NTcgKi8KKwkweDgzNzQsMHg4Mzc1LDB4ODM3NiwweDgzNzksMHg4MzdBLDB4ODM3RSwweDgzN0YsMHg4MzgwLC8qIDB4NTgtMHg1RiAqLworCTB4ODM4MSwweDgzODIsMHg4MzgzLDB4ODM4NCwweDgzODcsMHg4Mzg4LDB4ODM4QSwweDgzOEIsLyogMHg2MC0weDY3ICovCisJMHg4MzhDLDB4ODM4RCwweDgzOEYsMHg4MzkwLDB4ODM5MSwweDgzOTQsMHg4Mzk1LDB4ODM5NiwvKiAweDY4LTB4NkYgKi8KKwkweDgzOTcsMHg4Mzk5LDB4ODM5QSwweDgzOUQsMHg4MzlGLDB4ODNBMSwweDgzQTIsMHg4M0EzLC8qIDB4NzAtMHg3NyAqLworCTB4ODNBNCwweDgzQTUsMHg4M0E2LDB4ODNBNywweDgzQUMsMHg4M0FELDB4ODNBRSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDgzQUYsMHg4M0I1LDB4ODNCQiwweDgzQkUsMHg4M0JGLDB4ODNDMiwweDgzQzMsMHg4M0M0LC8qIDB4ODAtMHg4NyAqLworCTB4ODNDNiwweDgzQzgsMHg4M0M5LDB4ODNDQiwweDgzQ0QsMHg4M0NFLDB4ODNEMCwweDgzRDEsLyogMHg4OC0weDhGICovCisJMHg4M0QyLDB4ODNEMywweDgzRDUsMHg4M0Q3LDB4ODNEOSwweDgzREEsMHg4M0RCLDB4ODNERSwvKiAweDkwLTB4OTcgKi8KKwkweDgzRTIsMHg4M0UzLDB4ODNFNCwweDgzRTYsMHg4M0U3LDB4ODNFOCwweDgzRUIsMHg4M0VDLC8qIDB4OTgtMHg5RiAqLworCTB4ODNFRCwweDYwNzAsMHg2RDNELDB4NzI3NSwweDYyNjYsMHg5NDhFLDB4OTRDNSwweDUzNDMsLyogMHhBMC0weEE3ICovCisJMHg4RkMxLDB4N0I3RSwweDRFREYsMHg4QzI2LDB4NEU3RSwweDlFRDQsMHg5NEIxLDB4OTRCMywvKiAweEE4LTB4QUYgKi8KKwkweDUyNEQsMHg2RjVDLDB4OTA2MywweDZENDUsMHg4QzM0LDB4NTgxMSwweDVENEMsMHg2QjIwLC8qIDB4QjAtMHhCNyAqLworCTB4NkI0OSwweDY3QUEsMHg1NDVCLDB4ODE1NCwweDdGOEMsMHg1ODk5LDB4ODUzNywweDVGM0EsLyogMHhCOC0weEJGICovCisJMHg2MkEyLDB4NkE0NywweDk1MzksMHg2NTcyLDB4NjA4NCwweDY4NjUsMHg3N0E3LDB4NEU1NCwvKiAweEMwLTB4QzcgKi8KKwkweDRGQTgsMHg1REU3LDB4OTc5OCwweDY0QUMsMHg3RkQ4LDB4NUNFRCwweDRGQ0YsMHg3QThELC8qIDB4QzgtMHhDRiAqLworCTB4NTIwNywweDgzMDQsMHg0RTE0LDB4NjAyRiwweDdBODMsMHg5NEE2LDB4NEZCNSwweDRFQjIsLyogMHhEMC0weEQ3ICovCisJMHg3OUU2LDB4NzQzNCwweDUyRTQsMHg4MkI5LDB4NjREMiwweDc5QkQsMHg1QkRELDB4NkM4MSwvKiAweEQ4LTB4REYgKi8KKwkweDk3NTIsMHg4RjdCLDB4NkMyMiwweDUwM0UsMHg1MzdGLDB4NkUwNSwweDY0Q0UsMHg2Njc0LC8qIDB4RTAtMHhFNyAqLworCTB4NkMzMCwweDYwQzUsMHg5ODc3LDB4OEJGNywweDVFODYsMHg3NDNDLDB4N0E3NywweDc5Q0IsLyogMHhFOC0weEVGICovCisJMHg0RTE4LDB4OTBCMSwweDc0MDMsMHg2QzQyLDB4NTZEQSwweDkxNEIsMHg2Q0M1LDB4OEQ4QiwvKiAweEYwLTB4RjcgKi8KKwkweDUzM0EsMHg4NkM2LDB4NjZGMiwweDhFQUYsMHg1QzQ4LDB4OUE3MSwweDZFMjAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0M4WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4ODNFRSwweDgzRUYsMHg4M0YzLDB4ODNGNCwweDgzRjUsMHg4M0Y2LDB4ODNGNywweDgzRkEsLyogMHg0MC0weDQ3ICovCisJMHg4M0ZCLDB4ODNGQywweDgzRkUsMHg4M0ZGLDB4ODQwMCwweDg0MDIsMHg4NDA1LDB4ODQwNywvKiAweDQ4LTB4NEYgKi8KKwkweDg0MDgsMHg4NDA5LDB4ODQwQSwweDg0MTAsMHg4NDEyLDB4ODQxMywweDg0MTQsMHg4NDE1LC8qIDB4NTAtMHg1NyAqLworCTB4ODQxNiwweDg0MTcsMHg4NDE5LDB4ODQxQSwweDg0MUIsMHg4NDFFLDB4ODQxRiwweDg0MjAsLyogMHg1OC0weDVGICovCisJMHg4NDIxLDB4ODQyMiwweDg0MjMsMHg4NDI5LDB4ODQyQSwweDg0MkIsMHg4NDJDLDB4ODQyRCwvKiAweDYwLTB4NjcgKi8KKwkweDg0MkUsMHg4NDJGLDB4ODQzMCwweDg0MzIsMHg4NDMzLDB4ODQzNCwweDg0MzUsMHg4NDM2LC8qIDB4NjgtMHg2RiAqLworCTB4ODQzNywweDg0MzksMHg4NDNBLDB4ODQzQiwweDg0M0UsMHg4NDNGLDB4ODQ0MCwweDg0NDEsLyogMHg3MC0weDc3ICovCisJMHg4NDQyLDB4ODQ0MywweDg0NDQsMHg4NDQ1LDB4ODQ0NywweDg0NDgsMHg4NDQ5LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4ODQ0QSwweDg0NEIsMHg4NDRDLDB4ODQ0RCwweDg0NEUsMHg4NDRGLDB4ODQ1MCwweDg0NTIsLyogMHg4MC0weDg3ICovCisJMHg4NDUzLDB4ODQ1NCwweDg0NTUsMHg4NDU2LDB4ODQ1OCwweDg0NUQsMHg4NDVFLDB4ODQ1RiwvKiAweDg4LTB4OEYgKi8KKwkweDg0NjAsMHg4NDYyLDB4ODQ2NCwweDg0NjUsMHg4NDY2LDB4ODQ2NywweDg0NjgsMHg4NDZBLC8qIDB4OTAtMHg5NyAqLworCTB4ODQ2RSwweDg0NkYsMHg4NDcwLDB4ODQ3MiwweDg0NzQsMHg4NDc3LDB4ODQ3OSwweDg0N0IsLyogMHg5OC0weDlGICovCisJMHg4NDdDLDB4NTNENiwweDVBMzYsMHg5RjhCLDB4OERBMywweDUzQkIsMHg1NzA4LDB4OThBNywvKiAweEEwLTB4QTcgKi8KKwkweDY3NDMsMHg5MTlCLDB4NkNDOSwweDUxNjgsMHg3NUNBLDB4NjJGMywweDcyQUMsMHg1MjM4LC8qIDB4QTgtMHhBRiAqLworCTB4NTI5RCwweDdGM0EsMHg3MDk0LDB4NzYzOCwweDUzNzQsMHg5RTRBLDB4NjlCNywweDc4NkUsLyogMHhCMC0weEI3ICovCisJMHg5NkMwLDB4ODhEOSwweDdGQTQsMHg3MTM2LDB4NzFDMywweDUxODksMHg2N0QzLDB4NzRFNCwvKiAweEI4LTB4QkYgKi8KKwkweDU4RTQsMHg2NTE4LDB4NTZCNywweDhCQTksMHg5OTc2LDB4NjI3MCwweDdFRDUsMHg2MEY5LC8qIDB4QzAtMHhDNyAqLworCTB4NzBFRCwweDU4RUMsMHg0RUMxLDB4NEVCQSwweDVGQ0QsMHg5N0U3LDB4NEVGQiwweDhCQTQsLyogMHhDOC0weENGICovCisJMHg1MjAzLDB4NTk4QSwweDdFQUIsMHg2MjU0LDB4NEVDRCwweDY1RTUsMHg2MjBFLDB4ODMzOCwvKiAweEQwLTB4RDcgKi8KKwkweDg0QzksMHg4MzYzLDB4ODc4RCwweDcxOTQsMHg2RUI2LDB4NUJCOSwweDdFRDIsMHg1MTk3LC8qIDB4RDgtMHhERiAqLworCTB4NjNDOSwweDY3RDQsMHg4MDg5LDB4ODMzOSwweDg4MTUsMHg1MTEyLDB4NUI3QSwweDU5ODIsLyogMHhFMC0weEU3ICovCisJMHg4RkIxLDB4NEU3MywweDZDNUQsMHg1MTY1LDB4ODkyNSwweDhGNkYsMHg5NjJFLDB4ODU0QSwvKiAweEU4LTB4RUYgKi8KKwkweDc0NUUsMHg5NTEwLDB4OTVGMCwweDZEQTYsMHg4MkU1LDB4NUYzMSwweDY0OTIsMHg2RDEyLC8qIDB4RjAtMHhGNyAqLworCTB4ODQyOCwweDgxNkUsMHg5Q0MzLDB4NTg1RSwweDhENUIsMHg0RTA5LDB4NTNDMSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQzlbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4NDdELDB4ODQ3RSwweDg0N0YsMHg4NDgwLDB4ODQ4MSwweDg0ODMsMHg4NDg0LDB4ODQ4NSwvKiAweDQwLTB4NDcgKi8KKwkweDg0ODYsMHg4NDhBLDB4ODQ4RCwweDg0OEYsMHg4NDkwLDB4ODQ5MSwweDg0OTIsMHg4NDkzLC8qIDB4NDgtMHg0RiAqLworCTB4ODQ5NCwweDg0OTUsMHg4NDk2LDB4ODQ5OCwweDg0OUEsMHg4NDlCLDB4ODQ5RCwweDg0OUUsLyogMHg1MC0weDU3ICovCisJMHg4NDlGLDB4ODRBMCwweDg0QTIsMHg4NEEzLDB4ODRBNCwweDg0QTUsMHg4NEE2LDB4ODRBNywvKiAweDU4LTB4NUYgKi8KKwkweDg0QTgsMHg4NEE5LDB4ODRBQSwweDg0QUIsMHg4NEFDLDB4ODRBRCwweDg0QUUsMHg4NEIwLC8qIDB4NjAtMHg2NyAqLworCTB4ODRCMSwweDg0QjMsMHg4NEI1LDB4ODRCNiwweDg0QjcsMHg4NEJCLDB4ODRCQywweDg0QkUsLyogMHg2OC0weDZGICovCisJMHg4NEMwLDB4ODRDMiwweDg0QzMsMHg4NEM1LDB4ODRDNiwweDg0QzcsMHg4NEM4LDB4ODRDQiwvKiAweDcwLTB4NzcgKi8KKwkweDg0Q0MsMHg4NENFLDB4ODRDRiwweDg0RDIsMHg4NEQ0LDB4ODRENSwweDg0RDcsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4NEQ4LDB4ODREOSwweDg0REEsMHg4NERCLDB4ODREQywweDg0REUsMHg4NEUxLDB4ODRFMiwvKiAweDgwLTB4ODcgKi8KKwkweDg0RTQsMHg4NEU3LDB4ODRFOCwweDg0RTksMHg4NEVBLDB4ODRFQiwweDg0RUQsMHg4NEVFLC8qIDB4ODgtMHg4RiAqLworCTB4ODRFRiwweDg0RjEsMHg4NEYyLDB4ODRGMywweDg0RjQsMHg4NEY1LDB4ODRGNiwweDg0RjcsLyogMHg5MC0weDk3ICovCisJMHg4NEY4LDB4ODRGOSwweDg0RkEsMHg4NEZCLDB4ODRGRCwweDg0RkUsMHg4NTAwLDB4ODUwMSwvKiAweDk4LTB4OUYgKi8KKwkweDg1MDIsMHg0RjFFLDB4NjU2MywweDY4NTEsMHg1NUQzLDB4NEUyNywweDY0MTQsMHg5QTlBLC8qIDB4QTAtMHhBNyAqLworCTB4NjI2QiwweDVBQzIsMHg3NDVGLDB4ODI3MiwweDZEQTksMHg2OEVFLDB4NTBFNywweDgzOEUsLyogMHhBOC0weEFGICovCisJMHg3ODAyLDB4Njc0MCwweDUyMzksMHg2Qzk5LDB4N0VCMSwweDUwQkIsMHg1NTY1LDB4NzE1RSwvKiAweEIwLTB4QjcgKi8KKwkweDdCNUIsMHg2NjUyLDB4NzNDQSwweDgyRUIsMHg2NzQ5LDB4NUM3MSwweDUyMjAsMHg3MTdELC8qIDB4QjgtMHhCRiAqLworCTB4ODg2QiwweDk1RUEsMHg5NjU1LDB4NjRDNSwweDhENjEsMHg4MUIzLDB4NTU4NCwweDZDNTUsLyogMHhDMC0weEM3ICovCisJMHg2MjQ3LDB4N0YyRSwweDU4OTIsMHg0RjI0LDB4NTU0NiwweDhENEYsMHg2NjRDLDB4NEUwQSwvKiAweEM4LTB4Q0YgKi8KKwkweDVDMUEsMHg4OEYzLDB4NjhBMiwweDYzNEUsMHg3QTBELDB4NzBFNywweDgyOEQsMHg1MkZBLC8qIDB4RDAtMHhENyAqLworCTB4OTdGNiwweDVDMTEsMHg1NEU4LDB4OTBCNSwweDdFQ0QsMHg1OTYyLDB4OEQ0QSwweDg2QzcsLyogMHhEOC0weERGICovCisJMHg4MjBDLDB4ODIwRCwweDhENjYsMHg2NDQ0LDB4NUMwNCwweDYxNTEsMHg2RDg5LDB4NzkzRSwvKiAweEUwLTB4RTcgKi8KKwkweDhCQkUsMHg3ODM3LDB4NzUzMywweDU0N0IsMHg0RjM4LDB4OEVBQiwweDZERjEsMHg1QTIwLC8qIDB4RTgtMHhFRiAqLworCTB4N0VDNSwweDc5NUUsMHg2Qzg4LDB4NUJBMSwweDVBNzYsMHg3NTFBLDB4ODBCRSwweDYxNEUsLyogMHhGMC0weEY3ICovCisJMHg2RTE3LDB4NThGMCwweDc1MUYsMHg3NTI1LDB4NzI3MiwweDUzNDcsMHg3RUYzLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DQVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDg1MDMsMHg4NTA0LDB4ODUwNSwweDg1MDYsMHg4NTA3LDB4ODUwOCwweDg1MDksMHg4NTBBLC8qIDB4NDAtMHg0NyAqLworCTB4ODUwQiwweDg1MEQsMHg4NTBFLDB4ODUwRiwweDg1MTAsMHg4NTEyLDB4ODUxNCwweDg1MTUsLyogMHg0OC0weDRGICovCisJMHg4NTE2LDB4ODUxOCwweDg1MTksMHg4NTFCLDB4ODUxQywweDg1MUQsMHg4NTFFLDB4ODUyMCwvKiAweDUwLTB4NTcgKi8KKwkweDg1MjIsMHg4NTIzLDB4ODUyNCwweDg1MjUsMHg4NTI2LDB4ODUyNywweDg1MjgsMHg4NTI5LC8qIDB4NTgtMHg1RiAqLworCTB4ODUyQSwweDg1MkQsMHg4NTJFLDB4ODUyRiwweDg1MzAsMHg4NTMxLDB4ODUzMiwweDg1MzMsLyogMHg2MC0weDY3ICovCisJMHg4NTM0LDB4ODUzNSwweDg1MzYsMHg4NTNFLDB4ODUzRiwweDg1NDAsMHg4NTQxLDB4ODU0MiwvKiAweDY4LTB4NkYgKi8KKwkweDg1NDQsMHg4NTQ1LDB4ODU0NiwweDg1NDcsMHg4NTRCLDB4ODU0QywweDg1NEQsMHg4NTRFLC8qIDB4NzAtMHg3NyAqLworCTB4ODU0RiwweDg1NTAsMHg4NTUxLDB4ODU1MiwweDg1NTMsMHg4NTU0LDB4ODU1NSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDg1NTcsMHg4NTU4LDB4ODU1QSwweDg1NUIsMHg4NTVDLDB4ODU1RCwweDg1NUYsMHg4NTYwLC8qIDB4ODAtMHg4NyAqLworCTB4ODU2MSwweDg1NjIsMHg4NTYzLDB4ODU2NSwweDg1NjYsMHg4NTY3LDB4ODU2OSwweDg1NkEsLyogMHg4OC0weDhGICovCisJMHg4NTZCLDB4ODU2QywweDg1NkQsMHg4NTZFLDB4ODU2RiwweDg1NzAsMHg4NTcxLDB4ODU3MywvKiAweDkwLTB4OTcgKi8KKwkweDg1NzUsMHg4NTc2LDB4ODU3NywweDg1NzgsMHg4NTdDLDB4ODU3RCwweDg1N0YsMHg4NTgwLC8qIDB4OTgtMHg5RiAqLworCTB4ODU4MSwweDc3MDEsMHg3NkRCLDB4NTI2OSwweDgwREMsMHg1NzIzLDB4NUUwOCwweDU5MzEsLyogMHhBMC0weEE3ICovCisJMHg3MkVFLDB4NjVCRCwweDZFN0YsMHg4QkQ3LDB4NUMzOCwweDg2NzEsMHg1MzQxLDB4NzdGMywvKiAweEE4LTB4QUYgKi8KKwkweDYyRkUsMHg2NUY2LDB4NEVDMCwweDk4REYsMHg4NjgwLDB4NUI5RSwweDhCQzYsMHg1M0YyLC8qIDB4QjAtMHhCNyAqLworCTB4NzdFMiwweDRGN0YsMHg1QzRFLDB4OUE3NiwweDU5Q0IsMHg1RjBGLDB4NzkzQSwweDU4RUIsLyogMHhCOC0weEJGICovCisJMHg0RTE2LDB4NjdGRiwweDRFOEIsMHg2MkVELDB4OEE5MywweDkwMUQsMHg1MkJGLDB4NjYyRiwvKiAweEMwLTB4QzcgKi8KKwkweDU1REMsMHg1NjZDLDB4OTAwMiwweDRFRDUsMHg0RjhELDB4OTFDQSwweDk5NzAsMHg2QzBGLC8qIDB4QzgtMHhDRiAqLworCTB4NUUwMiwweDYwNDMsMHg1QkE0LDB4ODlDNiwweDhCRDUsMHg2NTM2LDB4NjI0QiwweDk5OTYsLyogMHhEMC0weEQ3ICovCisJMHg1Qjg4LDB4NUJGRiwweDYzODgsMHg1NTJFLDB4NTNENywweDc2MjYsMHg1MTdELDB4ODUyQywvKiAweEQ4LTB4REYgKi8KKwkweDY3QTIsMHg2OEIzLDB4NkI4QSwweDYyOTIsMHg4RjkzLDB4NTNENCwweDgyMTIsMHg2REQxLC8qIDB4RTAtMHhFNyAqLworCTB4NzU4RiwweDRFNjYsMHg4RDRFLDB4NUI3MCwweDcxOUYsMHg4NUFGLDB4NjY5MSwweDY2RDksLyogMHhFOC0weEVGICovCisJMHg3RjcyLDB4ODcwMCwweDlFQ0QsMHg5RjIwLDB4NUM1RSwweDY3MkYsMHg4RkYwLDB4NjgxMSwvKiAweEYwLTB4RjcgKi8KKwkweDY3NUYsMHg2MjBELDB4N0FENiwweDU4ODUsMHg1RUI2LDB4NjU3MCwweDZGMzEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0NCWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4ODU4MiwweDg1ODMsMHg4NTg2LDB4ODU4OCwweDg1ODksMHg4NThBLDB4ODU4QiwweDg1OEMsLyogMHg0MC0weDQ3ICovCisJMHg4NThELDB4ODU4RSwweDg1OTAsMHg4NTkxLDB4ODU5MiwweDg1OTMsMHg4NTk0LDB4ODU5NSwvKiAweDQ4LTB4NEYgKi8KKwkweDg1OTYsMHg4NTk3LDB4ODU5OCwweDg1OTksMHg4NTlBLDB4ODU5RCwweDg1OUUsMHg4NTlGLC8qIDB4NTAtMHg1NyAqLworCTB4ODVBMCwweDg1QTEsMHg4NUEyLDB4ODVBMywweDg1QTUsMHg4NUE2LDB4ODVBNywweDg1QTksLyogMHg1OC0weDVGICovCisJMHg4NUFCLDB4ODVBQywweDg1QUQsMHg4NUIxLDB4ODVCMiwweDg1QjMsMHg4NUI0LDB4ODVCNSwvKiAweDYwLTB4NjcgKi8KKwkweDg1QjYsMHg4NUI4LDB4ODVCQSwweDg1QkIsMHg4NUJDLDB4ODVCRCwweDg1QkUsMHg4NUJGLC8qIDB4NjgtMHg2RiAqLworCTB4ODVDMCwweDg1QzIsMHg4NUMzLDB4ODVDNCwweDg1QzUsMHg4NUM2LDB4ODVDNywweDg1QzgsLyogMHg3MC0weDc3ICovCisJMHg4NUNBLDB4ODVDQiwweDg1Q0MsMHg4NUNELDB4ODVDRSwweDg1RDEsMHg4NUQyLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4ODVENCwweDg1RDYsMHg4NUQ3LDB4ODVEOCwweDg1RDksMHg4NURBLDB4ODVEQiwweDg1REQsLyogMHg4MC0weDg3ICovCisJMHg4NURFLDB4ODVERiwweDg1RTAsMHg4NUUxLDB4ODVFMiwweDg1RTMsMHg4NUU1LDB4ODVFNiwvKiAweDg4LTB4OEYgKi8KKwkweDg1RTcsMHg4NUU4LDB4ODVFQSwweDg1RUIsMHg4NUVDLDB4ODVFRCwweDg1RUUsMHg4NUVGLC8qIDB4OTAtMHg5NyAqLworCTB4ODVGMCwweDg1RjEsMHg4NUYyLDB4ODVGMywweDg1RjQsMHg4NUY1LDB4ODVGNiwweDg1RjcsLyogMHg5OC0weDlGICovCisJMHg4NUY4LDB4NjA1NSwweDUyMzcsMHg4MDBELDB4NjQ1NCwweDg4NzAsMHg3NTI5LDB4NUUwNSwvKiAweEEwLTB4QTcgKi8KKwkweDY4MTMsMHg2MkY0LDB4OTcxQywweDUzQ0MsMHg3MjNELDB4OEMwMSwweDZDMzQsMHg3NzYxLC8qIDB4QTgtMHhBRiAqLworCTB4N0EwRSwweDU0MkUsMHg3N0FDLDB4OTg3QSwweDgyMUMsMHg4QkY0LDB4Nzg1NSwweDY3MTQsLyogMHhCMC0weEI3ICovCisJMHg3MEMxLDB4NjVBRiwweDY0OTUsMHg1NjM2LDB4NjAxRCwweDc5QzEsMHg1M0Y4LDB4NEUxRCwvKiAweEI4LTB4QkYgKi8KKwkweDZCN0IsMHg4MDg2LDB4NUJGQSwweDU1RTMsMHg1NkRCLDB4NEYzQSwweDRGM0MsMHg5OTcyLC8qIDB4QzAtMHhDNyAqLworCTB4NURGMywweDY3N0UsMHg4MDM4LDB4NjAwMiwweDk4ODIsMHg5MDAxLDB4NUI4QiwweDhCQkMsLyogMHhDOC0weENGICovCisJMHg4QkY1LDB4NjQxQywweDgyNTgsMHg2NERFLDB4NTVGRCwweDgyQ0YsMHg5MTY1LDB4NEZENywvKiAweEQwLTB4RDcgKi8KKwkweDdEMjAsMHg5MDFGLDB4N0M5RiwweDUwRjMsMHg1ODUxLDB4NkVBRiwweDVCQkYsMHg4QkM5LC8qIDB4RDgtMHhERiAqLworCTB4ODA4MywweDkxNzgsMHg4NDlDLDB4N0I5NywweDg2N0QsMHg5NjhCLDB4OTY4RiwweDdFRTUsLyogMHhFMC0weEU3ICovCisJMHg5QUQzLDB4Nzg4RSwweDVDODEsMHg3QTU3LDB4OTA0MiwweDk2QTcsMHg3OTVGLDB4NUI1OSwvKiAweEU4LTB4RUYgKi8KKwkweDYzNUYsMHg3QjBCLDB4ODREMSwweDY4QUQsMHg1NTA2LDB4N0YyOSwweDc0MTAsMHg3RDIyLC8qIDB4RjAtMHhGNyAqLworCTB4OTUwMSwweDYyNDAsMHg1ODRDLDB4NEVENiwweDVCODMsMHg1OTc5LDB4NTg1NCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQ0NbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4NUY5LDB4ODVGQSwweDg1RkMsMHg4NUZELDB4ODVGRSwweDg2MDAsMHg4NjAxLDB4ODYwMiwvKiAweDQwLTB4NDcgKi8KKwkweDg2MDMsMHg4NjA0LDB4ODYwNiwweDg2MDcsMHg4NjA4LDB4ODYwOSwweDg2MEEsMHg4NjBCLC8qIDB4NDgtMHg0RiAqLworCTB4ODYwQywweDg2MEQsMHg4NjBFLDB4ODYwRiwweDg2MTAsMHg4NjEyLDB4ODYxMywweDg2MTQsLyogMHg1MC0weDU3ICovCisJMHg4NjE1LDB4ODYxNywweDg2MTgsMHg4NjE5LDB4ODYxQSwweDg2MUIsMHg4NjFDLDB4ODYxRCwvKiAweDU4LTB4NUYgKi8KKwkweDg2MUUsMHg4NjFGLDB4ODYyMCwweDg2MjEsMHg4NjIyLDB4ODYyMywweDg2MjQsMHg4NjI1LC8qIDB4NjAtMHg2NyAqLworCTB4ODYyNiwweDg2MjgsMHg4NjJBLDB4ODYyQiwweDg2MkMsMHg4NjJELDB4ODYyRSwweDg2MkYsLyogMHg2OC0weDZGICovCisJMHg4NjMwLDB4ODYzMSwweDg2MzIsMHg4NjMzLDB4ODYzNCwweDg2MzUsMHg4NjM2LDB4ODYzNywvKiAweDcwLTB4NzcgKi8KKwkweDg2MzksMHg4NjNBLDB4ODYzQiwweDg2M0QsMHg4NjNFLDB4ODYzRiwweDg2NDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4NjQxLDB4ODY0MiwweDg2NDMsMHg4NjQ0LDB4ODY0NSwweDg2NDYsMHg4NjQ3LDB4ODY0OCwvKiAweDgwLTB4ODcgKi8KKwkweDg2NDksMHg4NjRBLDB4ODY0QiwweDg2NEMsMHg4NjUyLDB4ODY1MywweDg2NTUsMHg4NjU2LC8qIDB4ODgtMHg4RiAqLworCTB4ODY1NywweDg2NTgsMHg4NjU5LDB4ODY1QiwweDg2NUMsMHg4NjVELDB4ODY1RiwweDg2NjAsLyogMHg5MC0weDk3ICovCisJMHg4NjYxLDB4ODY2MywweDg2NjQsMHg4NjY1LDB4ODY2NiwweDg2NjcsMHg4NjY4LDB4ODY2OSwvKiAweDk4LTB4OUYgKi8KKwkweDg2NkEsMHg3MzZELDB4NjMxRSwweDhFNEIsMHg4RTBGLDB4ODBDRSwweDgyRDQsMHg2MkFDLC8qIDB4QTAtMHhBNyAqLworCTB4NTNGMCwweDZDRjAsMHg5MTVFLDB4NTkyQSwweDYwMDEsMHg2QzcwLDB4NTc0RCwweDY0NEEsLyogMHhBOC0weEFGICovCisJMHg4RDJBLDB4NzYyQiwweDZFRTksMHg1NzVCLDB4NkE4MCwweDc1RjAsMHg2RjZELDB4OEMyRCwvKiAweEIwLTB4QjcgKi8KKwkweDhDMDgsMHg1NzY2LDB4NkJFRiwweDg4OTIsMHg3OEIzLDB4NjNBMiwweDUzRjksMHg3MEFELC8qIDB4QjgtMHhCRiAqLworCTB4NkM2NCwweDU4NTgsMHg2NDJBLDB4NTgwMiwweDY4RTAsMHg4MTlCLDB4NTUxMCwweDdDRDYsLyogMHhDMC0weEM3ICovCisJMHg1MDE4LDB4OEVCQSwweDZEQ0MsMHg4RDlGLDB4NzBFQiwweDYzOEYsMHg2RDlCLDB4NkVENCwvKiAweEM4LTB4Q0YgKi8KKwkweDdFRTYsMHg4NDA0LDB4Njg0MywweDkwMDMsMHg2REQ4LDB4OTY3NiwweDhCQTgsMHg1OTU3LC8qIDB4RDAtMHhENyAqLworCTB4NzI3OSwweDg1RTQsMHg4MTdFLDB4NzVCQywweDhBOEEsMHg2OEFGLDB4NTI1NCwweDhFMjIsLyogMHhEOC0weERGICovCisJMHg5NTExLDB4NjNEMCwweDk4OTgsMHg4RTQ0LDB4NTU3QywweDRGNTMsMHg2NkZGLDB4NTY4RiwvKiAweEUwLTB4RTcgKi8KKwkweDYwRDUsMHg2RDk1LDB4NTI0MywweDVDNDksMHg1OTI5LDB4NkRGQiwweDU4NkIsMHg3NTMwLC8qIDB4RTgtMHhFRiAqLworCTB4NzUxQywweDYwNkMsMHg4MjE0LDB4ODE0NiwweDYzMTEsMHg2NzYxLDB4OEZFMiwweDc3M0EsLyogMHhGMC0weEY3ICovCisJMHg4REYzLDB4OEQzNCwweDk0QzEsMHg1RTE2LDB4NTM4NSwweDU0MkMsMHg3MEMzLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DRFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDg2NkQsMHg4NjZGLDB4ODY3MCwweDg2NzIsMHg4NjczLDB4ODY3NCwweDg2NzUsMHg4Njc2LC8qIDB4NDAtMHg0NyAqLworCTB4ODY3NywweDg2NzgsMHg4NjgzLDB4ODY4NCwweDg2ODUsMHg4Njg2LDB4ODY4NywweDg2ODgsLyogMHg0OC0weDRGICovCisJMHg4Njg5LDB4ODY4RSwweDg2OEYsMHg4NjkwLDB4ODY5MSwweDg2OTIsMHg4Njk0LDB4ODY5NiwvKiAweDUwLTB4NTcgKi8KKwkweDg2OTcsMHg4Njk4LDB4ODY5OSwweDg2OUEsMHg4NjlCLDB4ODY5RSwweDg2OUYsMHg4NkEwLC8qIDB4NTgtMHg1RiAqLworCTB4ODZBMSwweDg2QTIsMHg4NkE1LDB4ODZBNiwweDg2QUIsMHg4NkFELDB4ODZBRSwweDg2QjIsLyogMHg2MC0weDY3ICovCisJMHg4NkIzLDB4ODZCNywweDg2QjgsMHg4NkI5LDB4ODZCQiwweDg2QkMsMHg4NkJELDB4ODZCRSwvKiAweDY4LTB4NkYgKi8KKwkweDg2QkYsMHg4NkMxLDB4ODZDMiwweDg2QzMsMHg4NkM1LDB4ODZDOCwweDg2Q0MsMHg4NkNELC8qIDB4NzAtMHg3NyAqLworCTB4ODZEMiwweDg2RDMsMHg4NkQ1LDB4ODZENiwweDg2RDcsMHg4NkRBLDB4ODZEQywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDg2REQsMHg4NkUwLDB4ODZFMSwweDg2RTIsMHg4NkUzLDB4ODZFNSwweDg2RTYsMHg4NkU3LC8qIDB4ODAtMHg4NyAqLworCTB4ODZFOCwweDg2RUEsMHg4NkVCLDB4ODZFQywweDg2RUYsMHg4NkY1LDB4ODZGNiwweDg2RjcsLyogMHg4OC0weDhGICovCisJMHg4NkZBLDB4ODZGQiwweDg2RkMsMHg4NkZELDB4ODZGRiwweDg3MDEsMHg4NzA0LDB4ODcwNSwvKiAweDkwLTB4OTcgKi8KKwkweDg3MDYsMHg4NzBCLDB4ODcwQywweDg3MEUsMHg4NzBGLDB4ODcxMCwweDg3MTEsMHg4NzE0LC8qIDB4OTgtMHg5RiAqLworCTB4ODcxNiwweDZDNDAsMHg1RUY3LDB4NTA1QywweDRFQUQsMHg1RUFELDB4NjMzQSwweDgyNDcsLyogMHhBMC0weEE3ICovCisJMHg5MDFBLDB4Njg1MCwweDkxNkUsMHg3N0IzLDB4NTQwQywweDk0REMsMHg1RjY0LDB4N0FFNSwvKiAweEE4LTB4QUYgKi8KKwkweDY4NzYsMHg2MzQ1LDB4N0I1MiwweDdFREYsMHg3NURCLDB4NTA3NywweDYyOTUsMHg1OTM0LC8qIDB4QjAtMHhCNyAqLworCTB4OTAwRiwweDUxRjgsMHg3OUMzLDB4N0E4MSwweDU2RkUsMHg1RjkyLDB4OTAxNCwweDZEODIsLyogMHhCOC0weEJGICovCisJMHg1QzYwLDB4NTcxRiwweDU0MTAsMHg1MTU0LDB4NkU0RCwweDU2RTIsMHg2M0E4LDB4OTg5MywvKiAweEMwLTB4QzcgKi8KKwkweDgxN0YsMHg4NzE1LDB4ODkyQSwweDkwMDAsMHg1NDFFLDB4NUM2RiwweDgxQzAsMHg2MkQ2LC8qIDB4QzgtMHhDRiAqLworCTB4NjI1OCwweDgxMzEsMHg5RTM1LDB4OTY0MCwweDlBNkUsMHg5QTdDLDB4NjkyRCwweDU5QTUsLyogMHhEMC0weEQ3ICovCisJMHg2MkQzLDB4NTUzRSwweDYzMTYsMHg1NEM3LDB4ODZEOSwweDZEM0MsMHg1QTAzLDB4NzRFNiwvKiAweEQ4LTB4REYgKi8KKwkweDg4OUMsMHg2QjZBLDB4NTkxNiwweDhDNEMsMHg1RjJGLDB4NkU3RSwweDczQTksMHg5ODdELC8qIDB4RTAtMHhFNyAqLworCTB4NEUzOCwweDcwRjcsMHg1QjhDLDB4Nzg5NywweDYzM0QsMHg2NjVBLDB4NzY5NiwweDYwQ0IsLyogMHhFOC0weEVGICovCisJMHg1QjlCLDB4NUE0OSwweDRFMDcsMHg4MTU1LDB4NkM2QSwweDczOEIsMHg0RUExLDB4Njc4OSwvKiAweEYwLTB4RjcgKi8KKwkweDdGNTEsMHg1RjgwLDB4NjVGQSwweDY3MUIsMHg1RkQ4LDB4NTk4NCwweDVBMDEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0NFWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4ODcxOSwweDg3MUIsMHg4NzFELDB4ODcxRiwweDg3MjAsMHg4NzI0LDB4ODcyNiwweDg3MjcsLyogMHg0MC0weDQ3ICovCisJMHg4NzI4LDB4ODcyQSwweDg3MkIsMHg4NzJDLDB4ODcyRCwweDg3MkYsMHg4NzMwLDB4ODczMiwvKiAweDQ4LTB4NEYgKi8KKwkweDg3MzMsMHg4NzM1LDB4ODczNiwweDg3MzgsMHg4NzM5LDB4ODczQSwweDg3M0MsMHg4NzNELC8qIDB4NTAtMHg1NyAqLworCTB4ODc0MCwweDg3NDEsMHg4NzQyLDB4ODc0MywweDg3NDQsMHg4NzQ1LDB4ODc0NiwweDg3NEEsLyogMHg1OC0weDVGICovCisJMHg4NzRCLDB4ODc0RCwweDg3NEYsMHg4NzUwLDB4ODc1MSwweDg3NTIsMHg4NzU0LDB4ODc1NSwvKiAweDYwLTB4NjcgKi8KKwkweDg3NTYsMHg4NzU4LDB4ODc1QSwweDg3NUIsMHg4NzVDLDB4ODc1RCwweDg3NUUsMHg4NzVGLC8qIDB4NjgtMHg2RiAqLworCTB4ODc2MSwweDg3NjIsMHg4NzY2LDB4ODc2NywweDg3NjgsMHg4NzY5LDB4ODc2QSwweDg3NkIsLyogMHg3MC0weDc3ICovCisJMHg4NzZDLDB4ODc2RCwweDg3NkYsMHg4NzcxLDB4ODc3MiwweDg3NzMsMHg4Nzc1LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4ODc3NywweDg3NzgsMHg4Nzc5LDB4ODc3QSwweDg3N0YsMHg4NzgwLDB4ODc4MSwweDg3ODQsLyogMHg4MC0weDg3ICovCisJMHg4Nzg2LDB4ODc4NywweDg3ODksMHg4NzhBLDB4ODc4QywweDg3OEUsMHg4NzhGLDB4ODc5MCwvKiAweDg4LTB4OEYgKi8KKwkweDg3OTEsMHg4NzkyLDB4ODc5NCwweDg3OTUsMHg4Nzk2LDB4ODc5OCwweDg3OTksMHg4NzlBLC8qIDB4OTAtMHg5NyAqLworCTB4ODc5QiwweDg3OUMsMHg4NzlELDB4ODc5RSwweDg3QTAsMHg4N0ExLDB4ODdBMiwweDg3QTMsLyogMHg5OC0weDlGICovCisJMHg4N0E0LDB4NURDRCwweDVGQUUsMHg1MzcxLDB4OTdFNiwweDhGREQsMHg2ODQ1LDB4NTZGNCwvKiAweEEwLTB4QTcgKi8KKwkweDU1MkYsMHg2MERGLDB4NEUzQSwweDZGNEQsMHg3RUY0LDB4ODJDNywweDg0MEUsMHg1OUQ0LC8qIDB4QTgtMHhBRiAqLworCTB4NEYxRiwweDRGMkEsMHg1QzNFLDB4N0VBQywweDY3MkEsMHg4NTFBLDB4NTQ3MywweDc1NEYsLyogMHhCMC0weEI3ICovCisJMHg4MEMzLDB4NTU4MiwweDlCNEYsMHg0RjRELDB4NkUyRCwweDhDMTMsMHg1QzA5LDB4NjE3MCwvKiAweEI4LTB4QkYgKi8KKwkweDUzNkIsMHg3NjFGLDB4NkUyOSwweDg2OEEsMHg2NTg3LDB4OTVGQiwweDdFQjksMHg1NDNCLC8qIDB4QzAtMHhDNyAqLworCTB4N0EzMywweDdEMEEsMHg5NUVFLDB4NTVFMSwweDdGQzEsMHg3NEVFLDB4NjMxRCwweDg3MTcsLyogMHhDOC0weENGICovCisJMHg2REExLDB4N0E5RCwweDYyMTEsMHg2NUExLDB4NTM2NywweDYzRTEsMHg2QzgzLDB4NURFQiwvKiAweEQwLTB4RDcgKi8KKwkweDU0NUMsMHg5NEE4LDB4NEU0QywweDZDNjEsMHg4QkVDLDB4NUM0QiwweDY1RTAsMHg4MjlDLC8qIDB4RDgtMHhERiAqLworCTB4NjhBNywweDU0M0UsMHg1NDM0LDB4NkJDQiwweDZCNjYsMHg0RTk0LDB4NjM0MiwweDUzNDgsLyogMHhFMC0weEU3ICovCisJMHg4MjFFLDB4NEYwRCwweDRGQUUsMHg1NzVFLDB4NjIwQSwweDk2RkUsMHg2NjY0LDB4NzI2OSwvKiAweEU4LTB4RUYgKi8KKwkweDUyRkYsMHg1MkExLDB4NjA5RiwweDhCRUYsMHg2NjE0LDB4NzE5OSwweDY3OTAsMHg4OTdGLC8qIDB4RjAtMHhGNyAqLworCTB4Nzg1MiwweDc3RkQsMHg2NjcwLDB4NTYzQiwweDU0MzgsMHg5NTIxLDB4NzI3QSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQ0ZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4N0E1LDB4ODdBNiwweDg3QTcsMHg4N0E5LDB4ODdBQSwweDg3QUUsMHg4N0IwLDB4ODdCMSwvKiAweDQwLTB4NDcgKi8KKwkweDg3QjIsMHg4N0I0LDB4ODdCNiwweDg3QjcsMHg4N0I4LDB4ODdCOSwweDg3QkIsMHg4N0JDLC8qIDB4NDgtMHg0RiAqLworCTB4ODdCRSwweDg3QkYsMHg4N0MxLDB4ODdDMiwweDg3QzMsMHg4N0M0LDB4ODdDNSwweDg3QzcsLyogMHg1MC0weDU3ICovCisJMHg4N0M4LDB4ODdDOSwweDg3Q0MsMHg4N0NELDB4ODdDRSwweDg3Q0YsMHg4N0QwLDB4ODdENCwvKiAweDU4LTB4NUYgKi8KKwkweDg3RDUsMHg4N0Q2LDB4ODdENywweDg3RDgsMHg4N0Q5LDB4ODdEQSwweDg3REMsMHg4N0RELC8qIDB4NjAtMHg2NyAqLworCTB4ODdERSwweDg3REYsMHg4N0UxLDB4ODdFMiwweDg3RTMsMHg4N0U0LDB4ODdFNiwweDg3RTcsLyogMHg2OC0weDZGICovCisJMHg4N0U4LDB4ODdFOSwweDg3RUIsMHg4N0VDLDB4ODdFRCwweDg3RUYsMHg4N0YwLDB4ODdGMSwvKiAweDcwLTB4NzcgKi8KKwkweDg3RjIsMHg4N0YzLDB4ODdGNCwweDg3RjUsMHg4N0Y2LDB4ODdGNywweDg3RjgsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4N0ZBLDB4ODdGQiwweDg3RkMsMHg4N0ZELDB4ODdGRiwweDg4MDAsMHg4ODAxLDB4ODgwMiwvKiAweDgwLTB4ODcgKi8KKwkweDg4MDQsMHg4ODA1LDB4ODgwNiwweDg4MDcsMHg4ODA4LDB4ODgwOSwweDg4MEIsMHg4ODBDLC8qIDB4ODgtMHg4RiAqLworCTB4ODgwRCwweDg4MEUsMHg4ODBGLDB4ODgxMCwweDg4MTEsMHg4ODEyLDB4ODgxNCwweDg4MTcsLyogMHg5MC0weDk3ICovCisJMHg4ODE4LDB4ODgxOSwweDg4MUEsMHg4ODFDLDB4ODgxRCwweDg4MUUsMHg4ODFGLDB4ODgyMCwvKiAweDk4LTB4OUYgKi8KKwkweDg4MjMsMHg3QTAwLDB4NjA2RiwweDVFMEMsMHg2MDg5LDB4ODE5RCwweDU5MTUsMHg2MERDLC8qIDB4QTAtMHhBNyAqLworCTB4NzE4NCwweDcwRUYsMHg2RUFBLDB4NkM1MCwweDcyODAsMHg2QTg0LDB4ODhBRCwweDVFMkQsLyogMHhBOC0weEFGICovCisJMHg0RTYwLDB4NUFCMywweDU1OUMsMHg5NEUzLDB4NkQxNywweDdDRkIsMHg5Njk5LDB4NjIwRiwvKiAweEIwLTB4QjcgKi8KKwkweDdFQzYsMHg3NzhFLDB4ODY3RSwweDUzMjMsMHg5NzFFLDB4OEY5NiwweDY2ODcsMHg1Q0UxLC8qIDB4QjgtMHhCRiAqLworCTB4NEZBMCwweDcyRUQsMHg0RTBCLDB4NTNBNiwweDU5MEYsMHg1NDEzLDB4NjM4MCwweDk1MjgsLyogMHhDMC0weEM3ICovCisJMHg1MTQ4LDB4NEVEOSwweDlDOUMsMHg3RUE0LDB4NTRCOCwweDhEMjQsMHg4ODU0LDB4ODIzNywvKiAweEM4LTB4Q0YgKi8KKwkweDk1RjIsMHg2RDhFLDB4NUYyNiwweDVBQ0MsMHg2NjNFLDB4OTY2OSwweDczQjAsMHg3MzJFLC8qIDB4RDAtMHhENyAqLworCTB4NTNCRiwweDgxN0EsMHg5OTg1LDB4N0ZBMSwweDVCQUEsMHg5Njc3LDB4OTY1MCwweDdFQkYsLyogMHhEOC0weERGICovCisJMHg3NkY4LDB4NTNBMiwweDk1NzYsMHg5OTk5LDB4N0JCMSwweDg5NDQsMHg2RTU4LDB4NEU2MSwvKiAweEUwLTB4RTcgKi8KKwkweDdGRDQsMHg3OTY1LDB4OEJFNiwweDYwRjMsMHg1NENELDB4NEVBQiwweDk4NzksMHg1REY3LC8qIDB4RTgtMHhFRiAqLworCTB4NkE2MSwweDUwQ0YsMHg1NDExLDB4OEM2MSwweDg0MjcsMHg3ODVELDB4OTcwNCwweDUyNEEsLyogMHhGMC0weEY3ICovCisJMHg1NEVFLDB4NTZBMywweDk1MDAsMHg2RDg4LDB4NUJCNSwweDZEQzYsMHg2NjUzLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EMFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDg4MjQsMHg4ODI1LDB4ODgyNiwweDg4MjcsMHg4ODI4LDB4ODgyOSwweDg4MkEsMHg4ODJCLC8qIDB4NDAtMHg0NyAqLworCTB4ODgyQywweDg4MkQsMHg4ODJFLDB4ODgyRiwweDg4MzAsMHg4ODMxLDB4ODgzMywweDg4MzQsLyogMHg0OC0weDRGICovCisJMHg4ODM1LDB4ODgzNiwweDg4MzcsMHg4ODM4LDB4ODgzQSwweDg4M0IsMHg4ODNELDB4ODgzRSwvKiAweDUwLTB4NTcgKi8KKwkweDg4M0YsMHg4ODQxLDB4ODg0MiwweDg4NDMsMHg4ODQ2LDB4ODg0NywweDg4NDgsMHg4ODQ5LC8qIDB4NTgtMHg1RiAqLworCTB4ODg0QSwweDg4NEIsMHg4ODRFLDB4ODg0RiwweDg4NTAsMHg4ODUxLDB4ODg1MiwweDg4NTMsLyogMHg2MC0weDY3ICovCisJMHg4ODU1LDB4ODg1NiwweDg4NTgsMHg4ODVBLDB4ODg1QiwweDg4NUMsMHg4ODVELDB4ODg1RSwvKiAweDY4LTB4NkYgKi8KKwkweDg4NUYsMHg4ODYwLDB4ODg2NiwweDg4NjcsMHg4ODZBLDB4ODg2RCwweDg4NkYsMHg4ODcxLC8qIDB4NzAtMHg3NyAqLworCTB4ODg3MywweDg4NzQsMHg4ODc1LDB4ODg3NiwweDg4NzgsMHg4ODc5LDB4ODg3QSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDg4N0IsMHg4ODdDLDB4ODg4MCwweDg4ODMsMHg4ODg2LDB4ODg4NywweDg4ODksMHg4ODhBLC8qIDB4ODAtMHg4NyAqLworCTB4ODg4QywweDg4OEUsMHg4ODhGLDB4ODg5MCwweDg4OTEsMHg4ODkzLDB4ODg5NCwweDg4OTUsLyogMHg4OC0weDhGICovCisJMHg4ODk3LDB4ODg5OCwweDg4OTksMHg4ODlBLDB4ODg5QiwweDg4OUQsMHg4ODlFLDB4ODg5RiwvKiAweDkwLTB4OTcgKi8KKwkweDg4QTAsMHg4OEExLDB4ODhBMywweDg4QTUsMHg4OEE2LDB4ODhBNywweDg4QTgsMHg4OEE5LC8qIDB4OTgtMHg5RiAqLworCTB4ODhBQSwweDVDMEYsMHg1QjVELDB4NjgyMSwweDgwOTYsMHg1NTc4LDB4N0IxMSwweDY1NDgsLyogMHhBMC0weEE3ICovCisJMHg2OTU0LDB4NEU5QiwweDZCNDcsMHg4NzRFLDB4OTc4QiwweDUzNEYsMHg2MzFGLDB4NjQzQSwvKiAweEE4LTB4QUYgKi8KKwkweDkwQUEsMHg2NTlDLDB4ODBDMSwweDhDMTAsMHg1MTk5LDB4NjhCMCwweDUzNzgsMHg4N0Y5LC8qIDB4QjAtMHhCNyAqLworCTB4NjFDOCwweDZDQzQsMHg2Q0ZCLDB4OEMyMiwweDVDNTEsMHg4NUFBLDB4ODJBRiwweDk1MEMsLyogMHhCOC0weEJGICovCisJMHg2QjIzLDB4OEY5QiwweDY1QjAsMHg1RkZCLDB4NUZDMywweDRGRTEsMHg4ODQ1LDB4NjYxRiwvKiAweEMwLTB4QzcgKi8KKwkweDgxNjUsMHg3MzI5LDB4NjBGQSwweDUxNzQsMHg1MjExLDB4NTc4QiwweDVGNjIsMHg5MEEyLC8qIDB4QzgtMHhDRiAqLworCTB4ODg0QywweDkxOTIsMHg1RTc4LDB4Njc0RiwweDYwMjcsMHg1OUQzLDB4NTE0NCwweDUxRjYsLyogMHhEMC0weEQ3ICovCisJMHg4MEY4LDB4NTMwOCwweDZDNzksMHg5NkM0LDB4NzE4QSwweDRGMTEsMHg0RkVFLDB4N0Y5RSwvKiAweEQ4LTB4REYgKi8KKwkweDY3M0QsMHg1NUM1LDB4OTUwOCwweDc5QzAsMHg4ODk2LDB4N0VFMywweDU4OUYsMHg2MjBDLC8qIDB4RTAtMHhFNyAqLworCTB4OTcwMCwweDg2NUEsMHg1NjE4LDB4OTg3QiwweDVGOTAsMHg4QkI4LDB4ODRDNCwweDkxNTcsLyogMHhFOC0weEVGICovCisJMHg1M0Q5LDB4NjVFRCwweDVFOEYsMHg3NTVDLDB4NjA2NCwweDdENkUsMHg1QTdGLDB4N0VFQSwvKiAweEYwLTB4RjcgKi8KKwkweDdFRUQsMHg4RjY5LDB4NTVBNywweDVCQTMsMHg2MEFDLDB4NjVDQiwweDczODQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0QxWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4ODhBQywweDg4QUUsMHg4OEFGLDB4ODhCMCwweDg4QjIsMHg4OEIzLDB4ODhCNCwweDg4QjUsLyogMHg0MC0weDQ3ICovCisJMHg4OEI2LDB4ODhCOCwweDg4QjksMHg4OEJBLDB4ODhCQiwweDg4QkQsMHg4OEJFLDB4ODhCRiwvKiAweDQ4LTB4NEYgKi8KKwkweDg4QzAsMHg4OEMzLDB4ODhDNCwweDg4QzcsMHg4OEM4LDB4ODhDQSwweDg4Q0IsMHg4OENDLC8qIDB4NTAtMHg1NyAqLworCTB4ODhDRCwweDg4Q0YsMHg4OEQwLDB4ODhEMSwweDg4RDMsMHg4OEQ2LDB4ODhENywweDg4REEsLyogMHg1OC0weDVGICovCisJMHg4OERCLDB4ODhEQywweDg4REQsMHg4OERFLDB4ODhFMCwweDg4RTEsMHg4OEU2LDB4ODhFNywvKiAweDYwLTB4NjcgKi8KKwkweDg4RTksMHg4OEVBLDB4ODhFQiwweDg4RUMsMHg4OEVELDB4ODhFRSwweDg4RUYsMHg4OEYyLC8qIDB4NjgtMHg2RiAqLworCTB4ODhGNSwweDg4RjYsMHg4OEY3LDB4ODhGQSwweDg4RkIsMHg4OEZELDB4ODhGRiwweDg5MDAsLyogMHg3MC0weDc3ICovCisJMHg4OTAxLDB4ODkwMywweDg5MDQsMHg4OTA1LDB4ODkwNiwweDg5MDcsMHg4OTA4LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4ODkwOSwweDg5MEIsMHg4OTBDLDB4ODkwRCwweDg5MEUsMHg4OTBGLDB4ODkxMSwweDg5MTQsLyogMHg4MC0weDg3ICovCisJMHg4OTE1LDB4ODkxNiwweDg5MTcsMHg4OTE4LDB4ODkxQywweDg5MUQsMHg4OTFFLDB4ODkxRiwvKiAweDg4LTB4OEYgKi8KKwkweDg5MjAsMHg4OTIyLDB4ODkyMywweDg5MjQsMHg4OTI2LDB4ODkyNywweDg5MjgsMHg4OTI5LC8qIDB4OTAtMHg5NyAqLworCTB4ODkyQywweDg5MkQsMHg4OTJFLDB4ODkyRiwweDg5MzEsMHg4OTMyLDB4ODkzMywweDg5MzUsLyogMHg5OC0weDlGICovCisJMHg4OTM3LDB4OTAwOSwweDc2NjMsMHg3NzI5LDB4N0VEQSwweDk3NzQsMHg4NTlCLDB4NUI2NiwvKiAweEEwLTB4QTcgKi8KKwkweDdBNzQsMHg5NkVBLDB4ODg0MCwweDUyQ0IsMHg3MThGLDB4NUZBQSwweDY1RUMsMHg4QkUyLC8qIDB4QTgtMHhBRiAqLworCTB4NUJGQiwweDlBNkYsMHg1REUxLDB4NkI4OSwweDZDNUIsMHg4QkFELDB4OEJBRiwweDkwMEEsLyogMHhCMC0weEI3ICovCisJMHg4RkM1LDB4NTM4QiwweDYyQkMsMHg5RTI2LDB4OUUyRCwweDU0NDAsMHg0RTJCLDB4ODJCRCwvKiAweEI4LTB4QkYgKi8KKwkweDcyNTksMHg4NjlDLDB4NUQxNiwweDg4NTksMHg2REFGLDB4OTZDNSwweDU0RDEsMHg0RTlBLC8qIDB4QzAtMHhDNyAqLworCTB4OEJCNiwweDcxMDksMHg1NEJELDB4OTYwOSwweDcwREYsMHg2REY5LDB4NzZEMCwweDRFMjUsLyogMHhDOC0weENGICovCisJMHg3ODE0LDB4ODcxMiwweDVDQTksMHg1RUY2LDB4OEEwMCwweDk4OUMsMHg5NjBFLDB4NzA4RSwvKiAweEQwLTB4RDcgKi8KKwkweDZDQkYsMHg1OTQ0LDB4NjNBOSwweDc3M0MsMHg4ODRELDB4NkYxNCwweDgyNzMsMHg1ODMwLC8qIDB4RDgtMHhERiAqLworCTB4NzFENSwweDUzOEMsMHg3ODFBLDB4OTZDMSwweDU1MDEsMHg1RjY2LDB4NzEzMCwweDVCQjQsLyogMHhFMC0weEU3ICovCisJMHg4QzFBLDB4OUE4QywweDZCODMsMHg1OTJFLDB4OUUyRiwweDc5RTcsMHg2NzY4LDB4NjI2QywvKiAweEU4LTB4RUYgKi8KKwkweDRGNkYsMHg3NUExLDB4N0Y4QSwweDZEMEIsMHg5NjMzLDB4NkMyNywweDRFRjAsMHg3NUQyLC8qIDB4RjAtMHhGNyAqLworCTB4NTE3QiwweDY4MzcsMHg2RjNFLDB4OTA4MCwweDgxNzAsMHg1OTk2LDB4NzQ3NiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRDJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4OTM4LDB4ODkzOSwweDg5M0EsMHg4OTNCLDB4ODkzQywweDg5M0QsMHg4OTNFLDB4ODkzRiwvKiAweDQwLTB4NDcgKi8KKwkweDg5NDAsMHg4OTQyLDB4ODk0MywweDg5NDUsMHg4OTQ2LDB4ODk0NywweDg5NDgsMHg4OTQ5LC8qIDB4NDgtMHg0RiAqLworCTB4ODk0QSwweDg5NEIsMHg4OTRDLDB4ODk0RCwweDg5NEUsMHg4OTRGLDB4ODk1MCwweDg5NTEsLyogMHg1MC0weDU3ICovCisJMHg4OTUyLDB4ODk1MywweDg5NTQsMHg4OTU1LDB4ODk1NiwweDg5NTcsMHg4OTU4LDB4ODk1OSwvKiAweDU4LTB4NUYgKi8KKwkweDg5NUEsMHg4OTVCLDB4ODk1QywweDg5NUQsMHg4OTYwLDB4ODk2MSwweDg5NjIsMHg4OTYzLC8qIDB4NjAtMHg2NyAqLworCTB4ODk2NCwweDg5NjUsMHg4OTY3LDB4ODk2OCwweDg5NjksMHg4OTZBLDB4ODk2QiwweDg5NkMsLyogMHg2OC0weDZGICovCisJMHg4OTZELDB4ODk2RSwweDg5NkYsMHg4OTcwLDB4ODk3MSwweDg5NzIsMHg4OTczLDB4ODk3NCwvKiAweDcwLTB4NzcgKi8KKwkweDg5NzUsMHg4OTc2LDB4ODk3NywweDg5NzgsMHg4OTc5LDB4ODk3QSwweDg5N0MsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4OTdELDB4ODk3RSwweDg5ODAsMHg4OTgyLDB4ODk4NCwweDg5ODUsMHg4OTg3LDB4ODk4OCwvKiAweDgwLTB4ODcgKi8KKwkweDg5ODksMHg4OThBLDB4ODk4QiwweDg5OEMsMHg4OThELDB4ODk4RSwweDg5OEYsMHg4OTkwLC8qIDB4ODgtMHg4RiAqLworCTB4ODk5MSwweDg5OTIsMHg4OTkzLDB4ODk5NCwweDg5OTUsMHg4OTk2LDB4ODk5NywweDg5OTgsLyogMHg5MC0weDk3ICovCisJMHg4OTk5LDB4ODk5QSwweDg5OUIsMHg4OTlDLDB4ODk5RCwweDg5OUUsMHg4OTlGLDB4ODlBMCwvKiAweDk4LTB4OUYgKi8KKwkweDg5QTEsMHg2NDQ3LDB4NUMyNywweDkwNjUsMHg3QTkxLDB4OEMyMywweDU5REEsMHg1NEFDLC8qIDB4QTAtMHhBNyAqLworCTB4ODIwMCwweDgzNkYsMHg4OTgxLDB4ODAwMCwweDY5MzAsMHg1NjRFLDB4ODAzNiwweDcyMzcsLyogMHhBOC0weEFGICovCisJMHg5MUNFLDB4NTFCNiwweDRFNUYsMHg5ODc1LDB4NjM5NiwweDRFMUEsMHg1M0Y2LDB4NjZGMywvKiAweEIwLTB4QjcgKi8KKwkweDgxNEIsMHg1OTFDLDB4NkRCMiwweDRFMDAsMHg1OEY5LDB4NTMzQiwweDYzRDYsMHg5NEYxLC8qIDB4QjgtMHhCRiAqLworCTB4NEY5RCwweDRGMEEsMHg4ODYzLDB4OTg5MCwweDU5MzcsMHg5MDU3LDB4NzlGQiwweDRFRUEsLyogMHhDMC0weEM3ICovCisJMHg4MEYwLDB4NzU5MSwweDZDODIsMHg1QjlDLDB4NTlFOCwweDVGNUQsMHg2OTA1LDB4ODY4MSwvKiAweEM4LTB4Q0YgKi8KKwkweDUwMUEsMHg1REYyLDB4NEU1OSwweDc3RTMsMHg0RUU1LDB4ODI3QSwweDYyOTEsMHg2NjEzLC8qIDB4RDAtMHhENyAqLworCTB4OTA5MSwweDVDNzksMHg0RUJGLDB4NUY3OSwweDgxQzYsMHg5MDM4LDB4ODA4NCwweDc1QUIsLyogMHhEOC0weERGICovCisJMHg0RUE2LDB4ODhENCwweDYxMEYsMHg2QkM1LDB4NUZDNiwweDRFNDksMHg3NkNBLDB4NkVBMiwvKiAweEUwLTB4RTcgKi8KKwkweDhCRTMsMHg4QkFFLDB4OEMwQSwweDhCRDEsMHg1RjAyLDB4N0ZGQywweDdGQ0MsMHg3RUNFLC8qIDB4RTgtMHhFRiAqLworCTB4ODMzNSwweDgzNkIsMHg1NkUwLDB4NkJCNywweDk3RjMsMHg5NjM0LDB4NTlGQiwweDU0MUYsLyogMHhGMC0weEY3ICovCisJMHg5NEY2LDB4NkRFQiwweDVCQzUsMHg5OTZFLDB4NUMzOSwweDVGMTUsMHg5NjkwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EM1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDg5QTIsMHg4OUEzLDB4ODlBNCwweDg5QTUsMHg4OUE2LDB4ODlBNywweDg5QTgsMHg4OUE5LC8qIDB4NDAtMHg0NyAqLworCTB4ODlBQSwweDg5QUIsMHg4OUFDLDB4ODlBRCwweDg5QUUsMHg4OUFGLDB4ODlCMCwweDg5QjEsLyogMHg0OC0weDRGICovCisJMHg4OUIyLDB4ODlCMywweDg5QjQsMHg4OUI1LDB4ODlCNiwweDg5QjcsMHg4OUI4LDB4ODlCOSwvKiAweDUwLTB4NTcgKi8KKwkweDg5QkEsMHg4OUJCLDB4ODlCQywweDg5QkQsMHg4OUJFLDB4ODlCRiwweDg5QzAsMHg4OUMzLC8qIDB4NTgtMHg1RiAqLworCTB4ODlDRCwweDg5RDMsMHg4OUQ0LDB4ODlENSwweDg5RDcsMHg4OUQ4LDB4ODlEOSwweDg5REIsLyogMHg2MC0weDY3ICovCisJMHg4OURELDB4ODlERiwweDg5RTAsMHg4OUUxLDB4ODlFMiwweDg5RTQsMHg4OUU3LDB4ODlFOCwvKiAweDY4LTB4NkYgKi8KKwkweDg5RTksMHg4OUVBLDB4ODlFQywweDg5RUQsMHg4OUVFLDB4ODlGMCwweDg5RjEsMHg4OUYyLC8qIDB4NzAtMHg3NyAqLworCTB4ODlGNCwweDg5RjUsMHg4OUY2LDB4ODlGNywweDg5RjgsMHg4OUY5LDB4ODlGQSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDg5RkIsMHg4OUZDLDB4ODlGRCwweDg5RkUsMHg4OUZGLDB4OEEwMSwweDhBMDIsMHg4QTAzLC8qIDB4ODAtMHg4NyAqLworCTB4OEEwNCwweDhBMDUsMHg4QTA2LDB4OEEwOCwweDhBMDksMHg4QTBBLDB4OEEwQiwweDhBMEMsLyogMHg4OC0weDhGICovCisJMHg4QTBELDB4OEEwRSwweDhBMEYsMHg4QTEwLDB4OEExMSwweDhBMTIsMHg4QTEzLDB4OEExNCwvKiAweDkwLTB4OTcgKi8KKwkweDhBMTUsMHg4QTE2LDB4OEExNywweDhBMTgsMHg4QTE5LDB4OEExQSwweDhBMUIsMHg4QTFDLC8qIDB4OTgtMHg5RiAqLworCTB4OEExRCwweDUzNzAsMHg4MkYxLDB4NkEzMSwweDVBNzQsMHg5RTcwLDB4NUU5NCwweDdGMjgsLyogMHhBMC0weEE3ICovCisJMHg4M0I5LDB4ODQyNCwweDg0MjUsMHg4MzY3LDB4ODc0NywweDhGQ0UsMHg4RDYyLDB4NzZDOCwvKiAweEE4LTB4QUYgKi8KKwkweDVGNzEsMHg5ODk2LDB4Nzg2QywweDY2MjAsMHg1NERGLDB4NjJFNSwweDRGNjMsMHg4MUMzLC8qIDB4QjAtMHhCNyAqLworCTB4NzVDOCwweDVFQjgsMHg5NkNELDB4OEUwQSwweDg2RjksMHg1NDhGLDB4NkNGMywweDZEOEMsLyogMHhCOC0weEJGICovCisJMHg2QzM4LDB4NjA3RiwweDUyQzcsMHg3NTI4LDB4NUU3RCwweDRGMTgsMHg2MEEwLDB4NUZFNywvKiAweEMwLTB4QzcgKi8KKwkweDVDMjQsMHg3NTMxLDB4OTBBRSwweDk0QzAsMHg3MkI5LDB4NkNCOSwweDZFMzgsMHg5MTQ5LC8qIDB4QzgtMHhDRiAqLworCTB4NjcwOSwweDUzQ0IsMHg1M0YzLDB4NEY1MSwweDkxQzksMHg4QkYxLDB4NTNDOCwweDVFN0MsLyogMHhEMC0weEQ3ICovCisJMHg4RkMyLDB4NkRFNCwweDRFOEUsMHg3NkMyLDB4Njk4NiwweDg2NUUsMHg2MTFBLDB4ODIwNiwvKiAweEQ4LTB4REYgKi8KKwkweDRGNTksMHg0RkRFLDB4OTAzRSwweDlDN0MsMHg2MTA5LDB4NkUxRCwweDZFMTQsMHg5Njg1LC8qIDB4RTAtMHhFNyAqLworCTB4NEU4OCwweDVBMzEsMHg5NkU4LDB4NEUwRSwweDVDN0YsMHg3OUI5LDB4NUI4NywweDhCRUQsLyogMHhFOC0weEVGICovCisJMHg3RkJELDB4NzM4OSwweDU3REYsMHg4MjhCLDB4OTBDMSwweDU0MDEsMHg5MDQ3LDB4NTVCQiwvKiAweEYwLTB4RjcgKi8KKwkweDVDRUEsMHg1RkExLDB4NjEwOCwweDZCMzIsMHg3MkYxLDB4ODBCMiwweDhBODksMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Q0WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OEExRSwweDhBMUYsMHg4QTIwLDB4OEEyMSwweDhBMjIsMHg4QTIzLDB4OEEyNCwweDhBMjUsLyogMHg0MC0weDQ3ICovCisJMHg4QTI2LDB4OEEyNywweDhBMjgsMHg4QTI5LDB4OEEyQSwweDhBMkIsMHg4QTJDLDB4OEEyRCwvKiAweDQ4LTB4NEYgKi8KKwkweDhBMkUsMHg4QTJGLDB4OEEzMCwweDhBMzEsMHg4QTMyLDB4OEEzMywweDhBMzQsMHg4QTM1LC8qIDB4NTAtMHg1NyAqLworCTB4OEEzNiwweDhBMzcsMHg4QTM4LDB4OEEzOSwweDhBM0EsMHg4QTNCLDB4OEEzQywweDhBM0QsLyogMHg1OC0weDVGICovCisJMHg4QTNGLDB4OEE0MCwweDhBNDEsMHg4QTQyLDB4OEE0MywweDhBNDQsMHg4QTQ1LDB4OEE0NiwvKiAweDYwLTB4NjcgKi8KKwkweDhBNDcsMHg4QTQ5LDB4OEE0QSwweDhBNEIsMHg4QTRDLDB4OEE0RCwweDhBNEUsMHg4QTRGLC8qIDB4NjgtMHg2RiAqLworCTB4OEE1MCwweDhBNTEsMHg4QTUyLDB4OEE1MywweDhBNTQsMHg4QTU1LDB4OEE1NiwweDhBNTcsLyogMHg3MC0weDc3ICovCisJMHg4QTU4LDB4OEE1OSwweDhBNUEsMHg4QTVCLDB4OEE1QywweDhBNUQsMHg4QTVFLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OEE1RiwweDhBNjAsMHg4QTYxLDB4OEE2MiwweDhBNjMsMHg4QTY0LDB4OEE2NSwweDhBNjYsLyogMHg4MC0weDg3ICovCisJMHg4QTY3LDB4OEE2OCwweDhBNjksMHg4QTZBLDB4OEE2QiwweDhBNkMsMHg4QTZELDB4OEE2RSwvKiAweDg4LTB4OEYgKi8KKwkweDhBNkYsMHg4QTcwLDB4OEE3MSwweDhBNzIsMHg4QTczLDB4OEE3NCwweDhBNzUsMHg4QTc2LC8qIDB4OTAtMHg5NyAqLworCTB4OEE3NywweDhBNzgsMHg4QTdBLDB4OEE3QiwweDhBN0MsMHg4QTdELDB4OEE3RSwweDhBN0YsLyogMHg5OC0weDlGICovCisJMHg4QTgwLDB4NkQ3NCwweDVCRDMsMHg4OEQ1LDB4OTg4NCwweDhDNkIsMHg5QTZELDB4OUUzMywvKiAweEEwLTB4QTcgKi8KKwkweDZFMEEsMHg1MUE0LDB4NTE0MywweDU3QTMsMHg4ODgxLDB4NTM5RiwweDYzRjQsMHg4Rjk1LC8qIDB4QTgtMHhBRiAqLworCTB4NTZFRCwweDU0NTgsMHg1NzA2LDB4NzMzRiwweDZFOTAsMHg3RjE4LDB4OEZEQywweDgyRDEsLyogMHhCMC0weEI3ICovCisJMHg2MTNGLDB4NjAyOCwweDk2NjIsMHg2NkYwLDB4N0VBNiwweDhEOEEsMHg4REMzLDB4OTRBNSwvKiAweEI4LTB4QkYgKi8KKwkweDVDQjMsMHg3Q0E0LDB4NjcwOCwweDYwQTYsMHg5NjA1LDB4ODAxOCwweDRFOTEsMHg5MEU3LC8qIDB4QzAtMHhDNyAqLworCTB4NTMwMCwweDk2NjgsMHg1MTQxLDB4OEZEMCwweDg1NzQsMHg5MTVELDB4NjY1NSwweDk3RjUsLyogMHhDOC0weENGICovCisJMHg1QjU1LDB4NTMxRCwweDc4MzgsMHg2NzQyLDB4NjgzRCwweDU0QzksMHg3MDdFLDB4NUJCMCwvKiAweEQwLTB4RDcgKi8KKwkweDhGN0QsMHg1MThELDB4NTcyOCwweDU0QjEsMHg2NTEyLDB4NjY4MiwweDhENUUsMHg4RDQzLC8qIDB4RDgtMHhERiAqLworCTB4ODEwRiwweDg0NkMsMHg5MDZELDB4N0NERiwweDUxRkYsMHg4NUZCLDB4NjdBMywweDY1RTksLyogMHhFMC0weEU3ICovCisJMHg2RkExLDB4ODZBNCwweDhFODEsMHg1NjZBLDB4OTAyMCwweDc2ODIsMHg3MDc2LDB4NzFFNSwvKiAweEU4LTB4RUYgKi8KKwkweDhEMjMsMHg2MkU5LDB4NTIxOSwweDZDRkQsMHg4RDNDLDB4NjAwRSwweDU4OUUsMHg2MThFLC8qIDB4RjAtMHhGNyAqLworCTB4NjZGRSwweDhENjAsMHg2MjRFLDB4NTVCMywweDZFMjMsMHg2NzJELDB4OEY2NywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRDVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4QTgxLDB4OEE4MiwweDhBODMsMHg4QTg0LDB4OEE4NSwweDhBODYsMHg4QTg3LDB4OEE4OCwvKiAweDQwLTB4NDcgKi8KKwkweDhBOEIsMHg4QThDLDB4OEE4RCwweDhBOEUsMHg4QThGLDB4OEE5MCwweDhBOTEsMHg4QTkyLC8qIDB4NDgtMHg0RiAqLworCTB4OEE5NCwweDhBOTUsMHg4QTk2LDB4OEE5NywweDhBOTgsMHg4QTk5LDB4OEE5QSwweDhBOUIsLyogMHg1MC0weDU3ICovCisJMHg4QTlDLDB4OEE5RCwweDhBOUUsMHg4QTlGLDB4OEFBMCwweDhBQTEsMHg4QUEyLDB4OEFBMywvKiAweDU4LTB4NUYgKi8KKwkweDhBQTQsMHg4QUE1LDB4OEFBNiwweDhBQTcsMHg4QUE4LDB4OEFBOSwweDhBQUEsMHg4QUFCLC8qIDB4NjAtMHg2NyAqLworCTB4OEFBQywweDhBQUQsMHg4QUFFLDB4OEFBRiwweDhBQjAsMHg4QUIxLDB4OEFCMiwweDhBQjMsLyogMHg2OC0weDZGICovCisJMHg4QUI0LDB4OEFCNSwweDhBQjYsMHg4QUI3LDB4OEFCOCwweDhBQjksMHg4QUJBLDB4OEFCQiwvKiAweDcwLTB4NzcgKi8KKwkweDhBQkMsMHg4QUJELDB4OEFCRSwweDhBQkYsMHg4QUMwLDB4OEFDMSwweDhBQzIsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4QUMzLDB4OEFDNCwweDhBQzUsMHg4QUM2LDB4OEFDNywweDhBQzgsMHg4QUM5LDB4OEFDQSwvKiAweDgwLTB4ODcgKi8KKwkweDhBQ0IsMHg4QUNDLDB4OEFDRCwweDhBQ0UsMHg4QUNGLDB4OEFEMCwweDhBRDEsMHg4QUQyLC8qIDB4ODgtMHg4RiAqLworCTB4OEFEMywweDhBRDQsMHg4QUQ1LDB4OEFENiwweDhBRDcsMHg4QUQ4LDB4OEFEOSwweDhBREEsLyogMHg5MC0weDk3ICovCisJMHg4QURCLDB4OEFEQywweDhBREQsMHg4QURFLDB4OEFERiwweDhBRTAsMHg4QUUxLDB4OEFFMiwvKiAweDk4LTB4OUYgKi8KKwkweDhBRTMsMHg5NEUxLDB4OTVGOCwweDc3MjgsMHg2ODA1LDB4NjlBOCwweDU0OEIsMHg0RTRELC8qIDB4QTAtMHhBNyAqLworCTB4NzBCOCwweDhCQzgsMHg2NDU4LDB4NjU4QiwweDVCODUsMHg3QTg0LDB4NTAzQSwweDVCRTgsLyogMHhBOC0weEFGICovCisJMHg3N0JCLDB4NkJFMSwweDhBNzksMHg3Qzk4LDB4NkNCRSwweDc2Q0YsMHg2NUE5LDB4OEY5NywvKiAweEIwLTB4QjcgKi8KKwkweDVEMkQsMHg1QzU1LDB4ODYzOCwweDY4MDgsMHg1MzYwLDB4NjIxOCwweDdBRDksMHg2RTVCLC8qIDB4QjgtMHhCRiAqLworCTB4N0VGRCwweDZBMUYsMHg3QUUwLDB4NUY3MCwweDZGMzMsMHg1RjIwLDB4NjM4QywweDZEQTgsLyogMHhDMC0weEM3ICovCisJMHg2NzU2LDB4NEUwOCwweDVFMTAsMHg4RDI2LDB4NEVENywweDgwQzAsMHg3NjM0LDB4OTY5QywvKiAweEM4LTB4Q0YgKi8KKwkweDYyREIsMHg2NjJELDB4NjI3RSwweDZDQkMsMHg4RDc1LDB4NzE2NywweDdGNjksMHg1MTQ2LC8qIDB4RDAtMHhENyAqLworCTB4ODA4NywweDUzRUMsMHg5MDZFLDB4NjI5OCwweDU0RjIsMHg4NkYwLDB4OEY5OSwweDgwMDUsLyogMHhEOC0weERGICovCisJMHg5NTE3LDB4ODUxNywweDhGRDksMHg2RDU5LDB4NzNDRCwweDY1OUYsMHg3NzFGLDB4NzUwNCwvKiAweEUwLTB4RTcgKi8KKwkweDc4MjcsMHg4MUZCLDB4OEQxRSwweDk0ODgsMHg0RkE2LDB4Njc5NSwweDc1QjksMHg4QkNBLC8qIDB4RTgtMHhFRiAqLworCTB4OTcwNywweDYzMkYsMHg5NTQ3LDB4OTYzNSwweDg0QjgsMHg2MzIzLDB4Nzc0MSwweDVGODEsLyogMHhGMC0weEY3ICovCisJMHg3MkYwLDB4NEU4OSwweDYwMTQsMHg2NTc0LDB4NjJFRiwweDZCNjMsMHg2NTNGLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9ENlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDhBRTQsMHg4QUU1LDB4OEFFNiwweDhBRTcsMHg4QUU4LDB4OEFFOSwweDhBRUEsMHg4QUVCLC8qIDB4NDAtMHg0NyAqLworCTB4OEFFQywweDhBRUQsMHg4QUVFLDB4OEFFRiwweDhBRjAsMHg4QUYxLDB4OEFGMiwweDhBRjMsLyogMHg0OC0weDRGICovCisJMHg4QUY0LDB4OEFGNSwweDhBRjYsMHg4QUY3LDB4OEFGOCwweDhBRjksMHg4QUZBLDB4OEFGQiwvKiAweDUwLTB4NTcgKi8KKwkweDhBRkMsMHg4QUZELDB4OEFGRSwweDhBRkYsMHg4QjAwLDB4OEIwMSwweDhCMDIsMHg4QjAzLC8qIDB4NTgtMHg1RiAqLworCTB4OEIwNCwweDhCMDUsMHg4QjA2LDB4OEIwOCwweDhCMDksMHg4QjBBLDB4OEIwQiwweDhCMEMsLyogMHg2MC0weDY3ICovCisJMHg4QjBELDB4OEIwRSwweDhCMEYsMHg4QjEwLDB4OEIxMSwweDhCMTIsMHg4QjEzLDB4OEIxNCwvKiAweDY4LTB4NkYgKi8KKwkweDhCMTUsMHg4QjE2LDB4OEIxNywweDhCMTgsMHg4QjE5LDB4OEIxQSwweDhCMUIsMHg4QjFDLC8qIDB4NzAtMHg3NyAqLworCTB4OEIxRCwweDhCMUUsMHg4QjFGLDB4OEIyMCwweDhCMjEsMHg4QjIyLDB4OEIyMywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDhCMjQsMHg4QjI1LDB4OEIyNywweDhCMjgsMHg4QjI5LDB4OEIyQSwweDhCMkIsMHg4QjJDLC8qIDB4ODAtMHg4NyAqLworCTB4OEIyRCwweDhCMkUsMHg4QjJGLDB4OEIzMCwweDhCMzEsMHg4QjMyLDB4OEIzMywweDhCMzQsLyogMHg4OC0weDhGICovCisJMHg4QjM1LDB4OEIzNiwweDhCMzcsMHg4QjM4LDB4OEIzOSwweDhCM0EsMHg4QjNCLDB4OEIzQywvKiAweDkwLTB4OTcgKi8KKwkweDhCM0QsMHg4QjNFLDB4OEIzRiwweDhCNDAsMHg4QjQxLDB4OEI0MiwweDhCNDMsMHg4QjQ0LC8qIDB4OTgtMHg5RiAqLworCTB4OEI0NSwweDVFMjcsMHg3NUM3LDB4OTBEMSwweDhCQzEsMHg4MjlELDB4Njc5RCwweDY1MkYsLyogMHhBMC0weEE3ICovCisJMHg1NDMxLDB4ODcxOCwweDc3RTUsMHg4MEEyLDB4ODEwMiwweDZDNDEsMHg0RTRCLDB4N0VDNywvKiAweEE4LTB4QUYgKi8KKwkweDgwNEMsMHg3NkY0LDB4NjkwRCwweDZCOTYsMHg2MjY3LDB4NTAzQywweDRGODQsMHg1NzQwLC8qIDB4QjAtMHhCNyAqLworCTB4NjMwNywweDZCNjIsMHg4REJFLDB4NTNFQSwweDY1RTgsMHg3RUI4LDB4NUZENywweDYzMUEsLyogMHhCOC0weEJGICovCisJMHg2M0I3LDB4ODFGMywweDgxRjQsMHg3RjZFLDB4NUUxQywweDVDRDksMHg1MjM2LDB4NjY3QSwvKiAweEMwLTB4QzcgKi8KKwkweDc5RTksMHg3QTFBLDB4OEQyOCwweDcwOTksMHg3NUQ0LDB4NkVERSwweDZDQkIsMHg3QTkyLC8qIDB4QzgtMHhDRiAqLworCTB4NEUyRCwweDc2QzUsMHg1RkUwLDB4OTQ5RiwweDg4NzcsMHg3RUM4LDB4NzlDRCwweDgwQkYsLyogMHhEMC0weEQ3ICovCisJMHg5MUNELDB4NEVGMiwweDRGMTcsMHg4MjFGLDB4NTQ2OCwweDVEREUsMHg2RDMyLDB4OEJDQywvKiAweEQ4LTB4REYgKi8KKwkweDdDQTUsMHg4Rjc0LDB4ODA5OCwweDVFMUEsMHg1NDkyLDB4NzZCMSwweDVCOTksMHg2NjNDLC8qIDB4RTAtMHhFNyAqLworCTB4OUFBNCwweDczRTAsMHg2ODJBLDB4ODZEQiwweDY3MzEsMHg3MzJBLDB4OEJGOCwweDhCREIsLyogMHhFOC0weEVGICovCisJMHg5MDEwLDB4N0FGOSwweDcwREIsMHg3MTZFLDB4NjJDNCwweDc3QTksMHg1NjMxLDB4NEUzQiwvKiAweEYwLTB4RjcgKi8KKwkweDg0NTcsMHg2N0YxLDB4NTJBOSwweDg2QzAsMHg4RDJFLDB4OTRGOCwweDdCNTEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Q3WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OEI0NiwweDhCNDcsMHg4QjQ4LDB4OEI0OSwweDhCNEEsMHg4QjRCLDB4OEI0QywweDhCNEQsLyogMHg0MC0weDQ3ICovCisJMHg4QjRFLDB4OEI0RiwweDhCNTAsMHg4QjUxLDB4OEI1MiwweDhCNTMsMHg4QjU0LDB4OEI1NSwvKiAweDQ4LTB4NEYgKi8KKwkweDhCNTYsMHg4QjU3LDB4OEI1OCwweDhCNTksMHg4QjVBLDB4OEI1QiwweDhCNUMsMHg4QjVELC8qIDB4NTAtMHg1NyAqLworCTB4OEI1RSwweDhCNUYsMHg4QjYwLDB4OEI2MSwweDhCNjIsMHg4QjYzLDB4OEI2NCwweDhCNjUsLyogMHg1OC0weDVGICovCisJMHg4QjY3LDB4OEI2OCwweDhCNjksMHg4QjZBLDB4OEI2QiwweDhCNkQsMHg4QjZFLDB4OEI2RiwvKiAweDYwLTB4NjcgKi8KKwkweDhCNzAsMHg4QjcxLDB4OEI3MiwweDhCNzMsMHg4Qjc0LDB4OEI3NSwweDhCNzYsMHg4Qjc3LC8qIDB4NjgtMHg2RiAqLworCTB4OEI3OCwweDhCNzksMHg4QjdBLDB4OEI3QiwweDhCN0MsMHg4QjdELDB4OEI3RSwweDhCN0YsLyogMHg3MC0weDc3ICovCisJMHg4QjgwLDB4OEI4MSwweDhCODIsMHg4QjgzLDB4OEI4NCwweDhCODUsMHg4Qjg2LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OEI4NywweDhCODgsMHg4Qjg5LDB4OEI4QSwweDhCOEIsMHg4QjhDLDB4OEI4RCwweDhCOEUsLyogMHg4MC0weDg3ICovCisJMHg4QjhGLDB4OEI5MCwweDhCOTEsMHg4QjkyLDB4OEI5MywweDhCOTQsMHg4Qjk1LDB4OEI5NiwvKiAweDg4LTB4OEYgKi8KKwkweDhCOTcsMHg4Qjk4LDB4OEI5OSwweDhCOUEsMHg4QjlCLDB4OEI5QywweDhCOUQsMHg4QjlFLC8qIDB4OTAtMHg5NyAqLworCTB4OEI5RiwweDhCQUMsMHg4QkIxLDB4OEJCQiwweDhCQzcsMHg4QkQwLDB4OEJFQSwweDhDMDksLyogMHg5OC0weDlGICovCisJMHg4QzFFLDB4NEY0RiwweDZDRTgsMHg3OTVELDB4OUE3QiwweDYyOTMsMHg3MjJBLDB4NjJGRCwvKiAweEEwLTB4QTcgKi8KKwkweDRFMTMsMHg3ODE2LDB4OEY2QywweDY0QjAsMHg4RDVBLDB4N0JDNiwweDY4NjksMHg1RTg0LC8qIDB4QTgtMHhBRiAqLworCTB4ODhDNSwweDU5ODYsMHg2NDlFLDB4NThFRSwweDcyQjYsMHg2OTBFLDB4OTUyNSwweDhGRkQsLyogMHhCMC0weEI3ICovCisJMHg4RDU4LDB4NTc2MCwweDdGMDAsMHg4QzA2LDB4NTFDNiwweDYzNDksMHg2MkQ5LDB4NTM1MywvKiAweEI4LTB4QkYgKi8KKwkweDY4NEMsMHg3NDIyLDB4ODMwMSwweDkxNEMsMHg1NTQ0LDB4Nzc0MCwweDcwN0MsMHg2RDRBLC8qIDB4QzAtMHhDNyAqLworCTB4NTE3OSwweDU0QTgsMHg4RDQ0LDB4NTlGRiwweDZFQ0IsMHg2REM0LDB4NUI1QywweDdEMkIsLyogMHhDOC0weENGICovCisJMHg0RUQ0LDB4N0M3RCwweDZFRDMsMHg1QjUwLDB4ODFFQSwweDZFMEQsMHg1QjU3LDB4OUIwMywvKiAweEQwLTB4RDcgKi8KKwkweDY4RDUsMHg4RTJBLDB4NUI5NywweDdFRkMsMHg2MDNCLDB4N0VCNSwweDkwQjksMHg4RDcwLC8qIDB4RDgtMHhERiAqLworCTB4NTk0RiwweDYzQ0QsMHg3OURGLDB4OERCMywweDUzNTIsMHg2NUNGLDB4Nzk1NiwweDhCQzUsLyogMHhFMC0weEU3ICovCisJMHg5NjNCLDB4N0VDNCwweDk0QkIsMHg3RTgyLDB4NTYzNCwweDkxODksMHg2NzAwLDB4N0Y2QSwvKiAweEU4LTB4RUYgKi8KKwkweDVDMEEsMHg5MDc1LDB4NjYyOCwweDVERTYsMHg0RjUwLDB4NjdERSwweDUwNUEsMHg0RjVDLC8qIDB4RjAtMHhGNyAqLworCTB4NTc1MCwweDVFQTcsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRDhbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4QzM4LDB4OEMzOSwweDhDM0EsMHg4QzNCLDB4OEMzQywweDhDM0QsMHg4QzNFLDB4OEMzRiwvKiAweDQwLTB4NDcgKi8KKwkweDhDNDAsMHg4QzQyLDB4OEM0MywweDhDNDQsMHg4QzQ1LDB4OEM0OCwweDhDNEEsMHg4QzRCLC8qIDB4NDgtMHg0RiAqLworCTB4OEM0RCwweDhDNEUsMHg4QzRGLDB4OEM1MCwweDhDNTEsMHg4QzUyLDB4OEM1MywweDhDNTQsLyogMHg1MC0weDU3ICovCisJMHg4QzU2LDB4OEM1NywweDhDNTgsMHg4QzU5LDB4OEM1QiwweDhDNUMsMHg4QzVELDB4OEM1RSwvKiAweDU4LTB4NUYgKi8KKwkweDhDNUYsMHg4QzYwLDB4OEM2MywweDhDNjQsMHg4QzY1LDB4OEM2NiwweDhDNjcsMHg4QzY4LC8qIDB4NjAtMHg2NyAqLworCTB4OEM2OSwweDhDNkMsMHg4QzZELDB4OEM2RSwweDhDNkYsMHg4QzcwLDB4OEM3MSwweDhDNzIsLyogMHg2OC0weDZGICovCisJMHg4Qzc0LDB4OEM3NSwweDhDNzYsMHg4Qzc3LDB4OEM3QiwweDhDN0MsMHg4QzdELDB4OEM3RSwvKiAweDcwLTB4NzcgKi8KKwkweDhDN0YsMHg4QzgwLDB4OEM4MSwweDhDODMsMHg4Qzg0LDB4OEM4NiwweDhDODcsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4Qzg4LDB4OEM4QiwweDhDOEQsMHg4QzhFLDB4OEM4RiwweDhDOTAsMHg4QzkxLDB4OEM5MiwvKiAweDgwLTB4ODcgKi8KKwkweDhDOTMsMHg4Qzk1LDB4OEM5NiwweDhDOTcsMHg4Qzk5LDB4OEM5QSwweDhDOUIsMHg4QzlDLC8qIDB4ODgtMHg4RiAqLworCTB4OEM5RCwweDhDOUUsMHg4QzlGLDB4OENBMCwweDhDQTEsMHg4Q0EyLDB4OENBMywweDhDQTQsLyogMHg5MC0weDk3ICovCisJMHg4Q0E1LDB4OENBNiwweDhDQTcsMHg4Q0E4LDB4OENBOSwweDhDQUEsMHg4Q0FCLDB4OENBQywvKiAweDk4LTB4OUYgKi8KKwkweDhDQUQsMHg0RThELDB4NEUwQywweDUxNDAsMHg0RTEwLDB4NUVGRiwweDUzNDUsMHg0RTE1LC8qIDB4QTAtMHhBNyAqLworCTB4NEU5OCwweDRFMUUsMHg5QjMyLDB4NUI2QywweDU2NjksMHg0RTI4LDB4NzlCQSwweDRFM0YsLyogMHhBOC0weEFGICovCisJMHg1MzE1LDB4NEU0NywweDU5MkQsMHg3MjNCLDB4NTM2RSwweDZDMTAsMHg1NkRGLDB4ODBFNCwvKiAweEIwLTB4QjcgKi8KKwkweDk5OTcsMHg2QkQzLDB4Nzc3RSwweDlGMTcsMHg0RTM2LDB4NEU5RiwweDlGMTAsMHg0RTVDLC8qIDB4QjgtMHhCRiAqLworCTB4NEU2OSwweDRFOTMsMHg4Mjg4LDB4NUI1QiwweDU1NkMsMHg1NjBGLDB4NEVDNCwweDUzOEQsLyogMHhDMC0weEM3ICovCisJMHg1MzlELDB4NTNBMywweDUzQTUsMHg1M0FFLDB4OTc2NSwweDhENUQsMHg1MzFBLDB4NTNGNSwvKiAweEM4LTB4Q0YgKi8KKwkweDUzMjYsMHg1MzJFLDB4NTMzRSwweDhENUMsMHg1MzY2LDB4NTM2MywweDUyMDIsMHg1MjA4LC8qIDB4RDAtMHhENyAqLworCTB4NTIwRSwweDUyMkQsMHg1MjMzLDB4NTIzRiwweDUyNDAsMHg1MjRDLDB4NTI1RSwweDUyNjEsLyogMHhEOC0weERGICovCisJMHg1MjVDLDB4ODRBRiwweDUyN0QsMHg1MjgyLDB4NTI4MSwweDUyOTAsMHg1MjkzLDB4NTE4MiwvKiAweEUwLTB4RTcgKi8KKwkweDdGNTQsMHg0RUJCLDB4NEVDMywweDRFQzksMHg0RUMyLDB4NEVFOCwweDRFRTEsMHg0RUVCLC8qIDB4RTgtMHhFRiAqLworCTB4NEVERSwweDRGMUIsMHg0RUYzLDB4NEYyMiwweDRGNjQsMHg0RUY1LDB4NEYyNSwweDRGMjcsLyogMHhGMC0weEY3ICovCisJMHg0RjA5LDB4NEYyQiwweDRGNUUsMHg0RjY3LDB4NjUzOCwweDRGNUEsMHg0RjVELDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EOVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDhDQUUsMHg4Q0FGLDB4OENCMCwweDhDQjEsMHg4Q0IyLDB4OENCMywweDhDQjQsMHg4Q0I1LC8qIDB4NDAtMHg0NyAqLworCTB4OENCNiwweDhDQjcsMHg4Q0I4LDB4OENCOSwweDhDQkEsMHg4Q0JCLDB4OENCQywweDhDQkQsLyogMHg0OC0weDRGICovCisJMHg4Q0JFLDB4OENCRiwweDhDQzAsMHg4Q0MxLDB4OENDMiwweDhDQzMsMHg4Q0M0LDB4OENDNSwvKiAweDUwLTB4NTcgKi8KKwkweDhDQzYsMHg4Q0M3LDB4OENDOCwweDhDQzksMHg4Q0NBLDB4OENDQiwweDhDQ0MsMHg4Q0NELC8qIDB4NTgtMHg1RiAqLworCTB4OENDRSwweDhDQ0YsMHg4Q0QwLDB4OENEMSwweDhDRDIsMHg4Q0QzLDB4OENENCwweDhDRDUsLyogMHg2MC0weDY3ICovCisJMHg4Q0Q2LDB4OENENywweDhDRDgsMHg4Q0Q5LDB4OENEQSwweDhDREIsMHg4Q0RDLDB4OENERCwvKiAweDY4LTB4NkYgKi8KKwkweDhDREUsMHg4Q0RGLDB4OENFMCwweDhDRTEsMHg4Q0UyLDB4OENFMywweDhDRTQsMHg4Q0U1LC8qIDB4NzAtMHg3NyAqLworCTB4OENFNiwweDhDRTcsMHg4Q0U4LDB4OENFOSwweDhDRUEsMHg4Q0VCLDB4OENFQywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDhDRUQsMHg4Q0VFLDB4OENFRiwweDhDRjAsMHg4Q0YxLDB4OENGMiwweDhDRjMsMHg4Q0Y0LC8qIDB4ODAtMHg4NyAqLworCTB4OENGNSwweDhDRjYsMHg4Q0Y3LDB4OENGOCwweDhDRjksMHg4Q0ZBLDB4OENGQiwweDhDRkMsLyogMHg4OC0weDhGICovCisJMHg4Q0ZELDB4OENGRSwweDhDRkYsMHg4RDAwLDB4OEQwMSwweDhEMDIsMHg4RDAzLDB4OEQwNCwvKiAweDkwLTB4OTcgKi8KKwkweDhEMDUsMHg4RDA2LDB4OEQwNywweDhEMDgsMHg4RDA5LDB4OEQwQSwweDhEMEIsMHg4RDBDLC8qIDB4OTgtMHg5RiAqLworCTB4OEQwRCwweDRGNUYsMHg0RjU3LDB4NEYzMiwweDRGM0QsMHg0Rjc2LDB4NEY3NCwweDRGOTEsLyogMHhBMC0weEE3ICovCisJMHg0Rjg5LDB4NEY4MywweDRGOEYsMHg0RjdFLDB4NEY3QiwweDRGQUEsMHg0RjdDLDB4NEZBQywvKiAweEE4LTB4QUYgKi8KKwkweDRGOTQsMHg0RkU2LDB4NEZFOCwweDRGRUEsMHg0RkM1LDB4NEZEQSwweDRGRTMsMHg0RkRDLC8qIDB4QjAtMHhCNyAqLworCTB4NEZEMSwweDRGREYsMHg0RkY4LDB4NTAyOSwweDUwNEMsMHg0RkYzLDB4NTAyQywweDUwMEYsLyogMHhCOC0weEJGICovCisJMHg1MDJFLDB4NTAyRCwweDRGRkUsMHg1MDFDLDB4NTAwQywweDUwMjUsMHg1MDI4LDB4NTA3RSwvKiAweEMwLTB4QzcgKi8KKwkweDUwNDMsMHg1MDU1LDB4NTA0OCwweDUwNEUsMHg1MDZDLDB4NTA3QiwweDUwQTUsMHg1MEE3LC8qIDB4QzgtMHhDRiAqLworCTB4NTBBOSwweDUwQkEsMHg1MEQ2LDB4NTEwNiwweDUwRUQsMHg1MEVDLDB4NTBFNiwweDUwRUUsLyogMHhEMC0weEQ3ICovCisJMHg1MTA3LDB4NTEwQiwweDRFREQsMHg2QzNELDB4NEY1OCwweDRGNjUsMHg0RkNFLDB4OUZBMCwvKiAweEQ4LTB4REYgKi8KKwkweDZDNDYsMHg3Qzc0LDB4NTE2RSwweDVERkQsMHg5RUM5LDB4OTk5OCwweDUxODEsMHg1OTE0LC8qIDB4RTAtMHhFNyAqLworCTB4NTJGOSwweDUzMEQsMHg4QTA3LDB4NTMxMCwweDUxRUIsMHg1OTE5LDB4NTE1NSwweDRFQTAsLyogMHhFOC0weEVGICovCisJMHg1MTU2LDB4NEVCMywweDg4NkUsMHg4OEE0LDB4NEVCNSwweDgxMTQsMHg4OEQyLDB4Nzk4MCwvKiAweEYwLTB4RjcgKi8KKwkweDVCMzQsMHg4ODAzLDB4N0ZCOCwweDUxQUIsMHg1MUIxLDB4NTFCRCwweDUxQkMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0RBWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OEQwRSwweDhEMEYsMHg4RDEwLDB4OEQxMSwweDhEMTIsMHg4RDEzLDB4OEQxNCwweDhEMTUsLyogMHg0MC0weDQ3ICovCisJMHg4RDE2LDB4OEQxNywweDhEMTgsMHg4RDE5LDB4OEQxQSwweDhEMUIsMHg4RDFDLDB4OEQyMCwvKiAweDQ4LTB4NEYgKi8KKwkweDhENTEsMHg4RDUyLDB4OEQ1NywweDhENUYsMHg4RDY1LDB4OEQ2OCwweDhENjksMHg4RDZBLC8qIDB4NTAtMHg1NyAqLworCTB4OEQ2QywweDhENkUsMHg4RDZGLDB4OEQ3MSwweDhENzIsMHg4RDc4LDB4OEQ3OSwweDhEN0EsLyogMHg1OC0weDVGICovCisJMHg4RDdCLDB4OEQ3QywweDhEN0QsMHg4RDdFLDB4OEQ3RiwweDhEODAsMHg4RDgyLDB4OEQ4MywvKiAweDYwLTB4NjcgKi8KKwkweDhEODYsMHg4RDg3LDB4OEQ4OCwweDhEODksMHg4RDhDLDB4OEQ4RCwweDhEOEUsMHg4RDhGLC8qIDB4NjgtMHg2RiAqLworCTB4OEQ5MCwweDhEOTIsMHg4RDkzLDB4OEQ5NSwweDhEOTYsMHg4RDk3LDB4OEQ5OCwweDhEOTksLyogMHg3MC0weDc3ICovCisJMHg4RDlBLDB4OEQ5QiwweDhEOUMsMHg4RDlELDB4OEQ5RSwweDhEQTAsMHg4REExLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OERBMiwweDhEQTQsMHg4REE1LDB4OERBNiwweDhEQTcsMHg4REE4LDB4OERBOSwweDhEQUEsLyogMHg4MC0weDg3ICovCisJMHg4REFCLDB4OERBQywweDhEQUQsMHg4REFFLDB4OERBRiwweDhEQjAsMHg4REIyLDB4OERCNiwvKiAweDg4LTB4OEYgKi8KKwkweDhEQjcsMHg4REI5LDB4OERCQiwweDhEQkQsMHg4REMwLDB4OERDMSwweDhEQzIsMHg4REM1LC8qIDB4OTAtMHg5NyAqLworCTB4OERDNywweDhEQzgsMHg4REM5LDB4OERDQSwweDhEQ0QsMHg4REQwLDB4OEREMiwweDhERDMsLyogMHg5OC0weDlGICovCisJMHg4REQ0LDB4NTFDNywweDUxOTYsMHg1MUEyLDB4NTFBNSwweDhCQTAsMHg4QkE2LDB4OEJBNywvKiAweEEwLTB4QTcgKi8KKwkweDhCQUEsMHg4QkI0LDB4OEJCNSwweDhCQjcsMHg4QkMyLDB4OEJDMywweDhCQ0IsMHg4QkNGLC8qIDB4QTgtMHhBRiAqLworCTB4OEJDRSwweDhCRDIsMHg4QkQzLDB4OEJENCwweDhCRDYsMHg4QkQ4LDB4OEJEOSwweDhCREMsLyogMHhCMC0weEI3ICovCisJMHg4QkRGLDB4OEJFMCwweDhCRTQsMHg4QkU4LDB4OEJFOSwweDhCRUUsMHg4QkYwLDB4OEJGMywvKiAweEI4LTB4QkYgKi8KKwkweDhCRjYsMHg4QkY5LDB4OEJGQywweDhCRkYsMHg4QzAwLDB4OEMwMiwweDhDMDQsMHg4QzA3LC8qIDB4QzAtMHhDNyAqLworCTB4OEMwQywweDhDMEYsMHg4QzExLDB4OEMxMiwweDhDMTQsMHg4QzE1LDB4OEMxNiwweDhDMTksLyogMHhDOC0weENGICovCisJMHg4QzFCLDB4OEMxOCwweDhDMUQsMHg4QzFGLDB4OEMyMCwweDhDMjEsMHg4QzI1LDB4OEMyNywvKiAweEQwLTB4RDcgKi8KKwkweDhDMkEsMHg4QzJCLDB4OEMyRSwweDhDMkYsMHg4QzMyLDB4OEMzMywweDhDMzUsMHg4QzM2LC8qIDB4RDgtMHhERiAqLworCTB4NTM2OSwweDUzN0EsMHg5NjFELDB4OTYyMiwweDk2MjEsMHg5NjMxLDB4OTYyQSwweDk2M0QsLyogMHhFMC0weEU3ICovCisJMHg5NjNDLDB4OTY0MiwweDk2NDksMHg5NjU0LDB4OTY1RiwweDk2NjcsMHg5NjZDLDB4OTY3MiwvKiAweEU4LTB4RUYgKi8KKwkweDk2NzQsMHg5Njg4LDB4OTY4RCwweDk2OTcsMHg5NkIwLDB4OTA5NywweDkwOUIsMHg5MDlELC8qIDB4RjAtMHhGNyAqLworCTB4OTA5OSwweDkwQUMsMHg5MEExLDB4OTBCNCwweDkwQjMsMHg5MEI2LDB4OTBCQSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfREJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4REQ1LDB4OEREOCwweDhERDksMHg4RERDLDB4OERFMCwweDhERTEsMHg4REUyLDB4OERFNSwvKiAweDQwLTB4NDcgKi8KKwkweDhERTYsMHg4REU3LDB4OERFOSwweDhERUQsMHg4REVFLDB4OERGMCwweDhERjEsMHg4REYyLC8qIDB4NDgtMHg0RiAqLworCTB4OERGNCwweDhERjYsMHg4REZDLDB4OERGRSwweDhERkYsMHg4RTAwLDB4OEUwMSwweDhFMDIsLyogMHg1MC0weDU3ICovCisJMHg4RTAzLDB4OEUwNCwweDhFMDYsMHg4RTA3LDB4OEUwOCwweDhFMEIsMHg4RTBELDB4OEUwRSwvKiAweDU4LTB4NUYgKi8KKwkweDhFMTAsMHg4RTExLDB4OEUxMiwweDhFMTMsMHg4RTE1LDB4OEUxNiwweDhFMTcsMHg4RTE4LC8qIDB4NjAtMHg2NyAqLworCTB4OEUxOSwweDhFMUEsMHg4RTFCLDB4OEUxQywweDhFMjAsMHg4RTIxLDB4OEUyNCwweDhFMjUsLyogMHg2OC0weDZGICovCisJMHg4RTI2LDB4OEUyNywweDhFMjgsMHg4RTJCLDB4OEUyRCwweDhFMzAsMHg4RTMyLDB4OEUzMywvKiAweDcwLTB4NzcgKi8KKwkweDhFMzQsMHg4RTM2LDB4OEUzNywweDhFMzgsMHg4RTNCLDB4OEUzQywweDhFM0UsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4RTNGLDB4OEU0MywweDhFNDUsMHg4RTQ2LDB4OEU0QywweDhFNEQsMHg4RTRFLDB4OEU0RiwvKiAweDgwLTB4ODcgKi8KKwkweDhFNTAsMHg4RTUzLDB4OEU1NCwweDhFNTUsMHg4RTU2LDB4OEU1NywweDhFNTgsMHg4RTVBLC8qIDB4ODgtMHg4RiAqLworCTB4OEU1QiwweDhFNUMsMHg4RTVELDB4OEU1RSwweDhFNUYsMHg4RTYwLDB4OEU2MSwweDhFNjIsLyogMHg5MC0weDk3ICovCisJMHg4RTYzLDB4OEU2NCwweDhFNjUsMHg4RTY3LDB4OEU2OCwweDhFNkEsMHg4RTZCLDB4OEU2RSwvKiAweDk4LTB4OUYgKi8KKwkweDhFNzEsMHg5MEI4LDB4OTBCMCwweDkwQ0YsMHg5MEM1LDB4OTBCRSwweDkwRDAsMHg5MEM0LC8qIDB4QTAtMHhBNyAqLworCTB4OTBDNywweDkwRDMsMHg5MEU2LDB4OTBFMiwweDkwREMsMHg5MEQ3LDB4OTBEQiwweDkwRUIsLyogMHhBOC0weEFGICovCisJMHg5MEVGLDB4OTBGRSwweDkxMDQsMHg5MTIyLDB4OTExRSwweDkxMjMsMHg5MTMxLDB4OTEyRiwvKiAweEIwLTB4QjcgKi8KKwkweDkxMzksMHg5MTQzLDB4OTE0NiwweDUyMEQsMHg1OTQyLDB4NTJBMiwweDUyQUMsMHg1MkFELC8qIDB4QjgtMHhCRiAqLworCTB4NTJCRSwweDU0RkYsMHg1MkQwLDB4NTJENiwweDUyRjAsMHg1M0RGLDB4NzFFRSwweDc3Q0QsLyogMHhDMC0weEM3ICovCisJMHg1RUY0LDB4NTFGNSwweDUxRkMsMHg5QjJGLDB4NTNCNiwweDVGMDEsMHg3NTVBLDB4NURFRiwvKiAweEM4LTB4Q0YgKi8KKwkweDU3NEMsMHg1N0E5LDB4NTdBMSwweDU4N0UsMHg1OEJDLDB4NThDNSwweDU4RDEsMHg1NzI5LC8qIDB4RDAtMHhENyAqLworCTB4NTcyQywweDU3MkEsMHg1NzMzLDB4NTczOSwweDU3MkUsMHg1NzJGLDB4NTc1QywweDU3M0IsLyogMHhEOC0weERGICovCisJMHg1NzQyLDB4NTc2OSwweDU3ODUsMHg1NzZCLDB4NTc4NiwweDU3N0MsMHg1NzdCLDB4NTc2OCwvKiAweEUwLTB4RTcgKi8KKwkweDU3NkQsMHg1Nzc2LDB4NTc3MywweDU3QUQsMHg1N0E0LDB4NTc4QywweDU3QjIsMHg1N0NGLC8qIDB4RTgtMHhFRiAqLworCTB4NTdBNywweDU3QjQsMHg1NzkzLDB4NTdBMCwweDU3RDUsMHg1N0Q4LDB4NTdEQSwweDU3RDksLyogMHhGMC0weEY3ICovCisJMHg1N0QyLDB4NTdCOCwweDU3RjQsMHg1N0VGLDB4NTdGOCwweDU3RTQsMHg1N0RELDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EQ1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDhFNzMsMHg4RTc1LDB4OEU3NywweDhFNzgsMHg4RTc5LDB4OEU3QSwweDhFN0IsMHg4RTdELC8qIDB4NDAtMHg0NyAqLworCTB4OEU3RSwweDhFODAsMHg4RTgyLDB4OEU4MywweDhFODQsMHg4RTg2LDB4OEU4OCwweDhFODksLyogMHg0OC0weDRGICovCisJMHg4RThBLDB4OEU4QiwweDhFOEMsMHg4RThELDB4OEU4RSwweDhFOTEsMHg4RTkyLDB4OEU5MywvKiAweDUwLTB4NTcgKi8KKwkweDhFOTUsMHg4RTk2LDB4OEU5NywweDhFOTgsMHg4RTk5LDB4OEU5QSwweDhFOUIsMHg4RTlELC8qIDB4NTgtMHg1RiAqLworCTB4OEU5RiwweDhFQTAsMHg4RUExLDB4OEVBMiwweDhFQTMsMHg4RUE0LDB4OEVBNSwweDhFQTYsLyogMHg2MC0weDY3ICovCisJMHg4RUE3LDB4OEVBOCwweDhFQTksMHg4RUFBLDB4OEVBRCwweDhFQUUsMHg4RUIwLDB4OEVCMSwvKiAweDY4LTB4NkYgKi8KKwkweDhFQjMsMHg4RUI0LDB4OEVCNSwweDhFQjYsMHg4RUI3LDB4OEVCOCwweDhFQjksMHg4RUJCLC8qIDB4NzAtMHg3NyAqLworCTB4OEVCQywweDhFQkQsMHg4RUJFLDB4OEVCRiwweDhFQzAsMHg4RUMxLDB4OEVDMiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDhFQzMsMHg4RUM0LDB4OEVDNSwweDhFQzYsMHg4RUM3LDB4OEVDOCwweDhFQzksMHg4RUNBLC8qIDB4ODAtMHg4NyAqLworCTB4OEVDQiwweDhFQ0MsMHg4RUNELDB4OEVDRiwweDhFRDAsMHg4RUQxLDB4OEVEMiwweDhFRDMsLyogMHg4OC0weDhGICovCisJMHg4RUQ0LDB4OEVENSwweDhFRDYsMHg4RUQ3LDB4OEVEOCwweDhFRDksMHg4RURBLDB4OEVEQiwvKiAweDkwLTB4OTcgKi8KKwkweDhFREMsMHg4RURELDB4OEVERSwweDhFREYsMHg4RUUwLDB4OEVFMSwweDhFRTIsMHg4RUUzLC8qIDB4OTgtMHg5RiAqLworCTB4OEVFNCwweDU4MEIsMHg1ODBELDB4NTdGRCwweDU3RUQsMHg1ODAwLDB4NTgxRSwweDU4MTksLyogMHhBMC0weEE3ICovCisJMHg1ODQ0LDB4NTgyMCwweDU4NjUsMHg1ODZDLDB4NTg4MSwweDU4ODksMHg1ODlBLDB4NTg4MCwvKiAweEE4LTB4QUYgKi8KKwkweDk5QTgsMHg5RjE5LDB4NjFGRiwweDgyNzksMHg4MjdELDB4ODI3RiwweDgyOEYsMHg4MjhBLC8qIDB4QjAtMHhCNyAqLworCTB4ODJBOCwweDgyODQsMHg4MjhFLDB4ODI5MSwweDgyOTcsMHg4Mjk5LDB4ODJBQiwweDgyQjgsLyogMHhCOC0weEJGICovCisJMHg4MkJFLDB4ODJCMCwweDgyQzgsMHg4MkNBLDB4ODJFMywweDgyOTgsMHg4MkI3LDB4ODJBRSwvKiAweEMwLTB4QzcgKi8KKwkweDgyQ0IsMHg4MkNDLDB4ODJDMSwweDgyQTksMHg4MkI0LDB4ODJBMSwweDgyQUEsMHg4MjlGLC8qIDB4QzgtMHhDRiAqLworCTB4ODJDNCwweDgyQ0UsMHg4MkE0LDB4ODJFMSwweDgzMDksMHg4MkY3LDB4ODJFNCwweDgzMEYsLyogMHhEMC0weEQ3ICovCisJMHg4MzA3LDB4ODJEQywweDgyRjQsMHg4MkQyLDB4ODJEOCwweDgzMEMsMHg4MkZCLDB4ODJEMywvKiAweEQ4LTB4REYgKi8KKwkweDgzMTEsMHg4MzFBLDB4ODMwNiwweDgzMTQsMHg4MzE1LDB4ODJFMCwweDgyRDUsMHg4MzFDLC8qIDB4RTAtMHhFNyAqLworCTB4ODM1MSwweDgzNUIsMHg4MzVDLDB4ODMwOCwweDgzOTIsMHg4MzNDLDB4ODMzNCwweDgzMzEsLyogMHhFOC0weEVGICovCisJMHg4MzlCLDB4ODM1RSwweDgzMkYsMHg4MzRGLDB4ODM0NywweDgzNDMsMHg4MzVGLDB4ODM0MCwvKiAweEYwLTB4RjcgKi8KKwkweDgzMTcsMHg4MzYwLDB4ODMyRCwweDgzM0EsMHg4MzMzLDB4ODM2NiwweDgzNjUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0REWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OEVFNSwweDhFRTYsMHg4RUU3LDB4OEVFOCwweDhFRTksMHg4RUVBLDB4OEVFQiwweDhFRUMsLyogMHg0MC0weDQ3ICovCisJMHg4RUVELDB4OEVFRSwweDhFRUYsMHg4RUYwLDB4OEVGMSwweDhFRjIsMHg4RUYzLDB4OEVGNCwvKiAweDQ4LTB4NEYgKi8KKwkweDhFRjUsMHg4RUY2LDB4OEVGNywweDhFRjgsMHg4RUY5LDB4OEVGQSwweDhFRkIsMHg4RUZDLC8qIDB4NTAtMHg1NyAqLworCTB4OEVGRCwweDhFRkUsMHg4RUZGLDB4OEYwMCwweDhGMDEsMHg4RjAyLDB4OEYwMywweDhGMDQsLyogMHg1OC0weDVGICovCisJMHg4RjA1LDB4OEYwNiwweDhGMDcsMHg4RjA4LDB4OEYwOSwweDhGMEEsMHg4RjBCLDB4OEYwQywvKiAweDYwLTB4NjcgKi8KKwkweDhGMEQsMHg4RjBFLDB4OEYwRiwweDhGMTAsMHg4RjExLDB4OEYxMiwweDhGMTMsMHg4RjE0LC8qIDB4NjgtMHg2RiAqLworCTB4OEYxNSwweDhGMTYsMHg4RjE3LDB4OEYxOCwweDhGMTksMHg4RjFBLDB4OEYxQiwweDhGMUMsLyogMHg3MC0weDc3ICovCisJMHg4RjFELDB4OEYxRSwweDhGMUYsMHg4RjIwLDB4OEYyMSwweDhGMjIsMHg4RjIzLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OEYyNCwweDhGMjUsMHg4RjI2LDB4OEYyNywweDhGMjgsMHg4RjI5LDB4OEYyQSwweDhGMkIsLyogMHg4MC0weDg3ICovCisJMHg4RjJDLDB4OEYyRCwweDhGMkUsMHg4RjJGLDB4OEYzMCwweDhGMzEsMHg4RjMyLDB4OEYzMywvKiAweDg4LTB4OEYgKi8KKwkweDhGMzQsMHg4RjM1LDB4OEYzNiwweDhGMzcsMHg4RjM4LDB4OEYzOSwweDhGM0EsMHg4RjNCLC8qIDB4OTAtMHg5NyAqLworCTB4OEYzQywweDhGM0QsMHg4RjNFLDB4OEYzRiwweDhGNDAsMHg4RjQxLDB4OEY0MiwweDhGNDMsLyogMHg5OC0weDlGICovCisJMHg4RjQ0LDB4ODM2OCwweDgzMUIsMHg4MzY5LDB4ODM2QywweDgzNkEsMHg4MzZELDB4ODM2RSwvKiAweEEwLTB4QTcgKi8KKwkweDgzQjAsMHg4Mzc4LDB4ODNCMywweDgzQjQsMHg4M0EwLDB4ODNBQSwweDgzOTMsMHg4MzlDLC8qIDB4QTgtMHhBRiAqLworCTB4ODM4NSwweDgzN0MsMHg4M0I2LDB4ODNBOSwweDgzN0QsMHg4M0I4LDB4ODM3QiwweDgzOTgsLyogMHhCMC0weEI3ICovCisJMHg4MzlFLDB4ODNBOCwweDgzQkEsMHg4M0JDLDB4ODNDMSwweDg0MDEsMHg4M0U1LDB4ODNEOCwvKiAweEI4LTB4QkYgKi8KKwkweDU4MDcsMHg4NDE4LDB4ODQwQiwweDgzREQsMHg4M0ZELDB4ODNENiwweDg0MUMsMHg4NDM4LC8qIDB4QzAtMHhDNyAqLworCTB4ODQxMSwweDg0MDYsMHg4M0Q0LDB4ODNERiwweDg0MEYsMHg4NDAzLDB4ODNGOCwweDgzRjksLyogMHhDOC0weENGICovCisJMHg4M0VBLDB4ODNDNSwweDgzQzAsMHg4NDI2LDB4ODNGMCwweDgzRTEsMHg4NDVDLDB4ODQ1MSwvKiAweEQwLTB4RDcgKi8KKwkweDg0NUEsMHg4NDU5LDB4ODQ3MywweDg0ODcsMHg4NDg4LDB4ODQ3QSwweDg0ODksMHg4NDc4LC8qIDB4RDgtMHhERiAqLworCTB4ODQzQywweDg0NDYsMHg4NDY5LDB4ODQ3NiwweDg0OEMsMHg4NDhFLDB4ODQzMSwweDg0NkQsLyogMHhFMC0weEU3ICovCisJMHg4NEMxLDB4ODRDRCwweDg0RDAsMHg4NEU2LDB4ODRCRCwweDg0RDMsMHg4NENBLDB4ODRCRiwvKiAweEU4LTB4RUYgKi8KKwkweDg0QkEsMHg4NEUwLDB4ODRBMSwweDg0QjksMHg4NEI0LDB4ODQ5NywweDg0RTUsMHg4NEUzLC8qIDB4RjAtMHhGNyAqLworCTB4ODUwQywweDc1MEQsMHg4NTM4LDB4ODRGMCwweDg1MzksMHg4NTFGLDB4ODUzQSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfREVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4RjQ1LDB4OEY0NiwweDhGNDcsMHg4RjQ4LDB4OEY0OSwweDhGNEEsMHg4RjRCLDB4OEY0QywvKiAweDQwLTB4NDcgKi8KKwkweDhGNEQsMHg4RjRFLDB4OEY0RiwweDhGNTAsMHg4RjUxLDB4OEY1MiwweDhGNTMsMHg4RjU0LC8qIDB4NDgtMHg0RiAqLworCTB4OEY1NSwweDhGNTYsMHg4RjU3LDB4OEY1OCwweDhGNTksMHg4RjVBLDB4OEY1QiwweDhGNUMsLyogMHg1MC0weDU3ICovCisJMHg4RjVELDB4OEY1RSwweDhGNUYsMHg4RjYwLDB4OEY2MSwweDhGNjIsMHg4RjYzLDB4OEY2NCwvKiAweDU4LTB4NUYgKi8KKwkweDhGNjUsMHg4RjZBLDB4OEY4MCwweDhGOEMsMHg4RjkyLDB4OEY5RCwweDhGQTAsMHg4RkExLC8qIDB4NjAtMHg2NyAqLworCTB4OEZBMiwweDhGQTQsMHg4RkE1LDB4OEZBNiwweDhGQTcsMHg4RkFBLDB4OEZBQywweDhGQUQsLyogMHg2OC0weDZGICovCisJMHg4RkFFLDB4OEZBRiwweDhGQjIsMHg4RkIzLDB4OEZCNCwweDhGQjUsMHg4RkI3LDB4OEZCOCwvKiAweDcwLTB4NzcgKi8KKwkweDhGQkEsMHg4RkJCLDB4OEZCQywweDhGQkYsMHg4RkMwLDB4OEZDMywweDhGQzYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4RkM5LDB4OEZDQSwweDhGQ0IsMHg4RkNDLDB4OEZDRCwweDhGQ0YsMHg4RkQyLDB4OEZENiwvKiAweDgwLTB4ODcgKi8KKwkweDhGRDcsMHg4RkRBLDB4OEZFMCwweDhGRTEsMHg4RkUzLDB4OEZFNywweDhGRUMsMHg4RkVGLC8qIDB4ODgtMHg4RiAqLworCTB4OEZGMSwweDhGRjIsMHg4RkY0LDB4OEZGNSwweDhGRjYsMHg4RkZBLDB4OEZGQiwweDhGRkMsLyogMHg5MC0weDk3ICovCisJMHg4RkZFLDB4OEZGRiwweDkwMDcsMHg5MDA4LDB4OTAwQywweDkwMEUsMHg5MDEzLDB4OTAxNSwvKiAweDk4LTB4OUYgKi8KKwkweDkwMTgsMHg4NTU2LDB4ODUzQiwweDg0RkYsMHg4NEZDLDB4ODU1OSwweDg1NDgsMHg4NTY4LC8qIDB4QTAtMHhBNyAqLworCTB4ODU2NCwweDg1NUUsMHg4NTdBLDB4NzdBMiwweDg1NDMsMHg4NTcyLDB4ODU3QiwweDg1QTQsLyogMHhBOC0weEFGICovCisJMHg4NUE4LDB4ODU4NywweDg1OEYsMHg4NTc5LDB4ODVBRSwweDg1OUMsMHg4NTg1LDB4ODVCOSwvKiAweEIwLTB4QjcgKi8KKwkweDg1QjcsMHg4NUIwLDB4ODVEMywweDg1QzEsMHg4NURDLDB4ODVGRiwweDg2MjcsMHg4NjA1LC8qIDB4QjgtMHhCRiAqLworCTB4ODYyOSwweDg2MTYsMHg4NjNDLDB4NUVGRSwweDVGMDgsMHg1OTNDLDB4NTk0MSwweDgwMzcsLyogMHhDMC0weEM3ICovCisJMHg1OTU1LDB4NTk1QSwweDU5NTgsMHg1MzBGLDB4NUMyMiwweDVDMjUsMHg1QzJDLDB4NUMzNCwvKiAweEM4LTB4Q0YgKi8KKwkweDYyNEMsMHg2MjZBLDB4NjI5RiwweDYyQkIsMHg2MkNBLDB4NjJEQSwweDYyRDcsMHg2MkVFLC8qIDB4RDAtMHhENyAqLworCTB4NjMyMiwweDYyRjYsMHg2MzM5LDB4NjM0QiwweDYzNDMsMHg2M0FELDB4NjNGNiwweDYzNzEsLyogMHhEOC0weERGICovCisJMHg2MzdBLDB4NjM4RSwweDYzQjQsMHg2MzZELDB4NjNBQywweDYzOEEsMHg2MzY5LDB4NjNBRSwvKiAweEUwLTB4RTcgKi8KKwkweDYzQkMsMHg2M0YyLDB4NjNGOCwweDYzRTAsMHg2M0ZGLDB4NjNDNCwweDYzREUsMHg2M0NFLC8qIDB4RTgtMHhFRiAqLworCTB4NjQ1MiwweDYzQzYsMHg2M0JFLDB4NjQ0NSwweDY0NDEsMHg2NDBCLDB4NjQxQiwweDY0MjAsLyogMHhGMC0weEY3ICovCisJMHg2NDBDLDB4NjQyNiwweDY0MjEsMHg2NDVFLDB4NjQ4NCwweDY0NkQsMHg2NDk2LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9ERlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDkwMTksMHg5MDFDLDB4OTAyMywweDkwMjQsMHg5MDI1LDB4OTAyNywweDkwMjgsMHg5MDI5LC8qIDB4NDAtMHg0NyAqLworCTB4OTAyQSwweDkwMkIsMHg5MDJDLDB4OTAzMCwweDkwMzEsMHg5MDMyLDB4OTAzMywweDkwMzQsLyogMHg0OC0weDRGICovCisJMHg5MDM3LDB4OTAzOSwweDkwM0EsMHg5MDNELDB4OTAzRiwweDkwNDAsMHg5MDQzLDB4OTA0NSwvKiAweDUwLTB4NTcgKi8KKwkweDkwNDYsMHg5MDQ4LDB4OTA0OSwweDkwNEEsMHg5MDRCLDB4OTA0QywweDkwNEUsMHg5MDU0LC8qIDB4NTgtMHg1RiAqLworCTB4OTA1NSwweDkwNTYsMHg5MDU5LDB4OTA1QSwweDkwNUMsMHg5MDVELDB4OTA1RSwweDkwNUYsLyogMHg2MC0weDY3ICovCisJMHg5MDYwLDB4OTA2MSwweDkwNjQsMHg5MDY2LDB4OTA2NywweDkwNjksMHg5MDZBLDB4OTA2QiwvKiAweDY4LTB4NkYgKi8KKwkweDkwNkMsMHg5MDZGLDB4OTA3MCwweDkwNzEsMHg5MDcyLDB4OTA3MywweDkwNzYsMHg5MDc3LC8qIDB4NzAtMHg3NyAqLworCTB4OTA3OCwweDkwNzksMHg5MDdBLDB4OTA3QiwweDkwN0MsMHg5MDdFLDB4OTA4MSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDkwODQsMHg5MDg1LDB4OTA4NiwweDkwODcsMHg5MDg5LDB4OTA4QSwweDkwOEMsMHg5MDhELC8qIDB4ODAtMHg4NyAqLworCTB4OTA4RSwweDkwOEYsMHg5MDkwLDB4OTA5MiwweDkwOTQsMHg5MDk2LDB4OTA5OCwweDkwOUEsLyogMHg4OC0weDhGICovCisJMHg5MDlDLDB4OTA5RSwweDkwOUYsMHg5MEEwLDB4OTBBNCwweDkwQTUsMHg5MEE3LDB4OTBBOCwvKiAweDkwLTB4OTcgKi8KKwkweDkwQTksMHg5MEFCLDB4OTBBRCwweDkwQjIsMHg5MEI3LDB4OTBCQywweDkwQkQsMHg5MEJGLC8qIDB4OTgtMHg5RiAqLworCTB4OTBDMCwweDY0N0EsMHg2NEI3LDB4NjRCOCwweDY0OTksMHg2NEJBLDB4NjRDMCwweDY0RDAsLyogMHhBMC0weEE3ICovCisJMHg2NEQ3LDB4NjRFNCwweDY0RTIsMHg2NTA5LDB4NjUyNSwweDY1MkUsMHg1RjBCLDB4NUZEMiwvKiAweEE4LTB4QUYgKi8KKwkweDc1MTksMHg1RjExLDB4NTM1RiwweDUzRjEsMHg1M0ZELDB4NTNFOSwweDUzRTgsMHg1M0ZCLC8qIDB4QjAtMHhCNyAqLworCTB4NTQxMiwweDU0MTYsMHg1NDA2LDB4NTQ0QiwweDU0NTIsMHg1NDUzLDB4NTQ1NCwweDU0NTYsLyogMHhCOC0weEJGICovCisJMHg1NDQzLDB4NTQyMSwweDU0NTcsMHg1NDU5LDB4NTQyMywweDU0MzIsMHg1NDgyLDB4NTQ5NCwvKiAweEMwLTB4QzcgKi8KKwkweDU0NzcsMHg1NDcxLDB4NTQ2NCwweDU0OUEsMHg1NDlCLDB4NTQ4NCwweDU0NzYsMHg1NDY2LC8qIDB4QzgtMHhDRiAqLworCTB4NTQ5RCwweDU0RDAsMHg1NEFELDB4NTRDMiwweDU0QjQsMHg1NEQyLDB4NTRBNywweDU0QTYsLyogMHhEMC0weEQ3ICovCisJMHg1NEQzLDB4NTRENCwweDU0NzIsMHg1NEEzLDB4NTRENSwweDU0QkIsMHg1NEJGLDB4NTRDQywvKiAweEQ4LTB4REYgKi8KKwkweDU0RDksMHg1NERBLDB4NTREQywweDU0QTksMHg1NEFBLDB4NTRBNCwweDU0REQsMHg1NENGLC8qIDB4RTAtMHhFNyAqLworCTB4NTRERSwweDU1MUIsMHg1NEU3LDB4NTUyMCwweDU0RkQsMHg1NTE0LDB4NTRGMywweDU1MjIsLyogMHhFOC0weEVGICovCisJMHg1NTIzLDB4NTUwRiwweDU1MTEsMHg1NTI3LDB4NTUyQSwweDU1NjcsMHg1NThGLDB4NTVCNSwvKiAweEYwLTB4RjcgKi8KKwkweDU1NDksMHg1NTZELDB4NTU0MSwweDU1NTUsMHg1NTNGLDB4NTU1MCwweDU1M0MsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0UwWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTBDMiwweDkwQzMsMHg5MEM2LDB4OTBDOCwweDkwQzksMHg5MENCLDB4OTBDQywweDkwQ0QsLyogMHg0MC0weDQ3ICovCisJMHg5MEQyLDB4OTBENCwweDkwRDUsMHg5MEQ2LDB4OTBEOCwweDkwRDksMHg5MERBLDB4OTBERSwvKiAweDQ4LTB4NEYgKi8KKwkweDkwREYsMHg5MEUwLDB4OTBFMywweDkwRTQsMHg5MEU1LDB4OTBFOSwweDkwRUEsMHg5MEVDLC8qIDB4NTAtMHg1NyAqLworCTB4OTBFRSwweDkwRjAsMHg5MEYxLDB4OTBGMiwweDkwRjMsMHg5MEY1LDB4OTBGNiwweDkwRjcsLyogMHg1OC0weDVGICovCisJMHg5MEY5LDB4OTBGQSwweDkwRkIsMHg5MEZDLDB4OTBGRiwweDkxMDAsMHg5MTAxLDB4OTEwMywvKiAweDYwLTB4NjcgKi8KKwkweDkxMDUsMHg5MTA2LDB4OTEwNywweDkxMDgsMHg5MTA5LDB4OTEwQSwweDkxMEIsMHg5MTBDLC8qIDB4NjgtMHg2RiAqLworCTB4OTEwRCwweDkxMEUsMHg5MTBGLDB4OTExMCwweDkxMTEsMHg5MTEyLDB4OTExMywweDkxMTQsLyogMHg3MC0weDc3ICovCisJMHg5MTE1LDB4OTExNiwweDkxMTcsMHg5MTE4LDB4OTExQSwweDkxMUIsMHg5MTFDLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OTExRCwweDkxMUYsMHg5MTIwLDB4OTEyMSwweDkxMjQsMHg5MTI1LDB4OTEyNiwweDkxMjcsLyogMHg4MC0weDg3ICovCisJMHg5MTI4LDB4OTEyOSwweDkxMkEsMHg5MTJCLDB4OTEyQywweDkxMkQsMHg5MTJFLDB4OTEzMCwvKiAweDg4LTB4OEYgKi8KKwkweDkxMzIsMHg5MTMzLDB4OTEzNCwweDkxMzUsMHg5MTM2LDB4OTEzNywweDkxMzgsMHg5MTNBLC8qIDB4OTAtMHg5NyAqLworCTB4OTEzQiwweDkxM0MsMHg5MTNELDB4OTEzRSwweDkxM0YsMHg5MTQwLDB4OTE0MSwweDkxNDIsLyogMHg5OC0weDlGICovCisJMHg5MTQ0LDB4NTUzNywweDU1NTYsMHg1NTc1LDB4NTU3NiwweDU1NzcsMHg1NTMzLDB4NTUzMCwvKiAweEEwLTB4QTcgKi8KKwkweDU1NUMsMHg1NThCLDB4NTVEMiwweDU1ODMsMHg1NUIxLDB4NTVCOSwweDU1ODgsMHg1NTgxLC8qIDB4QTgtMHhBRiAqLworCTB4NTU5RiwweDU1N0UsMHg1NUQ2LDB4NTU5MSwweDU1N0IsMHg1NURGLDB4NTVCRCwweDU1QkUsLyogMHhCMC0weEI3ICovCisJMHg1NTk0LDB4NTU5OSwweDU1RUEsMHg1NUY3LDB4NTVDOSwweDU2MUYsMHg1NUQxLDB4NTVFQiwvKiAweEI4LTB4QkYgKi8KKwkweDU1RUMsMHg1NUQ0LDB4NTVFNiwweDU1REQsMHg1NUM0LDB4NTVFRiwweDU1RTUsMHg1NUYyLC8qIDB4QzAtMHhDNyAqLworCTB4NTVGMywweDU1Q0MsMHg1NUNELDB4NTVFOCwweDU1RjUsMHg1NUU0LDB4OEY5NCwweDU2MUUsLyogMHhDOC0weENGICovCisJMHg1NjA4LDB4NTYwQywweDU2MDEsMHg1NjI0LDB4NTYyMywweDU1RkUsMHg1NjAwLDB4NTYyNywvKiAweEQwLTB4RDcgKi8KKwkweDU2MkQsMHg1NjU4LDB4NTYzOSwweDU2NTcsMHg1NjJDLDB4NTY0RCwweDU2NjIsMHg1NjU5LC8qIDB4RDgtMHhERiAqLworCTB4NTY1QywweDU2NEMsMHg1NjU0LDB4NTY4NiwweDU2NjQsMHg1NjcxLDB4NTY2QiwweDU2N0IsLyogMHhFMC0weEU3ICovCisJMHg1NjdDLDB4NTY4NSwweDU2OTMsMHg1NkFGLDB4NTZENCwweDU2RDcsMHg1NkRELDB4NTZFMSwvKiAweEU4LTB4RUYgKi8KKwkweDU2RjUsMHg1NkVCLDB4NTZGOSwweDU2RkYsMHg1NzA0LDB4NTcwQSwweDU3MDksMHg1NzFDLC8qIDB4RjAtMHhGNyAqLworCTB4NUUwRiwweDVFMTksMHg1RTE0LDB4NUUxMSwweDVFMzEsMHg1RTNCLDB4NUUzQywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5MTQ1LDB4OTE0NywweDkxNDgsMHg5MTUxLDB4OTE1MywweDkxNTQsMHg5MTU1LDB4OTE1NiwvKiAweDQwLTB4NDcgKi8KKwkweDkxNTgsMHg5MTU5LDB4OTE1QiwweDkxNUMsMHg5MTVGLDB4OTE2MCwweDkxNjYsMHg5MTY3LC8qIDB4NDgtMHg0RiAqLworCTB4OTE2OCwweDkxNkIsMHg5MTZELDB4OTE3MywweDkxN0EsMHg5MTdCLDB4OTE3QywweDkxODAsLyogMHg1MC0weDU3ICovCisJMHg5MTgxLDB4OTE4MiwweDkxODMsMHg5MTg0LDB4OTE4NiwweDkxODgsMHg5MThBLDB4OTE4RSwvKiAweDU4LTB4NUYgKi8KKwkweDkxOEYsMHg5MTkzLDB4OTE5NCwweDkxOTUsMHg5MTk2LDB4OTE5NywweDkxOTgsMHg5MTk5LC8qIDB4NjAtMHg2NyAqLworCTB4OTE5QywweDkxOUQsMHg5MTlFLDB4OTE5RiwweDkxQTAsMHg5MUExLDB4OTFBNCwweDkxQTUsLyogMHg2OC0weDZGICovCisJMHg5MUE2LDB4OTFBNywweDkxQTgsMHg5MUE5LDB4OTFBQiwweDkxQUMsMHg5MUIwLDB4OTFCMSwvKiAweDcwLTB4NzcgKi8KKwkweDkxQjIsMHg5MUIzLDB4OTFCNiwweDkxQjcsMHg5MUI4LDB4OTFCOSwweDkxQkIsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5MUJDLDB4OTFCRCwweDkxQkUsMHg5MUJGLDB4OTFDMCwweDkxQzEsMHg5MUMyLDB4OTFDMywvKiAweDgwLTB4ODcgKi8KKwkweDkxQzQsMHg5MUM1LDB4OTFDNiwweDkxQzgsMHg5MUNCLDB4OTFEMCwweDkxRDIsMHg5MUQzLC8qIDB4ODgtMHg4RiAqLworCTB4OTFENCwweDkxRDUsMHg5MUQ2LDB4OTFENywweDkxRDgsMHg5MUQ5LDB4OTFEQSwweDkxREIsLyogMHg5MC0weDk3ICovCisJMHg5MURELDB4OTFERSwweDkxREYsMHg5MUUwLDB4OTFFMSwweDkxRTIsMHg5MUUzLDB4OTFFNCwvKiAweDk4LTB4OUYgKi8KKwkweDkxRTUsMHg1RTM3LDB4NUU0NCwweDVFNTQsMHg1RTVCLDB4NUU1RSwweDVFNjEsMHg1QzhDLC8qIDB4QTAtMHhBNyAqLworCTB4NUM3QSwweDVDOEQsMHg1QzkwLDB4NUM5NiwweDVDODgsMHg1Qzk4LDB4NUM5OSwweDVDOTEsLyogMHhBOC0weEFGICovCisJMHg1QzlBLDB4NUM5QywweDVDQjUsMHg1Q0EyLDB4NUNCRCwweDVDQUMsMHg1Q0FCLDB4NUNCMSwvKiAweEIwLTB4QjcgKi8KKwkweDVDQTMsMHg1Q0MxLDB4NUNCNywweDVDQzQsMHg1Q0QyLDB4NUNFNCwweDVDQ0IsMHg1Q0U1LC8qIDB4QjgtMHhCRiAqLworCTB4NUQwMiwweDVEMDMsMHg1RDI3LDB4NUQyNiwweDVEMkUsMHg1RDI0LDB4NUQxRSwweDVEMDYsLyogMHhDMC0weEM3ICovCisJMHg1RDFCLDB4NUQ1OCwweDVEM0UsMHg1RDM0LDB4NUQzRCwweDVENkMsMHg1RDVCLDB4NUQ2RiwvKiAweEM4LTB4Q0YgKi8KKwkweDVENUQsMHg1RDZCLDB4NUQ0QiwweDVENEEsMHg1RDY5LDB4NUQ3NCwweDVEODIsMHg1RDk5LC8qIDB4RDAtMHhENyAqLworCTB4NUQ5RCwweDhDNzMsMHg1REI3LDB4NURDNSwweDVGNzMsMHg1Rjc3LDB4NUY4MiwweDVGODcsLyogMHhEOC0weERGICovCisJMHg1Rjg5LDB4NUY4QywweDVGOTUsMHg1Rjk5LDB4NUY5QywweDVGQTgsMHg1RkFELDB4NUZCNSwvKiAweEUwLTB4RTcgKi8KKwkweDVGQkMsMHg4ODYyLDB4NUY2MSwweDcyQUQsMHg3MkIwLDB4NzJCNCwweDcyQjcsMHg3MkI4LC8qIDB4RTgtMHhFRiAqLworCTB4NzJDMywweDcyQzEsMHg3MkNFLDB4NzJDRCwweDcyRDIsMHg3MkU4LDB4NzJFRiwweDcyRTksLyogMHhGMC0weEY3ICovCisJMHg3MkYyLDB4NzJGNCwweDcyRjcsMHg3MzAxLDB4NzJGMywweDczMDMsMHg3MkZBLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FMlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDkxRTYsMHg5MUU3LDB4OTFFOCwweDkxRTksMHg5MUVBLDB4OTFFQiwweDkxRUMsMHg5MUVELC8qIDB4NDAtMHg0NyAqLworCTB4OTFFRSwweDkxRUYsMHg5MUYwLDB4OTFGMSwweDkxRjIsMHg5MUYzLDB4OTFGNCwweDkxRjUsLyogMHg0OC0weDRGICovCisJMHg5MUY2LDB4OTFGNywweDkxRjgsMHg5MUY5LDB4OTFGQSwweDkxRkIsMHg5MUZDLDB4OTFGRCwvKiAweDUwLTB4NTcgKi8KKwkweDkxRkUsMHg5MUZGLDB4OTIwMCwweDkyMDEsMHg5MjAyLDB4OTIwMywweDkyMDQsMHg5MjA1LC8qIDB4NTgtMHg1RiAqLworCTB4OTIwNiwweDkyMDcsMHg5MjA4LDB4OTIwOSwweDkyMEEsMHg5MjBCLDB4OTIwQywweDkyMEQsLyogMHg2MC0weDY3ICovCisJMHg5MjBFLDB4OTIwRiwweDkyMTAsMHg5MjExLDB4OTIxMiwweDkyMTMsMHg5MjE0LDB4OTIxNSwvKiAweDY4LTB4NkYgKi8KKwkweDkyMTYsMHg5MjE3LDB4OTIxOCwweDkyMTksMHg5MjFBLDB4OTIxQiwweDkyMUMsMHg5MjFELC8qIDB4NzAtMHg3NyAqLworCTB4OTIxRSwweDkyMUYsMHg5MjIwLDB4OTIyMSwweDkyMjIsMHg5MjIzLDB4OTIyNCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDkyMjUsMHg5MjI2LDB4OTIyNywweDkyMjgsMHg5MjI5LDB4OTIyQSwweDkyMkIsMHg5MjJDLC8qIDB4ODAtMHg4NyAqLworCTB4OTIyRCwweDkyMkUsMHg5MjJGLDB4OTIzMCwweDkyMzEsMHg5MjMyLDB4OTIzMywweDkyMzQsLyogMHg4OC0weDhGICovCisJMHg5MjM1LDB4OTIzNiwweDkyMzcsMHg5MjM4LDB4OTIzOSwweDkyM0EsMHg5MjNCLDB4OTIzQywvKiAweDkwLTB4OTcgKi8KKwkweDkyM0QsMHg5MjNFLDB4OTIzRiwweDkyNDAsMHg5MjQxLDB4OTI0MiwweDkyNDMsMHg5MjQ0LC8qIDB4OTgtMHg5RiAqLworCTB4OTI0NSwweDcyRkIsMHg3MzE3LDB4NzMxMywweDczMjEsMHg3MzBBLDB4NzMxRSwweDczMUQsLyogMHhBMC0weEE3ICovCisJMHg3MzE1LDB4NzMyMiwweDczMzksMHg3MzI1LDB4NzMyQywweDczMzgsMHg3MzMxLDB4NzM1MCwvKiAweEE4LTB4QUYgKi8KKwkweDczNEQsMHg3MzU3LDB4NzM2MCwweDczNkMsMHg3MzZGLDB4NzM3RSwweDgyMUIsMHg1OTI1LC8qIDB4QjAtMHhCNyAqLworCTB4OThFNywweDU5MjQsMHg1OTAyLDB4OTk2MywweDk5NjcsMHg5OTY4LDB4OTk2OSwweDk5NkEsLyogMHhCOC0weEJGICovCisJMHg5OTZCLDB4OTk2QywweDk5NzQsMHg5OTc3LDB4OTk3RCwweDk5ODAsMHg5OTg0LDB4OTk4NywvKiAweEMwLTB4QzcgKi8KKwkweDk5OEEsMHg5OThELDB4OTk5MCwweDk5OTEsMHg5OTkzLDB4OTk5NCwweDk5OTUsMHg1RTgwLC8qIDB4QzgtMHhDRiAqLworCTB4NUU5MSwweDVFOEIsMHg1RTk2LDB4NUVBNSwweDVFQTAsMHg1RUI5LDB4NUVCNSwweDVFQkUsLyogMHhEMC0weEQ3ICovCisJMHg1RUIzLDB4OEQ1MywweDVFRDIsMHg1RUQxLDB4NUVEQiwweDVFRTgsMHg1RUVBLDB4ODFCQSwvKiAweEQ4LTB4REYgKi8KKwkweDVGQzQsMHg1RkM5LDB4NUZENiwweDVGQ0YsMHg2MDAzLDB4NUZFRSwweDYwMDQsMHg1RkUxLC8qIDB4RTAtMHhFNyAqLworCTB4NUZFNCwweDVGRkUsMHg2MDA1LDB4NjAwNiwweDVGRUEsMHg1RkVELDB4NUZGOCwweDYwMTksLyogMHhFOC0weEVGICovCisJMHg2MDM1LDB4NjAyNiwweDYwMUIsMHg2MDBGLDB4NjAwRCwweDYwMjksMHg2MDJCLDB4NjAwQSwvKiAweEYwLTB4RjcgKi8KKwkweDYwM0YsMHg2MDIxLDB4NjA3OCwweDYwNzksMHg2MDdCLDB4NjA3QSwweDYwNDIsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0UzWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTI0NiwweDkyNDcsMHg5MjQ4LDB4OTI0OSwweDkyNEEsMHg5MjRCLDB4OTI0QywweDkyNEQsLyogMHg0MC0weDQ3ICovCisJMHg5MjRFLDB4OTI0RiwweDkyNTAsMHg5MjUxLDB4OTI1MiwweDkyNTMsMHg5MjU0LDB4OTI1NSwvKiAweDQ4LTB4NEYgKi8KKwkweDkyNTYsMHg5MjU3LDB4OTI1OCwweDkyNTksMHg5MjVBLDB4OTI1QiwweDkyNUMsMHg5MjVELC8qIDB4NTAtMHg1NyAqLworCTB4OTI1RSwweDkyNUYsMHg5MjYwLDB4OTI2MSwweDkyNjIsMHg5MjYzLDB4OTI2NCwweDkyNjUsLyogMHg1OC0weDVGICovCisJMHg5MjY2LDB4OTI2NywweDkyNjgsMHg5MjY5LDB4OTI2QSwweDkyNkIsMHg5MjZDLDB4OTI2RCwvKiAweDYwLTB4NjcgKi8KKwkweDkyNkUsMHg5MjZGLDB4OTI3MCwweDkyNzEsMHg5MjcyLDB4OTI3MywweDkyNzUsMHg5Mjc2LC8qIDB4NjgtMHg2RiAqLworCTB4OTI3NywweDkyNzgsMHg5Mjc5LDB4OTI3QSwweDkyN0IsMHg5MjdDLDB4OTI3RCwweDkyN0UsLyogMHg3MC0weDc3ICovCisJMHg5MjdGLDB4OTI4MCwweDkyODEsMHg5MjgyLDB4OTI4MywweDkyODQsMHg5Mjg1LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OTI4NiwweDkyODcsMHg5Mjg4LDB4OTI4OSwweDkyOEEsMHg5MjhCLDB4OTI4QywweDkyOEQsLyogMHg4MC0weDg3ICovCisJMHg5MjhGLDB4OTI5MCwweDkyOTEsMHg5MjkyLDB4OTI5MywweDkyOTQsMHg5Mjk1LDB4OTI5NiwvKiAweDg4LTB4OEYgKi8KKwkweDkyOTcsMHg5Mjk4LDB4OTI5OSwweDkyOUEsMHg5MjlCLDB4OTI5QywweDkyOUQsMHg5MjlFLC8qIDB4OTAtMHg5NyAqLworCTB4OTI5RiwweDkyQTAsMHg5MkExLDB4OTJBMiwweDkyQTMsMHg5MkE0LDB4OTJBNSwweDkyQTYsLyogMHg5OC0weDlGICovCisJMHg5MkE3LDB4NjA2QSwweDYwN0QsMHg2MDk2LDB4NjA5QSwweDYwQUQsMHg2MDlELDB4NjA4MywvKiAweEEwLTB4QTcgKi8KKwkweDYwOTIsMHg2MDhDLDB4NjA5QiwweDYwRUMsMHg2MEJCLDB4NjBCMSwweDYwREQsMHg2MEQ4LC8qIDB4QTgtMHhBRiAqLworCTB4NjBDNiwweDYwREEsMHg2MEI0LDB4NjEyMCwweDYxMjYsMHg2MTE1LDB4NjEyMywweDYwRjQsLyogMHhCMC0weEI3ICovCisJMHg2MTAwLDB4NjEwRSwweDYxMkIsMHg2MTRBLDB4NjE3NSwweDYxQUMsMHg2MTk0LDB4NjFBNywvKiAweEI4LTB4QkYgKi8KKwkweDYxQjcsMHg2MUQ0LDB4NjFGNSwweDVGREQsMHg5NkIzLDB4OTVFOSwweDk1RUIsMHg5NUYxLC8qIDB4QzAtMHhDNyAqLworCTB4OTVGMywweDk1RjUsMHg5NUY2LDB4OTVGQywweDk1RkUsMHg5NjAzLDB4OTYwNCwweDk2MDYsLyogMHhDOC0weENGICovCisJMHg5NjA4LDB4OTYwQSwweDk2MEIsMHg5NjBDLDB4OTYwRCwweDk2MEYsMHg5NjEyLDB4OTYxNSwvKiAweEQwLTB4RDcgKi8KKwkweDk2MTYsMHg5NjE3LDB4OTYxOSwweDk2MUEsMHg0RTJDLDB4NzIzRiwweDYyMTUsMHg2QzM1LC8qIDB4RDgtMHhERiAqLworCTB4NkM1NCwweDZDNUMsMHg2QzRBLDB4NkNBMywweDZDODUsMHg2QzkwLDB4NkM5NCwweDZDOEMsLyogMHhFMC0weEU3ICovCisJMHg2QzY4LDB4NkM2OSwweDZDNzQsMHg2Qzc2LDB4NkM4NiwweDZDQTksMHg2Q0QwLDB4NkNENCwvKiAweEU4LTB4RUYgKi8KKwkweDZDQUQsMHg2Q0Y3LDB4NkNGOCwweDZDRjEsMHg2Q0Q3LDB4NkNCMiwweDZDRTAsMHg2Q0Q2LC8qIDB4RjAtMHhGNyAqLworCTB4NkNGQSwweDZDRUIsMHg2Q0VFLDB4NkNCMSwweDZDRDMsMHg2Q0VGLDB4NkNGRSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5MkE4LDB4OTJBOSwweDkyQUEsMHg5MkFCLDB4OTJBQywweDkyQUQsMHg5MkFGLDB4OTJCMCwvKiAweDQwLTB4NDcgKi8KKwkweDkyQjEsMHg5MkIyLDB4OTJCMywweDkyQjQsMHg5MkI1LDB4OTJCNiwweDkyQjcsMHg5MkI4LC8qIDB4NDgtMHg0RiAqLworCTB4OTJCOSwweDkyQkEsMHg5MkJCLDB4OTJCQywweDkyQkQsMHg5MkJFLDB4OTJCRiwweDkyQzAsLyogMHg1MC0weDU3ICovCisJMHg5MkMxLDB4OTJDMiwweDkyQzMsMHg5MkM0LDB4OTJDNSwweDkyQzYsMHg5MkM3LDB4OTJDOSwvKiAweDU4LTB4NUYgKi8KKwkweDkyQ0EsMHg5MkNCLDB4OTJDQywweDkyQ0QsMHg5MkNFLDB4OTJDRiwweDkyRDAsMHg5MkQxLC8qIDB4NjAtMHg2NyAqLworCTB4OTJEMiwweDkyRDMsMHg5MkQ0LDB4OTJENSwweDkyRDYsMHg5MkQ3LDB4OTJEOCwweDkyRDksLyogMHg2OC0weDZGICovCisJMHg5MkRBLDB4OTJEQiwweDkyREMsMHg5MkRELDB4OTJERSwweDkyREYsMHg5MkUwLDB4OTJFMSwvKiAweDcwLTB4NzcgKi8KKwkweDkyRTIsMHg5MkUzLDB4OTJFNCwweDkyRTUsMHg5MkU2LDB4OTJFNywweDkyRTgsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5MkU5LDB4OTJFQSwweDkyRUIsMHg5MkVDLDB4OTJFRCwweDkyRUUsMHg5MkVGLDB4OTJGMCwvKiAweDgwLTB4ODcgKi8KKwkweDkyRjEsMHg5MkYyLDB4OTJGMywweDkyRjQsMHg5MkY1LDB4OTJGNiwweDkyRjcsMHg5MkY4LC8qIDB4ODgtMHg4RiAqLworCTB4OTJGOSwweDkyRkEsMHg5MkZCLDB4OTJGQywweDkyRkQsMHg5MkZFLDB4OTJGRiwweDkzMDAsLyogMHg5MC0weDk3ICovCisJMHg5MzAxLDB4OTMwMiwweDkzMDMsMHg5MzA0LDB4OTMwNSwweDkzMDYsMHg5MzA3LDB4OTMwOCwvKiAweDk4LTB4OUYgKi8KKwkweDkzMDksMHg2RDM5LDB4NkQyNywweDZEMEMsMHg2RDQzLDB4NkQ0OCwweDZEMDcsMHg2RDA0LC8qIDB4QTAtMHhBNyAqLworCTB4NkQxOSwweDZEMEUsMHg2RDJCLDB4NkQ0RCwweDZEMkUsMHg2RDM1LDB4NkQxQSwweDZENEYsLyogMHhBOC0weEFGICovCisJMHg2RDUyLDB4NkQ1NCwweDZEMzMsMHg2RDkxLDB4NkQ2RiwweDZEOUUsMHg2REEwLDB4NkQ1RSwvKiAweEIwLTB4QjcgKi8KKwkweDZEOTMsMHg2RDk0LDB4NkQ1QywweDZENjAsMHg2RDdDLDB4NkQ2MywweDZFMUEsMHg2REM3LC8qIDB4QjgtMHhCRiAqLworCTB4NkRDNSwweDZEREUsMHg2RTBFLDB4NkRCRiwweDZERTAsMHg2RTExLDB4NkRFNiwweDZEREQsLyogMHhDMC0weEM3ICovCisJMHg2REQ5LDB4NkUxNiwweDZEQUIsMHg2RTBDLDB4NkRBRSwweDZFMkIsMHg2RTZFLDB4NkU0RSwvKiAweEM4LTB4Q0YgKi8KKwkweDZFNkIsMHg2RUIyLDB4NkU1RiwweDZFODYsMHg2RTUzLDB4NkU1NCwweDZFMzIsMHg2RTI1LC8qIDB4RDAtMHhENyAqLworCTB4NkU0NCwweDZFREYsMHg2RUIxLDB4NkU5OCwweDZFRTAsMHg2RjJELDB4NkVFMiwweDZFQTUsLyogMHhEOC0weERGICovCisJMHg2RUE3LDB4NkVCRCwweDZFQkIsMHg2RUI3LDB4NkVENywweDZFQjQsMHg2RUNGLDB4NkU4RiwvKiAweEUwLTB4RTcgKi8KKwkweDZFQzIsMHg2RTlGLDB4NkY2MiwweDZGNDYsMHg2RjQ3LDB4NkYyNCwweDZGMTUsMHg2RUY5LC8qIDB4RTgtMHhFRiAqLworCTB4NkYyRiwweDZGMzYsMHg2RjRCLDB4NkY3NCwweDZGMkEsMHg2RjA5LDB4NkYyOSwweDZGODksLyogMHhGMC0weEY3ICovCisJMHg2RjhELDB4NkY4QywweDZGNzgsMHg2RjcyLDB4NkY3QywweDZGN0EsMHg2RkQxLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FNVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDkzMEEsMHg5MzBCLDB4OTMwQywweDkzMEQsMHg5MzBFLDB4OTMwRiwweDkzMTAsMHg5MzExLC8qIDB4NDAtMHg0NyAqLworCTB4OTMxMiwweDkzMTMsMHg5MzE0LDB4OTMxNSwweDkzMTYsMHg5MzE3LDB4OTMxOCwweDkzMTksLyogMHg0OC0weDRGICovCisJMHg5MzFBLDB4OTMxQiwweDkzMUMsMHg5MzFELDB4OTMxRSwweDkzMUYsMHg5MzIwLDB4OTMyMSwvKiAweDUwLTB4NTcgKi8KKwkweDkzMjIsMHg5MzIzLDB4OTMyNCwweDkzMjUsMHg5MzI2LDB4OTMyNywweDkzMjgsMHg5MzI5LC8qIDB4NTgtMHg1RiAqLworCTB4OTMyQSwweDkzMkIsMHg5MzJDLDB4OTMyRCwweDkzMkUsMHg5MzJGLDB4OTMzMCwweDkzMzEsLyogMHg2MC0weDY3ICovCisJMHg5MzMyLDB4OTMzMywweDkzMzQsMHg5MzM1LDB4OTMzNiwweDkzMzcsMHg5MzM4LDB4OTMzOSwvKiAweDY4LTB4NkYgKi8KKwkweDkzM0EsMHg5MzNCLDB4OTMzQywweDkzM0QsMHg5MzNGLDB4OTM0MCwweDkzNDEsMHg5MzQyLC8qIDB4NzAtMHg3NyAqLworCTB4OTM0MywweDkzNDQsMHg5MzQ1LDB4OTM0NiwweDkzNDcsMHg5MzQ4LDB4OTM0OSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDkzNEEsMHg5MzRCLDB4OTM0QywweDkzNEQsMHg5MzRFLDB4OTM0RiwweDkzNTAsMHg5MzUxLC8qIDB4ODAtMHg4NyAqLworCTB4OTM1MiwweDkzNTMsMHg5MzU0LDB4OTM1NSwweDkzNTYsMHg5MzU3LDB4OTM1OCwweDkzNTksLyogMHg4OC0weDhGICovCisJMHg5MzVBLDB4OTM1QiwweDkzNUMsMHg5MzVELDB4OTM1RSwweDkzNUYsMHg5MzYwLDB4OTM2MSwvKiAweDkwLTB4OTcgKi8KKwkweDkzNjIsMHg5MzYzLDB4OTM2NCwweDkzNjUsMHg5MzY2LDB4OTM2NywweDkzNjgsMHg5MzY5LC8qIDB4OTgtMHg5RiAqLworCTB4OTM2QiwweDZGQzksMHg2RkE3LDB4NkZCOSwweDZGQjYsMHg2RkMyLDB4NkZFMSwweDZGRUUsLyogMHhBMC0weEE3ICovCisJMHg2RkRFLDB4NkZFMCwweDZGRUYsMHg3MDFBLDB4NzAyMywweDcwMUIsMHg3MDM5LDB4NzAzNSwvKiAweEE4LTB4QUYgKi8KKwkweDcwNEYsMHg3MDVFLDB4NUI4MCwweDVCODQsMHg1Qjk1LDB4NUI5MywweDVCQTUsMHg1QkI4LC8qIDB4QjAtMHhCNyAqLworCTB4NzUyRiwweDlBOUUsMHg2NDM0LDB4NUJFNCwweDVCRUUsMHg4OTMwLDB4NUJGMCwweDhFNDcsLyogMHhCOC0weEJGICovCisJMHg4QjA3LDB4OEZCNiwweDhGRDMsMHg4RkQ1LDB4OEZFNSwweDhGRUUsMHg4RkU0LDB4OEZFOSwvKiAweEMwLTB4QzcgKi8KKwkweDhGRTYsMHg4RkYzLDB4OEZFOCwweDkwMDUsMHg5MDA0LDB4OTAwQiwweDkwMjYsMHg5MDExLC8qIDB4QzgtMHhDRiAqLworCTB4OTAwRCwweDkwMTYsMHg5MDIxLDB4OTAzNSwweDkwMzYsMHg5MDJELDB4OTAyRiwweDkwNDQsLyogMHhEMC0weEQ3ICovCisJMHg5MDUxLDB4OTA1MiwweDkwNTAsMHg5MDY4LDB4OTA1OCwweDkwNjIsMHg5MDVCLDB4NjZCOSwvKiAweEQ4LTB4REYgKi8KKwkweDkwNzQsMHg5MDdELDB4OTA4MiwweDkwODgsMHg5MDgzLDB4OTA4QiwweDVGNTAsMHg1RjU3LC8qIDB4RTAtMHhFNyAqLworCTB4NUY1NiwweDVGNTgsMHg1QzNCLDB4NTRBQiwweDVDNTAsMHg1QzU5LDB4NUI3MSwweDVDNjMsLyogMHhFOC0weEVGICovCisJMHg1QzY2LDB4N0ZCQywweDVGMkEsMHg1RjI5LDB4NUYyRCwweDgyNzQsMHg1RjNDLDB4OUIzQiwvKiAweEYwLTB4RjcgKi8KKwkweDVDNkUsMHg1OTgxLDB4NTk4MywweDU5OEQsMHg1OUE5LDB4NTlBQSwweDU5QTMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0U2WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTM2QywweDkzNkQsMHg5MzZFLDB4OTM2RiwweDkzNzAsMHg5MzcxLDB4OTM3MiwweDkzNzMsLyogMHg0MC0weDQ3ICovCisJMHg5Mzc0LDB4OTM3NSwweDkzNzYsMHg5Mzc3LDB4OTM3OCwweDkzNzksMHg5MzdBLDB4OTM3QiwvKiAweDQ4LTB4NEYgKi8KKwkweDkzN0MsMHg5MzdELDB4OTM3RSwweDkzN0YsMHg5MzgwLDB4OTM4MSwweDkzODIsMHg5MzgzLC8qIDB4NTAtMHg1NyAqLworCTB4OTM4NCwweDkzODUsMHg5Mzg2LDB4OTM4NywweDkzODgsMHg5Mzg5LDB4OTM4QSwweDkzOEIsLyogMHg1OC0weDVGICovCisJMHg5MzhDLDB4OTM4RCwweDkzOEUsMHg5MzkwLDB4OTM5MSwweDkzOTIsMHg5MzkzLDB4OTM5NCwvKiAweDYwLTB4NjcgKi8KKwkweDkzOTUsMHg5Mzk2LDB4OTM5NywweDkzOTgsMHg5Mzk5LDB4OTM5QSwweDkzOUIsMHg5MzlDLC8qIDB4NjgtMHg2RiAqLworCTB4OTM5RCwweDkzOUUsMHg5MzlGLDB4OTNBMCwweDkzQTEsMHg5M0EyLDB4OTNBMywweDkzQTQsLyogMHg3MC0weDc3ICovCisJMHg5M0E1LDB4OTNBNiwweDkzQTcsMHg5M0E4LDB4OTNBOSwweDkzQUEsMHg5M0FCLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OTNBQywweDkzQUQsMHg5M0FFLDB4OTNBRiwweDkzQjAsMHg5M0IxLDB4OTNCMiwweDkzQjMsLyogMHg4MC0weDg3ICovCisJMHg5M0I0LDB4OTNCNSwweDkzQjYsMHg5M0I3LDB4OTNCOCwweDkzQjksMHg5M0JBLDB4OTNCQiwvKiAweDg4LTB4OEYgKi8KKwkweDkzQkMsMHg5M0JELDB4OTNCRSwweDkzQkYsMHg5M0MwLDB4OTNDMSwweDkzQzIsMHg5M0MzLC8qIDB4OTAtMHg5NyAqLworCTB4OTNDNCwweDkzQzUsMHg5M0M2LDB4OTNDNywweDkzQzgsMHg5M0M5LDB4OTNDQiwweDkzQ0MsLyogMHg5OC0weDlGICovCisJMHg5M0NELDB4NTk5NywweDU5Q0EsMHg1OUFCLDB4NTk5RSwweDU5QTQsMHg1OUQyLDB4NTlCMiwvKiAweEEwLTB4QTcgKi8KKwkweDU5QUYsMHg1OUQ3LDB4NTlCRSwweDVBMDUsMHg1QTA2LDB4NTlERCwweDVBMDgsMHg1OUUzLC8qIDB4QTgtMHhBRiAqLworCTB4NTlEOCwweDU5RjksMHg1QTBDLDB4NUEwOSwweDVBMzIsMHg1QTM0LDB4NUExMSwweDVBMjMsLyogMHhCMC0weEI3ICovCisJMHg1QTEzLDB4NUE0MCwweDVBNjcsMHg1QTRBLDB4NUE1NSwweDVBM0MsMHg1QTYyLDB4NUE3NSwvKiAweEI4LTB4QkYgKi8KKwkweDgwRUMsMHg1QUFBLDB4NUE5QiwweDVBNzcsMHg1QTdBLDB4NUFCRSwweDVBRUIsMHg1QUIyLC8qIDB4QzAtMHhDNyAqLworCTB4NUFEMiwweDVBRDQsMHg1QUI4LDB4NUFFMCwweDVBRTMsMHg1QUYxLDB4NUFENiwweDVBRTYsLyogMHhDOC0weENGICovCisJMHg1QUQ4LDB4NUFEQywweDVCMDksMHg1QjE3LDB4NUIxNiwweDVCMzIsMHg1QjM3LDB4NUI0MCwvKiAweEQwLTB4RDcgKi8KKwkweDVDMTUsMHg1QzFDLDB4NUI1QSwweDVCNjUsMHg1QjczLDB4NUI1MSwweDVCNTMsMHg1QjYyLC8qIDB4RDgtMHhERiAqLworCTB4OUE3NSwweDlBNzcsMHg5QTc4LDB4OUE3QSwweDlBN0YsMHg5QTdELDB4OUE4MCwweDlBODEsLyogMHhFMC0weEU3ICovCisJMHg5QTg1LDB4OUE4OCwweDlBOEEsMHg5QTkwLDB4OUE5MiwweDlBOTMsMHg5QTk2LDB4OUE5OCwvKiAweEU4LTB4RUYgKi8KKwkweDlBOUIsMHg5QTlDLDB4OUE5RCwweDlBOUYsMHg5QUEwLDB4OUFBMiwweDlBQTMsMHg5QUE1LC8qIDB4RjAtMHhGNyAqLworCTB4OUFBNywweDdFOUYsMHg3RUExLDB4N0VBMywweDdFQTUsMHg3RUE4LDB4N0VBOSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTdbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5M0NFLDB4OTNDRiwweDkzRDAsMHg5M0QxLDB4OTNEMiwweDkzRDMsMHg5M0Q0LDB4OTNENSwvKiAweDQwLTB4NDcgKi8KKwkweDkzRDcsMHg5M0Q4LDB4OTNEOSwweDkzREEsMHg5M0RCLDB4OTNEQywweDkzREQsMHg5M0RFLC8qIDB4NDgtMHg0RiAqLworCTB4OTNERiwweDkzRTAsMHg5M0UxLDB4OTNFMiwweDkzRTMsMHg5M0U0LDB4OTNFNSwweDkzRTYsLyogMHg1MC0weDU3ICovCisJMHg5M0U3LDB4OTNFOCwweDkzRTksMHg5M0VBLDB4OTNFQiwweDkzRUMsMHg5M0VELDB4OTNFRSwvKiAweDU4LTB4NUYgKi8KKwkweDkzRUYsMHg5M0YwLDB4OTNGMSwweDkzRjIsMHg5M0YzLDB4OTNGNCwweDkzRjUsMHg5M0Y2LC8qIDB4NjAtMHg2NyAqLworCTB4OTNGNywweDkzRjgsMHg5M0Y5LDB4OTNGQSwweDkzRkIsMHg5M0ZDLDB4OTNGRCwweDkzRkUsLyogMHg2OC0weDZGICovCisJMHg5M0ZGLDB4OTQwMCwweDk0MDEsMHg5NDAyLDB4OTQwMywweDk0MDQsMHg5NDA1LDB4OTQwNiwvKiAweDcwLTB4NzcgKi8KKwkweDk0MDcsMHg5NDA4LDB4OTQwOSwweDk0MEEsMHg5NDBCLDB4OTQwQywweDk0MEQsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5NDBFLDB4OTQwRiwweDk0MTAsMHg5NDExLDB4OTQxMiwweDk0MTMsMHg5NDE0LDB4OTQxNSwvKiAweDgwLTB4ODcgKi8KKwkweDk0MTYsMHg5NDE3LDB4OTQxOCwweDk0MTksMHg5NDFBLDB4OTQxQiwweDk0MUMsMHg5NDFELC8qIDB4ODgtMHg4RiAqLworCTB4OTQxRSwweDk0MUYsMHg5NDIwLDB4OTQyMSwweDk0MjIsMHg5NDIzLDB4OTQyNCwweDk0MjUsLyogMHg5MC0weDk3ICovCisJMHg5NDI2LDB4OTQyNywweDk0MjgsMHg5NDI5LDB4OTQyQSwweDk0MkIsMHg5NDJDLDB4OTQyRCwvKiAweDk4LTB4OUYgKi8KKwkweDk0MkUsMHg3RUFELDB4N0VCMCwweDdFQkUsMHg3RUMwLDB4N0VDMSwweDdFQzIsMHg3RUM5LC8qIDB4QTAtMHhBNyAqLworCTB4N0VDQiwweDdFQ0MsMHg3RUQwLDB4N0VENCwweDdFRDcsMHg3RURCLDB4N0VFMCwweDdFRTEsLyogMHhBOC0weEFGICovCisJMHg3RUU4LDB4N0VFQiwweDdFRUUsMHg3RUVGLDB4N0VGMSwweDdFRjIsMHg3RjBELDB4N0VGNiwvKiAweEIwLTB4QjcgKi8KKwkweDdFRkEsMHg3RUZCLDB4N0VGRSwweDdGMDEsMHg3RjAyLDB4N0YwMywweDdGMDcsMHg3RjA4LC8qIDB4QjgtMHhCRiAqLworCTB4N0YwQiwweDdGMEMsMHg3RjBGLDB4N0YxMSwweDdGMTIsMHg3RjE3LDB4N0YxOSwweDdGMUMsLyogMHhDMC0weEM3ICovCisJMHg3RjFCLDB4N0YxRiwweDdGMjEsMHg3RjIyLDB4N0YyMywweDdGMjQsMHg3RjI1LDB4N0YyNiwvKiAweEM4LTB4Q0YgKi8KKwkweDdGMjcsMHg3RjJBLDB4N0YyQiwweDdGMkMsMHg3RjJELDB4N0YyRiwweDdGMzAsMHg3RjMxLC8qIDB4RDAtMHhENyAqLworCTB4N0YzMiwweDdGMzMsMHg3RjM1LDB4NUU3QSwweDc1N0YsMHg1RERCLDB4NzUzRSwweDkwOTUsLyogMHhEOC0weERGICovCisJMHg3MzhFLDB4NzM5MSwweDczQUUsMHg3M0EyLDB4NzM5RiwweDczQ0YsMHg3M0MyLDB4NzNEMSwvKiAweEUwLTB4RTcgKi8KKwkweDczQjcsMHg3M0IzLDB4NzNDMCwweDczQzksMHg3M0M4LDB4NzNFNSwweDczRDksMHg5ODdDLC8qIDB4RTgtMHhFRiAqLworCTB4NzQwQSwweDczRTksMHg3M0U3LDB4NzNERSwweDczQkEsMHg3M0YyLDB4NzQwRiwweDc0MkEsLyogMHhGMC0weEY3ICovCisJMHg3NDVCLDB4NzQyNiwweDc0MjUsMHg3NDI4LDB4NzQzMCwweDc0MkUsMHg3NDJDLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FOFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDk0MkYsMHg5NDMwLDB4OTQzMSwweDk0MzIsMHg5NDMzLDB4OTQzNCwweDk0MzUsMHg5NDM2LC8qIDB4NDAtMHg0NyAqLworCTB4OTQzNywweDk0MzgsMHg5NDM5LDB4OTQzQSwweDk0M0IsMHg5NDNDLDB4OTQzRCwweDk0M0YsLyogMHg0OC0weDRGICovCisJMHg5NDQwLDB4OTQ0MSwweDk0NDIsMHg5NDQzLDB4OTQ0NCwweDk0NDUsMHg5NDQ2LDB4OTQ0NywvKiAweDUwLTB4NTcgKi8KKwkweDk0NDgsMHg5NDQ5LDB4OTQ0QSwweDk0NEIsMHg5NDRDLDB4OTQ0RCwweDk0NEUsMHg5NDRGLC8qIDB4NTgtMHg1RiAqLworCTB4OTQ1MCwweDk0NTEsMHg5NDUyLDB4OTQ1MywweDk0NTQsMHg5NDU1LDB4OTQ1NiwweDk0NTcsLyogMHg2MC0weDY3ICovCisJMHg5NDU4LDB4OTQ1OSwweDk0NUEsMHg5NDVCLDB4OTQ1QywweDk0NUQsMHg5NDVFLDB4OTQ1RiwvKiAweDY4LTB4NkYgKi8KKwkweDk0NjAsMHg5NDYxLDB4OTQ2MiwweDk0NjMsMHg5NDY0LDB4OTQ2NSwweDk0NjYsMHg5NDY3LC8qIDB4NzAtMHg3NyAqLworCTB4OTQ2OCwweDk0NjksMHg5NDZBLDB4OTQ2QywweDk0NkQsMHg5NDZFLDB4OTQ2RiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDk0NzAsMHg5NDcxLDB4OTQ3MiwweDk0NzMsMHg5NDc0LDB4OTQ3NSwweDk0NzYsMHg5NDc3LC8qIDB4ODAtMHg4NyAqLworCTB4OTQ3OCwweDk0NzksMHg5NDdBLDB4OTQ3QiwweDk0N0MsMHg5NDdELDB4OTQ3RSwweDk0N0YsLyogMHg4OC0weDhGICovCisJMHg5NDgwLDB4OTQ4MSwweDk0ODIsMHg5NDgzLDB4OTQ4NCwweDk0OTEsMHg5NDk2LDB4OTQ5OCwvKiAweDkwLTB4OTcgKi8KKwkweDk0QzcsMHg5NENGLDB4OTREMywweDk0RDQsMHg5NERBLDB4OTRFNiwweDk0RkIsMHg5NTFDLC8qIDB4OTgtMHg5RiAqLworCTB4OTUyMCwweDc0MUIsMHg3NDFBLDB4NzQ0MSwweDc0NUMsMHg3NDU3LDB4NzQ1NSwweDc0NTksLyogMHhBMC0weEE3ICovCisJMHg3NDc3LDB4NzQ2RCwweDc0N0UsMHg3NDlDLDB4NzQ4RSwweDc0ODAsMHg3NDgxLDB4NzQ4NywvKiAweEE4LTB4QUYgKi8KKwkweDc0OEIsMHg3NDlFLDB4NzRBOCwweDc0QTksMHg3NDkwLDB4NzRBNywweDc0RDIsMHg3NEJBLC8qIDB4QjAtMHhCNyAqLworCTB4OTdFQSwweDk3RUIsMHg5N0VDLDB4Njc0QywweDY3NTMsMHg2NzVFLDB4Njc0OCwweDY3NjksLyogMHhCOC0weEJGICovCisJMHg2N0E1LDB4Njc4NywweDY3NkEsMHg2NzczLDB4Njc5OCwweDY3QTcsMHg2Nzc1LDB4NjdBOCwvKiAweEMwLTB4QzcgKi8KKwkweDY3OUUsMHg2N0FELDB4Njc4QiwweDY3NzcsMHg2NzdDLDB4NjdGMCwweDY4MDksMHg2N0Q4LC8qIDB4QzgtMHhDRiAqLworCTB4NjgwQSwweDY3RTksMHg2N0IwLDB4NjgwQywweDY3RDksMHg2N0I1LDB4NjdEQSwweDY3QjMsLyogMHhEMC0weEQ3ICovCisJMHg2N0RELDB4NjgwMCwweDY3QzMsMHg2N0I4LDB4NjdFMiwweDY4MEUsMHg2N0MxLDB4NjdGRCwvKiAweEQ4LTB4REYgKi8KKwkweDY4MzIsMHg2ODMzLDB4Njg2MCwweDY4NjEsMHg2ODRFLDB4Njg2MiwweDY4NDQsMHg2ODY0LC8qIDB4RTAtMHhFNyAqLworCTB4Njg4MywweDY4MUQsMHg2ODU1LDB4Njg2NiwweDY4NDEsMHg2ODY3LDB4Njg0MCwweDY4M0UsLyogMHhFOC0weEVGICovCisJMHg2ODRBLDB4Njg0OSwweDY4MjksMHg2OEI1LDB4Njg4RiwweDY4NzQsMHg2ODc3LDB4Njg5MywvKiAweEYwLTB4RjcgKi8KKwkweDY4NkIsMHg2OEMyLDB4Njk2RSwweDY4RkMsMHg2OTFGLDB4NjkyMCwweDY4RjksMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0U5WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTUyNywweDk1MzMsMHg5NTNELDB4OTU0MywweDk1NDgsMHg5NTRCLDB4OTU1NSwweDk1NUEsLyogMHg0MC0weDQ3ICovCisJMHg5NTYwLDB4OTU2RSwweDk1NzQsMHg5NTc1LDB4OTU3NywweDk1NzgsMHg5NTc5LDB4OTU3QSwvKiAweDQ4LTB4NEYgKi8KKwkweDk1N0IsMHg5NTdDLDB4OTU3RCwweDk1N0UsMHg5NTgwLDB4OTU4MSwweDk1ODIsMHg5NTgzLC8qIDB4NTAtMHg1NyAqLworCTB4OTU4NCwweDk1ODUsMHg5NTg2LDB4OTU4NywweDk1ODgsMHg5NTg5LDB4OTU4QSwweDk1OEIsLyogMHg1OC0weDVGICovCisJMHg5NThDLDB4OTU4RCwweDk1OEUsMHg5NThGLDB4OTU5MCwweDk1OTEsMHg5NTkyLDB4OTU5MywvKiAweDYwLTB4NjcgKi8KKwkweDk1OTQsMHg5NTk1LDB4OTU5NiwweDk1OTcsMHg5NTk4LDB4OTU5OSwweDk1OUEsMHg5NTlCLC8qIDB4NjgtMHg2RiAqLworCTB4OTU5QywweDk1OUQsMHg5NTlFLDB4OTU5RiwweDk1QTAsMHg5NUExLDB4OTVBMiwweDk1QTMsLyogMHg3MC0weDc3ICovCisJMHg5NUE0LDB4OTVBNSwweDk1QTYsMHg5NUE3LDB4OTVBOCwweDk1QTksMHg5NUFBLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OTVBQiwweDk1QUMsMHg5NUFELDB4OTVBRSwweDk1QUYsMHg5NUIwLDB4OTVCMSwweDk1QjIsLyogMHg4MC0weDg3ICovCisJMHg5NUIzLDB4OTVCNCwweDk1QjUsMHg5NUI2LDB4OTVCNywweDk1QjgsMHg5NUI5LDB4OTVCQSwvKiAweDg4LTB4OEYgKi8KKwkweDk1QkIsMHg5NUJDLDB4OTVCRCwweDk1QkUsMHg5NUJGLDB4OTVDMCwweDk1QzEsMHg5NUMyLC8qIDB4OTAtMHg5NyAqLworCTB4OTVDMywweDk1QzQsMHg5NUM1LDB4OTVDNiwweDk1QzcsMHg5NUM4LDB4OTVDOSwweDk1Q0EsLyogMHg5OC0weDlGICovCisJMHg5NUNCLDB4NjkyNCwweDY4RjAsMHg2OTBCLDB4NjkwMSwweDY5NTcsMHg2OEUzLDB4NjkxMCwvKiAweEEwLTB4QTcgKi8KKwkweDY5NzEsMHg2OTM5LDB4Njk2MCwweDY5NDIsMHg2OTVELDB4Njk4NCwweDY5NkIsMHg2OTgwLC8qIDB4QTgtMHhBRiAqLworCTB4Njk5OCwweDY5NzgsMHg2OTM0LDB4NjlDQywweDY5ODcsMHg2OTg4LDB4NjlDRSwweDY5ODksLyogMHhCMC0weEI3ICovCisJMHg2OTY2LDB4Njk2MywweDY5NzksMHg2OTlCLDB4NjlBNywweDY5QkIsMHg2OUFCLDB4NjlBRCwvKiAweEI4LTB4QkYgKi8KKwkweDY5RDQsMHg2OUIxLDB4NjlDMSwweDY5Q0EsMHg2OURGLDB4Njk5NSwweDY5RTAsMHg2OThELC8qIDB4QzAtMHhDNyAqLworCTB4NjlGRiwweDZBMkYsMHg2OUVELDB4NkExNywweDZBMTgsMHg2QTY1LDB4NjlGMiwweDZBNDQsLyogMHhDOC0weENGICovCisJMHg2QTNFLDB4NkFBMCwweDZBNTAsMHg2QTVCLDB4NkEzNSwweDZBOEUsMHg2QTc5LDB4NkEzRCwvKiAweEQwLTB4RDcgKi8KKwkweDZBMjgsMHg2QTU4LDB4NkE3QywweDZBOTEsMHg2QTkwLDB4NkFBOSwweDZBOTcsMHg2QUFCLC8qIDB4RDgtMHhERiAqLworCTB4NzMzNywweDczNTIsMHg2QjgxLDB4NkI4MiwweDZCODcsMHg2Qjg0LDB4NkI5MiwweDZCOTMsLyogMHhFMC0weEU3ICovCisJMHg2QjhELDB4NkI5QSwweDZCOUIsMHg2QkExLDB4NkJBQSwweDhGNkIsMHg4RjZELDB4OEY3MSwvKiAweEU4LTB4RUYgKi8KKwkweDhGNzIsMHg4RjczLDB4OEY3NSwweDhGNzYsMHg4Rjc4LDB4OEY3NywweDhGNzksMHg4RjdBLC8qIDB4RjAtMHhGNyAqLworCTB4OEY3QywweDhGN0UsMHg4RjgxLDB4OEY4MiwweDhGODQsMHg4Rjg3LDB4OEY4QiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRUFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5NUNDLDB4OTVDRCwweDk1Q0UsMHg5NUNGLDB4OTVEMCwweDk1RDEsMHg5NUQyLDB4OTVEMywvKiAweDQwLTB4NDcgKi8KKwkweDk1RDQsMHg5NUQ1LDB4OTVENiwweDk1RDcsMHg5NUQ4LDB4OTVEOSwweDk1REEsMHg5NURCLC8qIDB4NDgtMHg0RiAqLworCTB4OTVEQywweDk1REQsMHg5NURFLDB4OTVERiwweDk1RTAsMHg5NUUxLDB4OTVFMiwweDk1RTMsLyogMHg1MC0weDU3ICovCisJMHg5NUU0LDB4OTVFNSwweDk1RTYsMHg5NUU3LDB4OTVFQywweDk1RkYsMHg5NjA3LDB4OTYxMywvKiAweDU4LTB4NUYgKi8KKwkweDk2MTgsMHg5NjFCLDB4OTYxRSwweDk2MjAsMHg5NjIzLDB4OTYyNCwweDk2MjUsMHg5NjI2LC8qIDB4NjAtMHg2NyAqLworCTB4OTYyNywweDk2MjgsMHg5NjI5LDB4OTYyQiwweDk2MkMsMHg5NjJELDB4OTYyRiwweDk2MzAsLyogMHg2OC0weDZGICovCisJMHg5NjM3LDB4OTYzOCwweDk2MzksMHg5NjNBLDB4OTYzRSwweDk2NDEsMHg5NjQzLDB4OTY0QSwvKiAweDcwLTB4NzcgKi8KKwkweDk2NEUsMHg5NjRGLDB4OTY1MSwweDk2NTIsMHg5NjUzLDB4OTY1NiwweDk2NTcsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5NjU4LDB4OTY1OSwweDk2NUEsMHg5NjVDLDB4OTY1RCwweDk2NUUsMHg5NjYwLDB4OTY2MywvKiAweDgwLTB4ODcgKi8KKwkweDk2NjUsMHg5NjY2LDB4OTY2QiwweDk2NkQsMHg5NjZFLDB4OTY2RiwweDk2NzAsMHg5NjcxLC8qIDB4ODgtMHg4RiAqLworCTB4OTY3MywweDk2NzgsMHg5Njc5LDB4OTY3QSwweDk2N0IsMHg5NjdDLDB4OTY3RCwweDk2N0UsLyogMHg5MC0weDk3ICovCisJMHg5NjdGLDB4OTY4MCwweDk2ODEsMHg5NjgyLDB4OTY4MywweDk2ODQsMHg5Njg3LDB4OTY4OSwvKiAweDk4LTB4OUYgKi8KKwkweDk2OEEsMHg4RjhELDB4OEY4RSwweDhGOEYsMHg4Rjk4LDB4OEY5QSwweDhFQ0UsMHg2MjBCLC8qIDB4QTAtMHhBNyAqLworCTB4NjIxNywweDYyMUIsMHg2MjFGLDB4NjIyMiwweDYyMjEsMHg2MjI1LDB4NjIyNCwweDYyMkMsLyogMHhBOC0weEFGICovCisJMHg4MUU3LDB4NzRFRiwweDc0RjQsMHg3NEZGLDB4NzUwRiwweDc1MTEsMHg3NTEzLDB4NjUzNCwvKiAweEIwLTB4QjcgKi8KKwkweDY1RUUsMHg2NUVGLDB4NjVGMCwweDY2MEEsMHg2NjE5LDB4Njc3MiwweDY2MDMsMHg2NjE1LC8qIDB4QjgtMHhCRiAqLworCTB4NjYwMCwweDcwODUsMHg2NkY3LDB4NjYxRCwweDY2MzQsMHg2NjMxLDB4NjYzNiwweDY2MzUsLyogMHhDMC0weEM3ICovCisJMHg4MDA2LDB4NjY1RiwweDY2NTQsMHg2NjQxLDB4NjY0RiwweDY2NTYsMHg2NjYxLDB4NjY1NywvKiAweEM4LTB4Q0YgKi8KKwkweDY2NzcsMHg2Njg0LDB4NjY4QywweDY2QTcsMHg2NjlELDB4NjZCRSwweDY2REIsMHg2NkRDLC8qIDB4RDAtMHhENyAqLworCTB4NjZFNiwweDY2RTksMHg4RDMyLDB4OEQzMywweDhEMzYsMHg4RDNCLDB4OEQzRCwweDhENDAsLyogMHhEOC0weERGICovCisJMHg4RDQ1LDB4OEQ0NiwweDhENDgsMHg4RDQ5LDB4OEQ0NywweDhENEQsMHg4RDU1LDB4OEQ1OSwvKiAweEUwLTB4RTcgKi8KKwkweDg5QzcsMHg4OUNBLDB4ODlDQiwweDg5Q0MsMHg4OUNFLDB4ODlDRiwweDg5RDAsMHg4OUQxLC8qIDB4RTgtMHhFRiAqLworCTB4NzI2RSwweDcyOUYsMHg3MjVELDB4NzI2NiwweDcyNkYsMHg3MjdFLDB4NzI3RiwweDcyODQsLyogMHhGMC0weEY3ICovCisJMHg3MjhCLDB4NzI4RCwweDcyOEYsMHg3MjkyLDB4NjMwOCwweDYzMzIsMHg2M0IwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FQlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDk2OEMsMHg5NjhFLDB4OTY5MSwweDk2OTIsMHg5NjkzLDB4OTY5NSwweDk2OTYsMHg5NjlBLC8qIDB4NDAtMHg0NyAqLworCTB4OTY5QiwweDk2OUQsMHg5NjlFLDB4OTY5RiwweDk2QTAsMHg5NkExLDB4OTZBMiwweDk2QTMsLyogMHg0OC0weDRGICovCisJMHg5NkE0LDB4OTZBNSwweDk2QTYsMHg5NkE4LDB4OTZBOSwweDk2QUEsMHg5NkFCLDB4OTZBQywvKiAweDUwLTB4NTcgKi8KKwkweDk2QUQsMHg5NkFFLDB4OTZBRiwweDk2QjEsMHg5NkIyLDB4OTZCNCwweDk2QjUsMHg5NkI3LC8qIDB4NTgtMHg1RiAqLworCTB4OTZCOCwweDk2QkEsMHg5NkJCLDB4OTZCRiwweDk2QzIsMHg5NkMzLDB4OTZDOCwweDk2Q0EsLyogMHg2MC0weDY3ICovCisJMHg5NkNCLDB4OTZEMCwweDk2RDEsMHg5NkQzLDB4OTZENCwweDk2RDYsMHg5NkQ3LDB4OTZEOCwvKiAweDY4LTB4NkYgKi8KKwkweDk2RDksMHg5NkRBLDB4OTZEQiwweDk2REMsMHg5NkRELDB4OTZERSwweDk2REYsMHg5NkUxLC8qIDB4NzAtMHg3NyAqLworCTB4OTZFMiwweDk2RTMsMHg5NkU0LDB4OTZFNSwweDk2RTYsMHg5NkU3LDB4OTZFQiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDk2RUMsMHg5NkVELDB4OTZFRSwweDk2RjAsMHg5NkYxLDB4OTZGMiwweDk2RjQsMHg5NkY1LC8qIDB4ODAtMHg4NyAqLworCTB4OTZGOCwweDk2RkEsMHg5NkZCLDB4OTZGQywweDk2RkQsMHg5NkZGLDB4OTcwMiwweDk3MDMsLyogMHg4OC0weDhGICovCisJMHg5NzA1LDB4OTcwQSwweDk3MEIsMHg5NzBDLDB4OTcxMCwweDk3MTEsMHg5NzEyLDB4OTcxNCwvKiAweDkwLTB4OTcgKi8KKwkweDk3MTUsMHg5NzE3LDB4OTcxOCwweDk3MTksMHg5NzFBLDB4OTcxQiwweDk3MUQsMHg5NzFGLC8qIDB4OTgtMHg5RiAqLworCTB4OTcyMCwweDY0M0YsMHg2NEQ4LDB4ODAwNCwweDZCRUEsMHg2QkYzLDB4NkJGRCwweDZCRjUsLyogMHhBMC0weEE3ICovCisJMHg2QkY5LDB4NkMwNSwweDZDMDcsMHg2QzA2LDB4NkMwRCwweDZDMTUsMHg2QzE4LDB4NkMxOSwvKiAweEE4LTB4QUYgKi8KKwkweDZDMUEsMHg2QzIxLDB4NkMyOSwweDZDMjQsMHg2QzJBLDB4NkMzMiwweDY1MzUsMHg2NTU1LC8qIDB4QjAtMHhCNyAqLworCTB4NjU2QiwweDcyNEQsMHg3MjUyLDB4NzI1NiwweDcyMzAsMHg4NjYyLDB4NTIxNiwweDgwOUYsLyogMHhCOC0weEJGICovCisJMHg4MDlDLDB4ODA5MywweDgwQkMsMHg2NzBBLDB4ODBCRCwweDgwQjEsMHg4MEFCLDB4ODBBRCwvKiAweEMwLTB4QzcgKi8KKwkweDgwQjQsMHg4MEI3LDB4ODBFNywweDgwRTgsMHg4MEU5LDB4ODBFQSwweDgwREIsMHg4MEMyLC8qIDB4QzgtMHhDRiAqLworCTB4ODBDNCwweDgwRDksMHg4MENELDB4ODBENywweDY3MTAsMHg4MERELDB4ODBFQiwweDgwRjEsLyogMHhEMC0weEQ3ICovCisJMHg4MEY0LDB4ODBFRCwweDgxMEQsMHg4MTBFLDB4ODBGMiwweDgwRkMsMHg2NzE1LDB4ODExMiwvKiAweEQ4LTB4REYgKi8KKwkweDhDNUEsMHg4MTM2LDB4ODExRSwweDgxMkMsMHg4MTE4LDB4ODEzMiwweDgxNDgsMHg4MTRDLC8qIDB4RTAtMHhFNyAqLworCTB4ODE1MywweDgxNzQsMHg4MTU5LDB4ODE1QSwweDgxNzEsMHg4MTYwLDB4ODE2OSwweDgxN0MsLyogMHhFOC0weEVGICovCisJMHg4MTdELDB4ODE2RCwweDgxNjcsMHg1ODRELDB4NUFCNSwweDgxODgsMHg4MTgyLDB4ODE5MSwvKiAweEYwLTB4RjcgKi8KKwkweDZFRDUsMHg4MUEzLDB4ODFBQSwweDgxQ0MsMHg2NzI2LDB4ODFDQSwweDgxQkIsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0VDWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTcyMSwweDk3MjIsMHg5NzIzLDB4OTcyNCwweDk3MjUsMHg5NzI2LDB4OTcyNywweDk3MjgsLyogMHg0MC0weDQ3ICovCisJMHg5NzI5LDB4OTcyQiwweDk3MkMsMHg5NzJFLDB4OTcyRiwweDk3MzEsMHg5NzMzLDB4OTczNCwvKiAweDQ4LTB4NEYgKi8KKwkweDk3MzUsMHg5NzM2LDB4OTczNywweDk3M0EsMHg5NzNCLDB4OTczQywweDk3M0QsMHg5NzNGLC8qIDB4NTAtMHg1NyAqLworCTB4OTc0MCwweDk3NDEsMHg5NzQyLDB4OTc0MywweDk3NDQsMHg5NzQ1LDB4OTc0NiwweDk3NDcsLyogMHg1OC0weDVGICovCisJMHg5NzQ4LDB4OTc0OSwweDk3NEEsMHg5NzRCLDB4OTc0QywweDk3NEQsMHg5NzRFLDB4OTc0RiwvKiAweDYwLTB4NjcgKi8KKwkweDk3NTAsMHg5NzUxLDB4OTc1NCwweDk3NTUsMHg5NzU3LDB4OTc1OCwweDk3NUEsMHg5NzVDLC8qIDB4NjgtMHg2RiAqLworCTB4OTc1RCwweDk3NUYsMHg5NzYzLDB4OTc2NCwweDk3NjYsMHg5NzY3LDB4OTc2OCwweDk3NkEsLyogMHg3MC0weDc3ICovCisJMHg5NzZCLDB4OTc2QywweDk3NkQsMHg5NzZFLDB4OTc2RiwweDk3NzAsMHg5NzcxLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OTc3MiwweDk3NzUsMHg5Nzc3LDB4OTc3OCwweDk3NzksMHg5NzdBLDB4OTc3QiwweDk3N0QsLyogMHg4MC0weDg3ICovCisJMHg5NzdFLDB4OTc3RiwweDk3ODAsMHg5NzgxLDB4OTc4MiwweDk3ODMsMHg5Nzg0LDB4OTc4NiwvKiAweDg4LTB4OEYgKi8KKwkweDk3ODcsMHg5Nzg4LDB4OTc4OSwweDk3OEEsMHg5NzhDLDB4OTc4RSwweDk3OEYsMHg5NzkwLC8qIDB4OTAtMHg5NyAqLworCTB4OTc5MywweDk3OTUsMHg5Nzk2LDB4OTc5NywweDk3OTksMHg5NzlBLDB4OTc5QiwweDk3OUMsLyogMHg5OC0weDlGICovCisJMHg5NzlELDB4ODFDMSwweDgxQTYsMHg2QjI0LDB4NkIzNywweDZCMzksMHg2QjQzLDB4NkI0NiwvKiAweEEwLTB4QTcgKi8KKwkweDZCNTksMHg5OEQxLDB4OThEMiwweDk4RDMsMHg5OEQ1LDB4OThEOSwweDk4REEsMHg2QkIzLC8qIDB4QTgtMHhBRiAqLworCTB4NUY0MCwweDZCQzIsMHg4OUYzLDB4NjU5MCwweDlGNTEsMHg2NTkzLDB4NjVCQywweDY1QzYsLyogMHhCMC0weEI3ICovCisJMHg2NUM0LDB4NjVDMywweDY1Q0MsMHg2NUNFLDB4NjVEMiwweDY1RDYsMHg3MDgwLDB4NzA5QywvKiAweEI4LTB4QkYgKi8KKwkweDcwOTYsMHg3MDlELDB4NzBCQiwweDcwQzAsMHg3MEI3LDB4NzBBQiwweDcwQjEsMHg3MEU4LC8qIDB4QzAtMHhDNyAqLworCTB4NzBDQSwweDcxMTAsMHg3MTEzLDB4NzExNiwweDcxMkYsMHg3MTMxLDB4NzE3MywweDcxNUMsLyogMHhDOC0weENGICovCisJMHg3MTY4LDB4NzE0NSwweDcxNzIsMHg3MTRBLDB4NzE3OCwweDcxN0EsMHg3MTk4LDB4NzFCMywvKiAweEQwLTB4RDcgKi8KKwkweDcxQjUsMHg3MUE4LDB4NzFBMCwweDcxRTAsMHg3MUQ0LDB4NzFFNywweDcxRjksMHg3MjFELC8qIDB4RDgtMHhERiAqLworCTB4NzIyOCwweDcwNkMsMHg3MTE4LDB4NzE2NiwweDcxQjksMHg2MjNFLDB4NjIzRCwweDYyNDMsLyogMHhFMC0weEU3ICovCisJMHg2MjQ4LDB4NjI0OSwweDc5M0IsMHg3OTQwLDB4Nzk0NiwweDc5NDksMHg3OTVCLDB4Nzk1QywvKiAweEU4LTB4RUYgKi8KKwkweDc5NTMsMHg3OTVBLDB4Nzk2MiwweDc5NTcsMHg3OTYwLDB4Nzk2RiwweDc5NjcsMHg3OTdBLC8qIDB4RjAtMHhGNyAqLworCTB4Nzk4NSwweDc5OEEsMHg3OTlBLDB4NzlBNywweDc5QjMsMHg1RkQxLDB4NUZEMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRURbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5NzlFLDB4OTc5RiwweDk3QTEsMHg5N0EyLDB4OTdBNCwweDk3QTUsMHg5N0E2LDB4OTdBNywvKiAweDQwLTB4NDcgKi8KKwkweDk3QTgsMHg5N0E5LDB4OTdBQSwweDk3QUMsMHg5N0FFLDB4OTdCMCwweDk3QjEsMHg5N0IzLC8qIDB4NDgtMHg0RiAqLworCTB4OTdCNSwweDk3QjYsMHg5N0I3LDB4OTdCOCwweDk3QjksMHg5N0JBLDB4OTdCQiwweDk3QkMsLyogMHg1MC0weDU3ICovCisJMHg5N0JELDB4OTdCRSwweDk3QkYsMHg5N0MwLDB4OTdDMSwweDk3QzIsMHg5N0MzLDB4OTdDNCwvKiAweDU4LTB4NUYgKi8KKwkweDk3QzUsMHg5N0M2LDB4OTdDNywweDk3QzgsMHg5N0M5LDB4OTdDQSwweDk3Q0IsMHg5N0NDLC8qIDB4NjAtMHg2NyAqLworCTB4OTdDRCwweDk3Q0UsMHg5N0NGLDB4OTdEMCwweDk3RDEsMHg5N0QyLDB4OTdEMywweDk3RDQsLyogMHg2OC0weDZGICovCisJMHg5N0Q1LDB4OTdENiwweDk3RDcsMHg5N0Q4LDB4OTdEOSwweDk3REEsMHg5N0RCLDB4OTdEQywvKiAweDcwLTB4NzcgKi8KKwkweDk3REQsMHg5N0RFLDB4OTdERiwweDk3RTAsMHg5N0UxLDB4OTdFMiwweDk3RTMsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5N0U0LDB4OTdFNSwweDk3RTgsMHg5N0VFLDB4OTdFRiwweDk3RjAsMHg5N0YxLDB4OTdGMiwvKiAweDgwLTB4ODcgKi8KKwkweDk3RjQsMHg5N0Y3LDB4OTdGOCwweDk3RjksMHg5N0ZBLDB4OTdGQiwweDk3RkMsMHg5N0ZELC8qIDB4ODgtMHg4RiAqLworCTB4OTdGRSwweDk3RkYsMHg5ODAwLDB4OTgwMSwweDk4MDIsMHg5ODAzLDB4OTgwNCwweDk4MDUsLyogMHg5MC0weDk3ICovCisJMHg5ODA2LDB4OTgwNywweDk4MDgsMHg5ODA5LDB4OTgwQSwweDk4MEIsMHg5ODBDLDB4OTgwRCwvKiAweDk4LTB4OUYgKi8KKwkweDk4MEUsMHg2MDNDLDB4NjA1RCwweDYwNUEsMHg2MDY3LDB4NjA0MSwweDYwNTksMHg2MDYzLC8qIDB4QTAtMHhBNyAqLworCTB4NjBBQiwweDYxMDYsMHg2MTBELDB4NjE1RCwweDYxQTksMHg2MTlELDB4NjFDQiwweDYxRDEsLyogMHhBOC0weEFGICovCisJMHg2MjA2LDB4ODA4MCwweDgwN0YsMHg2QzkzLDB4NkNGNiwweDZERkMsMHg3N0Y2LDB4NzdGOCwvKiAweEIwLTB4QjcgKi8KKwkweDc4MDAsMHg3ODA5LDB4NzgxNywweDc4MTgsMHg3ODExLDB4NjVBQiwweDc4MkQsMHg3ODFDLC8qIDB4QjgtMHhCRiAqLworCTB4NzgxRCwweDc4MzksMHg3ODNBLDB4NzgzQiwweDc4MUYsMHg3ODNDLDB4NzgyNSwweDc4MkMsLyogMHhDMC0weEM3ICovCisJMHg3ODIzLDB4NzgyOSwweDc4NEUsMHg3ODZELDB4Nzg1NiwweDc4NTcsMHg3ODI2LDB4Nzg1MCwvKiAweEM4LTB4Q0YgKi8KKwkweDc4NDcsMHg3ODRDLDB4Nzg2QSwweDc4OUIsMHg3ODkzLDB4Nzg5QSwweDc4ODcsMHg3ODlDLC8qIDB4RDAtMHhENyAqLworCTB4NzhBMSwweDc4QTMsMHg3OEIyLDB4NzhCOSwweDc4QTUsMHg3OEQ0LDB4NzhEOSwweDc4QzksLyogMHhEOC0weERGICovCisJMHg3OEVDLDB4NzhGMiwweDc5MDUsMHg3OEY0LDB4NzkxMywweDc5MjQsMHg3OTFFLDB4NzkzNCwvKiAweEUwLTB4RTcgKi8KKwkweDlGOUIsMHg5RUY5LDB4OUVGQiwweDlFRkMsMHg3NkYxLDB4NzcwNCwweDc3MEQsMHg3NkY5LC8qIDB4RTgtMHhFRiAqLworCTB4NzcwNywweDc3MDgsMHg3NzFBLDB4NzcyMiwweDc3MTksMHg3NzJELDB4NzcyNiwweDc3MzUsLyogMHhGMC0weEY3ICovCisJMHg3NzM4LDB4Nzc1MCwweDc3NTEsMHg3NzQ3LDB4Nzc0MywweDc3NUEsMHg3NzY4LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FRVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDk4MEYsMHg5ODEwLDB4OTgxMSwweDk4MTIsMHg5ODEzLDB4OTgxNCwweDk4MTUsMHg5ODE2LC8qIDB4NDAtMHg0NyAqLworCTB4OTgxNywweDk4MTgsMHg5ODE5LDB4OTgxQSwweDk4MUIsMHg5ODFDLDB4OTgxRCwweDk4MUUsLyogMHg0OC0weDRGICovCisJMHg5ODFGLDB4OTgyMCwweDk4MjEsMHg5ODIyLDB4OTgyMywweDk4MjQsMHg5ODI1LDB4OTgyNiwvKiAweDUwLTB4NTcgKi8KKwkweDk4MjcsMHg5ODI4LDB4OTgyOSwweDk4MkEsMHg5ODJCLDB4OTgyQywweDk4MkQsMHg5ODJFLC8qIDB4NTgtMHg1RiAqLworCTB4OTgyRiwweDk4MzAsMHg5ODMxLDB4OTgzMiwweDk4MzMsMHg5ODM0LDB4OTgzNSwweDk4MzYsLyogMHg2MC0weDY3ICovCisJMHg5ODM3LDB4OTgzOCwweDk4MzksMHg5ODNBLDB4OTgzQiwweDk4M0MsMHg5ODNELDB4OTgzRSwvKiAweDY4LTB4NkYgKi8KKwkweDk4M0YsMHg5ODQwLDB4OTg0MSwweDk4NDIsMHg5ODQzLDB4OTg0NCwweDk4NDUsMHg5ODQ2LC8qIDB4NzAtMHg3NyAqLworCTB4OTg0NywweDk4NDgsMHg5ODQ5LDB4OTg0QSwweDk4NEIsMHg5ODRDLDB4OTg0RCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDk4NEUsMHg5ODRGLDB4OTg1MCwweDk4NTEsMHg5ODUyLDB4OTg1MywweDk4NTQsMHg5ODU1LC8qIDB4ODAtMHg4NyAqLworCTB4OTg1NiwweDk4NTcsMHg5ODU4LDB4OTg1OSwweDk4NUEsMHg5ODVCLDB4OTg1QywweDk4NUQsLyogMHg4OC0weDhGICovCisJMHg5ODVFLDB4OTg1RiwweDk4NjAsMHg5ODYxLDB4OTg2MiwweDk4NjMsMHg5ODY0LDB4OTg2NSwvKiAweDkwLTB4OTcgKi8KKwkweDk4NjYsMHg5ODY3LDB4OTg2OCwweDk4NjksMHg5ODZBLDB4OTg2QiwweDk4NkMsMHg5ODZELC8qIDB4OTgtMHg5RiAqLworCTB4OTg2RSwweDc3NjIsMHg3NzY1LDB4Nzc3RiwweDc3OEQsMHg3NzdELDB4Nzc4MCwweDc3OEMsLyogMHhBMC0weEE3ICovCisJMHg3NzkxLDB4Nzc5RiwweDc3QTAsMHg3N0IwLDB4NzdCNSwweDc3QkQsMHg3NTNBLDB4NzU0MCwvKiAweEE4LTB4QUYgKi8KKwkweDc1NEUsMHg3NTRCLDB4NzU0OCwweDc1NUIsMHg3NTcyLDB4NzU3OSwweDc1ODMsMHg3RjU4LC8qIDB4QjAtMHhCNyAqLworCTB4N0Y2MSwweDdGNUYsMHg4QTQ4LDB4N0Y2OCwweDdGNzQsMHg3RjcxLDB4N0Y3OSwweDdGODEsLyogMHhCOC0weEJGICovCisJMHg3RjdFLDB4NzZDRCwweDc2RTUsMHg4ODMyLDB4OTQ4NSwweDk0ODYsMHg5NDg3LDB4OTQ4QiwvKiAweEMwLTB4QzcgKi8KKwkweDk0OEEsMHg5NDhDLDB4OTQ4RCwweDk0OEYsMHg5NDkwLDB4OTQ5NCwweDk0OTcsMHg5NDk1LC8qIDB4QzgtMHhDRiAqLworCTB4OTQ5QSwweDk0OUIsMHg5NDlDLDB4OTRBMywweDk0QTQsMHg5NEFCLDB4OTRBQSwweDk0QUQsLyogMHhEMC0weEQ3ICovCisJMHg5NEFDLDB4OTRBRiwweDk0QjAsMHg5NEIyLDB4OTRCNCwweDk0QjYsMHg5NEI3LDB4OTRCOCwvKiAweEQ4LTB4REYgKi8KKwkweDk0QjksMHg5NEJBLDB4OTRCQywweDk0QkQsMHg5NEJGLDB4OTRDNCwweDk0QzgsMHg5NEM5LC8qIDB4RTAtMHhFNyAqLworCTB4OTRDQSwweDk0Q0IsMHg5NENDLDB4OTRDRCwweDk0Q0UsMHg5NEQwLDB4OTREMSwweDk0RDIsLyogMHhFOC0weEVGICovCisJMHg5NEQ1LDB4OTRENiwweDk0RDcsMHg5NEQ5LDB4OTREOCwweDk0REIsMHg5NERFLDB4OTRERiwvKiAweEYwLTB4RjcgKi8KKwkweDk0RTAsMHg5NEUyLDB4OTRFNCwweDk0RTUsMHg5NEU3LDB4OTRFOCwweDk0RUEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0VGWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTg2RiwweDk4NzAsMHg5ODcxLDB4OTg3MiwweDk4NzMsMHg5ODc0LDB4OTg4QiwweDk4OEUsLyogMHg0MC0weDQ3ICovCisJMHg5ODkyLDB4OTg5NSwweDk4OTksMHg5OEEzLDB4OThBOCwweDk4QTksMHg5OEFBLDB4OThBQiwvKiAweDQ4LTB4NEYgKi8KKwkweDk4QUMsMHg5OEFELDB4OThBRSwweDk4QUYsMHg5OEIwLDB4OThCMSwweDk4QjIsMHg5OEIzLC8qIDB4NTAtMHg1NyAqLworCTB4OThCNCwweDk4QjUsMHg5OEI2LDB4OThCNywweDk4QjgsMHg5OEI5LDB4OThCQSwweDk4QkIsLyogMHg1OC0weDVGICovCisJMHg5OEJDLDB4OThCRCwweDk4QkUsMHg5OEJGLDB4OThDMCwweDk4QzEsMHg5OEMyLDB4OThDMywvKiAweDYwLTB4NjcgKi8KKwkweDk4QzQsMHg5OEM1LDB4OThDNiwweDk4QzcsMHg5OEM4LDB4OThDOSwweDk4Q0EsMHg5OENCLC8qIDB4NjgtMHg2RiAqLworCTB4OThDQywweDk4Q0QsMHg5OENGLDB4OThEMCwweDk4RDQsMHg5OEQ2LDB4OThENywweDk4REIsLyogMHg3MC0weDc3ICovCisJMHg5OERDLDB4OThERCwweDk4RTAsMHg5OEUxLDB4OThFMiwweDk4RTMsMHg5OEU0LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OThFNSwweDk4RTYsMHg5OEU5LDB4OThFQSwweDk4RUIsMHg5OEVDLDB4OThFRCwweDk4RUUsLyogMHg4MC0weDg3ICovCisJMHg5OEVGLDB4OThGMCwweDk4RjEsMHg5OEYyLDB4OThGMywweDk4RjQsMHg5OEY1LDB4OThGNiwvKiAweDg4LTB4OEYgKi8KKwkweDk4RjcsMHg5OEY4LDB4OThGOSwweDk4RkEsMHg5OEZCLDB4OThGQywweDk4RkQsMHg5OEZFLC8qIDB4OTAtMHg5NyAqLworCTB4OThGRiwweDk5MDAsMHg5OTAxLDB4OTkwMiwweDk5MDMsMHg5OTA0LDB4OTkwNSwweDk5MDYsLyogMHg5OC0weDlGICovCisJMHg5OTA3LDB4OTRFOSwweDk0RUIsMHg5NEVFLDB4OTRFRiwweDk0RjMsMHg5NEY0LDB4OTRGNSwvKiAweEEwLTB4QTcgKi8KKwkweDk0RjcsMHg5NEY5LDB4OTRGQywweDk0RkQsMHg5NEZGLDB4OTUwMywweDk1MDIsMHg5NTA2LC8qIDB4QTgtMHhBRiAqLworCTB4OTUwNywweDk1MDksMHg5NTBBLDB4OTUwRCwweDk1MEUsMHg5NTBGLDB4OTUxMiwweDk1MTMsLyogMHhCMC0weEI3ICovCisJMHg5NTE0LDB4OTUxNSwweDk1MTYsMHg5NTE4LDB4OTUxQiwweDk1MUQsMHg5NTFFLDB4OTUxRiwvKiAweEI4LTB4QkYgKi8KKwkweDk1MjIsMHg5NTJBLDB4OTUyQiwweDk1MjksMHg5NTJDLDB4OTUzMSwweDk1MzIsMHg5NTM0LC8qIDB4QzAtMHhDNyAqLworCTB4OTUzNiwweDk1MzcsMHg5NTM4LDB4OTUzQywweDk1M0UsMHg5NTNGLDB4OTU0MiwweDk1MzUsLyogMHhDOC0weENGICovCisJMHg5NTQ0LDB4OTU0NSwweDk1NDYsMHg5NTQ5LDB4OTU0QywweDk1NEUsMHg5NTRGLDB4OTU1MiwvKiAweEQwLTB4RDcgKi8KKwkweDk1NTMsMHg5NTU0LDB4OTU1NiwweDk1NTcsMHg5NTU4LDB4OTU1OSwweDk1NUIsMHg5NTVFLC8qIDB4RDgtMHhERiAqLworCTB4OTU1RiwweDk1NUQsMHg5NTYxLDB4OTU2MiwweDk1NjQsMHg5NTY1LDB4OTU2NiwweDk1NjcsLyogMHhFMC0weEU3ICovCisJMHg5NTY4LDB4OTU2OSwweDk1NkEsMHg5NTZCLDB4OTU2QywweDk1NkYsMHg5NTcxLDB4OTU3MiwvKiAweEU4LTB4RUYgKi8KKwkweDk1NzMsMHg5NTNBLDB4NzdFNywweDc3RUMsMHg5NkM5LDB4NzlENSwweDc5RUQsMHg3OUUzLC8qIDB4RjAtMHhGNyAqLworCTB4NzlFQiwweDdBMDYsMHg1RDQ3LDB4N0EwMywweDdBMDIsMHg3QTFFLDB4N0ExNCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRjBbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5OTA4LDB4OTkwOSwweDk5MEEsMHg5OTBCLDB4OTkwQywweDk5MEUsMHg5OTBGLDB4OTkxMSwvKiAweDQwLTB4NDcgKi8KKwkweDk5MTIsMHg5OTEzLDB4OTkxNCwweDk5MTUsMHg5OTE2LDB4OTkxNywweDk5MTgsMHg5OTE5LC8qIDB4NDgtMHg0RiAqLworCTB4OTkxQSwweDk5MUIsMHg5OTFDLDB4OTkxRCwweDk5MUUsMHg5OTFGLDB4OTkyMCwweDk5MjEsLyogMHg1MC0weDU3ICovCisJMHg5OTIyLDB4OTkyMywweDk5MjQsMHg5OTI1LDB4OTkyNiwweDk5MjcsMHg5OTI4LDB4OTkyOSwvKiAweDU4LTB4NUYgKi8KKwkweDk5MkEsMHg5OTJCLDB4OTkyQywweDk5MkQsMHg5OTJGLDB4OTkzMCwweDk5MzEsMHg5OTMyLC8qIDB4NjAtMHg2NyAqLworCTB4OTkzMywweDk5MzQsMHg5OTM1LDB4OTkzNiwweDk5MzcsMHg5OTM4LDB4OTkzOSwweDk5M0EsLyogMHg2OC0weDZGICovCisJMHg5OTNCLDB4OTkzQywweDk5M0QsMHg5OTNFLDB4OTkzRiwweDk5NDAsMHg5OTQxLDB4OTk0MiwvKiAweDcwLTB4NzcgKi8KKwkweDk5NDMsMHg5OTQ0LDB4OTk0NSwweDk5NDYsMHg5OTQ3LDB4OTk0OCwweDk5NDksMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5OTRBLDB4OTk0QiwweDk5NEMsMHg5OTRELDB4OTk0RSwweDk5NEYsMHg5OTUwLDB4OTk1MSwvKiAweDgwLTB4ODcgKi8KKwkweDk5NTIsMHg5OTUzLDB4OTk1NiwweDk5NTcsMHg5OTU4LDB4OTk1OSwweDk5NUEsMHg5OTVCLC8qIDB4ODgtMHg4RiAqLworCTB4OTk1QywweDk5NUQsMHg5OTVFLDB4OTk1RiwweDk5NjAsMHg5OTYxLDB4OTk2MiwweDk5NjQsLyogMHg5MC0weDk3ICovCisJMHg5OTY2LDB4OTk3MywweDk5NzgsMHg5OTc5LDB4OTk3QiwweDk5N0UsMHg5OTgyLDB4OTk4MywvKiAweDk4LTB4OUYgKi8KKwkweDk5ODksMHg3QTM5LDB4N0EzNywweDdBNTEsMHg5RUNGLDB4OTlBNSwweDdBNzAsMHg3Njg4LC8qIDB4QTAtMHhBNyAqLworCTB4NzY4RSwweDc2OTMsMHg3Njk5LDB4NzZBNCwweDc0REUsMHg3NEUwLDB4NzUyQywweDlFMjAsLyogMHhBOC0weEFGICovCisJMHg5RTIyLDB4OUUyOCwweDlFMjksMHg5RTJBLDB4OUUyQiwweDlFMkMsMHg5RTMyLDB4OUUzMSwvKiAweEIwLTB4QjcgKi8KKwkweDlFMzYsMHg5RTM4LDB4OUUzNywweDlFMzksMHg5RTNBLDB4OUUzRSwweDlFNDEsMHg5RTQyLC8qIDB4QjgtMHhCRiAqLworCTB4OUU0NCwweDlFNDYsMHg5RTQ3LDB4OUU0OCwweDlFNDksMHg5RTRCLDB4OUU0QywweDlFNEUsLyogMHhDMC0weEM3ICovCisJMHg5RTUxLDB4OUU1NSwweDlFNTcsMHg5RTVBLDB4OUU1QiwweDlFNUMsMHg5RTVFLDB4OUU2MywvKiAweEM4LTB4Q0YgKi8KKwkweDlFNjYsMHg5RTY3LDB4OUU2OCwweDlFNjksMHg5RTZBLDB4OUU2QiwweDlFNkMsMHg5RTcxLC8qIDB4RDAtMHhENyAqLworCTB4OUU2RCwweDlFNzMsMHg3NTkyLDB4NzU5NCwweDc1OTYsMHg3NUEwLDB4NzU5RCwweDc1QUMsLyogMHhEOC0weERGICovCisJMHg3NUEzLDB4NzVCMywweDc1QjQsMHg3NUI4LDB4NzVDNCwweDc1QjEsMHg3NUIwLDB4NzVDMywvKiAweEUwLTB4RTcgKi8KKwkweDc1QzIsMHg3NUQ2LDB4NzVDRCwweDc1RTMsMHg3NUU4LDB4NzVFNiwweDc1RTQsMHg3NUVCLC8qIDB4RTgtMHhFRiAqLworCTB4NzVFNywweDc2MDMsMHg3NUYxLDB4NzVGQywweDc1RkYsMHg3NjEwLDB4NzYwMCwweDc2MDUsLyogMHhGMC0weEY3ICovCisJMHg3NjBDLDB4NzYxNywweDc2MEEsMHg3NjI1LDB4NzYxOCwweDc2MTUsMHg3NjE5LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GMVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDk5OEMsMHg5OThFLDB4OTk5QSwweDk5OUIsMHg5OTlDLDB4OTk5RCwweDk5OUUsMHg5OTlGLC8qIDB4NDAtMHg0NyAqLworCTB4OTlBMCwweDk5QTEsMHg5OUEyLDB4OTlBMywweDk5QTQsMHg5OUE2LDB4OTlBNywweDk5QTksLyogMHg0OC0weDRGICovCisJMHg5OUFBLDB4OTlBQiwweDk5QUMsMHg5OUFELDB4OTlBRSwweDk5QUYsMHg5OUIwLDB4OTlCMSwvKiAweDUwLTB4NTcgKi8KKwkweDk5QjIsMHg5OUIzLDB4OTlCNCwweDk5QjUsMHg5OUI2LDB4OTlCNywweDk5QjgsMHg5OUI5LC8qIDB4NTgtMHg1RiAqLworCTB4OTlCQSwweDk5QkIsMHg5OUJDLDB4OTlCRCwweDk5QkUsMHg5OUJGLDB4OTlDMCwweDk5QzEsLyogMHg2MC0weDY3ICovCisJMHg5OUMyLDB4OTlDMywweDk5QzQsMHg5OUM1LDB4OTlDNiwweDk5QzcsMHg5OUM4LDB4OTlDOSwvKiAweDY4LTB4NkYgKi8KKwkweDk5Q0EsMHg5OUNCLDB4OTlDQywweDk5Q0QsMHg5OUNFLDB4OTlDRiwweDk5RDAsMHg5OUQxLC8qIDB4NzAtMHg3NyAqLworCTB4OTlEMiwweDk5RDMsMHg5OUQ0LDB4OTlENSwweDk5RDYsMHg5OUQ3LDB4OTlEOCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDk5RDksMHg5OURBLDB4OTlEQiwweDk5REMsMHg5OURELDB4OTlERSwweDk5REYsMHg5OUUwLC8qIDB4ODAtMHg4NyAqLworCTB4OTlFMSwweDk5RTIsMHg5OUUzLDB4OTlFNCwweDk5RTUsMHg5OUU2LDB4OTlFNywweDk5RTgsLyogMHg4OC0weDhGICovCisJMHg5OUU5LDB4OTlFQSwweDk5RUIsMHg5OUVDLDB4OTlFRCwweDk5RUUsMHg5OUVGLDB4OTlGMCwvKiAweDkwLTB4OTcgKi8KKwkweDk5RjEsMHg5OUYyLDB4OTlGMywweDk5RjQsMHg5OUY1LDB4OTlGNiwweDk5RjcsMHg5OUY4LC8qIDB4OTgtMHg5RiAqLworCTB4OTlGOSwweDc2MUIsMHg3NjNDLDB4NzYyMiwweDc2MjAsMHg3NjQwLDB4NzYyRCwweDc2MzAsLyogMHhBMC0weEE3ICovCisJMHg3NjNGLDB4NzYzNSwweDc2NDMsMHg3NjNFLDB4NzYzMywweDc2NEQsMHg3NjVFLDB4NzY1NCwvKiAweEE4LTB4QUYgKi8KKwkweDc2NUMsMHg3NjU2LDB4NzY2QiwweDc2NkYsMHg3RkNBLDB4N0FFNiwweDdBNzgsMHg3QTc5LC8qIDB4QjAtMHhCNyAqLworCTB4N0E4MCwweDdBODYsMHg3QTg4LDB4N0E5NSwweDdBQTYsMHg3QUEwLDB4N0FBQywweDdBQTgsLyogMHhCOC0weEJGICovCisJMHg3QUFELDB4N0FCMywweDg4NjQsMHg4ODY5LDB4ODg3MiwweDg4N0QsMHg4ODdGLDB4ODg4MiwvKiAweEMwLTB4QzcgKi8KKwkweDg4QTIsMHg4OEM2LDB4ODhCNywweDg4QkMsMHg4OEM5LDB4ODhFMiwweDg4Q0UsMHg4OEUzLC8qIDB4QzgtMHhDRiAqLworCTB4ODhFNSwweDg4RjEsMHg4OTFBLDB4ODhGQywweDg4RTgsMHg4OEZFLDB4ODhGMCwweDg5MjEsLyogMHhEMC0weEQ3ICovCisJMHg4OTE5LDB4ODkxMywweDg5MUIsMHg4OTBBLDB4ODkzNCwweDg5MkIsMHg4OTM2LDB4ODk0MSwvKiAweEQ4LTB4REYgKi8KKwkweDg5NjYsMHg4OTdCLDB4NzU4QiwweDgwRTUsMHg3NkIyLDB4NzZCNCwweDc3REMsMHg4MDEyLC8qIDB4RTAtMHhFNyAqLworCTB4ODAxNCwweDgwMTYsMHg4MDFDLDB4ODAyMCwweDgwMjIsMHg4MDI1LDB4ODAyNiwweDgwMjcsLyogMHhFOC0weEVGICovCisJMHg4MDI5LDB4ODAyOCwweDgwMzEsMHg4MDBCLDB4ODAzNSwweDgwNDMsMHg4MDQ2LDB4ODA0RCwvKiAweEYwLTB4RjcgKi8KKwkweDgwNTIsMHg4MDY5LDB4ODA3MSwweDg5ODMsMHg5ODc4LDB4OTg4MCwweDk4ODMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0YyWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTlGQSwweDk5RkIsMHg5OUZDLDB4OTlGRCwweDk5RkUsMHg5OUZGLDB4OUEwMCwweDlBMDEsLyogMHg0MC0weDQ3ICovCisJMHg5QTAyLDB4OUEwMywweDlBMDQsMHg5QTA1LDB4OUEwNiwweDlBMDcsMHg5QTA4LDB4OUEwOSwvKiAweDQ4LTB4NEYgKi8KKwkweDlBMEEsMHg5QTBCLDB4OUEwQywweDlBMEQsMHg5QTBFLDB4OUEwRiwweDlBMTAsMHg5QTExLC8qIDB4NTAtMHg1NyAqLworCTB4OUExMiwweDlBMTMsMHg5QTE0LDB4OUExNSwweDlBMTYsMHg5QTE3LDB4OUExOCwweDlBMTksLyogMHg1OC0weDVGICovCisJMHg5QTFBLDB4OUExQiwweDlBMUMsMHg5QTFELDB4OUExRSwweDlBMUYsMHg5QTIwLDB4OUEyMSwvKiAweDYwLTB4NjcgKi8KKwkweDlBMjIsMHg5QTIzLDB4OUEyNCwweDlBMjUsMHg5QTI2LDB4OUEyNywweDlBMjgsMHg5QTI5LC8qIDB4NjgtMHg2RiAqLworCTB4OUEyQSwweDlBMkIsMHg5QTJDLDB4OUEyRCwweDlBMkUsMHg5QTJGLDB4OUEzMCwweDlBMzEsLyogMHg3MC0weDc3ICovCisJMHg5QTMyLDB4OUEzMywweDlBMzQsMHg5QTM1LDB4OUEzNiwweDlBMzcsMHg5QTM4LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OUEzOSwweDlBM0EsMHg5QTNCLDB4OUEzQywweDlBM0QsMHg5QTNFLDB4OUEzRiwweDlBNDAsLyogMHg4MC0weDg3ICovCisJMHg5QTQxLDB4OUE0MiwweDlBNDMsMHg5QTQ0LDB4OUE0NSwweDlBNDYsMHg5QTQ3LDB4OUE0OCwvKiAweDg4LTB4OEYgKi8KKwkweDlBNDksMHg5QTRBLDB4OUE0QiwweDlBNEMsMHg5QTRELDB4OUE0RSwweDlBNEYsMHg5QTUwLC8qIDB4OTAtMHg5NyAqLworCTB4OUE1MSwweDlBNTIsMHg5QTUzLDB4OUE1NCwweDlBNTUsMHg5QTU2LDB4OUE1NywweDlBNTgsLyogMHg5OC0weDlGICovCisJMHg5QTU5LDB4OTg4OSwweDk4OEMsMHg5ODhELDB4OTg4RiwweDk4OTQsMHg5ODlBLDB4OTg5QiwvKiAweEEwLTB4QTcgKi8KKwkweDk4OUUsMHg5ODlGLDB4OThBMSwweDk4QTIsMHg5OEE1LDB4OThBNiwweDg2NEQsMHg4NjU0LC8qIDB4QTgtMHhBRiAqLworCTB4ODY2QywweDg2NkUsMHg4NjdGLDB4ODY3QSwweDg2N0MsMHg4NjdCLDB4ODZBOCwweDg2OEQsLyogMHhCMC0weEI3ICovCisJMHg4NjhCLDB4ODZBQywweDg2OUQsMHg4NkE3LDB4ODZBMywweDg2QUEsMHg4NjkzLDB4ODZBOSwvKiAweEI4LTB4QkYgKi8KKwkweDg2QjYsMHg4NkM0LDB4ODZCNSwweDg2Q0UsMHg4NkIwLDB4ODZCQSwweDg2QjEsMHg4NkFGLC8qIDB4QzAtMHhDNyAqLworCTB4ODZDOSwweDg2Q0YsMHg4NkI0LDB4ODZFOSwweDg2RjEsMHg4NkYyLDB4ODZFRCwweDg2RjMsLyogMHhDOC0weENGICovCisJMHg4NkQwLDB4ODcxMywweDg2REUsMHg4NkY0LDB4ODZERiwweDg2RDgsMHg4NkQxLDB4ODcwMywvKiAweEQwLTB4RDcgKi8KKwkweDg3MDcsMHg4NkY4LDB4ODcwOCwweDg3MEEsMHg4NzBELDB4ODcwOSwweDg3MjMsMHg4NzNCLC8qIDB4RDgtMHhERiAqLworCTB4ODcxRSwweDg3MjUsMHg4NzJFLDB4ODcxQSwweDg3M0UsMHg4NzQ4LDB4ODczNCwweDg3MzEsLyogMHhFMC0weEU3ICovCisJMHg4NzI5LDB4ODczNywweDg3M0YsMHg4NzgyLDB4ODcyMiwweDg3N0QsMHg4NzdFLDB4ODc3QiwvKiAweEU4LTB4RUYgKi8KKwkweDg3NjAsMHg4NzcwLDB4ODc0QywweDg3NkUsMHg4NzhCLDB4ODc1MywweDg3NjMsMHg4NzdDLC8qIDB4RjAtMHhGNyAqLworCTB4ODc2NCwweDg3NTksMHg4NzY1LDB4ODc5MywweDg3QUYsMHg4N0E4LDB4ODdEMiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRjNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5QTVBLDB4OUE1QiwweDlBNUMsMHg5QTVELDB4OUE1RSwweDlBNUYsMHg5QTYwLDB4OUE2MSwvKiAweDQwLTB4NDcgKi8KKwkweDlBNjIsMHg5QTYzLDB4OUE2NCwweDlBNjUsMHg5QTY2LDB4OUE2NywweDlBNjgsMHg5QTY5LC8qIDB4NDgtMHg0RiAqLworCTB4OUE2QSwweDlBNkIsMHg5QTcyLDB4OUE4MywweDlBODksMHg5QThELDB4OUE4RSwweDlBOTQsLyogMHg1MC0weDU3ICovCisJMHg5QTk1LDB4OUE5OSwweDlBQTYsMHg5QUE5LDB4OUFBQSwweDlBQUIsMHg5QUFDLDB4OUFBRCwvKiAweDU4LTB4NUYgKi8KKwkweDlBQUUsMHg5QUFGLDB4OUFCMiwweDlBQjMsMHg5QUI0LDB4OUFCNSwweDlBQjksMHg5QUJCLC8qIDB4NjAtMHg2NyAqLworCTB4OUFCRCwweDlBQkUsMHg5QUJGLDB4OUFDMywweDlBQzQsMHg5QUM2LDB4OUFDNywweDlBQzgsLyogMHg2OC0weDZGICovCisJMHg5QUM5LDB4OUFDQSwweDlBQ0QsMHg5QUNFLDB4OUFDRiwweDlBRDAsMHg5QUQyLDB4OUFENCwvKiAweDcwLTB4NzcgKi8KKwkweDlBRDUsMHg5QUQ2LDB4OUFENywweDlBRDksMHg5QURBLDB4OUFEQiwweDlBREMsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5QURELDB4OUFERSwweDlBRTAsMHg5QUUyLDB4OUFFMywweDlBRTQsMHg5QUU1LDB4OUFFNywvKiAweDgwLTB4ODcgKi8KKwkweDlBRTgsMHg5QUU5LDB4OUFFQSwweDlBRUMsMHg5QUVFLDB4OUFGMCwweDlBRjEsMHg5QUYyLC8qIDB4ODgtMHg4RiAqLworCTB4OUFGMywweDlBRjQsMHg5QUY1LDB4OUFGNiwweDlBRjcsMHg5QUY4LDB4OUFGQSwweDlBRkMsLyogMHg5MC0weDk3ICovCisJMHg5QUZELDB4OUFGRSwweDlBRkYsMHg5QjAwLDB4OUIwMSwweDlCMDIsMHg5QjA0LDB4OUIwNSwvKiAweDk4LTB4OUYgKi8KKwkweDlCMDYsMHg4N0M2LDB4ODc4OCwweDg3ODUsMHg4N0FELDB4ODc5NywweDg3ODMsMHg4N0FCLC8qIDB4QTAtMHhBNyAqLworCTB4ODdFNSwweDg3QUMsMHg4N0I1LDB4ODdCMywweDg3Q0IsMHg4N0QzLDB4ODdCRCwweDg3RDEsLyogMHhBOC0weEFGICovCisJMHg4N0MwLDB4ODdDQSwweDg3REIsMHg4N0VBLDB4ODdFMCwweDg3RUUsMHg4ODE2LDB4ODgxMywvKiAweEIwLTB4QjcgKi8KKwkweDg3RkUsMHg4ODBBLDB4ODgxQiwweDg4MjEsMHg4ODM5LDB4ODgzQywweDdGMzYsMHg3RjQyLC8qIDB4QjgtMHhCRiAqLworCTB4N0Y0NCwweDdGNDUsMHg4MjEwLDB4N0FGQSwweDdBRkQsMHg3QjA4LDB4N0IwMywweDdCMDQsLyogMHhDMC0weEM3ICovCisJMHg3QjE1LDB4N0IwQSwweDdCMkIsMHg3QjBGLDB4N0I0NywweDdCMzgsMHg3QjJBLDB4N0IxOSwvKiAweEM4LTB4Q0YgKi8KKwkweDdCMkUsMHg3QjMxLDB4N0IyMCwweDdCMjUsMHg3QjI0LDB4N0IzMywweDdCM0UsMHg3QjFFLC8qIDB4RDAtMHhENyAqLworCTB4N0I1OCwweDdCNUEsMHg3QjQ1LDB4N0I3NSwweDdCNEMsMHg3QjVELDB4N0I2MCwweDdCNkUsLyogMHhEOC0weERGICovCisJMHg3QjdCLDB4N0I2MiwweDdCNzIsMHg3QjcxLDB4N0I5MCwweDdCQTYsMHg3QkE3LDB4N0JCOCwvKiAweEUwLTB4RTcgKi8KKwkweDdCQUMsMHg3QjlELDB4N0JBOCwweDdCODUsMHg3QkFBLDB4N0I5QywweDdCQTIsMHg3QkFCLC8qIDB4RTgtMHhFRiAqLworCTB4N0JCNCwweDdCRDEsMHg3QkMxLDB4N0JDQywweDdCREQsMHg3QkRBLDB4N0JFNSwweDdCRTYsLyogMHhGMC0weEY3ICovCisJMHg3QkVBLDB4N0MwQywweDdCRkUsMHg3QkZDLDB4N0MwRiwweDdDMTYsMHg3QzBCLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GNFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDlCMDcsMHg5QjA5LDB4OUIwQSwweDlCMEIsMHg5QjBDLDB4OUIwRCwweDlCMEUsMHg5QjEwLC8qIDB4NDAtMHg0NyAqLworCTB4OUIxMSwweDlCMTIsMHg5QjE0LDB4OUIxNSwweDlCMTYsMHg5QjE3LDB4OUIxOCwweDlCMTksLyogMHg0OC0weDRGICovCisJMHg5QjFBLDB4OUIxQiwweDlCMUMsMHg5QjFELDB4OUIxRSwweDlCMjAsMHg5QjIxLDB4OUIyMiwvKiAweDUwLTB4NTcgKi8KKwkweDlCMjQsMHg5QjI1LDB4OUIyNiwweDlCMjcsMHg5QjI4LDB4OUIyOSwweDlCMkEsMHg5QjJCLC8qIDB4NTgtMHg1RiAqLworCTB4OUIyQywweDlCMkQsMHg5QjJFLDB4OUIzMCwweDlCMzEsMHg5QjMzLDB4OUIzNCwweDlCMzUsLyogMHg2MC0weDY3ICovCisJMHg5QjM2LDB4OUIzNywweDlCMzgsMHg5QjM5LDB4OUIzQSwweDlCM0QsMHg5QjNFLDB4OUIzRiwvKiAweDY4LTB4NkYgKi8KKwkweDlCNDAsMHg5QjQ2LDB4OUI0QSwweDlCNEIsMHg5QjRDLDB4OUI0RSwweDlCNTAsMHg5QjUyLC8qIDB4NzAtMHg3NyAqLworCTB4OUI1MywweDlCNTUsMHg5QjU2LDB4OUI1NywweDlCNTgsMHg5QjU5LDB4OUI1QSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDlCNUIsMHg5QjVDLDB4OUI1RCwweDlCNUUsMHg5QjVGLDB4OUI2MCwweDlCNjEsMHg5QjYyLC8qIDB4ODAtMHg4NyAqLworCTB4OUI2MywweDlCNjQsMHg5QjY1LDB4OUI2NiwweDlCNjcsMHg5QjY4LDB4OUI2OSwweDlCNkEsLyogMHg4OC0weDhGICovCisJMHg5QjZCLDB4OUI2QywweDlCNkQsMHg5QjZFLDB4OUI2RiwweDlCNzAsMHg5QjcxLDB4OUI3MiwvKiAweDkwLTB4OTcgKi8KKwkweDlCNzMsMHg5Qjc0LDB4OUI3NSwweDlCNzYsMHg5Qjc3LDB4OUI3OCwweDlCNzksMHg5QjdBLC8qIDB4OTgtMHg5RiAqLworCTB4OUI3QiwweDdDMUYsMHg3QzJBLDB4N0MyNiwweDdDMzgsMHg3QzQxLDB4N0M0MCwweDgxRkUsLyogMHhBMC0weEE3ICovCisJMHg4MjAxLDB4ODIwMiwweDgyMDQsMHg4MUVDLDB4ODg0NCwweDgyMjEsMHg4MjIyLDB4ODIyMywvKiAweEE4LTB4QUYgKi8KKwkweDgyMkQsMHg4MjJGLDB4ODIyOCwweDgyMkIsMHg4MjM4LDB4ODIzQiwweDgyMzMsMHg4MjM0LC8qIDB4QjAtMHhCNyAqLworCTB4ODIzRSwweDgyNDQsMHg4MjQ5LDB4ODI0QiwweDgyNEYsMHg4MjVBLDB4ODI1RiwweDgyNjgsLyogMHhCOC0weEJGICovCisJMHg4ODdFLDB4ODg4NSwweDg4ODgsMHg4OEQ4LDB4ODhERiwweDg5NUUsMHg3RjlELDB4N0Y5RiwvKiAweEMwLTB4QzcgKi8KKwkweDdGQTcsMHg3RkFGLDB4N0ZCMCwweDdGQjIsMHg3QzdDLDB4NjU0OSwweDdDOTEsMHg3QzlELC8qIDB4QzgtMHhDRiAqLworCTB4N0M5QywweDdDOUUsMHg3Q0EyLDB4N0NCMiwweDdDQkMsMHg3Q0JELDB4N0NDMSwweDdDQzcsLyogMHhEMC0weEQ3ICovCisJMHg3Q0NDLDB4N0NDRCwweDdDQzgsMHg3Q0M1LDB4N0NENywweDdDRTgsMHg4MjZFLDB4NjZBOCwvKiAweEQ4LTB4REYgKi8KKwkweDdGQkYsMHg3RkNFLDB4N0ZENSwweDdGRTUsMHg3RkUxLDB4N0ZFNiwweDdGRTksMHg3RkVFLC8qIDB4RTAtMHhFNyAqLworCTB4N0ZGMywweDdDRjgsMHg3RDc3LDB4N0RBNiwweDdEQUUsMHg3RTQ3LDB4N0U5QiwweDlFQjgsLyogMHhFOC0weEVGICovCisJMHg5RUI0LDB4OEQ3MywweDhEODQsMHg4RDk0LDB4OEQ5MSwweDhEQjEsMHg4RDY3LDB4OEQ2RCwvKiAweEYwLTB4RjcgKi8KKwkweDhDNDcsMHg4QzQ5LDB4OTE0QSwweDkxNTAsMHg5MTRFLDB4OTE0RiwweDkxNjQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Y1WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OUI3QywweDlCN0QsMHg5QjdFLDB4OUI3RiwweDlCODAsMHg5QjgxLDB4OUI4MiwweDlCODMsLyogMHg0MC0weDQ3ICovCisJMHg5Qjg0LDB4OUI4NSwweDlCODYsMHg5Qjg3LDB4OUI4OCwweDlCODksMHg5QjhBLDB4OUI4QiwvKiAweDQ4LTB4NEYgKi8KKwkweDlCOEMsMHg5QjhELDB4OUI4RSwweDlCOEYsMHg5QjkwLDB4OUI5MSwweDlCOTIsMHg5QjkzLC8qIDB4NTAtMHg1NyAqLworCTB4OUI5NCwweDlCOTUsMHg5Qjk2LDB4OUI5NywweDlCOTgsMHg5Qjk5LDB4OUI5QSwweDlCOUIsLyogMHg1OC0weDVGICovCisJMHg5QjlDLDB4OUI5RCwweDlCOUUsMHg5QjlGLDB4OUJBMCwweDlCQTEsMHg5QkEyLDB4OUJBMywvKiAweDYwLTB4NjcgKi8KKwkweDlCQTQsMHg5QkE1LDB4OUJBNiwweDlCQTcsMHg5QkE4LDB4OUJBOSwweDlCQUEsMHg5QkFCLC8qIDB4NjgtMHg2RiAqLworCTB4OUJBQywweDlCQUQsMHg5QkFFLDB4OUJBRiwweDlCQjAsMHg5QkIxLDB4OUJCMiwweDlCQjMsLyogMHg3MC0weDc3ICovCisJMHg5QkI0LDB4OUJCNSwweDlCQjYsMHg5QkI3LDB4OUJCOCwweDlCQjksMHg5QkJBLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OUJCQiwweDlCQkMsMHg5QkJELDB4OUJCRSwweDlCQkYsMHg5QkMwLDB4OUJDMSwweDlCQzIsLyogMHg4MC0weDg3ICovCisJMHg5QkMzLDB4OUJDNCwweDlCQzUsMHg5QkM2LDB4OUJDNywweDlCQzgsMHg5QkM5LDB4OUJDQSwvKiAweDg4LTB4OEYgKi8KKwkweDlCQ0IsMHg5QkNDLDB4OUJDRCwweDlCQ0UsMHg5QkNGLDB4OUJEMCwweDlCRDEsMHg5QkQyLC8qIDB4OTAtMHg5NyAqLworCTB4OUJEMywweDlCRDQsMHg5QkQ1LDB4OUJENiwweDlCRDcsMHg5QkQ4LDB4OUJEOSwweDlCREEsLyogMHg5OC0weDlGICovCisJMHg5QkRCLDB4OTE2MiwweDkxNjEsMHg5MTcwLDB4OTE2OSwweDkxNkYsMHg5MTdELDB4OTE3RSwvKiAweEEwLTB4QTcgKi8KKwkweDkxNzIsMHg5MTc0LDB4OTE3OSwweDkxOEMsMHg5MTg1LDB4OTE5MCwweDkxOEQsMHg5MTkxLC8qIDB4QTgtMHhBRiAqLworCTB4OTFBMiwweDkxQTMsMHg5MUFBLDB4OTFBRCwweDkxQUUsMHg5MUFGLDB4OTFCNSwweDkxQjQsLyogMHhCMC0weEI3ICovCisJMHg5MUJBLDB4OEM1NSwweDlFN0UsMHg4REI4LDB4OERFQiwweDhFMDUsMHg4RTU5LDB4OEU2OSwvKiAweEI4LTB4QkYgKi8KKwkweDhEQjUsMHg4REJGLDB4OERCQywweDhEQkEsMHg4REM0LDB4OERENiwweDhERDcsMHg4RERBLC8qIDB4QzAtMHhDNyAqLworCTB4OERERSwweDhEQ0UsMHg4RENGLDB4OEREQiwweDhEQzYsMHg4REVDLDB4OERGNywweDhERjgsLyogMHhDOC0weENGICovCisJMHg4REUzLDB4OERGOSwweDhERkIsMHg4REU0LDB4OEUwOSwweDhERkQsMHg4RTE0LDB4OEUxRCwvKiAweEQwLTB4RDcgKi8KKwkweDhFMUYsMHg4RTJDLDB4OEUyRSwweDhFMjMsMHg4RTJGLDB4OEUzQSwweDhFNDAsMHg4RTM5LC8qIDB4RDgtMHhERiAqLworCTB4OEUzNSwweDhFM0QsMHg4RTMxLDB4OEU0OSwweDhFNDEsMHg4RTQyLDB4OEU1MSwweDhFNTIsLyogMHhFMC0weEU3ICovCisJMHg4RTRBLDB4OEU3MCwweDhFNzYsMHg4RTdDLDB4OEU2RiwweDhFNzQsMHg4RTg1LDB4OEU4RiwvKiAweEU4LTB4RUYgKi8KKwkweDhFOTQsMHg4RTkwLDB4OEU5QywweDhFOUUsMHg4Qzc4LDB4OEM4MiwweDhDOEEsMHg4Qzg1LC8qIDB4RjAtMHhGNyAqLworCTB4OEM5OCwweDhDOTQsMHg2NTlCLDB4ODlENiwweDg5REUsMHg4OURBLDB4ODlEQywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRjZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5QkRDLDB4OUJERCwweDlCREUsMHg5QkRGLDB4OUJFMCwweDlCRTEsMHg5QkUyLDB4OUJFMywvKiAweDQwLTB4NDcgKi8KKwkweDlCRTQsMHg5QkU1LDB4OUJFNiwweDlCRTcsMHg5QkU4LDB4OUJFOSwweDlCRUEsMHg5QkVCLC8qIDB4NDgtMHg0RiAqLworCTB4OUJFQywweDlCRUQsMHg5QkVFLDB4OUJFRiwweDlCRjAsMHg5QkYxLDB4OUJGMiwweDlCRjMsLyogMHg1MC0weDU3ICovCisJMHg5QkY0LDB4OUJGNSwweDlCRjYsMHg5QkY3LDB4OUJGOCwweDlCRjksMHg5QkZBLDB4OUJGQiwvKiAweDU4LTB4NUYgKi8KKwkweDlCRkMsMHg5QkZELDB4OUJGRSwweDlCRkYsMHg5QzAwLDB4OUMwMSwweDlDMDIsMHg5QzAzLC8qIDB4NjAtMHg2NyAqLworCTB4OUMwNCwweDlDMDUsMHg5QzA2LDB4OUMwNywweDlDMDgsMHg5QzA5LDB4OUMwQSwweDlDMEIsLyogMHg2OC0weDZGICovCisJMHg5QzBDLDB4OUMwRCwweDlDMEUsMHg5QzBGLDB4OUMxMCwweDlDMTEsMHg5QzEyLDB4OUMxMywvKiAweDcwLTB4NzcgKi8KKwkweDlDMTQsMHg5QzE1LDB4OUMxNiwweDlDMTcsMHg5QzE4LDB4OUMxOSwweDlDMUEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5QzFCLDB4OUMxQywweDlDMUQsMHg5QzFFLDB4OUMxRiwweDlDMjAsMHg5QzIxLDB4OUMyMiwvKiAweDgwLTB4ODcgKi8KKwkweDlDMjMsMHg5QzI0LDB4OUMyNSwweDlDMjYsMHg5QzI3LDB4OUMyOCwweDlDMjksMHg5QzJBLC8qIDB4ODgtMHg4RiAqLworCTB4OUMyQiwweDlDMkMsMHg5QzJELDB4OUMyRSwweDlDMkYsMHg5QzMwLDB4OUMzMSwweDlDMzIsLyogMHg5MC0weDk3ICovCisJMHg5QzMzLDB4OUMzNCwweDlDMzUsMHg5QzM2LDB4OUMzNywweDlDMzgsMHg5QzM5LDB4OUMzQSwvKiAweDk4LTB4OUYgKi8KKwkweDlDM0IsMHg4OUU1LDB4ODlFQiwweDg5RUYsMHg4QTNFLDB4OEIyNiwweDk3NTMsMHg5NkU5LC8qIDB4QTAtMHhBNyAqLworCTB4OTZGMywweDk2RUYsMHg5NzA2LDB4OTcwMSwweDk3MDgsMHg5NzBGLDB4OTcwRSwweDk3MkEsLyogMHhBOC0weEFGICovCisJMHg5NzJELDB4OTczMCwweDk3M0UsMHg5RjgwLDB4OUY4MywweDlGODUsMHg5Rjg2LDB4OUY4NywvKiAweEIwLTB4QjcgKi8KKwkweDlGODgsMHg5Rjg5LDB4OUY4QSwweDlGOEMsMHg5RUZFLDB4OUYwQiwweDlGMEQsMHg5NkI5LC8qIDB4QjgtMHhCRiAqLworCTB4OTZCQywweDk2QkQsMHg5NkNFLDB4OTZEMiwweDc3QkYsMHg5NkUwLDB4OTI4RSwweDkyQUUsLyogMHhDMC0weEM3ICovCisJMHg5MkM4LDB4OTMzRSwweDkzNkEsMHg5M0NBLDB4OTM4RiwweDk0M0UsMHg5NDZCLDB4OUM3RiwvKiAweEM4LTB4Q0YgKi8KKwkweDlDODIsMHg5Qzg1LDB4OUM4NiwweDlDODcsMHg5Qzg4LDB4N0EyMywweDlDOEIsMHg5QzhFLC8qIDB4RDAtMHhENyAqLworCTB4OUM5MCwweDlDOTEsMHg5QzkyLDB4OUM5NCwweDlDOTUsMHg5QzlBLDB4OUM5QiwweDlDOUUsLyogMHhEOC0weERGICovCisJMHg5QzlGLDB4OUNBMCwweDlDQTEsMHg5Q0EyLDB4OUNBMywweDlDQTUsMHg5Q0E2LDB4OUNBNywvKiAweEUwLTB4RTcgKi8KKwkweDlDQTgsMHg5Q0E5LDB4OUNBQiwweDlDQUQsMHg5Q0FFLDB4OUNCMCwweDlDQjEsMHg5Q0IyLC8qIDB4RTgtMHhFRiAqLworCTB4OUNCMywweDlDQjQsMHg5Q0I1LDB4OUNCNiwweDlDQjcsMHg5Q0JBLDB4OUNCQiwweDlDQkMsLyogMHhGMC0weEY3ICovCisJMHg5Q0JELDB4OUNDNCwweDlDQzUsMHg5Q0M2LDB4OUNDNywweDlDQ0EsMHg5Q0NCLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GN1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDlDM0MsMHg5QzNELDB4OUMzRSwweDlDM0YsMHg5QzQwLDB4OUM0MSwweDlDNDIsMHg5QzQzLC8qIDB4NDAtMHg0NyAqLworCTB4OUM0NCwweDlDNDUsMHg5QzQ2LDB4OUM0NywweDlDNDgsMHg5QzQ5LDB4OUM0QSwweDlDNEIsLyogMHg0OC0weDRGICovCisJMHg5QzRDLDB4OUM0RCwweDlDNEUsMHg5QzRGLDB4OUM1MCwweDlDNTEsMHg5QzUyLDB4OUM1MywvKiAweDUwLTB4NTcgKi8KKwkweDlDNTQsMHg5QzU1LDB4OUM1NiwweDlDNTcsMHg5QzU4LDB4OUM1OSwweDlDNUEsMHg5QzVCLC8qIDB4NTgtMHg1RiAqLworCTB4OUM1QywweDlDNUQsMHg5QzVFLDB4OUM1RiwweDlDNjAsMHg5QzYxLDB4OUM2MiwweDlDNjMsLyogMHg2MC0weDY3ICovCisJMHg5QzY0LDB4OUM2NSwweDlDNjYsMHg5QzY3LDB4OUM2OCwweDlDNjksMHg5QzZBLDB4OUM2QiwvKiAweDY4LTB4NkYgKi8KKwkweDlDNkMsMHg5QzZELDB4OUM2RSwweDlDNkYsMHg5QzcwLDB4OUM3MSwweDlDNzIsMHg5QzczLC8qIDB4NzAtMHg3NyAqLworCTB4OUM3NCwweDlDNzUsMHg5Qzc2LDB4OUM3NywweDlDNzgsMHg5Qzc5LDB4OUM3QSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDlDN0IsMHg5QzdELDB4OUM3RSwweDlDODAsMHg5QzgzLDB4OUM4NCwweDlDODksMHg5QzhBLC8qIDB4ODAtMHg4NyAqLworCTB4OUM4QywweDlDOEYsMHg5QzkzLDB4OUM5NiwweDlDOTcsMHg5Qzk4LDB4OUM5OSwweDlDOUQsLyogMHg4OC0weDhGICovCisJMHg5Q0FBLDB4OUNBQywweDlDQUYsMHg5Q0I5LDB4OUNCRSwweDlDQkYsMHg5Q0MwLDB4OUNDMSwvKiAweDkwLTB4OTcgKi8KKwkweDlDQzIsMHg5Q0M4LDB4OUNDOSwweDlDRDEsMHg5Q0QyLDB4OUNEQSwweDlDREIsMHg5Q0UwLC8qIDB4OTgtMHg5RiAqLworCTB4OUNFMSwweDlDQ0MsMHg5Q0NELDB4OUNDRSwweDlDQ0YsMHg5Q0QwLDB4OUNEMywweDlDRDQsLyogMHhBMC0weEE3ICovCisJMHg5Q0Q1LDB4OUNENywweDlDRDgsMHg5Q0Q5LDB4OUNEQywweDlDREQsMHg5Q0RGLDB4OUNFMiwvKiAweEE4LTB4QUYgKi8KKwkweDk3N0MsMHg5Nzg1LDB4OTc5MSwweDk3OTIsMHg5Nzk0LDB4OTdBRiwweDk3QUIsMHg5N0EzLC8qIDB4QjAtMHhCNyAqLworCTB4OTdCMiwweDk3QjQsMHg5QUIxLDB4OUFCMCwweDlBQjcsMHg5RTU4LDB4OUFCNiwweDlBQkEsLyogMHhCOC0weEJGICovCisJMHg5QUJDLDB4OUFDMSwweDlBQzAsMHg5QUM1LDB4OUFDMiwweDlBQ0IsMHg5QUNDLDB4OUFEMSwvKiAweEMwLTB4QzcgKi8KKwkweDlCNDUsMHg5QjQzLDB4OUI0NywweDlCNDksMHg5QjQ4LDB4OUI0RCwweDlCNTEsMHg5OEU4LC8qIDB4QzgtMHhDRiAqLworCTB4OTkwRCwweDk5MkUsMHg5OTU1LDB4OTk1NCwweDlBREYsMHg5QUUxLDB4OUFFNiwweDlBRUYsLyogMHhEMC0weEQ3ICovCisJMHg5QUVCLDB4OUFGQiwweDlBRUQsMHg5QUY5LDB4OUIwOCwweDlCMEYsMHg5QjEzLDB4OUIxRiwvKiAweEQ4LTB4REYgKi8KKwkweDlCMjMsMHg5RUJELDB4OUVCRSwweDdFM0IsMHg5RTgyLDB4OUU4NywweDlFODgsMHg5RThCLC8qIDB4RTAtMHhFNyAqLworCTB4OUU5MiwweDkzRDYsMHg5RTlELDB4OUU5RiwweDlFREIsMHg5RURDLDB4OUVERCwweDlFRTAsLyogMHhFOC0weEVGICovCisJMHg5RURGLDB4OUVFMiwweDlFRTksMHg5RUU3LDB4OUVFNSwweDlFRUEsMHg5RUVGLDB4OUYyMiwvKiAweEYwLTB4RjcgKi8KKwkweDlGMkMsMHg5RjJGLDB4OUYzOSwweDlGMzcsMHg5RjNELDB4OUYzRSwweDlGNDQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Y4WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OUNFMywweDlDRTQsMHg5Q0U1LDB4OUNFNiwweDlDRTcsMHg5Q0U4LDB4OUNFOSwweDlDRUEsLyogMHg0MC0weDQ3ICovCisJMHg5Q0VCLDB4OUNFQywweDlDRUQsMHg5Q0VFLDB4OUNFRiwweDlDRjAsMHg5Q0YxLDB4OUNGMiwvKiAweDQ4LTB4NEYgKi8KKwkweDlDRjMsMHg5Q0Y0LDB4OUNGNSwweDlDRjYsMHg5Q0Y3LDB4OUNGOCwweDlDRjksMHg5Q0ZBLC8qIDB4NTAtMHg1NyAqLworCTB4OUNGQiwweDlDRkMsMHg5Q0ZELDB4OUNGRSwweDlDRkYsMHg5RDAwLDB4OUQwMSwweDlEMDIsLyogMHg1OC0weDVGICovCisJMHg5RDAzLDB4OUQwNCwweDlEMDUsMHg5RDA2LDB4OUQwNywweDlEMDgsMHg5RDA5LDB4OUQwQSwvKiAweDYwLTB4NjcgKi8KKwkweDlEMEIsMHg5RDBDLDB4OUQwRCwweDlEMEUsMHg5RDBGLDB4OUQxMCwweDlEMTEsMHg5RDEyLC8qIDB4NjgtMHg2RiAqLworCTB4OUQxMywweDlEMTQsMHg5RDE1LDB4OUQxNiwweDlEMTcsMHg5RDE4LDB4OUQxOSwweDlEMUEsLyogMHg3MC0weDc3ICovCisJMHg5RDFCLDB4OUQxQywweDlEMUQsMHg5RDFFLDB4OUQxRiwweDlEMjAsMHg5RDIxLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OUQyMiwweDlEMjMsMHg5RDI0LDB4OUQyNSwweDlEMjYsMHg5RDI3LDB4OUQyOCwweDlEMjksLyogMHg4MC0weDg3ICovCisJMHg5RDJBLDB4OUQyQiwweDlEMkMsMHg5RDJELDB4OUQyRSwweDlEMkYsMHg5RDMwLDB4OUQzMSwvKiAweDg4LTB4OEYgKi8KKwkweDlEMzIsMHg5RDMzLDB4OUQzNCwweDlEMzUsMHg5RDM2LDB4OUQzNywweDlEMzgsMHg5RDM5LC8qIDB4OTAtMHg5NyAqLworCTB4OUQzQSwweDlEM0IsMHg5RDNDLDB4OUQzRCwweDlEM0UsMHg5RDNGLDB4OUQ0MCwweDlENDEsLyogMHg5OC0weDlGICovCisJMHg5RDQyLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEEwLTB4QTcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GOVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDlENDMsMHg5RDQ0LDB4OUQ0NSwweDlENDYsMHg5RDQ3LDB4OUQ0OCwweDlENDksMHg5RDRBLC8qIDB4NDAtMHg0NyAqLworCTB4OUQ0QiwweDlENEMsMHg5RDRELDB4OUQ0RSwweDlENEYsMHg5RDUwLDB4OUQ1MSwweDlENTIsLyogMHg0OC0weDRGICovCisJMHg5RDUzLDB4OUQ1NCwweDlENTUsMHg5RDU2LDB4OUQ1NywweDlENTgsMHg5RDU5LDB4OUQ1QSwvKiAweDUwLTB4NTcgKi8KKwkweDlENUIsMHg5RDVDLDB4OUQ1RCwweDlENUUsMHg5RDVGLDB4OUQ2MCwweDlENjEsMHg5RDYyLC8qIDB4NTgtMHg1RiAqLworCTB4OUQ2MywweDlENjQsMHg5RDY1LDB4OUQ2NiwweDlENjcsMHg5RDY4LDB4OUQ2OSwweDlENkEsLyogMHg2MC0weDY3ICovCisJMHg5RDZCLDB4OUQ2QywweDlENkQsMHg5RDZFLDB4OUQ2RiwweDlENzAsMHg5RDcxLDB4OUQ3MiwvKiAweDY4LTB4NkYgKi8KKwkweDlENzMsMHg5RDc0LDB4OUQ3NSwweDlENzYsMHg5RDc3LDB4OUQ3OCwweDlENzksMHg5RDdBLC8qIDB4NzAtMHg3NyAqLworCTB4OUQ3QiwweDlEN0MsMHg5RDdELDB4OUQ3RSwweDlEN0YsMHg5RDgwLDB4OUQ4MSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDlEODIsMHg5RDgzLDB4OUQ4NCwweDlEODUsMHg5RDg2LDB4OUQ4NywweDlEODgsMHg5RDg5LC8qIDB4ODAtMHg4NyAqLworCTB4OUQ4QSwweDlEOEIsMHg5RDhDLDB4OUQ4RCwweDlEOEUsMHg5RDhGLDB4OUQ5MCwweDlEOTEsLyogMHg4OC0weDhGICovCisJMHg5RDkyLDB4OUQ5MywweDlEOTQsMHg5RDk1LDB4OUQ5NiwweDlEOTcsMHg5RDk4LDB4OUQ5OSwvKiAweDkwLTB4OTcgKi8KKwkweDlEOUEsMHg5RDlCLDB4OUQ5QywweDlEOUQsMHg5RDlFLDB4OUQ5RiwweDlEQTAsMHg5REExLC8qIDB4OTgtMHg5RiAqLworCTB4OURBMiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhBMC0weEE3ICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRkFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5REEzLDB4OURBNCwweDlEQTUsMHg5REE2LDB4OURBNywweDlEQTgsMHg5REE5LDB4OURBQSwvKiAweDQwLTB4NDcgKi8KKwkweDlEQUIsMHg5REFDLDB4OURBRCwweDlEQUUsMHg5REFGLDB4OURCMCwweDlEQjEsMHg5REIyLC8qIDB4NDgtMHg0RiAqLworCTB4OURCMywweDlEQjQsMHg5REI1LDB4OURCNiwweDlEQjcsMHg5REI4LDB4OURCOSwweDlEQkEsLyogMHg1MC0weDU3ICovCisJMHg5REJCLDB4OURCQywweDlEQkQsMHg5REJFLDB4OURCRiwweDlEQzAsMHg5REMxLDB4OURDMiwvKiAweDU4LTB4NUYgKi8KKwkweDlEQzMsMHg5REM0LDB4OURDNSwweDlEQzYsMHg5REM3LDB4OURDOCwweDlEQzksMHg5RENBLC8qIDB4NjAtMHg2NyAqLworCTB4OURDQiwweDlEQ0MsMHg5RENELDB4OURDRSwweDlEQ0YsMHg5REQwLDB4OUREMSwweDlERDIsLyogMHg2OC0weDZGICovCisJMHg5REQzLDB4OURENCwweDlERDUsMHg5REQ2LDB4OURENywweDlERDgsMHg5REQ5LDB4OUREQSwvKiAweDcwLTB4NzcgKi8KKwkweDlEREIsMHg5RERDLDB4OURERCwweDlEREUsMHg5RERGLDB4OURFMCwweDlERTEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5REUyLDB4OURFMywweDlERTQsMHg5REU1LDB4OURFNiwweDlERTcsMHg5REU4LDB4OURFOSwvKiAweDgwLTB4ODcgKi8KKwkweDlERUEsMHg5REVCLDB4OURFQywweDlERUQsMHg5REVFLDB4OURFRiwweDlERjAsMHg5REYxLC8qIDB4ODgtMHg4RiAqLworCTB4OURGMiwweDlERjMsMHg5REY0LDB4OURGNSwweDlERjYsMHg5REY3LDB4OURGOCwweDlERjksLyogMHg5MC0weDk3ICovCisJMHg5REZBLDB4OURGQiwweDlERkMsMHg5REZELDB4OURGRSwweDlERkYsMHg5RTAwLDB4OUUwMSwvKiAweDk4LTB4OUYgKi8KKwkweDlFMDIsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QTAtMHhBNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0ZCWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OUUwMywweDlFMDQsMHg5RTA1LDB4OUUwNiwweDlFMDcsMHg5RTA4LDB4OUUwOSwweDlFMEEsLyogMHg0MC0weDQ3ICovCisJMHg5RTBCLDB4OUUwQywweDlFMEQsMHg5RTBFLDB4OUUwRiwweDlFMTAsMHg5RTExLDB4OUUxMiwvKiAweDQ4LTB4NEYgKi8KKwkweDlFMTMsMHg5RTE0LDB4OUUxNSwweDlFMTYsMHg5RTE3LDB4OUUxOCwweDlFMTksMHg5RTFBLC8qIDB4NTAtMHg1NyAqLworCTB4OUUxQiwweDlFMUMsMHg5RTFELDB4OUUxRSwweDlFMjQsMHg5RTI3LDB4OUUyRSwweDlFMzAsLyogMHg1OC0weDVGICovCisJMHg5RTM0LDB4OUUzQiwweDlFM0MsMHg5RTQwLDB4OUU0RCwweDlFNTAsMHg5RTUyLDB4OUU1MywvKiAweDYwLTB4NjcgKi8KKwkweDlFNTQsMHg5RTU2LDB4OUU1OSwweDlFNUQsMHg5RTVGLDB4OUU2MCwweDlFNjEsMHg5RTYyLC8qIDB4NjgtMHg2RiAqLworCTB4OUU2NSwweDlFNkUsMHg5RTZGLDB4OUU3MiwweDlFNzQsMHg5RTc1LDB4OUU3NiwweDlFNzcsLyogMHg3MC0weDc3ICovCisJMHg5RTc4LDB4OUU3OSwweDlFN0EsMHg5RTdCLDB4OUU3QywweDlFN0QsMHg5RTgwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OUU4MSwweDlFODMsMHg5RTg0LDB4OUU4NSwweDlFODYsMHg5RTg5LDB4OUU4QSwweDlFOEMsLyogMHg4MC0weDg3ICovCisJMHg5RThELDB4OUU4RSwweDlFOEYsMHg5RTkwLDB4OUU5MSwweDlFOTQsMHg5RTk1LDB4OUU5NiwvKiAweDg4LTB4OEYgKi8KKwkweDlFOTcsMHg5RTk4LDB4OUU5OSwweDlFOUEsMHg5RTlCLDB4OUU5QywweDlFOUUsMHg5RUEwLC8qIDB4OTAtMHg5NyAqLworCTB4OUVBMSwweDlFQTIsMHg5RUEzLDB4OUVBNCwweDlFQTUsMHg5RUE3LDB4OUVBOCwweDlFQTksLyogMHg5OC0weDlGICovCisJMHg5RUFBLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEEwLTB4QTcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GQ1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDlFQUIsMHg5RUFDLDB4OUVBRCwweDlFQUUsMHg5RUFGLDB4OUVCMCwweDlFQjEsMHg5RUIyLC8qIDB4NDAtMHg0NyAqLworCTB4OUVCMywweDlFQjUsMHg5RUI2LDB4OUVCNywweDlFQjksMHg5RUJBLDB4OUVCQywweDlFQkYsLyogMHg0OC0weDRGICovCisJMHg5RUMwLDB4OUVDMSwweDlFQzIsMHg5RUMzLDB4OUVDNSwweDlFQzYsMHg5RUM3LDB4OUVDOCwvKiAweDUwLTB4NTcgKi8KKwkweDlFQ0EsMHg5RUNCLDB4OUVDQywweDlFRDAsMHg5RUQyLDB4OUVEMywweDlFRDUsMHg5RUQ2LC8qIDB4NTgtMHg1RiAqLworCTB4OUVENywweDlFRDksMHg5RURBLDB4OUVERSwweDlFRTEsMHg5RUUzLDB4OUVFNCwweDlFRTYsLyogMHg2MC0weDY3ICovCisJMHg5RUU4LDB4OUVFQiwweDlFRUMsMHg5RUVELDB4OUVFRSwweDlFRjAsMHg5RUYxLDB4OUVGMiwvKiAweDY4LTB4NkYgKi8KKwkweDlFRjMsMHg5RUY0LDB4OUVGNSwweDlFRjYsMHg5RUY3LDB4OUVGOCwweDlFRkEsMHg5RUZELC8qIDB4NzAtMHg3NyAqLworCTB4OUVGRiwweDlGMDAsMHg5RjAxLDB4OUYwMiwweDlGMDMsMHg5RjA0LDB4OUYwNSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDlGMDYsMHg5RjA3LDB4OUYwOCwweDlGMDksMHg5RjBBLDB4OUYwQywweDlGMEYsMHg5RjExLC8qIDB4ODAtMHg4NyAqLworCTB4OUYxMiwweDlGMTQsMHg5RjE1LDB4OUYxNiwweDlGMTgsMHg5RjFBLDB4OUYxQiwweDlGMUMsLyogMHg4OC0weDhGICovCisJMHg5RjFELDB4OUYxRSwweDlGMUYsMHg5RjIxLDB4OUYyMywweDlGMjQsMHg5RjI1LDB4OUYyNiwvKiAweDkwLTB4OTcgKi8KKwkweDlGMjcsMHg5RjI4LDB4OUYyOSwweDlGMkEsMHg5RjJCLDB4OUYyRCwweDlGMkUsMHg5RjMwLC8qIDB4OTgtMHg5RiAqLworCTB4OUYzMSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhBMC0weEE3ICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRkRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5RjMyLDB4OUYzMywweDlGMzQsMHg5RjM1LDB4OUYzNiwweDlGMzgsMHg5RjNBLDB4OUYzQywvKiAweDQwLTB4NDcgKi8KKwkweDlGM0YsMHg5RjQwLDB4OUY0MSwweDlGNDIsMHg5RjQzLDB4OUY0NSwweDlGNDYsMHg5RjQ3LC8qIDB4NDgtMHg0RiAqLworCTB4OUY0OCwweDlGNDksMHg5RjRBLDB4OUY0QiwweDlGNEMsMHg5RjRELDB4OUY0RSwweDlGNEYsLyogMHg1MC0weDU3ICovCisJMHg5RjUyLDB4OUY1MywweDlGNTQsMHg5RjU1LDB4OUY1NiwweDlGNTcsMHg5RjU4LDB4OUY1OSwvKiAweDU4LTB4NUYgKi8KKwkweDlGNUEsMHg5RjVCLDB4OUY1QywweDlGNUQsMHg5RjVFLDB4OUY1RiwweDlGNjAsMHg5RjYxLC8qIDB4NjAtMHg2NyAqLworCTB4OUY2MiwweDlGNjMsMHg5RjY0LDB4OUY2NSwweDlGNjYsMHg5RjY3LDB4OUY2OCwweDlGNjksLyogMHg2OC0weDZGICovCisJMHg5RjZBLDB4OUY2QiwweDlGNkMsMHg5RjZELDB4OUY2RSwweDlGNkYsMHg5RjcwLDB4OUY3MSwvKiAweDcwLTB4NzcgKi8KKwkweDlGNzIsMHg5RjczLDB4OUY3NCwweDlGNzUsMHg5Rjc2LDB4OUY3NywweDlGNzgsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5Rjc5LDB4OUY3QSwweDlGN0IsMHg5RjdDLDB4OUY3RCwweDlGN0UsMHg5RjgxLDB4OUY4MiwvKiAweDgwLTB4ODcgKi8KKwkweDlGOEQsMHg5RjhFLDB4OUY4RiwweDlGOTAsMHg5RjkxLDB4OUY5MiwweDlGOTMsMHg5Rjk0LC8qIDB4ODgtMHg4RiAqLworCTB4OUY5NSwweDlGOTYsMHg5Rjk3LDB4OUY5OCwweDlGOUMsMHg5RjlELDB4OUY5RSwweDlGQTEsLyogMHg5MC0weDk3ICovCisJMHg5RkEyLDB4OUZBMywweDlGQTQsMHg5RkE1LDB4RjkyQywweEY5NzksMHhGOTk1LDB4RjlFNywvKiAweDk4LTB4OUYgKi8KKwkweEY5RjEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QTAtMHhBNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0ZFWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4RkEwQywweEZBMEQsMHhGQTBFLDB4RkEwRiwweEZBMTEsMHhGQTEzLDB4RkExNCwweEZBMTgsLyogMHg0MC0weDQ3ICovCisJMHhGQTFGLDB4RkEyMCwweEZBMjEsMHhGQTIzLDB4RkEyNCwweEZBMjcsMHhGQTI4LDB4RkEyOSwvKiAweDQ4LTB4NEYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90ICpwYWdlX2NoYXJzZXQydW5pWzI1Nl0gPSB7CisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgYzJ1XzgxLCBjMnVfODIsIGMydV84MywgYzJ1Xzg0LCBjMnVfODUsIGMydV84NiwgYzJ1Xzg3LCAKKwljMnVfODgsIGMydV84OSwgYzJ1XzhBLCBjMnVfOEIsIGMydV84QywgYzJ1XzhELCBjMnVfOEUsIGMydV84RiwgCisJYzJ1XzkwLCBjMnVfOTEsIGMydV85MiwgYzJ1XzkzLCBjMnVfOTQsIGMydV85NSwgYzJ1Xzk2LCBjMnVfOTcsIAorCWMydV85OCwgYzJ1Xzk5LCBjMnVfOUEsIGMydV85QiwgYzJ1XzlDLCBjMnVfOUQsIGMydV85RSwgYzJ1XzlGLCAKKwljMnVfQTAsIGMydV9BMSwgYzJ1X0EyLCBjMnVfQTMsIGMydV9BNCwgYzJ1X0E1LCBjMnVfQTYsIGMydV9BNywgCisJYzJ1X0E4LCBjMnVfQTksIGMydV9BQSwgYzJ1X0FCLCBjMnVfQUMsIGMydV9BRCwgYzJ1X0FFLCBjMnVfQUYsIAorCWMydV9CMCwgYzJ1X0IxLCBjMnVfQjIsIGMydV9CMywgYzJ1X0I0LCBjMnVfQjUsIGMydV9CNiwgYzJ1X0I3LCAKKwljMnVfQjgsIGMydV9COSwgYzJ1X0JBLCBjMnVfQkIsIGMydV9CQywgYzJ1X0JELCBjMnVfQkUsIGMydV9CRiwgCisJYzJ1X0MwLCBjMnVfQzEsIGMydV9DMiwgYzJ1X0MzLCBjMnVfQzQsIGMydV9DNSwgYzJ1X0M2LCBjMnVfQzcsIAorCWMydV9DOCwgYzJ1X0M5LCBjMnVfQ0EsIGMydV9DQiwgYzJ1X0NDLCBjMnVfQ0QsIGMydV9DRSwgYzJ1X0NGLCAKKwljMnVfRDAsIGMydV9EMSwgYzJ1X0QyLCBjMnVfRDMsIGMydV9ENCwgYzJ1X0Q1LCBjMnVfRDYsIGMydV9ENywgCisJYzJ1X0Q4LCBjMnVfRDksIGMydV9EQSwgYzJ1X0RCLCBjMnVfREMsIGMydV9ERCwgYzJ1X0RFLCBjMnVfREYsIAorCWMydV9FMCwgYzJ1X0UxLCBjMnVfRTIsIGMydV9FMywgYzJ1X0U0LCBjMnVfRTUsIGMydV9FNiwgYzJ1X0U3LCAKKwljMnVfRTgsIGMydV9FOSwgYzJ1X0VBLCBjMnVfRUIsIGMydV9FQywgYzJ1X0VELCBjMnVfRUUsIGMydV9FRiwgCisJYzJ1X0YwLCBjMnVfRjEsIGMydV9GMiwgYzJ1X0YzLCBjMnVfRjQsIGMydV9GNSwgYzJ1X0Y2LCBjMnVfRjcsIAorCWMydV9GOCwgYzJ1X0Y5LCBjMnVfRkEsIGMydV9GQiwgYzJ1X0ZDLCBjMnVfRkQsIGMydV9GRSwgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18wMVs1MTJdID0geworCTB4QTgsIDB4QTEsIDB4QTgsIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QTUsIDB4QTgsIDB4QTUsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QTcsIDB4QTgsIDB4QTcsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QTksIDB4QTgsIDB4QTksIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4QTgsIDB4QkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4QTgsIDB4QkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4QTgsIDB4QUQsIDB4QTgsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QjEsIDB4QTgsIDB4QjEsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4QTEsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4QTgsIDB4QTMsIDB4QTgsIDB4QTMsIDB4QTgsIDB4QUIsIC8qIDB4Q0MtMHhDRiAqLworCTB4QTgsIDB4QUIsIDB4QTgsIDB4QUYsIDB4QTgsIDB4QUYsIDB4QTgsIDB4QjMsIC8qIDB4RDAtMHhEMyAqLworCTB4QTgsIDB4QjMsIDB4QTgsIDB4QjUsIDB4QTgsIDB4QjUsIDB4QTgsIDB4QjYsIC8qIDB4RDQtMHhENyAqLworCTB4QTgsIDB4QjYsIDB4QTgsIDB4QjcsIDB4QTgsIDB4QjcsIDB4QTgsIDB4QjgsIC8qIDB4RDgtMHhEQiAqLworCTB4QTgsIDB4QjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzAyWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHhBOCwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhBOCwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhBNiwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhBNSwgMHhBOCwgMHg0MCwgMHhBOCwgMHg0MSwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHhBOCwgMHg0MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMDNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEE2LCAweEExLCAweEE2LCAweEEyLCAweEE2LCAweEEzLCAvKiAweDkwLTB4OTMgKi8KKwkweEE2LCAweEE0LCAweEE2LCAweEE1LCAweEE2LCAweEE2LCAweEE2LCAweEE3LCAvKiAweDk0LTB4OTcgKi8KKwkweEE2LCAweEE4LCAweEE2LCAweEE5LCAweEE2LCAweEFBLCAweEE2LCAweEFCLCAvKiAweDk4LTB4OUIgKi8KKwkweEE2LCAweEFDLCAweEE2LCAweEFELCAweEE2LCAweEFFLCAweEE2LCAweEFGLCAvKiAweDlDLTB4OUYgKi8KKwkweEE2LCAweEIwLCAweEE2LCAweEIxLCAweDAwLCAweDAwLCAweEE2LCAweEIyLCAvKiAweEEwLTB4QTMgKi8KKwkweEE2LCAweEIzLCAweEE2LCAweEI0LCAweEE2LCAweEI1LCAweEE2LCAweEI2LCAvKiAweEE0LTB4QTcgKi8KKwkweEE2LCAweEI3LCAweEE2LCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEE2LCAweEMxLCAweEE2LCAweEMyLCAweEE2LCAweEMzLCAvKiAweEIwLTB4QjMgKi8KKwkweEE2LCAweEM0LCAweEE2LCAweEM1LCAweEE2LCAweEM2LCAweEE2LCAweEM3LCAvKiAweEI0LTB4QjcgKi8KKwkweEE2LCAweEM4LCAweEE2LCAweEM5LCAweEE2LCAweENBLCAweEE2LCAweENCLCAvKiAweEI4LTB4QkIgKi8KKwkweEE2LCAweENDLCAweEE2LCAweENELCAweEE2LCAweENFLCAweEE2LCAweENGLCAvKiAweEJDLTB4QkYgKi8KKwkweEE2LCAweEQwLCAweEE2LCAweEQxLCAweDAwLCAweDAwLCAweEE2LCAweEQyLCAvKiAweEMwLTB4QzMgKi8KKwkweEE2LCAweEQzLCAweEE2LCAweEQ0LCAweEE2LCAweEQ1LCAweEE2LCAweEQ2LCAvKiAweEM0LTB4QzcgKi8KKwkweEE2LCAweEQ3LCAweEE2LCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18wNFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4QTcsIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4QTcsIDB4QTEsIDB4QTcsIDB4QTIsIDB4QTcsIDB4QTMsIDB4QTcsIDB4QTQsIC8qIDB4MTAtMHgxMyAqLworCTB4QTcsIDB4QTUsIDB4QTcsIDB4QTYsIDB4QTcsIDB4QTgsIDB4QTcsIDB4QTksIC8qIDB4MTQtMHgxNyAqLworCTB4QTcsIDB4QUEsIDB4QTcsIDB4QUIsIDB4QTcsIDB4QUMsIDB4QTcsIDB4QUQsIC8qIDB4MTgtMHgxQiAqLworCTB4QTcsIDB4QUUsIDB4QTcsIDB4QUYsIDB4QTcsIDB4QjAsIDB4QTcsIDB4QjEsIC8qIDB4MUMtMHgxRiAqLworCTB4QTcsIDB4QjIsIDB4QTcsIDB4QjMsIDB4QTcsIDB4QjQsIDB4QTcsIDB4QjUsIC8qIDB4MjAtMHgyMyAqLworCTB4QTcsIDB4QjYsIDB4QTcsIDB4QjcsIDB4QTcsIDB4QjgsIDB4QTcsIDB4QjksIC8qIDB4MjQtMHgyNyAqLworCTB4QTcsIDB4QkEsIDB4QTcsIDB4QkIsIDB4QTcsIDB4QkMsIDB4QTcsIDB4QkQsIC8qIDB4MjgtMHgyQiAqLworCTB4QTcsIDB4QkUsIDB4QTcsIDB4QkYsIDB4QTcsIDB4QzAsIDB4QTcsIDB4QzEsIC8qIDB4MkMtMHgyRiAqLworCTB4QTcsIDB4RDEsIDB4QTcsIDB4RDIsIDB4QTcsIDB4RDMsIDB4QTcsIDB4RDQsIC8qIDB4MzAtMHgzMyAqLworCTB4QTcsIDB4RDUsIDB4QTcsIDB4RDYsIDB4QTcsIDB4RDgsIDB4QTcsIDB4RDksIC8qIDB4MzQtMHgzNyAqLworCTB4QTcsIDB4REEsIDB4QTcsIDB4REIsIDB4QTcsIDB4REMsIDB4QTcsIDB4REQsIC8qIDB4MzgtMHgzQiAqLworCTB4QTcsIDB4REUsIDB4QTcsIDB4REYsIDB4QTcsIDB4RTAsIDB4QTcsIDB4RTEsIC8qIDB4M0MtMHgzRiAqLworCTB4QTcsIDB4RTIsIDB4QTcsIDB4RTMsIDB4QTcsIDB4RTQsIDB4QTcsIDB4RTUsIC8qIDB4NDAtMHg0MyAqLworCTB4QTcsIDB4RTYsIDB4QTcsIDB4RTcsIDB4QTcsIDB4RTgsIDB4QTcsIDB4RTksIC8qIDB4NDQtMHg0NyAqLworCTB4QTcsIDB4RUEsIDB4QTcsIDB4RUIsIDB4QTcsIDB4RUMsIDB4QTcsIDB4RUQsIC8qIDB4NDgtMHg0QiAqLworCTB4QTcsIDB4RUUsIDB4QTcsIDB4RUYsIDB4QTcsIDB4RjAsIDB4QTcsIDB4RjEsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4QTcsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzIwWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhBOSwgMHg1QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHg0MywgLyogMHgxMC0weDEzICovCisJMHhBMSwgMHhBQSwgMHhBOCwgMHg0NCwgMHhBMSwgMHhBQywgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhBMSwgMHhBRSwgMHhBMSwgMHhBRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhBMSwgMHhCMCwgMHhBMSwgMHhCMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhBOCwgMHg0NSwgMHhBMSwgMHhBRCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhBMSwgMHhFQiwgMHgwMCwgMHgwMCwgMHhBMSwgMHhFNCwgMHhBMSwgMHhFNSwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhBOCwgMHg0NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhGOSwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMywgMHhGRSwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMjFbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEU2LCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEE4LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEE4LCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEVELCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweEE5LCAweDU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEEyLCAweEYxLCAweEEyLCAweEYyLCAweEEyLCAweEYzLCAweEEyLCAweEY0LCAvKiAweDYwLTB4NjMgKi8KKwkweEEyLCAweEY1LCAweEEyLCAweEY2LCAweEEyLCAweEY3LCAweEEyLCAweEY4LCAvKiAweDY0LTB4NjcgKi8KKwkweEEyLCAweEY5LCAweEEyLCAweEZBLCAweEEyLCAweEZCLCAweEEyLCAweEZDLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEEyLCAweEExLCAweEEyLCAweEEyLCAweEEyLCAweEEzLCAweEEyLCAweEE0LCAvKiAweDcwLTB4NzMgKi8KKwkweEEyLCAweEE1LCAweEEyLCAweEE2LCAweEEyLCAweEE3LCAweEEyLCAweEE4LCAvKiAweDc0LTB4NzcgKi8KKwkweEEyLCAweEE5LCAweEEyLCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweEExLCAweEZCLCAweEExLCAweEZDLCAweEExLCAweEZBLCAweEExLCAweEZELCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweDQ5LCAweEE4LCAweDRBLCAvKiAweDk0LTB4OTcgKi8KKwkweEE4LCAweDRCLCAweEE4LCAweDRDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18yMls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4QTEsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4QzcsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4QTEsIDB4QzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4QTgsIDB4NEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4QTEsIDB4RTMsIDB4MDAsIDB4MDAsIDB4QTEsIDB4Q0MsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4QTEsIDB4RDgsIDB4QTEsIDB4REUsIDB4QTgsIDB4NEUsIC8qIDB4MUMtMHgxRiAqLworCTB4QTEsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4NEYsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4QTEsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4QTEsIDB4QzQsIC8qIDB4MjQtMHgyNyAqLworCTB4QTEsIDB4QzUsIDB4QTEsIDB4QzksIDB4QTEsIDB4QzgsIDB4QTEsIDB4RDIsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RDMsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4QTEsIDB4RTAsIDB4QTEsIDB4REYsIDB4QTEsIDB4QzMsIDB4QTEsIDB4Q0IsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4QTEsIDB4QUIsIDB4QTEsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4QTEsIDB4RDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4QTEsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4NTAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4QTEsIDB4RDksIDB4QTEsIDB4RDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4QTEsIDB4REMsIDB4QTEsIDB4REQsIDB4QTgsIDB4NTEsIDB4QTgsIDB4NTIsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4REEsIDB4QTEsIDB4REIsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4QTgsIDB4OTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4QTEsIDB4RDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4QTEsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4NTMsIC8qIDB4QkMtMHhCRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzIzWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhEMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMjRbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEEyLCAweEQ5LCAweEEyLCAweERBLCAweEEyLCAweERCLCAweEEyLCAweERDLCAvKiAweDYwLTB4NjMgKi8KKwkweEEyLCAweERELCAweEEyLCAweERFLCAweEEyLCAweERGLCAweEEyLCAweEUwLCAvKiAweDY0LTB4NjcgKi8KKwkweEEyLCAweEUxLCAweEEyLCAweEUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEEyLCAweEM1LCAweEEyLCAweEM2LCAweEEyLCAweEM3LCAweEEyLCAweEM4LCAvKiAweDc0LTB4NzcgKi8KKwkweEEyLCAweEM5LCAweEEyLCAweENBLCAweEEyLCAweENCLCAweEEyLCAweENDLCAvKiAweDc4LTB4N0IgKi8KKwkweEEyLCAweENELCAweEEyLCAweENFLCAweEEyLCAweENGLCAweEEyLCAweEQwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEEyLCAweEQxLCAweEEyLCAweEQyLCAweEEyLCAweEQzLCAweEEyLCAweEQ0LCAvKiAweDgwLTB4ODMgKi8KKwkweEEyLCAweEQ1LCAweEEyLCAweEQ2LCAweEEyLCAweEQ3LCAweEEyLCAweEQ4LCAvKiAweDg0LTB4ODcgKi8KKwkweEEyLCAweEIxLCAweEEyLCAweEIyLCAweEEyLCAweEIzLCAweEEyLCAweEI0LCAvKiAweDg4LTB4OEIgKi8KKwkweEEyLCAweEI1LCAweEEyLCAweEI2LCAweEEyLCAweEI3LCAweEEyLCAweEI4LCAvKiAweDhDLTB4OEYgKi8KKwkweEEyLCAweEI5LCAweEEyLCAweEJBLCAweEEyLCAweEJCLCAweEEyLCAweEJDLCAvKiAweDkwLTB4OTMgKi8KKwkweEEyLCAweEJELCAweEEyLCAweEJFLCAweEEyLCAweEJGLCAweEEyLCAweEMwLCAvKiAweDk0LTB4OTcgKi8KKwkweEEyLCAweEMxLCAweEEyLCAweEMyLCAweEEyLCAweEMzLCAweEEyLCAweEM0LCAvKiAweDk4LTB4OUIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18yNVs1MTJdID0geworCTB4QTksIDB4QTQsIDB4QTksIDB4QTUsIDB4QTksIDB4QTYsIDB4QTksIDB4QTcsIC8qIDB4MDAtMHgwMyAqLworCTB4QTksIDB4QTgsIDB4QTksIDB4QTksIDB4QTksIDB4QUEsIDB4QTksIDB4QUIsIC8qIDB4MDQtMHgwNyAqLworCTB4QTksIDB4QUMsIDB4QTksIDB4QUQsIDB4QTksIDB4QUUsIDB4QTksIDB4QUYsIC8qIDB4MDgtMHgwQiAqLworCTB4QTksIDB4QjAsIDB4QTksIDB4QjEsIDB4QTksIDB4QjIsIDB4QTksIDB4QjMsIC8qIDB4MEMtMHgwRiAqLworCTB4QTksIDB4QjQsIDB4QTksIDB4QjUsIDB4QTksIDB4QjYsIDB4QTksIDB4QjcsIC8qIDB4MTAtMHgxMyAqLworCTB4QTksIDB4QjgsIDB4QTksIDB4QjksIDB4QTksIDB4QkEsIDB4QTksIDB4QkIsIC8qIDB4MTQtMHgxNyAqLworCTB4QTksIDB4QkMsIDB4QTksIDB4QkQsIDB4QTksIDB4QkUsIDB4QTksIDB4QkYsIC8qIDB4MTgtMHgxQiAqLworCTB4QTksIDB4QzAsIDB4QTksIDB4QzEsIDB4QTksIDB4QzIsIDB4QTksIDB4QzMsIC8qIDB4MUMtMHgxRiAqLworCTB4QTksIDB4QzQsIDB4QTksIDB4QzUsIDB4QTksIDB4QzYsIDB4QTksIDB4QzcsIC8qIDB4MjAtMHgyMyAqLworCTB4QTksIDB4QzgsIDB4QTksIDB4QzksIDB4QTksIDB4Q0EsIDB4QTksIDB4Q0IsIC8qIDB4MjQtMHgyNyAqLworCTB4QTksIDB4Q0MsIDB4QTksIDB4Q0QsIDB4QTksIDB4Q0UsIDB4QTksIDB4Q0YsIC8qIDB4MjgtMHgyQiAqLworCTB4QTksIDB4RDAsIDB4QTksIDB4RDEsIDB4QTksIDB4RDIsIDB4QTksIDB4RDMsIC8qIDB4MkMtMHgyRiAqLworCTB4QTksIDB4RDQsIDB4QTksIDB4RDUsIDB4QTksIDB4RDYsIDB4QTksIDB4RDcsIC8qIDB4MzAtMHgzMyAqLworCTB4QTksIDB4RDgsIDB4QTksIDB4RDksIDB4QTksIDB4REEsIDB4QTksIDB4REIsIC8qIDB4MzQtMHgzNyAqLworCTB4QTksIDB4REMsIDB4QTksIDB4REQsIDB4QTksIDB4REUsIDB4QTksIDB4REYsIC8qIDB4MzgtMHgzQiAqLworCTB4QTksIDB4RTAsIDB4QTksIDB4RTEsIDB4QTksIDB4RTIsIDB4QTksIDB4RTMsIC8qIDB4M0MtMHgzRiAqLworCTB4QTksIDB4RTQsIDB4QTksIDB4RTUsIDB4QTksIDB4RTYsIDB4QTksIDB4RTcsIC8qIDB4NDAtMHg0MyAqLworCTB4QTksIDB4RTgsIDB4QTksIDB4RTksIDB4QTksIDB4RUEsIDB4QTksIDB4RUIsIC8qIDB4NDQtMHg0NyAqLworCTB4QTksIDB4RUMsIDB4QTksIDB4RUQsIDB4QTksIDB4RUUsIDB4QTksIDB4RUYsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4QTgsIDB4NTQsIDB4QTgsIDB4NTUsIDB4QTgsIDB4NTYsIDB4QTgsIDB4NTcsIC8qIDB4NTAtMHg1MyAqLworCTB4QTgsIDB4NTgsIDB4QTgsIDB4NTksIDB4QTgsIDB4NUEsIDB4QTgsIDB4NUIsIC8qIDB4NTQtMHg1NyAqLworCTB4QTgsIDB4NUMsIDB4QTgsIDB4NUQsIDB4QTgsIDB4NUUsIDB4QTgsIDB4NUYsIC8qIDB4NTgtMHg1QiAqLworCTB4QTgsIDB4NjAsIDB4QTgsIDB4NjEsIDB4QTgsIDB4NjIsIDB4QTgsIDB4NjMsIC8qIDB4NUMtMHg1RiAqLworCTB4QTgsIDB4NjQsIDB4QTgsIDB4NjUsIDB4QTgsIDB4NjYsIDB4QTgsIDB4NjcsIC8qIDB4NjAtMHg2MyAqLworCTB4QTgsIDB4NjgsIDB4QTgsIDB4NjksIDB4QTgsIDB4NkEsIDB4QTgsIDB4NkIsIC8qIDB4NjQtMHg2NyAqLworCTB4QTgsIDB4NkMsIDB4QTgsIDB4NkQsIDB4QTgsIDB4NkUsIDB4QTgsIDB4NkYsIC8qIDB4NjgtMHg2QiAqLworCTB4QTgsIDB4NzAsIDB4QTgsIDB4NzEsIDB4QTgsIDB4NzIsIDB4QTgsIDB4NzMsIC8qIDB4NkMtMHg2RiAqLworCTB4QTgsIDB4NzQsIDB4QTgsIDB4NzUsIDB4QTgsIDB4NzYsIDB4QTgsIDB4NzcsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4QTgsIDB4NzgsIDB4QTgsIDB4NzksIDB4QTgsIDB4N0EsIC8qIDB4ODAtMHg4MyAqLworCTB4QTgsIDB4N0IsIDB4QTgsIDB4N0MsIDB4QTgsIDB4N0QsIDB4QTgsIDB4N0UsIC8qIDB4ODQtMHg4NyAqLworCTB4QTgsIDB4ODAsIDB4QTgsIDB4ODEsIDB4QTgsIDB4ODIsIDB4QTgsIDB4ODMsIC8qIDB4ODgtMHg4QiAqLworCTB4QTgsIDB4ODQsIDB4QTgsIDB4ODUsIDB4QTgsIDB4ODYsIDB4QTgsIDB4ODcsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4ODgsIC8qIDB4OTAtMHg5MyAqLworCTB4QTgsIDB4ODksIDB4QTgsIDB4OEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4QTEsIDB4RjYsIDB4QTEsIDB4RjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RjgsIDB4QTEsIDB4RjcsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4QTgsIDB4OEIsIDB4QTgsIDB4OEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RjQsIDB4QTEsIDB4RjMsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RjAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RjIsIDB4QTEsIDB4RjEsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4OEQsIDB4QTgsIDB4OEUsIC8qIDB4RTAtMHhFMyAqLworCTB4QTgsIDB4OEYsIDB4QTgsIDB4OTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzI2WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhFRiwgMHhBMSwgMHhFRSwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhBOCwgMHg5MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhBMSwgMHhFMiwgMHgwMCwgMHgwMCwgMHhBMSwgMHhFMSwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMzBbNTEyXSA9IHsKKwkweEExLCAweEExLCAweEExLCAweEEyLCAweEExLCAweEEzLCAweEExLCAweEE4LCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEExLCAweEE5LCAweEE5LCAweDY1LCAweEE5LCAweDk2LCAvKiAweDA0LTB4MDcgKi8KKwkweEExLCAweEI0LCAweEExLCAweEI1LCAweEExLCAweEI2LCAweEExLCAweEI3LCAvKiAweDA4LTB4MEIgKi8KKwkweEExLCAweEI4LCAweEExLCAweEI5LCAweEExLCAweEJBLCAweEExLCAweEJCLCAvKiAweDBDLTB4MEYgKi8KKwkweEExLCAweEJFLCAweEExLCAweEJGLCAweEE4LCAweDkzLCAweEExLCAweEZFLCAvKiAweDEwLTB4MTMgKi8KKwkweEExLCAweEIyLCAweEExLCAweEIzLCAweEExLCAweEJDLCAweEExLCAweEJELCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweEE4LCAweDk0LCAweEE4LCAweDk1LCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweEE5LCAweDQwLCAweEE5LCAweDQxLCAweEE5LCAweDQyLCAvKiAweDIwLTB4MjMgKi8KKwkweEE5LCAweDQzLCAweEE5LCAweDQ0LCAweEE5LCAweDQ1LCAweEE5LCAweDQ2LCAvKiAweDI0LTB4MjcgKi8KKwkweEE5LCAweDQ3LCAweEE5LCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweEE0LCAweEExLCAweEE0LCAweEEyLCAweEE0LCAweEEzLCAvKiAweDQwLTB4NDMgKi8KKwkweEE0LCAweEE0LCAweEE0LCAweEE1LCAweEE0LCAweEE2LCAweEE0LCAweEE3LCAvKiAweDQ0LTB4NDcgKi8KKwkweEE0LCAweEE4LCAweEE0LCAweEE5LCAweEE0LCAweEFBLCAweEE0LCAweEFCLCAvKiAweDQ4LTB4NEIgKi8KKwkweEE0LCAweEFDLCAweEE0LCAweEFELCAweEE0LCAweEFFLCAweEE0LCAweEFGLCAvKiAweDRDLTB4NEYgKi8KKwkweEE0LCAweEIwLCAweEE0LCAweEIxLCAweEE0LCAweEIyLCAweEE0LCAweEIzLCAvKiAweDUwLTB4NTMgKi8KKwkweEE0LCAweEI0LCAweEE0LCAweEI1LCAweEE0LCAweEI2LCAweEE0LCAweEI3LCAvKiAweDU0LTB4NTcgKi8KKwkweEE0LCAweEI4LCAweEE0LCAweEI5LCAweEE0LCAweEJBLCAweEE0LCAweEJCLCAvKiAweDU4LTB4NUIgKi8KKwkweEE0LCAweEJDLCAweEE0LCAweEJELCAweEE0LCAweEJFLCAweEE0LCAweEJGLCAvKiAweDVDLTB4NUYgKi8KKwkweEE0LCAweEMwLCAweEE0LCAweEMxLCAweEE0LCAweEMyLCAweEE0LCAweEMzLCAvKiAweDYwLTB4NjMgKi8KKwkweEE0LCAweEM0LCAweEE0LCAweEM1LCAweEE0LCAweEM2LCAweEE0LCAweEM3LCAvKiAweDY0LTB4NjcgKi8KKwkweEE0LCAweEM4LCAweEE0LCAweEM5LCAweEE0LCAweENBLCAweEE0LCAweENCLCAvKiAweDY4LTB4NkIgKi8KKwkweEE0LCAweENDLCAweEE0LCAweENELCAweEE0LCAweENFLCAweEE0LCAweENGLCAvKiAweDZDLTB4NkYgKi8KKwkweEE0LCAweEQwLCAweEE0LCAweEQxLCAweEE0LCAweEQyLCAweEE0LCAweEQzLCAvKiAweDcwLTB4NzMgKi8KKwkweEE0LCAweEQ0LCAweEE0LCAweEQ1LCAweEE0LCAweEQ2LCAweEE0LCAweEQ3LCAvKiAweDc0LTB4NzcgKi8KKwkweEE0LCAweEQ4LCAweEE0LCAweEQ5LCAweEE0LCAweERBLCAweEE0LCAweERCLCAvKiAweDc4LTB4N0IgKi8KKwkweEE0LCAweERDLCAweEE0LCAweERELCAweEE0LCAweERFLCAweEE0LCAweERGLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEE0LCAweEUwLCAweEE0LCAweEUxLCAweEE0LCAweEUyLCAweEE0LCAweEUzLCAvKiAweDgwLTB4ODMgKi8KKwkweEE0LCAweEU0LCAweEE0LCAweEU1LCAweEE0LCAweEU2LCAweEE0LCAweEU3LCAvKiAweDg0LTB4ODcgKi8KKwkweEE0LCAweEU4LCAweEE0LCAweEU5LCAweEE0LCAweEVBLCAweEE0LCAweEVCLCAvKiAweDg4LTB4OEIgKi8KKwkweEE0LCAweEVDLCAweEE0LCAweEVELCAweEE0LCAweEVFLCAweEE0LCAweEVGLCAvKiAweDhDLTB4OEYgKi8KKwkweEE0LCAweEYwLCAweEE0LCAweEYxLCAweEE0LCAweEYyLCAweEE0LCAweEYzLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE5LCAweDYxLCAvKiAweDk4LTB4OUIgKi8KKwkweEE5LCAweDYyLCAweEE5LCAweDY2LCAweEE5LCAweDY3LCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEE1LCAweEExLCAweEE1LCAweEEyLCAweEE1LCAweEEzLCAvKiAweEEwLTB4QTMgKi8KKwkweEE1LCAweEE0LCAweEE1LCAweEE1LCAweEE1LCAweEE2LCAweEE1LCAweEE3LCAvKiAweEE0LTB4QTcgKi8KKwkweEE1LCAweEE4LCAweEE1LCAweEE5LCAweEE1LCAweEFBLCAweEE1LCAweEFCLCAvKiAweEE4LTB4QUIgKi8KKwkweEE1LCAweEFDLCAweEE1LCAweEFELCAweEE1LCAweEFFLCAweEE1LCAweEFGLCAvKiAweEFDLTB4QUYgKi8KKwkweEE1LCAweEIwLCAweEE1LCAweEIxLCAweEE1LCAweEIyLCAweEE1LCAweEIzLCAvKiAweEIwLTB4QjMgKi8KKwkweEE1LCAweEI0LCAweEE1LCAweEI1LCAweEE1LCAweEI2LCAweEE1LCAweEI3LCAvKiAweEI0LTB4QjcgKi8KKwkweEE1LCAweEI4LCAweEE1LCAweEI5LCAweEE1LCAweEJBLCAweEE1LCAweEJCLCAvKiAweEI4LTB4QkIgKi8KKwkweEE1LCAweEJDLCAweEE1LCAweEJELCAweEE1LCAweEJFLCAweEE1LCAweEJGLCAvKiAweEJDLTB4QkYgKi8KKwkweEE1LCAweEMwLCAweEE1LCAweEMxLCAweEE1LCAweEMyLCAweEE1LCAweEMzLCAvKiAweEMwLTB4QzMgKi8KKwkweEE1LCAweEM0LCAweEE1LCAweEM1LCAweEE1LCAweEM2LCAweEE1LCAweEM3LCAvKiAweEM0LTB4QzcgKi8KKwkweEE1LCAweEM4LCAweEE1LCAweEM5LCAweEE1LCAweENBLCAweEE1LCAweENCLCAvKiAweEM4LTB4Q0IgKi8KKwkweEE1LCAweENDLCAweEE1LCAweENELCAweEE1LCAweENFLCAweEE1LCAweENGLCAvKiAweENDLTB4Q0YgKi8KKwkweEE1LCAweEQwLCAweEE1LCAweEQxLCAweEE1LCAweEQyLCAweEE1LCAweEQzLCAvKiAweEQwLTB4RDMgKi8KKwkweEE1LCAweEQ0LCAweEE1LCAweEQ1LCAweEE1LCAweEQ2LCAweEE1LCAweEQ3LCAvKiAweEQ0LTB4RDcgKi8KKwkweEE1LCAweEQ4LCAweEE1LCAweEQ5LCAweEE1LCAweERBLCAweEE1LCAweERCLCAvKiAweEQ4LTB4REIgKi8KKwkweEE1LCAweERDLCAweEE1LCAweERELCAweEE1LCAweERFLCAweEE1LCAweERGLCAvKiAweERDLTB4REYgKi8KKwkweEE1LCAweEUwLCAweEE1LCAweEUxLCAweEE1LCAweEUyLCAweEE1LCAweEUzLCAvKiAweEUwLTB4RTMgKi8KKwkweEE1LCAweEU0LCAweEE1LCAweEU1LCAweEE1LCAweEU2LCAweEE1LCAweEU3LCAvKiAweEU0LTB4RTcgKi8KKwkweEE1LCAweEU4LCAweEE1LCAweEU5LCAweEE1LCAweEVBLCAweEE1LCAweEVCLCAvKiAweEU4LTB4RUIgKi8KKwkweEE1LCAweEVDLCAweEE1LCAweEVELCAweEE1LCAweEVFLCAweEE1LCAweEVGLCAvKiAweEVDLTB4RUYgKi8KKwkweEE1LCAweEYwLCAweEE1LCAweEYxLCAweEE1LCAweEYyLCAweEE1LCAweEYzLCAvKiAweEYwLTB4RjMgKi8KKwkweEE1LCAweEY0LCAweEE1LCAweEY1LCAweEE1LCAweEY2LCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweEE5LCAweDYwLCAweEE5LCAweDYzLCAweEE5LCAweDY0LCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18zMVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4QTgsIDB4QzUsIDB4QTgsIDB4QzYsIDB4QTgsIDB4QzcsIC8qIDB4MDQtMHgwNyAqLworCTB4QTgsIDB4QzgsIDB4QTgsIDB4QzksIDB4QTgsIDB4Q0EsIDB4QTgsIDB4Q0IsIC8qIDB4MDgtMHgwQiAqLworCTB4QTgsIDB4Q0MsIDB4QTgsIDB4Q0QsIDB4QTgsIDB4Q0UsIDB4QTgsIDB4Q0YsIC8qIDB4MEMtMHgwRiAqLworCTB4QTgsIDB4RDAsIDB4QTgsIDB4RDEsIDB4QTgsIDB4RDIsIDB4QTgsIDB4RDMsIC8qIDB4MTAtMHgxMyAqLworCTB4QTgsIDB4RDQsIDB4QTgsIDB4RDUsIDB4QTgsIDB4RDYsIDB4QTgsIDB4RDcsIC8qIDB4MTQtMHgxNyAqLworCTB4QTgsIDB4RDgsIDB4QTgsIDB4RDksIDB4QTgsIDB4REEsIDB4QTgsIDB4REIsIC8qIDB4MTgtMHgxQiAqLworCTB4QTgsIDB4REMsIDB4QTgsIDB4REQsIDB4QTgsIDB4REUsIDB4QTgsIDB4REYsIC8qIDB4MUMtMHgxRiAqLworCTB4QTgsIDB4RTAsIDB4QTgsIDB4RTEsIDB4QTgsIDB4RTIsIDB4QTgsIDB4RTMsIC8qIDB4MjAtMHgyMyAqLworCTB4QTgsIDB4RTQsIDB4QTgsIDB4RTUsIDB4QTgsIDB4RTYsIDB4QTgsIDB4RTcsIC8qIDB4MjQtMHgyNyAqLworCTB4QTgsIDB4RTgsIDB4QTgsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDIsIDB4QkIsIDB4QjYsIDB4RkUsIC8qIDB4OTAtMHg5MyAqLworCTB4QzgsIDB4RkQsIDB4Q0IsIDB4QzQsIDB4QzksIDB4Q0YsIDB4RDYsIDB4RDAsIC8qIDB4OTQtMHg5NyAqLworCTB4Q0YsIDB4QzIsIDB4QkMsIDB4RDcsIDB4RDIsIDB4RDIsIDB4QjEsIDB4RkIsIC8qIDB4OTgtMHg5QiAqLworCTB4QjYsIDB4QTEsIDB4Q0MsIDB4RUMsIDB4QjUsIDB4RDgsIDB4QzgsIDB4Q0IsIC8qIDB4OUMtMHg5RiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzMyWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhBMiwgMHhFNSwgMHhBMiwgMHhFNiwgMHhBMiwgMHhFNywgMHhBMiwgMHhFOCwgLyogMHgyMC0weDIzICovCisJMHhBMiwgMHhFOSwgMHhBMiwgMHhFQSwgMHhBMiwgMHhFQiwgMHhBMiwgMHhFQywgLyogMHgyNC0weDI3ICovCisJMHhBMiwgMHhFRCwgMHhBMiwgMHhFRSwgMHhENCwgMHhDMiwgMHhCQiwgMHhGMCwgLyogMHgyOC0weDJCICovCisJMHhDQiwgMHhBRSwgMHhDNCwgMHhCRSwgMHhCRCwgMHhGMCwgMHhDRCwgMHhDMSwgLyogMHgyQy0weDJGICovCisJMHhDOCwgMHhENSwgMHhBOSwgMHg1QSwgMHhEMywgMHhEMCwgMHhDOSwgMHhFNywgLyogMHgzMC0weDMzICovCisJMHhDMywgMHhGQiwgMHhDQywgMHhEOCwgMHhCMiwgMHhDNiwgMHhENywgMHhBMywgLyogMHgzNC0weDM3ICovCisJMHhDMCwgMHhDRCwgMHhCNCwgMHhGQSwgMHhCQSwgMHhGNCwgMHhEMSwgMHhBNywgLyogMHgzOC0weDNCICovCisJMHhCQywgMHhFMCwgMHhDNiwgMHhGMywgMHhENywgMHhDQSwgMHhEMCwgMHhBRCwgLyogMHgzQy0weDNGICovCisJMHhCQywgMHhDMCwgMHhEMCwgMHhERCwgMHhENywgMHhENCwgMHhENiwgMHhDMSwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhEMiwgMHhCQiwgMHhCNiwgMHhGRSwgMHhDOCwgMHhGRCwgMHhDQiwgMHhDNCwgLyogMHg4MC0weDgzICovCisJMHhDRSwgMHhFNSwgMHhDMSwgMHhGOSwgMHhDNiwgMHhERiwgMHhCMCwgMHhDQiwgLyogMHg4NC0weDg3ICovCisJMHhCRSwgMHhDNSwgMHhDQSwgMHhBRSwgMHhENCwgMHhDMiwgMHhCQiwgMHhGMCwgLyogMHg4OC0weDhCICovCisJMHhDQiwgMHhBRSwgMHhDNCwgMHhCRSwgMHhCRCwgMHhGMCwgMHhDRCwgMHhDMSwgLyogMHg4Qy0weDhGICovCisJMHhDOCwgMHhENSwgMHhENiwgMHhFQSwgMHhEMywgMHhEMCwgMHhDOSwgMHhFNywgLyogMHg5MC0weDkzICovCisJMHhDMywgMHhGQiwgMHhDQywgMHhEOCwgMHhCMiwgMHhDNiwgMHhENywgMHhBMywgLyogMHg5NC0weDk3ICovCisJMHhDMCwgMHhDRCwgMHhDMywgMHhEOCwgMHhDNCwgMHhEMCwgMHhDNSwgMHhBRSwgLyogMHg5OC0weDlCICovCisJMHhDQSwgMHhDQSwgMHhEMywgMHhDNSwgMHgwMCwgMHgwMCwgMHhENywgMHhBMiwgLyogMHg5Qy0weDlGICovCisJMHhDRiwgMHhFRSwgMHhEMCwgMHhERCwgMHhEMCwgMHhCNCwgMHhBOSwgMHg0OSwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHhEMiwgMHhCRCwgMHhENywgMHhEQSwgMHhEMSwgMHhBNywgLyogMHhBOC0weEFCICovCisJMHhCQywgMHhFMCwgMHhDNiwgMHhGMywgMHhENywgMHhDQSwgMHhEMCwgMHhBRCwgLyogMHhBQy0weEFGICovCisJMHhEMiwgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMzNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE5LCAweDRBLCAweEE5LCAweDRCLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEE5LCAweDRDLCAweEE5LCAweDRELCAweEE5LCAweDRFLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEE5LCAweDRGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEE5LCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE5LCAweDUxLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEE5LCAweDUyLCAweEE5LCAweDUzLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweEE5LCAweDU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY180RVs1MTJdID0geworCTB4RDIsIDB4QkIsIDB4QjYsIDB4QTEsIDB4ODEsIDB4NDAsIDB4QzYsIDB4REYsIC8qIDB4MDAtMHgwMyAqLworCTB4ODEsIDB4NDEsIDB4ODEsIDB4NDIsIDB4ODEsIDB4NDMsIDB4Q0QsIDB4RjIsIC8qIDB4MDQtMHgwNyAqLworCTB4RDUsIDB4QzksIDB4QzgsIDB4RkQsIDB4QzksIDB4Q0YsIDB4Q0YsIDB4QzIsIC8qIDB4MDgtMHgwQiAqLworCTB4RDgsIDB4QTIsIDB4QjIsIDB4QkIsIDB4RDMsIDB4RUIsIDB4ODEsIDB4NDQsIC8qIDB4MEMtMHgwRiAqLworCTB4RDgsIDB4QTQsIDB4QjMsIDB4RjMsIDB4ODEsIDB4NDUsIDB4RDcsIDB4QTgsIC8qIDB4MTAtMHgxMyAqLworCTB4QzcsIDB4RDIsIDB4RDgsIDB4QTcsIDB4Q0EsIDB4QzAsIDB4ODEsIDB4NDYsIC8qIDB4MTQtMHgxNyAqLworCTB4QzcsIDB4RjAsIDB4QjEsIDB4RkIsIDB4RDIsIDB4QjUsIDB4QjQsIDB4RDQsIC8qIDB4MTgtMHgxQiAqLworCTB4QjYsIDB4QUIsIDB4Q0IsIDB4QkYsIDB4RDgsIDB4QTksIDB4ODEsIDB4NDcsIC8qIDB4MUMtMHgxRiAqLworCTB4ODEsIDB4NDgsIDB4ODEsIDB4NDksIDB4QjYsIDB4QUEsIDB4ODEsIDB4NEEsIC8qIDB4MjAtMHgyMyAqLworCTB4QzEsIDB4QkQsIDB4RDEsIDB4Q0YsIDB4ODEsIDB4NEIsIDB4QzksIDB4QTUsIC8qIDB4MjQtMHgyNyAqLworCTB4RDgsIDB4QUQsIDB4ODEsIDB4NEMsIDB4QjgsIDB4RjYsIDB4RDEsIDB4QkUsIC8qIDB4MjgtMHgyQiAqLworCTB4RTMsIDB4REMsIDB4RDYsIDB4RDAsIDB4ODEsIDB4NEQsIDB4ODEsIDB4NEUsIC8qIDB4MkMtMHgyRiAqLworCTB4QjcsIDB4RTEsIDB4ODEsIDB4NEYsIDB4QjQsIDB4QUUsIDB4ODEsIDB4NTAsIC8qIDB4MzAtMHgzMyAqLworCTB4QzEsIDB4RDksIDB4ODEsIDB4NTEsIDB4RDgsIDB4QkMsIDB4ODEsIDB4NTIsIC8qIDB4MzQtMHgzNyAqLworCTB4Q0QsIDB4RTgsIDB4QjUsIDB4QTQsIDB4Q0UsIDB4QUEsIDB4RDYsIDB4RjcsIC8qIDB4MzgtMHgzQiAqLworCTB4ODEsIDB4NTMsIDB4QzAsIDB4RjYsIDB4QkUsIDB4RDksIDB4RDgsIDB4QUYsIC8qIDB4M0MtMHgzRiAqLworCTB4ODEsIDB4NTQsIDB4ODEsIDB4NTUsIDB4ODEsIDB4NTYsIDB4QzQsIDB4Q0IsIC8qIDB4NDAtMHg0MyAqLworCTB4ODEsIDB4NTcsIDB4QkUsIDB4QzMsIDB4ODEsIDB4NTgsIDB4RDgsIDB4QjEsIC8qIDB4NDQtMHg0NyAqLworCTB4QzMsIDB4QjQsIDB4RDIsIDB4RTUsIDB4ODEsIDB4NTksIDB4RDYsIDB4QUUsIC8qIDB4NDgtMHg0QiAqLworCTB4Q0UsIDB4REEsIDB4RDUsIDB4QTcsIDB4QkEsIDB4RjUsIDB4QjcsIDB4QTYsIC8qIDB4NEMtMHg0RiAqLworCTB4QzAsIDB4RDYsIDB4ODEsIDB4NUEsIDB4QzYsIDB4QjksIDB4QzUsIDB4RDIsIC8qIDB4NTAtMHg1MyAqLworCTB4QzcsIDB4QzcsIDB4ODEsIDB4NUIsIDB4QjksIDB4RDQsIDB4ODEsIDB4NUMsIC8qIDB4NTQtMHg1NyAqLworCTB4QjMsIDB4Q0IsIDB4RDIsIDB4RDIsIDB4ODEsIDB4NUQsIDB4ODEsIDB4NUUsIC8qIDB4NTgtMHg1QiAqLworCTB4RDgsIDB4QkYsIDB4QkUsIDB4QzUsIDB4QzYsIDB4RjIsIDB4RDIsIDB4QjIsIC8qIDB4NUMtMHg1RiAqLworCTB4Q0YsIDB4QjAsIDB4Q0YsIDB4RTcsIDB4ODEsIDB4NUYsIDB4ODEsIDB4NjAsIC8qIDB4NjAtMHg2MyAqLworCTB4ODEsIDB4NjEsIDB4ODEsIDB4NjIsIDB4Q0EsIDB4RTksIDB4ODEsIDB4NjMsIC8qIDB4NjQtMHg2NyAqLworCTB4ODEsIDB4NjQsIDB4RDgsIDB4QzAsIDB4ODEsIDB4NjUsIDB4ODEsIDB4NjYsIC8qIDB4NjgtMHg2QiAqLworCTB4ODEsIDB4NjcsIDB4ODEsIDB4NjgsIDB4ODEsIDB4NjksIDB4ODEsIDB4NkEsIC8qIDB4NkMtMHg2RiAqLworCTB4QzIsIDB4RjIsIDB4QzIsIDB4RDIsIDB4ODEsIDB4NkIsIDB4QzgsIDB4RTksIC8qIDB4NzAtMHg3MyAqLworCTB4ODEsIDB4NkMsIDB4ODEsIDB4NkQsIDB4ODEsIDB4NkUsIDB4ODEsIDB4NkYsIC8qIDB4NzQtMHg3NyAqLworCTB4ODEsIDB4NzAsIDB4ODEsIDB4NzEsIDB4ODEsIDB4NzIsIDB4ODEsIDB4NzMsIC8qIDB4NzgtMHg3QiAqLworCTB4ODEsIDB4NzQsIDB4ODEsIDB4NzUsIDB4QzcsIDB4QUMsIDB4ODEsIDB4NzYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4ODEsIDB4NzcsIDB4ODEsIDB4NzgsIDB4ODEsIDB4NzksIDB4ODEsIDB4N0EsIC8qIDB4ODAtMHg4MyAqLworCTB4ODEsIDB4N0IsIDB4ODEsIDB4N0MsIDB4QzEsIDB4Q0IsIDB4ODEsIDB4N0QsIC8qIDB4ODQtMHg4NyAqLworCTB4RDMsIDB4RTgsIDB4RDUsIDB4RjksIDB4ODEsIDB4N0UsIDB4Q0EsIDB4QzIsIC8qIDB4ODgtMHg4QiAqLworCTB4QjYsIDB4RkUsIDB4RDgsIDB4QTEsIDB4RDMsIDB4REEsIDB4QkYsIDB4RjcsIC8qIDB4OEMtMHg4RiAqLworCTB4ODEsIDB4ODAsIDB4RDQsIDB4QzYsIDB4QkIsIDB4QTUsIDB4RDgsIDB4QzEsIC8qIDB4OTAtMHg5MyAqLworCTB4Q0UsIDB4RTUsIDB4QkUsIDB4QUUsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODIsIC8qIDB4OTQtMHg5NyAqLworCTB4RDgsIDB4QTgsIDB4ODEsIDB4ODMsIDB4RDEsIDB4QzcsIDB4RDAsIDB4QTksIC8qIDB4OTgtMHg5QiAqLworCTB4ODEsIDB4ODQsIDB4ODEsIDB4ODUsIDB4ODEsIDB4ODYsIDB4RDgsIDB4QkQsIC8qIDB4OUMtMHg5RiAqLworCTB4RDksIDB4RUYsIDB4Q0QsIDB4RjYsIDB4QkYsIDB4QkEsIDB4ODEsIDB4ODcsIC8qIDB4QTAtMHhBMyAqLworCTB4QkQsIDB4QkIsIDB4QkEsIDB4QTUsIDB4RDIsIDB4RTAsIDB4QjIsIDB4RkEsIC8qIDB4QTQtMHhBNyAqLworCTB4QkEsIDB4RTAsIDB4QzQsIDB4QjYsIDB4ODEsIDB4ODgsIDB4Q0YsIDB4RUQsIC8qIDB4QTgtMHhBQiAqLworCTB4QkUsIDB4QTksIDB4Q0QsIDB4QTQsIDB4QzEsIDB4QzEsIDB4ODEsIDB4ODksIC8qIDB4QUMtMHhBRiAqLworCTB4ODEsIDB4OEEsIDB4ODEsIDB4OEIsIDB4QzcsIDB4RDcsIDB4RDksIDB4RjEsIC8qIDB4QjAtMHhCMyAqLworCTB4ODEsIDB4OEMsIDB4RDksIDB4RjQsIDB4ODEsIDB4OEQsIDB4ODEsIDB4OEUsIC8qIDB4QjQtMHhCNyAqLworCTB4ODEsIDB4OEYsIDB4ODEsIDB4OTAsIDB4QzgsIDB4Q0IsIDB4RDgsIDB4RTksIC8qIDB4QjgtMHhCQiAqLworCTB4ODEsIDB4OTEsIDB4ODEsIDB4OTIsIDB4ODEsIDB4OTMsIDB4RDIsIDB4REEsIC8qIDB4QkMtMHhCRiAqLworCTB4Q0EsIDB4QjIsIDB4QzgsIDB4Q0EsIDB4RDgsIDB4RUMsIDB4RDgsIDB4RUEsIC8qIDB4QzAtMHhDMyAqLworCTB4RDgsIDB4QzYsIDB4QkQsIDB4RjYsIDB4QzYsIDB4Q0QsIDB4QjMsIDB4RjAsIC8qIDB4QzQtMHhDNyAqLworCTB4ODEsIDB4OTQsIDB4RDgsIDB4RUIsIDB4QkQsIDB4RjEsIDB4QkQsIDB4RTksIC8qIDB4QzgtMHhDQiAqLworCTB4ODEsIDB4OTUsIDB4QzgsIDB4RDQsIDB4QjQsIDB4RDMsIDB4ODEsIDB4OTYsIC8qIDB4Q0MtMHhDRiAqLworCTB4ODEsIDB4OTcsIDB4QzIsIDB4RDgsIDB4ODEsIDB4OTgsIDB4QjIsIDB4RDYsIC8qIDB4RDAtMHhEMyAqLworCTB4RDcsIDB4RDAsIDB4Q0EsIDB4Q0IsIDB4Q0IsIDB4RkIsIDB4RDUsIDB4Q0MsIC8qIDB4RDQtMHhENyAqLworCTB4QjgsIDB4QjYsIDB4Q0YsIDB4QzksIDB4ODEsIDB4OTksIDB4ODEsIDB4OUEsIC8qIDB4RDgtMHhEQiAqLworCTB4ODEsIDB4OUIsIDB4RDksIDB4REEsIDB4RDgsIDB4RjAsIDB4QzcsIDB4QUEsIC8qIDB4REMtMHhERiAqLworCTB4ODEsIDB4OUMsIDB4RDgsIDB4RUUsIDB4ODEsIDB4OUQsIDB4QjQsIDB4RkEsIC8qIDB4RTAtMHhFMyAqLworCTB4QzEsIDB4RUUsIDB4RDIsIDB4RDQsIDB4ODEsIDB4OUUsIDB4ODEsIDB4OUYsIC8qIDB4RTQtMHhFNyAqLworCTB4RDgsIDB4RUQsIDB4ODEsIDB4QTAsIDB4RDIsIDB4QzcsIDB4RDgsIDB4RUYsIC8qIDB4RTgtMHhFQiAqLworCTB4QzMsIDB4QzcsIDB4ODEsIDB4QTEsIDB4ODEsIDB4QTIsIDB4ODEsIDB4QTMsIC8qIDB4RUMtMHhFRiAqLworCTB4RDEsIDB4RjYsIDB4ODEsIDB4QTQsIDB4RDYsIDB4RDksIDB4RDgsIDB4RjIsIC8qIDB4RjAtMHhGMyAqLworCTB4ODEsIDB4QTUsIDB4RDgsIDB4RjUsIDB4QkMsIDB4RkUsIDB4QkMsIDB4REIsIC8qIDB4RjQtMHhGNyAqLworCTB4ODEsIDB4QTYsIDB4ODEsIDB4QTcsIDB4ODEsIDB4QTgsIDB4QzgsIDB4Q0UsIC8qIDB4RjgtMHhGQiAqLworCTB4ODEsIDB4QTksIDB4QjcsIDB4REQsIDB4ODEsIDB4QUEsIDB4QjcsIDB4QzIsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzRGWzUxMl0gPSB7CisJMHg4MSwgMHhBQiwgMHhDNiwgMHhGMywgMHg4MSwgMHhBQywgMHg4MSwgMHhBRCwgLyogMHgwMC0weDAzICovCisJMHg4MSwgMHhBRSwgMHg4MSwgMHhBRiwgMHg4MSwgMHhCMCwgMHg4MSwgMHhCMSwgLyogMHgwNC0weDA3ICovCisJMHg4MSwgMHhCMiwgMHhEOCwgMHhGOCwgMHhEMiwgMHhDMSwgMHg4MSwgMHhCMywgLyogMHgwOC0weDBCICovCisJMHg4MSwgMHhCNCwgMHhDRSwgMHhFOSwgMHhCQywgMHhCRiwgMHhCNywgMHhGQywgLyogMHgwQy0weDBGICovCisJMHhCNywgMHhBNSwgMHhEMCwgMHhERCwgMHg4MSwgMHhCNSwgMHg4MSwgMHhCNiwgLyogMHgxMC0weDEzICovCisJMHg4MSwgMHhCNywgMHg4MSwgMHhCOCwgMHg4MSwgMHhCOSwgMHhENiwgMHhEQSwgLyogMHgxNC0weDE3ICovCisJMHhEMywgMHhDNSwgMHhCQiwgMHhFRiwgMHhCQiwgMHhFMSwgMHhEOCwgMHhGMSwgLyogMHgxOC0weDFCICovCisJMHg4MSwgMHhCQSwgMHg4MSwgMHhCQiwgMHhDOSwgMHhBMSwgMHhDRSwgMHhCMCwgLyogMHgxQy0weDFGICovCisJMHhCNCwgMHhBQiwgMHg4MSwgMHhCQywgMHhEOCwgMHhGMywgMHg4MSwgMHhCRCwgLyogMHgyMC0weDIzICovCisJMHhDOSwgMHhDQiwgMHhEOCwgMHhGNiwgMHhDMiwgMHhENywgMHhEOCwgMHhGNywgLyogMHgyNC0weDI3ICovCisJMHg4MSwgMHhCRSwgMHg4MSwgMHhCRiwgMHhDRSwgMHhCMSwgMHhEOCwgMHhGOSwgLyogMHgyOC0weDJCICovCisJMHg4MSwgMHhDMCwgMHg4MSwgMHhDMSwgMHg4MSwgMHhDMiwgMHhCMiwgMHhBRSwgLyogMHgyQy0weDJGICovCisJMHhCOSwgMHhDMCwgMHg4MSwgMHhDMywgMHhEOSwgMHhBMywgMHg4MSwgMHhDNCwgLyogMHgzMC0weDMzICovCisJMHhCMCwgMHhFOSwgMHg4MSwgMHhDNSwgMHhDMSwgMHhFNiwgMHg4MSwgMHhDNiwgLyogMHgzNC0weDM3ICovCisJMHhDOSwgMHhFQywgMHg4MSwgMHhDNywgMHhDQiwgMHhDNSwgMHg4MSwgMHhDOCwgLyogMHgzOC0weDNCICovCisJMHhDQiwgMHhDNiwgMHhEOSwgMHhBNCwgMHg4MSwgMHhDOSwgMHg4MSwgMHhDQSwgLyogMHgzQy0weDNGICovCisJMHg4MSwgMHhDQiwgMHg4MSwgMHhDQywgMHg4MSwgMHhDRCwgMHhCNSwgMHhFOCwgLyogMHg0MC0weDQzICovCisJMHg4MSwgMHhDRSwgMHg4MSwgMHhDRiwgMHhCNSwgMHhBQiwgMHg4MSwgMHhEMCwgLyogMHg0NC0weDQ3ICovCisJMHg4MSwgMHhEMSwgMHg4MSwgMHhEMiwgMHg4MSwgMHhEMywgMHg4MSwgMHhENCwgLyogMHg0OC0weDRCICovCisJMHg4MSwgMHhENSwgMHhDRSwgMHhCQiwgMHhCNSwgMHhDRCwgMHhENywgMHhBMSwgLyogMHg0Qy0weDRGICovCisJMHhENywgMHhGNCwgMHhEMywgMHhEMywgMHg4MSwgMHhENiwgMHhDQywgMHhFNSwgLyogMHg1MC0weDUzICovCisJMHg4MSwgMHhENywgMHhCQSwgMHhDRSwgMHg4MSwgMHhEOCwgMHhEOSwgMHhBMiwgLyogMHg1NC0weDU3ICovCisJMHhEOSwgMHhEQywgMHhEMywgMHhFMCwgMHhEOCwgMHhGRCwgMHhCNywgMHhGMCwgLyogMHg1OC0weDVCICovCisJMHhENywgMHhGNywgMHhEOCwgMHhGRSwgMHhEOCwgMHhGQSwgMHhEOSwgMHhBMSwgLyogMHg1Qy0weDVGICovCisJMHhDNCwgMHhFMywgMHg4MSwgMHhEOSwgMHg4MSwgMHhEQSwgMHhEMywgMHhCNiwgLyogMHg2MC0weDYzICovCisJMHhEOCwgMHhGNCwgMHhEOSwgMHhERCwgMHg4MSwgMHhEQiwgMHhEOCwgMHhGQiwgLyogMHg2NC0weDY3ICovCisJMHg4MSwgMHhEQywgMHhDNSwgMHhFNSwgMHg4MSwgMHhERCwgMHg4MSwgMHhERSwgLyogMHg2OC0weDZCICovCisJMHhDMCwgMHhEMCwgMHg4MSwgMHhERiwgMHg4MSwgMHhFMCwgMHhEMSwgMHhGMCwgLyogMHg2Qy0weDZGICovCisJMHhCMCwgMHhEQiwgMHg4MSwgMHhFMSwgMHg4MSwgMHhFMiwgMHhCQywgMHhEMSwgLyogMHg3MC0weDczICovCisJMHhEOSwgMHhBNiwgMHg4MSwgMHhFMywgMHhEOSwgMHhBNSwgMHg4MSwgMHhFNCwgLyogMHg3NC0weDc3ICovCisJMHg4MSwgMHhFNSwgMHg4MSwgMHhFNiwgMHg4MSwgMHhFNywgMHhEOSwgMHhBQywgLyogMHg3OC0weDdCICovCisJMHhEOSwgMHhBRSwgMHg4MSwgMHhFOCwgMHhEOSwgMHhBQiwgMHhDQSwgMHhCOSwgLyogMHg3Qy0weDdGICovCisJCisJMHg4MSwgMHhFOSwgMHg4MSwgMHhFQSwgMHg4MSwgMHhFQiwgMHhEOSwgMHhBOSwgLyogMHg4MC0weDgzICovCisJMHhENiwgMHhCNiwgMHg4MSwgMHhFQywgMHg4MSwgMHhFRCwgMHg4MSwgMHhFRSwgLyogMHg4NC0weDg3ICovCisJMHhCMywgMHhERSwgMHhEOSwgMHhBOCwgMHg4MSwgMHhFRiwgMHhDMCwgMHhGRCwgLyogMHg4OC0weDhCICovCisJMHg4MSwgMHhGMCwgMHhDQSwgMHhDQywgMHg4MSwgMHhGMSwgMHhEOSwgMHhBQSwgLyogMHg4Qy0weDhGICovCisJMHg4MSwgMHhGMiwgMHhEOSwgMHhBNywgMHg4MSwgMHhGMywgMHg4MSwgMHhGNCwgLyogMHg5MC0weDkzICovCisJMHhEOSwgMHhCMCwgMHg4MSwgMHhGNSwgMHg4MSwgMHhGNiwgMHhCNiwgMHhCMSwgLyogMHg5NC0weDk3ICovCisJMHg4MSwgMHhGNywgMHg4MSwgMHhGOCwgMHg4MSwgMHhGOSwgMHhCOSwgMHhBOSwgLyogMHg5OC0weDlCICovCisJMHg4MSwgMHhGQSwgMHhEMiwgMHhDMCwgMHg4MSwgMHhGQiwgMHg4MSwgMHhGQywgLyogMHg5Qy0weDlGICovCisJMHhDRiwgMHhDMCwgMHg4MSwgMHhGRCwgMHg4MSwgMHhGRSwgMHhDMiwgMHhDMiwgLyogMHhBMC0weEEzICovCisJMHg4MiwgMHg0MCwgMHhCRCwgMHhDNCwgMHhENSwgMHhFQywgMHhCMiwgMHhFMCwgLyogMHhBNC0weEE3ICovCisJMHhDNywgMHhDOCwgMHhCRiwgMHhFQiwgMHhEOSwgMHhBRCwgMHg4MiwgMHg0MSwgLyogMHhBOC0weEFCICovCisJMHhEOSwgMHhBRiwgMHg4MiwgMHg0MiwgMHhDRSwgMHhFQSwgMHhCQSwgMHhFRSwgLyogMHhBQy0weEFGICovCisJMHg4MiwgMHg0MywgMHg4MiwgMHg0NCwgMHg4MiwgMHg0NSwgMHg4MiwgMHg0NiwgLyogMHhCMC0weEIzICovCisJMHg4MiwgMHg0NywgMHhDNywgMHhENiwgMHg4MiwgMHg0OCwgMHg4MiwgMHg0OSwgLyogMHhCNC0weEI3ICovCisJMHg4MiwgMHg0QSwgMHg4MiwgMHg0QiwgMHg4MiwgMHg0QywgMHg4MiwgMHg0RCwgLyogMHhCOC0weEJCICovCisJMHg4MiwgMHg0RSwgMHg4MiwgMHg0RiwgMHg4MiwgMHg1MCwgMHhCMSwgMHhFMywgLyogMHhCQy0weEJGICovCisJMHg4MiwgMHg1MSwgMHg4MiwgMHg1MiwgMHg4MiwgMHg1MywgMHhCNCwgMHhEOSwgLyogMHhDMC0weEMzICovCisJMHhCNiwgMHhFRCwgMHhEOSwgMHhCNCwgMHg4MiwgMHg1NCwgMHg4MiwgMHg1NSwgLyogMHhDNC0weEM3ICovCisJMHg4MiwgMHg1NiwgMHg4MiwgMHg1NywgMHhCRiwgMHhBMSwgMHg4MiwgMHg1OCwgLyogMHhDOC0weENCICovCisJMHg4MiwgMHg1OSwgMHg4MiwgMHg1QSwgMHhEOSwgMHhERSwgMHhDNywgMHhDRSwgLyogMHhDQy0weENGICovCisJMHhDMCwgMHhGRSwgMHhEOSwgMHhCOCwgMHg4MiwgMHg1QiwgMHg4MiwgMHg1QywgLyogMHhEMC0weEQzICovCisJMHg4MiwgMHg1RCwgMHg4MiwgMHg1RSwgMHg4MiwgMHg1RiwgMHhDQiwgMHhENywgLyogMHhENC0weEQ3ICovCisJMHhCNywgMHhGRCwgMHg4MiwgMHg2MCwgMHhEOSwgMHhCNSwgMHg4MiwgMHg2MSwgLyogMHhEOC0weERCICovCisJMHhEOSwgMHhCNywgMHhCMSwgMHhBMywgMHhEMywgMHhFMSwgMHhEOSwgMHhCOSwgLyogMHhEQy0weERGICovCisJMHg4MiwgMHg2MiwgMHhEMCwgMHhDNSwgMHg4MiwgMHg2MywgMHhEOSwgMHhCNiwgLyogMHhFMC0weEUzICovCisJMHg4MiwgMHg2NCwgMHg4MiwgMHg2NSwgMHhEOSwgMHhCMSwgMHg4MiwgMHg2NiwgLyogMHhFNC0weEU3ICovCisJMHhEOSwgMHhCMiwgMHhDMSwgMHhBOSwgMHhEOSwgMHhCMywgMHg4MiwgMHg2NywgLyogMHhFOC0weEVCICovCisJMHg4MiwgMHg2OCwgMHhCQywgMHhGMywgMHhEMCwgMHhERSwgMHhCOCwgMHhBOSwgLyogMHhFQy0weEVGICovCisJMHg4MiwgMHg2OSwgMHhCRSwgMHhFMywgMHg4MiwgMHg2QSwgMHhEOSwgMHhCRCwgLyogMHhGMC0weEYzICovCisJMHg4MiwgMHg2QiwgMHg4MiwgMHg2QywgMHg4MiwgMHg2RCwgMHg4MiwgMHg2RSwgLyogMHhGNC0weEY3ICovCisJMHhEOSwgMHhCQSwgMHg4MiwgMHg2RiwgMHhCMCwgMHhCMywgMHg4MiwgMHg3MCwgLyogMHhGOC0weEZCICovCisJMHg4MiwgMHg3MSwgMHg4MiwgMHg3MiwgMHhEOSwgMHhDMiwgMHg4MiwgMHg3MywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTBbNTEyXSA9IHsKKwkweDgyLCAweDc0LCAweDgyLCAweDc1LCAweDgyLCAweDc2LCAweDgyLCAweDc3LCAvKiAweDAwLTB4MDMgKi8KKwkweDgyLCAweDc4LCAweDgyLCAweDc5LCAweDgyLCAweDdBLCAweDgyLCAweDdCLCAvKiAweDA0LTB4MDcgKi8KKwkweDgyLCAweDdDLCAweDgyLCAweDdELCAweDgyLCAweDdFLCAweDgyLCAweDgwLCAvKiAweDA4LTB4MEIgKi8KKwkweEQ5LCAweEM0LCAweEIxLCAweEI2LCAweDgyLCAweDgxLCAweEQ5LCAweEJGLCAvKiAweDBDLTB4MEYgKi8KKwkweDgyLCAweDgyLCAweDgyLCAweDgzLCAweEI1LCAweEI5LCAweDgyLCAweDg0LCAvKiAweDEwLTB4MTMgKi8KKwkweEJFLCAweEYzLCAweDgyLCAweDg1LCAweDgyLCAweDg2LCAweDgyLCAweDg3LCAvKiAweDE0LTB4MTcgKi8KKwkweENDLCAweEM4LCAweEJBLCAweEYyLCAweEQyLCAweEQwLCAweDgyLCAweDg4LCAvKiAweDE4LTB4MUIgKi8KKwkweEQ5LCAweEMzLCAweDgyLCAweDg5LCAweDgyLCAweDhBLCAweEJELCAweEU4LCAvKiAweDFDLTB4MUYgKi8KKwkweDgyLCAweDhCLCAweEIzLCAweEFCLCAweDgyLCAweDhDLCAweDgyLCAweDhELCAvKiAweDIwLTB4MjMgKi8KKwkweDgyLCAweDhFLCAweEQ5LCAweEM1LCAweEJFLCAweEVCLCAweDgyLCAweDhGLCAvKiAweDI0LTB4MjcgKi8KKwkweEQ5LCAweEM2LCAweEQ5LCAweEJCLCAweEM0LCAweERGLCAweDgyLCAweDkwLCAvKiAweDI4LTB4MkIgKi8KKwkweEQ5LCAweEJFLCAweEQ5LCAweEMxLCAweEQ5LCAweEMwLCAweDgyLCAweDkxLCAvKiAweDJDLTB4MkYgKi8KKwkweDgyLCAweDkyLCAweDgyLCAweDkzLCAweDgyLCAweDk0LCAweDgyLCAweDk1LCAvKiAweDMwLTB4MzMgKi8KKwkweDgyLCAweDk2LCAweDgyLCAweDk3LCAweDgyLCAweDk4LCAweDgyLCAweDk5LCAvKiAweDM0LTB4MzcgKi8KKwkweDgyLCAweDlBLCAweDgyLCAweDlCLCAweEQ1LCAweEFFLCAweDgyLCAweDlDLCAvKiAweDM4LTB4M0IgKi8KKwkweEQ2LCAweEI1LCAweDgyLCAweDlELCAweEM3LCAweEUzLCAweDgyLCAweDlFLCAvKiAweDNDLTB4M0YgKi8KKwkweDgyLCAweDlGLCAweDgyLCAweEEwLCAweDgyLCAweEExLCAweEQ5LCAweEM4LCAvKiAweDQwLTB4NDMgKi8KKwkweDgyLCAweEEyLCAweDgyLCAweEEzLCAweDgyLCAweEE0LCAweEJDLCAweEQ5LCAvKiAweDQ0LTB4NDcgKi8KKwkweEQ5LCAweENBLCAweDgyLCAweEE1LCAweDgyLCAweEE2LCAweDgyLCAweEE3LCAvKiAweDQ4LTB4NEIgKi8KKwkweEQ5LCAweEJDLCAweDgyLCAweEE4LCAweEQ5LCAweENCLCAweEM2LCAweEFCLCAvKiAweDRDLTB4NEYgKi8KKwkweDgyLCAweEE5LCAweDgyLCAweEFBLCAweDgyLCAweEFCLCAweDgyLCAweEFDLCAvKiAweDUwLTB4NTMgKi8KKwkweDgyLCAweEFELCAweEQ5LCAweEM5LCAweDgyLCAweEFFLCAweDgyLCAweEFGLCAvKiAweDU0LTB4NTcgKi8KKwkweDgyLCAweEIwLCAweDgyLCAweEIxLCAweEQ3LCAweEY2LCAweDgyLCAweEIyLCAvKiAweDU4LTB4NUIgKi8KKwkweENELCAweEEzLCAweDgyLCAweEIzLCAweDgyLCAweEI0LCAweDgyLCAweEI1LCAvKiAweDVDLTB4NUYgKi8KKwkweDgyLCAweEI2LCAweDgyLCAweEI3LCAweDgyLCAweEI4LCAweDgyLCAweEI5LCAvKiAweDYwLTB4NjMgKi8KKwkweDgyLCAweEJBLCAweEJELCAweEExLCAweDgyLCAweEJCLCAweDgyLCAweEJDLCAvKiAweDY0LTB4NjcgKi8KKwkweDgyLCAweEJELCAweDgyLCAweEJFLCAweDgyLCAweEJGLCAweDgyLCAweEMwLCAvKiAweDY4LTB4NkIgKi8KKwkweEQ5LCAweENDLCAweDgyLCAweEMxLCAweDgyLCAweEMyLCAweDgyLCAweEMzLCAvKiAweDZDLTB4NkYgKi8KKwkweDgyLCAweEM0LCAweDgyLCAweEM1LCAweDgyLCAweEM2LCAweDgyLCAweEM3LCAvKiAweDcwLTB4NzMgKi8KKwkweDgyLCAweEM4LCAweDgyLCAweEM5LCAweEM1LCAweEJDLCAweENELCAweEI1LCAvKiAweDc0LTB4NzcgKi8KKwkweDgyLCAweENBLCAweDgyLCAweENCLCAweDgyLCAweENDLCAweEQ5LCAweENELCAvKiAweDc4LTB4N0IgKi8KKwkweDgyLCAweENELCAweDgyLCAweENFLCAweEQ5LCAweEM3LCAweEIzLCAweEE1LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEJGLCAweEZFLCAweDgyLCAweENGLCAweDgyLCAweEQwLCAweDgyLCAweEQxLCAvKiAweDgwLTB4ODMgKi8KKwkweDgyLCAweEQyLCAweEI4LCAweEI1LCAweDgyLCAweEQzLCAweDgyLCAweEQ0LCAvKiAweDg0LTB4ODcgKi8KKwkweEMwLCAweEZDLCAweDgyLCAweEQ1LCAweDgyLCAweEQ2LCAweDgyLCAweEQ3LCAvKiAweDg4LTB4OEIgKi8KKwkweDgyLCAweEQ4LCAweEIwLCAweEY4LCAweDgyLCAweEQ5LCAweDgyLCAweERBLCAvKiAweDhDLTB4OEYgKi8KKwkweDgyLCAweERCLCAweDgyLCAweERDLCAweDgyLCAweERELCAweDgyLCAweERFLCAvKiAweDkwLTB4OTMgKi8KKwkweDgyLCAweERGLCAweDgyLCAweEUwLCAweDgyLCAweEUxLCAweDgyLCAweEUyLCAvKiAweDk0LTB4OTcgKi8KKwkweDgyLCAweEUzLCAweDgyLCAweEU0LCAweDgyLCAweEU1LCAweDgyLCAweEU2LCAvKiAweDk4LTB4OUIgKi8KKwkweDgyLCAweEU3LCAweDgyLCAweEU4LCAweDgyLCAweEU5LCAweDgyLCAweEVBLCAvKiAweDlDLTB4OUYgKi8KKwkweDgyLCAweEVCLCAweDgyLCAweEVDLCAweDgyLCAweEVELCAweEI0LCAweEY2LCAvKiAweEEwLTB4QTMgKi8KKwkweDgyLCAweEVFLCAweEQ5LCAweENFLCAweDgyLCAweEVGLCAweEQ5LCAweENGLCAvKiAweEE0LTB4QTcgKi8KKwkweEI0LCAweEEyLCAweEQ5LCAweEQwLCAweDgyLCAweEYwLCAweDgyLCAweEYxLCAvKiAweEE4LTB4QUIgKi8KKwkweEI0LCAweERGLCAweDgyLCAweEYyLCAweDgyLCAweEYzLCAweDgyLCAweEY0LCAvKiAweEFDLTB4QUYgKi8KKwkweDgyLCAweEY1LCAweDgyLCAweEY2LCAweEIwLCAweEMxLCAweDgyLCAweEY3LCAvKiAweEIwLTB4QjMgKi8KKwkweDgyLCAweEY4LCAweDgyLCAweEY5LCAweDgyLCAweEZBLCAweDgyLCAweEZCLCAvKiAweEI0LTB4QjcgKi8KKwkweDgyLCAweEZDLCAweDgyLCAweEZELCAweEQ5LCAweEQxLCAweEM5LCAweEI1LCAvKiAweEI4LTB4QkIgKi8KKwkweDgyLCAweEZFLCAweDgzLCAweDQwLCAweDgzLCAweDQxLCAweDgzLCAweDQyLCAvKiAweEJDLTB4QkYgKi8KKwkweDgzLCAweDQzLCAweDgzLCAweDQ0LCAweDgzLCAweDQ1LCAweDgzLCAweDQ2LCAvKiAweEMwLTB4QzMgKi8KKwkweDgzLCAweDQ3LCAweDgzLCAweDQ4LCAweDgzLCAweDQ5LCAweDgzLCAweDRBLCAvKiAweEM0LTB4QzcgKi8KKwkweDgzLCAweDRCLCAweDgzLCAweDRDLCAweDgzLCAweDRELCAweDgzLCAweDRFLCAvKiAweEM4LTB4Q0IgKi8KKwkweDgzLCAweDRGLCAweDgzLCAweDUwLCAweDgzLCAweDUxLCAweENGLCAweEYxLCAvKiAweENDLTB4Q0YgKi8KKwkweDgzLCAweDUyLCAweDgzLCAweDUzLCAweDgzLCAweDU0LCAweDgzLCAweDU1LCAvKiAweEQwLTB4RDMgKi8KKwkweDgzLCAweDU2LCAweDgzLCAweDU3LCAweEQ5LCAweEQyLCAweDgzLCAweDU4LCAvKiAweEQ0LTB4RDcgKi8KKwkweDgzLCAweDU5LCAweDgzLCAweDVBLCAweEMxLCAweEM1LCAweDgzLCAweDVCLCAvKiAweEQ4LTB4REIgKi8KKwkweDgzLCAweDVDLCAweDgzLCAweDVELCAweDgzLCAweDVFLCAweDgzLCAweDVGLCAvKiAweERDLTB4REYgKi8KKwkweDgzLCAweDYwLCAweDgzLCAweDYxLCAweDgzLCAweDYyLCAweDgzLCAweDYzLCAvKiAweEUwLTB4RTMgKi8KKwkweDgzLCAweDY0LCAweDgzLCAweDY1LCAweEQ5LCAweEQ2LCAweEM5LCAweEFFLCAvKiAweEU0LTB4RTcgKi8KKwkweDgzLCAweDY2LCAweDgzLCAweDY3LCAweDgzLCAweDY4LCAweDgzLCAweDY5LCAvKiAweEU4LTB4RUIgKi8KKwkweEQ5LCAweEQ1LCAweEQ5LCAweEQ0LCAweEQ5LCAweEQ3LCAweDgzLCAweDZBLCAvKiAweEVDLTB4RUYgKi8KKwkweDgzLCAweDZCLCAweDgzLCAweDZDLCAweDgzLCAweDZELCAweENCLCAweERCLCAvKiAweEYwLTB4RjMgKi8KKwkweDgzLCAweDZFLCAweEJELCAweEE5LCAweDgzLCAweDZGLCAweDgzLCAweDcwLCAvKiAweEY0LTB4RjcgKi8KKwkweDgzLCAweDcxLCAweDgzLCAweDcyLCAweDgzLCAweDczLCAweEM2LCAweEE3LCAvKiAweEY4LTB4RkIgKi8KKwkweDgzLCAweDc0LCAweDgzLCAweDc1LCAweDgzLCAweDc2LCAweDgzLCAweDc3LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181MVs1MTJdID0geworCTB4ODMsIDB4NzgsIDB4ODMsIDB4NzksIDB4ODMsIDB4N0EsIDB4ODMsIDB4N0IsIC8qIDB4MDAtMHgwMyAqLworCTB4ODMsIDB4N0MsIDB4ODMsIDB4N0QsIDB4RDksIDB4RDMsIDB4RDksIDB4RDgsIC8qIDB4MDQtMHgwNyAqLworCTB4ODMsIDB4N0UsIDB4ODMsIDB4ODAsIDB4ODMsIDB4ODEsIDB4RDksIDB4RDksIC8qIDB4MDgtMHgwQiAqLworCTB4ODMsIDB4ODIsIDB4ODMsIDB4ODMsIDB4ODMsIDB4ODQsIDB4ODMsIDB4ODUsIC8qIDB4MEMtMHgwRiAqLworCTB4ODMsIDB4ODYsIDB4ODMsIDB4ODcsIDB4QzgsIDB4RTUsIDB4ODMsIDB4ODgsIC8qIDB4MTAtMHgxMyAqLworCTB4ODMsIDB4ODksIDB4ODMsIDB4OEEsIDB4ODMsIDB4OEIsIDB4ODMsIDB4OEMsIC8qIDB4MTQtMHgxNyAqLworCTB4ODMsIDB4OEQsIDB4ODMsIDB4OEUsIDB4ODMsIDB4OEYsIDB4ODMsIDB4OTAsIC8qIDB4MTgtMHgxQiAqLworCTB4ODMsIDB4OTEsIDB4ODMsIDB4OTIsIDB4ODMsIDB4OTMsIDB4ODMsIDB4OTQsIC8qIDB4MUMtMHgxRiAqLworCTB4ODMsIDB4OTUsIDB4QzAsIDB4REMsIDB4ODMsIDB4OTYsIDB4ODMsIDB4OTcsIC8qIDB4MjAtMHgyMyAqLworCTB4ODMsIDB4OTgsIDB4ODMsIDB4OTksIDB4ODMsIDB4OUEsIDB4ODMsIDB4OUIsIC8qIDB4MjQtMHgyNyAqLworCTB4ODMsIDB4OUMsIDB4ODMsIDB4OUQsIDB4ODMsIDB4OUUsIDB4ODMsIDB4OUYsIC8qIDB4MjgtMHgyQiAqLworCTB4ODMsIDB4QTAsIDB4ODMsIDB4QTEsIDB4ODMsIDB4QTIsIDB4ODMsIDB4QTMsIC8qIDB4MkMtMHgyRiAqLworCTB4ODMsIDB4QTQsIDB4ODMsIDB4QTUsIDB4ODMsIDB4QTYsIDB4ODMsIDB4QTcsIC8qIDB4MzAtMHgzMyAqLworCTB4ODMsIDB4QTgsIDB4ODMsIDB4QTksIDB4ODMsIDB4QUEsIDB4ODMsIDB4QUIsIC8qIDB4MzQtMHgzNyAqLworCTB4ODMsIDB4QUMsIDB4ODMsIDB4QUQsIDB4ODMsIDB4QUUsIDB4ODMsIDB4QUYsIC8qIDB4MzgtMHgzQiAqLworCTB4ODMsIDB4QjAsIDB4ODMsIDB4QjEsIDB4ODMsIDB4QjIsIDB4QjYsIDB4RjksIC8qIDB4M0MtMHgzRiAqLworCTB4RDgsIDB4QTMsIDB4RDQsIDB4Q0EsIDB4ODMsIDB4QjMsIDB4RDQsIDB4QUEsIC8qIDB4NDAtMHg0MyAqLworCTB4RDAsIDB4RDYsIDB4QjMsIDB4RTQsIDB4RDUsIDB4RDcsIDB4ODMsIDB4QjQsIC8qIDB4NDQtMHg0NyAqLworCTB4Q0YsIDB4QzgsIDB4QjksIDB4RTIsIDB4ODMsIDB4QjUsIDB4QkYsIDB4Q0IsIC8qIDB4NDgtMHg0QiAqLworCTB4ODMsIDB4QjYsIDB4QzMsIDB4RTIsIDB4ODMsIDB4QjcsIDB4ODMsIDB4QjgsIC8qIDB4NEMtMHg0RiAqLworCTB4ODMsIDB4QjksIDB4QjYsIDB4RDIsIDB4ODMsIDB4QkEsIDB4ODMsIDB4QkIsIC8qIDB4NTAtMHg1MyAqLworCTB4Q0QsIDB4QzMsIDB4RDksIDB4RUUsIDB4RDksIDB4RjAsIDB4ODMsIDB4QkMsIC8qIDB4NTQtMHg1NyAqLworCTB4ODMsIDB4QkQsIDB4ODMsIDB4QkUsIDB4QjUsIDB4QjMsIDB4ODMsIDB4QkYsIC8qIDB4NTgtMHg1QiAqLworCTB4QjYsIDB4QjUsIDB4ODMsIDB4QzAsIDB4ODMsIDB4QzEsIDB4ODMsIDB4QzIsIC8qIDB4NUMtMHg1RiAqLworCTB4ODMsIDB4QzMsIDB4ODMsIDB4QzQsIDB4QkUsIDB4QTQsIDB4ODMsIDB4QzUsIC8qIDB4NjAtMHg2MyAqLworCTB4ODMsIDB4QzYsIDB4QzgsIDB4RUIsIDB4ODMsIDB4QzcsIDB4ODMsIDB4QzgsIC8qIDB4NjQtMHg2NyAqLworCTB4QzgsIDB4QUIsIDB4ODMsIDB4QzksIDB4ODMsIDB4Q0EsIDB4QjAsIDB4Q0IsIC8qIDB4NjgtMHg2QiAqLworCTB4QjksIDB4QUIsIDB4QzEsIDB4RjksIDB4RDksIDB4RTIsIDB4ODMsIDB4Q0IsIC8qIDB4NkMtMHg2RiAqLworCTB4QzAsIDB4QkMsIDB4QjksIDB4QjIsIDB4ODMsIDB4Q0MsIDB4QjksIDB4RDgsIC8qIDB4NzAtMHg3MyAqLworCTB4RDAsIDB4Q0IsIDB4QjEsIDB4RjgsIDB4QzYsIDB4RTQsIDB4QkUsIDB4REYsIC8qIDB4NzQtMHg3NyAqLworCTB4QjUsIDB4RTQsIDB4RDcsIDB4QzgsIDB4ODMsIDB4Q0QsIDB4RDEsIDB4RjgsIC8qIDB4NzgtMHg3QiAqLworCTB4QkMsIDB4RTYsIDB4Q0EsIDB4REUsIDB4ODMsIDB4Q0UsIDB4ODMsIDB4Q0YsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QkMsIDB4QkQsIDB4RDksIDB4RTYsIDB4RDgsIDB4RTcsIDB4ODMsIDB4RDAsIC8qIDB4ODAtMHg4MyAqLworCTB4ODMsIDB4RDEsIDB4QzQsIDB4REEsIDB4ODMsIDB4RDIsIDB4ODMsIDB4RDMsIC8qIDB4ODQtMHg4NyAqLworCTB4QjgsIDB4RDQsIDB4QzgsIDB4QkQsIDB4ODMsIDB4RDQsIDB4ODMsIDB4RDUsIC8qIDB4ODgtMHg4QiAqLworCTB4QjIsIDB4RTEsIDB4RDQsIDB4RDksIDB4ODMsIDB4RDYsIDB4ODMsIDB4RDcsIC8qIDB4OEMtMHg4RiAqLworCTB4ODMsIDB4RDgsIDB4ODMsIDB4RDksIDB4QzMsIDB4QjAsIDB4ODMsIDB4REEsIC8qIDB4OTAtMHg5MyAqLworCTB4ODMsIDB4REIsIDB4QzMsIDB4RTEsIDB4REEsIDB4QTIsIDB4QzgsIDB4REYsIC8qIDB4OTQtMHg5NyAqLworCTB4ODMsIDB4REMsIDB4RDAsIDB4QjQsIDB4ODMsIDB4REQsIDB4QkUsIDB4RkMsIC8qIDB4OTgtMHg5QiAqLworCTB4QzUsIDB4QTksIDB4ODMsIDB4REUsIDB4ODMsIDB4REYsIDB4ODMsIDB4RTAsIC8qIDB4OUMtMHg5RiAqLworCTB4QjksIDB4REEsIDB4ODMsIDB4RTEsIDB4REEsIDB4QTMsIDB4ODMsIDB4RTIsIC8qIDB4QTAtMHhBMyAqLworCTB4RDQsIDB4QTksIDB4REEsIDB4QTQsIDB4ODMsIDB4RTMsIDB4ODMsIDB4RTQsIC8qIDB4QTQtMHhBNyAqLworCTB4ODMsIDB4RTUsIDB4ODMsIDB4RTYsIDB4ODMsIDB4RTcsIDB4RDksIDB4RkIsIC8qIDB4QTgtMHhBQiAqLworCTB4QjYsIDB4QUMsIDB4ODMsIDB4RTgsIDB4ODMsIDB4RTksIDB4QjcsIDB4RUIsIC8qIDB4QUMtMHhBRiAqLworCTB4QjEsIDB4RjksIDB4RDksIDB4RkMsIDB4QjMsIDB4RTUsIDB4QkUsIDB4RjYsIC8qIDB4QjAtMHhCMyAqLworCTB4ODMsIDB4RUEsIDB4QkYsIDB4RjYsIDB4RDIsIDB4QjEsIDB4QzAsIDB4RTQsIC8qIDB4QjQtMHhCNyAqLworCTB4ODMsIDB4RUIsIDB4ODMsIDB4RUMsIDB4ODMsIDB4RUQsIDB4QjYsIDB4QjMsIC8qIDB4QjgtMHhCQiAqLworCTB4RDksIDB4RkUsIDB4RDksIDB4RkQsIDB4ODMsIDB4RUUsIDB4ODMsIDB4RUYsIC8qIDB4QkMtMHhCRiAqLworCTB4QkUsIDB4QkIsIDB4ODMsIDB4RjAsIDB4ODMsIDB4RjEsIDB4ODMsIDB4RjIsIC8qIDB4QzAtMHhDMyAqLworCTB4QzYsIDB4RTAsIDB4ODMsIDB4RjMsIDB4RDcsIDB4QkMsIDB4REEsIDB4QTEsIC8qIDB4QzQtMHhDNyAqLworCTB4ODMsIDB4RjQsIDB4QzEsIDB4QjksIDB4ODMsIDB4RjUsIDB4QjUsIDB4RjIsIC8qIDB4QzgtMHhDQiAqLworCTB4QzEsIDB4RTgsIDB4ODMsIDB4RjYsIDB4ODMsIDB4RjcsIDB4QkMsIDB4RjUsIC8qIDB4Q0MtMHhDRiAqLworCTB4ODMsIDB4RjgsIDB4QjQsIDB4RDUsIDB4ODMsIDB4RjksIDB4ODMsIDB4RkEsIC8qIDB4RDAtMHhEMyAqLworCTB4ODMsIDB4RkIsIDB4ODMsIDB4RkMsIDB4ODMsIDB4RkQsIDB4ODMsIDB4RkUsIC8qIDB4RDQtMHhENyAqLworCTB4ODQsIDB4NDAsIDB4ODQsIDB4NDEsIDB4ODQsIDB4NDIsIDB4QzEsIDB4REQsIC8qIDB4RDgtMHhEQiAqLworCTB4ODQsIDB4NDMsIDB4QzQsIDB4RkQsIDB4ODQsIDB4NDQsIDB4ODQsIDB4NDUsIC8qIDB4REMtMHhERiAqLworCTB4QkMsIDB4QjgsIDB4QjcsIDB4QjIsIDB4ODQsIDB4NDYsIDB4ODQsIDB4NDcsIC8qIDB4RTAtMHhFMyAqLworCTB4QjcsIDB4RUYsIDB4ODQsIDB4NDgsIDB4ODQsIDB4NDksIDB4ODQsIDB4NEEsIC8qIDB4RTQtMHhFNyAqLworCTB4ODQsIDB4NEIsIDB4ODQsIDB4NEMsIDB4ODQsIDB4NEQsIDB4RDksIDB4RUMsIC8qIDB4RTgtMHhFQiAqLworCTB4ODQsIDB4NEUsIDB4QzYsIDB4QkUsIDB4ODQsIDB4NEYsIDB4QkYsIDB4QUQsIC8qIDB4RUMtMHhFRiAqLworCTB4QkIsIDB4Q0IsIDB4ODQsIDB4NTAsIDB4ODQsIDB4NTEsIDB4QjUsIDB4Q0EsIC8qIDB4RjAtMHhGMyAqLworCTB4ODQsIDB4NTIsIDB4REIsIDB4QzksIDB4RDAsIDB4RDcsIDB4ODQsIDB4NTMsIC8qIDB4RjQtMHhGNyAqLworCTB4Q0QsIDB4QjksIDB4QjAsIDB4QkMsIDB4QjMsIDB4RjYsIDB4QkIsIDB4RjcsIC8qIDB4RjgtMHhGQiAqLworCTB4REIsIDB4Q0EsIDB4QkEsIDB4QUYsIDB4ODQsIDB4NTQsIDB4RDQsIDB4RTQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzUyWzUxMl0gPSB7CisJMHhCNSwgMHhCNiwgMHhCNSwgMHhGMywgMHhEOCwgMHhENiwgMHhDOCwgMHhEMCwgLyogMHgwMC0weDAzICovCisJMHg4NCwgMHg1NSwgMHg4NCwgMHg1NiwgMHhCNywgMHhENiwgMHhDNywgMHhEMCwgLyogMHgwNC0weDA3ICovCisJMHhEOCwgMHhENywgMHg4NCwgMHg1NywgMHhCRiwgMHhBRiwgMHg4NCwgMHg1OCwgLyogMHgwOC0weDBCICovCisJMHg4NCwgMHg1OSwgMHhEQiwgMHhCQiwgMHhEOCwgMHhEOCwgMHg4NCwgMHg1QSwgLyogMHgwQy0weDBGICovCisJMHg4NCwgMHg1QiwgMHhEMCwgMHhDQywgMHhCQiwgMHhBRSwgMHg4NCwgMHg1QywgLyogMHgxMC0weDEzICovCisJMHg4NCwgMHg1RCwgMHg4NCwgMHg1RSwgMHhFQiwgMHhCRSwgMHhDMSwgMHhEMCwgLyogMHgxNC0weDE3ICovCisJMHhDMSwgMHhGNSwgMHhENCwgMHhGMiwgMHhCOCwgMHhENSwgMHhCNCwgMHhCNCwgLyogMHgxOC0weDFCICovCisJMHg4NCwgMHg1RiwgMHhCMywgMHhGNSwgMHg4NCwgMHg2MCwgMHg4NCwgMHg2MSwgLyogMHgxQy0weDFGICovCisJMHhDOSwgMHhCRSwgMHg4NCwgMHg2MiwgMHg4NCwgMHg2MywgMHg4NCwgMHg2NCwgLyogMHgyMC0weDIzICovCisJMHhDNSwgMHhEMCwgMHg4NCwgMHg2NSwgMHg4NCwgMHg2NiwgMHg4NCwgMHg2NywgLyogMHgyNC0weDI3ICovCisJMHhDNSwgMHhEOSwgMHhDMCwgMHhGQiwgMHg4NCwgMHg2OCwgMHhCMSwgMHhGMCwgLyogMHgyOC0weDJCICovCisJMHg4NCwgMHg2OSwgMHhEOCwgMHhEOSwgMHhCOSwgMHhDRSwgMHg4NCwgMHg2QSwgLyogMHgyQy0weDJGICovCisJMHhCNSwgMHhCRCwgMHg4NCwgMHg2QiwgMHg4NCwgMHg2QywgMHhEOCwgMHhEQSwgLyogMHgzMC0weDMzICovCisJMHg4NCwgMHg2RCwgMHg4NCwgMHg2RSwgMHhENiwgMHhDNiwgMHhDQiwgMHhBMiwgLyogMHgzNC0weDM3ICovCisJMHhDOCwgMHhBRiwgMHhDOSwgMHhCMiwgMHhCNCwgMHhDQywgMHhCRiwgMHhDQywgLyogMHgzOC0weDNCICovCisJMHg4NCwgMHg2RiwgMHhCOSwgMHhGNCwgMHg4NCwgMHg3MCwgMHhEOCwgMHhEQiwgLyogMHgzQy0weDNGICovCisJMHhEOCwgMHhEQywgMHhCNiwgMHhFNywgMHhCQywgMHhDMSwgMHhDQywgMHhFQSwgLyogMHg0MC0weDQzICovCisJMHg4NCwgMHg3MSwgMHg4NCwgMHg3MiwgMHg4NCwgMHg3MywgMHg4NCwgMHg3NCwgLyogMHg0NC0weDQ3ICovCisJMHg4NCwgMHg3NSwgMHg4NCwgMHg3NiwgMHhDRiwgMHhGNywgMHg4NCwgMHg3NywgLyogMHg0OC0weDRCICovCisJMHhEOCwgMHhERCwgMHhDNywgMHhCMCwgMHg4NCwgMHg3OCwgMHg4NCwgMHg3OSwgLyogMHg0Qy0weDRGICovCisJMHhCOSwgMHhEMCwgMHhCRCwgMHhBMywgMHg4NCwgMHg3QSwgMHg4NCwgMHg3QiwgLyogMHg1MC0weDUzICovCisJMHhDQywgMHhERSwgMHg4NCwgMHg3QywgMHhDNiwgMHhDQSwgMHg4NCwgMHg3RCwgLyogMHg1NC0weDU3ICovCisJMHg4NCwgMHg3RSwgMHg4NCwgMHg4MCwgMHg4NCwgMHg4MSwgMHg4NCwgMHg4MiwgLyogMHg1OC0weDVCICovCisJMHhEOCwgMHhFMCwgMHg4NCwgMHg4MywgMHhEOCwgMHhERSwgMHg4NCwgMHg4NCwgLyogMHg1Qy0weDVGICovCisJMHg4NCwgMHg4NSwgMHhEOCwgMHhERiwgMHg4NCwgMHg4NiwgMHg4NCwgMHg4NywgLyogMHg2MC0weDYzICovCisJMHg4NCwgMHg4OCwgMHhCMCwgMHhGRSwgMHg4NCwgMHg4OSwgMHhCRSwgMHhFNywgLyogMHg2NC0weDY3ICovCisJMHg4NCwgMHg4QSwgMHhDQSwgMHhBMywgMHhCQywgMHhGNCwgMHg4NCwgMHg4QiwgLyogMHg2OC0weDZCICovCisJMHg4NCwgMHg4QywgMHg4NCwgMHg4RCwgMHg4NCwgMHg4RSwgMHhCOCwgMHhCMSwgLyogMHg2Qy0weDZGICovCisJMHg4NCwgMHg4RiwgMHg4NCwgMHg5MCwgMHhCOCwgMHhFRSwgMHg4NCwgMHg5MSwgLyogMHg3MC0weDczICovCisJMHg4NCwgMHg5MiwgMHg4NCwgMHg5MywgMHg4NCwgMHg5NCwgMHg4NCwgMHg5NSwgLyogMHg3NC0weDc3ICovCisJMHg4NCwgMHg5NiwgMHg4NCwgMHg5NywgMHg4NCwgMHg5OCwgMHg4NCwgMHg5OSwgLyogMHg3OC0weDdCICovCisJMHg4NCwgMHg5QSwgMHhEOCwgMHhFMiwgMHg4NCwgMHg5QiwgMHhCRCwgMHhDQiwgLyogMHg3Qy0weDdGICovCisJCisJMHg4NCwgMHg5QywgMHhEOCwgMHhFNCwgMHhEOCwgMHhFMywgMHg4NCwgMHg5RCwgLyogMHg4MC0weDgzICovCisJMHg4NCwgMHg5RSwgMHg4NCwgMHg5RiwgMHg4NCwgMHhBMCwgMHg4NCwgMHhBMSwgLyogMHg4NC0weDg3ICovCisJMHhDNSwgMHhGQywgMHg4NCwgMHhBMiwgMHg4NCwgMHhBMywgMHg4NCwgMHhBNCwgLyogMHg4OC0weDhCICovCisJMHg4NCwgMHhBNSwgMHg4NCwgMHhBNiwgMHg4NCwgMHhBNywgMHg4NCwgMHhBOCwgLyogMHg4Qy0weDhGICovCisJMHhEOCwgMHhFNSwgMHg4NCwgMHhBOSwgMHg4NCwgMHhBQSwgMHhEOCwgMHhFNiwgLyogMHg5MC0weDkzICovCisJMHg4NCwgMHhBQiwgMHg4NCwgMHhBQywgMHg4NCwgMHhBRCwgMHg4NCwgMHhBRSwgLyogMHg5NC0weDk3ICovCisJMHg4NCwgMHhBRiwgMHg4NCwgMHhCMCwgMHg4NCwgMHhCMSwgMHhDMSwgMHhBNiwgLyogMHg5OC0weDlCICovCisJMHg4NCwgMHhCMiwgMHhDOCwgMHhCMCwgMHhCMCwgMHhFQywgMHhCOSwgMHhBNiwgLyogMHg5Qy0weDlGICovCisJMHhCQywgMHhEMywgMHhDRSwgMHhGMSwgMHhEQiwgMHhCRCwgMHhDMSwgMHhEMywgLyogMHhBMC0weEEzICovCisJMHg4NCwgMHhCMywgMHg4NCwgMHhCNCwgMHg4NCwgMHhCNSwgMHg4NCwgMHhCNiwgLyogMHhBNC0weEE3ICovCisJMHhCNiwgMHhBRiwgMHhENiwgMHhGQSwgMHhDNSwgMHhBQywgMHhCRCwgMHhEOSwgLyogMHhBOC0weEFCICovCisJMHhEQiwgMHhCRSwgMHhEQiwgMHhCRiwgMHg4NCwgMHhCNywgMHg4NCwgMHhCOCwgLyogMHhBQy0weEFGICovCisJMHg4NCwgMHhCOSwgMHhDMCwgMHhGOCwgMHhCRSwgMHhBMiwgMHhDMCwgMHhDRCwgLyogMHhCMC0weEIzICovCisJMHg4NCwgMHhCQSwgMHg4NCwgMHhCQiwgMHg4NCwgMHhCQywgMHg4NCwgMHhCRCwgLyogMHhCNC0weEI3ICovCisJMHg4NCwgMHhCRSwgMHg4NCwgMHhCRiwgMHg4NCwgMHhDMCwgMHg4NCwgMHhDMSwgLyogMHhCOC0weEJCICovCisJMHg4NCwgMHhDMiwgMHg4NCwgMHhDMywgMHhEQiwgMHhDMCwgMHhDQSwgMHhDNiwgLyogMHhCQy0weEJGICovCisJMHg4NCwgMHhDNCwgMHg4NCwgMHhDNSwgMHg4NCwgMHhDNiwgMHhCMiwgMHhBQSwgLyogMHhDMC0weEMzICovCisJMHg4NCwgMHhDNywgMHg4NCwgMHhDOCwgMHg4NCwgMHhDOSwgMHhEMywgMHhDMiwgLyogMHhDNC0weEM3ICovCisJMHg4NCwgMHhDQSwgMHhDMywgMHhFMywgMHg4NCwgMHhDQiwgMHhEMSwgMHhBQiwgLyogMHhDOC0weENCICovCisJMHg4NCwgMHhDQywgMHg4NCwgMHhDRCwgMHg4NCwgMHhDRSwgMHg4NCwgMHhDRiwgLyogMHhDQy0weENGICovCisJMHhEQiwgMHhDMiwgMHg4NCwgMHhEMCwgMHhDMCwgMHhENSwgMHg4NCwgMHhEMSwgLyogMHhEMC0weEQzICovCisJMHg4NCwgMHhEMiwgMHg4NCwgMHhEMywgMHhEQiwgMHhDMywgMHg4NCwgMHhENCwgLyogMHhENC0weEQ3ICovCisJMHhCRiwgMHhCMSwgMHg4NCwgMHhENSwgMHg4NCwgMHhENiwgMHg4NCwgMHhENywgLyogMHhEOC0weERCICovCisJMHg4NCwgMHhEOCwgMHg4NCwgMHhEOSwgMHg4NCwgMHhEQSwgMHhDNCwgMHhCQywgLyogMHhEQy0weERGICovCisJMHg4NCwgMHhEQiwgMHg4NCwgMHhEQywgMHg4NCwgMHhERCwgMHg4NCwgMHhERSwgLyogMHhFMC0weEUzICovCisJMHhDNywgMHhEQSwgMHg4NCwgMHhERiwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMSwgLyogMHhFNC0weEU3ICovCisJMHg4NCwgMHhFMiwgMHg4NCwgMHhFMywgMHg4NCwgMHhFNCwgMHg4NCwgMHhFNSwgLyogMHhFOC0weEVCICovCisJMHg4NCwgMHhFNiwgMHg4NCwgMHhFNywgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOSwgLyogMHhFQy0weEVGICovCisJMHhEQiwgMHhDNCwgMHg4NCwgMHhFQSwgMHg4NCwgMHhFQiwgMHg4NCwgMHhFQywgLyogMHhGMC0weEYzICovCisJMHg4NCwgMHhFRCwgMHg4NCwgMHhFRSwgMHg4NCwgMHhFRiwgMHg4NCwgMHhGMCwgLyogMHhGNC0weEY3ICovCisJMHg4NCwgMHhGMSwgMHhEOSwgMHhFOCwgMHhDOSwgMHhENywgMHg4NCwgMHhGMiwgLyogMHhGOC0weEZCICovCisJMHg4NCwgMHhGMywgMHg4NCwgMHhGNCwgMHhCOSwgMHhCNCwgMHhDRSwgMHhGMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTNbNTEyXSA9IHsKKwkweEQ0LCAweEM4LCAweDg0LCAweEY1LCAweDg0LCAweEY2LCAweDg0LCAweEY3LCAvKiAweDAwLTB4MDMgKi8KKwkweDg0LCAweEY4LCAweEIwLCAweEZDLCAweEI0LCAweEQyLCAweDg0LCAweEY5LCAvKiAweDA0LTB4MDcgKi8KKwkweEQwLCAweEQ5LCAweDg0LCAweEZBLCAweDg0LCAweEZCLCAweDg0LCAweEZDLCAvKiAweDA4LTB4MEIgKi8KKwkweDg0LCAweEZELCAweEQ5LCAweEU5LCAweDg0LCAweEZFLCAweERFLCAweENCLCAvKiAweDBDLTB4MEYgKi8KKwkweEQ5LCAweEVCLCAweDg1LCAweDQwLCAweDg1LCAweDQxLCAweDg1LCAweDQyLCAvKiAweDEwLTB4MTMgKi8KKwkweDg1LCAweDQzLCAweEQ4LCAweEIwLCAweEJCLCAweEFGLCAweEIxLCAweEIxLCAvKiAweDE0LTB4MTcgKi8KKwkweDg1LCAweDQ0LCAweEIzLCAweEQ3LCAweEQ4LCAweENFLCAweDg1LCAweDQ1LCAvKiAweDE4LTB4MUIgKi8KKwkweDg1LCAweDQ2LCAweEQ0LCAweEQxLCAweDg1LCAweDQ3LCAweDg1LCAweDQ4LCAvKiAweDFDLTB4MUYgKi8KKwkweEJELCAweEIzLCAweEJGLCAweEVGLCAweDg1LCAweDQ5LCAweENGLCAweEJCLCAvKiAweDIwLTB4MjMgKi8KKwkweDg1LCAweDRBLCAweDg1LCAweDRCLCAweEQ4LCAweEQwLCAweDg1LCAweDRDLCAvKiAweDI0LTB4MjcgKi8KKwkweDg1LCAweDRELCAweDg1LCAweDRFLCAweEI3LCAweENCLCAweDg1LCAweDRGLCAvKiAweDI4LTB4MkIgKi8KKwkweDg1LCAweDUwLCAweDg1LCAweDUxLCAweEQ4LCAweEQxLCAweDg1LCAweDUyLCAvKiAweDJDLTB4MkYgKi8KKwkweDg1LCAweDUzLCAweDg1LCAweDU0LCAweDg1LCAweDU1LCAweDg1LCAweDU2LCAvKiAweDMwLTB4MzMgKi8KKwkweDg1LCAweDU3LCAweDg1LCAweDU4LCAweDg1LCAweDU5LCAweDg1LCAweDVBLCAvKiAweDM0LTB4MzcgKi8KKwkweDg1LCAweDVCLCAweEM2LCAweEE1LCAweEM3LCAweEY4LCAweEQyLCAweEJELCAvKiAweDM4LTB4M0IgKi8KKwkweDg1LCAweDVDLCAweDg1LCAweDVELCAweEQ4LCAweEQyLCAweEM0LCAweEU0LCAvKiAweDNDLTB4M0YgKi8KKwkweDg1LCAweDVFLCAweENBLCAweEFFLCAweDg1LCAweDVGLCAweEM3LCAweEE3LCAvKiAweDQwLTB4NDMgKi8KKwkweDg1LCAweDYwLCAweEQ4LCAweEE2LCAweDg1LCAweDYxLCAweEM5LCAweEZELCAvKiAweDQ0LTB4NDcgKi8KKwkweENFLCAweEU3LCAweEJCLCAweERDLCAweEIwLCAweEVCLCAweDg1LCAweDYyLCAvKiAweDQ4LTB4NEIgKi8KKwkweDg1LCAweDYzLCAweDg1LCAweDY0LCAweEJCLCAweEFBLCAweEQwLCAweEFELCAvKiAweDRDLTB4NEYgKi8KKwkweDg1LCAweDY1LCAweEIxLCAweEIwLCAweEQ3LCAweEU0LCAweEQ3LCAweEJGLCAvKiAweDUwLTB4NTMgKi8KKwkweDg1LCAweDY2LCAweEI1LCAweEE1LCAweEMyLCAweEY0LCAweEM0LCAweENGLCAvKiAweDU0LTB4NTcgKi8KKwkweDg1LCAweDY3LCAweDg1LCAweDY4LCAweEIyLCAweEE5LCAweDg1LCAweDY5LCAvKiAweDU4LTB4NUIgKi8KKwkweEIyLCAweEI3LCAweDg1LCAweDZBLCAweEIxLCAweEU1LCAweERGLCAweEIyLCAvKiAweDVDLTB4NUYgKi8KKwkweEQ1LCAweEJDLCAweEJGLCAweEE4LCAweEMyLCAweEFDLCAweEQ4LCAweEQ1LCAvKiAweDYwLTB4NjMgKi8KKwkweEMyLCAweEIxLCAweDg1LCAweDZCLCAweEQ4LCAweEQ0LCAweENFLCAweEQ0LCAvKiAweDY0LTB4NjcgKi8KKwkweDg1LCAweDZDLCAweERBLCAweEUwLCAweDg1LCAweDZELCAweENFLCAweEMwLCAvKiAweDY4LTB4NkIgKi8KKwkweDg1LCAweDZFLCAweDg1LCAweDZGLCAweEQ4LCAweEI0LCAweEMzLCAweEFFLCAvKiAweDZDLTB4NkYgKi8KKwkweEQzLCAweEExLCAweENFLCAweEEzLCAweDg1LCAweDcwLCAweEJDLCAweEI0LCAvKiAweDcwLTB4NzMgKi8KKwkweEM4LCAweEI0LCAweEMyLCAweEQxLCAweDg1LCAweDcxLCAweEJFLCAweEVELCAvKiAweDc0LTB4NzcgKi8KKwkweEQwLCAweEI2LCAweDg1LCAweDcyLCAweERBLCAweEUxLCAweDg1LCAweDczLCAvKiAweDc4LTB4N0IgKi8KKwkweDg1LCAweDc0LCAweDg1LCAweDc1LCAweDg1LCAweDc2LCAweEM3LCAweEU0LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDg1LCAweDc3LCAweDg1LCAweDc4LCAweEIzLCAweEE3LCAweDg1LCAweDc5LCAvKiAweDgwLTB4ODMgKi8KKwkweEI2LCAweEYyLCAweENDLCAweEZDLCAweEMwLCAweEZBLCAweDg1LCAweDdBLCAvKiAweDg0LTB4ODcgKi8KKwkweDg1LCAweDdCLCAweEMwLCAweEY3LCAweDg1LCAweDdDLCAweEQxLCAweEI5LCAvKiAweDg4LTB4OEIgKi8KKwkweEQxLCAweEUxLCAweEQ4LCAweEM3LCAweDg1LCAweDdELCAweDg1LCAweDdFLCAvKiAweDhDLTB4OEYgKi8KKwkweDg1LCAweDgwLCAweDg1LCAweDgxLCAweDg1LCAweDgyLCAweDg1LCAweDgzLCAvKiAweDkwLTB4OTMgKi8KKwkweDg1LCAweDg0LCAweEIyLCAweERFLCAweDg1LCAweDg1LCAweDg1LCAweDg2LCAvKiAweDk0LTB4OTcgKi8KKwkweEMwLCAweEU1LCAweDg1LCAweDg3LCAweEJBLCAweEYxLCAweDg1LCAweDg4LCAvKiAweDk4LTB4OUIgKi8KKwkweDg1LCAweDg5LCAweEQ4LCAweEM4LCAweDg1LCAweDhBLCAweEQ0LCAweEFELCAvKiAweDlDLTB4OUYgKi8KKwkweDg1LCAweDhCLCAweDg1LCAweDhDLCAweENGLCAweEUxLCAweEQ4LCAweEM5LCAvKiAweEEwLTB4QTMgKi8KKwkweDg1LCAweDhELCAweEQ4LCAweENBLCAweENGLCAweEMzLCAweDg1LCAweDhFLCAvKiAweEE0LTB4QTcgKi8KKwkweEIzLCAweEY4LCAweEJFLCAweEM3LCAweDg1LCAweDhGLCAweDg1LCAweDkwLCAvKiAweEE4LTB4QUIgKi8KKwkweDg1LCAweDkxLCAweDg1LCAweDkyLCAweEQ4LCAweENCLCAweDg1LCAweDkzLCAvKiAweEFDLTB4QUYgKi8KKwkweDg1LCAweDk0LCAweDg1LCAweDk1LCAweDg1LCAweDk2LCAweDg1LCAweDk3LCAvKiAweEIwLTB4QjMgKi8KKwkweDg1LCAweDk4LCAweDg1LCAweDk5LCAweERCLCAweENDLCAweDg1LCAweDlBLCAvKiAweEI0LTB4QjcgKi8KKwkweDg1LCAweDlCLCAweDg1LCAweDlDLCAweDg1LCAweDlELCAweEM4LCAweEE1LCAvKiAweEI4LTB4QkIgKi8KKwkweDg1LCAweDlFLCAweDg1LCAweDlGLCAweDg1LCAweEEwLCAweENGLCAweEQ4LCAvKiAweEJDLTB4QkYgKi8KKwkweDg1LCAweEExLCAweEM4LCAweEZFLCAweEIyLCAweENFLCAweDg1LCAweEEyLCAvKiAweEMwLTB4QzMgKi8KKwkweDg1LCAweEEzLCAweDg1LCAweEE0LCAweDg1LCAweEE1LCAweDg1LCAweEE2LCAvKiAweEM0LTB4QzcgKi8KKwkweEQzLCAweEQ2LCAweEIyLCAweEU2LCAweEJDLCAweEIwLCAweEQzLCAweEQxLCAvKiAweEM4LTB4Q0IgKi8KKwkweENCLCAweEFCLCAweEI3LCAweEI0LCAweDg1LCAweEE3LCAweDg1LCAweEE4LCAvKiAweENDLTB4Q0YgKi8KKwkweDg1LCAweEE5LCAweEI3LCAweEEyLCAweDg1LCAweEFBLCAweDg1LCAweEFCLCAvKiAweEQwLTB4RDMgKi8KKwkweENBLCAweEU1LCAweDg1LCAweEFDLCAweEM4LCAweEExLCAweENBLCAweERDLCAvKiAweEQ0LTB4RDcgKi8KKwkweEIxLCAweEU0LCAweEQwLCAweEYwLCAweDg1LCAweEFELCAweEM1LCAweEQxLCAvKiAweEQ4LTB4REIgKi8KKwkweDg1LCAweEFFLCAweDg1LCAweEFGLCAweDg1LCAweEIwLCAweERCLCAweEM1LCAvKiAweERDLTB4REYgKi8KKwkweEI1LCAweEZFLCAweDg1LCAweEIxLCAweDg1LCAweEIyLCAweEJGLCAweERBLCAvKiAweEUwLTB4RTMgKi8KKwkweEI5LCAweEM1LCAweEJFLCAweEU0LCAweEMxLCAweEVELCAweDg1LCAweEIzLCAvKiAweEU0LTB4RTcgKi8KKwkweERGLCAweEI2LCAweERGLCAweEI1LCAweEQ2LCAweEJCLCAweEJELCAweEQwLCAvKiAweEU4LTB4RUIgKi8KKwkweEQ1LCAweEQ5LCAweEIwLCAweEM4LCAweEI2LCAweEEzLCAweEJGLCAweEM5LCAvKiAweEVDLTB4RUYgKi8KKwkweENDLCAweEE4LCAweERGLCAweEIzLCAweENBLCAweEI3LCAweEQzLCAweEQyLCAvKiAweEYwLTB4RjMgKi8KKwkweDg1LCAweEI0LCAweEQ4LCAweENGLCAweEQyLCAweEI2LCAweEJBLCAweEM1LCAvKiAweEY0LTB4RjcgKi8KKwkweENCLCAweEJFLCAweENDLCAweEJFLCAweDg1LCAweEI1LCAweERGLCAweEI3LCAvKiAweEY4LTB4RkIgKi8KKwkweEI1LCAweEYwLCAweERGLCAweEI0LCAweDg1LCAweEI2LCAweDg1LCAweEI3LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181NFs1MTJdID0geworCTB4ODUsIDB4QjgsIDB4RDMsIDB4RjUsIDB4ODUsIDB4QjksIDB4QjMsIDB4RDQsIC8qIDB4MDAtMHgwMyAqLworCTB4QjgsIDB4RjcsIDB4ODUsIDB4QkEsIDB4REYsIDB4QkEsIDB4ODUsIDB4QkIsIC8qIDB4MDQtMHgwNyAqLworCTB4QkEsIDB4Q0YsIDB4QkMsIDB4QUEsIDB4QjUsIDB4RjUsIDB4ODUsIDB4QkMsIC8qIDB4MDgtMHgwQiAqLworCTB4Q0QsIDB4QUMsIDB4QzMsIDB4RkIsIDB4QkEsIDB4RjMsIDB4QzAsIDB4RjQsIC8qIDB4MEMtMHgwRiAqLworCTB4Q0QsIDB4QzIsIDB4Q0YsIDB4RjIsIDB4REYsIDB4QjgsIDB4Q0YsIDB4QzUsIC8qIDB4MTAtMHgxMyAqLworCTB4ODUsIDB4QkQsIDB4QzIsIDB4QzAsIDB4REYsIDB4QjksIDB4QzIsIDB4RjAsIC8qIDB4MTQtMHgxNyAqLworCTB4ODUsIDB4QkUsIDB4ODUsIDB4QkYsIDB4ODUsIDB4QzAsIDB4QkUsIDB4RkQsIC8qIDB4MTgtMHgxQiAqLworCTB4ODUsIDB4QzEsIDB4QzEsIDB4REYsIDB4Q0QsIDB4Q0MsIDB4RDIsIDB4RjcsIC8qIDB4MUMtMHgxRiAqLworCTB4QjcsIDB4Q0QsIDB4REYsIDB4QzEsIDB4ODUsIDB4QzIsIDB4REYsIDB4QzQsIC8qIDB4MjAtMHgyMyAqLworCTB4ODUsIDB4QzMsIDB4ODUsIDB4QzQsIDB4QjcsIDB4RjEsIDB4QjAsIDB4QzksIC8qIDB4MjQtMHgyNyAqLworCTB4QjYsIDB4RDYsIDB4QjcsIDB4RDQsIDB4ODUsIDB4QzUsIDB4QkEsIDB4QUMsIC8qIDB4MjgtMHgyQiAqLworCTB4Q0MsIDB4RkQsIDB4QkYsIDB4RDQsIDB4Q0IsIDB4QjEsIDB4QzYsIDB4RjQsIC8qIDB4MkMtMHgyRiAqLworCTB4ODUsIDB4QzYsIDB4RDYsIDB4QTgsIDB4REYsIDB4QzUsIDB4ODUsIDB4QzcsIC8qIDB4MzAtMHgzMyAqLworCTB4Q0UsIDB4RTIsIDB4QjMsIDB4QjMsIDB4ODUsIDB4QzgsIDB4ODUsIDB4QzksIC8qIDB4MzQtMHgzNyAqLworCTB4Q0UsIDB4RkMsIDB4QjQsIDB4QjUsIDB4ODUsIDB4Q0EsIDB4Q0UsIDB4QzcsIC8qIDB4MzgtMHgzQiAqLworCTB4QkEsIDB4RjAsIDB4ODUsIDB4Q0IsIDB4Q0UsIDB4RTEsIDB4ODUsIDB4Q0MsIC8qIDB4M0MtMHgzRiAqLworCTB4RDEsIDB4QkQsIDB4ODUsIDB4Q0QsIDB4ODUsIDB4Q0UsIDB4REYsIDB4QzAsIC8qIDB4NDAtMHg0MyAqLworCTB4ODUsIDB4Q0YsIDB4ODUsIDB4RDAsIDB4QjQsIDB4RjQsIDB4ODUsIDB4RDEsIC8qIDB4NDQtMHg0NyAqLworCTB4QjMsIDB4Q0EsIDB4ODUsIDB4RDIsIDB4QjgsIDB4RTYsIDB4REYsIDB4QkIsIC8qIDB4NDgtMHg0QiAqLworCTB4ODUsIDB4RDMsIDB4ODUsIDB4RDQsIDB4ODUsIDB4RDUsIDB4ODUsIDB4RDYsIC8qIDB4NEMtMHg0RiAqLworCTB4QzQsIDB4QzUsIDB4ODUsIDB4RDcsIDB4REYsIDB4QkMsIDB4REYsIDB4QkQsIC8qIDB4NTAtMHg1MyAqLworCTB4REYsIDB4QkUsIDB4QzUsIDB4QkIsIDB4REYsIDB4QkYsIDB4REYsIDB4QzIsIC8qIDB4NTQtMHg1NyAqLworCTB4RDQsIDB4QjEsIDB4REYsIDB4QzMsIDB4ODUsIDB4RDgsIDB4QzcsIDB4QkEsIC8qIDB4NTgtMHg1QiAqLworCTB4Q0UsIDB4RDgsIDB4ODUsIDB4RDksIDB4ODUsIDB4REEsIDB4ODUsIDB4REIsIC8qIDB4NUMtMHg1RiAqLworCTB4ODUsIDB4REMsIDB4ODUsIDB4REQsIDB4QzQsIDB4RDgsIDB4ODUsIDB4REUsIC8qIDB4NjAtMHg2MyAqLworCTB4REYsIDB4Q0EsIDB4ODUsIDB4REYsIDB4REYsIDB4Q0YsIDB4ODUsIDB4RTAsIC8qIDB4NjQtMHg2NyAqLworCTB4RDYsIDB4REMsIDB4ODUsIDB4RTEsIDB4ODUsIDB4RTIsIDB4ODUsIDB4RTMsIC8qIDB4NjgtMHg2QiAqLworCTB4ODUsIDB4RTQsIDB4ODUsIDB4RTUsIDB4ODUsIDB4RTYsIDB4ODUsIDB4RTcsIC8qIDB4NkMtMHg2RiAqLworCTB4ODUsIDB4RTgsIDB4REYsIDB4QzksIDB4REYsIDB4REEsIDB4Q0UsIDB4QjYsIC8qIDB4NzAtMHg3MyAqLworCTB4ODUsIDB4RTksIDB4QkEsIDB4QzcsIDB4REYsIDB4Q0UsIDB4REYsIDB4QzgsIC8qIDB4NzQtMHg3NyAqLworCTB4QzUsIDB4REUsIDB4ODUsIDB4RUEsIDB4ODUsIDB4RUIsIDB4QzksIDB4RUIsIC8qIDB4NzgtMHg3QiAqLworCTB4QkEsIDB4RjQsIDB4QzMsIDB4RkMsIDB4ODUsIDB4RUMsIDB4ODUsIDB4RUQsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QkUsIDB4RDcsIDB4ODUsIDB4RUUsIDB4REYsIDB4QzYsIDB4ODUsIDB4RUYsIC8qIDB4ODAtMHg4MyAqLworCTB4REYsIDB4Q0QsIDB4ODUsIDB4RjAsIDB4QzUsIDB4RDgsIDB4ODUsIDB4RjEsIC8qIDB4ODQtMHg4NyAqLworCTB4ODUsIDB4RjIsIDB4ODUsIDB4RjMsIDB4ODUsIDB4RjQsIDB4RDUsIDB4QTYsIC8qIDB4ODgtMHg4QiAqLworCTB4QkEsIDB4Q0QsIDB4ODUsIDB4RjUsIDB4QkUsIDB4Q0MsIDB4RDMsIDB4QkQsIC8qIDB4OEMtMHg4RiAqLworCTB4QjgsIDB4QzAsIDB4ODUsIDB4RjYsIDB4RDYsIDB4RTQsIDB4ODUsIDB4RjcsIC8qIDB4OTAtMHg5MyAqLworCTB4REYsIDB4QzcsIDB4QjksIDB4QkUsIDB4QkYsIDB4QTcsIDB4ODUsIDB4RjgsIC8qIDB4OTQtMHg5NyAqLworCTB4ODUsIDB4RjksIDB4QzEsIDB4RkMsIDB4REYsIDB4Q0IsIDB4REYsIDB4Q0MsIC8qIDB4OTgtMHg5QiAqLworCTB4ODUsIDB4RkEsIDB4REYsIDB4RDAsIDB4ODUsIDB4RkIsIDB4ODUsIDB4RkMsIC8qIDB4OUMtMHg5RiAqLworCTB4ODUsIDB4RkQsIDB4ODUsIDB4RkUsIDB4ODYsIDB4NDAsIDB4REYsIDB4REIsIC8qIDB4QTAtMHhBMyAqLworCTB4REYsIDB4RTUsIDB4ODYsIDB4NDEsIDB4REYsIDB4RDcsIDB4REYsIDB4RDYsIC8qIDB4QTQtMHhBNyAqLworCTB4RDcsIDB4QzksIDB4REYsIDB4RTMsIDB4REYsIDB4RTQsIDB4RTUsIDB4RUIsIC8qIDB4QTgtMHhBQiAqLworCTB4RDIsIDB4QTcsIDB4REYsIDB4RDIsIDB4ODYsIDB4NDIsIDB4QkYsIDB4QTksIC8qIDB4QUMtMHhBRiAqLworCTB4ODYsIDB4NDMsIDB4RDQsIDB4REIsIDB4ODYsIDB4NDQsIDB4QkYsIDB4QzgsIC8qIDB4QjAtMHhCMyAqLworCTB4REYsIDB4RDQsIDB4ODYsIDB4NDUsIDB4ODYsIDB4NDYsIDB4ODYsIDB4NDcsIC8qIDB4QjQtMHhCNyAqLworCTB4Q0YsIDB4Q0MsIDB4ODYsIDB4NDgsIDB4ODYsIDB4NDksIDB4REYsIDB4REQsIC8qIDB4QjgtMHhCQiAqLworCTB4ODYsIDB4NEEsIDB4RDEsIDB4Q0EsIDB4ODYsIDB4NEIsIDB4REYsIDB4REUsIC8qIDB4QkMtMHhCRiAqLworCTB4QjAsIDB4QTcsIDB4QzYsIDB4QjcsIDB4REYsIDB4RDMsIDB4ODYsIDB4NEMsIC8qIDB4QzAtMHhDMyAqLworCTB4QkEsIDB4RTUsIDB4ODYsIDB4NEQsIDB4QjYsIDB4REYsIDB4Q0QsIDB4REIsIC8qIDB4QzQtMHhDNyAqLworCTB4QjksIDB4RkUsIDB4RDQsIDB4RDUsIDB4ODYsIDB4NEUsIDB4ODYsIDB4NEYsIC8qIDB4QzgtMHhDQiAqLworCTB4REYsIDB4REYsIDB4Q0YsIDB4RUMsIDB4QjAsIDB4QTUsIDB4REYsIDB4RTcsIC8qIDB4Q0MtMHhDRiAqLworCTB4REYsIDB4RDEsIDB4RDEsIDB4QzYsIDB4REYsIDB4RDUsIDB4REYsIDB4RDgsIC8qIDB4RDAtMHhEMyAqLworCTB4REYsIDB4RDksIDB4REYsIDB4REMsIDB4ODYsIDB4NTAsIDB4QkIsIDB4QTksIC8qIDB4RDQtMHhENyAqLworCTB4ODYsIDB4NTEsIDB4REYsIDB4RTAsIDB4REYsIDB4RTEsIDB4ODYsIDB4NTIsIC8qIDB4RDgtMHhEQiAqLworCTB4REYsIDB4RTIsIDB4REYsIDB4RTYsIDB4REYsIDB4RTgsIDB4RDMsIDB4QjQsIC8qIDB4REMtMHhERiAqLworCTB4ODYsIDB4NTMsIDB4ODYsIDB4NTQsIDB4ODYsIDB4NTUsIDB4ODYsIDB4NTYsIC8qIDB4RTAtMHhFMyAqLworCTB4ODYsIDB4NTcsIDB4QjgsIDB4RTcsIDB4QzUsIDB4QjYsIDB4REYsIDB4RUEsIC8qIDB4RTQtMHhFNyAqLworCTB4QzksIDB4REEsIDB4QzEsIDB4QTgsIDB4QzQsIDB4QzQsIDB4ODYsIDB4NTgsIC8qIDB4RTgtMHhFQiAqLworCTB4ODYsIDB4NTksIDB4QkYsIDB4REUsIDB4Q0YsIDB4RjgsIDB4ODYsIDB4NUEsIC8qIDB4RUMtMHhFRiAqLworCTB4ODYsIDB4NUIsIDB4ODYsIDB4NUMsIDB4RDUsIDB4REMsIDB4REYsIDB4RUUsIC8qIDB4RjAtMHhGMyAqLworCTB4ODYsIDB4NUQsIDB4ODYsIDB4NUUsIDB4ODYsIDB4NUYsIDB4ODYsIDB4NjAsIC8qIDB4RjQtMHhGNyAqLworCTB4ODYsIDB4NjEsIDB4ODYsIDB4NjIsIDB4QjIsIDB4QjgsIDB4ODYsIDB4NjMsIC8qIDB4RjgtMHhGQiAqLworCTB4QkEsIDB4REYsIDB4REYsIDB4RUMsIDB4ODYsIDB4NjQsIDB4REIsIDB4QzEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzU1WzUxMl0gPSB7CisJMHg4NiwgMHg2NSwgMHhEMSwgMHhFNCwgMHg4NiwgMHg2NiwgMHg4NiwgMHg2NywgLyogMHgwMC0weDAzICovCisJMHg4NiwgMHg2OCwgMHg4NiwgMHg2OSwgMHhDQiwgMHhGNCwgMHhCNCwgMHhCRCwgLyogMHgwNC0weDA3ICovCisJMHg4NiwgMHg2QSwgMHhCMCwgMHhBNiwgMHg4NiwgMHg2QiwgMHg4NiwgMHg2QywgLyogMHgwOC0weDBCICovCisJMHg4NiwgMHg2RCwgMHg4NiwgMHg2RSwgMHg4NiwgMHg2RiwgMHhERiwgMHhGMSwgLyogMHgwQy0weDBGICovCisJMHhDQywgMHhDNiwgMHhERiwgMHhGMiwgMHg4NiwgMHg3MCwgMHg4NiwgMHg3MSwgLyogMHgxMC0weDEzICovCisJMHhERiwgMHhFRCwgMHg4NiwgMHg3MiwgMHg4NiwgMHg3MywgMHg4NiwgMHg3NCwgLyogMHgxNC0weDE3ICovCisJMHg4NiwgMHg3NSwgMHg4NiwgMHg3NiwgMHg4NiwgMHg3NywgMHhERiwgMHhFOSwgLyogMHgxOC0weDFCICovCisJMHg4NiwgMHg3OCwgMHg4NiwgMHg3OSwgMHg4NiwgMHg3QSwgMHg4NiwgMHg3QiwgLyogMHgxQy0weDFGICovCisJMHhERiwgMHhFQiwgMHg4NiwgMHg3QywgMHhERiwgMHhFRiwgMHhERiwgMHhGMCwgLyogMHgyMC0weDIzICovCisJMHhCQiwgMHhCRCwgMHg4NiwgMHg3RCwgMHg4NiwgMHg3RSwgMHhERiwgMHhGMywgLyogMHgyNC0weDI3ICovCisJMHg4NiwgMHg4MCwgMHg4NiwgMHg4MSwgMHhERiwgMHhGNCwgMHg4NiwgMHg4MiwgLyogMHgyOC0weDJCICovCisJMHhCQiwgMHhBMywgMHg4NiwgMHg4MywgMHhDQSwgMHhEQiwgMHhDRSwgMHhBOCwgLyogMHgyQy0weDJGICovCisJMHhFMCwgMHhBNywgMHhCMywgMHhBQSwgMHg4NiwgMHg4NCwgMHhFMCwgMHhBNiwgLyogMHgzMC0weDMzICovCisJMHg4NiwgMHg4NSwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NywgMHhFMCwgMHhBMSwgLyogMHgzNC0weDM3ICovCisJMHg4NiwgMHg4OCwgMHg4NiwgMHg4OSwgMHg4NiwgMHg4QSwgMHg4NiwgMHg4QiwgLyogMHgzOC0weDNCICovCisJMHhERiwgMHhGRSwgMHg4NiwgMHg4QywgMHhDRCwgMHhEOSwgMHhERiwgMHhGQywgLyogMHgzQy0weDNGICovCisJMHg4NiwgMHg4RCwgMHhERiwgMHhGQSwgMHg4NiwgMHg4RSwgMHhCRiwgMHhEMCwgLyogMHg0MC0weDQzICovCisJMHhENywgMHhDNCwgMHg4NiwgMHg4RiwgMHhDOSwgMHhDQywgMHg4NiwgMHg5MCwgLyogMHg0NC0weDQ3ICovCisJMHg4NiwgMHg5MSwgMHhERiwgMHhGOCwgMHhCMCwgMHhBMSwgMHg4NiwgMHg5MiwgLyogMHg0OC0weDRCICovCisJMHg4NiwgMHg5MywgMHg4NiwgMHg5NCwgMHg4NiwgMHg5NSwgMHg4NiwgMHg5NiwgLyogMHg0Qy0weDRGICovCisJMHhERiwgMHhGRCwgMHg4NiwgMHg5NywgMHg4NiwgMHg5OCwgMHg4NiwgMHg5OSwgLyogMHg1MC0weDUzICovCisJMHg4NiwgMHg5QSwgMHhERiwgMHhGQiwgMHhFMCwgMHhBMiwgMHg4NiwgMHg5QiwgLyogMHg1NC0weDU3ICovCisJMHg4NiwgMHg5QywgMHg4NiwgMHg5RCwgMHg4NiwgMHg5RSwgMHg4NiwgMHg5RiwgLyogMHg1OC0weDVCICovCisJMHhFMCwgMHhBOCwgMHg4NiwgMHhBMCwgMHg4NiwgMHhBMSwgMHg4NiwgMHhBMiwgLyogMHg1Qy0weDVGICovCisJMHg4NiwgMHhBMywgMHhCNywgMHhDOCwgMHg4NiwgMHhBNCwgMHg4NiwgMHhBNSwgLyogMHg2MC0weDYzICovCisJMHhDNiwgMHhBMSwgMHhDOSwgMHhCNiwgMHhDMCwgMHhCMiwgMHhERiwgMHhGNSwgLyogMHg2NC0weDY3ICovCisJMHg4NiwgMHhBNiwgMHg4NiwgMHhBNywgMHhDNSwgMHhCRSwgMHg4NiwgMHhBOCwgLyogMHg2OC0weDZCICovCisJMHhEOCwgMHhDNCwgMHhERiwgMHhGOSwgMHhDNCwgMHhGNiwgMHg4NiwgMHhBOSwgLyogMHg2Qy0weDZGICovCisJMHg4NiwgMHhBQSwgMHg4NiwgMHhBQiwgMHg4NiwgMHhBQywgMHg4NiwgMHhBRCwgLyogMHg3MC0weDczICovCisJMHg4NiwgMHhBRSwgMHhFMCwgMHhBMywgMHhFMCwgMHhBNCwgMHhFMCwgMHhBNSwgLyogMHg3NC0weDc3ICovCisJMHhEMCwgMHhBNSwgMHg4NiwgMHhBRiwgMHg4NiwgMHhCMCwgMHhFMCwgMHhCNCwgLyogMHg3OC0weDdCICovCisJMHhDQywgMHhFNCwgMHg4NiwgMHhCMSwgMHhFMCwgMHhCMSwgMHg4NiwgMHhCMiwgLyogMHg3Qy0weDdGICovCisJCisJMHhCRiwgMHhBNiwgMHhFMCwgMHhBRiwgMHhDRSwgMHhCOSwgMHhFMCwgMHhBQiwgLyogMHg4MC0weDgzICovCisJMHhDOSwgMHhDNiwgMHg4NiwgMHhCMywgMHg4NiwgMHhCNCwgMHhDMCwgMHhBRSwgLyogMHg4NC0weDg3ICovCisJMHhFMCwgMHhBRSwgMHhCQSwgMHhFRCwgMHhCQSwgMHhCMCwgMHhFMCwgMHhBOSwgLyogMHg4OC0weDhCICovCisJMHg4NiwgMHhCNSwgMHg4NiwgMHhCNiwgMHg4NiwgMHhCNywgMHhERiwgMHhGNiwgLyogMHg4Qy0weDhGICovCisJMHg4NiwgMHhCOCwgMHhFMCwgMHhCMywgMHg4NiwgMHhCOSwgMHg4NiwgMHhCQSwgLyogMHg5MC0weDkzICovCisJMHhFMCwgMHhCOCwgMHg4NiwgMHhCQiwgMHg4NiwgMHhCQywgMHg4NiwgMHhCRCwgLyogMHg5NC0weDk3ICovCisJMHhCNCwgMHhBRCwgMHhFMCwgMHhCOSwgMHg4NiwgMHhCRSwgMHg4NiwgMHhCRiwgLyogMHg5OC0weDlCICovCisJMHhDRiwgMHhCMiwgMHhCQSwgMHhDOCwgMHg4NiwgMHhDMCwgMHhFMCwgMHhCMCwgLyogMHg5Qy0weDlGICovCisJMHg4NiwgMHhDMSwgMHg4NiwgMHhDMiwgMHg4NiwgMHhDMywgMHg4NiwgMHhDNCwgLyogMHhBMC0weEEzICovCisJMHg4NiwgMHhDNSwgMHg4NiwgMHhDNiwgMHg4NiwgMHhDNywgMHhEMCwgMHhGQSwgLyogMHhBNC0weEE3ICovCisJMHg4NiwgMHhDOCwgMHg4NiwgMHhDOSwgMHg4NiwgMHhDQSwgMHg4NiwgMHhDQiwgLyogMHhBOC0weEFCICovCisJMHg4NiwgMHhDQywgMHg4NiwgMHhDRCwgMHg4NiwgMHhDRSwgMHg4NiwgMHhDRiwgLyogMHhBQy0weEFGICovCisJMHg4NiwgMHhEMCwgMHhFMCwgMHhBQywgMHg4NiwgMHhEMSwgMHhENCwgMHhGQiwgLyogMHhCMC0weEIzICovCisJMHg4NiwgMHhEMiwgMHhERiwgMHhGNywgMHg4NiwgMHhEMywgMHhDNSwgMHhFNywgLyogMHhCNC0weEI3ICovCisJMHg4NiwgMHhENCwgMHhFMCwgMHhBRCwgMHg4NiwgMHhENSwgMHhEMywgMHhGNywgLyogMHhCOC0weEJCICovCisJMHg4NiwgMHhENiwgMHhFMCwgMHhCNiwgMHhFMCwgMHhCNywgMHg4NiwgMHhENywgLyogMHhCQy0weEJGICovCisJMHg4NiwgMHhEOCwgMHg4NiwgMHhEOSwgMHg4NiwgMHhEQSwgMHg4NiwgMHhEQiwgLyogMHhDMC0weEMzICovCisJMHhFMCwgMHhDNCwgMHhEMCwgMHhFMSwgMHg4NiwgMHhEQywgMHg4NiwgMHhERCwgLyogMHhDNC0weEM3ICovCisJMHg4NiwgMHhERSwgMHhFMCwgMHhCQywgMHg4NiwgMHhERiwgMHg4NiwgMHhFMCwgLyogMHhDOC0weENCICovCisJMHhFMCwgMHhDOSwgMHhFMCwgMHhDQSwgMHg4NiwgMHhFMSwgMHg4NiwgMHhFMiwgLyogMHhDQy0weENGICovCisJMHg4NiwgMHhFMywgMHhFMCwgMHhCRSwgMHhFMCwgMHhBQSwgMHhDOSwgMHhBNCwgLyogMHhEMC0weEQzICovCisJMHhFMCwgMHhDMSwgMHg4NiwgMHhFNCwgMHhFMCwgMHhCMiwgMHg4NiwgMHhFNSwgLyogMHhENC0weEQ3ICovCisJMHg4NiwgMHhFNiwgMHg4NiwgMHhFNywgMHg4NiwgMHhFOCwgMHg4NiwgMHhFOSwgLyogMHhEOC0weERCICovCisJMHhDQSwgMHhDOCwgMHhFMCwgMHhDMywgMHg4NiwgMHhFQSwgMHhFMCwgMHhCNSwgLyogMHhEQy0weERGICovCisJMHg4NiwgMHhFQiwgMHhDRSwgMHhDQiwgMHg4NiwgMHhFQywgMHhDQiwgMHhDMywgLyogMHhFMC0weEUzICovCisJMHhFMCwgMHhDRCwgMHhFMCwgMHhDNiwgMHhFMCwgMHhDMiwgMHg4NiwgMHhFRCwgLyogMHhFNC0weEU3ICovCisJMHhFMCwgMHhDQiwgMHg4NiwgMHhFRSwgMHhFMCwgMHhCQSwgMHhFMCwgMHhCRiwgLyogMHhFOC0weEVCICovCisJMHhFMCwgMHhDMCwgMHg4NiwgMHhFRiwgMHg4NiwgMHhGMCwgMHhFMCwgMHhDNSwgLyogMHhFQy0weEVGICovCisJMHg4NiwgMHhGMSwgMHg4NiwgMHhGMiwgMHhFMCwgMHhDNywgMHhFMCwgMHhDOCwgLyogMHhGMC0weEYzICovCisJMHg4NiwgMHhGMywgMHhFMCwgMHhDQywgMHg4NiwgMHhGNCwgMHhFMCwgMHhCQiwgLyogMHhGNC0weEY3ICovCisJMHg4NiwgMHhGNSwgMHg4NiwgMHhGNiwgMHg4NiwgMHhGNywgMHg4NiwgMHhGOCwgLyogMHhGOC0weEZCICovCisJMHg4NiwgMHhGOSwgMHhDQiwgMHhENCwgMHhFMCwgMHhENSwgMHg4NiwgMHhGQSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTZbNTEyXSA9IHsKKwkweEUwLCAweEQ2LCAweEUwLCAweEQyLCAweDg2LCAweEZCLCAweDg2LCAweEZDLCAvKiAweDAwLTB4MDMgKi8KKwkweDg2LCAweEZELCAweDg2LCAweEZFLCAweDg3LCAweDQwLCAweDg3LCAweDQxLCAvKiAweDA0LTB4MDcgKi8KKwkweEUwLCAweEQwLCAweEJDLCAweENFLCAweDg3LCAweDQyLCAweDg3LCAweDQzLCAvKiAweDA4LTB4MEIgKi8KKwkweEUwLCAweEQxLCAweDg3LCAweDQ0LCAweEI4LCAweEMyLCAweEQ4LCAweEM1LCAvKiAweDBDLTB4MEYgKi8KKwkweDg3LCAweDQ1LCAweDg3LCAweDQ2LCAweDg3LCAweDQ3LCAweDg3LCAweDQ4LCAvKiAweDEwLTB4MTMgKi8KKwkweDg3LCAweDQ5LCAweDg3LCAweDRBLCAweDg3LCAweDRCLCAweDg3LCAweDRDLCAvKiAweDE0LTB4MTcgKi8KKwkweEQwLCAweEVBLCAweDg3LCAweDRELCAweDg3LCAweDRFLCAweEMyLCAweEVGLCAvKiAweDE4LTB4MUIgKi8KKwkweDg3LCAweDRGLCAweDg3LCAweDUwLCAweEUwLCAweENGLCAweEUwLCAweEJELCAvKiAweDFDLTB4MUYgKi8KKwkweDg3LCAweDUxLCAweDg3LCAweDUyLCAweDg3LCAweDUzLCAweEUwLCAweEQ0LCAvKiAweDIwLTB4MjMgKi8KKwkweEUwLCAweEQzLCAweDg3LCAweDU0LCAweDg3LCAweDU1LCAweEUwLCAweEQ3LCAvKiAweDI0LTB4MjcgKi8KKwkweDg3LCAweDU2LCAweDg3LCAweDU3LCAweDg3LCAweDU4LCAweDg3LCAweDU5LCAvKiAweDI4LTB4MkIgKi8KKwkweEUwLCAweERDLCAweEUwLCAweEQ4LCAweDg3LCAweDVBLCAweDg3LCAweDVCLCAvKiAweDJDLTB4MkYgKi8KKwkweDg3LCAweDVDLCAweEQ2LCAweEY2LCAweEIzLCAweEIwLCAweDg3LCAweDVELCAvKiAweDMwLTB4MzMgKi8KKwkweEQ3LCAweEVDLCAweDg3LCAweDVFLCAweENCLCAweEJCLCAweDg3LCAweDVGLCAvKiAweDM0LTB4MzcgKi8KKwkweDg3LCAweDYwLCAweEUwLCAweERBLCAweDg3LCAweDYxLCAweENFLCAweEZCLCAvKiAweDM4LTB4M0IgKi8KKwkweDg3LCAweDYyLCAweDg3LCAweDYzLCAweDg3LCAweDY0LCAweEJBLCAweEQ5LCAvKiAweDNDLTB4M0YgKi8KKwkweDg3LCAweDY1LCAweDg3LCAweDY2LCAweDg3LCAweDY3LCAweDg3LCAweDY4LCAvKiAweDQwLTB4NDMgKi8KKwkweDg3LCAweDY5LCAweDg3LCAweDZBLCAweDg3LCAweDZCLCAweDg3LCAweDZDLCAvKiAweDQ0LTB4NDcgKi8KKwkweDg3LCAweDZELCAweDg3LCAweDZFLCAweDg3LCAweDZGLCAweDg3LCAweDcwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEUwLCAweEUxLCAweEUwLCAweERELCAweEQyLCAweEFELCAweDg3LCAweDcxLCAvKiAweDRDLTB4NEYgKi8KKwkweDg3LCAweDcyLCAweDg3LCAweDczLCAweDg3LCAweDc0LCAweDg3LCAweDc1LCAvKiAweDUwLTB4NTMgKi8KKwkweEUwLCAweEUyLCAweDg3LCAweDc2LCAweDg3LCAweDc3LCAweEUwLCAweERCLCAvKiAweDU0LTB4NTcgKi8KKwkweEUwLCAweEQ5LCAweEUwLCAweERGLCAweDg3LCAweDc4LCAweDg3LCAweDc5LCAvKiAweDU4LTB4NUIgKi8KKwkweEUwLCAweEUwLCAweDg3LCAweDdBLCAweDg3LCAweDdCLCAweDg3LCAweDdDLCAvKiAweDVDLTB4NUYgKi8KKwkweDg3LCAweDdELCAweDg3LCAweDdFLCAweEUwLCAweERFLCAweDg3LCAweDgwLCAvKiAweDYwLTB4NjMgKi8KKwkweEUwLCAweEU0LCAweDg3LCAweDgxLCAweDg3LCAweDgyLCAweDg3LCAweDgzLCAvKiAweDY0LTB4NjcgKi8KKwkweEM2LCAweEY3LCAweEQ4LCAweEFDLCAweEQ0LCAweEVCLCAweEUwLCAweEU2LCAvKiAweDY4LTB4NkIgKi8KKwkweENBLCAweEM5LCAweDg3LCAweDg0LCAweDg3LCAweDg1LCAweDg3LCAweDg2LCAvKiAweDZDLTB4NkYgKi8KKwkweDg3LCAweDg3LCAweEUwLCAweEU1LCAweDg3LCAweDg4LCAweDg3LCAweDg5LCAvKiAweDcwLTB4NzMgKi8KKwkweDg3LCAweDhBLCAweDg3LCAweDhCLCAweEI4LCAweEMxLCAweDg3LCAweDhDLCAvKiAweDc0LTB4NzcgKi8KKwkweDg3LCAweDhELCAweDg3LCAweDhFLCAweDg3LCAweDhGLCAweEUwLCAweEU3LCAvKiAweDc4LTB4N0IgKi8KKwkweEUwLCAweEU4LCAweDg3LCAweDkwLCAweDg3LCAweDkxLCAweDg3LCAweDkyLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDg3LCAweDkzLCAweDg3LCAweDk0LCAweDg3LCAweDk1LCAweDg3LCAweDk2LCAvKiAweDgwLTB4ODMgKi8KKwkweDg3LCAweDk3LCAweEUwLCAweEU5LCAweEUwLCAweEUzLCAweDg3LCAweDk4LCAvKiAweDg0LTB4ODcgKi8KKwkweDg3LCAweDk5LCAweDg3LCAweDlBLCAweDg3LCAweDlCLCAweDg3LCAweDlDLCAvKiAweDg4LTB4OEIgKi8KKwkweDg3LCAweDlELCAweDg3LCAweDlFLCAweEJBLCAweEJGLCAweENDLCAweEU3LCAvKiAweDhDLTB4OEYgKi8KKwkweDg3LCAweDlGLCAweDg3LCAweEEwLCAweDg3LCAweEExLCAweEUwLCAweEVBLCAvKiAweDkwLTB4OTMgKi8KKwkweDg3LCAweEEyLCAweDg3LCAweEEzLCAweDg3LCAweEE0LCAweDg3LCAweEE1LCAvKiAweDk0LTB4OTcgKi8KKwkweDg3LCAweEE2LCAweDg3LCAweEE3LCAweDg3LCAweEE4LCAweDg3LCAweEE5LCAvKiAweDk4LTB4OUIgKi8KKwkweDg3LCAweEFBLCAweDg3LCAweEFCLCAweDg3LCAweEFDLCAweDg3LCAweEFELCAvKiAweDlDLTB4OUYgKi8KKwkweDg3LCAweEFFLCAweDg3LCAweEFGLCAweDg3LCAweEIwLCAweENGLCAweEY5LCAvKiAweEEwLTB4QTMgKi8KKwkweDg3LCAweEIxLCAweDg3LCAweEIyLCAweDg3LCAweEIzLCAweDg3LCAweEI0LCAvKiAweEE0LTB4QTcgKi8KKwkweDg3LCAweEI1LCAweDg3LCAweEI2LCAweDg3LCAweEI3LCAweDg3LCAweEI4LCAvKiAweEE4LTB4QUIgKi8KKwkweDg3LCAweEI5LCAweDg3LCAweEJBLCAweDg3LCAweEJCLCAweEUwLCAweEVCLCAvKiAweEFDLTB4QUYgKi8KKwkweDg3LCAweEJDLCAweDg3LCAweEJELCAweDg3LCAweEJFLCAweDg3LCAweEJGLCAvKiAweEIwLTB4QjMgKi8KKwkweDg3LCAweEMwLCAweDg3LCAweEMxLCAweDg3LCAweEMyLCAweEM4LCAweEMyLCAvKiAweEI0LTB4QjcgKi8KKwkweDg3LCAweEMzLCAweDg3LCAweEM0LCAweDg3LCAweEM1LCAweDg3LCAweEM2LCAvKiAweEI4LTB4QkIgKi8KKwkweEJELCAweEMwLCAweDg3LCAweEM3LCAweDg3LCAweEM4LCAweDg3LCAweEM5LCAvKiAweEJDLTB4QkYgKi8KKwkweDg3LCAweENBLCAweDg3LCAweENCLCAweDg3LCAweENDLCAweDg3LCAweENELCAvKiAweEMwLTB4QzMgKi8KKwkweDg3LCAweENFLCAweDg3LCAweENGLCAweDg3LCAweEQwLCAweDg3LCAweEQxLCAvKiAweEM0LTB4QzcgKi8KKwkweDg3LCAweEQyLCAweDg3LCAweEQzLCAweEM0LCAweEQyLCAweDg3LCAweEQ0LCAvKiAweEM4LTB4Q0IgKi8KKwkweDg3LCAweEQ1LCAweDg3LCAweEQ2LCAweDg3LCAweEQ3LCAweDg3LCAweEQ4LCAvKiAweENDLTB4Q0YgKi8KKwkweDg3LCAweEQ5LCAweDg3LCAweERBLCAweDg3LCAweERCLCAweDg3LCAweERDLCAvKiAweEQwLTB4RDMgKi8KKwkweEUwLCAweEVDLCAweDg3LCAweERELCAweDg3LCAweERFLCAweEUwLCAweEVELCAvKiAweEQ0LTB4RDcgKi8KKwkweDg3LCAweERGLCAweDg3LCAweEUwLCAweEM3LCAweEY0LCAweENCLCAweEM0LCAvKiAweEQ4LTB4REIgKi8KKwkweDg3LCAweEUxLCAweEUwLCAweEVFLCAweEJCLCAweEQ4LCAweEQ4LCAweEI2LCAvKiAweERDLTB4REYgKi8KKwkweEQyLCAweEYyLCAweEUwLCAweEVGLCAweENELCAweEM1LCAweDg3LCAweEUyLCAvKiAweEUwLTB4RTMgKi8KKwkweEI2LCAweERBLCAweDg3LCAweEUzLCAweDg3LCAweEU0LCAweDg3LCAweEU1LCAvKiAweEU0LTB4RTcgKi8KKwkweDg3LCAweEU2LCAweDg3LCAweEU3LCAweDg3LCAweEU4LCAweEUwLCAweEYxLCAvKiAweEU4LTB4RUIgKi8KKwkweDg3LCAweEU5LCAweEQ0LCAweEIwLCAweDg3LCAweEVBLCAweDg3LCAweEVCLCAvKiAweEVDLTB4RUYgKi8KKwkweEMwLCAweEE3LCAweEI0LCAweEQxLCAweDg3LCAweEVDLCAweDg3LCAweEVELCAvKiAweEYwLTB4RjMgKi8KKwkweENFLCAweEE3LCAweEUwLCAweEYwLCAweDg3LCAweEVFLCAweDg3LCAweEVGLCAvKiAweEY0LTB4RjcgKi8KKwkweDg3LCAweEYwLCAweEUwLCAweEYyLCAweEI5LCAweENDLCAweDg3LCAweEYxLCAvKiAweEY4LTB4RkIgKi8KKwkweDg3LCAweEYyLCAweEI5LCAweEZBLCAweENELCAweEJDLCAweEUwLCAweEYzLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181N1s1MTJdID0geworCTB4ODcsIDB4RjMsIDB4ODcsIDB4RjQsIDB4ODcsIDB4RjUsIDB4QzYsIDB4RDQsIC8qIDB4MDAtMHgwMyAqLworCTB4RTAsIDB4RjQsIDB4ODcsIDB4RjYsIDB4RDQsIDB4QjIsIDB4ODcsIDB4RjcsIC8qIDB4MDQtMHgwNyAqLworCTB4QzgsIDB4QTYsIDB4RTAsIDB4RjYsIDB4RTAsIDB4RjUsIDB4ODcsIDB4RjgsIC8qIDB4MDgtMHgwQiAqLworCTB4ODcsIDB4RjksIDB4ODcsIDB4RkEsIDB4ODcsIDB4RkIsIDB4ODcsIDB4RkMsIC8qIDB4MEMtMHgwRiAqLworCTB4ODcsIDB4RkQsIDB4ODcsIDB4RkUsIDB4ODgsIDB4NDAsIDB4ODgsIDB4NDEsIC8qIDB4MTAtMHgxMyAqLworCTB4ODgsIDB4NDIsIDB4ODgsIDB4NDMsIDB4ODgsIDB4NDQsIDB4ODgsIDB4NDUsIC8qIDB4MTQtMHgxNyAqLworCTB4ODgsIDB4NDYsIDB4ODgsIDB4NDcsIDB4ODgsIDB4NDgsIDB4ODgsIDB4NDksIC8qIDB4MTgtMHgxQiAqLworCTB4RTAsIDB4RjcsIDB4ODgsIDB4NEEsIDB4ODgsIDB4NEIsIDB4Q0QsIDB4QzEsIC8qIDB4MUMtMHgxRiAqLworCTB4ODgsIDB4NEMsIDB4ODgsIDB4NEQsIDB4ODgsIDB4NEUsIDB4Q0EsIDB4QTUsIC8qIDB4MjAtMHgyMyAqLworCTB4ODgsIDB4NEYsIDB4ODgsIDB4NTAsIDB4ODgsIDB4NTEsIDB4ODgsIDB4NTIsIC8qIDB4MjQtMHgyNyAqLworCTB4RDQsIDB4REEsIDB4REIsIDB4RDcsIDB4REIsIDB4RDksIDB4ODgsIDB4NTMsIC8qIDB4MjgtMHgyQiAqLworCTB4REIsIDB4RDgsIDB4QjksIDB4RTcsIDB4REIsIDB4REMsIDB4REIsIDB4REQsIC8qIDB4MkMtMHgyRiAqLworCTB4QjUsIDB4RDgsIDB4ODgsIDB4NTQsIDB4ODgsIDB4NTUsIDB4REIsIDB4REEsIC8qIDB4MzAtMHgzMyAqLworCTB4ODgsIDB4NTYsIDB4ODgsIDB4NTcsIDB4ODgsIDB4NTgsIDB4ODgsIDB4NTksIC8qIDB4MzQtMHgzNyAqLworCTB4ODgsIDB4NUEsIDB4REIsIDB4REIsIDB4QjMsIDB4QTEsIDB4REIsIDB4REYsIC8qIDB4MzgtMHgzQiAqLworCTB4ODgsIDB4NUIsIDB4ODgsIDB4NUMsIDB4QkIsIDB4RjgsIDB4ODgsIDB4NUQsIC8qIDB4M0MtMHgzRiAqLworCTB4RDYsIDB4QjcsIDB4ODgsIDB4NUUsIDB4REIsIDB4RTAsIDB4ODgsIDB4NUYsIC8qIDB4NDAtMHg0MyAqLworCTB4ODgsIDB4NjAsIDB4ODgsIDB4NjEsIDB4ODgsIDB4NjIsIDB4QkUsIDB4RjksIC8qIDB4NDQtMHg0NyAqLworCTB4ODgsIDB4NjMsIDB4ODgsIDB4NjQsIDB4QjcsIDB4QkIsIDB4ODgsIDB4NjUsIC8qIDB4NDgtMHg0QiAqLworCTB4REIsIDB4RDAsIDB4Q0MsIDB4QUUsIDB4QkYsIDB4QjIsIDB4QkIsIDB4QjUsIC8qIDB4NEMtMHg0RiAqLworCTB4RDcsIDB4RjgsIDB4QkYsIDB4RDMsIDB4ODgsIDB4NjYsIDB4ODgsIDB4NjcsIC8qIDB4NTAtMHg1MyAqLworCTB4ODgsIDB4NjgsIDB4ODgsIDB4NjksIDB4ODgsIDB4NkEsIDB4QkYsIDB4RTksIC8qIDB4NTQtMHg1NyAqLworCTB4ODgsIDB4NkIsIDB4ODgsIDB4NkMsIDB4QkMsIDB4RTEsIDB4Q0MsIDB4QjMsIC8qIDB4NTgtMHg1QiAqLworCTB4REIsIDB4REUsIDB4QjAsIDB4RDMsIDB4Q0UsIDB4RUIsIDB4QjcsIDB4RDgsIC8qIDB4NUMtMHg1RiAqLworCTB4RDcsIDB4QjksIDB4QzYsIDB4QzIsIDB4ODgsIDB4NkQsIDB4ODgsIDB4NkUsIC8qIDB4NjAtMHg2MyAqLworCTB4QzAsIDB4QTQsIDB4ODgsIDB4NkYsIDB4Q0MsIDB4QjksIDB4ODgsIDB4NzAsIC8qIDB4NjQtMHg2NyAqLworCTB4REIsIDB4RTcsIDB4REIsIDB4RTEsIDB4QzYsIDB4QkEsIDB4REIsIDB4RTMsIC8qIDB4NjgtMHg2QiAqLworCTB4ODgsIDB4NzEsIDB4REIsIDB4RTgsIDB4ODgsIDB4NzIsIDB4QzUsIDB4RjcsIC8qIDB4NkMtMHg2RiAqLworCTB4ODgsIDB4NzMsIDB4ODgsIDB4NzQsIDB4ODgsIDB4NzUsIDB4REIsIDB4RUEsIC8qIDB4NzAtMHg3MyAqLworCTB4ODgsIDB4NzYsIDB4ODgsIDB4NzcsIDB4REIsIDB4RTksIDB4QkYsIDB4QzAsIC8qIDB4NzQtMHg3NyAqLworCTB4ODgsIDB4NzgsIDB4ODgsIDB4NzksIDB4ODgsIDB4N0EsIDB4REIsIDB4RTYsIC8qIDB4NzgtMHg3QiAqLworCTB4REIsIDB4RTUsIDB4ODgsIDB4N0IsIDB4ODgsIDB4N0MsIDB4ODgsIDB4N0QsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4ODgsIDB4N0UsIDB4ODgsIDB4ODAsIDB4QjQsIDB4QjksIDB4QzAsIDB4QUMsIC8qIDB4ODAtMHg4MyAqLworCTB4QzIsIDB4QTIsIDB4REIsIDB4RTIsIDB4REIsIDB4RTQsIDB4ODgsIDB4ODEsIC8qIDB4ODQtMHg4NyAqLworCTB4ODgsIDB4ODIsIDB4ODgsIDB4ODMsIDB4ODgsIDB4ODQsIDB4RDAsIDB4Q0QsIC8qIDB4ODgtMHg4QiAqLworCTB4REIsIDB4RUQsIDB4ODgsIDB4ODUsIDB4ODgsIDB4ODYsIDB4ODgsIDB4ODcsIC8qIDB4OEMtMHg4RiAqLworCTB4ODgsIDB4ODgsIDB4ODgsIDB4ODksIDB4QzAsIDB4REQsIDB4REIsIDB4RjIsIC8qIDB4OTAtMHg5MyAqLworCTB4ODgsIDB4OEEsIDB4ODgsIDB4OEIsIDB4ODgsIDB4OEMsIDB4ODgsIDB4OEQsIC8qIDB4OTQtMHg5NyAqLworCTB4ODgsIDB4OEUsIDB4ODgsIDB4OEYsIDB4ODgsIDB4OTAsIDB4QjYsIDB4RTIsIC8qIDB4OTgtMHg5QiAqLworCTB4ODgsIDB4OTEsIDB4ODgsIDB4OTIsIDB4ODgsIDB4OTMsIDB4ODgsIDB4OTQsIC8qIDB4OUMtMHg5RiAqLworCTB4REIsIDB4RjMsIDB4REIsIDB4RDIsIDB4QjksIDB4QjgsIDB4RDQsIDB4QUIsIC8qIDB4QTAtMHhBMyAqLworCTB4REIsIDB4RUMsIDB4ODgsIDB4OTUsIDB4QkYsIDB4RDEsIDB4REIsIDB4RjAsIC8qIDB4QTQtMHhBNyAqLworCTB4ODgsIDB4OTYsIDB4REIsIDB4RDEsIDB4ODgsIDB4OTcsIDB4QjUsIDB4RTYsIC8qIDB4QTgtMHhBQiAqLworCTB4ODgsIDB4OTgsIDB4REIsIDB4RUIsIDB4QkYsIDB4RTUsIDB4ODgsIDB4OTksIC8qIDB4QUMtMHhBRiAqLworCTB4ODgsIDB4OUEsIDB4ODgsIDB4OUIsIDB4REIsIDB4RUUsIDB4ODgsIDB4OUMsIC8qIDB4QjAtMHhCMyAqLworCTB4REIsIDB4RjEsIDB4ODgsIDB4OUQsIDB4ODgsIDB4OUUsIDB4ODgsIDB4OUYsIC8qIDB4QjQtMHhCNyAqLworCTB4REIsIDB4RjksIDB4ODgsIDB4QTAsIDB4ODgsIDB4QTEsIDB4ODgsIDB4QTIsIC8qIDB4QjgtMHhCQiAqLworCTB4ODgsIDB4QTMsIDB4ODgsIDB4QTQsIDB4ODgsIDB4QTUsIDB4ODgsIDB4QTYsIC8qIDB4QkMtMHhCRiAqLworCTB4ODgsIDB4QTcsIDB4ODgsIDB4QTgsIDB4QjksIDB4QTEsIDB4QjAsIDB4QTMsIC8qIDB4QzAtMHhDMyAqLworCTB4ODgsIDB4QTksIDB4ODgsIDB4QUEsIDB4ODgsIDB4QUIsIDB4ODgsIDB4QUMsIC8qIDB4QzQtMHhDNyAqLworCTB4ODgsIDB4QUQsIDB4ODgsIDB4QUUsIDB4ODgsIDB4QUYsIDB4QzIsIDB4RjEsIC8qIDB4QzgtMHhDQiAqLworCTB4ODgsIDB4QjAsIDB4ODgsIDB4QjEsIDB4QjMsIDB4QzcsIDB4REIsIDB4RUYsIC8qIDB4Q0MtMHhDRiAqLworCTB4ODgsIDB4QjIsIDB4ODgsIDB4QjMsIDB4REIsIDB4RjgsIDB4ODgsIDB4QjQsIC8qIDB4RDAtMHhEMyAqLworCTB4QzYsIDB4RDIsIDB4REIsIDB4RjQsIDB4ODgsIDB4QjUsIDB4ODgsIDB4QjYsIC8qIDB4RDQtMHhENyAqLworCTB4REIsIDB4RjUsIDB4REIsIDB4RjcsIDB4REIsIDB4RjYsIDB4ODgsIDB4QjcsIC8qIDB4RDgtMHhEQiAqLworCTB4ODgsIDB4QjgsIDB4REIsIDB4RkUsIDB4ODgsIDB4QjksIDB4RDMsIDB4RjIsIC8qIDB4REMtMHhERiAqLworCTB4QjIsIDB4QkEsIDB4ODgsIDB4QkEsIDB4ODgsIDB4QkIsIDB4ODgsIDB4QkMsIC8qIDB4RTAtMHhFMyAqLworCTB4REIsIDB4RkQsIDB4ODgsIDB4QkQsIDB4ODgsIDB4QkUsIDB4ODgsIDB4QkYsIC8qIDB4RTQtMHhFNyAqLworCTB4ODgsIDB4QzAsIDB4ODgsIDB4QzEsIDB4ODgsIDB4QzIsIDB4ODgsIDB4QzMsIC8qIDB4RTgtMHhFQiAqLworCTB4ODgsIDB4QzQsIDB4REMsIDB4QTQsIDB4ODgsIDB4QzUsIDB4REIsIDB4RkIsIC8qIDB4RUMtMHhFRiAqLworCTB4ODgsIDB4QzYsIDB4ODgsIDB4QzcsIDB4ODgsIDB4QzgsIDB4ODgsIDB4QzksIC8qIDB4RjAtMHhGMyAqLworCTB4REIsIDB4RkEsIDB4ODgsIDB4Q0EsIDB4ODgsIDB4Q0IsIDB4ODgsIDB4Q0MsIC8qIDB4RjQtMHhGNyAqLworCTB4REIsIDB4RkMsIDB4QzUsIDB4RTAsIDB4QkIsIDB4RjksIDB4ODgsIDB4Q0QsIC8qIDB4RjgtMHhGQiAqLworCTB4ODgsIDB4Q0UsIDB4REMsIDB4QTMsIDB4ODgsIDB4Q0YsIDB4ODgsIDB4RDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzU4WzUxMl0gPSB7CisJMHhEQywgMHhBNSwgMHg4OCwgMHhEMSwgMHhDQywgMHhDMywgMHg4OCwgMHhEMiwgLyogMHgwMC0weDAzICovCisJMHg4OCwgMHhEMywgMHg4OCwgMHhENCwgMHhCNiwgMHhEMSwgMHhERCwgMHhDMCwgLyogMHgwNC0weDA3ICovCisJMHg4OCwgMHhENSwgMHg4OCwgMHhENiwgMHg4OCwgMHhENywgMHhEQywgMHhBMSwgLyogMHgwOC0weDBCICovCisJMHg4OCwgMHhEOCwgMHhEQywgMHhBMiwgMHg4OCwgMHhEOSwgMHg4OCwgMHhEQSwgLyogMHgwQy0weDBGICovCisJMHg4OCwgMHhEQiwgMHhDNywgMHhCNSwgMHg4OCwgMHhEQywgMHg4OCwgMHhERCwgLyogMHgxMC0weDEzICovCisJMHg4OCwgMHhERSwgMHhCNiwgMHhFOSwgMHg4OCwgMHhERiwgMHg4OCwgMHhFMCwgLyogMHgxNC0weDE3ICovCisJMHg4OCwgMHhFMSwgMHhEQywgMHhBNywgMHg4OCwgMHhFMiwgMHg4OCwgMHhFMywgLyogMHgxOC0weDFCICovCisJMHg4OCwgMHhFNCwgMHg4OCwgMHhFNSwgMHhEQywgMHhBNiwgMHg4OCwgMHhFNiwgLyogMHgxQy0weDFGICovCisJMHhEQywgMHhBOSwgMHhCMSwgMHhBNCwgMHg4OCwgMHhFNywgMHg4OCwgMHhFOCwgLyogMHgyMC0weDIzICovCisJMHhCNSwgMHhDQywgMHg4OCwgMHhFOSwgMHg4OCwgMHhFQSwgMHg4OCwgMHhFQiwgLyogMHgyNC0weDI3ICovCisJMHg4OCwgMHhFQywgMHg4OCwgMHhFRCwgMHhCRiwgMHhCMCwgMHg4OCwgMHhFRSwgLyogMHgyOC0weDJCICovCisJMHg4OCwgMHhFRiwgMHg4OCwgMHhGMCwgMHg4OCwgMHhGMSwgMHg4OCwgMHhGMiwgLyogMHgyQy0weDJGICovCisJMHhEMSwgMHhERiwgMHg4OCwgMHhGMywgMHg4OCwgMHhGNCwgMHg4OCwgMHhGNSwgLyogMHgzMC0weDMzICovCisJMHg4OCwgMHhGNiwgMHhCNiwgMHhDMiwgMHg4OCwgMHhGNywgMHg4OCwgMHhGOCwgLyogMHgzNC0weDM3ICovCisJMHg4OCwgMHhGOSwgMHg4OCwgMHhGQSwgMHg4OCwgMHhGQiwgMHg4OCwgMHhGQywgLyogMHgzOC0weDNCICovCisJMHg4OCwgMHhGRCwgMHg4OCwgMHhGRSwgMHg4OSwgMHg0MCwgMHg4OSwgMHg0MSwgLyogMHgzQy0weDNGICovCisJMHg4OSwgMHg0MiwgMHg4OSwgMHg0MywgMHg4OSwgMHg0NCwgMHg4OSwgMHg0NSwgLyogMHg0MC0weDQzICovCisJMHhEQywgMHhBOCwgMHg4OSwgMHg0NiwgMHg4OSwgMHg0NywgMHg4OSwgMHg0OCwgLyogMHg0NC0weDQ3ICovCisJMHg4OSwgMHg0OSwgMHg4OSwgMHg0QSwgMHg4OSwgMHg0QiwgMHg4OSwgMHg0QywgLyogMHg0OC0weDRCICovCisJMHhDQiwgMHhGQSwgMHhFQiwgMHhGMywgMHg4OSwgMHg0RCwgMHg4OSwgMHg0RSwgLyogMHg0Qy0weDRGICovCisJMHg4OSwgMHg0RiwgMHhDQiwgMHhEQywgMHg4OSwgMHg1MCwgMHg4OSwgMHg1MSwgLyogMHg1MC0weDUzICovCisJMHhDQiwgMHhGRSwgMHg4OSwgMHg1MiwgMHg4OSwgMHg1MywgMHg4OSwgMHg1NCwgLyogMHg1NC0weDU3ICovCisJMHhDQywgMHhDMSwgMHg4OSwgMHg1NSwgMHg4OSwgMHg1NiwgMHg4OSwgMHg1NywgLyogMHg1OC0weDVCICovCisJMHg4OSwgMHg1OCwgMHg4OSwgMHg1OSwgMHhDOCwgMHhGQiwgMHg4OSwgMHg1QSwgLyogMHg1Qy0weDVGICovCisJMHg4OSwgMHg1QiwgMHg4OSwgMHg1QywgMHg4OSwgMHg1RCwgMHg4OSwgMHg1RSwgLyogMHg2MC0weDYzICovCisJMHg4OSwgMHg1RiwgMHhEQywgMHhBQSwgMHg4OSwgMHg2MCwgMHg4OSwgMHg2MSwgLyogMHg2NC0weDY3ICovCisJMHg4OSwgMHg2MiwgMHg4OSwgMHg2MywgMHg4OSwgMHg2NCwgMHhDQywgMHhFRSwgLyogMHg2OC0weDZCICovCisJMHhEQywgMHhBQiwgMHg4OSwgMHg2NSwgMHg4OSwgMHg2NiwgMHg4OSwgMHg2NywgLyogMHg2Qy0weDZGICovCisJMHg4OSwgMHg2OCwgMHg4OSwgMHg2OSwgMHg4OSwgMHg2QSwgMHg4OSwgMHg2QiwgLyogMHg3MC0weDczICovCisJMHg4OSwgMHg2QywgMHg4OSwgMHg2RCwgMHg4OSwgMHg2RSwgMHg4OSwgMHg2RiwgLyogMHg3NC0weDc3ICovCisJMHg4OSwgMHg3MCwgMHg4OSwgMHg3MSwgMHg4OSwgMHg3MiwgMHg4OSwgMHg3MywgLyogMHg3OC0weDdCICovCisJMHg4OSwgMHg3NCwgMHg4OSwgMHg3NSwgMHhEQiwgMHhEMywgMHg4OSwgMHg3NiwgLyogMHg3Qy0weDdGICovCisJCisJMHhEQywgMHhBRiwgMHhEQywgMHhBQywgMHg4OSwgMHg3NywgMHhCRSwgMHhCMywgLyogMHg4MC0weDgzICovCisJMHg4OSwgMHg3OCwgMHhDQSwgMHhGQiwgMHg4OSwgMHg3OSwgMHg4OSwgMHg3QSwgLyogMHg4NC0weDg3ICovCisJMHg4OSwgMHg3QiwgMHhEQywgMHhBRCwgMHg4OSwgMHg3QywgMHg4OSwgMHg3RCwgLyogMHg4OC0weDhCICovCisJMHg4OSwgMHg3RSwgMHg4OSwgMHg4MCwgMHg4OSwgMHg4MSwgMHg4OSwgMHg4MiwgLyogMHg4Qy0weDhGICovCisJMHg4OSwgMHg4MywgMHg4OSwgMHg4NCwgMHhDOSwgMHhDQSwgMHhDNCwgMHhCOSwgLyogMHg5MC0weDkzICovCisJMHg4OSwgMHg4NSwgMHg4OSwgMHg4NiwgMHg4OSwgMHg4NywgMHg4OSwgMHg4OCwgLyogMHg5NC0weDk3ICovCisJMHg4OSwgMHg4OSwgMHhDNywgMHhCRCwgMHhEQywgMHhBRSwgMHg4OSwgMHg4QSwgLyogMHg5OC0weDlCICovCisJMHg4OSwgMHg4QiwgMHg4OSwgMHg4QywgMHhENCwgMHhGNiwgMHhEMCwgMHhFNiwgLyogMHg5Qy0weDlGICovCisJMHg4OSwgMHg4RCwgMHg4OSwgMHg4RSwgMHg4OSwgMHg4RiwgMHg4OSwgMHg5MCwgLyogMHhBMC0weEEzICovCisJMHg4OSwgMHg5MSwgMHg4OSwgMHg5MiwgMHg4OSwgMHg5MywgMHg4OSwgMHg5NCwgLyogMHhBNC0weEE3ICovCisJMHhDNCwgMHhBQiwgMHhCNiwgMHhENSwgMHg4OSwgMHg5NSwgMHg4OSwgMHg5NiwgLyogMHhBOC0weEFCICovCisJMHg4OSwgMHg5NywgMHg4OSwgMHg5OCwgMHg4OSwgMHg5OSwgMHg4OSwgMHg5QSwgLyogMHhBQy0weEFGICovCisJMHg4OSwgMHg5QiwgMHg4OSwgMHg5QywgMHg4OSwgMHg5RCwgMHg4OSwgMHg5RSwgLyogMHhCMC0weEIzICovCisJMHg4OSwgMHg5RiwgMHg4OSwgMHhBMCwgMHg4OSwgMHhBMSwgMHg4OSwgMHhBMiwgLyogMHhCNC0weEI3ICovCisJMHg4OSwgMHhBMywgMHg4OSwgMHhBNCwgMHg4OSwgMHhBNSwgMHg4OSwgMHhBNiwgLyogMHhCOC0weEJCICovCisJMHhEQiwgMHhENCwgMHg4OSwgMHhBNywgMHg4OSwgMHhBOCwgMHg4OSwgMHhBOSwgLyogMHhCQy0weEJGICovCisJMHg4OSwgMHhBQSwgMHhCMSwgMHhEQSwgMHg4OSwgMHhBQiwgMHg4OSwgMHhBQywgLyogMHhDMC0weEMzICovCisJMHg4OSwgMHhBRCwgMHhEQiwgMHhENSwgMHg4OSwgMHhBRSwgMHg4OSwgMHhBRiwgLyogMHhDNC0weEM3ICovCisJMHg4OSwgMHhCMCwgMHg4OSwgMHhCMSwgMHg4OSwgMHhCMiwgMHg4OSwgMHhCMywgLyogMHhDOC0weENCICovCisJMHg4OSwgMHhCNCwgMHg4OSwgMHhCNSwgMHg4OSwgMHhCNiwgMHg4OSwgMHhCNywgLyogMHhDQy0weENGICovCisJMHg4OSwgMHhCOCwgMHhEQiwgMHhENiwgMHg4OSwgMHhCOSwgMHg4OSwgMHhCQSwgLyogMHhEMC0weEQzICovCisJMHg4OSwgMHhCQiwgMHhCQSwgMHhCRSwgMHg4OSwgMHhCQywgMHg4OSwgMHhCRCwgLyogMHhENC0weEQ3ICovCisJMHg4OSwgMHhCRSwgMHg4OSwgMHhCRiwgMHg4OSwgMHhDMCwgMHg4OSwgMHhDMSwgLyogMHhEOC0weERCICovCisJMHg4OSwgMHhDMiwgMHg4OSwgMHhDMywgMHg4OSwgMHhDNCwgMHg4OSwgMHhDNSwgLyogMHhEQy0weERGICovCisJMHg4OSwgMHhDNiwgMHg4OSwgMHhDNywgMHg4OSwgMHhDOCwgMHg4OSwgMHhDOSwgLyogMHhFMC0weEUzICovCisJMHhDOCwgMHhDMCwgMHg4OSwgMHhDQSwgMHg4OSwgMHhDQiwgMHg4OSwgMHhDQywgLyogMHhFNC0weEU3ICovCisJMHg4OSwgMHhDRCwgMHg4OSwgMHhDRSwgMHg4OSwgMHhDRiwgMHhDQSwgMHhCRiwgLyogMHhFOC0weEVCICovCisJMHhDOCwgMHhDOSwgMHg4OSwgMHhEMCwgMHhENywgMHhCMywgMHg4OSwgMHhEMSwgLyogMHhFQy0weEVGICovCisJMHhDOSwgMHhGOSwgMHg4OSwgMHhEMiwgMHg4OSwgMHhEMywgMHhCRiwgMHhDNywgLyogMHhGMC0weEYzICovCisJMHg4OSwgMHhENCwgMHg4OSwgMHhENSwgMHhCQSwgMHhGOCwgMHg4OSwgMHhENiwgLyogMHhGNC0weEY3ICovCisJMHg4OSwgMHhENywgMHhEMiwgMHhCQywgMHg4OSwgMHhEOCwgMHg4OSwgMHhEOSwgLyogMHhGOC0weEZCICovCisJMHg4OSwgMHhEQSwgMHg4OSwgMHhEQiwgMHg4OSwgMHhEQywgMHg4OSwgMHhERCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTlbNTEyXSA9IHsKKwkweDg5LCAweERFLCAweDg5LCAweERGLCAweEUyLCAweEJBLCAweDg5LCAweEUwLCAvKiAweDAwLTB4MDMgKi8KKwkweEI0LCAweEE2LCAweDg5LCAweEUxLCAweDg5LCAweEUyLCAweEIxLCAweEI4LCAvKiAweDA0LTB4MDcgKi8KKwkweDg5LCAweEUzLCAweDg5LCAweEU0LCAweDg5LCAweEU1LCAweDg5LCAweEU2LCAvKiAweDA4LTB4MEIgKi8KKwkweDg5LCAweEU3LCAweEI4LCAweEI0LCAweDg5LCAweEU4LCAweENGLCAweEM0LCAvKiAweDBDLTB4MEYgKi8KKwkweDg5LCAweEU5LCAweDg5LCAweEVBLCAweDg5LCAweEVCLCAweDg5LCAweEVDLCAvKiAweDEwLTB4MTMgKi8KKwkweEQ5LCAweEU3LCAweENGLCAweEE2LCAweENELCAweEUyLCAweDg5LCAweEVELCAvKiAweDE0LTB4MTcgKi8KKwkweDg5LCAweEVFLCAweEQ5LCAweEVELCAweEI2LCAweEUwLCAweDg5LCAweEVGLCAvKiAweDE4LTB4MUIgKi8KKwkweEQyLCAweEI5LCAweDg5LCAweEYwLCAweDg5LCAweEYxLCAweEI5LCAweEJCLCAvKiAweDFDLTB4MUYgKi8KKwkweDg5LCAweEYyLCAweDg5LCAweEYzLCAweDg5LCAweEY0LCAweDg5LCAweEY1LCAvKiAweDIwLTB4MjMgKi8KKwkweEUyLCAweEI5LCAweEUyLCAweEI3LCAweDg5LCAweEY2LCAweEI0LCAweEYzLCAvKiAweDI0LTB4MjcgKi8KKwkweDg5LCAweEY3LCAweENDLCAweEVDLCAweENDLCAweEFCLCAweEI3LCAweEYyLCAvKiAweDI4LTB4MkIgKi8KKwkweDg5LCAweEY4LCAweEQ4LCAweEIyLCAweEQxLCAweEVCLCAweEJBLCAweEJCLCAvKiAweDJDLTB4MkYgKi8KKwkweDg5LCAweEY5LCAweENBLCAweEE3LCAweDg5LCAweEZBLCAweDg5LCAweEZCLCAvKiAweDMwLTB4MzMgKi8KKwkweENELCAweEI3LCAweDg5LCAweEZDLCAweDg5LCAweEZELCAweEQyLCAweEM0LCAvKiAweDM0LTB4MzcgKi8KKwkweEJGLCAweEU0LCAweEJDLCAweEQwLCAweEI2LCAweEUxLCAweDg5LCAweEZFLCAvKiAweDM4LTB4M0IgKi8KKwkweERFLCAweEM1LCAweDhBLCAweDQwLCAweDhBLCAweDQxLCAweDhBLCAweDQyLCAvKiAweDNDLTB4M0YgKi8KKwkweDhBLCAweDQzLCAweERFLCAweEM2LCAweERCLCAweEJDLCAweDhBLCAweDQ0LCAvKiAweDQwLTB4NDMgKi8KKwkweEQxLCAweEQ5LCAweDhBLCAweDQ1LCAweDhBLCAweDQ2LCAweEM2LCAweEU2LCAvKiAweDQ0LTB4NDcgKi8KKwkweEM0LCAweENFLCAweEI3LCAweEVFLCAweDhBLCAweDQ3LCAweEI3LCAweERDLCAvKiAweDQ4LTB4NEIgKi8KKwkweDhBLCAweDQ4LCAweDhBLCAweDQ5LCAweEJGLCAweEZDLCAweEQ3LCAweEUwLCAvKiAweDRDLTB4NEYgKi8KKwkweDhBLCAweDRBLCAweEM2LCAweEY1LCAweDhBLCAweDRCLCAweDhBLCAweDRDLCAvKiAweDUwLTB4NTMgKi8KKwkweEIxLCAweEJDLCAweERFLCAweEM4LCAweEJELCAweEIxLCAweENDLCAweEQ3LCAvKiAweDU0LTB4NTcgKi8KKwkweERFLCAweENBLCAweDhBLCAweDRELCAweERFLCAweEM5LCAweDhBLCAweDRFLCAvKiAweDU4LTB4NUIgKi8KKwkweDhBLCAweDRGLCAweDhBLCAweDUwLCAweDhBLCAweDUxLCAweDhBLCAweDUyLCAvKiAweDVDLTB4NUYgKi8KKwkweEI1LCAweEVDLCAweDhBLCAweDUzLCAweEM5LCAweERELCAweDhBLCAweDU0LCAvKiAweDYwLTB4NjMgKi8KKwkweDhBLCAweDU1LCAweEIwLCAweEMyLCAweDhBLCAweDU2LCAweDhBLCAweDU3LCAvKiAweDY0LTB4NjcgKi8KKwkweDhBLCAweDU4LCAweDhBLCAweDU5LCAweDhBLCAweDVBLCAweDhBLCAweDVCLCAvKiAweDY4LTB4NkIgKi8KKwkweDhBLCAweDVDLCAweDhBLCAweDVELCAweDhBLCAweDVFLCAweDhBLCAweDVGLCAvKiAweDZDLTB4NkYgKi8KKwkweDhBLCAweDYwLCAweDhBLCAweDYxLCAweDhBLCAweDYyLCAweEM1LCAweEFFLCAvKiAweDcwLTB4NzMgKi8KKwkweEM1LCAweEFCLCAweDhBLCAweDYzLCAweEM0LCAweENDLCAweDhBLCAweDY0LCAvKiAweDc0LTB4NzcgKi8KKwkweEJDLCAweEU5LCAweENCLCAweEZELCAweDhBLCAweDY1LCAweDhBLCAweDY2LCAvKiAweDc4LTB4N0IgKi8KKwkweDhBLCAweDY3LCAweEJBLCAweEMzLCAweDhBLCAweDY4LCAweDhBLCAweDY5LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDhBLCAweDZBLCAweEU1LCAweEY5LCAweEM4LCAweEU3LCAweEU1LCAweEZBLCAvKiAweDgwLTB4ODMgKi8KKwkweENELCAweEZELCAweDhBLCAweDZCLCAweEQ3LCAweEIxLCAweEI4LCAweEJFLCAvKiAweDg0LTB4ODcgKi8KKwkweEMyLCAweEU4LCAweDhBLCAweDZDLCAweEM4LCAweEQxLCAweDhBLCAweDZELCAvKiAweDg4LTB4OEIgKi8KKwkweDhBLCAweDZFLCAweEU1LCAweEZCLCAweDhBLCAweDZGLCAweDhBLCAweDcwLCAvKiAweDhDLTB4OEYgKi8KKwkweDhBLCAweDcxLCAweDhBLCAweDcyLCAweEI2LCAweENBLCAweEJDLCAweENCLCAvKiAweDkwLTB4OTMgKi8KKwkweDhBLCAweDczLCAweDhBLCAweDc0LCAweEQxLCAweEZELCAweEU2LCAweEExLCAvKiAweDk0LTB4OTcgKi8KKwkweDhBLCAweDc1LCAweEMzLCAweEVFLCAweDhBLCAweDc2LCAweDhBLCAweDc3LCAvKiAweDk4LTB4OUIgKi8KKwkweDhBLCAweDc4LCAweDhBLCAweDc5LCAweEU2LCAweEE0LCAweDhBLCAweDdBLCAvKiAweDlDLTB4OUYgKi8KKwkweDhBLCAweDdCLCAweDhBLCAweDdDLCAweDhBLCAweDdELCAweEU1LCAweEZFLCAvKiAweEEwLTB4QTMgKi8KKwkweEU2LCAweEE1LCAweENELCAweEQ3LCAweDhBLCAweDdFLCAweDhBLCAweDgwLCAvKiAweEE0LTB4QTcgKi8KKwkweEI3LCAweEMxLCAweEU1LCAweEZDLCAweEU1LCAweEZELCAweEU2LCAweEEzLCAvKiAweEE4LTB4QUIgKi8KKwkweDhBLCAweDgxLCAweDhBLCAweDgyLCAweEM0LCAweERELCAweEU2LCAweEE4LCAvKiAweEFDLTB4QUYgKi8KKwkweDhBLCAweDgzLCAweDhBLCAweDg0LCAweEU2LCAweEE3LCAweDhBLCAweDg1LCAvKiAweEIwLTB4QjMgKi8KKwkweDhBLCAweDg2LCAweDhBLCAweDg3LCAweDhBLCAweDg4LCAweDhBLCAweDg5LCAvKiAweEI0LTB4QjcgKi8KKwkweDhBLCAweDhBLCAweEMzLCAweEMzLCAweDhBLCAweDhCLCAweEM2LCAweERFLCAvKiAweEI4LTB4QkIgKi8KKwkweDhBLCAweDhDLCAweDhBLCAweDhELCAweEU2LCAweEFBLCAweDhBLCAweDhFLCAvKiAweEJDLTB4QkYgKi8KKwkweDhBLCAweDhGLCAweDhBLCAweDkwLCAweDhBLCAweDkxLCAweDhBLCAweDkyLCAvKiAweEMwLTB4QzMgKi8KKwkweDhBLCAweDkzLCAweDhBLCAweDk0LCAweEM0LCAweEI3LCAweDhBLCAweDk1LCAvKiAweEM0LTB4QzcgKi8KKwkweDhBLCAweDk2LCAweDhBLCAweDk3LCAweEU2LCAweEEyLCAweENBLCAweEJDLCAvKiAweEM4LTB4Q0IgKi8KKwkweDhBLCAweDk4LCAweDhBLCAweDk5LCAweDhBLCAweDlBLCAweDhBLCAweDlCLCAvKiAweENDLTB4Q0YgKi8KKwkweEJELCAweEUzLCAweEI5LCAweEMzLCAweEU2LCAweEE2LCAweEQwLCAweEQ1LCAvKiAweEQwLTB4RDMgKi8KKwkweENFLCAweEFGLCAweDhBLCAweDlDLCAweDhBLCAweDlELCAweEU2LCAweEE5LCAvKiAweEQ0LTB4RDcgKi8KKwkweEU2LCAweEIwLCAweDhBLCAweDlFLCAweEQyLCAweEE2LCAweDhBLCAweDlGLCAvKiAweEQ4LTB4REIgKi8KKwkweEJELCAweEFBLCAweEU2LCAweEFELCAweDhBLCAweEEwLCAweDhBLCAweEExLCAvKiAweERDLTB4REYgKi8KKwkweDhBLCAweEEyLCAweDhBLCAweEEzLCAweDhBLCAweEE0LCAweEU2LCAweEFGLCAvKiAweEUwLTB4RTMgKi8KKwkweDhBLCAweEE1LCAweEMwLCAweEQxLCAweDhBLCAweEE2LCAweDhBLCAweEE3LCAvKiAweEU0LTB4RTcgKi8KKwkweEQyLCAweENDLCAweDhBLCAweEE4LCAweDhBLCAweEE5LCAweDhBLCAweEFBLCAvKiAweEU4LTB4RUIgKi8KKwkweEJDLCAweEE3LCAweDhBLCAweEFCLCAweDhBLCAweEFDLCAweDhBLCAweEFELCAvKiAweEVDLTB4RUYgKi8KKwkweDhBLCAweEFFLCAweDhBLCAweEFGLCAweDhBLCAweEIwLCAweDhBLCAweEIxLCAvKiAweEYwLTB4RjMgKi8KKwkweDhBLCAweEIyLCAweDhBLCAweEIzLCAweDhBLCAweEI0LCAweDhBLCAweEI1LCAvKiAweEY0LTB4RjcgKi8KKwkweDhBLCAweEI2LCAweEU2LCAweEIxLCAweDhBLCAweEI3LCAweEQyLCAweEY2LCAvKiAweEY4LTB4RkIgKi8KKwkweDhBLCAweEI4LCAweDhBLCAweEI5LCAweDhBLCAweEJBLCAweEQ3LCAweENCLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181QVs1MTJdID0geworCTB4OEEsIDB4QkIsIDB4Q0QsIDB4RkUsIDB4OEEsIDB4QkMsIDB4Q0QsIDB4REUsIC8qIDB4MDAtMHgwMyAqLworCTB4QzIsIDB4QTYsIDB4RTYsIDB4QUIsIDB4RTYsIDB4QUMsIDB4QkQsIDB4QkYsIC8qIDB4MDQtMHgwNyAqLworCTB4RTYsIDB4QUUsIDB4RTYsIDB4QjMsIDB4OEEsIDB4QkQsIDB4OEEsIDB4QkUsIC8qIDB4MDgtMHgwQiAqLworCTB4RTYsIDB4QjIsIDB4OEEsIDB4QkYsIDB4OEEsIDB4QzAsIDB4OEEsIDB4QzEsIC8qIDB4MEMtMHgwRiAqLworCTB4OEEsIDB4QzIsIDB4RTYsIDB4QjYsIDB4OEEsIDB4QzMsIDB4RTYsIDB4QjgsIC8qIDB4MTAtMHgxMyAqLworCTB4OEEsIDB4QzQsIDB4OEEsIDB4QzUsIDB4OEEsIDB4QzYsIDB4OEEsIDB4QzcsIC8qIDB4MTQtMHgxNyAqLworCTB4QzQsIDB4RUYsIDB4OEEsIDB4QzgsIDB4OEEsIDB4QzksIDB4OEEsIDB4Q0EsIC8qIDB4MTgtMHgxQiAqLworCTB4QzQsIDB4QzgsIDB4OEEsIDB4Q0IsIDB4OEEsIDB4Q0MsIDB4QkUsIDB4RUEsIC8qIDB4MUMtMHgxRiAqLworCTB4QzksIDB4RUYsIDB4OEEsIDB4Q0QsIDB4OEEsIDB4Q0UsIDB4RTYsIDB4QjcsIC8qIDB4MjAtMHgyMyAqLworCTB4OEEsIDB4Q0YsIDB4QjYsIDB4RjAsIDB4OEEsIDB4RDAsIDB4OEEsIDB4RDEsIC8qIDB4MjQtMHgyNyAqLworCTB4OEEsIDB4RDIsIDB4QzMsIDB4RTQsIDB4OEEsIDB4RDMsIDB4OEEsIDB4RDQsIC8qIDB4MjgtMHgyQiAqLworCTB4OEEsIDB4RDUsIDB4OEEsIDB4RDYsIDB4OEEsIDB4RDcsIDB4OEEsIDB4RDgsIC8qIDB4MkMtMHgyRiAqLworCTB4OEEsIDB4RDksIDB4RDMsIDB4RTksIDB4RTYsIDB4QjQsIDB4OEEsIDB4REEsIC8qIDB4MzAtMHgzMyAqLworCTB4RTYsIDB4QjUsIDB4OEEsIDB4REIsIDB4QzgsIDB4QTIsIDB4OEEsIDB4REMsIC8qIDB4MzQtMHgzNyAqLworCTB4OEEsIDB4REQsIDB4OEEsIDB4REUsIDB4OEEsIDB4REYsIDB4OEEsIDB4RTAsIC8qIDB4MzgtMHgzQiAqLworCTB4RTYsIDB4QkQsIDB4OEEsIDB4RTEsIDB4OEEsIDB4RTIsIDB4OEEsIDB4RTMsIC8qIDB4M0MtMHgzRiAqLworCTB4RTYsIDB4QjksIDB4OEEsIDB4RTQsIDB4OEEsIDB4RTUsIDB4OEEsIDB4RTYsIC8qIDB4NDAtMHg0MyAqLworCTB4OEEsIDB4RTcsIDB4OEEsIDB4RTgsIDB4QzYsIDB4QzUsIDB4OEEsIDB4RTksIC8qIDB4NDQtMHg0NyAqLworCTB4OEEsIDB4RUEsIDB4Q0QsIDB4RjEsIDB4RTYsIDB4QkIsIDB4OEEsIDB4RUIsIC8qIDB4NDgtMHg0QiAqLworCTB4OEEsIDB4RUMsIDB4OEEsIDB4RUQsIDB4OEEsIDB4RUUsIDB4OEEsIDB4RUYsIC8qIDB4NEMtMHg0RiAqLworCTB4OEEsIDB4RjAsIDB4OEEsIDB4RjEsIDB4OEEsIDB4RjIsIDB4OEEsIDB4RjMsIC8qIDB4NTAtMHg1MyAqLworCTB4OEEsIDB4RjQsIDB4RTYsIDB4QkMsIDB4OEEsIDB4RjUsIDB4OEEsIDB4RjYsIC8qIDB4NTQtMHg1NyAqLworCTB4OEEsIDB4RjcsIDB4OEEsIDB4RjgsIDB4QkIsIDB4RTksIDB4OEEsIDB4RjksIC8qIDB4NTgtMHg1QiAqLworCTB4OEEsIDB4RkEsIDB4OEEsIDB4RkIsIDB4OEEsIDB4RkMsIDB4OEEsIDB4RkQsIC8qIDB4NUMtMHg1RiAqLworCTB4OEEsIDB4RkUsIDB4OEIsIDB4NDAsIDB4RTYsIDB4QkUsIDB4OEIsIDB4NDEsIC8qIDB4NjAtMHg2MyAqLworCTB4OEIsIDB4NDIsIDB4OEIsIDB4NDMsIDB4OEIsIDB4NDQsIDB4RTYsIDB4QkEsIC8qIDB4NjQtMHg2NyAqLworCTB4OEIsIDB4NDUsIDB4OEIsIDB4NDYsIDB4QzAsIDB4QjcsIDB4OEIsIDB4NDcsIC8qIDB4NjgtMHg2QiAqLworCTB4OEIsIDB4NDgsIDB4OEIsIDB4NDksIDB4OEIsIDB4NEEsIDB4OEIsIDB4NEIsIC8qIDB4NkMtMHg2RiAqLworCTB4OEIsIDB4NEMsIDB4OEIsIDB4NEQsIDB4OEIsIDB4NEUsIDB4OEIsIDB4NEYsIC8qIDB4NzAtMHg3MyAqLworCTB4RDMsIDB4QTQsIDB4RTYsIDB4QkYsIDB4QzksIDB4RjQsIDB4RTYsIDB4QzMsIC8qIDB4NzQtMHg3NyAqLworCTB4OEIsIDB4NTAsIDB4OEIsIDB4NTEsIDB4RTYsIDB4QzQsIDB4OEIsIDB4NTIsIC8qIDB4NzgtMHg3QiAqLworCTB4OEIsIDB4NTMsIDB4OEIsIDB4NTQsIDB4OEIsIDB4NTUsIDB4RDAsIDB4RjYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OEIsIDB4NTYsIDB4OEIsIDB4NTcsIDB4OEIsIDB4NTgsIDB4OEIsIDB4NTksIC8qIDB4ODAtMHg4MyAqLworCTB4OEIsIDB4NUEsIDB4OEIsIDB4NUIsIDB4OEIsIDB4NUMsIDB4OEIsIDB4NUQsIC8qIDB4ODQtMHg4NyAqLworCTB4OEIsIDB4NUUsIDB4OEIsIDB4NUYsIDB4OEIsIDB4NjAsIDB4OEIsIDB4NjEsIC8qIDB4ODgtMHg4QiAqLworCTB4OEIsIDB4NjIsIDB4OEIsIDB4NjMsIDB4OEIsIDB4NjQsIDB4OEIsIDB4NjUsIC8qIDB4OEMtMHg4RiAqLworCTB4OEIsIDB4NjYsIDB4OEIsIDB4NjcsIDB4QzMsIDB4QkQsIDB4OEIsIDB4NjgsIC8qIDB4OTAtMHg5MyAqLworCTB4OEIsIDB4NjksIDB4OEIsIDB4NkEsIDB4OEIsIDB4NkIsIDB4OEIsIDB4NkMsIC8qIDB4OTQtMHg5NyAqLworCTB4OEIsIDB4NkQsIDB4OEIsIDB4NkUsIDB4QzMsIDB4QzQsIDB4RTYsIDB4QzIsIC8qIDB4OTgtMHg5QiAqLworCTB4OEIsIDB4NkYsIDB4OEIsIDB4NzAsIDB4OEIsIDB4NzEsIDB4OEIsIDB4NzIsIC8qIDB4OUMtMHg5RiAqLworCTB4OEIsIDB4NzMsIDB4OEIsIDB4NzQsIDB4OEIsIDB4NzUsIDB4OEIsIDB4NzYsIC8qIDB4QTAtMHhBMyAqLworCTB4OEIsIDB4NzcsIDB4OEIsIDB4NzgsIDB4OEIsIDB4NzksIDB4OEIsIDB4N0EsIC8qIDB4QTQtMHhBNyAqLworCTB4OEIsIDB4N0IsIDB4OEIsIDB4N0MsIDB4RTYsIDB4QzEsIDB4OEIsIDB4N0QsIC8qIDB4QTgtMHhBQiAqLworCTB4OEIsIDB4N0UsIDB4OEIsIDB4ODAsIDB4OEIsIDB4ODEsIDB4OEIsIDB4ODIsIC8qIDB4QUMtMHhBRiAqLworCTB4OEIsIDB4ODMsIDB4OEIsIDB4ODQsIDB4RTYsIDB4QzcsIDB4Q0YsIDB4QjEsIC8qIDB4QjAtMHhCMyAqLworCTB4OEIsIDB4ODUsIDB4RUIsIDB4RjQsIDB4OEIsIDB4ODYsIDB4OEIsIDB4ODcsIC8qIDB4QjQtMHhCNyAqLworCTB4RTYsIDB4Q0EsIDB4OEIsIDB4ODgsIDB4OEIsIDB4ODksIDB4OEIsIDB4OEEsIC8qIDB4QjgtMHhCQiAqLworCTB4OEIsIDB4OEIsIDB4OEIsIDB4OEMsIDB4RTYsIDB4QzUsIDB4OEIsIDB4OEQsIC8qIDB4QkMtMHhCRiAqLworCTB4OEIsIDB4OEUsIDB4QkMsIDB4REUsIDB4QzksIDB4QTksIDB4OEIsIDB4OEYsIC8qIDB4QzAtMHhDMyAqLworCTB4OEIsIDB4OTAsIDB4OEIsIDB4OTEsIDB4OEIsIDB4OTIsIDB4OEIsIDB4OTMsIC8qIDB4QzQtMHhDNyAqLworCTB4OEIsIDB4OTQsIDB4QkMsIDB4QjUsIDB4OEIsIDB4OTUsIDB4OEIsIDB4OTYsIC8qIDB4QzgtMHhDQiAqLworCTB4Q0YsIDB4RDMsIDB4OEIsIDB4OTcsIDB4OEIsIDB4OTgsIDB4OEIsIDB4OTksIC8qIDB4Q0MtMHhDRiAqLworCTB4OEIsIDB4OUEsIDB4OEIsIDB4OUIsIDB4RTYsIDB4QzgsIDB4OEIsIDB4OUMsIC8qIDB4RDAtMHhEMyAqLworCTB4RTYsIDB4QzksIDB4OEIsIDB4OUQsIDB4RTYsIDB4Q0UsIDB4OEIsIDB4OUUsIC8qIDB4RDQtMHhENyAqLworCTB4RTYsIDB4RDAsIDB4OEIsIDB4OUYsIDB4OEIsIDB4QTAsIDB4OEIsIDB4QTEsIC8qIDB4RDgtMHhEQiAqLworCTB4RTYsIDB4RDEsIDB4OEIsIDB4QTIsIDB4OEIsIDB4QTMsIDB4OEIsIDB4QTQsIC8qIDB4REMtMHhERiAqLworCTB4RTYsIDB4Q0IsIDB4QjUsIDB4RDUsIDB4OEIsIDB4QTUsIDB4RTYsIDB4Q0MsIC8qIDB4RTAtMHhFMyAqLworCTB4OEIsIDB4QTYsIDB4OEIsIDB4QTcsIDB4RTYsIDB4Q0YsIDB4OEIsIDB4QTgsIC8qIDB4RTQtMHhFNyAqLworCTB4OEIsIDB4QTksIDB4QzQsIDB4REIsIDB4OEIsIDB4QUEsIDB4RTYsIDB4QzYsIC8qIDB4RTgtMHhFQiAqLworCTB4OEIsIDB4QUIsIDB4OEIsIDB4QUMsIDB4OEIsIDB4QUQsIDB4OEIsIDB4QUUsIC8qIDB4RUMtMHhFRiAqLworCTB4OEIsIDB4QUYsIDB4RTYsIDB4Q0QsIDB4OEIsIDB4QjAsIDB4OEIsIDB4QjEsIC8qIDB4RjAtMHhGMyAqLworCTB4OEIsIDB4QjIsIDB4OEIsIDB4QjMsIDB4OEIsIDB4QjQsIDB4OEIsIDB4QjUsIC8qIDB4RjQtMHhGNyAqLworCTB4OEIsIDB4QjYsIDB4OEIsIDB4QjcsIDB4OEIsIDB4QjgsIDB4OEIsIDB4QjksIC8qIDB4RjgtMHhGQiAqLworCTB4OEIsIDB4QkEsIDB4OEIsIDB4QkIsIDB4OEIsIDB4QkMsIDB4OEIsIDB4QkQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzVCWzUxMl0gPSB7CisJMHg4QiwgMHhCRSwgMHg4QiwgMHhCRiwgMHg4QiwgMHhDMCwgMHg4QiwgMHhDMSwgLyogMHgwMC0weDAzICovCisJMHg4QiwgMHhDMiwgMHg4QiwgMHhDMywgMHg4QiwgMHhDNCwgMHg4QiwgMHhDNSwgLyogMHgwNC0weDA3ICovCisJMHg4QiwgMHhDNiwgMHhFNiwgMHhEMiwgMHg4QiwgMHhDNywgMHg4QiwgMHhDOCwgLyogMHgwOC0weDBCICovCisJMHg4QiwgMHhDOSwgMHg4QiwgMHhDQSwgMHg4QiwgMHhDQiwgMHg4QiwgMHhDQywgLyogMHgwQy0weDBGICovCisJMHg4QiwgMHhDRCwgMHg4QiwgMHhDRSwgMHg4QiwgMHhDRiwgMHg4QiwgMHhEMCwgLyogMHgxMC0weDEzICovCisJMHg4QiwgMHhEMSwgMHg4QiwgMHhEMiwgMHhFNiwgMHhENCwgMHhFNiwgMHhEMywgLyogMHgxNC0weDE3ICovCisJMHg4QiwgMHhEMywgMHg4QiwgMHhENCwgMHg4QiwgMHhENSwgMHg4QiwgMHhENiwgLyogMHgxOC0weDFCICovCisJMHg4QiwgMHhENywgMHg4QiwgMHhEOCwgMHg4QiwgMHhEOSwgMHg4QiwgMHhEQSwgLyogMHgxQy0weDFGICovCisJMHg4QiwgMHhEQiwgMHg4QiwgMHhEQywgMHg4QiwgMHhERCwgMHg4QiwgMHhERSwgLyogMHgyMC0weDIzICovCisJMHg4QiwgMHhERiwgMHg4QiwgMHhFMCwgMHg4QiwgMHhFMSwgMHg4QiwgMHhFMiwgLyogMHgyNC0weDI3ICovCisJMHg4QiwgMHhFMywgMHg4QiwgMHhFNCwgMHg4QiwgMHhFNSwgMHg4QiwgMHhFNiwgLyogMHgyOC0weDJCICovCisJMHg4QiwgMHhFNywgMHg4QiwgMHhFOCwgMHg4QiwgMHhFOSwgMHg4QiwgMHhFQSwgLyogMHgyQy0weDJGICovCisJMHg4QiwgMHhFQiwgMHg4QiwgMHhFQywgMHhFNiwgMHhENSwgMHg4QiwgMHhFRCwgLyogMHgzMC0weDMzICovCisJMHhEOSwgMHhGOCwgMHg4QiwgMHhFRSwgMHg4QiwgMHhFRiwgMHhFNiwgMHhENiwgLyogMHgzNC0weDM3ICovCisJMHg4QiwgMHhGMCwgMHg4QiwgMHhGMSwgMHg4QiwgMHhGMiwgMHg4QiwgMHhGMywgLyogMHgzOC0weDNCICovCisJMHg4QiwgMHhGNCwgMHg4QiwgMHhGNSwgMHg4QiwgMHhGNiwgMHg4QiwgMHhGNywgLyogMHgzQy0weDNGICovCisJMHhFNiwgMHhENywgMHg4QiwgMHhGOCwgMHg4QiwgMHhGOSwgMHg4QiwgMHhGQSwgLyogMHg0MC0weDQzICovCisJMHg4QiwgMHhGQiwgMHg4QiwgMHhGQywgMHg4QiwgMHhGRCwgMHg4QiwgMHhGRSwgLyogMHg0NC0weDQ3ICovCisJMHg4QywgMHg0MCwgMHg4QywgMHg0MSwgMHg4QywgMHg0MiwgMHg4QywgMHg0MywgLyogMHg0OC0weDRCICovCisJMHg4QywgMHg0NCwgMHg4QywgMHg0NSwgMHg4QywgMHg0NiwgMHg4QywgMHg0NywgLyogMHg0Qy0weDRGICovCisJMHhENywgMHhEMywgMHhFNiwgMHhERCwgMHg4QywgMHg0OCwgMHhFNiwgMHhERSwgLyogMHg1MC0weDUzICovCisJMHhCRiwgMHhENywgMHhENCwgMHhEMCwgMHg4QywgMHg0OSwgMHhENywgMHhENiwgLyogMHg1NC0weDU3ICovCisJMHhCNCwgMHhFNiwgMHhDQiwgMHhFRiwgMHhFNiwgMHhEQSwgMHhEOCwgMHhDMywgLyogMHg1OC0weDVCICovCisJMHhENywgMHhDRSwgMHhEMCwgMHhBMiwgMHg4QywgMHg0QSwgMHhDMywgMHhDRiwgLyogMHg1Qy0weDVGICovCisJMHg4QywgMHg0QiwgMHg4QywgMHg0QywgMHhFNiwgMHhERiwgMHhCQywgMHhCRSwgLyogMHg2MC0weDYzICovCisJMHhCOSwgMHhDMiwgMHhFNiwgMHhEQiwgMHhEMSwgMHhBNywgMHg4QywgMHg0RCwgLyogMHg2NC0weDY3ICovCisJMHg4QywgMHg0RSwgMHhCQSwgMHhBMiwgMHhDMiwgMHhDRiwgMHg4QywgMHg0RiwgLyogMHg2OC0weDZCICovCisJMHhEOCwgMHhBQiwgMHg4QywgMHg1MCwgMHg4QywgMHg1MSwgMHg4QywgMHg1MiwgLyogMHg2Qy0weDZGICovCisJMHhDQSwgMHhFQiwgMHhFNSwgMHhFRSwgMHg4QywgMHg1MywgMHhFNiwgMHhEQywgLyogMHg3MC0weDczICovCisJMHg4QywgMHg1NCwgMHhCNywgMHhGNSwgMHg4QywgMHg1NSwgMHg4QywgMHg1NiwgLyogMHg3NC0weDc3ICovCisJMHg4QywgMHg1NywgMHg4QywgMHg1OCwgMHhDOCwgMHhFNiwgMHg4QywgMHg1OSwgLyogMHg3OC0weDdCICovCisJMHg4QywgMHg1QSwgMHhDNCwgMHhGNSwgMHg4QywgMHg1QiwgMHg4QywgMHg1QywgLyogMHg3Qy0weDdGICovCisJCisJMHhFNSwgMHhCMiwgMHhDNCwgMHhGRSwgMHg4QywgMHg1RCwgMHhDQiwgMHhGQywgLyogMHg4MC0weDgzICovCisJMHhFNSwgMHhCMywgMHhENSwgMHhBQywgMHg4QywgMHg1RSwgMHhEMywgMHhFRSwgLyogMHg4NC0weDg3ICovCisJMHhDQSwgMHhEOCwgMHhCMCwgMHhCMiwgMHg4QywgMHg1RiwgMHhDQiwgMHhDRSwgLyogMHg4OC0weDhCICovCisJMHhDRCwgMHhFQSwgMHg4QywgMHg2MCwgMHg4QywgMHg2MSwgMHhCQSwgMHhFQSwgLyogMHg4Qy0weDhGICovCisJMHg4QywgMHg2MiwgMHg4QywgMHg2MywgMHg4QywgMHg2NCwgMHhFNSwgMHhCNSwgLyogMHg5MC0weDkzICovCisJMHg4QywgMHg2NSwgMHhFNSwgMHhCNCwgMHg4QywgMHg2NiwgMHhENywgMHhEQSwgLyogMHg5NC0weDk3ICovCisJMHhCOSwgMHhEOSwgMHhENiwgMHhFNiwgMHhCNiwgMHhBOCwgMHhDRCwgMHhGMCwgLyogMHg5OC0weDlCICovCisJMHhEMiwgMHhDQiwgMHhCMSwgMHhBNiwgMHhDQSwgMHhCNSwgMHg4QywgMHg2NywgLyogMHg5Qy0weDlGICovCisJMHhCMywgMHhFOCwgMHhDOSwgMHhGMywgMHhCRiwgMHhDRCwgMHhEMCwgMHhGQiwgLyogMHhBMC0weEEzICovCisJMHhDQSwgMHhEMiwgMHhFNSwgMHhCNiwgMHhCQiwgMHhDMiwgMHg4QywgMHg2OCwgLyogMHhBNC0weEE3ICovCisJMHg4QywgMHg2OSwgMHg4QywgMHg2QSwgMHhDRiwgMHhEQywgMHhCOSwgMHhBQywgLyogMHhBOC0weEFCICovCisJMHg4QywgMHg2QiwgMHg4QywgMHg2QywgMHg4QywgMHg2RCwgMHg4QywgMHg2RSwgLyogMHhBQy0weEFGICovCisJMHhENCwgMHhENywgMHg4QywgMHg2RiwgMHg4QywgMHg3MCwgMHhCQSwgMHhBNiwgLyogMHhCMC0weEIzICovCisJMHhEMSwgMHhFNywgMHhDRiwgMHhGQywgMHhCQywgMHhEMiwgMHg4QywgMHg3MSwgLyogMHhCNC0weEI3ICovCisJMHhFNSwgMHhCNywgMHhDOCwgMHhERCwgMHg4QywgMHg3MiwgMHg4QywgMHg3MywgLyogMHhCOC0weEJCICovCisJMHg4QywgMHg3NCwgMHhCRiwgMHhFRCwgMHhCMSwgMHhGNiwgMHhDQiwgMHhERSwgLyogMHhCQy0weEJGICovCisJMHg4QywgMHg3NSwgMHg4QywgMHg3NiwgMHhCQywgMHhDNSwgMHg4QywgMHg3NywgLyogMHhDMC0weEMzICovCisJMHhCQywgMHhDNCwgMHhEMiwgMHhGQSwgMHhDMywgMHhEQywgMHhCRiwgMHhEQywgLyogMHhDNC0weEM3ICovCisJMHg4QywgMHg3OCwgMHg4QywgMHg3OSwgMHg4QywgMHg3QSwgMHg4QywgMHg3QiwgLyogMHhDOC0weENCICovCisJMHhCOCwgMHhCQiwgMHg4QywgMHg3QywgMHg4QywgMHg3RCwgMHg4QywgMHg3RSwgLyogMHhDQy0weENGICovCisJMHhDMywgMHhDMiwgMHg4QywgMHg4MCwgMHhCQSwgMHhBRSwgMHhENCwgMHhBMiwgLyogMHhEMC0weEQzICovCisJMHg4QywgMHg4MSwgMHg4QywgMHg4MiwgMHg4QywgMHg4MywgMHg4QywgMHg4NCwgLyogMHhENC0weEQ3ICovCisJMHg4QywgMHg4NSwgMHg4QywgMHg4NiwgMHg4QywgMHg4NywgMHg4QywgMHg4OCwgLyogMHhEOC0weERCICovCisJMHg4QywgMHg4OSwgMHhDNywgMHhERSwgMHhDNCwgMHhBRiwgMHhCMiwgMHhFQywgLyogMHhEQy0weERGICovCisJMHg4QywgMHg4QSwgMHhCOSwgMHhEMSwgMHg4QywgMHg4QiwgMHg4QywgMHg4QywgLyogMHhFMC0weEUzICovCisJMHhFNSwgMHhCQiwgMHhDMSwgMHhDOCwgMHg4QywgMHg4RCwgMHg4QywgMHg4RSwgLyogMHhFNC0weEU3ICovCisJMHhENSwgMHhBRiwgMHg4QywgMHg4RiwgMHg4QywgMHg5MCwgMHg4QywgMHg5MSwgLyogMHhFOC0weEVCICovCisJMHg4QywgMHg5MiwgMHg4QywgMHg5MywgMHhFNSwgMHhCQywgMHg4QywgMHg5NCwgLyogMHhFQy0weEVGICovCisJMHhFNSwgMHhCRSwgMHg4QywgMHg5NSwgMHg4QywgMHg5NiwgMHg4QywgMHg5NywgLyogMHhGMC0weEYzICovCisJMHg4QywgMHg5OCwgMHg4QywgMHg5OSwgMHg4QywgMHg5QSwgMHg4QywgMHg5QiwgLyogMHhGNC0weEY3ICovCisJMHhCNCwgMHhFNywgMHhCNiwgMHhENCwgMHhDQiwgMHhDMiwgMHhEMSwgMHhCMCwgLyogMHhGOC0weEZCICovCisJMHhCNSwgMHhCQywgMHg4QywgMHg5QywgMHg4QywgMHg5RCwgMHhDQSwgMHhEOSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNUNbNTEyXSA9IHsKKwkweDhDLCAweDlFLCAweEI3LCAweEUyLCAweDhDLCAweDlGLCAweDhDLCAweEEwLCAvKiAweDAwLTB4MDMgKi8KKwkweEM5LCAweEU0LCAweDhDLCAweEExLCAweEJELCAweEFCLCAweDhDLCAweEEyLCAvKiAweDA0LTB4MDcgKi8KKwkweDhDLCAweEEzLCAweENFLCAweEJFLCAweEQ3LCAweEYwLCAweDhDLCAweEE0LCAvKiAweDA4LTB4MEIgKi8KKwkweDhDLCAweEE1LCAweDhDLCAweEE2LCAweDhDLCAweEE3LCAweEQwLCAweEExLCAvKiAweDBDLTB4MEYgKi8KKwkweDhDLCAweEE4LCAweEM5LCAweEQ5LCAweDhDLCAweEE5LCAweDhDLCAweEFBLCAvKiAweDEwLTB4MTMgKi8KKwkweEI2LCAweEZCLCAweEU2LCAweEQ4LCAweEJDLCAweEUyLCAweDhDLCAweEFCLCAvKiAweDE0LTB4MTcgKi8KKwkweEIzLCAweEJFLCAweDhDLCAweEFDLCAweEM5LCAweEQwLCAweDhDLCAweEFELCAvKiAweDE4LTB4MUIgKi8KKwkweEU2LCAweEQ5LCAweEIzLCAweEEyLCAweDhDLCAweEFFLCAweDhDLCAweEFGLCAvKiAweDFDLTB4MUYgKi8KKwkweDhDLCAweEIwLCAweDhDLCAweEIxLCAweERFLCAweENDLCAweDhDLCAweEIyLCAvKiAweDIwLTB4MjMgKi8KKwkweEQzLCAweEM4LCAweERFLCAweENELCAweDhDLCAweEIzLCAweEQyLCAweEEyLCAvKiAweDI0LTB4MjcgKi8KKwkweDhDLCAweEI0LCAweDhDLCAweEI1LCAweDhDLCAweEI2LCAweDhDLCAweEI3LCAvKiAweDI4LTB4MkIgKi8KKwkweERFLCAweENFLCAweDhDLCAweEI4LCAweDhDLCAweEI5LCAweDhDLCAweEJBLCAvKiAweDJDLTB4MkYgKi8KKwkweDhDLCAweEJCLCAweEJFLCAweENELCAweDhDLCAweEJDLCAweDhDLCAweEJELCAvKiAweDMwLTB4MzMgKi8KKwkweERFLCAweENGLCAweDhDLCAweEJFLCAweDhDLCAweEJGLCAweDhDLCAweEMwLCAvKiAweDM0LTB4MzcgKi8KKwkweENBLCAweEFDLCAweEQyLCAweEZDLCAweEIzLCAweERGLCAweEU1LCAweEVBLCAvKiAweDM4LTB4M0IgKi8KKwkweEM0LCAweEUxLCAweEJFLCAweEExLCAweENFLCAweEIyLCAweEM0LCAweEYyLCAvKiAweDNDLTB4M0YgKi8KKwkweEJFLCAweEQ2LCAweEM2LCAweEE4LCAweEIyLCAweEUzLCAweDhDLCAweEMxLCAvKiAweDQwLTB4NDMgKi8KKwkweDhDLCAweEMyLCAweEJFLCAweEQzLCAweDhDLCAweEMzLCAweDhDLCAweEM0LCAvKiAweDQ0LTB4NDcgKi8KKwkweEM3LCAweEZDLCAweENDLCAweEVCLCAweEJELCAweEVDLCAweENFLCAweERELCAvKiAweDQ4LTB4NEIgKi8KKwkweDhDLCAweEM1LCAweDhDLCAweEM2LCAweENBLCAweEJBLCAweEM2LCAweEMxLCAvKiAweDRDLTB4NEYgKi8KKwkweEU1LCAweEVDLCAweEQwLCAweEJDLCAweDhDLCAweEM3LCAweDhDLCAweEM4LCAvKiAweDUwLTB4NTMgKi8KKwkweDhDLCAweEM5LCAweEQ1LCAweEI5LCAweDhDLCAweENBLCAweDhDLCAweENCLCAvKiAweDU0LTB4NTcgKi8KKwkweDhDLCAweENDLCAweEU1LCAweEVELCAweDhDLCAweENELCAweDhDLCAweENFLCAvKiAweDU4LTB4NUIgKi8KKwkweDhDLCAweENGLCAweDhDLCAweEQwLCAweENBLCAweEY0LCAweDhDLCAweEQxLCAvKiAweDVDLTB4NUYgKi8KKwkweENELCAweEMwLCAweEMyLCAweEM1LCAweDhDLCAweEQyLCAweEU1LCAweEVGLCAvKiAweDYwLTB4NjMgKi8KKwkweDhDLCAweEQzLCAweEMyLCAweEM0LCAweEU1LCAweEYwLCAweDhDLCAweEQ0LCAvKiAweDY0LTB4NjcgKi8KKwkweDhDLCAweEQ1LCAweDhDLCAweEQ2LCAweDhDLCAweEQ3LCAweDhDLCAweEQ4LCAvKiAweDY4LTB4NkIgKi8KKwkweDhDLCAweEQ5LCAweDhDLCAweERBLCAweEU1LCAweEY4LCAweENELCAweENELCAvKiAweDZDLTB4NkYgKi8KKwkweDhDLCAweERCLCAweEM5LCAweEJELCAweDhDLCAweERDLCAweDhDLCAweERELCAvKiAweDcwLTB4NzMgKi8KKwkweDhDLCAweERFLCAweDhDLCAweERGLCAweDhDLCAweEUwLCAweDhDLCAweEUxLCAvKiAweDc0LTB4NzcgKi8KKwkweDhDLCAweEUyLCAweEQyLCAweEQ5LCAweEUxLCAweEE4LCAweDhDLCAweEUzLCAvKiAweDc4LTB4N0IgKi8KKwkweDhDLCAweEU0LCAweDhDLCAweEU1LCAweDhDLCAweEU2LCAweEQzLCAweEVDLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDhDLCAweEU3LCAweENCLCAweEVBLCAweEM2LCAweEYxLCAweDhDLCAweEU4LCAvKiAweDgwLTB4ODMgKi8KKwkweDhDLCAweEU5LCAweDhDLCAweEVBLCAweDhDLCAweEVCLCAweDhDLCAweEVDLCAvKiAweDg0LTB4ODcgKi8KKwkweEUxLCAweEFDLCAweDhDLCAweEVELCAweDhDLCAweEVFLCAweDhDLCAweEVGLCAvKiAweDg4LTB4OEIgKi8KKwkweEUxLCAweEE3LCAweEUxLCAweEE5LCAweDhDLCAweEYwLCAweDhDLCAweEYxLCAvKiAweDhDLTB4OEYgKi8KKwkweEUxLCAweEFBLCAweEUxLCAweEFGLCAweDhDLCAweEYyLCAweDhDLCAweEYzLCAvKiAweDkwLTB4OTMgKi8KKwkweEIyLCAweEVELCAweDhDLCAweEY0LCAweEUxLCAweEFCLCAweEI4LCAweERBLCAvKiAweDk0LTB4OTcgKi8KKwkweEUxLCAweEFELCAweEUxLCAweEFFLCAweEUxLCAweEIwLCAweEI1LCAweEJBLCAvKiAweDk4LTB4OUIgKi8KKwkweEUxLCAweEIxLCAweDhDLCAweEY1LCAweDhDLCAweEY2LCAweDhDLCAweEY3LCAvKiAweDlDLTB4OUYgKi8KKwkweDhDLCAweEY4LCAweDhDLCAweEY5LCAweEUxLCAweEIzLCAweEUxLCAweEI4LCAvKiAweEEwLTB4QTMgKi8KKwkweDhDLCAweEZBLCAweDhDLCAweEZCLCAweDhDLCAweEZDLCAweDhDLCAweEZELCAvKiAweEE0LTB4QTcgKi8KKwkweDhDLCAweEZFLCAweEQxLCAweEQyLCAweDhELCAweDQwLCAweEUxLCAweEI2LCAvKiAweEE4LTB4QUIgKi8KKwkweEUxLCAweEI1LCAweEMxLCAweEVCLCAweDhELCAweDQxLCAweDhELCAweDQyLCAvKiAweEFDLTB4QUYgKi8KKwkweDhELCAweDQzLCAweEUxLCAweEI3LCAweDhELCAweDQ0LCAweEQ0LCAweEMwLCAvKiAweEIwLTB4QjMgKi8KKwkweDhELCAweDQ1LCAweEUxLCAweEIyLCAweDhELCAweDQ2LCAweEUxLCAweEJBLCAvKiAweEI0LTB4QjcgKi8KKwkweEIwLCAweEI2LCAweDhELCAweDQ3LCAweDhELCAweDQ4LCAweDhELCAweDQ5LCAvKiAweEI4LTB4QkIgKi8KKwkweDhELCAweDRBLCAweEUxLCAweEI0LCAweDhELCAweDRCLCAweEJGLCAweEY5LCAvKiAweEJDLTB4QkYgKi8KKwkweDhELCAweDRDLCAweEUxLCAweEI5LCAweDhELCAweDRELCAweDhELCAweDRFLCAvKiAweEMwLTB4QzMgKi8KKwkweEUxLCAweEJCLCAweDhELCAweDRGLCAweDhELCAweDUwLCAweDhELCAweDUxLCAvKiAweEM0LTB4QzcgKi8KKwkweDhELCAweDUyLCAweDhELCAweDUzLCAweDhELCAweDU0LCAweEUxLCAweEJFLCAvKiAweEM4LTB4Q0IgKi8KKwkweDhELCAweDU1LCAweDhELCAweDU2LCAweDhELCAweDU3LCAweDhELCAweDU4LCAvKiAweENDLTB4Q0YgKi8KKwkweDhELCAweDU5LCAweDhELCAweDVBLCAweEUxLCAweEJDLCAweDhELCAweDVCLCAvKiAweEQwLTB4RDMgKi8KKwkweDhELCAweDVDLCAweDhELCAweDVELCAweDhELCAweDVFLCAweDhELCAweDVGLCAvKiAweEQ0LTB4RDcgKi8KKwkweDhELCAweDYwLCAweEQ2LCAweEM1LCAweDhELCAweDYxLCAweDhELCAweDYyLCAvKiAweEQ4LTB4REIgKi8KKwkweDhELCAweDYzLCAweDhELCAweDY0LCAweDhELCAweDY1LCAweDhELCAweDY2LCAvKiAweERDLTB4REYgKi8KKwkweDhELCAweDY3LCAweENGLCAweEJGLCAweDhELCAweDY4LCAweDhELCAweDY5LCAvKiAweEUwLTB4RTMgKi8KKwkweEUxLCAweEJELCAweEUxLCAweEJGLCAweEMyLCAweENELCAweDhELCAweDZBLCAvKiAweEU0LTB4RTcgKi8KKwkweEI2LCAweEVCLCAweDhELCAweDZCLCAweEQzLCAweEY4LCAweDhELCAweDZDLCAvKiAweEU4LTB4RUIgKi8KKwkweDhELCAweDZELCAweEM3LCAweENELCAweDhELCAweDZFLCAweDhELCAweDZGLCAvKiAweEVDLTB4RUYgKi8KKwkweEI3LCAweEU1LCAweDhELCAweDcwLCAweDhELCAweDcxLCAweDhELCAweDcyLCAvKiAweEYwLTB4RjMgKi8KKwkweDhELCAweDczLCAweDhELCAweDc0LCAweDhELCAweDc1LCAweDhELCAweDc2LCAvKiAweEY0LTB4RjcgKi8KKwkweDhELCAweDc3LCAweDhELCAweDc4LCAweDhELCAweDc5LCAweEJFLCAweEZFLCAvKiAweEY4LTB4RkIgKi8KKwkweDhELCAweDdBLCAweDhELCAweDdCLCAweDhELCAweDdDLCAweDhELCAweDdELCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181RFs1MTJdID0geworCTB4OEQsIDB4N0UsIDB4OEQsIDB4ODAsIDB4RTEsIDB4QzAsIDB4RTEsIDB4QzEsIC8qIDB4MDAtMHgwMyAqLworCTB4OEQsIDB4ODEsIDB4OEQsIDB4ODIsIDB4RTEsIDB4QzcsIDB4QjMsIDB4RTcsIC8qIDB4MDQtMHgwNyAqLworCTB4OEQsIDB4ODMsIDB4OEQsIDB4ODQsIDB4OEQsIDB4ODUsIDB4OEQsIDB4ODYsIC8qIDB4MDgtMHgwQiAqLworCTB4OEQsIDB4ODcsIDB4OEQsIDB4ODgsIDB4QzYsIDB4RTksIDB4OEQsIDB4ODksIC8qIDB4MEMtMHgwRiAqLworCTB4OEQsIDB4OEEsIDB4OEQsIDB4OEIsIDB4OEQsIDB4OEMsIDB4OEQsIDB4OEQsIC8qIDB4MTAtMHgxMyAqLworCTB4QjQsIDB4REUsIDB4OEQsIDB4OEUsIDB4RDEsIDB4QzIsIDB4OEQsIDB4OEYsIC8qIDB4MTQtMHgxNyAqLworCTB4OEQsIDB4OTAsIDB4OEQsIDB4OTEsIDB4OEQsIDB4OTIsIDB4RTEsIDB4QzgsIC8qIDB4MTgtMHgxQiAqLworCTB4OEQsIDB4OTMsIDB4OEQsIDB4OTQsIDB4RTEsIDB4QzYsIDB4OEQsIDB4OTUsIC8qIDB4MUMtMHgxRiAqLworCTB4OEQsIDB4OTYsIDB4OEQsIDB4OTcsIDB4OEQsIDB4OTgsIDB4OEQsIDB4OTksIC8qIDB4MjAtMHgyMyAqLworCTB4RTEsIDB4QzUsIDB4OEQsIDB4OUEsIDB4RTEsIDB4QzMsIDB4RTEsIDB4QzIsIC8qIDB4MjQtMHgyNyAqLworCTB4OEQsIDB4OUIsIDB4QjEsIDB4QzAsIDB4OEQsIDB4OUMsIDB4OEQsIDB4OUQsIC8qIDB4MjgtMHgyQiAqLworCTB4OEQsIDB4OUUsIDB4RDUsIDB4QjgsIDB4RTEsIDB4QzQsIDB4OEQsIDB4OUYsIC8qIDB4MkMtMHgyRiAqLworCTB4OEQsIDB4QTAsIDB4OEQsIDB4QTEsIDB4OEQsIDB4QTIsIDB4OEQsIDB4QTMsIC8qIDB4MzAtMHgzMyAqLworCTB4RTEsIDB4Q0IsIDB4OEQsIDB4QTQsIDB4OEQsIDB4QTUsIDB4OEQsIDB4QTYsIC8qIDB4MzQtMHgzNyAqLworCTB4OEQsIDB4QTcsIDB4OEQsIDB4QTgsIDB4OEQsIDB4QTksIDB4OEQsIDB4QUEsIC8qIDB4MzgtMHgzQiAqLworCTB4OEQsIDB4QUIsIDB4RTEsIDB4Q0MsIDB4RTEsIDB4Q0EsIDB4OEQsIDB4QUMsIC8qIDB4M0MtMHgzRiAqLworCTB4OEQsIDB4QUQsIDB4OEQsIDB4QUUsIDB4OEQsIDB4QUYsIDB4OEQsIDB4QjAsIC8qIDB4NDAtMHg0MyAqLworCTB4OEQsIDB4QjEsIDB4OEQsIDB4QjIsIDB4OEQsIDB4QjMsIDB4RUYsIDB4RkEsIC8qIDB4NDQtMHg0NyAqLworCTB4OEQsIDB4QjQsIDB4OEQsIDB4QjUsIDB4RTEsIDB4RDMsIDB4RTEsIDB4RDIsIC8qIDB4NDgtMHg0QiAqLworCTB4QzcsIDB4QjYsIDB4OEQsIDB4QjYsIDB4OEQsIDB4QjcsIDB4OEQsIDB4QjgsIC8qIDB4NEMtMHg0RiAqLworCTB4OEQsIDB4QjksIDB4OEQsIDB4QkEsIDB4OEQsIDB4QkIsIDB4OEQsIDB4QkMsIC8qIDB4NTAtMHg1MyAqLworCTB4OEQsIDB4QkQsIDB4OEQsIDB4QkUsIDB4OEQsIDB4QkYsIDB4OEQsIDB4QzAsIC8qIDB4NTQtMHg1NyAqLworCTB4RTEsIDB4QzksIDB4OEQsIDB4QzEsIDB4OEQsIDB4QzIsIDB4RTEsIDB4Q0UsIC8qIDB4NTgtMHg1QiAqLworCTB4OEQsIDB4QzMsIDB4RTEsIDB4RDAsIDB4OEQsIDB4QzQsIDB4OEQsIDB4QzUsIC8qIDB4NUMtMHg1RiAqLworCTB4OEQsIDB4QzYsIDB4OEQsIDB4QzcsIDB4OEQsIDB4QzgsIDB4OEQsIDB4QzksIC8qIDB4NjAtMHg2MyAqLworCTB4OEQsIDB4Q0EsIDB4OEQsIDB4Q0IsIDB4OEQsIDB4Q0MsIDB4OEQsIDB4Q0QsIC8qIDB4NjQtMHg2NyAqLworCTB4OEQsIDB4Q0UsIDB4RTEsIDB4RDQsIDB4OEQsIDB4Q0YsIDB4RTEsIDB4RDEsIC8qIDB4NjgtMHg2QiAqLworCTB4RTEsIDB4Q0QsIDB4OEQsIDB4RDAsIDB4OEQsIDB4RDEsIDB4RTEsIDB4Q0YsIC8qIDB4NkMtMHg2RiAqLworCTB4OEQsIDB4RDIsIDB4OEQsIDB4RDMsIDB4OEQsIDB4RDQsIDB4OEQsIDB4RDUsIC8qIDB4NzAtMHg3MyAqLworCTB4RTEsIDB4RDUsIDB4OEQsIDB4RDYsIDB4OEQsIDB4RDcsIDB4OEQsIDB4RDgsIC8qIDB4NzQtMHg3NyAqLworCTB4OEQsIDB4RDksIDB4OEQsIDB4REEsIDB4OEQsIDB4REIsIDB4OEQsIDB4REMsIC8qIDB4NzgtMHg3QiAqLworCTB4OEQsIDB4REQsIDB4OEQsIDB4REUsIDB4OEQsIDB4REYsIDB4OEQsIDB4RTAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OEQsIDB4RTEsIDB4OEQsIDB4RTIsIDB4RTEsIDB4RDYsIDB4OEQsIDB4RTMsIC8qIDB4ODAtMHg4MyAqLworCTB4OEQsIDB4RTQsIDB4OEQsIDB4RTUsIDB4OEQsIDB4RTYsIDB4OEQsIDB4RTcsIC8qIDB4ODQtMHg4NyAqLworCTB4OEQsIDB4RTgsIDB4OEQsIDB4RTksIDB4OEQsIDB4RUEsIDB4OEQsIDB4RUIsIC8qIDB4ODgtMHg4QiAqLworCTB4OEQsIDB4RUMsIDB4OEQsIDB4RUQsIDB4OEQsIDB4RUUsIDB4OEQsIDB4RUYsIC8qIDB4OEMtMHg4RiAqLworCTB4OEQsIDB4RjAsIDB4OEQsIDB4RjEsIDB4OEQsIDB4RjIsIDB4OEQsIDB4RjMsIC8qIDB4OTAtMHg5MyAqLworCTB4OEQsIDB4RjQsIDB4OEQsIDB4RjUsIDB4OEQsIDB4RjYsIDB4OEQsIDB4RjcsIC8qIDB4OTQtMHg5NyAqLworCTB4OEQsIDB4RjgsIDB4RTEsIDB4RDcsIDB4OEQsIDB4RjksIDB4OEQsIDB4RkEsIC8qIDB4OTgtMHg5QiAqLworCTB4OEQsIDB4RkIsIDB4RTEsIDB4RDgsIDB4OEQsIDB4RkMsIDB4OEQsIDB4RkQsIC8qIDB4OUMtMHg5RiAqLworCTB4OEQsIDB4RkUsIDB4OEUsIDB4NDAsIDB4OEUsIDB4NDEsIDB4OEUsIDB4NDIsIC8qIDB4QTAtMHhBMyAqLworCTB4OEUsIDB4NDMsIDB4OEUsIDB4NDQsIDB4OEUsIDB4NDUsIDB4OEUsIDB4NDYsIC8qIDB4QTQtMHhBNyAqLworCTB4OEUsIDB4NDcsIDB4OEUsIDB4NDgsIDB4OEUsIDB4NDksIDB4OEUsIDB4NEEsIC8qIDB4QTgtMHhBQiAqLworCTB4OEUsIDB4NEIsIDB4OEUsIDB4NEMsIDB4OEUsIDB4NEQsIDB4OEUsIDB4NEUsIC8qIDB4QUMtMHhBRiAqLworCTB4OEUsIDB4NEYsIDB4OEUsIDB4NTAsIDB4OEUsIDB4NTEsIDB4OEUsIDB4NTIsIC8qIDB4QjAtMHhCMyAqLworCTB4OEUsIDB4NTMsIDB4OEUsIDB4NTQsIDB4OEUsIDB4NTUsIDB4RTEsIDB4REEsIC8qIDB4QjQtMHhCNyAqLworCTB4OEUsIDB4NTYsIDB4OEUsIDB4NTcsIDB4OEUsIDB4NTgsIDB4OEUsIDB4NTksIC8qIDB4QjgtMHhCQiAqLworCTB4OEUsIDB4NUEsIDB4OEUsIDB4NUIsIDB4OEUsIDB4NUMsIDB4OEUsIDB4NUQsIC8qIDB4QkMtMHhCRiAqLworCTB4OEUsIDB4NUUsIDB4OEUsIDB4NUYsIDB4OEUsIDB4NjAsIDB4OEUsIDB4NjEsIC8qIDB4QzAtMHhDMyAqLworCTB4OEUsIDB4NjIsIDB4RTEsIDB4REIsIDB4OEUsIDB4NjMsIDB4OEUsIDB4NjQsIC8qIDB4QzQtMHhDNyAqLworCTB4OEUsIDB4NjUsIDB4OEUsIDB4NjYsIDB4OEUsIDB4NjcsIDB4OEUsIDB4NjgsIC8qIDB4QzgtMHhDQiAqLworCTB4OEUsIDB4NjksIDB4Q0UsIDB4QTEsIDB4OEUsIDB4NkEsIDB4OEUsIDB4NkIsIC8qIDB4Q0MtMHhDRiAqLworCTB4OEUsIDB4NkMsIDB4OEUsIDB4NkQsIDB4OEUsIDB4NkUsIDB4OEUsIDB4NkYsIC8qIDB4RDAtMHhEMyAqLworCTB4OEUsIDB4NzAsIDB4OEUsIDB4NzEsIDB4OEUsIDB4NzIsIDB4OEUsIDB4NzMsIC8qIDB4RDQtMHhENyAqLworCTB4OEUsIDB4NzQsIDB4OEUsIDB4NzUsIDB4OEUsIDB4NzYsIDB4RTcsIDB4REQsIC8qIDB4RDgtMHhEQiAqLworCTB4OEUsIDB4NzcsIDB4QjQsIDB4QTgsIDB4RDYsIDB4REQsIDB4OEUsIDB4NzgsIC8qIDB4REMtMHhERiAqLworCTB4OEUsIDB4NzksIDB4RDEsIDB4QjIsIDB4QjMsIDB4QjIsIDB4OEUsIDB4N0EsIC8qIDB4RTAtMHhFMyAqLworCTB4OEUsIDB4N0IsIDB4QjksIDB4QTQsIDB4RDcsIDB4RjMsIDB4QzcsIDB4QzksIC8qIDB4RTQtMHhFNyAqLworCTB4QkUsIDB4REUsIDB4QjksIDB4QUUsIDB4OEUsIDB4N0MsIDB4Q0UsIDB4RDcsIC8qIDB4RTgtMHhFQiAqLworCTB4OEUsIDB4N0QsIDB4OEUsIDB4N0UsIDB4QjIsIDB4RUUsIDB4REIsIDB4Q0YsIC8qIDB4RUMtMHhFRiAqLworCTB4OEUsIDB4ODAsIDB4QkMsIDB4QkEsIDB4RDIsIDB4RDEsIDB4Q0IsIDB4QzgsIC8qIDB4RjAtMHhGMyAqLworCTB4QjAsIDB4Q0QsIDB4OEUsIDB4ODEsIDB4OEUsIDB4ODIsIDB4Q0YsIDB4RUYsIC8qIDB4RjQtMHhGNyAqLworCTB4OEUsIDB4ODMsIDB4OEUsIDB4ODQsIDB4OEUsIDB4ODUsIDB4OEUsIDB4ODYsIC8qIDB4RjgtMHhGQiAqLworCTB4OEUsIDB4ODcsIDB4RDksIDB4RTMsIDB4QkQsIDB4RUQsIDB4OEUsIDB4ODgsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzVFWzUxMl0gPSB7CisJMHg4RSwgMHg4OSwgMHhCMSwgMHhEMiwgMHhDQSwgMHhEMCwgMHhCMiwgMHhCQywgLyogMHgwMC0weDAzICovCisJMHg4RSwgMHg4QSwgMHhDQiwgMHhBNywgMHhCNywgMHhBQiwgMHg4RSwgMHg4QiwgLyogMHgwNC0weDA3ICovCisJMHhDQSwgMHhBNiwgMHg4RSwgMHg4QywgMHg4RSwgMHg4RCwgMHg4RSwgMHg4RSwgLyogMHgwOC0weDBCICovCisJMHhDRiwgMHhBMywgMHg4RSwgMHg4RiwgMHg4RSwgMHg5MCwgMHhFMCwgMHhGOCwgLyogMHgwQy0weDBGICovCisJMHhENSwgMHhDQSwgMHhFMCwgMHhGQiwgMHg4RSwgMHg5MSwgMHg4RSwgMHg5MiwgLyogMHgxMC0weDEzICovCisJMHhFMCwgMHhGQSwgMHhDNSwgMHhDMSwgMHhDQywgMHhGQiwgMHg4RSwgMHg5MywgLyogMHgxNC0weDE3ICovCisJMHhDMSwgMHhCMSwgMHhFMCwgMHhGOSwgMHhENiwgMHhFMywgMHhCMiwgMHhBRiwgLyogMHgxOC0weDFCICovCisJMHhENiwgMHhDNCwgMHhCNSwgMHhEQiwgMHg4RSwgMHg5NCwgMHg4RSwgMHg5NSwgLyogMHgxQy0weDFGICovCisJMHg4RSwgMHg5NiwgMHg4RSwgMHg5NywgMHg4RSwgMHg5OCwgMHg4RSwgMHg5OSwgLyogMHgyMC0weDIzICovCisJMHg4RSwgMHg5QSwgMHg4RSwgMHg5QiwgMHhCNCwgMHhGOCwgMHhENiwgMHhBMSwgLyogMHgyNC0weDI3ICovCisJMHg4RSwgMHg5QywgMHg4RSwgMHg5RCwgMHg4RSwgMHg5RSwgMHg4RSwgMHg5RiwgLyogMHgyOC0weDJCICovCisJMHg4RSwgMHhBMCwgMHhDRiwgMHhBRiwgMHhCMCwgMHhFRiwgMHg4RSwgMHhBMSwgLyogMHgyQy0weDJGICovCisJMHg4RSwgMHhBMiwgMHhFMCwgMHhGQywgMHg4RSwgMHhBMywgMHg4RSwgMHhBNCwgLyogMHgzMC0weDMzICovCisJMHg4RSwgMHhBNSwgMHg4RSwgMHhBNiwgMHg4RSwgMHhBNywgMHhFMSwgMHhBMSwgLyogMHgzNC0weDM3ICovCisJMHhCMywgMHhBMywgMHg4RSwgMHhBOCwgMHg4RSwgMHhBOSwgMHhFMCwgMHhGRCwgLyogMHgzOC0weDNCICovCisJMHhFMCwgMHhGRSwgMHhDMywgMHhCMSwgMHg4RSwgMHhBQSwgMHg4RSwgMHhBQiwgLyogMHgzQy0weDNGICovCisJMHg4RSwgMHhBQywgMHg4RSwgMHhBRCwgMHhDMywgMHhERCwgMHg4RSwgMHhBRSwgLyogMHg0MC0weDQzICovCisJMHhFMSwgMHhBMiwgMHhCNywgMHhGOSwgMHg4RSwgMHhBRiwgMHg4RSwgMHhCMCwgLyogMHg0NC0weDQ3ICovCisJMHg4RSwgMHhCMSwgMHg4RSwgMHhCMiwgMHg4RSwgMHhCMywgMHg4RSwgMHhCNCwgLyogMHg0OC0weDRCICovCisJMHhCQiwgMHhDRiwgMHg4RSwgMHhCNSwgMHg4RSwgMHhCNiwgMHg4RSwgMHhCNywgLyogMHg0Qy0weDRGICovCisJMHg4RSwgMHhCOCwgMHg4RSwgMHhCOSwgMHg4RSwgMHhCQSwgMHg4RSwgMHhCQiwgLyogMHg1MC0weDUzICovCisJMHhFMSwgMHhBMywgMHhDNCwgMHhCQiwgMHg4RSwgMHhCQywgMHg4RSwgMHhCRCwgLyogMHg1NC0weDU3ICovCisJMHg4RSwgMHhCRSwgMHg4RSwgMHhCRiwgMHg4RSwgMHhDMCwgMHhFMSwgMHhBNCwgLyogMHg1OC0weDVCICovCisJMHg4RSwgMHhDMSwgMHg4RSwgMHhDMiwgMHhFMSwgMHhBNSwgMHg4RSwgMHhDMywgLyogMHg1Qy0weDVGICovCisJMHg4RSwgMHhDNCwgMHhFMSwgMHhBNiwgMHhCNCwgMHhCMSwgMHg4RSwgMHhDNSwgLyogMHg2MC0weDYzICovCisJMHg4RSwgMHhDNiwgMHg4RSwgMHhDNywgMHg4RSwgMHhDOCwgMHg4RSwgMHhDOSwgLyogMHg2NC0weDY3ICovCisJMHg4RSwgMHhDQSwgMHg4RSwgMHhDQiwgMHg4RSwgMHhDQywgMHg4RSwgMHhDRCwgLyogMHg2OC0weDZCICovCisJMHg4RSwgMHhDRSwgMHg4RSwgMHhDRiwgMHg4RSwgMHhEMCwgMHg4RSwgMHhEMSwgLyogMHg2Qy0weDZGICovCisJMHg4RSwgMHhEMiwgMHg4RSwgMHhEMywgMHhCOCwgMHhDOSwgMHhDNiwgMHhCRCwgLyogMHg3MC0weDczICovCisJMHhDNCwgMHhFQSwgMHg4RSwgMHhENCwgMHhCMiwgMHhBMiwgMHg4RSwgMHhENSwgLyogMHg3NC0weDc3ICovCisJMHhEMCwgMHhEMiwgMHg4RSwgMHhENiwgMHhFNywgMHhEQiwgMHhCQiwgMHhDMywgLyogMHg3OC0weDdCICovCisJMHhEMywgMHhENywgMHhEMywgMHhDNCwgMHg4RSwgMHhENywgMHhCOSwgMHhFMywgLyogMHg3Qy0weDdGICovCisJCisJMHhFMiwgMHhDRiwgMHg4RSwgMHhEOCwgMHg4RSwgMHhEOSwgMHg4RSwgMHhEQSwgLyogMHg4MC0weDgzICovCisJMHhENywgMHhBRiwgMHg4RSwgMHhEQiwgMHhDNywgMHhFQywgMHhCMSwgMHhEMywgLyogMHg4NC0weDg3ICovCisJMHg4RSwgMHhEQywgMHg4RSwgMHhERCwgMHhCNCwgMHhCMiwgMHhFMiwgMHhEMSwgLyogMHg4OC0weDhCICovCisJMHg4RSwgMHhERSwgMHg4RSwgMHhERiwgMHg4RSwgMHhFMCwgMHhEMCwgMHhGMiwgLyogMHg4Qy0weDhGICovCisJMHhDMiwgMHhBRSwgMHhFMiwgMHhEMCwgMHg4RSwgMHhFMSwgMHhCRiwgMHhFMiwgLyogMHg5MC0weDkzICovCisJMHhEMywgMHhBNiwgMHhCNSwgMHhENywgMHhFMiwgMHhEMiwgMHhCNSwgMHhFQSwgLyogMHg5NC0weDk3ICovCisJMHg4RSwgMHhFMiwgMHhDMywgMHhFRCwgMHhCOCwgMHhGRCwgMHg4RSwgMHhFMywgLyogMHg5OC0weDlCICovCisJMHhCOCwgMHhBRSwgMHg4RSwgMHhFNCwgMHhDNSwgMHhEMywgMHhCNywgMHhDRiwgLyogMHg5Qy0weDlGICovCisJMHhFMiwgMHhENCwgMHg4RSwgMHhFNSwgMHg4RSwgMHhFNiwgMHg4RSwgMHhFNywgLyogMHhBMC0weEEzICovCisJMHg4RSwgMHhFOCwgMHhFMiwgMHhEMywgMHhCNiwgMHhDOCwgMHhENywgMHhGOSwgLyogMHhBNC0weEE3ICovCisJMHg4RSwgMHhFOSwgMHg4RSwgMHhFQSwgMHg4RSwgMHhFQiwgMHg4RSwgMHhFQywgLyogMHhBOC0weEFCICovCisJMHg4RSwgMHhFRCwgMHhDRCwgMHhBNSwgMHg4RSwgMHhFRSwgMHg4RSwgMHhFRiwgLyogMHhBQy0weEFGICovCisJMHg4RSwgMHhGMCwgMHg4RSwgMHhGMSwgMHg4RSwgMHhGMiwgMHhFMiwgMHhEOCwgLyogMHhCMC0weEIzICovCisJMHg4RSwgMHhGMywgMHhFMiwgMHhENiwgMHhDQSwgMHhGQywgMHhCRiwgMHhCNSwgLyogMHhCNC0weEI3ICovCisJMHhEMywgMHhCOSwgMHhFMiwgMHhENSwgMHg4RSwgMHhGNCwgMHg4RSwgMHhGNSwgLyogMHhCOC0weEJCICovCisJMHg4RSwgMHhGNiwgMHg4RSwgMHhGNywgMHhFMiwgMHhENywgMHg4RSwgMHhGOCwgLyogMHhCQy0weEJGICovCisJMHg4RSwgMHhGOSwgMHg4RSwgMHhGQSwgMHg4RSwgMHhGQiwgMHg4RSwgMHhGQywgLyogMHhDMC0weEMzICovCisJMHg4RSwgMHhGRCwgMHg4RSwgMHhGRSwgMHg4RiwgMHg0MCwgMHg4RiwgMHg0MSwgLyogMHhDNC0weEM3ICovCisJMHg4RiwgMHg0MiwgMHhDMSwgMHhBRSwgMHhDMCwgMHhDOCwgMHg4RiwgMHg0MywgLyogMHhDOC0weENCICovCisJMHg4RiwgMHg0NCwgMHg4RiwgMHg0NSwgMHg4RiwgMHg0NiwgMHg4RiwgMHg0NywgLyogMHhDQy0weENGICovCisJMHg4RiwgMHg0OCwgMHhFMiwgMHhEQiwgMHhFMiwgMHhEQSwgMHhDMCwgMHhBQSwgLyogMHhEMC0weEQzICovCisJMHg4RiwgMHg0OSwgMHg4RiwgMHg0QSwgMHhDMSwgMHhDRSwgMHg4RiwgMHg0QiwgLyogMHhENC0weEQ3ICovCisJMHg4RiwgMHg0QywgMHg4RiwgMHg0RCwgMHg4RiwgMHg0RSwgMHhFMiwgMHhEQywgLyogMHhEOC0weERCICovCisJMHg4RiwgMHg0RiwgMHg4RiwgMHg1MCwgMHg4RiwgMHg1MSwgMHg4RiwgMHg1MiwgLyogMHhEQy0weERGICovCisJMHg4RiwgMHg1MywgMHg4RiwgMHg1NCwgMHg4RiwgMHg1NSwgMHg4RiwgMHg1NiwgLyogMHhFMC0weEUzICovCisJMHg4RiwgMHg1NywgMHg4RiwgMHg1OCwgMHg4RiwgMHg1OSwgMHg4RiwgMHg1QSwgLyogMHhFNC0weEU3ICovCisJMHhFMiwgMHhERCwgMHg4RiwgMHg1QiwgMHhFMiwgMHhERSwgMHg4RiwgMHg1QywgLyogMHhFOC0weEVCICovCisJMHg4RiwgMHg1RCwgMHg4RiwgMHg1RSwgMHg4RiwgMHg1RiwgMHg4RiwgMHg2MCwgLyogMHhFQy0weEVGICovCisJMHg4RiwgMHg2MSwgMHg4RiwgMHg2MiwgMHg4RiwgMHg2MywgMHg4RiwgMHg2NCwgLyogMHhGMC0weEYzICovCisJMHhEQiwgMHhDOCwgMHg4RiwgMHg2NSwgMHhEMSwgMHhEMywgMHhDRCwgMHhBMiwgLyogMHhGNC0weEY3ICovCisJMHg4RiwgMHg2NiwgMHg4RiwgMHg2NywgMHhCRCwgMHhBOCwgMHg4RiwgMHg2OCwgLyogMHhGOC0weEZCICovCisJMHg4RiwgMHg2OSwgMHg4RiwgMHg2QSwgMHhERSwgMHhDMywgMHhEOCwgMHhBNSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNUZbNTEyXSA9IHsKKwkweEJGLCAweEFBLCAweERCLCAweENELCAweEQyLCAweEVDLCAweEM2LCAweEZBLCAvKiAweDAwLTB4MDMgKi8KKwkweEM1LCAweEFBLCAweDhGLCAweDZCLCAweDhGLCAweDZDLCAweDhGLCAweDZELCAvKiAweDA0LTB4MDcgKi8KKwkweERFLCAweEM0LCAweDhGLCAweDZFLCAweEIxLCAweEQ3LCAweERGLCAweEFFLCAvKiAweDA4LTB4MEIgKi8KKwkweDhGLCAweDZGLCAweDhGLCAweDcwLCAweDhGLCAweDcxLCAweENBLCAweEJELCAvKiAweDBDLTB4MEYgKi8KKwkweDhGLCAweDcyLCAweERGLCAweEIxLCAweDhGLCAweDczLCAweEI5LCAweEFELCAvKiAweDEwLTB4MTMgKi8KKwkweDhGLCAweDc0LCAweEQyLCAweEZELCAweDhGLCAweDc1LCAweEI4LCAweEE1LCAvKiAweDE0LTB4MTcgKi8KKwkweEJBLCAweEVCLCAweDhGLCAweDc2LCAweDhGLCAweDc3LCAweEIzLCAweERBLCAvKiAweDE4LTB4MUIgKi8KKwkweDhGLCAweDc4LCAweDhGLCAweDc5LCAweDhGLCAweDdBLCAweEI1LCAweERDLCAvKiAweDFDLTB4MUYgKi8KKwkweEQ1LCAweEM1LCAweDhGLCAweDdCLCAweDhGLCAweDdDLCAweDhGLCAweDdELCAvKiAweDIwLTB4MjMgKi8KKwkweDhGLCAweDdFLCAweEMzLCAweEQ2LCAweENGLCAweEQyLCAweEJCLCAweEExLCAvKiAweDI0LTB4MjcgKi8KKwkweDhGLCAweDgwLCAweEU1LCAweEYzLCAweEU1LCAweEYyLCAweDhGLCAweDgxLCAvKiAweDI4LTB4MkIgKi8KKwkweDhGLCAweDgyLCAweEU1LCAweEY0LCAweDhGLCAweDgzLCAweENELCAweEU0LCAvKiAweDJDLTB4MkYgKi8KKwkweDhGLCAweDg0LCAweEM4LCAweEY1LCAweDhGLCAweDg1LCAweDhGLCAweDg2LCAvKiAweDMwLTB4MzMgKi8KKwkweDhGLCAweDg3LCAweDhGLCAweDg4LCAweDhGLCAweDg5LCAweDhGLCAweDhBLCAvKiAweDM0LTB4MzcgKi8KKwkweDhGLCAweDhCLCAweEI1LCAweEFGLCAweEM3LCAweEJGLCAweDhGLCAweDhDLCAvKiAweDM4LTB4M0IgKi8KKwkweEU1LCAweEY2LCAweDhGLCAweDhELCAweDhGLCAweDhFLCAweDhGLCAweDhGLCAvKiAweDNDLTB4M0YgKi8KKwkweEVDLCAweEIwLCAweDhGLCAweDkwLCAweDhGLCAweDkxLCAweDhGLCAweDkyLCAvKiAweDQwLTB4NDMgKi8KKwkweDhGLCAweDkzLCAweDhGLCAweDk0LCAweDhGLCAweDk1LCAweDhGLCAweDk2LCAvKiAweDQ0LTB4NDcgKi8KKwkweDhGLCAweDk3LCAweDhGLCAweDk4LCAweDhGLCAweDk5LCAweDhGLCAweDlBLCAvKiAweDQ4LTB4NEIgKi8KKwkweDhGLCAweDlCLCAweDhGLCAweDlDLCAweDhGLCAweDlELCAweDhGLCAweDlFLCAvKiAweDRDLTB4NEYgKi8KKwkweEU1LCAweEU2LCAweDhGLCAweDlGLCAweEI5LCAweEU5LCAweEI1LCAweEIxLCAvKiAweDUwLTB4NTMgKi8KKwkweDhGLCAweEEwLCAweEMyLCAweEJDLCAweEU1LCAweEU4LCAweEU1LCAweEU3LCAvKiAweDU0LTB4NTcgKi8KKwkweEU1LCAweEU5LCAweDhGLCAweEExLCAweDhGLCAweEEyLCAweDhGLCAweEEzLCAvKiAweDU4LTB4NUIgKi8KKwkweDhGLCAweEE0LCAweEQyLCAweENELCAweDhGLCAweEE1LCAweDhGLCAweEE2LCAvKiAweDVDLTB4NUYgKi8KKwkweDhGLCAweEE3LCAweEUxLCAweEVBLCAweEQwLCAweENFLCAweDhGLCAweEE4LCAvKiAweDYwLTB4NjMgKi8KKwkweENELCAweEFFLCAweDhGLCAweEE5LCAweEQxLCAweEU1LCAweDhGLCAweEFBLCAvKiAweDY0LTB4NjcgKi8KKwkweDhGLCAweEFCLCAweEIyLCAweENBLCAweEIxLCAweEVCLCAweDhGLCAweEFDLCAvKiAweDY4LTB4NkIgKi8KKwkweEIxLCAweEYyLCAweEM1LCAweEVELCAweDhGLCAweEFELCAweDhGLCAweEFFLCAvKiAweDZDLTB4NkYgKi8KKwkweEQ1LCAweEMzLCAweEQzLCAweEIwLCAweDhGLCAweEFGLCAweEUxLCAweERDLCAvKiAweDcwLTB4NzMgKi8KKwkweDhGLCAweEIwLCAweDhGLCAweEIxLCAweDhGLCAweEIyLCAweEUxLCAweERELCAvKiAweDc0LTB4NzcgKi8KKwkweDhGLCAweEIzLCAweEQyLCAweERCLCAweDhGLCAweEI0LCAweEIzLCAweEI5LCAvKiAweDc4LTB4N0IgKi8KKwkweEIxLCAweENCLCAweDhGLCAweEI1LCAweDhGLCAweEI2LCAweDhGLCAweEI3LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweENELCAweEY5LCAweEQ1LCAweEY3LCAweEUxLCAweERFLCAweDhGLCAweEI4LCAvKiAweDgwLTB4ODMgKi8KKwkweEJFLCAweEI2LCAweEI0LCAweEZELCAweDhGLCAweEI5LCAweEUxLCAweERGLCAvKiAweDg0LTB4ODcgKi8KKwkweEJBLCAweERDLCAweEUxLCAweEUwLCAweEJCLCAweEIyLCAweEMyLCAweEM5LCAvKiAweDg4LTB4OEIgKi8KKwkweEUxLCAweEUxLCAweDhGLCAweEJBLCAweDhGLCAweEJCLCAweDhGLCAweEJDLCAvKiAweDhDLTB4OEYgKi8KKwkweEQwLCAweEVDLCAweDhGLCAweEJELCAweENELCAweEJELCAweDhGLCAweEJFLCAvKiAweDkwLTB4OTMgKi8KKwkweDhGLCAweEJGLCAweEUxLCAweEUyLCAweDhGLCAweEMwLCAweEI1LCAweEMzLCAvKiAweDk0LTB4OTcgKi8KKwkweEM1LCAweEM3LCAweEUxLCAweEUzLCAweDhGLCAweEMxLCAweDhGLCAweEMyLCAvKiAweDk4LTB4OUIgKi8KKwkweEUxLCAweEU0LCAweDhGLCAweEMzLCAweDhGLCAweEM0LCAweDhGLCAweEM1LCAvKiAweDlDLTB4OUYgKi8KKwkweDhGLCAweEM2LCAweEQzLCAweEY5LCAweDhGLCAweEM3LCAweDhGLCAweEM4LCAvKiAweEEwLTB4QTMgKi8KKwkweDhGLCAweEM5LCAweDhGLCAweENBLCAweDhGLCAweENCLCAweDhGLCAweENDLCAvKiAweEE0LTB4QTcgKi8KKwkweEUxLCAweEU1LCAweDhGLCAweENELCAweEQxLCAweEFELCAweDhGLCAweENFLCAvKiAweEE4LTB4QUIgKi8KKwkweDhGLCAweENGLCAweEUxLCAweEU2LCAweENFLCAweEEyLCAweDhGLCAweEQwLCAvKiAweEFDLTB4QUYgKi8KKwkweDhGLCAweEQxLCAweDhGLCAweEQyLCAweDhGLCAweEQzLCAweDhGLCAweEQ0LCAvKiAweEIwLTB4QjMgKi8KKwkweDhGLCAweEQ1LCAweEUxLCAweEU3LCAweDhGLCAweEQ2LCAweEI1LCAweEMyLCAvKiAweEI0LTB4QjcgKi8KKwkweDhGLCAweEQ3LCAweDhGLCAweEQ4LCAweDhGLCAweEQ5LCAweDhGLCAweERBLCAvKiAweEI4LTB4QkIgKi8KKwkweEUxLCAweEU4LCAweEJCLCAweEQ1LCAweDhGLCAweERCLCAweDhGLCAweERDLCAvKiAweEJDLTB4QkYgKi8KKwkweDhGLCAweERELCAweDhGLCAweERFLCAweDhGLCAweERGLCAweEQwLCAweEM0LCAvKiAweEMwLTB4QzMgKi8KKwkweEUyLCAweEUwLCAweEIxLCAweEQ4LCAweEQyLCAweEU0LCAweDhGLCAweEUwLCAvKiAweEM0LTB4QzcgKi8KKwkweDhGLCAweEUxLCAweEUyLCAweEUxLCAweDhGLCAweEUyLCAweDhGLCAweEUzLCAvKiAweEM4LTB4Q0IgKi8KKwkweEJDLCAweEM5LCAweEM4LCAweENDLCAweDhGLCAweEU0LCAweEUyLCAweEUzLCAvKiAweENDLTB4Q0YgKi8KKwkweEVDLCAweEZFLCAweEVDLCAweEZELCAweERGLCAweEFGLCAweDhGLCAweEU1LCAvKiAweEQwLTB4RDMgKi8KKwkweDhGLCAweEU2LCAweDhGLCAweEU3LCAweEUyLCAweEUyLCAweEQ2LCAweEJFLCAvKiAweEQ0LTB4RDcgKi8KKwkweENELCAweEZDLCAweEMzLCAweEE2LCAweDhGLCAweEU4LCAweDhGLCAweEU5LCAvKiAweEQ4LTB4REIgKi8KKwkweDhGLCAweEVBLCAweEUzLCAweEMzLCAweDhGLCAweEVCLCAweDhGLCAweEVDLCAvKiAweERDLTB4REYgKi8KKwkweEQ2LCAweEQyLCAweEUyLCAweEU3LCAweDhGLCAweEVELCAweDhGLCAweEVFLCAvKiAweEUwLTB4RTMgKi8KKwkweEUyLCAweEU4LCAweDhGLCAweEVGLCAweDhGLCAweEYwLCAweEQzLCAweEM3LCAvKiAweEU0LTB4RTcgKi8KKwkweDhGLCAweEYxLCAweDhGLCAweEYyLCAweEUyLCAweEVDLCAweEJGLCAweEVDLCAvKiAweEU4LTB4RUIgKi8KKwkweDhGLCAweEYzLCAweEUyLCAweEVELCAweEUyLCAweEU1LCAweDhGLCAweEY0LCAvKiAweEVDLTB4RUYgKi8KKwkweDhGLCAweEY1LCAweEIzLCAweEMwLCAweDhGLCAweEY2LCAweDhGLCAweEY3LCAvKiAweEYwLTB4RjMgKi8KKwkweDhGLCAweEY4LCAweEM0LCAweEVFLCAweDhGLCAweEY5LCAweDhGLCAweEZBLCAvKiAweEY0LTB4RjcgKi8KKwkweEUyLCAweEVFLCAweDhGLCAweEZCLCAweDhGLCAweEZDLCAweEQwLCAweEMzLCAvKiAweEY4LTB4RkIgKi8KKwkweDhGLCAweEZELCAweEJBLCAweEY2LCAweEUyLCAweEU5LCAweEI3LCAweERFLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182MFs1MTJdID0geworCTB4QkIsIDB4QjMsIDB4Q0MsIDB4QUMsIDB4Q0IsIDB4Q0IsIDB4RTIsIDB4RTQsIC8qIDB4MDAtMHgwMyAqLworCTB4RTIsIDB4RTYsIDB4RTIsIDB4RUEsIDB4RTIsIDB4RUIsIDB4OEYsIDB4RkUsIC8qIDB4MDQtMHgwNyAqLworCTB4OTAsIDB4NDAsIDB4OTAsIDB4NDEsIDB4RTIsIDB4RjcsIDB4OTAsIDB4NDIsIC8qIDB4MDgtMHgwQiAqLworCTB4OTAsIDB4NDMsIDB4RTIsIDB4RjQsIDB4RDQsIDB4RjUsIDB4RTIsIDB4RjMsIC8qIDB4MEMtMHgwRiAqLworCTB4OTAsIDB4NDQsIDB4OTAsIDB4NDUsIDB4QzUsIDB4QUQsIDB4OTAsIDB4NDYsIC8qIDB4MTAtMHgxMyAqLworCTB4RDUsIDB4RkEsIDB4QzUsIDB4QzIsIDB4QjIsIDB4QzAsIDB4OTAsIDB4NDcsIC8qIDB4MTQtMHgxNyAqLworCTB4OTAsIDB4NDgsIDB4RTIsIDB4RUYsIDB4OTAsIDB4NDksIDB4RTIsIDB4RjIsIC8qIDB4MTgtMHgxQiAqLworCTB4QzEsIDB4QUYsIDB4Q0IsIDB4QkMsIDB4OTAsIDB4NEEsIDB4OTAsIDB4NEIsIC8qIDB4MUMtMHgxRiAqLworCTB4QjUsIDB4QTEsIDB4RTIsIDB4RjksIDB4OTAsIDB4NEMsIDB4OTAsIDB4NEQsIC8qIDB4MjAtMHgyMyAqLworCTB4OTAsIDB4NEUsIDB4QkMsIDB4QjEsIDB4RTIsIDB4RjEsIDB4RDAsIDB4RDQsIC8qIDB4MjQtMHgyNyAqLworCTB4RDQsIDB4QjksIDB4RTIsIDB4RjUsIDB4QjksIDB4RDYsIDB4RTIsIDB4RjYsIC8qIDB4MjgtMHgyQiAqLworCTB4OTAsIDB4NEYsIDB4OTAsIDB4NTAsIDB4OTAsIDB4NTEsIDB4QzcsIDB4RDMsIC8qIDB4MkMtMHgyRiAqLworCTB4OTAsIDB4NTIsIDB4OTAsIDB4NTMsIDB4OTAsIDB4NTQsIDB4OTAsIDB4NTUsIC8qIDB4MzAtMHgzMyAqLworCTB4OTAsIDB4NTYsIDB4RTIsIDB4RjAsIDB4OTAsIDB4NTcsIDB4OTAsIDB4NTgsIC8qIDB4MzQtMHgzNyAqLworCTB4OTAsIDB4NTksIDB4OTAsIDB4NUEsIDB4OTAsIDB4NUIsIDB4RDcsIDB4REMsIC8qIDB4MzgtMHgzQiAqLworCTB4RUQsIDB4QTEsIDB4OTAsIDB4NUMsIDB4OTAsIDB4NUQsIDB4RTIsIDB4RjgsIC8qIDB4M0MtMHgzRiAqLworCTB4OTAsIDB4NUUsIDB4RUQsIDB4QTUsIDB4RTIsIDB4RkUsIDB4Q0EsIDB4RDEsIC8qIDB4NDAtMHg0MyAqLworCTB4OTAsIDB4NUYsIDB4OTAsIDB4NjAsIDB4OTAsIDB4NjEsIDB4OTAsIDB4NjIsIC8qIDB4NDQtMHg0NyAqLworCTB4OTAsIDB4NjMsIDB4OTAsIDB4NjQsIDB4OTAsIDB4NjUsIDB4QzEsIDB4QjUsIC8qIDB4NDgtMHg0QiAqLworCTB4OTAsIDB4NjYsIDB4QkIsIDB4RDAsIDB4OTAsIDB4NjcsIDB4OTAsIDB4NjgsIC8qIDB4NEMtMHg0RiAqLworCTB4QkYsIDB4RDYsIDB4OTAsIDB4NjksIDB4QkEsIDB4RTMsIDB4OTAsIDB4NkEsIC8qIDB4NTAtMHg1MyAqLworCTB4OTAsIDB4NkIsIDB4Q0IsIDB4QTEsIDB4OTAsIDB4NkMsIDB4OTAsIDB4NkQsIC8qIDB4NTQtMHg1NyAqLworCTB4OTAsIDB4NkUsIDB4RUQsIDB4QTYsIDB4RUQsIDB4QTMsIDB4OTAsIDB4NkYsIC8qIDB4NTgtMHg1QiAqLworCTB4OTAsIDB4NzAsIDB4RUQsIDB4QTIsIDB4OTAsIDB4NzEsIDB4OTAsIDB4NzIsIC8qIDB4NUMtMHg1RiAqLworCTB4OTAsIDB4NzMsIDB4OTAsIDB4NzQsIDB4QkIsIDB4RDYsIDB4RUQsIDB4QTcsIC8qIDB4NjAtMHg2MyAqLworCTB4RDAsIDB4RjQsIDB4OTAsIDB4NzUsIDB4OTAsIDB4NzYsIDB4RUQsIDB4QTQsIC8qIDB4NjQtMHg2NyAqLworCTB4QkEsIDB4REUsIDB4QjYsIDB4RjcsIDB4RTMsIDB4QTEsIDB4QjYsIDB4QjIsIC8qIDB4NjgtMHg2QiAqLworCTB4Q0MsIDB4RjEsIDB4QjksIDB4QTcsIDB4OTAsIDB4NzcsIDB4Q0YsIDB4QTIsIC8qIDB4NkMtMHg2RiAqLworCTB4QzcsIDB4QTEsIDB4OTAsIDB4NzgsIDB4OTAsIDB4NzksIDB4QkYsIDB4RDIsIC8qIDB4NzAtMHg3MyAqLworCTB4OTAsIDB4N0EsIDB4OTAsIDB4N0IsIDB4QjYsIDB4RjEsIDB4OTAsIDB4N0MsIC8qIDB4NzQtMHg3NyAqLworCTB4RTIsIDB4RkEsIDB4RTIsIDB4RkIsIDB4RTIsIDB4RkQsIDB4RTIsIDB4RkMsIC8qIDB4NzgtMHg3QiAqLworCTB4QzQsIDB4RDUsIDB4RTMsIDB4QTIsIDB4OTAsIDB4N0QsIDB4RDMsIDB4QzEsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OTAsIDB4N0UsIDB4OTAsIDB4ODAsIDB4OTAsIDB4ODEsIDB4RTMsIDB4QTcsIC8qIDB4ODAtMHg4MyAqLworCTB4QzcsIDB4QzQsIDB4OTAsIDB4ODIsIDB4OTAsIDB4ODMsIDB4OTAsIDB4ODQsIC8qIDB4ODQtMHg4NyAqLworCTB4OTAsIDB4ODUsIDB4Q0YsIDB4QTQsIDB4OTAsIDB4ODYsIDB4OTAsIDB4ODcsIC8qIDB4ODgtMHg4QiAqLworCTB4RTMsIDB4QTksIDB4QkEsIDB4QjcsIDB4OTAsIDB4ODgsIDB4OTAsIDB4ODksIC8qIDB4OEMtMHg4RiAqLworCTB4OTAsIDB4OEEsIDB4OTAsIDB4OEIsIDB4RTMsIDB4QTgsIDB4OTAsIDB4OEMsIC8qIDB4OTAtMHg5MyAqLworCTB4QkIsIDB4REEsIDB4OTAsIDB4OEQsIDB4RTMsIDB4QTMsIDB4OTAsIDB4OEUsIC8qIDB4OTQtMHg5NyAqLworCTB4OTAsIDB4OEYsIDB4OTAsIDB4OTAsIDB4RTMsIDB4QTQsIDB4RTMsIDB4QUEsIC8qIDB4OTgtMHg5QiAqLworCTB4OTAsIDB4OTEsIDB4RTMsIDB4QTYsIDB4OTAsIDB4OTIsIDB4Q0UsIDB4RjIsIC8qIDB4OUMtMHg5RiAqLworCTB4RDMsIDB4QzYsIDB4OTAsIDB4OTMsIDB4OTAsIDB4OTQsIDB4QkIsIDB4QkMsIC8qIDB4QTAtMHhBMyAqLworCTB4OTAsIDB4OTUsIDB4OTAsIDB4OTYsIDB4RDQsIDB4QzMsIDB4OTAsIDB4OTcsIC8qIDB4QTQtMHhBNyAqLworCTB4QzQsIDB4RkEsIDB4OTAsIDB4OTgsIDB4OTAsIDB4OTksIDB4RUQsIDB4QTgsIC8qIDB4QTgtMHhBQiAqLworCTB4RDAsIDB4RkMsIDB4RTMsIDB4QTUsIDB4OTAsIDB4OUEsIDB4QzMsIDB4RjUsIC8qIDB4QUMtMHhBRiAqLworCTB4OTAsIDB4OUIsIDB4RTMsIDB4QUQsIDB4QjEsIDB4QUYsIDB4OTAsIDB4OUMsIC8qIDB4QjAtMHhCMyAqLworCTB4RTMsIDB4QjIsIDB4OTAsIDB4OUQsIDB4OTAsIDB4OUUsIDB4OTAsIDB4OUYsIC8qIDB4QjQtMHhCNyAqLworCTB4QkMsIDB4QzIsIDB4OTAsIDB4QTAsIDB4OTAsIDB4QTEsIDB4RTMsIDB4QUMsIC8qIDB4QjgtMHhCQiAqLworCTB4QjUsIDB4QkYsIDB4OTAsIDB4QTIsIDB4OTAsIDB4QTMsIDB4OTAsIDB4QTQsIC8qIDB4QkMtMHhCRiAqLworCTB4OTAsIDB4QTUsIDB4OTAsIDB4QTYsIDB4OTAsIDB4QTcsIDB4OTAsIDB4QTgsIC8qIDB4QzAtMHhDMyAqLworCTB4OTAsIDB4QTksIDB4QzcsIDB4RTksIDB4RTMsIDB4QjAsIDB4OTAsIDB4QUEsIC8qIDB4QzQtMHhDNyAqLworCTB4OTAsIDB4QUIsIDB4OTAsIDB4QUMsIDB4QkUsIDB4QUEsIDB4Q0QsIDB4RUYsIC8qIDB4QzgtMHhDQiAqLworCTB4OTAsIDB4QUQsIDB4OTAsIDB4QUUsIDB4OTAsIDB4QUYsIDB4OTAsIDB4QjAsIC8qIDB4Q0MtMHhDRiAqLworCTB4OTAsIDB4QjEsIDB4QkIsIDB4RjMsIDB4OTAsIDB4QjIsIDB4OTAsIDB4QjMsIC8qIDB4RDAtMHhEMyAqLworCTB4OTAsIDB4QjQsIDB4Q0MsIDB4RTgsIDB4OTAsIDB4QjUsIDB4OTAsIDB4QjYsIC8qIDB4RDQtMHhENyAqLworCTB4RTMsIDB4QUYsIDB4OTAsIDB4QjcsIDB4RTMsIDB4QjEsIDB4OTAsIDB4QjgsIC8qIDB4RDgtMHhEQiAqLworCTB4Q0YsIDB4QTcsIDB4RTMsIDB4QUUsIDB4OTAsIDB4QjksIDB4Q0UsIDB4QTksIC8qIDB4REMtMHhERiAqLworCTB4QkIsIDB4REQsIDB4OTAsIDB4QkEsIDB4OTAsIDB4QkIsIDB4OTAsIDB4QkMsIC8qIDB4RTAtMHhFMyAqLworCTB4OTAsIDB4QkQsIDB4OTAsIDB4QkUsIDB4QjUsIDB4RUIsIDB4QkUsIDB4RTUsIC8qIDB4RTQtMHhFNyAqLworCTB4QjIsIDB4RDIsIDB4QjMsIDB4Q0QsIDB4OTAsIDB4QkYsIDB4QjEsIDB4QjksIC8qIDB4RTgtMHhFQiAqLworCTB4RTMsIDB4QUIsIDB4QjIsIDB4RDEsIDB4QjUsIDB4QUMsIDB4QjksIDB4REYsIC8qIDB4RUMtMHhFRiAqLworCTB4QjYsIDB4RTgsIDB4OTAsIDB4QzAsIDB4OTAsIDB4QzEsIDB4Q0YsIDB4RUIsIC8qIDB4RjAtMHhGMyAqLworCTB4RTMsIDB4QjcsIDB4OTAsIDB4QzIsIDB4QkIsIDB4Q0MsIDB4OTAsIDB4QzMsIC8qIDB4RjQtMHhGNyAqLworCTB4OTAsIDB4QzQsIDB4QzgsIDB4QzcsIDB4RDAsIDB4Q0EsIDB4OTAsIDB4QzUsIC8qIDB4RjgtMHhGQiAqLworCTB4OTAsIDB4QzYsIDB4OTAsIDB4QzcsIDB4OTAsIDB4QzgsIDB4OTAsIDB4QzksIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzYxWzUxMl0gPSB7CisJMHhFMywgMHhCOCwgMHhCMywgMHhFRSwgMHg5MCwgMHhDQSwgMHg5MCwgMHhDQiwgLyogMHgwMC0weDAzICovCisJMHg5MCwgMHhDQywgMHg5MCwgMHhDRCwgMHhFRCwgMHhBOSwgMHg5MCwgMHhDRSwgLyogMHgwNC0weDA3ICovCisJMHhEMywgMHhGQSwgMHhEMywgMHhFNCwgMHg5MCwgMHhDRiwgMHg5MCwgMHhEMCwgLyogMHgwOC0weDBCICovCisJMHg5MCwgMHhEMSwgMHhFRCwgMHhBQSwgMHhFMywgMHhCOSwgMHhEMiwgMHhFMiwgLyogMHgwQy0weDBGICovCisJMHg5MCwgMHhEMiwgMHg5MCwgMHhEMywgMHg5MCwgMHhENCwgMHg5MCwgMHhENSwgLyogMHgxMC0weDEzICovCisJMHg5MCwgMHhENiwgMHhFMywgMHhCNSwgMHg5MCwgMHhENywgMHg5MCwgMHhEOCwgLyogMHgxNC0weDE3ICovCisJMHg5MCwgMHhEOSwgMHg5MCwgMHhEQSwgMHhEMywgMHhERSwgMHg5MCwgMHhEQiwgLyogMHgxOC0weDFCICovCisJMHg5MCwgMHhEQywgMHg5MCwgMHhERCwgMHg5MCwgMHhERSwgMHhCOCwgMHhEMCwgLyogMHgxQy0weDFGICovCisJMHhFMywgMHhCMywgMHg5MCwgMHhERiwgMHg5MCwgMHhFMCwgMHhFMywgMHhCNiwgLyogMHgyMC0weDIzICovCisJMHhCNywgMHhERiwgMHg5MCwgMHhFMSwgMHhFMywgMHhCNCwgMHhDMCwgMHhBMiwgLyogMHgyNC0weDI3ICovCisJMHg5MCwgMHhFMiwgMHg5MCwgMHhFMywgMHg5MCwgMHhFNCwgMHhFMywgMHhCQSwgLyogMHgyOC0weDJCICovCisJMHg5MCwgMHhFNSwgMHg5MCwgMHhFNiwgMHg5MCwgMHhFNywgMHg5MCwgMHhFOCwgLyogMHgyQy0weDJGICovCisJMHg5MCwgMHhFOSwgMHg5MCwgMHhFQSwgMHg5MCwgMHhFQiwgMHg5MCwgMHhFQywgLyogMHgzMC0weDMzICovCisJMHg5MCwgMHhFRCwgMHg5MCwgMHhFRSwgMHg5MCwgMHhFRiwgMHg5MCwgMHhGMCwgLyogMHgzNC0weDM3ICovCisJMHg5MCwgMHhGMSwgMHg5MCwgMHhGMiwgMHg5MCwgMHhGMywgMHg5MCwgMHhGNCwgLyogMHgzOC0weDNCICovCisJMHg5MCwgMHhGNSwgMHg5MCwgMHhGNiwgMHg5MCwgMHhGNywgMHhENCwgMHhCOCwgLyogMHgzQy0weDNGICovCisJMHg5MCwgMHhGOCwgMHg5MCwgMHhGOSwgMHg5MCwgMHhGQSwgMHg5MCwgMHhGQiwgLyogMHg0MC0weDQzICovCisJMHg5MCwgMHhGQywgMHg5MCwgMHhGRCwgMHg5MCwgMHhGRSwgMHg5MSwgMHg0MCwgLyogMHg0NC0weDQ3ICovCisJMHhCNCwgMHhDOCwgMHg5MSwgMHg0MSwgMHhFMywgMHhCQiwgMHg5MSwgMHg0MiwgLyogMHg0OC0weDRCICovCisJMHhCQiwgMHhDNSwgMHg5MSwgMHg0MywgMHhDOSwgMHhGNywgMHg5MSwgMHg0NCwgLyogMHg0Qy0weDRGICovCisJMHg5MSwgMHg0NSwgMHhDOSwgMHhFNSwgMHg5MSwgMHg0NiwgMHg5MSwgMHg0NywgLyogMHg1MC0weDUzICovCisJMHg5MSwgMHg0OCwgMHhDNCwgMHhCRCwgMHg5MSwgMHg0OSwgMHg5MSwgMHg0QSwgLyogMHg1NC0weDU3ICovCisJMHg5MSwgMHg0QiwgMHg5MSwgMHg0QywgMHg5MSwgMHg0RCwgMHg5MSwgMHg0RSwgLyogMHg1OC0weDVCICovCisJMHg5MSwgMHg0RiwgMHhFRCwgMHhBQiwgMHg5MSwgMHg1MCwgMHg5MSwgMHg1MSwgLyogMHg1Qy0weDVGICovCisJMHg5MSwgMHg1MiwgMHg5MSwgMHg1MywgMHhDMiwgMHhGRCwgMHg5MSwgMHg1NCwgLyogMHg2MC0weDYzICovCisJMHg5MSwgMHg1NSwgMHg5MSwgMHg1NiwgMHg5MSwgMHg1NywgMHhCQiwgMHhEQiwgLyogMHg2NC0weDY3ICovCisJMHhCRiwgMHhBRSwgMHg5MSwgMHg1OCwgMHg5MSwgMHg1OSwgMHg5MSwgMHg1QSwgLyogMHg2OC0weDZCICovCisJMHg5MSwgMHg1QiwgMHg5MSwgMHg1QywgMHg5MSwgMHg1RCwgMHg5MSwgMHg1RSwgLyogMHg2Qy0weDZGICovCisJMHhDRSwgMHhCRiwgMHg5MSwgMHg1RiwgMHg5MSwgMHg2MCwgMHg5MSwgMHg2MSwgLyogMHg3MC0weDczICovCisJMHg5MSwgMHg2MiwgMHhFMywgMHhCQywgMHg5MSwgMHg2MywgMHhCRiwgMHhCNiwgLyogMHg3NC0weDc3ICovCisJMHg5MSwgMHg2NCwgMHg5MSwgMHg2NSwgMHg5MSwgMHg2NiwgMHg5MSwgMHg2NywgLyogMHg3OC0weDdCICovCisJMHg5MSwgMHg2OCwgMHg5MSwgMHg2OSwgMHg5MSwgMHg2QSwgMHg5MSwgMHg2QiwgLyogMHg3Qy0weDdGICovCisJCisJMHg5MSwgMHg2QywgMHg5MSwgMHg2RCwgMHg5MSwgMHg2RSwgMHg5MSwgMHg2RiwgLyogMHg4MC0weDgzICovCisJMHg5MSwgMHg3MCwgMHg5MSwgMHg3MSwgMHg5MSwgMHg3MiwgMHg5MSwgMHg3MywgLyogMHg4NC0weDg3ICovCisJMHg5MSwgMHg3NCwgMHg5MSwgMHg3NSwgMHg5MSwgMHg3NiwgMHhCMSwgMHhFRiwgLyogMHg4OC0weDhCICovCisJMHg5MSwgMHg3NywgMHg5MSwgMHg3OCwgMHhENCwgMHhGNywgMHg5MSwgMHg3OSwgLyogMHg4Qy0weDhGICovCisJMHg5MSwgMHg3QSwgMHg5MSwgMHg3QiwgMHg5MSwgMHg3QywgMHg5MSwgMHg3RCwgLyogMHg5MC0weDkzICovCisJMHhFMywgMHhCRSwgMHg5MSwgMHg3RSwgMHg5MSwgMHg4MCwgMHg5MSwgMHg4MSwgLyogMHg5NC0weDk3ICovCisJMHg5MSwgMHg4MiwgMHg5MSwgMHg4MywgMHg5MSwgMHg4NCwgMHg5MSwgMHg4NSwgLyogMHg5OC0weDlCICovCisJMHg5MSwgMHg4NiwgMHhFRCwgMHhBRCwgMHg5MSwgMHg4NywgMHg5MSwgMHg4OCwgLyogMHg5Qy0weDlGICovCisJMHg5MSwgMHg4OSwgMHg5MSwgMHg4QSwgMHg5MSwgMHg4QiwgMHg5MSwgMHg4QywgLyogMHhBMC0weEEzICovCisJMHg5MSwgMHg4RCwgMHg5MSwgMHg4RSwgMHg5MSwgMHg4RiwgMHhFMywgMHhCRiwgLyogMHhBNC0weEE3ICovCisJMHhCQSwgMHhBOSwgMHhFRCwgMHhBQywgMHg5MSwgMHg5MCwgMHg5MSwgMHg5MSwgLyogMHhBOC0weEFCICovCisJMHhFMywgMHhCRCwgMHg5MSwgMHg5MiwgMHg5MSwgMHg5MywgMHg5MSwgMHg5NCwgLyogMHhBQy0weEFGICovCisJMHg5MSwgMHg5NSwgMHg5MSwgMHg5NiwgMHg5MSwgMHg5NywgMHg5MSwgMHg5OCwgLyogMHhCMC0weEIzICovCisJMHg5MSwgMHg5OSwgMHg5MSwgMHg5QSwgMHg5MSwgMHg5QiwgMHhFMywgMHhDMCwgLyogMHhCNC0weEI3ICovCisJMHg5MSwgMHg5QywgMHg5MSwgMHg5RCwgMHg5MSwgMHg5RSwgMHg5MSwgMHg5RiwgLyogMHhCOC0weEJCICovCisJMHg5MSwgMHhBMCwgMHg5MSwgMHhBMSwgMHhCQSwgMHhCNiwgMHg5MSwgMHhBMiwgLyogMHhCQy0weEJGICovCisJMHg5MSwgMHhBMywgMHg5MSwgMHhBNCwgMHhCNiwgMHhBRSwgMHg5MSwgMHhBNSwgLyogMHhDMC0weEMzICovCisJMHg5MSwgMHhBNiwgMHg5MSwgMHhBNywgMHg5MSwgMHhBOCwgMHg5MSwgMHhBOSwgLyogMHhDNC0weEM3ICovCisJMHhEMCwgMHhCOCwgMHg5MSwgMHhBQSwgMHhCMCwgMHhDMywgMHhFRCwgMHhBRSwgLyogMHhDOC0weENCICovCisJMHg5MSwgMHhBQiwgMHg5MSwgMHhBQywgMHg5MSwgMHhBRCwgMHg5MSwgMHhBRSwgLyogMHhDQy0weENGICovCisJMHg5MSwgMHhBRiwgMHhFRCwgMHhBRiwgMHhDMCwgMHhDMSwgMHg5MSwgMHhCMCwgLyogMHhEMC0weEQzICovCisJMHhFMywgMHhDMSwgMHg5MSwgMHhCMSwgMHg5MSwgMHhCMiwgMHg5MSwgMHhCMywgLyogMHhENC0weEQ3ICovCisJMHg5MSwgMHhCNCwgMHg5MSwgMHhCNSwgMHg5MSwgMHhCNiwgMHg5MSwgMHhCNywgLyogMHhEOC0weERCICovCisJMHg5MSwgMHhCOCwgMHg5MSwgMHhCOSwgMHg5MSwgMHhCQSwgMHg5MSwgMHhCQiwgLyogMHhEQy0weERGICovCisJMHg5MSwgMHhCQywgMHg5MSwgMHhCRCwgMHg5MSwgMHhCRSwgMHg5MSwgMHhCRiwgLyogMHhFMC0weEUzICovCisJMHg5MSwgMHhDMCwgMHg5MSwgMHhDMSwgMHhDNSwgMHhCMywgMHg5MSwgMHhDMiwgLyogMHhFNC0weEU3ICovCisJMHg5MSwgMHhDMywgMHg5MSwgMHhDNCwgMHg5MSwgMHhDNSwgMHg5MSwgMHhDNiwgLyogMHhFOC0weEVCICovCisJMHg5MSwgMHhDNywgMHg5MSwgMHhDOCwgMHg5MSwgMHhDOSwgMHg5MSwgMHhDQSwgLyogMHhFQy0weEVGICovCisJMHg5MSwgMHhDQiwgMHg5MSwgMHhDQywgMHg5MSwgMHhDRCwgMHg5MSwgMHhDRSwgLyogMHhGMC0weEYzICovCisJMHg5MSwgMHhDRiwgMHhFMywgMHhDMiwgMHg5MSwgMHhEMCwgMHg5MSwgMHhEMSwgLyogMHhGNC0weEY3ICovCisJMHg5MSwgMHhEMiwgMHg5MSwgMHhEMywgMHg5MSwgMHhENCwgMHg5MSwgMHhENSwgLyogMHhGOC0weEZCICovCisJMHg5MSwgMHhENiwgMHg5MSwgMHhENywgMHg5MSwgMHhEOCwgMHhEQywgMHhCMiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjJbNTEyXSA9IHsKKwkweDkxLCAweEQ5LCAweDkxLCAweERBLCAweDkxLCAweERCLCAweDkxLCAweERDLCAvKiAweDAwLTB4MDMgKi8KKwkweDkxLCAweERELCAweDkxLCAweERFLCAweEVELCAweEIwLCAweDkxLCAweERGLCAvKiAweDA0LTB4MDcgKi8KKwkweEI4LCAweEVBLCAweDkxLCAweEUwLCAweENFLCAweEVDLCAweEVBLCAweEE3LCAvKiAweDA4LTB4MEIgKi8KKwkweEQwLCAweEU3LCAweENBLCAweEY5LCAweEM4LCAweEQ2LCAweENGLCAweEI3LCAvKiAweDBDLTB4MEYgKi8KKwkweEIzLCAweEM5LCAweENFLCAweEQyLCAweEJELCAweEU0LCAweDkxLCAweEUxLCAvKiAweDEwLTB4MTMgKi8KKwkweDkxLCAweEUyLCAweEUzLCAweERFLCAweEJCLCAweEYyLCAweEVBLCAweEE4LCAvKiAweDE0LTB4MTcgKi8KKwkweEQ1LCAweEJELCAweDkxLCAweEUzLCAweEM2LCAweERELCAweEVBLCAweEE5LCAvKiAweDE4LTB4MUIgKi8KKwkweDkxLCAweEU0LCAweDkxLCAweEU1LCAweDkxLCAweEU2LCAweEVBLCAweEFBLCAvKiAweDFDLTB4MUYgKi8KKwkweDkxLCAweEU3LCAweEVBLCAweEFDLCAweEVBLCAweEFCLCAweDkxLCAweEU4LCAvKiAweDIwLTB4MjMgKi8KKwkweEVBLCAweEFFLCAweEVBLCAweEFELCAweDkxLCAweEU5LCAweDkxLCAweEVBLCAvKiAweDI0LTB4MjcgKi8KKwkweDkxLCAweEVCLCAweDkxLCAweEVDLCAweEJELCAweEQ4LCAweDkxLCAweEVELCAvKiAweDI4LTB4MkIgKi8KKwkweEVBLCAweEFGLCAweDkxLCAweEVFLCAweEMyLCAweEJFLCAweDkxLCAweEVGLCAvKiAweDJDLTB4MkYgKi8KKwkweDkxLCAweEYwLCAweDkxLCAweEYxLCAweDkxLCAweEYyLCAweEI0LCAweEMxLCAvKiAweDMwLTB4MzMgKi8KKwkweEI0LCAweEY3LCAweDkxLCAweEYzLCAweDkxLCAweEY0LCAweEJCLCAweEE3LCAvKiAweDM0LTB4MzcgKi8KKwkweDkxLCAweEY1LCAweDkxLCAweEY2LCAweDkxLCAweEY3LCAweDkxLCAweEY4LCAvKiAweDM4LTB4M0IgKi8KKwkweDkxLCAweEY5LCAweEVDLCAweEU2LCAweEVDLCAweEU1LCAweEI3LCAweEJGLCAvKiAweDNDLTB4M0YgKi8KKwkweENCLCAweEY5LCAweEIxLCAweEUyLCAweDkxLCAweEZBLCAweEVDLCAweEU3LCAvKiAweDQwLTB4NDMgKi8KKwkweDkxLCAweEZCLCAweDkxLCAweEZDLCAweDkxLCAweEZELCAweEM5LCAweEM4LCAvKiAweDQ0LTB4NDcgKi8KKwkweEVDLCAweEU4LCAweEVDLCAweEU5LCAweDkxLCAweEZFLCAweENBLCAweEQ2LCAvKiAweDQ4LTB4NEIgKi8KKwkweERFLCAweEQwLCAweEIyLCAweEM1LCAweEQ0LCAweEZBLCAweDkyLCAweDQwLCAvKiAweDRDLTB4NEYgKi8KKwkweDkyLCAweDQxLCAweEM2LCAweENCLCAweEIwLCAweEM3LCAweEI0LCAweEYyLCAvKiAweDUwLTB4NTMgKi8KKwkweEM4LCAweEQzLCAweDkyLCAweDQyLCAweDkyLCAweDQzLCAweDkyLCAweDQ0LCAvKiAweDU0LTB4NTcgKi8KKwkweENELCAweEQwLCAweDkyLCAweDQ1LCAweDkyLCAweDQ2LCAweEJGLCAweEI4LCAvKiAweDU4LTB4NUIgKi8KKwkweDkyLCAweDQ3LCAweDkyLCAweDQ4LCAweDkyLCAweDQ5LCAweDkyLCAweDRBLCAvKiAweDVDLTB4NUYgKi8KKwkweDkyLCAweDRCLCAweDkyLCAweDRDLCAweDkyLCAweDRELCAweEJGLCAweERCLCAvKiAweDYwLTB4NjMgKi8KKwkweDkyLCAweDRFLCAweDkyLCAweDRGLCAweEM3LCAweEE0LCAweEQ2LCAweEI0LCAvKiAweDY0LTB4NjcgKi8KKwkweDkyLCAweDUwLCAweEMwLCAweEE5LCAweERFLCAweEQxLCAweEM5LCAweEE4LCAvKiAweDY4LTB4NkIgKi8KKwkweEQxLCAweEVGLCAweEM1LCAweEE0LCAweEIwLCAweEU3LCAweEIzLCAweEI2LCAvKiAweDZDLTB4NkYgKi8KKwkweEM4LCAweEM1LCAweDkyLCAweDUxLCAweDkyLCAweDUyLCAweEIwLCAweEUyLCAvKiAweDcwLTB4NzMgKi8KKwkweDkyLCAweDUzLCAweDkyLCAweDU0LCAweEI3LCAweEY2LCAweDkyLCAweDU1LCAvKiAweDc0LTB4NzcgKi8KKwkweDkyLCAweDU2LCAweEM1LCAweEZBLCAweDkyLCAweDU3LCAweDkyLCAweDU4LCAvKiAweDc4LTB4N0IgKi8KKwkweEI2LCAweEYzLCAweDkyLCAweDU5LCAweEQ1LCAweEQyLCAweEIzLCAweEQwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEJDLCAweEJDLCAweDkyLCAweDVBLCAweDkyLCAweDVCLCAweDkyLCAweDVDLCAvKiAweDgwLTB4ODMgKi8KKwkweEIzLCAweEFELCAweDkyLCAweDVELCAweDkyLCAweDVFLCAweDkyLCAweDVGLCAvKiAweDg0LTB4ODcgKi8KKwkweDkyLCAweDYwLCAweEJFLCAweEYxLCAweEIwLCAweEQxLCAweDkyLCAweDYxLCAvKiAweDg4LTB4OEIgKi8KKwkweDkyLCAweDYyLCAweDkyLCAweDYzLCAweDkyLCAweDY0LCAweDkyLCAweDY1LCAvKiAweDhDLTB4OEYgKi8KKwkweDkyLCAweDY2LCAweEQyLCAweEQ2LCAweENBLCAweEUzLCAweEQ3LCAweEE1LCAvKiAweDkwLTB4OTMgKi8KKwkweDkyLCAweDY3LCAweENELCAweEI2LCAweEI2LCAweEI2LCAweEJGLCAweEI5LCAvKiAweDk0LTB4OTcgKi8KKwkweEQ1LCAweERCLCAweDkyLCAweDY4LCAweEI4LCAweEE3LCAweEM1LCAweEQ3LCAvKiAweDk4LTB4OUIgKi8KKwkweDkyLCAweDY5LCAweDkyLCAweDZBLCAweDkyLCAweDZCLCAweERFLCAweEQyLCAvKiAweDlDLTB4OUYgKi8KKwkweEJGLCAweEQ5LCAweEMyLCAweEQ1LCAweEM3LCAweEMwLCAweDkyLCAweDZDLCAvKiAweEEwLTB4QTMgKi8KKwkweEJCLCAweEE0LCAweEIxLCAweEE4LCAweDkyLCAweDZELCAweDkyLCAweDZFLCAvKiAweEE0LTB4QTcgKi8KKwkweEM1LCAweEVBLCAweDkyLCAweDZGLCAweDkyLCAweDcwLCAweEM1LCAweEZCLCAvKiAweEE4LTB4QUIgKi8KKwkweENDLCAweEE3LCAweDkyLCAweDcxLCAweDkyLCAweDcyLCAweDkyLCAweDczLCAvKiAweEFDLTB4QUYgKi8KKwkweDkyLCAweDc0LCAweEIxLCAweEE3LCAweDkyLCAweDc1LCAweDkyLCAweDc2LCAvKiAweEIwLTB4QjMgKi8KKwkweDkyLCAweDc3LCAweEI1LCAweEQ2LCAweDkyLCAweDc4LCAweDkyLCAweDc5LCAvKiAweEI0LTB4QjcgKi8KKwkweDkyLCAweDdBLCAweEM0LCAweEE4LCAweDkyLCAweDdCLCAweERFLCAweEQzLCAvKiAweEI4LTB4QkIgKi8KKwkweEQxLCAweEJBLCAweEIzLCAweEU5LCAweDkyLCAweDdDLCAweEMzLCAweEYyLCAvKiAweEJDLTB4QkYgKi8KKwkweDkyLCAweDdELCAweDkyLCAweDdFLCAweEI3LCAweEY3LCAweDkyLCAweDgwLCAvKiAweEMwLTB4QzMgKi8KKwkweEQ2LCAweEY0LCAweEI1LCAweEEzLCAweEIyLCAweEYwLCAweEM0LCAweEI0LCAvKiAweEM0LTB4QzcgKi8KKwkweEM0LCAweEU5LCAweEMwLCAweEFELCAweERFLCAweEQ0LCAweDkyLCAweDgxLCAvKiAweEM4LTB4Q0IgKi8KKwkweEIwLCAweEU4LCAweEM1LCAweEM0LCAweEMxLCAweEUwLCAweDkyLCAweDgyLCAvKiAweENDLTB4Q0YgKi8KKwkweEI5LCAweEQ1LCAweDkyLCAweDgzLCAweEJFLCAweERDLCAweENELCAweEQ4LCAvKiAweEQwLTB4RDMgKi8KKwkweEIwLCAweENFLCAweDkyLCAweDg0LCAweENELCAweENGLCAweERFLCAweEQ2LCAvKiAweEQ0LTB4RDcgKi8KKwkweEJFLCAweEQwLCAweEQ3LCAweEJFLCAweERFLCAweEQ1LCAweEQ1LCAweEQwLCAvKiAweEQ4LTB4REIgKi8KKwkweEIwLCAweERELCAweDkyLCAweDg1LCAweDkyLCAweDg2LCAweEM0LCAweEUyLCAvKiAweERDLTB4REYgKi8KKwkweDkyLCAweDg3LCAweDkyLCAweDg4LCAweEMyLCAweEEzLCAweEJDLCAweEYwLCAvKiAweEUwLTB4RTMgKi8KKwkweDkyLCAweDg5LCAweEQzLCAweEI1LCAweEMwLCAweEI5LCAweEM1LCAweEExLCAvKiAweEU0LTB4RTcgKi8KKwkweEIyLCAweEE2LCAweEQ0LCAweEYxLCAweDkyLCAweDhBLCAweDkyLCAweDhCLCAvKiAweEU4LTB4RUIgKi8KKwkweEMwLCAweEE4LCAweENBLCAweEMzLCAweERFLCAweEQ3LCAweEQ1LCAweEZDLCAvKiAweEVDLTB4RUYgKi8KKwkweDkyLCAweDhDLCAweEI5LCAweEIwLCAweDkyLCAweDhELCAweEM4LCAweEFELCAvKiAweEYwLTB4RjMgKi8KKwkweENCLCAweEE5LCAweDkyLCAweDhFLCAweERFLCAweEQ5LCAweEJGLCAweEJELCAvKiAweEY0LTB4RjcgKi8KKwkweDkyLCAweDhGLCAweDkyLCAweDkwLCAweDkyLCAweDkxLCAweDkyLCAweDkyLCAvKiAweEY4LTB4RkIgKi8KKwkweEM2LCAweEI0LCAweEQ3LCAweEE3LCAweENBLCAweEIwLCAweEM0LCAweEMzLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182M1s1MTJdID0geworCTB4OTIsIDB4OTMsIDB4QjMsIDB4RDYsIDB4QjksIDB4RDIsIDB4OTIsIDB4OTQsIC8qIDB4MDAtMHgwMyAqLworCTB4OTIsIDB4OTUsIDB4OTIsIDB4OTYsIDB4OTIsIDB4OTcsIDB4RDYsIDB4QjgsIC8qIDB4MDQtMHgwNyAqLworCTB4RUEsIDB4RkMsIDB4QjAsIDB4QjQsIDB4OTIsIDB4OTgsIDB4OTIsIDB4OTksIC8qIDB4MDgtMHgwQiAqLworCTB4OTIsIDB4OUEsIDB4OTIsIDB4OUIsIDB4QkYsIDB4RTYsIDB4OTIsIDB4OUMsIC8qIDB4MEMtMHgwRiAqLworCTB4OTIsIDB4OUQsIDB4Q0MsIDB4RjQsIDB4OTIsIDB4OUUsIDB4OTIsIDB4OUYsIC8qIDB4MTAtMHgxMyAqLworCTB4OTIsIDB4QTAsIDB4OTIsIDB4QTEsIDB4Q0QsIDB4REEsIDB4OTIsIDB4QTIsIC8qIDB4MTQtMHgxNyAqLworCTB4OTIsIDB4QTMsIDB4OTIsIDB4QTQsIDB4RDYsIDB4QkYsIDB4QzIsIDB4Q0UsIC8qIDB4MTgtMHgxQiAqLworCTB4OTIsIDB4QTUsIDB4Q0UsIDB4Q0UsIDB4Q0MsIDB4QTIsIDB4RDAsIDB4QUUsIC8qIDB4MUMtMHgxRiAqLworCTB4QzQsIDB4RDMsIDB4QjUsIDB4QjIsIDB4REUsIDB4RDgsIDB4RDUsIDB4RjUsIC8qIDB4MjAtMHgyMyAqLworCTB4QkMsIDB4QjcsIDB4QkIsIDB4RDMsIDB4OTIsIDB4QTYsIDB4OTIsIDB4QTcsIC8qIDB4MjQtMHgyNyAqLworCTB4QjAsIDB4QTQsIDB4OTIsIDB4QTgsIDB4QzUsIDB4QjIsIDB4QjQsIDB4RUMsIC8qIDB4MjgtMHgyQiAqLworCTB4OTIsIDB4QTksIDB4OTIsIDB4QUEsIDB4OTIsIDB4QUIsIDB4RDUsIDB4RjEsIC8qIDB4MkMtMHgyRiAqLworCTB4OTIsIDB4QUMsIDB4OTIsIDB4QUQsIDB4RUEsIDB4RkQsIDB4OTIsIDB4QUUsIC8qIDB4MzAtMHgzMyAqLworCTB4OTIsIDB4QUYsIDB4OTIsIDB4QjAsIDB4OTIsIDB4QjEsIDB4OTIsIDB4QjIsIC8qIDB4MzQtMHgzNyAqLworCTB4OTIsIDB4QjMsIDB4REUsIDB4REEsIDB4Q0QsIDB4QTYsIDB4OTIsIDB4QjQsIC8qIDB4MzgtMHgzQiAqLworCTB4OTIsIDB4QjUsIDB4Q0QsIDB4RUMsIDB4OTIsIDB4QjYsIDB4OTIsIDB4QjcsIC8qIDB4M0MtMHgzRiAqLworCTB4OTIsIDB4QjgsIDB4OTIsIDB4QjksIDB4Q0UsIDB4RTYsIDB4REUsIDB4REMsIC8qIDB4NDAtMHg0MyAqLworCTB4OTIsIDB4QkEsIDB4Q0QsIDB4QjEsIDB4QzAsIDB4QTYsIDB4OTIsIDB4QkIsIC8qIDB4NDQtMHg0NyAqLworCTB4OTIsIDB4QkMsIDB4RDcsIDB4QkQsIDB4OTIsIDB4QkQsIDB4REUsIDB4REIsIC8qIDB4NDgtMHg0QiAqLworCTB4QjAsIDB4QzYsIDB4QkEsIDB4QjQsIDB4QzksIDB4RDMsIDB4QzQsIDB4RjMsIC8qIDB4NEMtMHg0RiAqLworCTB4QkUsIDB4RTgsIDB4OTIsIDB4QkUsIDB4OTIsIDB4QkYsIDB4OTIsIDB4QzAsIC8qIDB4NTAtMHg1MyAqLworCTB4OTIsIDB4QzEsIDB4QjIsIDB4QjYsIDB4OTIsIDB4QzIsIDB4OTIsIDB4QzMsIC8qIDB4NTQtMHg1NyAqLworCTB4OTIsIDB4QzQsIDB4OTIsIDB4QzUsIDB4OTIsIDB4QzYsIDB4OTIsIDB4QzcsIC8qIDB4NTgtMHg1QiAqLworCTB4OTIsIDB4QzgsIDB4OTIsIDB4QzksIDB4QzAsIDB4Q0MsIDB4Q0IsIDB4RjAsIC8qIDB4NUMtMHg1RiAqLworCTB4OTIsIDB4Q0EsIDB4QkMsIDB4RjEsIDB4QkIsIDB4QkIsIDB4QjUsIDB4QjcsIC8qIDB4NjAtMHg2MyAqLworCTB4OTIsIDB4Q0IsIDB4OTIsIDB4Q0MsIDB4OTIsIDB4Q0QsIDB4QzUsIDB4RjUsIC8qIDB4NjQtMHg2NyAqLworCTB4OTIsIDB4Q0UsIDB4REUsIDB4RTYsIDB4OTIsIDB4Q0YsIDB4OTIsIDB4RDAsIC8qIDB4NjgtMHg2QiAqLworCTB4OTIsIDB4RDEsIDB4REUsIDB4RTMsIDB4QkUsIDB4REQsIDB4OTIsIDB4RDIsIC8qIDB4NkMtMHg2RiAqLworCTB4OTIsIDB4RDMsIDB4REUsIDB4REYsIDB4OTIsIDB4RDQsIDB4OTIsIDB4RDUsIC8qIDB4NzAtMHg3MyAqLworCTB4OTIsIDB4RDYsIDB4OTIsIDB4RDcsIDB4QjQsIDB4QjcsIDB4QkQsIDB4REQsIC8qIDB4NzQtMHg3NyAqLworCTB4OTIsIDB4RDgsIDB4OTIsIDB4RDksIDB4REUsIDB4RTAsIDB4QzQsIDB4RUQsIC8qIDB4NzgtMHg3QiAqLworCTB4OTIsIDB4REEsIDB4OTIsIDB4REIsIDB4OTIsIDB4REMsIDB4OTIsIDB4REQsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4Q0YsIDB4QzYsIDB4OTIsIDB4REUsIDB4QjUsIDB4RTAsIDB4OTIsIDB4REYsIC8qIDB4ODAtMHg4MyAqLworCTB4OTIsIDB4RTAsIDB4OTIsIDB4RTEsIDB4OTIsIDB4RTIsIDB4QjYsIDB4REUsIC8qIDB4ODQtMHg4NyAqLworCTB4Q0EsIDB4REEsIDB4QjUsIDB4RjQsIDB4REUsIDB4RTUsIDB4OTIsIDB4RTMsIC8qIDB4ODgtMHg4QiAqLworCTB4RDUsIDB4QzYsIDB4OTIsIDB4RTQsIDB4REUsIDB4RTEsIDB4Q0MsIDB4Q0QsIC8qIDB4OEMtMHg4RiAqLworCTB4QzYsIDB4RkUsIDB4OTIsIDB4RTUsIDB4QzUsIDB4QzUsIDB4OTIsIDB4RTYsIC8qIDB4OTAtMHg5MyAqLworCTB4OTIsIDB4RTcsIDB4OTIsIDB4RTgsIDB4RDIsIDB4QjQsIDB4OTIsIDB4RTksIC8qIDB4OTQtMHg5NyAqLworCTB4QkUsIDB4RjIsIDB4OTIsIDB4RUEsIDB4OTIsIDB4RUIsIDB4OTIsIDB4RUMsIC8qIDB4OTgtMHg5QiAqLworCTB4OTIsIDB4RUQsIDB4OTIsIDB4RUUsIDB4OTIsIDB4RUYsIDB4OTIsIDB4RjAsIC8qIDB4OUMtMHg5RiAqLworCTB4QzIsIDB4RDMsIDB4OTIsIDB4RjEsIDB4Q0MsIDB4QkQsIDB4QjMsIDB4QjgsIC8qIDB4QTAtMHhBMyAqLworCTB4OTIsIDB4RjIsIDB4QkQsIDB4RDMsIDB4OTIsIDB4RjMsIDB4QkYsIDB4RDgsIC8qIDB4QTQtMHhBNyAqLworCTB4Q0QsIDB4QzYsIDB4RDEsIDB4REEsIDB4QjQsIDB4RUIsIDB4OTIsIDB4RjQsIC8qIDB4QTgtMHhBQiAqLworCTB4REUsIDB4RTQsIDB4REUsIDB4REQsIDB4REUsIDB4RTcsIDB4OTIsIDB4RjUsIC8qIDB4QUMtMHhBRiAqLworCTB4RUEsIDB4RkUsIDB4OTIsIDB4RjYsIDB4OTIsIDB4RjcsIDB4QzIsIDB4QjAsIC8qIDB4QjAtMHhCMyAqLworCTB4REUsIDB4RTIsIDB4OTIsIDB4RjgsIDB4OTIsIDB4RjksIDB4RDYsIDB4QzAsIC8qIDB4QjQtMHhCNyAqLworCTB4QjUsIDB4QTcsIDB4OTIsIDB4RkEsIDB4QjIsIDB4RjQsIDB4OTIsIDB4RkIsIC8qIDB4QjgtMHhCQiAqLworCTB4REUsIDB4RTgsIDB4OTIsIDB4RkMsIDB4REUsIDB4RjIsIDB4OTIsIDB4RkQsIC8qIDB4QkMtMHhCRiAqLworCTB4OTIsIDB4RkUsIDB4OTMsIDB4NDAsIDB4OTMsIDB4NDEsIDB4OTMsIDB4NDIsIC8qIDB4QzAtMHhDMyAqLworCTB4REUsIDB4RUQsIDB4OTMsIDB4NDMsIDB4REUsIDB4RjEsIDB4OTMsIDB4NDQsIC8qIDB4QzQtMHhDNyAqLworCTB4OTMsIDB4NDUsIDB4QzgsIDB4RTAsIDB4OTMsIDB4NDYsIDB4OTMsIDB4NDcsIC8qIDB4QzgtMHhDQiAqLworCTB4OTMsIDB4NDgsIDB4RDcsIDB4RTEsIDB4REUsIDB4RUYsIDB4QzMsIDB4RTgsIC8qIDB4Q0MtMHhDRiAqLworCTB4Q0MsIDB4RTEsIDB4OTMsIDB4NDksIDB4QjIsIDB4RTUsIDB4OTMsIDB4NEEsIC8qIDB4RDAtMHhEMyAqLworCTB4OTMsIDB4NEIsIDB4OTMsIDB4NEMsIDB4RDIsIDB4QkUsIDB4OTMsIDB4NEQsIC8qIDB4RDQtMHhENyAqLworCTB4OTMsIDB4NEUsIDB4OTMsIDB4NEYsIDB4OTMsIDB4NTAsIDB4OTMsIDB4NTEsIC8qIDB4RDgtMHhEQiAqLworCTB4OTMsIDB4NTIsIDB4OTMsIDB4NTMsIDB4REUsIDB4RUUsIDB4OTMsIDB4NTQsIC8qIDB4REMtMHhERiAqLworCTB4REUsIDB4RUIsIDB4Q0UsIDB4RDUsIDB4OTMsIDB4NTUsIDB4QjQsIDB4QTcsIC8qIDB4RTAtMHhFMyAqLworCTB4OTMsIDB4NTYsIDB4OTMsIDB4NTcsIDB4OTMsIDB4NTgsIDB4OTMsIDB4NTksIC8qIDB4RTQtMHhFNyAqLworCTB4OTMsIDB4NUEsIDB4QkYsIDB4QUIsIDB4QkUsIDB4QkUsIDB4OTMsIDB4NUIsIC8qIDB4RTgtMHhFQiAqLworCTB4OTMsIDB4NUMsIDB4QkQsIDB4RDIsIDB4OTMsIDB4NUQsIDB4OTMsIDB4NUUsIC8qIDB4RUMtMHhFRiAqLworCTB4OTMsIDB4NUYsIDB4OTMsIDB4NjAsIDB4REUsIDB4RTksIDB4OTMsIDB4NjEsIC8qIDB4RjAtMHhGMyAqLworCTB4RDQsIDB4QUUsIDB4OTMsIDB4NjIsIDB4REUsIDB4REUsIDB4OTMsIDB4NjMsIC8qIDB4RjQtMHhGNyAqLworCTB4REUsIDB4RUEsIDB4OTMsIDB4NjQsIDB4OTMsIDB4NjUsIDB4OTMsIDB4NjYsIC8qIDB4RjgtMHhGQiAqLworCTB4OTMsIDB4NjcsIDB4QzAsIDB4QkYsIDB4OTMsIDB4NjgsIDB4REUsIDB4RUMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzY0WzUxMl0gPSB7CisJMHhCMiwgMHhGMywgMHhCOCwgMHhFOSwgMHhDMiwgMHhBNywgMHg5MywgMHg2OSwgLyogMHgwMC0weDAzICovCisJMHg5MywgMHg2QSwgMHhCRCwgMHhDMSwgMHg5MywgMHg2QiwgMHg5MywgMHg2QywgLyogMHgwNC0weDA3ICovCisJMHg5MywgMHg2RCwgMHg5MywgMHg2RSwgMHg5MywgMHg2RiwgMHhERSwgMHhGNSwgLyogMHgwOC0weDBCICovCisJMHhERSwgMHhGOCwgMHg5MywgMHg3MCwgMHg5MywgMHg3MSwgMHhCMiwgMHhBQiwgLyogMHgwQy0weDBGICovCisJMHhCNCwgMHhBNCwgMHg5MywgMHg3MiwgMHg5MywgMHg3MywgMHhCNCwgMHhFQSwgLyogMHgxMC0weDEzICovCisJMHhDOSwgMHhBNiwgMHg5MywgMHg3NCwgMHg5MywgMHg3NSwgMHg5MywgMHg3NiwgLyogMHgxNC0weDE3ICovCisJMHg5MywgMHg3NywgMHg5MywgMHg3OCwgMHg5MywgMHg3OSwgMHhERSwgMHhGNiwgLyogMHgxOC0weDFCICovCisJMHhDQiwgMHhEMSwgMHg5MywgMHg3QSwgMHhCOCwgMHhFMywgMHg5MywgMHg3QiwgLyogMHgxQy0weDFGICovCisJMHhERSwgMHhGNywgMHhERSwgMHhGQSwgMHg5MywgMHg3QywgMHg5MywgMHg3RCwgLyogMHgyMC0weDIzICovCisJMHg5MywgMHg3RSwgMHg5MywgMHg4MCwgMHhERSwgMHhGOSwgMHg5MywgMHg4MSwgLyogMHgyNC0weDI3ICovCisJMHg5MywgMHg4MiwgMHg5MywgMHg4MywgMHhDQywgMHhDMiwgMHg5MywgMHg4NCwgLyogMHgyOC0weDJCICovCisJMHhCMCwgMHhFMSwgMHhCNCwgMHhFRSwgMHg5MywgMHg4NSwgMHg5MywgMHg4NiwgLyogMHgyQy0weDJGICovCisJMHg5MywgMHg4NywgMHg5MywgMHg4OCwgMHg5MywgMHg4OSwgMHg5MywgMHg4QSwgLyogMHgzMC0weDMzICovCisJMHhFNSwgMHhCQSwgMHg5MywgMHg4QiwgMHg5MywgMHg4QywgMHg5MywgMHg4RCwgLyogMHgzNC0weDM3ICovCisJMHg5MywgMHg4RSwgMHg5MywgMHg4RiwgMHhEMCwgMHhBRiwgMHg5MywgMHg5MCwgLyogMHgzOC0weDNCICovCisJMHg5MywgMHg5MSwgMHhCMiwgMHhFQiwgMHg5MywgMHg5MiwgMHhFQiwgMHhBMSwgLyogMHgzQy0weDNGICovCisJMHg5MywgMHg5MywgMHhERSwgMHhGNCwgMHg5MywgMHg5NCwgMHg5MywgMHg5NSwgLyogMHg0MC0weDQzICovCisJMHhDOSwgMHhFMywgMHhERSwgMHhGMywgMHhCMCwgMHhEQSwgMHhEMiwgMHhBMSwgLyogMHg0NC0weDQ3ICovCisJMHhCMSwgMHhGNywgMHg5MywgMHg5NiwgMHhDQywgMHhBRiwgMHg5MywgMHg5NywgLyogMHg0OC0weDRCICovCisJMHg5MywgMHg5OCwgMHg5MywgMHg5OSwgMHg5MywgMHg5QSwgMHg5MywgMHg5QiwgLyogMHg0Qy0weDRGICovCisJMHg5MywgMHg5QywgMHg5MywgMHg5RCwgMHhERSwgMHhGMCwgMHg5MywgMHg5RSwgLyogMHg1MC0weDUzICovCisJMHhDQiwgMHhBNCwgMHg5MywgMHg5RiwgMHg5MywgMHhBMCwgMHg5MywgMHhBMSwgLyogMHg1NC0weDU3ICovCisJMHhENSwgMHhBQSwgMHg5MywgMHhBMiwgMHg5MywgMHhBMywgMHg5MywgMHhBNCwgLyogMHg1OC0weDVCICovCisJMHg5MywgMHhBNSwgMHg5MywgMHhBNiwgMHhERSwgMHhGQiwgMHg5MywgMHhBNywgLyogMHg1Qy0weDVGICovCisJMHg5MywgMHhBOCwgMHg5MywgMHhBOSwgMHg5MywgMHhBQSwgMHg5MywgMHhBQiwgLyogMHg2MC0weDYzICovCisJMHg5MywgMHhBQywgMHg5MywgMHhBRCwgMHg5MywgMHhBRSwgMHhCNCwgMHhERCwgLyogMHg2NC0weDY3ICovCisJMHg5MywgMHhBRiwgMHhDNCwgMHhBNiwgMHg5MywgMHhCMCwgMHg5MywgMHhCMSwgLyogMHg2OC0weDZCICovCisJMHg5MywgMHhCMiwgMHhERSwgMHhGRCwgMHg5MywgMHhCMywgMHg5MywgMHhCNCwgLyogMHg2Qy0weDZGICovCisJMHg5MywgMHhCNSwgMHg5MywgMHhCNiwgMHg5MywgMHhCNywgMHg5MywgMHhCOCwgLyogMHg3MC0weDczICovCisJMHg5MywgMHhCOSwgMHg5MywgMHhCQSwgMHg5MywgMHhCQiwgMHg5MywgMHhCQywgLyogMHg3NC0weDc3ICovCisJMHhDMywgMHhGRSwgMHhDNCwgMHhBMSwgMHhERiwgMHhBMSwgMHg5MywgMHhCRCwgLyogMHg3OC0weDdCICovCisJMHg5MywgMHhCRSwgMHg5MywgMHhCRiwgMHg5MywgMHhDMCwgMHg5MywgMHhDMSwgLyogMHg3Qy0weDdGICovCisJCisJMHg5MywgMHhDMiwgMHg5MywgMHhDMywgMHhDMSwgMHhDQywgMHg5MywgMHhDNCwgLyogMHg4MC0weDgzICovCisJMHhERSwgMHhGQywgMHhCRSwgMHhFRiwgMHg5MywgMHhDNSwgMHhDNiwgMHhCMiwgLyogMHg4NC0weDg3ICovCisJMHg5MywgMHhDNiwgMHg5MywgMHhDNywgMHg5MywgMHhDOCwgMHg5MywgMHhDOSwgLyogMHg4OC0weDhCICovCisJMHg5MywgMHhDQSwgMHg5MywgMHhDQiwgMHg5MywgMHhDQywgMHg5MywgMHhDRCwgLyogMHg4Qy0weDhGICovCisJMHg5MywgMHhDRSwgMHhCMywgMHhDNSwgMHhDOCwgMHhGNiwgMHg5MywgMHhDRiwgLyogMHg5MC0weDkzICovCisJMHg5MywgMHhEMCwgMHhDQiwgMHhCQSwgMHhERSwgMHhGRSwgMHg5MywgMHhEMSwgLyogMHg5NC0weDk3ICovCisJMHg5MywgMHhEMiwgMHhERiwgMHhBNCwgMHg5MywgMHhEMywgMHg5MywgMHhENCwgLyogMHg5OC0weDlCICovCisJMHg5MywgMHhENSwgMHg5MywgMHhENiwgMHhENywgMHhCMiwgMHg5MywgMHhENywgLyogMHg5Qy0weDlGICovCisJMHg5MywgMHhEOCwgMHg5MywgMHhEOSwgMHg5MywgMHhEQSwgMHg5MywgMHhEQiwgLyogMHhBMC0weEEzICovCisJMHhCMywgMHhCNywgMHg5MywgMHhEQywgMHg5MywgMHhERCwgMHg5MywgMHhERSwgLyogMHhBNC0weEE3ICovCisJMHg5MywgMHhERiwgMHhDMSwgMHhDMywgMHg5MywgMHhFMCwgMHg5MywgMHhFMSwgLyogMHhBOC0weEFCICovCisJMHhDNywgMHhDQiwgMHhCMiwgMHhBNSwgMHhCNCwgMHhFOSwgMHg5MywgMHhFMiwgLyogMHhBQy0weEFGICovCisJMHhENywgMHhBQiwgMHg5MywgMHhFMywgMHg5MywgMHhFNCwgMHg5MywgMHhFNSwgLyogMHhCMC0weEIzICovCisJMHg5MywgMHhFNiwgMHhDNCwgMHhFQywgMHg5MywgMHhFNywgMHhERiwgMHhBMiwgLyogMHhCNC0weEI3ICovCisJMHhERiwgMHhBMywgMHg5MywgMHhFOCwgMHhERiwgMHhBNSwgMHg5MywgMHhFOSwgLyogMHhCOC0weEJCICovCisJMHhCQSwgMHhCMywgMHg5MywgMHhFQSwgMHg5MywgMHhFQiwgMHg5MywgMHhFQywgLyogMHhCQy0weEJGICovCisJMHhERiwgMHhBNiwgMHg5MywgMHhFRCwgMHhDMCwgMHhERSwgMHg5MywgMHhFRSwgLyogMHhDMC0weEMzICovCisJMHg5MywgMHhFRiwgMHhDOSwgMHhDMywgMHg5MywgMHhGMCwgMHg5MywgMHhGMSwgLyogMHhDNC0weEM3ICovCisJMHg5MywgMHhGMiwgMHg5MywgMHhGMywgMHg5MywgMHhGNCwgMHg5MywgMHhGNSwgLyogMHhDOC0weENCICovCisJMHg5MywgMHhGNiwgMHhCMiwgMHhEOSwgMHhDNywgMHhFNiwgMHg5MywgMHhGNywgLyogMHhDQy0weENGICovCisJMHhERiwgMHhBNywgMHg5MywgMHhGOCwgMHhDNywgMHhEQywgMHg5MywgMHhGOSwgLyogMHhEMC0weEQzICovCisJMHg5MywgMHhGQSwgMHg5MywgMHhGQiwgMHg5MywgMHhGQywgMHhERiwgMHhBOCwgLyogMHhENC0weEQ3ICovCisJMHhFQiwgMHhBMiwgMHg5MywgMHhGRCwgMHg5MywgMHhGRSwgMHg5NCwgMHg0MCwgLyogMHhEOC0weERCICovCisJMHg5NCwgMHg0MSwgMHg5NCwgMHg0MiwgMHhDQiwgMHhEMywgMHg5NCwgMHg0MywgLyogMHhEQy0weERGICovCisJMHg5NCwgMHg0NCwgMHg5NCwgMHg0NSwgMHhERiwgMHhBQSwgMHg5NCwgMHg0NiwgLyogMHhFMC0weEUzICovCisJMHhERiwgMHhBOSwgMHg5NCwgMHg0NywgMHhCMiwgMHhDMSwgMHg5NCwgMHg0OCwgLyogMHhFNC0weEU3ICovCisJMHg5NCwgMHg0OSwgMHg5NCwgMHg0QSwgMHg5NCwgMHg0QiwgMHg5NCwgMHg0QywgLyogMHhFOC0weEVCICovCisJMHg5NCwgMHg0RCwgMHg5NCwgMHg0RSwgMHg5NCwgMHg0RiwgMHg5NCwgMHg1MCwgLyogMHhFQy0weEVGICovCisJMHg5NCwgMHg1MSwgMHg5NCwgMHg1MiwgMHg5NCwgMHg1MywgMHg5NCwgMHg1NCwgLyogMHhGMC0weEYzICovCisJMHg5NCwgMHg1NSwgMHg5NCwgMHg1NiwgMHg5NCwgMHg1NywgMHg5NCwgMHg1OCwgLyogMHhGNC0weEY3ICovCisJMHg5NCwgMHg1OSwgMHg5NCwgMHg1QSwgMHg5NCwgMHg1QiwgMHg5NCwgMHg1QywgLyogMHhGOC0weEZCICovCisJMHg5NCwgMHg1RCwgMHg5NCwgMHg1RSwgMHg5NCwgMHg1RiwgMHg5NCwgMHg2MCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjVbNTEyXSA9IHsKKwkweEM1LCAweENBLCAweDk0LCAweDYxLCAweDk0LCAweDYyLCAweDk0LCAweDYzLCAvKiAweDAwLTB4MDMgKi8KKwkweDk0LCAweDY0LCAweDk0LCAweDY1LCAweDk0LCAweDY2LCAweDk0LCAweDY3LCAvKiAweDA0LTB4MDcgKi8KKwkweDk0LCAweDY4LCAweERGLCAweEFCLCAweDk0LCAweDY5LCAweDk0LCAweDZBLCAvKiAweDA4LTB4MEIgKi8KKwkweDk0LCAweDZCLCAweDk0LCAweDZDLCAweDk0LCAweDZELCAweDk0LCAweDZFLCAvKiAweDBDLTB4MEYgKi8KKwkweDk0LCAweDZGLCAweDk0LCAweDcwLCAweEQ0LCAweERDLCAweDk0LCAweDcxLCAvKiAweDEwLTB4MTMgKi8KKwkweDk0LCAweDcyLCAweDk0LCAweDczLCAweDk0LCAweDc0LCAweDk0LCAweDc1LCAvKiAweDE0LTB4MTcgKi8KKwkweEM4LCAweEMxLCAweDk0LCAweDc2LCAweDk0LCAweDc3LCAweDk0LCAweDc4LCAvKiAweDE4LTB4MUIgKi8KKwkweDk0LCAweDc5LCAweDk0LCAweDdBLCAweDk0LCAweDdCLCAweDk0LCAweDdDLCAvKiAweDFDLTB4MUYgKi8KKwkweDk0LCAweDdELCAweDk0LCAweDdFLCAweDk0LCAweDgwLCAweDk0LCAweDgxLCAvKiAweDIwLTB4MjMgKi8KKwkweDk0LCAweDgyLCAweERGLCAweEFDLCAweDk0LCAweDgzLCAweDk0LCAweDg0LCAvKiAweDI0LTB4MjcgKi8KKwkweDk0LCAweDg1LCAweDk0LCAweDg2LCAweDk0LCAweDg3LCAweEJFLCAweEYwLCAvKiAweDI4LTB4MkIgKi8KKwkweDk0LCAweDg4LCAweDk0LCAweDg5LCAweERGLCAweEFELCAweEQ2LCAweEE3LCAvKiAweDJDLTB4MkYgKi8KKwkweDk0LCAweDhBLCAweDk0LCAweDhCLCAweDk0LCAweDhDLCAweDk0LCAweDhELCAvKiAweDMwLTB4MzMgKi8KKwkweEVBLCAweEI3LCAweEVCLCAweEI2LCAweENBLCAweEQ1LCAweDk0LCAweDhFLCAvKiAweDM0LTB4MzcgKi8KKwkweEQ4LCAweEZDLCAweEI4LCAweEM0LCAweDk0LCAweDhGLCAweEI5LCAweEE1LCAvKiAweDM4LTB4M0IgKi8KKwkweDk0LCAweDkwLCAweDk0LCAweDkxLCAweEI3LCAweEM1LCAweEQ1LCAweEZFLCAvKiAweDNDLTB4M0YgKi8KKwkweDk0LCAweDkyLCAweDk0LCAweDkzLCAweDk0LCAweDk0LCAweDk0LCAweDk1LCAvKiAweDQwLTB4NDMgKi8KKwkweDk0LCAweDk2LCAweEI5LCAweENBLCAweDk0LCAweDk3LCAweDk0LCAweDk4LCAvKiAweDQ0LTB4NDcgKi8KKwkweEQwLCAweEE3LCAweEY0LCAweENELCAweDk0LCAweDk5LCAweDk0LCAweDlBLCAvKiAweDQ4LTB4NEIgKi8KKwkweEI1LCAweEQwLCAweDk0LCAweDlCLCAweDk0LCAweDlDLCAweEMzLCAweEY0LCAvKiAweDRDLTB4NEYgKi8KKwkweDk0LCAweDlELCAweEJFLCAweEM4LCAweDk0LCAweDlFLCAweDk0LCAweDlGLCAvKiAweDUwLTB4NTMgKi8KKwkweDk0LCAweEEwLCAweEVCLCAweEI3LCAweEIwLCAweEJELCAweDk0LCAweEExLCAvKiAweDU0LTB4NTcgKi8KKwkweDk0LCAweEEyLCAweEJELCAweENDLCAweDk0LCAweEEzLCAweEMxLCAweEIyLCAvKiAweDU4LTB4NUIgKi8KKwkweDk0LCAweEE0LCAweEIxLCAweEQ2LCAweEIzLCAweEE4LCAweDk0LCAweEE1LCAvKiAweDVDLTB4NUYgKi8KKwkweDk0LCAweEE2LCAweDk0LCAweEE3LCAweEI4LCAweEQyLCAweEM5LCAweEEyLCAvKiAweDYwLTB4NjMgKi8KKwkweDk0LCAweEE4LCAweDk0LCAweEE5LCAweEI2LCAweEQ4LCAweDk0LCAweEFBLCAvKiAweDY0LTB4NjcgKi8KKwkweDk0LCAweEFCLCAweDk0LCAweEFDLCAweDk0LCAweEFELCAweEVCLCAweEI4LCAvKiAweDY4LTB4NkIgKi8KKwkweEJFLCAweEI0LCAweDk0LCAweEFFLCAweDk0LCAweEFGLCAweDk0LCAweEIwLCAvKiAweDZDLTB4NkYgKi8KKwkweENBLCAweEZELCAweDk0LCAweEIxLCAweEM3LCAweEMzLCAweDk0LCAweEIyLCAvKiAweDcwLTB4NzMgKi8KKwkweEQ1LCAweEZCLCAweDk0LCAweEIzLCAweDk0LCAweEI0LCAweEI3LCAweEYzLCAvKiAweDc0LTB4NzcgKi8KKwkweDk0LCAweEI1LCAweDk0LCAweEI2LCAweDk0LCAweEI3LCAweDk0LCAweEI4LCAvKiAweDc4LTB4N0IgKi8KKwkweDk0LCAweEI5LCAweDk0LCAweEJBLCAweDk0LCAweEJCLCAweDk0LCAweEJDLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDk0LCAweEJELCAweDk0LCAweEJFLCAweDk0LCAweEJGLCAweDk0LCAweEMwLCAvKiAweDgwLTB4ODMgKi8KKwkweDk0LCAweEMxLCAweDk0LCAweEMyLCAweDk0LCAweEMzLCAweENFLCAweEM0LCAvKiAweDg0LTB4ODcgKi8KKwkweDk0LCAweEM0LCAweDk0LCAweEM1LCAweDk0LCAweEM2LCAweEQ1LCAweEFCLCAvKiAweDg4LTB4OEIgKi8KKwkweEIxLCAweEYzLCAweDk0LCAweEM3LCAweDk0LCAweEM4LCAweDk0LCAweEM5LCAvKiAweDhDLTB4OEYgKi8KKwkweEVDLCAweEIzLCAweEIwLCAweERGLCAweDk0LCAweENBLCAweEVDLCAweEI1LCAvKiAweDkwLTB4OTMgKi8KKwkweDk0LCAweENCLCAweDk0LCAweENDLCAweDk0LCAweENELCAweEI2LCAweEI3LCAvKiAweDk0LTB4OTcgKi8KKwkweDk0LCAweENFLCAweEMxLCAweENGLCAweDk0LCAweENGLCAweEY1LCAweEZBLCAvKiAweDk4LTB4OUIgKi8KKwkweEQwLCAweEIxLCAweDk0LCAweEQwLCAweDk0LCAweEQxLCAweEQ1LCAweEU1LCAvKiAweDlDLTB4OUYgKi8KKwkweDk0LCAweEQyLCAweENFLCAweEQzLCAweDk0LCAweEQzLCAweDk0LCAweEQ0LCAvKiAweEEwLTB4QTMgKi8KKwkweEJELCAweEVGLCAweEIzLCAweEUyLCAweDk0LCAweEQ1LCAweEI4LCAweEFCLCAvKiAweEE0LTB4QTcgKi8KKwkweDk0LCAweEQ2LCAweEQ1LCAweEI2LCAweDk0LCAweEQ3LCAweEVELCAweEJELCAvKiAweEE4LTB4QUIgKi8KKwkweDk0LCAweEQ4LCAweEI2LCAweENGLCAweDk0LCAweEQ5LCAweENCLCAweEI5LCAvKiAweEFDLTB4QUYgKi8KKwkweEQwLCAweEMyLCAweDk0LCAweERBLCAweDk0LCAweERCLCAweDk0LCAweERDLCAvKiAweEIwLTB4QjMgKi8KKwkweDk0LCAweERELCAweDk0LCAweERFLCAweDk0LCAweERGLCAweDk0LCAweEUwLCAvKiAweEI0LTB4QjcgKi8KKwkweDk0LCAweEUxLCAweEI3LCAweEJELCAweDk0LCAweEUyLCAweDk0LCAweEUzLCAvKiAweEI4LTB4QkIgKi8KKwkweEVDLCAweEI2LCAweENBLCAweEE5LCAweDk0LCAweEU0LCAweDk0LCAweEU1LCAvKiAweEJDLTB4QkYgKi8KKwkweDk0LCAweEU2LCAweEM1LCAweEQ0LCAweDk0LCAweEU3LCAweEVDLCAweEI5LCAvKiAweEMwLTB4QzMgKi8KKwkweEVDLCAweEI4LCAweEMyLCAweEMzLCAweEVDLCAweEI3LCAweDk0LCAweEU4LCAvKiAweEM0LTB4QzcgKi8KKwkweDk0LCAweEU5LCAweDk0LCAweEVBLCAweDk0LCAweEVCLCAweEQwLCAweEZELCAvKiAweEM4LTB4Q0IgKi8KKwkweEVDLCAweEJBLCAweDk0LCAweEVDLCAweEVDLCAweEJCLCAweEQ3LCAweEU1LCAvKiAweENDLTB4Q0YgKi8KKwkweDk0LCAweEVELCAweDk0LCAweEVFLCAweEVDLCAweEJDLCAweDk0LCAweEVGLCAvKiAweEQwLTB4RDMgKi8KKwkweDk0LCAweEYwLCAweDk0LCAweEYxLCAweEVDLCAweEJELCAweEM2LCAweEVDLCAvKiAweEQ0LTB4RDcgKi8KKwkweDk0LCAweEYyLCAweDk0LCAweEYzLCAweDk0LCAweEY0LCAweDk0LCAweEY1LCAvKiAweEQ4LTB4REIgKi8KKwkweDk0LCAweEY2LCAweDk0LCAweEY3LCAweDk0LCAweEY4LCAweDk0LCAweEY5LCAvKiAweERDLTB4REYgKi8KKwkweENFLCAweERFLCAweDk0LCAweEZBLCAweEJDLCAweEM4LCAweDk0LCAweEZCLCAvKiAweEUwLTB4RTMgKi8KKwkweDk0LCAweEZDLCAweEM4LCAweEQ1LCAweEI1LCAweEE5LCAweEJFLCAweEM5LCAvKiAweEU0LTB4RTcgKi8KKwkweEQ2LCAweEJDLCAweEQ0LCAweEU3LCAweDk0LCAweEZELCAweDk0LCAweEZFLCAvKiAweEU4LTB4RUIgKi8KKwkweEQxLCAweEFFLCAweEQwLCAweEYxLCAweEVBLCAweEI4LCAweEVBLCAweEI5LCAvKiAweEVDLTB4RUYgKi8KKwkweEVBLCAweEJBLCAweEJBLCAweEI1LCAweDk1LCAweDQwLCAweDk1LCAweDQxLCAvKiAweEYwLTB4RjMgKi8KKwkweDk1LCAweDQyLCAweDk1LCAweDQzLCAweENBLCAweEIxLCAweEJGLCAweEY1LCAvKiAweEY0LTB4RjcgKi8KKwkweDk1LCAweDQ0LCAweDk1LCAweDQ1LCAweENELCAweEZBLCAweDk1LCAweDQ2LCAvKiAweEY4LTB4RkIgKi8KKwkweDk1LCAweDQ3LCAweDk1LCAweDQ4LCAweDk1LCAweDQ5LCAweDk1LCAweDRBLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182Nls1MTJdID0geworCTB4RUEsIDB4QzAsIDB4OTUsIDB4NEIsIDB4QjAsIDB4QkEsIDB4RUEsIDB4QkUsIC8qIDB4MDAtMHgwMyAqLworCTB4OTUsIDB4NEMsIDB4OTUsIDB4NEQsIDB4QzAsIDB4QTUsIDB4OTUsIDB4NEUsIC8qIDB4MDQtMHgwNyAqLworCTB4OTUsIDB4NEYsIDB4OTUsIDB4NTAsIDB4RUEsIDB4QkIsIDB4OTUsIDB4NTEsIC8qIDB4MDgtMHgwQiAqLworCTB4QjIsIDB4RkQsIDB4OTUsIDB4NTIsIDB4QzMsIDB4RjcsIDB4QkIsIDB4RTgsIC8qIDB4MEMtMHgwRiAqLworCTB4OTUsIDB4NTMsIDB4OTUsIDB4NTQsIDB4OTUsIDB4NTUsIDB4RDIsIDB4RDcsIC8qIDB4MTAtMHgxMyAqLworCTB4Q0UsIDB4RjQsIDB4RUEsIDB4QkYsIDB4OTUsIDB4NTYsIDB4OTUsIDB4NTcsIC8qIDB4MTQtMHgxNyAqLworCTB4OTUsIDB4NTgsIDB4RUEsIDB4QkMsIDB4OTUsIDB4NTksIDB4OTUsIDB4NUEsIC8qIDB4MTgtMHgxQiAqLworCTB4OTUsIDB4NUIsIDB4RUEsIDB4QzMsIDB4OTUsIDB4NUMsIDB4RDAsIDB4QzcsIC8qIDB4MUMtMHgxRiAqLworCTB4RDMsIDB4QjMsIDB4OTUsIDB4NUQsIDB4OTUsIDB4NUUsIDB4OTUsIDB4NUYsIC8qIDB4MjAtMHgyMyAqLworCTB4OTUsIDB4NjAsIDB4QjQsIDB4QkEsIDB4OTUsIDB4NjEsIDB4QzMsIDB4QzEsIC8qIDB4MjQtMHgyNyAqLworCTB4RDcsIDB4RjIsIDB4OTUsIDB4NjIsIDB4OTUsIDB4NjMsIDB4OTUsIDB4NjQsIC8qIDB4MjgtMHgyQiAqLworCTB4OTUsIDB4NjUsIDB4RDUsIDB4RDEsIDB4OTUsIDB4NjYsIDB4Q0EsIDB4QzcsIC8qIDB4MkMtMHgyRiAqLworCTB4OTUsIDB4NjcsIDB4RUEsIDB4QzUsIDB4OTUsIDB4NjgsIDB4OTUsIDB4NjksIC8qIDB4MzAtMHgzMyAqLworCTB4RUEsIDB4QzQsIDB4RUEsIDB4QzcsIDB4RUEsIDB4QzYsIDB4OTUsIDB4NkEsIC8qIDB4MzQtMHgzNyAqLworCTB4OTUsIDB4NkIsIDB4OTUsIDB4NkMsIDB4OTUsIDB4NkQsIDB4OTUsIDB4NkUsIC8qIDB4MzgtMHgzQiAqLworCTB4RDYsIDB4RTcsIDB4OTUsIDB4NkYsIDB4Q0YsIDB4RDQsIDB4OTUsIDB4NzAsIC8qIDB4M0MtMHgzRiAqLworCTB4OTUsIDB4NzEsIDB4RUEsIDB4Q0IsIDB4OTUsIDB4NzIsIDB4QkIsIDB4Q0UsIC8qIDB4NDAtMHg0MyAqLworCTB4OTUsIDB4NzMsIDB4OTUsIDB4NzQsIDB4OTUsIDB4NzUsIDB4OTUsIDB4NzYsIC8qIDB4NDQtMHg0NyAqLworCTB4OTUsIDB4NzcsIDB4OTUsIDB4NzgsIDB4OTUsIDB4NzksIDB4QkQsIDB4RkEsIC8qIDB4NDgtMHg0QiAqLworCTB4QzksIDB4Q0UsIDB4OTUsIDB4N0EsIDB4OTUsIDB4N0IsIDB4RUEsIDB4Q0MsIC8qIDB4NEMtMHg0RiAqLworCTB4OTUsIDB4N0MsIDB4OTUsIDB4N0QsIDB4QzksIDB4QjksIDB4Q0YsIDB4RkUsIC8qIDB4NTAtMHg1MyAqLworCTB4RUEsIDB4Q0EsIDB4RDQsIDB4Q0UsIDB4RUEsIDB4Q0QsIDB4RUEsIDB4Q0YsIC8qIDB4NTQtMHg1NyAqLworCTB4OTUsIDB4N0UsIDB4OTUsIDB4ODAsIDB4Q0QsIDB4RUQsIDB4OTUsIDB4ODEsIC8qIDB4NTgtMHg1QiAqLworCTB4OTUsIDB4ODIsIDB4OTUsIDB4ODMsIDB4OTUsIDB4ODQsIDB4RUEsIDB4QzksIC8qIDB4NUMtMHg1RiAqLworCTB4OTUsIDB4ODUsIDB4RUEsIDB4Q0UsIDB4OTUsIDB4ODYsIDB4OTUsIDB4ODcsIC8qIDB4NjAtMHg2MyAqLworCTB4Q0UsIDB4RUUsIDB4OTUsIDB4ODgsIDB4QkIsIDB4REUsIDB4OTUsIDB4ODksIC8qIDB4NjQtMHg2NyAqLworCTB4QjMsIDB4QkYsIDB4OTUsIDB4OEEsIDB4OTUsIDB4OEIsIDB4OTUsIDB4OEMsIC8qIDB4NjgtMHg2QiAqLworCTB4OTUsIDB4OEQsIDB4OTUsIDB4OEUsIDB4QzYsIDB4RDUsIDB4QkUsIDB4QjAsIC8qIDB4NkMtMHg2RiAqLworCTB4Q0UsIDB4RkEsIDB4OTUsIDB4OEYsIDB4OTUsIDB4OTAsIDB4OTUsIDB4OTEsIC8qIDB4NzAtMHg3MyAqLworCTB4QzcsIDB4RTcsIDB4OTUsIDB4OTIsIDB4QkUsIDB4QTcsIDB4RUEsIDB4RDAsIC8qIDB4NzQtMHg3NyAqLworCTB4OTUsIDB4OTMsIDB4OTUsIDB4OTQsIDB4RDYsIDB4QzcsIDB4OTUsIDB4OTUsIC8qIDB4NzgtMHg3QiAqLworCTB4OTUsIDB4OTYsIDB4OTUsIDB4OTcsIDB4QzEsIDB4QzAsIDB4OTUsIDB4OTgsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OTUsIDB4OTksIDB4OTUsIDB4OUEsIDB4RDQsIDB4REQsIDB4OTUsIDB4OUIsIC8qIDB4ODAtMHg4MyAqLworCTB4RUEsIDB4RDEsIDB4OTUsIDB4OUMsIDB4OTUsIDB4OUQsIDB4Q0YsIDB4QkUsIC8qIDB4ODQtMHg4NyAqLworCTB4OTUsIDB4OUUsIDB4OTUsIDB4OUYsIDB4OTUsIDB4QTAsIDB4OTUsIDB4QTEsIC8qIDB4ODgtMHg4QiAqLworCTB4RUEsIDB4RDIsIDB4OTUsIDB4QTIsIDB4OTUsIDB4QTMsIDB4OTUsIDB4QTQsIC8qIDB4OEMtMHg4RiAqLworCTB4OTUsIDB4QTUsIDB4Q0EsIDB4RUUsIDB4OTUsIDB4QTYsIDB4OTUsIDB4QTcsIC8qIDB4OTAtMHg5MyAqLworCTB4OTUsIDB4QTgsIDB4OTUsIDB4QTksIDB4QzUsIDB4QUYsIDB4QjAsIDB4QjUsIC8qIDB4OTQtMHg5NyAqLworCTB4OTUsIDB4QUEsIDB4OTUsIDB4QUIsIDB4OTUsIDB4QUMsIDB4OTUsIDB4QUQsIC8qIDB4OTgtMHg5QiAqLworCTB4OTUsIDB4QUUsIDB4RUEsIDB4RDQsIDB4OTUsIDB4QUYsIDB4OTUsIDB4QjAsIC8qIDB4OUMtMHg5RiAqLworCTB4OTUsIDB4QjEsIDB4OTUsIDB4QjIsIDB4OTUsIDB4QjMsIDB4OTUsIDB4QjQsIC8qIDB4QTAtMHhBMyAqLworCTB4OTUsIDB4QjUsIDB4OTUsIDB4QjYsIDB4OTUsIDB4QjcsIDB4RUEsIDB4RDMsIC8qIDB4QTQtMHhBNyAqLworCTB4RjQsIDB4REYsIDB4OTUsIDB4QjgsIDB4OTUsIDB4QjksIDB4OTUsIDB4QkEsIC8qIDB4QTgtMHhBQiAqLworCTB4OTUsIDB4QkIsIDB4OTUsIDB4QkMsIDB4QzQsIDB4QkEsIDB4OTUsIDB4QkQsIC8qIDB4QUMtMHhBRiAqLworCTB4OTUsIDB4QkUsIDB4OTUsIDB4QkYsIDB4OTUsIDB4QzAsIDB4OTUsIDB4QzEsIC8qIDB4QjAtMHhCMyAqLworCTB4QjEsIDB4QTksIDB4OTUsIDB4QzIsIDB4OTUsIDB4QzMsIDB4OTUsIDB4QzQsIC8qIDB4QjQtMHhCNyAqLworCTB4OTUsIDB4QzUsIDB4RTUsIDB4REYsIDB4OTUsIDB4QzYsIDB4OTUsIDB4QzcsIC8qIDB4QjgtMHhCQiAqLworCTB4OTUsIDB4QzgsIDB4OTUsIDB4QzksIDB4RUEsIDB4RDUsIDB4OTUsIDB4Q0EsIC8qIDB4QkMtMHhCRiAqLworCTB4OTUsIDB4Q0IsIDB4OTUsIDB4Q0MsIDB4OTUsIDB4Q0QsIDB4OTUsIDB4Q0UsIC8qIDB4QzAtMHhDMyAqLworCTB4OTUsIDB4Q0YsIDB4OTUsIDB4RDAsIDB4OTUsIDB4RDEsIDB4OTUsIDB4RDIsIC8qIDB4QzQtMHhDNyAqLworCTB4OTUsIDB4RDMsIDB4OTUsIDB4RDQsIDB4OTUsIDB4RDUsIDB4OTUsIDB4RDYsIC8qIDB4QzgtMHhDQiAqLworCTB4OTUsIDB4RDcsIDB4OTUsIDB4RDgsIDB4OTUsIDB4RDksIDB4OTUsIDB4REEsIC8qIDB4Q0MtMHhDRiAqLworCTB4OTUsIDB4REIsIDB4OTUsIDB4REMsIDB4OTUsIDB4REQsIDB4OTUsIDB4REUsIC8qIDB4RDAtMHhEMyAqLworCTB4OTUsIDB4REYsIDB4OTUsIDB4RTAsIDB4OTUsIDB4RTEsIDB4OTUsIDB4RTIsIC8qIDB4RDQtMHhENyAqLworCTB4OTUsIDB4RTMsIDB4Q0EsIDB4RUYsIDB4OTUsIDB4RTQsIDB4RUEsIDB4RDYsIC8qIDB4RDgtMHhEQiAqLworCTB4RUEsIDB4RDcsIDB4QzYsIDB4RDgsIDB4OTUsIDB4RTUsIDB4OTUsIDB4RTYsIC8qIDB4REMtMHhERiAqLworCTB4OTUsIDB4RTcsIDB4OTUsIDB4RTgsIDB4OTUsIDB4RTksIDB4OTUsIDB4RUEsIC8qIDB4RTAtMHhFMyAqLworCTB4OTUsIDB4RUIsIDB4OTUsIDB4RUMsIDB4RUEsIDB4RDgsIDB4OTUsIDB4RUQsIC8qIDB4RTQtMHhFNyAqLworCTB4OTUsIDB4RUUsIDB4RUEsIDB4RDksIDB4OTUsIDB4RUYsIDB4OTUsIDB4RjAsIC8qIDB4RTgtMHhFQiAqLworCTB4OTUsIDB4RjEsIDB4OTUsIDB4RjIsIDB4OTUsIDB4RjMsIDB4OTUsIDB4RjQsIC8qIDB4RUMtMHhFRiAqLworCTB4RDQsIDB4QkIsIDB4OTUsIDB4RjUsIDB4QzcsIDB4RkEsIDB4RDIsIDB4QjcsIC8qIDB4RjAtMHhGMyAqLworCTB4QjgsIDB4RkMsIDB4OTUsIDB4RjYsIDB4OTUsIDB4RjcsIDB4RUEsIDB4QzIsIC8qIDB4RjQtMHhGNyAqLworCTB4OTUsIDB4RjgsIDB4QjIsIDB4REMsIDB4OTUsIDB4RjksIDB4OTUsIDB4RkEsIC8qIDB4RjgtMHhGQiAqLworCTB4QzIsIDB4RkMsIDB4OTUsIDB4RkIsIDB4RDQsIDB4RjgsIDB4Q0MsIDB4RTYsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzY3WzUxMl0gPSB7CisJMHhENywgMHhFRSwgMHg5NSwgMHhGQywgMHg5NSwgMHhGRCwgMHg5NSwgMHhGRSwgLyogMHgwMC0weDAzICovCisJMHg5NiwgMHg0MCwgMHg5NiwgMHg0MSwgMHg5NiwgMHg0MiwgMHg5NiwgMHg0MywgLyogMHgwNC0weDA3ICovCisJMHhENCwgMHhDMiwgMHhEMywgMHhEMCwgMHhFQiwgMHhDMywgMHhDNSwgMHhGMywgLyogMHgwOC0weDBCICovCisJMHg5NiwgMHg0NCwgMHhCNywgMHhGRSwgMHg5NiwgMHg0NSwgMHg5NiwgMHg0NiwgLyogMHgwQy0weDBGICovCisJMHhFQiwgMHhENCwgMHg5NiwgMHg0NywgMHg5NiwgMHg0OCwgMHg5NiwgMHg0OSwgLyogMHgxMC0weDEzICovCisJMHhDQiwgMHhCNywgMHhFQiwgMHhERSwgMHg5NiwgMHg0QSwgMHhDMCwgMHhDQSwgLyogMHgxNC0weDE3ICovCisJMHg5NiwgMHg0QiwgMHg5NiwgMHg0QywgMHg5NiwgMHg0RCwgMHhDRCwgMHhGQiwgLyogMHgxOC0weDFCICovCisJMHg5NiwgMHg0RSwgMHhCMywgMHhBRiwgMHg5NiwgMHg0RiwgMHhDNiwgMHhEQSwgLyogMHgxQy0weDFGICovCisJMHg5NiwgMHg1MCwgMHg5NiwgMHg1MSwgMHg5NiwgMHg1MiwgMHg5NiwgMHg1MywgLyogMHgyMC0weDIzICovCisJMHg5NiwgMHg1NCwgMHg5NiwgMHg1NSwgMHhFQiwgMHhGQywgMHg5NiwgMHg1NiwgLyogMHgyNC0weDI3ICovCisJMHhDNCwgMHhCRSwgMHg5NiwgMHg1NywgMHhDRSwgMHhCNCwgMHhDNCwgMHhBOSwgLyogMHgyOC0weDJCICovCisJMHhCMSwgMHhCRSwgMHhENCwgMHhGRCwgMHg5NiwgMHg1OCwgMHhDQSwgMHhGNSwgLyogMHgyQy0weDJGICovCisJMHg5NiwgMHg1OSwgMHhENiwgMHhFQywgMHg5NiwgMHg1QSwgMHg5NiwgMHg1QiwgLyogMHgzMC0weDMzICovCisJMHhDNiwgMHhEMywgMHhCNiwgMHhFNCwgMHg5NiwgMHg1QywgMHg5NiwgMHg1RCwgLyogMHgzNC0weDM3ICovCisJMHg5NiwgMHg1RSwgMHg5NiwgMHg1RiwgMHhCQiwgMHhGQSwgMHg5NiwgMHg2MCwgLyogMHgzOC0weDNCICovCisJMHg5NiwgMHg2MSwgMHhEMCwgMHhFMCwgMHg5NiwgMHg2MiwgMHg5NiwgMHg2MywgLyogMHgzQy0weDNGICovCisJMHhDOSwgMHhCMSwgMHg5NiwgMHg2NCwgMHhENCwgMHhEMywgMHhDOCwgMHhBOCwgLyogMHg0MC0weDQzICovCisJMHg5NiwgMHg2NSwgMHg5NiwgMHg2NiwgMHhCOCwgMHhDQiwgMHg5NiwgMHg2NywgLyogMHg0NC0weDQ3ICovCisJMHhFOCwgMHhCRSwgMHhDOSwgMHhCQywgMHg5NiwgMHg2OCwgMHg5NiwgMHg2OSwgLyogMHg0OC0weDRCICovCisJMHhFOCwgMHhCQiwgMHg5NiwgMHg2QSwgMHhDMCwgMHhFRSwgMHhEMCwgMHhEMywgLyogMHg0Qy0weDRGICovCisJMHhCMiwgMHhDNCwgMHhCNCwgMHhFNSwgMHg5NiwgMHg2QiwgMHhFOCwgMHhCQywgLyogMHg1MC0weDUzICovCisJMHg5NiwgMHg2QywgMHg5NiwgMHg2RCwgMHhENSwgMHhDOCwgMHg5NiwgMHg2RSwgLyogMHg1NC0weDU3ICovCisJMHg5NiwgMHg2RiwgMHg5NiwgMHg3MCwgMHg5NiwgMHg3MSwgMHg5NiwgMHg3MiwgLyogMHg1OC0weDVCICovCisJMHhCNiwgMHhDNSwgMHg5NiwgMHg3MywgMHhFOCwgMHhCRCwgMHhDQSwgMHhGOCwgLyogMHg1Qy0weDVGICovCisJMHhCOCwgMHhEQywgMHhDQywgMHhGNSwgMHg5NiwgMHg3NCwgMHg5NiwgMHg3NSwgLyogMHg2MC0weDYzICovCisJMHg5NiwgMHg3NiwgMHhDMCwgMHhCNCwgMHg5NiwgMHg3NywgMHg5NiwgMHg3OCwgLyogMHg2NC0weDY3ICovCisJMHhEMSwgMHhFRSwgMHhFOCwgMHhCRiwgMHhFOCwgMHhDMiwgMHg5NiwgMHg3OSwgLyogMHg2OC0weDZCICovCisJMHg5NiwgMHg3QSwgMHhCQSwgMHhCQywgMHg5NiwgMHg3QiwgMHhCMSwgMHhBRCwgLyogMHg2Qy0weDZGICovCisJMHhCRCwgMHhEQywgMHg5NiwgMHg3QywgMHhFQSwgMHhCRCwgMHhFOCwgMHhDMywgLyogMHg3MC0weDczICovCisJMHg5NiwgMHg3RCwgMHhFOCwgMHhDNiwgMHg5NiwgMHg3RSwgMHhFOCwgMHhDQiwgLyogMHg3NC0weDc3ICovCisJMHg5NiwgMHg4MCwgMHg5NiwgMHg4MSwgMHg5NiwgMHg4MiwgMHg5NiwgMHg4MywgLyogMHg3OC0weDdCICovCisJMHhFOCwgMHhDQywgMHg5NiwgMHg4NCwgMHhDQiwgMHhDOSwgMHhCMCwgMHhFNSwgLyogMHg3Qy0weDdGICovCisJCisJMHg5NiwgMHg4NSwgMHhCQywgMHhBQiwgMHg5NiwgMHg4NiwgMHg5NiwgMHg4NywgLyogMHg4MC0weDgzICovCisJMHhCOSwgMHhCOSwgMHg5NiwgMHg4OCwgMHg5NiwgMHg4OSwgMHhFOCwgMHhDMSwgLyogMHg4NC0weDg3ICovCisJMHg5NiwgMHg4QSwgMHhDRCwgMHhGNywgMHg5NiwgMHg4QiwgMHhFOCwgMHhDQSwgLyogMHg4OC0weDhCICovCisJMHg5NiwgMHg4QywgMHg5NiwgMHg4RCwgMHg5NiwgMHg4RSwgMHg5NiwgMHg4RiwgLyogMHg4Qy0weDhGICovCisJMHhDRSwgMHhGNiwgMHg5NiwgMHg5MCwgMHg5NiwgMHg5MSwgMHg5NiwgMHg5MiwgLyogMHg5MC0weDkzICovCisJMHg5NiwgMHg5MywgMHhENSwgMHhFRCwgMHg5NiwgMHg5NCwgMHhDMSwgMHhENiwgLyogMHg5NC0weDk3ICovCisJMHhFOCwgMHhDNCwgMHg5NiwgMHg5NSwgMHhDMywgMHhCNiwgMHg5NiwgMHg5NiwgLyogMHg5OC0weDlCICovCisJMHhCOSwgMHhGQiwgMHhENiwgMHhBNiwgMHhFOCwgMHhDOCwgMHg5NiwgMHg5NywgLyogMHg5Qy0weDlGICovCisJMHg5NiwgMHg5OCwgMHg5NiwgMHg5OSwgMHhDQSwgMHhFMCwgMHhENCwgMHhFNiwgLyogMHhBMC0weEEzICovCisJMHg5NiwgMHg5QSwgMHhFOCwgMHhDMCwgMHg5NiwgMHg5QiwgMHhFOCwgMHhDNSwgLyogMHhBNC0weEE3ICovCisJMHhFOCwgMHhDNywgMHg5NiwgMHg5QywgMHhDNywgMHhCOSwgMHhCNywgMHhFMywgLyogMHhBOC0weEFCICovCisJMHg5NiwgMHg5RCwgMHhFOCwgMHhDOSwgMHg5NiwgMHg5RSwgMHhCRiwgMHhERCwgLyogMHhBQy0weEFGICovCisJMHhFOCwgMHhEMiwgMHg5NiwgMHg5RiwgMHg5NiwgMHhBMCwgMHhFOCwgMHhENywgLyogMHhCMC0weEIzICovCisJMHg5NiwgMHhBMSwgMHhFOCwgMHhENSwgMHhCQywgMHhEQywgMHhCQywgMHhDRiwgLyogMHhCNC0weEI3ICovCisJMHhFOCwgMHhEQiwgMHg5NiwgMHhBMiwgMHg5NiwgMHhBMywgMHg5NiwgMHhBNCwgLyogMHhCOC0weEJCICovCisJMHg5NiwgMHhBNSwgMHg5NiwgMHhBNiwgMHg5NiwgMHhBNywgMHg5NiwgMHhBOCwgLyogMHhCQy0weEJGICovCisJMHg5NiwgMHhBOSwgMHhFOCwgMHhERSwgMHg5NiwgMHhBQSwgMHhFOCwgMHhEQSwgLyogMHhDMC0weEMzICovCisJMHhCMSwgMHhGQSwgMHg5NiwgMHhBQiwgMHg5NiwgMHhBQywgMHg5NiwgMHhBRCwgLyogMHhDNC0weEM3ICovCisJMHg5NiwgMHhBRSwgMHg5NiwgMHhBRiwgMHg5NiwgMHhCMCwgMHg5NiwgMHhCMSwgLyogMHhDOC0weENCICovCisJMHg5NiwgMHhCMiwgMHg5NiwgMHhCMywgMHg5NiwgMHhCNCwgMHhCMCwgMHhEOCwgLyogMHhDQy0weENGICovCisJMHhDNCwgMHhCMywgMHhCOCwgMHhDQywgMHhDNiwgMHhFMiwgMHhDOCwgMHhCRSwgLyogMHhEMC0weEQzICovCisJMHhDOCwgMHhFMSwgMHg5NiwgMHhCNSwgMHg5NiwgMHhCNiwgMHg5NiwgMHhCNywgLyogMHhENC0weEQ3ICovCisJMHhFOCwgMHhDRiwgMHhFOCwgMHhENCwgMHhFOCwgMHhENiwgMHg5NiwgMHhCOCwgLyogMHhEOC0weERCICovCisJMHhCOSwgMHhGMSwgMHhFOCwgMHhEOCwgMHhENywgMHhGNSwgMHg5NiwgMHhCOSwgLyogMHhEQy0weERGICovCisJMHhDNCwgMHhGQiwgMHg5NiwgMHhCQSwgMHhFOCwgMHhEQywgMHg5NiwgMHhCQiwgLyogMHhFMC0weEUzICovCisJMHg5NiwgMHhCQywgMHhCMiwgMHhFOSwgMHg5NiwgMHhCRCwgMHg5NiwgMHhCRSwgLyogMHhFNC0weEU3ICovCisJMHg5NiwgMHhCRiwgMHhFOCwgMHhEMSwgMHg5NiwgMHhDMCwgMHg5NiwgMHhDMSwgLyogMHhFOC0weEVCICovCisJMHhCQywgMHhFRCwgMHg5NiwgMHhDMiwgMHg5NiwgMHhDMywgMHhCRiwgMHhDMiwgLyogMHhFQy0weEVGICovCisJMHhFOCwgMHhDRCwgMHhENiwgMHhGOSwgMHg5NiwgMHhDNCwgMHhDMSwgMHhGOCwgLyogMHhGMC0weEYzICovCisJMHhCMiwgMHhGMSwgMHg5NiwgMHhDNSwgMHg5NiwgMHhDNiwgMHg5NiwgMHhDNywgLyogMHhGNC0weEY3ICovCisJMHg5NiwgMHhDOCwgMHg5NiwgMHhDOSwgMHg5NiwgMHhDQSwgMHg5NiwgMHhDQiwgLyogMHhGOC0weEZCICovCisJMHg5NiwgMHhDQywgMHhFOCwgMHhERiwgMHg5NiwgMHhDRCwgMHhDQSwgMHhDMSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjhbNTEyXSA9IHsKKwkweEU4LCAweEQ5LCAweDk2LCAweENFLCAweDk2LCAweENGLCAweDk2LCAweEQwLCAvKiAweDAwLTB4MDMgKi8KKwkweDk2LCAweEQxLCAweEQ1LCAweEE0LCAweDk2LCAweEQyLCAweEIxLCAweEVBLCAvKiAweDA0LTB4MDcgKi8KKwkweEQ1LCAweEJCLCAweEU4LCAweENFLCAweEU4LCAweEQwLCAweEI2LCAweEIwLCAvKiAweDA4LTB4MEIgKi8KKwkweEU4LCAweEQzLCAweDk2LCAweEQzLCAweEU4LCAweERELCAweEMwLCAweEI4LCAvKiAweDBDLTB4MEYgKi8KKwkweDk2LCAweEQ0LCAweENBLCAweEY3LCAweDk2LCAweEQ1LCAweENCLCAweEE4LCAvKiAweDEwLTB4MTMgKi8KKwkweDk2LCAweEQ2LCAweDk2LCAweEQ3LCAweEM2LCAweERDLCAweEMwLCAweEY1LCAvKiAweDE0LTB4MTcgKi8KKwkweDk2LCAweEQ4LCAweDk2LCAweEQ5LCAweDk2LCAweERBLCAweDk2LCAweERCLCAvKiAweDE4LTB4MUIgKi8KKwkweDk2LCAweERDLCAweEU4LCAweEU5LCAweDk2LCAweERELCAweDk2LCAweERFLCAvKiAweDFDLTB4MUYgKi8KKwkweDk2LCAweERGLCAweEQwLCAweEEzLCAweDk2LCAweEUwLCAweDk2LCAweEUxLCAvKiAweDIwLTB4MjMgKi8KKwkweDk2LCAweEUyLCAweDk2LCAweEUzLCAweDk2LCAweEU0LCAweDk2LCAweEU1LCAvKiAweDI0LTB4MjcgKi8KKwkweDk2LCAweEU2LCAweEU4LCAweEYyLCAweEQ2LCAweEVBLCAweDk2LCAweEU3LCAvKiAweDI4LTB4MkIgKi8KKwkweDk2LCAweEU4LCAweDk2LCAweEU5LCAweDk2LCAweEVBLCAweDk2LCAweEVCLCAvKiAweDJDLTB4MkYgKi8KKwkweDk2LCAweEVDLCAweDk2LCAweEVELCAweEU4LCAweEUwLCAweEU4LCAweEUxLCAvKiAweDMwLTB4MzMgKi8KKwkweDk2LCAweEVFLCAweDk2LCAweEVGLCAweDk2LCAweEYwLCAweEQxLCAweEY5LCAvKiAweDM0LTB4MzcgKi8KKwkweEJBLCAweENCLCAweEI4LCAweEY5LCAweDk2LCAweEYxLCAweDk2LCAweEYyLCAvKiAweDM4LTB4M0IgKi8KKwkweEI4LCAweEYxLCAweEQ0LCAweEQ0LCAweEU4LCAweEVGLCAweDk2LCAweEYzLCAvKiAweDNDLTB4M0YgKi8KKwkweEU4LCAweEVFLCAweEU4LCAweEVDLCAweEI5LCAweEYwLCAweENDLCAweEQyLCAvKiAweDQwLTB4NDMgKi8KKwkweEU4LCAweEU2LCAweENFLCAweEE2LCAweEJGLCAweEYyLCAweDk2LCAweEY0LCAvKiAweDQ0LTB4NDcgKi8KKwkweEIwLCAweEI4LCAweEU4LCAweEYxLCAweEU4LCAweEYwLCAweDk2LCAweEY1LCAvKiAweDQ4LTB4NEIgKi8KKwkweEQ3LCAweEMwLCAweDk2LCAweEY2LCAweEU4LCAweEU0LCAweDk2LCAweEY3LCAvKiAweDRDLTB4NEYgKi8KKwkweENELCAweEE5LCAweEM5LCAweEEzLCAweDk2LCAweEY4LCAweEJCLCAweEI4LCAvKiAweDUwLTB4NTMgKi8KKwkweEJELCAweERCLCAweEU4LCAweEVBLCAweDk2LCAweEY5LCAweDk2LCAweEZBLCAvKiAweDU0LTB4NTcgKi8KKwkweDk2LCAweEZCLCAweDk2LCAweEZDLCAweDk2LCAweEZELCAweDk2LCAweEZFLCAvKiAweDU4LTB4NUIgKi8KKwkweDk3LCAweDQwLCAweDk3LCAweDQxLCAweDk3LCAweDQyLCAweDk3LCAweDQzLCAvKiAweDVDLTB4NUYgKi8KKwkweEU4LCAweEUyLCAweEU4LCAweEUzLCAweEU4LCAweEU1LCAweEI1LCAweEI1LCAvKiAweDYwLTB4NjMgKi8KKwkweEU4LCAweEU3LCAweEM3LCAweEM1LCAweEU4LCAweEVCLCAweEU4LCAweEVELCAvKiAweDY0LTB4NjcgKi8KKwkweEJELCAweEIwLCAweEQ3LCAweEFFLCAweDk3LCAweDQ0LCAweEU4LCAweEY4LCAvKiAweDY4LTB4NkIgKi8KKwkweDk3LCAweDQ1LCAweDk3LCAweDQ2LCAweDk3LCAweDQ3LCAweDk3LCAweDQ4LCAvKiAweDZDLTB4NkYgKi8KKwkweDk3LCAweDQ5LCAweDk3LCAweDRBLCAweDk3LCAweDRCLCAweDk3LCAweDRDLCAvKiAweDcwLTB4NzMgKi8KKwkweEU4LCAweEY1LCAweDk3LCAweDRELCAweENELCAweEIwLCAweEU4LCAweEY2LCAvKiAweDc0LTB4NzcgKi8KKwkweDk3LCAweDRFLCAweDk3LCAweDRGLCAweDk3LCAweDUwLCAweDk3LCAweDUxLCAvKiAweDc4LTB4N0IgKi8KKwkweDk3LCAweDUyLCAweDk3LCAweDUzLCAweDk3LCAweDU0LCAweDk3LCAweDU1LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDk3LCAweDU2LCAweEMxLCAweEJBLCAweDk3LCAweDU3LCAweEU4LCAweEU4LCAvKiAweDgwLTB4ODMgKi8KKwkweDk3LCAweDU4LCAweEMzLCAweEI3LCAweEIwLCAweEYwLCAweDk3LCAweDU5LCAvKiAweDg0LTB4ODcgKi8KKwkweDk3LCAweDVBLCAweDk3LCAweDVCLCAweDk3LCAweDVDLCAweDk3LCAweDVELCAvKiAweDg4LTB4OEIgKi8KKwkweDk3LCAweDVFLCAweDk3LCAweDVGLCAweDk3LCAweDYwLCAweEU4LCAweEY0LCAvKiAweDhDLTB4OEYgKi8KKwkweDk3LCAweDYxLCAweDk3LCAweDYyLCAweDk3LCAweDYzLCAweEU4LCAweEY3LCAvKiAweDkwLTB4OTMgKi8KKwkweDk3LCAweDY0LCAweDk3LCAweDY1LCAweDk3LCAweDY2LCAweEI5LCAweEEzLCAvKiAweDk0LTB4OTcgKi8KKwkweDk3LCAweDY3LCAweDk3LCAweDY4LCAweDk3LCAweDY5LCAweDk3LCAweDZBLCAvKiAweDk4LTB4OUIgKi8KKwkweDk3LCAweDZCLCAweDk3LCAweDZDLCAweDk3LCAweDZELCAweDk3LCAweDZFLCAvKiAweDlDLTB4OUYgKi8KKwkweDk3LCAweDZGLCAweDk3LCAweDcwLCAweEM5LCAweEQyLCAweDk3LCAweDcxLCAvKiAweEEwLTB4QTMgKi8KKwkweDk3LCAweDcyLCAweDk3LCAweDczLCAweEMzLCAweENFLCAweENFLCAweEUwLCAvKiAweEE0LTB4QTcgKi8KKwkweEMwLCAweEU2LCAweDk3LCAweDc0LCAweDk3LCAweDc1LCAweDk3LCAweDc2LCAvKiAweEE4LTB4QUIgKi8KKwkweDk3LCAweDc3LCAweENCLCAweEYzLCAweDk3LCAweDc4LCAweENDLCAweERELCAvKiAweEFDLTB4QUYgKi8KKwkweEQwLCAweEI1LCAweDk3LCAweDc5LCAweDk3LCAweDdBLCAweENBLCAweEUxLCAvKiAweEIwLTB4QjMgKi8KKwkweDk3LCAweDdCLCAweEU4LCAweEYzLCAweDk3LCAweDdDLCAweDk3LCAweDdELCAvKiAweEI0LTB4QjcgKi8KKwkweDk3LCAweDdFLCAweDk3LCAweDgwLCAweDk3LCAweDgxLCAweDk3LCAweDgyLCAvKiAweEI4LTB4QkIgKi8KKwkweDk3LCAweDgzLCAweDk3LCAweDg0LCAweDk3LCAweDg1LCAweDk3LCAweDg2LCAvKiAweEJDLTB4QkYgKi8KKwkweEJDLCAweEVDLCAweDk3LCAweDg3LCAweEU4LCAweEY5LCAweDk3LCAweDg4LCAvKiAweEMwLTB4QzMgKi8KKwkweDk3LCAweDg5LCAweDk3LCAweDhBLCAweDk3LCAweDhCLCAweDk3LCAweDhDLCAvKiAweEM0LTB4QzcgKi8KKwkweDk3LCAweDhELCAweEMzLCAweERFLCAweDk3LCAweDhFLCAweEM2LCAweEU1LCAvKiAweEM4LTB4Q0IgKi8KKwkweDk3LCAweDhGLCAweEI5LCAweEY3LCAweDk3LCAweDkwLCAweDk3LCAweDkxLCAvKiAweENDLTB4Q0YgKi8KKwkweDk3LCAweDkyLCAweDk3LCAweDkzLCAweEIwLCAweEY0LCAweDk3LCAweDk0LCAvKiAweEQwLTB4RDMgKi8KKwkweDk3LCAweDk1LCAweEQ3LCAweEQ4LCAweDk3LCAweDk2LCAweDk3LCAweDk3LCAvKiAweEQ0LTB4RDcgKi8KKwkweEJDLCAweEFDLCAweDk3LCAweDk4LCAweEM1LCAweEVGLCAweDk3LCAweDk5LCAvKiAweEQ4LTB4REIgKi8KKwkweDk3LCAweDlBLCAweDk3LCAweDlCLCAweDk3LCAweDlDLCAweDk3LCAweDlELCAvKiAweERDLTB4REYgKi8KKwkweENDLCAweEM0LCAweDk3LCAweDlFLCAweDk3LCAweDlGLCAweEU5LCAweEE2LCAvKiAweEUwLTB4RTMgKi8KKwkweDk3LCAweEEwLCAweDk3LCAweEExLCAweDk3LCAweEEyLCAweDk3LCAweEEzLCAvKiAweEU0LTB4RTcgKi8KKwkweDk3LCAweEE0LCAweDk3LCAweEE1LCAweDk3LCAweEE2LCAweDk3LCAweEE3LCAvKiAweEU4LTB4RUIgKi8KKwkweDk3LCAweEE4LCAweDk3LCAweEE5LCAweEM5LCAweEFELCAweDk3LCAweEFBLCAvKiAweEVDLTB4RUYgKi8KKwkweEU5LCAweEEyLCAweEMwLCAweEUyLCAweDk3LCAweEFCLCAweDk3LCAweEFDLCAvKiAweEYwLTB4RjMgKi8KKwkweDk3LCAweEFELCAweEJGLCAweEMzLCAweDk3LCAweEFFLCAweDk3LCAweEFGLCAvKiAweEY0LTB4RjcgKi8KKwkweDk3LCAweEIwLCAweEU4LCAweEZFLCAweEI5LCAweEQ3LCAweDk3LCAweEIxLCAvKiAweEY4LTB4RkIgKi8KKwkweEU4LCAweEZCLCAweDk3LCAweEIyLCAweDk3LCAweEIzLCAweDk3LCAweEI0LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182OVs1MTJdID0geworCTB4OTcsIDB4QjUsIDB4RTksIDB4QTQsIDB4OTcsIDB4QjYsIDB4OTcsIDB4QjcsIC8qIDB4MDAtMHgwMyAqLworCTB4OTcsIDB4QjgsIDB4RDIsIDB4Q0UsIDB4OTcsIDB4QjksIDB4OTcsIDB4QkEsIC8qIDB4MDQtMHgwNyAqLworCTB4OTcsIDB4QkIsIDB4OTcsIDB4QkMsIDB4OTcsIDB4QkQsIDB4RTksIDB4QTMsIC8qIDB4MDgtMHgwQiAqLworCTB4OTcsIDB4QkUsIDB4RDYsIDB4QjIsIDB4RDcsIDB4QjUsIDB4OTcsIDB4QkYsIC8qIDB4MEMtMHgwRiAqLworCTB4RTksIDB4QTcsIDB4OTcsIDB4QzAsIDB4QkQsIDB4QjcsIDB4OTcsIDB4QzEsIC8qIDB4MTAtMHgxMyAqLworCTB4OTcsIDB4QzIsIDB4OTcsIDB4QzMsIDB4OTcsIDB4QzQsIDB4OTcsIDB4QzUsIC8qIDB4MTQtMHgxNyAqLworCTB4OTcsIDB4QzYsIDB4OTcsIDB4QzcsIDB4OTcsIDB4QzgsIDB4OTcsIDB4QzksIC8qIDB4MTgtMHgxQiAqLworCTB4OTcsIDB4Q0EsIDB4OTcsIDB4Q0IsIDB4OTcsIDB4Q0MsIDB4RTgsIDB4RkMsIC8qIDB4MUMtMHgxRiAqLworCTB4RTgsIDB4RkQsIDB4OTcsIDB4Q0QsIDB4OTcsIDB4Q0UsIDB4OTcsIDB4Q0YsIC8qIDB4MjAtMHgyMyAqLworCTB4RTksIDB4QTEsIDB4OTcsIDB4RDAsIDB4OTcsIDB4RDEsIDB4OTcsIDB4RDIsIC8qIDB4MjQtMHgyNyAqLworCTB4OTcsIDB4RDMsIDB4OTcsIDB4RDQsIDB4OTcsIDB4RDUsIDB4OTcsIDB4RDYsIC8qIDB4MjgtMHgyQiAqLworCTB4OTcsIDB4RDcsIDB4Q0QsIDB4RDYsIDB4OTcsIDB4RDgsIDB4OTcsIDB4RDksIC8qIDB4MkMtMHgyRiAqLworCTB4RDIsIDB4QUMsIDB4OTcsIDB4REEsIDB4OTcsIDB4REIsIDB4OTcsIDB4REMsIC8qIDB4MzAtMHgzMyAqLworCTB4RTksIDB4QjIsIDB4OTcsIDB4REQsIDB4OTcsIDB4REUsIDB4OTcsIDB4REYsIC8qIDB4MzQtMHgzNyAqLworCTB4OTcsIDB4RTAsIDB4RTksIDB4QTksIDB4OTcsIDB4RTEsIDB4OTcsIDB4RTIsIC8qIDB4MzgtMHgzQiAqLworCTB4OTcsIDB4RTMsIDB4QjQsIDB4QUEsIDB4OTcsIDB4RTQsIDB4QjQsIDB4QkIsIC8qIDB4M0MtMHgzRiAqLworCTB4OTcsIDB4RTUsIDB4OTcsIDB4RTYsIDB4RTksIDB4QUIsIDB4OTcsIDB4RTcsIC8qIDB4NDAtMHg0MyAqLworCTB4OTcsIDB4RTgsIDB4OTcsIDB4RTksIDB4OTcsIDB4RUEsIDB4OTcsIDB4RUIsIC8qIDB4NDQtMHg0NyAqLworCTB4OTcsIDB4RUMsIDB4OTcsIDB4RUQsIDB4OTcsIDB4RUUsIDB4OTcsIDB4RUYsIC8qIDB4NDgtMHg0QiAqLworCTB4OTcsIDB4RjAsIDB4OTcsIDB4RjEsIDB4OTcsIDB4RjIsIDB4OTcsIDB4RjMsIC8qIDB4NEMtMHg0RiAqLworCTB4OTcsIDB4RjQsIDB4OTcsIDB4RjUsIDB4OTcsIDB4RjYsIDB4OTcsIDB4RjcsIC8qIDB4NTAtMHg1MyAqLworCTB4RDAsIDB4QTgsIDB4OTcsIDB4RjgsIDB4OTcsIDB4RjksIDB4RTksIDB4QTUsIC8qIDB4NTQtMHg1NyAqLworCTB4OTcsIDB4RkEsIDB4OTcsIDB4RkIsIDB4QjMsIDB4RkUsIDB4OTcsIDB4RkMsIC8qIDB4NTgtMHg1QiAqLworCTB4OTcsIDB4RkQsIDB4RTksIDB4QUMsIDB4QzAsIDB4RTMsIDB4OTcsIDB4RkUsIC8qIDB4NUMtMHg1RiAqLworCTB4RTksIDB4QUEsIDB4OTgsIDB4NDAsIDB4OTgsIDB4NDEsIDB4RTksIDB4QjksIC8qIDB4NjAtMHg2MyAqLworCTB4OTgsIDB4NDIsIDB4OTgsIDB4NDMsIDB4RTksIDB4QjgsIDB4OTgsIDB4NDQsIC8qIDB4NjQtMHg2NyAqLworCTB4OTgsIDB4NDUsIDB4OTgsIDB4NDYsIDB4OTgsIDB4NDcsIDB4RTksIDB4QUUsIC8qIDB4NjgtMHg2QiAqLworCTB4OTgsIDB4NDgsIDB4OTgsIDB4NDksIDB4RTgsIDB4RkEsIDB4OTgsIDB4NEEsIC8qIDB4NkMtMHg2RiAqLworCTB4OTgsIDB4NEIsIDB4RTksIDB4QTgsIDB4OTgsIDB4NEMsIDB4OTgsIDB4NEQsIC8qIDB4NzAtMHg3MyAqLworCTB4OTgsIDB4NEUsIDB4OTgsIDB4NEYsIDB4OTgsIDB4NTAsIDB4QkYsIDB4QUMsIC8qIDB4NzQtMHg3NyAqLworCTB4RTksIDB4QjEsIDB4RTksIDB4QkEsIDB4OTgsIDB4NTEsIDB4OTgsIDB4NTIsIC8qIDB4NzgtMHg3QiAqLworCTB4QzIsIDB4QTUsIDB4OTgsIDB4NTMsIDB4OTgsIDB4NTQsIDB4OTgsIDB4NTUsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RTksIDB4QUYsIDB4OTgsIDB4NTYsIDB4QjgsIDB4QzUsIDB4OTgsIDB4NTcsIC8qIDB4ODAtMHg4MyAqLworCTB4RTksIDB4QUQsIDB4OTgsIDB4NTgsIDB4RDMsIDB4REMsIDB4RTksIDB4QjQsIC8qIDB4ODQtMHg4NyAqLworCTB4RTksIDB4QjUsIDB4RTksIDB4QjcsIDB4OTgsIDB4NTksIDB4OTgsIDB4NUEsIC8qIDB4ODgtMHg4QiAqLworCTB4OTgsIDB4NUIsIDB4RTksIDB4QzcsIDB4OTgsIDB4NUMsIDB4OTgsIDB4NUQsIC8qIDB4OEMtMHg4RiAqLworCTB4OTgsIDB4NUUsIDB4OTgsIDB4NUYsIDB4OTgsIDB4NjAsIDB4OTgsIDB4NjEsIC8qIDB4OTAtMHg5MyAqLworCTB4QzAsIDB4QzYsIDB4RTksIDB4QzUsIDB4OTgsIDB4NjIsIDB4OTgsIDB4NjMsIC8qIDB4OTQtMHg5NyAqLworCTB4RTksIDB4QjAsIDB4OTgsIDB4NjQsIDB4OTgsIDB4NjUsIDB4RTksIDB4QkIsIC8qIDB4OTgtMHg5QiAqLworCTB4QjAsIDB4RjEsIDB4OTgsIDB4NjYsIDB4OTgsIDB4NjcsIDB4OTgsIDB4NjgsIC8qIDB4OUMtMHg5RiAqLworCTB4OTgsIDB4NjksIDB4OTgsIDB4NkEsIDB4OTgsIDB4NkIsIDB4OTgsIDB4NkMsIC8qIDB4QTAtMHhBMyAqLworCTB4OTgsIDB4NkQsIDB4OTgsIDB4NkUsIDB4OTgsIDB4NkYsIDB4RTksIDB4QkMsIC8qIDB4QTQtMHhBNyAqLworCTB4RDUsIDB4QTUsIDB4OTgsIDB4NzAsIDB4OTgsIDB4NzEsIDB4RTksIDB4QkUsIC8qIDB4QTgtMHhBQiAqLworCTB4OTgsIDB4NzIsIDB4RTksIDB4QkYsIDB4OTgsIDB4NzMsIDB4OTgsIDB4NzQsIC8qIDB4QUMtMHhBRiAqLworCTB4OTgsIDB4NzUsIDB4RTksIDB4QzEsIDB4OTgsIDB4NzYsIDB4OTgsIDB4NzcsIC8qIDB4QjAtMHhCMyAqLworCTB4QzEsIDB4RjEsIDB4OTgsIDB4NzgsIDB4OTgsIDB4NzksIDB4QzgsIDB4QjYsIC8qIDB4QjQtMHhCNyAqLworCTB4OTgsIDB4N0EsIDB4OTgsIDB4N0IsIDB4OTgsIDB4N0MsIDB4RTksIDB4QkQsIC8qIDB4QjgtMHhCQiAqLworCTB4OTgsIDB4N0QsIDB4OTgsIDB4N0UsIDB4OTgsIDB4ODAsIDB4OTgsIDB4ODEsIC8qIDB4QkMtMHhCRiAqLworCTB4OTgsIDB4ODIsIDB4RTksIDB4QzIsIDB4OTgsIDB4ODMsIDB4OTgsIDB4ODQsIC8qIDB4QzAtMHhDMyAqLworCTB4OTgsIDB4ODUsIDB4OTgsIDB4ODYsIDB4OTgsIDB4ODcsIDB4OTgsIDB4ODgsIC8qIDB4QzQtMHhDNyAqLworCTB4OTgsIDB4ODksIDB4OTgsIDB4OEEsIDB4RTksIDB4QzMsIDB4OTgsIDB4OEIsIC8qIDB4QzgtMHhDQiAqLworCTB4RTksIDB4QjMsIDB4OTgsIDB4OEMsIDB4RTksIDB4QjYsIDB4OTgsIDB4OEQsIC8qIDB4Q0MtMHhDRiAqLworCTB4QkIsIDB4QjEsIDB4OTgsIDB4OEUsIDB4OTgsIDB4OEYsIDB4OTgsIDB4OTAsIC8qIDB4RDAtMHhEMyAqLworCTB4RTksIDB4QzAsIDB4OTgsIDB4OTEsIDB4OTgsIDB4OTIsIDB4OTgsIDB4OTMsIC8qIDB4RDQtMHhENyAqLworCTB4OTgsIDB4OTQsIDB4OTgsIDB4OTUsIDB4OTgsIDB4OTYsIDB4QkMsIDB4RjcsIC8qIDB4RDgtMHhEQiAqLworCTB4OTgsIDB4OTcsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTksIDB4RTksIDB4QzQsIC8qIDB4REMtMHhERiAqLworCTB4RTksIDB4QzYsIDB4OTgsIDB4OUEsIDB4OTgsIDB4OUIsIDB4OTgsIDB4OUMsIC8qIDB4RTAtMHhFMyAqLworCTB4OTgsIDB4OUQsIDB4OTgsIDB4OUUsIDB4OTgsIDB4OUYsIDB4OTgsIDB4QTAsIC8qIDB4RTQtMHhFNyAqLworCTB4OTgsIDB4QTEsIDB4OTgsIDB4QTIsIDB4OTgsIDB4QTMsIDB4OTgsIDB4QTQsIC8qIDB4RTgtMHhFQiAqLworCTB4OTgsIDB4QTUsIDB4RTksIDB4Q0EsIDB4OTgsIDB4QTYsIDB4OTgsIDB4QTcsIC8qIDB4RUMtMHhFRiAqLworCTB4OTgsIDB4QTgsIDB4OTgsIDB4QTksIDB4RTksIDB4Q0UsIDB4OTgsIDB4QUEsIC8qIDB4RjAtMHhGMyAqLworCTB4OTgsIDB4QUIsIDB4OTgsIDB4QUMsIDB4OTgsIDB4QUQsIDB4OTgsIDB4QUUsIC8qIDB4RjQtMHhGNyAqLworCTB4OTgsIDB4QUYsIDB4OTgsIDB4QjAsIDB4OTgsIDB4QjEsIDB4OTgsIDB4QjIsIC8qIDB4RjgtMHhGQiAqLworCTB4OTgsIDB4QjMsIDB4QjIsIDB4REIsIDB4OTgsIDB4QjQsIDB4RTksIDB4QzgsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzZBWzUxMl0gPSB7CisJMHg5OCwgMHhCNSwgMHg5OCwgMHhCNiwgMHg5OCwgMHhCNywgMHg5OCwgMHhCOCwgLyogMHgwMC0weDAzICovCisJMHg5OCwgMHhCOSwgMHg5OCwgMHhCQSwgMHg5OCwgMHhCQiwgMHg5OCwgMHhCQywgLyogMHgwNC0weDA3ICovCisJMHg5OCwgMHhCRCwgMHg5OCwgMHhCRSwgMHhCNywgMHhBRSwgMHg5OCwgMHhCRiwgLyogMHgwOC0weDBCICovCisJMHg5OCwgMHhDMCwgMHg5OCwgMHhDMSwgMHg5OCwgMHhDMiwgMHg5OCwgMHhDMywgLyogMHgwQy0weDBGICovCisJMHg5OCwgMHhDNCwgMHg5OCwgMHhDNSwgMHg5OCwgMHhDNiwgMHg5OCwgMHhDNywgLyogMHgxMC0weDEzICovCisJMHg5OCwgMHhDOCwgMHg5OCwgMHhDOSwgMHg5OCwgMHhDQSwgMHhFOSwgMHhDQiwgLyogMHgxNC0weDE3ICovCisJMHhFOSwgMHhDQywgMHg5OCwgMHhDQiwgMHg5OCwgMHhDQywgMHg5OCwgMHhDRCwgLyogMHgxOC0weDFCICovCisJMHg5OCwgMHhDRSwgMHg5OCwgMHhDRiwgMHg5OCwgMHhEMCwgMHhENSwgMHhDMSwgLyogMHgxQy0weDFGICovCisJMHg5OCwgMHhEMSwgMHhDNCwgMHhBMywgMHg5OCwgMHhEMiwgMHg5OCwgMHhEMywgLyogMHgyMC0weDIzICovCisJMHg5OCwgMHhENCwgMHg5OCwgMHhENSwgMHg5OCwgMHhENiwgMHg5OCwgMHhENywgLyogMHgyNC0weDI3ICovCisJMHhFOSwgMHhEOCwgMHg5OCwgMHhEOCwgMHhCQSwgMHhFMSwgMHg5OCwgMHhEOSwgLyogMHgyOC0weDJCICovCisJMHg5OCwgMHhEQSwgMHg5OCwgMHhEQiwgMHg5OCwgMHhEQywgMHhFOSwgMHhDOSwgLyogMHgyQy0weDJGICovCisJMHg5OCwgMHhERCwgMHhEMywgMHhBMywgMHg5OCwgMHhERSwgMHg5OCwgMHhERiwgLyogMHgzMC0weDMzICovCisJMHg5OCwgMHhFMCwgMHhFOSwgMHhENCwgMHg5OCwgMHhFMSwgMHg5OCwgMHhFMiwgLyogMHgzNC0weDM3ICovCisJMHg5OCwgMHhFMywgMHg5OCwgMHhFNCwgMHg5OCwgMHhFNSwgMHg5OCwgMHhFNiwgLyogMHgzOC0weDNCICovCisJMHg5OCwgMHhFNywgMHhFOSwgMHhENywgMHhFOSwgMHhEMCwgMHg5OCwgMHhFOCwgLyogMHgzQy0weDNGICovCisJMHg5OCwgMHhFOSwgMHg5OCwgMHhFQSwgMHg5OCwgMHhFQiwgMHg5OCwgMHhFQywgLyogMHg0MC0weDQzICovCisJMHhFOSwgMHhDRiwgMHg5OCwgMHhFRCwgMHg5OCwgMHhFRSwgMHhDNywgMHhDMSwgLyogMHg0NC0weDQ3ICovCisJMHg5OCwgMHhFRiwgMHg5OCwgMHhGMCwgMHg5OCwgMHhGMSwgMHg5OCwgMHhGMiwgLyogMHg0OC0weDRCICovCisJMHg5OCwgMHhGMywgMHg5OCwgMHhGNCwgMHg5OCwgMHhGNSwgMHg5OCwgMHhGNiwgLyogMHg0Qy0weDRGICovCisJMHhFOSwgMHhEMiwgMHg5OCwgMHhGNywgMHg5OCwgMHhGOCwgMHg5OCwgMHhGOSwgLyogMHg1MC0weDUzICovCisJMHg5OCwgMHhGQSwgMHg5OCwgMHhGQiwgMHg5OCwgMHhGQywgMHg5OCwgMHhGRCwgLyogMHg1NC0weDU3ICovCisJMHhFOSwgMHhEOSwgMHhCMywgMHhDOCwgMHg5OCwgMHhGRSwgMHhFOSwgMHhEMywgLyogMHg1OC0weDVCICovCisJMHg5OSwgMHg0MCwgMHg5OSwgMHg0MSwgMHg5OSwgMHg0MiwgMHg5OSwgMHg0MywgLyogMHg1Qy0weDVGICovCisJMHg5OSwgMHg0NCwgMHhDRiwgMHhGMCwgMHg5OSwgMHg0NSwgMHg5OSwgMHg0NiwgLyogMHg2MC0weDYzICovCisJMHg5OSwgMHg0NywgMHhFOSwgMHhDRCwgMHg5OSwgMHg0OCwgMHg5OSwgMHg0OSwgLyogMHg2NC0weDY3ICovCisJMHg5OSwgMHg0QSwgMHg5OSwgMHg0QiwgMHg5OSwgMHg0QywgMHg5OSwgMHg0RCwgLyogMHg2OC0weDZCICovCisJMHg5OSwgMHg0RSwgMHg5OSwgMHg0RiwgMHg5OSwgMHg1MCwgMHg5OSwgMHg1MSwgLyogMHg2Qy0weDZGICovCisJMHg5OSwgMHg1MiwgMHhCMywgMHhGNywgMHg5OSwgMHg1MywgMHg5OSwgMHg1NCwgLyogMHg3MC0weDczICovCisJMHg5OSwgMHg1NSwgMHg5OSwgMHg1NiwgMHg5OSwgMHg1NywgMHg5OSwgMHg1OCwgLyogMHg3NC0weDc3ICovCisJMHg5OSwgMHg1OSwgMHhFOSwgMHhENiwgMHg5OSwgMHg1QSwgMHg5OSwgMHg1QiwgLyogMHg3OC0weDdCICovCisJMHhFOSwgMHhEQSwgMHg5OSwgMHg1QywgMHg5OSwgMHg1RCwgMHg5OSwgMHg1RSwgLyogMHg3Qy0weDdGICovCisJCisJMHhDQywgMHhCNCwgMHg5OSwgMHg1RiwgMHg5OSwgMHg2MCwgMHg5OSwgMHg2MSwgLyogMHg4MC0weDgzICovCisJMHhDRiwgMHhBRCwgMHg5OSwgMHg2MiwgMHg5OSwgMHg2MywgMHg5OSwgMHg2NCwgLyogMHg4NC0weDg3ICovCisJMHg5OSwgMHg2NSwgMHg5OSwgMHg2NiwgMHg5OSwgMHg2NywgMHg5OSwgMHg2OCwgLyogMHg4OC0weDhCICovCisJMHg5OSwgMHg2OSwgMHg5OSwgMHg2QSwgMHhFOSwgMHhENSwgMHg5OSwgMHg2QiwgLyogMHg4Qy0weDhGICovCisJMHhFOSwgMHhEQywgMHhFOSwgMHhEQiwgMHg5OSwgMHg2QywgMHg5OSwgMHg2RCwgLyogMHg5MC0weDkzICovCisJMHg5OSwgMHg2RSwgMHg5OSwgMHg2RiwgMHg5OSwgMHg3MCwgMHhFOSwgMHhERSwgLyogMHg5NC0weDk3ICovCisJMHg5OSwgMHg3MSwgMHg5OSwgMHg3MiwgMHg5OSwgMHg3MywgMHg5OSwgMHg3NCwgLyogMHg5OC0weDlCICovCisJMHg5OSwgMHg3NSwgMHg5OSwgMHg3NiwgMHg5OSwgMHg3NywgMHg5OSwgMHg3OCwgLyogMHg5Qy0weDlGICovCisJMHhFOSwgMHhEMSwgMHg5OSwgMHg3OSwgMHg5OSwgMHg3QSwgMHg5OSwgMHg3QiwgLyogMHhBMC0weEEzICovCisJMHg5OSwgMHg3QywgMHg5OSwgMHg3RCwgMHg5OSwgMHg3RSwgMHg5OSwgMHg4MCwgLyogMHhBNC0weEE3ICovCisJMHg5OSwgMHg4MSwgMHhFOSwgMHhERCwgMHg5OSwgMHg4MiwgMHhFOSwgMHhERiwgLyogMHhBOC0weEFCICovCisJMHhDMywgMHhDQSwgMHg5OSwgMHg4MywgMHg5OSwgMHg4NCwgMHg5OSwgMHg4NSwgLyogMHhBQy0weEFGICovCisJMHg5OSwgMHg4NiwgMHg5OSwgMHg4NywgMHg5OSwgMHg4OCwgMHg5OSwgMHg4OSwgLyogMHhCMC0weEIzICovCisJMHg5OSwgMHg4QSwgMHg5OSwgMHg4QiwgMHg5OSwgMHg4QywgMHg5OSwgMHg4RCwgLyogMHhCNC0weEI3ICovCisJMHg5OSwgMHg4RSwgMHg5OSwgMHg4RiwgMHg5OSwgMHg5MCwgMHg5OSwgMHg5MSwgLyogMHhCOC0weEJCICovCisJMHg5OSwgMHg5MiwgMHg5OSwgMHg5MywgMHg5OSwgMHg5NCwgMHg5OSwgMHg5NSwgLyogMHhCQy0weEJGICovCisJMHg5OSwgMHg5NiwgMHg5OSwgMHg5NywgMHg5OSwgMHg5OCwgMHg5OSwgMHg5OSwgLyogMHhDMC0weEMzICovCisJMHg5OSwgMHg5QSwgMHg5OSwgMHg5QiwgMHg5OSwgMHg5QywgMHg5OSwgMHg5RCwgLyogMHhDNC0weEM3ICovCisJMHg5OSwgMHg5RSwgMHg5OSwgMHg5RiwgMHg5OSwgMHhBMCwgMHg5OSwgMHhBMSwgLyogMHhDOC0weENCICovCisJMHg5OSwgMHhBMiwgMHg5OSwgMHhBMywgMHg5OSwgMHhBNCwgMHg5OSwgMHhBNSwgLyogMHhDQy0weENGICovCisJMHg5OSwgMHhBNiwgMHg5OSwgMHhBNywgMHg5OSwgMHhBOCwgMHg5OSwgMHhBOSwgLyogMHhEMC0weEQzICovCisJMHg5OSwgMHhBQSwgMHg5OSwgMHhBQiwgMHg5OSwgMHhBQywgMHg5OSwgMHhBRCwgLyogMHhENC0weEQ3ICovCisJMHg5OSwgMHhBRSwgMHg5OSwgMHhBRiwgMHg5OSwgMHhCMCwgMHg5OSwgMHhCMSwgLyogMHhEOC0weERCICovCisJMHg5OSwgMHhCMiwgMHg5OSwgMHhCMywgMHg5OSwgMHhCNCwgMHg5OSwgMHhCNSwgLyogMHhEQy0weERGICovCisJMHg5OSwgMHhCNiwgMHg5OSwgMHhCNywgMHg5OSwgMHhCOCwgMHg5OSwgMHhCOSwgLyogMHhFMC0weEUzICovCisJMHg5OSwgMHhCQSwgMHg5OSwgMHhCQiwgMHg5OSwgMHhCQywgMHg5OSwgMHhCRCwgLyogMHhFNC0weEU3ICovCisJMHg5OSwgMHhCRSwgMHg5OSwgMHhCRiwgMHg5OSwgMHhDMCwgMHg5OSwgMHhDMSwgLyogMHhFOC0weEVCICovCisJMHg5OSwgMHhDMiwgMHg5OSwgMHhDMywgMHg5OSwgMHhDNCwgMHg5OSwgMHhDNSwgLyogMHhFQy0weEVGICovCisJMHg5OSwgMHhDNiwgMHg5OSwgMHhDNywgMHg5OSwgMHhDOCwgMHg5OSwgMHhDOSwgLyogMHhGMC0weEYzICovCisJMHg5OSwgMHhDQSwgMHg5OSwgMHhDQiwgMHg5OSwgMHhDQywgMHg5OSwgMHhDRCwgLyogMHhGNC0weEY3ICovCisJMHg5OSwgMHhDRSwgMHg5OSwgMHhDRiwgMHg5OSwgMHhEMCwgMHg5OSwgMHhEMSwgLyogMHhGOC0weEZCICovCisJMHg5OSwgMHhEMiwgMHg5OSwgMHhEMywgMHg5OSwgMHhENCwgMHg5OSwgMHhENSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNkJbNTEyXSA9IHsKKwkweDk5LCAweEQ2LCAweDk5LCAweEQ3LCAweDk5LCAweEQ4LCAweDk5LCAweEQ5LCAvKiAweDAwLTB4MDMgKi8KKwkweDk5LCAweERBLCAweDk5LCAweERCLCAweDk5LCAweERDLCAweDk5LCAweERELCAvKiAweDA0LTB4MDcgKi8KKwkweDk5LCAweERFLCAweDk5LCAweERGLCAweDk5LCAweEUwLCAweDk5LCAweEUxLCAvKiAweDA4LTB4MEIgKi8KKwkweDk5LCAweEUyLCAweDk5LCAweEUzLCAweDk5LCAweEU0LCAweDk5LCAweEU1LCAvKiAweDBDLTB4MEYgKi8KKwkweDk5LCAweEU2LCAweDk5LCAweEU3LCAweDk5LCAweEU4LCAweDk5LCAweEU5LCAvKiAweDEwLTB4MTMgKi8KKwkweDk5LCAweEVBLCAweDk5LCAweEVCLCAweDk5LCAweEVDLCAweDk5LCAweEVELCAvKiAweDE0LTB4MTcgKi8KKwkweDk5LCAweEVFLCAweDk5LCAweEVGLCAweDk5LCAweEYwLCAweDk5LCAweEYxLCAvKiAweDE4LTB4MUIgKi8KKwkweDk5LCAweEYyLCAweDk5LCAweEYzLCAweDk5LCAweEY0LCAweDk5LCAweEY1LCAvKiAweDFDLTB4MUYgKi8KKwkweEM3LCAweEI3LCAweEI0LCAweENFLCAweEJCLCAweEI2LCAweEQwLCAweEMwLCAvKiAweDIwLTB4MjMgKi8KKwkweEVDLCAweEEzLCAweDk5LCAweEY2LCAweDk5LCAweEY3LCAweEM1LCAweEI3LCAvKiAweDI0LTB4MjcgKi8KKwkweDk5LCAweEY4LCAweDk5LCAweEY5LCAweDk5LCAweEZBLCAweDk5LCAweEZCLCAvKiAweDI4LTB4MkIgKi8KKwkweDk5LCAweEZDLCAweDk5LCAweEZELCAweDk5LCAweEZFLCAweDlBLCAweDQwLCAvKiAweDJDLTB4MkYgKi8KKwkweDlBLCAweDQxLCAweDlBLCAweDQyLCAweEQzLCAweEZCLCAweDlBLCAweDQzLCAvKiAweDMwLTB4MzMgKi8KKwkweDlBLCAweDQ0LCAweDlBLCAweDQ1LCAweDlBLCAweDQ2LCAweEVDLCAweEE0LCAvKiAweDM0LTB4MzcgKi8KKwkweDlBLCAweDQ3LCAweEVDLCAweEE1LCAweEM2LCAweERCLCAweDlBLCAweDQ4LCAvKiAweDM4LTB4M0IgKi8KKwkweDlBLCAweDQ5LCAweDlBLCAweDRBLCAweEJGLCAweEVFLCAweDlBLCAweDRCLCAvKiAweDNDLTB4M0YgKi8KKwkweDlBLCAweDRDLCAweDlBLCAweDRELCAweDlBLCAweDRFLCAweEVDLCAweEE2LCAvKiAweDQwLTB4NDMgKi8KKwkweDlBLCAweDRGLCAweDlBLCAweDUwLCAweEVDLCAweEE3LCAweEQwLCAweEFBLCAvKiAweDQ0LTB4NDcgKi8KKwkweDlBLCAweDUxLCAweEM3LCAweEI4LCAweDlBLCAweDUyLCAweDlBLCAweDUzLCAvKiAweDQ4LTB4NEIgKi8KKwkweEI4LCAweEU4LCAweDlBLCAweDU0LCAweDlBLCAweDU1LCAweDlBLCAweDU2LCAvKiAweDRDLTB4NEYgKi8KKwkweDlBLCAweDU3LCAweDlBLCAweDU4LCAweDlBLCAweDU5LCAweDlBLCAweDVBLCAvKiAweDUwLTB4NTMgKi8KKwkweDlBLCAweDVCLCAweDlBLCAweDVDLCAweDlBLCAweDVELCAweDlBLCAweDVFLCAvKiAweDU0LTB4NTcgKi8KKwkweDlBLCAweDVGLCAweEVDLCAweEE4LCAweDlBLCAweDYwLCAweDlBLCAweDYxLCAvKiAweDU4LTB4NUIgKi8KKwkweDlBLCAweDYyLCAweDlBLCAweDYzLCAweDlBLCAweDY0LCAweDlBLCAweDY1LCAvKiAweDVDLTB4NUYgKi8KKwkweDlBLCAweDY2LCAweDlBLCAweDY3LCAweEQ2LCAweEI5LCAweEQ1LCAweEZELCAvKiAweDYwLTB4NjMgKi8KKwkweEI0LCAweENCLCAweEIyLCAweEJELCAweENFLCAweEU0LCAweEM2LCAweEU3LCAvKiAweDY0LTB4NjcgKi8KKwkweDlBLCAweDY4LCAweDlBLCAweDY5LCAweENELCAweEUxLCAweDlBLCAweDZBLCAvKiAweDY4LTB4NkIgKi8KKwkweDlBLCAweDZCLCAweDlBLCAweDZDLCAweDlBLCAweDZELCAweDlBLCAweDZFLCAvKiAweDZDLTB4NkYgKi8KKwkweDlBLCAweDZGLCAweDlBLCAweDcwLCAweDlBLCAweDcxLCAweDlBLCAweDcyLCAvKiAweDcwLTB4NzMgKi8KKwkweDlBLCAweDczLCAweDlBLCAweDc0LCAweDlBLCAweDc1LCAweDlBLCAweDc2LCAvKiAweDc0LTB4NzcgKi8KKwkweDlBLCAweDc3LCAweEI0LCAweEY1LCAweDlBLCAweDc4LCAweENCLCAweEMwLCAvKiAweDc4LTB4N0IgKi8KKwkweEJDLCAweERGLCAweDlBLCAweDc5LCAweDlBLCAweDdBLCAweDlBLCAweDdCLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDlBLCAweDdDLCAweEU5LCAweEUyLCAweEU5LCAweEUzLCAweEQxLCAweEVBLCAvKiAweDgwLTB4ODMgKi8KKwkweEU5LCAweEU1LCAweDlBLCAweDdELCAweEI0LCAweEY5LCAweEU5LCAweEU0LCAvKiAweDg0LTB4ODcgKi8KKwkweDlBLCAweDdFLCAweEQxLCAweEIzLCAweENBLCAweEUyLCAweEIyLCAweEQwLCAvKiAweDg4LTB4OEIgKi8KKwkweDlBLCAweDgwLCAweEU5LCAweEU4LCAweDlBLCAweDgxLCAweDlBLCAweDgyLCAvKiAweDhDLTB4OEYgKi8KKwkweDlBLCAweDgzLCAweDlBLCAweDg0LCAweEU5LCAweEU2LCAweEU5LCAweEU3LCAvKiAweDkwLTB4OTMgKi8KKwkweDlBLCAweDg1LCAweDlBLCAweDg2LCAweEQ2LCAweEIzLCAweDlBLCAweDg3LCAvKiAweDk0LTB4OTcgKi8KKwkweDlBLCAweDg4LCAweDlBLCAweDg5LCAweEU5LCAweEU5LCAweEU5LCAweEVBLCAvKiAweDk4LTB4OUIgKi8KKwkweDlBLCAweDhBLCAweDlBLCAweDhCLCAweDlBLCAweDhDLCAweDlBLCAweDhELCAvKiAweDlDLTB4OUYgKi8KKwkweDlBLCAweDhFLCAweEU5LCAweEVCLCAweDlBLCAweDhGLCAweDlBLCAweDkwLCAvKiAweEEwLTB4QTMgKi8KKwkweDlBLCAweDkxLCAweDlBLCAweDkyLCAweDlBLCAweDkzLCAweDlBLCAweDk0LCAvKiAweEE0LTB4QTcgKi8KKwkweDlBLCAweDk1LCAweDlBLCAweDk2LCAweEU5LCAweEVDLCAweDlBLCAweDk3LCAvKiAweEE4LTB4QUIgKi8KKwkweDlBLCAweDk4LCAweDlBLCAweDk5LCAweDlBLCAweDlBLCAweDlBLCAweDlCLCAvKiAweEFDLTB4QUYgKi8KKwkweDlBLCAweDlDLCAweDlBLCAweDlELCAweDlBLCAweDlFLCAweEVDLCAweEFGLCAvKiAweEIwLTB4QjMgKi8KKwkweEM1LCAweEI5LCAweEI2LCAweENFLCAweDlBLCAweDlGLCAweEQyLCAweEYzLCAvKiAweEI0LTB4QjcgKi8KKwkweDlBLCAweEEwLCAweDlBLCAweEExLCAweDlBLCAweEEyLCAweDlBLCAweEEzLCAvKiAweEI4LTB4QkIgKi8KKwkweDlBLCAweEE0LCAweDlBLCAweEE1LCAweDlBLCAweEE2LCAweEI1LCAweEVFLCAvKiAweEJDLTB4QkYgKi8KKwkweDlBLCAweEE3LCAweEJCLCAweEQ5LCAweEVDLCAweEIxLCAweDlBLCAweEE4LCAvKiAweEMwLTB4QzMgKi8KKwkweDlBLCAweEE5LCAweEQyLCAweEUzLCAweDlBLCAweEFBLCAweDlBLCAweEFCLCAvKiAweEM0LTB4QzcgKi8KKwkweDlBLCAweEFDLCAweDlBLCAweEFELCAweDlBLCAweEFFLCAweENFLCAweEUzLCAvKiAweEM4LTB4Q0IgKi8KKwkweDlBLCAweEFGLCAweEM0LCAweEI4LCAweDlBLCAweEIwLCAweEMzLCAweEJGLCAvKiAweENDLTB4Q0YgKi8KKwkweDlBLCAweEIxLCAweDlBLCAweEIyLCAweEI2LCAweEJFLCAweEQ4LCAweEI5LCAvKiAweEQwLTB4RDMgKi8KKwkweEIxLCAweEM4LCAweEIxLCAweENGLCAweEIxLCAweEQxLCAweEM1LCAweEZFLCAvKiAweEQ0LTB4RDcgKi8KKwkweDlBLCAweEIzLCAweEIxLCAweEQwLCAweDlBLCAweEI0LCAweEMzLCAweEFCLCAvKiAweEQ4LTB4REIgKi8KKwkweDlBLCAweEI1LCAweDlBLCAweEI2LCAweDlBLCAweEI3LCAweDlBLCAweEI4LCAvKiAweERDLTB4REYgKi8KKwkweDlBLCAweEI5LCAweEQ1LCAweEIxLCAweDlBLCAweEJBLCAweDlBLCAweEJCLCAvKiAweEUwLTB4RTMgKi8KKwkweDlBLCAweEJDLCAweDlBLCAweEJELCAweDlBLCAweEJFLCAweDlBLCAweEJGLCAvKiAweEU0LTB4RTcgKi8KKwkweDlBLCAweEMwLCAweDlBLCAweEMxLCAweEVCLCAweEE0LCAweEJBLCAweEMxLCAvKiAweEU4LTB4RUIgKi8KKwkweDlBLCAweEMyLCAweDlBLCAweEMzLCAweDlBLCAweEM0LCAweENDLCAweEJBLCAvKiAweEVDLTB4RUYgKi8KKwkweDlBLCAweEM1LCAweDlBLCAweEM2LCAweDlBLCAweEM3LCAweEVCLCAweEE1LCAvKiAweEYwLTB4RjMgKi8KKwkweDlBLCAweEM4LCAweEVCLCAweEE3LCAweDlBLCAweEM5LCAweDlBLCAweENBLCAvKiAweEY0LTB4RjcgKi8KKwkweDlBLCAweENCLCAweEVCLCAweEE4LCAweDlBLCAweENDLCAweDlBLCAweENELCAvKiAweEY4LTB4RkIgKi8KKwkweDlBLCAweENFLCAweEVCLCAweEE2LCAweDlBLCAweENGLCAweDlBLCAweEQwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182Q1s1MTJdID0geworCTB4OUEsIDB4RDEsIDB4OUEsIDB4RDIsIDB4OUEsIDB4RDMsIDB4OUEsIDB4RDQsIC8qIDB4MDAtMHgwMyAqLworCTB4OUEsIDB4RDUsIDB4RUIsIDB4QTksIDB4RUIsIDB4QUIsIDB4RUIsIDB4QUEsIC8qIDB4MDQtMHgwNyAqLworCTB4OUEsIDB4RDYsIDB4OUEsIDB4RDcsIDB4OUEsIDB4RDgsIDB4OUEsIDB4RDksIC8qIDB4MDgtMHgwQiAqLworCTB4OUEsIDB4REEsIDB4RUIsIDB4QUMsIDB4OUEsIDB4REIsIDB4Q0EsIDB4Q0YsIC8qIDB4MEMtMHgwRiAqLworCTB4RDgsIDB4QjUsIDB4QzMsIDB4RjEsIDB4OUEsIDB4REMsIDB4QzMsIDB4QTUsIC8qIDB4MTAtMHgxMyAqLworCTB4QzYsIDB4RjgsIDB4RUIsIDB4QUQsIDB4QzQsIDB4Q0EsIDB4OUEsIDB4REQsIC8qIDB4MTQtMHgxNyAqLworCTB4RUIsIDB4QUUsIDB4RUIsIDB4QUYsIDB4RUIsIDB4QjAsIDB4QjcsIDB4RDUsIC8qIDB4MTgtMHgxQiAqLworCTB4OUEsIDB4REUsIDB4OUEsIDB4REYsIDB4OUEsIDB4RTAsIDB4QjcsIDB4RkEsIC8qIDB4MUMtMHgxRiAqLworCTB4OUEsIDB4RTEsIDB4RUIsIDB4QjEsIDB4QzcsIDB4RTIsIDB4OUEsIDB4RTIsIC8qIDB4MjAtMHgyMyAqLworCTB4RUIsIDB4QjMsIDB4OUEsIDB4RTMsIDB4QkEsIDB4QTQsIDB4RDEsIDB4RjUsIC8qIDB4MjQtMHgyNyAqLworCTB4QjAsIDB4QjEsIDB4RUIsIDB4QjIsIDB4RUIsIDB4QjQsIDB4OUEsIDB4RTQsIC8qIDB4MjgtMHgyQiAqLworCTB4OUEsIDB4RTUsIDB4OUEsIDB4RTYsIDB4QjUsIDB4QUEsIDB4QzIsIDB4QzgsIC8qIDB4MkMtMHgyRiAqLworCTB4QzcsIDB4RTgsIDB4OUEsIDB4RTcsIDB4RUIsIDB4QjUsIDB4OUEsIDB4RTgsIC8qIDB4MzAtMHgzMyAqLworCTB4Q0IsIDB4QUUsIDB4RTMsIDB4REYsIDB4OUEsIDB4RTksIDB4OUEsIDB4RUEsIC8qIDB4MzQtMHgzNyAqLworCTB4RDMsIDB4QzAsIDB4OUEsIDB4RUIsIDB4OUEsIDB4RUMsIDB4OUEsIDB4RUQsIC8qIDB4MzgtMHgzQiAqLworCTB4OUEsIDB4RUUsIDB4RDksIDB4REIsIDB4OUEsIDB4RUYsIDB4OUEsIDB4RjAsIC8qIDB4M0MtMHgzRiAqLworCTB4Q0QsIDB4QTEsIDB4RDYsIDB4QUQsIDB4QzcsIDB4RjMsIDB4OUEsIDB4RjEsIC8qIDB4NDAtMHg0MyAqLworCTB4OUEsIDB4RjIsIDB4OUEsIDB4RjMsIDB4RDksIDB4RTAsIDB4QkIsIDB4RTMsIC8qIDB4NDQtMHg0NyAqLworCTB4OUEsIDB4RjQsIDB4QkEsIDB4QkEsIDB4RTMsIDB4RTIsIDB4OUEsIDB4RjUsIC8qIDB4NDgtMHg0QiAqLworCTB4OUEsIDB4RjYsIDB4OUEsIDB4RjcsIDB4OUEsIDB4RjgsIDB4OUEsIDB4RjksIC8qIDB4NEMtMHg0RiAqLworCTB4Q0YsIDB4QUIsIDB4OUEsIDB4RkEsIDB4OUEsIDB4RkIsIDB4OUEsIDB4RkMsIC8qIDB4NTAtMHg1MyAqLworCTB4RTMsIDB4RTAsIDB4QzksIDB4QzcsIDB4OUEsIDB4RkQsIDB4QkEsIDB4QjksIC8qIDB4NTQtMHg1NyAqLworCTB4OUEsIDB4RkUsIDB4OUIsIDB4NDAsIDB4OUIsIDB4NDEsIDB4RDEsIDB4QjQsIC8qIDB4NTgtMHg1QiAqLworCTB4RTMsIDB4RTEsIDB4QzgsIDB4RUEsIDB4QjksIDB4QUYsIDB4QkQsIDB4QUQsIC8qIDB4NUMtMHg1RiAqLworCTB4QjMsIDB4RDgsIDB4Q0UsIDB4REIsIDB4OUIsIDB4NDIsIDB4OUIsIDB4NDMsIC8qIDB4NjAtMHg2MyAqLworCTB4Q0MsIDB4QzAsIDB4OUIsIDB4NDQsIDB4OUIsIDB4NDUsIDB4OUIsIDB4NDYsIC8qIDB4NjQtMHg2NyAqLworCTB4RTMsIDB4RTgsIDB4RTMsIDB4RTksIDB4Q0QsIDB4RjQsIDB4OUIsIDB4NDcsIC8qIDB4NjgtMHg2QiAqLworCTB4OUIsIDB4NDgsIDB4OUIsIDB4NDksIDB4OUIsIDB4NEEsIDB4OUIsIDB4NEIsIC8qIDB4NkMtMHg2RiAqLworCTB4Q0MsIDB4QUQsIDB4OUIsIDB4NEMsIDB4QkMsIDB4QjMsIDB4OUIsIDB4NEQsIC8qIDB4NzAtMHg3MyAqLworCTB4RTMsIDB4RUEsIDB4OUIsIDB4NEUsIDB4RTMsIDB4RUIsIDB4OUIsIDB4NEYsIC8qIDB4NzQtMHg3NyAqLworCTB4OUIsIDB4NTAsIDB4RDAsIDB4REEsIDB4OUIsIDB4NTEsIDB4OUIsIDB4NTIsIC8qIDB4NzgtMHg3QiAqLworCTB4OUIsIDB4NTMsIDB4QzYsIDB4RkIsIDB4QjcsIDB4REEsIDB4OUIsIDB4NTQsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OUIsIDB4NTUsIDB4QzcsIDB4REYsIDB4RDIsIDB4Q0EsIDB4Q0UsIDB4RDYsIC8qIDB4ODAtMHg4MyAqLworCTB4OUIsIDB4NTYsIDB4RTMsIDB4RTQsIDB4RTMsIDB4RUMsIDB4OUIsIDB4NTcsIC8qIDB4ODQtMHg4NyAqLworCTB4QzksIDB4RjIsIDB4QjMsIDB4QzEsIDB4OUIsIDB4NTgsIDB4OUIsIDB4NTksIC8qIDB4ODgtMHg4QiAqLworCTB4RTMsIDB4RTcsIDB4OUIsIDB4NUEsIDB4OUIsIDB4NUIsIDB4QzYsIDB4RTMsIC8qIDB4OEMtMHg4RiAqLworCTB4RTMsIDB4RTUsIDB4OUIsIDB4NUMsIDB4OUIsIDB4NUQsIDB4RUQsIDB4QjMsIC8qIDB4OTAtMHg5MyAqLworCTB4RTMsIDB4RTYsIDB4OUIsIDB4NUUsIDB4OUIsIDB4NUYsIDB4OUIsIDB4NjAsIC8qIDB4OTQtMHg5NyAqLworCTB4OUIsIDB4NjEsIDB4QzksIDB4QjMsIDB4OUIsIDB4NjIsIDB4QzUsIDB4RTYsIC8qIDB4OTgtMHg5QiAqLworCTB4OUIsIDB4NjMsIDB4OUIsIDB4NjQsIDB4OUIsIDB4NjUsIDB4QjksIDB4QjUsIC8qIDB4OUMtMHg5RiAqLworCTB4OUIsIDB4NjYsIDB4QzMsIDB4QkIsIDB4OUIsIDB4NjcsIDB4RTMsIDB4RTMsIC8qIDB4QTAtMHhBMyAqLworCTB4QzUsIDB4QkQsIDB4QzEsIDB4QTQsIDB4QzIsIDB4RDksIDB4QjIsIDB4RDcsIC8qIDB4QTQtMHhBNyAqLworCTB4OUIsIDB4NjgsIDB4RTMsIDB4RUQsIDB4QkIsIDB4QTYsIDB4QzQsIDB4QUQsIC8qIDB4QTgtMHhBQiAqLworCTB4OUIsIDB4NjksIDB4RTMsIDB4RjAsIDB4QkUsIDB4REEsIDB4OUIsIDB4NkEsIC8qIDB4QUMtMHhBRiAqLworCTB4OUIsIDB4NkIsIDB4RTMsIDB4RkIsIDB4RTMsIDB4RjUsIDB4QkEsIDB4RDMsIC8qIDB4QjAtMHhCMyAqLworCTB4OUIsIDB4NkMsIDB4OUIsIDB4NkQsIDB4OUIsIDB4NkUsIDB4OUIsIDB4NkYsIC8qIDB4QjQtMHhCNyAqLworCTB4QjcsIDB4RDAsIDB4RDMsIDB4Q0QsIDB4OUIsIDB4NzAsIDB4RDYsIDB4Q0UsIC8qIDB4QjgtMHhCQiAqLworCTB4RDUsIDB4RDMsIDB4QjksIDB4QzEsIDB4RDUsIDB4QjQsIDB4RDEsIDB4RDgsIC8qIDB4QkMtMHhCRiAqLworCTB4OUIsIDB4NzEsIDB4OUIsIDB4NzIsIDB4OUIsIDB4NzMsIDB4OUIsIDB4NzQsIC8qIDB4QzAtMHhDMyAqLworCTB4RDAsIDB4QjksIDB4QzcsIDB4RjYsIDB4OUIsIDB4NzUsIDB4OUIsIDB4NzYsIC8qIDB4QzQtMHhDNyAqLworCTB4OUIsIDB4NzcsIDB4QzgsIDB4QUEsIDB4QjIsIDB4QjQsIDB4OUIsIDB4NzgsIC8qIDB4QzgtMHhDQiAqLworCTB4QzMsIDB4REEsIDB4OUIsIDB4NzksIDB4OUIsIDB4N0EsIDB4OUIsIDB4N0IsIC8qIDB4Q0MtMHhDRiAqLworCTB4RTMsIDB4RUUsIDB4OUIsIDB4N0MsIDB4OUIsIDB4N0QsIDB4RTMsIDB4RkMsIC8qIDB4RDAtMHhEMyAqLworCTB4RTMsIDB4RUYsIDB4QjcsIDB4QTgsIDB4RTMsIDB4RjcsIDB4RTMsIDB4RjQsIC8qIDB4RDQtMHhENyAqLworCTB4OUIsIDB4N0UsIDB4OUIsIDB4ODAsIDB4OUIsIDB4ODEsIDB4QjcsIDB4QkEsIC8qIDB4RDgtMHhEQiAqLworCTB4OUIsIDB4ODIsIDB4OUIsIDB4ODMsIDB4QzUsIDB4QTIsIDB4OUIsIDB4ODQsIC8qIDB4REMtMHhERiAqLworCTB4RTMsIDB4RjYsIDB4QzUsIDB4REQsIDB4QjIsIDB4QTgsIDB4QzYsIDB4RkMsIC8qIDB4RTAtMHhFMyAqLworCTB4OUIsIDB4ODUsIDB4QzQsIDB4RTAsIDB4OUIsIDB4ODYsIDB4OUIsIDB4ODcsIC8qIDB4RTQtMHhFNyAqLworCTB4RDcsIDB4QTIsIDB4OUIsIDB4ODgsIDB4QzAsIDB4RTEsIDB4RTMsIDB4RjksIC8qIDB4RTgtMHhFQiAqLworCTB4OUIsIDB4ODksIDB4OUIsIDB4OEEsIDB4RTMsIDB4RkEsIDB4RTMsIDB4RkQsIC8qIDB4RUMtMHhFRiAqLworCTB4Q0MsIDB4QTksIDB4RTMsIDB4RjMsIDB4OUIsIDB4OEIsIDB4RDMsIDB4QkUsIC8qIDB4RjAtMHhGMyAqLworCTB4OUIsIDB4OEMsIDB4QjEsIDB4QzMsIDB4RUQsIDB4QjQsIDB4RTMsIDB4RjEsIC8qIDB4RjQtMHhGNyAqLworCTB4RTMsIDB4RjIsIDB4OUIsIDB4OEQsIDB4RTMsIDB4RjgsIDB4RDAsIDB4QkEsIC8qIDB4RjgtMHhGQiAqLworCTB4QzYsIDB4QzMsIDB4RDQsIDB4RjMsIDB4RTMsIDB4RkUsIDB4OUIsIDB4OEUsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzZEWzUxMl0gPSB7CisJMHg5QiwgMHg4RiwgMHhCRCwgMHhFMCwgMHg5QiwgMHg5MCwgMHg5QiwgMHg5MSwgLyogMHgwMC0weDAzICovCisJMHhFNCwgMHhBNywgMHg5QiwgMHg5MiwgMHg5QiwgMHg5MywgMHhFNCwgMHhBNiwgLyogMHgwNC0weDA3ICovCisJMHg5QiwgMHg5NCwgMHg5QiwgMHg5NSwgMHg5QiwgMHg5NiwgMHhEMSwgMHhGMywgLyogMHgwOC0weDBCICovCisJMHhFNCwgMHhBMywgMHg5QiwgMHg5NywgMHhFNCwgMHhBOSwgMHg5QiwgMHg5OCwgLyogMHgwQy0weDBGICovCisJMHg5QiwgMHg5OSwgMHg5QiwgMHg5QSwgMHhDOCwgMHhGNywgMHg5QiwgMHg5QiwgLyogMHgxMC0weDEzICovCisJMHg5QiwgMHg5QywgMHg5QiwgMHg5RCwgMHg5QiwgMHg5RSwgMHhDRiwgMHhCNCwgLyogMHgxNC0weDE3ICovCisJMHg5QiwgMHg5RiwgMHhFNCwgMHhBOCwgMHhFNCwgMHhBRSwgMHhDMiwgMHhFNSwgLyogMHgxOC0weDFCICovCisJMHg5QiwgMHhBMCwgMHg5QiwgMHhBMSwgMHhCNiwgMHhCNCwgMHg5QiwgMHhBMiwgLyogMHgxQy0weDFGICovCisJMHg5QiwgMHhBMywgMHg5QiwgMHhBNCwgMHg5QiwgMHhBNSwgMHg5QiwgMHhBNiwgLyogMHgyMC0weDIzICovCisJMHg5QiwgMHhBNywgMHhCRCwgMHhGMiwgMHg5QiwgMHhBOCwgMHhFNCwgMHhBMiwgLyogMHgyNC0weDI3ICovCisJMHg5QiwgMHhBOSwgMHg5QiwgMHhBQSwgMHhCQSwgMHhFOSwgMHhFNCwgMHhBQSwgLyogMHgyOC0weDJCICovCisJMHg5QiwgMHhBQiwgMHg5QiwgMHhBQywgMHhFNCwgMHhBQywgMHg5QiwgMHhBRCwgLyogMHgyQy0weDJGICovCisJMHg5QiwgMHhBRSwgMHhCNiwgMHhGRCwgMHhENiwgMHhERSwgMHhFNCwgMHhCMiwgLyogMHgzMC0weDMzICovCisJMHg5QiwgMHhBRiwgMHhFNCwgMHhBRCwgMHg5QiwgMHhCMCwgMHg5QiwgMHhCMSwgLyogMHgzNC0weDM3ICovCisJMHg5QiwgMHhCMiwgMHhFNCwgMHhBMSwgMHg5QiwgMHhCMywgMHhCQiwgMHhFRSwgLyogMHgzOC0weDNCICovCisJMHhDRCwgMHhERCwgMHhDNywgMHhBMiwgMHhDNSwgMHhDOSwgMHg5QiwgMHhCNCwgLyogMHgzQy0weDNGICovCisJMHg5QiwgMHhCNSwgMHhDMSwgMHhGNywgMHg5QiwgMHhCNiwgMHhFNCwgMHhBNCwgLyogMHg0MC0weDQzICovCisJMHg5QiwgMHhCNywgMHhDNywgMHhCMywgMHhCRCwgMHhBQywgMHhCRCwgMHhCRCwgLyogMHg0NC0weDQ3ICovCisJMHhFNCwgMHhBNSwgMHg5QiwgMHhCOCwgMHhENywgMHhDNywgMHhCMiwgMHhFMiwgLyogMHg0OC0weDRCICovCisJMHg5QiwgMHhCOSwgMHhFNCwgMHhBQiwgMHhCQywgMHhDMywgMHhFNCwgMHhBRiwgLyogMHg0Qy0weDRGICovCisJMHg5QiwgMHhCQSwgMHhCQiwgMHhFQiwgMHhFNCwgMHhCMCwgMHhDNSwgMHhBOCwgLyogMHg1MC0weDUzICovCisJMHhFNCwgMHhCMSwgMHg5QiwgMHhCQiwgMHg5QiwgMHhCQywgMHg5QiwgMHhCRCwgLyogMHg1NC0weDU3ICovCisJMHg5QiwgMHhCRSwgMHhENSwgMHhFMywgMHhCRiwgMHhBMywgMHg5QiwgMHhCRiwgLyogMHg1OC0weDVCICovCisJMHhFNCwgMHhCQSwgMHg5QiwgMHhDMCwgMHhFNCwgMHhCNywgMHg5QiwgMHhDMSwgLyogMHg1Qy0weDVGICovCisJMHhFNCwgMHhCQiwgMHg5QiwgMHhDMiwgMHg5QiwgMHhDMywgMHhFNCwgMHhCRCwgLyogMHg2MC0weDYzICovCisJMHg5QiwgMHhDNCwgMHg5QiwgMHhDNSwgMHhDNiwgMHhENiwgMHg5QiwgMHhDNiwgLyogMHg2NC0weDY3ICovCisJMHg5QiwgMHhDNywgMHhCQSwgMHhDNiwgMHhDMCwgMHhDQiwgMHg5QiwgMHhDOCwgLyogMHg2OC0weDZCICovCisJMHg5QiwgMHhDOSwgMHg5QiwgMHhDQSwgMHhCOCwgMHhBMSwgMHhFNCwgMHhCNCwgLyogMHg2Qy0weDZGICovCisJMHg5QiwgMHhDQiwgMHg5QiwgMHhDQywgMHg5QiwgMHhDRCwgMHg5QiwgMHhDRSwgLyogMHg3MC0weDczICovCisJMHhENCwgMHhBMSwgMHg5QiwgMHhDRiwgMHg5QiwgMHhEMCwgMHhCQSwgMHhBMywgLyogMHg3NC0weDc3ICovCisJMHhCRCwgMHhGRSwgMHg5QiwgMHhEMSwgMHg5QiwgMHhEMiwgMHg5QiwgMHhEMywgLyogMHg3OC0weDdCICovCisJMHhFNCwgMHhCQywgMHg5QiwgMHhENCwgMHg5QiwgMHhENSwgMHg5QiwgMHhENiwgLyogMHg3Qy0weDdGICovCisJCisJMHg5QiwgMHhENywgMHg5QiwgMHhEOCwgMHhDRCwgMHhCRiwgMHg5QiwgMHhEOSwgLyogMHg4MC0weDgzICovCisJMHg5QiwgMHhEQSwgMHhDNCwgMHhGOSwgMHg5QiwgMHhEQiwgMHg5QiwgMHhEQywgLyogMHg4NC0weDg3ICovCisJMHhDRiwgMHhGQiwgMHhDOSwgMHhFNiwgMHg5QiwgMHhERCwgMHg5QiwgMHhERSwgLyogMHg4OC0weDhCICovCisJMHhEMywgMHhCRiwgMHg5QiwgMHhERiwgMHhDRiwgMHhEMSwgMHg5QiwgMHhFMCwgLyogMHg4Qy0weDhGICovCisJMHg5QiwgMHhFMSwgMHhFNCwgMHhCMywgMHg5QiwgMHhFMiwgMHhFNCwgMHhCOCwgLyogMHg5MC0weDkzICovCisJMHhFNCwgMHhCOSwgMHhDQywgMHhFOSwgMHg5QiwgMHhFMywgMHg5QiwgMHhFNCwgLyogMHg5NC0weDk3ICovCisJMHg5QiwgMHhFNSwgMHg5QiwgMHhFNiwgMHg5QiwgMHhFNywgMHhDQywgMHhDRSwgLyogMHg5OC0weDlCICovCisJMHg5QiwgMHhFOCwgMHhDMCwgMHhENCwgMHhFNCwgMHhCNSwgMHhDMSwgMHhCMCwgLyogMHg5Qy0weDlGICovCisJMHhFNCwgMHhCNiwgMHhDRSwgMHhEMCwgMHg5QiwgMHhFOSwgMHhCQiwgMHhDMSwgLyogMHhBMC0weEEzICovCisJMHhCNSwgMHhEMywgMHg5QiwgMHhFQSwgMHhDOCwgMHhGMywgMHhCRCwgMHhBNywgLyogMHhBNC0weEE3ICovCisJMHhENSwgMHhDNywgMHhDOSwgMHhBQywgMHhCOCwgMHhBMiwgMHhFNCwgMHhDQSwgLyogMHhBOC0weEFCICovCisJMHg5QiwgMHhFQiwgMHg5QiwgMHhFQywgMHhFNCwgMHhDQywgMHhEMSwgMHhDNCwgLyogMHhBQy0weEFGICovCisJMHg5QiwgMHhFRCwgMHg5QiwgMHhFRSwgMHhEMiwgMHhCQSwgMHg5QiwgMHhFRiwgLyogMHhCMC0weEIzICovCisJMHg5QiwgMHhGMCwgMHhCQSwgMHhBRCwgMHg5QiwgMHhGMSwgMHg5QiwgMHhGMiwgLyogMHhCNC0weEI3ICovCisJMHhCQSwgMHhENCwgMHg5QiwgMHhGMywgMHg5QiwgMHhGNCwgMHg5QiwgMHhGNSwgLyogMHhCOC0weEJCICovCisJMHg5QiwgMHhGNiwgMHg5QiwgMHhGNywgMHg5QiwgMHhGOCwgMHhFNCwgMHhDMywgLyogMHhCQy0weEJGICovCisJMHhCNSwgMHhFRCwgMHg5QiwgMHhGOSwgMHg5QiwgMHhGQSwgMHg5QiwgMHhGQiwgLyogMHhDMC0weEMzICovCisJMHhENywgMHhDRCwgMHhFNCwgMHhDMCwgMHhDRiwgMHhGRCwgMHhFNCwgMHhCRiwgLyogMHhDNC0weEM3ICovCisJMHg5QiwgMHhGQywgMHg5QiwgMHhGRCwgMHg5QiwgMHhGRSwgMHhDMSwgMHhEQywgLyogMHhDOC0weENCICovCisJMHhDQywgMHhDQSwgMHg5QywgMHg0MCwgMHg5QywgMHg0MSwgMHg5QywgMHg0MiwgLyogMHhDQy0weENGICovCisJMHg5QywgMHg0MywgMHhDQSwgMHhFNywgMHg5QywgMHg0NCwgMHg5QywgMHg0NSwgLyogMHhEMC0weEQzICovCisJMHg5QywgMHg0NiwgMHg5QywgMHg0NywgMHhDNCwgMHhENywgMHg5QywgMHg0OCwgLyogMHhENC0weEQ3ICovCisJMHhDQywgMHhENCwgMHhFNCwgMHhDOCwgMHg5QywgMHg0OSwgMHg5QywgMHg0QSwgLyogMHhEOC0weERCICovCisJMHg5QywgMHg0QiwgMHhFNCwgMHhDNywgMHhFNCwgMHhDMSwgMHg5QywgMHg0QywgLyogMHhEQy0weERGICovCisJMHhFNCwgMHhDNCwgMHhCNSwgMHhBRCwgMHg5QywgMHg0RCwgMHg5QywgMHg0RSwgLyogMHhFMC0weEUzICovCisJMHhEMywgMHhEOSwgMHg5QywgMHg0RiwgMHhFNCwgMHhDNiwgMHg5QywgMHg1MCwgLyogMHhFNC0weEU3ICovCisJMHg5QywgMHg1MSwgMHg5QywgMHg1MiwgMHg5QywgMHg1MywgMHhEMiwgMHhGOSwgLyogMHhFOC0weEVCICovCisJMHhCNCwgMHhFMywgMHg5QywgMHg1NCwgMHhCQiwgMHhCNCwgMHg5QywgMHg1NSwgLyogMHhFQy0weEVGICovCisJMHg5QywgMHg1NiwgMHhDOSwgMHhFRSwgMHg5QywgMHg1NywgMHhCNCwgMHhCRSwgLyogMHhGMC0weEYzICovCisJMHg5QywgMHg1OCwgMHg5QywgMHg1OSwgMHg5QywgMHg1QSwgMHhCQiwgMHhFQywgLyogMHhGNC0weEY3ICovCisJMHg5QywgMHg1QiwgMHhEMSwgMHhDRCwgMHg5QywgMHg1QywgMHhDQywgMHhFRCwgLyogMHhGOC0weEZCICovCisJMHhFRCwgMHhCNSwgMHg5QywgMHg1RCwgMHg5QywgMHg1RSwgMHg5QywgMHg1RiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNkVbNTEyXSA9IHsKKwkweDlDLCAweDYwLCAweDlDLCAweDYxLCAweDlDLCAweDYyLCAweDlDLCAweDYzLCAvKiAweDAwLTB4MDMgKi8KKwkweDlDLCAweDY0LCAweEM3LCAweEU1LCAweDlDLCAweDY1LCAweDlDLCAweDY2LCAvKiAweDA0LTB4MDcgKi8KKwkweDlDLCAweDY3LCAweDlDLCAweDY4LCAweEQ0LCAweEE4LCAweDlDLCAweDY5LCAvKiAweDA4LTB4MEIgKi8KKwkweEU0LCAweENCLCAweEQ3LCAweEQ1LCAweEU0LCAweEMyLCAweDlDLCAweDZBLCAvKiAweDBDLTB4MEYgKi8KKwkweEJELCAweEE1LCAweEU0LCAweEM1LCAweDlDLCAweDZCLCAweDlDLCAweDZDLCAvKiAweDEwLTB4MTMgKi8KKwkweEQzLCAweEU2LCAweDlDLCAweDZELCAweEU0LCAweEM5LCAweEM5LCAweEY4LCAvKiAweDE0LTB4MTcgKi8KKwkweDlDLCAweDZFLCAweDlDLCAweDZGLCAweEU0LCAweEJFLCAweDlDLCAweDcwLCAvKiAweDE4LTB4MUIgKi8KKwkweDlDLCAweDcxLCAweEQzLCAweEU1LCAweDlDLCAweDcyLCAweDlDLCAweDczLCAvKiAweDFDLTB4MUYgKi8KKwkweEM3LCAweEZFLCAweEI2LCAweEM5LCAweDlDLCAweDc0LCAweEQ0LCAweEZDLCAvKiAweDIwLTB4MjMgKi8KKwkweEIyLCAweEIzLCAweEU0LCAweEQ3LCAweDlDLCAweDc1LCAweDlDLCAweDc2LCAvKiAweDI0LTB4MjcgKi8KKwkweDlDLCAweDc3LCAweENFLCAweEMyLCAweDlDLCAweDc4LCAweEU0LCAweENELCAvKiAweDI4LTB4MkIgKi8KKwkweDlDLCAweDc5LCAweENFLCAweEJDLCAweDlDLCAweDdBLCAweEI4LCAweERCLCAvKiAweDJDLTB4MkYgKi8KKwkweDlDLCAweDdCLCAweDlDLCAweDdDLCAweEU0LCAweEQ2LCAweDlDLCAweDdELCAvKiAweDMwLTB4MzMgKi8KKwkweEJGLCAweENBLCAweDlDLCAweDdFLCAweDlDLCAweDgwLCAweDlDLCAweDgxLCAvKiAweDM0LTB4MzcgKi8KKwkweEQzLCAweENFLCAweDlDLCAweDgyLCAweEMzLCAweEVDLCAweDlDLCAweDgzLCAvKiAweDM4LTB4M0IgKi8KKwkweDlDLCAweDg0LCAweDlDLCAweDg1LCAweDlDLCAweDg2LCAweDlDLCAweDg3LCAvKiAweDNDLTB4M0YgKi8KKwkweDlDLCAweDg4LCAweDlDLCAweDg5LCAweDlDLCAweDhBLCAweEM1LCAweEM4LCAvKiAweDQwLTB4NDMgKi8KKwkweEU0LCAweEQ4LCAweDlDLCAweDhCLCAweDlDLCAweDhDLCAweDlDLCAweDhELCAvKiAweDQ0LTB4NDcgKi8KKwkweDlDLCAweDhFLCAweDlDLCAweDhGLCAweDlDLCAweDkwLCAweDlDLCAweDkxLCAvKiAweDQ4LTB4NEIgKi8KKwkweDlDLCAweDkyLCAweENELCAweEM0LCAweEU0LCAweENGLCAweDlDLCAweDkzLCAvKiAweDRDLTB4NEYgKi8KKwkweDlDLCAweDk0LCAweDlDLCAweDk1LCAweDlDLCAweDk2LCAweEU0LCAweEQ0LCAvKiAweDUwLTB4NTMgKi8KKwkweEU0LCAweEQ1LCAweDlDLCAweDk3LCAweEJBLCAweEZFLCAweDlDLCAweDk4LCAvKiAweDU0LTB4NTcgKi8KKwkweENGLCAweEU2LCAweDlDLCAweDk5LCAweDlDLCAweDlBLCAweEQ1LCAweEJGLCAvKiAweDU4LTB4NUIgKi8KKwkweDlDLCAweDlCLCAweDlDLCAweDlDLCAweDlDLCAweDlELCAweEU0LCAweEQyLCAvKiAweDVDLTB4NUYgKi8KKwkweDlDLCAweDlFLCAweDlDLCAweDlGLCAweDlDLCAweEEwLCAweDlDLCAweEExLCAvKiAweDYwLTB4NjMgKi8KKwkweDlDLCAweEEyLCAweDlDLCAweEEzLCAweDlDLCAweEE0LCAweDlDLCAweEE1LCAvKiAweDY0LTB4NjcgKi8KKwkweDlDLCAweEE2LCAweDlDLCAweEE3LCAweDlDLCAweEE4LCAweEU0LCAweEQwLCAvKiAweDY4LTB4NkIgKi8KKwkweDlDLCAweEE5LCAweDlDLCAweEFBLCAweEU0LCAweENFLCAweDlDLCAweEFCLCAvKiAweDZDLTB4NkYgKi8KKwkweDlDLCAweEFDLCAweDlDLCAweEFELCAweDlDLCAweEFFLCAweDlDLCAweEFGLCAvKiAweDcwLTB4NzMgKi8KKwkweDlDLCAweEIwLCAweDlDLCAweEIxLCAweDlDLCAweEIyLCAweDlDLCAweEIzLCAvKiAweDc0LTB4NzcgKi8KKwkweDlDLCAweEI0LCAweDlDLCAweEI1LCAweDlDLCAweEI2LCAweDlDLCAweEI3LCAvKiAweDc4LTB4N0IgKi8KKwkweDlDLCAweEI4LCAweDlDLCAweEI5LCAweENELCAweEU1LCAweENBLCAweEFBLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDlDLCAweEJBLCAweDlDLCAweEJCLCAweDlDLCAweEJDLCAweEMwLCAweEEzLCAvKiAweDgwLTB4ODMgKi8KKwkweDlDLCAweEJELCAweEJELCAweEE2LCAweEU0LCAweEQzLCAweDlDLCAweEJFLCAvKiAweDg0LTB4ODcgKi8KKwkweDlDLCAweEJGLCAweEI4LCAweEM4LCAweDlDLCAweEMwLCAweDlDLCAweEMxLCAvKiAweDg4LTB4OEIgKi8KKwkweDlDLCAweEMyLCAweDlDLCAweEMzLCAweDlDLCAweEM0LCAweEU0LCAweEU3LCAvKiAweDhDLTB4OEYgKi8KKwkweEQ0LCAweEI0LCAweDlDLCAweEM1LCAweDlDLCAweEM2LCAweDlDLCAweEM3LCAvKiAweDkwLTB4OTMgKi8KKwkweDlDLCAweEM4LCAweDlDLCAweEM5LCAweDlDLCAweENBLCAweDlDLCAweENCLCAvKiAweDk0LTB4OTcgKi8KKwkweEU0LCAweERCLCAweDlDLCAweENDLCAweDlDLCAweENELCAweDlDLCAweENFLCAvKiAweDk4LTB4OUIgKi8KKwkweEMxLCAweEVGLCAweDlDLCAweENGLCAweDlDLCAweEQwLCAweEU0LCAweEU5LCAvKiAweDlDLTB4OUYgKi8KKwkweDlDLCAweEQxLCAweDlDLCAweEQyLCAweEQyLCAweEU3LCAweDlDLCAweEQzLCAvKiAweEEwLTB4QTMgKi8KKwkweDlDLCAweEQ0LCAweEU0LCAweERGLCAweDlDLCAweEQ1LCAweEU0LCAweEUwLCAvKiAweEE0LTB4QTcgKi8KKwkweDlDLCAweEQ2LCAweDlDLCAweEQ3LCAweENGLCAweEFBLCAweDlDLCAweEQ4LCAvKiAweEE4LTB4QUIgKi8KKwkweDlDLCAweEQ5LCAweDlDLCAweERBLCAweDlDLCAweERCLCAweENCLCAweERELCAvKiAweEFDLTB4QUYgKi8KKwkweDlDLCAweERDLCAweEU0LCAweERBLCAweEU0LCAweEQxLCAweDlDLCAweERELCAvKiAweEIwLTB4QjMgKi8KKwkweEU0LCAweEU1LCAweDlDLCAweERFLCAweEM4LCAweERDLCAweEU0LCAweEUzLCAvKiAweEI0LTB4QjcgKi8KKwkweDlDLCAweERGLCAweDlDLCAweEUwLCAweEM0LCAweEU3LCAweEU0LCAweEUyLCAvKiAweEI4LTB4QkIgKi8KKwkweDlDLCAweEUxLCAweEU0LCAweEUxLCAweDlDLCAweEUyLCAweDlDLCAweEUzLCAvKiAweEJDLTB4QkYgKi8KKwkweDlDLCAweEU0LCAweEIzLCAweEZDLCAweEU0LCAweEU4LCAweDlDLCAweEU1LCAvKiAweEMwLTB4QzMgKi8KKwkweDlDLCAweEU2LCAweDlDLCAweEU3LCAweDlDLCAweEU4LCAweEI1LCAweEUxLCAvKiAweEM0LTB4QzcgKi8KKwkweDlDLCAweEU5LCAweDlDLCAweEVBLCAweDlDLCAweEVCLCAweEQ3LCAweENDLCAvKiAweEM4LTB4Q0IgKi8KKwkweDlDLCAweEVDLCAweDlDLCAweEVELCAweDlDLCAweEVFLCAweEU0LCAweEU2LCAvKiAweENDLTB4Q0YgKi8KKwkweDlDLCAweEVGLCAweEJCLCAweEFDLCAweDlDLCAweEYwLCAweEQ3LCAweEQyLCAvKiAweEQwLTB4RDMgKi8KKwkweENDLCAweENGLCAweEVCLCAweEY4LCAweDlDLCAweEYxLCAweEU0LCAweEU0LCAvKiAweEQ0LTB4RDcgKi8KKwkweDlDLCAweEYyLCAweDlDLCAweEYzLCAweEI5LCAweEY2LCAweDlDLCAweEY0LCAvKiAweEQ4LTB4REIgKi8KKwkweDlDLCAweEY1LCAweDlDLCAweEY2LCAweEQ2LCAweENELCAweEU0LCAweEQ5LCAvKiAweERDLTB4REYgKi8KKwkweEU0LCAweERDLCAweEMyLCAweEZBLCAweEU0LCAweERFLCAweDlDLCAweEY3LCAvKiAweEUwLTB4RTMgKi8KKwkweEMyLCAweENCLCAweEMwLCAweEM0LCAweEMyLCAweEQwLCAweDlDLCAweEY4LCAvKiAweEU0LTB4RTcgKi8KKwkweEIxLCAweEY1LCAweENDLCAweEIyLCAweDlDLCAweEY5LCAweDlDLCAweEZBLCAvKiAweEU4LTB4RUIgKi8KKwkweDlDLCAweEZCLCAweDlDLCAweEZDLCAweDlDLCAweEZELCAweDlDLCAweEZFLCAvKiAweEVDLTB4RUYgKi8KKwkweDlELCAweDQwLCAweDlELCAweDQxLCAweDlELCAweDQyLCAweDlELCAweDQzLCAvKiAweEYwLTB4RjMgKi8KKwkweEI1LCAweENFLCAweDlELCAweDQ0LCAweDlELCAweDQ1LCAweDlELCAweDQ2LCAvKiAweEY0LTB4RjcgKi8KKwkweDlELCAweDQ3LCAweEU0LCAweEVGLCAweDlELCAweDQ4LCAweDlELCAweDQ5LCAvKiAweEY4LTB4RkIgKi8KKwkweDlELCAweDRBLCAweDlELCAweDRCLCAweDlELCAweDRDLCAweDlELCAweDRELCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182Rls1MTJdID0geworCTB4OUQsIDB4NEUsIDB4OUQsIDB4NEYsIDB4QzYsIDB4QUYsIDB4OUQsIDB4NTAsIC8qIDB4MDAtMHgwMyAqLworCTB4OUQsIDB4NTEsIDB4OUQsIDB4NTIsIDB4QzYsIDB4RTEsIDB4OUQsIDB4NTMsIC8qIDB4MDQtMHgwNyAqLworCTB4OUQsIDB4NTQsIDB4RTQsIDB4RjUsIDB4OUQsIDB4NTUsIDB4OUQsIDB4NTYsIC8qIDB4MDgtMHgwQiAqLworCTB4OUQsIDB4NTcsIDB4OUQsIDB4NTgsIDB4OUQsIDB4NTksIDB4QzIsIDB4QTksIC8qIDB4MEMtMHgwRiAqLworCTB4OUQsIDB4NUEsIDB4OUQsIDB4NUIsIDB4OUQsIDB4NUMsIDB4QzAsIDB4RUMsIC8qIDB4MTAtMHgxMyAqLworCTB4RDEsIDB4REQsIDB4RTQsIDB4RUUsIDB4OUQsIDB4NUQsIDB4OUQsIDB4NUUsIC8qIDB4MTQtMHgxNyAqLworCTB4OUQsIDB4NUYsIDB4OUQsIDB4NjAsIDB4OUQsIDB4NjEsIDB4OUQsIDB4NjIsIC8qIDB4MTgtMHgxQiAqLworCTB4OUQsIDB4NjMsIDB4OUQsIDB4NjQsIDB4OUQsIDB4NjUsIDB4OUQsIDB4NjYsIC8qIDB4MUMtMHgxRiAqLworCTB4QzQsIDB4QUUsIDB4OUQsIDB4NjcsIDB4OUQsIDB4NjgsIDB4OUQsIDB4NjksIC8qIDB4MjAtMHgyMyAqLworCTB4RTQsIDB4RUQsIDB4OUQsIDB4NkEsIDB4OUQsIDB4NkIsIDB4OUQsIDB4NkMsIC8qIDB4MjQtMHgyNyAqLworCTB4OUQsIDB4NkQsIDB4RTQsIDB4RjYsIDB4RTQsIDB4RjQsIDB4QzIsIDB4RkUsIC8qIDB4MjgtMHgyQiAqLworCTB4OUQsIDB4NkUsIDB4RTQsIDB4REQsIDB4OUQsIDB4NkYsIDB4RTQsIDB4RjAsIC8qIDB4MkMtMHgyRiAqLworCTB4OUQsIDB4NzAsIDB4Q0EsIDB4RkUsIDB4OUQsIDB4NzEsIDB4RDUsIDB4QzQsIC8qIDB4MzAtMHgzMyAqLworCTB4OUQsIDB4NzIsIDB4OUQsIDB4NzMsIDB4RTQsIDB4RjEsIDB4OUQsIDB4NzQsIC8qIDB4MzQtMHgzNyAqLworCTB4OUQsIDB4NzUsIDB4OUQsIDB4NzYsIDB4OUQsIDB4NzcsIDB4OUQsIDB4NzgsIC8qIDB4MzgtMHgzQiAqLworCTB4OUQsIDB4NzksIDB4OUQsIDB4N0EsIDB4RDEsIDB4RkEsIDB4OUQsIDB4N0IsIC8qIDB4M0MtMHgzRiAqLworCTB4OUQsIDB4N0MsIDB4OUQsIDB4N0QsIDB4OUQsIDB4N0UsIDB4OUQsIDB4ODAsIC8qIDB4NDAtMHg0MyAqLworCTB4OUQsIDB4ODEsIDB4OUQsIDB4ODIsIDB4RTQsIDB4RUIsIDB4RTQsIDB4RUMsIC8qIDB4NDQtMHg0NyAqLworCTB4OUQsIDB4ODMsIDB4OUQsIDB4ODQsIDB4OUQsIDB4ODUsIDB4RTQsIDB4RjIsIC8qIDB4NDgtMHg0QiAqLworCTB4OUQsIDB4ODYsIDB4Q0UsIDB4QUIsIDB4OUQsIDB4ODcsIDB4OUQsIDB4ODgsIC8qIDB4NEMtMHg0RiAqLworCTB4OUQsIDB4ODksIDB4OUQsIDB4OEEsIDB4OUQsIDB4OEIsIDB4OUQsIDB4OEMsIC8qIDB4NTAtMHg1MyAqLworCTB4OUQsIDB4OEQsIDB4OUQsIDB4OEUsIDB4OUQsIDB4OEYsIDB4OUQsIDB4OTAsIC8qIDB4NTQtMHg1NyAqLworCTB4QzUsIDB4Q0IsIDB4OUQsIDB4OTEsIDB4OUQsIDB4OTIsIDB4OUQsIDB4OTMsIC8qIDB4NTgtMHg1QiAqLworCTB4QzcsIDB4QjEsIDB4OUQsIDB4OTQsIDB4QzIsIDB4QkEsIDB4OUQsIDB4OTUsIC8qIDB4NUMtMHg1RiAqLworCTB4OUQsIDB4OTYsIDB4OUQsIDB4OTcsIDB4RTQsIDB4RUEsIDB4OUQsIDB4OTgsIC8qIDB4NjAtMHg2MyAqLworCTB4OUQsIDB4OTksIDB4OUQsIDB4OUEsIDB4QzEsIDB4Q0EsIDB4OUQsIDB4OUIsIC8qIDB4NjQtMHg2NyAqLworCTB4OUQsIDB4OUMsIDB4OUQsIDB4OUQsIDB4OUQsIDB4OUUsIDB4OUQsIDB4OUYsIC8qIDB4NjgtMHg2QiAqLworCTB4OUQsIDB4QTAsIDB4Q0MsIDB4QjYsIDB4QjMsIDB4QjEsIDB4OUQsIDB4QTEsIC8qIDB4NkMtMHg2RiAqLworCTB4OUQsIDB4QTIsIDB4OUQsIDB4QTMsIDB4RTQsIDB4RkIsIDB4OUQsIDB4QTQsIC8qIDB4NzAtMHg3MyAqLworCTB4RTQsIDB4RjMsIDB4OUQsIDB4QTUsIDB4OUQsIDB4QTYsIDB4OUQsIDB4QTcsIC8qIDB4NzQtMHg3NyAqLworCTB4RTQsIDB4RkEsIDB4OUQsIDB4QTgsIDB4RTQsIDB4RkQsIDB4OUQsIDB4QTksIC8qIDB4NzgtMHg3QiAqLworCTB4RTQsIDB4RkMsIDB4OUQsIDB4QUEsIDB4OUQsIDB4QUIsIDB4OUQsIDB4QUMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OUQsIDB4QUQsIDB4OUQsIDB4QUUsIDB4OUQsIDB4QUYsIDB4OUQsIDB4QjAsIC8qIDB4ODAtMHg4MyAqLworCTB4QjMsIDB4Q0UsIDB4OUQsIDB4QjEsIDB4OUQsIDB4QjIsIDB4OUQsIDB4QjMsIC8qIDB4ODQtMHg4NyAqLworCTB4QjMsIDB4QkEsIDB4RTQsIDB4RjcsIDB4OUQsIDB4QjQsIDB4OUQsIDB4QjUsIC8qIDB4ODgtMHg4QiAqLworCTB4RTQsIDB4RjksIDB4RTQsIDB4RjgsIDB4QzUsIDB4RUMsIDB4OUQsIDB4QjYsIC8qIDB4OEMtMHg4RiAqLworCTB4OUQsIDB4QjcsIDB4OUQsIDB4QjgsIDB4OUQsIDB4QjksIDB4OUQsIDB4QkEsIC8qIDB4OTAtMHg5MyAqLworCTB4OUQsIDB4QkIsIDB4OUQsIDB4QkMsIDB4OUQsIDB4QkQsIDB4OUQsIDB4QkUsIC8qIDB4OTQtMHg5NyAqLworCTB4OUQsIDB4QkYsIDB4OUQsIDB4QzAsIDB4OUQsIDB4QzEsIDB4OUQsIDB4QzIsIC8qIDB4OTgtMHg5QiAqLworCTB4QzAsIDB4QkQsIDB4OUQsIDB4QzMsIDB4OUQsIDB4QzQsIDB4OUQsIDB4QzUsIC8qIDB4OUMtMHg5RiAqLworCTB4OUQsIDB4QzYsIDB4RDQsIDB4RTgsIDB4OUQsIDB4QzcsIDB4OUQsIDB4QzgsIC8qIDB4QTAtMHhBMyAqLworCTB4OUQsIDB4QzksIDB4OUQsIDB4Q0EsIDB4OUQsIDB4Q0IsIDB4RTUsIDB4QTIsIC8qIDB4QTQtMHhBNyAqLworCTB4OUQsIDB4Q0MsIDB4OUQsIDB4Q0QsIDB4OUQsIDB4Q0UsIDB4OUQsIDB4Q0YsIC8qIDB4QTgtMHhBQiAqLworCTB4OUQsIDB4RDAsIDB4OUQsIDB4RDEsIDB4OUQsIDB4RDIsIDB4OUQsIDB4RDMsIC8qIDB4QUMtMHhBRiAqLworCTB4OUQsIDB4RDQsIDB4OUQsIDB4RDUsIDB4OUQsIDB4RDYsIDB4QjAsIDB4QzQsIC8qIDB4QjAtMHhCMyAqLworCTB4OUQsIDB4RDcsIDB4OUQsIDB4RDgsIDB4RTUsIDB4QTQsIDB4OUQsIDB4RDksIC8qIDB4QjQtMHhCNyAqLworCTB4OUQsIDB4REEsIDB4RTUsIDB4QTMsIDB4OUQsIDB4REIsIDB4OUQsIDB4REMsIC8qIDB4QjgtMHhCQiAqLworCTB4OUQsIDB4REQsIDB4OUQsIDB4REUsIDB4OUQsIDB4REYsIDB4OUQsIDB4RTAsIC8qIDB4QkMtMHhCRiAqLworCTB4QkMsIDB4QTQsIDB4OUQsIDB4RTEsIDB4RTUsIDB4QTUsIDB4OUQsIDB4RTIsIC8qIDB4QzAtMHhDMyAqLworCTB4OUQsIDB4RTMsIDB4OUQsIDB4RTQsIDB4OUQsIDB4RTUsIDB4OUQsIDB4RTYsIC8qIDB4QzQtMHhDNyAqLworCTB4OUQsIDB4RTcsIDB4RTUsIDB4QTEsIDB4OUQsIDB4RTgsIDB4OUQsIDB4RTksIC8qIDB4QzgtMHhDQiAqLworCTB4OUQsIDB4RUEsIDB4OUQsIDB4RUIsIDB4OUQsIDB4RUMsIDB4OUQsIDB4RUQsIC8qIDB4Q0MtMHhDRiAqLworCTB4OUQsIDB4RUUsIDB4RTQsIDB4RkUsIDB4QjEsIDB4RjQsIDB4OUQsIDB4RUYsIC8qIDB4RDAtMHhEMyAqLworCTB4OUQsIDB4RjAsIDB4OUQsIDB4RjEsIDB4OUQsIDB4RjIsIDB4OUQsIDB4RjMsIC8qIDB4RDQtMHhENyAqLworCTB4OUQsIDB4RjQsIDB4OUQsIDB4RjUsIDB4OUQsIDB4RjYsIDB4OUQsIDB4RjcsIC8qIDB4RDgtMHhEQiAqLworCTB4OUQsIDB4RjgsIDB4OUQsIDB4RjksIDB4RTUsIDB4QTgsIDB4OUQsIDB4RkEsIC8qIDB4REMtMHhERiAqLworCTB4RTUsIDB4QTksIDB4RTUsIDB4QTYsIDB4OUQsIDB4RkIsIDB4OUQsIDB4RkMsIC8qIDB4RTAtMHhFMyAqLworCTB4OUQsIDB4RkQsIDB4OUQsIDB4RkUsIDB4OUUsIDB4NDAsIDB4OUUsIDB4NDEsIC8qIDB4RTQtMHhFNyAqLworCTB4OUUsIDB4NDIsIDB4OUUsIDB4NDMsIDB4OUUsIDB4NDQsIDB4OUUsIDB4NDUsIC8qIDB4RTgtMHhFQiAqLworCTB4OUUsIDB4NDYsIDB4OUUsIDB4NDcsIDB4RTUsIDB4QTcsIDB4RTUsIDB4QUEsIC8qIDB4RUMtMHhFRiAqLworCTB4OUUsIDB4NDgsIDB4OUUsIDB4NDksIDB4OUUsIDB4NEEsIDB4OUUsIDB4NEIsIC8qIDB4RjAtMHhGMyAqLworCTB4OUUsIDB4NEMsIDB4OUUsIDB4NEQsIDB4OUUsIDB4NEUsIDB4OUUsIDB4NEYsIC8qIDB4RjQtMHhGNyAqLworCTB4OUUsIDB4NTAsIDB4OUUsIDB4NTEsIDB4OUUsIDB4NTIsIDB4OUUsIDB4NTMsIC8qIDB4RjgtMHhGQiAqLworCTB4OUUsIDB4NTQsIDB4OUUsIDB4NTUsIDB4OUUsIDB4NTYsIDB4OUUsIDB4NTcsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzcwWzUxMl0gPSB7CisJMHg5RSwgMHg1OCwgMHg5RSwgMHg1OSwgMHg5RSwgMHg1QSwgMHg5RSwgMHg1QiwgLyogMHgwMC0weDAzICovCisJMHg5RSwgMHg1QywgMHg5RSwgMHg1RCwgMHg5RSwgMHg1RSwgMHg5RSwgMHg1RiwgLyogMHgwNC0weDA3ICovCisJMHg5RSwgMHg2MCwgMHg5RSwgMHg2MSwgMHg5RSwgMHg2MiwgMHg5RSwgMHg2MywgLyogMHgwOC0weDBCICovCisJMHg5RSwgMHg2NCwgMHg5RSwgMHg2NSwgMHg5RSwgMHg2NiwgMHg5RSwgMHg2NywgLyogMHgwQy0weDBGICovCisJMHg5RSwgMHg2OCwgMHhDNiwgMHhEOSwgMHg5RSwgMHg2OSwgMHg5RSwgMHg2QSwgLyogMHgxMC0weDEzICovCisJMHg5RSwgMHg2QiwgMHg5RSwgMHg2QywgMHg5RSwgMHg2RCwgMHg5RSwgMHg2RSwgLyogMHgxNC0weDE3ICovCisJMHg5RSwgMHg2RiwgMHg5RSwgMHg3MCwgMHhFNSwgMHhBQiwgMHhFNSwgMHhBRCwgLyogMHgxOC0weDFCICovCisJMHg5RSwgMHg3MSwgMHg5RSwgMHg3MiwgMHg5RSwgMHg3MywgMHg5RSwgMHg3NCwgLyogMHgxQy0weDFGICovCisJMHg5RSwgMHg3NSwgMHg5RSwgMHg3NiwgMHg5RSwgMHg3NywgMHhFNSwgMHhBQywgLyogMHgyMC0weDIzICovCisJMHg5RSwgMHg3OCwgMHg5RSwgMHg3OSwgMHg5RSwgMHg3QSwgMHg5RSwgMHg3QiwgLyogMHgyNC0weDI3ICovCisJMHg5RSwgMHg3QywgMHg5RSwgMHg3RCwgMHg5RSwgMHg3RSwgMHg5RSwgMHg4MCwgLyogMHgyOC0weDJCICovCisJMHg5RSwgMHg4MSwgMHg5RSwgMHg4MiwgMHg5RSwgMHg4MywgMHg5RSwgMHg4NCwgLyogMHgyQy0weDJGICovCisJMHg5RSwgMHg4NSwgMHg5RSwgMHg4NiwgMHg5RSwgMHg4NywgMHg5RSwgMHg4OCwgLyogMHgzMC0weDMzICovCisJMHg5RSwgMHg4OSwgMHhFNSwgMHhBRiwgMHg5RSwgMHg4QSwgMHg5RSwgMHg4QiwgLyogMHgzNC0weDM3ICovCisJMHg5RSwgMHg4QywgMHhFNSwgMHhBRSwgMHg5RSwgMHg4RCwgMHg5RSwgMHg4RSwgLyogMHgzOC0weDNCICovCisJMHg5RSwgMHg4RiwgMHg5RSwgMHg5MCwgMHg5RSwgMHg5MSwgMHg5RSwgMHg5MiwgLyogMHgzQy0weDNGICovCisJMHg5RSwgMHg5MywgMHg5RSwgMHg5NCwgMHg5RSwgMHg5NSwgMHg5RSwgMHg5NiwgLyogMHg0MC0weDQzICovCisJMHg5RSwgMHg5NywgMHg5RSwgMHg5OCwgMHg5RSwgMHg5OSwgMHg5RSwgMHg5QSwgLyogMHg0NC0weDQ3ICovCisJMHg5RSwgMHg5QiwgMHg5RSwgMHg5QywgMHg5RSwgMHg5RCwgMHg5RSwgMHg5RSwgLyogMHg0OC0weDRCICovCisJMHhCOSwgMHhFMCwgMHg5RSwgMHg5RiwgMHg5RSwgMHhBMCwgMHhFNSwgMHhCMCwgLyogMHg0Qy0weDRGICovCisJMHg5RSwgMHhBMSwgMHg5RSwgMHhBMiwgMHg5RSwgMHhBMywgMHg5RSwgMHhBNCwgLyogMHg1MC0weDUzICovCisJMHg5RSwgMHhBNSwgMHg5RSwgMHhBNiwgMHg5RSwgMHhBNywgMHg5RSwgMHhBOCwgLyogMHg1NC0weDU3ICovCisJMHg5RSwgMHhBOSwgMHg5RSwgMHhBQSwgMHg5RSwgMHhBQiwgMHg5RSwgMHhBQywgLyogMHg1OC0weDVCICovCisJMHg5RSwgMHhBRCwgMHg5RSwgMHhBRSwgMHhFNSwgMHhCMSwgMHg5RSwgMHhBRiwgLyogMHg1Qy0weDVGICovCisJMHg5RSwgMHhCMCwgMHg5RSwgMHhCMSwgMHg5RSwgMHhCMiwgMHg5RSwgMHhCMywgLyogMHg2MC0weDYzICovCisJMHg5RSwgMHhCNCwgMHg5RSwgMHhCNSwgMHg5RSwgMHhCNiwgMHg5RSwgMHhCNywgLyogMHg2NC0weDY3ICovCisJMHg5RSwgMHhCOCwgMHg5RSwgMHhCOSwgMHg5RSwgMHhCQSwgMHhCQiwgMHhGMCwgLyogMHg2OC0weDZCICovCisJMHhFQywgMHhFMSwgMHhDMywgMHhGMCwgMHg5RSwgMHhCQiwgMHhCNSwgMHhDNiwgLyogMHg2Qy0weDZGICovCisJMHhCQiwgMHhEMiwgMHg5RSwgMHhCQywgMHg5RSwgMHhCRCwgMHg5RSwgMHhCRSwgLyogMHg3MC0weDczICovCisJMHg5RSwgMHhCRiwgMHhDMSwgMHhFOSwgMHhENCwgMHhFRSwgMHg5RSwgMHhDMCwgLyogMHg3NC0weDc3ICovCisJMHhCRSwgMHhDNCwgMHg5RSwgMHhDMSwgMHg5RSwgMHhDMiwgMHg5RSwgMHhDMywgLyogMHg3OC0weDdCICovCisJMHhENywgMHhDNiwgMHg5RSwgMHhDNCwgMHhENCwgMHhENiwgMHhCMiwgMHhEMywgLyogMHg3Qy0weDdGICovCisJCisJMHhFQywgMHhCRSwgMHg5RSwgMHhDNSwgMHg5RSwgMHhDNiwgMHg5RSwgMHhDNywgLyogMHg4MC0weDgzICovCisJMHg5RSwgMHhDOCwgMHhFQSwgMHhDMSwgMHg5RSwgMHhDOSwgMHg5RSwgMHhDQSwgLyogMHg4NC0weDg3ICovCisJMHg5RSwgMHhDQiwgMHhDMiwgMHhBRiwgMHhCNCwgMHhCNiwgMHg5RSwgMHhDQywgLyogMHg4OC0weDhCICovCisJMHg5RSwgMHhDRCwgMHg5RSwgMHhDRSwgMHhEMSwgMHhENywgMHg5RSwgMHhDRiwgLyogMHg4Qy0weDhGICovCisJMHg5RSwgMHhEMCwgMHg5RSwgMHhEMSwgMHhCMywgMHhCNCwgMHg5RSwgMHhEMiwgLyogMHg5MC0weDkzICovCisJMHhDOCwgMHhCMiwgMHhCRiwgMHhCQiwgMHhFQywgMHhDMCwgMHg5RSwgMHhEMywgLyogMHg5NC0weDk3ICovCisJMHg5RSwgMHhENCwgMHhENiwgMHhDQiwgMHg5RSwgMHhENSwgMHg5RSwgMHhENiwgLyogMHg5OC0weDlCICovCisJMHhFQywgMHhCRiwgMHhFQywgMHhDMSwgMHg5RSwgMHhENywgMHg5RSwgMHhEOCwgLyogMHg5Qy0weDlGICovCisJMHg5RSwgMHhEOSwgMHg5RSwgMHhEQSwgMHg5RSwgMHhEQiwgMHg5RSwgMHhEQywgLyogMHhBMC0weEEzICovCisJMHg5RSwgMHhERCwgMHg5RSwgMHhERSwgMHg5RSwgMHhERiwgMHg5RSwgMHhFMCwgLyogMHhBNC0weEE3ICovCisJMHg5RSwgMHhFMSwgMHg5RSwgMHhFMiwgMHg5RSwgMHhFMywgMHhFQywgMHhDNSwgLyogMHhBOC0weEFCICovCisJMHhCRSwgMHhFNiwgMHhDQywgMHhCRiwgMHhDNSwgMHhEQSwgMHhCRSwgMHhCQywgLyogMHhBQy0weEFGICovCisJMHg5RSwgMHhFNCwgMHhFQywgMHhDNiwgMHg5RSwgMHhFNSwgMHhCMSwgMHhGRSwgLyogMHhCMC0weEIzICovCisJMHg5RSwgMHhFNiwgMHg5RSwgMHhFNywgMHg5RSwgMHhFOCwgMHhFQywgMHhDNCwgLyogMHhCNC0weEI3ICovCisJMHhENSwgMHhBOCwgMHhCNSwgMHhFMywgMHg5RSwgMHhFOSwgMHhFQywgMHhDMiwgLyogMHhCOC0weEJCICovCisJMHhDMSwgMHhCNiwgMHhCMywgMHhFMywgMHg5RSwgMHhFQSwgMHg5RSwgMHhFQiwgLyogMHhCQy0weEJGICovCisJMHhFQywgMHhDMywgMHhDQiwgMHhCOCwgMHhDMCwgMHhDMywgMHhDQywgMHhGRSwgLyogMHhDMC0weEMzICovCisJMHg5RSwgMHhFQywgMHg5RSwgMHhFRCwgMHg5RSwgMHhFRSwgMHg5RSwgMHhFRiwgLyogMHhDNC0weEM3ICovCisJMHhDMSwgMHhEMiwgMHg5RSwgMHhGMCwgMHhFQywgMHhDOCwgMHg5RSwgMHhGMSwgLyogMHhDOC0weENCICovCisJMHg5RSwgMHhGMiwgMHg5RSwgMHhGMywgMHg5RSwgMHhGNCwgMHg5RSwgMHhGNSwgLyogMHhDQy0weENGICovCisJMHg5RSwgMHhGNiwgMHg5RSwgMHhGNywgMHg5RSwgMHhGOCwgMHg5RSwgMHhGOSwgLyogMHhEMC0weEQzICovCisJMHg5RSwgMHhGQSwgMHg5RSwgMHhGQiwgMHg5RSwgMHhGQywgMHg5RSwgMHhGRCwgLyogMHhENC0weEQ3ICovCisJMHhCQSwgMHhFNiwgMHhDMCwgMHhEMywgMHg5RSwgMHhGRSwgMHhENiwgMHhGMiwgLyogMHhEOC0weERCICovCisJMHg5RiwgMHg0MCwgMHg5RiwgMHg0MSwgMHg5RiwgMHg0MiwgMHhEMSwgMHhDQywgLyogMHhEQy0weERGICovCisJMHg5RiwgMHg0MywgMHg5RiwgMHg0NCwgMHg5RiwgMHg0NSwgMHg5RiwgMHg0NiwgLyogMHhFMC0weEUzICovCisJMHhCRiwgMHhCRSwgMHg5RiwgMHg0NywgMHhCNywgMHhCMywgMHhDOSwgMHhENSwgLyogMHhFNC0weEU3ICovCisJMHhFQywgMHhDNywgMHhCQiwgMHhFMiwgMHg5RiwgMHg0OCwgMHhDQywgMHhDQywgLyogMHhFOC0weEVCICovCisJMHhCRCwgMHhGRCwgMHhDOCwgMHhDOCwgMHg5RiwgMHg0OSwgMHhDRiwgMHhBOSwgLyogMHhFQy0weEVGICovCisJMHg5RiwgMHg0QSwgMHg5RiwgMHg0QiwgMHg5RiwgMHg0QywgMHg5RiwgMHg0RCwgLyogMHhGMC0weEYzICovCisJMHg5RiwgMHg0RSwgMHg5RiwgMHg0RiwgMHg5RiwgMHg1MCwgMHhDRCwgMHhFOSwgLyogMHhGNC0weEY3ICovCisJMHg5RiwgMHg1MSwgMHhDNSwgMHhFQiwgMHg5RiwgMHg1MiwgMHg5RiwgMHg1MywgLyogMHhGOC0weEZCICovCisJMHg5RiwgMHg1NCwgMHhCNywgMHhFOSwgMHg5RiwgMHg1NSwgMHg5RiwgMHg1NiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzFbNTEyXSA9IHsKKwkweDlGLCAweDU3LCAweDlGLCAweDU4LCAweDlGLCAweDU5LCAweDlGLCAweDVBLCAvKiAweDAwLTB4MDMgKi8KKwkweDlGLCAweDVCLCAweDlGLCAweDVDLCAweDlGLCAweDVELCAweDlGLCAweDVFLCAvKiAweDA0LTB4MDcgKi8KKwkweDlGLCAweDVGLCAweEQxLCAweEM5LCAweEJBLCAweEI4LCAweDlGLCAweDYwLCAvKiAweDA4LTB4MEIgKi8KKwkweDlGLCAweDYxLCAweDlGLCAweDYyLCAweDlGLCAweDYzLCAweDlGLCAweDY0LCAvKiAweDBDLTB4MEYgKi8KKwkweEVDLCAweEM5LCAweDlGLCAweDY1LCAweDlGLCAweDY2LCAweEVDLCAweENBLCAvKiAweDEwLTB4MTMgKi8KKwkweDlGLCAweDY3LCAweEJCLCAweEMwLCAweEVDLCAweENCLCAweDlGLCAweDY4LCAvKiAweDE0LTB4MTcgKi8KKwkweEVDLCAweEUyLCAweEIxLCAweEJBLCAweEI3LCAweEQ5LCAweDlGLCAweDY5LCAvKiAweDE4LTB4MUIgKi8KKwkweDlGLCAweDZBLCAweDlGLCAweDZCLCAweDlGLCAweDZDLCAweDlGLCAweDZELCAvKiAweDFDLTB4MUYgKi8KKwkweDlGLCAweDZFLCAweDlGLCAweDZGLCAweDlGLCAweDcwLCAweDlGLCAweDcxLCAvKiAweDIwLTB4MjMgKi8KKwkweDlGLCAweDcyLCAweDlGLCAweDczLCAweEJELCAweEI5LCAweDlGLCAweDc0LCAvKiAweDI0LTB4MjcgKi8KKwkweDlGLCAweDc1LCAweDlGLCAweDc2LCAweDlGLCAweDc3LCAweDlGLCAweDc4LCAvKiAweDI4LTB4MkIgKi8KKwkweDlGLCAweDc5LCAweDlGLCAweDdBLCAweDlGLCAweDdCLCAweEVDLCAweENDLCAvKiAweDJDLTB4MkYgKi8KKwkweEQxLCAweEU2LCAweEVDLCAweENELCAweDlGLCAweDdDLCAweDlGLCAweDdELCAvKiAweDMwLTB4MzMgKi8KKwkweDlGLCAweDdFLCAweDlGLCAweDgwLCAweEM4LCAweEJCLCAweDlGLCAweDgxLCAvKiAweDM0LTB4MzcgKi8KKwkweDlGLCAweDgyLCAweDlGLCAweDgzLCAweDlGLCAweDg0LCAweDlGLCAweDg1LCAvKiAweDM4LTB4M0IgKi8KKwkweDlGLCAweDg2LCAweDlGLCAweDg3LCAweDlGLCAweDg4LCAweDlGLCAweDg5LCAvKiAweDNDLTB4M0YgKi8KKwkweDlGLCAweDhBLCAweDlGLCAweDhCLCAweDlGLCAweDhDLCAweDlGLCAweDhELCAvKiAweDQwLTB4NDMgKi8KKwkweDlGLCAweDhFLCAweEVDLCAweEQxLCAweDlGLCAweDhGLCAweDlGLCAweDkwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDlGLCAweDkxLCAweDlGLCAweDkyLCAweEVDLCAweEQzLCAweDlGLCAweDkzLCAvKiAweDQ4LTB4NEIgKi8KKwkweEJCLCAweENELCAweDlGLCAweDk0LCAweEJDLCAweEU1LCAweDlGLCAweDk1LCAvKiAweDRDLTB4NEYgKi8KKwkweDlGLCAweDk2LCAweDlGLCAweDk3LCAweDlGLCAweDk4LCAweDlGLCAweDk5LCAvKiAweDUwLTB4NTMgKi8KKwkweDlGLCAweDlBLCAweDlGLCAweDlCLCAweDlGLCAweDlDLCAweDlGLCAweDlELCAvKiAweDU0LTB4NTcgKi8KKwkweDlGLCAweDlFLCAweDlGLCAweDlGLCAweDlGLCAweEEwLCAweDlGLCAweEExLCAvKiAweDU4LTB4NUIgKi8KKwkweEVDLCAweENGLCAweDlGLCAweEEyLCAweEM5LCAweEI3LCAweDlGLCAweEEzLCAvKiAweDVDLTB4NUYgKi8KKwkweDlGLCAweEE0LCAweDlGLCAweEE1LCAweDlGLCAweEE2LCAweDlGLCAweEE3LCAvKiAweDYwLTB4NjMgKi8KKwkweEMzLCAweEJBLCAweDlGLCAweEE4LCAweEVDLCAweEUzLCAweEQ1LCAweEQ1LCAvKiAweDY0LTB4NjcgKi8KKwkweEVDLCAweEQwLCAweDlGLCAweEE5LCAweDlGLCAweEFBLCAweDlGLCAweEFCLCAvKiAweDY4LTB4NkIgKi8KKwkweDlGLCAweEFDLCAweDlGLCAweEFELCAweEQ2LCAweEYzLCAweDlGLCAweEFFLCAvKiAweDZDLTB4NkYgKi8KKwkweDlGLCAweEFGLCAweDlGLCAweEIwLCAweEVDLCAweEQyLCAweEVDLCAweENFLCAvKiAweDcwLTB4NzMgKi8KKwkweDlGLCAweEIxLCAweDlGLCAweEIyLCAweDlGLCAweEIzLCAweDlGLCAweEI0LCAvKiAweDc0LTB4NzcgKi8KKwkweEVDLCAweEQ0LCAweDlGLCAweEI1LCAweEVDLCAweEQ1LCAweDlGLCAweEI2LCAvKiAweDc4LTB4N0IgKi8KKwkweDlGLCAweEI3LCAweEM5LCAweEJGLCAweDlGLCAweEI4LCAweDlGLCAweEI5LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDlGLCAweEJBLCAweDlGLCAweEJCLCAweDlGLCAweEJDLCAweDlGLCAweEJELCAvKiAweDgwLTB4ODMgKi8KKwkweENGLCAweEE4LCAweDlGLCAweEJFLCAweDlGLCAweEJGLCAweDlGLCAweEMwLCAvKiAweDg0LTB4ODcgKi8KKwkweDlGLCAweEMxLCAweDlGLCAweEMyLCAweEQwLCAweERDLCAweDlGLCAweEMzLCAvKiAweDg4LTB4OEIgKi8KKwkweDlGLCAweEM0LCAweDlGLCAweEM1LCAweDlGLCAweEM2LCAweEQxLCAweEFDLCAvKiAweDhDLTB4OEYgKi8KKwkweDlGLCAweEM3LCAweDlGLCAweEM4LCAweDlGLCAweEM5LCAweDlGLCAweENBLCAvKiAweDkwLTB4OTMgKi8KKwkweEM4LCAweERCLCAweDlGLCAweENCLCAweDlGLCAweENDLCAweDlGLCAweENELCAvKiAweDk0LTB4OTcgKi8KKwkweEVDLCAweEQ2LCAweENFLCAweEY1LCAweDlGLCAweENFLCAweDlGLCAweENGLCAvKiAweDk4LTB4OUIgKi8KKwkweDlGLCAweEQwLCAweDlGLCAweEQxLCAweDlGLCAweEQyLCAweENBLCAweEVDLCAvKiAweDlDLTB4OUYgKi8KKwkweEVDLCAweERBLCAweDlGLCAweEQzLCAweDlGLCAweEQ0LCAweDlGLCAweEQ1LCAvKiAweEEwLTB4QTMgKi8KKwkweDlGLCAweEQ2LCAweDlGLCAweEQ3LCAweDlGLCAweEQ4LCAweDlGLCAweEQ5LCAvKiAweEE0LTB4QTcgKi8KKwkweEVDLCAweEQ5LCAweDlGLCAweERBLCAweDlGLCAweERCLCAweDlGLCAweERDLCAvKiAweEE4LTB4QUIgKi8KKwkweEIwLCAweEJFLCAweDlGLCAweERELCAweDlGLCAweERFLCAweDlGLCAweERGLCAvKiAweEFDLTB4QUYgKi8KKwkweDlGLCAweEUwLCAweDlGLCAweEUxLCAweDlGLCAweEUyLCAweEVDLCAweEQ3LCAvKiAweEIwLTB4QjMgKi8KKwkweDlGLCAweEUzLCAweEVDLCAweEQ4LCAweDlGLCAweEU0LCAweDlGLCAweEU1LCAvKiAweEI0LTB4QjcgKi8KKwkweDlGLCAweEU2LCAweEVDLCAweEU0LCAweDlGLCAweEU3LCAweDlGLCAweEU4LCAvKiAweEI4LTB4QkIgKi8KKwkweDlGLCAweEU5LCAweDlGLCAweEVBLCAweDlGLCAweEVCLCAweDlGLCAweEVDLCAvKiAweEJDLTB4QkYgKi8KKwkweDlGLCAweEVELCAweDlGLCAweEVFLCAweDlGLCAweEVGLCAweEM4LCAweEJDLCAvKiAweEMwLTB4QzMgKi8KKwkweDlGLCAweEYwLCAweDlGLCAweEYxLCAweDlGLCAweEYyLCAweDlGLCAweEYzLCAvKiAweEM0LTB4QzcgKi8KKwkweDlGLCAweEY0LCAweDlGLCAweEY1LCAweDlGLCAweEY2LCAweDlGLCAweEY3LCAvKiAweEM4LTB4Q0IgKi8KKwkweDlGLCAweEY4LCAweDlGLCAweEY5LCAweEMxLCAweEM3LCAweDlGLCAweEZBLCAvKiAweENDLTB4Q0YgKi8KKwkweDlGLCAweEZCLCAweDlGLCAweEZDLCAweDlGLCAweEZELCAweDlGLCAweEZFLCAvKiAweEQwLTB4RDMgKi8KKwkweEVDLCAweERDLCAweEQxLCAweEUwLCAweEEwLCAweDQwLCAweEEwLCAweDQxLCAvKiAweEQ0LTB4RDcgKi8KKwkweEEwLCAweDQyLCAweEEwLCAweDQzLCAweEEwLCAweDQ0LCAweEEwLCAweDQ1LCAvKiAweEQ4LTB4REIgKi8KKwkweEEwLCAweDQ2LCAweEEwLCAweDQ3LCAweEEwLCAweDQ4LCAweEEwLCAweDQ5LCAvKiAweERDLTB4REYgKi8KKwkweEVDLCAweERCLCAweEEwLCAweDRBLCAweEEwLCAweDRCLCAweEEwLCAweDRDLCAvKiAweEUwLTB4RTMgKi8KKwkweEEwLCAweDRELCAweEQ0LCAweEVGLCAweEEwLCAweDRFLCAweEVDLCAweERELCAvKiAweEU0LTB4RTcgKi8KKwkweEEwLCAweDRGLCAweEEwLCAweDUwLCAweEEwLCAweDUxLCAweEEwLCAweDUyLCAvKiAweEU4LTB4RUIgKi8KKwkweEEwLCAweDUzLCAweEEwLCAweDU0LCAweERCLCAweEM2LCAweEEwLCAweDU1LCAvKiAweEVDLTB4RUYgKi8KKwkweEEwLCAweDU2LCAweEEwLCAweDU3LCAweEEwLCAweDU4LCAweEEwLCAweDU5LCAvKiAweEYwLTB4RjMgKi8KKwkweEEwLCAweDVBLCAweEEwLCAweDVCLCAweEEwLCAweDVDLCAweEEwLCAweDVELCAvKiAweEY0LTB4RjcgKi8KKwkweEEwLCAweDVFLCAweEVDLCAweERFLCAweEEwLCAweDVGLCAweEEwLCAweDYwLCAvKiAweEY4LTB4RkIgKi8KKwkweEEwLCAweDYxLCAweEEwLCAweDYyLCAweEEwLCAweDYzLCAweEEwLCAweDY0LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183Mls1MTJdID0geworCTB4QTAsIDB4NjUsIDB4QTAsIDB4NjYsIDB4QTAsIDB4NjcsIDB4QTAsIDB4NjgsIC8qIDB4MDAtMHgwMyAqLworCTB4QTAsIDB4NjksIDB4QTAsIDB4NkEsIDB4QjEsIDB4QUMsIDB4QTAsIDB4NkIsIC8qIDB4MDQtMHgwNyAqLworCTB4QTAsIDB4NkMsIDB4QTAsIDB4NkQsIDB4QTAsIDB4NkUsIDB4QTAsIDB4NkYsIC8qIDB4MDgtMHgwQiAqLworCTB4QTAsIDB4NzAsIDB4QTAsIDB4NzEsIDB4QTAsIDB4NzIsIDB4QTAsIDB4NzMsIC8qIDB4MEMtMHgwRiAqLworCTB4QTAsIDB4NzQsIDB4QTAsIDB4NzUsIDB4QTAsIDB4NzYsIDB4QTAsIDB4NzcsIC8qIDB4MTAtMHgxMyAqLworCTB4QTAsIDB4NzgsIDB4QTAsIDB4NzksIDB4QTAsIDB4N0EsIDB4QTAsIDB4N0IsIC8qIDB4MTQtMHgxNyAqLworCTB4QTAsIDB4N0MsIDB4QTAsIDB4N0QsIDB4QTAsIDB4N0UsIDB4QTAsIDB4ODAsIC8qIDB4MTgtMHgxQiAqLworCTB4QTAsIDB4ODEsIDB4RUMsIDB4REYsIDB4QTAsIDB4ODIsIDB4QTAsIDB4ODMsIC8qIDB4MUMtMHgxRiAqLworCTB4QTAsIDB4ODQsIDB4QTAsIDB4ODUsIDB4QTAsIDB4ODYsIDB4QTAsIDB4ODcsIC8qIDB4MjAtMHgyMyAqLworCTB4QTAsIDB4ODgsIDB4QTAsIDB4ODksIDB4QTAsIDB4OEEsIDB4QTAsIDB4OEIsIC8qIDB4MjQtMHgyNyAqLworCTB4RUMsIDB4RTAsIDB4QTAsIDB4OEMsIDB4RDcsIDB4QTYsIDB4QTAsIDB4OEQsIC8qIDB4MjgtMHgyQiAqLworCTB4QzUsIDB4QzAsIDB4QTAsIDB4OEUsIDB4QTAsIDB4OEYsIDB4QTAsIDB4OTAsIC8qIDB4MkMtMHgyRiAqLworCTB4RUIsIDB4QkMsIDB4QjAsIDB4QUUsIDB4QTAsIDB4OTEsIDB4QTAsIDB4OTIsIC8qIDB4MzAtMHgzMyAqLworCTB4QTAsIDB4OTMsIDB4QkUsIDB4RjQsIDB4QjgsIDB4QjgsIDB4RDIsIDB4QUYsIC8qIDB4MzQtMHgzNyAqLworCTB4QjAsIDB4RDYsIDB4QjUsIDB4RjksIDB4QTAsIDB4OTQsIDB4RDgsIDB4QjMsIC8qIDB4MzgtMHgzQiAqLworCTB4QTAsIDB4OTUsIDB4Q0IsIDB4QUMsIDB4QTAsIDB4OTYsIDB4RTMsIDB4REQsIC8qIDB4M0MtMHgzRiAqLworCTB4QTAsIDB4OTcsIDB4QTAsIDB4OTgsIDB4QTAsIDB4OTksIDB4QTAsIDB4OUEsIC8qIDB4NDAtMHg0MyAqLworCTB4QTAsIDB4OUIsIDB4QTAsIDB4OUMsIDB4QTAsIDB4OUQsIDB4QzYsIDB4QUMsIC8qIDB4NDQtMHg0NyAqLworCTB4QjAsIDB4RTYsIDB4QTAsIDB4OUUsIDB4QTAsIDB4OUYsIDB4QTAsIDB4QTAsIC8qIDB4NDgtMHg0QiAqLworCTB4QzUsIDB4QzYsIDB4RUIsIDB4QjksIDB4QTAsIDB4QTEsIDB4QTAsIDB4QTIsIC8qIDB4NEMtMHg0RiAqLworCTB4QTAsIDB4QTMsIDB4QTAsIDB4QTQsIDB4RUIsIDB4QkEsIDB4QTAsIDB4QTUsIC8qIDB4NTAtMHg1MyAqLworCTB4QTAsIDB4QTYsIDB4QTAsIDB4QTcsIDB4RUIsIDB4QkIsIDB4QTAsIDB4QTgsIC8qIDB4NTQtMHg1NyAqLworCTB4QTAsIDB4QTksIDB4RDEsIDB4QzAsIDB4QTAsIDB4QUEsIDB4QzUsIDB4QTMsIC8qIDB4NTgtMHg1QiAqLworCTB4QTAsIDB4QUIsIDB4RUEsIDB4RjIsIDB4QTAsIDB4QUMsIDB4QzQsIDB4QjIsIC8qIDB4NUMtMHg1RiAqLworCTB4QTAsIDB4QUQsIDB4QzQsIDB4QjUsIDB4QzAsIDB4Q0UsIDB4QTAsIDB4QUUsIC8qIDB4NjAtMHg2MyAqLworCTB4QTAsIDB4QUYsIDB4QTAsIDB4QjAsIDB4RUEsIDB4RjMsIDB4QzQsIDB4QzEsIC8qIDB4NjQtMHg2NyAqLworCTB4QTAsIDB4QjEsIDB4Q0UsIDB4RUYsIDB4QTAsIDB4QjIsIDB4QTAsIDB4QjMsIC8qIDB4NjgtMHg2QiAqLworCTB4QTAsIDB4QjQsIDB4QTAsIDB4QjUsIDB4RUEsIDB4RjAsIDB4RUEsIDB4RjQsIC8qIDB4NkMtMHg2RiAqLworCTB4QTAsIDB4QjYsIDB4QTAsIDB4QjcsIDB4QzksIDB4RkMsIDB4QTAsIDB4QjgsIC8qIDB4NzAtMHg3MyAqLworCTB4QTAsIDB4QjksIDB4QzcsIDB4QTMsIDB4QTAsIDB4QkEsIDB4QTAsIDB4QkIsIC8qIDB4NzQtMHg3NyAqLworCTB4QTAsIDB4QkMsIDB4Q0MsIDB4RDgsIDB4Q0UsIDB4RkUsIDB4QTAsIDB4QkQsIC8qIDB4NzgtMHg3QiAqLworCTB4QTAsIDB4QkUsIDB4QTAsIDB4QkYsIDB4RUEsIDB4RjUsIDB4RUEsIDB4RjYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4Q0YsIDB4QUMsIDB4QzAsIDB4RTcsIDB4QTAsIDB4QzAsIDB4QTAsIDB4QzEsIC8qIDB4ODAtMHg4MyAqLworCTB4RUEsIDB4RjcsIDB4QTAsIDB4QzIsIDB4QTAsIDB4QzMsIDB4QTAsIDB4QzQsIC8qIDB4ODQtMHg4NyAqLworCTB4QTAsIDB4QzUsIDB4QTAsIDB4QzYsIDB4QjYsIDB4QkYsIDB4RUEsIDB4RjgsIC8qIDB4ODgtMHg4QiAqLworCTB4QTAsIDB4QzcsIDB4RUEsIDB4RjksIDB4QTAsIDB4QzgsIDB4RUEsIDB4RkEsIC8qIDB4OEMtMHg4RiAqLworCTB4QTAsIDB4QzksIDB4QTAsIDB4Q0EsIDB4RUEsIDB4RkIsIDB4QTAsIDB4Q0IsIC8qIDB4OTAtMHg5MyAqLworCTB4QTAsIDB4Q0MsIDB4QTAsIDB4Q0QsIDB4QTAsIDB4Q0UsIDB4QTAsIDB4Q0YsIC8qIDB4OTQtMHg5NyAqLworCTB4QTAsIDB4RDAsIDB4QTAsIDB4RDEsIDB4QTAsIDB4RDIsIDB4QTAsIDB4RDMsIC8qIDB4OTgtMHg5QiAqLworCTB4QTAsIDB4RDQsIDB4QTAsIDB4RDUsIDB4QTAsIDB4RDYsIDB4RUEsIDB4RjEsIC8qIDB4OUMtMHg5RiAqLworCTB4QTAsIDB4RDcsIDB4QTAsIDB4RDgsIDB4QTAsIDB4RDksIDB4QTAsIDB4REEsIC8qIDB4QTAtMHhBMyAqLworCTB4QTAsIDB4REIsIDB4QTAsIDB4REMsIDB4QTAsIDB4REQsIDB4QTAsIDB4REUsIC8qIDB4QTQtMHhBNyAqLworCTB4QTAsIDB4REYsIDB4QTAsIDB4RTAsIDB4QTAsIDB4RTEsIDB4QTAsIDB4RTIsIC8qIDB4QTgtMHhBQiAqLworCTB4QzgsIDB4QUUsIDB4RTEsIDB4RUIsIDB4QTAsIDB4RTMsIDB4QjcsIDB4QjgsIC8qIDB4QUMtMHhBRiAqLworCTB4RTEsIDB4RUMsIDB4QTAsIDB4RTQsIDB4QTAsIDB4RTUsIDB4QTAsIDB4RTYsIC8qIDB4QjAtMHhCMyAqLworCTB4RTEsIDB4RUQsIDB4QTAsIDB4RTcsIDB4RDcsIDB4QjQsIDB4RTEsIDB4RUUsIC8qIDB4QjQtMHhCNyAqLworCTB4RTEsIDB4RUYsIDB4RDMsIDB4Q0MsIDB4QTAsIDB4RTgsIDB4QTAsIDB4RTksIC8qIDB4QjgtMHhCQiAqLworCTB4QTAsIDB4RUEsIDB4QTAsIDB4RUIsIDB4QTAsIDB4RUMsIDB4QTAsIDB4RUQsIC8qIDB4QkMtMHhCRiAqLworCTB4QTAsIDB4RUUsIDB4RTEsIDB4RjEsIDB4QkYsIDB4RjEsIDB4RTEsIDB4RjAsIC8qIDB4QzAtMHhDMyAqLworCTB4QjUsIDB4RDIsIDB4QTAsIDB4RUYsIDB4QTAsIDB4RjAsIDB4QTAsIDB4RjEsIC8qIDB4QzQtMHhDNyAqLworCTB4QjEsIDB4QjcsIDB4QTAsIDB4RjIsIDB4QTAsIDB4RjMsIDB4QTAsIDB4RjQsIC8qIDB4QzgtMHhDQiAqLworCTB4QTAsIDB4RjUsIDB4RTEsIDB4RjMsIDB4RTEsIDB4RjIsIDB4QTAsIDB4RjYsIC8qIDB4Q0MtMHhDRiAqLworCTB4QkEsIDB4RkMsIDB4QTAsIDB4RjcsIDB4RTEsIDB4RjQsIDB4QTAsIDB4RjgsIC8qIDB4RDAtMHhEMyAqLworCTB4QTAsIDB4RjksIDB4QTAsIDB4RkEsIDB4QTAsIDB4RkIsIDB4QjksIDB4QjcsIC8qIDB4RDQtMHhENyAqLworCTB4QTAsIDB4RkMsIDB4QkUsIDB4RDEsIDB4QTAsIDB4RkQsIDB4QTAsIDB4RkUsIC8qIDB4RDgtMHhEQiAqLworCTB4QUEsIDB4NDAsIDB4QUEsIDB4NDEsIDB4QzQsIDB4RkMsIDB4QUEsIDB4NDIsIC8qIDB4REMtMHhERiAqLworCTB4QkEsIDB4REQsIDB4QkQsIDB4QzYsIDB4QUEsIDB4NDMsIDB4QUEsIDB4NDQsIC8qIDB4RTAtMHhFMyAqLworCTB4QUEsIDB4NDUsIDB4QUEsIDB4NDYsIDB4QUEsIDB4NDcsIDB4QUEsIDB4NDgsIC8qIDB4RTQtMHhFNyAqLworCTB4RTEsIDB4RjUsIDB4RTEsIDB4RjcsIDB4QUEsIDB4NDksIDB4QUEsIDB4NEEsIC8qIDB4RTgtMHhFQiAqLworCTB4QjYsIDB4QzAsIDB4Q0YsIDB4QzEsIDB4Q0EsIDB4QTgsIDB4RTEsIDB4RjYsIC8qIDB4RUMtMHhFRiAqLworCTB4RDUsIDB4RjgsIDB4RDMsIDB4RkMsIDB4RTEsIDB4RjgsIDB4RTEsIDB4RkMsIC8qIDB4RjAtMHhGMyAqLworCTB4RTEsIDB4RjksIDB4QUEsIDB4NEIsIDB4QUEsIDB4NEMsIDB4RTEsIDB4RkEsIC8qIDB4RjQtMHhGNyAqLworCTB4QzAsIDB4RUEsIDB4QUEsIDB4NEQsIDB4RTEsIDB4RkUsIDB4RTIsIDB4QTEsIC8qIDB4RjgtMHhGQiAqLworCTB4QzAsIDB4QzcsIDB4QUEsIDB4NEUsIDB4QUEsIDB4NEYsIDB4QUEsIDB4NTAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzczWzUxMl0gPSB7CisJMHhBQSwgMHg1MSwgMHhFMSwgMHhGQiwgMHhBQSwgMHg1MiwgMHhFMSwgMHhGRCwgLyogMHgwMC0weDAzICovCisJMHhBQSwgMHg1MywgMHhBQSwgMHg1NCwgMHhBQSwgMHg1NSwgMHhBQSwgMHg1NiwgLyogMHgwNC0weDA3ICovCisJMHhBQSwgMHg1NywgMHhBQSwgMHg1OCwgMHhFMiwgMHhBNSwgMHhBQSwgMHg1OSwgLyogMHgwOC0weDBCICovCisJMHhBQSwgMHg1QSwgMHhBQSwgMHg1QiwgMHhDMSwgMHhENCwgMHhBQSwgMHg1QywgLyogMHgwQy0weDBGICovCisJMHhBQSwgMHg1RCwgMHhBQSwgMHg1RSwgMHhBQSwgMHg1RiwgMHhFMiwgMHhBMywgLyogMHgxMC0weDEzICovCisJMHhBQSwgMHg2MCwgMHhFMiwgMHhBOCwgMHhCMiwgMHhGRSwgMHhFMiwgMHhBMiwgLyogMHgxNC0weDE3ICovCisJMHhBQSwgMHg2MSwgMHhBQSwgMHg2MiwgMHhBQSwgMHg2MywgMHhDMywgMHhDRCwgLyogMHgxOC0weDFCICovCisJMHhCMiwgMHhDMiwgMHhFMiwgMHhBNywgMHhFMiwgMHhBNiwgMHhBQSwgMHg2NCwgLyogMHgxQy0weDFGICovCisJMHhBQSwgMHg2NSwgMHhFMiwgMHhBNCwgMHhFMiwgMHhBOSwgMHhBQSwgMHg2NiwgLyogMHgyMC0weDIzICovCisJMHhBQSwgMHg2NywgMHhFMiwgMHhBQiwgMHhBQSwgMHg2OCwgMHhBQSwgMHg2OSwgLyogMHgyNC0weDI3ICovCisJMHhBQSwgMHg2QSwgMHhEMCwgMHhDOSwgMHhENiwgMHhFRCwgMHhDMywgMHhBOCwgLyogMHgyOC0weDJCICovCisJMHhFMiwgMHhBQywgMHhBQSwgMHg2QiwgMHhDRiwgMHhENywgMHhBQSwgMHg2QywgLyogMHgyQy0weDJGICovCisJMHhBQSwgMHg2RCwgMHhFMiwgMHhBRSwgMHhBQSwgMHg2RSwgMHhBQSwgMHg2RiwgLyogMHgzMC0weDMzICovCisJMHhCQSwgMHhFRiwgMHhBQSwgMHg3MCwgMHhBQSwgMHg3MSwgMHhFOSwgMHhFMCwgLyogMHgzNC0weDM3ICovCisJMHhFMiwgMHhBRCwgMHhFMiwgMHhBQSwgMHhBQSwgMHg3MiwgMHhBQSwgMHg3MywgLyogMHgzOC0weDNCICovCisJMHhBQSwgMHg3NCwgMHhBQSwgMHg3NSwgMHhCQiwgMHhBQiwgMHhENCwgMHhCMywgLyogMHgzQy0weDNGICovCisJMHhBQSwgMHg3NiwgMHhBQSwgMHg3NywgMHhBQSwgMHg3OCwgMHhBQSwgMHg3OSwgLyogMHg0MC0weDQzICovCisJMHhBQSwgMHg3QSwgMHhBQSwgMHg3QiwgMHhBQSwgMHg3QywgMHhBQSwgMHg3RCwgLyogMHg0NC0weDQ3ICovCisJMHhBQSwgMHg3RSwgMHhBQSwgMHg4MCwgMHhBQSwgMHg4MSwgMHhBQSwgMHg4MiwgLyogMHg0OC0weDRCICovCisJMHhBQSwgMHg4MywgMHhFMiwgMHhCMCwgMHhBQSwgMHg4NCwgMHhBQSwgMHg4NSwgLyogMHg0Qy0weDRGICovCisJMHhFMiwgMHhBRiwgMHhBQSwgMHg4NiwgMHhFOSwgMHhFMSwgMHhBQSwgMHg4NywgLyogMHg1MC0weDUzICovCisJMHhBQSwgMHg4OCwgMHhBQSwgMHg4OSwgMHhBQSwgMHg4QSwgMHhFMiwgMHhCMSwgLyogMHg1NC0weDU3ICovCisJMHhBQSwgMHg4QiwgMHhBQSwgMHg4QywgMHhBQSwgMHg4RCwgMHhBQSwgMHg4RSwgLyogMHg1OC0weDVCICovCisJMHhBQSwgMHg4RiwgMHhBQSwgMHg5MCwgMHhBQSwgMHg5MSwgMHhBQSwgMHg5MiwgLyogMHg1Qy0weDVGICovCisJMHhFMiwgMHhCMiwgMHhBQSwgMHg5MywgMHhBQSwgMHg5NCwgMHhBQSwgMHg5NSwgLyogMHg2MC0weDYzICovCisJMHhBQSwgMHg5NiwgMHhBQSwgMHg5NywgMHhBQSwgMHg5OCwgMHhBQSwgMHg5OSwgLyogMHg2NC0weDY3ICovCisJMHhBQSwgMHg5QSwgMHhBQSwgMHg5QiwgMHhBQSwgMHg5QywgMHhBQSwgMHg5RCwgLyogMHg2OC0weDZCICovCisJMHhFMiwgMHhCMywgMHhDQywgMHhBMSwgMHhBQSwgMHg5RSwgMHhFMiwgMHhCNCwgLyogMHg2Qy0weDZGICovCisJMHhBQSwgMHg5RiwgMHhBQSwgMHhBMCwgMHhBQiwgMHg0MCwgMHhBQiwgMHg0MSwgLyogMHg3MC0weDczICovCisJMHhBQiwgMHg0MiwgMHhBQiwgMHg0MywgMHhBQiwgMHg0NCwgMHhBQiwgMHg0NSwgLyogMHg3NC0weDc3ICovCisJMHhBQiwgMHg0NiwgMHhBQiwgMHg0NywgMHhBQiwgMHg0OCwgMHhBQiwgMHg0OSwgLyogMHg3OC0weDdCICovCisJMHhBQiwgMHg0QSwgMHhBQiwgMHg0QiwgMHhFMiwgMHhCNSwgMHhBQiwgMHg0QywgLyogMHg3Qy0weDdGICovCisJCisJMHhBQiwgMHg0RCwgMHhBQiwgMHg0RSwgMHhBQiwgMHg0RiwgMHhBQiwgMHg1MCwgLyogMHg4MC0weDgzICovCisJMHhEMCwgMHhGRSwgMHhBQiwgMHg1MSwgMHhBQiwgMHg1MiwgMHhDMiwgMHhDQSwgLyogMHg4NC0weDg3ICovCisJMHhBQiwgMHg1MywgMHhEMywgMHhGMSwgMHhBQiwgMHg1NCwgMHhDRCwgMHhGNSwgLyogMHg4OC0weDhCICovCisJMHhBQiwgMHg1NSwgMHhBQiwgMHg1NiwgMHhFNywgMHhFMCwgMHhBQiwgMHg1NywgLyogMHg4Qy0weDhGICovCisJMHhBQiwgMHg1OCwgMHhFNywgMHhFMSwgMHhBQiwgMHg1OSwgMHhBQiwgMHg1QSwgLyogMHg5MC0weDkzICovCisJMHhBQiwgMHg1QiwgMHhBQiwgMHg1QywgMHhCRSwgMHhDMSwgMHhBQiwgMHg1RCwgLyogMHg5NC0weDk3ICovCisJMHhBQiwgMHg1RSwgMHhBQiwgMHg1RiwgMHhBQiwgMHg2MCwgMHhDMiwgMHhFQSwgLyogMHg5OC0weDlCICovCisJMHhBQiwgMHg2MSwgMHhBQiwgMHg2MiwgMHhBQiwgMHg2MywgMHhFNywgMHhFNCwgLyogMHg5Qy0weDlGICovCisJMHhBQiwgMHg2NCwgMHhBQiwgMHg2NSwgMHhFNywgMHhFMywgMHhBQiwgMHg2NiwgLyogMHhBMC0weEEzICovCisJMHhBQiwgMHg2NywgMHhBQiwgMHg2OCwgMHhBQiwgMHg2OSwgMHhBQiwgMHg2QSwgLyogMHhBNC0weEE3ICovCisJMHhBQiwgMHg2QiwgMHhDRCwgMHhFNiwgMHhBQiwgMHg2QywgMHhDMywgMHhCNSwgLyogMHhBOC0weEFCICovCisJMHhBQiwgMHg2RCwgMHhBQiwgMHg2RSwgMHhFNywgMHhFMiwgMHhCQiwgMHhCNywgLyogMHhBQy0weEFGICovCisJMHhDRiwgMHhENiwgMHhBQiwgMHg2RiwgMHhDMSwgMHhFMSwgMHhFNywgMHhFOSwgLyogMHhCMC0weEIzICovCisJMHhBQiwgMHg3MCwgMHhBQiwgMHg3MSwgMHhBQiwgMHg3MiwgMHhFNywgMHhFOCwgLyogMHhCNC0weEI3ICovCisJMHhBQiwgMHg3MywgMHhBQiwgMHg3NCwgMHhFNywgMHhGNCwgMHhCMiwgMHhBMywgLyogMHhCOC0weEJCICovCisJMHhBQiwgMHg3NSwgMHhBQiwgMHg3NiwgMHhBQiwgMHg3NywgMHhBQiwgMHg3OCwgLyogMHhCQy0weEJGICovCisJMHhFNywgMHhFQSwgMHhBQiwgMHg3OSwgMHhFNywgMHhFNiwgMHhBQiwgMHg3QSwgLyogMHhDMC0weEMzICovCisJMHhBQiwgMHg3QiwgMHhBQiwgMHg3QywgMHhBQiwgMHg3RCwgMHhBQiwgMHg3RSwgLyogMHhDNC0weEM3ICovCisJMHhFNywgMHhFQywgMHhFNywgMHhFQiwgMHhDOSwgMHhCQSwgMHhBQiwgMHg4MCwgLyogMHhDOC0weENCICovCisJMHhBQiwgMHg4MSwgMHhENSwgMHhFNCwgMHhBQiwgMHg4MiwgMHhFNywgMHhFNSwgLyogMHhDQy0weENGICovCisJMHhCNywgMHhBOSwgMHhFNywgMHhFNywgMHhBQiwgMHg4MywgMHhBQiwgMHg4NCwgLyogMHhEMC0weEQzICovCisJMHhBQiwgMHg4NSwgMHhBQiwgMHg4NiwgMHhBQiwgMHg4NywgMHhBQiwgMHg4OCwgLyogMHhENC0weEQ3ICovCisJMHhBQiwgMHg4OSwgMHhFNywgMHhFRSwgMHhBQiwgMHg4QSwgMHhBQiwgMHg4QiwgLyogMHhEOC0weERCICovCisJMHhBQiwgMHg4QywgMHhBQiwgMHg4RCwgMHhFNywgMHhGMywgMHhBQiwgMHg4RSwgLyogMHhEQy0weERGICovCisJMHhENiwgMHhFOSwgMHhBQiwgMHg4RiwgMHhBQiwgMHg5MCwgMHhBQiwgMHg5MSwgLyogMHhFMC0weEUzICovCisJMHhBQiwgMHg5MiwgMHhFNywgMHhFRCwgMHhBQiwgMHg5MywgMHhFNywgMHhGMiwgLyogMHhFNC0weEU3ICovCisJMHhBQiwgMHg5NCwgMHhFNywgMHhGMSwgMHhBQiwgMHg5NSwgMHhBQiwgMHg5NiwgLyogMHhFOC0weEVCICovCisJMHhBQiwgMHg5NywgMHhCMCwgMHhFMCwgMHhBQiwgMHg5OCwgMHhBQiwgMHg5OSwgLyogMHhFQy0weEVGICovCisJMHhBQiwgMHg5QSwgMHhBQiwgMHg5QiwgMHhFNywgMHhGNSwgMHhBQiwgMHg5QywgLyogMHhGMC0weEYzICovCisJMHhBQiwgMHg5RCwgMHhBQiwgMHg5RSwgMHhBQiwgMHg5RiwgMHhBQiwgMHhBMCwgLyogMHhGNC0weEY3ICovCisJMHhBQywgMHg0MCwgMHhBQywgMHg0MSwgMHhBQywgMHg0MiwgMHhBQywgMHg0MywgLyogMHhGOC0weEZCICovCisJMHhBQywgMHg0NCwgMHhBQywgMHg0NSwgMHhBQywgMHg0NiwgMHhBQywgMHg0NywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzRbNTEyXSA9IHsKKwkweEFDLCAweDQ4LCAweEFDLCAweDQ5LCAweEFDLCAweDRBLCAweEM3LCAweEYyLCAvKiAweDAwLTB4MDMgKi8KKwkweEFDLCAweDRCLCAweEMwLCAweEM1LCAweEMwLCAweEVELCAweEFDLCAweDRDLCAvKiAweDA0LTB4MDcgKi8KKwkweEFDLCAweDRELCAweEMxLCAweEYwLCAweEU3LCAweEYwLCAweEFDLCAweDRFLCAvKiAweDA4LTB4MEIgKi8KKwkweEFDLCAweDRGLCAweEFDLCAweDUwLCAweEFDLCAweDUxLCAweEU3LCAweEY2LCAvKiAweDBDLTB4MEYgKi8KKwkweENCLCAweEY2LCAweEFDLCAweDUyLCAweEFDLCAweDUzLCAweEFDLCAweDU0LCAvKiAweDEwLTB4MTMgKi8KKwkweEFDLCAweDU1LCAweEFDLCAweDU2LCAweEFDLCAweDU3LCAweEFDLCAweDU4LCAvKiAweDE0LTB4MTcgKi8KKwkweEFDLCAweDU5LCAweEFDLCAweDVBLCAweEU4LCAweEEyLCAweEU4LCAweEExLCAvKiAweDE4LTB4MUIgKi8KKwkweEFDLCAweDVCLCAweEFDLCAweDVDLCAweEFDLCAweDVELCAweEFDLCAweDVFLCAvKiAweDFDLTB4MUYgKi8KKwkweEFDLCAweDVGLCAweEFDLCAweDYwLCAweEQ3LCAweEMxLCAweEFDLCAweDYxLCAvKiAweDIwLTB4MjMgKi8KKwkweEFDLCAweDYyLCAweEU3LCAweEZBLCAweEU3LCAweEY5LCAweEFDLCAweDYzLCAvKiAweDI0LTB4MjcgKi8KKwkweEU3LCAweEZCLCAweEFDLCAweDY0LCAweEU3LCAweEY3LCAweEFDLCAweDY1LCAvKiAweDI4LTB4MkIgKi8KKwkweEU3LCAweEZFLCAweEFDLCAweDY2LCAweEU3LCAweEZELCAweEFDLCAweDY3LCAvKiAweDJDLTB4MkYgKi8KKwkweEU3LCAweEZDLCAweEFDLCAweDY4LCAweEFDLCAweDY5LCAweEMxLCAweEQ1LCAvKiAweDMwLTB4MzMgKi8KKwkweEM3LCAweEQ5LCAweEM1LCAweEZELCAweEM1LCAweEMzLCAweEFDLCAweDZBLCAvKiAweDM0LTB4MzcgKi8KKwkweEFDLCAweDZCLCAweEFDLCAweDZDLCAweEFDLCAweDZELCAweEFDLCAweDZFLCAvKiAweDM4LTB4M0IgKi8KKwkweEM3LCAweEVELCAweEFDLCAweDZGLCAweEFDLCAweDcwLCAweEFDLCAweDcxLCAvKiAweDNDLTB4M0YgKi8KKwkweEFDLCAweDcyLCAweEU4LCAweEEzLCAweEFDLCAweDczLCAweEFDLCAweDc0LCAvKiAweDQwLTB4NDMgKi8KKwkweEFDLCAweDc1LCAweEFDLCAweDc2LCAweEFDLCAweDc3LCAweEFDLCAweDc4LCAvKiAweDQ0LTB4NDcgKi8KKwkweEFDLCAweDc5LCAweEFDLCAweDdBLCAweEFDLCAweDdCLCAweEFDLCAweDdDLCAvKiAweDQ4LTB4NEIgKi8KKwkweEFDLCAweDdELCAweEFDLCAweDdFLCAweEFDLCAweDgwLCAweEFDLCAweDgxLCAvKiAweDRDLTB4NEYgKi8KKwkweEFDLCAweDgyLCAweEFDLCAweDgzLCAweEFDLCAweDg0LCAweEFDLCAweDg1LCAvKiAweDUwLTB4NTMgKi8KKwkweEFDLCAweDg2LCAweEU4LCAweEE2LCAweEFDLCAweDg3LCAweEU4LCAweEE1LCAvKiAweDU0LTB4NTcgKi8KKwkweEFDLCAweDg4LCAweEU4LCAweEE3LCAweEJBLCAweEY3LCAweEU3LCAweEY4LCAvKiAweDU4LTB4NUIgKi8KKwkweEU4LCAweEE0LCAweEFDLCAweDg5LCAweEM4LCAweEYwLCAweEM5LCAweEFBLCAvKiAweDVDLTB4NUYgKi8KKwkweEFDLCAweDhBLCAweEFDLCAweDhCLCAweEFDLCAweDhDLCAweEFDLCAweDhELCAvKiAweDYwLTB4NjMgKi8KKwkweEFDLCAweDhFLCAweEFDLCAweDhGLCAweEFDLCAweDkwLCAweEFDLCAweDkxLCAvKiAweDY0LTB4NjcgKi8KKwkweEFDLCAweDkyLCAweEFDLCAweDkzLCAweEFDLCAweDk0LCAweEFDLCAweDk1LCAvKiAweDY4LTB4NkIgKi8KKwkweEFDLCAweDk2LCAweEU4LCAweEE5LCAweEFDLCAweDk3LCAweEFDLCAweDk4LCAvKiAweDZDLTB4NkYgKi8KKwkweEI5LCAweEU1LCAweEFDLCAweDk5LCAweEFDLCAweDlBLCAweEFDLCAweDlCLCAvKiAweDcwLTB4NzMgKi8KKwkweEFDLCAweDlDLCAweEFDLCAweDlELCAweEQxLCAweEZFLCAweEU4LCAweEE4LCAvKiAweDc0LTB4NzcgKi8KKwkweEFDLCAweDlFLCAweEFDLCAweDlGLCAweEFDLCAweEEwLCAweEFELCAweDQwLCAvKiAweDc4LTB4N0IgKi8KKwkweEFELCAweDQxLCAweEFELCAweDQyLCAweEU4LCAweEFBLCAweEFELCAweDQzLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEU4LCAweEFELCAweEU4LCAweEFFLCAweEFELCAweDQ0LCAweEMxLCAweEE3LCAvKiAweDgwLTB4ODMgKi8KKwkweEFELCAweDQ1LCAweEFELCAweDQ2LCAweEFELCAweDQ3LCAweEU4LCAweEFGLCAvKiAweDg0LTB4ODcgKi8KKwkweEFELCAweDQ4LCAweEFELCAweDQ5LCAweEFELCAweDRBLCAweEU4LCAweEIwLCAvKiAweDg4LTB4OEIgKi8KKwkweEFELCAweDRCLCAweEFELCAweDRDLCAweEU4LCAweEFDLCAweEFELCAweDRELCAvKiAweDhDLTB4OEYgKi8KKwkweEU4LCAweEI0LCAweEFELCAweDRFLCAweEFELCAweDRGLCAweEFELCAweDUwLCAvKiAweDkwLTB4OTMgKi8KKwkweEFELCAweDUxLCAweEFELCAweDUyLCAweEFELCAweDUzLCAweEFELCAweDU0LCAvKiAweDk0LTB4OTcgKi8KKwkweEFELCAweDU1LCAweEFELCAweDU2LCAweEFELCAweDU3LCAweEFELCAweDU4LCAvKiAweDk4LTB4OUIgKi8KKwkweEU4LCAweEFCLCAweEFELCAweDU5LCAweEU4LCAweEIxLCAweEFELCAweDVBLCAvKiAweDlDLTB4OUYgKi8KKwkweEFELCAweDVCLCAweEFELCAweDVDLCAweEFELCAweDVELCAweEFELCAweDVFLCAvKiAweEEwLTB4QTMgKi8KKwkweEFELCAweDVGLCAweEFELCAweDYwLCAweEFELCAweDYxLCAweEU4LCAweEI1LCAvKiAweEE0LTB4QTcgKi8KKwkweEU4LCAweEIyLCAweEU4LCAweEIzLCAweEFELCAweDYyLCAweEFELCAweDYzLCAvKiAweEE4LTB4QUIgKi8KKwkweEFELCAweDY0LCAweEFELCAweDY1LCAweEFELCAweDY2LCAweEFELCAweDY3LCAvKiAweEFDLTB4QUYgKi8KKwkweEFELCAweDY4LCAweEFELCAweDY5LCAweEFELCAweDZBLCAweEFELCAweDZCLCAvKiAweEIwLTB4QjMgKi8KKwkweEFELCAweDZDLCAweEFELCAweDZELCAweEFELCAweDZFLCAweEFELCAweDZGLCAvKiAweEI0LTB4QjcgKi8KKwkweEFELCAweDcwLCAweEFELCAweDcxLCAweEU4LCAweEI3LCAweEFELCAweDcyLCAvKiAweEI4LTB4QkIgKi8KKwkweEFELCAweDczLCAweEFELCAweDc0LCAweEFELCAweDc1LCAweEFELCAweDc2LCAvKiAweEJDLTB4QkYgKi8KKwkweEFELCAweDc3LCAweEFELCAweDc4LCAweEFELCAweDc5LCAweEFELCAweDdBLCAvKiAweEMwLTB4QzMgKi8KKwkweEFELCAweDdCLCAweEFELCAweDdDLCAweEFELCAweDdELCAweEFELCAweDdFLCAvKiAweEM0LTB4QzcgKi8KKwkweEFELCAweDgwLCAweEFELCAweDgxLCAweEFELCAweDgyLCAweEFELCAweDgzLCAvKiAweEM4LTB4Q0IgKi8KKwkweEFELCAweDg0LCAweEFELCAweDg1LCAweEFELCAweDg2LCAweEFELCAweDg3LCAvKiAweENDLTB4Q0YgKi8KKwkweEFELCAweDg4LCAweEFELCAweDg5LCAweEU4LCAweEI2LCAweEFELCAweDhBLCAvKiAweEQwLTB4RDMgKi8KKwkweEFELCAweDhCLCAweEFELCAweDhDLCAweEFELCAweDhELCAweEFELCAweDhFLCAvKiAweEQ0LTB4RDcgKi8KKwkweEFELCAweDhGLCAweEFELCAweDkwLCAweEFELCAweDkxLCAweEFELCAweDkyLCAvKiAweEQ4LTB4REIgKi8KKwkweEI5LCAweENGLCAweEFELCAweDkzLCAweEYwLCAweEFDLCAweEFELCAweDk0LCAvKiAweERDLTB4REYgKi8KKwkweEYwLCAweEFELCAweEFELCAweDk1LCAweEM2LCAweEIwLCAweEIwLCAweEVBLCAvKiAweEUwLTB4RTMgKi8KKwkweEM4LCAweEJGLCAweEFELCAweDk2LCAweENELCAweERGLCAweEFELCAweDk3LCAvKiAweEU0LTB4RTcgKi8KKwkweEFELCAweDk4LCAweEFELCAweDk5LCAweEFELCAweDlBLCAweEFELCAweDlCLCAvKiAweEU4LTB4RUIgKi8KKwkweEFELCAweDlDLCAweEFELCAweDlELCAweENFLCAweENELCAweEVBLCAweEIxLCAvKiAweEVDLTB4RUYgKi8KKwkweEFELCAweDlFLCAweEFELCAweDlGLCAweEFELCAweEEwLCAweEFFLCAweDQwLCAvKiAweEYwLTB4RjMgKi8KKwkweEVBLCAweEIyLCAweEFFLCAweDQxLCAweEM2LCAweEJGLCAweEI0LCAweEM5LCAvKiAweEY0LTB4RjcgKi8KKwkweEFFLCAweDQyLCAweEFFLCAweDQzLCAweEFFLCAweDQ0LCAweEFFLCAweDQ1LCAvKiAweEY4LTB4RkIgKi8KKwkweEFFLCAweDQ2LCAweEFFLCAweDQ3LCAweEFFLCAweDQ4LCAweEVBLCAweEIzLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183NVs1MTJdID0geworCTB4QUUsIDB4NDksIDB4QUUsIDB4NEEsIDB4QUUsIDB4NEIsIDB4QUUsIDB4NEMsIC8qIDB4MDAtMHgwMyAqLworCTB4RDUsIDB4RTcsIDB4QUUsIDB4NEQsIDB4QUUsIDB4NEUsIDB4QUUsIDB4NEYsIC8qIDB4MDQtMHgwNyAqLworCTB4QUUsIDB4NTAsIDB4QUUsIDB4NTEsIDB4QUUsIDB4NTIsIDB4QUUsIDB4NTMsIC8qIDB4MDgtMHgwQiAqLworCTB4QUUsIDB4NTQsIDB4REQsIDB4RjksIDB4QUUsIDB4NTUsIDB4RUEsIDB4QjQsIC8qIDB4MEMtMHgwRiAqLworCTB4QUUsIDB4NTYsIDB4RUEsIDB4QjUsIDB4QUUsIDB4NTcsIDB4RUEsIDB4QjYsIC8qIDB4MTAtMHgxMyAqLworCTB4QUUsIDB4NTgsIDB4QUUsIDB4NTksIDB4QUUsIDB4NUEsIDB4QUUsIDB4NUIsIC8qIDB4MTQtMHgxNyAqLworCTB4QjgsIDB4Q0EsIDB4REYsIDB4QjAsIDB4QzksIDB4RjUsIDB4QUUsIDB4NUMsIC8qIDB4MTgtMHgxQiAqLworCTB4Q0MsIDB4RjAsIDB4QUUsIDB4NUQsIDB4QUUsIDB4NUUsIDB4QzksIDB4RkEsIC8qIDB4MUMtMHgxRiAqLworCTB4QUUsIDB4NUYsIDB4QUUsIDB4NjAsIDB4QUUsIDB4NjEsIDB4QUUsIDB4NjIsIC8qIDB4MjAtMHgyMyAqLworCTB4QUUsIDB4NjMsIDB4QzksIDB4RkIsIDB4QUUsIDB4NjQsIDB4QUUsIDB4NjUsIC8qIDB4MjQtMHgyNyAqLworCTB4RDMsIDB4QzMsIDB4Q0IsIDB4QTYsIDB4QUUsIDB4NjYsIDB4QjgsIDB4QTYsIC8qIDB4MjgtMHgyQiAqLworCTB4RjAsIDB4QUUsIDB4QjEsIDB4QzIsIDB4QUUsIDB4NjcsIDB4RTUsIDB4QjgsIC8qIDB4MkMtMHgyRiAqLworCTB4Q0MsIDB4RUYsIDB4RDMsIDB4QzksIDB4QkMsIDB4RDcsIDB4QzksIDB4RUEsIC8qIDB4MzAtMHgzMyAqLworCTB4QUUsIDB4NjgsIDB4QjUsIDB4RTcsIDB4QUUsIDB4NjksIDB4QzQsIDB4RDAsIC8qIDB4MzQtMHgzNyAqLworCTB4QjUsIDB4RTksIDB4QUUsIDB4NkEsIDB4RUUsIDB4QUUsIDB4QkIsIDB4QUQsIC8qIDB4MzgtMHgzQiAqLworCTB4QUUsIDB4NkIsIDB4QUUsIDB4NkMsIDB4RTcsIDB4REUsIDB4QUUsIDB4NkQsIC8qIDB4M0MtMHgzRiAqLworCTB4RUUsIDB4QUYsIDB4QUUsIDB4NkUsIDB4QUUsIDB4NkYsIDB4QUUsIDB4NzAsIC8qIDB4NDAtMHg0MyAqLworCTB4QUUsIDB4NzEsIDB4QjMsIDB4QTksIDB4QUUsIDB4NzIsIDB4QUUsIDB4NzMsIC8qIDB4NDQtMHg0NyAqLworCTB4RUUsIDB4QjIsIDB4QUUsIDB4NzQsIDB4QUUsIDB4NzUsIDB4RUUsIDB4QjEsIC8qIDB4NDgtMHg0QiAqLworCTB4QkQsIDB4RTcsIDB4QUUsIDB4NzYsIDB4RUUsIDB4QjAsIDB4Q0UsIDB4QjcsIC8qIDB4NEMtMHg0RiAqLworCTB4QUUsIDB4NzcsIDB4QUUsIDB4NzgsIDB4QUUsIDB4NzksIDB4QUUsIDB4N0EsIC8qIDB4NTAtMHg1MyAqLworCTB4QzUsIDB4Q0YsIDB4QUUsIDB4N0IsIDB4QUUsIDB4N0MsIDB4QUUsIDB4N0QsIC8qIDB4NTQtMHg1NyAqLworCTB4QUUsIDB4N0UsIDB4QzEsIDB4RjQsIDB4REIsIDB4Q0UsIDB4RUUsIDB4QjMsIC8qIDB4NTgtMHg1QiAqLworCTB4RDAsIDB4RjMsIDB4QUUsIDB4ODAsIDB4QUUsIDB4ODEsIDB4QUUsIDB4ODIsIC8qIDB4NUMtMHg1RiAqLworCTB4QUUsIDB4ODMsIDB4QUUsIDB4ODQsIDB4QUUsIDB4ODUsIDB4QUUsIDB4ODYsIC8qIDB4NjAtMHg2MyAqLworCTB4QUUsIDB4ODcsIDB4QzIsIDB4RDQsIDB4QzYsIDB4RTgsIDB4QUUsIDB4ODgsIC8qIDB4NjQtMHg2NyAqLworCTB4QUUsIDB4ODksIDB4QUUsIDB4OEEsIDB4QjcsIDB4QUMsIDB4QUUsIDB4OEIsIC8qIDB4NjgtMHg2QiAqLworCTB4QUUsIDB4OEMsIDB4QUUsIDB4OEQsIDB4QUUsIDB4OEUsIDB4QUUsIDB4OEYsIC8qIDB4NkMtMHg2RiAqLworCTB4QUUsIDB4OTAsIDB4QUUsIDB4OTEsIDB4RUUsIDB4QjQsIDB4QUUsIDB4OTIsIC8qIDB4NzAtMHg3MyAqLworCTB4QjMsIDB4RUIsIDB4QUUsIDB4OTMsIDB4QUUsIDB4OTQsIDB4QUUsIDB4OTUsIC8qIDB4NzQtMHg3NyAqLworCTB4QkIsIDB4RkIsIDB4RUUsIDB4QjUsIDB4QUUsIDB4OTYsIDB4QUUsIDB4OTcsIC8qIDB4NzgtMHg3QiAqLworCTB4QUUsIDB4OTgsIDB4QUUsIDB4OTksIDB4QUUsIDB4OUEsIDB4RTcsIDB4REMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QUUsIDB4OUIsIDB4QUUsIDB4OUMsIDB4QUUsIDB4OUQsIDB4RUUsIDB4QjYsIC8qIDB4ODAtMHg4MyAqLworCTB4QUUsIDB4OUUsIDB4QUUsIDB4OUYsIDB4QkQsIDB4QUUsIDB4QUUsIDB4QTAsIC8qIDB4ODQtMHg4NyAqLworCTB4QUYsIDB4NDAsIDB4QUYsIDB4NDEsIDB4QUYsIDB4NDIsIDB4RjEsIDB4RTIsIC8qIDB4ODgtMHg4QiAqLworCTB4QUYsIDB4NDMsIDB4QUYsIDB4NDQsIDB4QUYsIDB4NDUsIDB4Q0EsIDB4RTgsIC8qIDB4OEMtMHg4RiAqLworCTB4QUYsIDB4NDYsIDB4RDIsIDB4QzksIDB4RjAsIDB4REEsIDB4QUYsIDB4NDcsIC8qIDB4OTAtMHg5MyAqLworCTB4RjAsIDB4REIsIDB4QUYsIDB4NDgsIDB4RjAsIDB4REMsIDB4QzEsIDB4QzYsIC8qIDB4OTQtMHg5NyAqLworCTB4QUYsIDB4NDksIDB4QjgsIDB4RUQsIDB4QkUsIDB4Q0UsIDB4QUYsIDB4NEEsIC8qIDB4OTgtMHg5QiAqLworCTB4QUYsIDB4NEIsIDB4RjAsIDB4REUsIDB4QUYsIDB4NEMsIDB4QzUsIDB4QjEsIC8qIDB4OUMtMHg5RiAqLworCTB4RjAsIDB4REQsIDB4RDEsIDB4RjEsIDB4QUYsIDB4NEQsIDB4RjAsIDB4RTAsIC8qIDB4QTAtMHhBMyAqLworCTB4QjAsIDB4Q0MsIDB4QkQsIDB4RUEsIDB4QUYsIDB4NEUsIDB4QUYsIDB4NEYsIC8qIDB4QTQtMHhBNyAqLworCTB4QUYsIDB4NTAsIDB4QUYsIDB4NTEsIDB4QUYsIDB4NTIsIDB4RDIsIDB4REYsIC8qIDB4QTgtMHhBQiAqLworCTB4RjAsIDB4REYsIDB4QUYsIDB4NTMsIDB4QjQsIDB4QUYsIDB4QjcsIDB4RTgsIC8qIDB4QUMtMHhBRiAqLworCTB4RjAsIDB4RTYsIDB4RjAsIDB4RTUsIDB4QzYsIDB4QTMsIDB4RjAsIDB4RTEsIC8qIDB4QjAtMHhCMyAqLworCTB4RjAsIDB4RTIsIDB4QjQsIDB4QzMsIDB4QUYsIDB4NTQsIDB4QUYsIDB4NTUsIC8qIDB4QjQtMHhCNyAqLworCTB4RjAsIDB4RTMsIDB4RDUsIDB4RUUsIDB4QUYsIDB4NTYsIDB4QUYsIDB4NTcsIC8qIDB4QjgtMHhCQiAqLworCTB4Q0MsIDB4REIsIDB4QkUsIDB4RDIsIDB4QkMsIDB4QjIsIDB4QUYsIDB4NTgsIC8qIDB4QkMtMHhCRiAqLworCTB4QUYsIDB4NTksIDB4QUYsIDB4NUEsIDB4RjAsIDB4RTgsIDB4RjAsIDB4RTcsIC8qIDB4QzAtMHhDMyAqLworCTB4RjAsIDB4RTQsIDB4QjIsIDB4QTEsIDB4QUYsIDB4NUIsIDB4RDYsIDB4QTIsIC8qIDB4QzQtMHhDNyAqLworCTB4RDMsIDB4QjgsIDB4QkUsIDB4QjcsIDB4QzgsIDB4QUMsIDB4QUYsIDB4NUMsIC8qIDB4QzgtMHhDQiAqLworCTB4QUYsIDB4NUQsIDB4RjAsIDB4RUEsIDB4QUYsIDB4NUUsIDB4QUYsIDB4NUYsIC8qIDB4Q0MtMHhDRiAqLworCTB4QUYsIDB4NjAsIDB4QUYsIDB4NjEsIDB4RDEsIDB4RjcsIDB4QUYsIDB4NjIsIC8qIDB4RDAtMHhEMyAqLworCTB4RDYsIDB4Q0MsIDB4QkEsIDB4REIsIDB4RjAsIDB4RTksIDB4QUYsIDB4NjMsIC8qIDB4RDQtMHhENyAqLworCTB4QjYsIDB4QkIsIDB4QUYsIDB4NjQsIDB4QUYsIDB4NjUsIDB4Q0QsIDB4QjQsIC8qIDB4RDgtMHhEQiAqLworCTB4QUYsIDB4NjYsIDB4QUYsIDB4NjcsIDB4QzYsIDB4QTYsIDB4QUYsIDB4NjgsIC8qIDB4REMtMHhERiAqLworCTB4QUYsIDB4NjksIDB4QUYsIDB4NkEsIDB4QzEsIDB4QTEsIDB4RjAsIDB4RUIsIC8qIDB4RTAtMHhFMyAqLworCTB4RjAsIDB4RUUsIDB4QUYsIDB4NkIsIDB4RjAsIDB4RUQsIDB4RjAsIDB4RjAsIC8qIDB4RTQtMHhFNyAqLworCTB4RjAsIDB4RUMsIDB4QUYsIDB4NkMsIDB4QkIsIDB4QkUsIDB4RjAsIDB4RUYsIC8qIDB4RTgtMHhFQiAqLworCTB4QUYsIDB4NkQsIDB4QUYsIDB4NkUsIDB4QUYsIDB4NkYsIDB4QUYsIDB4NzAsIC8qIDB4RUMtMHhFRiAqLworCTB4Q0MsIDB4QjUsIDB4RjAsIDB4RjIsIDB4QUYsIDB4NzEsIDB4QUYsIDB4NzIsIC8qIDB4RjAtMHhGMyAqLworCTB4QjMsIDB4RDUsIDB4QUYsIDB4NzMsIDB4QUYsIDB4NzQsIDB4QUYsIDB4NzUsIC8qIDB4RjQtMHhGNyAqLworCTB4QUYsIDB4NzYsIDB4QjEsIDB4RDQsIDB4QUYsIDB4NzcsIDB4QUYsIDB4NzgsIC8qIDB4RjgtMHhGQiAqLworCTB4RjAsIDB4RjMsIDB4QUYsIDB4NzksIDB4QUYsIDB4N0EsIDB4RjAsIDB4RjQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzc2WzUxMl0gPSB7CisJMHhGMCwgMHhGNiwgMHhCNCwgMHhFMSwgMHhBRiwgMHg3QiwgMHhGMCwgMHhGMSwgLyogMHgwMC0weDAzICovCisJMHhBRiwgMHg3QywgMHhGMCwgMHhGNywgMHhBRiwgMHg3RCwgMHhBRiwgMHg3RSwgLyogMHgwNC0weDA3ICovCisJMHhBRiwgMHg4MCwgMHhBRiwgMHg4MSwgMHhGMCwgMHhGQSwgMHhBRiwgMHg4MiwgLyogMHgwOC0weDBCICovCisJMHhGMCwgMHhGOCwgMHhBRiwgMHg4MywgMHhBRiwgMHg4NCwgMHhBRiwgMHg4NSwgLyogMHgwQy0weDBGICovCisJMHhGMCwgMHhGNSwgMHhBRiwgMHg4NiwgMHhBRiwgMHg4NywgMHhBRiwgMHg4OCwgLyogMHgxMC0weDEzICovCisJMHhBRiwgMHg4OSwgMHhGMCwgMHhGRCwgMHhBRiwgMHg4QSwgMHhGMCwgMHhGOSwgLyogMHgxNC0weDE3ICovCisJMHhGMCwgMHhGQywgMHhGMCwgMHhGRSwgMHhBRiwgMHg4QiwgMHhGMSwgMHhBMSwgLyogMHgxOC0weDFCICovCisJMHhBRiwgMHg4QywgMHhBRiwgMHg4RCwgMHhBRiwgMHg4RSwgMHhDRSwgMHhDMSwgLyogMHgxQy0weDFGICovCisJMHhGMSwgMHhBNCwgMHhBRiwgMHg4RiwgMHhGMSwgMHhBMywgMHhBRiwgMHg5MCwgLyogMHgyMC0weDIzICovCisJMHhDMSwgMHhGNiwgMHhGMCwgMHhGQiwgMHhDQSwgMHhERCwgMHhBRiwgMHg5MSwgLyogMHgyNC0weDI3ICovCisJMHhBRiwgMHg5MiwgMHhCNCwgMHhGMSwgMHhCMSwgMHhGMSwgMHhDQywgMHhCMSwgLyogMHgyOC0weDJCICovCisJMHhBRiwgMHg5MywgMHhGMSwgMHhBNiwgMHhBRiwgMHg5NCwgMHhBRiwgMHg5NSwgLyogMHgyQy0weDJGICovCisJMHhGMSwgMHhBNywgMHhBRiwgMHg5NiwgMHhBRiwgMHg5NywgMHhGMSwgMHhBQywgLyogMHgzMC0weDMzICovCisJMHhENSwgMHhDRSwgMHhGMSwgMHhBOSwgMHhBRiwgMHg5OCwgMHhBRiwgMHg5OSwgLyogMHgzNC0weDM3ICovCisJMHhDOCwgMHhCMywgMHhBRiwgMHg5QSwgMHhBRiwgMHg5QiwgMHhBRiwgMHg5QywgLyogMHgzOC0weDNCICovCisJMHhGMSwgMHhBMiwgMHhBRiwgMHg5RCwgMHhGMSwgMHhBQiwgMHhGMSwgMHhBOCwgLyogMHgzQy0weDNGICovCisJMHhGMSwgMHhBNSwgMHhBRiwgMHg5RSwgMHhBRiwgMHg5RiwgMHhGMSwgMHhBQSwgLyogMHg0MC0weDQzICovCisJMHhBRiwgMHhBMCwgMHhCMCwgMHg0MCwgMHhCMCwgMHg0MSwgMHhCMCwgMHg0MiwgLyogMHg0NC0weDQ3ICovCisJMHhCMCwgMHg0MywgMHhCMCwgMHg0NCwgMHhCMCwgMHg0NSwgMHhCMCwgMHg0NiwgLyogMHg0OC0weDRCICovCisJMHhCMCwgMHhBOSwgMHhGMSwgMHhBRCwgMHhCMCwgMHg0NywgMHhCMCwgMHg0OCwgLyogMHg0Qy0weDRGICovCisJMHhCMCwgMHg0OSwgMHhCMCwgMHg0QSwgMHhCMCwgMHg0QiwgMHhCMCwgMHg0QywgLyogMHg1MC0weDUzICovCisJMHhGMSwgMHhBRiwgMHhCMCwgMHg0RCwgMHhGMSwgMHhCMSwgMHhCMCwgMHg0RSwgLyogMHg1NC0weDU3ICovCisJMHhCMCwgMHg0RiwgMHhCMCwgMHg1MCwgMHhCMCwgMHg1MSwgMHhCMCwgMHg1MiwgLyogMHg1OC0weDVCICovCisJMHhGMSwgMHhCMCwgMHhCMCwgMHg1MywgMHhGMSwgMHhBRSwgMHhCMCwgMHg1NCwgLyogMHg1Qy0weDVGICovCisJMHhCMCwgMHg1NSwgMHhCMCwgMHg1NiwgMHhCMCwgMHg1NywgMHhEMSwgMHhBMiwgLyogMHg2MC0weDYzICovCisJMHhCMCwgMHg1OCwgMHhCMCwgMHg1OSwgMHhCMCwgMHg1QSwgMHhCMCwgMHg1QiwgLyogMHg2NC0weDY3ICovCisJMHhCMCwgMHg1QywgMHhCMCwgMHg1RCwgMHhCMCwgMHg1RSwgMHhGMSwgMHhCMiwgLyogMHg2OC0weDZCICovCisJMHhCMCwgMHg1RiwgMHhCMCwgMHg2MCwgMHhCMCwgMHg2MSwgMHhGMSwgMHhCMywgLyogMHg2Qy0weDZGICovCisJMHhCMCwgMHg2MiwgMHhCMCwgMHg2MywgMHhCMCwgMHg2NCwgMHhCMCwgMHg2NSwgLyogMHg3MC0weDczICovCisJMHhCMCwgMHg2NiwgMHhCMCwgMHg2NywgMHhCMCwgMHg2OCwgMHhCMCwgMHg2OSwgLyogMHg3NC0weDc3ICovCisJMHhCOSwgMHhFRiwgMHhCMCwgMHg2QSwgMHhCMCwgMHg2QiwgMHhCNSwgMHhDNywgLyogMHg3OC0weDdCICovCisJMHhCMCwgMHg2QywgMHhCMCwgMHhENywgMHhCMCwgMHhEOSwgMHhCMCwgMHg2RCwgLyogMHg3Qy0weDdGICovCisJCisJMHhCMCwgMHg2RSwgMHhCMCwgMHg2RiwgMHhENCwgMHhFRCwgMHhCMCwgMHg3MCwgLyogMHg4MC0weDgzICovCisJMHhCNSwgMHhDNCwgMHhCMCwgMHg3MSwgMHhCRCwgMHhENCwgMHhCQiwgMHhDQSwgLyogMHg4NC0weDg3ICovCisJMHhGMCwgMHhBNywgMHhCMCwgMHg3MiwgMHhCMCwgMHg3MywgMHhCOCwgMHhERSwgLyogMHg4OC0weDhCICovCisJMHhCMCwgMHg3NCwgMHhCMCwgMHg3NSwgMHhGMCwgMHhBOCwgMHhCMCwgMHg3NiwgLyogMHg4Qy0weDhGICovCisJMHhCMCwgMHg3NywgMHhCMCwgMHhBOCwgMHhCMCwgMHg3OCwgMHhGMCwgMHhBOSwgLyogMHg5MC0weDkzICovCisJMHhCMCwgMHg3OSwgMHhCMCwgMHg3QSwgMHhDRCwgMHhFRSwgMHhCMCwgMHg3QiwgLyogMHg5NC0weDk3ICovCisJMHhCMCwgMHg3QywgMHhGMCwgMHhBQSwgMHhCMCwgMHg3RCwgMHhCMCwgMHg3RSwgLyogMHg5OC0weDlCICovCisJMHhCMCwgMHg4MCwgMHhCMCwgMHg4MSwgMHhCMCwgMHg4MiwgMHhCMCwgMHg4MywgLyogMHg5Qy0weDlGICovCisJMHhCMCwgMHg4NCwgMHhCMCwgMHg4NSwgMHhCMCwgMHg4NiwgMHhCMCwgMHg4NywgLyogMHhBMC0weEEzICovCisJMHhGMCwgMHhBQiwgMHhCMCwgMHg4OCwgMHhCMCwgMHg4OSwgMHhCMCwgMHg4QSwgLyogMHhBNC0weEE3ICovCisJMHhCMCwgMHg4QiwgMHhCMCwgMHg4QywgMHhCMCwgMHg4RCwgMHhCMCwgMHg4RSwgLyogMHhBOC0weEFCICovCisJMHhCMCwgMHg4RiwgMHhCMCwgMHg5MCwgMHhDNiwgMHhBNCwgMHhCMCwgMHg5MSwgLyogMHhBQy0weEFGICovCisJMHhCMCwgMHg5MiwgMHhENiwgMHhFNSwgMHhGMSwgMHhFNCwgMHhCMCwgMHg5MywgLyogMHhCMC0weEIzICovCisJMHhGMSwgMHhFNSwgMHhCMCwgMHg5NCwgMHhCMCwgMHg5NSwgMHhCMCwgMHg5NiwgLyogMHhCNC0weEI3ICovCisJMHhCMCwgMHg5NywgMHhCMCwgMHg5OCwgMHhCMCwgMHg5OSwgMHhCMCwgMHg5QSwgLyogMHhCOC0weEJCICovCisJMHhCMCwgMHg5QiwgMHhCMCwgMHg5QywgMHhCMCwgMHg5RCwgMHhDMywgMHhGMywgLyogMHhCQy0weEJGICovCisJMHhCMCwgMHg5RSwgMHhCMCwgMHg5RiwgMHhEMywgMHhEQiwgMHhCMCwgMHhBMCwgLyogMHhDMC0weEMzICovCisJMHhCMSwgMHg0MCwgMHhENiwgMHhEMSwgMHhDNSwgMHhFOCwgMHhCMSwgMHg0MSwgLyogMHhDNC0weEM3ICovCisJMHhEMywgMHhBRiwgMHhCMSwgMHg0MiwgMHhEMiwgMHhFNiwgMHhCMSwgMHg0MywgLyogMHhDOC0weENCICovCisJMHhCMSwgMHg0NCwgMHhFRSwgMHhDMSwgMHhCMCwgMHhCQiwgMHhENSwgMHhCNSwgLyogMHhDQy0weENGICovCisJMHhEMSwgMHhDRSwgMHhCQywgMHhFMCwgMHhCQSwgMHhEMCwgMHhCMSwgMHg0NSwgLyogMHhEMC0weEQzICovCisJMHhCRiwgMHhGOCwgMHhCMSwgMHg0NiwgMHhCOCwgMHhDNywgMHhCNSwgMHhDMSwgLyogMHhENC0weEQ3ICovCisJMHhDNSwgMHhDQywgMHhCMSwgMHg0NywgMHhCMSwgMHg0OCwgMHhDQSwgMHhBMiwgLyogMHhEOC0weERCICovCisJMHhCMSwgMHg0OSwgMHhCMSwgMHg0QSwgMHhCMSwgMHg0QiwgMHhDMywgMHhDQiwgLyogMHhEQy0weERGICovCisJMHhCMSwgMHg0QywgMHhCMSwgMHg0RCwgMHhCMSwgMHg0RSwgMHhCMSwgMHg0RiwgLyogMHhFMC0weEUzICovCisJMHhCMSwgMHg1MCwgMHhFRSwgMHhDMiwgMHhCMSwgMHg1MSwgMHhCMSwgMHg1MiwgLyogMHhFNC0weEU3ICovCisJMHhCMSwgMHg1MywgMHhCMSwgMHg1NCwgMHhCMSwgMHg1NSwgMHhCMSwgMHg1NiwgLyogMHhFOC0weEVCICovCisJMHhCMSwgMHg1NywgMHhCMSwgMHg1OCwgMHhDNCwgMHhCRiwgMHhCNiwgMHhBMiwgLyogMHhFQy0weEVGICovCisJMHhCMSwgMHg1OSwgMHhFRCwgMHhFQywgMHhDMywgMHhBNCwgMHhCMSwgMHg1QSwgLyogMHhGMC0weEYzICovCisJMHhENiwgMHhCMSwgMHhCMSwgMHg1QiwgMHhCMSwgMHg1QywgMHhCMSwgMHg1RCwgLyogMHhGNC0weEY3ICovCisJMHhDRiwgMHhFMCwgMHhFRCwgMHhFRiwgMHhCMSwgMHg1RSwgMHhCMSwgMHg1RiwgLyogMHhGOC0weEZCICovCisJMHhDNSwgMHhDRSwgMHhCMSwgMHg2MCwgMHhCNiwgMHhEQywgMHhCMSwgMHg2MSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzdbNTEyXSA9IHsKKwkweEIxLCAweDYyLCAweENBLCAweEExLCAweEIxLCAweDYzLCAweEIxLCAweDY0LCAvKiAweDAwLTB4MDMgKi8KKwkweEVELCAweEVELCAweEIxLCAweDY1LCAweEIxLCAweDY2LCAweEVELCAweEYwLCAvKiAweDA0LTB4MDcgKi8KKwkweEVELCAweEYxLCAweEMzLCAweEJDLCAweEIxLCAweDY3LCAweEJGLCAweEI0LCAvKiAweDA4LTB4MEIgKi8KKwkweEIxLCAweDY4LCAweEVELCAweEVFLCAweEIxLCAweDY5LCAweEIxLCAweDZBLCAvKiAweDBDLTB4MEYgKi8KKwkweEIxLCAweDZCLCAweEIxLCAweDZDLCAweEIxLCAweDZELCAweEIxLCAweDZFLCAvKiAweDEwLTB4MTMgKi8KKwkweEIxLCAweDZGLCAweEIxLCAweDcwLCAweEIxLCAweDcxLCAweEIxLCAweDcyLCAvKiAweDE0LTB4MTcgKi8KKwkweEIxLCAweDczLCAweEVELCAweEY0LCAweEVELCAweEYyLCAweEIxLCAweDc0LCAvKiAweDE4LTB4MUIgKi8KKwkweEIxLCAweDc1LCAweEIxLCAweDc2LCAweEIxLCAweDc3LCAweEQ1LCAweEU2LCAvKiAweDFDLTB4MUYgKi8KKwkweEMzLCAweERGLCAweEIxLCAweDc4LCAweEVELCAweEYzLCAweEIxLCAweDc5LCAvKiAweDIwLTB4MjMgKi8KKwkweEIxLCAweDdBLCAweEIxLCAweDdCLCAweEVELCAweEY2LCAweEIxLCAweDdDLCAvKiAweDI0LTB4MjcgKi8KKwkweEQ1LCAweEEzLCAweEQxLCAweEEzLCAweEIxLCAweDdELCAweEIxLCAweDdFLCAvKiAweDI4LTB4MkIgKi8KKwkweEIxLCAweDgwLCAweEVELCAweEY1LCAweEIxLCAweDgxLCAweEMzLCAweEQwLCAvKiAweDJDLTB4MkYgKi8KKwkweEIxLCAweDgyLCAweEIxLCAweDgzLCAweEIxLCAweDg0LCAweEIxLCAweDg1LCAvKiAweDMwLTB4MzMgKi8KKwkweEIxLCAweDg2LCAweEVELCAweEY3LCAweEJGLCAweEY0LCAweEJFLCAweEVDLCAvKiAweDM0LTB4MzcgKi8KKwkweEVELCAweEY4LCAweEIxLCAweDg3LCAweENDLCAweEY3LCAweEIxLCAweDg4LCAvKiAweDM4LTB4M0IgKi8KKwkweEQxLCAweERCLCAweEIxLCAweDg5LCAweEIxLCAweDhBLCAweEIxLCAweDhCLCAvKiAweDNDLTB4M0YgKi8KKwkweEQ3LCAweEM1LCAweEQ1LCAweEY2LCAweEIxLCAweDhDLCAweEVELCAweEZDLCAvKiAweDQwLTB4NDMgKi8KKwkweEIxLCAweDhELCAweEIxLCAweDhFLCAweEIxLCAweDhGLCAweEVELCAweEZCLCAvKiAweDQ0LTB4NDcgKi8KKwkweEIxLCAweDkwLCAweEIxLCAweDkxLCAweEIxLCAweDkyLCAweEIxLCAweDkzLCAvKiAweDQ4LTB4NEIgKi8KKwkweEIxLCAweDk0LCAweEIxLCAweDk1LCAweEIxLCAweDk2LCAweEIxLCAweDk3LCAvKiAweDRDLTB4NEYgKi8KKwkweEVELCAweEY5LCAweEVELCAweEZBLCAweEIxLCAweDk4LCAweEIxLCAweDk5LCAvKiAweDUwLTB4NTMgKi8KKwkweEIxLCAweDlBLCAweEIxLCAweDlCLCAweEIxLCAweDlDLCAweEIxLCAweDlELCAvKiAweDU0LTB4NTcgKi8KKwkweEIxLCAweDlFLCAweEIxLCAweDlGLCAweEVELCAweEZELCAweEJFLCAweEE2LCAvKiAweDU4LTB4NUIgKi8KKwkweEIxLCAweEEwLCAweEIyLCAweDQwLCAweEIyLCAweDQxLCAweEIyLCAweDQyLCAvKiAweDVDLTB4NUYgKi8KKwkweEIyLCAweDQzLCAweENCLCAweEFGLCAweEVFLCAweEExLCAweEI2LCAweEJELCAvKiAweDYwLTB4NjMgKi8KKwkweEIyLCAweDQ0LCAweEVFLCAweEEyLCAweEM0LCAweEMwLCAweEIyLCAweDQ1LCAvKiAweDY0LTB4NjcgKi8KKwkweEVELCAweEZFLCAweEIyLCAweDQ2LCAweEIyLCAweDQ3LCAweEJELCAweERFLCAvKiAweDY4LTB4NkIgKi8KKwkweEIyLCAweEM3LCAweEIyLCAweDQ4LCAweEIyLCAweDQ5LCAweEIyLCAweDRBLCAvKiAweDZDLTB4NkYgKi8KKwkweEIyLCAweDRCLCAweEIyLCAweDRDLCAweEIyLCAweDRELCAweEIyLCAweDRFLCAvKiAweDcwLTB4NzMgKi8KKwkweEIyLCAweDRGLCAweEIyLCAweDUwLCAweEIyLCAweDUxLCAweEIyLCAweDUyLCAvKiAweDc0LTB4NzcgKi8KKwkweEIyLCAweDUzLCAweEI2LCAweEMzLCAweEIyLCAweDU0LCAweEIyLCAweDU1LCAvKiAweDc4LTB4N0IgKi8KKwkweEIyLCAweDU2LCAweEVFLCAweEE1LCAweEQ4LCAweEJBLCAweEVFLCAweEEzLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEVFLCAweEE2LCAweEIyLCAweDU3LCAweEIyLCAweDU4LCAweEIyLCAweDU5LCAvKiAweDgwLTB4ODMgKi8KKwkweEMzLCAweEU5LCAweEIzLCAweEYyLCAweEIyLCAweDVBLCAweEIyLCAweDVCLCAvKiAweDg0LTB4ODcgKi8KKwkweEIyLCAweDVDLCAweEIyLCAweDVELCAweEIyLCAweDVFLCAweEIyLCAweDVGLCAvKiAweDg4LTB4OEIgKi8KKwkweEVFLCAweEE3LCAweEVFLCAweEE0LCAweENGLCAweEI5LCAweEIyLCAweDYwLCAvKiAweDhDLTB4OEYgKi8KKwkweEIyLCAweDYxLCAweEVFLCAweEE4LCAweEMyLCAweEY3LCAweEIyLCAweDYyLCAvKiAweDkwLTB4OTMgKi8KKwkweEIyLCAweDYzLCAweEIyLCAweDY0LCAweEIyLCAweDY1LCAweEIyLCAweDY2LCAvKiAweDk0LTB4OTcgKi8KKwkweEIyLCAweDY3LCAweEIyLCAweDY4LCAweEIyLCAweDY5LCAweEIyLCAweDZBLCAvKiAweDk4LTB4OUIgKi8KKwkweEIyLCAweDZCLCAweEIyLCAweDZDLCAweEIyLCAweDZELCAweEVFLCAweEE5LCAvKiAweDlDLTB4OUYgKi8KKwkweEVFLCAweEFBLCAweEIyLCAweDZFLCAweERFLCAweEFCLCAweEIyLCAweDZGLCAvKiAweEEwLTB4QTMgKi8KKwkweEIyLCAweDcwLCAweEM2LCAweEIzLCAweEIyLCAweDcxLCAweEM3LCAweEM2LCAvKiAweEE0LTB4QTcgKi8KKwkweEIyLCAweDcyLCAweEQ2LCAweEY1LCAweEI1LCAweEM5LCAweEIyLCAweDczLCAvKiAweEE4LTB4QUIgKi8KKwkweENCLCAweEIyLCAweEIyLCAweDc0LCAweEIyLCAweDc1LCAweEIyLCAweDc2LCAvKiAweEFDLTB4QUYgKi8KKwkweEVFLCAweEFCLCAweEIyLCAweDc3LCAweEIyLCAweDc4LCAweENELCAweEFCLCAvKiAweEIwLTB4QjMgKi8KKwkweEIyLCAweDc5LCAweEVFLCAweEFDLCAweEIyLCAweDdBLCAweEIyLCAweDdCLCAvKiAweEI0LTB4QjcgKi8KKwkweEIyLCAweDdDLCAweEIyLCAweDdELCAweEIyLCAweDdFLCAweEQ1LCAweEIwLCAvKiAweEI4LTB4QkIgKi8KKwkweEIyLCAweDgwLCAweEVFLCAweEFELCAweEIyLCAweDgxLCAweEY2LCAweEM0LCAvKiAweEJDLTB4QkYgKi8KKwkweEIyLCAweDgyLCAweEIyLCAweDgzLCAweEIyLCAweDg0LCAweEIyLCAweDg1LCAvKiAweEMwLTB4QzMgKi8KKwkweEIyLCAweDg2LCAweEIyLCAweDg3LCAweEIyLCAweDg4LCAweEIyLCAweDg5LCAvKiAweEM0LTB4QzcgKi8KKwkweEIyLCAweDhBLCAweEIyLCAweDhCLCAweEIyLCAweDhDLCAweEIyLCAweDhELCAvKiAweEM4LTB4Q0IgKi8KKwkweEIyLCAweDhFLCAweERCLCAweEM3LCAweEIyLCAweDhGLCAweEIyLCAweDkwLCAvKiAweENDLTB4Q0YgKi8KKwkweEIyLCAweDkxLCAweEIyLCAweDkyLCAweEIyLCAweDkzLCAweEIyLCAweDk0LCAvKiAweEQwLTB4RDMgKi8KKwkweEIyLCAweDk1LCAweEIyLCAweDk2LCAweEIyLCAweDk3LCAweEI0LCAweEEzLCAvKiAweEQ0LTB4RDcgKi8KKwkweEIyLCAweDk4LCAweEIyLCAweDk5LCAweEIyLCAweDlBLCAweEMzLCAweEFDLCAvKiAweEQ4LTB4REIgKi8KKwkweEYxLCAweEU2LCAweEIyLCAweDlCLCAweEIyLCAweDlDLCAweEIyLCAweDlELCAvKiAweERDLTB4REYgKi8KKwkweEIyLCAweDlFLCAweEIyLCAweDlGLCAweENBLCAweEI4LCAweEQyLCAweEQzLCAvKiAweEUwLTB4RTMgKi8KKwkweEIyLCAweEEwLCAweEQ2LCAweEFBLCAweEIzLCAweDQwLCAweEVGLCAweEYyLCAvKiAweEU0LTB4RTcgKi8KKwkweEIzLCAweDQxLCAweEJFLCAweEQ4LCAweEIzLCAweDQyLCAweEJELCAweEMzLCAvKiAweEU4LTB4RUIgKi8KKwkweEVGLCAweEYzLCAweEI2LCAweENDLCAweEIwLCAweEFCLCAweEIzLCAweDQzLCAvKiAweEVDLTB4RUYgKi8KKwkweEIzLCAweDQ0LCAweEIzLCAweDQ1LCAweEIzLCAweDQ2LCAweENBLCAweEFGLCAvKiAweEYwLTB4RjMgKi8KKwkweEIzLCAweDQ3LCAweEIzLCAweDQ4LCAweEVELCAweEI2LCAweEIzLCAweDQ5LCAvKiAweEY0LTB4RjcgKi8KKwkweEVELCAweEI3LCAweEIzLCAweDRBLCAweEIzLCAweDRCLCAweEIzLCAweDRDLCAvKiAweEY4LTB4RkIgKi8KKwkweEIzLCAweDRELCAweENFLCAweEY5LCAweEI3LCAweEFGLCAweEJGLCAweEYzLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183OFs1MTJdID0geworCTB4RUQsIDB4QjgsIDB4QzIsIDB4RUIsIDB4QzksIDB4QjAsIDB4QjMsIDB4NEUsIC8qIDB4MDAtMHgwMyAqLworCTB4QjMsIDB4NEYsIDB4QjMsIDB4NTAsIDB4QjMsIDB4NTEsIDB4QjMsIDB4NTIsIC8qIDB4MDQtMHgwNyAqLworCTB4QjMsIDB4NTMsIDB4RUQsIDB4QjksIDB4QjMsIDB4NTQsIDB4QjMsIDB4NTUsIC8qIDB4MDgtMHgwQiAqLworCTB4QzYsIDB4RjYsIDB4QkYsIDB4QjMsIDB4QjMsIDB4NTYsIDB4QjMsIDB4NTcsIC8qIDB4MEMtMHgwRiAqLworCTB4QjMsIDB4NTgsIDB4RUQsIDB4QkMsIDB4QzUsIDB4RjgsIDB4QjMsIDB4NTksIC8qIDB4MTAtMHgxMyAqLworCTB4RDEsIDB4RDAsIDB4QjMsIDB4NUEsIDB4RDcsIDB4QTksIDB4RUQsIDB4QkEsIC8qIDB4MTQtMHgxNyAqLworCTB4RUQsIDB4QkIsIDB4QjMsIDB4NUIsIDB4RDEsIDB4RTIsIDB4QjMsIDB4NUMsIC8qIDB4MTgtMHgxQiAqLworCTB4RUQsIDB4QkYsIDB4RUQsIDB4QzAsIDB4QjMsIDB4NUQsIDB4RUQsIDB4QzQsIC8qIDB4MUMtMHgxRiAqLworCTB4QjMsIDB4NUUsIDB4QjMsIDB4NUYsIDB4QjMsIDB4NjAsIDB4RUQsIDB4QzgsIC8qIDB4MjAtMHgyMyAqLworCTB4QjMsIDB4NjEsIDB4RUQsIDB4QzYsIDB4RUQsIDB4Q0UsIDB4RDUsIDB4RTgsIC8qIDB4MjQtMHgyNyAqLworCTB4QjMsIDB4NjIsIDB4RUQsIDB4QzksIDB4QjMsIDB4NjMsIDB4QjMsIDB4NjQsIC8qIDB4MjgtMHgyQiAqLworCTB4RUQsIDB4QzcsIDB4RUQsIDB4QkUsIDB4QjMsIDB4NjUsIDB4QjMsIDB4NjYsIC8qIDB4MkMtMHgyRiAqLworCTB4QzUsIDB4RTksIDB4QjMsIDB4NjcsIDB4QjMsIDB4NjgsIDB4QjMsIDB4NjksIC8qIDB4MzAtMHgzMyAqLworCTB4QzYsIDB4QzYsIDB4QjMsIDB4NkEsIDB4QjMsIDB4NkIsIDB4QzksIDB4RTksIC8qIDB4MzQtMHgzNyAqLworCTB4RDQsIDB4RDIsIDB4RUQsIDB4QzEsIDB4RUQsIDB4QzIsIDB4RUQsIDB4QzMsIC8qIDB4MzgtMHgzQiAqLworCTB4RUQsIDB4QzUsIDB4QjMsIDB4NkMsIDB4QzAsIDB4RjksIDB4QjMsIDB4NkQsIC8qIDB4M0MtMHgzRiAqLworCTB4QjQsIDB4QTEsIDB4QjMsIDB4NkUsIDB4QjMsIDB4NkYsIDB4QjMsIDB4NzAsIC8qIDB4NDAtMHg0MyAqLworCTB4QjMsIDB4NzEsIDB4QjksIDB4RTgsIDB4QjMsIDB4NzIsIDB4RUQsIDB4RDAsIC8qIDB4NDQtMHg0NyAqLworCTB4QjMsIDB4NzMsIDB4QjMsIDB4NzQsIDB4QjMsIDB4NzUsIDB4QjMsIDB4NzYsIC8qIDB4NDgtMHg0QiAqLworCTB4RUQsIDB4RDEsIDB4QjMsIDB4NzcsIDB4RUQsIDB4Q0EsIDB4QjMsIDB4NzgsIC8qIDB4NEMtMHg0RiAqLworCTB4RUQsIDB4Q0YsIDB4QjMsIDB4NzksIDB4Q0UsIDB4RjgsIDB4QjMsIDB4N0EsIC8qIDB4NTAtMHg1MyAqLworCTB4QjMsIDB4N0IsIDB4Q0IsIDB4QjYsIDB4RUQsIDB4Q0MsIDB4RUQsIDB4Q0QsIC8qIDB4NTQtMHg1NyAqLworCTB4QjMsIDB4N0MsIDB4QjMsIDB4N0QsIDB4QjMsIDB4N0UsIDB4QjMsIDB4ODAsIC8qIDB4NTgtMHg1QiAqLworCTB4QjMsIDB4ODEsIDB4Q0YsIDB4RjUsIDB4QjMsIDB4ODIsIDB4QjMsIDB4ODMsIC8qIDB4NUMtMHg1RiAqLworCTB4QjMsIDB4ODQsIDB4QjMsIDB4ODUsIDB4QjMsIDB4ODYsIDB4QjMsIDB4ODcsIC8qIDB4NjAtMHg2MyAqLworCTB4QjMsIDB4ODgsIDB4QjMsIDB4ODksIDB4QjMsIDB4OEEsIDB4QjMsIDB4OEIsIC8qIDB4NjQtMHg2NyAqLworCTB4QjMsIDB4OEMsIDB4QjMsIDB4OEQsIDB4RUQsIDB4RDIsIDB4QzEsIDB4RjIsIC8qIDB4NjgtMHg2QiAqLworCTB4RDMsIDB4QjIsIDB4RUQsIDB4Q0IsIDB4QzgsIDB4QjcsIDB4QjMsIDB4OEUsIC8qIDB4NkMtMHg2RiAqLworCTB4QjMsIDB4OEYsIDB4QjMsIDB4OTAsIDB4QjMsIDB4OTEsIDB4QjMsIDB4OTIsIC8qIDB4NzAtMHg3MyAqLworCTB4QjMsIDB4OTMsIDB4QjMsIDB4OTQsIDB4QjMsIDB4OTUsIDB4QkMsIDB4RUYsIC8qIDB4NzQtMHg3NyAqLworCTB4QjMsIDB4OTYsIDB4QjMsIDB4OTcsIDB4QjMsIDB4OTgsIDB4QjMsIDB4OTksIC8qIDB4NzgtMHg3QiAqLworCTB4QzUsIDB4RjAsIDB4QjMsIDB4OUEsIDB4QjMsIDB4OUIsIDB4QjMsIDB4OUMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QjMsIDB4OUQsIDB4QjMsIDB4OUUsIDB4QjMsIDB4OUYsIDB4QjMsIDB4QTAsIC8qIDB4ODAtMHg4MyAqLworCTB4QjQsIDB4NDAsIDB4QjQsIDB4NDEsIDB4QjQsIDB4NDIsIDB4RUQsIDB4RDYsIC8qIDB4ODQtMHg4NyAqLworCTB4QjQsIDB4NDMsIDB4QjUsIDB4RUYsIDB4QjQsIDB4NDQsIDB4QjQsIDB4NDUsIC8qIDB4ODgtMHg4QiAqLworCTB4QzIsIDB4QjUsIDB4QjAsIDB4QUQsIDB4Q0IsIDB4RTksIDB4QjQsIDB4NDYsIC8qIDB4OEMtMHg4RiAqLworCTB4QjQsIDB4NDcsIDB4QjEsIDB4QUUsIDB4QjQsIDB4NDgsIDB4RUQsIDB4RDQsIC8qIDB4OTAtMHg5MyAqLworCTB4QjQsIDB4NDksIDB4QjQsIDB4NEEsIDB4QjQsIDB4NEIsIDB4Q0QsIDB4RUIsIC8qIDB4OTQtMHg5NyAqLworCTB4QjUsIDB4RTIsIDB4QjQsIDB4NEMsIDB4RUQsIDB4RDUsIDB4RUQsIDB4RDMsIC8qIDB4OTgtMHg5QiAqLworCTB4RUQsIDB4RDcsIDB4QjQsIDB4NEQsIDB4QjQsIDB4NEUsIDB4QjUsIDB4RkEsIC8qIDB4OUMtMHg5RiAqLworCTB4QjQsIDB4NEYsIDB4RUQsIDB4RDgsIDB4QjQsIDB4NTAsIDB4RUQsIDB4RDksIC8qIDB4QTAtMHhBMyAqLworCTB4QjQsIDB4NTEsIDB4RUQsIDB4REMsIDB4QjQsIDB4NTIsIDB4QjEsIDB4Q0MsIC8qIDB4QTQtMHhBNyAqLworCTB4QjQsIDB4NTMsIDB4QjQsIDB4NTQsIDB4QjQsIDB4NTUsIDB4QjQsIDB4NTYsIC8qIDB4QTgtMHhBQiAqLworCTB4QjQsIDB4NTcsIDB4QjQsIDB4NTgsIDB4QjQsIDB4NTksIDB4QjQsIDB4NUEsIC8qIDB4QUMtMHhBRiAqLworCTB4QzUsIDB4RjYsIDB4QkMsIDB4RUUsIDB4RUQsIDB4REEsIDB4Q0MsIDB4QkMsIC8qIDB4QjAtMHhCMyAqLworCTB4QjIsIDB4RUEsIDB4QjQsIDB4NUIsIDB4QjQsIDB4NUMsIDB4QjQsIDB4NUQsIC8qIDB4QjQtMHhCNyAqLworCTB4QjQsIDB4NUUsIDB4RUQsIDB4REIsIDB4QjQsIDB4NUYsIDB4QjQsIDB4NjAsIC8qIDB4QjgtMHhCQiAqLworCTB4QjQsIDB4NjEsIDB4QjQsIDB4NjIsIDB4QzQsIDB4RUIsIDB4QjQsIDB4NjMsIC8qIDB4QkMtMHhCRiAqLworCTB4QjQsIDB4NjQsIDB4QjQsIDB4QzUsIDB4QjQsIDB4NjUsIDB4QjQsIDB4NjYsIC8qIDB4QzAtMHhDMyAqLworCTB4QjQsIDB4NjcsIDB4QjAsIDB4RjUsIDB4QjQsIDB4NjgsIDB4QjQsIDB4NjksIC8qIDB4QzQtMHhDNyAqLworCTB4QjQsIDB4NkEsIDB4RUQsIDB4REYsIDB4QzAsIDB4REEsIDB4QjQsIDB4RTgsIC8qIDB4QzgtMHhDQiAqLworCTB4QjQsIDB4NkIsIDB4QjQsIDB4NkMsIDB4QjQsIDB4NkQsIDB4QjQsIDB4NkUsIC8qIDB4Q0MtMHhDRiAqLworCTB4QzUsIDB4Q0QsIDB4QjQsIDB4NkYsIDB4QjQsIDB4NzAsIDB4QjQsIDB4NzEsIC8qIDB4RDAtMHhEMyAqLworCTB4RUQsIDB4REQsIDB4QkYsIDB4QzQsIDB4QjQsIDB4NzIsIDB4QjQsIDB4NzMsIC8qIDB4RDQtMHhENyAqLworCTB4QjQsIDB4NzQsIDB4RUQsIDB4REUsIDB4QjQsIDB4NzUsIDB4QjQsIDB4NzYsIC8qIDB4RDgtMHhEQiAqLworCTB4QjQsIDB4NzcsIDB4QjQsIDB4NzgsIDB4QjQsIDB4NzksIDB4QjQsIDB4N0EsIC8qIDB4REMtMHhERiAqLworCTB4QjQsIDB4N0IsIDB4QjQsIDB4N0MsIDB4QjQsIDB4N0QsIDB4QjQsIDB4N0UsIC8qIDB4RTAtMHhFMyAqLworCTB4QjQsIDB4ODAsIDB4QjQsIDB4ODEsIDB4QjQsIDB4ODIsIDB4QjQsIDB4ODMsIC8qIDB4RTQtMHhFNyAqLworCTB4QzQsIDB4QTUsIDB4QjQsIDB4ODQsIDB4QjQsIDB4ODUsIDB4QjQsIDB4ODYsIC8qIDB4RTgtMHhFQiAqLworCTB4RUQsIDB4RTAsIDB4QjQsIDB4ODcsIDB4QjQsIDB4ODgsIDB4QjQsIDB4ODksIC8qIDB4RUMtMHhFRiAqLworCTB4QjQsIDB4OEEsIDB4QjQsIDB4OEIsIDB4RUQsIDB4RTEsIDB4QjQsIDB4OEMsIC8qIDB4RjAtMHhGMyAqLworCTB4RUQsIDB4RTMsIDB4QjQsIDB4OEQsIDB4QjQsIDB4OEUsIDB4QzEsIDB4RDcsIC8qIDB4RjQtMHhGNyAqLworCTB4QjQsIDB4OEYsIDB4QjQsIDB4OTAsIDB4QkIsIDB4QzcsIDB4QjQsIDB4OTEsIC8qIDB4RjgtMHhGQiAqLworCTB4QjQsIDB4OTIsIDB4QjQsIDB4OTMsIDB4QjQsIDB4OTQsIDB4QjQsIDB4OTUsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzc5WzUxMl0gPSB7CisJMHhCNCwgMHg5NiwgMHhCRCwgMHhCOCwgMHhCNCwgMHg5NywgMHhCNCwgMHg5OCwgLyogMHgwMC0weDAzICovCisJMHhCNCwgMHg5OSwgMHhFRCwgMHhFMiwgMHhCNCwgMHg5QSwgMHhCNCwgMHg5QiwgLyogMHgwNC0weDA3ICovCisJMHhCNCwgMHg5QywgMHhCNCwgMHg5RCwgMHhCNCwgMHg5RSwgMHhCNCwgMHg5RiwgLyogMHgwOC0weDBCICovCisJMHhCNCwgMHhBMCwgMHhCNSwgMHg0MCwgMHhCNSwgMHg0MSwgMHhCNSwgMHg0MiwgLyogMHgwQy0weDBGICovCisJMHhCNSwgMHg0MywgMHhCNSwgMHg0NCwgMHhCNSwgMHg0NSwgMHhFRCwgMHhFNCwgLyogMHgxMC0weDEzICovCisJMHhCNSwgMHg0NiwgMHhCNSwgMHg0NywgMHhCNSwgMHg0OCwgMHhCNSwgMHg0OSwgLyogMHgxNC0weDE3ICovCisJMHhCNSwgMHg0QSwgMHhCNSwgMHg0QiwgMHhCNSwgMHg0QywgMHhCNSwgMHg0RCwgLyogMHgxOC0weDFCICovCisJMHhCNSwgMHg0RSwgMHhCNSwgMHg0RiwgMHhFRCwgMHhFNiwgMHhCNSwgMHg1MCwgLyogMHgxQy0weDFGICovCisJMHhCNSwgMHg1MSwgMHhCNSwgMHg1MiwgMHhCNSwgMHg1MywgMHhCNSwgMHg1NCwgLyogMHgyMC0weDIzICovCisJMHhFRCwgMHhFNSwgMHhCNSwgMHg1NSwgMHhCNSwgMHg1NiwgMHhCNSwgMHg1NywgLyogMHgyNC0weDI3ICovCisJMHhCNSwgMHg1OCwgMHhCNSwgMHg1OSwgMHhCNSwgMHg1QSwgMHhCNSwgMHg1QiwgLyogMHgyOC0weDJCICovCisJMHhCNSwgMHg1QywgMHhCNSwgMHg1RCwgMHhCNSwgMHg1RSwgMHhCNSwgMHg1RiwgLyogMHgyQy0weDJGICovCisJMHhCNSwgMHg2MCwgMHhCNSwgMHg2MSwgMHhCNSwgMHg2MiwgMHhCNSwgMHg2MywgLyogMHgzMC0weDMzICovCisJMHhFRCwgMHhFNywgMHhCNSwgMHg2NCwgMHhCNSwgMHg2NSwgMHhCNSwgMHg2NiwgLyogMHgzNC0weDM3ICovCisJMHhCNSwgMHg2NywgMHhCNSwgMHg2OCwgMHhDQSwgMHhCRSwgMHhFQywgMHhFQSwgLyogMHgzOC0weDNCICovCisJMHhDMCwgMHhGMSwgMHhCNSwgMHg2OSwgMHhDOSwgMHhFNywgMHhCNSwgMHg2QSwgLyogMHgzQy0weDNGICovCisJMHhFQywgMHhFQiwgMHhDNiwgMHhFRSwgMHhCNSwgMHg2QiwgMHhCNSwgMHg2QywgLyogMHg0MC0weDQzICovCisJMHhCNSwgMHg2RCwgMHhCNSwgMHg2RSwgMHhFQywgMHhFQywgMHhCNSwgMHg2RiwgLyogMHg0NC0weDQ3ICovCisJMHhDNiwgMHhFRCwgMHhFQywgMHhFRCwgMHhCNSwgMHg3MCwgMHhCNSwgMHg3MSwgLyogMHg0OC0weDRCICovCisJMHhCNSwgMHg3MiwgMHhCNSwgMHg3MywgMHhCNSwgMHg3NCwgMHhCNSwgMHg3NSwgLyogMHg0Qy0weDRGICovCisJMHhCNSwgMHg3NiwgMHhCNSwgMHg3NywgMHhCNSwgMHg3OCwgMHhFQywgMHhGMCwgLyogMHg1MC0weDUzICovCisJMHhCNSwgMHg3OSwgMHhCNSwgMHg3QSwgMHhENywgMHhFNiwgMHhFQywgMHhGMywgLyogMHg1NC0weDU3ICovCisJMHhCNSwgMHg3QiwgMHhCNSwgMHg3QywgMHhFQywgMHhGMSwgMHhFQywgMHhFRSwgLyogMHg1OC0weDVCICovCisJMHhFQywgMHhFRiwgMHhENywgMHhBMywgMHhDOSwgMHhGMSwgMHhDQiwgMHhFRSwgLyogMHg1Qy0weDVGICovCisJMHhFQywgMHhGNCwgMHhCNSwgMHg3RCwgMHhFQywgMHhGMiwgMHhCNSwgMHg3RSwgLyogMHg2MC0weDYzICovCisJMHhCNSwgMHg4MCwgMHhDRiwgMHhFOSwgMHhCNSwgMHg4MSwgMHhFQywgMHhGNiwgLyogMHg2NC0weDY3ICovCisJMHhDNiwgMHhCMSwgMHhCNSwgMHg4MiwgMHhCNSwgMHg4MywgMHhCNSwgMHg4NCwgLyogMHg2OC0weDZCICovCisJMHhCNSwgMHg4NSwgMHhCQywgMHhDMCwgMHhCNSwgMHg4NiwgMHhFQywgMHhGNSwgLyogMHg2Qy0weDZGICovCisJMHhCNSwgMHg4NywgMHhCNSwgMHg4OCwgMHhCNSwgMHg4OSwgMHhCNSwgMHg4QSwgLyogMHg3MC0weDczICovCisJMHhCNSwgMHg4QiwgMHhCNSwgMHg4QywgMHhCNSwgMHg4RCwgMHhCNSwgMHhCQiwgLyogMHg3NC0weDc3ICovCisJMHhCQiwgMHhGNiwgMHhCNSwgMHg4RSwgMHhFQywgMHhGNywgMHhCNSwgMHg4RiwgLyogMHg3OC0weDdCICovCisJMHhCNSwgMHg5MCwgMHhCNSwgMHg5MSwgMHhCNSwgMHg5MiwgMHhCNSwgMHg5MywgLyogMHg3Qy0weDdGICovCisJCisJMHhEOSwgMHhGNywgMHhCRCwgMHhGQiwgMHhCNSwgMHg5NCwgMHhCNSwgMHg5NSwgLyogMHg4MC0weDgzICovCisJMHhDMiwgMHhCQiwgMHhFQywgMHhGOCwgMHhCNSwgMHg5NiwgMHhCNSwgMHg5NywgLyogMHg4NC0weDg3ICovCisJMHhCNSwgMHg5OCwgMHhCNSwgMHg5OSwgMHhFQywgMHhGOSwgMHhCNSwgMHg5QSwgLyogMHg4OC0weDhCICovCisJMHhCNSwgMHg5QiwgMHhCNSwgMHg5QywgMHhCNSwgMHg5RCwgMHhCOCwgMHhBMywgLyogMHg4Qy0weDhGICovCisJMHhCNSwgMHg5RSwgMHhCNSwgMHg5RiwgMHhCNSwgMHhBMCwgMHhCNiwgMHg0MCwgLyogMHg5MC0weDkzICovCisJMHhCNiwgMHg0MSwgMHhCNiwgMHg0MiwgMHhCNiwgMHg0MywgMHhCNiwgMHg0NCwgLyogMHg5NC0weDk3ICovCisJMHhCNiwgMHg0NSwgMHhCNiwgMHg0NiwgMHhFQywgMHhGQSwgMHhCNiwgMHg0NywgLyogMHg5OC0weDlCICovCisJMHhCNiwgMHg0OCwgMHhCNiwgMHg0OSwgMHhCNiwgMHg0QSwgMHhCNiwgMHg0QiwgLyogMHg5Qy0weDlGICovCisJMHhCNiwgMHg0QywgMHhCNiwgMHg0RCwgMHhCNiwgMHg0RSwgMHhCNiwgMHg0RiwgLyogMHhBMC0weEEzICovCisJMHhCNiwgMHg1MCwgMHhCNiwgMHg1MSwgMHhCNiwgMHg1MiwgMHhFQywgMHhGQiwgLyogMHhBNC0weEE3ICovCisJMHhCNiwgMHg1MywgMHhCNiwgMHg1NCwgMHhCNiwgMHg1NSwgMHhCNiwgMHg1NiwgLyogMHhBOC0weEFCICovCisJMHhCNiwgMHg1NywgMHhCNiwgMHg1OCwgMHhCNiwgMHg1OSwgMHhCNiwgMHg1QSwgLyogMHhBQy0weEFGICovCisJMHhCNiwgMHg1QiwgMHhCNiwgMHg1QywgMHhCNiwgMHg1RCwgMHhFQywgMHhGQywgLyogMHhCMC0weEIzICovCisJMHhCNiwgMHg1RSwgMHhCNiwgMHg1RiwgMHhCNiwgMHg2MCwgMHhCNiwgMHg2MSwgLyogMHhCNC0weEI3ICovCisJMHhCNiwgMHg2MiwgMHhEMywgMHhFRCwgMHhEOCwgMHhBRSwgMHhDMCwgMHhFQiwgLyogMHhCOC0weEJCICovCisJMHhCNiwgMHg2MywgMHhDNywgMHhERCwgMHhCQSwgMHhDQywgMHhCNiwgMHg2NCwgLyogMHhCQy0weEJGICovCisJMHhEMCwgMHhFMywgMHhDQiwgMHhCRCwgMHhCNiwgMHg2NSwgMHhDRCwgMHhCQSwgLyogMHhDMC0weEMzICovCisJMHhCNiwgMHg2NiwgMHhCNiwgMHg2NywgMHhCOCwgMHhEMSwgMHhCNiwgMHg2OCwgLyogMHhDNC0weEM3ICovCisJMHhCNiwgMHg2OSwgMHhCMSwgMHhGQywgMHhCNiwgMHg2QSwgMHhDNywgMHhFRiwgLyogMHhDOC0weENCICovCisJMHhCNiwgMHg2QiwgMHhENiwgMHhENiwgMHhCNiwgMHg2QywgMHhCNiwgMHg2RCwgLyogMHhDQy0weENGICovCisJMHhCNiwgMHg2RSwgMHhCRiwgMHhDNiwgMHhDMywgMHhFQiwgMHhCNiwgMHg2RiwgLyogMHhEMC0weEQzICovCisJMHhCNiwgMHg3MCwgMHhFRiwgMHhGNSwgMHhCNiwgMHg3MSwgMHhCNiwgMHg3MiwgLyogMHhENC0weEQ3ICovCisJMHhDMywgMHhEOCwgMHhCNiwgMHg3MywgMHhCNiwgMHg3NCwgMHhCNiwgMHg3NSwgLyogMHhEOC0weERCICovCisJMHhCNiwgMHg3NiwgMHhCNiwgMHg3NywgMHhCNiwgMHg3OCwgMHhENywgMHhFMiwgLyogMHhEQy0weERGICovCisJMHhCNiwgMHg3OSwgMHhCNiwgMHg3QSwgMHhCNiwgMHg3QiwgMHhFRiwgMHhGNywgLyogMHhFMC0weEUzICovCisJMHhCMywgMHhEMywgMHhCNiwgMHg3QywgMHhDNywgMHhEOCwgMHhEMSwgMHhFRCwgLyogMHhFNC0weEU3ICovCisJMHhCNiwgMHg3RCwgMHhENiwgMHhDOCwgMHhCNiwgMHg3RSwgMHhFRiwgMHhGOCwgLyogMHhFOC0weEVCICovCisJMHhCNiwgMHg4MCwgMHhFRiwgMHhGNiwgMHhCNiwgMHg4MSwgMHhCQiwgMHhGRCwgLyogMHhFQy0weEVGICovCisJMHhCMywgMHhDNiwgMHhCNiwgMHg4MiwgMHhCNiwgMHg4MywgMHhCNiwgMHg4NCwgLyogMHhGMC0weEYzICovCisJMHhCNiwgMHg4NSwgMHhCNiwgMHg4NiwgMHhCNiwgMHg4NywgMHhCNiwgMHg4OCwgLyogMHhGNC0weEY3ICovCisJMHhCRCwgMHhENSwgMHhCNiwgMHg4OSwgMHhCNiwgMHg4QSwgMHhEMiwgMHhDNiwgLyogMHhGOC0weEZCICovCisJMHhCNiwgMHg4QiwgMHhCQiwgMHhFMCwgMHhCNiwgMHg4QywgMHhCNiwgMHg4RCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfN0FbNTEyXSA9IHsKKwkweENGLCAweEExLCAweEI2LCAweDhFLCAweEVGLCAweEZDLCAweEVGLCAweEZCLCAvKiAweDAwLTB4MDMgKi8KKwkweEI2LCAweDhGLCAweEI2LCAweDkwLCAweEVGLCAweEY5LCAweEI2LCAweDkxLCAvKiAweDA0LTB4MDcgKi8KKwkweEI2LCAweDkyLCAweEI2LCAweDkzLCAweEI2LCAweDk0LCAweEIzLCAweENDLCAvKiAweDA4LTB4MEIgKi8KKwkweEI2LCAweDk1LCAweEM5LCAweEQ0LCAweENCLCAweEIwLCAweEI2LCAweDk2LCAvKiAweDBDLTB4MEYgKi8KKwkweEI2LCAweDk3LCAweEI2LCAweDk4LCAweEI2LCAweDk5LCAweEI2LCAweDlBLCAvKiAweDEwLTB4MTMgKi8KKwkweEVGLCAweEZFLCAweEI2LCAweDlCLCAweEI2LCAweDlDLCAweEIwLCAweERFLCAvKiAweDE0LTB4MTcgKi8KKwkweEI2LCAweDlELCAweEI2LCAweDlFLCAweEQ2LCAweEM5LCAweEI2LCAweDlGLCAvKiAweDE4LTB4MUIgKi8KKwkweEI2LCAweEEwLCAweEI3LCAweDQwLCAweEVGLCAweEZELCAweEI3LCAweDQxLCAvKiAweDFDLTB4MUYgKi8KKwkweEIzLCAweEVELCAweEI3LCAweDQyLCAweEI3LCAweDQzLCAweEY2LCAweEQ1LCAvKiAweDIwLTB4MjMgKi8KKwkweEI3LCAweDQ0LCAweEI3LCAweDQ1LCAweEI3LCAweDQ2LCAweEI3LCAweDQ3LCAvKiAweDI0LTB4MjcgKi8KKwkweEI3LCAweDQ4LCAweEI3LCAweDQ5LCAweEI3LCAweDRBLCAweEI3LCAweDRCLCAvKiAweDI4LTB4MkIgKi8KKwkweEI3LCAweDRDLCAweEI3LCAweDRELCAweEI3LCAweDRFLCAweEI3LCAweDRGLCAvKiAweDJDLTB4MkYgKi8KKwkweEI3LCAweDUwLCAweEI3LCAweDUxLCAweEI3LCAweDUyLCAweENFLCAweEM4LCAvKiAweDMwLTB4MzMgKi8KKwkweEI3LCAweDUzLCAweEI3LCAweDU0LCAweEI3LCAweDU1LCAweEYwLCAweEEyLCAvKiAweDM0LTB4MzcgKi8KKwkweEI3LCAweDU2LCAweEYwLCAweEExLCAweEI3LCAweDU3LCAweEI1LCAweEJFLCAvKiAweDM4LTB4M0IgKi8KKwkweEJDLCAweERBLCAweEJCLCAweEZDLCAweEI3LCAweDU4LCAweEI4LCAweEU1LCAvKiAweDNDLTB4M0YgKi8KKwkweEI3LCAweDU5LCAweEI3LCAweDVBLCAweEI3LCAweDVCLCAweEI3LCAweDVDLCAvKiAweDQwLTB4NDMgKi8KKwkweEI3LCAweDVELCAweEI3LCAweDVFLCAweEM0LCAweEMyLCAweEI3LCAweDVGLCAvKiAweDQ0LTB4NDcgKi8KKwkweEI3LCAweDYwLCAweEI3LCAweDYxLCAweEI3LCAweDYyLCAweEI3LCAweDYzLCAvKiAweDQ4LTB4NEIgKi8KKwkweEI3LCAweDY0LCAweEI3LCAweDY1LCAweEI3LCAweDY2LCAweEI3LCAweDY3LCAvKiAweDRDLTB4NEYgKi8KKwkweEI3LCAweDY4LCAweEYwLCAweEEzLCAweEI3LCAweDY5LCAweEI3LCAweDZBLCAvKiAweDUwLTB4NTMgKi8KKwkweEI3LCAweDZCLCAweEI3LCAweDZDLCAweEI3LCAweDZELCAweENCLCAweEVCLCAvKiAweDU0LTB4NTcgKi8KKwkweEI3LCAweDZFLCAweEI3LCAweDZGLCAweEI3LCAweDcwLCAweEI3LCAweDcxLCAvKiAweDU4LTB4NUIgKi8KKwkweEI3LCAweDcyLCAweEI3LCAweDczLCAweEI3LCAweDc0LCAweEI3LCAweDc1LCAvKiAweDVDLTB4NUYgKi8KKwkweEI3LCAweDc2LCAweEI3LCAweDc3LCAweEI3LCAweDc4LCAweEI3LCAweDc5LCAvKiAweDYwLTB4NjMgKi8KKwkweEI3LCAweDdBLCAweEI3LCAweDdCLCAweEI3LCAweDdDLCAweEI3LCAweDdELCAvKiAweDY0LTB4NjcgKi8KKwkweEI3LCAweDdFLCAweEI3LCAweDgwLCAweEI3LCAweDgxLCAweEI3LCAweDgyLCAvKiAweDY4LTB4NkIgKi8KKwkweEI3LCAweDgzLCAweEI3LCAweDg0LCAweEI3LCAweDg1LCAweEI3LCAweDg2LCAvKiAweDZDLTB4NkYgKi8KKwkweEYwLCAweEE2LCAweEI3LCAweDg3LCAweEI3LCAweDg4LCAweEI3LCAweDg5LCAvKiAweDcwLTB4NzMgKi8KKwkweEQxLCAweEE4LCAweEI3LCAweDhBLCAweEJFLCAweEJGLCAweEM3LCAweEVFLCAvKiAweDc0LTB4NzcgKi8KKwkweEYxLCAweEI2LCAweEYxLCAweEI3LCAweEJGLCAweEQ1LCAweEI3LCAweDhCLCAvKiAweDc4LTB4N0IgKi8KKwkweEI3LCAweDhDLCAweEI3LCAweDhELCAweEI3LCAweDhFLCAweEI0LCAweEE5LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEYxLCAweEI4LCAweENELCAweEJCLCAweEI3LCAweDhGLCAweEM3LCAweEQ0LCAvKiAweDgwLTB4ODMgKi8KKwkweEQ1LCAweEFELCAweEI3LCAweDkwLCAweEYxLCAweEI5LCAweEI3LCAweDkxLCAvKiAweDg0LTB4ODcgKi8KKwkweEYxLCAweEJBLCAweEI3LCAweDkyLCAweEI3LCAweDkzLCAweEI3LCAweDk0LCAvKiAweDg4LTB4OEIgKi8KKwkweEI3LCAweDk1LCAweEM3LCAweENGLCAweEI3LCAweDk2LCAweEI3LCAweDk3LCAvKiAweDhDLTB4OEYgKi8KKwkweEI3LCAweDk4LCAweEQyLCAweEE0LCAweEQ2LCAweENGLCAweEI3LCAweDk5LCAvKiAweDkwLTB4OTMgKi8KKwkweEI3LCAweDlBLCAweEYxLCAweEJCLCAweEJELCAweEQxLCAweEI0LCAweEIwLCAvKiAweDk0LTB4OTcgKi8KKwkweEJFLCAweEJELCAweEI3LCAweDlCLCAweEI3LCAweDlDLCAweEI3LCAweDlELCAvKiAweDk4LTB4OUIgKi8KKwkweEI0LCAweERDLCAweENFLCAweEQxLCAweEI3LCAweDlFLCAweEJGLCAweERGLCAvKiAweDlDLTB4OUYgKi8KKwkweEYxLCAweEJELCAweEI3LCAweDlGLCAweEI3LCAweEEwLCAweEI4LCAweDQwLCAvKiAweEEwLTB4QTMgKi8KKwkweEI4LCAweDQxLCAweEJGLCAweEZBLCAweEYxLCAweEJDLCAweEI4LCAweDQyLCAvKiAweEE0LTB4QTcgKi8KKwkweEYxLCAweEJGLCAweEI4LCAweDQzLCAweEI4LCAweDQ0LCAweEI4LCAweDQ1LCAvKiAweEE4LTB4QUIgKi8KKwkweEYxLCAweEJFLCAweEYxLCAweEMwLCAweEI4LCAweDQ2LCAweEI4LCAweDQ3LCAvKiAweEFDLTB4QUYgKi8KKwkweEI4LCAweDQ4LCAweEI4LCAweDQ5LCAweEI4LCAweDRBLCAweEYxLCAweEMxLCAvKiAweEIwLTB4QjMgKi8KKwkweEI4LCAweDRCLCAweEI4LCAweDRDLCAweEI4LCAweDRELCAweEI4LCAweDRFLCAvKiAweEI0LTB4QjcgKi8KKwkweEI4LCAweDRGLCAweEI4LCAweDUwLCAweEI4LCAweDUxLCAweEI4LCAweDUyLCAvKiAweEI4LTB4QkIgKi8KKwkweEI4LCAweDUzLCAweEI4LCAweDU0LCAweEI4LCAweDU1LCAweEMxLCAweEZFLCAvKiAweEJDLTB4QkYgKi8KKwkweEI4LCAweDU2LCAweEI4LCAweDU3LCAweEI4LCAweDU4LCAweEI4LCAweDU5LCAvKiAweEMwLTB4QzMgKi8KKwkweEI4LCAweDVBLCAweEI4LCAweDVCLCAweEI4LCAweDVDLCAweEI4LCAweDVELCAvKiAweEM0LTB4QzcgKi8KKwkweEI4LCAweDVFLCAweEI4LCAweDVGLCAweEI4LCAweDYwLCAweEMxLCAweEEyLCAvKiAweEM4LTB4Q0IgKi8KKwkweEI4LCAweDYxLCAweEI4LCAweDYyLCAweEI4LCAweDYzLCAweEI4LCAweDY0LCAvKiAweENDLTB4Q0YgKi8KKwkweEI4LCAweDY1LCAweEI4LCAweDY2LCAweEI4LCAweDY3LCAweEI4LCAweDY4LCAvKiAweEQwLTB4RDMgKi8KKwkweEI4LCAweDY5LCAweEI4LCAweDZBLCAweENBLCAweEZBLCAweEI4LCAweDZCLCAvKiAweEQ0LTB4RDcgKi8KKwkweEI4LCAweDZDLCAweEQ1LCAweEJFLCAweEI4LCAweDZELCAweEI4LCAweDZFLCAvKiAweEQ4LTB4REIgKi8KKwkweEI4LCAweDZGLCAweEI4LCAweDcwLCAweEJFLCAweEJBLCAweEJFLCAweEI5LCAvKiAweERDLTB4REYgKi8KKwkweEQ1LCAweEMyLCAweEI4LCAweDcxLCAweEI4LCAweDcyLCAweEJGLCAweEEyLCAvKiAweEUwLTB4RTMgKi8KKwkweEI4LCAweDczLCAweENELCAweEFGLCAweEYxLCAweEI1LCAweEI4LCAweDc0LCAvKiAweEU0LTB4RTcgKi8KKwkweEI4LCAweDc1LCAweEI4LCAweDc2LCAweEI4LCAweDc3LCAweEI4LCAweDc4LCAvKiAweEU4LTB4RUIgKi8KKwkweEI4LCAweDc5LCAweEJELCAweERGLCAweEI4LCAweDdBLCAweEI2LCAweENCLCAvKiAweEVDLTB4RUYgKi8KKwkweEI4LCAweDdCLCAweEI4LCAweDdDLCAweEI4LCAweDdELCAweEI4LCAweDdFLCAvKiAweEYwLTB4RjMgKi8KKwkweEI4LCAweDgwLCAweEI4LCAweDgxLCAweEI4LCAweDgyLCAweEI4LCAweDgzLCAvKiAweEY0LTB4RjcgKi8KKwkweEI4LCAweDg0LCAweEQ2LCAweEYxLCAweEYzLCAweEMzLCAweEI4LCAweDg1LCAvKiAweEY4LTB4RkIgKi8KKwkweEI4LCAweDg2LCAweEYzLCAweEM0LCAweEI4LCAweDg3LCAweEI4LCAweENELCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183Qls1MTJdID0geworCTB4QjgsIDB4ODgsIDB4QjgsIDB4ODksIDB4QjgsIDB4OEEsIDB4RjMsIDB4QzYsIC8qIDB4MDAtMHgwMyAqLworCTB4RjMsIDB4QzcsIDB4QjgsIDB4OEIsIDB4QjAsIDB4Q0EsIDB4QjgsIDB4OEMsIC8qIDB4MDQtMHgwNyAqLworCTB4RjMsIDB4QzUsIDB4QjgsIDB4OEQsIDB4RjMsIDB4QzksIDB4Q0IsIDB4RjEsIC8qIDB4MDgtMHgwQiAqLworCTB4QjgsIDB4OEUsIDB4QjgsIDB4OEYsIDB4QjgsIDB4OTAsIDB4RjMsIDB4Q0IsIC8qIDB4MEMtMHgwRiAqLworCTB4QjgsIDB4OTEsIDB4RDAsIDB4QTYsIDB4QjgsIDB4OTIsIDB4QjgsIDB4OTMsIC8qIDB4MTAtMHgxMyAqLworCTB4QjEsIDB4Q0EsIDB4RjMsIDB4QzgsIDB4QjgsIDB4OTQsIDB4QjgsIDB4OTUsIC8qIDB4MTQtMHgxNyAqLworCTB4QjgsIDB4OTYsIDB4RjMsIDB4Q0YsIDB4QjgsIDB4OTcsIDB4QjUsIDB4RDEsIC8qIDB4MTgtMHgxQiAqLworCTB4QjgsIDB4OTgsIDB4QjgsIDB4OTksIDB4RjMsIDB4RDcsIDB4QjgsIDB4OUEsIC8qIDB4MUMtMHgxRiAqLworCTB4RjMsIDB4RDIsIDB4QjgsIDB4OUIsIDB4QjgsIDB4OUMsIDB4QjgsIDB4OUQsIC8qIDB4MjAtMHgyMyAqLworCTB4RjMsIDB4RDQsIDB4RjMsIDB4RDMsIDB4QjcsIDB4RkIsIDB4QjgsIDB4OUUsIC8qIDB4MjQtMHgyNyAqLworCTB4QjEsIDB4QkYsIDB4QjgsIDB4OUYsIDB4RjMsIDB4Q0UsIDB4RjMsIDB4Q0EsIC8qIDB4MjgtMHgyQiAqLworCTB4QjUsIDB4REEsIDB4QjgsIDB4QTAsIDB4RjMsIDB4RDAsIDB4QjksIDB4NDAsIC8qIDB4MkMtMHgyRiAqLworCTB4QjksIDB4NDEsIDB4RjMsIDB4RDEsIDB4QjksIDB4NDIsIDB4RjMsIDB4RDUsIC8qIDB4MzAtMHgzMyAqLworCTB4QjksIDB4NDMsIDB4QjksIDB4NDQsIDB4QjksIDB4NDUsIDB4QjksIDB4NDYsIC8qIDB4MzQtMHgzNyAqLworCTB4RjMsIDB4Q0QsIDB4QjksIDB4NDcsIDB4QkMsIDB4RTMsIDB4QjksIDB4NDgsIC8qIDB4MzgtMHgzQiAqLworCTB4QzEsIDB4RkQsIDB4QjksIDB4NDksIDB4RjMsIDB4RDYsIDB4QjksIDB4NEEsIC8qIDB4M0MtMHgzRiAqLworCTB4QjksIDB4NEIsIDB4QjksIDB4NEMsIDB4QjksIDB4NEQsIDB4QjksIDB4NEUsIC8qIDB4NDAtMHg0MyAqLworCTB4QjksIDB4NEYsIDB4RjMsIDB4REEsIDB4QjksIDB4NTAsIDB4RjMsIDB4Q0MsIC8qIDB4NDQtMHg0NyAqLworCTB4QjksIDB4NTEsIDB4QjUsIDB4QzgsIDB4QjksIDB4NTIsIDB4QkQsIDB4RUUsIC8qIDB4NDgtMHg0QiAqLworCTB4RjMsIDB4REMsIDB4QjksIDB4NTMsIDB4QjksIDB4NTQsIDB4QjcsIDB4QTQsIC8qIDB4NEMtMHg0RiAqLworCTB4QkYsIDB4RjAsIDB4RDYsIDB4RkUsIDB4Q0QsIDB4QjIsIDB4QjksIDB4NTUsIC8qIDB4NTAtMHg1MyAqLworCTB4QjQsIDB4RjAsIDB4QjksIDB4NTYsIDB4QjIsIDB4REYsIDB4QjksIDB4NTcsIC8qIDB4NTQtMHg1NyAqLworCTB4RjMsIDB4RDgsIDB4QjksIDB4NTgsIDB4RjMsIDB4RDksIDB4QzksIDB4QjgsIC8qIDB4NTgtMHg1QiAqLworCTB4QjksIDB4NTksIDB4RjMsIDB4REQsIDB4QjksIDB4NUEsIDB4QjksIDB4NUIsIC8qIDB4NUMtMHg1RiAqLworCTB4RjMsIDB4REUsIDB4QjksIDB4NUMsIDB4RjMsIDB4RTEsIDB4QjksIDB4NUQsIC8qIDB4NjAtMHg2MyAqLworCTB4QjksIDB4NUUsIDB4QjksIDB4NUYsIDB4QjksIDB4NjAsIDB4QjksIDB4NjEsIC8qIDB4NjQtMHg2NyAqLworCTB4QjksIDB4NjIsIDB4QjksIDB4NjMsIDB4QjksIDB4NjQsIDB4QjksIDB4NjUsIC8qIDB4NjgtMHg2QiAqLworCTB4QjksIDB4NjYsIDB4QjksIDB4NjcsIDB4RjMsIDB4REYsIDB4QjksIDB4NjgsIC8qIDB4NkMtMHg2RiAqLworCTB4QjksIDB4NjksIDB4RjMsIDB4RTMsIDB4RjMsIDB4RTIsIDB4QjksIDB4NkEsIC8qIDB4NzAtMHg3MyAqLworCTB4QjksIDB4NkIsIDB4RjMsIDB4REIsIDB4QjksIDB4NkMsIDB4QkYsIDB4RUEsIC8qIDB4NzQtMHg3NyAqLworCTB4QjksIDB4NkQsIDB4QjMsIDB4RUYsIDB4QjksIDB4NkUsIDB4RjMsIDB4RTAsIC8qIDB4NzgtMHg3QiAqLworCTB4QjksIDB4NkYsIDB4QjksIDB4NzAsIDB4QzcsIDB4QTksIDB4QjksIDB4NzEsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QkMsIDB4RjIsIDB4QjksIDB4NzIsIDB4QjksIDB4NzMsIDB4QjksIDB4NzQsIC8qIDB4ODAtMHg4MyAqLworCTB4QjksIDB4NzUsIDB4RjMsIDB4RUIsIDB4QjksIDB4NzYsIDB4QjksIDB4NzcsIC8qIDB4ODQtMHg4NyAqLworCTB4QjksIDB4NzgsIDB4QjksIDB4NzksIDB4QjksIDB4N0EsIDB4QjksIDB4N0IsIC8qIDB4ODgtMHg4QiAqLworCTB4QjksIDB4N0MsIDB4QjksIDB4QkYsIDB4QjksIDB4N0QsIDB4QjksIDB4N0UsIC8qIDB4OEMtMHg4RiAqLworCTB4RjMsIDB4RTQsIDB4QjksIDB4ODAsIDB4QjksIDB4ODEsIDB4QjksIDB4ODIsIC8qIDB4OTAtMHg5MyAqLworCTB4QjIsIDB4QUQsIDB4QkIsIDB4RkUsIDB4QjksIDB4ODMsIDB4Q0IsIDB4RTMsIC8qIDB4OTQtMHg5NyAqLworCTB4QjksIDB4ODQsIDB4QjksIDB4ODUsIDB4QjksIDB4ODYsIDB4QjksIDB4ODcsIC8qIDB4OTgtMHg5QiAqLworCTB4RjMsIDB4RUQsIDB4RjMsIDB4RTksIDB4QjksIDB4ODgsIDB4QjksIDB4ODksIC8qIDB4OUMtMHg5RiAqLworCTB4QjksIDB4OEEsIDB4QjksIDB4REMsIDB4RjMsIDB4RUUsIDB4QjksIDB4OEIsIC8qIDB4QTAtMHhBMyAqLworCTB4QjksIDB4OEMsIDB4QjksIDB4OEQsIDB4RjMsIDB4RTUsIDB4RjMsIDB4RTYsIC8qIDB4QTQtMHhBNyAqLworCTB4RjMsIDB4RUEsIDB4QzIsIDB4RTEsIDB4RjMsIDB4RUMsIDB4RjMsIDB4RUYsIC8qIDB4QTgtMHhBQiAqLworCTB4RjMsIDB4RTgsIDB4QkMsIDB4RkQsIDB4QjksIDB4OEUsIDB4QjksIDB4OEYsIC8qIDB4QUMtMHhBRiAqLworCTB4QjksIDB4OTAsIDB4Q0YsIDB4RTQsIDB4QjksIDB4OTEsIDB4QjksIDB4OTIsIC8qIDB4QjAtMHhCMyAqLworCTB4RjMsIDB4RjAsIDB4QjksIDB4OTMsIDB4QjksIDB4OTQsIDB4QjksIDB4OTUsIC8qIDB4QjQtMHhCNyAqLworCTB4RjMsIDB4RTcsIDB4QjksIDB4OTYsIDB4QjksIDB4OTcsIDB4QjksIDB4OTgsIC8qIDB4QjgtMHhCQiAqLworCTB4QjksIDB4OTksIDB4QjksIDB4OUEsIDB4QjksIDB4OUIsIDB4QjksIDB4OUMsIC8qIDB4QkMtMHhCRiAqLworCTB4QjksIDB4OUQsIDB4RjMsIDB4RjIsIDB4QjksIDB4OUUsIDB4QjksIDB4OUYsIC8qIDB4QzAtMHhDMyAqLworCTB4QjksIDB4QTAsIDB4QkEsIDB4NDAsIDB4RDcsIDB4QUQsIDB4QzYsIDB4QUEsIC8qIDB4QzQtMHhDNyAqLworCTB4QkEsIDB4NDEsIDB4QkEsIDB4NDIsIDB4QkEsIDB4NDMsIDB4QkEsIDB4NDQsIC8qIDB4QzgtMHhDQiAqLworCTB4RjMsIDB4RjMsIDB4QkEsIDB4NDUsIDB4QkEsIDB4NDYsIDB4QkEsIDB4NDcsIC8qIDB4Q0MtMHhDRiAqLworCTB4QkEsIDB4NDgsIDB4RjMsIDB4RjEsIDB4QkEsIDB4NDksIDB4QzIsIDB4QTgsIC8qIDB4RDAtMHhEMyAqLworCTB4QkEsIDB4NEEsIDB4QkEsIDB4NEIsIDB4QkEsIDB4NEMsIDB4QkEsIDB4NEQsIC8qIDB4RDQtMHhENyAqLworCTB4QkEsIDB4NEUsIDB4QjgsIDB4REQsIDB4RjMsIDB4RjUsIDB4QkEsIDB4NEYsIC8qIDB4RDgtMHhEQiAqLworCTB4QkEsIDB4NTAsIDB4RjMsIDB4RjQsIDB4QkEsIDB4NTEsIDB4QkEsIDB4NTIsIC8qIDB4REMtMHhERiAqLworCTB4QkEsIDB4NTMsIDB4QjQsIDB4REIsIDB4QkEsIDB4NTQsIDB4QkEsIDB4NTUsIC8qIDB4RTAtMHhFMyAqLworCTB4QkEsIDB4NTYsIDB4RjMsIDB4RjYsIDB4RjMsIDB4RjcsIDB4QkEsIDB4NTcsIC8qIDB4RTQtMHhFNyAqLworCTB4QkEsIDB4NTgsIDB4QkEsIDB4NTksIDB4RjMsIDB4RjgsIDB4QkEsIDB4NUEsIC8qIDB4RTgtMHhFQiAqLworCTB4QkEsIDB4NUIsIDB4QkEsIDB4NUMsIDB4QzAsIDB4QkEsIDB4QkEsIDB4NUQsIC8qIDB4RUMtMHhFRiAqLworCTB4QkEsIDB4NUUsIDB4QzAsIDB4RTksIDB4QkEsIDB4NUYsIDB4QkEsIDB4NjAsIC8qIDB4RjAtMHhGMyAqLworCTB4QkEsIDB4NjEsIDB4QkEsIDB4NjIsIDB4QkEsIDB4NjMsIDB4QzUsIDB4RjEsIC8qIDB4RjQtMHhGNyAqLworCTB4QkEsIDB4NjQsIDB4QkEsIDB4NjUsIDB4QkEsIDB4NjYsIDB4QkEsIDB4NjcsIC8qIDB4RjgtMHhGQiAqLworCTB4RjMsIDB4RkIsIDB4QkEsIDB4NjgsIDB4RjMsIDB4RkEsIDB4QkEsIDB4NjksIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzdDWzUxMl0gPSB7CisJMHhCQSwgMHg2QSwgMHhCQSwgMHg2QiwgMHhCQSwgMHg2QywgMHhCQSwgMHg2RCwgLyogMHgwMC0weDAzICovCisJMHhCQSwgMHg2RSwgMHhCQSwgMHg2RiwgMHhCQSwgMHg3MCwgMHhCNCwgMHhEOCwgLyogMHgwNC0weDA3ICovCisJMHhCQSwgMHg3MSwgMHhCQSwgMHg3MiwgMHhCQSwgMHg3MywgMHhGMywgMHhGRSwgLyogMHgwOC0weDBCICovCisJMHhGMywgMHhGOSwgMHhCQSwgMHg3NCwgMHhCQSwgMHg3NSwgMHhGMywgMHhGQywgLyogMHgwQy0weDBGICovCisJMHhCQSwgMHg3NiwgMHhCQSwgMHg3NywgMHhCQSwgMHg3OCwgMHhCQSwgMHg3OSwgLyogMHgxMC0weDEzICovCisJMHhCQSwgMHg3QSwgMHhCQSwgMHg3QiwgMHhGMywgMHhGRCwgMHhCQSwgMHg3QywgLyogMHgxNC0weDE3ICovCisJMHhCQSwgMHg3RCwgMHhCQSwgMHg3RSwgMHhCQSwgMHg4MCwgMHhCQSwgMHg4MSwgLyogMHgxOC0weDFCICovCisJMHhCQSwgMHg4MiwgMHhCQSwgMHg4MywgMHhCQSwgMHg4NCwgMHhGNCwgMHhBMSwgLyogMHgxQy0weDFGICovCisJMHhCQSwgMHg4NSwgMHhCQSwgMHg4NiwgMHhCQSwgMHg4NywgMHhCQSwgMHg4OCwgLyogMHgyMC0weDIzICovCisJMHhCQSwgMHg4OSwgMHhCQSwgMHg4QSwgMHhGNCwgMHhBMywgMHhCQiwgMHhDOSwgLyogMHgyNC0weDI3ICovCisJMHhCQSwgMHg4QiwgMHhCQSwgMHg4QywgMHhGNCwgMHhBMiwgMHhCQSwgMHg4RCwgLyogMHgyOC0weDJCICovCisJMHhCQSwgMHg4RSwgMHhCQSwgMHg4RiwgMHhCQSwgMHg5MCwgMHhCQSwgMHg5MSwgLyogMHgyQy0weDJGICovCisJMHhCQSwgMHg5MiwgMHhCQSwgMHg5MywgMHhCQSwgMHg5NCwgMHhCQSwgMHg5NSwgLyogMHgzMC0weDMzICovCisJMHhCQSwgMHg5NiwgMHhCQSwgMHg5NywgMHhCQSwgMHg5OCwgMHhCQSwgMHg5OSwgLyogMHgzNC0weDM3ICovCisJMHhGNCwgMHhBNCwgMHhCQSwgMHg5QSwgMHhCQSwgMHg5QiwgMHhCQSwgMHg5QywgLyogMHgzOC0weDNCICovCisJMHhCQSwgMHg5RCwgMHhCQSwgMHg5RSwgMHhCQSwgMHg5RiwgMHhCMiwgMHhCRSwgLyogMHgzQy0weDNGICovCisJMHhGNCwgMHhBNiwgMHhGNCwgMHhBNSwgMHhCQSwgMHhBMCwgMHhCQiwgMHg0MCwgLyogMHg0MC0weDQzICovCisJMHhCQiwgMHg0MSwgMHhCQiwgMHg0MiwgMHhCQiwgMHg0MywgMHhCQiwgMHg0NCwgLyogMHg0NC0weDQ3ICovCisJMHhCQiwgMHg0NSwgMHhCQiwgMHg0NiwgMHhCQiwgMHg0NywgMHhCQiwgMHg0OCwgLyogMHg0OC0weDRCICovCisJMHhCQiwgMHg0OSwgMHhCQywgMHhBRSwgMHhCQiwgMHg0QSwgMHhCQiwgMHg0QiwgLyogMHg0Qy0weDRGICovCisJMHhCQiwgMHg0QywgMHhCQiwgMHg0RCwgMHhCQiwgMHg0RSwgMHhCQiwgMHg0RiwgLyogMHg1MC0weDUzICovCisJMHhCQiwgMHg1MCwgMHhCQiwgMHg1MSwgMHhCQiwgMHg1MiwgMHhCQiwgMHg1MywgLyogMHg1NC0weDU3ICovCisJMHhCQiwgMHg1NCwgMHhCQiwgMHg1NSwgMHhCQiwgMHg1NiwgMHhCQiwgMHg1NywgLyogMHg1OC0weDVCICovCisJMHhCQiwgMHg1OCwgMHhCQiwgMHg1OSwgMHhCQiwgMHg1QSwgMHhCQiwgMHg1QiwgLyogMHg1Qy0weDVGICovCisJMHhCQiwgMHg1QywgMHhCQiwgMHg1RCwgMHhCQiwgMHg1RSwgMHhCQiwgMHg1RiwgLyogMHg2MC0weDYzICovCisJMHhCQiwgMHg2MCwgMHhCQiwgMHg2MSwgMHhCQiwgMHg2MiwgMHhCQiwgMHg2MywgLyogMHg2NC0weDY3ICovCisJMHhCQiwgMHg2NCwgMHhCQiwgMHg2NSwgMHhCQiwgMHg2NiwgMHhCQiwgMHg2NywgLyogMHg2OC0weDZCICovCisJMHhCQiwgMHg2OCwgMHhCQiwgMHg2OSwgMHhCQiwgMHg2QSwgMHhCQiwgMHg2QiwgLyogMHg2Qy0weDZGICovCisJMHhCQiwgMHg2QywgMHhCQiwgMHg2RCwgMHhCQiwgMHg2RSwgMHhDMywgMHhENywgLyogMHg3MC0weDczICovCisJMHhEOSwgMHhFMSwgMHhCQiwgMHg2RiwgMHhCQiwgMHg3MCwgMHhCQiwgMHg3MSwgLyogMHg3NC0weDc3ICovCisJMHhCQiwgMHg3MiwgMHhCQiwgMHg3MywgMHhCQiwgMHg3NCwgMHhDMCwgMHhFMCwgLyogMHg3OC0weDdCICovCisJMHhGNCwgMHhDQywgMHhENywgMHhEMSwgMHhCQiwgMHg3NSwgMHhCQiwgMHg3NiwgLyogMHg3Qy0weDdGICovCisJCisJMHhCQiwgMHg3NywgMHhCQiwgMHg3OCwgMHhCQiwgMHg3OSwgMHhCQiwgMHg3QSwgLyogMHg4MC0weDgzICovCisJMHhCQiwgMHg3QiwgMHhCQiwgMHg3QywgMHhCQiwgMHg3RCwgMHhCQiwgMHg3RSwgLyogMHg4NC0weDg3ICovCisJMHhCQiwgMHg4MCwgMHhCNywgMHhEQiwgMHhCQiwgMHg4MSwgMHhCQiwgMHg4MiwgLyogMHg4OC0weDhCICovCisJMHhCQiwgMHg4MywgMHhCQiwgMHg4NCwgMHhCQiwgMHg4NSwgMHhCQiwgMHg4NiwgLyogMHg4Qy0weDhGICovCisJMHhCQiwgMHg4NywgMHhGNCwgMHhDRSwgMHhDMSwgMHhBMywgMHhCQiwgMHg4OCwgLyogMHg5MC0weDkzICovCisJMHhCQiwgMHg4OSwgMHhDNiwgMHhDOSwgMHhCQiwgMHg4QSwgMHhCNCwgMHhENiwgLyogMHg5NC0weDk3ICovCisJMHhENSwgMHhCMywgMHhCQiwgMHg4QiwgMHhCQiwgMHg4QywgMHhCQiwgMHg4RCwgLyogMHg5OC0weDlCICovCisJMHhGNCwgMHhEMCwgMHhGNCwgMHhDRiwgMHhGNCwgMHhEMSwgMHhDQiwgMHhEQSwgLyogMHg5Qy0weDlGICovCisJMHhCQiwgMHg4RSwgMHhCQiwgMHg4RiwgMHhGNCwgMHhEMiwgMHhCQiwgMHg5MCwgLyogMHhBMC0weEEzICovCisJMHhENCwgMHhDMSwgMHhENiwgMHhFMCwgMHhCQiwgMHg5MSwgMHhCQiwgMHg5MiwgLyogMHhBNC0weEE3ICovCisJMHhCQiwgMHg5MywgMHhCQiwgMHg5NCwgMHhCNywgMHhFMCwgMHhCQiwgMHg5NSwgLyogMHhBOC0weEFCICovCisJMHhCQiwgMHg5NiwgMHhCQiwgMHg5NywgMHhDMSwgMHhCOCwgMHhCQiwgMHg5OCwgLyogMHhBQy0weEFGICovCisJMHhCQiwgMHg5OSwgMHhDMSwgMHhCQiwgMHhGNCwgMHhEMywgMHhCRSwgMHhBQywgLyogMHhCMC0weEIzICovCisJMHhCQiwgMHg5QSwgMHhCQiwgMHg5QiwgMHhCQiwgMHg5QywgMHhCQiwgMHg5RCwgLyogMHhCNC0weEI3ICovCisJMHhCQiwgMHg5RSwgMHhCNCwgMHhFMiwgMHhCQiwgMHg5RiwgMHhCQiwgMHhBMCwgLyogMHhCOC0weEJCICovCisJMHhGNCwgMHhENCwgMHhGNCwgMHhENSwgMHhCRSwgMHhBQiwgMHhCQywgMHg0MCwgLyogMHhCQy0weEJGICovCisJMHhCQywgMHg0MSwgMHhGNCwgMHhENiwgMHhCQywgMHg0MiwgMHhCQywgMHg0MywgLyogMHhDMC0weEMzICovCisJMHhCQywgMHg0NCwgMHhGNCwgMHhEQiwgMHhCQywgMHg0NSwgMHhGNCwgMHhENywgLyogMHhDNC0weEM3ICovCisJMHhGNCwgMHhEQSwgMHhCQywgMHg0NiwgMHhCQSwgMHhGRCwgMHhCQywgMHg0NywgLyogMHhDOC0weENCICovCisJMHhGNCwgMHhEOCwgMHhGNCwgMHhEOSwgMHhCQywgMHg0OCwgMHhCQywgMHg0OSwgLyogMHhDQy0weENGICovCisJMHhCQywgMHg0QSwgMHhCQywgMHg0QiwgMHhCQywgMHg0QywgMHhCQywgMHg0RCwgLyogMHhEMC0weEQzICovCisJMHhCQywgMHg0RSwgMHhCOCwgMHhFMiwgMHhDQywgMHhDNywgMHhGNCwgMHhEQywgLyogMHhENC0weEQ3ICovCisJMHhCQywgMHg0RiwgMHhCMiwgMHhEQSwgMHhCQywgMHg1MCwgMHhCQywgMHg1MSwgLyogMHhEOC0weERCICovCisJMHhDMywgMHhEMywgMHhCQywgMHg1MiwgMHhCQywgMHg1MywgMHhENCwgMHhFMywgLyogMHhEQy0weERGICovCisJMHhCRiwgMHhCNywgMHhCQywgMHg1NCwgMHhCQywgMHg1NSwgMHhCQywgMHg1NiwgLyogMHhFMC0weEUzICovCisJMHhCQywgMHg1NywgMHhCQywgMHg1OCwgMHhCQywgMHg1OSwgMHhCQywgMHg1QSwgLyogMHhFNC0weEU3ICovCisJMHhGNCwgMHhERCwgMHhCQywgMHg1QiwgMHhCQywgMHg1QywgMHhCQywgMHg1RCwgLyogMHhFOC0weEVCICovCisJMHhCQywgMHg1RSwgMHhCQywgMHg1RiwgMHhCQywgMHg2MCwgMHhDNSwgMHhCNCwgLyogMHhFQy0weEVGICovCisJMHhCQywgMHg2MSwgMHhCQywgMHg2MiwgMHhCQywgMHg2MywgMHhCQywgMHg2NCwgLyogMHhGMC0weEYzICovCisJMHhCQywgMHg2NSwgMHhCQywgMHg2NiwgMHhCQywgMHg2NywgMHhCQywgMHg2OCwgLyogMHhGNC0weEY3ICovCisJMHhGNCwgMHhFOSwgMHhCQywgMHg2OSwgMHhCQywgMHg2QSwgMHhDRiwgMHhCNSwgLyogMHhGOC0weEZCICovCisJMHhCQywgMHg2QiwgMHhCQywgMHg2QywgMHhCQywgMHg2RCwgMHhCQywgMHg2RSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfN0RbNTEyXSA9IHsKKwkweEJDLCAweDZGLCAweEJDLCAweDcwLCAweEJDLCAweDcxLCAweEJDLCAweDcyLCAvKiAweDAwLTB4MDMgKi8KKwkweEJDLCAweDczLCAweEJDLCAweDc0LCAweEJDLCAweDc1LCAweEJDLCAweDc2LCAvKiAweDA0LTB4MDcgKi8KKwkweEJDLCAweDc3LCAweEJDLCAweDc4LCAweENFLCAweEM5LCAweEJDLCAweDc5LCAvKiAweDA4LTB4MEIgKi8KKwkweEJDLCAweDdBLCAweEJDLCAweDdCLCAweEJDLCAweDdDLCAweEJDLCAweDdELCAvKiAweDBDLTB4MEYgKi8KKwkweEJDLCAweDdFLCAweEJDLCAweDgwLCAweEJDLCAweDgxLCAweEJDLCAweDgyLCAvKiAweDEwLTB4MTMgKi8KKwkweEJDLCAweDgzLCAweEJDLCAweDg0LCAweEJDLCAweDg1LCAweEJDLCAweDg2LCAvKiAweDE0LTB4MTcgKi8KKwkweEJDLCAweDg3LCAweEJDLCAweDg4LCAweEJDLCAweDg5LCAweEJDLCAweDhBLCAvKiAweDE4LTB4MUIgKi8KKwkweEJDLCAweDhCLCAweEJDLCAweDhDLCAweEJDLCAweDhELCAweEJDLCAweDhFLCAvKiAweDFDLTB4MUYgKi8KKwkweENCLCAweEQ4LCAweEJDLCAweDhGLCAweENCLCAweEY3LCAweEJDLCAweDkwLCAvKiAweDIwLTB4MjMgKi8KKwkweEJDLCAweDkxLCAweEJDLCAweDkyLCAweEJDLCAweDkzLCAweEJELCAweEY0LCAvKiAweDI0LTB4MjcgKi8KKwkweEJDLCAweDk0LCAweEJDLCAweDk1LCAweEJDLCAweDk2LCAweEQ3LCAweENGLCAvKiAweDI4LTB4MkIgKi8KKwkweEJDLCAweDk3LCAweEJDLCAweDk4LCAweEJDLCAweDk5LCAweEMwLCAweERCLCAvKiAweDJDLTB4MkYgKi8KKwkweEJDLCAweDlBLCAweEJDLCAweDlCLCAweEJDLCAweDlDLCAweEJDLCAweDlELCAvKiAweDMwLTB4MzMgKi8KKwkweEJDLCAweDlFLCAweEJDLCAweDlGLCAweEJDLCAweEEwLCAweEJELCAweDQwLCAvKiAweDM0LTB4MzcgKi8KKwkweEJELCAweDQxLCAweEJELCAweDQyLCAweEJELCAweDQzLCAweEJELCAweDQ0LCAvKiAweDM4LTB4M0IgKi8KKwkweEJELCAweDQ1LCAweEJELCAweDQ2LCAweEJELCAweDQ3LCAweEJELCAweDQ4LCAvKiAweDNDLTB4M0YgKi8KKwkweEJELCAweDQ5LCAweEJELCAweDRBLCAweEJELCAweDRCLCAweEJELCAweDRDLCAvKiAweDQwLTB4NDMgKi8KKwkweEJELCAweDRELCAweEJELCAweDRFLCAweEJELCAweDRGLCAweEJELCAweDUwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEJELCAweDUxLCAweEJELCAweDUyLCAweEJELCAweDUzLCAweEJELCAweDU0LCAvKiAweDQ4LTB4NEIgKi8KKwkweEJELCAweDU1LCAweEJELCAweDU2LCAweEJELCAweDU3LCAweEJELCAweDU4LCAvKiAweDRDLTB4NEYgKi8KKwkweEJELCAweDU5LCAweEJELCAweDVBLCAweEJELCAweDVCLCAweEJELCAweDVDLCAvKiAweDUwLTB4NTMgKi8KKwkweEJELCAweDVELCAweEJELCAweDVFLCAweEJELCAweDVGLCAweEJELCAweDYwLCAvKiAweDU0LTB4NTcgKi8KKwkweEJELCAweDYxLCAweEJELCAweDYyLCAweEJELCAweDYzLCAweEJELCAweDY0LCAvKiAweDU4LTB4NUIgKi8KKwkweEJELCAweDY1LCAweEJELCAweDY2LCAweEJELCAweDY3LCAweEJELCAweDY4LCAvKiAweDVDLTB4NUYgKi8KKwkweEJELCAweDY5LCAweEJELCAweDZBLCAweEJELCAweDZCLCAweEJELCAweDZDLCAvKiAweDYwLTB4NjMgKi8KKwkweEJELCAweDZELCAweEJELCAweDZFLCAweEJELCAweDZGLCAweEJELCAweDcwLCAvKiAweDY0LTB4NjcgKi8KKwkweEJELCAweDcxLCAweEJELCAweDcyLCAweEJELCAweDczLCAweEJELCAweDc0LCAvKiAweDY4LTB4NkIgKi8KKwkweEJELCAweDc1LCAweEJELCAweDc2LCAweEQwLCAweEY1LCAweEJELCAweDc3LCAvKiAweDZDLTB4NkYgKi8KKwkweEJELCAweDc4LCAweEJELCAweDc5LCAweEJELCAweDdBLCAweEJELCAweDdCLCAvKiAweDcwLTB4NzMgKi8KKwkweEJELCAweDdDLCAweEJELCAweDdELCAweEJELCAweDdFLCAweEY0LCAweEVBLCAvKiAweDc0LTB4NzcgKi8KKwkweEJELCAweDgwLCAweEJELCAweDgxLCAweEJELCAweDgyLCAweEJELCAweDgzLCAvKiAweDc4LTB4N0IgKi8KKwkweEJELCAweDg0LCAweEJELCAweDg1LCAweEJELCAweDg2LCAweEJELCAweDg3LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEJELCAweDg4LCAweEJELCAweDg5LCAweEJELCAweDhBLCAweEJELCAweDhCLCAvKiAweDgwLTB4ODMgKi8KKwkweEJELCAweDhDLCAweEJELCAweDhELCAweEJELCAweDhFLCAweEJELCAweDhGLCAvKiAweDg0LTB4ODcgKi8KKwkweEJELCAweDkwLCAweEJELCAweDkxLCAweEJELCAweDkyLCAweEJELCAweDkzLCAvKiAweDg4LTB4OEIgKi8KKwkweEJELCAweDk0LCAweEJELCAweDk1LCAweEJELCAweDk2LCAweEJELCAweDk3LCAvKiAweDhDLTB4OEYgKi8KKwkweEJELCAweDk4LCAweEJELCAweDk5LCAweEJELCAweDlBLCAweEJELCAweDlCLCAvKiAweDkwLTB4OTMgKi8KKwkweEJELCAweDlDLCAweEJELCAweDlELCAweEJELCAweDlFLCAweEJELCAweDlGLCAvKiAweDk0LTB4OTcgKi8KKwkweEJELCAweEEwLCAweEJFLCAweDQwLCAweEJFLCAweDQxLCAweEJFLCAweDQyLCAvKiAweDk4LTB4OUIgKi8KKwkweEJFLCAweDQzLCAweEJFLCAweDQ0LCAweEJFLCAweDQ1LCAweEJFLCAweDQ2LCAvKiAweDlDLTB4OUYgKi8KKwkweEJFLCAweDQ3LCAweEJFLCAweDQ4LCAweEJFLCAweDQ5LCAweEJFLCAweDRBLCAvKiAweEEwLTB4QTMgKi8KKwkweEJFLCAweDRCLCAweEJFLCAweDRDLCAweEY0LCAweEVCLCAweEJFLCAweDRELCAvKiAweEE0LTB4QTcgKi8KKwkweEJFLCAweDRFLCAweEJFLCAweDRGLCAweEJFLCAweDUwLCAweEJFLCAweDUxLCAvKiAweEE4LTB4QUIgKi8KKwkweEJFLCAweDUyLCAweEJFLCAweDUzLCAweEY0LCAweEVDLCAweEJFLCAweDU0LCAvKiAweEFDLTB4QUYgKi8KKwkweEJFLCAweDU1LCAweEJFLCAweDU2LCAweEJFLCAweDU3LCAweEJFLCAweDU4LCAvKiAweEIwLTB4QjMgKi8KKwkweEJFLCAweDU5LCAweEJFLCAweDVBLCAweEJFLCAweDVCLCAweEJFLCAweDVDLCAvKiAweEI0LTB4QjcgKi8KKwkweEJFLCAweDVELCAweEJFLCAweDVFLCAweEJFLCAweDVGLCAweEJFLCAweDYwLCAvKiAweEI4LTB4QkIgKi8KKwkweEJFLCAweDYxLCAweEJFLCAweDYyLCAweEJFLCAweDYzLCAweEJFLCAweDY0LCAvKiAweEJDLTB4QkYgKi8KKwkweEJFLCAweDY1LCAweEJFLCAweDY2LCAweEJFLCAweDY3LCAweEJFLCAweDY4LCAvKiAweEMwLTB4QzMgKi8KKwkweEJFLCAweDY5LCAweEJFLCAweDZBLCAweEJFLCAweDZCLCAweEJFLCAweDZDLCAvKiAweEM0LTB4QzcgKi8KKwkweEJFLCAweDZELCAweEJFLCAweDZFLCAweEJFLCAweDZGLCAweEJFLCAweDcwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEJFLCAweDcxLCAweEJFLCAweDcyLCAweEJFLCAweDczLCAweEJFLCAweDc0LCAvKiAweENDLTB4Q0YgKi8KKwkweEJFLCAweDc1LCAweEJFLCAweDc2LCAweEJFLCAweDc3LCAweEJFLCAweDc4LCAvKiAweEQwLTB4RDMgKi8KKwkweEJFLCAweDc5LCAweEJFLCAweDdBLCAweEJFLCAweDdCLCAweEJFLCAweDdDLCAvKiAweEQ0LTB4RDcgKi8KKwkweEJFLCAweDdELCAweEJFLCAweDdFLCAweEJFLCAweDgwLCAweEJFLCAweDgxLCAvKiAweEQ4LTB4REIgKi8KKwkweEJFLCAweDgyLCAweEJFLCAweDgzLCAweEJFLCAweDg0LCAweEJFLCAweDg1LCAvKiAweERDLTB4REYgKi8KKwkweEJFLCAweDg2LCAweEJFLCAweDg3LCAweEJFLCAweDg4LCAweEJFLCAweDg5LCAvKiAweEUwLTB4RTMgKi8KKwkweEJFLCAweDhBLCAweEJFLCAweDhCLCAweEJFLCAweDhDLCAweEJFLCAweDhELCAvKiAweEU0LTB4RTcgKi8KKwkweEJFLCAweDhFLCAweEJFLCAweDhGLCAweEJFLCAweDkwLCAweEJFLCAweDkxLCAvKiAweEU4LTB4RUIgKi8KKwkweEJFLCAweDkyLCAweEJFLCAweDkzLCAweEJFLCAweDk0LCAweEJFLCAweDk1LCAvKiAweEVDLTB4RUYgKi8KKwkweEJFLCAweDk2LCAweEJFLCAweDk3LCAweEJFLCAweDk4LCAweEJFLCAweDk5LCAvKiAweEYwLTB4RjMgKi8KKwkweEJFLCAweDlBLCAweEJFLCAweDlCLCAweEJFLCAweDlDLCAweEJFLCAweDlELCAvKiAweEY0LTB4RjcgKi8KKwkweEJFLCAweDlFLCAweEJFLCAweDlGLCAweEJFLCAweEEwLCAweEJGLCAweDQwLCAvKiAweEY4LTB4RkIgKi8KKwkweEJGLCAweDQxLCAweEJGLCAweDQyLCAweEJGLCAweDQzLCAweEJGLCAweDQ0LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183RVs1MTJdID0geworCTB4QkYsIDB4NDUsIDB4QkYsIDB4NDYsIDB4QkYsIDB4NDcsIDB4QkYsIDB4NDgsIC8qIDB4MDAtMHgwMyAqLworCTB4QkYsIDB4NDksIDB4QkYsIDB4NEEsIDB4QkYsIDB4NEIsIDB4QkYsIDB4NEMsIC8qIDB4MDQtMHgwNyAqLworCTB4QkYsIDB4NEQsIDB4QkYsIDB4NEUsIDB4QkYsIDB4NEYsIDB4QkYsIDB4NTAsIC8qIDB4MDgtMHgwQiAqLworCTB4QkYsIDB4NTEsIDB4QkYsIDB4NTIsIDB4QkYsIDB4NTMsIDB4QkYsIDB4NTQsIC8qIDB4MEMtMHgwRiAqLworCTB4QkYsIDB4NTUsIDB4QkYsIDB4NTYsIDB4QkYsIDB4NTcsIDB4QkYsIDB4NTgsIC8qIDB4MTAtMHgxMyAqLworCTB4QkYsIDB4NTksIDB4QkYsIDB4NUEsIDB4QkYsIDB4NUIsIDB4QkYsIDB4NUMsIC8qIDB4MTQtMHgxNyAqLworCTB4QkYsIDB4NUQsIDB4QkYsIDB4NUUsIDB4QkYsIDB4NUYsIDB4QkYsIDB4NjAsIC8qIDB4MTgtMHgxQiAqLworCTB4QkYsIDB4NjEsIDB4QkYsIDB4NjIsIDB4QkYsIDB4NjMsIDB4QkYsIDB4NjQsIC8qIDB4MUMtMHgxRiAqLworCTB4QkYsIDB4NjUsIDB4QkYsIDB4NjYsIDB4QkYsIDB4NjcsIDB4QkYsIDB4NjgsIC8qIDB4MjAtMHgyMyAqLworCTB4QkYsIDB4NjksIDB4QkYsIDB4NkEsIDB4QkYsIDB4NkIsIDB4QkYsIDB4NkMsIC8qIDB4MjQtMHgyNyAqLworCTB4QkYsIDB4NkQsIDB4QkYsIDB4NkUsIDB4QkYsIDB4NkYsIDB4QkYsIDB4NzAsIC8qIDB4MjgtMHgyQiAqLworCTB4QkYsIDB4NzEsIDB4QkYsIDB4NzIsIDB4QkYsIDB4NzMsIDB4QkYsIDB4NzQsIC8qIDB4MkMtMHgyRiAqLworCTB4QkYsIDB4NzUsIDB4QkYsIDB4NzYsIDB4QkYsIDB4NzcsIDB4QkYsIDB4NzgsIC8qIDB4MzAtMHgzMyAqLworCTB4QkYsIDB4NzksIDB4QkYsIDB4N0EsIDB4QkYsIDB4N0IsIDB4QkYsIDB4N0MsIC8qIDB4MzQtMHgzNyAqLworCTB4QkYsIDB4N0QsIDB4QkYsIDB4N0UsIDB4QkYsIDB4ODAsIDB4RjcsIDB4RTMsIC8qIDB4MzgtMHgzQiAqLworCTB4QkYsIDB4ODEsIDB4QkYsIDB4ODIsIDB4QkYsIDB4ODMsIDB4QkYsIDB4ODQsIC8qIDB4M0MtMHgzRiAqLworCTB4QkYsIDB4ODUsIDB4QjcsIDB4QjEsIDB4QkYsIDB4ODYsIDB4QkYsIDB4ODcsIC8qIDB4NDAtMHg0MyAqLworCTB4QkYsIDB4ODgsIDB4QkYsIDB4ODksIDB4QkYsIDB4OEEsIDB4RjQsIDB4RUQsIC8qIDB4NDQtMHg0NyAqLworCTB4QkYsIDB4OEIsIDB4QkYsIDB4OEMsIDB4QkYsIDB4OEQsIDB4QkYsIDB4OEUsIC8qIDB4NDgtMHg0QiAqLworCTB4QkYsIDB4OEYsIDB4QkYsIDB4OTAsIDB4QkYsIDB4OTEsIDB4QkYsIDB4OTIsIC8qIDB4NEMtMHg0RiAqLworCTB4QkYsIDB4OTMsIDB4QkYsIDB4OTQsIDB4QkYsIDB4OTUsIDB4QkYsIDB4OTYsIC8qIDB4NTAtMHg1MyAqLworCTB4QkYsIDB4OTcsIDB4QkYsIDB4OTgsIDB4QkYsIDB4OTksIDB4QkYsIDB4OUEsIC8qIDB4NTQtMHg1NyAqLworCTB4QkYsIDB4OUIsIDB4QkYsIDB4OUMsIDB4QkYsIDB4OUQsIDB4QkYsIDB4OUUsIC8qIDB4NTgtMHg1QiAqLworCTB4QkYsIDB4OUYsIDB4QkYsIDB4QTAsIDB4QzAsIDB4NDAsIDB4QzAsIDB4NDEsIC8qIDB4NUMtMHg1RiAqLworCTB4QzAsIDB4NDIsIDB4QzAsIDB4NDMsIDB4QzAsIDB4NDQsIDB4QzAsIDB4NDUsIC8qIDB4NjAtMHg2MyAqLworCTB4QzAsIDB4NDYsIDB4QzAsIDB4NDcsIDB4QzAsIDB4NDgsIDB4QzAsIDB4NDksIC8qIDB4NjQtMHg2NyAqLworCTB4QzAsIDB4NEEsIDB4QzAsIDB4NEIsIDB4QzAsIDB4NEMsIDB4QzAsIDB4NEQsIC8qIDB4NjgtMHg2QiAqLworCTB4QzAsIDB4NEUsIDB4QzAsIDB4NEYsIDB4QzAsIDB4NTAsIDB4QzAsIDB4NTEsIC8qIDB4NkMtMHg2RiAqLworCTB4QzAsIDB4NTIsIDB4QzAsIDB4NTMsIDB4QzAsIDB4NTQsIDB4QzAsIDB4NTUsIC8qIDB4NzAtMHg3MyAqLworCTB4QzAsIDB4NTYsIDB4QzAsIDB4NTcsIDB4QzAsIDB4NTgsIDB4QzAsIDB4NTksIC8qIDB4NzQtMHg3NyAqLworCTB4QzAsIDB4NUEsIDB4QzAsIDB4NUIsIDB4QzAsIDB4NUMsIDB4QzAsIDB4NUQsIC8qIDB4NzgtMHg3QiAqLworCTB4QzAsIDB4NUUsIDB4QzAsIDB4NUYsIDB4QzAsIDB4NjAsIDB4QzAsIDB4NjEsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QzAsIDB4NjIsIDB4QzAsIDB4NjMsIDB4RDcsIDB4RUIsIDB4QzAsIDB4NjQsIC8qIDB4ODAtMHg4MyAqLworCTB4QzAsIDB4NjUsIDB4QzAsIDB4NjYsIDB4QzAsIDB4NjcsIDB4QzAsIDB4NjgsIC8qIDB4ODQtMHg4NyAqLworCTB4QzAsIDB4NjksIDB4QzAsIDB4NkEsIDB4QzAsIDB4NkIsIDB4QzAsIDB4NkMsIC8qIDB4ODgtMHg4QiAqLworCTB4QzAsIDB4NkQsIDB4QzAsIDB4NkUsIDB4QzAsIDB4NkYsIDB4QzAsIDB4NzAsIC8qIDB4OEMtMHg4RiAqLworCTB4QzAsIDB4NzEsIDB4QzAsIDB4NzIsIDB4QzAsIDB4NzMsIDB4QzAsIDB4NzQsIC8qIDB4OTAtMHg5MyAqLworCTB4QzAsIDB4NzUsIDB4QzAsIDB4NzYsIDB4QzAsIDB4NzcsIDB4QzAsIDB4NzgsIC8qIDB4OTQtMHg5NyAqLworCTB4QzAsIDB4NzksIDB4QzAsIDB4N0EsIDB4QzAsIDB4N0IsIDB4RjQsIDB4RUUsIC8qIDB4OTgtMHg5QiAqLworCTB4QzAsIDB4N0MsIDB4QzAsIDB4N0QsIDB4QzAsIDB4N0UsIDB4RTYsIDB4RjksIC8qIDB4OUMtMHg5RiAqLworCTB4QkUsIDB4QzAsIDB4RTYsIDB4RkEsIDB4QkEsIDB4RUMsIDB4RTYsIDB4RkIsIC8qIDB4QTAtMHhBMyAqLworCTB4Q0YsIDB4Q0IsIDB4RTYsIDB4RkMsIDB4RDQsIDB4QkMsIDB4QkMsIDB4QjYsIC8qIDB4QTQtMHhBNyAqLworCTB4RTYsIDB4RkQsIDB4RTYsIDB4RkUsIDB4QkMsIDB4Q0QsIDB4QzgsIDB4RDIsIC8qIDB4QTgtMHhBQiAqLworCTB4Q0UsIDB4QjMsIDB4RTcsIDB4QTEsIDB4QzAsIDB4ODAsIDB4QjQsIDB4QkYsIC8qIDB4QUMtMHhBRiAqLworCTB4RTcsIDB4QTIsIDB4QzksIDB4QjQsIDB4QjgsIDB4RDksIDB4QzQsIDB4QzksIC8qIDB4QjAtMHhCMyAqLworCTB4QzAsIDB4ODEsIDB4RDcsIDB4REQsIDB4QzIsIDB4REEsIDB4QjcsIDB4RDcsIC8qIDB4QjQtMHhCNyAqLworCTB4RDYsIDB4QkQsIDB4Q0UsIDB4QzYsIDB4QjcsIDB4QzQsIDB4QzAsIDB4ODIsIC8qIDB4QjgtMHhCQiAqLworCTB4QzAsIDB4ODMsIDB4QzUsIDB4QTYsIDB4RTcsIDB4QTMsIDB4Q0YsIDB4REYsIC8qIDB4QkMtMHhCRiAqLworCTB4RTcsIDB4QTQsIDB4RTcsIDB4QTUsIDB4RTcsIDB4QTYsIDB4QzEsIDB4QjcsIC8qIDB4QzAtMHhDMyAqLworCTB4RDcsIDB4RTksIDB4QzksIDB4RjAsIDB4Q0YsIDB4QjgsIDB4RDYsIDB4QUYsIC8qIDB4QzQtMHhDNyAqLworCTB4RDYsIDB4RDUsIDB4RTcsIDB4QTcsIDB4QjAsIDB4RUQsIDB4RTcsIDB4QTgsIC8qIDB4QzgtMHhDQiAqLworCTB4RTcsIDB4QTksIDB4QzksIDB4REMsIDB4RDIsIDB4RUYsIDB4QkUsIDB4QUQsIC8qIDB4Q0MtMHhDRiAqLworCTB4RTcsIDB4QUEsIDB4QjAsIDB4RjMsIDB4QzgsIDB4REUsIDB4QkQsIDB4RTEsIC8qIDB4RDAtMHhEMyAqLworCTB4RTcsIDB4QUIsIDB4QzgsIDB4QzYsIDB4QzAsIDB4ODQsIDB4RTcsIDB4QUMsIC8qIDB4RDQtMHhENyAqLworCTB4QkIsIDB4RTYsIDB4QjgsIDB4RjgsIDB4RDEsIDB4QTQsIDB4RTcsIDB4QUQsIC8qIDB4RDgtMHhEQiAqLworCTB4QzIsIDB4RTcsIDB4QkUsIDB4RjgsIDB4QkQsIDB4Q0EsIDB4Q0QsIDB4QjMsIC8qIDB4REMtMHhERiAqLworCTB4RTcsIDB4QUUsIDB4RTcsIDB4QUYsIDB4QkUsIDB4RUUsIDB4RDAsIDB4RTUsIC8qIDB4RTAtMHhFMyAqLworCTB4QzAsIDB4ODUsIDB4Q0IsIDB4RTcsIDB4Q0MsIDB4RDAsIDB4QkMsIDB4Q0MsIC8qIDB4RTQtMHhFNyAqLworCTB4RTcsIDB4QjAsIDB4QkMsIDB4QTgsIDB4RDAsIDB4RjcsIDB4RTcsIDB4QjEsIC8qIDB4RTgtMHhFQiAqLworCTB4QzAsIDB4ODYsIDB4RDAsIDB4RjgsIDB4RTcsIDB4QjIsIDB4RTcsIDB4QjMsIC8qIDB4RUMtMHhFRiAqLworCTB4QjQsIDB4QzIsIDB4RTcsIDB4QjQsIDB4RTcsIDB4QjUsIDB4QzksIDB4RkUsIC8qIDB4RjAtMHhGMyAqLworCTB4Q0UsIDB4QUMsIDB4QzMsIDB4RTAsIDB4RTcsIDB4QjcsIDB4QjEsIDB4QzEsIC8qIDB4RjQtMHhGNyAqLworCTB4QjMsIDB4RjEsIDB4QzAsIDB4ODcsIDB4RTcsIDB4QjgsIDB4RTcsIDB4QjksIC8qIDB4RjgtMHhGQiAqLworCTB4RDcsIDB4REIsIDB4RDUsIDB4QzAsIDB4RTcsIDB4QkEsIDB4QzIsIDB4Q0MsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzdGWzUxMl0gPSB7CisJMHhENywgMHhCQSwgMHhFNywgMHhCQiwgMHhFNywgMHhCQywgMHhFNywgMHhCRCwgLyogMHgwMC0weDAzICovCisJMHhCQywgMHhFQSwgMHhDMywgMHhFNSwgMHhDMCwgMHhDMiwgMHhFNywgMHhCRSwgLyogMHgwNC0weDA3ICovCisJMHhFNywgMHhCRiwgMHhCQywgMHhBOSwgMHhDMCwgMHg4OCwgMHhFNywgMHhDMCwgLyogMHgwOC0weDBCICovCisJMHhFNywgMHhDMSwgMHhFNywgMHhCNiwgMHhCNiwgMHhEMCwgMHhFNywgMHhDMiwgLyogMHgwQy0weDBGICovCisJMHhDMCwgMHg4OSwgMHhFNywgMHhDMywgMHhFNywgMHhDNCwgMHhCQiwgMHhCQSwgLyogMHgxMC0weDEzICovCisJMHhCNSwgMHhERSwgMHhDMiwgMHhDNiwgMHhCMSwgMHhFMCwgMHhFNywgMHhDNSwgLyogMHgxNC0weDE3ICovCisJMHhENCwgMHhCNSwgMHhFNywgMHhDNiwgMHhCOCwgMHhCRiwgMHhFNywgMHhDOCwgLyogMHgxOC0weDFCICovCisJMHhFNywgMHhDNywgMHhCNywgMHhFQywgMHhDMCwgMHg4QSwgMHhFNywgMHhDOSwgLyogMHgxQy0weDFGICovCisJMHhCMiwgMHhGOCwgMHhFNywgMHhDQSwgMHhFNywgMHhDQiwgMHhFNywgMHhDQywgLyogMHgyMC0weDIzICovCisJMHhFNywgMHhDRCwgMHhFNywgMHhDRSwgMHhFNywgMHhDRiwgMHhFNywgMHhEMCwgLyogMHgyNC0weDI3ICovCisJMHhEMywgMHhBNywgMHhDQiwgMHhGNSwgMHhFNywgMHhEMSwgMHhFNywgMHhEMiwgLyogMHgyOC0weDJCICovCisJMHhFNywgMHhEMywgMHhFNywgMHhENCwgMHhDOSwgMHhDOSwgMHhFNywgMHhENSwgLyogMHgyQy0weDJGICovCisJMHhFNywgMHhENiwgMHhFNywgMHhENywgMHhFNywgMHhEOCwgMHhFNywgMHhEOSwgLyogMHgzMC0weDMzICovCisJMHhCRCwgMHhDOSwgMHhFNywgMHhEQSwgMHhGMywgMHhCRSwgMHhDMCwgMHg4QiwgLyogMHgzNC0weDM3ICovCisJMHhCOCwgMHhENywgMHhDMCwgMHg4QywgMHhDOCwgMHhCMSwgMHhDMCwgMHg4RCwgLyogMHgzOC0weDNCICovCisJMHhDMCwgMHg4RSwgMHhDMCwgMHg4RiwgMHhDMCwgMHg5MCwgMHhDMCwgMHg5MSwgLyogMHgzQy0weDNGICovCisJMHhDMCwgMHg5MiwgMHhDMCwgMHg5MywgMHhGMywgMHhCRiwgMHhDMCwgMHg5NCwgLyogMHg0MC0weDQzICovCisJMHhGMywgMHhDMCwgMHhGMywgMHhDMSwgMHhDMCwgMHg5NSwgMHhDMCwgMHg5NiwgLyogMHg0NC0weDQ3ICovCisJMHhDMCwgMHg5NywgMHhDMCwgMHg5OCwgMHhDMCwgMHg5OSwgMHhDMCwgMHg5QSwgLyogMHg0OC0weDRCICovCisJMHhDMCwgMHg5QiwgMHhDMCwgMHg5QywgMHhDMCwgMHg5RCwgMHhDMCwgMHg5RSwgLyogMHg0Qy0weDRGICovCisJMHhCOSwgMHhERSwgMHhDRCwgMHhGOCwgMHhDMCwgMHg5RiwgMHhDMCwgMHhBMCwgLyogMHg1MC0weDUzICovCisJMHhEOCwgMHhFOCwgMHhCQSwgMHhCMSwgMHhDMSwgMHg0MCwgMHhDMiwgMHhERSwgLyogMHg1NC0weDU3ICovCisJMHhFRSwgMHhCNywgMHhDMSwgMHg0MSwgMHhCNywgMHhBMywgMHhDMSwgMHg0MiwgLyogMHg1OC0weDVCICovCisJMHhDMSwgMHg0MywgMHhDMSwgMHg0NCwgMHhDMSwgMHg0NSwgMHhFRSwgMHhCOSwgLyogMHg1Qy0weDVGICovCisJMHhDMSwgMHg0NiwgMHhFRSwgMHhCOCwgMHhCMCwgMHhENSwgMHhDMSwgMHg0NywgLyogMHg2MC0weDYzICovCisJMHhDMSwgMHg0OCwgMHhDMSwgMHg0OSwgMHhDMSwgMHg0QSwgMHhDMSwgMHg0QiwgLyogMHg2NC0weDY3ICovCisJMHhFRSwgMHhCQiwgMHhENSwgMHhENiwgMHhENywgMHhFRiwgMHhDMSwgMHg0QywgLyogMHg2OC0weDZCICovCisJMHhDMSwgMHg0RCwgMHhDMSwgMHg0RSwgMHhENiwgMHhDMywgMHhDMSwgMHg0RiwgLyogMHg2Qy0weDZGICovCisJMHhDMSwgMHg1MCwgMHhFRSwgMHhCRCwgMHhDQSwgMHhGMCwgMHhDMSwgMHg1MSwgLyogMHg3MC0weDczICovCisJMHhFRSwgMHhCQywgMHhDMSwgMHg1MiwgMHhDMSwgMHg1MywgMHhDMSwgMHg1NCwgLyogMHg3NC0weDc3ICovCisJMHhDMSwgMHg1NSwgMHhFRSwgMHhCRSwgMHhDMSwgMHg1NiwgMHhDMSwgMHg1NywgLyogMHg3OC0weDdCICovCisJMHhDMSwgMHg1OCwgMHhDMSwgMHg1OSwgMHhFRSwgMHhDMCwgMHhDMSwgMHg1QSwgLyogMHg3Qy0weDdGICovCisJCisJMHhDMSwgMHg1QiwgMHhFRSwgMHhCRiwgMHhDMSwgMHg1QywgMHhDMSwgMHg1RCwgLyogMHg4MC0weDgzICovCisJMHhDMSwgMHg1RSwgMHhDMSwgMHg1RiwgMHhDMSwgMHg2MCwgMHhDMSwgMHg2MSwgLyogMHg4NC0weDg3ICovCisJMHhDMSwgMHg2MiwgMHhDMSwgMHg2MywgMHhEMSwgMHhGMiwgMHhDMSwgMHg2NCwgLyogMHg4OC0weDhCICovCisJMHhDNywgMHhCQywgMHhDMSwgMHg2NSwgMHhDMywgMHhDMCwgMHhDMSwgMHg2NiwgLyogMHg4Qy0weDhGICovCisJMHhDMSwgMHg2NywgMHhDMSwgMHg2OCwgMHhDMSwgMHg2OSwgMHhDMSwgMHg2QSwgLyogMHg5MC0weDkzICovCisJMHhCOCwgMHhFMSwgMHhDMSwgMHg2QiwgMHhDMSwgMHg2QywgMHhDMSwgMHg2RCwgLyogMHg5NC0weDk3ICovCisJMHhDMSwgMHg2RSwgMHhDMSwgMHg2RiwgMHhDMSwgMHhFNywgMHhDMSwgMHg3MCwgLyogMHg5OC0weDlCICovCisJMHhDMSwgMHg3MSwgMHhGNCwgMHhDNiwgMHhEMCwgMHhERiwgMHhGNCwgMHhDNywgLyogMHg5Qy0weDlGICovCisJMHhDMSwgMHg3MiwgMHhDRiwgMHhEQiwgMHhDMSwgMHg3MywgMHhDMSwgMHg3NCwgLyogMHhBMC0weEEzICovCisJMHhDOCwgMHhCQSwgMHhDMSwgMHg3NSwgMHhDMSwgMHg3NiwgMHhGNCwgMHhDOCwgLyogMHhBNC0weEE3ICovCisJMHhDMSwgMHg3NywgMHhDMSwgMHg3OCwgMHhDMSwgMHg3OSwgMHhDMSwgMHg3QSwgLyogMHhBOC0weEFCICovCisJMHhDMSwgMHg3QiwgMHhDMSwgMHg3QywgMHhDMSwgMHg3RCwgMHhGNCwgMHhDOSwgLyogMHhBQy0weEFGICovCisJMHhGNCwgMHhDQSwgMHhDMSwgMHg3RSwgMHhGNCwgMHhDQiwgMHhDMSwgMHg4MCwgLyogMHhCMC0weEIzICovCisJMHhDMSwgMHg4MSwgMHhDMSwgMHg4MiwgMHhDMSwgMHg4MywgMHhDMSwgMHg4NCwgLyogMHhCNC0weEI3ICovCisJMHhEOSwgMHhGQSwgMHhCOCwgMHhGRSwgMHhDMSwgMHg4NSwgMHhDMSwgMHg4NiwgLyogMHhCOC0weEJCICovCisJMHhFNSwgMHhGMSwgMHhEMywgMHhGMCwgMHhDMSwgMHg4NywgMHhGNCwgMHhFMCwgLyogMHhCQy0weEJGICovCisJMHhDMSwgMHg4OCwgMHhDRSwgMHhDQywgMHhDMSwgMHg4OSwgMHhDMSwgMHg4QSwgLyogMHhDMC0weEMzICovCisJMHhDMSwgMHg4QiwgMHhCMywgMHhFMSwgMHhDMSwgMHg4QywgMHhDMSwgMHg4RCwgLyogMHhDNC0weEM3ICovCisJMHhDMSwgMHg4RSwgMHhDMSwgMHg4RiwgMHhGMSwgMHhCNCwgMHhDMSwgMHg5MCwgLyogMHhDOC0weENCICovCisJMHhEMiwgMHhFRSwgMHhDMSwgMHg5MSwgMHhGNCwgMHhFMSwgMHhDMSwgMHg5MiwgLyogMHhDQy0weENGICovCisJMHhDMSwgMHg5MywgMHhDMSwgMHg5NCwgMHhDMSwgMHg5NSwgMHhDMSwgMHg5NiwgLyogMHhEMC0weEQzICovCisJMHhDRiwgMHhFOCwgMHhGNCwgMHhFMiwgMHhDMSwgMHg5NywgMHhDMSwgMHg5OCwgLyogMHhENC0weEQ3ICovCisJMHhDNywgMHhDQywgMHhDMSwgMHg5OSwgMHhDMSwgMHg5QSwgMHhDMSwgMHg5QiwgLyogMHhEOC0weERCICovCisJMHhDMSwgMHg5QywgMHhDMSwgMHg5RCwgMHhDMSwgMHg5RSwgMHhCNSwgMHhENCwgLyogMHhEQy0weERGICovCisJMHhCNCwgMHhFNCwgMHhGNCwgMHhFNCwgMHhDMSwgMHg5RiwgMHhDMSwgMHhBMCwgLyogMHhFMC0weEUzICovCisJMHhDMiwgMHg0MCwgMHhGNCwgMHhFMywgMHhGNCwgMHhFNSwgMHhDMiwgMHg0MSwgLyogMHhFNC0weEU3ICovCisJMHhDMiwgMHg0MiwgMHhGNCwgMHhFNiwgMHhDMiwgMHg0MywgMHhDMiwgMHg0NCwgLyogMHhFOC0weEVCICovCisJMHhDMiwgMHg0NSwgMHhDMiwgMHg0NiwgMHhGNCwgMHhFNywgMHhDMiwgMHg0NywgLyogMHhFQy0weEVGICovCisJMHhCQSwgMHhCMiwgMHhCMCwgMHhCRiwgMHhDMiwgMHg0OCwgMHhGNCwgMHhFOCwgLyogMHhGMC0weEYzICovCisJMHhDMiwgMHg0OSwgMHhDMiwgMHg0QSwgMHhDMiwgMHg0QiwgMHhDMiwgMHg0QywgLyogMHhGNC0weEY3ICovCisJMHhDMiwgMHg0RCwgMHhDMiwgMHg0RSwgMHhDMiwgMHg0RiwgMHhCNywgMHhBRCwgLyogMHhGOC0weEZCICovCisJMHhEMiwgMHhFRCwgMHhDMiwgMHg1MCwgMHhDMiwgMHg1MSwgMHhDMiwgMHg1MiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODBbNTEyXSA9IHsKKwkweEQyLCAweEFCLCAweEMwLCAweENGLCAweEMyLCAweDUzLCAweEJGLCAweEJDLCAvKiAweDAwLTB4MDMgKi8KKwkweEVCLCAweEEzLCAweEQ1LCAweERGLCAweEVBLCAweEM4LCAweEMyLCAweDU0LCAvKiAweDA0LTB4MDcgKi8KKwkweEMyLCAweDU1LCAweEMyLCAweDU2LCAweEMyLCAweDU3LCAweEYxLCAweEYzLCAvKiAweDA4LTB4MEIgKi8KKwkweEI2LCAweEY4LCAweENCLCAweEEzLCAweEMyLCAweDU4LCAweEMyLCAweDU5LCAvKiAweDBDLTB4MEYgKi8KKwkweEM0LCAweENELCAweEMyLCAweDVBLCAweEYxLCAweEU3LCAweEMyLCAweDVCLCAvKiAweDEwLTB4MTMgKi8KKwkweEYxLCAweEU4LCAweEI4LCAweEZCLCAweEYxLCAweEU5LCAweEJBLCAweEM0LCAvKiAweDE0LTB4MTcgKi8KKwkweEQ0LCAweEM1LCAweEIwLCAweEQyLCAweEMyLCAweDVDLCAweEMyLCAweDVELCAvKiAweDE4LTB4MUIgKi8KKwkweEYxLCAweEVBLCAweEMyLCAweDVFLCAweEMyLCAweDVGLCAweEMyLCAweDYwLCAvKiAweDFDLTB4MUYgKi8KKwkweEYxLCAweEVCLCAweEMyLCAweDYxLCAweEYxLCAweEVDLCAweEMyLCAweDYyLCAvKiAweDIwLTB4MjMgKi8KKwkweEMyLCAweDYzLCAweEYxLCAweEVELCAweEYxLCAweEVFLCAweEYxLCAweEVGLCAvKiAweDI0LTB4MjcgKi8KKwkweEYxLCAweEYxLCAweEYxLCAweEYwLCAweEM1LCAweEQ1LCAweEMyLCAweDY0LCAvKiAweDI4LTB4MkIgKi8KKwkweEMyLCAweDY1LCAweEMyLCAweDY2LCAweEMyLCAweDY3LCAweEMyLCAweDY4LCAvKiAweDJDLTB4MkYgKi8KKwkweEMyLCAweDY5LCAweEYxLCAweEYyLCAweEMyLCAweDZBLCAweEI2LCAweEZBLCAvKiAweDMwLTB4MzMgKi8KKwkweEMyLCAweDZCLCAweEYxLCAweEY0LCAweEQyLCAweEFFLCAweERFLCAweEM3LCAvKiAweDM0LTB4MzcgKi8KKwkweENCLCAweENBLCAweEMyLCAweDZDLCAweEMyLCAweDZELCAweEIzLCAweERDLCAvKiAweDM4LTB4M0IgKi8KKwkweEMyLCAweDZFLCAweEI1LCAweEEyLCAweEMyLCAweDZGLCAweEI5LCAweEEyLCAvKiAweDNDLTB4M0YgKi8KKwkweEMyLCAweDcwLCAweEMyLCAweDcxLCAweEM0LCAweEY0LCAweEYxLCAweEY1LCAvKiAweDQwLTB4NDMgKi8KKwkweEMyLCAweDcyLCAweEMyLCAweDczLCAweEYxLCAweEY2LCAweEMyLCAweDc0LCAvKiAweDQ0LTB4NDcgKi8KKwkweEMyLCAweDc1LCAweEMyLCAweDc2LCAweEMxLCAweEM0LCAweEMxLCAweEZCLCAvKiAweDQ4LTB4NEIgKi8KKwkweEQ2LCAweEIwLCAweEYxLCAweEY3LCAweEMyLCAweDc3LCAweEMyLCAweDc4LCAvKiAweDRDLTB4NEYgKi8KKwkweEMyLCAweDc5LCAweEMyLCAweDdBLCAweEYxLCAweEY4LCAweEMyLCAweDdCLCAvKiAweDUwLTB4NTMgKi8KKwkweEMxLCAweEFBLCAweEMyLCAweDdDLCAweEMyLCAweDdELCAweEMyLCAweDdFLCAvKiAweDU0LTB4NTcgKi8KKwkweEM2LCAweEI4LCAweEMyLCAweDgwLCAweEJFLCAweERCLCAweEMyLCAweDgxLCAvKiAweDU4LTB4NUIgKi8KKwkweEMyLCAweDgyLCAweEMyLCAweDgzLCAweEMyLCAweDg0LCAweEMyLCAweDg1LCAvKiAweDVDLTB4NUYgKi8KKwkweEMyLCAweDg2LCAweEMyLCAweDg3LCAweEMyLCAweDg4LCAweEMyLCAweDg5LCAvKiAweDYwLTB4NjMgKi8KKwkweEMyLCAweDhBLCAweEMyLCAweDhCLCAweEMyLCAweDhDLCAweEMyLCAweDhELCAvKiAweDY0LTB4NjcgKi8KKwkweEMyLCAweDhFLCAweEYxLCAweEY5LCAweEI0LCAweENGLCAweEMyLCAweDhGLCAvKiAweDY4LTB4NkIgKi8KKwkweEMyLCAweDkwLCAweEMyLCAweDkxLCAweEMyLCAweDkyLCAweEMyLCAweDkzLCAvKiAweDZDLTB4NkYgKi8KKwkweEMyLCAweDk0LCAweEYxLCAweEZBLCAweEMyLCAweDk1LCAweEMyLCAweDk2LCAvKiAweDcwLTB4NzMgKi8KKwkweEMyLCAweDk3LCAweEMyLCAweDk4LCAweEMyLCAweDk5LCAweEMyLCAweDlBLCAvKiAweDc0LTB4NzcgKi8KKwkweEMyLCAweDlCLCAweEMyLCAweDlDLCAweEMyLCAweDlELCAweEMyLCAweDlFLCAvKiAweDc4LTB4N0IgKi8KKwkweEMyLCAweDlGLCAweEMyLCAweEEwLCAweEMzLCAweDQwLCAweEVELCAweEIyLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEVELCAweEIxLCAweEMzLCAweDQxLCAweEMzLCAweDQyLCAweENCLCAweEUwLCAvKiAweDgwLTB4ODMgKi8KKwkweEQyLCAweERFLCAweEMzLCAweDQzLCAweENCLCAweEMxLCAweEQ1LCAweEQ4LCAvKiAweDg0LTB4ODcgKi8KKwkweEMzLCAweDQ0LCAweEM4LCAweEUyLCAweEMzLCAweDQ1LCAweEMwLCAweERGLCAvKiAweDg4LTB4OEIgKi8KKwkweEJDLCAweEExLCAweEMzLCAweDQ2LCAweEMzLCAweDQ3LCAweEMzLCAweDQ4LCAvKiAweDhDLTB4OEYgKi8KKwkweEMzLCAweDQ5LCAweEMzLCAweDRBLCAweEMzLCAweDRCLCAweEVCLCAweEMxLCAvKiAweDkwLTB4OTMgKi8KKwkweEMzLCAweDRDLCAweEMzLCAweDRELCAweEQwLCAweEE0LCAweEMzLCAweDRFLCAvKiAweDk0LTB4OTcgKi8KKwkweEQ2LCAweEUyLCAweEMzLCAweDRGLCAweEI2LCAweEM3LCAweEI4LCAweEQ4LCAvKiAweDk4LTB4OUIgKi8KKwkweEVCLCAweEMwLCAweEI4LCAweENFLCAweEMzLCAweDUwLCAweEVCLCAweEJGLCAvKiAweDlDLTB4OUYgKi8KKwkweEIzLCAweEE2LCAweEI5LCAweEM5LCAweEQ2LCAweEFCLCAweEMzLCAweDUxLCAvKiAweEEwLTB4QTMgKi8KKwkweEI3LCAweEY0LCAweEI3LCAweENBLCAweEMzLCAweDUyLCAweEMzLCAweDUzLCAvKiAweEE0LTB4QTcgKi8KKwkweEMzLCAweDU0LCAweEJDLCAweEU3LCAweEI3LCAweEJFLCAweEVCLCAweEM2LCAvKiAweEE4LTB4QUIgKi8KKwkweEMzLCAweDU1LCAweEVCLCAweEM3LCAweEIwLCAweEI5LCAweEJGLCAweENGLCAvKiAweEFDLTB4QUYgKi8KKwkweEMzLCAweDU2LCAweEVCLCAweEM1LCAweEQzLCAweEZELCAweEMzLCAweDU3LCAvKiAweEIwLTB4QjMgKi8KKwkweEVCLCAweEM4LCAweEMzLCAweDU4LCAweEMzLCAweDU5LCAweEVCLCAweEM5LCAvKiAweEI0LTB4QjcgKi8KKwkweEMzLCAweDVBLCAweEMzLCAweDVCLCAweEI3LCAweENFLCAweEMzLCAweDVDLCAvKiAweEI4LTB4QkIgKi8KKwkweEVCLCAweEMyLCAweEVCLCAweEM0LCAweEM5LCAweEY2LCAweEQ2LCAweEQ3LCAvKiAweEJDLTB4QkYgKi8KKwkweEQ1LCAweENELCAweEQwLCAweEIyLCAweEVCLCAweENGLCAweENFLCAweEI4LCAvKiAweEMwLTB4QzMgKi8KKwkweEVCLCAweEQwLCAweEMzLCAweDVELCAweEI1LCAweEE4LCAweEMzLCAweDVFLCAvKiAweEM0LTB4QzcgKi8KKwkweEMzLCAweDVGLCAweEMzLCAweDYwLCAweEMzLCAweDYxLCAweEMzLCAweDYyLCAvKiAweEM4LTB4Q0IgKi8KKwkweEIxLCAweEIzLCAweEVCLCAweEQyLCAweENDLCAweEE1LCAweEMzLCAweDYzLCAvKiAweENDLTB4Q0YgKi8KKwkweEMzLCAweDY0LCAweEMzLCAweDY1LCAweEMzLCAweDY2LCAweEMzLCAweDY3LCAvKiAweEQwLTB4RDMgKi8KKwkweEMzLCAweDY4LCAweEMzLCAweDY5LCAweEM1LCAweEQ2LCAweEVCLCAweEQzLCAvKiAweEQ0LTB4RDcgKi8KKwkweEMzLCAweDZBLCAweEVCLCAweEQxLCAweEM1LCAweERGLCAweEVCLCAweENFLCAvKiAweEQ4LTB4REIgKi8KKwkweENBLCAweEE0LCAweEVCLCAweEQ1LCAweEIwLCAweEZCLCAweEMzLCAweDZCLCAvKiAweERDLTB4REYgKi8KKwkweEMzLCAweDZDLCAweEJBLCAweEZBLCAweEMzLCAweDZELCAweEMzLCAweDZFLCAvKiAweEUwLTB4RTMgKi8KKwkweEQ4LCAweEI3LCAweEYxLCAweEUzLCAweEMzLCAweDZGLCAweEVCLCAweENBLCAvKiAweEU0LTB4RTcgKi8KKwkweEVCLCAweENCLCAweEVCLCAweENDLCAweEVCLCAweENELCAweEVCLCAweEQ2LCAvKiAweEU4LTB4RUIgKi8KKwkweEU2LCAweEMwLCAweEVCLCAweEQ5LCAweEMzLCAweDcwLCAweEJGLCAweEU4LCAvKiAweEVDLTB4RUYgKi8KKwkweEQyLCAweEM4LCAweEVCLCAweEQ3LCAweEVCLCAweERDLCAweEI4LCAweEVDLCAvKiAweEYwLTB4RjMgKi8KKwkweEVCLCAweEQ4LCAweEMzLCAweDcxLCAweEJELCAweEJBLCAweEMzLCAweDcyLCAvKiAweEY0LTB4RjcgKi8KKwkweEQwLCAweEQ4LCAweEMzLCAweDczLCAweEIwLCAweEI3LCAweEMzLCAweDc0LCAvKiAweEY4LTB4RkIgKi8KKwkweEVCLCAweERELCAweEM0LCAweERDLCAweEMzLCAweDc1LCAweEMzLCAweDc2LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184MVs1MTJdID0geworCTB4QzMsIDB4NzcsIDB4QzMsIDB4NzgsIDB4RDYsIDB4QUMsIDB4QzMsIDB4NzksIC8qIDB4MDAtMHgwMyAqLworCTB4QzMsIDB4N0EsIDB4QzMsIDB4N0IsIDB4QjQsIDB4RTAsIDB4QzMsIDB4N0MsIC8qIDB4MDQtMHgwNyAqLworCTB4QzMsIDB4N0QsIDB4QzIsIDB4RjYsIDB4QkMsIDB4QjksIDB4QzMsIDB4N0UsIC8qIDB4MDgtMHgwQiAqLworCTB4QzMsIDB4ODAsIDB4RUIsIDB4REEsIDB4RUIsIDB4REIsIDB4RDQsIDB4RTAsIC8qIDB4MEMtMHgwRiAqLworCTB4QzYsIDB4RUEsIDB4QzQsIDB4RDQsIDB4RUIsIDB4REYsIDB4QzUsIDB4QTcsIC8qIDB4MTAtMHgxMyAqLworCTB4RDksIDB4RjUsIDB4QzMsIDB4ODEsIDB4QjIsIDB4QjEsIDB4QzMsIDB4ODIsIC8qIDB4MTQtMHgxNyAqLworCTB4RUIsIDB4RTQsIDB4QzMsIDB4ODMsIDB4QkQsIDB4QzUsIDB4QzMsIDB4ODQsIC8qIDB4MTgtMHgxQiAqLworCTB4QzMsIDB4ODUsIDB4QzMsIDB4ODYsIDB4RUIsIDB4RTIsIDB4QzMsIDB4ODcsIC8qIDB4MUMtMHgxRiAqLworCTB4QzMsIDB4ODgsIDB4QzMsIDB4ODksIDB4QzMsIDB4OEEsIDB4QzMsIDB4OEIsIC8qIDB4MjAtMHgyMyAqLworCTB4QzMsIDB4OEMsIDB4QzMsIDB4OEQsIDB4QzMsIDB4OEUsIDB4QzMsIDB4OEYsIC8qIDB4MjQtMHgyNyAqLworCTB4QzMsIDB4OTAsIDB4QzMsIDB4OTEsIDB4QzMsIDB4OTIsIDB4QzMsIDB4OTMsIC8qIDB4MjgtMHgyQiAqLworCTB4RUIsIDB4RTMsIDB4QzMsIDB4OTQsIDB4QzMsIDB4OTUsIDB4QjgsIDB4QUMsIC8qIDB4MkMtMHgyRiAqLworCTB4QzMsIDB4OTYsIDB4Q0QsIDB4RDEsIDB4RUIsIDB4RTUsIDB4QzMsIDB4OTcsIC8qIDB4MzAtMHgzMyAqLworCTB4QzMsIDB4OTgsIDB4QzMsIDB4OTksIDB4RUIsIDB4RTEsIDB4QzMsIDB4OUEsIC8qIDB4MzQtMHgzNyAqLworCTB4QzEsIDB4QjMsIDB4QzMsIDB4OUIsIDB4QzMsIDB4OUMsIDB4QzMsIDB4OUQsIC8qIDB4MzgtMHgzQiAqLworCTB4QzMsIDB4OUUsIDB4QzMsIDB4OUYsIDB4QzYsIDB4QTIsIDB4QzMsIDB4QTAsIC8qIDB4M0MtMHgzRiAqLworCTB4QzQsIDB4NDAsIDB4QzQsIDB4NDEsIDB4QzQsIDB4NDIsIDB4QzQsIDB4NDMsIC8qIDB4NDAtMHg0MyAqLworCTB4QzQsIDB4NDQsIDB4QzQsIDB4NDUsIDB4Q0MsIDB4RjMsIDB4QzQsIDB4NDYsIC8qIDB4NDQtMHg0NyAqLworCTB4RUIsIDB4RTYsIDB4QzQsIDB4NDcsIDB4QzAsIDB4QjAsIDB4RDIsIDB4QjgsIC8qIDB4NDgtMHg0QiAqLworCTB4RUIsIDB4RTcsIDB4QzQsIDB4NDgsIDB4QzQsIDB4NDksIDB4QzQsIDB4NEEsIC8qIDB4NEMtMHg0RiAqLworCTB4QjgsIDB4QUYsIDB4QjgsIDB4QUQsIDB4QzQsIDB4NEIsIDB4RUIsIDB4RTgsIC8qIDB4NTAtMHg1MyAqLworCTB4QzcsIDB4QkIsIDB4Q0QsIDB4RjMsIDB4QzQsIDB4NEMsIDB4QzQsIDB4NEQsIC8qIDB4NTQtMHg1NyAqLworCTB4QzQsIDB4NEUsIDB4RUIsIDB4RUEsIDB4RUIsIDB4RUIsIDB4QzQsIDB4NEYsIC8qIDB4NTgtMHg1QiAqLworCTB4QzQsIDB4NTAsIDB4QzQsIDB4NTEsIDB4QzQsIDB4NTIsIDB4QzQsIDB4NTMsIC8qIDB4NUMtMHg1RiAqLworCTB4RUIsIDB4RUQsIDB4QzQsIDB4NTQsIDB4QzQsIDB4NTUsIDB4QzQsIDB4NTYsIC8qIDB4NjAtMHg2MyAqLworCTB4QzQsIDB4NTcsIDB4RDAsIDB4QzgsIDB4QzQsIDB4NTgsIDB4RUIsIDB4RjIsIC8qIDB4NjQtMHg2NyAqLworCTB4QzQsIDB4NTksIDB4RUIsIDB4RUUsIDB4QzQsIDB4NUEsIDB4QzQsIDB4NUIsIC8qIDB4NjgtMHg2QiAqLworCTB4QzQsIDB4NUMsIDB4RUIsIDB4RjEsIDB4QzgsIDB4RjksIDB4QzQsIDB4NUQsIC8qIDB4NkMtMHg2RiAqLworCTB4RDEsIDB4RkMsIDB4RUIsIDB4RUMsIDB4QzQsIDB4NUUsIDB4QzQsIDB4NUYsIC8qIDB4NzAtMHg3MyAqLworCTB4RUIsIDB4RTksIDB4QzQsIDB4NjAsIDB4QzQsIDB4NjEsIDB4QzQsIDB4NjIsIC8qIDB4NzQtMHg3NyAqLworCTB4QzQsIDB4NjMsIDB4QjgsIDB4QjksIDB4Q0YsIDB4RDksIDB4QzQsIDB4RTUsIC8qIDB4NzgtMHg3QiAqLworCTB4RUIsIDB4RUYsIDB4RUIsIDB4RjAsIDB4Q0MsIDB4REEsIDB4Q0QsIDB4QzgsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QjAsIDB4RjIsIDB4QzQsIDB4NjQsIDB4RUIsIDB4RjYsIDB4QzQsIDB4NjUsIC8qIDB4ODAtMHg4MyAqLworCTB4QzQsIDB4NjYsIDB4QzQsIDB4NjcsIDB4QzQsIDB4NjgsIDB4QzQsIDB4NjksIC8qIDB4ODQtMHg4NyAqLworCTB4RUIsIDB4RjUsIDB4QzQsIDB4NkEsIDB4QjIsIDB4QjIsIDB4QzQsIDB4NkIsIC8qIDB4ODgtMHg4QiAqLworCTB4QzQsIDB4NkMsIDB4QzQsIDB4NkQsIDB4QzQsIDB4NkUsIDB4QjgsIDB4RTAsIC8qIDB4OEMtMHg4RiAqLworCTB4QzQsIDB4NkYsIDB4RUIsIDB4RjcsIDB4QzQsIDB4NzAsIDB4QzQsIDB4NzEsIC8qIDB4OTAtMHg5MyAqLworCTB4QzQsIDB4NzIsIDB4QzQsIDB4NzMsIDB4QzQsIDB4NzQsIDB4QzQsIDB4NzUsIC8qIDB4OTQtMHg5NyAqLworCTB4QjEsIDB4RUMsIDB4QzQsIDB4NzYsIDB4QzQsIDB4NzcsIDB4Q0MsIDB4QzUsIC8qIDB4OTgtMHg5QiAqLworCTB4QzQsIDB4QTQsIDB4Q0YsIDB4QTUsIDB4QzQsIDB4NzgsIDB4QzQsIDB4NzksIC8qIDB4OUMtMHg5RiAqLworCTB4QzQsIDB4N0EsIDB4QzQsIDB4N0IsIDB4QzQsIDB4N0MsIDB4RUIsIDB4RjksIC8qIDB4QTAtMHhBMyAqLworCTB4QzQsIDB4N0QsIDB4QzQsIDB4N0UsIDB4RUMsIDB4QTIsIDB4QzQsIDB4ODAsIC8qIDB4QTQtMHhBNyAqLworCTB4QzUsIDB4RjIsIDB4QzQsIDB4ODEsIDB4RUIsIDB4RkEsIDB4QzQsIDB4ODIsIC8qIDB4QTgtMHhBQiAqLworCTB4QzQsIDB4ODMsIDB4QzQsIDB4ODQsIDB4QzQsIDB4ODUsIDB4QzQsIDB4ODYsIC8qIDB4QUMtMHhBRiAqLworCTB4QzQsIDB4ODcsIDB4QzQsIDB4ODgsIDB4QzQsIDB4ODksIDB4QzksIDB4QzUsIC8qIDB4QjAtMHhCMyAqLworCTB4QzQsIDB4OEEsIDB4QzQsIDB4OEIsIDB4QzQsIDB4OEMsIDB4QzQsIDB4OEQsIC8qIDB4QjQtMHhCNyAqLworCTB4QzQsIDB4OEUsIDB4QzQsIDB4OEYsIDB4RTIsIDB4REYsIDB4RUIsIDB4RkUsIC8qIDB4QjgtMHhCQiAqLworCTB4QzQsIDB4OTAsIDB4QzQsIDB4OTEsIDB4QzQsIDB4OTIsIDB4QzQsIDB4OTMsIC8qIDB4QkMtMHhCRiAqLworCTB4Q0QsIDB4Q0UsIDB4RUMsIDB4QTEsIDB4QjEsIDB4REIsIDB4RDMsIDB4QjcsIC8qIDB4QzAtMHhDMyAqLworCTB4QzQsIDB4OTQsIDB4QzQsIDB4OTUsIDB4RDIsIDB4REMsIDB4QzQsIDB4OTYsIC8qIDB4QzQtMHhDNyAqLworCTB4QzQsIDB4OTcsIDB4QzQsIDB4OTgsIDB4RUIsIDB4RkQsIDB4QzQsIDB4OTksIC8qIDB4QzgtMHhDQiAqLworCTB4RUIsIDB4RkIsIDB4QzQsIDB4OUEsIDB4QzQsIDB4OUIsIDB4QzQsIDB4OUMsIC8qIDB4Q0MtMHhDRiAqLworCTB4QzQsIDB4OUQsIDB4QzQsIDB4OUUsIDB4QzQsIDB4OUYsIDB4QzQsIDB4QTAsIC8qIDB4RDAtMHhEMyAqLworCTB4QzUsIDB4NDAsIDB4QzUsIDB4NDEsIDB4QzUsIDB4NDIsIDB4QzUsIDB4NDMsIC8qIDB4RDQtMHhENyAqLworCTB4QzUsIDB4NDQsIDB4QzUsIDB4NDUsIDB4QzUsIDB4NDYsIDB4QzUsIDB4NDcsIC8qIDB4RDgtMHhEQiAqLworCTB4QzUsIDB4NDgsIDB4QzUsIDB4NDksIDB4QzUsIDB4NEEsIDB4QzUsIDB4NEIsIC8qIDB4REMtMHhERiAqLworCTB4QzUsIDB4NEMsIDB4QzUsIDB4NEQsIDB4QzUsIDB4NEUsIDB4QjMsIDB4QkMsIC8qIDB4RTAtMHhFMyAqLworCTB4QzUsIDB4NEYsIDB4QzUsIDB4NTAsIDB4QzUsIDB4NTEsIDB4RUEsIDB4QjAsIC8qIDB4RTQtMHhFNyAqLworCTB4QzUsIDB4NTIsIDB4QzUsIDB4NTMsIDB4RDcsIDB4RDQsIDB4QzUsIDB4NTQsIC8qIDB4RTgtMHhFQiAqLworCTB4RjQsIDB4QUIsIDB4QjMsIDB4RjQsIDB4QzUsIDB4NTUsIDB4QzUsIDB4NTYsIC8qIDB4RUMtMHhFRiAqLworCTB4QzUsIDB4NTcsIDB4QzUsIDB4NTgsIDB4QzUsIDB4NTksIDB4RDYsIDB4QzEsIC8qIDB4RjAtMHhGMyAqLworCTB4RDYsIDB4QzIsIDB4QzUsIDB4NUEsIDB4QzUsIDB4NUIsIDB4QzUsIDB4NUMsIC8qIDB4RjQtMHhGNyAqLworCTB4QzUsIDB4NUQsIDB4QzUsIDB4NUUsIDB4QzUsIDB4NUYsIDB4RDUsIDB4RTksIC8qIDB4RjgtMHhGQiAqLworCTB4QkUsIDB4Q0EsIDB4QzUsIDB4NjAsIDB4RjQsIDB4QTcsIDB4QzUsIDB4NjEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzgyWzUxMl0gPSB7CisJMHhEMiwgMHhBOCwgMHhGNCwgMHhBOCwgMHhGNCwgMHhBOSwgMHhDNSwgMHg2MiwgLyogMHgwMC0weDAzICovCisJMHhGNCwgMHhBQSwgMHhCRSwgMHhDQiwgMHhEMywgMHhERiwgMHhDNSwgMHg2MywgLyogMHgwNC0weDA3ICovCisJMHhDNSwgMHg2NCwgMHhDNSwgMHg2NSwgMHhDNSwgMHg2NiwgMHhDNSwgMHg2NywgLyogMHgwOC0weDBCICovCisJMHhDOSwgMHhFMCwgMHhDOSwgMHhFMSwgMHhDNSwgMHg2OCwgMHhDNSwgMHg2OSwgLyogMHgwQy0weDBGICovCisJMHhGMywgMHhDMiwgMHhDNSwgMHg2QSwgMHhDQSwgMHhFNiwgMHhDNSwgMHg2QiwgLyogMHgxMC0weDEzICovCisJMHhDQywgMHhGMiwgMHhDNSwgMHg2QywgMHhDNSwgMHg2RCwgMHhDNSwgMHg2RSwgLyogMHgxNC0weDE3ICovCisJMHhDNSwgMHg2RiwgMHhDNSwgMHg3MCwgMHhDNSwgMHg3MSwgMHhFMiwgMHhCNiwgLyogMHgxOC0weDFCICovCisJMHhDQiwgMHhCNCwgMHhDNSwgMHg3MiwgMHhDRSwgMHhFOCwgMHhENiwgMHhEQiwgLyogMHgxQy0weDFGICovCisJMHhDNSwgMHg3MywgMHhGNCwgMHhBRCwgMHhGNCwgMHhBRSwgMHhGNCwgMHhBRiwgLyogMHgyMC0weDIzICovCisJMHhDNSwgMHg3NCwgMHhDNSwgMHg3NSwgMHhDNSwgMHg3NiwgMHhDNSwgMHg3NywgLyogMHgyNC0weDI3ICovCisJMHhGNCwgMHhCMiwgMHhDNSwgMHg3OCwgMHhCQSwgMHhCRCwgMHhGNCwgMHhCMywgLyogMHgyOC0weDJCICovCisJMHhCMCwgMHhFMywgMHhGNCwgMHhCMCwgMHhDNSwgMHg3OSwgMHhGNCwgMHhCMSwgLyogMHgyQy0weDJGICovCisJMHhCRCwgMHhBMiwgMHhCMiwgMHhENSwgMHhDNSwgMHg3QSwgMHhGNCwgMHhCNiwgLyogMHgzMC0weDMzICovCisJMHhGNCwgMHhCNywgMHhCNiwgMHhFNiwgMHhCMiwgMHhCMCwgMHhDRiwgMHhDRiwgLyogMHgzNC0weDM3ICovCisJMHhGNCwgMHhCNCwgMHhCNCwgMHhBQywgMHhDNSwgMHg3QiwgMHhGNCwgMHhCNSwgLyogMHgzOC0weDNCICovCisJMHhDNSwgMHg3QywgMHhDNSwgMHg3RCwgMHhGNCwgMHhCOCwgMHhDNSwgMHg3RSwgLyogMHgzQy0weDNGICovCisJMHhDNSwgMHg4MCwgMHhDNSwgMHg4MSwgMHhDNSwgMHg4MiwgMHhDNSwgMHg4MywgLyogMHg0MC0weDQzICovCisJMHhGNCwgMHhCOSwgMHhDNSwgMHg4NCwgMHhDNSwgMHg4NSwgMHhDRCwgMHhBNywgLyogMHg0NC0weDQ3ICovCisJMHhDNSwgMHg4NiwgMHhGNCwgMHhCQSwgMHhDNSwgMHg4NywgMHhGNCwgMHhCQiwgLyogMHg0OC0weDRCICovCisJMHhDNSwgMHg4OCwgMHhDNSwgMHg4OSwgMHhDNSwgMHg4QSwgMHhGNCwgMHhCQywgLyogMHg0Qy0weDRGICovCisJMHhDNSwgMHg4QiwgMHhDNSwgMHg4QywgMHhDNSwgMHg4RCwgMHhDNSwgMHg4RSwgLyogMHg1MC0weDUzICovCisJMHhDNSwgMHg4RiwgMHhDNSwgMHg5MCwgMHhDNSwgMHg5MSwgMHhDNSwgMHg5MiwgLyogMHg1NC0weDU3ICovCisJMHhDQiwgMHhEMiwgMHhDNSwgMHg5MywgMHhGNCwgMHhCRCwgMHhDNSwgMHg5NCwgLyogMHg1OC0weDVCICovCisJMHhDNSwgMHg5NSwgMHhDNSwgMHg5NiwgMHhDNSwgMHg5NywgMHhGNCwgMHhCRSwgLyogMHg1Qy0weDVGICovCisJMHhDNSwgMHg5OCwgMHhDNSwgMHg5OSwgMHhDNSwgMHg5QSwgMHhDNSwgMHg5QiwgLyogMHg2MC0weDYzICovCisJMHhDNSwgMHg5QywgMHhDNSwgMHg5RCwgMHhDNSwgMHg5RSwgMHhDNSwgMHg5RiwgLyogMHg2NC0weDY3ICovCisJMHhGNCwgMHhCRiwgMHhDNSwgMHhBMCwgMHhDNiwgMHg0MCwgMHhDNiwgMHg0MSwgLyogMHg2OC0weDZCICovCisJMHhDNiwgMHg0MiwgMHhDNiwgMHg0MywgMHhGNCwgMHhERSwgMHhDMSwgMHhCQywgLyogMHg2Qy0weDZGICovCisJMHhCQywgMHhFOCwgMHhDNiwgMHg0NCwgMHhDOSwgMHhBQiwgMHhEMSwgMHhERSwgLyogMHg3MC0weDczICovCisJMHhFNSwgMHhGNSwgMHhDNiwgMHg0NSwgMHhDNiwgMHg0NiwgMHhDNiwgMHg0NywgLyogMHg3NC0weDc3ICovCisJMHhDNiwgMHg0OCwgMHhEQywgMHhCMywgMHhEMiwgMHhENSwgMHhDNiwgMHg0OSwgLyogMHg3OC0weDdCICovCisJMHhDNiwgMHg0QSwgMHhEQywgMHhCNCwgMHhCMCwgMHhBQywgMHhEQywgMHhCNSwgLyogMHg3Qy0weDdGICovCisJCisJMHhDNiwgMHg0QiwgMHhDNiwgMHg0QywgMHhCRCwgMHhEQSwgMHhDNiwgMHg0RCwgLyogMHg4MC0weDgzICovCisJMHhEQywgMHhCOSwgMHhDNiwgMHg0RSwgMHhDNiwgMHg0RiwgMHhDNiwgMHg1MCwgLyogMHg4NC0weDg3ICovCisJMHhEOCwgMHhDMiwgMHhDNiwgMHg1MSwgMHhEQywgMHhCNywgMHhEMywgMHhGMywgLyogMHg4OC0weDhCICovCisJMHhDNiwgMHg1MiwgMHhDOSwgMHhENiwgMHhEQywgMHhCQSwgMHhEQywgMHhCNiwgLyogMHg4Qy0weDhGICovCisJMHhDNiwgMHg1MywgMHhEQywgMHhCQiwgMHhDMywgMHhBMiwgMHhDNiwgMHg1NCwgLyogMHg5MC0weDkzICovCisJMHhDNiwgMHg1NSwgMHhDNiwgMHg1NiwgMHhDNiwgMHg1NywgMHhEQywgMHhCQywgLyogMHg5NC0weDk3ICovCisJMHhEQywgMHhDNSwgMHhEQywgMHhCRCwgMHhDNiwgMHg1OCwgMHhDNiwgMHg1OSwgLyogMHg5OC0weDlCICovCisJMHhDRSwgMHhERiwgMHhENiwgMHhBNSwgMHhDNiwgMHg1QSwgMHhEQywgMHhDRiwgLyogMHg5Qy0weDlGICovCisJMHhDNiwgMHg1QiwgMHhEQywgMHhDRCwgMHhDNiwgMHg1QywgMHhDNiwgMHg1RCwgLyogMHhBMC0weEEzICovCisJMHhEQywgMHhEMiwgMHhCRCwgMHhFNiwgMHhDMiwgMHhBQiwgMHhDNiwgMHg1RSwgLyogMHhBNC0weEE3ICovCisJMHhEQywgMHhCOCwgMHhEQywgMHhDQiwgMHhEQywgMHhDRSwgMHhEQywgMHhCRSwgLyogMHhBOC0weEFCICovCisJMHhCNywgMHhEMiwgMHhCMCwgMHhDNSwgMHhEQywgMHhDNywgMHhEMCwgMHhCRSwgLyogMHhBQy0weEFGICovCisJMHhEQywgMHhDMSwgMHhCQiwgMHhBOCwgMHhDNiwgMHg1RiwgMHhCNywgMHhCQywgLyogMHhCMC0weEIzICovCisJMHhEQywgMHhDQywgMHhDNiwgMHg2MCwgMHhDNiwgMHg2MSwgMHhEQywgMHhDNiwgLyogMHhCNC0weEI3ICovCisJMHhEQywgMHhCRiwgMHhDNywgMHhEQiwgMHhDNiwgMHg2MiwgMHhDNiwgMHg2MywgLyogMHhCOC0weEJCICovCisJMHhDNiwgMHg2NCwgMHhEMSwgMHhCRiwgMHhEQywgMHhDMCwgMHhDNiwgMHg2NSwgLyogMHhCQy0weEJGICovCisJMHhDNiwgMHg2NiwgMHhEQywgMHhDQSwgMHhDNiwgMHg2NywgMHhDNiwgMHg2OCwgLyogMHhDMC0weEMzICovCisJMHhEQywgMHhEMCwgMHhDNiwgMHg2OSwgMHhDNiwgMHg2QSwgMHhDRSwgMHhBRCwgLyogMHhDNC0weEM3ICovCisJMHhEQywgMHhDMiwgMHhDNiwgMHg2QiwgMHhEQywgMHhDMywgMHhEQywgMHhDOCwgLyogMHhDOC0weENCICovCisJMHhEQywgMHhDOSwgMHhCMiwgMHhENCwgMHhEQywgMHhEMSwgMHhDQiwgMHhENSwgLyogMHhDQy0weENGICovCisJMHhDNiwgMHg2QywgMHhENCwgMHhCNywgMHhEQywgMHhEQiwgMHhEQywgMHhERiwgLyogMHhEMC0weEQzICovCisJMHhDQywgMHhBNiwgMHhEQywgMHhFNiwgMHhDNiwgMHg2RCwgMHhDMywgMHhFNywgLyogMHhENC0weEQ3ICovCisJMHhEQywgMHhEQywgMHhDNiwgMHg2RSwgMHhDNiwgMHg2RiwgMHhCRiwgMHhDMSwgLyogMHhEOC0weERCICovCisJMHhEQywgMHhEOSwgMHhDNiwgMHg3MCwgMHhCMCwgMHhGQSwgMHhCOSwgMHhCNiwgLyogMHhEQy0weERGICovCisJMHhEQywgMHhFNSwgMHhEQywgMHhEMywgMHhDNiwgMHg3MSwgMHhEQywgMHhDNCwgLyogMHhFMC0weEUzICovCisJMHhEQywgMHhENiwgMHhDOCwgMHhGNCwgMHhCRiwgMHhFMCwgMHhDNiwgMHg3MiwgLyogMHhFNC0weEU3ICovCisJMHhDNiwgMHg3MywgMHhDNiwgMHg3NCwgMHhDNiwgMHg3NSwgMHhDOSwgMHhCQiwgLyogMHhFOC0weEVCICovCisJMHhDNiwgMHg3NiwgMHhDNiwgMHg3NywgMHhDNiwgMHg3OCwgMHhCMSwgMHhCRCwgLyogMHhFQy0weEVGICovCisJMHhDNiwgMHg3OSwgMHhEMywgMHhBMiwgMHhDNiwgMHg3QSwgMHhDNiwgMHg3QiwgLyogMHhGMC0weEYzICovCisJMHhEQywgMHhEQSwgMHhDNiwgMHg3QywgMHhDNiwgMHg3RCwgMHhEQywgMHhENSwgLyogMHhGNC0weEY3ICovCisJMHhDNiwgMHg3RSwgMHhDNiwgMHhCQiwgMHhDNiwgMHg4MCwgMHhEQywgMHhERSwgLyogMHhGOC0weEZCICovCisJMHhDNiwgMHg4MSwgMHhDNiwgMHg4MiwgMHhDNiwgMHg4MywgMHhDNiwgMHg4NCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODNbNTEyXSA9IHsKKwkweEM2LCAweDg1LCAweEQ3LCAweEMyLCAweEMzLCAweEFGLCAweEI3LCAweEI2LCAvKiAweDAwLTB4MDMgKi8KKwkweEM3LCAweEQxLCAweEMzLCAweEE5LCAweERDLCAweEUyLCAweERDLCAweEQ4LCAvKiAweDA0LTB4MDcgKi8KKwkweERDLCAweEVCLCAweERDLCAweEQ0LCAweEM2LCAweDg2LCAweEM2LCAweDg3LCAvKiAweDA4LTB4MEIgKi8KKwkweERDLCAweERELCAweEM2LCAweDg4LCAweEJFLCAweEE1LCAweERDLCAweEQ3LCAvKiAweDBDLTB4MEYgKi8KKwkweEM2LCAweDg5LCAweERDLCAweEUwLCAweEM2LCAweDhBLCAweEM2LCAweDhCLCAvKiAweDEwLTB4MTMgKi8KKwkweERDLCAweEUzLCAweERDLCAweEU0LCAweEM2LCAweDhDLCAweERDLCAweEY4LCAvKiAweDE0LTB4MTcgKi8KKwkweEM2LCAweDhELCAweEM2LCAweDhFLCAweERDLCAweEUxLCAweERELCAweEEyLCAvKiAweDE4LTB4MUIgKi8KKwkweERDLCAweEU3LCAweEM2LCAweDhGLCAweEM2LCAweDkwLCAweEM2LCAweDkxLCAvKiAweDFDLTB4MUYgKi8KKwkweEM2LCAweDkyLCAweEM2LCAweDkzLCAweEM2LCAweDk0LCAweEM2LCAweDk1LCAvKiAweDIwLTB4MjMgKi8KKwkweEM2LCAweDk2LCAweEM2LCAweDk3LCAweEM2LCAweDk4LCAweEJDLCAweEVCLCAvKiAweDI0LTB4MjcgKi8KKwkweEI0LCAweEM0LCAweEM2LCAweDk5LCAweEM2LCAweDlBLCAweEMzLCAweEEzLCAvKiAweDI4LTB4MkIgKi8KKwkweEIyLCAweEU3LCAweERDLCAweEZBLCAweEM2LCAweDlCLCAweERDLCAweEYyLCAvKiAweDJDLTB4MkYgKi8KKwkweEM2LCAweDlDLCAweERDLCAweEVGLCAweEM2LCAweDlELCAweERDLCAweEZDLCAvKiAweDMwLTB4MzMgKi8KKwkweERDLCAweEVFLCAweEQyLCAweEYwLCAweEIyLCAweEU4LCAweEM2LCAweDlFLCAvKiAweDM0LTB4MzcgKi8KKwkweEM4LCAweEQ3LCAweEM4LCAweEUzLCAweERDLCAweEZCLCAweEM2LCAweDlGLCAvKiAweDM4LTB4M0IgKi8KKwkweERDLCAweEVELCAweEM2LCAweEEwLCAweEM3LCAweDQwLCAweEM3LCAweDQxLCAvKiAweDNDLTB4M0YgKi8KKwkweERDLCAweEY3LCAweEM3LCAweDQyLCAweEM3LCAweDQzLCAweERDLCAweEY1LCAvKiAweDQwLTB4NDMgKi8KKwkweEM3LCAweDQ0LCAweEM3LCAweDQ1LCAweEJFLCAweEEzLCAweERDLCAweEY0LCAvKiAweDQ0LTB4NDcgKi8KKwkweEM3LCAweDQ2LCAweEIyLCAweERELCAweEM3LCAweDQ3LCAweEM3LCAweDQ4LCAvKiAweDQ4LTB4NEIgKi8KKwkweEM3LCAweDQ5LCAweEM3LCAweDRBLCAweEM3LCAweDRCLCAweERDLCAweEYzLCAvKiAweDRDLTB4NEYgKi8KKwkweEJDLCAweEY2LCAweERDLCAweEU4LCAweEJCLCAweEM0LCAweEM3LCAweDRDLCAvKiAweDUwLTB4NTMgKi8KKwkweEMwLCAweEYzLCAweEM3LCAweDRELCAweEM3LCAweDRFLCAweEM3LCAweDRGLCAvKiAweDU0LTB4NTcgKi8KKwkweEM3LCAweDUwLCAweEM3LCAweDUxLCAweEJDLCAweEQ0LCAweERDLCAweEU5LCAvKiAweDU4LTB4NUIgKi8KKwkweERDLCAweEVBLCAweEM3LCAweDUyLCAweERDLCAweEYxLCAweERDLCAweEY2LCAvKiAweDVDLTB4NUYgKi8KKwkweERDLCAweEY5LCAweEI1LCAweEI0LCAweEM3LCAweDUzLCAweEM4LCAweEQ5LCAvKiAweDYwLTB4NjMgKi8KKwkweEJCLCAweEU3LCAweERDLCAweEZFLCAweERDLCAweEZELCAweEQzLCAweEFCLCAvKiAweDY0LTB4NjcgKi8KKwkweERELCAweEExLCAweERELCAweEEzLCAweERELCAweEE1LCAweEQyLCAweEYxLCAvKiAweDY4LTB4NkIgKi8KKwkweERELCAweEE0LCAweERELCAweEE2LCAweERELCAweEE3LCAweEQyLCAweEE5LCAvKiAweDZDLTB4NkYgKi8KKwkweEM3LCAweDU0LCAweEM3LCAweDU1LCAweEM3LCAweDU2LCAweEM3LCAweDU3LCAvKiAweDcwLTB4NzMgKi8KKwkweEM3LCAweDU4LCAweEM3LCAweDU5LCAweEM3LCAweDVBLCAweEJBLCAweEM5LCAvKiAweDc0LTB4NzcgKi8KKwkweERELCAweEE5LCAweEM3LCAweDVCLCAweEM3LCAweDVDLCAweERELCAweEI2LCAvKiAweDc4LTB4N0IgKi8KKwkweERELCAweEIxLCAweERELCAweEI0LCAweEM3LCAweDVELCAweEM3LCAweDVFLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEM3LCAweDVGLCAweEM3LCAweDYwLCAweEM3LCAweDYxLCAweEM3LCAweDYyLCAvKiAweDgwLTB4ODMgKi8KKwkweEM3LCAweDYzLCAweERELCAweEIwLCAweEM2LCAweENFLCAweEM3LCAweDY0LCAvKiAweDg0LTB4ODcgKi8KKwkweEM3LCAweDY1LCAweEMwLCAweEYyLCAweEM3LCAweDY2LCAweEM3LCAweDY3LCAvKiAweDg4LTB4OEIgKi8KKwkweEM3LCAweDY4LCAweEM3LCAweDY5LCAweEM5LCAweEFGLCAweEM3LCAweDZBLCAvKiAweDhDLTB4OEYgKi8KKwkweEM3LCAweDZCLCAweEM3LCAweDZDLCAweERDLCAweEVDLCAweERELCAweEFFLCAvKiAweDkwLTB4OTMgKi8KKwkweEM3LCAweDZELCAweEM3LCAweDZFLCAweEM3LCAweDZGLCAweEM3LCAweDcwLCAvKiAweDk0LTB4OTcgKi8KKwkweERELCAweEI3LCAweEM3LCAweDcxLCAweEM3LCAweDcyLCAweERDLCAweEYwLCAvKiAweDk4LTB4OUIgKi8KKwkweERELCAweEFGLCAweEM3LCAweDczLCAweERELCAweEI4LCAweEM3LCAweDc0LCAvKiAweDlDLTB4OUYgKi8KKwkweERELCAweEFDLCAweEM3LCAweDc1LCAweEM3LCAweDc2LCAweEM3LCAweDc3LCAvKiAweEEwLTB4QTMgKi8KKwkweEM3LCAweDc4LCAweEM3LCAweDc5LCAweEM3LCAweDdBLCAweEM3LCAweDdCLCAvKiAweEE0LTB4QTcgKi8KKwkweERELCAweEI5LCAweERELCAweEIzLCAweERELCAweEFELCAweEM0LCAweEFBLCAvKiAweEE4LTB4QUIgKi8KKwkweEM3LCAweDdDLCAweEM3LCAweDdELCAweEM3LCAweDdFLCAweEM3LCAweDgwLCAvKiAweEFDLTB4QUYgKi8KKwkweERELCAweEE4LCAweEMwLCAweEIzLCAweEMxLCAweEFCLCAweERELCAweEFBLCAvKiAweEIwLTB4QjMgKi8KKwkweERELCAweEFCLCAweEM3LCAweDgxLCAweERELCAweEIyLCAweEJCLCAweEYxLCAvKiAweEI0LTB4QjcgKi8KKwkweERELCAweEI1LCAweEQzLCAweEE4LCAweERELCAweEJBLCAweEM3LCAweDgyLCAvKiAweEI4LTB4QkIgKi8KKwkweERELCAweEJCLCAweEMzLCAweEE3LCAweEM3LCAweDgzLCAweEM3LCAweDg0LCAvKiAweEJDLTB4QkYgKi8KKwkweERELCAweEQyLCAweERELCAweEJDLCAweEM3LCAweDg1LCAweEM3LCAweDg2LCAvKiAweEMwLTB4QzMgKi8KKwkweEM3LCAweDg3LCAweERELCAweEQxLCAweEM3LCAweDg4LCAweEI5LCAweEJELCAvKiAweEM0LTB4QzcgKi8KKwkweEM3LCAweDg5LCAweEM3LCAweDhBLCAweEJFLCAweEQ1LCAweEM3LCAweDhCLCAvKiAweEM4LTB4Q0IgKi8KKwkweEJFLCAweEZBLCAweEM3LCAweDhDLCAweEM3LCAweDhELCAweEJBLCAweENBLCAvKiAweENDLTB4Q0YgKi8KKwkweEM3LCAweDhFLCAweEM3LCAweDhGLCAweEM3LCAweDkwLCAweEM3LCAweDkxLCAvKiAweEQwLTB4RDMgKi8KKwkweERELCAweENBLCAweEM3LCAweDkyLCAweERELCAweEM1LCAweEM3LCAweDkzLCAvKiAweEQ0LTB4RDcgKi8KKwkweERELCAweEJGLCAweEM3LCAweDk0LCAweEM3LCAweDk1LCAweEM3LCAweDk2LCAvKiAweEQ4LTB4REIgKi8KKwkweEIyLCAweENCLCAweERELCAweEMzLCAweEM3LCAweDk3LCAweERELCAweENCLCAvKiAweERDLTB4REYgKi8KKwkweEIyLCAweEE0LCAweERELCAweEQ1LCAweEM3LCAweDk4LCAweEM3LCAweDk5LCAvKiAweEUwLTB4RTMgKi8KKwkweEM3LCAweDlBLCAweERELCAweEJFLCAweEM3LCAweDlCLCAweEM3LCAweDlDLCAvKiAweEU0LTB4RTcgKi8KKwkweEM3LCAweDlELCAweEM2LCAweEQwLCAweERELCAweEQwLCAweEM3LCAweDlFLCAvKiAweEU4LTB4RUIgKi8KKwkweEM3LCAweDlGLCAweEM3LCAweEEwLCAweEM4LCAweDQwLCAweEM4LCAweDQxLCAvKiAweEVDLTB4RUYgKi8KKwkweERELCAweEQ0LCAweEMxLCAweEUyLCAweEI3LCAweEM2LCAweEM4LCAweDQyLCAvKiAweEYwLTB4RjMgKi8KKwkweEM4LCAweDQzLCAweEM4LCAweDQ0LCAweEM4LCAweDQ1LCAweEM4LCAweDQ2LCAvKiAweEY0LTB4RjcgKi8KKwkweERELCAweENFLCAweERELCAweENGLCAweEM4LCAweDQ3LCAweEM4LCAweDQ4LCAvKiAweEY4LTB4RkIgKi8KKwkweEM4LCAweDQ5LCAweERELCAweEM0LCAweEM4LCAweDRBLCAweEM4LCAweDRCLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184NFs1MTJdID0geworCTB4QzgsIDB4NEMsIDB4REQsIDB4QkQsIDB4QzgsIDB4NEQsIDB4REQsIDB4Q0QsIC8qIDB4MDAtMHgwMyAqLworCTB4Q0MsIDB4RDEsIDB4QzgsIDB4NEUsIDB4REQsIDB4QzksIDB4QzgsIDB4NEYsIC8qIDB4MDQtMHgwNyAqLworCTB4QzgsIDB4NTAsIDB4QzgsIDB4NTEsIDB4QzgsIDB4NTIsIDB4REQsIDB4QzIsIC8qIDB4MDgtMHgwQiAqLworCTB4QzMsIDB4QzgsIDB4QzYsIDB4QkMsIDB4Q0UsIDB4QUUsIDB4REQsIDB4Q0MsIC8qIDB4MEMtMHgwRiAqLworCTB4QzgsIDB4NTMsIDB4REQsIDB4QzgsIDB4QzgsIDB4NTQsIDB4QzgsIDB4NTUsIC8qIDB4MTAtMHgxMyAqLworCTB4QzgsIDB4NTYsIDB4QzgsIDB4NTcsIDB4QzgsIDB4NTgsIDB4QzgsIDB4NTksIC8qIDB4MTQtMHgxNyAqLworCTB4REQsIDB4QzEsIDB4QzgsIDB4NUEsIDB4QzgsIDB4NUIsIDB4QzgsIDB4NUMsIC8qIDB4MTgtMHgxQiAqLworCTB4REQsIDB4QzYsIDB4QzIsIDB4REMsIDB4QzgsIDB4NUQsIDB4QzgsIDB4NUUsIC8qIDB4MUMtMHgxRiAqLworCTB4QzgsIDB4NUYsIDB4QzgsIDB4NjAsIDB4QzgsIDB4NjEsIDB4QzgsIDB4NjIsIC8qIDB4MjAtMHgyMyAqLworCTB4RDMsIDB4QTksIDB4RDMsIDB4QUEsIDB4REQsIDB4RDMsIDB4Q0YsIDB4RjQsIC8qIDB4MjQtMHgyNyAqLworCTB4QzgsIDB4RjgsIDB4QzgsIDB4NjMsIDB4QzgsIDB4NjQsIDB4QzgsIDB4NjUsIC8qIDB4MjgtMHgyQiAqLworCTB4QzgsIDB4NjYsIDB4QzgsIDB4NjcsIDB4QzgsIDB4NjgsIDB4QzgsIDB4NjksIC8qIDB4MkMtMHgyRiAqLworCTB4QzgsIDB4NkEsIDB4REQsIDB4RTYsIDB4QzgsIDB4NkIsIDB4QzgsIDB4NkMsIC8qIDB4MzAtMHgzMyAqLworCTB4QzgsIDB4NkQsIDB4QzgsIDB4NkUsIDB4QzgsIDB4NkYsIDB4QzgsIDB4NzAsIC8qIDB4MzQtMHgzNyAqLworCTB4REQsIDB4QzcsIDB4QzgsIDB4NzEsIDB4QzgsIDB4NzIsIDB4QzgsIDB4NzMsIC8qIDB4MzgtMHgzQiAqLworCTB4REQsIDB4RTAsIDB4QzIsIDB4RTQsIDB4QzgsIDB4NzQsIDB4QzgsIDB4NzUsIC8qIDB4M0MtMHgzRiAqLworCTB4QzgsIDB4NzYsIDB4QzgsIDB4NzcsIDB4QzgsIDB4NzgsIDB4QzgsIDB4NzksIC8qIDB4NDAtMHg0MyAqLworCTB4QzgsIDB4N0EsIDB4QzgsIDB4N0IsIDB4REQsIDB4RTEsIDB4QzgsIDB4N0MsIC8qIDB4NDQtMHg0NyAqLworCTB4QzgsIDB4N0QsIDB4QzgsIDB4N0UsIDB4QzgsIDB4ODAsIDB4QzgsIDB4ODEsIC8qIDB4NDgtMHg0QiAqLworCTB4QzgsIDB4ODIsIDB4QzgsIDB4ODMsIDB4QzgsIDB4ODQsIDB4QzgsIDB4ODUsIC8qIDB4NEMtMHg0RiAqLworCTB4QzgsIDB4ODYsIDB4REQsIDB4RDcsIDB4QzgsIDB4ODcsIDB4QzgsIDB4ODgsIC8qIDB4NTAtMHg1MyAqLworCTB4QzgsIDB4ODksIDB4QzgsIDB4OEEsIDB4QzgsIDB4OEIsIDB4RDYsIDB4RjgsIC8qIDB4NTQtMHg1NyAqLworCTB4QzgsIDB4OEMsIDB4REQsIDB4RDksIDB4REQsIDB4RDgsIDB4QjgsIDB4RjAsIC8qIDB4NTgtMHg1QiAqLworCTB4REQsIDB4RDYsIDB4QzgsIDB4OEQsIDB4QzgsIDB4OEUsIDB4QzgsIDB4OEYsIC8qIDB4NUMtMHg1RiAqLworCTB4QzgsIDB4OTAsIDB4QzYsIDB4Q0YsIDB4QzgsIDB4OTEsIDB4QjYsIDB4QUQsIC8qIDB4NjAtMHg2MyAqLworCTB4QzgsIDB4OTIsIDB4QzgsIDB4OTMsIDB4QzgsIDB4OTQsIDB4QzgsIDB4OTUsIC8qIDB4NjQtMHg2NyAqLworCTB4QzgsIDB4OTYsIDB4REQsIDB4RTIsIDB4QzgsIDB4OTcsIDB4QkEsIDB4RjksIC8qIDB4NjgtMHg2QiAqLworCTB4RDQsIDB4RTEsIDB4REQsIDB4RTcsIDB4QzgsIDB4OTgsIDB4QzgsIDB4OTksIC8qIDB4NkMtMHg2RiAqLworCTB4QzgsIDB4OUEsIDB4QjQsIDB4RDAsIDB4QzgsIDB4OUIsIDB4REQsIDB4REEsIC8qIDB4NzAtMHg3MyAqLworCTB4QzgsIDB4OUMsIDB4QkYsIDB4RkIsIDB4REQsIDB4RTMsIDB4QzgsIDB4OUQsIC8qIDB4NzQtMHg3NyAqLworCTB4REQsIDB4REYsIDB4QzgsIDB4OUUsIDB4REQsIDB4REQsIDB4QzgsIDB4OUYsIC8qIDB4NzgtMHg3QiAqLworCTB4QzgsIDB4QTAsIDB4QzksIDB4NDAsIDB4QzksIDB4NDEsIDB4QzksIDB4NDIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QzksIDB4NDMsIDB4QzksIDB4NDQsIDB4QjUsIDB4RDksIDB4QzksIDB4NDUsIC8qIDB4ODAtMHg4MyAqLworCTB4QzksIDB4NDYsIDB4QzksIDB4NDcsIDB4QzksIDB4NDgsIDB4REQsIDB4REIsIC8qIDB4ODQtMHg4NyAqLworCTB4REQsIDB4REMsIDB4REQsIDB4REUsIDB4QzksIDB4NDksIDB4QkQsIDB4QUYsIC8qIDB4ODgtMHg4QiAqLworCTB4REQsIDB4RTQsIDB4QzksIDB4NEEsIDB4REQsIDB4RTUsIDB4QzksIDB4NEIsIC8qIDB4OEMtMHg4RiAqLworCTB4QzksIDB4NEMsIDB4QzksIDB4NEQsIDB4QzksIDB4NEUsIDB4QzksIDB4NEYsIC8qIDB4OTAtMHg5MyAqLworCTB4QzksIDB4NTAsIDB4QzksIDB4NTEsIDB4QzksIDB4NTIsIDB4REQsIDB4RjUsIC8qIDB4OTQtMHg5NyAqLworCTB4QzksIDB4NTMsIDB4QzMsIDB4QzksIDB4QzksIDB4NTQsIDB4QzksIDB4NTUsIC8qIDB4OTgtMHg5QiAqLworCTB4Q0IsIDB4RTIsIDB4QzksIDB4NTYsIDB4QzksIDB4NTcsIDB4QzksIDB4NTgsIC8qIDB4OUMtMHg5RiAqLworCTB4QzksIDB4NTksIDB4REQsIDB4RjIsIDB4QzksIDB4NUEsIDB4QzksIDB4NUIsIC8qIDB4QTAtMHhBMyAqLworCTB4QzksIDB4NUMsIDB4QzksIDB4NUQsIDB4QzksIDB4NUUsIDB4QzksIDB4NUYsIC8qIDB4QTQtMHhBNyAqLworCTB4QzksIDB4NjAsIDB4QzksIDB4NjEsIDB4QzksIDB4NjIsIDB4QzksIDB4NjMsIC8qIDB4QTgtMHhBQiAqLworCTB4QzksIDB4NjQsIDB4QzksIDB4NjUsIDB4QzksIDB4NjYsIDB4RDgsIDB4RTEsIC8qIDB4QUMtMHhBRiAqLworCTB4QzksIDB4NjcsIDB4QzksIDB4NjgsIDB4QzYsIDB4RDEsIDB4QzksIDB4NjksIC8qIDB4QjAtMHhCMyAqLworCTB4REQsIDB4RjQsIDB4QzksIDB4NkEsIDB4QzksIDB4NkIsIDB4QzksIDB4NkMsIC8qIDB4QjQtMHhCNyAqLworCTB4RDUsIDB4RjQsIDB4REQsIDB4RjMsIDB4REQsIDB4RjAsIDB4QzksIDB4NkQsIC8qIDB4QjgtMHhCQiAqLworCTB4QzksIDB4NkUsIDB4REQsIDB4RUMsIDB4QzksIDB4NkYsIDB4REQsIDB4RUYsIC8qIDB4QkMtMHhCRiAqLworCTB4QzksIDB4NzAsIDB4REQsIDB4RTgsIDB4QzksIDB4NzEsIDB4QzksIDB4NzIsIC8qIDB4QzAtMHhDMyAqLworCTB4RDAsIDB4RUUsIDB4QzksIDB4NzMsIDB4QzksIDB4NzQsIDB4QzksIDB4NzUsIC8qIDB4QzQtMHhDNyAqLworCTB4QzksIDB4NzYsIDB4QzgsIDB4RDgsIDB4REQsIDB4RUUsIDB4QzksIDB4NzcsIC8qIDB4QzgtMHhDQiAqLworCTB4QzksIDB4NzgsIDB4REQsIDB4RTksIDB4QzksIDB4NzksIDB4QzksIDB4N0EsIC8qIDB4Q0MtMHhDRiAqLworCTB4REQsIDB4RUEsIDB4Q0IsIDB4RjIsIDB4QzksIDB4N0IsIDB4REQsIDB4RUQsIC8qIDB4RDAtMHhEMyAqLworCTB4QzksIDB4N0MsIDB4QzksIDB4N0QsIDB4QjEsIDB4Q0QsIDB4QzksIDB4N0UsIC8qIDB4RDQtMHhENyAqLworCTB4QzksIDB4ODAsIDB4QzksIDB4ODEsIDB4QzksIDB4ODIsIDB4QzksIDB4ODMsIC8qIDB4RDgtMHhEQiAqLworCTB4QzksIDB4ODQsIDB4QzAsIDB4QjYsIDB4QzksIDB4ODUsIDB4QkMsIDB4QkIsIC8qIDB4REMtMHhERiAqLworCTB4REQsIDB4RjEsIDB4QzksIDB4ODYsIDB4QzksIDB4ODcsIDB4REQsIDB4RjcsIC8qIDB4RTAtMHhFMyAqLworCTB4QzksIDB4ODgsIDB4REQsIDB4RjYsIDB4REQsIDB4RUIsIDB4QzksIDB4ODksIC8qIDB4RTQtMHhFNyAqLworCTB4QzksIDB4OEEsIDB4QzksIDB4OEIsIDB4QzksIDB4OEMsIDB4QzksIDB4OEQsIC8qIDB4RTgtMHhFQiAqLworCTB4QzUsIDB4RUUsIDB4QzksIDB4OEUsIDB4QzksIDB4OEYsIDB4QzksIDB4OTAsIC8qIDB4RUMtMHhFRiAqLworCTB4REQsIDB4RkIsIDB4QzksIDB4OTEsIDB4QzksIDB4OTIsIDB4QzksIDB4OTMsIC8qIDB4RjAtMHhGMyAqLworCTB4QzksIDB4OTQsIDB4QzksIDB4OTUsIDB4QzksIDB4OTYsIDB4QzksIDB4OTcsIC8qIDB4RjQtMHhGNyAqLworCTB4QzksIDB4OTgsIDB4QzksIDB4OTksIDB4QzksIDB4OUEsIDB4QzksIDB4OUIsIC8qIDB4RjgtMHhGQiAqLworCTB4REUsIDB4QTQsIDB4QzksIDB4OUMsIDB4QzksIDB4OUQsIDB4REUsIDB4QTMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzg1WzUxMl0gPSB7CisJMHhDOSwgMHg5RSwgMHhDOSwgMHg5RiwgMHhDOSwgMHhBMCwgMHhDQSwgMHg0MCwgLyogMHgwMC0weDAzICovCisJMHhDQSwgMHg0MSwgMHhDQSwgMHg0MiwgMHhDQSwgMHg0MywgMHhDQSwgMHg0NCwgLyogMHgwNC0weDA3ICovCisJMHhDQSwgMHg0NSwgMHhDQSwgMHg0NiwgMHhDQSwgMHg0NywgMHhDQSwgMHg0OCwgLyogMHgwOC0weDBCICovCisJMHhERCwgMHhGOCwgMHhDQSwgMHg0OSwgMHhDQSwgMHg0QSwgMHhDQSwgMHg0QiwgLyogMHgwQy0weDBGICovCisJMHhDQSwgMHg0QywgMHhDMywgMHhFRiwgMHhDQSwgMHg0RCwgMHhDMiwgMHhGQiwgLyogMHgxMC0weDEzICovCisJMHhDQSwgMHg0RSwgMHhDQSwgMHg0RiwgMHhDQSwgMHg1MCwgMHhENSwgMHhFMSwgLyogMHgxNC0weDE3ICovCisJMHhDQSwgMHg1MSwgMHhDQSwgMHg1MiwgMHhDRSwgMHhCNSwgMHhDQSwgMHg1MywgLyogMHgxOC0weDFCICovCisJMHhDQSwgMHg1NCwgMHhDQSwgMHg1NSwgMHhDQSwgMHg1NiwgMHhERCwgMHhGRCwgLyogMHgxQy0weDFGICovCisJMHhDQSwgMHg1NywgMHhCMiwgMHhDQywgMHhDQSwgMHg1OCwgMHhDQSwgMHg1OSwgLyogMHgyMC0weDIzICovCisJMHhDQSwgMHg1QSwgMHhDQSwgMHg1QiwgMHhDQSwgMHg1QywgMHhDQSwgMHg1RCwgLyogMHgyNC0weDI3ICovCisJMHhDQSwgMHg1RSwgMHhDQSwgMHg1RiwgMHhDQSwgMHg2MCwgMHhDNCwgMHhFOCwgLyogMHgyOC0weDJCICovCisJMHhDQSwgMHhERiwgMHhDQSwgMHg2MSwgMHhDQSwgMHg2MiwgMHhDQSwgMHg2MywgLyogMHgyQy0weDJGICovCisJMHhDQSwgMHg2NCwgMHhDQSwgMHg2NSwgMHhDQSwgMHg2NiwgMHhDQSwgMHg2NywgLyogMHgzMC0weDMzICovCisJMHhDQSwgMHg2OCwgMHhDQSwgMHg2OSwgMHhDQSwgMHg2QSwgMHhDNywgMHhCRSwgLyogMHgzNC0weDM3ICovCisJMHhERCwgMHhGQSwgMHhERCwgMHhGQywgMHhERCwgMHhGRSwgMHhERSwgMHhBMiwgLyogMHgzOC0weDNCICovCisJMHhCMCwgMHhBQSwgMHhCMSwgMHhDRSwgMHhDQSwgMHg2QiwgMHhDQSwgMHg2QywgLyogMHgzQy0weDNGICovCisJMHhDQSwgMHg2RCwgMHhDQSwgMHg2RSwgMHhDQSwgMHg2RiwgMHhERSwgMHhBQywgLyogMHg0MC0weDQzICovCisJMHhDQSwgMHg3MCwgMHhDQSwgMHg3MSwgMHhDQSwgMHg3MiwgMHhDQSwgMHg3MywgLyogMHg0NC0weDQ3ICovCisJMHhERSwgMHhBNiwgMHhCRCwgMHhCNiwgMHhDOCwgMHhFRiwgMHhDQSwgMHg3NCwgLyogMHg0OC0weDRCICovCisJMHhDQSwgMHg3NSwgMHhDQSwgMHg3NiwgMHhDQSwgMHg3NywgMHhDQSwgMHg3OCwgLyogMHg0Qy0weDRGICovCisJMHhDQSwgMHg3OSwgMHhDQSwgMHg3QSwgMHhDQSwgMHg3QiwgMHhDQSwgMHg3QywgLyogMHg1MC0weDUzICovCisJMHhDQSwgMHg3RCwgMHhDQSwgMHg3RSwgMHhERSwgMHhBMSwgMHhDQSwgMHg4MCwgLyogMHg1NC0weDU3ICovCisJMHhDQSwgMHg4MSwgMHhERSwgMHhBNSwgMHhDQSwgMHg4MiwgMHhDQSwgMHg4MywgLyogMHg1OC0weDVCICovCisJMHhDQSwgMHg4NCwgMHhDQSwgMHg4NSwgMHhERSwgMHhBOSwgMHhDQSwgMHg4NiwgLyogMHg1Qy0weDVGICovCisJMHhDQSwgMHg4NywgMHhDQSwgMHg4OCwgMHhDQSwgMHg4OSwgMHhDQSwgMHg4QSwgLyogMHg2MC0weDYzICovCisJMHhERSwgMHhBOCwgMHhDQSwgMHg4QiwgMHhDQSwgMHg4QywgMHhDQSwgMHg4RCwgLyogMHg2NC0weDY3ICovCisJMHhERSwgMHhBNywgMHhDQSwgMHg4RSwgMHhDQSwgMHg4RiwgMHhDQSwgMHg5MCwgLyogMHg2OC0weDZCICovCisJMHhDQSwgMHg5MSwgMHhDQSwgMHg5MiwgMHhDQSwgMHg5MywgMHhDQSwgMHg5NCwgLyogMHg2Qy0weDZGICovCisJMHhDQSwgMHg5NSwgMHhDQSwgMHg5NiwgMHhERSwgMHhBRCwgMHhDQSwgMHg5NywgLyogMHg3MC0weDczICovCisJMHhENCwgMHhDQywgMHhDQSwgMHg5OCwgMHhDQSwgMHg5OSwgMHhDQSwgMHg5QSwgLyogMHg3NC0weDc3ICovCisJMHhDQSwgMHg5QiwgMHhERSwgMHhCMywgMHhERSwgMHhBQSwgMHhERSwgMHhBRSwgLyogMHg3OC0weDdCICovCisJMHhDQSwgMHg5QywgMHhDQSwgMHg5RCwgMHhDMCwgMHhEOSwgMHhDQSwgMHg5RSwgLyogMHg3Qy0weDdGICovCisJCisJMHhDQSwgMHg5RiwgMHhDQSwgMHhBMCwgMHhDQiwgMHg0MCwgMHhDQiwgMHg0MSwgLyogMHg4MC0weDgzICovCisJMHhCMSwgMHhBMSwgMHhERSwgMHhCNiwgMHhDQiwgMHg0MiwgMHhERSwgMHhCMSwgLyogMHg4NC0weDg3ICovCisJMHhDQiwgMHg0MywgMHhDQiwgMHg0NCwgMHhDQiwgMHg0NSwgMHhDQiwgMHg0NiwgLyogMHg4OC0weDhCICovCisJMHhDQiwgMHg0NywgMHhDQiwgMHg0OCwgMHhDQiwgMHg0OSwgMHhERSwgMHhCMiwgLyogMHg4Qy0weDhGICovCisJMHhDQiwgMHg0QSwgMHhDQiwgMHg0QiwgMHhDQiwgMHg0QywgMHhDQiwgMHg0RCwgLyogMHg5MC0weDkzICovCisJMHhDQiwgMHg0RSwgMHhDQiwgMHg0RiwgMHhDQiwgMHg1MCwgMHhDQiwgMHg1MSwgLyogMHg5NC0weDk3ICovCisJMHhDQiwgMHg1MiwgMHhDQiwgMHg1MywgMHhDQiwgMHg1NCwgMHhEMSwgMHhBNiwgLyogMHg5OC0weDlCICovCisJMHhERSwgMHhCNSwgMHhDQiwgMHg1NSwgMHhDQiwgMHg1NiwgMHhDQiwgMHg1NywgLyogMHg5Qy0weDlGICovCisJMHhDQiwgMHg1OCwgMHhDQiwgMHg1OSwgMHhDQiwgMHg1QSwgMHhDQiwgMHg1QiwgLyogMHhBMC0weEEzICovCisJMHhERSwgMHhBRiwgMHhDQiwgMHg1QywgMHhDQiwgMHg1RCwgMHhDQiwgMHg1RSwgLyogMHhBNC0weEE3ICovCisJMHhERSwgMHhCMCwgMHhDQiwgMHg1RiwgMHhEMCwgMHhCRCwgMHhDQiwgMHg2MCwgLyogMHhBOC0weEFCICovCisJMHhDQiwgMHg2MSwgMHhDQiwgMHg2MiwgMHhERSwgMHhCNCwgMHhDQSwgMHhFRCwgLyogMHhBQy0weEFGICovCisJMHhERSwgMHhCOSwgMHhDQiwgMHg2MywgMHhDQiwgMHg2NCwgMHhDQiwgMHg2NSwgLyogMHhCMC0weEIzICovCisJMHhDQiwgMHg2NiwgMHhDQiwgMHg2NywgMHhDQiwgMHg2OCwgMHhERSwgMHhCOCwgLyogMHhCNC0weEI3ICovCisJMHhDQiwgMHg2OSwgMHhERSwgMHhCNywgMHhDQiwgMHg2QSwgMHhDQiwgMHg2QiwgLyogMHhCOC0weEJCICovCisJMHhDQiwgMHg2QywgMHhDQiwgMHg2RCwgMHhDQiwgMHg2RSwgMHhDQiwgMHg2RiwgLyogMHhCQy0weEJGICovCisJMHhDQiwgMHg3MCwgMHhERSwgMHhCQiwgMHhDQiwgMHg3MSwgMHhDQiwgMHg3MiwgLyogMHhDMC0weEMzICovCisJMHhDQiwgMHg3MywgMHhDQiwgMHg3NCwgMHhDQiwgMHg3NSwgMHhDQiwgMHg3NiwgLyogMHhDNC0weEM3ICovCisJMHhDQiwgMHg3NywgMHhCRCwgMHhFNSwgMHhDQiwgMHg3OCwgMHhDQiwgMHg3OSwgLyogMHhDOC0weENCICovCisJMHhDQiwgMHg3QSwgMHhDQiwgMHg3QiwgMHhDQiwgMHg3QywgMHhCMiwgMHhEOCwgLyogMHhDQy0weENGICovCisJMHhDMywgMHhFQSwgMHhDQiwgMHg3RCwgMHhDQiwgMHg3RSwgMHhERSwgMHhCQSwgLyogMHhEMC0weEQzICovCisJMHhDQiwgMHg4MCwgMHhDNSwgMHhCQSwgMHhDQiwgMHg4MSwgMHhDQiwgMHg4MiwgLyogMHhENC0weEQ3ICovCisJMHhDQiwgMHg4MywgMHhDQiwgMHg4NCwgMHhDQiwgMHg4NSwgMHhDQiwgMHg4NiwgLyogMHhEOC0weERCICovCisJMHhERSwgMHhCQywgMHhDQiwgMHg4NywgMHhDQiwgMHg4OCwgMHhDQiwgMHg4OSwgLyogMHhEQy0weERGICovCisJMHhDQiwgMHg4QSwgMHhDQiwgMHg4QiwgMHhDQiwgMHg4QywgMHhDQiwgMHg4RCwgLyogMHhFMC0weEUzICovCisJMHhDQywgMHhEOSwgMHhDQiwgMHg4RSwgMHhDQiwgMHg4RiwgMHhDQiwgMHg5MCwgLyogMHhFNC0weEU3ICovCisJMHhDQiwgMHg5MSwgMHhCNywgMHhBQSwgMHhDQiwgMHg5MiwgMHhDQiwgMHg5MywgLyogMHhFOC0weEVCICovCisJMHhDQiwgMHg5NCwgMHhDQiwgMHg5NSwgMHhDQiwgMHg5NiwgMHhDQiwgMHg5NywgLyogMHhFQy0weEVGICovCisJMHhDQiwgMHg5OCwgMHhDQiwgMHg5OSwgMHhDQiwgMHg5QSwgMHhDQiwgMHg5QiwgLyogMHhGMC0weEYzICovCisJMHhDQiwgMHg5QywgMHhDQiwgMHg5RCwgMHhDQiwgMHg5RSwgMHhDQiwgMHg5RiwgLyogMHhGNC0weEY3ICovCisJMHhDQiwgMHhBMCwgMHhDQywgMHg0MCwgMHhDQywgMHg0MSwgMHhENCwgMHhFNSwgLyogMHhGOC0weEZCICovCisJMHhDQywgMHg0MiwgMHhDQywgMHg0MywgMHhDQywgMHg0NCwgMHhERSwgMHhCRCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODZbNTEyXSA9IHsKKwkweENDLCAweDQ1LCAweENDLCAweDQ2LCAweENDLCAweDQ3LCAweENDLCAweDQ4LCAvKiAweDAwLTB4MDMgKi8KKwkweENDLCAweDQ5LCAweERFLCAweEJGLCAweENDLCAweDRBLCAweENDLCAweDRCLCAvKiAweDA0LTB4MDcgKi8KKwkweENDLCAweDRDLCAweENDLCAweDRELCAweENDLCAweDRFLCAweENDLCAweDRGLCAvKiAweDA4LTB4MEIgKi8KKwkweENDLCAweDUwLCAweENDLCAweDUxLCAweENDLCAweDUyLCAweENDLCAweDUzLCAvKiAweDBDLTB4MEYgKi8KKwkweENDLCAweDU0LCAweEM0LCAweEEyLCAweENDLCAweDU1LCAweENDLCAweDU2LCAvKiAweDEwLTB4MTMgKi8KKwkweENDLCAweDU3LCAweENDLCAweDU4LCAweERFLCAweEMxLCAweENDLCAweDU5LCAvKiAweDE0LTB4MTcgKi8KKwkweENDLCAweDVBLCAweENDLCAweDVCLCAweENDLCAweDVDLCAweENDLCAweDVELCAvKiAweDE4LTB4MUIgKi8KKwkweENDLCAweDVFLCAweENDLCAweDVGLCAweENDLCAweDYwLCAweENDLCAweDYxLCAvKiAweDFDLTB4MUYgKi8KKwkweENDLCAweDYyLCAweENDLCAweDYzLCAweENDLCAweDY0LCAweENDLCAweDY1LCAvKiAweDIwLTB4MjMgKi8KKwkweENDLCAweDY2LCAweENDLCAweDY3LCAweENDLCAweDY4LCAweERFLCAweEJFLCAvKiAweDI0LTB4MjcgKi8KKwkweENDLCAweDY5LCAweERFLCAweEMwLCAweENDLCAweDZBLCAweENDLCAweDZCLCAvKiAweDI4LTB4MkIgKi8KKwkweENDLCAweDZDLCAweENDLCAweDZELCAweENDLCAweDZFLCAweENDLCAweDZGLCAvKiAweDJDLTB4MkYgKi8KKwkweENDLCAweDcwLCAweENDLCAweDcxLCAweENDLCAweDcyLCAweENDLCAweDczLCAvKiAweDMwLTB4MzMgKi8KKwkweENDLCAweDc0LCAweENDLCAweDc1LCAweENDLCAweDc2LCAweENDLCAweDc3LCAvKiAweDM0LTB4MzcgKi8KKwkweEQ1LCAweEJBLCAweENDLCAweDc4LCAweENDLCAweDc5LCAweENDLCAweDdBLCAvKiAweDM4LTB4M0IgKi8KKwkweERFLCAweEMyLCAweENDLCAweDdCLCAweENDLCAweDdDLCAweENDLCAweDdELCAvKiAweDNDLTB4M0YgKi8KKwkweENDLCAweDdFLCAweENDLCAweDgwLCAweENDLCAweDgxLCAweENDLCAweDgyLCAvKiAweDQwLTB4NDMgKi8KKwkweENDLCAweDgzLCAweENDLCAweDg0LCAweENDLCAweDg1LCAweENDLCAweDg2LCAvKiAweDQ0LTB4NDcgKi8KKwkweENDLCAweDg3LCAweENDLCAweDg4LCAweENDLCAweDg5LCAweENDLCAweDhBLCAvKiAweDQ4LTB4NEIgKi8KKwkweENDLCAweDhCLCAweEYyLCAweEFFLCAweEJCLCAweEEyLCAweEMyLCAweEIyLCAvKiAweDRDLTB4NEYgKi8KKwkweEM1LCAweEIwLCAweEMyLCAweEM3LCAweENDLCAweDhDLCAweENDLCAweDhELCAvKiAweDUwLTB4NTMgKi8KKwkweEYyLCAweEFGLCAweENDLCAweDhFLCAweENDLCAweDhGLCAweENDLCAweDkwLCAvKiAweDU0LTB4NTcgKi8KKwkweENDLCAweDkxLCAweENDLCAweDkyLCAweEQwLCAweEU5LCAweENDLCAweDkzLCAvKiAweDU4LTB4NUIgKi8KKwkweENDLCAweDk0LCAweENDLCAweDk1LCAweEQzLCAweERELCAweENDLCAweDk2LCAvKiAweDVDLTB4NUYgKi8KKwkweENDLCAweDk3LCAweENDLCAweDk4LCAweEVCLCAweEJELCAweENDLCAweDk5LCAvKiAweDYwLTB4NjMgKi8KKwkweENDLCAweDlBLCAweENDLCAweDlCLCAweENDLCAweDlDLCAweENDLCAweDlELCAvKiAweDY0LTB4NjcgKi8KKwkweENDLCAweDlFLCAweENDLCAweDlGLCAweENDLCAweEEwLCAweEIzLCAweEU2LCAvKiAweDY4LTB4NkIgKi8KKwkweEYyLCAweEIwLCAweENELCAweDQwLCAweEYyLCAweEIxLCAweENELCAweDQxLCAvKiAweDZDLTB4NkYgKi8KKwkweENELCAweDQyLCAweENBLCAweEFELCAweENELCAweDQzLCAweENELCAweDQ0LCAvKiAweDcwLTB4NzMgKi8KKwkweENELCAweDQ1LCAweENELCAweDQ2LCAweENELCAweDQ3LCAweENELCAweDQ4LCAvKiAweDc0LTB4NzcgKi8KKwkweENELCAweDQ5LCAweEJBLCAweEU3LCAweEYyLCAweEIzLCAweEYyLCAweEI1LCAvKiAweDc4LTB4N0IgKi8KKwkweEYyLCAweEI0LCAweENCLCAweEU0LCAweENGLCAweEJBLCAweEYyLCAweEIyLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweENBLCAweEI0LCAweEQyLCAweENGLCAweEMyLCAweEVDLCAweENELCAweDRBLCAvKiAweDgwLTB4ODMgKi8KKwkweENELCAweDRCLCAweENELCAweDRDLCAweENELCAweDRELCAweENELCAweDRFLCAvKiAweDg0LTB4ODcgKi8KKwkweENELCAweDRGLCAweENELCAweDUwLCAweENFLCAweEMzLCAweEYyLCAweEI4LCAvKiAweDg4LTB4OEIgKi8KKwkweEIwLCAweEY2LCAweEYyLCAweEI3LCAweENELCAweDUxLCAweENELCAweDUyLCAvKiAweDhDLTB4OEYgKi8KKwkweENELCAweDUzLCAweENELCAweDU0LCAweENELCAweDU1LCAweEYyLCAweEJFLCAvKiAweDkwLTB4OTMgKi8KKwkweENELCAweDU2LCAweEIyLCAweENGLCAweENELCAweDU3LCAweENELCAweDU4LCAvKiAweDk0LTB4OTcgKi8KKwkweENELCAweDU5LCAweENELCAweDVBLCAweENELCAweDVCLCAweENELCAweDVDLCAvKiAweDk4LTB4OUIgKi8KKwkweEQxLCAweEMxLCAweEYyLCAweEJBLCAweENELCAweDVELCAweENELCAweDVFLCAvKiAweDlDLTB4OUYgKi8KKwkweENELCAweDVGLCAweENELCAweDYwLCAweENELCAweDYxLCAweEYyLCAweEJDLCAvKiAweEEwLTB4QTMgKi8KKwkweEQ0LCAweEU5LCAweENELCAweDYyLCAweENELCAweDYzLCAweEYyLCAweEJCLCAvKiAweEE0LTB4QTcgKi8KKwkweEYyLCAweEI2LCAweEYyLCAweEJGLCAweEYyLCAweEJELCAweENELCAweDY0LCAvKiAweEE4LTB4QUIgKi8KKwkweEYyLCAweEI5LCAweENELCAweDY1LCAweENELCAweDY2LCAweEYyLCAweEM3LCAvKiAweEFDLTB4QUYgKi8KKwkweEYyLCAweEM0LCAweEYyLCAweEM2LCAweENELCAweDY3LCAweENELCAweDY4LCAvKiAweEIwLTB4QjMgKi8KKwkweEYyLCAweENBLCAweEYyLCAweEMyLCAweEYyLCAweEMwLCAweENELCAweDY5LCAvKiAweEI0LTB4QjcgKi8KKwkweENELCAweDZBLCAweENELCAweDZCLCAweEYyLCAweEM1LCAweENELCAweDZDLCAvKiAweEI4LTB4QkIgKi8KKwkweENELCAweDZELCAweENELCAweDZFLCAweENELCAweDZGLCAweENELCAweDcwLCAvKiAweEJDLTB4QkYgKi8KKwkweEQ2LCAweEZCLCAweENELCAweDcxLCAweENELCAweDcyLCAweENELCAweDczLCAvKiAweEMwLTB4QzMgKi8KKwkweEYyLCAweEMxLCAweENELCAweDc0LCAweEM3LCAweEY5LCAweEM5LCAweERGLCAvKiAweEM0LTB4QzcgKi8KKwkweENELCAweDc1LCAweEYyLCAweEM4LCAweEI5LCAweEM2LCAweEI1LCAweEIwLCAvKiAweEM4LTB4Q0IgKi8KKwkweENELCAweDc2LCAweENELCAweDc3LCAweEYyLCAweEMzLCAweEYyLCAweEM5LCAvKiAweENDLTB4Q0YgKi8KKwkweEYyLCAweEQwLCAweEYyLCAweEQ2LCAweENELCAweDc4LCAweENELCAweDc5LCAvKiAweEQwLTB4RDMgKi8KKwkweEJCLCAweEQ3LCAweENELCAweDdBLCAweENELCAweDdCLCAweENELCAweDdDLCAvKiAweEQ0LTB4RDcgKi8KKwkweEYyLCAweEQ1LCAweENELCAweERDLCAweENELCAweDdELCAweEQ2LCAweEVCLCAvKiAweEQ4LTB4REIgKi8KKwkweENELCAweDdFLCAweENELCAweDgwLCAweEYyLCAweEQyLCAweEYyLCAweEQ0LCAvKiAweERDLTB4REYgKi8KKwkweENELCAweDgxLCAweENELCAweDgyLCAweENELCAweDgzLCAweENELCAweDg0LCAvKiAweEUwLTB4RTMgKi8KKwkweEI4LCAweEYyLCAweENELCAweDg1LCAweENELCAweDg2LCAweENELCAweDg3LCAvKiAweEU0LTB4RTcgKi8KKwkweENELCAweDg4LCAweEYyLCAweENCLCAweENELCAweDg5LCAweENELCAweDhBLCAvKiAweEU4LTB4RUIgKi8KKwkweENELCAweDhCLCAweEYyLCAweENFLCAweEMyLCAweEY5LCAweENELCAweDhDLCAvKiAweEVDLTB4RUYgKi8KKwkweEQ1LCAweERELCAweEYyLCAweENDLCAweEYyLCAweENELCAweEYyLCAweENGLCAvKiAweEYwLTB4RjMgKi8KKwkweEYyLCAweEQzLCAweENELCAweDhELCAweENELCAweDhFLCAweENELCAweDhGLCAvKiAweEY0LTB4RjcgKi8KKwkweEYyLCAweEQ5LCAweEQzLCAweEJDLCAweENELCAweDkwLCAweENELCAweDkxLCAvKiAweEY4LTB4RkIgKi8KKwkweENELCAweDkyLCAweENELCAweDkzLCAweEI2LCAweEVBLCAweENELCAweDk0LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184N1s1MTJdID0geworCTB4Q0EsIDB4RjEsIDB4Q0QsIDB4OTUsIDB4QjcsIDB4RTQsIDB4RjIsIDB4RDcsIC8qIDB4MDAtMHgwMyAqLworCTB4Q0QsIDB4OTYsIDB4Q0QsIDB4OTcsIDB4Q0QsIDB4OTgsIDB4RjIsIDB4RDgsIC8qIDB4MDQtMHgwNyAqLworCTB4RjIsIDB4REEsIDB4RjIsIDB4REQsIDB4RjIsIDB4REIsIDB4Q0QsIDB4OTksIC8qIDB4MDgtMHgwQiAqLworCTB4Q0QsIDB4OUEsIDB4RjIsIDB4REMsIDB4Q0QsIDB4OUIsIDB4Q0QsIDB4OUMsIC8qIDB4MEMtMHgwRiAqLworCTB4Q0QsIDB4OUQsIDB4Q0QsIDB4OUUsIDB4RDEsIDB4RDEsIDB4RjIsIDB4RDEsIC8qIDB4MTAtMHgxMyAqLworCTB4Q0QsIDB4OUYsIDB4Q0QsIDB4QzksIDB4Q0QsIDB4QTAsIDB4Q0UsIDB4Q0YsIC8qIDB4MTQtMHgxNyAqLworCTB4RDYsIDB4QTksIDB4Q0UsIDB4NDAsIDB4RjIsIDB4RTMsIDB4Q0UsIDB4NDEsIC8qIDB4MTgtMHgxQiAqLworCTB4QzMsIDB4REIsIDB4Q0UsIDB4NDIsIDB4RjIsIDB4RTAsIDB4Q0UsIDB4NDMsIC8qIDB4MUMtMHgxRiAqLworCTB4Q0UsIDB4NDQsIDB4QzAsIDB4QUYsIDB4RjIsIDB4RUMsIDB4RjIsIDB4REUsIC8qIDB4MjAtMHgyMyAqLworCTB4Q0UsIDB4NDUsIDB4RjIsIDB4RTEsIDB4Q0UsIDB4NDYsIDB4Q0UsIDB4NDcsIC8qIDB4MjQtMHgyNyAqLworCTB4Q0UsIDB4NDgsIDB4RjIsIDB4RTgsIDB4Q0UsIDB4NDksIDB4Q0UsIDB4NEEsIC8qIDB4MjgtMHgyQiAqLworCTB4Q0UsIDB4NEIsIDB4Q0UsIDB4NEMsIDB4RjIsIDB4RTIsIDB4Q0UsIDB4NEQsIC8qIDB4MkMtMHgyRiAqLworCTB4Q0UsIDB4NEUsIDB4RjIsIDB4RTcsIDB4Q0UsIDB4NEYsIDB4Q0UsIDB4NTAsIC8qIDB4MzAtMHgzMyAqLworCTB4RjIsIDB4RTYsIDB4Q0UsIDB4NTEsIDB4Q0UsIDB4NTIsIDB4RjIsIDB4RTksIC8qIDB4MzQtMHgzNyAqLworCTB4Q0UsIDB4NTMsIDB4Q0UsIDB4NTQsIDB4Q0UsIDB4NTUsIDB4RjIsIDB4REYsIC8qIDB4MzgtMHgzQiAqLworCTB4Q0UsIDB4NTYsIDB4Q0UsIDB4NTcsIDB4RjIsIDB4RTQsIDB4RjIsIDB4RUEsIC8qIDB4M0MtMHgzRiAqLworCTB4Q0UsIDB4NTgsIDB4Q0UsIDB4NTksIDB4Q0UsIDB4NUEsIDB4Q0UsIDB4NUIsIC8qIDB4NDAtMHg0MyAqLworCTB4Q0UsIDB4NUMsIDB4Q0UsIDB4NUQsIDB4Q0UsIDB4NUUsIDB4RDMsIDB4QUMsIC8qIDB4NDQtMHg0NyAqLworCTB4RjIsIDB4RTUsIDB4QjIsIDB4RjUsIDB4Q0UsIDB4NUYsIDB4Q0UsIDB4NjAsIC8qIDB4NDgtMHg0QiAqLworCTB4RjIsIDB4RjIsIDB4Q0UsIDB4NjEsIDB4RDAsIDB4QUIsIDB4Q0UsIDB4NjIsIC8qIDB4NEMtMHg0RiAqLworCTB4Q0UsIDB4NjMsIDB4Q0UsIDB4NjQsIDB4Q0UsIDB4NjUsIDB4RjIsIDB4RjUsIC8qIDB4NTAtMHg1MyAqLworCTB4Q0UsIDB4NjYsIDB4Q0UsIDB4NjcsIDB4Q0UsIDB4NjgsIDB4QkIsIDB4QzgsIC8qIDB4NTQtMHg1NyAqLworCTB4Q0UsIDB4NjksIDB4RjIsIDB4RjksIDB4Q0UsIDB4NkEsIDB4Q0UsIDB4NkIsIC8qIDB4NTgtMHg1QiAqLworCTB4Q0UsIDB4NkMsIDB4Q0UsIDB4NkQsIDB4Q0UsIDB4NkUsIDB4Q0UsIDB4NkYsIC8qIDB4NUMtMHg1RiAqLworCTB4RjIsIDB4RjAsIDB4Q0UsIDB4NzAsIDB4Q0UsIDB4NzEsIDB4RjIsIDB4RjYsIC8qIDB4NjAtMHg2MyAqLworCTB4RjIsIDB4RjgsIDB4RjIsIDB4RkEsIDB4Q0UsIDB4NzIsIDB4Q0UsIDB4NzMsIC8qIDB4NjQtMHg2NyAqLworCTB4Q0UsIDB4NzQsIDB4Q0UsIDB4NzUsIDB4Q0UsIDB4NzYsIDB4Q0UsIDB4NzcsIC8qIDB4NjgtMHg2QiAqLworCTB4Q0UsIDB4NzgsIDB4Q0UsIDB4NzksIDB4RjIsIDB4RjMsIDB4Q0UsIDB4N0EsIC8qIDB4NkMtMHg2RiAqLworCTB4RjIsIDB4RjEsIDB4Q0UsIDB4N0IsIDB4Q0UsIDB4N0MsIDB4Q0UsIDB4N0QsIC8qIDB4NzAtMHg3MyAqLworCTB4QkEsIDB4RkIsIDB4Q0UsIDB4N0UsIDB4QjUsIDB4RkIsIDB4Q0UsIDB4ODAsIC8qIDB4NzQtMHg3NyAqLworCTB4Q0UsIDB4ODEsIDB4Q0UsIDB4ODIsIDB4Q0UsIDB4ODMsIDB4RjIsIDB4RUYsIC8qIDB4NzgtMHg3QiAqLworCTB4RjIsIDB4RjcsIDB4RjIsIDB4RUQsIDB4RjIsIDB4RUUsIDB4Q0UsIDB4ODQsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4Q0UsIDB4ODUsIDB4Q0UsIDB4ODYsIDB4RjIsIDB4RUIsIDB4RjMsIDB4QTYsIC8qIDB4ODAtMHg4MyAqLworCTB4Q0UsIDB4ODcsIDB4RjMsIDB4QTMsIDB4Q0UsIDB4ODgsIDB4Q0UsIDB4ODksIC8qIDB4ODQtMHg4NyAqLworCTB4RjMsIDB4QTIsIDB4Q0UsIDB4OEEsIDB4Q0UsIDB4OEIsIDB4RjIsIDB4RjQsIC8qIDB4ODgtMHg4QiAqLworCTB4Q0UsIDB4OEMsIDB4QzgsIDB4REEsIDB4Q0UsIDB4OEQsIDB4Q0UsIDB4OEUsIC8qIDB4OEMtMHg4RiAqLworCTB4Q0UsIDB4OEYsIDB4Q0UsIDB4OTAsIDB4Q0UsIDB4OTEsIDB4RjIsIDB4RkIsIC8qIDB4OTAtMHg5MyAqLworCTB4Q0UsIDB4OTIsIDB4Q0UsIDB4OTMsIDB4Q0UsIDB4OTQsIDB4RjMsIDB4QTUsIC8qIDB4OTQtMHg5NyAqLworCTB4Q0UsIDB4OTUsIDB4Q0UsIDB4OTYsIDB4Q0UsIDB4OTcsIDB4Q0UsIDB4OTgsIC8qIDB4OTgtMHg5QiAqLworCTB4Q0UsIDB4OTksIDB4Q0UsIDB4OUEsIDB4Q0UsIDB4OUIsIDB4QzMsIDB4RjgsIC8qIDB4OUMtMHg5RiAqLworCTB4Q0UsIDB4OUMsIDB4Q0UsIDB4OUQsIDB4Q0UsIDB4OUUsIDB4Q0UsIDB4OUYsIC8qIDB4QTAtMHhBMyAqLworCTB4Q0UsIDB4QTAsIDB4Q0YsIDB4NDAsIDB4Q0YsIDB4NDEsIDB4Q0YsIDB4NDIsIC8qIDB4QTQtMHhBNyAqLworCTB4RjIsIDB4RkQsIDB4Q0YsIDB4NDMsIDB4Q0YsIDB4NDQsIDB4RjMsIDB4QTcsIC8qIDB4QTgtMHhBQiAqLworCTB4RjMsIDB4QTksIDB4RjMsIDB4QTQsIDB4Q0YsIDB4NDUsIDB4RjIsIDB4RkMsIC8qIDB4QUMtMHhBRiAqLworCTB4Q0YsIDB4NDYsIDB4Q0YsIDB4NDcsIDB4Q0YsIDB4NDgsIDB4RjMsIDB4QUIsIC8qIDB4QjAtMHhCMyAqLworCTB4Q0YsIDB4NDksIDB4RjMsIDB4QUEsIDB4Q0YsIDB4NEEsIDB4Q0YsIDB4NEIsIC8qIDB4QjQtMHhCNyAqLworCTB4Q0YsIDB4NEMsIDB4Q0YsIDB4NEQsIDB4QzIsIDB4REQsIDB4Q0YsIDB4NEUsIC8qIDB4QjgtMHhCQiAqLworCTB4Q0YsIDB4NEYsIDB4RjMsIDB4QUUsIDB4Q0YsIDB4NTAsIDB4Q0YsIDB4NTEsIC8qIDB4QkMtMHhCRiAqLworCTB4RjMsIDB4QjAsIDB4Q0YsIDB4NTIsIDB4Q0YsIDB4NTMsIDB4Q0YsIDB4NTQsIC8qIDB4QzAtMHhDMyAqLworCTB4Q0YsIDB4NTUsIDB4Q0YsIDB4NTYsIDB4RjMsIDB4QTEsIDB4Q0YsIDB4NTcsIC8qIDB4QzQtMHhDNyAqLworCTB4Q0YsIDB4NTgsIDB4Q0YsIDB4NTksIDB4RjMsIDB4QjEsIDB4RjMsIDB4QUMsIC8qIDB4QzgtMHhDQiAqLworCTB4Q0YsIDB4NUEsIDB4Q0YsIDB4NUIsIDB4Q0YsIDB4NUMsIDB4Q0YsIDB4NUQsIC8qIDB4Q0MtMHhDRiAqLworCTB4Q0YsIDB4NUUsIDB4RjMsIDB4QUYsIDB4RjIsIDB4RkUsIDB4RjMsIDB4QUQsIC8qIDB4RDAtMHhEMyAqLworCTB4Q0YsIDB4NUYsIDB4Q0YsIDB4NjAsIDB4Q0YsIDB4NjEsIDB4Q0YsIDB4NjIsIC8qIDB4RDQtMHhENyAqLworCTB4Q0YsIDB4NjMsIDB4Q0YsIDB4NjQsIDB4Q0YsIDB4NjUsIDB4RjMsIDB4QjIsIC8qIDB4RDgtMHhEQiAqLworCTB4Q0YsIDB4NjYsIDB4Q0YsIDB4NjcsIDB4Q0YsIDB4NjgsIDB4Q0YsIDB4NjksIC8qIDB4REMtMHhERiAqLworCTB4RjMsIDB4QjQsIDB4Q0YsIDB4NkEsIDB4Q0YsIDB4NkIsIDB4Q0YsIDB4NkMsIC8qIDB4RTAtMHhFMyAqLworCTB4Q0YsIDB4NkQsIDB4RjMsIDB4QTgsIDB4Q0YsIDB4NkUsIDB4Q0YsIDB4NkYsIC8qIDB4RTQtMHhFNyAqLworCTB4Q0YsIDB4NzAsIDB4Q0YsIDB4NzEsIDB4RjMsIDB4QjMsIDB4Q0YsIDB4NzIsIC8qIDB4RTgtMHhFQiAqLworCTB4Q0YsIDB4NzMsIDB4Q0YsIDB4NzQsIDB4RjMsIDB4QjUsIDB4Q0YsIDB4NzUsIC8qIDB4RUMtMHhFRiAqLworCTB4Q0YsIDB4NzYsIDB4Q0YsIDB4NzcsIDB4Q0YsIDB4NzgsIDB4Q0YsIDB4NzksIC8qIDB4RjAtMHhGMyAqLworCTB4Q0YsIDB4N0EsIDB4Q0YsIDB4N0IsIDB4Q0YsIDB4N0MsIDB4Q0YsIDB4N0QsIC8qIDB4RjQtMHhGNyAqLworCTB4Q0YsIDB4N0UsIDB4RDAsIDB4QjcsIDB4Q0YsIDB4ODAsIDB4Q0YsIDB4ODEsIC8qIDB4RjgtMHhGQiAqLworCTB4Q0YsIDB4ODIsIDB4Q0YsIDB4ODMsIDB4RjMsIDB4QjgsIDB4Q0YsIDB4ODQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzg4WzUxMl0gPSB7CisJMHhDRiwgMHg4NSwgMHhDRiwgMHg4NiwgMHhDRiwgMHg4NywgMHhEOSwgMHhGOSwgLyogMHgwMC0weDAzICovCisJMHhDRiwgMHg4OCwgMHhDRiwgMHg4OSwgMHhDRiwgMHg4QSwgMHhDRiwgMHg4QiwgLyogMHgwNC0weDA3ICovCisJMHhDRiwgMHg4QywgMHhDRiwgMHg4RCwgMHhGMywgMHhCOSwgMHhDRiwgMHg4RSwgLyogMHgwOC0weDBCICovCisJMHhDRiwgMHg4RiwgMHhDRiwgMHg5MCwgMHhDRiwgMHg5MSwgMHhDRiwgMHg5MiwgLyogMHgwQy0weDBGICovCisJMHhDRiwgMHg5MywgMHhDRiwgMHg5NCwgMHhDRiwgMHg5NSwgMHhGMywgMHhCNywgLyogMHgxMC0weDEzICovCisJMHhDRiwgMHg5NiwgMHhDOCwgMHhFNCwgMHhGMywgMHhCNiwgMHhDRiwgMHg5NywgLyogMHgxNC0weDE3ICovCisJMHhDRiwgMHg5OCwgMHhDRiwgMHg5OSwgMHhDRiwgMHg5QSwgMHhGMywgMHhCQSwgLyogMHgxOC0weDFCICovCisJMHhDRiwgMHg5QiwgMHhDRiwgMHg5QywgMHhDRiwgMHg5RCwgMHhDRiwgMHg5RSwgLyogMHgxQy0weDFGICovCisJMHhDRiwgMHg5RiwgMHhGMywgMHhCQiwgMHhCNCwgMHhDMCwgMHhDRiwgMHhBMCwgLyogMHgyMC0weDIzICovCisJMHhEMCwgMHg0MCwgMHhEMCwgMHg0MSwgMHhEMCwgMHg0MiwgMHhEMCwgMHg0MywgLyogMHgyNC0weDI3ICovCisJMHhEMCwgMHg0NCwgMHhEMCwgMHg0NSwgMHhEMCwgMHg0NiwgMHhEMCwgMHg0NywgLyogMHgyOC0weDJCICovCisJMHhEMCwgMHg0OCwgMHhEMCwgMHg0OSwgMHhEMCwgMHg0QSwgMHhEMCwgMHg0QiwgLyogMHgyQy0weDJGICovCisJMHhEMCwgMHg0QywgMHhEMCwgMHg0RCwgMHhFRSwgMHhDMywgMHhEMCwgMHg0RSwgLyogMHgzMC0weDMzICovCisJMHhEMCwgMHg0RiwgMHhEMCwgMHg1MCwgMHhEMCwgMHg1MSwgMHhEMCwgMHg1MiwgLyogMHgzNC0weDM3ICovCisJMHhEMCwgMHg1MywgMHhGMywgMHhCQywgMHhEMCwgMHg1NCwgMHhEMCwgMHg1NSwgLyogMHgzOC0weDNCICovCisJMHhGMywgMHhCRCwgMHhEMCwgMHg1NiwgMHhEMCwgMHg1NywgMHhEMCwgMHg1OCwgLyogMHgzQy0weDNGICovCisJMHhEMSwgMHhBQSwgMHhEMCwgMHg1OSwgMHhEMCwgMHg1QSwgMHhEMCwgMHg1QiwgLyogMHg0MC0weDQzICovCisJMHhGNCwgMHhBQywgMHhEMCwgMHhDNiwgMHhEMCwgMHg1QywgMHhEMCwgMHg1RCwgLyogMHg0NC0weDQ3ICovCisJMHhEMCwgMHg1RSwgMHhEMCwgMHg1RiwgMHhEMCwgMHg2MCwgMHhEMCwgMHg2MSwgLyogMHg0OC0weDRCICovCisJMHhEMCwgMHhEMCwgMHhEMSwgMHhEQywgMHhEMCwgMHg2MiwgMHhEMCwgMHg2MywgLyogMHg0Qy0weDRGICovCisJMHhEMCwgMHg2NCwgMHhEMCwgMHg2NSwgMHhEMCwgMHg2NiwgMHhEMCwgMHg2NywgLyogMHg1MC0weDUzICovCisJMHhDRiwgMHhDRSwgMHhEMCwgMHg2OCwgMHhEMCwgMHg2OSwgMHhCRCwgMHhENiwgLyogMHg1NC0weDU3ICovCisJMHhEMCwgMHg2QSwgMHhEMSwgMHhDMywgMHhEMCwgMHg2QiwgMHhEMCwgMHg2QywgLyogMHg1OC0weDVCICovCisJMHhEMCwgMHg2RCwgMHhEMCwgMHg2RSwgMHhEMCwgMHg2RiwgMHhEMCwgMHg3MCwgLyogMHg1Qy0weDVGICovCisJMHhEMCwgMHg3MSwgMHhCQSwgMHhFMiwgMHhFMSwgMHhFOSwgMHhEMiwgMHhDMiwgLyogMHg2MC0weDYzICovCisJMHhGMSwgMHhDMiwgMHhCMiwgMHhCOSwgMHhEMCwgMHg3MiwgMHhEMCwgMHg3MywgLyogMHg2NC0weDY3ICovCisJMHhCMSwgMHhFRCwgMHhGMSwgMHhDMywgMHhEMCwgMHg3NCwgMHhDOSwgMHhDMCwgLyogMHg2OC0weDZCICovCisJMHhCMywgMHhDNCwgMHhEMCwgMHg3NSwgMHhEOSwgMHhGMiwgMHhEMCwgMHg3NiwgLyogMHg2Qy0weDZGICovCisJMHhDQiwgMHhBNSwgMHhEMCwgMHg3NywgMHhGMSwgMHhDNCwgMHhEMCwgMHg3OCwgLyogMHg3MC0weDczICovCisJMHhEMCwgMHg3OSwgMHhEMCwgMHg3QSwgMHhEMCwgMHg3QiwgMHhENiwgMHhENCwgLyogMHg3NC0weDc3ICovCisJMHhEMCwgMHg3QywgMHhEMCwgMHg3RCwgMHhEMCwgMHg3RSwgMHhEMCwgMHg4MCwgLyogMHg3OC0weDdCICovCisJMHhEMCwgMHg4MSwgMHhGMSwgMHhDNSwgMHhGNCwgMHhDMCwgMHhGMSwgMHhDNiwgLyogMHg3Qy0weDdGICovCisJCisJMHhEMCwgMHg4MiwgMHhENCwgMHhBQywgMHhGMSwgMHhDNywgMHhEMCwgMHg4MywgLyogMHg4MC0weDgzICovCisJMHhCMCwgMHhDMCwgMHhGNCwgMHhDMSwgMHhEMCwgMHg4NCwgMHhEMCwgMHg4NSwgLyogMHg4NC0weDg3ICovCisJMHhGNCwgMHhDMiwgMHhEMCwgMHg4NiwgMHhEMCwgMHg4NywgMHhCNCwgMHhGQywgLyogMHg4OC0weDhCICovCisJMHhEMCwgMHg4OCwgMHhDNSwgMHhEQiwgMHhEMCwgMHg4OSwgMHhEMCwgMHg4QSwgLyogMHg4Qy0weDhGICovCisJMHhEMCwgMHg4QiwgMHhEMCwgMHg4QywgMHhDQywgMHhCQiwgMHhEMCwgMHg4RCwgLyogMHg5MC0weDkzICovCisJMHhEMCwgMHg4RSwgMHhEMCwgMHg4RiwgMHhEMCwgMHhFNCwgMHhEMCwgMHg5MCwgLyogMHg5NC0weDk3ICovCisJMHhEMCwgMHg5MSwgMHhEMCwgMHg5MiwgMHhEMCwgMHg5MywgMHhEMCwgMHg5NCwgLyogMHg5OC0weDlCICovCisJMHhDRCwgMHhFMCwgMHhEMCwgMHg5NSwgMHhEMCwgMHg5NiwgMHhEMCwgMHg5NywgLyogMHg5Qy0weDlGICovCisJMHhEMCwgMHg5OCwgMHhEMCwgMHg5OSwgMHhGMSwgMHhDOCwgMHhEMCwgMHg5QSwgLyogMHhBMC0weEEzICovCisJMHhEOSwgMHhGMywgMHhEMCwgMHg5QiwgMHhEMCwgMHg5QywgMHhEMCwgMHg5RCwgLyogMHhBNC0weEE3ICovCisJMHhEMCwgMHg5RSwgMHhEMCwgMHg5RiwgMHhEMCwgMHhBMCwgMHhCMSwgMHhCQiwgLyogMHhBOC0weEFCICovCisJMHhEMSwgMHg0MCwgMHhDRiwgMHhBRSwgMHhEMSwgMHg0MSwgMHhEMSwgMHg0MiwgLyogMHhBQy0weEFGICovCisJMHhEMSwgMHg0MywgMHhCOCwgMHhBNCwgMHhEMSwgMHg0NCwgMHhEMSwgMHg0NSwgLyogMHhCMC0weEIzICovCisJMHhEMSwgMHg0NiwgMHhEMSwgMHg0NywgMHhEMSwgMHg0OCwgMHhGMSwgMHhDQSwgLyogMHhCNC0weEI3ICovCisJMHhEMSwgMHg0OSwgMHhEMSwgMHg0QSwgMHhEMSwgMHg0QiwgMHhEMSwgMHg0QywgLyogMHhCOC0weEJCICovCisJMHhGMSwgMHhDQiwgMHhEMSwgMHg0RCwgMHhEMSwgMHg0RSwgMHhEMSwgMHg0RiwgLyogMHhCQy0weEJGICovCisJMHhEMSwgMHg1MCwgMHhCMiwgMHhDMywgMHhDMSwgMHhEMSwgMHhEMSwgMHg1MSwgLyogMHhDMC0weEMzICovCisJMHhEMSwgMHg1MiwgMHhENywgMHhCMCwgMHhGMSwgMHhDOSwgMHhEMSwgMHg1MywgLyogMHhDNC0weEM3ICovCisJMHhEMSwgMHg1NCwgMHhGMSwgMHhDQywgMHhEMSwgMHg1NSwgMHhEMSwgMHg1NiwgLyogMHhDOC0weENCICovCisJMHhEMSwgMHg1NywgMHhEMSwgMHg1OCwgMHhGMSwgMHhDRSwgMHhEMSwgMHg1OSwgLyogMHhDQy0weENGICovCisJMHhEMSwgMHg1QSwgMHhEMSwgMHg1QiwgMHhEOSwgMHhGNiwgMHhEMSwgMHg1QywgLyogMHhEMC0weEQzICovCisJMHhEMiwgMHhFMSwgMHhENCwgMHhBMywgMHhEMSwgMHg1RCwgMHhEMSwgMHg1RSwgLyogMHhENC0weEQ3ICovCisJMHhGNCwgMHhDMywgMHhDOCwgMHhCOSwgMHhEMSwgMHg1RiwgMHhEMSwgMHg2MCwgLyogMHhEOC0weERCICovCisJMHhEMSwgMHg2MSwgMHhEMSwgMHg2MiwgMHhEMSwgMHg2MywgMHhGNCwgMHhDNCwgLyogMHhEQy0weERGICovCisJMHhEMSwgMHg2NCwgMHhEMSwgMHg2NSwgMHhGMSwgMHhDRCwgMHhGMSwgMHhDRiwgLyogMHhFMC0weEUzICovCisJMHhCRiwgMHhFMywgMHhGMSwgMHhEMCwgMHhEMSwgMHg2NiwgMHhEMSwgMHg2NywgLyogMHhFNC0weEU3ICovCisJMHhGMSwgMHhENCwgMHhEMSwgMHg2OCwgMHhEMSwgMHg2OSwgMHhEMSwgMHg2QSwgLyogMHhFOC0weEVCICovCisJMHhEMSwgMHg2QiwgMHhEMSwgMHg2QywgMHhEMSwgMHg2RCwgMHhEMSwgMHg2RSwgLyogMHhFQy0weEVGICovCisJMHhGMSwgMHhENiwgMHhGMSwgMHhEMSwgMHhEMSwgMHg2RiwgMHhDOSwgMHhEMSwgLyogMHhGMC0weEYzICovCisJMHhDNSwgMHhFMSwgMHhEMSwgMHg3MCwgMHhEMSwgMHg3MSwgMHhEMSwgMHg3MiwgLyogMHhGNC0weEY3ICovCisJMHhDMiwgMHhFMywgMHhCOSwgMHhGQywgMHhEMSwgMHg3MywgMHhEMSwgMHg3NCwgLyogMHhGOC0weEZCICovCisJMHhGMSwgMHhEMywgMHhEMSwgMHg3NSwgMHhGMSwgMHhENSwgMHhEMSwgMHg3NiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODlbNTEyXSA9IHsKKwkweEQxLCAweDc3LCAweEQxLCAweDc4LCAweEI5LCAweEQzLCAweEQxLCAweDc5LCAvKiAweDAwLTB4MDMgKi8KKwkweEQxLCAweDdBLCAweEQxLCAweDdCLCAweEQxLCAweDdDLCAweEQxLCAweDdELCAvKiAweDA0LTB4MDcgKi8KKwkweEQxLCAweDdFLCAweEQxLCAweDgwLCAweEYxLCAweERCLCAweEQxLCAweDgxLCAvKiAweDA4LTB4MEIgKi8KKwkweEQxLCAweDgyLCAweEQxLCAweDgzLCAweEQxLCAweDg0LCAweEQxLCAweDg1LCAvKiAweDBDLTB4MEYgKi8KKwkweEJBLCAweEQ2LCAweEQxLCAweDg2LCAweEIwLCAweEZELCAweEYxLCAweEQ5LCAvKiAweDEwLTB4MTMgKi8KKwkweEQxLCAweDg3LCAweEQxLCAweDg4LCAweEQxLCAweDg5LCAweEQxLCAweDhBLCAvKiAweDE0LTB4MTcgKi8KKwkweEQxLCAweDhCLCAweEYxLCAweEQ4LCAweEYxLCAweEQyLCAweEYxLCAweERBLCAvKiAweDE4LTB4MUIgKi8KKwkweEQxLCAweDhDLCAweEQxLCAweDhELCAweEQxLCAweDhFLCAweEQxLCAweDhGLCAvKiAweDFDLTB4MUYgKi8KKwkweEQxLCAweDkwLCAweEYxLCAweEQ3LCAweEQxLCAweDkxLCAweEQxLCAweDkyLCAvKiAweDIwLTB4MjMgKi8KKwkweEQxLCAweDkzLCAweEM4LCAweEVDLCAweEQxLCAweDk0LCAweEQxLCAweDk1LCAvKiAweDI0LTB4MjcgKi8KKwkweEQxLCAweDk2LCAweEQxLCAweDk3LCAweENELCAweENBLCAweEYxLCAweERELCAvKiAweDI4LTB4MkIgKi8KKwkweEQxLCAweDk4LCAweEQxLCAweDk5LCAweEQxLCAweDlBLCAweEQxLCAweDlCLCAvKiAweDJDLTB4MkYgKi8KKwkweEU1LCAweEJELCAweEQxLCAweDlDLCAweEQxLCAweDlELCAweEQxLCAweDlFLCAvKiAweDMwLTB4MzMgKi8KKwkweEYxLCAweERDLCAweEQxLCAweDlGLCAweEYxLCAweERFLCAweEQxLCAweEEwLCAvKiAweDM0LTB4MzcgKi8KKwkweEQyLCAweDQwLCAweEQyLCAweDQxLCAweEQyLCAweDQyLCAweEQyLCAweDQzLCAvKiAweDM4LTB4M0IgKi8KKwkweEQyLCAweDQ0LCAweEQyLCAweDQ1LCAweEQyLCAweDQ2LCAweEQyLCAweDQ3LCAvKiAweDNDLTB4M0YgKi8KKwkweEQyLCAweDQ4LCAweEYxLCAweERGLCAweEQyLCAweDQ5LCAweEQyLCAweDRBLCAvKiAweDQwLTB4NDMgKi8KKwkweENGLCAweEU1LCAweEQyLCAweDRCLCAweEQyLCAweDRDLCAweEQyLCAweDRELCAvKiAweDQ0LTB4NDcgKi8KKwkweEQyLCAweDRFLCAweEQyLCAweDRGLCAweEQyLCAweDUwLCAweEQyLCAweDUxLCAvKiAweDQ4LTB4NEIgKi8KKwkweEQyLCAweDUyLCAweEQyLCAweDUzLCAweEQyLCAweDU0LCAweEQyLCAweDU1LCAvKiAweDRDLTB4NEYgKi8KKwkweEQyLCAweDU2LCAweEQyLCAweDU3LCAweEQyLCAweDU4LCAweEQyLCAweDU5LCAvKiAweDUwLTB4NTMgKi8KKwkweEQyLCAweDVBLCAweEQyLCAweDVCLCAweEQyLCAweDVDLCAweEQyLCAweDVELCAvKiAweDU0LTB4NTcgKi8KKwkweEQyLCAweDVFLCAweEQyLCAweDVGLCAweEQyLCAweDYwLCAweEQyLCAweDYxLCAvKiAweDU4LTB4NUIgKi8KKwkweEQyLCAweDYyLCAweEQyLCAweDYzLCAweEY0LCAweEM1LCAweEJELCAweEYzLCAvKiAweDVDLTB4NUYgKi8KKwkweEQyLCAweDY0LCAweEQyLCAweDY1LCAweEQyLCAweDY2LCAweEQyLCAweDY3LCAvKiAweDYwLTB4NjMgKi8KKwkweEQyLCAweDY4LCAweEQyLCAweDY5LCAweEYxLCAweEUwLCAweEQyLCAweDZBLCAvKiAweDY0LTB4NjcgKi8KKwkweEQyLCAweDZCLCAweEQyLCAweDZDLCAweEQyLCAweDZELCAweEQyLCAweDZFLCAvKiAweDY4LTB4NkIgKi8KKwkweEQyLCAweDZGLCAweEQyLCAweDcwLCAweEQyLCAweDcxLCAweEQyLCAweDcyLCAvKiAweDZDLTB4NkYgKi8KKwkweEQyLCAweDczLCAweEQyLCAweDc0LCAweEQyLCAweDc1LCAweEQyLCAweDc2LCAvKiAweDcwLTB4NzMgKi8KKwkweEQyLCAweDc3LCAweEQyLCAweDc4LCAweEQyLCAweDc5LCAweEQyLCAweDdBLCAvKiAweDc0LTB4NzcgKi8KKwkweEQyLCAweDdCLCAweEQyLCAweDdDLCAweEQyLCAweDdELCAweEYxLCAweEUxLCAvKiAweDc4LTB4N0IgKi8KKwkweEQyLCAweDdFLCAweEQyLCAweDgwLCAweEQyLCAweDgxLCAweENFLCAweEY3LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEQyLCAweDgyLCAweEQyLCAweEFBLCAweEQyLCAweDgzLCAweEYxLCAweEZCLCAvKiAweDgwLTB4ODMgKi8KKwkweEQyLCAweDg0LCAweEQyLCAweDg1LCAweEI4LCAweEIyLCAweEQyLCAweDg2LCAvKiAweDg0LTB4ODcgKi8KKwkweEQyLCAweDg3LCAweEQyLCAweDg4LCAweEQyLCAweDg5LCAweEQyLCAweDhBLCAvKiAweDg4LTB4OEIgKi8KKwkweEQyLCAweDhCLCAweEQyLCAweDhDLCAweEQyLCAweDhELCAweEQyLCAweDhFLCAvKiAweDhDLTB4OEYgKi8KKwkweEQyLCAweDhGLCAweEQyLCAweDkwLCAweEQyLCAweDkxLCAweEQyLCAweDkyLCAvKiAweDkwLTB4OTMgKi8KKwkweEQyLCAweDkzLCAweEQyLCAweDk0LCAweEQyLCAweDk1LCAweEQyLCAweDk2LCAvKiAweDk0LTB4OTcgKi8KKwkweEQyLCAweDk3LCAweEQyLCAweDk4LCAweEQyLCAweDk5LCAweEQyLCAweDlBLCAvKiAweDk4LTB4OUIgKi8KKwkweEQyLCAweDlCLCAweEQyLCAweDlDLCAweEQyLCAweDlELCAweEQyLCAweDlFLCAvKiAweDlDLTB4OUYgKi8KKwkweEQyLCAweDlGLCAweEQyLCAweEEwLCAweEQzLCAweDQwLCAweEQzLCAweDQxLCAvKiAweEEwLTB4QTMgKi8KKwkweEQzLCAweDQyLCAweEQzLCAweDQzLCAweEQzLCAweDQ0LCAweEQzLCAweDQ1LCAvKiAweEE0LTB4QTcgKi8KKwkweEQzLCAweDQ2LCAweEQzLCAweDQ3LCAweEQzLCAweDQ4LCAweEQzLCAweDQ5LCAvKiAweEE4LTB4QUIgKi8KKwkweEQzLCAweDRBLCAweEQzLCAweDRCLCAweEQzLCAweDRDLCAweEQzLCAweDRELCAvKiAweEFDLTB4QUYgKi8KKwkweEQzLCAweDRFLCAweEQzLCAweDRGLCAweEQzLCAweDUwLCAweEQzLCAweDUxLCAvKiAweEIwLTB4QjMgKi8KKwkweEQzLCAweDUyLCAweEQzLCAweDUzLCAweEQzLCAweDU0LCAweEQzLCAweDU1LCAvKiAweEI0LTB4QjcgKi8KKwkweEQzLCAweDU2LCAweEQzLCAweDU3LCAweEQzLCAweDU4LCAweEQzLCAweDU5LCAvKiAweEI4LTB4QkIgKi8KKwkweEQzLCAweDVBLCAweEQzLCAweDVCLCAweEQzLCAweDVDLCAweEQzLCAweDVELCAvKiAweEJDLTB4QkYgKi8KKwkweEQzLCAweDVFLCAweEJDLCAweEZCLCAweEI5LCAweERCLCAweEQzLCAweDVGLCAvKiAweEMwLTB4QzMgKi8KKwkweEI5LCAweEU2LCAweEMzLCAweEQ5LCAweENBLCAweEQzLCAweEVBLCAweEU4LCAvKiAweEM0LTB4QzcgKi8KKwkweEMwLCAweEMwLCAweEJFLCAweEY1LCAweEVBLCAweEU5LCAweEVBLCAweEVBLCAvKiAweEM4LTB4Q0IgKi8KKwkweEVBLCAweEVCLCAweEQzLCAweDYwLCAweEVBLCAweEVDLCAweEVBLCAweEVELCAvKiAweENDLTB4Q0YgKi8KKwkweEVBLCAweEVFLCAweEVBLCAweEVGLCAweEJELCAweEM3LCAweEQzLCAweDYxLCAvKiAweEQwLTB4RDMgKi8KKwkweEQzLCAweDYyLCAweEQzLCAweDYzLCAweEY1LCAweEZCLCAweEQzLCAweDY0LCAvKiAweEQ0LTB4RDcgKi8KKwkweEQzLCAweDY1LCAweEQzLCAweDY2LCAweEY1LCAweEZELCAweEQzLCAweDY3LCAvKiAweEQ4LTB4REIgKi8KKwkweEY1LCAweEZFLCAweEQzLCAweDY4LCAweEY1LCAweEZDLCAweEQzLCAweDY5LCAvKiAweERDLTB4REYgKi8KKwkweEQzLCAweDZBLCAweEQzLCAweDZCLCAweEQzLCAweDZDLCAweEJELCAweEUyLCAvKiAweEUwLTB4RTMgKi8KKwkweEQzLCAweDZELCAweEY2LCAweEExLCAweEI0LCAweEE1LCAweEQzLCAweDZFLCAvKiAweEU0LTB4RTcgKi8KKwkweEQzLCAweDZGLCAweEQzLCAweDcwLCAweEQzLCAweDcxLCAweEY2LCAweEEyLCAvKiAweEU4LTB4RUIgKi8KKwkweEQzLCAweDcyLCAweEQzLCAweDczLCAweEQzLCAweDc0LCAweEY2LCAweEEzLCAvKiAweEVDLTB4RUYgKi8KKwkweEQzLCAweDc1LCAweEQzLCAweDc2LCAweEQzLCAweDc3LCAweEVDLCAweEIyLCAvKiAweEYwLTB4RjMgKi8KKwkweEQzLCAweDc4LCAweEQzLCAweDc5LCAweEQzLCAweDdBLCAweEQzLCAweDdCLCAvKiAweEY0LTB4RjcgKi8KKwkweEQzLCAweDdDLCAweEQzLCAweDdELCAweEQzLCAweDdFLCAweEQzLCAweDgwLCAvKiAweEY4LTB4RkIgKi8KKwkweEQzLCAweDgxLCAweEQzLCAweDgyLCAweEQzLCAweDgzLCAweEQzLCAweDg0LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184QVs1MTJdID0geworCTB4RDEsIDB4RDQsIDB4RDMsIDB4ODUsIDB4RDMsIDB4ODYsIDB4RDMsIDB4ODcsIC8qIDB4MDAtMHgwMyAqLworCTB4RDMsIDB4ODgsIDB4RDMsIDB4ODksIDB4RDMsIDB4OEEsIDB4RDksIDB4RUEsIC8qIDB4MDQtMHgwNyAqLworCTB4RDMsIDB4OEIsIDB4RDMsIDB4OEMsIDB4RDMsIDB4OEQsIDB4RDMsIDB4OEUsIC8qIDB4MDgtMHgwQiAqLworCTB4RDMsIDB4OEYsIDB4RDMsIDB4OTAsIDB4RDMsIDB4OTEsIDB4RDMsIDB4OTIsIC8qIDB4MEMtMHgwRiAqLworCTB4RDMsIDB4OTMsIDB4RDMsIDB4OTQsIDB4RDMsIDB4OTUsIDB4RDMsIDB4OTYsIC8qIDB4MTAtMHgxMyAqLworCTB4RDMsIDB4OTcsIDB4RDMsIDB4OTgsIDB4RDMsIDB4OTksIDB4RDMsIDB4OUEsIC8qIDB4MTQtMHgxNyAqLworCTB4RDMsIDB4OUIsIDB4RDMsIDB4OUMsIDB4RDMsIDB4OUQsIDB4RDMsIDB4OUUsIC8qIDB4MTgtMHgxQiAqLworCTB4RDMsIDB4OUYsIDB4RDMsIDB4QTAsIDB4RDQsIDB4NDAsIDB4RDQsIDB4NDEsIC8qIDB4MUMtMHgxRiAqLworCTB4RDQsIDB4NDIsIDB4RDQsIDB4NDMsIDB4RDQsIDB4NDQsIDB4RDQsIDB4NDUsIC8qIDB4MjAtMHgyMyAqLworCTB4RDQsIDB4NDYsIDB4RDQsIDB4NDcsIDB4RDQsIDB4NDgsIDB4RDQsIDB4NDksIC8qIDB4MjQtMHgyNyAqLworCTB4RDQsIDB4NEEsIDB4RDQsIDB4NEIsIDB4RDQsIDB4NEMsIDB4RDQsIDB4NEQsIC8qIDB4MjgtMHgyQiAqLworCTB4RDQsIDB4NEUsIDB4RDQsIDB4NEYsIDB4RDQsIDB4NTAsIDB4RDQsIDB4NTEsIC8qIDB4MkMtMHgyRiAqLworCTB4RDQsIDB4NTIsIDB4RDQsIDB4NTMsIDB4RDQsIDB4NTQsIDB4RDQsIDB4NTUsIC8qIDB4MzAtMHgzMyAqLworCTB4RDQsIDB4NTYsIDB4RDQsIDB4NTcsIDB4RDQsIDB4NTgsIDB4RDQsIDB4NTksIC8qIDB4MzQtMHgzNyAqLworCTB4RDQsIDB4NUEsIDB4RDQsIDB4NUIsIDB4RDQsIDB4NUMsIDB4RDQsIDB4NUQsIC8qIDB4MzgtMHgzQiAqLworCTB4RDQsIDB4NUUsIDB4RDQsIDB4NUYsIDB4RjYsIDB4QTQsIDB4RDQsIDB4NjAsIC8qIDB4M0MtMHgzRiAqLworCTB4RDQsIDB4NjEsIDB4RDQsIDB4NjIsIDB4RDQsIDB4NjMsIDB4RDQsIDB4NjQsIC8qIDB4NDAtMHg0MyAqLworCTB4RDQsIDB4NjUsIDB4RDQsIDB4NjYsIDB4RDQsIDB4NjcsIDB4RDQsIDB4NjgsIC8qIDB4NDQtMHg0NyAqLworCTB4RUUsIDB4QkEsIDB4RDQsIDB4NjksIDB4RDQsIDB4NkEsIDB4RDQsIDB4NkIsIC8qIDB4NDgtMHg0QiAqLworCTB4RDQsIDB4NkMsIDB4RDQsIDB4NkQsIDB4RDQsIDB4NkUsIDB4RDQsIDB4NkYsIC8qIDB4NEMtMHg0RiAqLworCTB4RDQsIDB4NzAsIDB4RDQsIDB4NzEsIDB4RDQsIDB4NzIsIDB4RDQsIDB4NzMsIC8qIDB4NTAtMHg1MyAqLworCTB4RDQsIDB4NzQsIDB4RDQsIDB4NzUsIDB4RDQsIDB4NzYsIDB4RDQsIDB4NzcsIC8qIDB4NTQtMHg1NyAqLworCTB4RDQsIDB4NzgsIDB4RDQsIDB4NzksIDB4RDQsIDB4N0EsIDB4RDQsIDB4N0IsIC8qIDB4NTgtMHg1QiAqLworCTB4RDQsIDB4N0MsIDB4RDQsIDB4N0QsIDB4RDQsIDB4N0UsIDB4RDQsIDB4ODAsIC8qIDB4NUMtMHg1RiAqLworCTB4RDQsIDB4ODEsIDB4RDQsIDB4ODIsIDB4RDQsIDB4ODMsIDB4RDQsIDB4ODQsIC8qIDB4NjAtMHg2MyAqLworCTB4RDQsIDB4ODUsIDB4RDQsIDB4ODYsIDB4RDQsIDB4ODcsIDB4RDQsIDB4ODgsIC8qIDB4NjQtMHg2NyAqLworCTB4RDQsIDB4ODksIDB4RDQsIDB4OEEsIDB4RDQsIDB4OEIsIDB4RDQsIDB4OEMsIC8qIDB4NjgtMHg2QiAqLworCTB4RDQsIDB4OEQsIDB4RDQsIDB4OEUsIDB4RDQsIDB4OEYsIDB4RDQsIDB4OTAsIC8qIDB4NkMtMHg2RiAqLworCTB4RDQsIDB4OTEsIDB4RDQsIDB4OTIsIDB4RDQsIDB4OTMsIDB4RDQsIDB4OTQsIC8qIDB4NzAtMHg3MyAqLworCTB4RDQsIDB4OTUsIDB4RDQsIDB4OTYsIDB4RDQsIDB4OTcsIDB4RDQsIDB4OTgsIC8qIDB4NzQtMHg3NyAqLworCTB4RDQsIDB4OTksIDB4RDUsIDB4QjIsIDB4RDQsIDB4OUEsIDB4RDQsIDB4OUIsIC8qIDB4NzgtMHg3QiAqLworCTB4RDQsIDB4OUMsIDB4RDQsIDB4OUQsIDB4RDQsIDB4OUUsIDB4RDQsIDB4OUYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RDQsIDB4QTAsIDB4RDUsIDB4NDAsIDB4RDUsIDB4NDEsIDB4RDUsIDB4NDIsIC8qIDB4ODAtMHg4MyAqLworCTB4RDUsIDB4NDMsIDB4RDUsIDB4NDQsIDB4RDUsIDB4NDUsIDB4RDUsIDB4NDYsIC8qIDB4ODQtMHg4NyAqLworCTB4RDUsIDB4NDcsIDB4RDMsIDB4RkUsIDB4Q0MsIDB4REMsIDB4RDUsIDB4NDgsIC8qIDB4ODgtMHg4QiAqLworCTB4RDUsIDB4NDksIDB4RDUsIDB4NEEsIDB4RDUsIDB4NEIsIDB4RDUsIDB4NEMsIC8qIDB4OEMtMHg4RiAqLworCTB4RDUsIDB4NEQsIDB4RDUsIDB4NEUsIDB4RDUsIDB4NEYsIDB4Q0EsIDB4QzQsIC8qIDB4OTAtMHg5MyAqLworCTB4RDUsIDB4NTAsIDB4RDUsIDB4NTEsIDB4RDUsIDB4NTIsIDB4RDUsIDB4NTMsIC8qIDB4OTQtMHg5NyAqLworCTB4RDUsIDB4NTQsIDB4RDUsIDB4NTUsIDB4RDUsIDB4NTYsIDB4RDUsIDB4NTcsIC8qIDB4OTgtMHg5QiAqLworCTB4RDUsIDB4NTgsIDB4RDUsIDB4NTksIDB4RDUsIDB4NUEsIDB4RDUsIDB4NUIsIC8qIDB4OUMtMHg5RiAqLworCTB4RDUsIDB4NUMsIDB4RDUsIDB4NUQsIDB4RDUsIDB4NUUsIDB4RDUsIDB4NUYsIC8qIDB4QTAtMHhBMyAqLworCTB4RDUsIDB4NjAsIDB4RDUsIDB4NjEsIDB4RDUsIDB4NjIsIDB4RDUsIDB4NjMsIC8qIDB4QTQtMHhBNyAqLworCTB4RDUsIDB4NjQsIDB4RDUsIDB4NjUsIDB4RDUsIDB4NjYsIDB4RDUsIDB4NjcsIC8qIDB4QTgtMHhBQiAqLworCTB4RDUsIDB4NjgsIDB4RDUsIDB4NjksIDB4RDUsIDB4NkEsIDB4RDUsIDB4NkIsIC8qIDB4QUMtMHhBRiAqLworCTB4RDUsIDB4NkMsIDB4RDUsIDB4NkQsIDB4RDUsIDB4NkUsIDB4RDUsIDB4NkYsIC8qIDB4QjAtMHhCMyAqLworCTB4RDUsIDB4NzAsIDB4RDUsIDB4NzEsIDB4RDUsIDB4NzIsIDB4RDUsIDB4NzMsIC8qIDB4QjQtMHhCNyAqLworCTB4RDUsIDB4NzQsIDB4RDUsIDB4NzUsIDB4RDUsIDB4NzYsIDB4RDUsIDB4NzcsIC8qIDB4QjgtMHhCQiAqLworCTB4RDUsIDB4NzgsIDB4RDUsIDB4NzksIDB4RDUsIDB4N0EsIDB4RDUsIDB4N0IsIC8qIDB4QkMtMHhCRiAqLworCTB4RDUsIDB4N0MsIDB4RDUsIDB4N0QsIDB4RDUsIDB4N0UsIDB4RDUsIDB4ODAsIC8qIDB4QzAtMHhDMyAqLworCTB4RDUsIDB4ODEsIDB4RDUsIDB4ODIsIDB4RDUsIDB4ODMsIDB4RDUsIDB4ODQsIC8qIDB4QzQtMHhDNyAqLworCTB4RDUsIDB4ODUsIDB4RDUsIDB4ODYsIDB4RDUsIDB4ODcsIDB4RDUsIDB4ODgsIC8qIDB4QzgtMHhDQiAqLworCTB4RDUsIDB4ODksIDB4RDUsIDB4OEEsIDB4RDUsIDB4OEIsIDB4RDUsIDB4OEMsIC8qIDB4Q0MtMHhDRiAqLworCTB4RDUsIDB4OEQsIDB4RDUsIDB4OEUsIDB4RDUsIDB4OEYsIDB4RDUsIDB4OTAsIC8qIDB4RDAtMHhEMyAqLworCTB4RDUsIDB4OTEsIDB4RDUsIDB4OTIsIDB4RDUsIDB4OTMsIDB4RDUsIDB4OTQsIC8qIDB4RDQtMHhENyAqLworCTB4RDUsIDB4OTUsIDB4RDUsIDB4OTYsIDB4RDUsIDB4OTcsIDB4RDUsIDB4OTgsIC8qIDB4RDgtMHhEQiAqLworCTB4RDUsIDB4OTksIDB4RDUsIDB4OUEsIDB4RDUsIDB4OUIsIDB4RDUsIDB4OUMsIC8qIDB4REMtMHhERiAqLworCTB4RDUsIDB4OUQsIDB4RDUsIDB4OUUsIDB4RDUsIDB4OUYsIDB4RDUsIDB4QTAsIC8qIDB4RTAtMHhFMyAqLworCTB4RDYsIDB4NDAsIDB4RDYsIDB4NDEsIDB4RDYsIDB4NDIsIDB4RDYsIDB4NDMsIC8qIDB4RTQtMHhFNyAqLworCTB4RDYsIDB4NDQsIDB4RDYsIDB4NDUsIDB4RDYsIDB4NDYsIDB4RDYsIDB4NDcsIC8qIDB4RTgtMHhFQiAqLworCTB4RDYsIDB4NDgsIDB4RDYsIDB4NDksIDB4RDYsIDB4NEEsIDB4RDYsIDB4NEIsIC8qIDB4RUMtMHhFRiAqLworCTB4RDYsIDB4NEMsIDB4RDYsIDB4NEQsIDB4RDYsIDB4NEUsIDB4RDYsIDB4NEYsIC8qIDB4RjAtMHhGMyAqLworCTB4RDYsIDB4NTAsIDB4RDYsIDB4NTEsIDB4RDYsIDB4NTIsIDB4RDYsIDB4NTMsIC8qIDB4RjQtMHhGNyAqLworCTB4RDYsIDB4NTQsIDB4RDYsIDB4NTUsIDB4RDYsIDB4NTYsIDB4RDYsIDB4NTcsIC8qIDB4RjgtMHhGQiAqLworCTB4RDYsIDB4NTgsIDB4RDYsIDB4NTksIDB4RDYsIDB4NUEsIDB4RDYsIDB4NUIsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzhCWzUxMl0gPSB7CisJMHhENiwgMHg1QywgMHhENiwgMHg1RCwgMHhENiwgMHg1RSwgMHhENiwgMHg1RiwgLyogMHgwMC0weDAzICovCisJMHhENiwgMHg2MCwgMHhENiwgMHg2MSwgMHhENiwgMHg2MiwgMHhFNSwgMHhDMCwgLyogMHgwNC0weDA3ICovCisJMHhENiwgMHg2MywgMHhENiwgMHg2NCwgMHhENiwgMHg2NSwgMHhENiwgMHg2NiwgLyogMHgwOC0weDBCICovCisJMHhENiwgMHg2NywgMHhENiwgMHg2OCwgMHhENiwgMHg2OSwgMHhENiwgMHg2QSwgLyogMHgwQy0weDBGICovCisJMHhENiwgMHg2QiwgMHhENiwgMHg2QywgMHhENiwgMHg2RCwgMHhENiwgMHg2RSwgLyogMHgxMC0weDEzICovCisJMHhENiwgMHg2RiwgMHhENiwgMHg3MCwgMHhENiwgMHg3MSwgMHhENiwgMHg3MiwgLyogMHgxNC0weDE3ICovCisJMHhENiwgMHg3MywgMHhENiwgMHg3NCwgMHhENiwgMHg3NSwgMHhENiwgMHg3NiwgLyogMHgxOC0weDFCICovCisJMHhENiwgMHg3NywgMHhENiwgMHg3OCwgMHhENiwgMHg3OSwgMHhENiwgMHg3QSwgLyogMHgxQy0weDFGICovCisJMHhENiwgMHg3QiwgMHhENiwgMHg3QywgMHhENiwgMHg3RCwgMHhENiwgMHg3RSwgLyogMHgyMC0weDIzICovCisJMHhENiwgMHg4MCwgMHhENiwgMHg4MSwgMHhGNiwgMHhBNSwgMHhENiwgMHg4MiwgLyogMHgyNC0weDI3ICovCisJMHhENiwgMHg4MywgMHhENiwgMHg4NCwgMHhENiwgMHg4NSwgMHhENiwgMHg4NiwgLyogMHgyOC0weDJCICovCisJMHhENiwgMHg4NywgMHhENiwgMHg4OCwgMHhENiwgMHg4OSwgMHhENiwgMHg4QSwgLyogMHgyQy0weDJGICovCisJMHhENiwgMHg4QiwgMHhENiwgMHg4QywgMHhENiwgMHg4RCwgMHhENiwgMHg4RSwgLyogMHgzMC0weDMzICovCisJMHhENiwgMHg4RiwgMHhENiwgMHg5MCwgMHhENiwgMHg5MSwgMHhENiwgMHg5MiwgLyogMHgzNC0weDM3ICovCisJMHhENiwgMHg5MywgMHhENiwgMHg5NCwgMHhENiwgMHg5NSwgMHhENiwgMHg5NiwgLyogMHgzOC0weDNCICovCisJMHhENiwgMHg5NywgMHhENiwgMHg5OCwgMHhENiwgMHg5OSwgMHhENiwgMHg5QSwgLyogMHgzQy0weDNGICovCisJMHhENiwgMHg5QiwgMHhENiwgMHg5QywgMHhENiwgMHg5RCwgMHhENiwgMHg5RSwgLyogMHg0MC0weDQzICovCisJMHhENiwgMHg5RiwgMHhENiwgMHhBMCwgMHhENywgMHg0MCwgMHhENywgMHg0MSwgLyogMHg0NC0weDQ3ICovCisJMHhENywgMHg0MiwgMHhENywgMHg0MywgMHhENywgMHg0NCwgMHhENywgMHg0NSwgLyogMHg0OC0weDRCICovCisJMHhENywgMHg0NiwgMHhENywgMHg0NywgMHhENywgMHg0OCwgMHhENywgMHg0OSwgLyogMHg0Qy0weDRGICovCisJMHhENywgMHg0QSwgMHhENywgMHg0QiwgMHhENywgMHg0QywgMHhENywgMHg0RCwgLyogMHg1MC0weDUzICovCisJMHhENywgMHg0RSwgMHhENywgMHg0RiwgMHhENywgMHg1MCwgMHhENywgMHg1MSwgLyogMHg1NC0weDU3ICovCisJMHhENywgMHg1MiwgMHhENywgMHg1MywgMHhENywgMHg1NCwgMHhENywgMHg1NSwgLyogMHg1OC0weDVCICovCisJMHhENywgMHg1NiwgMHhENywgMHg1NywgMHhENywgMHg1OCwgMHhENywgMHg1OSwgLyogMHg1Qy0weDVGICovCisJMHhENywgMHg1QSwgMHhENywgMHg1QiwgMHhENywgMHg1QywgMHhENywgMHg1RCwgLyogMHg2MC0weDYzICovCisJMHhENywgMHg1RSwgMHhENywgMHg1RiwgMHhCRSwgMHhBRiwgMHhENywgMHg2MCwgLyogMHg2NC0weDY3ICovCisJMHhENywgMHg2MSwgMHhENywgMHg2MiwgMHhENywgMHg2MywgMHhENywgMHg2NCwgLyogMHg2OC0weDZCICovCisJMHhDNiwgMHhBOSwgMHhENywgMHg2NSwgMHhENywgMHg2NiwgMHhENywgMHg2NywgLyogMHg2Qy0weDZGICovCisJMHhENywgMHg2OCwgMHhENywgMHg2OSwgMHhENywgMHg2QSwgMHhENywgMHg2QiwgLyogMHg3MC0weDczICovCisJMHhENywgMHg2QywgMHhENywgMHg2RCwgMHhENywgMHg2RSwgMHhENywgMHg2RiwgLyogMHg3NC0weDc3ICovCisJMHhENywgMHg3MCwgMHhENywgMHg3MSwgMHhENywgMHg3MiwgMHhENywgMHg3MywgLyogMHg3OC0weDdCICovCisJMHhENywgMHg3NCwgMHhENywgMHg3NSwgMHhENywgMHg3NiwgMHhENywgMHg3NywgLyogMHg3Qy0weDdGICovCisJCisJMHhENywgMHg3OCwgMHhENywgMHg3OSwgMHhENywgMHg3QSwgMHhENywgMHg3QiwgLyogMHg4MC0weDgzICovCisJMHhENywgMHg3QywgMHhENywgMHg3RCwgMHhENywgMHg3RSwgMHhENywgMHg4MCwgLyogMHg4NC0weDg3ICovCisJMHhENywgMHg4MSwgMHhENywgMHg4MiwgMHhENywgMHg4MywgMHhENywgMHg4NCwgLyogMHg4OC0weDhCICovCisJMHhENywgMHg4NSwgMHhENywgMHg4NiwgMHhENywgMHg4NywgMHhENywgMHg4OCwgLyogMHg4Qy0weDhGICovCisJMHhENywgMHg4OSwgMHhENywgMHg4QSwgMHhENywgMHg4QiwgMHhENywgMHg4QywgLyogMHg5MC0weDkzICovCisJMHhENywgMHg4RCwgMHhENywgMHg4RSwgMHhENywgMHg4RiwgMHhENywgMHg5MCwgLyogMHg5NC0weDk3ICovCisJMHhENywgMHg5MSwgMHhENywgMHg5MiwgMHhENywgMHg5MywgMHhENywgMHg5NCwgLyogMHg5OC0weDlCICovCisJMHhENywgMHg5NSwgMHhENywgMHg5NiwgMHhENywgMHg5NywgMHhENywgMHg5OCwgLyogMHg5Qy0weDlGICovCisJMHhEQSwgMHhBNSwgMHhCQywgMHhDNiwgMHhCNiwgMHhBOSwgMHhCOCwgMHhCQywgLyogMHhBMC0weEEzICovCisJMHhDOCwgMHhDRiwgMHhCQywgMHhBNSwgMHhEQSwgMHhBNiwgMHhEQSwgMHhBNywgLyogMHhBNC0weEE3ICovCisJMHhDQywgMHhENiwgMHhDOCwgMHhDMywgMHhEQSwgMHhBOCwgMHhDNiwgMHhGRCwgLyogMHhBOC0weEFCICovCisJMHhENywgMHg5OSwgMHhEMSwgMHhCNSwgMHhEMiwgMHhFOSwgMHhEMSwgMHhCNiwgLyogMHhBQy0weEFGICovCisJMHhCQywgMHhDNywgMHhENywgMHg5QSwgMHhCRCwgMHhCMiwgMHhCQiwgMHhFNCwgLyogMHhCMC0weEIzICovCisJMHhEQSwgMHhBOSwgMHhEQSwgMHhBQSwgMHhEMSwgMHhDOCwgMHhEQSwgMHhBQiwgLyogMHhCNC0weEI3ICovCisJMHhEMCwgMHhFRCwgMHhCNiwgMHhFRiwgMHhDMiwgMHhEQiwgMHhENywgMHg5QiwgLyogMHhCOC0weEJCICovCisJMHhDQiwgMHhDRiwgMHhCNywgMHhFRCwgMHhDOSwgMHhFOCwgMHhCNywgMHhDMywgLyogMHhCQy0weEJGICovCisJMHhCRSwgMHhGNywgMHhENiwgMHhBNCwgMHhEQSwgMHhBQywgMHhEQSwgMHhBRCwgLyogMHhDMC0weEMzICovCisJMHhDNiwgMHhDMCwgMHhENywgMHhFNywgMHhDQSwgMHhCNiwgMHhENywgMHg5QywgLyogMHhDNC0weEM3ICovCisJMHhENSwgMHhBOSwgMHhDQiwgMHhERiwgMHhENSwgMHhFRiwgMHhEQSwgMHhBRSwgLyogMHhDOC0weENCICovCisJMHhENiwgMHhERiwgMHhCNCwgMHhDQSwgMHhEQSwgMHhCMCwgMHhEQSwgMHhBRiwgLyogMHhDQy0weENGICovCisJMHhENywgMHg5RCwgMHhEMiwgMHhFQiwgMHhEQSwgMHhCMSwgMHhEQSwgMHhCMiwgLyogMHhEMC0weEQzICovCisJMHhEQSwgMHhCMywgMHhDQSwgMHhENCwgMHhEQSwgMHhCNCwgMHhDQSwgMHhBQiwgLyogMHhENC0weEQ3ICovCisJMHhEQSwgMHhCNSwgMHhEQSwgMHhCNiwgMHhCMywgMHhDRiwgMHhENiwgMHhFRiwgLyogMHhEOC0weERCICovCisJMHhEQSwgMHhCNywgMHhCQiwgMHhCMCwgMHhCNSwgMHhBRSwgMHhEQSwgMHhCOCwgLyogMHhEQy0weERGICovCisJMHhEQSwgMHhCOSwgMHhCOSwgMHhFRSwgMHhEMSwgMHhBRiwgMHhEMiwgMHhFOCwgLyogMHhFMC0weEUzICovCisJMHhEQSwgMHhCQSwgMHhCOCwgMHhDMywgMHhDRiwgMHhFQSwgMHhCMiwgMHhFRiwgLyogMHhFNC0weEU3ICovCisJMHhEQSwgMHhCQiwgMHhEQSwgMHhCQywgMHhENywgMHg5RSwgMHhCRCwgMHhFQiwgLyogMHhFOC0weEVCICovCisJMHhDRSwgMHhEQywgMHhEMywgMHhFRiwgMHhEQSwgMHhCRCwgMHhDRSwgMHhGMywgLyogMHhFQy0weEVGICovCisJMHhEQSwgMHhCRSwgMHhEMywgMHhENSwgMHhCQiwgMHhFNSwgMHhEQSwgMHhCRiwgLyogMHhGMC0weEYzICovCisJMHhDQiwgMHhCNSwgMHhDQiwgMHhEMCwgMHhEQSwgMHhDMCwgMHhDNywgMHhFQiwgLyogMHhGNC0weEY3ICovCisJMHhENiwgMHhFRSwgMHhEQSwgMHhDMSwgMHhDNSwgMHhCNSwgMHhCNiwgMHhDMSwgLyogMHhGOC0weEZCICovCisJMHhEQSwgMHhDMiwgMHhCNywgMHhDQywgMHhCRiwgMHhDRSwgMHhEQSwgMHhDMywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOENbNTEyXSA9IHsKKwkweERBLCAweEM0LCAweENCLCAweEFELCAweERBLCAweEM1LCAweEI1LCAweEY3LCAvKiAweDAwLTB4MDMgKi8KKwkweERBLCAweEM2LCAweEMxLCAweEMyLCAweEQ3LCAweEJCLCAweERBLCAweEM3LCAvKiAweDA0LTB4MDcgKi8KKwkweENDLCAweEI4LCAweEQ3LCAweDlGLCAweEQyLCAweEVBLCAweEM0LCAweEIxLCAvKiAweDA4LTB4MEIgKi8KKwkweERBLCAweEM4LCAweEI1LCAweEZELCAweEJCLCAweEQxLCAweERBLCAweEM5LCAvKiAweDBDLTB4MEYgKi8KKwkweEQwLCAweEIzLCAweERBLCAweENBLCAweERBLCAweENCLCAweENFLCAweEJELCAvKiAweDEwLTB4MTMgKi8KKwkweERBLCAweENDLCAweERBLCAweENELCAweERBLCAweENFLCAweEIyLCAweEY3LCAvKiAweDE0LTB4MTcgKi8KKwkweERBLCAweEQxLCAweERBLCAweENGLCAweEQxLCAweEU4LCAweERBLCAweEQwLCAvKiAweDE4LTB4MUIgKi8KKwkweEMzLCAweEQ1LCAweERBLCAweEQyLCAweEQ3LCAweEEwLCAweERBLCAweEQzLCAvKiAweDFDLTB4MUYgKi8KKwkweERBLCAweEQ0LCAweERBLCAweEQ1LCAweEQwLCAweEJCLCAweEQyLCAweEE1LCAvKiAweDIwLTB4MjMgKi8KKwkweEIwLCAweEY5LCAweERBLCAweEQ2LCAweEM3LCAweEFCLCAweERBLCAweEQ3LCAvKiAweDI0LTB4MjcgKi8KKwkweEJELCAweEY3LCAweEMzLCAweEExLCAweERBLCAweEQ4LCAweERBLCAweEQ5LCAvKiAweDI4LTB4MkIgKi8KKwkweEMzLCAweEZELCAweENDLCAweEI3LCAweERBLCAweERBLCAweERBLCAweERCLCAvKiAweDJDLTB4MkYgKi8KKwkweEMwLCAweEJFLCAweEM2LCAweEQ3LCAweERBLCAweERDLCAweERBLCAweERELCAvKiAweDMwLTB4MzMgKi8KKwkweEM3LCAweEI0LCAweERBLCAweERFLCAweERBLCAweERGLCAweEI5LCAweEM4LCAvKiAweDM0LTB4MzcgKi8KKwkweEQ4LCAweDQwLCAweEQ4LCAweDQxLCAweEQ4LCAweDQyLCAweEQ4LCAweDQzLCAvKiAweDM4LTB4M0IgKi8KKwkweEQ4LCAweDQ0LCAweEQ4LCAweDQ1LCAweEQ4LCAweDQ2LCAweEQ4LCAweDQ3LCAvKiAweDNDLTB4M0YgKi8KKwkweEQ4LCAweDQ4LCAweEJCLCAweEVELCAweEQ4LCAweDQ5LCAweEQ4LCAweDRBLCAvKiAweDQwLTB4NDMgKi8KKwkweEQ4LCAweDRCLCAweEQ4LCAweDRDLCAweEI2LCAweEI5LCAweEY0LCAweEY4LCAvKiAweDQ0LTB4NDcgKi8KKwkweEQ4LCAweDRELCAweEY0LCAweEY5LCAweEQ4LCAweDRFLCAweEQ4LCAweDRGLCAvKiAweDQ4LTB4NEIgKi8KKwkweENELCAweEUzLCAweEQ4LCAweDUwLCAweEQ4LCAweDUxLCAweEQ4LCAweDUyLCAvKiAweDRDLTB4NEYgKi8KKwkweEQ4LCAweDUzLCAweEQ4LCAweDU0LCAweEQ4LCAweDU1LCAweEQ4LCAweDU2LCAvKiAweDUwLTB4NTMgKi8KKwkweEQ4LCAweDU3LCAweEY1LCAweEI5LCAweEQ4LCAweDU4LCAweEQ4LCAweDU5LCAvKiAweDU0LTB4NTcgKi8KKwkweEQ4LCAweDVBLCAweEQ4LCAweDVCLCAweEVCLCAweEUwLCAweEQ4LCAweDVDLCAvKiAweDU4LTB4NUIgKi8KKwkweEQ4LCAweDVELCAweEQ4LCAweDVFLCAweEQ4LCAweDVGLCAweEQ4LCAweDYwLCAvKiAweDVDLTB4NUYgKi8KKwkweEQ4LCAweDYxLCAweENGLCAweEYzLCAweEJCLCAweEJGLCAweEQ4LCAweDYyLCAvKiAweDYwLTB4NjMgKi8KKwkweEQ4LCAweDYzLCAweEQ4LCAweDY0LCAweEQ4LCAweDY1LCAweEQ4LCAweDY2LCAvKiAweDY0LTB4NjcgKi8KKwkweEQ4LCAweDY3LCAweEQ4LCAweDY4LCAweEJBLCAweEMwLCAweEQ0LCAweEE1LCAvKiAweDY4LTB4NkIgKi8KKwkweEQ4LCAweDY5LCAweEQ4LCAweDZBLCAweEQ4LCAweDZCLCAweEQ4LCAweDZDLCAvKiAweDZDLTB4NkYgKi8KKwkweEQ4LCAweDZELCAweEQ4LCAweDZFLCAweEQ4LCAweDZGLCAweEUxLCAweEQ5LCAvKiAweDcwLTB4NzMgKi8KKwkweEQ4LCAweDcwLCAweEQ4LCAweDcxLCAweEQ4LCAweDcyLCAweEQ4LCAweDczLCAvKiAweDc0LTB4NzcgKi8KKwkweEY1LCAweEY0LCAweEIxLCAweEFBLCAweEIyLCAweEYyLCAweEQ4LCAweDc0LCAvKiAweDc4LTB4N0IgKi8KKwkweEQ4LCAweDc1LCAweEQ4LCAweDc2LCAweEQ4LCAweDc3LCAweEQ4LCAweDc4LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEQ4LCAweDc5LCAweEQ4LCAweDdBLCAweEY1LCAweEY1LCAweEQ4LCAweDdCLCAvKiAweDgwLTB4ODMgKi8KKwkweEQ4LCAweDdDLCAweEY1LCAweEY3LCAweEQ4LCAweDdELCAweEQ4LCAweDdFLCAvKiAweDg0LTB4ODcgKi8KKwkweEQ4LCAweDgwLCAweEJBLCAweEQxLCAweEY1LCAweEY2LCAweEQ4LCAweDgxLCAvKiAweDg4LTB4OEIgKi8KKwkweEMzLCAweEIyLCAweEQ4LCAweDgyLCAweEQ4LCAweDgzLCAweEQ4LCAweDg0LCAvKiAweDhDLTB4OEYgKi8KKwkweEQ4LCAweDg1LCAweEQ4LCAweDg2LCAweEQ4LCAweDg3LCAweEQ4LCAweDg4LCAvKiAweDkwLTB4OTMgKi8KKwkweEY1LCAweEY5LCAweEQ4LCAweDg5LCAweEQ4LCAweDhBLCAweEQ4LCAweDhCLCAvKiAweDk0LTB4OTcgKi8KKwkweEY1LCAweEY4LCAweEQ4LCAweDhDLCAweEQ4LCAweDhELCAweEQ4LCAweDhFLCAvKiAweDk4LTB4OUIgKi8KKwkweEQ4LCAweDhGLCAweEQ4LCAweDkwLCAweEQ4LCAweDkxLCAweEQ4LCAweDkyLCAvKiAweDlDLTB4OUYgKi8KKwkweEQ4LCAweDkzLCAweEQ4LCAweDk0LCAweEQ4LCAweDk1LCAweEQ4LCAweDk2LCAvKiAweEEwLTB4QTMgKi8KKwkweEQ4LCAweDk3LCAweEQ4LCAweDk4LCAweEQ4LCAweDk5LCAweEQ4LCAweDlBLCAvKiAweEE0LTB4QTcgKi8KKwkweEQ4LCAweDlCLCAweEQ4LCAweDlDLCAweEQ4LCAweDlELCAweEQ4LCAweDlFLCAvKiAweEE4LTB4QUIgKi8KKwkweEQ4LCAweDlGLCAweEQ4LCAweEEwLCAweEQ5LCAweDQwLCAweEQ5LCAweDQxLCAvKiAweEFDLTB4QUYgKi8KKwkweEQ5LCAweDQyLCAweEQ5LCAweDQzLCAweEQ5LCAweDQ0LCAweEQ5LCAweDQ1LCAvKiAweEIwLTB4QjMgKi8KKwkweEQ5LCAweDQ2LCAweEQ5LCAweDQ3LCAweEQ5LCAweDQ4LCAweEQ5LCAweDQ5LCAvKiAweEI0LTB4QjcgKi8KKwkweEQ5LCAweDRBLCAweEQ5LCAweDRCLCAweEQ5LCAweDRDLCAweEQ5LCAweDRELCAvKiAweEI4LTB4QkIgKi8KKwkweEQ5LCAweDRFLCAweEQ5LCAweDRGLCAweEQ5LCAweDUwLCAweEQ5LCAweDUxLCAvKiAweEJDLTB4QkYgKi8KKwkweEQ5LCAweDUyLCAweEQ5LCAweDUzLCAweEQ5LCAweDU0LCAweEQ5LCAweDU1LCAvKiAweEMwLTB4QzMgKi8KKwkweEQ5LCAweDU2LCAweEQ5LCAweDU3LCAweEQ5LCAweDU4LCAweEQ5LCAweDU5LCAvKiAweEM0LTB4QzcgKi8KKwkweEQ5LCAweDVBLCAweEQ5LCAweDVCLCAweEQ5LCAweDVDLCAweEQ5LCAweDVELCAvKiAweEM4LTB4Q0IgKi8KKwkweEQ5LCAweDVFLCAweEQ5LCAweDVGLCAweEQ5LCAweDYwLCAweEQ5LCAweDYxLCAvKiAweENDLTB4Q0YgKi8KKwkweEQ5LCAweDYyLCAweEQ5LCAweDYzLCAweEQ5LCAweDY0LCAweEQ5LCAweDY1LCAvKiAweEQwLTB4RDMgKi8KKwkweEQ5LCAweDY2LCAweEQ5LCAweDY3LCAweEQ5LCAweDY4LCAweEQ5LCAweDY5LCAvKiAweEQ0LTB4RDcgKi8KKwkweEQ5LCAweDZBLCAweEQ5LCAweDZCLCAweEQ5LCAweDZDLCAweEQ5LCAweDZELCAvKiAweEQ4LTB4REIgKi8KKwkweEQ5LCAweDZFLCAweEQ5LCAweDZGLCAweEQ5LCAweDcwLCAweEQ5LCAweDcxLCAvKiAweERDLTB4REYgKi8KKwkweEQ5LCAweDcyLCAweEQ5LCAweDczLCAweEQ5LCAweDc0LCAweEQ5LCAweDc1LCAvKiAweEUwLTB4RTMgKi8KKwkweEQ5LCAweDc2LCAweEQ5LCAweDc3LCAweEQ5LCAweDc4LCAweEQ5LCAweDc5LCAvKiAweEU0LTB4RTcgKi8KKwkweEQ5LCAweDdBLCAweEQ5LCAweDdCLCAweEQ5LCAweDdDLCAweEQ5LCAweDdELCAvKiAweEU4LTB4RUIgKi8KKwkweEQ5LCAweDdFLCAweEQ5LCAweDgwLCAweEQ5LCAweDgxLCAweEQ5LCAweDgyLCAvKiAweEVDLTB4RUYgKi8KKwkweEQ5LCAweDgzLCAweEQ5LCAweDg0LCAweEQ5LCAweDg1LCAweEQ5LCAweDg2LCAvKiAweEYwLTB4RjMgKi8KKwkweEQ5LCAweDg3LCAweEQ5LCAweDg4LCAweEQ5LCAweDg5LCAweEQ5LCAweDhBLCAvKiAweEY0LTB4RjcgKi8KKwkweEQ5LCAweDhCLCAweEQ5LCAweDhDLCAweEQ5LCAweDhELCAweEQ5LCAweDhFLCAvKiAweEY4LTB4RkIgKi8KKwkweEQ5LCAweDhGLCAweEQ5LCAweDkwLCAweEQ5LCAweDkxLCAweEQ5LCAweDkyLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184RFs1MTJdID0geworCTB4RDksIDB4OTMsIDB4RDksIDB4OTQsIDB4RDksIDB4OTUsIDB4RDksIDB4OTYsIC8qIDB4MDAtMHgwMyAqLworCTB4RDksIDB4OTcsIDB4RDksIDB4OTgsIDB4RDksIDB4OTksIDB4RDksIDB4OUEsIC8qIDB4MDQtMHgwNyAqLworCTB4RDksIDB4OUIsIDB4RDksIDB4OUMsIDB4RDksIDB4OUQsIDB4RDksIDB4OUUsIC8qIDB4MDgtMHgwQiAqLworCTB4RDksIDB4OUYsIDB4RDksIDB4QTAsIDB4REEsIDB4NDAsIDB4REEsIDB4NDEsIC8qIDB4MEMtMHgwRiAqLworCTB4REEsIDB4NDIsIDB4REEsIDB4NDMsIDB4REEsIDB4NDQsIDB4REEsIDB4NDUsIC8qIDB4MTAtMHgxMyAqLworCTB4REEsIDB4NDYsIDB4REEsIDB4NDcsIDB4REEsIDB4NDgsIDB4REEsIDB4NDksIC8qIDB4MTQtMHgxNyAqLworCTB4REEsIDB4NEEsIDB4REEsIDB4NEIsIDB4REEsIDB4NEMsIDB4REEsIDB4NEQsIC8qIDB4MTgtMHgxQiAqLworCTB4REEsIDB4NEUsIDB4QjEsIDB4QjQsIDB4RDUsIDB4RUEsIDB4QjgsIDB4QkEsIC8qIDB4MUMtMHgxRiAqLworCTB4REEsIDB4NEYsIDB4QjksIDB4QjEsIDB4QjIsIDB4QzYsIDB4RDQsIDB4RjAsIC8qIDB4MjAtMHgyMyAqLworCTB4Q0YsIDB4Q0QsIDB4QjAsIDB4REMsIDB4RDUsIDB4Q0IsIDB4QkIsIDB4RjUsIC8qIDB4MjQtMHgyNyAqLworCTB4RDYsIDB4Q0EsIDB4QjcsIDB4QjcsIDB4Q0MsIDB4QjAsIDB4QzYsIDB4QjYsIC8qIDB4MjgtMHgyQiAqLworCTB4QjEsIDB4RTEsIDB4QjksIDB4QkEsIDB4RDYsIDB4RkMsIDB4QjksIDB4RTEsIC8qIDB4MkMtMHgyRiAqLworCTB4QjcsIDB4QTEsIDB4QkMsIDB4RkEsIDB4RUEsIDB4REEsIDB4RUEsIDB4REIsIC8qIDB4MzAtMHgzMyAqLworCTB4Q0MsIDB4RjksIDB4QjksIDB4RjMsIDB4RUEsIDB4REMsIDB4QjQsIDB4RkIsIC8qIDB4MzQtMHgzNyAqLworCTB4QzMsIDB4QjMsIDB4QjcsIDB4RDEsIDB4QkEsIDB4RDgsIDB4RUEsIDB4REQsIC8qIDB4MzgtMHgzQiAqLworCTB4RDQsIDB4RjQsIDB4RUEsIDB4REUsIDB4QkMsIDB4RDYsIDB4QkIsIDB4REYsIC8qIDB4M0MtMHgzRiAqLworCTB4RUEsIDB4REYsIDB4QzEsIDB4REUsIDB4QzIsIDB4QjgsIDB4RDQsIDB4REYsIC8qIDB4NDAtMHg0MyAqLworCTB4RDcsIDB4Q0EsIDB4RUEsIDB4RTAsIDB4RUEsIDB4RTEsIDB4RUEsIDB4RTQsIC8qIDB4NDQtMHg0NyAqLworCTB4RUEsIDB4RTIsIDB4RUEsIDB4RTMsIDB4QzksIDB4REUsIDB4QjgsIDB4QjMsIC8qIDB4NDgtMHg0QiAqLworCTB4QjYsIDB4QzQsIDB4RUEsIDB4RTUsIDB4Q0EsIDB4RUEsIDB4QzksIDB4Q0QsIC8qIDB4NEMtMHg0RiAqLworCTB4QjQsIDB4Q0QsIDB4REEsIDB4NTAsIDB4REEsIDB4NTEsIDB4RTIsIDB4RDksIC8qIDB4NTAtMHg1MyAqLworCTB4QzUsIDB4RTIsIDB4RUEsIDB4RTYsIDB4QzAsIDB4QjUsIDB4REEsIDB4NTIsIC8qIDB4NTQtMHg1NyAqLworCTB4RDcsIDB4QjgsIDB4RUEsIDB4RTcsIDB4RDcsIDB4QUMsIDB4QzgsIDB4RkMsIC8qIDB4NTgtMHg1QiAqLworCTB4RDgsIDB4RDMsIDB4RDgsIDB4Q0QsIDB4RDQsIDB4REUsIDB4REEsIDB4NTMsIC8qIDB4NUMtMHg1RiAqLworCTB4RDQsIDB4RjksIDB4QzksIDB4QzQsIDB4RDMsIDB4QUUsIDB4QjgsIDB4RDMsIC8qIDB4NjAtMHg2MyAqLworCTB4QjMsIDB4RTAsIDB4REEsIDB4NTQsIDB4QzksIDB4RTIsIDB4RjQsIDB4RjYsIC8qIDB4NjQtMHg2NyAqLworCTB4REEsIDB4NTUsIDB4REEsIDB4NTYsIDB4REEsIDB4NTcsIDB4QkEsIDB4RDUsIC8qIDB4NjgtMHg2QiAqLworCTB4REEsIDB4NTgsIDB4RjQsIDB4RjcsIDB4REEsIDB4NTksIDB4REEsIDB4NUEsIC8qIDB4NkMtMHg2RiAqLworCTB4RDcsIDB4REYsIDB4REEsIDB4NUIsIDB4REEsIDB4NUMsIDB4RjQsIDB4RjEsIC8qIDB4NzAtMHg3MyAqLworCTB4QjgsIDB4QjAsIDB4RDUsIDB4RDQsIDB4QjgsIDB4Q0YsIDB4QzYsIDB4RjAsIC8qIDB4NzQtMHg3NyAqLworCTB4REEsIDB4NUQsIDB4REEsIDB4NUUsIDB4REEsIDB4NUYsIDB4REEsIDB4NjAsIC8qIDB4NzgtMHg3QiAqLworCTB4REEsIDB4NjEsIDB4REEsIDB4NjIsIDB4REEsIDB4NjMsIDB4REEsIDB4NjQsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4REEsIDB4NjUsIDB4QjMsIDB4QzMsIDB4REEsIDB4NjYsIDB4REEsIDB4NjcsIC8qIDB4ODAtMHg4MyAqLworCTB4RjQsIDB4RjIsIDB4QjMsIDB4QUMsIDB4REEsIDB4NjgsIDB4REEsIDB4NjksIC8qIDB4ODQtMHg4NyAqLworCTB4REEsIDB4NkEsIDB4REEsIDB4NkIsIDB4RDQsIDB4QkQsIDB4QzcsIDB4RjcsIC8qIDB4ODgtMHg4QiAqLworCTB4REEsIDB4NkMsIDB4REEsIDB4NkQsIDB4REEsIDB4NkUsIDB4REEsIDB4NkYsIC8qIDB4OEMtMHg4RiAqLworCTB4REEsIDB4NzAsIDB4RjQsIDB4RjQsIDB4REEsIDB4NzEsIDB4REEsIDB4NzIsIC8qIDB4OTAtMHg5MyAqLworCTB4RjQsIDB4RjMsIDB4REEsIDB4NzMsIDB4REEsIDB4NzQsIDB4REEsIDB4NzUsIC8qIDB4OTQtMHg5NyAqLworCTB4REEsIDB4NzYsIDB4REEsIDB4NzcsIDB4REEsIDB4NzgsIDB4REEsIDB4NzksIC8qIDB4OTgtMHg5QiAqLworCTB4REEsIDB4N0EsIDB4REEsIDB4N0IsIDB4REEsIDB4N0MsIDB4Q0MsIDB4Q0IsIC8qIDB4OUMtMHg5RiAqLworCTB4REEsIDB4N0QsIDB4REEsIDB4N0UsIDB4REEsIDB4ODAsIDB4QzgsIDB4QTQsIC8qIDB4QTAtMHhBMyAqLworCTB4REEsIDB4ODEsIDB4REEsIDB4ODIsIDB4REEsIDB4ODMsIDB4REEsIDB4ODQsIC8qIDB4QTQtMHhBNyAqLworCTB4REEsIDB4ODUsIDB4REEsIDB4ODYsIDB4REEsIDB4ODcsIDB4REEsIDB4ODgsIC8qIDB4QTgtMHhBQiAqLworCTB4REEsIDB4ODksIDB4REEsIDB4OEEsIDB4REEsIDB4OEIsIDB4REEsIDB4OEMsIC8qIDB4QUMtMHhBRiAqLworCTB4REEsIDB4OEQsIDB4RjQsIDB4RjUsIDB4REEsIDB4OEUsIDB4RDcsIDB4RTMsIC8qIDB4QjAtMHhCMyAqLworCTB4QzUsIDB4QkYsIDB4RjUsIDB4QzAsIDB4REEsIDB4OEYsIDB4REEsIDB4OTAsIC8qIDB4QjQtMHhCNyAqLworCTB4RjUsIDB4QkIsIDB4REEsIDB4OTEsIDB4RjUsIDB4QzMsIDB4REEsIDB4OTIsIC8qIDB4QjgtMHhCQiAqLworCTB4RjUsIDB4QzIsIDB4REEsIDB4OTMsIDB4RDYsIDB4QkEsIDB4RjUsIDB4QzEsIC8qIDB4QkMtMHhCRiAqLworCTB4REEsIDB4OTQsIDB4REEsIDB4OTUsIDB4REEsIDB4OTYsIDB4RDQsIDB4QkUsIC8qIDB4QzAtMHhDMyAqLworCTB4RjUsIDB4QzQsIDB4REEsIDB4OTcsIDB4RjUsIDB4Q0MsIDB4REEsIDB4OTgsIC8qIDB4QzQtMHhDNyAqLworCTB4REEsIDB4OTksIDB4REEsIDB4OUEsIDB4REEsIDB4OUIsIDB4QjAsIDB4Q0YsIC8qIDB4QzgtMHhDQiAqLworCTB4QjUsIDB4RjgsIDB4REEsIDB4OUMsIDB4RjUsIDB4QzksIDB4RjUsIDB4Q0EsIC8qIDB4Q0MtMHhDRiAqLworCTB4REEsIDB4OUQsIDB4QzUsIDB4REMsIDB4REEsIDB4OUUsIDB4REEsIDB4OUYsIC8qIDB4RDAtMHhEMyAqLworCTB4REEsIDB4QTAsIDB4REIsIDB4NDAsIDB4RjUsIDB4QzUsIDB4RjUsIDB4QzYsIC8qIDB4RDQtMHhENyAqLworCTB4REIsIDB4NDEsIDB4REIsIDB4NDIsIDB4RjUsIDB4QzcsIDB4RjUsIDB4Q0IsIC8qIDB4RDgtMHhEQiAqLworCTB4REIsIDB4NDMsIDB4QkUsIDB4RTAsIDB4RjUsIDB4QzgsIDB4QjgsIDB4RkEsIC8qIDB4REMtMHhERiAqLworCTB4REIsIDB4NDQsIDB4REIsIDB4NDUsIDB4REIsIDB4NDYsIDB4RjUsIDB4RDAsIC8qIDB4RTAtMHhFMyAqLworCTB4RjUsIDB4RDMsIDB4REIsIDB4NDcsIDB4REIsIDB4NDgsIDB4REIsIDB4NDksIC8qIDB4RTQtMHhFNyAqLworCTB4QkYsIDB4RTcsIDB4REIsIDB4NEEsIDB4QjksIDB4RjIsIDB4RjUsIDB4QkMsIC8qIDB4RTgtMHhFQiAqLworCTB4RjUsIDB4Q0QsIDB4REIsIDB4NEIsIDB4REIsIDB4NEMsIDB4QzIsIDB4QjcsIC8qIDB4RUMtMHhFRiAqLworCTB4REIsIDB4NEQsIDB4REIsIDB4NEUsIDB4REIsIDB4NEYsIDB4Q0MsIDB4RjgsIC8qIDB4RjAtMHhGMyAqLworCTB4REIsIDB4NTAsIDB4QkMsIDB4RjksIDB4REIsIDB4NTEsIDB4RjUsIDB4Q0UsIC8qIDB4RjQtMHhGNyAqLworCTB4RjUsIDB4Q0YsIDB4RjUsIDB4RDEsIDB4QjYsIDB4RTUsIDB4RjUsIDB4RDIsIC8qIDB4RjgtMHhGQiAqLworCTB4REIsIDB4NTIsIDB4RjUsIDB4RDUsIDB4REIsIDB4NTMsIDB4REIsIDB4NTQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzhFWzUxMl0gPSB7CisJMHhEQiwgMHg1NSwgMHhEQiwgMHg1NiwgMHhEQiwgMHg1NywgMHhEQiwgMHg1OCwgLyogMHgwMC0weDAzICovCisJMHhEQiwgMHg1OSwgMHhGNSwgMHhCRCwgMHhEQiwgMHg1QSwgMHhEQiwgMHg1QiwgLyogMHgwNC0weDA3ICovCisJMHhEQiwgMHg1QywgMHhGNSwgMHhENCwgMHhEMywgMHhCQiwgMHhEQiwgMHg1RCwgLyogMHgwOC0weDBCICovCisJMHhCMywgMHhFQywgMHhEQiwgMHg1RSwgMHhEQiwgMHg1RiwgMHhDQywgMHhBNCwgLyogMHgwQy0weDBGICovCisJMHhEQiwgMHg2MCwgMHhEQiwgMHg2MSwgMHhEQiwgMHg2MiwgMHhEQiwgMHg2MywgLyogMHgxMC0weDEzICovCisJMHhGNSwgMHhENiwgMHhEQiwgMHg2NCwgMHhEQiwgMHg2NSwgMHhEQiwgMHg2NiwgLyogMHgxNC0weDE3ICovCisJMHhEQiwgMHg2NywgMHhEQiwgMHg2OCwgMHhEQiwgMHg2OSwgMHhEQiwgMHg2QSwgLyogMHgxOC0weDFCICovCisJMHhEQiwgMHg2QiwgMHhGNSwgMHhENywgMHhCRSwgMHhFMSwgMHhGNSwgMHhEOCwgLyogMHgxQy0weDFGICovCisJMHhEQiwgMHg2QywgMHhEQiwgMHg2RCwgMHhDQywgMHhERiwgMHhGNSwgMHhEQiwgLyogMHgyMC0weDIzICovCisJMHhEQiwgMHg2RSwgMHhEQiwgMHg2RiwgMHhEQiwgMHg3MCwgMHhEQiwgMHg3MSwgLyogMHgyNC0weDI3ICovCisJMHhEQiwgMHg3MiwgMHhCMiwgMHhDOCwgMHhENywgMHhEOSwgMHhEQiwgMHg3MywgLyogMHgyOC0weDJCICovCisJMHhGNSwgMHhEOSwgMHhEQiwgMHg3NCwgMHhGNSwgMHhEQSwgMHhGNSwgMHhEQywgLyogMHgyQy0weDJGICovCisJMHhEQiwgMHg3NSwgMHhGNSwgMHhFMiwgMHhEQiwgMHg3NiwgMHhEQiwgMHg3NywgLyogMHgzMC0weDMzICovCisJMHhEQiwgMHg3OCwgMHhGNSwgMHhFMCwgMHhEQiwgMHg3OSwgMHhEQiwgMHg3QSwgLyogMHgzNC0weDM3ICovCisJMHhEQiwgMHg3QiwgMHhGNSwgMHhERiwgMHhGNSwgMHhERCwgMHhEQiwgMHg3QywgLyogMHgzOC0weDNCICovCisJMHhEQiwgMHg3RCwgMHhGNSwgMHhFMSwgMHhEQiwgMHg3RSwgMHhEQiwgMHg4MCwgLyogMHgzQy0weDNGICovCisJMHhGNSwgMHhERSwgMHhGNSwgMHhFNCwgMHhGNSwgMHhFNSwgMHhEQiwgMHg4MSwgLyogMHg0MC0weDQzICovCisJMHhDQywgMHhFMywgMHhEQiwgMHg4MiwgMHhEQiwgMHg4MywgMHhFNSwgMHhCRiwgLyogMHg0NC0weDQ3ICovCisJMHhCNSwgMHhCOCwgMHhGNSwgMHhFMywgMHhGNSwgMHhFOCwgMHhDQywgMHhBMywgLyogMHg0OC0weDRCICovCisJMHhEQiwgMHg4NCwgMHhEQiwgMHg4NSwgMHhEQiwgMHg4NiwgMHhEQiwgMHg4NywgLyogMHg0Qy0weDRGICovCisJMHhEQiwgMHg4OCwgMHhGNSwgMHhFNiwgMHhGNSwgMHhFNywgMHhEQiwgMHg4OSwgLyogMHg1MC0weDUzICovCisJMHhEQiwgMHg4QSwgMHhEQiwgMHg4QiwgMHhEQiwgMHg4QywgMHhEQiwgMHg4RCwgLyogMHg1NC0weDU3ICovCisJMHhEQiwgMHg4RSwgMHhGNSwgMHhCRSwgMHhEQiwgMHg4RiwgMHhEQiwgMHg5MCwgLyogMHg1OC0weDVCICovCisJMHhEQiwgMHg5MSwgMHhEQiwgMHg5MiwgMHhEQiwgMHg5MywgMHhEQiwgMHg5NCwgLyogMHg1Qy0weDVGICovCisJMHhEQiwgMHg5NSwgMHhEQiwgMHg5NiwgMHhEQiwgMHg5NywgMHhEQiwgMHg5OCwgLyogMHg2MC0weDYzICovCisJMHhEQiwgMHg5OSwgMHhEQiwgMHg5QSwgMHhCMSwgMHhDNCwgMHhEQiwgMHg5QiwgLyogMHg2NC0weDY3ICovCisJMHhEQiwgMHg5QywgMHhGNSwgMHhCRiwgMHhEQiwgMHg5RCwgMHhEQiwgMHg5RSwgLyogMHg2OC0weDZCICovCisJMHhCNSwgMHhDNSwgMHhCMiwgMHhFNCwgMHhEQiwgMHg5RiwgMHhGNSwgMHhFQywgLyogMHg2Qy0weDZGICovCisJMHhGNSwgMHhFOSwgMHhEQiwgMHhBMCwgMHhCNiwgMHhENywgMHhEQywgMHg0MCwgLyogMHg3MC0weDczICovCisJMHhGNSwgMHhFRCwgMHhEQywgMHg0MSwgMHhGNSwgMHhFQSwgMHhEQywgMHg0MiwgLyogMHg3NC0weDc3ICovCisJMHhEQywgMHg0MywgMHhEQywgMHg0NCwgMHhEQywgMHg0NSwgMHhEQywgMHg0NiwgLyogMHg3OC0weDdCICovCisJMHhGNSwgMHhFQiwgMHhEQywgMHg0NywgMHhEQywgMHg0OCwgMHhCNCwgMHhEQSwgLyogMHg3Qy0weDdGICovCisJCisJMHhEQywgMHg0OSwgMHhENCwgMHhFQSwgMHhEQywgMHg0QSwgMHhEQywgMHg0QiwgLyogMHg4MC0weDgzICovCisJMHhEQywgMHg0QywgMHhGNSwgMHhFRSwgMHhEQywgMHg0RCwgMHhCMywgMHhGOSwgLyogMHg4NC0weDg3ICovCisJMHhEQywgMHg0RSwgMHhEQywgMHg0RiwgMHhEQywgMHg1MCwgMHhEQywgMHg1MSwgLyogMHg4OC0weDhCICovCisJMHhEQywgMHg1MiwgMHhEQywgMHg1MywgMHhEQywgMHg1NCwgMHhGNSwgMHhFRiwgLyogMHg4Qy0weDhGICovCisJMHhGNSwgMHhGMSwgMHhEQywgMHg1NSwgMHhEQywgMHg1NiwgMHhEQywgMHg1NywgLyogMHg5MC0weDkzICovCisJMHhGNSwgMHhGMCwgMHhEQywgMHg1OCwgMHhEQywgMHg1OSwgMHhEQywgMHg1QSwgLyogMHg5NC0weDk3ICovCisJMHhEQywgMHg1QiwgMHhEQywgMHg1QywgMHhEQywgMHg1RCwgMHhEQywgMHg1RSwgLyogMHg5OC0weDlCICovCisJMHhGNSwgMHhGMiwgMHhEQywgMHg1RiwgMHhGNSwgMHhGMywgMHhEQywgMHg2MCwgLyogMHg5Qy0weDlGICovCisJMHhEQywgMHg2MSwgMHhEQywgMHg2MiwgMHhEQywgMHg2MywgMHhEQywgMHg2NCwgLyogMHhBMC0weEEzICovCisJMHhEQywgMHg2NSwgMHhEQywgMHg2NiwgMHhEQywgMHg2NywgMHhEQywgMHg2OCwgLyogMHhBNC0weEE3ICovCisJMHhEQywgMHg2OSwgMHhEQywgMHg2QSwgMHhEQywgMHg2QiwgMHhDOSwgMHhFRCwgLyogMHhBOC0weEFCICovCisJMHhCOSwgMHhBQSwgMHhEQywgMHg2QywgMHhEQywgMHg2RCwgMHhDNywgMHhGQiwgLyogMHhBQy0weEFGICovCisJMHhEQywgMHg2RSwgMHhEQywgMHg2RiwgMHhCNiwgMHhFMywgMHhEQywgMHg3MCwgLyogMHhCMC0weEIzICovCisJMHhEQywgMHg3MSwgMHhEQywgMHg3MiwgMHhEQywgMHg3MywgMHhEQywgMHg3NCwgLyogMHhCNC0weEI3ICovCisJMHhEQywgMHg3NSwgMHhEQywgMHg3NiwgMHhDQywgMHhDOSwgMHhEQywgMHg3NywgLyogMHhCOC0weEJCICovCisJMHhEQywgMHg3OCwgMHhEQywgMHg3OSwgMHhEQywgMHg3QSwgMHhEQywgMHg3QiwgLyogMHhCQy0weEJGICovCisJMHhEQywgMHg3QywgMHhEQywgMHg3RCwgMHhEQywgMHg3RSwgMHhEQywgMHg4MCwgLyogMHhDMC0weEMzICovCisJMHhEQywgMHg4MSwgMHhEQywgMHg4MiwgMHhEQywgMHg4MywgMHhEQywgMHg4NCwgLyogMHhDNC0weEM3ICovCisJMHhEQywgMHg4NSwgMHhEQywgMHg4NiwgMHhEQywgMHg4NywgMHhEQywgMHg4OCwgLyogMHhDOC0weENCICovCisJMHhEQywgMHg4OSwgMHhEQywgMHg4QSwgMHhFQSwgMHhBNiwgMHhEQywgMHg4QiwgLyogMHhDQy0weENGICovCisJMHhEQywgMHg4QywgMHhEQywgMHg4RCwgMHhEQywgMHg4RSwgMHhEQywgMHg4RiwgLyogMHhEMC0weEQzICovCisJMHhEQywgMHg5MCwgMHhEQywgMHg5MSwgMHhEQywgMHg5MiwgMHhEQywgMHg5MywgLyogMHhENC0weEQ3ICovCisJMHhEQywgMHg5NCwgMHhEQywgMHg5NSwgMHhEQywgMHg5NiwgMHhEQywgMHg5NywgLyogMHhEOC0weERCICovCisJMHhEQywgMHg5OCwgMHhEQywgMHg5OSwgMHhEQywgMHg5QSwgMHhEQywgMHg5QiwgLyogMHhEQy0weERGICovCisJMHhEQywgMHg5QywgMHhEQywgMHg5RCwgMHhEQywgMHg5RSwgMHhEQywgMHg5RiwgLyogMHhFMC0weEUzICovCisJMHhEQywgMHhBMCwgMHhERCwgMHg0MCwgMHhERCwgMHg0MSwgMHhERCwgMHg0MiwgLyogMHhFNC0weEU3ICovCisJMHhERCwgMHg0MywgMHhERCwgMHg0NCwgMHhERCwgMHg0NSwgMHhERCwgMHg0NiwgLyogMHhFOC0weEVCICovCisJMHhERCwgMHg0NywgMHhERCwgMHg0OCwgMHhERCwgMHg0OSwgMHhERCwgMHg0QSwgLyogMHhFQy0weEVGICovCisJMHhERCwgMHg0QiwgMHhERCwgMHg0QywgMHhERCwgMHg0RCwgMHhERCwgMHg0RSwgLyogMHhGMC0weEYzICovCisJMHhERCwgMHg0RiwgMHhERCwgMHg1MCwgMHhERCwgMHg1MSwgMHhERCwgMHg1MiwgLyogMHhGNC0weEY3ICovCisJMHhERCwgMHg1MywgMHhERCwgMHg1NCwgMHhERCwgMHg1NSwgMHhERCwgMHg1NiwgLyogMHhGOC0weEZCICovCisJMHhERCwgMHg1NywgMHhERCwgMHg1OCwgMHhERCwgMHg1OSwgMHhERCwgMHg1QSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOEZbNTEyXSA9IHsKKwkweERELCAweDVCLCAweERELCAweDVDLCAweERELCAweDVELCAweERELCAweDVFLCAvKiAweDAwLTB4MDMgKi8KKwkweERELCAweDVGLCAweERELCAweDYwLCAweERELCAweDYxLCAweERELCAweDYyLCAvKiAweDA0LTB4MDcgKi8KKwkweERELCAweDYzLCAweERELCAweDY0LCAweERELCAweDY1LCAweERELCAweDY2LCAvKiAweDA4LTB4MEIgKi8KKwkweERELCAweDY3LCAweERELCAweDY4LCAweERELCAweDY5LCAweERELCAweDZBLCAvKiAweDBDLTB4MEYgKi8KKwkweERELCAweDZCLCAweERELCAweDZDLCAweERELCAweDZELCAweERELCAweDZFLCAvKiAweDEwLTB4MTMgKi8KKwkweERELCAweDZGLCAweERELCAweDcwLCAweERELCAweDcxLCAweERELCAweDcyLCAvKiAweDE0LTB4MTcgKi8KKwkweERELCAweDczLCAweERELCAweDc0LCAweERELCAweDc1LCAweERELCAweDc2LCAvKiAweDE4LTB4MUIgKi8KKwkweERELCAweDc3LCAweERELCAweDc4LCAweERELCAweDc5LCAweERELCAweDdBLCAvKiAweDFDLTB4MUYgKi8KKwkweERELCAweDdCLCAweERELCAweDdDLCAweERELCAweDdELCAweERELCAweDdFLCAvKiAweDIwLTB4MjMgKi8KKwkweERELCAweDgwLCAweERELCAweDgxLCAweERELCAweDgyLCAweERELCAweDgzLCAvKiAweDI0LTB4MjcgKi8KKwkweERELCAweDg0LCAweERELCAweDg1LCAweERELCAweDg2LCAweERELCAweDg3LCAvKiAweDI4LTB4MkIgKi8KKwkweERELCAweDg4LCAweERELCAweDg5LCAweERELCAweDhBLCAweERELCAweDhCLCAvKiAweDJDLTB4MkYgKi8KKwkweERELCAweDhDLCAweERELCAweDhELCAweERELCAweDhFLCAweERELCAweDhGLCAvKiAweDMwLTB4MzMgKi8KKwkweERELCAweDkwLCAweERELCAweDkxLCAweERELCAweDkyLCAweERELCAweDkzLCAvKiAweDM0LTB4MzcgKi8KKwkweERELCAweDk0LCAweERELCAweDk1LCAweERELCAweDk2LCAweERELCAweDk3LCAvKiAweDM4LTB4M0IgKi8KKwkweERELCAweDk4LCAweERELCAweDk5LCAweERELCAweDlBLCAweERELCAweDlCLCAvKiAweDNDLTB4M0YgKi8KKwkweERELCAweDlDLCAweERELCAweDlELCAweERELCAweDlFLCAweERELCAweDlGLCAvKiAweDQwLTB4NDMgKi8KKwkweERELCAweEEwLCAweERFLCAweDQwLCAweERFLCAweDQxLCAweERFLCAweDQyLCAvKiAweDQ0LTB4NDcgKi8KKwkweERFLCAweDQzLCAweERFLCAweDQ0LCAweERFLCAweDQ1LCAweERFLCAweDQ2LCAvKiAweDQ4LTB4NEIgKi8KKwkweERFLCAweDQ3LCAweERFLCAweDQ4LCAweERFLCAweDQ5LCAweERFLCAweDRBLCAvKiAweDRDLTB4NEYgKi8KKwkweERFLCAweDRCLCAweERFLCAweDRDLCAweERFLCAweDRELCAweERFLCAweDRFLCAvKiAweDUwLTB4NTMgKi8KKwkweERFLCAweDRGLCAweERFLCAweDUwLCAweERFLCAweDUxLCAweERFLCAweDUyLCAvKiAweDU0LTB4NTcgKi8KKwkweERFLCAweDUzLCAweERFLCAweDU0LCAweERFLCAweDU1LCAweERFLCAweDU2LCAvKiAweDU4LTB4NUIgKi8KKwkweERFLCAweDU3LCAweERFLCAweDU4LCAweERFLCAweDU5LCAweERFLCAweDVBLCAvKiAweDVDLTB4NUYgKi8KKwkweERFLCAweDVCLCAweERFLCAweDVDLCAweERFLCAweDVELCAweERFLCAweDVFLCAvKiAweDYwLTB4NjMgKi8KKwkweERFLCAweDVGLCAweERFLCAweDYwLCAweEIzLCAweEI1LCAweEQ0LCAweEZFLCAvKiAweDY0LTB4NjcgKi8KKwkweEI5LCAweEVDLCAweEQwLCAweEY5LCAweERFLCAweDYxLCAweEU5LCAweEVELCAvKiAweDY4LTB4NkIgKi8KKwkweEQ3LCAweEFBLCAweEU5LCAweEVFLCAweEMyLCAweEQ2LCAweEM4LCAweEVELCAvKiAweDZDLTB4NkYgKi8KKwkweEJBLCAweEU0LCAweEU5LCAweEVGLCAweEU5LCAweEYwLCAweEU5LCAweEYxLCAvKiAweDcwLTB4NzMgKi8KKwkweEQ2LCAweEUxLCAweEU5LCAweEYyLCAweEU5LCAweEYzLCAweEU5LCAweEY1LCAvKiAweDc0LTB4NzcgKi8KKwkweEU5LCAweEY0LCAweEU5LCAweEY2LCAweEU5LCAweEY3LCAweEM3LCAweEUxLCAvKiAweDc4LTB4N0IgKi8KKwkweEU5LCAweEY4LCAweEQ0LCAweEQ4LCAweEU5LCAweEY5LCAweEJELCAweENFLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweERFLCAweDYyLCAweEU5LCAweEZBLCAweEU5LCAweEZCLCAweEJELCAweENGLCAvKiAweDgwLTB4ODMgKi8KKwkweEU5LCAweEZDLCAweEI4LCAweEE4LCAweEMxLCAweEJFLCAweEU5LCAweEZELCAvKiAweDg0LTB4ODcgKi8KKwkweEIxLCAweEIyLCAweEJCLCAweEQ0LCAweEI5LCAweEY1LCAweEU5LCAweEZFLCAvKiAweDg4LTB4OEIgKi8KKwkweERFLCAweDYzLCAweEVBLCAweEExLCAweEVBLCAweEEyLCAweEVBLCAweEEzLCAvKiAweDhDLTB4OEYgKi8KKwkweEI3LCAweEY4LCAweEJDLCAweEFELCAweERFLCAweDY0LCAweENBLCAweEU0LCAvKiAweDkwLTB4OTMgKi8KKwkweEUwLCAweENFLCAweEQ0LCAweEFGLCAweENGLCAweEJELCAweEQ1LCAweEI3LCAvKiAweDk0LTB4OTcgKi8KKwkweEVBLCAweEE0LCAweEQ1LCAweERFLCAweEVBLCAweEE1LCAweEQwLCAweEMxLCAvKiAweDk4LTB4OUIgKi8KKwkweEI5LCAweEJDLCAweERFLCAweDY1LCAweEI0LCAweEM3LCAweEIxLCAweEQ5LCAvKiAweDlDLTB4OUYgKi8KKwkweERFLCAweDY2LCAweERFLCAweDY3LCAweERFLCAweDY4LCAweEMwLCAweEIxLCAvKiAweEEwLTB4QTMgKi8KKwkweERFLCAweDY5LCAweERFLCAweDZBLCAweERFLCAweDZCLCAweERFLCAweDZDLCAvKiAweEE0LTB4QTcgKi8KKwkweEIxLCAweEU2LCAweEIxLCAweEU3LCAweERFLCAweDZELCAweEIxLCAweEU4LCAvKiAweEE4LTB4QUIgKi8KKwkweERFLCAweDZFLCAweERFLCAweDZGLCAweERFLCAweDcwLCAweERFLCAweDcxLCAvKiAweEFDLTB4QUYgKi8KKwkweEIzLCAweEJELCAweEM4LCAweEU4LCAweERFLCAweDcyLCAweERFLCAweDczLCAvKiAweEIwLTB4QjMgKi8KKwkweERFLCAweDc0LCAweERFLCAweDc1LCAweEU1LCAweEMxLCAweERFLCAweDc2LCAvKiAweEI0LTB4QjcgKi8KKwkweERFLCAweDc3LCAweEIxLCAweERGLCAweERFLCAweDc4LCAweERFLCAweDc5LCAvKiAweEI4LTB4QkIgKi8KKwkweERFLCAweDdBLCAweEMxLCAweEM5LCAweEI0LCAweEVGLCAweERFLCAweDdCLCAvKiAweEJDLTB4QkYgKi8KKwkweERFLCAweDdDLCAweEM3LCAweEE4LCAweEQzLCAweEQ4LCAweERFLCAweDdELCAvKiAweEMwLTB4QzMgKi8KKwkweEM2LCAweEY5LCAweEQxLCAweEI4LCAweERFLCAweDdFLCAweEI5LCAweEZELCAvKiAweEM0LTB4QzcgKi8KKwkweEMyLCAweEY1LCAweERFLCAweDgwLCAweERFLCAweDgxLCAweERFLCAweDgyLCAvKiAweEM4LTB4Q0IgKi8KKwkweERFLCAweDgzLCAweERFLCAweDg0LCAweEQzLCAweEFELCAweERFLCAweDg1LCAvKiAweENDLTB4Q0YgKi8KKwkweEQ0LCAweENCLCAweEJELCAweEZDLCAweERFLCAweDg2LCAweEU1LCAweEMyLCAvKiAweEQwLTB4RDMgKi8KKwkweEI3LCAweEI1LCAweEU1LCAweEMzLCAweERFLCAweDg3LCAweERFLCAweDg4LCAvKiAweEQ0LTB4RDcgKi8KKwkweEJCLCAweEI5LCAweEQ1LCAweEUyLCAweERFLCAweDg5LCAweEJELCAweEY4LCAvKiAweEQ4LTB4REIgKi8KKwkweEQ0LCAweEI2LCAweENFLCAweEE1LCAweEMxLCAweEFDLCAweEIzLCAweEQ5LCAvKiAweERDLTB4REYgKi8KKwkweERFLCAweDhBLCAweERFLCAweDhCLCAweENDLCAweEY2LCAweERFLCAweDhDLCAvKiAweEUwLTB4RTMgKi8KKwkweEU1LCAweEM2LCAweEU1LCAweEM0LCAweEU1LCAweEM4LCAweERFLCAweDhELCAvKiAweEU0LTB4RTcgKi8KKwkweEU1LCAweENBLCAweEU1LCAweEM3LCAweEI1LCAweENGLCAweEM2LCAweEM4LCAvKiAweEU4LTB4RUIgKi8KKwkweERFLCAweDhFLCAweEI1LCAweEZDLCAweEU1LCAweEM1LCAweERFLCAweDhGLCAvKiAweEVDLTB4RUYgKi8KKwkweENBLCAweEY2LCAweERFLCAweDkwLCAweERFLCAweDkxLCAweEU1LCAweEM5LCAvKiAweEYwLTB4RjMgKi8KKwkweERFLCAweDkyLCAweERFLCAweDkzLCAweERFLCAweDk0LCAweEMzLCAweEQ0LCAvKiAweEY0LTB4RjcgKi8KKwkweEIxLCAweEM1LCAweEJDLCAweEEzLCAweERFLCAweDk1LCAweERFLCAweDk2LCAvKiAweEY4LTB4RkIgKi8KKwkweERFLCAweDk3LCAweEQ3LCAweEI3LCAweERFLCAweDk4LCAweERFLCAweDk5LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185MFs1MTJdID0geworCTB4Q0QsIDB4Q0IsIDB4Q0IsIDB4Q0QsIDB4Q0EsIDB4Q0EsIDB4Q0MsIDB4RDMsIC8qIDB4MDAtMHgwMyAqLworCTB4RTUsIDB4Q0MsIDB4RTUsIDB4Q0IsIDB4QzQsIDB4RTYsIDB4REUsIDB4OUEsIC8qIDB4MDQtMHgwNyAqLworCTB4REUsIDB4OUIsIDB4RDEsIDB4QTEsIDB4RDEsIDB4QjcsIDB4RTUsIDB4Q0QsIC8qIDB4MDgtMHgwQiAqLworCTB4REUsIDB4OUMsIDB4RTUsIDB4RDAsIDB4REUsIDB4OUQsIDB4Q0QsIDB4QjgsIC8qIDB4MEMtMHgwRiAqLworCTB4RDYsIDB4RjAsIDB4RTUsIDB4Q0YsIDB4QjUsIDB4REQsIDB4REUsIDB4OUUsIC8qIDB4MTAtMHgxMyAqLworCTB4Q0QsIDB4QkUsIDB4REUsIDB4OUYsIDB4RTUsIDB4RDEsIDB4QjYsIDB4QkEsIC8qIDB4MTQtMHgxNyAqLworCTB4REUsIDB4QTAsIDB4REYsIDB4NDAsIDB4Q0QsIDB4QTgsIDB4QjksIDB4RTQsIC8qIDB4MTgtMHgxQiAqLworCTB4REYsIDB4NDEsIDB4Q0EsIDB4QzUsIDB4QjMsIDB4RDEsIDB4Q0IsIDB4RDksIC8qIDB4MUMtMHgxRiAqLworCTB4RDQsIDB4RUMsIDB4RTUsIDB4RDIsIDB4QjcsIDB4RUEsIDB4REYsIDB4NDIsIC8qIDB4MjAtMHgyMyAqLworCTB4REYsIDB4NDMsIDB4REYsIDB4NDQsIDB4RTUsIDB4Q0UsIDB4REYsIDB4NDUsIC8qIDB4MjQtMHgyNyAqLworCTB4REYsIDB4NDYsIDB4REYsIDB4NDcsIDB4REYsIDB4NDgsIDB4REYsIDB4NDksIC8qIDB4MjgtMHgyQiAqLworCTB4REYsIDB4NEEsIDB4RTUsIDB4RDUsIDB4QjQsIDB4RkUsIDB4RTUsIDB4RDYsIC8qIDB4MkMtMHgyRiAqLworCTB4REYsIDB4NEIsIDB4REYsIDB4NEMsIDB4REYsIDB4NEQsIDB4REYsIDB4NEUsIC8qIDB4MzAtMHgzMyAqLworCTB4REYsIDB4NEYsIDB4RTUsIDB4RDMsIDB4RTUsIDB4RDQsIDB4REYsIDB4NTAsIC8qIDB4MzQtMHgzNyAqLworCTB4RDIsIDB4REQsIDB4REYsIDB4NTEsIDB4REYsIDB4NTIsIDB4QzIsIDB4REYsIC8qIDB4MzgtMHgzQiAqLworCTB4QjEsIDB4QzYsIDB4REYsIDB4NTMsIDB4RDMsIDB4RTIsIDB4REYsIDB4NTQsIC8qIDB4M0MtMHgzRiAqLworCTB4REYsIDB4NTUsIDB4QjYsIDB4REQsIDB4Q0IsIDB4RUMsIDB4REYsIDB4NTYsIC8qIDB4NDAtMHg0MyAqLworCTB4RTUsIDB4RDcsIDB4REYsIDB4NTcsIDB4REYsIDB4NTgsIDB4RDMsIDB4RjYsIC8qIDB4NDQtMHg0NyAqLworCTB4REYsIDB4NTksIDB4REYsIDB4NUEsIDB4REYsIDB4NUIsIDB4REYsIDB4NUMsIC8qIDB4NDgtMHg0QiAqLworCTB4REYsIDB4NUQsIDB4QjEsIDB4RTksIDB4REYsIDB4NUUsIDB4QjYsIDB4RjQsIC8qIDB4NEMtMHg0RiAqLworCTB4RTUsIDB4REEsIDB4RTUsIDB4RDgsIDB4RTUsIDB4RDksIDB4QjUsIDB4QzAsIC8qIDB4NTAtMHg1MyAqLworCTB4REYsIDB4NUYsIDB4REYsIDB4NjAsIDB4REYsIDB4NjEsIDB4RDIsIDB4QzUsIC8qIDB4NTQtMHg1NyAqLworCTB4RTUsIDB4REMsIDB4REYsIDB4NjIsIDB4REYsIDB4NjMsIDB4RTUsIDB4REUsIC8qIDB4NTgtMHg1QiAqLworCTB4REYsIDB4NjQsIDB4REYsIDB4NjUsIDB4REYsIDB4NjYsIDB4REYsIDB4NjcsIC8qIDB4NUMtMHg1RiAqLworCTB4REYsIDB4NjgsIDB4REYsIDB4NjksIDB4RTUsIDB4REQsIDB4QzcsIDB4QjIsIC8qIDB4NjAtMHg2MyAqLworCTB4REYsIDB4NkEsIDB4RDIsIDB4QTMsIDB4REYsIDB4NkIsIDB4REYsIDB4NkMsIC8qIDB4NjQtMHg2NyAqLworCTB4RTUsIDB4REIsIDB4REYsIDB4NkQsIDB4REYsIDB4NkUsIDB4REYsIDB4NkYsIC8qIDB4NjgtMHg2QiAqLworCTB4REYsIDB4NzAsIDB4RDQsIDB4RTIsIDB4RDUsIDB4REEsIDB4REYsIDB4NzEsIC8qIDB4NkMtMHg2RiAqLworCTB4REYsIDB4NzIsIDB4REYsIDB4NzMsIDB4REYsIDB4NzQsIDB4REYsIDB4NzUsIC8qIDB4NzAtMHg3MyAqLworCTB4RTUsIDB4RTAsIDB4RDcsIDB4RjEsIDB4REYsIDB4NzYsIDB4REYsIDB4NzcsIC8qIDB4NzQtMHg3NyAqLworCTB4REYsIDB4NzgsIDB4REYsIDB4NzksIDB4REYsIDB4N0EsIDB4REYsIDB4N0IsIC8qIDB4NzgtMHg3QiAqLworCTB4REYsIDB4N0MsIDB4RTUsIDB4RTEsIDB4REYsIDB4N0QsIDB4QjEsIDB4REMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RDEsIDB4RkIsIDB4REYsIDB4N0UsIDB4RTUsIDB4RTIsIDB4RTUsIDB4RTQsIC8qIDB4ODAtMHg4MyAqLworCTB4REYsIDB4ODAsIDB4REYsIDB4ODEsIDB4REYsIDB4ODIsIDB4REYsIDB4ODMsIC8qIDB4ODQtMHg4NyAqLworCTB4RTUsIDB4RTMsIDB4REYsIDB4ODQsIDB4REYsIDB4ODUsIDB4RTUsIDB4RTUsIC8qIDB4ODgtMHg4QiAqLworCTB4REYsIDB4ODYsIDB4REYsIDB4ODcsIDB4REYsIDB4ODgsIDB4REYsIDB4ODksIC8qIDB4OEMtMHg4RiAqLworCTB4REYsIDB4OEEsIDB4RDIsIDB4RDgsIDB4REYsIDB4OEIsIDB4QjUsIDB4Q0IsIC8qIDB4OTAtMHg5MyAqLworCTB4REYsIDB4OEMsIDB4RTcsIDB4REYsIDB4REYsIDB4OEQsIDB4REEsIDB4RjUsIC8qIDB4OTQtMHg5NyAqLworCTB4REYsIDB4OEUsIDB4REEsIDB4RjgsIDB4REYsIDB4OEYsIDB4REEsIDB4RjYsIC8qIDB4OTgtMHg5QiAqLworCTB4REYsIDB4OTAsIDB4REEsIDB4RjcsIDB4REYsIDB4OTEsIDB4REYsIDB4OTIsIC8qIDB4OUMtMHg5RiAqLworCTB4REYsIDB4OTMsIDB4REEsIDB4RkEsIDB4RDAsIDB4Q0YsIDB4QzQsIDB4QzcsIC8qIDB4QTAtMHhBMyAqLworCTB4REYsIDB4OTQsIDB4REYsIDB4OTUsIDB4QjAsIDB4RUUsIDB4REYsIDB4OTYsIC8qIDB4QTQtMHhBNyAqLworCTB4REYsIDB4OTcsIDB4REYsIDB4OTgsIDB4RDAsIDB4QjAsIDB4REYsIDB4OTksIC8qIDB4QTgtMHhBQiAqLworCTB4REEsIDB4RjksIDB4REYsIDB4OUEsIDB4RDMsIDB4Q0EsIDB4QkEsIDB4QUEsIC8qIDB4QUMtMHhBRiAqLworCTB4REIsIDB4QTIsIDB4QzcsIDB4RjEsIDB4REYsIDB4OUIsIDB4REEsIDB4RkMsIC8qIDB4QjAtMHhCMyAqLworCTB4REEsIDB4RkIsIDB4QzksIDB4REIsIDB4REEsIDB4RkQsIDB4REYsIDB4OUMsIC8qIDB4QjQtMHhCNyAqLworCTB4REIsIDB4QTEsIDB4RDcsIDB4REUsIDB4REEsIDB4RkUsIDB4QzEsIDB4REEsIC8qIDB4QjgtMHhCQiAqLworCTB4REYsIDB4OUQsIDB4REYsIDB4OUUsIDB4REIsIDB4QTUsIDB4REYsIDB4OUYsIC8qIDB4QkMtMHhCRiAqLworCTB4REYsIDB4QTAsIDB4RDMsIDB4RjQsIDB4RTAsIDB4NDAsIDB4RTAsIDB4NDEsIC8qIDB4QzAtMHhDMyAqLworCTB4REIsIDB4QTcsIDB4REIsIDB4QTQsIDB4RTAsIDB4NDIsIDB4REIsIDB4QTgsIC8qIDB4QzQtMHhDNyAqLworCTB4RTAsIDB4NDMsIDB4RTAsIDB4NDQsIDB4QkQsIDB4QkMsIDB4RTAsIDB4NDUsIC8qIDB4QzgtMHhDQiAqLworCTB4RTAsIDB4NDYsIDB4RTAsIDB4NDcsIDB4QzAsIDB4QzksIDB4REIsIDB4QTMsIC8qIDB4Q0MtMHhDRiAqLworCTB4REIsIDB4QTYsIDB4RDYsIDB4QTMsIDB4RTAsIDB4NDgsIDB4REIsIDB4QTksIC8qIDB4RDAtMHhEMyAqLworCTB4RTAsIDB4NDksIDB4RTAsIDB4NEEsIDB4RTAsIDB4NEIsIDB4REIsIDB4QUQsIC8qIDB4RDQtMHhENyAqLworCTB4RTAsIDB4NEMsIDB4RTAsIDB4NEQsIDB4RTAsIDB4NEUsIDB4REIsIDB4QUUsIC8qIDB4RDgtMHhEQiAqLworCTB4REIsIDB4QUMsIDB4QkEsIDB4QzIsIDB4RTAsIDB4NEYsIDB4RTAsIDB4NTAsIC8qIDB4REMtMHhERiAqLworCTB4RTAsIDB4NTEsIDB4QkYsIDB4QTQsIDB4REIsIDB4QUIsIDB4RTAsIDB4NTIsIC8qIDB4RTAtMHhFMyAqLworCTB4RTAsIDB4NTMsIDB4RTAsIDB4NTQsIDB4REIsIDB4QUEsIDB4RDQsIDB4QzcsIC8qIDB4RTQtMHhFNyAqLworCTB4QjIsIDB4QkYsIDB4RTAsIDB4NTUsIDB4RTAsIDB4NTYsIDB4REIsIDB4QUYsIC8qIDB4RTgtMHhFQiAqLworCTB4RTAsIDB4NTcsIDB4QjksIDB4RjksIDB4RTAsIDB4NTgsIDB4REIsIDB4QjAsIC8qIDB4RUMtMHhFRiAqLworCTB4RTAsIDB4NTksIDB4RTAsIDB4NUEsIDB4RTAsIDB4NUIsIDB4RTAsIDB4NUMsIC8qIDB4RjAtMHhGMyAqLworCTB4QjMsIDB4QkIsIDB4RTAsIDB4NUQsIDB4RTAsIDB4NUUsIDB4RTAsIDB4NUYsIC8qIDB4RjQtMHhGNyAqLworCTB4QjUsIDB4QTYsIDB4RTAsIDB4NjAsIDB4RTAsIDB4NjEsIDB4RTAsIDB4NjIsIC8qIDB4RjgtMHhGQiAqLworCTB4RTAsIDB4NjMsIDB4QjYsIDB4QkMsIDB4REIsIDB4QjEsIDB4RTAsIDB4NjQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzkxWzUxMl0gPSB7CisJMHhFMCwgMHg2NSwgMHhFMCwgMHg2NiwgMHhCNiwgMHhGNSwgMHhFMCwgMHg2NywgLyogMHgwMC0weDAzICovCisJMHhEQiwgMHhCMiwgMHhFMCwgMHg2OCwgMHhFMCwgMHg2OSwgMHhFMCwgMHg2QSwgLyogMHgwNC0weDA3ICovCisJMHhFMCwgMHg2QiwgMHhFMCwgMHg2QywgMHhFMCwgMHg2RCwgMHhFMCwgMHg2RSwgLyogMHgwOC0weDBCICovCisJMHhFMCwgMHg2RiwgMHhFMCwgMHg3MCwgMHhFMCwgMHg3MSwgMHhFMCwgMHg3MiwgLyogMHgwQy0weDBGICovCisJMHhFMCwgMHg3MywgMHhFMCwgMHg3NCwgMHhFMCwgMHg3NSwgMHhFMCwgMHg3NiwgLyogMHgxMC0weDEzICovCisJMHhFMCwgMHg3NywgMHhFMCwgMHg3OCwgMHhFMCwgMHg3OSwgMHhFMCwgMHg3QSwgLyogMHgxNC0weDE3ICovCisJMHhFMCwgMHg3QiwgMHhCMSwgMHhDOSwgMHhFMCwgMHg3QywgMHhFMCwgMHg3RCwgLyogMHgxOC0weDFCICovCisJMHhFMCwgMHg3RSwgMHhFMCwgMHg4MCwgMHhEQiwgMHhCNCwgMHhFMCwgMHg4MSwgLyogMHgxQy0weDFGICovCisJMHhFMCwgMHg4MiwgMHhFMCwgMHg4MywgMHhEQiwgMHhCMywgMHhEQiwgMHhCNSwgLyogMHgyMC0weDIzICovCisJMHhFMCwgMHg4NCwgMHhFMCwgMHg4NSwgMHhFMCwgMHg4NiwgMHhFMCwgMHg4NywgLyogMHgyNC0weDI3ICovCisJMHhFMCwgMHg4OCwgMHhFMCwgMHg4OSwgMHhFMCwgMHg4QSwgMHhFMCwgMHg4QiwgLyogMHgyOC0weDJCICovCisJMHhFMCwgMHg4QywgMHhFMCwgMHg4RCwgMHhFMCwgMHg4RSwgMHhEQiwgMHhCNywgLyogMHgyQy0weDJGICovCisJMHhFMCwgMHg4RiwgMHhEQiwgMHhCNiwgMHhFMCwgMHg5MCwgMHhFMCwgMHg5MSwgLyogMHgzMC0weDMzICovCisJMHhFMCwgMHg5MiwgMHhFMCwgMHg5MywgMHhFMCwgMHg5NCwgMHhFMCwgMHg5NSwgLyogMHgzNC0weDM3ICovCisJMHhFMCwgMHg5NiwgMHhEQiwgMHhCOCwgMHhFMCwgMHg5NywgMHhFMCwgMHg5OCwgLyogMHgzOC0weDNCICovCisJMHhFMCwgMHg5OSwgMHhFMCwgMHg5QSwgMHhFMCwgMHg5QiwgMHhFMCwgMHg5QywgLyogMHgzQy0weDNGICovCisJMHhFMCwgMHg5RCwgMHhFMCwgMHg5RSwgMHhFMCwgMHg5RiwgMHhEQiwgMHhCOSwgLyogMHg0MC0weDQzICovCisJMHhFMCwgMHhBMCwgMHhFMSwgMHg0MCwgMHhEQiwgMHhCQSwgMHhFMSwgMHg0MSwgLyogMHg0NC0weDQ3ICovCisJMHhFMSwgMHg0MiwgMHhEMywgMHhDRiwgMHhGNCwgMHhGQSwgMHhDNywgMHhGNSwgLyogMHg0OC0weDRCICovCisJMHhENywgMHhDMywgMHhDNSwgMHhFNCwgMHhGNCwgMHhGQywgMHhGNCwgMHhGRCwgLyogMHg0Qy0weDRGICovCisJMHhGNCwgMHhGQiwgMHhFMSwgMHg0MywgMHhCRSwgMHhDNiwgMHhFMSwgMHg0NCwgLyogMHg1MC0weDUzICovCisJMHhFMSwgMHg0NSwgMHhFMSwgMHg0NiwgMHhFMSwgMHg0NywgMHhEMCwgMHhFRiwgLyogMHg1NC0weDU3ICovCisJMHhFMSwgMHg0OCwgMHhFMSwgMHg0OSwgMHhCNywgMHhEMywgMHhFMSwgMHg0QSwgLyogMHg1OC0weDVCICovCisJMHhFMSwgMHg0QiwgMHhENCwgMHhDRCwgMHhDQywgMHhBQSwgMHhFMSwgMHg0QywgLyogMHg1Qy0weDVGICovCisJMHhFMSwgMHg0RCwgMHhGNSwgMHhBMiwgMHhGNSwgMHhBMSwgMHhCQSwgMHhBOCwgLyogMHg2MC0weDYzICovCisJMHhGNCwgMHhGRSwgMHhDQiwgMHhENiwgMHhFMSwgMHg0RSwgMHhFMSwgMHg0RiwgLyogMHg2NC0weDY3ICovCisJMHhFMSwgMHg1MCwgMHhGNSwgMHhBNCwgMHhDMCwgMHhEMiwgMHhFMSwgMHg1MSwgLyogMHg2OC0weDZCICovCisJMHhCMywgMHhFQSwgMHhFMSwgMHg1MiwgMHhDRCwgMHhBQSwgMHhGNSwgMHhBNSwgLyogMHg2Qy0weDZGICovCisJMHhGNSwgMHhBMywgMHhCRCwgMHhCNCwgMHhGNSwgMHhBOCwgMHhFMSwgMHg1MywgLyogMHg3MC0weDczICovCisJMHhGNSwgMHhBOSwgMHhCRCwgMHhDRCwgMHhDMywgMHhCOCwgMHhCRiwgMHhFMSwgLyogMHg3NC0weDc3ICovCisJMHhDQiwgMHhFMSwgMHhGNSwgMHhBQSwgMHhFMSwgMHg1NCwgMHhFMSwgMHg1NSwgLyogMHg3OC0weDdCICovCisJMHhFMSwgMHg1NiwgMHhGNSwgMHhBNiwgMHhGNSwgMHhBNywgMHhDNCwgMHhGMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhFMSwgMHg1NywgMHhFMSwgMHg1OCwgMHhFMSwgMHg1OSwgMHhFMSwgMHg1QSwgLyogMHg4MC0weDgzICovCisJMHhFMSwgMHg1QiwgMHhGNSwgMHhBQywgMHhFMSwgMHg1QywgMHhCNCwgMHhCQywgLyogMHg4NC0weDg3ICovCisJMHhFMSwgMHg1RCwgMHhENywgMHhFRCwgMHhFMSwgMHg1RSwgMHhCNCwgMHhENywgLyogMHg4OC0weDhCICovCisJMHhGNSwgMHhBQiwgMHhGNSwgMHhBRSwgMHhFMSwgMHg1RiwgMHhFMSwgMHg2MCwgLyogMHg4Qy0weDhGICovCisJMHhGNSwgMHhBRCwgMHhGNSwgMHhBRiwgMHhEMCwgMHhEMSwgMHhFMSwgMHg2MSwgLyogMHg5MC0weDkzICovCisJMHhFMSwgMHg2MiwgMHhFMSwgMHg2MywgMHhFMSwgMHg2NCwgMHhFMSwgMHg2NSwgLyogMHg5NC0weDk3ICovCisJMHhFMSwgMHg2NiwgMHhFMSwgMHg2NywgMHhDMywgMHhEMSwgMHhDOCwgMHhBOSwgLyogMHg5OC0weDlCICovCisJMHhFMSwgMHg2OCwgMHhFMSwgMHg2OSwgMHhFMSwgMHg2QSwgMHhFMSwgMHg2QiwgLyogMHg5Qy0weDlGICovCisJMHhFMSwgMHg2QywgMHhFMSwgMHg2RCwgMHhGNSwgMHhCMCwgMHhGNSwgMHhCMSwgLyogMHhBMC0weEEzICovCisJMHhFMSwgMHg2RSwgMHhFMSwgMHg2RiwgMHhFMSwgMHg3MCwgMHhFMSwgMHg3MSwgLyogMHhBNC0weEE3ICovCisJMHhFMSwgMHg3MiwgMHhFMSwgMHg3MywgMHhGNSwgMHhCMiwgMHhFMSwgMHg3NCwgLyogMHhBOC0weEFCICovCisJMHhFMSwgMHg3NSwgMHhGNSwgMHhCMywgMHhGNSwgMHhCNCwgMHhGNSwgMHhCNSwgLyogMHhBQy0weEFGICovCisJMHhFMSwgMHg3NiwgMHhFMSwgMHg3NywgMHhFMSwgMHg3OCwgMHhFMSwgMHg3OSwgLyogMHhCMC0weEIzICovCisJMHhGNSwgMHhCNywgMHhGNSwgMHhCNiwgMHhFMSwgMHg3QSwgMHhFMSwgMHg3QiwgLyogMHhCNC0weEI3ICovCisJMHhFMSwgMHg3QywgMHhFMSwgMHg3RCwgMHhGNSwgMHhCOCwgMHhFMSwgMHg3RSwgLyogMHhCOC0weEJCICovCisJMHhFMSwgMHg4MCwgMHhFMSwgMHg4MSwgMHhFMSwgMHg4MiwgMHhFMSwgMHg4MywgLyogMHhCQy0weEJGICovCisJMHhFMSwgMHg4NCwgMHhFMSwgMHg4NSwgMHhFMSwgMHg4NiwgMHhFMSwgMHg4NywgLyogMHhDMC0weEMzICovCisJMHhFMSwgMHg4OCwgMHhFMSwgMHg4OSwgMHhFMSwgMHg4QSwgMHhCMiwgMHhDOSwgLyogMHhDNC0weEM3ICovCisJMHhFMSwgMHg4QiwgMHhEMywgMHhENCwgMHhDQSwgMHhDRCwgMHhFMSwgMHg4QywgLyogMHhDOC0weENCICovCisJMHhDMCwgMHhFRiwgMHhENiwgMHhEOCwgMHhEMiwgMHhCMCwgMHhDMSwgMHhCRiwgLyogMHhDQy0weENGICovCisJMHhFMSwgMHg4RCwgMHhCRCwgMHhGMCwgMHhFMSwgMHg4RSwgMHhFMSwgMHg4RiwgLyogMHhEMC0weEQzICovCisJMHhFMSwgMHg5MCwgMHhFMSwgMHg5MSwgMHhFMSwgMHg5MiwgMHhFMSwgMHg5MywgLyogMHhENC0weEQ3ICovCisJMHhFMSwgMHg5NCwgMHhFMSwgMHg5NSwgMHhFMSwgMHg5NiwgMHhFMSwgMHg5NywgLyogMHhEOC0weERCICovCisJMHhCOCwgMHhBQSwgMHhFMSwgMHg5OCwgMHhFMSwgMHg5OSwgMHhFMSwgMHg5QSwgLyogMHhEQy0weERGICovCisJMHhFMSwgMHg5QiwgMHhFMSwgMHg5QywgMHhFMSwgMHg5RCwgMHhFMSwgMHg5RSwgLyogMHhFMC0weEUzICovCisJMHhFMSwgMHg5RiwgMHhFMSwgMHhBMCwgMHhFMiwgMHg0MCwgMHhFMiwgMHg0MSwgLyogMHhFNC0weEU3ICovCisJMHhFMiwgMHg0MiwgMHhFMiwgMHg0MywgMHhFMiwgMHg0NCwgMHhFMiwgMHg0NSwgLyogMHhFOC0weEVCICovCisJMHhFMiwgMHg0NiwgMHhFMiwgMHg0NywgMHhFMiwgMHg0OCwgMHhFMiwgMHg0OSwgLyogMHhFQy0weEVGICovCisJMHhFMiwgMHg0QSwgMHhFMiwgMHg0QiwgMHhFMiwgMHg0QywgMHhFMiwgMHg0RCwgLyogMHhGMC0weEYzICovCisJMHhFMiwgMHg0RSwgMHhFMiwgMHg0RiwgMHhFMiwgMHg1MCwgMHhFMiwgMHg1MSwgLyogMHhGNC0weEY3ICovCisJMHhFMiwgMHg1MiwgMHhFMiwgMHg1MywgMHhFMiwgMHg1NCwgMHhFMiwgMHg1NSwgLyogMHhGOC0weEZCICovCisJMHhFMiwgMHg1NiwgMHhFMiwgMHg1NywgMHhFMiwgMHg1OCwgMHhFMiwgMHg1OSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTJbNTEyXSA9IHsKKwkweEUyLCAweDVBLCAweEUyLCAweDVCLCAweEUyLCAweDVDLCAweEUyLCAweDVELCAvKiAweDAwLTB4MDMgKi8KKwkweEUyLCAweDVFLCAweEUyLCAweDVGLCAweEUyLCAweDYwLCAweEUyLCAweDYxLCAvKiAweDA0LTB4MDcgKi8KKwkweEUyLCAweDYyLCAweEUyLCAweDYzLCAweEUyLCAweDY0LCAweEUyLCAweDY1LCAvKiAweDA4LTB4MEIgKi8KKwkweEUyLCAweDY2LCAweEUyLCAweDY3LCAweEUyLCAweDY4LCAweEUyLCAweDY5LCAvKiAweDBDLTB4MEYgKi8KKwkweEUyLCAweDZBLCAweEUyLCAweDZCLCAweEUyLCAweDZDLCAweEUyLCAweDZELCAvKiAweDEwLTB4MTMgKi8KKwkweEUyLCAweDZFLCAweEUyLCAweDZGLCAweEUyLCAweDcwLCAweEUyLCAweDcxLCAvKiAweDE0LTB4MTcgKi8KKwkweEUyLCAweDcyLCAweEUyLCAweDczLCAweEUyLCAweDc0LCAweEUyLCAweDc1LCAvKiAweDE4LTB4MUIgKi8KKwkweEUyLCAweDc2LCAweEUyLCAweDc3LCAweEUyLCAweDc4LCAweEUyLCAweDc5LCAvKiAweDFDLTB4MUYgKi8KKwkweEUyLCAweDdBLCAweEUyLCAweDdCLCAweEUyLCAweDdDLCAweEUyLCAweDdELCAvKiAweDIwLTB4MjMgKi8KKwkweEUyLCAweDdFLCAweEUyLCAweDgwLCAweEUyLCAweDgxLCAweEUyLCAweDgyLCAvKiAweDI0LTB4MjcgKi8KKwkweEUyLCAweDgzLCAweEUyLCAweDg0LCAweEUyLCAweDg1LCAweEUyLCAweDg2LCAvKiAweDI4LTB4MkIgKi8KKwkweEUyLCAweDg3LCAweEUyLCAweDg4LCAweEUyLCAweDg5LCAweEUyLCAweDhBLCAvKiAweDJDLTB4MkYgKi8KKwkweEUyLCAweDhCLCAweEUyLCAweDhDLCAweEUyLCAweDhELCAweEUyLCAweDhFLCAvKiAweDMwLTB4MzMgKi8KKwkweEUyLCAweDhGLCAweEUyLCAweDkwLCAweEUyLCAweDkxLCAweEUyLCAweDkyLCAvKiAweDM0LTB4MzcgKi8KKwkweEUyLCAweDkzLCAweEUyLCAweDk0LCAweEUyLCAweDk1LCAweEUyLCAweDk2LCAvKiAweDM4LTB4M0IgKi8KKwkweEUyLCAweDk3LCAweEUyLCAweDk4LCAweEUyLCAweDk5LCAweEUyLCAweDlBLCAvKiAweDNDLTB4M0YgKi8KKwkweEUyLCAweDlCLCAweEUyLCAweDlDLCAweEUyLCAweDlELCAweEUyLCAweDlFLCAvKiAweDQwLTB4NDMgKi8KKwkweEUyLCAweDlGLCAweEUyLCAweEEwLCAweEUzLCAweDQwLCAweEUzLCAweDQxLCAvKiAweDQ0LTB4NDcgKi8KKwkweEUzLCAweDQyLCAweEUzLCAweDQzLCAweEUzLCAweDQ0LCAweEUzLCAweDQ1LCAvKiAweDQ4LTB4NEIgKi8KKwkweEUzLCAweDQ2LCAweEUzLCAweDQ3LCAweEUzLCAweDQ4LCAweEUzLCAweDQ5LCAvKiAweDRDLTB4NEYgKi8KKwkweEUzLCAweDRBLCAweEUzLCAweDRCLCAweEUzLCAweDRDLCAweEUzLCAweDRELCAvKiAweDUwLTB4NTMgKi8KKwkweEUzLCAweDRFLCAweEUzLCAweDRGLCAweEUzLCAweDUwLCAweEUzLCAweDUxLCAvKiAweDU0LTB4NTcgKi8KKwkweEUzLCAweDUyLCAweEUzLCAweDUzLCAweEUzLCAweDU0LCAweEUzLCAweDU1LCAvKiAweDU4LTB4NUIgKi8KKwkweEUzLCAweDU2LCAweEUzLCAweDU3LCAweEUzLCAweDU4LCAweEUzLCAweDU5LCAvKiAweDVDLTB4NUYgKi8KKwkweEUzLCAweDVBLCAweEUzLCAweDVCLCAweEUzLCAweDVDLCAweEUzLCAweDVELCAvKiAweDYwLTB4NjMgKi8KKwkweEUzLCAweDVFLCAweEUzLCAweDVGLCAweEUzLCAweDYwLCAweEUzLCAweDYxLCAvKiAweDY0LTB4NjcgKi8KKwkweEUzLCAweDYyLCAweEUzLCAweDYzLCAweEUzLCAweDY0LCAweEUzLCAweDY1LCAvKiAweDY4LTB4NkIgKi8KKwkweEUzLCAweDY2LCAweEUzLCAweDY3LCAweEUzLCAweDY4LCAweEUzLCAweDY5LCAvKiAweDZDLTB4NkYgKi8KKwkweEUzLCAweDZBLCAweEUzLCAweDZCLCAweEUzLCAweDZDLCAweEUzLCAweDZELCAvKiAweDcwLTB4NzMgKi8KKwkweEJDLCAweEY4LCAweEUzLCAweDZFLCAweEUzLCAweDZGLCAweEUzLCAweDcwLCAvKiAweDc0LTB4NzcgKi8KKwkweEUzLCAweDcxLCAweEUzLCAweDcyLCAweEUzLCAweDczLCAweEUzLCAweDc0LCAvKiAweDc4LTB4N0IgKi8KKwkweEUzLCAweDc1LCAweEUzLCAweDc2LCAweEUzLCAweDc3LCAweEUzLCAweDc4LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEUzLCAweDc5LCAweEUzLCAweDdBLCAweEUzLCAweDdCLCAweEUzLCAweDdDLCAvKiAweDgwLTB4ODMgKi8KKwkweEUzLCAweDdELCAweEUzLCAweDdFLCAweEUzLCAweDgwLCAweEUzLCAweDgxLCAvKiAweDg0LTB4ODcgKi8KKwkweEUzLCAweDgyLCAweEUzLCAweDgzLCAweEUzLCAweDg0LCAweEUzLCAweDg1LCAvKiAweDg4LTB4OEIgKi8KKwkweEUzLCAweDg2LCAweEUzLCAweDg3LCAweEY2LCAweEM2LCAweEUzLCAweDg4LCAvKiAweDhDLTB4OEYgKi8KKwkweEUzLCAweDg5LCAweEUzLCAweDhBLCAweEUzLCAweDhCLCAweEUzLCAweDhDLCAvKiAweDkwLTB4OTMgKi8KKwkweEUzLCAweDhELCAweEUzLCAweDhFLCAweEUzLCAweDhGLCAweEUzLCAweDkwLCAvKiAweDk0LTB4OTcgKi8KKwkweEUzLCAweDkxLCAweEUzLCAweDkyLCAweEUzLCAweDkzLCAweEUzLCAweDk0LCAvKiAweDk4LTB4OUIgKi8KKwkweEUzLCAweDk1LCAweEUzLCAweDk2LCAweEUzLCAweDk3LCAweEUzLCAweDk4LCAvKiAweDlDLTB4OUYgKi8KKwkweEUzLCAweDk5LCAweEUzLCAweDlBLCAweEUzLCAweDlCLCAweEUzLCAweDlDLCAvKiAweEEwLTB4QTMgKi8KKwkweEUzLCAweDlELCAweEUzLCAweDlFLCAweEUzLCAweDlGLCAweEUzLCAweEEwLCAvKiAweEE0LTB4QTcgKi8KKwkweEU0LCAweDQwLCAweEU0LCAweDQxLCAweEU0LCAweDQyLCAweEU0LCAweDQzLCAvKiAweEE4LTB4QUIgKi8KKwkweEU0LCAweDQ0LCAweEU0LCAweDQ1LCAweEY2LCAweEM3LCAweEU0LCAweDQ2LCAvKiAweEFDLTB4QUYgKi8KKwkweEU0LCAweDQ3LCAweEU0LCAweDQ4LCAweEU0LCAweDQ5LCAweEU0LCAweDRBLCAvKiAweEIwLTB4QjMgKi8KKwkweEU0LCAweDRCLCAweEU0LCAweDRDLCAweEU0LCAweDRELCAweEU0LCAweDRFLCAvKiAweEI0LTB4QjcgKi8KKwkweEU0LCAweDRGLCAweEU0LCAweDUwLCAweEU0LCAweDUxLCAweEU0LCAweDUyLCAvKiAweEI4LTB4QkIgKi8KKwkweEU0LCAweDUzLCAweEU0LCAweDU0LCAweEU0LCAweDU1LCAweEU0LCAweDU2LCAvKiAweEJDLTB4QkYgKi8KKwkweEU0LCAweDU3LCAweEU0LCAweDU4LCAweEU0LCAweDU5LCAweEU0LCAweDVBLCAvKiAweEMwLTB4QzMgKi8KKwkweEU0LCAweDVCLCAweEU0LCAweDVDLCAweEU0LCAweDVELCAweEU0LCAweDVFLCAvKiAweEM0LTB4QzcgKi8KKwkweEY2LCAweEM4LCAweEU0LCAweDVGLCAweEU0LCAweDYwLCAweEU0LCAweDYxLCAvKiAweEM4LTB4Q0IgKi8KKwkweEU0LCAweDYyLCAweEU0LCAweDYzLCAweEU0LCAweDY0LCAweEU0LCAweDY1LCAvKiAweENDLTB4Q0YgKi8KKwkweEU0LCAweDY2LCAweEU0LCAweDY3LCAweEU0LCAweDY4LCAweEU0LCAweDY5LCAvKiAweEQwLTB4RDMgKi8KKwkweEU0LCAweDZBLCAweEU0LCAweDZCLCAweEU0LCAweDZDLCAweEU0LCAweDZELCAvKiAweEQ0LTB4RDcgKi8KKwkweEU0LCAweDZFLCAweEU0LCAweDZGLCAweEU0LCAweDcwLCAweEU0LCAweDcxLCAvKiAweEQ4LTB4REIgKi8KKwkweEU0LCAweDcyLCAweEU0LCAweDczLCAweEU0LCAweDc0LCAweEU0LCAweDc1LCAvKiAweERDLTB4REYgKi8KKwkweEU0LCAweDc2LCAweEU0LCAweDc3LCAweEU0LCAweDc4LCAweEU0LCAweDc5LCAvKiAweEUwLTB4RTMgKi8KKwkweEU0LCAweDdBLCAweEU0LCAweDdCLCAweEU0LCAweDdDLCAweEU0LCAweDdELCAvKiAweEU0LTB4RTcgKi8KKwkweEU0LCAweDdFLCAweEU0LCAweDgwLCAweEU0LCAweDgxLCAweEU0LCAweDgyLCAvKiAweEU4LTB4RUIgKi8KKwkweEU0LCAweDgzLCAweEU0LCAweDg0LCAweEU0LCAweDg1LCAweEU0LCAweDg2LCAvKiAweEVDLTB4RUYgKi8KKwkweEU0LCAweDg3LCAweEU0LCAweDg4LCAweEU0LCAweDg5LCAweEU0LCAweDhBLCAvKiAweEYwLTB4RjMgKi8KKwkweEU0LCAweDhCLCAweEU0LCAweDhDLCAweEU0LCAweDhELCAweEU0LCAweDhFLCAvKiAweEY0LTB4RjcgKi8KKwkweEU0LCAweDhGLCAweEU0LCAweDkwLCAweEU0LCAweDkxLCAweEU0LCAweDkyLCAvKiAweEY4LTB4RkIgKi8KKwkweEU0LCAweDkzLCAweEU0LCAweDk0LCAweEU0LCAweDk1LCAweEU0LCAweDk2LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185M1s1MTJdID0geworCTB4RTQsIDB4OTcsIDB4RTQsIDB4OTgsIDB4RTQsIDB4OTksIDB4RTQsIDB4OUEsIC8qIDB4MDAtMHgwMyAqLworCTB4RTQsIDB4OUIsIDB4RTQsIDB4OUMsIDB4RTQsIDB4OUQsIDB4RTQsIDB4OUUsIC8qIDB4MDQtMHgwNyAqLworCTB4RTQsIDB4OUYsIDB4RTQsIDB4QTAsIDB4RTUsIDB4NDAsIDB4RTUsIDB4NDEsIC8qIDB4MDgtMHgwQiAqLworCTB4RTUsIDB4NDIsIDB4RTUsIDB4NDMsIDB4RTUsIDB4NDQsIDB4RTUsIDB4NDUsIC8qIDB4MEMtMHgwRiAqLworCTB4RTUsIDB4NDYsIDB4RTUsIDB4NDcsIDB4RTUsIDB4NDgsIDB4RTUsIDB4NDksIC8qIDB4MTAtMHgxMyAqLworCTB4RTUsIDB4NEEsIDB4RTUsIDB4NEIsIDB4RTUsIDB4NEMsIDB4RTUsIDB4NEQsIC8qIDB4MTQtMHgxNyAqLworCTB4RTUsIDB4NEUsIDB4RTUsIDB4NEYsIDB4RTUsIDB4NTAsIDB4RTUsIDB4NTEsIC8qIDB4MTgtMHgxQiAqLworCTB4RTUsIDB4NTIsIDB4RTUsIDB4NTMsIDB4RTUsIDB4NTQsIDB4RTUsIDB4NTUsIC8qIDB4MUMtMHgxRiAqLworCTB4RTUsIDB4NTYsIDB4RTUsIDB4NTcsIDB4RTUsIDB4NTgsIDB4RTUsIDB4NTksIC8qIDB4MjAtMHgyMyAqLworCTB4RTUsIDB4NUEsIDB4RTUsIDB4NUIsIDB4RTUsIDB4NUMsIDB4RTUsIDB4NUQsIC8qIDB4MjQtMHgyNyAqLworCTB4RTUsIDB4NUUsIDB4RTUsIDB4NUYsIDB4RTUsIDB4NjAsIDB4RTUsIDB4NjEsIC8qIDB4MjgtMHgyQiAqLworCTB4RTUsIDB4NjIsIDB4RTUsIDB4NjMsIDB4RTUsIDB4NjQsIDB4RTUsIDB4NjUsIC8qIDB4MkMtMHgyRiAqLworCTB4RTUsIDB4NjYsIDB4RTUsIDB4NjcsIDB4RTUsIDB4NjgsIDB4RTUsIDB4NjksIC8qIDB4MzAtMHgzMyAqLworCTB4RTUsIDB4NkEsIDB4RTUsIDB4NkIsIDB4RTUsIDB4NkMsIDB4RTUsIDB4NkQsIC8qIDB4MzQtMHgzNyAqLworCTB4RTUsIDB4NkUsIDB4RTUsIDB4NkYsIDB4RTUsIDB4NzAsIDB4RTUsIDB4NzEsIC8qIDB4MzgtMHgzQiAqLworCTB4RTUsIDB4NzIsIDB4RTUsIDB4NzMsIDB4RjYsIDB4QzksIDB4RTUsIDB4NzQsIC8qIDB4M0MtMHgzRiAqLworCTB4RTUsIDB4NzUsIDB4RTUsIDB4NzYsIDB4RTUsIDB4NzcsIDB4RTUsIDB4NzgsIC8qIDB4NDAtMHg0MyAqLworCTB4RTUsIDB4NzksIDB4RTUsIDB4N0EsIDB4RTUsIDB4N0IsIDB4RTUsIDB4N0MsIC8qIDB4NDQtMHg0NyAqLworCTB4RTUsIDB4N0QsIDB4RTUsIDB4N0UsIDB4RTUsIDB4ODAsIDB4RTUsIDB4ODEsIC8qIDB4NDgtMHg0QiAqLworCTB4RTUsIDB4ODIsIDB4RTUsIDB4ODMsIDB4RTUsIDB4ODQsIDB4RTUsIDB4ODUsIC8qIDB4NEMtMHg0RiAqLworCTB4RTUsIDB4ODYsIDB4RTUsIDB4ODcsIDB4RTUsIDB4ODgsIDB4RTUsIDB4ODksIC8qIDB4NTAtMHg1MyAqLworCTB4RTUsIDB4OEEsIDB4RTUsIDB4OEIsIDB4RTUsIDB4OEMsIDB4RTUsIDB4OEQsIC8qIDB4NTQtMHg1NyAqLworCTB4RTUsIDB4OEUsIDB4RTUsIDB4OEYsIDB4RTUsIDB4OTAsIDB4RTUsIDB4OTEsIC8qIDB4NTgtMHg1QiAqLworCTB4RTUsIDB4OTIsIDB4RTUsIDB4OTMsIDB4RTUsIDB4OTQsIDB4RTUsIDB4OTUsIC8qIDB4NUMtMHg1RiAqLworCTB4RTUsIDB4OTYsIDB4RTUsIDB4OTcsIDB4RTUsIDB4OTgsIDB4RTUsIDB4OTksIC8qIDB4NjAtMHg2MyAqLworCTB4RTUsIDB4OUEsIDB4RTUsIDB4OUIsIDB4RTUsIDB4OUMsIDB4RTUsIDB4OUQsIC8qIDB4NjQtMHg2NyAqLworCTB4RTUsIDB4OUUsIDB4RTUsIDB4OUYsIDB4RjYsIDB4Q0EsIDB4RTUsIDB4QTAsIC8qIDB4NjgtMHg2QiAqLworCTB4RTYsIDB4NDAsIDB4RTYsIDB4NDEsIDB4RTYsIDB4NDIsIDB4RTYsIDB4NDMsIC8qIDB4NkMtMHg2RiAqLworCTB4RTYsIDB4NDQsIDB4RTYsIDB4NDUsIDB4RTYsIDB4NDYsIDB4RTYsIDB4NDcsIC8qIDB4NzAtMHg3MyAqLworCTB4RTYsIDB4NDgsIDB4RTYsIDB4NDksIDB4RTYsIDB4NEEsIDB4RTYsIDB4NEIsIC8qIDB4NzQtMHg3NyAqLworCTB4RTYsIDB4NEMsIDB4RTYsIDB4NEQsIDB4RTYsIDB4NEUsIDB4RTYsIDB4NEYsIC8qIDB4NzgtMHg3QiAqLworCTB4RTYsIDB4NTAsIDB4RTYsIDB4NTEsIDB4RTYsIDB4NTIsIDB4RTYsIDB4NTMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RTYsIDB4NTQsIDB4RTYsIDB4NTUsIDB4RTYsIDB4NTYsIDB4RTYsIDB4NTcsIC8qIDB4ODAtMHg4MyAqLworCTB4RTYsIDB4NTgsIDB4RTYsIDB4NTksIDB4RTYsIDB4NUEsIDB4RTYsIDB4NUIsIC8qIDB4ODQtMHg4NyAqLworCTB4RTYsIDB4NUMsIDB4RTYsIDB4NUQsIDB4RTYsIDB4NUUsIDB4RTYsIDB4NUYsIC8qIDB4ODgtMHg4QiAqLworCTB4RTYsIDB4NjAsIDB4RTYsIDB4NjEsIDB4RTYsIDB4NjIsIDB4RjYsIDB4Q0MsIC8qIDB4OEMtMHg4RiAqLworCTB4RTYsIDB4NjMsIDB4RTYsIDB4NjQsIDB4RTYsIDB4NjUsIDB4RTYsIDB4NjYsIC8qIDB4OTAtMHg5MyAqLworCTB4RTYsIDB4NjcsIDB4RTYsIDB4NjgsIDB4RTYsIDB4NjksIDB4RTYsIDB4NkEsIC8qIDB4OTQtMHg5NyAqLworCTB4RTYsIDB4NkIsIDB4RTYsIDB4NkMsIDB4RTYsIDB4NkQsIDB4RTYsIDB4NkUsIC8qIDB4OTgtMHg5QiAqLworCTB4RTYsIDB4NkYsIDB4RTYsIDB4NzAsIDB4RTYsIDB4NzEsIDB4RTYsIDB4NzIsIC8qIDB4OUMtMHg5RiAqLworCTB4RTYsIDB4NzMsIDB4RTYsIDB4NzQsIDB4RTYsIDB4NzUsIDB4RTYsIDB4NzYsIC8qIDB4QTAtMHhBMyAqLworCTB4RTYsIDB4NzcsIDB4RTYsIDB4NzgsIDB4RTYsIDB4NzksIDB4RTYsIDB4N0EsIC8qIDB4QTQtMHhBNyAqLworCTB4RTYsIDB4N0IsIDB4RTYsIDB4N0MsIDB4RTYsIDB4N0QsIDB4RTYsIDB4N0UsIC8qIDB4QTgtMHhBQiAqLworCTB4RTYsIDB4ODAsIDB4RTYsIDB4ODEsIDB4RTYsIDB4ODIsIDB4RTYsIDB4ODMsIC8qIDB4QUMtMHhBRiAqLworCTB4RTYsIDB4ODQsIDB4RTYsIDB4ODUsIDB4RTYsIDB4ODYsIDB4RTYsIDB4ODcsIC8qIDB4QjAtMHhCMyAqLworCTB4RTYsIDB4ODgsIDB4RTYsIDB4ODksIDB4RTYsIDB4OEEsIDB4RTYsIDB4OEIsIC8qIDB4QjQtMHhCNyAqLworCTB4RTYsIDB4OEMsIDB4RTYsIDB4OEQsIDB4RTYsIDB4OEUsIDB4RTYsIDB4OEYsIC8qIDB4QjgtMHhCQiAqLworCTB4RTYsIDB4OTAsIDB4RTYsIDB4OTEsIDB4RTYsIDB4OTIsIDB4RTYsIDB4OTMsIC8qIDB4QkMtMHhCRiAqLworCTB4RTYsIDB4OTQsIDB4RTYsIDB4OTUsIDB4RTYsIDB4OTYsIDB4RTYsIDB4OTcsIC8qIDB4QzAtMHhDMyAqLworCTB4RTYsIDB4OTgsIDB4RTYsIDB4OTksIDB4RTYsIDB4OUEsIDB4RTYsIDB4OUIsIC8qIDB4QzQtMHhDNyAqLworCTB4RTYsIDB4OUMsIDB4RTYsIDB4OUQsIDB4RjYsIDB4Q0IsIDB4RTYsIDB4OUUsIC8qIDB4QzgtMHhDQiAqLworCTB4RTYsIDB4OUYsIDB4RTYsIDB4QTAsIDB4RTcsIDB4NDAsIDB4RTcsIDB4NDEsIC8qIDB4Q0MtMHhDRiAqLworCTB4RTcsIDB4NDIsIDB4RTcsIDB4NDMsIDB4RTcsIDB4NDQsIDB4RTcsIDB4NDUsIC8qIDB4RDAtMHhEMyAqLworCTB4RTcsIDB4NDYsIDB4RTcsIDB4NDcsIDB4RjcsIDB4RTksIDB4RTcsIDB4NDgsIC8qIDB4RDQtMHhENyAqLworCTB4RTcsIDB4NDksIDB4RTcsIDB4NEEsIDB4RTcsIDB4NEIsIDB4RTcsIDB4NEMsIC8qIDB4RDgtMHhEQiAqLworCTB4RTcsIDB4NEQsIDB4RTcsIDB4NEUsIDB4RTcsIDB4NEYsIDB4RTcsIDB4NTAsIC8qIDB4REMtMHhERiAqLworCTB4RTcsIDB4NTEsIDB4RTcsIDB4NTIsIDB4RTcsIDB4NTMsIDB4RTcsIDB4NTQsIC8qIDB4RTAtMHhFMyAqLworCTB4RTcsIDB4NTUsIDB4RTcsIDB4NTYsIDB4RTcsIDB4NTcsIDB4RTcsIDB4NTgsIC8qIDB4RTQtMHhFNyAqLworCTB4RTcsIDB4NTksIDB4RTcsIDB4NUEsIDB4RTcsIDB4NUIsIDB4RTcsIDB4NUMsIC8qIDB4RTgtMHhFQiAqLworCTB4RTcsIDB4NUQsIDB4RTcsIDB4NUUsIDB4RTcsIDB4NUYsIDB4RTcsIDB4NjAsIC8qIDB4RUMtMHhFRiAqLworCTB4RTcsIDB4NjEsIDB4RTcsIDB4NjIsIDB4RTcsIDB4NjMsIDB4RTcsIDB4NjQsIC8qIDB4RjAtMHhGMyAqLworCTB4RTcsIDB4NjUsIDB4RTcsIDB4NjYsIDB4RTcsIDB4NjcsIDB4RTcsIDB4NjgsIC8qIDB4RjQtMHhGNyAqLworCTB4RTcsIDB4NjksIDB4RTcsIDB4NkEsIDB4RTcsIDB4NkIsIDB4RTcsIDB4NkMsIC8qIDB4RjgtMHhGQiAqLworCTB4RTcsIDB4NkQsIDB4RTcsIDB4NkUsIDB4RTcsIDB4NkYsIDB4RTcsIDB4NzAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzk0WzUxMl0gPSB7CisJMHhFNywgMHg3MSwgMHhFNywgMHg3MiwgMHhFNywgMHg3MywgMHhFNywgMHg3NCwgLyogMHgwMC0weDAzICovCisJMHhFNywgMHg3NSwgMHhFNywgMHg3NiwgMHhFNywgMHg3NywgMHhFNywgMHg3OCwgLyogMHgwNC0weDA3ICovCisJMHhFNywgMHg3OSwgMHhFNywgMHg3QSwgMHhFNywgMHg3QiwgMHhFNywgMHg3QywgLyogMHgwOC0weDBCICovCisJMHhFNywgMHg3RCwgMHhFNywgMHg3RSwgMHhFNywgMHg4MCwgMHhFNywgMHg4MSwgLyogMHgwQy0weDBGICovCisJMHhFNywgMHg4MiwgMHhFNywgMHg4MywgMHhFNywgMHg4NCwgMHhFNywgMHg4NSwgLyogMHgxMC0weDEzICovCisJMHhFNywgMHg4NiwgMHhFNywgMHg4NywgMHhFNywgMHg4OCwgMHhFNywgMHg4OSwgLyogMHgxNC0weDE3ICovCisJMHhFNywgMHg4QSwgMHhFNywgMHg4QiwgMHhFNywgMHg4QywgMHhFNywgMHg4RCwgLyogMHgxOC0weDFCICovCisJMHhFNywgMHg4RSwgMHhFNywgMHg4RiwgMHhFNywgMHg5MCwgMHhFNywgMHg5MSwgLyogMHgxQy0weDFGICovCisJMHhFNywgMHg5MiwgMHhFNywgMHg5MywgMHhFNywgMHg5NCwgMHhFNywgMHg5NSwgLyogMHgyMC0weDIzICovCisJMHhFNywgMHg5NiwgMHhFNywgMHg5NywgMHhFNywgMHg5OCwgMHhFNywgMHg5OSwgLyogMHgyNC0weDI3ICovCisJMHhFNywgMHg5QSwgMHhFNywgMHg5QiwgMHhFNywgMHg5QywgMHhFNywgMHg5RCwgLyogMHgyOC0weDJCICovCisJMHhFNywgMHg5RSwgMHhFNywgMHg5RiwgMHhFNywgMHhBMCwgMHhFOCwgMHg0MCwgLyogMHgyQy0weDJGICovCisJMHhFOCwgMHg0MSwgMHhFOCwgMHg0MiwgMHhFOCwgMHg0MywgMHhFOCwgMHg0NCwgLyogMHgzMC0weDMzICovCisJMHhFOCwgMHg0NSwgMHhFOCwgMHg0NiwgMHhFOCwgMHg0NywgMHhFOCwgMHg0OCwgLyogMHgzNC0weDM3ICovCisJMHhFOCwgMHg0OSwgMHhFOCwgMHg0QSwgMHhFOCwgMHg0QiwgMHhFOCwgMHg0QywgLyogMHgzOC0weDNCICovCisJMHhFOCwgMHg0RCwgMHhFOCwgMHg0RSwgMHhGNiwgMHhDRCwgMHhFOCwgMHg0RiwgLyogMHgzQy0weDNGICovCisJMHhFOCwgMHg1MCwgMHhFOCwgMHg1MSwgMHhFOCwgMHg1MiwgMHhFOCwgMHg1MywgLyogMHg0MC0weDQzICovCisJMHhFOCwgMHg1NCwgMHhFOCwgMHg1NSwgMHhFOCwgMHg1NiwgMHhFOCwgMHg1NywgLyogMHg0NC0weDQ3ICovCisJMHhFOCwgMHg1OCwgMHhFOCwgMHg1OSwgMHhFOCwgMHg1QSwgMHhFOCwgMHg1QiwgLyogMHg0OC0weDRCICovCisJMHhFOCwgMHg1QywgMHhFOCwgMHg1RCwgMHhFOCwgMHg1RSwgMHhFOCwgMHg1RiwgLyogMHg0Qy0weDRGICovCisJMHhFOCwgMHg2MCwgMHhFOCwgMHg2MSwgMHhFOCwgMHg2MiwgMHhFOCwgMHg2MywgLyogMHg1MC0weDUzICovCisJMHhFOCwgMHg2NCwgMHhFOCwgMHg2NSwgMHhFOCwgMHg2NiwgMHhFOCwgMHg2NywgLyogMHg1NC0weDU3ICovCisJMHhFOCwgMHg2OCwgMHhFOCwgMHg2OSwgMHhFOCwgMHg2QSwgMHhFOCwgMHg2QiwgLyogMHg1OC0weDVCICovCisJMHhFOCwgMHg2QywgMHhFOCwgMHg2RCwgMHhFOCwgMHg2RSwgMHhFOCwgMHg2RiwgLyogMHg1Qy0weDVGICovCisJMHhFOCwgMHg3MCwgMHhFOCwgMHg3MSwgMHhFOCwgMHg3MiwgMHhFOCwgMHg3MywgLyogMHg2MC0weDYzICovCisJMHhFOCwgMHg3NCwgMHhFOCwgMHg3NSwgMHhFOCwgMHg3NiwgMHhFOCwgMHg3NywgLyogMHg2NC0weDY3ICovCisJMHhFOCwgMHg3OCwgMHhFOCwgMHg3OSwgMHhFOCwgMHg3QSwgMHhGNiwgMHhDRSwgLyogMHg2OC0weDZCICovCisJMHhFOCwgMHg3QiwgMHhFOCwgMHg3QywgMHhFOCwgMHg3RCwgMHhFOCwgMHg3RSwgLyogMHg2Qy0weDZGICovCisJMHhFOCwgMHg4MCwgMHhFOCwgMHg4MSwgMHhFOCwgMHg4MiwgMHhFOCwgMHg4MywgLyogMHg3MC0weDczICovCisJMHhFOCwgMHg4NCwgMHhFOCwgMHg4NSwgMHhFOCwgMHg4NiwgMHhFOCwgMHg4NywgLyogMHg3NC0weDc3ICovCisJMHhFOCwgMHg4OCwgMHhFOCwgMHg4OSwgMHhFOCwgMHg4QSwgMHhFOCwgMHg4QiwgLyogMHg3OC0weDdCICovCisJMHhFOCwgMHg4QywgMHhFOCwgMHg4RCwgMHhFOCwgMHg4RSwgMHhFOCwgMHg4RiwgLyogMHg3Qy0weDdGICovCisJCisJMHhFOCwgMHg5MCwgMHhFOCwgMHg5MSwgMHhFOCwgMHg5MiwgMHhFOCwgMHg5MywgLyogMHg4MC0weDgzICovCisJMHhFOCwgMHg5NCwgMHhFRSwgMHhDNCwgMHhFRSwgMHhDNSwgMHhFRSwgMHhDNiwgLyogMHg4NC0weDg3ICovCisJMHhENSwgMHhFQiwgMHhCNiwgMHhBNCwgMHhFRSwgMHhDOCwgMHhFRSwgMHhDNywgLyogMHg4OC0weDhCICovCisJMHhFRSwgMHhDOSwgMHhFRSwgMHhDQSwgMHhDNywgMHhBNSwgMHhFRSwgMHhDQiwgLyogMHg4Qy0weDhGICovCisJMHhFRSwgMHhDQywgMHhFOCwgMHg5NSwgMHhCNywgMHhCMCwgMHhCNSwgMHhGNiwgLyogMHg5MC0weDkzICovCisJMHhFRSwgMHhDRCwgMHhFRSwgMHhDRiwgMHhFOCwgMHg5NiwgMHhFRSwgMHhDRSwgLyogMHg5NC0weDk3ICovCisJMHhFOCwgMHg5NywgMHhCOCwgMHhDNiwgMHhFRSwgMHhEMCwgMHhFRSwgMHhEMSwgLyogMHg5OC0weDlCICovCisJMHhFRSwgMHhEMiwgMHhCNiwgMHhEQiwgMHhCMywgMHhBRSwgMHhENiwgMHhEMywgLyogMHg5Qy0weDlGICovCisJMHhDNCwgMHhDNiwgMHhCMSwgMHhCNSwgMHhCOCwgMHhENiwgMHhFRSwgMHhEMywgLyogMHhBMC0weEEzICovCisJMHhFRSwgMHhENCwgMHhENCwgMHhCRiwgMHhDNywgMHhENSwgMHhCRSwgMHhGQiwgLyogMHhBNC0weEE3ICovCisJMHhDRSwgMHhEOSwgMHhCOSwgMHhCMywgMHhFRSwgMHhENiwgMHhFRSwgMHhENSwgLyogMHhBOC0weEFCICovCisJMHhFRSwgMHhEOCwgMHhFRSwgMHhENywgMHhDNSwgMHhBNSwgMHhFRSwgMHhEOSwgLyogMHhBQy0weEFGICovCisJMHhFRSwgMHhEQSwgMHhDNywgMHhBRSwgMHhFRSwgMHhEQiwgMHhDNywgMHhBRiwgLyogMHhCMC0weEIzICovCisJMHhFRSwgMHhEQywgMHhCMiwgMHhBNywgMHhFRSwgMHhERCwgMHhFRSwgMHhERSwgLyogMHhCNC0weEI3ICovCisJMHhFRSwgMHhERiwgMHhFRSwgMHhFMCwgMHhFRSwgMHhFMSwgMHhENywgMHhFQSwgLyogMHhCOC0weEJCICovCisJMHhFRSwgMHhFMiwgMHhFRSwgMHhFMywgMHhCQywgMHhEOCwgMHhFRSwgMHhFNCwgLyogMHhCQy0weEJGICovCisJMHhEMywgMHhDQiwgMHhDQywgMHhGQSwgMHhCMiwgMHhBQywgMHhDMSwgMHhFNSwgLyogMHhDMC0weEMzICovCisJMHhFRSwgMHhFNSwgMHhDNywgMHhBNiwgMHhDMywgMHhBRCwgMHhFOCwgMHg5OCwgLyogMHhDNC0weEM3ICovCisJMHhFRSwgMHhFNiwgMHhFRSwgMHhFNywgMHhFRSwgMHhFOCwgMHhFRSwgMHhFOSwgLyogMHhDOC0weENCICovCisJMHhFRSwgMHhFQSwgMHhFRSwgMHhFQiwgMHhFRSwgMHhFQywgMHhFOCwgMHg5OSwgLyogMHhDQy0weENGICovCisJMHhFRSwgMHhFRCwgMHhFRSwgMHhFRSwgMHhFRSwgMHhFRiwgMHhFOCwgMHg5QSwgLyogMHhEMC0weEQzICovCisJMHhFOCwgMHg5QiwgMHhFRSwgMHhGMCwgMHhFRSwgMHhGMSwgMHhFRSwgMHhGMiwgLyogMHhENC0weEQ3ICovCisJMHhFRSwgMHhGNCwgMHhFRSwgMHhGMywgMHhFOCwgMHg5QywgMHhFRSwgMHhGNSwgLyogMHhEOC0weERCICovCisJMHhDRCwgMHhBRCwgMHhDMiwgMHhDMSwgMHhFRSwgMHhGNiwgMHhFRSwgMHhGNywgLyogMHhEQy0weERGICovCisJMHhFRSwgMHhGOCwgMHhENSwgMHhBMSwgMHhFRSwgMHhGOSwgMHhDRiwgMHhCMywgLyogMHhFMC0weEUzICovCisJMHhFRSwgMHhGQSwgMHhFRSwgMHhGQiwgMHhFOCwgMHg5RCwgMHhFRSwgMHhGQywgLyogMHhFNC0weEU3ICovCisJMHhFRSwgMHhGRCwgMHhFRiwgMHhBMSwgMHhFRSwgMHhGRSwgMHhFRiwgMHhBMiwgLyogMHhFOC0weEVCICovCisJMHhCOCwgMHhGNSwgMHhDMywgMHhGQSwgMHhFRiwgMHhBMywgMHhFRiwgMHhBNCwgLyogMHhFQy0weEVGICovCisJMHhCRCwgMHhDMiwgMHhEMiwgMHhCRiwgMHhCMiwgMHhGOSwgMHhFRiwgMHhBNSwgLyogMHhGMC0weEYzICovCisJMHhFRiwgMHhBNiwgMHhFRiwgMHhBNywgMHhEMiwgMHhGOCwgMHhFRiwgMHhBOCwgLyogMHhGNC0weEY3ICovCisJMHhENiwgMHhGRCwgMHhFRiwgMHhBOSwgMHhDNiwgMHhDQywgMHhFOCwgMHg5RSwgLyogMHhGOC0weEZCICovCisJMHhFRiwgMHhBQSwgMHhFRiwgMHhBQiwgMHhDMSwgMHhCNCwgMHhFRiwgMHhBQywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTVbNTEyXSA9IHsKKwkweENGLCAweEZBLCAweENCLCAweEY4LCAweEVGLCAweEFFLCAweEVGLCAweEFELCAvKiAweDAwLTB4MDMgKi8KKwkweEIzLCAweEZBLCAweEI5LCAweEY4LCAweEVGLCAweEFGLCAweEVGLCAweEIwLCAvKiAweDA0LTB4MDcgKi8KKwkweEQwLCAweEUyLCAweEVGLCAweEIxLCAweEVGLCAweEIyLCAweEI3LCAweEU2LCAvKiAweDA4LTB4MEIgKi8KKwkweEQwLCAweEJGLCAweEVGLCAweEIzLCAweEVGLCAweEI0LCAweEVGLCAweEI1LCAvKiAweDBDLTB4MEYgKi8KKwkweEM4LCAweEYxLCAweENDLCAweEUwLCAweEVGLCAweEI2LCAweEVGLCAweEI3LCAvKiAweDEwLTB4MTMgKi8KKwkweEVGLCAweEI4LCAweEVGLCAweEI5LCAweEVGLCAweEJBLCAweEQ1LCAweEUwLCAvKiAweDE0LTB4MTcgKi8KKwkweEVGLCAweEJCLCAweEI0LCAweEVELCAweEMzLCAweEFBLCAweEVGLCAweEJDLCAvKiAweDE4LTB4MUIgKi8KKwkweEU4LCAweDlGLCAweEVGLCAweEJELCAweEVGLCAweEJFLCAweEVGLCAweEJGLCAvKiAweDFDLTB4MUYgKi8KKwkweEU4LCAweEEwLCAweENFLCAweEZELCAweEVGLCAweEMwLCAweEMyLCAweEUwLCAvKiAweDIwLTB4MjMgKi8KKwkweEI0LCAweEI4LCAweEQ3LCAweEI2LCAweEJELCAweEY1LCAweEU5LCAweDQwLCAvKiAweDI0LTB4MjcgKi8KKwkweENGLCAweEM3LCAweEVGLCAweEMzLCAweEVGLCAweEMxLCAweEVGLCAweEMyLCAvKiAweDI4LTB4MkIgKi8KKwkweEVGLCAweEM0LCAweEI2LCAweEE3LCAweEJDLCAweEZDLCAweEJFLCAweEUyLCAvKiAweDJDLTB4MkYgKi8KKwkweEMzLCAweENDLCAweEVGLCAweEM1LCAweEVGLCAweEM2LCAweEU5LCAweDQxLCAvKiAweDMwLTB4MzMgKi8KKwkweEVGLCAweEM3LCAweEVGLCAweENGLCAweEVGLCAweEM4LCAweEVGLCAweEM5LCAvKiAweDM0LTB4MzcgKi8KKwkweEVGLCAweENBLCAweEM3LCAweEMyLCAweEVGLCAweEYxLCAweEI2LCAweENELCAvKiAweDM4LTB4M0IgKi8KKwkweEVGLCAweENCLCAweEU5LCAweDQyLCAweEVGLCAweENDLCAweEVGLCAweENELCAvKiAweDNDLTB4M0YgKi8KKwkweEI2LCAweEM2LCAweEMzLCAweEJFLCAweEVGLCAweENFLCAweEU5LCAweDQzLCAvKiAweDQwLTB4NDMgKi8KKwkweEVGLCAweEQwLCAweEVGLCAweEQxLCAweEVGLCAweEQyLCAweEQ1LCAweEYyLCAvKiAweDQ0LTB4NDcgKi8KKwkweEU5LCAweDQ0LCAweEVGLCAweEQzLCAweEM0LCAweEY3LCAweEU5LCAweDQ1LCAvKiAweDQ4LTB4NEIgKi8KKwkweEVGLCAweEQ0LCAweEM0LCAweEY4LCAweEVGLCAweEQ1LCAweEVGLCAweEQ2LCAvKiAweDRDLTB4NEYgKi8KKwkweEI4LCAweEU0LCAweEIwLCAweEY3LCAweEVGLCAweEQ3LCAweEVGLCAweEQ4LCAvKiAweDUwLTB4NTMgKi8KKwkweEVGLCAweEQ5LCAweEU5LCAweDQ2LCAweEVGLCAweERBLCAweEVGLCAweERCLCAvKiAweDU0LTB4NTcgKi8KKwkweEVGLCAweERDLCAweEVGLCAweERELCAweEU5LCAweDQ3LCAweEVGLCAweERFLCAvKiAweDU4LTB4NUIgKi8KKwkweEJFLCAweEI1LCAweEVGLCAweEUxLCAweEVGLCAweERGLCAweEVGLCAweEUwLCAvKiAweDVDLTB4NUYgKi8KKwkweEU5LCAweDQ4LCAweEVGLCAweEUyLCAweEVGLCAweEUzLCAweEMxLCAweENELCAvKiAweDYwLTB4NjMgKi8KKwkweEVGLCAweEU0LCAweEVGLCAweEU1LCAweEVGLCAweEU2LCAweEVGLCAweEU3LCAvKiAweDY0LTB4NjcgKi8KKwkweEVGLCAweEU4LCAweEVGLCAweEU5LCAweEVGLCAweEVBLCAweEVGLCAweEVCLCAvKiAweDY4LTB4NkIgKi8KKwkweEVGLCAweEVDLCAweEMwLCAweEQ4LCAweEU5LCAweDQ5LCAweEVGLCAweEVELCAvKiAweDZDLTB4NkYgKi8KKwkweEMxLCAweEFELCAweEVGLCAweEVFLCAweEVGLCAweEVGLCAweEVGLCAweEYwLCAvKiAweDcwLTB4NzMgKi8KKwkweEU5LCAweDRBLCAweEU5LCAweDRCLCAweENGLCAweEUyLCAweEU5LCAweDRDLCAvKiAweDc0LTB4NzcgKi8KKwkweEU5LCAweDRELCAweEU5LCAweDRFLCAweEU5LCAweDRGLCAweEU5LCAweDUwLCAvKiAweDc4LTB4N0IgKi8KKwkweEU5LCAweDUxLCAweEU5LCAweDUyLCAweEU5LCAweDUzLCAweEIzLCAweEE0LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEU5LCAweDU0LCAweEU5LCAweDU1LCAweEU5LCAweDU2LCAweEU5LCAweDU3LCAvKiAweDgwLTB4ODMgKi8KKwkweEU5LCAweDU4LCAweEU5LCAweDU5LCAweEU5LCAweDVBLCAweEU5LCAweDVCLCAvKiAweDg0LTB4ODcgKi8KKwkweEU5LCAweDVDLCAweEU5LCAweDVELCAweEU5LCAweDVFLCAweEU5LCAweDVGLCAvKiAweDg4LTB4OEIgKi8KKwkweEU5LCAweDYwLCAweEU5LCAweDYxLCAweEU5LCAweDYyLCAweEU5LCAweDYzLCAvKiAweDhDLTB4OEYgKi8KKwkweEU5LCAweDY0LCAweEU5LCAweDY1LCAweEU5LCAweDY2LCAweEU5LCAweDY3LCAvKiAweDkwLTB4OTMgKi8KKwkweEU5LCAweDY4LCAweEU5LCAweDY5LCAweEU5LCAweDZBLCAweEU5LCAweDZCLCAvKiAweDk0LTB4OTcgKi8KKwkweEU5LCAweDZDLCAweEU5LCAweDZELCAweEU5LCAweDZFLCAweEU5LCAweDZGLCAvKiAweDk4LTB4OUIgKi8KKwkweEU5LCAweDcwLCAweEU5LCAweDcxLCAweEU5LCAweDcyLCAweEU5LCAweDczLCAvKiAweDlDLTB4OUYgKi8KKwkweEU5LCAweDc0LCAweEU5LCAweDc1LCAweEU5LCAweDc2LCAweEU5LCAweDc3LCAvKiAweEEwLTB4QTMgKi8KKwkweEU5LCAweDc4LCAweEU5LCAweDc5LCAweEU5LCAweDdBLCAweEU5LCAweDdCLCAvKiAweEE0LTB4QTcgKi8KKwkweEU5LCAweDdDLCAweEU5LCAweDdELCAweEU5LCAweDdFLCAweEU5LCAweDgwLCAvKiAweEE4LTB4QUIgKi8KKwkweEU5LCAweDgxLCAweEU5LCAweDgyLCAweEU5LCAweDgzLCAweEU5LCAweDg0LCAvKiAweEFDLTB4QUYgKi8KKwkweEU5LCAweDg1LCAweEU5LCAweDg2LCAweEU5LCAweDg3LCAweEU5LCAweDg4LCAvKiAweEIwLTB4QjMgKi8KKwkweEU5LCAweDg5LCAweEU5LCAweDhBLCAweEU5LCAweDhCLCAweEU5LCAweDhDLCAvKiAweEI0LTB4QjcgKi8KKwkweEU5LCAweDhELCAweEU5LCAweDhFLCAweEU5LCAweDhGLCAweEU5LCAweDkwLCAvKiAweEI4LTB4QkIgKi8KKwkweEU5LCAweDkxLCAweEU5LCAweDkyLCAweEU5LCAweDkzLCAweEU5LCAweDk0LCAvKiAweEJDLTB4QkYgKi8KKwkweEU5LCAweDk1LCAweEU5LCAweDk2LCAweEU5LCAweDk3LCAweEU5LCAweDk4LCAvKiAweEMwLTB4QzMgKi8KKwkweEU5LCAweDk5LCAweEU5LCAweDlBLCAweEU5LCAweDlCLCAweEU5LCAweDlDLCAvKiAweEM0LTB4QzcgKi8KKwkweEU5LCAweDlELCAweEU5LCAweDlFLCAweEU5LCAweDlGLCAweEU5LCAweEEwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEVBLCAweDQwLCAweEVBLCAweDQxLCAweEVBLCAweDQyLCAweEVBLCAweDQzLCAvKiAweENDLTB4Q0YgKi8KKwkweEVBLCAweDQ0LCAweEVBLCAweDQ1LCAweEVBLCAweDQ2LCAweEVBLCAweDQ3LCAvKiAweEQwLTB4RDMgKi8KKwkweEVBLCAweDQ4LCAweEVBLCAweDQ5LCAweEVBLCAweDRBLCAweEVBLCAweDRCLCAvKiAweEQ0LTB4RDcgKi8KKwkweEVBLCAweDRDLCAweEVBLCAweDRELCAweEVBLCAweDRFLCAweEVBLCAweDRGLCAvKiAweEQ4LTB4REIgKi8KKwkweEVBLCAweDUwLCAweEVBLCAweDUxLCAweEVBLCAweDUyLCAweEVBLCAweDUzLCAvKiAweERDLTB4REYgKi8KKwkweEVBLCAweDU0LCAweEVBLCAweDU1LCAweEVBLCAweDU2LCAweEVBLCAweDU3LCAvKiAweEUwLTB4RTMgKi8KKwkweEVBLCAweDU4LCAweEVBLCAweDU5LCAweEVBLCAweDVBLCAweEVBLCAweDVCLCAvKiAweEU0LTB4RTcgKi8KKwkweEMzLCAweEM1LCAweEUzLCAweEM1LCAweEM5LCAweEMxLCAweEUzLCAweEM2LCAvKiAweEU4LTB4RUIgKi8KKwkweEVBLCAweDVDLCAweEIxLCAweEQ1LCAweENFLCAweENBLCAweEI0LCAweEIzLCAvKiAweEVDLTB4RUYgKi8KKwkweEM4LCAweEYyLCAweEUzLCAweEM3LCAweENGLCAweEQwLCAweEUzLCAweEM4LCAvKiAweEYwLTB4RjMgKi8KKwkweEJDLCAweEU0LCAweEUzLCAweEM5LCAweEUzLCAweENBLCAweEMzLCAweEM2LCAvKiAweEY0LTB4RjcgKi8KKwkweEQ1LCAweEEyLCAweEM0LCAweEQ2LCAweEI5LCAweEVCLCAweENFLCAweEM1LCAvKiAweEY4LTB4RkIgKi8KKwkweEUzLCAweENCLCAweEMzLCAweEY2LCAweEUzLCAweENDLCAweEVBLCAweDVELCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185Nls1MTJdID0geworCTB4QjcsIDB4QTcsIDB4QjgsIDB4RjMsIDB4QkEsIDB4RDIsIDB4RTMsIDB4Q0QsIC8qIDB4MDAtMHgwMyAqLworCTB4RTMsIDB4Q0UsIDB4RDQsIDB4QzQsIDB4RTMsIDB4Q0YsIDB4RUEsIDB4NUUsIC8qIDB4MDQtMHgwNyAqLworCTB4RTMsIDB4RDAsIDB4RDEsIDB4Q0IsIDB4RTMsIDB4RDEsIDB4RTMsIDB4RDIsIC8qIDB4MDgtMHgwQiAqLworCTB4RTMsIDB4RDMsIDB4RTMsIDB4RDQsIDB4RDEsIDB4RDYsIDB4RTMsIDB4RDUsIC8qIDB4MEMtMHgwRiAqLworCTB4QjIsIDB4RkIsIDB4QzAsIDB4QkIsIDB4RTMsIDB4RDYsIDB4RUEsIDB4NUYsIC8qIDB4MTAtMHgxMyAqLworCTB4QzAsIDB4QUIsIDB4RTMsIDB4RDcsIDB4RTMsIDB4RDgsIDB4RTMsIDB4RDksIC8qIDB4MTQtMHgxNyAqLworCTB4RUEsIDB4NjAsIDB4RTMsIDB4REEsIDB4RTMsIDB4REIsIDB4RUEsIDB4NjEsIC8qIDB4MTgtMHgxQiAqLworCTB4QjgsIDB4QjcsIDB4REEsIDB4RTIsIDB4RUEsIDB4NjIsIDB4QjYsIDB4RDMsIC8qIDB4MUMtMHgxRiAqLworCTB4RUEsIDB4NjMsIDB4REEsIDB4RTQsIDB4REEsIDB4RTMsIDB4RUEsIDB4NjQsIC8qIDB4MjAtMHgyMyAqLworCTB4RUEsIDB4NjUsIDB4RUEsIDB4NjYsIDB4RUEsIDB4NjcsIDB4RUEsIDB4NjgsIC8qIDB4MjQtMHgyNyAqLworCTB4RUEsIDB4NjksIDB4RUEsIDB4NkEsIDB4REEsIDB4RTYsIDB4RUEsIDB4NkIsIC8qIDB4MjgtMHgyQiAqLworCTB4RUEsIDB4NkMsIDB4RUEsIDB4NkQsIDB4QzgsIDB4RUUsIDB4RUEsIDB4NkUsIC8qIDB4MkMtMHgyRiAqLworCTB4RUEsIDB4NkYsIDB4REEsIDB4RTUsIDB4QjcsIDB4QzAsIDB4RDEsIDB4RjQsIC8qIDB4MzAtMHgzMyAqLworCTB4RDIsIDB4RjUsIDB4RDUsIDB4RjMsIDB4QkQsIDB4RDcsIDB4RUEsIDB4NzAsIC8qIDB4MzQtMHgzNyAqLworCTB4RUEsIDB4NzEsIDB4RUEsIDB4NzIsIDB4RUEsIDB4NzMsIDB4RDcsIDB4RTgsIC8qIDB4MzgtMHgzQiAqLworCTB4REEsIDB4RTgsIDB4REEsIDB4RTcsIDB4RUEsIDB4NzQsIDB4QjAsIDB4QTIsIC8qIDB4M0MtMHgzRiAqLworCTB4Q0QsIDB4RDMsIDB4RUEsIDB4NzUsIDB4REEsIDB4RTksIDB4RUEsIDB4NzYsIC8qIDB4NDAtMHg0MyAqLworCTB4QjgsIDB4QkQsIDB4QkMsIDB4Q0EsIDB4QzIsIDB4QkQsIDB4QzIsIDB4QTQsIC8qIDB4NDQtMHg0NyAqLworCTB4QjMsIDB4QzIsIDB4REEsIDB4RUEsIDB4RUEsIDB4NzcsIDB4QzIsIDB4QUEsIC8qIDB4NDgtMHg0QiAqLworCTB4QzQsIDB4QjAsIDB4QkQsIDB4QjUsIDB4RUEsIDB4NzgsIDB4RUEsIDB4NzksIC8qIDB4NEMtMHg0RiAqLworCTB4Q0YsIDB4REUsIDB4RUEsIDB4N0EsIDB4RUEsIDB4N0IsIDB4RUEsIDB4N0MsIC8qIDB4NTAtMHg1MyAqLworCTB4REEsIDB4RUIsIDB4QzksIDB4QzIsIDB4RUEsIDB4N0QsIDB4RUEsIDB4N0UsIC8qIDB4NTQtMHg1NyAqLworCTB4RUEsIDB4ODAsIDB4RUEsIDB4ODEsIDB4RUEsIDB4ODIsIDB4QjEsIDB4REQsIC8qIDB4NTgtMHg1QiAqLworCTB4RUEsIDB4ODMsIDB4RUEsIDB4ODQsIDB4RUEsIDB4ODUsIDB4REEsIDB4RUMsIC8qIDB4NUMtMHg1RiAqLworCTB4RUEsIDB4ODYsIDB4QjYsIDB4QjgsIDB4RDQsIDB4QkEsIDB4RUEsIDB4ODcsIC8qIDB4NjAtMHg2MyAqLworCTB4QjMsIDB4RkQsIDB4RUEsIDB4ODgsIDB4RUEsIDB4ODksIDB4REEsIDB4RUQsIC8qIDB4NjQtMHg2NyAqLworCTB4RDQsIDB4QzksIDB4Q0YsIDB4RDUsIDB4QzUsIDB4RTMsIDB4RUEsIDB4OEEsIC8qIDB4NjgtMHg2QiAqLworCTB4REEsIDB4RUUsIDB4RUEsIDB4OEIsIDB4RUEsIDB4OEMsIDB4RUEsIDB4OEQsIC8qIDB4NkMtMHg2RiAqLworCTB4RUEsIDB4OEUsIDB4RUEsIDB4OEYsIDB4REEsIDB4RUYsIDB4RUEsIDB4OTAsIC8qIDB4NzAtMHg3MyAqLworCTB4REEsIDB4RjAsIDB4QzEsIDB4RUEsIDB4Q0MsIDB4RDUsIDB4Q0YsIDB4REQsIC8qIDB4NzQtMHg3NyAqLworCTB4RUEsIDB4OTEsIDB4RUEsIDB4OTIsIDB4RUEsIDB4OTMsIDB4RUEsIDB4OTQsIC8qIDB4NzgtMHg3QiAqLworCTB4RUEsIDB4OTUsIDB4RUEsIDB4OTYsIDB4RUEsIDB4OTcsIDB4RUEsIDB4OTgsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RUEsIDB4OTksIDB4RUEsIDB4OUEsIDB4RUEsIDB4OUIsIDB4RUEsIDB4OUMsIC8qIDB4ODAtMHg4MyAqLworCTB4RUEsIDB4OUQsIDB4RDMsIDB4RTcsIDB4QzIsIDB4QTEsIDB4RUEsIDB4OUUsIC8qIDB4ODQtMHg4NyAqLworCTB4REEsIDB4RjEsIDB4RUEsIDB4OUYsIDB4RUEsIDB4QTAsIDB4Q0IsIDB4RTUsIC8qIDB4ODgtMHg4QiAqLworCTB4RUIsIDB4NDAsIDB4REEsIDB4RjIsIDB4RUIsIDB4NDEsIDB4Q0IsIDB4RTYsIC8qIDB4OEMtMHg4RiAqLworCTB4RDIsIDB4RkUsIDB4RUIsIDB4NDIsIDB4RUIsIDB4NDMsIDB4RUIsIDB4NDQsIC8qIDB4OTAtMHg5MyAqLworCTB4QjgsIDB4RjQsIDB4RUIsIDB4NDUsIDB4RUIsIDB4NDYsIDB4REEsIDB4RjMsIC8qIDB4OTQtMHg5NyAqLworCTB4QjAsIDB4QUYsIDB4Q0YsIDB4QjYsIDB4RUIsIDB4NDcsIDB4RUIsIDB4NDgsIC8qIDB4OTgtMHg5QiAqLworCTB4RDUsIDB4Q0YsIDB4RUIsIDB4NDksIDB4RUIsIDB4NEEsIDB4RUIsIDB4NEIsIC8qIDB4OUMtMHg5RiAqLworCTB4RUIsIDB4NEMsIDB4RUIsIDB4NEQsIDB4RUIsIDB4NEUsIDB4RUIsIDB4NEYsIC8qIDB4QTAtMHhBMyAqLworCTB4RUIsIDB4NTAsIDB4RUIsIDB4NTEsIDB4RUIsIDB4NTIsIDB4Q0IsIDB4RUQsIC8qIDB4QTQtMHhBNyAqLworCTB4RUIsIDB4NTMsIDB4RUIsIDB4NTQsIDB4RUIsIDB4NTUsIDB4RUIsIDB4NTYsIC8qIDB4QTgtMHhBQiAqLworCTB4RUIsIDB4NTcsIDB4RUIsIDB4NTgsIDB4RUIsIDB4NTksIDB4RUIsIDB4NUEsIC8qIDB4QUMtMHhBRiAqLworCTB4REEsIDB4RjQsIDB4RUIsIDB4NUIsIDB4RUIsIDB4NUMsIDB4RTMsIDB4QzQsIC8qIDB4QjAtMHhCMyAqLworCTB4RUIsIDB4NUQsIDB4RUIsIDB4NUUsIDB4QzEsIDB4QTUsIDB4RUIsIDB4NUYsIC8qIDB4QjQtMHhCNyAqLworCTB4RUIsIDB4NjAsIDB4RjYsIDB4QkYsIDB4RUIsIDB4NjEsIDB4RUIsIDB4NjIsIC8qIDB4QjgtMHhCQiAqLworCTB4RjYsIDB4QzAsIDB4RjYsIDB4QzEsIDB4QzQsIDB4RDEsIDB4RUIsIDB4NjMsIC8qIDB4QkMtMHhCRiAqLworCTB4QzgsIDB4QjgsIDB4RDEsIDB4RTMsIDB4RUIsIDB4NjQsIDB4RUIsIDB4NjUsIC8qIDB4QzAtMHhDMyAqLworCTB4RDAsIDB4REIsIDB4RDEsIDB4QzUsIDB4QkMsIDB4QUYsIDB4QjksIDB4Q0QsIC8qIDB4QzQtMHhDNyAqLworCTB4RUIsIDB4NjYsIDB4RUYsIDB4RjQsIDB4RUIsIDB4NjcsIDB4RUIsIDB4NjgsIC8qIDB4QzgtMHhDQiAqLworCTB4QjQsIDB4QzYsIDB4RDMsIDB4QkEsIDB4RjYsIDB4QzIsIDB4QjMsIDB4RkIsIC8qIDB4Q0MtMHhDRiAqLworCTB4RUIsIDB4NjksIDB4RUIsIDB4NkEsIDB4RjYsIDB4QzMsIDB4RUIsIDB4NkIsIC8qIDB4RDAtMHhEMyAqLworCTB4RUIsIDB4NkMsIDB4QjUsIDB4RjEsIDB4RUIsIDB4NkQsIDB4RUIsIDB4NkUsIC8qIDB4RDQtMHhENyAqLworCTB4RUIsIDB4NkYsIDB4RUIsIDB4NzAsIDB4RUIsIDB4NzEsIDB4RUIsIDB4NzIsIC8qIDB4RDgtMHhEQiAqLworCTB4RUIsIDB4NzMsIDB4RUIsIDB4NzQsIDB4RUIsIDB4NzUsIDB4RUIsIDB4NzYsIC8qIDB4REMtMHhERiAqLworCTB4RjYsIDB4QzUsIDB4RUIsIDB4NzcsIDB4RUIsIDB4NzgsIDB4RUIsIDB4NzksIC8qIDB4RTAtMHhFMyAqLworCTB4RUIsIDB4N0EsIDB4RUIsIDB4N0IsIDB4RUIsIDB4N0MsIDB4RUIsIDB4N0QsIC8qIDB4RTQtMHhFNyAqLworCTB4RDMsIDB4RUEsIDB4RjYsIDB4QTcsIDB4RDEsIDB4QTksIDB4RUIsIDB4N0UsIC8qIDB4RTgtMHhFQiAqLworCTB4RUIsIDB4ODAsIDB4RUIsIDB4ODEsIDB4RUIsIDB4ODIsIDB4RjYsIDB4QTksIC8qIDB4RUMtMHhFRiAqLworCTB4RUIsIDB4ODMsIDB4RUIsIDB4ODQsIDB4RUIsIDB4ODUsIDB4RjYsIDB4QTgsIC8qIDB4RjAtMHhGMyAqLworCTB4RUIsIDB4ODYsIDB4RUIsIDB4ODcsIDB4QzEsIDB4RTMsIDB4QzAsIDB4RDcsIC8qIDB4RjQtMHhGNyAqLworCTB4RUIsIDB4ODgsIDB4QjEsIDB4QTIsIDB4RUIsIDB4ODksIDB4RUIsIDB4OEEsIC8qIDB4RjgtMHhGQiAqLworCTB4RUIsIDB4OEIsIDB4RUIsIDB4OEMsIDB4Q0UsIDB4RUQsIDB4RUIsIDB4OEQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzk3WzUxMl0gPSB7CisJMHhEMCwgMHhFOCwgMHhGNiwgMHhBQiwgMHhFQiwgMHg4RSwgMHhFQiwgMHg4RiwgLyogMHgwMC0weDAzICovCisJMHhDRiwgMHhGNiwgMHhFQiwgMHg5MCwgMHhGNiwgMHhBQSwgMHhENSwgMHhGMCwgLyogMHgwNC0weDA3ICovCisJMHhGNiwgMHhBQywgMHhDMywgMHhCOSwgMHhFQiwgMHg5MSwgMHhFQiwgMHg5MiwgLyogMHgwOC0weDBCICovCisJMHhFQiwgMHg5MywgMHhCQiwgMHhGNCwgMHhGNiwgMHhBRSwgMHhGNiwgMHhBRCwgLyogMHgwQy0weDBGICovCisJMHhFQiwgMHg5NCwgMHhFQiwgMHg5NSwgMHhFQiwgMHg5NiwgMHhDNCwgMHhERSwgLyogMHgxMC0weDEzICovCisJMHhFQiwgMHg5NywgMHhFQiwgMHg5OCwgMHhDMSwgMHhEOCwgMHhFQiwgMHg5OSwgLyogMHgxNC0weDE3ICovCisJMHhFQiwgMHg5QSwgMHhFQiwgMHg5QiwgMHhFQiwgMHg5QywgMHhFQiwgMHg5RCwgLyogMHgxOC0weDFCICovCisJMHhDQiwgMHhBQSwgMHhFQiwgMHg5RSwgMHhDRiwgMHhCQywgMHhFQiwgMHg5RiwgLyogMHgxQy0weDFGICovCisJMHhFQiwgMHhBMCwgMHhFQywgMHg0MCwgMHhFQywgMHg0MSwgMHhFQywgMHg0MiwgLyogMHgyMC0weDIzICovCisJMHhFQywgMHg0MywgMHhFQywgMHg0NCwgMHhFQywgMHg0NSwgMHhFQywgMHg0NiwgLyogMHgyNC0weDI3ICovCisJMHhFQywgMHg0NywgMHhFQywgMHg0OCwgMHhGNiwgMHhBRiwgMHhFQywgMHg0OSwgLyogMHgyOC0weDJCICovCisJMHhFQywgMHg0QSwgMHhGNiwgMHhCMCwgMHhFQywgMHg0QiwgMHhFQywgMHg0QywgLyogMHgyQy0weDJGICovCisJMHhGNiwgMHhCMSwgMHhFQywgMHg0RCwgMHhDMiwgMHhCNiwgMHhFQywgMHg0RSwgLyogMHgzMC0weDMzICovCisJMHhFQywgMHg0RiwgMHhFQywgMHg1MCwgMHhFQywgMHg1MSwgMHhFQywgMHg1MiwgLyogMHgzNC0weDM3ICovCisJMHhCMCwgMHhENCwgMHhDNSwgMHhGOSwgMHhFQywgMHg1MywgMHhFQywgMHg1NCwgLyogMHgzOC0weDNCICovCisJMHhFQywgMHg1NSwgMHhFQywgMHg1NiwgMHhGNiwgMHhCMiwgMHhFQywgMHg1NywgLyogMHgzQy0weDNGICovCisJMHhFQywgMHg1OCwgMHhFQywgMHg1OSwgMHhFQywgMHg1QSwgMHhFQywgMHg1QiwgLyogMHg0MC0weDQzICovCisJMHhFQywgMHg1QywgMHhFQywgMHg1RCwgMHhFQywgMHg1RSwgMHhFQywgMHg1RiwgLyogMHg0NC0weDQ3ICovCisJMHhFQywgMHg2MCwgMHhFQywgMHg2MSwgMHhFQywgMHg2MiwgMHhFQywgMHg2MywgLyogMHg0OC0weDRCICovCisJMHhFQywgMHg2NCwgMHhFQywgMHg2NSwgMHhFQywgMHg2NiwgMHhFQywgMHg2NywgLyogMHg0Qy0weDRGICovCisJMHhFQywgMHg2OCwgMHhFQywgMHg2OSwgMHhDNywgMHhFMCwgMHhGNiwgMHhBNiwgLyogMHg1MC0weDUzICovCisJMHhFQywgMHg2QSwgMHhFQywgMHg2QiwgMHhCRSwgMHhCOCwgMHhFQywgMHg2QywgLyogMHg1NC0weDU3ICovCisJMHhFQywgMHg2RCwgMHhCRSwgMHhCMiwgMHhFQywgMHg2RSwgMHhCNSwgMHhFNSwgLyogMHg1OC0weDVCICovCisJMHhFQywgMHg2RiwgMHhFQywgMHg3MCwgMHhCNywgMHhDNywgMHhFQywgMHg3MSwgLyogMHg1Qy0weDVGICovCisJMHhCRiwgMHhCRiwgMHhDMywgMHhEMiwgMHhDMywgMHhFNiwgMHhFQywgMHg3MiwgLyogMHg2MC0weDYzICovCisJMHhFQywgMHg3MywgMHhEOCwgMHhDQywgMHhFQywgMHg3NCwgMHhFQywgMHg3NSwgLyogMHg2NC0weDY3ICovCisJMHhFQywgMHg3NiwgMHhCOCwgMHhFRiwgMHhFQywgMHg3NywgMHhFQywgMHg3OCwgLyogMHg2OC0weDZCICovCisJMHhFQywgMHg3OSwgMHhFQywgMHg3QSwgMHhFQywgMHg3QiwgMHhFQywgMHg3QywgLyogMHg2Qy0weDZGICovCisJMHhFQywgMHg3RCwgMHhFQywgMHg3RSwgMHhFQywgMHg4MCwgMHhCRCwgMHhGOSwgLyogMHg3MC0weDczICovCisJMHhEMSwgMHhBNSwgMHhFQywgMHg4MSwgMHhCMCwgMHhEMCwgMHhFQywgMHg4MiwgLyogMHg3NC0weDc3ICovCisJMHhFQywgMHg4MywgMHhFQywgMHg4NCwgMHhFQywgMHg4NSwgMHhFQywgMHg4NiwgLyogMHg3OC0weDdCICovCisJMHhGNywgMHhCMCwgMHhFQywgMHg4NywgMHhFQywgMHg4OCwgMHhFQywgMHg4OSwgLyogMHg3Qy0weDdGICovCisJCisJMHhFQywgMHg4QSwgMHhFQywgMHg4QiwgMHhFQywgMHg4QywgMHhFQywgMHg4RCwgLyogMHg4MC0weDgzICovCisJMHhFQywgMHg4RSwgMHhGNywgMHhCMSwgMHhFQywgMHg4RiwgMHhFQywgMHg5MCwgLyogMHg4NC0weDg3ICovCisJMHhFQywgMHg5MSwgMHhFQywgMHg5MiwgMHhFQywgMHg5MywgMHhEMCwgMHhBQywgLyogMHg4OC0weDhCICovCisJMHhFQywgMHg5NCwgMHhCMCwgMHhCMCwgMHhFQywgMHg5NSwgMHhFQywgMHg5NiwgLyogMHg4Qy0weDhGICovCisJMHhFQywgMHg5NywgMHhGNywgMHhCMiwgMHhGNywgMHhCMywgMHhFQywgMHg5OCwgLyogMHg5MC0weDkzICovCisJMHhGNywgMHhCNCwgMHhFQywgMHg5OSwgMHhFQywgMHg5QSwgMHhFQywgMHg5QiwgLyogMHg5NC0weDk3ICovCisJMHhDNywgMHhDQSwgMHhFQywgMHg5QywgMHhFQywgMHg5RCwgMHhFQywgMHg5RSwgLyogMHg5OC0weDlCICovCisJMHhFQywgMHg5RiwgMHhFQywgMHhBMCwgMHhFRCwgMHg0MCwgMHhFRCwgMHg0MSwgLyogMHg5Qy0weDlGICovCisJMHhCRSwgMHhDRiwgMHhFRCwgMHg0MiwgMHhFRCwgMHg0MywgMHhGNywgMHhCNywgLyogMHhBMC0weEEzICovCisJMHhFRCwgMHg0NCwgMHhFRCwgMHg0NSwgMHhFRCwgMHg0NiwgMHhFRCwgMHg0NywgLyogMHhBNC0weEE3ICovCisJMHhFRCwgMHg0OCwgMHhFRCwgMHg0OSwgMHhFRCwgMHg0QSwgMHhGNywgMHhCNiwgLyogMHhBOC0weEFCICovCisJMHhFRCwgMHg0QiwgMHhCMSwgMHhERSwgMHhFRCwgMHg0QywgMHhGNywgMHhCNSwgLyogMHhBQy0weEFGICovCisJMHhFRCwgMHg0RCwgMHhFRCwgMHg0RSwgMHhGNywgMHhCOCwgMHhFRCwgMHg0RiwgLyogMHhCMC0weEIzICovCisJMHhGNywgMHhCOSwgMHhFRCwgMHg1MCwgMHhFRCwgMHg1MSwgMHhFRCwgMHg1MiwgLyogMHhCNC0weEI3ICovCisJMHhFRCwgMHg1MywgMHhFRCwgMHg1NCwgMHhFRCwgMHg1NSwgMHhFRCwgMHg1NiwgLyogMHhCOC0weEJCICovCisJMHhFRCwgMHg1NywgMHhFRCwgMHg1OCwgMHhFRCwgMHg1OSwgMHhFRCwgMHg1QSwgLyogMHhCQy0weEJGICovCisJMHhFRCwgMHg1QiwgMHhFRCwgMHg1QywgMHhFRCwgMHg1RCwgMHhFRCwgMHg1RSwgLyogMHhDMC0weEMzICovCisJMHhFRCwgMHg1RiwgMHhFRCwgMHg2MCwgMHhFRCwgMHg2MSwgMHhFRCwgMHg2MiwgLyogMHhDNC0weEM3ICovCisJMHhFRCwgMHg2MywgMHhFRCwgMHg2NCwgMHhFRCwgMHg2NSwgMHhFRCwgMHg2NiwgLyogMHhDOC0weENCICovCisJMHhFRCwgMHg2NywgMHhFRCwgMHg2OCwgMHhFRCwgMHg2OSwgMHhFRCwgMHg2QSwgLyogMHhDQy0weENGICovCisJMHhFRCwgMHg2QiwgMHhFRCwgMHg2QywgMHhFRCwgMHg2RCwgMHhFRCwgMHg2RSwgLyogMHhEMC0weEQzICovCisJMHhFRCwgMHg2RiwgMHhFRCwgMHg3MCwgMHhFRCwgMHg3MSwgMHhFRCwgMHg3MiwgLyogMHhENC0weEQ3ICovCisJMHhFRCwgMHg3MywgMHhFRCwgMHg3NCwgMHhFRCwgMHg3NSwgMHhFRCwgMHg3NiwgLyogMHhEOC0weERCICovCisJMHhFRCwgMHg3NywgMHhFRCwgMHg3OCwgMHhFRCwgMHg3OSwgMHhFRCwgMHg3QSwgLyogMHhEQy0weERGICovCisJMHhFRCwgMHg3QiwgMHhFRCwgMHg3QywgMHhFRCwgMHg3RCwgMHhFRCwgMHg3RSwgLyogMHhFMC0weEUzICovCisJMHhFRCwgMHg4MCwgMHhFRCwgMHg4MSwgMHhDRSwgMHhBNCwgMHhDOCwgMHhDRCwgLyogMHhFNC0weEU3ICovCisJMHhFRCwgMHg4MiwgMHhCQSwgMHhBQiwgMHhFOCwgMHhCOCwgMHhFOCwgMHhCOSwgLyogMHhFOC0weEVCICovCisJMHhFOCwgMHhCQSwgMHhCRSwgMHhDMiwgMHhFRCwgMHg4MywgMHhFRCwgMHg4NCwgLyogMHhFQy0weEVGICovCisJMHhFRCwgMHg4NSwgMHhFRCwgMHg4NiwgMHhFRCwgMHg4NywgMHhEMiwgMHhGNCwgLyogMHhGMC0weEYzICovCisJMHhFRCwgMHg4OCwgMHhENCwgMHhDRiwgMHhDOSwgMHhEOCwgMHhFRCwgMHg4OSwgLyogMHhGNC0weEY3ICovCisJMHhFRCwgMHg4QSwgMHhFRCwgMHg4QiwgMHhFRCwgMHg4QywgMHhFRCwgMHg4RCwgLyogMHhGOC0weEZCICovCisJMHhFRCwgMHg4RSwgMHhFRCwgMHg4RiwgMHhFRCwgMHg5MCwgMHhFRCwgMHg5MSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOThbNTEyXSA9IHsKKwkweEVELCAweDkyLCAweEVELCAweDkzLCAweEVELCAweDk0LCAweEVELCAweDk1LCAvKiAweDAwLTB4MDMgKi8KKwkweEVELCAweDk2LCAweEVELCAweDk3LCAweEVELCAweDk4LCAweEVELCAweDk5LCAvKiAweDA0LTB4MDcgKi8KKwkweEVELCAweDlBLCAweEVELCAweDlCLCAweEVELCAweDlDLCAweEVELCAweDlELCAvKiAweDA4LTB4MEIgKi8KKwkweEVELCAweDlFLCAweEVELCAweDlGLCAweEVELCAweEEwLCAweEVFLCAweDQwLCAvKiAweDBDLTB4MEYgKi8KKwkweEVFLCAweDQxLCAweEVFLCAweDQyLCAweEVFLCAweDQzLCAweEVFLCAweDQ0LCAvKiAweDEwLTB4MTMgKi8KKwkweEVFLCAweDQ1LCAweEVFLCAweDQ2LCAweEVFLCAweDQ3LCAweEVFLCAweDQ4LCAvKiAweDE0LTB4MTcgKi8KKwkweEVFLCAweDQ5LCAweEVFLCAweDRBLCAweEVFLCAweDRCLCAweEVFLCAweDRDLCAvKiAweDE4LTB4MUIgKi8KKwkweEVFLCAweDRELCAweEVFLCAweDRFLCAweEVFLCAweDRGLCAweEVFLCAweDUwLCAvKiAweDFDLTB4MUYgKi8KKwkweEVFLCAweDUxLCAweEVFLCAweDUyLCAweEVFLCAweDUzLCAweEVFLCAweDU0LCAvKiAweDIwLTB4MjMgKi8KKwkweEVFLCAweDU1LCAweEVFLCAweDU2LCAweEVFLCAweDU3LCAweEVFLCAweDU4LCAvKiAweDI0LTB4MjcgKi8KKwkweEVFLCAweDU5LCAweEVFLCAweDVBLCAweEVFLCAweDVCLCAweEVFLCAweDVDLCAvKiAweDI4LTB4MkIgKi8KKwkweEVFLCAweDVELCAweEVFLCAweDVFLCAweEVFLCAweDVGLCAweEVFLCAweDYwLCAvKiAweDJDLTB4MkYgKi8KKwkweEVFLCAweDYxLCAweEVFLCAweDYyLCAweEVFLCAweDYzLCAweEVFLCAweDY0LCAvKiAweDMwLTB4MzMgKi8KKwkweEVFLCAweDY1LCAweEVFLCAweDY2LCAweEVFLCAweDY3LCAweEVFLCAweDY4LCAvKiAweDM0LTB4MzcgKi8KKwkweEVFLCAweDY5LCAweEVFLCAweDZBLCAweEVFLCAweDZCLCAweEVFLCAweDZDLCAvKiAweDM4LTB4M0IgKi8KKwkweEVFLCAweDZELCAweEVFLCAweDZFLCAweEVFLCAweDZGLCAweEVFLCAweDcwLCAvKiAweDNDLTB4M0YgKi8KKwkweEVFLCAweDcxLCAweEVFLCAweDcyLCAweEVFLCAweDczLCAweEVFLCAweDc0LCAvKiAweDQwLTB4NDMgKi8KKwkweEVFLCAweDc1LCAweEVFLCAweDc2LCAweEVFLCAweDc3LCAweEVFLCAweDc4LCAvKiAweDQ0LTB4NDcgKi8KKwkweEVFLCAweDc5LCAweEVFLCAweDdBLCAweEVFLCAweDdCLCAweEVFLCAweDdDLCAvKiAweDQ4LTB4NEIgKi8KKwkweEVFLCAweDdELCAweEVFLCAweDdFLCAweEVFLCAweDgwLCAweEVFLCAweDgxLCAvKiAweDRDLTB4NEYgKi8KKwkweEVFLCAweDgyLCAweEVFLCAweDgzLCAweEVFLCAweDg0LCAweEVFLCAweDg1LCAvKiAweDUwLTB4NTMgKi8KKwkweEVFLCAweDg2LCAweEVFLCAweDg3LCAweEVFLCAweDg4LCAweEVFLCAweDg5LCAvKiAweDU0LTB4NTcgKi8KKwkweEVFLCAweDhBLCAweEVFLCAweDhCLCAweEVFLCAweDhDLCAweEVFLCAweDhELCAvKiAweDU4LTB4NUIgKi8KKwkweEVFLCAweDhFLCAweEVFLCAweDhGLCAweEVFLCAweDkwLCAweEVFLCAweDkxLCAvKiAweDVDLTB4NUYgKi8KKwkweEVFLCAweDkyLCAweEVFLCAweDkzLCAweEVFLCAweDk0LCAweEVFLCAweDk1LCAvKiAweDYwLTB4NjMgKi8KKwkweEVFLCAweDk2LCAweEVFLCAweDk3LCAweEVFLCAweDk4LCAweEVFLCAweDk5LCAvKiAweDY0LTB4NjcgKi8KKwkweEVFLCAweDlBLCAweEVFLCAweDlCLCAweEVFLCAweDlDLCAweEVFLCAweDlELCAvKiAweDY4LTB4NkIgKi8KKwkweEVFLCAweDlFLCAweEVFLCAweDlGLCAweEVFLCAweEEwLCAweEVGLCAweDQwLCAvKiAweDZDLTB4NkYgKi8KKwkweEVGLCAweDQxLCAweEVGLCAweDQyLCAweEVGLCAweDQzLCAweEVGLCAweDQ0LCAvKiAweDcwLTB4NzMgKi8KKwkweEVGLCAweDQ1LCAweEQyLCAweEIzLCAweEI2LCAweEE1LCAweEM3LCAweEVBLCAvKiAweDc0LTB4NzcgKi8KKwkweEYxLCAweEZDLCAweENGLCAweEVFLCAweENCLCAweEIzLCAweEQwLCAweEVCLCAvKiAweDc4LTB4N0IgKi8KKwkweEU3LCAweEVGLCAweENELCAweEU3LCAweEI5LCAweENCLCAweEI2LCAweEQ5LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEYxLCAweEZELCAweEIwLCAweEU0LCAweENCLCAweENDLCAweEYxLCAweEZFLCAvKiAweDgwLTB4ODMgKi8KKwkweEQ0LCAweEE0LCAweEMyLCAweEFELCAweEMxLCAweEVDLCAweEM2LCAweEM0LCAvKiAweDg0LTB4ODcgKi8KKwkweEJFLCAweEIxLCAweEYyLCAweEExLCAweEJDLCAweEQ1LCAweEVGLCAweDQ2LCAvKiAweDg4LTB4OEIgKi8KKwkweEYyLCAweEEyLCAweEYyLCAweEEzLCAweEVGLCAweDQ3LCAweEYyLCAweEE0LCAvKiAweDhDLTB4OEYgKi8KKwkweEQyLCAweEMzLCAweEM2LCAweEI1LCAweEVGLCAweDQ4LCAweENELCAweEM3LCAvKiAweDkwLTB4OTMgKi8KKwkweEYyLCAweEE1LCAweEVGLCAweDQ5LCAweEQzLCAweEIxLCAweEJGLCAweEM1LCAvKiAweDk0LTB4OTcgKi8KKwkweENDLCAweEUyLCAweEVGLCAweDRBLCAweEYyLCAweEE2LCAweEYyLCAweEE3LCAvKiAweDk4LTB4OUIgKi8KKwkweEQxLCAweEQ1LCAweEI2LCAweEVFLCAweEYyLCAweEE4LCAweEYyLCAweEE5LCAvKiAweDlDLTB4OUYgKi8KKwkweEI1LCAweERGLCAweEYyLCAweEFBLCAweEYyLCAweEFCLCAweEVGLCAweDRCLCAvKiAweEEwLTB4QTMgKi8KKwkweEIyLCAweEZDLCAweEYyLCAweEFDLCAweEYyLCAweEFELCAweEM4LCAweEE3LCAvKiAweEE0LTB4QTcgKi8KKwkweEVGLCAweDRDLCAweEVGLCAweDRELCAweEVGLCAweDRFLCAweEVGLCAweDRGLCAvKiAweEE4LTB4QUIgKi8KKwkweEVGLCAweDUwLCAweEVGLCAweDUxLCAweEVGLCAweDUyLCAweEVGLCAweDUzLCAvKiAweEFDLTB4QUYgKi8KKwkweEVGLCAweDU0LCAweEVGLCAweDU1LCAweEVGLCAweDU2LCAweEVGLCAweDU3LCAvKiAweEIwLTB4QjMgKi8KKwkweEVGLCAweDU4LCAweEVGLCAweDU5LCAweEVGLCAweDVBLCAweEVGLCAweDVCLCAvKiAweEI0LTB4QjcgKi8KKwkweEVGLCAweDVDLCAweEVGLCAweDVELCAweEVGLCAweDVFLCAweEVGLCAweDVGLCAvKiAweEI4LTB4QkIgKi8KKwkweEVGLCAweDYwLCAweEVGLCAweDYxLCAweEVGLCAweDYyLCAweEVGLCAweDYzLCAvKiAweEJDLTB4QkYgKi8KKwkweEVGLCAweDY0LCAweEVGLCAweDY1LCAweEVGLCAweDY2LCAweEVGLCAweDY3LCAvKiAweEMwLTB4QzMgKi8KKwkweEVGLCAweDY4LCAweEVGLCAweDY5LCAweEVGLCAweDZBLCAweEVGLCAweDZCLCAvKiAweEM0LTB4QzcgKi8KKwkweEVGLCAweDZDLCAweEVGLCAweDZELCAweEVGLCAweDZFLCAweEVGLCAweDZGLCAvKiAweEM4LTB4Q0IgKi8KKwkweEVGLCAweDcwLCAweEVGLCAweDcxLCAweEI3LCAweEU3LCAweEVGLCAweDcyLCAvKiAweENDLTB4Q0YgKi8KKwkweEVGLCAweDczLCAweEVDLCAweEE5LCAweEVDLCAweEFBLCAweEVDLCAweEFCLCAvKiAweEQwLTB4RDMgKi8KKwkweEVGLCAweDc0LCAweEVDLCAweEFDLCAweEVGLCAweDc1LCAweEVGLCAweDc2LCAvKiAweEQ0LTB4RDcgKi8KKwkweEM2LCAweEFFLCAweEVDLCAweEFELCAweEVDLCAweEFFLCAweEVGLCAweDc3LCAvKiAweEQ4LTB4REIgKi8KKwkweEVGLCAweDc4LCAweEVGLCAweDc5LCAweEI3LCAweEM5LCAweENBLCAweEIzLCAvKiAweERDLTB4REYgKi8KKwkweEVGLCAweDdBLCAweEVGLCAweDdCLCAweEVGLCAweDdDLCAweEVGLCAweDdELCAvKiAweEUwLTB4RTMgKi8KKwkweEVGLCAweDdFLCAweEVGLCAweDgwLCAweEVGLCAweDgxLCAweEUyLCAweEI4LCAvKiAweEU0LTB4RTcgKi8KKwkweEY3LCAweENGLCAweEVGLCAweDgyLCAweEVGLCAweDgzLCAweEVGLCAweDg0LCAvKiAweEU4LTB4RUIgKi8KKwkweEVGLCAweDg1LCAweEVGLCAweDg2LCAweEVGLCAweDg3LCAweEVGLCAweDg4LCAvKiAweEVDLTB4RUYgKi8KKwkweEVGLCAweDg5LCAweEVGLCAweDhBLCAweEVGLCAweDhCLCAweEVGLCAweDhDLCAvKiAweEYwLTB4RjMgKi8KKwkweEVGLCAweDhELCAweEVGLCAweDhFLCAweEVGLCAweDhGLCAweEVGLCAweDkwLCAvKiAweEY0LTB4RjcgKi8KKwkweEVGLCAweDkxLCAweEVGLCAweDkyLCAweEVGLCAweDkzLCAweEVGLCAweDk0LCAvKiAweEY4LTB4RkIgKi8KKwkweEVGLCAweDk1LCAweEVGLCAweDk2LCAweEVGLCAweDk3LCAweEVGLCAweDk4LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185OVs1MTJdID0geworCTB4RUYsIDB4OTksIDB4RUYsIDB4OUEsIDB4RUYsIDB4OUIsIDB4RUYsIDB4OUMsIC8qIDB4MDAtMHgwMyAqLworCTB4RUYsIDB4OUQsIDB4RUYsIDB4OUUsIDB4RUYsIDB4OUYsIDB4RUYsIDB4QTAsIC8qIDB4MDQtMHgwNyAqLworCTB4RjAsIDB4NDAsIDB4RjAsIDB4NDEsIDB4RjAsIDB4NDIsIDB4RjAsIDB4NDMsIC8qIDB4MDgtMHgwQiAqLworCTB4RjAsIDB4NDQsIDB4RjcsIDB4RDAsIDB4RjAsIDB4NDUsIDB4RjAsIDB4NDYsIC8qIDB4MEMtMHgwRiAqLworCTB4QjIsIDB4Q0QsIDB4RjAsIDB4NDcsIDB4RjAsIDB4NDgsIDB4RjAsIDB4NDksIC8qIDB4MTAtMHgxMyAqLworCTB4RjAsIDB4NEEsIDB4RjAsIDB4NEIsIDB4RjAsIDB4NEMsIDB4RjAsIDB4NEQsIC8qIDB4MTQtMHgxNyAqLworCTB4RjAsIDB4NEUsIDB4RjAsIDB4NEYsIDB4RjAsIDB4NTAsIDB4RjAsIDB4NTEsIC8qIDB4MTgtMHgxQiAqLworCTB4RjAsIDB4NTIsIDB4RjAsIDB4NTMsIDB4RjAsIDB4NTQsIDB4RjAsIDB4NTUsIC8qIDB4MUMtMHgxRiAqLworCTB4RjAsIDB4NTYsIDB4RjAsIDB4NTcsIDB4RjAsIDB4NTgsIDB4RjAsIDB4NTksIC8qIDB4MjAtMHgyMyAqLworCTB4RjAsIDB4NUEsIDB4RjAsIDB4NUIsIDB4RjAsIDB4NUMsIDB4RjAsIDB4NUQsIC8qIDB4MjQtMHgyNyAqLworCTB4RjAsIDB4NUUsIDB4RjAsIDB4NUYsIDB4RjAsIDB4NjAsIDB4RjAsIDB4NjEsIC8qIDB4MjgtMHgyQiAqLworCTB4RjAsIDB4NjIsIDB4RjAsIDB4NjMsIDB4RjcsIDB4RDEsIDB4RjAsIDB4NjQsIC8qIDB4MkMtMHgyRiAqLworCTB4RjAsIDB4NjUsIDB4RjAsIDB4NjYsIDB4RjAsIDB4NjcsIDB4RjAsIDB4NjgsIC8qIDB4MzAtMHgzMyAqLworCTB4RjAsIDB4NjksIDB4RjAsIDB4NkEsIDB4RjAsIDB4NkIsIDB4RjAsIDB4NkMsIC8qIDB4MzQtMHgzNyAqLworCTB4RjAsIDB4NkQsIDB4RjAsIDB4NkUsIDB4RjAsIDB4NkYsIDB4RjAsIDB4NzAsIC8qIDB4MzgtMHgzQiAqLworCTB4RjAsIDB4NzEsIDB4RjAsIDB4NzIsIDB4RjAsIDB4NzMsIDB4RjAsIDB4NzQsIC8qIDB4M0MtMHgzRiAqLworCTB4RjAsIDB4NzUsIDB4RjAsIDB4NzYsIDB4RjAsIDB4NzcsIDB4RjAsIDB4NzgsIC8qIDB4NDAtMHg0MyAqLworCTB4RjAsIDB4NzksIDB4RjAsIDB4N0EsIDB4RjAsIDB4N0IsIDB4RjAsIDB4N0MsIC8qIDB4NDQtMHg0NyAqLworCTB4RjAsIDB4N0QsIDB4RjAsIDB4N0UsIDB4RjAsIDB4ODAsIDB4RjAsIDB4ODEsIC8qIDB4NDgtMHg0QiAqLworCTB4RjAsIDB4ODIsIDB4RjAsIDB4ODMsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODUsIC8qIDB4NEMtMHg0RiAqLworCTB4RjAsIDB4ODYsIDB4RjAsIDB4ODcsIDB4RjAsIDB4ODgsIDB4RjAsIDB4ODksIC8qIDB4NTAtMHg1MyAqLworCTB4RjcsIDB4RDMsIDB4RjcsIDB4RDIsIDB4RjAsIDB4OEEsIDB4RjAsIDB4OEIsIC8qIDB4NTQtMHg1NyAqLworCTB4RjAsIDB4OEMsIDB4RjAsIDB4OEQsIDB4RjAsIDB4OEUsIDB4RjAsIDB4OEYsIC8qIDB4NTgtMHg1QiAqLworCTB4RjAsIDB4OTAsIDB4RjAsIDB4OTEsIDB4RjAsIDB4OTIsIDB4RjAsIDB4OTMsIC8qIDB4NUMtMHg1RiAqLworCTB4RjAsIDB4OTQsIDB4RjAsIDB4OTUsIDB4RjAsIDB4OTYsIDB4RTIsIDB4QkIsIC8qIDB4NjAtMHg2MyAqLworCTB4RjAsIDB4OTcsIDB4QkMsIDB4QTIsIDB4RjAsIDB4OTgsIDB4RTIsIDB4QkMsIC8qIDB4NjQtMHg2NyAqLworCTB4RTIsIDB4QkQsIDB4RTIsIDB4QkUsIDB4RTIsIDB4QkYsIDB4RTIsIDB4QzAsIC8qIDB4NjgtMHg2QiAqLworCTB4RTIsIDB4QzEsIDB4QjcsIDB4QjksIDB4RDIsIDB4RkIsIDB4QkQsIDB4QTQsIC8qIDB4NkMtMHg2RiAqLworCTB4Q0EsIDB4Q0UsIDB4QjEsIDB4QTUsIDB4Q0IsIDB4QzcsIDB4RjAsIDB4OTksIC8qIDB4NzAtMHg3MyAqLworCTB4RTIsIDB4QzIsIDB4QjYsIDB4RkMsIDB4QzgsIDB4QzQsIDB4RTIsIDB4QzMsIC8qIDB4NzQtMHg3NyAqLworCTB4RjAsIDB4OUEsIDB4RjAsIDB4OUIsIDB4QkQsIDB4QzgsIDB4RjAsIDB4OUMsIC8qIDB4NzgtMHg3QiAqLworCTB4QjEsIDB4RkQsIDB4RTIsIDB4QzQsIDB4RjAsIDB4OUQsIDB4QjYsIDB4RjYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RTIsIDB4QzUsIDB4QzQsIDB4RDksIDB4RjAsIDB4OUUsIDB4RjAsIDB4OUYsIC8qIDB4ODAtMHg4MyAqLworCTB4RTIsIDB4QzYsIDB4Q0YsIDB4REEsIDB4QjksIDB4REQsIDB4RTIsIDB4QzcsIC8qIDB4ODQtMHg4NyAqLworCTB4QzAsIDB4QTEsIDB4RjAsIDB4QTAsIDB4RTIsIDB4QzgsIDB4QjIsIDB4RjYsIC8qIDB4ODgtMHg4QiAqLworCTB4RjEsIDB4NDAsIDB4RTIsIDB4QzksIDB4RjEsIDB4NDEsIDB4QzEsIDB4RjMsIC8qIDB4OEMtMHg4RiAqLworCTB4RTIsIDB4Q0EsIDB4RTIsIDB4Q0IsIDB4QzIsIDB4RjgsIDB4RTIsIDB4Q0MsIC8qIDB4OTAtMHg5MyAqLworCTB4RTIsIDB4Q0QsIDB4RTIsIDB4Q0UsIDB4Q0EsIDB4RDcsIDB4RDgsIDB4QjgsIC8qIDB4OTQtMHg5NyAqLworCTB4RDksIDB4RTUsIDB4Q0YsIDB4RTMsIDB4RjEsIDB4NDIsIDB4RjEsIDB4NDMsIC8qIDB4OTgtMHg5QiAqLworCTB4RjEsIDB4NDQsIDB4RjEsIDB4NDUsIDB4RjEsIDB4NDYsIDB4RjEsIDB4NDcsIC8qIDB4OUMtMHg5RiAqLworCTB4RjEsIDB4NDgsIDB4RjEsIDB4NDksIDB4RjEsIDB4NEEsIDB4RjEsIDB4NEIsIC8qIDB4QTAtMHhBMyAqLworCTB4RjEsIDB4NEMsIDB4RjAsIDB4QTUsIDB4RjEsIDB4NEQsIDB4RjEsIDB4NEUsIC8qIDB4QTQtMHhBNyAqLworCTB4REMsIDB4QjAsIDB4RjEsIDB4NEYsIDB4RjEsIDB4NTAsIDB4RjEsIDB4NTEsIC8qIDB4QTgtMHhBQiAqLworCTB4RjEsIDB4NTIsIDB4RjEsIDB4NTMsIDB4RjEsIDB4NTQsIDB4RjEsIDB4NTUsIC8qIDB4QUMtMHhBRiAqLworCTB4RjEsIDB4NTYsIDB4RjEsIDB4NTcsIDB4RjEsIDB4NTgsIDB4RjEsIDB4NTksIC8qIDB4QjAtMHhCMyAqLworCTB4RjEsIDB4NUEsIDB4RjEsIDB4NUIsIDB4RjEsIDB4NUMsIDB4RjEsIDB4NUQsIC8qIDB4QjQtMHhCNyAqLworCTB4RjEsIDB4NUUsIDB4RjEsIDB4NUYsIDB4RjEsIDB4NjAsIDB4RjEsIDB4NjEsIC8qIDB4QjgtMHhCQiAqLworCTB4RjEsIDB4NjIsIDB4RjEsIDB4NjMsIDB4RjEsIDB4NjQsIDB4RjEsIDB4NjUsIC8qIDB4QkMtMHhCRiAqLworCTB4RjEsIDB4NjYsIDB4RjEsIDB4NjcsIDB4RjEsIDB4NjgsIDB4RjEsIDB4NjksIC8qIDB4QzAtMHhDMyAqLworCTB4RjEsIDB4NkEsIDB4RjEsIDB4NkIsIDB4RjEsIDB4NkMsIDB4RjEsIDB4NkQsIC8qIDB4QzQtMHhDNyAqLworCTB4RjEsIDB4NkUsIDB4RjEsIDB4NkYsIDB4RjEsIDB4NzAsIDB4RjEsIDB4NzEsIC8qIDB4QzgtMHhDQiAqLworCTB4RjEsIDB4NzIsIDB4RjEsIDB4NzMsIDB4RjEsIDB4NzQsIDB4RjEsIDB4NzUsIC8qIDB4Q0MtMHhDRiAqLworCTB4RjEsIDB4NzYsIDB4RjEsIDB4NzcsIDB4RjEsIDB4NzgsIDB4RjEsIDB4NzksIC8qIDB4RDAtMHhEMyAqLworCTB4RjEsIDB4N0EsIDB4RjEsIDB4N0IsIDB4RjEsIDB4N0MsIDB4RjEsIDB4N0QsIC8qIDB4RDQtMHhENyAqLworCTB4RjEsIDB4N0UsIDB4RjEsIDB4ODAsIDB4RjEsIDB4ODEsIDB4RjEsIDB4ODIsIC8qIDB4RDgtMHhEQiAqLworCTB4RjEsIDB4ODMsIDB4RjEsIDB4ODQsIDB4RjEsIDB4ODUsIDB4RjEsIDB4ODYsIC8qIDB4REMtMHhERiAqLworCTB4RjEsIDB4ODcsIDB4RjEsIDB4ODgsIDB4RjEsIDB4ODksIDB4RjEsIDB4OEEsIC8qIDB4RTAtMHhFMyAqLworCTB4RjEsIDB4OEIsIDB4RjEsIDB4OEMsIDB4RjEsIDB4OEQsIDB4RjEsIDB4OEUsIC8qIDB4RTQtMHhFNyAqLworCTB4RjEsIDB4OEYsIDB4RjEsIDB4OTAsIDB4RjEsIDB4OTEsIDB4RjEsIDB4OTIsIC8qIDB4RTgtMHhFQiAqLworCTB4RjEsIDB4OTMsIDB4RjEsIDB4OTQsIDB4RjEsIDB4OTUsIDB4RjEsIDB4OTYsIC8qIDB4RUMtMHhFRiAqLworCTB4RjEsIDB4OTcsIDB4RjEsIDB4OTgsIDB4RjEsIDB4OTksIDB4RjEsIDB4OUEsIC8qIDB4RjAtMHhGMyAqLworCTB4RjEsIDB4OUIsIDB4RjEsIDB4OUMsIDB4RjEsIDB4OUQsIDB4RjEsIDB4OUUsIC8qIDB4RjQtMHhGNyAqLworCTB4RjEsIDB4OUYsIDB4RjEsIDB4QTAsIDB4RjIsIDB4NDAsIDB4RjIsIDB4NDEsIC8qIDB4RjgtMHhGQiAqLworCTB4RjIsIDB4NDIsIDB4RjIsIDB4NDMsIDB4RjIsIDB4NDQsIDB4RjIsIDB4NDUsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzlBWzUxMl0gPSB7CisJMHhGMiwgMHg0NiwgMHhGMiwgMHg0NywgMHhGMiwgMHg0OCwgMHhGMiwgMHg0OSwgLyogMHgwMC0weDAzICovCisJMHhGMiwgMHg0QSwgMHhGMiwgMHg0QiwgMHhGMiwgMHg0QywgMHhGMiwgMHg0RCwgLyogMHgwNC0weDA3ICovCisJMHhGMiwgMHg0RSwgMHhGMiwgMHg0RiwgMHhGMiwgMHg1MCwgMHhGMiwgMHg1MSwgLyogMHgwOC0weDBCICovCisJMHhGMiwgMHg1MiwgMHhGMiwgMHg1MywgMHhGMiwgMHg1NCwgMHhGMiwgMHg1NSwgLyogMHgwQy0weDBGICovCisJMHhGMiwgMHg1NiwgMHhGMiwgMHg1NywgMHhGMiwgMHg1OCwgMHhGMiwgMHg1OSwgLyogMHgxMC0weDEzICovCisJMHhGMiwgMHg1QSwgMHhGMiwgMHg1QiwgMHhGMiwgMHg1QywgMHhGMiwgMHg1RCwgLyogMHgxNC0weDE3ICovCisJMHhGMiwgMHg1RSwgMHhGMiwgMHg1RiwgMHhGMiwgMHg2MCwgMHhGMiwgMHg2MSwgLyogMHgxOC0weDFCICovCisJMHhGMiwgMHg2MiwgMHhGMiwgMHg2MywgMHhGMiwgMHg2NCwgMHhGMiwgMHg2NSwgLyogMHgxQy0weDFGICovCisJMHhGMiwgMHg2NiwgMHhGMiwgMHg2NywgMHhGMiwgMHg2OCwgMHhGMiwgMHg2OSwgLyogMHgyMC0weDIzICovCisJMHhGMiwgMHg2QSwgMHhGMiwgMHg2QiwgMHhGMiwgMHg2QywgMHhGMiwgMHg2RCwgLyogMHgyNC0weDI3ICovCisJMHhGMiwgMHg2RSwgMHhGMiwgMHg2RiwgMHhGMiwgMHg3MCwgMHhGMiwgMHg3MSwgLyogMHgyOC0weDJCICovCisJMHhGMiwgMHg3MiwgMHhGMiwgMHg3MywgMHhGMiwgMHg3NCwgMHhGMiwgMHg3NSwgLyogMHgyQy0weDJGICovCisJMHhGMiwgMHg3NiwgMHhGMiwgMHg3NywgMHhGMiwgMHg3OCwgMHhGMiwgMHg3OSwgLyogMHgzMC0weDMzICovCisJMHhGMiwgMHg3QSwgMHhGMiwgMHg3QiwgMHhGMiwgMHg3QywgMHhGMiwgMHg3RCwgLyogMHgzNC0weDM3ICovCisJMHhGMiwgMHg3RSwgMHhGMiwgMHg4MCwgMHhGMiwgMHg4MSwgMHhGMiwgMHg4MiwgLyogMHgzOC0weDNCICovCisJMHhGMiwgMHg4MywgMHhGMiwgMHg4NCwgMHhGMiwgMHg4NSwgMHhGMiwgMHg4NiwgLyogMHgzQy0weDNGICovCisJMHhGMiwgMHg4NywgMHhGMiwgMHg4OCwgMHhGMiwgMHg4OSwgMHhGMiwgMHg4QSwgLyogMHg0MC0weDQzICovCisJMHhGMiwgMHg4QiwgMHhGMiwgMHg4QywgMHhGMiwgMHg4RCwgMHhGMiwgMHg4RSwgLyogMHg0NC0weDQ3ICovCisJMHhGMiwgMHg4RiwgMHhGMiwgMHg5MCwgMHhGMiwgMHg5MSwgMHhGMiwgMHg5MiwgLyogMHg0OC0weDRCICovCisJMHhGMiwgMHg5MywgMHhGMiwgMHg5NCwgMHhGMiwgMHg5NSwgMHhGMiwgMHg5NiwgLyogMHg0Qy0weDRGICovCisJMHhGMiwgMHg5NywgMHhGMiwgMHg5OCwgMHhGMiwgMHg5OSwgMHhGMiwgMHg5QSwgLyogMHg1MC0weDUzICovCisJMHhGMiwgMHg5QiwgMHhGMiwgMHg5QywgMHhGMiwgMHg5RCwgMHhGMiwgMHg5RSwgLyogMHg1NC0weDU3ICovCisJMHhGMiwgMHg5RiwgMHhGMiwgMHhBMCwgMHhGMywgMHg0MCwgMHhGMywgMHg0MSwgLyogMHg1OC0weDVCICovCisJMHhGMywgMHg0MiwgMHhGMywgMHg0MywgMHhGMywgMHg0NCwgMHhGMywgMHg0NSwgLyogMHg1Qy0weDVGICovCisJMHhGMywgMHg0NiwgMHhGMywgMHg0NywgMHhGMywgMHg0OCwgMHhGMywgMHg0OSwgLyogMHg2MC0weDYzICovCisJMHhGMywgMHg0QSwgMHhGMywgMHg0QiwgMHhGMywgMHg0QywgMHhGMywgMHg0RCwgLyogMHg2NC0weDY3ICovCisJMHhGMywgMHg0RSwgMHhGMywgMHg0RiwgMHhGMywgMHg1MCwgMHhGMywgMHg1MSwgLyogMHg2OC0weDZCICovCisJMHhDMiwgMHhFRCwgMHhENCwgMHhBNiwgMHhDRCwgMHhENCwgMHhEMSwgMHhCMSwgLyogMHg2Qy0weDZGICovCisJMHhCMywgMHhEQiwgMHhDNywgMHhGRCwgMHhGMywgMHg1MiwgMHhCMiwgMHhCNSwgLyogMHg3MC0weDczICovCisJMHhDMiwgMHhCRiwgMHhFNiwgMHhFMCwgMHhDQSwgMHhCQiwgMHhFNiwgMHhFMSwgLyogMHg3NC0weDc3ICovCisJMHhFNiwgMHhFMiwgMHhCRSwgMHhENCwgMHhFNiwgMHhFMywgMHhENywgMHhBNCwgLyogMHg3OC0weDdCICovCisJMHhDRCwgMHhENSwgMHhFNiwgMHhFNSwgMHhCQywgMHhERCwgMHhFNiwgMHhFNCwgLyogMHg3Qy0weDdGICovCisJCisJMHhFNiwgMHhFNiwgMHhFNiwgMHhFNywgMHhDMiwgMHhFRSwgMHhGMywgMHg1MywgLyogMHg4MC0weDgzICovCisJMHhCRCwgMHhCRSwgMHhFNiwgMHhFOCwgMHhDMiwgMHhFNiwgMHhCQSwgMHhBNywgLyogMHg4NC0weDg3ICovCisJMHhFNiwgMHhFOSwgMHhGMywgMHg1NCwgMHhFNiwgMHhFQSwgMHhCMywgMHhEMiwgLyogMHg4OC0weDhCICovCisJMHhEMSwgMHhFOSwgMHhGMywgMHg1NSwgMHhGMywgMHg1NiwgMHhCRiwgMHhBNSwgLyogMHg4Qy0weDhGICovCisJMHhFNiwgMHhFQiwgMHhDNiwgMHhFRiwgMHhFNiwgMHhFQywgMHhFNiwgMHhFRCwgLyogMHg5MC0weDkzICovCisJMHhGMywgMHg1NywgMHhGMywgMHg1OCwgMHhFNiwgMHhFRSwgMHhDNiwgMHhBRCwgLyogMHg5NC0weDk3ICovCisJMHhFNiwgMHhFRiwgMHhGMywgMHg1OSwgMHhDOSwgMHhBNywgMHhFNiwgMHhGMCwgLyogMHg5OC0weDlCICovCisJMHhFNiwgMHhGMSwgMHhFNiwgMHhGMiwgMHhFNSwgMHhCOSwgMHhFNiwgMHhGMywgLyogMHg5Qy0weDlGICovCisJMHhFNiwgMHhGNCwgMHhDMiwgMHhFMiwgMHhFNiwgMHhGNSwgMHhFNiwgMHhGNiwgLyogMHhBMC0weEEzICovCisJMHhENiwgMHhFOCwgMHhFNiwgMHhGNywgMHhGMywgMHg1QSwgMHhFNiwgMHhGOCwgLyogMHhBNC0weEE3ICovCisJMHhCOSwgMHhDNywgMHhGMywgMHg1QiwgMHhGMywgMHg1QywgMHhGMywgMHg1RCwgLyogMHhBOC0weEFCICovCisJMHhGMywgMHg1RSwgMHhGMywgMHg1RiwgMHhGMywgMHg2MCwgMHhGMywgMHg2MSwgLyogMHhBQy0weEFGICovCisJMHhGNywgMHhCQiwgMHhGNywgMHhCQSwgMHhGMywgMHg2MiwgMHhGMywgMHg2MywgLyogMHhCMC0weEIzICovCisJMHhGMywgMHg2NCwgMHhGMywgMHg2NSwgMHhGNywgMHhCRSwgMHhGNywgMHhCQywgLyogMHhCNC0weEI3ICovCisJMHhCQSwgMHhBMSwgMHhGMywgMHg2NiwgMHhGNywgMHhCRiwgMHhGMywgMHg2NywgLyogMHhCOC0weEJCICovCisJMHhGNywgMHhDMCwgMHhGMywgMHg2OCwgMHhGMywgMHg2OSwgMHhGMywgMHg2QSwgLyogMHhCQy0weEJGICovCisJMHhGNywgMHhDMiwgMHhGNywgMHhDMSwgMHhGNywgMHhDNCwgMHhGMywgMHg2QiwgLyogMHhDMC0weEMzICovCisJMHhGMywgMHg2QywgMHhGNywgMHhDMywgMHhGMywgMHg2RCwgMHhGMywgMHg2RSwgLyogMHhDNC0weEM3ICovCisJMHhGMywgMHg2RiwgMHhGMywgMHg3MCwgMHhGMywgMHg3MSwgMHhGNywgMHhDNSwgLyogMHhDOC0weENCICovCisJMHhGNywgMHhDNiwgMHhGMywgMHg3MiwgMHhGMywgMHg3MywgMHhGMywgMHg3NCwgLyogMHhDQy0weENGICovCisJMHhGMywgMHg3NSwgMHhGNywgMHhDNywgMHhGMywgMHg3NiwgMHhDQiwgMHhFOCwgLyogMHhEMC0weEQzICovCisJMHhGMywgMHg3NywgMHhGMywgMHg3OCwgMHhGMywgMHg3OSwgMHhGMywgMHg3QSwgLyogMHhENC0weEQ3ICovCisJMHhCOCwgMHhERiwgMHhGMywgMHg3QiwgMHhGMywgMHg3QywgMHhGMywgMHg3RCwgLyogMHhEOC0weERCICovCisJMHhGMywgMHg3RSwgMHhGMywgMHg4MCwgMHhGMywgMHg4MSwgMHhGNywgMHhENCwgLyogMHhEQy0weERGICovCisJMHhGMywgMHg4MiwgMHhGNywgMHhENSwgMHhGMywgMHg4MywgMHhGMywgMHg4NCwgLyogMHhFMC0weEUzICovCisJMHhGMywgMHg4NSwgMHhGMywgMHg4NiwgMHhGNywgMHhENiwgMHhGMywgMHg4NywgLyogMHhFNC0weEU3ICovCisJMHhGMywgMHg4OCwgMHhGMywgMHg4OSwgMHhGMywgMHg4QSwgMHhGNywgMHhEOCwgLyogMHhFOC0weEVCICovCisJMHhGMywgMHg4QiwgMHhGNywgMHhEQSwgMHhGMywgMHg4QywgMHhGNywgMHhENywgLyogMHhFQy0weEVGICovCisJMHhGMywgMHg4RCwgMHhGMywgMHg4RSwgMHhGMywgMHg4RiwgMHhGMywgMHg5MCwgLyogMHhGMC0weEYzICovCisJMHhGMywgMHg5MSwgMHhGMywgMHg5MiwgMHhGMywgMHg5MywgMHhGMywgMHg5NCwgLyogMHhGNC0weEY3ICovCisJMHhGMywgMHg5NSwgMHhGNywgMHhEQiwgMHhGMywgMHg5NiwgMHhGNywgMHhEOSwgLyogMHhGOC0weEZCICovCisJMHhGMywgMHg5NywgMHhGMywgMHg5OCwgMHhGMywgMHg5OSwgMHhGMywgMHg5QSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOUJbNTEyXSA9IHsKKwkweEYzLCAweDlCLCAweEYzLCAweDlDLCAweEYzLCAweDlELCAweEQ3LCAweEQ3LCAvKiAweDAwLTB4MDMgKi8KKwkweEYzLCAweDlFLCAweEYzLCAweDlGLCAweEYzLCAweEEwLCAweEY0LCAweDQwLCAvKiAweDA0LTB4MDcgKi8KKwkweEY3LCAweERDLCAweEY0LCAweDQxLCAweEY0LCAweDQyLCAweEY0LCAweDQzLCAvKiAweDA4LTB4MEIgKi8KKwkweEY0LCAweDQ0LCAweEY0LCAweDQ1LCAweEY0LCAweDQ2LCAweEY3LCAweERELCAvKiAweDBDLTB4MEYgKi8KKwkweEY0LCAweDQ3LCAweEY0LCAweDQ4LCAweEY0LCAweDQ5LCAweEY3LCAweERFLCAvKiAweDEwLTB4MTMgKi8KKwkweEY0LCAweDRBLCAweEY0LCAweDRCLCAweEY0LCAweDRDLCAweEY0LCAweDRELCAvKiAweDE0LTB4MTcgKi8KKwkweEY0LCAweDRFLCAweEY0LCAweDRGLCAweEY0LCAweDUwLCAweEY0LCAweDUxLCAvKiAweDE4LTB4MUIgKi8KKwkweEY0LCAweDUyLCAweEY0LCAweDUzLCAweEY0LCAweDU0LCAweEY3LCAweERGLCAvKiAweDFDLTB4MUYgKi8KKwkweEY0LCAweDU1LCAweEY0LCAweDU2LCAweEY0LCAweDU3LCAweEY3LCAweEUwLCAvKiAweDIwLTB4MjMgKi8KKwkweEY0LCAweDU4LCAweEY0LCAweDU5LCAweEY0LCAweDVBLCAweEY0LCAweDVCLCAvKiAweDI0LTB4MjcgKi8KKwkweEY0LCAweDVDLCAweEY0LCAweDVELCAweEY0LCAweDVFLCAweEY0LCAweDVGLCAvKiAweDI4LTB4MkIgKi8KKwkweEY0LCAweDYwLCAweEY0LCAweDYxLCAweEY0LCAweDYyLCAweERCLCAweENCLCAvKiAweDJDLTB4MkYgKi8KKwkweEY0LCAweDYzLCAweEY0LCAweDY0LCAweEQ4LCAweEFBLCAweEY0LCAweDY1LCAvKiAweDMwLTB4MzMgKi8KKwkweEY0LCAweDY2LCAweEY0LCAweDY3LCAweEY0LCAweDY4LCAweEY0LCAweDY5LCAvKiAweDM0LTB4MzcgKi8KKwkweEY0LCAweDZBLCAweEY0LCAweDZCLCAweEY0LCAweDZDLCAweEU1LCAweEY3LCAvKiAweDM4LTB4M0IgKi8KKwkweEI5LCAweEVELCAweEY0LCAweDZELCAweEY0LCAweDZFLCAweEY0LCAweDZGLCAvKiAweDNDLTB4M0YgKi8KKwkweEY0LCAweDcwLCAweEJGLCAweEZELCAweEJCLCAweEVBLCAweEY3LCAweEM5LCAvKiAweDQwLTB4NDMgKi8KKwkweEM2LCAweEM3LCAweEY3LCAweEM4LCAweEY0LCAweDcxLCAweEY3LCAweENBLCAvKiAweDQ0LTB4NDcgKi8KKwkweEY3LCAweENDLCAweEY3LCAweENCLCAweEY0LCAweDcyLCAweEY0LCAweDczLCAvKiAweDQ4LTB4NEIgKi8KKwkweEY0LCAweDc0LCAweEY3LCAweENELCAweEY0LCAweDc1LCAweENFLCAweEJBLCAvKiAweDRDLTB4NEYgKi8KKwkweEY0LCAweDc2LCAweEY3LCAweENFLCAweEY0LCAweDc3LCAweEY0LCAweDc4LCAvKiAweDUwLTB4NTMgKi8KKwkweEM0LCAweEE3LCAweEY0LCAweDc5LCAweEY0LCAweDdBLCAweEY0LCAweDdCLCAvKiAweDU0LTB4NTcgKi8KKwkweEY0LCAweDdDLCAweEY0LCAweDdELCAweEY0LCAweDdFLCAweEY0LCAweDgwLCAvKiAweDU4LTB4NUIgKi8KKwkweEY0LCAweDgxLCAweEY0LCAweDgyLCAweEY0LCAweDgzLCAweEY0LCAweDg0LCAvKiAweDVDLTB4NUYgKi8KKwkweEY0LCAweDg1LCAweEY0LCAweDg2LCAweEY0LCAweDg3LCAweEY0LCAweDg4LCAvKiAweDYwLTB4NjMgKi8KKwkweEY0LCAweDg5LCAweEY0LCAweDhBLCAweEY0LCAweDhCLCAweEY0LCAweDhDLCAvKiAweDY0LTB4NjcgKi8KKwkweEY0LCAweDhELCAweEY0LCAweDhFLCAweEY0LCAweDhGLCAweEY0LCAweDkwLCAvKiAweDY4LTB4NkIgKi8KKwkweEY0LCAweDkxLCAweEY0LCAweDkyLCAweEY0LCAweDkzLCAweEY0LCAweDk0LCAvKiAweDZDLTB4NkYgKi8KKwkweEY0LCAweDk1LCAweEY0LCAweDk2LCAweEY0LCAweDk3LCAweEY0LCAweDk4LCAvKiAweDcwLTB4NzMgKi8KKwkweEY0LCAweDk5LCAweEY0LCAweDlBLCAweEY0LCAweDlCLCAweEY0LCAweDlDLCAvKiAweDc0LTB4NzcgKi8KKwkweEY0LCAweDlELCAweEY0LCAweDlFLCAweEY0LCAweDlGLCAweEY0LCAweEEwLCAvKiAweDc4LTB4N0IgKi8KKwkweEY1LCAweDQwLCAweEY1LCAweDQxLCAweEY1LCAweDQyLCAweEY1LCAweDQzLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEY1LCAweDQ0LCAweEY1LCAweDQ1LCAweEY1LCAweDQ2LCAweEY1LCAweDQ3LCAvKiAweDgwLTB4ODMgKi8KKwkweEY1LCAweDQ4LCAweEY1LCAweDQ5LCAweEY1LCAweDRBLCAweEY1LCAweDRCLCAvKiAweDg0LTB4ODcgKi8KKwkweEY1LCAweDRDLCAweEY1LCAweDRELCAweEY1LCAweDRFLCAweEY1LCAweDRGLCAvKiAweDg4LTB4OEIgKi8KKwkweEY1LCAweDUwLCAweEY1LCAweDUxLCAweEY1LCAweDUyLCAweEY1LCAweDUzLCAvKiAweDhDLTB4OEYgKi8KKwkweEY1LCAweDU0LCAweEY1LCAweDU1LCAweEY1LCAweDU2LCAweEY1LCAweDU3LCAvKiAweDkwLTB4OTMgKi8KKwkweEY1LCAweDU4LCAweEY1LCAweDU5LCAweEY1LCAweDVBLCAweEY1LCAweDVCLCAvKiAweDk0LTB4OTcgKi8KKwkweEY1LCAweDVDLCAweEY1LCAweDVELCAweEY1LCAweDVFLCAweEY1LCAweDVGLCAvKiAweDk4LTB4OUIgKi8KKwkweEY1LCAweDYwLCAweEY1LCAweDYxLCAweEY1LCAweDYyLCAweEY1LCAweDYzLCAvKiAweDlDLTB4OUYgKi8KKwkweEY1LCAweDY0LCAweEY1LCAweDY1LCAweEY1LCAweDY2LCAweEY1LCAweDY3LCAvKiAweEEwLTB4QTMgKi8KKwkweEY1LCAweDY4LCAweEY1LCAweDY5LCAweEY1LCAweDZBLCAweEY1LCAweDZCLCAvKiAweEE0LTB4QTcgKi8KKwkweEY1LCAweDZDLCAweEY1LCAweDZELCAweEY1LCAweDZFLCAweEY1LCAweDZGLCAvKiAweEE4LTB4QUIgKi8KKwkweEY1LCAweDcwLCAweEY1LCAweDcxLCAweEY1LCAweDcyLCAweEY1LCAweDczLCAvKiAweEFDLTB4QUYgKi8KKwkweEY1LCAweDc0LCAweEY1LCAweDc1LCAweEY1LCAweDc2LCAweEY1LCAweDc3LCAvKiAweEIwLTB4QjMgKi8KKwkweEY1LCAweDc4LCAweEY1LCAweDc5LCAweEY1LCAweDdBLCAweEY1LCAweDdCLCAvKiAweEI0LTB4QjcgKi8KKwkweEY1LCAweDdDLCAweEY1LCAweDdELCAweEY1LCAweDdFLCAweEY1LCAweDgwLCAvKiAweEI4LTB4QkIgKi8KKwkweEY1LCAweDgxLCAweEY1LCAweDgyLCAweEY1LCAweDgzLCAweEY1LCAweDg0LCAvKiAweEJDLTB4QkYgKi8KKwkweEY1LCAweDg1LCAweEY1LCAweDg2LCAweEY1LCAweDg3LCAweEY1LCAweDg4LCAvKiAweEMwLTB4QzMgKi8KKwkweEY1LCAweDg5LCAweEY1LCAweDhBLCAweEY1LCAweDhCLCAweEY1LCAweDhDLCAvKiAweEM0LTB4QzcgKi8KKwkweEY1LCAweDhELCAweEY1LCAweDhFLCAweEY1LCAweDhGLCAweEY1LCAweDkwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEY1LCAweDkxLCAweEY1LCAweDkyLCAweEY1LCAweDkzLCAweEY1LCAweDk0LCAvKiAweENDLTB4Q0YgKi8KKwkweEY1LCAweDk1LCAweEY1LCAweDk2LCAweEY1LCAweDk3LCAweEY1LCAweDk4LCAvKiAweEQwLTB4RDMgKi8KKwkweEY1LCAweDk5LCAweEY1LCAweDlBLCAweEY1LCAweDlCLCAweEY1LCAweDlDLCAvKiAweEQ0LTB4RDcgKi8KKwkweEY1LCAweDlELCAweEY1LCAweDlFLCAweEY1LCAweDlGLCAweEY1LCAweEEwLCAvKiAweEQ4LTB4REIgKi8KKwkweEY2LCAweDQwLCAweEY2LCAweDQxLCAweEY2LCAweDQyLCAweEY2LCAweDQzLCAvKiAweERDLTB4REYgKi8KKwkweEY2LCAweDQ0LCAweEY2LCAweDQ1LCAweEY2LCAweDQ2LCAweEY2LCAweDQ3LCAvKiAweEUwLTB4RTMgKi8KKwkweEY2LCAweDQ4LCAweEY2LCAweDQ5LCAweEY2LCAweDRBLCAweEY2LCAweDRCLCAvKiAweEU0LTB4RTcgKi8KKwkweEY2LCAweDRDLCAweEY2LCAweDRELCAweEY2LCAweDRFLCAweEY2LCAweDRGLCAvKiAweEU4LTB4RUIgKi8KKwkweEY2LCAweDUwLCAweEY2LCAweDUxLCAweEY2LCAweDUyLCAweEY2LCAweDUzLCAvKiAweEVDLTB4RUYgKi8KKwkweEY2LCAweDU0LCAweEY2LCAweDU1LCAweEY2LCAweDU2LCAweEY2LCAweDU3LCAvKiAweEYwLTB4RjMgKi8KKwkweEY2LCAweDU4LCAweEY2LCAweDU5LCAweEY2LCAweDVBLCAweEY2LCAweDVCLCAvKiAweEY0LTB4RjcgKi8KKwkweEY2LCAweDVDLCAweEY2LCAweDVELCAweEY2LCAweDVFLCAweEY2LCAweDVGLCAvKiAweEY4LTB4RkIgKi8KKwkweEY2LCAweDYwLCAweEY2LCAweDYxLCAweEY2LCAweDYyLCAweEY2LCAweDYzLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185Q1s1MTJdID0geworCTB4RjYsIDB4NjQsIDB4RjYsIDB4NjUsIDB4RjYsIDB4NjYsIDB4RjYsIDB4NjcsIC8qIDB4MDAtMHgwMyAqLworCTB4RjYsIDB4NjgsIDB4RjYsIDB4NjksIDB4RjYsIDB4NkEsIDB4RjYsIDB4NkIsIC8qIDB4MDQtMHgwNyAqLworCTB4RjYsIDB4NkMsIDB4RjYsIDB4NkQsIDB4RjYsIDB4NkUsIDB4RjYsIDB4NkYsIC8qIDB4MDgtMHgwQiAqLworCTB4RjYsIDB4NzAsIDB4RjYsIDB4NzEsIDB4RjYsIDB4NzIsIDB4RjYsIDB4NzMsIC8qIDB4MEMtMHgwRiAqLworCTB4RjYsIDB4NzQsIDB4RjYsIDB4NzUsIDB4RjYsIDB4NzYsIDB4RjYsIDB4NzcsIC8qIDB4MTAtMHgxMyAqLworCTB4RjYsIDB4NzgsIDB4RjYsIDB4NzksIDB4RjYsIDB4N0EsIDB4RjYsIDB4N0IsIC8qIDB4MTQtMHgxNyAqLworCTB4RjYsIDB4N0MsIDB4RjYsIDB4N0QsIDB4RjYsIDB4N0UsIDB4RjYsIDB4ODAsIC8qIDB4MTgtMHgxQiAqLworCTB4RjYsIDB4ODEsIDB4RjYsIDB4ODIsIDB4RjYsIDB4ODMsIDB4RjYsIDB4ODQsIC8qIDB4MUMtMHgxRiAqLworCTB4RjYsIDB4ODUsIDB4RjYsIDB4ODYsIDB4RjYsIDB4ODcsIDB4RjYsIDB4ODgsIC8qIDB4MjAtMHgyMyAqLworCTB4RjYsIDB4ODksIDB4RjYsIDB4OEEsIDB4RjYsIDB4OEIsIDB4RjYsIDB4OEMsIC8qIDB4MjQtMHgyNyAqLworCTB4RjYsIDB4OEQsIDB4RjYsIDB4OEUsIDB4RjYsIDB4OEYsIDB4RjYsIDB4OTAsIC8qIDB4MjgtMHgyQiAqLworCTB4RjYsIDB4OTEsIDB4RjYsIDB4OTIsIDB4RjYsIDB4OTMsIDB4RjYsIDB4OTQsIC8qIDB4MkMtMHgyRiAqLworCTB4RjYsIDB4OTUsIDB4RjYsIDB4OTYsIDB4RjYsIDB4OTcsIDB4RjYsIDB4OTgsIC8qIDB4MzAtMHgzMyAqLworCTB4RjYsIDB4OTksIDB4RjYsIDB4OUEsIDB4RjYsIDB4OUIsIDB4RjYsIDB4OUMsIC8qIDB4MzQtMHgzNyAqLworCTB4RjYsIDB4OUQsIDB4RjYsIDB4OUUsIDB4RjYsIDB4OUYsIDB4RjYsIDB4QTAsIC8qIDB4MzgtMHgzQiAqLworCTB4RjcsIDB4NDAsIDB4RjcsIDB4NDEsIDB4RjcsIDB4NDIsIDB4RjcsIDB4NDMsIC8qIDB4M0MtMHgzRiAqLworCTB4RjcsIDB4NDQsIDB4RjcsIDB4NDUsIDB4RjcsIDB4NDYsIDB4RjcsIDB4NDcsIC8qIDB4NDAtMHg0MyAqLworCTB4RjcsIDB4NDgsIDB4RjcsIDB4NDksIDB4RjcsIDB4NEEsIDB4RjcsIDB4NEIsIC8qIDB4NDQtMHg0NyAqLworCTB4RjcsIDB4NEMsIDB4RjcsIDB4NEQsIDB4RjcsIDB4NEUsIDB4RjcsIDB4NEYsIC8qIDB4NDgtMHg0QiAqLworCTB4RjcsIDB4NTAsIDB4RjcsIDB4NTEsIDB4RjcsIDB4NTIsIDB4RjcsIDB4NTMsIC8qIDB4NEMtMHg0RiAqLworCTB4RjcsIDB4NTQsIDB4RjcsIDB4NTUsIDB4RjcsIDB4NTYsIDB4RjcsIDB4NTcsIC8qIDB4NTAtMHg1MyAqLworCTB4RjcsIDB4NTgsIDB4RjcsIDB4NTksIDB4RjcsIDB4NUEsIDB4RjcsIDB4NUIsIC8qIDB4NTQtMHg1NyAqLworCTB4RjcsIDB4NUMsIDB4RjcsIDB4NUQsIDB4RjcsIDB4NUUsIDB4RjcsIDB4NUYsIC8qIDB4NTgtMHg1QiAqLworCTB4RjcsIDB4NjAsIDB4RjcsIDB4NjEsIDB4RjcsIDB4NjIsIDB4RjcsIDB4NjMsIC8qIDB4NUMtMHg1RiAqLworCTB4RjcsIDB4NjQsIDB4RjcsIDB4NjUsIDB4RjcsIDB4NjYsIDB4RjcsIDB4NjcsIC8qIDB4NjAtMHg2MyAqLworCTB4RjcsIDB4NjgsIDB4RjcsIDB4NjksIDB4RjcsIDB4NkEsIDB4RjcsIDB4NkIsIC8qIDB4NjQtMHg2NyAqLworCTB4RjcsIDB4NkMsIDB4RjcsIDB4NkQsIDB4RjcsIDB4NkUsIDB4RjcsIDB4NkYsIC8qIDB4NjgtMHg2QiAqLworCTB4RjcsIDB4NzAsIDB4RjcsIDB4NzEsIDB4RjcsIDB4NzIsIDB4RjcsIDB4NzMsIC8qIDB4NkMtMHg2RiAqLworCTB4RjcsIDB4NzQsIDB4RjcsIDB4NzUsIDB4RjcsIDB4NzYsIDB4RjcsIDB4NzcsIC8qIDB4NzAtMHg3MyAqLworCTB4RjcsIDB4NzgsIDB4RjcsIDB4NzksIDB4RjcsIDB4N0EsIDB4RjcsIDB4N0IsIC8qIDB4NzQtMHg3NyAqLworCTB4RjcsIDB4N0MsIDB4RjcsIDB4N0QsIDB4RjcsIDB4N0UsIDB4RjcsIDB4ODAsIC8qIDB4NzgtMHg3QiAqLworCTB4RDMsIDB4RTMsIDB4RjcsIDB4ODEsIDB4RjcsIDB4ODIsIDB4RjYsIDB4Q0YsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RjcsIDB4ODMsIDB4QzIsIDB4QjMsIDB4RjYsIDB4RDAsIDB4RjcsIDB4ODQsIC8qIDB4ODAtMHg4MyAqLworCTB4RjcsIDB4ODUsIDB4RjYsIDB4RDEsIDB4RjYsIDB4RDIsIDB4RjYsIDB4RDMsIC8qIDB4ODQtMHg4NyAqLworCTB4RjYsIDB4RDQsIDB4RjcsIDB4ODYsIDB4RjcsIDB4ODcsIDB4RjYsIDB4RDYsIC8qIDB4ODgtMHg4QiAqLworCTB4RjcsIDB4ODgsIDB4QjEsIDB4QUIsIDB4RjYsIDB4RDcsIDB4RjcsIDB4ODksIC8qIDB4OEMtMHg4RiAqLworCTB4RjYsIDB4RDgsIDB4RjYsIDB4RDksIDB4RjYsIDB4REEsIDB4RjcsIDB4OEEsIC8qIDB4OTAtMHg5MyAqLworCTB4RjYsIDB4REIsIDB4RjYsIDB4REMsIDB4RjcsIDB4OEIsIDB4RjcsIDB4OEMsIC8qIDB4OTQtMHg5NyAqLworCTB4RjcsIDB4OEQsIDB4RjcsIDB4OEUsIDB4RjYsIDB4REQsIDB4RjYsIDB4REUsIC8qIDB4OTgtMHg5QiAqLworCTB4Q0YsIDB4Q0EsIDB4RjcsIDB4OEYsIDB4RjYsIDB4REYsIDB4RjYsIDB4RTAsIC8qIDB4OUMtMHg5RiAqLworCTB4RjYsIDB4RTEsIDB4RjYsIDB4RTIsIDB4RjYsIDB4RTMsIDB4RjYsIDB4RTQsIC8qIDB4QTAtMHhBMyAqLworCTB4QzAsIDB4RjAsIDB4RjYsIDB4RTUsIDB4RjYsIDB4RTYsIDB4RjYsIDB4RTcsIC8qIDB4QTQtMHhBNyAqLworCTB4RjYsIDB4RTgsIDB4RjYsIDB4RTksIDB4RjcsIDB4OTAsIDB4RjYsIDB4RUEsIC8qIDB4QTgtMHhBQiAqLworCTB4RjcsIDB4OTEsIDB4RjYsIDB4RUIsIDB4RjYsIDB4RUMsIDB4RjcsIDB4OTIsIC8qIDB4QUMtMHhBRiAqLworCTB4RjYsIDB4RUQsIDB4RjYsIDB4RUUsIDB4RjYsIDB4RUYsIDB4RjYsIDB4RjAsIC8qIDB4QjAtMHhCMyAqLworCTB4RjYsIDB4RjEsIDB4RjYsIDB4RjIsIDB4RjYsIDB4RjMsIDB4RjYsIDB4RjQsIC8qIDB4QjQtMHhCNyAqLworCTB4QkUsIDB4QTgsIDB4RjcsIDB4OTMsIDB4RjYsIDB4RjUsIDB4RjYsIDB4RjYsIC8qIDB4QjgtMHhCQiAqLworCTB4RjYsIDB4RjcsIDB4RjYsIDB4RjgsIDB4RjcsIDB4OTQsIDB4RjcsIDB4OTUsIC8qIDB4QkMtMHhCRiAqLworCTB4RjcsIDB4OTYsIDB4RjcsIDB4OTcsIDB4RjcsIDB4OTgsIDB4QzgsIDB4RkEsIC8qIDB4QzAtMHhDMyAqLworCTB4RjYsIDB4RjksIDB4RjYsIDB4RkEsIDB4RjYsIDB4RkIsIDB4RjYsIDB4RkMsIC8qIDB4QzQtMHhDNyAqLworCTB4RjcsIDB4OTksIDB4RjcsIDB4OUEsIDB4RjYsIDB4RkQsIDB4RjYsIDB4RkUsIC8qIDB4QzgtMHhDQiAqLworCTB4RjcsIDB4QTEsIDB4RjcsIDB4QTIsIDB4RjcsIDB4QTMsIDB4RjcsIDB4QTQsIC8qIDB4Q0MtMHhDRiAqLworCTB4RjcsIDB4QTUsIDB4RjcsIDB4OUIsIDB4RjcsIDB4OUMsIDB4RjcsIDB4QTYsIC8qIDB4RDAtMHhEMyAqLworCTB4RjcsIDB4QTcsIDB4RjcsIDB4QTgsIDB4QjEsIDB4RUUsIDB4RjcsIDB4QTksIC8qIDB4RDQtMHhENyAqLworCTB4RjcsIDB4QUEsIDB4RjcsIDB4QUIsIDB4RjcsIDB4OUQsIDB4RjcsIDB4OUUsIC8qIDB4RDgtMHhEQiAqLworCTB4RjcsIDB4QUMsIDB4RjcsIDB4QUQsIDB4QzEsIDB4REIsIDB4RjcsIDB4QUUsIC8qIDB4REMtMHhERiAqLworCTB4RjcsIDB4OUYsIDB4RjcsIDB4QTAsIDB4RjcsIDB4QUYsIDB4RjgsIDB4NDAsIC8qIDB4RTAtMHhFMyAqLworCTB4RjgsIDB4NDEsIDB4RjgsIDB4NDIsIDB4RjgsIDB4NDMsIDB4RjgsIDB4NDQsIC8qIDB4RTQtMHhFNyAqLworCTB4RjgsIDB4NDUsIDB4RjgsIDB4NDYsIDB4RjgsIDB4NDcsIDB4RjgsIDB4NDgsIC8qIDB4RTgtMHhFQiAqLworCTB4RjgsIDB4NDksIDB4RjgsIDB4NEEsIDB4RjgsIDB4NEIsIDB4RjgsIDB4NEMsIC8qIDB4RUMtMHhFRiAqLworCTB4RjgsIDB4NEQsIDB4RjgsIDB4NEUsIDB4RjgsIDB4NEYsIDB4RjgsIDB4NTAsIC8qIDB4RjAtMHhGMyAqLworCTB4RjgsIDB4NTEsIDB4RjgsIDB4NTIsIDB4RjgsIDB4NTMsIDB4RjgsIDB4NTQsIC8qIDB4RjQtMHhGNyAqLworCTB4RjgsIDB4NTUsIDB4RjgsIDB4NTYsIDB4RjgsIDB4NTcsIDB4RjgsIDB4NTgsIC8qIDB4RjgtMHhGQiAqLworCTB4RjgsIDB4NTksIDB4RjgsIDB4NUEsIDB4RjgsIDB4NUIsIDB4RjgsIDB4NUMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzlEWzUxMl0gPSB7CisJMHhGOCwgMHg1RCwgMHhGOCwgMHg1RSwgMHhGOCwgMHg1RiwgMHhGOCwgMHg2MCwgLyogMHgwMC0weDAzICovCisJMHhGOCwgMHg2MSwgMHhGOCwgMHg2MiwgMHhGOCwgMHg2MywgMHhGOCwgMHg2NCwgLyogMHgwNC0weDA3ICovCisJMHhGOCwgMHg2NSwgMHhGOCwgMHg2NiwgMHhGOCwgMHg2NywgMHhGOCwgMHg2OCwgLyogMHgwOC0weDBCICovCisJMHhGOCwgMHg2OSwgMHhGOCwgMHg2QSwgMHhGOCwgMHg2QiwgMHhGOCwgMHg2QywgLyogMHgwQy0weDBGICovCisJMHhGOCwgMHg2RCwgMHhGOCwgMHg2RSwgMHhGOCwgMHg2RiwgMHhGOCwgMHg3MCwgLyogMHgxMC0weDEzICovCisJMHhGOCwgMHg3MSwgMHhGOCwgMHg3MiwgMHhGOCwgMHg3MywgMHhGOCwgMHg3NCwgLyogMHgxNC0weDE3ICovCisJMHhGOCwgMHg3NSwgMHhGOCwgMHg3NiwgMHhGOCwgMHg3NywgMHhGOCwgMHg3OCwgLyogMHgxOC0weDFCICovCisJMHhGOCwgMHg3OSwgMHhGOCwgMHg3QSwgMHhGOCwgMHg3QiwgMHhGOCwgMHg3QywgLyogMHgxQy0weDFGICovCisJMHhGOCwgMHg3RCwgMHhGOCwgMHg3RSwgMHhGOCwgMHg4MCwgMHhGOCwgMHg4MSwgLyogMHgyMC0weDIzICovCisJMHhGOCwgMHg4MiwgMHhGOCwgMHg4MywgMHhGOCwgMHg4NCwgMHhGOCwgMHg4NSwgLyogMHgyNC0weDI3ICovCisJMHhGOCwgMHg4NiwgMHhGOCwgMHg4NywgMHhGOCwgMHg4OCwgMHhGOCwgMHg4OSwgLyogMHgyOC0weDJCICovCisJMHhGOCwgMHg4QSwgMHhGOCwgMHg4QiwgMHhGOCwgMHg4QywgMHhGOCwgMHg4RCwgLyogMHgyQy0weDJGICovCisJMHhGOCwgMHg4RSwgMHhGOCwgMHg4RiwgMHhGOCwgMHg5MCwgMHhGOCwgMHg5MSwgLyogMHgzMC0weDMzICovCisJMHhGOCwgMHg5MiwgMHhGOCwgMHg5MywgMHhGOCwgMHg5NCwgMHhGOCwgMHg5NSwgLyogMHgzNC0weDM3ICovCisJMHhGOCwgMHg5NiwgMHhGOCwgMHg5NywgMHhGOCwgMHg5OCwgMHhGOCwgMHg5OSwgLyogMHgzOC0weDNCICovCisJMHhGOCwgMHg5QSwgMHhGOCwgMHg5QiwgMHhGOCwgMHg5QywgMHhGOCwgMHg5RCwgLyogMHgzQy0weDNGICovCisJMHhGOCwgMHg5RSwgMHhGOCwgMHg5RiwgMHhGOCwgMHhBMCwgMHhGOSwgMHg0MCwgLyogMHg0MC0weDQzICovCisJMHhGOSwgMHg0MSwgMHhGOSwgMHg0MiwgMHhGOSwgMHg0MywgMHhGOSwgMHg0NCwgLyogMHg0NC0weDQ3ICovCisJMHhGOSwgMHg0NSwgMHhGOSwgMHg0NiwgMHhGOSwgMHg0NywgMHhGOSwgMHg0OCwgLyogMHg0OC0weDRCICovCisJMHhGOSwgMHg0OSwgMHhGOSwgMHg0QSwgMHhGOSwgMHg0QiwgMHhGOSwgMHg0QywgLyogMHg0Qy0weDRGICovCisJMHhGOSwgMHg0RCwgMHhGOSwgMHg0RSwgMHhGOSwgMHg0RiwgMHhGOSwgMHg1MCwgLyogMHg1MC0weDUzICovCisJMHhGOSwgMHg1MSwgMHhGOSwgMHg1MiwgMHhGOSwgMHg1MywgMHhGOSwgMHg1NCwgLyogMHg1NC0weDU3ICovCisJMHhGOSwgMHg1NSwgMHhGOSwgMHg1NiwgMHhGOSwgMHg1NywgMHhGOSwgMHg1OCwgLyogMHg1OC0weDVCICovCisJMHhGOSwgMHg1OSwgMHhGOSwgMHg1QSwgMHhGOSwgMHg1QiwgMHhGOSwgMHg1QywgLyogMHg1Qy0weDVGICovCisJMHhGOSwgMHg1RCwgMHhGOSwgMHg1RSwgMHhGOSwgMHg1RiwgMHhGOSwgMHg2MCwgLyogMHg2MC0weDYzICovCisJMHhGOSwgMHg2MSwgMHhGOSwgMHg2MiwgMHhGOSwgMHg2MywgMHhGOSwgMHg2NCwgLyogMHg2NC0weDY3ICovCisJMHhGOSwgMHg2NSwgMHhGOSwgMHg2NiwgMHhGOSwgMHg2NywgMHhGOSwgMHg2OCwgLyogMHg2OC0weDZCICovCisJMHhGOSwgMHg2OSwgMHhGOSwgMHg2QSwgMHhGOSwgMHg2QiwgMHhGOSwgMHg2QywgLyogMHg2Qy0weDZGICovCisJMHhGOSwgMHg2RCwgMHhGOSwgMHg2RSwgMHhGOSwgMHg2RiwgMHhGOSwgMHg3MCwgLyogMHg3MC0weDczICovCisJMHhGOSwgMHg3MSwgMHhGOSwgMHg3MiwgMHhGOSwgMHg3MywgMHhGOSwgMHg3NCwgLyogMHg3NC0weDc3ICovCisJMHhGOSwgMHg3NSwgMHhGOSwgMHg3NiwgMHhGOSwgMHg3NywgMHhGOSwgMHg3OCwgLyogMHg3OC0weDdCICovCisJMHhGOSwgMHg3OSwgMHhGOSwgMHg3QSwgMHhGOSwgMHg3QiwgMHhGOSwgMHg3QywgLyogMHg3Qy0weDdGICovCisJCisJMHhGOSwgMHg3RCwgMHhGOSwgMHg3RSwgMHhGOSwgMHg4MCwgMHhGOSwgMHg4MSwgLyogMHg4MC0weDgzICovCisJMHhGOSwgMHg4MiwgMHhGOSwgMHg4MywgMHhGOSwgMHg4NCwgMHhGOSwgMHg4NSwgLyogMHg4NC0weDg3ICovCisJMHhGOSwgMHg4NiwgMHhGOSwgMHg4NywgMHhGOSwgMHg4OCwgMHhGOSwgMHg4OSwgLyogMHg4OC0weDhCICovCisJMHhGOSwgMHg4QSwgMHhGOSwgMHg4QiwgMHhGOSwgMHg4QywgMHhGOSwgMHg4RCwgLyogMHg4Qy0weDhGICovCisJMHhGOSwgMHg4RSwgMHhGOSwgMHg4RiwgMHhGOSwgMHg5MCwgMHhGOSwgMHg5MSwgLyogMHg5MC0weDkzICovCisJMHhGOSwgMHg5MiwgMHhGOSwgMHg5MywgMHhGOSwgMHg5NCwgMHhGOSwgMHg5NSwgLyogMHg5NC0weDk3ICovCisJMHhGOSwgMHg5NiwgMHhGOSwgMHg5NywgMHhGOSwgMHg5OCwgMHhGOSwgMHg5OSwgLyogMHg5OC0weDlCICovCisJMHhGOSwgMHg5QSwgMHhGOSwgMHg5QiwgMHhGOSwgMHg5QywgMHhGOSwgMHg5RCwgLyogMHg5Qy0weDlGICovCisJMHhGOSwgMHg5RSwgMHhGOSwgMHg5RiwgMHhGOSwgMHhBMCwgMHhGQSwgMHg0MCwgLyogMHhBMC0weEEzICovCisJMHhGQSwgMHg0MSwgMHhGQSwgMHg0MiwgMHhGQSwgMHg0MywgMHhGQSwgMHg0NCwgLyogMHhBNC0weEE3ICovCisJMHhGQSwgMHg0NSwgMHhGQSwgMHg0NiwgMHhGQSwgMHg0NywgMHhGQSwgMHg0OCwgLyogMHhBOC0weEFCICovCisJMHhGQSwgMHg0OSwgMHhGQSwgMHg0QSwgMHhGQSwgMHg0QiwgMHhGQSwgMHg0QywgLyogMHhBQy0weEFGICovCisJMHhGQSwgMHg0RCwgMHhGQSwgMHg0RSwgMHhGQSwgMHg0RiwgMHhGQSwgMHg1MCwgLyogMHhCMC0weEIzICovCisJMHhGQSwgMHg1MSwgMHhGQSwgMHg1MiwgMHhGQSwgMHg1MywgMHhGQSwgMHg1NCwgLyogMHhCNC0weEI3ICovCisJMHhGQSwgMHg1NSwgMHhGQSwgMHg1NiwgMHhGQSwgMHg1NywgMHhGQSwgMHg1OCwgLyogMHhCOC0weEJCICovCisJMHhGQSwgMHg1OSwgMHhGQSwgMHg1QSwgMHhGQSwgMHg1QiwgMHhGQSwgMHg1QywgLyogMHhCQy0weEJGICovCisJMHhGQSwgMHg1RCwgMHhGQSwgMHg1RSwgMHhGQSwgMHg1RiwgMHhGQSwgMHg2MCwgLyogMHhDMC0weEMzICovCisJMHhGQSwgMHg2MSwgMHhGQSwgMHg2MiwgMHhGQSwgMHg2MywgMHhGQSwgMHg2NCwgLyogMHhDNC0weEM3ICovCisJMHhGQSwgMHg2NSwgMHhGQSwgMHg2NiwgMHhGQSwgMHg2NywgMHhGQSwgMHg2OCwgLyogMHhDOC0weENCICovCisJMHhGQSwgMHg2OSwgMHhGQSwgMHg2QSwgMHhGQSwgMHg2QiwgMHhGQSwgMHg2QywgLyogMHhDQy0weENGICovCisJMHhGQSwgMHg2RCwgMHhGQSwgMHg2RSwgMHhGQSwgMHg2RiwgMHhGQSwgMHg3MCwgLyogMHhEMC0weEQzICovCisJMHhGQSwgMHg3MSwgMHhGQSwgMHg3MiwgMHhGQSwgMHg3MywgMHhGQSwgMHg3NCwgLyogMHhENC0weEQ3ICovCisJMHhGQSwgMHg3NSwgMHhGQSwgMHg3NiwgMHhGQSwgMHg3NywgMHhGQSwgMHg3OCwgLyogMHhEOC0weERCICovCisJMHhGQSwgMHg3OSwgMHhGQSwgMHg3QSwgMHhGQSwgMHg3QiwgMHhGQSwgMHg3QywgLyogMHhEQy0weERGICovCisJMHhGQSwgMHg3RCwgMHhGQSwgMHg3RSwgMHhGQSwgMHg4MCwgMHhGQSwgMHg4MSwgLyogMHhFMC0weEUzICovCisJMHhGQSwgMHg4MiwgMHhGQSwgMHg4MywgMHhGQSwgMHg4NCwgMHhGQSwgMHg4NSwgLyogMHhFNC0weEU3ICovCisJMHhGQSwgMHg4NiwgMHhGQSwgMHg4NywgMHhGQSwgMHg4OCwgMHhGQSwgMHg4OSwgLyogMHhFOC0weEVCICovCisJMHhGQSwgMHg4QSwgMHhGQSwgMHg4QiwgMHhGQSwgMHg4QywgMHhGQSwgMHg4RCwgLyogMHhFQy0weEVGICovCisJMHhGQSwgMHg4RSwgMHhGQSwgMHg4RiwgMHhGQSwgMHg5MCwgMHhGQSwgMHg5MSwgLyogMHhGMC0weEYzICovCisJMHhGQSwgMHg5MiwgMHhGQSwgMHg5MywgMHhGQSwgMHg5NCwgMHhGQSwgMHg5NSwgLyogMHhGNC0weEY3ICovCisJMHhGQSwgMHg5NiwgMHhGQSwgMHg5NywgMHhGQSwgMHg5OCwgMHhGQSwgMHg5OSwgLyogMHhGOC0weEZCICovCisJMHhGQSwgMHg5QSwgMHhGQSwgMHg5QiwgMHhGQSwgMHg5QywgMHhGQSwgMHg5RCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOUVbNTEyXSA9IHsKKwkweEZBLCAweDlFLCAweEZBLCAweDlGLCAweEZBLCAweEEwLCAweEZCLCAweDQwLCAvKiAweDAwLTB4MDMgKi8KKwkweEZCLCAweDQxLCAweEZCLCAweDQyLCAweEZCLCAweDQzLCAweEZCLCAweDQ0LCAvKiAweDA0LTB4MDcgKi8KKwkweEZCLCAweDQ1LCAweEZCLCAweDQ2LCAweEZCLCAweDQ3LCAweEZCLCAweDQ4LCAvKiAweDA4LTB4MEIgKi8KKwkweEZCLCAweDQ5LCAweEZCLCAweDRBLCAweEZCLCAweDRCLCAweEZCLCAweDRDLCAvKiAweDBDLTB4MEYgKi8KKwkweEZCLCAweDRELCAweEZCLCAweDRFLCAweEZCLCAweDRGLCAweEZCLCAweDUwLCAvKiAweDEwLTB4MTMgKi8KKwkweEZCLCAweDUxLCAweEZCLCAweDUyLCAweEZCLCAweDUzLCAweEZCLCAweDU0LCAvKiAweDE0LTB4MTcgKi8KKwkweEZCLCAweDU1LCAweEZCLCAweDU2LCAweEZCLCAweDU3LCAweEZCLCAweDU4LCAvKiAweDE4LTB4MUIgKi8KKwkweEZCLCAweDU5LCAweEZCLCAweDVBLCAweEZCLCAweDVCLCAweEM0LCAweEYxLCAvKiAweDFDLTB4MUYgKi8KKwkweEYwLCAweEFGLCAweEJDLCAweEE2LCAweEYwLCAweEIwLCAweEMzLCAweEY5LCAvKiAweDIwLTB4MjMgKi8KKwkweEZCLCAweDVDLCAweEM1LCAweEI4LCAweEQxLCAweEJCLCAweEZCLCAweDVELCAvKiAweDI0LTB4MjcgKi8KKwkweEYwLCAweEIxLCAweEYwLCAweEIyLCAweEYwLCAweEIzLCAweEYwLCAweEI0LCAvKiAweDI4LTB4MkIgKi8KKwkweEYwLCAweEI1LCAweEQxLCAweEJDLCAweEZCLCAweDVFLCAweEQxLCAweEVDLCAvKiAweDJDLTB4MkYgKi8KKwkweEZCLCAweDVGLCAweEYwLCAweEI3LCAweEYwLCAweEI2LCAweEQ0LCAweEE3LCAvKiAweDMwLTB4MzMgKi8KKwkweEZCLCAweDYwLCAweENELCAweEQyLCAweEYwLCAweEI4LCAweEYwLCAweEJBLCAvKiAweDM0LTB4MzcgKi8KKwkweEYwLCAweEI5LCAweEYwLCAweEJCLCAweEYwLCAweEJDLCAweEZCLCAweDYxLCAvKiAweDM4LTB4M0IgKi8KKwkweEZCLCAweDYyLCAweEI4LCAweEVCLCAweEYwLCAweEJELCAweEJBLCAweEU4LCAvKiAweDNDLTB4M0YgKi8KKwkweEZCLCAweDYzLCAweEYwLCAweEJFLCAweEYwLCAweEJGLCAweEJFLCAweEU5LCAvKiAweDQwLTB4NDMgKi8KKwkweEYwLCAweEMwLCAweEI2LCAweEVDLCAweEYwLCAweEMxLCAweEYwLCAweEMyLCAvKiAweDQ0LTB4NDcgKi8KKwkweEYwLCAweEMzLCAweEYwLCAweEM0LCAweEM4LCAweEI1LCAweEYwLCAweEM1LCAvKiAweDQ4LTB4NEIgKi8KKwkweEYwLCAweEM2LCAweEZCLCAweDY0LCAweEYwLCAweEM3LCAweEM1LCAweEY0LCAvKiAweDRDLTB4NEYgKi8KKwkweEZCLCAweDY1LCAweEYwLCAweEM4LCAweEZCLCAweDY2LCAweEZCLCAweDY3LCAvKiAweDUwLTB4NTMgKi8KKwkweEZCLCAweDY4LCAweEYwLCAweEM5LCAweEZCLCAweDY5LCAweEYwLCAweENBLCAvKiAweDU0LTB4NTcgKi8KKwkweEY3LCAweEJELCAweEZCLCAweDZBLCAweEYwLCAweENCLCAweEYwLCAweENDLCAvKiAweDU4LTB4NUIgKi8KKwkweEYwLCAweENELCAweEZCLCAweDZCLCAweEYwLCAweENFLCAweEZCLCAweDZDLCAvKiAweDVDLTB4NUYgKi8KKwkweEZCLCAweDZELCAweEZCLCAweDZFLCAweEZCLCAweDZGLCAweEYwLCAweENGLCAvKiAweDYwLTB4NjMgKi8KKwkweEJBLCAweEQ3LCAweEZCLCAweDcwLCAweEYwLCAweEQwLCAweEYwLCAweEQxLCAvKiAweDY0LTB4NjcgKi8KKwkweEYwLCAweEQyLCAweEYwLCAweEQzLCAweEYwLCAweEQ0LCAweEYwLCAweEQ1LCAvKiAweDY4LTB4NkIgKi8KKwkweEYwLCAweEQ2LCAweEYwLCAweEQ4LCAweEZCLCAweDcxLCAweEZCLCAweDcyLCAvKiAweDZDLTB4NkYgKi8KKwkweEQzLCAweEE1LCAweEYwLCAweEQ3LCAweEZCLCAweDczLCAweEYwLCAweEQ5LCAvKiAweDcwLTB4NzMgKi8KKwkweEZCLCAweDc0LCAweEZCLCAweDc1LCAweEZCLCAweDc2LCAweEZCLCAweDc3LCAvKiAweDc0LTB4NzcgKi8KKwkweEZCLCAweDc4LCAweEZCLCAweDc5LCAweEZCLCAweDdBLCAweEZCLCAweDdCLCAvKiAweDc4LTB4N0IgKi8KKwkweEZCLCAweDdDLCAweEZCLCAweDdELCAweEY1LCAweEJBLCAweEMyLCAweEI5LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEZCLCAweDdFLCAweEZCLCAweDgwLCAweEY3LCAweEU0LCAweEZCLCAweDgxLCAvKiAweDgwLTB4ODMgKi8KKwkweEZCLCAweDgyLCAweEZCLCAweDgzLCAweEZCLCAweDg0LCAweEY3LCAweEU1LCAvKiAweDg0LTB4ODcgKi8KKwkweEY3LCAweEU2LCAweEZCLCAweDg1LCAweEZCLCAweDg2LCAweEY3LCAweEU3LCAvKiAweDg4LTB4OEIgKi8KKwkweEZCLCAweDg3LCAweEZCLCAweDg4LCAweEZCLCAweDg5LCAweEZCLCAweDhBLCAvKiAweDhDLTB4OEYgKi8KKwkweEZCLCAweDhCLCAweEZCLCAweDhDLCAweEY3LCAweEU4LCAweEMyLCAweEI0LCAvKiAweDkwLTB4OTMgKi8KKwkweEZCLCAweDhELCAweEZCLCAweDhFLCAweEZCLCAweDhGLCAweEZCLCAweDkwLCAvKiAweDk0LTB4OTcgKi8KKwkweEZCLCAweDkxLCAweEZCLCAweDkyLCAweEZCLCAweDkzLCAweEZCLCAweDk0LCAvKiAweDk4LTB4OUIgKi8KKwkweEZCLCAweDk1LCAweEY3LCAweEVBLCAweEZCLCAweDk2LCAweEY3LCAweEVCLCAvKiAweDlDLTB4OUYgKi8KKwkweEZCLCAweDk3LCAweEZCLCAweDk4LCAweEZCLCAweDk5LCAweEZCLCAweDlBLCAvKiAweEEwLTB4QTMgKi8KKwkweEZCLCAweDlCLCAweEZCLCAweDlDLCAweEMyLCAweEYzLCAweEZCLCAweDlELCAvKiAweEE0LTB4QTcgKi8KKwkweEZCLCAweDlFLCAweEZCLCAweDlGLCAweEZCLCAweEEwLCAweEZDLCAweDQwLCAvKiAweEE4LTB4QUIgKi8KKwkweEZDLCAweDQxLCAweEZDLCAweDQyLCAweEZDLCAweDQzLCAweEZDLCAweDQ0LCAvKiAweEFDLTB4QUYgKi8KKwkweEZDLCAweDQ1LCAweEZDLCAweDQ2LCAweEZDLCAweDQ3LCAweEZDLCAweDQ4LCAvKiAweEIwLTB4QjMgKi8KKwkweEY0LCAweEYwLCAweEZDLCAweDQ5LCAweEZDLCAweDRBLCAweEZDLCAweDRCLCAvKiAweEI0LTB4QjcgKi8KKwkweEY0LCAweEVGLCAweEZDLCAweDRDLCAweEZDLCAweDRELCAweEMyLCAweEU5LCAvKiAweEI4LTB4QkIgKi8KKwkweEZDLCAweDRFLCAweEY3LCAweEUxLCAweEY3LCAweEUyLCAweEZDLCAweDRGLCAvKiAweEJDLTB4QkYgKi8KKwkweEZDLCAweDUwLCAweEZDLCAweDUxLCAweEZDLCAweDUyLCAweEZDLCAweDUzLCAvKiAweEMwLTB4QzMgKi8KKwkweEJCLCAweEM2LCAweEZDLCAweDU0LCAweEZDLCAweDU1LCAweEZDLCAweDU2LCAvKiAweEM0LTB4QzcgKi8KKwkweEZDLCAweDU3LCAweEQ5LCAweEU0LCAweEZDLCAweDU4LCAweEZDLCAweDU5LCAvKiAweEM4LTB4Q0IgKi8KKwkweEZDLCAweDVBLCAweENBLCAweEYyLCAweEMwLCAweEU4LCAweEYwLCAweEE0LCAvKiAweENDLTB4Q0YgKi8KKwkweEZDLCAweDVCLCAweEJBLCAweERBLCAweEZDLCAweDVDLCAweEZDLCAweDVELCAvKiAweEQwLTB4RDMgKi8KKwkweEM3LCAweEFELCAweEZDLCAweDVFLCAweEZDLCAweDVGLCAweEZDLCAweDYwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEM0LCAweEFDLCAweEZDLCAweDYxLCAweEZDLCAweDYyLCAweEY3LCAweEVDLCAvKiAweEQ4LTB4REIgKi8KKwkweEY3LCAweEVELCAweEY3LCAweEVFLCAweEZDLCAweDYzLCAweEY3LCAweEYwLCAvKiAweERDLTB4REYgKi8KKwkweEY3LCAweEVGLCAweEZDLCAweDY0LCAweEY3LCAweEYxLCAweEZDLCAweDY1LCAvKiAweEUwLTB4RTMgKi8KKwkweEZDLCAweDY2LCAweEY3LCAweEY0LCAweEZDLCAweDY3LCAweEY3LCAweEYzLCAvKiAweEU0LTB4RTcgKi8KKwkweEZDLCAweDY4LCAweEY3LCAweEYyLCAweEY3LCAweEY1LCAweEZDLCAweDY5LCAvKiAweEU4LTB4RUIgKi8KKwkweEZDLCAweDZBLCAweEZDLCAweDZCLCAweEZDLCAweDZDLCAweEY3LCAweEY2LCAvKiAweEVDLTB4RUYgKi8KKwkweEZDLCAweDZELCAweEZDLCAweDZFLCAweEZDLCAweDZGLCAweEZDLCAweDcwLCAvKiAweEYwLTB4RjMgKi8KKwkweEZDLCAweDcxLCAweEZDLCAweDcyLCAweEZDLCAweDczLCAweEZDLCAweDc0LCAvKiAweEY0LTB4RjcgKi8KKwkweEZDLCAweDc1LCAweEVELCAweEU5LCAweEZDLCAweDc2LCAweEVELCAweEVBLCAvKiAweEY4LTB4RkIgKi8KKwkweEVELCAweEVCLCAweEZDLCAweDc3LCAweEY2LCAweEJDLCAweEZDLCAweDc4LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185Rls1MTJdID0geworCTB4RkMsIDB4NzksIDB4RkMsIDB4N0EsIDB4RkMsIDB4N0IsIDB4RkMsIDB4N0MsIC8qIDB4MDAtMHgwMyAqLworCTB4RkMsIDB4N0QsIDB4RkMsIDB4N0UsIDB4RkMsIDB4ODAsIDB4RkMsIDB4ODEsIC8qIDB4MDQtMHgwNyAqLworCTB4RkMsIDB4ODIsIDB4RkMsIDB4ODMsIDB4RkMsIDB4ODQsIDB4RjYsIDB4QkQsIC8qIDB4MDgtMHgwQiAqLworCTB4RkMsIDB4ODUsIDB4RjYsIDB4QkUsIDB4QjYsIDB4QTYsIDB4RkMsIDB4ODYsIC8qIDB4MEMtMHgwRiAqLworCTB4RDgsIDB4QkUsIDB4RkMsIDB4ODcsIDB4RkMsIDB4ODgsIDB4QjksIDB4QzQsIC8qIDB4MTAtMHgxMyAqLworCTB4RkMsIDB4ODksIDB4RkMsIDB4OEEsIDB4RkMsIDB4OEIsIDB4RDgsIDB4QkIsIC8qIDB4MTQtMHgxNyAqLworCTB4RkMsIDB4OEMsIDB4REMsIDB4QjEsIDB4RkMsIDB4OEQsIDB4RkMsIDB4OEUsIC8qIDB4MTgtMHgxQiAqLworCTB4RkMsIDB4OEYsIDB4RkMsIDB4OTAsIDB4RkMsIDB4OTEsIDB4RkMsIDB4OTIsIC8qIDB4MUMtMHgxRiAqLworCTB4Q0EsIDB4RjMsIDB4RkMsIDB4OTMsIDB4RjcsIDB4RjcsIDB4RkMsIDB4OTQsIC8qIDB4MjAtMHgyMyAqLworCTB4RkMsIDB4OTUsIDB4RkMsIDB4OTYsIDB4RkMsIDB4OTcsIDB4RkMsIDB4OTgsIC8qIDB4MjQtMHgyNyAqLworCTB4RkMsIDB4OTksIDB4RkMsIDB4OUEsIDB4RkMsIDB4OUIsIDB4RkMsIDB4OUMsIC8qIDB4MjgtMHgyQiAqLworCTB4RjcsIDB4RjgsIDB4RkMsIDB4OUQsIDB4RkMsIDB4OUUsIDB4RjcsIDB4RjksIC8qIDB4MkMtMHgyRiAqLworCTB4RkMsIDB4OUYsIDB4RkMsIDB4QTAsIDB4RkQsIDB4NDAsIDB4RkQsIDB4NDEsIC8qIDB4MzAtMHgzMyAqLworCTB4RkQsIDB4NDIsIDB4RkQsIDB4NDMsIDB4RkQsIDB4NDQsIDB4RjcsIDB4RkIsIC8qIDB4MzQtMHgzNyAqLworCTB4RkQsIDB4NDUsIDB4RjcsIDB4RkEsIDB4RkQsIDB4NDYsIDB4QjEsIDB4QzcsIC8qIDB4MzgtMHgzQiAqLworCTB4RkQsIDB4NDcsIDB4RjcsIDB4RkMsIDB4RjcsIDB4RkQsIDB4RkQsIDB4NDgsIC8qIDB4M0MtMHgzRiAqLworCTB4RkQsIDB4NDksIDB4RkQsIDB4NEEsIDB4RkQsIDB4NEIsIDB4RkQsIDB4NEMsIC8qIDB4NDAtMHg0MyAqLworCTB4RjcsIDB4RkUsIDB4RkQsIDB4NEQsIDB4RkQsIDB4NEUsIDB4RkQsIDB4NEYsIC8qIDB4NDQtMHg0NyAqLworCTB4RkQsIDB4NTAsIDB4RkQsIDB4NTEsIDB4RkQsIDB4NTIsIDB4RkQsIDB4NTMsIC8qIDB4NDgtMHg0QiAqLworCTB4RkQsIDB4NTQsIDB4RkQsIDB4NTUsIDB4RkQsIDB4NTYsIDB4RkQsIDB4NTcsIC8qIDB4NEMtMHg0RiAqLworCTB4QzYsIDB4RUIsIDB4RUMsIDB4QjQsIDB4RkQsIDB4NTgsIDB4RkQsIDB4NTksIC8qIDB4NTAtMHg1MyAqLworCTB4RkQsIDB4NUEsIDB4RkQsIDB4NUIsIDB4RkQsIDB4NUMsIDB4RkQsIDB4NUQsIC8qIDB4NTQtMHg1NyAqLworCTB4RkQsIDB4NUUsIDB4RkQsIDB4NUYsIDB4RkQsIDB4NjAsIDB4RkQsIDB4NjEsIC8qIDB4NTgtMHg1QiAqLworCTB4RkQsIDB4NjIsIDB4RkQsIDB4NjMsIDB4RkQsIDB4NjQsIDB4RkQsIDB4NjUsIC8qIDB4NUMtMHg1RiAqLworCTB4RkQsIDB4NjYsIDB4RkQsIDB4NjcsIDB4RkQsIDB4NjgsIDB4RkQsIDB4NjksIC8qIDB4NjAtMHg2MyAqLworCTB4RkQsIDB4NkEsIDB4RkQsIDB4NkIsIDB4RkQsIDB4NkMsIDB4RkQsIDB4NkQsIC8qIDB4NjQtMHg2NyAqLworCTB4RkQsIDB4NkUsIDB4RkQsIDB4NkYsIDB4RkQsIDB4NzAsIDB4RkQsIDB4NzEsIC8qIDB4NjgtMHg2QiAqLworCTB4RkQsIDB4NzIsIDB4RkQsIDB4NzMsIDB4RkQsIDB4NzQsIDB4RkQsIDB4NzUsIC8qIDB4NkMtMHg2RiAqLworCTB4RkQsIDB4NzYsIDB4RkQsIDB4NzcsIDB4RkQsIDB4NzgsIDB4RkQsIDB4NzksIC8qIDB4NzAtMHg3MyAqLworCTB4RkQsIDB4N0EsIDB4RkQsIDB4N0IsIDB4RkQsIDB4N0MsIDB4RkQsIDB4N0QsIC8qIDB4NzQtMHg3NyAqLworCTB4RkQsIDB4N0UsIDB4RkQsIDB4ODAsIDB4RkQsIDB4ODEsIDB4RkQsIDB4ODIsIC8qIDB4NzgtMHg3QiAqLworCTB4RkQsIDB4ODMsIDB4RkQsIDB4ODQsIDB4RkQsIDB4ODUsIDB4QjMsIDB4REQsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RjYsIDB4QjMsIDB4RkQsIDB4ODYsIDB4RkQsIDB4ODcsIDB4RjYsIDB4QjQsIC8qIDB4ODAtMHg4MyAqLworCTB4QzEsIDB4RTQsIDB4RjYsIDB4QjUsIDB4RjYsIDB4QjYsIDB4RjYsIDB4QjcsIC8qIDB4ODQtMHg4NyAqLworCTB4RjYsIDB4QjgsIDB4RjYsIDB4QjksIDB4RjYsIDB4QkEsIDB4QzgsIDB4QTMsIC8qIDB4ODgtMHg4QiAqLworCTB4RjYsIDB4QkIsIDB4RkQsIDB4ODgsIDB4RkQsIDB4ODksIDB4RkQsIDB4OEEsIC8qIDB4OEMtMHg4RiAqLworCTB4RkQsIDB4OEIsIDB4RkQsIDB4OEMsIDB4RkQsIDB4OEQsIDB4RkQsIDB4OEUsIC8qIDB4OTAtMHg5MyAqLworCTB4RkQsIDB4OEYsIDB4RkQsIDB4OTAsIDB4RkQsIDB4OTEsIDB4RkQsIDB4OTIsIC8qIDB4OTQtMHg5NyAqLworCTB4RkQsIDB4OTMsIDB4QzEsIDB4RkEsIDB4QjksIDB4QTgsIDB4RUQsIDB4RTgsIC8qIDB4OTgtMHg5QiAqLworCTB4RkQsIDB4OTQsIDB4RkQsIDB4OTUsIDB4RkQsIDB4OTYsIDB4QjksIDB4RUEsIC8qIDB4OUMtMHg5RiAqLworCTB4RDksIDB4REYsIDB4RkQsIDB4OTcsIDB4RkQsIDB4OTgsIDB4RkQsIDB4OTksIC8qIDB4QTAtMHhBMyAqLworCTB4RkQsIDB4OUEsIDB4RkQsIDB4OUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0RDWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfRjlbNTEyXSA9IHsKKwkweEQ4LCAweDRELCAweEI4LCAweEZDLCAweERDLCAweDg3LCAweEQ5LCAweDVBLCAvKiAweDAwLTB4MDMgKi8KKwkweEJCLCAweEFDLCAweEI0LCAweEFFLCAweEJFLCAweEU0LCAweEZELCAweDk0LCAvKiAweDA0LTB4MDcgKi8KKwkweEZELCAweDk0LCAweEM2LCAweEY1LCAweEJELCAweEYwLCAweEMwLCAweEFFLCAvKiAweDA4LTB4MEIgKi8KKwkweEM0LCAweENFLCAweDkxLCAweEQwLCAweEIwLCAweDVELCAweEMxLCAweDVGLCAvKiAweDBDLTB4MEYgKi8KKwkweENDLCAweDdELCAweEMyLCAweERELCAweEMyLCAweEUzLCAweERGLCAweDg5LCAvKiAweDEwLTB4MTMgKi8KKwkweDk4LCAweEI3LCAweEMyLCAweEU1LCAweEMwLCAweEQzLCAweEU3LCAweEYzLCAvKiAweDE0LTB4MTcgKi8KKwkweEMyLCAweEU0LCAweEMwLCAweEQyLCAweEYxLCAweDk4LCAweDgxLCAweDc5LCAvKiAweDE4LTB4MUIgKi8KKwkweEMyLCAweEQxLCAweDk5LCAweERBLCAweEEwLCAweDgwLCAweENDLCAweDZELCAvKiAweDFDLTB4MUYgKi8KKwkweEZCLCAweDVCLCAweDhELCAweEI5LCAweDlFLCAweDQ1LCAweENCLCAweDdCLCAvKiAweDIwLTB4MjMgKi8KKwkweEQyLCAweDY4LCAweEMwLCAweEFELCAweEM1LCAweDQ0LCAweENGLCAweDlFLCAvKiAweDI0LTB4MjcgKi8KKwkweEMwLCAweEM4LCAweEMwLCAweENBLCAweEMwLCAweENCLCAweEMwLCAweEM3LCAvKiAweDI4LTB4MkIgKi8KKwkweEZELCAweDlDLCAweDgxLCAweEVELCAweEMwLCAweEU0LCAweDg0LCAweERBLCAvKiAweDJDLTB4MkYgKi8KKwkweDkzLCAweEVGLCAweDk5LCAweEE5LCAweEEwLCAweDc0LCAweEIxLCAweDUyLCAvKiAweDMwLTB4MzMgKi8KKwkweEMwLCAweENGLCAweENDLCAweDRBLCAweENDLCAweDk0LCAweEMyLCAweEI3LCAvKiAweDM0LTB4MzcgKi8KKwkweEMyLCAweEI2LCAweEY0LCAweDk0LCAweEZBLCAweDk4LCAweEMyLCAweEI1LCAvKiAweDM4LTB4M0IgKi8KKwkweEI1LCAweDkzLCAweEJFLCAweDQ3LCAweEM3LCAweDhBLCAweEU0LCAweDlCLCAvKiAweDNDLTB4M0YgKi8KKwkweEMyLCAweEI5LCAweEQ1LCAweDkzLCAweDg5LCAweEM1LCAweEM1LCAweEFBLCAvKiAweDQwLTB4NDMgKi8KKwkweEJCLCAweDVDLCAweEMzLCAweDQwLCAweEMwLCAweENFLCAweEMwLCAweERBLCAvKiAweDQ0LTB4NDcgKi8KKwkweEQ5LCAweDU0LCAweEMwLCAweEQ3LCAweDg5LCAweEJFLCAweDhDLCAweEQyLCAvKiAweDQ4LTB4NEIgKi8KKwkweDk4LCAweEM3LCAweDlDLCAweDQ5LCAweEMyLCAweEE5LCAweEMwLCAweERCLCAvKiAweDRDLTB4NEYgKi8KKwkweEJGLCAweDdDLCAweEMyLCAweEFBLCAweEMwLCAweEQ1LCAweEMwLCAweERGLCAvKiAweDUwLTB4NTMgKi8KKwkweDg0LCAweDQzLCAweEMxLCAweEU4LCAweEI2LCAweEEwLCAweEJFLCAweDYzLCAvKiAweDU0LTB4NTcgKi8KKwkweEMxLCAweEUyLCAweEMxLCAweEVBLCAweEQ3LCAweDc4LCAweDkyLCAweDgyLCAvKiAweDU4LTB4NUIgKi8KKwkweDk4LCAweEI3LCAweEQ2LCAweDVBLCAweEI1LCAweEE0LCAweDhDLCAweDhFLCAvKiAweDVDLTB4NUYgKi8KKwkweEM1LCAweEFELCAweEMyLCAweENBLCAweEFFLCAweDkwLCAweEIxLCAweEIxLCAvKiAweDYwLTB4NjMgKi8KKwkweEI0LCAweDkxLCAweEIxLCAweEUzLCAweDhGLCAweENELCAweEIyLCAweEJCLCAvKiAweDY0LTB4NjcgKi8KKwkweEMzLCAweERBLCAweDk0LCAweEI1LCAweENCLCAweEY3LCAweDg1LCAweEEyLCAvKiAweDY4LTB4NkIgKi8KKwkweEM4LCAweEZCLCAweENBLCAweEExLCAweEM4LCAweDdFLCAweEQ1LCAweDY2LCAvKiAweDZDLTB4NkYgKi8KKwkweDlBLCAweEEyLCAweEIzLCAweEJELCAweEM5LCAweEYyLCAweENBLCAweEIwLCAvKiAweDcwLTB4NzMgKi8KKwkweEM4LCAweEY0LCAweEMyLCAweEQzLCAweEMyLCAweEQ0LCAweEMxLCAweEMxLCAvKiAweDc0LTB4NzcgKi8KKwkweDgzLCAweEM5LCAweEZELCAweDlELCAweEMxLCAweEJBLCAweEJDLCAweDVBLCAvKiAweDc4LTB4N0IgKi8KKwkweEMxLCAweEJDLCAweEQ1LCAweDhGLCAweEMxLCAweEJGLCAweDg0LCAweEVFLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDg1LCAweENFLCAweEM1LCAweEFFLCAweDhGLCAweDVELCAweEMyLCAweEMzLCAvKiAweDgwLTB4ODMgKi8KKwkweDlFLCAweDU2LCAweEI1LCAweDVBLCAweEU5LCAweDgyLCAweEYzLCAweDUwLCAvKiAweDg0LTB4ODcgKi8KKwkweEZCLCAweDkwLCAweEMwLCAweEU4LCAweEMxLCAweEE2LCAweDk1LCAweEQxLCAvKiAweDg4LTB4OEIgKi8KKwkweDlBLCAweDc2LCAweERFLCAweDVELCAweEM0LCAweEVBLCAweDkxLCAweDdBLCAvKiAweDhDLTB4OEYgKi8KKwkweDkxLCAweEQ5LCAweDkzLCAweEQzLCAweDlELCAweDY5LCAweDlGLCAweDkyLCAvKiAweDkwLTB4OTMgKi8KKwkweEFELCAweDQ5LCAweEZELCAweDlFLCAweEJFLCAweDlBLCAweEMyLCAweDkzLCAvKiAweDk0LTB4OTcgKi8KKwkweERELCAweDgyLCAweEM5LCAweDhGLCAweERGLCAweDQyLCAweEU1LCAweDgwLCAvKiAweDk4LTB4OUIgKi8KKwkweEMxLCAweEQwLCAweEMxLCAweEQzLCAweEQxLCAweENBLCAweEMxLCAweEQyLCAvKiAweDlDLTB4OUYgKi8KKwkweEMxLCAweEQxLCAweEQ1LCAweDY2LCAweEMxLCAweEFFLCAweEM0LCAweEVFLCAvKiAweEEwLTB4QTMgKi8KKwkweEM0LCAweEVELCAweDlBLCAweDlBLCAweEJBLCAweDlGLCAweEFCLCAweDQzLCAvKiAweEE0LTB4QTcgKi8KKwkweEMxLCAweEVFLCAweEUwLCAweEYyLCAweDhDLCAweDhFLCAweDhFLCAweDU4LCAvKiAweEE4LTB4QUIgKi8KKwkweEMxLCAweEFGLCAweEMxLCAweEUxLCAweEFDLCAweDkzLCAweEMxLCAweEU3LCAvKiAweEFDLTB4QUYgKi8KKwkweEYxLCAweEY2LCAweEUyLCAweDhGLCAweEMxLCAweEUzLCAweEVDLCAweDYwLCAvKiAweEIwLTB4QjMgKi8KKwkweEVFLCAweDQ5LCAweEMwLCAweEZELCAweEI2LCAweDU5LCAweEY1LCAweEI3LCAvKiAweEI0LTB4QjcgKi8KKwkweEVCLCAweDYwLCAweDkwLCAweEJBLCAweEMxLCAweENCLCAweEMxLCAweEM1LCAvKiAweEI4LTB4QkIgKi8KKwkweEU1LCAweEJDLCAweEM0LCAweEYyLCAweEMxLCAweENGLCAweDk4LCAweEI3LCAvKiAweEJDLTB4QkYgKi8KKwkweEMxLCAweEM3LCAweEFGLCAweDlGLCAweERFLCAweEE0LCAweERGLCAweDdDLCAvKiAweEMwLTB4QzMgKi8KKwkweEZELCAweDg4LCAweDk1LCAweDlFLCAweEM4LCAweEVFLCAweDg0LCAweEEyLCAvKiAweEM0LTB4QzcgKi8KKwkweDk2LCAweDgzLCAweEMxLCAweEY4LCAweEMxLCAweEY3LCAweEMxLCAweEVGLCAvKiAweEM4LTB4Q0IgKi8KKwkweEMxLCAweEYwLCAweEMxLCAweEY0LCAweEMxLCAweEYyLCAweEJDLCAweDdFLCAvKiAweENDLTB4Q0YgKi8KKwkweEVFLCAweDkwLCAweEMxLCAweEY5LCAweEMyLCAweEJFLCAweEVBLCAweDkxLCAvKiAweEQwLTB4RDMgKi8KKwkweDgyLCAweDkwLCAweDhELCAweDkxLCAweDlDLCAweDUzLCAweERELCAweDg2LCAvKiAweEQ0LTB4RDcgKi8KKwkweEMyLCAweEM5LCAweDkwLCAweEZDLCAweEMwLCAweEY1LCAweEMyLCAweENBLCAvKiAweEQ4LTB4REIgKi8KKwkweEMyLCAweEExLCAweEMwLCAweEZCLCAweEMwLCAweEY0LCAweEMyLCAweEM0LCAvKiAweERDLTB4REYgKi8KKwkweEQyLCAweEQ3LCAweEMwLCAweEVFLCAweEMwLCAweEU2LCAweEM0LCAweEUwLCAvKiAweEUwLTB4RTMgKi8KKwkweEMwLCAweEVELCAweEMxLCAweEExLCAweEVFLCAweEJFLCAweEZELCAweDlGLCAvKiAweEU0LTB4RTcgKi8KKwkweEQxLCAweDY1LCAweEMwLCAweEVGLCAweEVCLCAweDc4LCAweEM0LCAweEU0LCAvKiAweEU4LTB4RUIgKi8KKwkweEM0LCAweEU3LCAweEMxLCAweERGLCAweDlGLCAweEZCLCAweEFELCAweDU1LCAvKiAweEVDLTB4RUYgKi8KKwkweENDLCAweDQxLCAweEZELCAweEEwLCAweEY3LCAweDVCLCAweEY3LCAweEVCLCAvKiAweEYwLTB4RjMgKi8KKwkweEMxLCAweEQ2LCAweEMxLCAweERDLCAweEM1LCAweDUyLCAweEMxLCAweEEyLCAvKiAweEY0LTB4RjcgKi8KKwkweEYzLCAweEQyLCAweEMxLCAweEEzLCAweEEwLCAweEVFLCAweEQ2LCAweENCLCAvKiAweEY4LTB4RkIgKi8KKwkweEQ3LCAweDUyLCAweENBLCAweEIyLCAweEIyLCAweEU4LCAweEI0LCAweENDLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19GQVs1MTJdID0geworCTB4QzcsIDB4RDAsIDB4QjYsIDB4QzgsIDB4Q0QsIDB4RDgsIDB4Q0MsIDB4QzcsIC8qIDB4MDAtMHgwMyAqLworCTB4RDUsIDB4QUMsIDB4QjYsIDB4QjQsIDB4QjEsIDB4QTksIDB4REQsIDB4OTcsIC8qIDB4MDQtMHgwNyAqLworCTB4RDAsIDB4RDAsIDB4QkQsIDB4QjUsIDB4RDIsIDB4OEEsIDB4QzAsIDB4QUEsIC8qIDB4MDgtMHgwQiAqLworCTB4RkUsIDB4NDAsIDB4RkUsIDB4NDEsIDB4RkUsIDB4NDIsIDB4RkUsIDB4NDMsIC8qIDB4MEMtMHgwRiAqLworCTB4ODksIDB4NTYsIDB4RkUsIDB4NDQsIDB4QzcsIDB4RTcsIDB4RkUsIDB4NDUsIC8qIDB4MTAtMHgxMyAqLworCTB4RkUsIDB4NDYsIDB4ODQsIDB4NDQsIDB4RDgsIDB4NjksIDB4RDIsIDB4RTYsIC8qIDB4MTQtMHgxNyAqLworCTB4RkUsIDB4NDcsIDB4QzksIDB4RjEsIDB4Q0YsIDB4RTksIDB4QjgsIDB4QTMsIC8qIDB4MTgtMHgxQiAqLworCTB4QkUsIDB4QjgsIDB4QkUsIDB4QUIsIDB4RDMsIDB4RjAsIDB4RkUsIDB4NDgsIC8qIDB4MUMtMHgxRiAqLworCTB4RkUsIDB4NDksIDB4RkUsIDB4NEEsIDB4RDYsIDB4NTQsIDB4RkUsIDB4NEIsIC8qIDB4MjAtMHgyMyAqLworCTB4RkUsIDB4NEMsIDB4RDIsIDB4REQsIDB4QjYsIDB4QkMsIDB4RkUsIDB4NEQsIC8qIDB4MjQtMHgyNyAqLworCTB4RkUsIDB4NEUsIDB4RkUsIDB4NEYsIDB4RUYsIDB4ODgsIDB4RUYsIDB4OTUsIC8qIDB4MjgtMHgyQiAqLworCTB4RjAsIDB4NUUsIDB4RkEsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0ZFWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhBOSwgMHg1NSwgMHhBNiwgMHhGMiwgMHgwMCwgMHgwMCwgMHhBNiwgMHhGNCwgLyogMHgzMC0weDMzICovCisJMHhBNiwgMHhGNSwgMHhBNiwgMHhFMCwgMHhBNiwgMHhFMSwgMHhBNiwgMHhGMCwgLyogMHgzNC0weDM3ICovCisJMHhBNiwgMHhGMSwgMHhBNiwgMHhFMiwgMHhBNiwgMHhFMywgMHhBNiwgMHhFRSwgLyogMHgzOC0weDNCICovCisJMHhBNiwgMHhFRiwgMHhBNiwgMHhFNiwgMHhBNiwgMHhFNywgMHhBNiwgMHhFNCwgLyogMHgzQy0weDNGICovCisJMHhBNiwgMHhFNSwgMHhBNiwgMHhFOCwgMHhBNiwgMHhFOSwgMHhBNiwgMHhFQSwgLyogMHg0MC0weDQzICovCisJMHhBNiwgMHhFQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhBOSwgMHg2OCwgMHhBOSwgMHg2OSwgMHhBOSwgMHg2QSwgLyogMHg0OC0weDRCICovCisJMHhBOSwgMHg2QiwgMHhBOSwgMHg2QywgMHhBOSwgMHg2RCwgMHhBOSwgMHg2RSwgLyogMHg0Qy0weDRGICovCisJMHhBOSwgMHg2RiwgMHhBOSwgMHg3MCwgMHhBOSwgMHg3MSwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhBOSwgMHg3MiwgMHhBOSwgMHg3MywgMHhBOSwgMHg3NCwgMHhBOSwgMHg3NSwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhBOSwgMHg3NiwgMHhBOSwgMHg3NywgMHhBOSwgMHg3OCwgLyogMHg1OC0weDVCICovCisJMHhBOSwgMHg3OSwgMHhBOSwgMHg3QSwgMHhBOSwgMHg3QiwgMHhBOSwgMHg3QywgLyogMHg1Qy0weDVGICovCisJMHhBOSwgMHg3RCwgMHhBOSwgMHg3RSwgMHhBOSwgMHg4MCwgMHhBOSwgMHg4MSwgLyogMHg2MC0weDYzICovCisJMHhBOSwgMHg4MiwgMHhBOSwgMHg4MywgMHhBOSwgMHg4NCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhBOSwgMHg4NSwgMHhBOSwgMHg4NiwgMHhBOSwgMHg4NywgMHhBOSwgMHg4OCwgLyogMHg2OC0weDZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfRkZbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEEzLCAweEExLCAweEEzLCAweEEyLCAweEEzLCAweEEzLCAvKiAweDAwLTB4MDMgKi8KKwkweEExLCAweEU3LCAweEEzLCAweEE1LCAweEEzLCAweEE2LCAweEEzLCAweEE3LCAvKiAweDA0LTB4MDcgKi8KKwkweEEzLCAweEE4LCAweEEzLCAweEE5LCAweEEzLCAweEFBLCAweEEzLCAweEFCLCAvKiAweDA4LTB4MEIgKi8KKwkweEEzLCAweEFDLCAweEEzLCAweEFELCAweEEzLCAweEFFLCAweEEzLCAweEFGLCAvKiAweDBDLTB4MEYgKi8KKwkweEEzLCAweEIwLCAweEEzLCAweEIxLCAweEEzLCAweEIyLCAweEEzLCAweEIzLCAvKiAweDEwLTB4MTMgKi8KKwkweEEzLCAweEI0LCAweEEzLCAweEI1LCAweEEzLCAweEI2LCAweEEzLCAweEI3LCAvKiAweDE0LTB4MTcgKi8KKwkweEEzLCAweEI4LCAweEEzLCAweEI5LCAweEEzLCAweEJBLCAweEEzLCAweEJCLCAvKiAweDE4LTB4MUIgKi8KKwkweEEzLCAweEJDLCAweEEzLCAweEJELCAweEEzLCAweEJFLCAweEEzLCAweEJGLCAvKiAweDFDLTB4MUYgKi8KKwkweEEzLCAweEMwLCAweEEzLCAweEMxLCAweEEzLCAweEMyLCAweEEzLCAweEMzLCAvKiAweDIwLTB4MjMgKi8KKwkweEEzLCAweEM0LCAweEEzLCAweEM1LCAweEEzLCAweEM2LCAweEEzLCAweEM3LCAvKiAweDI0LTB4MjcgKi8KKwkweEEzLCAweEM4LCAweEEzLCAweEM5LCAweEEzLCAweENBLCAweEEzLCAweENCLCAvKiAweDI4LTB4MkIgKi8KKwkweEEzLCAweENDLCAweEEzLCAweENELCAweEEzLCAweENFLCAweEEzLCAweENGLCAvKiAweDJDLTB4MkYgKi8KKwkweEEzLCAweEQwLCAweEEzLCAweEQxLCAweEEzLCAweEQyLCAweEEzLCAweEQzLCAvKiAweDMwLTB4MzMgKi8KKwkweEEzLCAweEQ0LCAweEEzLCAweEQ1LCAweEEzLCAweEQ2LCAweEEzLCAweEQ3LCAvKiAweDM0LTB4MzcgKi8KKwkweEEzLCAweEQ4LCAweEEzLCAweEQ5LCAweEEzLCAweERBLCAweEEzLCAweERCLCAvKiAweDM4LTB4M0IgKi8KKwkweEEzLCAweERDLCAweEEzLCAweERELCAweEEzLCAweERFLCAweEEzLCAweERGLCAvKiAweDNDLTB4M0YgKi8KKwkweEEzLCAweEUwLCAweEEzLCAweEUxLCAweEEzLCAweEUyLCAweEEzLCAweEUzLCAvKiAweDQwLTB4NDMgKi8KKwkweEEzLCAweEU0LCAweEEzLCAweEU1LCAweEEzLCAweEU2LCAweEEzLCAweEU3LCAvKiAweDQ0LTB4NDcgKi8KKwkweEEzLCAweEU4LCAweEEzLCAweEU5LCAweEEzLCAweEVBLCAweEEzLCAweEVCLCAvKiAweDQ4LTB4NEIgKi8KKwkweEEzLCAweEVDLCAweEEzLCAweEVELCAweEEzLCAweEVFLCAweEEzLCAweEVGLCAvKiAweDRDLTB4NEYgKi8KKwkweEEzLCAweEYwLCAweEEzLCAweEYxLCAweEEzLCAweEYyLCAweEEzLCAweEYzLCAvKiAweDUwLTB4NTMgKi8KKwkweEEzLCAweEY0LCAweEEzLCAweEY1LCAweEEzLCAweEY2LCAweEEzLCAweEY3LCAvKiAweDU0LTB4NTcgKi8KKwkweEEzLCAweEY4LCAweEEzLCAweEY5LCAweEEzLCAweEZBLCAweEEzLCAweEZCLCAvKiAweDU4LTB4NUIgKi8KKwkweEEzLCAweEZDLCAweEEzLCAweEZELCAweEExLCAweEFCLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweEExLCAweEU5LCAweEExLCAweEVBLCAweEE5LCAweDU2LCAweEEzLCAweEZFLCAvKiAweEUwLTB4RTMgKi8KKwkweEE5LCAweDU3LCAweEEzLCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJTlVMTCwgICB1MmNfMDEsIHUyY18wMiwgdTJjXzAzLCB1MmNfMDQsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCXUyY18yMCwgdTJjXzIxLCB1MmNfMjIsIHUyY18yMywgdTJjXzI0LCB1MmNfMjUsIHUyY18yNiwgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJdTJjXzMwLCB1MmNfMzEsIHUyY18zMiwgdTJjXzMzLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgdTJjXzRFLCB1MmNfNEYsIAorCXUyY181MCwgdTJjXzUxLCB1MmNfNTIsIHUyY181MywgdTJjXzU0LCB1MmNfNTUsIHUyY181NiwgdTJjXzU3LCAKKwl1MmNfNTgsIHUyY181OSwgdTJjXzVBLCB1MmNfNUIsIHUyY181QywgdTJjXzVELCB1MmNfNUUsIHUyY181RiwgCisJdTJjXzYwLCB1MmNfNjEsIHUyY182MiwgdTJjXzYzLCB1MmNfNjQsIHUyY182NSwgdTJjXzY2LCB1MmNfNjcsIAorCXUyY182OCwgdTJjXzY5LCB1MmNfNkEsIHUyY182QiwgdTJjXzZDLCB1MmNfNkQsIHUyY182RSwgdTJjXzZGLCAKKwl1MmNfNzAsIHUyY183MSwgdTJjXzcyLCB1MmNfNzMsIHUyY183NCwgdTJjXzc1LCB1MmNfNzYsIHUyY183NywgCisJdTJjXzc4LCB1MmNfNzksIHUyY183QSwgdTJjXzdCLCB1MmNfN0MsIHUyY183RCwgdTJjXzdFLCB1MmNfN0YsIAorCXUyY184MCwgdTJjXzgxLCB1MmNfODIsIHUyY184MywgdTJjXzg0LCB1MmNfODUsIHUyY184NiwgdTJjXzg3LCAKKwl1MmNfODgsIHUyY184OSwgdTJjXzhBLCB1MmNfOEIsIHUyY184QywgdTJjXzhELCB1MmNfOEUsIHUyY184RiwgCisJdTJjXzkwLCB1MmNfOTEsIHUyY185MiwgdTJjXzkzLCB1MmNfOTQsIHUyY185NSwgdTJjXzk2LCB1MmNfOTcsIAorCXUyY185OCwgdTJjXzk5LCB1MmNfOUEsIHUyY185QiwgdTJjXzlDLCB1MmNfOUQsIHUyY185RSwgdTJjXzlGLCAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICB1MmNfREMsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgdTJjX0Y5LCB1MmNfRkEsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIHUyY19GRSwgdTJjX0ZGLCB9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg0MC0weDQ3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg0OC0weDRmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg1MC0weDU3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIGludCB1bmkyY2hhcihjb25zdCB3Y2hhcl90IHVuaSwKKwkJCXVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkmMHhGRjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaT4+OCkmMHhGRjsKKwlpbnQgbjsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQpIHsKKwkJaWYgKGJvdW5kbGVuIDw9IDEpCisJCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2wqMl07CisJCW91dFsxXSA9IHVuaTJjaGFyc2V0W2NsKjIrMV07CisJCWlmIChvdXRbMF0gPT0gMHgwMCAmJiBvdXRbMV0gPT0gMHgwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQluID0gMjsKKwl9IGVsc2UgaWYgKGNoPT0wICYmIGNsKSB7CisJCW91dFswXSA9IGNsOworCQluID0gMTsKKwl9CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLAorCQkJd2NoYXJfdCAqdW5pKQoreworCXVuc2lnbmVkIGNoYXIgY2gsIGNsOworCXdjaGFyX3QgKmNoYXJzZXQydW5pOworCWludCBuOworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJaWYgKGJvdW5kbGVuID09IDEpIHsKKwkJKnVuaSA9IHJhd3N0cmluZ1swXTsKKwkJcmV0dXJuIDE7CisJfQorCisJY2ggPSByYXdzdHJpbmdbMF07CisJY2wgPSByYXdzdHJpbmdbMV07CisKKwljaGFyc2V0MnVuaSA9IHBhZ2VfY2hhcnNldDJ1bmlbY2hdOworCWlmIChjaGFyc2V0MnVuaSAmJiBjbCkgeworCQkqdW5pID0gY2hhcnNldDJ1bmlbY2xdOworCQlpZiAoKnVuaSA9PSAweDAwMDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbiA9IDI7CisJfSBlbHNleworCQkqdW5pID0gY2g7CisJCW4gPSAxOworCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAiY3A5MzYiLAorCS5hbGlhcwkJPSAiZ2IyMzEyIiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2NwOTM2KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfY3A5MzYodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19jcDkzNikKK21vZHVsZV9leGl0KGV4aXRfbmxzX2NwOTM2KQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfQUxJQVNfTkxTKGdiMjMxMik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2NwOTQ5LmMgYi9mcy9ubHMvbmxzX2NwOTQ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM1MWFlMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfY3A5NDkuYwpAQCAtMCwwICsxLDEzOTQ3IEBACisvKgorICogbGludXgvZnMvbmxzX2NwOTQ5LmMKKyAqCisgKiBDaGFyc2V0IGNwOTQ5IHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIFRoaXMgdHJhbnNsYXRpb24gdGFibGUgd2FzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LCB0aGUKKyAqIG9yaWdpbmFsIHRhYmxlIGNhbiBiZSBkb3dubG9hZCBmcm9tIHRoZSBNaWNyb3NvZnQgd2Vic2l0ZS4KKyAqIChodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS91bmljb2RlL3VuaWNvZGVjcC5odG0pCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGMydV84MVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhBQzAyLDB4QUMwMywweEFDMDUsMHhBQzA2LDB4QUMwQiwweEFDMEMsMHhBQzBELC8qIDB4NDAtMHg0NyAqLworCTB4QUMwRSwweEFDMEYsMHhBQzE4LDB4QUMxRSwweEFDMUYsMHhBQzIxLDB4QUMyMiwweEFDMjMsLyogMHg0OC0weDRGICovCisJMHhBQzI1LDB4QUMyNiwweEFDMjcsMHhBQzI4LDB4QUMyOSwweEFDMkEsMHhBQzJCLDB4QUMyRSwvKiAweDUwLTB4NTcgKi8KKwkweEFDMzIsMHhBQzMzLDB4QUMzNCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEFDMzUsMHhBQzM2LDB4QUMzNywweEFDM0EsMHhBQzNCLDB4QUMzRCwweEFDM0UsLyogMHg2MC0weDY3ICovCisJMHhBQzNGLDB4QUM0MSwweEFDNDIsMHhBQzQzLDB4QUM0NCwweEFDNDUsMHhBQzQ2LDB4QUM0NywvKiAweDY4LTB4NkYgKi8KKwkweEFDNDgsMHhBQzQ5LDB4QUM0QSwweEFDNEMsMHhBQzRFLDB4QUM0RiwweEFDNTAsMHhBQzUxLC8qIDB4NzAtMHg3NyAqLworCTB4QUM1MiwweEFDNTMsMHhBQzU1LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhBQzU2LDB4QUM1NywweEFDNTksMHhBQzVBLDB4QUM1QiwweEFDNUQsMHhBQzVFLC8qIDB4ODAtMHg4NyAqLworCTB4QUM1RiwweEFDNjAsMHhBQzYxLDB4QUM2MiwweEFDNjMsMHhBQzY0LDB4QUM2NSwweEFDNjYsLyogMHg4OC0weDhGICovCisJMHhBQzY3LDB4QUM2OCwweEFDNjksMHhBQzZBLDB4QUM2QiwweEFDNkMsMHhBQzZELDB4QUM2RSwvKiAweDkwLTB4OTcgKi8KKwkweEFDNkYsMHhBQzcyLDB4QUM3MywweEFDNzUsMHhBQzc2LDB4QUM3OSwweEFDN0IsMHhBQzdDLC8qIDB4OTgtMHg5RiAqLworCTB4QUM3RCwweEFDN0UsMHhBQzdGLDB4QUM4MiwweEFDODcsMHhBQzg4LDB4QUM4RCwweEFDOEUsLyogMHhBMC0weEE3ICovCisJMHhBQzhGLDB4QUM5MSwweEFDOTIsMHhBQzkzLDB4QUM5NSwweEFDOTYsMHhBQzk3LDB4QUM5OCwvKiAweEE4LTB4QUYgKi8KKwkweEFDOTksMHhBQzlBLDB4QUM5QiwweEFDOUUsMHhBQ0EyLDB4QUNBMywweEFDQTQsMHhBQ0E1LC8qIDB4QjAtMHhCNyAqLworCTB4QUNBNiwweEFDQTcsMHhBQ0FCLDB4QUNBRCwweEFDQUUsMHhBQ0IxLDB4QUNCMiwweEFDQjMsLyogMHhCOC0weEJGICovCisJMHhBQ0I0LDB4QUNCNSwweEFDQjYsMHhBQ0I3LDB4QUNCQSwweEFDQkUsMHhBQ0JGLDB4QUNDMCwvKiAweEMwLTB4QzcgKi8KKwkweEFDQzIsMHhBQ0MzLDB4QUNDNSwweEFDQzYsMHhBQ0M3LDB4QUNDOSwweEFDQ0EsMHhBQ0NCLC8qIDB4QzgtMHhDRiAqLworCTB4QUNDRCwweEFDQ0UsMHhBQ0NGLDB4QUNEMCwweEFDRDEsMHhBQ0QyLDB4QUNEMywweEFDRDQsLyogMHhEMC0weEQ3ICovCisJMHhBQ0Q2LDB4QUNEOCwweEFDRDksMHhBQ0RBLDB4QUNEQiwweEFDREMsMHhBQ0RELDB4QUNERSwvKiAweEQ4LTB4REYgKi8KKwkweEFDREYsMHhBQ0UyLDB4QUNFMywweEFDRTUsMHhBQ0U2LDB4QUNFOSwweEFDRUIsMHhBQ0VELC8qIDB4RTAtMHhFNyAqLworCTB4QUNFRSwweEFDRjIsMHhBQ0Y0LDB4QUNGNywweEFDRjgsMHhBQ0Y5LDB4QUNGQSwweEFDRkIsLyogMHhFOC0weEVGICovCisJMHhBQ0ZFLDB4QUNGRiwweEFEMDEsMHhBRDAyLDB4QUQwMywweEFEMDUsMHhBRDA3LDB4QUQwOCwvKiAweEYwLTB4RjcgKi8KKwkweEFEMDksMHhBRDBBLDB4QUQwQiwweEFEMEUsMHhBRDEwLDB4QUQxMiwweEFEMTMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzgyWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEFEMTQsMHhBRDE1LDB4QUQxNiwweEFEMTcsMHhBRDE5LDB4QUQxQSwweEFEMUIsLyogMHg0MC0weDQ3ICovCisJMHhBRDFELDB4QUQxRSwweEFEMUYsMHhBRDIxLDB4QUQyMiwweEFEMjMsMHhBRDI0LDB4QUQyNSwvKiAweDQ4LTB4NEYgKi8KKwkweEFEMjYsMHhBRDI3LDB4QUQyOCwweEFEMkEsMHhBRDJCLDB4QUQyRSwweEFEMkYsMHhBRDMwLC8qIDB4NTAtMHg1NyAqLworCTB4QUQzMSwweEFEMzIsMHhBRDMzLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QUQzNiwweEFEMzcsMHhBRDM5LDB4QUQzQSwweEFEM0IsMHhBRDNELDB4QUQzRSwvKiAweDYwLTB4NjcgKi8KKwkweEFEM0YsMHhBRDQwLDB4QUQ0MSwweEFENDIsMHhBRDQzLDB4QUQ0NiwweEFENDgsMHhBRDRBLC8qIDB4NjgtMHg2RiAqLworCTB4QUQ0QiwweEFENEMsMHhBRDRELDB4QUQ0RSwweEFENEYsMHhBRDUxLDB4QUQ1MiwweEFENTMsLyogMHg3MC0weDc3ICovCisJMHhBRDU1LDB4QUQ1NiwweEFENTcsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEFENTksMHhBRDVBLDB4QUQ1QiwweEFENUMsMHhBRDVELDB4QUQ1RSwweEFENUYsLyogMHg4MC0weDg3ICovCisJMHhBRDYwLDB4QUQ2MiwweEFENjQsMHhBRDY1LDB4QUQ2NiwweEFENjcsMHhBRDY4LDB4QUQ2OSwvKiAweDg4LTB4OEYgKi8KKwkweEFENkEsMHhBRDZCLDB4QUQ2RSwweEFENkYsMHhBRDcxLDB4QUQ3MiwweEFENzcsMHhBRDc4LC8qIDB4OTAtMHg5NyAqLworCTB4QUQ3OSwweEFEN0EsMHhBRDdFLDB4QUQ4MCwweEFEODMsMHhBRDg0LDB4QUQ4NSwweEFEODYsLyogMHg5OC0weDlGICovCisJMHhBRDg3LDB4QUQ4QSwweEFEOEIsMHhBRDhELDB4QUQ4RSwweEFEOEYsMHhBRDkxLDB4QUQ5MiwvKiAweEEwLTB4QTcgKi8KKwkweEFEOTMsMHhBRDk0LDB4QUQ5NSwweEFEOTYsMHhBRDk3LDB4QUQ5OCwweEFEOTksMHhBRDlBLC8qIDB4QTgtMHhBRiAqLworCTB4QUQ5QiwweEFEOUUsMHhBRDlGLDB4QURBMCwweEFEQTEsMHhBREEyLDB4QURBMywweEFEQTUsLyogMHhCMC0weEI3ICovCisJMHhBREE2LDB4QURBNywweEFEQTgsMHhBREE5LDB4QURBQSwweEFEQUIsMHhBREFDLDB4QURBRCwvKiAweEI4LTB4QkYgKi8KKwkweEFEQUUsMHhBREFGLDB4QURCMCwweEFEQjEsMHhBREIyLDB4QURCMywweEFEQjQsMHhBREI1LC8qIDB4QzAtMHhDNyAqLworCTB4QURCNiwweEFEQjgsMHhBREI5LDB4QURCQSwweEFEQkIsMHhBREJDLDB4QURCRCwweEFEQkUsLyogMHhDOC0weENGICovCisJMHhBREJGLDB4QURDMiwweEFEQzMsMHhBREM1LDB4QURDNiwweEFEQzcsMHhBREM5LDB4QURDQSwvKiAweEQwLTB4RDcgKi8KKwkweEFEQ0IsMHhBRENDLDB4QURDRCwweEFEQ0UsMHhBRENGLDB4QUREMiwweEFERDQsMHhBREQ1LC8qIDB4RDgtMHhERiAqLworCTB4QURENiwweEFERDcsMHhBREQ4LDB4QUREOSwweEFEREEsMHhBRERCLDB4QURERCwweEFEREUsLyogMHhFMC0weEU3ICovCisJMHhBRERGLDB4QURFMSwweEFERTIsMHhBREUzLDB4QURFNSwweEFERTYsMHhBREU3LDB4QURFOCwvKiAweEU4LTB4RUYgKi8KKwkweEFERTksMHhBREVBLDB4QURFQiwweEFERUMsMHhBREVELDB4QURFRSwweEFERUYsMHhBREYwLC8qIDB4RjAtMHhGNyAqLworCTB4QURGMSwweEFERjIsMHhBREYzLDB4QURGNCwweEFERjUsMHhBREY2LDB4QURGNywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfODNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QURGQSwweEFERkIsMHhBREZELDB4QURGRSwweEFFMDIsMHhBRTAzLDB4QUUwNCwvKiAweDQwLTB4NDcgKi8KKwkweEFFMDUsMHhBRTA2LDB4QUUwNywweEFFMEEsMHhBRTBDLDB4QUUwRSwweEFFMEYsMHhBRTEwLC8qIDB4NDgtMHg0RiAqLworCTB4QUUxMSwweEFFMTIsMHhBRTEzLDB4QUUxNSwweEFFMTYsMHhBRTE3LDB4QUUxOCwweEFFMTksLyogMHg1MC0weDU3ICovCisJMHhBRTFBLDB4QUUxQiwweEFFMUMsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhBRTFELDB4QUUxRSwweEFFMUYsMHhBRTIwLDB4QUUyMSwweEFFMjIsMHhBRTIzLC8qIDB4NjAtMHg2NyAqLworCTB4QUUyNCwweEFFMjUsMHhBRTI2LDB4QUUyNywweEFFMjgsMHhBRTI5LDB4QUUyQSwweEFFMkIsLyogMHg2OC0weDZGICovCisJMHhBRTJDLDB4QUUyRCwweEFFMkUsMHhBRTJGLDB4QUUzMiwweEFFMzMsMHhBRTM1LDB4QUUzNiwvKiAweDcwLTB4NzcgKi8KKwkweEFFMzksMHhBRTNCLDB4QUUzQywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QUUzRCwweEFFM0UsMHhBRTNGLDB4QUU0MiwweEFFNDQsMHhBRTQ3LDB4QUU0OCwvKiAweDgwLTB4ODcgKi8KKwkweEFFNDksMHhBRTRCLDB4QUU0RiwweEFFNTEsMHhBRTUyLDB4QUU1MywweEFFNTUsMHhBRTU3LC8qIDB4ODgtMHg4RiAqLworCTB4QUU1OCwweEFFNTksMHhBRTVBLDB4QUU1QiwweEFFNUUsMHhBRTYyLDB4QUU2MywweEFFNjQsLyogMHg5MC0weDk3ICovCisJMHhBRTY2LDB4QUU2NywweEFFNkEsMHhBRTZCLDB4QUU2RCwweEFFNkUsMHhBRTZGLDB4QUU3MSwvKiAweDk4LTB4OUYgKi8KKwkweEFFNzIsMHhBRTczLDB4QUU3NCwweEFFNzUsMHhBRTc2LDB4QUU3NywweEFFN0EsMHhBRTdFLC8qIDB4QTAtMHhBNyAqLworCTB4QUU3RiwweEFFODAsMHhBRTgxLDB4QUU4MiwweEFFODMsMHhBRTg2LDB4QUU4NywweEFFODgsLyogMHhBOC0weEFGICovCisJMHhBRTg5LDB4QUU4QSwweEFFOEIsMHhBRThELDB4QUU4RSwweEFFOEYsMHhBRTkwLDB4QUU5MSwvKiAweEIwLTB4QjcgKi8KKwkweEFFOTIsMHhBRTkzLDB4QUU5NCwweEFFOTUsMHhBRTk2LDB4QUU5NywweEFFOTgsMHhBRTk5LC8qIDB4QjgtMHhCRiAqLworCTB4QUU5QSwweEFFOUIsMHhBRTlDLDB4QUU5RCwweEFFOUUsMHhBRTlGLDB4QUVBMCwweEFFQTEsLyogMHhDMC0weEM3ICovCisJMHhBRUEyLDB4QUVBMywweEFFQTQsMHhBRUE1LDB4QUVBNiwweEFFQTcsMHhBRUE4LDB4QUVBOSwvKiAweEM4LTB4Q0YgKi8KKwkweEFFQUEsMHhBRUFCLDB4QUVBQywweEFFQUQsMHhBRUFFLDB4QUVBRiwweEFFQjAsMHhBRUIxLC8qIDB4RDAtMHhENyAqLworCTB4QUVCMiwweEFFQjMsMHhBRUI0LDB4QUVCNSwweEFFQjYsMHhBRUI3LDB4QUVCOCwweEFFQjksLyogMHhEOC0weERGICovCisJMHhBRUJBLDB4QUVCQiwweEFFQkYsMHhBRUMxLDB4QUVDMiwweEFFQzMsMHhBRUM1LDB4QUVDNiwvKiAweEUwLTB4RTcgKi8KKwkweEFFQzcsMHhBRUM4LDB4QUVDOSwweEFFQ0EsMHhBRUNCLDB4QUVDRSwweEFFRDIsMHhBRUQzLC8qIDB4RTgtMHhFRiAqLworCTB4QUVENCwweEFFRDUsMHhBRUQ2LDB4QUVENywweEFFREEsMHhBRURCLDB4QUVERCwweEFFREUsLyogMHhGMC0weEY3ICovCisJMHhBRURGLDB4QUVFMCwweEFFRTEsMHhBRUUyLDB4QUVFMywweEFFRTQsMHhBRUU1LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84NFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhBRUU2LDB4QUVFNywweEFFRTksMHhBRUVBLDB4QUVFQywweEFFRUUsMHhBRUVGLC8qIDB4NDAtMHg0NyAqLworCTB4QUVGMCwweEFFRjEsMHhBRUYyLDB4QUVGMywweEFFRjUsMHhBRUY2LDB4QUVGNywweEFFRjksLyogMHg0OC0weDRGICovCisJMHhBRUZBLDB4QUVGQiwweEFFRkQsMHhBRUZFLDB4QUVGRiwweEFGMDAsMHhBRjAxLDB4QUYwMiwvKiAweDUwLTB4NTcgKi8KKwkweEFGMDMsMHhBRjA0LDB4QUYwNSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEFGMDYsMHhBRjA5LDB4QUYwQSwweEFGMEIsMHhBRjBDLDB4QUYwRSwweEFGMEYsLyogMHg2MC0weDY3ICovCisJMHhBRjExLDB4QUYxMiwweEFGMTMsMHhBRjE0LDB4QUYxNSwweEFGMTYsMHhBRjE3LDB4QUYxOCwvKiAweDY4LTB4NkYgKi8KKwkweEFGMTksMHhBRjFBLDB4QUYxQiwweEFGMUMsMHhBRjFELDB4QUYxRSwweEFGMUYsMHhBRjIwLC8qIDB4NzAtMHg3NyAqLworCTB4QUYyMSwweEFGMjIsMHhBRjIzLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhBRjI0LDB4QUYyNSwweEFGMjYsMHhBRjI3LDB4QUYyOCwweEFGMjksMHhBRjJBLC8qIDB4ODAtMHg4NyAqLworCTB4QUYyQiwweEFGMkUsMHhBRjJGLDB4QUYzMSwweEFGMzMsMHhBRjM1LDB4QUYzNiwweEFGMzcsLyogMHg4OC0weDhGICovCisJMHhBRjM4LDB4QUYzOSwweEFGM0EsMHhBRjNCLDB4QUYzRSwweEFGNDAsMHhBRjQ0LDB4QUY0NSwvKiAweDkwLTB4OTcgKi8KKwkweEFGNDYsMHhBRjQ3LDB4QUY0QSwweEFGNEIsMHhBRjRDLDB4QUY0RCwweEFGNEUsMHhBRjRGLC8qIDB4OTgtMHg5RiAqLworCTB4QUY1MSwweEFGNTIsMHhBRjUzLDB4QUY1NCwweEFGNTUsMHhBRjU2LDB4QUY1NywweEFGNTgsLyogMHhBMC0weEE3ICovCisJMHhBRjU5LDB4QUY1QSwweEFGNUIsMHhBRjVFLDB4QUY1RiwweEFGNjAsMHhBRjYxLDB4QUY2MiwvKiAweEE4LTB4QUYgKi8KKwkweEFGNjMsMHhBRjY2LDB4QUY2NywweEFGNjgsMHhBRjY5LDB4QUY2QSwweEFGNkIsMHhBRjZDLC8qIDB4QjAtMHhCNyAqLworCTB4QUY2RCwweEFGNkUsMHhBRjZGLDB4QUY3MCwweEFGNzEsMHhBRjcyLDB4QUY3MywweEFGNzQsLyogMHhCOC0weEJGICovCisJMHhBRjc1LDB4QUY3NiwweEFGNzcsMHhBRjc4LDB4QUY3QSwweEFGN0IsMHhBRjdDLDB4QUY3RCwvKiAweEMwLTB4QzcgKi8KKwkweEFGN0UsMHhBRjdGLDB4QUY4MSwweEFGODIsMHhBRjgzLDB4QUY4NSwweEFGODYsMHhBRjg3LC8qIDB4QzgtMHhDRiAqLworCTB4QUY4OSwweEFGOEEsMHhBRjhCLDB4QUY4QywweEFGOEQsMHhBRjhFLDB4QUY4RiwweEFGOTIsLyogMHhEMC0weEQ3ICovCisJMHhBRjkzLDB4QUY5NCwweEFGOTYsMHhBRjk3LDB4QUY5OCwweEFGOTksMHhBRjlBLDB4QUY5QiwvKiAweEQ4LTB4REYgKi8KKwkweEFGOUQsMHhBRjlFLDB4QUY5RiwweEFGQTAsMHhBRkExLDB4QUZBMiwweEFGQTMsMHhBRkE0LC8qIDB4RTAtMHhFNyAqLworCTB4QUZBNSwweEFGQTYsMHhBRkE3LDB4QUZBOCwweEFGQTksMHhBRkFBLDB4QUZBQiwweEFGQUMsLyogMHhFOC0weEVGICovCisJMHhBRkFELDB4QUZBRSwweEFGQUYsMHhBRkIwLDB4QUZCMSwweEFGQjIsMHhBRkIzLDB4QUZCNCwvKiAweEYwLTB4RjcgKi8KKwkweEFGQjUsMHhBRkI2LDB4QUZCNywweEFGQkEsMHhBRkJCLDB4QUZCRCwweEFGQkUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzg1WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEFGQkYsMHhBRkMxLDB4QUZDMiwweEFGQzMsMHhBRkM0LDB4QUZDNSwweEFGQzYsLyogMHg0MC0weDQ3ICovCisJMHhBRkNBLDB4QUZDQywweEFGQ0YsMHhBRkQwLDB4QUZEMSwweEFGRDIsMHhBRkQzLDB4QUZENSwvKiAweDQ4LTB4NEYgKi8KKwkweEFGRDYsMHhBRkQ3LDB4QUZEOCwweEFGRDksMHhBRkRBLDB4QUZEQiwweEFGREQsMHhBRkRFLC8qIDB4NTAtMHg1NyAqLworCTB4QUZERiwweEFGRTAsMHhBRkUxLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QUZFMiwweEFGRTMsMHhBRkU0LDB4QUZFNSwweEFGRTYsMHhBRkU3LDB4QUZFQSwvKiAweDYwLTB4NjcgKi8KKwkweEFGRUIsMHhBRkVDLDB4QUZFRCwweEFGRUUsMHhBRkVGLDB4QUZGMiwweEFGRjMsMHhBRkY1LC8qIDB4NjgtMHg2RiAqLworCTB4QUZGNiwweEFGRjcsMHhBRkY5LDB4QUZGQSwweEFGRkIsMHhBRkZDLDB4QUZGRCwweEFGRkUsLyogMHg3MC0weDc3ICovCisJMHhBRkZGLDB4QjAwMiwweEIwMDMsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEIwMDUsMHhCMDA2LDB4QjAwNywweEIwMDgsMHhCMDA5LDB4QjAwQSwweEIwMEIsLyogMHg4MC0weDg3ICovCisJMHhCMDBELDB4QjAwRSwweEIwMEYsMHhCMDExLDB4QjAxMiwweEIwMTMsMHhCMDE1LDB4QjAxNiwvKiAweDg4LTB4OEYgKi8KKwkweEIwMTcsMHhCMDE4LDB4QjAxOSwweEIwMUEsMHhCMDFCLDB4QjAxRSwweEIwMUYsMHhCMDIwLC8qIDB4OTAtMHg5NyAqLworCTB4QjAyMSwweEIwMjIsMHhCMDIzLDB4QjAyNCwweEIwMjUsMHhCMDI2LDB4QjAyNywweEIwMjksLyogMHg5OC0weDlGICovCisJMHhCMDJBLDB4QjAyQiwweEIwMkMsMHhCMDJELDB4QjAyRSwweEIwMkYsMHhCMDMwLDB4QjAzMSwvKiAweEEwLTB4QTcgKi8KKwkweEIwMzIsMHhCMDMzLDB4QjAzNCwweEIwMzUsMHhCMDM2LDB4QjAzNywweEIwMzgsMHhCMDM5LC8qIDB4QTgtMHhBRiAqLworCTB4QjAzQSwweEIwM0IsMHhCMDNDLDB4QjAzRCwweEIwM0UsMHhCMDNGLDB4QjA0MCwweEIwNDEsLyogMHhCMC0weEI3ICovCisJMHhCMDQyLDB4QjA0MywweEIwNDYsMHhCMDQ3LDB4QjA0OSwweEIwNEIsMHhCMDRELDB4QjA0RiwvKiAweEI4LTB4QkYgKi8KKwkweEIwNTAsMHhCMDUxLDB4QjA1MiwweEIwNTYsMHhCMDU4LDB4QjA1QSwweEIwNUIsMHhCMDVDLC8qIDB4QzAtMHhDNyAqLworCTB4QjA1RSwweEIwNUYsMHhCMDYwLDB4QjA2MSwweEIwNjIsMHhCMDYzLDB4QjA2NCwweEIwNjUsLyogMHhDOC0weENGICovCisJMHhCMDY2LDB4QjA2NywweEIwNjgsMHhCMDY5LDB4QjA2QSwweEIwNkIsMHhCMDZDLDB4QjA2RCwvKiAweEQwLTB4RDcgKi8KKwkweEIwNkUsMHhCMDZGLDB4QjA3MCwweEIwNzEsMHhCMDcyLDB4QjA3MywweEIwNzQsMHhCMDc1LC8qIDB4RDgtMHhERiAqLworCTB4QjA3NiwweEIwNzcsMHhCMDc4LDB4QjA3OSwweEIwN0EsMHhCMDdCLDB4QjA3RSwweEIwN0YsLyogMHhFMC0weEU3ICovCisJMHhCMDgxLDB4QjA4MiwweEIwODMsMHhCMDg1LDB4QjA4NiwweEIwODcsMHhCMDg4LDB4QjA4OSwvKiAweEU4LTB4RUYgKi8KKwkweEIwOEEsMHhCMDhCLDB4QjA4RSwweEIwOTAsMHhCMDkyLDB4QjA5MywweEIwOTQsMHhCMDk1LC8qIDB4RjAtMHhGNyAqLworCTB4QjA5NiwweEIwOTcsMHhCMDlCLDB4QjA5RCwweEIwOUUsMHhCMEEzLDB4QjBBNCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfODZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QjBBNSwweEIwQTYsMHhCMEE3LDB4QjBBQSwweEIwQjAsMHhCMEIyLDB4QjBCNiwvKiAweDQwLTB4NDcgKi8KKwkweEIwQjcsMHhCMEI5LDB4QjBCQSwweEIwQkIsMHhCMEJELDB4QjBCRSwweEIwQkYsMHhCMEMwLC8qIDB4NDgtMHg0RiAqLworCTB4QjBDMSwweEIwQzIsMHhCMEMzLDB4QjBDNiwweEIwQ0EsMHhCMENCLDB4QjBDQywweEIwQ0QsLyogMHg1MC0weDU3ICovCisJMHhCMENFLDB4QjBDRiwweEIwRDIsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhCMEQzLDB4QjBENSwweEIwRDYsMHhCMEQ3LDB4QjBEOSwweEIwREEsMHhCMERCLC8qIDB4NjAtMHg2NyAqLworCTB4QjBEQywweEIwREQsMHhCMERFLDB4QjBERiwweEIwRTEsMHhCMEUyLDB4QjBFMywweEIwRTQsLyogMHg2OC0weDZGICovCisJMHhCMEU2LDB4QjBFNywweEIwRTgsMHhCMEU5LDB4QjBFQSwweEIwRUIsMHhCMEVDLDB4QjBFRCwvKiAweDcwLTB4NzcgKi8KKwkweEIwRUUsMHhCMEVGLDB4QjBGMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QjBGMSwweEIwRjIsMHhCMEYzLDB4QjBGNCwweEIwRjUsMHhCMEY2LDB4QjBGNywvKiAweDgwLTB4ODcgKi8KKwkweEIwRjgsMHhCMEY5LDB4QjBGQSwweEIwRkIsMHhCMEZDLDB4QjBGRCwweEIwRkUsMHhCMEZGLC8qIDB4ODgtMHg4RiAqLworCTB4QjEwMCwweEIxMDEsMHhCMTAyLDB4QjEwMywweEIxMDQsMHhCMTA1LDB4QjEwNiwweEIxMDcsLyogMHg5MC0weDk3ICovCisJMHhCMTBBLDB4QjEwRCwweEIxMEUsMHhCMTBGLDB4QjExMSwweEIxMTQsMHhCMTE1LDB4QjExNiwvKiAweDk4LTB4OUYgKi8KKwkweEIxMTcsMHhCMTFBLDB4QjExRSwweEIxMUYsMHhCMTIwLDB4QjEyMSwweEIxMjIsMHhCMTI2LC8qIDB4QTAtMHhBNyAqLworCTB4QjEyNywweEIxMjksMHhCMTJBLDB4QjEyQiwweEIxMkQsMHhCMTJFLDB4QjEyRiwweEIxMzAsLyogMHhBOC0weEFGICovCisJMHhCMTMxLDB4QjEzMiwweEIxMzMsMHhCMTM2LDB4QjEzQSwweEIxM0IsMHhCMTNDLDB4QjEzRCwvKiAweEIwLTB4QjcgKi8KKwkweEIxM0UsMHhCMTNGLDB4QjE0MiwweEIxNDMsMHhCMTQ1LDB4QjE0NiwweEIxNDcsMHhCMTQ5LC8qIDB4QjgtMHhCRiAqLworCTB4QjE0QSwweEIxNEIsMHhCMTRDLDB4QjE0RCwweEIxNEUsMHhCMTRGLDB4QjE1MiwweEIxNTMsLyogMHhDMC0weEM3ICovCisJMHhCMTU2LDB4QjE1NywweEIxNTksMHhCMTVBLDB4QjE1QiwweEIxNUQsMHhCMTVFLDB4QjE1RiwvKiAweEM4LTB4Q0YgKi8KKwkweEIxNjEsMHhCMTYyLDB4QjE2MywweEIxNjQsMHhCMTY1LDB4QjE2NiwweEIxNjcsMHhCMTY4LC8qIDB4RDAtMHhENyAqLworCTB4QjE2OSwweEIxNkEsMHhCMTZCLDB4QjE2QywweEIxNkQsMHhCMTZFLDB4QjE2RiwweEIxNzAsLyogMHhEOC0weERGICovCisJMHhCMTcxLDB4QjE3MiwweEIxNzMsMHhCMTc0LDB4QjE3NSwweEIxNzYsMHhCMTc3LDB4QjE3QSwvKiAweEUwLTB4RTcgKi8KKwkweEIxN0IsMHhCMTdELDB4QjE3RSwweEIxN0YsMHhCMTgxLDB4QjE4MywweEIxODQsMHhCMTg1LC8qIDB4RTgtMHhFRiAqLworCTB4QjE4NiwweEIxODcsMHhCMThBLDB4QjE4QywweEIxOEUsMHhCMThGLDB4QjE5MCwweEIxOTEsLyogMHhGMC0weEY3ICovCisJMHhCMTk1LDB4QjE5NiwweEIxOTcsMHhCMTk5LDB4QjE5QSwweEIxOUIsMHhCMTlELDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84N1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhCMTlFLDB4QjE5RiwweEIxQTAsMHhCMUExLDB4QjFBMiwweEIxQTMsMHhCMUE0LC8qIDB4NDAtMHg0NyAqLworCTB4QjFBNSwweEIxQTYsMHhCMUE3LDB4QjFBOSwweEIxQUEsMHhCMUFCLDB4QjFBQywweEIxQUQsLyogMHg0OC0weDRGICovCisJMHhCMUFFLDB4QjFBRiwweEIxQjAsMHhCMUIxLDB4QjFCMiwweEIxQjMsMHhCMUI0LDB4QjFCNSwvKiAweDUwLTB4NTcgKi8KKwkweEIxQjYsMHhCMUI3LDB4QjFCOCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEIxQjksMHhCMUJBLDB4QjFCQiwweEIxQkMsMHhCMUJELDB4QjFCRSwweEIxQkYsLyogMHg2MC0weDY3ICovCisJMHhCMUMwLDB4QjFDMSwweEIxQzIsMHhCMUMzLDB4QjFDNCwweEIxQzUsMHhCMUM2LDB4QjFDNywvKiAweDY4LTB4NkYgKi8KKwkweEIxQzgsMHhCMUM5LDB4QjFDQSwweEIxQ0IsMHhCMUNELDB4QjFDRSwweEIxQ0YsMHhCMUQxLC8qIDB4NzAtMHg3NyAqLworCTB4QjFEMiwweEIxRDMsMHhCMUQ1LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhCMUQ2LDB4QjFENywweEIxRDgsMHhCMUQ5LDB4QjFEQSwweEIxREIsMHhCMURFLC8qIDB4ODAtMHg4NyAqLworCTB4QjFFMCwweEIxRTEsMHhCMUUyLDB4QjFFMywweEIxRTQsMHhCMUU1LDB4QjFFNiwweEIxRTcsLyogMHg4OC0weDhGICovCisJMHhCMUVBLDB4QjFFQiwweEIxRUQsMHhCMUVFLDB4QjFFRiwweEIxRjEsMHhCMUYyLDB4QjFGMywvKiAweDkwLTB4OTcgKi8KKwkweEIxRjQsMHhCMUY1LDB4QjFGNiwweEIxRjcsMHhCMUY4LDB4QjFGQSwweEIxRkMsMHhCMUZFLC8qIDB4OTgtMHg5RiAqLworCTB4QjFGRiwweEIyMDAsMHhCMjAxLDB4QjIwMiwweEIyMDMsMHhCMjA2LDB4QjIwNywweEIyMDksLyogMHhBMC0weEE3ICovCisJMHhCMjBBLDB4QjIwRCwweEIyMEUsMHhCMjBGLDB4QjIxMCwweEIyMTEsMHhCMjEyLDB4QjIxMywvKiAweEE4LTB4QUYgKi8KKwkweEIyMTYsMHhCMjE4LDB4QjIxQSwweEIyMUIsMHhCMjFDLDB4QjIxRCwweEIyMUUsMHhCMjFGLC8qIDB4QjAtMHhCNyAqLworCTB4QjIyMSwweEIyMjIsMHhCMjIzLDB4QjIyNCwweEIyMjUsMHhCMjI2LDB4QjIyNywweEIyMjgsLyogMHhCOC0weEJGICovCisJMHhCMjI5LDB4QjIyQSwweEIyMkIsMHhCMjJDLDB4QjIyRCwweEIyMkUsMHhCMjJGLDB4QjIzMCwvKiAweEMwLTB4QzcgKi8KKwkweEIyMzEsMHhCMjMyLDB4QjIzMywweEIyMzUsMHhCMjM2LDB4QjIzNywweEIyMzgsMHhCMjM5LC8qIDB4QzgtMHhDRiAqLworCTB4QjIzQSwweEIyM0IsMHhCMjNELDB4QjIzRSwweEIyM0YsMHhCMjQwLDB4QjI0MSwweEIyNDIsLyogMHhEMC0weEQ3ICovCisJMHhCMjQzLDB4QjI0NCwweEIyNDUsMHhCMjQ2LDB4QjI0NywweEIyNDgsMHhCMjQ5LDB4QjI0QSwvKiAweEQ4LTB4REYgKi8KKwkweEIyNEIsMHhCMjRDLDB4QjI0RCwweEIyNEUsMHhCMjRGLDB4QjI1MCwweEIyNTEsMHhCMjUyLC8qIDB4RTAtMHhFNyAqLworCTB4QjI1MywweEIyNTQsMHhCMjU1LDB4QjI1NiwweEIyNTcsMHhCMjU5LDB4QjI1QSwweEIyNUIsLyogMHhFOC0weEVGICovCisJMHhCMjVELDB4QjI1RSwweEIyNUYsMHhCMjYxLDB4QjI2MiwweEIyNjMsMHhCMjY0LDB4QjI2NSwvKiAweEYwLTB4RjcgKi8KKwkweEIyNjYsMHhCMjY3LDB4QjI2QSwweEIyNkIsMHhCMjZDLDB4QjI2RCwweEIyNkUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzg4WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEIyNkYsMHhCMjcwLDB4QjI3MSwweEIyNzIsMHhCMjczLDB4QjI3NiwweEIyNzcsLyogMHg0MC0weDQ3ICovCisJMHhCMjc4LDB4QjI3OSwweEIyN0EsMHhCMjdCLDB4QjI3RCwweEIyN0UsMHhCMjdGLDB4QjI4MCwvKiAweDQ4LTB4NEYgKi8KKwkweEIyODEsMHhCMjgyLDB4QjI4MywweEIyODYsMHhCMjg3LDB4QjI4OCwweEIyOEEsMHhCMjhCLC8qIDB4NTAtMHg1NyAqLworCTB4QjI4QywweEIyOEQsMHhCMjhFLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QjI4RiwweEIyOTIsMHhCMjkzLDB4QjI5NSwweEIyOTYsMHhCMjk3LDB4QjI5QiwvKiAweDYwLTB4NjcgKi8KKwkweEIyOUMsMHhCMjlELDB4QjI5RSwweEIyOUYsMHhCMkEyLDB4QjJBNCwweEIyQTcsMHhCMkE4LC8qIDB4NjgtMHg2RiAqLworCTB4QjJBOSwweEIyQUIsMHhCMkFELDB4QjJBRSwweEIyQUYsMHhCMkIxLDB4QjJCMiwweEIyQjMsLyogMHg3MC0weDc3ICovCisJMHhCMkI1LDB4QjJCNiwweEIyQjcsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEIyQjgsMHhCMkI5LDB4QjJCQSwweEIyQkIsMHhCMkJDLDB4QjJCRCwweEIyQkUsLyogMHg4MC0weDg3ICovCisJMHhCMkJGLDB4QjJDMCwweEIyQzEsMHhCMkMyLDB4QjJDMywweEIyQzQsMHhCMkM1LDB4QjJDNiwvKiAweDg4LTB4OEYgKi8KKwkweEIyQzcsMHhCMkNBLDB4QjJDQiwweEIyQ0QsMHhCMkNFLDB4QjJDRiwweEIyRDEsMHhCMkQzLC8qIDB4OTAtMHg5NyAqLworCTB4QjJENCwweEIyRDUsMHhCMkQ2LDB4QjJENywweEIyREEsMHhCMkRDLDB4QjJERSwweEIyREYsLyogMHg5OC0weDlGICovCisJMHhCMkUwLDB4QjJFMSwweEIyRTMsMHhCMkU3LDB4QjJFOSwweEIyRUEsMHhCMkYwLDB4QjJGMSwvKiAweEEwLTB4QTcgKi8KKwkweEIyRjIsMHhCMkY2LDB4QjJGQywweEIyRkQsMHhCMkZFLDB4QjMwMiwweEIzMDMsMHhCMzA1LC8qIDB4QTgtMHhBRiAqLworCTB4QjMwNiwweEIzMDcsMHhCMzA5LDB4QjMwQSwweEIzMEIsMHhCMzBDLDB4QjMwRCwweEIzMEUsLyogMHhCMC0weEI3ICovCisJMHhCMzBGLDB4QjMxMiwweEIzMTYsMHhCMzE3LDB4QjMxOCwweEIzMTksMHhCMzFBLDB4QjMxQiwvKiAweEI4LTB4QkYgKi8KKwkweEIzMUQsMHhCMzFFLDB4QjMxRiwweEIzMjAsMHhCMzIxLDB4QjMyMiwweEIzMjMsMHhCMzI0LC8qIDB4QzAtMHhDNyAqLworCTB4QjMyNSwweEIzMjYsMHhCMzI3LDB4QjMyOCwweEIzMjksMHhCMzJBLDB4QjMyQiwweEIzMkMsLyogMHhDOC0weENGICovCisJMHhCMzJELDB4QjMyRSwweEIzMkYsMHhCMzMwLDB4QjMzMSwweEIzMzIsMHhCMzMzLDB4QjMzNCwvKiAweEQwLTB4RDcgKi8KKwkweEIzMzUsMHhCMzM2LDB4QjMzNywweEIzMzgsMHhCMzM5LDB4QjMzQSwweEIzM0IsMHhCMzNDLC8qIDB4RDgtMHhERiAqLworCTB4QjMzRCwweEIzM0UsMHhCMzNGLDB4QjM0MCwweEIzNDEsMHhCMzQyLDB4QjM0MywweEIzNDQsLyogMHhFMC0weEU3ICovCisJMHhCMzQ1LDB4QjM0NiwweEIzNDcsMHhCMzQ4LDB4QjM0OSwweEIzNEEsMHhCMzRCLDB4QjM0QywvKiAweEU4LTB4RUYgKi8KKwkweEIzNEQsMHhCMzRFLDB4QjM0RiwweEIzNTAsMHhCMzUxLDB4QjM1MiwweEIzNTMsMHhCMzU3LC8qIDB4RjAtMHhGNyAqLworCTB4QjM1OSwweEIzNUEsMHhCMzVELDB4QjM2MCwweEIzNjEsMHhCMzYyLDB4QjM2MywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfODlbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QjM2NiwweEIzNjgsMHhCMzZBLDB4QjM2QywweEIzNkQsMHhCMzZGLDB4QjM3MiwvKiAweDQwLTB4NDcgKi8KKwkweEIzNzMsMHhCMzc1LDB4QjM3NiwweEIzNzcsMHhCMzc5LDB4QjM3QSwweEIzN0IsMHhCMzdDLC8qIDB4NDgtMHg0RiAqLworCTB4QjM3RCwweEIzN0UsMHhCMzdGLDB4QjM4MiwweEIzODYsMHhCMzg3LDB4QjM4OCwweEIzODksLyogMHg1MC0weDU3ICovCisJMHhCMzhBLDB4QjM4QiwweEIzOEQsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhCMzhFLDB4QjM4RiwweEIzOTEsMHhCMzkyLDB4QjM5MywweEIzOTUsMHhCMzk2LC8qIDB4NjAtMHg2NyAqLworCTB4QjM5NywweEIzOTgsMHhCMzk5LDB4QjM5QSwweEIzOUIsMHhCMzlDLDB4QjM5RCwweEIzOUUsLyogMHg2OC0weDZGICovCisJMHhCMzlGLDB4QjNBMiwweEIzQTMsMHhCM0E0LDB4QjNBNSwweEIzQTYsMHhCM0E3LDB4QjNBOSwvKiAweDcwLTB4NzcgKi8KKwkweEIzQUEsMHhCM0FCLDB4QjNBRCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QjNBRSwweEIzQUYsMHhCM0IwLDB4QjNCMSwweEIzQjIsMHhCM0IzLDB4QjNCNCwvKiAweDgwLTB4ODcgKi8KKwkweEIzQjUsMHhCM0I2LDB4QjNCNywweEIzQjgsMHhCM0I5LDB4QjNCQSwweEIzQkIsMHhCM0JDLC8qIDB4ODgtMHg4RiAqLworCTB4QjNCRCwweEIzQkUsMHhCM0JGLDB4QjNDMCwweEIzQzEsMHhCM0MyLDB4QjNDMywweEIzQzYsLyogMHg5MC0weDk3ICovCisJMHhCM0M3LDB4QjNDOSwweEIzQ0EsMHhCM0NELDB4QjNDRiwweEIzRDEsMHhCM0QyLDB4QjNEMywvKiAweDk4LTB4OUYgKi8KKwkweEIzRDYsMHhCM0Q4LDB4QjNEQSwweEIzREMsMHhCM0RFLDB4QjNERiwweEIzRTEsMHhCM0UyLC8qIDB4QTAtMHhBNyAqLworCTB4QjNFMywweEIzRTUsMHhCM0U2LDB4QjNFNywweEIzRTksMHhCM0VBLDB4QjNFQiwweEIzRUMsLyogMHhBOC0weEFGICovCisJMHhCM0VELDB4QjNFRSwweEIzRUYsMHhCM0YwLDB4QjNGMSwweEIzRjIsMHhCM0YzLDB4QjNGNCwvKiAweEIwLTB4QjcgKi8KKwkweEIzRjUsMHhCM0Y2LDB4QjNGNywweEIzRjgsMHhCM0Y5LDB4QjNGQSwweEIzRkIsMHhCM0ZELC8qIDB4QjgtMHhCRiAqLworCTB4QjNGRSwweEIzRkYsMHhCNDAwLDB4QjQwMSwweEI0MDIsMHhCNDAzLDB4QjQwNCwweEI0MDUsLyogMHhDMC0weEM3ICovCisJMHhCNDA2LDB4QjQwNywweEI0MDgsMHhCNDA5LDB4QjQwQSwweEI0MEIsMHhCNDBDLDB4QjQwRCwvKiAweEM4LTB4Q0YgKi8KKwkweEI0MEUsMHhCNDBGLDB4QjQxMSwweEI0MTIsMHhCNDEzLDB4QjQxNCwweEI0MTUsMHhCNDE2LC8qIDB4RDAtMHhENyAqLworCTB4QjQxNywweEI0MTksMHhCNDFBLDB4QjQxQiwweEI0MUQsMHhCNDFFLDB4QjQxRiwweEI0MjEsLyogMHhEOC0weERGICovCisJMHhCNDIyLDB4QjQyMywweEI0MjQsMHhCNDI1LDB4QjQyNiwweEI0MjcsMHhCNDJBLDB4QjQyQywvKiAweEUwLTB4RTcgKi8KKwkweEI0MkQsMHhCNDJFLDB4QjQyRiwweEI0MzAsMHhCNDMxLDB4QjQzMiwweEI0MzMsMHhCNDM1LC8qIDB4RTgtMHhFRiAqLworCTB4QjQzNiwweEI0MzcsMHhCNDM4LDB4QjQzOSwweEI0M0EsMHhCNDNCLDB4QjQzQywweEI0M0QsLyogMHhGMC0weEY3ICovCisJMHhCNDNFLDB4QjQzRiwweEI0NDAsMHhCNDQxLDB4QjQ0MiwweEI0NDMsMHhCNDQ0LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84QVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhCNDQ1LDB4QjQ0NiwweEI0NDcsMHhCNDQ4LDB4QjQ0OSwweEI0NEEsMHhCNDRCLC8qIDB4NDAtMHg0NyAqLworCTB4QjQ0QywweEI0NEQsMHhCNDRFLDB4QjQ0RiwweEI0NTIsMHhCNDUzLDB4QjQ1NSwweEI0NTYsLyogMHg0OC0weDRGICovCisJMHhCNDU3LDB4QjQ1OSwweEI0NUEsMHhCNDVCLDB4QjQ1QywweEI0NUQsMHhCNDVFLDB4QjQ1RiwvKiAweDUwLTB4NTcgKi8KKwkweEI0NjIsMHhCNDY0LDB4QjQ2NiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEI0NjcsMHhCNDY4LDB4QjQ2OSwweEI0NkEsMHhCNDZCLDB4QjQ2RCwweEI0NkUsLyogMHg2MC0weDY3ICovCisJMHhCNDZGLDB4QjQ3MCwweEI0NzEsMHhCNDcyLDB4QjQ3MywweEI0NzQsMHhCNDc1LDB4QjQ3NiwvKiAweDY4LTB4NkYgKi8KKwkweEI0NzcsMHhCNDc4LDB4QjQ3OSwweEI0N0EsMHhCNDdCLDB4QjQ3QywweEI0N0QsMHhCNDdFLC8qIDB4NzAtMHg3NyAqLworCTB4QjQ3RiwweEI0ODEsMHhCNDgyLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhCNDgzLDB4QjQ4NCwweEI0ODUsMHhCNDg2LDB4QjQ4NywweEI0ODksMHhCNDhBLC8qIDB4ODAtMHg4NyAqLworCTB4QjQ4QiwweEI0OEMsMHhCNDhELDB4QjQ4RSwweEI0OEYsMHhCNDkwLDB4QjQ5MSwweEI0OTIsLyogMHg4OC0weDhGICovCisJMHhCNDkzLDB4QjQ5NCwweEI0OTUsMHhCNDk2LDB4QjQ5NywweEI0OTgsMHhCNDk5LDB4QjQ5QSwvKiAweDkwLTB4OTcgKi8KKwkweEI0OUIsMHhCNDlDLDB4QjQ5RSwweEI0OUYsMHhCNEEwLDB4QjRBMSwweEI0QTIsMHhCNEEzLC8qIDB4OTgtMHg5RiAqLworCTB4QjRBNSwweEI0QTYsMHhCNEE3LDB4QjRBOSwweEI0QUEsMHhCNEFCLDB4QjRBRCwweEI0QUUsLyogMHhBMC0weEE3ICovCisJMHhCNEFGLDB4QjRCMCwweEI0QjEsMHhCNEIyLDB4QjRCMywweEI0QjQsMHhCNEI2LDB4QjRCOCwvKiAweEE4LTB4QUYgKi8KKwkweEI0QkEsMHhCNEJCLDB4QjRCQywweEI0QkQsMHhCNEJFLDB4QjRCRiwweEI0QzEsMHhCNEMyLC8qIDB4QjAtMHhCNyAqLworCTB4QjRDMywweEI0QzUsMHhCNEM2LDB4QjRDNywweEI0QzksMHhCNENBLDB4QjRDQiwweEI0Q0MsLyogMHhCOC0weEJGICovCisJMHhCNENELDB4QjRDRSwweEI0Q0YsMHhCNEQxLDB4QjREMiwweEI0RDMsMHhCNEQ0LDB4QjRENiwvKiAweEMwLTB4QzcgKi8KKwkweEI0RDcsMHhCNEQ4LDB4QjREOSwweEI0REEsMHhCNERCLDB4QjRERSwweEI0REYsMHhCNEUxLC8qIDB4QzgtMHhDRiAqLworCTB4QjRFMiwweEI0RTUsMHhCNEU3LDB4QjRFOCwweEI0RTksMHhCNEVBLDB4QjRFQiwweEI0RUUsLyogMHhEMC0weEQ3ICovCisJMHhCNEYwLDB4QjRGMiwweEI0RjMsMHhCNEY0LDB4QjRGNSwweEI0RjYsMHhCNEY3LDB4QjRGOSwvKiAweEQ4LTB4REYgKi8KKwkweEI0RkEsMHhCNEZCLDB4QjRGQywweEI0RkQsMHhCNEZFLDB4QjRGRiwweEI1MDAsMHhCNTAxLC8qIDB4RTAtMHhFNyAqLworCTB4QjUwMiwweEI1MDMsMHhCNTA0LDB4QjUwNSwweEI1MDYsMHhCNTA3LDB4QjUwOCwweEI1MDksLyogMHhFOC0weEVGICovCisJMHhCNTBBLDB4QjUwQiwweEI1MEMsMHhCNTBELDB4QjUwRSwweEI1MEYsMHhCNTEwLDB4QjUxMSwvKiAweEYwLTB4RjcgKi8KKwkweEI1MTIsMHhCNTEzLDB4QjUxNiwweEI1MTcsMHhCNTE5LDB4QjUxQSwweEI1MUQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzhCWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEI1MUUsMHhCNTFGLDB4QjUyMCwweEI1MjEsMHhCNTIyLDB4QjUyMywweEI1MjYsLyogMHg0MC0weDQ3ICovCisJMHhCNTJCLDB4QjUyQywweEI1MkQsMHhCNTJFLDB4QjUyRiwweEI1MzIsMHhCNTMzLDB4QjUzNSwvKiAweDQ4LTB4NEYgKi8KKwkweEI1MzYsMHhCNTM3LDB4QjUzOSwweEI1M0EsMHhCNTNCLDB4QjUzQywweEI1M0QsMHhCNTNFLC8qIDB4NTAtMHg1NyAqLworCTB4QjUzRiwweEI1NDIsMHhCNTQ2LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QjU0NywweEI1NDgsMHhCNTQ5LDB4QjU0QSwweEI1NEUsMHhCNTRGLDB4QjU1MSwvKiAweDYwLTB4NjcgKi8KKwkweEI1NTIsMHhCNTUzLDB4QjU1NSwweEI1NTYsMHhCNTU3LDB4QjU1OCwweEI1NTksMHhCNTVBLC8qIDB4NjgtMHg2RiAqLworCTB4QjU1QiwweEI1NUUsMHhCNTYyLDB4QjU2MywweEI1NjQsMHhCNTY1LDB4QjU2NiwweEI1NjcsLyogMHg3MC0weDc3ICovCisJMHhCNTY4LDB4QjU2OSwweEI1NkEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEI1NkIsMHhCNTZDLDB4QjU2RCwweEI1NkUsMHhCNTZGLDB4QjU3MCwweEI1NzEsLyogMHg4MC0weDg3ICovCisJMHhCNTcyLDB4QjU3MywweEI1NzQsMHhCNTc1LDB4QjU3NiwweEI1NzcsMHhCNTc4LDB4QjU3OSwvKiAweDg4LTB4OEYgKi8KKwkweEI1N0EsMHhCNTdCLDB4QjU3QywweEI1N0QsMHhCNTdFLDB4QjU3RiwweEI1ODAsMHhCNTgxLC8qIDB4OTAtMHg5NyAqLworCTB4QjU4MiwweEI1ODMsMHhCNTg0LDB4QjU4NSwweEI1ODYsMHhCNTg3LDB4QjU4OCwweEI1ODksLyogMHg5OC0weDlGICovCisJMHhCNThBLDB4QjU4QiwweEI1OEMsMHhCNThELDB4QjU4RSwweEI1OEYsMHhCNTkwLDB4QjU5MSwvKiAweEEwLTB4QTcgKi8KKwkweEI1OTIsMHhCNTkzLDB4QjU5NCwweEI1OTUsMHhCNTk2LDB4QjU5NywweEI1OTgsMHhCNTk5LC8qIDB4QTgtMHhBRiAqLworCTB4QjU5QSwweEI1OUIsMHhCNTlDLDB4QjU5RCwweEI1OUUsMHhCNTlGLDB4QjVBMiwweEI1QTMsLyogMHhCMC0weEI3ICovCisJMHhCNUE1LDB4QjVBNiwweEI1QTcsMHhCNUE5LDB4QjVBQywweEI1QUQsMHhCNUFFLDB4QjVBRiwvKiAweEI4LTB4QkYgKi8KKwkweEI1QjIsMHhCNUI2LDB4QjVCNywweEI1QjgsMHhCNUI5LDB4QjVCQSwweEI1QkUsMHhCNUJGLC8qIDB4QzAtMHhDNyAqLworCTB4QjVDMSwweEI1QzIsMHhCNUMzLDB4QjVDNSwweEI1QzYsMHhCNUM3LDB4QjVDOCwweEI1QzksLyogMHhDOC0weENGICovCisJMHhCNUNBLDB4QjVDQiwweEI1Q0UsMHhCNUQyLDB4QjVEMywweEI1RDQsMHhCNUQ1LDB4QjVENiwvKiAweEQwLTB4RDcgKi8KKwkweEI1RDcsMHhCNUQ5LDB4QjVEQSwweEI1REIsMHhCNURDLDB4QjVERCwweEI1REUsMHhCNURGLC8qIDB4RDgtMHhERiAqLworCTB4QjVFMCwweEI1RTEsMHhCNUUyLDB4QjVFMywweEI1RTQsMHhCNUU1LDB4QjVFNiwweEI1RTcsLyogMHhFMC0weEU3ICovCisJMHhCNUU4LDB4QjVFOSwweEI1RUEsMHhCNUVCLDB4QjVFRCwweEI1RUUsMHhCNUVGLDB4QjVGMCwvKiAweEU4LTB4RUYgKi8KKwkweEI1RjEsMHhCNUYyLDB4QjVGMywweEI1RjQsMHhCNUY1LDB4QjVGNiwweEI1RjcsMHhCNUY4LC8qIDB4RjAtMHhGNyAqLworCTB4QjVGOSwweEI1RkEsMHhCNUZCLDB4QjVGQywweEI1RkQsMHhCNUZFLDB4QjVGRiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOENbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QjYwMCwweEI2MDEsMHhCNjAyLDB4QjYwMywweEI2MDQsMHhCNjA1LDB4QjYwNiwvKiAweDQwLTB4NDcgKi8KKwkweEI2MDcsMHhCNjA4LDB4QjYwOSwweEI2MEEsMHhCNjBCLDB4QjYwQywweEI2MEQsMHhCNjBFLC8qIDB4NDgtMHg0RiAqLworCTB4QjYwRiwweEI2MTIsMHhCNjEzLDB4QjYxNSwweEI2MTYsMHhCNjE3LDB4QjYxOSwweEI2MUEsLyogMHg1MC0weDU3ICovCisJMHhCNjFCLDB4QjYxQywweEI2MUQsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhCNjFFLDB4QjYxRiwweEI2MjAsMHhCNjIxLDB4QjYyMiwweEI2MjMsMHhCNjI0LC8qIDB4NjAtMHg2NyAqLworCTB4QjYyNiwweEI2MjcsMHhCNjI4LDB4QjYyOSwweEI2MkEsMHhCNjJCLDB4QjYyRCwweEI2MkUsLyogMHg2OC0weDZGICovCisJMHhCNjJGLDB4QjYzMCwweEI2MzEsMHhCNjMyLDB4QjYzMywweEI2MzUsMHhCNjM2LDB4QjYzNywvKiAweDcwLTB4NzcgKi8KKwkweEI2MzgsMHhCNjM5LDB4QjYzQSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QjYzQiwweEI2M0MsMHhCNjNELDB4QjYzRSwweEI2M0YsMHhCNjQwLDB4QjY0MSwvKiAweDgwLTB4ODcgKi8KKwkweEI2NDIsMHhCNjQzLDB4QjY0NCwweEI2NDUsMHhCNjQ2LDB4QjY0NywweEI2NDksMHhCNjRBLC8qIDB4ODgtMHg4RiAqLworCTB4QjY0QiwweEI2NEMsMHhCNjRELDB4QjY0RSwweEI2NEYsMHhCNjUwLDB4QjY1MSwweEI2NTIsLyogMHg5MC0weDk3ICovCisJMHhCNjUzLDB4QjY1NCwweEI2NTUsMHhCNjU2LDB4QjY1NywweEI2NTgsMHhCNjU5LDB4QjY1QSwvKiAweDk4LTB4OUYgKi8KKwkweEI2NUIsMHhCNjVDLDB4QjY1RCwweEI2NUUsMHhCNjVGLDB4QjY2MCwweEI2NjEsMHhCNjYyLC8qIDB4QTAtMHhBNyAqLworCTB4QjY2MywweEI2NjUsMHhCNjY2LDB4QjY2NywweEI2NjksMHhCNjZBLDB4QjY2QiwweEI2NkMsLyogMHhBOC0weEFGICovCisJMHhCNjZELDB4QjY2RSwweEI2NkYsMHhCNjcwLDB4QjY3MSwweEI2NzIsMHhCNjczLDB4QjY3NCwvKiAweEIwLTB4QjcgKi8KKwkweEI2NzUsMHhCNjc2LDB4QjY3NywweEI2NzgsMHhCNjc5LDB4QjY3QSwweEI2N0IsMHhCNjdDLC8qIDB4QjgtMHhCRiAqLworCTB4QjY3RCwweEI2N0UsMHhCNjdGLDB4QjY4MCwweEI2ODEsMHhCNjgyLDB4QjY4MywweEI2ODQsLyogMHhDMC0weEM3ICovCisJMHhCNjg1LDB4QjY4NiwweEI2ODcsMHhCNjg4LDB4QjY4OSwweEI2OEEsMHhCNjhCLDB4QjY4QywvKiAweEM4LTB4Q0YgKi8KKwkweEI2OEQsMHhCNjhFLDB4QjY4RiwweEI2OTAsMHhCNjkxLDB4QjY5MiwweEI2OTMsMHhCNjk0LC8qIDB4RDAtMHhENyAqLworCTB4QjY5NSwweEI2OTYsMHhCNjk3LDB4QjY5OCwweEI2OTksMHhCNjlBLDB4QjY5QiwweEI2OUUsLyogMHhEOC0weERGICovCisJMHhCNjlGLDB4QjZBMSwweEI2QTIsMHhCNkEzLDB4QjZBNSwweEI2QTYsMHhCNkE3LDB4QjZBOCwvKiAweEUwLTB4RTcgKi8KKwkweEI2QTksMHhCNkFBLDB4QjZBRCwweEI2QUUsMHhCNkFGLDB4QjZCMCwweEI2QjIsMHhCNkIzLC8qIDB4RTgtMHhFRiAqLworCTB4QjZCNCwweEI2QjUsMHhCNkI2LDB4QjZCNywweEI2QjgsMHhCNkI5LDB4QjZCQSwweEI2QkIsLyogMHhGMC0weEY3ICovCisJMHhCNkJDLDB4QjZCRCwweEI2QkUsMHhCNkJGLDB4QjZDMCwweEI2QzEsMHhCNkMyLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84RFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhCNkMzLDB4QjZDNCwweEI2QzUsMHhCNkM2LDB4QjZDNywweEI2QzgsMHhCNkM5LC8qIDB4NDAtMHg0NyAqLworCTB4QjZDQSwweEI2Q0IsMHhCNkNDLDB4QjZDRCwweEI2Q0UsMHhCNkNGLDB4QjZEMCwweEI2RDEsLyogMHg0OC0weDRGICovCisJMHhCNkQyLDB4QjZEMywweEI2RDUsMHhCNkQ2LDB4QjZENywweEI2RDgsMHhCNkQ5LDB4QjZEQSwvKiAweDUwLTB4NTcgKi8KKwkweEI2REIsMHhCNkRDLDB4QjZERCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEI2REUsMHhCNkRGLDB4QjZFMCwweEI2RTEsMHhCNkUyLDB4QjZFMywweEI2RTQsLyogMHg2MC0weDY3ICovCisJMHhCNkU1LDB4QjZFNiwweEI2RTcsMHhCNkU4LDB4QjZFOSwweEI2RUEsMHhCNkVCLDB4QjZFQywvKiAweDY4LTB4NkYgKi8KKwkweEI2RUQsMHhCNkVFLDB4QjZFRiwweEI2RjEsMHhCNkYyLDB4QjZGMywweEI2RjUsMHhCNkY2LC8qIDB4NzAtMHg3NyAqLworCTB4QjZGNywweEI2RjksMHhCNkZBLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhCNkZCLDB4QjZGQywweEI2RkQsMHhCNkZFLDB4QjZGRiwweEI3MDIsMHhCNzAzLC8qIDB4ODAtMHg4NyAqLworCTB4QjcwNCwweEI3MDYsMHhCNzA3LDB4QjcwOCwweEI3MDksMHhCNzBBLDB4QjcwQiwweEI3MEMsLyogMHg4OC0weDhGICovCisJMHhCNzBELDB4QjcwRSwweEI3MEYsMHhCNzEwLDB4QjcxMSwweEI3MTIsMHhCNzEzLDB4QjcxNCwvKiAweDkwLTB4OTcgKi8KKwkweEI3MTUsMHhCNzE2LDB4QjcxNywweEI3MTgsMHhCNzE5LDB4QjcxQSwweEI3MUIsMHhCNzFDLC8qIDB4OTgtMHg5RiAqLworCTB4QjcxRCwweEI3MUUsMHhCNzFGLDB4QjcyMCwweEI3MjEsMHhCNzIyLDB4QjcyMywweEI3MjQsLyogMHhBMC0weEE3ICovCisJMHhCNzI1LDB4QjcyNiwweEI3MjcsMHhCNzJBLDB4QjcyQiwweEI3MkQsMHhCNzJFLDB4QjczMSwvKiAweEE4LTB4QUYgKi8KKwkweEI3MzIsMHhCNzMzLDB4QjczNCwweEI3MzUsMHhCNzM2LDB4QjczNywweEI3M0EsMHhCNzNDLC8qIDB4QjAtMHhCNyAqLworCTB4QjczRCwweEI3M0UsMHhCNzNGLDB4Qjc0MCwweEI3NDEsMHhCNzQyLDB4Qjc0MywweEI3NDUsLyogMHhCOC0weEJGICovCisJMHhCNzQ2LDB4Qjc0NywweEI3NDksMHhCNzRBLDB4Qjc0QiwweEI3NEQsMHhCNzRFLDB4Qjc0RiwvKiAweEMwLTB4QzcgKi8KKwkweEI3NTAsMHhCNzUxLDB4Qjc1MiwweEI3NTMsMHhCNzU2LDB4Qjc1NywweEI3NTgsMHhCNzU5LC8qIDB4QzgtMHhDRiAqLworCTB4Qjc1QSwweEI3NUIsMHhCNzVDLDB4Qjc1RCwweEI3NUUsMHhCNzVGLDB4Qjc2MSwweEI3NjIsLyogMHhEMC0weEQ3ICovCisJMHhCNzYzLDB4Qjc2NSwweEI3NjYsMHhCNzY3LDB4Qjc2OSwweEI3NkEsMHhCNzZCLDB4Qjc2QywvKiAweEQ4LTB4REYgKi8KKwkweEI3NkQsMHhCNzZFLDB4Qjc2RiwweEI3NzIsMHhCNzc0LDB4Qjc3NiwweEI3NzcsMHhCNzc4LC8qIDB4RTAtMHhFNyAqLworCTB4Qjc3OSwweEI3N0EsMHhCNzdCLDB4Qjc3RSwweEI3N0YsMHhCNzgxLDB4Qjc4MiwweEI3ODMsLyogMHhFOC0weEVGICovCisJMHhCNzg1LDB4Qjc4NiwweEI3ODcsMHhCNzg4LDB4Qjc4OSwweEI3OEEsMHhCNzhCLDB4Qjc4RSwvKiAweEYwLTB4RjcgKi8KKwkweEI3OTMsMHhCNzk0LDB4Qjc5NSwweEI3OUEsMHhCNzlCLDB4Qjc5RCwweEI3OUUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzhFWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEI3OUYsMHhCN0ExLDB4QjdBMiwweEI3QTMsMHhCN0E0LDB4QjdBNSwweEI3QTYsLyogMHg0MC0weDQ3ICovCisJMHhCN0E3LDB4QjdBQSwweEI3QUUsMHhCN0FGLDB4QjdCMCwweEI3QjEsMHhCN0IyLDB4QjdCMywvKiAweDQ4LTB4NEYgKi8KKwkweEI3QjYsMHhCN0I3LDB4QjdCOSwweEI3QkEsMHhCN0JCLDB4QjdCQywweEI3QkQsMHhCN0JFLC8qIDB4NTAtMHg1NyAqLworCTB4QjdCRiwweEI3QzAsMHhCN0MxLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QjdDMiwweEI3QzMsMHhCN0M0LDB4QjdDNSwweEI3QzYsMHhCN0M4LDB4QjdDQSwvKiAweDYwLTB4NjcgKi8KKwkweEI3Q0IsMHhCN0NDLDB4QjdDRCwweEI3Q0UsMHhCN0NGLDB4QjdEMCwweEI3RDEsMHhCN0QyLC8qIDB4NjgtMHg2RiAqLworCTB4QjdEMywweEI3RDQsMHhCN0Q1LDB4QjdENiwweEI3RDcsMHhCN0Q4LDB4QjdEOSwweEI3REEsLyogMHg3MC0weDc3ICovCisJMHhCN0RCLDB4QjdEQywweEI3REQsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEI3REUsMHhCN0RGLDB4QjdFMCwweEI3RTEsMHhCN0UyLDB4QjdFMywweEI3RTQsLyogMHg4MC0weDg3ICovCisJMHhCN0U1LDB4QjdFNiwweEI3RTcsMHhCN0U4LDB4QjdFOSwweEI3RUEsMHhCN0VCLDB4QjdFRSwvKiAweDg4LTB4OEYgKi8KKwkweEI3RUYsMHhCN0YxLDB4QjdGMiwweEI3RjMsMHhCN0Y1LDB4QjdGNiwweEI3RjcsMHhCN0Y4LC8qIDB4OTAtMHg5NyAqLworCTB4QjdGOSwweEI3RkEsMHhCN0ZCLDB4QjdGRSwweEI4MDIsMHhCODAzLDB4QjgwNCwweEI4MDUsLyogMHg5OC0weDlGICovCisJMHhCODA2LDB4QjgwQSwweEI4MEIsMHhCODBELDB4QjgwRSwweEI4MEYsMHhCODExLDB4QjgxMiwvKiAweEEwLTB4QTcgKi8KKwkweEI4MTMsMHhCODE0LDB4QjgxNSwweEI4MTYsMHhCODE3LDB4QjgxQSwweEI4MUMsMHhCODFFLC8qIDB4QTgtMHhBRiAqLworCTB4QjgxRiwweEI4MjAsMHhCODIxLDB4QjgyMiwweEI4MjMsMHhCODI2LDB4QjgyNywweEI4MjksLyogMHhCMC0weEI3ICovCisJMHhCODJBLDB4QjgyQiwweEI4MkQsMHhCODJFLDB4QjgyRiwweEI4MzAsMHhCODMxLDB4QjgzMiwvKiAweEI4LTB4QkYgKi8KKwkweEI4MzMsMHhCODM2LDB4QjgzQSwweEI4M0IsMHhCODNDLDB4QjgzRCwweEI4M0UsMHhCODNGLC8qIDB4QzAtMHhDNyAqLworCTB4Qjg0MSwweEI4NDIsMHhCODQzLDB4Qjg0NSwweEI4NDYsMHhCODQ3LDB4Qjg0OCwweEI4NDksLyogMHhDOC0weENGICovCisJMHhCODRBLDB4Qjg0QiwweEI4NEMsMHhCODRELDB4Qjg0RSwweEI4NEYsMHhCODUwLDB4Qjg1MiwvKiAweEQwLTB4RDcgKi8KKwkweEI4NTQsMHhCODU1LDB4Qjg1NiwweEI4NTcsMHhCODU4LDB4Qjg1OSwweEI4NUEsMHhCODVCLC8qIDB4RDgtMHhERiAqLworCTB4Qjg1RSwweEI4NUYsMHhCODYxLDB4Qjg2MiwweEI4NjMsMHhCODY1LDB4Qjg2NiwweEI4NjcsLyogMHhFMC0weEU3ICovCisJMHhCODY4LDB4Qjg2OSwweEI4NkEsMHhCODZCLDB4Qjg2RSwweEI4NzAsMHhCODcyLDB4Qjg3MywvKiAweEU4LTB4RUYgKi8KKwkweEI4NzQsMHhCODc1LDB4Qjg3NiwweEI4NzcsMHhCODc5LDB4Qjg3QSwweEI4N0IsMHhCODdELC8qIDB4RjAtMHhGNyAqLworCTB4Qjg3RSwweEI4N0YsMHhCODgwLDB4Qjg4MSwweEI4ODIsMHhCODgzLDB4Qjg4NCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOEZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4Qjg4NSwweEI4ODYsMHhCODg3LDB4Qjg4OCwweEI4ODksMHhCODhBLDB4Qjg4QiwvKiAweDQwLTB4NDcgKi8KKwkweEI4OEMsMHhCODhFLDB4Qjg4RiwweEI4OTAsMHhCODkxLDB4Qjg5MiwweEI4OTMsMHhCODk0LC8qIDB4NDgtMHg0RiAqLworCTB4Qjg5NSwweEI4OTYsMHhCODk3LDB4Qjg5OCwweEI4OTksMHhCODlBLDB4Qjg5QiwweEI4OUMsLyogMHg1MC0weDU3ICovCisJMHhCODlELDB4Qjg5RSwweEI4OUYsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhCOEEwLDB4QjhBMSwweEI4QTIsMHhCOEEzLDB4QjhBNCwweEI4QTUsMHhCOEE2LC8qIDB4NjAtMHg2NyAqLworCTB4QjhBNywweEI4QTksMHhCOEFBLDB4QjhBQiwweEI4QUMsMHhCOEFELDB4QjhBRSwweEI4QUYsLyogMHg2OC0weDZGICovCisJMHhCOEIxLDB4QjhCMiwweEI4QjMsMHhCOEI1LDB4QjhCNiwweEI4QjcsMHhCOEI5LDB4QjhCQSwvKiAweDcwLTB4NzcgKi8KKwkweEI4QkIsMHhCOEJDLDB4QjhCRCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QjhCRSwweEI4QkYsMHhCOEMyLDB4QjhDNCwweEI4QzYsMHhCOEM3LDB4QjhDOCwvKiAweDgwLTB4ODcgKi8KKwkweEI4QzksMHhCOENBLDB4QjhDQiwweEI4Q0QsMHhCOENFLDB4QjhDRiwweEI4RDEsMHhCOEQyLC8qIDB4ODgtMHg4RiAqLworCTB4QjhEMywweEI4RDUsMHhCOEQ2LDB4QjhENywweEI4RDgsMHhCOEQ5LDB4QjhEQSwweEI4REIsLyogMHg5MC0weDk3ICovCisJMHhCOERDLDB4QjhERSwweEI4RTAsMHhCOEUyLDB4QjhFMywweEI4RTQsMHhCOEU1LDB4QjhFNiwvKiAweDk4LTB4OUYgKi8KKwkweEI4RTcsMHhCOEVBLDB4QjhFQiwweEI4RUQsMHhCOEVFLDB4QjhFRiwweEI4RjEsMHhCOEYyLC8qIDB4QTAtMHhBNyAqLworCTB4QjhGMywweEI4RjQsMHhCOEY1LDB4QjhGNiwweEI4RjcsMHhCOEZBLDB4QjhGQywweEI4RkUsLyogMHhBOC0weEFGICovCisJMHhCOEZGLDB4QjkwMCwweEI5MDEsMHhCOTAyLDB4QjkwMywweEI5MDUsMHhCOTA2LDB4QjkwNywvKiAweEIwLTB4QjcgKi8KKwkweEI5MDgsMHhCOTA5LDB4QjkwQSwweEI5MEIsMHhCOTBDLDB4QjkwRCwweEI5MEUsMHhCOTBGLC8qIDB4QjgtMHhCRiAqLworCTB4QjkxMCwweEI5MTEsMHhCOTEyLDB4QjkxMywweEI5MTQsMHhCOTE1LDB4QjkxNiwweEI5MTcsLyogMHhDMC0weEM3ICovCisJMHhCOTE5LDB4QjkxQSwweEI5MUIsMHhCOTFDLDB4QjkxRCwweEI5MUUsMHhCOTFGLDB4QjkyMSwvKiAweEM4LTB4Q0YgKi8KKwkweEI5MjIsMHhCOTIzLDB4QjkyNCwweEI5MjUsMHhCOTI2LDB4QjkyNywweEI5MjgsMHhCOTI5LC8qIDB4RDAtMHhENyAqLworCTB4QjkyQSwweEI5MkIsMHhCOTJDLDB4QjkyRCwweEI5MkUsMHhCOTJGLDB4QjkzMCwweEI5MzEsLyogMHhEOC0weERGICovCisJMHhCOTMyLDB4QjkzMywweEI5MzQsMHhCOTM1LDB4QjkzNiwweEI5MzcsMHhCOTM4LDB4QjkzOSwvKiAweEUwLTB4RTcgKi8KKwkweEI5M0EsMHhCOTNCLDB4QjkzRSwweEI5M0YsMHhCOTQxLDB4Qjk0MiwweEI5NDMsMHhCOTQ1LC8qIDB4RTgtMHhFRiAqLworCTB4Qjk0NiwweEI5NDcsMHhCOTQ4LDB4Qjk0OSwweEI5NEEsMHhCOTRCLDB4Qjk0RCwweEI5NEUsLyogMHhGMC0weEY3ICovCisJMHhCOTUwLDB4Qjk1MiwweEI5NTMsMHhCOTU0LDB4Qjk1NSwweEI5NTYsMHhCOTU3LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85MFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhCOTVBLDB4Qjk1QiwweEI5NUQsMHhCOTVFLDB4Qjk1RiwweEI5NjEsMHhCOTYyLC8qIDB4NDAtMHg0NyAqLworCTB4Qjk2MywweEI5NjQsMHhCOTY1LDB4Qjk2NiwweEI5NjcsMHhCOTZBLDB4Qjk2QywweEI5NkUsLyogMHg0OC0weDRGICovCisJMHhCOTZGLDB4Qjk3MCwweEI5NzEsMHhCOTcyLDB4Qjk3MywweEI5NzYsMHhCOTc3LDB4Qjk3OSwvKiAweDUwLTB4NTcgKi8KKwkweEI5N0EsMHhCOTdCLDB4Qjk3RCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEI5N0UsMHhCOTdGLDB4Qjk4MCwweEI5ODEsMHhCOTgyLDB4Qjk4MywweEI5ODYsLyogMHg2MC0weDY3ICovCisJMHhCOTg4LDB4Qjk4QiwweEI5OEMsMHhCOThGLDB4Qjk5MCwweEI5OTEsMHhCOTkyLDB4Qjk5MywvKiAweDY4LTB4NkYgKi8KKwkweEI5OTQsMHhCOTk1LDB4Qjk5NiwweEI5OTcsMHhCOTk4LDB4Qjk5OSwweEI5OUEsMHhCOTlCLC8qIDB4NzAtMHg3NyAqLworCTB4Qjk5QywweEI5OUQsMHhCOTlFLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhCOTlGLDB4QjlBMCwweEI5QTEsMHhCOUEyLDB4QjlBMywweEI5QTQsMHhCOUE1LC8qIDB4ODAtMHg4NyAqLworCTB4QjlBNiwweEI5QTcsMHhCOUE4LDB4QjlBOSwweEI5QUEsMHhCOUFCLDB4QjlBRSwweEI5QUYsLyogMHg4OC0weDhGICovCisJMHhCOUIxLDB4QjlCMiwweEI5QjMsMHhCOUI1LDB4QjlCNiwweEI5QjcsMHhCOUI4LDB4QjlCOSwvKiAweDkwLTB4OTcgKi8KKwkweEI5QkEsMHhCOUJCLDB4QjlCRSwweEI5QzAsMHhCOUMyLDB4QjlDMywweEI5QzQsMHhCOUM1LC8qIDB4OTgtMHg5RiAqLworCTB4QjlDNiwweEI5QzcsMHhCOUNBLDB4QjlDQiwweEI5Q0QsMHhCOUQzLDB4QjlENCwweEI5RDUsLyogMHhBMC0weEE3ICovCisJMHhCOUQ2LDB4QjlENywweEI5REEsMHhCOURDLDB4QjlERiwweEI5RTAsMHhCOUUyLDB4QjlFNiwvKiAweEE4LTB4QUYgKi8KKwkweEI5RTcsMHhCOUU5LDB4QjlFQSwweEI5RUIsMHhCOUVELDB4QjlFRSwweEI5RUYsMHhCOUYwLC8qIDB4QjAtMHhCNyAqLworCTB4QjlGMSwweEI5RjIsMHhCOUYzLDB4QjlGNiwweEI5RkIsMHhCOUZDLDB4QjlGRCwweEI5RkUsLyogMHhCOC0weEJGICovCisJMHhCOUZGLDB4QkEwMiwweEJBMDMsMHhCQTA0LDB4QkEwNSwweEJBMDYsMHhCQTA3LDB4QkEwOSwvKiAweEMwLTB4QzcgKi8KKwkweEJBMEEsMHhCQTBCLDB4QkEwQywweEJBMEQsMHhCQTBFLDB4QkEwRiwweEJBMTAsMHhCQTExLC8qIDB4QzgtMHhDRiAqLworCTB4QkExMiwweEJBMTMsMHhCQTE0LDB4QkExNiwweEJBMTcsMHhCQTE4LDB4QkExOSwweEJBMUEsLyogMHhEMC0weEQ3ICovCisJMHhCQTFCLDB4QkExQywweEJBMUQsMHhCQTFFLDB4QkExRiwweEJBMjAsMHhCQTIxLDB4QkEyMiwvKiAweEQ4LTB4REYgKi8KKwkweEJBMjMsMHhCQTI0LDB4QkEyNSwweEJBMjYsMHhCQTI3LDB4QkEyOCwweEJBMjksMHhCQTJBLC8qIDB4RTAtMHhFNyAqLworCTB4QkEyQiwweEJBMkMsMHhCQTJELDB4QkEyRSwweEJBMkYsMHhCQTMwLDB4QkEzMSwweEJBMzIsLyogMHhFOC0weEVGICovCisJMHhCQTMzLDB4QkEzNCwweEJBMzUsMHhCQTM2LDB4QkEzNywweEJBM0EsMHhCQTNCLDB4QkEzRCwvKiAweEYwLTB4RjcgKi8KKwkweEJBM0UsMHhCQTNGLDB4QkE0MSwweEJBNDMsMHhCQTQ0LDB4QkE0NSwweEJBNDYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzkxWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEJBNDcsMHhCQTRBLDB4QkE0QywweEJBNEYsMHhCQTUwLDB4QkE1MSwweEJBNTIsLyogMHg0MC0weDQ3ICovCisJMHhCQTU2LDB4QkE1NywweEJBNTksMHhCQTVBLDB4QkE1QiwweEJBNUQsMHhCQTVFLDB4QkE1RiwvKiAweDQ4LTB4NEYgKi8KKwkweEJBNjAsMHhCQTYxLDB4QkE2MiwweEJBNjMsMHhCQTY2LDB4QkE2QSwweEJBNkIsMHhCQTZDLC8qIDB4NTAtMHg1NyAqLworCTB4QkE2RCwweEJBNkUsMHhCQTZGLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QkE3MiwweEJBNzMsMHhCQTc1LDB4QkE3NiwweEJBNzcsMHhCQTc5LDB4QkE3QSwvKiAweDYwLTB4NjcgKi8KKwkweEJBN0IsMHhCQTdDLDB4QkE3RCwweEJBN0UsMHhCQTdGLDB4QkE4MCwweEJBODEsMHhCQTgyLC8qIDB4NjgtMHg2RiAqLworCTB4QkE4NiwweEJBODgsMHhCQTg5LDB4QkE4QSwweEJBOEIsMHhCQThELDB4QkE4RSwweEJBOEYsLyogMHg3MC0weDc3ICovCisJMHhCQTkwLDB4QkE5MSwweEJBOTIsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEJBOTMsMHhCQTk0LDB4QkE5NSwweEJBOTYsMHhCQTk3LDB4QkE5OCwweEJBOTksLyogMHg4MC0weDg3ICovCisJMHhCQTlBLDB4QkE5QiwweEJBOUMsMHhCQTlELDB4QkE5RSwweEJBOUYsMHhCQUEwLDB4QkFBMSwvKiAweDg4LTB4OEYgKi8KKwkweEJBQTIsMHhCQUEzLDB4QkFBNCwweEJBQTUsMHhCQUE2LDB4QkFBNywweEJBQUEsMHhCQUFELC8qIDB4OTAtMHg5NyAqLworCTB4QkFBRSwweEJBQUYsMHhCQUIxLDB4QkFCMywweEJBQjQsMHhCQUI1LDB4QkFCNiwweEJBQjcsLyogMHg5OC0weDlGICovCisJMHhCQUJBLDB4QkFCQywweEJBQkUsMHhCQUJGLDB4QkFDMCwweEJBQzEsMHhCQUMyLDB4QkFDMywvKiAweEEwLTB4QTcgKi8KKwkweEJBQzUsMHhCQUM2LDB4QkFDNywweEJBQzksMHhCQUNBLDB4QkFDQiwweEJBQ0MsMHhCQUNELC8qIDB4QTgtMHhBRiAqLworCTB4QkFDRSwweEJBQ0YsMHhCQUQwLDB4QkFEMSwweEJBRDIsMHhCQUQzLDB4QkFENCwweEJBRDUsLyogMHhCMC0weEI3ICovCisJMHhCQUQ2LDB4QkFENywweEJBREEsMHhCQURCLDB4QkFEQywweEJBREQsMHhCQURFLDB4QkFERiwvKiAweEI4LTB4QkYgKi8KKwkweEJBRTAsMHhCQUUxLDB4QkFFMiwweEJBRTMsMHhCQUU0LDB4QkFFNSwweEJBRTYsMHhCQUU3LC8qIDB4QzAtMHhDNyAqLworCTB4QkFFOCwweEJBRTksMHhCQUVBLDB4QkFFQiwweEJBRUMsMHhCQUVELDB4QkFFRSwweEJBRUYsLyogMHhDOC0weENGICovCisJMHhCQUYwLDB4QkFGMSwweEJBRjIsMHhCQUYzLDB4QkFGNCwweEJBRjUsMHhCQUY2LDB4QkFGNywvKiAweEQwLTB4RDcgKi8KKwkweEJBRjgsMHhCQUY5LDB4QkFGQSwweEJBRkIsMHhCQUZELDB4QkFGRSwweEJBRkYsMHhCQjAxLC8qIDB4RDgtMHhERiAqLworCTB4QkIwMiwweEJCMDMsMHhCQjA1LDB4QkIwNiwweEJCMDcsMHhCQjA4LDB4QkIwOSwweEJCMEEsLyogMHhFMC0weEU3ICovCisJMHhCQjBCLDB4QkIwQywweEJCMEUsMHhCQjEwLDB4QkIxMiwweEJCMTMsMHhCQjE0LDB4QkIxNSwvKiAweEU4LTB4RUYgKi8KKwkweEJCMTYsMHhCQjE3LDB4QkIxOSwweEJCMUEsMHhCQjFCLDB4QkIxRCwweEJCMUUsMHhCQjFGLC8qIDB4RjAtMHhGNyAqLworCTB4QkIyMSwweEJCMjIsMHhCQjIzLDB4QkIyNCwweEJCMjUsMHhCQjI2LDB4QkIyNywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOTJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QkIyOCwweEJCMkEsMHhCQjJDLDB4QkIyRCwweEJCMkUsMHhCQjJGLDB4QkIzMCwvKiAweDQwLTB4NDcgKi8KKwkweEJCMzEsMHhCQjMyLDB4QkIzMywweEJCMzcsMHhCQjM5LDB4QkIzQSwweEJCM0YsMHhCQjQwLC8qIDB4NDgtMHg0RiAqLworCTB4QkI0MSwweEJCNDIsMHhCQjQzLDB4QkI0NiwweEJCNDgsMHhCQjRBLDB4QkI0QiwweEJCNEMsLyogMHg1MC0weDU3ICovCisJMHhCQjRFLDB4QkI1MSwweEJCNTIsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhCQjUzLDB4QkI1NSwweEJCNTYsMHhCQjU3LDB4QkI1OSwweEJCNUEsMHhCQjVCLC8qIDB4NjAtMHg2NyAqLworCTB4QkI1QywweEJCNUQsMHhCQjVFLDB4QkI1RiwweEJCNjAsMHhCQjYyLDB4QkI2NCwweEJCNjUsLyogMHg2OC0weDZGICovCisJMHhCQjY2LDB4QkI2NywweEJCNjgsMHhCQjY5LDB4QkI2QSwweEJCNkIsMHhCQjZELDB4QkI2RSwvKiAweDcwLTB4NzcgKi8KKwkweEJCNkYsMHhCQjcwLDB4QkI3MSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QkI3MiwweEJCNzMsMHhCQjc0LDB4QkI3NSwweEJCNzYsMHhCQjc3LDB4QkI3OCwvKiAweDgwLTB4ODcgKi8KKwkweEJCNzksMHhCQjdBLDB4QkI3QiwweEJCN0MsMHhCQjdELDB4QkI3RSwweEJCN0YsMHhCQjgwLC8qIDB4ODgtMHg4RiAqLworCTB4QkI4MSwweEJCODIsMHhCQjgzLDB4QkI4NCwweEJCODUsMHhCQjg2LDB4QkI4NywweEJCODksLyogMHg5MC0weDk3ICovCisJMHhCQjhBLDB4QkI4QiwweEJCOEQsMHhCQjhFLDB4QkI4RiwweEJCOTEsMHhCQjkyLDB4QkI5MywvKiAweDk4LTB4OUYgKi8KKwkweEJCOTQsMHhCQjk1LDB4QkI5NiwweEJCOTcsMHhCQjk4LDB4QkI5OSwweEJCOUEsMHhCQjlCLC8qIDB4QTAtMHhBNyAqLworCTB4QkI5QywweEJCOUQsMHhCQjlFLDB4QkI5RiwweEJCQTAsMHhCQkExLDB4QkJBMiwweEJCQTMsLyogMHhBOC0weEFGICovCisJMHhCQkE1LDB4QkJBNiwweEJCQTcsMHhCQkE5LDB4QkJBQSwweEJCQUIsMHhCQkFELDB4QkJBRSwvKiAweEIwLTB4QjcgKi8KKwkweEJCQUYsMHhCQkIwLDB4QkJCMSwweEJCQjIsMHhCQkIzLDB4QkJCNSwweEJCQjYsMHhCQkI4LC8qIDB4QjgtMHhCRiAqLworCTB4QkJCOSwweEJCQkEsMHhCQkJCLDB4QkJCQywweEJCQkQsMHhCQkJFLDB4QkJCRiwweEJCQzEsLyogMHhDMC0weEM3ICovCisJMHhCQkMyLDB4QkJDMywweEJCQzUsMHhCQkM2LDB4QkJDNywweEJCQzksMHhCQkNBLDB4QkJDQiwvKiAweEM4LTB4Q0YgKi8KKwkweEJCQ0MsMHhCQkNELDB4QkJDRSwweEJCQ0YsMHhCQkQxLDB4QkJEMiwweEJCRDQsMHhCQkQ1LC8qIDB4RDAtMHhENyAqLworCTB4QkJENiwweEJCRDcsMHhCQkQ4LDB4QkJEOSwweEJCREEsMHhCQkRCLDB4QkJEQywweEJCREQsLyogMHhEOC0weERGICovCisJMHhCQkRFLDB4QkJERiwweEJCRTAsMHhCQkUxLDB4QkJFMiwweEJCRTMsMHhCQkU0LDB4QkJFNSwvKiAweEUwLTB4RTcgKi8KKwkweEJCRTYsMHhCQkU3LDB4QkJFOCwweEJCRTksMHhCQkVBLDB4QkJFQiwweEJCRUMsMHhCQkVELC8qIDB4RTgtMHhFRiAqLworCTB4QkJFRSwweEJCRUYsMHhCQkYwLDB4QkJGMSwweEJCRjIsMHhCQkYzLDB4QkJGNCwweEJCRjUsLyogMHhGMC0weEY3ICovCisJMHhCQkY2LDB4QkJGNywweEJCRkEsMHhCQkZCLDB4QkJGRCwweEJCRkUsMHhCQzAxLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85M1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhCQzAzLDB4QkMwNCwweEJDMDUsMHhCQzA2LDB4QkMwNywweEJDMEEsMHhCQzBFLC8qIDB4NDAtMHg0NyAqLworCTB4QkMxMCwweEJDMTIsMHhCQzEzLDB4QkMxOSwweEJDMUEsMHhCQzIwLDB4QkMyMSwweEJDMjIsLyogMHg0OC0weDRGICovCisJMHhCQzIzLDB4QkMyNiwweEJDMjgsMHhCQzJBLDB4QkMyQiwweEJDMkMsMHhCQzJFLDB4QkMyRiwvKiAweDUwLTB4NTcgKi8KKwkweEJDMzIsMHhCQzMzLDB4QkMzNSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEJDMzYsMHhCQzM3LDB4QkMzOSwweEJDM0EsMHhCQzNCLDB4QkMzQywweEJDM0QsLyogMHg2MC0weDY3ICovCisJMHhCQzNFLDB4QkMzRiwweEJDNDIsMHhCQzQ2LDB4QkM0NywweEJDNDgsMHhCQzRBLDB4QkM0QiwvKiAweDY4LTB4NkYgKi8KKwkweEJDNEUsMHhCQzRGLDB4QkM1MSwweEJDNTIsMHhCQzUzLDB4QkM1NCwweEJDNTUsMHhCQzU2LC8qIDB4NzAtMHg3NyAqLworCTB4QkM1NywweEJDNTgsMHhCQzU5LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhCQzVBLDB4QkM1QiwweEJDNUMsMHhCQzVFLDB4QkM1RiwweEJDNjAsMHhCQzYxLC8qIDB4ODAtMHg4NyAqLworCTB4QkM2MiwweEJDNjMsMHhCQzY0LDB4QkM2NSwweEJDNjYsMHhCQzY3LDB4QkM2OCwweEJDNjksLyogMHg4OC0weDhGICovCisJMHhCQzZBLDB4QkM2QiwweEJDNkMsMHhCQzZELDB4QkM2RSwweEJDNkYsMHhCQzcwLDB4QkM3MSwvKiAweDkwLTB4OTcgKi8KKwkweEJDNzIsMHhCQzczLDB4QkM3NCwweEJDNzUsMHhCQzc2LDB4QkM3NywweEJDNzgsMHhCQzc5LC8qIDB4OTgtMHg5RiAqLworCTB4QkM3QSwweEJDN0IsMHhCQzdDLDB4QkM3RCwweEJDN0UsMHhCQzdGLDB4QkM4MCwweEJDODEsLyogMHhBMC0weEE3ICovCisJMHhCQzgyLDB4QkM4MywweEJDODYsMHhCQzg3LDB4QkM4OSwweEJDOEEsMHhCQzhELDB4QkM4RiwvKiAweEE4LTB4QUYgKi8KKwkweEJDOTAsMHhCQzkxLDB4QkM5MiwweEJDOTMsMHhCQzk2LDB4QkM5OCwweEJDOUIsMHhCQzlDLC8qIDB4QjAtMHhCNyAqLworCTB4QkM5RCwweEJDOUUsMHhCQzlGLDB4QkNBMiwweEJDQTMsMHhCQ0E1LDB4QkNBNiwweEJDQTksLyogMHhCOC0weEJGICovCisJMHhCQ0FBLDB4QkNBQiwweEJDQUMsMHhCQ0FELDB4QkNBRSwweEJDQUYsMHhCQ0IyLDB4QkNCNiwvKiAweEMwLTB4QzcgKi8KKwkweEJDQjcsMHhCQ0I4LDB4QkNCOSwweEJDQkEsMHhCQ0JCLDB4QkNCRSwweEJDQkYsMHhCQ0MxLC8qIDB4QzgtMHhDRiAqLworCTB4QkNDMiwweEJDQzMsMHhCQ0M1LDB4QkNDNiwweEJDQzcsMHhCQ0M4LDB4QkNDOSwweEJDQ0EsLyogMHhEMC0weEQ3ICovCisJMHhCQ0NCLDB4QkNDQywweEJDQ0UsMHhCQ0QyLDB4QkNEMywweEJDRDQsMHhCQ0Q2LDB4QkNENywvKiAweEQ4LTB4REYgKi8KKwkweEJDRDksMHhCQ0RBLDB4QkNEQiwweEJDREQsMHhCQ0RFLDB4QkNERiwweEJDRTAsMHhCQ0UxLC8qIDB4RTAtMHhFNyAqLworCTB4QkNFMiwweEJDRTMsMHhCQ0U0LDB4QkNFNSwweEJDRTYsMHhCQ0U3LDB4QkNFOCwweEJDRTksLyogMHhFOC0weEVGICovCisJMHhCQ0VBLDB4QkNFQiwweEJDRUMsMHhCQ0VELDB4QkNFRSwweEJDRUYsMHhCQ0YwLDB4QkNGMSwvKiAweEYwLTB4RjcgKi8KKwkweEJDRjIsMHhCQ0YzLDB4QkNGNywweEJDRjksMHhCQ0ZBLDB4QkNGQiwweEJDRkQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzk0WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEJDRkUsMHhCQ0ZGLDB4QkQwMCwweEJEMDEsMHhCRDAyLDB4QkQwMywweEJEMDYsLyogMHg0MC0weDQ3ICovCisJMHhCRDA4LDB4QkQwQSwweEJEMEIsMHhCRDBDLDB4QkQwRCwweEJEMEUsMHhCRDBGLDB4QkQxMSwvKiAweDQ4LTB4NEYgKi8KKwkweEJEMTIsMHhCRDEzLDB4QkQxNSwweEJEMTYsMHhCRDE3LDB4QkQxOCwweEJEMTksMHhCRDFBLC8qIDB4NTAtMHg1NyAqLworCTB4QkQxQiwweEJEMUMsMHhCRDFELDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QkQxRSwweEJEMUYsMHhCRDIwLDB4QkQyMSwweEJEMjIsMHhCRDIzLDB4QkQyNSwvKiAweDYwLTB4NjcgKi8KKwkweEJEMjYsMHhCRDI3LDB4QkQyOCwweEJEMjksMHhCRDJBLDB4QkQyQiwweEJEMkQsMHhCRDJFLC8qIDB4NjgtMHg2RiAqLworCTB4QkQyRiwweEJEMzAsMHhCRDMxLDB4QkQzMiwweEJEMzMsMHhCRDM0LDB4QkQzNSwweEJEMzYsLyogMHg3MC0weDc3ICovCisJMHhCRDM3LDB4QkQzOCwweEJEMzksMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEJEM0EsMHhCRDNCLDB4QkQzQywweEJEM0QsMHhCRDNFLDB4QkQzRiwweEJENDEsLyogMHg4MC0weDg3ICovCisJMHhCRDQyLDB4QkQ0MywweEJENDQsMHhCRDQ1LDB4QkQ0NiwweEJENDcsMHhCRDRBLDB4QkQ0QiwvKiAweDg4LTB4OEYgKi8KKwkweEJENEQsMHhCRDRFLDB4QkQ0RiwweEJENTEsMHhCRDUyLDB4QkQ1MywweEJENTQsMHhCRDU1LC8qIDB4OTAtMHg5NyAqLworCTB4QkQ1NiwweEJENTcsMHhCRDVBLDB4QkQ1QiwweEJENUMsMHhCRDVELDB4QkQ1RSwweEJENUYsLyogMHg5OC0weDlGICovCisJMHhCRDYwLDB4QkQ2MSwweEJENjIsMHhCRDYzLDB4QkQ2NSwweEJENjYsMHhCRDY3LDB4QkQ2OSwvKiAweEEwLTB4QTcgKi8KKwkweEJENkEsMHhCRDZCLDB4QkQ2QywweEJENkQsMHhCRDZFLDB4QkQ2RiwweEJENzAsMHhCRDcxLC8qIDB4QTgtMHhBRiAqLworCTB4QkQ3MiwweEJENzMsMHhCRDc0LDB4QkQ3NSwweEJENzYsMHhCRDc3LDB4QkQ3OCwweEJENzksLyogMHhCMC0weEI3ICovCisJMHhCRDdBLDB4QkQ3QiwweEJEN0MsMHhCRDdELDB4QkQ3RSwweEJEN0YsMHhCRDgyLDB4QkQ4MywvKiAweEI4LTB4QkYgKi8KKwkweEJEODUsMHhCRDg2LDB4QkQ4QiwweEJEOEMsMHhCRDhELDB4QkQ4RSwweEJEOEYsMHhCRDkyLC8qIDB4QzAtMHhDNyAqLworCTB4QkQ5NCwweEJEOTYsMHhCRDk3LDB4QkQ5OCwweEJEOUIsMHhCRDlELDB4QkQ5RSwweEJEOUYsLyogMHhDOC0weENGICovCisJMHhCREEwLDB4QkRBMSwweEJEQTIsMHhCREEzLDB4QkRBNSwweEJEQTYsMHhCREE3LDB4QkRBOCwvKiAweEQwLTB4RDcgKi8KKwkweEJEQTksMHhCREFBLDB4QkRBQiwweEJEQUMsMHhCREFELDB4QkRBRSwweEJEQUYsMHhCREIxLC8qIDB4RDgtMHhERiAqLworCTB4QkRCMiwweEJEQjMsMHhCREI0LDB4QkRCNSwweEJEQjYsMHhCREI3LDB4QkRCOSwweEJEQkEsLyogMHhFMC0weEU3ICovCisJMHhCREJCLDB4QkRCQywweEJEQkQsMHhCREJFLDB4QkRCRiwweEJEQzAsMHhCREMxLDB4QkRDMiwvKiAweEU4LTB4RUYgKi8KKwkweEJEQzMsMHhCREM0LDB4QkRDNSwweEJEQzYsMHhCREM3LDB4QkRDOCwweEJEQzksMHhCRENBLC8qIDB4RjAtMHhGNyAqLworCTB4QkRDQiwweEJEQ0MsMHhCRENELDB4QkRDRSwweEJEQ0YsMHhCREQwLDB4QkREMSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOTVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QkREMiwweEJERDMsMHhCREQ2LDB4QkRENywweEJERDksMHhCRERBLDB4QkREQiwvKiAweDQwLTB4NDcgKi8KKwkweEJEREQsMHhCRERFLDB4QkRERiwweEJERTAsMHhCREUxLDB4QkRFMiwweEJERTMsMHhCREU0LC8qIDB4NDgtMHg0RiAqLworCTB4QkRFNSwweEJERTYsMHhCREU3LDB4QkRFOCwweEJERUEsMHhCREVCLDB4QkRFQywweEJERUQsLyogMHg1MC0weDU3ICovCisJMHhCREVFLDB4QkRFRiwweEJERjEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhCREYyLDB4QkRGMywweEJERjUsMHhCREY2LDB4QkRGNywweEJERjksMHhCREZBLC8qIDB4NjAtMHg2NyAqLworCTB4QkRGQiwweEJERkMsMHhCREZELDB4QkRGRSwweEJERkYsMHhCRTAxLDB4QkUwMiwweEJFMDQsLyogMHg2OC0weDZGICovCisJMHhCRTA2LDB4QkUwNywweEJFMDgsMHhCRTA5LDB4QkUwQSwweEJFMEIsMHhCRTBFLDB4QkUwRiwvKiAweDcwLTB4NzcgKi8KKwkweEJFMTEsMHhCRTEyLDB4QkUxMywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QkUxNSwweEJFMTYsMHhCRTE3LDB4QkUxOCwweEJFMTksMHhCRTFBLDB4QkUxQiwvKiAweDgwLTB4ODcgKi8KKwkweEJFMUUsMHhCRTIwLDB4QkUyMSwweEJFMjIsMHhCRTIzLDB4QkUyNCwweEJFMjUsMHhCRTI2LC8qIDB4ODgtMHg4RiAqLworCTB4QkUyNywweEJFMjgsMHhCRTI5LDB4QkUyQSwweEJFMkIsMHhCRTJDLDB4QkUyRCwweEJFMkUsLyogMHg5MC0weDk3ICovCisJMHhCRTJGLDB4QkUzMCwweEJFMzEsMHhCRTMyLDB4QkUzMywweEJFMzQsMHhCRTM1LDB4QkUzNiwvKiAweDk4LTB4OUYgKi8KKwkweEJFMzcsMHhCRTM4LDB4QkUzOSwweEJFM0EsMHhCRTNCLDB4QkUzQywweEJFM0QsMHhCRTNFLC8qIDB4QTAtMHhBNyAqLworCTB4QkUzRiwweEJFNDAsMHhCRTQxLDB4QkU0MiwweEJFNDMsMHhCRTQ2LDB4QkU0NywweEJFNDksLyogMHhBOC0weEFGICovCisJMHhCRTRBLDB4QkU0QiwweEJFNEQsMHhCRTRGLDB4QkU1MCwweEJFNTEsMHhCRTUyLDB4QkU1MywvKiAweEIwLTB4QjcgKi8KKwkweEJFNTYsMHhCRTU4LDB4QkU1QywweEJFNUQsMHhCRTVFLDB4QkU1RiwweEJFNjIsMHhCRTYzLC8qIDB4QjgtMHhCRiAqLworCTB4QkU2NSwweEJFNjYsMHhCRTY3LDB4QkU2OSwweEJFNkIsMHhCRTZDLDB4QkU2RCwweEJFNkUsLyogMHhDMC0weEM3ICovCisJMHhCRTZGLDB4QkU3MiwweEJFNzYsMHhCRTc3LDB4QkU3OCwweEJFNzksMHhCRTdBLDB4QkU3RSwvKiAweEM4LTB4Q0YgKi8KKwkweEJFN0YsMHhCRTgxLDB4QkU4MiwweEJFODMsMHhCRTg1LDB4QkU4NiwweEJFODcsMHhCRTg4LC8qIDB4RDAtMHhENyAqLworCTB4QkU4OSwweEJFOEEsMHhCRThCLDB4QkU4RSwweEJFOTIsMHhCRTkzLDB4QkU5NCwweEJFOTUsLyogMHhEOC0weERGICovCisJMHhCRTk2LDB4QkU5NywweEJFOUEsMHhCRTlCLDB4QkU5QywweEJFOUQsMHhCRTlFLDB4QkU5RiwvKiAweEUwLTB4RTcgKi8KKwkweEJFQTAsMHhCRUExLDB4QkVBMiwweEJFQTMsMHhCRUE0LDB4QkVBNSwweEJFQTYsMHhCRUE3LC8qIDB4RTgtMHhFRiAqLworCTB4QkVBOSwweEJFQUEsMHhCRUFCLDB4QkVBQywweEJFQUQsMHhCRUFFLDB4QkVBRiwweEJFQjAsLyogMHhGMC0weEY3ICovCisJMHhCRUIxLDB4QkVCMiwweEJFQjMsMHhCRUI0LDB4QkVCNSwweEJFQjYsMHhCRUI3LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85NlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhCRUI4LDB4QkVCOSwweEJFQkEsMHhCRUJCLDB4QkVCQywweEJFQkQsMHhCRUJFLC8qIDB4NDAtMHg0NyAqLworCTB4QkVCRiwweEJFQzAsMHhCRUMxLDB4QkVDMiwweEJFQzMsMHhCRUM0LDB4QkVDNSwweEJFQzYsLyogMHg0OC0weDRGICovCisJMHhCRUM3LDB4QkVDOCwweEJFQzksMHhCRUNBLDB4QkVDQiwweEJFQ0MsMHhCRUNELDB4QkVDRSwvKiAweDUwLTB4NTcgKi8KKwkweEJFQ0YsMHhCRUQyLDB4QkVEMywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEJFRDUsMHhCRUQ2LDB4QkVEOSwweEJFREEsMHhCRURCLDB4QkVEQywweEJFREQsLyogMHg2MC0weDY3ICovCisJMHhCRURFLDB4QkVERiwweEJFRTEsMHhCRUUyLDB4QkVFNiwweEJFRTcsMHhCRUU4LDB4QkVFOSwvKiAweDY4LTB4NkYgKi8KKwkweEJFRUEsMHhCRUVCLDB4QkVFRCwweEJFRUUsMHhCRUVGLDB4QkVGMCwweEJFRjEsMHhCRUYyLC8qIDB4NzAtMHg3NyAqLworCTB4QkVGMywweEJFRjQsMHhCRUY1LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhCRUY2LDB4QkVGNywweEJFRjgsMHhCRUY5LDB4QkVGQSwweEJFRkIsMHhCRUZDLC8qIDB4ODAtMHg4NyAqLworCTB4QkVGRCwweEJFRkUsMHhCRUZGLDB4QkYwMCwweEJGMDIsMHhCRjAzLDB4QkYwNCwweEJGMDUsLyogMHg4OC0weDhGICovCisJMHhCRjA2LDB4QkYwNywweEJGMEEsMHhCRjBCLDB4QkYwQywweEJGMEQsMHhCRjBFLDB4QkYwRiwvKiAweDkwLTB4OTcgKi8KKwkweEJGMTAsMHhCRjExLDB4QkYxMiwweEJGMTMsMHhCRjE0LDB4QkYxNSwweEJGMTYsMHhCRjE3LC8qIDB4OTgtMHg5RiAqLworCTB4QkYxQSwweEJGMUUsMHhCRjFGLDB4QkYyMCwweEJGMjEsMHhCRjIyLDB4QkYyMywweEJGMjQsLyogMHhBMC0weEE3ICovCisJMHhCRjI1LDB4QkYyNiwweEJGMjcsMHhCRjI4LDB4QkYyOSwweEJGMkEsMHhCRjJCLDB4QkYyQywvKiAweEE4LTB4QUYgKi8KKwkweEJGMkQsMHhCRjJFLDB4QkYyRiwweEJGMzAsMHhCRjMxLDB4QkYzMiwweEJGMzMsMHhCRjM0LC8qIDB4QjAtMHhCNyAqLworCTB4QkYzNSwweEJGMzYsMHhCRjM3LDB4QkYzOCwweEJGMzksMHhCRjNBLDB4QkYzQiwweEJGM0MsLyogMHhCOC0weEJGICovCisJMHhCRjNELDB4QkYzRSwweEJGM0YsMHhCRjQyLDB4QkY0MywweEJGNDUsMHhCRjQ2LDB4QkY0NywvKiAweEMwLTB4QzcgKi8KKwkweEJGNDksMHhCRjRBLDB4QkY0QiwweEJGNEMsMHhCRjRELDB4QkY0RSwweEJGNEYsMHhCRjUyLC8qIDB4QzgtMHhDRiAqLworCTB4QkY1MywweEJGNTQsMHhCRjU2LDB4QkY1NywweEJGNTgsMHhCRjU5LDB4QkY1QSwweEJGNUIsLyogMHhEMC0weEQ3ICovCisJMHhCRjVDLDB4QkY1RCwweEJGNUUsMHhCRjVGLDB4QkY2MCwweEJGNjEsMHhCRjYyLDB4QkY2MywvKiAweEQ4LTB4REYgKi8KKwkweEJGNjQsMHhCRjY1LDB4QkY2NiwweEJGNjcsMHhCRjY4LDB4QkY2OSwweEJGNkEsMHhCRjZCLC8qIDB4RTAtMHhFNyAqLworCTB4QkY2QywweEJGNkQsMHhCRjZFLDB4QkY2RiwweEJGNzAsMHhCRjcxLDB4QkY3MiwweEJGNzMsLyogMHhFOC0weEVGICovCisJMHhCRjc0LDB4QkY3NSwweEJGNzYsMHhCRjc3LDB4QkY3OCwweEJGNzksMHhCRjdBLDB4QkY3QiwvKiAweEYwLTB4RjcgKi8KKwkweEJGN0MsMHhCRjdELDB4QkY3RSwweEJGN0YsMHhCRjgwLDB4QkY4MSwweEJGODIsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzk3WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEJGODMsMHhCRjg0LDB4QkY4NSwweEJGODYsMHhCRjg3LDB4QkY4OCwweEJGODksLyogMHg0MC0weDQ3ICovCisJMHhCRjhBLDB4QkY4QiwweEJGOEMsMHhCRjhELDB4QkY4RSwweEJGOEYsMHhCRjkwLDB4QkY5MSwvKiAweDQ4LTB4NEYgKi8KKwkweEJGOTIsMHhCRjkzLDB4QkY5NSwweEJGOTYsMHhCRjk3LDB4QkY5OCwweEJGOTksMHhCRjlBLC8qIDB4NTAtMHg1NyAqLworCTB4QkY5QiwweEJGOUMsMHhCRjlELDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QkY5RSwweEJGOUYsMHhCRkEwLDB4QkZBMSwweEJGQTIsMHhCRkEzLDB4QkZBNCwvKiAweDYwLTB4NjcgKi8KKwkweEJGQTUsMHhCRkE2LDB4QkZBNywweEJGQTgsMHhCRkE5LDB4QkZBQSwweEJGQUIsMHhCRkFDLC8qIDB4NjgtMHg2RiAqLworCTB4QkZBRCwweEJGQUUsMHhCRkFGLDB4QkZCMSwweEJGQjIsMHhCRkIzLDB4QkZCNCwweEJGQjUsLyogMHg3MC0weDc3ICovCisJMHhCRkI2LDB4QkZCNywweEJGQjgsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEJGQjksMHhCRkJBLDB4QkZCQiwweEJGQkMsMHhCRkJELDB4QkZCRSwweEJGQkYsLyogMHg4MC0weDg3ICovCisJMHhCRkMwLDB4QkZDMSwweEJGQzIsMHhCRkMzLDB4QkZDNCwweEJGQzYsMHhCRkM3LDB4QkZDOCwvKiAweDg4LTB4OEYgKi8KKwkweEJGQzksMHhCRkNBLDB4QkZDQiwweEJGQ0UsMHhCRkNGLDB4QkZEMSwweEJGRDIsMHhCRkQzLC8qIDB4OTAtMHg5NyAqLworCTB4QkZENSwweEJGRDYsMHhCRkQ3LDB4QkZEOCwweEJGRDksMHhCRkRBLDB4QkZEQiwweEJGREQsLyogMHg5OC0weDlGICovCisJMHhCRkRFLDB4QkZFMCwweEJGRTIsMHhCRkUzLDB4QkZFNCwweEJGRTUsMHhCRkU2LDB4QkZFNywvKiAweEEwLTB4QTcgKi8KKwkweEJGRTgsMHhCRkU5LDB4QkZFQSwweEJGRUIsMHhCRkVDLDB4QkZFRCwweEJGRUUsMHhCRkVGLC8qIDB4QTgtMHhBRiAqLworCTB4QkZGMCwweEJGRjEsMHhCRkYyLDB4QkZGMywweEJGRjQsMHhCRkY1LDB4QkZGNiwweEJGRjcsLyogMHhCMC0weEI3ICovCisJMHhCRkY4LDB4QkZGOSwweEJGRkEsMHhCRkZCLDB4QkZGQywweEJGRkQsMHhCRkZFLDB4QkZGRiwvKiAweEI4LTB4QkYgKi8KKwkweEMwMDAsMHhDMDAxLDB4QzAwMiwweEMwMDMsMHhDMDA0LDB4QzAwNSwweEMwMDYsMHhDMDA3LC8qIDB4QzAtMHhDNyAqLworCTB4QzAwOCwweEMwMDksMHhDMDBBLDB4QzAwQiwweEMwMEMsMHhDMDBELDB4QzAwRSwweEMwMEYsLyogMHhDOC0weENGICovCisJMHhDMDEwLDB4QzAxMSwweEMwMTIsMHhDMDEzLDB4QzAxNCwweEMwMTUsMHhDMDE2LDB4QzAxNywvKiAweEQwLTB4RDcgKi8KKwkweEMwMTgsMHhDMDE5LDB4QzAxQSwweEMwMUIsMHhDMDFDLDB4QzAxRCwweEMwMUUsMHhDMDFGLC8qIDB4RDgtMHhERiAqLworCTB4QzAyMCwweEMwMjEsMHhDMDIyLDB4QzAyMywweEMwMjQsMHhDMDI1LDB4QzAyNiwweEMwMjcsLyogMHhFMC0weEU3ICovCisJMHhDMDI4LDB4QzAyOSwweEMwMkEsMHhDMDJCLDB4QzAyQywweEMwMkQsMHhDMDJFLDB4QzAyRiwvKiAweEU4LTB4RUYgKi8KKwkweEMwMzAsMHhDMDMxLDB4QzAzMiwweEMwMzMsMHhDMDM0LDB4QzAzNSwweEMwMzYsMHhDMDM3LC8qIDB4RjAtMHhGNyAqLworCTB4QzAzOCwweEMwMzksMHhDMDNBLDB4QzAzQiwweEMwM0QsMHhDMDNFLDB4QzAzRiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOThbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QzA0MCwweEMwNDEsMHhDMDQyLDB4QzA0MywweEMwNDQsMHhDMDQ1LDB4QzA0NiwvKiAweDQwLTB4NDcgKi8KKwkweEMwNDcsMHhDMDQ4LDB4QzA0OSwweEMwNEEsMHhDMDRCLDB4QzA0QywweEMwNEQsMHhDMDRFLC8qIDB4NDgtMHg0RiAqLworCTB4QzA0RiwweEMwNTAsMHhDMDUyLDB4QzA1MywweEMwNTQsMHhDMDU1LDB4QzA1NiwweEMwNTcsLyogMHg1MC0weDU3ICovCisJMHhDMDU5LDB4QzA1QSwweEMwNUIsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhDMDVELDB4QzA1RSwweEMwNUYsMHhDMDYxLDB4QzA2MiwweEMwNjMsMHhDMDY0LC8qIDB4NjAtMHg2NyAqLworCTB4QzA2NSwweEMwNjYsMHhDMDY3LDB4QzA2QSwweEMwNkIsMHhDMDZDLDB4QzA2RCwweEMwNkUsLyogMHg2OC0weDZGICovCisJMHhDMDZGLDB4QzA3MCwweEMwNzEsMHhDMDcyLDB4QzA3MywweEMwNzQsMHhDMDc1LDB4QzA3NiwvKiAweDcwLTB4NzcgKi8KKwkweEMwNzcsMHhDMDc4LDB4QzA3OSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QzA3QSwweEMwN0IsMHhDMDdDLDB4QzA3RCwweEMwN0UsMHhDMDdGLDB4QzA4MCwvKiAweDgwLTB4ODcgKi8KKwkweEMwODEsMHhDMDgyLDB4QzA4MywweEMwODQsMHhDMDg1LDB4QzA4NiwweEMwODcsMHhDMDg4LC8qIDB4ODgtMHg4RiAqLworCTB4QzA4OSwweEMwOEEsMHhDMDhCLDB4QzA4QywweEMwOEQsMHhDMDhFLDB4QzA4RiwweEMwOTIsLyogMHg5MC0weDk3ICovCisJMHhDMDkzLDB4QzA5NSwweEMwOTYsMHhDMDk3LDB4QzA5OSwweEMwOUEsMHhDMDlCLDB4QzA5QywvKiAweDk4LTB4OUYgKi8KKwkweEMwOUQsMHhDMDlFLDB4QzA5RiwweEMwQTIsMHhDMEE0LDB4QzBBNiwweEMwQTcsMHhDMEE4LC8qIDB4QTAtMHhBNyAqLworCTB4QzBBOSwweEMwQUEsMHhDMEFCLDB4QzBBRSwweEMwQjEsMHhDMEIyLDB4QzBCNywweEMwQjgsLyogMHhBOC0weEFGICovCisJMHhDMEI5LDB4QzBCQSwweEMwQkIsMHhDMEJFLDB4QzBDMiwweEMwQzMsMHhDMEM0LDB4QzBDNiwvKiAweEIwLTB4QjcgKi8KKwkweEMwQzcsMHhDMENBLDB4QzBDQiwweEMwQ0QsMHhDMENFLDB4QzBDRiwweEMwRDEsMHhDMEQyLC8qIDB4QjgtMHhCRiAqLworCTB4QzBEMywweEMwRDQsMHhDMEQ1LDB4QzBENiwweEMwRDcsMHhDMERBLDB4QzBERSwweEMwREYsLyogMHhDMC0weEM3ICovCisJMHhDMEUwLDB4QzBFMSwweEMwRTIsMHhDMEUzLDB4QzBFNiwweEMwRTcsMHhDMEU5LDB4QzBFQSwvKiAweEM4LTB4Q0YgKi8KKwkweEMwRUIsMHhDMEVELDB4QzBFRSwweEMwRUYsMHhDMEYwLDB4QzBGMSwweEMwRjIsMHhDMEYzLC8qIDB4RDAtMHhENyAqLworCTB4QzBGNiwweEMwRjgsMHhDMEZBLDB4QzBGQiwweEMwRkMsMHhDMEZELDB4QzBGRSwweEMwRkYsLyogMHhEOC0weERGICovCisJMHhDMTAxLDB4QzEwMiwweEMxMDMsMHhDMTA1LDB4QzEwNiwweEMxMDcsMHhDMTA5LDB4QzEwQSwvKiAweEUwLTB4RTcgKi8KKwkweEMxMEIsMHhDMTBDLDB4QzEwRCwweEMxMEUsMHhDMTBGLDB4QzExMSwweEMxMTIsMHhDMTEzLC8qIDB4RTgtMHhFRiAqLworCTB4QzExNCwweEMxMTYsMHhDMTE3LDB4QzExOCwweEMxMTksMHhDMTFBLDB4QzExQiwweEMxMjEsLyogMHhGMC0weEY3ICovCisJMHhDMTIyLDB4QzEyNSwweEMxMjgsMHhDMTI5LDB4QzEyQSwweEMxMkIsMHhDMTJFLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85OVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDMTMyLDB4QzEzMywweEMxMzQsMHhDMTM1LDB4QzEzNywweEMxM0EsMHhDMTNCLC8qIDB4NDAtMHg0NyAqLworCTB4QzEzRCwweEMxM0UsMHhDMTNGLDB4QzE0MSwweEMxNDIsMHhDMTQzLDB4QzE0NCwweEMxNDUsLyogMHg0OC0weDRGICovCisJMHhDMTQ2LDB4QzE0NywweEMxNEEsMHhDMTRFLDB4QzE0RiwweEMxNTAsMHhDMTUxLDB4QzE1MiwvKiAweDUwLTB4NTcgKi8KKwkweEMxNTMsMHhDMTU2LDB4QzE1NywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEMxNTksMHhDMTVBLDB4QzE1QiwweEMxNUQsMHhDMTVFLDB4QzE1RiwweEMxNjAsLyogMHg2MC0weDY3ICovCisJMHhDMTYxLDB4QzE2MiwweEMxNjMsMHhDMTY2LDB4QzE2QSwweEMxNkIsMHhDMTZDLDB4QzE2RCwvKiAweDY4LTB4NkYgKi8KKwkweEMxNkUsMHhDMTZGLDB4QzE3MSwweEMxNzIsMHhDMTczLDB4QzE3NSwweEMxNzYsMHhDMTc3LC8qIDB4NzAtMHg3NyAqLworCTB4QzE3OSwweEMxN0EsMHhDMTdCLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhDMTdDLDB4QzE3RCwweEMxN0UsMHhDMTdGLDB4QzE4MCwweEMxODEsMHhDMTgyLC8qIDB4ODAtMHg4NyAqLworCTB4QzE4MywweEMxODQsMHhDMTg2LDB4QzE4NywweEMxODgsMHhDMTg5LDB4QzE4QSwweEMxOEIsLyogMHg4OC0weDhGICovCisJMHhDMThGLDB4QzE5MSwweEMxOTIsMHhDMTkzLDB4QzE5NSwweEMxOTcsMHhDMTk4LDB4QzE5OSwvKiAweDkwLTB4OTcgKi8KKwkweEMxOUEsMHhDMTlCLDB4QzE5RSwweEMxQTAsMHhDMUEyLDB4QzFBMywweEMxQTQsMHhDMUE2LC8qIDB4OTgtMHg5RiAqLworCTB4QzFBNywweEMxQUEsMHhDMUFCLDB4QzFBRCwweEMxQUUsMHhDMUFGLDB4QzFCMSwweEMxQjIsLyogMHhBMC0weEE3ICovCisJMHhDMUIzLDB4QzFCNCwweEMxQjUsMHhDMUI2LDB4QzFCNywweEMxQjgsMHhDMUI5LDB4QzFCQSwvKiAweEE4LTB4QUYgKi8KKwkweEMxQkIsMHhDMUJDLDB4QzFCRSwweEMxQkYsMHhDMUMwLDB4QzFDMSwweEMxQzIsMHhDMUMzLC8qIDB4QjAtMHhCNyAqLworCTB4QzFDNSwweEMxQzYsMHhDMUM3LDB4QzFDOSwweEMxQ0EsMHhDMUNCLDB4QzFDRCwweEMxQ0UsLyogMHhCOC0weEJGICovCisJMHhDMUNGLDB4QzFEMCwweEMxRDEsMHhDMUQyLDB4QzFEMywweEMxRDUsMHhDMUQ2LDB4QzFEOSwvKiAweEMwLTB4QzcgKi8KKwkweEMxREEsMHhDMURCLDB4QzFEQywweEMxREQsMHhDMURFLDB4QzFERiwweEMxRTEsMHhDMUUyLC8qIDB4QzgtMHhDRiAqLworCTB4QzFFMywweEMxRTUsMHhDMUU2LDB4QzFFNywweEMxRTksMHhDMUVBLDB4QzFFQiwweEMxRUMsLyogMHhEMC0weEQ3ICovCisJMHhDMUVELDB4QzFFRSwweEMxRUYsMHhDMUYyLDB4QzFGNCwweEMxRjUsMHhDMUY2LDB4QzFGNywvKiAweEQ4LTB4REYgKi8KKwkweEMxRjgsMHhDMUY5LDB4QzFGQSwweEMxRkIsMHhDMUZFLDB4QzFGRiwweEMyMDEsMHhDMjAyLC8qIDB4RTAtMHhFNyAqLworCTB4QzIwMywweEMyMDUsMHhDMjA2LDB4QzIwNywweEMyMDgsMHhDMjA5LDB4QzIwQSwweEMyMEIsLyogMHhFOC0weEVGICovCisJMHhDMjBFLDB4QzIxMCwweEMyMTIsMHhDMjEzLDB4QzIxNCwweEMyMTUsMHhDMjE2LDB4QzIxNywvKiAweEYwLTB4RjcgKi8KKwkweEMyMUEsMHhDMjFCLDB4QzIxRCwweEMyMUUsMHhDMjIxLDB4QzIyMiwweEMyMjMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzlBWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEMyMjQsMHhDMjI1LDB4QzIyNiwweEMyMjcsMHhDMjJBLDB4QzIyQywweEMyMkUsLyogMHg0MC0weDQ3ICovCisJMHhDMjMwLDB4QzIzMywweEMyMzUsMHhDMjM2LDB4QzIzNywweEMyMzgsMHhDMjM5LDB4QzIzQSwvKiAweDQ4LTB4NEYgKi8KKwkweEMyM0IsMHhDMjNDLDB4QzIzRCwweEMyM0UsMHhDMjNGLDB4QzI0MCwweEMyNDEsMHhDMjQyLC8qIDB4NTAtMHg1NyAqLworCTB4QzI0MywweEMyNDQsMHhDMjQ1LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QzI0NiwweEMyNDcsMHhDMjQ5LDB4QzI0QSwweEMyNEIsMHhDMjRDLDB4QzI0RCwvKiAweDYwLTB4NjcgKi8KKwkweEMyNEUsMHhDMjRGLDB4QzI1MiwweEMyNTMsMHhDMjU1LDB4QzI1NiwweEMyNTcsMHhDMjU5LC8qIDB4NjgtMHg2RiAqLworCTB4QzI1QSwweEMyNUIsMHhDMjVDLDB4QzI1RCwweEMyNUUsMHhDMjVGLDB4QzI2MSwweEMyNjIsLyogMHg3MC0weDc3ICovCisJMHhDMjYzLDB4QzI2NCwweEMyNjYsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEMyNjcsMHhDMjY4LDB4QzI2OSwweEMyNkEsMHhDMjZCLDB4QzI2RSwweEMyNkYsLyogMHg4MC0weDg3ICovCisJMHhDMjcxLDB4QzI3MiwweEMyNzMsMHhDMjc1LDB4QzI3NiwweEMyNzcsMHhDMjc4LDB4QzI3OSwvKiAweDg4LTB4OEYgKi8KKwkweEMyN0EsMHhDMjdCLDB4QzI3RSwweEMyODAsMHhDMjgyLDB4QzI4MywweEMyODQsMHhDMjg1LC8qIDB4OTAtMHg5NyAqLworCTB4QzI4NiwweEMyODcsMHhDMjhBLDB4QzI4QiwweEMyOEMsMHhDMjhELDB4QzI4RSwweEMyOEYsLyogMHg5OC0weDlGICovCisJMHhDMjkxLDB4QzI5MiwweEMyOTMsMHhDMjk0LDB4QzI5NSwweEMyOTYsMHhDMjk3LDB4QzI5OSwvKiAweEEwLTB4QTcgKi8KKwkweEMyOUEsMHhDMjlDLDB4QzI5RSwweEMyOUYsMHhDMkEwLDB4QzJBMSwweEMyQTIsMHhDMkEzLC8qIDB4QTgtMHhBRiAqLworCTB4QzJBNiwweEMyQTcsMHhDMkE5LDB4QzJBQSwweEMyQUIsMHhDMkFFLDB4QzJBRiwweEMyQjAsLyogMHhCMC0weEI3ICovCisJMHhDMkIxLDB4QzJCMiwweEMyQjMsMHhDMkI2LDB4QzJCOCwweEMyQkEsMHhDMkJCLDB4QzJCQywvKiAweEI4LTB4QkYgKi8KKwkweEMyQkQsMHhDMkJFLDB4QzJCRiwweEMyQzAsMHhDMkMxLDB4QzJDMiwweEMyQzMsMHhDMkM0LC8qIDB4QzAtMHhDNyAqLworCTB4QzJDNSwweEMyQzYsMHhDMkM3LDB4QzJDOCwweEMyQzksMHhDMkNBLDB4QzJDQiwweEMyQ0MsLyogMHhDOC0weENGICovCisJMHhDMkNELDB4QzJDRSwweEMyQ0YsMHhDMkQwLDB4QzJEMSwweEMyRDIsMHhDMkQzLDB4QzJENCwvKiAweEQwLTB4RDcgKi8KKwkweEMyRDUsMHhDMkQ2LDB4QzJENywweEMyRDgsMHhDMkQ5LDB4QzJEQSwweEMyREIsMHhDMkRFLC8qIDB4RDgtMHhERiAqLworCTB4QzJERiwweEMyRTEsMHhDMkUyLDB4QzJFNSwweEMyRTYsMHhDMkU3LDB4QzJFOCwweEMyRTksLyogMHhFMC0weEU3ICovCisJMHhDMkVBLDB4QzJFRSwweEMyRjAsMHhDMkYyLDB4QzJGMywweEMyRjQsMHhDMkY1LDB4QzJGNywvKiAweEU4LTB4RUYgKi8KKwkweEMyRkEsMHhDMkZELDB4QzJGRSwweEMyRkYsMHhDMzAxLDB4QzMwMiwweEMzMDMsMHhDMzA0LC8qIDB4RjAtMHhGNyAqLworCTB4QzMwNSwweEMzMDYsMHhDMzA3LDB4QzMwQSwweEMzMEIsMHhDMzBFLDB4QzMwRiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOUJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QzMxMCwweEMzMTEsMHhDMzEyLDB4QzMxNiwweEMzMTcsMHhDMzE5LDB4QzMxQSwvKiAweDQwLTB4NDcgKi8KKwkweEMzMUIsMHhDMzFELDB4QzMxRSwweEMzMUYsMHhDMzIwLDB4QzMyMSwweEMzMjIsMHhDMzIzLC8qIDB4NDgtMHg0RiAqLworCTB4QzMyNiwweEMzMjcsMHhDMzJBLDB4QzMyQiwweEMzMkMsMHhDMzJELDB4QzMyRSwweEMzMkYsLyogMHg1MC0weDU3ICovCisJMHhDMzMwLDB4QzMzMSwweEMzMzIsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhDMzMzLDB4QzMzNCwweEMzMzUsMHhDMzM2LDB4QzMzNywweEMzMzgsMHhDMzM5LC8qIDB4NjAtMHg2NyAqLworCTB4QzMzQSwweEMzM0IsMHhDMzNDLDB4QzMzRCwweEMzM0UsMHhDMzNGLDB4QzM0MCwweEMzNDEsLyogMHg2OC0weDZGICovCisJMHhDMzQyLDB4QzM0MywweEMzNDQsMHhDMzQ2LDB4QzM0NywweEMzNDgsMHhDMzQ5LDB4QzM0QSwvKiAweDcwLTB4NzcgKi8KKwkweEMzNEIsMHhDMzRDLDB4QzM0RCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QzM0RSwweEMzNEYsMHhDMzUwLDB4QzM1MSwweEMzNTIsMHhDMzUzLDB4QzM1NCwvKiAweDgwLTB4ODcgKi8KKwkweEMzNTUsMHhDMzU2LDB4QzM1NywweEMzNTgsMHhDMzU5LDB4QzM1QSwweEMzNUIsMHhDMzVDLC8qIDB4ODgtMHg4RiAqLworCTB4QzM1RCwweEMzNUUsMHhDMzVGLDB4QzM2MCwweEMzNjEsMHhDMzYyLDB4QzM2MywweEMzNjQsLyogMHg5MC0weDk3ICovCisJMHhDMzY1LDB4QzM2NiwweEMzNjcsMHhDMzZBLDB4QzM2QiwweEMzNkQsMHhDMzZFLDB4QzM2RiwvKiAweDk4LTB4OUYgKi8KKwkweEMzNzEsMHhDMzczLDB4QzM3NCwweEMzNzUsMHhDMzc2LDB4QzM3NywweEMzN0EsMHhDMzdCLC8qIDB4QTAtMHhBNyAqLworCTB4QzM3RSwweEMzN0YsMHhDMzgwLDB4QzM4MSwweEMzODIsMHhDMzgzLDB4QzM4NSwweEMzODYsLyogMHhBOC0weEFGICovCisJMHhDMzg3LDB4QzM4OSwweEMzOEEsMHhDMzhCLDB4QzM4RCwweEMzOEUsMHhDMzhGLDB4QzM5MCwvKiAweEIwLTB4QjcgKi8KKwkweEMzOTEsMHhDMzkyLDB4QzM5MywweEMzOTQsMHhDMzk1LDB4QzM5NiwweEMzOTcsMHhDMzk4LC8qIDB4QjgtMHhCRiAqLworCTB4QzM5OSwweEMzOUEsMHhDMzlCLDB4QzM5QywweEMzOUQsMHhDMzlFLDB4QzM5RiwweEMzQTAsLyogMHhDMC0weEM3ICovCisJMHhDM0ExLDB4QzNBMiwweEMzQTMsMHhDM0E0LDB4QzNBNSwweEMzQTYsMHhDM0E3LDB4QzNBOCwvKiAweEM4LTB4Q0YgKi8KKwkweEMzQTksMHhDM0FBLDB4QzNBQiwweEMzQUMsMHhDM0FELDB4QzNBRSwweEMzQUYsMHhDM0IwLC8qIDB4RDAtMHhENyAqLworCTB4QzNCMSwweEMzQjIsMHhDM0IzLDB4QzNCNCwweEMzQjUsMHhDM0I2LDB4QzNCNywweEMzQjgsLyogMHhEOC0weERGICovCisJMHhDM0I5LDB4QzNCQSwweEMzQkIsMHhDM0JDLDB4QzNCRCwweEMzQkUsMHhDM0JGLDB4QzNDMSwvKiAweEUwLTB4RTcgKi8KKwkweEMzQzIsMHhDM0MzLDB4QzNDNCwweEMzQzUsMHhDM0M2LDB4QzNDNywweEMzQzgsMHhDM0M5LC8qIDB4RTgtMHhFRiAqLworCTB4QzNDQSwweEMzQ0IsMHhDM0NDLDB4QzNDRCwweEMzQ0UsMHhDM0NGLDB4QzNEMCwweEMzRDEsLyogMHhGMC0weEY3ICovCisJMHhDM0QyLDB4QzNEMywweEMzRDQsMHhDM0Q1LDB4QzNENiwweEMzRDcsMHhDM0RBLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85Q1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDM0RCLDB4QzNERCwweEMzREUsMHhDM0UxLDB4QzNFMywweEMzRTQsMHhDM0U1LC8qIDB4NDAtMHg0NyAqLworCTB4QzNFNiwweEMzRTcsMHhDM0VBLDB4QzNFQiwweEMzRUMsMHhDM0VFLDB4QzNFRiwweEMzRjAsLyogMHg0OC0weDRGICovCisJMHhDM0YxLDB4QzNGMiwweEMzRjMsMHhDM0Y2LDB4QzNGNywweEMzRjksMHhDM0ZBLDB4QzNGQiwvKiAweDUwLTB4NTcgKi8KKwkweEMzRkMsMHhDM0ZELDB4QzNGRSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEMzRkYsMHhDNDAwLDB4QzQwMSwweEM0MDIsMHhDNDAzLDB4QzQwNCwweEM0MDUsLyogMHg2MC0weDY3ICovCisJMHhDNDA2LDB4QzQwNywweEM0MDksMHhDNDBBLDB4QzQwQiwweEM0MEMsMHhDNDBELDB4QzQwRSwvKiAweDY4LTB4NkYgKi8KKwkweEM0MEYsMHhDNDExLDB4QzQxMiwweEM0MTMsMHhDNDE0LDB4QzQxNSwweEM0MTYsMHhDNDE3LC8qIDB4NzAtMHg3NyAqLworCTB4QzQxOCwweEM0MTksMHhDNDFBLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhDNDFCLDB4QzQxQywweEM0MUQsMHhDNDFFLDB4QzQxRiwweEM0MjAsMHhDNDIxLC8qIDB4ODAtMHg4NyAqLworCTB4QzQyMiwweEM0MjMsMHhDNDI1LDB4QzQyNiwweEM0MjcsMHhDNDI4LDB4QzQyOSwweEM0MkEsLyogMHg4OC0weDhGICovCisJMHhDNDJCLDB4QzQyRCwweEM0MkUsMHhDNDJGLDB4QzQzMSwweEM0MzIsMHhDNDMzLDB4QzQzNSwvKiAweDkwLTB4OTcgKi8KKwkweEM0MzYsMHhDNDM3LDB4QzQzOCwweEM0MzksMHhDNDNBLDB4QzQzQiwweEM0M0UsMHhDNDNGLC8qIDB4OTgtMHg5RiAqLworCTB4QzQ0MCwweEM0NDEsMHhDNDQyLDB4QzQ0MywweEM0NDQsMHhDNDQ1LDB4QzQ0NiwweEM0NDcsLyogMHhBMC0weEE3ICovCisJMHhDNDQ5LDB4QzQ0QSwweEM0NEIsMHhDNDRDLDB4QzQ0RCwweEM0NEUsMHhDNDRGLDB4QzQ1MCwvKiAweEE4LTB4QUYgKi8KKwkweEM0NTEsMHhDNDUyLDB4QzQ1MywweEM0NTQsMHhDNDU1LDB4QzQ1NiwweEM0NTcsMHhDNDU4LC8qIDB4QjAtMHhCNyAqLworCTB4QzQ1OSwweEM0NUEsMHhDNDVCLDB4QzQ1QywweEM0NUQsMHhDNDVFLDB4QzQ1RiwweEM0NjAsLyogMHhCOC0weEJGICovCisJMHhDNDYxLDB4QzQ2MiwweEM0NjMsMHhDNDY2LDB4QzQ2NywweEM0NjksMHhDNDZBLDB4QzQ2QiwvKiAweEMwLTB4QzcgKi8KKwkweEM0NkQsMHhDNDZFLDB4QzQ2RiwweEM0NzAsMHhDNDcxLDB4QzQ3MiwweEM0NzMsMHhDNDc2LC8qIDB4QzgtMHhDRiAqLworCTB4QzQ3NywweEM0NzgsMHhDNDdBLDB4QzQ3QiwweEM0N0MsMHhDNDdELDB4QzQ3RSwweEM0N0YsLyogMHhEMC0weEQ3ICovCisJMHhDNDgxLDB4QzQ4MiwweEM0ODMsMHhDNDg0LDB4QzQ4NSwweEM0ODYsMHhDNDg3LDB4QzQ4OCwvKiAweEQ4LTB4REYgKi8KKwkweEM0ODksMHhDNDhBLDB4QzQ4QiwweEM0OEMsMHhDNDhELDB4QzQ4RSwweEM0OEYsMHhDNDkwLC8qIDB4RTAtMHhFNyAqLworCTB4QzQ5MSwweEM0OTIsMHhDNDkzLDB4QzQ5NSwweEM0OTYsMHhDNDk3LDB4QzQ5OCwweEM0OTksLyogMHhFOC0weEVGICovCisJMHhDNDlBLDB4QzQ5QiwweEM0OUQsMHhDNDlFLDB4QzQ5RiwweEM0QTAsMHhDNEExLDB4QzRBMiwvKiAweEYwLTB4RjcgKi8KKwkweEM0QTMsMHhDNEE0LDB4QzRBNSwweEM0QTYsMHhDNEE3LDB4QzRBOCwweEM0QTksMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzlEWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEM0QUEsMHhDNEFCLDB4QzRBQywweEM0QUQsMHhDNEFFLDB4QzRBRiwweEM0QjAsLyogMHg0MC0weDQ3ICovCisJMHhDNEIxLDB4QzRCMiwweEM0QjMsMHhDNEI0LDB4QzRCNSwweEM0QjYsMHhDNEI3LDB4QzRCOSwvKiAweDQ4LTB4NEYgKi8KKwkweEM0QkEsMHhDNEJCLDB4QzRCRCwweEM0QkUsMHhDNEJGLDB4QzRDMCwweEM0QzEsMHhDNEMyLC8qIDB4NTAtMHg1NyAqLworCTB4QzRDMywweEM0QzQsMHhDNEM1LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QzRDNiwweEM0QzcsMHhDNEM4LDB4QzRDOSwweEM0Q0EsMHhDNENCLDB4QzRDQywvKiAweDYwLTB4NjcgKi8KKwkweEM0Q0QsMHhDNENFLDB4QzRDRiwweEM0RDAsMHhDNEQxLDB4QzREMiwweEM0RDMsMHhDNEQ0LC8qIDB4NjgtMHg2RiAqLworCTB4QzRENSwweEM0RDYsMHhDNEQ3LDB4QzREOCwweEM0RDksMHhDNERBLDB4QzREQiwweEM0REMsLyogMHg3MC0weDc3ICovCisJMHhDNERELDB4QzRERSwweEM0REYsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEM0RTAsMHhDNEUxLDB4QzRFMiwweEM0RTMsMHhDNEU0LDB4QzRFNSwweEM0RTYsLyogMHg4MC0weDg3ICovCisJMHhDNEU3LDB4QzRFOCwweEM0RUEsMHhDNEVCLDB4QzRFQywweEM0RUQsMHhDNEVFLDB4QzRFRiwvKiAweDg4LTB4OEYgKi8KKwkweEM0RjIsMHhDNEYzLDB4QzRGNSwweEM0RjYsMHhDNEY3LDB4QzRGOSwweEM0RkIsMHhDNEZDLC8qIDB4OTAtMHg5NyAqLworCTB4QzRGRCwweEM0RkUsMHhDNTAyLDB4QzUwMywweEM1MDQsMHhDNTA1LDB4QzUwNiwweEM1MDcsLyogMHg5OC0weDlGICovCisJMHhDNTA4LDB4QzUwOSwweEM1MEEsMHhDNTBCLDB4QzUwRCwweEM1MEUsMHhDNTBGLDB4QzUxMSwvKiAweEEwLTB4QTcgKi8KKwkweEM1MTIsMHhDNTEzLDB4QzUxNSwweEM1MTYsMHhDNTE3LDB4QzUxOCwweEM1MTksMHhDNTFBLC8qIDB4QTgtMHhBRiAqLworCTB4QzUxQiwweEM1MUQsMHhDNTFFLDB4QzUxRiwweEM1MjAsMHhDNTIxLDB4QzUyMiwweEM1MjMsLyogMHhCMC0weEI3ICovCisJMHhDNTI0LDB4QzUyNSwweEM1MjYsMHhDNTI3LDB4QzUyQSwweEM1MkIsMHhDNTJELDB4QzUyRSwvKiAweEI4LTB4QkYgKi8KKwkweEM1MkYsMHhDNTMxLDB4QzUzMiwweEM1MzMsMHhDNTM0LDB4QzUzNSwweEM1MzYsMHhDNTM3LC8qIDB4QzAtMHhDNyAqLworCTB4QzUzQSwweEM1M0MsMHhDNTNFLDB4QzUzRiwweEM1NDAsMHhDNTQxLDB4QzU0MiwweEM1NDMsLyogMHhDOC0weENGICovCisJMHhDNTQ2LDB4QzU0NywweEM1NEIsMHhDNTRGLDB4QzU1MCwweEM1NTEsMHhDNTUyLDB4QzU1NiwvKiAweEQwLTB4RDcgKi8KKwkweEM1NUEsMHhDNTVCLDB4QzU1QywweEM1NUYsMHhDNTYyLDB4QzU2MywweEM1NjUsMHhDNTY2LC8qIDB4RDgtMHhERiAqLworCTB4QzU2NywweEM1NjksMHhDNTZBLDB4QzU2QiwweEM1NkMsMHhDNTZELDB4QzU2RSwweEM1NkYsLyogMHhFMC0weEU3ICovCisJMHhDNTcyLDB4QzU3NiwweEM1NzcsMHhDNTc4LDB4QzU3OSwweEM1N0EsMHhDNTdCLDB4QzU3RSwvKiAweEU4LTB4RUYgKi8KKwkweEM1N0YsMHhDNTgxLDB4QzU4MiwweEM1ODMsMHhDNTg1LDB4QzU4NiwweEM1ODgsMHhDNTg5LC8qIDB4RjAtMHhGNyAqLworCTB4QzU4QSwweEM1OEIsMHhDNThFLDB4QzU5MCwweEM1OTIsMHhDNTkzLDB4QzU5NCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOUVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QzU5NiwweEM1OTksMHhDNTlBLDB4QzU5QiwweEM1OUQsMHhDNTlFLDB4QzU5RiwvKiAweDQwLTB4NDcgKi8KKwkweEM1QTEsMHhDNUEyLDB4QzVBMywweEM1QTQsMHhDNUE1LDB4QzVBNiwweEM1QTcsMHhDNUE4LC8qIDB4NDgtMHg0RiAqLworCTB4QzVBQSwweEM1QUIsMHhDNUFDLDB4QzVBRCwweEM1QUUsMHhDNUFGLDB4QzVCMCwweEM1QjEsLyogMHg1MC0weDU3ICovCisJMHhDNUIyLDB4QzVCMywweEM1QjYsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhDNUI3LDB4QzVCQSwweEM1QkYsMHhDNUMwLDB4QzVDMSwweEM1QzIsMHhDNUMzLC8qIDB4NjAtMHg2NyAqLworCTB4QzVDQiwweEM1Q0QsMHhDNUNGLDB4QzVEMiwweEM1RDMsMHhDNUQ1LDB4QzVENiwweEM1RDcsLyogMHg2OC0weDZGICovCisJMHhDNUQ5LDB4QzVEQSwweEM1REIsMHhDNURDLDB4QzVERCwweEM1REUsMHhDNURGLDB4QzVFMiwvKiAweDcwLTB4NzcgKi8KKwkweEM1RTQsMHhDNUU2LDB4QzVFNywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QzVFOCwweEM1RTksMHhDNUVBLDB4QzVFQiwweEM1RUYsMHhDNUYxLDB4QzVGMiwvKiAweDgwLTB4ODcgKi8KKwkweEM1RjMsMHhDNUY1LDB4QzVGOCwweEM1RjksMHhDNUZBLDB4QzVGQiwweEM2MDIsMHhDNjAzLC8qIDB4ODgtMHg4RiAqLworCTB4QzYwNCwweEM2MDksMHhDNjBBLDB4QzYwQiwweEM2MEQsMHhDNjBFLDB4QzYwRiwweEM2MTEsLyogMHg5MC0weDk3ICovCisJMHhDNjEyLDB4QzYxMywweEM2MTQsMHhDNjE1LDB4QzYxNiwweEM2MTcsMHhDNjFBLDB4QzYxRCwvKiAweDk4LTB4OUYgKi8KKwkweEM2MUUsMHhDNjFGLDB4QzYyMCwweEM2MjEsMHhDNjIyLDB4QzYyMywweEM2MjYsMHhDNjI3LC8qIDB4QTAtMHhBNyAqLworCTB4QzYyOSwweEM2MkEsMHhDNjJCLDB4QzYyRiwweEM2MzEsMHhDNjMyLDB4QzYzNiwweEM2MzgsLyogMHhBOC0weEFGICovCisJMHhDNjNBLDB4QzYzQywweEM2M0QsMHhDNjNFLDB4QzYzRiwweEM2NDIsMHhDNjQzLDB4QzY0NSwvKiAweEIwLTB4QjcgKi8KKwkweEM2NDYsMHhDNjQ3LDB4QzY0OSwweEM2NEEsMHhDNjRCLDB4QzY0QywweEM2NEQsMHhDNjRFLC8qIDB4QjgtMHhCRiAqLworCTB4QzY0RiwweEM2NTIsMHhDNjU2LDB4QzY1NywweEM2NTgsMHhDNjU5LDB4QzY1QSwweEM2NUIsLyogMHhDMC0weEM3ICovCisJMHhDNjVFLDB4QzY1RiwweEM2NjEsMHhDNjYyLDB4QzY2MywweEM2NjQsMHhDNjY1LDB4QzY2NiwvKiAweEM4LTB4Q0YgKi8KKwkweEM2NjcsMHhDNjY4LDB4QzY2OSwweEM2NkEsMHhDNjZCLDB4QzY2RCwweEM2NkUsMHhDNjcwLC8qIDB4RDAtMHhENyAqLworCTB4QzY3MiwweEM2NzMsMHhDNjc0LDB4QzY3NSwweEM2NzYsMHhDNjc3LDB4QzY3QSwweEM2N0IsLyogMHhEOC0weERGICovCisJMHhDNjdELDB4QzY3RSwweEM2N0YsMHhDNjgxLDB4QzY4MiwweEM2ODMsMHhDNjg0LDB4QzY4NSwvKiAweEUwLTB4RTcgKi8KKwkweEM2ODYsMHhDNjg3LDB4QzY4QSwweEM2OEMsMHhDNjhFLDB4QzY4RiwweEM2OTAsMHhDNjkxLC8qIDB4RTgtMHhFRiAqLworCTB4QzY5MiwweEM2OTMsMHhDNjk2LDB4QzY5NywweEM2OTksMHhDNjlBLDB4QzY5QiwweEM2OUQsLyogMHhGMC0weEY3ICovCisJMHhDNjlFLDB4QzY5RiwweEM2QTAsMHhDNkExLDB4QzZBMiwweEM2QTMsMHhDNkE2LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85RlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDNkE4LDB4QzZBQSwweEM2QUIsMHhDNkFDLDB4QzZBRCwweEM2QUUsMHhDNkFGLC8qIDB4NDAtMHg0NyAqLworCTB4QzZCMiwweEM2QjMsMHhDNkI1LDB4QzZCNiwweEM2QjcsMHhDNkJCLDB4QzZCQywweEM2QkQsLyogMHg0OC0weDRGICovCisJMHhDNkJFLDB4QzZCRiwweEM2QzIsMHhDNkM0LDB4QzZDNiwweEM2QzcsMHhDNkM4LDB4QzZDOSwvKiAweDUwLTB4NTcgKi8KKwkweEM2Q0EsMHhDNkNCLDB4QzZDRSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEM2Q0YsMHhDNkQxLDB4QzZEMiwweEM2RDMsMHhDNkQ1LDB4QzZENiwweEM2RDcsLyogMHg2MC0weDY3ICovCisJMHhDNkQ4LDB4QzZEOSwweEM2REEsMHhDNkRCLDB4QzZERSwweEM2REYsMHhDNkUyLDB4QzZFMywvKiAweDY4LTB4NkYgKi8KKwkweEM2RTQsMHhDNkU1LDB4QzZFNiwweEM2RTcsMHhDNkVBLDB4QzZFQiwweEM2RUQsMHhDNkVFLC8qIDB4NzAtMHg3NyAqLworCTB4QzZFRiwweEM2RjEsMHhDNkYyLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhDNkYzLDB4QzZGNCwweEM2RjUsMHhDNkY2LDB4QzZGNywweEM2RkEsMHhDNkZCLC8qIDB4ODAtMHg4NyAqLworCTB4QzZGQywweEM2RkUsMHhDNkZGLDB4QzcwMCwweEM3MDEsMHhDNzAyLDB4QzcwMywweEM3MDYsLyogMHg4OC0weDhGICovCisJMHhDNzA3LDB4QzcwOSwweEM3MEEsMHhDNzBCLDB4QzcwRCwweEM3MEUsMHhDNzBGLDB4QzcxMCwvKiAweDkwLTB4OTcgKi8KKwkweEM3MTEsMHhDNzEyLDB4QzcxMywweEM3MTYsMHhDNzE4LDB4QzcxQSwweEM3MUIsMHhDNzFDLC8qIDB4OTgtMHg5RiAqLworCTB4QzcxRCwweEM3MUUsMHhDNzFGLDB4QzcyMiwweEM3MjMsMHhDNzI1LDB4QzcyNiwweEM3MjcsLyogMHhBMC0weEE3ICovCisJMHhDNzI5LDB4QzcyQSwweEM3MkIsMHhDNzJDLDB4QzcyRCwweEM3MkUsMHhDNzJGLDB4QzczMiwvKiAweEE4LTB4QUYgKi8KKwkweEM3MzQsMHhDNzM2LDB4QzczOCwweEM3MzksMHhDNzNBLDB4QzczQiwweEM3M0UsMHhDNzNGLC8qIDB4QjAtMHhCNyAqLworCTB4Qzc0MSwweEM3NDIsMHhDNzQzLDB4Qzc0NSwweEM3NDYsMHhDNzQ3LDB4Qzc0OCwweEM3NDksLyogMHhCOC0weEJGICovCisJMHhDNzRCLDB4Qzc0RSwweEM3NTAsMHhDNzU5LDB4Qzc1QSwweEM3NUIsMHhDNzVELDB4Qzc1RSwvKiAweEMwLTB4QzcgKi8KKwkweEM3NUYsMHhDNzYxLDB4Qzc2MiwweEM3NjMsMHhDNzY0LDB4Qzc2NSwweEM3NjYsMHhDNzY3LC8qIDB4QzgtMHhDRiAqLworCTB4Qzc2OSwweEM3NkEsMHhDNzZDLDB4Qzc2RCwweEM3NkUsMHhDNzZGLDB4Qzc3MCwweEM3NzEsLyogMHhEMC0weEQ3ICovCisJMHhDNzcyLDB4Qzc3MywweEM3NzYsMHhDNzc3LDB4Qzc3OSwweEM3N0EsMHhDNzdCLDB4Qzc3RiwvKiAweEQ4LTB4REYgKi8KKwkweEM3ODAsMHhDNzgxLDB4Qzc4MiwweEM3ODYsMHhDNzhCLDB4Qzc4QywweEM3OEQsMHhDNzhGLC8qIDB4RTAtMHhFNyAqLworCTB4Qzc5MiwweEM3OTMsMHhDNzk1LDB4Qzc5OSwweEM3OUIsMHhDNzlDLDB4Qzc5RCwweEM3OUUsLyogMHhFOC0weEVGICovCisJMHhDNzlGLDB4QzdBMiwweEM3QTcsMHhDN0E4LDB4QzdBOSwweEM3QUEsMHhDN0FCLDB4QzdBRSwvKiAweEYwLTB4RjcgKi8KKwkweEM3QUYsMHhDN0IxLDB4QzdCMiwweEM3QjMsMHhDN0I1LDB4QzdCNiwweEM3QjcsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0EwWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEM3QjgsMHhDN0I5LDB4QzdCQSwweEM3QkIsMHhDN0JFLDB4QzdDMiwweEM3QzMsLyogMHg0MC0weDQ3ICovCisJMHhDN0M0LDB4QzdDNSwweEM3QzYsMHhDN0M3LDB4QzdDQSwweEM3Q0IsMHhDN0NELDB4QzdDRiwvKiAweDQ4LTB4NEYgKi8KKwkweEM3RDEsMHhDN0QyLDB4QzdEMywweEM3RDQsMHhDN0Q1LDB4QzdENiwweEM3RDcsMHhDN0Q5LC8qIDB4NTAtMHg1NyAqLworCTB4QzdEQSwweEM3REIsMHhDN0RDLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QzdERSwweEM3REYsMHhDN0UwLDB4QzdFMSwweEM3RTIsMHhDN0UzLDB4QzdFNSwvKiAweDYwLTB4NjcgKi8KKwkweEM3RTYsMHhDN0U3LDB4QzdFOSwweEM3RUEsMHhDN0VCLDB4QzdFRCwweEM3RUUsMHhDN0VGLC8qIDB4NjgtMHg2RiAqLworCTB4QzdGMCwweEM3RjEsMHhDN0YyLDB4QzdGMywweEM3RjQsMHhDN0Y1LDB4QzdGNiwweEM3RjcsLyogMHg3MC0weDc3ICovCisJMHhDN0Y4LDB4QzdGOSwweEM3RkEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEM3RkIsMHhDN0ZDLDB4QzdGRCwweEM3RkUsMHhDN0ZGLDB4QzgwMiwweEM4MDMsLyogMHg4MC0weDg3ICovCisJMHhDODA1LDB4QzgwNiwweEM4MDcsMHhDODA5LDB4QzgwQiwweEM4MEMsMHhDODBELDB4QzgwRSwvKiAweDg4LTB4OEYgKi8KKwkweEM4MEYsMHhDODEyLDB4QzgxNCwweEM4MTcsMHhDODE4LDB4QzgxOSwweEM4MUEsMHhDODFCLC8qIDB4OTAtMHg5NyAqLworCTB4QzgxRSwweEM4MUYsMHhDODIxLDB4QzgyMiwweEM4MjMsMHhDODI1LDB4QzgyNiwweEM4MjcsLyogMHg5OC0weDlGICovCisJMHhDODI4LDB4QzgyOSwweEM4MkEsMHhDODJCLDB4QzgyRSwweEM4MzAsMHhDODMyLDB4QzgzMywvKiAweEEwLTB4QTcgKi8KKwkweEM4MzQsMHhDODM1LDB4QzgzNiwweEM4MzcsMHhDODM5LDB4QzgzQSwweEM4M0IsMHhDODNELC8qIDB4QTgtMHhBRiAqLworCTB4QzgzRSwweEM4M0YsMHhDODQxLDB4Qzg0MiwweEM4NDMsMHhDODQ0LDB4Qzg0NSwweEM4NDYsLyogMHhCMC0weEI3ICovCisJMHhDODQ3LDB4Qzg0QSwweEM4NEIsMHhDODRFLDB4Qzg0RiwweEM4NTAsMHhDODUxLDB4Qzg1MiwvKiAweEI4LTB4QkYgKi8KKwkweEM4NTMsMHhDODU1LDB4Qzg1NiwweEM4NTcsMHhDODU4LDB4Qzg1OSwweEM4NUEsMHhDODVCLC8qIDB4QzAtMHhDNyAqLworCTB4Qzg1QywweEM4NUQsMHhDODVFLDB4Qzg1RiwweEM4NjAsMHhDODYxLDB4Qzg2MiwweEM4NjMsLyogMHhDOC0weENGICovCisJMHhDODY0LDB4Qzg2NSwweEM4NjYsMHhDODY3LDB4Qzg2OCwweEM4NjksMHhDODZBLDB4Qzg2QiwvKiAweEQwLTB4RDcgKi8KKwkweEM4NkMsMHhDODZELDB4Qzg2RSwweEM4NkYsMHhDODcyLDB4Qzg3MywweEM4NzUsMHhDODc2LC8qIDB4RDgtMHhERiAqLworCTB4Qzg3NywweEM4NzksMHhDODdCLDB4Qzg3QywweEM4N0QsMHhDODdFLDB4Qzg3RiwweEM4ODIsLyogMHhFMC0weEU3ICovCisJMHhDODg0LDB4Qzg4OCwweEM4ODksMHhDODhBLDB4Qzg4RSwweEM4OEYsMHhDODkwLDB4Qzg5MSwvKiAweEU4LTB4RUYgKi8KKwkweEM4OTIsMHhDODkzLDB4Qzg5NSwweEM4OTYsMHhDODk3LDB4Qzg5OCwweEM4OTksMHhDODlBLC8qIDB4RjAtMHhGNyAqLworCTB4Qzg5QiwweEM4OUMsMHhDODlFLDB4QzhBMCwweEM4QTIsMHhDOEEzLDB4QzhBNCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQTFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QzhBNSwweEM4QTYsMHhDOEE3LDB4QzhBOSwweEM4QUEsMHhDOEFCLDB4QzhBQywvKiAweDQwLTB4NDcgKi8KKwkweEM4QUQsMHhDOEFFLDB4QzhBRiwweEM4QjAsMHhDOEIxLDB4QzhCMiwweEM4QjMsMHhDOEI0LC8qIDB4NDgtMHg0RiAqLworCTB4QzhCNSwweEM4QjYsMHhDOEI3LDB4QzhCOCwweEM4QjksMHhDOEJBLDB4QzhCQiwweEM4QkUsLyogMHg1MC0weDU3ICovCisJMHhDOEJGLDB4QzhDMCwweEM4QzEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhDOEMyLDB4QzhDMywweEM4QzUsMHhDOEM2LDB4QzhDNywweEM4QzksMHhDOENBLC8qIDB4NjAtMHg2NyAqLworCTB4QzhDQiwweEM4Q0QsMHhDOENFLDB4QzhDRiwweEM4RDAsMHhDOEQxLDB4QzhEMiwweEM4RDMsLyogMHg2OC0weDZGICovCisJMHhDOEQ2LDB4QzhEOCwweEM4REEsMHhDOERCLDB4QzhEQywweEM4REQsMHhDOERFLDB4QzhERiwvKiAweDcwLTB4NzcgKi8KKwkweEM4RTIsMHhDOEUzLDB4QzhFNSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QzhFNiwweEM4RTcsMHhDOEU4LDB4QzhFOSwweEM4RUEsMHhDOEVCLDB4QzhFQywvKiAweDgwLTB4ODcgKi8KKwkweEM4RUQsMHhDOEVFLDB4QzhFRiwweEM4RjAsMHhDOEYxLDB4QzhGMiwweEM4RjMsMHhDOEY0LC8qIDB4ODgtMHg4RiAqLworCTB4QzhGNiwweEM4RjcsMHhDOEY4LDB4QzhGOSwweEM4RkEsMHhDOEZCLDB4QzhGRSwweEM4RkYsLyogMHg5MC0weDk3ICovCisJMHhDOTAxLDB4QzkwMiwweEM5MDMsMHhDOTA3LDB4QzkwOCwweEM5MDksMHhDOTBBLDB4QzkwQiwvKiAweDk4LTB4OUYgKi8KKwkweEM5MEUsMHgzMDAwLDB4MzAwMSwweDMwMDIsMHgwMEI3LDB4MjAyNSwweDIwMjYsMHgwMEE4LC8qIDB4QTAtMHhBNyAqLworCTB4MzAwMywweDAwQUQsMHgyMDE1LDB4MjIyNSwweEZGM0MsMHgyMjNDLDB4MjAxOCwweDIwMTksLyogMHhBOC0weEFGICovCisJMHgyMDFDLDB4MjAxRCwweDMwMTQsMHgzMDE1LDB4MzAwOCwweDMwMDksMHgzMDBBLDB4MzAwQiwvKiAweEIwLTB4QjcgKi8KKwkweDMwMEMsMHgzMDBELDB4MzAwRSwweDMwMEYsMHgzMDEwLDB4MzAxMSwweDAwQjEsMHgwMEQ3LC8qIDB4QjgtMHhCRiAqLworCTB4MDBGNywweDIyNjAsMHgyMjY0LDB4MjI2NSwweDIyMUUsMHgyMjM0LDB4MDBCMCwweDIwMzIsLyogMHhDMC0weEM3ICovCisJMHgyMDMzLDB4MjEwMywweDIxMkIsMHhGRkUwLDB4RkZFMSwweEZGRTUsMHgyNjQyLDB4MjY0MCwvKiAweEM4LTB4Q0YgKi8KKwkweDIyMjAsMHgyMkE1LDB4MjMxMiwweDIyMDIsMHgyMjA3LDB4MjI2MSwweDIyNTIsMHgwMEE3LC8qIDB4RDAtMHhENyAqLworCTB4MjAzQiwweDI2MDYsMHgyNjA1LDB4MjVDQiwweDI1Q0YsMHgyNUNFLDB4MjVDNywweDI1QzYsLyogMHhEOC0weERGICovCisJMHgyNUExLDB4MjVBMCwweDI1QjMsMHgyNUIyLDB4MjVCRCwweDI1QkMsMHgyMTkyLDB4MjE5MCwvKiAweEUwLTB4RTcgKi8KKwkweDIxOTEsMHgyMTkzLDB4MjE5NCwweDMwMTMsMHgyMjZBLDB4MjI2QiwweDIyMUEsMHgyMjNELC8qIDB4RTgtMHhFRiAqLworCTB4MjIxRCwweDIyMzUsMHgyMjJCLDB4MjIyQywweDIyMDgsMHgyMjBCLDB4MjI4NiwweDIyODcsLyogMHhGMC0weEY3ICovCisJMHgyMjgyLDB4MjI4MywweDIyMkEsMHgyMjI5LDB4MjIyNywweDIyMjgsMHhGRkUyLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BMlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDOTEwLDB4QzkxMiwweEM5MTMsMHhDOTE0LDB4QzkxNSwweEM5MTYsMHhDOTE3LC8qIDB4NDAtMHg0NyAqLworCTB4QzkxOSwweEM5MUEsMHhDOTFCLDB4QzkxQywweEM5MUQsMHhDOTFFLDB4QzkxRiwweEM5MjAsLyogMHg0OC0weDRGICovCisJMHhDOTIxLDB4QzkyMiwweEM5MjMsMHhDOTI0LDB4QzkyNSwweEM5MjYsMHhDOTI3LDB4QzkyOCwvKiAweDUwLTB4NTcgKi8KKwkweEM5MjksMHhDOTJBLDB4QzkyQiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEM5MkQsMHhDOTJFLDB4QzkyRiwweEM5MzAsMHhDOTMxLDB4QzkzMiwweEM5MzMsLyogMHg2MC0weDY3ICovCisJMHhDOTM1LDB4QzkzNiwweEM5MzcsMHhDOTM4LDB4QzkzOSwweEM5M0EsMHhDOTNCLDB4QzkzQywvKiAweDY4LTB4NkYgKi8KKwkweEM5M0QsMHhDOTNFLDB4QzkzRiwweEM5NDAsMHhDOTQxLDB4Qzk0MiwweEM5NDMsMHhDOTQ0LC8qIDB4NzAtMHg3NyAqLworCTB4Qzk0NSwweEM5NDYsMHhDOTQ3LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhDOTQ4LDB4Qzk0OSwweEM5NEEsMHhDOTRCLDB4Qzk0QywweEM5NEQsMHhDOTRFLC8qIDB4ODAtMHg4NyAqLworCTB4Qzk0RiwweEM5NTIsMHhDOTUzLDB4Qzk1NSwweEM5NTYsMHhDOTU3LDB4Qzk1OSwweEM5NUEsLyogMHg4OC0weDhGICovCisJMHhDOTVCLDB4Qzk1QywweEM5NUQsMHhDOTVFLDB4Qzk1RiwweEM5NjIsMHhDOTY0LDB4Qzk2NSwvKiAweDkwLTB4OTcgKi8KKwkweEM5NjYsMHhDOTY3LDB4Qzk2OCwweEM5NjksMHhDOTZBLDB4Qzk2QiwweEM5NkQsMHhDOTZFLC8qIDB4OTgtMHg5RiAqLworCTB4Qzk2RiwweDIxRDIsMHgyMUQ0LDB4MjIwMCwweDIyMDMsMHgwMEI0LDB4RkY1RSwweDAyQzcsLyogMHhBMC0weEE3ICovCisJMHgwMkQ4LDB4MDJERCwweDAyREEsMHgwMkQ5LDB4MDBCOCwweDAyREIsMHgwMEExLDB4MDBCRiwvKiAweEE4LTB4QUYgKi8KKwkweDAyRDAsMHgyMjJFLDB4MjIxMSwweDIyMEYsMHgwMEE0LDB4MjEwOSwweDIwMzAsMHgyNUMxLC8qIDB4QjAtMHhCNyAqLworCTB4MjVDMCwweDI1QjcsMHgyNUI2LDB4MjY2NCwweDI2NjAsMHgyNjYxLDB4MjY2NSwweDI2NjcsLyogMHhCOC0weEJGICovCisJMHgyNjYzLDB4MjI5OSwweDI1QzgsMHgyNUEzLDB4MjVEMCwweDI1RDEsMHgyNTkyLDB4MjVBNCwvKiAweEMwLTB4QzcgKi8KKwkweDI1QTUsMHgyNUE4LDB4MjVBNywweDI1QTYsMHgyNUE5LDB4MjY2OCwweDI2MEYsMHgyNjBFLC8qIDB4QzgtMHhDRiAqLworCTB4MjYxQywweDI2MUUsMHgwMEI2LDB4MjAyMCwweDIwMjEsMHgyMTk1LDB4MjE5NywweDIxOTksLyogMHhEMC0weEQ3ICovCisJMHgyMTk2LDB4MjE5OCwweDI2NkQsMHgyNjY5LDB4MjY2QSwweDI2NkMsMHgzMjdGLDB4MzIxQywvKiAweEQ4LTB4REYgKi8KKwkweDIxMTYsMHgzM0M3LDB4MjEyMiwweDMzQzIsMHgzM0Q4LDB4MjEyMSwweDIwQUMsMHgwMEFFLC8qIDB4RTAtMHhFNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0EzWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEM5NzEsMHhDOTcyLDB4Qzk3MywweEM5NzUsMHhDOTc2LDB4Qzk3NywweEM5NzgsLyogMHg0MC0weDQ3ICovCisJMHhDOTc5LDB4Qzk3QSwweEM5N0IsMHhDOTdELDB4Qzk3RSwweEM5N0YsMHhDOTgwLDB4Qzk4MSwvKiAweDQ4LTB4NEYgKi8KKwkweEM5ODIsMHhDOTgzLDB4Qzk4NCwweEM5ODUsMHhDOTg2LDB4Qzk4NywweEM5OEEsMHhDOThCLC8qIDB4NTAtMHg1NyAqLworCTB4Qzk4RCwweEM5OEUsMHhDOThGLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4Qzk5MSwweEM5OTIsMHhDOTkzLDB4Qzk5NCwweEM5OTUsMHhDOTk2LDB4Qzk5NywvKiAweDYwLTB4NjcgKi8KKwkweEM5OUEsMHhDOTlDLDB4Qzk5RSwweEM5OUYsMHhDOUEwLDB4QzlBMSwweEM5QTIsMHhDOUEzLC8qIDB4NjgtMHg2RiAqLworCTB4QzlBNCwweEM5QTUsMHhDOUE2LDB4QzlBNywweEM5QTgsMHhDOUE5LDB4QzlBQSwweEM5QUIsLyogMHg3MC0weDc3ICovCisJMHhDOUFDLDB4QzlBRCwweEM5QUUsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEM5QUYsMHhDOUIwLDB4QzlCMSwweEM5QjIsMHhDOUIzLDB4QzlCNCwweEM5QjUsLyogMHg4MC0weDg3ICovCisJMHhDOUI2LDB4QzlCNywweEM5QjgsMHhDOUI5LDB4QzlCQSwweEM5QkIsMHhDOUJDLDB4QzlCRCwvKiAweDg4LTB4OEYgKi8KKwkweEM5QkUsMHhDOUJGLDB4QzlDMiwweEM5QzMsMHhDOUM1LDB4QzlDNiwweEM5QzksMHhDOUNCLC8qIDB4OTAtMHg5NyAqLworCTB4QzlDQywweEM5Q0QsMHhDOUNFLDB4QzlDRiwweEM5RDIsMHhDOUQ0LDB4QzlENywweEM5RDgsLyogMHg5OC0weDlGICovCisJMHhDOURCLDB4RkYwMSwweEZGMDIsMHhGRjAzLDB4RkYwNCwweEZGMDUsMHhGRjA2LDB4RkYwNywvKiAweEEwLTB4QTcgKi8KKwkweEZGMDgsMHhGRjA5LDB4RkYwQSwweEZGMEIsMHhGRjBDLDB4RkYwRCwweEZGMEUsMHhGRjBGLC8qIDB4QTgtMHhBRiAqLworCTB4RkYxMCwweEZGMTEsMHhGRjEyLDB4RkYxMywweEZGMTQsMHhGRjE1LDB4RkYxNiwweEZGMTcsLyogMHhCMC0weEI3ICovCisJMHhGRjE4LDB4RkYxOSwweEZGMUEsMHhGRjFCLDB4RkYxQywweEZGMUQsMHhGRjFFLDB4RkYxRiwvKiAweEI4LTB4QkYgKi8KKwkweEZGMjAsMHhGRjIxLDB4RkYyMiwweEZGMjMsMHhGRjI0LDB4RkYyNSwweEZGMjYsMHhGRjI3LC8qIDB4QzAtMHhDNyAqLworCTB4RkYyOCwweEZGMjksMHhGRjJBLDB4RkYyQiwweEZGMkMsMHhGRjJELDB4RkYyRSwweEZGMkYsLyogMHhDOC0weENGICovCisJMHhGRjMwLDB4RkYzMSwweEZGMzIsMHhGRjMzLDB4RkYzNCwweEZGMzUsMHhGRjM2LDB4RkYzNywvKiAweEQwLTB4RDcgKi8KKwkweEZGMzgsMHhGRjM5LDB4RkYzQSwweEZGM0IsMHhGRkU2LDB4RkYzRCwweEZGM0UsMHhGRjNGLC8qIDB4RDgtMHhERiAqLworCTB4RkY0MCwweEZGNDEsMHhGRjQyLDB4RkY0MywweEZGNDQsMHhGRjQ1LDB4RkY0NiwweEZGNDcsLyogMHhFMC0weEU3ICovCisJMHhGRjQ4LDB4RkY0OSwweEZGNEEsMHhGRjRCLDB4RkY0QywweEZGNEQsMHhGRjRFLDB4RkY0RiwvKiAweEU4LTB4RUYgKi8KKwkweEZGNTAsMHhGRjUxLDB4RkY1MiwweEZGNTMsMHhGRjU0LDB4RkY1NSwweEZGNTYsMHhGRjU3LC8qIDB4RjAtMHhGNyAqLworCTB4RkY1OCwweEZGNTksMHhGRjVBLDB4RkY1QiwweEZGNUMsMHhGRjVELDB4RkZFMywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQTRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QzlERSwweEM5REYsMHhDOUUxLDB4QzlFMywweEM5RTUsMHhDOUU2LDB4QzlFOCwvKiAweDQwLTB4NDcgKi8KKwkweEM5RTksMHhDOUVBLDB4QzlFQiwweEM5RUUsMHhDOUYyLDB4QzlGMywweEM5RjQsMHhDOUY1LC8qIDB4NDgtMHg0RiAqLworCTB4QzlGNiwweEM5RjcsMHhDOUZBLDB4QzlGQiwweEM5RkQsMHhDOUZFLDB4QzlGRiwweENBMDEsLyogMHg1MC0weDU3ICovCisJMHhDQTAyLDB4Q0EwMywweENBMDQsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhDQTA1LDB4Q0EwNiwweENBMDcsMHhDQTBBLDB4Q0EwRSwweENBMEYsMHhDQTEwLC8qIDB4NjAtMHg2NyAqLworCTB4Q0ExMSwweENBMTIsMHhDQTEzLDB4Q0ExNSwweENBMTYsMHhDQTE3LDB4Q0ExOSwweENBMUEsLyogMHg2OC0weDZGICovCisJMHhDQTFCLDB4Q0ExQywweENBMUQsMHhDQTFFLDB4Q0ExRiwweENBMjAsMHhDQTIxLDB4Q0EyMiwvKiAweDcwLTB4NzcgKi8KKwkweENBMjMsMHhDQTI0LDB4Q0EyNSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4Q0EyNiwweENBMjcsMHhDQTI4LDB4Q0EyQSwweENBMkIsMHhDQTJDLDB4Q0EyRCwvKiAweDgwLTB4ODcgKi8KKwkweENBMkUsMHhDQTJGLDB4Q0EzMCwweENBMzEsMHhDQTMyLDB4Q0EzMywweENBMzQsMHhDQTM1LC8qIDB4ODgtMHg4RiAqLworCTB4Q0EzNiwweENBMzcsMHhDQTM4LDB4Q0EzOSwweENBM0EsMHhDQTNCLDB4Q0EzQywweENBM0QsLyogMHg5MC0weDk3ICovCisJMHhDQTNFLDB4Q0EzRiwweENBNDAsMHhDQTQxLDB4Q0E0MiwweENBNDMsMHhDQTQ0LDB4Q0E0NSwvKiAweDk4LTB4OUYgKi8KKwkweENBNDYsMHgzMTMxLDB4MzEzMiwweDMxMzMsMHgzMTM0LDB4MzEzNSwweDMxMzYsMHgzMTM3LC8qIDB4QTAtMHhBNyAqLworCTB4MzEzOCwweDMxMzksMHgzMTNBLDB4MzEzQiwweDMxM0MsMHgzMTNELDB4MzEzRSwweDMxM0YsLyogMHhBOC0weEFGICovCisJMHgzMTQwLDB4MzE0MSwweDMxNDIsMHgzMTQzLDB4MzE0NCwweDMxNDUsMHgzMTQ2LDB4MzE0NywvKiAweEIwLTB4QjcgKi8KKwkweDMxNDgsMHgzMTQ5LDB4MzE0QSwweDMxNEIsMHgzMTRDLDB4MzE0RCwweDMxNEUsMHgzMTRGLC8qIDB4QjgtMHhCRiAqLworCTB4MzE1MCwweDMxNTEsMHgzMTUyLDB4MzE1MywweDMxNTQsMHgzMTU1LDB4MzE1NiwweDMxNTcsLyogMHhDMC0weEM3ICovCisJMHgzMTU4LDB4MzE1OSwweDMxNUEsMHgzMTVCLDB4MzE1QywweDMxNUQsMHgzMTVFLDB4MzE1RiwvKiAweEM4LTB4Q0YgKi8KKwkweDMxNjAsMHgzMTYxLDB4MzE2MiwweDMxNjMsMHgzMTY0LDB4MzE2NSwweDMxNjYsMHgzMTY3LC8qIDB4RDAtMHhENyAqLworCTB4MzE2OCwweDMxNjksMHgzMTZBLDB4MzE2QiwweDMxNkMsMHgzMTZELDB4MzE2RSwweDMxNkYsLyogMHhEOC0weERGICovCisJMHgzMTcwLDB4MzE3MSwweDMxNzIsMHgzMTczLDB4MzE3NCwweDMxNzUsMHgzMTc2LDB4MzE3NywvKiAweEUwLTB4RTcgKi8KKwkweDMxNzgsMHgzMTc5LDB4MzE3QSwweDMxN0IsMHgzMTdDLDB4MzE3RCwweDMxN0UsMHgzMTdGLC8qIDB4RTgtMHhFRiAqLworCTB4MzE4MCwweDMxODEsMHgzMTgyLDB4MzE4MywweDMxODQsMHgzMTg1LDB4MzE4NiwweDMxODcsLyogMHhGMC0weEY3ICovCisJMHgzMTg4LDB4MzE4OSwweDMxOEEsMHgzMThCLDB4MzE4QywweDMxOEQsMHgzMThFLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BNVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDQTQ3LDB4Q0E0OCwweENBNDksMHhDQTRBLDB4Q0E0QiwweENBNEUsMHhDQTRGLC8qIDB4NDAtMHg0NyAqLworCTB4Q0E1MSwweENBNTIsMHhDQTUzLDB4Q0E1NSwweENBNTYsMHhDQTU3LDB4Q0E1OCwweENBNTksLyogMHg0OC0weDRGICovCisJMHhDQTVBLDB4Q0E1QiwweENBNUUsMHhDQTYyLDB4Q0E2MywweENBNjQsMHhDQTY1LDB4Q0E2NiwvKiAweDUwLTB4NTcgKi8KKwkweENBNjcsMHhDQTY5LDB4Q0E2QSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweENBNkIsMHhDQTZDLDB4Q0E2RCwweENBNkUsMHhDQTZGLDB4Q0E3MCwweENBNzEsLyogMHg2MC0weDY3ICovCisJMHhDQTcyLDB4Q0E3MywweENBNzQsMHhDQTc1LDB4Q0E3NiwweENBNzcsMHhDQTc4LDB4Q0E3OSwvKiAweDY4LTB4NkYgKi8KKwkweENBN0EsMHhDQTdCLDB4Q0E3QywweENBN0UsMHhDQTdGLDB4Q0E4MCwweENBODEsMHhDQTgyLC8qIDB4NzAtMHg3NyAqLworCTB4Q0E4MywweENBODUsMHhDQTg2LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhDQTg3LDB4Q0E4OCwweENBODksMHhDQThBLDB4Q0E4QiwweENBOEMsMHhDQThELC8qIDB4ODAtMHg4NyAqLworCTB4Q0E4RSwweENBOEYsMHhDQTkwLDB4Q0E5MSwweENBOTIsMHhDQTkzLDB4Q0E5NCwweENBOTUsLyogMHg4OC0weDhGICovCisJMHhDQTk2LDB4Q0E5NywweENBOTksMHhDQTlBLDB4Q0E5QiwweENBOUMsMHhDQTlELDB4Q0E5RSwvKiAweDkwLTB4OTcgKi8KKwkweENBOUYsMHhDQUEwLDB4Q0FBMSwweENBQTIsMHhDQUEzLDB4Q0FBNCwweENBQTUsMHhDQUE2LC8qIDB4OTgtMHg5RiAqLworCTB4Q0FBNywweDIxNzAsMHgyMTcxLDB4MjE3MiwweDIxNzMsMHgyMTc0LDB4MjE3NSwweDIxNzYsLyogMHhBMC0weEE3ICovCisJMHgyMTc3LDB4MjE3OCwweDIxNzksMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEE4LTB4QUYgKi8KKwkweDIxNjAsMHgyMTYxLDB4MjE2MiwweDIxNjMsMHgyMTY0LDB4MjE2NSwweDIxNjYsMHgyMTY3LC8qIDB4QjAtMHhCNyAqLworCTB4MjE2OCwweDIxNjksMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhCOC0weEJGICovCisJMHgwMDAwLDB4MDM5MSwweDAzOTIsMHgwMzkzLDB4MDM5NCwweDAzOTUsMHgwMzk2LDB4MDM5NywvKiAweEMwLTB4QzcgKi8KKwkweDAzOTgsMHgwMzk5LDB4MDM5QSwweDAzOUIsMHgwMzlDLDB4MDM5RCwweDAzOUUsMHgwMzlGLC8qIDB4QzgtMHhDRiAqLworCTB4MDNBMCwweDAzQTEsMHgwM0EzLDB4MDNBNCwweDAzQTUsMHgwM0E2LDB4MDNBNywweDAzQTgsLyogMHhEMC0weEQ3ICovCisJMHgwM0E5LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEQ4LTB4REYgKi8KKwkweDAwMDAsMHgwM0IxLDB4MDNCMiwweDAzQjMsMHgwM0I0LDB4MDNCNSwweDAzQjYsMHgwM0I3LC8qIDB4RTAtMHhFNyAqLworCTB4MDNCOCwweDAzQjksMHgwM0JBLDB4MDNCQiwweDAzQkMsMHgwM0JELDB4MDNCRSwweDAzQkYsLyogMHhFOC0weEVGICovCisJMHgwM0MwLDB4MDNDMSwweDAzQzMsMHgwM0M0LDB4MDNDNSwweDAzQzYsMHgwM0M3LDB4MDNDOCwvKiAweEYwLTB4RjcgKi8KKwkweDAzQzksMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0E2WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweENBQTgsMHhDQUE5LDB4Q0FBQSwweENBQUIsMHhDQUFDLDB4Q0FBRCwweENBQUUsLyogMHg0MC0weDQ3ICovCisJMHhDQUFGLDB4Q0FCMCwweENBQjEsMHhDQUIyLDB4Q0FCMywweENBQjQsMHhDQUI1LDB4Q0FCNiwvKiAweDQ4LTB4NEYgKi8KKwkweENBQjcsMHhDQUI4LDB4Q0FCOSwweENBQkEsMHhDQUJCLDB4Q0FCRSwweENBQkYsMHhDQUMxLC8qIDB4NTAtMHg1NyAqLworCTB4Q0FDMiwweENBQzMsMHhDQUM1LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4Q0FDNiwweENBQzcsMHhDQUM4LDB4Q0FDOSwweENBQ0EsMHhDQUNCLDB4Q0FDRSwvKiAweDYwLTB4NjcgKi8KKwkweENBRDAsMHhDQUQyLDB4Q0FENCwweENBRDUsMHhDQUQ2LDB4Q0FENywweENBREEsMHhDQURCLC8qIDB4NjgtMHg2RiAqLworCTB4Q0FEQywweENBREQsMHhDQURFLDB4Q0FERiwweENBRTEsMHhDQUUyLDB4Q0FFMywweENBRTQsLyogMHg3MC0weDc3ICovCisJMHhDQUU1LDB4Q0FFNiwweENBRTcsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweENBRTgsMHhDQUU5LDB4Q0FFQSwweENBRUIsMHhDQUVELDB4Q0FFRSwweENBRUYsLyogMHg4MC0weDg3ICovCisJMHhDQUYwLDB4Q0FGMSwweENBRjIsMHhDQUYzLDB4Q0FGNSwweENBRjYsMHhDQUY3LDB4Q0FGOCwvKiAweDg4LTB4OEYgKi8KKwkweENBRjksMHhDQUZBLDB4Q0FGQiwweENBRkMsMHhDQUZELDB4Q0FGRSwweENBRkYsMHhDQjAwLC8qIDB4OTAtMHg5NyAqLworCTB4Q0IwMSwweENCMDIsMHhDQjAzLDB4Q0IwNCwweENCMDUsMHhDQjA2LDB4Q0IwNywweENCMDksLyogMHg5OC0weDlGICovCisJMHhDQjBBLDB4MjUwMCwweDI1MDIsMHgyNTBDLDB4MjUxMCwweDI1MTgsMHgyNTE0LDB4MjUxQywvKiAweEEwLTB4QTcgKi8KKwkweDI1MkMsMHgyNTI0LDB4MjUzNCwweDI1M0MsMHgyNTAxLDB4MjUwMywweDI1MEYsMHgyNTEzLC8qIDB4QTgtMHhBRiAqLworCTB4MjUxQiwweDI1MTcsMHgyNTIzLDB4MjUzMywweDI1MkIsMHgyNTNCLDB4MjU0QiwweDI1MjAsLyogMHhCMC0weEI3ICovCisJMHgyNTJGLDB4MjUyOCwweDI1MzcsMHgyNTNGLDB4MjUxRCwweDI1MzAsMHgyNTI1LDB4MjUzOCwvKiAweEI4LTB4QkYgKi8KKwkweDI1NDIsMHgyNTEyLDB4MjUxMSwweDI1MUEsMHgyNTE5LDB4MjUxNiwweDI1MTUsMHgyNTBFLC8qIDB4QzAtMHhDNyAqLworCTB4MjUwRCwweDI1MUUsMHgyNTFGLDB4MjUyMSwweDI1MjIsMHgyNTI2LDB4MjUyNywweDI1MjksLyogMHhDOC0weENGICovCisJMHgyNTJBLDB4MjUyRCwweDI1MkUsMHgyNTMxLDB4MjUzMiwweDI1MzUsMHgyNTM2LDB4MjUzOSwvKiAweEQwLTB4RDcgKi8KKwkweDI1M0EsMHgyNTNELDB4MjUzRSwweDI1NDAsMHgyNTQxLDB4MjU0MywweDI1NDQsMHgyNTQ1LC8qIDB4RDgtMHhERiAqLworCTB4MjU0NiwweDI1NDcsMHgyNTQ4LDB4MjU0OSwweDI1NEEsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhFMC0weEU3ICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQTdbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4Q0IwQiwweENCMEMsMHhDQjBELDB4Q0IwRSwweENCMEYsMHhDQjExLDB4Q0IxMiwvKiAweDQwLTB4NDcgKi8KKwkweENCMTMsMHhDQjE1LDB4Q0IxNiwweENCMTcsMHhDQjE5LDB4Q0IxQSwweENCMUIsMHhDQjFDLC8qIDB4NDgtMHg0RiAqLworCTB4Q0IxRCwweENCMUUsMHhDQjFGLDB4Q0IyMiwweENCMjMsMHhDQjI0LDB4Q0IyNSwweENCMjYsLyogMHg1MC0weDU3ICovCisJMHhDQjI3LDB4Q0IyOCwweENCMjksMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhDQjJBLDB4Q0IyQiwweENCMkMsMHhDQjJELDB4Q0IyRSwweENCMkYsMHhDQjMwLC8qIDB4NjAtMHg2NyAqLworCTB4Q0IzMSwweENCMzIsMHhDQjMzLDB4Q0IzNCwweENCMzUsMHhDQjM2LDB4Q0IzNywweENCMzgsLyogMHg2OC0weDZGICovCisJMHhDQjM5LDB4Q0IzQSwweENCM0IsMHhDQjNDLDB4Q0IzRCwweENCM0UsMHhDQjNGLDB4Q0I0MCwvKiAweDcwLTB4NzcgKi8KKwkweENCNDIsMHhDQjQzLDB4Q0I0NCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4Q0I0NSwweENCNDYsMHhDQjQ3LDB4Q0I0QSwweENCNEIsMHhDQjRELDB4Q0I0RSwvKiAweDgwLTB4ODcgKi8KKwkweENCNEYsMHhDQjUxLDB4Q0I1MiwweENCNTMsMHhDQjU0LDB4Q0I1NSwweENCNTYsMHhDQjU3LC8qIDB4ODgtMHg4RiAqLworCTB4Q0I1QSwweENCNUIsMHhDQjVDLDB4Q0I1RSwweENCNUYsMHhDQjYwLDB4Q0I2MSwweENCNjIsLyogMHg5MC0weDk3ICovCisJMHhDQjYzLDB4Q0I2NSwweENCNjYsMHhDQjY3LDB4Q0I2OCwweENCNjksMHhDQjZBLDB4Q0I2QiwvKiAweDk4LTB4OUYgKi8KKwkweENCNkMsMHgzMzk1LDB4MzM5NiwweDMzOTcsMHgyMTEzLDB4MzM5OCwweDMzQzQsMHgzM0EzLC8qIDB4QTAtMHhBNyAqLworCTB4MzNBNCwweDMzQTUsMHgzM0E2LDB4MzM5OSwweDMzOUEsMHgzMzlCLDB4MzM5QywweDMzOUQsLyogMHhBOC0weEFGICovCisJMHgzMzlFLDB4MzM5RiwweDMzQTAsMHgzM0ExLDB4MzNBMiwweDMzQ0EsMHgzMzhELDB4MzM4RSwvKiAweEIwLTB4QjcgKi8KKwkweDMzOEYsMHgzM0NGLDB4MzM4OCwweDMzODksMHgzM0M4LDB4MzNBNywweDMzQTgsMHgzM0IwLC8qIDB4QjgtMHhCRiAqLworCTB4MzNCMSwweDMzQjIsMHgzM0IzLDB4MzNCNCwweDMzQjUsMHgzM0I2LDB4MzNCNywweDMzQjgsLyogMHhDMC0weEM3ICovCisJMHgzM0I5LDB4MzM4MCwweDMzODEsMHgzMzgyLDB4MzM4MywweDMzODQsMHgzM0JBLDB4MzNCQiwvKiAweEM4LTB4Q0YgKi8KKwkweDMzQkMsMHgzM0JELDB4MzNCRSwweDMzQkYsMHgzMzkwLDB4MzM5MSwweDMzOTIsMHgzMzkzLC8qIDB4RDAtMHhENyAqLworCTB4MzM5NCwweDIxMjYsMHgzM0MwLDB4MzNDMSwweDMzOEEsMHgzMzhCLDB4MzM4QywweDMzRDYsLyogMHhEOC0weERGICovCisJMHgzM0M1LDB4MzNBRCwweDMzQUUsMHgzM0FGLDB4MzNEQiwweDMzQTksMHgzM0FBLDB4MzNBQiwvKiAweEUwLTB4RTcgKi8KKwkweDMzQUMsMHgzM0RELDB4MzNEMCwweDMzRDMsMHgzM0MzLDB4MzNDOSwweDMzREMsMHgzM0M2LC8qIDB4RTgtMHhFRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0E4WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweENCNkQsMHhDQjZFLDB4Q0I2RiwweENCNzAsMHhDQjcxLDB4Q0I3MiwweENCNzMsLyogMHg0MC0weDQ3ICovCisJMHhDQjc0LDB4Q0I3NSwweENCNzYsMHhDQjc3LDB4Q0I3QSwweENCN0IsMHhDQjdDLDB4Q0I3RCwvKiAweDQ4LTB4NEYgKi8KKwkweENCN0UsMHhDQjdGLDB4Q0I4MCwweENCODEsMHhDQjgyLDB4Q0I4MywweENCODQsMHhDQjg1LC8qIDB4NTAtMHg1NyAqLworCTB4Q0I4NiwweENCODcsMHhDQjg4LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4Q0I4OSwweENCOEEsMHhDQjhCLDB4Q0I4QywweENCOEQsMHhDQjhFLDB4Q0I4RiwvKiAweDYwLTB4NjcgKi8KKwkweENCOTAsMHhDQjkxLDB4Q0I5MiwweENCOTMsMHhDQjk0LDB4Q0I5NSwweENCOTYsMHhDQjk3LC8qIDB4NjgtMHg2RiAqLworCTB4Q0I5OCwweENCOTksMHhDQjlBLDB4Q0I5QiwweENCOUQsMHhDQjlFLDB4Q0I5RiwweENCQTAsLyogMHg3MC0weDc3ICovCisJMHhDQkExLDB4Q0JBMiwweENCQTMsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweENCQTQsMHhDQkE1LDB4Q0JBNiwweENCQTcsMHhDQkE4LDB4Q0JBOSwweENCQUEsLyogMHg4MC0weDg3ICovCisJMHhDQkFCLDB4Q0JBQywweENCQUQsMHhDQkFFLDB4Q0JBRiwweENCQjAsMHhDQkIxLDB4Q0JCMiwvKiAweDg4LTB4OEYgKi8KKwkweENCQjMsMHhDQkI0LDB4Q0JCNSwweENCQjYsMHhDQkI3LDB4Q0JCOSwweENCQkEsMHhDQkJCLC8qIDB4OTAtMHg5NyAqLworCTB4Q0JCQywweENCQkQsMHhDQkJFLDB4Q0JCRiwweENCQzAsMHhDQkMxLDB4Q0JDMiwweENCQzMsLyogMHg5OC0weDlGICovCisJMHhDQkM0LDB4MDBDNiwweDAwRDAsMHgwMEFBLDB4MDEyNiwweDAwMDAsMHgwMTMyLDB4MDAwMCwvKiAweEEwLTB4QTcgKi8KKwkweDAxM0YsMHgwMTQxLDB4MDBEOCwweDAxNTIsMHgwMEJBLDB4MDBERSwweDAxNjYsMHgwMTRBLC8qIDB4QTgtMHhBRiAqLworCTB4MDAwMCwweDMyNjAsMHgzMjYxLDB4MzI2MiwweDMyNjMsMHgzMjY0LDB4MzI2NSwweDMyNjYsLyogMHhCMC0weEI3ICovCisJMHgzMjY3LDB4MzI2OCwweDMyNjksMHgzMjZBLDB4MzI2QiwweDMyNkMsMHgzMjZELDB4MzI2RSwvKiAweEI4LTB4QkYgKi8KKwkweDMyNkYsMHgzMjcwLDB4MzI3MSwweDMyNzIsMHgzMjczLDB4MzI3NCwweDMyNzUsMHgzMjc2LC8qIDB4QzAtMHhDNyAqLworCTB4MzI3NywweDMyNzgsMHgzMjc5LDB4MzI3QSwweDMyN0IsMHgyNEQwLDB4MjREMSwweDI0RDIsLyogMHhDOC0weENGICovCisJMHgyNEQzLDB4MjRENCwweDI0RDUsMHgyNEQ2LDB4MjRENywweDI0RDgsMHgyNEQ5LDB4MjREQSwvKiAweEQwLTB4RDcgKi8KKwkweDI0REIsMHgyNERDLDB4MjRERCwweDI0REUsMHgyNERGLDB4MjRFMCwweDI0RTEsMHgyNEUyLC8qIDB4RDgtMHhERiAqLworCTB4MjRFMywweDI0RTQsMHgyNEU1LDB4MjRFNiwweDI0RTcsMHgyNEU4LDB4MjRFOSwweDI0NjAsLyogMHhFMC0weEU3ICovCisJMHgyNDYxLDB4MjQ2MiwweDI0NjMsMHgyNDY0LDB4MjQ2NSwweDI0NjYsMHgyNDY3LDB4MjQ2OCwvKiAweEU4LTB4RUYgKi8KKwkweDI0NjksMHgyNDZBLDB4MjQ2QiwweDI0NkMsMHgyNDZELDB4MjQ2RSwweDAwQkQsMHgyMTUzLC8qIDB4RjAtMHhGNyAqLworCTB4MjE1NCwweDAwQkMsMHgwMEJFLDB4MjE1QiwweDIxNUMsMHgyMTVELDB4MjE1RSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQTlbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4Q0JDNSwweENCQzYsMHhDQkM3LDB4Q0JDOCwweENCQzksMHhDQkNBLDB4Q0JDQiwvKiAweDQwLTB4NDcgKi8KKwkweENCQ0MsMHhDQkNELDB4Q0JDRSwweENCQ0YsMHhDQkQwLDB4Q0JEMSwweENCRDIsMHhDQkQzLC8qIDB4NDgtMHg0RiAqLworCTB4Q0JENSwweENCRDYsMHhDQkQ3LDB4Q0JEOCwweENCRDksMHhDQkRBLDB4Q0JEQiwweENCREMsLyogMHg1MC0weDU3ICovCisJMHhDQkRELDB4Q0JERSwweENCREYsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhDQkUwLDB4Q0JFMSwweENCRTIsMHhDQkUzLDB4Q0JFNSwweENCRTYsMHhDQkU4LC8qIDB4NjAtMHg2NyAqLworCTB4Q0JFQSwweENCRUIsMHhDQkVDLDB4Q0JFRCwweENCRUUsMHhDQkVGLDB4Q0JGMCwweENCRjEsLyogMHg2OC0weDZGICovCisJMHhDQkYyLDB4Q0JGMywweENCRjQsMHhDQkY1LDB4Q0JGNiwweENCRjcsMHhDQkY4LDB4Q0JGOSwvKiAweDcwLTB4NzcgKi8KKwkweENCRkEsMHhDQkZCLDB4Q0JGQywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4Q0JGRCwweENCRkUsMHhDQkZGLDB4Q0MwMCwweENDMDEsMHhDQzAyLDB4Q0MwMywvKiAweDgwLTB4ODcgKi8KKwkweENDMDQsMHhDQzA1LDB4Q0MwNiwweENDMDcsMHhDQzA4LDB4Q0MwOSwweENDMEEsMHhDQzBCLC8qIDB4ODgtMHg4RiAqLworCTB4Q0MwRSwweENDMEYsMHhDQzExLDB4Q0MxMiwweENDMTMsMHhDQzE1LDB4Q0MxNiwweENDMTcsLyogMHg5MC0weDk3ICovCisJMHhDQzE4LDB4Q0MxOSwweENDMUEsMHhDQzFCLDB4Q0MxRSwweENDMUYsMHhDQzIwLDB4Q0MyMywvKiAweDk4LTB4OUYgKi8KKwkweENDMjQsMHgwMEU2LDB4MDExMSwweDAwRjAsMHgwMTI3LDB4MDEzMSwweDAxMzMsMHgwMTM4LC8qIDB4QTAtMHhBNyAqLworCTB4MDE0MCwweDAxNDIsMHgwMEY4LDB4MDE1MywweDAwREYsMHgwMEZFLDB4MDE2NywweDAxNEIsLyogMHhBOC0weEFGICovCisJMHgwMTQ5LDB4MzIwMCwweDMyMDEsMHgzMjAyLDB4MzIwMywweDMyMDQsMHgzMjA1LDB4MzIwNiwvKiAweEIwLTB4QjcgKi8KKwkweDMyMDcsMHgzMjA4LDB4MzIwOSwweDMyMEEsMHgzMjBCLDB4MzIwQywweDMyMEQsMHgzMjBFLC8qIDB4QjgtMHhCRiAqLworCTB4MzIwRiwweDMyMTAsMHgzMjExLDB4MzIxMiwweDMyMTMsMHgzMjE0LDB4MzIxNSwweDMyMTYsLyogMHhDMC0weEM3ICovCisJMHgzMjE3LDB4MzIxOCwweDMyMTksMHgzMjFBLDB4MzIxQiwweDI0OUMsMHgyNDlELDB4MjQ5RSwvKiAweEM4LTB4Q0YgKi8KKwkweDI0OUYsMHgyNEEwLDB4MjRBMSwweDI0QTIsMHgyNEEzLDB4MjRBNCwweDI0QTUsMHgyNEE2LC8qIDB4RDAtMHhENyAqLworCTB4MjRBNywweDI0QTgsMHgyNEE5LDB4MjRBQSwweDI0QUIsMHgyNEFDLDB4MjRBRCwweDI0QUUsLyogMHhEOC0weERGICovCisJMHgyNEFGLDB4MjRCMCwweDI0QjEsMHgyNEIyLDB4MjRCMywweDI0QjQsMHgyNEI1LDB4MjQ3NCwvKiAweEUwLTB4RTcgKi8KKwkweDI0NzUsMHgyNDc2LDB4MjQ3NywweDI0NzgsMHgyNDc5LDB4MjQ3QSwweDI0N0IsMHgyNDdDLC8qIDB4RTgtMHhFRiAqLworCTB4MjQ3RCwweDI0N0UsMHgyNDdGLDB4MjQ4MCwweDI0ODEsMHgyNDgyLDB4MDBCOSwweDAwQjIsLyogMHhGMC0weEY3ICovCisJMHgwMEIzLDB4MjA3NCwweDIwN0YsMHgyMDgxLDB4MjA4MiwweDIwODMsMHgyMDg0LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BQVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDQzI1LDB4Q0MyNiwweENDMkEsMHhDQzJCLDB4Q0MyRCwweENDMkYsMHhDQzMxLC8qIDB4NDAtMHg0NyAqLworCTB4Q0MzMiwweENDMzMsMHhDQzM0LDB4Q0MzNSwweENDMzYsMHhDQzM3LDB4Q0MzQSwweENDM0YsLyogMHg0OC0weDRGICovCisJMHhDQzQwLDB4Q0M0MSwweENDNDIsMHhDQzQzLDB4Q0M0NiwweENDNDcsMHhDQzQ5LDB4Q0M0QSwvKiAweDUwLTB4NTcgKi8KKwkweENDNEIsMHhDQzRELDB4Q0M0RSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweENDNEYsMHhDQzUwLDB4Q0M1MSwweENDNTIsMHhDQzUzLDB4Q0M1NiwweENDNUEsLyogMHg2MC0weDY3ICovCisJMHhDQzVCLDB4Q0M1QywweENDNUQsMHhDQzVFLDB4Q0M1RiwweENDNjEsMHhDQzYyLDB4Q0M2MywvKiAweDY4LTB4NkYgKi8KKwkweENDNjUsMHhDQzY3LDB4Q0M2OSwweENDNkEsMHhDQzZCLDB4Q0M2QywweENDNkQsMHhDQzZFLC8qIDB4NzAtMHg3NyAqLworCTB4Q0M2RiwweENDNzEsMHhDQzcyLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhDQzczLDB4Q0M3NCwweENDNzYsMHhDQzc3LDB4Q0M3OCwweENDNzksMHhDQzdBLC8qIDB4ODAtMHg4NyAqLworCTB4Q0M3QiwweENDN0MsMHhDQzdELDB4Q0M3RSwweENDN0YsMHhDQzgwLDB4Q0M4MSwweENDODIsLyogMHg4OC0weDhGICovCisJMHhDQzgzLDB4Q0M4NCwweENDODUsMHhDQzg2LDB4Q0M4NywweENDODgsMHhDQzg5LDB4Q0M4QSwvKiAweDkwLTB4OTcgKi8KKwkweENDOEIsMHhDQzhDLDB4Q0M4RCwweENDOEUsMHhDQzhGLDB4Q0M5MCwweENDOTEsMHhDQzkyLC8qIDB4OTgtMHg5RiAqLworCTB4Q0M5MywweDMwNDEsMHgzMDQyLDB4MzA0MywweDMwNDQsMHgzMDQ1LDB4MzA0NiwweDMwNDcsLyogMHhBMC0weEE3ICovCisJMHgzMDQ4LDB4MzA0OSwweDMwNEEsMHgzMDRCLDB4MzA0QywweDMwNEQsMHgzMDRFLDB4MzA0RiwvKiAweEE4LTB4QUYgKi8KKwkweDMwNTAsMHgzMDUxLDB4MzA1MiwweDMwNTMsMHgzMDU0LDB4MzA1NSwweDMwNTYsMHgzMDU3LC8qIDB4QjAtMHhCNyAqLworCTB4MzA1OCwweDMwNTksMHgzMDVBLDB4MzA1QiwweDMwNUMsMHgzMDVELDB4MzA1RSwweDMwNUYsLyogMHhCOC0weEJGICovCisJMHgzMDYwLDB4MzA2MSwweDMwNjIsMHgzMDYzLDB4MzA2NCwweDMwNjUsMHgzMDY2LDB4MzA2NywvKiAweEMwLTB4QzcgKi8KKwkweDMwNjgsMHgzMDY5LDB4MzA2QSwweDMwNkIsMHgzMDZDLDB4MzA2RCwweDMwNkUsMHgzMDZGLC8qIDB4QzgtMHhDRiAqLworCTB4MzA3MCwweDMwNzEsMHgzMDcyLDB4MzA3MywweDMwNzQsMHgzMDc1LDB4MzA3NiwweDMwNzcsLyogMHhEMC0weEQ3ICovCisJMHgzMDc4LDB4MzA3OSwweDMwN0EsMHgzMDdCLDB4MzA3QywweDMwN0QsMHgzMDdFLDB4MzA3RiwvKiAweEQ4LTB4REYgKi8KKwkweDMwODAsMHgzMDgxLDB4MzA4MiwweDMwODMsMHgzMDg0LDB4MzA4NSwweDMwODYsMHgzMDg3LC8qIDB4RTAtMHhFNyAqLworCTB4MzA4OCwweDMwODksMHgzMDhBLDB4MzA4QiwweDMwOEMsMHgzMDhELDB4MzA4RSwweDMwOEYsLyogMHhFOC0weEVGICovCisJMHgzMDkwLDB4MzA5MSwweDMwOTIsMHgzMDkzLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEYwLTB4RjcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BQlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDQzk0LDB4Q0M5NSwweENDOTYsMHhDQzk3LDB4Q0M5QSwweENDOUIsMHhDQzlELC8qIDB4NDAtMHg0NyAqLworCTB4Q0M5RSwweENDOUYsMHhDQ0ExLDB4Q0NBMiwweENDQTMsMHhDQ0E0LDB4Q0NBNSwweENDQTYsLyogMHg0OC0weDRGICovCisJMHhDQ0E3LDB4Q0NBQSwweENDQUUsMHhDQ0FGLDB4Q0NCMCwweENDQjEsMHhDQ0IyLDB4Q0NCMywvKiAweDUwLTB4NTcgKi8KKwkweENDQjYsMHhDQ0I3LDB4Q0NCOSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweENDQkEsMHhDQ0JCLDB4Q0NCRCwweENDQkUsMHhDQ0JGLDB4Q0NDMCwweENDQzEsLyogMHg2MC0weDY3ICovCisJMHhDQ0MyLDB4Q0NDMywweENDQzYsMHhDQ0M4LDB4Q0NDQSwweENDQ0IsMHhDQ0NDLDB4Q0NDRCwvKiAweDY4LTB4NkYgKi8KKwkweENDQ0UsMHhDQ0NGLDB4Q0NEMSwweENDRDIsMHhDQ0QzLDB4Q0NENSwweENDRDYsMHhDQ0Q3LC8qIDB4NzAtMHg3NyAqLworCTB4Q0NEOCwweENDRDksMHhDQ0RBLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhDQ0RCLDB4Q0NEQywweENDREQsMHhDQ0RFLDB4Q0NERiwweENDRTAsMHhDQ0UxLC8qIDB4ODAtMHg4NyAqLworCTB4Q0NFMiwweENDRTMsMHhDQ0U1LDB4Q0NFNiwweENDRTcsMHhDQ0U4LDB4Q0NFOSwweENDRUEsLyogMHg4OC0weDhGICovCisJMHhDQ0VCLDB4Q0NFRCwweENDRUUsMHhDQ0VGLDB4Q0NGMSwweENDRjIsMHhDQ0YzLDB4Q0NGNCwvKiAweDkwLTB4OTcgKi8KKwkweENDRjUsMHhDQ0Y2LDB4Q0NGNywweENDRjgsMHhDQ0Y5LDB4Q0NGQSwweENDRkIsMHhDQ0ZDLC8qIDB4OTgtMHg5RiAqLworCTB4Q0NGRCwweDMwQTEsMHgzMEEyLDB4MzBBMywweDMwQTQsMHgzMEE1LDB4MzBBNiwweDMwQTcsLyogMHhBMC0weEE3ICovCisJMHgzMEE4LDB4MzBBOSwweDMwQUEsMHgzMEFCLDB4MzBBQywweDMwQUQsMHgzMEFFLDB4MzBBRiwvKiAweEE4LTB4QUYgKi8KKwkweDMwQjAsMHgzMEIxLDB4MzBCMiwweDMwQjMsMHgzMEI0LDB4MzBCNSwweDMwQjYsMHgzMEI3LC8qIDB4QjAtMHhCNyAqLworCTB4MzBCOCwweDMwQjksMHgzMEJBLDB4MzBCQiwweDMwQkMsMHgzMEJELDB4MzBCRSwweDMwQkYsLyogMHhCOC0weEJGICovCisJMHgzMEMwLDB4MzBDMSwweDMwQzIsMHgzMEMzLDB4MzBDNCwweDMwQzUsMHgzMEM2LDB4MzBDNywvKiAweEMwLTB4QzcgKi8KKwkweDMwQzgsMHgzMEM5LDB4MzBDQSwweDMwQ0IsMHgzMENDLDB4MzBDRCwweDMwQ0UsMHgzMENGLC8qIDB4QzgtMHhDRiAqLworCTB4MzBEMCwweDMwRDEsMHgzMEQyLDB4MzBEMywweDMwRDQsMHgzMEQ1LDB4MzBENiwweDMwRDcsLyogMHhEMC0weEQ3ICovCisJMHgzMEQ4LDB4MzBEOSwweDMwREEsMHgzMERCLDB4MzBEQywweDMwREQsMHgzMERFLDB4MzBERiwvKiAweEQ4LTB4REYgKi8KKwkweDMwRTAsMHgzMEUxLDB4MzBFMiwweDMwRTMsMHgzMEU0LDB4MzBFNSwweDMwRTYsMHgzMEU3LC8qIDB4RTAtMHhFNyAqLworCTB4MzBFOCwweDMwRTksMHgzMEVBLDB4MzBFQiwweDMwRUMsMHgzMEVELDB4MzBFRSwweDMwRUYsLyogMHhFOC0weEVGICovCisJMHgzMEYwLDB4MzBGMSwweDMwRjIsMHgzMEYzLDB4MzBGNCwweDMwRjUsMHgzMEY2LDB4MDAwMCwvKiAweEYwLTB4RjcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BQ1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDQ0ZFLDB4Q0NGRiwweENEMDAsMHhDRDAyLDB4Q0QwMywweENEMDQsMHhDRDA1LC8qIDB4NDAtMHg0NyAqLworCTB4Q0QwNiwweENEMDcsMHhDRDBBLDB4Q0QwQiwweENEMEQsMHhDRDBFLDB4Q0QwRiwweENEMTEsLyogMHg0OC0weDRGICovCisJMHhDRDEyLDB4Q0QxMywweENEMTQsMHhDRDE1LDB4Q0QxNiwweENEMTcsMHhDRDFBLDB4Q0QxQywvKiAweDUwLTB4NTcgKi8KKwkweENEMUUsMHhDRDFGLDB4Q0QyMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweENEMjEsMHhDRDIyLDB4Q0QyMywweENEMjUsMHhDRDI2LDB4Q0QyNywweENEMjksLyogMHg2MC0weDY3ICovCisJMHhDRDJBLDB4Q0QyQiwweENEMkQsMHhDRDJFLDB4Q0QyRiwweENEMzAsMHhDRDMxLDB4Q0QzMiwvKiAweDY4LTB4NkYgKi8KKwkweENEMzMsMHhDRDM0LDB4Q0QzNSwweENEMzYsMHhDRDM3LDB4Q0QzOCwweENEM0EsMHhDRDNCLC8qIDB4NzAtMHg3NyAqLworCTB4Q0QzQywweENEM0QsMHhDRDNFLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhDRDNGLDB4Q0Q0MCwweENENDEsMHhDRDQyLDB4Q0Q0MywweENENDQsMHhDRDQ1LC8qIDB4ODAtMHg4NyAqLworCTB4Q0Q0NiwweENENDcsMHhDRDQ4LDB4Q0Q0OSwweENENEEsMHhDRDRCLDB4Q0Q0QywweENENEQsLyogMHg4OC0weDhGICovCisJMHhDRDRFLDB4Q0Q0RiwweENENTAsMHhDRDUxLDB4Q0Q1MiwweENENTMsMHhDRDU0LDB4Q0Q1NSwvKiAweDkwLTB4OTcgKi8KKwkweENENTYsMHhDRDU3LDB4Q0Q1OCwweENENTksMHhDRDVBLDB4Q0Q1QiwweENENUQsMHhDRDVFLC8qIDB4OTgtMHg5RiAqLworCTB4Q0Q1RiwweDA0MTAsMHgwNDExLDB4MDQxMiwweDA0MTMsMHgwNDE0LDB4MDQxNSwweDA0MDEsLyogMHhBMC0weEE3ICovCisJMHgwNDE2LDB4MDQxNywweDA0MTgsMHgwNDE5LDB4MDQxQSwweDA0MUIsMHgwNDFDLDB4MDQxRCwvKiAweEE4LTB4QUYgKi8KKwkweDA0MUUsMHgwNDFGLDB4MDQyMCwweDA0MjEsMHgwNDIyLDB4MDQyMywweDA0MjQsMHgwNDI1LC8qIDB4QjAtMHhCNyAqLworCTB4MDQyNiwweDA0MjcsMHgwNDI4LDB4MDQyOSwweDA0MkEsMHgwNDJCLDB4MDQyQywweDA0MkQsLyogMHhCOC0weEJGICovCisJMHgwNDJFLDB4MDQyRiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEMwLTB4QzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QzgtMHhDRiAqLworCTB4MDAwMCwweDA0MzAsMHgwNDMxLDB4MDQzMiwweDA0MzMsMHgwNDM0LDB4MDQzNSwweDA0NTEsLyogMHhEMC0weEQ3ICovCisJMHgwNDM2LDB4MDQzNywweDA0MzgsMHgwNDM5LDB4MDQzQSwweDA0M0IsMHgwNDNDLDB4MDQzRCwvKiAweEQ4LTB4REYgKi8KKwkweDA0M0UsMHgwNDNGLDB4MDQ0MCwweDA0NDEsMHgwNDQyLDB4MDQ0MywweDA0NDQsMHgwNDQ1LC8qIDB4RTAtMHhFNyAqLworCTB4MDQ0NiwweDA0NDcsMHgwNDQ4LDB4MDQ0OSwweDA0NEEsMHgwNDRCLDB4MDQ0QywweDA0NEQsLyogMHhFOC0weEVGICovCisJMHgwNDRFLDB4MDQ0RiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEYwLTB4RjcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BRFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDRDYxLDB4Q0Q2MiwweENENjMsMHhDRDY1LDB4Q0Q2NiwweENENjcsMHhDRDY4LC8qIDB4NDAtMHg0NyAqLworCTB4Q0Q2OSwweENENkEsMHhDRDZCLDB4Q0Q2RSwweENENzAsMHhDRDcyLDB4Q0Q3MywweENENzQsLyogMHg0OC0weDRGICovCisJMHhDRDc1LDB4Q0Q3NiwweENENzcsMHhDRDc5LDB4Q0Q3QSwweENEN0IsMHhDRDdDLDB4Q0Q3RCwvKiAweDUwLTB4NTcgKi8KKwkweENEN0UsMHhDRDdGLDB4Q0Q4MCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweENEODEsMHhDRDgyLDB4Q0Q4MywweENEODQsMHhDRDg1LDB4Q0Q4NiwweENEODcsLyogMHg2MC0weDY3ICovCisJMHhDRDg5LDB4Q0Q4QSwweENEOEIsMHhDRDhDLDB4Q0Q4RCwweENEOEUsMHhDRDhGLDB4Q0Q5MCwvKiAweDY4LTB4NkYgKi8KKwkweENEOTEsMHhDRDkyLDB4Q0Q5MywweENEOTYsMHhDRDk3LDB4Q0Q5OSwweENEOUEsMHhDRDlCLC8qIDB4NzAtMHg3NyAqLworCTB4Q0Q5RCwweENEOUUsMHhDRDlGLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhDREEwLDB4Q0RBMSwweENEQTIsMHhDREEzLDB4Q0RBNiwweENEQTgsMHhDREFBLC8qIDB4ODAtMHg4NyAqLworCTB4Q0RBQiwweENEQUMsMHhDREFELDB4Q0RBRSwweENEQUYsMHhDREIxLDB4Q0RCMiwweENEQjMsLyogMHg4OC0weDhGICovCisJMHhDREI0LDB4Q0RCNSwweENEQjYsMHhDREI3LDB4Q0RCOCwweENEQjksMHhDREJBLDB4Q0RCQiwvKiAweDkwLTB4OTcgKi8KKwkweENEQkMsMHhDREJELDB4Q0RCRSwweENEQkYsMHhDREMwLDB4Q0RDMSwweENEQzIsMHhDREMzLC8qIDB4OTgtMHg5RiAqLworCTB4Q0RDNSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhBMC0weEE3ICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQUVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4Q0RDNiwweENEQzcsMHhDREM4LDB4Q0RDOSwweENEQ0EsMHhDRENCLDB4Q0RDRCwvKiAweDQwLTB4NDcgKi8KKwkweENEQ0UsMHhDRENGLDB4Q0REMSwweENERDIsMHhDREQzLDB4Q0RENCwweENERDUsMHhDREQ2LC8qIDB4NDgtMHg0RiAqLworCTB4Q0RENywweENERDgsMHhDREQ5LDB4Q0REQSwweENEREIsMHhDRERDLDB4Q0RERCwweENEREUsLyogMHg1MC0weDU3ICovCisJMHhDRERGLDB4Q0RFMCwweENERTEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhDREUyLDB4Q0RFMywweENERTQsMHhDREU1LDB4Q0RFNiwweENERTcsMHhDREU5LC8qIDB4NjAtMHg2NyAqLworCTB4Q0RFQSwweENERUIsMHhDREVELDB4Q0RFRSwweENERUYsMHhDREYxLDB4Q0RGMiwweENERjMsLyogMHg2OC0weDZGICovCisJMHhDREY0LDB4Q0RGNSwweENERjYsMHhDREY3LDB4Q0RGQSwweENERkMsMHhDREZFLDB4Q0RGRiwvKiAweDcwLTB4NzcgKi8KKwkweENFMDAsMHhDRTAxLDB4Q0UwMiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4Q0UwMywweENFMDUsMHhDRTA2LDB4Q0UwNywweENFMDksMHhDRTBBLDB4Q0UwQiwvKiAweDgwLTB4ODcgKi8KKwkweENFMEQsMHhDRTBFLDB4Q0UwRiwweENFMTAsMHhDRTExLDB4Q0UxMiwweENFMTMsMHhDRTE1LC8qIDB4ODgtMHg4RiAqLworCTB4Q0UxNiwweENFMTcsMHhDRTE4LDB4Q0UxQSwweENFMUIsMHhDRTFDLDB4Q0UxRCwweENFMUUsLyogMHg5MC0weDk3ICovCisJMHhDRTFGLDB4Q0UyMiwweENFMjMsMHhDRTI1LDB4Q0UyNiwweENFMjcsMHhDRTI5LDB4Q0UyQSwvKiAweDk4LTB4OUYgKi8KKwkweENFMkIsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QTAtMHhBNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0FGWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweENFMkMsMHhDRTJELDB4Q0UyRSwweENFMkYsMHhDRTMyLDB4Q0UzNCwweENFMzYsLyogMHg0MC0weDQ3ICovCisJMHhDRTM3LDB4Q0UzOCwweENFMzksMHhDRTNBLDB4Q0UzQiwweENFM0MsMHhDRTNELDB4Q0UzRSwvKiAweDQ4LTB4NEYgKi8KKwkweENFM0YsMHhDRTQwLDB4Q0U0MSwweENFNDIsMHhDRTQzLDB4Q0U0NCwweENFNDUsMHhDRTQ2LC8qIDB4NTAtMHg1NyAqLworCTB4Q0U0NywweENFNDgsMHhDRTQ5LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4Q0U0QSwweENFNEIsMHhDRTRDLDB4Q0U0RCwweENFNEUsMHhDRTRGLDB4Q0U1MCwvKiAweDYwLTB4NjcgKi8KKwkweENFNTEsMHhDRTUyLDB4Q0U1MywweENFNTQsMHhDRTU1LDB4Q0U1NiwweENFNTcsMHhDRTVBLC8qIDB4NjgtMHg2RiAqLworCTB4Q0U1QiwweENFNUQsMHhDRTVFLDB4Q0U2MiwweENFNjMsMHhDRTY0LDB4Q0U2NSwweENFNjYsLyogMHg3MC0weDc3ICovCisJMHhDRTY3LDB4Q0U2QSwweENFNkMsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweENFNkUsMHhDRTZGLDB4Q0U3MCwweENFNzEsMHhDRTcyLDB4Q0U3MywweENFNzYsLyogMHg4MC0weDg3ICovCisJMHhDRTc3LDB4Q0U3OSwweENFN0EsMHhDRTdCLDB4Q0U3RCwweENFN0UsMHhDRTdGLDB4Q0U4MCwvKiAweDg4LTB4OEYgKi8KKwkweENFODEsMHhDRTgyLDB4Q0U4MywweENFODYsMHhDRTg4LDB4Q0U4QSwweENFOEIsMHhDRThDLC8qIDB4OTAtMHg5NyAqLworCTB4Q0U4RCwweENFOEUsMHhDRThGLDB4Q0U5MiwweENFOTMsMHhDRTk1LDB4Q0U5NiwweENFOTcsLyogMHg5OC0weDlGICovCisJMHhDRTk5LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEEwLTB4QTcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CMFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDRTlBLDB4Q0U5QiwweENFOUMsMHhDRTlELDB4Q0U5RSwweENFOUYsMHhDRUEyLC8qIDB4NDAtMHg0NyAqLworCTB4Q0VBNiwweENFQTcsMHhDRUE4LDB4Q0VBOSwweENFQUEsMHhDRUFCLDB4Q0VBRSwweENFQUYsLyogMHg0OC0weDRGICovCisJMHhDRUIwLDB4Q0VCMSwweENFQjIsMHhDRUIzLDB4Q0VCNCwweENFQjUsMHhDRUI2LDB4Q0VCNywvKiAweDUwLTB4NTcgKi8KKwkweENFQjgsMHhDRUI5LDB4Q0VCQSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweENFQkIsMHhDRUJDLDB4Q0VCRCwweENFQkUsMHhDRUJGLDB4Q0VDMCwweENFQzIsLyogMHg2MC0weDY3ICovCisJMHhDRUMzLDB4Q0VDNCwweENFQzUsMHhDRUM2LDB4Q0VDNywweENFQzgsMHhDRUM5LDB4Q0VDQSwvKiAweDY4LTB4NkYgKi8KKwkweENFQ0IsMHhDRUNDLDB4Q0VDRCwweENFQ0UsMHhDRUNGLDB4Q0VEMCwweENFRDEsMHhDRUQyLC8qIDB4NzAtMHg3NyAqLworCTB4Q0VEMywweENFRDQsMHhDRUQ1LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhDRUQ2LDB4Q0VENywweENFRDgsMHhDRUQ5LDB4Q0VEQSwweENFREIsMHhDRURDLC8qIDB4ODAtMHg4NyAqLworCTB4Q0VERCwweENFREUsMHhDRURGLDB4Q0VFMCwweENFRTEsMHhDRUUyLDB4Q0VFMywweENFRTYsLyogMHg4OC0weDhGICovCisJMHhDRUU3LDB4Q0VFOSwweENFRUEsMHhDRUVELDB4Q0VFRSwweENFRUYsMHhDRUYwLDB4Q0VGMSwvKiAweDkwLTB4OTcgKi8KKwkweENFRjIsMHhDRUYzLDB4Q0VGNiwweENFRkEsMHhDRUZCLDB4Q0VGQywweENFRkQsMHhDRUZFLC8qIDB4OTgtMHg5RiAqLworCTB4Q0VGRiwweEFDMDAsMHhBQzAxLDB4QUMwNCwweEFDMDcsMHhBQzA4LDB4QUMwOSwweEFDMEEsLyogMHhBMC0weEE3ICovCisJMHhBQzEwLDB4QUMxMSwweEFDMTIsMHhBQzEzLDB4QUMxNCwweEFDMTUsMHhBQzE2LDB4QUMxNywvKiAweEE4LTB4QUYgKi8KKwkweEFDMTksMHhBQzFBLDB4QUMxQiwweEFDMUMsMHhBQzFELDB4QUMyMCwweEFDMjQsMHhBQzJDLC8qIDB4QjAtMHhCNyAqLworCTB4QUMyRCwweEFDMkYsMHhBQzMwLDB4QUMzMSwweEFDMzgsMHhBQzM5LDB4QUMzQywweEFDNDAsLyogMHhCOC0weEJGICovCisJMHhBQzRCLDB4QUM0RCwweEFDNTQsMHhBQzU4LDB4QUM1QywweEFDNzAsMHhBQzcxLDB4QUM3NCwvKiAweEMwLTB4QzcgKi8KKwkweEFDNzcsMHhBQzc4LDB4QUM3QSwweEFDODAsMHhBQzgxLDB4QUM4MywweEFDODQsMHhBQzg1LC8qIDB4QzgtMHhDRiAqLworCTB4QUM4NiwweEFDODksMHhBQzhBLDB4QUM4QiwweEFDOEMsMHhBQzkwLDB4QUM5NCwweEFDOUMsLyogMHhEMC0weEQ3ICovCisJMHhBQzlELDB4QUM5RiwweEFDQTAsMHhBQ0ExLDB4QUNBOCwweEFDQTksMHhBQ0FBLDB4QUNBQywvKiAweEQ4LTB4REYgKi8KKwkweEFDQUYsMHhBQ0IwLDB4QUNCOCwweEFDQjksMHhBQ0JCLDB4QUNCQywweEFDQkQsMHhBQ0MxLC8qIDB4RTAtMHhFNyAqLworCTB4QUNDNCwweEFDQzgsMHhBQ0NDLDB4QUNENSwweEFDRDcsMHhBQ0UwLDB4QUNFMSwweEFDRTQsLyogMHhFOC0weEVGICovCisJMHhBQ0U3LDB4QUNFOCwweEFDRUEsMHhBQ0VDLDB4QUNFRiwweEFDRjAsMHhBQ0YxLDB4QUNGMywvKiAweEYwLTB4RjcgKi8KKwkweEFDRjUsMHhBQ0Y2LDB4QUNGQywweEFDRkQsMHhBRDAwLDB4QUQwNCwweEFEMDYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0IxWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweENGMDIsMHhDRjAzLDB4Q0YwNSwweENGMDYsMHhDRjA3LDB4Q0YwOSwweENGMEEsLyogMHg0MC0weDQ3ICovCisJMHhDRjBCLDB4Q0YwQywweENGMEQsMHhDRjBFLDB4Q0YwRiwweENGMTIsMHhDRjE0LDB4Q0YxNiwvKiAweDQ4LTB4NEYgKi8KKwkweENGMTcsMHhDRjE4LDB4Q0YxOSwweENGMUEsMHhDRjFCLDB4Q0YxRCwweENGMUUsMHhDRjFGLC8qIDB4NTAtMHg1NyAqLworCTB4Q0YyMSwweENGMjIsMHhDRjIzLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4Q0YyNSwweENGMjYsMHhDRjI3LDB4Q0YyOCwweENGMjksMHhDRjJBLDB4Q0YyQiwvKiAweDYwLTB4NjcgKi8KKwkweENGMkUsMHhDRjMyLDB4Q0YzMywweENGMzQsMHhDRjM1LDB4Q0YzNiwweENGMzcsMHhDRjM5LC8qIDB4NjgtMHg2RiAqLworCTB4Q0YzQSwweENGM0IsMHhDRjNDLDB4Q0YzRCwweENGM0UsMHhDRjNGLDB4Q0Y0MCwweENGNDEsLyogMHg3MC0weDc3ICovCisJMHhDRjQyLDB4Q0Y0MywweENGNDQsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweENGNDUsMHhDRjQ2LDB4Q0Y0NywweENGNDgsMHhDRjQ5LDB4Q0Y0QSwweENGNEIsLyogMHg4MC0weDg3ICovCisJMHhDRjRDLDB4Q0Y0RCwweENGNEUsMHhDRjRGLDB4Q0Y1MCwweENGNTEsMHhDRjUyLDB4Q0Y1MywvKiAweDg4LTB4OEYgKi8KKwkweENGNTYsMHhDRjU3LDB4Q0Y1OSwweENGNUEsMHhDRjVCLDB4Q0Y1RCwweENGNUUsMHhDRjVGLC8qIDB4OTAtMHg5NyAqLworCTB4Q0Y2MCwweENGNjEsMHhDRjYyLDB4Q0Y2MywweENGNjYsMHhDRjY4LDB4Q0Y2QSwweENGNkIsLyogMHg5OC0weDlGICovCisJMHhDRjZDLDB4QUQwQywweEFEMEQsMHhBRDBGLDB4QUQxMSwweEFEMTgsMHhBRDFDLDB4QUQyMCwvKiAweEEwLTB4QTcgKi8KKwkweEFEMjksMHhBRDJDLDB4QUQyRCwweEFEMzQsMHhBRDM1LDB4QUQzOCwweEFEM0MsMHhBRDQ0LC8qIDB4QTgtMHhBRiAqLworCTB4QUQ0NSwweEFENDcsMHhBRDQ5LDB4QUQ1MCwweEFENTQsMHhBRDU4LDB4QUQ2MSwweEFENjMsLyogMHhCMC0weEI3ICovCisJMHhBRDZDLDB4QUQ2RCwweEFENzAsMHhBRDczLDB4QUQ3NCwweEFENzUsMHhBRDc2LDB4QUQ3QiwvKiAweEI4LTB4QkYgKi8KKwkweEFEN0MsMHhBRDdELDB4QUQ3RiwweEFEODEsMHhBRDgyLDB4QUQ4OCwweEFEODksMHhBRDhDLC8qIDB4QzAtMHhDNyAqLworCTB4QUQ5MCwweEFEOUMsMHhBRDlELDB4QURBNCwweEFEQjcsMHhBREMwLDB4QURDMSwweEFEQzQsLyogMHhDOC0weENGICovCisJMHhBREM4LDB4QUREMCwweEFERDEsMHhBREQzLDB4QUREQywweEFERTAsMHhBREU0LDB4QURGOCwvKiAweEQwLTB4RDcgKi8KKwkweEFERjksMHhBREZDLDB4QURGRiwweEFFMDAsMHhBRTAxLDB4QUUwOCwweEFFMDksMHhBRTBCLC8qIDB4RDgtMHhERiAqLworCTB4QUUwRCwweEFFMTQsMHhBRTMwLDB4QUUzMSwweEFFMzQsMHhBRTM3LDB4QUUzOCwweEFFM0EsLyogMHhFMC0weEU3ICovCisJMHhBRTQwLDB4QUU0MSwweEFFNDMsMHhBRTQ1LDB4QUU0NiwweEFFNEEsMHhBRTRDLDB4QUU0RCwvKiAweEU4LTB4RUYgKi8KKwkweEFFNEUsMHhBRTUwLDB4QUU1NCwweEFFNTYsMHhBRTVDLDB4QUU1RCwweEFFNUYsMHhBRTYwLC8qIDB4RjAtMHhGNyAqLworCTB4QUU2MSwweEFFNjUsMHhBRTY4LDB4QUU2OSwweEFFNkMsMHhBRTcwLDB4QUU3OCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4Q0Y2RCwweENGNkUsMHhDRjZGLDB4Q0Y3MiwweENGNzMsMHhDRjc1LDB4Q0Y3NiwvKiAweDQwLTB4NDcgKi8KKwkweENGNzcsMHhDRjc5LDB4Q0Y3QSwweENGN0IsMHhDRjdDLDB4Q0Y3RCwweENGN0UsMHhDRjdGLC8qIDB4NDgtMHg0RiAqLworCTB4Q0Y4MSwweENGODIsMHhDRjgzLDB4Q0Y4NCwweENGODYsMHhDRjg3LDB4Q0Y4OCwweENGODksLyogMHg1MC0weDU3ICovCisJMHhDRjhBLDB4Q0Y4QiwweENGOEQsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhDRjhFLDB4Q0Y4RiwweENGOTAsMHhDRjkxLDB4Q0Y5MiwweENGOTMsMHhDRjk0LC8qIDB4NjAtMHg2NyAqLworCTB4Q0Y5NSwweENGOTYsMHhDRjk3LDB4Q0Y5OCwweENGOTksMHhDRjlBLDB4Q0Y5QiwweENGOUMsLyogMHg2OC0weDZGICovCisJMHhDRjlELDB4Q0Y5RSwweENGOUYsMHhDRkEwLDB4Q0ZBMiwweENGQTMsMHhDRkE0LDB4Q0ZBNSwvKiAweDcwLTB4NzcgKi8KKwkweENGQTYsMHhDRkE3LDB4Q0ZBOSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4Q0ZBQSwweENGQUIsMHhDRkFDLDB4Q0ZBRCwweENGQUUsMHhDRkFGLDB4Q0ZCMSwvKiAweDgwLTB4ODcgKi8KKwkweENGQjIsMHhDRkIzLDB4Q0ZCNCwweENGQjUsMHhDRkI2LDB4Q0ZCNywweENGQjgsMHhDRkI5LC8qIDB4ODgtMHg4RiAqLworCTB4Q0ZCQSwweENGQkIsMHhDRkJDLDB4Q0ZCRCwweENGQkUsMHhDRkJGLDB4Q0ZDMCwweENGQzEsLyogMHg5MC0weDk3ICovCisJMHhDRkMyLDB4Q0ZDMywweENGQzUsMHhDRkM2LDB4Q0ZDNywweENGQzgsMHhDRkM5LDB4Q0ZDQSwvKiAweDk4LTB4OUYgKi8KKwkweENGQ0IsMHhBRTc5LDB4QUU3QiwweEFFN0MsMHhBRTdELDB4QUU4NCwweEFFODUsMHhBRThDLC8qIDB4QTAtMHhBNyAqLworCTB4QUVCQywweEFFQkQsMHhBRUJFLDB4QUVDMCwweEFFQzQsMHhBRUNDLDB4QUVDRCwweEFFQ0YsLyogMHhBOC0weEFGICovCisJMHhBRUQwLDB4QUVEMSwweEFFRDgsMHhBRUQ5LDB4QUVEQywweEFFRTgsMHhBRUVCLDB4QUVFRCwvKiAweEIwLTB4QjcgKi8KKwkweEFFRjQsMHhBRUY4LDB4QUVGQywweEFGMDcsMHhBRjA4LDB4QUYwRCwweEFGMTAsMHhBRjJDLC8qIDB4QjgtMHhCRiAqLworCTB4QUYyRCwweEFGMzAsMHhBRjMyLDB4QUYzNCwweEFGM0MsMHhBRjNELDB4QUYzRiwweEFGNDEsLyogMHhDMC0weEM3ICovCisJMHhBRjQyLDB4QUY0MywweEFGNDgsMHhBRjQ5LDB4QUY1MCwweEFGNUMsMHhBRjVELDB4QUY2NCwvKiAweEM4LTB4Q0YgKi8KKwkweEFGNjUsMHhBRjc5LDB4QUY4MCwweEFGODQsMHhBRjg4LDB4QUY5MCwweEFGOTEsMHhBRjk1LC8qIDB4RDAtMHhENyAqLworCTB4QUY5QywweEFGQjgsMHhBRkI5LDB4QUZCQywweEFGQzAsMHhBRkM3LDB4QUZDOCwweEFGQzksLyogMHhEOC0weERGICovCisJMHhBRkNCLDB4QUZDRCwweEFGQ0UsMHhBRkQ0LDB4QUZEQywweEFGRTgsMHhBRkU5LDB4QUZGMCwvKiAweEUwLTB4RTcgKi8KKwkweEFGRjEsMHhBRkY0LDB4QUZGOCwweEIwMDAsMHhCMDAxLDB4QjAwNCwweEIwMEMsMHhCMDEwLC8qIDB4RTgtMHhFRiAqLworCTB4QjAxNCwweEIwMUMsMHhCMDFELDB4QjAyOCwweEIwNDQsMHhCMDQ1LDB4QjA0OCwweEIwNEEsLyogMHhGMC0weEY3ICovCisJMHhCMDRDLDB4QjA0RSwweEIwNTMsMHhCMDU0LDB4QjA1NSwweEIwNTcsMHhCMDU5LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CM1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDRkNDLDB4Q0ZDRCwweENGQ0UsMHhDRkNGLDB4Q0ZEMCwweENGRDEsMHhDRkQyLC8qIDB4NDAtMHg0NyAqLworCTB4Q0ZEMywweENGRDQsMHhDRkQ1LDB4Q0ZENiwweENGRDcsMHhDRkQ4LDB4Q0ZEOSwweENGREEsLyogMHg0OC0weDRGICovCisJMHhDRkRCLDB4Q0ZEQywweENGREQsMHhDRkRFLDB4Q0ZERiwweENGRTIsMHhDRkUzLDB4Q0ZFNSwvKiAweDUwLTB4NTcgKi8KKwkweENGRTYsMHhDRkU3LDB4Q0ZFOSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweENGRUEsMHhDRkVCLDB4Q0ZFQywweENGRUQsMHhDRkVFLDB4Q0ZFRiwweENGRjIsLyogMHg2MC0weDY3ICovCisJMHhDRkY0LDB4Q0ZGNiwweENGRjcsMHhDRkY4LDB4Q0ZGOSwweENGRkEsMHhDRkZCLDB4Q0ZGRCwvKiAweDY4LTB4NkYgKi8KKwkweENGRkUsMHhDRkZGLDB4RDAwMSwweEQwMDIsMHhEMDAzLDB4RDAwNSwweEQwMDYsMHhEMDA3LC8qIDB4NzAtMHg3NyAqLworCTB4RDAwOCwweEQwMDksMHhEMDBBLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhEMDBCLDB4RDAwQywweEQwMEQsMHhEMDBFLDB4RDAwRiwweEQwMTAsMHhEMDEyLC8qIDB4ODAtMHg4NyAqLworCTB4RDAxMywweEQwMTQsMHhEMDE1LDB4RDAxNiwweEQwMTcsMHhEMDE5LDB4RDAxQSwweEQwMUIsLyogMHg4OC0weDhGICovCisJMHhEMDFDLDB4RDAxRCwweEQwMUUsMHhEMDFGLDB4RDAyMCwweEQwMjEsMHhEMDIyLDB4RDAyMywvKiAweDkwLTB4OTcgKi8KKwkweEQwMjQsMHhEMDI1LDB4RDAyNiwweEQwMjcsMHhEMDI4LDB4RDAyOSwweEQwMkEsMHhEMDJCLC8qIDB4OTgtMHg5RiAqLworCTB4RDAyQywweEIwNUQsMHhCMDdDLDB4QjA3RCwweEIwODAsMHhCMDg0LDB4QjA4QywweEIwOEQsLyogMHhBMC0weEE3ICovCisJMHhCMDhGLDB4QjA5MSwweEIwOTgsMHhCMDk5LDB4QjA5QSwweEIwOUMsMHhCMDlGLDB4QjBBMCwvKiAweEE4LTB4QUYgKi8KKwkweEIwQTEsMHhCMEEyLDB4QjBBOCwweEIwQTksMHhCMEFCLDB4QjBBQywweEIwQUQsMHhCMEFFLC8qIDB4QjAtMHhCNyAqLworCTB4QjBBRiwweEIwQjEsMHhCMEIzLDB4QjBCNCwweEIwQjUsMHhCMEI4LDB4QjBCQywweEIwQzQsLyogMHhCOC0weEJGICovCisJMHhCMEM1LDB4QjBDNywweEIwQzgsMHhCMEM5LDB4QjBEMCwweEIwRDEsMHhCMEQ0LDB4QjBEOCwvKiAweEMwLTB4QzcgKi8KKwkweEIwRTAsMHhCMEU1LDB4QjEwOCwweEIxMDksMHhCMTBCLDB4QjEwQywweEIxMTAsMHhCMTEyLC8qIDB4QzgtMHhDRiAqLworCTB4QjExMywweEIxMTgsMHhCMTE5LDB4QjExQiwweEIxMUMsMHhCMTFELDB4QjEyMywweEIxMjQsLyogMHhEMC0weEQ3ICovCisJMHhCMTI1LDB4QjEyOCwweEIxMkMsMHhCMTM0LDB4QjEzNSwweEIxMzcsMHhCMTM4LDB4QjEzOSwvKiAweEQ4LTB4REYgKi8KKwkweEIxNDAsMHhCMTQxLDB4QjE0NCwweEIxNDgsMHhCMTUwLDB4QjE1MSwweEIxNTQsMHhCMTU1LC8qIDB4RTAtMHhFNyAqLworCTB4QjE1OCwweEIxNUMsMHhCMTYwLDB4QjE3OCwweEIxNzksMHhCMTdDLDB4QjE4MCwweEIxODIsLyogMHhFOC0weEVGICovCisJMHhCMTg4LDB4QjE4OSwweEIxOEIsMHhCMThELDB4QjE5MiwweEIxOTMsMHhCMTk0LDB4QjE5OCwvKiAweEYwLTB4RjcgKi8KKwkweEIxOUMsMHhCMUE4LDB4QjFDQywweEIxRDAsMHhCMUQ0LDB4QjFEQywweEIxREQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0I0WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEQwMkUsMHhEMDJGLDB4RDAzMCwweEQwMzEsMHhEMDMyLDB4RDAzMywweEQwMzYsLyogMHg0MC0weDQ3ICovCisJMHhEMDM3LDB4RDAzOSwweEQwM0EsMHhEMDNCLDB4RDAzRCwweEQwM0UsMHhEMDNGLDB4RDA0MCwvKiAweDQ4LTB4NEYgKi8KKwkweEQwNDEsMHhEMDQyLDB4RDA0MywweEQwNDYsMHhEMDQ4LDB4RDA0QSwweEQwNEIsMHhEMDRDLC8qIDB4NTAtMHg1NyAqLworCTB4RDA0RCwweEQwNEUsMHhEMDRGLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4RDA1MSwweEQwNTIsMHhEMDUzLDB4RDA1NSwweEQwNTYsMHhEMDU3LDB4RDA1OSwvKiAweDYwLTB4NjcgKi8KKwkweEQwNUEsMHhEMDVCLDB4RDA1QywweEQwNUQsMHhEMDVFLDB4RDA1RiwweEQwNjEsMHhEMDYyLC8qIDB4NjgtMHg2RiAqLworCTB4RDA2MywweEQwNjQsMHhEMDY1LDB4RDA2NiwweEQwNjcsMHhEMDY4LDB4RDA2OSwweEQwNkEsLyogMHg3MC0weDc3ICovCisJMHhEMDZCLDB4RDA2RSwweEQwNkYsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEQwNzEsMHhEMDcyLDB4RDA3MywweEQwNzUsMHhEMDc2LDB4RDA3NywweEQwNzgsLyogMHg4MC0weDg3ICovCisJMHhEMDc5LDB4RDA3QSwweEQwN0IsMHhEMDdFLDB4RDA3RiwweEQwODAsMHhEMDgyLDB4RDA4MywvKiAweDg4LTB4OEYgKi8KKwkweEQwODQsMHhEMDg1LDB4RDA4NiwweEQwODcsMHhEMDg4LDB4RDA4OSwweEQwOEEsMHhEMDhCLC8qIDB4OTAtMHg5NyAqLworCTB4RDA4QywweEQwOEQsMHhEMDhFLDB4RDA4RiwweEQwOTAsMHhEMDkxLDB4RDA5MiwweEQwOTMsLyogMHg5OC0weDlGICovCisJMHhEMDk0LDB4QjFERiwweEIxRTgsMHhCMUU5LDB4QjFFQywweEIxRjAsMHhCMUY5LDB4QjFGQiwvKiAweEEwLTB4QTcgKi8KKwkweEIxRkQsMHhCMjA0LDB4QjIwNSwweEIyMDgsMHhCMjBCLDB4QjIwQywweEIyMTQsMHhCMjE1LC8qIDB4QTgtMHhBRiAqLworCTB4QjIxNywweEIyMTksMHhCMjIwLDB4QjIzNCwweEIyM0MsMHhCMjU4LDB4QjI1QywweEIyNjAsLyogMHhCMC0weEI3ICovCisJMHhCMjY4LDB4QjI2OSwweEIyNzQsMHhCMjc1LDB4QjI3QywweEIyODQsMHhCMjg1LDB4QjI4OSwvKiAweEI4LTB4QkYgKi8KKwkweEIyOTAsMHhCMjkxLDB4QjI5NCwweEIyOTgsMHhCMjk5LDB4QjI5QSwweEIyQTAsMHhCMkExLC8qIDB4QzAtMHhDNyAqLworCTB4QjJBMywweEIyQTUsMHhCMkE2LDB4QjJBQSwweEIyQUMsMHhCMkIwLDB4QjJCNCwweEIyQzgsLyogMHhDOC0weENGICovCisJMHhCMkM5LDB4QjJDQywweEIyRDAsMHhCMkQyLDB4QjJEOCwweEIyRDksMHhCMkRCLDB4QjJERCwvKiAweEQwLTB4RDcgKi8KKwkweEIyRTIsMHhCMkU0LDB4QjJFNSwweEIyRTYsMHhCMkU4LDB4QjJFQiwweEIyRUMsMHhCMkVELC8qIDB4RDgtMHhERiAqLworCTB4QjJFRSwweEIyRUYsMHhCMkYzLDB4QjJGNCwweEIyRjUsMHhCMkY3LDB4QjJGOCwweEIyRjksLyogMHhFMC0weEU3ICovCisJMHhCMkZBLDB4QjJGQiwweEIyRkYsMHhCMzAwLDB4QjMwMSwweEIzMDQsMHhCMzA4LDB4QjMxMCwvKiAweEU4LTB4RUYgKi8KKwkweEIzMTEsMHhCMzEzLDB4QjMxNCwweEIzMTUsMHhCMzFDLDB4QjM1NCwweEIzNTUsMHhCMzU2LC8qIDB4RjAtMHhGNyAqLworCTB4QjM1OCwweEIzNUIsMHhCMzVDLDB4QjM1RSwweEIzNUYsMHhCMzY0LDB4QjM2NSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4RDA5NSwweEQwOTYsMHhEMDk3LDB4RDA5OCwweEQwOTksMHhEMDlBLDB4RDA5QiwvKiAweDQwLTB4NDcgKi8KKwkweEQwOUMsMHhEMDlELDB4RDA5RSwweEQwOUYsMHhEMEEwLDB4RDBBMSwweEQwQTIsMHhEMEEzLC8qIDB4NDgtMHg0RiAqLworCTB4RDBBNiwweEQwQTcsMHhEMEE5LDB4RDBBQSwweEQwQUIsMHhEMEFELDB4RDBBRSwweEQwQUYsLyogMHg1MC0weDU3ICovCisJMHhEMEIwLDB4RDBCMSwweEQwQjIsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhEMEIzLDB4RDBCNiwweEQwQjgsMHhEMEJBLDB4RDBCQiwweEQwQkMsMHhEMEJELC8qIDB4NjAtMHg2NyAqLworCTB4RDBCRSwweEQwQkYsMHhEMEMyLDB4RDBDMywweEQwQzUsMHhEMEM2LDB4RDBDNywweEQwQ0EsLyogMHg2OC0weDZGICovCisJMHhEMENCLDB4RDBDQywweEQwQ0QsMHhEMENFLDB4RDBDRiwweEQwRDIsMHhEMEQ2LDB4RDBENywvKiAweDcwLTB4NzcgKi8KKwkweEQwRDgsMHhEMEQ5LDB4RDBEQSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4RDBEQiwweEQwREUsMHhEMERGLDB4RDBFMSwweEQwRTIsMHhEMEUzLDB4RDBFNSwvKiAweDgwLTB4ODcgKi8KKwkweEQwRTYsMHhEMEU3LDB4RDBFOCwweEQwRTksMHhEMEVBLDB4RDBFQiwweEQwRUUsMHhEMEYyLC8qIDB4ODgtMHg4RiAqLworCTB4RDBGMywweEQwRjQsMHhEMEY1LDB4RDBGNiwweEQwRjcsMHhEMEY5LDB4RDBGQSwweEQwRkIsLyogMHg5MC0weDk3ICovCisJMHhEMEZDLDB4RDBGRCwweEQwRkUsMHhEMEZGLDB4RDEwMCwweEQxMDEsMHhEMTAyLDB4RDEwMywvKiAweDk4LTB4OUYgKi8KKwkweEQxMDQsMHhCMzY3LDB4QjM2OSwweEIzNkIsMHhCMzZFLDB4QjM3MCwweEIzNzEsMHhCMzc0LC8qIDB4QTAtMHhBNyAqLworCTB4QjM3OCwweEIzODAsMHhCMzgxLDB4QjM4MywweEIzODQsMHhCMzg1LDB4QjM4QywweEIzOTAsLyogMHhBOC0weEFGICovCisJMHhCMzk0LDB4QjNBMCwweEIzQTEsMHhCM0E4LDB4QjNBQywweEIzQzQsMHhCM0M1LDB4QjNDOCwvKiAweEIwLTB4QjcgKi8KKwkweEIzQ0IsMHhCM0NDLDB4QjNDRSwweEIzRDAsMHhCM0Q0LDB4QjNENSwweEIzRDcsMHhCM0Q5LC8qIDB4QjgtMHhCRiAqLworCTB4QjNEQiwweEIzREQsMHhCM0UwLDB4QjNFNCwweEIzRTgsMHhCM0ZDLDB4QjQxMCwweEI0MTgsLyogMHhDMC0weEM3ICovCisJMHhCNDFDLDB4QjQyMCwweEI0MjgsMHhCNDI5LDB4QjQyQiwweEI0MzQsMHhCNDUwLDB4QjQ1MSwvKiAweEM4LTB4Q0YgKi8KKwkweEI0NTQsMHhCNDU4LDB4QjQ2MCwweEI0NjEsMHhCNDYzLDB4QjQ2NSwweEI0NkMsMHhCNDgwLC8qIDB4RDAtMHhENyAqLworCTB4QjQ4OCwweEI0OUQsMHhCNEE0LDB4QjRBOCwweEI0QUMsMHhCNEI1LDB4QjRCNywweEI0QjksLyogMHhEOC0weERGICovCisJMHhCNEMwLDB4QjRDNCwweEI0QzgsMHhCNEQwLDB4QjRENSwweEI0REMsMHhCNERELDB4QjRFMCwvKiAweEUwLTB4RTcgKi8KKwkweEI0RTMsMHhCNEU0LDB4QjRFNiwweEI0RUMsMHhCNEVELDB4QjRFRiwweEI0RjEsMHhCNEY4LC8qIDB4RTgtMHhFRiAqLworCTB4QjUxNCwweEI1MTUsMHhCNTE4LDB4QjUxQiwweEI1MUMsMHhCNTI0LDB4QjUyNSwweEI1MjcsLyogMHhGMC0weEY3ICovCisJMHhCNTI4LDB4QjUyOSwweEI1MkEsMHhCNTMwLDB4QjUzMSwweEI1MzQsMHhCNTM4LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CNlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhEMTA1LDB4RDEwNiwweEQxMDcsMHhEMTA4LDB4RDEwOSwweEQxMEEsMHhEMTBCLC8qIDB4NDAtMHg0NyAqLworCTB4RDEwQywweEQxMEUsMHhEMTBGLDB4RDExMCwweEQxMTEsMHhEMTEyLDB4RDExMywweEQxMTQsLyogMHg0OC0weDRGICovCisJMHhEMTE1LDB4RDExNiwweEQxMTcsMHhEMTE4LDB4RDExOSwweEQxMUEsMHhEMTFCLDB4RDExQywvKiAweDUwLTB4NTcgKi8KKwkweEQxMUQsMHhEMTFFLDB4RDExRiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEQxMjAsMHhEMTIxLDB4RDEyMiwweEQxMjMsMHhEMTI0LDB4RDEyNSwweEQxMjYsLyogMHg2MC0weDY3ICovCisJMHhEMTI3LDB4RDEyOCwweEQxMjksMHhEMTJBLDB4RDEyQiwweEQxMkMsMHhEMTJELDB4RDEyRSwvKiAweDY4LTB4NkYgKi8KKwkweEQxMkYsMHhEMTMyLDB4RDEzMywweEQxMzUsMHhEMTM2LDB4RDEzNywweEQxMzksMHhEMTNCLC8qIDB4NzAtMHg3NyAqLworCTB4RDEzQywweEQxM0QsMHhEMTNFLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhEMTNGLDB4RDE0MiwweEQxNDYsMHhEMTQ3LDB4RDE0OCwweEQxNDksMHhEMTRBLC8qIDB4ODAtMHg4NyAqLworCTB4RDE0QiwweEQxNEUsMHhEMTRGLDB4RDE1MSwweEQxNTIsMHhEMTUzLDB4RDE1NSwweEQxNTYsLyogMHg4OC0weDhGICovCisJMHhEMTU3LDB4RDE1OCwweEQxNTksMHhEMTVBLDB4RDE1QiwweEQxNUUsMHhEMTYwLDB4RDE2MiwvKiAweDkwLTB4OTcgKi8KKwkweEQxNjMsMHhEMTY0LDB4RDE2NSwweEQxNjYsMHhEMTY3LDB4RDE2OSwweEQxNkEsMHhEMTZCLC8qIDB4OTgtMHg5RiAqLworCTB4RDE2RCwweEI1NDAsMHhCNTQxLDB4QjU0MywweEI1NDQsMHhCNTQ1LDB4QjU0QiwweEI1NEMsLyogMHhBMC0weEE3ICovCisJMHhCNTRELDB4QjU1MCwweEI1NTQsMHhCNTVDLDB4QjU1RCwweEI1NUYsMHhCNTYwLDB4QjU2MSwvKiAweEE4LTB4QUYgKi8KKwkweEI1QTAsMHhCNUExLDB4QjVBNCwweEI1QTgsMHhCNUFBLDB4QjVBQiwweEI1QjAsMHhCNUIxLC8qIDB4QjAtMHhCNyAqLworCTB4QjVCMywweEI1QjQsMHhCNUI1LDB4QjVCQiwweEI1QkMsMHhCNUJELDB4QjVDMCwweEI1QzQsLyogMHhCOC0weEJGICovCisJMHhCNUNDLDB4QjVDRCwweEI1Q0YsMHhCNUQwLDB4QjVEMSwweEI1RDgsMHhCNUVDLDB4QjYxMCwvKiAweEMwLTB4QzcgKi8KKwkweEI2MTEsMHhCNjE0LDB4QjYxOCwweEI2MjUsMHhCNjJDLDB4QjYzNCwweEI2NDgsMHhCNjY0LC8qIDB4QzgtMHhDRiAqLworCTB4QjY2OCwweEI2OUMsMHhCNjlELDB4QjZBMCwweEI2QTQsMHhCNkFCLDB4QjZBQywweEI2QjEsLyogMHhEMC0weEQ3ICovCisJMHhCNkQ0LDB4QjZGMCwweEI2RjQsMHhCNkY4LDB4QjcwMCwweEI3MDEsMHhCNzA1LDB4QjcyOCwvKiAweEQ4LTB4REYgKi8KKwkweEI3MjksMHhCNzJDLDB4QjcyRiwweEI3MzAsMHhCNzM4LDB4QjczOSwweEI3M0IsMHhCNzQ0LC8qIDB4RTAtMHhFNyAqLworCTB4Qjc0OCwweEI3NEMsMHhCNzU0LDB4Qjc1NSwweEI3NjAsMHhCNzY0LDB4Qjc2OCwweEI3NzAsLyogMHhFOC0weEVGICovCisJMHhCNzcxLDB4Qjc3MywweEI3NzUsMHhCNzdDLDB4Qjc3RCwweEI3ODAsMHhCNzg0LDB4Qjc4QywvKiAweEYwLTB4RjcgKi8KKwkweEI3OEQsMHhCNzhGLDB4Qjc5MCwweEI3OTEsMHhCNzkyLDB4Qjc5NiwweEI3OTcsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0I3WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEQxNkUsMHhEMTZGLDB4RDE3MCwweEQxNzEsMHhEMTcyLDB4RDE3MywweEQxNzQsLyogMHg0MC0weDQ3ICovCisJMHhEMTc1LDB4RDE3NiwweEQxNzcsMHhEMTc4LDB4RDE3OSwweEQxN0EsMHhEMTdCLDB4RDE3RCwvKiAweDQ4LTB4NEYgKi8KKwkweEQxN0UsMHhEMTdGLDB4RDE4MCwweEQxODEsMHhEMTgyLDB4RDE4MywweEQxODUsMHhEMTg2LC8qIDB4NTAtMHg1NyAqLworCTB4RDE4NywweEQxODksMHhEMThBLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4RDE4QiwweEQxOEMsMHhEMThELDB4RDE4RSwweEQxOEYsMHhEMTkwLDB4RDE5MSwvKiAweDYwLTB4NjcgKi8KKwkweEQxOTIsMHhEMTkzLDB4RDE5NCwweEQxOTUsMHhEMTk2LDB4RDE5NywweEQxOTgsMHhEMTk5LC8qIDB4NjgtMHg2RiAqLworCTB4RDE5QSwweEQxOUIsMHhEMTlDLDB4RDE5RCwweEQxOUUsMHhEMTlGLDB4RDFBMiwweEQxQTMsLyogMHg3MC0weDc3ICovCisJMHhEMUE1LDB4RDFBNiwweEQxQTcsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEQxQTksMHhEMUFBLDB4RDFBQiwweEQxQUMsMHhEMUFELDB4RDFBRSwweEQxQUYsLyogMHg4MC0weDg3ICovCisJMHhEMUIyLDB4RDFCNCwweEQxQjYsMHhEMUI3LDB4RDFCOCwweEQxQjksMHhEMUJCLDB4RDFCRCwvKiAweDg4LTB4OEYgKi8KKwkweEQxQkUsMHhEMUJGLDB4RDFDMSwweEQxQzIsMHhEMUMzLDB4RDFDNCwweEQxQzUsMHhEMUM2LC8qIDB4OTAtMHg5NyAqLworCTB4RDFDNywweEQxQzgsMHhEMUM5LDB4RDFDQSwweEQxQ0IsMHhEMUNDLDB4RDFDRCwweEQxQ0UsLyogMHg5OC0weDlGICovCisJMHhEMUNGLDB4Qjc5OCwweEI3OTksMHhCNzlDLDB4QjdBMCwweEI3QTgsMHhCN0E5LDB4QjdBQiwvKiAweEEwLTB4QTcgKi8KKwkweEI3QUMsMHhCN0FELDB4QjdCNCwweEI3QjUsMHhCN0I4LDB4QjdDNywweEI3QzksMHhCN0VDLC8qIDB4QTgtMHhBRiAqLworCTB4QjdFRCwweEI3RjAsMHhCN0Y0LDB4QjdGQywweEI3RkQsMHhCN0ZGLDB4QjgwMCwweEI4MDEsLyogMHhCMC0weEI3ICovCisJMHhCODA3LDB4QjgwOCwweEI4MDksMHhCODBDLDB4QjgxMCwweEI4MTgsMHhCODE5LDB4QjgxQiwvKiAweEI4LTB4QkYgKi8KKwkweEI4MUQsMHhCODI0LDB4QjgyNSwweEI4MjgsMHhCODJDLDB4QjgzNCwweEI4MzUsMHhCODM3LC8qIDB4QzAtMHhDNyAqLworCTB4QjgzOCwweEI4MzksMHhCODQwLDB4Qjg0NCwweEI4NTEsMHhCODUzLDB4Qjg1QywweEI4NUQsLyogMHhDOC0weENGICovCisJMHhCODYwLDB4Qjg2NCwweEI4NkMsMHhCODZELDB4Qjg2RiwweEI4NzEsMHhCODc4LDB4Qjg3QywvKiAweEQwLTB4RDcgKi8KKwkweEI4OEQsMHhCOEE4LDB4QjhCMCwweEI4QjQsMHhCOEI4LDB4QjhDMCwweEI4QzEsMHhCOEMzLC8qIDB4RDgtMHhERiAqLworCTB4QjhDNSwweEI4Q0MsMHhCOEQwLDB4QjhENCwweEI4REQsMHhCOERGLDB4QjhFMSwweEI4RTgsLyogMHhFMC0weEU3ICovCisJMHhCOEU5LDB4QjhFQywweEI4RjAsMHhCOEY4LDB4QjhGOSwweEI4RkIsMHhCOEZELDB4QjkwNCwvKiAweEU4LTB4RUYgKi8KKwkweEI5MTgsMHhCOTIwLDB4QjkzQywweEI5M0QsMHhCOTQwLDB4Qjk0NCwweEI5NEMsMHhCOTRGLC8qIDB4RjAtMHhGNyAqLworCTB4Qjk1MSwweEI5NTgsMHhCOTU5LDB4Qjk1QywweEI5NjAsMHhCOTY4LDB4Qjk2OSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjhbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4RDFEMCwweEQxRDEsMHhEMUQyLDB4RDFEMywweEQxRDQsMHhEMUQ1LDB4RDFENiwvKiAweDQwLTB4NDcgKi8KKwkweEQxRDcsMHhEMUQ5LDB4RDFEQSwweEQxREIsMHhEMURDLDB4RDFERCwweEQxREUsMHhEMURGLC8qIDB4NDgtMHg0RiAqLworCTB4RDFFMCwweEQxRTEsMHhEMUUyLDB4RDFFMywweEQxRTQsMHhEMUU1LDB4RDFFNiwweEQxRTcsLyogMHg1MC0weDU3ICovCisJMHhEMUU4LDB4RDFFOSwweEQxRUEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhEMUVCLDB4RDFFQywweEQxRUQsMHhEMUVFLDB4RDFFRiwweEQxRjAsMHhEMUYxLC8qIDB4NjAtMHg2NyAqLworCTB4RDFGMiwweEQxRjMsMHhEMUY1LDB4RDFGNiwweEQxRjcsMHhEMUY5LDB4RDFGQSwweEQxRkIsLyogMHg2OC0weDZGICovCisJMHhEMUZDLDB4RDFGRCwweEQxRkUsMHhEMUZGLDB4RDIwMCwweEQyMDEsMHhEMjAyLDB4RDIwMywvKiAweDcwLTB4NzcgKi8KKwkweEQyMDQsMHhEMjA1LDB4RDIwNiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4RDIwOCwweEQyMEEsMHhEMjBCLDB4RDIwQywweEQyMEQsMHhEMjBFLDB4RDIwRiwvKiAweDgwLTB4ODcgKi8KKwkweEQyMTEsMHhEMjEyLDB4RDIxMywweEQyMTQsMHhEMjE1LDB4RDIxNiwweEQyMTcsMHhEMjE4LC8qIDB4ODgtMHg4RiAqLworCTB4RDIxOSwweEQyMUEsMHhEMjFCLDB4RDIxQywweEQyMUQsMHhEMjFFLDB4RDIxRiwweEQyMjAsLyogMHg5MC0weDk3ICovCisJMHhEMjIxLDB4RDIyMiwweEQyMjMsMHhEMjI0LDB4RDIyNSwweEQyMjYsMHhEMjI3LDB4RDIyOCwvKiAweDk4LTB4OUYgKi8KKwkweEQyMjksMHhCOTZCLDB4Qjk2RCwweEI5NzQsMHhCOTc1LDB4Qjk3OCwweEI5N0MsMHhCOTg0LC8qIDB4QTAtMHhBNyAqLworCTB4Qjk4NSwweEI5ODcsMHhCOTg5LDB4Qjk4QSwweEI5OEQsMHhCOThFLDB4QjlBQywweEI5QUQsLyogMHhBOC0weEFGICovCisJMHhCOUIwLDB4QjlCNCwweEI5QkMsMHhCOUJELDB4QjlCRiwweEI5QzEsMHhCOUM4LDB4QjlDOSwvKiAweEIwLTB4QjcgKi8KKwkweEI5Q0MsMHhCOUNFLDB4QjlDRiwweEI5RDAsMHhCOUQxLDB4QjlEMiwweEI5RDgsMHhCOUQ5LC8qIDB4QjgtMHhCRiAqLworCTB4QjlEQiwweEI5REQsMHhCOURFLDB4QjlFMSwweEI5RTMsMHhCOUU0LDB4QjlFNSwweEI5RTgsLyogMHhDMC0weEM3ICovCisJMHhCOUVDLDB4QjlGNCwweEI5RjUsMHhCOUY3LDB4QjlGOCwweEI5RjksMHhCOUZBLDB4QkEwMCwvKiAweEM4LTB4Q0YgKi8KKwkweEJBMDEsMHhCQTA4LDB4QkExNSwweEJBMzgsMHhCQTM5LDB4QkEzQywweEJBNDAsMHhCQTQyLC8qIDB4RDAtMHhENyAqLworCTB4QkE0OCwweEJBNDksMHhCQTRCLDB4QkE0RCwweEJBNEUsMHhCQTUzLDB4QkE1NCwweEJBNTUsLyogMHhEOC0weERGICovCisJMHhCQTU4LDB4QkE1QywweEJBNjQsMHhCQTY1LDB4QkE2NywweEJBNjgsMHhCQTY5LDB4QkE3MCwvKiAweEUwLTB4RTcgKi8KKwkweEJBNzEsMHhCQTc0LDB4QkE3OCwweEJBODMsMHhCQTg0LDB4QkE4NSwweEJBODcsMHhCQThDLC8qIDB4RTgtMHhFRiAqLworCTB4QkFBOCwweEJBQTksMHhCQUFCLDB4QkFBQywweEJBQjAsMHhCQUIyLDB4QkFCOCwweEJBQjksLyogMHhGMC0weEY3ICovCisJMHhCQUJCLDB4QkFCRCwweEJBQzQsMHhCQUM4LDB4QkFEOCwweEJBRDksMHhCQUZDLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9COVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhEMjJBLDB4RDIyQiwweEQyMkUsMHhEMjJGLDB4RDIzMSwweEQyMzIsMHhEMjMzLC8qIDB4NDAtMHg0NyAqLworCTB4RDIzNSwweEQyMzYsMHhEMjM3LDB4RDIzOCwweEQyMzksMHhEMjNBLDB4RDIzQiwweEQyM0UsLyogMHg0OC0weDRGICovCisJMHhEMjQwLDB4RDI0MiwweEQyNDMsMHhEMjQ0LDB4RDI0NSwweEQyNDYsMHhEMjQ3LDB4RDI0OSwvKiAweDUwLTB4NTcgKi8KKwkweEQyNEEsMHhEMjRCLDB4RDI0QywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEQyNEQsMHhEMjRFLDB4RDI0RiwweEQyNTAsMHhEMjUxLDB4RDI1MiwweEQyNTMsLyogMHg2MC0weDY3ICovCisJMHhEMjU0LDB4RDI1NSwweEQyNTYsMHhEMjU3LDB4RDI1OCwweEQyNTksMHhEMjVBLDB4RDI1QiwvKiAweDY4LTB4NkYgKi8KKwkweEQyNUQsMHhEMjVFLDB4RDI1RiwweEQyNjAsMHhEMjYxLDB4RDI2MiwweEQyNjMsMHhEMjY1LC8qIDB4NzAtMHg3NyAqLworCTB4RDI2NiwweEQyNjcsMHhEMjY4LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhEMjY5LDB4RDI2QSwweEQyNkIsMHhEMjZDLDB4RDI2RCwweEQyNkUsMHhEMjZGLC8qIDB4ODAtMHg4NyAqLworCTB4RDI3MCwweEQyNzEsMHhEMjcyLDB4RDI3MywweEQyNzQsMHhEMjc1LDB4RDI3NiwweEQyNzcsLyogMHg4OC0weDhGICovCisJMHhEMjc4LDB4RDI3OSwweEQyN0EsMHhEMjdCLDB4RDI3QywweEQyN0QsMHhEMjdFLDB4RDI3RiwvKiAweDkwLTB4OTcgKi8KKwkweEQyODIsMHhEMjgzLDB4RDI4NSwweEQyODYsMHhEMjg3LDB4RDI4OSwweEQyOEEsMHhEMjhCLC8qIDB4OTgtMHg5RiAqLworCTB4RDI4QywweEJCMDAsMHhCQjA0LDB4QkIwRCwweEJCMEYsMHhCQjExLDB4QkIxOCwweEJCMUMsLyogMHhBMC0weEE3ICovCisJMHhCQjIwLDB4QkIyOSwweEJCMkIsMHhCQjM0LDB4QkIzNSwweEJCMzYsMHhCQjM4LDB4QkIzQiwvKiAweEE4LTB4QUYgKi8KKwkweEJCM0MsMHhCQjNELDB4QkIzRSwweEJCNDQsMHhCQjQ1LDB4QkI0NywweEJCNDksMHhCQjRELC8qIDB4QjAtMHhCNyAqLworCTB4QkI0RiwweEJCNTAsMHhCQjU0LDB4QkI1OCwweEJCNjEsMHhCQjYzLDB4QkI2QywweEJCODgsLyogMHhCOC0weEJGICovCisJMHhCQjhDLDB4QkI5MCwweEJCQTQsMHhCQkE4LDB4QkJBQywweEJCQjQsMHhCQkI3LDB4QkJDMCwvKiAweEMwLTB4QzcgKi8KKwkweEJCQzQsMHhCQkM4LDB4QkJEMCwweEJCRDMsMHhCQkY4LDB4QkJGOSwweEJCRkMsMHhCQkZGLC8qIDB4QzgtMHhDRiAqLworCTB4QkMwMCwweEJDMDIsMHhCQzA4LDB4QkMwOSwweEJDMEIsMHhCQzBDLDB4QkMwRCwweEJDMEYsLyogMHhEMC0weEQ3ICovCisJMHhCQzExLDB4QkMxNCwweEJDMTUsMHhCQzE2LDB4QkMxNywweEJDMTgsMHhCQzFCLDB4QkMxQywvKiAweEQ4LTB4REYgKi8KKwkweEJDMUQsMHhCQzFFLDB4QkMxRiwweEJDMjQsMHhCQzI1LDB4QkMyNywweEJDMjksMHhCQzJELC8qIDB4RTAtMHhFNyAqLworCTB4QkMzMCwweEJDMzEsMHhCQzM0LDB4QkMzOCwweEJDNDAsMHhCQzQxLDB4QkM0MywweEJDNDQsLyogMHhFOC0weEVGICovCisJMHhCQzQ1LDB4QkM0OSwweEJDNEMsMHhCQzRELDB4QkM1MCwweEJDNUQsMHhCQzg0LDB4QkM4NSwvKiAweEYwLTB4RjcgKi8KKwkweEJDODgsMHhCQzhCLDB4QkM4QywweEJDOEUsMHhCQzk0LDB4QkM5NSwweEJDOTcsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0JBWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEQyOEQsMHhEMjhFLDB4RDI4RiwweEQyOTIsMHhEMjkzLDB4RDI5NCwweEQyOTYsLyogMHg0MC0weDQ3ICovCisJMHhEMjk3LDB4RDI5OCwweEQyOTksMHhEMjlBLDB4RDI5QiwweEQyOUQsMHhEMjlFLDB4RDI5RiwvKiAweDQ4LTB4NEYgKi8KKwkweEQyQTEsMHhEMkEyLDB4RDJBMywweEQyQTUsMHhEMkE2LDB4RDJBNywweEQyQTgsMHhEMkE5LC8qIDB4NTAtMHg1NyAqLworCTB4RDJBQSwweEQyQUIsMHhEMkFELDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4RDJBRSwweEQyQUYsMHhEMkIwLDB4RDJCMiwweEQyQjMsMHhEMkI0LDB4RDJCNSwvKiAweDYwLTB4NjcgKi8KKwkweEQyQjYsMHhEMkI3LDB4RDJCQSwweEQyQkIsMHhEMkJELDB4RDJCRSwweEQyQzEsMHhEMkMzLC8qIDB4NjgtMHg2RiAqLworCTB4RDJDNCwweEQyQzUsMHhEMkM2LDB4RDJDNywweEQyQ0EsMHhEMkNDLDB4RDJDRCwweEQyQ0UsLyogMHg3MC0weDc3ICovCisJMHhEMkNGLDB4RDJEMCwweEQyRDEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEQyRDIsMHhEMkQzLDB4RDJENSwweEQyRDYsMHhEMkQ3LDB4RDJEOSwweEQyREEsLyogMHg4MC0weDg3ICovCisJMHhEMkRCLDB4RDJERCwweEQyREUsMHhEMkRGLDB4RDJFMCwweEQyRTEsMHhEMkUyLDB4RDJFMywvKiAweDg4LTB4OEYgKi8KKwkweEQyRTYsMHhEMkU3LDB4RDJFOCwweEQyRTksMHhEMkVBLDB4RDJFQiwweEQyRUMsMHhEMkVELC8qIDB4OTAtMHg5NyAqLworCTB4RDJFRSwweEQyRUYsMHhEMkYyLDB4RDJGMywweEQyRjUsMHhEMkY2LDB4RDJGNywweEQyRjksLyogMHg5OC0weDlGICovCisJMHhEMkZBLDB4QkM5OSwweEJDOUEsMHhCQ0EwLDB4QkNBMSwweEJDQTQsMHhCQ0E3LDB4QkNBOCwvKiAweEEwLTB4QTcgKi8KKwkweEJDQjAsMHhCQ0IxLDB4QkNCMywweEJDQjQsMHhCQ0I1LDB4QkNCQywweEJDQkQsMHhCQ0MwLC8qIDB4QTgtMHhBRiAqLworCTB4QkNDNCwweEJDQ0QsMHhCQ0NGLDB4QkNEMCwweEJDRDEsMHhCQ0Q1LDB4QkNEOCwweEJDREMsLyogMHhCMC0weEI3ICovCisJMHhCQ0Y0LDB4QkNGNSwweEJDRjYsMHhCQ0Y4LDB4QkNGQywweEJEMDQsMHhCRDA1LDB4QkQwNywvKiAweEI4LTB4QkYgKi8KKwkweEJEMDksMHhCRDEwLDB4QkQxNCwweEJEMjQsMHhCRDJDLDB4QkQ0MCwweEJENDgsMHhCRDQ5LC8qIDB4QzAtMHhDNyAqLworCTB4QkQ0QywweEJENTAsMHhCRDU4LDB4QkQ1OSwweEJENjQsMHhCRDY4LDB4QkQ4MCwweEJEODEsLyogMHhDOC0weENGICovCisJMHhCRDg0LDB4QkQ4NywweEJEODgsMHhCRDg5LDB4QkQ4QSwweEJEOTAsMHhCRDkxLDB4QkQ5MywvKiAweEQwLTB4RDcgKi8KKwkweEJEOTUsMHhCRDk5LDB4QkQ5QSwweEJEOUMsMHhCREE0LDB4QkRCMCwweEJEQjgsMHhCREQ0LC8qIDB4RDgtMHhERiAqLworCTB4QkRENSwweEJERDgsMHhCRERDLDB4QkRFOSwweEJERjAsMHhCREY0LDB4QkRGOCwweEJFMDAsLyogMHhFMC0weEU3ICovCisJMHhCRTAzLDB4QkUwNSwweEJFMEMsMHhCRTBELDB4QkUxMCwweEJFMTQsMHhCRTFDLDB4QkUxRCwvKiAweEU4LTB4RUYgKi8KKwkweEJFMUYsMHhCRTQ0LDB4QkU0NSwweEJFNDgsMHhCRTRDLDB4QkU0RSwweEJFNTQsMHhCRTU1LC8qIDB4RjAtMHhGNyAqLworCTB4QkU1NywweEJFNTksMHhCRTVBLDB4QkU1QiwweEJFNjAsMHhCRTYxLDB4QkU2NCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQkJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4RDJGQiwweEQyRkMsMHhEMkZELDB4RDJGRSwweEQyRkYsMHhEMzAyLDB4RDMwNCwvKiAweDQwLTB4NDcgKi8KKwkweEQzMDYsMHhEMzA3LDB4RDMwOCwweEQzMDksMHhEMzBBLDB4RDMwQiwweEQzMEYsMHhEMzExLC8qIDB4NDgtMHg0RiAqLworCTB4RDMxMiwweEQzMTMsMHhEMzE1LDB4RDMxNywweEQzMTgsMHhEMzE5LDB4RDMxQSwweEQzMUIsLyogMHg1MC0weDU3ICovCisJMHhEMzFFLDB4RDMyMiwweEQzMjMsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhEMzI0LDB4RDMyNiwweEQzMjcsMHhEMzJBLDB4RDMyQiwweEQzMkQsMHhEMzJFLC8qIDB4NjAtMHg2NyAqLworCTB4RDMyRiwweEQzMzEsMHhEMzMyLDB4RDMzMywweEQzMzQsMHhEMzM1LDB4RDMzNiwweEQzMzcsLyogMHg2OC0weDZGICovCisJMHhEMzNBLDB4RDMzRSwweEQzM0YsMHhEMzQwLDB4RDM0MSwweEQzNDIsMHhEMzQzLDB4RDM0NiwvKiAweDcwLTB4NzcgKi8KKwkweEQzNDcsMHhEMzQ4LDB4RDM0OSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4RDM0QSwweEQzNEIsMHhEMzRDLDB4RDM0RCwweEQzNEUsMHhEMzRGLDB4RDM1MCwvKiAweDgwLTB4ODcgKi8KKwkweEQzNTEsMHhEMzUyLDB4RDM1MywweEQzNTQsMHhEMzU1LDB4RDM1NiwweEQzNTcsMHhEMzU4LC8qIDB4ODgtMHg4RiAqLworCTB4RDM1OSwweEQzNUEsMHhEMzVCLDB4RDM1QywweEQzNUQsMHhEMzVFLDB4RDM1RiwweEQzNjAsLyogMHg5MC0weDk3ICovCisJMHhEMzYxLDB4RDM2MiwweEQzNjMsMHhEMzY0LDB4RDM2NSwweEQzNjYsMHhEMzY3LDB4RDM2OCwvKiAweDk4LTB4OUYgKi8KKwkweEQzNjksMHhCRTY4LDB4QkU2QSwweEJFNzAsMHhCRTcxLDB4QkU3MywweEJFNzQsMHhCRTc1LC8qIDB4QTAtMHhBNyAqLworCTB4QkU3QiwweEJFN0MsMHhCRTdELDB4QkU4MCwweEJFODQsMHhCRThDLDB4QkU4RCwweEJFOEYsLyogMHhBOC0weEFGICovCisJMHhCRTkwLDB4QkU5MSwweEJFOTgsMHhCRTk5LDB4QkVBOCwweEJFRDAsMHhCRUQxLDB4QkVENCwvKiAweEIwLTB4QjcgKi8KKwkweEJFRDcsMHhCRUQ4LDB4QkVFMCwweEJFRTMsMHhCRUU0LDB4QkVFNSwweEJFRUMsMHhCRjAxLC8qIDB4QjgtMHhCRiAqLworCTB4QkYwOCwweEJGMDksMHhCRjE4LDB4QkYxOSwweEJGMUIsMHhCRjFDLDB4QkYxRCwweEJGNDAsLyogMHhDMC0weEM3ICovCisJMHhCRjQxLDB4QkY0NCwweEJGNDgsMHhCRjUwLDB4QkY1MSwweEJGNTUsMHhCRjk0LDB4QkZCMCwvKiAweEM4LTB4Q0YgKi8KKwkweEJGQzUsMHhCRkNDLDB4QkZDRCwweEJGRDAsMHhCRkQ0LDB4QkZEQywweEJGREYsMHhCRkUxLC8qIDB4RDAtMHhENyAqLworCTB4QzAzQywweEMwNTEsMHhDMDU4LDB4QzA1QywweEMwNjAsMHhDMDY4LDB4QzA2OSwweEMwOTAsLyogMHhEOC0weERGICovCisJMHhDMDkxLDB4QzA5NCwweEMwOTgsMHhDMEEwLDB4QzBBMSwweEMwQTMsMHhDMEE1LDB4QzBBQywvKiAweEUwLTB4RTcgKi8KKwkweEMwQUQsMHhDMEFGLDB4QzBCMCwweEMwQjMsMHhDMEI0LDB4QzBCNSwweEMwQjYsMHhDMEJDLC8qIDB4RTgtMHhFRiAqLworCTB4QzBCRCwweEMwQkYsMHhDMEMwLDB4QzBDMSwweEMwQzUsMHhDMEM4LDB4QzBDOSwweEMwQ0MsLyogMHhGMC0weEY3ICovCisJMHhDMEQwLDB4QzBEOCwweEMwRDksMHhDMERCLDB4QzBEQywweEMwREQsMHhDMEU0LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CQ1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhEMzZBLDB4RDM2QiwweEQzNkMsMHhEMzZELDB4RDM2RSwweEQzNkYsMHhEMzcwLC8qIDB4NDAtMHg0NyAqLworCTB4RDM3MSwweEQzNzIsMHhEMzczLDB4RDM3NCwweEQzNzUsMHhEMzc2LDB4RDM3NywweEQzNzgsLyogMHg0OC0weDRGICovCisJMHhEMzc5LDB4RDM3QSwweEQzN0IsMHhEMzdFLDB4RDM3RiwweEQzODEsMHhEMzgyLDB4RDM4MywvKiAweDUwLTB4NTcgKi8KKwkweEQzODUsMHhEMzg2LDB4RDM4NywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEQzODgsMHhEMzg5LDB4RDM4QSwweEQzOEIsMHhEMzhFLDB4RDM5MiwweEQzOTMsLyogMHg2MC0weDY3ICovCisJMHhEMzk0LDB4RDM5NSwweEQzOTYsMHhEMzk3LDB4RDM5QSwweEQzOUIsMHhEMzlELDB4RDM5RSwvKiAweDY4LTB4NkYgKi8KKwkweEQzOUYsMHhEM0ExLDB4RDNBMiwweEQzQTMsMHhEM0E0LDB4RDNBNSwweEQzQTYsMHhEM0E3LC8qIDB4NzAtMHg3NyAqLworCTB4RDNBQSwweEQzQUMsMHhEM0FFLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhEM0FGLDB4RDNCMCwweEQzQjEsMHhEM0IyLDB4RDNCMywweEQzQjUsMHhEM0I2LC8qIDB4ODAtMHg4NyAqLworCTB4RDNCNywweEQzQjksMHhEM0JBLDB4RDNCQiwweEQzQkQsMHhEM0JFLDB4RDNCRiwweEQzQzAsLyogMHg4OC0weDhGICovCisJMHhEM0MxLDB4RDNDMiwweEQzQzMsMHhEM0M2LDB4RDNDNywweEQzQ0EsMHhEM0NCLDB4RDNDQywvKiAweDkwLTB4OTcgKi8KKwkweEQzQ0QsMHhEM0NFLDB4RDNDRiwweEQzRDEsMHhEM0QyLDB4RDNEMywweEQzRDQsMHhEM0Q1LC8qIDB4OTgtMHg5RiAqLworCTB4RDNENiwweEMwRTUsMHhDMEU4LDB4QzBFQywweEMwRjQsMHhDMEY1LDB4QzBGNywweEMwRjksLyogMHhBMC0weEE3ICovCisJMHhDMTAwLDB4QzEwNCwweEMxMDgsMHhDMTEwLDB4QzExNSwweEMxMUMsMHhDMTFELDB4QzExRSwvKiAweEE4LTB4QUYgKi8KKwkweEMxMUYsMHhDMTIwLDB4QzEyMywweEMxMjQsMHhDMTI2LDB4QzEyNywweEMxMkMsMHhDMTJELC8qIDB4QjAtMHhCNyAqLworCTB4QzEyRiwweEMxMzAsMHhDMTMxLDB4QzEzNiwweEMxMzgsMHhDMTM5LDB4QzEzQywweEMxNDAsLyogMHhCOC0weEJGICovCisJMHhDMTQ4LDB4QzE0OSwweEMxNEIsMHhDMTRDLDB4QzE0RCwweEMxNTQsMHhDMTU1LDB4QzE1OCwvKiAweEMwLTB4QzcgKi8KKwkweEMxNUMsMHhDMTY0LDB4QzE2NSwweEMxNjcsMHhDMTY4LDB4QzE2OSwweEMxNzAsMHhDMTc0LC8qIDB4QzgtMHhDRiAqLworCTB4QzE3OCwweEMxODUsMHhDMThDLDB4QzE4RCwweEMxOEUsMHhDMTkwLDB4QzE5NCwweEMxOTYsLyogMHhEMC0weEQ3ICovCisJMHhDMTlDLDB4QzE5RCwweEMxOUYsMHhDMUExLDB4QzFBNSwweEMxQTgsMHhDMUE5LDB4QzFBQywvKiAweEQ4LTB4REYgKi8KKwkweEMxQjAsMHhDMUJELDB4QzFDNCwweEMxQzgsMHhDMUNDLDB4QzFENCwweEMxRDcsMHhDMUQ4LC8qIDB4RTAtMHhFNyAqLworCTB4QzFFMCwweEMxRTQsMHhDMUU4LDB4QzFGMCwweEMxRjEsMHhDMUYzLDB4QzFGQywweEMxRkQsLyogMHhFOC0weEVGICovCisJMHhDMjAwLDB4QzIwNCwweEMyMEMsMHhDMjBELDB4QzIwRiwweEMyMTEsMHhDMjE4LDB4QzIxOSwvKiAweEYwLTB4RjcgKi8KKwkweEMyMUMsMHhDMjFGLDB4QzIyMCwweEMyMjgsMHhDMjI5LDB4QzIyQiwweEMyMkQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0JEWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEQzRDcsMHhEM0Q5LDB4RDNEQSwweEQzREIsMHhEM0RDLDB4RDNERCwweEQzREUsLyogMHg0MC0weDQ3ICovCisJMHhEM0RGLDB4RDNFMCwweEQzRTIsMHhEM0U0LDB4RDNFNSwweEQzRTYsMHhEM0U3LDB4RDNFOCwvKiAweDQ4LTB4NEYgKi8KKwkweEQzRTksMHhEM0VBLDB4RDNFQiwweEQzRUUsMHhEM0VGLDB4RDNGMSwweEQzRjIsMHhEM0YzLC8qIDB4NTAtMHg1NyAqLworCTB4RDNGNSwweEQzRjYsMHhEM0Y3LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4RDNGOCwweEQzRjksMHhEM0ZBLDB4RDNGQiwweEQzRkUsMHhENDAwLDB4RDQwMiwvKiAweDYwLTB4NjcgKi8KKwkweEQ0MDMsMHhENDA0LDB4RDQwNSwweEQ0MDYsMHhENDA3LDB4RDQwOSwweEQ0MEEsMHhENDBCLC8qIDB4NjgtMHg2RiAqLworCTB4RDQwQywweEQ0MEQsMHhENDBFLDB4RDQwRiwweEQ0MTAsMHhENDExLDB4RDQxMiwweEQ0MTMsLyogMHg3MC0weDc3ICovCisJMHhENDE0LDB4RDQxNSwweEQ0MTYsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEQ0MTcsMHhENDE4LDB4RDQxOSwweEQ0MUEsMHhENDFCLDB4RDQxQywweEQ0MUUsLyogMHg4MC0weDg3ICovCisJMHhENDFGLDB4RDQyMCwweEQ0MjEsMHhENDIyLDB4RDQyMywweEQ0MjQsMHhENDI1LDB4RDQyNiwvKiAweDg4LTB4OEYgKi8KKwkweEQ0MjcsMHhENDI4LDB4RDQyOSwweEQ0MkEsMHhENDJCLDB4RDQyQywweEQ0MkQsMHhENDJFLC8qIDB4OTAtMHg5NyAqLworCTB4RDQyRiwweEQ0MzAsMHhENDMxLDB4RDQzMiwweEQ0MzMsMHhENDM0LDB4RDQzNSwweEQ0MzYsLyogMHg5OC0weDlGICovCisJMHhENDM3LDB4QzIyRiwweEMyMzEsMHhDMjMyLDB4QzIzNCwweEMyNDgsMHhDMjUwLDB4QzI1MSwvKiAweEEwLTB4QTcgKi8KKwkweEMyNTQsMHhDMjU4LDB4QzI2MCwweEMyNjUsMHhDMjZDLDB4QzI2RCwweEMyNzAsMHhDMjc0LC8qIDB4QTgtMHhBRiAqLworCTB4QzI3QywweEMyN0QsMHhDMjdGLDB4QzI4MSwweEMyODgsMHhDMjg5LDB4QzI5MCwweEMyOTgsLyogMHhCMC0weEI3ICovCisJMHhDMjlCLDB4QzI5RCwweEMyQTQsMHhDMkE1LDB4QzJBOCwweEMyQUMsMHhDMkFELDB4QzJCNCwvKiAweEI4LTB4QkYgKi8KKwkweEMyQjUsMHhDMkI3LDB4QzJCOSwweEMyREMsMHhDMkRELDB4QzJFMCwweEMyRTMsMHhDMkU0LC8qIDB4QzAtMHhDNyAqLworCTB4QzJFQiwweEMyRUMsMHhDMkVELDB4QzJFRiwweEMyRjEsMHhDMkY2LDB4QzJGOCwweEMyRjksLyogMHhDOC0weENGICovCisJMHhDMkZCLDB4QzJGQywweEMzMDAsMHhDMzA4LDB4QzMwOSwweEMzMEMsMHhDMzBELDB4QzMxMywvKiAweEQwLTB4RDcgKi8KKwkweEMzMTQsMHhDMzE1LDB4QzMxOCwweEMzMUMsMHhDMzI0LDB4QzMyNSwweEMzMjgsMHhDMzI5LC8qIDB4RDgtMHhERiAqLworCTB4QzM0NSwweEMzNjgsMHhDMzY5LDB4QzM2QywweEMzNzAsMHhDMzcyLDB4QzM3OCwweEMzNzksLyogMHhFMC0weEU3ICovCisJMHhDMzdDLDB4QzM3RCwweEMzODQsMHhDMzg4LDB4QzM4QywweEMzQzAsMHhDM0Q4LDB4QzNEOSwvKiAweEU4LTB4RUYgKi8KKwkweEMzREMsMHhDM0RGLDB4QzNFMCwweEMzRTIsMHhDM0U4LDB4QzNFOSwweEMzRUQsMHhDM0Y0LC8qIDB4RjAtMHhGNyAqLworCTB4QzNGNSwweEMzRjgsMHhDNDA4LDB4QzQxMCwweEM0MjQsMHhDNDJDLDB4QzQzMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQkVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4RDQzOCwweEQ0MzksMHhENDNBLDB4RDQzQiwweEQ0M0MsMHhENDNELDB4RDQzRSwvKiAweDQwLTB4NDcgKi8KKwkweEQ0M0YsMHhENDQxLDB4RDQ0MiwweEQ0NDMsMHhENDQ1LDB4RDQ0NiwweEQ0NDcsMHhENDQ4LC8qIDB4NDgtMHg0RiAqLworCTB4RDQ0OSwweEQ0NEEsMHhENDRCLDB4RDQ0QywweEQ0NEQsMHhENDRFLDB4RDQ0RiwweEQ0NTAsLyogMHg1MC0weDU3ICovCisJMHhENDUxLDB4RDQ1MiwweEQ0NTMsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhENDU0LDB4RDQ1NSwweEQ0NTYsMHhENDU3LDB4RDQ1OCwweEQ0NTksMHhENDVBLC8qIDB4NjAtMHg2NyAqLworCTB4RDQ1QiwweEQ0NUQsMHhENDVFLDB4RDQ1RiwweEQ0NjEsMHhENDYyLDB4RDQ2MywweEQ0NjUsLyogMHg2OC0weDZGICovCisJMHhENDY2LDB4RDQ2NywweEQ0NjgsMHhENDY5LDB4RDQ2QSwweEQ0NkIsMHhENDZDLDB4RDQ2RSwvKiAweDcwLTB4NzcgKi8KKwkweEQ0NzAsMHhENDcxLDB4RDQ3MiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4RDQ3MywweEQ0NzQsMHhENDc1LDB4RDQ3NiwweEQ0NzcsMHhENDdBLDB4RDQ3QiwvKiAweDgwLTB4ODcgKi8KKwkweEQ0N0QsMHhENDdFLDB4RDQ4MSwweEQ0ODMsMHhENDg0LDB4RDQ4NSwweEQ0ODYsMHhENDg3LC8qIDB4ODgtMHg4RiAqLworCTB4RDQ4QSwweEQ0OEMsMHhENDhFLDB4RDQ4RiwweEQ0OTAsMHhENDkxLDB4RDQ5MiwweEQ0OTMsLyogMHg5MC0weDk3ICovCisJMHhENDk1LDB4RDQ5NiwweEQ0OTcsMHhENDk4LDB4RDQ5OSwweEQ0OUEsMHhENDlCLDB4RDQ5QywvKiAweDk4LTB4OUYgKi8KKwkweEQ0OUQsMHhDNDM0LDB4QzQzQywweEM0M0QsMHhDNDQ4LDB4QzQ2NCwweEM0NjUsMHhDNDY4LC8qIDB4QTAtMHhBNyAqLworCTB4QzQ2QywweEM0NzQsMHhDNDc1LDB4QzQ3OSwweEM0ODAsMHhDNDk0LDB4QzQ5QywweEM0QjgsLyogMHhBOC0weEFGICovCisJMHhDNEJDLDB4QzRFOSwweEM0RjAsMHhDNEYxLDB4QzRGNCwweEM0RjgsMHhDNEZBLDB4QzRGRiwvKiAweEIwLTB4QjcgKi8KKwkweEM1MDAsMHhDNTAxLDB4QzUwQywweEM1MTAsMHhDNTE0LDB4QzUxQywweEM1MjgsMHhDNTI5LC8qIDB4QjgtMHhCRiAqLworCTB4QzUyQywweEM1MzAsMHhDNTM4LDB4QzUzOSwweEM1M0IsMHhDNTNELDB4QzU0NCwweEM1NDUsLyogMHhDMC0weEM3ICovCisJMHhDNTQ4LDB4QzU0OSwweEM1NEEsMHhDNTRDLDB4QzU0RCwweEM1NEUsMHhDNTUzLDB4QzU1NCwvKiAweEM4LTB4Q0YgKi8KKwkweEM1NTUsMHhDNTU3LDB4QzU1OCwweEM1NTksMHhDNTVELDB4QzU1RSwweEM1NjAsMHhDNTYxLC8qIDB4RDAtMHhENyAqLworCTB4QzU2NCwweEM1NjgsMHhDNTcwLDB4QzU3MSwweEM1NzMsMHhDNTc0LDB4QzU3NSwweEM1N0MsLyogMHhEOC0weERGICovCisJMHhDNTdELDB4QzU4MCwweEM1ODQsMHhDNTg3LDB4QzU4QywweEM1OEQsMHhDNThGLDB4QzU5MSwvKiAweEUwLTB4RTcgKi8KKwkweEM1OTUsMHhDNTk3LDB4QzU5OCwweEM1OUMsMHhDNUEwLDB4QzVBOSwweEM1QjQsMHhDNUI1LC8qIDB4RTgtMHhFRiAqLworCTB4QzVCOCwweEM1QjksMHhDNUJCLDB4QzVCQywweEM1QkQsMHhDNUJFLDB4QzVDNCwweEM1QzUsLyogMHhGMC0weEY3ICovCisJMHhDNUM2LDB4QzVDNywweEM1QzgsMHhDNUM5LDB4QzVDQSwweEM1Q0MsMHhDNUNFLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CRlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhENDlFLDB4RDQ5RiwweEQ0QTAsMHhENEExLDB4RDRBMiwweEQ0QTMsMHhENEE0LC8qIDB4NDAtMHg0NyAqLworCTB4RDRBNSwweEQ0QTYsMHhENEE3LDB4RDRBOCwweEQ0QUEsMHhENEFCLDB4RDRBQywweEQ0QUQsLyogMHg0OC0weDRGICovCisJMHhENEFFLDB4RDRBRiwweEQ0QjAsMHhENEIxLDB4RDRCMiwweEQ0QjMsMHhENEI0LDB4RDRCNSwvKiAweDUwLTB4NTcgKi8KKwkweEQ0QjYsMHhENEI3LDB4RDRCOCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEQ0QjksMHhENEJBLDB4RDRCQiwweEQ0QkMsMHhENEJELDB4RDRCRSwweEQ0QkYsLyogMHg2MC0weDY3ICovCisJMHhENEMwLDB4RDRDMSwweEQ0QzIsMHhENEMzLDB4RDRDNCwweEQ0QzUsMHhENEM2LDB4RDRDNywvKiAweDY4LTB4NkYgKi8KKwkweEQ0QzgsMHhENEM5LDB4RDRDQSwweEQ0Q0IsMHhENENELDB4RDRDRSwweEQ0Q0YsMHhENEQxLC8qIDB4NzAtMHg3NyAqLworCTB4RDREMiwweEQ0RDMsMHhENEQ1LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhENEQ2LDB4RDRENywweEQ0RDgsMHhENEQ5LDB4RDREQSwweEQ0REIsMHhENERELC8qIDB4ODAtMHg4NyAqLworCTB4RDRERSwweEQ0RTAsMHhENEUxLDB4RDRFMiwweEQ0RTMsMHhENEU0LDB4RDRFNSwweEQ0RTYsLyogMHg4OC0weDhGICovCisJMHhENEU3LDB4RDRFOSwweEQ0RUEsMHhENEVCLDB4RDRFRCwweEQ0RUUsMHhENEVGLDB4RDRGMSwvKiAweDkwLTB4OTcgKi8KKwkweEQ0RjIsMHhENEYzLDB4RDRGNCwweEQ0RjUsMHhENEY2LDB4RDRGNywweEQ0RjksMHhENEZBLC8qIDB4OTgtMHg5RiAqLworCTB4RDRGQywweEM1RDAsMHhDNUQxLDB4QzVENCwweEM1RDgsMHhDNUUwLDB4QzVFMSwweEM1RTMsLyogMHhBMC0weEE3ICovCisJMHhDNUU1LDB4QzVFQywweEM1RUQsMHhDNUVFLDB4QzVGMCwweEM1RjQsMHhDNUY2LDB4QzVGNywvKiAweEE4LTB4QUYgKi8KKwkweEM1RkMsMHhDNUZELDB4QzVGRSwweEM1RkYsMHhDNjAwLDB4QzYwMSwweEM2MDUsMHhDNjA2LC8qIDB4QjAtMHhCNyAqLworCTB4QzYwNywweEM2MDgsMHhDNjBDLDB4QzYxMCwweEM2MTgsMHhDNjE5LDB4QzYxQiwweEM2MUMsLyogMHhCOC0weEJGICovCisJMHhDNjI0LDB4QzYyNSwweEM2MjgsMHhDNjJDLDB4QzYyRCwweEM2MkUsMHhDNjMwLDB4QzYzMywvKiAweEMwLTB4QzcgKi8KKwkweEM2MzQsMHhDNjM1LDB4QzYzNywweEM2MzksMHhDNjNCLDB4QzY0MCwweEM2NDEsMHhDNjQ0LC8qIDB4QzgtMHhDRiAqLworCTB4QzY0OCwweEM2NTAsMHhDNjUxLDB4QzY1MywweEM2NTQsMHhDNjU1LDB4QzY1QywweEM2NUQsLyogMHhEMC0weEQ3ICovCisJMHhDNjYwLDB4QzY2QywweEM2NkYsMHhDNjcxLDB4QzY3OCwweEM2NzksMHhDNjdDLDB4QzY4MCwvKiAweEQ4LTB4REYgKi8KKwkweEM2ODgsMHhDNjg5LDB4QzY4QiwweEM2OEQsMHhDNjk0LDB4QzY5NSwweEM2OTgsMHhDNjlDLC8qIDB4RTAtMHhFNyAqLworCTB4QzZBNCwweEM2QTUsMHhDNkE3LDB4QzZBOSwweEM2QjAsMHhDNkIxLDB4QzZCNCwweEM2QjgsLyogMHhFOC0weEVGICovCisJMHhDNkI5LDB4QzZCQSwweEM2QzAsMHhDNkMxLDB4QzZDMywweEM2QzUsMHhDNkNDLDB4QzZDRCwvKiAweEYwLTB4RjcgKi8KKwkweEM2RDAsMHhDNkQ0LDB4QzZEQywweEM2REQsMHhDNkUwLDB4QzZFMSwweEM2RTgsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0MwWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEQ0RkUsMHhENEZGLDB4RDUwMCwweEQ1MDEsMHhENTAyLDB4RDUwMywweEQ1MDUsLyogMHg0MC0weDQ3ICovCisJMHhENTA2LDB4RDUwNywweEQ1MDksMHhENTBBLDB4RDUwQiwweEQ1MEQsMHhENTBFLDB4RDUwRiwvKiAweDQ4LTB4NEYgKi8KKwkweEQ1MTAsMHhENTExLDB4RDUxMiwweEQ1MTMsMHhENTE2LDB4RDUxOCwweEQ1MTksMHhENTFBLC8qIDB4NTAtMHg1NyAqLworCTB4RDUxQiwweEQ1MUMsMHhENTFELDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4RDUxRSwweEQ1MUYsMHhENTIwLDB4RDUyMSwweEQ1MjIsMHhENTIzLDB4RDUyNCwvKiAweDYwLTB4NjcgKi8KKwkweEQ1MjUsMHhENTI2LDB4RDUyNywweEQ1MjgsMHhENTI5LDB4RDUyQSwweEQ1MkIsMHhENTJDLC8qIDB4NjgtMHg2RiAqLworCTB4RDUyRCwweEQ1MkUsMHhENTJGLDB4RDUzMCwweEQ1MzEsMHhENTMyLDB4RDUzMywweEQ1MzQsLyogMHg3MC0weDc3ICovCisJMHhENTM1LDB4RDUzNiwweEQ1MzcsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEQ1MzgsMHhENTM5LDB4RDUzQSwweEQ1M0IsMHhENTNFLDB4RDUzRiwweEQ1NDEsLyogMHg4MC0weDg3ICovCisJMHhENTQyLDB4RDU0MywweEQ1NDUsMHhENTQ2LDB4RDU0NywweEQ1NDgsMHhENTQ5LDB4RDU0QSwvKiAweDg4LTB4OEYgKi8KKwkweEQ1NEIsMHhENTRFLDB4RDU1MCwweEQ1NTIsMHhENTUzLDB4RDU1NCwweEQ1NTUsMHhENTU2LC8qIDB4OTAtMHg5NyAqLworCTB4RDU1NywweEQ1NUEsMHhENTVCLDB4RDU1RCwweEQ1NUUsMHhENTVGLDB4RDU2MSwweEQ1NjIsLyogMHg5OC0weDlGICovCisJMHhENTYzLDB4QzZFOSwweEM2RUMsMHhDNkYwLDB4QzZGOCwweEM2RjksMHhDNkZELDB4QzcwNCwvKiAweEEwLTB4QTcgKi8KKwkweEM3MDUsMHhDNzA4LDB4QzcwQywweEM3MTQsMHhDNzE1LDB4QzcxNywweEM3MTksMHhDNzIwLC8qIDB4QTgtMHhBRiAqLworCTB4QzcyMSwweEM3MjQsMHhDNzI4LDB4QzczMCwweEM3MzEsMHhDNzMzLDB4QzczNSwweEM3MzcsLyogMHhCMC0weEI3ICovCisJMHhDNzNDLDB4QzczRCwweEM3NDAsMHhDNzQ0LDB4Qzc0QSwweEM3NEMsMHhDNzRELDB4Qzc0RiwvKiAweEI4LTB4QkYgKi8KKwkweEM3NTEsMHhDNzUyLDB4Qzc1MywweEM3NTQsMHhDNzU1LDB4Qzc1NiwweEM3NTcsMHhDNzU4LC8qIDB4QzAtMHhDNyAqLworCTB4Qzc1QywweEM3NjAsMHhDNzY4LDB4Qzc2QiwweEM3NzQsMHhDNzc1LDB4Qzc3OCwweEM3N0MsLyogMHhDOC0weENGICovCisJMHhDNzdELDB4Qzc3RSwweEM3ODMsMHhDNzg0LDB4Qzc4NSwweEM3ODcsMHhDNzg4LDB4Qzc4OSwvKiAweEQwLTB4RDcgKi8KKwkweEM3OEEsMHhDNzhFLDB4Qzc5MCwweEM3OTEsMHhDNzk0LDB4Qzc5NiwweEM3OTcsMHhDNzk4LC8qIDB4RDgtMHhERiAqLworCTB4Qzc5QSwweEM3QTAsMHhDN0ExLDB4QzdBMywweEM3QTQsMHhDN0E1LDB4QzdBNiwweEM3QUMsLyogMHhFMC0weEU3ICovCisJMHhDN0FELDB4QzdCMCwweEM3QjQsMHhDN0JDLDB4QzdCRCwweEM3QkYsMHhDN0MwLDB4QzdDMSwvKiAweEU4LTB4RUYgKi8KKwkweEM3QzgsMHhDN0M5LDB4QzdDQywweEM3Q0UsMHhDN0QwLDB4QzdEOCwweEM3REQsMHhDN0U0LC8qIDB4RjAtMHhGNyAqLworCTB4QzdFOCwweEM3RUMsMHhDODAwLDB4QzgwMSwweEM4MDQsMHhDODA4LDB4QzgwQSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQzFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4RDU2NCwweEQ1NjYsMHhENTY3LDB4RDU2QSwweEQ1NkMsMHhENTZFLDB4RDU2RiwvKiAweDQwLTB4NDcgKi8KKwkweEQ1NzAsMHhENTcxLDB4RDU3MiwweEQ1NzMsMHhENTc2LDB4RDU3NywweEQ1NzksMHhENTdBLC8qIDB4NDgtMHg0RiAqLworCTB4RDU3QiwweEQ1N0QsMHhENTdFLDB4RDU3RiwweEQ1ODAsMHhENTgxLDB4RDU4MiwweEQ1ODMsLyogMHg1MC0weDU3ICovCisJMHhENTg2LDB4RDU4QSwweEQ1OEIsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhENThDLDB4RDU4RCwweEQ1OEUsMHhENThGLDB4RDU5MSwweEQ1OTIsMHhENTkzLC8qIDB4NjAtMHg2NyAqLworCTB4RDU5NCwweEQ1OTUsMHhENTk2LDB4RDU5NywweEQ1OTgsMHhENTk5LDB4RDU5QSwweEQ1OUIsLyogMHg2OC0weDZGICovCisJMHhENTlDLDB4RDU5RCwweEQ1OUUsMHhENTlGLDB4RDVBMCwweEQ1QTEsMHhENUEyLDB4RDVBMywvKiAweDcwLTB4NzcgKi8KKwkweEQ1QTQsMHhENUE2LDB4RDVBNywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4RDVBOCwweEQ1QTksMHhENUFBLDB4RDVBQiwweEQ1QUMsMHhENUFELDB4RDVBRSwvKiAweDgwLTB4ODcgKi8KKwkweEQ1QUYsMHhENUIwLDB4RDVCMSwweEQ1QjIsMHhENUIzLDB4RDVCNCwweEQ1QjUsMHhENUI2LC8qIDB4ODgtMHg4RiAqLworCTB4RDVCNywweEQ1QjgsMHhENUI5LDB4RDVCQSwweEQ1QkIsMHhENUJDLDB4RDVCRCwweEQ1QkUsLyogMHg5MC0weDk3ICovCisJMHhENUJGLDB4RDVDMCwweEQ1QzEsMHhENUMyLDB4RDVDMywweEQ1QzQsMHhENUM1LDB4RDVDNiwvKiAweDk4LTB4OUYgKi8KKwkweEQ1QzcsMHhDODEwLDB4QzgxMSwweEM4MTMsMHhDODE1LDB4QzgxNiwweEM4MUMsMHhDODFELC8qIDB4QTAtMHhBNyAqLworCTB4QzgyMCwweEM4MjQsMHhDODJDLDB4QzgyRCwweEM4MkYsMHhDODMxLDB4QzgzOCwweEM4M0MsLyogMHhBOC0weEFGICovCisJMHhDODQwLDB4Qzg0OCwweEM4NDksMHhDODRDLDB4Qzg0RCwweEM4NTQsMHhDODcwLDB4Qzg3MSwvKiAweEIwLTB4QjcgKi8KKwkweEM4NzQsMHhDODc4LDB4Qzg3QSwweEM4ODAsMHhDODgxLDB4Qzg4MywweEM4ODUsMHhDODg2LC8qIDB4QjgtMHhCRiAqLworCTB4Qzg4NywweEM4OEIsMHhDODhDLDB4Qzg4RCwweEM4OTQsMHhDODlELDB4Qzg5RiwweEM4QTEsLyogMHhDMC0weEM3ICovCisJMHhDOEE4LDB4QzhCQywweEM4QkQsMHhDOEM0LDB4QzhDOCwweEM4Q0MsMHhDOEQ0LDB4QzhENSwvKiAweEM4LTB4Q0YgKi8KKwkweEM4RDcsMHhDOEQ5LDB4QzhFMCwweEM4RTEsMHhDOEU0LDB4QzhGNSwweEM4RkMsMHhDOEZELC8qIDB4RDAtMHhENyAqLworCTB4QzkwMCwweEM5MDQsMHhDOTA1LDB4QzkwNiwweEM5MEMsMHhDOTBELDB4QzkwRiwweEM5MTEsLyogMHhEOC0weERGICovCisJMHhDOTE4LDB4QzkyQywweEM5MzQsMHhDOTUwLDB4Qzk1MSwweEM5NTQsMHhDOTU4LDB4Qzk2MCwvKiAweEUwLTB4RTcgKi8KKwkweEM5NjEsMHhDOTYzLDB4Qzk2QywweEM5NzAsMHhDOTc0LDB4Qzk3QywweEM5ODgsMHhDOTg5LC8qIDB4RTgtMHhFRiAqLworCTB4Qzk4QywweEM5OTAsMHhDOTk4LDB4Qzk5OSwweEM5OUIsMHhDOTlELDB4QzlDMCwweEM5QzEsLyogMHhGMC0weEY3ICovCisJMHhDOUM0LDB4QzlDNywweEM5QzgsMHhDOUNBLDB4QzlEMCwweEM5RDEsMHhDOUQzLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DMlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhENUNBLDB4RDVDQiwweEQ1Q0QsMHhENUNFLDB4RDVDRiwweEQ1RDEsMHhENUQzLC8qIDB4NDAtMHg0NyAqLworCTB4RDVENCwweEQ1RDUsMHhENUQ2LDB4RDVENywweEQ1REEsMHhENURDLDB4RDVERSwweEQ1REYsLyogMHg0OC0weDRGICovCisJMHhENUUwLDB4RDVFMSwweEQ1RTIsMHhENUUzLDB4RDVFNiwweEQ1RTcsMHhENUU5LDB4RDVFQSwvKiAweDUwLTB4NTcgKi8KKwkweEQ1RUIsMHhENUVELDB4RDVFRSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEQ1RUYsMHhENUYwLDB4RDVGMSwweEQ1RjIsMHhENUYzLDB4RDVGNiwweEQ1RjgsLyogMHg2MC0weDY3ICovCisJMHhENUZBLDB4RDVGQiwweEQ1RkMsMHhENUZELDB4RDVGRSwweEQ1RkYsMHhENjAyLDB4RDYwMywvKiAweDY4LTB4NkYgKi8KKwkweEQ2MDUsMHhENjA2LDB4RDYwNywweEQ2MDksMHhENjBBLDB4RDYwQiwweEQ2MEMsMHhENjBELC8qIDB4NzAtMHg3NyAqLworCTB4RDYwRSwweEQ2MEYsMHhENjEyLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhENjE2LDB4RDYxNywweEQ2MTgsMHhENjE5LDB4RDYxQSwweEQ2MUIsMHhENjFELC8qIDB4ODAtMHg4NyAqLworCTB4RDYxRSwweEQ2MUYsMHhENjIxLDB4RDYyMiwweEQ2MjMsMHhENjI1LDB4RDYyNiwweEQ2MjcsLyogMHg4OC0weDhGICovCisJMHhENjI4LDB4RDYyOSwweEQ2MkEsMHhENjJCLDB4RDYyQywweEQ2MkUsMHhENjJGLDB4RDYzMCwvKiAweDkwLTB4OTcgKi8KKwkweEQ2MzEsMHhENjMyLDB4RDYzMywweEQ2MzQsMHhENjM1LDB4RDYzNiwweEQ2MzcsMHhENjNBLC8qIDB4OTgtMHg5RiAqLworCTB4RDYzQiwweEM5RDUsMHhDOUQ2LDB4QzlEOSwweEM5REEsMHhDOURDLDB4QzlERCwweEM5RTAsLyogMHhBMC0weEE3ICovCisJMHhDOUUyLDB4QzlFNCwweEM5RTcsMHhDOUVDLDB4QzlFRCwweEM5RUYsMHhDOUYwLDB4QzlGMSwvKiAweEE4LTB4QUYgKi8KKwkweEM5RjgsMHhDOUY5LDB4QzlGQywweENBMDAsMHhDQTA4LDB4Q0EwOSwweENBMEIsMHhDQTBDLC8qIDB4QjAtMHhCNyAqLworCTB4Q0EwRCwweENBMTQsMHhDQTE4LDB4Q0EyOSwweENBNEMsMHhDQTRELDB4Q0E1MCwweENBNTQsLyogMHhCOC0weEJGICovCisJMHhDQTVDLDB4Q0E1RCwweENBNUYsMHhDQTYwLDB4Q0E2MSwweENBNjgsMHhDQTdELDB4Q0E4NCwvKiAweEMwLTB4QzcgKi8KKwkweENBOTgsMHhDQUJDLDB4Q0FCRCwweENBQzAsMHhDQUM0LDB4Q0FDQywweENBQ0QsMHhDQUNGLC8qIDB4QzgtMHhDRiAqLworCTB4Q0FEMSwweENBRDMsMHhDQUQ4LDB4Q0FEOSwweENBRTAsMHhDQUVDLDB4Q0FGNCwweENCMDgsLyogMHhEMC0weEQ3ICovCisJMHhDQjEwLDB4Q0IxNCwweENCMTgsMHhDQjIwLDB4Q0IyMSwweENCNDEsMHhDQjQ4LDB4Q0I0OSwvKiAweEQ4LTB4REYgKi8KKwkweENCNEMsMHhDQjUwLDB4Q0I1OCwweENCNTksMHhDQjVELDB4Q0I2NCwweENCNzgsMHhDQjc5LC8qIDB4RTAtMHhFNyAqLworCTB4Q0I5QywweENCQjgsMHhDQkQ0LDB4Q0JFNCwweENCRTcsMHhDQkU5LDB4Q0MwQywweENDMEQsLyogMHhFOC0weEVGICovCisJMHhDQzEwLDB4Q0MxNCwweENDMUMsMHhDQzFELDB4Q0MyMSwweENDMjIsMHhDQzI3LDB4Q0MyOCwvKiAweEYwLTB4RjcgKi8KKwkweENDMjksMHhDQzJDLDB4Q0MyRSwweENDMzAsMHhDQzM4LDB4Q0MzOSwweENDM0IsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0MzWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEQ2M0QsMHhENjNFLDB4RDYzRiwweEQ2NDEsMHhENjQyLDB4RDY0MywweEQ2NDQsLyogMHg0MC0weDQ3ICovCisJMHhENjQ2LDB4RDY0NywweEQ2NEEsMHhENjRDLDB4RDY0RSwweEQ2NEYsMHhENjUwLDB4RDY1MiwvKiAweDQ4LTB4NEYgKi8KKwkweEQ2NTMsMHhENjU2LDB4RDY1NywweEQ2NTksMHhENjVBLDB4RDY1QiwweEQ2NUQsMHhENjVFLC8qIDB4NTAtMHg1NyAqLworCTB4RDY1RiwweEQ2NjAsMHhENjYxLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4RDY2MiwweEQ2NjMsMHhENjY0LDB4RDY2NSwweEQ2NjYsMHhENjY4LDB4RDY2QSwvKiAweDYwLTB4NjcgKi8KKwkweEQ2NkIsMHhENjZDLDB4RDY2RCwweEQ2NkUsMHhENjZGLDB4RDY3MiwweEQ2NzMsMHhENjc1LC8qIDB4NjgtMHg2RiAqLworCTB4RDY3NiwweEQ2NzcsMHhENjc4LDB4RDY3OSwweEQ2N0EsMHhENjdCLDB4RDY3QywweEQ2N0QsLyogMHg3MC0weDc3ICovCisJMHhENjdFLDB4RDY3RiwweEQ2ODAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEQ2ODEsMHhENjgyLDB4RDY4NCwweEQ2ODYsMHhENjg3LDB4RDY4OCwweEQ2ODksLyogMHg4MC0weDg3ICovCisJMHhENjhBLDB4RDY4QiwweEQ2OEUsMHhENjhGLDB4RDY5MSwweEQ2OTIsMHhENjkzLDB4RDY5NSwvKiAweDg4LTB4OEYgKi8KKwkweEQ2OTYsMHhENjk3LDB4RDY5OCwweEQ2OTksMHhENjlBLDB4RDY5QiwweEQ2OUMsMHhENjlFLC8qIDB4OTAtMHg5NyAqLworCTB4RDZBMCwweEQ2QTIsMHhENkEzLDB4RDZBNCwweEQ2QTUsMHhENkE2LDB4RDZBNywweEQ2QTksLyogMHg5OC0weDlGICovCisJMHhENkFBLDB4Q0MzQywweENDM0QsMHhDQzNFLDB4Q0M0NCwweENDNDUsMHhDQzQ4LDB4Q0M0QywvKiAweEEwLTB4QTcgKi8KKwkweENDNTQsMHhDQzU1LDB4Q0M1NywweENDNTgsMHhDQzU5LDB4Q0M2MCwweENDNjQsMHhDQzY2LC8qIDB4QTgtMHhBRiAqLworCTB4Q0M2OCwweENDNzAsMHhDQzc1LDB4Q0M5OCwweENDOTksMHhDQzlDLDB4Q0NBMCwweENDQTgsLyogMHhCMC0weEI3ICovCisJMHhDQ0E5LDB4Q0NBQiwweENDQUMsMHhDQ0FELDB4Q0NCNCwweENDQjUsMHhDQ0I4LDB4Q0NCQywvKiAweEI4LTB4QkYgKi8KKwkweENDQzQsMHhDQ0M1LDB4Q0NDNywweENDQzksMHhDQ0QwLDB4Q0NENCwweENDRTQsMHhDQ0VDLC8qIDB4QzAtMHhDNyAqLworCTB4Q0NGMCwweENEMDEsMHhDRDA4LDB4Q0QwOSwweENEMEMsMHhDRDEwLDB4Q0QxOCwweENEMTksLyogMHhDOC0weENGICovCisJMHhDRDFCLDB4Q0QxRCwweENEMjQsMHhDRDI4LDB4Q0QyQywweENEMzksMHhDRDVDLDB4Q0Q2MCwvKiAweEQwLTB4RDcgKi8KKwkweENENjQsMHhDRDZDLDB4Q0Q2RCwweENENkYsMHhDRDcxLDB4Q0Q3OCwweENEODgsMHhDRDk0LC8qIDB4RDgtMHhERiAqLworCTB4Q0Q5NSwweENEOTgsMHhDRDlDLDB4Q0RBNCwweENEQTUsMHhDREE3LDB4Q0RBOSwweENEQjAsLyogMHhFMC0weEU3ICovCisJMHhDREM0LDB4Q0RDQywweENERDAsMHhDREU4LDB4Q0RFQywweENERjAsMHhDREY4LDB4Q0RGOSwvKiAweEU4LTB4RUYgKi8KKwkweENERkIsMHhDREZELDB4Q0UwNCwweENFMDgsMHhDRTBDLDB4Q0UxNCwweENFMTksMHhDRTIwLC8qIDB4RjAtMHhGNyAqLworCTB4Q0UyMSwweENFMjQsMHhDRTI4LDB4Q0UzMCwweENFMzEsMHhDRTMzLDB4Q0UzNSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQzRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4RDZBQiwweEQ2QUQsMHhENkFFLDB4RDZBRiwweEQ2QjEsMHhENkIyLDB4RDZCMywvKiAweDQwLTB4NDcgKi8KKwkweEQ2QjQsMHhENkI1LDB4RDZCNiwweEQ2QjcsMHhENkI4LDB4RDZCQSwweEQ2QkMsMHhENkJELC8qIDB4NDgtMHg0RiAqLworCTB4RDZCRSwweEQ2QkYsMHhENkMwLDB4RDZDMSwweEQ2QzIsMHhENkMzLDB4RDZDNiwweEQ2QzcsLyogMHg1MC0weDU3ICovCisJMHhENkM5LDB4RDZDQSwweEQ2Q0IsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhENkNELDB4RDZDRSwweEQ2Q0YsMHhENkQwLDB4RDZEMiwweEQ2RDMsMHhENkQ1LC8qIDB4NjAtMHg2NyAqLworCTB4RDZENiwweEQ2RDgsMHhENkRBLDB4RDZEQiwweEQ2REMsMHhENkRELDB4RDZERSwweEQ2REYsLyogMHg2OC0weDZGICovCisJMHhENkUxLDB4RDZFMiwweEQ2RTMsMHhENkU1LDB4RDZFNiwweEQ2RTcsMHhENkU5LDB4RDZFQSwvKiAweDcwLTB4NzcgKi8KKwkweEQ2RUIsMHhENkVDLDB4RDZFRCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4RDZFRSwweEQ2RUYsMHhENkYxLDB4RDZGMiwweEQ2RjMsMHhENkY0LDB4RDZGNiwvKiAweDgwLTB4ODcgKi8KKwkweEQ2RjcsMHhENkY4LDB4RDZGOSwweEQ2RkEsMHhENkZCLDB4RDZGRSwweEQ2RkYsMHhENzAxLC8qIDB4ODgtMHg4RiAqLworCTB4RDcwMiwweEQ3MDMsMHhENzA1LDB4RDcwNiwweEQ3MDcsMHhENzA4LDB4RDcwOSwweEQ3MEEsLyogMHg5MC0weDk3ICovCisJMHhENzBCLDB4RDcwQywweEQ3MEQsMHhENzBFLDB4RDcwRiwweEQ3MTAsMHhENzEyLDB4RDcxMywvKiAweDk4LTB4OUYgKi8KKwkweEQ3MTQsMHhDRTU4LDB4Q0U1OSwweENFNUMsMHhDRTVGLDB4Q0U2MCwweENFNjEsMHhDRTY4LC8qIDB4QTAtMHhBNyAqLworCTB4Q0U2OSwweENFNkIsMHhDRTZELDB4Q0U3NCwweENFNzUsMHhDRTc4LDB4Q0U3QywweENFODQsLyogMHhBOC0weEFGICovCisJMHhDRTg1LDB4Q0U4NywweENFODksMHhDRTkwLDB4Q0U5MSwweENFOTQsMHhDRTk4LDB4Q0VBMCwvKiAweEIwLTB4QjcgKi8KKwkweENFQTEsMHhDRUEzLDB4Q0VBNCwweENFQTUsMHhDRUFDLDB4Q0VBRCwweENFQzEsMHhDRUU0LC8qIDB4QjgtMHhCRiAqLworCTB4Q0VFNSwweENFRTgsMHhDRUVCLDB4Q0VFQywweENFRjQsMHhDRUY1LDB4Q0VGNywweENFRjgsLyogMHhDMC0weEM3ICovCisJMHhDRUY5LDB4Q0YwMCwweENGMDEsMHhDRjA0LDB4Q0YwOCwweENGMTAsMHhDRjExLDB4Q0YxMywvKiAweEM4LTB4Q0YgKi8KKwkweENGMTUsMHhDRjFDLDB4Q0YyMCwweENGMjQsMHhDRjJDLDB4Q0YyRCwweENGMkYsMHhDRjMwLC8qIDB4RDAtMHhENyAqLworCTB4Q0YzMSwweENGMzgsMHhDRjU0LDB4Q0Y1NSwweENGNTgsMHhDRjVDLDB4Q0Y2NCwweENGNjUsLyogMHhEOC0weERGICovCisJMHhDRjY3LDB4Q0Y2OSwweENGNzAsMHhDRjcxLDB4Q0Y3NCwweENGNzgsMHhDRjgwLDB4Q0Y4NSwvKiAweEUwLTB4RTcgKi8KKwkweENGOEMsMHhDRkExLDB4Q0ZBOCwweENGQjAsMHhDRkM0LDB4Q0ZFMCwweENGRTEsMHhDRkU0LC8qIDB4RTgtMHhFRiAqLworCTB4Q0ZFOCwweENGRjAsMHhDRkYxLDB4Q0ZGMywweENGRjUsMHhDRkZDLDB4RDAwMCwweEQwMDQsLyogMHhGMC0weEY3ICovCisJMHhEMDExLDB4RDAxOCwweEQwMkQsMHhEMDM0LDB4RDAzNSwweEQwMzgsMHhEMDNDLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DNVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhENzE1LDB4RDcxNiwweEQ3MTcsMHhENzFBLDB4RDcxQiwweEQ3MUQsMHhENzFFLC8qIDB4NDAtMHg0NyAqLworCTB4RDcxRiwweEQ3MjEsMHhENzIyLDB4RDcyMywweEQ3MjQsMHhENzI1LDB4RDcyNiwweEQ3MjcsLyogMHg0OC0weDRGICovCisJMHhENzJBLDB4RDcyQywweEQ3MkUsMHhENzJGLDB4RDczMCwweEQ3MzEsMHhENzMyLDB4RDczMywvKiAweDUwLTB4NTcgKi8KKwkweEQ3MzYsMHhENzM3LDB4RDczOSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEQ3M0EsMHhENzNCLDB4RDczRCwweEQ3M0UsMHhENzNGLDB4RDc0MCwweEQ3NDEsLyogMHg2MC0weDY3ICovCisJMHhENzQyLDB4RDc0MywweEQ3NDUsMHhENzQ2LDB4RDc0OCwweEQ3NEEsMHhENzRCLDB4RDc0QywvKiAweDY4LTB4NkYgKi8KKwkweEQ3NEQsMHhENzRFLDB4RDc0RiwweEQ3NTIsMHhENzUzLDB4RDc1NSwweEQ3NUEsMHhENzVCLC8qIDB4NzAtMHg3NyAqLworCTB4RDc1QywweEQ3NUQsMHhENzVFLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhENzVGLDB4RDc2MiwweEQ3NjQsMHhENzY2LDB4RDc2NywweEQ3NjgsMHhENzZBLC8qIDB4ODAtMHg4NyAqLworCTB4RDc2QiwweEQ3NkQsMHhENzZFLDB4RDc2RiwweEQ3NzEsMHhENzcyLDB4RDc3MywweEQ3NzUsLyogMHg4OC0weDhGICovCisJMHhENzc2LDB4RDc3NywweEQ3NzgsMHhENzc5LDB4RDc3QSwweEQ3N0IsMHhENzdFLDB4RDc3RiwvKiAweDkwLTB4OTcgKi8KKwkweEQ3ODAsMHhENzgyLDB4RDc4MywweEQ3ODQsMHhENzg1LDB4RDc4NiwweEQ3ODcsMHhENzhBLC8qIDB4OTgtMHg5RiAqLworCTB4RDc4QiwweEQwNDQsMHhEMDQ1LDB4RDA0NywweEQwNDksMHhEMDUwLDB4RDA1NCwweEQwNTgsLyogMHhBMC0weEE3ICovCisJMHhEMDYwLDB4RDA2QywweEQwNkQsMHhEMDcwLDB4RDA3NCwweEQwN0MsMHhEMDdELDB4RDA4MSwvKiAweEE4LTB4QUYgKi8KKwkweEQwQTQsMHhEMEE1LDB4RDBBOCwweEQwQUMsMHhEMEI0LDB4RDBCNSwweEQwQjcsMHhEMEI5LC8qIDB4QjAtMHhCNyAqLworCTB4RDBDMCwweEQwQzEsMHhEMEM0LDB4RDBDOCwweEQwQzksMHhEMEQwLDB4RDBEMSwweEQwRDMsLyogMHhCOC0weEJGICovCisJMHhEMEQ0LDB4RDBENSwweEQwREMsMHhEMERELDB4RDBFMCwweEQwRTQsMHhEMEVDLDB4RDBFRCwvKiAweEMwLTB4QzcgKi8KKwkweEQwRUYsMHhEMEYwLDB4RDBGMSwweEQwRjgsMHhEMTBELDB4RDEzMCwweEQxMzEsMHhEMTM0LC8qIDB4QzgtMHhDRiAqLworCTB4RDEzOCwweEQxM0EsMHhEMTQwLDB4RDE0MSwweEQxNDMsMHhEMTQ0LDB4RDE0NSwweEQxNEMsLyogMHhEMC0weEQ3ICovCisJMHhEMTRELDB4RDE1MCwweEQxNTQsMHhEMTVDLDB4RDE1RCwweEQxNUYsMHhEMTYxLDB4RDE2OCwvKiAweEQ4LTB4REYgKi8KKwkweEQxNkMsMHhEMTdDLDB4RDE4NCwweEQxODgsMHhEMUEwLDB4RDFBMSwweEQxQTQsMHhEMUE4LC8qIDB4RTAtMHhFNyAqLworCTB4RDFCMCwweEQxQjEsMHhEMUIzLDB4RDFCNSwweEQxQkEsMHhEMUJDLDB4RDFDMCwweEQxRDgsLyogMHhFOC0weEVGICovCisJMHhEMUY0LDB4RDFGOCwweEQyMDcsMHhEMjA5LDB4RDIxMCwweEQyMkMsMHhEMjJELDB4RDIzMCwvKiAweEYwLTB4RjcgKi8KKwkweEQyMzQsMHhEMjNDLDB4RDIzRCwweEQyM0YsMHhEMjQxLDB4RDI0OCwweEQyNUMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0M2WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEQ3OEQsMHhENzhFLDB4RDc4RiwweEQ3OTEsMHhENzkyLDB4RDc5MywweEQ3OTQsLyogMHg0MC0weDQ3ICovCisJMHhENzk1LDB4RDc5NiwweEQ3OTcsMHhENzlBLDB4RDc5QywweEQ3OUUsMHhENzlGLDB4RDdBMCwvKiAweDQ4LTB4NEYgKi8KKwkweEQ3QTEsMHhEN0EyLDB4RDdBMywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4RDI2NCwweEQyODAsMHhEMjgxLDB4RDI4NCwweEQyODgsMHhEMjkwLDB4RDI5MSwvKiAweEEwLTB4QTcgKi8KKwkweEQyOTUsMHhEMjlDLDB4RDJBMCwweEQyQTQsMHhEMkFDLDB4RDJCMSwweEQyQjgsMHhEMkI5LC8qIDB4QTgtMHhBRiAqLworCTB4RDJCQywweEQyQkYsMHhEMkMwLDB4RDJDMiwweEQyQzgsMHhEMkM5LDB4RDJDQiwweEQyRDQsLyogMHhCMC0weEI3ICovCisJMHhEMkQ4LDB4RDJEQywweEQyRTQsMHhEMkU1LDB4RDJGMCwweEQyRjEsMHhEMkY0LDB4RDJGOCwvKiAweEI4LTB4QkYgKi8KKwkweEQzMDAsMHhEMzAxLDB4RDMwMywweEQzMDUsMHhEMzBDLDB4RDMwRCwweEQzMEUsMHhEMzEwLC8qIDB4QzAtMHhDNyAqLworCTB4RDMxNCwweEQzMTYsMHhEMzFDLDB4RDMxRCwweEQzMUYsMHhEMzIwLDB4RDMyMSwweEQzMjUsLyogMHhDOC0weENGICovCisJMHhEMzI4LDB4RDMyOSwweEQzMkMsMHhEMzMwLDB4RDMzOCwweEQzMzksMHhEMzNCLDB4RDMzQywvKiAweEQwLTB4RDcgKi8KKwkweEQzM0QsMHhEMzQ0LDB4RDM0NSwweEQzN0MsMHhEMzdELDB4RDM4MCwweEQzODQsMHhEMzhDLC8qIDB4RDgtMHhERiAqLworCTB4RDM4RCwweEQzOEYsMHhEMzkwLDB4RDM5MSwweEQzOTgsMHhEMzk5LDB4RDM5QywweEQzQTAsLyogMHhFMC0weEU3ICovCisJMHhEM0E4LDB4RDNBOSwweEQzQUIsMHhEM0FELDB4RDNCNCwweEQzQjgsMHhEM0JDLDB4RDNDNCwvKiAweEU4LTB4RUYgKi8KKwkweEQzQzUsMHhEM0M4LDB4RDNDOSwweEQzRDAsMHhEM0Q4LDB4RDNFMSwweEQzRTMsMHhEM0VDLC8qIDB4RjAtMHhGNyAqLworCTB4RDNFRCwweEQzRjAsMHhEM0Y0LDB4RDNGQywweEQzRkQsMHhEM0ZGLDB4RDQwMSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQzdbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHhENDA4LDB4RDQxRCwweEQ0NDAsMHhENDQ0LDB4RDQ1QywweEQ0NjAsMHhENDY0LC8qIDB4QTAtMHhBNyAqLworCTB4RDQ2RCwweEQ0NkYsMHhENDc4LDB4RDQ3OSwweEQ0N0MsMHhENDdGLDB4RDQ4MCwweEQ0ODIsLyogMHhBOC0weEFGICovCisJMHhENDg4LDB4RDQ4OSwweEQ0OEIsMHhENDhELDB4RDQ5NCwweEQ0QTksMHhENENDLDB4RDREMCwvKiAweEIwLTB4QjcgKi8KKwkweEQ0RDQsMHhENERDLDB4RDRERiwweEQ0RTgsMHhENEVDLDB4RDRGMCwweEQ0RjgsMHhENEZCLC8qIDB4QjgtMHhCRiAqLworCTB4RDRGRCwweEQ1MDQsMHhENTA4LDB4RDUwQywweEQ1MTQsMHhENTE1LDB4RDUxNywweEQ1M0MsLyogMHhDMC0weEM3ICovCisJMHhENTNELDB4RDU0MCwweEQ1NDQsMHhENTRDLDB4RDU0RCwweEQ1NEYsMHhENTUxLDB4RDU1OCwvKiAweEM4LTB4Q0YgKi8KKwkweEQ1NTksMHhENTVDLDB4RDU2MCwweEQ1NjUsMHhENTY4LDB4RDU2OSwweEQ1NkIsMHhENTZELC8qIDB4RDAtMHhENyAqLworCTB4RDU3NCwweEQ1NzUsMHhENTc4LDB4RDU3QywweEQ1ODQsMHhENTg1LDB4RDU4NywweEQ1ODgsLyogMHhEOC0weERGICovCisJMHhENTg5LDB4RDU5MCwweEQ1QTUsMHhENUM4LDB4RDVDOSwweEQ1Q0MsMHhENUQwLDB4RDVEMiwvKiAweEUwLTB4RTcgKi8KKwkweEQ1RDgsMHhENUQ5LDB4RDVEQiwweEQ1REQsMHhENUU0LDB4RDVFNSwweEQ1RTgsMHhENUVDLC8qIDB4RTgtMHhFRiAqLworCTB4RDVGNCwweEQ1RjUsMHhENUY3LDB4RDVGOSwweEQ2MDAsMHhENjAxLDB4RDYwNCwweEQ2MDgsLyogMHhGMC0weEY3ICovCisJMHhENjEwLDB4RDYxMSwweEQ2MTMsMHhENjE0LDB4RDYxNSwweEQ2MUMsMHhENjIwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DOFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweEQ2MjQsMHhENjJELDB4RDYzOCwweEQ2MzksMHhENjNDLDB4RDY0MCwweEQ2NDUsLyogMHhBMC0weEE3ICovCisJMHhENjQ4LDB4RDY0OSwweEQ2NEIsMHhENjRELDB4RDY1MSwweEQ2NTQsMHhENjU1LDB4RDY1OCwvKiAweEE4LTB4QUYgKi8KKwkweEQ2NUMsMHhENjY3LDB4RDY2OSwweEQ2NzAsMHhENjcxLDB4RDY3NCwweEQ2ODMsMHhENjg1LC8qIDB4QjAtMHhCNyAqLworCTB4RDY4QywweEQ2OEQsMHhENjkwLDB4RDY5NCwweEQ2OUQsMHhENjlGLDB4RDZBMSwweEQ2QTgsLyogMHhCOC0weEJGICovCisJMHhENkFDLDB4RDZCMCwweEQ2QjksMHhENkJCLDB4RDZDNCwweEQ2QzUsMHhENkM4LDB4RDZDQywvKiAweEMwLTB4QzcgKi8KKwkweEQ2RDEsMHhENkQ0LDB4RDZENywweEQ2RDksMHhENkUwLDB4RDZFNCwweEQ2RTgsMHhENkYwLC8qIDB4QzgtMHhDRiAqLworCTB4RDZGNSwweEQ2RkMsMHhENkZELDB4RDcwMCwweEQ3MDQsMHhENzExLDB4RDcxOCwweEQ3MTksLyogMHhEMC0weEQ3ICovCisJMHhENzFDLDB4RDcyMCwweEQ3MjgsMHhENzI5LDB4RDcyQiwweEQ3MkQsMHhENzM0LDB4RDczNSwvKiAweEQ4LTB4REYgKi8KKwkweEQ3MzgsMHhENzNDLDB4RDc0NCwweEQ3NDcsMHhENzQ5LDB4RDc1MCwweEQ3NTEsMHhENzU0LC8qIDB4RTAtMHhFNyAqLworCTB4RDc1NiwweEQ3NTcsMHhENzU4LDB4RDc1OSwweEQ3NjAsMHhENzYxLDB4RDc2MywweEQ3NjUsLyogMHhFOC0weEVGICovCisJMHhENzY5LDB4RDc2QywweEQ3NzAsMHhENzc0LDB4RDc3QywweEQ3N0QsMHhENzgxLDB4RDc4OCwvKiAweEYwLTB4RjcgKi8KKwkweEQ3ODksMHhENzhDLDB4RDc5MCwweEQ3OTgsMHhENzk5LDB4RDc5QiwweEQ3OUQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0NBWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NEYzRCwweDRGNzMsMHg1MDQ3LDB4NTBGOSwweDUyQTAsMHg1M0VGLDB4NTQ3NSwvKiAweEEwLTB4QTcgKi8KKwkweDU0RTUsMHg1NjA5LDB4NUFDMSwweDVCQjYsMHg2Njg3LDB4NjdCNiwweDY3QjcsMHg2N0VGLC8qIDB4QTgtMHhBRiAqLworCTB4NkI0QywweDczQzIsMHg3NUMyLDB4N0EzQywweDgyREIsMHg4MzA0LDB4ODg1NywweDg4ODgsLyogMHhCMC0weEI3ICovCisJMHg4QTM2LDB4OENDOCwweDhEQ0YsMHg4RUZCLDB4OEZFNiwweDk5RDUsMHg1MjNCLDB4NTM3NCwvKiAweEI4LTB4QkYgKi8KKwkweDU0MDQsMHg2MDZBLDB4NjE2NCwweDZCQkMsMHg3M0NGLDB4ODExQSwweDg5QkEsMHg4OUQyLC8qIDB4QzAtMHhDNyAqLworCTB4OTVBMywweDRGODMsMHg1MjBBLDB4NThCRSwweDU5NzgsMHg1OUU2LDB4NUU3MiwweDVFNzksLyogMHhDOC0weENGICovCisJMHg2MUM3LDB4NjNDMCwweDY3NDYsMHg2N0VDLDB4Njg3RiwweDZGOTcsMHg3NjRFLDB4NzcwQiwvKiAweEQwLTB4RDcgKi8KKwkweDc4RjUsMHg3QTA4LDB4N0FGRiwweDdDMjEsMHg4MDlELDB4ODI2RSwweDgyNzEsMHg4QUVCLC8qIDB4RDgtMHhERiAqLworCTB4OTU5MywweDRFNkIsMHg1NTlELDB4NjZGNywweDZFMzQsMHg3OEEzLDB4N0FFRCwweDg0NUIsLyogMHhFMC0weEU3ICovCisJMHg4OTEwLDB4ODc0RSwweDk3QTgsMHg1MkQ4LDB4NTc0RSwweDU4MkEsMHg1RDRDLDB4NjExRiwvKiAweEU4LTB4RUYgKi8KKwkweDYxQkUsMHg2MjIxLDB4NjU2MiwweDY3RDEsMHg2QTQ0LDB4NkUxQiwweDc1MTgsMHg3NUIzLC8qIDB4RjAtMHhGNyAqLworCTB4NzZFMywweDc3QjAsMHg3RDNBLDB4OTBBRiwweDk0NTEsMHg5NDUyLDB4OUY5NSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQ0JbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg1MzIzLDB4NUNBQywweDc1MzIsMHg4MERCLDB4OTI0MCwweDk1OTgsMHg1MjVCLC8qIDB4QTAtMHhBNyAqLworCTB4NTgwOCwweDU5REMsMHg1Q0ExLDB4NUQxNywweDVFQjcsMHg1RjNBLDB4NUY0QSwweDYxNzcsLyogMHhBOC0weEFGICovCisJMHg2QzVGLDB4NzU3QSwweDc1ODYsMHg3Q0UwLDB4N0Q3MywweDdEQjEsMHg3RjhDLDB4ODE1NCwvKiAweEIwLTB4QjcgKi8KKwkweDgyMjEsMHg4NTkxLDB4ODk0MSwweDhCMUIsMHg5MkZDLDB4OTY0RCwweDlDNDcsMHg0RUNCLC8qIDB4QjgtMHhCRiAqLworCTB4NEVGNywweDUwMEIsMHg1MUYxLDB4NTg0RiwweDYxMzcsMHg2MTNFLDB4NjE2OCwweDY1MzksLyogMHhDMC0weEM3ICovCisJMHg2OUVBLDB4NkYxMSwweDc1QTUsMHg3Njg2LDB4NzZENiwweDdCODcsMHg4MkE1LDB4ODRDQiwvKiAweEM4LTB4Q0YgKi8KKwkweEY5MDAsMHg5M0E3LDB4OTU4QiwweDU1ODAsMHg1QkEyLDB4NTc1MSwweEY5MDEsMHg3Q0IzLC8qIDB4RDAtMHhENyAqLworCTB4N0ZCOSwweDkxQjUsMHg1MDI4LDB4NTNCQiwweDVDNDUsMHg1REU4LDB4NjJEMiwweDYzNkUsLyogMHhEOC0weERGICovCisJMHg2NERBLDB4NjRFNywweDZFMjAsMHg3MEFDLDB4Nzk1QiwweDhEREQsMHg4RTFFLDB4RjkwMiwvKiAweEUwLTB4RTcgKi8KKwkweDkwN0QsMHg5MjQ1LDB4OTJGOCwweDRFN0UsMHg0RUY2LDB4NTA2NSwweDVERkUsMHg1RUZBLC8qIDB4RTgtMHhFRiAqLworCTB4NjEwNiwweDY5NTcsMHg4MTcxLDB4ODY1NCwweDhFNDcsMHg5Mzc1LDB4OUEyQiwweDRFNUUsLyogMHhGMC0weEY3ICovCisJMHg1MDkxLDB4Njc3MCwweDY4NDAsMHg1MTA5LDB4NTI4RCwweDUyOTIsMHg2QUEyLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DQ1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDc3QkMsMHg5MjEwLDB4OUVENCwweDUyQUIsMHg2MDJGLDB4OEZGMiwweDUwNDgsLyogMHhBMC0weEE3ICovCisJMHg2MUE5LDB4NjNFRCwweDY0Q0EsMHg2ODNDLDB4NkE4NCwweDZGQzAsMHg4MTg4LDB4ODlBMSwvKiAweEE4LTB4QUYgKi8KKwkweDk2OTQsMHg1ODA1LDB4NzI3RCwweDcyQUMsMHg3NTA0LDB4N0Q3OSwweDdFNkQsMHg4MEE5LC8qIDB4QjAtMHhCNyAqLworCTB4ODk4QiwweDhCNzQsMHg5MDYzLDB4OUQ1MSwweDYyODksMHg2QzdBLDB4NkY1NCwweDdENTAsLyogMHhCOC0weEJGICovCisJMHg3RjNBLDB4OEEyMywweDUxN0MsMHg2MTRBLDB4N0I5RCwweDhCMTksMHg5MjU3LDB4OTM4QywvKiAweEMwLTB4QzcgKi8KKwkweDRFQUMsMHg0RkQzLDB4NTAxRSwweDUwQkUsMHg1MTA2LDB4NTJDMSwweDUyQ0QsMHg1MzdGLC8qIDB4QzgtMHhDRiAqLworCTB4NTc3MCwweDU4ODMsMHg1RTlBLDB4NUY5MSwweDYxNzYsMHg2MUFDLDB4NjRDRSwweDY1NkMsLyogMHhEMC0weEQ3ICovCisJMHg2NjZGLDB4NjZCQiwweDY2RjQsMHg2ODk3LDB4NkQ4NywweDcwODUsMHg3MEYxLDB4NzQ5RiwvKiAweEQ4LTB4REYgKi8KKwkweDc0QTUsMHg3NENBLDB4NzVEOSwweDc4NkMsMHg3OEVDLDB4N0FERiwweDdBRjYsMHg3RDQ1LC8qIDB4RTAtMHhFNyAqLworCTB4N0Q5MywweDgwMTUsMHg4MDNGLDB4ODExQiwweDgzOTYsMHg4QjY2LDB4OEYxNSwweDkwMTUsLyogMHhFOC0weEVGICovCisJMHg5M0UxLDB4OTgwMywweDk4MzgsMHg5QTVBLDB4OUJFOCwweDRGQzIsMHg1NTUzLDB4NTgzQSwvKiAweEYwLTB4RjcgKi8KKwkweDU5NTEsMHg1QjYzLDB4NUM0NiwweDYwQjgsMHg2MjEyLDB4Njg0MiwweDY4QjAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0NEWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NjhFOCwweDZFQUEsMHg3NTRDLDB4NzY3OCwweDc4Q0UsMHg3QTNELDB4N0NGQiwvKiAweEEwLTB4QTcgKi8KKwkweDdFNkIsMHg3RTdDLDB4OEEwOCwweDhBQTEsMHg4QzNGLDB4OTY4RSwweDlEQzQsMHg1M0U0LC8qIDB4QTgtMHhBRiAqLworCTB4NTNFOSwweDU0NEEsMHg1NDcxLDB4NTZGQSwweDU5RDEsMHg1QjY0LDB4NUMzQiwweDVFQUIsLyogMHhCMC0weEI3ICovCisJMHg2MkY3LDB4NjUzNywweDY1NDUsMHg2NTcyLDB4NjZBMCwweDY3QUYsMHg2OUMxLDB4NkNCRCwvKiAweEI4LTB4QkYgKi8KKwkweDc1RkMsMHg3NjkwLDB4Nzc3RSwweDdBM0YsMHg3Rjk0LDB4ODAwMywweDgwQTEsMHg4MThGLC8qIDB4QzAtMHhDNyAqLworCTB4ODJFNiwweDgyRkQsMHg4M0YwLDB4ODVDMSwweDg4MzEsMHg4OEI0LDB4OEFBNSwweEY5MDMsLyogMHhDOC0weENGICovCisJMHg4RjlDLDB4OTMyRSwweDk2QzcsMHg5ODY3LDB4OUFEOCwweDlGMTMsMHg1NEVELDB4NjU5QiwvKiAweEQwLTB4RDcgKi8KKwkweDY2RjIsMHg2ODhGLDB4N0E0MCwweDhDMzcsMHg5RDYwLDB4NTZGMCwweDU3NjQsMHg1RDExLC8qIDB4RDgtMHhERiAqLworCTB4NjYwNiwweDY4QjEsMHg2OENELDB4NkVGRSwweDc0MjgsMHg4ODlFLDB4OUJFNCwweDZDNjgsLyogMHhFMC0weEU3ICovCisJMHhGOTA0LDB4OUFBOCwweDRGOUIsMHg1MTZDLDB4NTE3MSwweDUyOUYsMHg1QjU0LDB4NURFNSwvKiAweEU4LTB4RUYgKi8KKwkweDYwNTAsMHg2MDZELDB4NjJGMSwweDYzQTcsMHg2NTNCLDB4NzNEOSwweDdBN0EsMHg4NkEzLC8qIDB4RjAtMHhGNyAqLworCTB4OENBMiwweDk3OEYsMHg0RTMyLDB4NUJFMSwweDYyMDgsMHg2NzlDLDB4NzREQywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQ0VbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3OUQxLDB4ODNEMywweDhBODcsMHg4QUIyLDB4OERFOCwweDkwNEUsMHg5MzRCLC8qIDB4QTAtMHhBNyAqLworCTB4OTg0NiwweDVFRDMsMHg2OUU4LDB4ODVGRiwweDkwRUQsMHhGOTA1LDB4NTFBMCwweDVCOTgsLyogMHhBOC0weEFGICovCisJMHg1QkVDLDB4NjE2MywweDY4RkEsMHg2QjNFLDB4NzA0QywweDc0MkYsMHg3NEQ4LDB4N0JBMSwvKiAweEIwLTB4QjcgKi8KKwkweDdGNTAsMHg4M0M1LDB4ODlDMCwweDhDQUIsMHg5NURDLDB4OTkyOCwweDUyMkUsMHg2MDVELC8qIDB4QjgtMHhCRiAqLworCTB4NjJFQywweDkwMDIsMHg0RjhBLDB4NTE0OSwweDUzMjEsMHg1OEQ5LDB4NUVFMywweDY2RTAsLyogMHhDMC0weEM3ICovCisJMHg2RDM4LDB4NzA5QSwweDcyQzIsMHg3M0Q2LDB4N0I1MCwweDgwRjEsMHg5NDVCLDB4NTM2NiwvKiAweEM4LTB4Q0YgKi8KKwkweDYzOUIsMHg3RjZCLDB4NEU1NiwweDUwODAsMHg1ODRBLDB4NThERSwweDYwMkEsMHg2MTI3LC8qIDB4RDAtMHhENyAqLworCTB4NjJEMCwweDY5RDAsMHg5QjQxLDB4NUI4RiwweDdEMTgsMHg4MEIxLDB4OEY1RiwweDRFQTQsLyogMHhEOC0weERGICovCisJMHg1MEQxLDB4NTRBQywweDU1QUMsMHg1QjBDLDB4NURBMCwweDVERTcsMHg2NTJBLDB4NjU0RSwvKiAweEUwLTB4RTcgKi8KKwkweDY4MjEsMHg2QTRCLDB4NzJFMSwweDc2OEUsMHg3N0VGLDB4N0Q1RSwweDdGRjksMHg4MUEwLC8qIDB4RTgtMHhFRiAqLworCTB4ODU0RSwweDg2REYsMHg4RjAzLDB4OEY0RSwweDkwQ0EsMHg5OTAzLDB4OUE1NSwweDlCQUIsLyogMHhGMC0weEY3ICovCisJMHg0RTE4LDB4NEU0NSwweDRFNUQsMHg0RUM3LDB4NEZGMSwweDUxNzcsMHg1MkZFLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DRlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDUzNDAsMHg1M0UzLDB4NTNFNSwweDU0OEUsMHg1NjE0LDB4NTc3NSwweDU3QTIsLyogMHhBMC0weEE3ICovCisJMHg1QkM3LDB4NUQ4NywweDVFRDAsMHg2MUZDLDB4NjJEOCwweDY1NTEsMHg2N0I4LDB4NjdFOSwvKiAweEE4LTB4QUYgKi8KKwkweDY5Q0IsMHg2QjUwLDB4NkJDNiwweDZCRUMsMHg2QzQyLDB4NkU5RCwweDcwNzgsMHg3MkQ3LC8qIDB4QjAtMHhCNyAqLworCTB4NzM5NiwweDc0MDMsMHg3N0JGLDB4NzdFOSwweDdBNzYsMHg3RDdGLDB4ODAwOSwweDgxRkMsLyogMHhCOC0weEJGICovCisJMHg4MjA1LDB4ODIwQSwweDgyREYsMHg4ODYyLDB4OEIzMywweDhDRkMsMHg4RUMwLDB4OTAxMSwvKiAweEMwLTB4QzcgKi8KKwkweDkwQjEsMHg5MjY0LDB4OTJCNiwweDk5RDIsMHg5QTQ1LDB4OUNFOSwweDlERDcsMHg5RjlDLC8qIDB4QzgtMHhDRiAqLworCTB4NTcwQiwweDVDNDAsMHg4M0NBLDB4OTdBMCwweDk3QUIsMHg5RUI0LDB4NTQxQiwweDdBOTgsLyogMHhEMC0weEQ3ICovCisJMHg3RkE0LDB4ODhEOSwweDhFQ0QsMHg5MEUxLDB4NTgwMCwweDVDNDgsMHg2Mzk4LDB4N0E5RiwvKiAweEQ4LTB4REYgKi8KKwkweDVCQUUsMHg1RjEzLDB4N0E3OSwweDdBQUUsMHg4MjhFLDB4OEVBQywweDUwMjYsMHg1MjM4LC8qIDB4RTAtMHhFNyAqLworCTB4NTJGOCwweDUzNzcsMHg1NzA4LDB4NjJGMywweDYzNzIsMHg2QjBBLDB4NkRDMywweDc3MzcsLyogMHhFOC0weEVGICovCisJMHg1M0E1LDB4NzM1NywweDg1NjgsMHg4RTc2LDB4OTVENSwweDY3M0EsMHg2QUMzLDB4NkY3MCwvKiAweEYwLTB4RjcgKi8KKwkweDhBNkQsMHg4RUNDLDB4OTk0QiwweEY5MDYsMHg2Njc3LDB4NkI3OCwweDhDQjQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0QwWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OUIzQywweEY5MDcsMHg1M0VCLDB4NTcyRCwweDU5NEUsMHg2M0M2LDB4NjlGQiwvKiAweEEwLTB4QTcgKi8KKwkweDczRUEsMHg3ODQ1LDB4N0FCQSwweDdBQzUsMHg3Q0ZFLDB4ODQ3NSwweDg5OEYsMHg4RDczLC8qIDB4QTgtMHhBRiAqLworCTB4OTAzNSwweDk1QTgsMHg1MkZCLDB4NTc0NywweDc1NDcsMHg3QjYwLDB4ODNDQywweDkyMUUsLyogMHhCMC0weEI3ICovCisJMHhGOTA4LDB4NkE1OCwweDUxNEIsMHg1MjRCLDB4NTI4NywweDYyMUYsMHg2OEQ4LDB4Njk3NSwvKiAweEI4LTB4QkYgKi8KKwkweDk2OTksMHg1MEM1LDB4NTJBNCwweDUyRTQsMHg2MUMzLDB4NjVBNCwweDY4MzksMHg2OUZGLC8qIDB4QzAtMHhDNyAqLworCTB4NzQ3RSwweDdCNEIsMHg4MkI5LDB4ODNFQiwweDg5QjIsMHg4QjM5LDB4OEZEMSwweDk5NDksLyogMHhDOC0weENGICovCisJMHhGOTA5LDB4NEVDQSwweDU5OTcsMHg2NEQyLDB4NjYxMSwweDZBOEUsMHg3NDM0LDB4Nzk4MSwvKiAweEQwLTB4RDcgKi8KKwkweDc5QkQsMHg4MkE5LDB4ODg3RSwweDg4N0YsMHg4OTVGLDB4RjkwQSwweDkzMjYsMHg0RjBCLC8qIDB4RDgtMHhERiAqLworCTB4NTNDQSwweDYwMjUsMHg2MjcxLDB4NkM3MiwweDdEMUEsMHg3RDY2LDB4NEU5OCwweDUxNjIsLyogMHhFMC0weEU3ICovCisJMHg3N0RDLDB4ODBBRiwweDRGMDEsMHg0RjBFLDB4NTE3NiwweDUxODAsMHg1NURDLDB4NTY2OCwvKiAweEU4LTB4RUYgKi8KKwkweDU3M0IsMHg1N0ZBLDB4NTdGQywweDU5MTQsMHg1OTQ3LDB4NTk5MywweDVCQzQsMHg1QzkwLC8qIDB4RjAtMHhGNyAqLworCTB4NUQwRSwweDVERjEsMHg1RTdFLDB4NUZDQywweDYyODAsMHg2NUQ3LDB4NjVFMywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRDFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg2NzFFLDB4NjcxRiwweDY3NUUsMHg2OENCLDB4NjhDNCwweDZBNUYsMHg2QjNBLC8qIDB4QTAtMHhBNyAqLworCTB4NkMyMywweDZDN0QsMHg2QzgyLDB4NkRDNywweDczOTgsMHg3NDI2LDB4NzQyQSwweDc0ODIsLyogMHhBOC0weEFGICovCisJMHg3NEEzLDB4NzU3OCwweDc1N0YsMHg3ODgxLDB4NzhFRiwweDc5NDEsMHg3OTQ3LDB4Nzk0OCwvKiAweEIwLTB4QjcgKi8KKwkweDc5N0EsMHg3Qjk1LDB4N0QwMCwweDdEQkEsMHg3Rjg4LDB4ODAwNiwweDgwMkQsMHg4MDhDLC8qIDB4QjgtMHhCRiAqLworCTB4OEExOCwweDhCNEYsMHg4QzQ4LDB4OEQ3NywweDkzMjEsMHg5MzI0LDB4OThFMiwweDk5NTEsLyogMHhDMC0weEM3ICovCisJMHg5QTBFLDB4OUEwRiwweDlBNjUsMHg5RTkyLDB4N0RDQSwweDRGNzYsMHg1NDA5LDB4NjJFRSwvKiAweEM4LTB4Q0YgKi8KKwkweDY4NTQsMHg5MUQxLDB4NTVBQiwweDUxM0EsMHhGOTBCLDB4RjkwQywweDVBMUMsMHg2MUU2LC8qIDB4RDAtMHhENyAqLworCTB4RjkwRCwweDYyQ0YsMHg2MkZGLDB4RjkwRSwweEY5MEYsMHhGOTEwLDB4RjkxMSwweEY5MTIsLyogMHhEOC0weERGICovCisJMHhGOTEzLDB4OTBBMywweEY5MTQsMHhGOTE1LDB4RjkxNiwweEY5MTcsMHhGOTE4LDB4OEFGRSwvKiAweEUwLTB4RTcgKi8KKwkweEY5MTksMHhGOTFBLDB4RjkxQiwweEY5MUMsMHg2Njk2LDB4RjkxRCwweDcxNTYsMHhGOTFFLC8qIDB4RTgtMHhFRiAqLworCTB4RjkxRiwweDk2RTMsMHhGOTIwLDB4NjM0RiwweDYzN0EsMHg1MzU3LDB4RjkyMSwweDY3OEYsLyogMHhGMC0weEY3ICovCisJMHg2OTYwLDB4NkU3MywweEY5MjIsMHg3NTM3LDB4RjkyMywweEY5MjQsMHhGOTI1LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EMlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDdEMEQsMHhGOTI2LDB4RjkyNywweDg4NzIsMHg1NkNBLDB4NUExOCwweEY5MjgsLyogMHhBMC0weEE3ICovCisJMHhGOTI5LDB4RjkyQSwweEY5MkIsMHhGOTJDLDB4NEU0MywweEY5MkQsMHg1MTY3LDB4NTk0OCwvKiAweEE4LTB4QUYgKi8KKwkweDY3RjAsMHg4MDEwLDB4RjkyRSwweDU5NzMsMHg1RTc0LDB4NjQ5QSwweDc5Q0EsMHg1RkY1LC8qIDB4QjAtMHhCNyAqLworCTB4NjA2QywweDYyQzgsMHg2MzdCLDB4NUJFNywweDVCRDcsMHg1MkFBLDB4RjkyRiwweDU5NzQsLyogMHhCOC0weEJGICovCisJMHg1RjI5LDB4NjAxMiwweEY5MzAsMHhGOTMxLDB4RjkzMiwweDc0NTksMHhGOTMzLDB4RjkzNCwvKiAweEMwLTB4QzcgKi8KKwkweEY5MzUsMHhGOTM2LDB4RjkzNywweEY5MzgsMHg5OUQxLDB4RjkzOSwweEY5M0EsMHhGOTNCLC8qIDB4QzgtMHhDRiAqLworCTB4RjkzQywweEY5M0QsMHhGOTNFLDB4RjkzRiwweEY5NDAsMHhGOTQxLDB4Rjk0MiwweEY5NDMsLyogMHhEMC0weEQ3ICovCisJMHg2RkMzLDB4Rjk0NCwweEY5NDUsMHg4MUJGLDB4OEZCMiwweDYwRjEsMHhGOTQ2LDB4Rjk0NywvKiAweEQ4LTB4REYgKi8KKwkweDgxNjYsMHhGOTQ4LDB4Rjk0OSwweDVDM0YsMHhGOTRBLDB4Rjk0QiwweEY5NEMsMHhGOTRELC8qIDB4RTAtMHhFNyAqLworCTB4Rjk0RSwweEY5NEYsMHhGOTUwLDB4Rjk1MSwweDVBRTksMHg4QTI1LDB4Njc3QiwweDdEMTAsLyogMHhFOC0weEVGICovCisJMHhGOTUyLDB4Rjk1MywweEY5NTQsMHhGOTU1LDB4Rjk1NiwweEY5NTcsMHg4MEZELDB4Rjk1OCwvKiAweEYwLTB4RjcgKi8KKwkweEY5NTksMHg1QzNDLDB4NkNFNSwweDUzM0YsMHg2RUJBLDB4NTkxQSwweDgzMzYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0QzWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NEUzOSwweDRFQjYsMHg0RjQ2LDB4NTVBRSwweDU3MTgsMHg1OEM3LDB4NUY1NiwvKiAweEEwLTB4QTcgKi8KKwkweDY1QjcsMHg2NUU2LDB4NkE4MCwweDZCQjUsMHg2RTRELDB4NzdFRCwweDdBRUYsMHg3QzFFLC8qIDB4QTgtMHhBRiAqLworCTB4N0RERSwweDg2Q0IsMHg4ODkyLDB4OTEzMiwweDkzNUIsMHg2NEJCLDB4NkZCRSwweDczN0EsLyogMHhCMC0weEI3ICovCisJMHg3NUI4LDB4OTA1NCwweDU1NTYsMHg1NzRELDB4NjFCQSwweDY0RDQsMHg2NkM3LDB4NkRFMSwvKiAweEI4LTB4QkYgKi8KKwkweDZFNUIsMHg2RjZELDB4NkZCOSwweDc1RjAsMHg4MDQzLDB4ODFCRCwweDg1NDEsMHg4OTgzLC8qIDB4QzAtMHhDNyAqLworCTB4OEFDNywweDhCNUEsMHg5MzFGLDB4NkM5MywweDc1NTMsMHg3QjU0LDB4OEUwRiwweDkwNUQsLyogMHhDOC0weENGICovCisJMHg1NTEwLDB4NTgwMiwweDU4NTgsMHg1RTYyLDB4NjIwNywweDY0OUUsMHg2OEUwLDB4NzU3NiwvKiAweEQwLTB4RDcgKi8KKwkweDdDRDYsMHg4N0IzLDB4OUVFOCwweDRFRTMsMHg1Nzg4LDB4NTc2RSwweDU5MjcsMHg1QzBELC8qIDB4RDgtMHhERiAqLworCTB4NUNCMSwweDVFMzYsMHg1Rjg1LDB4NjIzNCwweDY0RTEsMHg3M0IzLDB4ODFGQSwweDg4OEIsLyogMHhFMC0weEU3ICovCisJMHg4Q0I4LDB4OTY4QSwweDlFREIsMHg1Qjg1LDB4NUZCNywweDYwQjMsMHg1MDEyLDB4NTIwMCwvKiAweEU4LTB4RUYgKi8KKwkweDUyMzAsMHg1NzE2LDB4NTgzNSwweDU4NTcsMHg1QzBFLDB4NUM2MCwweDVDRjYsMHg1RDhCLC8qIDB4RjAtMHhGNyAqLworCTB4NUVBNiwweDVGOTIsMHg2MEJDLDB4NjMxMSwweDYzODksMHg2NDE3LDB4Njg0MywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRDRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg2OEY5LDB4NkFDMiwweDZERDgsMHg2RTIxLDB4NkVENCwweDZGRTQsMHg3MUZFLC8qIDB4QTAtMHhBNyAqLworCTB4NzZEQywweDc3NzksMHg3OUIxLDB4N0EzQiwweDg0MDQsMHg4OUE5LDB4OENFRCwweDhERjMsLyogMHhBOC0weEFGICovCisJMHg4RTQ4LDB4OTAwMywweDkwMTQsMHg5MDUzLDB4OTBGRCwweDkzNEQsMHg5Njc2LDB4OTdEQywvKiAweEIwLTB4QjcgKi8KKwkweDZCRDIsMHg3MDA2LDB4NzI1OCwweDcyQTIsMHg3MzY4LDB4Nzc2MywweDc5QkYsMHg3QkU0LC8qIDB4QjgtMHhCRiAqLworCTB4N0U5QiwweDhCODAsMHg1OEE5LDB4NjBDNywweDY1NjYsMHg2NUZELDB4NjZCRSwweDZDOEMsLyogMHhDMC0weEM3ICovCisJMHg3MTFFLDB4NzFDOSwweDhDNUEsMHg5ODEzLDB4NEU2RCwweDdBODEsMHg0RURELDB4NTFBQywvKiAweEM4LTB4Q0YgKi8KKwkweDUxQ0QsMHg1MkQ1LDB4NTQwQywweDYxQTcsMHg2NzcxLDB4Njg1MCwweDY4REYsMHg2RDFFLC8qIDB4RDAtMHhENyAqLworCTB4NkY3QywweDc1QkMsMHg3N0IzLDB4N0FFNSwweDgwRjQsMHg4NDYzLDB4OTI4NSwweDUxNUMsLyogMHhEOC0weERGICovCisJMHg2NTk3LDB4Njc1QywweDY3OTMsMHg3NUQ4LDB4N0FDNywweDgzNzMsMHhGOTVBLDB4OEM0NiwvKiAweEUwLTB4RTcgKi8KKwkweDkwMTcsMHg5ODJELDB4NUM2RiwweDgxQzAsMHg4MjlBLDB4OTA0MSwweDkwNkYsMHg5MjBELC8qIDB4RTgtMHhFRiAqLworCTB4NUY5NywweDVEOUQsMHg2QTU5LDB4NzFDOCwweDc2N0IsMHg3QjQ5LDB4ODVFNCwweDhCMDQsLyogMHhGMC0weEY3ICovCisJMHg5MTI3LDB4OUEzMCwweDU1ODcsMHg2MUY2LDB4Rjk1QiwweDc2NjksMHg3Rjg1LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9ENVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDg2M0YsMHg4N0JBLDB4ODhGOCwweDkwOEYsMHhGOTVDLDB4NkQxQiwweDcwRDksLyogMHhBMC0weEE3ICovCisJMHg3M0RFLDB4N0Q2MSwweDg0M0QsMHhGOTVELDB4OTE2QSwweDk5RjEsMHhGOTVFLDB4NEU4MiwvKiAweEE4LTB4QUYgKi8KKwkweDUzNzUsMHg2QjA0LDB4NkIxMiwweDcwM0UsMHg3MjFCLDB4ODYyRCwweDlFMUUsMHg1MjRDLC8qIDB4QjAtMHhCNyAqLworCTB4OEZBMywweDVENTAsMHg2NEU1LDB4NjUyQywweDZCMTYsMHg2RkVCLDB4N0M0MywweDdFOUMsLyogMHhCOC0weEJGICovCisJMHg4NUNELDB4ODk2NCwweDg5QkQsMHg2MkM5LDB4ODFEOCwweDg4MUYsMHg1RUNBLDB4NjcxNywvKiAweEMwLTB4QzcgKi8KKwkweDZENkEsMHg3MkZDLDB4NzQwNSwweDc0NkYsMHg4NzgyLDB4OTBERSwweDRGODYsMHg1RDBELC8qIDB4QzgtMHhDRiAqLworCTB4NUZBMCwweDg0MEEsMHg1MUI3LDB4NjNBMCwweDc1NjUsMHg0RUFFLDB4NTAwNiwweDUxNjksLyogMHhEMC0weEQ3ICovCisJMHg1MUM5LDB4Njg4MSwweDZBMTEsMHg3Q0FFLDB4N0NCMSwweDdDRTcsMHg4MjZGLDB4OEFEMiwvKiAweEQ4LTB4REYgKi8KKwkweDhGMUIsMHg5MUNGLDB4NEZCNiwweDUxMzcsMHg1MkY1LDB4NTQ0MiwweDVFRUMsMHg2MTZFLC8qIDB4RTAtMHhFNyAqLworCTB4NjIzRSwweDY1QzUsMHg2QURBLDB4NkZGRSwweDc5MkEsMHg4NURDLDB4ODgyMywweDk1QUQsLyogMHhFOC0weEVGICovCisJMHg5QTYyLDB4OUE2QSwweDlFOTcsMHg5RUNFLDB4NTI5QiwweDY2QzYsMHg2Qjc3LDB4NzAxRCwvKiAweEYwLTB4RjcgKi8KKwkweDc5MkIsMHg4RjYyLDB4OTc0MiwweDYxOTAsMHg2MjAwLDB4NjUyMywweDZGMjMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Q2WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NzE0OSwweDc0ODksMHg3REY0LDB4ODA2RiwweDg0RUUsMHg4RjI2LDB4OTAyMywvKiAweEEwLTB4QTcgKi8KKwkweDkzNEEsMHg1MUJELDB4NTIxNywweDUyQTMsMHg2RDBDLDB4NzBDOCwweDg4QzIsMHg1RUM5LC8qIDB4QTgtMHhBRiAqLworCTB4NjU4MiwweDZCQUUsMHg2RkMyLDB4N0MzRSwweDczNzUsMHg0RUU0LDB4NEYzNiwweDU2RjksLyogMHhCMC0weEI3ICovCisJMHhGOTVGLDB4NUNCQSwweDVEQkEsMHg2MDFDLDB4NzNCMiwweDdCMkQsMHg3RjlBLDB4N0ZDRSwvKiAweEI4LTB4QkYgKi8KKwkweDgwNDYsMHg5MDFFLDB4OTIzNCwweDk2RjYsMHg5NzQ4LDB4OTgxOCwweDlGNjEsMHg0RjhCLC8qIDB4QzAtMHhDNyAqLworCTB4NkZBNywweDc5QUUsMHg5MUI0LDB4OTZCNywweDUyREUsMHhGOTYwLDB4NjQ4OCwweDY0QzQsLyogMHhDOC0weENGICovCisJMHg2QUQzLDB4NkY1RSwweDcwMTgsMHg3MjEwLDB4NzZFNywweDgwMDEsMHg4NjA2LDB4ODY1QywvKiAweEQwLTB4RDcgKi8KKwkweDhERUYsMHg4RjA1LDB4OTczMiwweDlCNkYsMHg5REZBLDB4OUU3NSwweDc4OEMsMHg3OTdGLC8qIDB4RDgtMHhERiAqLworCTB4N0RBMCwweDgzQzksMHg5MzA0LDB4OUU3RiwweDlFOTMsMHg4QUQ2LDB4NThERiwweDVGMDQsLyogMHhFMC0weEU3ICovCisJMHg2NzI3LDB4NzAyNywweDc0Q0YsMHg3QzYwLDB4ODA3RSwweDUxMjEsMHg3MDI4LDB4NzI2MiwvKiAweEU4LTB4RUYgKi8KKwkweDc4Q0EsMHg4Q0MyLDB4OENEQSwweDhDRjQsMHg5NkY3LDB4NEU4NiwweDUwREEsMHg1QkVFLC8qIDB4RjAtMHhGNyAqLworCTB4NUVENiwweDY1OTksMHg3MUNFLDB4NzY0MiwweDc3QUQsMHg4MDRBLDB4ODRGQywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRDdbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg5MDdDLDB4OUIyNywweDlGOEQsMHg1OEQ4LDB4NUE0MSwweDVDNjIsMHg2QTEzLC8qIDB4QTAtMHhBNyAqLworCTB4NkREQSwweDZGMEYsMHg3NjNCLDB4N0QyRiwweDdFMzcsMHg4NTFFLDB4ODkzOCwweDkzRTQsLyogMHhBOC0weEFGICovCisJMHg5NjRCLDB4NTI4OSwweDY1RDIsMHg2N0YzLDB4NjlCNCwweDZENDEsMHg2RTlDLDB4NzAwRiwvKiAweEIwLTB4QjcgKi8KKwkweDc0MDksMHg3NDYwLDB4NzU1OSwweDc2MjQsMHg3ODZCLDB4OEIyQywweDk4NUUsMHg1MTZELC8qIDB4QjgtMHhCRiAqLworCTB4NjIyRSwweDk2NzgsMHg0Rjk2LDB4NTAyQiwweDVEMTksMHg2REVBLDB4N0RCOCwweDhGMkEsLyogMHhDMC0weEM3ICovCisJMHg1RjhCLDB4NjE0NCwweDY4MTcsMHhGOTYxLDB4OTY4NiwweDUyRDIsMHg4MDhCLDB4NTFEQywvKiAweEM4LTB4Q0YgKi8KKwkweDUxQ0MsMHg2OTVFLDB4N0ExQywweDdEQkUsMHg4M0YxLDB4OTY3NSwweDRGREEsMHg1MjI5LC8qIDB4RDAtMHhENyAqLworCTB4NTM5OCwweDU0MEYsMHg1NTBFLDB4NUM2NSwweDYwQTcsMHg2NzRFLDB4NjhBOCwweDZENkMsLyogMHhEOC0weERGICovCisJMHg3MjgxLDB4NzJGOCwweDc0MDYsMHg3NDgzLDB4Rjk2MiwweDc1RTIsMHg3QzZDLDB4N0Y3OSwvKiAweEUwLTB4RTcgKi8KKwkweDdGQjgsMHg4Mzg5LDB4ODhDRiwweDg4RTEsMHg5MUNDLDB4OTFEMCwweDk2RTIsMHg5QkM5LC8qIDB4RTgtMHhFRiAqLworCTB4NTQxRCwweDZGN0UsMHg3MUQwLDB4NzQ5OCwweDg1RkEsMHg4RUFBLDB4OTZBMywweDlDNTcsLyogMHhGMC0weEY3ICovCisJMHg5RTlGLDB4Njc5NywweDZEQ0IsMHg3NDMzLDB4ODFFOCwweDk3MTYsMHg3ODJDLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EOFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDdBQ0IsMHg3QjIwLDB4N0M5MiwweDY0NjksMHg3NDZBLDB4NzVGMiwweDc4QkMsLyogMHhBMC0weEE3ICovCisJMHg3OEU4LDB4OTlBQywweDlCNTQsMHg5RUJCLDB4NUJERSwweDVFNTUsMHg2RjIwLDB4ODE5QywvKiAweEE4LTB4QUYgKi8KKwkweDgzQUIsMHg5MDg4LDB4NEUwNywweDUzNEQsMHg1QTI5LDB4NUREMiwweDVGNEUsMHg2MTYyLC8qIDB4QjAtMHhCNyAqLworCTB4NjMzRCwweDY2NjksMHg2NkZDLDB4NkVGRiwweDZGMkIsMHg3MDYzLDB4Nzc5RSwweDg0MkMsLyogMHhCOC0weEJGICovCisJMHg4NTEzLDB4ODgzQiwweDhGMTMsMHg5OTQ1LDB4OUMzQiwweDU1MUMsMHg2MkI5LDB4NjcyQiwvKiAweEMwLTB4QzcgKi8KKwkweDZDQUIsMHg4MzA5LDB4ODk2QSwweDk3N0EsMHg0RUExLDB4NTk4NCwweDVGRDgsMHg1RkQ5LC8qIDB4QzgtMHhDRiAqLworCTB4NjcxQiwweDdEQjIsMHg3RjU0LDB4ODI5MiwweDgzMkIsMHg4M0JELDB4OEYxRSwweDkwOTksLyogMHhEMC0weEQ3ICovCisJMHg1N0NCLDB4NTlCOSwweDVBOTIsMHg1QkQwLDB4NjYyNywweDY3OUEsMHg2ODg1LDB4NkJDRiwvKiAweEQ4LTB4REYgKi8KKwkweDcxNjQsMHg3Rjc1LDB4OENCNywweDhDRTMsMHg5MDgxLDB4OUI0NSwweDgxMDgsMHg4QzhBLC8qIDB4RTAtMHhFNyAqLworCTB4OTY0QywweDlBNDAsMHg5RUE1LDB4NUI1RiwweDZDMTMsMHg3MzFCLDB4NzZGMiwweDc2REYsLyogMHhFOC0weEVGICovCisJMHg4NDBDLDB4NTFBQSwweDg5OTMsMHg1MTRELDB4NTE5NSwweDUyQzksMHg2OEM5LDB4NkM5NCwvKiAweEYwLTB4RjcgKi8KKwkweDc3MDQsMHg3NzIwLDB4N0RCRiwweDdERUMsMHg5NzYyLDB4OUVCNSwweDZFQzUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Q5WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4ODUxMSwweDUxQTUsMHg1NDBELDB4NTQ3RCwweDY2MEUsMHg2NjlELDB4NjkyNywvKiAweEEwLTB4QTcgKi8KKwkweDZFOUYsMHg3NkJGLDB4Nzc5MSwweDgzMTcsMHg4NEMyLDB4ODc5RiwweDkxNjksMHg5Mjk4LC8qIDB4QTgtMHhBRiAqLworCTB4OUNGNCwweDg4ODIsMHg0RkFFLDB4NTE5MiwweDUyREYsMHg1OUM2LDB4NUUzRCwweDYxNTUsLyogMHhCMC0weEI3ICovCisJMHg2NDc4LDB4NjQ3OSwweDY2QUUsMHg2N0QwLDB4NkEyMSwweDZCQ0QsMHg2QkRCLDB4NzI1RiwvKiAweEI4LTB4QkYgKi8KKwkweDcyNjEsMHg3NDQxLDB4NzczOCwweDc3REIsMHg4MDE3LDB4ODJCQywweDgzMDUsMHg4QjAwLC8qIDB4QzAtMHhDNyAqLworCTB4OEIyOCwweDhDOEMsMHg2NzI4LDB4NkM5MCwweDcyNjcsMHg3NkVFLDB4Nzc2NiwweDdBNDYsLyogMHhDOC0weENGICovCisJMHg5REE5LDB4NkI3RiwweDZDOTIsMHg1OTIyLDB4NjcyNiwweDg0OTksMHg1MzZGLDB4NTg5MywvKiAweEQwLTB4RDcgKi8KKwkweDU5OTksMHg1RURGLDB4NjNDRiwweDY2MzQsMHg2NzczLDB4NkUzQSwweDczMkIsMHg3QUQ3LC8qIDB4RDgtMHhERiAqLworCTB4ODJENywweDkzMjgsMHg1MkQ5LDB4NURFQiwweDYxQUUsMHg2MUNCLDB4NjIwQSwweDYyQzcsLyogMHhFMC0weEU3ICovCisJMHg2NEFCLDB4NjVFMCwweDY5NTksMHg2QjY2LDB4NkJDQiwweDcxMjEsMHg3M0Y3LDB4NzU1RCwvKiAweEU4LTB4RUYgKi8KKwkweDdFNDYsMHg4MjFFLDB4ODMwMiwweDg1NkEsMHg4QUEzLDB4OENCRiwweDk3MjcsMHg5RDYxLC8qIDB4RjAtMHhGNyAqLworCTB4NThBOCwweDlFRDgsMHg1MDExLDB4NTIwRSwweDU0M0IsMHg1NTRGLDB4NjU4NywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfREFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg2Qzc2LDB4N0QwQSwweDdEMEIsMHg4MDVFLDB4ODY4QSwweDk1ODAsMHg5NkVGLC8qIDB4QTAtMHhBNyAqLworCTB4NTJGRiwweDZDOTUsMHg3MjY5LDB4NTQ3MywweDVBOUEsMHg1QzNFLDB4NUQ0QiwweDVGNEMsLyogMHhBOC0weEFGICovCisJMHg1RkFFLDB4NjcyQSwweDY4QjYsMHg2OTYzLDB4NkUzQywweDZFNDQsMHg3NzA5LDB4N0M3MywvKiAweEIwLTB4QjcgKi8KKwkweDdGOEUsMHg4NTg3LDB4OEIwRSwweDhGRjcsMHg5NzYxLDB4OUVGNCwweDVDQjcsMHg2MEI2LC8qIDB4QjgtMHhCRiAqLworCTB4NjEwRCwweDYxQUIsMHg2NTRGLDB4NjVGQiwweDY1RkMsMHg2QzExLDB4NkNFRiwweDczOUYsLyogMHhDMC0weEM3ICovCisJMHg3M0M5LDB4N0RFMSwweDk1OTQsMHg1QkM2LDB4ODcxQywweDhCMTAsMHg1MjVELDB4NTM1QSwvKiAweEM4LTB4Q0YgKi8KKwkweDYyQ0QsMHg2NDBGLDB4NjRCMiwweDY3MzQsMHg2QTM4LDB4NkNDQSwweDczQzAsMHg3NDlFLC8qIDB4RDAtMHhENyAqLworCTB4N0I5NCwweDdDOTUsMHg3RTFCLDB4ODE4QSwweDgyMzYsMHg4NTg0LDB4OEZFQiwweDk2RjksLyogMHhEOC0weERGICovCisJMHg5OUMxLDB4NEYzNCwweDUzNEEsMHg1M0NELDB4NTNEQiwweDYyQ0MsMHg2NDJDLDB4NjUwMCwvKiAweEUwLTB4RTcgKi8KKwkweDY1OTEsMHg2OUMzLDB4NkNFRSwweDZGNTgsMHg3M0VELDB4NzU1NCwweDc2MjIsMHg3NkU0LC8qIDB4RTgtMHhFRiAqLworCTB4NzZGQywweDc4RDAsMHg3OEZCLDB4NzkyQywweDdENDYsMHg4MjJDLDB4ODdFMCwweDhGRDQsLyogMHhGMC0weEY3ICovCisJMHg5ODEyLDB4OThFRiwweDUyQzMsMHg2MkQ0LDB4NjRBNSwweDZFMjQsMHg2RjUxLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EQlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDc2N0MsMHg4RENCLDB4OTFCMSwweDkyNjIsMHg5QUVFLDB4OUI0MywweDUwMjMsLyogMHhBMC0weEE3ICovCisJMHg1MDhELDB4NTc0QSwweDU5QTgsMHg1QzI4LDB4NUU0NywweDVGNzcsMHg2MjNGLDB4NjUzRSwvKiAweEE4LTB4QUYgKi8KKwkweDY1QjksMHg2NUMxLDB4NjYwOSwweDY3OEIsMHg2OTlDLDB4NkVDMiwweDc4QzUsMHg3RDIxLC8qIDB4QjAtMHhCNyAqLworCTB4ODBBQSwweDgxODAsMHg4MjJCLDB4ODJCMywweDg0QTEsMHg4NjhDLDB4OEEyQSwweDhCMTcsLyogMHhCOC0weEJGICovCisJMHg5MEE2LDB4OTYzMiwweDlGOTAsMHg1MDBELDB4NEZGMywweEY5NjMsMHg1N0Y5LDB4NUY5OCwvKiAweEMwLTB4QzcgKi8KKwkweDYyREMsMHg2MzkyLDB4Njc2RiwweDZFNDMsMHg3MTE5LDB4NzZDMywweDgwQ0MsMHg4MERBLC8qIDB4QzgtMHhDRiAqLworCTB4ODhGNCwweDg4RjUsMHg4OTE5LDB4OENFMCwweDhGMjksMHg5MTRELDB4OTY2QSwweDRGMkYsLyogMHhEMC0weEQ3ICovCisJMHg0RjcwLDB4NUUxQiwweDY3Q0YsMHg2ODIyLDB4NzY3RCwweDc2N0UsMHg5QjQ0LDB4NUU2MSwvKiAweEQ4LTB4REYgKi8KKwkweDZBMEEsMHg3MTY5LDB4NzFENCwweDc1NkEsMHhGOTY0LDB4N0U0MSwweDg1NDMsMHg4NUU5LC8qIDB4RTAtMHhFNyAqLworCTB4OThEQywweDRGMTAsMHg3QjRGLDB4N0Y3MCwweDk1QTUsMHg1MUUxLDB4NUUwNiwweDY4QjUsLyogMHhFOC0weEVGICovCisJMHg2QzNFLDB4NkM0RSwweDZDREIsMHg3MkFGLDB4N0JDNCwweDgzMDMsMHg2Q0Q1LDB4NzQzQSwvKiAweEYwLTB4RjcgKi8KKwkweDUwRkIsMHg1Mjg4LDB4NThDMSwweDY0RDgsMHg2QTk3LDB4NzRBNywweDc2NTYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0RDWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NzhBNywweDg2MTcsMHg5NUUyLDB4OTczOSwweEY5NjUsMHg1MzVFLDB4NUYwMSwvKiAweEEwLTB4QTcgKi8KKwkweDhCOEEsMHg4RkE4LDB4OEZBRiwweDkwOEEsMHg1MjI1LDB4NzdBNSwweDlDNDksMHg5RjA4LC8qIDB4QTgtMHhBRiAqLworCTB4NEUxOSwweDUwMDIsMHg1MTc1LDB4NUM1QiwweDVFNzcsMHg2NjFFLDB4NjYzQSwweDY3QzQsLyogMHhCMC0weEI3ICovCisJMHg2OEM1LDB4NzBCMywweDc1MDEsMHg3NUM1LDB4NzlDOSwweDdBREQsMHg4RjI3LDB4OTkyMCwvKiAweEI4LTB4QkYgKi8KKwkweDlBMDgsMHg0RkRELDB4NTgyMSwweDU4MzEsMHg1QkY2LDB4NjY2RSwweDZCNjUsMHg2RDExLC8qIDB4QzAtMHhDNyAqLworCTB4NkU3QSwweDZGN0QsMHg3M0U0LDB4NzUyQiwweDgzRTksMHg4OERDLDB4ODkxMywweDhCNUMsLyogMHhDOC0weENGICovCisJMHg4RjE0LDB4NEYwRiwweDUwRDUsMHg1MzEwLDB4NTM1QywweDVCOTMsMHg1RkE5LDB4NjcwRCwvKiAweEQwLTB4RDcgKi8KKwkweDc5OEYsMHg4MTc5LDB4ODMyRiwweDg1MTQsMHg4OTA3LDB4ODk4NiwweDhGMzksMHg4RjNCLC8qIDB4RDgtMHhERiAqLworCTB4OTlBNSwweDlDMTIsMHg2NzJDLDB4NEU3NiwweDRGRjgsMHg1OTQ5LDB4NUMwMSwweDVDRUYsLyogMHhFMC0weEU3ICovCisJMHg1Q0YwLDB4NjM2NywweDY4RDIsMHg3MEZELDB4NzFBMiwweDc0MkIsMHg3RTJCLDB4ODRFQywvKiAweEU4LTB4RUYgKi8KKwkweDg3MDIsMHg5MDIyLDB4OTJEMiwweDlDRjMsMHg0RTBELDB4NEVEOCwweDRGRUYsMHg1MDg1LC8qIDB4RjAtMHhGNyAqLworCTB4NTI1NiwweDUyNkYsMHg1NDI2LDB4NTQ5MCwweDU3RTAsMHg1OTJCLDB4NUE2NiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRERbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg1QjVBLDB4NUI3NSwweDVCQ0MsMHg1RTlDLDB4Rjk2NiwweDYyNzYsMHg2NTc3LC8qIDB4QTAtMHhBNyAqLworCTB4NjVBNywweDZENkUsMHg2RUE1LDB4NzIzNiwweDdCMjYsMHg3QzNGLDB4N0YzNiwweDgxNTAsLyogMHhBOC0weEFGICovCisJMHg4MTUxLDB4ODE5QSwweDgyNDAsMHg4Mjk5LDB4ODNBOSwweDhBMDMsMHg4Q0EwLDB4OENFNiwvKiAweEIwLTB4QjcgKi8KKwkweDhDRkIsMHg4RDc0LDB4OERCQSwweDkwRTgsMHg5MURDLDB4OTYxQywweDk2NDQsMHg5OUQ5LC8qIDB4QjgtMHhCRiAqLworCTB4OUNFNywweDUzMTcsMHg1MjA2LDB4NTQyOSwweDU2NzQsMHg1OEIzLDB4NTk1NCwweDU5NkUsLyogMHhDMC0weEM3ICovCisJMHg1RkZGLDB4NjFBNCwweDYyNkUsMHg2NjEwLDB4NkM3RSwweDcxMUEsMHg3NkM2LDB4N0M4OSwvKiAweEM4LTB4Q0YgKi8KKwkweDdDREUsMHg3RDFCLDB4ODJBQywweDhDQzEsMHg5NkYwLDB4Rjk2NywweDRGNUIsMHg1RjE3LC8qIDB4RDAtMHhENyAqLworCTB4NUY3RiwweDYyQzIsMHg1RDI5LDB4NjcwQiwweDY4REEsMHg3ODdDLDB4N0U0MywweDlENkMsLyogMHhEOC0weERGICovCisJMHg0RTE1LDB4NTA5OSwweDUzMTUsMHg1MzJBLDB4NTM1MSwweDU5ODMsMHg1QTYyLDB4NUU4NywvKiAweEUwLTB4RTcgKi8KKwkweDYwQjIsMHg2MThBLDB4NjI0OSwweDYyNzksMHg2NTkwLDB4Njc4NywweDY5QTcsMHg2QkQ0LC8qIDB4RTgtMHhFRiAqLworCTB4NkJENiwweDZCRDcsMHg2QkQ4LDB4NkNCOCwweEY5NjgsMHg3NDM1LDB4NzVGQSwweDc4MTIsLyogMHhGMC0weEY3ICovCisJMHg3ODkxLDB4NzlENSwweDc5RDgsMHg3QzgzLDB4N0RDQiwweDdGRTEsMHg4MEE1LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9ERVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDgxM0UsMHg4MUMyLDB4ODNGMiwweDg3MUEsMHg4OEU4LDB4OEFCOSwweDhCNkMsLyogMHhBMC0weEE3ICovCisJMHg4Q0JCLDB4OTExOSwweDk3NUUsMHg5OERCLDB4OUYzQiwweDU2QUMsMHg1QjJBLDB4NUY2QywvKiAweEE4LTB4QUYgKi8KKwkweDY1OEMsMHg2QUIzLDB4NkJBRiwweDZENUMsMHg2RkYxLDB4NzAxNSwweDcyNUQsMHg3M0FELC8qIDB4QjAtMHhCNyAqLworCTB4OENBNywweDhDRDMsMHg5ODNCLDB4NjE5MSwweDZDMzcsMHg4MDU4LDB4OUEwMSwweDRFNEQsLyogMHhCOC0weEJGICovCisJMHg0RThCLDB4NEU5QiwweDRFRDUsMHg0RjNBLDB4NEYzQywweDRGN0YsMHg0RkRGLDB4NTBGRiwvKiAweEMwLTB4QzcgKi8KKwkweDUzRjIsMHg1M0Y4LDB4NTUwNiwweDU1RTMsMHg1NkRCLDB4NThFQiwweDU5NjIsMHg1QTExLC8qIDB4QzgtMHhDRiAqLworCTB4NUJFQiwweDVCRkEsMHg1QzA0LDB4NURGMywweDVFMkIsMHg1Rjk5LDB4NjAxRCwweDYzNjgsLyogMHhEMC0weEQ3ICovCisJMHg2NTlDLDB4NjVBRiwweDY3RjYsMHg2N0ZCLDB4NjhBRCwweDZCN0IsMHg2Qzk5LDB4NkNENywvKiAweEQ4LTB4REYgKi8KKwkweDZFMjMsMHg3MDA5LDB4NzM0NSwweDc4MDIsMHg3OTNFLDB4Nzk0MCwweDc5NjAsMHg3OUMxLC8qIDB4RTAtMHhFNyAqLworCTB4N0JFOSwweDdEMTcsMHg3RDcyLDB4ODA4NiwweDgyMEQsMHg4MzhFLDB4ODREMSwweDg2QzcsLyogMHhFOC0weEVGICovCisJMHg4OERGLDB4OEE1MCwweDhBNUUsMHg4QjFELDB4OENEQywweDhENjYsMHg4RkFELDB4OTBBQSwvKiAweEYwLTB4RjcgKi8KKwkweDk4RkMsMHg5OURGLDB4OUU5RCwweDUyNEEsMHhGOTY5LDB4NjcxNCwweEY5NkEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0RGWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NTA5OCwweDUyMkEsMHg1QzcxLDB4NjU2MywweDZDNTUsMHg3M0NBLDB4NzUyMywvKiAweEEwLTB4QTcgKi8KKwkweDc1OUQsMHg3Qjk3LDB4ODQ5QywweDkxNzgsMHg5NzMwLDB4NEU3NywweDY0OTIsMHg2QkJBLC8qIDB4QTgtMHhBRiAqLworCTB4NzE1RSwweDg1QTksMHg0RTA5LDB4Rjk2QiwweDY3NDksMHg2OEVFLDB4NkUxNywweDgyOUYsLyogMHhCMC0weEI3ICovCisJMHg4NTE4LDB4ODg2QiwweDYzRjcsMHg2RjgxLDB4OTIxMiwweDk4QUYsMHg0RTBBLDB4NTBCNywvKiAweEI4LTB4QkYgKi8KKwkweDUwQ0YsMHg1MTFGLDB4NTU0NiwweDU1QUEsMHg1NjE3LDB4NUI0MCwweDVDMTksMHg1Q0UwLC8qIDB4QzAtMHhDNyAqLworCTB4NUUzOCwweDVFOEEsMHg1RUEwLDB4NUVDMiwweDYwRjMsMHg2ODUxLDB4NkE2MSwweDZFNTgsLyogMHhDOC0weENGICovCisJMHg3MjNELDB4NzI0MCwweDcyQzAsMHg3NkY4LDB4Nzk2NSwweDdCQjEsMHg3RkQ0LDB4ODhGMywvKiAweEQwLTB4RDcgKi8KKwkweDg5RjQsMHg4QTczLDB4OEM2MSwweDhDREUsMHg5NzFDLDB4NTg1RSwweDc0QkQsMHg4Q0ZELC8qIDB4RDgtMHhERiAqLworCTB4NTVDNywweEY5NkMsMHg3QTYxLDB4N0QyMiwweDgyNzIsMHg3MjcyLDB4NzUxRiwweDc1MjUsLyogMHhFMC0weEU3ICovCisJMHhGOTZELDB4N0IxOSwweDU4ODUsMHg1OEZCLDB4NURCQywweDVFOEYsMHg1RUI2LDB4NUY5MCwvKiAweEU4LTB4RUYgKi8KKwkweDYwNTUsMHg2MjkyLDB4NjM3RiwweDY1NEQsMHg2NjkxLDB4NjZEOSwweDY2RjgsMHg2ODE2LC8qIDB4RjAtMHhGNyAqLworCTB4NjhGMiwweDcyODAsMHg3NDVFLDB4N0I2RSwweDdENkUsMHg3REQ2LDB4N0Y3MiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTBbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg4MEU1LDB4ODIxMiwweDg1QUYsMHg4OTdGLDB4OEE5MywweDkwMUQsMHg5MkU0LC8qIDB4QTAtMHhBNyAqLworCTB4OUVDRCwweDlGMjAsMHg1OTE1LDB4NTk2RCwweDVFMkQsMHg2MERDLDB4NjYxNCwweDY2NzMsLyogMHhBOC0weEFGICovCisJMHg2NzkwLDB4NkM1MCwweDZEQzUsMHg2RjVGLDB4NzdGMywweDc4QTksMHg4NEM2LDB4OTFDQiwvKiAweEIwLTB4QjcgKi8KKwkweDkzMkIsMHg0RUQ5LDB4NTBDQSwweDUxNDgsMHg1NTg0LDB4NUIwQiwweDVCQTMsMHg2MjQ3LC8qIDB4QjgtMHhCRiAqLworCTB4NjU3RSwweDY1Q0IsMHg2RTMyLDB4NzE3RCwweDc0MDEsMHg3NDQ0LDB4NzQ4NywweDc0QkYsLyogMHhDMC0weEM3ICovCisJMHg3NjZDLDB4NzlBQSwweDdEREEsMHg3RTU1LDB4N0ZBOCwweDgxN0EsMHg4MUIzLDB4ODIzOSwvKiAweEM4LTB4Q0YgKi8KKwkweDg2MUEsMHg4N0VDLDB4OEE3NSwweDhERTMsMHg5MDc4LDB4OTI5MSwweDk0MjUsMHg5OTRELC8qIDB4RDAtMHhENyAqLworCTB4OUJBRSwweDUzNjgsMHg1QzUxLDB4Njk1NCwweDZDQzQsMHg2RDI5LDB4NkUyQiwweDgyMEMsLyogMHhEOC0weERGICovCisJMHg4NTlCLDB4ODkzQiwweDhBMkQsMHg4QUFBLDB4OTZFQSwweDlGNjcsMHg1MjYxLDB4NjZCOSwvKiAweEUwLTB4RTcgKi8KKwkweDZCQjIsMHg3RTk2LDB4ODdGRSwweDhEMEQsMHg5NTgzLDB4OTY1RCwweDY1MUQsMHg2RDg5LC8qIDB4RTgtMHhFRiAqLworCTB4NzFFRSwweEY5NkUsMHg1N0NFLDB4NTlEMywweDVCQUMsMHg2MDI3LDB4NjBGQSwweDYyMTAsLyogMHhGMC0weEY3ICovCisJMHg2NjFGLDB4NjY1RiwweDczMjksMHg3M0Y5LDB4NzZEQiwweDc3MDEsMHg3QjZDLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FMVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDgwNTYsMHg4MDcyLDB4ODE2NSwweDhBQTAsMHg5MTkyLDB4NEUxNiwweDUyRTIsLyogMHhBMC0weEE3ICovCisJMHg2QjcyLDB4NkQxNywweDdBMDUsMHg3QjM5LDB4N0QzMCwweEY5NkYsMHg4Q0IwLDB4NTNFQywvKiAweEE4LTB4QUYgKi8KKwkweDU2MkYsMHg1ODUxLDB4NUJCNSwweDVDMEYsMHg1QzExLDB4NURFMiwweDYyNDAsMHg2MzgzLC8qIDB4QjAtMHhCNyAqLworCTB4NjQxNCwweDY2MkQsMHg2OEIzLDB4NkNCQywweDZEODgsMHg2RUFGLDB4NzAxRiwweDcwQTQsLyogMHhCOC0weEJGICovCisJMHg3MUQyLDB4NzUyNiwweDc1OEYsMHg3NThFLDB4NzYxOSwweDdCMTEsMHg3QkUwLDB4N0MyQiwvKiAweEMwLTB4QzcgKi8KKwkweDdEMjAsMHg3RDM5LDB4ODUyQywweDg1NkQsMHg4NjA3LDB4OEEzNCwweDkwMEQsMHg5MDYxLC8qIDB4QzgtMHhDRiAqLworCTB4OTBCNSwweDkyQjcsMHg5N0Y2LDB4OUEzNywweDRGRDcsMHg1QzZDLDB4Njc1RiwweDZEOTEsLyogMHhEMC0weEQ3ICovCisJMHg3QzlGLDB4N0U4QywweDhCMTYsMHg4RDE2LDB4OTAxRiwweDVCNkIsMHg1REZELDB4NjQwRCwvKiAweEQ4LTB4REYgKi8KKwkweDg0QzAsMHg5MDVDLDB4OThFMSwweDczODcsMHg1QjhCLDB4NjA5QSwweDY3N0UsMHg2RERFLC8qIDB4RTAtMHhFNyAqLworCTB4OEExRiwweDhBQTYsMHg5MDAxLDB4OTgwQywweDUyMzcsMHhGOTcwLDB4NzA1MSwweDc4OEUsLyogMHhFOC0weEVGICovCisJMHg5Mzk2LDB4ODg3MCwweDkxRDcsMHg0RkVFLDB4NTNENywweDU1RkQsMHg1NkRBLDB4NTc4MiwvKiAweEYwLTB4RjcgKi8KKwkweDU4RkQsMHg1QUMyLDB4NUI4OCwweDVDQUIsMHg1Q0MwLDB4NUUyNSwweDYxMDEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0UyWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NjIwRCwweDYyNEIsMHg2Mzg4LDB4NjQxQywweDY1MzYsMHg2NTc4LDB4NkEzOSwvKiAweEEwLTB4QTcgKi8KKwkweDZCOEEsMHg2QzM0LDB4NkQxOSwweDZGMzEsMHg3MUU3LDB4NzJFOSwweDczNzgsMHg3NDA3LC8qIDB4QTgtMHhBRiAqLworCTB4NzRCMiwweDc2MjYsMHg3NzYxLDB4NzlDMCwweDdBNTcsMHg3QUVBLDB4N0NCOSwweDdEOEYsLyogMHhCMC0weEI3ICovCisJMHg3REFDLDB4N0U2MSwweDdGOUUsMHg4MTI5LDB4ODMzMSwweDg0OTAsMHg4NERBLDB4ODVFQSwvKiAweEI4LTB4QkYgKi8KKwkweDg4OTYsMHg4QUIwLDB4OEI5MCwweDhGMzgsMHg5MDQyLDB4OTA4MywweDkxNkMsMHg5Mjk2LC8qIDB4QzAtMHhDNyAqLworCTB4OTJCOSwweDk2OEIsMHg5NkE3LDB4OTZBOCwweDk2RDYsMHg5NzAwLDB4OTgwOCwweDk5OTYsLyogMHhDOC0weENGICovCisJMHg5QUQzLDB4OUIxQSwweDUzRDQsMHg1ODdFLDB4NTkxOSwweDVCNzAsMHg1QkJGLDB4NkREMSwvKiAweEQwLTB4RDcgKi8KKwkweDZGNUEsMHg3MTlGLDB4NzQyMSwweDc0QjksMHg4MDg1LDB4ODNGRCwweDVERTEsMHg1Rjg3LC8qIDB4RDgtMHhERiAqLworCTB4NUZBQSwweDYwNDIsMHg2NUVDLDB4NjgxMiwweDY5NkYsMHg2QTUzLDB4NkI4OSwweDZEMzUsLyogMHhFMC0weEU3ICovCisJMHg2REYzLDB4NzNFMywweDc2RkUsMHg3N0FDLDB4N0I0RCwweDdEMTQsMHg4MTIzLDB4ODIxQywvKiAweEU4LTB4RUYgKi8KKwkweDgzNDAsMHg4NEY0LDB4ODU2MywweDhBNjIsMHg4QUM0LDB4OTE4NywweDkzMUUsMHg5ODA2LC8qIDB4RjAtMHhGNyAqLworCTB4OTlCNCwweDYyMEMsMHg4ODUzLDB4OEZGMCwweDkyNjUsMHg1RDA3LDB4NUQyNywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg1RDY5LDB4NzQ1RiwweDgxOUQsMHg4NzY4LDB4NkZENSwweDYyRkUsMHg3RkQyLC8qIDB4QTAtMHhBNyAqLworCTB4ODkzNiwweDg5NzIsMHg0RTFFLDB4NEU1OCwweDUwRTcsMHg1MkRELDB4NTM0NywweDYyN0YsLyogMHhBOC0weEFGICovCisJMHg2NjA3LDB4N0U2OSwweDg4MDUsMHg5NjVFLDB4NEY4RCwweDUzMTksMHg1NjM2LDB4NTlDQiwvKiAweEIwLTB4QjcgKi8KKwkweDVBQTQsMHg1QzM4LDB4NUM0RSwweDVDNEQsMHg1RTAyLDB4NUYxMSwweDYwNDMsMHg2NUJELC8qIDB4QjgtMHhCRiAqLworCTB4NjYyRiwweDY2NDIsMHg2N0JFLDB4NjdGNCwweDczMUMsMHg3N0UyLDB4NzkzQSwweDdGQzUsLyogMHhDMC0weEM3ICovCisJMHg4NDk0LDB4ODRDRCwweDg5OTYsMHg4QTY2LDB4OEE2OSwweDhBRTEsMHg4QzU1LDB4OEM3QSwvKiAweEM4LTB4Q0YgKi8KKwkweDU3RjQsMHg1QkQ0LDB4NUYwRiwweDYwNkYsMHg2MkVELDB4NjkwRCwweDZCOTYsMHg2RTVDLC8qIDB4RDAtMHhENyAqLworCTB4NzE4NCwweDdCRDIsMHg4NzU1LDB4OEI1OCwweDhFRkUsMHg5OERGLDB4OThGRSwweDRGMzgsLyogMHhEOC0weERGICovCisJMHg0RjgxLDB4NEZFMSwweDU0N0IsMHg1QTIwLDB4NUJCOCwweDYxM0MsMHg2NUIwLDB4NjY2OCwvKiAweEUwLTB4RTcgKi8KKwkweDcxRkMsMHg3NTMzLDB4Nzk1RSwweDdEMzMsMHg4MTRFLDB4ODFFMywweDgzOTgsMHg4NUFBLC8qIDB4RTgtMHhFRiAqLworCTB4ODVDRSwweDg3MDMsMHg4QTBBLDB4OEVBQiwweDhGOUIsMHhGOTcxLDB4OEZDNSwweDU5MzEsLyogMHhGMC0weEY3ICovCisJMHg1QkE0LDB4NUJFNiwweDYwODksMHg1QkU5LDB4NUMwQiwweDVGQzMsMHg2QzgxLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FNFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweEY5NzIsMHg2REYxLDB4NzAwQiwweDc1MUEsMHg4MkFGLDB4OEFGNiwweDRFQzAsLyogMHhBMC0weEE3ICovCisJMHg1MzQxLDB4Rjk3MywweDk2RDksMHg2QzBGLDB4NEU5RSwweDRGQzQsMHg1MTUyLDB4NTU1RSwvKiAweEE4LTB4QUYgKi8KKwkweDVBMjUsMHg1Q0U4LDB4NjIxMSwweDcyNTksMHg4MkJELDB4ODNBQSwweDg2RkUsMHg4ODU5LC8qIDB4QjAtMHhCNyAqLworCTB4OEExRCwweDk2M0YsMHg5NkM1LDB4OTkxMywweDlEMDksMHg5RDVELDB4NTgwQSwweDVDQjMsLyogMHhCOC0weEJGICovCisJMHg1REJELDB4NUU0NCwweDYwRTEsMHg2MTE1LDB4NjNFMSwweDZBMDIsMHg2RTI1LDB4OTEwMiwvKiAweEMwLTB4QzcgKi8KKwkweDkzNTQsMHg5ODRFLDB4OUMxMCwweDlGNzcsMHg1Qjg5LDB4NUNCOCwweDYzMDksMHg2NjRGLC8qIDB4QzgtMHhDRiAqLworCTB4Njg0OCwweDc3M0MsMHg5NkMxLDB4OTc4RCwweDk4NTQsMHg5QjlGLDB4NjVBMSwweDhCMDEsLyogMHhEMC0weEQ3ICovCisJMHg4RUNCLDB4OTVCQywweDU1MzUsMHg1Q0E5LDB4NURENiwweDVFQjUsMHg2Njk3LDB4NzY0QywvKiAweEQ4LTB4REYgKi8KKwkweDgzRjQsMHg5NUM3LDB4NThEMywweDYyQkMsMHg3MkNFLDB4OUQyOCwweDRFRjAsMHg1OTJFLC8qIDB4RTAtMHhFNyAqLworCTB4NjAwRiwweDY2M0IsMHg2QjgzLDB4NzlFNywweDlEMjYsMHg1MzkzLDB4NTRDMCwweDU3QzMsLyogMHhFOC0weEVGICovCisJMHg1RDE2LDB4NjExQiwweDY2RDYsMHg2REFGLDB4Nzg4RCwweDgyN0UsMHg5Njk4LDB4OTc0NCwvKiAweEYwLTB4RjcgKi8KKwkweDUzODQsMHg2MjdDLDB4NjM5NiwweDZEQjIsMHg3RTBBLDB4ODE0QiwweDk4NEQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0U1WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NkFGQiwweDdGNEMsMHg5REFGLDB4OUUxQSwweDRFNUYsMHg1MDNCLDB4NTFCNiwvKiAweEEwLTB4QTcgKi8KKwkweDU5MUMsMHg2MEY5LDB4NjNGNiwweDY5MzAsMHg3MjNBLDB4ODAzNiwweEY5NzQsMHg5MUNFLC8qIDB4QTgtMHhBRiAqLworCTB4NUYzMSwweEY5NzUsMHhGOTc2LDB4N0QwNCwweDgyRTUsMHg4NDZGLDB4ODRCQiwweDg1RTUsLyogMHhCMC0weEI3ICovCisJMHg4RThELDB4Rjk3NywweDRGNkYsMHhGOTc4LDB4Rjk3OSwweDU4RTQsMHg1QjQzLDB4NjA1OSwvKiAweEI4LTB4QkYgKi8KKwkweDYzREEsMHg2NTE4LDB4NjU2RCwweDY2OTgsMHhGOTdBLDB4Njk0QSwweDZBMjMsMHg2RDBCLC8qIDB4QzAtMHhDNyAqLworCTB4NzAwMSwweDcxNkMsMHg3NUQyLDB4NzYwRCwweDc5QjMsMHg3QTcwLDB4Rjk3QiwweDdGOEEsLyogMHhDOC0weENGICovCisJMHhGOTdDLDB4ODk0NCwweEY5N0QsMHg4QjkzLDB4OTFDMCwweDk2N0QsMHhGOTdFLDB4OTkwQSwvKiAweEQwLTB4RDcgKi8KKwkweDU3MDQsMHg1RkExLDB4NjVCQywweDZGMDEsMHg3NjAwLDB4NzlBNiwweDhBOUUsMHg5OUFELC8qIDB4RDgtMHhERiAqLworCTB4OUI1QSwweDlGNkMsMHg1MTA0LDB4NjFCNiwweDYyOTEsMHg2QThELDB4ODFDNiwweDUwNDMsLyogMHhFMC0weEU3ICovCisJMHg1ODMwLDB4NUY2NiwweDcxMDksMHg4QTAwLDB4OEFGQSwweDVCN0MsMHg4NjE2LDB4NEZGQSwvKiAweEU4LTB4RUYgKi8KKwkweDUxM0MsMHg1NkI0LDB4NTk0NCwweDYzQTksMHg2REY5LDB4NURBQSwweDY5NkQsMHg1MTg2LC8qIDB4RjAtMHhGNyAqLworCTB4NEU4OCwweDRGNTksMHhGOTdGLDB4Rjk4MCwweEY5ODEsMHg1OTgyLDB4Rjk4MiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHhGOTgzLDB4NkI1RiwweDZDNUQsMHhGOTg0LDB4NzRCNSwweDc5MTYsMHhGOTg1LC8qIDB4QTAtMHhBNyAqLworCTB4ODIwNywweDgyNDUsMHg4MzM5LDB4OEYzRiwweDhGNUQsMHhGOTg2LDB4OTkxOCwweEY5ODcsLyogMHhBOC0weEFGICovCisJMHhGOTg4LDB4Rjk4OSwweDRFQTYsMHhGOThBLDB4NTdERiwweDVGNzksMHg2NjEzLDB4Rjk4QiwvKiAweEIwLTB4QjcgKi8KKwkweEY5OEMsMHg3NUFCLDB4N0U3OSwweDhCNkYsMHhGOThELDB4OTAwNiwweDlBNUIsMHg1NkE1LC8qIDB4QjgtMHhCRiAqLworCTB4NTgyNywweDU5RjgsMHg1QTFGLDB4NUJCNCwweEY5OEUsMHg1RUY2LDB4Rjk4RiwweEY5OTAsLyogMHhDMC0weEM3ICovCisJMHg2MzUwLDB4NjMzQiwweEY5OTEsMHg2OTNELDB4NkM4NywweDZDQkYsMHg2RDhFLDB4NkQ5MywvKiAweEM4LTB4Q0YgKi8KKwkweDZERjUsMHg2RjE0LDB4Rjk5MiwweDcwREYsMHg3MTM2LDB4NzE1OSwweEY5OTMsMHg3MUMzLC8qIDB4RDAtMHhENyAqLworCTB4NzFENSwweEY5OTQsMHg3ODRGLDB4Nzg2RiwweEY5OTUsMHg3Qjc1LDB4N0RFMywweEY5OTYsLyogMHhEOC0weERGICovCisJMHg3RTJGLDB4Rjk5NywweDg4NEQsMHg4RURGLDB4Rjk5OCwweEY5OTksMHhGOTlBLDB4OTI1QiwvKiAweEUwLTB4RTcgKi8KKwkweEY5OUIsMHg5Q0Y2LDB4Rjk5QywweEY5OUQsMHhGOTlFLDB4NjA4NSwweDZEODUsMHhGOTlGLC8qIDB4RTgtMHhFRiAqLworCTB4NzFCMSwweEY5QTAsMHhGOUExLDB4OTVCMSwweDUzQUQsMHhGOUEyLDB4RjlBMywweEY5QTQsLyogMHhGMC0weEY3ICovCisJMHg2N0QzLDB4RjlBNSwweDcwOEUsMHg3MTMwLDB4NzQzMCwweDgyNzYsMHg4MkQyLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FN1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweEY5QTYsMHg5NUJCLDB4OUFFNSwweDlFN0QsMHg2NkM0LDB4RjlBNywweDcxQzEsLyogMHhBMC0weEE3ICovCisJMHg4NDQ5LDB4RjlBOCwweEY5QTksMHg1ODRCLDB4RjlBQSwweEY5QUIsMHg1REI4LDB4NUY3MSwvKiAweEE4LTB4QUYgKi8KKwkweEY5QUMsMHg2NjIwLDB4NjY4RSwweDY5NzksMHg2OUFFLDB4NkMzOCwweDZDRjMsMHg2RTM2LC8qIDB4QjAtMHhCNyAqLworCTB4NkY0MSwweDZGREEsMHg3MDFCLDB4NzAyRiwweDcxNTAsMHg3MURGLDB4NzM3MCwweEY5QUQsLyogMHhCOC0weEJGICovCisJMHg3NDVCLDB4RjlBRSwweDc0RDQsMHg3NkM4LDB4N0E0RSwweDdFOTMsMHhGOUFGLDB4RjlCMCwvKiAweEMwLTB4QzcgKi8KKwkweDgyRjEsMHg4QTYwLDB4OEZDRSwweEY5QjEsMHg5MzQ4LDB4RjlCMiwweDk3MTksMHhGOUIzLC8qIDB4QzgtMHhDRiAqLworCTB4RjlCNCwweDRFNDIsMHg1MDJBLDB4RjlCNSwweDUyMDgsMHg1M0UxLDB4NjZGMywweDZDNkQsLyogMHhEMC0weEQ3ICovCisJMHg2RkNBLDB4NzMwQSwweDc3N0YsMHg3QTYyLDB4ODJBRSwweDg1REQsMHg4NjAyLDB4RjlCNiwvKiAweEQ4LTB4REYgKi8KKwkweDg4RDQsMHg4QTYzLDB4OEI3RCwweDhDNkIsMHhGOUI3LDB4OTJCMywweEY5QjgsMHg5NzEzLC8qIDB4RTAtMHhFNyAqLworCTB4OTgxMCwweDRFOTQsMHg0RjBELDB4NEZDOSwweDUwQjIsMHg1MzQ4LDB4NTQzRSwweDU0MzMsLyogMHhFOC0weEVGICovCisJMHg1NURBLDB4NTg2MiwweDU4QkEsMHg1OTY3LDB4NUExQiwweDVCRTQsMHg2MDlGLDB4RjlCOSwvKiAweEYwLTB4RjcgKi8KKwkweDYxQ0EsMHg2NTU2LDB4NjVGRiwweDY2NjQsMHg2OEE3LDB4NkM1QSwweDZGQjMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0U4WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NzBDRiwweDcxQUMsMHg3MzUyLDB4N0I3RCwweDg3MDgsMHg4QUE0LDB4OUMzMiwvKiAweEEwLTB4QTcgKi8KKwkweDlGMDcsMHg1QzRCLDB4NkM4MywweDczNDQsMHg3Mzg5LDB4OTIzQSwweDZFQUIsMHg3NDY1LC8qIDB4QTgtMHhBRiAqLworCTB4NzYxRiwweDdBNjksMHg3RTE1LDB4ODYwQSwweDUxNDAsMHg1OEM1LDB4NjRDMSwweDc0RUUsLyogMHhCMC0weEI3ICovCisJMHg3NTE1LDB4NzY3MCwweDdGQzEsMHg5MDk1LDB4OTZDRCwweDk5NTQsMHg2RTI2LDB4NzRFNiwvKiAweEI4LTB4QkYgKi8KKwkweDdBQTksMHg3QUFBLDB4ODFFNSwweDg2RDksMHg4Nzc4LDB4OEExQiwweDVBNDksMHg1QjhDLC8qIDB4QzAtMHhDNyAqLworCTB4NUI5QiwweDY4QTEsMHg2OTAwLDB4NkQ2MywweDczQTksMHg3NDEzLDB4NzQyQywweDc4OTcsLyogMHhDOC0weENGICovCisJMHg3REU5LDB4N0ZFQiwweDgxMTgsMHg4MTU1LDB4ODM5RSwweDhDNEMsMHg5NjJFLDB4OTgxMSwvKiAweEQwLTB4RDcgKi8KKwkweDY2RjAsMHg1RjgwLDB4NjVGQSwweDY3ODksMHg2QzZBLDB4NzM4QiwweDUwMkQsMHg1QTAzLC8qIDB4RDgtMHhERiAqLworCTB4NkI2QSwweDc3RUUsMHg1OTE2LDB4NUQ2QywweDVEQ0QsMHg3MzI1LDB4NzU0RiwweEY5QkEsLyogMHhFMC0weEU3ICovCisJMHhGOUJCLDB4NTBFNSwweDUxRjksMHg1ODJGLDB4NTkyRCwweDU5OTYsMHg1OURBLDB4NUJFNSwvKiAweEU4LTB4RUYgKi8KKwkweEY5QkMsMHhGOUJELDB4NURBMiwweDYyRDcsMHg2NDE2LDB4NjQ5MywweDY0RkUsMHhGOUJFLC8qIDB4RjAtMHhGNyAqLworCTB4NjZEQywweEY5QkYsMHg2QTQ4LDB4RjlDMCwweDcxRkYsMHg3NDY0LDB4RjlDMSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTlbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3QTg4LDB4N0FBRiwweDdFNDcsMHg3RTVFLDB4ODAwMCwweDgxNzAsMHhGOUMyLC8qIDB4QTAtMHhBNyAqLworCTB4ODdFRiwweDg5ODEsMHg4QjIwLDB4OTA1OSwweEY5QzMsMHg5MDgwLDB4OTk1MiwweDYxN0UsLyogMHhBOC0weEFGICovCisJMHg2QjMyLDB4NkQ3NCwweDdFMUYsMHg4OTI1LDB4OEZCMSwweDRGRDEsMHg1MEFELDB4NTE5NywvKiAweEIwLTB4QjcgKi8KKwkweDUyQzcsMHg1N0M3LDB4NTg4OSwweDVCQjksMHg1RUI4LDB4NjE0MiwweDY5OTUsMHg2RDhDLC8qIDB4QjgtMHhCRiAqLworCTB4NkU2NywweDZFQjYsMHg3MTk0LDB4NzQ2MiwweDc1MjgsMHg3NTJDLDB4ODA3MywweDgzMzgsLyogMHhDMC0weEM3ICovCisJMHg4NEM5LDB4OEUwQSwweDkzOTQsMHg5M0RFLDB4RjlDNCwweDRFOEUsMHg0RjUxLDB4NTA3NiwvKiAweEM4LTB4Q0YgKi8KKwkweDUxMkEsMHg1M0M4LDB4NTNDQiwweDUzRjMsMHg1Qjg3LDB4NUJEMywweDVDMjQsMHg2MTFBLC8qIDB4RDAtMHhENyAqLworCTB4NjE4MiwweDY1RjQsMHg3MjVCLDB4NzM5NywweDc0NDAsMHg3NkMyLDB4Nzk1MCwweDc5OTEsLyogMHhEOC0weERGICovCisJMHg3OUI5LDB4N0QwNiwweDdGQkQsMHg4MjhCLDB4ODVENSwweDg2NUUsMHg4RkMyLDB4OTA0NywvKiAweEUwLTB4RTcgKi8KKwkweDkwRjUsMHg5MUVBLDB4OTY4NSwweDk2RTgsMHg5NkU5LDB4NTJENiwweDVGNjcsMHg2NUVELC8qIDB4RTgtMHhFRiAqLworCTB4NjYzMSwweDY4MkYsMHg3MTVDLDB4N0EzNiwweDkwQzEsMHg5ODBBLDB4NEU5MSwweEY5QzUsLyogMHhGMC0weEY3ICovCisJMHg2QTUyLDB4NkI5RSwweDZGOTAsMHg3MTg5LDB4ODAxOCwweDgyQjgsMHg4NTUzLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FQVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDkwNEIsMHg5Njk1LDB4OTZGMiwweDk3RkIsMHg4NTFBLDB4OUIzMSwweDRFOTAsLyogMHhBMC0weEE3ICovCisJMHg3MThBLDB4OTZDNCwweDUxNDMsMHg1MzlGLDB4NTRFMSwweDU3MTMsMHg1NzEyLDB4NTdBMywvKiAweEE4LTB4QUYgKi8KKwkweDVBOUIsMHg1QUM0LDB4NUJDMywweDYwMjgsMHg2MTNGLDB4NjNGNCwweDZDODUsMHg2RDM5LC8qIDB4QjAtMHhCNyAqLworCTB4NkU3MiwweDZFOTAsMHg3MjMwLDB4NzMzRiwweDc0NTcsMHg4MkQxLDB4ODg4MSwweDhGNDUsLyogMHhCOC0weEJGICovCisJMHg5MDYwLDB4RjlDNiwweDk2NjIsMHg5ODU4LDB4OUQxQiwweDY3MDgsMHg4RDhBLDB4OTI1RSwvKiAweEMwLTB4QzcgKi8KKwkweDRGNEQsMHg1MDQ5LDB4NTBERSwweDUzNzEsMHg1NzBELDB4NTlENCwweDVBMDEsMHg1QzA5LC8qIDB4QzgtMHhDRiAqLworCTB4NjE3MCwweDY2OTAsMHg2RTJELDB4NzIzMiwweDc0NEIsMHg3REVGLDB4ODBDMywweDg0MEUsLyogMHhEMC0weEQ3ICovCisJMHg4NDY2LDB4ODUzRiwweDg3NUYsMHg4ODVCLDB4ODkxOCwweDhCMDIsMHg5MDU1LDB4OTdDQiwvKiAweEQ4LTB4REYgKi8KKwkweDlCNEYsMHg0RTczLDB4NEY5MSwweDUxMTIsMHg1MTZBLDB4RjlDNywweDU1MkYsMHg1NUE5LC8qIDB4RTAtMHhFNyAqLworCTB4NUI3QSwweDVCQTUsMHg1RTdDLDB4NUU3RCwweDVFQkUsMHg2MEEwLDB4NjBERiwweDYxMDgsLyogMHhFOC0weEVGICovCisJMHg2MTA5LDB4NjNDNCwweDY1MzgsMHg2NzA5LDB4RjlDOCwweDY3RDQsMHg2N0RBLDB4RjlDOSwvKiAweEYwLTB4RjcgKi8KKwkweDY5NjEsMHg2OTYyLDB4NkNCOSwweDZEMjcsMHhGOUNBLDB4NkUzOCwweEY5Q0IsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0VCWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NkZFMSwweDczMzYsMHg3MzM3LDB4RjlDQywweDc0NUMsMHg3NTMxLDB4RjlDRCwvKiAweEEwLTB4QTcgKi8KKwkweDc2NTIsMHhGOUNFLDB4RjlDRiwweDdEQUQsMHg4MUZFLDB4ODQzOCwweDg4RDUsMHg4QTk4LC8qIDB4QTgtMHhBRiAqLworCTB4OEFEQiwweDhBRUQsMHg4RTMwLDB4OEU0MiwweDkwNEEsMHg5MDNFLDB4OTA3QSwweDkxNDksLyogMHhCMC0weEI3ICovCisJMHg5MUM5LDB4OTM2RSwweEY5RDAsMHhGOUQxLDB4NTgwOSwweEY5RDIsMHg2QkQzLDB4ODA4OSwvKiAweEI4LTB4QkYgKi8KKwkweDgwQjIsMHhGOUQzLDB4RjlENCwweDUxNDEsMHg1OTZCLDB4NUMzOSwweEY5RDUsMHhGOUQ2LC8qIDB4QzAtMHhDNyAqLworCTB4NkY2NCwweDczQTcsMHg4MEU0LDB4OEQwNywweEY5RDcsMHg5MjE3LDB4OTU4RiwweEY5RDgsLyogMHhDOC0weENGICovCisJMHhGOUQ5LDB4RjlEQSwweEY5REIsMHg4MDdGLDB4NjIwRSwweDcwMUMsMHg3RDY4LDB4ODc4RCwvKiAweEQwLTB4RDcgKi8KKwkweEY5REMsMHg1N0EwLDB4NjA2OSwweDYxNDcsMHg2QkI3LDB4OEFCRSwweDkyODAsMHg5NkIxLC8qIDB4RDgtMHhERiAqLworCTB4NEU1OSwweDU0MUYsMHg2REVCLDB4ODUyRCwweDk2NzAsMHg5N0YzLDB4OThFRSwweDYzRDYsLyogMHhFMC0weEU3ICovCisJMHg2Q0UzLDB4OTA5MSwweDUxREQsMHg2MUM5LDB4ODFCQSwweDlERjksMHg0RjlELDB4NTAxQSwvKiAweEU4LTB4RUYgKi8KKwkweDUxMDAsMHg1QjlDLDB4NjEwRiwweDYxRkYsMHg2NEVDLDB4NjkwNSwweDZCQzUsMHg3NTkxLC8qIDB4RjAtMHhGNyAqLworCTB4NzdFMywweDdGQTksMHg4MjY0LDB4ODU4RiwweDg3RkIsMHg4ODYzLDB4OEFCQywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRUNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg4QjcwLDB4OTFBQiwweDRFOEMsMHg0RUU1LDB4NEYwQSwweEY5REQsMHhGOURFLC8qIDB4QTAtMHhBNyAqLworCTB4NTkzNywweDU5RTgsMHhGOURGLDB4NURGMiwweDVGMUIsMHg1RjVCLDB4NjAyMSwweEY5RTAsLyogMHhBOC0weEFGICovCisJMHhGOUUxLDB4RjlFMiwweEY5RTMsMHg3MjNFLDB4NzNFNSwweEY5RTQsMHg3NTcwLDB4NzVDRCwvKiAweEIwLTB4QjcgKi8KKwkweEY5RTUsMHg3OUZCLDB4RjlFNiwweDgwMEMsMHg4MDMzLDB4ODA4NCwweDgyRTEsMHg4MzUxLC8qIDB4QjgtMHhCRiAqLworCTB4RjlFNywweEY5RTgsMHg4Q0JELDB4OENCMywweDkwODcsMHhGOUU5LDB4RjlFQSwweDk4RjQsLyogMHhDMC0weEM3ICovCisJMHg5OTBDLDB4RjlFQiwweEY5RUMsMHg3MDM3LDB4NzZDQSwweDdGQ0EsMHg3RkNDLDB4N0ZGQywvKiAweEM4LTB4Q0YgKi8KKwkweDhCMUEsMHg0RUJBLDB4NEVDMSwweDUyMDMsMHg1MzcwLDB4RjlFRCwweDU0QkQsMHg1NkUwLC8qIDB4RDAtMHhENyAqLworCTB4NTlGQiwweDVCQzUsMHg1RjE1LDB4NUZDRCwweDZFNkUsMHhGOUVFLDB4RjlFRiwweDdENkEsLyogMHhEOC0weERGICovCisJMHg4MzM1LDB4RjlGMCwweDg2OTMsMHg4QThELDB4RjlGMSwweDk3NkQsMHg5Nzc3LDB4RjlGMiwvKiAweEUwLTB4RTcgKi8KKwkweEY5RjMsMHg0RTAwLDB4NEY1QSwweDRGN0UsMHg1OEY5LDB4NjVFNSwweDZFQTIsMHg5MDM4LC8qIDB4RTgtMHhFRiAqLworCTB4OTNCMCwweDk5QjksMHg0RUZCLDB4NThFQywweDU5OEEsMHg1OUQ5LDB4NjA0MSwweEY5RjQsLyogMHhGMC0weEY3ICovCisJMHhGOUY1LDB4N0ExNCwweEY5RjYsMHg4MzRGLDB4OENDMywweDUxNjUsMHg1MzQ0LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FRFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweEY5RjcsMHhGOUY4LDB4RjlGOSwweDRFQ0QsMHg1MjY5LDB4NUI1NSwweDgyQkYsLyogMHhBMC0weEE3ICovCisJMHg0RUQ0LDB4NTIzQSwweDU0QTgsMHg1OUM5LDB4NTlGRiwweDVCNTAsMHg1QjU3LDB4NUI1QywvKiAweEE4LTB4QUYgKi8KKwkweDYwNjMsMHg2MTQ4LDB4NkVDQiwweDcwOTksMHg3MTZFLDB4NzM4NiwweDc0RjcsMHg3NUI1LC8qIDB4QjAtMHhCNyAqLworCTB4NzhDMSwweDdEMkIsMHg4MDA1LDB4ODFFQSwweDgzMjgsMHg4NTE3LDB4ODVDOSwweDhBRUUsLyogMHhCOC0weEJGICovCisJMHg4Q0M3LDB4OTZDQywweDRGNUMsMHg1MkZBLDB4NTZCQywweDY1QUIsMHg2NjI4LDB4NzA3QywvKiAweEMwLTB4QzcgKi8KKwkweDcwQjgsMHg3MjM1LDB4N0RCRCwweDgyOEQsMHg5MTRDLDB4OTZDMCwweDlENzIsMHg1QjcxLC8qIDB4QzgtMHhDRiAqLworCTB4NjhFNywweDZCOTgsMHg2RjdBLDB4NzZERSwweDVDOTEsMHg2NkFCLDB4NkY1QiwweDdCQjQsLyogMHhEMC0weEQ3ICovCisJMHg3QzJBLDB4ODgzNiwweDk2REMsMHg0RTA4LDB4NEVENywweDUzMjAsMHg1ODM0LDB4NThCQiwvKiAweEQ4LTB4REYgKi8KKwkweDU4RUYsMHg1OTZDLDB4NUMwNywweDVFMzMsMHg1RTg0LDB4NUYzNSwweDYzOEMsMHg2NkIyLC8qIDB4RTAtMHhFNyAqLworCTB4Njc1NiwweDZBMUYsMHg2QUEzLDB4NkIwQywweDZGM0YsMHg3MjQ2LDB4RjlGQSwweDczNTAsLyogMHhFOC0weEVGICovCisJMHg3NDhCLDB4N0FFMCwweDdDQTcsMHg4MTc4LDB4ODFERiwweDgxRTcsMHg4MzhBLDB4ODQ2QywvKiAweEYwLTB4RjcgKi8KKwkweDg1MjMsMHg4NTk0LDB4ODVDRiwweDg4REQsMHg4RDEzLDB4OTFBQywweDk1NzcsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0VFWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OTY5QywweDUxOEQsMHg1NEM5LDB4NTcyOCwweDVCQjAsMHg2MjRELDB4Njc1MCwvKiAweEEwLTB4QTcgKi8KKwkweDY4M0QsMHg2ODkzLDB4NkUzRCwweDZFRDMsMHg3MDdELDB4N0UyMSwweDg4QzEsMHg4Q0ExLC8qIDB4QTgtMHhBRiAqLworCTB4OEYwOSwweDlGNEIsMHg5RjRFLDB4NzIyRCwweDdCOEYsMHg4QUNELDB4OTMxQSwweDRGNDcsLyogMHhCMC0weEI3ICovCisJMHg0RjRFLDB4NTEzMiwweDU0ODAsMHg1OUQwLDB4NUU5NSwweDYyQjUsMHg2Nzc1LDB4Njk2RSwvKiAweEI4LTB4QkYgKi8KKwkweDZBMTcsMHg2Q0FFLDB4NkUxQSwweDcyRDksMHg3MzJBLDB4NzVCRCwweDdCQjgsMHg3RDM1LC8qIDB4QzAtMHhDNyAqLworCTB4ODJFNywweDgzRjksMHg4NDU3LDB4ODVGNywweDhBNUIsMHg4Q0FGLDB4OEU4NywweDkwMTksLyogMHhDOC0weENGICovCisJMHg5MEI4LDB4OTZDRSwweDlGNUYsMHg1MkUzLDB4NTQwQSwweDVBRTEsMHg1QkMyLDB4NjQ1OCwvKiAweEQwLTB4RDcgKi8KKwkweDY1NzUsMHg2RUY0LDB4NzJDNCwweEY5RkIsMHg3Njg0LDB4N0E0RCwweDdCMUIsMHg3QzRELC8qIDB4RDgtMHhERiAqLworCTB4N0UzRSwweDdGREYsMHg4MzdCLDB4OEIyQiwweDhDQ0EsMHg4RDY0LDB4OERFMSwweDhFNUYsLyogMHhFMC0weEU3ICovCisJMHg4RkVBLDB4OEZGOSwweDkwNjksMHg5M0QxLDB4NEY0MywweDRGN0EsMHg1MEIzLDB4NTE2OCwvKiAweEU4LTB4RUYgKi8KKwkweDUxNzgsMHg1MjRELDB4NTI2QSwweDU4NjEsMHg1ODdDLDB4NTk2MCwweDVDMDgsMHg1QzU1LC8qIDB4RjAtMHhGNyAqLworCTB4NUVEQiwweDYwOUIsMHg2MjMwLDB4NjgxMywweDZCQkYsMHg2QzA4LDB4NkZCMSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRUZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3MTRFLDB4NzQyMCwweDc1MzAsMHg3NTM4LDB4NzU1MSwweDc2NzIsMHg3QjRDLC8qIDB4QTAtMHhBNyAqLworCTB4N0I4QiwweDdCQUQsMHg3QkM2LDB4N0U4RiwweDhBNkUsMHg4RjNFLDB4OEY0OSwweDkyM0YsLyogMHhBOC0weEFGICovCisJMHg5MjkzLDB4OTMyMiwweDk0MkIsMHg5NkZCLDB4OTg1QSwweDk4NkIsMHg5OTFFLDB4NTIwNywvKiAweEIwLTB4QjcgKi8KKwkweDYyMkEsMHg2Mjk4LDB4NkQ1OSwweDc2NjQsMHg3QUNBLDB4N0JDMCwweDdENzYsMHg1MzYwLC8qIDB4QjgtMHhCRiAqLworCTB4NUNCRSwweDVFOTcsMHg2RjM4LDB4NzBCOSwweDdDOTgsMHg5NzExLDB4OUI4RSwweDlFREUsLyogMHhDMC0weEM3ICovCisJMHg2M0E1LDB4NjQ3QSwweDg3NzYsMHg0RTAxLDB4NEU5NSwweDRFQUQsMHg1MDVDLDB4NTA3NSwvKiAweEM4LTB4Q0YgKi8KKwkweDU0NDgsMHg1OUMzLDB4NUI5QSwweDVFNDAsMHg1RUFELDB4NUVGNywweDVGODEsMHg2MEM1LC8qIDB4RDAtMHhENyAqLworCTB4NjMzQSwweDY1M0YsMHg2NTc0LDB4NjVDQywweDY2NzYsMHg2Njc4LDB4NjdGRSwweDY5NjgsLyogMHhEOC0weERGICovCisJMHg2QTg5LDB4NkI2MywweDZDNDAsMHg2REMwLDB4NkRFOCwweDZFMUYsMHg2RTVFLDB4NzAxRSwvKiAweEUwLTB4RTcgKi8KKwkweDcwQTEsMHg3MzhFLDB4NzNGRCwweDc1M0EsMHg3NzVCLDB4Nzg4NywweDc5OEUsMHg3QTBCLC8qIDB4RTgtMHhFRiAqLworCTB4N0E3RCwweDdDQkUsMHg3RDhFLDB4ODI0NywweDhBMDIsMHg4QUVBLDB4OEM5RSwweDkxMkQsLyogMHhGMC0weEY3ICovCisJMHg5MTRBLDB4OTFEOCwweDkyNjYsMHg5MkNDLDB4OTMyMCwweDk3MDYsMHg5NzU2LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GMFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDk3NUMsMHg5ODAyLDB4OUYwRSwweDUyMzYsMHg1MjkxLDB4NTU3QywweDU4MjQsLyogMHhBMC0weEE3ICovCisJMHg1RTFELDB4NUYxRiwweDYwOEMsMHg2M0QwLDB4NjhBRiwweDZGREYsMHg3OTZELDB4N0IyQywvKiAweEE4LTB4QUYgKi8KKwkweDgxQ0QsMHg4NUJBLDB4ODhGRCwweDhBRjgsMHg4RTQ0LDB4OTE4RCwweDk2NjQsMHg5NjlCLC8qIDB4QjAtMHhCNyAqLworCTB4OTczRCwweDk4NEMsMHg5RjRBLDB4NEZDRSwweDUxNDYsMHg1MUNCLDB4NTJBOSwweDU2MzIsLyogMHhCOC0weEJGICovCisJMHg1RjE0LDB4NUY2QiwweDYzQUEsMHg2NENELDB4NjVFOSwweDY2NDEsMHg2NkZBLDB4NjZGOSwvKiAweEMwLTB4QzcgKi8KKwkweDY3MUQsMHg2ODlELDB4NjhENywweDY5RkQsMHg2RjE1LDB4NkY2RSwweDcxNjcsMHg3MUU1LC8qIDB4QzgtMHhDRiAqLworCTB4NzIyQSwweDc0QUEsMHg3NzNBLDB4Nzk1NiwweDc5NUEsMHg3OURGLDB4N0EyMCwweDdBOTUsLyogMHhEMC0weEQ3ICovCisJMHg3Qzk3LDB4N0NERiwweDdENDQsMHg3RTcwLDB4ODA4NywweDg1RkIsMHg4NkE0LDB4OEE1NCwvKiAweEQ4LTB4REYgKi8KKwkweDhBQkYsMHg4RDk5LDB4OEU4MSwweDkwMjAsMHg5MDZELDB4OTFFMywweDk2M0IsMHg5NkQ1LC8qIDB4RTAtMHhFNyAqLworCTB4OUNFNSwweDY1Q0YsMHg3QzA3LDB4OERCMywweDkzQzMsMHg1QjU4LDB4NUMwQSwweDUzNTIsLyogMHhFOC0weEVGICovCisJMHg2MkQ5LDB4NzMxRCwweDUwMjcsMHg1Qjk3LDB4NUY5RSwweDYwQjAsMHg2MTZCLDB4NjhENSwvKiAweEYwLTB4RjcgKi8KKwkweDZERDksMHg3NDJFLDB4N0EyRSwweDdENDIsMHg3RDlDLDB4N0UzMSwweDgxNkIsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0YxWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OEUyQSwweDhFMzUsMHg5MzdFLDB4OTQxOCwweDRGNTAsMHg1NzUwLDB4NURFNiwvKiAweEEwLTB4QTcgKi8KKwkweDVFQTcsMHg2MzJCLDB4N0Y2QSwweDRFM0IsMHg0RjRGLDB4NEY4RiwweDUwNUEsMHg1OURELC8qIDB4QTgtMHhBRiAqLworCTB4ODBDNCwweDU0NkEsMHg1NDY4LDB4NTVGRSwweDU5NEYsMHg1Qjk5LDB4NURERSwweDVFREEsLyogMHhCMC0weEI3ICovCisJMHg2NjVELDB4NjczMSwweDY3RjEsMHg2ODJBLDB4NkNFOCwweDZEMzIsMHg2RTRBLDB4NkY4RCwvKiAweEI4LTB4QkYgKi8KKwkweDcwQjcsMHg3M0UwLDB4NzU4NywweDdDNEMsMHg3RDAyLDB4N0QyQywweDdEQTIsMHg4MjFGLC8qIDB4QzAtMHhDNyAqLworCTB4ODZEQiwweDhBM0IsMHg4QTg1LDB4OEQ3MCwweDhFOEEsMHg4RjMzLDB4OTAzMSwweDkxNEUsLyogMHhDOC0weENGICovCisJMHg5MTUyLDB4OTQ0NCwweDk5RDAsMHg3QUY5LDB4N0NBNSwweDRGQ0EsMHg1MTAxLDB4NTFDNiwvKiAweEQwLTB4RDcgKi8KKwkweDU3QzgsMHg1QkVGLDB4NUNGQiwweDY2NTksMHg2QTNELDB4NkQ1QSwweDZFOTYsMHg2RkVDLC8qIDB4RDgtMHhERiAqLworCTB4NzEwQywweDc1NkYsMHg3QUUzLDB4ODgyMiwweDkwMjEsMHg5MDc1LDB4OTZDQiwweDk5RkYsLyogMHhFMC0weEU3ICovCisJMHg4MzAxLDB4NEUyRCwweDRFRjIsMHg4ODQ2LDB4OTFDRCwweDUzN0QsMHg2QURCLDB4Njk2QiwvKiAweEU4LTB4RUYgKi8KKwkweDZDNDEsMHg4NDdBLDB4NTg5RSwweDYxOEUsMHg2NkZFLDB4NjJFRiwweDcwREQsMHg3NTExLC8qIDB4RjAtMHhGNyAqLworCTB4NzVDNywweDdFNTIsMHg4NEI4LDB4OEI0OSwweDhEMDgsMHg0RTRCLDB4NTNFQSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRjJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg1NEFCLDB4NTczMCwweDU3NDAsMHg1RkQ3LDB4NjMwMSwweDYzMDcsMHg2NDZGLC8qIDB4QTAtMHhBNyAqLworCTB4NjUyRiwweDY1RTgsMHg2NjdBLDB4Njc5RCwweDY3QjMsMHg2QjYyLDB4NkM2MCwweDZDOUEsLyogMHhBOC0weEFGICovCisJMHg2RjJDLDB4NzdFNSwweDc4MjUsMHg3OTQ5LDB4Nzk1NywweDdEMTksMHg4MEEyLDB4ODEwMiwvKiAweEIwLTB4QjcgKi8KKwkweDgxRjMsMHg4MjlELDB4ODJCNywweDg3MTgsMHg4QThDLDB4RjlGQywweDhEMDQsMHg4REJFLC8qIDB4QjgtMHhCRiAqLworCTB4OTA3MiwweDc2RjQsMHg3QTE5LDB4N0EzNywweDdFNTQsMHg4MDc3LDB4NTUwNywweDU1RDQsLyogMHhDMC0weEM3ICovCisJMHg1ODc1LDB4NjMyRiwweDY0MjIsMHg2NjQ5LDB4NjY0QiwweDY4NkQsMHg2OTlCLDB4NkI4NCwvKiAweEM4LTB4Q0YgKi8KKwkweDZEMjUsMHg2RUIxLDB4NzNDRCwweDc0NjgsMHg3NEExLDB4NzU1QiwweDc1QjksMHg3NkUxLC8qIDB4RDAtMHhENyAqLworCTB4NzcxRSwweDc3OEIsMHg3OUU2LDB4N0UwOSwweDdFMUQsMHg4MUZCLDB4ODUyRiwweDg4OTcsLyogMHhEOC0weERGICovCisJMHg4QTNBLDB4OENEMSwweDhFRUIsMHg4RkIwLDB4OTAzMiwweDkzQUQsMHg5NjYzLDB4OTY3MywvKiAweEUwLTB4RTcgKi8KKwkweDk3MDcsMHg0Rjg0LDB4NTNGMSwweDU5RUEsMHg1QUM5LDB4NUUxOSwweDY4NEUsMHg3NEM2LC8qIDB4RTgtMHhFRiAqLworCTB4NzVCRSwweDc5RTksMHg3QTkyLDB4ODFBMywweDg2RUQsMHg4Q0VBLDB4OERDQywweDhGRUQsLyogMHhGMC0weEY3ICovCisJMHg2NTlGLDB4NjcxNSwweEY5RkQsMHg1N0Y3LDB4NkY1NywweDdEREQsMHg4RjJGLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GM1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDkzRjYsMHg5NkM2LDB4NUZCNSwweDYxRjIsMHg2Rjg0LDB4NEUxNCwweDRGOTgsLyogMHhBMC0weEE3ICovCisJMHg1MDFGLDB4NTNDOSwweDU1REYsMHg1RDZGLDB4NURFRSwweDZCMjEsMHg2QjY0LDB4NzhDQiwvKiAweEE4LTB4QUYgKi8KKwkweDdCOUEsMHhGOUZFLDB4OEU0OSwweDhFQ0EsMHg5MDZFLDB4NjM0OSwweDY0M0UsMHg3NzQwLC8qIDB4QjAtMHhCNyAqLworCTB4N0E4NCwweDkzMkYsMHg5NDdGLDB4OUY2QSwweDY0QjAsMHg2RkFGLDB4NzFFNiwweDc0QTgsLyogMHhCOC0weEJGICovCisJMHg3NERBLDB4N0FDNCwweDdDMTIsMHg3RTgyLDB4N0NCMiwweDdFOTgsMHg4QjlBLDB4OEQwQSwvKiAweEMwLTB4QzcgKi8KKwkweDk0N0QsMHg5OTEwLDB4OTk0QywweDUyMzksMHg1QkRGLDB4NjRFNiwweDY3MkQsMHg3RDJFLC8qIDB4QzgtMHhDRiAqLworCTB4NTBFRCwweDUzQzMsMHg1ODc5LDB4NjE1OCwweDYxNTksMHg2MUZBLDB4NjVBQywweDdBRDksLyogMHhEMC0weEQ3ICovCisJMHg4QjkyLDB4OEI5NiwweDUwMDksMHg1MDIxLDB4NTI3NSwweDU1MzEsMHg1QTNDLDB4NUVFMCwvKiAweEQ4LTB4REYgKi8KKwkweDVGNzAsMHg2MTM0LDB4NjU1RSwweDY2MEMsMHg2NjM2LDB4NjZBMiwweDY5Q0QsMHg2RUM0LC8qIDB4RTAtMHhFNyAqLworCTB4NkYzMiwweDczMTYsMHg3NjIxLDB4N0E5MywweDgxMzksMHg4MjU5LDB4ODNENiwweDg0QkMsLyogMHhFOC0weEVGICovCisJMHg1MEI1LDB4NTdGMCwweDVCQzAsMHg1QkU4LDB4NUY2OSwweDYzQTEsMHg3ODI2LDB4N0RCNSwvKiAweEYwLTB4RjcgKi8KKwkweDgzREMsMHg4NTIxLDB4OTFDNywweDkxRjUsMHg1MThBLDB4NjdGNSwweDdCNTYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Y0WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OENBQywweDUxQzQsMHg1OUJCLDB4NjBCRCwweDg2NTUsMHg1MDFDLDB4RjlGRiwvKiAweEEwLTB4QTcgKi8KKwkweDUyNTQsMHg1QzNBLDB4NjE3RCwweDYyMUEsMHg2MkQzLDB4NjRGMiwweDY1QTUsMHg2RUNDLC8qIDB4QTgtMHhBRiAqLworCTB4NzYyMCwweDgxMEEsMHg4RTYwLDB4OTY1RiwweDk2QkIsMHg0RURGLDB4NTM0MywweDU1OTgsLyogMHhCMC0weEI3ICovCisJMHg1OTI5LDB4NURERCwweDY0QzUsMHg2Q0M5LDB4NkRGQSwweDczOTQsMHg3QTdGLDB4ODIxQiwvKiAweEI4LTB4QkYgKi8KKwkweDg1QTYsMHg4Q0U0LDB4OEUxMCwweDkwNzcsMHg5MUU3LDB4OTVFMSwweDk2MjEsMHg5N0M2LC8qIDB4QzAtMHhDNyAqLworCTB4NTFGOCwweDU0RjIsMHg1NTg2LDB4NUZCOSwweDY0QTQsMHg2Rjg4LDB4N0RCNCwweDhGMUYsLyogMHhDOC0weENGICovCisJMHg4RjRELDB4OTQzNSwweDUwQzksMHg1QzE2LDB4NkNCRSwweDZERkIsMHg3NTFCLDB4NzdCQiwvKiAweEQwLTB4RDcgKi8KKwkweDdDM0QsMHg3QzY0LDB4OEE3OSwweDhBQzIsMHg1ODFFLDB4NTlCRSwweDVFMTYsMHg2Mzc3LC8qIDB4RDgtMHhERiAqLworCTB4NzI1MiwweDc1OEEsMHg3NzZCLDB4OEFEQywweDhDQkMsMHg4RjEyLDB4NUVGMywweDY2NzQsLyogMHhFMC0weEU3ICovCisJMHg2REY4LDB4ODA3RCwweDgzQzEsMHg4QUNCLDB4OTc1MSwweDlCRDYsMHhGQTAwLDB4NTI0MywvKiAweEU4LTB4RUYgKi8KKwkweDY2RkYsMHg2RDk1LDB4NkVFRiwweDdERTAsMHg4QUU2LDB4OTAyRSwweDkwNUUsMHg5QUQ0LC8qIDB4RjAtMHhGNyAqLworCTB4NTIxRCwweDUyN0YsMHg1NEU4LDB4NjE5NCwweDYyODQsMHg2MkRCLDB4NjhBMiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRjVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg2OTEyLDB4Njk1QSwweDZBMzUsMHg3MDkyLDB4NzEyNiwweDc4NUQsMHg3OTAxLC8qIDB4QTAtMHhBNyAqLworCTB4NzkwRSwweDc5RDIsMHg3QTBELDB4ODA5NiwweDgyNzgsMHg4MkQ1LDB4ODM0OSwweDg1NDksLyogMHhBOC0weEFGICovCisJMHg4QzgyLDB4OEQ4NSwweDkxNjIsMHg5MThCLDB4OTFBRSwweDRGQzMsMHg1NkQxLDB4NzFFRCwvKiAweEIwLTB4QjcgKi8KKwkweDc3RDcsMHg4NzAwLDB4ODlGOCwweDVCRjgsMHg1RkQ2LDB4Njc1MSwweDkwQTgsMHg1M0UyLC8qIDB4QjgtMHhCRiAqLworCTB4NTg1QSwweDVCRjUsMHg2MEE0LDB4NjE4MSwweDY0NjAsMHg3RTNELDB4ODA3MCwweDg1MjUsLyogMHhDMC0weEM3ICovCisJMHg5MjgzLDB4NjRBRSwweDUwQUMsMHg1RDE0LDB4NjcwMCwweDU4OUMsMHg2MkJELDB4NjNBOCwvKiAweEM4LTB4Q0YgKi8KKwkweDY5MEUsMHg2OTc4LDB4NkExRSwweDZFNkIsMHg3NkJBLDB4NzlDQiwweDgyQkIsMHg4NDI5LC8qIDB4RDAtMHhENyAqLworCTB4OEFDRiwweDhEQTgsMHg4RkZELDB4OTExMiwweDkxNEIsMHg5MTlDLDB4OTMxMCwweDkzMTgsLyogMHhEOC0weERGICovCisJMHg5MzlBLDB4OTZEQiwweDlBMzYsMHg5QzBELDB4NEUxMSwweDc1NUMsMHg3OTVELDB4N0FGQSwvKiAweEUwLTB4RTcgKi8KKwkweDdCNTEsMHg3QkM5LDB4N0UyRSwweDg0QzQsMHg4RTU5LDB4OEU3NCwweDhFRjgsMHg5MDEwLC8qIDB4RTgtMHhFRiAqLworCTB4NjYyNSwweDY5M0YsMHg3NDQzLDB4NTFGQSwweDY3MkUsMHg5RURDLDB4NTE0NSwweDVGRTAsLyogMHhGMC0weEY3ICovCisJMHg2Qzk2LDB4ODdGMiwweDg4NUQsMHg4ODc3LDB4NjBCNCwweDgxQjUsMHg4NDAzLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GNlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDhEMDUsMHg1M0Q2LDB4NTQzOSwweDU2MzQsMHg1QTM2LDB4NUMzMSwweDcwOEEsLyogMHhBMC0weEE3ICovCisJMHg3RkUwLDB4ODA1QSwweDgxMDYsMHg4MUVELDB4OERBMywweDkxODksMHg5QTVGLDB4OURGMiwvKiAweEE4LTB4QUYgKi8KKwkweDUwNzQsMHg0RUM0LDB4NTNBMCwweDYwRkIsMHg2RTJDLDB4NUM2NCwweDRGODgsMHg1MDI0LC8qIDB4QjAtMHhCNyAqLworCTB4NTVFNCwweDVDRDksMHg1RTVGLDB4NjA2NSwweDY4OTQsMHg2Q0JCLDB4NkRDNCwweDcxQkUsLyogMHhCOC0weEJGICovCisJMHg3NUQ0LDB4NzVGNCwweDc2NjEsMHg3QTFBLDB4N0E0OSwweDdEQzcsMHg3REZCLDB4N0Y2RSwvKiAweEMwLTB4QzcgKi8KKwkweDgxRjQsMHg4NkE5LDB4OEYxQywweDk2QzksMHg5OUIzLDB4OUY1MiwweDUyNDcsMHg1MkM1LC8qIDB4QzgtMHhDRiAqLworCTB4OThFRCwweDg5QUEsMHg0RTAzLDB4NjdEMiwweDZGMDYsMHg0RkI1LDB4NUJFMiwweDY3OTUsLyogMHhEMC0weEQ3ICovCisJMHg2Qzg4LDB4NkQ3OCwweDc0MUIsMHg3ODI3LDB4OTFERCwweDkzN0MsMHg4N0M0LDB4NzlFNCwvKiAweEQ4LTB4REYgKi8KKwkweDdBMzEsMHg1RkVCLDB4NEVENiwweDU0QTQsMHg1NTNFLDB4NThBRSwweDU5QTUsMHg2MEYwLC8qIDB4RTAtMHhFNyAqLworCTB4NjI1MywweDYyRDYsMHg2NzM2LDB4Njk1NSwweDgyMzUsMHg5NjQwLDB4OTlCMSwweDk5REQsLyogMHhFOC0weEVGICovCisJMHg1MDJDLDB4NTM1MywweDU1NDQsMHg1NzdDLDB4RkEwMSwweDYyNTgsMHhGQTAyLDB4NjRFMiwvKiAweEYwLTB4RjcgKi8KKwkweDY2NkIsMHg2N0RELDB4NkZDMSwweDZGRUYsMHg3NDIyLDB4NzQzOCwweDhBMTcsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Y3WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OTQzOCwweDU0NTEsMHg1NjA2LDB4NTc2NiwweDVGNDgsMHg2MTlBLDB4NkI0RSwvKiAweEEwLTB4QTcgKi8KKwkweDcwNTgsMHg3MEFELDB4N0RCQiwweDhBOTUsMHg1OTZBLDB4ODEyQiwweDYzQTIsMHg3NzA4LC8qIDB4QTgtMHhBRiAqLworCTB4ODAzRCwweDhDQUEsMHg1ODU0LDB4NjQyRCwweDY5QkIsMHg1Qjk1LDB4NUUxMSwweDZFNkYsLyogMHhCMC0weEI3ICovCisJMHhGQTAzLDB4ODU2OSwweDUxNEMsMHg1M0YwLDB4NTkyQSwweDYwMjAsMHg2MTRCLDB4NkI4NiwvKiAweEI4LTB4QkYgKi8KKwkweDZDNzAsMHg2Q0YwLDB4N0IxRSwweDgwQ0UsMHg4MkQ0LDB4OERDNiwweDkwQjAsMHg5OEIxLC8qIDB4QzAtMHhDNyAqLworCTB4RkEwNCwweDY0QzcsMHg2RkE0LDB4NjQ5MSwweDY1MDQsMHg1MTRFLDB4NTQxMCwweDU3MUYsLyogMHhDOC0weENGICovCisJMHg4QTBFLDB4NjE1RiwweDY4NzYsMHhGQTA1LDB4NzVEQiwweDdCNTIsMHg3RDcxLDB4OTAxQSwvKiAweEQwLTB4RDcgKi8KKwkweDU4MDYsMHg2OUNDLDB4ODE3RiwweDg5MkEsMHg5MDAwLDB4OTgzOSwweDUwNzgsMHg1OTU3LC8qIDB4RDgtMHhERiAqLworCTB4NTlBQywweDYyOTUsMHg5MDBGLDB4OUIyQSwweDYxNUQsMHg3Mjc5LDB4OTVENiwweDU3NjEsLyogMHhFMC0weEU3ICovCisJMHg1QTQ2LDB4NURGNCwweDYyOEEsMHg2NEFELDB4NjRGQSwweDY3NzcsMHg2Q0UyLDB4NkQzRSwvKiAweEU4LTB4RUYgKi8KKwkweDcyMkMsMHg3NDM2LDB4NzgzNCwweDdGNzcsMHg4MkFELDB4OEREQiwweDk4MTcsMHg1MjI0LC8qIDB4RjAtMHhGNyAqLworCTB4NTc0MiwweDY3N0YsMHg3MjQ4LDB4NzRFMywweDhDQTksMHg4RkE2LDB4OTIxMSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRjhbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg5NjJBLDB4NTE2QiwweDUzRUQsMHg2MzRDLDB4NEY2OSwweDU1MDQsMHg2MDk2LC8qIDB4QTAtMHhBNyAqLworCTB4NjU1NywweDZDOUIsMHg2RDdGLDB4NzI0QywweDcyRkQsMHg3QTE3LDB4ODk4NywweDhDOUQsLyogMHhBOC0weEFGICovCisJMHg1RjZELDB4NkY4RSwweDcwRjksMHg4MUE4LDB4NjEwRSwweDRGQkYsMHg1MDRGLDB4NjI0MSwvKiAweEIwLTB4QjcgKi8KKwkweDcyNDcsMHg3QkM3LDB4N0RFOCwweDdGRTksMHg5MDRELDB4OTdBRCwweDlBMTksMHg4Q0I2LC8qIDB4QjgtMHhCRiAqLworCTB4NTc2QSwweDVFNzMsMHg2N0IwLDB4ODQwRCwweDhBNTUsMHg1NDIwLDB4NUIxNiwweDVFNjMsLyogMHhDMC0weEM3ICovCisJMHg1RUUyLDB4NUYwQSwweDY1ODMsMHg4MEJBLDB4ODUzRCwweDk1ODksMHg5NjVCLDB4NEY0OCwvKiAweEM4LTB4Q0YgKi8KKwkweDUzMDUsMHg1MzBELDB4NTMwRiwweDU0ODYsMHg1NEZBLDB4NTcwMywweDVFMDMsMHg2MDE2LC8qIDB4RDAtMHhENyAqLworCTB4NjI5QiwweDYyQjEsMHg2MzU1LDB4RkEwNiwweDZDRTEsMHg2RDY2LDB4NzVCMSwweDc4MzIsLyogMHhEOC0weERGICovCisJMHg4MERFLDB4ODEyRiwweDgyREUsMHg4NDYxLDB4ODRCMiwweDg4OEQsMHg4OTEyLDB4OTAwQiwvKiAweEUwLTB4RTcgKi8KKwkweDkyRUEsMHg5OEZELDB4OUI5MSwweDVFNDUsMHg2NkI0LDB4NjZERCwweDcwMTEsMHg3MjA2LC8qIDB4RTgtMHhFRiAqLworCTB4RkEwNywweDRGRjUsMHg1MjdELDB4NUY2QSwweDYxNTMsMHg2NzUzLDB4NkExOSwweDZGMDIsLyogMHhGMC0weEY3ICovCisJMHg3NEUyLDB4Nzk2OCwweDg4NjgsMHg4Qzc5LDB4OThDNywweDk4QzQsMHg5QTQzLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GOVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDU0QzEsMHg3QTFGLDB4Njk1MywweDhBRjcsMHg4QzRBLDB4OThBOCwweDk5QUUsLyogMHhBMC0weEE3ICovCisJMHg1RjdDLDB4NjJBQiwweDc1QjIsMHg3NkFFLDB4ODhBQiwweDkwN0YsMHg5NjQyLDB4NTMzOSwvKiAweEE4LTB4QUYgKi8KKwkweDVGM0MsMHg1RkM1LDB4NkNDQywweDczQ0MsMHg3NTYyLDB4NzU4QiwweDdCNDYsMHg4MkZFLC8qIDB4QjAtMHhCNyAqLworCTB4OTk5RCwweDRFNEYsMHg5MDNDLDB4NEUwQiwweDRGNTUsMHg1M0E2LDB4NTkwRiwweDVFQzgsLyogMHhCOC0weEJGICovCisJMHg2NjMwLDB4NkNCMywweDc0NTUsMHg4Mzc3LDB4ODc2NiwweDhDQzAsMHg5MDUwLDB4OTcxRSwvKiAweEMwLTB4QzcgKi8KKwkweDlDMTUsMHg1OEQxLDB4NUI3OCwweDg2NTAsMHg4QjE0LDB4OURCNCwweDVCRDIsMHg2MDY4LC8qIDB4QzgtMHhDRiAqLworCTB4NjA4RCwweDY1RjEsMHg2QzU3LDB4NkYyMiwweDZGQTMsMHg3MDFBLDB4N0Y1NSwweDdGRjAsLyogMHhEMC0weEQ3ICovCisJMHg5NTkxLDB4OTU5MiwweDk2NTAsMHg5N0QzLDB4NTI3MiwweDhGNDQsMHg1MUZELDB4NTQyQiwvKiAweEQ4LTB4REYgKi8KKwkweDU0QjgsMHg1NTYzLDB4NTU4QSwweDZBQkIsMHg2REI1LDB4N0REOCwweDgyNjYsMHg5MjlDLC8qIDB4RTAtMHhFNyAqLworCTB4OTY3NywweDlFNzksMHg1NDA4LDB4NTRDOCwweDc2RDIsMHg4NkU0LDB4OTVBNCwweDk1RDQsLyogMHhFOC0weEVGICovCisJMHg5NjVDLDB4NEVBMiwweDRGMDksMHg1OUVFLDB4NUFFNiwweDVERjcsMHg2MDUyLDB4NjI5NywvKiAweEYwLTB4RjcgKi8KKwkweDY3NkQsMHg2ODQxLDB4NkM4NiwweDZFMkYsMHg3RjM4LDB4ODA5QiwweDgyMkEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0ZBWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4RkEwOCwweEZBMDksMHg5ODA1LDB4NEVBNSwweDUwNTUsMHg1NEIzLDB4NTc5MywvKiAweEEwLTB4QTcgKi8KKwkweDU5NUEsMHg1QjY5LDB4NUJCMywweDYxQzgsMHg2OTc3LDB4NkQ3NywweDcwMjMsMHg4N0Y5LC8qIDB4QTgtMHhBRiAqLworCTB4ODlFMywweDhBNzIsMHg4QUU3LDB4OTA4MiwweDk5RUQsMHg5QUI4LDB4NTJCRSwweDY4MzgsLyogMHhCMC0weEI3ICovCisJMHg1MDE2LDB4NUU3OCwweDY3NEYsMHg4MzQ3LDB4ODg0QywweDRFQUIsMHg1NDExLDB4NTZBRSwvKiAweEI4LTB4QkYgKi8KKwkweDczRTYsMHg5MTE1LDB4OTdGRiwweDk5MDksMHg5OTU3LDB4OTk5OSwweDU2NTMsMHg1ODlGLC8qIDB4QzAtMHhDNyAqLworCTB4ODY1QiwweDhBMzEsMHg2MUIyLDB4NkFGNiwweDczN0IsMHg4RUQyLDB4NkI0NywweDk2QUEsLyogMHhDOC0weENGICovCisJMHg5QTU3LDB4NTk1NSwweDcyMDAsMHg4RDZCLDB4OTc2OSwweDRGRDQsMHg1Q0Y0LDB4NUYyNiwvKiAweEQwLTB4RDcgKi8KKwkweDYxRjgsMHg2NjVCLDB4NkNFQiwweDcwQUIsMHg3Mzg0LDB4NzNCOSwweDczRkUsMHg3NzI5LC8qIDB4RDgtMHhERiAqLworCTB4Nzc0RCwweDdENDMsMHg3RDYyLDB4N0UyMywweDgyMzcsMHg4ODUyLDB4RkEwQSwweDhDRTIsLyogMHhFMC0weEU3ICovCisJMHg5MjQ5LDB4OTg2RiwweDVCNTEsMHg3QTc0LDB4ODg0MCwweDk4MDEsMHg1QUNDLDB4NEZFMCwvKiAweEU4LTB4RUYgKi8KKwkweDUzNTQsMHg1OTNFLDB4NUNGRCwweDYzM0UsMHg2RDc5LDB4NzJGOSwweDgxMDUsMHg4MTA3LC8qIDB4RjAtMHhGNyAqLworCTB4ODNBMiwweDkyQ0YsMHg5ODMwLDB4NEVBOCwweDUxNDQsMHg1MjExLDB4NTc4QiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRkJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg1RjYyLDB4NkNDMiwweDZFQ0UsMHg3MDA1LDB4NzA1MCwweDcwQUYsMHg3MTkyLC8qIDB4QTAtMHhBNyAqLworCTB4NzNFOSwweDc0NjksMHg4MzRBLDB4ODdBMiwweDg4NjEsMHg5MDA4LDB4OTBBMiwweDkzQTMsLyogMHhBOC0weEFGICovCisJMHg5OUE4LDB4NTE2RSwweDVGNTcsMHg2MEUwLDB4NjE2NywweDY2QjMsMHg4NTU5LDB4OEU0QSwvKiAweEIwLTB4QjcgKi8KKwkweDkxQUYsMHg5NzhCLDB4NEU0RSwweDRFOTIsMHg1NDdDLDB4NThENSwweDU4RkEsMHg1OTdELC8qIDB4QjgtMHhCRiAqLworCTB4NUNCNSwweDVGMjcsMHg2MjM2LDB4NjI0OCwweDY2MEEsMHg2NjY3LDB4NkJFQiwweDZENjksLyogMHhDMC0weEM3ICovCisJMHg2RENGLDB4NkU1NiwweDZFRjgsMHg2Rjk0LDB4NkZFMCwweDZGRTksMHg3MDVELDB4NzJEMCwvKiAweEM4LTB4Q0YgKi8KKwkweDc0MjUsMHg3NDVBLDB4NzRFMCwweDc2OTMsMHg3OTVDLDB4N0NDQSwweDdFMUUsMHg4MEUxLC8qIDB4RDAtMHhENyAqLworCTB4ODJBNiwweDg0NkIsMHg4NEJGLDB4ODY0RSwweDg2NUYsMHg4Nzc0LDB4OEI3NywweDhDNkEsLyogMHhEOC0weERGICovCisJMHg5M0FDLDB4OTgwMCwweDk4NjUsMHg2MEQxLDB4NjIxNiwweDkxNzcsMHg1QTVBLDB4NjYwRiwvKiAweEUwLTB4RTcgKi8KKwkweDZERjcsMHg2RTNFLDB4NzQzRiwweDlCNDIsMHg1RkZELDB4NjBEQSwweDdCMEYsMHg1NEM0LC8qIDB4RTgtMHhFRiAqLworCTB4NUYxOCwweDZDNUUsMHg2Q0QzLDB4NkQyQSwweDcwRDgsMHg3RDA1LDB4ODY3OSwweDhBMEMsLyogMHhGMC0weEY3ICovCisJMHg5RDNCLDB4NTMxNiwweDU0OEMsMHg1QjA1LDB4NkEzQSwweDcwNkIsMHg3NTc1LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GQ1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDc5OEQsMHg3OUJFLDB4ODJCMSwweDgzRUYsMHg4QTcxLDB4OEI0MSwweDhDQTgsLyogMHhBMC0weEE3ICovCisJMHg5Nzc0LDB4RkEwQiwweDY0RjQsMHg2NTJCLDB4NzhCQSwweDc4QkIsMHg3QTZCLDB4NEUzOCwvKiAweEE4LTB4QUYgKi8KKwkweDU1OUEsMHg1OTUwLDB4NUJBNiwweDVFN0IsMHg2MEEzLDB4NjNEQiwweDZCNjEsMHg2NjY1LC8qIDB4QjAtMHhCNyAqLworCTB4Njg1MywweDZFMTksMHg3MTY1LDB4NzRCMCwweDdEMDgsMHg5MDg0LDB4OUE2OSwweDlDMjUsLyogMHhCOC0weEJGICovCisJMHg2RDNCLDB4NkVEMSwweDczM0UsMHg4QzQxLDB4OTVDQSwweDUxRjAsMHg1RTRDLDB4NUZBOCwvKiAweEMwLTB4QzcgKi8KKwkweDYwNEQsMHg2MEY2LDB4NjEzMCwweDYxNEMsMHg2NjQzLDB4NjY0NCwweDY5QTUsMHg2Q0MxLC8qIDB4QzgtMHhDRiAqLworCTB4NkU1RiwweDZFQzksMHg2RjYyLDB4NzE0QywweDc0OUMsMHg3Njg3LDB4N0JDMSwweDdDMjcsLyogMHhEMC0weEQ3ICovCisJMHg4MzUyLDB4ODc1NywweDkwNTEsMHg5NjhELDB4OUVDMywweDUzMkYsMHg1NkRFLDB4NUVGQiwvKiAweEQ4LTB4REYgKi8KKwkweDVGOEEsMHg2MDYyLDB4NjA5NCwweDYxRjcsMHg2NjY2LDB4NjcwMywweDZBOUMsMHg2REVFLC8qIDB4RTAtMHhFNyAqLworCTB4NkZBRSwweDcwNzAsMHg3MzZBLDB4N0U2QSwweDgxQkUsMHg4MzM0LDB4ODZENCwweDhBQTgsLyogMHhFOC0weEVGICovCisJMHg4Q0M0LDB4NTI4MywweDczNzIsMHg1Qjk2LDB4NkE2QiwweDk0MDQsMHg1NEVFLDB4NTY4NiwvKiAweEYwLTB4RjcgKi8KKwkweDVCNUQsMHg2NTQ4LDB4NjU4NSwweDY2QzksMHg2ODlGLDB4NkQ4RCwweDZEQzYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0ZEWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NzIzQiwweDgwQjQsMHg5MTc1LDB4OUE0RCwweDRGQUYsMHg1MDE5LDB4NTM5QSwvKiAweEEwLTB4QTcgKi8KKwkweDU0MEUsMHg1NDNDLDB4NTU4OSwweDU1QzUsMHg1RTNGLDB4NUY4QywweDY3M0QsMHg3MTY2LC8qIDB4QTgtMHhBRiAqLworCTB4NzNERCwweDkwMDUsMHg1MkRCLDB4NTJGMywweDU4NjQsMHg1OENFLDB4NzEwNCwweDcxOEYsLyogMHhCMC0weEI3ICovCisJMHg3MUZCLDB4ODVCMCwweDhBMTMsMHg2Njg4LDB4ODVBOCwweDU1QTcsMHg2Njg0LDB4NzE0QSwvKiAweEI4LTB4QkYgKi8KKwkweDg0MzEsMHg1MzQ5LDB4NTU5OSwweDZCQzEsMHg1RjU5LDB4NUZCRCwweDYzRUUsMHg2Njg5LC8qIDB4QzAtMHhDNyAqLworCTB4NzE0NywweDhBRjEsMHg4RjFELDB4OUVCRSwweDRGMTEsMHg2NDNBLDB4NzBDQiwweDc1NjYsLyogMHhDOC0weENGICovCisJMHg4NjY3LDB4NjA2NCwweDhCNEUsMHg5REY4LDB4NTE0NywweDUxRjYsMHg1MzA4LDB4NkQzNiwvKiAweEQwLTB4RDcgKi8KKwkweDgwRjgsMHg5RUQxLDB4NjYxNSwweDZCMjMsMHg3MDk4LDB4NzVENSwweDU0MDMsMHg1Qzc5LC8qIDB4RDgtMHhERiAqLworCTB4N0QwNywweDhBMTYsMHg2QjIwLDB4NkIzRCwweDZCNDYsMHg1NDM4LDB4NjA3MCwweDZEM0QsLyogMHhFMC0weEU3ICovCisJMHg3RkQ1LDB4ODIwOCwweDUwRDYsMHg1MURFLDB4NTU5QywweDU2NkIsMHg1NkNELDB4NTlFQywvKiAweEU4LTB4RUYgKi8KKwkweDVCMDksMHg1RTBDLDB4NjE5OSwweDYxOTgsMHg2MjMxLDB4NjY1RSwweDY2RTYsMHg3MTk5LC8qIDB4RjAtMHhGNyAqLworCTB4NzFCOSwweDcxQkEsMHg3MkE3LDB4NzlBNywweDdBMDAsMHg3RkIyLDB4OEE3MCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCAqcGFnZV9jaGFyc2V0MnVuaVsyNTZdID0geworCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIGMydV84MSwgYzJ1XzgyLCBjMnVfODMsIGMydV84NCwgYzJ1Xzg1LCBjMnVfODYsIGMydV84NywgCisJYzJ1Xzg4LCBjMnVfODksIGMydV84QSwgYzJ1XzhCLCBjMnVfOEMsIGMydV84RCwgYzJ1XzhFLCBjMnVfOEYsIAorCWMydV85MCwgYzJ1XzkxLCBjMnVfOTIsIGMydV85MywgYzJ1Xzk0LCBjMnVfOTUsIGMydV85NiwgYzJ1Xzk3LCAKKwljMnVfOTgsIGMydV85OSwgYzJ1XzlBLCBjMnVfOUIsIGMydV85QywgYzJ1XzlELCBjMnVfOUUsIGMydV85RiwgCisJYzJ1X0EwLCBjMnVfQTEsIGMydV9BMiwgYzJ1X0EzLCBjMnVfQTQsIGMydV9BNSwgYzJ1X0E2LCBjMnVfQTcsIAorCWMydV9BOCwgYzJ1X0E5LCBjMnVfQUEsIGMydV9BQiwgYzJ1X0FDLCBjMnVfQUQsIGMydV9BRSwgYzJ1X0FGLCAKKwljMnVfQjAsIGMydV9CMSwgYzJ1X0IyLCBjMnVfQjMsIGMydV9CNCwgYzJ1X0I1LCBjMnVfQjYsIGMydV9CNywgCisJYzJ1X0I4LCBjMnVfQjksIGMydV9CQSwgYzJ1X0JCLCBjMnVfQkMsIGMydV9CRCwgYzJ1X0JFLCBjMnVfQkYsIAorCWMydV9DMCwgYzJ1X0MxLCBjMnVfQzIsIGMydV9DMywgYzJ1X0M0LCBjMnVfQzUsIGMydV9DNiwgYzJ1X0M3LCAKKwljMnVfQzgsIE5VTEwsICAgYzJ1X0NBLCBjMnVfQ0IsIGMydV9DQywgYzJ1X0NELCBjMnVfQ0UsIGMydV9DRiwgCisJYzJ1X0QwLCBjMnVfRDEsIGMydV9EMiwgYzJ1X0QzLCBjMnVfRDQsIGMydV9ENSwgYzJ1X0Q2LCBjMnVfRDcsIAorCWMydV9EOCwgYzJ1X0Q5LCBjMnVfREEsIGMydV9EQiwgYzJ1X0RDLCBjMnVfREQsIGMydV9ERSwgYzJ1X0RGLCAKKwljMnVfRTAsIGMydV9FMSwgYzJ1X0UyLCBjMnVfRTMsIGMydV9FNCwgYzJ1X0U1LCBjMnVfRTYsIGMydV9FNywgCisJYzJ1X0U4LCBjMnVfRTksIGMydV9FQSwgYzJ1X0VCLCBjMnVfRUMsIGMydV9FRCwgYzJ1X0VFLCBjMnVfRUYsIAorCWMydV9GMCwgYzJ1X0YxLCBjMnVfRjIsIGMydV9GMywgYzJ1X0Y0LCBjMnVfRjUsIGMydV9GNiwgYzJ1X0Y3LCAKKwljMnVfRjgsIGMydV9GOSwgYzJ1X0ZBLCBjMnVfRkIsIGMydV9GQywgYzJ1X0ZELCBOVUxMLCAgIE5VTEwsICAgCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMDFbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEE5LCAweEEyLCAweEE5LCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweEE0LCAweEE5LCAweEE0LCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEE5LCAweEE1LCAweEE4LCAweEE2LCAweEE5LCAweEE2LCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEE5LCAweEE3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweEE4LCAvKiAweDNDLTB4M0YgKi8KKwkweEE5LCAweEE4LCAweEE4LCAweEE5LCAweEE5LCAweEE5LCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweEE5LCAweEIwLCAweEE4LCAweEFGLCAweEE5LCAweEFGLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweEFCLCAweEE5LCAweEFCLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweEFFLCAweEE5LCAweEFFLCAvKiAweDY0LTB4NjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18wMls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTIsIDB4QTcsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4QTIsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4QTIsIDB4QTgsIDB4QTIsIDB4QUIsIDB4QTIsIDB4QUEsIDB4QTIsIDB4QUQsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4QTIsIDB4QTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzAzWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhBNSwgMHhDMSwgMHhBNSwgMHhDMiwgMHhBNSwgMHhDMywgLyogMHg5MC0weDkzICovCisJMHhBNSwgMHhDNCwgMHhBNSwgMHhDNSwgMHhBNSwgMHhDNiwgMHhBNSwgMHhDNywgLyogMHg5NC0weDk3ICovCisJMHhBNSwgMHhDOCwgMHhBNSwgMHhDOSwgMHhBNSwgMHhDQSwgMHhBNSwgMHhDQiwgLyogMHg5OC0weDlCICovCisJMHhBNSwgMHhDQywgMHhBNSwgMHhDRCwgMHhBNSwgMHhDRSwgMHhBNSwgMHhDRiwgLyogMHg5Qy0weDlGICovCisJMHhBNSwgMHhEMCwgMHhBNSwgMHhEMSwgMHgwMCwgMHgwMCwgMHhBNSwgMHhEMiwgLyogMHhBMC0weEEzICovCisJMHhBNSwgMHhEMywgMHhBNSwgMHhENCwgMHhBNSwgMHhENSwgMHhBNSwgMHhENiwgLyogMHhBNC0weEE3ICovCisJMHhBNSwgMHhENywgMHhBNSwgMHhEOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhBNSwgMHhFMSwgMHhBNSwgMHhFMiwgMHhBNSwgMHhFMywgLyogMHhCMC0weEIzICovCisJMHhBNSwgMHhFNCwgMHhBNSwgMHhFNSwgMHhBNSwgMHhFNiwgMHhBNSwgMHhFNywgLyogMHhCNC0weEI3ICovCisJMHhBNSwgMHhFOCwgMHhBNSwgMHhFOSwgMHhBNSwgMHhFQSwgMHhBNSwgMHhFQiwgLyogMHhCOC0weEJCICovCisJMHhBNSwgMHhFQywgMHhBNSwgMHhFRCwgMHhBNSwgMHhFRSwgMHhBNSwgMHhFRiwgLyogMHhCQy0weEJGICovCisJMHhBNSwgMHhGMCwgMHhBNSwgMHhGMSwgMHgwMCwgMHgwMCwgMHhBNSwgMHhGMiwgLyogMHhDMC0weEMzICovCisJMHhBNSwgMHhGMywgMHhBNSwgMHhGNCwgMHhBNSwgMHhGNSwgMHhBNSwgMHhGNiwgLyogMHhDNC0weEM3ICovCisJMHhBNSwgMHhGNywgMHhBNSwgMHhGOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMDRbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEFDLCAweEE3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEFDLCAweEExLCAweEFDLCAweEEyLCAweEFDLCAweEEzLCAweEFDLCAweEE0LCAvKiAweDEwLTB4MTMgKi8KKwkweEFDLCAweEE1LCAweEFDLCAweEE2LCAweEFDLCAweEE4LCAweEFDLCAweEE5LCAvKiAweDE0LTB4MTcgKi8KKwkweEFDLCAweEFBLCAweEFDLCAweEFCLCAweEFDLCAweEFDLCAweEFDLCAweEFELCAvKiAweDE4LTB4MUIgKi8KKwkweEFDLCAweEFFLCAweEFDLCAweEFGLCAweEFDLCAweEIwLCAweEFDLCAweEIxLCAvKiAweDFDLTB4MUYgKi8KKwkweEFDLCAweEIyLCAweEFDLCAweEIzLCAweEFDLCAweEI0LCAweEFDLCAweEI1LCAvKiAweDIwLTB4MjMgKi8KKwkweEFDLCAweEI2LCAweEFDLCAweEI3LCAweEFDLCAweEI4LCAweEFDLCAweEI5LCAvKiAweDI0LTB4MjcgKi8KKwkweEFDLCAweEJBLCAweEFDLCAweEJCLCAweEFDLCAweEJDLCAweEFDLCAweEJELCAvKiAweDI4LTB4MkIgKi8KKwkweEFDLCAweEJFLCAweEFDLCAweEJGLCAweEFDLCAweEMwLCAweEFDLCAweEMxLCAvKiAweDJDLTB4MkYgKi8KKwkweEFDLCAweEQxLCAweEFDLCAweEQyLCAweEFDLCAweEQzLCAweEFDLCAweEQ0LCAvKiAweDMwLTB4MzMgKi8KKwkweEFDLCAweEQ1LCAweEFDLCAweEQ2LCAweEFDLCAweEQ4LCAweEFDLCAweEQ5LCAvKiAweDM0LTB4MzcgKi8KKwkweEFDLCAweERBLCAweEFDLCAweERCLCAweEFDLCAweERDLCAweEFDLCAweERELCAvKiAweDM4LTB4M0IgKi8KKwkweEFDLCAweERFLCAweEFDLCAweERGLCAweEFDLCAweEUwLCAweEFDLCAweEUxLCAvKiAweDNDLTB4M0YgKi8KKwkweEFDLCAweEUyLCAweEFDLCAweEUzLCAweEFDLCAweEU0LCAweEFDLCAweEU1LCAvKiAweDQwLTB4NDMgKi8KKwkweEFDLCAweEU2LCAweEFDLCAweEU3LCAweEFDLCAweEU4LCAweEFDLCAweEU5LCAvKiAweDQ0LTB4NDcgKi8KKwkweEFDLCAweEVBLCAweEFDLCAweEVCLCAweEFDLCAweEVDLCAweEFDLCAweEVELCAvKiAweDQ4LTB4NEIgKi8KKwkweEFDLCAweEVFLCAweEFDLCAweEVGLCAweEFDLCAweEYwLCAweEFDLCAweEYxLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweEFDLCAweEQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18xMVs1MTJdID0geworCTB4QTQsIDB4QTEsIDB4QTQsIDB4QTIsIDB4QTQsIDB4QTQsIDB4QTQsIDB4QTcsIC8qIDB4MDAtMHgwMyAqLworCTB4QTQsIDB4QTgsIDB4QTQsIDB4QTksIDB4QTQsIDB4QjEsIDB4QTQsIDB4QjIsIC8qIDB4MDQtMHgwNyAqLworCTB4QTQsIDB4QjMsIDB4QTQsIDB4QjUsIDB4QTQsIDB4QjYsIDB4QTQsIDB4QjcsIC8qIDB4MDgtMHgwQiAqLworCTB4QTQsIDB4QjgsIDB4QTQsIDB4QjksIDB4QTQsIDB4QkEsIDB4QTQsIDB4QkIsIC8qIDB4MEMtMHgwRiAqLworCTB4QTQsIDB4QkMsIDB4QTQsIDB4QkQsIDB4QTQsIDB4QkUsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4QTQsIDB4RDUsIDB4QTQsIDB4RDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4REQsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4QTQsIDB4REUsIDB4QTQsIDB4RTEsIDB4QTQsIDB4RTIsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4QTQsIDB4RTMsIDB4QTQsIDB4QjQsIDB4QTQsIDB4RTQsIDB4QTQsIDB4RTUsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4RTYsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4RTcsIDB4MDAsIDB4MDAsIDB4QTQsIDB4RTgsIC8qIDB4MjgtMHgyQiAqLworCTB4QTQsIDB4RTksIDB4QTQsIDB4RUEsIDB4QTQsIDB4RUIsIDB4QTQsIDB4RUMsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4RUQsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4RUUsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4QTQsIDB4QjUsIDB4QTQsIDB4QjYsIDB4QTQsIDB4QjUsIDB4QTQsIDB4QjYsIC8qIDB4M0MtMHgzRiAqLworCTB4QTQsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4RjIsIDB4QTQsIDB4RjMsIDB4QTQsIDB4RjAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4QTQsIDB4QjcsIDB4MDAsIDB4MDAsIDB4QTQsIDB4QjgsIDB4QTQsIDB4QjksIC8qIDB4NEMtMHg0RiAqLworCTB4QTQsIDB4QjgsIDB4QTQsIDB4QjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4QTQsIDB4QkEsIDB4QTQsIDB4QkEsIDB4MDAsIDB4MDAsIDB4QTQsIDB4RjQsIC8qIDB4NTQtMHg1NyAqLworCTB4QTQsIDB4RjUsIDB4QTQsIDB4RjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4RDQsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4QkYsIDB4QTQsIDB4QzAsIDB4QTQsIDB4QzEsIC8qIDB4NjAtMHg2MyAqLworCTB4QTQsIDB4QzIsIDB4QTQsIDB4QzMsIDB4QTQsIDB4QzQsIDB4QTQsIDB4QzUsIC8qIDB4NjQtMHg2NyAqLworCTB4QTQsIDB4QzYsIDB4QTQsIDB4QzcsIDB4QTQsIDB4QzgsIDB4QTQsIDB4QzksIC8qIDB4NjgtMHg2QiAqLworCTB4QTQsIDB4Q0EsIDB4QTQsIDB4Q0IsIDB4QTQsIDB4Q0MsIDB4QTQsIDB4Q0QsIC8qIDB4NkMtMHg2RiAqLworCTB4QTQsIDB4Q0UsIDB4QTQsIDB4Q0YsIDB4QTQsIDB4RDAsIDB4QTQsIDB4RDEsIC8qIDB4NzAtMHg3MyAqLworCTB4QTQsIDB4RDIsIDB4QTQsIDB4RDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4QTQsIDB4RjcsIDB4QTQsIDB4RjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4QTQsIDB4RjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4RkEsIDB4QTQsIDB4RkIsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4QTQsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4RkQsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4RkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4QTQsIDB4QTEsIDB4QTQsIDB4QTIsIDB4QTQsIDB4QTMsIDB4QTQsIDB4QTQsIC8qIDB4QTgtMHhBQiAqLworCTB4QTQsIDB4QTUsIDB4QTQsIDB4QTYsIDB4QTQsIDB4QTcsIDB4QTQsIDB4QTksIC8qIDB4QUMtMHhBRiAqLworCTB4QTQsIDB4QUEsIDB4QTQsIDB4QUIsIDB4QTQsIDB4QUMsIDB4QTQsIDB4QUQsIC8qIDB4QjAtMHhCMyAqLworCTB4QTQsIDB4QUUsIDB4QTQsIDB4QUYsIDB4QTQsIDB4QjAsIDB4QTQsIDB4QjEsIC8qIDB4QjQtMHhCNyAqLworCTB4QTQsIDB4QjIsIDB4QTQsIDB4QjQsIDB4QTQsIDB4QjUsIDB4QTQsIDB4QjYsIC8qIDB4QjgtMHhCQiAqLworCTB4QTQsIDB4QjcsIDB4QTQsIDB4QjgsIDB4QTQsIDB4QkEsIDB4QTQsIDB4QkIsIC8qIDB4QkMtMHhCRiAqLworCTB4QTQsIDB4QkMsIDB4QTQsIDB4QkQsIDB4QTQsIDB4QkUsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4RDYsIDB4QTQsIDB4RDcsIC8qIDB4QzQtMHhDNyAqLworCTB4QTQsIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4QTQsIDB4RDksIDB4MDAsIDB4MDAsIDB4QTQsIDB4REEsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4REIsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4REMsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4REQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4QTQsIDB4REUsIDB4QTQsIDB4REYsIDB4MDAsIDB4MDAsIDB4QTQsIDB4RTAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4RTgsIDB4QTQsIDB4RUEsIC8qIDB4RTQtMHhFNyAqLworCTB4QTQsIDB4RUMsIDB4MDAsIDB4MDAsIDB4QTQsIDB4RUQsIDB4QTQsIDB4RUYsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4RjAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4QTQsIDB4QjcsIDB4QTQsIDB4RjIsIDB4QTQsIDB4RjMsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4QTQsIDB4RjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4RjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzIwWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhBMSwgMHhBRSwgMHhBMSwgMHhBRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhBMSwgMHhCMCwgMHhBMSwgMHhCMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhBMiwgMHhEMywgMHhBMiwgMHhENCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhBNSwgMHhBMSwgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhBMiwgMHhCNiwgMHgwMCwgMHgwMCwgMHhBMSwgMHhDNywgMHhBMSwgMHhDOCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhEOCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhBOSwgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOSwgMHhGQSwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhBOSwgMHhGQiwgMHhBOSwgMHhGQywgMHhBOSwgMHhGRCwgLyogMHg4MC0weDgzICovCisJMHhBOSwgMHhGRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHg1QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMjFbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEM5LCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEEyLCAweEI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE3LCAweEE0LCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEEyLCAweEUwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweEEyLCAweEU1LCAweEEyLCAweEUyLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE3LCAweEQ5LCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweENBLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweEY3LCAvKiAweDUwLTB4NTMgKi8KKwkweEE4LCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweEZCLCAvKiAweDU4LTB4NUIgKi8KKwkweEE4LCAweEZDLCAweEE4LCAweEZELCAweEE4LCAweEZFLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEE1LCAweEIwLCAweEE1LCAweEIxLCAweEE1LCAweEIyLCAweEE1LCAweEIzLCAvKiAweDYwLTB4NjMgKi8KKwkweEE1LCAweEI0LCAweEE1LCAweEI1LCAweEE1LCAweEI2LCAweEE1LCAweEI3LCAvKiAweDY0LTB4NjcgKi8KKwkweEE1LCAweEI4LCAweEE1LCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEE1LCAweEExLCAweEE1LCAweEEyLCAweEE1LCAweEEzLCAweEE1LCAweEE0LCAvKiAweDcwLTB4NzMgKi8KKwkweEE1LCAweEE1LCAweEE1LCAweEE2LCAweEE1LCAweEE3LCAweEE1LCAweEE4LCAvKiAweDc0LTB4NzcgKi8KKwkweEE1LCAweEE5LCAweEE1LCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweEExLCAweEU3LCAweEExLCAweEU4LCAweEExLCAweEU2LCAweEExLCAweEU5LCAvKiAweDkwLTB4OTMgKi8KKwkweEExLCAweEVBLCAweEEyLCAweEQ1LCAweEEyLCAweEQ4LCAweEEyLCAweEQ2LCAvKiAweDk0LTB4OTcgKi8KKwkweEEyLCAweEQ5LCAweEEyLCAweEQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEEyLCAweEExLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEEyLCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18yMls1MTJdID0geworCTB4QTIsIDB4QTMsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RDMsIDB4QTIsIDB4QTQsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RDQsIC8qIDB4MDQtMHgwNyAqLworCTB4QTEsIDB4RjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RjUsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTIsIDB4QjMsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4QTIsIDB4QjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RUUsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4QTEsIDB4RjAsIDB4QTEsIDB4QzQsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4QTEsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4QTEsIDB4QUIsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RkMsIC8qIDB4MjQtMHgyNyAqLworCTB4QTEsIDB4RkQsIDB4QTEsIDB4RkIsIDB4QTEsIDB4RkEsIDB4QTEsIDB4RjIsIC8qIDB4MjgtMHgyQiAqLworCTB4QTEsIDB4RjMsIDB4MDAsIDB4MDAsIDB4QTIsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4QTEsIDB4QzUsIDB4QTEsIDB4RjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4QTEsIDB4QUQsIDB4QTEsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RDYsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4QTEsIDB4QzEsIDB4QTEsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4QTEsIDB4QzIsIDB4QTEsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RUMsIDB4QTEsIDB4RUQsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RjgsIDB4QTEsIDB4RjksIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RjYsIDB4QTEsIDB4RjcsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4QTIsIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4QTEsIDB4RDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzIzWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhEMiwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMjRbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEE4LCAweEU3LCAweEE4LCAweEU4LCAweEE4LCAweEU5LCAweEE4LCAweEVBLCAvKiAweDYwLTB4NjMgKi8KKwkweEE4LCAweEVCLCAweEE4LCAweEVDLCAweEE4LCAweEVELCAweEE4LCAweEVFLCAvKiAweDY0LTB4NjcgKi8KKwkweEE4LCAweEVGLCAweEE4LCAweEYwLCAweEE4LCAweEYxLCAweEE4LCAweEYyLCAvKiAweDY4LTB4NkIgKi8KKwkweEE4LCAweEYzLCAweEE4LCAweEY0LCAweEE4LCAweEY1LCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEE5LCAweEU3LCAweEE5LCAweEU4LCAweEE5LCAweEU5LCAweEE5LCAweEVBLCAvKiAweDc0LTB4NzcgKi8KKwkweEE5LCAweEVCLCAweEE5LCAweEVDLCAweEE5LCAweEVELCAweEE5LCAweEVFLCAvKiAweDc4LTB4N0IgKi8KKwkweEE5LCAweEVGLCAweEE5LCAweEYwLCAweEE5LCAweEYxLCAweEE5LCAweEYyLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEE5LCAweEYzLCAweEE5LCAweEY0LCAweEE5LCAweEY1LCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEE5LCAweENELCAweEE5LCAweENFLCAweEE5LCAweENGLCAweEE5LCAweEQwLCAvKiAweDlDLTB4OUYgKi8KKwkweEE5LCAweEQxLCAweEE5LCAweEQyLCAweEE5LCAweEQzLCAweEE5LCAweEQ0LCAvKiAweEEwLTB4QTMgKi8KKwkweEE5LCAweEQ1LCAweEE5LCAweEQ2LCAweEE5LCAweEQ3LCAweEE5LCAweEQ4LCAvKiAweEE0LTB4QTcgKi8KKwkweEE5LCAweEQ5LCAweEE5LCAweERBLCAweEE5LCAweERCLCAweEE5LCAweERDLCAvKiAweEE4LTB4QUIgKi8KKwkweEE5LCAweERELCAweEE5LCAweERFLCAweEE5LCAweERGLCAweEE5LCAweEUwLCAvKiAweEFDLTB4QUYgKi8KKwkweEE5LCAweEUxLCAweEE5LCAweEUyLCAweEE5LCAweEUzLCAweEE5LCAweEU0LCAvKiAweEIwLTB4QjMgKi8KKwkweEE5LCAweEU1LCAweEE5LCAweEU2LCAweEE4LCAweENELCAweEE4LCAweENFLCAvKiAweEI0LTB4QjcgKi8KKwkweEE4LCAweENGLCAweEE4LCAweEQwLCAweEE4LCAweEQxLCAweEE4LCAweEQyLCAvKiAweEI4LTB4QkIgKi8KKwkweEE4LCAweEQzLCAweEE4LCAweEQ0LCAweEE4LCAweEQ1LCAweEE4LCAweEQ2LCAvKiAweEJDLTB4QkYgKi8KKwkweEE4LCAweEQ3LCAweEE4LCAweEQ4LCAweEE4LCAweEQ5LCAweEE4LCAweERBLCAvKiAweEMwLTB4QzMgKi8KKwkweEE4LCAweERCLCAweEE4LCAweERDLCAweEE4LCAweERELCAweEE4LCAweERFLCAvKiAweEM0LTB4QzcgKi8KKwkweEE4LCAweERGLCAweEE4LCAweEUwLCAweEE4LCAweEUxLCAweEE4LCAweEUyLCAvKiAweEM4LTB4Q0IgKi8KKwkweEE4LCAweEUzLCAweEE4LCAweEU0LCAweEE4LCAweEU1LCAweEE4LCAweEU2LCAvKiAweENDLTB4Q0YgKi8KKwkweEE4LCAweENELCAweEE4LCAweENFLCAweEE4LCAweENGLCAweEE4LCAweEQwLCAvKiAweEQwLTB4RDMgKi8KKwkweEE4LCAweEQxLCAweEE4LCAweEQyLCAweEE4LCAweEQzLCAweEE4LCAweEQ0LCAvKiAweEQ0LTB4RDcgKi8KKwkweEE4LCAweEQ1LCAweEE4LCAweEQ2LCAweEE4LCAweEQ3LCAweEE4LCAweEQ4LCAvKiAweEQ4LTB4REIgKi8KKwkweEE4LCAweEQ5LCAweEE4LCAweERBLCAweEE4LCAweERCLCAweEE4LCAweERDLCAvKiAweERDLTB4REYgKi8KKwkweEE4LCAweERELCAweEE4LCAweERFLCAweEE4LCAweERGLCAweEE4LCAweEUwLCAvKiAweEUwLTB4RTMgKi8KKwkweEE4LCAweEUxLCAweEE4LCAweEUyLCAweEE4LCAweEUzLCAweEE4LCAweEU0LCAvKiAweEU0LTB4RTcgKi8KKwkweEE4LCAweEU1LCAweEE4LCAweEU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18yNVs1MTJdID0geworCTB4QTYsIDB4QTEsIDB4QTYsIDB4QUMsIDB4QTYsIDB4QTIsIDB4QTYsIDB4QUQsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4QTYsIDB4QTMsIDB4QTYsIDB4QzgsIDB4QTYsIDB4QzcsIDB4QTYsIDB4QUUsIC8qIDB4MEMtMHgwRiAqLworCTB4QTYsIDB4QTQsIDB4QTYsIDB4QzIsIDB4QTYsIDB4QzEsIDB4QTYsIDB4QUYsIC8qIDB4MTAtMHgxMyAqLworCTB4QTYsIDB4QTYsIDB4QTYsIDB4QzYsIDB4QTYsIDB4QzUsIDB4QTYsIDB4QjEsIC8qIDB4MTQtMHgxNyAqLworCTB4QTYsIDB4QTUsIDB4QTYsIDB4QzQsIDB4QTYsIDB4QzMsIDB4QTYsIDB4QjAsIC8qIDB4MTgtMHgxQiAqLworCTB4QTYsIDB4QTcsIDB4QTYsIDB4QkMsIDB4QTYsIDB4QzksIDB4QTYsIDB4Q0EsIC8qIDB4MUMtMHgxRiAqLworCTB4QTYsIDB4QjcsIDB4QTYsIDB4Q0IsIDB4QTYsIDB4Q0MsIDB4QTYsIDB4QjIsIC8qIDB4MjAtMHgyMyAqLworCTB4QTYsIDB4QTksIDB4QTYsIDB4QkUsIDB4QTYsIDB4Q0QsIDB4QTYsIDB4Q0UsIC8qIDB4MjQtMHgyNyAqLworCTB4QTYsIDB4QjksIDB4QTYsIDB4Q0YsIDB4QTYsIDB4RDAsIDB4QTYsIDB4QjQsIC8qIDB4MjgtMHgyQiAqLworCTB4QTYsIDB4QTgsIDB4QTYsIDB4RDEsIDB4QTYsIDB4RDIsIDB4QTYsIDB4QjgsIC8qIDB4MkMtMHgyRiAqLworCTB4QTYsIDB4QkQsIDB4QTYsIDB4RDMsIDB4QTYsIDB4RDQsIDB4QTYsIDB4QjMsIC8qIDB4MzAtMHgzMyAqLworCTB4QTYsIDB4QUEsIDB4QTYsIDB4RDUsIDB4QTYsIDB4RDYsIDB4QTYsIDB4QkEsIC8qIDB4MzQtMHgzNyAqLworCTB4QTYsIDB4QkYsIDB4QTYsIDB4RDcsIDB4QTYsIDB4RDgsIDB4QTYsIDB4QjUsIC8qIDB4MzgtMHgzQiAqLworCTB4QTYsIDB4QUIsIDB4QTYsIDB4RDksIDB4QTYsIDB4REEsIDB4QTYsIDB4QkIsIC8qIDB4M0MtMHgzRiAqLworCTB4QTYsIDB4REIsIDB4QTYsIDB4REMsIDB4QTYsIDB4QzAsIDB4QTYsIDB4REQsIC8qIDB4NDAtMHg0MyAqLworCTB4QTYsIDB4REUsIDB4QTYsIDB4REYsIDB4QTYsIDB4RTAsIDB4QTYsIDB4RTEsIC8qIDB4NDQtMHg0NyAqLworCTB4QTYsIDB4RTIsIDB4QTYsIDB4RTMsIDB4QTYsIDB4RTQsIDB4QTYsIDB4QjYsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTIsIDB4QzYsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4QTEsIDB4RTEsIDB4QTEsIDB4RTAsIDB4MDAsIDB4MDAsIDB4QTIsIDB4QzMsIC8qIDB4QTAtMHhBMyAqLworCTB4QTIsIDB4QzcsIDB4QTIsIDB4QzgsIDB4QTIsIDB4Q0IsIDB4QTIsIDB4Q0EsIC8qIDB4QTQtMHhBNyAqLworCTB4QTIsIDB4QzksIDB4QTIsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RTMsIDB4QTEsIDB4RTIsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTIsIDB4QkEsIDB4QTIsIDB4QjksIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4QTEsIDB4RTUsIDB4QTEsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4QTIsIDB4QjgsIDB4QTIsIDB4QjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4REYsIDB4QTEsIDB4REUsIC8qIDB4QzQtMHhDNyAqLworCTB4QTIsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4REIsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4REQsIDB4QTEsIDB4REMsIC8qIDB4Q0MtMHhDRiAqLworCTB4QTIsIDB4QzQsIDB4QTIsIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzI2WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhEQSwgMHhBMSwgMHhEOSwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMiwgMHhDRiwgMHhBMiwgMHhDRSwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhBMiwgMHhEMCwgMHgwMCwgMHgwMCwgMHhBMiwgMHhEMSwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhBMSwgMHhDRiwgMHgwMCwgMHgwMCwgMHhBMSwgMHhDRSwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhBMiwgMHhCQywgMHhBMiwgMHhCRCwgMHgwMCwgMHgwMCwgMHhBMiwgMHhDMCwgLyogMHg2MC0weDYzICovCisJMHhBMiwgMHhCQiwgMHhBMiwgMHhCRSwgMHgwMCwgMHgwMCwgMHhBMiwgMHhCRiwgLyogMHg2NC0weDY3ICovCisJMHhBMiwgMHhDRCwgMHhBMiwgMHhEQiwgMHhBMiwgMHhEQywgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhBMiwgMHhERCwgMHhBMiwgMHhEQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMzBbNTEyXSA9IHsKKwkweEExLCAweEExLCAweEExLCAweEEyLCAweEExLCAweEEzLCAweEExLCAweEE4LCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEExLCAweEI0LCAweEExLCAweEI1LCAweEExLCAweEI2LCAweEExLCAweEI3LCAvKiAweDA4LTB4MEIgKi8KKwkweEExLCAweEI4LCAweEExLCAweEI5LCAweEExLCAweEJBLCAweEExLCAweEJCLCAvKiAweDBDLTB4MEYgKi8KKwkweEExLCAweEJDLCAweEExLCAweEJELCAweDAwLCAweDAwLCAweEExLCAweEVCLCAvKiAweDEwLTB4MTMgKi8KKwkweEExLCAweEIyLCAweEExLCAweEIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweEFBLCAweEExLCAweEFBLCAweEEyLCAweEFBLCAweEEzLCAvKiAweDQwLTB4NDMgKi8KKwkweEFBLCAweEE0LCAweEFBLCAweEE1LCAweEFBLCAweEE2LCAweEFBLCAweEE3LCAvKiAweDQ0LTB4NDcgKi8KKwkweEFBLCAweEE4LCAweEFBLCAweEE5LCAweEFBLCAweEFBLCAweEFBLCAweEFCLCAvKiAweDQ4LTB4NEIgKi8KKwkweEFBLCAweEFDLCAweEFBLCAweEFELCAweEFBLCAweEFFLCAweEFBLCAweEFGLCAvKiAweDRDLTB4NEYgKi8KKwkweEFBLCAweEIwLCAweEFBLCAweEIxLCAweEFBLCAweEIyLCAweEFBLCAweEIzLCAvKiAweDUwLTB4NTMgKi8KKwkweEFBLCAweEI0LCAweEFBLCAweEI1LCAweEFBLCAweEI2LCAweEFBLCAweEI3LCAvKiAweDU0LTB4NTcgKi8KKwkweEFBLCAweEI4LCAweEFBLCAweEI5LCAweEFBLCAweEJBLCAweEFBLCAweEJCLCAvKiAweDU4LTB4NUIgKi8KKwkweEFBLCAweEJDLCAweEFBLCAweEJELCAweEFBLCAweEJFLCAweEFBLCAweEJGLCAvKiAweDVDLTB4NUYgKi8KKwkweEFBLCAweEMwLCAweEFBLCAweEMxLCAweEFBLCAweEMyLCAweEFBLCAweEMzLCAvKiAweDYwLTB4NjMgKi8KKwkweEFBLCAweEM0LCAweEFBLCAweEM1LCAweEFBLCAweEM2LCAweEFBLCAweEM3LCAvKiAweDY0LTB4NjcgKi8KKwkweEFBLCAweEM4LCAweEFBLCAweEM5LCAweEFBLCAweENBLCAweEFBLCAweENCLCAvKiAweDY4LTB4NkIgKi8KKwkweEFBLCAweENDLCAweEFBLCAweENELCAweEFBLCAweENFLCAweEFBLCAweENGLCAvKiAweDZDLTB4NkYgKi8KKwkweEFBLCAweEQwLCAweEFBLCAweEQxLCAweEFBLCAweEQyLCAweEFBLCAweEQzLCAvKiAweDcwLTB4NzMgKi8KKwkweEFBLCAweEQ0LCAweEFBLCAweEQ1LCAweEFBLCAweEQ2LCAweEFBLCAweEQ3LCAvKiAweDc0LTB4NzcgKi8KKwkweEFBLCAweEQ4LCAweEFBLCAweEQ5LCAweEFBLCAweERBLCAweEFBLCAweERCLCAvKiAweDc4LTB4N0IgKi8KKwkweEFBLCAweERDLCAweEFBLCAweERELCAweEFBLCAweERFLCAweEFBLCAweERGLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEFBLCAweEUwLCAweEFBLCAweEUxLCAweEFBLCAweEUyLCAweEFBLCAweEUzLCAvKiAweDgwLTB4ODMgKi8KKwkweEFBLCAweEU0LCAweEFBLCAweEU1LCAweEFBLCAweEU2LCAweEFBLCAweEU3LCAvKiAweDg0LTB4ODcgKi8KKwkweEFBLCAweEU4LCAweEFBLCAweEU5LCAweEFBLCAweEVBLCAweEFBLCAweEVCLCAvKiAweDg4LTB4OEIgKi8KKwkweEFBLCAweEVDLCAweEFBLCAweEVELCAweEFBLCAweEVFLCAweEFBLCAweEVGLCAvKiAweDhDLTB4OEYgKi8KKwkweEFBLCAweEYwLCAweEFBLCAweEYxLCAweEFBLCAweEYyLCAweEFBLCAweEYzLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEFCLCAweEExLCAweEFCLCAweEEyLCAweEFCLCAweEEzLCAvKiAweEEwLTB4QTMgKi8KKwkweEFCLCAweEE0LCAweEFCLCAweEE1LCAweEFCLCAweEE2LCAweEFCLCAweEE3LCAvKiAweEE0LTB4QTcgKi8KKwkweEFCLCAweEE4LCAweEFCLCAweEE5LCAweEFCLCAweEFBLCAweEFCLCAweEFCLCAvKiAweEE4LTB4QUIgKi8KKwkweEFCLCAweEFDLCAweEFCLCAweEFELCAweEFCLCAweEFFLCAweEFCLCAweEFGLCAvKiAweEFDLTB4QUYgKi8KKwkweEFCLCAweEIwLCAweEFCLCAweEIxLCAweEFCLCAweEIyLCAweEFCLCAweEIzLCAvKiAweEIwLTB4QjMgKi8KKwkweEFCLCAweEI0LCAweEFCLCAweEI1LCAweEFCLCAweEI2LCAweEFCLCAweEI3LCAvKiAweEI0LTB4QjcgKi8KKwkweEFCLCAweEI4LCAweEFCLCAweEI5LCAweEFCLCAweEJBLCAweEFCLCAweEJCLCAvKiAweEI4LTB4QkIgKi8KKwkweEFCLCAweEJDLCAweEFCLCAweEJELCAweEFCLCAweEJFLCAweEFCLCAweEJGLCAvKiAweEJDLTB4QkYgKi8KKwkweEFCLCAweEMwLCAweEFCLCAweEMxLCAweEFCLCAweEMyLCAweEFCLCAweEMzLCAvKiAweEMwLTB4QzMgKi8KKwkweEFCLCAweEM0LCAweEFCLCAweEM1LCAweEFCLCAweEM2LCAweEFCLCAweEM3LCAvKiAweEM0LTB4QzcgKi8KKwkweEFCLCAweEM4LCAweEFCLCAweEM5LCAweEFCLCAweENBLCAweEFCLCAweENCLCAvKiAweEM4LTB4Q0IgKi8KKwkweEFCLCAweENDLCAweEFCLCAweENELCAweEFCLCAweENFLCAweEFCLCAweENGLCAvKiAweENDLTB4Q0YgKi8KKwkweEFCLCAweEQwLCAweEFCLCAweEQxLCAweEFCLCAweEQyLCAweEFCLCAweEQzLCAvKiAweEQwLTB4RDMgKi8KKwkweEFCLCAweEQ0LCAweEFCLCAweEQ1LCAweEFCLCAweEQ2LCAweEFCLCAweEQ3LCAvKiAweEQ0LTB4RDcgKi8KKwkweEFCLCAweEQ4LCAweEFCLCAweEQ5LCAweEFCLCAweERBLCAweEFCLCAweERCLCAvKiAweEQ4LTB4REIgKi8KKwkweEFCLCAweERDLCAweEFCLCAweERELCAweEFCLCAweERFLCAweEFCLCAweERGLCAvKiAweERDLTB4REYgKi8KKwkweEFCLCAweEUwLCAweEFCLCAweEUxLCAweEFCLCAweEUyLCAweEFCLCAweEUzLCAvKiAweEUwLTB4RTMgKi8KKwkweEFCLCAweEU0LCAweEFCLCAweEU1LCAweEFCLCAweEU2LCAweEFCLCAweEU3LCAvKiAweEU0LTB4RTcgKi8KKwkweEFCLCAweEU4LCAweEFCLCAweEU5LCAweEFCLCAweEVBLCAweEFCLCAweEVCLCAvKiAweEU4LTB4RUIgKi8KKwkweEFCLCAweEVDLCAweEFCLCAweEVELCAweEFCLCAweEVFLCAweEFCLCAweEVGLCAvKiAweEVDLTB4RUYgKi8KKwkweEFCLCAweEYwLCAweEFCLCAweEYxLCAweEFCLCAweEYyLCAweEFCLCAweEYzLCAvKiAweEYwLTB4RjMgKi8KKwkweEFCLCAweEY0LCAweEFCLCAweEY1LCAweEFCLCAweEY2LCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18zMVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4QTEsIDB4QTQsIDB4QTIsIDB4QTQsIDB4QTMsIC8qIDB4MzAtMHgzMyAqLworCTB4QTQsIDB4QTQsIDB4QTQsIDB4QTUsIDB4QTQsIDB4QTYsIDB4QTQsIDB4QTcsIC8qIDB4MzQtMHgzNyAqLworCTB4QTQsIDB4QTgsIDB4QTQsIDB4QTksIDB4QTQsIDB4QUEsIDB4QTQsIDB4QUIsIC8qIDB4MzgtMHgzQiAqLworCTB4QTQsIDB4QUMsIDB4QTQsIDB4QUQsIDB4QTQsIDB4QUUsIDB4QTQsIDB4QUYsIC8qIDB4M0MtMHgzRiAqLworCTB4QTQsIDB4QjAsIDB4QTQsIDB4QjEsIDB4QTQsIDB4QjIsIDB4QTQsIDB4QjMsIC8qIDB4NDAtMHg0MyAqLworCTB4QTQsIDB4QjQsIDB4QTQsIDB4QjUsIDB4QTQsIDB4QjYsIDB4QTQsIDB4QjcsIC8qIDB4NDQtMHg0NyAqLworCTB4QTQsIDB4QjgsIDB4QTQsIDB4QjksIDB4QTQsIDB4QkEsIDB4QTQsIDB4QkIsIC8qIDB4NDgtMHg0QiAqLworCTB4QTQsIDB4QkMsIDB4QTQsIDB4QkQsIDB4QTQsIDB4QkUsIDB4QTQsIDB4QkYsIC8qIDB4NEMtMHg0RiAqLworCTB4QTQsIDB4QzAsIDB4QTQsIDB4QzEsIDB4QTQsIDB4QzIsIDB4QTQsIDB4QzMsIC8qIDB4NTAtMHg1MyAqLworCTB4QTQsIDB4QzQsIDB4QTQsIDB4QzUsIDB4QTQsIDB4QzYsIDB4QTQsIDB4QzcsIC8qIDB4NTQtMHg1NyAqLworCTB4QTQsIDB4QzgsIDB4QTQsIDB4QzksIDB4QTQsIDB4Q0EsIDB4QTQsIDB4Q0IsIC8qIDB4NTgtMHg1QiAqLworCTB4QTQsIDB4Q0MsIDB4QTQsIDB4Q0QsIDB4QTQsIDB4Q0UsIDB4QTQsIDB4Q0YsIC8qIDB4NUMtMHg1RiAqLworCTB4QTQsIDB4RDAsIDB4QTQsIDB4RDEsIDB4QTQsIDB4RDIsIDB4QTQsIDB4RDMsIC8qIDB4NjAtMHg2MyAqLworCTB4QTQsIDB4RDQsIDB4QTQsIDB4RDUsIDB4QTQsIDB4RDYsIDB4QTQsIDB4RDcsIC8qIDB4NjQtMHg2NyAqLworCTB4QTQsIDB4RDgsIDB4QTQsIDB4RDksIDB4QTQsIDB4REEsIDB4QTQsIDB4REIsIC8qIDB4NjgtMHg2QiAqLworCTB4QTQsIDB4REMsIDB4QTQsIDB4REQsIDB4QTQsIDB4REUsIDB4QTQsIDB4REYsIC8qIDB4NkMtMHg2RiAqLworCTB4QTQsIDB4RTAsIDB4QTQsIDB4RTEsIDB4QTQsIDB4RTIsIDB4QTQsIDB4RTMsIC8qIDB4NzAtMHg3MyAqLworCTB4QTQsIDB4RTQsIDB4QTQsIDB4RTUsIDB4QTQsIDB4RTYsIDB4QTQsIDB4RTcsIC8qIDB4NzQtMHg3NyAqLworCTB4QTQsIDB4RTgsIDB4QTQsIDB4RTksIDB4QTQsIDB4RUEsIDB4QTQsIDB4RUIsIC8qIDB4NzgtMHg3QiAqLworCTB4QTQsIDB4RUMsIDB4QTQsIDB4RUQsIDB4QTQsIDB4RUUsIDB4QTQsIDB4RUYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QTQsIDB4RjAsIDB4QTQsIDB4RjEsIDB4QTQsIDB4RjIsIDB4QTQsIDB4RjMsIC8qIDB4ODAtMHg4MyAqLworCTB4QTQsIDB4RjQsIDB4QTQsIDB4RjUsIDB4QTQsIDB4RjYsIDB4QTQsIDB4RjcsIC8qIDB4ODQtMHg4NyAqLworCTB4QTQsIDB4RjgsIDB4QTQsIDB4RjksIDB4QTQsIDB4RkEsIDB4QTQsIDB4RkIsIC8qIDB4ODgtMHg4QiAqLworCTB4QTQsIDB4RkMsIDB4QTQsIDB4RkQsIDB4QTQsIDB4RkUsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4RTksIDB4RUMsIDB4QTMsIC8qIDB4OTAtMHg5MyAqLworCTB4REYsIDB4QjIsIDB4REUsIDB4Q0MsIDB4REYsIDB4QkUsIDB4RjEsIDB4RTksIC8qIDB4OTQtMHg5NyAqLworCTB4RjksIDB4QkIsIDB4Q0IsIDB4QTMsIDB4RUIsIDB4RTAsIDB4REMsIDB4QjAsIC8qIDB4OTgtMHg5QiAqLworCTB4RUYsIDB4Q0IsIDB4RjQsIDB4QjgsIDB4RjIsIDB4QTIsIDB4RUMsIDB4RDEsIC8qIDB4OUMtMHg5RiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzMyWzUxMl0gPSB7CisJMHhBOSwgMHhCMSwgMHhBOSwgMHhCMiwgMHhBOSwgMHhCMywgMHhBOSwgMHhCNCwgLyogMHgwMC0weDAzICovCisJMHhBOSwgMHhCNSwgMHhBOSwgMHhCNiwgMHhBOSwgMHhCNywgMHhBOSwgMHhCOCwgLyogMHgwNC0weDA3ICovCisJMHhBOSwgMHhCOSwgMHhBOSwgMHhCQSwgMHhBOSwgMHhCQiwgMHhBOSwgMHhCQywgLyogMHgwOC0weDBCICovCisJMHhBOSwgMHhCRCwgMHhBOSwgMHhCRSwgMHhBOSwgMHhCRiwgMHhBOSwgMHhDMCwgLyogMHgwQy0weDBGICovCisJMHhBOSwgMHhDMSwgMHhBOSwgMHhDMiwgMHhBOSwgMHhDMywgMHhBOSwgMHhDNCwgLyogMHgxMC0weDEzICovCisJMHhBOSwgMHhDNSwgMHhBOSwgMHhDNiwgMHhBOSwgMHhDNywgMHhBOSwgMHhDOCwgLyogMHgxNC0weDE3ICovCisJMHhBOSwgMHhDOSwgMHhBOSwgMHhDQSwgMHhBOSwgMHhDQiwgMHhBOSwgMHhDQywgLyogMHgxOC0weDFCICovCisJMHhBMiwgMHhERiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhFQywgMHhFOSwgMHhFQywgMHhBMywgMHhERiwgMHhCMiwgMHhERSwgMHhDQywgLyogMHgyMC0weDIzICovCisJMHhFNywgMHhFOSwgMHhENywgMHhCRiwgMHhGNiwgMHhEMiwgMHhGOCwgMHhBMiwgLyogMHgyNC0weDI3ICovCisJMHhDRSwgMHhGQSwgMHhFNCwgMHhBOCwgMHhFQSwgMHhDNSwgMHhGQiwgMHhGRCwgLyogMHgyOC0weDJCICovCisJMHhFMiwgMHhBOSwgMHhEOSwgMHhDQSwgMHhEMSwgMHhEMSwgMHhGNywgMHhDRiwgLyogMHgyQy0weDJGICovCisJMHhFQywgMHhFRCwgMHhGMSwgMHhCQiwgMHhFQSwgMHhGMywgMHhERSwgMHhFNCwgLyogMHgzMC0weDMzICovCisJMHhEOSwgMHhBMywgMHhGNywgMHhFNSwgMHhFRSwgMHhBRiwgMHhGNSwgMHhFNiwgLyogMHgzNC0weDM3ICovCisJMHhENiwgMHhDQywgMHhEMywgMHhEQiwgMHhGQiwgMHhCQywgMHhGOSwgMHhDQSwgLyogMHgzOC0weDNCICovCisJMHhDQSwgMHhGOCwgMHhEMCwgMHhFQSwgMHhFRCwgMHhDMCwgMHhGQSwgMHhGMCwgLyogMHgzQy0weDNGICovCisJMHhGMCwgMHhBRSwgMHhGRCwgMHhDQywgMHhFRCwgMHhCQiwgMHhGMiwgMHhCOCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhBOCwgMHhCMSwgMHhBOCwgMHhCMiwgMHhBOCwgMHhCMywgMHhBOCwgMHhCNCwgLyogMHg2MC0weDYzICovCisJMHhBOCwgMHhCNSwgMHhBOCwgMHhCNiwgMHhBOCwgMHhCNywgMHhBOCwgMHhCOCwgLyogMHg2NC0weDY3ICovCisJMHhBOCwgMHhCOSwgMHhBOCwgMHhCQSwgMHhBOCwgMHhCQiwgMHhBOCwgMHhCQywgLyogMHg2OC0weDZCICovCisJMHhBOCwgMHhCRCwgMHhBOCwgMHhCRSwgMHhBOCwgMHhCRiwgMHhBOCwgMHhDMCwgLyogMHg2Qy0weDZGICovCisJMHhBOCwgMHhDMSwgMHhBOCwgMHhDMiwgMHhBOCwgMHhDMywgMHhBOCwgMHhDNCwgLyogMHg3MC0weDczICovCisJMHhBOCwgMHhDNSwgMHhBOCwgMHhDNiwgMHhBOCwgMHhDNywgMHhBOCwgMHhDOCwgLyogMHg3NC0weDc3ICovCisJMHhBOCwgMHhDOSwgMHhBOCwgMHhDQSwgMHhBOCwgMHhDQiwgMHhBOCwgMHhDQywgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMiwgMHhERSwgLyogMHg3Qy0weDdGICovCisJCisJMHhFQywgMHhFOSwgMHhFQywgMHhBMywgMHhERiwgMHhCMiwgMHhERSwgMHhDQywgLyogMHg4MC0weDgzICovCisJMHhFNywgMHhFOSwgMHhENywgMHhCRiwgMHhGNiwgMHhEMiwgMHhGOCwgMHhBMiwgLyogMHg4NC0weDg3ICovCisJMHhDRSwgMHhGQSwgMHhFNCwgMHhBOCwgMHhFQSwgMHhDNSwgMHhGQiwgMHhGRCwgLyogMHg4OC0weDhCICovCisJMHhFMiwgMHhBOSwgMHhEOSwgMHhDQSwgMHhEMSwgMHhEMSwgMHhGNywgMHhDRiwgLyogMHg4Qy0weDhGICovCisJMHhFQywgMHhFRCwgMHhGMSwgMHhCQiwgMHhFQSwgMHhGMywgMHhERSwgMHhFNCwgLyogMHg5MC0weDkzICovCisJMHhEOSwgMHhBMywgMHhGNywgMHhFNSwgMHhFRSwgMHhBRiwgMHhGNSwgMHhFNiwgLyogMHg5NC0weDk3ICovCisJMHhENiwgMHhDQywgMHhERCwgMHhGQSwgMHhEMSwgMHhGQiwgMHhEMiwgMHhCMywgLyogMHg5OC0weDlCICovCisJMHhFRSwgMHhFQSwgMHhFOSwgMHhEMCwgMHhFQywgMHhENCwgMHhGMSwgMHhCQywgLyogMHg5Qy0weDlGICovCisJMHhGQSwgMHhBMywgMHhGRCwgMHhDQywgMHhERSwgMHhEMCwgMHhFRiwgMHhFMSwgLyogMHhBMC0weEEzICovCisJMHhERiwgMHhCRSwgMHhGMSwgMHhFOSwgMHhGOSwgMHhCQiwgMHhGMSwgMHhBNywgLyogMHhBNC0weEE3ICovCisJMHhFOSwgMHhEMywgMHhFQywgMHhBMiwgMHhGMCwgMHhGMywgMHhGOSwgMHhDQSwgLyogMHhBOC0weEFCICovCisJMHhDQSwgMHhGOCwgMHhEMCwgMHhFQSwgMHhFRCwgMHhDMCwgMHhGQSwgMHhGMCwgLyogMHhBQy0weEFGICovCisJMHhFNSwgMHhBOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMzNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEE3LCAweEM5LCAweEE3LCAweENBLCAweEE3LCAweENCLCAweEE3LCAweENDLCAvKiAweDgwLTB4ODMgKi8KKwkweEE3LCAweENELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweEE3LCAweEJBLCAweEE3LCAweEJCLCAweEE3LCAweERDLCAweEE3LCAweERELCAvKiAweDg4LTB4OEIgKi8KKwkweEE3LCAweERFLCAweEE3LCAweEI2LCAweEE3LCAweEI3LCAweEE3LCAweEI4LCAvKiAweDhDLTB4OEYgKi8KKwkweEE3LCAweEQ0LCAweEE3LCAweEQ1LCAweEE3LCAweEQ2LCAweEE3LCAweEQ3LCAvKiAweDkwLTB4OTMgKi8KKwkweEE3LCAweEQ4LCAweEE3LCAweEExLCAweEE3LCAweEEyLCAweEE3LCAweEEzLCAvKiAweDk0LTB4OTcgKi8KKwkweEE3LCAweEE1LCAweEE3LCAweEFCLCAweEE3LCAweEFDLCAweEE3LCAweEFELCAvKiAweDk4LTB4OUIgKi8KKwkweEE3LCAweEFFLCAweEE3LCAweEFGLCAweEE3LCAweEIwLCAweEE3LCAweEIxLCAvKiAweDlDLTB4OUYgKi8KKwkweEE3LCAweEIyLCAweEE3LCAweEIzLCAweEE3LCAweEI0LCAweEE3LCAweEE3LCAvKiAweEEwLTB4QTMgKi8KKwkweEE3LCAweEE4LCAweEE3LCAweEE5LCAweEE3LCAweEFBLCAweEE3LCAweEJELCAvKiAweEE0LTB4QTcgKi8KKwkweEE3LCAweEJFLCAweEE3LCAweEU1LCAweEE3LCAweEU2LCAweEE3LCAweEU3LCAvKiAweEE4LTB4QUIgKi8KKwkweEE3LCAweEU4LCAweEE3LCAweEUxLCAweEE3LCAweEUyLCAweEE3LCAweEUzLCAvKiAweEFDLTB4QUYgKi8KKwkweEE3LCAweEJGLCAweEE3LCAweEMwLCAweEE3LCAweEMxLCAweEE3LCAweEMyLCAvKiAweEIwLTB4QjMgKi8KKwkweEE3LCAweEMzLCAweEE3LCAweEM0LCAweEE3LCAweEM1LCAweEE3LCAweEM2LCAvKiAweEI0LTB4QjcgKi8KKwkweEE3LCAweEM3LCAweEE3LCAweEM4LCAweEE3LCAweENFLCAweEE3LCAweENGLCAvKiAweEI4LTB4QkIgKi8KKwkweEE3LCAweEQwLCAweEE3LCAweEQxLCAweEE3LCAweEQyLCAweEE3LCAweEQzLCAvKiAweEJDLTB4QkYgKi8KKwkweEE3LCAweERBLCAweEE3LCAweERCLCAweEEyLCAweEUzLCAweEE3LCAweEVDLCAvKiAweEMwLTB4QzMgKi8KKwkweEE3LCAweEE2LCAweEE3LCAweEUwLCAweEE3LCAweEVGLCAweEEyLCAweEUxLCAvKiAweEM0LTB4QzcgKi8KKwkweEE3LCAweEJDLCAweEE3LCAweEVELCAweEE3LCAweEI1LCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE3LCAweEI5LCAvKiAweENDLTB4Q0YgKi8KKwkweEE3LCAweEVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE3LCAweEVCLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE3LCAweERGLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEEyLCAweEU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE3LCAweEU0LCAvKiAweEQ4LTB4REIgKi8KKwkweEE3LCAweEVFLCAweEE3LCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY180RVs1MTJdID0geworCTB4RUMsIDB4RTksIDB4RUYsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4RjYsIDB4RDIsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4QjIsIC8qIDB4MDQtMHgwNyAqLworCTB4RUQsIDB4REIsIDB4REYsIDB4QjIsIDB4REYsIDB4QkUsIDB4RjksIDB4QkIsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4REMsIDB4RjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4RjMsIDB4QTYsIDB4REQsIDB4RTAsIDB4RTEsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4Q0UsIDB4RjgsIDB4REMsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QUEsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4RjEsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4RkEsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4RkMsIDB4QUYsIDB4RDMsIDB4QTEsIDB4MDAsIDB4MDAsIDB4RjEsIDB4QUIsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RDEsIDB4RDIsIDB4QUMsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4RjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjEsIDB4RkQsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4REUsIDB4QkYsIDB4RkIsIDB4QkEsIDB4RjksIDB4QjksIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4RDIsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4RTMsIDB4QUIsIDB4RUIsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4RkEsIDB4Q0IsIDB4RjcsIDB4RTUsIDB4QTUsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4RTEsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4RTEsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4RTMsIDB4REYsIDB4QUQsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4RUIsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4QUYsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4RjUsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4RTUsIDB4RjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4QzAsIC8qIDB4ODgtMHg4QiAqLworCTB4RUMsIDB4QTMsIDB4MDAsIDB4MDAsIDB4RTksIDB4Q0QsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4RUEsIDB4QTcsIDB4RTksIDB4RjYsIDB4RkIsIDB4QkIsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4RTcsIDB4RTksIDB4RUYsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4RDAsIDB4RTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4QzEsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QUMsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4Q0MsIDB4RjksIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4Q0UsIDB4REYsIDB4RkEsIDB4QTQsIDB4RTYsIDB4QjIsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4RkEsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkEsIDB4QkQsIC8qIDB4QTgtMHhBQiAqLworCTB4Q0MsIDB4QzgsIDB4RUYsIDB4Q0QsIDB4RDUsIDB4RDUsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4QTIsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4RDEsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4RTQsIDB4QTcsIDB4RUMsIDB4RDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RjYsIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4RkIsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4RDEsIDB4Q0IsIDB4QkYsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RUQsIDB4QTgsIDB4REUsIDB4QzIsIDB4RjYsIDB4RTIsIDB4RUQsIDB4REMsIC8qIDB4RDQtMHhENyAqLworCTB4REMsIDB4RjUsIDB4RTAsIDB4QjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4RjQsIDB4QjUsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4REIsIC8qIDB4RTAtMHhFMyAqLworCTB4RDYsIDB4QjUsIDB4RUMsIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4RTQsIDB4RTYsIDB4MDAsIDB4MDAsIDB4RjEsIDB4RUEsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4RUMsIDB4Q0IsIDB4QzAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4RjIsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzRGWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhEMCwgMHhFQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhGOSwgMHhGMiwgMHhFQywgMHhBNSwgMHhEMCwgMHhERiwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHhFQSwgMHhEMCwgMHhFQiwgMHhEQywgMHhEMSwgLyogMHgwQy0weDBGICovCisJMHhEQiwgMHhFOSwgMHhGRCwgMHhDQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhENywgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhEQSwgMHhFMSwgMHgwMCwgMHgwMCwgMHhENiwgMHhCNiwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhFMywgMHhERiwgMHgwMCwgMHgwMCwgMHhERSwgMHhDMywgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhERSwgMHhDNCwgMHhDQSwgMHhBMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhFQywgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhBMywgMHhFRSwgMHhCNywgLyogMHg0NC0weDQ3ICovCisJMHhGOCwgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHhDOCwgMHhFRSwgMHhCOCwgMHhGMSwgMHhBQywgLyogMHg0Qy0weDRGICovCisJMHhGMSwgMHhBNSwgMHhFOSwgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhGOSwgMHhCQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHhGOSwgMHhFQywgMHhFQSwgMHhERCwgMHhENiwgLyogMHg1OC0weDVCICovCisJMHhFRCwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhBNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhCQSwgLyogMHg2Qy0weDZGICovCisJMHhEQiwgMHhEOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhBMiwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHhDRCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhFRCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQywgMHhFQiwgMHhERSwgMHhDNSwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhFMywgMHhFMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhDOSwgLyogMHg4MC0weDgzICovCisJMHhGMiwgMHhFOSwgMHgwMCwgMHgwMCwgMHhENSwgMHhDRSwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhGNiwgMHhCNiwgMHgwMCwgMHgwMCwgMHhDRSwgMHhDMiwgMHhENiwgMHhDNywgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhCNCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhBRCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHhFMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhDMiwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhGMywgMHhBNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRCwgMHhFQSwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHhFQiwgMHhFRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhCMiwgMHhGRCwgMHhBNSwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhENSwgMHhENSwgMHhFMiwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhCNSwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQywgMHhGNSwgMHhGNSwgMHhCNSwgLyogMHhDMC0weEMzICovCisJMHhFNCwgMHhBRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHhFQiwgMHhGMSwgMHhENSwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhCQiwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhCNSwgMHgwMCwgMHgwMCwgMHhDQywgMHhDOSwgLyogMHhEMC0weEQzICovCisJMHhGQSwgMHhENSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhENCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhENiwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHhDMSwgMHgwMCwgMHgwMCwgMHhERSwgMHhDNiwgLyogMHhEQy0weERGICovCisJMHhGQSwgMHhFRiwgMHhFMywgMHhFMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhGMywgMHhEQywgMHhGNiwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhDRSwgMHhGQywgMHgwMCwgMHgwMCwgMHhEQiwgMHhDNCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHhEQywgMHhFNCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhFRiwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTBbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERDLCAweEIxLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEQ2LCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEYzLCAweERBLCAweDAwLCAweDAwLCAweENCLCAweEMxLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweERCLCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEQ5LCAweEZBLCAweEQzLCAweEVFLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweEI4LCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEZELCAweEE2LCAweEVCLCAweEVGLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweEY0LCAweEE2LCAweDAwLCAweDAwLCAweENDLCAweENBLCAweEYzLCAweEE4LCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweEYzLCAweERCLCAweDAwLCAweDAwLCAweERCLCAweEE3LCAvKiAweDIwLTB4MjMgKi8KKwkweEY2LCAweEI3LCAweDAwLCAweDAwLCAweENGLCAweEU2LCAweEYwLCAweEYyLCAvKiAweDI0LTB4MjcgKi8KKwkweENCLCAweERBLCAweDAwLCAweDAwLCAweEU3LCAweEQyLCAweEQ3LCAweEMzLCAvKiAweDI4LTB4MkIgKi8KKwkweEY2LCAweEYwLCAweEU4LCAweERFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEE2LCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEU3LCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEEzLCAvKiAweDQ0LTB4NDcgKi8KKwkweENDLCAweEE3LCAweEVBLCAweEM5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY4LCAweEI2LCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEZBLCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweEFFLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweEVGLCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweENCLCAweEVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEY2LCAweEIwLCAweEVGLCAweENGLCAweEU5LCAweENGLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweEY3LCAweERFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweENFLCAweEQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweERDLCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweERCLCAweEE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweENCLCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweERGLCAweEExLCAweERELCAweEUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweEY1LCAweENBLCAweEU5LCAweEI2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEVDLCAweEVFLCAweEVFLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEYzLCAweEYwLCAweDAwLCAweDAwLCAweERGLCAweEJGLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweENCLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEQwLCAweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweEQyLCAweEUwLCAweEJBLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweEMwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweENFLCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweERDLCAweEQyLCAweEZELCAweEVBLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEY2LCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweENBLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEU5LCAweDAwLCAweDAwLCAweEUzLCAweEFDLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweEYzLCAweEQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweENBLCAweEE0LCAweDAwLCAweDAwLCAweERCLCAweEY4LCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweEM3LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181MVs1MTJdID0geworCTB4RUIsIDB4RjAsIDB4RjEsIDB4RDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RTUsIDB4RTIsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4Q0MsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4RTMsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4QzEsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4RDYsIDB4RUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4RDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4QjksIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4RTMsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4RDMsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4RTUsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4RTgsIDB4QjQsIDB4RUIsIDB4QzMsIDB4MDAsIDB4MDAsIDB4RUEsIDB4QUEsIC8qIDB4NDAtMHg0MyAqLworCTB4RkEsIDB4RkMsIDB4RjUsIDB4RjYsIDB4RjAsIDB4QkMsIDB4RkQsIDB4RDQsIC8qIDB4NDQtMHg0NyAqLworCTB4RTAsIDB4QkIsIDB4Q0UsIDB4QzMsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QkEsIC8qIDB4NDgtMHg0QiAqLworCTB4RjcsIDB4QkEsIDB4RDgsIDB4RjMsIDB4RjcsIDB4Q0QsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QUUsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4RDQsIDB4REYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4RTcsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4RUMsIDB4RkQsIDB4MDAsIDB4MDAsIDB4RDIsIDB4QUUsIC8qIDB4NjQtMHg2NyAqLworCTB4RUUsIDB4RUYsIDB4RDUsIDB4RDcsIDB4RUEsIDB4RTQsIDB4RjgsIDB4QTIsIC8qIDB4NjgtMHg2QiAqLworCTB4Q0QsIDB4RUIsIDB4RDcsIDB4QkYsIDB4RkIsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4Q0QsIDB4RUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4REMsIDB4QjIsIDB4RDAsIDB4RUMsIDB4Q0UsIDB4RkQsIC8qIDB4NzQtMHg3NyAqLworCTB4RUUsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4Q0MsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RDAsIDB4RUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RjcsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjMsIDB4RkMsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4QjMsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4RjQsIDB4MDAsIDB4MDAsIDB4RTksIDB4QjcsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4Q0UsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4RDksIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4RDQsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4QTcsIDB4RDUsIDB4RDIsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4RDYsIDB4QTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RjQsIDB4QTIsIDB4MDAsIDB4MDAsIDB4RjEsIDB4RDcsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4RDgsIDB4MDAsIDB4MDAsIDB4RjAsIDB4QkQsIC8qIDB4QzgtMHhDQiAqLworCTB4RDcsIDB4RDAsIDB4RDQsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4RDcsIDB4Q0YsIDB4RUIsIDB4RUEsIDB4RkQsIDB4RUIsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4RUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4RkMsIDB4QzUsIDB4Q0IsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RDUsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4RjQsIDB4QzgsIDB4RTgsIDB4RUEsIDB4RjUsIDB4RjMsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4RjksIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzUyWzUxMl0gPSB7CisJMHhEMywgMHhFRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQywgMHhEMywgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHhDMiwgMHhFRiwgMHhCNywgLyogMHgwNC0weDA3ICovCisJMHhFNywgMHhENCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhDQSwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhGQiwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhGQSwgMHhGRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhBQSwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhGNCwgMHhGOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHhGNywgMHhGNywgMHhEQywgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhENywgMHhENywgMHhERiwgMHhBMiwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhCRSwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhEMywgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhBNCwgMHhFMSwgMHhFQywgLyogMHgzNC0weDM3ICovCisJMHhDRiwgMHhFNywgMHhGMywgMHhDQiwgMHhFRCwgMHhBOSwgMHhDQSwgMHhCRSwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhFRiwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNiwgMHhDRSwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERSwgMHhGQiwgMHhEMCwgMHhCQiwgLyogMHg0OC0weDRCICovCisJMHhENSwgMHhCNywgMHhFRSwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhGNCwgMHhBOCwgMHgwMCwgMHgwMCwgMHhEQywgMHhGOCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhBNywgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhEQSwgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhFNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhBNSwgMHhFRSwgMHhGMiwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhGOSwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhEQywgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhGMywgMHhEQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhGMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHhGOSwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQywgMHhGMSwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhCQywgLyogMHg4NC0weDg3ICovCisJMHhEQiwgMHhGOSwgMHhENywgMHhCMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhDQiwgMHhGQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhBNSwgMHhDQiwgMHhGRCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhGNCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRCwgMHhFRCwgLyogMHg5Qy0weDlGICovCisJMHhDQSwgMHhBNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhBQiwgLyogMHhBMC0weEEzICovCisJMHhEMCwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhCRSwgMHhEMiwgMHhCRCwgMHhDQywgMHhBNCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQSwgMHhCNiwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhDQywgMHhDRCwgMHgwMCwgMHgwMCwgMHhEQSwgMHhGQSwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhDRiwgMHgwMCwgMHgwMCwgMHhFOSwgMHhCOCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHhGNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhDQywgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhDRCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhENCwgMHhEMSwgMHhFOSwgMHhFRCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhDQSwgMHhFQiwgMHhEOSwgMHhFMiwgMHgwMCwgMHgwMCwgMHhGRCwgMHhCMiwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhBRCwgMHhENiwgMHhDQywgMHhEOSwgMHhCNCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhBNywgMHhFRSwgMHhEMywgLyogMHhFMC0weEUzICovCisJMHhEMCwgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhCMywgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHhENSwgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHhDRiwgMHhFOCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhDMywgMHhEMCwgMHhCMiwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhGRSwgMHhEQSwgMHhBOCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEZELCAweEQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEQxLCAweDAwLCAweDAwLCAweEY4LCAweEQyLCAvKiAweDBDLTB4MEYgKi8KKwkweERDLCAweEQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweERELCAweEUyLCAweEZCLCAweEY5LCAweERELCAweEMxLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweEI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEVELCAweERELCAweENFLCAweEM0LCAweDAwLCAweDAwLCAweENCLCAweEExLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweEUzLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZDLCAweERELCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweEY5LCAweEFGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQyLCAweEZCLCAvKiAweDNDLTB4M0YgKi8KKwkweENGLCAweEExLCAweEU0LCAweEE4LCAweDAwLCAweDAwLCAweEY0LCAweEI2LCAvKiAweDQwLTB4NDMgKi8KKwkweEVDLCAweEZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEFFLCAvKiAweDQ0LTB4NDcgKi8KKwkweEU3LCAweEVELCAweEZELCAweEMxLCAweERBLCAweEUyLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweEQ4LCAweEIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweERELCAweEU0LCAweEYwLCAweEVGLCAweEY2LCAweEYxLCAvKiAweDUwLTB4NTMgKi8KKwkweEZBLCAweEYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQxLCAweEY1LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweENGLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweERDLCAweEQ0LCAweDAwLCAweDAwLCAweERDLCAweEE2LCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEVGLCAweEJGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweENGLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEUwLCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEQ2LCAvKiAweDZDLTB4NkYgKi8KKwkweEVDLCAweEQ0LCAweEVBLCAweENCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweENBLCAweEJGLCAweEQ1LCAweEIwLCAweDAwLCAweDAwLCAweENGLCAweEU5LCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEYxLCAweEVELCAweDAwLCAweDAwLCAweENDLCAweENGLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEU0LCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEVELCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweEQ3LCAweEQ4LCAweDAwLCAweDAwLCAweEZELCAweEE3LCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweEFCLCAvKiAweDlDLTB4OUYgKi8KKwkweEY2LCAweEIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweENGLCAweEYwLCAweEY5LCAweEJELCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENCLCAweERCLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYzLCAweEQxLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweEU5LCAweEQxLCAweEYzLCAweEE5LCAweEQwLCAweEUwLCAweEU5LCAweEQyLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweERBLCAweEUzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEUyLCAweEQyLCAweDAwLCAweDAwLCAweEY2LCAweEEyLCAweEUxLCAweEY0LCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweEU0LCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweEQ1LCAweEY1LCAweEJGLCAweENGLCAweEEyLCAvKiAweEUwLTB4RTMgKi8KKwkweENELCAweEFGLCAweENGLCAweEEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweENELCAweEIwLCAweEYxLCAweEZFLCAweEQwLCAweEEzLCAvKiAweEU4LTB4RUIgKi8KKwkweEUxLCAweEFGLCAweEY4LCAweEEzLCAweDAwLCAweDAwLCAweENBLCAweEE2LCAvKiAweEVDLTB4RUYgKi8KKwkweEY3LCAweEJCLCAweEYyLCAweEVBLCAweERFLCAweEM4LCAweEU5LCAweEQzLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweERFLCAweEM5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181NFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4REUsIC8qIDB4MDAtMHgwMyAqLworCTB4Q0EsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4RjksIDB4RUEsIDB4RDEsIDB4Q0UsIDB4RUUsIDB4RDQsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4RDQsIDB4RDIsIDB4RDksIDB4QTMsIDB4RkQsIDB4QTgsIDB4RDcsIDB4RDksIC8qIDB4MEMtMHgwRiAqLworCTB4RjcsIDB4Q0UsIDB4RkEsIDB4QkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4RDYsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4RjAsIDB4MDAsIDB4MDAsIDB4RUIsIDB4RTEsIC8qIDB4MUMtMHgxRiAqLworCTB4RjgsIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4RkEsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4REQsIDB4QzMsIDB4MDAsIDB4MDAsIDB4RjksIDB4REYsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RUYsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4RkQsIDB4RTUsIDB4RjYsIDB4QTMsIDB4MDAsIDB4MDAsIDB4RDksIDB4RkMsIC8qIDB4MzgtMHgzQiAqLworCTB4RkQsIDB4QTksIDB4MDAsIDB4MDAsIDB4RTcsIDB4RUUsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4RTUsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RUYsIDB4RDAsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4RjcsIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4RjEsIDB4QjIsIDB4MDAsIDB4MDAsIDB4RjEsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4Q0QsIDB4QjIsIDB4MDAsIDB4MDAsIDB4REEsIDB4QUIsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4Q0EsIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RTIsIC8qIDB4NzgtMHg3QiAqLworCTB4RkIsIDB4QkMsIDB4RDksIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RUUsIDB4QkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4RDMsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4RkIsIDB4RkEsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4QTQsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4REMsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4RjYsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4RUQsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4QTEsIC8qIDB4QTgtMHhBQiAqLworCTB4Q0UsIDB4RTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkEsIDB4QTYsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4RjksIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4RUMsIDB4RDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4RTQsIDB4RUUsIDB4RjksIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RkIsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4RjksIDB4RUIsIDB4RUUsIDB4QTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4QUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4Q0EsIDB4QTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4RjQsIDB4RkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4Q0QsIDB4RDYsIDB4RkMsIDB4RjYsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4QzksIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4RDQsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzU1WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhGOCwgMHhBNiwgMHgwMCwgMHgwMCwgMHhERSwgMHhDQSwgMHhGMiwgMHhDNiwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhEQSwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhEMywgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhEOCwgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhFNiwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHhGMywgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhEQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNiwgMHhFNCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhGNiwgMHhGMiwgMHgwMCwgMHgwMCwgMHhERiwgMHhDMiwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhGRCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQywgMHhGNiwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhCQSwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhBRiwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhFMSwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhGMCwgMHhBNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhDQiwgMHhEMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhFMCwgMHhCQywgMHgwMCwgMHgwMCwgMHhGNCwgMHhDQSwgMHhENCwgMHhGQSwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhGRCwgMHhBQSwgMHhGOSwgMHhFMiwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhGNCwgMHhCNywgMHhGRCwgMHhDMiwgMHhGQywgMHhCMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhGRCwgMHhFQywgMHhDQSwgMHhFMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhCRCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHhFNywgMHhERiwgMHhDMywgMHhEMSwgMHhEMiwgLyogMHhBOC0weEFCICovCisJMHhDRSwgMHhFMiwgMHgwMCwgMHgwMCwgMHhEMywgMHhBNCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhGRCwgMHhBQiwgMHgwMCwgMHgwMCwgMHhERiwgMHhFMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhGMiwgMHhDNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhGMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhEMCwgMHhFRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHhBQSwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERSwgMHhDQiwgLyogMHhFMC0weEUzICovCisJMHhGNiwgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhGNSwgMHhGMSwgMHhCMywgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTZbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY3LCAweEEzLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweENBLCAweEE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweENGLCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweEM0LCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEIwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweEJGLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweEY2LCAweEE0LCAweDAwLCAweDAwLCAweEUzLCAweEI2LCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweEM2LCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEQwLCAweEVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEVELCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweERELCAweEM0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZDLCAweEY3LCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEJGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweERFLCAweEFELCAweDAwLCAweDAwLCAweEZBLCAweEJGLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweEU1LCAweEYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweEVELCAweEM0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQyLCAweEE1LCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweEZELCAweEVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEY1LCAweEI2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEY2LCAweERFLCAweENDLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZDLCAweERFLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweEVDLCAweEQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweENELCAweERELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEQ2LCAweEI3LCAweENELCAweEIzLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181N1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4RDUsIC8qIDB4MDAtMHgwMyAqLworCTB4RTUsIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4Q0YsIDB4RUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4RDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4QUUsIDB4RUEsIDB4QUQsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4RDMsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjcsIDB4Q0YsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4RUUsIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4RDAsIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RjIsIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4RjAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4RjIsIDB4QTMsIDB4MDAsIDB4MDAsIDB4RjcsIDB4RjgsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QjMsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4QTksIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4RDMsIDB4QkIsIDB4Q0EsIDB4RUMsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4RjEsIDB4QTYsIDB4Q0IsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4RjcsIDB4RTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4Q0QsIDB4REUsIDB4MDAsIDB4MDAsIDB4RjcsIDB4QTQsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4QzAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4REQsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4Q0MsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4Q0YsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4RjYsIDB4RjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4RjcsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4RDMsIDB4REMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkEsIDB4RkUsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkEsIDB4QTcsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4RUIsIDB4RDksIDB4MDAsIDB4MDAsIDB4Q0YsIDB4QTcsIDB4RUEsIDB4QUYsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4RUYsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4QjksIC8qIDB4QzQtMHhDNyAqLworCTB4RjEsIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4RDgsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RjIsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4QjQsIC8qIDB4REMtMHhERiAqLworCTB4REMsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4RjMsIDB4RjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RTMsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4RkIsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4QzYsIDB4RDAsIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4RDAsIDB4RjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzU4WzUxMl0gPSB7CisJMHhDRiwgMHhEQywgMHgwMCwgMHgwMCwgMHhEMywgMHhEMSwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhDQywgMHhCMSwgMHhGNywgMHhEOCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhDQiwgMHhBOCwgMHhFQiwgMHhCQywgMHhFNCwgMHhCRSwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhEQywgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHhGMCwgMHhBNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhDMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhFRCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhFQiwgLyogMHgyQy0weDJGICovCisJMHhFNSwgMHhFOCwgMHhEQywgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhFRCwgMHhERSwgMHhEMywgMHhGMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQywgMHhGNywgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhENCwgMHhFNywgMHhBQiwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhDMywgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhCMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhGNywgMHhCMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhGMywgLyogMHg1NC0weDU3ICovCisJMHhEMywgMHhEMiwgMHgwMCwgMHgwMCwgMHhGNSwgMHhDMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERiwgMHhERCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhGMywgMHhFNywgMHhGMSwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhGRCwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhGMiwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhGMywgMHhEMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhFRSwgMHhGNCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhEMywgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQywgMHhEMSwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHhFQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhCQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhENywgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhGNSwgMHhDRCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhGMiwgMHhGQSwgMHhDNywgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhEOSwgMHhGOCwgMHhENCwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNiwgMHhFNSwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHhDNSwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhGMiwgMHhFRCwgMHhERiwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhDQiwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhEQiwgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhCNSwgMHgwMCwgMHgwMCwgMHhEMywgMHhBNiwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhCNSwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhGOSwgMHhDOSwgMHgwMCwgMHgwMCwgMHhFNCwgMHhFMiwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhGQiwgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhENywgMHhBNCwgMHhDRSwgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhENSwgMHhENiwgMHhFNiwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHhFNSwgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERSwgMHhDRCwgLyogMHhFOC0weEVCICovCisJMHhFQywgMHhGMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhFMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhFQywgMHhFQywgMHhGQiwgMHhCRSwgMHhERiwgMHhFQiwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhGOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTlbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LCAweEJFLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweEQwLCAweEYzLCAweEUwLCAweEFBLCAweEU4LCAweEUyLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEQ0LCAweEQyLCAweEZELCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweEU1LCAweEE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEQzLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweERFLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweEI4LCAweEY3LCAweEJDLCAweERDLCAweEZELCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEVDLCAweEU0LCAweEU3LCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEE4LCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweEYxLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEU1LCAweEYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEY0LCAvKiAweDQ0LTB4NDcgKi8KKwkweEQyLCAweEFGLCAweERDLCAweEU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEE1LCAweEYxLCAweEI0LCAvKiAweDRDLTB4NEYgKi8KKwkweEZDLCAweEIxLCAweENDLCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweERELCAweEM2LCAweEZBLCAweEQxLCAweDAwLCAweDAwLCAweEY3LCAweERGLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweEE4LCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEVFLCAweEY1LCAweDAwLCAweDAwLCAweERFLCAweENFLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEYzLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY3LCAweEFDLCAweEVCLCAweEM0LCAvKiAweDY4LTB4NkIgKi8KKwkweEVELCAweEUxLCAweEUwLCAweEFCLCAweERELCAweEM3LCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQyLCAweEIzLCAvKiAweDcwLTB4NzMgKi8KKwkweEQyLCAweEJGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweENBLCAweENDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEZCLCAweEJGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEZELCAweERELCAweEU1LCAvKiAweDgwLTB4ODMgKi8KKwkweEQ4LCAweENELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEY0LCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEY1LCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEVELCAweEQwLCAweEQyLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweEQ5LCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweERCLCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweEY3LCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEQ4LCAweEQ5LCAweDAwLCAweDAwLCAweEY0LCAweEEzLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweERELCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEQxLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEI1LCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEVELCAweEFCLCAweDAwLCAweDAwLCAweEUzLCAweEI3LCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweEVFLCAweEJCLCAweENELCAweEI0LCAweDAwLCAweDAwLCAweEUwLCAweEYzLCAvKiAweEQwLTB4RDMgKi8KKwkweEVBLCAweENELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweEVDLCAweEY1LCAweEU4LCAweEVFLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweENCLCAweEE5LCAweEYxLCAweEFGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweENELCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEVDLCAweEE5LCAweDAwLCAweDAwLCAweEYyLCAweEVCLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweEZELCAweEVGLCAweDAwLCAweDAwLCAweEY5LCAweEYzLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEU2LCAweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEQ4LCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEFDLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181QVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4RUEsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4RTgsIDB4REYsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4REUsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4RDIsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RjQsIC8qIDB4MTgtMHgxQiAqLworCTB4RDEsIDB4RDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4QzIsIC8qIDB4MUMtMHgxRiAqLworCTB4RTMsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjYsIDB4QTUsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4RjMsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjcsIDB4RTgsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4QzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkIsIDB4RTYsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4RTYsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4RkUsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4REEsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4QUMsIDB4RUEsIDB4QjAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4RTMsIDB4QjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4Q0EsIDB4QUEsIDB4RTEsIDB4RjksIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RUEsIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4RUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4RkEsIDB4RUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4RjQsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4RDIsIDB4RUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzVCWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhGQiwgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhGRCwgMHhGMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhCRCwgLyogMHgwOC0weDBCICovCisJMHhDRSwgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhDNiwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERSwgMHhBRSwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhERiwgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhCRSwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhFRCwgMHhBRCwgMHhGQSwgMHhFQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhDRCwgMHhFRSwgMHhFRCwgMHhBNiwgMHgwMCwgMHgwMCwgMHhFRCwgMHhBRSwgLyogMHg1NC0weDU3ICovCisJMHhGMCwgMHhFRCwgMHgwMCwgMHgwMCwgMHhERCwgMHhBMSwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHhFRCwgMHhBRiwgMHhGQywgMHhGOCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhFQiwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQywgMHhGOSwgLyogMHg2MC0weDYzICovCisJMHhDRCwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhGQSwgMHhBOSwgMHgwMCwgMHgwMCwgMHhFMSwgMHhERCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhFMiwgMHhENSwgMHhFRCwgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhERCwgMHhBMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHhGOSwgMHhDQSwgMHgwMCwgMHgwMCwgMHhFQSwgMHhFOCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhFNSwgMHhFRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHhEMywgMHhFQiwgMHgwMCwgMHgwMCwgMHhFOSwgMHhENCwgLyogMHg4NC0weDg3ICovCisJMHhFMSwgMHhGQSwgMHhFNCwgMHhDQywgMHgwMCwgMHgwMCwgMHhFMSwgMHhFNCwgLyogMHg4OC0weDhCICovCisJMHhFOCwgMHhDNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhEQiwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhENSwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhGNywgMHhCNSwgMHhGQywgMHhGMywgMHhGMCwgMHhGMywgLyogMHg5NC0weDk3ICovCisJMHhDRSwgMHhBRiwgMHhGMSwgMHhCNSwgMHhFRiwgMHhEMiwgMHhFOCwgMHhDOCwgLyogMHg5OC0weDlCICovCisJMHhFQiwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhENCwgMHhFMCwgMHhCRSwgLyogMHhBMC0weEEzICovCisJMHhFMywgMHhGOCwgMHhFQSwgMHhFOSwgMHhGQywgMHhCMiwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhFMCwgMHhGNCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhFMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhFRSwgMHhBNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQSwgMHhBQSwgLyogMHhCMC0weEIzICovCisJMHhFNiwgMHhDMywgMHhFMSwgMHhCMiwgMHhDQSwgMHhBQiwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhFMywgMHhFNCwgMHhFOSwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhENiwgLyogMHhCQy0weEJGICovCisJMHhGMywgMHhGMiwgMHgwMCwgMHgwMCwgMHhFRSwgMHhENiwgMHhFQSwgMHhCMiwgLyogMHhDMC0weEMzICovCisJMHhEMCwgMHhGNiwgMHhFQywgMHhEOSwgMHhEQSwgMHhDQiwgMHhDRiwgMHhBOCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHhERCwgMHhBMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHhEOCwgMHhEQiwgMHgwMCwgMHgwMCwgMHhGOSwgMHhDRSwgMHhFOSwgMHhENSwgLyogMHhEMC0weEQzICovCisJMHhFMywgMHhEMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMiwgMHhCQywgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhBQywgMHhGMywgMHhDQywgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhGQiwgMHhGNiwgMHhENiwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHhFNywgMHhGNSwgMHhFOCwgMHhFRiwgMHhFMywgMHhGOSwgMHhEMiwgMHhCQiwgLyogMHhFNC0weEU3ICovCisJMHhGMywgMHhGMywgMHhFMywgMHhGQiwgMHgwMCwgMHgwMCwgMHhERSwgMHhEMCwgLyogMHhFOC0weEVCICovCisJMHhDRSwgMHhCMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhGNywgMHhGMSwgMHhEOSwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhDMSwgMHhEQywgMHhDNCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHhGNSwgMHhCQiwgMHgwMCwgMHgwMCwgMHhERSwgMHhEMSwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNUNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweERDLCAweEU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweERFLCAweEQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEUyLCAvKiAweDA0LTB4MDcgKi8KKwkweEVFLCAweEY2LCAweEVBLCAweENGLCAweEYwLCAweEVFLCAweEUzLCAweEZDLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEQzLCAweERGLCAweEQzLCAweEY0LCAweEUxLCAweEIzLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweEQzLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweERGLCAweEM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweEU5LCAweEQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweERCLCAweEFCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEUzLCAweEI5LCAweEVCLCAweEM1LCAweEY0LCAweEE5LCAweENELCAweEI2LCAvKiAweDM4LTB4M0IgKi8KKwkweEQyLCAweEY5LCAweDAwLCAweDAwLCAweERBLCAweEFELCAweEQyLCAweEUzLCAvKiAweDNDLTB4M0YgKi8KKwkweENGLCAweEQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweENCLCAweERDLCAweENDLCAweEZBLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweENGLCAweERELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEE5LCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweEJCLCAweEUzLCAweEJBLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweERBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERDLCAweEIzLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEQzLCAweEY1LCAweDAwLCAweDAwLCAweEQ3LCAweEE2LCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEY2LCAweEI1LCAweEQ3LCAweERCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEUxLCAweEQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweEVBLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweERGLCAweEEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEZELCAweERGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweEQwLCAweEY3LCAweEVELCAweEQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweENCLCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweERCLCAweDAwLCAweDAwLCAweEUxLCAweEZCLCAvKiAweEE4LTB4QUIgKi8KKwkweENCLCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEQzLCAweEUwLCAweDAwLCAweDAwLCAweEU0LCAweEJGLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEZCLCAweEMwLCAweDAwLCAweDAwLCAweERBLCAweEJFLCAvKiAweEI0LTB4QjcgKi8KKwkweEU0LCAweENELCAweDAwLCAweDAwLCAweEQ2LCAweEI5LCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEMwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweEUxLCAweEZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweERGLCAweEM3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEU0LCAweEIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERDLCAweEU3LCAvKiAweEVDLTB4RUYgKi8KKwkweERDLCAweEU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEZBLCAweEQ2LCAweDAwLCAweDAwLCAweEQzLCAweEY2LCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweERBLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEZBLCAweEYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181RFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RkQsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4Q0YsIDB4RDAsIDB4RjgsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4Q0QsIDB4REYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4RjUsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4RTQsIDB4RjAsIDB4Q0IsIDB4QUIsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RkUsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4REQsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4QUUsIC8qIDB4NDgtMHg0QiAqLworCTB4Q0EsIDB4RUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4RDUsIDB4QjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4RTgsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjMsIDB4QUIsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4QTksIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4RjcsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4RjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4Q0UsIDB4RTQsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RjIsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RjUsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4RTcsIDB4QUUsIDB4MDAsIDB4MDAsIDB4RDYsIDB4QkEsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4REYsIDB4RUMsIDB4RTQsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4QjUsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4REMsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4RjQsIDB4QjksIDB4RjEsIDB4QjYsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4REUsIDB4RTEsIDB4QjUsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4Q0QsIDB4RUYsIDB4RjEsIDB4QTcsIDB4Q0UsIDB4RTUsIC8qIDB4RTQtMHhFNyAqLworCTB4Q0IsIDB4REQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4RTMsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjMsIDB4QUMsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4RDAsIDB4RjksIDB4RUMsIDB4QUIsIDB4REUsIDB4RDMsIC8qIDB4RjAtMHhGMyAqLworCTB4RjcsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4RjUsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4REUsIDB4Q0IsIDB4RUUsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzVFWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhCQywgMHhGOCwgMHhENiwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhFRSwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhGRCwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhGNywgMHhCNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhERSwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhGMiwgMHhFRCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhEOSwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhBOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhGRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERSwgMHhENCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhFMywgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhFMSwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhERiwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhEOSwgMHhCNiwgMHgwMCwgMHgwMCwgMHhGRCwgMHhBQywgLyogMHgzQy0weDNGICovCisJMHhFRiwgMHhEMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhFNCwgMHhDMSwgMHhGOCwgMHhFQiwgMHgwMCwgMHgwMCwgMHhEQiwgMHhBQywgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhGQywgMHhDNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHhBRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNiwgMHhCQSwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhEQiwgMHhERiwgMHhEMywgMHhEMywgMHhGOCwgMHhDNywgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhDRSwgMHhGOCwgMHhDMSwgLyogMHg3MC0weDczICovCisJMHhEMiwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhCNCwgLyogMHg3NC0weDc3ICovCisJMHhGQSwgMHhCOSwgMHhDQSwgMHhDRiwgMHgwMCwgMHgwMCwgMHhGQywgMHhCMywgLyogMHg3OC0weDdCICovCisJMHhFQSwgMHhFQSwgMHhFQSwgMHhFQiwgMHhEMCwgMHhGQSwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhFRCwgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHhFNywgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERiwgMHhDOSwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERiwgMHhFRCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhCQywgMHgwMCwgMHgwMCwgMHhFRiwgMHhDMSwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQywgMHhEMiwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhERCwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhERiwgMHhDQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhGOCwgMHhGMSwgMHhBOCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRCwgMHhCNywgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHhFRiwgMHhENCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhERCwgMHhERiwgMHhFRSwgMHhDQiwgMHhBQywgLyogMHhCNC0weEI3ICovCisJMHhFOSwgMHhCQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhFQywgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERiwgMHhDQiwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHhGOSwgMHhCRiwgMHhENiwgMHhBRiwgMHhENSwgMHhDNiwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHhDRiwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhBOSwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhGOCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhCNywgMHhFRSwgMHhGOCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhEOSwgLyogMHhEQy0weERGICovCisJMHhGMywgMHhERiwgMHgwMCwgMHgwMCwgMHhGOCwgMHhDOCwgMHhDRSwgMHhDNiwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHhENSwgMHhFNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhFNiwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhDNSwgMHhFRiwgMHhENSwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhFRiwgMHhGQywgMHhERiwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNUZbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweERDLCAweEE3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEQ2LCAweEU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY4LCAweEM5LCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEQyLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweEJELCAweDAwLCAweDAwLCAweENGLCAweEUxLCAvKiAweDEwLTB4MTMgKi8KKwkweEYwLCAweEMwLCAweEVDLCAweERBLCAweDAwLCAweDAwLCAweERELCAweEQ3LCAvKiAweDE0LTB4MTcgKi8KKwkweEZCLCAweEYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEFDLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweEE5LCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweEQ3LCAweEZCLCAweEMxLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEQyLCAweEMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEVELCAweEU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENCLCAweEFELCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweEY5LCAweEIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEY3LCAweEE1LCAweDAwLCAweDAwLCAweENCLCAweEFFLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweERBLCAweEFGLCAweDAwLCAweDAwLCAweEQ4LCAweEI2LCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEE3LCAweEZCLCAweEIyLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEZELCAweEM0LCAweDAwLCAweDAwLCAweEVDLCAweEFELCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZCLCAweEExLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEU5LCAweEU5LCAweEVFLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEYzLCAweEY0LCAweEY4LCAweEYzLCAweEYwLCAweEMxLCAvKiAweDY4LTB4NkIgKi8KKwkweERFLCAweEFGLCAweEY4LCAweEIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEYzLCAweEUwLCAweEU3LCAweEFGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERCLCAweEFELCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEY5LCAweEE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweEQ4LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEU4LCAweEQ5LCAweEVGLCAweEQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweEQzLCAweEUyLCAweDAwLCAweDAwLCAweEUyLCAweERGLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZDLCAweEUwLCAweEQ3LCAweEM4LCAvKiAweDg4LTB4OEIgKi8KKwkweEZELCAweEFELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweERGLCAweEVGLCAweENDLCAweEQzLCAweEQzLCAweEY5LCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweEYwLCAvKiAweDk0LTB4OTcgKi8KKwkweERCLCAweEM3LCAweERFLCAweEQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweEY0LCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweEQ1LCAweEQwLCAweEU1LCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEZDLCAweEM3LCAweERDLCAweEQ2LCAweEUyLCAweEUwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweEIwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEYzLCAweEEzLCAweDAwLCAweDAwLCAweEQzLCAweEVDLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweENCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweEZELCAweEM1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEZELCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEY5LCAweEIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEQwLCAweEZCLCAweEVDLCAweERCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweEJDLCAweEYyLCAweEE0LCAvKiAweEQ0LTB4RDcgKi8KKwkweEQ4LCAweENFLCAweEQ4LCAweENGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweEY1LCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY2LCAweEUxLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweEQyLCAweEI3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEZCLCAweEVDLCAweDAwLCAweDAwLCAweERELCAweEM4LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182MFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4RTgsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDIsIDB4QzEsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4RDcsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4RDYsIDB4QkIsIDB4REUsIDB4RDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4RjcsIDB4QkQsIDB4RUMsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4RDAsIDB4RTEsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RjUsIC8qIDB4MjQtMHgyNyAqLworCTB4RUEsIDB4QjMsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4RDYsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4QTUsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4RUMsIDB4RjYsIDB4RTIsIDB4RTEsIDB4RTMsIDB4QkUsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4RkMsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4Q0QsIDB4RjAsIDB4MDAsIDB4MDAsIDB4RjksIDB4RjYsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkMsIDB4RTEsIDB4RUQsIDB4QjAsIC8qIDB4NjAtMHg2MyAqLworCTB4RkQsIDB4RDEsIDB4RjYsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4RjksIDB4Q0YsIDB4RUIsIDB4REEsIDB4Q0EsIDB4QzEsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4RDIsIDB4QjgsIDB4Q0QsIDB4RjEsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RDMsIC8qIDB4NkMtMHg2RiAqLworCTB4RkQsIDB4RTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4RUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4RkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4RjAsIDB4QUEsIDB4RjksIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4RkMsIDB4RTIsIDB4MDAsIDB4MDAsIDB4RjgsIDB4QTcsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4RTUsIDB4RUUsIDB4RjksIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RjYsIC8qIDB4OUMtMHg5RiAqLworCTB4RUEsIDB4RUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkMsIDB4QjQsIC8qIDB4QTAtMHhBMyAqLworCTB4RjUsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4REMsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4RjAsIDB4RjUsIDB4MDAsIDB4MDAsIDB4REQsIDB4RTgsIDB4RDMsIDB4RUQsIC8qIDB4QjAtMHhCMyAqLworCTB4RjUsIDB4RkMsIDB4MDAsIDB4MDAsIDB4REEsIDB4QkYsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4Q0MsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4RDMsIDB4RkEsIDB4RjQsIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4RUYsIDB4RDcsIDB4MDAsIDB4MDAsIDB4RDQsIDB4QzMsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4RkIsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkIsIDB4RUQsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4RTAsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4RUUsIC8qIDB4REMtMHhERiAqLworCTB4RkIsIDB4QjMsIDB4RTQsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4RjYsIDB4RTcsIDB4RDIsIDB4REQsIDB4MDAsIDB4MDAsIDB4REYsIDB4Q0MsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkMsIDB4QzksIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4QTksIDB4RTAsIDB4RjYsIDB4RjYsIDB4QjMsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzYxWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhFMSwgMHhGRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhGMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhFQSwgMHhFRiwgMHhFQSwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhEQSwgMHhDMCwgMHhGOCwgMHhCNCwgMHhFQiwgMHhGMiwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhENywgMHhFNCwgMHhGMSwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhFRiwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhENywgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhGQywgMHhDQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhGMywgMHhFMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhDNCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhFMywgMHhFNSwgMHgwMCwgMHgwMCwgMHhDQiwgMHhDNSwgMHhFQSwgMHhCNCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhCRCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhENywgMHhDOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQiwgMHhEQiwgLyogMHg0NC0weDQ3ICovCisJMHhFRCwgMHhCMSwgMHgwMCwgMHgwMCwgMHhDQywgMHhDMywgMHhGNywgMHhCRSwgLyogMHg0OC0weDRCICovCisJMHhGQywgMHhDQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhGNCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhEOSwgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhGMywgMHhEMywgMHhGMywgMHhENCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhGNywgMHhFNCwgMHgwMCwgMHgwMCwgMHhGNywgMHhEMSwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhCNywgMHhDRSwgMHhCMSwgLyogMHg2MC0weDYzICovCisJMHhDQSwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhCNCwgLyogMHg2NC0weDY3ICovCisJMHhDQiwgMHhDNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhGNiwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhFNywgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhFQSwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQywgMHhENCwgMHhDQiwgMHhBRiwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhGNCwgMHhBQSwgMHhFOSwgMHhBRiwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhDMywgMHhFOSwgMHhEOCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHhFOSwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhGMywgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhENSwgMHhGQiwgMHhERSwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhGNCwgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhGRCwgMHhGMywgMHhGRCwgMHhGMiwgMHhGNywgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhERCwgMHhDOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENCwgMHhEMywgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHhDQywgMHhBOCwgMHgwMCwgMHgwMCwgMHhEQSwgMHhDMSwgLyogMHhBOC0weEFCICovCisJMHhDQywgMHhENSwgMHgwMCwgMHgwMCwgMHhEOSwgMHhFNCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQSwgMHhDQSwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhFMywgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhCQywgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhGMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhDNCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhEMCwgLyogMHhDNC0weEM3ICovCisJMHhGQSwgMHhBQiwgMHhFQiwgMHhFQiwgMHhFNywgMHhGOCwgMHhEOSwgMHhFNSwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHhENywgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHhBNCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENCwgMHhGQiwgMHhGQywgMHhFMywgLyogMHhGNC0weEY3ICovCisJMHhGQSwgMHhEOCwgMHgwMCwgMHgwMCwgMHhGMywgMHhENSwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHhDRiwgMHhBQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQiwgMHhGMywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjJbNTEyXSA9IHsKKwkweEQ1LCAweEZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEQ0LCAvKiAweDA0LTB4MDcgKi8KKwkweENELCAweEZDLCAweDAwLCAweDAwLCAweEQ5LCAweEU2LCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEUyLCAweEY5LCAweEUyLCAweEExLCAweEVCLCAweEQ0LCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEUwLCAweEY3LCAweEU0LCAweEIyLCAweENDLCAweEZDLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZCLCAweEU0LCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweEFCLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEJELCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweENBLCAweEYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEI4LCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweEMwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEVFLCAweEZBLCAweEZELCAweEY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweEQzLCAweEUzLCAweDAwLCAweDAwLCAweEZCLCAweEMyLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEU4LCAweERCLCAweEFFLCAvKiAweDNDLTB4M0YgKi8KKwkweEUxLCAweEI2LCAweEY4LCAweEI3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEJGLCAvKiAweDQ0LTB4NDcgKi8KKwkweEZCLCAweEMzLCAweERELCAweEVBLCAweDAwLCAweDAwLCAweEUyLCAweEEyLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY2LCAweEU4LCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEY2LCAweEY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweENBLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweEQwLCAweEUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweEE2LCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweERELCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEU0LCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEFGLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEQwLCAweEZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEY0LCAweEZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweENDLCAweEJDLCAweEY3LCAweEVBLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEU0LCAweERGLCAweEYxLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweEY3LCAweEUxLCAweDAwLCAweDAwLCAweEY5LCAweEY3LCAvKiAweDk0LTB4OTcgKi8KKwkweEVGLCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY4LCAweEQ4LCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LCAweEE5LCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEQ4LCAweEM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweEU0LCAweEUzLCAweEY1LCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweEQ5LCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEU3LCAvKiAweEM0LTB4QzcgKi8KKwkweEQyLCAweEI5LCAweEQ1LCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweERBLCAweEU1LCAweERBLCAweEQwLCAweDAwLCAweDAwLCAweEQxLCAweEQ5LCAvKiAweENDLTB4Q0YgKi8KKwkweENFLCAweEQ4LCAweDAwLCAweDAwLCAweENCLCAweERFLCAweEY0LCAweEFDLCAvKiAweEQwLTB4RDMgKi8KKwkweERBLCAweEZCLCAweDAwLCAweDAwLCAweEY2LCAweEU5LCAweEU4LCAweEYzLCAvKiAweEQ0LTB4RDcgKi8KKwkweENGLCAweEFDLCAweEYwLCAweEYwLCAweDAwLCAweDAwLCAweEY0LCAweEZELCAvKiAweEQ4LTB4REIgKi8KKwkweERCLCAweEM4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweENFLCAweEMwLCAweEUzLCAweEQ0LCAweEQxLCAweENGLCAweEYxLCAweEY1LCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweENELCAweEYyLCAweDAwLCAweDAwLCAweENGLCAweEVCLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENELCAweEI4LCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEE2LCAweEQxLCAweERBLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182M1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4RjIsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4QTYsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4RDMsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjEsIDB4QTksIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4QzksIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RDgsIDB4RTYsIDB4QzksIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4QjgsIDB4RkEsIDB4RjMsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4RjMsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4RjgsIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4RjMsIC8qIDB4NEMtMHg0RiAqLworCTB4RTYsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4RjgsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4RTksIC8qIDB4NjQtMHg2NyAqLworCTB4REUsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4REYsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4RUMsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4REYsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4RjQsIDB4RDIsIDB4QkEsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4RjIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QjcsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4RTIsIDB4QTMsIDB4RDMsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4RUQsIDB4RTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4QzksIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4RkEsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4Q0YsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4RDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4RDUsIDB4RDMsIDB4RjMsIDB4RjUsIDB4RjcsIDB4QUUsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4RUYsIDB4QzgsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4RjMsIC8qIDB4QTQtMHhBNyAqLworCTB4RjUsIDB4Q0YsIDB4RTUsIDB4RjMsIDB4RjAsIDB4QzIsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4Q0EsIDB4RDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RUEsIDB4RjEsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4REEsIC8qIDB4Q0MtMHhDRiAqLworCTB4RjAsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUIsIDB4RTcsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4QzAsIDB4RkMsIDB4QjUsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4QTksIDB4RkQsIDB4QzYsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RUEsIDB4QjUsIDB4MDAsIDB4MDAsIDB4RTUsIDB4QUEsIDB4REYsIDB4QkEsIC8qIDB4RjQtMHhGNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzY0WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhERiwgMHgwMCwgMHgwMCwgMHhEQSwgMHhEMSwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhFMSwgMHhCOCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhGNCwgMHhEMywgMHhGRCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhFMiwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhDQSwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhEQSwgMHhFNiwgMHhGNywgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhDRCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHhCNiwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhFRSwgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhGNSwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhBNywgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHhEOSwgMHhCOCwgMHhEOSwgMHhCOSwgMHhFRiwgMHhDOSwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhENiwgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhGNywgMHhDQiwgMHhERiwgMHhBRSwgMHhFOCwgMHhGNSwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMiwgMHhCNSwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhENSwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhGNCwgMHhDQywgMHhEQSwgMHhGQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhFOCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHhGNywgMHhFQiwgMHhGNSwgMHhDOSwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhGMywgMHhCQywgMHgwMCwgMHgwMCwgMHhEQSwgMHhEMiwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhCNSwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhCNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhENiwgMHhDRiwgMHhGNCwgMHhCQSwgMHgwMCwgMHgwMCwgMHhGNywgMHhDOSwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQywgMHhBQSwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhDMywgMHhDQywgMHhENiwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhEMywgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhEMywgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhEQiwgMHhGQiwgMHgwMCwgMHgwMCwgMHhDQiwgMHhFMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhEMywgMHhFNCwgMHhGNiwgMHhGNywgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhENSwgMHhCQSwgMHhGMywgMHhDRCwgMHhDQiwgMHhFMSwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHhFQiwgMHhGNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhBRCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhGQywgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNywgMHhFQywgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhGNiwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjVbNTEyXSA9IHsKKwkweERBLCAweEU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEY3LCAweENDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweEU1LCAweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweEVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEZELCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweEU2LCAweEZDLCAweEFCLCAvKiAweDI4LTB4MkIgKi8KKwkweEQ1LCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweEE4LCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEE1LCAweENELCAweEI5LCAvKiAweDM0LTB4MzcgKi8KKwkweEVBLCAweEYyLCAweENCLCAweEM3LCAweDAwLCAweDAwLCAweENELCAweEY0LCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERCLCAweEFGLCAweEVGLCAweEQ5LCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweENELCAweEJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEZDLCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweERGLCAweEYzLCAweENFLCAweEU3LCAweERBLCAweEMyLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweENGLCAweEFELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEY5LCAweEY4LCAweEE4LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYzLCAweEUyLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEYyLCAweERGLCAweEE0LCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweEM0LCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweENDLCAweEQ3LCAweEU1LCAweEMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENELCAweEJCLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEVGLCAweERBLCAweEVFLCAweEQ4LCAweDAwLCAweDAwLCAweERELCAweEE3LCAvKiAweDc0LTB4NzcgKi8KKwkweEUyLCAweEE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEMwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEIwLCAweEY4LCAweENBLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweEZDLCAweEZBLCAweDAwLCAweDAwLCAweEQ5LCAweEZFLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweERFLCAweEIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweERELCAweEVDLCAweERBLCAweEU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweEUwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweEQ2LCAweEY5LCAweDAwLCAweDAwLCAweENELCAweEQ3LCAvKiAweDk4LTB4OUIgKi8KKwkweERFLCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweEY4LCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweEQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEQwLCAweEM1LCAweEY0LCAweEFFLCAweDAwLCAweDAwLCAweERELCAweEE4LCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEM1LCAvKiAweEE4LTB4QUIgKi8KKwkweEYzLCAweEQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweEQ5LCAvKiAweEFDLTB4QUYgKi8KKwkweEUzLCAweEU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEE4LCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweERCLCAweEIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweEU1LCAweERBLCAweEUzLCAweEJGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweERCLCAweEIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEQ1LCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEMxLCAvKiAweEM4LTB4Q0IgKi8KKwkweEVGLCAweERCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweEU5LCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweEIyLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEZELCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweEQ5LCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEZFLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweEVDLCAweEVELCAweEQzLCAweEE5LCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEYyLCAweEE5LCAweEYwLCAweEM0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweEUyLCAweEUyLCAweEU5LCAweEVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweEY5LCAweEQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEU5LCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweERBLCAweERBLCAweEMzLCAvKiAweEY4LTB4RkIgKi8KKwkweERBLCAweEM0LCAweEQ0LCAweEM1LCAweDAwLCAweDAwLCAweEU3LCAweEZBLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182Nls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4RTAsIDB4RTMsIDB4QjAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4QjIsIDB4RkIsIDB4QzQsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4RjMsIDB4RTMsIDB4MDAsIDB4MDAsIDB4RDksIDB4QTUsIDB4RkIsIDB4RTcsIC8qIDB4MEMtMHgwRiAqLworCTB4REQsIDB4Q0IsIDB4RDAsIDB4RDQsIDB4MDAsIDB4MDAsIDB4RTYsIDB4QjYsIC8qIDB4MTAtMHgxMyAqLworCTB4RTAsIDB4QUUsIDB4RkQsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4QjUsIDB4RTAsIDB4RjgsIC8qIDB4MUMtMHgxRiAqLworCTB4RTcsIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4RjAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4REMsIC8qIDB4MjQtMHgyNyAqLworCTB4RUQsIDB4QzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4QjksIDB4MDAsIDB4MDAsIDB4RTMsIDB4QzAsIC8qIDB4MkMtMHgyRiAqLworCTB4RjksIDB4QzAsIDB4RTksIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4RDksIDB4REIsIDB4MDAsIDB4MDAsIDB4RjMsIDB4RTQsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4QjYsIDB4RTQsIDB4RTksIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4RjAsIDB4QzUsIDB4RTMsIDB4QzEsIDB4RkMsIDB4Q0MsIC8qIDB4NDAtMHg0MyAqLworCTB4RkMsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4RjIsIDB4Q0MsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4Q0YsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4RjEsIDB4REIsIDB4MDAsIDB4MDAsIDB4RkEsIDB4RDksIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4RjEsIDB4QjgsIDB4RkQsIDB4RjUsIDB4RTAsIDB4RjksIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4RTcsIDB4RkIsIDB4RkMsIDB4QjcsIDB4RkMsIDB4RTQsIDB4RkIsIDB4QzUsIC8qIDB4NjQtMHg2NyAqLworCTB4RTMsIDB4RTcsIDB4RDgsIDB4QjksIDB4MDAsIDB4MDAsIDB4RjYsIDB4RjgsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4QzUsIDB4Q0MsIDB4RDgsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QUYsIC8qIDB4NzAtMHg3MyAqLworCTB4RjQsIDB4RTcsIDB4MDAsIDB4MDAsIDB4RUYsIDB4REMsIDB4Q0YsIDB4RkMsIC8qIDB4NzQtMHg3NyAqLworCTB4RUYsIDB4REQsIDB4MDAsIDB4MDAsIDB4RjIsIDB4QUEsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4RkQsIDB4QkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4QUMsIC8qIDB4ODQtMHg4NyAqLworCTB4RkQsIDB4QkIsIDB4RkQsIDB4QzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4QjIsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4RUEsIDB4RDEsIDB4REYsIDB4RjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4RUMsIDB4RTQsIDB4REUsIC8qIDB4OTQtMHg5NyAqLworCTB4RTUsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4RDksIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4Q0QsIDB4QkMsIDB4MDAsIDB4MDAsIDB4RjMsIDB4RTUsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RDUsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4QkEsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RTcsIDB4RkIsIDB4QjUsIC8qIDB4QjAtMHhCMyAqLworCTB4RjgsIDB4RUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RTcsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4RDksIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDQsIDB4QzYsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RTcsIDB4QTUsIDB4MDAsIDB4MDAsIDB4RDUsIDB4RjUsIDB4RDMsIDB4QkUsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RkMsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4RjIsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4RjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4RTgsIDB4RjgsIDB4RjgsIDB4RUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4Q0UsIDB4QzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RjYsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4RTgsIDB4RDgsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4RDgsIDB4RTcsIDB4RDYsIC8qIDB4RjAtMHhGMyAqLworCTB4Q0MsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4RTMsIC8qIDB4RjQtMHhGNyAqLworCTB4REYsIDB4RjYsIDB4RjAsIDB4QzcsIDB4RjAsIDB4QzYsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4RDgsIDB4QkEsIDB4MDAsIDB4MDAsIDB4RjEsIDB4RjQsIDB4RjQsIDB4RjAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzY3WzUxMl0gPSB7CisJMHhGNSwgMHhDQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQywgMHhFNSwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhFQSwgMHhDNSwgMHhFQSwgMHhGMywgMHgwMCwgMHgwMCwgMHhERCwgMHhEQiwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhERSwgMHhGRCwgMHhGMiwgMHhGOSwgMHgwMCwgMHgwMCwgMHhENSwgMHhDNywgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhEMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhDOCwgMHhEMSwgMHhBMSwgMHhEMSwgMHhBMiwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhENCwgMHhENiwgMHhFOCwgLyogMHgyNC0weDI3ICovCisJMHhEOSwgMHhDQSwgMHgwMCwgMHgwMCwgMHhEQSwgMHhCMSwgMHhEOCwgMHhDNywgLyogMHgyOC0weDJCICovCisJMHhEQywgMHhFMiwgMHhGMywgMHhDRSwgMHhGNSwgMHhGNCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhEQSwgMHhEMywgMHgwMCwgMHgwMCwgMHhGNiwgMHhFQSwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhGNSwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhGRCwgMHhBRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhEMiwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhERCwgMHhGQSwgMHhCQSwgLyogMHg0Qy0weDRGICovCisJMHhFRSwgMHhBNywgMHhGNSwgMHhCRCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhGNSwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhFOCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHhENCwgMHhFMSwgMHgwMCwgMHgwMCwgMHhEMSwgMHhBMywgMHhFMSwgMHhENiwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhGOSwgMHhGOCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhDQSwgLyogMHg2Qy0weDZGICovCisJMHhDQiwgMHhGOSwgMHhENCwgMHhENCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhEQywgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhCRSwgMHgwMCwgMHgwMCwgMHhGNywgMHhFRCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMiwgMHhFRSwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhFNiwgMHhGNywgMHhGOSwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHhFRCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhEQiwgMHgwMCwgMHgwMCwgMHhEQiwgMHhCMywgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHhGNywgLyogMHg4Qy0weDhGICovCisJMHhFMCwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENCwgMHhFMiwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhENywgMHgwMCwgMHgwMCwgMHhENywgMHhGOSwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhERCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhDRCwgMHhGRCwgMHhGMiwgMHhBQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRCwgMHhCRCwgLyogMHhBQy0weEFGICovCisJMHhGOCwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhBQywgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhBRCwgMHhDQSwgMHhBRSwgLyogMHhCNC0weEI3ICovCisJMHhDRiwgMHhBRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhDMiwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhEQywgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhEQSwgLyogMHhDQy0weENGICovCisJMHhEOSwgMHhCQiwgMHhDQSwgMHhGMywgMHhGNiwgMHhEMywgMHhFNiwgMHhGOCwgLyogMHhEMC0weEQzICovCisJMHhFQSwgMHhGNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhGNiwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhDRiwgMHhBRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHhDQSwgMHhEMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhBRiwgLyogMHhFQy0weEVGICovCisJMHhEMiwgMHhCMCwgMHhGMSwgMHhCQSwgMHgwMCwgMHgwMCwgMHhENywgMHhCMywgLyogMHhGMC0weEYzICovCisJMHhFMywgMHhDMywgMHhGMywgMHhGRCwgMHhERSwgMHhEQSwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERSwgMHhEQiwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhERSwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjhbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEUzLCAweEVFLCAweEZCLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweEY3LCAweEQ3LCAweENBLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweENFLCAweEU4LCAweERCLCAweERCLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweEJCLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEYxLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEZBLCAweEI3LCAweEQwLCAweEM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweENDLCAweEFCLCAweEVFLCAweEE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweENCLCAweEZBLCAweEY5LCAweEY5LCAweENDLCAweEZELCAweEQzLCAweEZFLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEU0LCAweEQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweEVFLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEQ0LCAweEQ1LCAweERGLCAweENELCAweDAwLCAweDAwLCAweEZDLCAweEI4LCAvKiAweDUwLTB4NTMgKi8KKwkweEQxLCAweEQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweENELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY3LCAweEQyLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEQ0LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweEQ1LCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweEQ4LCAweERFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENELCAweEQ5LCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweEE5LCAvKiAweDkwLTB4OTMgKi8KKwkweEY2LCAweEJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweERCLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweEM5LCAweDAwLCAweDAwLCAweEZDLCAweEZDLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEM5LCAweEY0LCAweEZFLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEZDLCAvKiAweEE0LTB4QTcgKi8KKwkweEQ3LCAweERFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweERFLCAweERDLCAweDAwLCAweDAwLCAweEYwLCAweEFDLCAvKiAweEFDLTB4QUYgKi8KKwkweENDLCAweEZFLCAweENELCAweEUxLCAweDAwLCAweDAwLCAweEUxLCAweEJBLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweERCLCAweEVGLCAweERBLCAweEIyLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEQxLCAweEE1LCAweERDLCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEQ4LCAweEY2LCAweDAwLCAweDAwLCAweEQxLCAweEE0LCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweENELCAweEUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERDLCAweEVBLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweEY3LCAweDAwLCAweDAwLCAweEYwLCAweENBLCAvKiAweEQ0LTB4RDcgKi8KKwkweEQwLCAweEJFLCAweDAwLCAweDAwLCAweERELCAweERDLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweEQ2LCAvKiAweERDLTB4REYgKi8KKwkweEQzLCAweEQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEQwLCAvKiAweEU0LTB4RTcgKi8KKwkweENELCAweEExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweEI1LCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweEY4LCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEQ0LCAweEExLCAweENFLCAweEIyLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182OVs1MTJdID0geworCTB4RTgsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RUIsIDB4RjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4RDUsIDB4RjUsIDB4RDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjUsIDB4QTEsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4QTcsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RTUsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4RjUsIDB4RjEsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4QzUsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4QTMsIC8qIDB4NTAtMHg1MyAqLworCTB4RTAsIDB4REIsIDB4RjYsIDB4RUIsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4RjEsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4RDksIDB4RUEsIDB4RjUsIDB4QTIsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4RDEsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4RDEsIDB4RjgsIDB4RUEsIDB4RjgsIDB4RUEsIDB4RjksIDB4REEsIDB4QjMsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4RUYsIDB4REYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjEsIDB4RUYsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4RjYsIDB4RUUsIDB4QkYsIDB4RTIsIDB4RTQsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4RDAsIDB4QkYsIDB4MDAsIDB4MDAsIDB4RkEsIDB4QUMsIC8qIDB4NzQtMHg3NyAqLworCTB4RjUsIDB4RDEsIDB4RTcsIDB4QjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4QkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4Q0UsIC8qIDB4OTgtMHg5QiAqLworCTB4REIsIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4RkMsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4REQsIDB4RUUsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4QjQsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4RDcsIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjcsIDB4QjQsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4Q0QsIDB4QkUsIDB4MDAsIDB4MDAsIDB4REEsIDB4RTksIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4QjAsIC8qIDB4QzgtMHhDQiAqLworCTB4RjcsIDB4RDksIDB4RjMsIDB4RTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4Q0UsIDB4RDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4Q0UsIDB4QUEsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4QzgsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QTcsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4RjAsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QzcsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzZBWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhDNSwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhFMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhENSwgMHhEQSwgMHgwMCwgMHgwMCwgMHhENywgMHhBNywgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhDMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhGNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHhEMiwgMHhFRCwgMHhFOSwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhEOSwgMHhCQywgMHgwMCwgMHgwMCwgMHhFNSwgMHhDNiwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhBMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhEQSwgMHhENCwgMHhFMiwgMHhBNywgMHhGQiwgMHhGQywgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHhEQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhDQSwgMHhGNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhFOCwgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhFOSwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhGOCwgMHhFMiwgMHhFNSwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhEMCwgMHhCOSwgMHhENCwgMHhGMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHhBNiwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQywgMHhGNCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhEMywgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhDQywgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhFRiwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHhFNSwgMHhEMCwgMHhENSwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhGQywgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhGQywgMHhFNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhGRSwgMHhFRCwgMHhFQSwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERSwgMHhCMSwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhFMywgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENCwgMHhBMiwgMHhDRiwgMHhGNiwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhEMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhFQSwgMHhGMSwgMHhFRSwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQSwgMHhDQiwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhBMSwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNkJbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEQ1LCAweEIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENGLCAweEVELCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEVELCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEIyLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEJDLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEZELCAweEUyLCAweEYzLCAweEFELCAweDAwLCAweDAwLCAweEZELCAweERCLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEIwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQxLCAweEE3LCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEZELCAweEUzLCAweENFLCAweEIzLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEU0LCAweEZBLCAweENFLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweENBLCAweEIwLCAweDAwLCAweDAwLCAweEY3LCAweEE3LCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweENGLCAweEIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEEyLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweEZDLCAweEI2LCAweEYyLCAweEFELCAweEVGLCAweEUxLCAvKiAweDYwLTB4NjMgKi8KKwkweEYzLCAweEFFLCAweERDLCAweEM2LCAweEQ5LCAweEVCLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEUwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEE4LCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEY2LCAvKiAweDc0LTB4NzcgKi8KKwkweENGLCAweEZELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweERELCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEQxLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEVBLCAvKiAweDgwLTB4ODMgKi8KKwkweEYyLCAweENGLCAweDAwLCAweDAwLCAweEY3LCAweEJGLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEU2LCAweEUyLCAweEE4LCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEQ2LCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweEVELCAweEQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEY5LCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEIxLCAweERFLCAweEIyLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEU4LCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEQzLCAweEFCLCAweDAwLCAweDAwLCAweEVCLCAweERDLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweEFGLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweENBLCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweEZDLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweEZELCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEVCLCAweEY2LCAweENGLCAweEIyLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEVDLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweEQ5LCAweEJELCAweDAwLCAweDAwLCAweEQ4LCAweERGLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweEI4LCAweEVCLCAweEJFLCAvKiAweEQwLTB4RDMgKi8KKwkweERELCAweEVGLCAweDAwLCAweDAwLCAweERELCAweEYwLCAweERELCAweEYxLCAvKiAweEQ0LTB4RDcgKi8KKwkweERELCAweEYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEJFLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZCLCAweEM2LCAvKiAweEU4LTB4RUIgKi8KKwkweENGLCAweEIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182Q1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4RUUsIDB4RkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QUIsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4REEsIDB4QzUsIDB4MDAsIDB4MDAsIDB4RDgsIDB4RUMsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4QTgsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4RTIsIDB4QTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4QkMsIC8qIDB4MzQtMHgzNyAqLworCTB4RTcsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4RjAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4RUYsIDB4RTIsIDB4RjEsIDB4RjAsIDB4Q0YsIDB4QjQsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4RTAsIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4QTUsIDB4MDAsIDB4MDAsIDB4RjksIDB4RDIsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RkQsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4QTMsIDB4RkIsIDB4RjEsIDB4Q0IsIDB4QjAsIC8qIDB4NUMtMHg1RiAqLworCTB4RjIsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4Q0QsIDB4RTcsIDB4MDAsIDB4MDAsIDB4RTgsIDB4REMsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4RjcsIDB4QzAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4RTMsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4QTEsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4QkQsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4RDEsIDB4QTksIDB4REQsIDB4Q0MsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4RTMsIDB4RkUsIDB4RDEsIDB4QUEsIDB4RTgsIDB4QUEsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4QjYsIDB4RjksIDB4RkEsIDB4RTYsIDB4Q0MsIC8qIDB4ODQtMHg4NyAqLworCTB4RjYsIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4RDQsIDB4QzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4RDksIDB4Q0IsIDB4MDAsIDB4MDAsIDB4RDksIDB4RDIsIDB4RDMsIDB4Q0IsIC8qIDB4OTAtMHg5MyAqLworCTB4RDgsIDB4RjcsIDB4REEsIDB4QTksIDB4RjUsIDB4RjgsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4REUsIDB4REUsIDB4RjIsIDB4QUYsIDB4RjgsIDB4QTksIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4QzgsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4QzEsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4QzEsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4REQsIDB4RjMsIDB4RUEsIDB4RkEsIDB4MDAsIDB4MDAsIDB4RjYsIDB4QkQsIC8qIDB4QjgtMHhCQiAqLworCTB4RTEsIDB4QkIsIDB4Q0QsIDB4QkYsIDB4RjQsIDB4RDQsIDB4RTYsIDB4Q0QsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4RkMsIDB4Q0YsIDB4RkIsIDB4QTIsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RTAsIDB4REMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RjQsIDB4QkIsIDB4REEsIDB4RDUsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4RjksIDB4QjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkIsIDB4RjIsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4RjYsIDB4MDAsIDB4MDAsIDB4REUsIDB4REYsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4RjIsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4RjgsIDB4REMsIDB4RjcsIDB4RUUsIDB4RUIsIDB4RTgsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4RDIsIDB4RkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4RjEsIDB4QkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkEsIDB4REEsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4RUEsIDB4REEsIDB4QzYsIC8qIDB4RUMtMHhFRiAqLworCTB4RjcsIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4QjYsIC8qIDB4RjAtMHhGMyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzZEWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhDNywgLyogMHgwOC0weDBCICovCisJMHhENiwgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHhDNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhBOSwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhBQSwgMHgwMCwgMHgwMCwgMHhENSwgMHhBNiwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENCwgMHhENywgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhGMiwgMHhEMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhGQiwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhERCwgMHhGQiwgMHhGMywgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhCRCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhFNywgMHhGRCwgMHhENywgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhDRSwgMHhDOCwgMHhFQSwgMHhCNywgMHgwMCwgMHgwMCwgMHhGQywgMHhDMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhGRCwgMHhFNywgMHhGNywgMHhFRiwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHhENywgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhFRiwgMHhCQSwgMHhGMSwgMHhERCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHhERSwgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhDQiwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhERCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhGQiwgMHhDNywgMHhENSwgMHhDOCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhENywgMHhERiwgMHgwMCwgMHgwMCwgMHhERCwgMHhBOSwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhFOSwgMHhCMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQSwgMHhBRCwgLyogMHg3NC0weDc3ICovCisJMHhGNiwgMHhEOSwgMHhGQSwgMHhGNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhBQSwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhFRSwgMHgwMCwgMHgwMCwgMHhDQywgMHhEQywgLyogMHg4NC0weDg3ICovCisJMHhFMSwgMHhCQywgMHhFMCwgMHhFRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHhFOSwgMHhCRiwgMHhGQywgMHhGRCwgMHhFNiwgMHhDRSwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhENywgMHgwMCwgMHgwMCwgMHhFNiwgMHhDRiwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhGNCwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhGMywgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhGQiwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHhGOSwgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhFRiwgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhFRSwgLyogMHhDMC0weEMzICovCisJMHhGNiwgMHhCRSwgMHhFMCwgMHhCMiwgMHhGQywgMHhGRSwgMHhEMSwgMHhBQiwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhGQSwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhDOCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhENCwgMHhBMywgMHhGMCwgMHhGOCwgMHhENywgMHhBOCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhFNywgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhEMywgMHhCRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhFRiwgMHhFNCwgMHgwMCwgMHgwMCwgMHhENywgMHhDNSwgMHhFQiwgMHhFMiwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQywgMHhFNywgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhBMiwgMHgwMCwgMHgwMCwgMHhFMiwgMHhFOCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhEMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhFOCwgLyogMHhGNC0weEY3ICovCisJMHhGNCwgMHhFOCwgMHhFNSwgMHhGNCwgMHhGNCwgMHhCQywgMHhGNCwgMHhENSwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNkVbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweEI2LCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEZDLCAweEI5LCAweEVFLCAweEMyLCAweENBLCAweEY1LCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEU1LCAvKiAweDFDLTB4MUYgKi8KKwkweENCLCAweEUyLCAweEQ0LCAweEE0LCAweDAwLCAweDAwLCAweERFLCAweEUwLCAvKiAweDIwLTB4MjMgKi8KKwkweERBLCAweEZELCAweEU0LCAweEM2LCAweEU4LCAweEJFLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweERFLCAvKiAweDI4LTB4MkIgKi8KKwkweEY2LCAweEI0LCAweEVBLCAweEQyLCAweDAwLCAweDAwLCAweEY5LCAweEZCLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEMyLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweENBLCAweEU0LCAweDAwLCAweDAwLCAweEU3LCAweEI3LCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEVBLCAweEZELCAweDAwLCAweDAwLCAweEQ5LCAweERELCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweERBLCAweEI0LCAweEVFLCAweEFBLCAweEZCLCAweEU5LCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERCLCAweENCLCAvKiAweDQwLTB4NDMgKi8KKwkweERBLCAweEI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweEJFLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweEQzLCAweEFDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZCLCAweEM5LCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweERGLCAweENGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEMwLCAvKiAweDU4LTB4NUIgKi8KKwkweEUzLCAweEQ3LCAweDAwLCAweDAwLCAweEVGLCAweEU2LCAweEZDLCAweEQwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEMwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweEQzLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweERDLCAweEY3LCAweEI3LCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweEI4LCAweEQxLCAweEY5LCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERDLCAweEM4LCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweEVBLCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweERFLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEQ3LCAweEI2LCAweENGLCAweEI1LCAweDAwLCAweDAwLCAweEQ5LCAweEE4LCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEVFLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweERELCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENELCAweEEyLCAweEU4LCAweEFFLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEJELCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweEQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEMxLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQyLCAweEZDLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERCLCAweEI1LCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEYzLCAweEU3LCAweEQ4LCAweEZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEZDLCAweEQxLCAweDAwLCAweDAwLCAweEVELCAweEIyLCAvKiAweEM4LTB4Q0IgKi8KKwkweEY0LCAweEFGLCAweDAwLCAweDAwLCAweEZCLCAweEEzLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEZDLCAweEMxLCAweDAwLCAweDAwLCAweEVFLCAweEFCLCAvKiAweEQwLTB4RDMgKi8KKwkweEQ0LCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweEYyLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEVFLCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEZCLCAweENBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENELCAweEUzLCAweEQ4LCAweEJCLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182Rls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4RTUsIDB4REIsIDB4RjgsIDB4RjcsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjYsIDB4RDQsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4QTksIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4RTYsIDB4RDEsIDB4RjAsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4RDgsIDB4QUUsIDB4MDAsIDB4MDAsIDB4RjksIDB4RDMsIDB4RDUsIDB4RkUsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4QkMsIC8qIDB4MjgtMHgyQiAqLworCTB4RjIsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4QUIsIDB4RjMsIDB4RTgsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4RUYsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RUMsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4QjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4REEsIDB4RkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4Q0MsIDB4QkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4RkMsIC8qIDB4NTQtMHg1NyAqLworCTB4REEsIDB4RUIsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RDgsIDB4RUQsIDB4RDYsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4RDEsIDB4RTAsIDB4QjMsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkMsIDB4RDIsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4RUIsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4RDMsIDB4QzEsIDB4RjAsIDB4Q0QsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4Q0YsIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RDIsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4RDQsIDB4RDgsIDB4REMsIDB4QzksIDB4RDcsIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4REYsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4RjMsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4RjQsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4RjEsIDB4QkYsIDB4RjgsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4RTksIDB4RkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4RkIsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4RDUsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4RDQsIC8qIDB4QTAtMHhBMyAqLworCTB4RjcsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4QzgsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkMsIDB4RTgsIDB4RjMsIDB4QkQsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4RkUsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RkUsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RDMsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4QjYsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4Q0MsIDB4QUQsIDB4RjYsIDB4RkEsIDB4RDYsIDB4QjIsIDB4RDIsIDB4RDgsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RDgsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4QjksIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4QUQsIC8qIDB4REMtMHhERiAqLworCTB4RkIsIDB4Q0MsIDB4RUIsIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4RDQsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4RkIsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4RDUsIDB4QkQsIC8qIDB4RTgtMHhFQiAqLworCTB4RjEsIDB4REYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjYsIDB4RkIsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4REUsIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4RUIsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzcwWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhFNSwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhGQiwgMHhBNCwgMHhENCwgMHhCOSwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhERSwgMHhFMSwgMHgwMCwgMHgwMCwgMHhFNCwgMHhBMywgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhCNywgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhFRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHhERSwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhENiwgMHhEMiwgMHgwMCwgMHgwMCwgMHhGOSwgMHhENSwgMHhFNywgMHhCQSwgLyogMHgxOC0weDFCICovCisJMHhFQiwgMHhENSwgMHhENSwgMHhGNywgMHhFRiwgMHhFNywgMHhFMSwgMHhCRSwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQSwgMHhBRSwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhFOSwgLyogMHgyNC0weDI3ICovCisJMHhENiwgMHhFRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhCQiwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQywgMHhDQiwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhCMywgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhDRSwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhGQiwgMHhBNSwgMHhFMSwgMHhFRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhGNywgMHhBOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhGQiwgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhCRCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhGRCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhGQywgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHhDRiwgMHhCNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhFRCwgMHhDNywgMHhFRSwgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHhDQywgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNiwgMHhBNywgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhGQSwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHhBNCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhGRCwgMHhEQywgMHhFRCwgMHhCMywgMHhDRSwgMHhDOSwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHhFRiwgMHhFOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhFMSwgMHhCRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQSwgMHhEQiwgLyogMHhBOC0weEFCICovCisJMHhDQiwgMHhFMywgMHhGNywgMHhBOSwgMHgwMCwgMHgwMCwgMHhGQiwgMHhBNiwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhCOSwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhDMCwgLyogMHhCNC0weEI3ICovCisJMHhFRCwgMHhDOCwgMHhFRiwgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHhENiwgMHhBRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhDRSwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhBMSwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhGQiwgMHhGNCwgMHhENSwgMHhBNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHhGNiwgMHgwMCwgMHgwMCwgMHhFNiwgMHhEMywgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhDQywgMHhERSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhCMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHhFQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzFbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEZELCAweEI2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEYxLCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweERCLCAweENDLCAweERELCAweENELCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweEM4LCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweEQ5LCAweEVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweEE1LCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEU2LCAweEZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEQ0LCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEM4LCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweEQ2LCAweEExLCAweEZELCAweEJGLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEZDLCAweEQzLCAweDAwLCAweDAwLCAweEVGLCAweEExLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEU3LCAweEJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQxLCAweEVFLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweEU5LCAweEYyLCAweDAwLCAweDAwLCAweERGLCAweEIwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEQ4LCAweEUwLCAweEZDLCAweEJBLCAweEZELCAweEFGLCAweEYwLCAweENFLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweERCLCAweEUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEU1LCAweEM5LCAweDAwLCAweDAwLCAweEVELCAweEI0LCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEUzLCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweEZCLCAweEVBLCAweEE4LCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEI3LCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZCLCAweEE3LCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEU5LCAweEMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweEZELCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEQ5LCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERDLCAweEVDLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweEU4LCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEZELCAweEY4LCAweEZELCAweEY5LCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY2LCAweEJGLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweEE3LCAweDAwLCAweDAwLCAweEU2LCAweEQ3LCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweEQ0LCAweEYzLCAweEQ0LCAweEM5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEZBLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweEQ3LCAweEYyLCAweDAwLCAweDAwLCAweEUxLCAweEMwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweERCLCAweEUyLCAweEU2LCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEJELCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweENGLCAweEYzLCAweEJFLCAweEUyLCAweEFDLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweEY1LCAweEI3LCAweEUwLCAweEYwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEI4LCAvKiAweEY4LTB4RkIgKi8KKwkweEUzLCAweEU4LCAweDAwLCAweDAwLCAweEQ0LCAweEE3LCAweEU4LCAweEZDLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183Mls1MTJdID0geworCTB4RkEsIDB4RDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4RUYsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4RDYsIDB4RDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4QjQsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4RDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4RjcsIDB4RjAsIDB4RUUsIDB4QjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RUEsIDB4QkEsIDB4MDAsIDB4MDAsIDB4RUEsIDB4RDMsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4QzksIDB4REQsIDB4QUIsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4QUMsIDB4RkQsIDB4QTEsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4RDAsIDB4RUMsIDB4QjMsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4REYsIDB4RDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RUQsIDB4RjgsIDB4QjgsIC8qIDB4NDQtMHg0NyAqLworCTB4RjcsIDB4RkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4RjgsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4RTAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4RDQsIDB4QkEsIDB4RTQsIDB4QjMsIDB4MDAsIDB4MDAsIDB4RTksIDB4REEsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4REUsIDB4QjYsIDB4MDAsIDB4MDAsIDB4RDksIDB4QkYsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4RDksIDB4QzAsIDB4RDYsIDB4RUYsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4Q0MsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4REEsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4RTUsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4RjcsIDB4RTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4QjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4REYsIDB4RjksIDB4RDcsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDQsIDB4QkIsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkEsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4Q0MsIDB4QjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4RjMsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4REYsIDB4RDIsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4Q0EsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RUUsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4RTQsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4RkIsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4QjcsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4RUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4RDcsIDB4RTEsIDB4RkEsIDB4RjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4RDUsIDB4QzksIDB4RjgsIDB4QUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzczWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhEOSwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHhFOSwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhFRCwgLyogMHgxOC0weDFCICovCisJMHhFMywgMHhDNCwgMHhGMCwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhGQSwgMHhFRSwgMHhDNCwgMHhEOSwgMHhERSwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQiwgMHhBMiwgMHhFQiwgMHhBMywgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQywgMHhDMiwgMHhFQSwgMHhCQiwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhFOCwgMHhBQiwgMHhERSwgMHhFMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhFRCwgMHhFRiwgMHgwMCwgMHgwMCwgMHhFOCwgMHhBMywgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhGMSwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhENCwgMHhCQywgMHgwMCwgMHgwMCwgMHhGQywgMHhFQSwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhFNywgMHhCRSwgMHgwMCwgMHgwMCwgMHhGQywgMHhGMiwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhENiwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHhFMiwgMHhBRSwgMHgwMCwgMHgwMCwgMHhEMywgMHhCNywgMHhGQSwgMHhDQywgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhGQSwgMHhEQywgMHgwMCwgMHgwMCwgMHhFRCwgMHhCNSwgMHhFMSwgMHhFMywgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhBQywgMHgwMCwgMHgwMCwgMHhFOCwgMHhERCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhFOSwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhGNCwgMHhCRCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhCOCwgMHhFOSwgMHhEQiwgLyogMHg5NC0weDk3ICovCisJMHhEMSwgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQSwgMHhDNywgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQiwgMHhDOSwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhDQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHhERSwgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhCQywgMHhEMywgMHhFNSwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhGQSwgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhEQSwgMHhENiwgMHgwMCwgMHgwMCwgMHhDQSwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhEQSwgMHhDOCwgMHhERiwgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHhGOSwgMHhCMywgMHhGMiwgMHhEMiwgMHgwMCwgMHgwMCwgMHhDQSwgMHhDNCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhDQiwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhGNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhGRCwgMHhCMCwgMHhENSwgMHhBOCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHhGMSwgMHhDMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhFOSwgLyogMHhFMC0weEUzICovCisJMHhEQywgMHhDQSwgMHhFQywgMHhCNCwgMHhGQSwgMHhDMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhGQiwgMHhBOCwgMHhEMCwgMHhBOCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHhEQSwgMHhFQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhFRSwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhFRiwgMHhFQSwgMHhGQSwgMHhERSwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzRbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEUwLCAweEM0LCAweDAwLCAweDAwLCAweENGLCAweEI5LCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEQ1LCAweENBLCAweEQ3LCAweEUyLCAweEUyLCAweEFGLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEQ3LCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweENELCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY2LCAweERBLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEVGLCAweEEyLCAweEUyLCAweERBLCAweEY2LCAweEZDLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEZCLCAweEQwLCAweEQxLCAweEFELCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweENELCAweEU0LCAweDAwLCAweDAwLCAweEQxLCAweEFFLCAweERDLCAweEVELCAvKiAweDI4LTB4MkIgKi8KKwkweEU4LCAweENFLCAweDAwLCAweDAwLCAweEYwLCAweEY5LCAweENFLCAweEI1LCAvKiAweDJDLTB4MkYgKi8KKwkweEU2LCAweEZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweEZCLCAvKiAweDMwLTB4MzMgKi8KKwkweEQwLCAweEQ2LCAweERELCAweEY1LCAweEY3LCAweEYxLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEY2LCAweEZELCAweDAwLCAweDAwLCAweERCLCAweEY3LCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZCLCAweEVBLCAvKiAweDNDLTB4M0YgKi8KKwkweEU5LCAweERDLCAweEQ5LCAweEMxLCAweDAwLCAweDAwLCAweEY1LCAweEYyLCAvKiAweDQwLTB4NDMgKi8KKwkweEUwLCAweEM1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweEQ0LCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEY5LCAweEMyLCAweDAwLCAweDAwLCAweEVBLCAweEJDLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEQyLCAweEM1LCAweEZCLCAweEQxLCAweEU3LCAweEMwLCAvKiAweDU4LTB4NUIgKi8KKwkweEVCLCAweEE1LCAweDAwLCAweDAwLCAweERGLCAweEZBLCAweEUzLCAweEEyLCAvKiAweDVDLTB4NUYgKi8KKwkweEQ3LCAweEI5LCAweDAwLCAweDAwLCAweEU5LCAweEMzLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEU4LCAweEZELCAweEU4LCAweEFGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEYyLCAweEQzLCAweEZCLCAweEE5LCAweEQ4LCAweEE1LCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweENCLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEM4LCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQxLCAweEFGLCAweEQ3LCAweEUzLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEM2LCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEQ2LCAweEEyLCAweDAwLCAweDAwLCAweEVELCAweEYwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweEQ3LCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEZDLCAweEQ0LCAweDAwLCAweDAwLCAweERBLCAweEQ3LCAweENDLCAweERGLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweEQ0LCAweDAwLCAweDAwLCAweEQxLCAweEIwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweENDLCAweEUwLCAweDAwLCAweDAwLCAweERCLCAweEZELCAvKiAweEE0LTB4QTcgKi8KKwkweEYzLCAweEJGLCAweDAwLCAweDAwLCAweEYwLCAweEQxLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweEZDLCAweEJCLCAweDAwLCAweDAwLCAweEUyLCAweEIwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweERCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweERGLCAweERFLCAweDAwLCAweDAwLCAweEUwLCAweEM3LCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweEVGLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweEUxLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEVBLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEU3LCAweEMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweENFLCAweEI2LCAweDAwLCAweDAwLCAweEYzLCAweEMwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweENELCAweEZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweEZCLCAweEQyLCAweDAwLCAweDAwLCAweEY4LCAweEY4LCAweEY3LCAweEZCLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEJGLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEI3LCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEI2LCAvKiAweEY0LTB4RjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183NVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4REMsIDB4QkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4Q0MsIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4RjEsIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4QjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4Q0EsIDB4RjYsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QTQsIDB4RjQsIDB4RDYsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4RTYsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4QTcsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4RTcsIDB4RTEsIDB4QzEsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4RTksIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4Q0IsIC8qIDB4MjgtMHgyQiAqLworCTB4RTksIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RUYsIDB4QTMsIDB4RUIsIDB4QTYsIDB4Q0IsIDB4QTMsIDB4RTMsIDB4RTksIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4RkIsIC8qIDB4MzQtMHgzNyAqLworCTB4RUYsIDB4QTQsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RUIsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QjQsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4Q0QsIDB4QTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RTYsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4RUYsIDB4QTUsIDB4MDAsIDB4MDAsIDB4RDMsIDB4Q0MsIC8qIDB4NTAtMHg1MyAqLworCTB4REEsIDB4RUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4QkEsIDB4MDAsIDB4MDAsIDB4RjIsIDB4RDUsIC8qIDB4NTgtMHg1QiAqLworCTB4RjUsIDB4RTUsIDB4RDksIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4QjQsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4RDQsIDB4RkQsIDB4Q0YsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4RTMsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjEsIDB4RTEsIC8qIDB4NkMtMHg2RiAqLworCTB4RUMsIDB4QjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4RkIsIDB4RkUsIDB4RDMsIDB4RDcsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4RDEsIDB4QjEsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4QjIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4QjIsIDB4RjEsIDB4QzIsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4RTEsIDB4RjksIDB4QjUsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QzMsIDB4RTEsIDB4QzIsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4RUIsIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4QTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4QjksIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4RjgsIDB4REUsIDB4RjksIDB4QUEsIDB4Q0EsIDB4RjcsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4QjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4RDMsIDB4QjgsIDB4RjIsIDB4RDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4RDQsIDB4RDksIDB4RUUsIDB4QzUsIDB4RjIsIDB4RjAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4QjIsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4REMsIDB4QkIsIDB4MDAsIDB4MDAsIDB4RjEsIDB4RjgsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4RUMsIDB4QjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4Q0EsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RjYsIDB4QzAsIDB4RkQsIDB4REQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4RDQsIDB4RTMsIDB4Q0MsIDB4RTIsIDB4MDAsIDB4MDAsIDB4RjcsIDB4RDQsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4RTUsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4RDMsIDB4QzMsIDB4MDAsIDB4MDAsIDB4RDgsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RjYsIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4RjYsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4Q0QsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzc2WzUxMl0gPSB7CisJMHhFNSwgMHhEQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHhDQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhCMCwgLyogMHgxQy0weDFGICovCisJMHhGNCwgMHhCMCwgMHhGMywgMHhFQSwgMHhEQSwgMHhFRSwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHhENywgMHhCQiwgMHgwMCwgMHgwMCwgMHhFMiwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhBQSwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhGQiwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhFNCwgMHhERiwgMHgwMCwgMHgwMCwgMHhDQSwgMHhENiwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQiwgMHhBOCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhGRSwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhFRiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhENCwgMHhGRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhFMCwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhFOCwgMHhCOSwgMHgwMCwgMHgwMCwgMHhFRiwgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHhDRCwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENCwgMHhGNCwgLyogMHg3OC0weDdCICovCisJMHhEQiwgMHhBMSwgMHhEQiwgMHhEQywgMHhEQiwgMHhERCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhFRSwgMHhEQywgMHgwMCwgMHgwMCwgMHhDQiwgMHhDQiwgMHhGQywgMHhENSwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhFQiwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhDRCwgMHhDMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhEMywgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhBQiwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHhENCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhBOSwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhERCwgMHhEQiwgMHhDRCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHhDRSwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHhFNywgMHhDMywgMHgwMCwgMHgwMCwgMHhFQywgMHhDQywgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhFQywgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhDQywgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhGQywgLyogMHhEOC0weERCICovCisJMHhENCwgMHhBOCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhEMywgMHhEOCwgMHhFRiwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhGMiwgMHhENywgMHgwMCwgMHgwMCwgMHhDQSwgMHhGOCwgLyogMHhFMC0weEUzICovCisJMHhEQSwgMHhFRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhENCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhDRCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhFRSwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhGMiwgMHhDMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHhERiwgMHhEMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHhEQSwgMHhGMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhFQSwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzdbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEUwLCAweEZELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEQ4LCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEY3LCAweEFGLCAweERBLCAweEI2LCAweDAwLCAweDAwLCAweENBLCAweEQ3LCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweEQ4LCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEQ4LCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEZBLCAweERGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENGLCAweEVGLCAvKiAweDM0LTB4MzcgKi8KKwkweEQ5LCAweEMyLCAweDAwLCAweDAwLCAweEYwLCAweEQyLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweEU0LCAweEQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweEYzLCAweEI3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweEZBLCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEVDLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEIyLCAweDAwLCAweDAwLCAweEQ0LCAweEJELCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweENFLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweEUyLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEQ0LCAweEE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENELCAweEMyLCAweEU3LCAweERBLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweEQ5LCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEQ5LCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweEJFLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweERDLCAweEFELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweEUyLCAweEVCLCAweEQ2LCAweEZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweENBLCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweERBLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweEQ3LCAvKiAweEI4LTB4QkIgKi8KKwkweENDLCAweEExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENGLCAweEJBLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweEI4LCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEMzLCAvKiAweEQ4LTB4REIgKi8KKwkweEQwLCAweEU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEM1LCAweEVCLCAweEY4LCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweEIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweENGLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweEQzLCAweEFELCAweEU4LCAweEUxLCAweENFLCAweEVDLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEI0LCAvKiAweEYwLTB4RjMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183OFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4RTMsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4RjcsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4QjIsIDB4RjMsIDB4RjYsIDB4RjYsIDB4REIsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4RDcsIDB4RkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4REYsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4RjcsIDB4RjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4RDAsIDB4QTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4REEsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4QkMsIC8qIDB4NjgtMHg2QiAqLworCTB4Q0MsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4REIsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4REQsIDB4REQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4RDEsIDB4QjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RUQsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4RDYsIDB4REUsIDB4RTQsIDB4RjQsIDB4RTEsIDB4RUYsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4REQsIDB4RjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4Q0YsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4RTUsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4QTEsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkMsIDB4QUMsIDB4RkMsIDB4QUQsIC8qIDB4QjgtMHhCQiAqLworCTB4RDgsIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4QjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4QjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4RjAsIDB4RjMsIDB4QUYsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4QTUsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4REEsIDB4RjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4RDgsIDB4QTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4Q0MsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4QjQsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4Q0EsIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4RjIsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzc5WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhGNSwgMHhBNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHhBOCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhFQywgMHhENSwgMHhGOCwgLyogMHgyOC0weDJCICovCisJMHhEQSwgMHhGMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhDNiwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERSwgMHhFNCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhERSwgMHhFNSwgMHhEMSwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHhCNiwgLyogMHg0NC0weDQ3ICovCisJMHhEMSwgMHhCNywgMHhGMiwgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhFOSwgMHhERSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhEMywgMHhGMiwgMHhCNCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhENCwgMHhDQiwgMHhFNCwgLyogMHg1OC0weDVCICovCisJMHhGQiwgMHhENCwgMHhGNSwgMHhFNiwgMHhFMywgMHhFQSwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhERSwgMHhFNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHhENCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhGOCwgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhBRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHhCOCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhERiwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhEMCwgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhGQywgMHhBMSwgMHhFRiwgMHhFRSwgMHhEQywgMHhEOCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhERiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhERCwgMHhGRCwgMHhGQiwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhDOSwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhDOSwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhENCwgMHhBQSwgMHgwMCwgMHgwMCwgMHhFNSwgMHhDQywgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhEMCwgMHhEOCwgMHhGQywgMHhBMiwgMHhENCwgMHhCRSwgLyogMHhCQy0weEJGICovCisJMHhFMiwgMHhCMywgMHhERSwgMHhFNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHhCQywgMHhEMiwgMHhCNiwgMHhGNSwgMHhENSwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhDRSwgMHhBMSwgMHhGNSwgMHhBOSwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhERCwgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhERCwgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhENSwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHhGNiwgMHhERiwgMHgwMCwgMHgwMCwgMHhGMiwgMHhEQSwgMHhFNCwgMHhFQiwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhGMiwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQywgMHhCOSwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfN0FbNTEyXSA9IHsKKwkweEZELCAweEZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweENBLCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEVGLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEY1LCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweEVDLCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY4LCAweEFELCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweEMyLCAweEY2LCAweEMzLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweEQ3LCAweEQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LCAweEEyLCAvKiAweDFDLTB4MUYgKi8KKwkweEYwLCAweEQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweEZBLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEYzLCAweEYyLCAweEMzLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweEFCLCAvKiAweDM4LTB4M0IgKi8KKwkweENBLCAweEIzLCAweENELCAweEE2LCAweDAwLCAweDAwLCAweENELCAweEMzLCAvKiAweDNDLTB4M0YgKi8KKwkweENELCAweERBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweENGLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEM0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweERELCAweEU3LCAweEM0LCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEI0LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweERGLCAweEUyLCAweEU3LCAweERCLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEIxLCAweDAwLCAweDAwLCAweEZDLCAweEFFLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEU1LCAweENELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEZBLCAweEVCLCAweDAwLCAweDAwLCAweENGLCAweEJDLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweENGLCAweEUyLCAweENELCAweEY2LCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEVGLCAweEYwLCAweDAwLCAweDAwLCAweEY0LCAweEJFLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweEQ0LCAweENELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEYzLCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweEU5LCAweEExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweEYyLCAweEYzLCAweEVCLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweEQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweENGLCAweEQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENGLCAweERGLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEMwLCAweEU4LCAweEMxLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENGLCAweEUzLCAweEU5LCAweEEyLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEFBLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEYzLCAweEMxLCAweEQwLCAweEFCLCAweDAwLCAweDAwLCAweEQ0LCAweEU0LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEJDLCAweEQ4LCAweEExLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweERGLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweEYzLCAweEQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweERDLCAweEJELCAweDAwLCAweDAwLCAweENDLCAweEU1LCAvKiAweERDLTB4REYgKi8KKwkweEVELCAweEYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweEUyLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweEQ0LCAweERCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEI1LCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweENBLCAweEU2LCAweDAwLCAweDAwLCAweEQzLCAweEFFLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweEU2LCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEYxLCAweEQzLCAweEY1LCAweEU3LCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweERBLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183Qls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkIsIDB4RUUsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4RTksIDB4MDAsIDB4MDAsIDB4RUUsIDB4REUsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjcsIDB4QzIsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4RDgsIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4QUMsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4RjAsIDB4QUYsIDB4RDYsIDB4QkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4QjYsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4RjUsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QzksIC8qIDB4NDgtMHg0QiAqLworCTB4RUYsIDB4QTcsIDB4RTIsIDB4RUMsIDB4MDAsIDB4MDAsIDB4REIsIDB4RUEsIC8qIDB4NEMtMHg0RiAqLworCTB4Q0UsIDB4Q0MsIDB4RjUsIDB4RTgsIDB4RjcsIDB4RDUsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4RDMsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4RjMsIDB4RkUsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4RDAsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4RTAsIDB4RkUsIDB4MDAsIDB4MDAsIDB4REYsIDB4RkIsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4REQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4Q0QsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QTgsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4QjQsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4REEsIDB4RDgsIDB4RDEsIDB4QjksIDB4MDAsIDB4MDAsIDB4REYsIDB4QTksIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjMsIDB4QjAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4QjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4RUYsIDB4QTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4RUQsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4RUUsIDB4QzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4RUYsIDB4QkQsIDB4RkMsIDB4RDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4REIsIDB4RjQsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QUEsIDB4RjgsIDB4QjksIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RDksIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4RTEsIDB4QzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4RDQsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4REUsIDB4RTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzdDWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhFQSwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHhDMiwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhBRiwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhDQSwgMHhEQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQywgMHhENywgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhEOCwgMHhFMSwgMHhDNywgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhGNCwgMHhEOCwgMHhENiwgMHhCMywgMHhERCwgMHhBRCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhCRSwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhGMSwgMHhDMywgMHhFRSwgMHhERiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhENiwgMHhFQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhGNCwgMHhEOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhENywgMHhFNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQSwgMHhCNywgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHhGQiwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhERCwgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhBMywgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhEQSwgMHhEOSwgMHgwMCwgMHgwMCwgMHhGMCwgMHhEOCwgLyogMHg5NC0weDk3ICovCisJMHhFRiwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhEOCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHhENCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhGMiwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhEQiwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhENSwgMHhEQywgMHhGMywgMHhDNCwgMHhDQiwgMHhENywgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhCNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhGMSwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhENSwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhEOCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHhEMCwgMHhGMCwgMHhEOSwgLyogMHhEQy0weERGICovCisJMHhDQiwgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhERCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRCwgMHhBNywgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhBQywgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfN0RbNTEyXSA9IHsKKwkweEQxLCAweEJBLCAweDAwLCAweDAwLCAweEYxLCAweEM0LCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEU1LCAweEIzLCAweEZCLCAweEY1LCAweEU5LCAweEUxLCAweEZELCAweEUwLCAvKiAweDA0LTB4MDcgKi8KKwkweEZDLCAweEJDLCAweDAwLCAweDAwLCAweERBLCAweEEyLCAweERBLCAweEEzLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEQyLCAweEExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEQyLCAweEVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweEUyLCAweEVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweEU5LCAvKiAweDE0LTB4MTcgKi8KKwkweENFLCAweERDLCAweEYyLCAweEI1LCAweEQwLCAweEU0LCAweERELCAweEQxLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEUxLCAweEM4LCAweERCLCAweEI3LCAweERGLCAweEUzLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEI5LCAvKiAweDI4LTB4MkIgKi8KKwkweEYxLCAweEM1LCAweDAwLCAweDAwLCAweEYzLCAweENGLCAweEQ3LCAweEFCLCAvKiAweDJDLTB4MkYgKi8KKwkweEUxLCAweEFDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEVCLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEM3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEM5LCAweENBLCAweEZBLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweEZCLCAweEZBLCAweEUxLCAvKiAweDQwLTB4NDMgKi8KKwkweEYwLCAweERBLCAweENDLCAweEU3LCAweERBLCAweEY0LCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweENDLCAweEJGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweEVELCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweEQ1LCAweEE5LCAweEZBLCAweEUyLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEU1LCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEVCLCAweEQ2LCAweDAwLCAweDAwLCAweEVDLCAweERGLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweEZDLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweEY3LCAweEQ2LCAweERFLCAweEVBLCAweENCLCAweEI0LCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEJFLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweENDLCAweEI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENGLCAweEJELCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEYyLCAweEUyLCAweEI3LCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweEU4LCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEYwLCAweEZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweEQ2LCAweEUwLCAweDAwLCAweDAwLCAweEYxLCAweEM2LCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweEUyLCAweEI4LCAweEVCLCAweEFCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweENCLCAweEI1LCAweEQ4LCAweEQxLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweEY0LCAweENFLCAweEYzLCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweEQ3LCAweEM2LCAweDAwLCAweDAwLCAweEQxLCAweEJCLCAweEY3LCAweEFBLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweEVELCAweENBLCAweEQ3LCAweEQzLCAweEQ4LCAweEZBLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY2LCAweEM1LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQxLCAweENDLCAweERELCAweEZDLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweEZELCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEY5LCAweEU1LCAweDAwLCAweDAwLCAweEUwLCAweENBLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweEZELCAweEQzLCAweEIwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweEY0LCAweEYzLCAweERBLCAweEM5LCAweDAwLCAweDAwLCAweEU2LCAweERFLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEY4LCAweEJBLCAweEU4LCAweEQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweEQ4LCAweEZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweEQ1LCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEQ2LCAweEEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY2LCAweEM2LCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183RVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4REIsIDB4RTQsIDB4RkMsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4QjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4REEsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4REMsIDB4RkIsIDB4RDYsIDB4RTksIDB4QjIsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4QUQsIDB4MDAsIDB4MDAsIDB4RkEsIDB4RTMsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4RUUsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjUsIDB4RUEsIDB4RTYsIDB4RTAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RjAsIDB4RkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4QUMsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4QzUsIDB4RUUsIDB4RTAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4RTUsIDB4MDAsIDB4MDAsIDB4REQsIDB4REUsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4RjAsIDB4RTksIDB4QTMsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjEsIDB4RjksIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4RjIsIDB4QzQsIDB4RTAsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4QTQsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4QjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4QjEsIDB4RkMsIDB4RUIsIDB4Q0QsIDB4QTgsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4QjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4RjAsIDB4REIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4QkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4Q0QsIDB4QTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjMsIDB4QzMsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4RTEsIDB4RDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QUIsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4QzUsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RTksIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4RjMsIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDQsIDB4QzAsIC8qIDB4OTgtMHg5QiAqLworCTB4RDUsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzdGWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHhBRSwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhGOSwgMHhGQywgMHgwMCwgMHgwMCwgMHhDQywgMHhDMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhFNSwgMHhBMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhDRSwgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhEOCwgMHhEMiwgMHhGOSwgMHhENiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhBQSwgMHhDRSwgMHhEMSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNiwgMHhDNywgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhEQiwgMHhFQiwgMHgwMCwgMHgwMCwgMHhERiwgMHhGRSwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHhFMSwgMHgwMCwgMHgwMCwgMHhGNywgMHhGMywgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhENywgMHhFNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHhENCwgMHhGRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhEMSwgMHhCQywgMHgwMCwgMHgwMCwgMHhFNSwgMHhDRiwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHhDQiwgMHhCNiwgMHgwMCwgMHgwMCwgMHhEQSwgMHhCOCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhDRCwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhCRSwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhCQSwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhDRiwgMHhEOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhFMCwgMHhDQywgMHhFQiwgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhENywgMHhFOCwgMHhDQiwgMHhEOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhFMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhCQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhDNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQywgMHhDRCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHhFQywgMHhDRSwgMHgwMCwgMHgwMCwgMHhENiwgMHhCRiwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhBNywgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhERiwgMHhENiwgMHhGRCwgMHhFOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhFMSwgLyogMHhEQy0weERGICovCisJMHhGNiwgMHhBOCwgMHhERCwgMHhGRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhCQiwgMHgwMCwgMHgwMCwgMHhFOCwgMHhEMSwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhGOSwgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhDRSwgMHhFRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHhFQywgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODBbNTEyXSA9IHsKKwkweEU5LCAweEE1LCAweEQ2LCAweEQ1LCAweDAwLCAweDAwLCAweENELCAweEM1LCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEVELCAweEJBLCAweEQxLCAweEJELCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweENGLCAweEJFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEVDLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEQyLCAweEIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweENDLCAweEU5LCAweDAwLCAweDAwLCAweEQ5LCAweEM0LCAvKiAweDE0LTB4MTcgKi8KKwkweEU5LCAweEZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweEQxLCAweEJFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEJDLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEFELCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEY3LCAweEIwLCAweDAwLCAweDAwLCAweENDLCAweEVBLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEM0LCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEMwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEZELCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEExLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweERFLCAweEJELCAweDAwLCAweDAwLCAweEY2LCAweEE5LCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweEE0LCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEE0LCAvKiAweDZDLTB4NkYgKi8KKwkweEY1LCAweEM2LCAweDAwLCAweDAwLCAweEUxLCAweEEyLCAweEU5LCAweEM2LCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweEM1LCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweEU5LCAweEQ2LCAweEVDLCAweEVCLCAweEQzLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEVDLCAweEJELCAweEUyLCAweERDLCAweERFLCAweEVCLCAweEYwLCAweERDLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEVCLCAweEJGLCAweDAwLCAweDAwLCAweEQ3LCAweENFLCAvKiAweDg4LTB4OEIgKi8KKwkweEQxLCAweEJGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweEFCLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LCAweEZELCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweENBLCAweERDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweENELCAweEM2LCAweEYyLCAweEI2LCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweERELCAweEZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweENDLCAweEI3LCAweERCLCAweEI4LCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEU5LCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweENFLCAweERELCAweEVCLCAweEMwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweEZELCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY4LCAweENCLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweEQ2LCAvKiAweEMwLTB4QzMgKi8KKwkweEYxLCAweEIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweERCLCAweENFLCAweDAwLCAweDAwLCAweEY3LCAweEMzLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERCLCAweENGLCAweENCLCAweEE0LCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY4LCAweEUwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEZCLCAweEQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweEVCLCAweENBLCAweEUwLCAweEExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweENFLCAweENELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEQ0LCAweERDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEZELCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEQyLCAweEY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184MVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4QjcsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RkEsIDB4RjYsIDB4RjYsIDB4QUEsIDB4RkEsIDB4RjcsIC8qIDB4MDQtMHgwNyAqLworCTB4RDgsIDB4RTYsIDB4MDAsIDB4MDAsIDB4RjQsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4RTgsIDB4RDIsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4QzUsIDB4Q0MsIDB4RUIsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RUUsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4QkIsIDB4MDAsIDB4MDAsIDB4RjcsIDB4QUQsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4RTEsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4RjMsIDB4RUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4QTEsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4RkQsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RUMsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4REQsIDB4QUYsIDB4REQsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4Q0IsIDB4QjcsIDB4RTgsIDB4RDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4QTMsIDB4RDIsIDB4RTAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4RkUsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4RTksIDB4QTYsIDB4Q0IsIDB4RjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4RUQsIDB4RjMsIDB4REMsIDB4RDksIDB4RTAsIDB4Q0QsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjcsIDB4REEsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4REIsIDB4QjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4Q0MsIDB4QUUsIDB4MDAsIDB4MDAsIDB4REEsIDB4REIsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4QzcsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4RDgsIDB4QUYsIDB4RTMsIDB4QTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4Q0UsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4RjMsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4RjgsIDB4QjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4Q0UsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4RkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUIsIDB4RUMsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4RDMsIDB4QzUsIDB4RkMsIDB4RUMsIDB4RDIsIDB4REIsIC8qIDB4QkMtMHhCRiAqLworCTB4RDQsIDB4RUIsIDB4MDAsIDB4MDAsIDB4REUsIDB4QTIsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RTYsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4RjAsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4RDUsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RjQsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RUQsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4QzIsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RjUsIC8qIDB4RTQtMHhFNyAqLworCTB4RDcsIDB4RkMsIDB4MDAsIDB4MDAsIDB4RUQsIDB4QkIsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4QjgsIC8qIDB4RjAtMHhGMyAqLworCTB4RjYsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4RTYsIDB4RjIsIDB4REQsIC8qIDB4RjgtMHhGQiAqLworCTB4Q0YsIDB4QkYsIDB4MDAsIDB4MDAsIDB4RUIsIDB4QUMsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzgyWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhDRiwgMHhDMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhBOCwgLyogMHgwNC0weDA3ICovCisJMHhGRCwgMHhFOSwgMHgwMCwgMHgwMCwgMHhDRiwgMHhDMSwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhFMCwgMHhERiwgMHhERSwgMHhFQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhBMiwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhCRiwgLyogMHgxOC0weDFCICovCisJMHhFMiwgMHhFRiwgMHgwMCwgMHgwMCwgMHhEOSwgMHhGMSwgMHhGMSwgMHhDNywgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhDQiwgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhGRSwgMHhEQiwgMHhCQSwgLyogMHgyOC0weDJCICovCisJMHhEQSwgMHhGNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhFQywgMHhEQSwgMHhEQywgMHhGQSwgMHhFNCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhERCwgMHhCMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhBOSwgMHgwMCwgMHgwMCwgMHhFRiwgMHhGMywgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhGMywgMHhFRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhFQiwgMHhGQSwgMHgwMCwgMHgwMCwgMHhGOSwgMHhFNiwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhERCwgMHhENSwgMHhERSwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHhDQSwgMHhERSwgMHhERiwgMHhFNCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhGRCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHhGNSwgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhGNSwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhFMywgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhDQiwgMHhDRiwgMHhFNCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhEMywgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHhERCwgMHhCMywgMHhENCwgMHhFQywgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHhGMiwgMHhCOSwgMHgwMCwgMHgwMCwgMHhERiwgMHhCNywgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhDQiwgMHhDRSwgMHhGQiwgMHhEOCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHhEMCwgMHhEOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhERCwgMHhEMiwgMHhGNywgMHhGNCwgMHhFNywgMHhEQywgMHhFNCwgMHhBNSwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhGQywgMHhBMywgMHgwMCwgMHgwMCwgMHhEQiwgMHhCQiwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhCQSwgLyogMHhCNC0weEI3ICovCisJMHhFOSwgMHhGRCwgMHhEMCwgMHhDQSwgMHgwMCwgMHgwMCwgMHhGNSwgMHhENiwgLyogMHhCOC0weEJCICovCisJMHhEOSwgMHhDNSwgMHhFNCwgMHhCNCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhBNywgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHhCRCwgMHhFNiwgMHhGRSwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhGNywgMHhDNCwgMHhGNSwgMHhBRCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhFMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhCNCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhFMiwgMHhDRiwgMHhDMiwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhFQywgMHhCRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHhCNCwgMHhDRCwgMHhDOCwgMHhFRSwgMHhDOCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhDOSwgMHhGOSwgMHhCNywgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEYxLCAweEU4LCAweEQ5LCAweEYyLCAweERCLCAweEY1LCAvKiAweDAwLTB4MDMgKi8KKwkweENBLCAweEI1LCAweEQ5LCAweEM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEQ4LCAweEM5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEFCLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweEVELCAweEJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweEQ0LCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERDLCAweERBLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweEZDLCAweEVELCAweEVDLCAweEUwLCAweEQyLCAweEZFLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEU5LCAweEM3LCAweEU2LCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweEUyLCAweEYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweEJCLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweEY1LCAweEFFLCAweEZCLCAweEFBLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEZCLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweEVDLCAweEJGLCAweEZDLCAweEQ4LCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweEU1LCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LCAweEMzLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweEUyLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEQ3LCAweEU5LCAweEVELCAweEY2LCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweEVELCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweEVDLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweEUzLCAweEVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEQ0LCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweEY4LCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweERELCAweEI0LCAweEU0LCAweEI1LCAweEQ4LCAweEIwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweEQ4LCAweEQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweEVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweENFLCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEQ2LCAweEUxLCAweENGLCAweEQyLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEQwLCAweEI2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweEEyLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYzLCAweEVFLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweEYzLCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweERDLCAweENDLCAweDAwLCAweDAwLCAweEQwLCAweENCLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZDLCAweEE0LCAvKiAweEVDLTB4RUYgKi8KKwkweENELCAweENBLCAweEQ3LCAweEQ0LCAweERFLCAweEEzLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEU0LCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEM5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweERELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184NFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjUsIDB4RkUsIC8qIDB4MDAtMHgwMyAqLworCTB4RDQsIDB4QUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4RDEsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4RDgsIDB4RjAsIDB4RjgsIDB4QzMsIDB4RUEsIDB4RDcsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4RDgsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RkQsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4RUIsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4QTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4Q0EsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4RTcsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4RjgsIDB4RTMsIDB4MDAsIDB4MDAsIDB4RDQsIDB4REQsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4RDgsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkIsIDB4RDksIC8qIDB4NjgtMHg2QiAqLworCTB4RUQsIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4QjUsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4RDAsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjEsIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4RTIsIDB4QkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4RTMsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4RDksIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4REYsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4QkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4RTQsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4RjEsIDB4RkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4QjYsIC8qIDB4QjgtMHhCQiAqLworCTB4RjMsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkIsIDB4REEsIC8qIDB4QkMtMHhCRiAqLworCTB4RTEsIDB4RTAsIDB4MDAsIDB4MDAsIDB4RDksIDB4QUMsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RjUsIDB4RUIsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QjYsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4QzgsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4Q0YsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4REUsIDB4RUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4QkUsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4REMsIDB4RUYsIDB4MDAsIDB4MDAsIDB4RDYsIDB4QTUsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RTIsIDB4RjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4RDYsIDB4RkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzg1WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhEOSwgMHhBMSwgMHgwMCwgMHgwMCwgMHhEOCwgMHhDMCwgLyogMHgxMC0weDEzICovCisJMHhEQywgMHhEQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhCRCwgLyogMHgxNC0weDE3ICovCisJMHhERiwgMHhCOCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhBNSwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhBRCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhGMywgMHhGOSwgMHgwMCwgMHgwMCwgMHhFRCwgMHhGOCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhDNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhFMSwgMHhDQSwgMHhFQiwgMHhFMywgMHgwMCwgMHgwMCwgMHhGMiwgMHhERSwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhDQywgMHgwMCwgMHgwMCwgMHhFQSwgMHhEOSwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHhEMywgMHhDNiwgMHgwMCwgMHgwMCwgMHhEQiwgMHhFNiwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhBRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhGMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhGRSwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhGQiwgMHhCNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhGMiwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhDRiwgMHhGMiwgMHhGNywgMHhCOSwgMHhEOSwgMHhGMywgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhDQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhEQSwgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQSwgMHhCOSwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQiwgMHhGQiwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhDQiwgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhFRCwgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhFMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhDMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhGRCwgMHhCQywgMHhERiwgMHhCMSwgMHhFMywgMHhFRiwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhBMywgLyogMHhBQy0weEFGICovCisJMHhGRCwgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhDQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhCRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhENSwgMHhDMCwgMHhFMywgMHhGMCwgMHhFRCwgMHhGQSwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhENSwgMHhFRCwgMHhFNywgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHhENCwgMHhGNiwgMHhFNSwgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhEQiwgMHhFNywgMHhFMiwgMHhCRiwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhDQiwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhGNCwgMHhGMCwgMHhERCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhBQiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODZbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweERFLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEQ2LCAweEUxLCAweENDLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEIzLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEVFLCAweERDLCAweEEyLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEQwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweEQ1LCAweEI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEExLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZCLCAweERCLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEY5LCAweENCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweENCLCAweEYzLCAweEY0LCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweEM4LCAvKiAweDU4LTB4NUIgKi8KKwkweEQ2LCAweEQ3LCAweDAwLCAweDAwLCAweEU5LCAweEU1LCAweEZCLCAweERDLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEQwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEZCLCAweEY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweEE1LCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweERCLCAweEJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEUyLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENELCAweEY3LCAvKiAweEEwLTB4QTMgKi8KKwkweEYwLCAweERFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEM5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweEVGLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEIxLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEZDLCAweEVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEMzLCAweDAwLCAweDAwLCAweEYxLCAweEM4LCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweEYxLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweEY5LCAweEVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweEY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEI2LCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184N1s1MTJdID0geworCTB4RjUsIDB4QjksIDB4MDAsIDB4MDAsIDB4REMsIDB4RjAsIDB4RTMsIDB4RjEsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4RTgsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4RjIsIDB4QkIsIDB4MDAsIDB4MDAsIDB4REUsIDB4QTQsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4REEsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4RTksIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4REEsIDB4MDAsIDB4MDAsIDB4RkMsIDB4RDksIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4REEsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4QzQsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4RTMsIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4RkIsIDB4REQsIDB4MDAsIDB4MDAsIDB4RUYsIDB4Q0EsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4RTgsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4Q0MsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4RUIsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4QUQsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkIsIDB4QUIsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4RDksIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4QTIsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RjYsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4REEsIDB4RjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4RTAsIDB4RDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4QTgsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjUsIDB4RjksIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4RkEsIDB4QUYsIDB4MDAsIDB4MDAsIDB4RUIsIDB4RkMsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RUEsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzg4WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhCMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhDNSwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhFMywgMHhENSwgMHhFRSwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhDQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhEOSwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhDMSwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhGQSwgMHhFQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhFQiwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhGQSwgMHhCQywgMHhFNiwgMHhFMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQSwgMHhFNSwgMHhFMiwgMHhGQSwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhCNiwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhCNywgMHgwMCwgMHgwMCwgMHhFQSwgMHhEQiwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhGQiwgMHhBQywgMHhDRiwgMHhDMywgMHhFQiwgMHhGRCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhGOCwgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERiwgMHhCOSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhFMSwgMHhGMSwgMHgwMCwgMHgwMCwgMHhEMiwgMHhBNCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHhGQiwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhEQSwgMHhEMCwgMHhEQiwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhFQSwgMHhCRSwgMHhEOSwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhDQSwgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhFNywgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhCMiwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhDMCwgMHhGMiwgMHhERiwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRCwgMHhFNSwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhBQywgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHhDRCwgMHhDRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhBRSwgMHhENiwgMHhBRSwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhFQSwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhFNywgMHhFMCwgMHhFQiwgMHhBRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHhDRiwgMHhEOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhEQywgMHhDRCwgMHhFRCwgMHhGQiwgMHgwMCwgMHgwMCwgMHhERSwgMHhGMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhENywgMHhFQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhERSwgMHhBNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERiwgMHhENywgLyogMHhGMC0weEYzICovCisJMHhEQiwgMHhEMCwgMHhEQiwgMHhEMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHhENSwgMHhBMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhCMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODlbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERDLCAweERDLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweENBLCAweEU4LCAweDAwLCAweDAwLCAweEY4LCAweEU2LCAweERDLCAweENFLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweEVBLCAweERDLCAweERCLCAweEQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweEIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY3LCAweERCLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEE4LCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEQ3LCAweEFFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEUxLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweENCLCAweEJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEU1LCAweEQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweERDLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEQ1LCAweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweENBLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEE5LCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEE0LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweEU5LCAweEE5LCAweDAwLCAweDAwLCAweEQzLCAweEM3LCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERDLCAweERELCAweEY4LCAweEFFLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweEI4LCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEFFLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweEYyLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweENBLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweENDLCAweEFGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweEQ0LCAweEFELCAweEY2LCAweEQxLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweENDLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEM2LCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweEQ1LCAweEMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweENFLCAweEJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEM3LCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweEIwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweERGLCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEY1LCAweEJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184QVs1MTJdID0geworCTB4RTUsIDB4RUIsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RjQsIDB4REQsIDB4QjUsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4Q0QsIDB4QUEsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RjIsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4RkIsIDB4RjcsIDB4MDAsIDB4MDAsIDB4RjcsIDB4RDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4QkEsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RTEsIDB4RjYsIDB4RkUsIC8qIDB4MTQtMHgxNyAqLworCTB4RDEsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4QzUsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4QjgsIDB4MDAsIDB4MDAsIDB4RTEsIDB4RTgsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4QzEsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4RDIsIDB4RUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4QkUsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RkEsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4RTEsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4QjgsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4RTAsIDB4RjEsIDB4QzksIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4REUsIDB4RjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4RjAsIDB4REYsIDB4RjgsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4Q0MsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4RjIsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4RTcsIDB4QzksIDB4MDAsIDB4MDAsIDB4RTIsIDB4RjMsIDB4RTcsIDB4RTEsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4Q0IsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4Q0YsIDB4RjgsIDB4RUYsIDB4QUMsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4RkQsIDB4RkUsIDB4RkMsIDB4QTUsIDB4RkEsIDB4QjEsIDB4REYsIDB4RDksIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4RjQsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4RjEsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4QTMsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4RjIsIDB4QkMsIDB4RUMsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QTUsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4RjcsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4RUIsIDB4QUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4REUsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4RTEsIDB4QTQsIDB4Q0QsIDB4QUIsIDB4MDAsIDB4MDAsIDB4RDksIDB4RjQsIC8qIDB4QTAtMHhBMyAqLworCTB4RTgsIDB4QTYsIDB4Q0QsIDB4Q0UsIDB4RTEsIDB4RTksIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4RkMsIDB4RUYsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RTMsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4RTIsIDB4QzEsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4QTQsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4REUsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4RUIsIDB4RkUsIDB4MDAsIDB4MDAsIDB4RUIsIDB4REQsIDB4RjAsIDB4RTAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4REIsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RTIsIDB4RjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4QzgsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4RUIsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4QjUsIDB4MDAsIDB4MDAsIDB4RjUsIDB4RDgsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4REYsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4RTUsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUIsIDB4QjAsIC8qIDB4RDgtMHhEQiAqLworCTB4RjQsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4RjQsIDB4RkEsIDB4QjIsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RjUsIDB4Q0EsIDB4REYsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4RUIsIDB4QjEsIDB4RUQsIDB4QkYsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4RkQsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QTYsIDB4RjksIDB4QTQsIC8qIDB4RjQtMHhGNyAqLworCTB4RjAsIDB4QjMsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RUMsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4RTcsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzhCWzUxMl0gPSB7CisJMHhEOSwgMHhDNywgMHhFNCwgMHhENywgMHhFQSwgMHhERCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhENCwgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQSwgMHhCQSwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhEQSwgMHhDRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhGOSwgMHhDQywgMHgwMCwgMHgwMCwgMHhFMSwgMHhEQSwgMHhEQiwgMHhCRiwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhDQywgMHhDNSwgMHhFQywgMHhEMCwgMHhDQiwgMHhCQiwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhERSwgMHhGMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhFOSwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhEOSwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhFMywgLyogMHgyOC0weDJCICovCisJMHhENywgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhDNCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHhEMCwgMHhDRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHhGQywgMHhBNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhEMiwgMHhEMSwgMHhDMSwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhFMywgMHhEQiwgMHgwMCwgMHgwMCwgMHhEMywgMHhDOSwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHhEQywgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQywgMHhFRCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhERSwgMHhBNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhCQiwgLyogMHg2Qy0weDZGICovCisJMHhFQywgMHhBMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhDQywgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhERSwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHhFMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhENCwgMHhDMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhBOCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhFMiwgMHhDMiwgMHgwMCwgMHgwMCwgMHhGMywgMHhEOCwgMHhFNSwgMHhEMywgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHhEOSwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHhDNiwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOENbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENELCAweERCLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENELCAweEFDLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweEZDLCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweEU3LCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEQxLCAweEMyLCAweDAwLCAweDAwLCAweEY5LCAweEE1LCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEU4LCAweEQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweENBLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweERGLCAweERBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZCLCAweERGLCAweEU3LCAweEUzLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEZCLCAweEUzLCAweENGLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweEIwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweEU3LCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweEQ5LCAweEM5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEFGLCAweEVGLCAweEY2LCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweERELCAweEI2LCAweEVFLCAweEFGLCAweENELCAweEY4LCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweEI4LCAvKiAweEE0LTB4QTcgKi8KKwkweEZDLCAweEE3LCAweEY3LCAweEZDLCAweEY3LCAweEIxLCAweENFLCAweEJCLCAvKiAweEE4LTB4QUIgKi8KKwkweEY0LCAweEExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweENELCAvKiAweEFDLTB4QUYgKi8KKwkweEUxLCAweEFFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEMzLCAvKiAweEIwLTB4QjMgKi8KKwkweENGLCAweEZFLCAweDAwLCAweDAwLCAweEY4LCAweEJGLCAweEQ4LCAweEUyLCAvKiAweEI0LTB4QjcgKi8KKwkweEQzLCAweEU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweEE4LCAvKiAweEI4LTB4QkIgKi8KKwkweEY0LCAweEU0LCAweEVDLCAweEMyLCAweDAwLCAweDAwLCAweEQ5LCAweEY1LCAvKiAweEJDLTB4QkYgKi8KKwkweEY5LCAweEM1LCAweERELCAweEQzLCAweEQ2LCAweEYxLCAweEVDLCAweEZDLCAvKiAweEMwLTB4QzMgKi8KKwkweEZDLCAweEYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEMwLCAvKiAweEM0LTB4QzcgKi8KKwkweENBLCAweEI5LCAweDAwLCAweDAwLCAweEVFLCAweEU0LCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweEUxLCAweDAwLCAweDAwLCAweERFLCAweEI5LCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEYyLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweERFLCAweEY0LCAweDAwLCAweDAwLCAweERGLCAweERCLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweERCLCAweEQzLCAweDAwLCAweDAwLCAweEZBLCAweEU3LCAweEQ4LCAweEUzLCAvKiAweEUwLTB4RTMgKi8KKwkweEY0LCAweEMxLCAweDAwLCAweDAwLCAweERELCAweEI3LCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweEY1LCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweEQ0LCAweEFFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEQ2LCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweEI4LCAvKiAweEY4LTB4RkIgKi8KKwkweENGLCAweEM1LCAweERGLCAweERGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184RFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RjIsIDB4QkUsIDB4RjYsIDB4QTEsIDB4MDAsIDB4MDAsIDB4RUIsIDB4Q0IsIC8qIDB4MDQtMHgwNyAqLworCTB4RjEsIDB4RkMsIDB4MDAsIDB4MDAsIDB4RjMsIDB4QzcsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RkMsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4REIsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4RUUsIDB4RTUsIDB4MDAsIDB4MDAsIDB4REUsIDB4RjUsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkEsIDB4RDMsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4RjEsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QUYsIC8qIDB4NzAtMHg3MyAqLworCTB4REQsIDB4QjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4QzMsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4QzYsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4RjAsIDB4RTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjYsIDB4QUMsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4RjUsIDB4RDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4RUIsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4QkEsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4QkYsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjcsIDB4QzUsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4QTIsIC8qIDB4QzgtMHhDQiAqLworCTB4RjIsIDB4RjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4QkEsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjcsIDB4RjUsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4RTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4RTYsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RDMsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4Q0UsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4RDgsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDQsIDB4QUYsIC8qIDB4RjAtMHhGMyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzhFWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhDOSwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhDRSwgLyogMHgwQy0weDBGICovCisJMHhGNCwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhFNiwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhBMSwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhFQiwgMHhCMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHhBMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQiwgMHhCMywgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhGMCwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhGNCwgLyogMHg0NC0weDQ3ICovCisJMHhENCwgMHhCMCwgMHhGMywgMHhCMiwgMHhGQiwgMHhCNywgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhFQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhFNywgLyogMHg1Qy0weDVGICovCisJMHhGNCwgMHhCMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhGNSwgMHhFRCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhGMywgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhFMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhDRSwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhDQywgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhGNSwgMHhFMywgMHhGMywgLyogMHhBOC0weEFCICovCisJMHhDRiwgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhDRiwgMHhDNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHhCMywgMHhFNCwgMHhEOCwgLyogMHhDOC0weENCICovCisJMHhDRiwgMHhGOSwgMHhDRiwgMHhEQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQSwgMHhDRCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhFMywgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhFMiwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHhGNSwgMHhFRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhCQiwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhEQywgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOEZbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweEYyLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEQ2LCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweEU1LCAweEQ4LCAweEMyLCAvKiAweDEwLTB4MTMgKi8KKwkweERDLCAweEQwLCAweENDLCAweEVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEUwLCAvKiAweDE4LTB4MUIgKi8KKwkweEY2LCAweENBLCAweEZELCAweENBLCAweEQ4LCAweEQ2LCAweEY0LCAweENGLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEE2LCAweERDLCAweEJFLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweERCLCAweEQ0LCAweEQ3LCAweEM3LCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweEZFLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweENELCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEUyLCAweEMzLCAweERDLCAweERFLCAweDAwLCAweDAwLCAweERDLCAweERGLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEFELCAweEU2LCAweEFCLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEY5LCAweERELCAweEVBLCAweEJGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweEVGLCAweEFFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweEQwLCAweENFLCAweEYzLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEFDLCAweDAwLCAweDAwLCAweENFLCAweERFLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEY5LCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEY0LCAvKiAweDk4LTB4OUIgKi8KKwkweENELCAweEQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEI4LCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY3LCAweEZELCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweERDLCAweEE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweERFLCAweEY2LCAweDAwLCAweDAwLCAweERDLCAweEFBLCAvKiAweEFDLTB4QUYgKi8KKwkweEYyLCAweEUzLCAweEU5LCAweEI0LCAweEQyLCAweERDLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEU2LCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweEY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweENBLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEQwLCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweERBLCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEJDLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweEU4LCAweERBLCAweERFLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweEUyLCAweEZCLCAweDAwLCAweDAwLCAweENDLCAweEE2LCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweEJCLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEY1LCAweERBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185MFs1MTJdID0geworCTB4RjcsIDB4REMsIDB4RTEsIDB4RUEsIDB4Q0UsIDB4QzEsIDB4RDQsIDB4QjEsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RkQsIDB4QjEsIDB4RTYsIDB4QkQsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4RkIsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4RTcsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4RjcsIDB4RTIsIC8qIDB4MEMtMHgwRiAqLworCTB4RjUsIDB4RUYsIDB4Q0YsIDB4QzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4RDQsIDB4QjIsIDB4Q0MsIDB4RUYsIDB4MDAsIDB4MDAsIDB4RDQsIDB4RTgsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4Q0YsIDB4RjcsIDB4RDcsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4QTYsIDB4RDYsIDB4QzEsIDB4RTEsIDB4REMsIC8qIDB4MUMtMHgxRiAqLworCTB4RjAsIDB4RTMsIDB4RjEsIDB4RTQsIDB4REMsIDB4RjEsIDB4RDYsIDB4QTcsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4RjUsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RjEsIDB4Q0UsIDB4RjIsIDB4RTQsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4RDAsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4RUMsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4RjksIDB4QkEsIDB4MDAsIDB4MDAsIDB4RUIsIDB4QjUsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4RUQsIDB4RTIsIDB4QzQsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4RTcsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUIsIDB4QjQsIDB4RUEsIDB4QTEsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4RjgsIDB4QkMsIDB4Q0UsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4RjksIDB4QzYsIDB4RkMsIDB4REEsIDB4MDAsIDB4MDAsIDB4RDQsIDB4QjMsIC8qIDB4NTAtMHg1MyAqLworCTB4RDMsIDB4QjksIDB4RUEsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4RTEsIDB4RTEsIDB4RDMsIDB4Q0YsIDB4RjQsIDB4RjYsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4RUEsIDB4QzAsIDB4RTEsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4QkEsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4RUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4RjAsIDB4RTQsIDB4RjMsIDB4QjQsIDB4RDQsIDB4RUUsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4QzAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4RjEsIDB4RTUsIDB4MDAsIDB4MDAsIDB4RjQsIDB4QzMsIC8qIDB4NzQtMHg3NyAqLworCTB4RTAsIDB4RDQsIDB4MDAsIDB4MDAsIDB4RUIsIDB4QjYsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4RDcsIDB4QTEsIDB4Q0IsIDB4RTgsIDB4MDAsIDB4MDAsIDB4RjksIDB4QUQsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RTksIDB4QUQsIDB4RDgsIDB4RTQsIDB4RkEsIDB4QjMsIDB4RTIsIDB4QzUsIC8qIDB4ODAtMHg4MyAqLworCTB4RkMsIDB4QkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4QzQsIC8qIDB4ODQtMHg4NyAqLworCTB4RDgsIDB4QjEsIDB4MDAsIDB4MDAsIDB4REMsIDB4QUIsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4QTQsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4RUIsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkIsIDB4QUUsIDB4RDEsIDB4RTEsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4QzAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4RjUsIDB4QkUsIDB4MDAsIDB4MDAsIDB4REUsIDB4RjcsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4RkIsIC8qIDB4QUMtMHhBRiAqLworCTB4RjcsIDB4QzYsIDB4Q0YsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4RUUsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4RjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4RjQsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4Q0QsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4Q0YsIDB4REIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4REQsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4QUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4RTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzkxWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhDNywgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHhEQiwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHhGQSwgMHhDMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhERSwgMHhBOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENCwgMHhGOCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHhFRiwgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhCMywgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhFQiwgMHhCNywgMHhFRiwgMHhGOCwgMHhGNSwgMHhEQywgLyogMHg0OC0weDRCICovCisJMHhFRCwgMHhDQywgMHhEQiwgMHhENSwgMHhGMSwgMHhDRiwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhEMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHhCMiwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhEOSwgMHhBRSwgMHhENSwgMHhBQywgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhFMiwgMHhDNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhGRCwgMHhBMywgMHgwMCwgMHgwMCwgMHhGQiwgMHhFNSwgLyogMHg3NC0weDc3ICovCisJMHhERiwgMHhBQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhGNSwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhBRCwgMHgwMCwgMHgwMCwgMHhGNSwgMHhCMywgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhBNSwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhGNSwgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQywgMHhBMiwgLyogMHhBOC0weEFCICovCisJMHhFRCwgMHhGRCwgMHgwMCwgMHgwMCwgMHhGNSwgMHhCNCwgMHhGQiwgMHhCOCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhEQiwgMHhBMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHhENiwgMHhDQSwgMHhDQiwgMHhEOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhFNSwgMHhENCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHhGQSwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhFQiwgMHhCOCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhCNywgLyogMHhDOC0weENCICovCisJMHhENywgMHhFQywgMHhGMSwgMHhFQywgMHhFNSwgMHhBRiwgMHhENSwgMHhFMSwgLyogMHhDQy0weENGICovCisJMHhENywgMHhFRCwgMHhEMSwgMHhEMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhGMiwgLyogMHhENC0weEQ3ICovCisJMHhFRiwgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhERCwgMHhCQywgMHhGNiwgMHhEQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhFNSwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhDNCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhFOSwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHhGMywgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTJbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEQ0LCAweEVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweENDLCAweEEyLCAweEY3LCAweEZFLCAweERGLCAweEJDLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVCLCAweENELCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEI3LCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweEQ2LCAweEMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEFELCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEFGLCAvKiAweDNDLTB4M0YgKi8KKwkweENCLCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweENCLCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweEZBLCAweEU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweEM2LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEU3LCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweEM3LCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERCLCAweEE0LCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweENGLCAweEM5LCAweEUyLCAweEZDLCAweEVGLCAweEZBLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEVCLCAweERFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweEM4LCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweEQ0LCAweERFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweEQ1LCAweDAwLCAweDAwLCAweEVGLCAweEIwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEM3LCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweEQ5LCAweEFGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEY5LCAweEU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEU1LCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENGLCAweENBLCAweEUxLCAweEQxLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEM4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEVGLCAweEZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweEY5LCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERDLCAweEYyLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweEUwLCAweEE3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY4LCAweEU4LCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweENCLCAweEVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweENCLCAweEJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185M1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RDYsIDB4RTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4RjUsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4RjUsIDB4REYsIDB4MDAsIDB4MDAsIDB4RUUsIDB4QjYsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RjYsIDB4RDMsIDB4Q0EsIC8qIDB4MUMtMHgxRiAqLworCTB4RUYsIDB4RkMsIDB4RDEsIDB4QzQsIDB4RUYsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4RDEsIDB4QzUsIDB4MDAsIDB4MDAsIDB4RDAsIDB4REUsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4RDksIDB4RTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QjgsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4RDEsIDB4RjMsIDB4QjksIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RTcsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4RDYsIDB4QTgsIDB4Q0UsIDB4QTcsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4RTQsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4QjQsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUIsIDB4QjksIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4RjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4RjYsIDB4REQsIDB4MDAsIDB4MDAsIDB4RjEsIDB4QTMsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4Q0MsIDB4QzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4RTksIDB4Q0EsIDB4MDAsIDB4MDAsIDB4RTEsIDB4RjAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjUsIDB4RTAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkIsIDB4QUYsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4RDEsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4RkIsIDB4RTAsIDB4RjIsIDB4RTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4RUMsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4RUMsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4RUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4Q0IsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4RDcsIDB4QUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjMsIDB4QTEsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzk0WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhGQywgMHhGNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhGMSwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhENiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhCMiwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhGNCwgMHhEMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhGNywgMHhBMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhGMSwgMHhEMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHhDQSwgMHhGQywgMHhDQSwgMHhGRCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhDRSwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhGMywgMHhDOCwgMHgwMCwgMHgwMCwgMHhGMywgMHhCQSwgLyogMHg3Qy0weDdGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTVbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEZFLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweERBLCAweEE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEVDLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweENELCAweDAwLCAweDAwLCAweENCLCAweEQyLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVCLCAweENFLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEY5LCAweEQ4LCAweEY5LCAweEQ5LCAweENBLCAweEUwLCAvKiAweDkwLTB4OTMgKi8KKwkweERBLCAweENBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweENCLCAweEE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEM4LCAvKiAweEEwLTB4QTMgKi8KKwkweEY5LCAweEVFLCAweERCLCAweEVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEQwLCAweEIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweEQ1LCAweEVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEEyLCAvKiAweEI4LTB4QkIgKi8KKwkweEU0LCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEUxLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZDLCAweEM0LCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEY5LCAweEVGLCAweENGLCAweEY0LCAweEY3LCAweEU2LCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweENFLCAweEJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweEM1LCAweERDLCAweEEzLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185Nls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4REQsIDB4QkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4RjQsIDB4QzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4QTEsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RDYsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4QzEsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4RTYsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QjksIC8qIDB4M0MtMHgzRiAqLworCTB4RjYsIDB4RUQsIDB4MDAsIDB4MDAsIDB4RjksIDB4QUUsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4REQsIDB4QkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4QjAsIC8qIDB4NDgtMHg0QiAqLworCTB4RDgsIDB4RTgsIDB4Q0IsIDB4QkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4RjksIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4Q0UsIC8qIDB4NTgtMHg1QiAqLworCTB4RjksIDB4RjAsIDB4RTAsIDB4RUQsIDB4RTMsIDB4QjMsIDB4RjQsIDB4QjMsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4QzIsIDB4RjIsIDB4RTYsIC8qIDB4NjAtMHg2MyAqLworCTB4RjAsIDB4QjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4RDYsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4RUIsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4RTcsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4RDUsIDB4RDQsIDB4QjYsIDB4RjksIDB4RTgsIC8qIDB4NzQtMHg3NyAqLworCTB4RDcsIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4RUEsIDB4RDcsIDB4Q0MsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4RTksIDB4RTIsIDB4QzksIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4RkMsIDB4REIsIDB4Q0QsIDB4QUQsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4Q0MsIDB4QjAsIDB4RUEsIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4RTQsIDB4RjYsIDB4RDAsIDB4QzAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4QjcsIC8qIDB4OTgtMHg5QiAqLworCTB4RUUsIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4RjYsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4Q0EsIC8qIDB4QTQtMHhBNyAqLworCTB4RTIsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4RkEsIDB4Q0YsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4RUIsIDB4REYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4Q0IsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4QjQsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4RUQsIDB4Q0QsIDB4RTQsIDB4RDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RUEsIDB4QTksIDB4RTQsIDB4QkEsIDB4RjMsIDB4QTIsIDB4Q0QsIDB4RDIsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4RjEsIDB4RTYsIC8qIDB4QzgtMHhDQiAqLworCTB4RUQsIDB4QzEsIDB4RTgsIDB4QkMsIDB4RUUsIDB4RDEsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4RjAsIDB4RTcsIDB4RTIsIDB4Q0MsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4QUEsIDB4MDAsIDB4MDAsIDB4RjUsIDB4RTEsIC8qIDB4RDgtMHhEQiAqLworCTB4RUQsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4RUUsIDB4RDEsIDB4RjEsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4RTksIDB4RUIsIDB4RTksIDB4RUMsIDB4RTAsIDB4RTQsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4QTcsIC8qIDB4RUMtMHhFRiAqLworCTB4REQsIDB4RDQsIDB4MDAsIDB4MDAsIDB4RUEsIDB4QTMsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4QzMsIDB4RDYsIDB4RjQsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4REEsIDB4REYsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QjMsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzk3WzUxMl0gPSB7CisJMHhFMiwgMHhDRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhGRCwgMHhGMiwgMHhFOCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhFRiwgMHhDNSwgMHgwMCwgMHgwMCwgMHhFNywgMHhFNywgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhGRCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhERiwgMHhEQywgMHgwMCwgMHgwMCwgMHhGOSwgMHhDNywgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhGNiwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhERiwgMHhBQywgMHgwMCwgMHgwMCwgMHhENiwgMHhEQSwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhGQSwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhFNCwgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhENiwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHhGNCwgMHhFQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhGRSwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHhGMCwgMHhBMSwgMHgwMCwgMHgwMCwgMHhERSwgMHhBQSwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhEQSwgMHhCQywgMHhEOCwgMHhGQywgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhGQSwgMHhENCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhFQywgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhGQywgMHhBOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQywgMHhFNiwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhDQiwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhCOSwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhEMywgMHgwMCwgMHgwMCwgMHhDRCwgMHhGOSwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhDRiwgMHhEMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhDQSwgMHhFQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhENCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhDNywgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhERiwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhEQiwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhENCwgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQiwgMHhFNSwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhEMiwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhBNCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQSwgMHhDMiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOThbNTEyXSA9IHsKKwkweEZCLCAweEUxLCAweEZBLCAweEVELCAweEYwLCAweEEyLCAweENDLCAweEYxLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEZBLCAweEEzLCAweEUyLCAweEY3LCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEUyLCAweENFLCAweDAwLCAweDAwLCAweEU5LCAweEY1LCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEUxLCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEU3LCAweEU4LCAweEU4LCAweEQ3LCAweERBLCAweEY4LCAweEQ0LCAweENCLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY3LCAweEY2LCAvKiAweDE0LTB4MTcgKi8KKwkweEQ2LCAweEM1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweEQ0LCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEZBLCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweENDLCAweEYyLCAweEY3LCAweERELCAweDAwLCAweDAwLCAweERFLCAweEJBLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweEE4LCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEYwLCAweEI5LCAweEU0LCAweEZFLCAweEU0LCAweEM5LCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweEU0LCAweEQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEVBLCAweEMzLCAweDAwLCAweDAwLCAweEVGLCAweEI0LCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweEJFLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweEZCLCAweEUyLCAweDAwLCAweDAwLCAweENELCAweEQzLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEI1LCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweEU5LCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEY5LCAweEE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweEJELCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEY3LCAweEM3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEY4LCAweEZELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY4LCAweEZDLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweEFCLCAvKiAweEQ4LTB4REIgKi8KKwkweERCLCAweEU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweERELCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEUyLCAweEQxLCAweEM2LCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEQwLCAweEVCLCAweEU2LCAweERBLCAweEY5LCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEVDLCAweEM3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweERFLCAweEY4LCAweEY4LCAweEU5LCAweEUzLCAweERFLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185OVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4RjUsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4RkEsIDB4QzMsIDB4RTUsIDB4RDcsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4RUMsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4RjMsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QkIsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4RTYsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QjYsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4REMsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4Q0UsIDB4QkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4RDAsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4RkEsIC8qIDB4NDgtMHg0QiAqLworCTB4RjMsIDB4Q0EsIDB4RTAsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4RDEsIDB4QzcsIDB4RTksIDB4QUUsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4RTgsIDB4QkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkEsIDB4QzQsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4Q0YsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4RkEsIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4RjksIDB4QjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4REMsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4RkIsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4RDgsIDB4QTksIDB4RTUsIDB4REYsIDB4RjksIDB4QTcsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4RUUsIDB4MDAsIDB4MDAsIDB4RjYsIDB4Q0MsIC8qIDB4QjAtMHhCMyAqLworCTB4RTIsIDB4RjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RUMsIDB4RjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4REEsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4RjEsIDB4RDIsIDB4RDIsIDB4Q0MsIDB4Q0YsIDB4Q0IsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4Q0EsIDB4QkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4REQsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4RUYsIDB4MDAsIDB4MDAsIDB4REUsIDB4RjksIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4RkEsIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjEsIDB4RTcsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzlBWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhERSwgMHhCRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhEQywgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHhDOCwgMHhEMSwgMHhDOSwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhCRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhGNiwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhENCwgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHhFMiwgMHhFMSwgMHhEMywgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhEOCwgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhGRSwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhDRiwgMHhDQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHhGRCwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhDRSwgMHhGNiwgMHgwMCwgMHgwMCwgMHhGQSwgMHhEMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQywgMHhGMywgMHhFNiwgMHhCRSwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNiwgMHhBRSwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhGMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhEMSwgMHhDQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhGQywgMHhCRSwgMHhENSwgMHhGMSwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhDRCwgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhGQSwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhEMCwgLyogMHhEMC0weEQzICovCisJMHhGNCwgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhDRCwgMHhENCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHhBMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhBNSwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOUJbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEQxLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweEEyLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY3LCAweEUzLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweEE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweEQwLCAweEExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweENFLCAweERBLCAweEZCLCAweEVCLCAweERCLCAweEE2LCAvKiAweDQwLTB4NDMgKi8KKwkweERCLCAweERFLCAweEQ4LCAweEU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweEUwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweEQ4LCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEUwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweERCLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEM2LCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEQ1LCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweEY3LCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEQ4LCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEQ3LCAweEVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweEVELCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweENELCAweEU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweENDLCAweEY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185Q1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4RTQsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4REMsIDB4RTEsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4RjksIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4RkMsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4QTcsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4QzQsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4QkUsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4REMsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4RjcsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4RjAsIDB4RTgsIDB4MDAsIDB4MDAsIDB4REQsIDB4QzAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4Q0YsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4RjMsIC8qIDB4RjAtMHhGMyAqLworCTB4RDksIDB4QjAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4RTksIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzlEWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhCQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhDNCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhFQywgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhFNCwgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhGOCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHhDQywgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhDRCwgMHhEQywgMHhEOSwgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhERCwgMHhERiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhDRSwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHhEOSwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhBMywgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHhGOSwgMHhDRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhDRCwgMHhBRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhDRSwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNiwgMHhBRiwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHhGRCwgMHhEMywgMHhFQiwgMHhFRCwgMHhENiwgMHhEQywgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOUVbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEE0LCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEI2LCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEQ2LCAweERELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEY5LCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweEE0LCAweDAwLCAweDAwLCAweEQ2LCAweEUzLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQxLCAweENCLCAweEQ2LCAweEU0LCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEYyLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweERFLCAweEZBLCAweDAwLCAweDAwLCAweEQ3LCAweEY4LCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweEQ4LCAweEVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweENGLCAweEQ1LCAweEQ4LCAweEZELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweEFCLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweENCLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZDLCAweERDLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweEE4LCAweEQ1LCAweEYzLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEZELCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweENDLCAweEEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEQ5LCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEVBLCAvKiAweEQ4LTB4REIgKi8KKwkweEY1LCAweEY1LCAweDAwLCAweDAwLCAweEVGLCAweEM3LCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEQzLCAweERBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweERBLCAweEJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185Rls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4QTgsIC8qIDB4MDQtMHgwNyAqLworCTB4REMsIDB4QUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4QTMsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4RDUsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4RTAsIDB4QTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4QUMsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4QkEsIDB4RUUsIDB4QjEsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4QjIsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjYsIDB4Q0QsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4RDIsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4RDYsIDB4QzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RTUsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjMsIDB4QkIsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4RTUsIDB4RTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4Q0IsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4QTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4REIsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4Q0EsIDB4RkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4Q0YsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0FDWzUxMl0gPSB7CisJMHhCMCwgMHhBMSwgMHhCMCwgMHhBMiwgMHg4MSwgMHg0MSwgMHg4MSwgMHg0MiwgLyogMHgwMC0weDAzICovCisJMHhCMCwgMHhBMywgMHg4MSwgMHg0MywgMHg4MSwgMHg0NCwgMHhCMCwgMHhBNCwgLyogMHgwNC0weDA3ICovCisJMHhCMCwgMHhBNSwgMHhCMCwgMHhBNiwgMHhCMCwgMHhBNywgMHg4MSwgMHg0NSwgLyogMHgwOC0weDBCICovCisJMHg4MSwgMHg0NiwgMHg4MSwgMHg0NywgMHg4MSwgMHg0OCwgMHg4MSwgMHg0OSwgLyogMHgwQy0weDBGICovCisJMHhCMCwgMHhBOCwgMHhCMCwgMHhBOSwgMHhCMCwgMHhBQSwgMHhCMCwgMHhBQiwgLyogMHgxMC0weDEzICovCisJMHhCMCwgMHhBQywgMHhCMCwgMHhBRCwgMHhCMCwgMHhBRSwgMHhCMCwgMHhBRiwgLyogMHgxNC0weDE3ICovCisJMHg4MSwgMHg0QSwgMHhCMCwgMHhCMCwgMHhCMCwgMHhCMSwgMHhCMCwgMHhCMiwgLyogMHgxOC0weDFCICovCisJMHhCMCwgMHhCMywgMHhCMCwgMHhCNCwgMHg4MSwgMHg0QiwgMHg4MSwgMHg0QywgLyogMHgxQy0weDFGICovCisJMHhCMCwgMHhCNSwgMHg4MSwgMHg0RCwgMHg4MSwgMHg0RSwgMHg4MSwgMHg0RiwgLyogMHgyMC0weDIzICovCisJMHhCMCwgMHhCNiwgMHg4MSwgMHg1MCwgMHg4MSwgMHg1MSwgMHg4MSwgMHg1MiwgLyogMHgyNC0weDI3ICovCisJMHg4MSwgMHg1MywgMHg4MSwgMHg1NCwgMHg4MSwgMHg1NSwgMHg4MSwgMHg1NiwgLyogMHgyOC0weDJCICovCisJMHhCMCwgMHhCNywgMHhCMCwgMHhCOCwgMHg4MSwgMHg1NywgMHhCMCwgMHhCOSwgLyogMHgyQy0weDJGICovCisJMHhCMCwgMHhCQSwgMHhCMCwgMHhCQiwgMHg4MSwgMHg1OCwgMHg4MSwgMHg1OSwgLyogMHgzMC0weDMzICovCisJMHg4MSwgMHg1QSwgMHg4MSwgMHg2MSwgMHg4MSwgMHg2MiwgMHg4MSwgMHg2MywgLyogMHgzNC0weDM3ICovCisJMHhCMCwgMHhCQywgMHhCMCwgMHhCRCwgMHg4MSwgMHg2NCwgMHg4MSwgMHg2NSwgLyogMHgzOC0weDNCICovCisJMHhCMCwgMHhCRSwgMHg4MSwgMHg2NiwgMHg4MSwgMHg2NywgMHg4MSwgMHg2OCwgLyogMHgzQy0weDNGICovCisJMHhCMCwgMHhCRiwgMHg4MSwgMHg2OSwgMHg4MSwgMHg2QSwgMHg4MSwgMHg2QiwgLyogMHg0MC0weDQzICovCisJMHg4MSwgMHg2QywgMHg4MSwgMHg2RCwgMHg4MSwgMHg2RSwgMHg4MSwgMHg2RiwgLyogMHg0NC0weDQ3ICovCisJMHg4MSwgMHg3MCwgMHg4MSwgMHg3MSwgMHg4MSwgMHg3MiwgMHhCMCwgMHhDMCwgLyogMHg0OC0weDRCICovCisJMHg4MSwgMHg3MywgMHhCMCwgMHhDMSwgMHg4MSwgMHg3NCwgMHg4MSwgMHg3NSwgLyogMHg0Qy0weDRGICovCisJMHg4MSwgMHg3NiwgMHg4MSwgMHg3NywgMHg4MSwgMHg3OCwgMHg4MSwgMHg3OSwgLyogMHg1MC0weDUzICovCisJMHhCMCwgMHhDMiwgMHg4MSwgMHg3QSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MiwgLyogMHg1NC0weDU3ICovCisJMHhCMCwgMHhDMywgMHg4MSwgMHg4MywgMHg4MSwgMHg4NCwgMHg4MSwgMHg4NSwgLyogMHg1OC0weDVCICovCisJMHhCMCwgMHhDNCwgMHg4MSwgMHg4NiwgMHg4MSwgMHg4NywgMHg4MSwgMHg4OCwgLyogMHg1Qy0weDVGICovCisJMHg4MSwgMHg4OSwgMHg4MSwgMHg4QSwgMHg4MSwgMHg4QiwgMHg4MSwgMHg4QywgLyogMHg2MC0weDYzICovCisJMHg4MSwgMHg4RCwgMHg4MSwgMHg4RSwgMHg4MSwgMHg4RiwgMHg4MSwgMHg5MCwgLyogMHg2NC0weDY3ICovCisJMHg4MSwgMHg5MSwgMHg4MSwgMHg5MiwgMHg4MSwgMHg5MywgMHg4MSwgMHg5NCwgLyogMHg2OC0weDZCICovCisJMHg4MSwgMHg5NSwgMHg4MSwgMHg5NiwgMHg4MSwgMHg5NywgMHg4MSwgMHg5OCwgLyogMHg2Qy0weDZGICovCisJMHhCMCwgMHhDNSwgMHhCMCwgMHhDNiwgMHg4MSwgMHg5OSwgMHg4MSwgMHg5QSwgLyogMHg3MC0weDczICovCisJMHhCMCwgMHhDNywgMHg4MSwgMHg5QiwgMHg4MSwgMHg5QywgMHhCMCwgMHhDOCwgLyogMHg3NC0weDc3ICovCisJMHhCMCwgMHhDOSwgMHg4MSwgMHg5RCwgMHhCMCwgMHhDQSwgMHg4MSwgMHg5RSwgLyogMHg3OC0weDdCICovCisJMHg4MSwgMHg5RiwgMHg4MSwgMHhBMCwgMHg4MSwgMHhBMSwgMHg4MSwgMHhBMiwgLyogMHg3Qy0weDdGICovCisJCisJMHhCMCwgMHhDQiwgMHhCMCwgMHhDQywgMHg4MSwgMHhBMywgMHhCMCwgMHhDRCwgLyogMHg4MC0weDgzICovCisJMHhCMCwgMHhDRSwgMHhCMCwgMHhDRiwgMHhCMCwgMHhEMCwgMHg4MSwgMHhBNCwgLyogMHg4NC0weDg3ICovCisJMHg4MSwgMHhBNSwgMHhCMCwgMHhEMSwgMHhCMCwgMHhEMiwgMHhCMCwgMHhEMywgLyogMHg4OC0weDhCICovCisJMHhCMCwgMHhENCwgMHg4MSwgMHhBNiwgMHg4MSwgMHhBNywgMHg4MSwgMHhBOCwgLyogMHg4Qy0weDhGICovCisJMHhCMCwgMHhENSwgMHg4MSwgMHhBOSwgMHg4MSwgMHhBQSwgMHg4MSwgMHhBQiwgLyogMHg5MC0weDkzICovCisJMHhCMCwgMHhENiwgMHg4MSwgMHhBQywgMHg4MSwgMHhBRCwgMHg4MSwgMHhBRSwgLyogMHg5NC0weDk3ICovCisJMHg4MSwgMHhBRiwgMHg4MSwgMHhCMCwgMHg4MSwgMHhCMSwgMHg4MSwgMHhCMiwgLyogMHg5OC0weDlCICovCisJMHhCMCwgMHhENywgMHhCMCwgMHhEOCwgMHg4MSwgMHhCMywgMHhCMCwgMHhEOSwgLyogMHg5Qy0weDlGICovCisJMHhCMCwgMHhEQSwgMHhCMCwgMHhEQiwgMHg4MSwgMHhCNCwgMHg4MSwgMHhCNSwgLyogMHhBMC0weEEzICovCisJMHg4MSwgMHhCNiwgMHg4MSwgMHhCNywgMHg4MSwgMHhCOCwgMHg4MSwgMHhCOSwgLyogMHhBNC0weEE3ICovCisJMHhCMCwgMHhEQywgMHhCMCwgMHhERCwgMHhCMCwgMHhERSwgMHg4MSwgMHhCQSwgLyogMHhBOC0weEFCICovCisJMHhCMCwgMHhERiwgMHg4MSwgMHhCQiwgMHg4MSwgMHhCQywgMHhCMCwgMHhFMCwgLyogMHhBQy0weEFGICovCisJMHhCMCwgMHhFMSwgMHg4MSwgMHhCRCwgMHg4MSwgMHhCRSwgMHg4MSwgMHhCRiwgLyogMHhCMC0weEIzICovCisJMHg4MSwgMHhDMCwgMHg4MSwgMHhDMSwgMHg4MSwgMHhDMiwgMHg4MSwgMHhDMywgLyogMHhCNC0weEI3ICovCisJMHhCMCwgMHhFMiwgMHhCMCwgMHhFMywgMHg4MSwgMHhDNCwgMHhCMCwgMHhFNCwgLyogMHhCOC0weEJCICovCisJMHhCMCwgMHhFNSwgMHhCMCwgMHhFNiwgMHg4MSwgMHhDNSwgMHg4MSwgMHhDNiwgLyogMHhCQy0weEJGICovCisJMHg4MSwgMHhDNywgMHhCMCwgMHhFNywgMHg4MSwgMHhDOCwgMHg4MSwgMHhDOSwgLyogMHhDMC0weEMzICovCisJMHhCMCwgMHhFOCwgMHg4MSwgMHhDQSwgMHg4MSwgMHhDQiwgMHg4MSwgMHhDQywgLyogMHhDNC0weEM3ICovCisJMHhCMCwgMHhFOSwgMHg4MSwgMHhDRCwgMHg4MSwgMHhDRSwgMHg4MSwgMHhDRiwgLyogMHhDOC0weENCICovCisJMHhCMCwgMHhFQSwgMHg4MSwgMHhEMCwgMHg4MSwgMHhEMSwgMHg4MSwgMHhEMiwgLyogMHhDQy0weENGICovCisJMHg4MSwgMHhEMywgMHg4MSwgMHhENCwgMHg4MSwgMHhENSwgMHg4MSwgMHhENiwgLyogMHhEMC0weEQzICovCisJMHg4MSwgMHhENywgMHhCMCwgMHhFQiwgMHg4MSwgMHhEOCwgMHhCMCwgMHhFQywgLyogMHhENC0weEQ3ICovCisJMHg4MSwgMHhEOSwgMHg4MSwgMHhEQSwgMHg4MSwgMHhEQiwgMHg4MSwgMHhEQywgLyogMHhEOC0weERCICovCisJMHg4MSwgMHhERCwgMHg4MSwgMHhERSwgMHg4MSwgMHhERiwgMHg4MSwgMHhFMCwgLyogMHhEQy0weERGICovCisJMHhCMCwgMHhFRCwgMHhCMCwgMHhFRSwgMHg4MSwgMHhFMSwgMHg4MSwgMHhFMiwgLyogMHhFMC0weEUzICovCisJMHhCMCwgMHhFRiwgMHg4MSwgMHhFMywgMHg4MSwgMHhFNCwgMHhCMCwgMHhGMCwgLyogMHhFNC0weEU3ICovCisJMHhCMCwgMHhGMSwgMHg4MSwgMHhFNSwgMHhCMCwgMHhGMiwgMHg4MSwgMHhFNiwgLyogMHhFOC0weEVCICovCisJMHhCMCwgMHhGMywgMHg4MSwgMHhFNywgMHg4MSwgMHhFOCwgMHhCMCwgMHhGNCwgLyogMHhFQy0weEVGICovCisJMHhCMCwgMHhGNSwgMHhCMCwgMHhGNiwgMHg4MSwgMHhFOSwgMHhCMCwgMHhGNywgLyogMHhGMC0weEYzICovCisJMHg4MSwgMHhFQSwgMHhCMCwgMHhGOCwgMHhCMCwgMHhGOSwgMHg4MSwgMHhFQiwgLyogMHhGNC0weEY3ICovCisJMHg4MSwgMHhFQywgMHg4MSwgMHhFRCwgMHg4MSwgMHhFRSwgMHg4MSwgMHhFRiwgLyogMHhGOC0weEZCICovCisJMHhCMCwgMHhGQSwgMHhCMCwgMHhGQiwgMHg4MSwgMHhGMCwgMHg4MSwgMHhGMSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQURbNTEyXSA9IHsKKwkweEIwLCAweEZDLCAweDgxLCAweEYyLCAweDgxLCAweEYzLCAweDgxLCAweEY0LCAvKiAweDAwLTB4MDMgKi8KKwkweEIwLCAweEZELCAweDgxLCAweEY1LCAweEIwLCAweEZFLCAweDgxLCAweEY2LCAvKiAweDA0LTB4MDcgKi8KKwkweDgxLCAweEY3LCAweDgxLCAweEY4LCAweDgxLCAweEY5LCAweDgxLCAweEZBLCAvKiAweDA4LTB4MEIgKi8KKwkweEIxLCAweEExLCAweEIxLCAweEEyLCAweDgxLCAweEZCLCAweEIxLCAweEEzLCAvKiAweDBDLTB4MEYgKi8KKwkweDgxLCAweEZDLCAweEIxLCAweEE0LCAweDgxLCAweEZELCAweDgxLCAweEZFLCAvKiAweDEwLTB4MTMgKi8KKwkweDgyLCAweDQxLCAweDgyLCAweDQyLCAweDgyLCAweDQzLCAweDgyLCAweDQ0LCAvKiAweDE0LTB4MTcgKi8KKwkweEIxLCAweEE1LCAweDgyLCAweDQ1LCAweDgyLCAweDQ2LCAweDgyLCAweDQ3LCAvKiAweDE4LTB4MUIgKi8KKwkweEIxLCAweEE2LCAweDgyLCAweDQ4LCAweDgyLCAweDQ5LCAweDgyLCAweDRBLCAvKiAweDFDLTB4MUYgKi8KKwkweEIxLCAweEE3LCAweDgyLCAweDRCLCAweDgyLCAweDRDLCAweDgyLCAweDRELCAvKiAweDIwLTB4MjMgKi8KKwkweDgyLCAweDRFLCAweDgyLCAweDRGLCAweDgyLCAweDUwLCAweDgyLCAweDUxLCAvKiAweDI0LTB4MjcgKi8KKwkweDgyLCAweDUyLCAweEIxLCAweEE4LCAweDgyLCAweDUzLCAweDgyLCAweDU0LCAvKiAweDI4LTB4MkIgKi8KKwkweEIxLCAweEE5LCAweEIxLCAweEFBLCAweDgyLCAweDU1LCAweDgyLCAweDU2LCAvKiAweDJDLTB4MkYgKi8KKwkweDgyLCAweDU3LCAweDgyLCAweDU4LCAweDgyLCAweDU5LCAweDgyLCAweDVBLCAvKiAweDMwLTB4MzMgKi8KKwkweEIxLCAweEFCLCAweEIxLCAweEFDLCAweDgyLCAweDYxLCAweDgyLCAweDYyLCAvKiAweDM0LTB4MzcgKi8KKwkweEIxLCAweEFELCAweDgyLCAweDYzLCAweDgyLCAweDY0LCAweDgyLCAweDY1LCAvKiAweDM4LTB4M0IgKi8KKwkweEIxLCAweEFFLCAweDgyLCAweDY2LCAweDgyLCAweDY3LCAweDgyLCAweDY4LCAvKiAweDNDLTB4M0YgKi8KKwkweDgyLCAweDY5LCAweDgyLCAweDZBLCAweDgyLCAweDZCLCAweDgyLCAweDZDLCAvKiAweDQwLTB4NDMgKi8KKwkweEIxLCAweEFGLCAweEIxLCAweEIwLCAweDgyLCAweDZELCAweEIxLCAweEIxLCAvKiAweDQ0LTB4NDcgKi8KKwkweDgyLCAweDZFLCAweEIxLCAweEIyLCAweDgyLCAweDZGLCAweDgyLCAweDcwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDgyLCAweDcxLCAweDgyLCAweDcyLCAweDgyLCAweDczLCAweDgyLCAweDc0LCAvKiAweDRDLTB4NEYgKi8KKwkweEIxLCAweEIzLCAweDgyLCAweDc1LCAweDgyLCAweDc2LCAweDgyLCAweDc3LCAvKiAweDUwLTB4NTMgKi8KKwkweEIxLCAweEI0LCAweDgyLCAweDc4LCAweDgyLCAweDc5LCAweDgyLCAweDdBLCAvKiAweDU0LTB4NTcgKi8KKwkweEIxLCAweEI1LCAweDgyLCAweDgxLCAweDgyLCAweDgyLCAweDgyLCAweDgzLCAvKiAweDU4LTB4NUIgKi8KKwkweDgyLCAweDg0LCAweDgyLCAweDg1LCAweDgyLCAweDg2LCAweDgyLCAweDg3LCAvKiAweDVDLTB4NUYgKi8KKwkweDgyLCAweDg4LCAweEIxLCAweEI2LCAweDgyLCAweDg5LCAweEIxLCAweEI3LCAvKiAweDYwLTB4NjMgKi8KKwkweDgyLCAweDhBLCAweDgyLCAweDhCLCAweDgyLCAweDhDLCAweDgyLCAweDhELCAvKiAweDY0LTB4NjcgKi8KKwkweDgyLCAweDhFLCAweDgyLCAweDhGLCAweDgyLCAweDkwLCAweDgyLCAweDkxLCAvKiAweDY4LTB4NkIgKi8KKwkweEIxLCAweEI4LCAweEIxLCAweEI5LCAweDgyLCAweDkyLCAweDgyLCAweDkzLCAvKiAweDZDLTB4NkYgKi8KKwkweEIxLCAweEJBLCAweDgyLCAweDk0LCAweDgyLCAweDk1LCAweEIxLCAweEJCLCAvKiAweDcwLTB4NzMgKi8KKwkweEIxLCAweEJDLCAweEIxLCAweEJELCAweEIxLCAweEJFLCAweDgyLCAweDk2LCAvKiAweDc0LTB4NzcgKi8KKwkweDgyLCAweDk3LCAweDgyLCAweDk4LCAweDgyLCAweDk5LCAweEIxLCAweEJGLCAvKiAweDc4LTB4N0IgKi8KKwkweEIxLCAweEMwLCAweEIxLCAweEMxLCAweDgyLCAweDlBLCAweEIxLCAweEMyLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDgyLCAweDlCLCAweEIxLCAweEMzLCAweEIxLCAweEM0LCAweDgyLCAweDlDLCAvKiAweDgwLTB4ODMgKi8KKwkweDgyLCAweDlELCAweDgyLCAweDlFLCAweDgyLCAweDlGLCAweDgyLCAweEEwLCAvKiAweDg0LTB4ODcgKi8KKwkweEIxLCAweEM1LCAweEIxLCAweEM2LCAweDgyLCAweEExLCAweDgyLCAweEEyLCAvKiAweDg4LTB4OEIgKi8KKwkweEIxLCAweEM3LCAweDgyLCAweEEzLCAweDgyLCAweEE0LCAweDgyLCAweEE1LCAvKiAweDhDLTB4OEYgKi8KKwkweEIxLCAweEM4LCAweDgyLCAweEE2LCAweDgyLCAweEE3LCAweDgyLCAweEE4LCAvKiAweDkwLTB4OTMgKi8KKwkweDgyLCAweEE5LCAweDgyLCAweEFBLCAweDgyLCAweEFCLCAweDgyLCAweEFDLCAvKiAweDk0LTB4OTcgKi8KKwkweDgyLCAweEFELCAweDgyLCAweEFFLCAweDgyLCAweEFGLCAweDgyLCAweEIwLCAvKiAweDk4LTB4OUIgKi8KKwkweEIxLCAweEM5LCAweEIxLCAweENBLCAweDgyLCAweEIxLCAweDgyLCAweEIyLCAvKiAweDlDLTB4OUYgKi8KKwkweDgyLCAweEIzLCAweDgyLCAweEI0LCAweDgyLCAweEI1LCAweDgyLCAweEI2LCAvKiAweEEwLTB4QTMgKi8KKwkweEIxLCAweENCLCAweDgyLCAweEI3LCAweDgyLCAweEI4LCAweDgyLCAweEI5LCAvKiAweEE0LTB4QTcgKi8KKwkweDgyLCAweEJBLCAweDgyLCAweEJCLCAweDgyLCAweEJDLCAweDgyLCAweEJELCAvKiAweEE4LTB4QUIgKi8KKwkweDgyLCAweEJFLCAweDgyLCAweEJGLCAweDgyLCAweEMwLCAweDgyLCAweEMxLCAvKiAweEFDLTB4QUYgKi8KKwkweDgyLCAweEMyLCAweDgyLCAweEMzLCAweDgyLCAweEM0LCAweDgyLCAweEM1LCAvKiAweEIwLTB4QjMgKi8KKwkweDgyLCAweEM2LCAweDgyLCAweEM3LCAweDgyLCAweEM4LCAweEIxLCAweENDLCAvKiAweEI0LTB4QjcgKi8KKwkweDgyLCAweEM5LCAweDgyLCAweENBLCAweDgyLCAweENCLCAweDgyLCAweENDLCAvKiAweEI4LTB4QkIgKi8KKwkweDgyLCAweENELCAweDgyLCAweENFLCAweDgyLCAweENGLCAweDgyLCAweEQwLCAvKiAweEJDLTB4QkYgKi8KKwkweEIxLCAweENELCAweEIxLCAweENFLCAweDgyLCAweEQxLCAweDgyLCAweEQyLCAvKiAweEMwLTB4QzMgKi8KKwkweEIxLCAweENGLCAweDgyLCAweEQzLCAweDgyLCAweEQ0LCAweDgyLCAweEQ1LCAvKiAweEM0LTB4QzcgKi8KKwkweEIxLCAweEQwLCAweDgyLCAweEQ2LCAweDgyLCAweEQ3LCAweDgyLCAweEQ4LCAvKiAweEM4LTB4Q0IgKi8KKwkweDgyLCAweEQ5LCAweDgyLCAweERBLCAweDgyLCAweERCLCAweDgyLCAweERDLCAvKiAweENDLTB4Q0YgKi8KKwkweEIxLCAweEQxLCAweEIxLCAweEQyLCAweDgyLCAweERELCAweEIxLCAweEQzLCAvKiAweEQwLTB4RDMgKi8KKwkweDgyLCAweERFLCAweDgyLCAweERGLCAweDgyLCAweEUwLCAweDgyLCAweEUxLCAvKiAweEQ0LTB4RDcgKi8KKwkweDgyLCAweEUyLCAweDgyLCAweEUzLCAweDgyLCAweEU0LCAweDgyLCAweEU1LCAvKiAweEQ4LTB4REIgKi8KKwkweEIxLCAweEQ0LCAweDgyLCAweEU2LCAweDgyLCAweEU3LCAweDgyLCAweEU4LCAvKiAweERDLTB4REYgKi8KKwkweEIxLCAweEQ1LCAweDgyLCAweEU5LCAweDgyLCAweEVBLCAweDgyLCAweEVCLCAvKiAweEUwLTB4RTMgKi8KKwkweEIxLCAweEQ2LCAweDgyLCAweEVDLCAweDgyLCAweEVELCAweDgyLCAweEVFLCAvKiAweEU0LTB4RTcgKi8KKwkweDgyLCAweEVGLCAweDgyLCAweEYwLCAweDgyLCAweEYxLCAweDgyLCAweEYyLCAvKiAweEU4LTB4RUIgKi8KKwkweDgyLCAweEYzLCAweDgyLCAweEY0LCAweDgyLCAweEY1LCAweDgyLCAweEY2LCAvKiAweEVDLTB4RUYgKi8KKwkweDgyLCAweEY3LCAweDgyLCAweEY4LCAweDgyLCAweEY5LCAweDgyLCAweEZBLCAvKiAweEYwLTB4RjMgKi8KKwkweDgyLCAweEZCLCAweDgyLCAweEZDLCAweDgyLCAweEZELCAweDgyLCAweEZFLCAvKiAweEY0LTB4RjcgKi8KKwkweEIxLCAweEQ3LCAweEIxLCAweEQ4LCAweDgzLCAweDQxLCAweDgzLCAweDQyLCAvKiAweEY4LTB4RkIgKi8KKwkweEIxLCAweEQ5LCAweDgzLCAweDQzLCAweDgzLCAweDQ0LCAweEIxLCAweERBLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19BRVs1MTJdID0geworCTB4QjEsIDB4REIsIDB4QjEsIDB4REMsIDB4ODMsIDB4NDUsIDB4ODMsIDB4NDYsIC8qIDB4MDAtMHgwMyAqLworCTB4ODMsIDB4NDcsIDB4ODMsIDB4NDgsIDB4ODMsIDB4NDksIDB4ODMsIDB4NEEsIC8qIDB4MDQtMHgwNyAqLworCTB4QjEsIDB4REQsIDB4QjEsIDB4REUsIDB4ODMsIDB4NEIsIDB4QjEsIDB4REYsIC8qIDB4MDgtMHgwQiAqLworCTB4ODMsIDB4NEMsIDB4QjEsIDB4RTAsIDB4ODMsIDB4NEQsIDB4ODMsIDB4NEUsIC8qIDB4MEMtMHgwRiAqLworCTB4ODMsIDB4NEYsIDB4ODMsIDB4NTAsIDB4ODMsIDB4NTEsIDB4ODMsIDB4NTIsIC8qIDB4MTAtMHgxMyAqLworCTB4QjEsIDB4RTEsIDB4ODMsIDB4NTMsIDB4ODMsIDB4NTQsIDB4ODMsIDB4NTUsIC8qIDB4MTQtMHgxNyAqLworCTB4ODMsIDB4NTYsIDB4ODMsIDB4NTcsIDB4ODMsIDB4NTgsIDB4ODMsIDB4NTksIC8qIDB4MTgtMHgxQiAqLworCTB4ODMsIDB4NUEsIDB4ODMsIDB4NjEsIDB4ODMsIDB4NjIsIDB4ODMsIDB4NjMsIC8qIDB4MUMtMHgxRiAqLworCTB4ODMsIDB4NjQsIDB4ODMsIDB4NjUsIDB4ODMsIDB4NjYsIDB4ODMsIDB4NjcsIC8qIDB4MjAtMHgyMyAqLworCTB4ODMsIDB4NjgsIDB4ODMsIDB4NjksIDB4ODMsIDB4NkEsIDB4ODMsIDB4NkIsIC8qIDB4MjQtMHgyNyAqLworCTB4ODMsIDB4NkMsIDB4ODMsIDB4NkQsIDB4ODMsIDB4NkUsIDB4ODMsIDB4NkYsIC8qIDB4MjgtMHgyQiAqLworCTB4ODMsIDB4NzAsIDB4ODMsIDB4NzEsIDB4ODMsIDB4NzIsIDB4ODMsIDB4NzMsIC8qIDB4MkMtMHgyRiAqLworCTB4QjEsIDB4RTIsIDB4QjEsIDB4RTMsIDB4ODMsIDB4NzQsIDB4ODMsIDB4NzUsIC8qIDB4MzAtMHgzMyAqLworCTB4QjEsIDB4RTQsIDB4ODMsIDB4NzYsIDB4ODMsIDB4NzcsIDB4QjEsIDB4RTUsIC8qIDB4MzQtMHgzNyAqLworCTB4QjEsIDB4RTYsIDB4ODMsIDB4NzgsIDB4QjEsIDB4RTcsIDB4ODMsIDB4NzksIC8qIDB4MzgtMHgzQiAqLworCTB4ODMsIDB4N0EsIDB4ODMsIDB4ODEsIDB4ODMsIDB4ODIsIDB4ODMsIDB4ODMsIC8qIDB4M0MtMHgzRiAqLworCTB4QjEsIDB4RTgsIDB4QjEsIDB4RTksIDB4ODMsIDB4ODQsIDB4QjEsIDB4RUEsIC8qIDB4NDAtMHg0MyAqLworCTB4ODMsIDB4ODUsIDB4QjEsIDB4RUIsIDB4QjEsIDB4RUMsIDB4ODMsIDB4ODYsIC8qIDB4NDQtMHg0NyAqLworCTB4ODMsIDB4ODcsIDB4ODMsIDB4ODgsIDB4QjEsIDB4RUQsIDB4ODMsIDB4ODksIC8qIDB4NDgtMHg0QiAqLworCTB4QjEsIDB4RUUsIDB4QjEsIDB4RUYsIDB4QjEsIDB4RjAsIDB4ODMsIDB4OEEsIC8qIDB4NEMtMHg0RiAqLworCTB4QjEsIDB4RjEsIDB4ODMsIDB4OEIsIDB4ODMsIDB4OEMsIDB4ODMsIDB4OEQsIC8qIDB4NTAtMHg1MyAqLworCTB4QjEsIDB4RjIsIDB4ODMsIDB4OEUsIDB4QjEsIDB4RjMsIDB4ODMsIDB4OEYsIC8qIDB4NTQtMHg1NyAqLworCTB4ODMsIDB4OTAsIDB4ODMsIDB4OTEsIDB4ODMsIDB4OTIsIDB4ODMsIDB4OTMsIC8qIDB4NTgtMHg1QiAqLworCTB4QjEsIDB4RjQsIDB4QjEsIDB4RjUsIDB4ODMsIDB4OTQsIDB4QjEsIDB4RjYsIC8qIDB4NUMtMHg1RiAqLworCTB4QjEsIDB4RjcsIDB4QjEsIDB4RjgsIDB4ODMsIDB4OTUsIDB4ODMsIDB4OTYsIC8qIDB4NjAtMHg2MyAqLworCTB4ODMsIDB4OTcsIDB4QjEsIDB4RjksIDB4ODMsIDB4OTgsIDB4ODMsIDB4OTksIC8qIDB4NjQtMHg2NyAqLworCTB4QjEsIDB4RkEsIDB4QjEsIDB4RkIsIDB4ODMsIDB4OUEsIDB4ODMsIDB4OUIsIC8qIDB4NjgtMHg2QiAqLworCTB4QjEsIDB4RkMsIDB4ODMsIDB4OUMsIDB4ODMsIDB4OUQsIDB4ODMsIDB4OUUsIC8qIDB4NkMtMHg2RiAqLworCTB4QjEsIDB4RkQsIDB4ODMsIDB4OUYsIDB4ODMsIDB4QTAsIDB4ODMsIDB4QTEsIC8qIDB4NzAtMHg3MyAqLworCTB4ODMsIDB4QTIsIDB4ODMsIDB4QTMsIDB4ODMsIDB4QTQsIDB4ODMsIDB4QTUsIC8qIDB4NzQtMHg3NyAqLworCTB4QjEsIDB4RkUsIDB4QjIsIDB4QTEsIDB4ODMsIDB4QTYsIDB4QjIsIDB4QTIsIC8qIDB4NzgtMHg3QiAqLworCTB4QjIsIDB4QTMsIDB4QjIsIDB4QTQsIDB4ODMsIDB4QTcsIDB4ODMsIDB4QTgsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4ODMsIDB4QTksIDB4ODMsIDB4QUEsIDB4ODMsIDB4QUIsIDB4ODMsIDB4QUMsIC8qIDB4ODAtMHg4MyAqLworCTB4QjIsIDB4QTUsIDB4QjIsIDB4QTYsIDB4ODMsIDB4QUQsIDB4ODMsIDB4QUUsIC8qIDB4ODQtMHg4NyAqLworCTB4ODMsIDB4QUYsIDB4ODMsIDB4QjAsIDB4ODMsIDB4QjEsIDB4ODMsIDB4QjIsIC8qIDB4ODgtMHg4QiAqLworCTB4QjIsIDB4QTcsIDB4ODMsIDB4QjMsIDB4ODMsIDB4QjQsIDB4ODMsIDB4QjUsIC8qIDB4OEMtMHg4RiAqLworCTB4ODMsIDB4QjYsIDB4ODMsIDB4QjcsIDB4ODMsIDB4QjgsIDB4ODMsIDB4QjksIC8qIDB4OTAtMHg5MyAqLworCTB4ODMsIDB4QkEsIDB4ODMsIDB4QkIsIDB4ODMsIDB4QkMsIDB4ODMsIDB4QkQsIC8qIDB4OTQtMHg5NyAqLworCTB4ODMsIDB4QkUsIDB4ODMsIDB4QkYsIDB4ODMsIDB4QzAsIDB4ODMsIDB4QzEsIC8qIDB4OTgtMHg5QiAqLworCTB4ODMsIDB4QzIsIDB4ODMsIDB4QzMsIDB4ODMsIDB4QzQsIDB4ODMsIDB4QzUsIC8qIDB4OUMtMHg5RiAqLworCTB4ODMsIDB4QzYsIDB4ODMsIDB4QzcsIDB4ODMsIDB4QzgsIDB4ODMsIDB4QzksIC8qIDB4QTAtMHhBMyAqLworCTB4ODMsIDB4Q0EsIDB4ODMsIDB4Q0IsIDB4ODMsIDB4Q0MsIDB4ODMsIDB4Q0QsIC8qIDB4QTQtMHhBNyAqLworCTB4ODMsIDB4Q0UsIDB4ODMsIDB4Q0YsIDB4ODMsIDB4RDAsIDB4ODMsIDB4RDEsIC8qIDB4QTgtMHhBQiAqLworCTB4ODMsIDB4RDIsIDB4ODMsIDB4RDMsIDB4ODMsIDB4RDQsIDB4ODMsIDB4RDUsIC8qIDB4QUMtMHhBRiAqLworCTB4ODMsIDB4RDYsIDB4ODMsIDB4RDcsIDB4ODMsIDB4RDgsIDB4ODMsIDB4RDksIC8qIDB4QjAtMHhCMyAqLworCTB4ODMsIDB4REEsIDB4ODMsIDB4REIsIDB4ODMsIDB4REMsIDB4ODMsIDB4REQsIC8qIDB4QjQtMHhCNyAqLworCTB4ODMsIDB4REUsIDB4ODMsIDB4REYsIDB4ODMsIDB4RTAsIDB4ODMsIDB4RTEsIC8qIDB4QjgtMHhCQiAqLworCTB4QjIsIDB4QTgsIDB4QjIsIDB4QTksIDB4QjIsIDB4QUEsIDB4ODMsIDB4RTIsIC8qIDB4QkMtMHhCRiAqLworCTB4QjIsIDB4QUIsIDB4ODMsIDB4RTMsIDB4ODMsIDB4RTQsIDB4ODMsIDB4RTUsIC8qIDB4QzAtMHhDMyAqLworCTB4QjIsIDB4QUMsIDB4ODMsIDB4RTYsIDB4ODMsIDB4RTcsIDB4ODMsIDB4RTgsIC8qIDB4QzQtMHhDNyAqLworCTB4ODMsIDB4RTksIDB4ODMsIDB4RUEsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUMsIC8qIDB4QzgtMHhDQiAqLworCTB4QjIsIDB4QUQsIDB4QjIsIDB4QUUsIDB4ODMsIDB4RUQsIDB4QjIsIDB4QUYsIC8qIDB4Q0MtMHhDRiAqLworCTB4QjIsIDB4QjAsIDB4QjIsIDB4QjEsIDB4ODMsIDB4RUUsIDB4ODMsIDB4RUYsIC8qIDB4RDAtMHhEMyAqLworCTB4ODMsIDB4RjAsIDB4ODMsIDB4RjEsIDB4ODMsIDB4RjIsIDB4ODMsIDB4RjMsIC8qIDB4RDQtMHhENyAqLworCTB4QjIsIDB4QjIsIDB4QjIsIDB4QjMsIDB4ODMsIDB4RjQsIDB4ODMsIDB4RjUsIC8qIDB4RDgtMHhEQiAqLworCTB4QjIsIDB4QjQsIDB4ODMsIDB4RjYsIDB4ODMsIDB4RjcsIDB4ODMsIDB4RjgsIC8qIDB4REMtMHhERiAqLworCTB4ODMsIDB4RjksIDB4ODMsIDB4RkEsIDB4ODMsIDB4RkIsIDB4ODMsIDB4RkMsIC8qIDB4RTAtMHhFMyAqLworCTB4ODMsIDB4RkQsIDB4ODMsIDB4RkUsIDB4ODQsIDB4NDEsIDB4ODQsIDB4NDIsIC8qIDB4RTQtMHhFNyAqLworCTB4QjIsIDB4QjUsIDB4ODQsIDB4NDMsIDB4ODQsIDB4NDQsIDB4QjIsIDB4QjYsIC8qIDB4RTgtMHhFQiAqLworCTB4ODQsIDB4NDUsIDB4QjIsIDB4QjcsIDB4ODQsIDB4NDYsIDB4ODQsIDB4NDcsIC8qIDB4RUMtMHhFRiAqLworCTB4ODQsIDB4NDgsIDB4ODQsIDB4NDksIDB4ODQsIDB4NEEsIDB4ODQsIDB4NEIsIC8qIDB4RjAtMHhGMyAqLworCTB4QjIsIDB4QjgsIDB4ODQsIDB4NEMsIDB4ODQsIDB4NEQsIDB4ODQsIDB4NEUsIC8qIDB4RjQtMHhGNyAqLworCTB4QjIsIDB4QjksIDB4ODQsIDB4NEYsIDB4ODQsIDB4NTAsIDB4ODQsIDB4NTEsIC8qIDB4RjgtMHhGQiAqLworCTB4QjIsIDB4QkEsIDB4ODQsIDB4NTIsIDB4ODQsIDB4NTMsIDB4ODQsIDB4NTQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0FGWzUxMl0gPSB7CisJMHg4NCwgMHg1NSwgMHg4NCwgMHg1NiwgMHg4NCwgMHg1NywgMHg4NCwgMHg1OCwgLyogMHgwMC0weDAzICovCisJMHg4NCwgMHg1OSwgMHg4NCwgMHg1QSwgMHg4NCwgMHg2MSwgMHhCMiwgMHhCQiwgLyogMHgwNC0weDA3ICovCisJMHhCMiwgMHhCQywgMHg4NCwgMHg2MiwgMHg4NCwgMHg2MywgMHg4NCwgMHg2NCwgLyogMHgwOC0weDBCICovCisJMHg4NCwgMHg2NSwgMHhCMiwgMHhCRCwgMHg4NCwgMHg2NiwgMHg4NCwgMHg2NywgLyogMHgwQy0weDBGICovCisJMHhCMiwgMHhCRSwgMHg4NCwgMHg2OCwgMHg4NCwgMHg2OSwgMHg4NCwgMHg2QSwgLyogMHgxMC0weDEzICovCisJMHg4NCwgMHg2QiwgMHg4NCwgMHg2QywgMHg4NCwgMHg2RCwgMHg4NCwgMHg2RSwgLyogMHgxNC0weDE3ICovCisJMHg4NCwgMHg2RiwgMHg4NCwgMHg3MCwgMHg4NCwgMHg3MSwgMHg4NCwgMHg3MiwgLyogMHgxOC0weDFCICovCisJMHg4NCwgMHg3MywgMHg4NCwgMHg3NCwgMHg4NCwgMHg3NSwgMHg4NCwgMHg3NiwgLyogMHgxQy0weDFGICovCisJMHg4NCwgMHg3NywgMHg4NCwgMHg3OCwgMHg4NCwgMHg3OSwgMHg4NCwgMHg3QSwgLyogMHgyMC0weDIzICovCisJMHg4NCwgMHg4MSwgMHg4NCwgMHg4MiwgMHg4NCwgMHg4MywgMHg4NCwgMHg4NCwgLyogMHgyNC0weDI3ICovCisJMHg4NCwgMHg4NSwgMHg4NCwgMHg4NiwgMHg4NCwgMHg4NywgMHg4NCwgMHg4OCwgLyogMHgyOC0weDJCICovCisJMHhCMiwgMHhCRiwgMHhCMiwgMHhDMCwgMHg4NCwgMHg4OSwgMHg4NCwgMHg4QSwgLyogMHgyQy0weDJGICovCisJMHhCMiwgMHhDMSwgMHg4NCwgMHg4QiwgMHhCMiwgMHhDMiwgMHg4NCwgMHg4QywgLyogMHgzMC0weDMzICovCisJMHhCMiwgMHhDMywgMHg4NCwgMHg4RCwgMHg4NCwgMHg4RSwgMHg4NCwgMHg4RiwgLyogMHgzNC0weDM3ICovCisJMHg4NCwgMHg5MCwgMHg4NCwgMHg5MSwgMHg4NCwgMHg5MiwgMHg4NCwgMHg5MywgLyogMHgzOC0weDNCICovCisJMHhCMiwgMHhDNCwgMHhCMiwgMHhDNSwgMHg4NCwgMHg5NCwgMHhCMiwgMHhDNiwgLyogMHgzQy0weDNGICovCisJMHg4NCwgMHg5NSwgMHhCMiwgMHhDNywgMHhCMiwgMHhDOCwgMHhCMiwgMHhDOSwgLyogMHg0MC0weDQzICovCisJMHg4NCwgMHg5NiwgMHg4NCwgMHg5NywgMHg4NCwgMHg5OCwgMHg4NCwgMHg5OSwgLyogMHg0NC0weDQ3ICovCisJMHhCMiwgMHhDQSwgMHhCMiwgMHhDQiwgMHg4NCwgMHg5QSwgMHg4NCwgMHg5QiwgLyogMHg0OC0weDRCICovCisJMHg4NCwgMHg5QywgMHg4NCwgMHg5RCwgMHg4NCwgMHg5RSwgMHg4NCwgMHg5RiwgLyogMHg0Qy0weDRGICovCisJMHhCMiwgMHhDQywgMHg4NCwgMHhBMCwgMHg4NCwgMHhBMSwgMHg4NCwgMHhBMiwgLyogMHg1MC0weDUzICovCisJMHg4NCwgMHhBMywgMHg4NCwgMHhBNCwgMHg4NCwgMHhBNSwgMHg4NCwgMHhBNiwgLyogMHg1NC0weDU3ICovCisJMHg4NCwgMHhBNywgMHg4NCwgMHhBOCwgMHg4NCwgMHhBOSwgMHg4NCwgMHhBQSwgLyogMHg1OC0weDVCICovCisJMHhCMiwgMHhDRCwgMHhCMiwgMHhDRSwgMHg4NCwgMHhBQiwgMHg4NCwgMHhBQywgLyogMHg1Qy0weDVGICovCisJMHg4NCwgMHhBRCwgMHg4NCwgMHhBRSwgMHg4NCwgMHhBRiwgMHg4NCwgMHhCMCwgLyogMHg2MC0weDYzICovCisJMHhCMiwgMHhDRiwgMHhCMiwgMHhEMCwgMHg4NCwgMHhCMSwgMHg4NCwgMHhCMiwgLyogMHg2NC0weDY3ICovCisJMHg4NCwgMHhCMywgMHg4NCwgMHhCNCwgMHg4NCwgMHhCNSwgMHg4NCwgMHhCNiwgLyogMHg2OC0weDZCICovCisJMHg4NCwgMHhCNywgMHg4NCwgMHhCOCwgMHg4NCwgMHhCOSwgMHg4NCwgMHhCQSwgLyogMHg2Qy0weDZGICovCisJMHg4NCwgMHhCQiwgMHg4NCwgMHhCQywgMHg4NCwgMHhCRCwgMHg4NCwgMHhCRSwgLyogMHg3MC0weDczICovCisJMHg4NCwgMHhCRiwgMHg4NCwgMHhDMCwgMHg4NCwgMHhDMSwgMHg4NCwgMHhDMiwgLyogMHg3NC0weDc3ICovCisJMHg4NCwgMHhDMywgMHhCMiwgMHhEMSwgMHg4NCwgMHhDNCwgMHg4NCwgMHhDNSwgLyogMHg3OC0weDdCICovCisJMHg4NCwgMHhDNiwgMHg4NCwgMHhDNywgMHg4NCwgMHhDOCwgMHg4NCwgMHhDOSwgLyogMHg3Qy0weDdGICovCisJCisJMHhCMiwgMHhEMiwgMHg4NCwgMHhDQSwgMHg4NCwgMHhDQiwgMHg4NCwgMHhDQywgLyogMHg4MC0weDgzICovCisJMHhCMiwgMHhEMywgMHg4NCwgMHhDRCwgMHg4NCwgMHhDRSwgMHg4NCwgMHhDRiwgLyogMHg4NC0weDg3ICovCisJMHhCMiwgMHhENCwgMHg4NCwgMHhEMCwgMHg4NCwgMHhEMSwgMHg4NCwgMHhEMiwgLyogMHg4OC0weDhCICovCisJMHg4NCwgMHhEMywgMHg4NCwgMHhENCwgMHg4NCwgMHhENSwgMHg4NCwgMHhENiwgLyogMHg4Qy0weDhGICovCisJMHhCMiwgMHhENSwgMHhCMiwgMHhENiwgMHg4NCwgMHhENywgMHg4NCwgMHhEOCwgLyogMHg5MC0weDkzICovCisJMHg4NCwgMHhEOSwgMHhCMiwgMHhENywgMHg4NCwgMHhEQSwgMHg4NCwgMHhEQiwgLyogMHg5NC0weDk3ICovCisJMHg4NCwgMHhEQywgMHg4NCwgMHhERCwgMHg4NCwgMHhERSwgMHg4NCwgMHhERiwgLyogMHg5OC0weDlCICovCisJMHhCMiwgMHhEOCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMSwgMHg4NCwgMHhFMiwgLyogMHg5Qy0weDlGICovCisJMHg4NCwgMHhFMywgMHg4NCwgMHhFNCwgMHg4NCwgMHhFNSwgMHg4NCwgMHhFNiwgLyogMHhBMC0weEEzICovCisJMHg4NCwgMHhFNywgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOSwgMHg4NCwgMHhFQSwgLyogMHhBNC0weEE3ICovCisJMHg4NCwgMHhFQiwgMHg4NCwgMHhFQywgMHg4NCwgMHhFRCwgMHg4NCwgMHhFRSwgLyogMHhBOC0weEFCICovCisJMHg4NCwgMHhFRiwgMHg4NCwgMHhGMCwgMHg4NCwgMHhGMSwgMHg4NCwgMHhGMiwgLyogMHhBQy0weEFGICovCisJMHg4NCwgMHhGMywgMHg4NCwgMHhGNCwgMHg4NCwgMHhGNSwgMHg4NCwgMHhGNiwgLyogMHhCMC0weEIzICovCisJMHg4NCwgMHhGNywgMHg4NCwgMHhGOCwgMHg4NCwgMHhGOSwgMHg4NCwgMHhGQSwgLyogMHhCNC0weEI3ICovCisJMHhCMiwgMHhEOSwgMHhCMiwgMHhEQSwgMHg4NCwgMHhGQiwgMHg4NCwgMHhGQywgLyogMHhCOC0weEJCICovCisJMHhCMiwgMHhEQiwgMHg4NCwgMHhGRCwgMHg4NCwgMHhGRSwgMHg4NSwgMHg0MSwgLyogMHhCQy0weEJGICovCisJMHhCMiwgMHhEQywgMHg4NSwgMHg0MiwgMHg4NSwgMHg0MywgMHg4NSwgMHg0NCwgLyogMHhDMC0weEMzICovCisJMHg4NSwgMHg0NSwgMHg4NSwgMHg0NiwgMHg4NSwgMHg0NywgMHhCMiwgMHhERCwgLyogMHhDNC0weEM3ICovCisJMHhCMiwgMHhERSwgMHhCMiwgMHhERiwgMHg4NSwgMHg0OCwgMHhCMiwgMHhFMCwgLyogMHhDOC0weENCICovCisJMHg4NSwgMHg0OSwgMHhCMiwgMHhFMSwgMHhCMiwgMHhFMiwgMHg4NSwgMHg0QSwgLyogMHhDQy0weENGICovCisJMHg4NSwgMHg0QiwgMHg4NSwgMHg0QywgMHg4NSwgMHg0RCwgMHg4NSwgMHg0RSwgLyogMHhEMC0weEQzICovCisJMHhCMiwgMHhFMywgMHg4NSwgMHg0RiwgMHg4NSwgMHg1MCwgMHg4NSwgMHg1MSwgLyogMHhENC0weEQ3ICovCisJMHg4NSwgMHg1MiwgMHg4NSwgMHg1MywgMHg4NSwgMHg1NCwgMHg4NSwgMHg1NSwgLyogMHhEOC0weERCICovCisJMHhCMiwgMHhFNCwgMHg4NSwgMHg1NiwgMHg4NSwgMHg1NywgMHg4NSwgMHg1OCwgLyogMHhEQy0weERGICovCisJMHg4NSwgMHg1OSwgMHg4NSwgMHg1QSwgMHg4NSwgMHg2MSwgMHg4NSwgMHg2MiwgLyogMHhFMC0weEUzICovCisJMHg4NSwgMHg2MywgMHg4NSwgMHg2NCwgMHg4NSwgMHg2NSwgMHg4NSwgMHg2NiwgLyogMHhFNC0weEU3ICovCisJMHhCMiwgMHhFNSwgMHhCMiwgMHhFNiwgMHg4NSwgMHg2NywgMHg4NSwgMHg2OCwgLyogMHhFOC0weEVCICovCisJMHg4NSwgMHg2OSwgMHg4NSwgMHg2QSwgMHg4NSwgMHg2QiwgMHg4NSwgMHg2QywgLyogMHhFQy0weEVGICovCisJMHhCMiwgMHhFNywgMHhCMiwgMHhFOCwgMHg4NSwgMHg2RCwgMHg4NSwgMHg2RSwgLyogMHhGMC0weEYzICovCisJMHhCMiwgMHhFOSwgMHg4NSwgMHg2RiwgMHg4NSwgMHg3MCwgMHg4NSwgMHg3MSwgLyogMHhGNC0weEY3ICovCisJMHhCMiwgMHhFQSwgMHg4NSwgMHg3MiwgMHg4NSwgMHg3MywgMHg4NSwgMHg3NCwgLyogMHhGOC0weEZCICovCisJMHg4NSwgMHg3NSwgMHg4NSwgMHg3NiwgMHg4NSwgMHg3NywgMHg4NSwgMHg3OCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQjBbNTEyXSA9IHsKKwkweEIyLCAweEVCLCAweEIyLCAweEVDLCAweDg1LCAweDc5LCAweDg1LCAweDdBLCAvKiAweDAwLTB4MDMgKi8KKwkweEIyLCAweEVELCAweDg1LCAweDgxLCAweDg1LCAweDgyLCAweDg1LCAweDgzLCAvKiAweDA0LTB4MDcgKi8KKwkweDg1LCAweDg0LCAweDg1LCAweDg1LCAweDg1LCAweDg2LCAweDg1LCAweDg3LCAvKiAweDA4LTB4MEIgKi8KKwkweEIyLCAweEVFLCAweDg1LCAweDg4LCAweDg1LCAweDg5LCAweDg1LCAweDhBLCAvKiAweDBDLTB4MEYgKi8KKwkweEIyLCAweEVGLCAweDg1LCAweDhCLCAweDg1LCAweDhDLCAweDg1LCAweDhELCAvKiAweDEwLTB4MTMgKi8KKwkweEIyLCAweEYwLCAweDg1LCAweDhFLCAweDg1LCAweDhGLCAweDg1LCAweDkwLCAvKiAweDE0LTB4MTcgKi8KKwkweDg1LCAweDkxLCAweDg1LCAweDkyLCAweDg1LCAweDkzLCAweDg1LCAweDk0LCAvKiAweDE4LTB4MUIgKi8KKwkweEIyLCAweEYxLCAweEIyLCAweEYyLCAweDg1LCAweDk1LCAweDg1LCAweDk2LCAvKiAweDFDLTB4MUYgKi8KKwkweDg1LCAweDk3LCAweDg1LCAweDk4LCAweDg1LCAweDk5LCAweDg1LCAweDlBLCAvKiAweDIwLTB4MjMgKi8KKwkweDg1LCAweDlCLCAweDg1LCAweDlDLCAweDg1LCAweDlELCAweDg1LCAweDlFLCAvKiAweDI0LTB4MjcgKi8KKwkweEIyLCAweEYzLCAweDg1LCAweDlGLCAweDg1LCAweEEwLCAweDg1LCAweEExLCAvKiAweDI4LTB4MkIgKi8KKwkweDg1LCAweEEyLCAweDg1LCAweEEzLCAweDg1LCAweEE0LCAweDg1LCAweEE1LCAvKiAweDJDLTB4MkYgKi8KKwkweDg1LCAweEE2LCAweDg1LCAweEE3LCAweDg1LCAweEE4LCAweDg1LCAweEE5LCAvKiAweDMwLTB4MzMgKi8KKwkweDg1LCAweEFBLCAweDg1LCAweEFCLCAweDg1LCAweEFDLCAweDg1LCAweEFELCAvKiAweDM0LTB4MzcgKi8KKwkweDg1LCAweEFFLCAweDg1LCAweEFGLCAweDg1LCAweEIwLCAweDg1LCAweEIxLCAvKiAweDM4LTB4M0IgKi8KKwkweDg1LCAweEIyLCAweDg1LCAweEIzLCAweDg1LCAweEI0LCAweDg1LCAweEI1LCAvKiAweDNDLTB4M0YgKi8KKwkweDg1LCAweEI2LCAweDg1LCAweEI3LCAweDg1LCAweEI4LCAweDg1LCAweEI5LCAvKiAweDQwLTB4NDMgKi8KKwkweEIyLCAweEY0LCAweEIyLCAweEY1LCAweDg1LCAweEJBLCAweDg1LCAweEJCLCAvKiAweDQ0LTB4NDcgKi8KKwkweEIyLCAweEY2LCAweDg1LCAweEJDLCAweEIyLCAweEY3LCAweDg1LCAweEJELCAvKiAweDQ4LTB4NEIgKi8KKwkweEIyLCAweEY4LCAweDg1LCAweEJFLCAweEIyLCAweEY5LCAweDg1LCAweEJGLCAvKiAweDRDLTB4NEYgKi8KKwkweDg1LCAweEMwLCAweDg1LCAweEMxLCAweDg1LCAweEMyLCAweEIyLCAweEZBLCAvKiAweDUwLTB4NTMgKi8KKwkweEIyLCAweEZCLCAweEIyLCAweEZDLCAweDg1LCAweEMzLCAweEIyLCAweEZELCAvKiAweDU0LTB4NTcgKi8KKwkweDg1LCAweEM0LCAweEIyLCAweEZFLCAweDg1LCAweEM1LCAweDg1LCAweEM2LCAvKiAweDU4LTB4NUIgKi8KKwkweDg1LCAweEM3LCAweEIzLCAweEExLCAweDg1LCAweEM4LCAweDg1LCAweEM5LCAvKiAweDVDLTB4NUYgKi8KKwkweDg1LCAweENBLCAweDg1LCAweENCLCAweDg1LCAweENDLCAweDg1LCAweENELCAvKiAweDYwLTB4NjMgKi8KKwkweDg1LCAweENFLCAweDg1LCAweENGLCAweDg1LCAweEQwLCAweDg1LCAweEQxLCAvKiAweDY0LTB4NjcgKi8KKwkweDg1LCAweEQyLCAweDg1LCAweEQzLCAweDg1LCAweEQ0LCAweDg1LCAweEQ1LCAvKiAweDY4LTB4NkIgKi8KKwkweDg1LCAweEQ2LCAweDg1LCAweEQ3LCAweDg1LCAweEQ4LCAweDg1LCAweEQ5LCAvKiAweDZDLTB4NkYgKi8KKwkweDg1LCAweERBLCAweDg1LCAweERCLCAweDg1LCAweERDLCAweDg1LCAweERELCAvKiAweDcwLTB4NzMgKi8KKwkweDg1LCAweERFLCAweDg1LCAweERGLCAweDg1LCAweEUwLCAweDg1LCAweEUxLCAvKiAweDc0LTB4NzcgKi8KKwkweDg1LCAweEUyLCAweDg1LCAweEUzLCAweDg1LCAweEU0LCAweDg1LCAweEU1LCAvKiAweDc4LTB4N0IgKi8KKwkweEIzLCAweEEyLCAweEIzLCAweEEzLCAweDg1LCAweEU2LCAweDg1LCAweEU3LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEIzLCAweEE0LCAweDg1LCAweEU4LCAweDg1LCAweEU5LCAweDg1LCAweEVBLCAvKiAweDgwLTB4ODMgKi8KKwkweEIzLCAweEE1LCAweDg1LCAweEVCLCAweDg1LCAweEVDLCAweDg1LCAweEVELCAvKiAweDg0LTB4ODcgKi8KKwkweDg1LCAweEVFLCAweDg1LCAweEVGLCAweDg1LCAweEYwLCAweDg1LCAweEYxLCAvKiAweDg4LTB4OEIgKi8KKwkweEIzLCAweEE2LCAweEIzLCAweEE3LCAweDg1LCAweEYyLCAweEIzLCAweEE4LCAvKiAweDhDLTB4OEYgKi8KKwkweDg1LCAweEYzLCAweEIzLCAweEE5LCAweDg1LCAweEY0LCAweDg1LCAweEY1LCAvKiAweDkwLTB4OTMgKi8KKwkweDg1LCAweEY2LCAweDg1LCAweEY3LCAweDg1LCAweEY4LCAweDg1LCAweEY5LCAvKiAweDk0LTB4OTcgKi8KKwkweEIzLCAweEFBLCAweEIzLCAweEFCLCAweEIzLCAweEFDLCAweDg1LCAweEZBLCAvKiAweDk4LTB4OUIgKi8KKwkweEIzLCAweEFELCAweDg1LCAweEZCLCAweDg1LCAweEZDLCAweEIzLCAweEFFLCAvKiAweDlDLTB4OUYgKi8KKwkweEIzLCAweEFGLCAweEIzLCAweEIwLCAweEIzLCAweEIxLCAweDg1LCAweEZELCAvKiAweEEwLTB4QTMgKi8KKwkweDg1LCAweEZFLCAweDg2LCAweDQxLCAweDg2LCAweDQyLCAweDg2LCAweDQzLCAvKiAweEE0LTB4QTcgKi8KKwkweEIzLCAweEIyLCAweEIzLCAweEIzLCAweDg2LCAweDQ0LCAweEIzLCAweEI0LCAvKiAweEE4LTB4QUIgKi8KKwkweEIzLCAweEI1LCAweEIzLCAweEI2LCAweEIzLCAweEI3LCAweEIzLCAweEI4LCAvKiAweEFDLTB4QUYgKi8KKwkweDg2LCAweDQ1LCAweEIzLCAweEI5LCAweDg2LCAweDQ2LCAweEIzLCAweEJBLCAvKiAweEIwLTB4QjMgKi8KKwkweEIzLCAweEJCLCAweEIzLCAweEJDLCAweDg2LCAweDQ3LCAweDg2LCAweDQ4LCAvKiAweEI0LTB4QjcgKi8KKwkweEIzLCAweEJELCAweDg2LCAweDQ5LCAweDg2LCAweDRBLCAweDg2LCAweDRCLCAvKiAweEI4LTB4QkIgKi8KKwkweEIzLCAweEJFLCAweDg2LCAweDRDLCAweDg2LCAweDRELCAweDg2LCAweDRFLCAvKiAweEJDLTB4QkYgKi8KKwkweDg2LCAweDRGLCAweDg2LCAweDUwLCAweDg2LCAweDUxLCAweDg2LCAweDUyLCAvKiAweEMwLTB4QzMgKi8KKwkweEIzLCAweEJGLCAweEIzLCAweEMwLCAweDg2LCAweDUzLCAweEIzLCAweEMxLCAvKiAweEM0LTB4QzcgKi8KKwkweEIzLCAweEMyLCAweEIzLCAweEMzLCAweDg2LCAweDU0LCAweDg2LCAweDU1LCAvKiAweEM4LTB4Q0IgKi8KKwkweDg2LCAweDU2LCAweDg2LCAweDU3LCAweDg2LCAweDU4LCAweDg2LCAweDU5LCAvKiAweENDLTB4Q0YgKi8KKwkweEIzLCAweEM0LCAweEIzLCAweEM1LCAweDg2LCAweDVBLCAweDg2LCAweDYxLCAvKiAweEQwLTB4RDMgKi8KKwkweEIzLCAweEM2LCAweDg2LCAweDYyLCAweDg2LCAweDYzLCAweDg2LCAweDY0LCAvKiAweEQ0LTB4RDcgKi8KKwkweEIzLCAweEM3LCAweDg2LCAweDY1LCAweDg2LCAweDY2LCAweDg2LCAweDY3LCAvKiAweEQ4LTB4REIgKi8KKwkweDg2LCAweDY4LCAweDg2LCAweDY5LCAweDg2LCAweDZBLCAweDg2LCAweDZCLCAvKiAweERDLTB4REYgKi8KKwkweEIzLCAweEM4LCAweDg2LCAweDZDLCAweDg2LCAweDZELCAweDg2LCAweDZFLCAvKiAweEUwLTB4RTMgKi8KKwkweDg2LCAweDZGLCAweEIzLCAweEM5LCAweDg2LCAweDcwLCAweDg2LCAweDcxLCAvKiAweEU0LTB4RTcgKi8KKwkweDg2LCAweDcyLCAweDg2LCAweDczLCAweDg2LCAweDc0LCAweDg2LCAweDc1LCAvKiAweEU4LTB4RUIgKi8KKwkweDg2LCAweDc2LCAweDg2LCAweDc3LCAweDg2LCAweDc4LCAweDg2LCAweDc5LCAvKiAweEVDLTB4RUYgKi8KKwkweDg2LCAweDdBLCAweDg2LCAweDgxLCAweDg2LCAweDgyLCAweDg2LCAweDgzLCAvKiAweEYwLTB4RjMgKi8KKwkweDg2LCAweDg0LCAweDg2LCAweDg1LCAweDg2LCAweDg2LCAweDg2LCAweDg3LCAvKiAweEY0LTB4RjcgKi8KKwkweDg2LCAweDg4LCAweDg2LCAweDg5LCAweDg2LCAweDhBLCAweDg2LCAweDhCLCAvKiAweEY4LTB4RkIgKi8KKwkweDg2LCAweDhDLCAweDg2LCAweDhELCAweDg2LCAweDhFLCAweDg2LCAweDhGLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19CMVs1MTJdID0geworCTB4ODYsIDB4OTAsIDB4ODYsIDB4OTEsIDB4ODYsIDB4OTIsIDB4ODYsIDB4OTMsIC8qIDB4MDAtMHgwMyAqLworCTB4ODYsIDB4OTQsIDB4ODYsIDB4OTUsIDB4ODYsIDB4OTYsIDB4ODYsIDB4OTcsIC8qIDB4MDQtMHgwNyAqLworCTB4QjMsIDB4Q0EsIDB4QjMsIDB4Q0IsIDB4ODYsIDB4OTgsIDB4QjMsIDB4Q0MsIC8qIDB4MDgtMHgwQiAqLworCTB4QjMsIDB4Q0QsIDB4ODYsIDB4OTksIDB4ODYsIDB4OUEsIDB4ODYsIDB4OUIsIC8qIDB4MEMtMHgwRiAqLworCTB4QjMsIDB4Q0UsIDB4ODYsIDB4OUMsIDB4QjMsIDB4Q0YsIDB4QjMsIDB4RDAsIC8qIDB4MTAtMHgxMyAqLworCTB4ODYsIDB4OUQsIDB4ODYsIDB4OUUsIDB4ODYsIDB4OUYsIDB4ODYsIDB4QTAsIC8qIDB4MTQtMHgxNyAqLworCTB4QjMsIDB4RDEsIDB4QjMsIDB4RDIsIDB4ODYsIDB4QTEsIDB4QjMsIDB4RDMsIC8qIDB4MTgtMHgxQiAqLworCTB4QjMsIDB4RDQsIDB4QjMsIDB4RDUsIDB4ODYsIDB4QTIsIDB4ODYsIDB4QTMsIC8qIDB4MUMtMHgxRiAqLworCTB4ODYsIDB4QTQsIDB4ODYsIDB4QTUsIDB4ODYsIDB4QTYsIDB4QjMsIDB4RDYsIC8qIDB4MjAtMHgyMyAqLworCTB4QjMsIDB4RDcsIDB4QjMsIDB4RDgsIDB4ODYsIDB4QTcsIDB4ODYsIDB4QTgsIC8qIDB4MjQtMHgyNyAqLworCTB4QjMsIDB4RDksIDB4ODYsIDB4QTksIDB4ODYsIDB4QUEsIDB4ODYsIDB4QUIsIC8qIDB4MjgtMHgyQiAqLworCTB4QjMsIDB4REEsIDB4ODYsIDB4QUMsIDB4ODYsIDB4QUQsIDB4ODYsIDB4QUUsIC8qIDB4MkMtMHgyRiAqLworCTB4ODYsIDB4QUYsIDB4ODYsIDB4QjAsIDB4ODYsIDB4QjEsIDB4ODYsIDB4QjIsIC8qIDB4MzAtMHgzMyAqLworCTB4QjMsIDB4REIsIDB4QjMsIDB4REMsIDB4ODYsIDB4QjMsIDB4QjMsIDB4REQsIC8qIDB4MzQtMHgzNyAqLworCTB4QjMsIDB4REUsIDB4QjMsIDB4REYsIDB4ODYsIDB4QjQsIDB4ODYsIDB4QjUsIC8qIDB4MzgtMHgzQiAqLworCTB4ODYsIDB4QjYsIDB4ODYsIDB4QjcsIDB4ODYsIDB4QjgsIDB4ODYsIDB4QjksIC8qIDB4M0MtMHgzRiAqLworCTB4QjMsIDB4RTAsIDB4QjMsIDB4RTEsIDB4ODYsIDB4QkEsIDB4ODYsIDB4QkIsIC8qIDB4NDAtMHg0MyAqLworCTB4QjMsIDB4RTIsIDB4ODYsIDB4QkMsIDB4ODYsIDB4QkQsIDB4ODYsIDB4QkUsIC8qIDB4NDQtMHg0NyAqLworCTB4QjMsIDB4RTMsIDB4ODYsIDB4QkYsIDB4ODYsIDB4QzAsIDB4ODYsIDB4QzEsIC8qIDB4NDgtMHg0QiAqLworCTB4ODYsIDB4QzIsIDB4ODYsIDB4QzMsIDB4ODYsIDB4QzQsIDB4ODYsIDB4QzUsIC8qIDB4NEMtMHg0RiAqLworCTB4QjMsIDB4RTQsIDB4QjMsIDB4RTUsIDB4ODYsIDB4QzYsIDB4ODYsIDB4QzcsIC8qIDB4NTAtMHg1MyAqLworCTB4QjMsIDB4RTYsIDB4QjMsIDB4RTcsIDB4ODYsIDB4QzgsIDB4ODYsIDB4QzksIC8qIDB4NTQtMHg1NyAqLworCTB4QjMsIDB4RTgsIDB4ODYsIDB4Q0EsIDB4ODYsIDB4Q0IsIDB4ODYsIDB4Q0MsIC8qIDB4NTgtMHg1QiAqLworCTB4QjMsIDB4RTksIDB4ODYsIDB4Q0QsIDB4ODYsIDB4Q0UsIDB4ODYsIDB4Q0YsIC8qIDB4NUMtMHg1RiAqLworCTB4QjMsIDB4RUEsIDB4ODYsIDB4RDAsIDB4ODYsIDB4RDEsIDB4ODYsIDB4RDIsIC8qIDB4NjAtMHg2MyAqLworCTB4ODYsIDB4RDMsIDB4ODYsIDB4RDQsIDB4ODYsIDB4RDUsIDB4ODYsIDB4RDYsIC8qIDB4NjQtMHg2NyAqLworCTB4ODYsIDB4RDcsIDB4ODYsIDB4RDgsIDB4ODYsIDB4RDksIDB4ODYsIDB4REEsIC8qIDB4NjgtMHg2QiAqLworCTB4ODYsIDB4REIsIDB4ODYsIDB4REMsIDB4ODYsIDB4REQsIDB4ODYsIDB4REUsIC8qIDB4NkMtMHg2RiAqLworCTB4ODYsIDB4REYsIDB4ODYsIDB4RTAsIDB4ODYsIDB4RTEsIDB4ODYsIDB4RTIsIC8qIDB4NzAtMHg3MyAqLworCTB4ODYsIDB4RTMsIDB4ODYsIDB4RTQsIDB4ODYsIDB4RTUsIDB4ODYsIDB4RTYsIC8qIDB4NzQtMHg3NyAqLworCTB4QjMsIDB4RUIsIDB4QjMsIDB4RUMsIDB4ODYsIDB4RTcsIDB4ODYsIDB4RTgsIC8qIDB4NzgtMHg3QiAqLworCTB4QjMsIDB4RUQsIDB4ODYsIDB4RTksIDB4ODYsIDB4RUEsIDB4ODYsIDB4RUIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QjMsIDB4RUUsIDB4ODYsIDB4RUMsIDB4QjMsIDB4RUYsIDB4ODYsIDB4RUQsIC8qIDB4ODAtMHg4MyAqLworCTB4ODYsIDB4RUUsIDB4ODYsIDB4RUYsIDB4ODYsIDB4RjAsIDB4ODYsIDB4RjEsIC8qIDB4ODQtMHg4NyAqLworCTB4QjMsIDB4RjAsIDB4QjMsIDB4RjEsIDB4ODYsIDB4RjIsIDB4QjMsIDB4RjIsIC8qIDB4ODgtMHg4QiAqLworCTB4ODYsIDB4RjMsIDB4QjMsIDB4RjMsIDB4ODYsIDB4RjQsIDB4ODYsIDB4RjUsIC8qIDB4OEMtMHg4RiAqLworCTB4ODYsIDB4RjYsIDB4ODYsIDB4RjcsIDB4QjMsIDB4RjQsIDB4QjMsIDB4RjUsIC8qIDB4OTAtMHg5MyAqLworCTB4QjMsIDB4RjYsIDB4ODYsIDB4RjgsIDB4ODYsIDB4RjksIDB4ODYsIDB4RkEsIC8qIDB4OTQtMHg5NyAqLworCTB4QjMsIDB4RjcsIDB4ODYsIDB4RkIsIDB4ODYsIDB4RkMsIDB4ODYsIDB4RkQsIC8qIDB4OTgtMHg5QiAqLworCTB4QjMsIDB4RjgsIDB4ODYsIDB4RkUsIDB4ODcsIDB4NDEsIDB4ODcsIDB4NDIsIC8qIDB4OUMtMHg5RiAqLworCTB4ODcsIDB4NDMsIDB4ODcsIDB4NDQsIDB4ODcsIDB4NDUsIDB4ODcsIDB4NDYsIC8qIDB4QTAtMHhBMyAqLworCTB4ODcsIDB4NDcsIDB4ODcsIDB4NDgsIDB4ODcsIDB4NDksIDB4ODcsIDB4NEEsIC8qIDB4QTQtMHhBNyAqLworCTB4QjMsIDB4RjksIDB4ODcsIDB4NEIsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEQsIC8qIDB4QTgtMHhBQiAqLworCTB4ODcsIDB4NEUsIDB4ODcsIDB4NEYsIDB4ODcsIDB4NTAsIDB4ODcsIDB4NTEsIC8qIDB4QUMtMHhBRiAqLworCTB4ODcsIDB4NTIsIDB4ODcsIDB4NTMsIDB4ODcsIDB4NTQsIDB4ODcsIDB4NTUsIC8qIDB4QjAtMHhCMyAqLworCTB4ODcsIDB4NTYsIDB4ODcsIDB4NTcsIDB4ODcsIDB4NTgsIDB4ODcsIDB4NTksIC8qIDB4QjQtMHhCNyAqLworCTB4ODcsIDB4NUEsIDB4ODcsIDB4NjEsIDB4ODcsIDB4NjIsIDB4ODcsIDB4NjMsIC8qIDB4QjgtMHhCQiAqLworCTB4ODcsIDB4NjQsIDB4ODcsIDB4NjUsIDB4ODcsIDB4NjYsIDB4ODcsIDB4NjcsIC8qIDB4QkMtMHhCRiAqLworCTB4ODcsIDB4NjgsIDB4ODcsIDB4NjksIDB4ODcsIDB4NkEsIDB4ODcsIDB4NkIsIC8qIDB4QzAtMHhDMyAqLworCTB4ODcsIDB4NkMsIDB4ODcsIDB4NkQsIDB4ODcsIDB4NkUsIDB4ODcsIDB4NkYsIC8qIDB4QzQtMHhDNyAqLworCTB4ODcsIDB4NzAsIDB4ODcsIDB4NzEsIDB4ODcsIDB4NzIsIDB4ODcsIDB4NzMsIC8qIDB4QzgtMHhDQiAqLworCTB4QjMsIDB4RkEsIDB4ODcsIDB4NzQsIDB4ODcsIDB4NzUsIDB4ODcsIDB4NzYsIC8qIDB4Q0MtMHhDRiAqLworCTB4QjMsIDB4RkIsIDB4ODcsIDB4NzcsIDB4ODcsIDB4NzgsIDB4ODcsIDB4NzksIC8qIDB4RDAtMHhEMyAqLworCTB4QjMsIDB4RkMsIDB4ODcsIDB4N0EsIDB4ODcsIDB4ODEsIDB4ODcsIDB4ODIsIC8qIDB4RDQtMHhENyAqLworCTB4ODcsIDB4ODMsIDB4ODcsIDB4ODQsIDB4ODcsIDB4ODUsIDB4ODcsIDB4ODYsIC8qIDB4RDgtMHhEQiAqLworCTB4QjMsIDB4RkQsIDB4QjMsIDB4RkUsIDB4ODcsIDB4ODcsIDB4QjQsIDB4QTEsIC8qIDB4REMtMHhERiAqLworCTB4ODcsIDB4ODgsIDB4ODcsIDB4ODksIDB4ODcsIDB4OEEsIDB4ODcsIDB4OEIsIC8qIDB4RTAtMHhFMyAqLworCTB4ODcsIDB4OEMsIDB4ODcsIDB4OEQsIDB4ODcsIDB4OEUsIDB4ODcsIDB4OEYsIC8qIDB4RTQtMHhFNyAqLworCTB4QjQsIDB4QTIsIDB4QjQsIDB4QTMsIDB4ODcsIDB4OTAsIDB4ODcsIDB4OTEsIC8qIDB4RTgtMHhFQiAqLworCTB4QjQsIDB4QTQsIDB4ODcsIDB4OTIsIDB4ODcsIDB4OTMsIDB4ODcsIDB4OTQsIC8qIDB4RUMtMHhFRiAqLworCTB4QjQsIDB4QTUsIDB4ODcsIDB4OTUsIDB4ODcsIDB4OTYsIDB4ODcsIDB4OTcsIC8qIDB4RjAtMHhGMyAqLworCTB4ODcsIDB4OTgsIDB4ODcsIDB4OTksIDB4ODcsIDB4OUEsIDB4ODcsIDB4OUIsIC8qIDB4RjQtMHhGNyAqLworCTB4ODcsIDB4OUMsIDB4QjQsIDB4QTYsIDB4ODcsIDB4OUQsIDB4QjQsIDB4QTcsIC8qIDB4RjgtMHhGQiAqLworCTB4ODcsIDB4OUUsIDB4QjQsIDB4QTgsIDB4ODcsIDB4OUYsIDB4ODcsIDB4QTAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0IyWzUxMl0gPSB7CisJMHg4NywgMHhBMSwgMHg4NywgMHhBMiwgMHg4NywgMHhBMywgMHg4NywgMHhBNCwgLyogMHgwMC0weDAzICovCisJMHhCNCwgMHhBOSwgMHhCNCwgMHhBQSwgMHg4NywgMHhBNSwgMHg4NywgMHhBNiwgLyogMHgwNC0weDA3ICovCisJMHhCNCwgMHhBQiwgMHg4NywgMHhBNywgMHg4NywgMHhBOCwgMHhCNCwgMHhBQywgLyogMHgwOC0weDBCICovCisJMHhCNCwgMHhBRCwgMHg4NywgMHhBOSwgMHg4NywgMHhBQSwgMHg4NywgMHhBQiwgLyogMHgwQy0weDBGICovCisJMHg4NywgMHhBQywgMHg4NywgMHhBRCwgMHg4NywgMHhBRSwgMHg4NywgMHhBRiwgLyogMHgxMC0weDEzICovCisJMHhCNCwgMHhBRSwgMHhCNCwgMHhBRiwgMHg4NywgMHhCMCwgMHhCNCwgMHhCMCwgLyogMHgxNC0weDE3ICovCisJMHg4NywgMHhCMSwgMHhCNCwgMHhCMSwgMHg4NywgMHhCMiwgMHg4NywgMHhCMywgLyogMHgxOC0weDFCICovCisJMHg4NywgMHhCNCwgMHg4NywgMHhCNSwgMHg4NywgMHhCNiwgMHg4NywgMHhCNywgLyogMHgxQy0weDFGICovCisJMHhCNCwgMHhCMiwgMHg4NywgMHhCOCwgMHg4NywgMHhCOSwgMHg4NywgMHhCQSwgLyogMHgyMC0weDIzICovCisJMHg4NywgMHhCQiwgMHg4NywgMHhCQywgMHg4NywgMHhCRCwgMHg4NywgMHhCRSwgLyogMHgyNC0weDI3ICovCisJMHg4NywgMHhCRiwgMHg4NywgMHhDMCwgMHg4NywgMHhDMSwgMHg4NywgMHhDMiwgLyogMHgyOC0weDJCICovCisJMHg4NywgMHhDMywgMHg4NywgMHhDNCwgMHg4NywgMHhDNSwgMHg4NywgMHhDNiwgLyogMHgyQy0weDJGICovCisJMHg4NywgMHhDNywgMHg4NywgMHhDOCwgMHg4NywgMHhDOSwgMHg4NywgMHhDQSwgLyogMHgzMC0weDMzICovCisJMHhCNCwgMHhCMywgMHg4NywgMHhDQiwgMHg4NywgMHhDQywgMHg4NywgMHhDRCwgLyogMHgzNC0weDM3ICovCisJMHg4NywgMHhDRSwgMHg4NywgMHhDRiwgMHg4NywgMHhEMCwgMHg4NywgMHhEMSwgLyogMHgzOC0weDNCICovCisJMHhCNCwgMHhCNCwgMHg4NywgMHhEMiwgMHg4NywgMHhEMywgMHg4NywgMHhENCwgLyogMHgzQy0weDNGICovCisJMHg4NywgMHhENSwgMHg4NywgMHhENiwgMHg4NywgMHhENywgMHg4NywgMHhEOCwgLyogMHg0MC0weDQzICovCisJMHg4NywgMHhEOSwgMHg4NywgMHhEQSwgMHg4NywgMHhEQiwgMHg4NywgMHhEQywgLyogMHg0NC0weDQ3ICovCisJMHg4NywgMHhERCwgMHg4NywgMHhERSwgMHg4NywgMHhERiwgMHg4NywgMHhFMCwgLyogMHg0OC0weDRCICovCisJMHg4NywgMHhFMSwgMHg4NywgMHhFMiwgMHg4NywgMHhFMywgMHg4NywgMHhFNCwgLyogMHg0Qy0weDRGICovCisJMHg4NywgMHhFNSwgMHg4NywgMHhFNiwgMHg4NywgMHhFNywgMHg4NywgMHhFOCwgLyogMHg1MC0weDUzICovCisJMHg4NywgMHhFOSwgMHg4NywgMHhFQSwgMHg4NywgMHhFQiwgMHg4NywgMHhFQywgLyogMHg1NC0weDU3ICovCisJMHhCNCwgMHhCNSwgMHg4NywgMHhFRCwgMHg4NywgMHhFRSwgMHg4NywgMHhFRiwgLyogMHg1OC0weDVCICovCisJMHhCNCwgMHhCNiwgMHg4NywgMHhGMCwgMHg4NywgMHhGMSwgMHg4NywgMHhGMiwgLyogMHg1Qy0weDVGICovCisJMHhCNCwgMHhCNywgMHg4NywgMHhGMywgMHg4NywgMHhGNCwgMHg4NywgMHhGNSwgLyogMHg2MC0weDYzICovCisJMHg4NywgMHhGNiwgMHg4NywgMHhGNywgMHg4NywgMHhGOCwgMHg4NywgMHhGOSwgLyogMHg2NC0weDY3ICovCisJMHhCNCwgMHhCOCwgMHhCNCwgMHhCOSwgMHg4NywgMHhGQSwgMHg4NywgMHhGQiwgLyogMHg2OC0weDZCICovCisJMHg4NywgMHhGQywgMHg4NywgMHhGRCwgMHg4NywgMHhGRSwgMHg4OCwgMHg0MSwgLyogMHg2Qy0weDZGICovCisJMHg4OCwgMHg0MiwgMHg4OCwgMHg0MywgMHg4OCwgMHg0NCwgMHg4OCwgMHg0NSwgLyogMHg3MC0weDczICovCisJMHhCNCwgMHhCQSwgMHhCNCwgMHhCQiwgMHg4OCwgMHg0NiwgMHg4OCwgMHg0NywgLyogMHg3NC0weDc3ICovCisJMHg4OCwgMHg0OCwgMHg4OCwgMHg0OSwgMHg4OCwgMHg0QSwgMHg4OCwgMHg0QiwgLyogMHg3OC0weDdCICovCisJMHhCNCwgMHhCQywgMHg4OCwgMHg0QywgMHg4OCwgMHg0RCwgMHg4OCwgMHg0RSwgLyogMHg3Qy0weDdGICovCisJCisJMHg4OCwgMHg0RiwgMHg4OCwgMHg1MCwgMHg4OCwgMHg1MSwgMHg4OCwgMHg1MiwgLyogMHg4MC0weDgzICovCisJMHhCNCwgMHhCRCwgMHhCNCwgMHhCRSwgMHg4OCwgMHg1MywgMHg4OCwgMHg1NCwgLyogMHg4NC0weDg3ICovCisJMHg4OCwgMHg1NSwgMHhCNCwgMHhCRiwgMHg4OCwgMHg1NiwgMHg4OCwgMHg1NywgLyogMHg4OC0weDhCICovCisJMHg4OCwgMHg1OCwgMHg4OCwgMHg1OSwgMHg4OCwgMHg1QSwgMHg4OCwgMHg2MSwgLyogMHg4Qy0weDhGICovCisJMHhCNCwgMHhDMCwgMHhCNCwgMHhDMSwgMHg4OCwgMHg2MiwgMHg4OCwgMHg2MywgLyogMHg5MC0weDkzICovCisJMHhCNCwgMHhDMiwgMHg4OCwgMHg2NCwgMHg4OCwgMHg2NSwgMHg4OCwgMHg2NiwgLyogMHg5NC0weDk3ICovCisJMHhCNCwgMHhDMywgMHhCNCwgMHhDNCwgMHhCNCwgMHhDNSwgMHg4OCwgMHg2NywgLyogMHg5OC0weDlCICovCisJMHg4OCwgMHg2OCwgMHg4OCwgMHg2OSwgMHg4OCwgMHg2QSwgMHg4OCwgMHg2QiwgLyogMHg5Qy0weDlGICovCisJMHhCNCwgMHhDNiwgMHhCNCwgMHhDNywgMHg4OCwgMHg2QywgMHhCNCwgMHhDOCwgLyogMHhBMC0weEEzICovCisJMHg4OCwgMHg2RCwgMHhCNCwgMHhDOSwgMHhCNCwgMHhDQSwgMHg4OCwgMHg2RSwgLyogMHhBNC0weEE3ICovCisJMHg4OCwgMHg2RiwgMHg4OCwgMHg3MCwgMHhCNCwgMHhDQiwgMHg4OCwgMHg3MSwgLyogMHhBOC0weEFCICovCisJMHhCNCwgMHhDQywgMHg4OCwgMHg3MiwgMHg4OCwgMHg3MywgMHg4OCwgMHg3NCwgLyogMHhBQy0weEFGICovCisJMHhCNCwgMHhDRCwgMHg4OCwgMHg3NSwgMHg4OCwgMHg3NiwgMHg4OCwgMHg3NywgLyogMHhCMC0weEIzICovCisJMHhCNCwgMHhDRSwgMHg4OCwgMHg3OCwgMHg4OCwgMHg3OSwgMHg4OCwgMHg3QSwgLyogMHhCNC0weEI3ICovCisJMHg4OCwgMHg4MSwgMHg4OCwgMHg4MiwgMHg4OCwgMHg4MywgMHg4OCwgMHg4NCwgLyogMHhCOC0weEJCICovCisJMHg4OCwgMHg4NSwgMHg4OCwgMHg4NiwgMHg4OCwgMHg4NywgMHg4OCwgMHg4OCwgLyogMHhCQy0weEJGICovCisJMHg4OCwgMHg4OSwgMHg4OCwgMHg4QSwgMHg4OCwgMHg4QiwgMHg4OCwgMHg4QywgLyogMHhDMC0weEMzICovCisJMHg4OCwgMHg4RCwgMHg4OCwgMHg4RSwgMHg4OCwgMHg4RiwgMHg4OCwgMHg5MCwgLyogMHhDNC0weEM3ICovCisJMHhCNCwgMHhDRiwgMHhCNCwgMHhEMCwgMHg4OCwgMHg5MSwgMHg4OCwgMHg5MiwgLyogMHhDOC0weENCICovCisJMHhCNCwgMHhEMSwgMHg4OCwgMHg5MywgMHg4OCwgMHg5NCwgMHg4OCwgMHg5NSwgLyogMHhDQy0weENGICovCisJMHhCNCwgMHhEMiwgMHg4OCwgMHg5NiwgMHhCNCwgMHhEMywgMHg4OCwgMHg5NywgLyogMHhEMC0weEQzICovCisJMHg4OCwgMHg5OCwgMHg4OCwgMHg5OSwgMHg4OCwgMHg5QSwgMHg4OCwgMHg5QiwgLyogMHhENC0weEQ3ICovCisJMHhCNCwgMHhENCwgMHhCNCwgMHhENSwgMHg4OCwgMHg5QywgMHhCNCwgMHhENiwgLyogMHhEOC0weERCICovCisJMHg4OCwgMHg5RCwgMHhCNCwgMHhENywgMHg4OCwgMHg5RSwgMHg4OCwgMHg5RiwgLyogMHhEQy0weERGICovCisJMHg4OCwgMHhBMCwgMHg4OCwgMHhBMSwgMHhCNCwgMHhEOCwgMHg4OCwgMHhBMiwgLyogMHhFMC0weEUzICovCisJMHhCNCwgMHhEOSwgMHhCNCwgMHhEQSwgMHhCNCwgMHhEQiwgMHg4OCwgMHhBMywgLyogMHhFNC0weEU3ICovCisJMHhCNCwgMHhEQywgMHg4OCwgMHhBNCwgMHg4OCwgMHhBNSwgMHhCNCwgMHhERCwgLyogMHhFOC0weEVCICovCisJMHhCNCwgMHhERSwgMHhCNCwgMHhERiwgMHhCNCwgMHhFMCwgMHhCNCwgMHhFMSwgLyogMHhFQy0weEVGICovCisJMHg4OCwgMHhBNiwgMHg4OCwgMHhBNywgMHg4OCwgMHhBOCwgMHhCNCwgMHhFMiwgLyogMHhGMC0weEYzICovCisJMHhCNCwgMHhFMywgMHhCNCwgMHhFNCwgMHg4OCwgMHhBOSwgMHhCNCwgMHhFNSwgLyogMHhGNC0weEY3ICovCisJMHhCNCwgMHhFNiwgMHhCNCwgMHhFNywgMHhCNCwgMHhFOCwgMHhCNCwgMHhFOSwgLyogMHhGOC0weEZCICovCisJMHg4OCwgMHhBQSwgMHg4OCwgMHhBQiwgMHg4OCwgMHhBQywgMHhCNCwgMHhFQSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQjNbNTEyXSA9IHsKKwkweEI0LCAweEVCLCAweEI0LCAweEVDLCAweDg4LCAweEFELCAweDg4LCAweEFFLCAvKiAweDAwLTB4MDMgKi8KKwkweEI0LCAweEVELCAweDg4LCAweEFGLCAweDg4LCAweEIwLCAweDg4LCAweEIxLCAvKiAweDA0LTB4MDcgKi8KKwkweEI0LCAweEVFLCAweDg4LCAweEIyLCAweDg4LCAweEIzLCAweDg4LCAweEI0LCAvKiAweDA4LTB4MEIgKi8KKwkweDg4LCAweEI1LCAweDg4LCAweEI2LCAweDg4LCAweEI3LCAweDg4LCAweEI4LCAvKiAweDBDLTB4MEYgKi8KKwkweEI0LCAweEVGLCAweEI0LCAweEYwLCAweDg4LCAweEI5LCAweEI0LCAweEYxLCAvKiAweDEwLTB4MTMgKi8KKwkweEI0LCAweEYyLCAweEI0LCAweEYzLCAweDg4LCAweEJBLCAweDg4LCAweEJCLCAvKiAweDE0LTB4MTcgKi8KKwkweDg4LCAweEJDLCAweDg4LCAweEJELCAweDg4LCAweEJFLCAweDg4LCAweEJGLCAvKiAweDE4LTB4MUIgKi8KKwkweEI0LCAweEY0LCAweDg4LCAweEMwLCAweDg4LCAweEMxLCAweDg4LCAweEMyLCAvKiAweDFDLTB4MUYgKi8KKwkweDg4LCAweEMzLCAweDg4LCAweEM0LCAweDg4LCAweEM1LCAweDg4LCAweEM2LCAvKiAweDIwLTB4MjMgKi8KKwkweDg4LCAweEM3LCAweDg4LCAweEM4LCAweDg4LCAweEM5LCAweDg4LCAweENBLCAvKiAweDI0LTB4MjcgKi8KKwkweDg4LCAweENCLCAweDg4LCAweENDLCAweDg4LCAweENELCAweDg4LCAweENFLCAvKiAweDI4LTB4MkIgKi8KKwkweDg4LCAweENGLCAweDg4LCAweEQwLCAweDg4LCAweEQxLCAweDg4LCAweEQyLCAvKiAweDJDLTB4MkYgKi8KKwkweDg4LCAweEQzLCAweDg4LCAweEQ0LCAweDg4LCAweEQ1LCAweDg4LCAweEQ2LCAvKiAweDMwLTB4MzMgKi8KKwkweDg4LCAweEQ3LCAweDg4LCAweEQ4LCAweDg4LCAweEQ5LCAweDg4LCAweERBLCAvKiAweDM0LTB4MzcgKi8KKwkweDg4LCAweERCLCAweDg4LCAweERDLCAweDg4LCAweERELCAweDg4LCAweERFLCAvKiAweDM4LTB4M0IgKi8KKwkweDg4LCAweERGLCAweDg4LCAweEUwLCAweDg4LCAweEUxLCAweDg4LCAweEUyLCAvKiAweDNDLTB4M0YgKi8KKwkweDg4LCAweEUzLCAweDg4LCAweEU0LCAweDg4LCAweEU1LCAweDg4LCAweEU2LCAvKiAweDQwLTB4NDMgKi8KKwkweDg4LCAweEU3LCAweDg4LCAweEU4LCAweDg4LCAweEU5LCAweDg4LCAweEVBLCAvKiAweDQ0LTB4NDcgKi8KKwkweDg4LCAweEVCLCAweDg4LCAweEVDLCAweDg4LCAweEVELCAweDg4LCAweEVFLCAvKiAweDQ4LTB4NEIgKi8KKwkweDg4LCAweEVGLCAweDg4LCAweEYwLCAweDg4LCAweEYxLCAweDg4LCAweEYyLCAvKiAweDRDLTB4NEYgKi8KKwkweDg4LCAweEYzLCAweDg4LCAweEY0LCAweDg4LCAweEY1LCAweDg4LCAweEY2LCAvKiAweDUwLTB4NTMgKi8KKwkweEI0LCAweEY1LCAweEI0LCAweEY2LCAweEI0LCAweEY3LCAweDg4LCAweEY3LCAvKiAweDU0LTB4NTcgKi8KKwkweEI0LCAweEY4LCAweDg4LCAweEY4LCAweDg4LCAweEY5LCAweEI0LCAweEY5LCAvKiAweDU4LTB4NUIgKi8KKwkweEI0LCAweEZBLCAweDg4LCAweEZBLCAweEI0LCAweEZCLCAweEI0LCAweEZDLCAvKiAweDVDLTB4NUYgKi8KKwkweDg4LCAweEZCLCAweDg4LCAweEZDLCAweDg4LCAweEZELCAweDg4LCAweEZFLCAvKiAweDYwLTB4NjMgKi8KKwkweEI0LCAweEZELCAweEI0LCAweEZFLCAweDg5LCAweDQxLCAweEI1LCAweEExLCAvKiAweDY0LTB4NjcgKi8KKwkweDg5LCAweDQyLCAweEI1LCAweEEyLCAweDg5LCAweDQzLCAweEI1LCAweEEzLCAvKiAweDY4LTB4NkIgKi8KKwkweDg5LCAweDQ0LCAweDg5LCAweDQ1LCAweEI1LCAweEE0LCAweDg5LCAweDQ2LCAvKiAweDZDLTB4NkYgKi8KKwkweEI1LCAweEE1LCAweEI1LCAweEE2LCAweDg5LCAweDQ3LCAweDg5LCAweDQ4LCAvKiAweDcwLTB4NzMgKi8KKwkweEI1LCAweEE3LCAweDg5LCAweDQ5LCAweDg5LCAweDRBLCAweDg5LCAweDRCLCAvKiAweDc0LTB4NzcgKi8KKwkweEI1LCAweEE4LCAweDg5LCAweDRDLCAweDg5LCAweDRELCAweDg5LCAweDRFLCAvKiAweDc4LTB4N0IgKi8KKwkweDg5LCAweDRGLCAweDg5LCAweDUwLCAweDg5LCAweDUxLCAweDg5LCAweDUyLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEI1LCAweEE5LCAweEI1LCAweEFBLCAweDg5LCAweDUzLCAweEI1LCAweEFCLCAvKiAweDgwLTB4ODMgKi8KKwkweEI1LCAweEFDLCAweEI1LCAweEFELCAweDg5LCAweDU0LCAweDg5LCAweDU1LCAvKiAweDg0LTB4ODcgKi8KKwkweDg5LCAweDU2LCAweDg5LCAweDU3LCAweDg5LCAweDU4LCAweDg5LCAweDU5LCAvKiAweDg4LTB4OEIgKi8KKwkweEI1LCAweEFFLCAweDg5LCAweDVBLCAweDg5LCAweDYxLCAweDg5LCAweDYyLCAvKiAweDhDLTB4OEYgKi8KKwkweEI1LCAweEFGLCAweDg5LCAweDYzLCAweDg5LCAweDY0LCAweDg5LCAweDY1LCAvKiAweDkwLTB4OTMgKi8KKwkweEI1LCAweEIwLCAweDg5LCAweDY2LCAweDg5LCAweDY3LCAweDg5LCAweDY4LCAvKiAweDk0LTB4OTcgKi8KKwkweDg5LCAweDY5LCAweDg5LCAweDZBLCAweDg5LCAweDZCLCAweDg5LCAweDZDLCAvKiAweDk4LTB4OUIgKi8KKwkweDg5LCAweDZELCAweDg5LCAweDZFLCAweDg5LCAweDZGLCAweDg5LCAweDcwLCAvKiAweDlDLTB4OUYgKi8KKwkweEI1LCAweEIxLCAweEI1LCAweEIyLCAweDg5LCAweDcxLCAweDg5LCAweDcyLCAvKiAweEEwLTB4QTMgKi8KKwkweDg5LCAweDczLCAweDg5LCAweDc0LCAweDg5LCAweDc1LCAweDg5LCAweDc2LCAvKiAweEE0LTB4QTcgKi8KKwkweEI1LCAweEIzLCAweDg5LCAweDc3LCAweDg5LCAweDc4LCAweDg5LCAweDc5LCAvKiAweEE4LTB4QUIgKi8KKwkweEI1LCAweEI0LCAweDg5LCAweDdBLCAweDg5LCAweDgxLCAweDg5LCAweDgyLCAvKiAweEFDLTB4QUYgKi8KKwkweDg5LCAweDgzLCAweDg5LCAweDg0LCAweDg5LCAweDg1LCAweDg5LCAweDg2LCAvKiAweEIwLTB4QjMgKi8KKwkweDg5LCAweDg3LCAweDg5LCAweDg4LCAweDg5LCAweDg5LCAweDg5LCAweDhBLCAvKiAweEI0LTB4QjcgKi8KKwkweDg5LCAweDhCLCAweDg5LCAweDhDLCAweDg5LCAweDhELCAweDg5LCAweDhFLCAvKiAweEI4LTB4QkIgKi8KKwkweDg5LCAweDhGLCAweDg5LCAweDkwLCAweDg5LCAweDkxLCAweDg5LCAweDkyLCAvKiAweEJDLTB4QkYgKi8KKwkweDg5LCAweDkzLCAweDg5LCAweDk0LCAweDg5LCAweDk1LCAweDg5LCAweDk2LCAvKiAweEMwLTB4QzMgKi8KKwkweEI1LCAweEI1LCAweEI1LCAweEI2LCAweDg5LCAweDk3LCAweDg5LCAweDk4LCAvKiAweEM0LTB4QzcgKi8KKwkweEI1LCAweEI3LCAweDg5LCAweDk5LCAweDg5LCAweDlBLCAweEI1LCAweEI4LCAvKiAweEM4LTB4Q0IgKi8KKwkweEI1LCAweEI5LCAweDg5LCAweDlCLCAweEI1LCAweEJBLCAweDg5LCAweDlDLCAvKiAweENDLTB4Q0YgKi8KKwkweEI1LCAweEJCLCAweDg5LCAweDlELCAweDg5LCAweDlFLCAweDg5LCAweDlGLCAvKiAweEQwLTB4RDMgKi8KKwkweEI1LCAweEJDLCAweEI1LCAweEJELCAweDg5LCAweEEwLCAweEI1LCAweEJFLCAvKiAweEQ0LTB4RDcgKi8KKwkweDg5LCAweEExLCAweEI1LCAweEJGLCAweDg5LCAweEEyLCAweEI1LCAweEMwLCAvKiAweEQ4LTB4REIgKi8KKwkweDg5LCAweEEzLCAweEI1LCAweEMxLCAweDg5LCAweEE0LCAweDg5LCAweEE1LCAvKiAweERDLTB4REYgKi8KKwkweEI1LCAweEMyLCAweDg5LCAweEE2LCAweDg5LCAweEE3LCAweDg5LCAweEE4LCAvKiAweEUwLTB4RTMgKi8KKwkweEI1LCAweEMzLCAweDg5LCAweEE5LCAweDg5LCAweEFBLCAweDg5LCAweEFCLCAvKiAweEU0LTB4RTcgKi8KKwkweEI1LCAweEM0LCAweDg5LCAweEFDLCAweDg5LCAweEFELCAweDg5LCAweEFFLCAvKiAweEU4LTB4RUIgKi8KKwkweDg5LCAweEFGLCAweDg5LCAweEIwLCAweDg5LCAweEIxLCAweDg5LCAweEIyLCAvKiAweEVDLTB4RUYgKi8KKwkweDg5LCAweEIzLCAweDg5LCAweEI0LCAweDg5LCAweEI1LCAweDg5LCAweEI2LCAvKiAweEYwLTB4RjMgKi8KKwkweDg5LCAweEI3LCAweDg5LCAweEI4LCAweDg5LCAweEI5LCAweDg5LCAweEJBLCAvKiAweEY0LTB4RjcgKi8KKwkweDg5LCAweEJCLCAweDg5LCAweEJDLCAweDg5LCAweEJELCAweDg5LCAweEJFLCAvKiAweEY4LTB4RkIgKi8KKwkweEI1LCAweEM1LCAweDg5LCAweEJGLCAweDg5LCAweEMwLCAweDg5LCAweEMxLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19CNFs1MTJdID0geworCTB4ODksIDB4QzIsIDB4ODksIDB4QzMsIDB4ODksIDB4QzQsIDB4ODksIDB4QzUsIC8qIDB4MDAtMHgwMyAqLworCTB4ODksIDB4QzYsIDB4ODksIDB4QzcsIDB4ODksIDB4QzgsIDB4ODksIDB4QzksIC8qIDB4MDQtMHgwNyAqLworCTB4ODksIDB4Q0EsIDB4ODksIDB4Q0IsIDB4ODksIDB4Q0MsIDB4ODksIDB4Q0QsIC8qIDB4MDgtMHgwQiAqLworCTB4ODksIDB4Q0UsIDB4ODksIDB4Q0YsIDB4ODksIDB4RDAsIDB4ODksIDB4RDEsIC8qIDB4MEMtMHgwRiAqLworCTB4QjUsIDB4QzYsIDB4ODksIDB4RDIsIDB4ODksIDB4RDMsIDB4ODksIDB4RDQsIC8qIDB4MTAtMHgxMyAqLworCTB4ODksIDB4RDUsIDB4ODksIDB4RDYsIDB4ODksIDB4RDcsIDB4ODksIDB4RDgsIC8qIDB4MTQtMHgxNyAqLworCTB4QjUsIDB4QzcsIDB4ODksIDB4RDksIDB4ODksIDB4REEsIDB4ODksIDB4REIsIC8qIDB4MTgtMHgxQiAqLworCTB4QjUsIDB4QzgsIDB4ODksIDB4REMsIDB4ODksIDB4REQsIDB4ODksIDB4REUsIC8qIDB4MUMtMHgxRiAqLworCTB4QjUsIDB4QzksIDB4ODksIDB4REYsIDB4ODksIDB4RTAsIDB4ODksIDB4RTEsIC8qIDB4MjAtMHgyMyAqLworCTB4ODksIDB4RTIsIDB4ODksIDB4RTMsIDB4ODksIDB4RTQsIDB4ODksIDB4RTUsIC8qIDB4MjQtMHgyNyAqLworCTB4QjUsIDB4Q0EsIDB4QjUsIDB4Q0IsIDB4ODksIDB4RTYsIDB4QjUsIDB4Q0MsIC8qIDB4MjgtMHgyQiAqLworCTB4ODksIDB4RTcsIDB4ODksIDB4RTgsIDB4ODksIDB4RTksIDB4ODksIDB4RUEsIC8qIDB4MkMtMHgyRiAqLworCTB4ODksIDB4RUIsIDB4ODksIDB4RUMsIDB4ODksIDB4RUQsIDB4ODksIDB4RUUsIC8qIDB4MzAtMHgzMyAqLworCTB4QjUsIDB4Q0QsIDB4ODksIDB4RUYsIDB4ODksIDB4RjAsIDB4ODksIDB4RjEsIC8qIDB4MzQtMHgzNyAqLworCTB4ODksIDB4RjIsIDB4ODksIDB4RjMsIDB4ODksIDB4RjQsIDB4ODksIDB4RjUsIC8qIDB4MzgtMHgzQiAqLworCTB4ODksIDB4RjYsIDB4ODksIDB4RjcsIDB4ODksIDB4RjgsIDB4ODksIDB4RjksIC8qIDB4M0MtMHgzRiAqLworCTB4ODksIDB4RkEsIDB4ODksIDB4RkIsIDB4ODksIDB4RkMsIDB4ODksIDB4RkQsIC8qIDB4NDAtMHg0MyAqLworCTB4ODksIDB4RkUsIDB4OEEsIDB4NDEsIDB4OEEsIDB4NDIsIDB4OEEsIDB4NDMsIC8qIDB4NDQtMHg0NyAqLworCTB4OEEsIDB4NDQsIDB4OEEsIDB4NDUsIDB4OEEsIDB4NDYsIDB4OEEsIDB4NDcsIC8qIDB4NDgtMHg0QiAqLworCTB4OEEsIDB4NDgsIDB4OEEsIDB4NDksIDB4OEEsIDB4NEEsIDB4OEEsIDB4NEIsIC8qIDB4NEMtMHg0RiAqLworCTB4QjUsIDB4Q0UsIDB4QjUsIDB4Q0YsIDB4OEEsIDB4NEMsIDB4OEEsIDB4NEQsIC8qIDB4NTAtMHg1MyAqLworCTB4QjUsIDB4RDAsIDB4OEEsIDB4NEUsIDB4OEEsIDB4NEYsIDB4OEEsIDB4NTAsIC8qIDB4NTQtMHg1NyAqLworCTB4QjUsIDB4RDEsIDB4OEEsIDB4NTEsIDB4OEEsIDB4NTIsIDB4OEEsIDB4NTMsIC8qIDB4NTgtMHg1QiAqLworCTB4OEEsIDB4NTQsIDB4OEEsIDB4NTUsIDB4OEEsIDB4NTYsIDB4OEEsIDB4NTcsIC8qIDB4NUMtMHg1RiAqLworCTB4QjUsIDB4RDIsIDB4QjUsIDB4RDMsIDB4OEEsIDB4NTgsIDB4QjUsIDB4RDQsIC8qIDB4NjAtMHg2MyAqLworCTB4OEEsIDB4NTksIDB4QjUsIDB4RDUsIDB4OEEsIDB4NUEsIDB4OEEsIDB4NjEsIC8qIDB4NjQtMHg2NyAqLworCTB4OEEsIDB4NjIsIDB4OEEsIDB4NjMsIDB4OEEsIDB4NjQsIDB4OEEsIDB4NjUsIC8qIDB4NjgtMHg2QiAqLworCTB4QjUsIDB4RDYsIDB4OEEsIDB4NjYsIDB4OEEsIDB4NjcsIDB4OEEsIDB4NjgsIC8qIDB4NkMtMHg2RiAqLworCTB4OEEsIDB4NjksIDB4OEEsIDB4NkEsIDB4OEEsIDB4NkIsIDB4OEEsIDB4NkMsIC8qIDB4NzAtMHg3MyAqLworCTB4OEEsIDB4NkQsIDB4OEEsIDB4NkUsIDB4OEEsIDB4NkYsIDB4OEEsIDB4NzAsIC8qIDB4NzQtMHg3NyAqLworCTB4OEEsIDB4NzEsIDB4OEEsIDB4NzIsIDB4OEEsIDB4NzMsIDB4OEEsIDB4NzQsIC8qIDB4NzgtMHg3QiAqLworCTB4OEEsIDB4NzUsIDB4OEEsIDB4NzYsIDB4OEEsIDB4NzcsIDB4OEEsIDB4NzgsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QjUsIDB4RDcsIDB4OEEsIDB4NzksIDB4OEEsIDB4N0EsIDB4OEEsIDB4ODEsIC8qIDB4ODAtMHg4MyAqLworCTB4OEEsIDB4ODIsIDB4OEEsIDB4ODMsIDB4OEEsIDB4ODQsIDB4OEEsIDB4ODUsIC8qIDB4ODQtMHg4NyAqLworCTB4QjUsIDB4RDgsIDB4OEEsIDB4ODYsIDB4OEEsIDB4ODcsIDB4OEEsIDB4ODgsIC8qIDB4ODgtMHg4QiAqLworCTB4OEEsIDB4ODksIDB4OEEsIDB4OEEsIDB4OEEsIDB4OEIsIDB4OEEsIDB4OEMsIC8qIDB4OEMtMHg4RiAqLworCTB4OEEsIDB4OEQsIDB4OEEsIDB4OEUsIDB4OEEsIDB4OEYsIDB4OEEsIDB4OTAsIC8qIDB4OTAtMHg5MyAqLworCTB4OEEsIDB4OTEsIDB4OEEsIDB4OTIsIDB4OEEsIDB4OTMsIDB4OEEsIDB4OTQsIC8qIDB4OTQtMHg5NyAqLworCTB4OEEsIDB4OTUsIDB4OEEsIDB4OTYsIDB4OEEsIDB4OTcsIDB4OEEsIDB4OTgsIC8qIDB4OTgtMHg5QiAqLworCTB4OEEsIDB4OTksIDB4QjUsIDB4RDksIDB4OEEsIDB4OUEsIDB4OEEsIDB4OUIsIC8qIDB4OUMtMHg5RiAqLworCTB4OEEsIDB4OUMsIDB4OEEsIDB4OUQsIDB4OEEsIDB4OUUsIDB4OEEsIDB4OUYsIC8qIDB4QTAtMHhBMyAqLworCTB4QjUsIDB4REEsIDB4OEEsIDB4QTAsIDB4OEEsIDB4QTEsIDB4OEEsIDB4QTIsIC8qIDB4QTQtMHhBNyAqLworCTB4QjUsIDB4REIsIDB4OEEsIDB4QTMsIDB4OEEsIDB4QTQsIDB4OEEsIDB4QTUsIC8qIDB4QTgtMHhBQiAqLworCTB4QjUsIDB4REMsIDB4OEEsIDB4QTYsIDB4OEEsIDB4QTcsIDB4OEEsIDB4QTgsIC8qIDB4QUMtMHhBRiAqLworCTB4OEEsIDB4QTksIDB4OEEsIDB4QUEsIDB4OEEsIDB4QUIsIDB4OEEsIDB4QUMsIC8qIDB4QjAtMHhCMyAqLworCTB4OEEsIDB4QUQsIDB4QjUsIDB4REQsIDB4OEEsIDB4QUUsIDB4QjUsIDB4REUsIC8qIDB4QjQtMHhCNyAqLworCTB4OEEsIDB4QUYsIDB4QjUsIDB4REYsIDB4OEEsIDB4QjAsIDB4OEEsIDB4QjEsIC8qIDB4QjgtMHhCQiAqLworCTB4OEEsIDB4QjIsIDB4OEEsIDB4QjMsIDB4OEEsIDB4QjQsIDB4OEEsIDB4QjUsIC8qIDB4QkMtMHhCRiAqLworCTB4QjUsIDB4RTAsIDB4OEEsIDB4QjYsIDB4OEEsIDB4QjcsIDB4OEEsIDB4QjgsIC8qIDB4QzAtMHhDMyAqLworCTB4QjUsIDB4RTEsIDB4OEEsIDB4QjksIDB4OEEsIDB4QkEsIDB4OEEsIDB4QkIsIC8qIDB4QzQtMHhDNyAqLworCTB4QjUsIDB4RTIsIDB4OEEsIDB4QkMsIDB4OEEsIDB4QkQsIDB4OEEsIDB4QkUsIC8qIDB4QzgtMHhDQiAqLworCTB4OEEsIDB4QkYsIDB4OEEsIDB4QzAsIDB4OEEsIDB4QzEsIDB4OEEsIDB4QzIsIC8qIDB4Q0MtMHhDRiAqLworCTB4QjUsIDB4RTMsIDB4OEEsIDB4QzMsIDB4OEEsIDB4QzQsIDB4OEEsIDB4QzUsIC8qIDB4RDAtMHhEMyAqLworCTB4OEEsIDB4QzYsIDB4QjUsIDB4RTQsIDB4OEEsIDB4QzcsIDB4OEEsIDB4QzgsIC8qIDB4RDQtMHhENyAqLworCTB4OEEsIDB4QzksIDB4OEEsIDB4Q0EsIDB4OEEsIDB4Q0IsIDB4OEEsIDB4Q0MsIC8qIDB4RDgtMHhEQiAqLworCTB4QjUsIDB4RTUsIDB4QjUsIDB4RTYsIDB4OEEsIDB4Q0QsIDB4OEEsIDB4Q0UsIC8qIDB4REMtMHhERiAqLworCTB4QjUsIDB4RTcsIDB4OEEsIDB4Q0YsIDB4OEEsIDB4RDAsIDB4QjUsIDB4RTgsIC8qIDB4RTAtMHhFMyAqLworCTB4QjUsIDB4RTksIDB4OEEsIDB4RDEsIDB4QjUsIDB4RUEsIDB4OEEsIDB4RDIsIC8qIDB4RTQtMHhFNyAqLworCTB4OEEsIDB4RDMsIDB4OEEsIDB4RDQsIDB4OEEsIDB4RDUsIDB4OEEsIDB4RDYsIC8qIDB4RTgtMHhFQiAqLworCTB4QjUsIDB4RUIsIDB4QjUsIDB4RUMsIDB4OEEsIDB4RDcsIDB4QjUsIDB4RUQsIC8qIDB4RUMtMHhFRiAqLworCTB4OEEsIDB4RDgsIDB4QjUsIDB4RUUsIDB4OEEsIDB4RDksIDB4OEEsIDB4REEsIC8qIDB4RjAtMHhGMyAqLworCTB4OEEsIDB4REIsIDB4OEEsIDB4REMsIDB4OEEsIDB4REQsIDB4OEEsIDB4REUsIC8qIDB4RjQtMHhGNyAqLworCTB4QjUsIDB4RUYsIDB4OEEsIDB4REYsIDB4OEEsIDB4RTAsIDB4OEEsIDB4RTEsIC8qIDB4RjgtMHhGQiAqLworCTB4OEEsIDB4RTIsIDB4OEEsIDB4RTMsIDB4OEEsIDB4RTQsIDB4OEEsIDB4RTUsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0I1WzUxMl0gPSB7CisJMHg4QSwgMHhFNiwgMHg4QSwgMHhFNywgMHg4QSwgMHhFOCwgMHg4QSwgMHhFOSwgLyogMHgwMC0weDAzICovCisJMHg4QSwgMHhFQSwgMHg4QSwgMHhFQiwgMHg4QSwgMHhFQywgMHg4QSwgMHhFRCwgLyogMHgwNC0weDA3ICovCisJMHg4QSwgMHhFRSwgMHg4QSwgMHhFRiwgMHg4QSwgMHhGMCwgMHg4QSwgMHhGMSwgLyogMHgwOC0weDBCICovCisJMHg4QSwgMHhGMiwgMHg4QSwgMHhGMywgMHg4QSwgMHhGNCwgMHg4QSwgMHhGNSwgLyogMHgwQy0weDBGICovCisJMHg4QSwgMHhGNiwgMHg4QSwgMHhGNywgMHg4QSwgMHhGOCwgMHg4QSwgMHhGOSwgLyogMHgxMC0weDEzICovCisJMHhCNSwgMHhGMCwgMHhCNSwgMHhGMSwgMHg4QSwgMHhGQSwgMHg4QSwgMHhGQiwgLyogMHgxNC0weDE3ICovCisJMHhCNSwgMHhGMiwgMHg4QSwgMHhGQywgMHg4QSwgMHhGRCwgMHhCNSwgMHhGMywgLyogMHgxOC0weDFCICovCisJMHhCNSwgMHhGNCwgMHg4QSwgMHhGRSwgMHg4QiwgMHg0MSwgMHg4QiwgMHg0MiwgLyogMHgxQy0weDFGICovCisJMHg4QiwgMHg0MywgMHg4QiwgMHg0NCwgMHg4QiwgMHg0NSwgMHg4QiwgMHg0NiwgLyogMHgyMC0weDIzICovCisJMHhCNSwgMHhGNSwgMHhCNSwgMHhGNiwgMHg4QiwgMHg0NywgMHhCNSwgMHhGNywgLyogMHgyNC0weDI3ICovCisJMHhCNSwgMHhGOCwgMHhCNSwgMHhGOSwgMHhCNSwgMHhGQSwgMHg4QiwgMHg0OCwgLyogMHgyOC0weDJCICovCisJMHg4QiwgMHg0OSwgMHg4QiwgMHg0QSwgMHg4QiwgMHg0QiwgMHg4QiwgMHg0QywgLyogMHgyQy0weDJGICovCisJMHhCNSwgMHhGQiwgMHhCNSwgMHhGQywgMHg4QiwgMHg0RCwgMHg4QiwgMHg0RSwgLyogMHgzMC0weDMzICovCisJMHhCNSwgMHhGRCwgMHg4QiwgMHg0RiwgMHg4QiwgMHg1MCwgMHg4QiwgMHg1MSwgLyogMHgzNC0weDM3ICovCisJMHhCNSwgMHhGRSwgMHg4QiwgMHg1MiwgMHg4QiwgMHg1MywgMHg4QiwgMHg1NCwgLyogMHgzOC0weDNCICovCisJMHg4QiwgMHg1NSwgMHg4QiwgMHg1NiwgMHg4QiwgMHg1NywgMHg4QiwgMHg1OCwgLyogMHgzQy0weDNGICovCisJMHhCNiwgMHhBMSwgMHhCNiwgMHhBMiwgMHg4QiwgMHg1OSwgMHhCNiwgMHhBMywgLyogMHg0MC0weDQzICovCisJMHhCNiwgMHhBNCwgMHhCNiwgMHhBNSwgMHg4QiwgMHg1QSwgMHg4QiwgMHg2MSwgLyogMHg0NC0weDQ3ICovCisJMHg4QiwgMHg2MiwgMHg4QiwgMHg2MywgMHg4QiwgMHg2NCwgMHhCNiwgMHhBNiwgLyogMHg0OC0weDRCICovCisJMHhCNiwgMHhBNywgMHhCNiwgMHhBOCwgMHg4QiwgMHg2NSwgMHg4QiwgMHg2NiwgLyogMHg0Qy0weDRGICovCisJMHhCNiwgMHhBOSwgMHg4QiwgMHg2NywgMHg4QiwgMHg2OCwgMHg4QiwgMHg2OSwgLyogMHg1MC0weDUzICovCisJMHhCNiwgMHhBQSwgMHg4QiwgMHg2QSwgMHg4QiwgMHg2QiwgMHg4QiwgMHg2QywgLyogMHg1NC0weDU3ICovCisJMHg4QiwgMHg2RCwgMHg4QiwgMHg2RSwgMHg4QiwgMHg2RiwgMHg4QiwgMHg3MCwgLyogMHg1OC0weDVCICovCisJMHhCNiwgMHhBQiwgMHhCNiwgMHhBQywgMHg4QiwgMHg3MSwgMHhCNiwgMHhBRCwgLyogMHg1Qy0weDVGICovCisJMHhCNiwgMHhBRSwgMHhCNiwgMHhBRiwgMHg4QiwgMHg3MiwgMHg4QiwgMHg3MywgLyogMHg2MC0weDYzICovCisJMHg4QiwgMHg3NCwgMHg4QiwgMHg3NSwgMHg4QiwgMHg3NiwgMHg4QiwgMHg3NywgLyogMHg2NC0weDY3ICovCisJMHg4QiwgMHg3OCwgMHg4QiwgMHg3OSwgMHg4QiwgMHg3QSwgMHg4QiwgMHg4MSwgLyogMHg2OC0weDZCICovCisJMHg4QiwgMHg4MiwgMHg4QiwgMHg4MywgMHg4QiwgMHg4NCwgMHg4QiwgMHg4NSwgLyogMHg2Qy0weDZGICovCisJMHg4QiwgMHg4NiwgMHg4QiwgMHg4NywgMHg4QiwgMHg4OCwgMHg4QiwgMHg4OSwgLyogMHg3MC0weDczICovCisJMHg4QiwgMHg4QSwgMHg4QiwgMHg4QiwgMHg4QiwgMHg4QywgMHg4QiwgMHg4RCwgLyogMHg3NC0weDc3ICovCisJMHg4QiwgMHg4RSwgMHg4QiwgMHg4RiwgMHg4QiwgMHg5MCwgMHg4QiwgMHg5MSwgLyogMHg3OC0weDdCICovCisJMHg4QiwgMHg5MiwgMHg4QiwgMHg5MywgMHg4QiwgMHg5NCwgMHg4QiwgMHg5NSwgLyogMHg3Qy0weDdGICovCisJCisJMHg4QiwgMHg5NiwgMHg4QiwgMHg5NywgMHg4QiwgMHg5OCwgMHg4QiwgMHg5OSwgLyogMHg4MC0weDgzICovCisJMHg4QiwgMHg5QSwgMHg4QiwgMHg5QiwgMHg4QiwgMHg5QywgMHg4QiwgMHg5RCwgLyogMHg4NC0weDg3ICovCisJMHg4QiwgMHg5RSwgMHg4QiwgMHg5RiwgMHg4QiwgMHhBMCwgMHg4QiwgMHhBMSwgLyogMHg4OC0weDhCICovCisJMHg4QiwgMHhBMiwgMHg4QiwgMHhBMywgMHg4QiwgMHhBNCwgMHg4QiwgMHhBNSwgLyogMHg4Qy0weDhGICovCisJMHg4QiwgMHhBNiwgMHg4QiwgMHhBNywgMHg4QiwgMHhBOCwgMHg4QiwgMHhBOSwgLyogMHg5MC0weDkzICovCisJMHg4QiwgMHhBQSwgMHg4QiwgMHhBQiwgMHg4QiwgMHhBQywgMHg4QiwgMHhBRCwgLyogMHg5NC0weDk3ICovCisJMHg4QiwgMHhBRSwgMHg4QiwgMHhBRiwgMHg4QiwgMHhCMCwgMHg4QiwgMHhCMSwgLyogMHg5OC0weDlCICovCisJMHg4QiwgMHhCMiwgMHg4QiwgMHhCMywgMHg4QiwgMHhCNCwgMHg4QiwgMHhCNSwgLyogMHg5Qy0weDlGICovCisJMHhCNiwgMHhCMCwgMHhCNiwgMHhCMSwgMHg4QiwgMHhCNiwgMHg4QiwgMHhCNywgLyogMHhBMC0weEEzICovCisJMHhCNiwgMHhCMiwgMHg4QiwgMHhCOCwgMHg4QiwgMHhCOSwgMHg4QiwgMHhCQSwgLyogMHhBNC0weEE3ICovCisJMHhCNiwgMHhCMywgMHg4QiwgMHhCQiwgMHhCNiwgMHhCNCwgMHhCNiwgMHhCNSwgLyogMHhBOC0weEFCICovCisJMHg4QiwgMHhCQywgMHg4QiwgMHhCRCwgMHg4QiwgMHhCRSwgMHg4QiwgMHhCRiwgLyogMHhBQy0weEFGICovCisJMHhCNiwgMHhCNiwgMHhCNiwgMHhCNywgMHg4QiwgMHhDMCwgMHhCNiwgMHhCOCwgLyogMHhCMC0weEIzICovCisJMHhCNiwgMHhCOSwgMHhCNiwgMHhCQSwgMHg4QiwgMHhDMSwgMHg4QiwgMHhDMiwgLyogMHhCNC0weEI3ICovCisJMHg4QiwgMHhDMywgMHg4QiwgMHhDNCwgMHg4QiwgMHhDNSwgMHhCNiwgMHhCQiwgLyogMHhCOC0weEJCICovCisJMHhCNiwgMHhCQywgMHhCNiwgMHhCRCwgMHg4QiwgMHhDNiwgMHg4QiwgMHhDNywgLyogMHhCQy0weEJGICovCisJMHhCNiwgMHhCRSwgMHg4QiwgMHhDOCwgMHg4QiwgMHhDOSwgMHg4QiwgMHhDQSwgLyogMHhDMC0weEMzICovCisJMHhCNiwgMHhCRiwgMHg4QiwgMHhDQiwgMHg4QiwgMHhDQywgMHg4QiwgMHhDRCwgLyogMHhDNC0weEM3ICovCisJMHg4QiwgMHhDRSwgMHg4QiwgMHhDRiwgMHg4QiwgMHhEMCwgMHg4QiwgMHhEMSwgLyogMHhDOC0weENCICovCisJMHhCNiwgMHhDMCwgMHhCNiwgMHhDMSwgMHg4QiwgMHhEMiwgMHhCNiwgMHhDMiwgLyogMHhDQy0weENGICovCisJMHhCNiwgMHhDMywgMHhCNiwgMHhDNCwgMHg4QiwgMHhEMywgMHg4QiwgMHhENCwgLyogMHhEMC0weEQzICovCisJMHg4QiwgMHhENSwgMHg4QiwgMHhENiwgMHg4QiwgMHhENywgMHg4QiwgMHhEOCwgLyogMHhENC0weEQ3ICovCisJMHhCNiwgMHhDNSwgMHg4QiwgMHhEOSwgMHg4QiwgMHhEQSwgMHg4QiwgMHhEQiwgLyogMHhEOC0weERCICovCisJMHg4QiwgMHhEQywgMHg4QiwgMHhERCwgMHg4QiwgMHhERSwgMHg4QiwgMHhERiwgLyogMHhEQy0weERGICovCisJMHg4QiwgMHhFMCwgMHg4QiwgMHhFMSwgMHg4QiwgMHhFMiwgMHg4QiwgMHhFMywgLyogMHhFMC0weEUzICovCisJMHg4QiwgMHhFNCwgMHg4QiwgMHhFNSwgMHg4QiwgMHhFNiwgMHg4QiwgMHhFNywgLyogMHhFNC0weEU3ICovCisJMHg4QiwgMHhFOCwgMHg4QiwgMHhFOSwgMHg4QiwgMHhFQSwgMHg4QiwgMHhFQiwgLyogMHhFOC0weEVCICovCisJMHhCNiwgMHhDNiwgMHg4QiwgMHhFQywgMHg4QiwgMHhFRCwgMHg4QiwgMHhFRSwgLyogMHhFQy0weEVGICovCisJMHg4QiwgMHhFRiwgMHg4QiwgMHhGMCwgMHg4QiwgMHhGMSwgMHg4QiwgMHhGMiwgLyogMHhGMC0weEYzICovCisJMHg4QiwgMHhGMywgMHg4QiwgMHhGNCwgMHg4QiwgMHhGNSwgMHg4QiwgMHhGNiwgLyogMHhGNC0weEY3ICovCisJMHg4QiwgMHhGNywgMHg4QiwgMHhGOCwgMHg4QiwgMHhGOSwgMHg4QiwgMHhGQSwgLyogMHhGOC0weEZCICovCisJMHg4QiwgMHhGQiwgMHg4QiwgMHhGQywgMHg4QiwgMHhGRCwgMHg4QiwgMHhGRSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQjZbNTEyXSA9IHsKKwkweDhDLCAweDQxLCAweDhDLCAweDQyLCAweDhDLCAweDQzLCAweDhDLCAweDQ0LCAvKiAweDAwLTB4MDMgKi8KKwkweDhDLCAweDQ1LCAweDhDLCAweDQ2LCAweDhDLCAweDQ3LCAweDhDLCAweDQ4LCAvKiAweDA0LTB4MDcgKi8KKwkweDhDLCAweDQ5LCAweDhDLCAweDRBLCAweDhDLCAweDRCLCAweDhDLCAweDRDLCAvKiAweDA4LTB4MEIgKi8KKwkweDhDLCAweDRELCAweDhDLCAweDRFLCAweDhDLCAweDRGLCAweDhDLCAweDUwLCAvKiAweDBDLTB4MEYgKi8KKwkweEI2LCAweEM3LCAweEI2LCAweEM4LCAweDhDLCAweDUxLCAweDhDLCAweDUyLCAvKiAweDEwLTB4MTMgKi8KKwkweEI2LCAweEM5LCAweDhDLCAweDUzLCAweDhDLCAweDU0LCAweDhDLCAweDU1LCAvKiAweDE0LTB4MTcgKi8KKwkweEI2LCAweENBLCAweDhDLCAweDU2LCAweDhDLCAweDU3LCAweDhDLCAweDU4LCAvKiAweDE4LTB4MUIgKi8KKwkweDhDLCAweDU5LCAweDhDLCAweDVBLCAweDhDLCAweDYxLCAweDhDLCAweDYyLCAvKiAweDFDLTB4MUYgKi8KKwkweDhDLCAweDYzLCAweDhDLCAweDY0LCAweDhDLCAweDY1LCAweDhDLCAweDY2LCAvKiAweDIwLTB4MjMgKi8KKwkweDhDLCAweDY3LCAweEI2LCAweENCLCAweDhDLCAweDY4LCAweDhDLCAweDY5LCAvKiAweDI0LTB4MjcgKi8KKwkweDhDLCAweDZBLCAweDhDLCAweDZCLCAweDhDLCAweDZDLCAweDhDLCAweDZELCAvKiAweDI4LTB4MkIgKi8KKwkweEI2LCAweENDLCAweDhDLCAweDZFLCAweDhDLCAweDZGLCAweDhDLCAweDcwLCAvKiAweDJDLTB4MkYgKi8KKwkweDhDLCAweDcxLCAweDhDLCAweDcyLCAweDhDLCAweDczLCAweDhDLCAweDc0LCAvKiAweDMwLTB4MzMgKi8KKwkweEI2LCAweENELCAweDhDLCAweDc1LCAweDhDLCAweDc2LCAweDhDLCAweDc3LCAvKiAweDM0LTB4MzcgKi8KKwkweDhDLCAweDc4LCAweDhDLCAweDc5LCAweDhDLCAweDdBLCAweDhDLCAweDgxLCAvKiAweDM4LTB4M0IgKi8KKwkweDhDLCAweDgyLCAweDhDLCAweDgzLCAweDhDLCAweDg0LCAweDhDLCAweDg1LCAvKiAweDNDLTB4M0YgKi8KKwkweDhDLCAweDg2LCAweDhDLCAweDg3LCAweDhDLCAweDg4LCAweDhDLCAweDg5LCAvKiAweDQwLTB4NDMgKi8KKwkweDhDLCAweDhBLCAweDhDLCAweDhCLCAweDhDLCAweDhDLCAweDhDLCAweDhELCAvKiAweDQ0LTB4NDcgKi8KKwkweEI2LCAweENFLCAweDhDLCAweDhFLCAweDhDLCAweDhGLCAweDhDLCAweDkwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDhDLCAweDkxLCAweDhDLCAweDkyLCAweDhDLCAweDkzLCAweDhDLCAweDk0LCAvKiAweDRDLTB4NEYgKi8KKwkweDhDLCAweDk1LCAweDhDLCAweDk2LCAweDhDLCAweDk3LCAweDhDLCAweDk4LCAvKiAweDUwLTB4NTMgKi8KKwkweDhDLCAweDk5LCAweDhDLCAweDlBLCAweDhDLCAweDlCLCAweDhDLCAweDlDLCAvKiAweDU0LTB4NTcgKi8KKwkweDhDLCAweDlELCAweDhDLCAweDlFLCAweDhDLCAweDlGLCAweDhDLCAweEEwLCAvKiAweDU4LTB4NUIgKi8KKwkweDhDLCAweEExLCAweDhDLCAweEEyLCAweDhDLCAweEEzLCAweDhDLCAweEE0LCAvKiAweDVDLTB4NUYgKi8KKwkweDhDLCAweEE1LCAweDhDLCAweEE2LCAweDhDLCAweEE3LCAweDhDLCAweEE4LCAvKiAweDYwLTB4NjMgKi8KKwkweEI2LCAweENGLCAweDhDLCAweEE5LCAweDhDLCAweEFBLCAweDhDLCAweEFCLCAvKiAweDY0LTB4NjcgKi8KKwkweEI2LCAweEQwLCAweDhDLCAweEFDLCAweDhDLCAweEFELCAweDhDLCAweEFFLCAvKiAweDY4LTB4NkIgKi8KKwkweDhDLCAweEFGLCAweDhDLCAweEIwLCAweDhDLCAweEIxLCAweDhDLCAweEIyLCAvKiAweDZDLTB4NkYgKi8KKwkweDhDLCAweEIzLCAweDhDLCAweEI0LCAweDhDLCAweEI1LCAweDhDLCAweEI2LCAvKiAweDcwLTB4NzMgKi8KKwkweDhDLCAweEI3LCAweDhDLCAweEI4LCAweDhDLCAweEI5LCAweDhDLCAweEJBLCAvKiAweDc0LTB4NzcgKi8KKwkweDhDLCAweEJCLCAweDhDLCAweEJDLCAweDhDLCAweEJELCAweDhDLCAweEJFLCAvKiAweDc4LTB4N0IgKi8KKwkweDhDLCAweEJGLCAweDhDLCAweEMwLCAweDhDLCAweEMxLCAweDhDLCAweEMyLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDhDLCAweEMzLCAweDhDLCAweEM0LCAweDhDLCAweEM1LCAweDhDLCAweEM2LCAvKiAweDgwLTB4ODMgKi8KKwkweDhDLCAweEM3LCAweDhDLCAweEM4LCAweDhDLCAweEM5LCAweDhDLCAweENBLCAvKiAweDg0LTB4ODcgKi8KKwkweDhDLCAweENCLCAweDhDLCAweENDLCAweDhDLCAweENELCAweDhDLCAweENFLCAvKiAweDg4LTB4OEIgKi8KKwkweDhDLCAweENGLCAweDhDLCAweEQwLCAweDhDLCAweEQxLCAweDhDLCAweEQyLCAvKiAweDhDLTB4OEYgKi8KKwkweDhDLCAweEQzLCAweDhDLCAweEQ0LCAweDhDLCAweEQ1LCAweDhDLCAweEQ2LCAvKiAweDkwLTB4OTMgKi8KKwkweDhDLCAweEQ3LCAweDhDLCAweEQ4LCAweDhDLCAweEQ5LCAweDhDLCAweERBLCAvKiAweDk0LTB4OTcgKi8KKwkweDhDLCAweERCLCAweDhDLCAweERDLCAweDhDLCAweERELCAweDhDLCAweERFLCAvKiAweDk4LTB4OUIgKi8KKwkweEI2LCAweEQxLCAweEI2LCAweEQyLCAweDhDLCAweERGLCAweDhDLCAweEUwLCAvKiAweDlDLTB4OUYgKi8KKwkweEI2LCAweEQzLCAweDhDLCAweEUxLCAweDhDLCAweEUyLCAweDhDLCAweEUzLCAvKiAweEEwLTB4QTMgKi8KKwkweEI2LCAweEQ0LCAweDhDLCAweEU0LCAweDhDLCAweEU1LCAweDhDLCAweEU2LCAvKiAweEE0LTB4QTcgKi8KKwkweDhDLCAweEU3LCAweDhDLCAweEU4LCAweDhDLCAweEU5LCAweEI2LCAweEQ1LCAvKiAweEE4LTB4QUIgKi8KKwkweEI2LCAweEQ2LCAweDhDLCAweEVBLCAweDhDLCAweEVCLCAweDhDLCAweEVDLCAvKiAweEFDLTB4QUYgKi8KKwkweDhDLCAweEVELCAweEI2LCAweEQ3LCAweDhDLCAweEVFLCAweDhDLCAweEVGLCAvKiAweEIwLTB4QjMgKi8KKwkweDhDLCAweEYwLCAweDhDLCAweEYxLCAweDhDLCAweEYyLCAweDhDLCAweEYzLCAvKiAweEI0LTB4QjcgKi8KKwkweDhDLCAweEY0LCAweDhDLCAweEY1LCAweDhDLCAweEY2LCAweDhDLCAweEY3LCAvKiAweEI4LTB4QkIgKi8KKwkweDhDLCAweEY4LCAweDhDLCAweEY5LCAweDhDLCAweEZBLCAweDhDLCAweEZCLCAvKiAweEJDLTB4QkYgKi8KKwkweDhDLCAweEZDLCAweDhDLCAweEZELCAweDhDLCAweEZFLCAweDhELCAweDQxLCAvKiAweEMwLTB4QzMgKi8KKwkweDhELCAweDQyLCAweDhELCAweDQzLCAweDhELCAweDQ0LCAweDhELCAweDQ1LCAvKiAweEM0LTB4QzcgKi8KKwkweDhELCAweDQ2LCAweDhELCAweDQ3LCAweDhELCAweDQ4LCAweDhELCAweDQ5LCAvKiAweEM4LTB4Q0IgKi8KKwkweDhELCAweDRBLCAweDhELCAweDRCLCAweDhELCAweDRDLCAweDhELCAweDRELCAvKiAweENDLTB4Q0YgKi8KKwkweDhELCAweDRFLCAweDhELCAweDRGLCAweDhELCAweDUwLCAweDhELCAweDUxLCAvKiAweEQwLTB4RDMgKi8KKwkweEI2LCAweEQ4LCAweDhELCAweDUyLCAweDhELCAweDUzLCAweDhELCAweDU0LCAvKiAweEQ0LTB4RDcgKi8KKwkweDhELCAweDU1LCAweDhELCAweDU2LCAweDhELCAweDU3LCAweDhELCAweDU4LCAvKiAweEQ4LTB4REIgKi8KKwkweDhELCAweDU5LCAweDhELCAweDVBLCAweDhELCAweDYxLCAweDhELCAweDYyLCAvKiAweERDLTB4REYgKi8KKwkweDhELCAweDYzLCAweDhELCAweDY0LCAweDhELCAweDY1LCAweDhELCAweDY2LCAvKiAweEUwLTB4RTMgKi8KKwkweDhELCAweDY3LCAweDhELCAweDY4LCAweDhELCAweDY5LCAweDhELCAweDZBLCAvKiAweEU0LTB4RTcgKi8KKwkweDhELCAweDZCLCAweDhELCAweDZDLCAweDhELCAweDZELCAweDhELCAweDZFLCAvKiAweEU4LTB4RUIgKi8KKwkweDhELCAweDZGLCAweDhELCAweDcwLCAweDhELCAweDcxLCAweDhELCAweDcyLCAvKiAweEVDLTB4RUYgKi8KKwkweEI2LCAweEQ5LCAweDhELCAweDczLCAweDhELCAweDc0LCAweDhELCAweDc1LCAvKiAweEYwLTB4RjMgKi8KKwkweEI2LCAweERBLCAweDhELCAweDc2LCAweDhELCAweDc3LCAweDhELCAweDc4LCAvKiAweEY0LTB4RjcgKi8KKwkweEI2LCAweERCLCAweDhELCAweDc5LCAweDhELCAweDdBLCAweDhELCAweDgxLCAvKiAweEY4LTB4RkIgKi8KKwkweDhELCAweDgyLCAweDhELCAweDgzLCAweDhELCAweDg0LCAweDhELCAweDg1LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19CN1s1MTJdID0geworCTB4QjYsIDB4REMsIDB4QjYsIDB4REQsIDB4OEQsIDB4ODYsIDB4OEQsIDB4ODcsIC8qIDB4MDAtMHgwMyAqLworCTB4OEQsIDB4ODgsIDB4QjYsIDB4REUsIDB4OEQsIDB4ODksIDB4OEQsIDB4OEEsIC8qIDB4MDQtMHgwNyAqLworCTB4OEQsIDB4OEIsIDB4OEQsIDB4OEMsIDB4OEQsIDB4OEQsIDB4OEQsIDB4OEUsIC8qIDB4MDgtMHgwQiAqLworCTB4OEQsIDB4OEYsIDB4OEQsIDB4OTAsIDB4OEQsIDB4OTEsIDB4OEQsIDB4OTIsIC8qIDB4MEMtMHgwRiAqLworCTB4OEQsIDB4OTMsIDB4OEQsIDB4OTQsIDB4OEQsIDB4OTUsIDB4OEQsIDB4OTYsIC8qIDB4MTAtMHgxMyAqLworCTB4OEQsIDB4OTcsIDB4OEQsIDB4OTgsIDB4OEQsIDB4OTksIDB4OEQsIDB4OUEsIC8qIDB4MTQtMHgxNyAqLworCTB4OEQsIDB4OUIsIDB4OEQsIDB4OUMsIDB4OEQsIDB4OUQsIDB4OEQsIDB4OUUsIC8qIDB4MTgtMHgxQiAqLworCTB4OEQsIDB4OUYsIDB4OEQsIDB4QTAsIDB4OEQsIDB4QTEsIDB4OEQsIDB4QTIsIC8qIDB4MUMtMHgxRiAqLworCTB4OEQsIDB4QTMsIDB4OEQsIDB4QTQsIDB4OEQsIDB4QTUsIDB4OEQsIDB4QTYsIC8qIDB4MjAtMHgyMyAqLworCTB4OEQsIDB4QTcsIDB4OEQsIDB4QTgsIDB4OEQsIDB4QTksIDB4OEQsIDB4QUEsIC8qIDB4MjQtMHgyNyAqLworCTB4QjYsIDB4REYsIDB4QjYsIDB4RTAsIDB4OEQsIDB4QUIsIDB4OEQsIDB4QUMsIC8qIDB4MjgtMHgyQiAqLworCTB4QjYsIDB4RTEsIDB4OEQsIDB4QUQsIDB4OEQsIDB4QUUsIDB4QjYsIDB4RTIsIC8qIDB4MkMtMHgyRiAqLworCTB4QjYsIDB4RTMsIDB4OEQsIDB4QUYsIDB4OEQsIDB4QjAsIDB4OEQsIDB4QjEsIC8qIDB4MzAtMHgzMyAqLworCTB4OEQsIDB4QjIsIDB4OEQsIDB4QjMsIDB4OEQsIDB4QjQsIDB4OEQsIDB4QjUsIC8qIDB4MzQtMHgzNyAqLworCTB4QjYsIDB4RTQsIDB4QjYsIDB4RTUsIDB4OEQsIDB4QjYsIDB4QjYsIDB4RTYsIC8qIDB4MzgtMHgzQiAqLworCTB4OEQsIDB4QjcsIDB4OEQsIDB4QjgsIDB4OEQsIDB4QjksIDB4OEQsIDB4QkEsIC8qIDB4M0MtMHgzRiAqLworCTB4OEQsIDB4QkIsIDB4OEQsIDB4QkMsIDB4OEQsIDB4QkQsIDB4OEQsIDB4QkUsIC8qIDB4NDAtMHg0MyAqLworCTB4QjYsIDB4RTcsIDB4OEQsIDB4QkYsIDB4OEQsIDB4QzAsIDB4OEQsIDB4QzEsIC8qIDB4NDQtMHg0NyAqLworCTB4QjYsIDB4RTgsIDB4OEQsIDB4QzIsIDB4OEQsIDB4QzMsIDB4OEQsIDB4QzQsIC8qIDB4NDgtMHg0QiAqLworCTB4QjYsIDB4RTksIDB4OEQsIDB4QzUsIDB4OEQsIDB4QzYsIDB4OEQsIDB4QzcsIC8qIDB4NEMtMHg0RiAqLworCTB4OEQsIDB4QzgsIDB4OEQsIDB4QzksIDB4OEQsIDB4Q0EsIDB4OEQsIDB4Q0IsIC8qIDB4NTAtMHg1MyAqLworCTB4QjYsIDB4RUEsIDB4QjYsIDB4RUIsIDB4OEQsIDB4Q0MsIDB4OEQsIDB4Q0QsIC8qIDB4NTQtMHg1NyAqLworCTB4OEQsIDB4Q0UsIDB4OEQsIDB4Q0YsIDB4OEQsIDB4RDAsIDB4OEQsIDB4RDEsIC8qIDB4NTgtMHg1QiAqLworCTB4OEQsIDB4RDIsIDB4OEQsIDB4RDMsIDB4OEQsIDB4RDQsIDB4OEQsIDB4RDUsIC8qIDB4NUMtMHg1RiAqLworCTB4QjYsIDB4RUMsIDB4OEQsIDB4RDYsIDB4OEQsIDB4RDcsIDB4OEQsIDB4RDgsIC8qIDB4NjAtMHg2MyAqLworCTB4QjYsIDB4RUQsIDB4OEQsIDB4RDksIDB4OEQsIDB4REEsIDB4OEQsIDB4REIsIC8qIDB4NjQtMHg2NyAqLworCTB4QjYsIDB4RUUsIDB4OEQsIDB4REMsIDB4OEQsIDB4REQsIDB4OEQsIDB4REUsIC8qIDB4NjgtMHg2QiAqLworCTB4OEQsIDB4REYsIDB4OEQsIDB4RTAsIDB4OEQsIDB4RTEsIDB4OEQsIDB4RTIsIC8qIDB4NkMtMHg2RiAqLworCTB4QjYsIDB4RUYsIDB4QjYsIDB4RjAsIDB4OEQsIDB4RTMsIDB4QjYsIDB4RjEsIC8qIDB4NzAtMHg3MyAqLworCTB4OEQsIDB4RTQsIDB4QjYsIDB4RjIsIDB4OEQsIDB4RTUsIDB4OEQsIDB4RTYsIC8qIDB4NzQtMHg3NyAqLworCTB4OEQsIDB4RTcsIDB4OEQsIDB4RTgsIDB4OEQsIDB4RTksIDB4OEQsIDB4RUEsIC8qIDB4NzgtMHg3QiAqLworCTB4QjYsIDB4RjMsIDB4QjYsIDB4RjQsIDB4OEQsIDB4RUIsIDB4OEQsIDB4RUMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QjYsIDB4RjUsIDB4OEQsIDB4RUQsIDB4OEQsIDB4RUUsIDB4OEQsIDB4RUYsIC8qIDB4ODAtMHg4MyAqLworCTB4QjYsIDB4RjYsIDB4OEQsIDB4RjAsIDB4OEQsIDB4RjEsIDB4OEQsIDB4RjIsIC8qIDB4ODQtMHg4NyAqLworCTB4OEQsIDB4RjMsIDB4OEQsIDB4RjQsIDB4OEQsIDB4RjUsIDB4OEQsIDB4RjYsIC8qIDB4ODgtMHg4QiAqLworCTB4QjYsIDB4RjcsIDB4QjYsIDB4RjgsIDB4OEQsIDB4RjcsIDB4QjYsIDB4RjksIC8qIDB4OEMtMHg4RiAqLworCTB4QjYsIDB4RkEsIDB4QjYsIDB4RkIsIDB4QjYsIDB4RkMsIDB4OEQsIDB4RjgsIC8qIDB4OTAtMHg5MyAqLworCTB4OEQsIDB4RjksIDB4OEQsIDB4RkEsIDB4QjYsIDB4RkQsIDB4QjYsIDB4RkUsIC8qIDB4OTQtMHg5NyAqLworCTB4QjcsIDB4QTEsIDB4QjcsIDB4QTIsIDB4OEQsIDB4RkIsIDB4OEQsIDB4RkMsIC8qIDB4OTgtMHg5QiAqLworCTB4QjcsIDB4QTMsIDB4OEQsIDB4RkQsIDB4OEQsIDB4RkUsIDB4OEUsIDB4NDEsIC8qIDB4OUMtMHg5RiAqLworCTB4QjcsIDB4QTQsIDB4OEUsIDB4NDIsIDB4OEUsIDB4NDMsIDB4OEUsIDB4NDQsIC8qIDB4QTAtMHhBMyAqLworCTB4OEUsIDB4NDUsIDB4OEUsIDB4NDYsIDB4OEUsIDB4NDcsIDB4OEUsIDB4NDgsIC8qIDB4QTQtMHhBNyAqLworCTB4QjcsIDB4QTUsIDB4QjcsIDB4QTYsIDB4OEUsIDB4NDksIDB4QjcsIDB4QTcsIC8qIDB4QTgtMHhBQiAqLworCTB4QjcsIDB4QTgsIDB4QjcsIDB4QTksIDB4OEUsIDB4NEEsIDB4OEUsIDB4NEIsIC8qIDB4QUMtMHhBRiAqLworCTB4OEUsIDB4NEMsIDB4OEUsIDB4NEQsIDB4OEUsIDB4NEUsIDB4OEUsIDB4NEYsIC8qIDB4QjAtMHhCMyAqLworCTB4QjcsIDB4QUEsIDB4QjcsIDB4QUIsIDB4OEUsIDB4NTAsIDB4OEUsIDB4NTEsIC8qIDB4QjQtMHhCNyAqLworCTB4QjcsIDB4QUMsIDB4OEUsIDB4NTIsIDB4OEUsIDB4NTMsIDB4OEUsIDB4NTQsIC8qIDB4QjgtMHhCQiAqLworCTB4OEUsIDB4NTUsIDB4OEUsIDB4NTYsIDB4OEUsIDB4NTcsIDB4OEUsIDB4NTgsIC8qIDB4QkMtMHhCRiAqLworCTB4OEUsIDB4NTksIDB4OEUsIDB4NUEsIDB4OEUsIDB4NjEsIDB4OEUsIDB4NjIsIC8qIDB4QzAtMHhDMyAqLworCTB4OEUsIDB4NjMsIDB4OEUsIDB4NjQsIDB4OEUsIDB4NjUsIDB4QjcsIDB4QUQsIC8qIDB4QzQtMHhDNyAqLworCTB4OEUsIDB4NjYsIDB4QjcsIDB4QUUsIDB4OEUsIDB4NjcsIDB4OEUsIDB4NjgsIC8qIDB4QzgtMHhDQiAqLworCTB4OEUsIDB4NjksIDB4OEUsIDB4NkEsIDB4OEUsIDB4NkIsIDB4OEUsIDB4NkMsIC8qIDB4Q0MtMHhDRiAqLworCTB4OEUsIDB4NkQsIDB4OEUsIDB4NkUsIDB4OEUsIDB4NkYsIDB4OEUsIDB4NzAsIC8qIDB4RDAtMHhEMyAqLworCTB4OEUsIDB4NzEsIDB4OEUsIDB4NzIsIDB4OEUsIDB4NzMsIDB4OEUsIDB4NzQsIC8qIDB4RDQtMHhENyAqLworCTB4OEUsIDB4NzUsIDB4OEUsIDB4NzYsIDB4OEUsIDB4NzcsIDB4OEUsIDB4NzgsIC8qIDB4RDgtMHhEQiAqLworCTB4OEUsIDB4NzksIDB4OEUsIDB4N0EsIDB4OEUsIDB4ODEsIDB4OEUsIDB4ODIsIC8qIDB4REMtMHhERiAqLworCTB4OEUsIDB4ODMsIDB4OEUsIDB4ODQsIDB4OEUsIDB4ODUsIDB4OEUsIDB4ODYsIC8qIDB4RTAtMHhFMyAqLworCTB4OEUsIDB4ODcsIDB4OEUsIDB4ODgsIDB4OEUsIDB4ODksIDB4OEUsIDB4OEEsIC8qIDB4RTQtMHhFNyAqLworCTB4OEUsIDB4OEIsIDB4OEUsIDB4OEMsIDB4OEUsIDB4OEQsIDB4OEUsIDB4OEUsIC8qIDB4RTgtMHhFQiAqLworCTB4QjcsIDB4QUYsIDB4QjcsIDB4QjAsIDB4OEUsIDB4OEYsIDB4OEUsIDB4OTAsIC8qIDB4RUMtMHhFRiAqLworCTB4QjcsIDB4QjEsIDB4OEUsIDB4OTEsIDB4OEUsIDB4OTIsIDB4OEUsIDB4OTMsIC8qIDB4RjAtMHhGMyAqLworCTB4QjcsIDB4QjIsIDB4OEUsIDB4OTQsIDB4OEUsIDB4OTUsIDB4OEUsIDB4OTYsIC8qIDB4RjQtMHhGNyAqLworCTB4OEUsIDB4OTcsIDB4OEUsIDB4OTgsIDB4OEUsIDB4OTksIDB4OEUsIDB4OUEsIC8qIDB4RjgtMHhGQiAqLworCTB4QjcsIDB4QjMsIDB4QjcsIDB4QjQsIDB4OEUsIDB4OUIsIDB4QjcsIDB4QjUsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0I4WzUxMl0gPSB7CisJMHhCNywgMHhCNiwgMHhCNywgMHhCNywgMHg4RSwgMHg5QywgMHg4RSwgMHg5RCwgLyogMHgwMC0weDAzICovCisJMHg4RSwgMHg5RSwgMHg4RSwgMHg5RiwgMHg4RSwgMHhBMCwgMHhCNywgMHhCOCwgLyogMHgwNC0weDA3ICovCisJMHhCNywgMHhCOSwgMHhCNywgMHhCQSwgMHg4RSwgMHhBMSwgMHg4RSwgMHhBMiwgLyogMHgwOC0weDBCICovCisJMHhCNywgMHhCQiwgMHg4RSwgMHhBMywgMHg4RSwgMHhBNCwgMHg4RSwgMHhBNSwgLyogMHgwQy0weDBGICovCisJMHhCNywgMHhCQywgMHg4RSwgMHhBNiwgMHg4RSwgMHhBNywgMHg4RSwgMHhBOCwgLyogMHgxMC0weDEzICovCisJMHg4RSwgMHhBOSwgMHg4RSwgMHhBQSwgMHg4RSwgMHhBQiwgMHg4RSwgMHhBQywgLyogMHgxNC0weDE3ICovCisJMHhCNywgMHhCRCwgMHhCNywgMHhCRSwgMHg4RSwgMHhBRCwgMHhCNywgMHhCRiwgLyogMHgxOC0weDFCICovCisJMHg4RSwgMHhBRSwgMHhCNywgMHhDMCwgMHg4RSwgMHhBRiwgMHg4RSwgMHhCMCwgLyogMHgxQy0weDFGICovCisJMHg4RSwgMHhCMSwgMHg4RSwgMHhCMiwgMHg4RSwgMHhCMywgMHg4RSwgMHhCNCwgLyogMHgyMC0weDIzICovCisJMHhCNywgMHhDMSwgMHhCNywgMHhDMiwgMHg4RSwgMHhCNSwgMHg4RSwgMHhCNiwgLyogMHgyNC0weDI3ICovCisJMHhCNywgMHhDMywgMHg4RSwgMHhCNywgMHg4RSwgMHhCOCwgMHg4RSwgMHhCOSwgLyogMHgyOC0weDJCICovCisJMHhCNywgMHhDNCwgMHg4RSwgMHhCQSwgMHg4RSwgMHhCQiwgMHg4RSwgMHhCQywgLyogMHgyQy0weDJGICovCisJMHg4RSwgMHhCRCwgMHg4RSwgMHhCRSwgMHg4RSwgMHhCRiwgMHg4RSwgMHhDMCwgLyogMHgzMC0weDMzICovCisJMHhCNywgMHhDNSwgMHhCNywgMHhDNiwgMHg4RSwgMHhDMSwgMHhCNywgMHhDNywgLyogMHgzNC0weDM3ICovCisJMHhCNywgMHhDOCwgMHhCNywgMHhDOSwgMHg4RSwgMHhDMiwgMHg4RSwgMHhDMywgLyogMHgzOC0weDNCICovCisJMHg4RSwgMHhDNCwgMHg4RSwgMHhDNSwgMHg4RSwgMHhDNiwgMHg4RSwgMHhDNywgLyogMHgzQy0weDNGICovCisJMHhCNywgMHhDQSwgMHg4RSwgMHhDOCwgMHg4RSwgMHhDOSwgMHg4RSwgMHhDQSwgLyogMHg0MC0weDQzICovCisJMHhCNywgMHhDQiwgMHg4RSwgMHhDQiwgMHg4RSwgMHhDQywgMHg4RSwgMHhDRCwgLyogMHg0NC0weDQ3ICovCisJMHg4RSwgMHhDRSwgMHg4RSwgMHhDRiwgMHg4RSwgMHhEMCwgMHg4RSwgMHhEMSwgLyogMHg0OC0weDRCICovCisJMHg4RSwgMHhEMiwgMHg4RSwgMHhEMywgMHg4RSwgMHhENCwgMHg4RSwgMHhENSwgLyogMHg0Qy0weDRGICovCisJMHg4RSwgMHhENiwgMHhCNywgMHhDQywgMHg4RSwgMHhENywgMHhCNywgMHhDRCwgLyogMHg1MC0weDUzICovCisJMHg4RSwgMHhEOCwgMHg4RSwgMHhEOSwgMHg4RSwgMHhEQSwgMHg4RSwgMHhEQiwgLyogMHg1NC0weDU3ICovCisJMHg4RSwgMHhEQywgMHg4RSwgMHhERCwgMHg4RSwgMHhERSwgMHg4RSwgMHhERiwgLyogMHg1OC0weDVCICovCisJMHhCNywgMHhDRSwgMHhCNywgMHhDRiwgMHg4RSwgMHhFMCwgMHg4RSwgMHhFMSwgLyogMHg1Qy0weDVGICovCisJMHhCNywgMHhEMCwgMHg4RSwgMHhFMiwgMHg4RSwgMHhFMywgMHg4RSwgMHhFNCwgLyogMHg2MC0weDYzICovCisJMHhCNywgMHhEMSwgMHg4RSwgMHhFNSwgMHg4RSwgMHhFNiwgMHg4RSwgMHhFNywgLyogMHg2NC0weDY3ICovCisJMHg4RSwgMHhFOCwgMHg4RSwgMHhFOSwgMHg4RSwgMHhFQSwgMHg4RSwgMHhFQiwgLyogMHg2OC0weDZCICovCisJMHhCNywgMHhEMiwgMHhCNywgMHhEMywgMHg4RSwgMHhFQywgMHhCNywgMHhENCwgLyogMHg2Qy0weDZGICovCisJMHg4RSwgMHhFRCwgMHhCNywgMHhENSwgMHg4RSwgMHhFRSwgMHg4RSwgMHhFRiwgLyogMHg3MC0weDczICovCisJMHg4RSwgMHhGMCwgMHg4RSwgMHhGMSwgMHg4RSwgMHhGMiwgMHg4RSwgMHhGMywgLyogMHg3NC0weDc3ICovCisJMHhCNywgMHhENiwgMHg4RSwgMHhGNCwgMHg4RSwgMHhGNSwgMHg4RSwgMHhGNiwgLyogMHg3OC0weDdCICovCisJMHhCNywgMHhENywgMHg4RSwgMHhGNywgMHg4RSwgMHhGOCwgMHg4RSwgMHhGOSwgLyogMHg3Qy0weDdGICovCisJCisJMHg4RSwgMHhGQSwgMHg4RSwgMHhGQiwgMHg4RSwgMHhGQywgMHg4RSwgMHhGRCwgLyogMHg4MC0weDgzICovCisJMHg4RSwgMHhGRSwgMHg4RiwgMHg0MSwgMHg4RiwgMHg0MiwgMHg4RiwgMHg0MywgLyogMHg4NC0weDg3ICovCisJMHg4RiwgMHg0NCwgMHg4RiwgMHg0NSwgMHg4RiwgMHg0NiwgMHg4RiwgMHg0NywgLyogMHg4OC0weDhCICovCisJMHg4RiwgMHg0OCwgMHhCNywgMHhEOCwgMHg4RiwgMHg0OSwgMHg4RiwgMHg0QSwgLyogMHg4Qy0weDhGICovCisJMHg4RiwgMHg0QiwgMHg4RiwgMHg0QywgMHg4RiwgMHg0RCwgMHg4RiwgMHg0RSwgLyogMHg5MC0weDkzICovCisJMHg4RiwgMHg0RiwgMHg4RiwgMHg1MCwgMHg4RiwgMHg1MSwgMHg4RiwgMHg1MiwgLyogMHg5NC0weDk3ICovCisJMHg4RiwgMHg1MywgMHg4RiwgMHg1NCwgMHg4RiwgMHg1NSwgMHg4RiwgMHg1NiwgLyogMHg5OC0weDlCICovCisJMHg4RiwgMHg1NywgMHg4RiwgMHg1OCwgMHg4RiwgMHg1OSwgMHg4RiwgMHg1QSwgLyogMHg5Qy0weDlGICovCisJMHg4RiwgMHg2MSwgMHg4RiwgMHg2MiwgMHg4RiwgMHg2MywgMHg4RiwgMHg2NCwgLyogMHhBMC0weEEzICovCisJMHg4RiwgMHg2NSwgMHg4RiwgMHg2NiwgMHg4RiwgMHg2NywgMHg4RiwgMHg2OCwgLyogMHhBNC0weEE3ICovCisJMHhCNywgMHhEOSwgMHg4RiwgMHg2OSwgMHg4RiwgMHg2QSwgMHg4RiwgMHg2QiwgLyogMHhBOC0weEFCICovCisJMHg4RiwgMHg2QywgMHg4RiwgMHg2RCwgMHg4RiwgMHg2RSwgMHg4RiwgMHg2RiwgLyogMHhBQy0weEFGICovCisJMHhCNywgMHhEQSwgMHg4RiwgMHg3MCwgMHg4RiwgMHg3MSwgMHg4RiwgMHg3MiwgLyogMHhCMC0weEIzICovCisJMHhCNywgMHhEQiwgMHg4RiwgMHg3MywgMHg4RiwgMHg3NCwgMHg4RiwgMHg3NSwgLyogMHhCNC0weEI3ICovCisJMHhCNywgMHhEQywgMHg4RiwgMHg3NiwgMHg4RiwgMHg3NywgMHg4RiwgMHg3OCwgLyogMHhCOC0weEJCICovCisJMHg4RiwgMHg3OSwgMHg4RiwgMHg3QSwgMHg4RiwgMHg4MSwgMHg4RiwgMHg4MiwgLyogMHhCQy0weEJGICovCisJMHhCNywgMHhERCwgMHhCNywgMHhERSwgMHg4RiwgMHg4MywgMHhCNywgMHhERiwgLyogMHhDMC0weEMzICovCisJMHg4RiwgMHg4NCwgMHhCNywgMHhFMCwgMHg4RiwgMHg4NSwgMHg4RiwgMHg4NiwgLyogMHhDNC0weEM3ICovCisJMHg4RiwgMHg4NywgMHg4RiwgMHg4OCwgMHg4RiwgMHg4OSwgMHg4RiwgMHg4QSwgLyogMHhDOC0weENCICovCisJMHhCNywgMHhFMSwgMHg4RiwgMHg4QiwgMHg4RiwgMHg4QywgMHg4RiwgMHg4RCwgLyogMHhDQy0weENGICovCisJMHhCNywgMHhFMiwgMHg4RiwgMHg4RSwgMHg4RiwgMHg4RiwgMHg4RiwgMHg5MCwgLyogMHhEMC0weEQzICovCisJMHhCNywgMHhFMywgMHg4RiwgMHg5MSwgMHg4RiwgMHg5MiwgMHg4RiwgMHg5MywgLyogMHhENC0weEQ3ICovCisJMHg4RiwgMHg5NCwgMHg4RiwgMHg5NSwgMHg4RiwgMHg5NiwgMHg4RiwgMHg5NywgLyogMHhEOC0weERCICovCisJMHg4RiwgMHg5OCwgMHhCNywgMHhFNCwgMHg4RiwgMHg5OSwgMHhCNywgMHhFNSwgLyogMHhEQy0weERGICovCisJMHg4RiwgMHg5QSwgMHhCNywgMHhFNiwgMHg4RiwgMHg5QiwgMHg4RiwgMHg5QywgLyogMHhFMC0weEUzICovCisJMHg4RiwgMHg5RCwgMHg4RiwgMHg5RSwgMHg4RiwgMHg5RiwgMHg4RiwgMHhBMCwgLyogMHhFNC0weEU3ICovCisJMHhCNywgMHhFNywgMHhCNywgMHhFOCwgMHg4RiwgMHhBMSwgMHg4RiwgMHhBMiwgLyogMHhFOC0weEVCICovCisJMHhCNywgMHhFOSwgMHg4RiwgMHhBMywgMHg4RiwgMHhBNCwgMHg4RiwgMHhBNSwgLyogMHhFQy0weEVGICovCisJMHhCNywgMHhFQSwgMHg4RiwgMHhBNiwgMHg4RiwgMHhBNywgMHg4RiwgMHhBOCwgLyogMHhGMC0weEYzICovCisJMHg4RiwgMHhBOSwgMHg4RiwgMHhBQSwgMHg4RiwgMHhBQiwgMHg4RiwgMHhBQywgLyogMHhGNC0weEY3ICovCisJMHhCNywgMHhFQiwgMHhCNywgMHhFQywgMHg4RiwgMHhBRCwgMHhCNywgMHhFRCwgLyogMHhGOC0weEZCICovCisJMHg4RiwgMHhBRSwgMHhCNywgMHhFRSwgMHg4RiwgMHhBRiwgMHg4RiwgMHhCMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQjlbNTEyXSA9IHsKKwkweDhGLCAweEIxLCAweDhGLCAweEIyLCAweDhGLCAweEIzLCAweDhGLCAweEI0LCAvKiAweDAwLTB4MDMgKi8KKwkweEI3LCAweEVGLCAweDhGLCAweEI1LCAweDhGLCAweEI2LCAweDhGLCAweEI3LCAvKiAweDA0LTB4MDcgKi8KKwkweDhGLCAweEI4LCAweDhGLCAweEI5LCAweDhGLCAweEJBLCAweDhGLCAweEJCLCAvKiAweDA4LTB4MEIgKi8KKwkweDhGLCAweEJDLCAweDhGLCAweEJELCAweDhGLCAweEJFLCAweDhGLCAweEJGLCAvKiAweDBDLTB4MEYgKi8KKwkweDhGLCAweEMwLCAweDhGLCAweEMxLCAweDhGLCAweEMyLCAweDhGLCAweEMzLCAvKiAweDEwLTB4MTMgKi8KKwkweDhGLCAweEM0LCAweDhGLCAweEM1LCAweDhGLCAweEM2LCAweDhGLCAweEM3LCAvKiAweDE0LTB4MTcgKi8KKwkweEI3LCAweEYwLCAweDhGLCAweEM4LCAweDhGLCAweEM5LCAweDhGLCAweENBLCAvKiAweDE4LTB4MUIgKi8KKwkweDhGLCAweENCLCAweDhGLCAweENDLCAweDhGLCAweENELCAweDhGLCAweENFLCAvKiAweDFDLTB4MUYgKi8KKwkweEI3LCAweEYxLCAweDhGLCAweENGLCAweDhGLCAweEQwLCAweDhGLCAweEQxLCAvKiAweDIwLTB4MjMgKi8KKwkweDhGLCAweEQyLCAweDhGLCAweEQzLCAweDhGLCAweEQ0LCAweDhGLCAweEQ1LCAvKiAweDI0LTB4MjcgKi8KKwkweDhGLCAweEQ2LCAweDhGLCAweEQ3LCAweDhGLCAweEQ4LCAweDhGLCAweEQ5LCAvKiAweDI4LTB4MkIgKi8KKwkweDhGLCAweERBLCAweDhGLCAweERCLCAweDhGLCAweERDLCAweDhGLCAweERELCAvKiAweDJDLTB4MkYgKi8KKwkweDhGLCAweERFLCAweDhGLCAweERGLCAweDhGLCAweEUwLCAweDhGLCAweEUxLCAvKiAweDMwLTB4MzMgKi8KKwkweDhGLCAweEUyLCAweDhGLCAweEUzLCAweDhGLCAweEU0LCAweDhGLCAweEU1LCAvKiAweDM0LTB4MzcgKi8KKwkweDhGLCAweEU2LCAweDhGLCAweEU3LCAweDhGLCAweEU4LCAweDhGLCAweEU5LCAvKiAweDM4LTB4M0IgKi8KKwkweEI3LCAweEYyLCAweEI3LCAweEYzLCAweDhGLCAweEVBLCAweDhGLCAweEVCLCAvKiAweDNDLTB4M0YgKi8KKwkweEI3LCAweEY0LCAweDhGLCAweEVDLCAweDhGLCAweEVELCAweDhGLCAweEVFLCAvKiAweDQwLTB4NDMgKi8KKwkweEI3LCAweEY1LCAweDhGLCAweEVGLCAweDhGLCAweEYwLCAweDhGLCAweEYxLCAvKiAweDQ0LTB4NDcgKi8KKwkweDhGLCAweEYyLCAweDhGLCAweEYzLCAweDhGLCAweEY0LCAweDhGLCAweEY1LCAvKiAweDQ4LTB4NEIgKi8KKwkweEI3LCAweEY2LCAweDhGLCAweEY2LCAweDhGLCAweEY3LCAweEI3LCAweEY3LCAvKiAweDRDLTB4NEYgKi8KKwkweDhGLCAweEY4LCAweEI3LCAweEY4LCAweDhGLCAweEY5LCAweDhGLCAweEZBLCAvKiAweDUwLTB4NTMgKi8KKwkweDhGLCAweEZCLCAweDhGLCAweEZDLCAweDhGLCAweEZELCAweDhGLCAweEZFLCAvKiAweDU0LTB4NTcgKi8KKwkweEI3LCAweEY5LCAweEI3LCAweEZBLCAweDkwLCAweDQxLCAweDkwLCAweDQyLCAvKiAweDU4LTB4NUIgKi8KKwkweEI3LCAweEZCLCAweDkwLCAweDQzLCAweDkwLCAweDQ0LCAweDkwLCAweDQ1LCAvKiAweDVDLTB4NUYgKi8KKwkweEI3LCAweEZDLCAweDkwLCAweDQ2LCAweDkwLCAweDQ3LCAweDkwLCAweDQ4LCAvKiAweDYwLTB4NjMgKi8KKwkweDkwLCAweDQ5LCAweDkwLCAweDRBLCAweDkwLCAweDRCLCAweDkwLCAweDRDLCAvKiAweDY0LTB4NjcgKi8KKwkweEI3LCAweEZELCAweEI3LCAweEZFLCAweDkwLCAweDRELCAweEI4LCAweEExLCAvKiAweDY4LTB4NkIgKi8KKwkweDkwLCAweDRFLCAweEI4LCAweEEyLCAweDkwLCAweDRGLCAweDkwLCAweDUwLCAvKiAweDZDLTB4NkYgKi8KKwkweDkwLCAweDUxLCAweDkwLCAweDUyLCAweDkwLCAweDUzLCAweDkwLCAweDU0LCAvKiAweDcwLTB4NzMgKi8KKwkweEI4LCAweEEzLCAweEI4LCAweEE0LCAweDkwLCAweDU1LCAweDkwLCAweDU2LCAvKiAweDc0LTB4NzcgKi8KKwkweEI4LCAweEE1LCAweDkwLCAweDU3LCAweDkwLCAweDU4LCAweDkwLCAweDU5LCAvKiAweDc4LTB4N0IgKi8KKwkweEI4LCAweEE2LCAweDkwLCAweDVBLCAweDkwLCAweDYxLCAweDkwLCAweDYyLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDkwLCAweDYzLCAweDkwLCAweDY0LCAweDkwLCAweDY1LCAweDkwLCAweDY2LCAvKiAweDgwLTB4ODMgKi8KKwkweEI4LCAweEE3LCAweEI4LCAweEE4LCAweDkwLCAweDY3LCAweEI4LCAweEE5LCAvKiAweDg0LTB4ODcgKi8KKwkweDkwLCAweDY4LCAweEI4LCAweEFBLCAweEI4LCAweEFCLCAweDkwLCAweDY5LCAvKiAweDg4LTB4OEIgKi8KKwkweDkwLCAweDZBLCAweEI4LCAweEFDLCAweEI4LCAweEFELCAweDkwLCAweDZCLCAvKiAweDhDLTB4OEYgKi8KKwkweDkwLCAweDZDLCAweDkwLCAweDZELCAweDkwLCAweDZFLCAweDkwLCAweDZGLCAvKiAweDkwLTB4OTMgKi8KKwkweDkwLCAweDcwLCAweDkwLCAweDcxLCAweDkwLCAweDcyLCAweDkwLCAweDczLCAvKiAweDk0LTB4OTcgKi8KKwkweDkwLCAweDc0LCAweDkwLCAweDc1LCAweDkwLCAweDc2LCAweDkwLCAweDc3LCAvKiAweDk4LTB4OUIgKi8KKwkweDkwLCAweDc4LCAweDkwLCAweDc5LCAweDkwLCAweDdBLCAweDkwLCAweDgxLCAvKiAweDlDLTB4OUYgKi8KKwkweDkwLCAweDgyLCAweDkwLCAweDgzLCAweDkwLCAweDg0LCAweDkwLCAweDg1LCAvKiAweEEwLTB4QTMgKi8KKwkweDkwLCAweDg2LCAweDkwLCAweDg3LCAweDkwLCAweDg4LCAweDkwLCAweDg5LCAvKiAweEE0LTB4QTcgKi8KKwkweDkwLCAweDhBLCAweDkwLCAweDhCLCAweDkwLCAweDhDLCAweDkwLCAweDhELCAvKiAweEE4LTB4QUIgKi8KKwkweEI4LCAweEFFLCAweEI4LCAweEFGLCAweDkwLCAweDhFLCAweDkwLCAweDhGLCAvKiAweEFDLTB4QUYgKi8KKwkweEI4LCAweEIwLCAweDkwLCAweDkwLCAweDkwLCAweDkxLCAweDkwLCAweDkyLCAvKiAweEIwLTB4QjMgKi8KKwkweEI4LCAweEIxLCAweDkwLCAweDkzLCAweDkwLCAweDk0LCAweDkwLCAweDk1LCAvKiAweEI0LTB4QjcgKi8KKwkweDkwLCAweDk2LCAweDkwLCAweDk3LCAweDkwLCAweDk4LCAweDkwLCAweDk5LCAvKiAweEI4LTB4QkIgKi8KKwkweEI4LCAweEIyLCAweEI4LCAweEIzLCAweDkwLCAweDlBLCAweEI4LCAweEI0LCAvKiAweEJDLTB4QkYgKi8KKwkweDkwLCAweDlCLCAweEI4LCAweEI1LCAweDkwLCAweDlDLCAweDkwLCAweDlELCAvKiAweEMwLTB4QzMgKi8KKwkweDkwLCAweDlFLCAweDkwLCAweDlGLCAweDkwLCAweEEwLCAweDkwLCAweEExLCAvKiAweEM0LTB4QzcgKi8KKwkweEI4LCAweEI2LCAweEI4LCAweEI3LCAweDkwLCAweEEyLCAweDkwLCAweEEzLCAvKiAweEM4LTB4Q0IgKi8KKwkweEI4LCAweEI4LCAweDkwLCAweEE0LCAweEI4LCAweEI5LCAweEI4LCAweEJBLCAvKiAweENDLTB4Q0YgKi8KKwkweEI4LCAweEJCLCAweEI4LCAweEJDLCAweEI4LCAweEJELCAweDkwLCAweEE1LCAvKiAweEQwLTB4RDMgKi8KKwkweDkwLCAweEE2LCAweDkwLCAweEE3LCAweDkwLCAweEE4LCAweDkwLCAweEE5LCAvKiAweEQ0LTB4RDcgKi8KKwkweEI4LCAweEJFLCAweEI4LCAweEJGLCAweDkwLCAweEFBLCAweEI4LCAweEMwLCAvKiAweEQ4LTB4REIgKi8KKwkweDkwLCAweEFCLCAweEI4LCAweEMxLCAweEI4LCAweEMyLCAweDkwLCAweEFDLCAvKiAweERDLTB4REYgKi8KKwkweDkwLCAweEFELCAweEI4LCAweEMzLCAweDkwLCAweEFFLCAweEI4LCAweEM0LCAvKiAweEUwLTB4RTMgKi8KKwkweEI4LCAweEM1LCAweEI4LCAweEM2LCAweDkwLCAweEFGLCAweDkwLCAweEIwLCAvKiAweEU0LTB4RTcgKi8KKwkweEI4LCAweEM3LCAweDkwLCAweEIxLCAweDkwLCAweEIyLCAweDkwLCAweEIzLCAvKiAweEU4LTB4RUIgKi8KKwkweEI4LCAweEM4LCAweDkwLCAweEI0LCAweDkwLCAweEI1LCAweDkwLCAweEI2LCAvKiAweEVDLTB4RUYgKi8KKwkweDkwLCAweEI3LCAweDkwLCAweEI4LCAweDkwLCAweEI5LCAweDkwLCAweEJBLCAvKiAweEYwLTB4RjMgKi8KKwkweEI4LCAweEM5LCAweEI4LCAweENBLCAweDkwLCAweEJCLCAweEI4LCAweENCLCAvKiAweEY0LTB4RjcgKi8KKwkweEI4LCAweENDLCAweEI4LCAweENELCAweEI4LCAweENFLCAweDkwLCAweEJDLCAvKiAweEY4LTB4RkIgKi8KKwkweDkwLCAweEJELCAweDkwLCAweEJFLCAweDkwLCAweEJGLCAweDkwLCAweEMwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19CQVs1MTJdID0geworCTB4QjgsIDB4Q0YsIDB4QjgsIDB4RDAsIDB4OTAsIDB4QzEsIDB4OTAsIDB4QzIsIC8qIDB4MDAtMHgwMyAqLworCTB4OTAsIDB4QzMsIDB4OTAsIDB4QzQsIDB4OTAsIDB4QzUsIDB4OTAsIDB4QzYsIC8qIDB4MDQtMHgwNyAqLworCTB4QjgsIDB4RDEsIDB4OTAsIDB4QzcsIDB4OTAsIDB4QzgsIDB4OTAsIDB4QzksIC8qIDB4MDgtMHgwQiAqLworCTB4OTAsIDB4Q0EsIDB4OTAsIDB4Q0IsIDB4OTAsIDB4Q0MsIDB4OTAsIDB4Q0QsIC8qIDB4MEMtMHgwRiAqLworCTB4OTAsIDB4Q0UsIDB4OTAsIDB4Q0YsIDB4OTAsIDB4RDAsIDB4OTAsIDB4RDEsIC8qIDB4MTAtMHgxMyAqLworCTB4OTAsIDB4RDIsIDB4QjgsIDB4RDIsIDB4OTAsIDB4RDMsIDB4OTAsIDB4RDQsIC8qIDB4MTQtMHgxNyAqLworCTB4OTAsIDB4RDUsIDB4OTAsIDB4RDYsIDB4OTAsIDB4RDcsIDB4OTAsIDB4RDgsIC8qIDB4MTgtMHgxQiAqLworCTB4OTAsIDB4RDksIDB4OTAsIDB4REEsIDB4OTAsIDB4REIsIDB4OTAsIDB4REMsIC8qIDB4MUMtMHgxRiAqLworCTB4OTAsIDB4REQsIDB4OTAsIDB4REUsIDB4OTAsIDB4REYsIDB4OTAsIDB4RTAsIC8qIDB4MjAtMHgyMyAqLworCTB4OTAsIDB4RTEsIDB4OTAsIDB4RTIsIDB4OTAsIDB4RTMsIDB4OTAsIDB4RTQsIC8qIDB4MjQtMHgyNyAqLworCTB4OTAsIDB4RTUsIDB4OTAsIDB4RTYsIDB4OTAsIDB4RTcsIDB4OTAsIDB4RTgsIC8qIDB4MjgtMHgyQiAqLworCTB4OTAsIDB4RTksIDB4OTAsIDB4RUEsIDB4OTAsIDB4RUIsIDB4OTAsIDB4RUMsIC8qIDB4MkMtMHgyRiAqLworCTB4OTAsIDB4RUQsIDB4OTAsIDB4RUUsIDB4OTAsIDB4RUYsIDB4OTAsIDB4RjAsIC8qIDB4MzAtMHgzMyAqLworCTB4OTAsIDB4RjEsIDB4OTAsIDB4RjIsIDB4OTAsIDB4RjMsIDB4OTAsIDB4RjQsIC8qIDB4MzQtMHgzNyAqLworCTB4QjgsIDB4RDMsIDB4QjgsIDB4RDQsIDB4OTAsIDB4RjUsIDB4OTAsIDB4RjYsIC8qIDB4MzgtMHgzQiAqLworCTB4QjgsIDB4RDUsIDB4OTAsIDB4RjcsIDB4OTAsIDB4RjgsIDB4OTAsIDB4RjksIC8qIDB4M0MtMHgzRiAqLworCTB4QjgsIDB4RDYsIDB4OTAsIDB4RkEsIDB4QjgsIDB4RDcsIDB4OTAsIDB4RkIsIC8qIDB4NDAtMHg0MyAqLworCTB4OTAsIDB4RkMsIDB4OTAsIDB4RkQsIDB4OTAsIDB4RkUsIDB4OTEsIDB4NDEsIC8qIDB4NDQtMHg0NyAqLworCTB4QjgsIDB4RDgsIDB4QjgsIDB4RDksIDB4OTEsIDB4NDIsIDB4QjgsIDB4REEsIC8qIDB4NDgtMHg0QiAqLworCTB4OTEsIDB4NDMsIDB4QjgsIDB4REIsIDB4QjgsIDB4REMsIDB4OTEsIDB4NDQsIC8qIDB4NEMtMHg0RiAqLworCTB4OTEsIDB4NDUsIDB4OTEsIDB4NDYsIDB4OTEsIDB4NDcsIDB4QjgsIDB4REQsIC8qIDB4NTAtMHg1MyAqLworCTB4QjgsIDB4REUsIDB4QjgsIDB4REYsIDB4OTEsIDB4NDgsIDB4OTEsIDB4NDksIC8qIDB4NTQtMHg1NyAqLworCTB4QjgsIDB4RTAsIDB4OTEsIDB4NEEsIDB4OTEsIDB4NEIsIDB4OTEsIDB4NEMsIC8qIDB4NTgtMHg1QiAqLworCTB4QjgsIDB4RTEsIDB4OTEsIDB4NEQsIDB4OTEsIDB4NEUsIDB4OTEsIDB4NEYsIC8qIDB4NUMtMHg1RiAqLworCTB4OTEsIDB4NTAsIDB4OTEsIDB4NTEsIDB4OTEsIDB4NTIsIDB4OTEsIDB4NTMsIC8qIDB4NjAtMHg2MyAqLworCTB4QjgsIDB4RTIsIDB4QjgsIDB4RTMsIDB4OTEsIDB4NTQsIDB4QjgsIDB4RTQsIC8qIDB4NjQtMHg2NyAqLworCTB4QjgsIDB4RTUsIDB4QjgsIDB4RTYsIDB4OTEsIDB4NTUsIDB4OTEsIDB4NTYsIC8qIDB4NjgtMHg2QiAqLworCTB4OTEsIDB4NTcsIDB4OTEsIDB4NTgsIDB4OTEsIDB4NTksIDB4OTEsIDB4NUEsIC8qIDB4NkMtMHg2RiAqLworCTB4QjgsIDB4RTcsIDB4QjgsIDB4RTgsIDB4OTEsIDB4NjEsIDB4OTEsIDB4NjIsIC8qIDB4NzAtMHg3MyAqLworCTB4QjgsIDB4RTksIDB4OTEsIDB4NjMsIDB4OTEsIDB4NjQsIDB4OTEsIDB4NjUsIC8qIDB4NzQtMHg3NyAqLworCTB4QjgsIDB4RUEsIDB4OTEsIDB4NjYsIDB4OTEsIDB4NjcsIDB4OTEsIDB4NjgsIC8qIDB4NzgtMHg3QiAqLworCTB4OTEsIDB4NjksIDB4OTEsIDB4NkEsIDB4OTEsIDB4NkIsIDB4OTEsIDB4NkMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OTEsIDB4NkQsIDB4OTEsIDB4NkUsIDB4OTEsIDB4NkYsIDB4QjgsIDB4RUIsIC8qIDB4ODAtMHg4MyAqLworCTB4QjgsIDB4RUMsIDB4QjgsIDB4RUQsIDB4OTEsIDB4NzAsIDB4QjgsIDB4RUUsIC8qIDB4ODQtMHg4NyAqLworCTB4OTEsIDB4NzEsIDB4OTEsIDB4NzIsIDB4OTEsIDB4NzMsIDB4OTEsIDB4NzQsIC8qIDB4ODgtMHg4QiAqLworCTB4QjgsIDB4RUYsIDB4OTEsIDB4NzUsIDB4OTEsIDB4NzYsIDB4OTEsIDB4NzcsIC8qIDB4OEMtMHg4RiAqLworCTB4OTEsIDB4NzgsIDB4OTEsIDB4NzksIDB4OTEsIDB4N0EsIDB4OTEsIDB4ODEsIC8qIDB4OTAtMHg5MyAqLworCTB4OTEsIDB4ODIsIDB4OTEsIDB4ODMsIDB4OTEsIDB4ODQsIDB4OTEsIDB4ODUsIC8qIDB4OTQtMHg5NyAqLworCTB4OTEsIDB4ODYsIDB4OTEsIDB4ODcsIDB4OTEsIDB4ODgsIDB4OTEsIDB4ODksIC8qIDB4OTgtMHg5QiAqLworCTB4OTEsIDB4OEEsIDB4OTEsIDB4OEIsIDB4OTEsIDB4OEMsIDB4OTEsIDB4OEQsIC8qIDB4OUMtMHg5RiAqLworCTB4OTEsIDB4OEUsIDB4OTEsIDB4OEYsIDB4OTEsIDB4OTAsIDB4OTEsIDB4OTEsIC8qIDB4QTAtMHhBMyAqLworCTB4OTEsIDB4OTIsIDB4OTEsIDB4OTMsIDB4OTEsIDB4OTQsIDB4OTEsIDB4OTUsIC8qIDB4QTQtMHhBNyAqLworCTB4QjgsIDB4RjAsIDB4QjgsIDB4RjEsIDB4OTEsIDB4OTYsIDB4QjgsIDB4RjIsIC8qIDB4QTgtMHhBQiAqLworCTB4QjgsIDB4RjMsIDB4OTEsIDB4OTcsIDB4OTEsIDB4OTgsIDB4OTEsIDB4OTksIC8qIDB4QUMtMHhBRiAqLworCTB4QjgsIDB4RjQsIDB4OTEsIDB4OUEsIDB4QjgsIDB4RjUsIDB4OTEsIDB4OUIsIC8qIDB4QjAtMHhCMyAqLworCTB4OTEsIDB4OUMsIDB4OTEsIDB4OUQsIDB4OTEsIDB4OUUsIDB4OTEsIDB4OUYsIC8qIDB4QjQtMHhCNyAqLworCTB4QjgsIDB4RjYsIDB4QjgsIDB4RjcsIDB4OTEsIDB4QTAsIDB4QjgsIDB4RjgsIC8qIDB4QjgtMHhCQiAqLworCTB4OTEsIDB4QTEsIDB4QjgsIDB4RjksIDB4OTEsIDB4QTIsIDB4OTEsIDB4QTMsIC8qIDB4QkMtMHhCRiAqLworCTB4OTEsIDB4QTQsIDB4OTEsIDB4QTUsIDB4OTEsIDB4QTYsIDB4OTEsIDB4QTcsIC8qIDB4QzAtMHhDMyAqLworCTB4QjgsIDB4RkEsIDB4OTEsIDB4QTgsIDB4OTEsIDB4QTksIDB4OTEsIDB4QUEsIC8qIDB4QzQtMHhDNyAqLworCTB4QjgsIDB4RkIsIDB4OTEsIDB4QUIsIDB4OTEsIDB4QUMsIDB4OTEsIDB4QUQsIC8qIDB4QzgtMHhDQiAqLworCTB4OTEsIDB4QUUsIDB4OTEsIDB4QUYsIDB4OTEsIDB4QjAsIDB4OTEsIDB4QjEsIC8qIDB4Q0MtMHhDRiAqLworCTB4OTEsIDB4QjIsIDB4OTEsIDB4QjMsIDB4OTEsIDB4QjQsIDB4OTEsIDB4QjUsIC8qIDB4RDAtMHhEMyAqLworCTB4OTEsIDB4QjYsIDB4OTEsIDB4QjcsIDB4OTEsIDB4QjgsIDB4OTEsIDB4QjksIC8qIDB4RDQtMHhENyAqLworCTB4QjgsIDB4RkMsIDB4QjgsIDB4RkQsIDB4OTEsIDB4QkEsIDB4OTEsIDB4QkIsIC8qIDB4RDgtMHhEQiAqLworCTB4OTEsIDB4QkMsIDB4OTEsIDB4QkQsIDB4OTEsIDB4QkUsIDB4OTEsIDB4QkYsIC8qIDB4REMtMHhERiAqLworCTB4OTEsIDB4QzAsIDB4OTEsIDB4QzEsIDB4OTEsIDB4QzIsIDB4OTEsIDB4QzMsIC8qIDB4RTAtMHhFMyAqLworCTB4OTEsIDB4QzQsIDB4OTEsIDB4QzUsIDB4OTEsIDB4QzYsIDB4OTEsIDB4QzcsIC8qIDB4RTQtMHhFNyAqLworCTB4OTEsIDB4QzgsIDB4OTEsIDB4QzksIDB4OTEsIDB4Q0EsIDB4OTEsIDB4Q0IsIC8qIDB4RTgtMHhFQiAqLworCTB4OTEsIDB4Q0MsIDB4OTEsIDB4Q0QsIDB4OTEsIDB4Q0UsIDB4OTEsIDB4Q0YsIC8qIDB4RUMtMHhFRiAqLworCTB4OTEsIDB4RDAsIDB4OTEsIDB4RDEsIDB4OTEsIDB4RDIsIDB4OTEsIDB4RDMsIC8qIDB4RjAtMHhGMyAqLworCTB4OTEsIDB4RDQsIDB4OTEsIDB4RDUsIDB4OTEsIDB4RDYsIDB4OTEsIDB4RDcsIC8qIDB4RjQtMHhGNyAqLworCTB4OTEsIDB4RDgsIDB4OTEsIDB4RDksIDB4OTEsIDB4REEsIDB4OTEsIDB4REIsIC8qIDB4RjgtMHhGQiAqLworCTB4QjgsIDB4RkUsIDB4OTEsIDB4REMsIDB4OTEsIDB4REQsIDB4OTEsIDB4REUsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0JCWzUxMl0gPSB7CisJMHhCOSwgMHhBMSwgMHg5MSwgMHhERiwgMHg5MSwgMHhFMCwgMHg5MSwgMHhFMSwgLyogMHgwMC0weDAzICovCisJMHhCOSwgMHhBMiwgMHg5MSwgMHhFMiwgMHg5MSwgMHhFMywgMHg5MSwgMHhFNCwgLyogMHgwNC0weDA3ICovCisJMHg5MSwgMHhFNSwgMHg5MSwgMHhFNiwgMHg5MSwgMHhFNywgMHg5MSwgMHhFOCwgLyogMHgwOC0weDBCICovCisJMHg5MSwgMHhFOSwgMHhCOSwgMHhBMywgMHg5MSwgMHhFQSwgMHhCOSwgMHhBNCwgLyogMHgwQy0weDBGICovCisJMHg5MSwgMHhFQiwgMHhCOSwgMHhBNSwgMHg5MSwgMHhFQywgMHg5MSwgMHhFRCwgLyogMHgxMC0weDEzICovCisJMHg5MSwgMHhFRSwgMHg5MSwgMHhFRiwgMHg5MSwgMHhGMCwgMHg5MSwgMHhGMSwgLyogMHgxNC0weDE3ICovCisJMHhCOSwgMHhBNiwgMHg5MSwgMHhGMiwgMHg5MSwgMHhGMywgMHg5MSwgMHhGNCwgLyogMHgxOC0weDFCICovCisJMHhCOSwgMHhBNywgMHg5MSwgMHhGNSwgMHg5MSwgMHhGNiwgMHg5MSwgMHhGNywgLyogMHgxQy0weDFGICovCisJMHhCOSwgMHhBOCwgMHg5MSwgMHhGOCwgMHg5MSwgMHhGOSwgMHg5MSwgMHhGQSwgLyogMHgyMC0weDIzICovCisJMHg5MSwgMHhGQiwgMHg5MSwgMHhGQywgMHg5MSwgMHhGRCwgMHg5MSwgMHhGRSwgLyogMHgyNC0weDI3ICovCisJMHg5MiwgMHg0MSwgMHhCOSwgMHhBOSwgMHg5MiwgMHg0MiwgMHhCOSwgMHhBQSwgLyogMHgyOC0weDJCICovCisJMHg5MiwgMHg0MywgMHg5MiwgMHg0NCwgMHg5MiwgMHg0NSwgMHg5MiwgMHg0NiwgLyogMHgyQy0weDJGICovCisJMHg5MiwgMHg0NywgMHg5MiwgMHg0OCwgMHg5MiwgMHg0OSwgMHg5MiwgMHg0QSwgLyogMHgzMC0weDMzICovCisJMHhCOSwgMHhBQiwgMHhCOSwgMHhBQywgMHhCOSwgMHhBRCwgMHg5MiwgMHg0QiwgLyogMHgzNC0weDM3ICovCisJMHhCOSwgMHhBRSwgMHg5MiwgMHg0QywgMHg5MiwgMHg0RCwgMHhCOSwgMHhBRiwgLyogMHgzOC0weDNCICovCisJMHhCOSwgMHhCMCwgMHhCOSwgMHhCMSwgMHhCOSwgMHhCMiwgMHg5MiwgMHg0RSwgLyogMHgzQy0weDNGICovCisJMHg5MiwgMHg0RiwgMHg5MiwgMHg1MCwgMHg5MiwgMHg1MSwgMHg5MiwgMHg1MiwgLyogMHg0MC0weDQzICovCisJMHhCOSwgMHhCMywgMHhCOSwgMHhCNCwgMHg5MiwgMHg1MywgMHhCOSwgMHhCNSwgLyogMHg0NC0weDQ3ICovCisJMHg5MiwgMHg1NCwgMHhCOSwgMHhCNiwgMHg5MiwgMHg1NSwgMHg5MiwgMHg1NiwgLyogMHg0OC0weDRCICovCisJMHg5MiwgMHg1NywgMHhCOSwgMHhCNywgMHg5MiwgMHg1OCwgMHhCOSwgMHhCOCwgLyogMHg0Qy0weDRGICovCisJMHhCOSwgMHhCOSwgMHg5MiwgMHg1OSwgMHg5MiwgMHg1QSwgMHg5MiwgMHg2MSwgLyogMHg1MC0weDUzICovCisJMHhCOSwgMHhCQSwgMHg5MiwgMHg2MiwgMHg5MiwgMHg2MywgMHg5MiwgMHg2NCwgLyogMHg1NC0weDU3ICovCisJMHhCOSwgMHhCQiwgMHg5MiwgMHg2NSwgMHg5MiwgMHg2NiwgMHg5MiwgMHg2NywgLyogMHg1OC0weDVCICovCisJMHg5MiwgMHg2OCwgMHg5MiwgMHg2OSwgMHg5MiwgMHg2QSwgMHg5MiwgMHg2QiwgLyogMHg1Qy0weDVGICovCisJMHg5MiwgMHg2QywgMHhCOSwgMHhCQywgMHg5MiwgMHg2RCwgMHhCOSwgMHhCRCwgLyogMHg2MC0weDYzICovCisJMHg5MiwgMHg2RSwgMHg5MiwgMHg2RiwgMHg5MiwgMHg3MCwgMHg5MiwgMHg3MSwgLyogMHg2NC0weDY3ICovCisJMHg5MiwgMHg3MiwgMHg5MiwgMHg3MywgMHg5MiwgMHg3NCwgMHg5MiwgMHg3NSwgLyogMHg2OC0weDZCICovCisJMHhCOSwgMHhCRSwgMHg5MiwgMHg3NiwgMHg5MiwgMHg3NywgMHg5MiwgMHg3OCwgLyogMHg2Qy0weDZGICovCisJMHg5MiwgMHg3OSwgMHg5MiwgMHg3QSwgMHg5MiwgMHg4MSwgMHg5MiwgMHg4MiwgLyogMHg3MC0weDczICovCisJMHg5MiwgMHg4MywgMHg5MiwgMHg4NCwgMHg5MiwgMHg4NSwgMHg5MiwgMHg4NiwgLyogMHg3NC0weDc3ICovCisJMHg5MiwgMHg4NywgMHg5MiwgMHg4OCwgMHg5MiwgMHg4OSwgMHg5MiwgMHg4QSwgLyogMHg3OC0weDdCICovCisJMHg5MiwgMHg4QiwgMHg5MiwgMHg4QywgMHg5MiwgMHg4RCwgMHg5MiwgMHg4RSwgLyogMHg3Qy0weDdGICovCisJCisJMHg5MiwgMHg4RiwgMHg5MiwgMHg5MCwgMHg5MiwgMHg5MSwgMHg5MiwgMHg5MiwgLyogMHg4MC0weDgzICovCisJMHg5MiwgMHg5MywgMHg5MiwgMHg5NCwgMHg5MiwgMHg5NSwgMHg5MiwgMHg5NiwgLyogMHg4NC0weDg3ICovCisJMHhCOSwgMHhCRiwgMHg5MiwgMHg5NywgMHg5MiwgMHg5OCwgMHg5MiwgMHg5OSwgLyogMHg4OC0weDhCICovCisJMHhCOSwgMHhDMCwgMHg5MiwgMHg5QSwgMHg5MiwgMHg5QiwgMHg5MiwgMHg5QywgLyogMHg4Qy0weDhGICovCisJMHhCOSwgMHhDMSwgMHg5MiwgMHg5RCwgMHg5MiwgMHg5RSwgMHg5MiwgMHg5RiwgLyogMHg5MC0weDkzICovCisJMHg5MiwgMHhBMCwgMHg5MiwgMHhBMSwgMHg5MiwgMHhBMiwgMHg5MiwgMHhBMywgLyogMHg5NC0weDk3ICovCisJMHg5MiwgMHhBNCwgMHg5MiwgMHhBNSwgMHg5MiwgMHhBNiwgMHg5MiwgMHhBNywgLyogMHg5OC0weDlCICovCisJMHg5MiwgMHhBOCwgMHg5MiwgMHhBOSwgMHg5MiwgMHhBQSwgMHg5MiwgMHhBQiwgLyogMHg5Qy0weDlGICovCisJMHg5MiwgMHhBQywgMHg5MiwgMHhBRCwgMHg5MiwgMHhBRSwgMHg5MiwgMHhBRiwgLyogMHhBMC0weEEzICovCisJMHhCOSwgMHhDMiwgMHg5MiwgMHhCMCwgMHg5MiwgMHhCMSwgMHg5MiwgMHhCMiwgLyogMHhBNC0weEE3ICovCisJMHhCOSwgMHhDMywgMHg5MiwgMHhCMywgMHg5MiwgMHhCNCwgMHg5MiwgMHhCNSwgLyogMHhBOC0weEFCICovCisJMHhCOSwgMHhDNCwgMHg5MiwgMHhCNiwgMHg5MiwgMHhCNywgMHg5MiwgMHhCOCwgLyogMHhBQy0weEFGICovCisJMHg5MiwgMHhCOSwgMHg5MiwgMHhCQSwgMHg5MiwgMHhCQiwgMHg5MiwgMHhCQywgLyogMHhCMC0weEIzICovCisJMHhCOSwgMHhDNSwgMHg5MiwgMHhCRCwgMHg5MiwgMHhCRSwgMHhCOSwgMHhDNiwgLyogMHhCNC0weEI3ICovCisJMHg5MiwgMHhCRiwgMHg5MiwgMHhDMCwgMHg5MiwgMHhDMSwgMHg5MiwgMHhDMiwgLyogMHhCOC0weEJCICovCisJMHg5MiwgMHhDMywgMHg5MiwgMHhDNCwgMHg5MiwgMHhDNSwgMHg5MiwgMHhDNiwgLyogMHhCQy0weEJGICovCisJMHhCOSwgMHhDNywgMHg5MiwgMHhDNywgMHg5MiwgMHhDOCwgMHg5MiwgMHhDOSwgLyogMHhDMC0weEMzICovCisJMHhCOSwgMHhDOCwgMHg5MiwgMHhDQSwgMHg5MiwgMHhDQiwgMHg5MiwgMHhDQywgLyogMHhDNC0weEM3ICovCisJMHhCOSwgMHhDOSwgMHg5MiwgMHhDRCwgMHg5MiwgMHhDRSwgMHg5MiwgMHhDRiwgLyogMHhDOC0weENCICovCisJMHg5MiwgMHhEMCwgMHg5MiwgMHhEMSwgMHg5MiwgMHhEMiwgMHg5MiwgMHhEMywgLyogMHhDQy0weENGICovCisJMHhCOSwgMHhDQSwgMHg5MiwgMHhENCwgMHg5MiwgMHhENSwgMHhCOSwgMHhDQiwgLyogMHhEMC0weEQzICovCisJMHg5MiwgMHhENiwgMHg5MiwgMHhENywgMHg5MiwgMHhEOCwgMHg5MiwgMHhEOSwgLyogMHhENC0weEQ3ICovCisJMHg5MiwgMHhEQSwgMHg5MiwgMHhEQiwgMHg5MiwgMHhEQywgMHg5MiwgMHhERCwgLyogMHhEOC0weERCICovCisJMHg5MiwgMHhERSwgMHg5MiwgMHhERiwgMHg5MiwgMHhFMCwgMHg5MiwgMHhFMSwgLyogMHhEQy0weERGICovCisJMHg5MiwgMHhFMiwgMHg5MiwgMHhFMywgMHg5MiwgMHhFNCwgMHg5MiwgMHhFNSwgLyogMHhFMC0weEUzICovCisJMHg5MiwgMHhFNiwgMHg5MiwgMHhFNywgMHg5MiwgMHhFOCwgMHg5MiwgMHhFOSwgLyogMHhFNC0weEU3ICovCisJMHg5MiwgMHhFQSwgMHg5MiwgMHhFQiwgMHg5MiwgMHhFQywgMHg5MiwgMHhFRCwgLyogMHhFOC0weEVCICovCisJMHg5MiwgMHhFRSwgMHg5MiwgMHhFRiwgMHg5MiwgMHhGMCwgMHg5MiwgMHhGMSwgLyogMHhFQy0weEVGICovCisJMHg5MiwgMHhGMiwgMHg5MiwgMHhGMywgMHg5MiwgMHhGNCwgMHg5MiwgMHhGNSwgLyogMHhGMC0weEYzICovCisJMHg5MiwgMHhGNiwgMHg5MiwgMHhGNywgMHg5MiwgMHhGOCwgMHg5MiwgMHhGOSwgLyogMHhGNC0weEY3ICovCisJMHhCOSwgMHhDQywgMHhCOSwgMHhDRCwgMHg5MiwgMHhGQSwgMHg5MiwgMHhGQiwgLyogMHhGOC0weEZCICovCisJMHhCOSwgMHhDRSwgMHg5MiwgMHhGQywgMHg5MiwgMHhGRCwgMHhCOSwgMHhDRiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQkNbNTEyXSA9IHsKKwkweEI5LCAweEQwLCAweDkyLCAweEZFLCAweEI5LCAweEQxLCAweDkzLCAweDQxLCAvKiAweDAwLTB4MDMgKi8KKwkweDkzLCAweDQyLCAweDkzLCAweDQzLCAweDkzLCAweDQ0LCAweDkzLCAweDQ1LCAvKiAweDA0LTB4MDcgKi8KKwkweEI5LCAweEQyLCAweEI5LCAweEQzLCAweDkzLCAweDQ2LCAweEI5LCAweEQ0LCAvKiAweDA4LTB4MEIgKi8KKwkweEI5LCAweEQ1LCAweEI5LCAweEQ2LCAweDkzLCAweDQ3LCAweEI5LCAweEQ3LCAvKiAweDBDLTB4MEYgKi8KKwkweDkzLCAweDQ4LCAweEI5LCAweEQ4LCAweDkzLCAweDQ5LCAweDkzLCAweDRBLCAvKiAweDEwLTB4MTMgKi8KKwkweEI5LCAweEQ5LCAweEI5LCAweERBLCAweEI5LCAweERCLCAweEI5LCAweERDLCAvKiAweDE0LTB4MTcgKi8KKwkweEI5LCAweERELCAweDkzLCAweDRCLCAweDkzLCAweDRDLCAweEI5LCAweERFLCAvKiAweDE4LTB4MUIgKi8KKwkweEI5LCAweERGLCAweEI5LCAweEUwLCAweEI5LCAweEUxLCAweEI5LCAweEUyLCAvKiAweDFDLTB4MUYgKi8KKwkweDkzLCAweDRELCAweDkzLCAweDRFLCAweDkzLCAweDRGLCAweDkzLCAweDUwLCAvKiAweDIwLTB4MjMgKi8KKwkweEI5LCAweEUzLCAweEI5LCAweEU0LCAweDkzLCAweDUxLCAweEI5LCAweEU1LCAvKiAweDI0LTB4MjcgKi8KKwkweDkzLCAweDUyLCAweEI5LCAweEU2LCAweDkzLCAweDUzLCAweDkzLCAweDU0LCAvKiAweDI4LTB4MkIgKi8KKwkweDkzLCAweDU1LCAweEI5LCAweEU3LCAweDkzLCAweDU2LCAweDkzLCAweDU3LCAvKiAweDJDLTB4MkYgKi8KKwkweEI5LCAweEU4LCAweEI5LCAweEU5LCAweDkzLCAweDU4LCAweDkzLCAweDU5LCAvKiAweDMwLTB4MzMgKi8KKwkweEI5LCAweEVBLCAweDkzLCAweDVBLCAweDkzLCAweDYxLCAweDkzLCAweDYyLCAvKiAweDM0LTB4MzcgKi8KKwkweEI5LCAweEVCLCAweDkzLCAweDYzLCAweDkzLCAweDY0LCAweDkzLCAweDY1LCAvKiAweDM4LTB4M0IgKi8KKwkweDkzLCAweDY2LCAweDkzLCAweDY3LCAweDkzLCAweDY4LCAweDkzLCAweDY5LCAvKiAweDNDLTB4M0YgKi8KKwkweEI5LCAweEVDLCAweEI5LCAweEVELCAweDkzLCAweDZBLCAweEI5LCAweEVFLCAvKiAweDQwLTB4NDMgKi8KKwkweEI5LCAweEVGLCAweEI5LCAweEYwLCAweDkzLCAweDZCLCAweDkzLCAweDZDLCAvKiAweDQ0LTB4NDcgKi8KKwkweDkzLCAweDZELCAweEI5LCAweEYxLCAweDkzLCAweDZFLCAweDkzLCAweDZGLCAvKiAweDQ4LTB4NEIgKi8KKwkweEI5LCAweEYyLCAweEI5LCAweEYzLCAweDkzLCAweDcwLCAweDkzLCAweDcxLCAvKiAweDRDLTB4NEYgKi8KKwkweEI5LCAweEY0LCAweDkzLCAweDcyLCAweDkzLCAweDczLCAweDkzLCAweDc0LCAvKiAweDUwLTB4NTMgKi8KKwkweDkzLCAweDc1LCAweDkzLCAweDc2LCAweDkzLCAweDc3LCAweDkzLCAweDc4LCAvKiAweDU0LTB4NTcgKi8KKwkweDkzLCAweDc5LCAweDkzLCAweDdBLCAweDkzLCAweDgxLCAweDkzLCAweDgyLCAvKiAweDU4LTB4NUIgKi8KKwkweDkzLCAweDgzLCAweEI5LCAweEY1LCAweDkzLCAweDg0LCAweDkzLCAweDg1LCAvKiAweDVDLTB4NUYgKi8KKwkweDkzLCAweDg2LCAweDkzLCAweDg3LCAweDkzLCAweDg4LCAweDkzLCAweDg5LCAvKiAweDYwLTB4NjMgKi8KKwkweDkzLCAweDhBLCAweDkzLCAweDhCLCAweDkzLCAweDhDLCAweDkzLCAweDhELCAvKiAweDY0LTB4NjcgKi8KKwkweDkzLCAweDhFLCAweDkzLCAweDhGLCAweDkzLCAweDkwLCAweDkzLCAweDkxLCAvKiAweDY4LTB4NkIgKi8KKwkweDkzLCAweDkyLCAweDkzLCAweDkzLCAweDkzLCAweDk0LCAweDkzLCAweDk1LCAvKiAweDZDLTB4NkYgKi8KKwkweDkzLCAweDk2LCAweDkzLCAweDk3LCAweDkzLCAweDk4LCAweDkzLCAweDk5LCAvKiAweDcwLTB4NzMgKi8KKwkweDkzLCAweDlBLCAweDkzLCAweDlCLCAweDkzLCAweDlDLCAweDkzLCAweDlELCAvKiAweDc0LTB4NzcgKi8KKwkweDkzLCAweDlFLCAweDkzLCAweDlGLCAweDkzLCAweEEwLCAweDkzLCAweEExLCAvKiAweDc4LTB4N0IgKi8KKwkweDkzLCAweEEyLCAweDkzLCAweEEzLCAweDkzLCAweEE0LCAweDkzLCAweEE1LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDkzLCAweEE2LCAweDkzLCAweEE3LCAweDkzLCAweEE4LCAweDkzLCAweEE5LCAvKiAweDgwLTB4ODMgKi8KKwkweEI5LCAweEY2LCAweEI5LCAweEY3LCAweDkzLCAweEFBLCAweDkzLCAweEFCLCAvKiAweDg0LTB4ODcgKi8KKwkweEI5LCAweEY4LCAweDkzLCAweEFDLCAweDkzLCAweEFELCAweEI5LCAweEY5LCAvKiAweDg4LTB4OEIgKi8KKwkweEI5LCAweEZBLCAweDkzLCAweEFFLCAweEI5LCAweEZCLCAweDkzLCAweEFGLCAvKiAweDhDLTB4OEYgKi8KKwkweDkzLCAweEIwLCAweDkzLCAweEIxLCAweDkzLCAweEIyLCAweDkzLCAweEIzLCAvKiAweDkwLTB4OTMgKi8KKwkweEI5LCAweEZDLCAweEI5LCAweEZELCAweDkzLCAweEI0LCAweEI5LCAweEZFLCAvKiAweDk0LTB4OTcgKi8KKwkweDkzLCAweEI1LCAweEJBLCAweEExLCAweEJBLCAweEEyLCAweDkzLCAweEI2LCAvKiAweDk4LTB4OUIgKi8KKwkweDkzLCAweEI3LCAweDkzLCAweEI4LCAweDkzLCAweEI5LCAweDkzLCAweEJBLCAvKiAweDlDLTB4OUYgKi8KKwkweEJBLCAweEEzLCAweEJBLCAweEE0LCAweDkzLCAweEJCLCAweDkzLCAweEJDLCAvKiAweEEwLTB4QTMgKi8KKwkweEJBLCAweEE1LCAweDkzLCAweEJELCAweDkzLCAweEJFLCAweEJBLCAweEE2LCAvKiAweEE0LTB4QTcgKi8KKwkweEJBLCAweEE3LCAweDkzLCAweEJGLCAweDkzLCAweEMwLCAweDkzLCAweEMxLCAvKiAweEE4LTB4QUIgKi8KKwkweDkzLCAweEMyLCAweDkzLCAweEMzLCAweDkzLCAweEM0LCAweDkzLCAweEM1LCAvKiAweEFDLTB4QUYgKi8KKwkweEJBLCAweEE4LCAweEJBLCAweEE5LCAweDkzLCAweEM2LCAweEJBLCAweEFBLCAvKiAweEIwLTB4QjMgKi8KKwkweEJBLCAweEFCLCAweEJBLCAweEFDLCAweDkzLCAweEM3LCAweDkzLCAweEM4LCAvKiAweEI0LTB4QjcgKi8KKwkweDkzLCAweEM5LCAweDkzLCAweENBLCAweDkzLCAweENCLCAweDkzLCAweENDLCAvKiAweEI4LTB4QkIgKi8KKwkweEJBLCAweEFELCAweEJBLCAweEFFLCAweDkzLCAweENELCAweDkzLCAweENFLCAvKiAweEJDLTB4QkYgKi8KKwkweEJBLCAweEFGLCAweDkzLCAweENGLCAweDkzLCAweEQwLCAweDkzLCAweEQxLCAvKiAweEMwLTB4QzMgKi8KKwkweEJBLCAweEIwLCAweDkzLCAweEQyLCAweDkzLCAweEQzLCAweDkzLCAweEQ0LCAvKiAweEM0LTB4QzcgKi8KKwkweDkzLCAweEQ1LCAweDkzLCAweEQ2LCAweDkzLCAweEQ3LCAweDkzLCAweEQ4LCAvKiAweEM4LTB4Q0IgKi8KKwkweDkzLCAweEQ5LCAweEJBLCAweEIxLCAweDkzLCAweERBLCAweEJBLCAweEIyLCAvKiAweENDLTB4Q0YgKi8KKwkweEJBLCAweEIzLCAweEJBLCAweEI0LCAweDkzLCAweERCLCAweDkzLCAweERDLCAvKiAweEQwLTB4RDMgKi8KKwkweDkzLCAweERELCAweEJBLCAweEI1LCAweDkzLCAweERFLCAweDkzLCAweERGLCAvKiAweEQ0LTB4RDcgKi8KKwkweEJBLCAweEI2LCAweDkzLCAweEUwLCAweDkzLCAweEUxLCAweDkzLCAweEUyLCAvKiAweEQ4LTB4REIgKi8KKwkweEJBLCAweEI3LCAweDkzLCAweEUzLCAweDkzLCAweEU0LCAweDkzLCAweEU1LCAvKiAweERDLTB4REYgKi8KKwkweDkzLCAweEU2LCAweDkzLCAweEU3LCAweDkzLCAweEU4LCAweDkzLCAweEU5LCAvKiAweEUwLTB4RTMgKi8KKwkweDkzLCAweEVBLCAweDkzLCAweEVCLCAweDkzLCAweEVDLCAweDkzLCAweEVELCAvKiAweEU0LTB4RTcgKi8KKwkweDkzLCAweEVFLCAweDkzLCAweEVGLCAweDkzLCAweEYwLCAweDkzLCAweEYxLCAvKiAweEU4LTB4RUIgKi8KKwkweDkzLCAweEYyLCAweDkzLCAweEYzLCAweDkzLCAweEY0LCAweDkzLCAweEY1LCAvKiAweEVDLTB4RUYgKi8KKwkweDkzLCAweEY2LCAweDkzLCAweEY3LCAweDkzLCAweEY4LCAweDkzLCAweEY5LCAvKiAweEYwLTB4RjMgKi8KKwkweEJBLCAweEI4LCAweEJBLCAweEI5LCAweEJBLCAweEJBLCAweDkzLCAweEZBLCAvKiAweEY0LTB4RjcgKi8KKwkweEJBLCAweEJCLCAweDkzLCAweEZCLCAweDkzLCAweEZDLCAweDkzLCAweEZELCAvKiAweEY4LTB4RkIgKi8KKwkweEJBLCAweEJDLCAweDkzLCAweEZFLCAweDk0LCAweDQxLCAweDk0LCAweDQyLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19CRFs1MTJdID0geworCTB4OTQsIDB4NDMsIDB4OTQsIDB4NDQsIDB4OTQsIDB4NDUsIDB4OTQsIDB4NDYsIC8qIDB4MDAtMHgwMyAqLworCTB4QkEsIDB4QkQsIDB4QkEsIDB4QkUsIDB4OTQsIDB4NDcsIDB4QkEsIDB4QkYsIC8qIDB4MDQtMHgwNyAqLworCTB4OTQsIDB4NDgsIDB4QkEsIDB4QzAsIDB4OTQsIDB4NDksIDB4OTQsIDB4NEEsIC8qIDB4MDgtMHgwQiAqLworCTB4OTQsIDB4NEIsIDB4OTQsIDB4NEMsIDB4OTQsIDB4NEQsIDB4OTQsIDB4NEUsIC8qIDB4MEMtMHgwRiAqLworCTB4QkEsIDB4QzEsIDB4OTQsIDB4NEYsIDB4OTQsIDB4NTAsIDB4OTQsIDB4NTEsIC8qIDB4MTAtMHgxMyAqLworCTB4QkEsIDB4QzIsIDB4OTQsIDB4NTIsIDB4OTQsIDB4NTMsIDB4OTQsIDB4NTQsIC8qIDB4MTQtMHgxNyAqLworCTB4OTQsIDB4NTUsIDB4OTQsIDB4NTYsIDB4OTQsIDB4NTcsIDB4OTQsIDB4NTgsIC8qIDB4MTgtMHgxQiAqLworCTB4OTQsIDB4NTksIDB4OTQsIDB4NUEsIDB4OTQsIDB4NjEsIDB4OTQsIDB4NjIsIC8qIDB4MUMtMHgxRiAqLworCTB4OTQsIDB4NjMsIDB4OTQsIDB4NjQsIDB4OTQsIDB4NjUsIDB4OTQsIDB4NjYsIC8qIDB4MjAtMHgyMyAqLworCTB4QkEsIDB4QzMsIDB4OTQsIDB4NjcsIDB4OTQsIDB4NjgsIDB4OTQsIDB4NjksIC8qIDB4MjQtMHgyNyAqLworCTB4OTQsIDB4NkEsIDB4OTQsIDB4NkIsIDB4OTQsIDB4NkMsIDB4OTQsIDB4NkQsIC8qIDB4MjgtMHgyQiAqLworCTB4QkEsIDB4QzQsIDB4OTQsIDB4NkUsIDB4OTQsIDB4NkYsIDB4OTQsIDB4NzAsIC8qIDB4MkMtMHgyRiAqLworCTB4OTQsIDB4NzEsIDB4OTQsIDB4NzIsIDB4OTQsIDB4NzMsIDB4OTQsIDB4NzQsIC8qIDB4MzAtMHgzMyAqLworCTB4OTQsIDB4NzUsIDB4OTQsIDB4NzYsIDB4OTQsIDB4NzcsIDB4OTQsIDB4NzgsIC8qIDB4MzQtMHgzNyAqLworCTB4OTQsIDB4NzksIDB4OTQsIDB4N0EsIDB4OTQsIDB4ODEsIDB4OTQsIDB4ODIsIC8qIDB4MzgtMHgzQiAqLworCTB4OTQsIDB4ODMsIDB4OTQsIDB4ODQsIDB4OTQsIDB4ODUsIDB4OTQsIDB4ODYsIC8qIDB4M0MtMHgzRiAqLworCTB4QkEsIDB4QzUsIDB4OTQsIDB4ODcsIDB4OTQsIDB4ODgsIDB4OTQsIDB4ODksIC8qIDB4NDAtMHg0MyAqLworCTB4OTQsIDB4OEEsIDB4OTQsIDB4OEIsIDB4OTQsIDB4OEMsIDB4OTQsIDB4OEQsIC8qIDB4NDQtMHg0NyAqLworCTB4QkEsIDB4QzYsIDB4QkEsIDB4QzcsIDB4OTQsIDB4OEUsIDB4OTQsIDB4OEYsIC8qIDB4NDgtMHg0QiAqLworCTB4QkEsIDB4QzgsIDB4OTQsIDB4OTAsIDB4OTQsIDB4OTEsIDB4OTQsIDB4OTIsIC8qIDB4NEMtMHg0RiAqLworCTB4QkEsIDB4QzksIDB4OTQsIDB4OTMsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTUsIC8qIDB4NTAtMHg1MyAqLworCTB4OTQsIDB4OTYsIDB4OTQsIDB4OTcsIDB4OTQsIDB4OTgsIDB4OTQsIDB4OTksIC8qIDB4NTQtMHg1NyAqLworCTB4QkEsIDB4Q0EsIDB4QkEsIDB4Q0IsIDB4OTQsIDB4OUEsIDB4OTQsIDB4OUIsIC8qIDB4NTgtMHg1QiAqLworCTB4OTQsIDB4OUMsIDB4OTQsIDB4OUQsIDB4OTQsIDB4OUUsIDB4OTQsIDB4OUYsIC8qIDB4NUMtMHg1RiAqLworCTB4OTQsIDB4QTAsIDB4OTQsIDB4QTEsIDB4OTQsIDB4QTIsIDB4OTQsIDB4QTMsIC8qIDB4NjAtMHg2MyAqLworCTB4QkEsIDB4Q0MsIDB4OTQsIDB4QTQsIDB4OTQsIDB4QTUsIDB4OTQsIDB4QTYsIC8qIDB4NjQtMHg2NyAqLworCTB4QkEsIDB4Q0QsIDB4OTQsIDB4QTcsIDB4OTQsIDB4QTgsIDB4OTQsIDB4QTksIC8qIDB4NjgtMHg2QiAqLworCTB4OTQsIDB4QUEsIDB4OTQsIDB4QUIsIDB4OTQsIDB4QUMsIDB4OTQsIDB4QUQsIC8qIDB4NkMtMHg2RiAqLworCTB4OTQsIDB4QUUsIDB4OTQsIDB4QUYsIDB4OTQsIDB4QjAsIDB4OTQsIDB4QjEsIC8qIDB4NzAtMHg3MyAqLworCTB4OTQsIDB4QjIsIDB4OTQsIDB4QjMsIDB4OTQsIDB4QjQsIDB4OTQsIDB4QjUsIC8qIDB4NzQtMHg3NyAqLworCTB4OTQsIDB4QjYsIDB4OTQsIDB4QjcsIDB4OTQsIDB4QjgsIDB4OTQsIDB4QjksIC8qIDB4NzgtMHg3QiAqLworCTB4OTQsIDB4QkEsIDB4OTQsIDB4QkIsIDB4OTQsIDB4QkMsIDB4OTQsIDB4QkQsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QkEsIDB4Q0UsIDB4QkEsIDB4Q0YsIDB4OTQsIDB4QkUsIDB4OTQsIDB4QkYsIC8qIDB4ODAtMHg4MyAqLworCTB4QkEsIDB4RDAsIDB4OTQsIDB4QzAsIDB4OTQsIDB4QzEsIDB4QkEsIDB4RDEsIC8qIDB4ODQtMHg4NyAqLworCTB4QkEsIDB4RDIsIDB4QkEsIDB4RDMsIDB4QkEsIDB4RDQsIDB4OTQsIDB4QzIsIC8qIDB4ODgtMHg4QiAqLworCTB4OTQsIDB4QzMsIDB4OTQsIDB4QzQsIDB4OTQsIDB4QzUsIDB4OTQsIDB4QzYsIC8qIDB4OEMtMHg4RiAqLworCTB4QkEsIDB4RDUsIDB4QkEsIDB4RDYsIDB4OTQsIDB4QzcsIDB4QkEsIDB4RDcsIC8qIDB4OTAtMHg5MyAqLworCTB4OTQsIDB4QzgsIDB4QkEsIDB4RDgsIDB4OTQsIDB4QzksIDB4OTQsIDB4Q0EsIC8qIDB4OTQtMHg5NyAqLworCTB4OTQsIDB4Q0IsIDB4QkEsIDB4RDksIDB4QkEsIDB4REEsIDB4OTQsIDB4Q0MsIC8qIDB4OTgtMHg5QiAqLworCTB4QkEsIDB4REIsIDB4OTQsIDB4Q0QsIDB4OTQsIDB4Q0UsIDB4OTQsIDB4Q0YsIC8qIDB4OUMtMHg5RiAqLworCTB4OTQsIDB4RDAsIDB4OTQsIDB4RDEsIDB4OTQsIDB4RDIsIDB4OTQsIDB4RDMsIC8qIDB4QTAtMHhBMyAqLworCTB4QkEsIDB4REMsIDB4OTQsIDB4RDQsIDB4OTQsIDB4RDUsIDB4OTQsIDB4RDYsIC8qIDB4QTQtMHhBNyAqLworCTB4OTQsIDB4RDcsIDB4OTQsIDB4RDgsIDB4OTQsIDB4RDksIDB4OTQsIDB4REEsIC8qIDB4QTgtMHhBQiAqLworCTB4OTQsIDB4REIsIDB4OTQsIDB4REMsIDB4OTQsIDB4REQsIDB4OTQsIDB4REUsIC8qIDB4QUMtMHhBRiAqLworCTB4QkEsIDB4REQsIDB4OTQsIDB4REYsIDB4OTQsIDB4RTAsIDB4OTQsIDB4RTEsIC8qIDB4QjAtMHhCMyAqLworCTB4OTQsIDB4RTIsIDB4OTQsIDB4RTMsIDB4OTQsIDB4RTQsIDB4OTQsIDB4RTUsIC8qIDB4QjQtMHhCNyAqLworCTB4QkEsIDB4REUsIDB4OTQsIDB4RTYsIDB4OTQsIDB4RTcsIDB4OTQsIDB4RTgsIC8qIDB4QjgtMHhCQiAqLworCTB4OTQsIDB4RTksIDB4OTQsIDB4RUEsIDB4OTQsIDB4RUIsIDB4OTQsIDB4RUMsIC8qIDB4QkMtMHhCRiAqLworCTB4OTQsIDB4RUQsIDB4OTQsIDB4RUUsIDB4OTQsIDB4RUYsIDB4OTQsIDB4RjAsIC8qIDB4QzAtMHhDMyAqLworCTB4OTQsIDB4RjEsIDB4OTQsIDB4RjIsIDB4OTQsIDB4RjMsIDB4OTQsIDB4RjQsIC8qIDB4QzQtMHhDNyAqLworCTB4OTQsIDB4RjUsIDB4OTQsIDB4RjYsIDB4OTQsIDB4RjcsIDB4OTQsIDB4RjgsIC8qIDB4QzgtMHhDQiAqLworCTB4OTQsIDB4RjksIDB4OTQsIDB4RkEsIDB4OTQsIDB4RkIsIDB4OTQsIDB4RkMsIC8qIDB4Q0MtMHhDRiAqLworCTB4OTQsIDB4RkQsIDB4OTQsIDB4RkUsIDB4OTUsIDB4NDEsIDB4OTUsIDB4NDIsIC8qIDB4RDAtMHhEMyAqLworCTB4QkEsIDB4REYsIDB4QkEsIDB4RTAsIDB4OTUsIDB4NDMsIDB4OTUsIDB4NDQsIC8qIDB4RDQtMHhENyAqLworCTB4QkEsIDB4RTEsIDB4OTUsIDB4NDUsIDB4OTUsIDB4NDYsIDB4OTUsIDB4NDcsIC8qIDB4RDgtMHhEQiAqLworCTB4QkEsIDB4RTIsIDB4OTUsIDB4NDgsIDB4OTUsIDB4NDksIDB4OTUsIDB4NEEsIC8qIDB4REMtMHhERiAqLworCTB4OTUsIDB4NEIsIDB4OTUsIDB4NEMsIDB4OTUsIDB4NEQsIDB4OTUsIDB4NEUsIC8qIDB4RTAtMHhFMyAqLworCTB4OTUsIDB4NEYsIDB4OTUsIDB4NTAsIDB4OTUsIDB4NTEsIDB4OTUsIDB4NTIsIC8qIDB4RTQtMHhFNyAqLworCTB4OTUsIDB4NTMsIDB4QkEsIDB4RTMsIDB4OTUsIDB4NTQsIDB4OTUsIDB4NTUsIC8qIDB4RTgtMHhFQiAqLworCTB4OTUsIDB4NTYsIDB4OTUsIDB4NTcsIDB4OTUsIDB4NTgsIDB4OTUsIDB4NTksIC8qIDB4RUMtMHhFRiAqLworCTB4QkEsIDB4RTQsIDB4OTUsIDB4NUEsIDB4OTUsIDB4NjEsIDB4OTUsIDB4NjIsIC8qIDB4RjAtMHhGMyAqLworCTB4QkEsIDB4RTUsIDB4OTUsIDB4NjMsIDB4OTUsIDB4NjQsIDB4OTUsIDB4NjUsIC8qIDB4RjQtMHhGNyAqLworCTB4QkEsIDB4RTYsIDB4OTUsIDB4NjYsIDB4OTUsIDB4NjcsIDB4OTUsIDB4NjgsIC8qIDB4RjgtMHhGQiAqLworCTB4OTUsIDB4NjksIDB4OTUsIDB4NkEsIDB4OTUsIDB4NkIsIDB4OTUsIDB4NkMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0JFWzUxMl0gPSB7CisJMHhCQSwgMHhFNywgMHg5NSwgMHg2RCwgMHg5NSwgMHg2RSwgMHhCQSwgMHhFOCwgLyogMHgwMC0weDAzICovCisJMHg5NSwgMHg2RiwgMHhCQSwgMHhFOSwgMHg5NSwgMHg3MCwgMHg5NSwgMHg3MSwgLyogMHgwNC0weDA3ICovCisJMHg5NSwgMHg3MiwgMHg5NSwgMHg3MywgMHg5NSwgMHg3NCwgMHg5NSwgMHg3NSwgLyogMHgwOC0weDBCICovCisJMHhCQSwgMHhFQSwgMHhCQSwgMHhFQiwgMHg5NSwgMHg3NiwgMHg5NSwgMHg3NywgLyogMHgwQy0weDBGICovCisJMHhCQSwgMHhFQywgMHg5NSwgMHg3OCwgMHg5NSwgMHg3OSwgMHg5NSwgMHg3QSwgLyogMHgxMC0weDEzICovCisJMHhCQSwgMHhFRCwgMHg5NSwgMHg4MSwgMHg5NSwgMHg4MiwgMHg5NSwgMHg4MywgLyogMHgxNC0weDE3ICovCisJMHg5NSwgMHg4NCwgMHg5NSwgMHg4NSwgMHg5NSwgMHg4NiwgMHg5NSwgMHg4NywgLyogMHgxOC0weDFCICovCisJMHhCQSwgMHhFRSwgMHhCQSwgMHhFRiwgMHg5NSwgMHg4OCwgMHhCQSwgMHhGMCwgLyogMHgxQy0weDFGICovCisJMHg5NSwgMHg4OSwgMHg5NSwgMHg4QSwgMHg5NSwgMHg4QiwgMHg5NSwgMHg4QywgLyogMHgyMC0weDIzICovCisJMHg5NSwgMHg4RCwgMHg5NSwgMHg4RSwgMHg5NSwgMHg4RiwgMHg5NSwgMHg5MCwgLyogMHgyNC0weDI3ICovCisJMHg5NSwgMHg5MSwgMHg5NSwgMHg5MiwgMHg5NSwgMHg5MywgMHg5NSwgMHg5NCwgLyogMHgyOC0weDJCICovCisJMHg5NSwgMHg5NSwgMHg5NSwgMHg5NiwgMHg5NSwgMHg5NywgMHg5NSwgMHg5OCwgLyogMHgyQy0weDJGICovCisJMHg5NSwgMHg5OSwgMHg5NSwgMHg5QSwgMHg5NSwgMHg5QiwgMHg5NSwgMHg5QywgLyogMHgzMC0weDMzICovCisJMHg5NSwgMHg5RCwgMHg5NSwgMHg5RSwgMHg5NSwgMHg5RiwgMHg5NSwgMHhBMCwgLyogMHgzNC0weDM3ICovCisJMHg5NSwgMHhBMSwgMHg5NSwgMHhBMiwgMHg5NSwgMHhBMywgMHg5NSwgMHhBNCwgLyogMHgzOC0weDNCICovCisJMHg5NSwgMHhBNSwgMHg5NSwgMHhBNiwgMHg5NSwgMHhBNywgMHg5NSwgMHhBOCwgLyogMHgzQy0weDNGICovCisJMHg5NSwgMHhBOSwgMHg5NSwgMHhBQSwgMHg5NSwgMHhBQiwgMHg5NSwgMHhBQywgLyogMHg0MC0weDQzICovCisJMHhCQSwgMHhGMSwgMHhCQSwgMHhGMiwgMHg5NSwgMHhBRCwgMHg5NSwgMHhBRSwgLyogMHg0NC0weDQ3ICovCisJMHhCQSwgMHhGMywgMHg5NSwgMHhBRiwgMHg5NSwgMHhCMCwgMHg5NSwgMHhCMSwgLyogMHg0OC0weDRCICovCisJMHhCQSwgMHhGNCwgMHg5NSwgMHhCMiwgMHhCQSwgMHhGNSwgMHg5NSwgMHhCMywgLyogMHg0Qy0weDRGICovCisJMHg5NSwgMHhCNCwgMHg5NSwgMHhCNSwgMHg5NSwgMHhCNiwgMHg5NSwgMHhCNywgLyogMHg1MC0weDUzICovCisJMHhCQSwgMHhGNiwgMHhCQSwgMHhGNywgMHg5NSwgMHhCOCwgMHhCQSwgMHhGOCwgLyogMHg1NC0weDU3ICovCisJMHg5NSwgMHhCOSwgMHhCQSwgMHhGOSwgMHhCQSwgMHhGQSwgMHhCQSwgMHhGQiwgLyogMHg1OC0weDVCICovCisJMHg5NSwgMHhCQSwgMHg5NSwgMHhCQiwgMHg5NSwgMHhCQywgMHg5NSwgMHhCRCwgLyogMHg1Qy0weDVGICovCisJMHhCQSwgMHhGQywgMHhCQSwgMHhGRCwgMHg5NSwgMHhCRSwgMHg5NSwgMHhCRiwgLyogMHg2MC0weDYzICovCisJMHhCQSwgMHhGRSwgMHg5NSwgMHhDMCwgMHg5NSwgMHhDMSwgMHg5NSwgMHhDMiwgLyogMHg2NC0weDY3ICovCisJMHhCQiwgMHhBMSwgMHg5NSwgMHhDMywgMHhCQiwgMHhBMiwgMHg5NSwgMHhDNCwgLyogMHg2OC0weDZCICovCisJMHg5NSwgMHhDNSwgMHg5NSwgMHhDNiwgMHg5NSwgMHhDNywgMHg5NSwgMHhDOCwgLyogMHg2Qy0weDZGICovCisJMHhCQiwgMHhBMywgMHhCQiwgMHhBNCwgMHg5NSwgMHhDOSwgMHhCQiwgMHhBNSwgLyogMHg3MC0weDczICovCisJMHhCQiwgMHhBNiwgMHhCQiwgMHhBNywgMHg5NSwgMHhDQSwgMHg5NSwgMHhDQiwgLyogMHg3NC0weDc3ICovCisJMHg5NSwgMHhDQywgMHg5NSwgMHhDRCwgMHg5NSwgMHhDRSwgMHhCQiwgMHhBOCwgLyogMHg3OC0weDdCICovCisJMHhCQiwgMHhBOSwgMHhCQiwgMHhBQSwgMHg5NSwgMHhDRiwgMHg5NSwgMHhEMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhCQiwgMHhBQiwgMHg5NSwgMHhEMSwgMHg5NSwgMHhEMiwgMHg5NSwgMHhEMywgLyogMHg4MC0weDgzICovCisJMHhCQiwgMHhBQywgMHg5NSwgMHhENCwgMHg5NSwgMHhENSwgMHg5NSwgMHhENiwgLyogMHg4NC0weDg3ICovCisJMHg5NSwgMHhENywgMHg5NSwgMHhEOCwgMHg5NSwgMHhEOSwgMHg5NSwgMHhEQSwgLyogMHg4OC0weDhCICovCisJMHhCQiwgMHhBRCwgMHhCQiwgMHhBRSwgMHg5NSwgMHhEQiwgMHhCQiwgMHhBRiwgLyogMHg4Qy0weDhGICovCisJMHhCQiwgMHhCMCwgMHhCQiwgMHhCMSwgMHg5NSwgMHhEQywgMHg5NSwgMHhERCwgLyogMHg5MC0weDkzICovCisJMHg5NSwgMHhERSwgMHg5NSwgMHhERiwgMHg5NSwgMHhFMCwgMHg5NSwgMHhFMSwgLyogMHg5NC0weDk3ICovCisJMHhCQiwgMHhCMiwgMHhCQiwgMHhCMywgMHg5NSwgMHhFMiwgMHg5NSwgMHhFMywgLyogMHg5OC0weDlCICovCisJMHg5NSwgMHhFNCwgMHg5NSwgMHhFNSwgMHg5NSwgMHhFNiwgMHg5NSwgMHhFNywgLyogMHg5Qy0weDlGICovCisJMHg5NSwgMHhFOCwgMHg5NSwgMHhFOSwgMHg5NSwgMHhFQSwgMHg5NSwgMHhFQiwgLyogMHhBMC0weEEzICovCisJMHg5NSwgMHhFQywgMHg5NSwgMHhFRCwgMHg5NSwgMHhFRSwgMHg5NSwgMHhFRiwgLyogMHhBNC0weEE3ICovCisJMHhCQiwgMHhCNCwgMHg5NSwgMHhGMCwgMHg5NSwgMHhGMSwgMHg5NSwgMHhGMiwgLyogMHhBOC0weEFCICovCisJMHg5NSwgMHhGMywgMHg5NSwgMHhGNCwgMHg5NSwgMHhGNSwgMHg5NSwgMHhGNiwgLyogMHhBQy0weEFGICovCisJMHg5NSwgMHhGNywgMHg5NSwgMHhGOCwgMHg5NSwgMHhGOSwgMHg5NSwgMHhGQSwgLyogMHhCMC0weEIzICovCisJMHg5NSwgMHhGQiwgMHg5NSwgMHhGQywgMHg5NSwgMHhGRCwgMHg5NSwgMHhGRSwgLyogMHhCNC0weEI3ICovCisJMHg5NiwgMHg0MSwgMHg5NiwgMHg0MiwgMHg5NiwgMHg0MywgMHg5NiwgMHg0NCwgLyogMHhCOC0weEJCICovCisJMHg5NiwgMHg0NSwgMHg5NiwgMHg0NiwgMHg5NiwgMHg0NywgMHg5NiwgMHg0OCwgLyogMHhCQy0weEJGICovCisJMHg5NiwgMHg0OSwgMHg5NiwgMHg0QSwgMHg5NiwgMHg0QiwgMHg5NiwgMHg0QywgLyogMHhDMC0weEMzICovCisJMHg5NiwgMHg0RCwgMHg5NiwgMHg0RSwgMHg5NiwgMHg0RiwgMHg5NiwgMHg1MCwgLyogMHhDNC0weEM3ICovCisJMHg5NiwgMHg1MSwgMHg5NiwgMHg1MiwgMHg5NiwgMHg1MywgMHg5NiwgMHg1NCwgLyogMHhDOC0weENCICovCisJMHg5NiwgMHg1NSwgMHg5NiwgMHg1NiwgMHg5NiwgMHg1NywgMHg5NiwgMHg1OCwgLyogMHhDQy0weENGICovCisJMHhCQiwgMHhCNSwgMHhCQiwgMHhCNiwgMHg5NiwgMHg1OSwgMHg5NiwgMHg1QSwgLyogMHhEMC0weEQzICovCisJMHhCQiwgMHhCNywgMHg5NiwgMHg2MSwgMHg5NiwgMHg2MiwgMHhCQiwgMHhCOCwgLyogMHhENC0weEQ3ICovCisJMHhCQiwgMHhCOSwgMHg5NiwgMHg2MywgMHg5NiwgMHg2NCwgMHg5NiwgMHg2NSwgLyogMHhEOC0weERCICovCisJMHg5NiwgMHg2NiwgMHg5NiwgMHg2NywgMHg5NiwgMHg2OCwgMHg5NiwgMHg2OSwgLyogMHhEQy0weERGICovCisJMHhCQiwgMHhCQSwgMHg5NiwgMHg2QSwgMHg5NiwgMHg2QiwgMHhCQiwgMHhCQiwgLyogMHhFMC0weEUzICovCisJMHhCQiwgMHhCQywgMHhCQiwgMHhCRCwgMHg5NiwgMHg2QywgMHg5NiwgMHg2RCwgLyogMHhFNC0weEU3ICovCisJMHg5NiwgMHg2RSwgMHg5NiwgMHg2RiwgMHg5NiwgMHg3MCwgMHg5NiwgMHg3MSwgLyogMHhFOC0weEVCICovCisJMHhCQiwgMHhCRSwgMHg5NiwgMHg3MiwgMHg5NiwgMHg3MywgMHg5NiwgMHg3NCwgLyogMHhFQy0weEVGICovCisJMHg5NiwgMHg3NSwgMHg5NiwgMHg3NiwgMHg5NiwgMHg3NywgMHg5NiwgMHg3OCwgLyogMHhGMC0weEYzICovCisJMHg5NiwgMHg3OSwgMHg5NiwgMHg3QSwgMHg5NiwgMHg4MSwgMHg5NiwgMHg4MiwgLyogMHhGNC0weEY3ICovCisJMHg5NiwgMHg4MywgMHg5NiwgMHg4NCwgMHg5NiwgMHg4NSwgMHg5NiwgMHg4NiwgLyogMHhGOC0weEZCICovCisJMHg5NiwgMHg4NywgMHg5NiwgMHg4OCwgMHg5NiwgMHg4OSwgMHg5NiwgMHg4QSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQkZbNTEyXSA9IHsKKwkweDk2LCAweDhCLCAweEJCLCAweEJGLCAweDk2LCAweDhDLCAweDk2LCAweDhELCAvKiAweDAwLTB4MDMgKi8KKwkweDk2LCAweDhFLCAweDk2LCAweDhGLCAweDk2LCAweDkwLCAweDk2LCAweDkxLCAvKiAweDA0LTB4MDcgKi8KKwkweEJCLCAweEMwLCAweEJCLCAweEMxLCAweDk2LCAweDkyLCAweDk2LCAweDkzLCAvKiAweDA4LTB4MEIgKi8KKwkweDk2LCAweDk0LCAweDk2LCAweDk1LCAweDk2LCAweDk2LCAweDk2LCAweDk3LCAvKiAweDBDLTB4MEYgKi8KKwkweDk2LCAweDk4LCAweDk2LCAweDk5LCAweDk2LCAweDlBLCAweDk2LCAweDlCLCAvKiAweDEwLTB4MTMgKi8KKwkweDk2LCAweDlDLCAweDk2LCAweDlELCAweDk2LCAweDlFLCAweDk2LCAweDlGLCAvKiAweDE0LTB4MTcgKi8KKwkweEJCLCAweEMyLCAweEJCLCAweEMzLCAweDk2LCAweEEwLCAweEJCLCAweEM0LCAvKiAweDE4LTB4MUIgKi8KKwkweEJCLCAweEM1LCAweEJCLCAweEM2LCAweDk2LCAweEExLCAweDk2LCAweEEyLCAvKiAweDFDLTB4MUYgKi8KKwkweDk2LCAweEEzLCAweDk2LCAweEE0LCAweDk2LCAweEE1LCAweDk2LCAweEE2LCAvKiAweDIwLTB4MjMgKi8KKwkweDk2LCAweEE3LCAweDk2LCAweEE4LCAweDk2LCAweEE5LCAweDk2LCAweEFBLCAvKiAweDI0LTB4MjcgKi8KKwkweDk2LCAweEFCLCAweDk2LCAweEFDLCAweDk2LCAweEFELCAweDk2LCAweEFFLCAvKiAweDI4LTB4MkIgKi8KKwkweDk2LCAweEFGLCAweDk2LCAweEIwLCAweDk2LCAweEIxLCAweDk2LCAweEIyLCAvKiAweDJDLTB4MkYgKi8KKwkweDk2LCAweEIzLCAweDk2LCAweEI0LCAweDk2LCAweEI1LCAweDk2LCAweEI2LCAvKiAweDMwLTB4MzMgKi8KKwkweDk2LCAweEI3LCAweDk2LCAweEI4LCAweDk2LCAweEI5LCAweDk2LCAweEJBLCAvKiAweDM0LTB4MzcgKi8KKwkweDk2LCAweEJCLCAweDk2LCAweEJDLCAweDk2LCAweEJELCAweDk2LCAweEJFLCAvKiAweDM4LTB4M0IgKi8KKwkweDk2LCAweEJGLCAweDk2LCAweEMwLCAweDk2LCAweEMxLCAweDk2LCAweEMyLCAvKiAweDNDLTB4M0YgKi8KKwkweEJCLCAweEM3LCAweEJCLCAweEM4LCAweDk2LCAweEMzLCAweDk2LCAweEM0LCAvKiAweDQwLTB4NDMgKi8KKwkweEJCLCAweEM5LCAweDk2LCAweEM1LCAweDk2LCAweEM2LCAweDk2LCAweEM3LCAvKiAweDQ0LTB4NDcgKi8KKwkweEJCLCAweENBLCAweDk2LCAweEM4LCAweDk2LCAweEM5LCAweDk2LCAweENBLCAvKiAweDQ4LTB4NEIgKi8KKwkweDk2LCAweENCLCAweDk2LCAweENDLCAweDk2LCAweENELCAweDk2LCAweENFLCAvKiAweDRDLTB4NEYgKi8KKwkweEJCLCAweENCLCAweEJCLCAweENDLCAweDk2LCAweENGLCAweDk2LCAweEQwLCAvKiAweDUwLTB4NTMgKi8KKwkweDk2LCAweEQxLCAweEJCLCAweENELCAweDk2LCAweEQyLCAweDk2LCAweEQzLCAvKiAweDU0LTB4NTcgKi8KKwkweDk2LCAweEQ0LCAweDk2LCAweEQ1LCAweDk2LCAweEQ2LCAweDk2LCAweEQ3LCAvKiAweDU4LTB4NUIgKi8KKwkweDk2LCAweEQ4LCAweDk2LCAweEQ5LCAweDk2LCAweERBLCAweDk2LCAweERCLCAvKiAweDVDLTB4NUYgKi8KKwkweDk2LCAweERDLCAweDk2LCAweERELCAweDk2LCAweERFLCAweDk2LCAweERGLCAvKiAweDYwLTB4NjMgKi8KKwkweDk2LCAweEUwLCAweDk2LCAweEUxLCAweDk2LCAweEUyLCAweDk2LCAweEUzLCAvKiAweDY0LTB4NjcgKi8KKwkweDk2LCAweEU0LCAweDk2LCAweEU1LCAweDk2LCAweEU2LCAweDk2LCAweEU3LCAvKiAweDY4LTB4NkIgKi8KKwkweDk2LCAweEU4LCAweDk2LCAweEU5LCAweDk2LCAweEVBLCAweDk2LCAweEVCLCAvKiAweDZDLTB4NkYgKi8KKwkweDk2LCAweEVDLCAweDk2LCAweEVELCAweDk2LCAweEVFLCAweDk2LCAweEVGLCAvKiAweDcwLTB4NzMgKi8KKwkweDk2LCAweEYwLCAweDk2LCAweEYxLCAweDk2LCAweEYyLCAweDk2LCAweEYzLCAvKiAweDc0LTB4NzcgKi8KKwkweDk2LCAweEY0LCAweDk2LCAweEY1LCAweDk2LCAweEY2LCAweDk2LCAweEY3LCAvKiAweDc4LTB4N0IgKi8KKwkweDk2LCAweEY4LCAweDk2LCAweEY5LCAweDk2LCAweEZBLCAweDk2LCAweEZCLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDk2LCAweEZDLCAweDk2LCAweEZELCAweDk2LCAweEZFLCAweDk3LCAweDQxLCAvKiAweDgwLTB4ODMgKi8KKwkweDk3LCAweDQyLCAweDk3LCAweDQzLCAweDk3LCAweDQ0LCAweDk3LCAweDQ1LCAvKiAweDg0LTB4ODcgKi8KKwkweDk3LCAweDQ2LCAweDk3LCAweDQ3LCAweDk3LCAweDQ4LCAweDk3LCAweDQ5LCAvKiAweDg4LTB4OEIgKi8KKwkweDk3LCAweDRBLCAweDk3LCAweDRCLCAweDk3LCAweDRDLCAweDk3LCAweDRELCAvKiAweDhDLTB4OEYgKi8KKwkweDk3LCAweDRFLCAweDk3LCAweDRGLCAweDk3LCAweDUwLCAweDk3LCAweDUxLCAvKiAweDkwLTB4OTMgKi8KKwkweEJCLCAweENFLCAweDk3LCAweDUyLCAweDk3LCAweDUzLCAweDk3LCAweDU0LCAvKiAweDk0LTB4OTcgKi8KKwkweDk3LCAweDU1LCAweDk3LCAweDU2LCAweDk3LCAweDU3LCAweDk3LCAweDU4LCAvKiAweDk4LTB4OUIgKi8KKwkweDk3LCAweDU5LCAweDk3LCAweDVBLCAweDk3LCAweDYxLCAweDk3LCAweDYyLCAvKiAweDlDLTB4OUYgKi8KKwkweDk3LCAweDYzLCAweDk3LCAweDY0LCAweDk3LCAweDY1LCAweDk3LCAweDY2LCAvKiAweEEwLTB4QTMgKi8KKwkweDk3LCAweDY3LCAweDk3LCAweDY4LCAweDk3LCAweDY5LCAweDk3LCAweDZBLCAvKiAweEE0LTB4QTcgKi8KKwkweDk3LCAweDZCLCAweDk3LCAweDZDLCAweDk3LCAweDZELCAweDk3LCAweDZFLCAvKiAweEE4LTB4QUIgKi8KKwkweDk3LCAweDZGLCAweDk3LCAweDcwLCAweDk3LCAweDcxLCAweDk3LCAweDcyLCAvKiAweEFDLTB4QUYgKi8KKwkweEJCLCAweENGLCAweDk3LCAweDczLCAweDk3LCAweDc0LCAweDk3LCAweDc1LCAvKiAweEIwLTB4QjMgKi8KKwkweDk3LCAweDc2LCAweDk3LCAweDc3LCAweDk3LCAweDc4LCAweDk3LCAweDc5LCAvKiAweEI0LTB4QjcgKi8KKwkweDk3LCAweDdBLCAweDk3LCAweDgxLCAweDk3LCAweDgyLCAweDk3LCAweDgzLCAvKiAweEI4LTB4QkIgKi8KKwkweDk3LCAweDg0LCAweDk3LCAweDg1LCAweDk3LCAweDg2LCAweDk3LCAweDg3LCAvKiAweEJDLTB4QkYgKi8KKwkweDk3LCAweDg4LCAweDk3LCAweDg5LCAweDk3LCAweDhBLCAweDk3LCAweDhCLCAvKiAweEMwLTB4QzMgKi8KKwkweDk3LCAweDhDLCAweEJCLCAweEQwLCAweDk3LCAweDhELCAweDk3LCAweDhFLCAvKiAweEM0LTB4QzcgKi8KKwkweDk3LCAweDhGLCAweDk3LCAweDkwLCAweDk3LCAweDkxLCAweDk3LCAweDkyLCAvKiAweEM4LTB4Q0IgKi8KKwkweEJCLCAweEQxLCAweEJCLCAweEQyLCAweDk3LCAweDkzLCAweDk3LCAweDk0LCAvKiAweENDLTB4Q0YgKi8KKwkweEJCLCAweEQzLCAweDk3LCAweDk1LCAweDk3LCAweDk2LCAweDk3LCAweDk3LCAvKiAweEQwLTB4RDMgKi8KKwkweEJCLCAweEQ0LCAweDk3LCAweDk4LCAweDk3LCAweDk5LCAweDk3LCAweDlBLCAvKiAweEQ0LTB4RDcgKi8KKwkweDk3LCAweDlCLCAweDk3LCAweDlDLCAweDk3LCAweDlELCAweDk3LCAweDlFLCAvKiAweEQ4LTB4REIgKi8KKwkweEJCLCAweEQ1LCAweDk3LCAweDlGLCAweDk3LCAweEEwLCAweEJCLCAweEQ2LCAvKiAweERDLTB4REYgKi8KKwkweDk3LCAweEExLCAweEJCLCAweEQ3LCAweDk3LCAweEEyLCAweDk3LCAweEEzLCAvKiAweEUwLTB4RTMgKi8KKwkweDk3LCAweEE0LCAweDk3LCAweEE1LCAweDk3LCAweEE2LCAweDk3LCAweEE3LCAvKiAweEU0LTB4RTcgKi8KKwkweDk3LCAweEE4LCAweDk3LCAweEE5LCAweDk3LCAweEFBLCAweDk3LCAweEFCLCAvKiAweEU4LTB4RUIgKi8KKwkweDk3LCAweEFDLCAweDk3LCAweEFELCAweDk3LCAweEFFLCAweDk3LCAweEFGLCAvKiAweEVDLTB4RUYgKi8KKwkweDk3LCAweEIwLCAweDk3LCAweEIxLCAweDk3LCAweEIyLCAweDk3LCAweEIzLCAvKiAweEYwLTB4RjMgKi8KKwkweDk3LCAweEI0LCAweDk3LCAweEI1LCAweDk3LCAweEI2LCAweDk3LCAweEI3LCAvKiAweEY0LTB4RjcgKi8KKwkweDk3LCAweEI4LCAweDk3LCAweEI5LCAweDk3LCAweEJBLCAweDk3LCAweEJCLCAvKiAweEY4LTB4RkIgKi8KKwkweDk3LCAweEJDLCAweDk3LCAweEJELCAweDk3LCAweEJFLCAweDk3LCAweEJGLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19DMFs1MTJdID0geworCTB4OTcsIDB4QzAsIDB4OTcsIDB4QzEsIDB4OTcsIDB4QzIsIDB4OTcsIDB4QzMsIC8qIDB4MDAtMHgwMyAqLworCTB4OTcsIDB4QzQsIDB4OTcsIDB4QzUsIDB4OTcsIDB4QzYsIDB4OTcsIDB4QzcsIC8qIDB4MDQtMHgwNyAqLworCTB4OTcsIDB4QzgsIDB4OTcsIDB4QzksIDB4OTcsIDB4Q0EsIDB4OTcsIDB4Q0IsIC8qIDB4MDgtMHgwQiAqLworCTB4OTcsIDB4Q0MsIDB4OTcsIDB4Q0QsIDB4OTcsIDB4Q0UsIDB4OTcsIDB4Q0YsIC8qIDB4MEMtMHgwRiAqLworCTB4OTcsIDB4RDAsIDB4OTcsIDB4RDEsIDB4OTcsIDB4RDIsIDB4OTcsIDB4RDMsIC8qIDB4MTAtMHgxMyAqLworCTB4OTcsIDB4RDQsIDB4OTcsIDB4RDUsIDB4OTcsIDB4RDYsIDB4OTcsIDB4RDcsIC8qIDB4MTQtMHgxNyAqLworCTB4OTcsIDB4RDgsIDB4OTcsIDB4RDksIDB4OTcsIDB4REEsIDB4OTcsIDB4REIsIC8qIDB4MTgtMHgxQiAqLworCTB4OTcsIDB4REMsIDB4OTcsIDB4REQsIDB4OTcsIDB4REUsIDB4OTcsIDB4REYsIC8qIDB4MUMtMHgxRiAqLworCTB4OTcsIDB4RTAsIDB4OTcsIDB4RTEsIDB4OTcsIDB4RTIsIDB4OTcsIDB4RTMsIC8qIDB4MjAtMHgyMyAqLworCTB4OTcsIDB4RTQsIDB4OTcsIDB4RTUsIDB4OTcsIDB4RTYsIDB4OTcsIDB4RTcsIC8qIDB4MjQtMHgyNyAqLworCTB4OTcsIDB4RTgsIDB4OTcsIDB4RTksIDB4OTcsIDB4RUEsIDB4OTcsIDB4RUIsIC8qIDB4MjgtMHgyQiAqLworCTB4OTcsIDB4RUMsIDB4OTcsIDB4RUQsIDB4OTcsIDB4RUUsIDB4OTcsIDB4RUYsIC8qIDB4MkMtMHgyRiAqLworCTB4OTcsIDB4RjAsIDB4OTcsIDB4RjEsIDB4OTcsIDB4RjIsIDB4OTcsIDB4RjMsIC8qIDB4MzAtMHgzMyAqLworCTB4OTcsIDB4RjQsIDB4OTcsIDB4RjUsIDB4OTcsIDB4RjYsIDB4OTcsIDB4RjcsIC8qIDB4MzQtMHgzNyAqLworCTB4OTcsIDB4RjgsIDB4OTcsIDB4RjksIDB4OTcsIDB4RkEsIDB4OTcsIDB4RkIsIC8qIDB4MzgtMHgzQiAqLworCTB4QkIsIDB4RDgsIDB4OTcsIDB4RkMsIDB4OTcsIDB4RkQsIDB4OTcsIDB4RkUsIC8qIDB4M0MtMHgzRiAqLworCTB4OTgsIDB4NDEsIDB4OTgsIDB4NDIsIDB4OTgsIDB4NDMsIDB4OTgsIDB4NDQsIC8qIDB4NDAtMHg0MyAqLworCTB4OTgsIDB4NDUsIDB4OTgsIDB4NDYsIDB4OTgsIDB4NDcsIDB4OTgsIDB4NDgsIC8qIDB4NDQtMHg0NyAqLworCTB4OTgsIDB4NDksIDB4OTgsIDB4NEEsIDB4OTgsIDB4NEIsIDB4OTgsIDB4NEMsIC8qIDB4NDgtMHg0QiAqLworCTB4OTgsIDB4NEQsIDB4OTgsIDB4NEUsIDB4OTgsIDB4NEYsIDB4OTgsIDB4NTAsIC8qIDB4NEMtMHg0RiAqLworCTB4OTgsIDB4NTEsIDB4QkIsIDB4RDksIDB4OTgsIDB4NTIsIDB4OTgsIDB4NTMsIC8qIDB4NTAtMHg1MyAqLworCTB4OTgsIDB4NTQsIDB4OTgsIDB4NTUsIDB4OTgsIDB4NTYsIDB4OTgsIDB4NTcsIC8qIDB4NTQtMHg1NyAqLworCTB4QkIsIDB4REEsIDB4OTgsIDB4NTgsIDB4OTgsIDB4NTksIDB4OTgsIDB4NUEsIC8qIDB4NTgtMHg1QiAqLworCTB4QkIsIDB4REIsIDB4OTgsIDB4NjEsIDB4OTgsIDB4NjIsIDB4OTgsIDB4NjMsIC8qIDB4NUMtMHg1RiAqLworCTB4QkIsIDB4REMsIDB4OTgsIDB4NjQsIDB4OTgsIDB4NjUsIDB4OTgsIDB4NjYsIC8qIDB4NjAtMHg2MyAqLworCTB4OTgsIDB4NjcsIDB4OTgsIDB4NjgsIDB4OTgsIDB4NjksIDB4OTgsIDB4NkEsIC8qIDB4NjQtMHg2NyAqLworCTB4QkIsIDB4REQsIDB4QkIsIDB4REUsIDB4OTgsIDB4NkIsIDB4OTgsIDB4NkMsIC8qIDB4NjgtMHg2QiAqLworCTB4OTgsIDB4NkQsIDB4OTgsIDB4NkUsIDB4OTgsIDB4NkYsIDB4OTgsIDB4NzAsIC8qIDB4NkMtMHg2RiAqLworCTB4OTgsIDB4NzEsIDB4OTgsIDB4NzIsIDB4OTgsIDB4NzMsIDB4OTgsIDB4NzQsIC8qIDB4NzAtMHg3MyAqLworCTB4OTgsIDB4NzUsIDB4OTgsIDB4NzYsIDB4OTgsIDB4NzcsIDB4OTgsIDB4NzgsIC8qIDB4NzQtMHg3NyAqLworCTB4OTgsIDB4NzksIDB4OTgsIDB4N0EsIDB4OTgsIDB4ODEsIDB4OTgsIDB4ODIsIC8qIDB4NzgtMHg3QiAqLworCTB4OTgsIDB4ODMsIDB4OTgsIDB4ODQsIDB4OTgsIDB4ODUsIDB4OTgsIDB4ODYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OTgsIDB4ODcsIDB4OTgsIDB4ODgsIDB4OTgsIDB4ODksIDB4OTgsIDB4OEEsIC8qIDB4ODAtMHg4MyAqLworCTB4OTgsIDB4OEIsIDB4OTgsIDB4OEMsIDB4OTgsIDB4OEQsIDB4OTgsIDB4OEUsIC8qIDB4ODQtMHg4NyAqLworCTB4OTgsIDB4OEYsIDB4OTgsIDB4OTAsIDB4OTgsIDB4OTEsIDB4OTgsIDB4OTIsIC8qIDB4ODgtMHg4QiAqLworCTB4OTgsIDB4OTMsIDB4OTgsIDB4OTQsIDB4OTgsIDB4OTUsIDB4OTgsIDB4OTYsIC8qIDB4OEMtMHg4RiAqLworCTB4QkIsIDB4REYsIDB4QkIsIDB4RTAsIDB4OTgsIDB4OTcsIDB4OTgsIDB4OTgsIC8qIDB4OTAtMHg5MyAqLworCTB4QkIsIDB4RTEsIDB4OTgsIDB4OTksIDB4OTgsIDB4OUEsIDB4OTgsIDB4OUIsIC8qIDB4OTQtMHg5NyAqLworCTB4QkIsIDB4RTIsIDB4OTgsIDB4OUMsIDB4OTgsIDB4OUQsIDB4OTgsIDB4OUUsIC8qIDB4OTgtMHg5QiAqLworCTB4OTgsIDB4OUYsIDB4OTgsIDB4QTAsIDB4OTgsIDB4QTEsIDB4OTgsIDB4QTIsIC8qIDB4OUMtMHg5RiAqLworCTB4QkIsIDB4RTMsIDB4QkIsIDB4RTQsIDB4OTgsIDB4QTMsIDB4QkIsIDB4RTUsIC8qIDB4QTAtMHhBMyAqLworCTB4OTgsIDB4QTQsIDB4QkIsIDB4RTYsIDB4OTgsIDB4QTUsIDB4OTgsIDB4QTYsIC8qIDB4QTQtMHhBNyAqLworCTB4OTgsIDB4QTcsIDB4OTgsIDB4QTgsIDB4OTgsIDB4QTksIDB4OTgsIDB4QUEsIC8qIDB4QTgtMHhBQiAqLworCTB4QkIsIDB4RTcsIDB4QkIsIDB4RTgsIDB4OTgsIDB4QUIsIDB4QkIsIDB4RTksIC8qIDB4QUMtMHhBRiAqLworCTB4QkIsIDB4RUEsIDB4OTgsIDB4QUMsIDB4OTgsIDB4QUQsIDB4QkIsIDB4RUIsIC8qIDB4QjAtMHhCMyAqLworCTB4QkIsIDB4RUMsIDB4QkIsIDB4RUQsIDB4QkIsIDB4RUUsIDB4OTgsIDB4QUUsIC8qIDB4QjQtMHhCNyAqLworCTB4OTgsIDB4QUYsIDB4OTgsIDB4QjAsIDB4OTgsIDB4QjEsIDB4OTgsIDB4QjIsIC8qIDB4QjgtMHhCQiAqLworCTB4QkIsIDB4RUYsIDB4QkIsIDB4RjAsIDB4OTgsIDB4QjMsIDB4QkIsIDB4RjEsIC8qIDB4QkMtMHhCRiAqLworCTB4QkIsIDB4RjIsIDB4QkIsIDB4RjMsIDB4OTgsIDB4QjQsIDB4OTgsIDB4QjUsIC8qIDB4QzAtMHhDMyAqLworCTB4OTgsIDB4QjYsIDB4QkIsIDB4RjQsIDB4OTgsIDB4QjcsIDB4OTgsIDB4QjgsIC8qIDB4QzQtMHhDNyAqLworCTB4QkIsIDB4RjUsIDB4QkIsIDB4RjYsIDB4OTgsIDB4QjksIDB4OTgsIDB4QkEsIC8qIDB4QzgtMHhDQiAqLworCTB4QkIsIDB4RjcsIDB4OTgsIDB4QkIsIDB4OTgsIDB4QkMsIDB4OTgsIDB4QkQsIC8qIDB4Q0MtMHhDRiAqLworCTB4QkIsIDB4RjgsIDB4OTgsIDB4QkUsIDB4OTgsIDB4QkYsIDB4OTgsIDB4QzAsIC8qIDB4RDAtMHhEMyAqLworCTB4OTgsIDB4QzEsIDB4OTgsIDB4QzIsIDB4OTgsIDB4QzMsIDB4OTgsIDB4QzQsIC8qIDB4RDQtMHhENyAqLworCTB4QkIsIDB4RjksIDB4QkIsIDB4RkEsIDB4OTgsIDB4QzUsIDB4QkIsIDB4RkIsIC8qIDB4RDgtMHhEQiAqLworCTB4QkIsIDB4RkMsIDB4QkIsIDB4RkQsIDB4OTgsIDB4QzYsIDB4OTgsIDB4QzcsIC8qIDB4REMtMHhERiAqLworCTB4OTgsIDB4QzgsIDB4OTgsIDB4QzksIDB4OTgsIDB4Q0EsIDB4OTgsIDB4Q0IsIC8qIDB4RTAtMHhFMyAqLworCTB4QkIsIDB4RkUsIDB4QkMsIDB4QTEsIDB4OTgsIDB4Q0MsIDB4OTgsIDB4Q0QsIC8qIDB4RTQtMHhFNyAqLworCTB4QkMsIDB4QTIsIDB4OTgsIDB4Q0UsIDB4OTgsIDB4Q0YsIDB4OTgsIDB4RDAsIC8qIDB4RTgtMHhFQiAqLworCTB4QkMsIDB4QTMsIDB4OTgsIDB4RDEsIDB4OTgsIDB4RDIsIDB4OTgsIDB4RDMsIC8qIDB4RUMtMHhFRiAqLworCTB4OTgsIDB4RDQsIDB4OTgsIDB4RDUsIDB4OTgsIDB4RDYsIDB4OTgsIDB4RDcsIC8qIDB4RjAtMHhGMyAqLworCTB4QkMsIDB4QTQsIDB4QkMsIDB4QTUsIDB4OTgsIDB4RDgsIDB4QkMsIDB4QTYsIC8qIDB4RjQtMHhGNyAqLworCTB4OTgsIDB4RDksIDB4QkMsIDB4QTcsIDB4OTgsIDB4REEsIDB4OTgsIDB4REIsIC8qIDB4RjgtMHhGQiAqLworCTB4OTgsIDB4REMsIDB4OTgsIDB4REQsIDB4OTgsIDB4REUsIDB4OTgsIDB4REYsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0MxWzUxMl0gPSB7CisJMHhCQywgMHhBOCwgMHg5OCwgMHhFMCwgMHg5OCwgMHhFMSwgMHg5OCwgMHhFMiwgLyogMHgwMC0weDAzICovCisJMHhCQywgMHhBOSwgMHg5OCwgMHhFMywgMHg5OCwgMHhFNCwgMHg5OCwgMHhFNSwgLyogMHgwNC0weDA3ICovCisJMHhCQywgMHhBQSwgMHg5OCwgMHhFNiwgMHg5OCwgMHhFNywgMHg5OCwgMHhFOCwgLyogMHgwOC0weDBCICovCisJMHg5OCwgMHhFOSwgMHg5OCwgMHhFQSwgMHg5OCwgMHhFQiwgMHg5OCwgMHhFQywgLyogMHgwQy0weDBGICovCisJMHhCQywgMHhBQiwgMHg5OCwgMHhFRCwgMHg5OCwgMHhFRSwgMHg5OCwgMHhFRiwgLyogMHgxMC0weDEzICovCisJMHg5OCwgMHhGMCwgMHhCQywgMHhBQywgMHg5OCwgMHhGMSwgMHg5OCwgMHhGMiwgLyogMHgxNC0weDE3ICovCisJMHg5OCwgMHhGMywgMHg5OCwgMHhGNCwgMHg5OCwgMHhGNSwgMHg5OCwgMHhGNiwgLyogMHgxOC0weDFCICovCisJMHhCQywgMHhBRCwgMHhCQywgMHhBRSwgMHhCQywgMHhBRiwgMHhCQywgMHhCMCwgLyogMHgxQy0weDFGICovCisJMHhCQywgMHhCMSwgMHg5OCwgMHhGNywgMHg5OCwgMHhGOCwgMHhCQywgMHhCMiwgLyogMHgyMC0weDIzICovCisJMHhCQywgMHhCMywgMHg5OCwgMHhGOSwgMHhCQywgMHhCNCwgMHhCQywgMHhCNSwgLyogMHgyNC0weDI3ICovCisJMHg5OCwgMHhGQSwgMHg5OCwgMHhGQiwgMHg5OCwgMHhGQywgMHg5OCwgMHhGRCwgLyogMHgyOC0weDJCICovCisJMHhCQywgMHhCNiwgMHhCQywgMHhCNywgMHg5OCwgMHhGRSwgMHhCQywgMHhCOCwgLyogMHgyQy0weDJGICovCisJMHhCQywgMHhCOSwgMHhCQywgMHhCQSwgMHg5OSwgMHg0MSwgMHg5OSwgMHg0MiwgLyogMHgzMC0weDMzICovCisJMHg5OSwgMHg0MywgMHg5OSwgMHg0NCwgMHhCQywgMHhCQiwgMHg5OSwgMHg0NSwgLyogMHgzNC0weDM3ICovCisJMHhCQywgMHhCQywgMHhCQywgMHhCRCwgMHg5OSwgMHg0NiwgMHg5OSwgMHg0NywgLyogMHgzOC0weDNCICovCisJMHhCQywgMHhCRSwgMHg5OSwgMHg0OCwgMHg5OSwgMHg0OSwgMHg5OSwgMHg0QSwgLyogMHgzQy0weDNGICovCisJMHhCQywgMHhCRiwgMHg5OSwgMHg0QiwgMHg5OSwgMHg0QywgMHg5OSwgMHg0RCwgLyogMHg0MC0weDQzICovCisJMHg5OSwgMHg0RSwgMHg5OSwgMHg0RiwgMHg5OSwgMHg1MCwgMHg5OSwgMHg1MSwgLyogMHg0NC0weDQ3ICovCisJMHhCQywgMHhDMCwgMHhCQywgMHhDMSwgMHg5OSwgMHg1MiwgMHhCQywgMHhDMiwgLyogMHg0OC0weDRCICovCisJMHhCQywgMHhDMywgMHhCQywgMHhDNCwgMHg5OSwgMHg1MywgMHg5OSwgMHg1NCwgLyogMHg0Qy0weDRGICovCisJMHg5OSwgMHg1NSwgMHg5OSwgMHg1NiwgMHg5OSwgMHg1NywgMHg5OSwgMHg1OCwgLyogMHg1MC0weDUzICovCisJMHhCQywgMHhDNSwgMHhCQywgMHhDNiwgMHg5OSwgMHg1OSwgMHg5OSwgMHg1QSwgLyogMHg1NC0weDU3ICovCisJMHhCQywgMHhDNywgMHg5OSwgMHg2MSwgMHg5OSwgMHg2MiwgMHg5OSwgMHg2MywgLyogMHg1OC0weDVCICovCisJMHhCQywgMHhDOCwgMHg5OSwgMHg2NCwgMHg5OSwgMHg2NSwgMHg5OSwgMHg2NiwgLyogMHg1Qy0weDVGICovCisJMHg5OSwgMHg2NywgMHg5OSwgMHg2OCwgMHg5OSwgMHg2OSwgMHg5OSwgMHg2QSwgLyogMHg2MC0weDYzICovCisJMHhCQywgMHhDOSwgMHhCQywgMHhDQSwgMHg5OSwgMHg2QiwgMHhCQywgMHhDQiwgLyogMHg2NC0weDY3ICovCisJMHhCQywgMHhDQywgMHhCQywgMHhDRCwgMHg5OSwgMHg2QywgMHg5OSwgMHg2RCwgLyogMHg2OC0weDZCICovCisJMHg5OSwgMHg2RSwgMHg5OSwgMHg2RiwgMHg5OSwgMHg3MCwgMHg5OSwgMHg3MSwgLyogMHg2Qy0weDZGICovCisJMHhCQywgMHhDRSwgMHg5OSwgMHg3MiwgMHg5OSwgMHg3MywgMHg5OSwgMHg3NCwgLyogMHg3MC0weDczICovCisJMHhCQywgMHhDRiwgMHg5OSwgMHg3NSwgMHg5OSwgMHg3NiwgMHg5OSwgMHg3NywgLyogMHg3NC0weDc3ICovCisJMHhCQywgMHhEMCwgMHg5OSwgMHg3OCwgMHg5OSwgMHg3OSwgMHg5OSwgMHg3QSwgLyogMHg3OC0weDdCICovCisJMHg5OSwgMHg4MSwgMHg5OSwgMHg4MiwgMHg5OSwgMHg4MywgMHg5OSwgMHg4NCwgLyogMHg3Qy0weDdGICovCisJCisJMHg5OSwgMHg4NSwgMHg5OSwgMHg4NiwgMHg5OSwgMHg4NywgMHg5OSwgMHg4OCwgLyogMHg4MC0weDgzICovCisJMHg5OSwgMHg4OSwgMHhCQywgMHhEMSwgMHg5OSwgMHg4QSwgMHg5OSwgMHg4QiwgLyogMHg4NC0weDg3ICovCisJMHg5OSwgMHg4QywgMHg5OSwgMHg4RCwgMHg5OSwgMHg4RSwgMHg5OSwgMHg4RiwgLyogMHg4OC0weDhCICovCisJMHhCQywgMHhEMiwgMHhCQywgMHhEMywgMHhCQywgMHhENCwgMHg5OSwgMHg5MCwgLyogMHg4Qy0weDhGICovCisJMHhCQywgMHhENSwgMHg5OSwgMHg5MSwgMHg5OSwgMHg5MiwgMHg5OSwgMHg5MywgLyogMHg5MC0weDkzICovCisJMHhCQywgMHhENiwgMHg5OSwgMHg5NCwgMHhCQywgMHhENywgMHg5OSwgMHg5NSwgLyogMHg5NC0weDk3ICovCisJMHg5OSwgMHg5NiwgMHg5OSwgMHg5NywgMHg5OSwgMHg5OCwgMHg5OSwgMHg5OSwgLyogMHg5OC0weDlCICovCisJMHhCQywgMHhEOCwgMHhCQywgMHhEOSwgMHg5OSwgMHg5QSwgMHhCQywgMHhEQSwgLyogMHg5Qy0weDlGICovCisJMHg5OSwgMHg5QiwgMHhCQywgMHhEQiwgMHg5OSwgMHg5QywgMHg5OSwgMHg5RCwgLyogMHhBMC0weEEzICovCisJMHg5OSwgMHg5RSwgMHhCQywgMHhEQywgMHg5OSwgMHg5RiwgMHg5OSwgMHhBMCwgLyogMHhBNC0weEE3ICovCisJMHhCQywgMHhERCwgMHhCQywgMHhERSwgMHg5OSwgMHhBMSwgMHg5OSwgMHhBMiwgLyogMHhBOC0weEFCICovCisJMHhCQywgMHhERiwgMHg5OSwgMHhBMywgMHg5OSwgMHhBNCwgMHg5OSwgMHhBNSwgLyogMHhBQy0weEFGICovCisJMHhCQywgMHhFMCwgMHg5OSwgMHhBNiwgMHg5OSwgMHhBNywgMHg5OSwgMHhBOCwgLyogMHhCMC0weEIzICovCisJMHg5OSwgMHhBOSwgMHg5OSwgMHhBQSwgMHg5OSwgMHhBQiwgMHg5OSwgMHhBQywgLyogMHhCNC0weEI3ICovCisJMHg5OSwgMHhBRCwgMHg5OSwgMHhBRSwgMHg5OSwgMHhBRiwgMHg5OSwgMHhCMCwgLyogMHhCOC0weEJCICovCisJMHg5OSwgMHhCMSwgMHhCQywgMHhFMSwgMHg5OSwgMHhCMiwgMHg5OSwgMHhCMywgLyogMHhCQy0weEJGICovCisJMHg5OSwgMHhCNCwgMHg5OSwgMHhCNSwgMHg5OSwgMHhCNiwgMHg5OSwgMHhCNywgLyogMHhDMC0weEMzICovCisJMHhCQywgMHhFMiwgMHg5OSwgMHhCOCwgMHg5OSwgMHhCOSwgMHg5OSwgMHhCQSwgLyogMHhDNC0weEM3ICovCisJMHhCQywgMHhFMywgMHg5OSwgMHhCQiwgMHg5OSwgMHhCQywgMHg5OSwgMHhCRCwgLyogMHhDOC0weENCICovCisJMHhCQywgMHhFNCwgMHg5OSwgMHhCRSwgMHg5OSwgMHhCRiwgMHg5OSwgMHhDMCwgLyogMHhDQy0weENGICovCisJMHg5OSwgMHhDMSwgMHg5OSwgMHhDMiwgMHg5OSwgMHhDMywgMHg5OSwgMHhDNCwgLyogMHhEMC0weEQzICovCisJMHhCQywgMHhFNSwgMHg5OSwgMHhDNSwgMHg5OSwgMHhDNiwgMHhCQywgMHhFNiwgLyogMHhENC0weEQ3ICovCisJMHhCQywgMHhFNywgMHg5OSwgMHhDNywgMHg5OSwgMHhDOCwgMHg5OSwgMHhDOSwgLyogMHhEOC0weERCICovCisJMHg5OSwgMHhDQSwgMHg5OSwgMHhDQiwgMHg5OSwgMHhDQywgMHg5OSwgMHhDRCwgLyogMHhEQy0weERGICovCisJMHhCQywgMHhFOCwgMHg5OSwgMHhDRSwgMHg5OSwgMHhDRiwgMHg5OSwgMHhEMCwgLyogMHhFMC0weEUzICovCisJMHhCQywgMHhFOSwgMHg5OSwgMHhEMSwgMHg5OSwgMHhEMiwgMHg5OSwgMHhEMywgLyogMHhFNC0weEU3ICovCisJMHhCQywgMHhFQSwgMHg5OSwgMHhENCwgMHg5OSwgMHhENSwgMHg5OSwgMHhENiwgLyogMHhFOC0weEVCICovCisJMHg5OSwgMHhENywgMHg5OSwgMHhEOCwgMHg5OSwgMHhEOSwgMHg5OSwgMHhEQSwgLyogMHhFQy0weEVGICovCisJMHhCQywgMHhFQiwgMHhCQywgMHhFQywgMHg5OSwgMHhEQiwgMHhCQywgMHhFRCwgLyogMHhGMC0weEYzICovCisJMHg5OSwgMHhEQywgMHg5OSwgMHhERCwgMHg5OSwgMHhERSwgMHg5OSwgMHhERiwgLyogMHhGNC0weEY3ICovCisJMHg5OSwgMHhFMCwgMHg5OSwgMHhFMSwgMHg5OSwgMHhFMiwgMHg5OSwgMHhFMywgLyogMHhGOC0weEZCICovCisJMHhCQywgMHhFRSwgMHhCQywgMHhFRiwgMHg5OSwgMHhFNCwgMHg5OSwgMHhFNSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQzJbNTEyXSA9IHsKKwkweEJDLCAweEYwLCAweDk5LCAweEU2LCAweDk5LCAweEU3LCAweDk5LCAweEU4LCAvKiAweDAwLTB4MDMgKi8KKwkweEJDLCAweEYxLCAweDk5LCAweEU5LCAweDk5LCAweEVBLCAweDk5LCAweEVCLCAvKiAweDA0LTB4MDcgKi8KKwkweDk5LCAweEVDLCAweDk5LCAweEVELCAweDk5LCAweEVFLCAweDk5LCAweEVGLCAvKiAweDA4LTB4MEIgKi8KKwkweEJDLCAweEYyLCAweEJDLCAweEYzLCAweDk5LCAweEYwLCAweEJDLCAweEY0LCAvKiAweDBDLTB4MEYgKi8KKwkweDk5LCAweEYxLCAweEJDLCAweEY1LCAweDk5LCAweEYyLCAweDk5LCAweEYzLCAvKiAweDEwLTB4MTMgKi8KKwkweDk5LCAweEY0LCAweDk5LCAweEY1LCAweDk5LCAweEY2LCAweDk5LCAweEY3LCAvKiAweDE0LTB4MTcgKi8KKwkweEJDLCAweEY2LCAweEJDLCAweEY3LCAweDk5LCAweEY4LCAweDk5LCAweEY5LCAvKiAweDE4LTB4MUIgKi8KKwkweEJDLCAweEY4LCAweDk5LCAweEZBLCAweDk5LCAweEZCLCAweEJDLCAweEY5LCAvKiAweDFDLTB4MUYgKi8KKwkweEJDLCAweEZBLCAweDk5LCAweEZDLCAweDk5LCAweEZELCAweDk5LCAweEZFLCAvKiAweDIwLTB4MjMgKi8KKwkweDlBLCAweDQxLCAweDlBLCAweDQyLCAweDlBLCAweDQzLCAweDlBLCAweDQ0LCAvKiAweDI0LTB4MjcgKi8KKwkweEJDLCAweEZCLCAweEJDLCAweEZDLCAweDlBLCAweDQ1LCAweEJDLCAweEZELCAvKiAweDI4LTB4MkIgKi8KKwkweDlBLCAweDQ2LCAweEJDLCAweEZFLCAweDlBLCAweDQ3LCAweEJELCAweEExLCAvKiAweDJDLTB4MkYgKi8KKwkweDlBLCAweDQ4LCAweEJELCAweEEyLCAweEJELCAweEEzLCAweDlBLCAweDQ5LCAvKiAweDMwLTB4MzMgKi8KKwkweEJELCAweEE0LCAweDlBLCAweDRBLCAweDlBLCAweDRCLCAweDlBLCAweDRDLCAvKiAweDM0LTB4MzcgKi8KKwkweDlBLCAweDRELCAweDlBLCAweDRFLCAweDlBLCAweDRGLCAweDlBLCAweDUwLCAvKiAweDM4LTB4M0IgKi8KKwkweDlBLCAweDUxLCAweDlBLCAweDUyLCAweDlBLCAweDUzLCAweDlBLCAweDU0LCAvKiAweDNDLTB4M0YgKi8KKwkweDlBLCAweDU1LCAweDlBLCAweDU2LCAweDlBLCAweDU3LCAweDlBLCAweDU4LCAvKiAweDQwLTB4NDMgKi8KKwkweDlBLCAweDU5LCAweDlBLCAweDVBLCAweDlBLCAweDYxLCAweDlBLCAweDYyLCAvKiAweDQ0LTB4NDcgKi8KKwkweEJELCAweEE1LCAweDlBLCAweDYzLCAweDlBLCAweDY0LCAweDlBLCAweDY1LCAvKiAweDQ4LTB4NEIgKi8KKwkweDlBLCAweDY2LCAweDlBLCAweDY3LCAweDlBLCAweDY4LCAweDlBLCAweDY5LCAvKiAweDRDLTB4NEYgKi8KKwkweEJELCAweEE2LCAweEJELCAweEE3LCAweDlBLCAweDZBLCAweDlBLCAweDZCLCAvKiAweDUwLTB4NTMgKi8KKwkweEJELCAweEE4LCAweDlBLCAweDZDLCAweDlBLCAweDZELCAweDlBLCAweDZFLCAvKiAweDU0LTB4NTcgKi8KKwkweEJELCAweEE5LCAweDlBLCAweDZGLCAweDlBLCAweDcwLCAweDlBLCAweDcxLCAvKiAweDU4LTB4NUIgKi8KKwkweDlBLCAweDcyLCAweDlBLCAweDczLCAweDlBLCAweDc0LCAweDlBLCAweDc1LCAvKiAweDVDLTB4NUYgKi8KKwkweEJELCAweEFBLCAweDlBLCAweDc2LCAweDlBLCAweDc3LCAweDlBLCAweDc4LCAvKiAweDYwLTB4NjMgKi8KKwkweDlBLCAweDc5LCAweEJELCAweEFCLCAweDlBLCAweDdBLCAweDlBLCAweDgxLCAvKiAweDY0LTB4NjcgKi8KKwkweDlBLCAweDgyLCAweDlBLCAweDgzLCAweDlBLCAweDg0LCAweDlBLCAweDg1LCAvKiAweDY4LTB4NkIgKi8KKwkweEJELCAweEFDLCAweEJELCAweEFELCAweDlBLCAweDg2LCAweDlBLCAweDg3LCAvKiAweDZDLTB4NkYgKi8KKwkweEJELCAweEFFLCAweDlBLCAweDg4LCAweDlBLCAweDg5LCAweDlBLCAweDhBLCAvKiAweDcwLTB4NzMgKi8KKwkweEJELCAweEFGLCAweDlBLCAweDhCLCAweDlBLCAweDhDLCAweDlBLCAweDhELCAvKiAweDc0LTB4NzcgKi8KKwkweDlBLCAweDhFLCAweDlBLCAweDhGLCAweDlBLCAweDkwLCAweDlBLCAweDkxLCAvKiAweDc4LTB4N0IgKi8KKwkweEJELCAweEIwLCAweEJELCAweEIxLCAweDlBLCAweDkyLCAweEJELCAweEIyLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDlBLCAweDkzLCAweEJELCAweEIzLCAweDlBLCAweDk0LCAweDlBLCAweDk1LCAvKiAweDgwLTB4ODMgKi8KKwkweDlBLCAweDk2LCAweDlBLCAweDk3LCAweDlBLCAweDk4LCAweDlBLCAweDk5LCAvKiAweDg0LTB4ODcgKi8KKwkweEJELCAweEI0LCAweEJELCAweEI1LCAweDlBLCAweDlBLCAweDlBLCAweDlCLCAvKiAweDg4LTB4OEIgKi8KKwkweDlBLCAweDlDLCAweDlBLCAweDlELCAweDlBLCAweDlFLCAweDlBLCAweDlGLCAvKiAweDhDLTB4OEYgKi8KKwkweEJELCAweEI2LCAweDlBLCAweEEwLCAweDlBLCAweEExLCAweDlBLCAweEEyLCAvKiAweDkwLTB4OTMgKi8KKwkweDlBLCAweEEzLCAweDlBLCAweEE0LCAweDlBLCAweEE1LCAweDlBLCAweEE2LCAvKiAweDk0LTB4OTcgKi8KKwkweEJELCAweEI3LCAweDlBLCAweEE3LCAweDlBLCAweEE4LCAweEJELCAweEI4LCAvKiAweDk4LTB4OUIgKi8KKwkweDlBLCAweEE5LCAweEJELCAweEI5LCAweDlBLCAweEFBLCAweDlBLCAweEFCLCAvKiAweDlDLTB4OUYgKi8KKwkweDlBLCAweEFDLCAweDlBLCAweEFELCAweDlBLCAweEFFLCAweDlBLCAweEFGLCAvKiAweEEwLTB4QTMgKi8KKwkweEJELCAweEJBLCAweEJELCAweEJCLCAweDlBLCAweEIwLCAweDlBLCAweEIxLCAvKiAweEE0LTB4QTcgKi8KKwkweEJELCAweEJDLCAweDlBLCAweEIyLCAweDlBLCAweEIzLCAweDlBLCAweEI0LCAvKiAweEE4LTB4QUIgKi8KKwkweEJELCAweEJELCAweEJELCAweEJFLCAweDlBLCAweEI1LCAweDlBLCAweEI2LCAvKiAweEFDLTB4QUYgKi8KKwkweDlBLCAweEI3LCAweDlBLCAweEI4LCAweDlBLCAweEI5LCAweDlBLCAweEJBLCAvKiAweEIwLTB4QjMgKi8KKwkweEJELCAweEJGLCAweEJELCAweEMwLCAweDlBLCAweEJCLCAweEJELCAweEMxLCAvKiAweEI0LTB4QjcgKi8KKwkweDlBLCAweEJDLCAweEJELCAweEMyLCAweDlBLCAweEJELCAweDlBLCAweEJFLCAvKiAweEI4LTB4QkIgKi8KKwkweDlBLCAweEJGLCAweDlBLCAweEMwLCAweDlBLCAweEMxLCAweDlBLCAweEMyLCAvKiAweEJDLTB4QkYgKi8KKwkweDlBLCAweEMzLCAweDlBLCAweEM0LCAweDlBLCAweEM1LCAweDlBLCAweEM2LCAvKiAweEMwLTB4QzMgKi8KKwkweDlBLCAweEM3LCAweDlBLCAweEM4LCAweDlBLCAweEM5LCAweDlBLCAweENBLCAvKiAweEM0LTB4QzcgKi8KKwkweDlBLCAweENCLCAweDlBLCAweENDLCAweDlBLCAweENELCAweDlBLCAweENFLCAvKiAweEM4LTB4Q0IgKi8KKwkweDlBLCAweENGLCAweDlBLCAweEQwLCAweDlBLCAweEQxLCAweDlBLCAweEQyLCAvKiAweENDLTB4Q0YgKi8KKwkweDlBLCAweEQzLCAweDlBLCAweEQ0LCAweDlBLCAweEQ1LCAweDlBLCAweEQ2LCAvKiAweEQwLTB4RDMgKi8KKwkweDlBLCAweEQ3LCAweDlBLCAweEQ4LCAweDlBLCAweEQ5LCAweDlBLCAweERBLCAvKiAweEQ0LTB4RDcgKi8KKwkweDlBLCAweERCLCAweDlBLCAweERDLCAweDlBLCAweERELCAweDlBLCAweERFLCAvKiAweEQ4LTB4REIgKi8KKwkweEJELCAweEMzLCAweEJELCAweEM0LCAweDlBLCAweERGLCAweDlBLCAweEUwLCAvKiAweERDLTB4REYgKi8KKwkweEJELCAweEM1LCAweDlBLCAweEUxLCAweDlBLCAweEUyLCAweEJELCAweEM2LCAvKiAweEUwLTB4RTMgKi8KKwkweEJELCAweEM3LCAweDlBLCAweEUzLCAweDlBLCAweEU0LCAweDlBLCAweEU1LCAvKiAweEU0LTB4RTcgKi8KKwkweDlBLCAweEU2LCAweDlBLCAweEU3LCAweDlBLCAweEU4LCAweEJELCAweEM4LCAvKiAweEU4LTB4RUIgKi8KKwkweEJELCAweEM5LCAweEJELCAweENBLCAweDlBLCAweEU5LCAweEJELCAweENCLCAvKiAweEVDLTB4RUYgKi8KKwkweDlBLCAweEVBLCAweEJELCAweENDLCAweDlBLCAweEVCLCAweDlBLCAweEVDLCAvKiAweEYwLTB4RjMgKi8KKwkweDlBLCAweEVELCAweDlBLCAweEVFLCAweEJELCAweENELCAweDlBLCAweEVGLCAvKiAweEY0LTB4RjcgKi8KKwkweEJELCAweENFLCAweEJELCAweENGLCAweDlBLCAweEYwLCAweEJELCAweEQwLCAvKiAweEY4LTB4RkIgKi8KKwkweEJELCAweEQxLCAweDlBLCAweEYxLCAweDlBLCAweEYyLCAweDlBLCAweEYzLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19DM1s1MTJdID0geworCTB4QkQsIDB4RDIsIDB4OUEsIDB4RjQsIDB4OUEsIDB4RjUsIDB4OUEsIDB4RjYsIC8qIDB4MDAtMHgwMyAqLworCTB4OUEsIDB4RjcsIDB4OUEsIDB4RjgsIDB4OUEsIDB4RjksIDB4OUEsIDB4RkEsIC8qIDB4MDQtMHgwNyAqLworCTB4QkQsIDB4RDMsIDB4QkQsIDB4RDQsIDB4OUEsIDB4RkIsIDB4OUEsIDB4RkMsIC8qIDB4MDgtMHgwQiAqLworCTB4QkQsIDB4RDUsIDB4QkQsIDB4RDYsIDB4OUEsIDB4RkQsIDB4OUEsIDB4RkUsIC8qIDB4MEMtMHgwRiAqLworCTB4OUIsIDB4NDEsIDB4OUIsIDB4NDIsIDB4OUIsIDB4NDMsIDB4QkQsIDB4RDcsIC8qIDB4MTAtMHgxMyAqLworCTB4QkQsIDB4RDgsIDB4QkQsIDB4RDksIDB4OUIsIDB4NDQsIDB4OUIsIDB4NDUsIC8qIDB4MTQtMHgxNyAqLworCTB4QkQsIDB4REEsIDB4OUIsIDB4NDYsIDB4OUIsIDB4NDcsIDB4OUIsIDB4NDgsIC8qIDB4MTgtMHgxQiAqLworCTB4QkQsIDB4REIsIDB4OUIsIDB4NDksIDB4OUIsIDB4NEEsIDB4OUIsIDB4NEIsIC8qIDB4MUMtMHgxRiAqLworCTB4OUIsIDB4NEMsIDB4OUIsIDB4NEQsIDB4OUIsIDB4NEUsIDB4OUIsIDB4NEYsIC8qIDB4MjAtMHgyMyAqLworCTB4QkQsIDB4REMsIDB4QkQsIDB4REQsIDB4OUIsIDB4NTAsIDB4OUIsIDB4NTEsIC8qIDB4MjQtMHgyNyAqLworCTB4QkQsIDB4REUsIDB4QkQsIDB4REYsIDB4OUIsIDB4NTIsIDB4OUIsIDB4NTMsIC8qIDB4MjgtMHgyQiAqLworCTB4OUIsIDB4NTQsIDB4OUIsIDB4NTUsIDB4OUIsIDB4NTYsIDB4OUIsIDB4NTcsIC8qIDB4MkMtMHgyRiAqLworCTB4OUIsIDB4NTgsIDB4OUIsIDB4NTksIDB4OUIsIDB4NUEsIDB4OUIsIDB4NjEsIC8qIDB4MzAtMHgzMyAqLworCTB4OUIsIDB4NjIsIDB4OUIsIDB4NjMsIDB4OUIsIDB4NjQsIDB4OUIsIDB4NjUsIC8qIDB4MzQtMHgzNyAqLworCTB4OUIsIDB4NjYsIDB4OUIsIDB4NjcsIDB4OUIsIDB4NjgsIDB4OUIsIDB4NjksIC8qIDB4MzgtMHgzQiAqLworCTB4OUIsIDB4NkEsIDB4OUIsIDB4NkIsIDB4OUIsIDB4NkMsIDB4OUIsIDB4NkQsIC8qIDB4M0MtMHgzRiAqLworCTB4OUIsIDB4NkUsIDB4OUIsIDB4NkYsIDB4OUIsIDB4NzAsIDB4OUIsIDB4NzEsIC8qIDB4NDAtMHg0MyAqLworCTB4OUIsIDB4NzIsIDB4QkQsIDB4RTAsIDB4OUIsIDB4NzMsIDB4OUIsIDB4NzQsIC8qIDB4NDQtMHg0NyAqLworCTB4OUIsIDB4NzUsIDB4OUIsIDB4NzYsIDB4OUIsIDB4NzcsIDB4OUIsIDB4NzgsIC8qIDB4NDgtMHg0QiAqLworCTB4OUIsIDB4NzksIDB4OUIsIDB4N0EsIDB4OUIsIDB4ODEsIDB4OUIsIDB4ODIsIC8qIDB4NEMtMHg0RiAqLworCTB4OUIsIDB4ODMsIDB4OUIsIDB4ODQsIDB4OUIsIDB4ODUsIDB4OUIsIDB4ODYsIC8qIDB4NTAtMHg1MyAqLworCTB4OUIsIDB4ODcsIDB4OUIsIDB4ODgsIDB4OUIsIDB4ODksIDB4OUIsIDB4OEEsIC8qIDB4NTQtMHg1NyAqLworCTB4OUIsIDB4OEIsIDB4OUIsIDB4OEMsIDB4OUIsIDB4OEQsIDB4OUIsIDB4OEUsIC8qIDB4NTgtMHg1QiAqLworCTB4OUIsIDB4OEYsIDB4OUIsIDB4OTAsIDB4OUIsIDB4OTEsIDB4OUIsIDB4OTIsIC8qIDB4NUMtMHg1RiAqLworCTB4OUIsIDB4OTMsIDB4OUIsIDB4OTQsIDB4OUIsIDB4OTUsIDB4OUIsIDB4OTYsIC8qIDB4NjAtMHg2MyAqLworCTB4OUIsIDB4OTcsIDB4OUIsIDB4OTgsIDB4OUIsIDB4OTksIDB4OUIsIDB4OUEsIC8qIDB4NjQtMHg2NyAqLworCTB4QkQsIDB4RTEsIDB4QkQsIDB4RTIsIDB4OUIsIDB4OUIsIDB4OUIsIDB4OUMsIC8qIDB4NjgtMHg2QiAqLworCTB4QkQsIDB4RTMsIDB4OUIsIDB4OUQsIDB4OUIsIDB4OUUsIDB4OUIsIDB4OUYsIC8qIDB4NkMtMHg2RiAqLworCTB4QkQsIDB4RTQsIDB4OUIsIDB4QTAsIDB4QkQsIDB4RTUsIDB4OUIsIDB4QTEsIC8qIDB4NzAtMHg3MyAqLworCTB4OUIsIDB4QTIsIDB4OUIsIDB4QTMsIDB4OUIsIDB4QTQsIDB4OUIsIDB4QTUsIC8qIDB4NzQtMHg3NyAqLworCTB4QkQsIDB4RTYsIDB4QkQsIDB4RTcsIDB4OUIsIDB4QTYsIDB4OUIsIDB4QTcsIC8qIDB4NzgtMHg3QiAqLworCTB4QkQsIDB4RTgsIDB4QkQsIDB4RTksIDB4OUIsIDB4QTgsIDB4OUIsIDB4QTksIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OUIsIDB4QUEsIDB4OUIsIDB4QUIsIDB4OUIsIDB4QUMsIDB4OUIsIDB4QUQsIC8qIDB4ODAtMHg4MyAqLworCTB4QkQsIDB4RUEsIDB4OUIsIDB4QUUsIDB4OUIsIDB4QUYsIDB4OUIsIDB4QjAsIC8qIDB4ODQtMHg4NyAqLworCTB4QkQsIDB4RUIsIDB4OUIsIDB4QjEsIDB4OUIsIDB4QjIsIDB4OUIsIDB4QjMsIC8qIDB4ODgtMHg4QiAqLworCTB4QkQsIDB4RUMsIDB4OUIsIDB4QjQsIDB4OUIsIDB4QjUsIDB4OUIsIDB4QjYsIC8qIDB4OEMtMHg4RiAqLworCTB4OUIsIDB4QjcsIDB4OUIsIDB4QjgsIDB4OUIsIDB4QjksIDB4OUIsIDB4QkEsIC8qIDB4OTAtMHg5MyAqLworCTB4OUIsIDB4QkIsIDB4OUIsIDB4QkMsIDB4OUIsIDB4QkQsIDB4OUIsIDB4QkUsIC8qIDB4OTQtMHg5NyAqLworCTB4OUIsIDB4QkYsIDB4OUIsIDB4QzAsIDB4OUIsIDB4QzEsIDB4OUIsIDB4QzIsIC8qIDB4OTgtMHg5QiAqLworCTB4OUIsIDB4QzMsIDB4OUIsIDB4QzQsIDB4OUIsIDB4QzUsIDB4OUIsIDB4QzYsIC8qIDB4OUMtMHg5RiAqLworCTB4OUIsIDB4QzcsIDB4OUIsIDB4QzgsIDB4OUIsIDB4QzksIDB4OUIsIDB4Q0EsIC8qIDB4QTAtMHhBMyAqLworCTB4OUIsIDB4Q0IsIDB4OUIsIDB4Q0MsIDB4OUIsIDB4Q0QsIDB4OUIsIDB4Q0UsIC8qIDB4QTQtMHhBNyAqLworCTB4OUIsIDB4Q0YsIDB4OUIsIDB4RDAsIDB4OUIsIDB4RDEsIDB4OUIsIDB4RDIsIC8qIDB4QTgtMHhBQiAqLworCTB4OUIsIDB4RDMsIDB4OUIsIDB4RDQsIDB4OUIsIDB4RDUsIDB4OUIsIDB4RDYsIC8qIDB4QUMtMHhBRiAqLworCTB4OUIsIDB4RDcsIDB4OUIsIDB4RDgsIDB4OUIsIDB4RDksIDB4OUIsIDB4REEsIC8qIDB4QjAtMHhCMyAqLworCTB4OUIsIDB4REIsIDB4OUIsIDB4REMsIDB4OUIsIDB4REQsIDB4OUIsIDB4REUsIC8qIDB4QjQtMHhCNyAqLworCTB4OUIsIDB4REYsIDB4OUIsIDB4RTAsIDB4OUIsIDB4RTEsIDB4OUIsIDB4RTIsIC8qIDB4QjgtMHhCQiAqLworCTB4OUIsIDB4RTMsIDB4OUIsIDB4RTQsIDB4OUIsIDB4RTUsIDB4OUIsIDB4RTYsIC8qIDB4QkMtMHhCRiAqLworCTB4QkQsIDB4RUQsIDB4OUIsIDB4RTcsIDB4OUIsIDB4RTgsIDB4OUIsIDB4RTksIC8qIDB4QzAtMHhDMyAqLworCTB4OUIsIDB4RUEsIDB4OUIsIDB4RUIsIDB4OUIsIDB4RUMsIDB4OUIsIDB4RUQsIC8qIDB4QzQtMHhDNyAqLworCTB4OUIsIDB4RUUsIDB4OUIsIDB4RUYsIDB4OUIsIDB4RjAsIDB4OUIsIDB4RjEsIC8qIDB4QzgtMHhDQiAqLworCTB4OUIsIDB4RjIsIDB4OUIsIDB4RjMsIDB4OUIsIDB4RjQsIDB4OUIsIDB4RjUsIC8qIDB4Q0MtMHhDRiAqLworCTB4OUIsIDB4RjYsIDB4OUIsIDB4RjcsIDB4OUIsIDB4RjgsIDB4OUIsIDB4RjksIC8qIDB4RDAtMHhEMyAqLworCTB4OUIsIDB4RkEsIDB4OUIsIDB4RkIsIDB4OUIsIDB4RkMsIDB4OUIsIDB4RkQsIC8qIDB4RDQtMHhENyAqLworCTB4QkQsIDB4RUUsIDB4QkQsIDB4RUYsIDB4OUIsIDB4RkUsIDB4OUMsIDB4NDEsIC8qIDB4RDgtMHhEQiAqLworCTB4QkQsIDB4RjAsIDB4OUMsIDB4NDIsIDB4OUMsIDB4NDMsIDB4QkQsIDB4RjEsIC8qIDB4REMtMHhERiAqLworCTB4QkQsIDB4RjIsIDB4OUMsIDB4NDQsIDB4QkQsIDB4RjMsIDB4OUMsIDB4NDUsIC8qIDB4RTAtMHhFMyAqLworCTB4OUMsIDB4NDYsIDB4OUMsIDB4NDcsIDB4OUMsIDB4NDgsIDB4OUMsIDB4NDksIC8qIDB4RTQtMHhFNyAqLworCTB4QkQsIDB4RjQsIDB4QkQsIDB4RjUsIDB4OUMsIDB4NEEsIDB4OUMsIDB4NEIsIC8qIDB4RTgtMHhFQiAqLworCTB4OUMsIDB4NEMsIDB4QkQsIDB4RjYsIDB4OUMsIDB4NEQsIDB4OUMsIDB4NEUsIC8qIDB4RUMtMHhFRiAqLworCTB4OUMsIDB4NEYsIDB4OUMsIDB4NTAsIDB4OUMsIDB4NTEsIDB4OUMsIDB4NTIsIC8qIDB4RjAtMHhGMyAqLworCTB4QkQsIDB4RjcsIDB4QkQsIDB4RjgsIDB4OUMsIDB4NTMsIDB4OUMsIDB4NTQsIC8qIDB4RjQtMHhGNyAqLworCTB4QkQsIDB4RjksIDB4OUMsIDB4NTUsIDB4OUMsIDB4NTYsIDB4OUMsIDB4NTcsIC8qIDB4RjgtMHhGQiAqLworCTB4OUMsIDB4NTgsIDB4OUMsIDB4NTksIDB4OUMsIDB4NUEsIDB4OUMsIDB4NjEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0M0WzUxMl0gPSB7CisJMHg5QywgMHg2MiwgMHg5QywgMHg2MywgMHg5QywgMHg2NCwgMHg5QywgMHg2NSwgLyogMHgwMC0weDAzICovCisJMHg5QywgMHg2NiwgMHg5QywgMHg2NywgMHg5QywgMHg2OCwgMHg5QywgMHg2OSwgLyogMHgwNC0weDA3ICovCisJMHhCRCwgMHhGQSwgMHg5QywgMHg2QSwgMHg5QywgMHg2QiwgMHg5QywgMHg2QywgLyogMHgwOC0weDBCICovCisJMHg5QywgMHg2RCwgMHg5QywgMHg2RSwgMHg5QywgMHg2RiwgMHg5QywgMHg3MCwgLyogMHgwQy0weDBGICovCisJMHhCRCwgMHhGQiwgMHg5QywgMHg3MSwgMHg5QywgMHg3MiwgMHg5QywgMHg3MywgLyogMHgxMC0weDEzICovCisJMHg5QywgMHg3NCwgMHg5QywgMHg3NSwgMHg5QywgMHg3NiwgMHg5QywgMHg3NywgLyogMHgxNC0weDE3ICovCisJMHg5QywgMHg3OCwgMHg5QywgMHg3OSwgMHg5QywgMHg3QSwgMHg5QywgMHg4MSwgLyogMHgxOC0weDFCICovCisJMHg5QywgMHg4MiwgMHg5QywgMHg4MywgMHg5QywgMHg4NCwgMHg5QywgMHg4NSwgLyogMHgxQy0weDFGICovCisJMHg5QywgMHg4NiwgMHg5QywgMHg4NywgMHg5QywgMHg4OCwgMHg5QywgMHg4OSwgLyogMHgyMC0weDIzICovCisJMHhCRCwgMHhGQywgMHg5QywgMHg4QSwgMHg5QywgMHg4QiwgMHg5QywgMHg4QywgLyogMHgyNC0weDI3ICovCisJMHg5QywgMHg4RCwgMHg5QywgMHg4RSwgMHg5QywgMHg4RiwgMHg5QywgMHg5MCwgLyogMHgyOC0weDJCICovCisJMHhCRCwgMHhGRCwgMHg5QywgMHg5MSwgMHg5QywgMHg5MiwgMHg5QywgMHg5MywgLyogMHgyQy0weDJGICovCisJMHhCRCwgMHhGRSwgMHg5QywgMHg5NCwgMHg5QywgMHg5NSwgMHg5QywgMHg5NiwgLyogMHgzMC0weDMzICovCisJMHhCRSwgMHhBMSwgMHg5QywgMHg5NywgMHg5QywgMHg5OCwgMHg5QywgMHg5OSwgLyogMHgzNC0weDM3ICovCisJMHg5QywgMHg5QSwgMHg5QywgMHg5QiwgMHg5QywgMHg5QywgMHg5QywgMHg5RCwgLyogMHgzOC0weDNCICovCisJMHhCRSwgMHhBMiwgMHhCRSwgMHhBMywgMHg5QywgMHg5RSwgMHg5QywgMHg5RiwgLyogMHgzQy0weDNGICovCisJMHg5QywgMHhBMCwgMHg5QywgMHhBMSwgMHg5QywgMHhBMiwgMHg5QywgMHhBMywgLyogMHg0MC0weDQzICovCisJMHg5QywgMHhBNCwgMHg5QywgMHhBNSwgMHg5QywgMHhBNiwgMHg5QywgMHhBNywgLyogMHg0NC0weDQ3ICovCisJMHhCRSwgMHhBNCwgMHg5QywgMHhBOCwgMHg5QywgMHhBOSwgMHg5QywgMHhBQSwgLyogMHg0OC0weDRCICovCisJMHg5QywgMHhBQiwgMHg5QywgMHhBQywgMHg5QywgMHhBRCwgMHg5QywgMHhBRSwgLyogMHg0Qy0weDRGICovCisJMHg5QywgMHhBRiwgMHg5QywgMHhCMCwgMHg5QywgMHhCMSwgMHg5QywgMHhCMiwgLyogMHg1MC0weDUzICovCisJMHg5QywgMHhCMywgMHg5QywgMHhCNCwgMHg5QywgMHhCNSwgMHg5QywgMHhCNiwgLyogMHg1NC0weDU3ICovCisJMHg5QywgMHhCNywgMHg5QywgMHhCOCwgMHg5QywgMHhCOSwgMHg5QywgMHhCQSwgLyogMHg1OC0weDVCICovCisJMHg5QywgMHhCQiwgMHg5QywgMHhCQywgMHg5QywgMHhCRCwgMHg5QywgMHhCRSwgLyogMHg1Qy0weDVGICovCisJMHg5QywgMHhCRiwgMHg5QywgMHhDMCwgMHg5QywgMHhDMSwgMHg5QywgMHhDMiwgLyogMHg2MC0weDYzICovCisJMHhCRSwgMHhBNSwgMHhCRSwgMHhBNiwgMHg5QywgMHhDMywgMHg5QywgMHhDNCwgLyogMHg2NC0weDY3ICovCisJMHhCRSwgMHhBNywgMHg5QywgMHhDNSwgMHg5QywgMHhDNiwgMHg5QywgMHhDNywgLyogMHg2OC0weDZCICovCisJMHhCRSwgMHhBOCwgMHg5QywgMHhDOCwgMHg5QywgMHhDOSwgMHg5QywgMHhDQSwgLyogMHg2Qy0weDZGICovCisJMHg5QywgMHhDQiwgMHg5QywgMHhDQywgMHg5QywgMHhDRCwgMHg5QywgMHhDRSwgLyogMHg3MC0weDczICovCisJMHhCRSwgMHhBOSwgMHhCRSwgMHhBQSwgMHg5QywgMHhDRiwgMHg5QywgMHhEMCwgLyogMHg3NC0weDc3ICovCisJMHg5QywgMHhEMSwgMHhCRSwgMHhBQiwgMHg5QywgMHhEMiwgMHg5QywgMHhEMywgLyogMHg3OC0weDdCICovCisJMHg5QywgMHhENCwgMHg5QywgMHhENSwgMHg5QywgMHhENiwgMHg5QywgMHhENywgLyogMHg3Qy0weDdGICovCisJCisJMHhCRSwgMHhBQywgMHg5QywgMHhEOCwgMHg5QywgMHhEOSwgMHg5QywgMHhEQSwgLyogMHg4MC0weDgzICovCisJMHg5QywgMHhEQiwgMHg5QywgMHhEQywgMHg5QywgMHhERCwgMHg5QywgMHhERSwgLyogMHg4NC0weDg3ICovCisJMHg5QywgMHhERiwgMHg5QywgMHhFMCwgMHg5QywgMHhFMSwgMHg5QywgMHhFMiwgLyogMHg4OC0weDhCICovCisJMHg5QywgMHhFMywgMHg5QywgMHhFNCwgMHg5QywgMHhFNSwgMHg5QywgMHhFNiwgLyogMHg4Qy0weDhGICovCisJMHg5QywgMHhFNywgMHg5QywgMHhFOCwgMHg5QywgMHhFOSwgMHg5QywgMHhFQSwgLyogMHg5MC0weDkzICovCisJMHhCRSwgMHhBRCwgMHg5QywgMHhFQiwgMHg5QywgMHhFQywgMHg5QywgMHhFRCwgLyogMHg5NC0weDk3ICovCisJMHg5QywgMHhFRSwgMHg5QywgMHhFRiwgMHg5QywgMHhGMCwgMHg5QywgMHhGMSwgLyogMHg5OC0weDlCICovCisJMHhCRSwgMHhBRSwgMHg5QywgMHhGMiwgMHg5QywgMHhGMywgMHg5QywgMHhGNCwgLyogMHg5Qy0weDlGICovCisJMHg5QywgMHhGNSwgMHg5QywgMHhGNiwgMHg5QywgMHhGNywgMHg5QywgMHhGOCwgLyogMHhBMC0weEEzICovCisJMHg5QywgMHhGOSwgMHg5QywgMHhGQSwgMHg5QywgMHhGQiwgMHg5QywgMHhGQywgLyogMHhBNC0weEE3ICovCisJMHg5QywgMHhGRCwgMHg5QywgMHhGRSwgMHg5RCwgMHg0MSwgMHg5RCwgMHg0MiwgLyogMHhBOC0weEFCICovCisJMHg5RCwgMHg0MywgMHg5RCwgMHg0NCwgMHg5RCwgMHg0NSwgMHg5RCwgMHg0NiwgLyogMHhBQy0weEFGICovCisJMHg5RCwgMHg0NywgMHg5RCwgMHg0OCwgMHg5RCwgMHg0OSwgMHg5RCwgMHg0QSwgLyogMHhCMC0weEIzICovCisJMHg5RCwgMHg0QiwgMHg5RCwgMHg0QywgMHg5RCwgMHg0RCwgMHg5RCwgMHg0RSwgLyogMHhCNC0weEI3ICovCisJMHhCRSwgMHhBRiwgMHg5RCwgMHg0RiwgMHg5RCwgMHg1MCwgMHg5RCwgMHg1MSwgLyogMHhCOC0weEJCICovCisJMHhCRSwgMHhCMCwgMHg5RCwgMHg1MiwgMHg5RCwgMHg1MywgMHg5RCwgMHg1NCwgLyogMHhCQy0weEJGICovCisJMHg5RCwgMHg1NSwgMHg5RCwgMHg1NiwgMHg5RCwgMHg1NywgMHg5RCwgMHg1OCwgLyogMHhDMC0weEMzICovCisJMHg5RCwgMHg1OSwgMHg5RCwgMHg1QSwgMHg5RCwgMHg2MSwgMHg5RCwgMHg2MiwgLyogMHhDNC0weEM3ICovCisJMHg5RCwgMHg2MywgMHg5RCwgMHg2NCwgMHg5RCwgMHg2NSwgMHg5RCwgMHg2NiwgLyogMHhDOC0weENCICovCisJMHg5RCwgMHg2NywgMHg5RCwgMHg2OCwgMHg5RCwgMHg2OSwgMHg5RCwgMHg2QSwgLyogMHhDQy0weENGICovCisJMHg5RCwgMHg2QiwgMHg5RCwgMHg2QywgMHg5RCwgMHg2RCwgMHg5RCwgMHg2RSwgLyogMHhEMC0weEQzICovCisJMHg5RCwgMHg2RiwgMHg5RCwgMHg3MCwgMHg5RCwgMHg3MSwgMHg5RCwgMHg3MiwgLyogMHhENC0weEQ3ICovCisJMHg5RCwgMHg3MywgMHg5RCwgMHg3NCwgMHg5RCwgMHg3NSwgMHg5RCwgMHg3NiwgLyogMHhEOC0weERCICovCisJMHg5RCwgMHg3NywgMHg5RCwgMHg3OCwgMHg5RCwgMHg3OSwgMHg5RCwgMHg3QSwgLyogMHhEQy0weERGICovCisJMHg5RCwgMHg4MSwgMHg5RCwgMHg4MiwgMHg5RCwgMHg4MywgMHg5RCwgMHg4NCwgLyogMHhFMC0weEUzICovCisJMHg5RCwgMHg4NSwgMHg5RCwgMHg4NiwgMHg5RCwgMHg4NywgMHg5RCwgMHg4OCwgLyogMHhFNC0weEU3ICovCisJMHg5RCwgMHg4OSwgMHhCRSwgMHhCMSwgMHg5RCwgMHg4QSwgMHg5RCwgMHg4QiwgLyogMHhFOC0weEVCICovCisJMHg5RCwgMHg4QywgMHg5RCwgMHg4RCwgMHg5RCwgMHg4RSwgMHg5RCwgMHg4RiwgLyogMHhFQy0weEVGICovCisJMHhCRSwgMHhCMiwgMHhCRSwgMHhCMywgMHg5RCwgMHg5MCwgMHg5RCwgMHg5MSwgLyogMHhGMC0weEYzICovCisJMHhCRSwgMHhCNCwgMHg5RCwgMHg5MiwgMHg5RCwgMHg5MywgMHg5RCwgMHg5NCwgLyogMHhGNC0weEY3ICovCisJMHhCRSwgMHhCNSwgMHg5RCwgMHg5NSwgMHhCRSwgMHhCNiwgMHg5RCwgMHg5NiwgLyogMHhGOC0weEZCICovCisJMHg5RCwgMHg5NywgMHg5RCwgMHg5OCwgMHg5RCwgMHg5OSwgMHhCRSwgMHhCNywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQzVbNTEyXSA9IHsKKwkweEJFLCAweEI4LCAweEJFLCAweEI5LCAweDlELCAweDlBLCAweDlELCAweDlCLCAvKiAweDAwLTB4MDMgKi8KKwkweDlELCAweDlDLCAweDlELCAweDlELCAweDlELCAweDlFLCAweDlELCAweDlGLCAvKiAweDA0LTB4MDcgKi8KKwkweDlELCAweEEwLCAweDlELCAweEExLCAweDlELCAweEEyLCAweDlELCAweEEzLCAvKiAweDA4LTB4MEIgKi8KKwkweEJFLCAweEJBLCAweDlELCAweEE0LCAweDlELCAweEE1LCAweDlELCAweEE2LCAvKiAweDBDLTB4MEYgKi8KKwkweEJFLCAweEJCLCAweDlELCAweEE3LCAweDlELCAweEE4LCAweDlELCAweEE5LCAvKiAweDEwLTB4MTMgKi8KKwkweEJFLCAweEJDLCAweDlELCAweEFBLCAweDlELCAweEFCLCAweDlELCAweEFDLCAvKiAweDE0LTB4MTcgKi8KKwkweDlELCAweEFELCAweDlELCAweEFFLCAweDlELCAweEFGLCAweDlELCAweEIwLCAvKiAweDE4LTB4MUIgKi8KKwkweEJFLCAweEJELCAweDlELCAweEIxLCAweDlELCAweEIyLCAweDlELCAweEIzLCAvKiAweDFDLTB4MUYgKi8KKwkweDlELCAweEI0LCAweDlELCAweEI1LCAweDlELCAweEI2LCAweDlELCAweEI3LCAvKiAweDIwLTB4MjMgKi8KKwkweDlELCAweEI4LCAweDlELCAweEI5LCAweDlELCAweEJBLCAweDlELCAweEJCLCAvKiAweDI0LTB4MjcgKi8KKwkweEJFLCAweEJFLCAweEJFLCAweEJGLCAweDlELCAweEJDLCAweDlELCAweEJELCAvKiAweDI4LTB4MkIgKi8KKwkweEJFLCAweEMwLCAweDlELCAweEJFLCAweDlELCAweEJGLCAweDlELCAweEMwLCAvKiAweDJDLTB4MkYgKi8KKwkweEJFLCAweEMxLCAweDlELCAweEMxLCAweDlELCAweEMyLCAweDlELCAweEMzLCAvKiAweDMwLTB4MzMgKi8KKwkweDlELCAweEM0LCAweDlELCAweEM1LCAweDlELCAweEM2LCAweDlELCAweEM3LCAvKiAweDM0LTB4MzcgKi8KKwkweEJFLCAweEMyLCAweEJFLCAweEMzLCAweDlELCAweEM4LCAweEJFLCAweEM0LCAvKiAweDM4LTB4M0IgKi8KKwkweDlELCAweEM5LCAweEJFLCAweEM1LCAweDlELCAweENBLCAweDlELCAweENCLCAvKiAweDNDLTB4M0YgKi8KKwkweDlELCAweENDLCAweDlELCAweENELCAweDlELCAweENFLCAweDlELCAweENGLCAvKiAweDQwLTB4NDMgKi8KKwkweEJFLCAweEM2LCAweEJFLCAweEM3LCAweDlELCAweEQwLCAweDlELCAweEQxLCAvKiAweDQ0LTB4NDcgKi8KKwkweEJFLCAweEM4LCAweEJFLCAweEM5LCAweEJFLCAweENBLCAweDlELCAweEQyLCAvKiAweDQ4LTB4NEIgKi8KKwkweEJFLCAweENCLCAweEJFLCAweENDLCAweEJFLCAweENELCAweDlELCAweEQzLCAvKiAweDRDLTB4NEYgKi8KKwkweDlELCAweEQ0LCAweDlELCAweEQ1LCAweDlELCAweEQ2LCAweEJFLCAweENFLCAvKiAweDUwLTB4NTMgKi8KKwkweEJFLCAweENGLCAweEJFLCAweEQwLCAweDlELCAweEQ3LCAweEJFLCAweEQxLCAvKiAweDU0LTB4NTcgKi8KKwkweEJFLCAweEQyLCAweEJFLCAweEQzLCAweDlELCAweEQ4LCAweDlELCAweEQ5LCAvKiAweDU4LTB4NUIgKi8KKwkweDlELCAweERBLCAweEJFLCAweEQ0LCAweEJFLCAweEQ1LCAweDlELCAweERCLCAvKiAweDVDLTB4NUYgKi8KKwkweEJFLCAweEQ2LCAweEJFLCAweEQ3LCAweDlELCAweERDLCAweDlELCAweERELCAvKiAweDYwLTB4NjMgKi8KKwkweEJFLCAweEQ4LCAweDlELCAweERFLCAweDlELCAweERGLCAweDlELCAweEUwLCAvKiAweDY0LTB4NjcgKi8KKwkweEJFLCAweEQ5LCAweDlELCAweEUxLCAweDlELCAweEUyLCAweDlELCAweEUzLCAvKiAweDY4LTB4NkIgKi8KKwkweDlELCAweEU0LCAweDlELCAweEU1LCAweDlELCAweEU2LCAweDlELCAweEU3LCAvKiAweDZDLTB4NkYgKi8KKwkweEJFLCAweERBLCAweEJFLCAweERCLCAweDlELCAweEU4LCAweEJFLCAweERDLCAvKiAweDcwLTB4NzMgKi8KKwkweEJFLCAweERELCAweEJFLCAweERFLCAweDlELCAweEU5LCAweDlELCAweEVBLCAvKiAweDc0LTB4NzcgKi8KKwkweDlELCAweEVCLCAweDlELCAweEVDLCAweDlELCAweEVELCAweDlELCAweEVFLCAvKiAweDc4LTB4N0IgKi8KKwkweEJFLCAweERGLCAweEJFLCAweEUwLCAweDlELCAweEVGLCAweDlELCAweEYwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEJFLCAweEUxLCAweDlELCAweEYxLCAweDlELCAweEYyLCAweDlELCAweEYzLCAvKiAweDgwLTB4ODMgKi8KKwkweEJFLCAweEUyLCAweDlELCAweEY0LCAweDlELCAweEY1LCAweEJFLCAweEUzLCAvKiAweDg0LTB4ODcgKi8KKwkweDlELCAweEY2LCAweDlELCAweEY3LCAweDlELCAweEY4LCAweDlELCAweEY5LCAvKiAweDg4LTB4OEIgKi8KKwkweEJFLCAweEU0LCAweEJFLCAweEU1LCAweDlELCAweEZBLCAweEJFLCAweEU2LCAvKiAweDhDLTB4OEYgKi8KKwkweDlELCAweEZCLCAweEJFLCAweEU3LCAweDlELCAweEZDLCAweDlELCAweEZELCAvKiAweDkwLTB4OTMgKi8KKwkweDlELCAweEZFLCAweEJFLCAweEU4LCAweDlFLCAweDQxLCAweEJFLCAweEU5LCAvKiAweDk0LTB4OTcgKi8KKwkweEJFLCAweEVBLCAweDlFLCAweDQyLCAweDlFLCAweDQzLCAweDlFLCAweDQ0LCAvKiAweDk4LTB4OUIgKi8KKwkweEJFLCAweEVCLCAweDlFLCAweDQ1LCAweDlFLCAweDQ2LCAweDlFLCAweDQ3LCAvKiAweDlDLTB4OUYgKi8KKwkweEJFLCAweEVDLCAweDlFLCAweDQ4LCAweDlFLCAweDQ5LCAweDlFLCAweDRBLCAvKiAweEEwLTB4QTMgKi8KKwkweDlFLCAweDRCLCAweDlFLCAweDRDLCAweDlFLCAweDRELCAweDlFLCAweDRFLCAvKiAweEE0LTB4QTcgKi8KKwkweDlFLCAweDRGLCAweEJFLCAweEVELCAweDlFLCAweDUwLCAweDlFLCAweDUxLCAvKiAweEE4LTB4QUIgKi8KKwkweDlFLCAweDUyLCAweDlFLCAweDUzLCAweDlFLCAweDU0LCAweDlFLCAweDU1LCAvKiAweEFDLTB4QUYgKi8KKwkweDlFLCAweDU2LCAweDlFLCAweDU3LCAweDlFLCAweDU4LCAweDlFLCAweDU5LCAvKiAweEIwLTB4QjMgKi8KKwkweEJFLCAweEVFLCAweEJFLCAweEVGLCAweDlFLCAweDVBLCAweDlFLCAweDYxLCAvKiAweEI0LTB4QjcgKi8KKwkweEJFLCAweEYwLCAweEJFLCAweEYxLCAweDlFLCAweDYyLCAweEJFLCAweEYyLCAvKiAweEI4LTB4QkIgKi8KKwkweEJFLCAweEYzLCAweEJFLCAweEY0LCAweEJFLCAweEY1LCAweDlFLCAweDYzLCAvKiAweEJDLTB4QkYgKi8KKwkweDlFLCAweDY0LCAweDlFLCAweDY1LCAweDlFLCAweDY2LCAweDlFLCAweDY3LCAvKiAweEMwLTB4QzMgKi8KKwkweEJFLCAweEY2LCAweEJFLCAweEY3LCAweEJFLCAweEY4LCAweEJFLCAweEY5LCAvKiAweEM0LTB4QzcgKi8KKwkweEJFLCAweEZBLCAweEJFLCAweEZCLCAweEJFLCAweEZDLCAweDlFLCAweDY4LCAvKiAweEM4LTB4Q0IgKi8KKwkweEJFLCAweEZELCAweDlFLCAweDY5LCAweEJFLCAweEZFLCAweDlFLCAweDZBLCAvKiAweENDLTB4Q0YgKi8KKwkweEJGLCAweEExLCAweEJGLCAweEEyLCAweDlFLCAweDZCLCAweDlFLCAweDZDLCAvKiAweEQwLTB4RDMgKi8KKwkweEJGLCAweEEzLCAweDlFLCAweDZELCAweDlFLCAweDZFLCAweDlFLCAweDZGLCAvKiAweEQ0LTB4RDcgKi8KKwkweEJGLCAweEE0LCAweDlFLCAweDcwLCAweDlFLCAweDcxLCAweDlFLCAweDcyLCAvKiAweEQ4LTB4REIgKi8KKwkweDlFLCAweDczLCAweDlFLCAweDc0LCAweDlFLCAweDc1LCAweDlFLCAweDc2LCAvKiAweERDLTB4REYgKi8KKwkweEJGLCAweEE1LCAweEJGLCAweEE2LCAweDlFLCAweDc3LCAweEJGLCAweEE3LCAvKiAweEUwLTB4RTMgKi8KKwkweDlFLCAweDc4LCAweEJGLCAweEE4LCAweDlFLCAweDc5LCAweDlFLCAweDdBLCAvKiAweEU0LTB4RTcgKi8KKwkweDlFLCAweDgxLCAweDlFLCAweDgyLCAweDlFLCAweDgzLCAweDlFLCAweDg0LCAvKiAweEU4LTB4RUIgKi8KKwkweEJGLCAweEE5LCAweEJGLCAweEFBLCAweEJGLCAweEFCLCAweDlFLCAweDg1LCAvKiAweEVDLTB4RUYgKi8KKwkweEJGLCAweEFDLCAweDlFLCAweDg2LCAweDlFLCAweDg3LCAweDlFLCAweDg4LCAvKiAweEYwLTB4RjMgKi8KKwkweEJGLCAweEFELCAweDlFLCAweDg5LCAweEJGLCAweEFFLCAweEJGLCAweEFGLCAvKiAweEY0LTB4RjcgKi8KKwkweDlFLCAweDhBLCAweDlFLCAweDhCLCAweDlFLCAweDhDLCAweDlFLCAweDhELCAvKiAweEY4LTB4RkIgKi8KKwkweEJGLCAweEIwLCAweEJGLCAweEIxLCAweEJGLCAweEIyLCAweEJGLCAweEIzLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19DNls1MTJdID0geworCTB4QkYsIDB4QjQsIDB4QkYsIDB4QjUsIDB4OUUsIDB4OEUsIDB4OUUsIDB4OEYsIC8qIDB4MDAtMHgwMyAqLworCTB4OUUsIDB4OTAsIDB4QkYsIDB4QjYsIDB4QkYsIDB4QjcsIDB4QkYsIDB4QjgsIC8qIDB4MDQtMHgwNyAqLworCTB4QkYsIDB4QjksIDB4OUUsIDB4OTEsIDB4OUUsIDB4OTIsIDB4OUUsIDB4OTMsIC8qIDB4MDgtMHgwQiAqLworCTB4QkYsIDB4QkEsIDB4OUUsIDB4OTQsIDB4OUUsIDB4OTUsIDB4OUUsIDB4OTYsIC8qIDB4MEMtMHgwRiAqLworCTB4QkYsIDB4QkIsIDB4OUUsIDB4OTcsIDB4OUUsIDB4OTgsIDB4OUUsIDB4OTksIC8qIDB4MTAtMHgxMyAqLworCTB4OUUsIDB4OUEsIDB4OUUsIDB4OUIsIDB4OUUsIDB4OUMsIDB4OUUsIDB4OUQsIC8qIDB4MTQtMHgxNyAqLworCTB4QkYsIDB4QkMsIDB4QkYsIDB4QkQsIDB4OUUsIDB4OUUsIDB4QkYsIDB4QkUsIC8qIDB4MTgtMHgxQiAqLworCTB4QkYsIDB4QkYsIDB4OUUsIDB4OUYsIDB4OUUsIDB4QTAsIDB4OUUsIDB4QTEsIC8qIDB4MUMtMHgxRiAqLworCTB4OUUsIDB4QTIsIDB4OUUsIDB4QTMsIDB4OUUsIDB4QTQsIDB4OUUsIDB4QTUsIC8qIDB4MjAtMHgyMyAqLworCTB4QkYsIDB4QzAsIDB4QkYsIDB4QzEsIDB4OUUsIDB4QTYsIDB4OUUsIDB4QTcsIC8qIDB4MjQtMHgyNyAqLworCTB4QkYsIDB4QzIsIDB4OUUsIDB4QTgsIDB4OUUsIDB4QTksIDB4OUUsIDB4QUEsIC8qIDB4MjgtMHgyQiAqLworCTB4QkYsIDB4QzMsIDB4QkYsIDB4QzQsIDB4QkYsIDB4QzUsIDB4OUUsIDB4QUIsIC8qIDB4MkMtMHgyRiAqLworCTB4QkYsIDB4QzYsIDB4OUUsIDB4QUMsIDB4OUUsIDB4QUQsIDB4QkYsIDB4QzcsIC8qIDB4MzAtMHgzMyAqLworCTB4QkYsIDB4QzgsIDB4QkYsIDB4QzksIDB4OUUsIDB4QUUsIDB4QkYsIDB4Q0EsIC8qIDB4MzQtMHgzNyAqLworCTB4OUUsIDB4QUYsIDB4QkYsIDB4Q0IsIDB4OUUsIDB4QjAsIDB4QkYsIDB4Q0MsIC8qIDB4MzgtMHgzQiAqLworCTB4OUUsIDB4QjEsIDB4OUUsIDB4QjIsIDB4OUUsIDB4QjMsIDB4OUUsIDB4QjQsIC8qIDB4M0MtMHgzRiAqLworCTB4QkYsIDB4Q0QsIDB4QkYsIDB4Q0UsIDB4OUUsIDB4QjUsIDB4OUUsIDB4QjYsIC8qIDB4NDAtMHg0MyAqLworCTB4QkYsIDB4Q0YsIDB4OUUsIDB4QjcsIDB4OUUsIDB4QjgsIDB4OUUsIDB4QjksIC8qIDB4NDQtMHg0NyAqLworCTB4QkYsIDB4RDAsIDB4OUUsIDB4QkEsIDB4OUUsIDB4QkIsIDB4OUUsIDB4QkMsIC8qIDB4NDgtMHg0QiAqLworCTB4OUUsIDB4QkQsIDB4OUUsIDB4QkUsIDB4OUUsIDB4QkYsIDB4OUUsIDB4QzAsIC8qIDB4NEMtMHg0RiAqLworCTB4QkYsIDB4RDEsIDB4QkYsIDB4RDIsIDB4OUUsIDB4QzEsIDB4QkYsIDB4RDMsIC8qIDB4NTAtMHg1MyAqLworCTB4QkYsIDB4RDQsIDB4QkYsIDB4RDUsIDB4OUUsIDB4QzIsIDB4OUUsIDB4QzMsIC8qIDB4NTQtMHg1NyAqLworCTB4OUUsIDB4QzQsIDB4OUUsIDB4QzUsIDB4OUUsIDB4QzYsIDB4OUUsIDB4QzcsIC8qIDB4NTgtMHg1QiAqLworCTB4QkYsIDB4RDYsIDB4QkYsIDB4RDcsIDB4OUUsIDB4QzgsIDB4OUUsIDB4QzksIC8qIDB4NUMtMHg1RiAqLworCTB4QkYsIDB4RDgsIDB4OUUsIDB4Q0EsIDB4OUUsIDB4Q0IsIDB4OUUsIDB4Q0MsIC8qIDB4NjAtMHg2MyAqLworCTB4OUUsIDB4Q0QsIDB4OUUsIDB4Q0UsIDB4OUUsIDB4Q0YsIDB4OUUsIDB4RDAsIC8qIDB4NjQtMHg2NyAqLworCTB4OUUsIDB4RDEsIDB4OUUsIDB4RDIsIDB4OUUsIDB4RDMsIDB4OUUsIDB4RDQsIC8qIDB4NjgtMHg2QiAqLworCTB4QkYsIDB4RDksIDB4OUUsIDB4RDUsIDB4OUUsIDB4RDYsIDB4QkYsIDB4REEsIC8qIDB4NkMtMHg2RiAqLworCTB4OUUsIDB4RDcsIDB4QkYsIDB4REIsIDB4OUUsIDB4RDgsIDB4OUUsIDB4RDksIC8qIDB4NzAtMHg3MyAqLworCTB4OUUsIDB4REEsIDB4OUUsIDB4REIsIDB4OUUsIDB4REMsIDB4OUUsIDB4REQsIC8qIDB4NzQtMHg3NyAqLworCTB4QkYsIDB4REMsIDB4QkYsIDB4REQsIDB4OUUsIDB4REUsIDB4OUUsIDB4REYsIC8qIDB4NzgtMHg3QiAqLworCTB4QkYsIDB4REUsIDB4OUUsIDB4RTAsIDB4OUUsIDB4RTEsIDB4OUUsIDB4RTIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QkYsIDB4REYsIDB4OUUsIDB4RTMsIDB4OUUsIDB4RTQsIDB4OUUsIDB4RTUsIC8qIDB4ODAtMHg4MyAqLworCTB4OUUsIDB4RTYsIDB4OUUsIDB4RTcsIDB4OUUsIDB4RTgsIDB4OUUsIDB4RTksIC8qIDB4ODQtMHg4NyAqLworCTB4QkYsIDB4RTAsIDB4QkYsIDB4RTEsIDB4OUUsIDB4RUEsIDB4QkYsIDB4RTIsIC8qIDB4ODgtMHg4QiAqLworCTB4OUUsIDB4RUIsIDB4QkYsIDB4RTMsIDB4OUUsIDB4RUMsIDB4OUUsIDB4RUQsIC8qIDB4OEMtMHg4RiAqLworCTB4OUUsIDB4RUUsIDB4OUUsIDB4RUYsIDB4OUUsIDB4RjAsIDB4OUUsIDB4RjEsIC8qIDB4OTAtMHg5MyAqLworCTB4QkYsIDB4RTQsIDB4QkYsIDB4RTUsIDB4OUUsIDB4RjIsIDB4OUUsIDB4RjMsIC8qIDB4OTQtMHg5NyAqLworCTB4QkYsIDB4RTYsIDB4OUUsIDB4RjQsIDB4OUUsIDB4RjUsIDB4OUUsIDB4RjYsIC8qIDB4OTgtMHg5QiAqLworCTB4QkYsIDB4RTcsIDB4OUUsIDB4RjcsIDB4OUUsIDB4RjgsIDB4OUUsIDB4RjksIC8qIDB4OUMtMHg5RiAqLworCTB4OUUsIDB4RkEsIDB4OUUsIDB4RkIsIDB4OUUsIDB4RkMsIDB4OUUsIDB4RkQsIC8qIDB4QTAtMHhBMyAqLworCTB4QkYsIDB4RTgsIDB4QkYsIDB4RTksIDB4OUUsIDB4RkUsIDB4QkYsIDB4RUEsIC8qIDB4QTQtMHhBNyAqLworCTB4OUYsIDB4NDEsIDB4QkYsIDB4RUIsIDB4OUYsIDB4NDIsIDB4OUYsIDB4NDMsIC8qIDB4QTgtMHhBQiAqLworCTB4OUYsIDB4NDQsIDB4OUYsIDB4NDUsIDB4OUYsIDB4NDYsIDB4OUYsIDB4NDcsIC8qIDB4QUMtMHhBRiAqLworCTB4QkYsIDB4RUMsIDB4QkYsIDB4RUQsIDB4OUYsIDB4NDgsIDB4OUYsIDB4NDksIC8qIDB4QjAtMHhCMyAqLworCTB4QkYsIDB4RUUsIDB4OUYsIDB4NEEsIDB4OUYsIDB4NEIsIDB4OUYsIDB4NEMsIC8qIDB4QjQtMHhCNyAqLworCTB4QkYsIDB4RUYsIDB4QkYsIDB4RjAsIDB4QkYsIDB4RjEsIDB4OUYsIDB4NEQsIC8qIDB4QjgtMHhCQiAqLworCTB4OUYsIDB4NEUsIDB4OUYsIDB4NEYsIDB4OUYsIDB4NTAsIDB4OUYsIDB4NTEsIC8qIDB4QkMtMHhCRiAqLworCTB4QkYsIDB4RjIsIDB4QkYsIDB4RjMsIDB4OUYsIDB4NTIsIDB4QkYsIDB4RjQsIC8qIDB4QzAtMHhDMyAqLworCTB4OUYsIDB4NTMsIDB4QkYsIDB4RjUsIDB4OUYsIDB4NTQsIDB4OUYsIDB4NTUsIC8qIDB4QzQtMHhDNyAqLworCTB4OUYsIDB4NTYsIDB4OUYsIDB4NTcsIDB4OUYsIDB4NTgsIDB4OUYsIDB4NTksIC8qIDB4QzgtMHhDQiAqLworCTB4QkYsIDB4RjYsIDB4QkYsIDB4RjcsIDB4OUYsIDB4NUEsIDB4OUYsIDB4NjEsIC8qIDB4Q0MtMHhDRiAqLworCTB4QkYsIDB4RjgsIDB4OUYsIDB4NjIsIDB4OUYsIDB4NjMsIDB4OUYsIDB4NjQsIC8qIDB4RDAtMHhEMyAqLworCTB4QkYsIDB4RjksIDB4OUYsIDB4NjUsIDB4OUYsIDB4NjYsIDB4OUYsIDB4NjcsIC8qIDB4RDQtMHhENyAqLworCTB4OUYsIDB4NjgsIDB4OUYsIDB4NjksIDB4OUYsIDB4NkEsIDB4OUYsIDB4NkIsIC8qIDB4RDgtMHhEQiAqLworCTB4QkYsIDB4RkEsIDB4QkYsIDB4RkIsIDB4OUYsIDB4NkMsIDB4OUYsIDB4NkQsIC8qIDB4REMtMHhERiAqLworCTB4QkYsIDB4RkMsIDB4QkYsIDB4RkQsIDB4OUYsIDB4NkUsIDB4OUYsIDB4NkYsIC8qIDB4RTAtMHhFMyAqLworCTB4OUYsIDB4NzAsIDB4OUYsIDB4NzEsIDB4OUYsIDB4NzIsIDB4OUYsIDB4NzMsIC8qIDB4RTQtMHhFNyAqLworCTB4QkYsIDB4RkUsIDB4QzAsIDB4QTEsIDB4OUYsIDB4NzQsIDB4OUYsIDB4NzUsIC8qIDB4RTgtMHhFQiAqLworCTB4QzAsIDB4QTIsIDB4OUYsIDB4NzYsIDB4OUYsIDB4NzcsIDB4OUYsIDB4NzgsIC8qIDB4RUMtMHhFRiAqLworCTB4QzAsIDB4QTMsIDB4OUYsIDB4NzksIDB4OUYsIDB4N0EsIDB4OUYsIDB4ODEsIC8qIDB4RjAtMHhGMyAqLworCTB4OUYsIDB4ODIsIDB4OUYsIDB4ODMsIDB4OUYsIDB4ODQsIDB4OUYsIDB4ODUsIC8qIDB4RjQtMHhGNyAqLworCTB4QzAsIDB4QTQsIDB4QzAsIDB4QTUsIDB4OUYsIDB4ODYsIDB4OUYsIDB4ODcsIC8qIDB4RjgtMHhGQiAqLworCTB4OUYsIDB4ODgsIDB4QzAsIDB4QTYsIDB4OUYsIDB4ODksIDB4OUYsIDB4OEEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0M3WzUxMl0gPSB7CisJMHg5RiwgMHg4QiwgMHg5RiwgMHg4QywgMHg5RiwgMHg4RCwgMHg5RiwgMHg4RSwgLyogMHgwMC0weDAzICovCisJMHhDMCwgMHhBNywgMHhDMCwgMHhBOCwgMHg5RiwgMHg4RiwgMHg5RiwgMHg5MCwgLyogMHgwNC0weDA3ICovCisJMHhDMCwgMHhBOSwgMHg5RiwgMHg5MSwgMHg5RiwgMHg5MiwgMHg5RiwgMHg5MywgLyogMHgwOC0weDBCICovCisJMHhDMCwgMHhBQSwgMHg5RiwgMHg5NCwgMHg5RiwgMHg5NSwgMHg5RiwgMHg5NiwgLyogMHgwQy0weDBGICovCisJMHg5RiwgMHg5NywgMHg5RiwgMHg5OCwgMHg5RiwgMHg5OSwgMHg5RiwgMHg5QSwgLyogMHgxMC0weDEzICovCisJMHhDMCwgMHhBQiwgMHhDMCwgMHhBQywgMHg5RiwgMHg5QiwgMHhDMCwgMHhBRCwgLyogMHgxNC0weDE3ICovCisJMHg5RiwgMHg5QywgMHhDMCwgMHhBRSwgMHg5RiwgMHg5RCwgMHg5RiwgMHg5RSwgLyogMHgxOC0weDFCICovCisJMHg5RiwgMHg5RiwgMHg5RiwgMHhBMCwgMHg5RiwgMHhBMSwgMHg5RiwgMHhBMiwgLyogMHgxQy0weDFGICovCisJMHhDMCwgMHhBRiwgMHhDMCwgMHhCMCwgMHg5RiwgMHhBMywgMHg5RiwgMHhBNCwgLyogMHgyMC0weDIzICovCisJMHhDMCwgMHhCMSwgMHg5RiwgMHhBNSwgMHg5RiwgMHhBNiwgMHg5RiwgMHhBNywgLyogMHgyNC0weDI3ICovCisJMHhDMCwgMHhCMiwgMHg5RiwgMHhBOCwgMHg5RiwgMHhBOSwgMHg5RiwgMHhBQSwgLyogMHgyOC0weDJCICovCisJMHg5RiwgMHhBQiwgMHg5RiwgMHhBQywgMHg5RiwgMHhBRCwgMHg5RiwgMHhBRSwgLyogMHgyQy0weDJGICovCisJMHhDMCwgMHhCMywgMHhDMCwgMHhCNCwgMHg5RiwgMHhBRiwgMHhDMCwgMHhCNSwgLyogMHgzMC0weDMzICovCisJMHg5RiwgMHhCMCwgMHhDMCwgMHhCNiwgMHg5RiwgMHhCMSwgMHhDMCwgMHhCNywgLyogMHgzNC0weDM3ICovCisJMHg5RiwgMHhCMiwgMHg5RiwgMHhCMywgMHg5RiwgMHhCNCwgMHg5RiwgMHhCNSwgLyogMHgzOC0weDNCICovCisJMHhDMCwgMHhCOCwgMHhDMCwgMHhCOSwgMHg5RiwgMHhCNiwgMHg5RiwgMHhCNywgLyogMHgzQy0weDNGICovCisJMHhDMCwgMHhCQSwgMHg5RiwgMHhCOCwgMHg5RiwgMHhCOSwgMHg5RiwgMHhCQSwgLyogMHg0MC0weDQzICovCisJMHhDMCwgMHhCQiwgMHg5RiwgMHhCQiwgMHg5RiwgMHhCQywgMHg5RiwgMHhCRCwgLyogMHg0NC0weDQ3ICovCisJMHg5RiwgMHhCRSwgMHg5RiwgMHhCRiwgMHhDMCwgMHhCQywgMHg5RiwgMHhDMCwgLyogMHg0OC0weDRCICovCisJMHhDMCwgMHhCRCwgMHhDMCwgMHhCRSwgMHg5RiwgMHhDMSwgMHhDMCwgMHhCRiwgLyogMHg0Qy0weDRGICovCisJMHg5RiwgMHhDMiwgMHhDMCwgMHhDMCwgMHhDMCwgMHhDMSwgMHhDMCwgMHhDMiwgLyogMHg1MC0weDUzICovCisJMHhDMCwgMHhDMywgMHhDMCwgMHhDNCwgMHhDMCwgMHhDNSwgMHhDMCwgMHhDNiwgLyogMHg1NC0weDU3ICovCisJMHhDMCwgMHhDNywgMHg5RiwgMHhDMywgMHg5RiwgMHhDNCwgMHg5RiwgMHhDNSwgLyogMHg1OC0weDVCICovCisJMHhDMCwgMHhDOCwgMHg5RiwgMHhDNiwgMHg5RiwgMHhDNywgMHg5RiwgMHhDOCwgLyogMHg1Qy0weDVGICovCisJMHhDMCwgMHhDOSwgMHg5RiwgMHhDOSwgMHg5RiwgMHhDQSwgMHg5RiwgMHhDQiwgLyogMHg2MC0weDYzICovCisJMHg5RiwgMHhDQywgMHg5RiwgMHhDRCwgMHg5RiwgMHhDRSwgMHg5RiwgMHhDRiwgLyogMHg2NC0weDY3ICovCisJMHhDMCwgMHhDQSwgMHg5RiwgMHhEMCwgMHg5RiwgMHhEMSwgMHhDMCwgMHhDQiwgLyogMHg2OC0weDZCICovCisJMHg5RiwgMHhEMiwgMHg5RiwgMHhEMywgMHg5RiwgMHhENCwgMHg5RiwgMHhENSwgLyogMHg2Qy0weDZGICovCisJMHg5RiwgMHhENiwgMHg5RiwgMHhENywgMHg5RiwgMHhEOCwgMHg5RiwgMHhEOSwgLyogMHg3MC0weDczICovCisJMHhDMCwgMHhDQywgMHhDMCwgMHhDRCwgMHg5RiwgMHhEQSwgMHg5RiwgMHhEQiwgLyogMHg3NC0weDc3ICovCisJMHhDMCwgMHhDRSwgMHg5RiwgMHhEQywgMHg5RiwgMHhERCwgMHg5RiwgMHhERSwgLyogMHg3OC0weDdCICovCisJMHhDMCwgMHhDRiwgMHhDMCwgMHhEMCwgMHhDMCwgMHhEMSwgMHg5RiwgMHhERiwgLyogMHg3Qy0weDdGICovCisJCisJMHg5RiwgMHhFMCwgMHg5RiwgMHhFMSwgMHg5RiwgMHhFMiwgMHhDMCwgMHhEMiwgLyogMHg4MC0weDgzICovCisJMHhDMCwgMHhEMywgMHhDMCwgMHhENCwgMHg5RiwgMHhFMywgMHhDMCwgMHhENSwgLyogMHg4NC0weDg3ICovCisJMHhDMCwgMHhENiwgMHhDMCwgMHhENywgMHhDMCwgMHhEOCwgMHg5RiwgMHhFNCwgLyogMHg4OC0weDhCICovCisJMHg5RiwgMHhFNSwgMHg5RiwgMHhFNiwgMHhDMCwgMHhEOSwgMHg5RiwgMHhFNywgLyogMHg4Qy0weDhGICovCisJMHhDMCwgMHhEQSwgMHhDMCwgMHhEQiwgMHg5RiwgMHhFOCwgMHg5RiwgMHhFOSwgLyogMHg5MC0weDkzICovCisJMHhDMCwgMHhEQywgMHg5RiwgMHhFQSwgMHhDMCwgMHhERCwgMHhDMCwgMHhERSwgLyogMHg5NC0weDk3ICovCisJMHhDMCwgMHhERiwgMHg5RiwgMHhFQiwgMHhDMCwgMHhFMCwgMHg5RiwgMHhFQywgLyogMHg5OC0weDlCICovCisJMHg5RiwgMHhFRCwgMHg5RiwgMHhFRSwgMHg5RiwgMHhFRiwgMHg5RiwgMHhGMCwgLyogMHg5Qy0weDlGICovCisJMHhDMCwgMHhFMSwgMHhDMCwgMHhFMiwgMHg5RiwgMHhGMSwgMHhDMCwgMHhFMywgLyogMHhBMC0weEEzICovCisJMHhDMCwgMHhFNCwgMHhDMCwgMHhFNSwgMHhDMCwgMHhFNiwgMHg5RiwgMHhGMiwgLyogMHhBNC0weEE3ICovCisJMHg5RiwgMHhGMywgMHg5RiwgMHhGNCwgMHg5RiwgMHhGNSwgMHg5RiwgMHhGNiwgLyogMHhBOC0weEFCICovCisJMHhDMCwgMHhFNywgMHhDMCwgMHhFOCwgMHg5RiwgMHhGNywgMHg5RiwgMHhGOCwgLyogMHhBQy0weEFGICovCisJMHhDMCwgMHhFOSwgMHg5RiwgMHhGOSwgMHg5RiwgMHhGQSwgMHg5RiwgMHhGQiwgLyogMHhCMC0weEIzICovCisJMHhDMCwgMHhFQSwgMHg5RiwgMHhGQywgMHg5RiwgMHhGRCwgMHg5RiwgMHhGRSwgLyogMHhCNC0weEI3ICovCisJMHhBMCwgMHg0MSwgMHhBMCwgMHg0MiwgMHhBMCwgMHg0MywgMHhBMCwgMHg0NCwgLyogMHhCOC0weEJCICovCisJMHhDMCwgMHhFQiwgMHhDMCwgMHhFQywgMHhBMCwgMHg0NSwgMHhDMCwgMHhFRCwgLyogMHhCQy0weEJGICovCisJMHhDMCwgMHhFRSwgMHhDMCwgMHhFRiwgMHhBMCwgMHg0NiwgMHhBMCwgMHg0NywgLyogMHhDMC0weEMzICovCisJMHhBMCwgMHg0OCwgMHhBMCwgMHg0OSwgMHhBMCwgMHg0QSwgMHhBMCwgMHg0QiwgLyogMHhDNC0weEM3ICovCisJMHhDMCwgMHhGMCwgMHhDMCwgMHhGMSwgMHhBMCwgMHg0QywgMHhBMCwgMHg0RCwgLyogMHhDOC0weENCICovCisJMHhDMCwgMHhGMiwgMHhBMCwgMHg0RSwgMHhDMCwgMHhGMywgMHhBMCwgMHg0RiwgLyogMHhDQy0weENGICovCisJMHhDMCwgMHhGNCwgMHhBMCwgMHg1MCwgMHhBMCwgMHg1MSwgMHhBMCwgMHg1MiwgLyogMHhEMC0weEQzICovCisJMHhBMCwgMHg1MywgMHhBMCwgMHg1NCwgMHhBMCwgMHg1NSwgMHhBMCwgMHg1NiwgLyogMHhENC0weEQ3ICovCisJMHhDMCwgMHhGNSwgMHhBMCwgMHg1NywgMHhBMCwgMHg1OCwgMHhBMCwgMHg1OSwgLyogMHhEOC0weERCICovCisJMHhBMCwgMHg1QSwgMHhDMCwgMHhGNiwgMHhBMCwgMHg2MSwgMHhBMCwgMHg2MiwgLyogMHhEQy0weERGICovCisJMHhBMCwgMHg2MywgMHhBMCwgMHg2NCwgMHhBMCwgMHg2NSwgMHhBMCwgMHg2NiwgLyogMHhFMC0weEUzICovCisJMHhDMCwgMHhGNywgMHhBMCwgMHg2NywgMHhBMCwgMHg2OCwgMHhBMCwgMHg2OSwgLyogMHhFNC0weEU3ICovCisJMHhDMCwgMHhGOCwgMHhBMCwgMHg2QSwgMHhBMCwgMHg2QiwgMHhBMCwgMHg2QywgLyogMHhFOC0weEVCICovCisJMHhDMCwgMHhGOSwgMHhBMCwgMHg2RCwgMHhBMCwgMHg2RSwgMHhBMCwgMHg2RiwgLyogMHhFQy0weEVGICovCisJMHhBMCwgMHg3MCwgMHhBMCwgMHg3MSwgMHhBMCwgMHg3MiwgMHhBMCwgMHg3MywgLyogMHhGMC0weEYzICovCisJMHhBMCwgMHg3NCwgMHhBMCwgMHg3NSwgMHhBMCwgMHg3NiwgMHhBMCwgMHg3NywgLyogMHhGNC0weEY3ICovCisJMHhBMCwgMHg3OCwgMHhBMCwgMHg3OSwgMHhBMCwgMHg3QSwgMHhBMCwgMHg4MSwgLyogMHhGOC0weEZCICovCisJMHhBMCwgMHg4MiwgMHhBMCwgMHg4MywgMHhBMCwgMHg4NCwgMHhBMCwgMHg4NSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQzhbNTEyXSA9IHsKKwkweEMwLCAweEZBLCAweEMwLCAweEZCLCAweEEwLCAweDg2LCAweEEwLCAweDg3LCAvKiAweDAwLTB4MDMgKi8KKwkweEMwLCAweEZDLCAweEEwLCAweDg4LCAweEEwLCAweDg5LCAweEEwLCAweDhBLCAvKiAweDA0LTB4MDcgKi8KKwkweEMwLCAweEZELCAweEEwLCAweDhCLCAweEMwLCAweEZFLCAweEEwLCAweDhDLCAvKiAweDA4LTB4MEIgKi8KKwkweEEwLCAweDhELCAweEEwLCAweDhFLCAweEEwLCAweDhGLCAweEEwLCAweDkwLCAvKiAweDBDLTB4MEYgKi8KKwkweEMxLCAweEExLCAweEMxLCAweEEyLCAweEEwLCAweDkxLCAweEMxLCAweEEzLCAvKiAweDEwLTB4MTMgKi8KKwkweEEwLCAweDkyLCAweEMxLCAweEE0LCAweEMxLCAweEE1LCAweEEwLCAweDkzLCAvKiAweDE0LTB4MTcgKi8KKwkweEEwLCAweDk0LCAweEEwLCAweDk1LCAweEEwLCAweDk2LCAweEEwLCAweDk3LCAvKiAweDE4LTB4MUIgKi8KKwkweEMxLCAweEE2LCAweEMxLCAweEE3LCAweEEwLCAweDk4LCAweEEwLCAweDk5LCAvKiAweDFDLTB4MUYgKi8KKwkweEMxLCAweEE4LCAweEEwLCAweDlBLCAweEEwLCAweDlCLCAweEEwLCAweDlDLCAvKiAweDIwLTB4MjMgKi8KKwkweEMxLCAweEE5LCAweEEwLCAweDlELCAweEEwLCAweDlFLCAweEEwLCAweDlGLCAvKiAweDI0LTB4MjcgKi8KKwkweEEwLCAweEEwLCAweEEwLCAweEExLCAweEEwLCAweEEyLCAweEEwLCAweEEzLCAvKiAweDI4LTB4MkIgKi8KKwkweEMxLCAweEFBLCAweEMxLCAweEFCLCAweEEwLCAweEE0LCAweEMxLCAweEFDLCAvKiAweDJDLTB4MkYgKi8KKwkweEEwLCAweEE1LCAweEMxLCAweEFELCAweEEwLCAweEE2LCAweEEwLCAweEE3LCAvKiAweDMwLTB4MzMgKi8KKwkweEEwLCAweEE4LCAweEEwLCAweEE5LCAweEEwLCAweEFBLCAweEEwLCAweEFCLCAvKiAweDM0LTB4MzcgKi8KKwkweEMxLCAweEFFLCAweEEwLCAweEFDLCAweEEwLCAweEFELCAweEEwLCAweEFFLCAvKiAweDM4LTB4M0IgKi8KKwkweEMxLCAweEFGLCAweEEwLCAweEFGLCAweEEwLCAweEIwLCAweEEwLCAweEIxLCAvKiAweDNDLTB4M0YgKi8KKwkweEMxLCAweEIwLCAweEEwLCAweEIyLCAweEEwLCAweEIzLCAweEEwLCAweEI0LCAvKiAweDQwLTB4NDMgKi8KKwkweEEwLCAweEI1LCAweEEwLCAweEI2LCAweEEwLCAweEI3LCAweEEwLCAweEI4LCAvKiAweDQ0LTB4NDcgKi8KKwkweEMxLCAweEIxLCAweEMxLCAweEIyLCAweEEwLCAweEI5LCAweEEwLCAweEJBLCAvKiAweDQ4LTB4NEIgKi8KKwkweEMxLCAweEIzLCAweEMxLCAweEI0LCAweEEwLCAweEJCLCAweEEwLCAweEJDLCAvKiAweDRDLTB4NEYgKi8KKwkweEEwLCAweEJELCAweEEwLCAweEJFLCAweEEwLCAweEJGLCAweEEwLCAweEMwLCAvKiAweDUwLTB4NTMgKi8KKwkweEMxLCAweEI1LCAweEEwLCAweEMxLCAweEEwLCAweEMyLCAweEEwLCAweEMzLCAvKiAweDU0LTB4NTcgKi8KKwkweEEwLCAweEM0LCAweEEwLCAweEM1LCAweEEwLCAweEM2LCAweEEwLCAweEM3LCAvKiAweDU4LTB4NUIgKi8KKwkweEEwLCAweEM4LCAweEEwLCAweEM5LCAweEEwLCAweENBLCAweEEwLCAweENCLCAvKiAweDVDLTB4NUYgKi8KKwkweEEwLCAweENDLCAweEEwLCAweENELCAweEEwLCAweENFLCAweEEwLCAweENGLCAvKiAweDYwLTB4NjMgKi8KKwkweEEwLCAweEQwLCAweEEwLCAweEQxLCAweEEwLCAweEQyLCAweEEwLCAweEQzLCAvKiAweDY0LTB4NjcgKi8KKwkweEEwLCAweEQ0LCAweEEwLCAweEQ1LCAweEEwLCAweEQ2LCAweEEwLCAweEQ3LCAvKiAweDY4LTB4NkIgKi8KKwkweEEwLCAweEQ4LCAweEEwLCAweEQ5LCAweEEwLCAweERBLCAweEEwLCAweERCLCAvKiAweDZDLTB4NkYgKi8KKwkweEMxLCAweEI2LCAweEMxLCAweEI3LCAweEEwLCAweERDLCAweEEwLCAweERELCAvKiAweDcwLTB4NzMgKi8KKwkweEMxLCAweEI4LCAweEEwLCAweERFLCAweEEwLCAweERGLCAweEEwLCAweEUwLCAvKiAweDc0LTB4NzcgKi8KKwkweEMxLCAweEI5LCAweEEwLCAweEUxLCAweEMxLCAweEJBLCAweEEwLCAweEUyLCAvKiAweDc4LTB4N0IgKi8KKwkweEEwLCAweEUzLCAweEEwLCAweEU0LCAweEEwLCAweEU1LCAweEEwLCAweEU2LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEMxLCAweEJCLCAweEMxLCAweEJDLCAweEEwLCAweEU3LCAweEMxLCAweEJELCAvKiAweDgwLTB4ODMgKi8KKwkweEEwLCAweEU4LCAweEMxLCAweEJFLCAweEMxLCAweEJGLCAweEMxLCAweEMwLCAvKiAweDg0LTB4ODcgKi8KKwkweEEwLCAweEU5LCAweEEwLCAweEVBLCAweEEwLCAweEVCLCAweEMxLCAweEMxLCAvKiAweDg4LTB4OEIgKi8KKwkweEMxLCAweEMyLCAweEMxLCAweEMzLCAweEEwLCAweEVDLCAweEEwLCAweEVELCAvKiAweDhDLTB4OEYgKi8KKwkweEEwLCAweEVFLCAweEEwLCAweEVGLCAweEEwLCAweEYwLCAweEEwLCAweEYxLCAvKiAweDkwLTB4OTMgKi8KKwkweEMxLCAweEM0LCAweEEwLCAweEYyLCAweEEwLCAweEYzLCAweEEwLCAweEY0LCAvKiAweDk0LTB4OTcgKi8KKwkweEEwLCAweEY1LCAweEEwLCAweEY2LCAweEEwLCAweEY3LCAweEEwLCAweEY4LCAvKiAweDk4LTB4OUIgKi8KKwkweEEwLCAweEY5LCAweEMxLCAweEM1LCAweEEwLCAweEZBLCAweEMxLCAweEM2LCAvKiAweDlDLTB4OUYgKi8KKwkweEEwLCAweEZCLCAweEMxLCAweEM3LCAweEEwLCAweEZDLCAweEEwLCAweEZELCAvKiAweEEwLTB4QTMgKi8KKwkweEEwLCAweEZFLCAweEExLCAweDQxLCAweEExLCAweDQyLCAweEExLCAweDQzLCAvKiAweEE0LTB4QTcgKi8KKwkweEMxLCAweEM4LCAweEExLCAweDQ0LCAweEExLCAweDQ1LCAweEExLCAweDQ2LCAvKiAweEE4LTB4QUIgKi8KKwkweEExLCAweDQ3LCAweEExLCAweDQ4LCAweEExLCAweDQ5LCAweEExLCAweDRBLCAvKiAweEFDLTB4QUYgKi8KKwkweEExLCAweDRCLCAweEExLCAweDRDLCAweEExLCAweDRELCAweEExLCAweDRFLCAvKiAweEIwLTB4QjMgKi8KKwkweEExLCAweDRGLCAweEExLCAweDUwLCAweEExLCAweDUxLCAweEExLCAweDUyLCAvKiAweEI0LTB4QjcgKi8KKwkweEExLCAweDUzLCAweEExLCAweDU0LCAweEExLCAweDU1LCAweEExLCAweDU2LCAvKiAweEI4LTB4QkIgKi8KKwkweEMxLCAweEM5LCAweEMxLCAweENBLCAweEExLCAweDU3LCAweEExLCAweDU4LCAvKiAweEJDLTB4QkYgKi8KKwkweEExLCAweDU5LCAweEExLCAweDVBLCAweEExLCAweDYxLCAweEExLCAweDYyLCAvKiAweEMwLTB4QzMgKi8KKwkweEMxLCAweENCLCAweEExLCAweDYzLCAweEExLCAweDY0LCAweEExLCAweDY1LCAvKiAweEM0LTB4QzcgKi8KKwkweEMxLCAweENDLCAweEExLCAweDY2LCAweEExLCAweDY3LCAweEExLCAweDY4LCAvKiAweEM4LTB4Q0IgKi8KKwkweEMxLCAweENELCAweEExLCAweDY5LCAweEExLCAweDZBLCAweEExLCAweDZCLCAvKiAweENDLTB4Q0YgKi8KKwkweEExLCAweDZDLCAweEExLCAweDZELCAweEExLCAweDZFLCAweEExLCAweDZGLCAvKiAweEQwLTB4RDMgKi8KKwkweEMxLCAweENFLCAweEMxLCAweENGLCAweEExLCAweDcwLCAweEMxLCAweEQwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEExLCAweDcxLCAweEMxLCAweEQxLCAweEExLCAweDcyLCAweEExLCAweDczLCAvKiAweEQ4LTB4REIgKi8KKwkweEExLCAweDc0LCAweEExLCAweDc1LCAweEExLCAweDc2LCAweEExLCAweDc3LCAvKiAweERDLTB4REYgKi8KKwkweEMxLCAweEQyLCAweEMxLCAweEQzLCAweEExLCAweDc4LCAweEExLCAweDc5LCAvKiAweEUwLTB4RTMgKi8KKwkweEMxLCAweEQ0LCAweEExLCAweDdBLCAweEExLCAweDgxLCAweEExLCAweDgyLCAvKiAweEU0LTB4RTcgKi8KKwkweEExLCAweDgzLCAweEExLCAweDg0LCAweEExLCAweDg1LCAweEExLCAweDg2LCAvKiAweEU4LTB4RUIgKi8KKwkweEExLCAweDg3LCAweEExLCAweDg4LCAweEExLCAweDg5LCAweEExLCAweDhBLCAvKiAweEVDLTB4RUYgKi8KKwkweEExLCAweDhCLCAweEExLCAweDhDLCAweEExLCAweDhELCAweEExLCAweDhFLCAvKiAweEYwLTB4RjMgKi8KKwkweEExLCAweDhGLCAweEMxLCAweEQ1LCAweEExLCAweDkwLCAweEExLCAweDkxLCAvKiAweEY0LTB4RjcgKi8KKwkweEExLCAweDkyLCAweEExLCAweDkzLCAweEExLCAweDk0LCAweEExLCAweDk1LCAvKiAweEY4LTB4RkIgKi8KKwkweEMxLCAweEQ2LCAweEMxLCAweEQ3LCAweEExLCAweDk2LCAweEExLCAweDk3LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19DOVs1MTJdID0geworCTB4QzEsIDB4RDgsIDB4QTEsIDB4OTgsIDB4QTEsIDB4OTksIDB4QTEsIDB4OUEsIC8qIDB4MDAtMHgwMyAqLworCTB4QzEsIDB4RDksIDB4QzEsIDB4REEsIDB4QzEsIDB4REIsIDB4QTEsIDB4OUIsIC8qIDB4MDQtMHgwNyAqLworCTB4QTEsIDB4OUMsIDB4QTEsIDB4OUQsIDB4QTEsIDB4OUUsIDB4QTEsIDB4OUYsIC8qIDB4MDgtMHgwQiAqLworCTB4QzEsIDB4REMsIDB4QzEsIDB4REQsIDB4QTEsIDB4QTAsIDB4QzEsIDB4REUsIC8qIDB4MEMtMHgwRiAqLworCTB4QTIsIDB4NDEsIDB4QzEsIDB4REYsIDB4QTIsIDB4NDIsIDB4QTIsIDB4NDMsIC8qIDB4MTAtMHgxMyAqLworCTB4QTIsIDB4NDQsIDB4QTIsIDB4NDUsIDB4QTIsIDB4NDYsIDB4QTIsIDB4NDcsIC8qIDB4MTQtMHgxNyAqLworCTB4QzEsIDB4RTAsIDB4QTIsIDB4NDgsIDB4QTIsIDB4NDksIDB4QTIsIDB4NEEsIC8qIDB4MTgtMHgxQiAqLworCTB4QTIsIDB4NEIsIDB4QTIsIDB4NEMsIDB4QTIsIDB4NEQsIDB4QTIsIDB4NEUsIC8qIDB4MUMtMHgxRiAqLworCTB4QTIsIDB4NEYsIDB4QTIsIDB4NTAsIDB4QTIsIDB4NTEsIDB4QTIsIDB4NTIsIC8qIDB4MjAtMHgyMyAqLworCTB4QTIsIDB4NTMsIDB4QTIsIDB4NTQsIDB4QTIsIDB4NTUsIDB4QTIsIDB4NTYsIC8qIDB4MjQtMHgyNyAqLworCTB4QTIsIDB4NTcsIDB4QTIsIDB4NTgsIDB4QTIsIDB4NTksIDB4QTIsIDB4NUEsIC8qIDB4MjgtMHgyQiAqLworCTB4QzEsIDB4RTEsIDB4QTIsIDB4NjEsIDB4QTIsIDB4NjIsIDB4QTIsIDB4NjMsIC8qIDB4MkMtMHgyRiAqLworCTB4QTIsIDB4NjQsIDB4QTIsIDB4NjUsIDB4QTIsIDB4NjYsIDB4QTIsIDB4NjcsIC8qIDB4MzAtMHgzMyAqLworCTB4QzEsIDB4RTIsIDB4QTIsIDB4NjgsIDB4QTIsIDB4NjksIDB4QTIsIDB4NkEsIC8qIDB4MzQtMHgzNyAqLworCTB4QTIsIDB4NkIsIDB4QTIsIDB4NkMsIDB4QTIsIDB4NkQsIDB4QTIsIDB4NkUsIC8qIDB4MzgtMHgzQiAqLworCTB4QTIsIDB4NkYsIDB4QTIsIDB4NzAsIDB4QTIsIDB4NzEsIDB4QTIsIDB4NzIsIC8qIDB4M0MtMHgzRiAqLworCTB4QTIsIDB4NzMsIDB4QTIsIDB4NzQsIDB4QTIsIDB4NzUsIDB4QTIsIDB4NzYsIC8qIDB4NDAtMHg0MyAqLworCTB4QTIsIDB4NzcsIDB4QTIsIDB4NzgsIDB4QTIsIDB4NzksIDB4QTIsIDB4N0EsIC8qIDB4NDQtMHg0NyAqLworCTB4QTIsIDB4ODEsIDB4QTIsIDB4ODIsIDB4QTIsIDB4ODMsIDB4QTIsIDB4ODQsIC8qIDB4NDgtMHg0QiAqLworCTB4QTIsIDB4ODUsIDB4QTIsIDB4ODYsIDB4QTIsIDB4ODcsIDB4QTIsIDB4ODgsIC8qIDB4NEMtMHg0RiAqLworCTB4QzEsIDB4RTMsIDB4QzEsIDB4RTQsIDB4QTIsIDB4ODksIDB4QTIsIDB4OEEsIC8qIDB4NTAtMHg1MyAqLworCTB4QzEsIDB4RTUsIDB4QTIsIDB4OEIsIDB4QTIsIDB4OEMsIDB4QTIsIDB4OEQsIC8qIDB4NTQtMHg1NyAqLworCTB4QzEsIDB4RTYsIDB4QTIsIDB4OEUsIDB4QTIsIDB4OEYsIDB4QTIsIDB4OTAsIC8qIDB4NTgtMHg1QiAqLworCTB4QTIsIDB4OTEsIDB4QTIsIDB4OTIsIDB4QTIsIDB4OTMsIDB4QTIsIDB4OTQsIC8qIDB4NUMtMHg1RiAqLworCTB4QzEsIDB4RTcsIDB4QzEsIDB4RTgsIDB4QTIsIDB4OTUsIDB4QzEsIDB4RTksIC8qIDB4NjAtMHg2MyAqLworCTB4QTIsIDB4OTYsIDB4QTIsIDB4OTcsIDB4QTIsIDB4OTgsIDB4QTIsIDB4OTksIC8qIDB4NjQtMHg2NyAqLworCTB4QTIsIDB4OUEsIDB4QTIsIDB4OUIsIDB4QTIsIDB4OUMsIDB4QTIsIDB4OUQsIC8qIDB4NjgtMHg2QiAqLworCTB4QzEsIDB4RUEsIDB4QTIsIDB4OUUsIDB4QTIsIDB4OUYsIDB4QTIsIDB4QTAsIC8qIDB4NkMtMHg2RiAqLworCTB4QzEsIDB4RUIsIDB4QTMsIDB4NDEsIDB4QTMsIDB4NDIsIDB4QTMsIDB4NDMsIC8qIDB4NzAtMHg3MyAqLworCTB4QzEsIDB4RUMsIDB4QTMsIDB4NDQsIDB4QTMsIDB4NDUsIDB4QTMsIDB4NDYsIC8qIDB4NzQtMHg3NyAqLworCTB4QTMsIDB4NDcsIDB4QTMsIDB4NDgsIDB4QTMsIDB4NDksIDB4QTMsIDB4NEEsIC8qIDB4NzgtMHg3QiAqLworCTB4QzEsIDB4RUQsIDB4QTMsIDB4NEIsIDB4QTMsIDB4NEMsIDB4QTMsIDB4NEQsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QTMsIDB4NEUsIDB4QTMsIDB4NEYsIDB4QTMsIDB4NTAsIDB4QTMsIDB4NTEsIC8qIDB4ODAtMHg4MyAqLworCTB4QTMsIDB4NTIsIDB4QTMsIDB4NTMsIDB4QTMsIDB4NTQsIDB4QTMsIDB4NTUsIC8qIDB4ODQtMHg4NyAqLworCTB4QzEsIDB4RUUsIDB4QzEsIDB4RUYsIDB4QTMsIDB4NTYsIDB4QTMsIDB4NTcsIC8qIDB4ODgtMHg4QiAqLworCTB4QzEsIDB4RjAsIDB4QTMsIDB4NTgsIDB4QTMsIDB4NTksIDB4QTMsIDB4NUEsIC8qIDB4OEMtMHg4RiAqLworCTB4QzEsIDB4RjEsIDB4QTMsIDB4NjEsIDB4QTMsIDB4NjIsIDB4QTMsIDB4NjMsIC8qIDB4OTAtMHg5MyAqLworCTB4QTMsIDB4NjQsIDB4QTMsIDB4NjUsIDB4QTMsIDB4NjYsIDB4QTMsIDB4NjcsIC8qIDB4OTQtMHg5NyAqLworCTB4QzEsIDB4RjIsIDB4QzEsIDB4RjMsIDB4QTMsIDB4NjgsIDB4QzEsIDB4RjQsIC8qIDB4OTgtMHg5QiAqLworCTB4QTMsIDB4NjksIDB4QzEsIDB4RjUsIDB4QTMsIDB4NkEsIDB4QTMsIDB4NkIsIC8qIDB4OUMtMHg5RiAqLworCTB4QTMsIDB4NkMsIDB4QTMsIDB4NkQsIDB4QTMsIDB4NkUsIDB4QTMsIDB4NkYsIC8qIDB4QTAtMHhBMyAqLworCTB4QTMsIDB4NzAsIDB4QTMsIDB4NzEsIDB4QTMsIDB4NzIsIDB4QTMsIDB4NzMsIC8qIDB4QTQtMHhBNyAqLworCTB4QTMsIDB4NzQsIDB4QTMsIDB4NzUsIDB4QTMsIDB4NzYsIDB4QTMsIDB4NzcsIC8qIDB4QTgtMHhBQiAqLworCTB4QTMsIDB4NzgsIDB4QTMsIDB4NzksIDB4QTMsIDB4N0EsIDB4QTMsIDB4ODEsIC8qIDB4QUMtMHhBRiAqLworCTB4QTMsIDB4ODIsIDB4QTMsIDB4ODMsIDB4QTMsIDB4ODQsIDB4QTMsIDB4ODUsIC8qIDB4QjAtMHhCMyAqLworCTB4QTMsIDB4ODYsIDB4QTMsIDB4ODcsIDB4QTMsIDB4ODgsIDB4QTMsIDB4ODksIC8qIDB4QjQtMHhCNyAqLworCTB4QTMsIDB4OEEsIDB4QTMsIDB4OEIsIDB4QTMsIDB4OEMsIDB4QTMsIDB4OEQsIC8qIDB4QjgtMHhCQiAqLworCTB4QTMsIDB4OEUsIDB4QTMsIDB4OEYsIDB4QTMsIDB4OTAsIDB4QTMsIDB4OTEsIC8qIDB4QkMtMHhCRiAqLworCTB4QzEsIDB4RjYsIDB4QzEsIDB4RjcsIDB4QTMsIDB4OTIsIDB4QTMsIDB4OTMsIC8qIDB4QzAtMHhDMyAqLworCTB4QzEsIDB4RjgsIDB4QTMsIDB4OTQsIDB4QTMsIDB4OTUsIDB4QzEsIDB4RjksIC8qIDB4QzQtMHhDNyAqLworCTB4QzEsIDB4RkEsIDB4QTMsIDB4OTYsIDB4QzEsIDB4RkIsIDB4QTMsIDB4OTcsIC8qIDB4QzgtMHhDQiAqLworCTB4QTMsIDB4OTgsIDB4QTMsIDB4OTksIDB4QTMsIDB4OUEsIDB4QTMsIDB4OUIsIC8qIDB4Q0MtMHhDRiAqLworCTB4QzEsIDB4RkMsIDB4QzEsIDB4RkQsIDB4QTMsIDB4OUMsIDB4QzEsIDB4RkUsIC8qIDB4RDAtMHhEMyAqLworCTB4QTMsIDB4OUQsIDB4QzIsIDB4QTEsIDB4QzIsIDB4QTIsIDB4QTMsIDB4OUUsIC8qIDB4RDQtMHhENyAqLworCTB4QTMsIDB4OUYsIDB4QzIsIDB4QTMsIDB4QzIsIDB4QTQsIDB4QTMsIDB4QTAsIC8qIDB4RDgtMHhEQiAqLworCTB4QzIsIDB4QTUsIDB4QzIsIDB4QTYsIDB4QTQsIDB4NDEsIDB4QTQsIDB4NDIsIC8qIDB4REMtMHhERiAqLworCTB4QzIsIDB4QTcsIDB4QTQsIDB4NDMsIDB4QzIsIDB4QTgsIDB4QTQsIDB4NDQsIC8qIDB4RTAtMHhFMyAqLworCTB4QzIsIDB4QTksIDB4QTQsIDB4NDUsIDB4QTQsIDB4NDYsIDB4QzIsIDB4QUEsIC8qIDB4RTQtMHhFNyAqLworCTB4QTQsIDB4NDcsIDB4QTQsIDB4NDgsIDB4QTQsIDB4NDksIDB4QTQsIDB4NEEsIC8qIDB4RTgtMHhFQiAqLworCTB4QzIsIDB4QUIsIDB4QzIsIDB4QUMsIDB4QTQsIDB4NEIsIDB4QzIsIDB4QUQsIC8qIDB4RUMtMHhFRiAqLworCTB4QzIsIDB4QUUsIDB4QzIsIDB4QUYsIDB4QTQsIDB4NEMsIDB4QTQsIDB4NEQsIC8qIDB4RjAtMHhGMyAqLworCTB4QTQsIDB4NEUsIDB4QTQsIDB4NEYsIDB4QTQsIDB4NTAsIDB4QTQsIDB4NTEsIC8qIDB4RjQtMHhGNyAqLworCTB4QzIsIDB4QjAsIDB4QzIsIDB4QjEsIDB4QTQsIDB4NTIsIDB4QTQsIDB4NTMsIC8qIDB4RjgtMHhGQiAqLworCTB4QzIsIDB4QjIsIDB4QTQsIDB4NTQsIDB4QTQsIDB4NTUsIDB4QTQsIDB4NTYsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0NBWzUxMl0gPSB7CisJMHhDMiwgMHhCMywgMHhBNCwgMHg1NywgMHhBNCwgMHg1OCwgMHhBNCwgMHg1OSwgLyogMHgwMC0weDAzICovCisJMHhBNCwgMHg1QSwgMHhBNCwgMHg2MSwgMHhBNCwgMHg2MiwgMHhBNCwgMHg2MywgLyogMHgwNC0weDA3ICovCisJMHhDMiwgMHhCNCwgMHhDMiwgMHhCNSwgMHhBNCwgMHg2NCwgMHhDMiwgMHhCNiwgLyogMHgwOC0weDBCICovCisJMHhDMiwgMHhCNywgMHhDMiwgMHhCOCwgMHhBNCwgMHg2NSwgMHhBNCwgMHg2NiwgLyogMHgwQy0weDBGICovCisJMHhBNCwgMHg2NywgMHhBNCwgMHg2OCwgMHhBNCwgMHg2OSwgMHhBNCwgMHg2QSwgLyogMHgxMC0weDEzICovCisJMHhDMiwgMHhCOSwgMHhBNCwgMHg2QiwgMHhBNCwgMHg2QywgMHhBNCwgMHg2RCwgLyogMHgxNC0weDE3ICovCisJMHhDMiwgMHhCQSwgMHhBNCwgMHg2RSwgMHhBNCwgMHg2RiwgMHhBNCwgMHg3MCwgLyogMHgxOC0weDFCICovCisJMHhBNCwgMHg3MSwgMHhBNCwgMHg3MiwgMHhBNCwgMHg3MywgMHhBNCwgMHg3NCwgLyogMHgxQy0weDFGICovCisJMHhBNCwgMHg3NSwgMHhBNCwgMHg3NiwgMHhBNCwgMHg3NywgMHhBNCwgMHg3OCwgLyogMHgyMC0weDIzICovCisJMHhBNCwgMHg3OSwgMHhBNCwgMHg3QSwgMHhBNCwgMHg4MSwgMHhBNCwgMHg4MiwgLyogMHgyNC0weDI3ICovCisJMHhBNCwgMHg4MywgMHhDMiwgMHhCQiwgMHhBNCwgMHg4NCwgMHhBNCwgMHg4NSwgLyogMHgyOC0weDJCICovCisJMHhBNCwgMHg4NiwgMHhBNCwgMHg4NywgMHhBNCwgMHg4OCwgMHhBNCwgMHg4OSwgLyogMHgyQy0weDJGICovCisJMHhBNCwgMHg4QSwgMHhBNCwgMHg4QiwgMHhBNCwgMHg4QywgMHhBNCwgMHg4RCwgLyogMHgzMC0weDMzICovCisJMHhBNCwgMHg4RSwgMHhBNCwgMHg4RiwgMHhBNCwgMHg5MCwgMHhBNCwgMHg5MSwgLyogMHgzNC0weDM3ICovCisJMHhBNCwgMHg5MiwgMHhBNCwgMHg5MywgMHhBNCwgMHg5NCwgMHhBNCwgMHg5NSwgLyogMHgzOC0weDNCICovCisJMHhBNCwgMHg5NiwgMHhBNCwgMHg5NywgMHhBNCwgMHg5OCwgMHhBNCwgMHg5OSwgLyogMHgzQy0weDNGICovCisJMHhBNCwgMHg5QSwgMHhBNCwgMHg5QiwgMHhBNCwgMHg5QywgMHhBNCwgMHg5RCwgLyogMHg0MC0weDQzICovCisJMHhBNCwgMHg5RSwgMHhBNCwgMHg5RiwgMHhBNCwgMHhBMCwgMHhBNSwgMHg0MSwgLyogMHg0NC0weDQ3ICovCisJMHhBNSwgMHg0MiwgMHhBNSwgMHg0MywgMHhBNSwgMHg0NCwgMHhBNSwgMHg0NSwgLyogMHg0OC0weDRCICovCisJMHhDMiwgMHhCQywgMHhDMiwgMHhCRCwgMHhBNSwgMHg0NiwgMHhBNSwgMHg0NywgLyogMHg0Qy0weDRGICovCisJMHhDMiwgMHhCRSwgMHhBNSwgMHg0OCwgMHhBNSwgMHg0OSwgMHhBNSwgMHg0QSwgLyogMHg1MC0weDUzICovCisJMHhDMiwgMHhCRiwgMHhBNSwgMHg0QiwgMHhBNSwgMHg0QywgMHhBNSwgMHg0RCwgLyogMHg1NC0weDU3ICovCisJMHhBNSwgMHg0RSwgMHhBNSwgMHg0RiwgMHhBNSwgMHg1MCwgMHhBNSwgMHg1MSwgLyogMHg1OC0weDVCICovCisJMHhDMiwgMHhDMCwgMHhDMiwgMHhDMSwgMHhBNSwgMHg1MiwgMHhDMiwgMHhDMiwgLyogMHg1Qy0weDVGICovCisJMHhDMiwgMHhDMywgMHhDMiwgMHhDNCwgMHhBNSwgMHg1MywgMHhBNSwgMHg1NCwgLyogMHg2MC0weDYzICovCisJMHhBNSwgMHg1NSwgMHhBNSwgMHg1NiwgMHhBNSwgMHg1NywgMHhBNSwgMHg1OCwgLyogMHg2NC0weDY3ICovCisJMHhDMiwgMHhDNSwgMHhBNSwgMHg1OSwgMHhBNSwgMHg1QSwgMHhBNSwgMHg2MSwgLyogMHg2OC0weDZCICovCisJMHhBNSwgMHg2MiwgMHhBNSwgMHg2MywgMHhBNSwgMHg2NCwgMHhBNSwgMHg2NSwgLyogMHg2Qy0weDZGICovCisJMHhBNSwgMHg2NiwgMHhBNSwgMHg2NywgMHhBNSwgMHg2OCwgMHhBNSwgMHg2OSwgLyogMHg3MC0weDczICovCisJMHhBNSwgMHg2QSwgMHhBNSwgMHg2QiwgMHhBNSwgMHg2QywgMHhBNSwgMHg2RCwgLyogMHg3NC0weDc3ICovCisJMHhBNSwgMHg2RSwgMHhBNSwgMHg2RiwgMHhBNSwgMHg3MCwgMHhBNSwgMHg3MSwgLyogMHg3OC0weDdCICovCisJMHhBNSwgMHg3MiwgMHhDMiwgMHhDNiwgMHhBNSwgMHg3MywgMHhBNSwgMHg3NCwgLyogMHg3Qy0weDdGICovCisJCisJMHhBNSwgMHg3NSwgMHhBNSwgMHg3NiwgMHhBNSwgMHg3NywgMHhBNSwgMHg3OCwgLyogMHg4MC0weDgzICovCisJMHhDMiwgMHhDNywgMHhBNSwgMHg3OSwgMHhBNSwgMHg3QSwgMHhBNSwgMHg4MSwgLyogMHg4NC0weDg3ICovCisJMHhBNSwgMHg4MiwgMHhBNSwgMHg4MywgMHhBNSwgMHg4NCwgMHhBNSwgMHg4NSwgLyogMHg4OC0weDhCICovCisJMHhBNSwgMHg4NiwgMHhBNSwgMHg4NywgMHhBNSwgMHg4OCwgMHhBNSwgMHg4OSwgLyogMHg4Qy0weDhGICovCisJMHhBNSwgMHg4QSwgMHhBNSwgMHg4QiwgMHhBNSwgMHg4QywgMHhBNSwgMHg4RCwgLyogMHg5MC0weDkzICovCisJMHhBNSwgMHg4RSwgMHhBNSwgMHg4RiwgMHhBNSwgMHg5MCwgMHhBNSwgMHg5MSwgLyogMHg5NC0weDk3ICovCisJMHhDMiwgMHhDOCwgMHhBNSwgMHg5MiwgMHhBNSwgMHg5MywgMHhBNSwgMHg5NCwgLyogMHg5OC0weDlCICovCisJMHhBNSwgMHg5NSwgMHhBNSwgMHg5NiwgMHhBNSwgMHg5NywgMHhBNSwgMHg5OCwgLyogMHg5Qy0weDlGICovCisJMHhBNSwgMHg5OSwgMHhBNSwgMHg5QSwgMHhBNSwgMHg5QiwgMHhBNSwgMHg5QywgLyogMHhBMC0weEEzICovCisJMHhBNSwgMHg5RCwgMHhBNSwgMHg5RSwgMHhBNSwgMHg5RiwgMHhBNSwgMHhBMCwgLyogMHhBNC0weEE3ICovCisJMHhBNiwgMHg0MSwgMHhBNiwgMHg0MiwgMHhBNiwgMHg0MywgMHhBNiwgMHg0NCwgLyogMHhBOC0weEFCICovCisJMHhBNiwgMHg0NSwgMHhBNiwgMHg0NiwgMHhBNiwgMHg0NywgMHhBNiwgMHg0OCwgLyogMHhBQy0weEFGICovCisJMHhBNiwgMHg0OSwgMHhBNiwgMHg0QSwgMHhBNiwgMHg0QiwgMHhBNiwgMHg0QywgLyogMHhCMC0weEIzICovCisJMHhBNiwgMHg0RCwgMHhBNiwgMHg0RSwgMHhBNiwgMHg0RiwgMHhBNiwgMHg1MCwgLyogMHhCNC0weEI3ICovCisJMHhBNiwgMHg1MSwgMHhBNiwgMHg1MiwgMHhBNiwgMHg1MywgMHhBNiwgMHg1NCwgLyogMHhCOC0weEJCICovCisJMHhDMiwgMHhDOSwgMHhDMiwgMHhDQSwgMHhBNiwgMHg1NSwgMHhBNiwgMHg1NiwgLyogMHhCQy0weEJGICovCisJMHhDMiwgMHhDQiwgMHhBNiwgMHg1NywgMHhBNiwgMHg1OCwgMHhBNiwgMHg1OSwgLyogMHhDMC0weEMzICovCisJMHhDMiwgMHhDQywgMHhBNiwgMHg1QSwgMHhBNiwgMHg2MSwgMHhBNiwgMHg2MiwgLyogMHhDNC0weEM3ICovCisJMHhBNiwgMHg2MywgMHhBNiwgMHg2NCwgMHhBNiwgMHg2NSwgMHhBNiwgMHg2NiwgLyogMHhDOC0weENCICovCisJMHhDMiwgMHhDRCwgMHhDMiwgMHhDRSwgMHhBNiwgMHg2NywgMHhDMiwgMHhDRiwgLyogMHhDQy0weENGICovCisJMHhBNiwgMHg2OCwgMHhDMiwgMHhEMCwgMHhBNiwgMHg2OSwgMHhDMiwgMHhEMSwgLyogMHhEMC0weEQzICovCisJMHhBNiwgMHg2QSwgMHhBNiwgMHg2QiwgMHhBNiwgMHg2QywgMHhBNiwgMHg2RCwgLyogMHhENC0weEQ3ICovCisJMHhDMiwgMHhEMiwgMHhDMiwgMHhEMywgMHhBNiwgMHg2RSwgMHhBNiwgMHg2RiwgLyogMHhEOC0weERCICovCisJMHhBNiwgMHg3MCwgMHhBNiwgMHg3MSwgMHhBNiwgMHg3MiwgMHhBNiwgMHg3MywgLyogMHhEQy0weERGICovCisJMHhDMiwgMHhENCwgMHhBNiwgMHg3NCwgMHhBNiwgMHg3NSwgMHhBNiwgMHg3NiwgLyogMHhFMC0weEUzICovCisJMHhBNiwgMHg3NywgMHhBNiwgMHg3OCwgMHhBNiwgMHg3OSwgMHhBNiwgMHg3QSwgLyogMHhFNC0weEU3ICovCisJMHhBNiwgMHg4MSwgMHhBNiwgMHg4MiwgMHhBNiwgMHg4MywgMHhBNiwgMHg4NCwgLyogMHhFOC0weEVCICovCisJMHhDMiwgMHhENSwgMHhBNiwgMHg4NSwgMHhBNiwgMHg4NiwgMHhBNiwgMHg4NywgLyogMHhFQy0weEVGICovCisJMHhBNiwgMHg4OCwgMHhBNiwgMHg4OSwgMHhBNiwgMHg4QSwgMHhBNiwgMHg4QiwgLyogMHhGMC0weEYzICovCisJMHhDMiwgMHhENiwgMHhBNiwgMHg4QywgMHhBNiwgMHg4RCwgMHhBNiwgMHg4RSwgLyogMHhGNC0weEY3ICovCisJMHhBNiwgMHg4RiwgMHhBNiwgMHg5MCwgMHhBNiwgMHg5MSwgMHhBNiwgMHg5MiwgLyogMHhGOC0weEZCICovCisJMHhBNiwgMHg5MywgMHhBNiwgMHg5NCwgMHhBNiwgMHg5NSwgMHhBNiwgMHg5NiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQ0JbNTEyXSA9IHsKKwkweEE2LCAweDk3LCAweEE2LCAweDk4LCAweEE2LCAweDk5LCAweEE2LCAweDlBLCAvKiAweDAwLTB4MDMgKi8KKwkweEE2LCAweDlCLCAweEE2LCAweDlDLCAweEE2LCAweDlELCAweEE2LCAweDlFLCAvKiAweDA0LTB4MDcgKi8KKwkweEMyLCAweEQ3LCAweEE2LCAweDlGLCAweEE2LCAweEEwLCAweEE3LCAweDQxLCAvKiAweDA4LTB4MEIgKi8KKwkweEE3LCAweDQyLCAweEE3LCAweDQzLCAweEE3LCAweDQ0LCAweEE3LCAweDQ1LCAvKiAweDBDLTB4MEYgKi8KKwkweEMyLCAweEQ4LCAweEE3LCAweDQ2LCAweEE3LCAweDQ3LCAweEE3LCAweDQ4LCAvKiAweDEwLTB4MTMgKi8KKwkweEMyLCAweEQ5LCAweEE3LCAweDQ5LCAweEE3LCAweDRBLCAweEE3LCAweDRCLCAvKiAweDE0LTB4MTcgKi8KKwkweEMyLCAweERBLCAweEE3LCAweDRDLCAweEE3LCAweDRELCAweEE3LCAweDRFLCAvKiAweDE4LTB4MUIgKi8KKwkweEE3LCAweDRGLCAweEE3LCAweDUwLCAweEE3LCAweDUxLCAweEE3LCAweDUyLCAvKiAweDFDLTB4MUYgKi8KKwkweEMyLCAweERCLCAweEMyLCAweERDLCAweEE3LCAweDUzLCAweEE3LCAweDU0LCAvKiAweDIwLTB4MjMgKi8KKwkweEE3LCAweDU1LCAweEE3LCAweDU2LCAweEE3LCAweDU3LCAweEE3LCAweDU4LCAvKiAweDI0LTB4MjcgKi8KKwkweEE3LCAweDU5LCAweEE3LCAweDVBLCAweEE3LCAweDYxLCAweEE3LCAweDYyLCAvKiAweDI4LTB4MkIgKi8KKwkweEE3LCAweDYzLCAweEE3LCAweDY0LCAweEE3LCAweDY1LCAweEE3LCAweDY2LCAvKiAweDJDLTB4MkYgKi8KKwkweEE3LCAweDY3LCAweEE3LCAweDY4LCAweEE3LCAweDY5LCAweEE3LCAweDZBLCAvKiAweDMwLTB4MzMgKi8KKwkweEE3LCAweDZCLCAweEE3LCAweDZDLCAweEE3LCAweDZELCAweEE3LCAweDZFLCAvKiAweDM0LTB4MzcgKi8KKwkweEE3LCAweDZGLCAweEE3LCAweDcwLCAweEE3LCAweDcxLCAweEE3LCAweDcyLCAvKiAweDM4LTB4M0IgKi8KKwkweEE3LCAweDczLCAweEE3LCAweDc0LCAweEE3LCAweDc1LCAweEE3LCAweDc2LCAvKiAweDNDLTB4M0YgKi8KKwkweEE3LCAweDc3LCAweEMyLCAweERELCAweEE3LCAweDc4LCAweEE3LCAweDc5LCAvKiAweDQwLTB4NDMgKi8KKwkweEE3LCAweDdBLCAweEE3LCAweDgxLCAweEE3LCAweDgyLCAweEE3LCAweDgzLCAvKiAweDQ0LTB4NDcgKi8KKwkweEMyLCAweERFLCAweEMyLCAweERGLCAweEE3LCAweDg0LCAweEE3LCAweDg1LCAvKiAweDQ4LTB4NEIgKi8KKwkweEMyLCAweEUwLCAweEE3LCAweDg2LCAweEE3LCAweDg3LCAweEE3LCAweDg4LCAvKiAweDRDLTB4NEYgKi8KKwkweEMyLCAweEUxLCAweEE3LCAweDg5LCAweEE3LCAweDhBLCAweEE3LCAweDhCLCAvKiAweDUwLTB4NTMgKi8KKwkweEE3LCAweDhDLCAweEE3LCAweDhELCAweEE3LCAweDhFLCAweEE3LCAweDhGLCAvKiAweDU0LTB4NTcgKi8KKwkweEMyLCAweEUyLCAweEMyLCAweEUzLCAweEE3LCAweDkwLCAweEE3LCAweDkxLCAvKiAweDU4LTB4NUIgKi8KKwkweEE3LCAweDkyLCAweEMyLCAweEU0LCAweEE3LCAweDkzLCAweEE3LCAweDk0LCAvKiAweDVDLTB4NUYgKi8KKwkweEE3LCAweDk1LCAweEE3LCAweDk2LCAweEE3LCAweDk3LCAweEE3LCAweDk4LCAvKiAweDYwLTB4NjMgKi8KKwkweEMyLCAweEU1LCAweEE3LCAweDk5LCAweEE3LCAweDlBLCAweEE3LCAweDlCLCAvKiAweDY0LTB4NjcgKi8KKwkweEE3LCAweDlDLCAweEE3LCAweDlELCAweEE3LCAweDlFLCAweEE3LCAweDlGLCAvKiAweDY4LTB4NkIgKi8KKwkweEE3LCAweEEwLCAweEE4LCAweDQxLCAweEE4LCAweDQyLCAweEE4LCAweDQzLCAvKiAweDZDLTB4NkYgKi8KKwkweEE4LCAweDQ0LCAweEE4LCAweDQ1LCAweEE4LCAweDQ2LCAweEE4LCAweDQ3LCAvKiAweDcwLTB4NzMgKi8KKwkweEE4LCAweDQ4LCAweEE4LCAweDQ5LCAweEE4LCAweDRBLCAweEE4LCAweDRCLCAvKiAweDc0LTB4NzcgKi8KKwkweEMyLCAweEU2LCAweEMyLCAweEU3LCAweEE4LCAweDRDLCAweEE4LCAweDRELCAvKiAweDc4LTB4N0IgKi8KKwkweEE4LCAweDRFLCAweEE4LCAweDRGLCAweEE4LCAweDUwLCAweEE4LCAweDUxLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEE4LCAweDUyLCAweEE4LCAweDUzLCAweEE4LCAweDU0LCAweEE4LCAweDU1LCAvKiAweDgwLTB4ODMgKi8KKwkweEE4LCAweDU2LCAweEE4LCAweDU3LCAweEE4LCAweDU4LCAweEE4LCAweDU5LCAvKiAweDg0LTB4ODcgKi8KKwkweEE4LCAweDVBLCAweEE4LCAweDYxLCAweEE4LCAweDYyLCAweEE4LCAweDYzLCAvKiAweDg4LTB4OEIgKi8KKwkweEE4LCAweDY0LCAweEE4LCAweDY1LCAweEE4LCAweDY2LCAweEE4LCAweDY3LCAvKiAweDhDLTB4OEYgKi8KKwkweEE4LCAweDY4LCAweEE4LCAweDY5LCAweEE4LCAweDZBLCAweEE4LCAweDZCLCAvKiAweDkwLTB4OTMgKi8KKwkweEE4LCAweDZDLCAweEE4LCAweDZELCAweEE4LCAweDZFLCAweEE4LCAweDZGLCAvKiAweDk0LTB4OTcgKi8KKwkweEE4LCAweDcwLCAweEE4LCAweDcxLCAweEE4LCAweDcyLCAweEE4LCAweDczLCAvKiAweDk4LTB4OUIgKi8KKwkweEMyLCAweEU4LCAweEE4LCAweDc0LCAweEE4LCAweDc1LCAweEE4LCAweDc2LCAvKiAweDlDLTB4OUYgKi8KKwkweEE4LCAweDc3LCAweEE4LCAweDc4LCAweEE4LCAweDc5LCAweEE4LCAweDdBLCAvKiAweEEwLTB4QTMgKi8KKwkweEE4LCAweDgxLCAweEE4LCAweDgyLCAweEE4LCAweDgzLCAweEE4LCAweDg0LCAvKiAweEE0LTB4QTcgKi8KKwkweEE4LCAweDg1LCAweEE4LCAweDg2LCAweEE4LCAweDg3LCAweEE4LCAweDg4LCAvKiAweEE4LTB4QUIgKi8KKwkweEE4LCAweDg5LCAweEE4LCAweDhBLCAweEE4LCAweDhCLCAweEE4LCAweDhDLCAvKiAweEFDLTB4QUYgKi8KKwkweEE4LCAweDhELCAweEE4LCAweDhFLCAweEE4LCAweDhGLCAweEE4LCAweDkwLCAvKiAweEIwLTB4QjMgKi8KKwkweEE4LCAweDkxLCAweEE4LCAweDkyLCAweEE4LCAweDkzLCAweEE4LCAweDk0LCAvKiAweEI0LTB4QjcgKi8KKwkweEMyLCAweEU5LCAweEE4LCAweDk1LCAweEE4LCAweDk2LCAweEE4LCAweDk3LCAvKiAweEI4LTB4QkIgKi8KKwkweEE4LCAweDk4LCAweEE4LCAweDk5LCAweEE4LCAweDlBLCAweEE4LCAweDlCLCAvKiAweEJDLTB4QkYgKi8KKwkweEE4LCAweDlDLCAweEE4LCAweDlELCAweEE4LCAweDlFLCAweEE4LCAweDlGLCAvKiAweEMwLTB4QzMgKi8KKwkweEE4LCAweEEwLCAweEE5LCAweDQxLCAweEE5LCAweDQyLCAweEE5LCAweDQzLCAvKiAweEM0LTB4QzcgKi8KKwkweEE5LCAweDQ0LCAweEE5LCAweDQ1LCAweEE5LCAweDQ2LCAweEE5LCAweDQ3LCAvKiAweEM4LTB4Q0IgKi8KKwkweEE5LCAweDQ4LCAweEE5LCAweDQ5LCAweEE5LCAweDRBLCAweEE5LCAweDRCLCAvKiAweENDLTB4Q0YgKi8KKwkweEE5LCAweDRDLCAweEE5LCAweDRELCAweEE5LCAweDRFLCAweEE5LCAweDRGLCAvKiAweEQwLTB4RDMgKi8KKwkweEMyLCAweEVBLCAweEE5LCAweDUwLCAweEE5LCAweDUxLCAweEE5LCAweDUyLCAvKiAweEQ0LTB4RDcgKi8KKwkweEE5LCAweDUzLCAweEE5LCAweDU0LCAweEE5LCAweDU1LCAweEE5LCAweDU2LCAvKiAweEQ4LTB4REIgKi8KKwkweEE5LCAweDU3LCAweEE5LCAweDU4LCAweEE5LCAweDU5LCAweEE5LCAweDVBLCAvKiAweERDLTB4REYgKi8KKwkweEE5LCAweDYxLCAweEE5LCAweDYyLCAweEE5LCAweDYzLCAweEE5LCAweDY0LCAvKiAweEUwLTB4RTMgKi8KKwkweEMyLCAweEVCLCAweEE5LCAweDY1LCAweEE5LCAweDY2LCAweEMyLCAweEVDLCAvKiAweEU0LTB4RTcgKi8KKwkweEE5LCAweDY3LCAweEMyLCAweEVELCAweEE5LCAweDY4LCAweEE5LCAweDY5LCAvKiAweEU4LTB4RUIgKi8KKwkweEE5LCAweDZBLCAweEE5LCAweDZCLCAweEE5LCAweDZDLCAweEE5LCAweDZELCAvKiAweEVDLTB4RUYgKi8KKwkweEE5LCAweDZFLCAweEE5LCAweDZGLCAweEE5LCAweDcwLCAweEE5LCAweDcxLCAvKiAweEYwLTB4RjMgKi8KKwkweEE5LCAweDcyLCAweEE5LCAweDczLCAweEE5LCAweDc0LCAweEE5LCAweDc1LCAvKiAweEY0LTB4RjcgKi8KKwkweEE5LCAweDc2LCAweEE5LCAweDc3LCAweEE5LCAweDc4LCAweEE5LCAweDc5LCAvKiAweEY4LTB4RkIgKi8KKwkweEE5LCAweDdBLCAweEE5LCAweDgxLCAweEE5LCAweDgyLCAweEE5LCAweDgzLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19DQ1s1MTJdID0geworCTB4QTksIDB4ODQsIDB4QTksIDB4ODUsIDB4QTksIDB4ODYsIDB4QTksIDB4ODcsIC8qIDB4MDAtMHgwMyAqLworCTB4QTksIDB4ODgsIDB4QTksIDB4ODksIDB4QTksIDB4OEEsIDB4QTksIDB4OEIsIC8qIDB4MDQtMHgwNyAqLworCTB4QTksIDB4OEMsIDB4QTksIDB4OEQsIDB4QTksIDB4OEUsIDB4QTksIDB4OEYsIC8qIDB4MDgtMHgwQiAqLworCTB4QzIsIDB4RUUsIDB4QzIsIDB4RUYsIDB4QTksIDB4OTAsIDB4QTksIDB4OTEsIC8qIDB4MEMtMHgwRiAqLworCTB4QzIsIDB4RjAsIDB4QTksIDB4OTIsIDB4QTksIDB4OTMsIDB4QTksIDB4OTQsIC8qIDB4MTAtMHgxMyAqLworCTB4QzIsIDB4RjEsIDB4QTksIDB4OTUsIDB4QTksIDB4OTYsIDB4QTksIDB4OTcsIC8qIDB4MTQtMHgxNyAqLworCTB4QTksIDB4OTgsIDB4QTksIDB4OTksIDB4QTksIDB4OUEsIDB4QTksIDB4OUIsIC8qIDB4MTgtMHgxQiAqLworCTB4QzIsIDB4RjIsIDB4QzIsIDB4RjMsIDB4QTksIDB4OUMsIDB4QTksIDB4OUQsIC8qIDB4MUMtMHgxRiAqLworCTB4QTksIDB4OUUsIDB4QzIsIDB4RjQsIDB4QzIsIDB4RjUsIDB4QTksIDB4OUYsIC8qIDB4MjAtMHgyMyAqLworCTB4QTksIDB4QTAsIDB4QUEsIDB4NDEsIDB4QUEsIDB4NDIsIDB4QzIsIDB4RjYsIC8qIDB4MjQtMHgyNyAqLworCTB4QzIsIDB4RjcsIDB4QzIsIDB4RjgsIDB4QUEsIDB4NDMsIDB4QUEsIDB4NDQsIC8qIDB4MjgtMHgyQiAqLworCTB4QzIsIDB4RjksIDB4QUEsIDB4NDUsIDB4QzIsIDB4RkEsIDB4QUEsIDB4NDYsIC8qIDB4MkMtMHgyRiAqLworCTB4QzIsIDB4RkIsIDB4QUEsIDB4NDcsIDB4QUEsIDB4NDgsIDB4QUEsIDB4NDksIC8qIDB4MzAtMHgzMyAqLworCTB4QUEsIDB4NEEsIDB4QUEsIDB4NEIsIDB4QUEsIDB4NEMsIDB4QUEsIDB4NEQsIC8qIDB4MzQtMHgzNyAqLworCTB4QzIsIDB4RkMsIDB4QzIsIDB4RkQsIDB4QUEsIDB4NEUsIDB4QzIsIDB4RkUsIC8qIDB4MzgtMHgzQiAqLworCTB4QzMsIDB4QTEsIDB4QzMsIDB4QTIsIDB4QzMsIDB4QTMsIDB4QUEsIDB4NEYsIC8qIDB4M0MtMHgzRiAqLworCTB4QUEsIDB4NTAsIDB4QUEsIDB4NTEsIDB4QUEsIDB4NTIsIDB4QUEsIDB4NTMsIC8qIDB4NDAtMHg0MyAqLworCTB4QzMsIDB4QTQsIDB4QzMsIDB4QTUsIDB4QUEsIDB4NTQsIDB4QUEsIDB4NTUsIC8qIDB4NDQtMHg0NyAqLworCTB4QzMsIDB4QTYsIDB4QUEsIDB4NTYsIDB4QUEsIDB4NTcsIDB4QUEsIDB4NTgsIC8qIDB4NDgtMHg0QiAqLworCTB4QzMsIDB4QTcsIDB4QUEsIDB4NTksIDB4QUEsIDB4NUEsIDB4QUEsIDB4NjEsIC8qIDB4NEMtMHg0RiAqLworCTB4QUEsIDB4NjIsIDB4QUEsIDB4NjMsIDB4QUEsIDB4NjQsIDB4QUEsIDB4NjUsIC8qIDB4NTAtMHg1MyAqLworCTB4QzMsIDB4QTgsIDB4QzMsIDB4QTksIDB4QUEsIDB4NjYsIDB4QzMsIDB4QUEsIC8qIDB4NTQtMHg1NyAqLworCTB4QzMsIDB4QUIsIDB4QzMsIDB4QUMsIDB4QUEsIDB4NjcsIDB4QUEsIDB4NjgsIC8qIDB4NTgtMHg1QiAqLworCTB4QUEsIDB4NjksIDB4QUEsIDB4NkEsIDB4QUEsIDB4NkIsIDB4QUEsIDB4NkMsIC8qIDB4NUMtMHg1RiAqLworCTB4QzMsIDB4QUQsIDB4QUEsIDB4NkQsIDB4QUEsIDB4NkUsIDB4QUEsIDB4NkYsIC8qIDB4NjAtMHg2MyAqLworCTB4QzMsIDB4QUUsIDB4QUEsIDB4NzAsIDB4QzMsIDB4QUYsIDB4QUEsIDB4NzEsIC8qIDB4NjQtMHg2NyAqLworCTB4QzMsIDB4QjAsIDB4QUEsIDB4NzIsIDB4QUEsIDB4NzMsIDB4QUEsIDB4NzQsIC8qIDB4NjgtMHg2QiAqLworCTB4QUEsIDB4NzUsIDB4QUEsIDB4NzYsIDB4QUEsIDB4NzcsIDB4QUEsIDB4NzgsIC8qIDB4NkMtMHg2RiAqLworCTB4QzMsIDB4QjEsIDB4QUEsIDB4NzksIDB4QUEsIDB4N0EsIDB4QUEsIDB4ODEsIC8qIDB4NzAtMHg3MyAqLworCTB4QUEsIDB4ODIsIDB4QzMsIDB4QjIsIDB4QUEsIDB4ODMsIDB4QUEsIDB4ODQsIC8qIDB4NzQtMHg3NyAqLworCTB4QUEsIDB4ODUsIDB4QUEsIDB4ODYsIDB4QUEsIDB4ODcsIDB4QUEsIDB4ODgsIC8qIDB4NzgtMHg3QiAqLworCTB4QUEsIDB4ODksIDB4QUEsIDB4OEEsIDB4QUEsIDB4OEIsIDB4QUEsIDB4OEMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QUEsIDB4OEQsIDB4QUEsIDB4OEUsIDB4QUEsIDB4OEYsIDB4QUEsIDB4OTAsIC8qIDB4ODAtMHg4MyAqLworCTB4QUEsIDB4OTEsIDB4QUEsIDB4OTIsIDB4QUEsIDB4OTMsIDB4QUEsIDB4OTQsIC8qIDB4ODQtMHg4NyAqLworCTB4QUEsIDB4OTUsIDB4QUEsIDB4OTYsIDB4QUEsIDB4OTcsIDB4QUEsIDB4OTgsIC8qIDB4ODgtMHg4QiAqLworCTB4QUEsIDB4OTksIDB4QUEsIDB4OUEsIDB4QUEsIDB4OUIsIDB4QUEsIDB4OUMsIC8qIDB4OEMtMHg4RiAqLworCTB4QUEsIDB4OUQsIDB4QUEsIDB4OUUsIDB4QUEsIDB4OUYsIDB4QUEsIDB4QTAsIC8qIDB4OTAtMHg5MyAqLworCTB4QUIsIDB4NDEsIDB4QUIsIDB4NDIsIDB4QUIsIDB4NDMsIDB4QUIsIDB4NDQsIC8qIDB4OTQtMHg5NyAqLworCTB4QzMsIDB4QjMsIDB4QzMsIDB4QjQsIDB4QUIsIDB4NDUsIDB4QUIsIDB4NDYsIC8qIDB4OTgtMHg5QiAqLworCTB4QzMsIDB4QjUsIDB4QUIsIDB4NDcsIDB4QUIsIDB4NDgsIDB4QUIsIDB4NDksIC8qIDB4OUMtMHg5RiAqLworCTB4QzMsIDB4QjYsIDB4QUIsIDB4NEEsIDB4QUIsIDB4NEIsIDB4QUIsIDB4NEMsIC8qIDB4QTAtMHhBMyAqLworCTB4QUIsIDB4NEQsIDB4QUIsIDB4NEUsIDB4QUIsIDB4NEYsIDB4QUIsIDB4NTAsIC8qIDB4QTQtMHhBNyAqLworCTB4QzMsIDB4QjcsIDB4QzMsIDB4QjgsIDB4QUIsIDB4NTEsIDB4QzMsIDB4QjksIC8qIDB4QTgtMHhBQiAqLworCTB4QzMsIDB4QkEsIDB4QzMsIDB4QkIsIDB4QUIsIDB4NTIsIDB4QUIsIDB4NTMsIC8qIDB4QUMtMHhBRiAqLworCTB4QUIsIDB4NTQsIDB4QUIsIDB4NTUsIDB4QUIsIDB4NTYsIDB4QUIsIDB4NTcsIC8qIDB4QjAtMHhCMyAqLworCTB4QzMsIDB4QkMsIDB4QzMsIDB4QkQsIDB4QUIsIDB4NTgsIDB4QUIsIDB4NTksIC8qIDB4QjQtMHhCNyAqLworCTB4QzMsIDB4QkUsIDB4QUIsIDB4NUEsIDB4QUIsIDB4NjEsIDB4QUIsIDB4NjIsIC8qIDB4QjgtMHhCQiAqLworCTB4QzMsIDB4QkYsIDB4QUIsIDB4NjMsIDB4QUIsIDB4NjQsIDB4QUIsIDB4NjUsIC8qIDB4QkMtMHhCRiAqLworCTB4QUIsIDB4NjYsIDB4QUIsIDB4NjcsIDB4QUIsIDB4NjgsIDB4QUIsIDB4NjksIC8qIDB4QzAtMHhDMyAqLworCTB4QzMsIDB4QzAsIDB4QzMsIDB4QzEsIDB4QUIsIDB4NkEsIDB4QzMsIDB4QzIsIC8qIDB4QzQtMHhDNyAqLworCTB4QUIsIDB4NkIsIDB4QzMsIDB4QzMsIDB4QUIsIDB4NkMsIDB4QUIsIDB4NkQsIC8qIDB4QzgtMHhDQiAqLworCTB4QUIsIDB4NkUsIDB4QUIsIDB4NkYsIDB4QUIsIDB4NzAsIDB4QUIsIDB4NzEsIC8qIDB4Q0MtMHhDRiAqLworCTB4QzMsIDB4QzQsIDB4QUIsIDB4NzIsIDB4QUIsIDB4NzMsIDB4QUIsIDB4NzQsIC8qIDB4RDAtMHhEMyAqLworCTB4QzMsIDB4QzUsIDB4QUIsIDB4NzUsIDB4QUIsIDB4NzYsIDB4QUIsIDB4NzcsIC8qIDB4RDQtMHhENyAqLworCTB4QUIsIDB4NzgsIDB4QUIsIDB4NzksIDB4QUIsIDB4N0EsIDB4QUIsIDB4ODEsIC8qIDB4RDgtMHhEQiAqLworCTB4QUIsIDB4ODIsIDB4QUIsIDB4ODMsIDB4QUIsIDB4ODQsIDB4QUIsIDB4ODUsIC8qIDB4REMtMHhERiAqLworCTB4QUIsIDB4ODYsIDB4QUIsIDB4ODcsIDB4QUIsIDB4ODgsIDB4QUIsIDB4ODksIC8qIDB4RTAtMHhFMyAqLworCTB4QzMsIDB4QzYsIDB4QUIsIDB4OEEsIDB4QUIsIDB4OEIsIDB4QUIsIDB4OEMsIC8qIDB4RTQtMHhFNyAqLworCTB4QUIsIDB4OEQsIDB4QUIsIDB4OEUsIDB4QUIsIDB4OEYsIDB4QUIsIDB4OTAsIC8qIDB4RTgtMHhFQiAqLworCTB4QzMsIDB4QzcsIDB4QUIsIDB4OTEsIDB4QUIsIDB4OTIsIDB4QUIsIDB4OTMsIC8qIDB4RUMtMHhFRiAqLworCTB4QzMsIDB4QzgsIDB4QUIsIDB4OTQsIDB4QUIsIDB4OTUsIDB4QUIsIDB4OTYsIC8qIDB4RjAtMHhGMyAqLworCTB4QUIsIDB4OTcsIDB4QUIsIDB4OTgsIDB4QUIsIDB4OTksIDB4QUIsIDB4OUEsIC8qIDB4RjQtMHhGNyAqLworCTB4QUIsIDB4OUIsIDB4QUIsIDB4OUMsIDB4QUIsIDB4OUQsIDB4QUIsIDB4OUUsIC8qIDB4RjgtMHhGQiAqLworCTB4QUIsIDB4OUYsIDB4QUIsIDB4QTAsIDB4QUMsIDB4NDEsIDB4QUMsIDB4NDIsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0NEWzUxMl0gPSB7CisJMHhBQywgMHg0MywgMHhDMywgMHhDOSwgMHhBQywgMHg0NCwgMHhBQywgMHg0NSwgLyogMHgwMC0weDAzICovCisJMHhBQywgMHg0NiwgMHhBQywgMHg0NywgMHhBQywgMHg0OCwgMHhBQywgMHg0OSwgLyogMHgwNC0weDA3ICovCisJMHhDMywgMHhDQSwgMHhDMywgMHhDQiwgMHhBQywgMHg0QSwgMHhBQywgMHg0QiwgLyogMHgwOC0weDBCICovCisJMHhDMywgMHhDQywgMHhBQywgMHg0QywgMHhBQywgMHg0RCwgMHhBQywgMHg0RSwgLyogMHgwQy0weDBGICovCisJMHhDMywgMHhDRCwgMHhBQywgMHg0RiwgMHhBQywgMHg1MCwgMHhBQywgMHg1MSwgLyogMHgxMC0weDEzICovCisJMHhBQywgMHg1MiwgMHhBQywgMHg1MywgMHhBQywgMHg1NCwgMHhBQywgMHg1NSwgLyogMHgxNC0weDE3ICovCisJMHhDMywgMHhDRSwgMHhDMywgMHhDRiwgMHhBQywgMHg1NiwgMHhDMywgMHhEMCwgLyogMHgxOC0weDFCICovCisJMHhBQywgMHg1NywgMHhDMywgMHhEMSwgMHhBQywgMHg1OCwgMHhBQywgMHg1OSwgLyogMHgxQy0weDFGICovCisJMHhBQywgMHg1QSwgMHhBQywgMHg2MSwgMHhBQywgMHg2MiwgMHhBQywgMHg2MywgLyogMHgyMC0weDIzICovCisJMHhDMywgMHhEMiwgMHhBQywgMHg2NCwgMHhBQywgMHg2NSwgMHhBQywgMHg2NiwgLyogMHgyNC0weDI3ICovCisJMHhDMywgMHhEMywgMHhBQywgMHg2NywgMHhBQywgMHg2OCwgMHhBQywgMHg2OSwgLyogMHgyOC0weDJCICovCisJMHhDMywgMHhENCwgMHhBQywgMHg2QSwgMHhBQywgMHg2QiwgMHhBQywgMHg2QywgLyogMHgyQy0weDJGICovCisJMHhBQywgMHg2RCwgMHhBQywgMHg2RSwgMHhBQywgMHg2RiwgMHhBQywgMHg3MCwgLyogMHgzMC0weDMzICovCisJMHhBQywgMHg3MSwgMHhBQywgMHg3MiwgMHhBQywgMHg3MywgMHhBQywgMHg3NCwgLyogMHgzNC0weDM3ICovCisJMHhBQywgMHg3NSwgMHhDMywgMHhENSwgMHhBQywgMHg3NiwgMHhBQywgMHg3NywgLyogMHgzOC0weDNCICovCisJMHhBQywgMHg3OCwgMHhBQywgMHg3OSwgMHhBQywgMHg3QSwgMHhBQywgMHg4MSwgLyogMHgzQy0weDNGICovCisJMHhBQywgMHg4MiwgMHhBQywgMHg4MywgMHhBQywgMHg4NCwgMHhBQywgMHg4NSwgLyogMHg0MC0weDQzICovCisJMHhBQywgMHg4NiwgMHhBQywgMHg4NywgMHhBQywgMHg4OCwgMHhBQywgMHg4OSwgLyogMHg0NC0weDQ3ICovCisJMHhBQywgMHg4QSwgMHhBQywgMHg4QiwgMHhBQywgMHg4QywgMHhBQywgMHg4RCwgLyogMHg0OC0weDRCICovCisJMHhBQywgMHg4RSwgMHhBQywgMHg4RiwgMHhBQywgMHg5MCwgMHhBQywgMHg5MSwgLyogMHg0Qy0weDRGICovCisJMHhBQywgMHg5MiwgMHhBQywgMHg5MywgMHhBQywgMHg5NCwgMHhBQywgMHg5NSwgLyogMHg1MC0weDUzICovCisJMHhBQywgMHg5NiwgMHhBQywgMHg5NywgMHhBQywgMHg5OCwgMHhBQywgMHg5OSwgLyogMHg1NC0weDU3ICovCisJMHhBQywgMHg5QSwgMHhBQywgMHg5QiwgMHhBQywgMHg5QywgMHhBQywgMHg5RCwgLyogMHg1OC0weDVCICovCisJMHhDMywgMHhENiwgMHhBQywgMHg5RSwgMHhBQywgMHg5RiwgMHhBQywgMHhBMCwgLyogMHg1Qy0weDVGICovCisJMHhDMywgMHhENywgMHhBRCwgMHg0MSwgMHhBRCwgMHg0MiwgMHhBRCwgMHg0MywgLyogMHg2MC0weDYzICovCisJMHhDMywgMHhEOCwgMHhBRCwgMHg0NCwgMHhBRCwgMHg0NSwgMHhBRCwgMHg0NiwgLyogMHg2NC0weDY3ICovCisJMHhBRCwgMHg0NywgMHhBRCwgMHg0OCwgMHhBRCwgMHg0OSwgMHhBRCwgMHg0QSwgLyogMHg2OC0weDZCICovCisJMHhDMywgMHhEOSwgMHhDMywgMHhEQSwgMHhBRCwgMHg0QiwgMHhDMywgMHhEQiwgLyogMHg2Qy0weDZGICovCisJMHhBRCwgMHg0QywgMHhDMywgMHhEQywgMHhBRCwgMHg0RCwgMHhBRCwgMHg0RSwgLyogMHg3MC0weDczICovCisJMHhBRCwgMHg0RiwgMHhBRCwgMHg1MCwgMHhBRCwgMHg1MSwgMHhBRCwgMHg1MiwgLyogMHg3NC0weDc3ICovCisJMHhDMywgMHhERCwgMHhBRCwgMHg1MywgMHhBRCwgMHg1NCwgMHhBRCwgMHg1NSwgLyogMHg3OC0weDdCICovCisJMHhBRCwgMHg1NiwgMHhBRCwgMHg1NywgMHhBRCwgMHg1OCwgMHhBRCwgMHg1OSwgLyogMHg3Qy0weDdGICovCisJCisJMHhBRCwgMHg1QSwgMHhBRCwgMHg2MSwgMHhBRCwgMHg2MiwgMHhBRCwgMHg2MywgLyogMHg4MC0weDgzICovCisJMHhBRCwgMHg2NCwgMHhBRCwgMHg2NSwgMHhBRCwgMHg2NiwgMHhBRCwgMHg2NywgLyogMHg4NC0weDg3ICovCisJMHhDMywgMHhERSwgMHhBRCwgMHg2OCwgMHhBRCwgMHg2OSwgMHhBRCwgMHg2QSwgLyogMHg4OC0weDhCICovCisJMHhBRCwgMHg2QiwgMHhBRCwgMHg2QywgMHhBRCwgMHg2RCwgMHhBRCwgMHg2RSwgLyogMHg4Qy0weDhGICovCisJMHhBRCwgMHg2RiwgMHhBRCwgMHg3MCwgMHhBRCwgMHg3MSwgMHhBRCwgMHg3MiwgLyogMHg5MC0weDkzICovCisJMHhDMywgMHhERiwgMHhDMywgMHhFMCwgMHhBRCwgMHg3MywgMHhBRCwgMHg3NCwgLyogMHg5NC0weDk3ICovCisJMHhDMywgMHhFMSwgMHhBRCwgMHg3NSwgMHhBRCwgMHg3NiwgMHhBRCwgMHg3NywgLyogMHg5OC0weDlCICovCisJMHhDMywgMHhFMiwgMHhBRCwgMHg3OCwgMHhBRCwgMHg3OSwgMHhBRCwgMHg3QSwgLyogMHg5Qy0weDlGICovCisJMHhBRCwgMHg4MSwgMHhBRCwgMHg4MiwgMHhBRCwgMHg4MywgMHhBRCwgMHg4NCwgLyogMHhBMC0weEEzICovCisJMHhDMywgMHhFMywgMHhDMywgMHhFNCwgMHhBRCwgMHg4NSwgMHhDMywgMHhFNSwgLyogMHhBNC0weEE3ICovCisJMHhBRCwgMHg4NiwgMHhDMywgMHhFNiwgMHhBRCwgMHg4NywgMHhBRCwgMHg4OCwgLyogMHhBOC0weEFCICovCisJMHhBRCwgMHg4OSwgMHhBRCwgMHg4QSwgMHhBRCwgMHg4QiwgMHhBRCwgMHg4QywgLyogMHhBQy0weEFGICovCisJMHhDMywgMHhFNywgMHhBRCwgMHg4RCwgMHhBRCwgMHg4RSwgMHhBRCwgMHg4RiwgLyogMHhCMC0weEIzICovCisJMHhBRCwgMHg5MCwgMHhBRCwgMHg5MSwgMHhBRCwgMHg5MiwgMHhBRCwgMHg5MywgLyogMHhCNC0weEI3ICovCisJMHhBRCwgMHg5NCwgMHhBRCwgMHg5NSwgMHhBRCwgMHg5NiwgMHhBRCwgMHg5NywgLyogMHhCOC0weEJCICovCisJMHhBRCwgMHg5OCwgMHhBRCwgMHg5OSwgMHhBRCwgMHg5QSwgMHhBRCwgMHg5QiwgLyogMHhCQy0weEJGICovCisJMHhBRCwgMHg5QywgMHhBRCwgMHg5RCwgMHhBRCwgMHg5RSwgMHhBRCwgMHg5RiwgLyogMHhDMC0weEMzICovCisJMHhDMywgMHhFOCwgMHhBRCwgMHhBMCwgMHhBRSwgMHg0MSwgMHhBRSwgMHg0MiwgLyogMHhDNC0weEM3ICovCisJMHhBRSwgMHg0MywgMHhBRSwgMHg0NCwgMHhBRSwgMHg0NSwgMHhBRSwgMHg0NiwgLyogMHhDOC0weENCICovCisJMHhDMywgMHhFOSwgMHhBRSwgMHg0NywgMHhBRSwgMHg0OCwgMHhBRSwgMHg0OSwgLyogMHhDQy0weENGICovCisJMHhDMywgMHhFQSwgMHhBRSwgMHg0QSwgMHhBRSwgMHg0QiwgMHhBRSwgMHg0QywgLyogMHhEMC0weEQzICovCisJMHhBRSwgMHg0RCwgMHhBRSwgMHg0RSwgMHhBRSwgMHg0RiwgMHhBRSwgMHg1MCwgLyogMHhENC0weEQ3ICovCisJMHhBRSwgMHg1MSwgMHhBRSwgMHg1MiwgMHhBRSwgMHg1MywgMHhBRSwgMHg1NCwgLyogMHhEOC0weERCICovCisJMHhBRSwgMHg1NSwgMHhBRSwgMHg1NiwgMHhBRSwgMHg1NywgMHhBRSwgMHg1OCwgLyogMHhEQy0weERGICovCisJMHhBRSwgMHg1OSwgMHhBRSwgMHg1QSwgMHhBRSwgMHg2MSwgMHhBRSwgMHg2MiwgLyogMHhFMC0weEUzICovCisJMHhBRSwgMHg2MywgMHhBRSwgMHg2NCwgMHhBRSwgMHg2NSwgMHhBRSwgMHg2NiwgLyogMHhFNC0weEU3ICovCisJMHhDMywgMHhFQiwgMHhBRSwgMHg2NywgMHhBRSwgMHg2OCwgMHhBRSwgMHg2OSwgLyogMHhFOC0weEVCICovCisJMHhDMywgMHhFQywgMHhBRSwgMHg2QSwgMHhBRSwgMHg2QiwgMHhBRSwgMHg2QywgLyogMHhFQy0weEVGICovCisJMHhDMywgMHhFRCwgMHhBRSwgMHg2RCwgMHhBRSwgMHg2RSwgMHhBRSwgMHg2RiwgLyogMHhGMC0weEYzICovCisJMHhBRSwgMHg3MCwgMHhBRSwgMHg3MSwgMHhBRSwgMHg3MiwgMHhBRSwgMHg3MywgLyogMHhGNC0weEY3ICovCisJMHhDMywgMHhFRSwgMHhDMywgMHhFRiwgMHhBRSwgMHg3NCwgMHhDMywgMHhGMCwgLyogMHhGOC0weEZCICovCisJMHhBRSwgMHg3NSwgMHhDMywgMHhGMSwgMHhBRSwgMHg3NiwgMHhBRSwgMHg3NywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQ0VbNTEyXSA9IHsKKwkweEFFLCAweDc4LCAweEFFLCAweDc5LCAweEFFLCAweDdBLCAweEFFLCAweDgxLCAvKiAweDAwLTB4MDMgKi8KKwkweEMzLCAweEYyLCAweEFFLCAweDgyLCAweEFFLCAweDgzLCAweEFFLCAweDg0LCAvKiAweDA0LTB4MDcgKi8KKwkweEMzLCAweEYzLCAweEFFLCAweDg1LCAweEFFLCAweDg2LCAweEFFLCAweDg3LCAvKiAweDA4LTB4MEIgKi8KKwkweEMzLCAweEY0LCAweEFFLCAweDg4LCAweEFFLCAweDg5LCAweEFFLCAweDhBLCAvKiAweDBDLTB4MEYgKi8KKwkweEFFLCAweDhCLCAweEFFLCAweDhDLCAweEFFLCAweDhELCAweEFFLCAweDhFLCAvKiAweDEwLTB4MTMgKi8KKwkweEMzLCAweEY1LCAweEFFLCAweDhGLCAweEFFLCAweDkwLCAweEFFLCAweDkxLCAvKiAweDE0LTB4MTcgKi8KKwkweEFFLCAweDkyLCAweEMzLCAweEY2LCAweEFFLCAweDkzLCAweEFFLCAweDk0LCAvKiAweDE4LTB4MUIgKi8KKwkweEFFLCAweDk1LCAweEFFLCAweDk2LCAweEFFLCAweDk3LCAweEFFLCAweDk4LCAvKiAweDFDLTB4MUYgKi8KKwkweEMzLCAweEY3LCAweEMzLCAweEY4LCAweEFFLCAweDk5LCAweEFFLCAweDlBLCAvKiAweDIwLTB4MjMgKi8KKwkweEMzLCAweEY5LCAweEFFLCAweDlCLCAweEFFLCAweDlDLCAweEFFLCAweDlELCAvKiAweDI0LTB4MjcgKi8KKwkweEMzLCAweEZBLCAweEFFLCAweDlFLCAweEFFLCAweDlGLCAweEFFLCAweEEwLCAvKiAweDI4LTB4MkIgKi8KKwkweEFGLCAweDQxLCAweEFGLCAweDQyLCAweEFGLCAweDQzLCAweEFGLCAweDQ0LCAvKiAweDJDLTB4MkYgKi8KKwkweEMzLCAweEZCLCAweEMzLCAweEZDLCAweEFGLCAweDQ1LCAweEMzLCAweEZELCAvKiAweDMwLTB4MzMgKi8KKwkweEFGLCAweDQ2LCAweEMzLCAweEZFLCAweEFGLCAweDQ3LCAweEFGLCAweDQ4LCAvKiAweDM0LTB4MzcgKi8KKwkweEFGLCAweDQ5LCAweEFGLCAweDRBLCAweEFGLCAweDRCLCAweEFGLCAweDRDLCAvKiAweDM4LTB4M0IgKi8KKwkweEFGLCAweDRELCAweEFGLCAweDRFLCAweEFGLCAweDRGLCAweEFGLCAweDUwLCAvKiAweDNDLTB4M0YgKi8KKwkweEFGLCAweDUxLCAweEFGLCAweDUyLCAweEFGLCAweDUzLCAweEFGLCAweDU0LCAvKiAweDQwLTB4NDMgKi8KKwkweEFGLCAweDU1LCAweEFGLCAweDU2LCAweEFGLCAweDU3LCAweEFGLCAweDU4LCAvKiAweDQ0LTB4NDcgKi8KKwkweEFGLCAweDU5LCAweEFGLCAweDVBLCAweEFGLCAweDYxLCAweEFGLCAweDYyLCAvKiAweDQ4LTB4NEIgKi8KKwkweEFGLCAweDYzLCAweEFGLCAweDY0LCAweEFGLCAweDY1LCAweEFGLCAweDY2LCAvKiAweDRDLTB4NEYgKi8KKwkweEFGLCAweDY3LCAweEFGLCAweDY4LCAweEFGLCAweDY5LCAweEFGLCAweDZBLCAvKiAweDUwLTB4NTMgKi8KKwkweEFGLCAweDZCLCAweEFGLCAweDZDLCAweEFGLCAweDZELCAweEFGLCAweDZFLCAvKiAweDU0LTB4NTcgKi8KKwkweEM0LCAweEExLCAweEM0LCAweEEyLCAweEFGLCAweDZGLCAweEFGLCAweDcwLCAvKiAweDU4LTB4NUIgKi8KKwkweEM0LCAweEEzLCAweEFGLCAweDcxLCAweEFGLCAweDcyLCAweEM0LCAweEE0LCAvKiAweDVDLTB4NUYgKi8KKwkweEM0LCAweEE1LCAweEM0LCAweEE2LCAweEFGLCAweDczLCAweEFGLCAweDc0LCAvKiAweDYwLTB4NjMgKi8KKwkweEFGLCAweDc1LCAweEFGLCAweDc2LCAweEFGLCAweDc3LCAweEFGLCAweDc4LCAvKiAweDY0LTB4NjcgKi8KKwkweEM0LCAweEE3LCAweEM0LCAweEE4LCAweEFGLCAweDc5LCAweEM0LCAweEE5LCAvKiAweDY4LTB4NkIgKi8KKwkweEFGLCAweDdBLCAweEM0LCAweEFBLCAweEFGLCAweDgxLCAweEFGLCAweDgyLCAvKiAweDZDLTB4NkYgKi8KKwkweEFGLCAweDgzLCAweEFGLCAweDg0LCAweEFGLCAweDg1LCAweEFGLCAweDg2LCAvKiAweDcwLTB4NzMgKi8KKwkweEM0LCAweEFCLCAweEM0LCAweEFDLCAweEFGLCAweDg3LCAweEFGLCAweDg4LCAvKiAweDc0LTB4NzcgKi8KKwkweEM0LCAweEFELCAweEFGLCAweDg5LCAweEFGLCAweDhBLCAweEFGLCAweDhCLCAvKiAweDc4LTB4N0IgKi8KKwkweEM0LCAweEFFLCAweEFGLCAweDhDLCAweEFGLCAweDhELCAweEFGLCAweDhFLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEFGLCAweDhGLCAweEFGLCAweDkwLCAweEFGLCAweDkxLCAweEFGLCAweDkyLCAvKiAweDgwLTB4ODMgKi8KKwkweEM0LCAweEFGLCAweEM0LCAweEIwLCAweEFGLCAweDkzLCAweEM0LCAweEIxLCAvKiAweDg0LTB4ODcgKi8KKwkweEFGLCAweDk0LCAweEM0LCAweEIyLCAweEFGLCAweDk1LCAweEFGLCAweDk2LCAvKiAweDg4LTB4OEIgKi8KKwkweEFGLCAweDk3LCAweEFGLCAweDk4LCAweEFGLCAweDk5LCAweEFGLCAweDlBLCAvKiAweDhDLTB4OEYgKi8KKwkweEM0LCAweEIzLCAweEM0LCAweEI0LCAweEFGLCAweDlCLCAweEFGLCAweDlDLCAvKiAweDkwLTB4OTMgKi8KKwkweEM0LCAweEI1LCAweEFGLCAweDlELCAweEFGLCAweDlFLCAweEFGLCAweDlGLCAvKiAweDk0LTB4OTcgKi8KKwkweEM0LCAweEI2LCAweEFGLCAweEEwLCAweEIwLCAweDQxLCAweEIwLCAweDQyLCAvKiAweDk4LTB4OUIgKi8KKwkweEIwLCAweDQzLCAweEIwLCAweDQ0LCAweEIwLCAweDQ1LCAweEIwLCAweDQ2LCAvKiAweDlDLTB4OUYgKi8KKwkweEM0LCAweEI3LCAweEM0LCAweEI4LCAweEIwLCAweDQ3LCAweEM0LCAweEI5LCAvKiAweEEwLTB4QTMgKi8KKwkweEM0LCAweEJBLCAweEM0LCAweEJCLCAweEIwLCAweDQ4LCAweEIwLCAweDQ5LCAvKiAweEE0LTB4QTcgKi8KKwkweEIwLCAweDRBLCAweEIwLCAweDRCLCAweEIwLCAweDRDLCAweEIwLCAweDRELCAvKiAweEE4LTB4QUIgKi8KKwkweEM0LCAweEJDLCAweEM0LCAweEJELCAweEIwLCAweDRFLCAweEIwLCAweDRGLCAvKiAweEFDLTB4QUYgKi8KKwkweEIwLCAweDUwLCAweEIwLCAweDUxLCAweEIwLCAweDUyLCAweEIwLCAweDUzLCAvKiAweEIwLTB4QjMgKi8KKwkweEIwLCAweDU0LCAweEIwLCAweDU1LCAweEIwLCAweDU2LCAweEIwLCAweDU3LCAvKiAweEI0LTB4QjcgKi8KKwkweEIwLCAweDU4LCAweEIwLCAweDU5LCAweEIwLCAweDVBLCAweEIwLCAweDYxLCAvKiAweEI4LTB4QkIgKi8KKwkweEIwLCAweDYyLCAweEIwLCAweDYzLCAweEIwLCAweDY0LCAweEIwLCAweDY1LCAvKiAweEJDLTB4QkYgKi8KKwkweEIwLCAweDY2LCAweEM0LCAweEJFLCAweEIwLCAweDY3LCAweEIwLCAweDY4LCAvKiAweEMwLTB4QzMgKi8KKwkweEIwLCAweDY5LCAweEIwLCAweDZBLCAweEIwLCAweDZCLCAweEIwLCAweDZDLCAvKiAweEM0LTB4QzcgKi8KKwkweEIwLCAweDZELCAweEIwLCAweDZFLCAweEIwLCAweDZGLCAweEIwLCAweDcwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEIwLCAweDcxLCAweEIwLCAweDcyLCAweEIwLCAweDczLCAweEIwLCAweDc0LCAvKiAweENDLTB4Q0YgKi8KKwkweEIwLCAweDc1LCAweEIwLCAweDc2LCAweEIwLCAweDc3LCAweEIwLCAweDc4LCAvKiAweEQwLTB4RDMgKi8KKwkweEIwLCAweDc5LCAweEIwLCAweDdBLCAweEIwLCAweDgxLCAweEIwLCAweDgyLCAvKiAweEQ0LTB4RDcgKi8KKwkweEIwLCAweDgzLCAweEIwLCAweDg0LCAweEIwLCAweDg1LCAweEIwLCAweDg2LCAvKiAweEQ4LTB4REIgKi8KKwkweEIwLCAweDg3LCAweEIwLCAweDg4LCAweEIwLCAweDg5LCAweEIwLCAweDhBLCAvKiAweERDLTB4REYgKi8KKwkweEIwLCAweDhCLCAweEIwLCAweDhDLCAweEIwLCAweDhELCAweEIwLCAweDhFLCAvKiAweEUwLTB4RTMgKi8KKwkweEM0LCAweEJGLCAweEM0LCAweEMwLCAweEIwLCAweDhGLCAweEIwLCAweDkwLCAvKiAweEU0LTB4RTcgKi8KKwkweEM0LCAweEMxLCAweEIwLCAweDkxLCAweEIwLCAweDkyLCAweEM0LCAweEMyLCAvKiAweEU4LTB4RUIgKi8KKwkweEM0LCAweEMzLCAweEIwLCAweDkzLCAweEIwLCAweDk0LCAweEIwLCAweDk1LCAvKiAweEVDLTB4RUYgKi8KKwkweEIwLCAweDk2LCAweEIwLCAweDk3LCAweEIwLCAweDk4LCAweEIwLCAweDk5LCAvKiAweEYwLTB4RjMgKi8KKwkweEM0LCAweEM0LCAweEM0LCAweEM1LCAweEIwLCAweDlBLCAweEM0LCAweEM2LCAvKiAweEY0LTB4RjcgKi8KKwkweEM0LCAweEM3LCAweEM0LCAweEM4LCAweEIwLCAweDlCLCAweEIwLCAweDlDLCAvKiAweEY4LTB4RkIgKi8KKwkweEIwLCAweDlELCAweEIwLCAweDlFLCAweEIwLCAweDlGLCAweEIwLCAweEEwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19DRls1MTJdID0geworCTB4QzQsIDB4QzksIDB4QzQsIDB4Q0EsIDB4QjEsIDB4NDEsIDB4QjEsIDB4NDIsIC8qIDB4MDAtMHgwMyAqLworCTB4QzQsIDB4Q0IsIDB4QjEsIDB4NDMsIDB4QjEsIDB4NDQsIDB4QjEsIDB4NDUsIC8qIDB4MDQtMHgwNyAqLworCTB4QzQsIDB4Q0MsIDB4QjEsIDB4NDYsIDB4QjEsIDB4NDcsIDB4QjEsIDB4NDgsIC8qIDB4MDgtMHgwQiAqLworCTB4QjEsIDB4NDksIDB4QjEsIDB4NEEsIDB4QjEsIDB4NEIsIDB4QjEsIDB4NEMsIC8qIDB4MEMtMHgwRiAqLworCTB4QzQsIDB4Q0QsIDB4QzQsIDB4Q0UsIDB4QjEsIDB4NEQsIDB4QzQsIDB4Q0YsIC8qIDB4MTAtMHgxMyAqLworCTB4QjEsIDB4NEUsIDB4QzQsIDB4RDAsIDB4QjEsIDB4NEYsIDB4QjEsIDB4NTAsIC8qIDB4MTQtMHgxNyAqLworCTB4QjEsIDB4NTEsIDB4QjEsIDB4NTIsIDB4QjEsIDB4NTMsIDB4QjEsIDB4NTQsIC8qIDB4MTgtMHgxQiAqLworCTB4QzQsIDB4RDEsIDB4QjEsIDB4NTUsIDB4QjEsIDB4NTYsIDB4QjEsIDB4NTcsIC8qIDB4MUMtMHgxRiAqLworCTB4QzQsIDB4RDIsIDB4QjEsIDB4NTgsIDB4QjEsIDB4NTksIDB4QjEsIDB4NUEsIC8qIDB4MjAtMHgyMyAqLworCTB4QzQsIDB4RDMsIDB4QjEsIDB4NjEsIDB4QjEsIDB4NjIsIDB4QjEsIDB4NjMsIC8qIDB4MjQtMHgyNyAqLworCTB4QjEsIDB4NjQsIDB4QjEsIDB4NjUsIDB4QjEsIDB4NjYsIDB4QjEsIDB4NjcsIC8qIDB4MjgtMHgyQiAqLworCTB4QzQsIDB4RDQsIDB4QzQsIDB4RDUsIDB4QjEsIDB4NjgsIDB4QzQsIDB4RDYsIC8qIDB4MkMtMHgyRiAqLworCTB4QzQsIDB4RDcsIDB4QzQsIDB4RDgsIDB4QjEsIDB4NjksIDB4QjEsIDB4NkEsIC8qIDB4MzAtMHgzMyAqLworCTB4QjEsIDB4NkIsIDB4QjEsIDB4NkMsIDB4QjEsIDB4NkQsIDB4QjEsIDB4NkUsIC8qIDB4MzQtMHgzNyAqLworCTB4QzQsIDB4RDksIDB4QjEsIDB4NkYsIDB4QjEsIDB4NzAsIDB4QjEsIDB4NzEsIC8qIDB4MzgtMHgzQiAqLworCTB4QjEsIDB4NzIsIDB4QjEsIDB4NzMsIDB4QjEsIDB4NzQsIDB4QjEsIDB4NzUsIC8qIDB4M0MtMHgzRiAqLworCTB4QjEsIDB4NzYsIDB4QjEsIDB4NzcsIDB4QjEsIDB4NzgsIDB4QjEsIDB4NzksIC8qIDB4NDAtMHg0MyAqLworCTB4QjEsIDB4N0EsIDB4QjEsIDB4ODEsIDB4QjEsIDB4ODIsIDB4QjEsIDB4ODMsIC8qIDB4NDQtMHg0NyAqLworCTB4QjEsIDB4ODQsIDB4QjEsIDB4ODUsIDB4QjEsIDB4ODYsIDB4QjEsIDB4ODcsIC8qIDB4NDgtMHg0QiAqLworCTB4QjEsIDB4ODgsIDB4QjEsIDB4ODksIDB4QjEsIDB4OEEsIDB4QjEsIDB4OEIsIC8qIDB4NEMtMHg0RiAqLworCTB4QjEsIDB4OEMsIDB4QjEsIDB4OEQsIDB4QjEsIDB4OEUsIDB4QjEsIDB4OEYsIC8qIDB4NTAtMHg1MyAqLworCTB4QzQsIDB4REEsIDB4QzQsIDB4REIsIDB4QjEsIDB4OTAsIDB4QjEsIDB4OTEsIC8qIDB4NTQtMHg1NyAqLworCTB4QzQsIDB4REMsIDB4QjEsIDB4OTIsIDB4QjEsIDB4OTMsIDB4QjEsIDB4OTQsIC8qIDB4NTgtMHg1QiAqLworCTB4QzQsIDB4REQsIDB4QjEsIDB4OTUsIDB4QjEsIDB4OTYsIDB4QjEsIDB4OTcsIC8qIDB4NUMtMHg1RiAqLworCTB4QjEsIDB4OTgsIDB4QjEsIDB4OTksIDB4QjEsIDB4OUEsIDB4QjEsIDB4OUIsIC8qIDB4NjAtMHg2MyAqLworCTB4QzQsIDB4REUsIDB4QzQsIDB4REYsIDB4QjEsIDB4OUMsIDB4QzQsIDB4RTAsIC8qIDB4NjQtMHg2NyAqLworCTB4QjEsIDB4OUQsIDB4QzQsIDB4RTEsIDB4QjEsIDB4OUUsIDB4QjEsIDB4OUYsIC8qIDB4NjgtMHg2QiAqLworCTB4QjEsIDB4QTAsIDB4QjIsIDB4NDEsIDB4QjIsIDB4NDIsIDB4QjIsIDB4NDMsIC8qIDB4NkMtMHg2RiAqLworCTB4QzQsIDB4RTIsIDB4QzQsIDB4RTMsIDB4QjIsIDB4NDQsIDB4QjIsIDB4NDUsIC8qIDB4NzAtMHg3MyAqLworCTB4QzQsIDB4RTQsIDB4QjIsIDB4NDYsIDB4QjIsIDB4NDcsIDB4QjIsIDB4NDgsIC8qIDB4NzQtMHg3NyAqLworCTB4QzQsIDB4RTUsIDB4QjIsIDB4NDksIDB4QjIsIDB4NEEsIDB4QjIsIDB4NEIsIC8qIDB4NzgtMHg3QiAqLworCTB4QjIsIDB4NEMsIDB4QjIsIDB4NEQsIDB4QjIsIDB4NEUsIDB4QjIsIDB4NEYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QzQsIDB4RTYsIDB4QjIsIDB4NTAsIDB4QjIsIDB4NTEsIDB4QjIsIDB4NTIsIC8qIDB4ODAtMHg4MyAqLworCTB4QjIsIDB4NTMsIDB4QzQsIDB4RTcsIDB4QjIsIDB4NTQsIDB4QjIsIDB4NTUsIC8qIDB4ODQtMHg4NyAqLworCTB4QjIsIDB4NTYsIDB4QjIsIDB4NTcsIDB4QjIsIDB4NTgsIDB4QjIsIDB4NTksIC8qIDB4ODgtMHg4QiAqLworCTB4QzQsIDB4RTgsIDB4QjIsIDB4NUEsIDB4QjIsIDB4NjEsIDB4QjIsIDB4NjIsIC8qIDB4OEMtMHg4RiAqLworCTB4QjIsIDB4NjMsIDB4QjIsIDB4NjQsIDB4QjIsIDB4NjUsIDB4QjIsIDB4NjYsIC8qIDB4OTAtMHg5MyAqLworCTB4QjIsIDB4NjcsIDB4QjIsIDB4NjgsIDB4QjIsIDB4NjksIDB4QjIsIDB4NkEsIC8qIDB4OTQtMHg5NyAqLworCTB4QjIsIDB4NkIsIDB4QjIsIDB4NkMsIDB4QjIsIDB4NkQsIDB4QjIsIDB4NkUsIC8qIDB4OTgtMHg5QiAqLworCTB4QjIsIDB4NkYsIDB4QjIsIDB4NzAsIDB4QjIsIDB4NzEsIDB4QjIsIDB4NzIsIC8qIDB4OUMtMHg5RiAqLworCTB4QjIsIDB4NzMsIDB4QzQsIDB4RTksIDB4QjIsIDB4NzQsIDB4QjIsIDB4NzUsIC8qIDB4QTAtMHhBMyAqLworCTB4QjIsIDB4NzYsIDB4QjIsIDB4NzcsIDB4QjIsIDB4NzgsIDB4QjIsIDB4NzksIC8qIDB4QTQtMHhBNyAqLworCTB4QzQsIDB4RUEsIDB4QjIsIDB4N0EsIDB4QjIsIDB4ODEsIDB4QjIsIDB4ODIsIC8qIDB4QTgtMHhBQiAqLworCTB4QjIsIDB4ODMsIDB4QjIsIDB4ODQsIDB4QjIsIDB4ODUsIDB4QjIsIDB4ODYsIC8qIDB4QUMtMHhBRiAqLworCTB4QzQsIDB4RUIsIDB4QjIsIDB4ODcsIDB4QjIsIDB4ODgsIDB4QjIsIDB4ODksIC8qIDB4QjAtMHhCMyAqLworCTB4QjIsIDB4OEEsIDB4QjIsIDB4OEIsIDB4QjIsIDB4OEMsIDB4QjIsIDB4OEQsIC8qIDB4QjQtMHhCNyAqLworCTB4QjIsIDB4OEUsIDB4QjIsIDB4OEYsIDB4QjIsIDB4OTAsIDB4QjIsIDB4OTEsIC8qIDB4QjgtMHhCQiAqLworCTB4QjIsIDB4OTIsIDB4QjIsIDB4OTMsIDB4QjIsIDB4OTQsIDB4QjIsIDB4OTUsIC8qIDB4QkMtMHhCRiAqLworCTB4QjIsIDB4OTYsIDB4QjIsIDB4OTcsIDB4QjIsIDB4OTgsIDB4QjIsIDB4OTksIC8qIDB4QzAtMHhDMyAqLworCTB4QzQsIDB4RUMsIDB4QjIsIDB4OUEsIDB4QjIsIDB4OUIsIDB4QjIsIDB4OUMsIC8qIDB4QzQtMHhDNyAqLworCTB4QjIsIDB4OUQsIDB4QjIsIDB4OUUsIDB4QjIsIDB4OUYsIDB4QjIsIDB4QTAsIC8qIDB4QzgtMHhDQiAqLworCTB4QjMsIDB4NDEsIDB4QjMsIDB4NDIsIDB4QjMsIDB4NDMsIDB4QjMsIDB4NDQsIC8qIDB4Q0MtMHhDRiAqLworCTB4QjMsIDB4NDUsIDB4QjMsIDB4NDYsIDB4QjMsIDB4NDcsIDB4QjMsIDB4NDgsIC8qIDB4RDAtMHhEMyAqLworCTB4QjMsIDB4NDksIDB4QjMsIDB4NEEsIDB4QjMsIDB4NEIsIDB4QjMsIDB4NEMsIC8qIDB4RDQtMHhENyAqLworCTB4QjMsIDB4NEQsIDB4QjMsIDB4NEUsIDB4QjMsIDB4NEYsIDB4QjMsIDB4NTAsIC8qIDB4RDgtMHhEQiAqLworCTB4QjMsIDB4NTEsIDB4QjMsIDB4NTIsIDB4QjMsIDB4NTMsIDB4QjMsIDB4NTQsIC8qIDB4REMtMHhERiAqLworCTB4QzQsIDB4RUQsIDB4QzQsIDB4RUUsIDB4QjMsIDB4NTUsIDB4QjMsIDB4NTYsIC8qIDB4RTAtMHhFMyAqLworCTB4QzQsIDB4RUYsIDB4QjMsIDB4NTcsIDB4QjMsIDB4NTgsIDB4QjMsIDB4NTksIC8qIDB4RTQtMHhFNyAqLworCTB4QzQsIDB4RjAsIDB4QjMsIDB4NUEsIDB4QjMsIDB4NjEsIDB4QjMsIDB4NjIsIC8qIDB4RTgtMHhFQiAqLworCTB4QjMsIDB4NjMsIDB4QjMsIDB4NjQsIDB4QjMsIDB4NjUsIDB4QjMsIDB4NjYsIC8qIDB4RUMtMHhFRiAqLworCTB4QzQsIDB4RjEsIDB4QzQsIDB4RjIsIDB4QjMsIDB4NjcsIDB4QzQsIDB4RjMsIC8qIDB4RjAtMHhGMyAqLworCTB4QjMsIDB4NjgsIDB4QzQsIDB4RjQsIDB4QjMsIDB4NjksIDB4QjMsIDB4NkEsIC8qIDB4RjQtMHhGNyAqLworCTB4QjMsIDB4NkIsIDB4QjMsIDB4NkMsIDB4QjMsIDB4NkQsIDB4QjMsIDB4NkUsIC8qIDB4RjgtMHhGQiAqLworCTB4QzQsIDB4RjUsIDB4QjMsIDB4NkYsIDB4QjMsIDB4NzAsIDB4QjMsIDB4NzEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0QwWzUxMl0gPSB7CisJMHhDNCwgMHhGNiwgMHhCMywgMHg3MiwgMHhCMywgMHg3MywgMHhCMywgMHg3NCwgLyogMHgwMC0weDAzICovCisJMHhDNCwgMHhGNywgMHhCMywgMHg3NSwgMHhCMywgMHg3NiwgMHhCMywgMHg3NywgLyogMHgwNC0weDA3ICovCisJMHhCMywgMHg3OCwgMHhCMywgMHg3OSwgMHhCMywgMHg3QSwgMHhCMywgMHg4MSwgLyogMHgwOC0weDBCICovCisJMHhCMywgMHg4MiwgMHhCMywgMHg4MywgMHhCMywgMHg4NCwgMHhCMywgMHg4NSwgLyogMHgwQy0weDBGICovCisJMHhCMywgMHg4NiwgMHhDNCwgMHhGOCwgMHhCMywgMHg4NywgMHhCMywgMHg4OCwgLyogMHgxMC0weDEzICovCisJMHhCMywgMHg4OSwgMHhCMywgMHg4QSwgMHhCMywgMHg4QiwgMHhCMywgMHg4QywgLyogMHgxNC0weDE3ICovCisJMHhDNCwgMHhGOSwgMHhCMywgMHg4RCwgMHhCMywgMHg4RSwgMHhCMywgMHg4RiwgLyogMHgxOC0weDFCICovCisJMHhCMywgMHg5MCwgMHhCMywgMHg5MSwgMHhCMywgMHg5MiwgMHhCMywgMHg5MywgLyogMHgxQy0weDFGICovCisJMHhCMywgMHg5NCwgMHhCMywgMHg5NSwgMHhCMywgMHg5NiwgMHhCMywgMHg5NywgLyogMHgyMC0weDIzICovCisJMHhCMywgMHg5OCwgMHhCMywgMHg5OSwgMHhCMywgMHg5QSwgMHhCMywgMHg5QiwgLyogMHgyNC0weDI3ICovCisJMHhCMywgMHg5QywgMHhCMywgMHg5RCwgMHhCMywgMHg5RSwgMHhCMywgMHg5RiwgLyogMHgyOC0weDJCICovCisJMHhCMywgMHhBMCwgMHhDNCwgMHhGQSwgMHhCNCwgMHg0MSwgMHhCNCwgMHg0MiwgLyogMHgyQy0weDJGICovCisJMHhCNCwgMHg0MywgMHhCNCwgMHg0NCwgMHhCNCwgMHg0NSwgMHhCNCwgMHg0NiwgLyogMHgzMC0weDMzICovCisJMHhDNCwgMHhGQiwgMHhDNCwgMHhGQywgMHhCNCwgMHg0NywgMHhCNCwgMHg0OCwgLyogMHgzNC0weDM3ICovCisJMHhDNCwgMHhGRCwgMHhCNCwgMHg0OSwgMHhCNCwgMHg0QSwgMHhCNCwgMHg0QiwgLyogMHgzOC0weDNCICovCisJMHhDNCwgMHhGRSwgMHhCNCwgMHg0QywgMHhCNCwgMHg0RCwgMHhCNCwgMHg0RSwgLyogMHgzQy0weDNGICovCisJMHhCNCwgMHg0RiwgMHhCNCwgMHg1MCwgMHhCNCwgMHg1MSwgMHhCNCwgMHg1MiwgLyogMHg0MC0weDQzICovCisJMHhDNSwgMHhBMSwgMHhDNSwgMHhBMiwgMHhCNCwgMHg1MywgMHhDNSwgMHhBMywgLyogMHg0NC0weDQ3ICovCisJMHhCNCwgMHg1NCwgMHhDNSwgMHhBNCwgMHhCNCwgMHg1NSwgMHhCNCwgMHg1NiwgLyogMHg0OC0weDRCICovCisJMHhCNCwgMHg1NywgMHhCNCwgMHg1OCwgMHhCNCwgMHg1OSwgMHhCNCwgMHg1QSwgLyogMHg0Qy0weDRGICovCisJMHhDNSwgMHhBNSwgMHhCNCwgMHg2MSwgMHhCNCwgMHg2MiwgMHhCNCwgMHg2MywgLyogMHg1MC0weDUzICovCisJMHhDNSwgMHhBNiwgMHhCNCwgMHg2NCwgMHhCNCwgMHg2NSwgMHhCNCwgMHg2NiwgLyogMHg1NC0weDU3ICovCisJMHhDNSwgMHhBNywgMHhCNCwgMHg2NywgMHhCNCwgMHg2OCwgMHhCNCwgMHg2OSwgLyogMHg1OC0weDVCICovCisJMHhCNCwgMHg2QSwgMHhCNCwgMHg2QiwgMHhCNCwgMHg2QywgMHhCNCwgMHg2RCwgLyogMHg1Qy0weDVGICovCisJMHhDNSwgMHhBOCwgMHhCNCwgMHg2RSwgMHhCNCwgMHg2RiwgMHhCNCwgMHg3MCwgLyogMHg2MC0weDYzICovCisJMHhCNCwgMHg3MSwgMHhCNCwgMHg3MiwgMHhCNCwgMHg3MywgMHhCNCwgMHg3NCwgLyogMHg2NC0weDY3ICovCisJMHhCNCwgMHg3NSwgMHhCNCwgMHg3NiwgMHhCNCwgMHg3NywgMHhCNCwgMHg3OCwgLyogMHg2OC0weDZCICovCisJMHhDNSwgMHhBOSwgMHhDNSwgMHhBQSwgMHhCNCwgMHg3OSwgMHhCNCwgMHg3QSwgLyogMHg2Qy0weDZGICovCisJMHhDNSwgMHhBQiwgMHhCNCwgMHg4MSwgMHhCNCwgMHg4MiwgMHhCNCwgMHg4MywgLyogMHg3MC0weDczICovCisJMHhDNSwgMHhBQywgMHhCNCwgMHg4NCwgMHhCNCwgMHg4NSwgMHhCNCwgMHg4NiwgLyogMHg3NC0weDc3ICovCisJMHhCNCwgMHg4NywgMHhCNCwgMHg4OCwgMHhCNCwgMHg4OSwgMHhCNCwgMHg4QSwgLyogMHg3OC0weDdCICovCisJMHhDNSwgMHhBRCwgMHhDNSwgMHhBRSwgMHhCNCwgMHg4QiwgMHhCNCwgMHg4QywgLyogMHg3Qy0weDdGICovCisJCisJMHhCNCwgMHg4RCwgMHhDNSwgMHhBRiwgMHhCNCwgMHg4RSwgMHhCNCwgMHg4RiwgLyogMHg4MC0weDgzICovCisJMHhCNCwgMHg5MCwgMHhCNCwgMHg5MSwgMHhCNCwgMHg5MiwgMHhCNCwgMHg5MywgLyogMHg4NC0weDg3ICovCisJMHhCNCwgMHg5NCwgMHhCNCwgMHg5NSwgMHhCNCwgMHg5NiwgMHhCNCwgMHg5NywgLyogMHg4OC0weDhCICovCisJMHhCNCwgMHg5OCwgMHhCNCwgMHg5OSwgMHhCNCwgMHg5QSwgMHhCNCwgMHg5QiwgLyogMHg4Qy0weDhGICovCisJMHhCNCwgMHg5QywgMHhCNCwgMHg5RCwgMHhCNCwgMHg5RSwgMHhCNCwgMHg5RiwgLyogMHg5MC0weDkzICovCisJMHhCNCwgMHhBMCwgMHhCNSwgMHg0MSwgMHhCNSwgMHg0MiwgMHhCNSwgMHg0MywgLyogMHg5NC0weDk3ICovCisJMHhCNSwgMHg0NCwgMHhCNSwgMHg0NSwgMHhCNSwgMHg0NiwgMHhCNSwgMHg0NywgLyogMHg5OC0weDlCICovCisJMHhCNSwgMHg0OCwgMHhCNSwgMHg0OSwgMHhCNSwgMHg0QSwgMHhCNSwgMHg0QiwgLyogMHg5Qy0weDlGICovCisJMHhCNSwgMHg0QywgMHhCNSwgMHg0RCwgMHhCNSwgMHg0RSwgMHhCNSwgMHg0RiwgLyogMHhBMC0weEEzICovCisJMHhDNSwgMHhCMCwgMHhDNSwgMHhCMSwgMHhCNSwgMHg1MCwgMHhCNSwgMHg1MSwgLyogMHhBNC0weEE3ICovCisJMHhDNSwgMHhCMiwgMHhCNSwgMHg1MiwgMHhCNSwgMHg1MywgMHhCNSwgMHg1NCwgLyogMHhBOC0weEFCICovCisJMHhDNSwgMHhCMywgMHhCNSwgMHg1NSwgMHhCNSwgMHg1NiwgMHhCNSwgMHg1NywgLyogMHhBQy0weEFGICovCisJMHhCNSwgMHg1OCwgMHhCNSwgMHg1OSwgMHhCNSwgMHg1QSwgMHhCNSwgMHg2MSwgLyogMHhCMC0weEIzICovCisJMHhDNSwgMHhCNCwgMHhDNSwgMHhCNSwgMHhCNSwgMHg2MiwgMHhDNSwgMHhCNiwgLyogMHhCNC0weEI3ICovCisJMHhCNSwgMHg2MywgMHhDNSwgMHhCNywgMHhCNSwgMHg2NCwgMHhCNSwgMHg2NSwgLyogMHhCOC0weEJCICovCisJMHhCNSwgMHg2NiwgMHhCNSwgMHg2NywgMHhCNSwgMHg2OCwgMHhCNSwgMHg2OSwgLyogMHhCQy0weEJGICovCisJMHhDNSwgMHhCOCwgMHhDNSwgMHhCOSwgMHhCNSwgMHg2QSwgMHhCNSwgMHg2QiwgLyogMHhDMC0weEMzICovCisJMHhDNSwgMHhCQSwgMHhCNSwgMHg2QywgMHhCNSwgMHg2RCwgMHhCNSwgMHg2RSwgLyogMHhDNC0weEM3ICovCisJMHhDNSwgMHhCQiwgMHhDNSwgMHhCQywgMHhCNSwgMHg2RiwgMHhCNSwgMHg3MCwgLyogMHhDOC0weENCICovCisJMHhCNSwgMHg3MSwgMHhCNSwgMHg3MiwgMHhCNSwgMHg3MywgMHhCNSwgMHg3NCwgLyogMHhDQy0weENGICovCisJMHhDNSwgMHhCRCwgMHhDNSwgMHhCRSwgMHhCNSwgMHg3NSwgMHhDNSwgMHhCRiwgLyogMHhEMC0weEQzICovCisJMHhDNSwgMHhDMCwgMHhDNSwgMHhDMSwgMHhCNSwgMHg3NiwgMHhCNSwgMHg3NywgLyogMHhENC0weEQ3ICovCisJMHhCNSwgMHg3OCwgMHhCNSwgMHg3OSwgMHhCNSwgMHg3QSwgMHhCNSwgMHg4MSwgLyogMHhEOC0weERCICovCisJMHhDNSwgMHhDMiwgMHhDNSwgMHhDMywgMHhCNSwgMHg4MiwgMHhCNSwgMHg4MywgLyogMHhEQy0weERGICovCisJMHhDNSwgMHhDNCwgMHhCNSwgMHg4NCwgMHhCNSwgMHg4NSwgMHhCNSwgMHg4NiwgLyogMHhFMC0weEUzICovCisJMHhDNSwgMHhDNSwgMHhCNSwgMHg4NywgMHhCNSwgMHg4OCwgMHhCNSwgMHg4OSwgLyogMHhFNC0weEU3ICovCisJMHhCNSwgMHg4QSwgMHhCNSwgMHg4QiwgMHhCNSwgMHg4QywgMHhCNSwgMHg4RCwgLyogMHhFOC0weEVCICovCisJMHhDNSwgMHhDNiwgMHhDNSwgMHhDNywgMHhCNSwgMHg4RSwgMHhDNSwgMHhDOCwgLyogMHhFQy0weEVGICovCisJMHhDNSwgMHhDOSwgMHhDNSwgMHhDQSwgMHhCNSwgMHg4RiwgMHhCNSwgMHg5MCwgLyogMHhGMC0weEYzICovCisJMHhCNSwgMHg5MSwgMHhCNSwgMHg5MiwgMHhCNSwgMHg5MywgMHhCNSwgMHg5NCwgLyogMHhGNC0weEY3ICovCisJMHhDNSwgMHhDQiwgMHhCNSwgMHg5NSwgMHhCNSwgMHg5NiwgMHhCNSwgMHg5NywgLyogMHhGOC0weEZCICovCisJMHhCNSwgMHg5OCwgMHhCNSwgMHg5OSwgMHhCNSwgMHg5QSwgMHhCNSwgMHg5QiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfRDFbNTEyXSA9IHsKKwkweEI1LCAweDlDLCAweEI1LCAweDlELCAweEI1LCAweDlFLCAweEI1LCAweDlGLCAvKiAweDAwLTB4MDMgKi8KKwkweEI1LCAweEEwLCAweEI2LCAweDQxLCAweEI2LCAweDQyLCAweEI2LCAweDQzLCAvKiAweDA0LTB4MDcgKi8KKwkweEI2LCAweDQ0LCAweEI2LCAweDQ1LCAweEI2LCAweDQ2LCAweEI2LCAweDQ3LCAvKiAweDA4LTB4MEIgKi8KKwkweEI2LCAweDQ4LCAweEM1LCAweENDLCAweEI2LCAweDQ5LCAweEI2LCAweDRBLCAvKiAweDBDLTB4MEYgKi8KKwkweEI2LCAweDRCLCAweEI2LCAweDRDLCAweEI2LCAweDRELCAweEI2LCAweDRFLCAvKiAweDEwLTB4MTMgKi8KKwkweEI2LCAweDRGLCAweEI2LCAweDUwLCAweEI2LCAweDUxLCAweEI2LCAweDUyLCAvKiAweDE0LTB4MTcgKi8KKwkweEI2LCAweDUzLCAweEI2LCAweDU0LCAweEI2LCAweDU1LCAweEI2LCAweDU2LCAvKiAweDE4LTB4MUIgKi8KKwkweEI2LCAweDU3LCAweEI2LCAweDU4LCAweEI2LCAweDU5LCAweEI2LCAweDVBLCAvKiAweDFDLTB4MUYgKi8KKwkweEI2LCAweDYxLCAweEI2LCAweDYyLCAweEI2LCAweDYzLCAweEI2LCAweDY0LCAvKiAweDIwLTB4MjMgKi8KKwkweEI2LCAweDY1LCAweEI2LCAweDY2LCAweEI2LCAweDY3LCAweEI2LCAweDY4LCAvKiAweDI0LTB4MjcgKi8KKwkweEI2LCAweDY5LCAweEI2LCAweDZBLCAweEI2LCAweDZCLCAweEI2LCAweDZDLCAvKiAweDI4LTB4MkIgKi8KKwkweEI2LCAweDZELCAweEI2LCAweDZFLCAweEI2LCAweDZGLCAweEI2LCAweDcwLCAvKiAweDJDLTB4MkYgKi8KKwkweEM1LCAweENELCAweEM1LCAweENFLCAweEI2LCAweDcxLCAweEI2LCAweDcyLCAvKiAweDMwLTB4MzMgKi8KKwkweEM1LCAweENGLCAweEI2LCAweDczLCAweEI2LCAweDc0LCAweEI2LCAweDc1LCAvKiAweDM0LTB4MzcgKi8KKwkweEM1LCAweEQwLCAweEI2LCAweDc2LCAweEM1LCAweEQxLCAweEI2LCAweDc3LCAvKiAweDM4LTB4M0IgKi8KKwkweEI2LCAweDc4LCAweEI2LCAweDc5LCAweEI2LCAweDdBLCAweEI2LCAweDgxLCAvKiAweDNDLTB4M0YgKi8KKwkweEM1LCAweEQyLCAweEM1LCAweEQzLCAweEI2LCAweDgyLCAweEM1LCAweEQ0LCAvKiAweDQwLTB4NDMgKi8KKwkweEM1LCAweEQ1LCAweEM1LCAweEQ2LCAweEI2LCAweDgzLCAweEI2LCAweDg0LCAvKiAweDQ0LTB4NDcgKi8KKwkweEI2LCAweDg1LCAweEI2LCAweDg2LCAweEI2LCAweDg3LCAweEI2LCAweDg4LCAvKiAweDQ4LTB4NEIgKi8KKwkweEM1LCAweEQ3LCAweEM1LCAweEQ4LCAweEI2LCAweDg5LCAweEI2LCAweDhBLCAvKiAweDRDLTB4NEYgKi8KKwkweEM1LCAweEQ5LCAweEI2LCAweDhCLCAweEI2LCAweDhDLCAweEI2LCAweDhELCAvKiAweDUwLTB4NTMgKi8KKwkweEM1LCAweERBLCAweEI2LCAweDhFLCAweEI2LCAweDhGLCAweEI2LCAweDkwLCAvKiAweDU0LTB4NTcgKi8KKwkweEI2LCAweDkxLCAweEI2LCAweDkyLCAweEI2LCAweDkzLCAweEI2LCAweDk0LCAvKiAweDU4LTB4NUIgKi8KKwkweEM1LCAweERCLCAweEM1LCAweERDLCAweEI2LCAweDk1LCAweEM1LCAweERELCAvKiAweDVDLTB4NUYgKi8KKwkweEI2LCAweDk2LCAweEM1LCAweERFLCAweEI2LCAweDk3LCAweEI2LCAweDk4LCAvKiAweDYwLTB4NjMgKi8KKwkweEI2LCAweDk5LCAweEI2LCAweDlBLCAweEI2LCAweDlCLCAweEI2LCAweDlDLCAvKiAweDY0LTB4NjcgKi8KKwkweEM1LCAweERGLCAweEI2LCAweDlELCAweEI2LCAweDlFLCAweEI2LCAweDlGLCAvKiAweDY4LTB4NkIgKi8KKwkweEM1LCAweEUwLCAweEI2LCAweEEwLCAweEI3LCAweDQxLCAweEI3LCAweDQyLCAvKiAweDZDLTB4NkYgKi8KKwkweEI3LCAweDQzLCAweEI3LCAweDQ0LCAweEI3LCAweDQ1LCAweEI3LCAweDQ2LCAvKiAweDcwLTB4NzMgKi8KKwkweEI3LCAweDQ3LCAweEI3LCAweDQ4LCAweEI3LCAweDQ5LCAweEI3LCAweDRBLCAvKiAweDc0LTB4NzcgKi8KKwkweEI3LCAweDRCLCAweEI3LCAweDRDLCAweEI3LCAweDRELCAweEI3LCAweDRFLCAvKiAweDc4LTB4N0IgKi8KKwkweEM1LCAweEUxLCAweEI3LCAweDRGLCAweEI3LCAweDUwLCAweEI3LCAweDUxLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEI3LCAweDUyLCAweEI3LCAweDUzLCAweEI3LCAweDU0LCAweEI3LCAweDU1LCAvKiAweDgwLTB4ODMgKi8KKwkweEM1LCAweEUyLCAweEI3LCAweDU2LCAweEI3LCAweDU3LCAweEI3LCAweDU4LCAvKiAweDg0LTB4ODcgKi8KKwkweEM1LCAweEUzLCAweEI3LCAweDU5LCAweEI3LCAweDVBLCAweEI3LCAweDYxLCAvKiAweDg4LTB4OEIgKi8KKwkweEI3LCAweDYyLCAweEI3LCAweDYzLCAweEI3LCAweDY0LCAweEI3LCAweDY1LCAvKiAweDhDLTB4OEYgKi8KKwkweEI3LCAweDY2LCAweEI3LCAweDY3LCAweEI3LCAweDY4LCAweEI3LCAweDY5LCAvKiAweDkwLTB4OTMgKi8KKwkweEI3LCAweDZBLCAweEI3LCAweDZCLCAweEI3LCAweDZDLCAweEI3LCAweDZELCAvKiAweDk0LTB4OTcgKi8KKwkweEI3LCAweDZFLCAweEI3LCAweDZGLCAweEI3LCAweDcwLCAweEI3LCAweDcxLCAvKiAweDk4LTB4OUIgKi8KKwkweEI3LCAweDcyLCAweEI3LCAweDczLCAweEI3LCAweDc0LCAweEI3LCAweDc1LCAvKiAweDlDLTB4OUYgKi8KKwkweEM1LCAweEU0LCAweEM1LCAweEU1LCAweEI3LCAweDc2LCAweEI3LCAweDc3LCAvKiAweEEwLTB4QTMgKi8KKwkweEM1LCAweEU2LCAweEI3LCAweDc4LCAweEI3LCAweDc5LCAweEI3LCAweDdBLCAvKiAweEE0LTB4QTcgKi8KKwkweEM1LCAweEU3LCAweEI3LCAweDgxLCAweEI3LCAweDgyLCAweEI3LCAweDgzLCAvKiAweEE4LTB4QUIgKi8KKwkweEI3LCAweDg0LCAweEI3LCAweDg1LCAweEI3LCAweDg2LCAweEI3LCAweDg3LCAvKiAweEFDLTB4QUYgKi8KKwkweEM1LCAweEU4LCAweEM1LCAweEU5LCAweEI3LCAweDg4LCAweEM1LCAweEVBLCAvKiAweEIwLTB4QjMgKi8KKwkweEI3LCAweDg5LCAweEM1LCAweEVCLCAweEI3LCAweDhBLCAweEI3LCAweDhCLCAvKiAweEI0LTB4QjcgKi8KKwkweEI3LCAweDhDLCAweEI3LCAweDhELCAweEM1LCAweEVDLCAweEI3LCAweDhFLCAvKiAweEI4LTB4QkIgKi8KKwkweEM1LCAweEVELCAweEI3LCAweDhGLCAweEI3LCAweDkwLCAweEI3LCAweDkxLCAvKiAweEJDLTB4QkYgKi8KKwkweEM1LCAweEVFLCAweEI3LCAweDkyLCAweEI3LCAweDkzLCAweEI3LCAweDk0LCAvKiAweEMwLTB4QzMgKi8KKwkweEI3LCAweDk1LCAweEI3LCAweDk2LCAweEI3LCAweDk3LCAweEI3LCAweDk4LCAvKiAweEM0LTB4QzcgKi8KKwkweEI3LCAweDk5LCAweEI3LCAweDlBLCAweEI3LCAweDlCLCAweEI3LCAweDlDLCAvKiAweEM4LTB4Q0IgKi8KKwkweEI3LCAweDlELCAweEI3LCAweDlFLCAweEI3LCAweDlGLCAweEI3LCAweEEwLCAvKiAweENDLTB4Q0YgKi8KKwkweEI4LCAweDQxLCAweEI4LCAweDQyLCAweEI4LCAweDQzLCAweEI4LCAweDQ0LCAvKiAweEQwLTB4RDMgKi8KKwkweEI4LCAweDQ1LCAweEI4LCAweDQ2LCAweEI4LCAweDQ3LCAweEI4LCAweDQ4LCAvKiAweEQ0LTB4RDcgKi8KKwkweEM1LCAweEVGLCAweEI4LCAweDQ5LCAweEI4LCAweDRBLCAweEI4LCAweDRCLCAvKiAweEQ4LTB4REIgKi8KKwkweEI4LCAweDRDLCAweEI4LCAweDRELCAweEI4LCAweDRFLCAweEI4LCAweDRGLCAvKiAweERDLTB4REYgKi8KKwkweEI4LCAweDUwLCAweEI4LCAweDUxLCAweEI4LCAweDUyLCAweEI4LCAweDUzLCAvKiAweEUwLTB4RTMgKi8KKwkweEI4LCAweDU0LCAweEI4LCAweDU1LCAweEI4LCAweDU2LCAweEI4LCAweDU3LCAvKiAweEU0LTB4RTcgKi8KKwkweEI4LCAweDU4LCAweEI4LCAweDU5LCAweEI4LCAweDVBLCAweEI4LCAweDYxLCAvKiAweEU4LTB4RUIgKi8KKwkweEI4LCAweDYyLCAweEI4LCAweDYzLCAweEI4LCAweDY0LCAweEI4LCAweDY1LCAvKiAweEVDLTB4RUYgKi8KKwkweEI4LCAweDY2LCAweEI4LCAweDY3LCAweEI4LCAweDY4LCAweEI4LCAweDY5LCAvKiAweEYwLTB4RjMgKi8KKwkweEM1LCAweEYwLCAweEI4LCAweDZBLCAweEI4LCAweDZCLCAweEI4LCAweDZDLCAvKiAweEY0LTB4RjcgKi8KKwkweEM1LCAweEYxLCAweEI4LCAweDZELCAweEI4LCAweDZFLCAweEI4LCAweDZGLCAvKiAweEY4LTB4RkIgKi8KKwkweEI4LCAweDcwLCAweEI4LCAweDcxLCAweEI4LCAweDcyLCAweEI4LCAweDczLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19EMls1MTJdID0geworCTB4QjgsIDB4NzQsIDB4QjgsIDB4NzUsIDB4QjgsIDB4NzYsIDB4QjgsIDB4NzcsIC8qIDB4MDAtMHgwMyAqLworCTB4QjgsIDB4NzgsIDB4QjgsIDB4NzksIDB4QjgsIDB4N0EsIDB4QzUsIDB4RjIsIC8qIDB4MDQtMHgwNyAqLworCTB4QjgsIDB4ODEsIDB4QzUsIDB4RjMsIDB4QjgsIDB4ODIsIDB4QjgsIDB4ODMsIC8qIDB4MDgtMHgwQiAqLworCTB4QjgsIDB4ODQsIDB4QjgsIDB4ODUsIDB4QjgsIDB4ODYsIDB4QjgsIDB4ODcsIC8qIDB4MEMtMHgwRiAqLworCTB4QzUsIDB4RjQsIDB4QjgsIDB4ODgsIDB4QjgsIDB4ODksIDB4QjgsIDB4OEEsIC8qIDB4MTAtMHgxMyAqLworCTB4QjgsIDB4OEIsIDB4QjgsIDB4OEMsIDB4QjgsIDB4OEQsIDB4QjgsIDB4OEUsIC8qIDB4MTQtMHgxNyAqLworCTB4QjgsIDB4OEYsIDB4QjgsIDB4OTAsIDB4QjgsIDB4OTEsIDB4QjgsIDB4OTIsIC8qIDB4MTgtMHgxQiAqLworCTB4QjgsIDB4OTMsIDB4QjgsIDB4OTQsIDB4QjgsIDB4OTUsIDB4QjgsIDB4OTYsIC8qIDB4MUMtMHgxRiAqLworCTB4QjgsIDB4OTcsIDB4QjgsIDB4OTgsIDB4QjgsIDB4OTksIDB4QjgsIDB4OUEsIC8qIDB4MjAtMHgyMyAqLworCTB4QjgsIDB4OUIsIDB4QjgsIDB4OUMsIDB4QjgsIDB4OUQsIDB4QjgsIDB4OUUsIC8qIDB4MjQtMHgyNyAqLworCTB4QjgsIDB4OUYsIDB4QjgsIDB4QTAsIDB4QjksIDB4NDEsIDB4QjksIDB4NDIsIC8qIDB4MjgtMHgyQiAqLworCTB4QzUsIDB4RjUsIDB4QzUsIDB4RjYsIDB4QjksIDB4NDMsIDB4QjksIDB4NDQsIC8qIDB4MkMtMHgyRiAqLworCTB4QzUsIDB4RjcsIDB4QjksIDB4NDUsIDB4QjksIDB4NDYsIDB4QjksIDB4NDcsIC8qIDB4MzAtMHgzMyAqLworCTB4QzUsIDB4RjgsIDB4QjksIDB4NDgsIDB4QjksIDB4NDksIDB4QjksIDB4NEEsIC8qIDB4MzQtMHgzNyAqLworCTB4QjksIDB4NEIsIDB4QjksIDB4NEMsIDB4QjksIDB4NEQsIDB4QjksIDB4NEUsIC8qIDB4MzgtMHgzQiAqLworCTB4QzUsIDB4RjksIDB4QzUsIDB4RkEsIDB4QjksIDB4NEYsIDB4QzUsIDB4RkIsIC8qIDB4M0MtMHgzRiAqLworCTB4QjksIDB4NTAsIDB4QzUsIDB4RkMsIDB4QjksIDB4NTEsIDB4QjksIDB4NTIsIC8qIDB4NDAtMHg0MyAqLworCTB4QjksIDB4NTMsIDB4QjksIDB4NTQsIDB4QjksIDB4NTUsIDB4QjksIDB4NTYsIC8qIDB4NDQtMHg0NyAqLworCTB4QzUsIDB4RkQsIDB4QjksIDB4NTcsIDB4QjksIDB4NTgsIDB4QjksIDB4NTksIC8qIDB4NDgtMHg0QiAqLworCTB4QjksIDB4NUEsIDB4QjksIDB4NjEsIDB4QjksIDB4NjIsIDB4QjksIDB4NjMsIC8qIDB4NEMtMHg0RiAqLworCTB4QjksIDB4NjQsIDB4QjksIDB4NjUsIDB4QjksIDB4NjYsIDB4QjksIDB4NjcsIC8qIDB4NTAtMHg1MyAqLworCTB4QjksIDB4NjgsIDB4QjksIDB4NjksIDB4QjksIDB4NkEsIDB4QjksIDB4NkIsIC8qIDB4NTQtMHg1NyAqLworCTB4QjksIDB4NkMsIDB4QjksIDB4NkQsIDB4QjksIDB4NkUsIDB4QjksIDB4NkYsIC8qIDB4NTgtMHg1QiAqLworCTB4QzUsIDB4RkUsIDB4QjksIDB4NzAsIDB4QjksIDB4NzEsIDB4QjksIDB4NzIsIC8qIDB4NUMtMHg1RiAqLworCTB4QjksIDB4NzMsIDB4QjksIDB4NzQsIDB4QjksIDB4NzUsIDB4QjksIDB4NzYsIC8qIDB4NjAtMHg2MyAqLworCTB4QzYsIDB4QTEsIDB4QjksIDB4NzcsIDB4QjksIDB4NzgsIDB4QjksIDB4NzksIC8qIDB4NjQtMHg2NyAqLworCTB4QjksIDB4N0EsIDB4QjksIDB4ODEsIDB4QjksIDB4ODIsIDB4QjksIDB4ODMsIC8qIDB4NjgtMHg2QiAqLworCTB4QjksIDB4ODQsIDB4QjksIDB4ODUsIDB4QjksIDB4ODYsIDB4QjksIDB4ODcsIC8qIDB4NkMtMHg2RiAqLworCTB4QjksIDB4ODgsIDB4QjksIDB4ODksIDB4QjksIDB4OEEsIDB4QjksIDB4OEIsIC8qIDB4NzAtMHg3MyAqLworCTB4QjksIDB4OEMsIDB4QjksIDB4OEQsIDB4QjksIDB4OEUsIDB4QjksIDB4OEYsIC8qIDB4NzQtMHg3NyAqLworCTB4QjksIDB4OTAsIDB4QjksIDB4OTEsIDB4QjksIDB4OTIsIDB4QjksIDB4OTMsIC8qIDB4NzgtMHg3QiAqLworCTB4QjksIDB4OTQsIDB4QjksIDB4OTUsIDB4QjksIDB4OTYsIDB4QjksIDB4OTcsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QzYsIDB4QTIsIDB4QzYsIDB4QTMsIDB4QjksIDB4OTgsIDB4QjksIDB4OTksIC8qIDB4ODAtMHg4MyAqLworCTB4QzYsIDB4QTQsIDB4QjksIDB4OUEsIDB4QjksIDB4OUIsIDB4QjksIDB4OUMsIC8qIDB4ODQtMHg4NyAqLworCTB4QzYsIDB4QTUsIDB4QjksIDB4OUQsIDB4QjksIDB4OUUsIDB4QjksIDB4OUYsIC8qIDB4ODgtMHg4QiAqLworCTB4QjksIDB4QTAsIDB4QkEsIDB4NDEsIDB4QkEsIDB4NDIsIDB4QkEsIDB4NDMsIC8qIDB4OEMtMHg4RiAqLworCTB4QzYsIDB4QTYsIDB4QzYsIDB4QTcsIDB4QkEsIDB4NDQsIDB4QkEsIDB4NDUsIC8qIDB4OTAtMHg5MyAqLworCTB4QkEsIDB4NDYsIDB4QzYsIDB4QTgsIDB4QkEsIDB4NDcsIDB4QkEsIDB4NDgsIC8qIDB4OTQtMHg5NyAqLworCTB4QkEsIDB4NDksIDB4QkEsIDB4NEEsIDB4QkEsIDB4NEIsIDB4QkEsIDB4NEMsIC8qIDB4OTgtMHg5QiAqLworCTB4QzYsIDB4QTksIDB4QkEsIDB4NEQsIDB4QkEsIDB4NEUsIDB4QkEsIDB4NEYsIC8qIDB4OUMtMHg5RiAqLworCTB4QzYsIDB4QUEsIDB4QkEsIDB4NTAsIDB4QkEsIDB4NTEsIDB4QkEsIDB4NTIsIC8qIDB4QTAtMHhBMyAqLworCTB4QzYsIDB4QUIsIDB4QkEsIDB4NTMsIDB4QkEsIDB4NTQsIDB4QkEsIDB4NTUsIC8qIDB4QTQtMHhBNyAqLworCTB4QkEsIDB4NTYsIDB4QkEsIDB4NTcsIDB4QkEsIDB4NTgsIDB4QkEsIDB4NTksIC8qIDB4QTgtMHhBQiAqLworCTB4QzYsIDB4QUMsIDB4QkEsIDB4NUEsIDB4QkEsIDB4NjEsIDB4QkEsIDB4NjIsIC8qIDB4QUMtMHhBRiAqLworCTB4QkEsIDB4NjMsIDB4QzYsIDB4QUQsIDB4QkEsIDB4NjQsIDB4QkEsIDB4NjUsIC8qIDB4QjAtMHhCMyAqLworCTB4QkEsIDB4NjYsIDB4QkEsIDB4NjcsIDB4QkEsIDB4NjgsIDB4QkEsIDB4NjksIC8qIDB4QjQtMHhCNyAqLworCTB4QzYsIDB4QUUsIDB4QzYsIDB4QUYsIDB4QkEsIDB4NkEsIDB4QkEsIDB4NkIsIC8qIDB4QjgtMHhCQiAqLworCTB4QzYsIDB4QjAsIDB4QkEsIDB4NkMsIDB4QkEsIDB4NkQsIDB4QzYsIDB4QjEsIC8qIDB4QkMtMHhCRiAqLworCTB4QzYsIDB4QjIsIDB4QkEsIDB4NkUsIDB4QzYsIDB4QjMsIDB4QkEsIDB4NkYsIC8qIDB4QzAtMHhDMyAqLworCTB4QkEsIDB4NzAsIDB4QkEsIDB4NzEsIDB4QkEsIDB4NzIsIDB4QkEsIDB4NzMsIC8qIDB4QzQtMHhDNyAqLworCTB4QzYsIDB4QjQsIDB4QzYsIDB4QjUsIDB4QkEsIDB4NzQsIDB4QzYsIDB4QjYsIC8qIDB4QzgtMHhDQiAqLworCTB4QkEsIDB4NzUsIDB4QkEsIDB4NzYsIDB4QkEsIDB4NzcsIDB4QkEsIDB4NzgsIC8qIDB4Q0MtMHhDRiAqLworCTB4QkEsIDB4NzksIDB4QkEsIDB4N0EsIDB4QkEsIDB4ODEsIDB4QkEsIDB4ODIsIC8qIDB4RDAtMHhEMyAqLworCTB4QzYsIDB4QjcsIDB4QkEsIDB4ODMsIDB4QkEsIDB4ODQsIDB4QkEsIDB4ODUsIC8qIDB4RDQtMHhENyAqLworCTB4QzYsIDB4QjgsIDB4QkEsIDB4ODYsIDB4QkEsIDB4ODcsIDB4QkEsIDB4ODgsIC8qIDB4RDgtMHhEQiAqLworCTB4QzYsIDB4QjksIDB4QkEsIDB4ODksIDB4QkEsIDB4OEEsIDB4QkEsIDB4OEIsIC8qIDB4REMtMHhERiAqLworCTB4QkEsIDB4OEMsIDB4QkEsIDB4OEQsIDB4QkEsIDB4OEUsIDB4QkEsIDB4OEYsIC8qIDB4RTAtMHhFMyAqLworCTB4QzYsIDB4QkEsIDB4QzYsIDB4QkIsIDB4QkEsIDB4OTAsIDB4QkEsIDB4OTEsIC8qIDB4RTQtMHhFNyAqLworCTB4QkEsIDB4OTIsIDB4QkEsIDB4OTMsIDB4QkEsIDB4OTQsIDB4QkEsIDB4OTUsIC8qIDB4RTgtMHhFQiAqLworCTB4QkEsIDB4OTYsIDB4QkEsIDB4OTcsIDB4QkEsIDB4OTgsIDB4QkEsIDB4OTksIC8qIDB4RUMtMHhFRiAqLworCTB4QzYsIDB4QkMsIDB4QzYsIDB4QkQsIDB4QkEsIDB4OUEsIDB4QkEsIDB4OUIsIC8qIDB4RjAtMHhGMyAqLworCTB4QzYsIDB4QkUsIDB4QkEsIDB4OUMsIDB4QkEsIDB4OUQsIDB4QkEsIDB4OUUsIC8qIDB4RjQtMHhGNyAqLworCTB4QzYsIDB4QkYsIDB4QkEsIDB4OUYsIDB4QkEsIDB4QTAsIDB4QkIsIDB4NDEsIC8qIDB4RjgtMHhGQiAqLworCTB4QkIsIDB4NDIsIDB4QkIsIDB4NDMsIDB4QkIsIDB4NDQsIDB4QkIsIDB4NDUsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0QzWzUxMl0gPSB7CisJMHhDNiwgMHhDMCwgMHhDNiwgMHhDMSwgMHhCQiwgMHg0NiwgMHhDNiwgMHhDMiwgLyogMHgwMC0weDAzICovCisJMHhCQiwgMHg0NywgMHhDNiwgMHhDMywgMHhCQiwgMHg0OCwgMHhCQiwgMHg0OSwgLyogMHgwNC0weDA3ICovCisJMHhCQiwgMHg0QSwgMHhCQiwgMHg0QiwgMHhCQiwgMHg0QywgMHhCQiwgMHg0RCwgLyogMHgwOC0weDBCICovCisJMHhDNiwgMHhDNCwgMHhDNiwgMHhDNSwgMHhDNiwgMHhDNiwgMHhCQiwgMHg0RSwgLyogMHgwQy0weDBGICovCisJMHhDNiwgMHhDNywgMHhCQiwgMHg0RiwgMHhCQiwgMHg1MCwgMHhCQiwgMHg1MSwgLyogMHgxMC0weDEzICovCisJMHhDNiwgMHhDOCwgMHhCQiwgMHg1MiwgMHhDNiwgMHhDOSwgMHhCQiwgMHg1MywgLyogMHgxNC0weDE3ICovCisJMHhCQiwgMHg1NCwgMHhCQiwgMHg1NSwgMHhCQiwgMHg1NiwgMHhCQiwgMHg1NywgLyogMHgxOC0weDFCICovCisJMHhDNiwgMHhDQSwgMHhDNiwgMHhDQiwgMHhCQiwgMHg1OCwgMHhDNiwgMHhDQywgLyogMHgxQy0weDFGICovCisJMHhDNiwgMHhDRCwgMHhDNiwgMHhDRSwgMHhCQiwgMHg1OSwgMHhCQiwgMHg1QSwgLyogMHgyMC0weDIzICovCisJMHhCQiwgMHg2MSwgMHhDNiwgMHhDRiwgMHhCQiwgMHg2MiwgMHhCQiwgMHg2MywgLyogMHgyNC0weDI3ICovCisJMHhDNiwgMHhEMCwgMHhDNiwgMHhEMSwgMHhCQiwgMHg2NCwgMHhCQiwgMHg2NSwgLyogMHgyOC0weDJCICovCisJMHhDNiwgMHhEMiwgMHhCQiwgMHg2NiwgMHhCQiwgMHg2NywgMHhCQiwgMHg2OCwgLyogMHgyQy0weDJGICovCisJMHhDNiwgMHhEMywgMHhCQiwgMHg2OSwgMHhCQiwgMHg2QSwgMHhCQiwgMHg2QiwgLyogMHgzMC0weDMzICovCisJMHhCQiwgMHg2QywgMHhCQiwgMHg2RCwgMHhCQiwgMHg2RSwgMHhCQiwgMHg2RiwgLyogMHgzNC0weDM3ICovCisJMHhDNiwgMHhENCwgMHhDNiwgMHhENSwgMHhCQiwgMHg3MCwgMHhDNiwgMHhENiwgLyogMHgzOC0weDNCICovCisJMHhDNiwgMHhENywgMHhDNiwgMHhEOCwgMHhCQiwgMHg3MSwgMHhCQiwgMHg3MiwgLyogMHgzQy0weDNGICovCisJMHhCQiwgMHg3MywgMHhCQiwgMHg3NCwgMHhCQiwgMHg3NSwgMHhCQiwgMHg3NiwgLyogMHg0MC0weDQzICovCisJMHhDNiwgMHhEOSwgMHhDNiwgMHhEQSwgMHhCQiwgMHg3NywgMHhCQiwgMHg3OCwgLyogMHg0NC0weDQ3ICovCisJMHhCQiwgMHg3OSwgMHhCQiwgMHg3QSwgMHhCQiwgMHg4MSwgMHhCQiwgMHg4MiwgLyogMHg0OC0weDRCICovCisJMHhCQiwgMHg4MywgMHhCQiwgMHg4NCwgMHhCQiwgMHg4NSwgMHhCQiwgMHg4NiwgLyogMHg0Qy0weDRGICovCisJMHhCQiwgMHg4NywgMHhCQiwgMHg4OCwgMHhCQiwgMHg4OSwgMHhCQiwgMHg4QSwgLyogMHg1MC0weDUzICovCisJMHhCQiwgMHg4QiwgMHhCQiwgMHg4QywgMHhCQiwgMHg4RCwgMHhCQiwgMHg4RSwgLyogMHg1NC0weDU3ICovCisJMHhCQiwgMHg4RiwgMHhCQiwgMHg5MCwgMHhCQiwgMHg5MSwgMHhCQiwgMHg5MiwgLyogMHg1OC0weDVCICovCisJMHhCQiwgMHg5MywgMHhCQiwgMHg5NCwgMHhCQiwgMHg5NSwgMHhCQiwgMHg5NiwgLyogMHg1Qy0weDVGICovCisJMHhCQiwgMHg5NywgMHhCQiwgMHg5OCwgMHhCQiwgMHg5OSwgMHhCQiwgMHg5QSwgLyogMHg2MC0weDYzICovCisJMHhCQiwgMHg5QiwgMHhCQiwgMHg5QywgMHhCQiwgMHg5RCwgMHhCQiwgMHg5RSwgLyogMHg2NC0weDY3ICovCisJMHhCQiwgMHg5RiwgMHhCQiwgMHhBMCwgMHhCQywgMHg0MSwgMHhCQywgMHg0MiwgLyogMHg2OC0weDZCICovCisJMHhCQywgMHg0MywgMHhCQywgMHg0NCwgMHhCQywgMHg0NSwgMHhCQywgMHg0NiwgLyogMHg2Qy0weDZGICovCisJMHhCQywgMHg0NywgMHhCQywgMHg0OCwgMHhCQywgMHg0OSwgMHhCQywgMHg0QSwgLyogMHg3MC0weDczICovCisJMHhCQywgMHg0QiwgMHhCQywgMHg0QywgMHhCQywgMHg0RCwgMHhCQywgMHg0RSwgLyogMHg3NC0weDc3ICovCisJMHhCQywgMHg0RiwgMHhCQywgMHg1MCwgMHhCQywgMHg1MSwgMHhCQywgMHg1MiwgLyogMHg3OC0weDdCICovCisJMHhDNiwgMHhEQiwgMHhDNiwgMHhEQywgMHhCQywgMHg1MywgMHhCQywgMHg1NCwgLyogMHg3Qy0weDdGICovCisJCisJMHhDNiwgMHhERCwgMHhCQywgMHg1NSwgMHhCQywgMHg1NiwgMHhCQywgMHg1NywgLyogMHg4MC0weDgzICovCisJMHhDNiwgMHhERSwgMHhCQywgMHg1OCwgMHhCQywgMHg1OSwgMHhCQywgMHg1QSwgLyogMHg4NC0weDg3ICovCisJMHhCQywgMHg2MSwgMHhCQywgMHg2MiwgMHhCQywgMHg2MywgMHhCQywgMHg2NCwgLyogMHg4OC0weDhCICovCisJMHhDNiwgMHhERiwgMHhDNiwgMHhFMCwgMHhCQywgMHg2NSwgMHhDNiwgMHhFMSwgLyogMHg4Qy0weDhGICovCisJMHhDNiwgMHhFMiwgMHhDNiwgMHhFMywgMHhCQywgMHg2NiwgMHhCQywgMHg2NywgLyogMHg5MC0weDkzICovCisJMHhCQywgMHg2OCwgMHhCQywgMHg2OSwgMHhCQywgMHg2QSwgMHhCQywgMHg2QiwgLyogMHg5NC0weDk3ICovCisJMHhDNiwgMHhFNCwgMHhDNiwgMHhFNSwgMHhCQywgMHg2QywgMHhCQywgMHg2RCwgLyogMHg5OC0weDlCICovCisJMHhDNiwgMHhFNiwgMHhCQywgMHg2RSwgMHhCQywgMHg2RiwgMHhCQywgMHg3MCwgLyogMHg5Qy0weDlGICovCisJMHhDNiwgMHhFNywgMHhCQywgMHg3MSwgMHhCQywgMHg3MiwgMHhCQywgMHg3MywgLyogMHhBMC0weEEzICovCisJMHhCQywgMHg3NCwgMHhCQywgMHg3NSwgMHhCQywgMHg3NiwgMHhCQywgMHg3NywgLyogMHhBNC0weEE3ICovCisJMHhDNiwgMHhFOCwgMHhDNiwgMHhFOSwgMHhCQywgMHg3OCwgMHhDNiwgMHhFQSwgLyogMHhBOC0weEFCICovCisJMHhCQywgMHg3OSwgMHhDNiwgMHhFQiwgMHhCQywgMHg3QSwgMHhCQywgMHg4MSwgLyogMHhBQy0weEFGICovCisJMHhCQywgMHg4MiwgMHhCQywgMHg4MywgMHhCQywgMHg4NCwgMHhCQywgMHg4NSwgLyogMHhCMC0weEIzICovCisJMHhDNiwgMHhFQywgMHhCQywgMHg4NiwgMHhCQywgMHg4NywgMHhCQywgMHg4OCwgLyogMHhCNC0weEI3ICovCisJMHhDNiwgMHhFRCwgMHhCQywgMHg4OSwgMHhCQywgMHg4QSwgMHhCQywgMHg4QiwgLyogMHhCOC0weEJCICovCisJMHhDNiwgMHhFRSwgMHhCQywgMHg4QywgMHhCQywgMHg4RCwgMHhCQywgMHg4RSwgLyogMHhCQy0weEJGICovCisJMHhCQywgMHg4RiwgMHhCQywgMHg5MCwgMHhCQywgMHg5MSwgMHhCQywgMHg5MiwgLyogMHhDMC0weEMzICovCisJMHhDNiwgMHhFRiwgMHhDNiwgMHhGMCwgMHhCQywgMHg5MywgMHhCQywgMHg5NCwgLyogMHhDNC0weEM3ICovCisJMHhDNiwgMHhGMSwgMHhDNiwgMHhGMiwgMHhCQywgMHg5NSwgMHhCQywgMHg5NiwgLyogMHhDOC0weENCICovCisJMHhCQywgMHg5NywgMHhCQywgMHg5OCwgMHhCQywgMHg5OSwgMHhCQywgMHg5QSwgLyogMHhDQy0weENGICovCisJMHhDNiwgMHhGMywgMHhCQywgMHg5QiwgMHhCQywgMHg5QywgMHhCQywgMHg5RCwgLyogMHhEMC0weEQzICovCisJMHhCQywgMHg5RSwgMHhCQywgMHg5RiwgMHhCQywgMHhBMCwgMHhCRCwgMHg0MSwgLyogMHhENC0weEQ3ICovCisJMHhDNiwgMHhGNCwgMHhCRCwgMHg0MiwgMHhCRCwgMHg0MywgMHhCRCwgMHg0NCwgLyogMHhEOC0weERCICovCisJMHhCRCwgMHg0NSwgMHhCRCwgMHg0NiwgMHhCRCwgMHg0NywgMHhCRCwgMHg0OCwgLyogMHhEQy0weERGICovCisJMHhCRCwgMHg0OSwgMHhDNiwgMHhGNSwgMHhCRCwgMHg0QSwgMHhDNiwgMHhGNiwgLyogMHhFMC0weEUzICovCisJMHhCRCwgMHg0QiwgMHhCRCwgMHg0QywgMHhCRCwgMHg0RCwgMHhCRCwgMHg0RSwgLyogMHhFNC0weEU3ICovCisJMHhCRCwgMHg0RiwgMHhCRCwgMHg1MCwgMHhCRCwgMHg1MSwgMHhCRCwgMHg1MiwgLyogMHhFOC0weEVCICovCisJMHhDNiwgMHhGNywgMHhDNiwgMHhGOCwgMHhCRCwgMHg1MywgMHhCRCwgMHg1NCwgLyogMHhFQy0weEVGICovCisJMHhDNiwgMHhGOSwgMHhCRCwgMHg1NSwgMHhCRCwgMHg1NiwgMHhCRCwgMHg1NywgLyogMHhGMC0weEYzICovCisJMHhDNiwgMHhGQSwgMHhCRCwgMHg1OCwgMHhCRCwgMHg1OSwgMHhCRCwgMHg1QSwgLyogMHhGNC0weEY3ICovCisJMHhCRCwgMHg2MSwgMHhCRCwgMHg2MiwgMHhCRCwgMHg2MywgMHhCRCwgMHg2NCwgLyogMHhGOC0weEZCICovCisJMHhDNiwgMHhGQiwgMHhDNiwgMHhGQywgMHhCRCwgMHg2NSwgMHhDNiwgMHhGRCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfRDRbNTEyXSA9IHsKKwkweEJELCAweDY2LCAweEM2LCAweEZFLCAweEJELCAweDY3LCAweEJELCAweDY4LCAvKiAweDAwLTB4MDMgKi8KKwkweEJELCAweDY5LCAweEJELCAweDZBLCAweEJELCAweDZCLCAweEJELCAweDZDLCAvKiAweDA0LTB4MDcgKi8KKwkweEM3LCAweEExLCAweEJELCAweDZELCAweEJELCAweDZFLCAweEJELCAweDZGLCAvKiAweDA4LTB4MEIgKi8KKwkweEJELCAweDcwLCAweEJELCAweDcxLCAweEJELCAweDcyLCAweEJELCAweDczLCAvKiAweDBDLTB4MEYgKi8KKwkweEJELCAweDc0LCAweEJELCAweDc1LCAweEJELCAweDc2LCAweEJELCAweDc3LCAvKiAweDEwLTB4MTMgKi8KKwkweEJELCAweDc4LCAweEJELCAweDc5LCAweEJELCAweDdBLCAweEJELCAweDgxLCAvKiAweDE0LTB4MTcgKi8KKwkweEJELCAweDgyLCAweEJELCAweDgzLCAweEJELCAweDg0LCAweEJELCAweDg1LCAvKiAweDE4LTB4MUIgKi8KKwkweEJELCAweDg2LCAweEM3LCAweEEyLCAweEJELCAweDg3LCAweEJELCAweDg4LCAvKiAweDFDLTB4MUYgKi8KKwkweEJELCAweDg5LCAweEJELCAweDhBLCAweEJELCAweDhCLCAweEJELCAweDhDLCAvKiAweDIwLTB4MjMgKi8KKwkweEJELCAweDhELCAweEJELCAweDhFLCAweEJELCAweDhGLCAweEJELCAweDkwLCAvKiAweDI0LTB4MjcgKi8KKwkweEJELCAweDkxLCAweEJELCAweDkyLCAweEJELCAweDkzLCAweEJELCAweDk0LCAvKiAweDI4LTB4MkIgKi8KKwkweEJELCAweDk1LCAweEJELCAweDk2LCAweEJELCAweDk3LCAweEJELCAweDk4LCAvKiAweDJDLTB4MkYgKi8KKwkweEJELCAweDk5LCAweEJELCAweDlBLCAweEJELCAweDlCLCAweEJELCAweDlDLCAvKiAweDMwLTB4MzMgKi8KKwkweEJELCAweDlELCAweEJELCAweDlFLCAweEJELCAweDlGLCAweEJELCAweEEwLCAvKiAweDM0LTB4MzcgKi8KKwkweEJFLCAweDQxLCAweEJFLCAweDQyLCAweEJFLCAweDQzLCAweEJFLCAweDQ0LCAvKiAweDM4LTB4M0IgKi8KKwkweEJFLCAweDQ1LCAweEJFLCAweDQ2LCAweEJFLCAweDQ3LCAweEJFLCAweDQ4LCAvKiAweDNDLTB4M0YgKi8KKwkweEM3LCAweEEzLCAweEJFLCAweDQ5LCAweEJFLCAweDRBLCAweEJFLCAweDRCLCAvKiAweDQwLTB4NDMgKi8KKwkweEM3LCAweEE0LCAweEJFLCAweDRDLCAweEJFLCAweDRELCAweEJFLCAweDRFLCAvKiAweDQ0LTB4NDcgKi8KKwkweEJFLCAweDRGLCAweEJFLCAweDUwLCAweEJFLCAweDUxLCAweEJFLCAweDUyLCAvKiAweDQ4LTB4NEIgKi8KKwkweEJFLCAweDUzLCAweEJFLCAweDU0LCAweEJFLCAweDU1LCAweEJFLCAweDU2LCAvKiAweDRDLTB4NEYgKi8KKwkweEJFLCAweDU3LCAweEJFLCAweDU4LCAweEJFLCAweDU5LCAweEJFLCAweDVBLCAvKiAweDUwLTB4NTMgKi8KKwkweEJFLCAweDYxLCAweEJFLCAweDYyLCAweEJFLCAweDYzLCAweEJFLCAweDY0LCAvKiAweDU0LTB4NTcgKi8KKwkweEJFLCAweDY1LCAweEJFLCAweDY2LCAweEJFLCAweDY3LCAweEJFLCAweDY4LCAvKiAweDU4LTB4NUIgKi8KKwkweEM3LCAweEE1LCAweEJFLCAweDY5LCAweEJFLCAweDZBLCAweEJFLCAweDZCLCAvKiAweDVDLTB4NUYgKi8KKwkweEM3LCAweEE2LCAweEJFLCAweDZDLCAweEJFLCAweDZELCAweEJFLCAweDZFLCAvKiAweDYwLTB4NjMgKi8KKwkweEM3LCAweEE3LCAweEJFLCAweDZGLCAweEJFLCAweDcwLCAweEJFLCAweDcxLCAvKiAweDY0LTB4NjcgKi8KKwkweEJFLCAweDcyLCAweEJFLCAweDczLCAweEJFLCAweDc0LCAweEJFLCAweDc1LCAvKiAweDY4LTB4NkIgKi8KKwkweEJFLCAweDc2LCAweEM3LCAweEE4LCAweEJFLCAweDc3LCAweEM3LCAweEE5LCAvKiAweDZDLTB4NkYgKi8KKwkweEJFLCAweDc4LCAweEJFLCAweDc5LCAweEJFLCAweDdBLCAweEJFLCAweDgxLCAvKiAweDcwLTB4NzMgKi8KKwkweEJFLCAweDgyLCAweEJFLCAweDgzLCAweEJFLCAweDg0LCAweEJFLCAweDg1LCAvKiAweDc0LTB4NzcgKi8KKwkweEM3LCAweEFBLCAweEM3LCAweEFCLCAweEJFLCAweDg2LCAweEJFLCAweDg3LCAvKiAweDc4LTB4N0IgKi8KKwkweEM3LCAweEFDLCAweEJFLCAweDg4LCAweEJFLCAweDg5LCAweEM3LCAweEFELCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEM3LCAweEFFLCAweEJFLCAweDhBLCAweEM3LCAweEFGLCAweEJFLCAweDhCLCAvKiAweDgwLTB4ODMgKi8KKwkweEJFLCAweDhDLCAweEJFLCAweDhELCAweEJFLCAweDhFLCAweEJFLCAweDhGLCAvKiAweDg0LTB4ODcgKi8KKwkweEM3LCAweEIwLCAweEM3LCAweEIxLCAweEJFLCAweDkwLCAweEM3LCAweEIyLCAvKiAweDg4LTB4OEIgKi8KKwkweEJFLCAweDkxLCAweEM3LCAweEIzLCAweEJFLCAweDkyLCAweEJFLCAweDkzLCAvKiAweDhDLTB4OEYgKi8KKwkweEJFLCAweDk0LCAweEJFLCAweDk1LCAweEJFLCAweDk2LCAweEJFLCAweDk3LCAvKiAweDkwLTB4OTMgKi8KKwkweEM3LCAweEI0LCAweEJFLCAweDk4LCAweEJFLCAweDk5LCAweEJFLCAweDlBLCAvKiAweDk0LTB4OTcgKi8KKwkweEJFLCAweDlCLCAweEJFLCAweDlDLCAweEJFLCAweDlELCAweEJFLCAweDlFLCAvKiAweDk4LTB4OUIgKi8KKwkweEJFLCAweDlGLCAweEJFLCAweEEwLCAweEJGLCAweDQxLCAweEJGLCAweDQyLCAvKiAweDlDLTB4OUYgKi8KKwkweEJGLCAweDQzLCAweEJGLCAweDQ0LCAweEJGLCAweDQ1LCAweEJGLCAweDQ2LCAvKiAweEEwLTB4QTMgKi8KKwkweEJGLCAweDQ3LCAweEJGLCAweDQ4LCAweEJGLCAweDQ5LCAweEJGLCAweDRBLCAvKiAweEE0LTB4QTcgKi8KKwkweEJGLCAweDRCLCAweEM3LCAweEI1LCAweEJGLCAweDRDLCAweEJGLCAweDRELCAvKiAweEE4LTB4QUIgKi8KKwkweEJGLCAweDRFLCAweEJGLCAweDRGLCAweEJGLCAweDUwLCAweEJGLCAweDUxLCAvKiAweEFDLTB4QUYgKi8KKwkweEJGLCAweDUyLCAweEJGLCAweDUzLCAweEJGLCAweDU0LCAweEJGLCAweDU1LCAvKiAweEIwLTB4QjMgKi8KKwkweEJGLCAweDU2LCAweEJGLCAweDU3LCAweEJGLCAweDU4LCAweEJGLCAweDU5LCAvKiAweEI0LTB4QjcgKi8KKwkweEJGLCAweDVBLCAweEJGLCAweDYxLCAweEJGLCAweDYyLCAweEJGLCAweDYzLCAvKiAweEI4LTB4QkIgKi8KKwkweEJGLCAweDY0LCAweEJGLCAweDY1LCAweEJGLCAweDY2LCAweEJGLCAweDY3LCAvKiAweEJDLTB4QkYgKi8KKwkweEJGLCAweDY4LCAweEJGLCAweDY5LCAweEJGLCAweDZBLCAweEJGLCAweDZCLCAvKiAweEMwLTB4QzMgKi8KKwkweEJGLCAweDZDLCAweEJGLCAweDZELCAweEJGLCAweDZFLCAweEJGLCAweDZGLCAvKiAweEM0LTB4QzcgKi8KKwkweEJGLCAweDcwLCAweEJGLCAweDcxLCAweEJGLCAweDcyLCAweEJGLCAweDczLCAvKiAweEM4LTB4Q0IgKi8KKwkweEM3LCAweEI2LCAweEJGLCAweDc0LCAweEJGLCAweDc1LCAweEJGLCAweDc2LCAvKiAweENDLTB4Q0YgKi8KKwkweEM3LCAweEI3LCAweEJGLCAweDc3LCAweEJGLCAweDc4LCAweEJGLCAweDc5LCAvKiAweEQwLTB4RDMgKi8KKwkweEM3LCAweEI4LCAweEJGLCAweDdBLCAweEJGLCAweDgxLCAweEJGLCAweDgyLCAvKiAweEQ0LTB4RDcgKi8KKwkweEJGLCAweDgzLCAweEJGLCAweDg0LCAweEJGLCAweDg1LCAweEJGLCAweDg2LCAvKiAweEQ4LTB4REIgKi8KKwkweEM3LCAweEI5LCAweEJGLCAweDg3LCAweEJGLCAweDg4LCAweEM3LCAweEJBLCAvKiAweERDLTB4REYgKi8KKwkweEJGLCAweDg5LCAweEJGLCAweDhBLCAweEJGLCAweDhCLCAweEJGLCAweDhDLCAvKiAweEUwLTB4RTMgKi8KKwkweEJGLCAweDhELCAweEJGLCAweDhFLCAweEJGLCAweDhGLCAweEJGLCAweDkwLCAvKiAweEU0LTB4RTcgKi8KKwkweEM3LCAweEJCLCAweEJGLCAweDkxLCAweEJGLCAweDkyLCAweEJGLCAweDkzLCAvKiAweEU4LTB4RUIgKi8KKwkweEM3LCAweEJDLCAweEJGLCAweDk0LCAweEJGLCAweDk1LCAweEJGLCAweDk2LCAvKiAweEVDLTB4RUYgKi8KKwkweEM3LCAweEJELCAweEJGLCAweDk3LCAweEJGLCAweDk4LCAweEJGLCAweDk5LCAvKiAweEYwLTB4RjMgKi8KKwkweEJGLCAweDlBLCAweEJGLCAweDlCLCAweEJGLCAweDlDLCAweEJGLCAweDlELCAvKiAweEY0LTB4RjcgKi8KKwkweEM3LCAweEJFLCAweEJGLCAweDlFLCAweEJGLCAweDlGLCAweEM3LCAweEJGLCAvKiAweEY4LTB4RkIgKi8KKwkweEJGLCAweEEwLCAweEM3LCAweEMwLCAweEMwLCAweDQxLCAweEMwLCAweDQyLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19ENVs1MTJdID0geworCTB4QzAsIDB4NDMsIDB4QzAsIDB4NDQsIDB4QzAsIDB4NDUsIDB4QzAsIDB4NDYsIC8qIDB4MDAtMHgwMyAqLworCTB4QzcsIDB4QzEsIDB4QzAsIDB4NDcsIDB4QzAsIDB4NDgsIDB4QzAsIDB4NDksIC8qIDB4MDQtMHgwNyAqLworCTB4QzcsIDB4QzIsIDB4QzAsIDB4NEEsIDB4QzAsIDB4NEIsIDB4QzAsIDB4NEMsIC8qIDB4MDgtMHgwQiAqLworCTB4QzcsIDB4QzMsIDB4QzAsIDB4NEQsIDB4QzAsIDB4NEUsIDB4QzAsIDB4NEYsIC8qIDB4MEMtMHgwRiAqLworCTB4QzAsIDB4NTAsIDB4QzAsIDB4NTEsIDB4QzAsIDB4NTIsIDB4QzAsIDB4NTMsIC8qIDB4MTAtMHgxMyAqLworCTB4QzcsIDB4QzQsIDB4QzcsIDB4QzUsIDB4QzAsIDB4NTQsIDB4QzcsIDB4QzYsIC8qIDB4MTQtMHgxNyAqLworCTB4QzAsIDB4NTUsIDB4QzAsIDB4NTYsIDB4QzAsIDB4NTcsIDB4QzAsIDB4NTgsIC8qIDB4MTgtMHgxQiAqLworCTB4QzAsIDB4NTksIDB4QzAsIDB4NUEsIDB4QzAsIDB4NjEsIDB4QzAsIDB4NjIsIC8qIDB4MUMtMHgxRiAqLworCTB4QzAsIDB4NjMsIDB4QzAsIDB4NjQsIDB4QzAsIDB4NjUsIDB4QzAsIDB4NjYsIC8qIDB4MjAtMHgyMyAqLworCTB4QzAsIDB4NjcsIDB4QzAsIDB4NjgsIDB4QzAsIDB4NjksIDB4QzAsIDB4NkEsIC8qIDB4MjQtMHgyNyAqLworCTB4QzAsIDB4NkIsIDB4QzAsIDB4NkMsIDB4QzAsIDB4NkQsIDB4QzAsIDB4NkUsIC8qIDB4MjgtMHgyQiAqLworCTB4QzAsIDB4NkYsIDB4QzAsIDB4NzAsIDB4QzAsIDB4NzEsIDB4QzAsIDB4NzIsIC8qIDB4MkMtMHgyRiAqLworCTB4QzAsIDB4NzMsIDB4QzAsIDB4NzQsIDB4QzAsIDB4NzUsIDB4QzAsIDB4NzYsIC8qIDB4MzAtMHgzMyAqLworCTB4QzAsIDB4NzcsIDB4QzAsIDB4NzgsIDB4QzAsIDB4NzksIDB4QzAsIDB4N0EsIC8qIDB4MzQtMHgzNyAqLworCTB4QzAsIDB4ODEsIDB4QzAsIDB4ODIsIDB4QzAsIDB4ODMsIDB4QzAsIDB4ODQsIC8qIDB4MzgtMHgzQiAqLworCTB4QzcsIDB4QzcsIDB4QzcsIDB4QzgsIDB4QzAsIDB4ODUsIDB4QzAsIDB4ODYsIC8qIDB4M0MtMHgzRiAqLworCTB4QzcsIDB4QzksIDB4QzAsIDB4ODcsIDB4QzAsIDB4ODgsIDB4QzAsIDB4ODksIC8qIDB4NDAtMHg0MyAqLworCTB4QzcsIDB4Q0EsIDB4QzAsIDB4OEEsIDB4QzAsIDB4OEIsIDB4QzAsIDB4OEMsIC8qIDB4NDQtMHg0NyAqLworCTB4QzAsIDB4OEQsIDB4QzAsIDB4OEUsIDB4QzAsIDB4OEYsIDB4QzAsIDB4OTAsIC8qIDB4NDgtMHg0QiAqLworCTB4QzcsIDB4Q0IsIDB4QzcsIDB4Q0MsIDB4QzAsIDB4OTEsIDB4QzcsIDB4Q0QsIC8qIDB4NEMtMHg0RiAqLworCTB4QzAsIDB4OTIsIDB4QzcsIDB4Q0UsIDB4QzAsIDB4OTMsIDB4QzAsIDB4OTQsIC8qIDB4NTAtMHg1MyAqLworCTB4QzAsIDB4OTUsIDB4QzAsIDB4OTYsIDB4QzAsIDB4OTcsIDB4QzAsIDB4OTgsIC8qIDB4NTQtMHg1NyAqLworCTB4QzcsIDB4Q0YsIDB4QzcsIDB4RDAsIDB4QzAsIDB4OTksIDB4QzAsIDB4OUEsIC8qIDB4NTgtMHg1QiAqLworCTB4QzcsIDB4RDEsIDB4QzAsIDB4OUIsIDB4QzAsIDB4OUMsIDB4QzAsIDB4OUQsIC8qIDB4NUMtMHg1RiAqLworCTB4QzcsIDB4RDIsIDB4QzAsIDB4OUUsIDB4QzAsIDB4OUYsIDB4QzAsIDB4QTAsIC8qIDB4NjAtMHg2MyAqLworCTB4QzEsIDB4NDEsIDB4QzcsIDB4RDMsIDB4QzEsIDB4NDIsIDB4QzEsIDB4NDMsIC8qIDB4NjQtMHg2NyAqLworCTB4QzcsIDB4RDQsIDB4QzcsIDB4RDUsIDB4QzEsIDB4NDQsIDB4QzcsIDB4RDYsIC8qIDB4NjgtMHg2QiAqLworCTB4QzEsIDB4NDUsIDB4QzcsIDB4RDcsIDB4QzEsIDB4NDYsIDB4QzEsIDB4NDcsIC8qIDB4NkMtMHg2RiAqLworCTB4QzEsIDB4NDgsIDB4QzEsIDB4NDksIDB4QzEsIDB4NEEsIDB4QzEsIDB4NEIsIC8qIDB4NzAtMHg3MyAqLworCTB4QzcsIDB4RDgsIDB4QzcsIDB4RDksIDB4QzEsIDB4NEMsIDB4QzEsIDB4NEQsIC8qIDB4NzQtMHg3NyAqLworCTB4QzcsIDB4REEsIDB4QzEsIDB4NEUsIDB4QzEsIDB4NEYsIDB4QzEsIDB4NTAsIC8qIDB4NzgtMHg3QiAqLworCTB4QzcsIDB4REIsIDB4QzEsIDB4NTEsIDB4QzEsIDB4NTIsIDB4QzEsIDB4NTMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QzEsIDB4NTQsIDB4QzEsIDB4NTUsIDB4QzEsIDB4NTYsIDB4QzEsIDB4NTcsIC8qIDB4ODAtMHg4MyAqLworCTB4QzcsIDB4REMsIDB4QzcsIDB4REQsIDB4QzEsIDB4NTgsIDB4QzcsIDB4REUsIC8qIDB4ODQtMHg4NyAqLworCTB4QzcsIDB4REYsIDB4QzcsIDB4RTAsIDB4QzEsIDB4NTksIDB4QzEsIDB4NUEsIC8qIDB4ODgtMHg4QiAqLworCTB4QzEsIDB4NjEsIDB4QzEsIDB4NjIsIDB4QzEsIDB4NjMsIDB4QzEsIDB4NjQsIC8qIDB4OEMtMHg4RiAqLworCTB4QzcsIDB4RTEsIDB4QzEsIDB4NjUsIDB4QzEsIDB4NjYsIDB4QzEsIDB4NjcsIC8qIDB4OTAtMHg5MyAqLworCTB4QzEsIDB4NjgsIDB4QzEsIDB4NjksIDB4QzEsIDB4NkEsIDB4QzEsIDB4NkIsIC8qIDB4OTQtMHg5NyAqLworCTB4QzEsIDB4NkMsIDB4QzEsIDB4NkQsIDB4QzEsIDB4NkUsIDB4QzEsIDB4NkYsIC8qIDB4OTgtMHg5QiAqLworCTB4QzEsIDB4NzAsIDB4QzEsIDB4NzEsIDB4QzEsIDB4NzIsIDB4QzEsIDB4NzMsIC8qIDB4OUMtMHg5RiAqLworCTB4QzEsIDB4NzQsIDB4QzEsIDB4NzUsIDB4QzEsIDB4NzYsIDB4QzEsIDB4NzcsIC8qIDB4QTAtMHhBMyAqLworCTB4QzEsIDB4NzgsIDB4QzcsIDB4RTIsIDB4QzEsIDB4NzksIDB4QzEsIDB4N0EsIC8qIDB4QTQtMHhBNyAqLworCTB4QzEsIDB4ODEsIDB4QzEsIDB4ODIsIDB4QzEsIDB4ODMsIDB4QzEsIDB4ODQsIC8qIDB4QTgtMHhBQiAqLworCTB4QzEsIDB4ODUsIDB4QzEsIDB4ODYsIDB4QzEsIDB4ODcsIDB4QzEsIDB4ODgsIC8qIDB4QUMtMHhBRiAqLworCTB4QzEsIDB4ODksIDB4QzEsIDB4OEEsIDB4QzEsIDB4OEIsIDB4QzEsIDB4OEMsIC8qIDB4QjAtMHhCMyAqLworCTB4QzEsIDB4OEQsIDB4QzEsIDB4OEUsIDB4QzEsIDB4OEYsIDB4QzEsIDB4OTAsIC8qIDB4QjQtMHhCNyAqLworCTB4QzEsIDB4OTEsIDB4QzEsIDB4OTIsIDB4QzEsIDB4OTMsIDB4QzEsIDB4OTQsIC8qIDB4QjgtMHhCQiAqLworCTB4QzEsIDB4OTUsIDB4QzEsIDB4OTYsIDB4QzEsIDB4OTcsIDB4QzEsIDB4OTgsIC8qIDB4QkMtMHhCRiAqLworCTB4QzEsIDB4OTksIDB4QzEsIDB4OUEsIDB4QzEsIDB4OUIsIDB4QzEsIDB4OUMsIC8qIDB4QzAtMHhDMyAqLworCTB4QzEsIDB4OUQsIDB4QzEsIDB4OUUsIDB4QzEsIDB4OUYsIDB4QzEsIDB4QTAsIC8qIDB4QzQtMHhDNyAqLworCTB4QzcsIDB4RTMsIDB4QzcsIDB4RTQsIDB4QzIsIDB4NDEsIDB4QzIsIDB4NDIsIC8qIDB4QzgtMHhDQiAqLworCTB4QzcsIDB4RTUsIDB4QzIsIDB4NDMsIDB4QzIsIDB4NDQsIDB4QzIsIDB4NDUsIC8qIDB4Q0MtMHhDRiAqLworCTB4QzcsIDB4RTYsIDB4QzIsIDB4NDYsIDB4QzcsIDB4RTcsIDB4QzIsIDB4NDcsIC8qIDB4RDAtMHhEMyAqLworCTB4QzIsIDB4NDgsIDB4QzIsIDB4NDksIDB4QzIsIDB4NEEsIDB4QzIsIDB4NEIsIC8qIDB4RDQtMHhENyAqLworCTB4QzcsIDB4RTgsIDB4QzcsIDB4RTksIDB4QzIsIDB4NEMsIDB4QzcsIDB4RUEsIC8qIDB4RDgtMHhEQiAqLworCTB4QzIsIDB4NEQsIDB4QzcsIDB4RUIsIDB4QzIsIDB4NEUsIDB4QzIsIDB4NEYsIC8qIDB4REMtMHhERiAqLworCTB4QzIsIDB4NTAsIDB4QzIsIDB4NTEsIDB4QzIsIDB4NTIsIDB4QzIsIDB4NTMsIC8qIDB4RTAtMHhFMyAqLworCTB4QzcsIDB4RUMsIDB4QzcsIDB4RUQsIDB4QzIsIDB4NTQsIDB4QzIsIDB4NTUsIC8qIDB4RTQtMHhFNyAqLworCTB4QzcsIDB4RUUsIDB4QzIsIDB4NTYsIDB4QzIsIDB4NTcsIDB4QzIsIDB4NTgsIC8qIDB4RTgtMHhFQiAqLworCTB4QzcsIDB4RUYsIDB4QzIsIDB4NTksIDB4QzIsIDB4NUEsIDB4QzIsIDB4NjEsIC8qIDB4RUMtMHhFRiAqLworCTB4QzIsIDB4NjIsIDB4QzIsIDB4NjMsIDB4QzIsIDB4NjQsIDB4QzIsIDB4NjUsIC8qIDB4RjAtMHhGMyAqLworCTB4QzcsIDB4RjAsIDB4QzcsIDB4RjEsIDB4QzIsIDB4NjYsIDB4QzcsIDB4RjIsIC8qIDB4RjQtMHhGNyAqLworCTB4QzIsIDB4NjcsIDB4QzcsIDB4RjMsIDB4QzIsIDB4NjgsIDB4QzIsIDB4NjksIC8qIDB4RjgtMHhGQiAqLworCTB4QzIsIDB4NkEsIDB4QzIsIDB4NkIsIDB4QzIsIDB4NkMsIDB4QzIsIDB4NkQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0Q2WzUxMl0gPSB7CisJMHhDNywgMHhGNCwgMHhDNywgMHhGNSwgMHhDMiwgMHg2RSwgMHhDMiwgMHg2RiwgLyogMHgwMC0weDAzICovCisJMHhDNywgMHhGNiwgMHhDMiwgMHg3MCwgMHhDMiwgMHg3MSwgMHhDMiwgMHg3MiwgLyogMHgwNC0weDA3ICovCisJMHhDNywgMHhGNywgMHhDMiwgMHg3MywgMHhDMiwgMHg3NCwgMHhDMiwgMHg3NSwgLyogMHgwOC0weDBCICovCisJMHhDMiwgMHg3NiwgMHhDMiwgMHg3NywgMHhDMiwgMHg3OCwgMHhDMiwgMHg3OSwgLyogMHgwQy0weDBGICovCisJMHhDNywgMHhGOCwgMHhDNywgMHhGOSwgMHhDMiwgMHg3QSwgMHhDNywgMHhGQSwgLyogMHgxMC0weDEzICovCisJMHhDNywgMHhGQiwgMHhDNywgMHhGQywgMHhDMiwgMHg4MSwgMHhDMiwgMHg4MiwgLyogMHgxNC0weDE3ICovCisJMHhDMiwgMHg4MywgMHhDMiwgMHg4NCwgMHhDMiwgMHg4NSwgMHhDMiwgMHg4NiwgLyogMHgxOC0weDFCICovCisJMHhDNywgMHhGRCwgMHhDMiwgMHg4NywgMHhDMiwgMHg4OCwgMHhDMiwgMHg4OSwgLyogMHgxQy0weDFGICovCisJMHhDNywgMHhGRSwgMHhDMiwgMHg4QSwgMHhDMiwgMHg4QiwgMHhDMiwgMHg4QywgLyogMHgyMC0weDIzICovCisJMHhDOCwgMHhBMSwgMHhDMiwgMHg4RCwgMHhDMiwgMHg4RSwgMHhDMiwgMHg4RiwgLyogMHgyNC0weDI3ICovCisJMHhDMiwgMHg5MCwgMHhDMiwgMHg5MSwgMHhDMiwgMHg5MiwgMHhDMiwgMHg5MywgLyogMHgyOC0weDJCICovCisJMHhDMiwgMHg5NCwgMHhDOCwgMHhBMiwgMHhDMiwgMHg5NSwgMHhDMiwgMHg5NiwgLyogMHgyQy0weDJGICovCisJMHhDMiwgMHg5NywgMHhDMiwgMHg5OCwgMHhDMiwgMHg5OSwgMHhDMiwgMHg5QSwgLyogMHgzMC0weDMzICovCisJMHhDMiwgMHg5QiwgMHhDMiwgMHg5QywgMHhDMiwgMHg5RCwgMHhDMiwgMHg5RSwgLyogMHgzNC0weDM3ICovCisJMHhDOCwgMHhBMywgMHhDOCwgMHhBNCwgMHhDMiwgMHg5RiwgMHhDMiwgMHhBMCwgLyogMHgzOC0weDNCICovCisJMHhDOCwgMHhBNSwgMHhDMywgMHg0MSwgMHhDMywgMHg0MiwgMHhDMywgMHg0MywgLyogMHgzQy0weDNGICovCisJMHhDOCwgMHhBNiwgMHhDMywgMHg0NCwgMHhDMywgMHg0NSwgMHhDMywgMHg0NiwgLyogMHg0MC0weDQzICovCisJMHhDMywgMHg0NywgMHhDOCwgMHhBNywgMHhDMywgMHg0OCwgMHhDMywgMHg0OSwgLyogMHg0NC0weDQ3ICovCisJMHhDOCwgMHhBOCwgMHhDOCwgMHhBOSwgMHhDMywgMHg0QSwgMHhDOCwgMHhBQSwgLyogMHg0OC0weDRCICovCisJMHhDMywgMHg0QiwgMHhDOCwgMHhBQiwgMHhDMywgMHg0QywgMHhDMywgMHg0RCwgLyogMHg0Qy0weDRGICovCisJMHhDMywgMHg0RSwgMHhDOCwgMHhBQywgMHhDMywgMHg0RiwgMHhDMywgMHg1MCwgLyogMHg1MC0weDUzICovCisJMHhDOCwgMHhBRCwgMHhDOCwgMHhBRSwgMHhDMywgMHg1MSwgMHhDMywgMHg1MiwgLyogMHg1NC0weDU3ICovCisJMHhDOCwgMHhBRiwgMHhDMywgMHg1MywgMHhDMywgMHg1NCwgMHhDMywgMHg1NSwgLyogMHg1OC0weDVCICovCisJMHhDOCwgMHhCMCwgMHhDMywgMHg1NiwgMHhDMywgMHg1NywgMHhDMywgMHg1OCwgLyogMHg1Qy0weDVGICovCisJMHhDMywgMHg1OSwgMHhDMywgMHg1QSwgMHhDMywgMHg2MSwgMHhDMywgMHg2MiwgLyogMHg2MC0weDYzICovCisJMHhDMywgMHg2MywgMHhDMywgMHg2NCwgMHhDMywgMHg2NSwgMHhDOCwgMHhCMSwgLyogMHg2NC0weDY3ICovCisJMHhDMywgMHg2NiwgMHhDOCwgMHhCMiwgMHhDMywgMHg2NywgMHhDMywgMHg2OCwgLyogMHg2OC0weDZCICovCisJMHhDMywgMHg2OSwgMHhDMywgMHg2QSwgMHhDMywgMHg2QiwgMHhDMywgMHg2QywgLyogMHg2Qy0weDZGICovCisJMHhDOCwgMHhCMywgMHhDOCwgMHhCNCwgMHhDMywgMHg2RCwgMHhDMywgMHg2RSwgLyogMHg3MC0weDczICovCisJMHhDOCwgMHhCNSwgMHhDMywgMHg2RiwgMHhDMywgMHg3MCwgMHhDMywgMHg3MSwgLyogMHg3NC0weDc3ICovCisJMHhDMywgMHg3MiwgMHhDMywgMHg3MywgMHhDMywgMHg3NCwgMHhDMywgMHg3NSwgLyogMHg3OC0weDdCICovCisJMHhDMywgMHg3NiwgMHhDMywgMHg3NywgMHhDMywgMHg3OCwgMHhDMywgMHg3OSwgLyogMHg3Qy0weDdGICovCisJCisJMHhDMywgMHg3QSwgMHhDMywgMHg4MSwgMHhDMywgMHg4MiwgMHhDOCwgMHhCNiwgLyogMHg4MC0weDgzICovCisJMHhDMywgMHg4MywgMHhDOCwgMHhCNywgMHhDMywgMHg4NCwgMHhDMywgMHg4NSwgLyogMHg4NC0weDg3ICovCisJMHhDMywgMHg4NiwgMHhDMywgMHg4NywgMHhDMywgMHg4OCwgMHhDMywgMHg4OSwgLyogMHg4OC0weDhCICovCisJMHhDOCwgMHhCOCwgMHhDOCwgMHhCOSwgMHhDMywgMHg4QSwgMHhDMywgMHg4QiwgLyogMHg4Qy0weDhGICovCisJMHhDOCwgMHhCQSwgMHhDMywgMHg4QywgMHhDMywgMHg4RCwgMHhDMywgMHg4RSwgLyogMHg5MC0weDkzICovCisJMHhDOCwgMHhCQiwgMHhDMywgMHg4RiwgMHhDMywgMHg5MCwgMHhDMywgMHg5MSwgLyogMHg5NC0weDk3ICovCisJMHhDMywgMHg5MiwgMHhDMywgMHg5MywgMHhDMywgMHg5NCwgMHhDMywgMHg5NSwgLyogMHg5OC0weDlCICovCisJMHhDMywgMHg5NiwgMHhDOCwgMHhCQywgMHhDMywgMHg5NywgMHhDOCwgMHhCRCwgLyogMHg5Qy0weDlGICovCisJMHhDMywgMHg5OCwgMHhDOCwgMHhCRSwgMHhDMywgMHg5OSwgMHhDMywgMHg5QSwgLyogMHhBMC0weEEzICovCisJMHhDMywgMHg5QiwgMHhDMywgMHg5QywgMHhDMywgMHg5RCwgMHhDMywgMHg5RSwgLyogMHhBNC0weEE3ICovCisJMHhDOCwgMHhCRiwgMHhDMywgMHg5RiwgMHhDMywgMHhBMCwgMHhDNCwgMHg0MSwgLyogMHhBOC0weEFCICovCisJMHhDOCwgMHhDMCwgMHhDNCwgMHg0MiwgMHhDNCwgMHg0MywgMHhDNCwgMHg0NCwgLyogMHhBQy0weEFGICovCisJMHhDOCwgMHhDMSwgMHhDNCwgMHg0NSwgMHhDNCwgMHg0NiwgMHhDNCwgMHg0NywgLyogMHhCMC0weEIzICovCisJMHhDNCwgMHg0OCwgMHhDNCwgMHg0OSwgMHhDNCwgMHg0QSwgMHhDNCwgMHg0QiwgLyogMHhCNC0weEI3ICovCisJMHhDNCwgMHg0QywgMHhDOCwgMHhDMiwgMHhDNCwgMHg0RCwgMHhDOCwgMHhDMywgLyogMHhCOC0weEJCICovCisJMHhDNCwgMHg0RSwgMHhDNCwgMHg0RiwgMHhDNCwgMHg1MCwgMHhDNCwgMHg1MSwgLyogMHhCQy0weEJGICovCisJMHhDNCwgMHg1MiwgMHhDNCwgMHg1MywgMHhDNCwgMHg1NCwgMHhDNCwgMHg1NSwgLyogMHhDMC0weEMzICovCisJMHhDOCwgMHhDNCwgMHhDOCwgMHhDNSwgMHhDNCwgMHg1NiwgMHhDNCwgMHg1NywgLyogMHhDNC0weEM3ICovCisJMHhDOCwgMHhDNiwgMHhDNCwgMHg1OCwgMHhDNCwgMHg1OSwgMHhDNCwgMHg1QSwgLyogMHhDOC0weENCICovCisJMHhDOCwgMHhDNywgMHhDNCwgMHg2MSwgMHhDNCwgMHg2MiwgMHhDNCwgMHg2MywgLyogMHhDQy0weENGICovCisJMHhDNCwgMHg2NCwgMHhDOCwgMHhDOCwgMHhDNCwgMHg2NSwgMHhDNCwgMHg2NiwgLyogMHhEMC0weEQzICovCisJMHhDOCwgMHhDOSwgMHhDNCwgMHg2NywgMHhDNCwgMHg2OCwgMHhDOCwgMHhDQSwgLyogMHhENC0weEQ3ICovCisJMHhDNCwgMHg2OSwgMHhDOCwgMHhDQiwgMHhDNCwgMHg2QSwgMHhDNCwgMHg2QiwgLyogMHhEOC0weERCICovCisJMHhDNCwgMHg2QywgMHhDNCwgMHg2RCwgMHhDNCwgMHg2RSwgMHhDNCwgMHg2RiwgLyogMHhEQy0weERGICovCisJMHhDOCwgMHhDQywgMHhDNCwgMHg3MCwgMHhDNCwgMHg3MSwgMHhDNCwgMHg3MiwgLyogMHhFMC0weEUzICovCisJMHhDOCwgMHhDRCwgMHhDNCwgMHg3MywgMHhDNCwgMHg3NCwgMHhDNCwgMHg3NSwgLyogMHhFNC0weEU3ICovCisJMHhDOCwgMHhDRSwgMHhDNCwgMHg3NiwgMHhDNCwgMHg3NywgMHhDNCwgMHg3OCwgLyogMHhFOC0weEVCICovCisJMHhDNCwgMHg3OSwgMHhDNCwgMHg3QSwgMHhDNCwgMHg4MSwgMHhDNCwgMHg4MiwgLyogMHhFQy0weEVGICovCisJMHhDOCwgMHhDRiwgMHhDNCwgMHg4MywgMHhDNCwgMHg4NCwgMHhDNCwgMHg4NSwgLyogMHhGMC0weEYzICovCisJMHhDNCwgMHg4NiwgMHhDOCwgMHhEMCwgMHhDNCwgMHg4NywgMHhDNCwgMHg4OCwgLyogMHhGNC0weEY3ICovCisJMHhDNCwgMHg4OSwgMHhDNCwgMHg4QSwgMHhDNCwgMHg4QiwgMHhDNCwgMHg4QywgLyogMHhGOC0weEZCICovCisJMHhDOCwgMHhEMSwgMHhDOCwgMHhEMiwgMHhDNCwgMHg4RCwgMHhDNCwgMHg4RSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfRDdbNTEyXSA9IHsKKwkweEM4LCAweEQzLCAweEM0LCAweDhGLCAweEM0LCAweDkwLCAweEM0LCAweDkxLCAvKiAweDAwLTB4MDMgKi8KKwkweEM4LCAweEQ0LCAweEM0LCAweDkyLCAweEM0LCAweDkzLCAweEM0LCAweDk0LCAvKiAweDA0LTB4MDcgKi8KKwkweEM0LCAweDk1LCAweEM0LCAweDk2LCAweEM0LCAweDk3LCAweEM0LCAweDk4LCAvKiAweDA4LTB4MEIgKi8KKwkweEM0LCAweDk5LCAweEM0LCAweDlBLCAweEM0LCAweDlCLCAweEM0LCAweDlDLCAvKiAweDBDLTB4MEYgKi8KKwkweEM0LCAweDlELCAweEM4LCAweEQ1LCAweEM0LCAweDlFLCAweEM0LCAweDlGLCAvKiAweDEwLTB4MTMgKi8KKwkweEM0LCAweEEwLCAweEM1LCAweDQxLCAweEM1LCAweDQyLCAweEM1LCAweDQzLCAvKiAweDE0LTB4MTcgKi8KKwkweEM4LCAweEQ2LCAweEM4LCAweEQ3LCAweEM1LCAweDQ0LCAweEM1LCAweDQ1LCAvKiAweDE4LTB4MUIgKi8KKwkweEM4LCAweEQ4LCAweEM1LCAweDQ2LCAweEM1LCAweDQ3LCAweEM1LCAweDQ4LCAvKiAweDFDLTB4MUYgKi8KKwkweEM4LCAweEQ5LCAweEM1LCAweDQ5LCAweEM1LCAweDRBLCAweEM1LCAweDRCLCAvKiAweDIwLTB4MjMgKi8KKwkweEM1LCAweDRDLCAweEM1LCAweDRELCAweEM1LCAweDRFLCAweEM1LCAweDRGLCAvKiAweDI0LTB4MjcgKi8KKwkweEM4LCAweERBLCAweEM4LCAweERCLCAweEM1LCAweDUwLCAweEM4LCAweERDLCAvKiAweDI4LTB4MkIgKi8KKwkweEM1LCAweDUxLCAweEM4LCAweERELCAweEM1LCAweDUyLCAweEM1LCAweDUzLCAvKiAweDJDLTB4MkYgKi8KKwkweEM1LCAweDU0LCAweEM1LCAweDU1LCAweEM1LCAweDU2LCAweEM1LCAweDU3LCAvKiAweDMwLTB4MzMgKi8KKwkweEM4LCAweERFLCAweEM4LCAweERGLCAweEM1LCAweDU4LCAweEM1LCAweDU5LCAvKiAweDM0LTB4MzcgKi8KKwkweEM4LCAweEUwLCAweEM1LCAweDVBLCAweEM1LCAweDYxLCAweEM1LCAweDYyLCAvKiAweDM4LTB4M0IgKi8KKwkweEM4LCAweEUxLCAweEM1LCAweDYzLCAweEM1LCAweDY0LCAweEM1LCAweDY1LCAvKiAweDNDLTB4M0YgKi8KKwkweEM1LCAweDY2LCAweEM1LCAweDY3LCAweEM1LCAweDY4LCAweEM1LCAweDY5LCAvKiAweDQwLTB4NDMgKi8KKwkweEM4LCAweEUyLCAweEM1LCAweDZBLCAweEM1LCAweDZCLCAweEM4LCAweEUzLCAvKiAweDQ0LTB4NDcgKi8KKwkweEM1LCAweDZDLCAweEM4LCAweEU0LCAweEM1LCAweDZELCAweEM1LCAweDZFLCAvKiAweDQ4LTB4NEIgKi8KKwkweEM1LCAweDZGLCAweEM1LCAweDcwLCAweEM1LCAweDcxLCAweEM1LCAweDcyLCAvKiAweDRDLTB4NEYgKi8KKwkweEM4LCAweEU1LCAweEM4LCAweEU2LCAweEM1LCAweDczLCAweEM1LCAweDc0LCAvKiAweDUwLTB4NTMgKi8KKwkweEM4LCAweEU3LCAweEM1LCAweDc1LCAweEM4LCAweEU4LCAweEM4LCAweEU5LCAvKiAweDU0LTB4NTcgKi8KKwkweEM4LCAweEVBLCAweEM4LCAweEVCLCAweEM1LCAweDc2LCAweEM1LCAweDc3LCAvKiAweDU4LTB4NUIgKi8KKwkweEM1LCAweDc4LCAweEM1LCAweDc5LCAweEM1LCAweDdBLCAweEM1LCAweDgxLCAvKiAweDVDLTB4NUYgKi8KKwkweEM4LCAweEVDLCAweEM4LCAweEVELCAweEM1LCAweDgyLCAweEM4LCAweEVFLCAvKiAweDYwLTB4NjMgKi8KKwkweEM1LCAweDgzLCAweEM4LCAweEVGLCAweEM1LCAweDg0LCAweEM1LCAweDg1LCAvKiAweDY0LTB4NjcgKi8KKwkweEM1LCAweDg2LCAweEM4LCAweEYwLCAweEM1LCAweDg3LCAweEM1LCAweDg4LCAvKiAweDY4LTB4NkIgKi8KKwkweEM4LCAweEYxLCAweEM1LCAweDg5LCAweEM1LCAweDhBLCAweEM1LCAweDhCLCAvKiAweDZDLTB4NkYgKi8KKwkweEM4LCAweEYyLCAweEM1LCAweDhDLCAweEM1LCAweDhELCAweEM1LCAweDhFLCAvKiAweDcwLTB4NzMgKi8KKwkweEM4LCAweEYzLCAweEM1LCAweDhGLCAweEM1LCAweDkwLCAweEM1LCAweDkxLCAvKiAweDc0LTB4NzcgKi8KKwkweEM1LCAweDkyLCAweEM1LCAweDkzLCAweEM1LCAweDk0LCAweEM1LCAweDk1LCAvKiAweDc4LTB4N0IgKi8KKwkweEM4LCAweEY0LCAweEM4LCAweEY1LCAweEM1LCAweDk2LCAweEM1LCAweDk3LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEM1LCAweDk4LCAweEM4LCAweEY2LCAweEM1LCAweDk5LCAweEM1LCAweDlBLCAvKiAweDgwLTB4ODMgKi8KKwkweEM1LCAweDlCLCAweEM1LCAweDlDLCAweEM1LCAweDlELCAweEM1LCAweDlFLCAvKiAweDg0LTB4ODcgKi8KKwkweEM4LCAweEY3LCAweEM4LCAweEY4LCAweEM1LCAweDlGLCAweEM1LCAweEEwLCAvKiAweDg4LTB4OEIgKi8KKwkweEM4LCAweEY5LCAweEM2LCAweDQxLCAweEM2LCAweDQyLCAweEM2LCAweDQzLCAvKiAweDhDLTB4OEYgKi8KKwkweEM4LCAweEZBLCAweEM2LCAweDQ0LCAweEM2LCAweDQ1LCAweEM2LCAweDQ2LCAvKiAweDkwLTB4OTMgKi8KKwkweEM2LCAweDQ3LCAweEM2LCAweDQ4LCAweEM2LCAweDQ5LCAweEM2LCAweDRBLCAvKiAweDk0LTB4OTcgKi8KKwkweEM4LCAweEZCLCAweEM4LCAweEZDLCAweEM2LCAweDRCLCAweEM4LCAweEZELCAvKiAweDk4LTB4OUIgKi8KKwkweEM2LCAweDRDLCAweEM4LCAweEZFLCAweEM2LCAweDRELCAweEM2LCAweDRFLCAvKiAweDlDLTB4OUYgKi8KKwkweEM2LCAweDRGLCAweEM2LCAweDUwLCAweEM2LCAweDUxLCAweEM2LCAweDUyLCAvKiAweEEwLTB4QTMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19EQ1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0Y5WzUxMl0gPSB7CisJMHhDQiwgMHhEMCwgMHhDQiwgMHhENiwgMHhDQiwgMHhFNywgMHhDRCwgMHhDRiwgLyogMHgwMC0weDAzICovCisJMHhDRCwgMHhFOCwgMHhDRSwgMHhBRCwgMHhDRiwgMHhGQiwgMHhEMCwgMHhBMiwgLyogMHgwNC0weDA3ICovCisJMHhEMCwgMHhCOCwgMHhEMCwgMHhEMCwgMHhEMCwgMHhERCwgMHhEMSwgMHhENCwgLyogMHgwOC0weDBCICovCisJMHhEMSwgMHhENSwgMHhEMSwgMHhEOCwgMHhEMSwgMHhEQiwgMHhEMSwgMHhEQywgLyogMHgwQy0weDBGICovCisJMHhEMSwgMHhERCwgMHhEMSwgMHhERSwgMHhEMSwgMHhERiwgMHhEMSwgMHhFMCwgLyogMHgxMC0weDEzICovCisJMHhEMSwgMHhFMiwgMHhEMSwgMHhFMywgMHhEMSwgMHhFNCwgMHhEMSwgMHhFNSwgLyogMHgxNC0weDE3ICovCisJMHhEMSwgMHhFNiwgMHhEMSwgMHhFOCwgMHhEMSwgMHhFOSwgMHhEMSwgMHhFQSwgLyogMHgxOC0weDFCICovCisJMHhEMSwgMHhFQiwgMHhEMSwgMHhFRCwgMHhEMSwgMHhFRiwgMHhEMSwgMHhGMCwgLyogMHgxQy0weDFGICovCisJMHhEMSwgMHhGMiwgMHhEMSwgMHhGNiwgMHhEMSwgMHhGQSwgMHhEMSwgMHhGQywgLyogMHgyMC0weDIzICovCisJMHhEMSwgMHhGRCwgMHhEMSwgMHhGRSwgMHhEMiwgMHhBMiwgMHhEMiwgMHhBMywgLyogMHgyNC0weDI3ICovCisJMHhEMiwgMHhBNywgMHhEMiwgMHhBOCwgMHhEMiwgMHhBOSwgMHhEMiwgMHhBQSwgLyogMHgyOC0weDJCICovCisJMHhEMiwgMHhBQiwgMHhEMiwgMHhBRCwgMHhEMiwgMHhCMiwgMHhEMiwgMHhCRSwgLyogMHgyQy0weDJGICovCisJMHhEMiwgMHhDMiwgMHhEMiwgMHhDMywgMHhEMiwgMHhDNCwgMHhEMiwgMHhDNiwgLyogMHgzMC0weDMzICovCisJMHhEMiwgMHhDNywgMHhEMiwgMHhDOCwgMHhEMiwgMHhDOSwgMHhEMiwgMHhDQSwgLyogMHgzNC0weDM3ICovCisJMHhEMiwgMHhDQiwgMHhEMiwgMHhDRCwgMHhEMiwgMHhDRSwgMHhEMiwgMHhDRiwgLyogMHgzOC0weDNCICovCisJMHhEMiwgMHhEMCwgMHhEMiwgMHhEMSwgMHhEMiwgMHhEMiwgMHhEMiwgMHhEMywgLyogMHgzQy0weDNGICovCisJMHhEMiwgMHhENCwgMHhEMiwgMHhENSwgMHhEMiwgMHhENiwgMHhEMiwgMHhENywgLyogMHg0MC0weDQzICovCisJMHhEMiwgMHhEOSwgMHhEMiwgMHhEQSwgMHhEMiwgMHhERSwgMHhEMiwgMHhERiwgLyogMHg0NC0weDQ3ICovCisJMHhEMiwgMHhFMSwgMHhEMiwgMHhFMiwgMHhEMiwgMHhFNCwgMHhEMiwgMHhFNSwgLyogMHg0OC0weDRCICovCisJMHhEMiwgMHhFNiwgMHhEMiwgMHhFNywgMHhEMiwgMHhFOCwgMHhEMiwgMHhFOSwgLyogMHg0Qy0weDRGICovCisJMHhEMiwgMHhFQSwgMHhEMiwgMHhFQiwgMHhEMiwgMHhGMCwgMHhEMiwgMHhGMSwgLyogMHg1MC0weDUzICovCisJMHhEMiwgMHhGMiwgMHhEMiwgMHhGMywgMHhEMiwgMHhGNCwgMHhEMiwgMHhGNSwgLyogMHg1NC0weDU3ICovCisJMHhEMiwgMHhGNywgMHhEMiwgMHhGOCwgMHhENCwgMHhFNiwgMHhENCwgMHhGQywgLyogMHg1OC0weDVCICovCisJMHhENSwgMHhBNSwgMHhENSwgMHhBQiwgMHhENSwgMHhBRSwgMHhENiwgMHhCOCwgLyogMHg1Qy0weDVGICovCisJMHhENiwgMHhDRCwgMHhENywgMHhDQiwgMHhENywgMHhFNCwgMHhEQiwgMHhDNSwgLyogMHg2MC0weDYzICovCisJMHhEQiwgMHhFNCwgMHhEQywgMHhBNSwgMHhERCwgMHhBNSwgMHhERCwgMHhENSwgLyogMHg2NC0weDY3ICovCisJMHhERCwgMHhGNCwgMHhERSwgMHhGQywgMHhERSwgMHhGRSwgMHhERiwgMHhCMywgLyogMHg2OC0weDZCICovCisJMHhERiwgMHhFMSwgMHhERiwgMHhFOCwgMHhFMCwgMHhGMSwgMHhFMSwgMHhBRCwgLyogMHg2Qy0weDZGICovCisJMHhFMSwgMHhFRCwgMHhFMywgMHhGNSwgMHhFNCwgMHhBMSwgMHhFNCwgMHhBOSwgLyogMHg3MC0weDczICovCisJMHhFNSwgMHhBRSwgMHhFNSwgMHhCMSwgMHhFNSwgMHhCMiwgMHhFNSwgMHhCOSwgLyogMHg3NC0weDc3ICovCisJMHhFNSwgMHhCQiwgMHhFNSwgMHhCQywgMHhFNSwgMHhDNCwgMHhFNSwgMHhDRSwgLyogMHg3OC0weDdCICovCisJMHhFNSwgMHhEMCwgMHhFNSwgMHhEMiwgMHhFNSwgMHhENiwgMHhFNSwgMHhGQSwgLyogMHg3Qy0weDdGICovCisJCisJMHhFNSwgMHhGQiwgMHhFNSwgMHhGQywgMHhFNSwgMHhGRSwgMHhFNiwgMHhBMSwgLyogMHg4MC0weDgzICovCisJMHhFNiwgMHhBNCwgMHhFNiwgMHhBNywgMHhFNiwgMHhBRCwgMHhFNiwgMHhBRiwgLyogMHg4NC0weDg3ICovCisJMHhFNiwgMHhCMCwgMHhFNiwgMHhCMSwgMHhFNiwgMHhCMywgMHhFNiwgMHhCNywgLyogMHg4OC0weDhCICovCisJMHhFNiwgMHhCOCwgMHhFNiwgMHhCQywgMHhFNiwgMHhDNCwgMHhFNiwgMHhDNiwgLyogMHg4Qy0weDhGICovCisJMHhFNiwgMHhDNywgMHhFNiwgMHhDQSwgMHhFNiwgMHhEMiwgMHhFNiwgMHhENiwgLyogMHg5MC0weDkzICovCisJMHhFNiwgMHhEOSwgMHhFNiwgMHhEQywgMHhFNiwgMHhERiwgMHhFNiwgMHhFMSwgLyogMHg5NC0weDk3ICovCisJMHhFNiwgMHhFNCwgMHhFNiwgMHhFNSwgMHhFNiwgMHhFNiwgMHhFNiwgMHhFOCwgLyogMHg5OC0weDlCICovCisJMHhFNiwgMHhFQSwgMHhFNiwgMHhFQiwgMHhFNiwgMHhFQywgMHhFNiwgMHhFRiwgLyogMHg5Qy0weDlGICovCisJMHhFNiwgMHhGMSwgMHhFNiwgMHhGMiwgMHhFNiwgMHhGNSwgMHhFNiwgMHhGNiwgLyogMHhBMC0weEEzICovCisJMHhFNiwgMHhGNywgMHhFNiwgMHhGOSwgMHhFNywgMHhBMSwgMHhFNywgMHhBNiwgLyogMHhBNC0weEE3ICovCisJMHhFNywgMHhBOSwgMHhFNywgMHhBQSwgMHhFNywgMHhBQywgMHhFNywgMHhBRCwgLyogMHhBOC0weEFCICovCisJMHhFNywgMHhCMCwgMHhFNywgMHhCRiwgMHhFNywgMHhDMSwgMHhFNywgMHhDNiwgLyogMHhBQy0weEFGICovCisJMHhFNywgMHhDNywgMHhFNywgMHhDQiwgMHhFNywgMHhDRCwgMHhFNywgMHhDRiwgLyogMHhCMC0weEIzICovCisJMHhFNywgMHhEMCwgMHhFNywgMHhEMywgMHhFNywgMHhERiwgMHhFNywgMHhFNCwgLyogMHhCNC0weEI3ICovCisJMHhFNywgMHhFNiwgMHhFNywgMHhGNywgMHhFOCwgMHhFNywgMHhFOCwgMHhFOCwgLyogMHhCOC0weEJCICovCisJMHhFOCwgMHhGMCwgMHhFOCwgMHhGMSwgMHhFOCwgMHhGNywgMHhFOCwgMHhGOSwgLyogMHhCQy0weEJGICovCisJMHhFOCwgMHhGQiwgMHhFOCwgMHhGRSwgMHhFOSwgMHhBNywgMHhFOSwgMHhBQywgLyogMHhDMC0weEMzICovCisJMHhFOSwgMHhDQywgMHhFOSwgMHhGNywgMHhFQSwgMHhDMSwgMHhFQSwgMHhFNSwgLyogMHhDNC0weEM3ICovCisJMHhFQSwgMHhGNCwgMHhFQSwgMHhGNywgMHhFQSwgMHhGQywgMHhFQSwgMHhGRSwgLyogMHhDOC0weENCICovCisJMHhFQiwgMHhBNCwgMHhFQiwgMHhBNywgMHhFQiwgMHhBOSwgMHhFQiwgMHhBQSwgLyogMHhDQy0weENGICovCisJMHhFQiwgMHhCQSwgMHhFQiwgMHhCQiwgMHhFQiwgMHhCRCwgMHhFQiwgMHhDMSwgLyogMHhEMC0weEQzICovCisJMHhFQiwgMHhDMiwgMHhFQiwgMHhDNiwgMHhFQiwgMHhDNywgMHhFQiwgMHhDQywgLyogMHhENC0weEQ3ICovCisJMHhFQiwgMHhDRiwgMHhFQiwgMHhEMCwgMHhFQiwgMHhEMSwgMHhFQiwgMHhEMiwgLyogMHhEOC0weERCICovCisJMHhFQiwgMHhEOCwgMHhFQywgMHhBNiwgMHhFQywgMHhBNywgMHhFQywgMHhBQSwgLyogMHhEQy0weERGICovCisJMHhFQywgMHhBRiwgMHhFQywgMHhCMCwgMHhFQywgMHhCMSwgMHhFQywgMHhCMiwgLyogMHhFMC0weEUzICovCisJMHhFQywgMHhCNSwgMHhFQywgMHhCOCwgMHhFQywgMHhCQSwgMHhFQywgMHhDMCwgLyogMHhFNC0weEU3ICovCisJMHhFQywgMHhDMSwgMHhFQywgMHhDNSwgMHhFQywgMHhDNiwgMHhFQywgMHhDOSwgLyogMHhFOC0weEVCICovCisJMHhFQywgMHhDQSwgMHhFQywgMHhENSwgMHhFQywgMHhERCwgMHhFQywgMHhERSwgLyogMHhFQy0weEVGICovCisJMHhFQywgMHhFMSwgMHhFQywgMHhFNCwgMHhFQywgMHhFNywgMHhFQywgMHhFOCwgLyogMHhGMC0weEYzICovCisJMHhFQywgMHhGNywgMHhFQywgMHhGOCwgMHhFQywgMHhGQSwgMHhFRCwgMHhBMSwgLyogMHhGNC0weEY3ICovCisJMHhFRCwgMHhBMiwgMHhFRCwgMHhBMywgMHhFRCwgMHhFRSwgMHhFRSwgMHhEQiwgLyogMHhGOC0weEZCICovCisJMHhGMiwgMHhCRCwgMHhGMiwgMHhGQSwgMHhGMywgMHhCMSwgMHhGNCwgMHhBNywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfRkFbNTEyXSA9IHsKKwkweEY0LCAweEVFLCAweEY2LCAweEY0LCAweEY2LCAweEY2LCAweEY3LCAweEI4LCAvKiAweDAwLTB4MDMgKi8KKwkweEY3LCAweEM4LCAweEY3LCAweEQzLCAweEY4LCAweERCLCAweEY4LCAweEYwLCAvKiAweDA0LTB4MDcgKi8KKwkweEZBLCAweEExLCAweEZBLCAweEEyLCAweEZBLCAweEU2LCAweEZDLCAweEE5LCAvKiAweDA4LTB4MEIgKi8KKwkweEU4LCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEY1LCAweEMwLCAweDAwLCAweDAwLCAweEY0LCAweEU3LCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweEZELCAweEVCLCAweDAwLCAweDAwLCAweEVDLCAweENDLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweEVBLCAweERGLCAweEQ0LCAweERDLCAweEQ4LCAvKiAweDE4LTB4MUIgKi8KKwkweEVGLCAweEZFLCAweEVGLCAweEYxLCAweEU5LCAweEUyLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweEIzLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEVDLCAweEVGLCAweEQ0LCAweEI0LCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweEY5LCAweERFLCAweEY4LCAvKiAweDI4LTB4MkIgKi8KKwkweENFLCAweEJELCAweEY5LCAweENELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19GRls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4QTMsIDB4QTEsIDB4QTMsIDB4QTIsIDB4QTMsIDB4QTMsIC8qIDB4MDAtMHgwMyAqLworCTB4QTMsIDB4QTQsIDB4QTMsIDB4QTUsIDB4QTMsIDB4QTYsIDB4QTMsIDB4QTcsIC8qIDB4MDQtMHgwNyAqLworCTB4QTMsIDB4QTgsIDB4QTMsIDB4QTksIDB4QTMsIDB4QUEsIDB4QTMsIDB4QUIsIC8qIDB4MDgtMHgwQiAqLworCTB4QTMsIDB4QUMsIDB4QTMsIDB4QUQsIDB4QTMsIDB4QUUsIDB4QTMsIDB4QUYsIC8qIDB4MEMtMHgwRiAqLworCTB4QTMsIDB4QjAsIDB4QTMsIDB4QjEsIDB4QTMsIDB4QjIsIDB4QTMsIDB4QjMsIC8qIDB4MTAtMHgxMyAqLworCTB4QTMsIDB4QjQsIDB4QTMsIDB4QjUsIDB4QTMsIDB4QjYsIDB4QTMsIDB4QjcsIC8qIDB4MTQtMHgxNyAqLworCTB4QTMsIDB4QjgsIDB4QTMsIDB4QjksIDB4QTMsIDB4QkEsIDB4QTMsIDB4QkIsIC8qIDB4MTgtMHgxQiAqLworCTB4QTMsIDB4QkMsIDB4QTMsIDB4QkQsIDB4QTMsIDB4QkUsIDB4QTMsIDB4QkYsIC8qIDB4MUMtMHgxRiAqLworCTB4QTMsIDB4QzAsIDB4QTMsIDB4QzEsIDB4QTMsIDB4QzIsIDB4QTMsIDB4QzMsIC8qIDB4MjAtMHgyMyAqLworCTB4QTMsIDB4QzQsIDB4QTMsIDB4QzUsIDB4QTMsIDB4QzYsIDB4QTMsIDB4QzcsIC8qIDB4MjQtMHgyNyAqLworCTB4QTMsIDB4QzgsIDB4QTMsIDB4QzksIDB4QTMsIDB4Q0EsIDB4QTMsIDB4Q0IsIC8qIDB4MjgtMHgyQiAqLworCTB4QTMsIDB4Q0MsIDB4QTMsIDB4Q0QsIDB4QTMsIDB4Q0UsIDB4QTMsIDB4Q0YsIC8qIDB4MkMtMHgyRiAqLworCTB4QTMsIDB4RDAsIDB4QTMsIDB4RDEsIDB4QTMsIDB4RDIsIDB4QTMsIDB4RDMsIC8qIDB4MzAtMHgzMyAqLworCTB4QTMsIDB4RDQsIDB4QTMsIDB4RDUsIDB4QTMsIDB4RDYsIDB4QTMsIDB4RDcsIC8qIDB4MzQtMHgzNyAqLworCTB4QTMsIDB4RDgsIDB4QTMsIDB4RDksIDB4QTMsIDB4REEsIDB4QTMsIDB4REIsIC8qIDB4MzgtMHgzQiAqLworCTB4QTEsIDB4QUMsIDB4QTMsIDB4REQsIDB4QTMsIDB4REUsIDB4QTMsIDB4REYsIC8qIDB4M0MtMHgzRiAqLworCTB4QTMsIDB4RTAsIDB4QTMsIDB4RTEsIDB4QTMsIDB4RTIsIDB4QTMsIDB4RTMsIC8qIDB4NDAtMHg0MyAqLworCTB4QTMsIDB4RTQsIDB4QTMsIDB4RTUsIDB4QTMsIDB4RTYsIDB4QTMsIDB4RTcsIC8qIDB4NDQtMHg0NyAqLworCTB4QTMsIDB4RTgsIDB4QTMsIDB4RTksIDB4QTMsIDB4RUEsIDB4QTMsIDB4RUIsIC8qIDB4NDgtMHg0QiAqLworCTB4QTMsIDB4RUMsIDB4QTMsIDB4RUQsIDB4QTMsIDB4RUUsIDB4QTMsIDB4RUYsIC8qIDB4NEMtMHg0RiAqLworCTB4QTMsIDB4RjAsIDB4QTMsIDB4RjEsIDB4QTMsIDB4RjIsIDB4QTMsIDB4RjMsIC8qIDB4NTAtMHg1MyAqLworCTB4QTMsIDB4RjQsIDB4QTMsIDB4RjUsIDB4QTMsIDB4RjYsIDB4QTMsIDB4RjcsIC8qIDB4NTQtMHg1NyAqLworCTB4QTMsIDB4RjgsIDB4QTMsIDB4RjksIDB4QTMsIDB4RkEsIDB4QTMsIDB4RkIsIC8qIDB4NTgtMHg1QiAqLworCTB4QTMsIDB4RkMsIDB4QTMsIDB4RkQsIDB4QTIsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4QTQsIDB4RDQsIDB4QTQsIDB4QTEsIDB4QTQsIDB4QTIsIDB4QTQsIDB4QTMsIC8qIDB4QTAtMHhBMyAqLworCTB4QTQsIDB4QTQsIDB4QTQsIDB4QTUsIDB4QTQsIDB4QTYsIDB4QTQsIDB4QTcsIC8qIDB4QTQtMHhBNyAqLworCTB4QTQsIDB4QTgsIDB4QTQsIDB4QTksIDB4QTQsIDB4QUEsIDB4QTQsIDB4QUIsIC8qIDB4QTgtMHhBQiAqLworCTB4QTQsIDB4QUMsIDB4QTQsIDB4QUQsIDB4QTQsIDB4QUUsIDB4QTQsIDB4QUYsIC8qIDB4QUMtMHhBRiAqLworCTB4QTQsIDB4QjAsIDB4QTQsIDB4QjEsIDB4QTQsIDB4QjIsIDB4QTQsIDB4QjMsIC8qIDB4QjAtMHhCMyAqLworCTB4QTQsIDB4QjQsIDB4QTQsIDB4QjUsIDB4QTQsIDB4QjYsIDB4QTQsIDB4QjcsIC8qIDB4QjQtMHhCNyAqLworCTB4QTQsIDB4QjgsIDB4QTQsIDB4QjksIDB4QTQsIDB4QkEsIDB4QTQsIDB4QkIsIC8qIDB4QjgtMHhCQiAqLworCTB4QTQsIDB4QkMsIDB4QTQsIDB4QkQsIDB4QTQsIDB4QkUsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4QkYsIDB4QTQsIDB4QzAsIC8qIDB4QzAtMHhDMyAqLworCTB4QTQsIDB4QzEsIDB4QTQsIDB4QzIsIDB4QTQsIDB4QzMsIDB4QTQsIDB4QzQsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4QzUsIDB4QTQsIDB4QzYsIC8qIDB4QzgtMHhDQiAqLworCTB4QTQsIDB4QzcsIDB4QTQsIDB4QzgsIDB4QTQsIDB4QzksIDB4QTQsIDB4Q0EsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4Q0IsIDB4QTQsIDB4Q0MsIC8qIDB4RDAtMHhEMyAqLworCTB4QTQsIDB4Q0QsIDB4QTQsIDB4Q0UsIDB4QTQsIDB4Q0YsIDB4QTQsIDB4RDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4RDEsIDB4QTQsIDB4RDIsIC8qIDB4RDgtMHhEQiAqLworCTB4QTQsIDB4RDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4QTEsIDB4Q0IsIDB4QTEsIDB4Q0MsIDB4QTEsIDB4RkUsIDB4QTMsIDB4RkUsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4QTEsIDB4Q0QsIDB4QTMsIDB4REMsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlOVUxMLCAgIHUyY18wMSwgdTJjXzAyLCB1MmNfMDMsIHUyY18wNCwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgdTJjXzExLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJdTJjXzIwLCB1MmNfMjEsIHUyY18yMiwgdTJjXzIzLCB1MmNfMjQsIHUyY18yNSwgdTJjXzI2LCBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwl1MmNfMzAsIHUyY18zMSwgdTJjXzMyLCB1MmNfMzMsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICB1MmNfNEUsIHUyY180RiwgCisJdTJjXzUwLCB1MmNfNTEsIHUyY181MiwgdTJjXzUzLCB1MmNfNTQsIHUyY181NSwgdTJjXzU2LCB1MmNfNTcsIAorCXUyY181OCwgdTJjXzU5LCB1MmNfNUEsIHUyY181QiwgdTJjXzVDLCB1MmNfNUQsIHUyY181RSwgdTJjXzVGLCAKKwl1MmNfNjAsIHUyY182MSwgdTJjXzYyLCB1MmNfNjMsIHUyY182NCwgdTJjXzY1LCB1MmNfNjYsIHUyY182NywgCisJdTJjXzY4LCB1MmNfNjksIHUyY182QSwgdTJjXzZCLCB1MmNfNkMsIHUyY182RCwgdTJjXzZFLCB1MmNfNkYsIAorCXUyY183MCwgdTJjXzcxLCB1MmNfNzIsIHUyY183MywgdTJjXzc0LCB1MmNfNzUsIHUyY183NiwgdTJjXzc3LCAKKwl1MmNfNzgsIHUyY183OSwgdTJjXzdBLCB1MmNfN0IsIHUyY183QywgdTJjXzdELCB1MmNfN0UsIHUyY183RiwgCisJdTJjXzgwLCB1MmNfODEsIHUyY184MiwgdTJjXzgzLCB1MmNfODQsIHUyY184NSwgdTJjXzg2LCB1MmNfODcsIAorCXUyY184OCwgdTJjXzg5LCB1MmNfOEEsIHUyY184QiwgdTJjXzhDLCB1MmNfOEQsIHUyY184RSwgdTJjXzhGLCAKKwl1MmNfOTAsIHUyY185MSwgdTJjXzkyLCB1MmNfOTMsIHUyY185NCwgdTJjXzk1LCB1MmNfOTYsIHUyY185NywgCisJdTJjXzk4LCB1MmNfOTksIHUyY185QSwgdTJjXzlCLCB1MmNfOUMsIHUyY185RCwgdTJjXzlFLCB1MmNfOUYsIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIHUyY19BQywgdTJjX0FELCB1MmNfQUUsIHUyY19BRiwgCisJdTJjX0IwLCB1MmNfQjEsIHUyY19CMiwgdTJjX0IzLCB1MmNfQjQsIHUyY19CNSwgdTJjX0I2LCB1MmNfQjcsIAorCXUyY19COCwgdTJjX0I5LCB1MmNfQkEsIHUyY19CQiwgdTJjX0JDLCB1MmNfQkQsIHUyY19CRSwgdTJjX0JGLCAKKwl1MmNfQzAsIHUyY19DMSwgdTJjX0MyLCB1MmNfQzMsIHUyY19DNCwgdTJjX0M1LCB1MmNfQzYsIHUyY19DNywgCisJdTJjX0M4LCB1MmNfQzksIHUyY19DQSwgdTJjX0NCLCB1MmNfQ0MsIHUyY19DRCwgdTJjX0NFLCB1MmNfQ0YsIAorCXUyY19EMCwgdTJjX0QxLCB1MmNfRDIsIHUyY19EMywgdTJjX0Q0LCB1MmNfRDUsIHUyY19ENiwgdTJjX0Q3LCAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIHUyY19EQywgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICB1MmNfRjksIHUyY19GQSwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICB1MmNfRkYsIH07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKGNvbnN0IHdjaGFyX3QgdW5pLAorCQkJdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSYweEZGOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pPj44KSYweEZGOworCWludCBuOworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCkgeworCQlpZiAoYm91bmRsZW4gPD0gMSkKKwkJCXJldHVybiAtRU5BTUVUT09MT05HOworCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbCoyXTsKKwkJb3V0WzFdID0gdW5pMmNoYXJzZXRbY2wqMisxXTsKKwkJaWYgKG91dFswXSA9PSAweDAwICYmIG91dFsxXSA9PSAweDAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW4gPSAyOworCX0gZWxzZSBpZiAoY2g9PTAgJiYgY2wpIHsKKwkJb3V0WzBdID0gY2w7CisJCW4gPSAxOworCX0KKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sCisJCQl3Y2hhcl90ICp1bmkpCit7CisJdW5zaWduZWQgY2hhciBjaCwgY2w7CisJd2NoYXJfdCAqY2hhcnNldDJ1bmk7CisJaW50IG47CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwlpZiAoYm91bmRsZW4gPT0gMSkgeworCQkqdW5pID0gcmF3c3RyaW5nWzBdOworCQlyZXR1cm4gMTsKKwl9CisKKwljaCA9IHJhd3N0cmluZ1swXTsKKwljbCA9IHJhd3N0cmluZ1sxXTsKKworCWNoYXJzZXQydW5pID0gcGFnZV9jaGFyc2V0MnVuaVtjaF07CisJaWYgKGNoYXJzZXQydW5pICYmIGNsKSB7CisJCSp1bmkgPSBjaGFyc2V0MnVuaVtjbF07CisJCWlmICgqdW5pID09IDB4MDAwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQluID0gMjsKKwl9IGVsc2V7CisJCSp1bmkgPSBjaDsKKwkJbiA9IDE7CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDk0OSIsCisJLmFsaWFzCQk9ICJldWMta3IiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfY3A5NDkodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sc19jcDk0OSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2NwOTQ5KQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfY3A5NDkpCisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9BTElBU19OTFMoZXVjLWtyKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfY3A5NTAuYyBiL2ZzL25scy9ubHNfY3A5NTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTY3YTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19jcDk1MC5jCkBAIC0wLDAgKzEsOTQ4MyBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19jcDk1MC5jCisgKgorICogQ2hhcnNldCBjcDk1MCB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBUaGlzIHRyYW5zbGF0aW9uIHRhYmxlIHdhcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSwgdGhlCisgKiBvcmlnaW5hbCB0YWJsZSBjYW4gYmUgZG93bmxvYWQgZnJvbSB0aGUgTWljcm9zb2Z0IHdlYnNpdGUuCisgKiAoaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvdW5pY29kZS91bmljb2RlY3AuaHRtKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjMnVfQTFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgzMDAwLDB4RkYwQywweDMwMDEsMHgzMDAyLDB4RkYwRSwweDIwMjcsMHhGRjFCLDB4RkYxQSwvKiAweDQwLTB4NDcgKi8KKwkweEZGMUYsMHhGRjAxLDB4RkUzMCwweDIwMjYsMHgyMDI1LDB4RkU1MCwweEZFNTEsMHhGRTUyLC8qIDB4NDgtMHg0RiAqLworCTB4MDBCNywweEZFNTQsMHhGRTU1LDB4RkU1NiwweEZFNTcsMHhGRjVDLDB4MjAxMywweEZFMzEsLyogMHg1MC0weDU3ICovCisJMHgyMDE0LDB4RkUzMywweDI1NzQsMHhGRTM0LDB4RkU0RiwweEZGMDgsMHhGRjA5LDB4RkUzNSwvKiAweDU4LTB4NUYgKi8KKwkweEZFMzYsMHhGRjVCLDB4RkY1RCwweEZFMzcsMHhGRTM4LDB4MzAxNCwweDMwMTUsMHhGRTM5LC8qIDB4NjAtMHg2NyAqLworCTB4RkUzQSwweDMwMTAsMHgzMDExLDB4RkUzQiwweEZFM0MsMHgzMDBBLDB4MzAwQiwweEZFM0QsLyogMHg2OC0weDZGICovCisJMHhGRTNFLDB4MzAwOCwweDMwMDksMHhGRTNGLDB4RkU0MCwweDMwMEMsMHgzMDBELDB4RkU0MSwvKiAweDcwLTB4NzcgKi8KKwkweEZFNDIsMHgzMDBFLDB4MzAwRiwweEZFNDMsMHhGRTQ0LDB4RkU1OSwweEZFNUEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHhGRTVCLDB4RkU1QywweEZFNUQsMHhGRTVFLDB4MjAxOCwweDIwMTksMHgyMDFDLC8qIDB4QTAtMHhBNyAqLworCTB4MjAxRCwweDMwMUQsMHgzMDFFLDB4MjAzNSwweDIwMzIsMHhGRjAzLDB4RkYwNiwweEZGMEEsLyogMHhBOC0weEFGICovCisJMHgyMDNCLDB4MDBBNywweDMwMDMsMHgyNUNCLDB4MjVDRiwweDI1QjMsMHgyNUIyLDB4MjVDRSwvKiAweEIwLTB4QjcgKi8KKwkweDI2MDYsMHgyNjA1LDB4MjVDNywweDI1QzYsMHgyNUExLDB4MjVBMCwweDI1QkQsMHgyNUJDLC8qIDB4QjgtMHhCRiAqLworCTB4MzJBMywweDIxMDUsMHgwMEFGLDB4RkZFMywweEZGM0YsMHgwMkNELDB4RkU0OSwweEZFNEEsLyogMHhDMC0weEM3ICovCisJMHhGRTRELDB4RkU0RSwweEZFNEIsMHhGRTRDLDB4RkU1RiwweEZFNjAsMHhGRTYxLDB4RkYwQiwvKiAweEM4LTB4Q0YgKi8KKwkweEZGMEQsMHgwMEQ3LDB4MDBGNywweDAwQjEsMHgyMjFBLDB4RkYxQywweEZGMUUsMHhGRjFELC8qIDB4RDAtMHhENyAqLworCTB4MjI2NiwweDIyNjcsMHgyMjYwLDB4MjIxRSwweDIyNTIsMHgyMjYxLDB4RkU2MiwweEZFNjMsLyogMHhEOC0weERGICovCisJMHhGRTY0LDB4RkU2NSwweEZFNjYsMHhGRjVFLDB4MjIyOSwweDIyMkEsMHgyMkE1LDB4MjIyMCwvKiAweEUwLTB4RTcgKi8KKwkweDIyMUYsMHgyMkJGLDB4MzNEMiwweDMzRDEsMHgyMjJCLDB4MjIyRSwweDIyMzUsMHgyMjM0LC8qIDB4RTgtMHhFRiAqLworCTB4MjY0MCwweDI2NDIsMHgyMjk1LDB4MjI5OSwweDIxOTEsMHgyMTkzLDB4MjE5MCwweDIxOTIsLyogMHhGMC0weEY3ICovCisJMHgyMTk2LDB4MjE5NywweDIxOTksMHgyMTk4LDB4MjIyNSwweDIyMjMsMHhGRjBGLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BMlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweEZGM0MsMHgyMjE1LDB4RkU2OCwweEZGMDQsMHhGRkU1LDB4MzAxMiwweEZGRTAsMHhGRkUxLC8qIDB4NDAtMHg0NyAqLworCTB4RkYwNSwweEZGMjAsMHgyMTAzLDB4MjEwOSwweEZFNjksMHhGRTZBLDB4RkU2QiwweDMzRDUsLyogMHg0OC0weDRGICovCisJMHgzMzlDLDB4MzM5RCwweDMzOUUsMHgzM0NFLDB4MzNBMSwweDMzOEUsMHgzMzhGLDB4MzNDNCwvKiAweDUwLTB4NTcgKi8KKwkweDAwQjAsMHg1MTU5LDB4NTE1QiwweDUxNUUsMHg1MTVELDB4NTE2MSwweDUxNjMsMHg1NUU3LC8qIDB4NTgtMHg1RiAqLworCTB4NzRFOSwweDdDQ0UsMHgyNTgxLDB4MjU4MiwweDI1ODMsMHgyNTg0LDB4MjU4NSwweDI1ODYsLyogMHg2MC0weDY3ICovCisJMHgyNTg3LDB4MjU4OCwweDI1OEYsMHgyNThFLDB4MjU4RCwweDI1OEMsMHgyNThCLDB4MjU4QSwvKiAweDY4LTB4NkYgKi8KKwkweDI1ODksMHgyNTNDLDB4MjUzNCwweDI1MkMsMHgyNTI0LDB4MjUxQywweDI1OTQsMHgyNTAwLC8qIDB4NzAtMHg3NyAqLworCTB4MjUwMiwweDI1OTUsMHgyNTBDLDB4MjUxMCwweDI1MTQsMHgyNTE4LDB4MjU2RCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDI1NkUsMHgyNTcwLDB4MjU2RiwweDI1NTAsMHgyNTVFLDB4MjU2QSwweDI1NjEsLyogMHhBMC0weEE3ICovCisJMHgyNUUyLDB4MjVFMywweDI1RTUsMHgyNUU0LDB4MjU3MSwweDI1NzIsMHgyNTczLDB4RkYxMCwvKiAweEE4LTB4QUYgKi8KKwkweEZGMTEsMHhGRjEyLDB4RkYxMywweEZGMTQsMHhGRjE1LDB4RkYxNiwweEZGMTcsMHhGRjE4LC8qIDB4QjAtMHhCNyAqLworCTB4RkYxOSwweDIxNjAsMHgyMTYxLDB4MjE2MiwweDIxNjMsMHgyMTY0LDB4MjE2NSwweDIxNjYsLyogMHhCOC0weEJGICovCisJMHgyMTY3LDB4MjE2OCwweDIxNjksMHgzMDIxLDB4MzAyMiwweDMwMjMsMHgzMDI0LDB4MzAyNSwvKiAweEMwLTB4QzcgKi8KKwkweDMwMjYsMHgzMDI3LDB4MzAyOCwweDMwMjksMHg1MzQxLDB4NTM0NCwweDUzNDUsMHhGRjIxLC8qIDB4QzgtMHhDRiAqLworCTB4RkYyMiwweEZGMjMsMHhGRjI0LDB4RkYyNSwweEZGMjYsMHhGRjI3LDB4RkYyOCwweEZGMjksLyogMHhEMC0weEQ3ICovCisJMHhGRjJBLDB4RkYyQiwweEZGMkMsMHhGRjJELDB4RkYyRSwweEZGMkYsMHhGRjMwLDB4RkYzMSwvKiAweEQ4LTB4REYgKi8KKwkweEZGMzIsMHhGRjMzLDB4RkYzNCwweEZGMzUsMHhGRjM2LDB4RkYzNywweEZGMzgsMHhGRjM5LC8qIDB4RTAtMHhFNyAqLworCTB4RkYzQSwweEZGNDEsMHhGRjQyLDB4RkY0MywweEZGNDQsMHhGRjQ1LDB4RkY0NiwweEZGNDcsLyogMHhFOC0weEVGICovCisJMHhGRjQ4LDB4RkY0OSwweEZGNEEsMHhGRjRCLDB4RkY0QywweEZGNEQsMHhGRjRFLDB4RkY0RiwvKiAweEYwLTB4RjcgKi8KKwkweEZGNTAsMHhGRjUxLDB4RkY1MiwweEZGNTMsMHhGRjU0LDB4RkY1NSwweEZGNTYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0EzWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4RkY1NywweEZGNTgsMHhGRjU5LDB4RkY1QSwweDAzOTEsMHgwMzkyLDB4MDM5MywweDAzOTQsLyogMHg0MC0weDQ3ICovCisJMHgwMzk1LDB4MDM5NiwweDAzOTcsMHgwMzk4LDB4MDM5OSwweDAzOUEsMHgwMzlCLDB4MDM5QywvKiAweDQ4LTB4NEYgKi8KKwkweDAzOUQsMHgwMzlFLDB4MDM5RiwweDAzQTAsMHgwM0ExLDB4MDNBMywweDAzQTQsMHgwM0E1LC8qIDB4NTAtMHg1NyAqLworCTB4MDNBNiwweDAzQTcsMHgwM0E4LDB4MDNBOSwweDAzQjEsMHgwM0IyLDB4MDNCMywweDAzQjQsLyogMHg1OC0weDVGICovCisJMHgwM0I1LDB4MDNCNiwweDAzQjcsMHgwM0I4LDB4MDNCOSwweDAzQkEsMHgwM0JCLDB4MDNCQywvKiAweDYwLTB4NjcgKi8KKwkweDAzQkQsMHgwM0JFLDB4MDNCRiwweDAzQzAsMHgwM0MxLDB4MDNDMywweDAzQzQsMHgwM0M1LC8qIDB4NjgtMHg2RiAqLworCTB4MDNDNiwweDAzQzcsMHgwM0M4LDB4MDNDOSwweDMxMDUsMHgzMTA2LDB4MzEwNywweDMxMDgsLyogMHg3MC0weDc3ICovCisJMHgzMTA5LDB4MzEwQSwweDMxMEIsMHgzMTBDLDB4MzEwRCwweDMxMEUsMHgzMTBGLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4MzExMCwweDMxMTEsMHgzMTEyLDB4MzExMywweDMxMTQsMHgzMTE1LDB4MzExNiwvKiAweEEwLTB4QTcgKi8KKwkweDMxMTcsMHgzMTE4LDB4MzExOSwweDMxMUEsMHgzMTFCLDB4MzExQywweDMxMUQsMHgzMTFFLC8qIDB4QTgtMHhBRiAqLworCTB4MzExRiwweDMxMjAsMHgzMTIxLDB4MzEyMiwweDMxMjMsMHgzMTI0LDB4MzEyNSwweDMxMjYsLyogMHhCMC0weEI3ICovCisJMHgzMTI3LDB4MzEyOCwweDMxMjksMHgwMkQ5LDB4MDJDOSwweDAyQ0EsMHgwMkM3LDB4MDJDQiwvKiAweEI4LTB4QkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QzAtMHhDNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhDOC0weENGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEQwLTB4RDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RDgtMHhERiAqLworCTB4MDAwMCwweDIwQUMsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhFMC0weEU3ICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQTRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg0RTAwLDB4NEU1OSwweDRFMDEsMHg0RTAzLDB4NEU0MywweDRFNUQsMHg0RTg2LDB4NEU4QywvKiAweDQwLTB4NDcgKi8KKwkweDRFQkEsMHg1MTNGLDB4NTE2NSwweDUxNkIsMHg1MUUwLDB4NTIwMCwweDUyMDEsMHg1MjlCLC8qIDB4NDgtMHg0RiAqLworCTB4NTMxNSwweDUzNDEsMHg1MzVDLDB4NTNDOCwweDRFMDksMHg0RTBCLDB4NEUwOCwweDRFMEEsLyogMHg1MC0weDU3ICovCisJMHg0RTJCLDB4NEUzOCwweDUxRTEsMHg0RTQ1LDB4NEU0OCwweDRFNUYsMHg0RTVFLDB4NEU4RSwvKiAweDU4LTB4NUYgKi8KKwkweDRFQTEsMHg1MTQwLDB4NTIwMywweDUyRkEsMHg1MzQzLDB4NTNDOSwweDUzRTMsMHg1NzFGLC8qIDB4NjAtMHg2NyAqLworCTB4NThFQiwweDU5MTUsMHg1OTI3LDB4NTk3MywweDVCNTAsMHg1QjUxLDB4NUI1MywweDVCRjgsLyogMHg2OC0weDZGICovCisJMHg1QzBGLDB4NUMyMiwweDVDMzgsMHg1QzcxLDB4NURERCwweDVERTUsMHg1REYxLDB4NURGMiwvKiAweDcwLTB4NzcgKi8KKwkweDVERjMsMHg1REZFLDB4NUU3MiwweDVFRkUsMHg1RjBCLDB4NUYxMywweDYyNEQsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg0RTExLDB4NEUxMCwweDRFMEQsMHg0RTJELDB4NEUzMCwweDRFMzksMHg0RTRCLC8qIDB4QTAtMHhBNyAqLworCTB4NUMzOSwweDRFODgsMHg0RTkxLDB4NEU5NSwweDRFOTIsMHg0RTk0LDB4NEVBMiwweDRFQzEsLyogMHhBOC0weEFGICovCisJMHg0RUMwLDB4NEVDMywweDRFQzYsMHg0RUM3LDB4NEVDRCwweDRFQ0EsMHg0RUNCLDB4NEVDNCwvKiAweEIwLTB4QjcgKi8KKwkweDUxNDMsMHg1MTQxLDB4NTE2NywweDUxNkQsMHg1MTZFLDB4NTE2QywweDUxOTcsMHg1MUY2LC8qIDB4QjgtMHhCRiAqLworCTB4NTIwNiwweDUyMDcsMHg1MjA4LDB4NTJGQiwweDUyRkUsMHg1MkZGLDB4NTMxNiwweDUzMzksLyogMHhDMC0weEM3ICovCisJMHg1MzQ4LDB4NTM0NywweDUzNDUsMHg1MzVFLDB4NTM4NCwweDUzQ0IsMHg1M0NBLDB4NTNDRCwvKiAweEM4LTB4Q0YgKi8KKwkweDU4RUMsMHg1OTI5LDB4NTkyQiwweDU5MkEsMHg1OTJELDB4NUI1NCwweDVDMTEsMHg1QzI0LC8qIDB4RDAtMHhENyAqLworCTB4NUMzQSwweDVDNkYsMHg1REY0LDB4NUU3QiwweDVFRkYsMHg1RjE0LDB4NUYxNSwweDVGQzMsLyogMHhEOC0weERGICovCisJMHg2MjA4LDB4NjIzNiwweDYyNEIsMHg2MjRFLDB4NjUyRiwweDY1ODcsMHg2NTk3LDB4NjVBNCwvKiAweEUwLTB4RTcgKi8KKwkweDY1QjksMHg2NUU1LDB4NjZGMCwweDY3MDgsMHg2NzI4LDB4NkIyMCwweDZCNjIsMHg2Qjc5LC8qIDB4RTgtMHhFRiAqLworCTB4NkJDQiwweDZCRDQsMHg2QkRCLDB4NkMwRiwweDZDMzQsMHg3MDZCLDB4NzIyQSwweDcyMzYsLyogMHhGMC0weEY3ICovCisJMHg3MjNCLDB4NzI0NywweDcyNTksMHg3MjVCLDB4NzJBQywweDczOEIsMHg0RTE5LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BNVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDRFMTYsMHg0RTE1LDB4NEUxNCwweDRFMTgsMHg0RTNCLDB4NEU0RCwweDRFNEYsMHg0RTRFLC8qIDB4NDAtMHg0NyAqLworCTB4NEVFNSwweDRFRDgsMHg0RUQ0LDB4NEVENSwweDRFRDYsMHg0RUQ3LDB4NEVFMywweDRFRTQsLyogMHg0OC0weDRGICovCisJMHg0RUQ5LDB4NEVERSwweDUxNDUsMHg1MTQ0LDB4NTE4OSwweDUxOEEsMHg1MUFDLDB4NTFGOSwvKiAweDUwLTB4NTcgKi8KKwkweDUxRkEsMHg1MUY4LDB4NTIwQSwweDUyQTAsMHg1MjlGLDB4NTMwNSwweDUzMDYsMHg1MzE3LC8qIDB4NTgtMHg1RiAqLworCTB4NTMxRCwweDRFREYsMHg1MzRBLDB4NTM0OSwweDUzNjEsMHg1MzYwLDB4NTM2RiwweDUzNkUsLyogMHg2MC0weDY3ICovCisJMHg1M0JCLDB4NTNFRiwweDUzRTQsMHg1M0YzLDB4NTNFQywweDUzRUUsMHg1M0U5LDB4NTNFOCwvKiAweDY4LTB4NkYgKi8KKwkweDUzRkMsMHg1M0Y4LDB4NTNGNSwweDUzRUIsMHg1M0U2LDB4NTNFQSwweDUzRjIsMHg1M0YxLC8qIDB4NzAtMHg3NyAqLworCTB4NTNGMCwweDUzRTUsMHg1M0VELDB4NTNGQiwweDU2REIsMHg1NkRBLDB4NTkxNiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDU5MkUsMHg1OTMxLDB4NTk3NCwweDU5NzYsMHg1QjU1LDB4NUI4MywweDVDM0MsLyogMHhBMC0weEE3ICovCisJMHg1REU4LDB4NURFNywweDVERTYsMHg1RTAyLDB4NUUwMywweDVFNzMsMHg1RTdDLDB4NUYwMSwvKiAweEE4LTB4QUYgKi8KKwkweDVGMTgsMHg1RjE3LDB4NUZDNSwweDYyMEEsMHg2MjUzLDB4NjI1NCwweDYyNTIsMHg2MjUxLC8qIDB4QjAtMHhCNyAqLworCTB4NjVBNSwweDY1RTYsMHg2NzJFLDB4NjcyQywweDY3MkEsMHg2NzJCLDB4NjcyRCwweDZCNjMsLyogMHhCOC0weEJGICovCisJMHg2QkNELDB4NkMxMSwweDZDMTAsMHg2QzM4LDB4NkM0MSwweDZDNDAsMHg2QzNFLDB4NzJBRiwvKiAweEMwLTB4QzcgKi8KKwkweDczODQsMHg3Mzg5LDB4NzREQywweDc0RTYsMHg3NTE4LDB4NzUxRiwweDc1MjgsMHg3NTI5LC8qIDB4QzgtMHhDRiAqLworCTB4NzUzMCwweDc1MzEsMHg3NTMyLDB4NzUzMywweDc1OEIsMHg3NjdELDB4NzZBRSwweDc2QkYsLyogMHhEMC0weEQ3ICovCisJMHg3NkVFLDB4NzdEQiwweDc3RTIsMHg3N0YzLDB4NzkzQSwweDc5QkUsMHg3QTc0LDB4N0FDQiwvKiAweEQ4LTB4REYgKi8KKwkweDRFMUUsMHg0RTFGLDB4NEU1MiwweDRFNTMsMHg0RTY5LDB4NEU5OSwweDRFQTQsMHg0RUE2LC8qIDB4RTAtMHhFNyAqLworCTB4NEVBNSwweDRFRkYsMHg0RjA5LDB4NEYxOSwweDRGMEEsMHg0RjE1LDB4NEYwRCwweDRGMTAsLyogMHhFOC0weEVGICovCisJMHg0RjExLDB4NEYwRiwweDRFRjIsMHg0RUY2LDB4NEVGQiwweDRFRjAsMHg0RUYzLDB4NEVGRCwvKiAweEYwLTB4RjcgKi8KKwkweDRGMDEsMHg0RjBCLDB4NTE0OSwweDUxNDcsMHg1MTQ2LDB4NTE0OCwweDUxNjgsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0E2WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NTE3MSwweDUxOEQsMHg1MUIwLDB4NTIxNywweDUyMTEsMHg1MjEyLDB4NTIwRSwweDUyMTYsLyogMHg0MC0weDQ3ICovCisJMHg1MkEzLDB4NTMwOCwweDUzMjEsMHg1MzIwLDB4NTM3MCwweDUzNzEsMHg1NDA5LDB4NTQwRiwvKiAweDQ4LTB4NEYgKi8KKwkweDU0MEMsMHg1NDBBLDB4NTQxMCwweDU0MDEsMHg1NDBCLDB4NTQwNCwweDU0MTEsMHg1NDBELC8qIDB4NTAtMHg1NyAqLworCTB4NTQwOCwweDU0MDMsMHg1NDBFLDB4NTQwNiwweDU0MTIsMHg1NkUwLDB4NTZERSwweDU2REQsLyogMHg1OC0weDVGICovCisJMHg1NzMzLDB4NTczMCwweDU3MjgsMHg1NzJELDB4NTcyQywweDU3MkYsMHg1NzI5LDB4NTkxOSwvKiAweDYwLTB4NjcgKi8KKwkweDU5MUEsMHg1OTM3LDB4NTkzOCwweDU5ODQsMHg1OTc4LDB4NTk4MywweDU5N0QsMHg1OTc5LC8qIDB4NjgtMHg2RiAqLworCTB4NTk4MiwweDU5ODEsMHg1QjU3LDB4NUI1OCwweDVCODcsMHg1Qjg4LDB4NUI4NSwweDVCODksLyogMHg3MC0weDc3ICovCisJMHg1QkZBLDB4NUMxNiwweDVDNzksMHg1RERFLDB4NUUwNiwweDVFNzYsMHg1RTc0LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NUYwRiwweDVGMUIsMHg1RkQ5LDB4NUZENiwweDYyMEUsMHg2MjBDLDB4NjIwRCwvKiAweEEwLTB4QTcgKi8KKwkweDYyMTAsMHg2MjYzLDB4NjI1QiwweDYyNTgsMHg2NTM2LDB4NjVFOSwweDY1RTgsMHg2NUVDLC8qIDB4QTgtMHhBRiAqLworCTB4NjVFRCwweDY2RjIsMHg2NkYzLDB4NjcwOSwweDY3M0QsMHg2NzM0LDB4NjczMSwweDY3MzUsLyogMHhCMC0weEI3ICovCisJMHg2QjIxLDB4NkI2NCwweDZCN0IsMHg2QzE2LDB4NkM1RCwweDZDNTcsMHg2QzU5LDB4NkM1RiwvKiAweEI4LTB4QkYgKi8KKwkweDZDNjAsMHg2QzUwLDB4NkM1NSwweDZDNjEsMHg2QzVCLDB4NkM0RCwweDZDNEUsMHg3MDcwLC8qIDB4QzAtMHhDNyAqLworCTB4NzI1RiwweDcyNUQsMHg3NjdFLDB4N0FGOSwweDdDNzMsMHg3Q0Y4LDB4N0YzNiwweDdGOEEsLyogMHhDOC0weENGICovCisJMHg3RkJELDB4ODAwMSwweDgwMDMsMHg4MDBDLDB4ODAxMiwweDgwMzMsMHg4MDdGLDB4ODA4OSwvKiAweEQwLTB4RDcgKi8KKwkweDgwOEIsMHg4MDhDLDB4ODFFMywweDgxRUEsMHg4MUYzLDB4ODFGQywweDgyMEMsMHg4MjFCLC8qIDB4RDgtMHhERiAqLworCTB4ODIxRiwweDgyNkUsMHg4MjcyLDB4ODI3RSwweDg2NkIsMHg4ODQwLDB4ODg0QywweDg4NjMsLyogMHhFMC0weEU3ICovCisJMHg4OTdGLDB4OTYyMSwweDRFMzIsMHg0RUE4LDB4NEY0RCwweDRGNEYsMHg0RjQ3LDB4NEY1NywvKiAweEU4LTB4RUYgKi8KKwkweDRGNUUsMHg0RjM0LDB4NEY1QiwweDRGNTUsMHg0RjMwLDB4NEY1MCwweDRGNTEsMHg0RjNELC8qIDB4RjAtMHhGNyAqLworCTB4NEYzQSwweDRGMzgsMHg0RjQzLDB4NEY1NCwweDRGM0MsMHg0RjQ2LDB4NEY2MywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQTdbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg0RjVDLDB4NEY2MCwweDRGMkYsMHg0RjRFLDB4NEYzNiwweDRGNTksMHg0RjVELDB4NEY0OCwvKiAweDQwLTB4NDcgKi8KKwkweDRGNUEsMHg1MTRDLDB4NTE0QiwweDUxNEQsMHg1MTc1LDB4NTFCNiwweDUxQjcsMHg1MjI1LC8qIDB4NDgtMHg0RiAqLworCTB4NTIyNCwweDUyMjksMHg1MjJBLDB4NTIyOCwweDUyQUIsMHg1MkE5LDB4NTJBQSwweDUyQUMsLyogMHg1MC0weDU3ICovCisJMHg1MzIzLDB4NTM3MywweDUzNzUsMHg1NDFELDB4NTQyRCwweDU0MUUsMHg1NDNFLDB4NTQyNiwvKiAweDU4LTB4NUYgKi8KKwkweDU0NEUsMHg1NDI3LDB4NTQ0NiwweDU0NDMsMHg1NDMzLDB4NTQ0OCwweDU0NDIsMHg1NDFCLC8qIDB4NjAtMHg2NyAqLworCTB4NTQyOSwweDU0NEEsMHg1NDM5LDB4NTQzQiwweDU0MzgsMHg1NDJFLDB4NTQzNSwweDU0MzYsLyogMHg2OC0weDZGICovCisJMHg1NDIwLDB4NTQzQywweDU0NDAsMHg1NDMxLDB4NTQyQiwweDU0MUYsMHg1NDJDLDB4NTZFQSwvKiAweDcwLTB4NzcgKi8KKwkweDU2RjAsMHg1NkU0LDB4NTZFQiwweDU3NEEsMHg1NzUxLDB4NTc0MCwweDU3NEQsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg1NzQ3LDB4NTc0RSwweDU3M0UsMHg1NzUwLDB4NTc0RiwweDU3M0IsMHg1OEVGLC8qIDB4QTAtMHhBNyAqLworCTB4NTkzRSwweDU5OUQsMHg1OTkyLDB4NTlBOCwweDU5OUUsMHg1OUEzLDB4NTk5OSwweDU5OTYsLyogMHhBOC0weEFGICovCisJMHg1OThELDB4NTlBNCwweDU5OTMsMHg1OThBLDB4NTlBNSwweDVCNUQsMHg1QjVDLDB4NUI1QSwvKiAweEIwLTB4QjcgKi8KKwkweDVCNUIsMHg1QjhDLDB4NUI4QiwweDVCOEYsMHg1QzJDLDB4NUM0MCwweDVDNDEsMHg1QzNGLC8qIDB4QjgtMHhCRiAqLworCTB4NUMzRSwweDVDOTAsMHg1QzkxLDB4NUM5NCwweDVDOEMsMHg1REVCLDB4NUUwQywweDVFOEYsLyogMHhDMC0weEM3ICovCisJMHg1RTg3LDB4NUU4QSwweDVFRjcsMHg1RjA0LDB4NUYxRiwweDVGNjQsMHg1RjYyLDB4NUY3NywvKiAweEM4LTB4Q0YgKi8KKwkweDVGNzksMHg1RkQ4LDB4NUZDQywweDVGRDcsMHg1RkNELDB4NUZGMSwweDVGRUIsMHg1RkY4LC8qIDB4RDAtMHhENyAqLworCTB4NUZFQSwweDYyMTIsMHg2MjExLDB4NjI4NCwweDYyOTcsMHg2Mjk2LDB4NjI4MCwweDYyNzYsLyogMHhEOC0weERGICovCisJMHg2Mjg5LDB4NjI2RCwweDYyOEEsMHg2MjdDLDB4NjI3RSwweDYyNzksMHg2MjczLDB4NjI5MiwvKiAweEUwLTB4RTcgKi8KKwkweDYyNkYsMHg2Mjk4LDB4NjI2RSwweDYyOTUsMHg2MjkzLDB4NjI5MSwweDYyODYsMHg2NTM5LC8qIDB4RTgtMHhFRiAqLworCTB4NjUzQiwweDY1MzgsMHg2NUYxLDB4NjZGNCwweDY3NUYsMHg2NzRFLDB4Njc0RiwweDY3NTAsLyogMHhGMC0weEY3ICovCisJMHg2NzUxLDB4Njc1QywweDY3NTYsMHg2NzVFLDB4Njc0OSwweDY3NDYsMHg2NzYwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BOFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDY3NTMsMHg2NzU3LDB4NkI2NSwweDZCQ0YsMHg2QzQyLDB4NkM1RSwweDZDOTksMHg2QzgxLC8qIDB4NDAtMHg0NyAqLworCTB4NkM4OCwweDZDODksMHg2Qzg1LDB4NkM5QiwweDZDNkEsMHg2QzdBLDB4NkM5MCwweDZDNzAsLyogMHg0OC0weDRGICovCisJMHg2QzhDLDB4NkM2OCwweDZDOTYsMHg2QzkyLDB4NkM3RCwweDZDODMsMHg2QzcyLDB4NkM3RSwvKiAweDUwLTB4NTcgKi8KKwkweDZDNzQsMHg2Qzg2LDB4NkM3NiwweDZDOEQsMHg2Qzk0LDB4NkM5OCwweDZDODIsMHg3MDc2LC8qIDB4NTgtMHg1RiAqLworCTB4NzA3QywweDcwN0QsMHg3MDc4LDB4NzI2MiwweDcyNjEsMHg3MjYwLDB4NzJDNCwweDcyQzIsLyogMHg2MC0weDY3ICovCisJMHg3Mzk2LDB4NzUyQywweDc1MkIsMHg3NTM3LDB4NzUzOCwweDc2ODIsMHg3NkVGLDB4NzdFMywvKiAweDY4LTB4NkYgKi8KKwkweDc5QzEsMHg3OUMwLDB4NzlCRiwweDdBNzYsMHg3Q0ZCLDB4N0Y1NSwweDgwOTYsMHg4MDkzLC8qIDB4NzAtMHg3NyAqLworCTB4ODA5RCwweDgwOTgsMHg4MDlCLDB4ODA5QSwweDgwQjIsMHg4MjZGLDB4ODI5MiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDgyOEIsMHg4MjhELDB4ODk4QiwweDg5RDIsMHg4QTAwLDB4OEMzNywweDhDNDYsLyogMHhBMC0weEE3ICovCisJMHg4QzU1LDB4OEM5RCwweDhENjQsMHg4RDcwLDB4OERCMywweDhFQUIsMHg4RUNBLDB4OEY5QiwvKiAweEE4LTB4QUYgKi8KKwkweDhGQjAsMHg4RkMyLDB4OEZDNiwweDhGQzUsMHg4RkM0LDB4NURFMSwweDkwOTEsMHg5MEEyLC8qIDB4QjAtMHhCNyAqLworCTB4OTBBQSwweDkwQTYsMHg5MEEzLDB4OTE0OSwweDkxQzYsMHg5MUNDLDB4OTYzMiwweDk2MkUsLyogMHhCOC0weEJGICovCisJMHg5NjMxLDB4OTYyQSwweDk2MkMsMHg0RTI2LDB4NEU1NiwweDRFNzMsMHg0RThCLDB4NEU5QiwvKiAweEMwLTB4QzcgKi8KKwkweDRFOUUsMHg0RUFCLDB4NEVBQywweDRGNkYsMHg0RjlELDB4NEY4RCwweDRGNzMsMHg0RjdGLC8qIDB4QzgtMHhDRiAqLworCTB4NEY2QywweDRGOUIsMHg0RjhCLDB4NEY4NiwweDRGODMsMHg0RjcwLDB4NEY3NSwweDRGODgsLyogMHhEMC0weEQ3ICovCisJMHg0RjY5LDB4NEY3QiwweDRGOTYsMHg0RjdFLDB4NEY4RiwweDRGOTEsMHg0RjdBLDB4NTE1NCwvKiAweEQ4LTB4REYgKi8KKwkweDUxNTIsMHg1MTU1LDB4NTE2OSwweDUxNzcsMHg1MTc2LDB4NTE3OCwweDUxQkQsMHg1MUZELC8qIDB4RTAtMHhFNyAqLworCTB4NTIzQiwweDUyMzgsMHg1MjM3LDB4NTIzQSwweDUyMzAsMHg1MjJFLDB4NTIzNiwweDUyNDEsLyogMHhFOC0weEVGICovCisJMHg1MkJFLDB4NTJCQiwweDUzNTIsMHg1MzU0LDB4NTM1MywweDUzNTEsMHg1MzY2LDB4NTM3NywvKiAweEYwLTB4RjcgKi8KKwkweDUzNzgsMHg1Mzc5LDB4NTNENiwweDUzRDQsMHg1M0Q3LDB4NTQ3MywweDU0NzUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0E5WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NTQ5NiwweDU0NzgsMHg1NDk1LDB4NTQ4MCwweDU0N0IsMHg1NDc3LDB4NTQ4NCwweDU0OTIsLyogMHg0MC0weDQ3ICovCisJMHg1NDg2LDB4NTQ3QywweDU0OTAsMHg1NDcxLDB4NTQ3NiwweDU0OEMsMHg1NDlBLDB4NTQ2MiwvKiAweDQ4LTB4NEYgKi8KKwkweDU0NjgsMHg1NDhCLDB4NTQ3RCwweDU0OEUsMHg1NkZBLDB4NTc4MywweDU3NzcsMHg1NzZBLC8qIDB4NTAtMHg1NyAqLworCTB4NTc2OSwweDU3NjEsMHg1NzY2LDB4NTc2NCwweDU3N0MsMHg1OTFDLDB4NTk0OSwweDU5NDcsLyogMHg1OC0weDVGICovCisJMHg1OTQ4LDB4NTk0NCwweDU5NTQsMHg1OUJFLDB4NTlCQiwweDU5RDQsMHg1OUI5LDB4NTlBRSwvKiAweDYwLTB4NjcgKi8KKwkweDU5RDEsMHg1OUM2LDB4NTlEMCwweDU5Q0QsMHg1OUNCLDB4NTlEMywweDU5Q0EsMHg1OUFGLC8qIDB4NjgtMHg2RiAqLworCTB4NTlCMywweDU5RDIsMHg1OUM1LDB4NUI1RiwweDVCNjQsMHg1QjYzLDB4NUI5NywweDVCOUEsLyogMHg3MC0weDc3ICovCisJMHg1Qjk4LDB4NUI5QywweDVCOTksMHg1QjlCLDB4NUMxQSwweDVDNDgsMHg1QzQ1LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NUM0NiwweDVDQjcsMHg1Q0ExLDB4NUNCOCwweDVDQTksMHg1Q0FCLDB4NUNCMSwvKiAweEEwLTB4QTcgKi8KKwkweDVDQjMsMHg1RTE4LDB4NUUxQSwweDVFMTYsMHg1RTE1LDB4NUUxQiwweDVFMTEsMHg1RTc4LC8qIDB4QTgtMHhBRiAqLworCTB4NUU5QSwweDVFOTcsMHg1RTlDLDB4NUU5NSwweDVFOTYsMHg1RUY2LDB4NUYyNiwweDVGMjcsLyogMHhCMC0weEI3ICovCisJMHg1RjI5LDB4NUY4MCwweDVGODEsMHg1RjdGLDB4NUY3QywweDVGREQsMHg1RkUwLDB4NUZGRCwvKiAweEI4LTB4QkYgKi8KKwkweDVGRjUsMHg1RkZGLDB4NjAwRiwweDYwMTQsMHg2MDJGLDB4NjAzNSwweDYwMTYsMHg2MDJBLC8qIDB4QzAtMHhDNyAqLworCTB4NjAxNSwweDYwMjEsMHg2MDI3LDB4NjAyOSwweDYwMkIsMHg2MDFCLDB4NjIxNiwweDYyMTUsLyogMHhDOC0weENGICovCisJMHg2MjNGLDB4NjIzRSwweDYyNDAsMHg2MjdGLDB4NjJDOSwweDYyQ0MsMHg2MkM0LDB4NjJCRiwvKiAweEQwLTB4RDcgKi8KKwkweDYyQzIsMHg2MkI5LDB4NjJEMiwweDYyREIsMHg2MkFCLDB4NjJEMywweDYyRDQsMHg2MkNCLC8qIDB4RDgtMHhERiAqLworCTB4NjJDOCwweDYyQTgsMHg2MkJELDB4NjJCQywweDYyRDAsMHg2MkQ5LDB4NjJDNywweDYyQ0QsLyogMHhFMC0weEU3ICovCisJMHg2MkI1LDB4NjJEQSwweDYyQjEsMHg2MkQ4LDB4NjJENiwweDYyRDcsMHg2MkM2LDB4NjJBQywvKiAweEU4LTB4RUYgKi8KKwkweDYyQ0UsMHg2NTNFLDB4NjVBNywweDY1QkMsMHg2NUZBLDB4NjYxNCwweDY2MTMsMHg2NjBDLC8qIDB4RjAtMHhGNyAqLworCTB4NjYwNiwweDY2MDIsMHg2NjBFLDB4NjYwMCwweDY2MEYsMHg2NjE1LDB4NjYwQSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQUFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2NjA3LDB4NjcwRCwweDY3MEIsMHg2NzZELDB4Njc4QiwweDY3OTUsMHg2NzcxLDB4Njc5QywvKiAweDQwLTB4NDcgKi8KKwkweDY3NzMsMHg2Nzc3LDB4Njc4NywweDY3OUQsMHg2Nzk3LDB4Njc2RiwweDY3NzAsMHg2NzdGLC8qIDB4NDgtMHg0RiAqLworCTB4Njc4OSwweDY3N0UsMHg2NzkwLDB4Njc3NSwweDY3OUEsMHg2NzkzLDB4Njc3QywweDY3NkEsLyogMHg1MC0weDU3ICovCisJMHg2NzcyLDB4NkIyMywweDZCNjYsMHg2QjY3LDB4NkI3RiwweDZDMTMsMHg2QzFCLDB4NkNFMywvKiAweDU4LTB4NUYgKi8KKwkweDZDRTgsMHg2Q0YzLDB4NkNCMSwweDZDQ0MsMHg2Q0U1LDB4NkNCMywweDZDQkQsMHg2Q0JFLC8qIDB4NjAtMHg2NyAqLworCTB4NkNCQywweDZDRTIsMHg2Q0FCLDB4NkNENSwweDZDRDMsMHg2Q0I4LDB4NkNDNCwweDZDQjksLyogMHg2OC0weDZGICovCisJMHg2Q0MxLDB4NkNBRSwweDZDRDcsMHg2Q0M1LDB4NkNGMSwweDZDQkYsMHg2Q0JCLDB4NkNFMSwvKiAweDcwLTB4NzcgKi8KKwkweDZDREIsMHg2Q0NBLDB4NkNBQywweDZDRUYsMHg2Q0RDLDB4NkNENiwweDZDRTAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3MDk1LDB4NzA4RSwweDcwOTIsMHg3MDhBLDB4NzA5OSwweDcyMkMsMHg3MjJELC8qIDB4QTAtMHhBNyAqLworCTB4NzIzOCwweDcyNDgsMHg3MjY3LDB4NzI2OSwweDcyQzAsMHg3MkNFLDB4NzJEOSwweDcyRDcsLyogMHhBOC0weEFGICovCisJMHg3MkQwLDB4NzNBOSwweDczQTgsMHg3MzlGLDB4NzNBQiwweDczQTUsMHg3NTNELDB4NzU5RCwvKiAweEIwLTB4QjcgKi8KKwkweDc1OTksMHg3NTlBLDB4NzY4NCwweDc2QzIsMHg3NkYyLDB4NzZGNCwweDc3RTUsMHg3N0ZELC8qIDB4QjgtMHhCRiAqLworCTB4NzkzRSwweDc5NDAsMHg3OTQxLDB4NzlDOSwweDc5QzgsMHg3QTdBLDB4N0E3OSwweDdBRkEsLyogMHhDMC0weEM3ICovCisJMHg3Q0ZFLDB4N0Y1NCwweDdGOEMsMHg3RjhCLDB4ODAwNSwweDgwQkEsMHg4MEE1LDB4ODBBMiwvKiAweEM4LTB4Q0YgKi8KKwkweDgwQjEsMHg4MEExLDB4ODBBQiwweDgwQTksMHg4MEI0LDB4ODBBQSwweDgwQUYsMHg4MUU1LC8qIDB4RDAtMHhENyAqLworCTB4ODFGRSwweDgyMEQsMHg4MkIzLDB4ODI5RCwweDgyOTksMHg4MkFELDB4ODJCRCwweDgyOUYsLyogMHhEOC0weERGICovCisJMHg4MkI5LDB4ODJCMSwweDgyQUMsMHg4MkE1LDB4ODJBRiwweDgyQjgsMHg4MkEzLDB4ODJCMCwvKiAweEUwLTB4RTcgKi8KKwkweDgyQkUsMHg4MkI3LDB4ODY0RSwweDg2NzEsMHg1MjFELDB4ODg2OCwweDhFQ0IsMHg4RkNFLC8qIDB4RTgtMHhFRiAqLworCTB4OEZENCwweDhGRDEsMHg5MEI1LDB4OTBCOCwweDkwQjEsMHg5MEI2LDB4OTFDNywweDkxRDEsLyogMHhGMC0weEY3ICovCisJMHg5NTc3LDB4OTU4MCwweDk2MUMsMHg5NjQwLDB4OTYzRiwweDk2M0IsMHg5NjQ0LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BQlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDk2NDIsMHg5NkI5LDB4OTZFOCwweDk3NTIsMHg5NzVFLDB4NEU5RiwweDRFQUQsMHg0RUFFLC8qIDB4NDAtMHg0NyAqLworCTB4NEZFMSwweDRGQjUsMHg0RkFGLDB4NEZCRiwweDRGRTAsMHg0RkQxLDB4NEZDRiwweDRGREQsLyogMHg0OC0weDRGICovCisJMHg0RkMzLDB4NEZCNiwweDRGRDgsMHg0RkRGLDB4NEZDQSwweDRGRDcsMHg0RkFFLDB4NEZEMCwvKiAweDUwLTB4NTcgKi8KKwkweDRGQzQsMHg0RkMyLDB4NEZEQSwweDRGQ0UsMHg0RkRFLDB4NEZCNywweDUxNTcsMHg1MTkyLC8qIDB4NTgtMHg1RiAqLworCTB4NTE5MSwweDUxQTAsMHg1MjRFLDB4NTI0MywweDUyNEEsMHg1MjRELDB4NTI0QywweDUyNEIsLyogMHg2MC0weDY3ICovCisJMHg1MjQ3LDB4NTJDNywweDUyQzksMHg1MkMzLDB4NTJDMSwweDUzMEQsMHg1MzU3LDB4NTM3QiwvKiAweDY4LTB4NkYgKi8KKwkweDUzOUEsMHg1M0RCLDB4NTRBQywweDU0QzAsMHg1NEE4LDB4NTRDRSwweDU0QzksMHg1NEI4LC8qIDB4NzAtMHg3NyAqLworCTB4NTRBNiwweDU0QjMsMHg1NEM3LDB4NTRDMiwweDU0QkQsMHg1NEFBLDB4NTRDMSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDU0QzQsMHg1NEM4LDB4NTRBRiwweDU0QUIsMHg1NEIxLDB4NTRCQiwweDU0QTksLyogMHhBMC0weEE3ICovCisJMHg1NEE3LDB4NTRCRiwweDU2RkYsMHg1NzgyLDB4NTc4QiwweDU3QTAsMHg1N0EzLDB4NTdBMiwvKiAweEE4LTB4QUYgKi8KKwkweDU3Q0UsMHg1N0FFLDB4NTc5MywweDU5NTUsMHg1OTUxLDB4NTk0RiwweDU5NEUsMHg1OTUwLC8qIDB4QjAtMHhCNyAqLworCTB4NTlEQywweDU5RDgsMHg1OUZGLDB4NTlFMywweDU5RTgsMHg1QTAzLDB4NTlFNSwweDU5RUEsLyogMHhCOC0weEJGICovCisJMHg1OURBLDB4NTlFNiwweDVBMDEsMHg1OUZCLDB4NUI2OSwweDVCQTMsMHg1QkE2LDB4NUJBNCwvKiAweEMwLTB4QzcgKi8KKwkweDVCQTIsMHg1QkE1LDB4NUMwMSwweDVDNEUsMHg1QzRGLDB4NUM0RCwweDVDNEIsMHg1Q0Q5LC8qIDB4QzgtMHhDRiAqLworCTB4NUNEMiwweDVERjcsMHg1RTFELDB4NUUyNSwweDVFMUYsMHg1RTdELDB4NUVBMCwweDVFQTYsLyogMHhEMC0weEQ3ICovCisJMHg1RUZBLDB4NUYwOCwweDVGMkQsMHg1RjY1LDB4NUY4OCwweDVGODUsMHg1RjhBLDB4NUY4QiwvKiAweEQ4LTB4REYgKi8KKwkweDVGODcsMHg1RjhDLDB4NUY4OSwweDYwMTIsMHg2MDFELDB4NjAyMCwweDYwMjUsMHg2MDBFLC8qIDB4RTAtMHhFNyAqLworCTB4NjAyOCwweDYwNEQsMHg2MDcwLDB4NjA2OCwweDYwNjIsMHg2MDQ2LDB4NjA0MywweDYwNkMsLyogMHhFOC0weEVGICovCisJMHg2MDZCLDB4NjA2QSwweDYwNjQsMHg2MjQxLDB4NjJEQywweDYzMTYsMHg2MzA5LDB4NjJGQywvKiAweEYwLTB4RjcgKi8KKwkweDYyRUQsMHg2MzAxLDB4NjJFRSwweDYyRkQsMHg2MzA3LDB4NjJGMSwweDYyRjcsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0FDWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NjJFRiwweDYyRUMsMHg2MkZFLDB4NjJGNCwweDYzMTEsMHg2MzAyLDB4NjUzRiwweDY1NDUsLyogMHg0MC0weDQ3ICovCisJMHg2NUFCLDB4NjVCRCwweDY1RTIsMHg2NjI1LDB4NjYyRCwweDY2MjAsMHg2NjI3LDB4NjYyRiwvKiAweDQ4LTB4NEYgKi8KKwkweDY2MUYsMHg2NjI4LDB4NjYzMSwweDY2MjQsMHg2NkY3LDB4NjdGRiwweDY3RDMsMHg2N0YxLC8qIDB4NTAtMHg1NyAqLworCTB4NjdENCwweDY3RDAsMHg2N0VDLDB4NjdCNiwweDY3QUYsMHg2N0Y1LDB4NjdFOSwweDY3RUYsLyogMHg1OC0weDVGICovCisJMHg2N0M0LDB4NjdEMSwweDY3QjQsMHg2N0RBLDB4NjdFNSwweDY3QjgsMHg2N0NGLDB4NjdERSwvKiAweDYwLTB4NjcgKi8KKwkweDY3RjMsMHg2N0IwLDB4NjdEOSwweDY3RTIsMHg2N0RELDB4NjdEMiwweDZCNkEsMHg2QjgzLC8qIDB4NjgtMHg2RiAqLworCTB4NkI4NiwweDZCQjUsMHg2QkQyLDB4NkJENywweDZDMUYsMHg2Q0M5LDB4NkQwQiwweDZEMzIsLyogMHg3MC0weDc3ICovCisJMHg2RDJBLDB4NkQ0MSwweDZEMjUsMHg2RDBDLDB4NkQzMSwweDZEMUUsMHg2RDE3LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NkQzQiwweDZEM0QsMHg2RDNFLDB4NkQzNiwweDZEMUIsMHg2Q0Y1LDB4NkQzOSwvKiAweEEwLTB4QTcgKi8KKwkweDZEMjcsMHg2RDM4LDB4NkQyOSwweDZEMkUsMHg2RDM1LDB4NkQwRSwweDZEMkIsMHg3MEFCLC8qIDB4QTgtMHhBRiAqLworCTB4NzBCQSwweDcwQjMsMHg3MEFDLDB4NzBBRiwweDcwQUQsMHg3MEI4LDB4NzBBRSwweDcwQTQsLyogMHhCMC0weEI3ICovCisJMHg3MjMwLDB4NzI3MiwweDcyNkYsMHg3Mjc0LDB4NzJFOSwweDcyRTAsMHg3MkUxLDB4NzNCNywvKiAweEI4LTB4QkYgKi8KKwkweDczQ0EsMHg3M0JCLDB4NzNCMiwweDczQ0QsMHg3M0MwLDB4NzNCMywweDc1MUEsMHg3NTJELC8qIDB4QzAtMHhDNyAqLworCTB4NzU0RiwweDc1NEMsMHg3NTRFLDB4NzU0QiwweDc1QUIsMHg3NUE0LDB4NzVBNSwweDc1QTIsLyogMHhDOC0weENGICovCisJMHg3NUEzLDB4NzY3OCwweDc2ODYsMHg3Njg3LDB4NzY4OCwweDc2QzgsMHg3NkM2LDB4NzZDMywvKiAweEQwLTB4RDcgKi8KKwkweDc2QzUsMHg3NzAxLDB4NzZGOSwweDc2RjgsMHg3NzA5LDB4NzcwQiwweDc2RkUsMHg3NkZDLC8qIDB4RDgtMHhERiAqLworCTB4NzcwNywweDc3REMsMHg3ODAyLDB4NzgxNCwweDc4MEMsMHg3ODBELDB4Nzk0NiwweDc5NDksLyogMHhFMC0weEU3ICovCisJMHg3OTQ4LDB4Nzk0NywweDc5QjksMHg3OUJBLDB4NzlEMSwweDc5RDIsMHg3OUNCLDB4N0E3RiwvKiAweEU4LTB4RUYgKi8KKwkweDdBODEsMHg3QUZGLDB4N0FGRCwweDdDN0QsMHg3RDAyLDB4N0QwNSwweDdEMDAsMHg3RDA5LC8qIDB4RjAtMHhGNyAqLworCTB4N0QwNywweDdEMDQsMHg3RDA2LDB4N0YzOCwweDdGOEUsMHg3RkJGLDB4ODAwNCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQURbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4MDEwLDB4ODAwRCwweDgwMTEsMHg4MDM2LDB4ODBENiwweDgwRTUsMHg4MERBLDB4ODBDMywvKiAweDQwLTB4NDcgKi8KKwkweDgwQzQsMHg4MENDLDB4ODBFMSwweDgwREIsMHg4MENFLDB4ODBERSwweDgwRTQsMHg4MERELC8qIDB4NDgtMHg0RiAqLworCTB4ODFGNCwweDgyMjIsMHg4MkU3LDB4ODMwMywweDgzMDUsMHg4MkUzLDB4ODJEQiwweDgyRTYsLyogMHg1MC0weDU3ICovCisJMHg4MzA0LDB4ODJFNSwweDgzMDIsMHg4MzA5LDB4ODJEMiwweDgyRDcsMHg4MkYxLDB4ODMwMSwvKiAweDU4LTB4NUYgKi8KKwkweDgyREMsMHg4MkQ0LDB4ODJEMSwweDgyREUsMHg4MkQzLDB4ODJERiwweDgyRUYsMHg4MzA2LC8qIDB4NjAtMHg2NyAqLworCTB4ODY1MCwweDg2NzksMHg4NjdCLDB4ODY3QSwweDg4NEQsMHg4ODZCLDB4ODk4MSwweDg5RDQsLyogMHg2OC0weDZGICovCisJMHg4QTA4LDB4OEEwMiwweDhBMDMsMHg4QzlFLDB4OENBMCwweDhENzQsMHg4RDczLDB4OERCNCwvKiAweDcwLTB4NzcgKi8KKwkweDhFQ0QsMHg4RUNDLDB4OEZGMCwweDhGRTYsMHg4RkUyLDB4OEZFQSwweDhGRTUsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg4RkVELDB4OEZFQiwweDhGRTQsMHg4RkU4LDB4OTBDQSwweDkwQ0UsMHg5MEMxLC8qIDB4QTAtMHhBNyAqLworCTB4OTBDMywweDkxNEIsMHg5MTRBLDB4OTFDRCwweDk1ODIsMHg5NjUwLDB4OTY0QiwweDk2NEMsLyogMHhBOC0weEFGICovCisJMHg5NjRELDB4OTc2MiwweDk3NjksMHg5N0NCLDB4OTdFRCwweDk3RjMsMHg5ODAxLDB4OThBOCwvKiAweEIwLTB4QjcgKi8KKwkweDk4REIsMHg5OERGLDB4OTk5NiwweDk5OTksMHg0RTU4LDB4NEVCMywweDUwMEMsMHg1MDBELC8qIDB4QjgtMHhCRiAqLworCTB4NTAyMywweDRGRUYsMHg1MDI2LDB4NTAyNSwweDRGRjgsMHg1MDI5LDB4NTAxNiwweDUwMDYsLyogMHhDMC0weEM3ICovCisJMHg1MDNDLDB4NTAxRiwweDUwMUEsMHg1MDEyLDB4NTAxMSwweDRGRkEsMHg1MDAwLDB4NTAxNCwvKiAweEM4LTB4Q0YgKi8KKwkweDUwMjgsMHg0RkYxLDB4NTAyMSwweDUwMEIsMHg1MDE5LDB4NTAxOCwweDRGRjMsMHg0RkVFLC8qIDB4RDAtMHhENyAqLworCTB4NTAyRCwweDUwMkEsMHg0RkZFLDB4NTAyQiwweDUwMDksMHg1MTdDLDB4NTFBNCwweDUxQTUsLyogMHhEOC0weERGICovCisJMHg1MUEyLDB4NTFDRCwweDUxQ0MsMHg1MUM2LDB4NTFDQiwweDUyNTYsMHg1MjVDLDB4NTI1NCwvKiAweEUwLTB4RTcgKi8KKwkweDUyNUIsMHg1MjVELDB4NTMyQSwweDUzN0YsMHg1MzlGLDB4NTM5RCwweDUzREYsMHg1NEU4LC8qIDB4RTgtMHhFRiAqLworCTB4NTUxMCwweDU1MDEsMHg1NTM3LDB4NTRGQywweDU0RTUsMHg1NEYyLDB4NTUwNiwweDU0RkEsLyogMHhGMC0weEY3ICovCisJMHg1NTE0LDB4NTRFOSwweDU0RUQsMHg1NEUxLDB4NTUwOSwweDU0RUUsMHg1NEVBLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BRVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDU0RTYsMHg1NTI3LDB4NTUwNywweDU0RkQsMHg1NTBGLDB4NTcwMywweDU3MDQsMHg1N0MyLC8qIDB4NDAtMHg0NyAqLworCTB4NTdENCwweDU3Q0IsMHg1N0MzLDB4NTgwOSwweDU5MEYsMHg1OTU3LDB4NTk1OCwweDU5NUEsLyogMHg0OC0weDRGICovCisJMHg1QTExLDB4NUExOCwweDVBMUMsMHg1QTFGLDB4NUExQiwweDVBMTMsMHg1OUVDLDB4NUEyMCwvKiAweDUwLTB4NTcgKi8KKwkweDVBMjMsMHg1QTI5LDB4NUEyNSwweDVBMEMsMHg1QTA5LDB4NUI2QiwweDVDNTgsMHg1QkIwLC8qIDB4NTgtMHg1RiAqLworCTB4NUJCMywweDVCQjYsMHg1QkI0LDB4NUJBRSwweDVCQjUsMHg1QkI5LDB4NUJCOCwweDVDMDQsLyogMHg2MC0weDY3ICovCisJMHg1QzUxLDB4NUM1NSwweDVDNTAsMHg1Q0VELDB4NUNGRCwweDVDRkIsMHg1Q0VBLDB4NUNFOCwvKiAweDY4LTB4NkYgKi8KKwkweDVDRjAsMHg1Q0Y2LDB4NUQwMSwweDVDRjQsMHg1REVFLDB4NUUyRCwweDVFMkIsMHg1RUFCLC8qIDB4NzAtMHg3NyAqLworCTB4NUVBRCwweDVFQTcsMHg1RjMxLDB4NUY5MiwweDVGOTEsMHg1RjkwLDB4NjA1OSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDYwNjMsMHg2MDY1LDB4NjA1MCwweDYwNTUsMHg2MDZELDB4NjA2OSwweDYwNkYsLyogMHhBMC0weEE3ICovCisJMHg2MDg0LDB4NjA5RiwweDYwOUEsMHg2MDhELDB4NjA5NCwweDYwOEMsMHg2MDg1LDB4NjA5NiwvKiAweEE4LTB4QUYgKi8KKwkweDYyNDcsMHg2MkYzLDB4NjMwOCwweDYyRkYsMHg2MzRFLDB4NjMzRSwweDYzMkYsMHg2MzU1LC8qIDB4QjAtMHhCNyAqLworCTB4NjM0MiwweDYzNDYsMHg2MzRGLDB4NjM0OSwweDYzM0EsMHg2MzUwLDB4NjMzRCwweDYzMkEsLyogMHhCOC0weEJGICovCisJMHg2MzJCLDB4NjMyOCwweDYzNEQsMHg2MzRDLDB4NjU0OCwweDY1NDksMHg2NTk5LDB4NjVDMSwvKiAweEMwLTB4QzcgKi8KKwkweDY1QzUsMHg2NjQyLDB4NjY0OSwweDY2NEYsMHg2NjQzLDB4NjY1MiwweDY2NEMsMHg2NjQ1LC8qIDB4QzgtMHhDRiAqLworCTB4NjY0MSwweDY2RjgsMHg2NzE0LDB4NjcxNSwweDY3MTcsMHg2ODIxLDB4NjgzOCwweDY4NDgsLyogMHhEMC0weEQ3ICovCisJMHg2ODQ2LDB4Njg1MywweDY4MzksMHg2ODQyLDB4Njg1NCwweDY4MjksMHg2OEIzLDB4NjgxNywvKiAweEQ4LTB4REYgKi8KKwkweDY4NEMsMHg2ODUxLDB4NjgzRCwweDY3RjQsMHg2ODUwLDB4Njg0MCwweDY4M0MsMHg2ODQzLC8qIDB4RTAtMHhFNyAqLworCTB4NjgyQSwweDY4NDUsMHg2ODEzLDB4NjgxOCwweDY4NDEsMHg2QjhBLDB4NkI4OSwweDZCQjcsLyogMHhFOC0weEVGICovCisJMHg2QzIzLDB4NkMyNywweDZDMjgsMHg2QzI2LDB4NkMyNCwweDZDRjAsMHg2RDZBLDB4NkQ5NSwvKiAweEYwLTB4RjcgKi8KKwkweDZEODgsMHg2RDg3LDB4NkQ2NiwweDZENzgsMHg2RDc3LDB4NkQ1OSwweDZEOTMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0FGWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NkQ2QywweDZEODksMHg2RDZFLDB4NkQ1QSwweDZENzQsMHg2RDY5LDB4NkQ4QywweDZEOEEsLyogMHg0MC0weDQ3ICovCisJMHg2RDc5LDB4NkQ4NSwweDZENjUsMHg2RDk0LDB4NzBDQSwweDcwRDgsMHg3MEU0LDB4NzBEOSwvKiAweDQ4LTB4NEYgKi8KKwkweDcwQzgsMHg3MENGLDB4NzIzOSwweDcyNzksMHg3MkZDLDB4NzJGOSwweDcyRkQsMHg3MkY4LC8qIDB4NTAtMHg1NyAqLworCTB4NzJGNywweDczODYsMHg3M0VELDB4NzQwOSwweDczRUUsMHg3M0UwLDB4NzNFQSwweDczREUsLyogMHg1OC0weDVGICovCisJMHg3NTU0LDB4NzU1RCwweDc1NUMsMHg3NTVBLDB4NzU1OSwweDc1QkUsMHg3NUM1LDB4NzVDNywvKiAweDYwLTB4NjcgKi8KKwkweDc1QjIsMHg3NUIzLDB4NzVCRCwweDc1QkMsMHg3NUI5LDB4NzVDMiwweDc1QjgsMHg3NjhCLC8qIDB4NjgtMHg2RiAqLworCTB4NzZCMCwweDc2Q0EsMHg3NkNELDB4NzZDRSwweDc3MjksMHg3NzFGLDB4NzcyMCwweDc3MjgsLyogMHg3MC0weDc3ICovCisJMHg3N0U5LDB4NzgzMCwweDc4MjcsMHg3ODM4LDB4NzgxRCwweDc4MzQsMHg3ODM3LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NzgyNSwweDc4MkQsMHg3ODIwLDB4NzgxRiwweDc4MzIsMHg3OTU1LDB4Nzk1MCwvKiAweEEwLTB4QTcgKi8KKwkweDc5NjAsMHg3OTVGLDB4Nzk1NiwweDc5NUUsMHg3OTVELDB4Nzk1NywweDc5NUEsMHg3OUU0LC8qIDB4QTgtMHhBRiAqLworCTB4NzlFMywweDc5RTcsMHg3OURGLDB4NzlFNiwweDc5RTksMHg3OUQ4LDB4N0E4NCwweDdBODgsLyogMHhCMC0weEI3ICovCisJMHg3QUQ5LDB4N0IwNiwweDdCMTEsMHg3Qzg5LDB4N0QyMSwweDdEMTcsMHg3RDBCLDB4N0QwQSwvKiAweEI4LTB4QkYgKi8KKwkweDdEMjAsMHg3RDIyLDB4N0QxNCwweDdEMTAsMHg3RDE1LDB4N0QxQSwweDdEMUMsMHg3RDBELC8qIDB4QzAtMHhDNyAqLworCTB4N0QxOSwweDdEMUIsMHg3RjNBLDB4N0Y1RiwweDdGOTQsMHg3RkM1LDB4N0ZDMSwweDgwMDYsLyogMHhDOC0weENGICovCisJMHg4MDE4LDB4ODAxNSwweDgwMTksMHg4MDE3LDB4ODAzRCwweDgwM0YsMHg4MEYxLDB4ODEwMiwvKiAweEQwLTB4RDcgKi8KKwkweDgwRjAsMHg4MTA1LDB4ODBFRCwweDgwRjQsMHg4MTA2LDB4ODBGOCwweDgwRjMsMHg4MTA4LC8qIDB4RDgtMHhERiAqLworCTB4ODBGRCwweDgxMEEsMHg4MEZDLDB4ODBFRiwweDgxRUQsMHg4MUVDLDB4ODIwMCwweDgyMTAsLyogMHhFMC0weEU3ICovCisJMHg4MjJBLDB4ODIyQiwweDgyMjgsMHg4MjJDLDB4ODJCQiwweDgzMkIsMHg4MzUyLDB4ODM1NCwvKiAweEU4LTB4RUYgKi8KKwkweDgzNEEsMHg4MzM4LDB4ODM1MCwweDgzNDksMHg4MzM1LDB4ODMzNCwweDgzNEYsMHg4MzMyLC8qIDB4RjAtMHhGNyAqLworCTB4ODMzOSwweDgzMzYsMHg4MzE3LDB4ODM0MCwweDgzMzEsMHg4MzI4LDB4ODM0MywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjBbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4NjU0LDB4ODY4QSwweDg2QUEsMHg4NjkzLDB4ODZBNCwweDg2QTksMHg4NjhDLDB4ODZBMywvKiAweDQwLTB4NDcgKi8KKwkweDg2OUMsMHg4ODcwLDB4ODg3NywweDg4ODEsMHg4ODgyLDB4ODg3RCwweDg4NzksMHg4QTE4LC8qIDB4NDgtMHg0RiAqLworCTB4OEExMCwweDhBMEUsMHg4QTBDLDB4OEExNSwweDhBMEEsMHg4QTE3LDB4OEExMywweDhBMTYsLyogMHg1MC0weDU3ICovCisJMHg4QTBGLDB4OEExMSwweDhDNDgsMHg4QzdBLDB4OEM3OSwweDhDQTEsMHg4Q0EyLDB4OEQ3NywvKiAweDU4LTB4NUYgKi8KKwkweDhFQUMsMHg4RUQyLDB4OEVENCwweDhFQ0YsMHg4RkIxLDB4OTAwMSwweDkwMDYsMHg4RkY3LC8qIDB4NjAtMHg2NyAqLworCTB4OTAwMCwweDhGRkEsMHg4RkY0LDB4OTAwMywweDhGRkQsMHg5MDA1LDB4OEZGOCwweDkwOTUsLyogMHg2OC0weDZGICovCisJMHg5MEUxLDB4OTBERCwweDkwRTIsMHg5MTUyLDB4OTE0RCwweDkxNEMsMHg5MUQ4LDB4OTFERCwvKiAweDcwLTB4NzcgKi8KKwkweDkxRDcsMHg5MURDLDB4OTFEOSwweDk1ODMsMHg5NjYyLDB4OTY2MywweDk2NjEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg5NjVCLDB4OTY1RCwweDk2NjQsMHg5NjU4LDB4OTY1RSwweDk2QkIsMHg5OEUyLC8qIDB4QTAtMHhBNyAqLworCTB4OTlBQywweDlBQTgsMHg5QUQ4LDB4OUIyNSwweDlCMzIsMHg5QjNDLDB4NEU3RSwweDUwN0EsLyogMHhBOC0weEFGICovCisJMHg1MDdELDB4NTA1QywweDUwNDcsMHg1MDQzLDB4NTA0QywweDUwNUEsMHg1MDQ5LDB4NTA2NSwvKiAweEIwLTB4QjcgKi8KKwkweDUwNzYsMHg1MDRFLDB4NTA1NSwweDUwNzUsMHg1MDc0LDB4NTA3NywweDUwNEYsMHg1MDBGLC8qIDB4QjgtMHhCRiAqLworCTB4NTA2RiwweDUwNkQsMHg1MTVDLDB4NTE5NSwweDUxRjAsMHg1MjZBLDB4NTI2RiwweDUyRDIsLyogMHhDMC0weEM3ICovCisJMHg1MkQ5LDB4NTJEOCwweDUyRDUsMHg1MzEwLDB4NTMwRiwweDUzMTksMHg1MzNGLDB4NTM0MCwvKiAweEM4LTB4Q0YgKi8KKwkweDUzM0UsMHg1M0MzLDB4NjZGQywweDU1NDYsMHg1NTZBLDB4NTU2NiwweDU1NDQsMHg1NTVFLC8qIDB4RDAtMHhENyAqLworCTB4NTU2MSwweDU1NDMsMHg1NTRBLDB4NTUzMSwweDU1NTYsMHg1NTRGLDB4NTU1NSwweDU1MkYsLyogMHhEOC0weERGICovCisJMHg1NTY0LDB4NTUzOCwweDU1MkUsMHg1NTVDLDB4NTUyQywweDU1NjMsMHg1NTMzLDB4NTU0MSwvKiAweEUwLTB4RTcgKi8KKwkweDU1NTcsMHg1NzA4LDB4NTcwQiwweDU3MDksMHg1N0RGLDB4NTgwNSwweDU4MEEsMHg1ODA2LC8qIDB4RTgtMHhFRiAqLworCTB4NTdFMCwweDU3RTQsMHg1N0ZBLDB4NTgwMiwweDU4MzUsMHg1N0Y3LDB4NTdGOSwweDU5MjAsLyogMHhGMC0weEY3ICovCisJMHg1OTYyLDB4NUEzNiwweDVBNDEsMHg1QTQ5LDB4NUE2NiwweDVBNkEsMHg1QTQwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CMVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDVBM0MsMHg1QTYyLDB4NUE1QSwweDVBNDYsMHg1QTRBLDB4NUI3MCwweDVCQzcsMHg1QkM1LC8qIDB4NDAtMHg0NyAqLworCTB4NUJDNCwweDVCQzIsMHg1QkJGLDB4NUJDNiwweDVDMDksMHg1QzA4LDB4NUMwNywweDVDNjAsLyogMHg0OC0weDRGICovCisJMHg1QzVDLDB4NUM1RCwweDVEMDcsMHg1RDA2LDB4NUQwRSwweDVEMUIsMHg1RDE2LDB4NUQyMiwvKiAweDUwLTB4NTcgKi8KKwkweDVEMTEsMHg1RDI5LDB4NUQxNCwweDVEMTksMHg1RDI0LDB4NUQyNywweDVEMTcsMHg1REUyLC8qIDB4NTgtMHg1RiAqLworCTB4NUUzOCwweDVFMzYsMHg1RTMzLDB4NUUzNywweDVFQjcsMHg1RUI4LDB4NUVCNiwweDVFQjUsLyogMHg2MC0weDY3ICovCisJMHg1RUJFLDB4NUYzNSwweDVGMzcsMHg1RjU3LDB4NUY2QywweDVGNjksMHg1RjZCLDB4NUY5NywvKiAweDY4LTB4NkYgKi8KKwkweDVGOTksMHg1RjlFLDB4NUY5OCwweDVGQTEsMHg1RkEwLDB4NUY5QywweDYwN0YsMHg2MEEzLC8qIDB4NzAtMHg3NyAqLworCTB4NjA4OSwweDYwQTAsMHg2MEE4LDB4NjBDQiwweDYwQjQsMHg2MEU2LDB4NjBCRCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDYwQzUsMHg2MEJCLDB4NjBCNSwweDYwREMsMHg2MEJDLDB4NjBEOCwweDYwRDUsLyogMHhBMC0weEE3ICovCisJMHg2MEM2LDB4NjBERiwweDYwQjgsMHg2MERBLDB4NjBDNywweDYyMUEsMHg2MjFCLDB4NjI0OCwvKiAweEE4LTB4QUYgKi8KKwkweDYzQTAsMHg2M0E3LDB4NjM3MiwweDYzOTYsMHg2M0EyLDB4NjNBNSwweDYzNzcsMHg2MzY3LC8qIDB4QjAtMHhCNyAqLworCTB4NjM5OCwweDYzQUEsMHg2MzcxLDB4NjNBOSwweDYzODksMHg2MzgzLDB4NjM5QiwweDYzNkIsLyogMHhCOC0weEJGICovCisJMHg2M0E4LDB4NjM4NCwweDYzODgsMHg2Mzk5LDB4NjNBMSwweDYzQUMsMHg2MzkyLDB4NjM4RiwvKiAweEMwLTB4QzcgKi8KKwkweDYzODAsMHg2MzdCLDB4NjM2OSwweDYzNjgsMHg2MzdBLDB4NjU1RCwweDY1NTYsMHg2NTUxLC8qIDB4QzgtMHhDRiAqLworCTB4NjU1OSwweDY1NTcsMHg1NTVGLDB4NjU0RiwweDY1NTgsMHg2NTU1LDB4NjU1NCwweDY1OUMsLyogMHhEMC0weEQ3ICovCisJMHg2NTlCLDB4NjVBQywweDY1Q0YsMHg2NUNCLDB4NjVDQywweDY1Q0UsMHg2NjVELDB4NjY1QSwvKiAweEQ4LTB4REYgKi8KKwkweDY2NjQsMHg2NjY4LDB4NjY2NiwweDY2NUUsMHg2NkY5LDB4NTJENywweDY3MUIsMHg2ODgxLC8qIDB4RTAtMHhFNyAqLworCTB4NjhBRiwweDY4QTIsMHg2ODkzLDB4NjhCNSwweDY4N0YsMHg2ODc2LDB4NjhCMSwweDY4QTcsLyogMHhFOC0weEVGICovCisJMHg2ODk3LDB4NjhCMCwweDY4ODMsMHg2OEM0LDB4NjhBRCwweDY4ODYsMHg2ODg1LDB4Njg5NCwvKiAweEYwLTB4RjcgKi8KKwkweDY4OUQsMHg2OEE4LDB4Njg5RiwweDY4QTEsMHg2ODgyLDB4NkIzMiwweDZCQkEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0IyWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NkJFQiwweDZCRUMsMHg2QzJCLDB4NkQ4RSwweDZEQkMsMHg2REYzLDB4NkREOSwweDZEQjIsLyogMHg0MC0weDQ3ICovCisJMHg2REUxLDB4NkRDQywweDZERTQsMHg2REZCLDB4NkRGQSwweDZFMDUsMHg2REM3LDB4NkRDQiwvKiAweDQ4LTB4NEYgKi8KKwkweDZEQUYsMHg2REQxLDB4NkRBRSwweDZEREUsMHg2REY5LDB4NkRCOCwweDZERjcsMHg2REY1LC8qIDB4NTAtMHg1NyAqLworCTB4NkRDNSwweDZERDIsMHg2RTFBLDB4NkRCNSwweDZEREEsMHg2REVCLDB4NkREOCwweDZERUEsLyogMHg1OC0weDVGICovCisJMHg2REYxLDB4NkRFRSwweDZERTgsMHg2REM2LDB4NkRDNCwweDZEQUEsMHg2REVDLDB4NkRCRiwvKiAweDYwLTB4NjcgKi8KKwkweDZERTYsMHg3MEY5LDB4NzEwOSwweDcxMEEsMHg3MEZELDB4NzBFRiwweDcyM0QsMHg3MjdELC8qIDB4NjgtMHg2RiAqLworCTB4NzI4MSwweDczMUMsMHg3MzFCLDB4NzMxNiwweDczMTMsMHg3MzE5LDB4NzM4NywweDc0MDUsLyogMHg3MC0weDc3ICovCisJMHg3NDBBLDB4NzQwMywweDc0MDYsMHg3M0ZFLDB4NzQwRCwweDc0RTAsMHg3NEY2LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NzRGNywweDc1MUMsMHg3NTIyLDB4NzU2NSwweDc1NjYsMHg3NTYyLDB4NzU3MCwvKiAweEEwLTB4QTcgKi8KKwkweDc1OEYsMHg3NUQ0LDB4NzVENSwweDc1QjUsMHg3NUNBLDB4NzVDRCwweDc2OEUsMHg3NkQ0LC8qIDB4QTgtMHhBRiAqLworCTB4NzZEMiwweDc2REIsMHg3NzM3LDB4NzczRSwweDc3M0MsMHg3NzM2LDB4NzczOCwweDc3M0EsLyogMHhCMC0weEI3ICovCisJMHg3ODZCLDB4Nzg0MywweDc4NEUsMHg3OTY1LDB4Nzk2OCwweDc5NkQsMHg3OUZCLDB4N0E5MiwvKiAweEI4LTB4QkYgKi8KKwkweDdBOTUsMHg3QjIwLDB4N0IyOCwweDdCMUIsMHg3QjJDLDB4N0IyNiwweDdCMTksMHg3QjFFLC8qIDB4QzAtMHhDNyAqLworCTB4N0IyRSwweDdDOTIsMHg3Qzk3LDB4N0M5NSwweDdENDYsMHg3RDQzLDB4N0Q3MSwweDdEMkUsLyogMHhDOC0weENGICovCisJMHg3RDM5LDB4N0QzQywweDdENDAsMHg3RDMwLDB4N0QzMywweDdENDQsMHg3RDJGLDB4N0Q0MiwvKiAweEQwLTB4RDcgKi8KKwkweDdEMzIsMHg3RDMxLDB4N0YzRCwweDdGOUUsMHg3RjlBLDB4N0ZDQywweDdGQ0UsMHg3RkQyLC8qIDB4RDgtMHhERiAqLworCTB4ODAxQywweDgwNEEsMHg4MDQ2LDB4ODEyRiwweDgxMTYsMHg4MTIzLDB4ODEyQiwweDgxMjksLyogMHhFMC0weEU3ICovCisJMHg4MTMwLDB4ODEyNCwweDgyMDIsMHg4MjM1LDB4ODIzNywweDgyMzYsMHg4MjM5LDB4ODM4RSwvKiAweEU4LTB4RUYgKi8KKwkweDgzOUUsMHg4Mzk4LDB4ODM3OCwweDgzQTIsMHg4Mzk2LDB4ODNCRCwweDgzQUIsMHg4MzkyLC8qIDB4RjAtMHhGNyAqLworCTB4ODM4QSwweDgzOTMsMHg4Mzg5LDB4ODNBMCwweDgzNzcsMHg4MzdCLDB4ODM3QywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4Mzg2LDB4ODNBNywweDg2NTUsMHg1RjZBLDB4ODZDNywweDg2QzAsMHg4NkI2LDB4ODZDNCwvKiAweDQwLTB4NDcgKi8KKwkweDg2QjUsMHg4NkM2LDB4ODZDQiwweDg2QjEsMHg4NkFGLDB4ODZDOSwweDg4NTMsMHg4ODlFLC8qIDB4NDgtMHg0RiAqLworCTB4ODg4OCwweDg4QUIsMHg4ODkyLDB4ODg5NiwweDg4OEQsMHg4ODhCLDB4ODk5MywweDg5OEYsLyogMHg1MC0weDU3ICovCisJMHg4QTJBLDB4OEExRCwweDhBMjMsMHg4QTI1LDB4OEEzMSwweDhBMkQsMHg4QTFGLDB4OEExQiwvKiAweDU4LTB4NUYgKi8KKwkweDhBMjIsMHg4QzQ5LDB4OEM1QSwweDhDQTksMHg4Q0FDLDB4OENBQiwweDhDQTgsMHg4Q0FBLC8qIDB4NjAtMHg2NyAqLworCTB4OENBNywweDhENjcsMHg4RDY2LDB4OERCRSwweDhEQkEsMHg4RURCLDB4OEVERiwweDkwMTksLyogMHg2OC0weDZGICovCisJMHg5MDBELDB4OTAxQSwweDkwMTcsMHg5MDIzLDB4OTAxRiwweDkwMUQsMHg5MDEwLDB4OTAxNSwvKiAweDcwLTB4NzcgKi8KKwkweDkwMUUsMHg5MDIwLDB4OTAwRiwweDkwMjIsMHg5MDE2LDB4OTAxQiwweDkwMTQsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg5MEU4LDB4OTBFRCwweDkwRkQsMHg5MTU3LDB4OTFDRSwweDkxRjUsMHg5MUU2LC8qIDB4QTAtMHhBNyAqLworCTB4OTFFMywweDkxRTcsMHg5MUVELDB4OTFFOSwweDk1ODksMHg5NjZBLDB4OTY3NSwweDk2NzMsLyogMHhBOC0weEFGICovCisJMHg5Njc4LDB4OTY3MCwweDk2NzQsMHg5Njc2LDB4OTY3NywweDk2NkMsMHg5NkMwLDB4OTZFQSwvKiAweEIwLTB4QjcgKi8KKwkweDk2RTksMHg3QUUwLDB4N0FERiwweDk4MDIsMHg5ODAzLDB4OUI1QSwweDlDRTUsMHg5RTc1LC8qIDB4QjgtMHhCRiAqLworCTB4OUU3RiwweDlFQTUsMHg5RUJCLDB4NTBBMiwweDUwOEQsMHg1MDg1LDB4NTA5OSwweDUwOTEsLyogMHhDMC0weEM3ICovCisJMHg1MDgwLDB4NTA5NiwweDUwOTgsMHg1MDlBLDB4NjcwMCwweDUxRjEsMHg1MjcyLDB4NTI3NCwvKiAweEM4LTB4Q0YgKi8KKwkweDUyNzUsMHg1MjY5LDB4NTJERSwweDUyREQsMHg1MkRCLDB4NTM1QSwweDUzQTUsMHg1NTdCLC8qIDB4RDAtMHhENyAqLworCTB4NTU4MCwweDU1QTcsMHg1NTdDLDB4NTU4QSwweDU1OUQsMHg1NTk4LDB4NTU4MiwweDU1OUMsLyogMHhEOC0weERGICovCisJMHg1NUFBLDB4NTU5NCwweDU1ODcsMHg1NThCLDB4NTU4MywweDU1QjMsMHg1NUFFLDB4NTU5RiwvKiAweEUwLTB4RTcgKi8KKwkweDU1M0UsMHg1NUIyLDB4NTU5QSwweDU1QkIsMHg1NUFDLDB4NTVCMSwweDU1N0UsMHg1NTg5LC8qIDB4RTgtMHhFRiAqLworCTB4NTVBQiwweDU1OTksMHg1NzBELDB4NTgyRiwweDU4MkEsMHg1ODM0LDB4NTgyNCwweDU4MzAsLyogMHhGMC0weEY3ICovCisJMHg1ODMxLDB4NTgyMSwweDU4MUQsMHg1ODIwLDB4NThGOSwweDU4RkEsMHg1OTYwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CNFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDVBNzcsMHg1QTlBLDB4NUE3RiwweDVBOTIsMHg1QTlCLDB4NUFBNywweDVCNzMsMHg1QjcxLC8qIDB4NDAtMHg0NyAqLworCTB4NUJEMiwweDVCQ0MsMHg1QkQzLDB4NUJEMCwweDVDMEEsMHg1QzBCLDB4NUMzMSwweDVENEMsLyogMHg0OC0weDRGICovCisJMHg1RDUwLDB4NUQzNCwweDVENDcsMHg1REZELDB4NUU0NSwweDVFM0QsMHg1RTQwLDB4NUU0MywvKiAweDUwLTB4NTcgKi8KKwkweDVFN0UsMHg1RUNBLDB4NUVDMSwweDVFQzIsMHg1RUM0LDB4NUYzQywweDVGNkQsMHg1RkE5LC8qIDB4NTgtMHg1RiAqLworCTB4NUZBQSwweDVGQTgsMHg2MEQxLDB4NjBFMSwweDYwQjIsMHg2MEI2LDB4NjBFMCwweDYxMUMsLyogMHg2MC0weDY3ICovCisJMHg2MTIzLDB4NjBGQSwweDYxMTUsMHg2MEYwLDB4NjBGQiwweDYwRjQsMHg2MTY4LDB4NjBGMSwvKiAweDY4LTB4NkYgKi8KKwkweDYxMEUsMHg2MEY2LDB4NjEwOSwweDYxMDAsMHg2MTEyLDB4NjIxRiwweDYyNDksMHg2M0EzLC8qIDB4NzAtMHg3NyAqLworCTB4NjM4QywweDYzQ0YsMHg2M0MwLDB4NjNFOSwweDYzQzksMHg2M0M2LDB4NjNDRCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDYzRDIsMHg2M0UzLDB4NjNEMCwweDYzRTEsMHg2M0Q2LDB4NjNFRCwweDYzRUUsLyogMHhBMC0weEE3ICovCisJMHg2Mzc2LDB4NjNGNCwweDYzRUEsMHg2M0RCLDB4NjQ1MiwweDYzREEsMHg2M0Y5LDB4NjU1RSwvKiAweEE4LTB4QUYgKi8KKwkweDY1NjYsMHg2NTYyLDB4NjU2MywweDY1OTEsMHg2NTkwLDB4NjVBRiwweDY2NkUsMHg2NjcwLC8qIDB4QjAtMHhCNyAqLworCTB4NjY3NCwweDY2NzYsMHg2NjZGLDB4NjY5MSwweDY2N0EsMHg2NjdFLDB4NjY3NywweDY2RkUsLyogMHhCOC0weEJGICovCisJMHg2NkZGLDB4NjcxRiwweDY3MUQsMHg2OEZBLDB4NjhENSwweDY4RTAsMHg2OEQ4LDB4NjhENywvKiAweEMwLTB4QzcgKi8KKwkweDY5MDUsMHg2OERGLDB4NjhGNSwweDY4RUUsMHg2OEU3LDB4NjhGOSwweDY4RDIsMHg2OEYyLC8qIDB4QzgtMHhDRiAqLworCTB4NjhFMywweDY4Q0IsMHg2OENELDB4NjkwRCwweDY5MTIsMHg2OTBFLDB4NjhDOSwweDY4REEsLyogMHhEMC0weEQ3ICovCisJMHg2OTZFLDB4NjhGQiwweDZCM0UsMHg2QjNBLDB4NkIzRCwweDZCOTgsMHg2Qjk2LDB4NkJCQywvKiAweEQ4LTB4REYgKi8KKwkweDZCRUYsMHg2QzJFLDB4NkMyRiwweDZDMkMsMHg2RTJGLDB4NkUzOCwweDZFNTQsMHg2RTIxLC8qIDB4RTAtMHhFNyAqLworCTB4NkUzMiwweDZFNjcsMHg2RTRBLDB4NkUyMCwweDZFMjUsMHg2RTIzLDB4NkUxQiwweDZFNUIsLyogMHhFOC0weEVGICovCisJMHg2RTU4LDB4NkUyNCwweDZFNTYsMHg2RTZFLDB4NkUyRCwweDZFMjYsMHg2RTZGLDB4NkUzNCwvKiAweEYwLTB4RjcgKi8KKwkweDZFNEQsMHg2RTNBLDB4NkUyQywweDZFNDMsMHg2RTFELDB4NkUzRSwweDZFQ0IsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0I1WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NkU4OSwweDZFMTksMHg2RTRFLDB4NkU2MywweDZFNDQsMHg2RTcyLDB4NkU2OSwweDZFNUYsLyogMHg0MC0weDQ3ICovCisJMHg3MTE5LDB4NzExQSwweDcxMjYsMHg3MTMwLDB4NzEyMSwweDcxMzYsMHg3MTZFLDB4NzExQywvKiAweDQ4LTB4NEYgKi8KKwkweDcyNEMsMHg3Mjg0LDB4NzI4MCwweDczMzYsMHg3MzI1LDB4NzMzNCwweDczMjksMHg3NDNBLC8qIDB4NTAtMHg1NyAqLworCTB4NzQyQSwweDc0MzMsMHg3NDIyLDB4NzQyNSwweDc0MzUsMHg3NDM2LDB4NzQzNCwweDc0MkYsLyogMHg1OC0weDVGICovCisJMHg3NDFCLDB4NzQyNiwweDc0MjgsMHg3NTI1LDB4NzUyNiwweDc1NkIsMHg3NTZBLDB4NzVFMiwvKiAweDYwLTB4NjcgKi8KKwkweDc1REIsMHg3NUUzLDB4NzVEOSwweDc1RDgsMHg3NURFLDB4NzVFMCwweDc2N0IsMHg3NjdDLC8qIDB4NjgtMHg2RiAqLworCTB4NzY5NiwweDc2OTMsMHg3NkI0LDB4NzZEQywweDc3NEYsMHg3N0VELDB4Nzg1RCwweDc4NkMsLyogMHg3MC0weDc3ICovCisJMHg3ODZGLDB4N0EwRCwweDdBMDgsMHg3QTBCLDB4N0EwNSwweDdBMDAsMHg3QTk4LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4N0E5NywweDdBOTYsMHg3QUU1LDB4N0FFMywweDdCNDksMHg3QjU2LDB4N0I0NiwvKiAweEEwLTB4QTcgKi8KKwkweDdCNTAsMHg3QjUyLDB4N0I1NCwweDdCNEQsMHg3QjRCLDB4N0I0RiwweDdCNTEsMHg3QzlGLC8qIDB4QTgtMHhBRiAqLworCTB4N0NBNSwweDdENUUsMHg3RDUwLDB4N0Q2OCwweDdENTUsMHg3RDJCLDB4N0Q2RSwweDdENzIsLyogMHhCMC0weEI3ICovCisJMHg3RDYxLDB4N0Q2NiwweDdENjIsMHg3RDcwLDB4N0Q3MywweDU1ODQsMHg3RkQ0LDB4N0ZENSwvKiAweEI4LTB4QkYgKi8KKwkweDgwMEIsMHg4MDUyLDB4ODA4NSwweDgxNTUsMHg4MTU0LDB4ODE0QiwweDgxNTEsMHg4MTRFLC8qIDB4QzAtMHhDNyAqLworCTB4ODEzOSwweDgxNDYsMHg4MTNFLDB4ODE0QywweDgxNTMsMHg4MTc0LDB4ODIxMiwweDgyMUMsLyogMHhDOC0weENGICovCisJMHg4M0U5LDB4ODQwMywweDgzRjgsMHg4NDBELDB4ODNFMCwweDgzQzUsMHg4NDBCLDB4ODNDMSwvKiAweEQwLTB4RDcgKi8KKwkweDgzRUYsMHg4M0YxLDB4ODNGNCwweDg0NTcsMHg4NDBBLDB4ODNGMCwweDg0MEMsMHg4M0NDLC8qIDB4RDgtMHhERiAqLworCTB4ODNGRCwweDgzRjIsMHg4M0NBLDB4ODQzOCwweDg0MEUsMHg4NDA0LDB4ODNEQywweDg0MDcsLyogMHhFMC0weEU3ICovCisJMHg4M0Q0LDB4ODNERiwweDg2NUIsMHg4NkRGLDB4ODZEOSwweDg2RUQsMHg4NkQ0LDB4ODZEQiwvKiAweEU4LTB4RUYgKi8KKwkweDg2RTQsMHg4NkQwLDB4ODZERSwweDg4NTcsMHg4OEMxLDB4ODhDMiwweDg4QjEsMHg4OTgzLC8qIDB4RjAtMHhGNyAqLworCTB4ODk5NiwweDhBM0IsMHg4QTYwLDB4OEE1NSwweDhBNUUsMHg4QTNDLDB4OEE0MSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4QTU0LDB4OEE1QiwweDhBNTAsMHg4QTQ2LDB4OEEzNCwweDhBM0EsMHg4QTM2LDB4OEE1NiwvKiAweDQwLTB4NDcgKi8KKwkweDhDNjEsMHg4QzgyLDB4OENBRiwweDhDQkMsMHg4Q0IzLDB4OENCRCwweDhDQzEsMHg4Q0JCLC8qIDB4NDgtMHg0RiAqLworCTB4OENDMCwweDhDQjQsMHg4Q0I3LDB4OENCNiwweDhDQkYsMHg4Q0I4LDB4OEQ4QSwweDhEODUsLyogMHg1MC0weDU3ICovCisJMHg4RDgxLDB4OERDRSwweDhEREQsMHg4RENCLDB4OEREQSwweDhERDEsMHg4RENDLDB4OEREQiwvKiAweDU4LTB4NUYgKi8KKwkweDhEQzYsMHg4RUZCLDB4OEVGOCwweDhFRkMsMHg4RjlDLDB4OTAyRSwweDkwMzUsMHg5MDMxLC8qIDB4NjAtMHg2NyAqLworCTB4OTAzOCwweDkwMzIsMHg5MDM2LDB4OTEwMiwweDkwRjUsMHg5MTA5LDB4OTBGRSwweDkxNjMsLyogMHg2OC0weDZGICovCisJMHg5MTY1LDB4OTFDRiwweDkyMTQsMHg5MjE1LDB4OTIyMywweDkyMDksMHg5MjFFLDB4OTIwRCwvKiAweDcwLTB4NzcgKi8KKwkweDkyMTAsMHg5MjA3LDB4OTIxMSwweDk1OTQsMHg5NThGLDB4OTU4QiwweDk1OTEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg5NTkzLDB4OTU5MiwweDk1OEUsMHg5NjhBLDB4OTY4RSwweDk2OEIsMHg5NjdELC8qIDB4QTAtMHhBNyAqLworCTB4OTY4NSwweDk2ODYsMHg5NjhELDB4OTY3MiwweDk2ODQsMHg5NkMxLDB4OTZDNSwweDk2QzQsLyogMHhBOC0weEFGICovCisJMHg5NkM2LDB4OTZDNywweDk2RUYsMHg5NkYyLDB4OTdDQywweDk4MDUsMHg5ODA2LDB4OTgwOCwvKiAweEIwLTB4QjcgKi8KKwkweDk4RTcsMHg5OEVBLDB4OThFRiwweDk4RTksMHg5OEYyLDB4OThFRCwweDk5QUUsMHg5OUFELC8qIDB4QjgtMHhCRiAqLworCTB4OUVDMywweDlFQ0QsMHg5RUQxLDB4NEU4MiwweDUwQUQsMHg1MEI1LDB4NTBCMiwweDUwQjMsLyogMHhDMC0weEM3ICovCisJMHg1MEM1LDB4NTBCRSwweDUwQUMsMHg1MEI3LDB4NTBCQiwweDUwQUYsMHg1MEM3LDB4NTI3RiwvKiAweEM4LTB4Q0YgKi8KKwkweDUyNzcsMHg1MjdELDB4NTJERiwweDUyRTYsMHg1MkU0LDB4NTJFMiwweDUyRTMsMHg1MzJGLC8qIDB4RDAtMHhENyAqLworCTB4NTVERiwweDU1RTgsMHg1NUQzLDB4NTVFNiwweDU1Q0UsMHg1NURDLDB4NTVDNywweDU1RDEsLyogMHhEOC0weERGICovCisJMHg1NUUzLDB4NTVFNCwweDU1RUYsMHg1NURBLDB4NTVFMSwweDU1QzUsMHg1NUM2LDB4NTVFNSwvKiAweEUwLTB4RTcgKi8KKwkweDU1QzksMHg1NzEyLDB4NTcxMywweDU4NUUsMHg1ODUxLDB4NTg1OCwweDU4NTcsMHg1ODVBLC8qIDB4RTgtMHhFRiAqLworCTB4NTg1NCwweDU4NkIsMHg1ODRDLDB4NTg2RCwweDU4NEEsMHg1ODYyLDB4NTg1MiwweDU4NEIsLyogMHhGMC0weEY3ICovCisJMHg1OTY3LDB4NUFDMSwweDVBQzksMHg1QUNDLDB4NUFCRSwweDVBQkQsMHg1QUJDLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CN1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDVBQjMsMHg1QUMyLDB4NUFCMiwweDVENjksMHg1RDZGLDB4NUU0QywweDVFNzksMHg1RUM5LC8qIDB4NDAtMHg0NyAqLworCTB4NUVDOCwweDVGMTIsMHg1RjU5LDB4NUZBQywweDVGQUUsMHg2MTFBLDB4NjEwRiwweDYxNDgsLyogMHg0OC0weDRGICovCisJMHg2MTFGLDB4NjBGMywweDYxMUIsMHg2MEY5LDB4NjEwMSwweDYxMDgsMHg2MTRFLDB4NjE0QywvKiAweDUwLTB4NTcgKi8KKwkweDYxNDQsMHg2MTRELDB4NjEzRSwweDYxMzQsMHg2MTI3LDB4NjEwRCwweDYxMDYsMHg2MTM3LC8qIDB4NTgtMHg1RiAqLworCTB4NjIyMSwweDYyMjIsMHg2NDEzLDB4NjQzRSwweDY0MUUsMHg2NDJBLDB4NjQyRCwweDY0M0QsLyogMHg2MC0weDY3ICovCisJMHg2NDJDLDB4NjQwRiwweDY0MUMsMHg2NDE0LDB4NjQwRCwweDY0MzYsMHg2NDE2LDB4NjQxNywvKiAweDY4LTB4NkYgKi8KKwkweDY0MDYsMHg2NTZDLDB4NjU5RiwweDY1QjAsMHg2Njk3LDB4NjY4OSwweDY2ODcsMHg2Njg4LC8qIDB4NzAtMHg3NyAqLworCTB4NjY5NiwweDY2ODQsMHg2Njk4LDB4NjY4RCwweDY3MDMsMHg2OTk0LDB4Njk2RCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDY5NUEsMHg2OTc3LDB4Njk2MCwweDY5NTQsMHg2OTc1LDB4NjkzMCwweDY5ODIsLyogMHhBMC0weEE3ICovCisJMHg2OTRBLDB4Njk2OCwweDY5NkIsMHg2OTVFLDB4Njk1MywweDY5NzksMHg2OTg2LDB4Njk1RCwvKiAweEE4LTB4QUYgKi8KKwkweDY5NjMsMHg2OTVCLDB4NkI0NywweDZCNzIsMHg2QkMwLDB4NkJCRiwweDZCRDMsMHg2QkZELC8qIDB4QjAtMHhCNyAqLworCTB4NkVBMiwweDZFQUYsMHg2RUQzLDB4NkVCNiwweDZFQzIsMHg2RTkwLDB4NkU5RCwweDZFQzcsLyogMHhCOC0weEJGICovCisJMHg2RUM1LDB4NkVBNSwweDZFOTgsMHg2RUJDLDB4NkVCQSwweDZFQUIsMHg2RUQxLDB4NkU5NiwvKiAweEMwLTB4QzcgKi8KKwkweDZFOUMsMHg2RUM0LDB4NkVENCwweDZFQUEsMHg2RUE3LDB4NkVCNCwweDcxNEUsMHg3MTU5LC8qIDB4QzgtMHhDRiAqLworCTB4NzE2OSwweDcxNjQsMHg3MTQ5LDB4NzE2NywweDcxNUMsMHg3MTZDLDB4NzE2NiwweDcxNEMsLyogMHhEMC0weEQ3ICovCisJMHg3MTY1LDB4NzE1RSwweDcxNDYsMHg3MTY4LDB4NzE1NiwweDcyM0EsMHg3MjUyLDB4NzMzNywvKiAweEQ4LTB4REYgKi8KKwkweDczNDUsMHg3MzNGLDB4NzMzRSwweDc0NkYsMHg3NDVBLDB4NzQ1NSwweDc0NUYsMHg3NDVFLC8qIDB4RTAtMHhFNyAqLworCTB4NzQ0MSwweDc0M0YsMHg3NDU5LDB4NzQ1QiwweDc0NUMsMHg3NTc2LDB4NzU3OCwweDc2MDAsLyogMHhFOC0weEVGICovCisJMHg3NUYwLDB4NzYwMSwweDc1RjIsMHg3NUYxLDB4NzVGQSwweDc1RkYsMHg3NUY0LDB4NzVGMywvKiAweEYwLTB4RjcgKi8KKwkweDc2REUsMHg3NkRGLDB4Nzc1QiwweDc3NkIsMHg3NzY2LDB4Nzc1RSwweDc3NjMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0I4WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4Nzc3OSwweDc3NkEsMHg3NzZDLDB4Nzc1QywweDc3NjUsMHg3NzY4LDB4Nzc2MiwweDc3RUUsLyogMHg0MC0weDQ3ICovCisJMHg3ODhFLDB4NzhCMCwweDc4OTcsMHg3ODk4LDB4Nzg4QywweDc4ODksMHg3ODdDLDB4Nzg5MSwvKiAweDQ4LTB4NEYgKi8KKwkweDc4OTMsMHg3ODdGLDB4Nzk3QSwweDc5N0YsMHg3OTgxLDB4ODQyQywweDc5QkQsMHg3QTFDLC8qIDB4NTAtMHg1NyAqLworCTB4N0ExQSwweDdBMjAsMHg3QTE0LDB4N0ExRiwweDdBMUUsMHg3QTlGLDB4N0FBMCwweDdCNzcsLyogMHg1OC0weDVGICovCisJMHg3QkMwLDB4N0I2MCwweDdCNkUsMHg3QjY3LDB4N0NCMSwweDdDQjMsMHg3Q0I1LDB4N0Q5MywvKiAweDYwLTB4NjcgKi8KKwkweDdENzksMHg3RDkxLDB4N0Q4MSwweDdEOEYsMHg3RDVCLDB4N0Y2RSwweDdGNjksMHg3RjZBLC8qIDB4NjgtMHg2RiAqLworCTB4N0Y3MiwweDdGQTksMHg3RkE4LDB4N0ZBNCwweDgwNTYsMHg4MDU4LDB4ODA4NiwweDgwODQsLyogMHg3MC0weDc3ICovCisJMHg4MTcxLDB4ODE3MCwweDgxNzgsMHg4MTY1LDB4ODE2RSwweDgxNzMsMHg4MTZCLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4ODE3OSwweDgxN0EsMHg4MTY2LDB4ODIwNSwweDgyNDcsMHg4NDgyLDB4ODQ3NywvKiAweEEwLTB4QTcgKi8KKwkweDg0M0QsMHg4NDMxLDB4ODQ3NSwweDg0NjYsMHg4NDZCLDB4ODQ0OSwweDg0NkMsMHg4NDVCLC8qIDB4QTgtMHhBRiAqLworCTB4ODQzQywweDg0MzUsMHg4NDYxLDB4ODQ2MywweDg0NjksMHg4NDZELDB4ODQ0NiwweDg2NUUsLyogMHhCMC0weEI3ICovCisJMHg4NjVDLDB4ODY1RiwweDg2RjksMHg4NzEzLDB4ODcwOCwweDg3MDcsMHg4NzAwLDB4ODZGRSwvKiAweEI4LTB4QkYgKi8KKwkweDg2RkIsMHg4NzAyLDB4ODcwMywweDg3MDYsMHg4NzBBLDB4ODg1OSwweDg4REYsMHg4OEQ0LC8qIDB4QzAtMHhDNyAqLworCTB4ODhEOSwweDg4REMsMHg4OEQ4LDB4ODhERCwweDg4RTEsMHg4OENBLDB4ODhENSwweDg4RDIsLyogMHhDOC0weENGICovCisJMHg4OTlDLDB4ODlFMywweDhBNkIsMHg4QTcyLDB4OEE3MywweDhBNjYsMHg4QTY5LDB4OEE3MCwvKiAweEQwLTB4RDcgKi8KKwkweDhBODcsMHg4QTdDLDB4OEE2MywweDhBQTAsMHg4QTcxLDB4OEE4NSwweDhBNkQsMHg4QTYyLC8qIDB4RDgtMHhERiAqLworCTB4OEE2RSwweDhBNkMsMHg4QTc5LDB4OEE3QiwweDhBM0UsMHg4QTY4LDB4OEM2MiwweDhDOEEsLyogMHhFMC0weEU3ICovCisJMHg4Qzg5LDB4OENDQSwweDhDQzcsMHg4Q0M4LDB4OENDNCwweDhDQjIsMHg4Q0MzLDB4OENDMiwvKiAweEU4LTB4RUYgKi8KKwkweDhDQzUsMHg4REUxLDB4OERERiwweDhERTgsMHg4REVGLDB4OERGMywweDhERkEsMHg4REVBLC8qIDB4RjAtMHhGNyAqLworCTB4OERFNCwweDhERTYsMHg4RUIyLDB4OEYwMywweDhGMDksMHg4RUZFLDB4OEYwQSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjlbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4RjlGLDB4OEZCMiwweDkwNEIsMHg5MDRBLDB4OTA1MywweDkwNDIsMHg5MDU0LDB4OTAzQywvKiAweDQwLTB4NDcgKi8KKwkweDkwNTUsMHg5MDUwLDB4OTA0NywweDkwNEYsMHg5MDRFLDB4OTA0RCwweDkwNTEsMHg5MDNFLC8qIDB4NDgtMHg0RiAqLworCTB4OTA0MSwweDkxMTIsMHg5MTE3LDB4OTE2QywweDkxNkEsMHg5MTY5LDB4OTFDOSwweDkyMzcsLyogMHg1MC0weDU3ICovCisJMHg5MjU3LDB4OTIzOCwweDkyM0QsMHg5MjQwLDB4OTIzRSwweDkyNUIsMHg5MjRCLDB4OTI2NCwvKiAweDU4LTB4NUYgKi8KKwkweDkyNTEsMHg5MjM0LDB4OTI0OSwweDkyNEQsMHg5MjQ1LDB4OTIzOSwweDkyM0YsMHg5MjVBLC8qIDB4NjAtMHg2NyAqLworCTB4OTU5OCwweDk2OTgsMHg5Njk0LDB4OTY5NSwweDk2Q0QsMHg5NkNCLDB4OTZDOSwweDk2Q0EsLyogMHg2OC0weDZGICovCisJMHg5NkY3LDB4OTZGQiwweDk2RjksMHg5NkY2LDB4OTc1NiwweDk3NzQsMHg5Nzc2LDB4OTgxMCwvKiAweDcwLTB4NzcgKi8KKwkweDk4MTEsMHg5ODEzLDB4OTgwQSwweDk4MTIsMHg5ODBDLDB4OThGQywweDk4RjQsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg5OEZELDB4OThGRSwweDk5QjMsMHg5OUIxLDB4OTlCNCwweDlBRTEsMHg5Q0U5LC8qIDB4QTAtMHhBNyAqLworCTB4OUU4MiwweDlGMEUsMHg5RjEzLDB4OUYyMCwweDUwRTcsMHg1MEVFLDB4NTBFNSwweDUwRDYsLyogMHhBOC0weEFGICovCisJMHg1MEVELDB4NTBEQSwweDUwRDUsMHg1MENGLDB4NTBEMSwweDUwRjEsMHg1MENFLDB4NTBFOSwvKiAweEIwLTB4QjcgKi8KKwkweDUxNjIsMHg1MUYzLDB4NTI4MywweDUyODIsMHg1MzMxLDB4NTNBRCwweDU1RkUsMHg1NjAwLC8qIDB4QjgtMHhCRiAqLworCTB4NTYxQiwweDU2MTcsMHg1NUZELDB4NTYxNCwweDU2MDYsMHg1NjA5LDB4NTYwRCwweDU2MEUsLyogMHhDMC0weEM3ICovCisJMHg1NUY3LDB4NTYxNiwweDU2MUYsMHg1NjA4LDB4NTYxMCwweDU1RjYsMHg1NzE4LDB4NTcxNiwvKiAweEM4LTB4Q0YgKi8KKwkweDU4NzUsMHg1ODdFLDB4NTg4MywweDU4OTMsMHg1ODhBLDB4NTg3OSwweDU4ODUsMHg1ODdELC8qIDB4RDAtMHhENyAqLworCTB4NThGRCwweDU5MjUsMHg1OTIyLDB4NTkyNCwweDU5NkEsMHg1OTY5LDB4NUFFMSwweDVBRTYsLyogMHhEOC0weERGICovCisJMHg1QUU5LDB4NUFENywweDVBRDYsMHg1QUQ4LDB4NUFFMywweDVCNzUsMHg1QkRFLDB4NUJFNywvKiAweEUwLTB4RTcgKi8KKwkweDVCRTEsMHg1QkU1LDB4NUJFNiwweDVCRTgsMHg1QkUyLDB4NUJFNCwweDVCREYsMHg1QzBELC8qIDB4RTgtMHhFRiAqLworCTB4NUM2MiwweDVEODQsMHg1RDg3LDB4NUU1QiwweDVFNjMsMHg1RTU1LDB4NUU1NywweDVFNTQsLyogMHhGMC0weEY3ICovCisJMHg1RUQzLDB4NUVENiwweDVGMEEsMHg1RjQ2LDB4NUY3MCwweDVGQjksMHg2MTQ3LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CQVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDYxM0YsMHg2MTRCLDB4NjE3NywweDYxNjIsMHg2MTYzLDB4NjE1RiwweDYxNUEsMHg2MTU4LC8qIDB4NDAtMHg0NyAqLworCTB4NjE3NSwweDYyMkEsMHg2NDg3LDB4NjQ1OCwweDY0NTQsMHg2NEE0LDB4NjQ3OCwweDY0NUYsLyogMHg0OC0weDRGICovCisJMHg2NDdBLDB4NjQ1MSwweDY0NjcsMHg2NDM0LDB4NjQ2RCwweDY0N0IsMHg2NTcyLDB4NjVBMSwvKiAweDUwLTB4NTcgKi8KKwkweDY1RDcsMHg2NUQ2LDB4NjZBMiwweDY2QTgsMHg2NjlELDB4Njk5QywweDY5QTgsMHg2OTk1LC8qIDB4NTgtMHg1RiAqLworCTB4NjlDMSwweDY5QUUsMHg2OUQzLDB4NjlDQiwweDY5OUIsMHg2OUI3LDB4NjlCQiwweDY5QUIsLyogMHg2MC0weDY3ICovCisJMHg2OUI0LDB4NjlEMCwweDY5Q0QsMHg2OUFELDB4NjlDQywweDY5QTYsMHg2OUMzLDB4NjlBMywvKiAweDY4LTB4NkYgKi8KKwkweDZCNDksMHg2QjRDLDB4NkMzMywweDZGMzMsMHg2RjE0LDB4NkVGRSwweDZGMTMsMHg2RUY0LC8qIDB4NzAtMHg3NyAqLworCTB4NkYyOSwweDZGM0UsMHg2RjIwLDB4NkYyQywweDZGMEYsMHg2RjAyLDB4NkYyMiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDZFRkYsMHg2RUVGLDB4NkYwNiwweDZGMzEsMHg2RjM4LDB4NkYzMiwweDZGMjMsLyogMHhBMC0weEE3ICovCisJMHg2RjE1LDB4NkYyQiwweDZGMkYsMHg2Rjg4LDB4NkYyQSwweDZFRUMsMHg2RjAxLDB4NkVGMiwvKiAweEE4LTB4QUYgKi8KKwkweDZFQ0MsMHg2RUY3LDB4NzE5NCwweDcxOTksMHg3MTdELDB4NzE4QSwweDcxODQsMHg3MTkyLC8qIDB4QjAtMHhCNyAqLworCTB4NzIzRSwweDcyOTIsMHg3Mjk2LDB4NzM0NCwweDczNTAsMHg3NDY0LDB4NzQ2MywweDc0NkEsLyogMHhCOC0weEJGICovCisJMHg3NDcwLDB4NzQ2RCwweDc1MDQsMHg3NTkxLDB4NzYyNywweDc2MEQsMHg3NjBCLDB4NzYwOSwvKiAweEMwLTB4QzcgKi8KKwkweDc2MTMsMHg3NkUxLDB4NzZFMywweDc3ODQsMHg3NzdELDB4Nzc3RiwweDc3NjEsMHg3OEMxLC8qIDB4QzgtMHhDRiAqLworCTB4Nzg5RiwweDc4QTcsMHg3OEIzLDB4NzhBOSwweDc4QTMsMHg3OThFLDB4Nzk4RiwweDc5OEQsLyogMHhEMC0weEQ3ICovCisJMHg3QTJFLDB4N0EzMSwweDdBQUEsMHg3QUE5LDB4N0FFRCwweDdBRUYsMHg3QkExLDB4N0I5NSwvKiAweEQ4LTB4REYgKi8KKwkweDdCOEIsMHg3Qjc1LDB4N0I5NywweDdCOUQsMHg3Qjk0LDB4N0I4RiwweDdCQjgsMHg3Qjg3LC8qIDB4RTAtMHhFNyAqLworCTB4N0I4NCwweDdDQjksMHg3Q0JELDB4N0NCRSwweDdEQkIsMHg3REIwLDB4N0Q5QywweDdEQkQsLyogMHhFOC0weEVGICovCisJMHg3REJFLDB4N0RBMCwweDdEQ0EsMHg3REI0LDB4N0RCMiwweDdEQjEsMHg3REJBLDB4N0RBMiwvKiAweEYwLTB4RjcgKi8KKwkweDdEQkYsMHg3REI1LDB4N0RCOCwweDdEQUQsMHg3REQyLDB4N0RDNywweDdEQUMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0JCWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4N0Y3MCwweDdGRTAsMHg3RkUxLDB4N0ZERiwweDgwNUUsMHg4MDVBLDB4ODA4NywweDgxNTAsLyogMHg0MC0weDQ3ICovCisJMHg4MTgwLDB4ODE4RiwweDgxODgsMHg4MThBLDB4ODE3RiwweDgxODIsMHg4MUU3LDB4ODFGQSwvKiAweDQ4LTB4NEYgKi8KKwkweDgyMDcsMHg4MjE0LDB4ODIxRSwweDgyNEIsMHg4NEM5LDB4ODRCRiwweDg0QzYsMHg4NEM0LC8qIDB4NTAtMHg1NyAqLworCTB4ODQ5OSwweDg0OUUsMHg4NEIyLDB4ODQ5QywweDg0Q0IsMHg4NEI4LDB4ODRDMCwweDg0RDMsLyogMHg1OC0weDVGICovCisJMHg4NDkwLDB4ODRCQywweDg0RDEsMHg4NENBLDB4ODczRiwweDg3MUMsMHg4NzNCLDB4ODcyMiwvKiAweDYwLTB4NjcgKi8KKwkweDg3MjUsMHg4NzM0LDB4ODcxOCwweDg3NTUsMHg4NzM3LDB4ODcyOSwweDg4RjMsMHg4OTAyLC8qIDB4NjgtMHg2RiAqLworCTB4ODhGNCwweDg4RjksMHg4OEY4LDB4ODhGRCwweDg4RTgsMHg4OTFBLDB4ODhFRiwweDhBQTYsLyogMHg3MC0weDc3ICovCisJMHg4QThDLDB4OEE5RSwweDhBQTMsMHg4QThELDB4OEFBMSwweDhBOTMsMHg4QUE0LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OEFBQSwweDhBQTUsMHg4QUE4LDB4OEE5OCwweDhBOTEsMHg4QTlBLDB4OEFBNywvKiAweEEwLTB4QTcgKi8KKwkweDhDNkEsMHg4QzhELDB4OEM4QywweDhDRDMsMHg4Q0QxLDB4OENEMiwweDhENkIsMHg4RDk5LC8qIDB4QTgtMHhBRiAqLworCTB4OEQ5NSwweDhERkMsMHg4RjE0LDB4OEYxMiwweDhGMTUsMHg4RjEzLDB4OEZBMywweDkwNjAsLyogMHhCMC0weEI3ICovCisJMHg5MDU4LDB4OTA1QywweDkwNjMsMHg5MDU5LDB4OTA1RSwweDkwNjIsMHg5MDVELDB4OTA1QiwvKiAweEI4LTB4QkYgKi8KKwkweDkxMTksMHg5MTE4LDB4OTExRSwweDkxNzUsMHg5MTc4LDB4OTE3NywweDkxNzQsMHg5Mjc4LC8qIDB4QzAtMHhDNyAqLworCTB4OTI4MCwweDkyODUsMHg5Mjk4LDB4OTI5NiwweDkyN0IsMHg5MjkzLDB4OTI5QywweDkyQTgsLyogMHhDOC0weENGICovCisJMHg5MjdDLDB4OTI5MSwweDk1QTEsMHg5NUE4LDB4OTVBOSwweDk1QTMsMHg5NUE1LDB4OTVBNCwvKiAweEQwLTB4RDcgKi8KKwkweDk2OTksMHg5NjlDLDB4OTY5QiwweDk2Q0MsMHg5NkQyLDB4OTcwMCwweDk3N0MsMHg5Nzg1LC8qIDB4RDgtMHhERiAqLworCTB4OTdGNiwweDk4MTcsMHg5ODE4LDB4OThBRiwweDk4QjEsMHg5OTAzLDB4OTkwNSwweDk5MEMsLyogMHhFMC0weEU3ICovCisJMHg5OTA5LDB4OTlDMSwweDlBQUYsMHg5QUIwLDB4OUFFNiwweDlCNDEsMHg5QjQyLDB4OUNGNCwvKiAweEU4LTB4RUYgKi8KKwkweDlDRjYsMHg5Q0YzLDB4OUVCQywweDlGM0IsMHg5RjRBLDB4NTEwNCwweDUxMDAsMHg1MEZCLC8qIDB4RjAtMHhGNyAqLworCTB4NTBGNSwweDUwRjksMHg1MTAyLDB4NTEwOCwweDUxMDksMHg1MTA1LDB4NTFEQywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQkNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1Mjg3LDB4NTI4OCwweDUyODksMHg1MjhELDB4NTI4QSwweDUyRjAsMHg1M0IyLDB4NTYyRSwvKiAweDQwLTB4NDcgKi8KKwkweDU2M0IsMHg1NjM5LDB4NTYzMiwweDU2M0YsMHg1NjM0LDB4NTYyOSwweDU2NTMsMHg1NjRFLC8qIDB4NDgtMHg0RiAqLworCTB4NTY1NywweDU2NzQsMHg1NjM2LDB4NTYyRiwweDU2MzAsMHg1ODgwLDB4NTg5RiwweDU4OUUsLyogMHg1MC0weDU3ICovCisJMHg1OEIzLDB4NTg5QywweDU4QUUsMHg1OEE5LDB4NThBNiwweDU5NkQsMHg1QjA5LDB4NUFGQiwvKiAweDU4LTB4NUYgKi8KKwkweDVCMEIsMHg1QUY1LDB4NUIwQywweDVCMDgsMHg1QkVFLDB4NUJFQywweDVCRTksMHg1QkVCLC8qIDB4NjAtMHg2NyAqLworCTB4NUM2NCwweDVDNjUsMHg1RDlELDB4NUQ5NCwweDVFNjIsMHg1RTVGLDB4NUU2MSwweDVFRTIsLyogMHg2OC0weDZGICovCisJMHg1RURBLDB4NUVERiwweDVFREQsMHg1RUUzLDB4NUVFMCwweDVGNDgsMHg1RjcxLDB4NUZCNywvKiAweDcwLTB4NzcgKi8KKwkweDVGQjUsMHg2MTc2LDB4NjE2NywweDYxNkUsMHg2MTVELDB4NjE1NSwweDYxODIsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg2MTdDLDB4NjE3MCwweDYxNkIsMHg2MTdFLDB4NjFBNywweDYxOTAsMHg2MUFCLC8qIDB4QTAtMHhBNyAqLworCTB4NjE4RSwweDYxQUMsMHg2MTlBLDB4NjFBNCwweDYxOTQsMHg2MUFFLDB4NjIyRSwweDY0NjksLyogMHhBOC0weEFGICovCisJMHg2NDZGLDB4NjQ3OSwweDY0OUUsMHg2NEIyLDB4NjQ4OCwweDY0OTAsMHg2NEIwLDB4NjRBNSwvKiAweEIwLTB4QjcgKi8KKwkweDY0OTMsMHg2NDk1LDB4NjRBOSwweDY0OTIsMHg2NEFFLDB4NjRBRCwweDY0QUIsMHg2NDlBLC8qIDB4QjgtMHhCRiAqLworCTB4NjRBQywweDY0OTksMHg2NEEyLDB4NjRCMywweDY1NzUsMHg2NTc3LDB4NjU3OCwweDY2QUUsLyogMHhDMC0weEM3ICovCisJMHg2NkFCLDB4NjZCNCwweDY2QjEsMHg2QTIzLDB4NkExRiwweDY5RTgsMHg2QTAxLDB4NkExRSwvKiAweEM4LTB4Q0YgKi8KKwkweDZBMTksMHg2OUZELDB4NkEyMSwweDZBMTMsMHg2QTBBLDB4NjlGMywweDZBMDIsMHg2QTA1LC8qIDB4RDAtMHhENyAqLworCTB4NjlFRCwweDZBMTEsMHg2QjUwLDB4NkI0RSwweDZCQTQsMHg2QkM1LDB4NkJDNiwweDZGM0YsLyogMHhEOC0weERGICovCisJMHg2RjdDLDB4NkY4NCwweDZGNTEsMHg2RjY2LDB4NkY1NCwweDZGODYsMHg2RjZELDB4NkY1QiwvKiAweEUwLTB4RTcgKi8KKwkweDZGNzgsMHg2RjZFLDB4NkY4RSwweDZGN0EsMHg2RjcwLDB4NkY2NCwweDZGOTcsMHg2RjU4LC8qIDB4RTgtMHhFRiAqLworCTB4NkVENSwweDZGNkYsMHg2RjYwLDB4NkY1RiwweDcxOUYsMHg3MUFDLDB4NzFCMSwweDcxQTgsLyogMHhGMC0weEY3ICovCisJMHg3MjU2LDB4NzI5QiwweDczNEUsMHg3MzU3LDB4NzQ2OSwweDc0OEIsMHg3NDgzLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CRFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDc0N0UsMHg3NDgwLDB4NzU3RiwweDc2MjAsMHg3NjI5LDB4NzYxRiwweDc2MjQsMHg3NjI2LC8qIDB4NDAtMHg0NyAqLworCTB4NzYyMSwweDc2MjIsMHg3NjlBLDB4NzZCQSwweDc2RTQsMHg3NzhFLDB4Nzc4NywweDc3OEMsLyogMHg0OC0weDRGICovCisJMHg3NzkxLDB4Nzc4QiwweDc4Q0IsMHg3OEM1LDB4NzhCQSwweDc4Q0EsMHg3OEJFLDB4NzhENSwvKiAweDUwLTB4NTcgKi8KKwkweDc4QkMsMHg3OEQwLDB4N0EzRiwweDdBM0MsMHg3QTQwLDB4N0EzRCwweDdBMzcsMHg3QTNCLC8qIDB4NTgtMHg1RiAqLworCTB4N0FBRiwweDdBQUUsMHg3QkFELDB4N0JCMSwweDdCQzQsMHg3QkI0LDB4N0JDNiwweDdCQzcsLyogMHg2MC0weDY3ICovCisJMHg3QkMxLDB4N0JBMCwweDdCQ0MsMHg3Q0NBLDB4N0RFMCwweDdERjQsMHg3REVGLDB4N0RGQiwvKiAweDY4LTB4NkYgKi8KKwkweDdERDgsMHg3REVDLDB4N0RERCwweDdERTgsMHg3REUzLDB4N0REQSwweDdEREUsMHg3REU5LC8qIDB4NzAtMHg3NyAqLworCTB4N0Q5RSwweDdERDksMHg3REYyLDB4N0RGOSwweDdGNzUsMHg3Rjc3LDB4N0ZBRiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDdGRTksMHg4MDI2LDB4ODE5QiwweDgxOUMsMHg4MTlELDB4ODFBMCwweDgxOUEsLyogMHhBMC0weEE3ICovCisJMHg4MTk4LDB4ODUxNywweDg1M0QsMHg4NTFBLDB4ODRFRSwweDg1MkMsMHg4NTJELDB4ODUxMywvKiAweEE4LTB4QUYgKi8KKwkweDg1MTEsMHg4NTIzLDB4ODUyMSwweDg1MTQsMHg4NEVDLDB4ODUyNSwweDg0RkYsMHg4NTA2LC8qIDB4QjAtMHhCNyAqLworCTB4ODc4MiwweDg3NzQsMHg4Nzc2LDB4ODc2MCwweDg3NjYsMHg4Nzc4LDB4ODc2OCwweDg3NTksLyogMHhCOC0weEJGICovCisJMHg4NzU3LDB4ODc0QywweDg3NTMsMHg4ODVCLDB4ODg1RCwweDg5MTAsMHg4OTA3LDB4ODkxMiwvKiAweEMwLTB4QzcgKi8KKwkweDg5MTMsMHg4OTE1LDB4ODkwQSwweDhBQkMsMHg4QUQyLDB4OEFDNywweDhBQzQsMHg4QTk1LC8qIDB4QzgtMHhDRiAqLworCTB4OEFDQiwweDhBRjgsMHg4QUIyLDB4OEFDOSwweDhBQzIsMHg4QUJGLDB4OEFCMCwweDhBRDYsLyogMHhEMC0weEQ3ICovCisJMHg4QUNELDB4OEFCNiwweDhBQjksMHg4QURCLDB4OEM0QywweDhDNEUsMHg4QzZDLDB4OENFMCwvKiAweEQ4LTB4REYgKi8KKwkweDhDREUsMHg4Q0U2LDB4OENFNCwweDhDRUMsMHg4Q0VELDB4OENFMiwweDhDRTMsMHg4Q0RDLC8qIDB4RTAtMHhFNyAqLworCTB4OENFQSwweDhDRTEsMHg4RDZELDB4OEQ5RiwweDhEQTMsMHg4RTJCLDB4OEUxMCwweDhFMUQsLyogMHhFOC0weEVGICovCisJMHg4RTIyLDB4OEUwRiwweDhFMjksMHg4RTFGLDB4OEUyMSwweDhFMUUsMHg4RUJBLDB4OEYxRCwvKiAweEYwLTB4RjcgKi8KKwkweDhGMUIsMHg4RjFGLDB4OEYyOSwweDhGMjYsMHg4RjJBLDB4OEYxQywweDhGMUUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0JFWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OEYyNSwweDkwNjksMHg5MDZFLDB4OTA2OCwweDkwNkQsMHg5MDc3LDB4OTEzMCwweDkxMkQsLyogMHg0MC0weDQ3ICovCisJMHg5MTI3LDB4OTEzMSwweDkxODcsMHg5MTg5LDB4OTE4QiwweDkxODMsMHg5MkM1LDB4OTJCQiwvKiAweDQ4LTB4NEYgKi8KKwkweDkyQjcsMHg5MkVBLDB4OTJBQywweDkyRTQsMHg5MkMxLDB4OTJCMywweDkyQkMsMHg5MkQyLC8qIDB4NTAtMHg1NyAqLworCTB4OTJDNywweDkyRjAsMHg5MkIyLDB4OTVBRCwweDk1QjEsMHg5NzA0LDB4OTcwNiwweDk3MDcsLyogMHg1OC0weDVGICovCisJMHg5NzA5LDB4OTc2MCwweDk3OEQsMHg5NzhCLDB4OTc4RiwweDk4MjEsMHg5ODJCLDB4OTgxQywvKiAweDYwLTB4NjcgKi8KKwkweDk4QjMsMHg5OTBBLDB4OTkxMywweDk5MTIsMHg5OTE4LDB4OTlERCwweDk5RDAsMHg5OURGLC8qIDB4NjgtMHg2RiAqLworCTB4OTlEQiwweDk5RDEsMHg5OUQ1LDB4OTlEMiwweDk5RDksMHg5QUI3LDB4OUFFRSwweDlBRUYsLyogMHg3MC0weDc3ICovCisJMHg5QjI3LDB4OUI0NSwweDlCNDQsMHg5Qjc3LDB4OUI2RiwweDlEMDYsMHg5RDA5LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OUQwMywweDlFQTksMHg5RUJFLDB4OUVDRSwweDU4QTgsMHg5RjUyLDB4NTExMiwvKiAweEEwLTB4QTcgKi8KKwkweDUxMTgsMHg1MTE0LDB4NTExMCwweDUxMTUsMHg1MTgwLDB4NTFBQSwweDUxREQsMHg1MjkxLC8qIDB4QTgtMHhBRiAqLworCTB4NTI5MywweDUyRjMsMHg1NjU5LDB4NTY2QiwweDU2NzksMHg1NjY5LDB4NTY2NCwweDU2NzgsLyogMHhCMC0weEI3ICovCisJMHg1NjZBLDB4NTY2OCwweDU2NjUsMHg1NjcxLDB4NTY2RiwweDU2NkMsMHg1NjYyLDB4NTY3NiwvKiAweEI4LTB4QkYgKi8KKwkweDU4QzEsMHg1OEJFLDB4NThDNywweDU4QzUsMHg1OTZFLDB4NUIxRCwweDVCMzQsMHg1Qjc4LC8qIDB4QzAtMHhDNyAqLworCTB4NUJGMCwweDVDMEUsMHg1RjRBLDB4NjFCMiwweDYxOTEsMHg2MUE5LDB4NjE4QSwweDYxQ0QsLyogMHhDOC0weENGICovCisJMHg2MUI2LDB4NjFCRSwweDYxQ0EsMHg2MUM4LDB4NjIzMCwweDY0QzUsMHg2NEMxLDB4NjRDQiwvKiAweEQwLTB4RDcgKi8KKwkweDY0QkIsMHg2NEJDLDB4NjREQSwweDY0QzQsMHg2NEM3LDB4NjRDMiwweDY0Q0QsMHg2NEJGLC8qIDB4RDgtMHhERiAqLworCTB4NjREMiwweDY0RDQsMHg2NEJFLDB4NjU3NCwweDY2QzYsMHg2NkM5LDB4NjZCOSwweDY2QzQsLyogMHhFMC0weEU3ICovCisJMHg2NkM3LDB4NjZCOCwweDZBM0QsMHg2QTM4LDB4NkEzQSwweDZBNTksMHg2QTZCLDB4NkE1OCwvKiAweEU4LTB4RUYgKi8KKwkweDZBMzksMHg2QTQ0LDB4NkE2MiwweDZBNjEsMHg2QTRCLDB4NkE0NywweDZBMzUsMHg2QTVGLC8qIDB4RjAtMHhGNyAqLworCTB4NkE0OCwweDZCNTksMHg2Qjc3LDB4NkMwNSwweDZGQzIsMHg2RkIxLDB4NkZBMSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQkZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2RkMzLDB4NkZBNCwweDZGQzEsMHg2RkE3LDB4NkZCMywweDZGQzAsMHg2RkI5LDB4NkZCNiwvKiAweDQwLTB4NDcgKi8KKwkweDZGQTYsMHg2RkEwLDB4NkZCNCwweDcxQkUsMHg3MUM5LDB4NzFEMCwweDcxRDIsMHg3MUM4LC8qIDB4NDgtMHg0RiAqLworCTB4NzFENSwweDcxQjksMHg3MUNFLDB4NzFEOSwweDcxREMsMHg3MUMzLDB4NzFDNCwweDczNjgsLyogMHg1MC0weDU3ICovCisJMHg3NDlDLDB4NzRBMywweDc0OTgsMHg3NDlGLDB4NzQ5RSwweDc0RTIsMHg3NTBDLDB4NzUwRCwvKiAweDU4LTB4NUYgKi8KKwkweDc2MzQsMHg3NjM4LDB4NzYzQSwweDc2RTcsMHg3NkU1LDB4NzdBMCwweDc3OUUsMHg3NzlGLC8qIDB4NjAtMHg2NyAqLworCTB4NzdBNSwweDc4RTgsMHg3OERBLDB4NzhFQywweDc4RTcsMHg3OUE2LDB4N0E0RCwweDdBNEUsLyogMHg2OC0weDZGICovCisJMHg3QTQ2LDB4N0E0QywweDdBNEIsMHg3QUJBLDB4N0JEOSwweDdDMTEsMHg3QkM5LDB4N0JFNCwvKiAweDcwLTB4NzcgKi8KKwkweDdCREIsMHg3QkUxLDB4N0JFOSwweDdCRTYsMHg3Q0Q1LDB4N0NENiwweDdFMEEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3RTExLDB4N0UwOCwweDdFMUIsMHg3RTIzLDB4N0UxRSwweDdFMUQsMHg3RTA5LC8qIDB4QTAtMHhBNyAqLworCTB4N0UxMCwweDdGNzksMHg3RkIyLDB4N0ZGMCwweDdGRjEsMHg3RkVFLDB4ODAyOCwweDgxQjMsLyogMHhBOC0weEFGICovCisJMHg4MUE5LDB4ODFBOCwweDgxRkIsMHg4MjA4LDB4ODI1OCwweDgyNTksMHg4NTRBLDB4ODU1OSwvKiAweEIwLTB4QjcgKi8KKwkweDg1NDgsMHg4NTY4LDB4ODU2OSwweDg1NDMsMHg4NTQ5LDB4ODU2RCwweDg1NkEsMHg4NTVFLC8qIDB4QjgtMHhCRiAqLworCTB4ODc4MywweDg3OUYsMHg4NzlFLDB4ODdBMiwweDg3OEQsMHg4ODYxLDB4ODkyQSwweDg5MzIsLyogMHhDMC0weEM3ICovCisJMHg4OTI1LDB4ODkyQiwweDg5MjEsMHg4OUFBLDB4ODlBNiwweDhBRTYsMHg4QUZBLDB4OEFFQiwvKiAweEM4LTB4Q0YgKi8KKwkweDhBRjEsMHg4QjAwLDB4OEFEQywweDhBRTcsMHg4QUVFLDB4OEFGRSwweDhCMDEsMHg4QjAyLC8qIDB4RDAtMHhENyAqLworCTB4OEFGNywweDhBRUQsMHg4QUYzLDB4OEFGNiwweDhBRkMsMHg4QzZCLDB4OEM2RCwweDhDOTMsLyogMHhEOC0weERGICovCisJMHg4Q0Y0LDB4OEU0NCwweDhFMzEsMHg4RTM0LDB4OEU0MiwweDhFMzksMHg4RTM1LDB4OEYzQiwvKiAweEUwLTB4RTcgKi8KKwkweDhGMkYsMHg4RjM4LDB4OEYzMywweDhGQTgsMHg4RkE2LDB4OTA3NSwweDkwNzQsMHg5MDc4LC8qIDB4RTgtMHhFRiAqLworCTB4OTA3MiwweDkwN0MsMHg5MDdBLDB4OTEzNCwweDkxOTIsMHg5MzIwLDB4OTMzNiwweDkyRjgsLyogMHhGMC0weEY3ICovCisJMHg5MzMzLDB4OTMyRiwweDkzMjIsMHg5MkZDLDB4OTMyQiwweDkzMDQsMHg5MzFBLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DMFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDkzMTAsMHg5MzI2LDB4OTMyMSwweDkzMTUsMHg5MzJFLDB4OTMxOSwweDk1QkIsMHg5NkE3LC8qIDB4NDAtMHg0NyAqLworCTB4OTZBOCwweDk2QUEsMHg5NkQ1LDB4OTcwRSwweDk3MTEsMHg5NzE2LDB4OTcwRCwweDk3MTMsLyogMHg0OC0weDRGICovCisJMHg5NzBGLDB4OTc1QiwweDk3NUMsMHg5NzY2LDB4OTc5OCwweDk4MzAsMHg5ODM4LDB4OTgzQiwvKiAweDUwLTB4NTcgKi8KKwkweDk4MzcsMHg5ODJELDB4OTgzOSwweDk4MjQsMHg5OTEwLDB4OTkyOCwweDk5MUUsMHg5OTFCLC8qIDB4NTgtMHg1RiAqLworCTB4OTkyMSwweDk5MUEsMHg5OUVELDB4OTlFMiwweDk5RjEsMHg5QUI4LDB4OUFCQywweDlBRkIsLyogMHg2MC0weDY3ICovCisJMHg5QUVELDB4OUIyOCwweDlCOTEsMHg5RDE1LDB4OUQyMywweDlEMjYsMHg5RDI4LDB4OUQxMiwvKiAweDY4LTB4NkYgKi8KKwkweDlEMUIsMHg5RUQ4LDB4OUVENCwweDlGOEQsMHg5RjlDLDB4NTEyQSwweDUxMUYsMHg1MTIxLC8qIDB4NzAtMHg3NyAqLworCTB4NTEzMiwweDUyRjUsMHg1NjhFLDB4NTY4MCwweDU2OTAsMHg1Njg1LDB4NTY4NywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDU2OEYsMHg1OEQ1LDB4NThEMywweDU4RDEsMHg1OENFLDB4NUIzMCwweDVCMkEsLyogMHhBMC0weEE3ICovCisJMHg1QjI0LDB4NUI3QSwweDVDMzcsMHg1QzY4LDB4NURCQywweDVEQkEsMHg1REJELDB4NURCOCwvKiAweEE4LTB4QUYgKi8KKwkweDVFNkIsMHg1RjRDLDB4NUZCRCwweDYxQzksMHg2MUMyLDB4NjFDNywweDYxRTYsMHg2MUNCLC8qIDB4QjAtMHhCNyAqLworCTB4NjIzMiwweDYyMzQsMHg2NENFLDB4NjRDQSwweDY0RDgsMHg2NEUwLDB4NjRGMCwweDY0RTYsLyogMHhCOC0weEJGICovCisJMHg2NEVDLDB4NjRGMSwweDY0RTIsMHg2NEVELDB4NjU4MiwweDY1ODMsMHg2NkQ5LDB4NjZENiwvKiAweEMwLTB4QzcgKi8KKwkweDZBODAsMHg2QTk0LDB4NkE4NCwweDZBQTIsMHg2QTlDLDB4NkFEQiwweDZBQTMsMHg2QTdFLC8qIDB4QzgtMHhDRiAqLworCTB4NkE5NywweDZBOTAsMHg2QUEwLDB4NkI1QywweDZCQUUsMHg2QkRBLDB4NkMwOCwweDZGRDgsLyogMHhEMC0weEQ3ICovCisJMHg2RkYxLDB4NkZERiwweDZGRTAsMHg2RkRCLDB4NkZFNCwweDZGRUIsMHg2RkVGLDB4NkY4MCwvKiAweEQ4LTB4REYgKi8KKwkweDZGRUMsMHg2RkUxLDB4NkZFOSwweDZGRDUsMHg2RkVFLDB4NkZGMCwweDcxRTcsMHg3MURGLC8qIDB4RTAtMHhFNyAqLworCTB4NzFFRSwweDcxRTYsMHg3MUU1LDB4NzFFRCwweDcxRUMsMHg3MUY0LDB4NzFFMCwweDcyMzUsLyogMHhFOC0weEVGICovCisJMHg3MjQ2LDB4NzM3MCwweDczNzIsMHg3NEE5LDB4NzRCMCwweDc0QTYsMHg3NEE4LDB4NzY0NiwvKiAweEYwLTB4RjcgKi8KKwkweDc2NDIsMHg3NjRDLDB4NzZFQSwweDc3QjMsMHg3N0FBLDB4NzdCMCwweDc3QUMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0MxWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NzdBNywweDc3QUQsMHg3N0VGLDB4NzhGNywweDc4RkEsMHg3OEY0LDB4NzhFRiwweDc5MDEsLyogMHg0MC0weDQ3ICovCisJMHg3OUE3LDB4NzlBQSwweDdBNTcsMHg3QUJGLDB4N0MwNywweDdDMEQsMHg3QkZFLDB4N0JGNywvKiAweDQ4LTB4NEYgKi8KKwkweDdDMEMsMHg3QkUwLDB4N0NFMCwweDdDREMsMHg3Q0RFLDB4N0NFMiwweDdDREYsMHg3Q0Q5LC8qIDB4NTAtMHg1NyAqLworCTB4N0NERCwweDdFMkUsMHg3RTNFLDB4N0U0NiwweDdFMzcsMHg3RTMyLDB4N0U0MywweDdFMkIsLyogMHg1OC0weDVGICovCisJMHg3RTNELDB4N0UzMSwweDdFNDUsMHg3RTQxLDB4N0UzNCwweDdFMzksMHg3RTQ4LDB4N0UzNSwvKiAweDYwLTB4NjcgKi8KKwkweDdFM0YsMHg3RTJGLDB4N0Y0NCwweDdGRjMsMHg3RkZDLDB4ODA3MSwweDgwNzIsMHg4MDcwLC8qIDB4NjgtMHg2RiAqLworCTB4ODA2RiwweDgwNzMsMHg4MUM2LDB4ODFDMywweDgxQkEsMHg4MUMyLDB4ODFDMCwweDgxQkYsLyogMHg3MC0weDc3ICovCisJMHg4MUJELDB4ODFDOSwweDgxQkUsMHg4MUU4LDB4ODIwOSwweDgyNzEsMHg4NUFBLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4ODU4NCwweDg1N0UsMHg4NTlDLDB4ODU5MSwweDg1OTQsMHg4NUFGLDB4ODU5QiwvKiAweEEwLTB4QTcgKi8KKwkweDg1ODcsMHg4NUE4LDB4ODU4QSwweDg2NjcsMHg4N0MwLDB4ODdEMSwweDg3QjMsMHg4N0QyLC8qIDB4QTgtMHhBRiAqLworCTB4ODdDNiwweDg3QUIsMHg4N0JCLDB4ODdCQSwweDg3QzgsMHg4N0NCLDB4ODkzQiwweDg5MzYsLyogMHhCMC0weEI3ICovCisJMHg4OTQ0LDB4ODkzOCwweDg5M0QsMHg4OUFDLDB4OEIwRSwweDhCMTcsMHg4QjE5LDB4OEIxQiwvKiAweEI4LTB4QkYgKi8KKwkweDhCMEEsMHg4QjIwLDB4OEIxRCwweDhCMDQsMHg4QjEwLDB4OEM0MSwweDhDM0YsMHg4QzczLC8qIDB4QzAtMHhDNyAqLworCTB4OENGQSwweDhDRkQsMHg4Q0ZDLDB4OENGOCwweDhDRkIsMHg4REE4LDB4OEU0OSwweDhFNEIsLyogMHhDOC0weENGICovCisJMHg4RTQ4LDB4OEU0QSwweDhGNDQsMHg4RjNFLDB4OEY0MiwweDhGNDUsMHg4RjNGLDB4OTA3RiwvKiAweEQwLTB4RDcgKi8KKwkweDkwN0QsMHg5MDg0LDB4OTA4MSwweDkwODIsMHg5MDgwLDB4OTEzOSwweDkxQTMsMHg5MTlFLC8qIDB4RDgtMHhERiAqLworCTB4OTE5QywweDkzNEQsMHg5MzgyLDB4OTMyOCwweDkzNzUsMHg5MzRBLDB4OTM2NSwweDkzNEIsLyogMHhFMC0weEU3ICovCisJMHg5MzE4LDB4OTM3RSwweDkzNkMsMHg5MzVCLDB4OTM3MCwweDkzNUEsMHg5MzU0LDB4OTVDQSwvKiAweEU4LTB4RUYgKi8KKwkweDk1Q0IsMHg5NUNDLDB4OTVDOCwweDk1QzYsMHg5NkIxLDB4OTZCOCwweDk2RDYsMHg5NzFDLC8qIDB4RjAtMHhGNyAqLworCTB4OTcxRSwweDk3QTAsMHg5N0QzLDB4OTg0NiwweDk4QjYsMHg5OTM1LDB4OUEwMSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQzJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5OUZGLDB4OUJBRSwweDlCQUIsMHg5QkFBLDB4OUJBRCwweDlEM0IsMHg5RDNGLDB4OUU4QiwvKiAweDQwLTB4NDcgKi8KKwkweDlFQ0YsMHg5RURFLDB4OUVEQywweDlFREQsMHg5RURCLDB4OUYzRSwweDlGNEIsMHg1M0UyLC8qIDB4NDgtMHg0RiAqLworCTB4NTY5NSwweDU2QUUsMHg1OEQ5LDB4NThEOCwweDVCMzgsMHg1RjVELDB4NjFFMywweDYyMzMsLyogMHg1MC0weDU3ICovCisJMHg2NEY0LDB4NjRGMiwweDY0RkUsMHg2NTA2LDB4NjRGQSwweDY0RkIsMHg2NEY3LDB4NjVCNywvKiAweDU4LTB4NUYgKi8KKwkweDY2REMsMHg2NzI2LDB4NkFCMywweDZBQUMsMHg2QUMzLDB4NkFCQiwweDZBQjgsMHg2QUMyLC8qIDB4NjAtMHg2NyAqLworCTB4NkFBRSwweDZBQUYsMHg2QjVGLDB4NkI3OCwweDZCQUYsMHg3MDA5LDB4NzAwQiwweDZGRkUsLyogMHg2OC0weDZGICovCisJMHg3MDA2LDB4NkZGQSwweDcwMTEsMHg3MDBGLDB4NzFGQiwweDcxRkMsMHg3MUZFLDB4NzFGOCwvKiAweDcwLTB4NzcgKi8KKwkweDczNzcsMHg3Mzc1LDB4NzRBNywweDc0QkYsMHg3NTE1LDB4NzY1NiwweDc2NTgsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3NjUyLDB4NzdCRCwweDc3QkYsMHg3N0JCLDB4NzdCQywweDc5MEUsMHg3OUFFLC8qIDB4QTAtMHhBNyAqLworCTB4N0E2MSwweDdBNjIsMHg3QTYwLDB4N0FDNCwweDdBQzUsMHg3QzJCLDB4N0MyNywweDdDMkEsLyogMHhBOC0weEFGICovCisJMHg3QzFFLDB4N0MyMywweDdDMjEsMHg3Q0U3LDB4N0U1NCwweDdFNTUsMHg3RTVFLDB4N0U1QSwvKiAweEIwLTB4QjcgKi8KKwkweDdFNjEsMHg3RTUyLDB4N0U1OSwweDdGNDgsMHg3RkY5LDB4N0ZGQiwweDgwNzcsMHg4MDc2LC8qIDB4QjgtMHhCRiAqLworCTB4ODFDRCwweDgxQ0YsMHg4MjBBLDB4ODVDRiwweDg1QTksMHg4NUNELDB4ODVEMCwweDg1QzksLyogMHhDMC0weEM3ICovCisJMHg4NUIwLDB4ODVCQSwweDg1QjksMHg4NUE2LDB4ODdFRiwweDg3RUMsMHg4N0YyLDB4ODdFMCwvKiAweEM4LTB4Q0YgKi8KKwkweDg5ODYsMHg4OUIyLDB4ODlGNCwweDhCMjgsMHg4QjM5LDB4OEIyQywweDhCMkIsMHg4QzUwLC8qIDB4RDAtMHhENyAqLworCTB4OEQwNSwweDhFNTksMHg4RTYzLDB4OEU2NiwweDhFNjQsMHg4RTVGLDB4OEU1NSwweDhFQzAsLyogMHhEOC0weERGICovCisJMHg4RjQ5LDB4OEY0RCwweDkwODcsMHg5MDgzLDB4OTA4OCwweDkxQUIsMHg5MUFDLDB4OTFEMCwvKiAweEUwLTB4RTcgKi8KKwkweDkzOTQsMHg5MzhBLDB4OTM5NiwweDkzQTIsMHg5M0IzLDB4OTNBRSwweDkzQUMsMHg5M0IwLC8qIDB4RTgtMHhFRiAqLworCTB4OTM5OCwweDkzOUEsMHg5Mzk3LDB4OTVENCwweDk1RDYsMHg5NUQwLDB4OTVENSwweDk2RTIsLyogMHhGMC0weEY3ICovCisJMHg5NkRDLDB4OTZEOSwweDk2REIsMHg5NkRFLDB4OTcyNCwweDk3QTMsMHg5N0E2LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DM1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDk3QUQsMHg5N0Y5LDB4OTg0RCwweDk4NEYsMHg5ODRDLDB4OTg0RSwweDk4NTMsMHg5OEJBLC8qIDB4NDAtMHg0NyAqLworCTB4OTkzRSwweDk5M0YsMHg5OTNELDB4OTkyRSwweDk5QTUsMHg5QTBFLDB4OUFDMSwweDlCMDMsLyogMHg0OC0weDRGICovCisJMHg5QjA2LDB4OUI0RiwweDlCNEUsMHg5QjRELDB4OUJDQSwweDlCQzksMHg5QkZELDB4OUJDOCwvKiAweDUwLTB4NTcgKi8KKwkweDlCQzAsMHg5RDUxLDB4OUQ1RCwweDlENjAsMHg5RUUwLDB4OUYxNSwweDlGMkMsMHg1MTMzLC8qIDB4NTgtMHg1RiAqLworCTB4NTZBNSwweDU4REUsMHg1OERGLDB4NThFMiwweDVCRjUsMHg5RjkwLDB4NUVFQywweDYxRjIsLyogMHg2MC0weDY3ICovCisJMHg2MUY3LDB4NjFGNiwweDYxRjUsMHg2NTAwLDB4NjUwRiwweDY2RTAsMHg2NkRELDB4NkFFNSwvKiAweDY4LTB4NkYgKi8KKwkweDZBREQsMHg2QURBLDB4NkFEMywweDcwMUIsMHg3MDFGLDB4NzAyOCwweDcwMUEsMHg3MDFELC8qIDB4NzAtMHg3NyAqLworCTB4NzAxNSwweDcwMTgsMHg3MjA2LDB4NzIwRCwweDcyNTgsMHg3MkEyLDB4NzM3OCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDczN0EsMHg3NEJELDB4NzRDQSwweDc0RTMsMHg3NTg3LDB4NzU4NiwweDc2NUYsLyogMHhBMC0weEE3ICovCisJMHg3NjYxLDB4NzdDNywweDc5MTksMHg3OUIxLDB4N0E2QiwweDdBNjksMHg3QzNFLDB4N0MzRiwvKiAweEE4LTB4QUYgKi8KKwkweDdDMzgsMHg3QzNELDB4N0MzNywweDdDNDAsMHg3RTZCLDB4N0U2RCwweDdFNzksMHg3RTY5LC8qIDB4QjAtMHhCNyAqLworCTB4N0U2QSwweDdGODUsMHg3RTczLDB4N0ZCNiwweDdGQjksMHg3RkI4LDB4ODFEOCwweDg1RTksLyogMHhCOC0weEJGICovCisJMHg4NURELDB4ODVFQSwweDg1RDUsMHg4NUU0LDB4ODVFNSwweDg1RjcsMHg4N0ZCLDB4ODgwNSwvKiAweEMwLTB4QzcgKi8KKwkweDg4MEQsMHg4N0Y5LDB4ODdGRSwweDg5NjAsMHg4OTVGLDB4ODk1NiwweDg5NUUsMHg4QjQxLC8qIDB4QzgtMHhDRiAqLworCTB4OEI1QywweDhCNTgsMHg4QjQ5LDB4OEI1QSwweDhCNEUsMHg4QjRGLDB4OEI0NiwweDhCNTksLyogMHhEMC0weEQ3ICovCisJMHg4RDA4LDB4OEQwQSwweDhFN0MsMHg4RTcyLDB4OEU4NywweDhFNzYsMHg4RTZDLDB4OEU3QSwvKiAweEQ4LTB4REYgKi8KKwkweDhFNzQsMHg4RjU0LDB4OEY0RSwweDhGQUQsMHg5MDhBLDB4OTA4QiwweDkxQjEsMHg5MUFFLC8qIDB4RTAtMHhFNyAqLworCTB4OTNFMSwweDkzRDEsMHg5M0RGLDB4OTNDMywweDkzQzgsMHg5M0RDLDB4OTNERCwweDkzRDYsLyogMHhFOC0weEVGICovCisJMHg5M0UyLDB4OTNDRCwweDkzRDgsMHg5M0U0LDB4OTNENywweDkzRTgsMHg5NURDLDB4OTZCNCwvKiAweEYwLTB4RjcgKi8KKwkweDk2RTMsMHg5NzJBLDB4OTcyNywweDk3NjEsMHg5N0RDLDB4OTdGQiwweDk4NUUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0M0WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTg1OCwweDk4NUIsMHg5OEJDLDB4OTk0NSwweDk5NDksMHg5QTE2LDB4OUExOSwweDlCMEQsLyogMHg0MC0weDQ3ICovCisJMHg5QkU4LDB4OUJFNywweDlCRDYsMHg5QkRCLDB4OUQ4OSwweDlENjEsMHg5RDcyLDB4OUQ2QSwvKiAweDQ4LTB4NEYgKi8KKwkweDlENkMsMHg5RTkyLDB4OUU5NywweDlFOTMsMHg5RUI0LDB4NTJGOCwweDU2QTgsMHg1NkI3LC8qIDB4NTAtMHg1NyAqLworCTB4NTZCNiwweDU2QjQsMHg1NkJDLDB4NThFNCwweDVCNDAsMHg1QjQzLDB4NUI3RCwweDVCRjYsLyogMHg1OC0weDVGICovCisJMHg1REM5LDB4NjFGOCwweDYxRkEsMHg2NTE4LDB4NjUxNCwweDY1MTksMHg2NkU2LDB4NjcyNywvKiAweDYwLTB4NjcgKi8KKwkweDZBRUMsMHg3MDNFLDB4NzAzMCwweDcwMzIsMHg3MjEwLDB4NzM3QiwweDc0Q0YsMHg3NjYyLC8qIDB4NjgtMHg2RiAqLworCTB4NzY2NSwweDc5MjYsMHg3OTJBLDB4NzkyQywweDc5MkIsMHg3QUM3LDB4N0FGNiwweDdDNEMsLyogMHg3MC0weDc3ICovCisJMHg3QzQzLDB4N0M0RCwweDdDRUYsMHg3Q0YwLDB4OEZBRSwweDdFN0QsMHg3RTdDLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4N0U4MiwweDdGNEMsMHg4MDAwLDB4ODFEQSwweDgyNjYsMHg4NUZCLDB4ODVGOSwvKiAweEEwLTB4QTcgKi8KKwkweDg2MTEsMHg4NUZBLDB4ODYwNiwweDg2MEIsMHg4NjA3LDB4ODYwQSwweDg4MTQsMHg4ODE1LC8qIDB4QTgtMHhBRiAqLworCTB4ODk2NCwweDg5QkEsMHg4OUY4LDB4OEI3MCwweDhCNkMsMHg4QjY2LDB4OEI2RiwweDhCNUYsLyogMHhCMC0weEI3ICovCisJMHg4QjZCLDB4OEQwRiwweDhEMEQsMHg4RTg5LDB4OEU4MSwweDhFODUsMHg4RTgyLDB4OTFCNCwvKiAweEI4LTB4QkYgKi8KKwkweDkxQ0IsMHg5NDE4LDB4OTQwMywweDkzRkQsMHg5NUUxLDB4OTczMCwweDk4QzQsMHg5OTUyLC8qIDB4QzAtMHhDNyAqLworCTB4OTk1MSwweDk5QTgsMHg5QTJCLDB4OUEzMCwweDlBMzcsMHg5QTM1LDB4OUMxMywweDlDMEQsLyogMHhDOC0weENGICovCisJMHg5RTc5LDB4OUVCNSwweDlFRTgsMHg5RjJGLDB4OUY1RiwweDlGNjMsMHg5RjYxLDB4NTEzNywvKiAweEQwLTB4RDcgKi8KKwkweDUxMzgsMHg1NkMxLDB4NTZDMCwweDU2QzIsMHg1OTE0LDB4NUM2QywweDVEQ0QsMHg2MUZDLC8qIDB4RDgtMHhERiAqLworCTB4NjFGRSwweDY1MUQsMHg2NTFDLDB4NjU5NSwweDY2RTksMHg2QUZCLDB4NkIwNCwweDZBRkEsLyogMHhFMC0weEU3ICovCisJMHg2QkIyLDB4NzA0QywweDcyMUIsMHg3MkE3LDB4NzRENiwweDc0RDQsMHg3NjY5LDB4NzdEMywvKiAweEU4LTB4RUYgKi8KKwkweDdDNTAsMHg3RThGLDB4N0U4QywweDdGQkMsMHg4NjE3LDB4ODYyRCwweDg2MUEsMHg4ODIzLC8qIDB4RjAtMHhGNyAqLworCTB4ODgyMiwweDg4MjEsMHg4ODFGLDB4ODk2QSwweDg5NkMsMHg4OUJELDB4OEI3NCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQzVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4Qjc3LDB4OEI3RCwweDhEMTMsMHg4RThBLDB4OEU4RCwweDhFOEIsMHg4RjVGLDB4OEZBRiwvKiAweDQwLTB4NDcgKi8KKwkweDkxQkEsMHg5NDJFLDB4OTQzMywweDk0MzUsMHg5NDNBLDB4OTQzOCwweDk0MzIsMHg5NDJCLC8qIDB4NDgtMHg0RiAqLworCTB4OTVFMiwweDk3MzgsMHg5NzM5LDB4OTczMiwweDk3RkYsMHg5ODY3LDB4OTg2NSwweDk5NTcsLyogMHg1MC0weDU3ICovCisJMHg5QTQ1LDB4OUE0MywweDlBNDAsMHg5QTNFLDB4OUFDRiwweDlCNTQsMHg5QjUxLDB4OUMyRCwvKiAweDU4LTB4NUYgKi8KKwkweDlDMjUsMHg5REFGLDB4OURCNCwweDlEQzIsMHg5REI4LDB4OUU5RCwweDlFRUYsMHg5RjE5LC8qIDB4NjAtMHg2NyAqLworCTB4OUY1QywweDlGNjYsMHg5RjY3LDB4NTEzQywweDUxM0IsMHg1NkM4LDB4NTZDQSwweDU2QzksLyogMHg2OC0weDZGICovCisJMHg1QjdGLDB4NURENCwweDVERDIsMHg1RjRFLDB4NjFGRiwweDY1MjQsMHg2QjBBLDB4NkI2MSwvKiAweDcwLTB4NzcgKi8KKwkweDcwNTEsMHg3MDU4LDB4NzM4MCwweDc0RTQsMHg3NThBLDB4NzY2RSwweDc2NkMsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3OUIzLDB4N0M2MCwweDdDNUYsMHg4MDdFLDB4ODA3RCwweDgxREYsMHg4OTcyLC8qIDB4QTAtMHhBNyAqLworCTB4ODk2RiwweDg5RkMsMHg4QjgwLDB4OEQxNiwweDhEMTcsMHg4RTkxLDB4OEU5MywweDhGNjEsLyogMHhBOC0weEFGICovCisJMHg5MTQ4LDB4OTQ0NCwweDk0NTEsMHg5NDUyLDB4OTczRCwweDk3M0UsMHg5N0MzLDB4OTdDMSwvKiAweEIwLTB4QjcgKi8KKwkweDk4NkIsMHg5OTU1LDB4OUE1NSwweDlBNEQsMHg5QUQyLDB4OUIxQSwweDlDNDksMHg5QzMxLC8qIDB4QjgtMHhCRiAqLworCTB4OUMzRSwweDlDM0IsMHg5REQzLDB4OURENywweDlGMzQsMHg5RjZDLDB4OUY2QSwweDlGOTQsLyogMHhDMC0weEM3ICovCisJMHg1NkNDLDB4NURENiwweDYyMDAsMHg2NTIzLDB4NjUyQiwweDY1MkEsMHg2NkVDLDB4NkIxMCwvKiAweEM4LTB4Q0YgKi8KKwkweDc0REEsMHg3QUNBLDB4N0M2NCwweDdDNjMsMHg3QzY1LDB4N0U5MywweDdFOTYsMHg3RTk0LC8qIDB4RDAtMHhENyAqLworCTB4ODFFMiwweDg2MzgsMHg4NjNGLDB4ODgzMSwweDhCOEEsMHg5MDkwLDB4OTA4RiwweDk0NjMsLyogMHhEOC0weERGICovCisJMHg5NDYwLDB4OTQ2NCwweDk3NjgsMHg5ODZGLDB4OTk1QywweDlBNUEsMHg5QTVCLDB4OUE1NywvKiAweEUwLTB4RTcgKi8KKwkweDlBRDMsMHg5QUQ0LDB4OUFEMSwweDlDNTQsMHg5QzU3LDB4OUM1NiwweDlERTUsMHg5RTlGLC8qIDB4RTgtMHhFRiAqLworCTB4OUVGNCwweDU2RDEsMHg1OEU5LDB4NjUyQywweDcwNUUsMHg3NjcxLDB4NzY3MiwweDc3RDcsLyogMHhGMC0weEY3ICovCisJMHg3RjUwLDB4N0Y4OCwweDg4MzYsMHg4ODM5LDB4ODg2MiwweDhCOTMsMHg4QjkyLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DNlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDhCOTYsMHg4Mjc3LDB4OEQxQiwweDkxQzAsMHg5NDZBLDB4OTc0MiwweDk3NDgsMHg5NzQ0LC8qIDB4NDAtMHg0NyAqLworCTB4OTdDNiwweDk4NzAsMHg5QTVGLDB4OUIyMiwweDlCNTgsMHg5QzVGLDB4OURGOSwweDlERkEsLyogMHg0OC0weDRGICovCisJMHg5RTdDLDB4OUU3RCwweDlGMDcsMHg5Rjc3LDB4OUY3MiwweDVFRjMsMHg2QjE2LDB4NzA2MywvKiAweDUwLTB4NTcgKi8KKwkweDdDNkMsMHg3QzZFLDB4ODgzQiwweDg5QzAsMHg4RUExLDB4OTFDMSwweDk0NzIsMHg5NDcwLC8qIDB4NTgtMHg1RiAqLworCTB4OTg3MSwweDk5NUUsMHg5QUQ2LDB4OUIyMywweDlFQ0MsMHg3MDY0LDB4NzdEQSwweDhCOUEsLyogMHg2MC0weDY3ICovCisJMHg5NDc3LDB4OTdDOSwweDlBNjIsMHg5QTY1LDB4N0U5QywweDhCOUMsMHg4RUFBLDB4OTFDNSwvKiAweDY4LTB4NkYgKi8KKwkweDk0N0QsMHg5NDdFLDB4OTQ3QywweDlDNzcsMHg5Qzc4LDB4OUVGNywweDhDNTQsMHg5NDdGLC8qIDB4NzAtMHg3NyAqLworCTB4OUUxQSwweDcyMjgsMHg5QTZBLDB4OUIzMSwweDlFMUIsMHg5RTFFLDB4N0M3MiwweDAwMDAsLyogMHg3OC0weDdGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQzlbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg0RTQyLDB4NEU1QywweDUxRjUsMHg1MzFBLDB4NTM4MiwweDRFMDcsMHg0RTBDLDB4NEU0NywvKiAweDQwLTB4NDcgKi8KKwkweDRFOEQsMHg1NkQ3LDB4RkEwQywweDVDNkUsMHg1RjczLDB4NEUwRiwweDUxODcsMHg0RTBFLC8qIDB4NDgtMHg0RiAqLworCTB4NEUyRSwweDRFOTMsMHg0RUMyLDB4NEVDOSwweDRFQzgsMHg1MTk4LDB4NTJGQywweDUzNkMsLyogMHg1MC0weDU3ICovCisJMHg1M0I5LDB4NTcyMCwweDU5MDMsMHg1OTJDLDB4NUMxMCwweDVERkYsMHg2NUUxLDB4NkJCMywvKiAweDU4LTB4NUYgKi8KKwkweDZCQ0MsMHg2QzE0LDB4NzIzRiwweDRFMzEsMHg0RTNDLDB4NEVFOCwweDRFREMsMHg0RUU5LC8qIDB4NjAtMHg2NyAqLworCTB4NEVFMSwweDRFREQsMHg0RURBLDB4NTIwQywweDUzMUMsMHg1MzRDLDB4NTcyMiwweDU3MjMsLyogMHg2OC0weDZGICovCisJMHg1OTE3LDB4NTkyRiwweDVCODEsMHg1Qjg0LDB4NUMxMiwweDVDM0IsMHg1Qzc0LDB4NUM3MywvKiAweDcwLTB4NzcgKi8KKwkweDVFMDQsMHg1RTgwLDB4NUU4MiwweDVGQzksMHg2MjA5LDB4NjI1MCwweDZDMTUsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg2QzM2LDB4NkM0MywweDZDM0YsMHg2QzNCLDB4NzJBRSwweDcyQjAsMHg3MzhBLC8qIDB4QTAtMHhBNyAqLworCTB4NzlCOCwweDgwOEEsMHg5NjFFLDB4NEYwRSwweDRGMTgsMHg0RjJDLDB4NEVGNSwweDRGMTQsLyogMHhBOC0weEFGICovCisJMHg0RUYxLDB4NEYwMCwweDRFRjcsMHg0RjA4LDB4NEYxRCwweDRGMDIsMHg0RjA1LDB4NEYyMiwvKiAweEIwLTB4QjcgKi8KKwkweDRGMTMsMHg0RjA0LDB4NEVGNCwweDRGMTIsMHg1MUIxLDB4NTIxMywweDUyMDksMHg1MjEwLC8qIDB4QjgtMHhCRiAqLworCTB4NTJBNiwweDUzMjIsMHg1MzFGLDB4NTM0RCwweDUzOEEsMHg1NDA3LDB4NTZFMSwweDU2REYsLyogMHhDMC0weEM3ICovCisJMHg1NzJFLDB4NTcyQSwweDU3MzQsMHg1OTNDLDB4NTk4MCwweDU5N0MsMHg1OTg1LDB4NTk3QiwvKiAweEM4LTB4Q0YgKi8KKwkweDU5N0UsMHg1OTc3LDB4NTk3RiwweDVCNTYsMHg1QzE1LDB4NUMyNSwweDVDN0MsMHg1QzdBLC8qIDB4RDAtMHhENyAqLworCTB4NUM3QiwweDVDN0UsMHg1RERGLDB4NUU3NSwweDVFODQsMHg1RjAyLDB4NUYxQSwweDVGNzQsLyogMHhEOC0weERGICovCisJMHg1RkQ1LDB4NUZENCwweDVGQ0YsMHg2MjVDLDB4NjI1RSwweDYyNjQsMHg2MjYxLDB4NjI2NiwvKiAweEUwLTB4RTcgKi8KKwkweDYyNjIsMHg2MjU5LDB4NjI2MCwweDYyNUEsMHg2MjY1LDB4NjVFRiwweDY1RUUsMHg2NzNFLC8qIDB4RTgtMHhFRiAqLworCTB4NjczOSwweDY3MzgsMHg2NzNCLDB4NjczQSwweDY3M0YsMHg2NzNDLDB4NjczMywweDZDMTgsLyogMHhGMC0weEY3ICovCisJMHg2QzQ2LDB4NkM1MiwweDZDNUMsMHg2QzRGLDB4NkM0QSwweDZDNTQsMHg2QzRCLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DQVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDZDNEMsMHg3MDcxLDB4NzI1RSwweDcyQjQsMHg3MkI1LDB4NzM4RSwweDc1MkEsMHg3NjdGLC8qIDB4NDAtMHg0NyAqLworCTB4N0E3NSwweDdGNTEsMHg4Mjc4LDB4ODI3QywweDgyODAsMHg4MjdELDB4ODI3RiwweDg2NEQsLyogMHg0OC0weDRGICovCisJMHg4OTdFLDB4OTA5OSwweDkwOTcsMHg5MDk4LDB4OTA5QiwweDkwOTQsMHg5NjIyLDB4OTYyNCwvKiAweDUwLTB4NTcgKi8KKwkweDk2MjAsMHg5NjIzLDB4NEY1NiwweDRGM0IsMHg0RjYyLDB4NEY0OSwweDRGNTMsMHg0RjY0LC8qIDB4NTgtMHg1RiAqLworCTB4NEYzRSwweDRGNjcsMHg0RjUyLDB4NEY1RiwweDRGNDEsMHg0RjU4LDB4NEYyRCwweDRGMzMsLyogMHg2MC0weDY3ICovCisJMHg0RjNGLDB4NEY2MSwweDUxOEYsMHg1MUI5LDB4NTIxQywweDUyMUUsMHg1MjIxLDB4NTJBRCwvKiAweDY4LTB4NkYgKi8KKwkweDUyQUUsMHg1MzA5LDB4NTM2MywweDUzNzIsMHg1MzhFLDB4NTM4RiwweDU0MzAsMHg1NDM3LC8qIDB4NzAtMHg3NyAqLworCTB4NTQyQSwweDU0NTQsMHg1NDQ1LDB4NTQxOSwweDU0MUMsMHg1NDI1LDB4NTQxOCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDU0M0QsMHg1NDRGLDB4NTQ0MSwweDU0MjgsMHg1NDI0LDB4NTQ0NywweDU2RUUsLyogMHhBMC0weEE3ICovCisJMHg1NkU3LDB4NTZFNSwweDU3NDEsMHg1NzQ1LDB4NTc0QywweDU3NDksMHg1NzRCLDB4NTc1MiwvKiAweEE4LTB4QUYgKi8KKwkweDU5MDYsMHg1OTQwLDB4NTlBNiwweDU5OTgsMHg1OUEwLDB4NTk5NywweDU5OEUsMHg1OUEyLC8qIDB4QjAtMHhCNyAqLworCTB4NTk5MCwweDU5OEYsMHg1OUE3LDB4NTlBMSwweDVCOEUsMHg1QjkyLDB4NUMyOCwweDVDMkEsLyogMHhCOC0weEJGICovCisJMHg1QzhELDB4NUM4RiwweDVDODgsMHg1QzhCLDB4NUM4OSwweDVDOTIsMHg1QzhBLDB4NUM4NiwvKiAweEMwLTB4QzcgKi8KKwkweDVDOTMsMHg1Qzk1LDB4NURFMCwweDVFMEEsMHg1RTBFLDB4NUU4QiwweDVFODksMHg1RThDLC8qIDB4QzgtMHhDRiAqLworCTB4NUU4OCwweDVFOEQsMHg1RjA1LDB4NUYxRCwweDVGNzgsMHg1Rjc2LDB4NUZEMiwweDVGRDEsLyogMHhEMC0weEQ3ICovCisJMHg1RkQwLDB4NUZFRCwweDVGRTgsMHg1RkVFLDB4NUZGMywweDVGRTEsMHg1RkU0LDB4NUZFMywvKiAweEQ4LTB4REYgKi8KKwkweDVGRkEsMHg1RkVGLDB4NUZGNywweDVGRkIsMHg2MDAwLDB4NUZGNCwweDYyM0EsMHg2MjgzLC8qIDB4RTAtMHhFNyAqLworCTB4NjI4QywweDYyOEUsMHg2MjhGLDB4NjI5NCwweDYyODcsMHg2MjcxLDB4NjI3QiwweDYyN0EsLyogMHhFOC0weEVGICovCisJMHg2MjcwLDB4NjI4MSwweDYyODgsMHg2Mjc3LDB4NjI3RCwweDYyNzIsMHg2Mjc0LDB4NjUzNywvKiAweEYwLTB4RjcgKi8KKwkweDY1RjAsMHg2NUY0LDB4NjVGMywweDY1RjIsMHg2NUY1LDB4Njc0NSwweDY3NDcsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0NCWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4Njc1OSwweDY3NTUsMHg2NzRDLDB4Njc0OCwweDY3NUQsMHg2NzRELDB4Njc1QSwweDY3NEIsLyogMHg0MC0weDQ3ICovCisJMHg2QkQwLDB4NkMxOSwweDZDMUEsMHg2Qzc4LDB4NkM2NywweDZDNkIsMHg2Qzg0LDB4NkM4QiwvKiAweDQ4LTB4NEYgKi8KKwkweDZDOEYsMHg2QzcxLDB4NkM2RiwweDZDNjksMHg2QzlBLDB4NkM2RCwweDZDODcsMHg2Qzk1LC8qIDB4NTAtMHg1NyAqLworCTB4NkM5QywweDZDNjYsMHg2QzczLDB4NkM2NSwweDZDN0IsMHg2QzhFLDB4NzA3NCwweDcwN0EsLyogMHg1OC0weDVGICovCisJMHg3MjYzLDB4NzJCRiwweDcyQkQsMHg3MkMzLDB4NzJDNiwweDcyQzEsMHg3MkJBLDB4NzJDNSwvKiAweDYwLTB4NjcgKi8KKwkweDczOTUsMHg3Mzk3LDB4NzM5MywweDczOTQsMHg3MzkyLDB4NzUzQSwweDc1MzksMHg3NTk0LC8qIDB4NjgtMHg2RiAqLworCTB4NzU5NSwweDc2ODEsMHg3OTNELDB4ODAzNCwweDgwOTUsMHg4MDk5LDB4ODA5MCwweDgwOTIsLyogMHg3MC0weDc3ICovCisJMHg4MDlDLDB4ODI5MCwweDgyOEYsMHg4Mjg1LDB4ODI4RSwweDgyOTEsMHg4MjkzLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4ODI4QSwweDgyODMsMHg4Mjg0LDB4OEM3OCwweDhGQzksMHg4RkJGLDB4OTA5RiwvKiAweEEwLTB4QTcgKi8KKwkweDkwQTEsMHg5MEE1LDB4OTA5RSwweDkwQTcsMHg5MEEwLDB4OTYzMCwweDk2MjgsMHg5NjJGLC8qIDB4QTgtMHhBRiAqLworCTB4OTYyRCwweDRFMzMsMHg0Rjk4LDB4NEY3QywweDRGODUsMHg0RjdELDB4NEY4MCwweDRGODcsLyogMHhCMC0weEI3ICovCisJMHg0Rjc2LDB4NEY3NCwweDRGODksMHg0Rjg0LDB4NEY3NywweDRGNEMsMHg0Rjk3LDB4NEY2QSwvKiAweEI4LTB4QkYgKi8KKwkweDRGOUEsMHg0Rjc5LDB4NEY4MSwweDRGNzgsMHg0RjkwLDB4NEY5QywweDRGOTQsMHg0RjlFLC8qIDB4QzAtMHhDNyAqLworCTB4NEY5MiwweDRGODIsMHg0Rjk1LDB4NEY2QiwweDRGNkUsMHg1MTlFLDB4NTFCQywweDUxQkUsLyogMHhDOC0weENGICovCisJMHg1MjM1LDB4NTIzMiwweDUyMzMsMHg1MjQ2LDB4NTIzMSwweDUyQkMsMHg1MzBBLDB4NTMwQiwvKiAweEQwLTB4RDcgKi8KKwkweDUzM0MsMHg1MzkyLDB4NTM5NCwweDU0ODcsMHg1NDdGLDB4NTQ4MSwweDU0OTEsMHg1NDgyLC8qIDB4RDgtMHhERiAqLworCTB4NTQ4OCwweDU0NkIsMHg1NDdBLDB4NTQ3RSwweDU0NjUsMHg1NDZDLDB4NTQ3NCwweDU0NjYsLyogMHhFMC0weEU3ICovCisJMHg1NDhELDB4NTQ2RiwweDU0NjEsMHg1NDYwLDB4NTQ5OCwweDU0NjMsMHg1NDY3LDB4NTQ2NCwvKiAweEU4LTB4RUYgKi8KKwkweDU2RjcsMHg1NkY5LDB4NTc2RiwweDU3NzIsMHg1NzZELDB4NTc2QiwweDU3NzEsMHg1NzcwLC8qIDB4RjAtMHhGNyAqLworCTB4NTc3NiwweDU3ODAsMHg1Nzc1LDB4NTc3QiwweDU3NzMsMHg1Nzc0LDB4NTc2MiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQ0NbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1NzY4LDB4NTc3RCwweDU5MEMsMHg1OTQ1LDB4NTlCNSwweDU5QkEsMHg1OUNGLDB4NTlDRSwvKiAweDQwLTB4NDcgKi8KKwkweDU5QjIsMHg1OUNDLDB4NTlDMSwweDU5QjYsMHg1OUJDLDB4NTlDMywweDU5RDYsMHg1OUIxLC8qIDB4NDgtMHg0RiAqLworCTB4NTlCRCwweDU5QzAsMHg1OUM4LDB4NTlCNCwweDU5QzcsMHg1QjYyLDB4NUI2NSwweDVCOTMsLyogMHg1MC0weDU3ICovCisJMHg1Qjk1LDB4NUM0NCwweDVDNDcsMHg1Q0FFLDB4NUNBNCwweDVDQTAsMHg1Q0I1LDB4NUNBRiwvKiAweDU4LTB4NUYgKi8KKwkweDVDQTgsMHg1Q0FDLDB4NUM5RiwweDVDQTMsMHg1Q0FELDB4NUNBMiwweDVDQUEsMHg1Q0E3LC8qIDB4NjAtMHg2NyAqLworCTB4NUM5RCwweDVDQTUsMHg1Q0I2LDB4NUNCMCwweDVDQTYsMHg1RTE3LDB4NUUxNCwweDVFMTksLyogMHg2OC0weDZGICovCisJMHg1RjI4LDB4NUYyMiwweDVGMjMsMHg1RjI0LDB4NUY1NCwweDVGODIsMHg1RjdFLDB4NUY3RCwvKiAweDcwLTB4NzcgKi8KKwkweDVGREUsMHg1RkU1LDB4NjAyRCwweDYwMjYsMHg2MDE5LDB4NjAzMiwweDYwMEIsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg2MDM0LDB4NjAwQSwweDYwMTcsMHg2MDMzLDB4NjAxQSwweDYwMUUsMHg2MDJDLC8qIDB4QTAtMHhBNyAqLworCTB4NjAyMiwweDYwMEQsMHg2MDEwLDB4NjAyRSwweDYwMTMsMHg2MDExLDB4NjAwQywweDYwMDksLyogMHhBOC0weEFGICovCisJMHg2MDFDLDB4NjIxNCwweDYyM0QsMHg2MkFELDB4NjJCNCwweDYyRDEsMHg2MkJFLDB4NjJBQSwvKiAweEIwLTB4QjcgKi8KKwkweDYyQjYsMHg2MkNBLDB4NjJBRSwweDYyQjMsMHg2MkFGLDB4NjJCQiwweDYyQTksMHg2MkIwLC8qIDB4QjgtMHhCRiAqLworCTB4NjJCOCwweDY1M0QsMHg2NUE4LDB4NjVCQiwweDY2MDksMHg2NUZDLDB4NjYwNCwweDY2MTIsLyogMHhDMC0weEM3ICovCisJMHg2NjA4LDB4NjVGQiwweDY2MDMsMHg2NjBCLDB4NjYwRCwweDY2MDUsMHg2NUZELDB4NjYxMSwvKiAweEM4LTB4Q0YgKi8KKwkweDY2MTAsMHg2NkY2LDB4NjcwQSwweDY3ODUsMHg2NzZDLDB4Njc4RSwweDY3OTIsMHg2Nzc2LC8qIDB4RDAtMHhENyAqLworCTB4Njc3QiwweDY3OTgsMHg2Nzg2LDB4Njc4NCwweDY3NzQsMHg2NzhELDB4Njc4QywweDY3N0EsLyogMHhEOC0weERGICovCisJMHg2NzlGLDB4Njc5MSwweDY3OTksMHg2NzgzLDB4Njc3RCwweDY3ODEsMHg2Nzc4LDB4Njc3OSwvKiAweEUwLTB4RTcgKi8KKwkweDY3OTQsMHg2QjI1LDB4NkI4MCwweDZCN0UsMHg2QkRFLDB4NkMxRCwweDZDOTMsMHg2Q0VDLC8qIDB4RTgtMHhFRiAqLworCTB4NkNFQiwweDZDRUUsMHg2Q0Q5LDB4NkNCNiwweDZDRDQsMHg2Q0FELDB4NkNFNywweDZDQjcsLyogMHhGMC0weEY3ICovCisJMHg2Q0QwLDB4NkNDMiwweDZDQkEsMHg2Q0MzLDB4NkNDNiwweDZDRUQsMHg2Q0YyLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DRFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDZDRDIsMHg2Q0RELDB4NkNCNCwweDZDOEEsMHg2QzlELDB4NkM4MCwweDZDREUsMHg2Q0MwLC8qIDB4NDAtMHg0NyAqLworCTB4NkQzMCwweDZDQ0QsMHg2Q0M3LDB4NkNCMCwweDZDRjksMHg2Q0NGLDB4NkNFOSwweDZDRDEsLyogMHg0OC0weDRGICovCisJMHg3MDk0LDB4NzA5OCwweDcwODUsMHg3MDkzLDB4NzA4NiwweDcwODQsMHg3MDkxLDB4NzA5NiwvKiAweDUwLTB4NTcgKi8KKwkweDcwODIsMHg3MDlBLDB4NzA4MywweDcyNkEsMHg3MkQ2LDB4NzJDQiwweDcyRDgsMHg3MkM5LC8qIDB4NTgtMHg1RiAqLworCTB4NzJEQywweDcyRDIsMHg3MkQ0LDB4NzJEQSwweDcyQ0MsMHg3MkQxLDB4NzNBNCwweDczQTEsLyogMHg2MC0weDY3ICovCisJMHg3M0FELDB4NzNBNiwweDczQTIsMHg3M0EwLDB4NzNBQywweDczOUQsMHg3NERELDB4NzRFOCwvKiAweDY4LTB4NkYgKi8KKwkweDc1M0YsMHg3NTQwLDB4NzUzRSwweDc1OEMsMHg3NTk4LDB4NzZBRiwweDc2RjMsMHg3NkYxLC8qIDB4NzAtMHg3NyAqLworCTB4NzZGMCwweDc2RjUsMHg3N0Y4LDB4NzdGQywweDc3RjksMHg3N0ZCLDB4NzdGQSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDc3RjcsMHg3OTQyLDB4NzkzRiwweDc5QzUsMHg3QTc4LDB4N0E3QiwweDdBRkIsLyogMHhBMC0weEE3ICovCisJMHg3Qzc1LDB4N0NGRCwweDgwMzUsMHg4MDhGLDB4ODBBRSwweDgwQTMsMHg4MEI4LDB4ODBCNSwvKiAweEE4LTB4QUYgKi8KKwkweDgwQUQsMHg4MjIwLDB4ODJBMCwweDgyQzAsMHg4MkFCLDB4ODI5QSwweDgyOTgsMHg4MjlCLC8qIDB4QjAtMHhCNyAqLworCTB4ODJCNSwweDgyQTcsMHg4MkFFLDB4ODJCQywweDgyOUUsMHg4MkJBLDB4ODJCNCwweDgyQTgsLyogMHhCOC0weEJGICovCisJMHg4MkExLDB4ODJBOSwweDgyQzIsMHg4MkE0LDB4ODJDMywweDgyQjYsMHg4MkEyLDB4ODY3MCwvKiAweEMwLTB4QzcgKi8KKwkweDg2NkYsMHg4NjZELDB4ODY2RSwweDhDNTYsMHg4RkQyLDB4OEZDQiwweDhGRDMsMHg4RkNELC8qIDB4QzgtMHhDRiAqLworCTB4OEZENiwweDhGRDUsMHg4RkQ3LDB4OTBCMiwweDkwQjQsMHg5MEFGLDB4OTBCMywweDkwQjAsLyogMHhEMC0weEQ3ICovCisJMHg5NjM5LDB4OTYzRCwweDk2M0MsMHg5NjNBLDB4OTY0MywweDRGQ0QsMHg0RkM1LDB4NEZEMywvKiAweEQ4LTB4REYgKi8KKwkweDRGQjIsMHg0RkM5LDB4NEZDQiwweDRGQzEsMHg0RkQ0LDB4NEZEQywweDRGRDksMHg0RkJCLC8qIDB4RTAtMHhFNyAqLworCTB4NEZCMywweDRGREIsMHg0RkM3LDB4NEZENiwweDRGQkEsMHg0RkMwLDB4NEZCOSwweDRGRUMsLyogMHhFOC0weEVGICovCisJMHg1MjQ0LDB4NTI0OSwweDUyQzAsMHg1MkMyLDB4NTMzRCwweDUzN0MsMHg1Mzk3LDB4NTM5NiwvKiAweEYwLTB4RjcgKi8KKwkweDUzOTksMHg1Mzk4LDB4NTRCQSwweDU0QTEsMHg1NEFELDB4NTRBNSwweDU0Q0YsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0NFWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NTRDMywweDgzMEQsMHg1NEI3LDB4NTRBRSwweDU0RDYsMHg1NEI2LDB4NTRDNSwweDU0QzYsLyogMHg0MC0weDQ3ICovCisJMHg1NEEwLDB4NTQ3MCwweDU0QkMsMHg1NEEyLDB4NTRCRSwweDU0NzIsMHg1NERFLDB4NTRCMCwvKiAweDQ4LTB4NEYgKi8KKwkweDU3QjUsMHg1NzlFLDB4NTc5RiwweDU3QTQsMHg1NzhDLDB4NTc5NywweDU3OUQsMHg1NzlCLC8qIDB4NTAtMHg1NyAqLworCTB4NTc5NCwweDU3OTgsMHg1NzhGLDB4NTc5OSwweDU3QTUsMHg1NzlBLDB4NTc5NSwweDU4RjQsLyogMHg1OC0weDVGICovCisJMHg1OTBELDB4NTk1MywweDU5RTEsMHg1OURFLDB4NTlFRSwweDVBMDAsMHg1OUYxLDB4NTlERCwvKiAweDYwLTB4NjcgKi8KKwkweDU5RkEsMHg1OUZELDB4NTlGQywweDU5RjYsMHg1OUU0LDB4NTlGMiwweDU5RjcsMHg1OURCLC8qIDB4NjgtMHg2RiAqLworCTB4NTlFOSwweDU5RjMsMHg1OUY1LDB4NTlFMCwweDU5RkUsMHg1OUY0LDB4NTlFRCwweDVCQTgsLyogMHg3MC0weDc3ICovCisJMHg1QzRDLDB4NUNEMCwweDVDRDgsMHg1Q0NDLDB4NUNENywweDVDQ0IsMHg1Q0RCLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NUNERSwweDVDREEsMHg1Q0M5LDB4NUNDNywweDVDQ0EsMHg1Q0Q2LDB4NUNEMywvKiAweEEwLTB4QTcgKi8KKwkweDVDRDQsMHg1Q0NGLDB4NUNDOCwweDVDQzYsMHg1Q0NFLDB4NUNERiwweDVDRjgsMHg1REY5LC8qIDB4QTgtMHhBRiAqLworCTB4NUUyMSwweDVFMjIsMHg1RTIzLDB4NUUyMCwweDVFMjQsMHg1RUIwLDB4NUVBNCwweDVFQTIsLyogMHhCMC0weEI3ICovCisJMHg1RTlCLDB4NUVBMywweDVFQTUsMHg1RjA3LDB4NUYyRSwweDVGNTYsMHg1Rjg2LDB4NjAzNywvKiAweEI4LTB4QkYgKi8KKwkweDYwMzksMHg2MDU0LDB4NjA3MiwweDYwNUUsMHg2MDQ1LDB4NjA1MywweDYwNDcsMHg2MDQ5LC8qIDB4QzAtMHhDNyAqLworCTB4NjA1QiwweDYwNEMsMHg2MDQwLDB4NjA0MiwweDYwNUYsMHg2MDI0LDB4NjA0NCwweDYwNTgsLyogMHhDOC0weENGICovCisJMHg2MDY2LDB4NjA2RSwweDYyNDIsMHg2MjQzLDB4NjJDRiwweDYzMEQsMHg2MzBCLDB4NjJGNSwvKiAweEQwLTB4RDcgKi8KKwkweDYzMEUsMHg2MzAzLDB4NjJFQiwweDYyRjksMHg2MzBGLDB4NjMwQywweDYyRjgsMHg2MkY2LC8qIDB4RDgtMHhERiAqLworCTB4NjMwMCwweDYzMTMsMHg2MzE0LDB4NjJGQSwweDYzMTUsMHg2MkZCLDB4NjJGMCwweDY1NDEsLyogMHhFMC0weEU3ICovCisJMHg2NTQzLDB4NjVBQSwweDY1QkYsMHg2NjM2LDB4NjYyMSwweDY2MzIsMHg2NjM1LDB4NjYxQywvKiAweEU4LTB4RUYgKi8KKwkweDY2MjYsMHg2NjIyLDB4NjYzMywweDY2MkIsMHg2NjNBLDB4NjYxRCwweDY2MzQsMHg2NjM5LC8qIDB4RjAtMHhGNyAqLworCTB4NjYyRSwweDY3MEYsMHg2NzEwLDB4NjdDMSwweDY3RjIsMHg2N0M4LDB4NjdCQSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQ0ZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2N0RDLDB4NjdCQiwweDY3RjgsMHg2N0Q4LDB4NjdDMCwweDY3QjcsMHg2N0M1LDB4NjdFQiwvKiAweDQwLTB4NDcgKi8KKwkweDY3RTQsMHg2N0RGLDB4NjdCNSwweDY3Q0QsMHg2N0IzLDB4NjdGNywweDY3RjYsMHg2N0VFLC8qIDB4NDgtMHg0RiAqLworCTB4NjdFMywweDY3QzIsMHg2N0I5LDB4NjdDRSwweDY3RTcsMHg2N0YwLDB4NjdCMiwweDY3RkMsLyogMHg1MC0weDU3ICovCisJMHg2N0M2LDB4NjdFRCwweDY3Q0MsMHg2N0FFLDB4NjdFNiwweDY3REIsMHg2N0ZBLDB4NjdDOSwvKiAweDU4LTB4NUYgKi8KKwkweDY3Q0EsMHg2N0MzLDB4NjdFQSwweDY3Q0IsMHg2QjI4LDB4NkI4MiwweDZCODQsMHg2QkI2LC8qIDB4NjAtMHg2NyAqLworCTB4NkJENiwweDZCRDgsMHg2QkUwLDB4NkMyMCwweDZDMjEsMHg2RDI4LDB4NkQzNCwweDZEMkQsLyogMHg2OC0weDZGICovCisJMHg2RDFGLDB4NkQzQywweDZEM0YsMHg2RDEyLDB4NkQwQSwweDZDREEsMHg2RDMzLDB4NkQwNCwvKiAweDcwLTB4NzcgKi8KKwkweDZEMTksMHg2RDNBLDB4NkQxQSwweDZEMTEsMHg2RDAwLDB4NkQxRCwweDZENDIsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg2RDAxLDB4NkQxOCwweDZEMzcsMHg2RDAzLDB4NkQwRiwweDZENDAsMHg2RDA3LC8qIDB4QTAtMHhBNyAqLworCTB4NkQyMCwweDZEMkMsMHg2RDA4LDB4NkQyMiwweDZEMDksMHg2RDEwLDB4NzBCNywweDcwOUYsLyogMHhBOC0weEFGICovCisJMHg3MEJFLDB4NzBCMSwweDcwQjAsMHg3MEExLDB4NzBCNCwweDcwQjUsMHg3MEE5LDB4NzI0MSwvKiAweEIwLTB4QjcgKi8KKwkweDcyNDksMHg3MjRBLDB4NzI2QywweDcyNzAsMHg3MjczLDB4NzI2RSwweDcyQ0EsMHg3MkU0LC8qIDB4QjgtMHhCRiAqLworCTB4NzJFOCwweDcyRUIsMHg3MkRGLDB4NzJFQSwweDcyRTYsMHg3MkUzLDB4NzM4NSwweDczQ0MsLyogMHhDMC0weEM3ICovCisJMHg3M0MyLDB4NzNDOCwweDczQzUsMHg3M0I5LDB4NzNCNiwweDczQjUsMHg3M0I0LDB4NzNFQiwvKiAweEM4LTB4Q0YgKi8KKwkweDczQkYsMHg3M0M3LDB4NzNCRSwweDczQzMsMHg3M0M2LDB4NzNCOCwweDczQ0IsMHg3NEVDLC8qIDB4RDAtMHhENyAqLworCTB4NzRFRSwweDc1MkUsMHg3NTQ3LDB4NzU0OCwweDc1QTcsMHg3NUFBLDB4NzY3OSwweDc2QzQsLyogMHhEOC0weERGICovCisJMHg3NzA4LDB4NzcwMywweDc3MDQsMHg3NzA1LDB4NzcwQSwweDc2RjcsMHg3NkZCLDB4NzZGQSwvKiAweEUwLTB4RTcgKi8KKwkweDc3RTcsMHg3N0U4LDB4NzgwNiwweDc4MTEsMHg3ODEyLDB4NzgwNSwweDc4MTAsMHg3ODBGLC8qIDB4RTgtMHhFRiAqLworCTB4NzgwRSwweDc4MDksMHg3ODAzLDB4NzgxMywweDc5NEEsMHg3OTRDLDB4Nzk0QiwweDc5NDUsLyogMHhGMC0weEY3ICovCisJMHg3OTQ0LDB4NzlENSwweDc5Q0QsMHg3OUNGLDB4NzlENiwweDc5Q0UsMHg3QTgwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EMFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDdBN0UsMHg3QUQxLDB4N0IwMCwweDdCMDEsMHg3QzdBLDB4N0M3OCwweDdDNzksMHg3QzdGLC8qIDB4NDAtMHg0NyAqLworCTB4N0M4MCwweDdDODEsMHg3RDAzLDB4N0QwOCwweDdEMDEsMHg3RjU4LDB4N0Y5MSwweDdGOEQsLyogMHg0OC0weDRGICovCisJMHg3RkJFLDB4ODAwNywweDgwMEUsMHg4MDBGLDB4ODAxNCwweDgwMzcsMHg4MEQ4LDB4ODBDNywvKiAweDUwLTB4NTcgKi8KKwkweDgwRTAsMHg4MEQxLDB4ODBDOCwweDgwQzIsMHg4MEQwLDB4ODBDNSwweDgwRTMsMHg4MEQ5LC8qIDB4NTgtMHg1RiAqLworCTB4ODBEQywweDgwQ0EsMHg4MEQ1LDB4ODBDOSwweDgwQ0YsMHg4MEQ3LDB4ODBFNiwweDgwQ0QsLyogMHg2MC0weDY3ICovCisJMHg4MUZGLDB4ODIyMSwweDgyOTQsMHg4MkQ5LDB4ODJGRSwweDgyRjksMHg4MzA3LDB4ODJFOCwvKiAweDY4LTB4NkYgKi8KKwkweDgzMDAsMHg4MkQ1LDB4ODMzQSwweDgyRUIsMHg4MkQ2LDB4ODJGNCwweDgyRUMsMHg4MkUxLC8qIDB4NzAtMHg3NyAqLworCTB4ODJGMiwweDgyRjUsMHg4MzBDLDB4ODJGQiwweDgyRjYsMHg4MkYwLDB4ODJFQSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDgyRTQsMHg4MkUwLDB4ODJGQSwweDgyRjMsMHg4MkVELDB4ODY3NywweDg2NzQsLyogMHhBMC0weEE3ICovCisJMHg4NjdDLDB4ODY3MywweDg4NDEsMHg4ODRFLDB4ODg2NywweDg4NkEsMHg4ODY5LDB4ODlEMywvKiAweEE4LTB4QUYgKi8KKwkweDhBMDQsMHg4QTA3LDB4OEQ3MiwweDhGRTMsMHg4RkUxLDB4OEZFRSwweDhGRTAsMHg5MEYxLC8qIDB4QjAtMHhCNyAqLworCTB4OTBCRCwweDkwQkYsMHg5MEQ1LDB4OTBDNSwweDkwQkUsMHg5MEM3LDB4OTBDQiwweDkwQzgsLyogMHhCOC0weEJGICovCisJMHg5MUQ0LDB4OTFEMywweDk2NTQsMHg5NjRGLDB4OTY1MSwweDk2NTMsMHg5NjRBLDB4OTY0RSwvKiAweEMwLTB4QzcgKi8KKwkweDUwMUUsMHg1MDA1LDB4NTAwNywweDUwMTMsMHg1MDIyLDB4NTAzMCwweDUwMUIsMHg0RkY1LC8qIDB4QzgtMHhDRiAqLworCTB4NEZGNCwweDUwMzMsMHg1MDM3LDB4NTAyQywweDRGRjYsMHg0RkY3LDB4NTAxNywweDUwMUMsLyogMHhEMC0weEQ3ICovCisJMHg1MDIwLDB4NTAyNywweDUwMzUsMHg1MDJGLDB4NTAzMSwweDUwMEUsMHg1MTVBLDB4NTE5NCwvKiAweEQ4LTB4REYgKi8KKwkweDUxOTMsMHg1MUNBLDB4NTFDNCwweDUxQzUsMHg1MUM4LDB4NTFDRSwweDUyNjEsMHg1MjVBLC8qIDB4RTAtMHhFNyAqLworCTB4NTI1MiwweDUyNUUsMHg1MjVGLDB4NTI1NSwweDUyNjIsMHg1MkNELDB4NTMwRSwweDUzOUUsLyogMHhFOC0weEVGICovCisJMHg1NTI2LDB4NTRFMiwweDU1MTcsMHg1NTEyLDB4NTRFNywweDU0RjMsMHg1NEU0LDB4NTUxQSwvKiAweEYwLTB4RjcgKi8KKwkweDU0RkYsMHg1NTA0LDB4NTUwOCwweDU0RUIsMHg1NTExLDB4NTUwNSwweDU0RjEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0QxWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NTUwQSwweDU0RkIsMHg1NEY3LDB4NTRGOCwweDU0RTAsMHg1NTBFLDB4NTUwMywweDU1MEIsLyogMHg0MC0weDQ3ICovCisJMHg1NzAxLDB4NTcwMiwweDU3Q0MsMHg1ODMyLDB4NTdENSwweDU3RDIsMHg1N0JBLDB4NTdDNiwvKiAweDQ4LTB4NEYgKi8KKwkweDU3QkQsMHg1N0JDLDB4NTdCOCwweDU3QjYsMHg1N0JGLDB4NTdDNywweDU3RDAsMHg1N0I5LC8qIDB4NTAtMHg1NyAqLworCTB4NTdDMSwweDU5MEUsMHg1OTRBLDB4NUExOSwweDVBMTYsMHg1QTJELDB4NUEyRSwweDVBMTUsLyogMHg1OC0weDVGICovCisJMHg1QTBGLDB4NUExNywweDVBMEEsMHg1QTFFLDB4NUEzMywweDVCNkMsMHg1QkE3LDB4NUJBRCwvKiAweDYwLTB4NjcgKi8KKwkweDVCQUMsMHg1QzAzLDB4NUM1NiwweDVDNTQsMHg1Q0VDLDB4NUNGRiwweDVDRUUsMHg1Q0YxLC8qIDB4NjgtMHg2RiAqLworCTB4NUNGNywweDVEMDAsMHg1Q0Y5LDB4NUUyOSwweDVFMjgsMHg1RUE4LDB4NUVBRSwweDVFQUEsLyogMHg3MC0weDc3ICovCisJMHg1RUFDLDB4NUYzMywweDVGMzAsMHg1RjY3LDB4NjA1RCwweDYwNUEsMHg2MDY3LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NjA0MSwweDYwQTIsMHg2MDg4LDB4NjA4MCwweDYwOTIsMHg2MDgxLDB4NjA5RCwvKiAweEEwLTB4QTcgKi8KKwkweDYwODMsMHg2MDk1LDB4NjA5QiwweDYwOTcsMHg2MDg3LDB4NjA5QywweDYwOEUsMHg2MjE5LC8qIDB4QTgtMHhBRiAqLworCTB4NjI0NiwweDYyRjIsMHg2MzEwLDB4NjM1NiwweDYzMkMsMHg2MzQ0LDB4NjM0NSwweDYzMzYsLyogMHhCMC0weEI3ICovCisJMHg2MzQzLDB4NjNFNCwweDYzMzksMHg2MzRCLDB4NjM0QSwweDYzM0MsMHg2MzI5LDB4NjM0MSwvKiAweEI4LTB4QkYgKi8KKwkweDYzMzQsMHg2MzU4LDB4NjM1NCwweDYzNTksMHg2MzJELDB4NjM0NywweDYzMzMsMHg2MzVBLC8qIDB4QzAtMHhDNyAqLworCTB4NjM1MSwweDYzMzgsMHg2MzU3LDB4NjM0MCwweDYzNDgsMHg2NTRBLDB4NjU0NiwweDY1QzYsLyogMHhDOC0weENGICovCisJMHg2NUMzLDB4NjVDNCwweDY1QzIsMHg2NjRBLDB4NjY1RiwweDY2NDcsMHg2NjUxLDB4NjcxMiwvKiAweEQwLTB4RDcgKi8KKwkweDY3MTMsMHg2ODFGLDB4NjgxQSwweDY4NDksMHg2ODMyLDB4NjgzMywweDY4M0IsMHg2ODRCLC8qIDB4RDgtMHhERiAqLworCTB4Njg0RiwweDY4MTYsMHg2ODMxLDB4NjgxQywweDY4MzUsMHg2ODJCLDB4NjgyRCwweDY4MkYsLyogMHhFMC0weEU3ICovCisJMHg2ODRFLDB4Njg0NCwweDY4MzQsMHg2ODFELDB4NjgxMiwweDY4MTQsMHg2ODI2LDB4NjgyOCwvKiAweEU4LTB4RUYgKi8KKwkweDY4MkUsMHg2ODRELDB4NjgzQSwweDY4MjUsMHg2ODIwLDB4NkIyQywweDZCMkYsMHg2QjJELC8qIDB4RjAtMHhGNyAqLworCTB4NkIzMSwweDZCMzQsMHg2QjZELDB4ODA4MiwweDZCODgsMHg2QkU2LDB4NkJFNCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRDJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2QkU4LDB4NkJFMywweDZCRTIsMHg2QkU3LDB4NkMyNSwweDZEN0EsMHg2RDYzLDB4NkQ2NCwvKiAweDQwLTB4NDcgKi8KKwkweDZENzYsMHg2RDBELDB4NkQ2MSwweDZEOTIsMHg2RDU4LDB4NkQ2MiwweDZENkQsMHg2RDZGLC8qIDB4NDgtMHg0RiAqLworCTB4NkQ5MSwweDZEOEQsMHg2REVGLDB4NkQ3RiwweDZEODYsMHg2RDVFLDB4NkQ2NywweDZENjAsLyogMHg1MC0weDU3ICovCisJMHg2RDk3LDB4NkQ3MCwweDZEN0MsMHg2RDVGLDB4NkQ4MiwweDZEOTgsMHg2RDJGLDB4NkQ2OCwvKiAweDU4LTB4NUYgKi8KKwkweDZEOEIsMHg2RDdFLDB4NkQ4MCwweDZEODQsMHg2RDE2LDB4NkQ4MywweDZEN0IsMHg2RDdELC8qIDB4NjAtMHg2NyAqLworCTB4NkQ3NSwweDZEOTAsMHg3MERDLDB4NzBEMywweDcwRDEsMHg3MERELDB4NzBDQiwweDdGMzksLyogMHg2OC0weDZGICovCisJMHg3MEUyLDB4NzBENywweDcwRDIsMHg3MERFLDB4NzBFMCwweDcwRDQsMHg3MENELDB4NzBDNSwvKiAweDcwLTB4NzcgKi8KKwkweDcwQzYsMHg3MEM3LDB4NzBEQSwweDcwQ0UsMHg3MEUxLDB4NzI0MiwweDcyNzgsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3Mjc3LDB4NzI3NiwweDczMDAsMHg3MkZBLDB4NzJGNCwweDcyRkUsMHg3MkY2LC8qIDB4QTAtMHhBNyAqLworCTB4NzJGMywweDcyRkIsMHg3MzAxLDB4NzNEMywweDczRDksMHg3M0U1LDB4NzNENiwweDczQkMsLyogMHhBOC0weEFGICovCisJMHg3M0U3LDB4NzNFMywweDczRTksMHg3M0RDLDB4NzNEMiwweDczREIsMHg3M0Q0LDB4NzNERCwvKiAweEIwLTB4QjcgKi8KKwkweDczREEsMHg3M0Q3LDB4NzNEOCwweDczRTgsMHg3NERFLDB4NzRERiwweDc0RjQsMHg3NEY1LC8qIDB4QjgtMHhCRiAqLworCTB4NzUyMSwweDc1NUIsMHg3NTVGLDB4NzVCMCwweDc1QzEsMHg3NUJCLDB4NzVDNCwweDc1QzAsLyogMHhDMC0weEM3ICovCisJMHg3NUJGLDB4NzVCNiwweDc1QkEsMHg3NjhBLDB4NzZDOSwweDc3MUQsMHg3NzFCLDB4NzcxMCwvKiAweEM4LTB4Q0YgKi8KKwkweDc3MTMsMHg3NzEyLDB4NzcyMywweDc3MTEsMHg3NzE1LDB4NzcxOSwweDc3MUEsMHg3NzIyLC8qIDB4RDAtMHhENyAqLworCTB4NzcyNywweDc4MjMsMHg3ODJDLDB4NzgyMiwweDc4MzUsMHg3ODJGLDB4NzgyOCwweDc4MkUsLyogMHhEOC0weERGICovCisJMHg3ODJCLDB4NzgyMSwweDc4MjksMHg3ODMzLDB4NzgyQSwweDc4MzEsMHg3OTU0LDB4Nzk1QiwvKiAweEUwLTB4RTcgKi8KKwkweDc5NEYsMHg3OTVDLDB4Nzk1MywweDc5NTIsMHg3OTUxLDB4NzlFQiwweDc5RUMsMHg3OUUwLC8qIDB4RTgtMHhFRiAqLworCTB4NzlFRSwweDc5RUQsMHg3OUVBLDB4NzlEQywweDc5REUsMHg3OURELDB4N0E4NiwweDdBODksLyogMHhGMC0weEY3ICovCisJMHg3QTg1LDB4N0E4QiwweDdBOEMsMHg3QThBLDB4N0E4NywweDdBRDgsMHg3QjEwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EM1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDdCMDQsMHg3QjEzLDB4N0IwNSwweDdCMEYsMHg3QjA4LDB4N0IwQSwweDdCMEUsMHg3QjA5LC8qIDB4NDAtMHg0NyAqLworCTB4N0IxMiwweDdDODQsMHg3QzkxLDB4N0M4QSwweDdDOEMsMHg3Qzg4LDB4N0M4RCwweDdDODUsLyogMHg0OC0weDRGICovCisJMHg3RDFFLDB4N0QxRCwweDdEMTEsMHg3RDBFLDB4N0QxOCwweDdEMTYsMHg3RDEzLDB4N0QxRiwvKiAweDUwLTB4NTcgKi8KKwkweDdEMTIsMHg3RDBGLDB4N0QwQywweDdGNUMsMHg3RjYxLDB4N0Y1RSwweDdGNjAsMHg3RjVELC8qIDB4NTgtMHg1RiAqLworCTB4N0Y1QiwweDdGOTYsMHg3RjkyLDB4N0ZDMywweDdGQzIsMHg3RkMwLDB4ODAxNiwweDgwM0UsLyogMHg2MC0weDY3ICovCisJMHg4MDM5LDB4ODBGQSwweDgwRjIsMHg4MEY5LDB4ODBGNSwweDgxMDEsMHg4MEZCLDB4ODEwMCwvKiAweDY4LTB4NkYgKi8KKwkweDgyMDEsMHg4MjJGLDB4ODIyNSwweDgzMzMsMHg4MzJELDB4ODM0NCwweDgzMTksMHg4MzUxLC8qIDB4NzAtMHg3NyAqLworCTB4ODMyNSwweDgzNTYsMHg4MzNGLDB4ODM0MSwweDgzMjYsMHg4MzFDLDB4ODMyMiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDgzNDIsMHg4MzRFLDB4ODMxQiwweDgzMkEsMHg4MzA4LDB4ODMzQywweDgzNEQsLyogMHhBMC0weEE3ICovCisJMHg4MzE2LDB4ODMyNCwweDgzMjAsMHg4MzM3LDB4ODMyRiwweDgzMjksMHg4MzQ3LDB4ODM0NSwvKiAweEE4LTB4QUYgKi8KKwkweDgzNEMsMHg4MzUzLDB4ODMxRSwweDgzMkMsMHg4MzRCLDB4ODMyNywweDgzNDgsMHg4NjUzLC8qIDB4QjAtMHhCNyAqLworCTB4ODY1MiwweDg2QTIsMHg4NkE4LDB4ODY5NiwweDg2OEQsMHg4NjkxLDB4ODY5RSwweDg2ODcsLyogMHhCOC0weEJGICovCisJMHg4Njk3LDB4ODY4NiwweDg2OEIsMHg4NjlBLDB4ODY4NSwweDg2QTUsMHg4Njk5LDB4ODZBMSwvKiAweEMwLTB4QzcgKi8KKwkweDg2QTcsMHg4Njk1LDB4ODY5OCwweDg2OEUsMHg4NjlELDB4ODY5MCwweDg2OTQsMHg4ODQzLC8qIDB4QzgtMHhDRiAqLworCTB4ODg0NCwweDg4NkQsMHg4ODc1LDB4ODg3NiwweDg4NzIsMHg4ODgwLDB4ODg3MSwweDg4N0YsLyogMHhEMC0weEQ3ICovCisJMHg4ODZGLDB4ODg4MywweDg4N0UsMHg4ODc0LDB4ODg3QywweDhBMTIsMHg4QzQ3LDB4OEM1NywvKiAweEQ4LTB4REYgKi8KKwkweDhDN0IsMHg4Q0E0LDB4OENBMywweDhENzYsMHg4RDc4LDB4OERCNSwweDhEQjcsMHg4REI2LC8qIDB4RTAtMHhFNyAqLworCTB4OEVEMSwweDhFRDMsMHg4RkZFLDB4OEZGNSwweDkwMDIsMHg4RkZGLDB4OEZGQiwweDkwMDQsLyogMHhFOC0weEVGICovCisJMHg4RkZDLDB4OEZGNiwweDkwRDYsMHg5MEUwLDB4OTBEOSwweDkwREEsMHg5MEUzLDB4OTBERiwvKiAweEYwLTB4RjcgKi8KKwkweDkwRTUsMHg5MEQ4LDB4OTBEQiwweDkwRDcsMHg5MERDLDB4OTBFNCwweDkxNTAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Q0WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTE0RSwweDkxNEYsMHg5MUQ1LDB4OTFFMiwweDkxREEsMHg5NjVDLDB4OTY1RiwweDk2QkMsLyogMHg0MC0weDQ3ICovCisJMHg5OEUzLDB4OUFERiwweDlCMkYsMHg0RTdGLDB4NTA3MCwweDUwNkEsMHg1MDYxLDB4NTA1RSwvKiAweDQ4LTB4NEYgKi8KKwkweDUwNjAsMHg1MDUzLDB4NTA0QiwweDUwNUQsMHg1MDcyLDB4NTA0OCwweDUwNEQsMHg1MDQxLC8qIDB4NTAtMHg1NyAqLworCTB4NTA1QiwweDUwNEEsMHg1MDYyLDB4NTAxNSwweDUwNDUsMHg1MDVGLDB4NTA2OSwweDUwNkIsLyogMHg1OC0weDVGICovCisJMHg1MDYzLDB4NTA2NCwweDUwNDYsMHg1MDQwLDB4NTA2RSwweDUwNzMsMHg1MDU3LDB4NTA1MSwvKiAweDYwLTB4NjcgKi8KKwkweDUxRDAsMHg1MjZCLDB4NTI2RCwweDUyNkMsMHg1MjZFLDB4NTJENiwweDUyRDMsMHg1MzJELC8qIDB4NjgtMHg2RiAqLworCTB4NTM5QywweDU1NzUsMHg1NTc2LDB4NTUzQywweDU1NEQsMHg1NTUwLDB4NTUzNCwweDU1MkEsLyogMHg3MC0weDc3ICovCisJMHg1NTUxLDB4NTU2MiwweDU1MzYsMHg1NTM1LDB4NTUzMCwweDU1NTIsMHg1NTQ1LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NTUwQywweDU1MzIsMHg1NTY1LDB4NTU0RSwweDU1MzksMHg1NTQ4LDB4NTUyRCwvKiAweEEwLTB4QTcgKi8KKwkweDU1M0IsMHg1NTQwLDB4NTU0QiwweDU3MEEsMHg1NzA3LDB4NTdGQiwweDU4MTQsMHg1N0UyLC8qIDB4QTgtMHhBRiAqLworCTB4NTdGNiwweDU3REMsMHg1N0Y0LDB4NTgwMCwweDU3RUQsMHg1N0ZELDB4NTgwOCwweDU3RjgsLyogMHhCMC0weEI3ICovCisJMHg1ODBCLDB4NTdGMywweDU3Q0YsMHg1ODA3LDB4NTdFRSwweDU3RTMsMHg1N0YyLDB4NTdFNSwvKiAweEI4LTB4QkYgKi8KKwkweDU3RUMsMHg1N0UxLDB4NTgwRSwweDU3RkMsMHg1ODEwLDB4NTdFNywweDU4MDEsMHg1ODBDLC8qIDB4QzAtMHhDNyAqLworCTB4NTdGMSwweDU3RTksMHg1N0YwLDB4NTgwRCwweDU4MDQsMHg1OTVDLDB4NUE2MCwweDVBNTgsLyogMHhDOC0weENGICovCisJMHg1QTU1LDB4NUE2NywweDVBNUUsMHg1QTM4LDB4NUEzNSwweDVBNkQsMHg1QTUwLDB4NUE1RiwvKiAweEQwLTB4RDcgKi8KKwkweDVBNjUsMHg1QTZDLDB4NUE1MywweDVBNjQsMHg1QTU3LDB4NUE0MywweDVBNUQsMHg1QTUyLC8qIDB4RDgtMHhERiAqLworCTB4NUE0NCwweDVBNUIsMHg1QTQ4LDB4NUE4RSwweDVBM0UsMHg1QTRELDB4NUEzOSwweDVBNEMsLyogMHhFMC0weEU3ICovCisJMHg1QTcwLDB4NUE2OSwweDVBNDcsMHg1QTUxLDB4NUE1NiwweDVBNDIsMHg1QTVDLDB4NUI3MiwvKiAweEU4LTB4RUYgKi8KKwkweDVCNkUsMHg1QkMxLDB4NUJDMCwweDVDNTksMHg1RDFFLDB4NUQwQiwweDVEMUQsMHg1RDFBLC8qIDB4RjAtMHhGNyAqLworCTB4NUQyMCwweDVEMEMsMHg1RDI4LDB4NUQwRCwweDVEMjYsMHg1RDI1LDB4NUQwRiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRDVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1RDMwLDB4NUQxMiwweDVEMjMsMHg1RDFGLDB4NUQyRSwweDVFM0UsMHg1RTM0LDB4NUVCMSwvKiAweDQwLTB4NDcgKi8KKwkweDVFQjQsMHg1RUI5LDB4NUVCMiwweDVFQjMsMHg1RjM2LDB4NUYzOCwweDVGOUIsMHg1Rjk2LC8qIDB4NDgtMHg0RiAqLworCTB4NUY5RiwweDYwOEEsMHg2MDkwLDB4NjA4NiwweDYwQkUsMHg2MEIwLDB4NjBCQSwweDYwRDMsLyogMHg1MC0weDU3ICovCisJMHg2MEQ0LDB4NjBDRiwweDYwRTQsMHg2MEQ5LDB4NjBERCwweDYwQzgsMHg2MEIxLDB4NjBEQiwvKiAweDU4LTB4NUYgKi8KKwkweDYwQjcsMHg2MENBLDB4NjBCRiwweDYwQzMsMHg2MENELDB4NjBDMCwweDYzMzIsMHg2MzY1LC8qIDB4NjAtMHg2NyAqLworCTB4NjM4QSwweDYzODIsMHg2MzdELDB4NjNCRCwweDYzOUUsMHg2M0FELDB4NjM5RCwweDYzOTcsLyogMHg2OC0weDZGICovCisJMHg2M0FCLDB4NjM4RSwweDYzNkYsMHg2Mzg3LDB4NjM5MCwweDYzNkUsMHg2M0FGLDB4NjM3NSwvKiAweDcwLTB4NzcgKi8KKwkweDYzOUMsMHg2MzZELDB4NjNBRSwweDYzN0MsMHg2M0E0LDB4NjMzQiwweDYzOUYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg2Mzc4LDB4NjM4NSwweDYzODEsMHg2MzkxLDB4NjM4RCwweDYzNzAsMHg2NTUzLC8qIDB4QTAtMHhBNyAqLworCTB4NjVDRCwweDY2NjUsMHg2NjYxLDB4NjY1QiwweDY2NTksMHg2NjVDLDB4NjY2MiwweDY3MTgsLyogMHhBOC0weEFGICovCisJMHg2ODc5LDB4Njg4NywweDY4OTAsMHg2ODlDLDB4Njg2RCwweDY4NkUsMHg2OEFFLDB4NjhBQiwvKiAweEIwLTB4QjcgKi8KKwkweDY5NTYsMHg2ODZGLDB4NjhBMywweDY4QUMsMHg2OEE5LDB4Njg3NSwweDY4NzQsMHg2OEIyLC8qIDB4QjgtMHhCRiAqLworCTB4Njg4RiwweDY4NzcsMHg2ODkyLDB4Njg3QywweDY4NkIsMHg2ODcyLDB4NjhBQSwweDY4ODAsLyogMHhDMC0weEM3ICovCisJMHg2ODcxLDB4Njg3RSwweDY4OUIsMHg2ODk2LDB4Njg4QiwweDY4QTAsMHg2ODg5LDB4NjhBNCwvKiAweEM4LTB4Q0YgKi8KKwkweDY4NzgsMHg2ODdCLDB4Njg5MSwweDY4OEMsMHg2ODhBLDB4Njg3RCwweDZCMzYsMHg2QjMzLC8qIDB4RDAtMHhENyAqLworCTB4NkIzNywweDZCMzgsMHg2QjkxLDB4NkI4RiwweDZCOEQsMHg2QjhFLDB4NkI4QywweDZDMkEsLyogMHhEOC0weERGICovCisJMHg2REMwLDB4NkRBQiwweDZEQjQsMHg2REIzLDB4NkU3NCwweDZEQUMsMHg2REU5LDB4NkRFMiwvKiAweEUwLTB4RTcgKi8KKwkweDZEQjcsMHg2REY2LDB4NkRENCwweDZFMDAsMHg2REM4LDB4NkRFMCwweDZEREYsMHg2REQ2LC8qIDB4RTgtMHhFRiAqLworCTB4NkRCRSwweDZERTUsMHg2RERDLDB4NkRERCwweDZEREIsMHg2REY0LDB4NkRDQSwweDZEQkQsLyogMHhGMC0weEY3ICovCisJMHg2REVELDB4NkRGMCwweDZEQkEsMHg2REQ1LDB4NkRDMiwweDZEQ0YsMHg2REM5LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9ENlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDZERDAsMHg2REYyLDB4NkREMywweDZERkQsMHg2REQ3LDB4NkRDRCwweDZERTMsMHg2REJCLC8qIDB4NDAtMHg0NyAqLworCTB4NzBGQSwweDcxMEQsMHg3MEY3LDB4NzExNywweDcwRjQsMHg3MTBDLDB4NzBGMCwweDcxMDQsLyogMHg0OC0weDRGICovCisJMHg3MEYzLDB4NzExMCwweDcwRkMsMHg3MEZGLDB4NzEwNiwweDcxMTMsMHg3MTAwLDB4NzBGOCwvKiAweDUwLTB4NTcgKi8KKwkweDcwRjYsMHg3MTBCLDB4NzEwMiwweDcxMEUsMHg3MjdFLDB4NzI3QiwweDcyN0MsMHg3MjdGLC8qIDB4NTgtMHg1RiAqLworCTB4NzMxRCwweDczMTcsMHg3MzA3LDB4NzMxMSwweDczMTgsMHg3MzBBLDB4NzMwOCwweDcyRkYsLyogMHg2MC0weDY3ICovCisJMHg3MzBGLDB4NzMxRSwweDczODgsMHg3M0Y2LDB4NzNGOCwweDczRjUsMHg3NDA0LDB4NzQwMSwvKiAweDY4LTB4NkYgKi8KKwkweDczRkQsMHg3NDA3LDB4NzQwMCwweDczRkEsMHg3M0ZDLDB4NzNGRiwweDc0MEMsMHg3NDBCLC8qIDB4NzAtMHg3NyAqLworCTB4NzNGNCwweDc0MDgsMHg3NTY0LDB4NzU2MywweDc1Q0UsMHg3NUQyLDB4NzVDRiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDc1Q0IsMHg3NUNDLDB4NzVEMSwweDc1RDAsMHg3NjhGLDB4NzY4OSwweDc2RDMsLyogMHhBMC0weEE3ICovCisJMHg3NzM5LDB4NzcyRiwweDc3MkQsMHg3NzMxLDB4NzczMiwweDc3MzQsMHg3NzMzLDB4NzczRCwvKiAweEE4LTB4QUYgKi8KKwkweDc3MjUsMHg3NzNCLDB4NzczNSwweDc4NDgsMHg3ODUyLDB4Nzg0OSwweDc4NEQsMHg3ODRBLC8qIDB4QjAtMHhCNyAqLworCTB4Nzg0QywweDc4MjYsMHg3ODQ1LDB4Nzg1MCwweDc5NjQsMHg3OTY3LDB4Nzk2OSwweDc5NkEsLyogMHhCOC0weEJGICovCisJMHg3OTYzLDB4Nzk2QiwweDc5NjEsMHg3OUJCLDB4NzlGQSwweDc5RjgsMHg3OUY2LDB4NzlGNywvKiAweEMwLTB4QzcgKi8KKwkweDdBOEYsMHg3QTk0LDB4N0E5MCwweDdCMzUsMHg3QjQ3LDB4N0IzNCwweDdCMjUsMHg3QjMwLC8qIDB4QzgtMHhDRiAqLworCTB4N0IyMiwweDdCMjQsMHg3QjMzLDB4N0IxOCwweDdCMkEsMHg3QjFELDB4N0IzMSwweDdCMkIsLyogMHhEMC0weEQ3ICovCisJMHg3QjJELDB4N0IyRiwweDdCMzIsMHg3QjM4LDB4N0IxQSwweDdCMjMsMHg3Qzk0LDB4N0M5OCwvKiAweEQ4LTB4REYgKi8KKwkweDdDOTYsMHg3Q0EzLDB4N0QzNSwweDdEM0QsMHg3RDM4LDB4N0QzNiwweDdEM0EsMHg3RDQ1LC8qIDB4RTAtMHhFNyAqLworCTB4N0QyQywweDdEMjksMHg3RDQxLDB4N0Q0NywweDdEM0UsMHg3RDNGLDB4N0Q0QSwweDdEM0IsLyogMHhFOC0weEVGICovCisJMHg3RDI4LDB4N0Y2MywweDdGOTUsMHg3RjlDLDB4N0Y5RCwweDdGOUIsMHg3RkNBLDB4N0ZDQiwvKiAweEYwLTB4RjcgKi8KKwkweDdGQ0QsMHg3RkQwLDB4N0ZEMSwweDdGQzcsMHg3RkNGLDB4N0ZDOSwweDgwMUYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Q3WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4ODAxRSwweDgwMUIsMHg4MDQ3LDB4ODA0MywweDgwNDgsMHg4MTE4LDB4ODEyNSwweDgxMTksLyogMHg0MC0weDQ3ICovCisJMHg4MTFCLDB4ODEyRCwweDgxMUYsMHg4MTJDLDB4ODExRSwweDgxMjEsMHg4MTE1LDB4ODEyNywvKiAweDQ4LTB4NEYgKi8KKwkweDgxMUQsMHg4MTIyLDB4ODIxMSwweDgyMzgsMHg4MjMzLDB4ODIzQSwweDgyMzQsMHg4MjMyLC8qIDB4NTAtMHg1NyAqLworCTB4ODI3NCwweDgzOTAsMHg4M0EzLDB4ODNBOCwweDgzOEQsMHg4MzdBLDB4ODM3MywweDgzQTQsLyogMHg1OC0weDVGICovCisJMHg4Mzc0LDB4ODM4RiwweDgzODEsMHg4Mzk1LDB4ODM5OSwweDgzNzUsMHg4Mzk0LDB4ODNBOSwvKiAweDYwLTB4NjcgKi8KKwkweDgzN0QsMHg4MzgzLDB4ODM4QywweDgzOUQsMHg4MzlCLDB4ODNBQSwweDgzOEIsMHg4MzdFLC8qIDB4NjgtMHg2RiAqLworCTB4ODNBNSwweDgzQUYsMHg4Mzg4LDB4ODM5NywweDgzQjAsMHg4MzdGLDB4ODNBNiwweDgzODcsLyogMHg3MC0weDc3ICovCisJMHg4M0FFLDB4ODM3NiwweDgzOUEsMHg4NjU5LDB4ODY1NiwweDg2QkYsMHg4NkI3LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4ODZDMiwweDg2QzEsMHg4NkM1LDB4ODZCQSwweDg2QjAsMHg4NkM4LDB4ODZCOSwvKiAweEEwLTB4QTcgKi8KKwkweDg2QjMsMHg4NkI4LDB4ODZDQywweDg2QjQsMHg4NkJCLDB4ODZCQywweDg2QzMsMHg4NkJELC8qIDB4QTgtMHhBRiAqLworCTB4ODZCRSwweDg4NTIsMHg4ODg5LDB4ODg5NSwweDg4QTgsMHg4OEEyLDB4ODhBQSwweDg4OUEsLyogMHhCMC0weEI3ICovCisJMHg4ODkxLDB4ODhBMSwweDg4OUYsMHg4ODk4LDB4ODhBNywweDg4OTksMHg4ODlCLDB4ODg5NywvKiAweEI4LTB4QkYgKi8KKwkweDg4QTQsMHg4OEFDLDB4ODg4QywweDg4OTMsMHg4ODhFLDB4ODk4MiwweDg5RDYsMHg4OUQ5LC8qIDB4QzAtMHhDNyAqLworCTB4ODlENSwweDhBMzAsMHg4QTI3LDB4OEEyQywweDhBMUUsMHg4QzM5LDB4OEMzQiwweDhDNUMsLyogMHhDOC0weENGICovCisJMHg4QzVELDB4OEM3RCwweDhDQTUsMHg4RDdELDB4OEQ3QiwweDhENzksMHg4REJDLDB4OERDMiwvKiAweEQwLTB4RDcgKi8KKwkweDhEQjksMHg4REJGLDB4OERDMSwweDhFRDgsMHg4RURFLDB4OEVERCwweDhFREMsMHg4RUQ3LC8qIDB4RDgtMHhERiAqLworCTB4OEVFMCwweDhFRTEsMHg5MDI0LDB4OTAwQiwweDkwMTEsMHg5MDFDLDB4OTAwQywweDkwMjEsLyogMHhFMC0weEU3ICovCisJMHg5MEVGLDB4OTBFQSwweDkwRjAsMHg5MEY0LDB4OTBGMiwweDkwRjMsMHg5MEQ0LDB4OTBFQiwvKiAweEU4LTB4RUYgKi8KKwkweDkwRUMsMHg5MEU5LDB4OTE1NiwweDkxNTgsMHg5MTVBLDB4OTE1MywweDkxNTUsMHg5MUVDLC8qIDB4RjAtMHhGNyAqLworCTB4OTFGNCwweDkxRjEsMHg5MUYzLDB4OTFGOCwweDkxRTQsMHg5MUY5LDB4OTFFQSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRDhbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5MUVCLDB4OTFGNywweDkxRTgsMHg5MUVFLDB4OTU3QSwweDk1ODYsMHg5NTg4LDB4OTY3QywvKiAweDQwLTB4NDcgKi8KKwkweDk2NkQsMHg5NjZCLDB4OTY3MSwweDk2NkYsMHg5NkJGLDB4OTc2QSwweDk4MDQsMHg5OEU1LC8qIDB4NDgtMHg0RiAqLworCTB4OTk5NywweDUwOUIsMHg1MDk1LDB4NTA5NCwweDUwOUUsMHg1MDhCLDB4NTBBMywweDUwODMsLyogMHg1MC0weDU3ICovCisJMHg1MDhDLDB4NTA4RSwweDUwOUQsMHg1MDY4LDB4NTA5QywweDUwOTIsMHg1MDgyLDB4NTA4NywvKiAweDU4LTB4NUYgKi8KKwkweDUxNUYsMHg1MUQ0LDB4NTMxMiwweDUzMTEsMHg1M0E0LDB4NTNBNywweDU1OTEsMHg1NUE4LC8qIDB4NjAtMHg2NyAqLworCTB4NTVBNSwweDU1QUQsMHg1NTc3LDB4NTY0NSwweDU1QTIsMHg1NTkzLDB4NTU4OCwweDU1OEYsLyogMHg2OC0weDZGICovCisJMHg1NUI1LDB4NTU4MSwweDU1QTMsMHg1NTkyLDB4NTVBNCwweDU1N0QsMHg1NThDLDB4NTVBNiwvKiAweDcwLTB4NzcgKi8KKwkweDU1N0YsMHg1NTk1LDB4NTVBMSwweDU1OEUsMHg1NzBDLDB4NTgyOSwweDU4MzcsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg1ODE5LDB4NTgxRSwweDU4MjcsMHg1ODIzLDB4NTgyOCwweDU3RjUsMHg1ODQ4LC8qIDB4QTAtMHhBNyAqLworCTB4NTgyNSwweDU4MUMsMHg1ODFCLDB4NTgzMywweDU4M0YsMHg1ODM2LDB4NTgyRSwweDU4MzksLyogMHhBOC0weEFGICovCisJMHg1ODM4LDB4NTgyRCwweDU4MkMsMHg1ODNCLDB4NTk2MSwweDVBQUYsMHg1QTk0LDB4NUE5RiwvKiAweEIwLTB4QjcgKi8KKwkweDVBN0EsMHg1QUEyLDB4NUE5RSwweDVBNzgsMHg1QUE2LDB4NUE3QywweDVBQTUsMHg1QUFDLC8qIDB4QjgtMHhCRiAqLworCTB4NUE5NSwweDVBQUUsMHg1QTM3LDB4NUE4NCwweDVBOEEsMHg1QTk3LDB4NUE4MywweDVBOEIsLyogMHhDMC0weEM3ICovCisJMHg1QUE5LDB4NUE3QiwweDVBN0QsMHg1QThDLDB4NUE5QywweDVBOEYsMHg1QTkzLDB4NUE5RCwvKiAweEM4LTB4Q0YgKi8KKwkweDVCRUEsMHg1QkNELDB4NUJDQiwweDVCRDQsMHg1QkQxLDB4NUJDQSwweDVCQ0UsMHg1QzBDLC8qIDB4RDAtMHhENyAqLworCTB4NUMzMCwweDVEMzcsMHg1RDQzLDB4NUQ2QiwweDVENDEsMHg1RDRCLDB4NUQzRiwweDVEMzUsLyogMHhEOC0weERGICovCisJMHg1RDUxLDB4NUQ0RSwweDVENTUsMHg1RDMzLDB4NUQzQSwweDVENTIsMHg1RDNELDB4NUQzMSwvKiAweEUwLTB4RTcgKi8KKwkweDVENTksMHg1RDQyLDB4NUQzOSwweDVENDksMHg1RDM4LDB4NUQzQywweDVEMzIsMHg1RDM2LC8qIDB4RTgtMHhFRiAqLworCTB4NUQ0MCwweDVENDUsMHg1RTQ0LDB4NUU0MSwweDVGNTgsMHg1RkE2LDB4NUZBNSwweDVGQUIsLyogMHhGMC0weEY3ICovCisJMHg2MEM5LDB4NjBCOSwweDYwQ0MsMHg2MEUyLDB4NjBDRSwweDYwQzQsMHg2MTE0LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EOVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDYwRjIsMHg2MTBBLDB4NjExNiwweDYxMDUsMHg2MEY1LDB4NjExMywweDYwRjgsMHg2MEZDLC8qIDB4NDAtMHg0NyAqLworCTB4NjBGRSwweDYwQzEsMHg2MTAzLDB4NjExOCwweDYxMUQsMHg2MTEwLDB4NjBGRiwweDYxMDQsLyogMHg0OC0weDRGICovCisJMHg2MTBCLDB4NjI0QSwweDYzOTQsMHg2M0IxLDB4NjNCMCwweDYzQ0UsMHg2M0U1LDB4NjNFOCwvKiAweDUwLTB4NTcgKi8KKwkweDYzRUYsMHg2M0MzLDB4NjQ5RCwweDYzRjMsMHg2M0NBLDB4NjNFMCwweDYzRjYsMHg2M0Q1LC8qIDB4NTgtMHg1RiAqLworCTB4NjNGMiwweDYzRjUsMHg2NDYxLDB4NjNERiwweDYzQkUsMHg2M0RELDB4NjNEQywweDYzQzQsLyogMHg2MC0weDY3ICovCisJMHg2M0Q4LDB4NjNEMywweDYzQzIsMHg2M0M3LDB4NjNDQywweDYzQ0IsMHg2M0M4LDB4NjNGMCwvKiAweDY4LTB4NkYgKi8KKwkweDYzRDcsMHg2M0Q5LDB4NjUzMiwweDY1NjcsMHg2NTZBLDB4NjU2NCwweDY1NUMsMHg2NTY4LC8qIDB4NzAtMHg3NyAqLworCTB4NjU2NSwweDY1OEMsMHg2NTlELDB4NjU5RSwweDY1QUUsMHg2NUQwLDB4NjVEMiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDY2N0MsMHg2NjZDLDB4NjY3QiwweDY2ODAsMHg2NjcxLDB4NjY3OSwweDY2NkEsLyogMHhBMC0weEE3ICovCisJMHg2NjcyLDB4NjcwMSwweDY5MEMsMHg2OEQzLDB4NjkwNCwweDY4REMsMHg2OTJBLDB4NjhFQywvKiAweEE4LTB4QUYgKi8KKwkweDY4RUEsMHg2OEYxLDB4NjkwRiwweDY4RDYsMHg2OEY3LDB4NjhFQiwweDY4RTQsMHg2OEY2LC8qIDB4QjAtMHhCNyAqLworCTB4NjkxMywweDY5MTAsMHg2OEYzLDB4NjhFMSwweDY5MDcsMHg2OENDLDB4NjkwOCwweDY5NzAsLyogMHhCOC0weEJGICovCisJMHg2OEI0LDB4NjkxMSwweDY4RUYsMHg2OEM2LDB4NjkxNCwweDY4RjgsMHg2OEQwLDB4NjhGRCwvKiAweEMwLTB4QzcgKi8KKwkweDY4RkMsMHg2OEU4LDB4NjkwQiwweDY5MEEsMHg2OTE3LDB4NjhDRSwweDY4QzgsMHg2OERELC8qIDB4QzgtMHhDRiAqLworCTB4NjhERSwweDY4RTYsMHg2OEY0LDB4NjhEMSwweDY5MDYsMHg2OEQ0LDB4NjhFOSwweDY5MTUsLyogMHhEMC0weEQ3ICovCisJMHg2OTI1LDB4NjhDNywweDZCMzksMHg2QjNCLDB4NkIzRiwweDZCM0MsMHg2Qjk0LDB4NkI5NywvKiAweEQ4LTB4REYgKi8KKwkweDZCOTksMHg2Qjk1LDB4NkJCRCwweDZCRjAsMHg2QkYyLDB4NkJGMywweDZDMzAsMHg2REZDLC8qIDB4RTAtMHhFNyAqLworCTB4NkU0NiwweDZFNDcsMHg2RTFGLDB4NkU0OSwweDZFODgsMHg2RTNDLDB4NkUzRCwweDZFNDUsLyogMHhFOC0weEVGICovCisJMHg2RTYyLDB4NkUyQiwweDZFM0YsMHg2RTQxLDB4NkU1RCwweDZFNzMsMHg2RTFDLDB4NkUzMywvKiAweEYwLTB4RjcgKi8KKwkweDZFNEIsMHg2RTQwLDB4NkU1MSwweDZFM0IsMHg2RTAzLDB4NkUyRSwweDZFNUUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0RBWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NkU2OCwweDZFNUMsMHg2RTYxLDB4NkUzMSwweDZFMjgsMHg2RTYwLDB4NkU3MSwweDZFNkIsLyogMHg0MC0weDQ3ICovCisJMHg2RTM5LDB4NkUyMiwweDZFMzAsMHg2RTUzLDB4NkU2NSwweDZFMjcsMHg2RTc4LDB4NkU2NCwvKiAweDQ4LTB4NEYgKi8KKwkweDZFNzcsMHg2RTU1LDB4NkU3OSwweDZFNTIsMHg2RTY2LDB4NkUzNSwweDZFMzYsMHg2RTVBLC8qIDB4NTAtMHg1NyAqLworCTB4NzEyMCwweDcxMUUsMHg3MTJGLDB4NzBGQiwweDcxMkUsMHg3MTMxLDB4NzEyMywweDcxMjUsLyogMHg1OC0weDVGICovCisJMHg3MTIyLDB4NzEzMiwweDcxMUYsMHg3MTI4LDB4NzEzQSwweDcxMUIsMHg3MjRCLDB4NzI1QSwvKiAweDYwLTB4NjcgKi8KKwkweDcyODgsMHg3Mjg5LDB4NzI4NiwweDcyODUsMHg3MjhCLDB4NzMxMiwweDczMEIsMHg3MzMwLC8qIDB4NjgtMHg2RiAqLworCTB4NzMyMiwweDczMzEsMHg3MzMzLDB4NzMyNywweDczMzIsMHg3MzJELDB4NzMyNiwweDczMjMsLyogMHg3MC0weDc3ICovCisJMHg3MzM1LDB4NzMwQywweDc0MkUsMHg3NDJDLDB4NzQzMCwweDc0MkIsMHg3NDE2LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NzQxQSwweDc0MjEsMHg3NDJELDB4NzQzMSwweDc0MjQsMHg3NDIzLDB4NzQxRCwvKiAweEEwLTB4QTcgKi8KKwkweDc0MjksMHg3NDIwLDB4NzQzMiwweDc0RkIsMHg3NTJGLDB4NzU2RiwweDc1NkMsMHg3NUU3LC8qIDB4QTgtMHhBRiAqLworCTB4NzVEQSwweDc1RTEsMHg3NUU2LDB4NzVERCwweDc1REYsMHg3NUU0LDB4NzVENywweDc2OTUsLyogMHhCMC0weEI3ICovCisJMHg3NjkyLDB4NzZEQSwweDc3NDYsMHg3NzQ3LDB4Nzc0NCwweDc3NEQsMHg3NzQ1LDB4Nzc0QSwvKiAweEI4LTB4QkYgKi8KKwkweDc3NEUsMHg3NzRCLDB4Nzc0QywweDc3REUsMHg3N0VDLDB4Nzg2MCwweDc4NjQsMHg3ODY1LC8qIDB4QzAtMHhDNyAqLworCTB4Nzg1QywweDc4NkQsMHg3ODcxLDB4Nzg2QSwweDc4NkUsMHg3ODcwLDB4Nzg2OSwweDc4NjgsLyogMHhDOC0weENGICovCisJMHg3ODVFLDB4Nzg2MiwweDc5NzQsMHg3OTczLDB4Nzk3MiwweDc5NzAsMHg3QTAyLDB4N0EwQSwvKiAweEQwLTB4RDcgKi8KKwkweDdBMDMsMHg3QTBDLDB4N0EwNCwweDdBOTksMHg3QUU2LDB4N0FFNCwweDdCNEEsMHg3QjNCLC8qIDB4RDgtMHhERiAqLworCTB4N0I0NCwweDdCNDgsMHg3QjRDLDB4N0I0RSwweDdCNDAsMHg3QjU4LDB4N0I0NSwweDdDQTIsLyogMHhFMC0weEU3ICovCisJMHg3QzlFLDB4N0NBOCwweDdDQTEsMHg3RDU4LDB4N0Q2RiwweDdENjMsMHg3RDUzLDB4N0Q1NiwvKiAweEU4LTB4RUYgKi8KKwkweDdENjcsMHg3RDZBLDB4N0Q0RiwweDdENkQsMHg3RDVDLDB4N0Q2QiwweDdENTIsMHg3RDU0LC8qIDB4RjAtMHhGNyAqLworCTB4N0Q2OSwweDdENTEsMHg3RDVGLDB4N0Q0RSwweDdGM0UsMHg3RjNGLDB4N0Y2NSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfREJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3RjY2LDB4N0ZBMiwweDdGQTAsMHg3RkExLDB4N0ZENywweDgwNTEsMHg4MDRGLDB4ODA1MCwvKiAweDQwLTB4NDcgKi8KKwkweDgwRkUsMHg4MEQ0LDB4ODE0MywweDgxNEEsMHg4MTUyLDB4ODE0RiwweDgxNDcsMHg4MTNELC8qIDB4NDgtMHg0RiAqLworCTB4ODE0RCwweDgxM0EsMHg4MUU2LDB4ODFFRSwweDgxRjcsMHg4MUY4LDB4ODFGOSwweDgyMDQsLyogMHg1MC0weDU3ICovCisJMHg4MjNDLDB4ODIzRCwweDgyM0YsMHg4Mjc1LDB4ODMzQiwweDgzQ0YsMHg4M0Y5LDB4ODQyMywvKiAweDU4LTB4NUYgKi8KKwkweDgzQzAsMHg4M0U4LDB4ODQxMiwweDgzRTcsMHg4M0U0LDB4ODNGQywweDgzRjYsMHg4NDEwLC8qIDB4NjAtMHg2NyAqLworCTB4ODNDNiwweDgzQzgsMHg4M0VCLDB4ODNFMywweDgzQkYsMHg4NDAxLDB4ODNERCwweDgzRTUsLyogMHg2OC0weDZGICovCisJMHg4M0Q4LDB4ODNGRiwweDgzRTEsMHg4M0NCLDB4ODNDRSwweDgzRDYsMHg4M0Y1LDB4ODNDOSwvKiAweDcwLTB4NzcgKi8KKwkweDg0MDksMHg4NDBGLDB4ODNERSwweDg0MTEsMHg4NDA2LDB4ODNDMiwweDgzRjMsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg4M0Q1LDB4ODNGQSwweDgzQzcsMHg4M0QxLDB4ODNFQSwweDg0MTMsMHg4M0MzLC8qIDB4QTAtMHhBNyAqLworCTB4ODNFQywweDgzRUUsMHg4M0M0LDB4ODNGQiwweDgzRDcsMHg4M0UyLDB4ODQxQiwweDgzREIsLyogMHhBOC0weEFGICovCisJMHg4M0ZFLDB4ODZEOCwweDg2RTIsMHg4NkU2LDB4ODZEMywweDg2RTMsMHg4NkRBLDB4ODZFQSwvKiAweEIwLTB4QjcgKi8KKwkweDg2REQsMHg4NkVCLDB4ODZEQywweDg2RUMsMHg4NkU5LDB4ODZENywweDg2RTgsMHg4NkQxLC8qIDB4QjgtMHhCRiAqLworCTB4ODg0OCwweDg4NTYsMHg4ODU1LDB4ODhCQSwweDg4RDcsMHg4OEI5LDB4ODhCOCwweDg4QzAsLyogMHhDMC0weEM3ICovCisJMHg4OEJFLDB4ODhCNiwweDg4QkMsMHg4OEI3LDB4ODhCRCwweDg4QjIsMHg4OTAxLDB4ODhDOSwvKiAweEM4LTB4Q0YgKi8KKwkweDg5OTUsMHg4OTk4LDB4ODk5NywweDg5REQsMHg4OURBLDB4ODlEQiwweDhBNEUsMHg4QTRELC8qIDB4RDAtMHhENyAqLworCTB4OEEzOSwweDhBNTksMHg4QTQwLDB4OEE1NywweDhBNTgsMHg4QTQ0LDB4OEE0NSwweDhBNTIsLyogMHhEOC0weERGICovCisJMHg4QTQ4LDB4OEE1MSwweDhBNEEsMHg4QTRDLDB4OEE0RiwweDhDNUYsMHg4QzgxLDB4OEM4MCwvKiAweEUwLTB4RTcgKi8KKwkweDhDQkEsMHg4Q0JFLDB4OENCMCwweDhDQjksMHg4Q0I1LDB4OEQ4NCwweDhEODAsMHg4RDg5LC8qIDB4RTgtMHhFRiAqLworCTB4OEREOCwweDhERDMsMHg4RENELDB4OERDNywweDhERDYsMHg4RERDLDB4OERDRiwweDhERDUsLyogMHhGMC0weEY3ICovCisJMHg4REQ5LDB4OERDOCwweDhERDcsMHg4REM1LDB4OEVFRiwweDhFRjcsMHg4RUZBLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EQ1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDhFRjksMHg4RUU2LDB4OEVFRSwweDhFRTUsMHg4RUY1LDB4OEVFNywweDhFRTgsMHg4RUY2LC8qIDB4NDAtMHg0NyAqLworCTB4OEVFQiwweDhFRjEsMHg4RUVDLDB4OEVGNCwweDhFRTksMHg5MDJELDB4OTAzNCwweDkwMkYsLyogMHg0OC0weDRGICovCisJMHg5MTA2LDB4OTEyQywweDkxMDQsMHg5MEZGLDB4OTBGQywweDkxMDgsMHg5MEY5LDB4OTBGQiwvKiAweDUwLTB4NTcgKi8KKwkweDkxMDEsMHg5MTAwLDB4OTEwNywweDkxMDUsMHg5MTAzLDB4OTE2MSwweDkxNjQsMHg5MTVGLC8qIDB4NTgtMHg1RiAqLworCTB4OTE2MiwweDkxNjAsMHg5MjAxLDB4OTIwQSwweDkyMjUsMHg5MjAzLDB4OTIxQSwweDkyMjYsLyogMHg2MC0weDY3ICovCisJMHg5MjBGLDB4OTIwQywweDkyMDAsMHg5MjEyLDB4OTFGRiwweDkxRkQsMHg5MjA2LDB4OTIwNCwvKiAweDY4LTB4NkYgKi8KKwkweDkyMjcsMHg5MjAyLDB4OTIxQywweDkyMjQsMHg5MjE5LDB4OTIxNywweDkyMDUsMHg5MjE2LC8qIDB4NzAtMHg3NyAqLworCTB4OTU3QiwweDk1OEQsMHg5NThDLDB4OTU5MCwweDk2ODcsMHg5NjdFLDB4OTY4OCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDk2ODksMHg5NjgzLDB4OTY4MCwweDk2QzIsMHg5NkM4LDB4OTZDMywweDk2RjEsLyogMHhBMC0weEE3ICovCisJMHg5NkYwLDB4OTc2QywweDk3NzAsMHg5NzZFLDB4OTgwNywweDk4QTksMHg5OEVCLDB4OUNFNiwvKiAweEE4LTB4QUYgKi8KKwkweDlFRjksMHg0RTgzLDB4NEU4NCwweDRFQjYsMHg1MEJELDB4NTBCRiwweDUwQzYsMHg1MEFFLC8qIDB4QjAtMHhCNyAqLworCTB4NTBDNCwweDUwQ0EsMHg1MEI0LDB4NTBDOCwweDUwQzIsMHg1MEIwLDB4NTBDMSwweDUwQkEsLyogMHhCOC0weEJGICovCisJMHg1MEIxLDB4NTBDQiwweDUwQzksMHg1MEI2LDB4NTBCOCwweDUxRDcsMHg1MjdBLDB4NTI3OCwvKiAweEMwLTB4QzcgKi8KKwkweDUyN0IsMHg1MjdDLDB4NTVDMywweDU1REIsMHg1NUNDLDB4NTVEMCwweDU1Q0IsMHg1NUNBLC8qIDB4QzgtMHhDRiAqLworCTB4NTVERCwweDU1QzAsMHg1NUQ0LDB4NTVDNCwweDU1RTksMHg1NUJGLDB4NTVEMiwweDU1OEQsLyogMHhEMC0weEQ3ICovCisJMHg1NUNGLDB4NTVENSwweDU1RTIsMHg1NUQ2LDB4NTVDOCwweDU1RjIsMHg1NUNELDB4NTVEOSwvKiAweEQ4LTB4REYgKi8KKwkweDU1QzIsMHg1NzE0LDB4NTg1MywweDU4NjgsMHg1ODY0LDB4NTg0RiwweDU4NEQsMHg1ODQ5LC8qIDB4RTAtMHhFNyAqLworCTB4NTg2RiwweDU4NTUsMHg1ODRFLDB4NTg1RCwweDU4NTksMHg1ODY1LDB4NTg1QiwweDU4M0QsLyogMHhFOC0weEVGICovCisJMHg1ODYzLDB4NTg3MSwweDU4RkMsMHg1QUM3LDB4NUFDNCwweDVBQ0IsMHg1QUJBLDB4NUFCOCwvKiAweEYwLTB4RjcgKi8KKwkweDVBQjEsMHg1QUI1LDB4NUFCMCwweDVBQkYsMHg1QUM4LDB4NUFCQiwweDVBQzYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0REWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NUFCNywweDVBQzAsMHg1QUNBLDB4NUFCNCwweDVBQjYsMHg1QUNELDB4NUFCOSwweDVBOTAsLyogMHg0MC0weDQ3ICovCisJMHg1QkQ2LDB4NUJEOCwweDVCRDksMHg1QzFGLDB4NUMzMywweDVENzEsMHg1RDYzLDB4NUQ0QSwvKiAweDQ4LTB4NEYgKi8KKwkweDVENjUsMHg1RDcyLDB4NUQ2QywweDVENUUsMHg1RDY4LDB4NUQ2NywweDVENjIsMHg1REYwLC8qIDB4NTAtMHg1NyAqLworCTB4NUU0RiwweDVFNEUsMHg1RTRBLDB4NUU0RCwweDVFNEIsMHg1RUM1LDB4NUVDQywweDVFQzYsLyogMHg1OC0weDVGICovCisJMHg1RUNCLDB4NUVDNywweDVGNDAsMHg1RkFGLDB4NUZBRCwweDYwRjcsMHg2MTQ5LDB4NjE0QSwvKiAweDYwLTB4NjcgKi8KKwkweDYxMkIsMHg2MTQ1LDB4NjEzNiwweDYxMzIsMHg2MTJFLDB4NjE0NiwweDYxMkYsMHg2MTRGLC8qIDB4NjgtMHg2RiAqLworCTB4NjEyOSwweDYxNDAsMHg2MjIwLDB4OTE2OCwweDYyMjMsMHg2MjI1LDB4NjIyNCwweDYzQzUsLyogMHg3MC0weDc3ICovCisJMHg2M0YxLDB4NjNFQiwweDY0MTAsMHg2NDEyLDB4NjQwOSwweDY0MjAsMHg2NDI0LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NjQzMywweDY0NDMsMHg2NDFGLDB4NjQxNSwweDY0MTgsMHg2NDM5LDB4NjQzNywvKiAweEEwLTB4QTcgKi8KKwkweDY0MjIsMHg2NDIzLDB4NjQwQywweDY0MjYsMHg2NDMwLDB4NjQyOCwweDY0NDEsMHg2NDM1LC8qIDB4QTgtMHhBRiAqLworCTB4NjQyRiwweDY0MEEsMHg2NDFBLDB4NjQ0MCwweDY0MjUsMHg2NDI3LDB4NjQwQiwweDYzRTcsLyogMHhCMC0weEI3ICovCisJMHg2NDFCLDB4NjQyRSwweDY0MjEsMHg2NDBFLDB4NjU2RiwweDY1OTIsMHg2NUQzLDB4NjY4NiwvKiAweEI4LTB4QkYgKi8KKwkweDY2OEMsMHg2Njk1LDB4NjY5MCwweDY2OEIsMHg2NjhBLDB4NjY5OSwweDY2OTQsMHg2Njc4LC8qIDB4QzAtMHhDNyAqLworCTB4NjcyMCwweDY5NjYsMHg2OTVGLDB4NjkzOCwweDY5NEUsMHg2OTYyLDB4Njk3MSwweDY5M0YsLyogMHhDOC0weENGICovCisJMHg2OTQ1LDB4Njk2QSwweDY5MzksMHg2OTQyLDB4Njk1NywweDY5NTksMHg2OTdBLDB4Njk0OCwvKiAweEQwLTB4RDcgKi8KKwkweDY5NDksMHg2OTM1LDB4Njk2QywweDY5MzMsMHg2OTNELDB4Njk2NSwweDY4RjAsMHg2OTc4LC8qIDB4RDgtMHhERiAqLworCTB4NjkzNCwweDY5NjksMHg2OTQwLDB4Njk2RiwweDY5NDQsMHg2OTc2LDB4Njk1OCwweDY5NDEsLyogMHhFMC0weEU3ICovCisJMHg2OTc0LDB4Njk0QywweDY5M0IsMHg2OTRCLDB4NjkzNywweDY5NUMsMHg2OTRGLDB4Njk1MSwvKiAweEU4LTB4RUYgKi8KKwkweDY5MzIsMHg2OTUyLDB4NjkyRiwweDY5N0IsMHg2OTNDLDB4NkI0NiwweDZCNDUsMHg2QjQzLC8qIDB4RjAtMHhGNyAqLworCTB4NkI0MiwweDZCNDgsMHg2QjQxLDB4NkI5QiwweEZBMEQsMHg2QkZCLDB4NkJGQywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfREVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2QkY5LDB4NkJGNywweDZCRjgsMHg2RTlCLDB4NkVENiwweDZFQzgsMHg2RThGLDB4NkVDMCwvKiAweDQwLTB4NDcgKi8KKwkweDZFOUYsMHg2RTkzLDB4NkU5NCwweDZFQTAsMHg2RUIxLDB4NkVCOSwweDZFQzYsMHg2RUQyLC8qIDB4NDgtMHg0RiAqLworCTB4NkVCRCwweDZFQzEsMHg2RTlFLDB4NkVDOSwweDZFQjcsMHg2RUIwLDB4NkVDRCwweDZFQTYsLyogMHg1MC0weDU3ICovCisJMHg2RUNGLDB4NkVCMiwweDZFQkUsMHg2RUMzLDB4NkVEQywweDZFRDgsMHg2RTk5LDB4NkU5MiwvKiAweDU4LTB4NUYgKi8KKwkweDZFOEUsMHg2RThELDB4NkVBNCwweDZFQTEsMHg2RUJGLDB4NkVCMywweDZFRDAsMHg2RUNBLC8qIDB4NjAtMHg2NyAqLworCTB4NkU5NywweDZFQUUsMHg2RUEzLDB4NzE0NywweDcxNTQsMHg3MTUyLDB4NzE2MywweDcxNjAsLyogMHg2OC0weDZGICovCisJMHg3MTQxLDB4NzE1RCwweDcxNjIsMHg3MTcyLDB4NzE3OCwweDcxNkEsMHg3MTYxLDB4NzE0MiwvKiAweDcwLTB4NzcgKi8KKwkweDcxNTgsMHg3MTQzLDB4NzE0QiwweDcxNzAsMHg3MTVGLDB4NzE1MCwweDcxNTMsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3MTQ0LDB4NzE0RCwweDcxNUEsMHg3MjRGLDB4NzI4RCwweDcyOEMsMHg3MjkxLC8qIDB4QTAtMHhBNyAqLworCTB4NzI5MCwweDcyOEUsMHg3MzNDLDB4NzM0MiwweDczM0IsMHg3MzNBLDB4NzM0MCwweDczNEEsLyogMHhBOC0weEFGICovCisJMHg3MzQ5LDB4NzQ0NCwweDc0NEEsMHg3NDRCLDB4NzQ1MiwweDc0NTEsMHg3NDU3LDB4NzQ0MCwvKiAweEIwLTB4QjcgKi8KKwkweDc0NEYsMHg3NDUwLDB4NzQ0RSwweDc0NDIsMHg3NDQ2LDB4NzQ0RCwweDc0NTQsMHg3NEUxLC8qIDB4QjgtMHhCRiAqLworCTB4NzRGRiwweDc0RkUsMHg3NEZELDB4NzUxRCwweDc1NzksMHg3NTc3LDB4Njk4MywweDc1RUYsLyogMHhDMC0weEM3ICovCisJMHg3NjBGLDB4NzYwMywweDc1RjcsMHg3NUZFLDB4NzVGQywweDc1RjksMHg3NUY4LDB4NzYxMCwvKiAweEM4LTB4Q0YgKi8KKwkweDc1RkIsMHg3NUY2LDB4NzVFRCwweDc1RjUsMHg3NUZELDB4NzY5OSwweDc2QjUsMHg3NkRELC8qIDB4RDAtMHhENyAqLworCTB4Nzc1NSwweDc3NUYsMHg3NzYwLDB4Nzc1MiwweDc3NTYsMHg3NzVBLDB4Nzc2OSwweDc3NjcsLyogMHhEOC0weERGICovCisJMHg3NzU0LDB4Nzc1OSwweDc3NkQsMHg3N0UwLDB4Nzg4NywweDc4OUEsMHg3ODk0LDB4Nzg4RiwvKiAweEUwLTB4RTcgKi8KKwkweDc4ODQsMHg3ODk1LDB4Nzg4NSwweDc4ODYsMHg3OEExLDB4Nzg4MywweDc4NzksMHg3ODk5LC8qIDB4RTgtMHhFRiAqLworCTB4Nzg4MCwweDc4OTYsMHg3ODdCLDB4Nzk3QywweDc5ODIsMHg3OTdELDB4Nzk3OSwweDdBMTEsLyogMHhGMC0weEY3ICovCisJMHg3QTE4LDB4N0ExOSwweDdBMTIsMHg3QTE3LDB4N0ExNSwweDdBMjIsMHg3QTEzLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9ERlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDdBMUIsMHg3QTEwLDB4N0FBMywweDdBQTIsMHg3QTlFLDB4N0FFQiwweDdCNjYsMHg3QjY0LC8qIDB4NDAtMHg0NyAqLworCTB4N0I2RCwweDdCNzQsMHg3QjY5LDB4N0I3MiwweDdCNjUsMHg3QjczLDB4N0I3MSwweDdCNzAsLyogMHg0OC0weDRGICovCisJMHg3QjYxLDB4N0I3OCwweDdCNzYsMHg3QjYzLDB4N0NCMiwweDdDQjQsMHg3Q0FGLDB4N0Q4OCwvKiAweDUwLTB4NTcgKi8KKwkweDdEODYsMHg3RDgwLDB4N0Q4RCwweDdEN0YsMHg3RDg1LDB4N0Q3QSwweDdEOEUsMHg3RDdCLC8qIDB4NTgtMHg1RiAqLworCTB4N0Q4MywweDdEN0MsMHg3RDhDLDB4N0Q5NCwweDdEODQsMHg3RDdELDB4N0Q5MiwweDdGNkQsLyogMHg2MC0weDY3ICovCisJMHg3RjZCLDB4N0Y2NywweDdGNjgsMHg3RjZDLDB4N0ZBNiwweDdGQTUsMHg3RkE3LDB4N0ZEQiwvKiAweDY4LTB4NkYgKi8KKwkweDdGREMsMHg4MDIxLDB4ODE2NCwweDgxNjAsMHg4MTc3LDB4ODE1QywweDgxNjksMHg4MTVCLC8qIDB4NzAtMHg3NyAqLworCTB4ODE2MiwweDgxNzIsMHg2NzIxLDB4ODE1RSwweDgxNzYsMHg4MTY3LDB4ODE2RiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDgxNDQsMHg4MTYxLDB4ODIxRCwweDgyNDksMHg4MjQ0LDB4ODI0MCwweDgyNDIsLyogMHhBMC0weEE3ICovCisJMHg4MjQ1LDB4ODRGMSwweDg0M0YsMHg4NDU2LDB4ODQ3NiwweDg0NzksMHg4NDhGLDB4ODQ4RCwvKiAweEE4LTB4QUYgKi8KKwkweDg0NjUsMHg4NDUxLDB4ODQ0MCwweDg0ODYsMHg4NDY3LDB4ODQzMCwweDg0NEQsMHg4NDdELC8qIDB4QjAtMHhCNyAqLworCTB4ODQ1QSwweDg0NTksMHg4NDc0LDB4ODQ3MywweDg0NUQsMHg4NTA3LDB4ODQ1RSwweDg0MzcsLyogMHhCOC0weEJGICovCisJMHg4NDNBLDB4ODQzNCwweDg0N0EsMHg4NDQzLDB4ODQ3OCwweDg0MzIsMHg4NDQ1LDB4ODQyOSwvKiAweEMwLTB4QzcgKi8KKwkweDgzRDksMHg4NDRCLDB4ODQyRiwweDg0NDIsMHg4NDJELDB4ODQ1RiwweDg0NzAsMHg4NDM5LC8qIDB4QzgtMHhDRiAqLworCTB4ODQ0RSwweDg0NEMsMHg4NDUyLDB4ODQ2RiwweDg0QzUsMHg4NDhFLDB4ODQzQiwweDg0NDcsLyogMHhEMC0weEQ3ICovCisJMHg4NDM2LDB4ODQzMywweDg0NjgsMHg4NDdFLDB4ODQ0NCwweDg0MkIsMHg4NDYwLDB4ODQ1NCwvKiAweEQ4LTB4REYgKi8KKwkweDg0NkUsMHg4NDUwLDB4ODcwQiwweDg3MDQsMHg4NkY3LDB4ODcwQywweDg2RkEsMHg4NkQ2LC8qIDB4RTAtMHhFNyAqLworCTB4ODZGNSwweDg3NEQsMHg4NkY4LDB4ODcwRSwweDg3MDksMHg4NzAxLDB4ODZGNiwweDg3MEQsLyogMHhFOC0weEVGICovCisJMHg4NzA1LDB4ODhENiwweDg4Q0IsMHg4OENELDB4ODhDRSwweDg4REUsMHg4OERCLDB4ODhEQSwvKiAweEYwLTB4RjcgKi8KKwkweDg4Q0MsMHg4OEQwLDB4ODk4NSwweDg5OUIsMHg4OURGLDB4ODlFNSwweDg5RTQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0UwWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4ODlFMSwweDg5RTAsMHg4OUUyLDB4ODlEQywweDg5RTYsMHg4QTc2LDB4OEE4NiwweDhBN0YsLyogMHg0MC0weDQ3ICovCisJMHg4QTYxLDB4OEEzRiwweDhBNzcsMHg4QTgyLDB4OEE4NCwweDhBNzUsMHg4QTgzLDB4OEE4MSwvKiAweDQ4LTB4NEYgKi8KKwkweDhBNzQsMHg4QTdBLDB4OEMzQywweDhDNEIsMHg4QzRBLDB4OEM2NSwweDhDNjQsMHg4QzY2LC8qIDB4NTAtMHg1NyAqLworCTB4OEM4NiwweDhDODQsMHg4Qzg1LDB4OENDQywweDhENjgsMHg4RDY5LDB4OEQ5MSwweDhEOEMsLyogMHg1OC0weDVGICovCisJMHg4RDhFLDB4OEQ4RiwweDhEOEQsMHg4RDkzLDB4OEQ5NCwweDhEOTAsMHg4RDkyLDB4OERGMCwvKiAweDYwLTB4NjcgKi8KKwkweDhERTAsMHg4REVDLDB4OERGMSwweDhERUUsMHg4REQwLDB4OERFOSwweDhERTMsMHg4REUyLC8qIDB4NjgtMHg2RiAqLworCTB4OERFNywweDhERjIsMHg4REVCLDB4OERGNCwweDhGMDYsMHg4RUZGLDB4OEYwMSwweDhGMDAsLyogMHg3MC0weDc3ICovCisJMHg4RjA1LDB4OEYwNywweDhGMDgsMHg4RjAyLDB4OEYwQiwweDkwNTIsMHg5MDNGLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OTA0NCwweDkwNDksMHg5MDNELDB4OTExMCwweDkxMEQsMHg5MTBGLDB4OTExMSwvKiAweEEwLTB4QTcgKi8KKwkweDkxMTYsMHg5MTE0LDB4OTEwQiwweDkxMEUsMHg5MTZFLDB4OTE2RiwweDkyNDgsMHg5MjUyLC8qIDB4QTgtMHhBRiAqLworCTB4OTIzMCwweDkyM0EsMHg5MjY2LDB4OTIzMywweDkyNjUsMHg5MjVFLDB4OTI4MywweDkyMkUsLyogMHhCMC0weEI3ICovCisJMHg5MjRBLDB4OTI0NiwweDkyNkQsMHg5MjZDLDB4OTI0RiwweDkyNjAsMHg5MjY3LDB4OTI2RiwvKiAweEI4LTB4QkYgKi8KKwkweDkyMzYsMHg5MjYxLDB4OTI3MCwweDkyMzEsMHg5MjU0LDB4OTI2MywweDkyNTAsMHg5MjcyLC8qIDB4QzAtMHhDNyAqLworCTB4OTI0RSwweDkyNTMsMHg5MjRDLDB4OTI1NiwweDkyMzIsMHg5NTlGLDB4OTU5QywweDk1OUUsLyogMHhDOC0weENGICovCisJMHg5NTlCLDB4OTY5MiwweDk2OTMsMHg5NjkxLDB4OTY5NywweDk2Q0UsMHg5NkZBLDB4OTZGRCwvKiAweEQwLTB4RDcgKi8KKwkweDk2RjgsMHg5NkY1LDB4OTc3MywweDk3NzcsMHg5Nzc4LDB4OTc3MiwweDk4MEYsMHg5ODBELC8qIDB4RDgtMHhERiAqLworCTB4OTgwRSwweDk4QUMsMHg5OEY2LDB4OThGOSwweDk5QUYsMHg5OUIyLDB4OTlCMCwweDk5QjUsLyogMHhFMC0weEU3ICovCisJMHg5QUFELDB4OUFBQiwweDlCNUIsMHg5Q0VBLDB4OUNFRCwweDlDRTcsMHg5RTgwLDB4OUVGRCwvKiAweEU4LTB4RUYgKi8KKwkweDUwRTYsMHg1MEQ0LDB4NTBENywweDUwRTgsMHg1MEYzLDB4NTBEQiwweDUwRUEsMHg1MERELC8qIDB4RjAtMHhGNyAqLworCTB4NTBFNCwweDUwRDMsMHg1MEVDLDB4NTBGMCwweDUwRUYsMHg1MEUzLDB4NTBFMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1MUQ4LDB4NTI4MCwweDUyODEsMHg1MkU5LDB4NTJFQiwweDUzMzAsMHg1M0FDLDB4NTYyNywvKiAweDQwLTB4NDcgKi8KKwkweDU2MTUsMHg1NjBDLDB4NTYxMiwweDU1RkMsMHg1NjBGLDB4NTYxQywweDU2MDEsMHg1NjEzLC8qIDB4NDgtMHg0RiAqLworCTB4NTYwMiwweDU1RkEsMHg1NjFELDB4NTYwNCwweDU1RkYsMHg1NUY5LDB4NTg4OSwweDU4N0MsLyogMHg1MC0weDU3ICovCisJMHg1ODkwLDB4NTg5OCwweDU4ODYsMHg1ODgxLDB4NTg3RiwweDU4NzQsMHg1ODhCLDB4NTg3QSwvKiAweDU4LTB4NUYgKi8KKwkweDU4ODcsMHg1ODkxLDB4NTg4RSwweDU4NzYsMHg1ODgyLDB4NTg4OCwweDU4N0IsMHg1ODk0LC8qIDB4NjAtMHg2NyAqLworCTB4NTg4RiwweDU4RkUsMHg1OTZCLDB4NUFEQywweDVBRUUsMHg1QUU1LDB4NUFENSwweDVBRUEsLyogMHg2OC0weDZGICovCisJMHg1QURBLDB4NUFFRCwweDVBRUIsMHg1QUYzLDB4NUFFMiwweDVBRTAsMHg1QURCLDB4NUFFQywvKiAweDcwLTB4NzcgKi8KKwkweDVBREUsMHg1QURELDB4NUFEOSwweDVBRTgsMHg1QURGLDB4NUI3NywweDVCRTAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg1QkUzLDB4NUM2MywweDVEODIsMHg1RDgwLDB4NUQ3RCwweDVEODYsMHg1RDdBLC8qIDB4QTAtMHhBNyAqLworCTB4NUQ4MSwweDVENzcsMHg1RDhBLDB4NUQ4OSwweDVEODgsMHg1RDdFLDB4NUQ3QywweDVEOEQsLyogMHhBOC0weEFGICovCisJMHg1RDc5LDB4NUQ3RiwweDVFNTgsMHg1RTU5LDB4NUU1MywweDVFRDgsMHg1RUQxLDB4NUVENywvKiAweEIwLTB4QjcgKi8KKwkweDVFQ0UsMHg1RURDLDB4NUVENSwweDVFRDksMHg1RUQyLDB4NUVENCwweDVGNDQsMHg1RjQzLC8qIDB4QjgtMHhCRiAqLworCTB4NUY2RiwweDVGQjYsMHg2MTJDLDB4NjEyOCwweDYxNDEsMHg2MTVFLDB4NjE3MSwweDYxNzMsLyogMHhDMC0weEM3ICovCisJMHg2MTUyLDB4NjE1MywweDYxNzIsMHg2MTZDLDB4NjE4MCwweDYxNzQsMHg2MTU0LDB4NjE3QSwvKiAweEM4LTB4Q0YgKi8KKwkweDYxNUIsMHg2MTY1LDB4NjEzQiwweDYxNkEsMHg2MTYxLDB4NjE1NiwweDYyMjksMHg2MjI3LC8qIDB4RDAtMHhENyAqLworCTB4NjIyQiwweDY0MkIsMHg2NDRELDB4NjQ1QiwweDY0NUQsMHg2NDc0LDB4NjQ3NiwweDY0NzIsLyogMHhEOC0weERGICovCisJMHg2NDczLDB4NjQ3RCwweDY0NzUsMHg2NDY2LDB4NjRBNiwweDY0NEUsMHg2NDgyLDB4NjQ1RSwvKiAweEUwLTB4RTcgKi8KKwkweDY0NUMsMHg2NDRCLDB4NjQ1MywweDY0NjAsMHg2NDUwLDB4NjQ3RiwweDY0M0YsMHg2NDZDLC8qIDB4RTgtMHhFRiAqLworCTB4NjQ2QiwweDY0NTksMHg2NDY1LDB4NjQ3NywweDY1NzMsMHg2NUEwLDB4NjZBMSwweDY2QTAsLyogMHhGMC0weEY3ICovCisJMHg2NjlGLDB4NjcwNSwweDY3MDQsMHg2NzIyLDB4NjlCMSwweDY5QjYsMHg2OUM5LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FMlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDY5QTAsMHg2OUNFLDB4Njk5NiwweDY5QjAsMHg2OUFDLDB4NjlCQywweDY5OTEsMHg2OTk5LC8qIDB4NDAtMHg0NyAqLworCTB4Njk4RSwweDY5QTcsMHg2OThELDB4NjlBOSwweDY5QkUsMHg2OUFGLDB4NjlCRiwweDY5QzQsLyogMHg0OC0weDRGICovCisJMHg2OUJELDB4NjlBNCwweDY5RDQsMHg2OUI5LDB4NjlDQSwweDY5OUEsMHg2OUNGLDB4NjlCMywvKiAweDUwLTB4NTcgKi8KKwkweDY5OTMsMHg2OUFBLDB4NjlBMSwweDY5OUUsMHg2OUQ5LDB4Njk5NywweDY5OTAsMHg2OUMyLC8qIDB4NTgtMHg1RiAqLworCTB4NjlCNSwweDY5QTUsMHg2OUM2LDB4NkI0QSwweDZCNEQsMHg2QjRCLDB4NkI5RSwweDZCOUYsLyogMHg2MC0weDY3ICovCisJMHg2QkEwLDB4NkJDMywweDZCQzQsMHg2QkZFLDB4NkVDRSwweDZFRjUsMHg2RUYxLDB4NkYwMywvKiAweDY4LTB4NkYgKi8KKwkweDZGMjUsMHg2RUY4LDB4NkYzNywweDZFRkIsMHg2RjJFLDB4NkYwOSwweDZGNEUsMHg2RjE5LC8qIDB4NzAtMHg3NyAqLworCTB4NkYxQSwweDZGMjcsMHg2RjE4LDB4NkYzQiwweDZGMTIsMHg2RUVELDB4NkYwQSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDZGMzYsMHg2RjczLDB4NkVGOSwweDZFRUUsMHg2RjJELDB4NkY0MCwweDZGMzAsLyogMHhBMC0weEE3ICovCisJMHg2RjNDLDB4NkYzNSwweDZFRUIsMHg2RjA3LDB4NkYwRSwweDZGNDMsMHg2RjA1LDB4NkVGRCwvKiAweEE4LTB4QUYgKi8KKwkweDZFRjYsMHg2RjM5LDB4NkYxQywweDZFRkMsMHg2RjNBLDB4NkYxRiwweDZGMEQsMHg2RjFFLC8qIDB4QjAtMHhCNyAqLworCTB4NkYwOCwweDZGMjEsMHg3MTg3LDB4NzE5MCwweDcxODksMHg3MTgwLDB4NzE4NSwweDcxODIsLyogMHhCOC0weEJGICovCisJMHg3MThGLDB4NzE3QiwweDcxODYsMHg3MTgxLDB4NzE5NywweDcyNDQsMHg3MjUzLDB4NzI5NywvKiAweEMwLTB4QzcgKi8KKwkweDcyOTUsMHg3MjkzLDB4NzM0MywweDczNEQsMHg3MzUxLDB4NzM0QywweDc0NjIsMHg3NDczLC8qIDB4QzgtMHhDRiAqLworCTB4NzQ3MSwweDc0NzUsMHg3NDcyLDB4NzQ2NywweDc0NkUsMHg3NTAwLDB4NzUwMiwweDc1MDMsLyogMHhEMC0weEQ3ICovCisJMHg3NTdELDB4NzU5MCwweDc2MTYsMHg3NjA4LDB4NzYwQywweDc2MTUsMHg3NjExLDB4NzYwQSwvKiAweEQ4LTB4REYgKi8KKwkweDc2MTQsMHg3NkI4LDB4Nzc4MSwweDc3N0MsMHg3Nzg1LDB4Nzc4MiwweDc3NkUsMHg3NzgwLC8qIDB4RTAtMHhFNyAqLworCTB4Nzc2RiwweDc3N0UsMHg3NzgzLDB4NzhCMiwweDc4QUEsMHg3OEI0LDB4NzhBRCwweDc4QTgsLyogMHhFOC0weEVGICovCisJMHg3ODdFLDB4NzhBQiwweDc4OUUsMHg3OEE1LDB4NzhBMCwweDc4QUMsMHg3OEEyLDB4NzhBNCwvKiAweEYwLTB4RjcgKi8KKwkweDc5OTgsMHg3OThBLDB4Nzk4QiwweDc5OTYsMHg3OTk1LDB4Nzk5NCwweDc5OTMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0UzWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4Nzk5NywweDc5ODgsMHg3OTkyLDB4Nzk5MCwweDdBMkIsMHg3QTRBLDB4N0EzMCwweDdBMkYsLyogMHg0MC0weDQ3ICovCisJMHg3QTI4LDB4N0EyNiwweDdBQTgsMHg3QUFCLDB4N0FBQywweDdBRUUsMHg3Qjg4LDB4N0I5QywvKiAweDQ4LTB4NEYgKi8KKwkweDdCOEEsMHg3QjkxLDB4N0I5MCwweDdCOTYsMHg3QjhELDB4N0I4QywweDdCOUIsMHg3QjhFLC8qIDB4NTAtMHg1NyAqLworCTB4N0I4NSwweDdCOTgsMHg1Mjg0LDB4N0I5OSwweDdCQTQsMHg3QjgyLDB4N0NCQiwweDdDQkYsLyogMHg1OC0weDVGICovCisJMHg3Q0JDLDB4N0NCQSwweDdEQTcsMHg3REI3LDB4N0RDMiwweDdEQTMsMHg3REFBLDB4N0RDMSwvKiAweDYwLTB4NjcgKi8KKwkweDdEQzAsMHg3REM1LDB4N0Q5RCwweDdEQ0UsMHg3REM0LDB4N0RDNiwweDdEQ0IsMHg3RENDLC8qIDB4NjgtMHg2RiAqLworCTB4N0RBRiwweDdEQjksMHg3RDk2LDB4N0RCQywweDdEOUYsMHg3REE2LDB4N0RBRSwweDdEQTksLyogMHg3MC0weDc3ICovCisJMHg3REExLDB4N0RDOSwweDdGNzMsMHg3RkUyLDB4N0ZFMywweDdGRTUsMHg3RkRFLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4ODAyNCwweDgwNUQsMHg4MDVDLDB4ODE4OSwweDgxODYsMHg4MTgzLDB4ODE4NywvKiAweEEwLTB4QTcgKi8KKwkweDgxOEQsMHg4MThDLDB4ODE4QiwweDgyMTUsMHg4NDk3LDB4ODRBNCwweDg0QTEsMHg4NDlGLC8qIDB4QTgtMHhBRiAqLworCTB4ODRCQSwweDg0Q0UsMHg4NEMyLDB4ODRBQywweDg0QUUsMHg4NEFCLDB4ODRCOSwweDg0QjQsLyogMHhCMC0weEI3ICovCisJMHg4NEMxLDB4ODRDRCwweDg0QUEsMHg4NDlBLDB4ODRCMSwweDg0RDAsMHg4NDlELDB4ODRBNywvKiAweEI4LTB4QkYgKi8KKwkweDg0QkIsMHg4NEEyLDB4ODQ5NCwweDg0QzcsMHg4NENDLDB4ODQ5QiwweDg0QTksMHg4NEFGLC8qIDB4QzAtMHhDNyAqLworCTB4ODRBOCwweDg0RDYsMHg4NDk4LDB4ODRCNiwweDg0Q0YsMHg4NEEwLDB4ODRENywweDg0RDQsLyogMHhDOC0weENGICovCisJMHg4NEQyLDB4ODREQiwweDg0QjAsMHg4NDkxLDB4ODY2MSwweDg3MzMsMHg4NzIzLDB4ODcyOCwvKiAweEQwLTB4RDcgKi8KKwkweDg3NkIsMHg4NzQwLDB4ODcyRSwweDg3MUUsMHg4NzIxLDB4ODcxOSwweDg3MUIsMHg4NzQzLC8qIDB4RDgtMHhERiAqLworCTB4ODcyQywweDg3NDEsMHg4NzNFLDB4ODc0NiwweDg3MjAsMHg4NzMyLDB4ODcyQSwweDg3MkQsLyogMHhFMC0weEU3ICovCisJMHg4NzNDLDB4ODcxMiwweDg3M0EsMHg4NzMxLDB4ODczNSwweDg3NDIsMHg4NzI2LDB4ODcyNywvKiAweEU4LTB4RUYgKi8KKwkweDg3MzgsMHg4NzI0LDB4ODcxQSwweDg3MzAsMHg4NzExLDB4ODhGNywweDg4RTcsMHg4OEYxLC8qIDB4RjAtMHhGNyAqLworCTB4ODhGMiwweDg4RkEsMHg4OEZFLDB4ODhFRSwweDg4RkMsMHg4OEY2LDB4ODhGQiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4OEYwLDB4ODhFQywweDg4RUIsMHg4OTlELDB4ODlBMSwweDg5OUYsMHg4OTlFLDB4ODlFOSwvKiAweDQwLTB4NDcgKi8KKwkweDg5RUIsMHg4OUU4LDB4OEFBQiwweDhBOTksMHg4QThCLDB4OEE5MiwweDhBOEYsMHg4QTk2LC8qIDB4NDgtMHg0RiAqLworCTB4OEMzRCwweDhDNjgsMHg4QzY5LDB4OENENSwweDhDQ0YsMHg4Q0Q3LDB4OEQ5NiwweDhFMDksLyogMHg1MC0weDU3ICovCisJMHg4RTAyLDB4OERGRiwweDhFMEQsMHg4REZELDB4OEUwQSwweDhFMDMsMHg4RTA3LDB4OEUwNiwvKiAweDU4LTB4NUYgKi8KKwkweDhFMDUsMHg4REZFLDB4OEUwMCwweDhFMDQsMHg4RjEwLDB4OEYxMSwweDhGMEUsMHg4RjBELC8qIDB4NjAtMHg2NyAqLworCTB4OTEyMywweDkxMUMsMHg5MTIwLDB4OTEyMiwweDkxMUYsMHg5MTFELDB4OTExQSwweDkxMjQsLyogMHg2OC0weDZGICovCisJMHg5MTIxLDB4OTExQiwweDkxN0EsMHg5MTcyLDB4OTE3OSwweDkxNzMsMHg5MkE1LDB4OTJBNCwvKiAweDcwLTB4NzcgKi8KKwkweDkyNzYsMHg5MjlCLDB4OTI3QSwweDkyQTAsMHg5Mjk0LDB4OTJBQSwweDkyOEQsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg5MkE2LDB4OTI5QSwweDkyQUIsMHg5Mjc5LDB4OTI5NywweDkyN0YsMHg5MkEzLC8qIDB4QTAtMHhBNyAqLworCTB4OTJFRSwweDkyOEUsMHg5MjgyLDB4OTI5NSwweDkyQTIsMHg5MjdELDB4OTI4OCwweDkyQTEsLyogMHhBOC0weEFGICovCisJMHg5MjhBLDB4OTI4NiwweDkyOEMsMHg5Mjk5LDB4OTJBNywweDkyN0UsMHg5Mjg3LDB4OTJBOSwvKiAweEIwLTB4QjcgKi8KKwkweDkyOUQsMHg5MjhCLDB4OTIyRCwweDk2OUUsMHg5NkExLDB4OTZGRiwweDk3NTgsMHg5NzdELC8qIDB4QjgtMHhCRiAqLworCTB4OTc3QSwweDk3N0UsMHg5NzgzLDB4OTc4MCwweDk3ODIsMHg5NzdCLDB4OTc4NCwweDk3ODEsLyogMHhDMC0weEM3ICovCisJMHg5NzdGLDB4OTdDRSwweDk3Q0QsMHg5ODE2LDB4OThBRCwweDk4QUUsMHg5OTAyLDB4OTkwMCwvKiAweEM4LTB4Q0YgKi8KKwkweDk5MDcsMHg5OTlELDB4OTk5QywweDk5QzMsMHg5OUI5LDB4OTlCQiwweDk5QkEsMHg5OUMyLC8qIDB4RDAtMHhENyAqLworCTB4OTlCRCwweDk5QzcsMHg5QUIxLDB4OUFFMywweDlBRTcsMHg5QjNFLDB4OUIzRiwweDlCNjAsLyogMHhEOC0weERGICovCisJMHg5QjYxLDB4OUI1RiwweDlDRjEsMHg5Q0YyLDB4OUNGNSwweDlFQTcsMHg1MEZGLDB4NTEwMywvKiAweEUwLTB4RTcgKi8KKwkweDUxMzAsMHg1MEY4LDB4NTEwNiwweDUxMDcsMHg1MEY2LDB4NTBGRSwweDUxMEIsMHg1MTBDLC8qIDB4RTgtMHhFRiAqLworCTB4NTBGRCwweDUxMEEsMHg1MjhCLDB4NTI4QywweDUyRjEsMHg1MkVGLDB4NTY0OCwweDU2NDIsLyogMHhGMC0weEY3ICovCisJMHg1NjRDLDB4NTYzNSwweDU2NDEsMHg1NjRBLDB4NTY0OSwweDU2NDYsMHg1NjU4LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FNVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDU2NUEsMHg1NjQwLDB4NTYzMywweDU2M0QsMHg1NjJDLDB4NTYzRSwweDU2MzgsMHg1NjJBLC8qIDB4NDAtMHg0NyAqLworCTB4NTYzQSwweDU3MUEsMHg1OEFCLDB4NTg5RCwweDU4QjEsMHg1OEEwLDB4NThBMywweDU4QUYsLyogMHg0OC0weDRGICovCisJMHg1OEFDLDB4NThBNSwweDU4QTEsMHg1OEZGLDB4NUFGRiwweDVBRjQsMHg1QUZELDB4NUFGNywvKiAweDUwLTB4NTcgKi8KKwkweDVBRjYsMHg1QjAzLDB4NUFGOCwweDVCMDIsMHg1QUY5LDB4NUIwMSwweDVCMDcsMHg1QjA1LC8qIDB4NTgtMHg1RiAqLworCTB4NUIwRiwweDVDNjcsMHg1RDk5LDB4NUQ5NywweDVEOUYsMHg1RDkyLDB4NURBMiwweDVEOTMsLyogMHg2MC0weDY3ICovCisJMHg1RDk1LDB4NURBMCwweDVEOUMsMHg1REExLDB4NUQ5QSwweDVEOUUsMHg1RTY5LDB4NUU1RCwvKiAweDY4LTB4NkYgKi8KKwkweDVFNjAsMHg1RTVDLDB4N0RGMywweDVFREIsMHg1RURFLDB4NUVFMSwweDVGNDksMHg1RkIyLC8qIDB4NzAtMHg3NyAqLworCTB4NjE4QiwweDYxODMsMHg2MTc5LDB4NjFCMSwweDYxQjAsMHg2MUEyLDB4NjE4OSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDYxOUIsMHg2MTkzLDB4NjFBRiwweDYxQUQsMHg2MTlGLDB4NjE5MiwweDYxQUEsLyogMHhBMC0weEE3ICovCisJMHg2MUExLDB4NjE4RCwweDYxNjYsMHg2MUIzLDB4NjIyRCwweDY0NkUsMHg2NDcwLDB4NjQ5NiwvKiAweEE4LTB4QUYgKi8KKwkweDY0QTAsMHg2NDg1LDB4NjQ5NywweDY0OUMsMHg2NDhGLDB4NjQ4QiwweDY0OEEsMHg2NDhDLC8qIDB4QjAtMHhCNyAqLworCTB4NjRBMywweDY0OUYsMHg2NDY4LDB4NjRCMSwweDY0OTgsMHg2NTc2LDB4NjU3QSwweDY1NzksLyogMHhCOC0weEJGICovCisJMHg2NTdCLDB4NjVCMiwweDY1QjMsMHg2NkI1LDB4NjZCMCwweDY2QTksMHg2NkIyLDB4NjZCNywvKiAweEMwLTB4QzcgKi8KKwkweDY2QUEsMHg2NkFGLDB4NkEwMCwweDZBMDYsMHg2QTE3LDB4NjlFNSwweDY5RjgsMHg2QTE1LC8qIDB4QzgtMHhDRiAqLworCTB4NjlGMSwweDY5RTQsMHg2QTIwLDB4NjlGRiwweDY5RUMsMHg2OUUyLDB4NkExQiwweDZBMUQsLyogMHhEMC0weEQ3ICovCisJMHg2OUZFLDB4NkEyNywweDY5RjIsMHg2OUVFLDB4NkExNCwweDY5RjcsMHg2OUU3LDB4NkE0MCwvKiAweEQ4LTB4REYgKi8KKwkweDZBMDgsMHg2OUU2LDB4NjlGQiwweDZBMEQsMHg2OUZDLDB4NjlFQiwweDZBMDksMHg2QTA0LC8qIDB4RTAtMHhFNyAqLworCTB4NkExOCwweDZBMjUsMHg2QTBGLDB4NjlGNiwweDZBMjYsMHg2QTA3LDB4NjlGNCwweDZBMTYsLyogMHhFOC0weEVGICovCisJMHg2QjUxLDB4NkJBNSwweDZCQTMsMHg2QkEyLDB4NkJBNiwweDZDMDEsMHg2QzAwLDB4NkJGRiwvKiAweEYwLTB4RjcgKi8KKwkweDZDMDIsMHg2RjQxLDB4NkYyNiwweDZGN0UsMHg2Rjg3LDB4NkZDNiwweDZGOTIsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0U2WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NkY4RCwweDZGODksMHg2RjhDLDB4NkY2MiwweDZGNEYsMHg2Rjg1LDB4NkY1QSwweDZGOTYsLyogMHg0MC0weDQ3ICovCisJMHg2Rjc2LDB4NkY2QywweDZGODIsMHg2RjU1LDB4NkY3MiwweDZGNTIsMHg2RjUwLDB4NkY1NywvKiAweDQ4LTB4NEYgKi8KKwkweDZGOTQsMHg2RjkzLDB4NkY1RCwweDZGMDAsMHg2RjYxLDB4NkY2QiwweDZGN0QsMHg2RjY3LC8qIDB4NTAtMHg1NyAqLworCTB4NkY5MCwweDZGNTMsMHg2RjhCLDB4NkY2OSwweDZGN0YsMHg2Rjk1LDB4NkY2MywweDZGNzcsLyogMHg1OC0weDVGICovCisJMHg2RjZBLDB4NkY3QiwweDcxQjIsMHg3MUFGLDB4NzE5QiwweDcxQjAsMHg3MUEwLDB4NzE5QSwvKiAweDYwLTB4NjcgKi8KKwkweDcxQTksMHg3MUI1LDB4NzE5RCwweDcxQTUsMHg3MTlFLDB4NzFBNCwweDcxQTEsMHg3MUFBLC8qIDB4NjgtMHg2RiAqLworCTB4NzE5QywweDcxQTcsMHg3MUIzLDB4NzI5OCwweDcyOUEsMHg3MzU4LDB4NzM1MiwweDczNUUsLyogMHg3MC0weDc3ICovCisJMHg3MzVGLDB4NzM2MCwweDczNUQsMHg3MzVCLDB4NzM2MSwweDczNUEsMHg3MzU5LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NzM2MiwweDc0ODcsMHg3NDg5LDB4NzQ4QSwweDc0ODYsMHg3NDgxLDB4NzQ3RCwvKiAweEEwLTB4QTcgKi8KKwkweDc0ODUsMHg3NDg4LDB4NzQ3QywweDc0NzksMHg3NTA4LDB4NzUwNywweDc1N0UsMHg3NjI1LC8qIDB4QTgtMHhBRiAqLworCTB4NzYxRSwweDc2MTksMHg3NjFELDB4NzYxQywweDc2MjMsMHg3NjFBLDB4NzYyOCwweDc2MUIsLyogMHhCMC0weEI3ICovCisJMHg3NjlDLDB4NzY5RCwweDc2OUUsMHg3NjlCLDB4Nzc4RCwweDc3OEYsMHg3Nzg5LDB4Nzc4OCwvKiAweEI4LTB4QkYgKi8KKwkweDc4Q0QsMHg3OEJCLDB4NzhDRiwweDc4Q0MsMHg3OEQxLDB4NzhDRSwweDc4RDQsMHg3OEM4LC8qIDB4QzAtMHhDNyAqLworCTB4NzhDMywweDc4QzQsMHg3OEM5LDB4Nzk5QSwweDc5QTEsMHg3OUEwLDB4Nzk5QywweDc5QTIsLyogMHhDOC0weENGICovCisJMHg3OTlCLDB4NkI3NiwweDdBMzksMHg3QUIyLDB4N0FCNCwweDdBQjMsMHg3QkI3LDB4N0JDQiwvKiAweEQwLTB4RDcgKi8KKwkweDdCQkUsMHg3QkFDLDB4N0JDRSwweDdCQUYsMHg3QkI5LDB4N0JDQSwweDdCQjUsMHg3Q0M1LC8qIDB4RDgtMHhERiAqLworCTB4N0NDOCwweDdDQ0MsMHg3Q0NCLDB4N0RGNywweDdEREIsMHg3REVBLDB4N0RFNywweDdERDcsLyogMHhFMC0weEU3ICovCisJMHg3REUxLDB4N0UwMywweDdERkEsMHg3REU2LDB4N0RGNiwweDdERjEsMHg3REYwLDB4N0RFRSwvKiAweEU4LTB4RUYgKi8KKwkweDdEREYsMHg3Rjc2LDB4N0ZBQywweDdGQjAsMHg3RkFELDB4N0ZFRCwweDdGRUIsMHg3RkVBLC8qIDB4RjAtMHhGNyAqLworCTB4N0ZFQywweDdGRTYsMHg3RkU4LDB4ODA2NCwweDgwNjcsMHg4MUEzLDB4ODE5RiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTdbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4MTlFLDB4ODE5NSwweDgxQTIsMHg4MTk5LDB4ODE5NywweDgyMTYsMHg4MjRGLDB4ODI1MywvKiAweDQwLTB4NDcgKi8KKwkweDgyNTIsMHg4MjUwLDB4ODI0RSwweDgyNTEsMHg4NTI0LDB4ODUzQiwweDg1MEYsMHg4NTAwLC8qIDB4NDgtMHg0RiAqLworCTB4ODUyOSwweDg1MEUsMHg4NTA5LDB4ODUwRCwweDg1MUYsMHg4NTBBLDB4ODUyNywweDg1MUMsLyogMHg1MC0weDU3ICovCisJMHg4NEZCLDB4ODUyQiwweDg0RkEsMHg4NTA4LDB4ODUwQywweDg0RjQsMHg4NTJBLDB4ODRGMiwvKiAweDU4LTB4NUYgKi8KKwkweDg1MTUsMHg4NEY3LDB4ODRFQiwweDg0RjMsMHg4NEZDLDB4ODUxMiwweDg0RUEsMHg4NEU5LC8qIDB4NjAtMHg2NyAqLworCTB4ODUxNiwweDg0RkUsMHg4NTI4LDB4ODUxRCwweDg1MkUsMHg4NTAyLDB4ODRGRCwweDg1MUUsLyogMHg2OC0weDZGICovCisJMHg4NEY2LDB4ODUzMSwweDg1MjYsMHg4NEU3LDB4ODRFOCwweDg0RjAsMHg4NEVGLDB4ODRGOSwvKiAweDcwLTB4NzcgKi8KKwkweDg1MTgsMHg4NTIwLDB4ODUzMCwweDg1MEIsMHg4NTE5LDB4ODUyRiwweDg2NjIsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg4NzU2LDB4ODc2MywweDg3NjQsMHg4Nzc3LDB4ODdFMSwweDg3NzMsMHg4NzU4LC8qIDB4QTAtMHhBNyAqLworCTB4ODc1NCwweDg3NUIsMHg4NzUyLDB4ODc2MSwweDg3NUEsMHg4NzUxLDB4ODc1RSwweDg3NkQsLyogMHhBOC0weEFGICovCisJMHg4NzZBLDB4ODc1MCwweDg3NEUsMHg4NzVGLDB4ODc1RCwweDg3NkYsMHg4NzZDLDB4ODc3QSwvKiAweEIwLTB4QjcgKi8KKwkweDg3NkUsMHg4NzVDLDB4ODc2NSwweDg3NEYsMHg4NzdCLDB4ODc3NSwweDg3NjIsMHg4NzY3LC8qIDB4QjgtMHhCRiAqLworCTB4ODc2OSwweDg4NUEsMHg4OTA1LDB4ODkwQywweDg5MTQsMHg4OTBCLDB4ODkxNywweDg5MTgsLyogMHhDMC0weEM3ICovCisJMHg4OTE5LDB4ODkwNiwweDg5MTYsMHg4OTExLDB4ODkwRSwweDg5MDksMHg4OUEyLDB4ODlBNCwvKiAweEM4LTB4Q0YgKi8KKwkweDg5QTMsMHg4OUVELDB4ODlGMCwweDg5RUMsMHg4QUNGLDB4OEFDNiwweDhBQjgsMHg4QUQzLC8qIDB4RDAtMHhENyAqLworCTB4OEFEMSwweDhBRDQsMHg4QUQ1LDB4OEFCQiwweDhBRDcsMHg4QUJFLDB4OEFDMCwweDhBQzUsLyogMHhEOC0weERGICovCisJMHg4QUQ4LDB4OEFDMywweDhBQkEsMHg4QUJELDB4OEFEOSwweDhDM0UsMHg4QzRELDB4OEM4RiwvKiAweEUwLTB4RTcgKi8KKwkweDhDRTUsMHg4Q0RGLDB4OENEOSwweDhDRTgsMHg4Q0RBLDB4OENERCwweDhDRTcsMHg4REEwLC8qIDB4RTgtMHhFRiAqLworCTB4OEQ5QywweDhEQTEsMHg4RDlCLDB4OEUyMCwweDhFMjMsMHg4RTI1LDB4OEUyNCwweDhFMkUsLyogMHhGMC0weEY3ICovCisJMHg4RTE1LDB4OEUxQiwweDhFMTYsMHg4RTExLDB4OEUxOSwweDhFMjYsMHg4RTI3LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FOFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDhFMTQsMHg4RTEyLDB4OEUxOCwweDhFMTMsMHg4RTFDLDB4OEUxNywweDhFMUEsMHg4RjJDLC8qIDB4NDAtMHg0NyAqLworCTB4OEYyNCwweDhGMTgsMHg4RjFBLDB4OEYyMCwweDhGMjMsMHg4RjE2LDB4OEYxNywweDkwNzMsLyogMHg0OC0weDRGICovCisJMHg5MDcwLDB4OTA2RiwweDkwNjcsMHg5MDZCLDB4OTEyRiwweDkxMkIsMHg5MTI5LDB4OTEyQSwvKiAweDUwLTB4NTcgKi8KKwkweDkxMzIsMHg5MTI2LDB4OTEyRSwweDkxODUsMHg5MTg2LDB4OTE4QSwweDkxODEsMHg5MTgyLC8qIDB4NTgtMHg1RiAqLworCTB4OTE4NCwweDkxODAsMHg5MkQwLDB4OTJDMywweDkyQzQsMHg5MkMwLDB4OTJEOSwweDkyQjYsLyogMHg2MC0weDY3ICovCisJMHg5MkNGLDB4OTJGMSwweDkyREYsMHg5MkQ4LDB4OTJFOSwweDkyRDcsMHg5MkRELDB4OTJDQywvKiAweDY4LTB4NkYgKi8KKwkweDkyRUYsMHg5MkMyLDB4OTJFOCwweDkyQ0EsMHg5MkM4LDB4OTJDRSwweDkyRTYsMHg5MkNELC8qIDB4NzAtMHg3NyAqLworCTB4OTJENSwweDkyQzksMHg5MkUwLDB4OTJERSwweDkyRTcsMHg5MkQxLDB4OTJEMywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDkyQjUsMHg5MkUxLDB4OTJDNiwweDkyQjQsMHg5NTdDLDB4OTVBQywweDk1QUIsLyogMHhBMC0weEE3ICovCisJMHg5NUFFLDB4OTVCMCwweDk2QTQsMHg5NkEyLDB4OTZEMywweDk3MDUsMHg5NzA4LDB4OTcwMiwvKiAweEE4LTB4QUYgKi8KKwkweDk3NUEsMHg5NzhBLDB4OTc4RSwweDk3ODgsMHg5N0QwLDB4OTdDRiwweDk4MUUsMHg5ODFELC8qIDB4QjAtMHhCNyAqLworCTB4OTgyNiwweDk4MjksMHg5ODI4LDB4OTgyMCwweDk4MUIsMHg5ODI3LDB4OThCMiwweDk5MDgsLyogMHhCOC0weEJGICovCisJMHg5OEZBLDB4OTkxMSwweDk5MTQsMHg5OTE2LDB4OTkxNywweDk5MTUsMHg5OURDLDB4OTlDRCwvKiAweEMwLTB4QzcgKi8KKwkweDk5Q0YsMHg5OUQzLDB4OTlENCwweDk5Q0UsMHg5OUM5LDB4OTlENiwweDk5RDgsMHg5OUNCLC8qIDB4QzgtMHhDRiAqLworCTB4OTlENywweDk5Q0MsMHg5QUIzLDB4OUFFQywweDlBRUIsMHg5QUYzLDB4OUFGMiwweDlBRjEsLyogMHhEMC0weEQ3ICovCisJMHg5QjQ2LDB4OUI0MywweDlCNjcsMHg5Qjc0LDB4OUI3MSwweDlCNjYsMHg5Qjc2LDB4OUI3NSwvKiAweEQ4LTB4REYgKi8KKwkweDlCNzAsMHg5QjY4LDB4OUI2NCwweDlCNkMsMHg5Q0ZDLDB4OUNGQSwweDlDRkQsMHg5Q0ZGLC8qIDB4RTAtMHhFNyAqLworCTB4OUNGNywweDlEMDcsMHg5RDAwLDB4OUNGOSwweDlDRkIsMHg5RDA4LDB4OUQwNSwweDlEMDQsLyogMHhFOC0weEVGICovCisJMHg5RTgzLDB4OUVEMywweDlGMEYsMHg5RjEwLDB4NTExQywweDUxMTMsMHg1MTE3LDB4NTExQSwvKiAweEYwLTB4RjcgKi8KKwkweDUxMTEsMHg1MURFLDB4NTMzNCwweDUzRTEsMHg1NjcwLDB4NTY2MCwweDU2NkUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0U5WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NTY3MywweDU2NjYsMHg1NjYzLDB4NTY2RCwweDU2NzIsMHg1NjVFLDB4NTY3NywweDU3MUMsLyogMHg0MC0weDQ3ICovCisJMHg1NzFCLDB4NThDOCwweDU4QkQsMHg1OEM5LDB4NThCRiwweDU4QkEsMHg1OEMyLDB4NThCQywvKiAweDQ4LTB4NEYgKi8KKwkweDU4QzYsMHg1QjE3LDB4NUIxOSwweDVCMUIsMHg1QjIxLDB4NUIxNCwweDVCMTMsMHg1QjEwLC8qIDB4NTAtMHg1NyAqLworCTB4NUIxNiwweDVCMjgsMHg1QjFBLDB4NUIyMCwweDVCMUUsMHg1QkVGLDB4NURBQywweDVEQjEsLyogMHg1OC0weDVGICovCisJMHg1REE5LDB4NURBNywweDVEQjUsMHg1REIwLDB4NURBRSwweDVEQUEsMHg1REE4LDB4NURCMiwvKiAweDYwLTB4NjcgKi8KKwkweDVEQUQsMHg1REFGLDB4NURCNCwweDVFNjcsMHg1RTY4LDB4NUU2NiwweDVFNkYsMHg1RUU5LC8qIDB4NjgtMHg2RiAqLworCTB4NUVFNywweDVFRTYsMHg1RUU4LDB4NUVFNSwweDVGNEIsMHg1RkJDLDB4NjE5RCwweDYxQTgsLyogMHg3MC0weDc3ICovCisJMHg2MTk2LDB4NjFDNSwweDYxQjQsMHg2MUM2LDB4NjFDMSwweDYxQ0MsMHg2MUJBLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NjFCRiwweDYxQjgsMHg2MThDLDB4NjRENywweDY0RDYsMHg2NEQwLDB4NjRDRiwvKiAweEEwLTB4QTcgKi8KKwkweDY0QzksMHg2NEJELDB4NjQ4OSwweDY0QzMsMHg2NERCLDB4NjRGMywweDY0RDksMHg2NTMzLC8qIDB4QTgtMHhBRiAqLworCTB4NjU3RiwweDY1N0MsMHg2NUEyLDB4NjZDOCwweDY2QkUsMHg2NkMwLDB4NjZDQSwweDY2Q0IsLyogMHhCMC0weEI3ICovCisJMHg2NkNGLDB4NjZCRCwweDY2QkIsMHg2NkJBLDB4NjZDQywweDY3MjMsMHg2QTM0LDB4NkE2NiwvKiAweEI4LTB4QkYgKi8KKwkweDZBNDksMHg2QTY3LDB4NkEzMiwweDZBNjgsMHg2QTNFLDB4NkE1RCwweDZBNkQsMHg2QTc2LC8qIDB4QzAtMHhDNyAqLworCTB4NkE1QiwweDZBNTEsMHg2QTI4LDB4NkE1QSwweDZBM0IsMHg2QTNGLDB4NkE0MSwweDZBNkEsLyogMHhDOC0weENGICovCisJMHg2QTY0LDB4NkE1MCwweDZBNEYsMHg2QTU0LDB4NkE2RiwweDZBNjksMHg2QTYwLDB4NkEzQywvKiAweEQwLTB4RDcgKi8KKwkweDZBNUUsMHg2QTU2LDB4NkE1NSwweDZBNEQsMHg2QTRFLDB4NkE0NiwweDZCNTUsMHg2QjU0LC8qIDB4RDgtMHhERiAqLworCTB4NkI1NiwweDZCQTcsMHg2QkFBLDB4NkJBQiwweDZCQzgsMHg2QkM3LDB4NkMwNCwweDZDMDMsLyogMHhFMC0weEU3ICovCisJMHg2QzA2LDB4NkZBRCwweDZGQ0IsMHg2RkEzLDB4NkZDNywweDZGQkMsMHg2RkNFLDB4NkZDOCwvKiAweEU4LTB4RUYgKi8KKwkweDZGNUUsMHg2RkM0LDB4NkZCRCwweDZGOUUsMHg2RkNBLDB4NkZBOCwweDcwMDQsMHg2RkE1LC8qIDB4RjAtMHhGNyAqLworCTB4NkZBRSwweDZGQkEsMHg2RkFDLDB4NkZBQSwweDZGQ0YsMHg2RkJGLDB4NkZCOCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRUFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2RkEyLDB4NkZDOSwweDZGQUIsMHg2RkNELDB4NkZBRiwweDZGQjIsMHg2RkIwLDB4NzFDNSwvKiAweDQwLTB4NDcgKi8KKwkweDcxQzIsMHg3MUJGLDB4NzFCOCwweDcxRDYsMHg3MUMwLDB4NzFDMSwweDcxQ0IsMHg3MUQ0LC8qIDB4NDgtMHg0RiAqLworCTB4NzFDQSwweDcxQzcsMHg3MUNGLDB4NzFCRCwweDcxRDgsMHg3MUJDLDB4NzFDNiwweDcxREEsLyogMHg1MC0weDU3ICovCisJMHg3MURCLDB4NzI5RCwweDcyOUUsMHg3MzY5LDB4NzM2NiwweDczNjcsMHg3MzZDLDB4NzM2NSwvKiAweDU4LTB4NUYgKi8KKwkweDczNkIsMHg3MzZBLDB4NzQ3RiwweDc0OUEsMHg3NEEwLDB4NzQ5NCwweDc0OTIsMHg3NDk1LC8qIDB4NjAtMHg2NyAqLworCTB4NzRBMSwweDc1MEIsMHg3NTgwLDB4NzYyRiwweDc2MkQsMHg3NjMxLDB4NzYzRCwweDc2MzMsLyogMHg2OC0weDZGICovCisJMHg3NjNDLDB4NzYzNSwweDc2MzIsMHg3NjMwLDB4NzZCQiwweDc2RTYsMHg3NzlBLDB4Nzc5RCwvKiAweDcwLTB4NzcgKi8KKwkweDc3QTEsMHg3NzlDLDB4Nzc5QiwweDc3QTIsMHg3N0EzLDB4Nzc5NSwweDc3OTksMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3Nzk3LDB4NzhERCwweDc4RTksMHg3OEU1LDB4NzhFQSwweDc4REUsMHg3OEUzLC8qIDB4QTAtMHhBNyAqLworCTB4NzhEQiwweDc4RTEsMHg3OEUyLDB4NzhFRCwweDc4REYsMHg3OEUwLDB4NzlBNCwweDdBNDQsLyogMHhBOC0weEFGICovCisJMHg3QTQ4LDB4N0E0NywweDdBQjYsMHg3QUI4LDB4N0FCNSwweDdBQjEsMHg3QUI3LDB4N0JERSwvKiAweEIwLTB4QjcgKi8KKwkweDdCRTMsMHg3QkU3LDB4N0JERCwweDdCRDUsMHg3QkU1LDB4N0JEQSwweDdCRTgsMHg3QkY5LC8qIDB4QjgtMHhCRiAqLworCTB4N0JENCwweDdCRUEsMHg3QkUyLDB4N0JEQywweDdCRUIsMHg3QkQ4LDB4N0JERiwweDdDRDIsLyogMHhDMC0weEM3ICovCisJMHg3Q0Q0LDB4N0NENywweDdDRDAsMHg3Q0QxLDB4N0UxMiwweDdFMjEsMHg3RTE3LDB4N0UwQywvKiAweEM4LTB4Q0YgKi8KKwkweDdFMUYsMHg3RTIwLDB4N0UxMywweDdFMEUsMHg3RTFDLDB4N0UxNSwweDdFMUEsMHg3RTIyLC8qIDB4RDAtMHhENyAqLworCTB4N0UwQiwweDdFMEYsMHg3RTE2LDB4N0UwRCwweDdFMTQsMHg3RTI1LDB4N0UyNCwweDdGNDMsLyogMHhEOC0weERGICovCisJMHg3RjdCLDB4N0Y3QywweDdGN0EsMHg3RkIxLDB4N0ZFRiwweDgwMkEsMHg4MDI5LDB4ODA2QywvKiAweEUwLTB4RTcgKi8KKwkweDgxQjEsMHg4MUE2LDB4ODFBRSwweDgxQjksMHg4MUI1LDB4ODFBQiwweDgxQjAsMHg4MUFDLC8qIDB4RTgtMHhFRiAqLworCTB4ODFCNCwweDgxQjIsMHg4MUI3LDB4ODFBNywweDgxRjIsMHg4MjU1LDB4ODI1NiwweDgyNTcsLyogMHhGMC0weEY3ICovCisJMHg4NTU2LDB4ODU0NSwweDg1NkIsMHg4NTRELDB4ODU1MywweDg1NjEsMHg4NTU4LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FQlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDg1NDAsMHg4NTQ2LDB4ODU2NCwweDg1NDEsMHg4NTYyLDB4ODU0NCwweDg1NTEsMHg4NTQ3LC8qIDB4NDAtMHg0NyAqLworCTB4ODU2MywweDg1M0UsMHg4NTVCLDB4ODU3MSwweDg1NEUsMHg4NTZFLDB4ODU3NSwweDg1NTUsLyogMHg0OC0weDRGICovCisJMHg4NTY3LDB4ODU2MCwweDg1OEMsMHg4NTY2LDB4ODU1RCwweDg1NTQsMHg4NTY1LDB4ODU2QywvKiAweDUwLTB4NTcgKi8KKwkweDg2NjMsMHg4NjY1LDB4ODY2NCwweDg3OUIsMHg4NzhGLDB4ODc5NywweDg3OTMsMHg4NzkyLC8qIDB4NTgtMHg1RiAqLworCTB4ODc4OCwweDg3ODEsMHg4Nzk2LDB4ODc5OCwweDg3NzksMHg4Nzg3LDB4ODdBMywweDg3ODUsLyogMHg2MC0weDY3ICovCisJMHg4NzkwLDB4ODc5MSwweDg3OUQsMHg4Nzg0LDB4ODc5NCwweDg3OUMsMHg4NzlBLDB4ODc4OSwvKiAweDY4LTB4NkYgKi8KKwkweDg5MUUsMHg4OTI2LDB4ODkzMCwweDg5MkQsMHg4OTJFLDB4ODkyNywweDg5MzEsMHg4OTIyLC8qIDB4NzAtMHg3NyAqLworCTB4ODkyOSwweDg5MjMsMHg4OTJGLDB4ODkyQywweDg5MUYsMHg4OUYxLDB4OEFFMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDhBRTIsMHg4QUYyLDB4OEFGNCwweDhBRjUsMHg4QURELDB4OEIxNCwweDhBRTQsLyogMHhBMC0weEE3ICovCisJMHg4QURGLDB4OEFGMCwweDhBQzgsMHg4QURFLDB4OEFFMSwweDhBRTgsMHg4QUZGLDB4OEFFRiwvKiAweEE4LTB4QUYgKi8KKwkweDhBRkIsMHg4QzkxLDB4OEM5MiwweDhDOTAsMHg4Q0Y1LDB4OENFRSwweDhDRjEsMHg4Q0YwLC8qIDB4QjAtMHhCNyAqLworCTB4OENGMywweDhENkMsMHg4RDZFLDB4OERBNSwweDhEQTcsMHg4RTMzLDB4OEUzRSwweDhFMzgsLyogMHhCOC0weEJGICovCisJMHg4RTQwLDB4OEU0NSwweDhFMzYsMHg4RTNDLDB4OEUzRCwweDhFNDEsMHg4RTMwLDB4OEUzRiwvKiAweEMwLTB4QzcgKi8KKwkweDhFQkQsMHg4RjM2LDB4OEYyRSwweDhGMzUsMHg4RjMyLDB4OEYzOSwweDhGMzcsMHg4RjM0LC8qIDB4QzgtMHhDRiAqLworCTB4OTA3NiwweDkwNzksMHg5MDdCLDB4OTA4NiwweDkwRkEsMHg5MTMzLDB4OTEzNSwweDkxMzYsLyogMHhEMC0weEQ3ICovCisJMHg5MTkzLDB4OTE5MCwweDkxOTEsMHg5MThELDB4OTE4RiwweDkzMjcsMHg5MzFFLDB4OTMwOCwvKiAweEQ4LTB4REYgKi8KKwkweDkzMUYsMHg5MzA2LDB4OTMwRiwweDkzN0EsMHg5MzM4LDB4OTMzQywweDkzMUIsMHg5MzIzLC8qIDB4RTAtMHhFNyAqLworCTB4OTMxMiwweDkzMDEsMHg5MzQ2LDB4OTMyRCwweDkzMEUsMHg5MzBELDB4OTJDQiwweDkzMUQsLyogMHhFOC0weEVGICovCisJMHg5MkZBLDB4OTMyNSwweDkzMTMsMHg5MkY5LDB4OTJGNywweDkzMzQsMHg5MzAyLDB4OTMyNCwvKiAweEYwLTB4RjcgKi8KKwkweDkyRkYsMHg5MzI5LDB4OTMzOSwweDkzMzUsMHg5MzJBLDB4OTMxNCwweDkzMEMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0VDWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTMwQiwweDkyRkUsMHg5MzA5LDB4OTMwMCwweDkyRkIsMHg5MzE2LDB4OTVCQywweDk1Q0QsLyogMHg0MC0weDQ3ICovCisJMHg5NUJFLDB4OTVCOSwweDk1QkEsMHg5NUI2LDB4OTVCRiwweDk1QjUsMHg5NUJELDB4OTZBOSwvKiAweDQ4LTB4NEYgKi8KKwkweDk2RDQsMHg5NzBCLDB4OTcxMiwweDk3MTAsMHg5Nzk5LDB4OTc5NywweDk3OTQsMHg5N0YwLC8qIDB4NTAtMHg1NyAqLworCTB4OTdGOCwweDk4MzUsMHg5ODJGLDB4OTgzMiwweDk5MjQsMHg5OTFGLDB4OTkyNywweDk5MjksLyogMHg1OC0weDVGICovCisJMHg5OTlFLDB4OTlFRSwweDk5RUMsMHg5OUU1LDB4OTlFNCwweDk5RjAsMHg5OUUzLDB4OTlFQSwvKiAweDYwLTB4NjcgKi8KKwkweDk5RTksMHg5OUU3LDB4OUFCOSwweDlBQkYsMHg5QUI0LDB4OUFCQiwweDlBRjYsMHg5QUZBLC8qIDB4NjgtMHg2RiAqLworCTB4OUFGOSwweDlBRjcsMHg5QjMzLDB4OUI4MCwweDlCODUsMHg5Qjg3LDB4OUI3QywweDlCN0UsLyogMHg3MC0weDc3ICovCisJMHg5QjdCLDB4OUI4MiwweDlCOTMsMHg5QjkyLDB4OUI5MCwweDlCN0EsMHg5Qjk1LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OUI3RCwweDlCODgsMHg5RDI1LDB4OUQxNywweDlEMjAsMHg5RDFFLDB4OUQxNCwvKiAweEEwLTB4QTcgKi8KKwkweDlEMjksMHg5RDFELDB4OUQxOCwweDlEMjIsMHg5RDEwLDB4OUQxOSwweDlEMUYsMHg5RTg4LC8qIDB4QTgtMHhBRiAqLworCTB4OUU4NiwweDlFODcsMHg5RUFFLDB4OUVBRCwweDlFRDUsMHg5RUQ2LDB4OUVGQSwweDlGMTIsLyogMHhCMC0weEI3ICovCisJMHg5RjNELDB4NTEyNiwweDUxMjUsMHg1MTIyLDB4NTEyNCwweDUxMjAsMHg1MTI5LDB4NTJGNCwvKiAweEI4LTB4QkYgKi8KKwkweDU2OTMsMHg1NjhDLDB4NTY4RCwweDU2ODYsMHg1Njg0LDB4NTY4MywweDU2N0UsMHg1NjgyLC8qIDB4QzAtMHhDNyAqLworCTB4NTY3RiwweDU2ODEsMHg1OEQ2LDB4NThENCwweDU4Q0YsMHg1OEQyLDB4NUIyRCwweDVCMjUsLyogMHhDOC0weENGICovCisJMHg1QjMyLDB4NUIyMywweDVCMkMsMHg1QjI3LDB4NUIyNiwweDVCMkYsMHg1QjJFLDB4NUI3QiwvKiAweEQwLTB4RDcgKi8KKwkweDVCRjEsMHg1QkYyLDB4NURCNywweDVFNkMsMHg1RTZBLDB4NUZCRSwweDVGQkIsMHg2MUMzLC8qIDB4RDgtMHhERiAqLworCTB4NjFCNSwweDYxQkMsMHg2MUU3LDB4NjFFMCwweDYxRTUsMHg2MUU0LDB4NjFFOCwweDYxREUsLyogMHhFMC0weEU3ICovCisJMHg2NEVGLDB4NjRFOSwweDY0RTMsMHg2NEVCLDB4NjRFNCwweDY0RTgsMHg2NTgxLDB4NjU4MCwvKiAweEU4LTB4RUYgKi8KKwkweDY1QjYsMHg2NURBLDB4NjZEMiwweDZBOEQsMHg2QTk2LDB4NkE4MSwweDZBQTUsMHg2QTg5LC8qIDB4RjAtMHhGNyAqLworCTB4NkE5RiwweDZBOUIsMHg2QUExLDB4NkE5RSwweDZBODcsMHg2QTkzLDB4NkE4RSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRURbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2QTk1LDB4NkE4MywweDZBQTgsMHg2QUE0LDB4NkE5MSwweDZBN0YsMHg2QUE2LDB4NkE5QSwvKiAweDQwLTB4NDcgKi8KKwkweDZBODUsMHg2QThDLDB4NkE5MiwweDZCNUIsMHg2QkFELDB4NkMwOSwweDZGQ0MsMHg2RkE5LC8qIDB4NDgtMHg0RiAqLworCTB4NkZGNCwweDZGRDQsMHg2RkUzLDB4NkZEQywweDZGRUQsMHg2RkU3LDB4NkZFNiwweDZGREUsLyogMHg1MC0weDU3ICovCisJMHg2RkYyLDB4NkZERCwweDZGRTIsMHg2RkU4LDB4NzFFMSwweDcxRjEsMHg3MUU4LDB4NzFGMiwvKiAweDU4LTB4NUYgKi8KKwkweDcxRTQsMHg3MUYwLDB4NzFFMiwweDczNzMsMHg3MzZFLDB4NzM2RiwweDc0OTcsMHg3NEIyLC8qIDB4NjAtMHg2NyAqLworCTB4NzRBQiwweDc0OTAsMHg3NEFBLDB4NzRBRCwweDc0QjEsMHg3NEE1LDB4NzRBRiwweDc1MTAsLyogMHg2OC0weDZGICovCisJMHg3NTExLDB4NzUxMiwweDc1MEYsMHg3NTg0LDB4NzY0MywweDc2NDgsMHg3NjQ5LDB4NzY0NywvKiAweDcwLTB4NzcgKi8KKwkweDc2QTQsMHg3NkU5LDB4NzdCNSwweDc3QUIsMHg3N0IyLDB4NzdCNywweDc3QjYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3N0I0LDB4NzdCMSwweDc3QTgsMHg3N0YwLDB4NzhGMywweDc4RkQsMHg3OTAyLC8qIDB4QTAtMHhBNyAqLworCTB4NzhGQiwweDc4RkMsMHg3OEYyLDB4NzkwNSwweDc4RjksMHg3OEZFLDB4NzkwNCwweDc5QUIsLyogMHhBOC0weEFGICovCisJMHg3OUE4LDB4N0E1QywweDdBNUIsMHg3QTU2LDB4N0E1OCwweDdBNTQsMHg3QTVBLDB4N0FCRSwvKiAweEIwLTB4QjcgKi8KKwkweDdBQzAsMHg3QUMxLDB4N0MwNSwweDdDMEYsMHg3QkYyLDB4N0MwMCwweDdCRkYsMHg3QkZCLC8qIDB4QjgtMHhCRiAqLworCTB4N0MwRSwweDdCRjQsMHg3QzBCLDB4N0JGMywweDdDMDIsMHg3QzA5LDB4N0MwMywweDdDMDEsLyogMHhDMC0weEM3ICovCisJMHg3QkY4LDB4N0JGRCwweDdDMDYsMHg3QkYwLDB4N0JGMSwweDdDMTAsMHg3QzBBLDB4N0NFOCwvKiAweEM4LTB4Q0YgKi8KKwkweDdFMkQsMHg3RTNDLDB4N0U0MiwweDdFMzMsMHg5ODQ4LDB4N0UzOCwweDdFMkEsMHg3RTQ5LC8qIDB4RDAtMHhENyAqLworCTB4N0U0MCwweDdFNDcsMHg3RTI5LDB4N0U0QywweDdFMzAsMHg3RTNCLDB4N0UzNiwweDdFNDQsLyogMHhEOC0weERGICovCisJMHg3RTNBLDB4N0Y0NSwweDdGN0YsMHg3RjdFLDB4N0Y3RCwweDdGRjQsMHg3RkYyLDB4ODAyQywvKiAweEUwLTB4RTcgKi8KKwkweDgxQkIsMHg4MUM0LDB4ODFDQywweDgxQ0EsMHg4MUM1LDB4ODFDNywweDgxQkMsMHg4MUU5LC8qIDB4RTgtMHhFRiAqLworCTB4ODI1QiwweDgyNUEsMHg4MjVDLDB4ODU4MywweDg1ODAsMHg4NThGLDB4ODVBNywweDg1OTUsLyogMHhGMC0weEY3ICovCisJMHg4NUEwLDB4ODU4QiwweDg1QTMsMHg4NTdCLDB4ODVBNCwweDg1OUEsMHg4NTlFLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FRVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDg1NzcsMHg4NTdDLDB4ODU4OSwweDg1QTEsMHg4NTdBLDB4ODU3OCwweDg1NTcsMHg4NThFLC8qIDB4NDAtMHg0NyAqLworCTB4ODU5NiwweDg1ODYsMHg4NThELDB4ODU5OSwweDg1OUQsMHg4NTgxLDB4ODVBMiwweDg1ODIsLyogMHg0OC0weDRGICovCisJMHg4NTg4LDB4ODU4NSwweDg1NzksMHg4NTc2LDB4ODU5OCwweDg1OTAsMHg4NTlGLDB4ODY2OCwvKiAweDUwLTB4NTcgKi8KKwkweDg3QkUsMHg4N0FBLDB4ODdBRCwweDg3QzUsMHg4N0IwLDB4ODdBQywweDg3QjksMHg4N0I1LC8qIDB4NTgtMHg1RiAqLworCTB4ODdCQywweDg3QUUsMHg4N0M5LDB4ODdDMywweDg3QzIsMHg4N0NDLDB4ODdCNywweDg3QUYsLyogMHg2MC0weDY3ICovCisJMHg4N0M0LDB4ODdDQSwweDg3QjQsMHg4N0I2LDB4ODdCRiwweDg3QjgsMHg4N0JELDB4ODdERSwvKiAweDY4LTB4NkYgKi8KKwkweDg3QjIsMHg4OTM1LDB4ODkzMywweDg5M0MsMHg4OTNFLDB4ODk0MSwweDg5NTIsMHg4OTM3LC8qIDB4NzAtMHg3NyAqLworCTB4ODk0MiwweDg5QUQsMHg4OUFGLDB4ODlBRSwweDg5RjIsMHg4OUYzLDB4OEIxRSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDhCMTgsMHg4QjE2LDB4OEIxMSwweDhCMDUsMHg4QjBCLDB4OEIyMiwweDhCMEYsLyogMHhBMC0weEE3ICovCisJMHg4QjEyLDB4OEIxNSwweDhCMDcsMHg4QjBELDB4OEIwOCwweDhCMDYsMHg4QjFDLDB4OEIxMywvKiAweEE4LTB4QUYgKi8KKwkweDhCMUEsMHg4QzRGLDB4OEM3MCwweDhDNzIsMHg4QzcxLDB4OEM2RiwweDhDOTUsMHg4Qzk0LC8qIDB4QjAtMHhCNyAqLworCTB4OENGOSwweDhENkYsMHg4RTRFLDB4OEU0RCwweDhFNTMsMHg4RTUwLDB4OEU0QywweDhFNDcsLyogMHhCOC0weEJGICovCisJMHg4RjQzLDB4OEY0MCwweDkwODUsMHg5MDdFLDB4OTEzOCwweDkxOUEsMHg5MUEyLDB4OTE5QiwvKiAweEMwLTB4QzcgKi8KKwkweDkxOTksMHg5MTlGLDB4OTFBMSwweDkxOUQsMHg5MUEwLDB4OTNBMSwweDkzODMsMHg5M0FGLC8qIDB4QzgtMHhDRiAqLworCTB4OTM2NCwweDkzNTYsMHg5MzQ3LDB4OTM3QywweDkzNTgsMHg5MzVDLDB4OTM3NiwweDkzNDksLyogMHhEMC0weEQ3ICovCisJMHg5MzUwLDB4OTM1MSwweDkzNjAsMHg5MzZELDB4OTM4RiwweDkzNEMsMHg5MzZBLDB4OTM3OSwvKiAweEQ4LTB4REYgKi8KKwkweDkzNTcsMHg5MzU1LDB4OTM1MiwweDkzNEYsMHg5MzcxLDB4OTM3NywweDkzN0IsMHg5MzYxLC8qIDB4RTAtMHhFNyAqLworCTB4OTM1RSwweDkzNjMsMHg5MzY3LDB4OTM4MCwweDkzNEUsMHg5MzU5LDB4OTVDNywweDk1QzAsLyogMHhFOC0weEVGICovCisJMHg5NUM5LDB4OTVDMywweDk1QzUsMHg5NUI3LDB4OTZBRSwweDk2QjAsMHg5NkFDLDB4OTcyMCwvKiAweEYwLTB4RjcgKi8KKwkweDk3MUYsMHg5NzE4LDB4OTcxRCwweDk3MTksMHg5NzlBLDB4OTdBMSwweDk3OUMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0VGWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTc5RSwweDk3OUQsMHg5N0Q1LDB4OTdENCwweDk3RjEsMHg5ODQxLDB4OTg0NCwweDk4NEEsLyogMHg0MC0weDQ3ICovCisJMHg5ODQ5LDB4OTg0NSwweDk4NDMsMHg5OTI1LDB4OTkyQiwweDk5MkMsMHg5OTJBLDB4OTkzMywvKiAweDQ4LTB4NEYgKi8KKwkweDk5MzIsMHg5OTJGLDB4OTkyRCwweDk5MzEsMHg5OTMwLDB4OTk5OCwweDk5QTMsMHg5OUExLC8qIDB4NTAtMHg1NyAqLworCTB4OUEwMiwweDk5RkEsMHg5OUY0LDB4OTlGNywweDk5RjksMHg5OUY4LDB4OTlGNiwweDk5RkIsLyogMHg1OC0weDVGICovCisJMHg5OUZELDB4OTlGRSwweDk5RkMsMHg5QTAzLDB4OUFCRSwweDlBRkUsMHg5QUZELDB4OUIwMSwvKiAweDYwLTB4NjcgKi8KKwkweDlBRkMsMHg5QjQ4LDB4OUI5QSwweDlCQTgsMHg5QjlFLDB4OUI5QiwweDlCQTYsMHg5QkExLC8qIDB4NjgtMHg2RiAqLworCTB4OUJBNSwweDlCQTQsMHg5Qjg2LDB4OUJBMiwweDlCQTAsMHg5QkFGLDB4OUQzMywweDlENDEsLyogMHg3MC0weDc3ICovCisJMHg5RDY3LDB4OUQzNiwweDlEMkUsMHg5RDJGLDB4OUQzMSwweDlEMzgsMHg5RDMwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OUQ0NSwweDlENDIsMHg5RDQzLDB4OUQzRSwweDlEMzcsMHg5RDQwLDB4OUQzRCwvKiAweEEwLTB4QTcgKi8KKwkweDdGRjUsMHg5RDJELDB4OUU4QSwweDlFODksMHg5RThELDB4OUVCMCwweDlFQzgsMHg5RURBLC8qIDB4QTgtMHhBRiAqLworCTB4OUVGQiwweDlFRkYsMHg5RjI0LDB4OUYyMywweDlGMjIsMHg5RjU0LDB4OUZBMCwweDUxMzEsLyogMHhCMC0weEI3ICovCisJMHg1MTJELDB4NTEyRSwweDU2OTgsMHg1NjlDLDB4NTY5NywweDU2OUEsMHg1NjlELDB4NTY5OSwvKiAweEI4LTB4QkYgKi8KKwkweDU5NzAsMHg1QjNDLDB4NUM2OSwweDVDNkEsMHg1REMwLDB4NUU2RCwweDVFNkUsMHg2MUQ4LC8qIDB4QzAtMHhDNyAqLworCTB4NjFERiwweDYxRUQsMHg2MUVFLDB4NjFGMSwweDYxRUEsMHg2MUYwLDB4NjFFQiwweDYxRDYsLyogMHhDOC0weENGICovCisJMHg2MUU5LDB4NjRGRiwweDY1MDQsMHg2NEZELDB4NjRGOCwweDY1MDEsMHg2NTAzLDB4NjRGQywvKiAweEQwLTB4RDcgKi8KKwkweDY1OTQsMHg2NURCLDB4NjZEQSwweDY2REIsMHg2NkQ4LDB4NkFDNSwweDZBQjksMHg2QUJELC8qIDB4RDgtMHhERiAqLworCTB4NkFFMSwweDZBQzYsMHg2QUJBLDB4NkFCNiwweDZBQjcsMHg2QUM3LDB4NkFCNCwweDZBQUQsLyogMHhFMC0weEU3ICovCisJMHg2QjVFLDB4NkJDOSwweDZDMEIsMHg3MDA3LDB4NzAwQywweDcwMEQsMHg3MDAxLDB4NzAwNSwvKiAweEU4LTB4RUYgKi8KKwkweDcwMTQsMHg3MDBFLDB4NkZGRiwweDcwMDAsMHg2RkZCLDB4NzAyNiwweDZGRkMsMHg2RkY3LC8qIDB4RjAtMHhGNyAqLworCTB4NzAwQSwweDcyMDEsMHg3MUZGLDB4NzFGOSwweDcyMDMsMHg3MUZELDB4NzM3NiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRjBbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3NEI4LDB4NzRDMCwweDc0QjUsMHg3NEMxLDB4NzRCRSwweDc0QjYsMHg3NEJCLDB4NzRDMiwvKiAweDQwLTB4NDcgKi8KKwkweDc1MTQsMHg3NTEzLDB4NzY1QywweDc2NjQsMHg3NjU5LDB4NzY1MCwweDc2NTMsMHg3NjU3LC8qIDB4NDgtMHg0RiAqLworCTB4NzY1QSwweDc2QTYsMHg3NkJELDB4NzZFQywweDc3QzIsMHg3N0JBLDB4NzhGRiwweDc5MEMsLyogMHg1MC0weDU3ICovCisJMHg3OTEzLDB4NzkxNCwweDc5MDksMHg3OTEwLDB4NzkxMiwweDc5MTEsMHg3OUFELDB4NzlBQywvKiAweDU4LTB4NUYgKi8KKwkweDdBNUYsMHg3QzFDLDB4N0MyOSwweDdDMTksMHg3QzIwLDB4N0MxRiwweDdDMkQsMHg3QzFELC8qIDB4NjAtMHg2NyAqLworCTB4N0MyNiwweDdDMjgsMHg3QzIyLDB4N0MyNSwweDdDMzAsMHg3RTVDLDB4N0U1MCwweDdFNTYsLyogMHg2OC0weDZGICovCisJMHg3RTYzLDB4N0U1OCwweDdFNjIsMHg3RTVGLDB4N0U1MSwweDdFNjAsMHg3RTU3LDB4N0U1MywvKiAweDcwLTB4NzcgKi8KKwkweDdGQjUsMHg3RkIzLDB4N0ZGNywweDdGRjgsMHg4MDc1LDB4ODFEMSwweDgxRDIsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg4MUQwLDB4ODI1RiwweDgyNUUsMHg4NUI0LDB4ODVDNiwweDg1QzAsMHg4NUMzLC8qIDB4QTAtMHhBNyAqLworCTB4ODVDMiwweDg1QjMsMHg4NUI1LDB4ODVCRCwweDg1QzcsMHg4NUM0LDB4ODVCRiwweDg1Q0IsLyogMHhBOC0weEFGICovCisJMHg4NUNFLDB4ODVDOCwweDg1QzUsMHg4NUIxLDB4ODVCNiwweDg1RDIsMHg4NjI0LDB4ODVCOCwvKiAweEIwLTB4QjcgKi8KKwkweDg1QjcsMHg4NUJFLDB4ODY2OSwweDg3RTcsMHg4N0U2LDB4ODdFMiwweDg3REIsMHg4N0VCLC8qIDB4QjgtMHhCRiAqLworCTB4ODdFQSwweDg3RTUsMHg4N0RGLDB4ODdGMywweDg3RTQsMHg4N0Q0LDB4ODdEQywweDg3RDMsLyogMHhDMC0weEM3ICovCisJMHg4N0VELDB4ODdEOCwweDg3RTMsMHg4N0E0LDB4ODdENywweDg3RDksMHg4ODAxLDB4ODdGNCwvKiAweEM4LTB4Q0YgKi8KKwkweDg3RTgsMHg4N0RELDB4ODk1MywweDg5NEIsMHg4OTRGLDB4ODk0QywweDg5NDYsMHg4OTUwLC8qIDB4RDAtMHhENyAqLworCTB4ODk1MSwweDg5NDksMHg4QjJBLDB4OEIyNywweDhCMjMsMHg4QjMzLDB4OEIzMCwweDhCMzUsLyogMHhEOC0weERGICovCisJMHg4QjQ3LDB4OEIyRiwweDhCM0MsMHg4QjNFLDB4OEIzMSwweDhCMjUsMHg4QjM3LDB4OEIyNiwvKiAweEUwLTB4RTcgKi8KKwkweDhCMzYsMHg4QjJFLDB4OEIyNCwweDhCM0IsMHg4QjNELDB4OEIzQSwweDhDNDIsMHg4Qzc1LC8qIDB4RTgtMHhFRiAqLworCTB4OEM5OSwweDhDOTgsMHg4Qzk3LDB4OENGRSwweDhEMDQsMHg4RDAyLDB4OEQwMCwweDhFNUMsLyogMHhGMC0weEY3ICovCisJMHg4RTYyLDB4OEU2MCwweDhFNTcsMHg4RTU2LDB4OEU1RSwweDhFNjUsMHg4RTY3LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GMVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDhFNUIsMHg4RTVBLDB4OEU2MSwweDhFNUQsMHg4RTY5LDB4OEU1NCwweDhGNDYsMHg4RjQ3LC8qIDB4NDAtMHg0NyAqLworCTB4OEY0OCwweDhGNEIsMHg5MTI4LDB4OTEzQSwweDkxM0IsMHg5MTNFLDB4OTFBOCwweDkxQTUsLyogMHg0OC0weDRGICovCisJMHg5MUE3LDB4OTFBRiwweDkxQUEsMHg5M0I1LDB4OTM4QywweDkzOTIsMHg5M0I3LDB4OTM5QiwvKiAweDUwLTB4NTcgKi8KKwkweDkzOUQsMHg5Mzg5LDB4OTNBNywweDkzOEUsMHg5M0FBLDB4OTM5RSwweDkzQTYsMHg5Mzk1LC8qIDB4NTgtMHg1RiAqLworCTB4OTM4OCwweDkzOTksMHg5MzlGLDB4OTM4RCwweDkzQjEsMHg5MzkxLDB4OTNCMiwweDkzQTQsLyogMHg2MC0weDY3ICovCisJMHg5M0E4LDB4OTNCNCwweDkzQTMsMHg5M0E1LDB4OTVEMiwweDk1RDMsMHg5NUQxLDB4OTZCMywvKiAweDY4LTB4NkYgKi8KKwkweDk2RDcsMHg5NkRBLDB4NURDMiwweDk2REYsMHg5NkQ4LDB4OTZERCwweDk3MjMsMHg5NzIyLC8qIDB4NzAtMHg3NyAqLworCTB4OTcyNSwweDk3QUMsMHg5N0FFLDB4OTdBOCwweDk3QUIsMHg5N0E0LDB4OTdBQSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDk3QTIsMHg5N0E1LDB4OTdENywweDk3RDksMHg5N0Q2LDB4OTdEOCwweDk3RkEsLyogMHhBMC0weEE3ICovCisJMHg5ODUwLDB4OTg1MSwweDk4NTIsMHg5OEI4LDB4OTk0MSwweDk5M0MsMHg5OTNBLDB4OUEwRiwvKiAweEE4LTB4QUYgKi8KKwkweDlBMEIsMHg5QTA5LDB4OUEwRCwweDlBMDQsMHg5QTExLDB4OUEwQSwweDlBMDUsMHg5QTA3LC8qIDB4QjAtMHhCNyAqLworCTB4OUEwNiwweDlBQzAsMHg5QURDLDB4OUIwOCwweDlCMDQsMHg5QjA1LDB4OUIyOSwweDlCMzUsLyogMHhCOC0weEJGICovCisJMHg5QjRBLDB4OUI0QywweDlCNEIsMHg5QkM3LDB4OUJDNiwweDlCQzMsMHg5QkJGLDB4OUJDMSwvKiAweEMwLTB4QzcgKi8KKwkweDlCQjUsMHg5QkI4LDB4OUJEMywweDlCQjYsMHg5QkM0LDB4OUJCOSwweDlCQkQsMHg5RDVDLC8qIDB4QzgtMHhDRiAqLworCTB4OUQ1MywweDlENEYsMHg5RDRBLDB4OUQ1QiwweDlENEIsMHg5RDU5LDB4OUQ1NiwweDlENEMsLyogMHhEMC0weEQ3ICovCisJMHg5RDU3LDB4OUQ1MiwweDlENTQsMHg5RDVGLDB4OUQ1OCwweDlENUEsMHg5RThFLDB4OUU4QywvKiAweEQ4LTB4REYgKi8KKwkweDlFREYsMHg5RjAxLDB4OUYwMCwweDlGMTYsMHg5RjI1LDB4OUYyQiwweDlGMkEsMHg5RjI5LC8qIDB4RTAtMHhFNyAqLworCTB4OUYyOCwweDlGNEMsMHg5RjU1LDB4NTEzNCwweDUxMzUsMHg1Mjk2LDB4NTJGNywweDUzQjQsLyogMHhFOC0weEVGICovCisJMHg1NkFCLDB4NTZBRCwweDU2QTYsMHg1NkE3LDB4NTZBQSwweDU2QUMsMHg1OERBLDB4NThERCwvKiAweEYwLTB4RjcgKi8KKwkweDU4REIsMHg1OTEyLDB4NUIzRCwweDVCM0UsMHg1QjNGLDB4NURDMywweDVFNzAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0YyWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NUZCRiwweDYxRkIsMHg2NTA3LDB4NjUxMCwweDY1MEQsMHg2NTA5LDB4NjUwQywweDY1MEUsLyogMHg0MC0weDQ3ICovCisJMHg2NTg0LDB4NjVERSwweDY1REQsMHg2NkRFLDB4NkFFNywweDZBRTAsMHg2QUNDLDB4NkFEMSwvKiAweDQ4LTB4NEYgKi8KKwkweDZBRDksMHg2QUNCLDB4NkFERiwweDZBREMsMHg2QUQwLDB4NkFFQiwweDZBQ0YsMHg2QUNELC8qIDB4NTAtMHg1NyAqLworCTB4NkFERSwweDZCNjAsMHg2QkIwLDB4NkMwQywweDcwMTksMHg3MDI3LDB4NzAyMCwweDcwMTYsLyogMHg1OC0weDVGICovCisJMHg3MDJCLDB4NzAyMSwweDcwMjIsMHg3MDIzLDB4NzAyOSwweDcwMTcsMHg3MDI0LDB4NzAxQywvKiAweDYwLTB4NjcgKi8KKwkweDcwMkEsMHg3MjBDLDB4NzIwQSwweDcyMDcsMHg3MjAyLDB4NzIwNSwweDcyQTUsMHg3MkE2LC8qIDB4NjgtMHg2RiAqLworCTB4NzJBNCwweDcyQTMsMHg3MkExLDB4NzRDQiwweDc0QzUsMHg3NEI3LDB4NzRDMywweDc1MTYsLyogMHg3MC0weDc3ICovCisJMHg3NjYwLDB4NzdDOSwweDc3Q0EsMHg3N0M0LDB4NzdGMSwweDc5MUQsMHg3OTFCLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NzkyMSwweDc5MUMsMHg3OTE3LDB4NzkxRSwweDc5QjAsMHg3QTY3LDB4N0E2OCwvKiAweEEwLTB4QTcgKi8KKwkweDdDMzMsMHg3QzNDLDB4N0MzOSwweDdDMkMsMHg3QzNCLDB4N0NFQywweDdDRUEsMHg3RTc2LC8qIDB4QTgtMHhBRiAqLworCTB4N0U3NSwweDdFNzgsMHg3RTcwLDB4N0U3NywweDdFNkYsMHg3RTdBLDB4N0U3MiwweDdFNzQsLyogMHhCMC0weEI3ICovCisJMHg3RTY4LDB4N0Y0QiwweDdGNEEsMHg3RjgzLDB4N0Y4NiwweDdGQjcsMHg3RkZELDB4N0ZGRSwvKiAweEI4LTB4QkYgKi8KKwkweDgwNzgsMHg4MUQ3LDB4ODFENSwweDgyNjQsMHg4MjYxLDB4ODI2MywweDg1RUIsMHg4NUYxLC8qIDB4QzAtMHhDNyAqLworCTB4ODVFRCwweDg1RDksMHg4NUUxLDB4ODVFOCwweDg1REEsMHg4NUQ3LDB4ODVFQywweDg1RjIsLyogMHhDOC0weENGICovCisJMHg4NUY4LDB4ODVEOCwweDg1REYsMHg4NUUzLDB4ODVEQywweDg1RDEsMHg4NUYwLDB4ODVFNiwvKiAweEQwLTB4RDcgKi8KKwkweDg1RUYsMHg4NURFLDB4ODVFMiwweDg4MDAsMHg4N0ZBLDB4ODgwMywweDg3RjYsMHg4N0Y3LC8qIDB4RDgtMHhERiAqLworCTB4ODgwOSwweDg4MEMsMHg4ODBCLDB4ODgwNiwweDg3RkMsMHg4ODA4LDB4ODdGRiwweDg4MEEsLyogMHhFMC0weEU3ICovCisJMHg4ODAyLDB4ODk2MiwweDg5NUEsMHg4OTVCLDB4ODk1NywweDg5NjEsMHg4OTVDLDB4ODk1OCwvKiAweEU4LTB4RUYgKi8KKwkweDg5NUQsMHg4OTU5LDB4ODk4OCwweDg5QjcsMHg4OUI2LDB4ODlGNiwweDhCNTAsMHg4QjQ4LC8qIDB4RjAtMHhGNyAqLworCTB4OEI0QSwweDhCNDAsMHg4QjUzLDB4OEI1NiwweDhCNTQsMHg4QjRCLDB4OEI1NSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRjNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4QjUxLDB4OEI0MiwweDhCNTIsMHg4QjU3LDB4OEM0MywweDhDNzcsMHg4Qzc2LDB4OEM5QSwvKiAweDQwLTB4NDcgKi8KKwkweDhEMDYsMHg4RDA3LDB4OEQwOSwweDhEQUMsMHg4REFBLDB4OERBRCwweDhEQUIsMHg4RTZELC8qIDB4NDgtMHg0RiAqLworCTB4OEU3OCwweDhFNzMsMHg4RTZBLDB4OEU2RiwweDhFN0IsMHg4RUMyLDB4OEY1MiwweDhGNTEsLyogMHg1MC0weDU3ICovCisJMHg4RjRGLDB4OEY1MCwweDhGNTMsMHg4RkI0LDB4OTE0MCwweDkxM0YsMHg5MUIwLDB4OTFBRCwvKiAweDU4LTB4NUYgKi8KKwkweDkzREUsMHg5M0M3LDB4OTNDRiwweDkzQzIsMHg5M0RBLDB4OTNEMCwweDkzRjksMHg5M0VDLC8qIDB4NjAtMHg2NyAqLworCTB4OTNDQywweDkzRDksMHg5M0E5LDB4OTNFNiwweDkzQ0EsMHg5M0Q0LDB4OTNFRSwweDkzRTMsLyogMHg2OC0weDZGICovCisJMHg5M0Q1LDB4OTNDNCwweDkzQ0UsMHg5M0MwLDB4OTNEMiwweDkzRTcsMHg5NTdELDB4OTVEQSwvKiAweDcwLTB4NzcgKi8KKwkweDk1REIsMHg5NkUxLDB4OTcyOSwweDk3MkIsMHg5NzJDLDB4OTcyOCwweDk3MjYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg5N0IzLDB4OTdCNywweDk3QjYsMHg5N0RELDB4OTdERSwweDk3REYsMHg5ODVDLC8qIDB4QTAtMHhBNyAqLworCTB4OTg1OSwweDk4NUQsMHg5ODU3LDB4OThCRiwweDk4QkQsMHg5OEJCLDB4OThCRSwweDk5NDgsLyogMHhBOC0weEFGICovCisJMHg5OTQ3LDB4OTk0MywweDk5QTYsMHg5OUE3LDB4OUExQSwweDlBMTUsMHg5QTI1LDB4OUExRCwvKiAweEIwLTB4QjcgKi8KKwkweDlBMjQsMHg5QTFCLDB4OUEyMiwweDlBMjAsMHg5QTI3LDB4OUEyMywweDlBMUUsMHg5QTFDLC8qIDB4QjgtMHhCRiAqLworCTB4OUExNCwweDlBQzIsMHg5QjBCLDB4OUIwQSwweDlCMEUsMHg5QjBDLDB4OUIzNywweDlCRUEsLyogMHhDMC0weEM3ICovCisJMHg5QkVCLDB4OUJFMCwweDlCREUsMHg5QkU0LDB4OUJFNiwweDlCRTIsMHg5QkYwLDB4OUJENCwvKiAweEM4LTB4Q0YgKi8KKwkweDlCRDcsMHg5QkVDLDB4OUJEQywweDlCRDksMHg5QkU1LDB4OUJENSwweDlCRTEsMHg5QkRBLC8qIDB4RDAtMHhENyAqLworCTB4OUQ3NywweDlEODEsMHg5RDhBLDB4OUQ4NCwweDlEODgsMHg5RDcxLDB4OUQ4MCwweDlENzgsLyogMHhEOC0weERGICovCisJMHg5RDg2LDB4OUQ4QiwweDlEOEMsMHg5RDdELDB4OUQ2QiwweDlENzQsMHg5RDc1LDB4OUQ3MCwvKiAweEUwLTB4RTcgKi8KKwkweDlENjksMHg5RDg1LDB4OUQ3MywweDlEN0IsMHg5RDgyLDB4OUQ2RiwweDlENzksMHg5RDdGLC8qIDB4RTgtMHhFRiAqLworCTB4OUQ4NywweDlENjgsMHg5RTk0LDB4OUU5MSwweDlFQzAsMHg5RUZDLDB4OUYyRCwweDlGNDAsLyogMHhGMC0weEY3ICovCisJMHg5RjQxLDB4OUY0RCwweDlGNTYsMHg5RjU3LDB4OUY1OCwweDUzMzcsMHg1NkIyLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GNFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDU2QjUsMHg1NkIzLDB4NThFMywweDVCNDUsMHg1REM2LDB4NURDNywweDVFRUUsMHg1RUVGLC8qIDB4NDAtMHg0NyAqLworCTB4NUZDMCwweDVGQzEsMHg2MUY5LDB4NjUxNywweDY1MTYsMHg2NTE1LDB4NjUxMywweDY1REYsLyogMHg0OC0weDRGICovCisJMHg2NkU4LDB4NjZFMywweDY2RTQsMHg2QUYzLDB4NkFGMCwweDZBRUEsMHg2QUU4LDB4NkFGOSwvKiAweDUwLTB4NTcgKi8KKwkweDZBRjEsMHg2QUVFLDB4NkFFRiwweDcwM0MsMHg3MDM1LDB4NzAyRiwweDcwMzcsMHg3MDM0LC8qIDB4NTgtMHg1RiAqLworCTB4NzAzMSwweDcwNDIsMHg3MDM4LDB4NzAzRiwweDcwM0EsMHg3MDM5LDB4NzA0MCwweDcwM0IsLyogMHg2MC0weDY3ICovCisJMHg3MDMzLDB4NzA0MSwweDcyMTMsMHg3MjE0LDB4NzJBOCwweDczN0QsMHg3MzdDLDB4NzRCQSwvKiAweDY4LTB4NkYgKi8KKwkweDc2QUIsMHg3NkFBLDB4NzZCRSwweDc2RUQsMHg3N0NDLDB4NzdDRSwweDc3Q0YsMHg3N0NELC8qIDB4NzAtMHg3NyAqLworCTB4NzdGMiwweDc5MjUsMHg3OTIzLDB4NzkyNywweDc5MjgsMHg3OTI0LDB4NzkyOSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDc5QjIsMHg3QTZFLDB4N0E2QywweDdBNkQsMHg3QUY3LDB4N0M0OSwweDdDNDgsLyogMHhBMC0weEE3ICovCisJMHg3QzRBLDB4N0M0NywweDdDNDUsMHg3Q0VFLDB4N0U3QiwweDdFN0UsMHg3RTgxLDB4N0U4MCwvKiAweEE4LTB4QUYgKi8KKwkweDdGQkEsMHg3RkZGLDB4ODA3OSwweDgxREIsMHg4MUQ5LDB4ODIwQiwweDgyNjgsMHg4MjY5LC8qIDB4QjAtMHhCNyAqLworCTB4ODYyMiwweDg1RkYsMHg4NjAxLDB4ODVGRSwweDg2MUIsMHg4NjAwLDB4ODVGNiwweDg2MDQsLyogMHhCOC0weEJGICovCisJMHg4NjA5LDB4ODYwNSwweDg2MEMsMHg4NUZELDB4ODgxOSwweDg4MTAsMHg4ODExLDB4ODgxNywvKiAweEMwLTB4QzcgKi8KKwkweDg4MTMsMHg4ODE2LDB4ODk2MywweDg5NjYsMHg4OUI5LDB4ODlGNywweDhCNjAsMHg4QjZBLC8qIDB4QzgtMHhDRiAqLworCTB4OEI1RCwweDhCNjgsMHg4QjYzLDB4OEI2NSwweDhCNjcsMHg4QjZELDB4OERBRSwweDhFODYsLyogMHhEMC0weEQ3ICovCisJMHg4RTg4LDB4OEU4NCwweDhGNTksMHg4RjU2LDB4OEY1NywweDhGNTUsMHg4RjU4LDB4OEY1QSwvKiAweEQ4LTB4REYgKi8KKwkweDkwOEQsMHg5MTQzLDB4OTE0MSwweDkxQjcsMHg5MUI1LDB4OTFCMiwweDkxQjMsMHg5NDBCLC8qIDB4RTAtMHhFNyAqLworCTB4OTQxMywweDkzRkIsMHg5NDIwLDB4OTQwRiwweDk0MTQsMHg5M0ZFLDB4OTQxNSwweDk0MTAsLyogMHhFOC0weEVGICovCisJMHg5NDI4LDB4OTQxOSwweDk0MEQsMHg5M0Y1LDB4OTQwMCwweDkzRjcsMHg5NDA3LDB4OTQwRSwvKiAweEYwLTB4RjcgKi8KKwkweDk0MTYsMHg5NDEyLDB4OTNGQSwweDk0MDksMHg5M0Y4LDB4OTQwQSwweDkzRkYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Y1WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTNGQywweDk0MEMsMHg5M0Y2LDB4OTQxMSwweDk0MDYsMHg5NURFLDB4OTVFMCwweDk1REYsLyogMHg0MC0weDQ3ICovCisJMHg5NzJFLDB4OTcyRiwweDk3QjksMHg5N0JCLDB4OTdGRCwweDk3RkUsMHg5ODYwLDB4OTg2MiwvKiAweDQ4LTB4NEYgKi8KKwkweDk4NjMsMHg5ODVGLDB4OThDMSwweDk4QzIsMHg5OTUwLDB4OTk0RSwweDk5NTksMHg5OTRDLC8qIDB4NTAtMHg1NyAqLworCTB4OTk0QiwweDk5NTMsMHg5QTMyLDB4OUEzNCwweDlBMzEsMHg5QTJDLDB4OUEyQSwweDlBMzYsLyogMHg1OC0weDVGICovCisJMHg5QTI5LDB4OUEyRSwweDlBMzgsMHg5QTJELDB4OUFDNywweDlBQ0EsMHg5QUM2LDB4OUIxMCwvKiAweDYwLTB4NjcgKi8KKwkweDlCMTIsMHg5QjExLDB4OUMwQiwweDlDMDgsMHg5QkY3LDB4OUMwNSwweDlDMTIsMHg5QkY4LC8qIDB4NjgtMHg2RiAqLworCTB4OUM0MCwweDlDMDcsMHg5QzBFLDB4OUMwNiwweDlDMTcsMHg5QzE0LDB4OUMwOSwweDlEOUYsLyogMHg3MC0weDc3ICovCisJMHg5RDk5LDB4OURBNCwweDlEOUQsMHg5RDkyLDB4OUQ5OCwweDlEOTAsMHg5RDlCLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OURBMCwweDlEOTQsMHg5RDlDLDB4OURBQSwweDlEOTcsMHg5REExLDB4OUQ5QSwvKiAweEEwLTB4QTcgKi8KKwkweDlEQTIsMHg5REE4LDB4OUQ5RSwweDlEQTMsMHg5REJGLDB4OURBOSwweDlEOTYsMHg5REE2LC8qIDB4QTgtMHhBRiAqLworCTB4OURBNywweDlFOTksMHg5RTlCLDB4OUU5QSwweDlFRTUsMHg5RUU0LDB4OUVFNywweDlFRTYsLyogMHhCMC0weEI3ICovCisJMHg5RjMwLDB4OUYyRSwweDlGNUIsMHg5RjYwLDB4OUY1RSwweDlGNUQsMHg5RjU5LDB4OUY5MSwvKiAweEI4LTB4QkYgKi8KKwkweDUxM0EsMHg1MTM5LDB4NTI5OCwweDUyOTcsMHg1NkMzLDB4NTZCRCwweDU2QkUsMHg1QjQ4LC8qIDB4QzAtMHhDNyAqLworCTB4NUI0NywweDVEQ0IsMHg1RENGLDB4NUVGMSwweDYxRkQsMHg2NTFCLDB4NkIwMiwweDZBRkMsLyogMHhDOC0weENGICovCisJMHg2QjAzLDB4NkFGOCwweDZCMDAsMHg3MDQzLDB4NzA0NCwweDcwNEEsMHg3MDQ4LDB4NzA0OSwvKiAweEQwLTB4RDcgKi8KKwkweDcwNDUsMHg3MDQ2LDB4NzIxRCwweDcyMUEsMHg3MjE5LDB4NzM3RSwweDc1MTcsMHg3NjZBLC8qIDB4RDgtMHhERiAqLworCTB4NzdEMCwweDc5MkQsMHg3OTMxLDB4NzkyRiwweDdDNTQsMHg3QzUzLDB4N0NGMiwweDdFOEEsLyogMHhFMC0weEU3ICovCisJMHg3RTg3LDB4N0U4OCwweDdFOEIsMHg3RTg2LDB4N0U4RCwweDdGNEQsMHg3RkJCLDB4ODAzMCwvKiAweEU4LTB4RUYgKi8KKwkweDgxREQsMHg4NjE4LDB4ODYyQSwweDg2MjYsMHg4NjFGLDB4ODYyMywweDg2MUMsMHg4NjE5LC8qIDB4RjAtMHhGNyAqLworCTB4ODYyNywweDg2MkUsMHg4NjIxLDB4ODYyMCwweDg2MjksMHg4NjFFLDB4ODYyNSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRjZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4ODI5LDB4ODgxRCwweDg4MUIsMHg4ODIwLDB4ODgyNCwweDg4MUMsMHg4ODJCLDB4ODg0QSwvKiAweDQwLTB4NDcgKi8KKwkweDg5NkQsMHg4OTY5LDB4ODk2RSwweDg5NkIsMHg4OUZBLDB4OEI3OSwweDhCNzgsMHg4QjQ1LC8qIDB4NDgtMHg0RiAqLworCTB4OEI3QSwweDhCN0IsMHg4RDEwLDB4OEQxNCwweDhEQUYsMHg4RThFLDB4OEU4QywweDhGNUUsLyogMHg1MC0weDU3ICovCisJMHg4RjVCLDB4OEY1RCwweDkxNDYsMHg5MTQ0LDB4OTE0NSwweDkxQjksMHg5NDNGLDB4OTQzQiwvKiAweDU4LTB4NUYgKi8KKwkweDk0MzYsMHg5NDI5LDB4OTQzRCwweDk0M0MsMHg5NDMwLDB4OTQzOSwweDk0MkEsMHg5NDM3LC8qIDB4NjAtMHg2NyAqLworCTB4OTQyQywweDk0NDAsMHg5NDMxLDB4OTVFNSwweDk1RTQsMHg5NUUzLDB4OTczNSwweDk3M0EsLyogMHg2OC0weDZGICovCisJMHg5N0JGLDB4OTdFMSwweDk4NjQsMHg5OEM5LDB4OThDNiwweDk4QzAsMHg5OTU4LDB4OTk1NiwvKiAweDcwLTB4NzcgKi8KKwkweDlBMzksMHg5QTNELDB4OUE0NiwweDlBNDQsMHg5QTQyLDB4OUE0MSwweDlBM0EsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg5QTNGLDB4OUFDRCwweDlCMTUsMHg5QjE3LDB4OUIxOCwweDlCMTYsMHg5QjNBLC8qIDB4QTAtMHhBNyAqLworCTB4OUI1MiwweDlDMkIsMHg5QzFELDB4OUMxQywweDlDMkMsMHg5QzIzLDB4OUMyOCwweDlDMjksLyogMHhBOC0weEFGICovCisJMHg5QzI0LDB4OUMyMSwweDlEQjcsMHg5REI2LDB4OURCQywweDlEQzEsMHg5REM3LDB4OURDQSwvKiAweEIwLTB4QjcgKi8KKwkweDlEQ0YsMHg5REJFLDB4OURDNSwweDlEQzMsMHg5REJCLDB4OURCNSwweDlEQ0UsMHg5REI5LC8qIDB4QjgtMHhCRiAqLworCTB4OURCQSwweDlEQUMsMHg5REM4LDB4OURCMSwweDlEQUQsMHg5RENDLDB4OURCMywweDlEQ0QsLyogMHhDMC0weEM3ICovCisJMHg5REIyLDB4OUU3QSwweDlFOUMsMHg5RUVCLDB4OUVFRSwweDlFRUQsMHg5RjFCLDB4OUYxOCwvKiAweEM4LTB4Q0YgKi8KKwkweDlGMUEsMHg5RjMxLDB4OUY0RSwweDlGNjUsMHg5RjY0LDB4OUY5MiwweDRFQjksMHg1NkM2LC8qIDB4RDAtMHhENyAqLworCTB4NTZDNSwweDU2Q0IsMHg1OTcxLDB4NUI0QiwweDVCNEMsMHg1REQ1LDB4NUREMSwweDVFRjIsLyogMHhEOC0weERGICovCisJMHg2NTIxLDB4NjUyMCwweDY1MjYsMHg2NTIyLDB4NkIwQiwweDZCMDgsMHg2QjA5LDB4NkMwRCwvKiAweEUwLTB4RTcgKi8KKwkweDcwNTUsMHg3MDU2LDB4NzA1NywweDcwNTIsMHg3MjFFLDB4NzIxRiwweDcyQTksMHg3MzdGLC8qIDB4RTgtMHhFRiAqLworCTB4NzREOCwweDc0RDUsMHg3NEQ5LDB4NzRENywweDc2NkQsMHg3NkFELDB4NzkzNSwweDc5QjQsLyogMHhGMC0weEY3ICovCisJMHg3QTcwLDB4N0E3MSwweDdDNTcsMHg3QzVDLDB4N0M1OSwweDdDNUIsMHg3QzVBLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GN1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDdDRjQsMHg3Q0YxLDB4N0U5MSwweDdGNEYsMHg3Rjg3LDB4ODFERSwweDgyNkIsMHg4NjM0LC8qIDB4NDAtMHg0NyAqLworCTB4ODYzNSwweDg2MzMsMHg4NjJDLDB4ODYzMiwweDg2MzYsMHg4ODJDLDB4ODgyOCwweDg4MjYsLyogMHg0OC0weDRGICovCisJMHg4ODJBLDB4ODgyNSwweDg5NzEsMHg4OUJGLDB4ODlCRSwweDg5RkIsMHg4QjdFLDB4OEI4NCwvKiAweDUwLTB4NTcgKi8KKwkweDhCODIsMHg4Qjg2LDB4OEI4NSwweDhCN0YsMHg4RDE1LDB4OEU5NSwweDhFOTQsMHg4RTlBLC8qIDB4NTgtMHg1RiAqLworCTB4OEU5MiwweDhFOTAsMHg4RTk2LDB4OEU5NywweDhGNjAsMHg4RjYyLDB4OTE0NywweDk0NEMsLyogMHg2MC0weDY3ICovCisJMHg5NDUwLDB4OTQ0QSwweDk0NEIsMHg5NDRGLDB4OTQ0NywweDk0NDUsMHg5NDQ4LDB4OTQ0OSwvKiAweDY4LTB4NkYgKi8KKwkweDk0NDYsMHg5NzNGLDB4OTdFMywweDk4NkEsMHg5ODY5LDB4OThDQiwweDk5NTQsMHg5OTVCLC8qIDB4NzAtMHg3NyAqLworCTB4OUE0RSwweDlBNTMsMHg5QTU0LDB4OUE0QywweDlBNEYsMHg5QTQ4LDB4OUE0QSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDlBNDksMHg5QTUyLDB4OUE1MCwweDlBRDAsMHg5QjE5LDB4OUIyQiwweDlCM0IsLyogMHhBMC0weEE3ICovCisJMHg5QjU2LDB4OUI1NSwweDlDNDYsMHg5QzQ4LDB4OUMzRiwweDlDNDQsMHg5QzM5LDB4OUMzMywvKiAweEE4LTB4QUYgKi8KKwkweDlDNDEsMHg5QzNDLDB4OUMzNywweDlDMzQsMHg5QzMyLDB4OUMzRCwweDlDMzYsMHg5RERCLC8qIDB4QjAtMHhCNyAqLworCTB4OUREMiwweDlEREUsMHg5RERBLDB4OURDQiwweDlERDAsMHg5RERDLDB4OUREMSwweDlEREYsLyogMHhCOC0weEJGICovCisJMHg5REU5LDB4OUREOSwweDlERDgsMHg5REQ2LDB4OURGNSwweDlERDUsMHg5RERELDB4OUVCNiwvKiAweEMwLTB4QzcgKi8KKwkweDlFRjAsMHg5RjM1LDB4OUYzMywweDlGMzIsMHg5RjQyLDB4OUY2QiwweDlGOTUsMHg5RkEyLC8qIDB4QzgtMHhDRiAqLworCTB4NTEzRCwweDUyOTksMHg1OEU4LDB4NThFNywweDU5NzIsMHg1QjRELDB4NUREOCwweDg4MkYsLyogMHhEMC0weEQ3ICovCisJMHg1RjRGLDB4NjIwMSwweDYyMDMsMHg2MjA0LDB4NjUyOSwweDY1MjUsMHg2NTk2LDB4NjZFQiwvKiAweEQ4LTB4REYgKi8KKwkweDZCMTEsMHg2QjEyLDB4NkIwRiwweDZCQ0EsMHg3MDVCLDB4NzA1QSwweDcyMjIsMHg3MzgyLC8qIDB4RTAtMHhFNyAqLworCTB4NzM4MSwweDczODMsMHg3NjcwLDB4NzdENCwweDdDNjcsMHg3QzY2LDB4N0U5NSwweDgyNkMsLyogMHhFOC0weEVGICovCisJMHg4NjNBLDB4ODY0MCwweDg2MzksMHg4NjNDLDB4ODYzMSwweDg2M0IsMHg4NjNFLDB4ODgzMCwvKiAweEYwLTB4RjcgKi8KKwkweDg4MzIsMHg4ODJFLDB4ODgzMywweDg5NzYsMHg4OTc0LDB4ODk3MywweDg5RkUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Y4WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OEI4QywweDhCOEUsMHg4QjhCLDB4OEI4OCwweDhDNDUsMHg4RDE5LDB4OEU5OCwweDhGNjQsLyogMHg0MC0weDQ3ICovCisJMHg4RjYzLDB4OTFCQywweDk0NjIsMHg5NDU1LDB4OTQ1RCwweDk0NTcsMHg5NDVFLDB4OTdDNCwvKiAweDQ4LTB4NEYgKi8KKwkweDk3QzUsMHg5ODAwLDB4OUE1NiwweDlBNTksMHg5QjFFLDB4OUIxRiwweDlCMjAsMHg5QzUyLC8qIDB4NTAtMHg1NyAqLworCTB4OUM1OCwweDlDNTAsMHg5QzRBLDB4OUM0RCwweDlDNEIsMHg5QzU1LDB4OUM1OSwweDlDNEMsLyogMHg1OC0weDVGICovCisJMHg5QzRFLDB4OURGQiwweDlERjcsMHg5REVGLDB4OURFMywweDlERUIsMHg5REY4LDB4OURFNCwvKiAweDYwLTB4NjcgKi8KKwkweDlERjYsMHg5REUxLDB4OURFRSwweDlERTYsMHg5REYyLDB4OURGMCwweDlERTIsMHg5REVDLC8qIDB4NjgtMHg2RiAqLworCTB4OURGNCwweDlERjMsMHg5REU4LDB4OURFRCwweDlFQzIsMHg5RUQwLDB4OUVGMiwweDlFRjMsLyogMHg3MC0weDc3ICovCisJMHg5RjA2LDB4OUYxQywweDlGMzgsMHg5RjM3LDB4OUYzNiwweDlGNDMsMHg5RjRGLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OUY3MSwweDlGNzAsMHg5RjZFLDB4OUY2RiwweDU2RDMsMHg1NkNELDB4NUI0RSwvKiAweEEwLTB4QTcgKi8KKwkweDVDNkQsMHg2NTJELDB4NjZFRCwweDY2RUUsMHg2QjEzLDB4NzA1RiwweDcwNjEsMHg3MDVELC8qIDB4QTgtMHhBRiAqLworCTB4NzA2MCwweDcyMjMsMHg3NERCLDB4NzRFNSwweDc3RDUsMHg3OTM4LDB4NzlCNywweDc5QjYsLyogMHhCMC0weEI3ICovCisJMHg3QzZBLDB4N0U5NywweDdGODksMHg4MjZELDB4ODY0MywweDg4MzgsMHg4ODM3LDB4ODgzNSwvKiAweEI4LTB4QkYgKi8KKwkweDg4NEIsMHg4Qjk0LDB4OEI5NSwweDhFOUUsMHg4RTlGLDB4OEVBMCwweDhFOUQsMHg5MUJFLC8qIDB4QzAtMHhDNyAqLworCTB4OTFCRCwweDkxQzIsMHg5NDZCLDB4OTQ2OCwweDk0NjksMHg5NkU1LDB4OTc0NiwweDk3NDMsLyogMHhDOC0weENGICovCisJMHg5NzQ3LDB4OTdDNywweDk3RTUsMHg5QTVFLDB4OUFENSwweDlCNTksMHg5QzYzLDB4OUM2NywvKiAweEQwLTB4RDcgKi8KKwkweDlDNjYsMHg5QzYyLDB4OUM1RSwweDlDNjAsMHg5RTAyLDB4OURGRSwweDlFMDcsMHg5RTAzLC8qIDB4RDgtMHhERiAqLworCTB4OUUwNiwweDlFMDUsMHg5RTAwLDB4OUUwMSwweDlFMDksMHg5REZGLDB4OURGRCwweDlFMDQsLyogMHhFMC0weEU3ICovCisJMHg5RUEwLDB4OUYxRSwweDlGNDYsMHg5Rjc0LDB4OUY3NSwweDlGNzYsMHg1NkQ0LDB4NjUyRSwvKiAweEU4LTB4RUYgKi8KKwkweDY1QjgsMHg2QjE4LDB4NkIxOSwweDZCMTcsMHg2QjFBLDB4NzA2MiwweDcyMjYsMHg3MkFBLC8qIDB4RjAtMHhGNyAqLworCTB4NzdEOCwweDc3RDksMHg3OTM5LDB4N0M2OSwweDdDNkIsMHg3Q0Y2LDB4N0U5QSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRjlbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3RTk4LDB4N0U5QiwweDdFOTksMHg4MUUwLDB4ODFFMSwweDg2NDYsMHg4NjQ3LDB4ODY0OCwvKiAweDQwLTB4NDcgKi8KKwkweDg5NzksMHg4OTdBLDB4ODk3QywweDg5N0IsMHg4OUZGLDB4OEI5OCwweDhCOTksMHg4RUE1LC8qIDB4NDgtMHg0RiAqLworCTB4OEVBNCwweDhFQTMsMHg5NDZFLDB4OTQ2RCwweDk0NkYsMHg5NDcxLDB4OTQ3MywweDk3NDksLyogMHg1MC0weDU3ICovCisJMHg5ODcyLDB4OTk1RiwweDlDNjgsMHg5QzZFLDB4OUM2RCwweDlFMEIsMHg5RTBELDB4OUUxMCwvKiAweDU4LTB4NUYgKi8KKwkweDlFMEYsMHg5RTEyLDB4OUUxMSwweDlFQTEsMHg5RUY1LDB4OUYwOSwweDlGNDcsMHg5Rjc4LC8qIDB4NjAtMHg2NyAqLworCTB4OUY3QiwweDlGN0EsMHg5Rjc5LDB4NTcxRSwweDcwNjYsMHg3QzZGLDB4ODgzQywweDhEQjIsLyogMHg2OC0weDZGICovCisJMHg4RUE2LDB4OTFDMywweDk0NzQsMHg5NDc4LDB4OTQ3NiwweDk0NzUsMHg5QTYwLDB4OUM3NCwvKiAweDcwLTB4NzcgKi8KKwkweDlDNzMsMHg5QzcxLDB4OUM3NSwweDlFMTQsMHg5RTEzLDB4OUVGNiwweDlGMEEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg5RkE0LDB4NzA2OCwweDcwNjUsMHg3Q0Y3LDB4ODY2QSwweDg4M0UsMHg4ODNELC8qIDB4QTAtMHhBNyAqLworCTB4ODgzRiwweDhCOUUsMHg4QzlDLDB4OEVBOSwweDhFQzksMHg5NzRCLDB4OTg3MywweDk4NzQsLyogMHhBOC0weEFGICovCisJMHg5OENDLDB4OTk2MSwweDk5QUIsMHg5QTY0LDB4OUE2NiwweDlBNjcsMHg5QjI0LDB4OUUxNSwvKiAweEIwLTB4QjcgKi8KKwkweDlFMTcsMHg5RjQ4LDB4NjIwNywweDZCMUUsMHg3MjI3LDB4ODY0QywweDhFQTgsMHg5NDgyLC8qIDB4QjgtMHhCRiAqLworCTB4OTQ4MCwweDk0ODEsMHg5QTY5LDB4OUE2OCwweDlCMkUsMHg5RTE5LDB4NzIyOSwweDg2NEIsLyogMHhDMC0weEM3ICovCisJMHg4QjlGLDB4OTQ4MywweDlDNzksMHg5RUI3LDB4NzY3NSwweDlBNkIsMHg5QzdBLDB4OUUxRCwvKiAweEM4LTB4Q0YgKi8KKwkweDcwNjksMHg3MDZBLDB4OUVBNCwweDlGN0UsMHg5RjQ5LDB4OUY5OCwweDc4ODEsMHg5MkI5LC8qIDB4RDAtMHhENyAqLworCTB4ODhDRiwweDU4QkIsMHg2MDUyLDB4N0NBNywweDVBRkEsMHgyNTU0LDB4MjU2NiwweDI1NTcsLyogMHhEOC0weERGICovCisJMHgyNTYwLDB4MjU2QywweDI1NjMsMHgyNTVBLDB4MjU2OSwweDI1NUQsMHgyNTUyLDB4MjU2NCwvKiAweEUwLTB4RTcgKi8KKwkweDI1NTUsMHgyNTVFLDB4MjU2QSwweDI1NjEsMHgyNTU4LDB4MjU2NywweDI1NUIsMHgyNTUzLC8qIDB4RTgtMHhFRiAqLworCTB4MjU2NSwweDI1NTYsMHgyNTVGLDB4MjU2QiwweDI1NjIsMHgyNTU5LDB4MjU2OCwweDI1NUMsLyogMHhGMC0weEY3ICovCisJMHgyNTUxLDB4MjU1MCwweDI1NkQsMHgyNTZFLDB4MjU3MCwweDI1NkYsMHgyNTkzLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90ICpwYWdlX2NoYXJzZXQydW5pWzI1Nl0gPSB7CisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIGMydV9BMSwgYzJ1X0EyLCBjMnVfQTMsIGMydV9BNCwgYzJ1X0E1LCBjMnVfQTYsIGMydV9BNywgCisJYzJ1X0E4LCBjMnVfQTksIGMydV9BQSwgYzJ1X0FCLCBjMnVfQUMsIGMydV9BRCwgYzJ1X0FFLCBjMnVfQUYsIAorCWMydV9CMCwgYzJ1X0IxLCBjMnVfQjIsIGMydV9CMywgYzJ1X0I0LCBjMnVfQjUsIGMydV9CNiwgYzJ1X0I3LCAKKwljMnVfQjgsIGMydV9COSwgYzJ1X0JBLCBjMnVfQkIsIGMydV9CQywgYzJ1X0JELCBjMnVfQkUsIGMydV9CRiwgCisJYzJ1X0MwLCBjMnVfQzEsIGMydV9DMiwgYzJ1X0MzLCBjMnVfQzQsIGMydV9DNSwgYzJ1X0M2LCBOVUxMLCAgIAorCU5VTEwsICAgYzJ1X0M5LCBjMnVfQ0EsIGMydV9DQiwgYzJ1X0NDLCBjMnVfQ0QsIGMydV9DRSwgYzJ1X0NGLCAKKwljMnVfRDAsIGMydV9EMSwgYzJ1X0QyLCBjMnVfRDMsIGMydV9ENCwgYzJ1X0Q1LCBjMnVfRDYsIGMydV9ENywgCisJYzJ1X0Q4LCBjMnVfRDksIGMydV9EQSwgYzJ1X0RCLCBjMnVfREMsIGMydV9ERCwgYzJ1X0RFLCBjMnVfREYsIAorCWMydV9FMCwgYzJ1X0UxLCBjMnVfRTIsIGMydV9FMywgYzJ1X0U0LCBjMnVfRTUsIGMydV9FNiwgYzJ1X0U3LCAKKwljMnVfRTgsIGMydV9FOSwgYzJ1X0VBLCBjMnVfRUIsIGMydV9FQywgYzJ1X0VELCBjMnVfRUUsIGMydV9FRiwgCisJYzJ1X0YwLCBjMnVfRjEsIGMydV9GMiwgYzJ1X0YzLCBjMnVfRjQsIGMydV9GNSwgYzJ1X0Y2LCBjMnVfRjcsIAorCWMydV9GOCwgYzJ1X0Y5LCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18wMls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTMsIDB4QkUsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4QTMsIDB4QkMsIDB4QTMsIDB4QkQsIDB4QTMsIDB4QkYsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4QTEsIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4QTMsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzAzWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhBMywgMHg0NCwgMHhBMywgMHg0NSwgMHhBMywgMHg0NiwgLyogMHg5MC0weDkzICovCisJMHhBMywgMHg0NywgMHhBMywgMHg0OCwgMHhBMywgMHg0OSwgMHhBMywgMHg0QSwgLyogMHg5NC0weDk3ICovCisJMHhBMywgMHg0QiwgMHhBMywgMHg0QywgMHhBMywgMHg0RCwgMHhBMywgMHg0RSwgLyogMHg5OC0weDlCICovCisJMHhBMywgMHg0RiwgMHhBMywgMHg1MCwgMHhBMywgMHg1MSwgMHhBMywgMHg1MiwgLyogMHg5Qy0weDlGICovCisJMHhBMywgMHg1MywgMHhBMywgMHg1NCwgMHgwMCwgMHgwMCwgMHhBMywgMHg1NSwgLyogMHhBMC0weEEzICovCisJMHhBMywgMHg1NiwgMHhBMywgMHg1NywgMHhBMywgMHg1OCwgMHhBMywgMHg1OSwgLyogMHhBNC0weEE3ICovCisJMHhBMywgMHg1QSwgMHhBMywgMHg1QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhBMywgMHg1QywgMHhBMywgMHg1RCwgMHhBMywgMHg1RSwgLyogMHhCMC0weEIzICovCisJMHhBMywgMHg1RiwgMHhBMywgMHg2MCwgMHhBMywgMHg2MSwgMHhBMywgMHg2MiwgLyogMHhCNC0weEI3ICovCisJMHhBMywgMHg2MywgMHhBMywgMHg2NCwgMHhBMywgMHg2NSwgMHhBMywgMHg2NiwgLyogMHhCOC0weEJCICovCisJMHhBMywgMHg2NywgMHhBMywgMHg2OCwgMHhBMywgMHg2OSwgMHhBMywgMHg2QSwgLyogMHhCQy0weEJGICovCisJMHhBMywgMHg2QiwgMHhBMywgMHg2QywgMHgwMCwgMHgwMCwgMHhBMywgMHg2RCwgLyogMHhDMC0weEMzICovCisJMHhBMywgMHg2RSwgMHhBMywgMHg2RiwgMHhBMywgMHg3MCwgMHhBMywgMHg3MSwgLyogMHhDNC0weEM3ICovCisJMHhBMywgMHg3MiwgMHhBMywgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMjBbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweDU2LCAvKiAweDEwLTB4MTMgKi8KKwkweEExLCAweDU4LCAweEEyLCAweDc3LCAweEExLCAweEZDLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweEExLCAweEE1LCAweEExLCAweEE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweEExLCAweEE3LCAweEExLCAweEE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweDQ1LCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweEEzLCAweEJCLCAweEExLCAweDRDLCAweEExLCAweDRCLCAweEExLCAweDQ1LCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEFDLCAweEExLCAweEIyLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEExLCAweEFCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEIwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEMzLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18yMVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTIsIDB4NEEsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4QTEsIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4QTIsIDB4NEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4QTIsIDB4QjksIDB4QTIsIDB4QkEsIDB4QTIsIDB4QkIsIDB4QTIsIDB4QkMsIC8qIDB4NjAtMHg2MyAqLworCTB4QTIsIDB4QkQsIDB4QTIsIDB4QkUsIDB4QTIsIDB4QkYsIDB4QTIsIDB4QzAsIC8qIDB4NjQtMHg2NyAqLworCTB4QTIsIDB4QzEsIDB4QTIsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4QTEsIDB4RjYsIDB4QTEsIDB4RjQsIDB4QTEsIDB4RjcsIDB4QTEsIDB4RjUsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RjgsIDB4QTEsIDB4RjksIC8qIDB4OTQtMHg5NyAqLworCTB4QTEsIDB4RkIsIDB4QTEsIDB4RkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzIyWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHhBMiwgMHg0MSwgMHhBMiwgMHg0MiwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhBMiwgMHg1OCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhENCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhEQiwgMHhBMSwgMHhFOCwgLyogMHgxQy0weDFGICovCisJMHhBMSwgMHhFNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhGRCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhGQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhFNCwgMHhBMSwgMHhFNSwgMHhBMSwgMHhFQywgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhFRCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhBMSwgMHhFRiwgMHhBMSwgMHhFRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhEQywgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhBMSwgMHhEQSwgMHhBMSwgMHhERCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhERCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhEOCwgMHhBMSwgMHhEOSwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhGMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhGMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhFNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhFOSwgLyogMHhCQy0weEJGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMjNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweDVCLCAvKiAweDA0LTB4MDcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18yNVs1MTJdID0geworCTB4QTIsIDB4NzcsIDB4MDAsIDB4MDAsIDB4QTIsIDB4NzgsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4QTIsIDB4N0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4QTIsIDB4N0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4QTIsIDB4N0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4QTIsIDB4N0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4QTIsIDB4NzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4QTIsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4QTIsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4QTIsIDB4NzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4QTIsIDB4NzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4RjksIDB4RjksIDB4RjksIDB4RjgsIDB4RjksIDB4RTYsIDB4RjksIDB4RUYsIC8qIDB4NTAtMHg1MyAqLworCTB4RjksIDB4REQsIDB4RjksIDB4RTgsIDB4RjksIDB4RjEsIDB4RjksIDB4REYsIC8qIDB4NTQtMHg1NyAqLworCTB4RjksIDB4RUMsIDB4RjksIDB4RjUsIDB4RjksIDB4RTMsIDB4RjksIDB4RUUsIC8qIDB4NTgtMHg1QiAqLworCTB4RjksIDB4RjcsIDB4RjksIDB4RTUsIDB4RjksIDB4RTksIDB4RjksIDB4RjIsIC8qIDB4NUMtMHg1RiAqLworCTB4RjksIDB4RTAsIDB4RjksIDB4RUIsIDB4RjksIDB4RjQsIDB4RjksIDB4RTIsIC8qIDB4NjAtMHg2MyAqLworCTB4RjksIDB4RTcsIDB4RjksIDB4RjAsIDB4RjksIDB4REUsIDB4RjksIDB4RUQsIC8qIDB4NjQtMHg2NyAqLworCTB4RjksIDB4RjYsIDB4RjksIDB4RTQsIDB4RjksIDB4RUEsIDB4RjksIDB4RjMsIC8qIDB4NjgtMHg2QiAqLworCTB4RjksIDB4RTEsIDB4QTIsIDB4N0UsIDB4QTIsIDB4QTEsIDB4QTIsIDB4QTMsIC8qIDB4NkMtMHg2RiAqLworCTB4QTIsIDB4QTIsIDB4QTIsIDB4QUMsIDB4QTIsIDB4QUQsIDB4QTIsIDB4QUUsIC8qIDB4NzAtMHg3MyAqLworCTB4QTEsIDB4NUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4QTIsIDB4NjIsIDB4QTIsIDB4NjMsIDB4QTIsIDB4NjQsIC8qIDB4ODAtMHg4MyAqLworCTB4QTIsIDB4NjUsIDB4QTIsIDB4NjYsIDB4QTIsIDB4NjcsIDB4QTIsIDB4NjgsIC8qIDB4ODQtMHg4NyAqLworCTB4QTIsIDB4NjksIDB4QTIsIDB4NzAsIDB4QTIsIDB4NkYsIDB4QTIsIDB4NkUsIC8qIDB4ODgtMHg4QiAqLworCTB4QTIsIDB4NkQsIDB4QTIsIDB4NkMsIDB4QTIsIDB4NkIsIDB4QTIsIDB4NkEsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4RkUsIC8qIDB4OTAtMHg5MyAqLworCTB4QTIsIDB4NzYsIDB4QTIsIDB4NzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4QTEsIDB4QkQsIDB4QTEsIDB4QkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4QjYsIDB4QTEsIDB4QjUsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4QTEsIDB4QkYsIDB4QTEsIDB4QkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4QkIsIDB4QTEsIDB4QkEsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4QjMsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4QjcsIDB4QTEsIDB4QjQsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTIsIDB4QTgsIDB4QTIsIDB4QTksIC8qIDB4RTAtMHhFMyAqLworCTB4QTIsIDB4QUIsIDB4QTIsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzI2WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhCOSwgMHhBMSwgMHhCOCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhGMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhBMSwgMHhGMCwgMHhBMSwgMHhGMiwgMHhBMSwgMHhGMSwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMzBbNTEyXSA9IHsKKwkweEExLCAweDQwLCAweEExLCAweDQyLCAweEExLCAweDQzLCAweEExLCAweEIyLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEExLCAweDcxLCAweEExLCAweDcyLCAweEExLCAweDZELCAweEExLCAweDZFLCAvKiAweDA4LTB4MEIgKi8KKwkweEExLCAweDc1LCAweEExLCAweDc2LCAweEExLCAweDc5LCAweEExLCAweDdBLCAvKiAweDBDLTB4MEYgKi8KKwkweEExLCAweDY5LCAweEExLCAweDZBLCAweEEyLCAweDQ1LCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweEExLCAweDY1LCAweEExLCAweDY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweEExLCAweEUzLCAweEExLCAweEE5LCAweEExLCAweEFBLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweEEyLCAweEMzLCAweEEyLCAweEM0LCAweEEyLCAweEM1LCAvKiAweDIwLTB4MjMgKi8KKwkweEEyLCAweEM2LCAweEEyLCAweEM3LCAweEEyLCAweEM4LCAweEEyLCAweEM5LCAvKiAweDI0LTB4MjcgKi8KKwkweEEyLCAweENBLCAweEEyLCAweENCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEExLCAweENBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18zMVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4QTMsIDB4NzQsIDB4QTMsIDB4NzUsIDB4QTMsIDB4NzYsIC8qIDB4MDQtMHgwNyAqLworCTB4QTMsIDB4NzcsIDB4QTMsIDB4NzgsIDB4QTMsIDB4NzksIDB4QTMsIDB4N0EsIC8qIDB4MDgtMHgwQiAqLworCTB4QTMsIDB4N0IsIDB4QTMsIDB4N0MsIDB4QTMsIDB4N0QsIDB4QTMsIDB4N0UsIC8qIDB4MEMtMHgwRiAqLworCTB4QTMsIDB4QTEsIDB4QTMsIDB4QTIsIDB4QTMsIDB4QTMsIDB4QTMsIDB4QTQsIC8qIDB4MTAtMHgxMyAqLworCTB4QTMsIDB4QTUsIDB4QTMsIDB4QTYsIDB4QTMsIDB4QTcsIDB4QTMsIDB4QTgsIC8qIDB4MTQtMHgxNyAqLworCTB4QTMsIDB4QTksIDB4QTMsIDB4QUEsIDB4QTMsIDB4QUIsIDB4QTMsIDB4QUMsIC8qIDB4MTgtMHgxQiAqLworCTB4QTMsIDB4QUQsIDB4QTMsIDB4QUUsIDB4QTMsIDB4QUYsIDB4QTMsIDB4QjAsIC8qIDB4MUMtMHgxRiAqLworCTB4QTMsIDB4QjEsIDB4QTMsIDB4QjIsIDB4QTMsIDB4QjMsIDB4QTMsIDB4QjQsIC8qIDB4MjAtMHgyMyAqLworCTB4QTMsIDB4QjUsIDB4QTMsIDB4QjYsIDB4QTMsIDB4QjcsIDB4QTMsIDB4QjgsIC8qIDB4MjQtMHgyNyAqLworCTB4QTMsIDB4QjksIDB4QTMsIDB4QkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4NDAsIDB4QTQsIDB4NDcsIC8qIDB4OTAtMHg5MyAqLworCTB4QTQsIDB4NTQsIDB4QTUsIDB4N0MsIDB4QTQsIDB4NTcsIDB4QTQsIDB4QTQsIC8qIDB4OTQtMHg5NyAqLworCTB4QTQsIDB4NTUsIDB4QTUsIDB4RDIsIDB4QTQsIDB4NDEsIDB4QTQsIDB4RkUsIC8qIDB4OTgtMHg5QiAqLworCTB4QTQsIDB4NDIsIDB4QTQsIDB4RDEsIDB4QTYsIDB4NjEsIDB4QTQsIDB4NDgsIC8qIDB4OUMtMHg5RiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzMyWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhBNCwgMHg0MCwgMHhBNCwgMHg0NywgMHhBNCwgMHg1NCwgMHhBNSwgMHg3QywgLyogMHgyMC0weDIzICovCisJMHhBNCwgMHhBRCwgMHhBNCwgMHhCQiwgMHhBNCwgMHg0MywgMHhBNCwgMHg0QiwgLyogMHgyNC0weDI3ICovCisJMHhBNCwgMHg0NSwgMHhBNCwgMHg1MSwgMHhBNCwgMHhFQiwgMHhBNCwgMHhGNSwgLyogMHgyOC0weDJCICovCisJMHhBNCwgMHhGNCwgMHhBNCwgMHhFQywgMHhBQSwgMHhGNywgMHhBNCwgMHg2NywgLyogMHgyQy0weDJGICovCisJMHhBNCwgMHhFOSwgMHhBRSwgMHhFOCwgMHhBNiwgMHhCMywgMHhBQSwgMHhDMCwgLyogMHgzMC0weDMzICovCisJMHhBNiwgMHg1NywgMHhBRiwgMHg1MywgMHhCMCwgMHg1RCwgMHhBRiwgMHhBQywgLyogMHgzNC0weDM3ICovCisJMHhCMywgMHhEMiwgMHhBNSwgMHg0RSwgMHhBOSwgMHg0OSwgMHhCRSwgMHhDNywgLyogMHgzOC0weDNCICovCisJMHhCQSwgMHhDQSwgMHhBNSwgMHhGOCwgMHhCOCwgMHhFQSwgMHhBOCwgMHhGMywgLyogMHgzQy0weDNGICovCisJMHhCMiwgMHhCRCwgMHhBNSwgMHhGMCwgMHhBNiwgMHhEQiwgMHhBNiwgMHhEQywgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhBNCwgMHg0MCwgMHhBNCwgMHg0NywgMHhBNCwgMHg1NCwgMHhBNSwgMHg3QywgLyogMHg4MC0weDgzICovCisJMHhBNCwgMHhBRCwgMHhBNCwgMHhCQiwgMHhBNCwgMHg0MywgMHhBNCwgMHg0QiwgLyogMHg4NC0weDg3ICovCisJMHhBNCwgMHg0NSwgMHhBNCwgMHg1MSwgMHhBNCwgMHhFQiwgMHhBNCwgMHhGNSwgLyogMHg4OC0weDhCICovCisJMHhBNCwgMHhGNCwgMHhBNCwgMHhFQywgMHhBQSwgMHhGNywgMHhBNCwgMHg2NywgLyogMHg4Qy0weDhGICovCisJMHhBNCwgMHhFOSwgMHhBRSwgMHhFOCwgMHhBNiwgMHhCMywgMHhBQSwgMHhDMCwgLyogMHg5MC0weDkzICovCisJMHhBNiwgMHg1NywgMHhBRiwgMHg1MywgMHhCMCwgMHg1RCwgMHhBRiwgMHhBQywgLyogMHg5NC0weDk3ICovCisJMHhCMywgMHhEMiwgMHhBRiwgMHhCNSwgMHhBOCwgMHg2QiwgMHhBNCwgMHg2QiwgLyogMHg5OC0weDlCICovCisJMHhCRSwgMHg0MSwgMHhDMCwgMHg3NSwgMHhBNiwgMHg0QywgMHhBQSwgMHg2MCwgLyogMHg5Qy0weDlGICovCisJMHhCNiwgMHhCNSwgMHhBNSwgMHhGMCwgMHhCQywgMHg2NywgMHhBMSwgMHhDMCwgLyogMHhBMC0weEEzICovCisJMHhBNCwgMHg1NywgMHhBNCwgMHhBNCwgMHhBNCwgMHg1NSwgMHhBNSwgMHhBQSwgLyogMHhBNC0weEE3ICovCisJMHhBNSwgMHg2QiwgMHhDMiwgMHhFNSwgMHhBOSwgMHg3NiwgMHhCRSwgMHhDNywgLyogMHhBOC0weEFCICovCisJMHhCQSwgMHhDQSwgMHhBNSwgMHhGOCwgMHhCOCwgMHhFQSwgMHhBOCwgMHhGMywgLyogMHhBQy0weEFGICovCisJMHhBOSwgMHg1RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMzNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEEyLCAweDU1LCAweEEyLCAweDU2LCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEEyLCAweDUwLCAweEEyLCAweDUxLCAweEEyLCAweDUyLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEEyLCAweDU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEEyLCAweDU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEEyLCAweDUzLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEExLCAweEVCLCAweEExLCAweEVBLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweEEyLCAweDRGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY180RVs1MTJdID0geworCTB4QTQsIDB4NDAsIDB4QTQsIDB4NDIsIDB4MDAsIDB4MDAsIDB4QTQsIDB4NDMsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzksIDB4NDUsIC8qIDB4MDQtMHgwNyAqLworCTB4QTQsIDB4NTYsIDB4QTQsIDB4NTQsIDB4QTQsIDB4NTcsIDB4QTQsIDB4NTUsIC8qIDB4MDgtMHgwQiAqLworCTB4QzksIDB4NDYsIDB4QTQsIDB4QTMsIDB4QzksIDB4NEYsIDB4QzksIDB4NEQsIC8qIDB4MEMtMHgwRiAqLworCTB4QTQsIDB4QTIsIDB4QTQsIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4QTUsIDB4NDIsIDB4QTUsIDB4NDEsIDB4QTUsIDB4NDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4QTUsIDB4NDMsIDB4QTQsIDB4RkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTUsIDB4RTAsIDB4QTUsIDB4RTEsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QzMsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4NTgsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4QTQsIDB4QzksIDB4NTAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4QTQsIDB4QTUsIDB4QzksIDB4NjMsIDB4QTYsIDB4RUEsIDB4Q0IsIDB4QjEsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4QTQsIDB4NTksIDB4QTQsIDB4QTYsIDB4MDAsIDB4MDAsIDB4QTUsIDB4NDQsIC8qIDB4MzgtMHgzQiAqLworCTB4QzksIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzksIDB4NDAsIDB4QTQsIDB4NDQsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4NUIsIDB4MDAsIDB4MDAsIDB4QzksIDB4NDcsIC8qIDB4NDQtMHg0NyAqLworCTB4QTQsIDB4NUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4QTcsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4QTUsIDB4NDUsIDB4QTUsIDB4NDcsIDB4QTUsIDB4NDYsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTUsIDB4RTIsIDB4QTUsIDB4RTMsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QzQsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4QUQsIDB4QkMsIDB4QTQsIDB4NDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4QzksIDB4NDEsIDB4QTQsIDB4NDUsIDB4QTQsIDB4NUUsIDB4QTQsIDB4NUQsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4QTUsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QzUsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjAsIDB4QUUsIDB4RDQsIDB4NEIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjYsIDB4QzMsIDB4REMsIDB4QjEsIC8qIDB4ODAtMHg4MyAqLworCTB4REMsIDB4QjIsIDB4MDAsIDB4MDAsIDB4QTQsIDB4NDYsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4QTQsIDB4QTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QzYsIC8qIDB4ODgtMHg4QiAqLworCTB4QTQsIDB4NDcsIDB4QzksIDB4NDgsIDB4QTQsIDB4NUYsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4QUEsIDB4QTQsIDB4QUMsIDB4QzksIDB4NTEsIC8qIDB4OTAtMHg5MyAqLworCTB4QTQsIDB4QUQsIDB4QTQsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4QTUsIDB4RTUsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QzcsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QzgsIDB4QUIsIDB4NDUsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4NjAsIDB4QTQsIDB4QUUsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4QTUsIDB4RTYsIDB4QTUsIDB4RTgsIDB4QTUsIDB4RTcsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4QTYsIDB4RUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QzksIC8qIDB4QTgtMHhBQiAqLworCTB4QTgsIDB4Q0EsIDB4QUIsIDB4NDYsIDB4QUIsIDB4NDcsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUQsIDB4QkQsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4QjMsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4RDYsIDB4QTQsIDB4NDgsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4QTQsIDB4QjAsIDB4QTQsIDB4QUYsIDB4QzksIDB4NTIsIDB4QTQsIDB4QjEsIC8qIDB4QzAtMHhDMyAqLworCTB4QTQsIDB4QjcsIDB4MDAsIDB4MDAsIDB4QTQsIDB4QjIsIDB4QTQsIDB4QjMsIC8qIDB4QzQtMHhDNyAqLworCTB4QzksIDB4NTQsIDB4QzksIDB4NTMsIDB4QTQsIDB4QjUsIDB4QTQsIDB4QjYsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4QTUsIDB4NEEsIDB4QTUsIDB4NEIsIDB4QTUsIDB4NEMsIDB4QTUsIDB4NEQsIC8qIDB4RDQtMHhENyAqLworCTB4QTUsIDB4NDksIDB4QTUsIDB4NTAsIDB4QzksIDB4NkEsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4QzksIDB4NjYsIDB4QzksIDB4NjksIDB4QTUsIDB4NTEsIDB4QTUsIDB4NjEsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4QzksIDB4NjgsIDB4MDAsIDB4MDAsIDB4QTUsIDB4NEUsIC8qIDB4RTAtMHhFMyAqLworCTB4QTUsIDB4NEYsIDB4QTUsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4QzksIDB4NjUsIDB4QzksIDB4NjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4QTUsIDB4RjUsIDB4QzksIDB4QjAsIDB4QTUsIDB4RjIsIDB4QTUsIDB4RjYsIC8qIDB4RjAtMHhGMyAqLworCTB4QzksIDB4QkEsIDB4QzksIDB4QUUsIDB4QTUsIDB4RjMsIDB4QzksIDB4QjIsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTUsIDB4RjQsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4QTUsIDB4RjcsIDB4MDAsIDB4MDAsIDB4QTUsIDB4RTksIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzRGWzUxMl0gPSB7CisJMHhDOSwgMHhCMSwgMHhBNSwgMHhGOCwgMHhDOSwgMHhCNSwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhDOSwgMHhCOSwgMHhDOSwgMHhCNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhDOSwgMHhCMywgMHhBNSwgMHhFQSwgMHhBNSwgMHhFQywgMHhBNSwgMHhGOSwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhBNSwgMHhFRSwgMHhDOSwgMHhBQiwgMHhBNSwgMHhGMSwgLyogMHgwQy0weDBGICovCisJMHhBNSwgMHhFRiwgMHhBNSwgMHhGMCwgMHhDOSwgMHhCQiwgMHhDOSwgMHhCOCwgLyogMHgxMC0weDEzICovCisJMHhDOSwgMHhBRiwgMHhBNSwgMHhFRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhDOSwgMHhBQywgMHhBNSwgMHhFQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhDOSwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDOSwgMHhCNywgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhDOSwgMHhBRCwgMHhDQSwgMHg2NiwgMHgwMCwgMHgwMCwgMHhBNywgMHg0MiwgLyogMHgyQy0weDJGICovCisJMHhBNiwgMHhGNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHg2NywgLyogMHgzMC0weDMzICovCisJMHhBNiwgMHhGMSwgMHgwMCwgMHgwMCwgMHhBNywgMHg0NCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhBNiwgMHhGOSwgMHgwMCwgMHgwMCwgMHhBNiwgMHhGOCwgMHhDQSwgMHg1QiwgLyogMHgzOC0weDNCICovCisJMHhBNiwgMHhGQywgMHhBNiwgMHhGNywgMHhDQSwgMHg2MCwgMHhDQSwgMHg2OCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHhDQSwgMHg2NCwgMHgwMCwgMHgwMCwgMHhBNiwgMHhGQSwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNiwgMHhGRCwgMHhBNiwgMHhFRSwgLyogMHg0NC0weDQ3ICovCisJMHhBNywgMHg0NywgMHhDQSwgMHg1RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhDQiwgMHhCRCwgMHhBNiwgMHhFQywgMHhBNywgMHg0MywgMHhBNiwgMHhFRCwgLyogMHg0Qy0weDRGICovCisJMHhBNiwgMHhGNSwgMHhBNiwgMHhGNiwgMHhDQSwgMHg2MiwgMHhDQSwgMHg1RSwgLyogMHg1MC0weDUzICovCisJMHhBNiwgMHhGQiwgMHhBNiwgMHhGMywgMHhDQSwgMHg1QSwgMHhBNiwgMHhFRiwgLyogMHg1NC0weDU3ICovCisJMHhDQSwgMHg2NSwgMHhBNywgMHg0NSwgMHhBNywgMHg0OCwgMHhBNiwgMHhGMiwgLyogMHg1OC0weDVCICovCisJMHhBNywgMHg0MCwgMHhBNywgMHg0NiwgMHhBNiwgMHhGMCwgMHhDQSwgMHg2MywgLyogMHg1Qy0weDVGICovCisJMHhBNywgMHg0MSwgMHhDQSwgMHg2OSwgMHhDQSwgMHg1QywgMHhBNiwgMHhGRSwgLyogMHg2MC0weDYzICovCisJMHhDQSwgMHg1RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHg2MSwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhBOCwgMHhEOCwgMHhDQiwgMHhCRiwgMHhDQiwgMHhDQiwgLyogMHg2OC0weDZCICovCisJMHhBOCwgMHhEMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhDQywgMHhBOCwgMHhDQiwgLyogMHg2Qy0weDZGICovCisJMHhBOCwgMHhENSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHhDRSwgLyogMHg3MC0weDczICovCisJMHhDQiwgMHhCOSwgMHhBOCwgMHhENiwgMHhDQiwgMHhCOCwgMHhDQiwgMHhCQywgLyogMHg3NC0weDc3ICovCisJMHhDQiwgMHhDMywgMHhDQiwgMHhDMSwgMHhBOCwgMHhERSwgMHhBOCwgMHhEOSwgLyogMHg3OC0weDdCICovCisJMHhDQiwgMHhCMywgMHhDQiwgMHhCNSwgMHhBOCwgMHhEQiwgMHhBOCwgMHhDRiwgLyogMHg3Qy0weDdGICovCisJCisJMHhDQiwgMHhCNiwgMHhDQiwgMHhDMiwgMHhDQiwgMHhDOSwgMHhBOCwgMHhENCwgLyogMHg4MC0weDgzICovCisJMHhDQiwgMHhCQiwgMHhDQiwgMHhCNCwgMHhBOCwgMHhEMywgMHhDQiwgMHhCNywgLyogMHg4NC0weDg3ICovCisJMHhBOCwgMHhENywgMHhDQiwgMHhCQSwgMHgwMCwgMHgwMCwgMHhBOCwgMHhEMiwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhBOCwgMHhDRCwgMHgwMCwgMHgwMCwgMHhBOCwgMHhEQywgLyogMHg4Qy0weDhGICovCisJMHhDQiwgMHhDNCwgMHhBOCwgMHhERCwgMHhDQiwgMHhDOCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhDQiwgMHhDNiwgMHhDQiwgMHhDQSwgMHhBOCwgMHhEQSwgMHhDQiwgMHhCRSwgLyogMHg5NC0weDk3ICovCisJMHhDQiwgMHhCMiwgMHgwMCwgMHgwMCwgMHhDQiwgMHhDMCwgMHhBOCwgMHhEMSwgLyogMHg5OC0weDlCICovCisJMHhDQiwgMHhDNSwgMHhBOCwgMHhDQywgMHhDQiwgMHhDNywgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQiwgMHg1NiwgMHhBQiwgMHg0QSwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRCwgMHhFMCwgMHhDRCwgMHhFOCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHhBQiwgMHg0OSwgMHhBQiwgMHg1MSwgMHhBQiwgMHg1RCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhFRSwgMHhDRCwgMHhFQywgMHhDRCwgMHhFNywgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQiwgMHg0QiwgLyogMHhCQy0weEJGICovCisJMHhDRCwgMHhFRCwgMHhDRCwgMHhFMywgMHhBQiwgMHg1OSwgMHhBQiwgMHg1MCwgLyogMHhDMC0weEMzICovCisJMHhBQiwgMHg1OCwgMHhDRCwgMHhERSwgMHgwMCwgMHgwMCwgMHhDRCwgMHhFQSwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhFMSwgMHhBQiwgMHg1NCwgMHhDRCwgMHhFMiwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhERCwgMHhBQiwgMHg1QiwgMHhBQiwgMHg0RSwgLyogMHhDQy0weENGICovCisJMHhBQiwgMHg1NywgMHhBQiwgMHg0RCwgMHgwMCwgMHgwMCwgMHhDRCwgMHhERiwgLyogMHhEMC0weEQzICovCisJMHhDRCwgMHhFNCwgMHgwMCwgMHgwMCwgMHhDRCwgMHhFQiwgMHhBQiwgMHg1NSwgLyogMHhENC0weEQ3ICovCisJMHhBQiwgMHg1MiwgMHhDRCwgMHhFNiwgMHhBQiwgMHg1QSwgMHhDRCwgMHhFOSwgLyogMHhEOC0weERCICovCisJMHhDRCwgMHhFNSwgMHhBQiwgMHg0RiwgMHhBQiwgMHg1QywgMHhBQiwgMHg1MywgLyogMHhEQy0weERGICovCisJMHhBQiwgMHg0QywgMHhBQiwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHhDRCwgMHhFRiwgMHgwMCwgMHgwMCwgMHhBRCwgMHhENywgMHhBRCwgMHhDMSwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhBRCwgMHhEMSwgMHgwMCwgMHgwMCwgMHhBRCwgMHhENiwgLyogMHhGMC0weEYzICovCisJMHhEMCwgMHhEMCwgMHhEMCwgMHhDRiwgMHhEMCwgMHhENCwgMHhEMCwgMHhENSwgLyogMHhGNC0weEY3ICovCisJMHhBRCwgMHhDNCwgMHgwMCwgMHgwMCwgMHhBRCwgMHhDRCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBRCwgMHhEQSwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTBbNTEyXSA9IHsKKwkweEFELCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEQwLCAweEM5LCAweEFELCAweEM3LCAweEQwLCAweENBLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEFELCAweERDLCAweDAwLCAweDAwLCAweEFELCAweEQzLCAvKiAweDA4LTB4MEIgKi8KKwkweEFELCAweEJFLCAweEFELCAweEJGLCAweEQwLCAweERELCAweEIwLCAweEJGLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEFELCAweENDLCAweEFELCAweENCLCAweEQwLCAweENCLCAvKiAweDEwLTB4MTMgKi8KKwkweEFELCAweENGLCAweEQ0LCAweDVCLCAweEFELCAweEM2LCAweEQwLCAweEQ2LCAvKiAweDE0LTB4MTcgKi8KKwkweEFELCAweEQ1LCAweEFELCAweEQ0LCAweEFELCAweENBLCAweEQwLCAweENFLCAvKiAweDE4LTB4MUIgKi8KKwkweEQwLCAweEQ3LCAweDAwLCAweDAwLCAweEQwLCAweEM4LCAweEFELCAweEM5LCAvKiAweDFDLTB4MUYgKi8KKwkweEQwLCAweEQ4LCAweEFELCAweEQyLCAweEQwLCAweENDLCAweEFELCAweEMwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEFELCAweEMzLCAweEFELCAweEMyLCAweEQwLCAweEQ5LCAvKiAweDI0LTB4MjcgKi8KKwkweEFELCAweEQwLCAweEFELCAweEM1LCAweEFELCAweEQ5LCAweEFELCAweERCLCAvKiAweDI4LTB4MkIgKi8KKwkweEQwLCAweEQzLCAweEFELCAweEQ4LCAweDAwLCAweDAwLCAweEQwLCAweERCLCAvKiAweDJDLTB4MkYgKi8KKwkweEQwLCAweENELCAweEQwLCAweERDLCAweDAwLCAweDAwLCAweEQwLCAweEQxLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEQwLCAweERBLCAweDAwLCAweDAwLCAweEQwLCAweEQyLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweEFELCAweEM4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweEQ0LCAweDYzLCAweEQ0LCAweDU3LCAweDAwLCAweDAwLCAweEIwLCAweEIzLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweEQ0LCAweDVDLCAweEQ0LCAweDYyLCAweEIwLCAweEIyLCAvKiAweDQ0LTB4NDcgKi8KKwkweEQ0LCAweDU1LCAweEIwLCAweEI2LCAweEQ0LCAweDU5LCAweEQ0LCAweDUyLCAvKiAweDQ4LTB4NEIgKi8KKwkweEIwLCAweEI0LCAweEQ0LCAweDU2LCAweEIwLCAweEI5LCAweEIwLCAweEJFLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweEQ0LCAweDY3LCAweDAwLCAweDAwLCAweEQ0LCAweDUxLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEIwLCAweEJBLCAweDAwLCAweDAwLCAweEQ0LCAweDY2LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIwLCAweEI1LCAweEQ0LCAweDU4LCAvKiAweDU4LTB4NUIgKi8KKwkweEIwLCAweEIxLCAweEQ0LCAweDUzLCAweEQ0LCAweDRGLCAweEQ0LCAweDVELCAvKiAweDVDLTB4NUYgKi8KKwkweEQ0LCAweDUwLCAweEQ0LCAweDRFLCAweEQ0LCAweDVBLCAweEQ0LCAweDYwLCAvKiAweDYwLTB4NjMgKi8KKwkweEQ0LCAweDYxLCAweEIwLCAweEI3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEQ4LCAweDVCLCAweEQ0LCAweDVFLCAweEQ0LCAweDRELCAweEQ0LCAweDVGLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEIwLCAweEMxLCAweEQ0LCAweDY0LCAweEIwLCAweEMwLCAvKiAweDZDLTB4NkYgKi8KKwkweEQ0LCAweDRDLCAweDAwLCAweDAwLCAweEQ0LCAweDU0LCAweEQ0LCAweDY1LCAvKiAweDcwLTB4NzMgKi8KKwkweEIwLCAweEJDLCAweEIwLCAweEJCLCAweEIwLCAweEI4LCAweEIwLCAweEJELCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIwLCAweEFGLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEIwLCAweEIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEIzLCAweEM4LCAweDAwLCAweDAwLCAweEQ4LCAweDVFLCAweEQ4LCAweDU3LCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweEIzLCAweEM1LCAweDAwLCAweDAwLCAweEQ4LCAweDVGLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweDU1LCAvKiAweDg4LTB4OEIgKi8KKwkweEQ4LCAweDU4LCAweEIzLCAweEM0LCAweEQ4LCAweDU5LCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEIzLCAweEM3LCAweEQ4LCAweDVELCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEQ4LCAweDUzLCAweEQ4LCAweDUyLCAweEIzLCAweEM5LCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweEIzLCAweENBLCAweEIzLCAweEM2LCAweEIzLCAweENCLCAweEQ4LCAweDUxLCAvKiAweDk4LTB4OUIgKi8KKwkweEQ4LCAweDVDLCAweEQ4LCAweDVBLCAweEQ4LCAweDU0LCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIzLCAweEMzLCAweEQ4LCAweDU2LCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweEI2LCAweENBLCAweEI2LCAweEM0LCAweERDLCAweEI3LCAweEI2LCAweENELCAvKiAweEFDLTB4QUYgKi8KKwkweERDLCAweEJELCAweERDLCAweEMwLCAweEI2LCAweEM2LCAweEI2LCAweEM3LCAvKiAweEIwLTB4QjMgKi8KKwkweERDLCAweEJBLCAweEI2LCAweEM1LCAweERDLCAweEMzLCAweEI2LCAweENCLCAvKiAweEI0LTB4QjcgKi8KKwkweERDLCAweEM0LCAweDAwLCAweDAwLCAweERDLCAweEJGLCAweEI2LCAweENDLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweERDLCAweEI0LCAweEI2LCAweEM5LCAweERDLCAweEI1LCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweERDLCAweEJFLCAweERDLCAweEJDLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweERDLCAweEI4LCAweEI2LCAweEM4LCAweERDLCAweEI2LCAweEI2LCAweENFLCAvKiAweEM0LTB4QzcgKi8KKwkweERDLCAweEJCLCAweERDLCAweEMyLCAweERDLCAweEI5LCAweERDLCAweEMxLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI5LCAweEI2LCAweEI5LCAweEIzLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEI5LCAweEI0LCAweDAwLCAweDAwLCAweEUwLCAweEY5LCAvKiAweEQwLTB4RDMgKi8KKwkweEUwLCAweEYxLCAweEI5LCAweEIyLCAweEI5LCAweEFGLCAweEUwLCAweEYyLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI5LCAweEIxLCAweEUwLCAweEY1LCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweEUwLCAweEZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEZELCAvKiAweEUwLTB4RTMgKi8KKwkweEUwLCAweEY4LCAweEI5LCAweEFFLCAweEUwLCAweEYwLCAweEI5LCAweEFDLCAvKiAweEU0LTB4RTcgKi8KKwkweEUwLCAweEYzLCAweEI5LCAweEI3LCAweEUwLCAweEY2LCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweEUwLCAweEZBLCAweEI5LCAweEIwLCAweEI5LCAweEFELCAweEUwLCAweEZDLCAvKiAweEVDLTB4RUYgKi8KKwkweEUwLCAweEZCLCAweEI5LCAweEI1LCAweDAwLCAweDAwLCAweEUwLCAweEY0LCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweEJCLCAweEY4LCAweEU0LCAweEVDLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEU0LCAweEU5LCAweEJCLCAweEY5LCAweDAwLCAweDAwLCAweEJCLCAweEY3LCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweEYwLCAweEU0LCAweEVELCAweEU0LCAweEU2LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181MVs1MTJdID0geworCTB4QkIsIDB4RjYsIDB4MDAsIDB4MDAsIDB4QkIsIDB4RkEsIDB4RTQsIDB4RTcsIC8qIDB4MDAtMHgwMyAqLworCTB4QkIsIDB4RjUsIDB4QkIsIDB4RkQsIDB4RTQsIDB4RUEsIDB4RTQsIDB4RUIsIC8qIDB4MDQtMHgwNyAqLworCTB4QkIsIDB4RkIsIDB4QkIsIDB4RkMsIDB4RTQsIDB4RjEsIDB4RTQsIDB4RUUsIC8qIDB4MDgtMHgwQiAqLworCTB4RTQsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4QkUsIDB4QUEsIDB4RTgsIDB4RjgsIDB4QkUsIDB4QTcsIDB4RTgsIDB4RjUsIC8qIDB4MTAtMHgxMyAqLworCTB4QkUsIDB4QTksIDB4QkUsIDB4QUIsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RjYsIC8qIDB4MTQtMHgxNyAqLworCTB4QkUsIDB4QTgsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RjcsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4RTgsIDB4RjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzAsIDB4NzYsIC8qIDB4MUMtMHgxRiAqLworCTB4RUMsIDB4QkQsIDB4QzAsIDB4NzcsIDB4RUMsIDB4QkIsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4RUMsIDB4QkMsIDB4RUMsIDB4QkEsIDB4RUMsIDB4QjksIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4RUMsIDB4QkUsIDB4QzAsIDB4NzUsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4RUYsIDB4QjgsIDB4RUYsIDB4QjksIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RTQsIDB4RTgsIDB4RUYsIDB4QjcsIDB4QzAsIDB4NzgsIDB4QzMsIDB4NUYsIC8qIDB4MzAtMHgzMyAqLworCTB4RjEsIDB4RUIsIDB4RjEsIDB4RUMsIDB4MDAsIDB4MDAsIDB4QzQsIDB4RDcsIC8qIDB4MzQtMHgzNyAqLworCTB4QzQsIDB4RDgsIDB4RjUsIDB4QzEsIDB4RjUsIDB4QzAsIDB4QzUsIDB4NkMsIC8qIDB4MzgtMHgzQiAqLworCTB4QzUsIDB4NkIsIDB4RjcsIDB4RDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4NDksIC8qIDB4M0MtMHgzRiAqLworCTB4QTQsIDB4NjEsIDB4QTQsIDB4QjksIDB4MDAsIDB4MDAsIDB4QTQsIDB4QjgsIC8qIDB4NDAtMHg0MyAqLworCTB4QTUsIDB4NTMsIDB4QTUsIDB4NTIsIDB4QTUsIDB4RkMsIDB4QTUsIDB4RkIsIC8qIDB4NDQtMHg0NyAqLworCTB4QTUsIDB4RkQsIDB4QTUsIDB4RkEsIDB4MDAsIDB4MDAsIDB4QTcsIDB4NEEsIC8qIDB4NDgtMHg0QiAqLworCTB4QTcsIDB4NDksIDB4QTcsIDB4NEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4RTAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4QTgsIDB4REYsIDB4QTgsIDB4RTEsIDB4MDAsIDB4MDAsIDB4QUIsIDB4NUUsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4QTIsIDB4NTksIDB4RDAsIDB4REUsIDB4QTIsIDB4NUEsIC8qIDB4NTgtMHg1QiAqLworCTB4QjAsIDB4QzIsIDB4QTIsIDB4NUMsIDB4QTIsIDB4NUIsIDB4RDgsIDB4NjAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4QTIsIDB4NUQsIDB4QjksIDB4QjgsIDB4QTIsIDB4NUUsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4NEEsIDB4MDAsIDB4MDAsIDB4QTQsIDB4QkEsIC8qIDB4NjQtMHg2NyAqLworCTB4QTUsIDB4RkUsIDB4QTgsIDB4RTIsIDB4MDAsIDB4MDAsIDB4QTQsIDB4NEIsIC8qIDB4NjgtMHg2QiAqLworCTB4QTQsIDB4QkQsIDB4QTQsIDB4QkIsIDB4QTQsIDB4QkMsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4QTYsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4QTcsIDB4NEMsIDB4QTgsIDB4RTQsIDB4QTgsIDB4RTMsIC8qIDB4NzQtMHg3NyAqLworCTB4QTgsIDB4RTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4QUQsIDB4REQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QkUsIDB4QUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzksIDB4NEUsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4QTUsIDB4NTQsIDB4QTUsIDB4NTUsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4QTYsIDB4NDEsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4NkEsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4QUIsIDB4NjAsIDB4QUIsIDB4NUYsIDB4RDAsIDB4RTAsIC8qIDB4OTAtMHg5MyAqLworCTB4RDAsIDB4REYsIDB4QjAsIDB4QzMsIDB4MDAsIDB4MDAsIDB4QTQsIDB4QkUsIC8qIDB4OTQtMHg5NyAqLworCTB4QzksIDB4NTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4Q0QsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4QUIsIDB4NjEsIDB4MDAsIDB4MDAsIDB4QUQsIDB4RTAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4QUQsIDB4REUsIDB4QUQsIDB4REYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkUsIDB4QUQsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4QTUsIDB4NTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4QTYsIDB4NDIsIDB4QzksIDB4QkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTcsIDB4NEQsIDB4QTcsIDB4NEUsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4Q0EsIDB4NkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4Q0IsIDB4Q0UsIDB4QTgsIDB4RTYsIDB4Q0IsIDB4Q0YsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RDAsIDB4RTIsIDB4RDAsIDB4RTMsIDB4QUQsIDB4RTMsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4RDAsIDB4RTQsIDB4MDAsIDB4MDAsIDB4RDAsIDB4RTEsIDB4QUQsIDB4RTQsIC8qIDB4QzgtMHhDQiAqLworCTB4QUQsIDB4RTIsIDB4QUQsIDB4RTEsIDB4RDAsIDB4RTUsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4RDQsIDB4NjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RDgsIDB4NjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4QzUsIC8qIDB4RDQtMHhENyAqLworCTB4RTEsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4QkIsIDB4RkUsIDB4QkUsIDB4QUUsIDB4RTgsIDB4RjksIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4QTQsIDB4NEMsIDB4QTQsIDB4NUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4QjAsIDB4QzQsIDB4QjMsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4QjksIDB4QjksIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4QzksIDB4NDIsIDB4QTQsIDB4QkYsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4QTUsIDB4NTksIDB4QTUsIDB4NTcsIDB4QTUsIDB4NTgsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4QTgsIDB4RTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzUyWzUxMl0gPSB7CisJMHhBNCwgMHg0RCwgMHhBNCwgMHg0RSwgMHgwMCwgMHgwMCwgMHhBNCwgMHg2MiwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHhDMCwgMHhBNCwgMHhDMSwgLyogMHgwNC0weDA3ICovCisJMHhBNCwgMHhDMiwgMHhDOSwgMHhCRSwgMHhBNSwgMHg1QSwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhDOSwgMHg2QiwgMHgwMCwgMHgwMCwgMHhBNiwgMHg0NiwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhDOSwgMHhCRiwgMHhBNiwgMHg0NCwgMHhBNiwgMHg0NSwgMHhDOSwgMHhCRCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNiwgMHg0NywgMHhBNiwgMHg0MywgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhDQSwgMHg2QywgMHhBQSwgMHhFQywgMHhDQSwgMHg2RCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhDQSwgMHg2RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHhBNywgMHg1MCwgMHhBNywgMHg0RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhBNywgMHg1MywgMHhBNywgMHg1MSwgMHhBNywgMHg1MiwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHhFRCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhBOCwgMHhFQywgMHhDQiwgMHhENCwgMHhDQiwgMHhEMSwgMHhDQiwgMHhEMiwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhDQiwgMHhEMCwgMHhBOCwgMHhFRSwgMHhBOCwgMHhFQSwgLyogMHgzNC0weDM3ICovCisJMHhBOCwgMHhFOSwgMHgwMCwgMHgwMCwgMHhBOCwgMHhFQiwgMHhBOCwgMHhFOCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHhBOCwgMHhFRiwgMHgwMCwgMHgwMCwgMHhBQiwgMHg2MywgLyogMHg0MC0weDQzICovCisJMHhDRCwgMHhGMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhEMywgMHhBQiwgMHg2OCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhGMSwgMHhBQiwgMHg2NCwgMHhBQiwgMHg2NywgLyogMHg0OC0weDRCICovCisJMHhBQiwgMHg2NiwgMHhBQiwgMHg2NSwgMHhBQiwgMHg2MiwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhFOCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhBRCwgMHhFNywgMHhEMCwgMHhFQiwgMHhBRCwgMHhFNSwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhFNywgMHhBRCwgMHhFOCwgLyogMHg1OC0weDVCICovCisJMHhBRCwgMHhFNiwgMHhBRCwgMHhFOSwgMHhEMCwgMHhFOSwgMHhEMCwgMHhFQSwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhEMCwgMHhFNiwgMHhEMCwgMHhFQywgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhCMywgMHhEMSwgMHhCMCwgMHhDNSwgMHhENCwgMHg2OSwgLyogMHg2OC0weDZCICovCisJMHhENCwgMHg2QiwgMHhENCwgMHg2QSwgMHhENCwgMHg2QywgMHhCMCwgMHhDNiwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMywgMHhDRSwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhCMywgMHhDRiwgMHhCMywgMHhEMCwgMHgwMCwgMHgwMCwgMHhCNiwgMHhEMCwgLyogMHg3NC0weDc3ICovCisJMHhEQywgMHhDNywgMHgwMCwgMHgwMCwgMHhEQywgMHhDNiwgMHhEQywgMHhDOCwgLyogMHg3OC0weDdCICovCisJMHhEQywgMHhDOSwgMHhCNiwgMHhEMSwgMHgwMCwgMHgwMCwgMHhCNiwgMHhDRiwgLyogMHg3Qy0weDdGICovCisJCisJMHhFMSwgMHg0MSwgMHhFMSwgMHg0MiwgMHhCOSwgMHhCQiwgMHhCOSwgMHhCQSwgLyogMHg4MC0weDgzICovCisJMHhFMywgMHg1QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQywgMHg0MCwgLyogMHg4NC0weDg3ICovCisJMHhCQywgMHg0MSwgMHhCQywgMHg0MiwgMHhCQywgMHg0NCwgMHhFNCwgMHhGMiwgLyogMHg4OC0weDhCICovCisJMHhFNCwgMHhGMywgMHhCQywgMHg0MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhCRSwgMHhBRiwgMHgwMCwgMHgwMCwgMHhCRSwgMHhCMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhFRCwgMHhGNSwgMHhDMywgLyogMHg5NC0weDk3ICovCisJMHhGNSwgMHhDMiwgMHhGNywgMHhEMSwgMHgwMCwgMHgwMCwgMHhBNCwgMHg0RiwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNSwgMHg1QywgLyogMHg5Qy0weDlGICovCisJMHhBNSwgMHg1QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNiwgMHg0OCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDOSwgMHhDMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHhBNywgMHg1NSwgMHhBNywgMHg1NiwgMHhBNywgMHg1NCwgLyogMHhBOC0weEFCICovCisJMHhBNywgMHg1NywgMHhDQSwgMHg2RiwgMHhDQSwgMHg3MCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHhGMSwgLyogMHhCOC0weEJCICovCisJMHhDQiwgMHhENSwgMHgwMCwgMHgwMCwgMHhBOCwgMHhGMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhDRCwgMHhGMiwgMHhBQiwgMHg2QywgMHhDRCwgMHhGMywgMHhBQiwgMHg2QiwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQiwgMHg2OSwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhBQiwgMHg2QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhEMCwgMHhFRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMCwgMHhDNywgMHhENCwgMHg2RSwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhCMCwgMHhDQSwgMHhENCwgMHg2RCwgMHhCMSwgMHhFNSwgLyogMHhENC0weEQ3ICovCisJMHhCMCwgMHhDOSwgMHhCMCwgMHhDOCwgMHgwMCwgMHgwMCwgMHhCMywgMHhENCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhCMywgMHhEMywgMHhCMywgMHhEMiwgMHhCNiwgMHhEMiwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNiwgMHhENSwgMHhCNiwgMHhENiwgLyogMHhFMC0weEUzICovCisJMHhCNiwgMHhENCwgMHgwMCwgMHgwMCwgMHhCNiwgMHhEMywgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHg0MywgMHgwMCwgMHgwMCwgMHhFMSwgMHg0NCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhGNSwgLyogMHhFQy0weEVGICovCisJMHhCQywgMHg0NSwgMHhFNCwgMHhGNCwgMHgwMCwgMHgwMCwgMHhCRSwgMHhCMSwgLyogMHhGMC0weEYzICovCisJMHhFQywgMHhCRiwgMHhDMCwgMHg3OSwgMHgwMCwgMHgwMCwgMHhGMSwgMHhFRSwgLyogMHhGNC0weEY3ICovCisJMHhDNCwgMHg1NSwgMHgwMCwgMHgwMCwgMHhBNCwgMHg2MywgMHhBNCwgMHhDMywgLyogMHhGOC0weEZCICovCisJMHhDOSwgMHg1NiwgMHgwMCwgMHgwMCwgMHhBNCwgMHhDNCwgMHhBNCwgMHhDNSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEE1LCAweDVELCAweEE1LCAweDVFLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEE2LCAweDQ5LCAweENBLCAweDcxLCAweENCLCAweEQ2LCAweENCLCAweEQ3LCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEFCLCAweDZELCAweEQwLCAweEVFLCAweEIwLCAweENDLCAvKiAweDBDLTB4MEYgKi8KKwkweEIwLCAweENCLCAweEQ4LCAweDYzLCAweEQ4LCAweDYyLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweEE0LCAweDUwLCAweEE0LCAweEM2LCAweEE1LCAweDVGLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEIwLCAweENELCAweEM5LCAweDQzLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweEM5LCAweDZDLCAweEE1LCAweDYwLCAweDAwLCAweDAwLCAweEM5LCAweEMyLCAvKiAweDFDLTB4MUYgKi8KKwkweEE2LCAweDRCLCAweEE2LCAweDRBLCAweEM5LCAweEMxLCAweEE3LCAweDU4LCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFELCAweEVBLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweEQ0LCAweDZGLCAweDAwLCAweDAwLCAweEI2LCAweEQ3LCAvKiAweDJDLTB4MkYgKi8KKwkweEUxLCAweDQ1LCAweEI5LCAweEJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweEU4LCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYzLCAweEZELCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweEE0LCAweEM3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweENCLCAweEQ4LCAweENELCAweEY0LCAweEIwLCAweEQwLCAweEIwLCAweENFLCAvKiAweDNDLTB4M0YgKi8KKwkweEIwLCAweENGLCAweEE0LCAweDUxLCAweDAwLCAweDAwLCAweEE0LCAweDY0LCAvKiAweDQwLTB4NDMgKi8KKwkweEEyLCAweENELCAweEE0LCAweENBLCAweDAwLCAweDAwLCAweEE0LCAweEM5LCAvKiAweDQ0LTB4NDcgKi8KKwkweEE0LCAweEM4LCAweEE1LCAweDYzLCAweEE1LCAweDYyLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEM5LCAweDZELCAweEM5LCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweEE4LCAweEY1LCAweEE4LCAweEYyLCAweEE4LCAweEY0LCAvKiAweDUwLTB4NTMgKi8KKwkweEE4LCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFCLCAweDZFLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIzLCAweEQ1LCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweEE0LCAweDUyLCAweDAwLCAweDAwLCAweEE0LCAweENCLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEE1LCAweDY1LCAweEE1LCAweDY0LCAweDAwLCAweDAwLCAweENBLCAweDcyLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweEY2LCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEM5LCAweDU3LCAweDAwLCAweDAwLCAweEE1LCAweDY3LCAweEE1LCAweDY2LCAvKiAweDZDLTB4NkYgKi8KKwkweEE2LCAweDRDLCAweEE2LCAweDRELCAweENBLCAweDczLCAweEE3LCAweDU5LCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEE3LCAweDVBLCAweDAwLCAweDAwLCAweEE4LCAweEY3LCAvKiAweDc0LTB4NzcgKi8KKwkweEE4LCAweEY4LCAweEE4LCAweEY5LCAweDAwLCAweDAwLCAweEFCLCAweDZGLCAvKiAweDc4LTB4N0IgKi8KKwkweENELCAweEY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFELCAweEVCLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM5LCAweDQ0LCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEE0LCAweENDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM5LCAweEM0LCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweDc0LCAweENBLCAweDc1LCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENCLCAweEQ5LCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweENCLCAweERBLCAweDAwLCAweDAwLCAweENELCAweEY3LCAweENELCAweEY2LCAvKiAweDk0LTB4OTcgKi8KKwkweENELCAweEY5LCAweENELCAweEY4LCAweEFCLCAweDcwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEQ0LCAweDcwLCAweEFELCAweEVELCAweEQwLCAweEVGLCAweEFELCAweEVDLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEQ4LCAweDY0LCAweEIzLCAweEQ2LCAweDAwLCAweDAwLCAweEQ4LCAweDY1LCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweEUxLCAweDQ2LCAweEI5LCAweEJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJDLCAweDQ2LCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweEYxLCAweEVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEM5LCAweDU4LCAweDAwLCAweDAwLCAweEE1LCAweDY4LCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIwLCAweEQxLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweEE0LCAweDUzLCAweEE0LCAweDY1LCAweEE0LCAweENFLCAweEE0LCAweENELCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweEE0LCAweENGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEE4LCAweEZCLCAweDAwLCAweDAwLCAweEE4LCAweEZBLCAweEE4LCAweEZDLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFCLCAweDcxLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFELCAweEVFLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEZCLCAweEMyLCAweDRGLCAweEE0LCAweDY2LCAvKiAweEUwLTB4RTMgKi8KKwkweEE1LCAweDZBLCAweEE1LCAweDc5LCAweEE1LCAweDc0LCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEE1LCAweDZGLCAweEE1LCAweDZFLCAweEE1LCAweDc1LCAweEE1LCAweDczLCAvKiAweEU4LTB4RUIgKi8KKwkweEE1LCAweDZDLCAweEE1LCAweDdBLCAweEE1LCAweDZELCAweEE1LCAweDY5LCAvKiAweEVDLTB4RUYgKi8KKwkweEE1LCAweDc4LCAweEE1LCAweDc3LCAweEE1LCAweDc2LCAweEE1LCAweDZCLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweEE1LCAweDcyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEE1LCAweDcxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE1LCAweDdCLCAvKiAweEY4LTB4RkIgKi8KKwkweEE1LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181NFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4QTYsIDB4NTMsIDB4MDAsIDB4MDAsIDB4QTYsIDB4NTksIC8qIDB4MDAtMHgwMyAqLworCTB4QTYsIDB4NTUsIDB4MDAsIDB4MDAsIDB4QTYsIDB4NUIsIDB4QzksIDB4QzUsIC8qIDB4MDQtMHgwNyAqLworCTB4QTYsIDB4NTgsIDB4QTYsIDB4NEUsIDB4QTYsIDB4NTEsIDB4QTYsIDB4NTQsIC8qIDB4MDgtMHgwQiAqLworCTB4QTYsIDB4NTAsIDB4QTYsIDB4NTcsIDB4QTYsIDB4NUEsIDB4QTYsIDB4NEYsIC8qIDB4MEMtMHgwRiAqLworCTB4QTYsIDB4NTIsIDB4QTYsIDB4NTYsIDB4QTYsIDB4NUMsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4Q0EsIDB4N0UsIDB4Q0EsIDB4N0IsIDB4MDAsIDB4MDAsIDB4QTcsIDB4NjcsIC8qIDB4MTgtMHgxQiAqLworCTB4Q0EsIDB4N0MsIDB4QTcsIDB4NUIsIDB4QTcsIDB4NUQsIDB4QTcsIDB4NzUsIC8qIDB4MUMtMHgxRiAqLworCTB4QTcsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4Q0EsIDB4QTUsIDB4Q0EsIDB4N0QsIDB4QTcsIDB4NUYsIDB4QTcsIDB4NjEsIC8qIDB4MjQtMHgyNyAqLworCTB4Q0EsIDB4QTQsIDB4QTcsIDB4NjgsIDB4Q0EsIDB4NzgsIDB4QTcsIDB4NzQsIC8qIDB4MjgtMHgyQiAqLworCTB4QTcsIDB4NzYsIDB4QTcsIDB4NUMsIDB4QTcsIDB4NkQsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4Q0EsIDB4NzYsIDB4QTcsIDB4NzMsIDB4MDAsIDB4MDAsIDB4QTcsIDB4NjQsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4QTcsIDB4NkUsIDB4QTcsIDB4NkYsIDB4Q0EsIDB4NzcsIC8qIDB4MzQtMHgzNyAqLworCTB4QTcsIDB4NkMsIDB4QTcsIDB4NkEsIDB4MDAsIDB4MDAsIDB4QTcsIDB4NkIsIC8qIDB4MzgtMHgzQiAqLworCTB4QTcsIDB4NzEsIDB4Q0EsIDB4QTEsIDB4QTcsIDB4NUUsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4QTcsIDB4NzIsIDB4Q0EsIDB4QTMsIDB4QTcsIDB4NjYsIDB4QTcsIDB4NjMsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4Q0EsIDB4N0EsIDB4QTcsIDB4NjIsIDB4Q0EsIDB4QTYsIC8qIDB4NDQtMHg0NyAqLworCTB4QTcsIDB4NjUsIDB4MDAsIDB4MDAsIDB4QTcsIDB4NjksIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTcsIDB4NjAsIDB4Q0EsIDB4QTIsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4Q0EsIDB4NzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4Q0IsIDB4RUIsIDB4Q0IsIDB4RUEsIDB4QTksIDB4NEYsIDB4Q0IsIDB4RUQsIC8qIDB4NjAtMHg2MyAqLworCTB4Q0IsIDB4RUYsIDB4Q0IsIDB4RTQsIDB4Q0IsIDB4RTcsIDB4Q0IsIDB4RUUsIC8qIDB4NjQtMHg2NyAqLworCTB4QTksIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4RTEsIC8qIDB4NjgtMHg2QiAqLworCTB4Q0IsIDB4RTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4RTksIC8qIDB4NkMtMHg2RiAqLworCTB4Q0UsIDB4NDksIDB4QTksIDB4NEIsIDB4Q0UsIDB4NEQsIDB4QTgsIDB4RkQsIC8qIDB4NzAtMHg3MyAqLworCTB4Q0IsIDB4RTYsIDB4QTgsIDB4RkUsIDB4QTksIDB4NEMsIDB4QTksIDB4NDUsIC8qIDB4NzQtMHg3NyAqLworCTB4QTksIDB4NDEsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4RTIsIDB4QTksIDB4NDQsIC8qIDB4NzgtMHg3QiAqLworCTB4QTksIDB4NDksIDB4QTksIDB4NTIsIDB4Q0IsIDB4RTMsIDB4Q0IsIDB4REMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QTksIDB4NDMsIDB4Q0IsIDB4REQsIDB4Q0IsIDB4REYsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4QTksIDB4NDYsIDB4MDAsIDB4MDAsIDB4QTksIDB4NDgsIDB4Q0IsIDB4REIsIC8qIDB4ODQtMHg4NyAqLworCTB4Q0IsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTksIDB4NTEsIC8qIDB4ODgtMHg4QiAqLworCTB4QTksIDB4NEQsIDB4Q0IsIDB4RTgsIDB4QTksIDB4NTMsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4QTksIDB4NEEsIDB4Q0IsIDB4REUsIDB4QTksIDB4NDcsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4QTksIDB4NDIsIDB4QTksIDB4NDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4Q0IsIDB4RUMsIDB4MDAsIDB4MDAsIDB4QTksIDB4NEUsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4Q0UsIDB4NDgsIDB4Q0QsIDB4RkIsIDB4Q0UsIDB4NEIsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4Q0QsIDB4RkQsIDB4QUIsIDB4NzgsIDB4QUIsIDB4QTgsIC8qIDB4QTQtMHhBNyAqLworCTB4QUIsIDB4NzQsIDB4QUIsIDB4QTcsIDB4QUIsIDB4N0QsIDB4QUIsIDB4QTQsIC8qIDB4QTgtMHhBQiAqLworCTB4QUIsIDB4NzIsIDB4Q0QsIDB4RkMsIDB4Q0UsIDB4NDMsIDB4QUIsIDB4QTMsIC8qIDB4QUMtMHhBRiAqLworCTB4Q0UsIDB4NEYsIDB4QUIsIDB4QTUsIDB4MDAsIDB4MDAsIDB4QUIsIDB4NzksIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4NDUsIDB4Q0UsIDB4NDIsIC8qIDB4QjQtMHhCNyAqLworCTB4QUIsIDB4NzcsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4RkEsIDB4QUIsIDB4QTYsIC8qIDB4QjgtMHhCQiAqLworCTB4Q0UsIDB4NEEsIDB4QUIsIDB4N0MsIDB4Q0UsIDB4NEMsIDB4QUIsIDB4QTksIC8qIDB4QkMtMHhCRiAqLworCTB4QUIsIDB4NzMsIDB4QUIsIDB4N0UsIDB4QUIsIDB4N0IsIDB4Q0UsIDB4NDAsIC8qIDB4QzAtMHhDMyAqLworCTB4QUIsIDB4QTEsIDB4Q0UsIDB4NDYsIDB4Q0UsIDB4NDcsIDB4QUIsIDB4N0EsIC8qIDB4QzQtMHhDNyAqLworCTB4QUIsIDB4QTIsIDB4QUIsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUIsIDB4NzUsIDB4Q0QsIDB4RkUsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4NDQsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4NEUsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4RDEsIDB4NDQsIDB4QUQsIDB4RkIsIDB4RDAsIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4RDAsIDB4RjYsIDB4QUQsIDB4RjQsIDB4QUUsIDB4NDAsIDB4RDAsIDB4RjQsIC8qIDB4RTQtMHhFNyAqLworCTB4QUQsIDB4RUYsIDB4QUQsIDB4RjksIDB4QUQsIDB4RkUsIDB4RDAsIDB4RkIsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4QUQsIDB4RkEsIDB4QUQsIDB4RkQsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4RDAsIDB4RkUsIDB4QUQsIDB4RjUsIDB4RDAsIDB4RjUsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4NDIsIC8qIDB4RjQtMHhGNyAqLworCTB4RDEsIDB4NDMsIDB4MDAsIDB4MDAsIDB4QUQsIDB4RjcsIDB4RDEsIDB4NDEsIC8qIDB4RjgtMHhGQiAqLworCTB4QUQsIDB4RjMsIDB4QUUsIDB4NDMsIDB4MDAsIDB4MDAsIDB4RDAsIDB4RjgsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzU1WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhBRCwgMHhGMSwgMHgwMCwgMHgwMCwgMHhEMSwgMHg0NiwgLyogMHgwMC0weDAzICovCisJMHhEMCwgMHhGOSwgMHhEMCwgMHhGRCwgMHhBRCwgMHhGNiwgMHhBRSwgMHg0MiwgLyogMHgwNC0weDA3ICovCisJMHhEMCwgMHhGQSwgMHhBRCwgMHhGQywgMHhEMSwgMHg0MCwgMHhEMSwgMHg0NywgLyogMHgwOC0weDBCICovCisJMHhENCwgMHhBMSwgMHgwMCwgMHgwMCwgMHhEMSwgMHg0NSwgMHhBRSwgMHg0NCwgLyogMHgwQy0weDBGICovCisJMHhBRCwgMHhGMCwgMHhEMCwgMHhGQywgMHhEMCwgMHhGMywgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhBRCwgMHhGOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhGMiwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhGNywgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhGMCwgMHhBRSwgMHg0MSwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENCwgMHg3NywgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhCMCwgMHhFNCwgMHhENCwgMHhBNywgMHhCMCwgMHhFMiwgMHhCMCwgMHhERiwgLyogMHgyQy0weDJGICovCisJMHhENCwgMHg3QywgMHhCMCwgMHhEQiwgMHhENCwgMHhBMiwgMHhCMCwgMHhFNiwgLyogMHgzMC0weDMzICovCisJMHhENCwgMHg3NiwgMHhENCwgMHg3QiwgMHhENCwgMHg3QSwgMHhBRCwgMHhGMiwgLyogMHgzNC0weDM3ICovCisJMHhCMCwgMHhFMSwgMHhENCwgMHhBNSwgMHgwMCwgMHgwMCwgMHhENCwgMHhBOCwgLyogMHgzOC0weDNCICovCisJMHhENCwgMHg3MywgMHgwMCwgMHgwMCwgMHhCMywgMHhFOCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhENCwgMHhBOSwgMHhCMCwgMHhFNywgMHgwMCwgMHgwMCwgMHhCMCwgMHhEOSwgLyogMHg0MC0weDQzICovCisJMHhCMCwgMHhENiwgMHhENCwgMHg3RSwgMHhCMCwgMHhEMywgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhENCwgMHhBNiwgMHgwMCwgMHgwMCwgMHhCMCwgMHhEQSwgMHhENCwgMHhBQSwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHhENCwgMHg3NCwgMHhENCwgMHhBNCwgMHhCMCwgMHhERCwgLyogMHg0Qy0weDRGICovCisJMHhENCwgMHg3NSwgMHhENCwgMHg3OCwgMHhENCwgMHg3RCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhCMCwgMHhERSwgMHhCMCwgMHhEQywgMHhCMCwgMHhFOCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHhCMCwgMHhFMywgMHgwMCwgMHgwMCwgMHhCMCwgMHhENywgMHhCMSwgMHhEMiwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhCMCwgMHhEOCwgMHhENCwgMHg3OSwgMHhCMCwgMHhFNSwgLyogMHg2MC0weDYzICovCisJMHhCMCwgMHhFMCwgMHhENCwgMHhBMywgMHhCMCwgMHhENSwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMCwgMHhENCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhENCwgMHg3MSwgMHhENCwgMHg3MiwgMHhEOCwgMHg2QSwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMywgMHhENywgLyogMHg3OC0weDdCICovCisJMHhCMywgMHhEQSwgMHhEOCwgMHg3NSwgMHhCMywgMHhFRSwgMHhEOCwgMHg3OCwgLyogMHg3Qy0weDdGICovCisJCisJMHhCMywgMHhEOCwgMHhEOCwgMHg3MSwgMHhCMywgMHhERSwgMHhCMywgMHhFNCwgLyogMHg4MC0weDgzICovCisJMHhCNSwgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMywgMHhFMiwgLyogMHg4NC0weDg3ICovCisJMHhEOCwgMHg2RSwgMHhCMywgMHhFRiwgMHhCMywgMHhEQiwgMHhCMywgMHhFMywgLyogMHg4OC0weDhCICovCisJMHhEOCwgMHg3NiwgMHhEQywgMHhENywgMHhEOCwgMHg3QiwgMHhEOCwgMHg2RiwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHg2NiwgMHhEOCwgMHg3MywgMHhEOCwgMHg2RCwgLyogMHg5MC0weDkzICovCisJMHhCMywgMHhFMSwgMHhEOCwgMHg3OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhCMywgMHhERCwgMHhCMywgMHhGMSwgMHhCMywgMHhFQSwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhCMywgMHhERiwgMHhCMywgMHhEQywgMHgwMCwgMHgwMCwgMHhCMywgMHhFNywgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHg3QSwgMHhEOCwgMHg2QywgMHhEOCwgMHg3MiwgLyogMHhBMC0weEEzICovCisJMHhEOCwgMHg3NCwgMHhEOCwgMHg2OCwgMHhEOCwgMHg3NywgMHhCMywgMHhEOSwgLyogMHhBNC0weEE3ICovCisJMHhEOCwgMHg2NywgMHgwMCwgMHgwMCwgMHhCMywgMHhFMCwgMHhCMywgMHhGMCwgLyogMHhBOC0weEFCICovCisJMHhCMywgMHhFQywgMHhEOCwgMHg2OSwgMHhCMywgMHhFNiwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhCMywgMHhFRCwgMHhCMywgMHhFOSwgMHhCMywgMHhFNSwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMywgMHhFQiwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhENSwgLyogMHhCQy0weEJGICovCisJMHhEQywgMHhEMSwgMHgwMCwgMHgwMCwgMHhEQywgMHhFMCwgMHhEQywgMHhDQSwgLyogMHhDMC0weEMzICovCisJMHhEQywgMHhEMywgMHhCNiwgMHhFNSwgMHhCNiwgMHhFNiwgMHhCNiwgMHhERSwgLyogMHhDNC0weEM3ICovCisJMHhEQywgMHhEQywgMHhCNiwgMHhFOCwgMHhEQywgMHhDRiwgMHhEQywgMHhDRSwgLyogMHhDOC0weENCICovCisJMHhEQywgMHhDQywgMHhEQywgMHhERSwgMHhCNiwgMHhEQywgMHhEQywgMHhEOCwgLyogMHhDQy0weENGICovCisJMHhEQywgMHhDRCwgMHhCNiwgMHhERiwgMHhEQywgMHhENiwgMHhCNiwgMHhEQSwgLyogMHhEMC0weEQzICovCisJMHhEQywgMHhEMiwgMHhEQywgMHhEOSwgMHhEQywgMHhEQiwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHhERiwgMHhCNiwgMHhFMywgMHhEQywgMHhDQiwgLyogMHhEOC0weERCICovCisJMHhCNiwgMHhERCwgMHhEQywgMHhEMCwgMHgwMCwgMHgwMCwgMHhCNiwgMHhEOCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhCNiwgMHhFNCwgMHhEQywgMHhEQSwgMHhCNiwgMHhFMCwgLyogMHhFMC0weEUzICovCisJMHhCNiwgMHhFMSwgMHhCNiwgMHhFNywgMHhCNiwgMHhEQiwgMHhBMiwgMHg1RiwgLyogMHhFNC0weEU3ICovCisJMHhCNiwgMHhEOSwgMHhEQywgMHhENCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNiwgMHhFMiwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhERCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCOSwgMHhDRCwgMHhCOSwgMHhDOCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHg1NSwgMHhFMSwgMHg1MSwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHhFMSwgMHg0QiwgMHhCOSwgMHhDMiwgMHhCOSwgMHhCRSwgMHhFMSwgMHg1NCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTZbNTEyXSA9IHsKKwkweEI5LCAweEJGLCAweEUxLCAweDRFLCAweEUxLCAweDUwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEUxLCAweDUzLCAweDAwLCAweDAwLCAweEI5LCAweEM0LCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEI5LCAweENCLCAweEI5LCAweEM1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEUxLCAweDQ5LCAweEI5LCAweEM2LCAweEI5LCAweEM3LCAweEUxLCAweDRDLCAvKiAweDBDLTB4MEYgKi8KKwkweEI5LCAweENDLCAweDAwLCAweDAwLCAweEUxLCAweDRBLCAweEUxLCAweDRGLCAvKiAweDEwLTB4MTMgKi8KKwkweEI5LCAweEMzLCAweEUxLCAweDQ4LCAweEI5LCAweEM5LCAweEI5LCAweEMxLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI5LCAweEMwLCAvKiAweDE4LTB4MUIgKi8KKwkweEUxLCAweDRELCAweEUxLCAweDUyLCAweDAwLCAweDAwLCAweEI5LCAweENBLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweDQ3LCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEJDLCAweDRELCAweEU1LCAweDQ3LCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweEU1LCAweDQ0LCAweDAwLCAweDAwLCAweEJDLCAweDQ3LCAweEJDLCAweDUzLCAvKiAweDJDLTB4MkYgKi8KKwkweEJDLCAweDU0LCAweDAwLCAweDAwLCAweEJDLCAweDRBLCAweEU1LCAweDQyLCAvKiAweDMwLTB4MzMgKi8KKwkweEJDLCAweDRDLCAweEU0LCAweEY5LCAweEJDLCAweDUyLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEU1LCAweDQ2LCAweEJDLCAweDQ5LCAweEU1LCAweDQ4LCAweEJDLCAweDQ4LCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweDQzLCAweEU1LCAweDQ1LCAweEJDLCAweDRCLCAvKiAweDNDLTB4M0YgKi8KKwkweEU1LCAweDQxLCAweEU0LCAweEZBLCAweEU0LCAweEY3LCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweEQ4LCAweDZCLCAweEU0LCAweEZELCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEU0LCAweEY2LCAweEU0LCAweEZDLCAweEU0LCAweEZCLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEU0LCAweEY4LCAweDAwLCAweDAwLCAweEJDLCAweDRGLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJDLCAweDRFLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJDLCAweDUwLCAvKiAweDU0LTB4NTcgKi8KKwkweEU0LCAweEZFLCAweEJFLCAweEIyLCAweEU1LCAweDQwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweDQ1LCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEU4LCAweEZELCAweDAwLCAweDAwLCAweEJFLCAweEJFLCAweEU5LCAweDQyLCAvKiAweDYwLTB4NjMgKi8KKwkweEJFLCAweEI2LCAweEJFLCAweEJBLCAweEU5LCAweDQxLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEJFLCAweEI5LCAweEJFLCAweEI1LCAweEJFLCAweEI4LCAweEJFLCAweEIzLCAvKiAweDY4LTB4NkIgKi8KKwkweEJFLCAweEJELCAweEU5LCAweDQzLCAweEU4LCAweEZFLCAweEJFLCAweEJDLCAvKiAweDZDLTB4NkYgKi8KKwkweEU4LCAweEZDLCAweEJFLCAweEJCLCAweEU5LCAweDQ0LCAweEU5LCAweDQwLCAvKiAweDcwLTB4NzMgKi8KKwkweEJDLCAweDUxLCAweDAwLCAweDAwLCAweEJFLCAweEJGLCAweEU5LCAweDQ2LCAvKiAweDc0LTB4NzcgKi8KKwkweEJFLCAweEI3LCAweEJFLCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEM2LCAweEVDLCAweEM4LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEMwLCAweDdCLCAweEVDLCAweEM5LCAweEVDLCAweEM3LCAweEVDLCAweEM1LCAvKiAweDgwLTB4ODMgKi8KKwkweEVDLCAweEM0LCAweEMwLCAweDdELCAweEVDLCAweEMzLCAweEMwLCAweDdFLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweEVDLCAweEMxLCAweEVDLCAweEMyLCAweEMwLCAweDdBLCAweEMwLCAweEExLCAvKiAweDhDLTB4OEYgKi8KKwkweEMwLCAweDdDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEMwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweEMyLCAweDUwLCAweDAwLCAweDAwLCAweEVGLCAweEJDLCAvKiAweDk0LTB4OTcgKi8KKwkweEVGLCAweEJBLCAweEVGLCAweEJGLCAweEVGLCAweEJELCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEVGLCAweEJCLCAweEVGLCAweEJFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweEMzLCAweDYwLCAweEYxLCAweEYyLCAweEYxLCAweEYzLCAvKiAweEE0LTB4QTcgKi8KKwkweEM0LCAweDU2LCAweDAwLCAweDAwLCAweEYxLCAweEY0LCAweEYxLCAweEYwLCAvKiAweEE4LTB4QUIgKi8KKwkweEYxLCAweEY1LCAweEYxLCAweEYxLCAweEMyLCAweDUxLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYzLCAweEZFLCAweEY0LCAweDQxLCAvKiAweEIwLTB4QjMgKi8KKwkweEM0LCAweDU5LCAweEY0LCAweDQwLCAweEM0LCAweDU4LCAweEM0LCAweDU3LCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweEM0LCAweDVBLCAweEY1LCAweEM1LCAweEY1LCAweEM2LCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweEM0LCAweERBLCAweEM0LCAweEQ5LCAweEM0LCAweERCLCAweEY1LCAweEM0LCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEQ4LCAweEY2LCAweEQ3LCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweEM1LCAweDZELCAweEM1LCAweDZGLCAweEM1LCAweDZFLCAweEY2LCAweEQ5LCAvKiAweEM4LTB4Q0IgKi8KKwkweEM1LCAweEM4LCAweEY4LCAweEE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEM1LCAweEYxLCAweDAwLCAweDAwLCAweEY4LCAweEE1LCAvKiAweEQwLTB4RDMgKi8KKwkweEY4LCAweEVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM5LCAweDQ5LCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE1LCAweDdELCAweEE1LCAweDdDLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweEE2LCAweDVGLCAweEE2LCAweDVFLCAweEM5LCAweEM3LCAvKiAweERDLTB4REYgKi8KKwkweEE2LCAweDVELCAweEM5LCAweEM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweEE3LCAweDc5LCAweENBLCAweEE5LCAweDAwLCAweDAwLCAweENBLCAweEE4LCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE3LCAweDc3LCAweEE3LCAweDdBLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEE3LCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweEE3LCAweDc4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENCLCAweEYwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweENCLCAweEYxLCAweEE5LCAweDU0LCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFCLCAweEFBLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181N1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4RDEsIDB4NDgsIDB4RDEsIDB4NDksIDB4QUUsIDB4NDUsIC8qIDB4MDAtMHgwMyAqLworCTB4QUUsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDQsIDB4QUMsIC8qIDB4MDQtMHgwNyAqLworCTB4QjAsIDB4RTksIDB4QjAsIDB4RUIsIDB4RDQsIDB4QUIsIDB4QjAsIDB4RUEsIC8qIDB4MDgtMHgwQiAqLworCTB4RDgsIDB4N0MsIDB4QjMsIDB4RjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjYsIDB4RTksIDB4QjYsIDB4RUEsIC8qIDB4MTAtMHgxMyAqLworCTB4REMsIDB4RTEsIDB4MDAsIDB4MDAsIDB4QjksIDB4Q0YsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4QjksIDB4Q0UsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NDksIDB4RTksIDB4NDgsIC8qIDB4MTgtMHgxQiAqLworCTB4RTksIDB4NDcsIDB4MDAsIDB4MDAsIDB4RjksIDB4NkIsIDB4QTQsIDB4NjcsIC8qIDB4MUMtMHgxRiAqLworCTB4QzksIDB4NTksIDB4MDAsIDB4MDAsIDB4QzksIDB4NkUsIDB4QzksIDB4NkYsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4QTYsIDB4NjIsIDB4QTYsIDB4NjYsIDB4QzksIDB4QzksIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4QTYsIDB4NjQsIDB4QTYsIDB4NjMsIDB4QzksIDB4QzgsIDB4QTYsIDB4NjUsIC8qIDB4MkMtMHgyRiAqLworCTB4QTYsIDB4NjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTYsIDB4NjAsIC8qIDB4MzAtMHgzMyAqLworCTB4QzksIDB4Q0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTcsIDB4QTYsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTcsIDB4QTMsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4QTcsIDB4N0QsIDB4Q0EsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4Q0EsIDB4QUIsIDB4MDAsIDB4MDAsIDB4QTcsIDB4QTEsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4Q0EsIDB4QUQsIDB4QTcsIDB4N0IsIDB4Q0EsIDB4QUUsIC8qIDB4NDgtMHg0QiAqLworCTB4Q0EsIDB4QUMsIDB4QTcsIDB4N0UsIDB4QTcsIDB4QTIsIDB4QTcsIDB4QTUsIC8qIDB4NEMtMHg0RiAqLworCTB4QTcsIDB4QTQsIDB4QTcsIDB4N0MsIDB4Q0EsIDB4QUYsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4QTksIDB4NTksIDB4Q0IsIDB4RkUsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4QTksIDB4NUIsIDB4MDAsIDB4MDAsIDB4QTksIDB4NUEsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4Q0MsIDB4NDAsIDB4QTksIDB4NTgsIDB4QTksIDB4NTcsIDB4Q0IsIDB4RjUsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4RjQsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4RjIsIC8qIDB4NkMtMHg2RiAqLworCTB4Q0IsIDB4RjcsIDB4Q0IsIDB4RjYsIDB4Q0IsIDB4RjMsIDB4Q0IsIDB4RkMsIC8qIDB4NzAtMHg3MyAqLworCTB4Q0IsIDB4RkQsIDB4Q0IsIDB4RkEsIDB4Q0IsIDB4RjgsIDB4QTksIDB4NTYsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4RkIsIC8qIDB4NzgtMHg3QiAqLworCTB4QTksIDB4NUMsIDB4Q0MsIDB4NDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4Q0IsIDB4RjksIDB4MDAsIDB4MDAsIDB4QUIsIDB4QUIsIDB4QTksIDB4NTUsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUIsIDB4QUMsIC8qIDB4ODgtMHg4QiAqLworCTB4Q0UsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4NUEsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUIsIDB4QjIsIC8qIDB4OTAtMHg5MyAqLworCTB4Q0UsIDB4NTgsIDB4Q0UsIDB4NUUsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4NTUsIC8qIDB4OTQtMHg5NyAqLworCTB4Q0UsIDB4NTksIDB4Q0UsIDB4NUIsIDB4Q0UsIDB4NUQsIDB4Q0UsIDB4NTcsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4NTYsIDB4Q0UsIDB4NTEsIDB4Q0UsIDB4NTIsIC8qIDB4OUMtMHg5RiAqLworCTB4QUIsIDB4QUQsIDB4MDAsIDB4MDAsIDB4QUIsIDB4QUYsIDB4QUIsIDB4QUUsIC8qIDB4QTAtMHhBMyAqLworCTB4Q0UsIDB4NTMsIDB4Q0UsIDB4NUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUIsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4NTAsIDB4RDEsIDB4NTMsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4RDEsIDB4NTIsIDB4RDEsIDB4NTcsIDB4RDEsIDB4NEUsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4RDEsIDB4NTEsIDB4RDEsIDB4NTAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4NTQsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4RDEsIDB4NTgsIDB4QUUsIDB4NDcsIDB4QUUsIDB4NEEsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4NEYsIDB4RDEsIDB4NTUsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUUsIDB4NDksIC8qIDB4QzgtMHhDQiAqLworCTB4RDEsIDB4NEEsIDB4MDAsIDB4MDAsIDB4QUIsIDB4QjAsIDB4RDQsIDB4QkEsIC8qIDB4Q0MtMHhDRiAqLworCTB4RDEsIDB4NTYsIDB4MDAsIDB4MDAsIDB4RDEsIDB4NEQsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4QUUsIDB4NDgsIDB4RDEsIDB4NEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4RDQsIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjAsIDB4RUMsIC8qIDB4REMtMHhERiAqLworCTB4QjAsIDB4RjAsIDB4RDQsIDB4QzEsIDB4RDQsIDB4QUYsIDB4RDQsIDB4QkQsIC8qIDB4RTAtMHhFMyAqLworCTB4QjAsIDB4RjEsIDB4RDQsIDB4QkYsIDB4MDAsIDB4MDAsIDB4RDQsIDB4QzUsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4RDQsIDB4QzAsIDB4RDQsIDB4QjQsIDB4RDQsIDB4QkMsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4RDQsIDB4Q0EsIDB4RDQsIDB4QzgsIDB4RDQsIDB4QkUsIDB4RDQsIDB4QjksIC8qIDB4RjAtMHhGMyAqLworCTB4RDQsIDB4QjIsIDB4RDgsIDB4QTYsIDB4RDQsIDB4QjAsIDB4QjAsIDB4RjUsIC8qIDB4RjQtMHhGNyAqLworCTB4RDQsIDB4QjcsIDB4QjAsIDB4RjYsIDB4QjAsIDB4RjIsIDB4RDQsIDB4QUQsIC8qIDB4RjgtMHhGQiAqLworCTB4RDQsIDB4QzMsIDB4RDQsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzU4WzUxMl0gPSB7CisJMHhENCwgMHhCMywgMHhENCwgMHhDNiwgMHhCMCwgMHhGMywgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhENCwgMHhDQywgMHhCMCwgMHhFRCwgMHhCMCwgMHhFRiwgMHhENCwgMHhCQiwgLyogMHgwNC0weDA3ICovCisJMHhENCwgMHhCNiwgMHhBRSwgMHg0QiwgMHhCMCwgMHhFRSwgMHhENCwgMHhCOCwgLyogMHgwOC0weDBCICovCisJMHhENCwgMHhDNywgMHhENCwgMHhDQiwgMHhENCwgMHhDMiwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhENCwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhENCwgMHhBRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHhBMSwgMHgwMCwgMHgwMCwgMHhEOCwgMHhBQSwgLyogMHgxOC0weDFCICovCisJMHhEOCwgMHhBOSwgMHhCMywgMHhGQSwgMHhEOCwgMHhBMiwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhCMywgMHhGQiwgMHhCMywgMHhGOSwgMHgwMCwgMHgwMCwgMHhEOCwgMHhBNCwgLyogMHgyMC0weDIzICovCisJMHhCMywgMHhGNiwgMHhEOCwgMHhBOCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhBMywgLyogMHgyNC0weDI3ICovCisJMHhEOCwgMHhBNSwgMHhEOCwgMHg3RCwgMHhCMywgMHhGNCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhEOCwgMHhCMiwgMHhEOCwgMHhCMSwgMHhEOCwgMHhBRSwgMHhCMywgMHhGMywgLyogMHgyQy0weDJGICovCisJMHhCMywgMHhGNywgMHhCMywgMHhGOCwgMHhEMSwgMHg0QiwgMHhEOCwgMHhBQiwgLyogMHgzMC0weDMzICovCisJMHhCMywgMHhGNSwgMHhCMCwgMHhGNCwgMHhEOCwgMHhBRCwgMHhEOCwgMHg3RSwgLyogMHgzNC0weDM3ICovCisJMHhEOCwgMHhCMCwgMHhEOCwgMHhBRiwgMHgwMCwgMHgwMCwgMHhEOCwgMHhCMywgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHhFRiwgMHgwMCwgMHgwMCwgMHhEOCwgMHhBQywgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhEOCwgMHhBNywgMHhEQywgMHhFNywgMHhCNiwgMHhGNCwgMHhCNiwgMHhGNywgLyogMHg0OC0weDRCICovCisJMHhCNiwgMHhGMiwgMHhEQywgMHhFNiwgMHhEQywgMHhFQSwgMHhEQywgMHhFNSwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHhCNiwgMHhFQywgMHhCNiwgMHhGNiwgMHhEQywgMHhFMiwgLyogMHg1MC0weDUzICovCisJMHhCNiwgMHhGMCwgMHhEQywgMHhFOSwgMHgwMCwgMHgwMCwgMHhCNiwgMHhFRSwgLyogMHg1NC0weDU3ICovCisJMHhCNiwgMHhFRCwgMHhEQywgMHhFQywgMHhCNiwgMHhFRiwgMHhEQywgMHhFRSwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHhFQiwgMHhCNiwgMHhFQiwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNiwgMHhGNSwgMHhEQywgMHhGMCwgLyogMHg2MC0weDYzICovCisJMHhEQywgMHhFNCwgMHhEQywgMHhFRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhEQywgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNiwgMHhGMSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhCNiwgMHhGMywgMHgwMCwgMHgwMCwgMHhEQywgMHhFOCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhFMSwgMHg1RCwgMHhCOSwgMHhEMCwgMHhFMSwgMHg2MywgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhCOSwgMHhENSwgMHhFMSwgMHg1RiwgMHhFMSwgMHg2NiwgLyogMHg3OC0weDdCICovCisJMHhFMSwgMHg1NywgMHhCOSwgMHhENywgMHhCOSwgMHhEMSwgMHhFMSwgMHg1QywgLyogMHg3Qy0weDdGICovCisJCisJMHhCQywgMHg1NSwgMHhFMSwgMHg1QiwgMHhFMSwgMHg2NCwgMHhCOSwgMHhEMiwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHhCOSwgMHhENiwgMHhFMSwgMHg1QSwgMHhFMSwgMHg2MCwgLyogMHg4NC0weDg3ICovCisJMHhFMSwgMHg2NSwgMHhFMSwgMHg1NiwgMHhCOSwgMHhENCwgMHhFMSwgMHg1RSwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHg2MiwgMHhFMSwgMHg2OCwgLyogMHg4Qy0weDhGICovCisJMHhFMSwgMHg1OCwgMHhFMSwgMHg2MSwgMHgwMCwgMHgwMCwgMHhCOSwgMHhEMywgLyogMHg5MC0weDkzICovCisJMHhFMSwgMHg2NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhFMSwgMHg1OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhCQywgMHg1OSwgMHhFNSwgMHg0QiwgMHhCQywgMHg1NywgMHhCQywgMHg1NiwgLyogMHg5Qy0weDlGICovCisJMHhFNSwgMHg0RCwgMHhFNSwgMHg1MiwgMHgwMCwgMHgwMCwgMHhFNSwgMHg0RSwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHg1MSwgMHhCQywgMHg1QywgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhCRSwgMHhBNSwgMHhCQywgMHg1QiwgMHgwMCwgMHgwMCwgMHhFNSwgMHg0QSwgLyogMHhBOC0weEFCICovCisJMHhFNSwgMHg1MCwgMHgwMCwgMHgwMCwgMHhCQywgMHg1QSwgMHhFNSwgMHg0RiwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHg0QywgMHgwMCwgMHgwMCwgMHhCQywgMHg1OCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHg0RCwgMHhGOSwgMHhEOSwgLyogMHhCOC0weEJCICovCisJMHhFOSwgMHg0RiwgMHhFOSwgMHg0QSwgMHhCRSwgMHhDMSwgMHhFOSwgMHg0QywgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhCRSwgMHhDMCwgMHhFOSwgMHg0RSwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhCRSwgMHhDMywgMHhFOSwgMHg1MCwgMHhCRSwgMHhDMiwgLyogMHhDNC0weEM3ICovCisJMHhFOSwgMHg0OSwgMHhFOSwgMHg0QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMCwgMHhBNSwgMHhFQywgMHhDQywgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhDMCwgMHhBNCwgMHhFQywgMHhDRCwgMHhDMCwgMHhBMywgLyogMHhEMC0weEQzICovCisJMHhFQywgMHhDQiwgMHhDMCwgMHhBMiwgMHhFQywgMHhDQSwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhDMiwgMHg1MywgMHhDMiwgMHg1MiwgMHhGMSwgMHhGNiwgMHhGMSwgMHhGOCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHhGNywgMHhDMywgMHg2MSwgMHhDMywgMHg2MiwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMywgMHg2MywgMHhGNCwgMHg0MiwgLyogMHhFMC0weEUzICovCisJMHhDNCwgMHg1QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNywgMHhEMywgLyogMHhFNC0weEU3ICovCisJMHhGNywgMHhEMiwgMHhDNSwgMHhGMiwgMHgwMCwgMHgwMCwgMHhBNCwgMHg2OCwgLyogMHhFOC0weEVCICovCisJMHhBNCwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNywgMHhBNywgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhDRSwgMHg1RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhCMywgMHhGQywgMHhCMywgMHhGRCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHhEQywgMHhGMiwgMHhCOSwgMHhEOCwgMHhFMSwgMHg2OSwgMHhFNSwgMHg1MywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTlbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM5LCAweDVBLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEIwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweENDLCAweDQyLCAweENFLCAweDYwLCAweEQxLCAweDU5LCAweEFFLCAweDRDLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweEY5LCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweEM0LCAweERDLCAweEE0LCAweDY5LCAweEE1LCAweDdFLCAweEM5LCAweDcwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEE2LCAweDY3LCAweEE2LCAweDY4LCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweEE5LCAweDVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEIwLCAweEY3LCAweDAwLCAweDAwLCAweEI5LCAweERBLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweEI5LCAweERCLCAweEI5LCAweEQ5LCAweDAwLCAweDAwLCAweEE0LCAweDZBLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEE0LCAweEQxLCAweEE0LCAweEQzLCAweEE0LCAweEQyLCAvKiAweDI4LTB4MkIgKi8KKwkweEM5LCAweDVCLCAweEE0LCAweEQ0LCAweEE1LCAweEExLCAweEM5LCAweDcxLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEE1LCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE2LCAweDY5LCAvKiAweDM0LTB4MzcgKi8KKwkweEE2LCAweDZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweEM5LCAweENCLCAweDAwLCAweDAwLCAweEE3LCAweEE4LCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweENBLCAweEIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEE5LCAweDYxLCAweENDLCAweDQzLCAweDAwLCAweDAwLCAweEE5LCAweDVGLCAvKiAweDQ0LTB4NDcgKi8KKwkweEE5LCAweDYwLCAweEE5LCAweDVFLCAweEQxLCAweDVBLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFCLCAweEI2LCAweEFCLCAweEI1LCAvKiAweDRDLTB4NEYgKi8KKwkweEFCLCAweEI3LCAweEFCLCAweEI0LCAweDAwLCAweDAwLCAweENFLCAweDYxLCAvKiAweDUwLTB4NTMgKi8KKwkweEE5LCAweDYyLCAweEFCLCAweEIzLCAweDAwLCAweDAwLCAweEFFLCAweDRELCAvKiAweDU0LTB4NTcgKi8KKwkweEFFLCAweDRFLCAweDAwLCAweDAwLCAweEFFLCAweDRGLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweEQ0LCAweENELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEIzLCAweEZFLCAweEQ4LCAweEI0LCAweEIwLCAweEY4LCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI2LCAweEY4LCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEI5LCAweERELCAweEI5LCAweERDLCAweEUxLCAweDZBLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEJDLCAweDVELCAweEJFLCAweEM0LCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEVGLCAweEMwLCAweEY2LCAweERBLCAweEY3LCAweEQ0LCAweEE0LCAweDZCLCAvKiAweDcwLTB4NzMgKi8KKwkweEE1LCAweEEzLCAweDAwLCAweDAwLCAweEE1LCAweEE0LCAweEM5LCAweEQxLCAvKiAweDc0LTB4NzcgKi8KKwkweEE2LCAweDZDLCAweEE2LCAweDZGLCAweDAwLCAweDAwLCAweEM5LCAweENGLCAvKiAweDc4LTB4N0IgKi8KKwkweEM5LCAweENELCAweEE2LCAweDZFLCAweEM5LCAweEQwLCAweEM5LCAweEQyLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEM5LCAweENDLCAweEE2LCAweDcxLCAweEE2LCAweDcwLCAweEE2LCAweDZELCAvKiAweDgwLTB4ODMgKi8KKwkweEE2LCAweDZCLCAweEM5LCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE3LCAweEIzLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweEE3LCAweEIwLCAweENBLCAweEI2LCAweENBLCAweEI5LCAvKiAweDhDLTB4OEYgKi8KKwkweENBLCAweEI4LCAweDAwLCAweDAwLCAweEE3LCAweEFBLCAweEE3LCAweEIyLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE3LCAweEFGLCAweENBLCAweEI1LCAvKiAweDk0LTB4OTcgKi8KKwkweENBLCAweEIzLCAweEE3LCAweEFFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweEE3LCAweEE5LCAweEE3LCAweEFDLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweENBLCAweEI0LCAweENBLCAweEJCLCAweENBLCAweEI3LCAweEE3LCAweEFELCAvKiAweEEwLTB4QTMgKi8KKwkweEE3LCAweEIxLCAweEE3LCAweEI0LCAweENBLCAweEIyLCAweENBLCAweEJBLCAvKiAweEE0LTB4QTcgKi8KKwkweEE3LCAweEFCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE5LCAweDY3LCAweEE5LCAweDZGLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweENDLCAweDRGLCAweENDLCAweDQ4LCAweEE5LCAweDcwLCAvKiAweEIwLTB4QjMgKi8KKwkweENDLCAweDUzLCAweENDLCAweDQ0LCAweENDLCAweDRCLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEE5LCAweDY2LCAweENDLCAweDQ1LCAweEE5LCAweDY0LCAvKiAweEI4LTB4QkIgKi8KKwkweENDLCAweDRDLCAweENDLCAweDUwLCAweEE5LCAweDYzLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweENDLCAweDUxLCAweENDLCAweDRBLCAweDAwLCAweDAwLCAweENDLCAweDRELCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEE5LCAweDcyLCAweEE5LCAweDY5LCAweENDLCAweDU0LCAvKiAweEM0LTB4QzcgKi8KKwkweENDLCAweDUyLCAweDAwLCAweDAwLCAweEE5LCAweDZFLCAweEE5LCAweDZDLCAvKiAweEM4LTB4Q0IgKi8KKwkweENDLCAweDQ5LCAweEE5LCAweDZCLCAweENDLCAweDQ3LCAweENDLCAweDQ2LCAvKiAweENDLTB4Q0YgKi8KKwkweEE5LCAweDZBLCAweEE5LCAweDY4LCAweEE5LCAweDcxLCAweEE5LCAweDZELCAvKiAweEQwLTB4RDMgKi8KKwkweEE5LCAweDY1LCAweDAwLCAweDAwLCAweENDLCAweDRFLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEFCLCAweEI5LCAweDAwLCAweDAwLCAweEFCLCAweEMwLCAweENFLCAweDZGLCAvKiAweEQ4LTB4REIgKi8KKwkweEFCLCAweEI4LCAweENFLCAweDY3LCAweENFLCAweDYzLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweENFLCAweDczLCAweENFLCAweDYyLCAweDAwLCAweDAwLCAweEFCLCAweEJCLCAvKiAweEUwLTB4RTMgKi8KKwkweENFLCAweDZDLCAweEFCLCAweEJFLCAweEFCLCAweEMxLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEFCLCAweEJDLCAweENFLCAweDcwLCAweEFCLCAweEJGLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweEFFLCAweDU2LCAweENFLCAweDc2LCAweENFLCAweDY0LCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweENFLCAweDY2LCAweENFLCAweDZELCAweENFLCAweDcxLCAvKiAweEYwLTB4RjMgKi8KKwkweENFLCAweDc1LCAweENFLCAweDcyLCAweENFLCAweDZCLCAweENFLCAweDZFLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweDY4LCAweEFCLCAweEMzLCAvKiAweEY4LTB4RkIgKi8KKwkweENFLCAweDZBLCAweENFLCAweDY5LCAweENFLCAweDc0LCAweEFCLCAweEJBLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181QVs1MTJdID0geworCTB4Q0UsIDB4NjUsIDB4QUIsIDB4QzIsIDB4MDAsIDB4MDAsIDB4QUIsIDB4QkQsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4QUUsIDB4NUMsIDB4RDEsIDB4NjIsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4QUUsIDB4NUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4NjAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4QUUsIDB4NTAsIDB4MDAsIDB4MDAsIDB4QUUsIDB4NTUsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4RDEsIDB4NUYsIDB4RDEsIDB4NUMsIDB4RDEsIDB4NjEsIC8qIDB4MTQtMHgxNyAqLworCTB4QUUsIDB4NTEsIDB4RDEsIDB4NUIsIDB4MDAsIDB4MDAsIDB4QUUsIDB4NTQsIC8qIDB4MTgtMHgxQiAqLworCTB4QUUsIDB4NTIsIDB4MDAsIDB4MDAsIDB4RDEsIDB4NjMsIDB4QUUsIDB4NTMsIC8qIDB4MUMtMHgxRiAqLworCTB4QUUsIDB4NTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUUsIDB4NTgsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4QUUsIDB4NUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4QUUsIDB4NTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4RDEsIDB4NUQsIDB4RDEsIDB4NUUsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4NjQsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4RDQsIDB4QjAsIDB4RjksIDB4RDgsIDB4QzIsIC8qIDB4MzQtMHgzNyAqLworCTB4RDQsIDB4RDMsIDB4RDQsIDB4RTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4QjEsIDB4NDAsIDB4MDAsIDB4MDAsIDB4RDQsIDB4RTQsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4QjAsIDB4RkUsIDB4QjAsIDB4RkEsIDB4RDQsIDB4RUQsIDB4RDQsIDB4REQsIC8qIDB4NDAtMHg0MyAqLworCTB4RDQsIDB4RTAsIDB4MDAsIDB4MDAsIDB4QjEsIDB4NDMsIDB4RDQsIDB4RUEsIC8qIDB4NDQtMHg0NyAqLworCTB4RDQsIDB4RTIsIDB4QjAsIDB4RkIsIDB4QjEsIDB4NDQsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4RDQsIDB4RTcsIDB4RDQsIDB4RTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4RDQsIDB4RDYsIDB4RDQsIDB4RUIsIDB4RDQsIDB4REYsIDB4RDQsIDB4REEsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4RDAsIDB4RDQsIDB4RUMsIDB4RDQsIDB4REMsIC8qIDB4NTQtMHg1NyAqLworCTB4RDQsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4QjEsIDB4NDIsIDB4RDQsIDB4RTEsIC8qIDB4NTgtMHg1QiAqLworCTB4RDQsIDB4RUUsIDB4RDQsIDB4REUsIDB4RDQsIDB4RDIsIDB4RDQsIDB4RDcsIC8qIDB4NUMtMHg1RiAqLworCTB4RDQsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4QjEsIDB4NDEsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4RDQsIDB4REIsIDB4RDQsIDB4RDgsIDB4QjAsIDB4RkMsIDB4RDQsIDB4RDEsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4RTksIDB4QjAsIDB4RkQsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4RDQsIDB4RDksIDB4RDQsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4RDQsIDB4RTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjQsIDB4NDAsIC8qIDB4NzQtMHg3NyAqLworCTB4RDgsIDB4QkIsIDB4MDAsIDB4MDAsIDB4RDgsIDB4QjgsIDB4RDgsIDB4QzksIC8qIDB4NzgtMHg3QiAqLworCTB4RDgsIDB4QkQsIDB4RDgsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4QjQsIDB4NDIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4QzYsIC8qIDB4ODAtMHg4MyAqLworCTB4RDgsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4QzQsIDB4RDgsIDB4QzcsIC8qIDB4ODgtMHg4QiAqLworCTB4RDgsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4RDQsIDB4RTMsIDB4RDgsIDB4Q0QsIC8qIDB4OEMtMHg4RiAqLworCTB4REQsIDB4NDcsIDB4MDAsIDB4MDAsIDB4QjQsIDB4NDMsIDB4RDgsIDB4Q0UsIC8qIDB4OTAtMHg5MyAqLworCTB4RDgsIDB4QjYsIDB4RDgsIDB4QzAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4QzUsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjQsIDB4NDEsIDB4QjQsIDB4NDQsIC8qIDB4OTgtMHg5QiAqLworCTB4RDgsIDB4Q0MsIDB4RDgsIDB4Q0YsIDB4RDgsIDB4QkEsIDB4RDgsIDB4QjcsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4QjksIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4QkUsIDB4RDgsIDB4QkMsIDB4QjQsIDB4NDUsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4RDgsIDB4QkYsIDB4MDAsIDB4MDAsIDB4RDgsIDB4QzEsIDB4RDgsIDB4QjUsIC8qIDB4QUMtMHhBRiAqLworCTB4REMsIDB4RkEsIDB4REMsIDB4RjgsIDB4QjcsIDB4NDIsIDB4QjcsIDB4NDAsIC8qIDB4QjAtMHhCMyAqLworCTB4REQsIDB4NDMsIDB4REMsIDB4RjksIDB4REQsIDB4NDQsIDB4REQsIDB4NDAsIC8qIDB4QjQtMHhCNyAqLworCTB4REMsIDB4RjcsIDB4REQsIDB4NDYsIDB4REMsIDB4RjYsIDB4REMsIDB4RkQsIC8qIDB4QjgtMHhCQiAqLworCTB4QjYsIDB4RkUsIDB4QjYsIDB4RkQsIDB4QjYsIDB4RkMsIDB4REMsIDB4RkIsIC8qIDB4QkMtMHhCRiAqLworCTB4REQsIDB4NDEsIDB4QjYsIDB4RjksIDB4QjcsIDB4NDEsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4REMsIDB4RjQsIDB4MDAsIDB4MDAsIDB4REMsIDB4RkUsIDB4REMsIDB4RjMsIC8qIDB4QzQtMHhDNyAqLworCTB4REMsIDB4RkMsIDB4QjYsIDB4RkEsIDB4REQsIDB4NDIsIDB4REMsIDB4RjUsIC8qIDB4QzgtMHhDQiAqLworCTB4QjYsIDB4RkIsIDB4REQsIDB4NDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4NkUsIDB4QjksIDB4RTIsIDB4QjksIDB4RTEsIC8qIDB4RDQtMHhENyAqLworCTB4QjksIDB4RTMsIDB4RTEsIDB4N0EsIDB4RTEsIDB4NzAsIDB4RTEsIDB4NzYsIC8qIDB4RDgtMHhEQiAqLworCTB4RTEsIDB4NkIsIDB4RTEsIDB4NzksIDB4RTEsIDB4NzgsIDB4RTEsIDB4N0MsIC8qIDB4REMtMHhERiAqLworCTB4RTEsIDB4NzUsIDB4QjksIDB4REUsIDB4RTEsIDB4NzQsIDB4QjksIDB4RTQsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4NkQsIDB4QjksIDB4REYsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4RTEsIDB4N0IsIDB4QjksIDB4RTAsIDB4RTEsIDB4NkYsIDB4RTEsIDB4NzIsIC8qIDB4RTgtMHhFQiAqLworCTB4RTEsIDB4NzcsIDB4RTEsIDB4NzEsIDB4RTEsIDB4NkMsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4NzMsIC8qIDB4RjAtMHhGMyAqLworCTB4RTUsIDB4NTUsIDB4QkMsIDB4NjEsIDB4RTUsIDB4NTgsIDB4RTUsIDB4NTcsIC8qIDB4RjQtMHhGNyAqLworCTB4RTUsIDB4NUEsIDB4RTUsIDB4NUMsIDB4RjksIDB4REMsIDB4QkMsIDB4NUYsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4NTYsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NTQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzVCWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhFNSwgMHg1RCwgMHhFNSwgMHg1QiwgMHhFNSwgMHg1OSwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHg1RiwgMHgwMCwgMHgwMCwgMHhFNSwgMHg1RSwgLyogMHgwNC0weDA3ICovCisJMHhCQywgMHg2MywgMHhCQywgMHg1RSwgMHgwMCwgMHgwMCwgMHhCQywgMHg2MCwgLyogMHgwOC0weDBCICovCisJMHhCQywgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg2MCwgLyogMHgwQy0weDBGICovCisJMHhFOSwgMHg1NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHg1NiwgLyogMHgxMC0weDEzICovCisJMHhFOSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhFOSwgMHg1OCwgMHhFOSwgMHg1MSwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHg1MiwgMHhFOSwgMHg1QSwgMHhFOSwgMHg1MywgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhCRSwgMHhDNSwgMHhFOSwgMHg1QywgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhFOSwgMHg1QiwgMHhFOSwgMHg1NCwgMHgwMCwgMHgwMCwgMHhFQywgMHhEMSwgLyogMHgyMC0weDIzICovCisJMHhDMCwgMHhBOCwgMHhFQywgMHhDRiwgMHhFQywgMHhENCwgMHhFQywgMHhEMywgLyogMHgyNC0weDI3ICovCisJMHhFOSwgMHg1OSwgMHgwMCwgMHgwMCwgMHhDMCwgMHhBNywgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhFQywgMHhEMiwgMHhFQywgMHhDRSwgMHhFQywgMHhENiwgMHhFQywgMHhENSwgLyogMHgyQy0weDJGICovCisJMHhDMCwgMHhBNiwgMHgwMCwgMHgwMCwgMHhFQywgMHhEMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhCRSwgMHhDNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhDMiwgMHg1NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhFRiwgMHhDMSwgMHhGMSwgMHhGQSwgMHhGMSwgMHhGQiwgMHhGMSwgMHhGQywgLyogMHgzQy0weDNGICovCisJMHhDNCwgMHg1QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDNCwgMHg1RCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhGNCwgMHg0MywgMHgwMCwgMHgwMCwgMHhGNSwgMHhDOCwgLyogMHg0NC0weDQ3ICovCisJMHhGNSwgMHhDNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNiwgMHhEQiwgLyogMHg0OC0weDRCICovCisJMHhGNiwgMHhEQywgMHhGNywgMHhENSwgMHhGOCwgMHhBNywgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhBNCwgMHg2QywgMHhBNCwgMHg2RCwgMHgwMCwgMHgwMCwgMHhBNCwgMHg2RSwgLyogMHg1MC0weDUzICovCisJMHhBNCwgMHhENSwgMHhBNSwgMHhBNSwgMHhDOSwgMHhEMywgMHhBNiwgMHg3MiwgLyogMHg1NC0weDU3ICovCisJMHhBNiwgMHg3MywgMHgwMCwgMHgwMCwgMHhBNywgMHhCNywgMHhBNywgMHhCOCwgLyogMHg1OC0weDVCICovCisJMHhBNywgMHhCNiwgMHhBNywgMHhCNSwgMHgwMCwgMHgwMCwgMHhBOSwgMHg3MywgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQywgMHg1NSwgMHhBOSwgMHg3NSwgLyogMHg2MC0weDYzICovCisJMHhBOSwgMHg3NCwgMHhDQywgMHg1NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhBQiwgMHhDNCwgMHgwMCwgMHgwMCwgMHhBRSwgMHg1RCwgLyogMHg2OC0weDZCICovCisJMHhEMSwgMHg2NSwgMHgwMCwgMHgwMCwgMHhENCwgMHhGMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhCMSwgMHg0NSwgMHhCNCwgMHg0NywgMHhENCwgMHhFRiwgMHhCNCwgMHg0NiwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhCOSwgMHhFNSwgMHgwMCwgMHgwMCwgMHhFMSwgMHg3RCwgLyogMHg3NC0weDc3ICovCisJMHhCRSwgMHhDNywgMHgwMCwgMHgwMCwgMHhDMCwgMHhBOSwgMHhFQywgMHhENywgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhDNCwgMHg1RSwgMHgwMCwgMHgwMCwgMHhDNSwgMHg3MCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhDOSwgMHg3MiwgMHgwMCwgMHgwMCwgMHhBNSwgMHhBNiwgLyogMHg4MC0weDgzICovCisJMHhDOSwgMHg3MywgMHhBNiwgMHg3NiwgMHgwMCwgMHgwMCwgMHhBNiwgMHg3NCwgLyogMHg4NC0weDg3ICovCisJMHhBNiwgMHg3NSwgMHhBNiwgMHg3NywgMHgwMCwgMHgwMCwgMHhBNywgMHhCQSwgLyogMHg4OC0weDhCICovCisJMHhBNywgMHhCOSwgMHgwMCwgMHgwMCwgMHhDQSwgMHhCQywgMHhBNywgMHhCQiwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhCRCwgMHhDQywgMHg1NywgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhDQywgMHg1OCwgMHgwMCwgMHgwMCwgMHhBOSwgMHg3NiwgLyogMHg5NC0weDk3ICovCisJMHhBOSwgMHg3OCwgMHhBOSwgMHg3QSwgMHhBOSwgMHg3NywgMHhBOSwgMHg3QiwgLyogMHg5OC0weDlCICovCisJMHhBOSwgMHg3OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQiwgMHhDOCwgMHhBQiwgMHhDNSwgLyogMHhBMC0weEEzICovCisJMHhBQiwgMHhDNywgMHhBQiwgMHhDOSwgMHhBQiwgMHhDNiwgMHhEMSwgMHg2NiwgLyogMHhBNC0weEE3ICovCisJMHhDRSwgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhEMSwgMHg2OCwgMHhEMSwgMHg2NywgMHhBRSwgMHg2MywgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhBRSwgMHg1RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBRSwgMHg2MCwgLyogMHhCMC0weEIzICovCisJMHhBRSwgMHg2MiwgMHhBRSwgMHg2NCwgMHhBRSwgMHg2MSwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhBRSwgMHg2NiwgMHhBRSwgMHg2NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMSwgMHg0QSwgLyogMHhCQy0weEJGICovCisJMHhENCwgMHhGMiwgMHhENCwgMHhGMSwgMHhCMSwgMHg0OSwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhCMSwgMHg0OCwgMHhCMSwgMHg0NywgMHhCMSwgMHg0QiwgMHhCMSwgMHg0NiwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhENSwgMHhEOCwgMHhEMiwgLyogMHhDOC0weENCICovCisJMHhCNCwgMHg0OSwgMHhEOCwgMHhEMSwgMHhEOCwgMHhENiwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHhCNCwgMHg0QiwgMHhEOCwgMHhENCwgMHhCNCwgMHg0OCwgMHhCNCwgMHg0QSwgLyogMHhEMC0weEQzICovCisJMHhEOCwgMHhEMywgMHgwMCwgMHgwMCwgMHhERCwgMHg0OCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhERCwgMHg0OSwgMHhERCwgMHg0QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCOSwgMHhFNiwgMHhCOSwgMHhFRSwgLyogMHhEQy0weERGICovCisJMHhFMSwgMHg3RSwgMHhCOSwgMHhFOCwgMHhCOSwgMHhFQywgMHhFMSwgMHhBMSwgLyogMHhFMC0weEUzICovCisJMHhCOSwgMHhFRCwgMHhCOSwgMHhFOSwgMHhCOSwgMHhFQSwgMHhCOSwgMHhFNywgLyogMHhFNC0weEU3ICovCisJMHhCOSwgMHhFQiwgMHhCQywgMHg2NiwgMHhEOCwgMHhEMCwgMHhCQywgMHg2NywgLyogMHhFOC0weEVCICovCisJMHhCQywgMHg2NSwgMHgwMCwgMHgwMCwgMHhCQywgMHg2NCwgMHhFOSwgMHg1RCwgLyogMHhFQy0weEVGICovCisJMHhCRSwgMHhDOCwgMHhFQywgMHhEOCwgMHhFQywgMHhEOSwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHhDMywgMHg2NCwgMHhDNCwgMHg1RiwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHhBNCwgMHg2RiwgMHgwMCwgMHgwMCwgMHhBNiwgMHg3OCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNUNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEFCLCAweENBLCAweDAwLCAweDAwLCAweEQxLCAweDY5LCAvKiAweDAwLTB4MDMgKi8KKwkweEFFLCAweDY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIxLCAweDRFLCAvKiAweDA0LTB4MDcgKi8KKwkweEIxLCAweDRELCAweEIxLCAweDRDLCAweEI0LCAweDRDLCAweEI0LCAweDRELCAvKiAweDA4LTB4MEIgKi8KKwkweEQ4LCAweEQ3LCAweEI5LCAweEVGLCAweEJFLCAweEM5LCAweEE0LCAweDcwLCAvKiAweDBDLTB4MEYgKi8KKwkweEM5LCAweDVDLCAweEE0LCAweEQ2LCAweEM5LCAweDc0LCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweEM5LCAweEQ0LCAweEE2LCAweDc5LCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE5LCAweDdDLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweDRCLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE0LCAweDcxLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweEE0LCAweEQ3LCAweEM5LCAweEQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweENBLCAweEJFLCAweDAwLCAweDAwLCAweENBLCAweEJGLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweEE3LCAweEJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEQ4LCAweEQ4LCAweEI0LCAweDRFLCAweDAwLCAweDAwLCAweERELCAweDRDLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMwLCAweEFBLCAvKiAweDM0LTB4MzcgKi8KKwkweEE0LCAweDcyLCAweEE0LCAweEE4LCAweEE0LCAweEQ4LCAweEM5LCAweDc1LCAvKiAweDM4LTB4M0IgKi8KKwkweEE1LCAweEE3LCAweDAwLCAweDAwLCAweEE3LCAweEMwLCAweEE3LCAweEJGLCAvKiAweDNDLTB4M0YgKi8KKwkweEE3LCAweEJELCAweEE3LCAweEJFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweENDLCAweDU5LCAweEE5LCAweDdFLCAweEE5LCAweEExLCAweENDLCAweDVBLCAvKiAweDQ0LTB4NDcgKi8KKwkweEE5LCAweDdELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFCLCAweENFLCAvKiAweDQ4LTB4NEIgKi8KKwkweENFLCAweDc4LCAweEFCLCAweENELCAweEFCLCAweENCLCAweEFCLCAweENDLCAvKiAweDRDLTB4NEYgKi8KKwkweEFFLCAweDZBLCAweEFFLCAweDY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweEQxLCAweDZCLCAweEFFLCAweDY5LCAweEQxLCAweDZBLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEFFLCAweDVFLCAweEQ0LCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweEIxLCAweDUwLCAweEIxLCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEIxLCAweDRGLCAweDAwLCAweDAwLCAweEI5LCAweEYwLCAweEUxLCAweEEyLCAvKiAweDYwLTB4NjMgKi8KKwkweEJDLCAweDY4LCAweEJDLCAweDY5LCAweDAwLCAweDAwLCAweEU1LCAweDYxLCAvKiAweDY0LTB4NjcgKi8KKwkweEMwLCAweEFCLCAweEVGLCAweEMyLCAweEVGLCAweEMzLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEM0LCAweERELCAweEY4LCAweEE4LCAweEM5LCAweDRCLCAweEE0LCAweEQ5LCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweEE0LCAweDczLCAweDAwLCAweDAwLCAweEM5LCAweDc3LCAvKiAweDcwLTB4NzMgKi8KKwkweEM5LCAweDc2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEE2LCAweDdBLCAweEM5LCAweEQ3LCAweEM5LCAweEQ4LCAvKiAweDc4LTB4N0IgKi8KKwkweEM5LCAweEQ2LCAweDAwLCAweDAwLCAweEM5LCAweEQ5LCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEM3LCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweENBLCAweEMyLCAweENBLCAweEM0LCAweENBLCAweEM2LCAweENBLCAweEMzLCAvKiAweDg4LTB4OEIgKi8KKwkweEE3LCAweEM0LCAweENBLCAweEMwLCAweDAwLCAweDAwLCAweENBLCAweEMxLCAvKiAweDhDLTB4OEYgKi8KKwkweEE3LCAweEMxLCAweEE3LCAweEMyLCAweENBLCAweEM1LCAweENBLCAweEM4LCAvKiAweDkwLTB4OTMgKi8KKwkweEE3LCAweEMzLCAweENBLCAweEM5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweENDLCAweDY4LCAweDAwLCAweDAwLCAweENDLCAweDYyLCAvKiAweDlDLTB4OUYgKi8KKwkweENDLCAweDVELCAweEE5LCAweEEzLCAweENDLCAweDY1LCAweENDLCAweDYzLCAvKiAweEEwLTB4QTMgKi8KKwkweENDLCAweDVDLCAweENDLCAweDY5LCAweENDLCAweDZDLCAweENDLCAweDY3LCAvKiAweEE0LTB4QTcgKi8KKwkweENDLCAweDYwLCAweEE5LCAweEE1LCAweENDLCAweDY2LCAweEE5LCAweEE2LCAvKiAweEE4LTB4QUIgKi8KKwkweENDLCAweDYxLCAweENDLCAweDY0LCAweENDLCAweDVCLCAweENDLCAweDVGLCAvKiAweEFDLTB4QUYgKi8KKwkweENDLCAweDZCLCAweEE5LCAweEE3LCAweDAwLCAweDAwLCAweEE5LCAweEE4LCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweENDLCAweDVFLCAweENDLCAweDZBLCAweEE5LCAweEEyLCAvKiAweEI0LTB4QjcgKi8KKwkweEE5LCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweEFCLCAweENFLCAweEE0LCAvKiAweEM0LTB4QzcgKi8KKwkweENFLCAweEFBLCAweENFLCAweEEzLCAweENFLCAweEE1LCAweENFLCAweDdELCAvKiAweEM4LTB4Q0IgKi8KKwkweENFLCAweDdCLCAweDAwLCAweDAwLCAweENFLCAweEFDLCAweENFLCAweEE5LCAvKiAweENDLTB4Q0YgKi8KKwkweENFLCAweDc5LCAweDAwLCAweDAwLCAweEFCLCAweEQwLCAweENFLCAweEE3LCAvKiAweEQwLTB4RDMgKi8KKwkweENFLCAweEE4LCAweDAwLCAweDAwLCAweENFLCAweEE2LCAweENFLCAweDdDLCAvKiAweEQ0LTB4RDcgKi8KKwkweENFLCAweDdBLCAweEFCLCAweENGLCAweENFLCAweEEyLCAweENFLCAweDdFLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweEExLCAweENFLCAweEFELCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEFFLCAweDZGLCAweDAwLCAweDAwLCAweEFFLCAweDZFLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweEQxLCAweDZDLCAweEFFLCAweDZCLCAweEQxLCAweDZFLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweEFFLCAweDcwLCAweEQxLCAweDZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEFFLCAweDczLCAweDAwLCAweDAwLCAweEFFLCAweDcxLCAweEQxLCAweDcwLCAvKiAweEY0LTB4RjcgKi8KKwkweENFLCAweEFFLCAweEQxLCAweDcyLCAweDAwLCAweDAwLCAweEFFLCAweDZELCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEFFLCAweDZDLCAweDAwLCAweDAwLCAweEQxLCAweDZELCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181RFs1MTJdID0geworCTB4RDEsIDB4NzEsIDB4QUUsIDB4NzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjEsIDB4NTMsIDB4QjEsIDB4NTIsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDQsIDB4RjUsIC8qIDB4MDgtMHgwQiAqLworCTB4RDQsIDB4RjksIDB4RDQsIDB4RkIsIDB4QjEsIDB4NTQsIDB4RDQsIDB4RkUsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4QjEsIDB4NTgsIDB4RDUsIDB4NDEsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4QjEsIDB4NUEsIDB4MDAsIDB4MDAsIDB4QjEsIDB4NTYsIDB4QjEsIDB4NUUsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4QjEsIDB4NUIsIDB4RDQsIDB4RjcsIDB4QjEsIDB4NTUsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4RjYsIDB4RDQsIDB4RjQsIDB4RDUsIDB4NDMsIC8qIDB4MUMtMHgxRiAqLworCTB4RDQsIDB4RjgsIDB4MDAsIDB4MDAsIDB4QjEsIDB4NTcsIDB4RDUsIDB4NDIsIC8qIDB4MjAtMHgyMyAqLworCTB4QjEsIDB4NUMsIDB4RDQsIDB4RkQsIDB4RDQsIDB4RkMsIDB4QjEsIDB4NUQsIC8qIDB4MjQtMHgyNyAqLworCTB4RDQsIDB4RkEsIDB4QjEsIDB4NTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4NDQsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RDUsIDB4NDAsIDB4RDgsIDB4RTcsIDB4RDgsIDB4RUUsIDB4RDgsIDB4RTMsIC8qIDB4MzAtMHgzMyAqLworCTB4QjQsIDB4NTEsIDB4RDgsIDB4REYsIDB4RDgsIDB4RUYsIDB4RDgsIDB4RDksIC8qIDB4MzQtMHgzNyAqLworCTB4RDgsIDB4RUMsIDB4RDgsIDB4RUEsIDB4RDgsIDB4RTQsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4RDgsIDB4RUQsIDB4RDgsIDB4RTYsIDB4MDAsIDB4MDAsIDB4RDgsIDB4REUsIC8qIDB4M0MtMHgzRiAqLworCTB4RDgsIDB4RjAsIDB4RDgsIDB4REMsIDB4RDgsIDB4RTksIDB4RDgsIDB4REEsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4RjEsIDB4MDAsIDB4MDAsIDB4QjQsIDB4NTIsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4RUIsIDB4REQsIDB4NEYsIDB4RDgsIDB4REQsIC8qIDB4NDgtMHg0QiAqLworCTB4QjQsIDB4NEYsIDB4MDAsIDB4MDAsIDB4RDgsIDB4RTEsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4QjQsIDB4NTAsIDB4RDgsIDB4RTAsIDB4RDgsIDB4RTUsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4RTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4RTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4NTMsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4NTYsIDB4REQsIDB4NEUsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4REQsIDB4NTAsIDB4MDAsIDB4MDAsIDB4REQsIDB4NTUsIC8qIDB4NjQtMHg2NyAqLworCTB4REQsIDB4NTQsIDB4QjcsIDB4NDMsIDB4MDAsIDB4MDAsIDB4RDgsIDB4REIsIC8qIDB4NjgtMHg2QiAqLworCTB4REQsIDB4NTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjcsIDB4NDQsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4REQsIDB4NEQsIDB4REQsIDB4NTEsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QTksIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4QjAsIDB4RTEsIDB4QTcsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4RTEsIDB4QUUsIDB4RTEsIDB4QTUsIDB4RTEsIDB4QUQsIDB4RTEsIDB4QjEsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RTEsIDB4QTQsIDB4RTEsIDB4QTgsIDB4RTEsIDB4QTMsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4QjksIDB4RjEsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QTYsIDB4QjksIDB4RjIsIC8qIDB4ODQtMHg4NyAqLworCTB4RTEsIDB4QUMsIDB4RTEsIDB4QUIsIDB4RTEsIDB4QUEsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4QUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NjUsIDB4RTUsIDB4NjcsIC8qIDB4OTAtMHg5MyAqLworCTB4QkMsIDB4NkIsIDB4RTUsIDB4NjgsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NjMsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4NjIsIDB4RTUsIDB4NkMsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4RTUsIDB4NkEsIDB4QkMsIDB4NkEsIDB4RTUsIDB4NkQsIDB4RTUsIDB4NjQsIC8qIDB4OUMtMHg5RiAqLworCTB4RTUsIDB4NjksIDB4RTUsIDB4NkIsIDB4RTUsIDB4NjYsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4NjEsIC8qIDB4QTQtMHhBNyAqLworCTB4RTksIDB4NjYsIDB4RTksIDB4NjAsIDB4RTksIDB4NjUsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4RTksIDB4NUUsIDB4RTksIDB4NjgsIDB4RTksIDB4NjQsIDB4RTksIDB4NjksIC8qIDB4QUMtMHhBRiAqLworCTB4RTksIDB4NjMsIDB4RTksIDB4NUYsIDB4RTksIDB4NjcsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4RTksIDB4NkEsIDB4RTksIDB4NjIsIDB4MDAsIDB4MDAsIDB4RUMsIDB4REEsIC8qIDB4QjQtMHhCNyAqLworCTB4QzAsIDB4QUYsIDB4MDAsIDB4MDAsIDB4QzAsIDB4QUQsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4QzAsIDB4QUMsIDB4QzAsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4RUYsIDB4QzQsIDB4MDAsIDB4MDAsIDB4RjEsIDB4NzIsIDB4RjEsIDB4RkQsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4NDQsIDB4RjQsIDB4NDUsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4QzQsIDB4NjAsIDB4MDAsIDB4MDAsIDB4RjUsIDB4QzksIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4QzQsIDB4REUsIDB4MDAsIDB4MDAsIDB4RjUsIDB4Q0EsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4REUsIDB4QzUsIDB4NzIsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4QzUsIDB4NzEsIDB4RjYsIDB4REQsIDB4QzUsIDB4QzksIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4RjcsIDB4RDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4NzQsIDB4QTYsIDB4N0IsIDB4QzksIDB4REEsIC8qIDB4REMtMHhERiAqLworCTB4Q0EsIDB4Q0EsIDB4QTgsIDB4QjUsIDB4QjEsIDB4NUYsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4NzUsIDB4QTUsIDB4QUEsIDB4QTUsIDB4QTksIC8qIDB4RTQtMHhFNyAqLworCTB4QTUsIDB4QTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTcsIDB4QzUsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUUsIDB4NzQsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4REQsIDB4NTcsIDB4QTQsIDB4NzYsIDB4QTQsIDB4NzcsIDB4QTQsIDB4NzgsIC8qIDB4RjAtMHhGMyAqLworCTB4QTQsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUIsIDB4RDEsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4QUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4QjQsIDB4NTMsIDB4QTQsIDB4NzksIDB4QzksIDB4NUQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzVFWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNSwgMHhBQiwgMHhBNSwgMHhBQywgLyogMHgwMC0weDAzICovCisJMHhDOSwgMHg3OCwgMHgwMCwgMHgwMCwgMHhBNiwgMHg3QywgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhDQiwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhBNywgMHhDNiwgMHgwMCwgMHgwMCwgMHhDQSwgMHhDQywgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhBOSwgMHhBRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhDQywgMHg2RSwgMHhBOSwgMHhBQywgMHhBOSwgMHhBQiwgMHhDQywgMHg2RCwgLyogMHgxNC0weDE3ICovCisJMHhBOSwgMHhBOSwgMHhDQywgMHg2RiwgMHhBOSwgMHhBQSwgMHhBOSwgMHhBRCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhBQiwgMHhEMiwgMHgwMCwgMHgwMCwgMHhBQiwgMHhENCwgLyogMHgxQy0weDFGICovCisJMHhDRSwgMHhCMywgMHhDRSwgMHhCMCwgMHhDRSwgMHhCMSwgMHhDRSwgMHhCMiwgLyogMHgyMC0weDIzICovCisJMHhDRSwgMHhCNCwgMHhBQiwgMHhEMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhEMSwgMHg3NCwgMHhEMSwgMHg3MywgMHgwMCwgMHgwMCwgMHhBRSwgMHg3NiwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHhBRSwgMHg3NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMSwgMHg2MiwgLyogMHgzMC0weDMzICovCisJMHhENSwgMHg0NiwgMHgwMCwgMHgwMCwgMHhCMSwgMHg2MSwgMHhCMSwgMHg2MywgLyogMHgzNC0weDM3ICovCisJMHhCMSwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhCNCwgMHg1NSwgMHhENSwgMHg0NSwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhCNCwgMHg1NiwgMHhEOCwgMHhGMywgMHgwMCwgMHgwMCwgMHhCNCwgMHg1NywgLyogMHg0MC0weDQzICovCisJMHhEOCwgMHhGMiwgMHhCNCwgMHg1NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHg1QSwgMHhERCwgMHg1QywgLyogMHg0OC0weDRCICovCisJMHhCNywgMHg0NSwgMHhERCwgMHg1QiwgMHhERCwgMHg1OSwgMHhERCwgMHg1OCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhCNCwgLyogMHg1MC0weDUzICovCisJMHhCOSwgMHhGNywgMHhCOSwgMHhGNSwgMHgwMCwgMHgwMCwgMHhCOSwgMHhGNiwgLyogMHg1NC0weDU3ICovCisJMHhFMSwgMHhCMiwgMHhFMSwgMHhCMywgMHgwMCwgMHgwMCwgMHhCOSwgMHhGMywgLyogMHg1OC0weDVCICovCisJMHhFNSwgMHg3MSwgMHhFNSwgMHg2RiwgMHgwMCwgMHgwMCwgMHhCQywgMHg2RCwgLyogMHg1Qy0weDVGICovCisJMHhFNSwgMHg3MCwgMHhCQywgMHg2RSwgMHhCQywgMHg2QywgMHhCOSwgMHhGNCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHg2RCwgMHhFOSwgMHg2QiwgLyogMHg2NC0weDY3ICovCisJMHhFOSwgMHg2QywgMHhFNSwgMHg2RSwgMHhFQywgMHhEQywgMHhDMCwgMHhCMCwgLyogMHg2OC0weDZCICovCisJMHhFQywgMHhEQiwgMHhFRiwgMHhDNSwgMHhFRiwgMHhDNiwgMHhFOSwgMHg2RSwgLyogMHg2Qy0weDZGICovCisJMHhGMSwgMHhGRSwgMHgwMCwgMHgwMCwgMHhBNCwgMHg3QSwgMHhBNSwgMHhBRCwgLyogMHg3MC0weDczICovCisJMHhBNiwgMHg3RSwgMHhDOSwgMHhEQiwgMHhBNiwgMHg3RCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHhBOSwgMHhBRiwgMHhCNywgMHg0NiwgMHgwMCwgMHgwMCwgMHhBNCwgMHhEQiwgLyogMHg3OC0weDdCICovCisJMHhBNSwgMHhBRSwgMHhBQiwgMHhENSwgMHhCNCwgMHg1OCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhDOSwgMHg3OSwgMHgwMCwgMHgwMCwgMHhDOSwgMHg3QSwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhDOSwgMHhEQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNywgMHhDOCwgLyogMHg4NC0weDg3ICovCisJMHhDQSwgMHhEMCwgMHhDQSwgMHhDRSwgMHhBNywgMHhDOSwgMHhDQSwgMHhDRCwgLyogMHg4OC0weDhCICovCisJMHhDQSwgMHhDRiwgMHhDQSwgMHhEMSwgMHgwMCwgMHgwMCwgMHhBNywgMHhDNywgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhBOSwgMHhCMywgMHhBOSwgMHhCNCwgMHhBOSwgMHhCMSwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOSwgMHhCMCwgMHhDRSwgMHhCOCwgLyogMHg5OC0weDlCICovCisJMHhBOSwgMHhCMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhBQiwgMHhENiwgMHgwMCwgMHgwMCwgMHhDRSwgMHhCNywgMHhDRSwgMHhCOSwgLyogMHhBMC0weEEzICovCisJMHhDRSwgMHhCNiwgMHhDRSwgMHhCQSwgMHhBQiwgMHhENywgMHhBRSwgMHg3OSwgLyogMHhBNC0weEE3ICovCisJMHhEMSwgMHg3NSwgMHgwMCwgMHgwMCwgMHhEMSwgMHg3NywgMHhBRSwgMHg3NywgLyogMHhBOC0weEFCICovCisJMHhEMSwgMHg3OCwgMHhBRSwgMHg3OCwgMHhEMSwgMHg3NiwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhDRSwgMHhCNSwgMHhENSwgMHg0NywgMHhENSwgMHg0QSwgMHhENSwgMHg0QiwgLyogMHhCMC0weEIzICovCisJMHhENSwgMHg0OCwgMHhCMSwgMHg2NywgMHhCMSwgMHg2NiwgMHhCMSwgMHg2NCwgLyogMHhCNC0weEI3ICovCisJMHhCMSwgMHg2NSwgMHhENSwgMHg0OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMSwgMHg2OCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhCNCwgMHg1QSwgMHhCNCwgMHg1QiwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhCNCwgMHg1QywgMHhERCwgMHg1RCwgMHhERCwgMHg1RiwgMHhERCwgMHg2MSwgLyogMHhDNC0weEM3ICovCisJMHhCNywgMHg0OCwgMHhCNywgMHg0NywgMHhCNCwgMHg1OSwgMHhERCwgMHg2MCwgLyogMHhDOC0weENCICovCisJMHhERCwgMHg1RSwgMHgwMCwgMHgwMCwgMHhFMSwgMHhCOCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhCNiwgMHhFMSwgMHhCQywgMHhCOSwgMHhGOCwgLyogMHhEMC0weEQzICovCisJMHhFMSwgMHhCRCwgMHhFMSwgMHhCQSwgMHhCOSwgMHhGOSwgMHhFMSwgMHhCNywgLyogMHhENC0weEQ3ICovCisJMHhFMSwgMHhCNSwgMHhFMSwgMHhCQiwgMHhCQywgMHg3MCwgMHhFNSwgMHg3MywgLyogMHhEOC0weERCICovCisJMHhFMSwgMHhCOSwgMHhCQywgMHg3MiwgMHhFNSwgMHg3NCwgMHhCQywgMHg3MSwgLyogMHhEQy0weERGICovCisJMHhCQywgMHg3NCwgMHhFNSwgMHg3NSwgMHhCQywgMHg2RiwgMHhCQywgMHg3MywgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHg3MywgMHhFOSwgMHg3MSwgMHhFOSwgMHg3MCwgLyogMHhFNC0weEU3ICovCisJMHhFOSwgMHg3MiwgMHhFOSwgMHg2RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHhDMywgMHg2NiwgMHgwMCwgMHgwMCwgMHhGNCwgMHg0NiwgMHhGNCwgMHg0NywgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhDQiwgMHhGNiwgMHhERiwgMHhDNiwgMHg1NSwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOSwgMHhCNSwgMHhBNywgMHhDQSwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQiwgMHhEOCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHg3QiwgMHhBNCwgMHhEQywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNUZbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEE1LCAweEFGLCAweEM5LCAweERELCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEE3LCAweENCLCAweENBLCAweEQyLCAweDAwLCAweDAwLCAweENFLCAweEJCLCAvKiAweDA0LTB4MDcgKi8KKwkweEFCLCAweEQ5LCAweDAwLCAweDAwLCAweEI5LCAweEZBLCAweEE0LCAweDdDLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE2LCAweEExLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI3LCAweDQ5LCAweEE0LCAweDdELCAvKiAweDEwLTB4MTMgKi8KKwkweEE0LCAweERELCAweEE0LCAweERFLCAweDAwLCAweDAwLCAweEE1LCAweEIxLCAvKiAweDE0LTB4MTcgKi8KKwkweEE1LCAweEIwLCAweDAwLCAweDAwLCAweEM5LCAweERFLCAweEE2LCAweEEyLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweENBLCAweEQzLCAweDAwLCAweDAwLCAweEE3LCAweENDLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweDcxLCAweENDLCAweDcyLCAvKiAweDIwLTB4MjMgKi8KKwkweENDLCAweDczLCAweDAwLCAweDAwLCAweEE5LCAweEI2LCAweEE5LCAweEI3LCAvKiAweDI0LTB4MjcgKi8KKwkweENDLCAweDcwLCAweEE5LCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweEFCLCAweERBLCAweENFLCAweEJDLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEQxLCAweDdBLCAweEFFLCAweDdBLCAweDAwLCAweDAwLCAweEQxLCAweDc5LCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEIxLCAweDY5LCAweEQ1LCAweDRDLCAweEIxLCAweDZBLCAvKiAweDM0LTB4MzcgKi8KKwkweEQ1LCAweDRELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweEI0LCAweDVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweERELCAweDYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEJGLCAvKiAweDQwLTB4NDMgKi8KKwkweEUxLCAweEJFLCAweDAwLCAweDAwLCAweEI5LCAweEZCLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEJDLCAweDc1LCAweEU1LCAweDc2LCAweEJFLCAweENBLCAweEU5LCAweDc0LCAvKiAweDQ4LTB4NEIgKi8KKwkweEMwLCAweEIxLCAweDAwLCAweDAwLCAweEM1LCAweDczLCAweEY3LCAweEQ4LCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweENDLCAweDc0LCAweDAwLCAweDAwLCAweENFLCAweEJELCAweEIxLCAweDZCLCAvKiAweDU0LTB4NTcgKi8KKwkweEQ4LCAweEY0LCAweEI3LCAweDRBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweEMyLCAweDU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE3LCAweENFLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEE3LCAweENELCAweEFCLCAweERCLCAweDAwLCAweDAwLCAweEQxLCAweDdCLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEIxLCAweDZELCAweEIzLCAweDQzLCAweEIxLCAweDZFLCAvKiAweDY4LTB4NkIgKi8KKwkweEIxLCAweDZDLCAweEI0LCAweDVFLCAweDAwLCAweDAwLCAweEUxLCAweEMwLCAvKiAweDZDLTB4NkYgKi8KKwkweEI5LCAweEZDLCAweEJDLCAweDc2LCAweDAwLCAweDAwLCAweEM5LCAweDRDLCAvKiAweDcwLTB4NzMgKi8KKwkweEM5LCAweERGLCAweDAwLCAweDAwLCAweENBLCAweEQ1LCAweEE3LCAweENGLCAvKiAweDc0LTB4NzcgKi8KKwkweENBLCAweEQ0LCAweEE3LCAweEQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEE5LCAweEJDLCAweENDLCAweDc3LCAweENDLCAweDc2LCAweEE5LCAweEJCLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEE5LCAweEI5LCAweEE5LCAweEJBLCAweENDLCAweDc1LCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweEFCLCAweERELCAweENFLCAweEJFLCAweEFCLCAweEUwLCAvKiAweDg0LTB4ODcgKi8KKwkweEFCLCAweERDLCAweEFCLCAweEUyLCAweEFCLCAweERFLCAweEFCLCAweERGLCAvKiAweDg4LTB4OEIgKi8KKwkweEFCLCAweEUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweEFFLCAweDdELCAweEFFLCAweDdDLCAweEFFLCAweDdCLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweDRGLCAweEIxLCAweDZGLCAvKiAweDk0LTB4OTcgKi8KKwkweEIxLCAweDcyLCAweEIxLCAweDcwLCAweDAwLCAweDAwLCAweEQ1LCAweDRFLCAvKiAweDk4LTB4OUIgKi8KKwkweEIxLCAweDc1LCAweDAwLCAweDAwLCAweEIxLCAweDcxLCAweEQ1LCAweDUwLCAvKiAweDlDLTB4OUYgKi8KKwkweEIxLCAweDc0LCAweEIxLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweEQ4LCAweEY2LCAweEQ4LCAweEY1LCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEI0LCAweDYxLCAweEI0LCAweDVGLCAweEI0LCAweDYwLCAweEQ4LCAweEY3LCAvKiAweEE4LTB4QUIgKi8KKwkweEI3LCAweDRCLCAweERELCAweDY0LCAweEI3LCAweDRDLCAweERELCAweDYzLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweDc3LCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEJDLCAweDc4LCAweEUxLCAweEMxLCAweEJDLCAweDc3LCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEI5LCAweEZELCAweDAwLCAweDAwLCAweEVDLCAweERFLCAvKiAweEI4LTB4QkIgKi8KKwkweEU5LCAweDc1LCAweEMwLCAweEIyLCAweEVDLCAweERELCAweEYyLCAweDQwLCAvKiAweEJDLTB4QkYgKi8KKwkweEY0LCAweDQ4LCAweEY0LCAweDQ5LCAweDAwLCAweDAwLCAweEE0LCAweERGLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEE1LCAweEIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEM5LCAweDdCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEE3LCAweEQyLCAweEE3LCAweEQ0LCAweDAwLCAweDAwLCAweEM5LCAweEUyLCAvKiAweENDLTB4Q0YgKi8KKwkweENBLCAweEQ4LCAweENBLCAweEQ3LCAweENBLCAweEQ2LCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEM5LCAweEUxLCAweEM5LCAweEUwLCAweEE2LCAweEE0LCAweEE3LCAweEQzLCAvKiAweEQ0LTB4RDcgKi8KKwkweEE3LCAweEQxLCAweEE2LCAweEEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweEE5LCAweEJELCAweENDLCAweDc4LCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweEE5LCAweEJFLCAweENBLCAweERELCAweDAwLCAweDAwLCAweENBLCAweERGLCAvKiAweEUwLTB4RTMgKi8KKwkweENBLCAweERFLCAweENDLCAweDc5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweENBLCAweERBLCAweDAwLCAweDAwLCAweEE3LCAweEQ4LCAweEE3LCAweEQ2LCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweENBLCAweEQ5LCAweENBLCAweERCLCAweENBLCAweEUxLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweEE3LCAweEQ1LCAweDAwLCAweDAwLCAweENBLCAweERDLCAvKiAweEYwLTB4RjMgKi8KKwkweENBLCAweEU1LCAweEE5LCAweEMwLCAweDAwLCAweDAwLCAweENBLCAweEUyLCAvKiAweEY0LTB4RjcgKi8KKwkweEE3LCAweEQ3LCAweDAwLCAweDAwLCAweENBLCAweEUwLCAweENBLCAweEUzLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEE5LCAweEJGLCAweDAwLCAweDAwLCAweEE5LCAweEMxLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182MFs1MTJdID0geworCTB4Q0EsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4QUYsIDB4Q0MsIDB4QTIsIDB4Q0MsIDB4N0UsIC8qIDB4MDgtMHgwQiAqLworCTB4Q0MsIDB4QUUsIDB4Q0MsIDB4QTksIDB4QUIsIDB4RTcsIDB4QTksIDB4QzIsIC8qIDB4MEMtMHgwRiAqLworCTB4Q0MsIDB4QUEsIDB4Q0MsIDB4QUQsIDB4QUIsIDB4RTMsIDB4Q0MsIDB4QUMsIC8qIDB4MTAtMHgxMyAqLworCTB4QTksIDB4QzMsIDB4QTksIDB4QzgsIDB4QTksIDB4QzYsIDB4Q0MsIDB4QTMsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4N0MsIDB4Q0MsIDB4QTUsIDB4QTksIDB4Q0QsIC8qIDB4MTgtMHgxQiAqLworCTB4Q0MsIDB4QjAsIDB4QUIsIDB4RTQsIDB4Q0MsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4QUIsIDB4RTUsIDB4QTksIDB4QzksIDB4Q0MsIDB4QTgsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4Q0UsIDB4Q0QsIDB4QUIsIDB4RTYsIDB4Q0MsIDB4N0IsIDB4QTksIDB4Q0EsIC8qIDB4MjQtMHgyNyAqLworCTB4QUIsIDB4RTgsIDB4QTksIDB4Q0IsIDB4QTksIDB4QzcsIDB4QTksIDB4Q0MsIC8qIDB4MjgtMHgyQiAqLworCTB4Q0MsIDB4QTcsIDB4Q0MsIDB4N0EsIDB4Q0MsIDB4QUIsIDB4QTksIDB4QzQsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4N0QsIDB4Q0MsIDB4QTQsIC8qIDB4MzAtMHgzMyAqLworCTB4Q0MsIDB4QTEsIDB4QTksIDB4QzUsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4QkYsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4Q0UsIDB4Q0EsIDB4RDEsIDB4QTEsIDB4Q0UsIDB4Q0IsIDB4QUIsIDB4RUUsIC8qIDB4NDAtMHg0MyAqLworCTB4Q0UsIDB4Q0UsIDB4Q0UsIDB4QzQsIDB4QUIsIDB4RUQsIDB4Q0UsIDB4QzYsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4QzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4Q0UsIDB4QzksIDB4QUIsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4QUUsIDB4QTMsIDB4MDAsIDB4MDAsIDB4RjksIDB4REEsIDB4Q0UsIDB4QzUsIC8qIDB4NTAtMHg1MyAqLworCTB4Q0UsIDB4QzEsIDB4QUUsIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4Q0UsIDB4Q0YsIDB4QUUsIDB4N0UsIDB4RDEsIDB4N0QsIDB4Q0UsIDB4QzgsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4RDEsIDB4N0MsIDB4Q0UsIDB4QzMsIDB4Q0UsIDB4Q0MsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUIsIDB4RUMsIDB4QUUsIDB4QTEsIC8qIDB4NjAtMHg2MyAqLworCTB4QUIsIDB4RjIsIDB4QUUsIDB4QTIsIDB4Q0UsIDB4RDAsIDB4RDEsIDB4N0UsIC8qIDB4NjQtMHg2NyAqLworCTB4QUIsIDB4RUIsIDB4QUUsIDB4QTYsIDB4QUIsIDB4RjEsIDB4QUIsIDB4RjAsIC8qIDB4NjgtMHg2QiAqLworCTB4QUIsIDB4RUYsIDB4QUUsIDB4QTUsIDB4Q0UsIDB4RDEsIDB4QUUsIDB4QTcsIC8qIDB4NkMtMHg2RiAqLworCTB4QUIsIDB4RUEsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4QzIsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjEsIDB4NzYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RDEsIDB4QTQsIDB4RDEsIDB4QTYsIDB4MDAsIDB4MDAsIDB4RDEsIDB4QTgsIC8qIDB4ODAtMHg4MyAqLworCTB4QUUsIDB4QTgsIDB4QUUsIDB4QUUsIDB4RDUsIDB4NTMsIDB4RDEsIDB4QUMsIC8qIDB4ODQtMHg4NyAqLworCTB4RDEsIDB4QTMsIDB4QjEsIDB4NzgsIDB4RDUsIDB4NTEsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4QUUsIDB4QUQsIDB4QUUsIDB4QUIsIDB4RDEsIDB4QUUsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4RDUsIDB4NTIsIDB4MDAsIDB4MDAsIDB4RDEsIDB4QTUsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4QUUsIDB4QUMsIDB4RDEsIDB4QTksIDB4QUUsIDB4QUYsIDB4RDEsIDB4QUIsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUUsIDB4QUEsIDB4RDEsIDB4QUEsIC8qIDB4OTgtMHg5QiAqLworCTB4RDEsIDB4QUQsIDB4RDEsIDB4QTcsIDB4MDAsIDB4MDAsIDB4QUUsIDB4QTksIC8qIDB4OUMtMHg5RiAqLworCTB4QjEsIDB4NzksIDB4MDAsIDB4MDAsIDB4RDEsIDB4QTIsIDB4QjEsIDB4NzcsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4QjEsIDB4N0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4RDUsIDB4NTUsIDB4RDUsIDB4NUUsIDB4QjQsIDB4NjQsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4QjEsIDB4N0MsIDB4QjEsIDB4QTMsIDB4QjQsIDB4NjUsIDB4RDUsIDB4NjAsIC8qIDB4QjQtMHhCNyAqLworCTB4QjEsIDB4QUEsIDB4RDgsIDB4RjksIDB4RDUsIDB4NTYsIDB4QjEsIDB4QTIsIC8qIDB4QjgtMHhCQiAqLworCTB4QjEsIDB4QTUsIDB4QjEsIDB4N0UsIDB4RDUsIDB4NTQsIDB4RDUsIDB4NjIsIC8qIDB4QkMtMHhCRiAqLworCTB4RDUsIDB4NjUsIDB4RDksIDB4NDksIDB4MDAsIDB4MDAsIDB4RDUsIDB4NjMsIC8qIDB4QzAtMHhDMyAqLworCTB4RDgsIDB4RkQsIDB4QjEsIDB4QTEsIDB4QjEsIDB4QTgsIDB4QjEsIDB4QUMsIC8qIDB4QzQtMHhDNyAqLworCTB4RDUsIDB4NUQsIDB4RDgsIDB4RjgsIDB4RDUsIDB4NjEsIDB4QjEsIDB4N0IsIC8qIDB4QzgtMHhDQiAqLworCTB4RDgsIDB4RkEsIDB4RDUsIDB4NjQsIDB4RDgsIDB4RkMsIDB4RDUsIDB4NTksIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4QjQsIDB4NjIsIDB4MDAsIDB4MDAsIDB4RDUsIDB4NTcsIC8qIDB4RDAtMHhEMyAqLworCTB4RDUsIDB4NTgsIDB4QjEsIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4QjEsIDB4QTYsIDB4RDUsIDB4NUIsIDB4QjEsIDB4QUIsIDB4RDUsIDB4NUYsIC8qIDB4RDgtMHhEQiAqLworCTB4QjEsIDB4QTQsIDB4RDUsIDB4NUMsIDB4MDAsIDB4MDAsIDB4QjEsIDB4QTksIC8qIDB4REMtMHhERiAqLworCTB4QjQsIDB4NjYsIDB4QjQsIDB4NjMsIDB4RDgsIDB4RkIsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4RDUsIDB4NUEsIDB4MDAsIDB4MDAsIDB4QjEsIDB4N0QsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4QjQsIDB4NkIsIDB4QjQsIDB4NkYsIDB4RDksIDB4NDAsIDB4QjcsIDB4NTEsIC8qIDB4RjAtMHhGMyAqLworCTB4QjQsIDB4NkQsIDB4RDksIDB4NDQsIDB4QjQsIDB4NzEsIDB4REQsIDB4NjUsIC8qIDB4RjQtMHhGNyAqLworCTB4RDksIDB4NDYsIDB4QjcsIDB4NTMsIDB4QjQsIDB4NjksIDB4QjQsIDB4NkMsIC8qIDB4RjgtMHhGQiAqLworCTB4RDksIDB4NDcsIDB4MDAsIDB4MDAsIDB4RDksIDB4NDgsIDB4RDksIDB4NEUsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzYxWzUxMl0gPSB7CisJMHhCNCwgMHg3MywgMHhCNywgMHg1NCwgMHgwMCwgMHgwMCwgMHhEOSwgMHg0QSwgLyogMHgwMC0weDAzICovCisJMHhEOSwgMHg0RiwgMHhEOSwgMHg0MywgMHhCNywgMHg1RSwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhCNywgMHg1NSwgMHhCNCwgMHg3MiwgMHhEOSwgMHg0MSwgMHhEOSwgMHg1MCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhCNywgMHg1RCwgMHhCNCwgMHg3MCwgMHhCNywgMHg0RSwgLyogMHgwQy0weDBGICovCisJMHhEOSwgMHg0RCwgMHgwMCwgMHgwMCwgMHhCNCwgMHg3NCwgMHhEOSwgMHg0NSwgLyogMHgxMC0weDEzICovCisJMHhEOCwgMHhGRSwgMHhCNCwgMHg2QSwgMHhEOSwgMHg0MiwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhEOSwgMHg0QiwgMHgwMCwgMHgwMCwgMHhCNywgMHg0RCwgMHhCNywgMHg1MiwgLyogMHgxOC0weDFCICovCisJMHhCNCwgMHg2NywgMHhEOSwgMHg0QywgMHgwMCwgMHgwMCwgMHhCNywgMHg1MCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNCwgMHg2OCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNywgMHg1QywgLyogMHgyNC0weDI3ICovCisJMHhFMSwgMHhDMywgMHhERCwgMHg3MCwgMHgwMCwgMHgwMCwgMHhERCwgMHg2OCwgLyogMHgyOC0weDJCICovCisJMHhFMSwgMHhDMiwgMHgwMCwgMHgwMCwgMHhERCwgMHg2QywgMHhERCwgMHg2RSwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHg2QiwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhCNywgMHg1QiwgMHgwMCwgMHgwMCwgMHhERCwgMHg2QSwgMHhCNywgMHg1RiwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhEMiwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNywgMHg1QSwgMHhCQSwgMHg0MCwgLyogMHgzQy0weDNGICovCisJMHhERCwgMHg3MSwgMHhFMSwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhCNywgMHg1OCwgMHhERCwgMHg2OSwgMHhERCwgMHg2RCwgMHhCOSwgMHhGRSwgLyogMHg0NC0weDQ3ICovCisJMHhCNywgMHg0RiwgMHhERCwgMHg2NiwgMHhERCwgMHg2NywgMHhCQSwgMHg0MSwgLyogMHg0OC0weDRCICovCisJMHhCNywgMHg1NywgMHhCNywgMHg1OSwgMHhCNywgMHg1NiwgMHhERCwgMHg2RiwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhDOCwgMHhFMSwgMHhDOSwgLyogMHg1MC0weDUzICovCisJMHhFMSwgMHhDRSwgMHhCQywgMHg3RCwgMHhFMSwgMHhENSwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhCQSwgMHg0NywgMHgwMCwgMHgwMCwgMHhCQSwgMHg0NiwgMHhFMSwgMHhEMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhCQywgMHg3QywgMHhFMSwgMHhDNSwgMHhCQSwgMHg0NSwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhENCwgMHhCQSwgMHg0MywgMHhCQSwgMHg0NCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhEMSwgMHhFNSwgMHhBQSwgMHhCQywgMHg3QSwgLyogMHg2NC0weDY3ICovCisJMHhCNCwgMHg2RSwgMHgwMCwgMHgwMCwgMHhFMSwgMHhEMywgMHhCQywgMHhBMywgLyogMHg2OC0weDZCICovCisJMHhFMSwgMHhDQiwgMHgwMCwgMHgwMCwgMHhCQywgMHg3QiwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhCQywgMHhBMiwgMHhFMSwgMHhDNiwgMHhFMSwgMHhDQSwgMHhFMSwgMHhDNywgLyogMHg3MC0weDczICovCisJMHhFMSwgMHhDRCwgMHhCQSwgMHg0OCwgMHhCQywgMHg3OSwgMHhCQSwgMHg0MiwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHg3QSwgMHhFMSwgMHhDRiwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhCQywgMHhBMSwgMHgwMCwgMHgwMCwgMHhCQywgMHhBNCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhFMSwgMHhDQywgMHgwMCwgMHgwMCwgMHhCQywgMHg3RSwgMHhFNSwgMHg3OSwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHg3RSwgMHhCRSwgMHhDRSwgMHhFNSwgMHg3OCwgLyogMHg4OC0weDhCICovCisJMHhFOSwgMHhBMywgMHhFNSwgMHhBOSwgMHhCQywgMHhBOCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhCQywgMHhBNiwgMHhCRSwgMHhDQywgMHhFNSwgMHhBNiwgMHhFNSwgMHhBMiwgLyogMHg5MC0weDkzICovCisJMHhCQywgMHhBQywgMHgwMCwgMHgwMCwgMHhFOSwgMHg3OCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQywgMHhBQSwgMHhFNSwgMHhBMSwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHg3NiwgMHgwMCwgMHgwMCwgMHhFNSwgMHhBNSwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHhBOCwgMHhFNSwgMHg3RCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhCQywgMHhBQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQywgMHhBNSwgLyogMHhBNC0weEE3ICovCisJMHhFOSwgMHg3NywgMHhCRSwgMHhDRCwgMHhFNSwgMHhBNywgMHhCQywgMHhBNywgLyogMHhBOC0weEFCICovCisJMHhCQywgMHhBOSwgMHhFNSwgMHhBNCwgMHhCQywgMHhBRCwgMHhFNSwgMHhBMywgLyogMHhBQy0weEFGICovCisJMHhFNSwgMHg3QywgMHhFNSwgMHg3QiwgMHhCRSwgMHhDQiwgMHhFNSwgMHhBQiwgLyogMHhCMC0weEIzICovCisJMHhFOSwgMHg3QSwgMHhFQywgMHhFMCwgMHhCRSwgMHhEMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhFOSwgMHhBMiwgMHgwMCwgMHgwMCwgMHhFOSwgMHg3RSwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHhFQywgMHhFMSwgMHgwMCwgMHgwMCwgMHhCRSwgMHhEMSwgMHhFOSwgMHhBMSwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHg3QywgMHhDMCwgMHhCNCwgMHhFQywgMHhERiwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHg3OSwgMHhFOSwgMHg3QiwgMHhDMCwgMHhCNSwgLyogMHhDNC0weEM3ICovCisJMHhCRSwgMHhEMywgMHhDMCwgMHhCMywgMHhCRSwgMHhEMiwgMHhDMCwgMHhCNywgLyogMHhDOC0weENCICovCisJMHhFOSwgMHg3RCwgMHhCRSwgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhDRiwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhFRiwgMHhDNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQywgMHhFNywgMHhFRiwgMHhDOCwgLyogMHhEQy0weERGICovCisJMHhFQywgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMiwgMHg1NiwgLyogMHhFMC0weEUzICovCisJMHhFQywgMHhFNSwgMHhFQywgMHhFNCwgMHhDMCwgMHhCNiwgMHhFQywgMHhFMiwgLyogMHhFNC0weEU3ICovCisJMHhFQywgMHhFNiwgMHhFRiwgMHhEMCwgMHhFRiwgMHhDQywgMHhFRiwgMHhDRSwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHhFRiwgMHhDOSwgMHhFRiwgMHhDQSwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhFRiwgMHhDRCwgMHhFRiwgMHhDQiwgMHhDMywgMHg2NywgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHhDMywgMHg2QSwgMHhDMywgMHg2OSwgMHhDMywgMHg2OCwgLyogMHhGNC0weEY3ICovCisJMHhDNCwgMHg2MSwgMHhGNCwgMHg0QSwgMHhDNCwgMHg2MiwgMHhGMiwgMHg0MSwgLyogMHhGOC0weEZCICovCisJMHhDNCwgMHhERiwgMHhGNSwgMHhDQywgMHhDNCwgMHhFMCwgMHhDNSwgMHg3NCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjJbNTEyXSA9IHsKKwkweEM1LCAweENBLCAweEY3LCAweEQ5LCAweDAwLCAweDAwLCAweEY3LCAweERBLCAvKiAweDAwLTB4MDMgKi8KKwkweEY3LCAweERCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LCAweEJBLCAvKiAweDA0LTB4MDcgKi8KKwkweEE0LCAweEUwLCAweEM5LCAweDdDLCAweEE1LCAweEIzLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEE2LCAweEE2LCAweEE2LCAweEE3LCAweEE2LCAweEE1LCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEE2LCAweEE4LCAweEE3LCAweERBLCAweEE3LCAweEQ5LCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweENDLCAweEIxLCAweEE5LCAweENGLCAweEE5LCAweENFLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEQxLCAweEFGLCAweEIxLCAweEFELCAweEIxLCAweEFFLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI0LCAweDc1LCAvKiAweDFDLTB4MUYgKi8KKwkweERELCAweDcyLCAweEI3LCAweDYwLCAweEI3LCAweDYxLCAweERELCAweDc0LCAvKiAweDIwLTB4MjMgKi8KKwkweERELCAweDc2LCAweERELCAweDc1LCAweDAwLCAweDAwLCAweEUxLCAweEQ3LCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEQ2LCAweEJBLCAweDQ5LCAweEUxLCAweEQ4LCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEFDLCAweEJDLCAweEFFLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEJFLCAweEQ0LCAweDAwLCAweDAwLCAweEMwLCAweEI4LCAweEMyLCAweDU3LCAvKiAweDMwLTB4MzMgKi8KKwkweEMwLCAweEI5LCAweDAwLCAweDAwLCAweEE0LCAweEUxLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEU2LCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweENDLCAweEIyLCAweEE5LCAweEQxLCAweEE5LCAweEQwLCAvKiAweDNDLTB4M0YgKi8KKwkweEE5LCAweEQyLCAweEFCLCAweEYzLCAweENFLCAweEQyLCAweENFLCAweEQzLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQxLCAweEIwLCAweEFFLCAweEIwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEIxLCAweEFGLCAweEI0LCAweDc2LCAweEQ5LCAweDUxLCAweEE0LCAweEUyLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweEE0LCAweDdFLCAweEE0LCAweEUzLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEM5LCAweDdELCAweEE1LCAweEI3LCAweEE1LCAweEI2LCAweEE1LCAweEI0LCAvKiAweDUwLTB4NTMgKi8KKwkweEE1LCAweEI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEE2LCAweEFCLCAweEM5LCAweEU5LCAweEM5LCAweEVCLCAweEE2LCAweEFBLCAvKiAweDU4LTB4NUIgKi8KKwkweEM5LCAweEUzLCAweDAwLCAweDAwLCAweEM5LCAweEU0LCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEM5LCAweEVBLCAweEM5LCAweEU2LCAweEM5LCAweEU4LCAweEE2LCAweEE5LCAvKiAweDYwLTB4NjMgKi8KKwkweEM5LCAweEU1LCAweEM5LCAweEVDLCAweEM5LCAweEU3LCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEE3LCAweEUxLCAweEE3LCAweEVBLCAweEE3LCAweEU4LCAvKiAweDZDLTB4NkYgKi8KKwkweENBLCAweEYwLCAweENBLCAweEVELCAweENBLCAweEY1LCAweEE3LCAweEU2LCAvKiAweDcwLTB4NzMgKi8KKwkweENBLCAweEY2LCAweDAwLCAweDAwLCAweEE3LCAweERGLCAweENBLCAweEYzLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEE3LCAweEU1LCAweENBLCAweEVGLCAweENBLCAweEVFLCAvKiAweDc4LTB4N0IgKi8KKwkweEE3LCAweEUzLCAweENBLCAweEY0LCAweEE3LCAweEU0LCAweEE5LCAweEQzLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEE3LCAweERFLCAweENBLCAweEYxLCAweDAwLCAweDAwLCAweENBLCAweEU3LCAvKiAweDgwLTB4ODMgKi8KKwkweEE3LCAweERCLCAweDAwLCAweDAwLCAweEE3LCAweEVFLCAweENBLCAweEVDLCAvKiAweDg0LTB4ODcgKi8KKwkweENBLCAweEYyLCAweEE3LCAweEUwLCAweEE3LCAweEUyLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweENBLCAweEU4LCAweDAwLCAweDAwLCAweENBLCAweEU5LCAweENBLCAweEVBLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEE3LCAweEVELCAweEE3LCAweEU3LCAweEE3LCAweEVDLCAvKiAweDkwLTB4OTMgKi8KKwkweENBLCAweEVCLCAweEE3LCAweEVCLCAweEE3LCAweERELCAweEE3LCAweERDLCAvKiAweDk0LTB4OTcgKi8KKwkweEE3LCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEE5LCAweEUxLCAweENDLCAweEJFLCAweENDLCAweEI3LCAweEE5LCAweERDLCAvKiAweEE4LTB4QUIgKi8KKwkweEE5LCAweEVGLCAweENDLCAweEIzLCAweENDLCAweEJBLCAweENDLCAweEJDLCAvKiAweEFDLTB4QUYgKi8KKwkweENDLCAweEJGLCAweEE5LCAweEVBLCAweDAwLCAweDAwLCAweENDLCAweEJCLCAvKiAweEIwLTB4QjMgKi8KKwkweENDLCAweEI0LCAweEE5LCAweEU4LCAweENDLCAweEI4LCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweENDLCAweEMwLCAweEE5LCAweEQ5LCAweDAwLCAweDAwLCAweENDLCAweEJELCAvKiAweEI4LTB4QkIgKi8KKwkweEE5LCAweEUzLCAweEE5LCAweEUyLCAweENDLCAweEI2LCAweEE5LCAweEQ3LCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE5LCAweEQ4LCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEE5LCAweEQ2LCAweDAwLCAweDAwLCAweEE5LCAweEVFLCAweEE5LCAweEU2LCAvKiAweEM0LTB4QzcgKi8KKwkweEE5LCAweEUwLCAweEE5LCAweEQ0LCAweENDLCAweEI5LCAweEE5LCAweERGLCAvKiAweEM4LTB4Q0IgKi8KKwkweEE5LCAweEQ1LCAweEE5LCAweEU3LCAweEE5LCAweEYwLCAweENFLCAweEQ0LCAvKiAweENDLTB4Q0YgKi8KKwkweEE5LCAweEU0LCAweENDLCAweEI1LCAweEE5LCAweERBLCAweEE5LCAweERELCAvKiAweEQwLTB4RDMgKi8KKwkweEE5LCAweERFLCAweDAwLCAweDAwLCAweEE5LCAweEVDLCAweEE5LCAweEVELCAvKiAweEQ0LTB4RDcgKi8KKwkweEE5LCAweEVCLCAweEE5LCAweEU1LCAweEE5LCAweEU5LCAweEE5LCAweERCLCAvKiAweEQ4LTB4REIgKi8KKwkweEFCLCAweEY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweERBLCAvKiAweEU4LTB4RUIgKi8KKwkweEFDLCAweDQxLCAweEFCLCAweEY4LCAweEFCLCAweEZBLCAweEFDLCAweDQwLCAvKiAweEVDLTB4RUYgKi8KKwkweENFLCAweEU2LCAweEFCLCAweEZELCAweEQxLCAweEIxLCAweEFFLCAweEIxLCAvKiAweEYwLTB4RjMgKi8KKwkweEFDLCAweDQzLCAweENFLCAweEQ3LCAweENFLCAweERGLCAweEFCLCAweEZFLCAvKiAweEY0LTB4RjcgKi8KKwkweENFLCAweERFLCAweENFLCAweERCLCAweENFLCAweEUzLCAweENFLCAweEU1LCAvKiAweEY4LTB4RkIgKi8KKwkweEFCLCAweEY3LCAweEFCLCAweEZCLCAweEFDLCAweDQyLCAweEFFLCAweEIzLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182M1s1MTJdID0geworCTB4Q0UsIDB4RTAsIDB4QUIsIDB4RjksIDB4QUMsIDB4NDUsIDB4Q0UsIDB4RDksIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUIsIDB4RkMsIC8qIDB4MDQtMHgwNyAqLworCTB4QUUsIDB4QjIsIDB4QUIsIDB4RjYsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4RDYsIC8qIDB4MDgtMHgwQiAqLworCTB4Q0UsIDB4REQsIDB4Q0UsIDB4RDUsIDB4Q0UsIDB4RDgsIDB4Q0UsIDB4REMsIC8qIDB4MEMtMHgwRiAqLworCTB4RDEsIDB4QjIsIDB4QUMsIDB4NDQsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4RTEsIC8qIDB4MTAtMHgxMyAqLworCTB4Q0UsIDB4RTIsIDB4Q0UsIDB4RTQsIDB4QUIsIDB4RjUsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4QUUsIDB4QzEsIDB4RDEsIDB4QkUsIDB4QUUsIDB4QkYsIDB4QUUsIDB4QzAsIC8qIDB4MjgtMHgyQiAqLworCTB4RDEsIDB4QjQsIDB4RDEsIDB4QzQsIDB4MDAsIDB4MDAsIDB4QUUsIDB4QjYsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4NjYsIDB4RDEsIDB4QzYsIC8qIDB4MzAtMHgzMyAqLworCTB4RDEsIDB4QzAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4QjcsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4RDEsIDB4QzksIDB4RDEsIDB4QkEsIDB4QUUsIDB4QkMsIDB4RDUsIDB4N0QsIC8qIDB4MzgtMHgzQiAqLworCTB4RDEsIDB4QkQsIDB4QUUsIDB4QkUsIDB4QUUsIDB4QjUsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4RDEsIDB4Q0IsIDB4RDEsIDB4QkYsIDB4QUUsIDB4QjgsIDB4RDEsIDB4QjgsIC8qIDB4NDAtMHg0MyAqLworCTB4RDEsIDB4QjUsIDB4RDEsIDB4QjYsIDB4QUUsIDB4QjksIDB4RDEsIDB4QzUsIC8qIDB4NDQtMHg0NyAqLworCTB4RDEsIDB4Q0MsIDB4QUUsIDB4QkIsIDB4RDEsIDB4QkMsIDB4RDEsIDB4QkIsIC8qIDB4NDgtMHg0QiAqLworCTB4QUUsIDB4QzMsIDB4QUUsIDB4QzIsIDB4QUUsIDB4QjQsIDB4QUUsIDB4QkEsIC8qIDB4NEMtMHg0RiAqLworCTB4QUUsIDB4QkQsIDB4RDEsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4RDEsIDB4QzIsIDB4QUUsIDB4QjcsIDB4RDEsIDB4QjMsIDB4RDEsIDB4Q0EsIC8qIDB4NTQtMHg1NyAqLworCTB4RDEsIDB4QzEsIDB4RDEsIDB4QzMsIDB4RDEsIDB4QzcsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4NjcsIDB4MDAsIDB4MDAsIDB4QjEsIDB4QjcsIC8qIDB4NjQtMHg2NyAqLworCTB4QjEsIDB4Q0IsIDB4QjEsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4QjEsIDB4QkYsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4NzksIDB4RDUsIDB4NzUsIDB4RDUsIDB4NzIsIC8qIDB4NkMtMHg2RiAqLworCTB4RDUsIDB4QTYsIDB4QjEsIDB4QkEsIDB4QjEsIDB4QjIsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4NzcsIDB4QjQsIDB4QTgsIDB4QjEsIDB4QjYsIC8qIDB4NzQtMHg3NyAqLworCTB4RDUsIDB4QTEsIDB4MDAsIDB4MDAsIDB4QjEsIDB4Q0MsIDB4QjEsIDB4QzksIC8qIDB4NzgtMHg3QiAqLworCTB4RDUsIDB4N0IsIDB4RDUsIDB4NkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QjEsIDB4QzgsIDB4RDUsIDB4QTMsIDB4RDUsIDB4NjksIDB4QjEsIDB4QkQsIC8qIDB4ODAtMHg4MyAqLworCTB4QjEsIDB4QzEsIDB4RDUsIDB4QTIsIDB4MDAsIDB4MDAsIDB4RDUsIDB4NzMsIC8qIDB4ODQtMHg4NyAqLworCTB4QjEsIDB4QzIsIDB4QjEsIDB4QkMsIDB4RDUsIDB4NjgsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4QjQsIDB4NzgsIDB4RDUsIDB4QTUsIDB4RDUsIDB4NzEsIDB4QjEsIDB4QzcsIC8qIDB4OEMtMHg4RiAqLworCTB4RDUsIDB4NzQsIDB4RDUsIDB4QTQsIDB4QjEsIDB4QzYsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4RDksIDB4NTIsIDB4MDAsIDB4MDAsIDB4QjEsIDB4QjMsIDB4RDUsIDB4NkYsIC8qIDB4OTQtMHg5NyAqLworCTB4QjEsIDB4QjgsIDB4QjEsIDB4QzMsIDB4MDAsIDB4MDAsIDB4QjEsIDB4QkUsIC8qIDB4OTgtMHg5QiAqLworCTB4RDUsIDB4NzgsIDB4RDUsIDB4NkUsIDB4RDUsIDB4NkMsIDB4RDUsIDB4N0UsIC8qIDB4OUMtMHg5RiAqLworCTB4QjEsIDB4QjAsIDB4QjEsIDB4QzQsIDB4QjEsIDB4QjQsIDB4QjQsIDB4NzcsIC8qIDB4QTAtMHhBMyAqLworCTB4RDUsIDB4N0MsIDB4QjEsIDB4QjUsIDB4MDAsIDB4MDAsIDB4QjEsIDB4QjEsIC8qIDB4QTQtMHhBNyAqLworCTB4QjEsIDB4QzAsIDB4QjEsIDB4QkIsIDB4QjEsIDB4QjksIDB4RDUsIDB4NzAsIC8qIDB4QTgtMHhBQiAqLworCTB4QjEsIDB4QzUsIDB4RDUsIDB4NkQsIDB4RDUsIDB4N0EsIDB4RDUsIDB4NzYsIC8qIDB4QUMtMHhBRiAqLworCTB4RDksIDB4NTQsIDB4RDksIDB4NTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4NkIsIDB4RDksIDB4NjQsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4QjQsIDB4N0EsIDB4MDAsIDB4MDAsIDB4RDksIDB4NkEsIDB4RDksIDB4NTksIC8qIDB4QzAtMHhDMyAqLworCTB4RDksIDB4NjcsIDB4REQsIDB4NzcsIDB4QjQsIDB4N0QsIDB4RDksIDB4NkIsIC8qIDB4QzQtMHhDNyAqLworCTB4RDksIDB4NkUsIDB4QjQsIDB4N0MsIDB4RDksIDB4NUMsIDB4RDksIDB4NkQsIC8qIDB4QzgtMHhDQiAqLworCTB4RDksIDB4NkMsIDB4QjQsIDB4N0UsIDB4RDksIDB4NTUsIDB4QjQsIDB4NzksIC8qIDB4Q0MtMHhDRiAqLworCTB4QjQsIDB4QTMsIDB4MDAsIDB4MDAsIDB4QjQsIDB4QTEsIDB4RDksIDB4NjksIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4RDksIDB4NUYsIDB4QjQsIDB4QTUsIDB4RDksIDB4NzAsIC8qIDB4RDQtMHhENyAqLworCTB4RDksIDB4NjgsIDB4RDksIDB4NzEsIDB4QjQsIDB4QUQsIDB4QjQsIDB4QUIsIC8qIDB4RDgtMHhEQiAqLworCTB4RDksIDB4NjYsIDB4RDksIDB4NjUsIDB4MDAsIDB4MDAsIDB4RDksIDB4NjMsIC8qIDB4REMtMHhERiAqLworCTB4RDksIDB4NUQsIDB4QjQsIDB4QTQsIDB4MDAsIDB4MDAsIDB4QjQsIDB4QTIsIC8qIDB4RTAtMHhFMyAqLworCTB4RDEsIDB4QjksIDB4RDksIDB4NTYsIDB4MDAsIDB4MDAsIDB4REQsIDB4QjcsIC8qIDB4RTQtMHhFNyAqLworCTB4RDksIDB4NTcsIDB4QjQsIDB4N0IsIDB4QjQsIDB4QUEsIDB4REQsIDB4NzksIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4QjQsIDB4QTYsIDB4QjQsIDB4QTcsIDB4RDksIDB4NTgsIC8qIDB4RUMtMHhFRiAqLworCTB4RDksIDB4NkYsIDB4REQsIDB4NzgsIDB4RDksIDB4NjAsIDB4RDksIDB4NUIsIC8qIDB4RjAtMHhGMyAqLworCTB4QjQsIDB4QTksIDB4RDksIDB4NjEsIDB4RDksIDB4NUUsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4QjQsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzY0WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNywgMHg3MCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhERCwgMHg3QywgMHhERCwgMHhCMSwgMHhERCwgMHhCNiwgLyogMHgwOC0weDBCICovCisJMHhERCwgMHhBQSwgMHhCNywgMHg2QywgMHhERCwgMHhCQiwgMHhCNywgMHg2OSwgLyogMHgwQy0weDBGICovCisJMHhERCwgMHg3QSwgMHgwMCwgMHgwMCwgMHhERCwgMHg3QiwgMHhCNywgMHg2MiwgLyogMHgxMC0weDEzICovCisJMHhCNywgMHg2QiwgMHhERCwgMHhBNCwgMHhCNywgMHg2RSwgMHhCNywgMHg2RiwgLyogMHgxNC0weDE3ICovCisJMHhERCwgMHhBNSwgMHgwMCwgMHgwMCwgMHhERCwgMHhCMiwgMHhERCwgMHhCOCwgLyogMHgxOC0weDFCICovCisJMHhCNywgMHg2QSwgMHgwMCwgMHgwMCwgMHhCNywgMHg2NCwgMHhERCwgMHhBMywgLyogMHgxQy0weDFGICovCisJMHhERCwgMHg3RCwgMHhERCwgMHhCQSwgMHhERCwgMHhBOCwgMHhERCwgMHhBOSwgLyogMHgyMC0weDIzICovCisJMHhERCwgMHg3RSwgMHhERCwgMHhCNCwgMHhERCwgMHhBQiwgMHhERCwgMHhCNSwgLyogMHgyNC0weDI3ICovCisJMHhERCwgMHhBRCwgMHgwMCwgMHgwMCwgMHhCNywgMHg2NSwgMHhFMSwgMHhEOSwgLyogMHgyOC0weDJCICovCisJMHhCNywgMHg2OCwgMHhCNywgMHg2NiwgMHhERCwgMHhCOSwgMHhERCwgMHhCMCwgLyogMHgyQy0weDJGICovCisJMHhERCwgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHhBMSwgLyogMHgzMC0weDMzICovCisJMHhCQSwgMHg1MywgMHhERCwgMHhBRiwgMHhCNywgMHg2RCwgMHhERCwgMHhBNywgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHhERCwgMHhBNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhCNywgMHg2NywgMHhCNywgMHg2MywgMHhFMSwgMHhFRSwgLyogMHgzQy0weDNGICovCisJMHhERCwgMHhCMywgMHhERCwgMHhBRSwgMHgwMCwgMHgwMCwgMHhERCwgMHhBMiwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhFOSwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhEQSwgMHhFMSwgMHhFNSwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhFMSwgMHhFQywgMHhCQSwgMHg1MSwgMHhCNCwgMHhBQywgMHhFMSwgMHhFQSwgLyogMHg1MC0weDUzICovCisJMHhCQSwgMHg0QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhCQSwgMHg0QiwgMHhFMSwgMHhGMSwgMHgwMCwgMHgwMCwgMHhFMSwgMHhEQiwgLyogMHg1OC0weDVCICovCisJMHhFMSwgMHhFOCwgMHhFMSwgMHhEQywgMHhFMSwgMHhFNywgMHhCQSwgMHg0RiwgLyogMHg1Qy0weDVGICovCisJMHhFMSwgMHhFQiwgMHhEOSwgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhGMiwgMHhFMSwgMHhFMywgMHhCQSwgMHg1MiwgLyogMHg2NC0weDY3ICovCisJMHhFNSwgMHhCQSwgMHhCQywgMHhBRiwgMHgwMCwgMHgwMCwgMHhFMSwgMHhGMCwgLyogMHg2OC0weDZCICovCisJMHhFMSwgMHhFRiwgMHhCQSwgMHg1NCwgMHhFNSwgMHhBRCwgMHhCQywgMHhCMCwgLyogMHg2Qy0weDZGICovCisJMHhFNSwgMHhBRSwgMHgwMCwgMHgwMCwgMHhFMSwgMHhERiwgMHhFMSwgMHhFMCwgLyogMHg3MC0weDczICovCisJMHhFMSwgMHhERCwgMHhFMSwgMHhFMiwgMHhFMSwgMHhERSwgMHhFMSwgMHhGMywgLyogMHg3NC0weDc3ICovCisJMHhCQSwgMHg0RSwgMHhCQywgMHhCMSwgMHhCQSwgMHg1MCwgMHhCQSwgMHg1NSwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhFMSwgMHgwMCwgMHgwMCwgMHhFMSwgMHhFRCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhFNiwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHhCMSwgMHgwMCwgMHgwMCwgMHhCQSwgMHg0QSwgLyogMHg4NC0weDg3ICovCisJMHhCQywgMHhCNCwgMHhFOSwgMHhBQSwgMHhFNSwgMHhCNiwgMHhFNSwgMHhCNSwgLyogMHg4OC0weDhCICovCisJMHhFNSwgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhCNCwgLyogMHg4Qy0weDhGICovCisJMHhCQywgMHhCNSwgMHgwMCwgMHgwMCwgMHhCQywgMHhCQiwgMHhCQywgMHhCOCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhCQywgMHhCOSwgMHhFNSwgMHhBRiwgMHhFNSwgMHhCMiwgLyogMHg5NC0weDk3ICovCisJMHhFNSwgMHhCQywgMHhCQywgMHhDMSwgMHhCQywgMHhCRiwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhFNSwgMHhCMywgMHhEOSwgMHg1QSwgMHhCQywgMHhCMiwgMHhFNSwgMHhCOSwgLyogMHg5Qy0weDlGICovCisJMHhFNSwgMHhCMCwgMHgwMCwgMHgwMCwgMHhCQywgMHhDMiwgMHhFNSwgMHhCOCwgLyogMHhBMC0weEEzICovCisJMHhCQSwgMHg0RCwgMHhCQywgMHhCNywgMHhFMSwgMHhFNCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHhCQywgMHhCQSwgMHgwMCwgMHgwMCwgMHhCQywgMHhCRSwgLyogMHhBOC0weEFCICovCisJMHhCQywgMHhDMCwgMHhCQywgMHhCRCwgMHhCQywgMHhCQywgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhCQywgMHhCNiwgMHhFNSwgMHhCQiwgMHhCQywgMHhCMywgMHhCQywgMHhDMywgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCRSwgMHhEOCwgLyogMHhCOC0weEJCICovCisJMHhCRSwgMHhEOSwgMHhFOSwgMHhBOSwgMHhCRSwgMHhFMiwgMHhCRSwgMHhERiwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhCRSwgMHhENiwgMHhCRSwgMHhERCwgMHhFOSwgMHhBQiwgLyogMHhDMC0weEMzICovCisJMHhCRSwgMHhEQiwgMHhCRSwgMHhENSwgMHgwMCwgMHgwMCwgMHhCRSwgMHhEQywgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhBOCwgMHhDMCwgMHhCQiwgMHhCRSwgMHhENywgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhCRSwgMHhERSwgMHhDMCwgMHhCQSwgMHhFOSwgMHhBNywgLyogMHhDQy0weENGICovCisJMHhFOSwgMHhBNiwgMHgwMCwgMHgwMCwgMHhCRSwgMHhFMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhCRSwgMHhFMSwgMHgwMCwgMHgwMCwgMHhFOSwgMHhBNSwgMHhFOSwgMHhBNCwgLyogMHhENC0weEQ3ICovCisJMHhDMCwgMHhCQywgMHhFOSwgMHhBRSwgMHhCRSwgMHhEQSwgMHhFOSwgMHhBQywgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHhDMCwgMHhCRCwgMHgwMCwgMHgwMCwgMHhDMCwgMHhDMiwgMHhFQywgMHhFQSwgLyogMHhFMC0weEUzICovCisJMHhFQywgMHhFQywgMHgwMCwgMHgwMCwgMHhDMCwgMHhCRiwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhFQywgMHhFRCwgMHhFQywgMHhFOSwgMHgwMCwgMHgwMCwgMHhFQywgMHhFQiwgLyogMHhFOC0weEVCICovCisJMHhDMCwgMHhDMCwgMHhDMCwgMHhDMywgMHgwMCwgMHgwMCwgMHhFQywgMHhFOCwgLyogMHhFQy0weEVGICovCisJMHhDMCwgMHhCRSwgMHhDMCwgMHhDMSwgMHhDMiwgMHg1OSwgMHhFOSwgMHhBRCwgLyogMHhGMC0weEYzICovCisJMHhDMiwgMHg1OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMiwgMHg1RSwgLyogMHhGNC0weEY3ICovCisJMHhFRiwgMHhENCwgMHgwMCwgMHgwMCwgMHhDMiwgMHg1QywgMHhDMiwgMHg1RCwgLyogMHhGOC0weEZCICovCisJMHhFRiwgMHhENywgMHhFRiwgMHhEMywgMHhDMiwgMHg1QSwgMHhFRiwgMHhEMSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjVbNTEyXSA9IHsKKwkweEMzLCAweDZCLCAweEVGLCAweEQ1LCAweDAwLCAweDAwLCAweEVGLCAweEQ2LCAvKiAweDAwLTB4MDMgKi8KKwkweEVGLCAweEQyLCAweDAwLCAweDAwLCAweEMyLCAweDVCLCAweEYyLCAweDQyLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweDQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEYyLCAweDQ2LCAweEYyLCAweDQ0LCAweEYyLCAweDQ3LCAweEMzLCAweDZDLCAvKiAweDBDLTB4MEYgKi8KKwkweEYyLCAweDQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweDRFLCAvKiAweDEwLTB4MTMgKi8KKwkweEM0LCAweDY0LCAweEY0LCAweDRELCAweEY0LCAweDRDLCAweEY0LCAweDRCLCAvKiAweDE0LTB4MTcgKi8KKwkweEM0LCAweDYzLCAweEM0LCAweDY1LCAweDAwLCAweDAwLCAweEY1LCAweENELCAvKiAweDE4LTB4MUIgKi8KKwkweEM0LCAweEUyLCAweEM0LCAweEUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEY2LCAweEUxLCAweEY2LCAweEUwLCAweEY2LCAweEUzLCAweEM1LCAweENCLCAvKiAweDIwLTB4MjMgKi8KKwkweEM1LCAweDc1LCAweEY3LCAweERELCAweEY2LCAweEUyLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEY3LCAweERDLCAweEM1LCAweENELCAweEM1LCAweENDLCAvKiAweDI4LTB4MkIgKi8KKwkweEM1LCAweEYzLCAweEY4LCAweEE5LCAweEY4LCAweEVGLCAweEE0LCAweEU0LCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweDcyLCAweEU5LCAweEFGLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE2LCAweEFDLCAweENBLCAweEY3LCAvKiAweDM0LTB4MzcgKi8KKwkweEE3LCAweEYxLCAweEE3LCAweEVGLCAweDAwLCAweDAwLCAweEE3LCAweEYwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweENDLCAweEMxLCAweEE5LCAweEYxLCAweEFDLCAweDQ2LCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweENFLCAweEU3LCAweDAwLCAweDAwLCAweENFLCAweEU4LCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweEFDLCAweDQ3LCAweEQxLCAweENFLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEFFLCAweEM0LCAweEFFLCAweEM1LCAweEQxLCAweENELCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIxLCAweEQzLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweEIxLCAweENGLCAweDAwLCAweDAwLCAweEQ1LCAweEE3LCAvKiAweDUwLTB4NTMgKi8KKwkweEIxLCAweEQ2LCAweEIxLCAweEQ1LCAweEIxLCAweENFLCAweEIxLCAweEQxLCAvKiAweDU0LTB4NTcgKi8KKwkweEIxLCAweEQ0LCAweEIxLCAweEQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweEQ5LCAweDc2LCAweEIxLCAweENELCAweEI0LCAweEFGLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI0LCAweEIxLCAweEI0LCAweEIyLCAvKiAweDYwLTB4NjMgKi8KKwkweEQ5LCAweDc1LCAweEQ5LCAweDc4LCAweEI0LCAweEIwLCAweEQ5LCAweDczLCAvKiAweDY0LTB4NjcgKi8KKwkweEQ5LCAweDc3LCAweDAwLCAweDAwLCAweEQ5LCAweDc0LCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEI3LCAweDcxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweEJDLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJBLCAweDU2LCAweEUxLCAweEY0LCAvKiAweDcwLTB4NzMgKi8KKwkweEJFLCAweEUzLCAweEJDLCAweEM0LCAweEU1LCAweEJELCAweEJDLCAweEM1LCAvKiAweDc0LTB4NzcgKi8KKwkweEJDLCAweEM2LCAweEU1LCAweEJGLCAweEU1LCAweEJFLCAweEU1LCAweEMwLCAvKiAweDc4LTB4N0IgKi8KKwkweEU5LCAweEIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEIwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEVDLCAweEVGLCAweEVDLCAweEVFLCAweEMwLCAweEM0LCAweEMwLCAweEM1LCAvKiAweDgwLTB4ODMgKi8KKwkweEYyLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE0LCAweEU1LCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweEQ5LCAweDc5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweEI0LCAweEI0LCAweEI0LCAweEIzLCAweERELCAweEJELCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEVGLCAweEQ4LCAweEM0LCAweEUzLCAweEY3LCAweERFLCAweEE0LCAweEU2LCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweEFFLCAweEM2LCAweDAwLCAweDAwLCAweEIxLCAweEQ4LCAvKiAweDk4LTB4OUIgKi8KKwkweEIxLCAweEQ3LCAweEQ5LCAweDdBLCAweEQ5LCAweDdCLCAweEI3LCAweDcyLCAvKiAweDlDLTB4OUYgKi8KKwkweEUxLCAweEY1LCAweEJBLCAweDU3LCAweEU5LCAweEIyLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEE0LCAweEU3LCAweEE1LCAweEI4LCAweDAwLCAweDAwLCAweEE5LCAweEYyLCAvKiAweEE0LTB4QTcgKi8KKwkweENDLCAweEMyLCAweDAwLCAweDAwLCAweENFLCAweEU5LCAweEFDLCAweDQ4LCAvKiAweEE4LTB4QUIgKi8KKwkweEIxLCAweEQ5LCAweDAwLCAweDAwLCAweEQ5LCAweDdDLCAweEI0LCAweEI1LCAvKiAweEFDLTB4QUYgKi8KKwkweEI3LCAweDczLCAweDAwLCAweDAwLCAweEU1LCAweEMxLCAweEU1LCAweEMyLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEYwLCAweEMyLCAweDVGLCAvKiAweEI0LTB4QjcgKi8KKwkweEY4LCAweEYwLCAweEE0LCAweEU4LCAweDAwLCAweDAwLCAweENDLCAweEMzLCAvKiAweEI4LTB4QkIgKi8KKwkweEE5LCAweEYzLCAweEFDLCAweDQ5LCAweDAwLCAweDAwLCAweENFLCAweEVBLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweEFFLCAweEM3LCAweEQxLCAweEQyLCAweEQxLCAweEQwLCAvKiAweEMwLTB4QzMgKi8KKwkweEQxLCAweEQxLCAweEFFLCAweEM4LCAweEQxLCAweENGLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIxLCAweERCLCAvKiAweEM4LTB4Q0IgKi8KKwkweEIxLCAweERDLCAweEQ1LCAweEE4LCAweEIxLCAweERELCAweEIxLCAweERBLCAvKiAweENDLTB4Q0YgKi8KKwkweEQ5LCAweDdELCAweDAwLCAweDAwLCAweEQ5LCAweDdFLCAweERELCAweEJFLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJBLCAweDU5LCAweEJBLCAweDU4LCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEYxLCAweEVGLCAweEQ5LCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweDRBLCAweEYyLCAweDQ5LCAweEY0LCAweDRGLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEM5LCAweDVFLCAweEFDLCAweDRBLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweEE0LCAweEU5LCAweEE1LCAweEI5LCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEE2LCAweEFFLCAweEE2LCAweEFELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweEE2LCAweEFGLCAweEE2LCAweEIwLCAweEM5LCAweEVFLCAweEM5LCAweEVELCAvKiAweEVDLTB4RUYgKi8KKwkweENBLCAweEY4LCAweEE3LCAweEYyLCAweENBLCAweEZCLCAweENBLCAweEZBLCAvKiAweEYwLTB4RjMgKi8KKwkweENBLCAweEY5LCAweENBLCAweEZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE5LCAweEY0LCAweENDLCAweEM5LCAvKiAweEY4LTB4RkIgKi8KKwkweENDLCAweEM1LCAweENDLCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182Nls1MTJdID0geworCTB4QTksIDB4RkIsIDB4MDAsIDB4MDAsIDB4QTksIDB4RjksIDB4Q0MsIDB4Q0EsIC8qIDB4MDAtMHgwMyAqLworCTB4Q0MsIDB4QzYsIDB4Q0MsIDB4Q0QsIDB4QTksIDB4RjgsIDB4QUEsIDB4NDAsIC8qIDB4MDQtMHgwNyAqLworCTB4Q0MsIDB4QzgsIDB4Q0MsIDB4QzQsIDB4QTksIDB4RkUsIDB4Q0MsIDB4Q0IsIC8qIDB4MDgtMHgwQiAqLworCTB4QTksIDB4RjcsIDB4Q0MsIDB4Q0MsIDB4QTksIDB4RkEsIDB4QTksIDB4RkMsIC8qIDB4MEMtMHgwRiAqLworCTB4Q0MsIDB4RDAsIDB4Q0MsIDB4Q0YsIDB4Q0MsIDB4QzcsIDB4QTksIDB4RjYsIC8qIDB4MTAtMHgxMyAqLworCTB4QTksIDB4RjUsIDB4QTksIDB4RkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4Q0UsIDB4RUYsIDB4Q0UsIDB4RjUsIDB4MDAsIDB4MDAsIDB4QUMsIDB4NTAsIC8qIDB4MUMtMHgxRiAqLworCTB4QUMsIDB4NEQsIDB4Q0UsIDB4RUMsIDB4Q0UsIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4QUMsIDB4NTMsIDB4QUMsIDB4NEIsIDB4Q0UsIDB4RjAsIDB4QUMsIDB4NEUsIC8qIDB4MjQtMHgyNyAqLworCTB4QUMsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4RjMsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4QUMsIDB4NEMsIDB4Q0UsIDB4RjgsIDB4QUMsIDB4NEYsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4QUMsIDB4NTIsIDB4Q0UsIDB4RUQsIDB4Q0UsIDB4RjIsIC8qIDB4MzAtMHgzMyAqLworCTB4Q0UsIDB4RjYsIDB4Q0UsIDB4RUUsIDB4Q0UsIDB4RUIsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4RjcsIDB4Q0UsIDB4RjQsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4QUUsIDB4RDAsIDB4QUUsIDB4QzksIDB4QUUsIDB4Q0MsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4QUUsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4RDEsIDB4RDUsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4QUUsIDB4Q0EsIDB4RDEsIDB4RDMsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4QUUsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUUsIDB4Q0IsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4RDEsIDB4RDYsIDB4QUUsIDB4Q0QsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4QUMsIDB4QjEsIDB4REYsIDB4RDUsIDB4QUIsIC8qIDB4NTgtMHg1QiAqLworCTB4RDUsIDB4QUQsIDB4QjEsIDB4REUsIDB4QjEsIDB4RTMsIDB4RDEsIDB4RDQsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4QUEsIDB4RDUsIDB4QUUsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4QjEsIDB4RTAsIDB4RDUsIDB4QTksIDB4QjEsIDB4RTIsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4QjEsIDB4RTEsIDB4MDAsIDB4MDAsIDB4RDksIDB4QTcsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4RDksIDB4QTIsIDB4MDAsIDB4MDAsIDB4QjQsIDB4QjYsIDB4QjQsIDB4QkEsIC8qIDB4NkMtMHg2RiAqLworCTB4QjQsIDB4QjcsIDB4RDksIDB4QTUsIDB4RDksIDB4QTgsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4QjQsIDB4QjgsIDB4MDAsIDB4MDAsIDB4QjQsIDB4QjksIDB4QjQsIDB4QkUsIC8qIDB4NzQtMHg3NyAqLworCTB4REQsIDB4QzcsIDB4RDksIDB4QTYsIDB4QjQsIDB4QkMsIDB4RDksIDB4QTMsIC8qIDB4NzgtMHg3QiAqLworCTB4RDksIDB4QTEsIDB4MDAsIDB4MDAsIDB4QjQsIDB4QkQsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RDksIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4QjcsIDB4NzksIDB4MDAsIDB4MDAsIDB4REQsIDB4QkYsIDB4QjcsIDB4NzYsIC8qIDB4ODQtMHg4NyAqLworCTB4QjcsIDB4NzcsIDB4QjcsIDB4NzUsIDB4REQsIDB4QzQsIDB4REQsIDB4QzMsIC8qIDB4ODgtMHg4QiAqLworCTB4REQsIDB4QzAsIDB4QjcsIDB4N0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4REQsIDB4QzIsIDB4QjQsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4REQsIDB4QzYsIDB4REQsIDB4QzEsIDB4QjcsIDB4NzgsIDB4QjcsIDB4NzQsIC8qIDB4OTQtMHg5NyAqLworCTB4QjcsIDB4N0EsIDB4REQsIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4QkEsIDB4NUMsIDB4MDAsIDB4MDAsIDB4RTEsIDB4RjgsIC8qIDB4OUMtMHg5RiAqLworCTB4RTEsIDB4RjcsIDB4RTEsIDB4RjYsIDB4QkEsIDB4NUEsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4QkEsIDB4NUIsIDB4RTUsIDB4QzUsIDB4RTUsIDB4QzgsIDB4QkMsIDB4QzgsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkMsIDB4QzcsIDB4RTUsIDB4QzksIC8qIDB4QUMtMHhBRiAqLworCTB4RTUsIDB4QzQsIDB4QkMsIDB4Q0EsIDB4RTUsIDB4QzYsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4QkMsIDB4QzksIDB4RTUsIDB4QzMsIDB4MDAsIDB4MDAsIDB4RTUsIDB4QzcsIC8qIDB4QjQtMHhCNyAqLworCTB4QkUsIDB4RTksIDB4QkUsIDB4RTYsIDB4RTksIDB4QkIsIDB4RTksIDB4QkEsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4QjksIDB4RTksIDB4QjQsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4RTksIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4QkUsIDB4RTcsIDB4MDAsIDB4MDAsIDB4QkUsIDB4RTQsIDB4QkUsIDB4RTgsIC8qIDB4QzQtMHhDNyAqLworCTB4RTksIDB4QjMsIDB4QkUsIDB4RTUsIDB4RTksIDB4QjYsIDB4RTksIDB4QjcsIC8qIDB4QzgtMHhDQiAqLworCTB4RTksIDB4QkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4QjgsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4RjIsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzAsIDB4QzcsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4RUYsIDB4REMsIDB4QzAsIDB4QzYsIDB4RUYsIDB4REEsIDB4RUYsIDB4REIsIC8qIDB4RDgtMHhEQiAqLworCTB4QzIsIDB4NjAsIDB4QzMsIDB4NkUsIDB4RjIsIDB4NEIsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4QzMsIDB4NkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4NTEsIC8qIDB4RTAtMHhFMyAqLworCTB4RjQsIDB4NTIsIDB4MDAsIDB4MDAsIDB4QzQsIDB4NjYsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4RjQsIDB4NTAsIDB4QzQsIDB4RTQsIDB4MDAsIDB4MDAsIDB4RjcsIDB4REYsIC8qIDB4RTgtMHhFQiAqLworCTB4QzUsIDB4Q0UsIDB4RjgsIDB4QUEsIDB4RjgsIDB4QUIsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4QTQsIDB4RUEsIDB4MDAsIDB4MDAsIDB4QTYsIDB4QjEsIDB4QTYsIDB4QjIsIC8qIDB4RjAtMHhGMyAqLworCTB4QTcsIDB4RjMsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4RDEsIDB4QUMsIDB4NTQsIC8qIDB4RjQtMHhGNyAqLworCTB4QUUsIDB4RDEsIDB4QjEsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4QjAsIDB4RDIsIDB4MDAsIDB4MDAsIDB4QjQsIDB4QkYsIDB4QjQsIDB4QzAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzY3WzUxMl0gPSB7CisJMHhCMywgMHhDQywgMHhEOSwgMHhBOSwgMHgwMCwgMHgwMCwgMHhCNywgMHg3QywgLyogMHgwMC0weDAzICovCisJMHhFMSwgMHhGQSwgMHhFMSwgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhBNCwgMHhFQiwgMHhBNiwgMHhCMywgMHhDQywgMHhEMiwgMHhBQSwgMHg0MiwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhBQSwgMHg0MSwgMHgwMCwgMHgwMCwgMHhDRSwgMHhGOSwgLyogMHgwQy0weDBGICovCisJMHhDRSwgMHhGQSwgMHgwMCwgMHgwMCwgMHhEMSwgMHhENywgMHhEMSwgMHhEOCwgLyogMHgxMC0weDEzICovCisJMHhBRSwgMHhEMiwgMHhBRSwgMHhEMywgMHgwMCwgMHgwMCwgMHhBRSwgMHhENCwgLyogMHgxNC0weDE3ICovCisJMHhENSwgMHhBRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMSwgMHhFNiwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhCNCwgMHhDMiwgMHgwMCwgMHgwMCwgMHhCNCwgMHhDMSwgLyogMHgxQy0weDFGICovCisJMHhERCwgMHhDOCwgMHhERiwgMHg3QSwgMHhFMSwgMHhGQiwgMHhFOSwgMHhCRCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMiwgMHg2MSwgMHhDNCwgMHg2NywgLyogMHgyNC0weDI3ICovCisJMHhBNCwgMHhFQywgMHgwMCwgMHgwMCwgMHhBNSwgMHhCQywgMHhBNSwgMHhCRCwgLyogMHgyOC0weDJCICovCisJMHhBNSwgMHhCQiwgMHhBNSwgMHhCRSwgMHhBNSwgMHhCQSwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHhBNiwgMHhCNiwgMHgwMCwgMHgwMCwgMHhDOSwgMHhGNiwgLyogMHgzMC0weDMzICovCisJMHhBNiwgMHhCNSwgMHhBNiwgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhDOSwgMHhGMSwgMHhDOSwgMHhGMCwgMHhDOSwgMHhGMywgMHhDOSwgMHhGMiwgLyogMHgzOC0weDNCICovCisJMHhDOSwgMHhGNSwgMHhBNiwgMHhCNCwgMHhDOSwgMHhFRiwgMHhDOSwgMHhGNCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhDQSwgMHhGRCwgMHhBNywgMHhGRCwgMHhDQSwgMHhGRSwgLyogMHg0NC0weDQ3ICovCisJMHhDQiwgMHg0MywgMHhBNywgMHhGQywgMHgwMCwgMHgwMCwgMHhDQiwgMHg0NywgLyogMHg0OC0weDRCICovCisJMHhDQiwgMHg0MiwgMHhDQiwgMHg0NSwgMHhBNywgMHhGNSwgMHhBNywgMHhGNiwgLyogMHg0Qy0weDRGICovCisJMHhBNywgMHhGNywgMHhBNywgMHhGOCwgMHgwMCwgMHgwMCwgMHhBOCwgMHg0MCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhDQiwgMHg0MSwgMHhBNywgMHhGQSwgMHhBOCwgMHg0MSwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhDQiwgMHg0MCwgMHhDQiwgMHg0NiwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHhBNywgMHhGOSwgMHhDQiwgMHg0NCwgMHhBNywgMHhGQiwgMHhBNywgMHhGNCwgLyogMHg1Qy0weDVGICovCisJMHhBNywgMHhGRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQSwgMHg1NywgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhDQywgMHhENCwgMHhBQSwgMHg0MywgMHgwMCwgMHgwMCwgMHhBQSwgMHg0RCwgLyogMHg2Qy0weDZGICovCisJMHhBQSwgMHg0RSwgMHhBQSwgMHg0NiwgMHhBQSwgMHg1OCwgMHhBQSwgMHg0OCwgLyogMHg3MC0weDczICovCisJMHhDQywgMHhEQywgMHhBQSwgMHg1MywgMHhDQywgMHhENywgMHhBQSwgMHg0OSwgLyogMHg3NC0weDc3ICovCisJMHhDQywgMHhFNiwgMHhDQywgMHhFNywgMHhDQywgMHhERiwgMHhDQywgMHhEOCwgLyogMHg3OC0weDdCICovCisJMHhBQSwgMHg1NiwgMHhDQywgMHhFNCwgMHhBQSwgMHg1MSwgMHhBQSwgMHg0RiwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhDQywgMHhFNSwgMHgwMCwgMHgwMCwgMHhDQywgMHhFMywgLyogMHg4MC0weDgzICovCisJMHhDQywgMHhEQiwgMHhDQywgMHhEMywgMHhDQywgMHhEQSwgMHhBQSwgMHg0QSwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhBQSwgMHg1MCwgMHgwMCwgMHgwMCwgMHhBQSwgMHg0NCwgLyogMHg4OC0weDhCICovCisJMHhDQywgMHhERSwgMHhDQywgMHhERCwgMHhDQywgMHhENSwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhBQSwgMHg1MiwgMHhDQywgMHhFMSwgMHhDQywgMHhENiwgMHhBQSwgMHg1NSwgLyogMHg5MC0weDkzICovCisJMHhDQywgMHhFOCwgMHhBQSwgMHg0NSwgMHgwMCwgMHgwMCwgMHhBQSwgMHg0QywgLyogMHg5NC0weDk3ICovCisJMHhDQywgMHhEOSwgMHhDQywgMHhFMiwgMHhBQSwgMHg1NCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhBQSwgMHg0NywgMHhBQSwgMHg0QiwgMHgwMCwgMHgwMCwgMHhDQywgMHhFMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRiwgMHg1QiwgMHhBQywgMHg1QywgLyogMHhBQy0weEFGICovCisJMHhBQywgMHg2OSwgMHgwMCwgMHgwMCwgMHhDRiwgMHg1NiwgMHhDRiwgMHg0QywgLyogMHhCMC0weEIzICovCisJMHhBQywgMHg2MiwgMHhDRiwgMHg0QSwgMHhBQywgMHg1QiwgMHhDRiwgMHg0NSwgLyogMHhCNC0weEI3ICovCisJMHhBQywgMHg2NSwgMHhDRiwgMHg1MiwgMHhDRSwgMHhGRSwgMHhDRiwgMHg0MSwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhDRiwgMHg0NCwgMHhDRSwgMHhGQiwgMHhDRiwgMHg1MSwgMHhDRiwgMHg2MSwgLyogMHhDMC0weEMzICovCisJMHhBQywgMHg2MCwgMHhDRiwgMHg0NiwgMHhDRiwgMHg1OCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHhDRSwgMHhGRCwgMHhDRiwgMHg1RiwgMHhDRiwgMHg2MCwgMHhDRiwgMHg2MywgLyogMHhDOC0weENCICovCisJMHhDRiwgMHg1QSwgMHhDRiwgMHg0QiwgMHhDRiwgMHg1MywgMHhBQywgMHg2NiwgLyogMHhDQy0weENGICovCisJMHhBQywgMHg1OSwgMHhBQywgMHg2MSwgMHhBQywgMHg2RCwgMHhBQywgMHg1NiwgLyogMHhEMC0weEQzICovCisJMHhBQywgMHg1OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhDRiwgMHg0MywgMHhBQywgMHg2QSwgMHhBQywgMHg2MywgMHhDRiwgMHg1RCwgLyogMHhEOC0weERCICovCisJMHhDRiwgMHg0MCwgMHhBQywgMHg2QywgMHhBQywgMHg2NywgMHhDRiwgMHg0OSwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQywgMHg2QiwgMHhDRiwgMHg1MCwgLyogMHhFMC0weEUzICovCisJMHhDRiwgMHg0OCwgMHhBQywgMHg2NCwgMHhDRiwgMHg1QywgMHhDRiwgMHg1NCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhBQywgMHg1RSwgMHhDRiwgMHg2MiwgMHhDRiwgMHg0NywgLyogMHhFOC0weEVCICovCisJMHhBQywgMHg1QSwgMHhDRiwgMHg1OSwgMHhDRiwgMHg0RiwgMHhBQywgMHg1RiwgLyogMHhFQy0weEVGICovCisJMHhDRiwgMHg1NSwgMHhBQywgMHg1NywgMHhDRSwgMHhGQywgMHhBQywgMHg2OCwgLyogMHhGMC0weEYzICovCisJMHhBRSwgMHhFMywgMHhBQywgMHg1RCwgMHhDRiwgMHg0RSwgMHhDRiwgMHg0RCwgLyogMHhGNC0weEY3ICovCisJMHhDRiwgMHg0MiwgMHgwMCwgMHgwMCwgMHhDRiwgMHg1RSwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHhDRiwgMHg1NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQywgMHg1NSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjhbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQxLCAweEVDLCAweEFFLCAweEVBLCAvKiAweDEwLTB4MTMgKi8KKwkweEQxLCAweEVELCAweDAwLCAweDAwLCAweEQxLCAweEUxLCAweEFFLCAweERGLCAvKiAweDE0LTB4MTcgKi8KKwkweEFFLCAweEVCLCAweDAwLCAweDAwLCAweEQxLCAweERBLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweEQxLCAweEUzLCAweEQxLCAweEVCLCAweDAwLCAweDAwLCAweEQxLCAweEQ5LCAvKiAweDFDLTB4MUYgKi8KKwkweEQxLCAweEY0LCAweEFFLCAweEQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEQxLCAweEYzLCAweEQxLCAweEVFLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweEQxLCAweEVGLCAweEFFLCAweERELCAweEFFLCAweEU4LCAweEQxLCAweEU1LCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweEQxLCAweEU2LCAweEQxLCAweEYwLCAweEQxLCAweEU3LCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEQxLCAweEUyLCAweEQxLCAweERDLCAweEQxLCAweERELCAvKiAweDMwLTB4MzMgKi8KKwkweEQxLCAweEVBLCAweEQxLCAweEU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEFFLCAweEQ2LCAweEFFLCAweERBLCAweEQxLCAweEYyLCAweEQxLCAweERFLCAvKiAweDM4LTB4M0IgKi8KKwkweEFFLCAweEU2LCAweEFFLCAweEUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweEFFLCAweEU1LCAweEFFLCAweEVDLCAweEFFLCAweERCLCAweEFFLCAweEU3LCAvKiAweDQwLTB4NDMgKi8KKwkweEQxLCAweEU5LCAweEFFLCAweEU5LCAweEFFLCAweEQ4LCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEFFLCAweEQ3LCAweEQxLCAweERCLCAweDAwLCAweDAwLCAweEQxLCAweERGLCAvKiAweDQ4LTB4NEIgKi8KKwkweEFFLCAweEUwLCAweEQxLCAweEYxLCAweEQxLCAweEU4LCAweEQxLCAweEUwLCAvKiAweDRDLTB4NEYgKi8KKwkweEFFLCAweEU0LCAweEFFLCAweEUxLCAweDAwLCAweDAwLCAweEFFLCAweEQ5LCAvKiAweDUwLTB4NTMgKi8KKwkweEFFLCAweERDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEM0LCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEQ1LCAweEI0LCAweEQ1LCAweEI1LCAweEQ1LCAweEI5LCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweEQ1LCAweEM4LCAweEQ1LCAweEM1LCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEQ1LCAweEJFLCAweEQ1LCAweEJELCAweEIxLCAweEVELCAweEQ1LCAweEMxLCAvKiAweDc0LTB4NzcgKi8KKwkweEQ1LCAweEQwLCAweEQ1LCAweEIwLCAweDAwLCAweDAwLCAweEQ1LCAweEQxLCAvKiAweDc4LTB4N0IgKi8KKwkweEQ1LCAweEMzLCAweEQ1LCAweEQ1LCAweEQ1LCAweEM5LCAweEIxLCAweEVDLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEQ1LCAweEM3LCAweEIxLCAweEU3LCAweEIxLCAweEZDLCAweEIxLCAweEYyLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweEIxLCAweEY2LCAweEIxLCAweEY1LCAweEQ1LCAweEIxLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEQ1LCAweENFLCAweEQ1LCAweEQ0LCAweEQ1LCAweENDLCAvKiAweDg4LTB4OEIgKi8KKwkweEQ1LCAweEQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEMwLCAvKiAweDhDLTB4OEYgKi8KKwkweEQ1LCAweEIyLCAweEQ1LCAweEQyLCAweEQ1LCAweEMyLCAweEIxLCAweEVBLCAvKiAweDkwLTB4OTMgKi8KKwkweEIxLCAweEY3LCAweDAwLCAweDAwLCAweEQ1LCAweENCLCAweEIxLCAweEYwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweENBLCAvKiAweDk4LTB4OUIgKi8KKwkweEQ1LCAweEIzLCAweEIxLCAweEY4LCAweDAwLCAweDAwLCAweEIxLCAweEZBLCAvKiAweDlDLTB4OUYgKi8KKwkweEQ1LCAweENELCAweEIxLCAweEZCLCAweEIxLCAweEU5LCAweEQ1LCAweEJBLCAvKiAweEEwLTB4QTMgKi8KKwkweEQ1LCAweENGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIxLCAweEVGLCAvKiAweEE0LTB4QTcgKi8KKwkweEIxLCAweEY5LCAweEQ1LCAweEJDLCAweEQ1LCAweEM2LCAweEQ1LCAweEI3LCAvKiAweEE4LTB4QUIgKi8KKwkweEQ1LCAweEJCLCAweEIxLCAweEY0LCAweEQ1LCAweEI2LCAweEIxLCAweEU4LCAvKiAweEFDLTB4QUYgKi8KKwkweEIxLCAweEYxLCAweEIxLCAweEVFLCAweEQ1LCAweEJGLCAweEFFLCAweERFLCAvKiAweEIwLTB4QjMgKi8KKwkweEQ5LCAweEMwLCAweEIxLCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEIxLCAweEYzLCAweDAwLCAweDAwLCAweEQ5LCAweEMzLCAweEQ5LCAweEQ5LCAvKiAweEM0LTB4QzcgKi8KKwkweEQ5LCAweENFLCAweEI0LCAweEQ2LCAweDAwLCAweDAwLCAweEI0LCAweEQxLCAvKiAweEM4LTB4Q0IgKi8KKwkweEQ5LCAweEJELCAweEI0LCAweEQyLCAweEQ5LCAweENELCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweEQ5LCAweEM2LCAweEQ5LCAweEQzLCAweEI0LCAweENFLCAweEQ5LCAweEFCLCAvKiAweEQwLTB4RDMgKi8KKwkweEQ5LCAweEQ1LCAweEI0LCAweEM0LCAweEQ5LCAweEIzLCAweEI0LCAweEM3LCAvKiAweEQ0LTB4RDcgKi8KKwkweEI0LCAweEM2LCAweDAwLCAweDAwLCAweEI0LCAweEQ3LCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweEQ5LCAweEFELCAweEQ5LCAweENGLCAweEQ5LCAweEQwLCAweEI0LCAweEM5LCAvKiAweERDLTB4REYgKi8KKwkweEI0LCAweEM1LCAweEQ5LCAweEJCLCAweDAwLCAweDAwLCAweEI0LCAweEQwLCAvKiAweEUwLTB4RTMgKi8KKwkweEQ5LCAweEI2LCAweDAwLCAweDAwLCAweEQ5LCAweEQxLCAweEI0LCAweENDLCAvKiAweEU0LTB4RTcgKi8KKwkweEQ5LCAweEM5LCAweEQ5LCAweEQ2LCAweEQ5LCAweEIwLCAweEQ5LCAweEI1LCAvKiAweEU4LTB4RUIgKi8KKwkweEQ5LCAweEFGLCAweDAwLCAweDAwLCAweEI0LCAweENCLCAweEQ5LCAweEMyLCAvKiAweEVDLTB4RUYgKi8KKwkweERELCAweERFLCAweEQ5LCAweEIxLCAweEI0LCAweENGLCAweEQ5LCAweEJBLCAvKiAweEYwLTB4RjMgKi8KKwkweEQ5LCAweEQyLCAweEI0LCAweENBLCAweEQ5LCAweEI3LCAweEQ5LCAweEI0LCAvKiAweEY0LTB4RjcgKi8KKwkweEQ5LCAweEM1LCAweEI0LCAweENELCAweEI0LCAweEMzLCAweEI0LCAweEQ5LCAvKiAweEY4LTB4RkIgKi8KKwkweEQ5LCAweEM4LCAweEQ5LCAweEM3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182OVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RDksIDB4QUMsIDB4QjQsIDB4QzgsIDB4RDksIDB4RDQsIDB4RDksIDB4QkMsIC8qIDB4MDQtMHgwNyAqLworCTB4RDksIDB4QkUsIDB4MDAsIDB4MDAsIDB4RDksIDB4Q0IsIDB4RDksIDB4Q0EsIC8qIDB4MDgtMHgwQiAqLworCTB4RDksIDB4QUEsIDB4QjQsIDB4RDMsIDB4QjQsIDB4RDUsIDB4RDksIDB4QjIsIC8qIDB4MEMtMHgwRiAqLworCTB4RDksIDB4QjksIDB4RDksIDB4QzEsIDB4QjQsIDB4RDQsIDB4RDksIDB4QjgsIC8qIDB4MTAtMHgxMyAqLworCTB4RDksIDB4QzQsIDB4RDksIDB4RDcsIDB4MDAsIDB4MDAsIDB4RDksIDB4Q0MsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4RDksIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4QUUsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4RjIsIC8qIDB4MkMtMHgyRiAqLworCTB4QjcsIDB4QTYsIDB4MDAsIDB4MDAsIDB4REQsIDB4RjAsIDB4REQsIDB4REIsIC8qIDB4MzAtMHgzMyAqLworCTB4REQsIDB4RTAsIDB4REQsIDB4RDksIDB4MDAsIDB4MDAsIDB4REQsIDB4RUMsIC8qIDB4MzQtMHgzNyAqLworCTB4REQsIDB4Q0IsIDB4REQsIDB4RDIsIDB4MDAsIDB4MDAsIDB4REQsIDB4RUEsIC8qIDB4MzgtMHgzQiAqLworCTB4REQsIDB4RjQsIDB4REQsIDB4REMsIDB4MDAsIDB4MDAsIDB4REQsIDB4Q0YsIC8qIDB4M0MtMHgzRiAqLworCTB4REQsIDB4RTIsIDB4REQsIDB4RTcsIDB4REQsIDB4RDMsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4REQsIDB4RTQsIDB4REQsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4REQsIDB4RDcsIDB4REQsIDB4RDgsIDB4QjcsIDB4QTgsIDB4REQsIDB4RUIsIC8qIDB4NDgtMHg0QiAqLworCTB4REQsIDB4RTksIDB4MDAsIDB4MDAsIDB4REQsIDB4Q0MsIDB4REQsIDB4RUUsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4REQsIDB4RUYsIDB4REQsIDB4RjEsIDB4QjcsIDB4QUMsIC8qIDB4NTAtMHg1MyAqLworCTB4QjcsIDB4QTQsIDB4MDAsIDB4MDAsIDB4RDUsIDB4QjgsIDB4REQsIDB4RDQsIC8qIDB4NTQtMHg1NyAqLworCTB4REQsIDB4RTYsIDB4REQsIDB4RDUsIDB4QjcsIDB4QTEsIDB4QjcsIDB4QjEsIC8qIDB4NTgtMHg1QiAqLworCTB4REQsIDB4RUQsIDB4QjcsIDB4QUYsIDB4QjcsIDB4QUIsIDB4REQsIDB4Q0EsIC8qIDB4NUMtMHg1RiAqLworCTB4QjcsIDB4QTMsIDB4MDAsIDB4MDAsIDB4REQsIDB4Q0QsIDB4QjcsIDB4QjAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4REQsIDB4REQsIDB4REQsIDB4QzksIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4QjcsIDB4QTksIDB4REQsIDB4RTEsIDB4REQsIDB4RDEsIDB4QjcsIDB4QUEsIC8qIDB4NjgtMHg2QiAqLworCTB4REQsIDB4REEsIDB4QjcsIDB4N0UsIDB4QjQsIDB4RDgsIDB4REQsIDB4RTMsIC8qIDB4NkMtMHg2RiAqLworCTB4RDksIDB4QkYsIDB4REQsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4REQsIDB4RTgsIDB4QjcsIDB4QTUsIDB4REQsIDB4RTUsIDB4QjcsIDB4QTIsIC8qIDB4NzQtMHg3NyAqLworCTB4REQsIDB4REYsIDB4QjcsIDB4QUQsIDB4REQsIDB4RDYsIDB4REQsIDB4RjMsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjcsIDB4QTcsIDB4REUsIDB4QzYsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjcsIDB4QUUsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NEEsIDB4RTIsIDB4NDgsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4RTIsIDB4NUUsIDB4RTIsIDB4NDYsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NTgsIC8qIDB4OTAtMHg5MyAqLworCTB4QjcsIDB4N0QsIDB4QkEsIDB4NUYsIDB4RTIsIDB4NDIsIDB4RTIsIDB4NUQsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NDcsIDB4RTIsIDB4NTUsIDB4QkEsIDB4NjQsIC8qIDB4OTgtMHg5QiAqLworCTB4QkEsIDB4NUQsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NUIsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4RTIsIDB4NDAsIDB4RTIsIDB4NUEsIDB4MDAsIDB4MDAsIDB4QkEsIDB4NkYsIC8qIDB4QTAtMHhBMyAqLworCTB4RTIsIDB4NTEsIDB4RTIsIDB4NjEsIDB4QkEsIDB4NkQsIDB4RTIsIDB4NDksIC8qIDB4QTQtMHhBNyAqLworCTB4QkEsIDB4NUUsIDB4RTIsIDB4NEIsIDB4RTIsIDB4NTksIDB4QkEsIDB4NjcsIC8qIDB4QTgtMHhBQiAqLworCTB4RTIsIDB4NDQsIDB4QkEsIDB4NkIsIDB4QkEsIDB4NjEsIDB4RTIsIDB4NEQsIC8qIDB4QUMtMHhBRiAqLworCTB4RTIsIDB4NDMsIDB4RTEsIDB4RkMsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NTcsIC8qIDB4QjAtMHhCMyAqLworCTB4QkEsIDB4NjgsIDB4RTIsIDB4NjAsIDB4RTEsIDB4RkQsIDB4QkEsIDB4NjUsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NTMsIDB4MDAsIDB4MDAsIDB4QkEsIDB4NjYsIC8qIDB4QjgtMHhCQiAqLworCTB4RTIsIDB4NDUsIDB4RTIsIDB4NTAsIDB4RTIsIDB4NEMsIDB4RTIsIDB4NEUsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4QkEsIDB4NjAsIDB4RTIsIDB4NUYsIDB4QkEsIDB4NkUsIC8qIDB4QzAtMHhDMyAqLworCTB4RTIsIDB4NEYsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NjIsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4RkUsIDB4RTIsIDB4NTQsIDB4QkEsIDB4NjMsIC8qIDB4QzgtMHhDQiAqLworCTB4QkEsIDB4NkMsIDB4QkEsIDB4NkEsIDB4RTIsIDB4NDEsIDB4RTIsIDB4NTYsIC8qIDB4Q0MtMHhDRiAqLworCTB4QkEsIDB4NjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkEsIDB4NjIsIC8qIDB4RDAtMHhEMyAqLworCTB4RTIsIDB4NTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RDUsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4RTUsIDB4RDEsIDB4RTUsIDB4Q0QsIDB4RTUsIDB4RTEsIDB4RTUsIDB4REUsIC8qIDB4RTQtMHhFNyAqLworCTB4QkMsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RTUsIC8qIDB4RTgtMHhFQiAqLworCTB4RTUsIDB4RDQsIDB4QkMsIDB4RDgsIDB4RTUsIDB4REIsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4RDAsIDB4RTUsIDB4REEsIDB4QkMsIDB4RDUsIC8qIDB4RjAtMHhGMyAqLworCTB4RTUsIDB4RUUsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RUIsIDB4RTUsIDB4REQsIC8qIDB4RjQtMHhGNyAqLworCTB4RTUsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RTIsIC8qIDB4RjgtMHhGQiAqLworCTB4RTUsIDB4RTQsIDB4QkMsIDB4RDEsIDB4RTUsIDB4RDgsIDB4RTUsIDB4RDMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzZBWzUxMl0gPSB7CisJMHhFNSwgMHhDQSwgMHhCQywgMHhDRSwgMHhCQywgMHhENiwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhFNSwgMHhFNywgMHhCQywgMHhENywgMHhFNSwgMHhDQiwgMHhFNSwgMHhFRCwgLyogMHgwNC0weDA3ICovCisJMHhFNSwgMHhFMCwgMHhFNSwgMHhFNiwgMHhCQywgMHhENCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHhFMywgMHgwMCwgMHgwMCwgMHhFNSwgMHhFQSwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhCQywgMHhEOSwgMHgwMCwgMHgwMCwgMHhCQywgMHhEMywgLyogMHgxMC0weDEzICovCisJMHhFNSwgMHhEQywgMHhFNSwgMHhDRiwgMHhFNSwgMHhFRiwgMHhFNSwgMHhDQywgLyogMHgxNC0weDE3ICovCisJMHhFNSwgMHhFOCwgMHhCQywgMHhEMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhENiwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHhENywgMHhCQywgMHhDRiwgMHhCQywgMHhDQywgLyogMHgxQy0weDFGICovCisJMHhFNSwgMHhEMiwgMHhCQywgMHhEMiwgMHgwMCwgMHgwMCwgMHhCQywgMHhDQiwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHhFOSwgMHhFNSwgMHhFQywgMHhFNSwgMHhEOSwgLyogMHgyNC0weDI3ICovCisJMHhFOSwgMHhDQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhDMiwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhFOSwgMHhCRSwgMHhCRSwgMHhGNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhCRSwgMHhFQiwgMHhCRSwgMHhGMCwgMHhCRSwgMHhFQywgMHhFOSwgMHhDQywgLyogMHgzOC0weDNCICovCisJMHhFOSwgMHhENywgMHhCRSwgMHhFQSwgMHhFOSwgMHhDNCwgMHhFOSwgMHhDRCwgLyogMHgzQy0weDNGICovCisJMHhFNSwgMHhERiwgMHhFOSwgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhCRSwgMHhGMSwgMHgwMCwgMHgwMCwgMHhFOSwgMHhERCwgMHhCRSwgMHhGNSwgLyogMHg0NC0weDQ3ICovCisJMHhCRSwgMHhGOCwgMHhFOSwgMHhDMCwgMHgwMCwgMHgwMCwgMHhCRSwgMHhGNCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhEQiwgMHhFOSwgMHhEQywgMHhFOSwgMHhEMiwgLyogMHg0Qy0weDRGICovCisJMHhFOSwgMHhEMSwgMHhFOSwgMHhDOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhFOSwgMHhEMywgMHhFOSwgMHhEQSwgMHhFOSwgMHhEOSwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhCRSwgMHhFRiwgMHhCRSwgMHhFRCwgMHhFOSwgMHhDQiwgMHhFOSwgMHhDOCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhDNSwgMHhFOSwgMHhEOCwgMHhCRSwgMHhGNywgLyogMHg1Qy0weDVGICovCisJMHhFOSwgMHhENiwgMHhCRSwgMHhGMywgMHhCRSwgMHhGMiwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhFOSwgMHhEMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhCRiwgMHhFOSwgMHhDMSwgLyogMHg2NC0weDY3ICovCisJMHhFOSwgMHhDMywgMHhFOSwgMHhENSwgMHhFOSwgMHhDRiwgMHhCRSwgMHhFRSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhDNiwgMHgwMCwgMHgwMCwgMHhFOSwgMHhENCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhDNywgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMCwgMHhDRiwgMHhFRCwgMHg0NSwgLyogMHg3Qy0weDdGICovCisJCisJMHhDMCwgMHhDOCwgMHhFQywgMHhGNSwgMHgwMCwgMHgwMCwgMHhFRCwgMHg0MSwgLyogMHg4MC0weDgzICovCisJMHhDMCwgMHhDQSwgMHhFRCwgMHg0OCwgMHgwMCwgMHgwMCwgMHhFQywgMHhGQywgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhFQywgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHhFRCwgMHg0OSwgMHhFQywgMHhGMywgMHhFQywgMHhGRSwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhDMCwgMHhEMSwgMHhFRCwgMHg0NCwgMHhFRCwgMHg0QSwgMHhFQywgMHhGRCwgLyogMHg5MC0weDkzICovCisJMHhDMCwgMHhDOSwgMHhFRCwgMHg0MCwgMHhFQywgMHhGNCwgMHhDMCwgMHhEMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHg0NywgMHhFQywgMHhGOSwgLyogMHg5OC0weDlCICovCisJMHhDMCwgMHhDQywgMHgwMCwgMHgwMCwgMHhFQywgMHhGQiwgMHhFQywgMHhGOCwgLyogMHg5Qy0weDlGICovCisJMHhDMCwgMHhEMiwgMHhFQywgMHhGQSwgMHhDMCwgMHhDQiwgMHhDMCwgMHhDRSwgLyogMHhBMC0weEEzICovCisJMHhFRCwgMHg0MywgMHhFQywgMHhGNiwgMHhFRCwgMHg0NiwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhFRCwgMHg0MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhDMiwgMHg2MywgMHhFRiwgMHhFNywgMHhDMiwgMHg2OCwgMHhDMiwgMHg2OSwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMiwgMHg2MiwgLyogMHhCMC0weEIzICovCisJMHhFRiwgMHhFNiwgMHgwMCwgMHgwMCwgMHhFRiwgMHhFMywgMHhFRiwgMHhFNCwgLyogMHhCNC0weEI3ICovCisJMHhDMiwgMHg2NiwgMHhFRiwgMHhERSwgMHhFRiwgMHhFMiwgMHhDMiwgMHg2NSwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhFRiwgMHhERiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMiwgMHg2NywgMHhDMiwgMHg2NCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhFRiwgMHhERCwgMHhFRiwgMHhFMSwgMHhFRiwgMHhFNSwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHg1MSwgLyogMHhDOC0weENCICovCisJMHhGMiwgMHg0RSwgMHhGMiwgMHg1NywgMHgwMCwgMHgwMCwgMHhGMiwgMHg1NiwgLyogMHhDQy0weENGICovCisJMHhGMiwgMHg1NCwgMHhGMiwgMHg0RiwgMHgwMCwgMHgwMCwgMHhDMywgMHg3MiwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHhGMiwgMHg1MCwgMHhDMywgMHg3MSwgMHhDMCwgMHhDRCwgLyogMHhEOC0weERCICovCisJMHhGMiwgMHg1MywgMHhDMywgMHg3MCwgMHhGMiwgMHg1OCwgMHhGMiwgMHg1MiwgLyogMHhEQy0weERGICovCisJMHhGMiwgMHg0RCwgMHhFRiwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhDMywgMHg2RiwgMHgwMCwgMHgwMCwgMHhGMiwgMHg0QywgLyogMHhFNC0weEU3ICovCisJMHhGNCwgMHg1NiwgMHgwMCwgMHgwMCwgMHhGNCwgMHg1NSwgMHhGMiwgMHg1NSwgLyogMHhFOC0weEVCICovCisJMHhDNCwgMHg2OCwgMHgwMCwgMHgwMCwgMHhGNCwgMHg1OSwgMHhGNCwgMHg1QSwgLyogMHhFQy0weEVGICovCisJMHhGNCwgMHg1NCwgMHhGNCwgMHg1OCwgMHgwMCwgMHgwMCwgMHhGNCwgMHg1MywgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHhGNSwgMHhEMSwgMHhGNCwgMHg1NywgMHhDNCwgMHhFNywgMHhDNCwgMHhFNSwgLyogMHhGOC0weEZCICovCisJMHhGNSwgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNkJbNTEyXSA9IHsKKwkweEY1LCAweEQyLCAweDAwLCAweDAwLCAweEY1LCAweENFLCAweEY1LCAweEQwLCAvKiAweDAwLTB4MDMgKi8KKwkweEM0LCAweEU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEY2LCAweEU1LCAweEY2LCAweEU2LCAweEM1LCAweDc2LCAweEY2LCAweEU0LCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY3LCAweEUyLCAvKiAweDBDLTB4MEYgKi8KKwkweEM1LCAweENGLCAweEY3LCAweEUwLCAweEY3LCAweEUxLCAweEY4LCAweEFDLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM2LCAweDU2LCAweEY4LCAweEYzLCAvKiAweDE0LTB4MTcgKi8KKwkweEY4LCAweEYxLCAweEY4LCAweEYyLCAweEY4LCAweEY0LCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LCAweEJCLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEE0LCAweEVELCAweEE2LCAweEI4LCAweDAwLCAweDAwLCAweEFBLCAweDU5LCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweENDLCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweENGLCAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweEQxLCAweEY1LCAweEQxLCAweEY3LCAweDAwLCAweDAwLCAweEQxLCAweEY2LCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEQxLCAweEY4LCAweEIxLCAweEZELCAweEQ1LCAweEQ3LCAvKiAweDMwLTB4MzMgKi8KKwkweEQxLCAweEY5LCAweDAwLCAweDAwLCAweEQ1LCAweEQ2LCAweEQ1LCAweEQ4LCAvKiAweDM0LTB4MzcgKi8KKwkweEQ1LCAweEQ5LCAweEQ5LCAweERBLCAweEI0LCAweERCLCAweEQ5LCAweERCLCAvKiAweDM4LTB4M0IgKi8KKwkweEQ5LCAweERELCAweEI0LCAweERDLCAweEI0LCAweERBLCAweEQ5LCAweERDLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweERELCAweEZBLCAweERELCAweEY4LCAweERELCAweEY3LCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweERELCAweEY2LCAweERELCAweEY1LCAweEI3LCAweEIyLCAvKiAweDQ0LTB4NDcgKi8KKwkweERELCAweEY5LCAweEJBLCAweDcwLCAweEUyLCAweDYzLCAweEUyLCAweDY1LCAvKiAweDQ4LTB4NEIgKi8KKwkweEJBLCAweDcxLCAweEUyLCAweDY0LCAweEJDLCAweERCLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEJDLCAweERBLCAweEU1LCAweEYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweEU5LCAweERGLCAweEU5LCAweERFLCAweEU5LCAweEUwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEJFLCAweEY5LCAweDAwLCAweDAwLCAweEVELCAweDRCLCAvKiAweDU4LTB4NUIgKi8KKwkweEMwLCAweEQzLCAweDAwLCAweDAwLCAweEVGLCAweEU4LCAweEMyLCAweDZBLCAvKiAweDVDLTB4NUYgKi8KKwkweEYyLCAweDU5LCAweEM1LCAweDc3LCAweEE0LCAweEVFLCAweEE1LCAweEJGLCAvKiAweDYwLTB4NjMgKi8KKwkweEE2LCAweEI5LCAweEE4LCAweDQyLCAweEFBLCAweDVBLCAweEFBLCAweDVCLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFDLCAweDZFLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEQxLCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI3LCAweEIzLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEQxLCAweEJFLCAweEZBLCAvKiAweDc0LTB4NzcgKi8KKwkweEMyLCAweDZCLCAweEE0LCAweEVGLCAweDAwLCAweDAwLCAweEE2LCAweEJBLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweEVCLCAweEFBLCAweDVDLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweENDLCAweEVBLCAweDAwLCAweDAwLCAweENGLCAweDY1LCAweEFDLCAweDZGLCAvKiAweDgwLTB4ODMgKi8KKwkweENGLCAweDY2LCAweDAwLCAweDAwLCAweEFDLCAweDcwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweEQxLCAweEZDLCAweEFFLCAweEVFLCAweEFFLCAweEVELCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweEQ1LCAweERFLCAweEQ1LCAweERDLCAweEQ1LCAweERELCAweEQ1LCAweERCLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEQ1LCAweERBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEQ5LCAweERFLCAweEQ5LCAweEUxLCAweEI0LCAweERFLCAweEQ5LCAweERGLCAvKiAweDk0LTB4OTcgKi8KKwkweEI0LCAweERELCAweEQ5LCAweEUwLCAweDAwLCAweDAwLCAweERELCAweEZCLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweDY2LCAweEUyLCAweDY3LCAvKiAweDlDLTB4OUYgKi8KKwkweEUyLCAweDY4LCAweDAwLCAweDAwLCAweEU1LCAweEYzLCAweEU1LCAweEYyLCAvKiAweEEwLTB4QTMgKi8KKwkweEJDLCAweERDLCAweEU1LCAweEYxLCAweEU1LCAweEY0LCAweEU5LCAweEUxLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEUyLCAweEU5LCAweEUzLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweEVELCAweDRDLCAweEMwLCAweEQ0LCAweEMyLCAweDZDLCAvKiAweEFDLTB4QUYgKi8KKwkweEYyLCAweDVBLCAweDAwLCAweDAwLCAweEM0LCAweEU4LCAweEM5LCAweDVGLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEFDLCAweDcxLCAweENGLCAweDY3LCAweEFFLCAweEVGLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIxLCAweEZFLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweEI0LCAweERGLCAweEQ5LCAweEUyLCAweDAwLCAweDAwLCAweEI3LCAweEI1LCAvKiAweEJDLTB4QkYgKi8KKwkweEI3LCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweDY5LCAvKiAweEMwLTB4QzMgKi8KKwkweEUyLCAweDZBLCAweEJDLCAweERELCAweEJDLCAweERFLCAweEU5LCAweEU1LCAvKiAweEM0LTB4QzcgKi8KKwkweEU5LCAweEU0LCAweEVGLCAweEU5LCAweEY3LCAweEUzLCAweEE0LCAweEYwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEM5LCAweDYwLCAweEE1LCAweEMwLCAweDAwLCAweDAwLCAweEE4LCAweDQzLCAvKiAweENDLTB4Q0YgKi8KKwkweENCLCAweDQ4LCAweDAwLCAweDAwLCAweEFDLCAweDcyLCAweEI3LCAweEI2LCAvKiAweEQwLTB4RDMgKi8KKwkweEE0LCAweEYxLCAweDAwLCAweDAwLCAweENGLCAweDY4LCAweEFDLCAweDczLCAvKiAweEQ0LTB4RDcgKi8KKwkweENGLCAweDY5LCAweDAwLCAweDAwLCAweEMwLCAweEQ1LCAweEE0LCAweEYyLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweEVDLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweENGLCAweDZBLCAweDAwLCAweDAwLCAweEQyLCAweDQyLCAweEQyLCAweDQxLCAvKiAweEUwLTB4RTMgKi8KKwkweEQxLCAweEZFLCAweDAwLCAweDAwLCAweEQxLCAweEZELCAweEQyLCAweDQzLCAvKiAweEU0LTB4RTcgKi8KKwkweEQyLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIyLCAweDQwLCAvKiAweEU4LTB4RUIgKi8KKwkweEIyLCAweDQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI0LCAweEUwLCAvKiAweEVDLTB4RUYgKi8KKwkweEQ5LCAweEUzLCAweDAwLCAweDAwLCAweEQ5LCAweEU0LCAweEQ5LCAweEU1LCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweDQxLCAvKiAweEY0LTB4RjcgKi8KKwkweERFLCAweDQyLCAweERFLCAweDQwLCAweDAwLCAweDAwLCAweERELCAweEZELCAvKiAweEY4LTB4RkIgKi8KKwkweERELCAweEZFLCAweEI3LCAweEI3LCAweEUyLCAweDZCLCAweEU1LCAweEY3LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182Q1s1MTJdID0geworCTB4RTUsIDB4RjYsIDB4RTUsIDB4RjUsIDB4RTUsIDB4RjgsIDB4RTksIDB4RTcsIC8qIDB4MDAtMHgwMyAqLworCTB4RTksIDB4RTYsIDB4QkUsIDB4RkIsIDB4RTksIDB4RTgsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4QzAsIDB4RDYsIDB4RUQsIDB4NEQsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RUEsIC8qIDB4MDgtMHgwQiAqLworCTB4RjIsIDB4NUIsIDB4RjYsIDB4RTcsIDB4MDAsIDB4MDAsIDB4QTQsIDB4RjMsIC8qIDB4MEMtMHgwRiAqLworCTB4QTUsIDB4QzIsIDB4QTUsIDB4QzEsIDB4MDAsIDB4MDAsIDB4QUEsIDB4NUQsIC8qIDB4MTAtMHgxMyAqLworCTB4QzksIDB4NjEsIDB4QzksIDB4N0UsIDB4QTYsIDB4QkIsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4QzksIDB4RjcsIDB4Q0IsIDB4NDksIDB4Q0IsIDB4NEEsIDB4QUEsIDB4NUUsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4RUQsIDB4MDAsIDB4MDAsIDB4QUMsIDB4NzQsIC8qIDB4MUMtMHgxRiAqLworCTB4Q0YsIDB4NkIsIDB4Q0YsIDB4NkMsIDB4MDAsIDB4MDAsIDB4QUUsIDB4RjAsIC8qIDB4MjAtMHgyMyAqLworCTB4QUUsIDB4RjQsIDB4RDIsIDB4NDQsIDB4QUUsIDB4RjMsIDB4QUUsIDB4RjEsIC8qIDB4MjQtMHgyNyAqLworCTB4QUUsIDB4RjIsIDB4MDAsIDB4MDAsIDB4RDUsIDB4REYsIDB4QjIsIDB4NDIsIC8qIDB4MjgtMHgyQiAqLworCTB4QjQsIDB4RTMsIDB4MDAsIDB4MDAsIDB4QjQsIDB4RTEsIDB4QjQsIDB4RTIsIC8qIDB4MkMtMHgyRiAqLworCTB4RDksIDB4RTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkEsIDB4NzIsIC8qIDB4MzAtMHgzMyAqLworCTB4QTQsIDB4RjQsIDB4MDAsIDB4MDAsIDB4QzksIDB4QTEsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4QTUsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzksIDB4QTQsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTUsIDB4QzYsIDB4QzksIDB4QTMsIC8qIDB4M0MtMHgzRiAqLworCTB4QTUsIDB4QzUsIDB4QTUsIDB4QzQsIDB4QTgsIDB4NDQsIDB4QzksIDB4QTIsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzksIDB4RjgsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzksIDB4RkMsIDB4QzksIDB4RkUsIC8qIDB4NDgtMHg0QiAqLworCTB4Q0EsIDB4NDAsIDB4QTYsIDB4QzUsIDB4QTYsIDB4QzYsIDB4QzksIDB4RkIsIC8qIDB4NEMtMHg0RiAqLworCTB4QTYsIDB4QzEsIDB4MDAsIDB4MDAsIDB4QzksIDB4RjksIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4QzksIDB4RkQsIDB4QTYsIDB4QzIsIDB4MDAsIDB4MDAsIDB4QTYsIDB4QkQsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4QTYsIDB4QkUsIDB4MDAsIDB4MDAsIDB4QTYsIDB4QzQsIC8qIDB4NTgtMHg1QiAqLworCTB4QzksIDB4RkEsIDB4QTYsIDB4QkMsIDB4QTgsIDB4NDUsIDB4QTYsIDB4QkYsIC8qIDB4NUMtMHg1RiAqLworCTB4QTYsIDB4QzAsIDB4QTYsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4NUIsIDB4Q0IsIDB4NTksIDB4Q0IsIDB4NEMsIC8qIDB4NjQtMHg2NyAqLworCTB4QTgsIDB4NTEsIDB4Q0IsIDB4NTMsIDB4QTgsIDB4NEMsIDB4Q0IsIDB4NEQsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4NTUsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4NTIsIC8qIDB4NkMtMHg2RiAqLworCTB4QTgsIDB4NEYsIDB4Q0IsIDB4NTEsIDB4QTgsIDB4NTYsIDB4Q0IsIDB4NUEsIC8qIDB4NzAtMHg3MyAqLworCTB4QTgsIDB4NTgsIDB4MDAsIDB4MDAsIDB4QTgsIDB4NUEsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4Q0IsIDB4NEIsIDB4MDAsIDB4MDAsIDB4QTgsIDB4NEQsIDB4Q0IsIDB4NUMsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4QTgsIDB4NTQsIDB4QTgsIDB4NTcsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4Q0QsIDB4NDUsIDB4QTgsIDB4NDcsIDB4QTgsIDB4NUUsIDB4QTgsIDB4NTUsIC8qIDB4ODAtMHg4MyAqLworCTB4Q0IsIDB4NEUsIDB4QTgsIDB4NEEsIDB4QTgsIDB4NTksIDB4Q0IsIDB4NTYsIC8qIDB4ODQtMHg4NyAqLworCTB4QTgsIDB4NDgsIDB4QTgsIDB4NDksIDB4Q0QsIDB4NDMsIDB4Q0IsIDB4NEYsIC8qIDB4ODgtMHg4QiAqLworCTB4QTgsIDB4NTAsIDB4QTgsIDB4NUIsIDB4Q0IsIDB4NUQsIDB4Q0IsIDB4NTAsIC8qIDB4OEMtMHg4RiAqLworCTB4QTgsIDB4NEUsIDB4MDAsIDB4MDAsIDB4QTgsIDB4NTMsIDB4Q0MsIDB4RUUsIC8qIDB4OTAtMHg5MyAqLworCTB4QTgsIDB4NUMsIDB4Q0IsIDB4NTcsIDB4QTgsIDB4NTIsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4QTgsIDB4NUQsIDB4QTgsIDB4NDYsIDB4Q0IsIDB4NTQsIDB4QTgsIDB4NEIsIC8qIDB4OTgtMHg5QiAqLworCTB4Q0IsIDB4NTgsIDB4Q0QsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUEsIDB4NkEsIC8qIDB4QTgtMHhBQiAqLworCTB4QUEsIDB4N0EsIDB4Q0MsIDB4RjUsIDB4QUEsIDB4NzEsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4Q0QsIDB4NEIsIDB4QUEsIDB4NjIsIDB4MDAsIDB4MDAsIDB4QUEsIDB4NjUsIC8qIDB4QjAtMHhCMyAqLworCTB4Q0QsIDB4NDIsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4RjMsIDB4Q0MsIDB4RjcsIC8qIDB4QjQtMHhCNyAqLworCTB4QUEsIDB4NkQsIDB4QUEsIDB4NkYsIDB4Q0MsIDB4RkEsIDB4QUEsIDB4NzYsIC8qIDB4QjgtMHhCQiAqLworCTB4QUEsIDB4NjgsIDB4QUEsIDB4NjYsIDB4QUEsIDB4NjcsIDB4QUEsIDB4NzUsIC8qIDB4QkMtMHhCRiAqLworCTB4Q0QsIDB4NDcsIDB4QUEsIDB4NzAsIDB4Q0MsIDB4RjksIDB4Q0MsIDB4RkIsIC8qIDB4QzAtMHhDMyAqLworCTB4QUEsIDB4NkUsIDB4QUEsIDB4NzMsIDB4Q0MsIDB4RkMsIDB4Q0QsIDB4NEEsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4QUMsIDB4NzUsIDB4QUEsIDB4NzksIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4QUEsIDB4NjMsIDB4Q0QsIDB4NDksIDB4MDAsIDB4MDAsIDB4Q0QsIDB4NEQsIC8qIDB4Q0MtMHhDRiAqLworCTB4Q0MsIDB4RjgsIDB4Q0QsIDB4NEYsIDB4Q0QsIDB4NDAsIDB4QUEsIDB4NkMsIC8qIDB4RDAtMHhEMyAqLworCTB4Q0MsIDB4RjQsIDB4QUEsIDB4NkIsIDB4QUEsIDB4N0QsIDB4QUEsIDB4NzIsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4RjIsIDB4Q0YsIDB4NzUsIDB4QUEsIDB4NzgsIC8qIDB4RDgtMHhEQiAqLworCTB4QUEsIDB4N0MsIDB4Q0QsIDB4NDEsIDB4Q0QsIDB4NDYsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4QUEsIDB4N0UsIDB4QUEsIDB4NzcsIDB4QUEsIDB4NjksIDB4QUEsIDB4NUYsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4QUEsIDB4NjQsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4RjYsIC8qIDB4RTQtMHhFNyAqLworCTB4QUEsIDB4NjAsIDB4Q0QsIDB4NEUsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4RjAsIC8qIDB4RTgtMHhFQiAqLworCTB4Q0MsIDB4RUYsIDB4Q0MsIDB4RkQsIDB4Q0MsIDB4RjEsIDB4QUEsIDB4N0IsIC8qIDB4RUMtMHhFRiAqLworCTB4QUUsIDB4RjUsIDB4QUEsIDB4NzQsIDB4Q0MsIDB4RkUsIDB4QUEsIDB4NjEsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4QUMsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4Q0QsIDB4NEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzZEWzUxMl0gPSB7CisJMHhDRiwgMHg3QywgMHhDRiwgMHhBMSwgMHgwMCwgMHgwMCwgMHhDRiwgMHhBNCwgLyogMHgwMC0weDAzICovCisJMHhDRiwgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhBNywgLyogMHgwNC0weDA3ICovCisJMHhDRiwgMHhBQSwgMHhDRiwgMHhBQywgMHhDRiwgMHg3NCwgMHhBQywgMHg3NiwgLyogMHgwOC0weDBCICovCisJMHhBQywgMHg3QiwgMHhEMiwgMHg0OSwgMHhBQywgMHhBRCwgMHhDRiwgMHhBNSwgLyogMHgwQy0weDBGICovCisJMHhDRiwgMHhBRCwgMHhDRiwgMHg3QiwgMHhDRiwgMHg3MywgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMiwgMHg2NCwgMHhBQywgMHg3RSwgLyogMHgxNC0weDE3ICovCisJMHhDRiwgMHhBMiwgMHhDRiwgMHg3OCwgMHhDRiwgMHg3QSwgMHhBQywgMHhBNSwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhDRiwgMHg3RCwgMHhBQywgMHg3RCwgMHhDRiwgMHg3MCwgLyogMHgxQy0weDFGICovCisJMHhDRiwgMHhBOCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhBQiwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhBQywgMHg3QSwgMHgwMCwgMHgwMCwgMHhBQywgMHhBOCwgLyogMHgyNC0weDI3ICovCisJMHhDRiwgMHg2RCwgMHhBQywgMHhBQSwgMHhBQywgMHg3OCwgMHhBQywgMHhBRSwgLyogMHgyOC0weDJCICovCisJMHhDRiwgMHhBOSwgMHhDRiwgMHg2RiwgMHhBQywgMHhBQiwgMHhEMiwgMHg1RSwgLyogMHgyQy0weDJGICovCisJMHhDRCwgMHg0OCwgMHhBQywgMHg3QywgMHhBQywgMHg3NywgMHhDRiwgMHg3NiwgLyogMHgzMC0weDMzICovCisJMHhDRiwgMHg2RSwgMHhBQywgMHhBQywgMHhBQywgMHhBNCwgMHhDRiwgMHhBMywgLyogMHgzNC0weDM3ICovCisJMHhBQywgMHhBOSwgMHhBQywgMHhBNywgMHhDRiwgMHg3OSwgMHhBQywgMHhBMSwgLyogMHgzOC0weDNCICovCisJMHhDRiwgMHg3MSwgMHhBQywgMHhBMiwgMHhBQywgMHhBMywgMHhDRiwgMHg3MiwgLyogMHgzQy0weDNGICovCisJMHhDRiwgMHhBNiwgMHhBQywgMHg3OSwgMHhDRiwgMHg3RSwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhEMiwgMHg0QywgMHhBRSwgMHhGRCwgMHhBRiwgMHg0MywgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMiwgMHg1NSwgMHhEMiwgMHg1QiwgLyogMHg1Qy0weDVGICovCisJMHhEMiwgMHg1NywgMHhEMiwgMHg0QSwgMHhEMiwgMHg0RCwgMHhEMiwgMHg0NiwgLyogMHg2MC0weDYzICovCisJMHhEMiwgMHg0NywgMHhBRiwgMHg0QSwgMHhBRSwgMHhGQSwgMHhEMiwgMHg1NiwgLyogMHg2NC0weDY3ICovCisJMHhEMiwgMHg1RiwgMHhBRiwgMHg0NSwgMHhBRSwgMHhGNiwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhBRiwgMHg0MCwgMHhEMiwgMHg0RSwgMHhBRiwgMHg0MiwgMHhEMiwgMHg0RiwgLyogMHg2Qy0weDZGICovCisJMHhEMiwgMHg1OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhBRiwgMHg0NCwgMHhEMiwgMHg2OCwgMHhEMiwgMHg0OCwgMHhBRSwgMHhGQywgLyogMHg3NC0weDc3ICovCisJMHhBRSwgMHhGQiwgMHhBRiwgMHg0OCwgMHhEMiwgMHg0NSwgMHhEMiwgMHg2NiwgLyogMHg3OC0weDdCICovCisJMHhEMiwgMHg1QSwgMHhEMiwgMHg2NywgMHhEMiwgMHg2MSwgMHhEMiwgMHg1MywgLyogMHg3Qy0weDdGICovCisJCisJMHhEMiwgMHg2MiwgMHgwMCwgMHgwMCwgMHhEMiwgMHg1QywgMHhEMiwgMHg2NSwgLyogMHg4MC0weDgzICovCisJMHhEMiwgMHg2MywgMHhBRiwgMHg0OSwgMHhEMiwgMHg1NCwgMHhBRSwgMHhGOSwgLyogMHg4NC0weDg3ICovCisJMHhBRSwgMHhGOCwgMHhBRiwgMHg0MSwgMHhBRiwgMHg0NywgMHhEMiwgMHg2MCwgLyogMHg4OC0weDhCICovCisJMHhBRiwgMHg0NiwgMHhEMiwgMHg1MSwgMHhCMiwgMHg0MywgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhEMiwgMHg2OSwgMHhEMiwgMHg1MCwgMHhEMiwgMHg0QiwgMHhBRSwgMHhGRSwgLyogMHg5MC0weDkzICovCisJMHhBRiwgMHg0QiwgMHhBRSwgMHhGNywgMHgwMCwgMHgwMCwgMHhEMiwgMHg1OCwgLyogMHg5NC0weDk3ICovCisJMHhEMiwgMHg1RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMiwgMHg2NSwgMHhENSwgMHhFMSwgLyogMHhBOC0weEFCICovCisJMHhENSwgMHhFNSwgMHgwMCwgMHgwMCwgMHhCMiwgMHg1MiwgMHhCMiwgMHg1MCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMiwgMHg0NywgMHhENSwgMHhFMywgLyogMHhCMC0weEIzICovCisJMHhENSwgMHhFMiwgMHhCMiwgMHg1QiwgMHgwMCwgMHgwMCwgMHhENSwgMHhFOCwgLyogMHhCNC0weEI3ICovCisJMHhCMiwgMHg1NSwgMHgwMCwgMHgwMCwgMHhENSwgMHhGQSwgMHhENiwgMHg0NywgLyogMHhCOC0weEJCICovCisJMHhCMiwgMHg0NCwgMHhENSwgMHhGNywgMHhENSwgMHhGMCwgMHhCMiwgMHg2NywgLyogMHhCQy0weEJGICovCisJMHhENSwgMHhFMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhGQywgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhCMiwgMHg2NCwgMHhCMiwgMHg1OCwgMHhCMiwgMHg2MywgMHhCMiwgMHg0RSwgLyogMHhDNC0weEM3ICovCisJMHhENSwgMHhFQywgMHhENSwgMHhGRSwgMHhENSwgMHhGNiwgMHhCMiwgMHg0RiwgLyogMHhDOC0weENCICovCisJMHhCMiwgMHg0OSwgMHhENiwgMHg0NSwgMHgwMCwgMHgwMCwgMHhENSwgMHhGRCwgLyogMHhDQy0weENGICovCisJMHhENiwgMHg0MCwgMHhCMiwgMHg1MSwgMHhCMiwgMHg1OSwgMHhENiwgMHg0MiwgLyogMHhEMC0weEQzICovCisJMHhENSwgMHhFQSwgMHhENSwgMHhGQiwgMHhENSwgMHhFRiwgMHhENiwgMHg0NCwgLyogMHhENC0weEQ3ICovCisJMHhCMiwgMHg1RSwgMHhCMiwgMHg0NiwgMHhCMiwgMHg1QywgMHhENSwgMHhGNCwgLyogMHhEOC0weERCICovCisJMHhENSwgMHhGMiwgMHhENSwgMHhGMywgMHhCMiwgMHg1MywgMHhENSwgMHhFRSwgLyogMHhEQy0weERGICovCisJMHhENSwgMHhFRCwgMHhCMiwgMHg0OCwgMHhENSwgMHhFNywgMHhENiwgMHg0NiwgLyogMHhFMC0weEUzICovCisJMHhCMiwgMHg0QSwgMHhENSwgMHhGMSwgMHhCMiwgMHg2OCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhCMiwgMHg2MiwgMHhENSwgMHhFNiwgMHhCMiwgMHg1RiwgMHhCMiwgMHg1RCwgLyogMHhFOC0weEVCICovCisJMHhCMiwgMHg2NiwgMHhENSwgMHhGOCwgMHhCMiwgMHg2MSwgMHhEMiwgMHg1MiwgLyogMHhFQy0weEVGICovCisJMHhENSwgMHhGOSwgMHhCMiwgMHg2MCwgMHhENiwgMHg0MSwgMHhCMiwgMHg0NSwgLyogMHhGMC0weEYzICovCisJMHhENSwgMHhGNSwgMHhCMiwgMHg1NywgMHhENSwgMHhFOSwgMHhCMiwgMHg1NiwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhCMiwgMHg1NCwgMHhCMiwgMHg0QywgMHhCMiwgMHg0QiwgLyogMHhGOC0weEZCICovCisJMHhEOSwgMHhFNywgMHhENiwgMHg0MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNkVbNTEyXSA9IHsKKwkweEQ1LCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEZDLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEIyLCAweDRELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEI1LCAweDQxLCAweEIyLCAweDVBLCAweEI0LCAweEVFLCAvKiAweDE4LTB4MUIgKi8KKwkweEQ5LCAweEY2LCAweEI0LCAweEZDLCAweDAwLCAweDAwLCAweEQ5LCAweEVBLCAvKiAweDFDLTB4MUYgKi8KKwkweEI0LCAweEVCLCAweEI0LCAweEU3LCAweERBLCAweDQ5LCAweEI0LCAweEVELCAvKiAweDIwLTB4MjMgKi8KKwkweEI0LCAweEYxLCAweEI0LCAweEVDLCAweEI0LCAweEY1LCAweERBLCAweDRELCAvKiAweDI0LTB4MjcgKi8KKwkweERBLCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEYxLCAvKiAweDI4LTB4MkIgKi8KKwkweEI0LCAweEZBLCAweEI0LCAweEY0LCAweEQ5LCAweEZELCAweEI0LCAweEU0LCAvKiAweDJDLTB4MkYgKi8KKwkweERBLCAweDRBLCAweERBLCAweDQzLCAweEI0LCAweEU4LCAweEQ5LCAweEY3LCAvKiAweDMwLTB4MzMgKi8KKwkweEI0LCAweEY3LCAweERBLCAweDU1LCAweERBLCAweDU2LCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEI0LCAweEU1LCAweERBLCAweDQ4LCAweEI0LCAweEY5LCAweEQ5LCAweEZCLCAvKiAweDM4LTB4M0IgKi8KKwkweEQ5LCAweEVELCAweEQ5LCAweEVFLCAweEI0LCAweEZELCAweEQ5LCAweEYyLCAvKiAweDNDLTB4M0YgKi8KKwkweEQ5LCAweEY5LCAweEQ5LCAweEYzLCAweDAwLCAweDAwLCAweEI0LCAweEZCLCAvKiAweDQwLTB4NDMgKi8KKwkweEI1LCAweDQ0LCAweEQ5LCAweEVGLCAweEQ5LCAweEU4LCAweEQ5LCAweEU5LCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweEQ5LCAweEVCLCAweEI0LCAweEVBLCAweEQ5LCAweEY4LCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweEI0LCAweEY4LCAweEI1LCAweDQyLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweEQ5LCAweEZBLCAweERBLCAweDUzLCAweERBLCAweDRCLCAvKiAweDUwLTB4NTMgKi8KKwkweEI0LCAweEU2LCAweERBLCAweDUxLCAweEI0LCAweEYyLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEI0LCAweEYwLCAweDAwLCAweDAwLCAweERBLCAweDU3LCAweEI0LCAweEVGLCAvKiAweDU4LTB4NUIgKi8KKwkweERBLCAweDQxLCAweEQ5LCAweEY0LCAweEQ5LCAweEZFLCAweEI1LCAweDQ3LCAvKiAweDVDLTB4NUYgKi8KKwkweERBLCAweDQ1LCAweERBLCAweDQyLCAweEQ5LCAweEYwLCAweEI1LCAweDQzLCAvKiAweDYwLTB4NjMgKi8KKwkweERBLCAweDRGLCAweERBLCAweDRDLCAweERBLCAweDU0LCAweEI0LCAweEU5LCAvKiAweDY0LTB4NjcgKi8KKwkweERBLCAweDQwLCAweEI1LCAweDQ2LCAweDAwLCAweDAwLCAweERBLCAweDQ3LCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI0LCAweEYzLCAweEI0LCAweEY2LCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweERBLCAweDQ2LCAweEI1LCAweDQ1LCAweEQ5LCAweEY1LCAvKiAweDcwLTB4NzMgKi8KKwkweEQ1LCAweEU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweDUwLCAvKiAweDc0LTB4NzcgKi8KKwkweERBLCAweDRFLCAweERBLCAweDUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweEQ5LCAweEVDLCAweEI1LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweERFLCAweDYxLCAweERFLCAweDYwLCAweERFLCAweDQ2LCAvKiAweDhDLTB4OEYgKi8KKwkweEI3LCAweEJELCAweDAwLCAweDAwLCAweERFLCAweDVGLCAweERFLCAweDQ5LCAvKiAweDkwLTB4OTMgKi8KKwkweERFLCAweDRBLCAweDAwLCAweDAwLCAweEI3LCAweEM3LCAweERFLCAweDY4LCAvKiAweDk0LTB4OTcgKi8KKwkweEI3LCAweEMyLCAweERFLCAweDVFLCAweDAwLCAweDAwLCAweERFLCAweDQzLCAvKiAweDk4LTB4OUIgKi8KKwkweEI3LCAweEM4LCAweEI3LCAweEJFLCAweERFLCAweDUyLCAweERFLCAweDQ4LCAvKiAweDlDLTB4OUYgKi8KKwkweERFLCAweDRCLCAweERFLCAweDYzLCAweEI3LCAweEI4LCAweERFLCAweDZBLCAvKiAweEEwLTB4QTMgKi8KKwkweERFLCAweDYyLCAweEI3LCAweEMxLCAweERFLCAweDU3LCAweEI3LCAweENDLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI3LCAweENCLCAweEI3LCAweEM1LCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweDY5LCAweEI3LCAweEI5LCAvKiAweEFDLTB4QUYgKi8KKwkweERFLCAweDU1LCAweERFLCAweDRDLCAweERFLCAweDU5LCAweERFLCAweDY1LCAvKiAweEIwLTB4QjMgKi8KKwkweEI3LCAweENELCAweDAwLCAweDAwLCAweEI3LCAweEJCLCAweERFLCAweDU0LCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweERFLCAweDRELCAweEI3LCAweEM0LCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweEI3LCAweEMzLCAweERFLCAweDUwLCAweERFLCAweDVBLCAweERFLCAweDY0LCAvKiAweEJDLTB4QkYgKi8KKwkweERFLCAweDQ3LCAweERFLCAweDUxLCAweEI3LCAweEJDLCAweERFLCAweDVCLCAvKiAweEMwLTB4QzMgKi8KKwkweEI3LCAweEM5LCAweEI3LCAweEMwLCAweERFLCAweDRFLCAweEI3LCAweEJGLCAvKiAweEM0LTB4QzcgKi8KKwkweERFLCAweDQ1LCAweERFLCAweDUzLCAweERFLCAweDY3LCAweEI0LCAweEZFLCAvKiAweEM4LTB4Q0IgKi8KKwkweEJBLCAweEIwLCAweERFLCAweDU2LCAweEUyLCAweDZDLCAweERFLCAweDU4LCAvKiAweENDLTB4Q0YgKi8KKwkweERFLCAweDY2LCAweEI3LCAweEM2LCAweERFLCAweDRGLCAweEI3LCAweEJBLCAvKiAweEQwLTB4RDMgKi8KKwkweEI3LCAweENBLCAweEJDLCAweEYwLCAweERFLCAweDQ0LCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweERFLCAweDVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweERFLCAweDVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEFBLCAvKiAweEU4LTB4RUIgKi8KKwkweEJBLCAweEFELCAweEUyLCAweDdELCAweEUyLCAweEE0LCAweEJBLCAweEEyLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweDZFLCAweEJBLCAweEFGLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEJBLCAweDc3LCAweEUyLCAweDZELCAweEUyLCAweEIwLCAweEJBLCAweEIxLCAvKiAweEY0LTB4RjcgKi8KKwkweEUyLCAweDcxLCAweEUyLCAweEEzLCAweDAwLCAweDAwLCAweEUyLCAweDczLCAvKiAweEY4LTB4RkIgKi8KKwkweEUyLCAweEIzLCAweEUyLCAweEFGLCAweEJBLCAweDc1LCAweEJBLCAweEExLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182Rls1MTJdID0geworCTB4RTYsIDB4NTMsIDB4QkEsIDB4QUUsIDB4QkEsIDB4N0QsIDB4RTIsIDB4NkYsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4QUUsIDB4QkEsIDB4QTMsIDB4RTIsIDB4QUIsIC8qIDB4MDQtMHgwNyAqLworCTB4RTIsIDB4QjgsIDB4RTIsIDB4NzUsIDB4RTIsIDB4N0UsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4QjYsIDB4RTIsIDB4QUMsIDB4QkEsIDB4N0MsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4N0MsIDB4QkEsIDB4NzYsIC8qIDB4MTAtMHgxMyAqLworCTB4QkEsIDB4NzQsIDB4QkEsIDB4QTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4RTIsIDB4N0EsIDB4RTIsIDB4NzcsIDB4RTIsIDB4NzgsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4RTIsIDB4QjIsIDB4MDAsIDB4MDAsIDB4RTIsIDB4QjcsIDB4RTIsIDB4QjUsIC8qIDB4MUMtMHgxRiAqLworCTB4QkEsIDB4N0EsIDB4RTIsIDB4QjksIDB4QkEsIDB4N0UsIDB4QkEsIDB4QTcsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NzAsIDB4RTUsIDB4RkEsIDB4RTIsIDB4NzksIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4QkEsIDB4NzgsIDB4QkEsIDB4QUMsIDB4QkEsIDB4QTksIC8qIDB4MjgtMHgyQiAqLworCTB4QkEsIDB4N0IsIDB4RTIsIDB4QTUsIDB4RTIsIDB4NzQsIDB4QkEsIDB4QUEsIC8qIDB4MkMtMHgyRiAqLworCTB4RTIsIDB4QTcsIDB4QkEsIDB4QTQsIDB4QkEsIDB4QTYsIDB4QkEsIDB4NzMsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4QTksIDB4RTIsIDB4QTEsIDB4RTIsIDB4NzIsIC8qIDB4MzQtMHgzNyAqLworCTB4QkEsIDB4QTUsIDB4RTIsIDB4QjEsIDB4RTIsIDB4QjQsIDB4RTIsIDB4N0IsIC8qIDB4MzgtMHgzQiAqLworCTB4RTIsIDB4QTgsIDB4MDAsIDB4MDAsIDB4QkEsIDB4NzksIDB4QkMsIDB4REYsIC8qIDB4M0MtMHgzRiAqLworCTB4RTIsIDB4QTYsIDB4RTUsIDB4RjksIDB4MDAsIDB4MDAsIDB4RTIsIDB4QUQsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NzYsIDB4RTYsIDB4NDQsIC8qIDB4NEMtMHg0RiAqLworCTB4RTYsIDB4NEUsIDB4QkMsIDB4RTIsIDB4RTYsIDB4NEQsIDB4RTYsIDB4NTksIC8qIDB4NTAtMHg1MyAqLworCTB4QkMsIDB4RTQsIDB4RTYsIDB4NEIsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NEYsIC8qIDB4NTQtMHg1NyAqLworCTB4QkMsIDB4RUYsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NDYsIDB4QkMsIDB4RTcsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4NTIsIDB4RTksIDB4RjAsIDB4QkMsIDB4RjMsIC8qIDB4NUMtMHg1RiAqLworCTB4QkMsIDB4RjIsIDB4RTYsIDB4NTQsIDB4RTYsIDB4NDMsIDB4RTYsIDB4NUUsIC8qIDB4NjAtMHg2MyAqLworCTB4QkMsIDB4RUQsIDB4MDAsIDB4MDAsIDB4QkMsIDB4RTMsIDB4RTYsIDB4NTcsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4NUIsIDB4RTYsIDB4NjAsIDB4RTYsIDB4NTUsIC8qIDB4NjgtMHg2QiAqLworCTB4RTYsIDB4NDksIDB4QkMsIDB4RTYsIDB4QkMsIDB4RTksIDB4QkMsIDB4RjEsIC8qIDB4NkMtMHg2RiAqLworCTB4QkMsIDB4RUMsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NEMsIDB4RTIsIDB4QTIsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NDgsIDB4RTYsIDB4NUYsIC8qIDB4NzQtMHg3NyAqLworCTB4QkMsIDB4RTgsIDB4MDAsIDB4MDAsIDB4QkMsIDB4RUIsIDB4RTYsIDB4NjEsIC8qIDB4NzgtMHg3QiAqLworCTB4QkMsIDB4RTAsIDB4RTYsIDB4NTYsIDB4RTUsIDB4RkIsIDB4RTYsIDB4NUMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QzAsIDB4REYsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NEEsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4QkMsIDB4RTEsIDB4RTYsIDB4NDUsIDB4QkMsIDB4RTUsIDB4RTUsIDB4RkMsIC8qIDB4ODQtMHg4NyAqLworCTB4QkEsIDB4QUIsIDB4RTYsIDB4NDEsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NUEsIC8qIDB4ODgtMHg4QiAqLworCTB4RTYsIDB4NDIsIDB4RTYsIDB4NDAsIDB4QkMsIDB4RUEsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4RTYsIDB4NTgsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RkUsIDB4RTYsIDB4NTEsIC8qIDB4OTAtMHg5MyAqLworCTB4RTYsIDB4NTAsIDB4RTYsIDB4NUQsIDB4RTYsIDB4NDcsIDB4QkMsIDB4RUUsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4RjMsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4QkYsIDB4NDksIDB4QkUsIDB4RkUsIDB4RUEsIDB4NDAsIDB4RTksIDB4RUIsIC8qIDB4QTAtMHhBMyAqLworCTB4QkYsIDB4NDEsIDB4RTksIDB4RjcsIDB4QkYsIDB4NDgsIDB4QkYsIDB4NDMsIC8qIDB4QTQtMHhBNyAqLworCTB4RTksIDB4RjUsIDB4RUQsIDB4NEYsIDB4RTksIDB4RkIsIDB4RUEsIDB4NDIsIC8qIDB4QTgtMHhBQiAqLworCTB4RTksIDB4RkEsIDB4RTksIDB4RTksIDB4RTksIDB4RjgsIDB4RUEsIDB4NDQsIC8qIDB4QUMtMHhBRiAqLworCTB4RUEsIDB4NDYsIDB4QkUsIDB4RkQsIDB4RUEsIDB4NDUsIDB4QkYsIDB4NDQsIC8qIDB4QjAtMHhCMyAqLworCTB4QkYsIDB4NEEsIDB4MDAsIDB4MDAsIDB4QkYsIDB4NDcsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4RTksIDB4RkUsIDB4QkYsIDB4NDYsIDB4RTksIDB4RjksIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4RTksIDB4RUQsIDB4RTksIDB4RjIsIDB4MDAsIDB4MDAsIDB4RTksIDB4RkQsIC8qIDB4QkMtMHhCRiAqLworCTB4QkYsIDB4NDUsIDB4QkYsIDB4NDIsIDB4QkUsIDB4RkMsIDB4QkYsIDB4NDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RTksIDB4RjEsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RkQsIDB4RTksIDB4RUMsIC8qIDB4QzQtMHhDNyAqLworCTB4RTksIDB4RUYsIDB4RUEsIDB4NDEsIDB4RTksIDB4RjQsIDB4RTksIDB4RUEsIC8qIDB4QzgtMHhDQiAqLworCTB4RUQsIDB4NEUsIDB4RUEsIDB4NDMsIDB4RTksIDB4RUUsIDB4RTksIDB4RkMsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RUQsIDB4NTEsIDB4QzAsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4QzAsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzAsIDB4REIsIC8qIDB4RDgtMHhEQiAqLworCTB4RUQsIDB4NTMsIDB4RUQsIDB4NTksIDB4RUQsIDB4NTcsIDB4QzAsIDB4RDksIC8qIDB4REMtMHhERiAqLworCTB4QzAsIDB4REEsIDB4QzAsIDB4RTEsIDB4RUQsIDB4NUEsIDB4RUQsIDB4NTIsIC8qIDB4RTAtMHhFMyAqLworCTB4QzAsIDB4REMsIDB4MDAsIDB4MDAsIDB4RUQsIDB4NTYsIDB4RUQsIDB4NTUsIC8qIDB4RTQtMHhFNyAqLworCTB4RUQsIDB4NUIsIDB4QzAsIDB4RTIsIDB4MDAsIDB4MDAsIDB4QzAsIDB4REQsIC8qIDB4RTgtMHhFQiAqLworCTB4QzAsIDB4RTAsIDB4RUQsIDB4NTQsIDB4QzAsIDB4RTQsIDB4QzAsIDB4REUsIC8qIDB4RUMtMHhFRiAqLworCTB4QzAsIDB4RTUsIDB4QzAsIDB4RDgsIDB4RUQsIDB4NTgsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RUQsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RjcsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzIsIDB4NzEsIDB4RUYsIDB4RjQsIC8qIDB4RjgtMHhGQiAqLworCTB4RUYsIDB4RjYsIDB4MDAsIDB4MDAsIDB4QzIsIDB4NkYsIDB4RUYsIDB4RjIsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzcwWzUxMl0gPSB7CisJMHhFRiwgMHhGMywgMHhFRiwgMHhFRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhFOSwgMHhGNiwgMHhFRiwgMHhFRiwgMHhDMiwgMHg3MCwgMHhFRiwgMHhFQiwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhDMiwgMHg2RCwgMHhFRiwgMHhGOCwgMHhDMiwgMHg2RSwgLyogMHgwOC0weDBCICovCisJMHhFRiwgMHhFQywgMHhFRiwgMHhFRCwgMHhFRiwgMHhGMSwgMHhDMiwgMHg3MywgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhDMiwgMHg3MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhFRiwgMHhGMCwgMHhDMywgMHg3OCwgMHhGMiwgMHg1RiwgMHhGMiwgMHg2NSwgLyogMHgxNC0weDE3ICovCisJMHhDMywgMHg3OSwgMHhGMiwgMHg1QywgMHhDMywgMHg3NiwgMHhDMywgMHg3MywgLyogMHgxOC0weDFCICovCisJMHhGMiwgMHg2NywgMHhDMywgMHg3NywgMHgwMCwgMHgwMCwgMHhDMywgMHg3NCwgLyogMHgxQy0weDFGICovCisJMHhGMiwgMHg1RSwgMHhGMiwgMHg2MSwgMHhGMiwgMHg2MiwgMHhGMiwgMHg2MywgLyogMHgyMC0weDIzICovCisJMHhGMiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhFRiwgMHhGNSwgMHhGMiwgMHg1RCwgLyogMHgyNC0weDI3ICovCisJMHhDMywgMHg3NSwgMHhGMiwgMHg2NCwgMHhGMiwgMHg2OCwgMHhGMiwgMHg2MCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHg1RCwgLyogMHgyQy0weDJGICovCisJMHhDNCwgMHg2QSwgMHhGNCwgMHg2MCwgMHhDNCwgMHg2QiwgMHhGNCwgMHg2OCwgLyogMHgzMC0weDMzICovCisJMHhGNCwgMHg1RiwgMHhGNCwgMHg1QywgMHgwMCwgMHgwMCwgMHhGNCwgMHg1RSwgLyogMHgzNC0weDM3ICovCisJMHhGNCwgMHg2MiwgMHhGNCwgMHg2NSwgMHhGNCwgMHg2NCwgMHhGNCwgMHg2NywgLyogMHgzOC0weDNCICovCisJMHhGNCwgMHg1QiwgMHgwMCwgMHgwMCwgMHhDNCwgMHg2OSwgMHhGNCwgMHg2MywgLyogMHgzQy0weDNGICovCisJMHhGNCwgMHg2NiwgMHhGNCwgMHg2OSwgMHhGNCwgMHg2MSwgMHhGNSwgMHhEMywgLyogMHg0MC0weDQzICovCisJMHhGNSwgMHhENCwgMHhGNSwgMHhEOCwgMHhGNSwgMHhEOSwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhGNSwgMHhENiwgMHhGNSwgMHhENywgMHhGNSwgMHhENSwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhDNCwgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHhDNSwgMHg3OCwgMHhGNiwgMHhFQiwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhFOCwgMHhGNiwgMHhFOSwgMHhGNiwgMHhFQSwgLyogMHg1NC0weDU3ICovCisJMHhDNSwgMHg3OSwgMHgwMCwgMHgwMCwgMHhGNywgMHhFNSwgMHhGNywgMHhFNCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhBRiwgMHhDNSwgMHhGNCwgMHhGOCwgMHhBRCwgLyogMHg1Qy0weDVGICovCisJMHhGOCwgMHhCMCwgMHhGOCwgMHhBRSwgMHhGOCwgMHhGNSwgMHhDNiwgMHg1NywgLyogMHg2MC0weDYzICovCisJMHhDNiwgMHg2NSwgMHhGOSwgMHhBMywgMHhGOSwgMHg2QywgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhGOSwgMHhBMiwgMHhGOSwgMHhEMCwgMHhGOSwgMHhEMSwgMHhBNCwgMHhGNSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhBNiwgMHhDNywgMHhDQSwgMHg0MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhDQiwgMHg1RSwgMHgwMCwgMHgwMCwgMHhBOCwgMHg1RiwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHhBOCwgMHg2MiwgMHgwMCwgMHgwMCwgMHhDQiwgMHg1RiwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhBOCwgMHg2MCwgMHhBOCwgMHg2MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRCwgMHg1OCwgMHhDRCwgMHg1QSwgLyogMHg4MC0weDgzICovCisJMHhDRCwgMHg1NSwgMHhDRCwgMHg1MiwgMHhDRCwgMHg1NCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQSwgMHhBNCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQSwgMHhBMiwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHg1NiwgMHhBQSwgMHhBMywgMHhDRCwgMHg1MywgLyogMHg5MC0weDkzICovCisJMHhDRCwgMHg1MCwgMHhBQSwgMHhBMSwgMHhDRCwgMHg1NywgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhDRCwgMHg1MSwgMHhBQSwgMHhBNSwgMHhDRCwgMHg1OSwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhBRiwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHhDRiwgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhBQywgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHhDRiwgMHhCNiwgMHgwMCwgMHgwMCwgMHhBQywgMHhBRiwgLyogMHhBOC0weEFCICovCisJMHhBQywgMHhCMiwgMHhBQywgMHhCNCwgMHhBQywgMHhCNiwgMHhBQywgMHhCMywgLyogMHhBQy0weEFGICovCisJMHhDRiwgMHhCMiwgMHhDRiwgMHhCMSwgMHgwMCwgMHgwMCwgMHhBQywgMHhCMSwgLyogMHhCMC0weEIzICovCisJMHhDRiwgMHhCNCwgMHhDRiwgMHhCNSwgMHgwMCwgMHgwMCwgMHhDRiwgMHhBRSwgLyogMHhCNC0weEI3ICovCisJMHhBQywgMHhCNSwgMHgwMCwgMHgwMCwgMHhBQywgMHhCMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhCMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhEMiwgMHg3NywgMHhEMiwgMHg3OCwgMHhEMiwgMHg3OSwgLyogMHhDNC0weEM3ICovCisJMHhBRiwgMHg1MCwgMHgwMCwgMHgwMCwgMHhBRiwgMHg0QywgMHhEMiwgMHg2RSwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhEMiwgMHg3NiwgMHhEMiwgMHg3QiwgMHhBRiwgMHg1MSwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhEMiwgMHg2QywgMHhEMiwgMHg3MiwgMHhEMiwgMHg2QiwgLyogMHhEMC0weEQzICovCisJMHhEMiwgMHg3NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMiwgMHg3MSwgLyogMHhENC0weEQ3ICovCisJMHhBRiwgMHg0RCwgMHhBRiwgMHg0RiwgMHhEMiwgMHg3QSwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhEMiwgMHg2QSwgMHhEMiwgMHg2RCwgMHhEMiwgMHg3MywgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHhEMiwgMHg3NCwgMHhEMiwgMHg3QywgMHhEMiwgMHg3MCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHhBRiwgMHg0RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMiwgMHg2RCwgLyogMHhFQy0weEVGICovCisJMHhENiwgMHg0RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHg1MCwgLyogMHhGMC0weEYzICovCisJMHhENiwgMHg0QywgMHgwMCwgMHgwMCwgMHhENiwgMHg1OCwgMHhENiwgMHg0QSwgLyogMHhGNC0weEY3ICovCisJMHhENiwgMHg1NywgMHhCMiwgMHg2OSwgMHhENiwgMHg0OCwgMHhEQSwgMHg1QiwgLyogMHhGOC0weEZCICovCisJMHhENiwgMHg1MiwgMHhCMiwgMHg2QywgMHgwMCwgMHgwMCwgMHhENiwgMHg1MywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzFbNTEyXSA9IHsKKwkweEQ2LCAweDU2LCAweDAwLCAweDAwLCAweEQ2LCAweDVBLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEQ2LCAweDRGLCAweDAwLCAweDAwLCAweEQ2LCAweDU0LCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEIyLCAweDZBLCAweEIyLCAweDZCLCAweEQ2LCAweDU5LCAvKiAweDA4LTB4MEIgKi8KKwkweEQ2LCAweDRELCAweEQ2LCAweDQ5LCAweEQ2LCAweDVCLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEQ2LCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweDU1LCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweDRCLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEI1LCAweDQ4LCAweEI1LCAweDQ5LCAweERBLCAweDY1LCAvKiAweDE4LTB4MUIgKi8KKwkweEI1LCAweDRGLCAweDAwLCAweDAwLCAweERBLCAweDU5LCAweERBLCAweDYyLCAvKiAweDFDLTB4MUYgKi8KKwkweERBLCAweDU4LCAweEI1LCAweDRDLCAweERBLCAweDYwLCAweERBLCAweDVFLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweERBLCAweDVGLCAweEI1LCAweDRBLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweERBLCAweDYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweDVDLCAweERBLCAweDVBLCAvKiAweDJDLTB4MkYgKi8KKwkweEI1LCAweDRCLCAweERBLCAweDVELCAweERBLCAweDYxLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI1LCAweDRELCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweDY0LCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweERFLCAweDcwLCAweERFLCAweDc3LCAweERFLCAweDc5LCAvKiAweDQwLTB4NDMgKi8KKwkweERFLCAweEExLCAweDAwLCAweDAwLCAweEI3LCAweERBLCAweERFLCAweDZCLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweEI3LCAweEQyLCAweDAwLCAweDAwLCAweERFLCAweDdBLCAvKiAweDQ4LTB4NEIgKi8KKwkweEI3LCAweEQ3LCAweERFLCAweEEyLCAweEI3LCAweENFLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweERFLCAweDdELCAweDAwLCAweDAwLCAweERFLCAweDZELCAweERFLCAweDdFLCAvKiAweDUwLTB4NTMgKi8KKwkweERFLCAweDZDLCAweDAwLCAweDAwLCAweEI3LCAweERDLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweERFLCAweDc4LCAweEI3LCAweENGLCAweERFLCAweEEzLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweEI3LCAweEQ0LCAweERFLCAweDcxLCAweEI3LCAweEQ5LCAweERFLCAweDdDLCAvKiAweDVDLTB4NUYgKi8KKwkweERFLCAweDZGLCAweERFLCAweDc2LCAweERFLCAweDcyLCAweERFLCAweDZFLCAvKiAweDYwLTB4NjMgKi8KKwkweEI3LCAweEQxLCAweEI3LCAweEQ4LCAweEI3LCAweEQ2LCAweEI3LCAweEQzLCAvKiAweDY0LTB4NjcgKi8KKwkweEI3LCAweERCLCAweEI3LCAweEQwLCAweERFLCAweDc1LCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEI3LCAweEQ1LCAweDAwLCAweDAwLCAweEI1LCAweDRFLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweERFLCAweDdCLCAweDAwLCAweDAwLCAweERFLCAweDczLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweERFLCAweDc0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEMxLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEJBLCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEUyLCAweEJELCAweEUyLCAweEMzLCAweEUyLCAweEJGLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEJBLCAweEI2LCAweEUyLCAweEJFLCAweEUyLCAweEMyLCAweEUyLCAweEJBLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEJDLCAweEJBLCAweEI1LCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEMwLCAvKiAweDhDLTB4OEYgKi8KKwkweEUyLCAweEJCLCAweDAwLCAweDAwLCAweEJBLCAweEI3LCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEJBLCAweEIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEM0LCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweEJBLCAweEIzLCAweEU2LCAweDY3LCAweEU2LCAweDY0LCAvKiAweDk4LTB4OUIgKi8KKwkweEU2LCAweDcwLCAweEU2LCAweDZBLCAweEU2LCAweDZDLCAweEJDLCAweEY0LCAvKiAweDlDLTB4OUYgKi8KKwkweEU2LCAweDY2LCAweEU2LCAweDZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEU2LCAweDZELCAweEU2LCAweDZCLCAweDAwLCAweDAwLCAweEU2LCAweDcxLCAvKiAweEE0LTB4QTcgKi8KKwkweEJDLCAweEY3LCAweEU2LCAweDY4LCAweEU2LCAweDZGLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweEJDLCAweEY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweDYzLCAvKiAweEFDLTB4QUYgKi8KKwkweEU2LCAweDY1LCAweEJDLCAweEY2LCAweEU2LCAweDYyLCAweEU2LCAweDcyLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweDY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweEVBLCAweDRBLCAweEJGLCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweEVBLCAweDU1LCAweEVBLCAweDUzLCAweEJGLCAweDRCLCAweEVBLCAweDQ5LCAvKiAweEJDLTB4QkYgKi8KKwkweEVBLCAweDRDLCAweEVBLCAweDRELCAweEVBLCAweDQ4LCAweEJGLCAweDU1LCAvKiAweEMwLTB4QzMgKi8KKwkweEJGLCAweDU2LCAweEVBLCAweDQ3LCAweEVBLCAweDU2LCAweEVBLCAweDUxLCAvKiAweEM0LTB4QzcgKi8KKwkweEJGLCAweDRGLCAweEJGLCAweDRDLCAweEVBLCAweDUwLCAweEVBLCAweDRFLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJGLCAweDUyLCAweEVBLCAweDUyLCAvKiAweENDLTB4Q0YgKi8KKwkweEJGLCAweDRELCAweDAwLCAweDAwLCAweEJGLCAweDRFLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEVBLCAweDRGLCAweEJGLCAweDUwLCAweEVBLCAweDRCLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEVBLCAweDU0LCAweEJGLCAweDUzLCAweEVBLCAweDU3LCAweEVBLCAweDU4LCAvKiAweEQ4LTB4REIgKi8KKwkweEJGLCAweDU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMwLCAweEU3LCAvKiAweERDLTB4REYgKi8KKwkweEMwLCAweEVFLCAweEVELCAweDVDLCAweEVELCAweDYyLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweEVELCAweDYwLCAweEMwLCAweEVBLCAweEMwLCAweEU5LCAweEMwLCAweEU2LCAvKiAweEU0LTB4RTcgKi8KKwkweEVELCAweDVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweEMwLCAweEVDLCAweEMwLCAweEVCLCAweEMwLCAweEU4LCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweEVELCAweDYxLCAweEVELCAweDVELCAweEVELCAweDVGLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEMwLCAweEVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEMyLCAweDc3LCAweEVGLCAweEZCLCAweDAwLCAweDAwLCAweEMyLCAweDc0LCAvKiAweEY4LTB4RkIgKi8KKwkweEMyLCAweDc1LCAweEVGLCAweEZELCAweEMyLCAweDc2LCAweEVGLCAweEZBLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183Mls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4RUYsIDB4RjksIDB4RjIsIDB4NkMsIDB4RUYsIDB4RkMsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4NkQsIDB4QzMsIDB4N0EsIDB4RjIsIDB4NkIsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4NkEsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4RjIsIDB4NjksIDB4QzMsIDB4N0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4QzQsIDB4NkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4NkEsIC8qIDB4MTAtMHgxMyAqLworCTB4RjQsIDB4NkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4REMsIDB4RjUsIDB4REIsIDB4QzQsIDB4RUEsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4REEsIDB4RjYsIDB4RUMsIDB4RjYsIDB4RUQsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjcsIDB4RTYsIDB4RjgsIDB4QjEsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4RjYsIDB4RjksIDB4QkMsIC8qIDB4MjQtMHgyNyAqLworCTB4QzYsIDB4NzksIDB4RjksIDB4QzYsIDB4QTQsIDB4RjYsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4QUEsIDB4QTYsIDB4QUEsIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4QUMsIDB4QjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4QzAsIDB4RUYsIDB4QTQsIDB4RjcsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4QUEsIDB4QTgsIDB4QUYsIDB4NTIsIDB4QjcsIDB4REQsIDB4QTQsIDB4RjgsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4QjIsIDB4NkUsIDB4QkEsIDB4QjgsIDB4QzksIDB4NjIsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4Q0YsIDB4QjcsIDB4RDIsIDB4N0QsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4RTIsIDB4QzUsIDB4MDAsIDB4MDAsIDB4QzAsIDB4RjAsIDB4QTQsIDB4RjksIC8qIDB4NDQtMHg0NyAqLworCTB4QUEsIDB4QTksIDB4Q0YsIDB4QjgsIDB4Q0YsIDB4QjksIDB4REEsIDB4NjYsIC8qIDB4NDgtMHg0QiAqLworCTB4QjUsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4QTQsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjcsIDB4REUsIDB4RTIsIDB4QzYsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkMsIDB4RjgsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4QzMsIDB4N0MsIDB4QTQsIDB4RkEsIDB4REEsIDB4NjcsIDB4QTQsIDB4RkIsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4QTYsIDB4QzksIDB4Q0EsIDB4NDIsIDB4QTYsIDB4QzgsIC8qIDB4NUMtMHg1RiAqLworCTB4QTgsIDB4NjUsIDB4QTgsIDB4NjQsIDB4QTgsIDB4NjMsIDB4Q0IsIDB4NjAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUEsIDB4QUEsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4QUEsIDB4QUIsIDB4Q0QsIDB4NUIsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4Q0YsIDB4QkEsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4QkQsIDB4QUMsIDB4QkEsIC8qIDB4NkMtMHg2RiAqLworCTB4Q0YsIDB4QkIsIDB4MDAsIDB4MDAsIDB4QUMsIDB4QjksIDB4Q0YsIDB4QkMsIC8qIDB4NzAtMHg3MyAqLworCTB4QUMsIDB4QkIsIDB4MDAsIDB4MDAsIDB4RDIsIDB4QTIsIDB4RDIsIDB4QTEsIC8qIDB4NzQtMHg3NyAqLworCTB4RDIsIDB4N0UsIDB4QUYsIDB4NTMsIDB4MDAsIDB4MDAsIDB4RDYsIDB4NUQsIC8qIDB4NzgtMHg3QiAqLworCTB4RDYsIDB4NUUsIDB4QjIsIDB4NkYsIDB4RDYsIDB4NUMsIDB4RDYsIDB4NUYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QjUsIDB4NTIsIDB4QjIsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4QjUsIDB4NTEsIDB4REEsIDB4NkIsIDB4REEsIDB4NkEsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4REEsIDB4NjgsIDB4REEsIDB4NjksIDB4MDAsIDB4MDAsIDB4REEsIDB4NkMsIC8qIDB4ODgtMHg4QiAqLworCTB4REUsIDB4QTYsIDB4REUsIDB4QTUsIDB4REUsIDB4QTksIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4REUsIDB4QTgsIDB4REUsIDB4QTcsIDB4QkEsIDB4QjksIDB4RTIsIDB4QzksIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4QzgsIDB4QkEsIDB4QkEsIDB4RTIsIDB4QzcsIC8qIDB4OTQtMHg5NyAqLworCTB4RTYsIDB4NzMsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NzQsIDB4QkMsIDB4RjksIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4NTksIDB4RUEsIDB4NUEsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4NzIsIDB4QzMsIDB4N0QsIDB4RjIsIDB4NzEsIC8qIDB4QTAtMHhBMyAqLworCTB4RjIsIDB4NzAsIDB4RjIsIDB4NkUsIDB4RjIsIDB4NkYsIDB4QzQsIDB4RUIsIC8qIDB4QTQtMHhBNyAqLworCTB4RjQsIDB4NkMsIDB4RjYsIDB4RUUsIDB4RjgsIDB4RjcsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4QTQsIDB4RkMsIDB4MDAsIDB4MDAsIDB4QzksIDB4QTUsIDB4QTUsIDB4QzcsIC8qIDB4QUMtMHhBRiAqLworCTB4QzksIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4Q0EsIDB4NDMsIDB4Q0EsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4NjYsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4NjIsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4NjEsIC8qIDB4QkMtMHhCRiAqLworCTB4QUEsIDB4QUMsIDB4Q0IsIDB4NjUsIDB4QTgsIDB4NjcsIDB4Q0IsIDB4NjMsIC8qIDB4QzAtMHhDMyAqLworCTB4QTgsIDB4NjYsIDB4Q0IsIDB4NjcsIDB4Q0IsIDB4NjQsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4Q0QsIDB4NUYsIDB4Q0YsIDB4QkUsIDB4Q0QsIDB4NUQsIC8qIDB4QzgtMHhDQiAqLworCTB4Q0QsIDB4NjQsIDB4MDAsIDB4MDAsIDB4QUEsIDB4QUQsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4QUEsIDB4QjAsIDB4Q0QsIDB4NjUsIDB4Q0QsIDB4NjEsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4Q0QsIDB4NjIsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4NUMsIDB4QUEsIDB4QUYsIC8qIDB4RDQtMHhENyAqLworCTB4Q0QsIDB4NUUsIDB4QUEsIDB4QUUsIDB4Q0QsIDB4NjMsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4Q0QsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4QzIsIC8qIDB4REMtMHhERiAqLworCTB4QUMsIDB4QkQsIDB4QUMsIDB4QkUsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4QzUsIC8qIDB4RTAtMHhFMyAqLworCTB4Q0YsIDB4QkYsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4QzQsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4Q0YsIDB4QzAsIDB4QUMsIDB4QkMsIDB4Q0YsIDB4QzMsIDB4Q0YsIDB4QzEsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDIsIDB4QTgsIC8qIDB4RjAtMHhGMyAqLworCTB4RDIsIDB4QTUsIDB4MDAsIDB4MDAsIDB4RDIsIDB4QTcsIDB4QUYsIDB4NTgsIC8qIDB4RjQtMHhGNyAqLworCTB4QUYsIDB4NTcsIDB4QUYsIDB4NTUsIDB4RDIsIDB4QTQsIDB4RDIsIDB4QTksIC8qIDB4RjgtMHhGQiAqLworCTB4QUYsIDB4NTQsIDB4QUYsIDB4NTYsIDB4RDIsIDB4QTYsIDB4RDYsIDB4NjcsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzczWzUxMl0gPSB7CisJMHhEMiwgMHhBMywgMHhEMiwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHg2MiwgLyogMHgwNC0weDA3ICovCisJMHhENiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhENiwgMHg2NSwgMHhEQSwgMHg2RSwgLyogMHgwOC0weDBCICovCisJMHhEQSwgMHg3OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHg2OCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhENiwgMHg2MywgMHhEQSwgMHg2RCwgMHhCMiwgMHg3NCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMiwgMHg3MywgMHhENiwgMHg2MSwgLyogMHgxNC0weDE3ICovCisJMHhENiwgMHg2NCwgMHhCMiwgMHg3NSwgMHgwMCwgMHgwMCwgMHhCMiwgMHg3MiwgLyogMHgxOC0weDFCICovCisJMHhCMiwgMHg3MSwgMHhENiwgMHg2MCwgMHhENiwgMHg2OSwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQSwgMHg3MCwgMHhEQSwgMHg3NywgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhCNSwgMHg1NCwgMHhEQSwgMHg3NiwgMHhEQSwgMHg3MywgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhCNSwgMHg1NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHhEQSwgMHg3NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhEQSwgMHg2RiwgMHhEQSwgMHg3MSwgMHhEQSwgMHg3NCwgMHhEQSwgMHg3MiwgLyogMHgzMC0weDMzICovCisJMHhCNSwgMHg1NSwgMHhEQSwgMHg3OCwgMHhCNSwgMHg1MywgMHhCNywgMHhERiwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERSwgMHhBRCwgMHhERSwgMHhBQywgLyogMHgzOC0weDNCICovCisJMHhERSwgMHhBQSwgMHgwMCwgMHgwMCwgMHhCNywgMHhFMiwgMHhCNywgMHhFMSwgLyogMHgzQy0weDNGICovCisJMHhERSwgMHhBRSwgMHgwMCwgMHgwMCwgMHhERSwgMHhBQiwgMHhFMiwgMHhDQSwgLyogMHg0MC0weDQzICovCisJMHhCQSwgMHhCQiwgMHhCNywgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhERSwgMHhCMCwgMHhERSwgMHhBRiwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhFMiwgMHhDRCwgMHhFMiwgMHhDQiwgMHhCQywgMHhGQSwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhCQSwgMHhCQywgMHhFMiwgMHhDQywgMHhFNiwgMHg3NiwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQywgMHhGQiwgLyogMHg1NC0weDU3ICovCisJMHhFNiwgMHg3NSwgMHhFNiwgMHg3RSwgMHhFNiwgMHg3RCwgMHhFNiwgMHg3QiwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHg3QSwgMHhFNiwgMHg3NywgMHhFNiwgMHg3OCwgLyogMHg1Qy0weDVGICovCisJMHhFNiwgMHg3OSwgMHhFNiwgMHg3QywgMHhFNiwgMHhBMSwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHg1RiwgMHhFQSwgMHg1QywgMHhFQSwgMHg1RCwgLyogMHg2NC0weDY3ICovCisJMHhCRiwgMHg1NywgMHhFQSwgMHg1QiwgMHhFQSwgMHg2MSwgMHhFQSwgMHg2MCwgLyogMHg2OC0weDZCICovCisJMHhFQSwgMHg1RSwgMHgwMCwgMHgwMCwgMHhFRCwgMHg2NCwgMHhFRCwgMHg2NSwgLyogMHg2Qy0weDZGICovCisJMHhDMCwgMHhGMSwgMHgwMCwgMHgwMCwgMHhDMCwgMHhGMiwgMHhFRCwgMHg2MywgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhDMiwgMHg3OSwgMHhFRiwgMHhGRSwgMHhDMiwgMHg3OCwgLyogMHg3NC0weDc3ICovCisJMHhDMywgMHg3RSwgMHgwMCwgMHgwMCwgMHhDMywgMHhBMSwgMHhDNCwgMHg2RCwgLyogMHg3OC0weDdCICovCisJMHhGNCwgMHg2RSwgMHhGNCwgMHg2RCwgMHhGNSwgMHhERCwgMHhGNiwgMHhFRiwgLyogMHg3Qy0weDdGICovCisJCisJMHhDNSwgMHg3QSwgMHhGNywgMHhFOCwgMHhGNywgMHhFNywgMHhGNywgMHhFOSwgLyogMHg4MC0weDgzICovCisJMHhBNSwgMHhDOCwgMHhDRiwgMHhDNiwgMHhBRiwgMHg1OSwgMHhCMiwgMHg3NiwgLyogMHg4NC0weDg3ICovCisJMHhENiwgMHg2QSwgMHhBNSwgMHhDOSwgMHhDOSwgMHhBNywgMHhBNCwgMHhGRCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHg0NSwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHg2QywgMHhDQiwgMHg2QSwgLyogMHg5MC0weDkzICovCisJMHhDQiwgMHg2QiwgMHhDQiwgMHg2OCwgMHhBOCwgMHg2OCwgMHhDQiwgMHg2OSwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHg2RCwgMHgwMCwgMHgwMCwgMHhBQSwgMHhCMywgLyogMHg5Qy0weDlGICovCisJMHhDRCwgMHg2QiwgMHhDRCwgMHg2NywgMHhDRCwgMHg2QSwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhDRCwgMHg2NiwgMHhBQSwgMHhCNSwgMHhDRCwgMHg2OSwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhBQSwgMHhCMiwgMHhBQSwgMHhCMSwgMHgwMCwgMHgwMCwgMHhBQSwgMHhCNCwgLyogMHhBOC0weEFCICovCisJMHhDRCwgMHg2QywgMHhDRCwgMHg2OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQywgMHhDMiwgMHhBQywgMHhDNSwgLyogMHhCMC0weEIzICovCisJMHhDRiwgMHhDRSwgMHhDRiwgMHhDRCwgMHhDRiwgMHhDQywgMHhBQywgMHhCRiwgLyogMHhCNC0weEI3ICovCisJMHhDRiwgMHhENSwgMHhDRiwgMHhDQiwgMHgwMCwgMHgwMCwgMHhBQywgMHhDMSwgLyogMHhCOC0weEJCICovCisJMHhEMiwgMHhBRiwgMHgwMCwgMHgwMCwgMHhDRiwgMHhEMiwgMHhDRiwgMHhEMCwgLyogMHhCQy0weEJGICovCisJMHhBQywgMHhDNCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhDOCwgMHhDRiwgMHhEMywgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhDRiwgMHhDQSwgMHhDRiwgMHhENCwgMHhDRiwgMHhEMSwgLyogMHhDNC0weEM3ICovCisJMHhDRiwgMHhDOSwgMHgwMCwgMHgwMCwgMHhBQywgMHhDMCwgMHhDRiwgMHhENiwgLyogMHhDOC0weENCICovCisJMHhDRiwgMHhDNywgMHhBQywgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMiwgMHhCNCwgMHhEMiwgMHhBQiwgLyogMHhEMC0weEQzICovCisJMHhEMiwgMHhCNiwgMHgwMCwgMHgwMCwgMHhEMiwgMHhBRSwgMHhEMiwgMHhCOSwgLyogMHhENC0weEQ3ICovCisJMHhEMiwgMHhCQSwgMHhEMiwgMHhBQywgMHhEMiwgMHhCOCwgMHhEMiwgMHhCNSwgLyogMHhEOC0weERCICovCisJMHhEMiwgMHhCMywgMHhEMiwgMHhCNywgMHhBRiwgMHg1RiwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHhBRiwgMHg1RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMiwgMHhCMSwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhEMiwgMHhBRCwgMHgwMCwgMHgwMCwgMHhEMiwgMHhCMCwgLyogMHhFNC0weEU3ICovCisJMHhEMiwgMHhCQiwgMHhEMiwgMHhCMiwgMHhBRiwgMHg1RSwgMHhDRiwgMHhDRiwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHhBRiwgMHg1QSwgMHhBRiwgMHg1QywgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhENiwgMHg3OCwgMHhENiwgMHg2RCwgMHhENiwgMHg2QiwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHhENiwgMHg2QywgMHgwMCwgMHgwMCwgMHhENiwgMHg3MywgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHhENiwgMHg3NCwgMHhENiwgMHg3MCwgMHhCMiwgMHg3QiwgMHhENiwgMHg3NSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzRbNTEyXSA9IHsKKwkweEQ2LCAweDcyLCAweEQ2LCAweDZGLCAweDAwLCAweDAwLCAweEIyLCAweDc5LCAvKiAweDAwLTB4MDMgKi8KKwkweEQ2LCAweDZFLCAweEIyLCAweDc3LCAweEIyLCAweDdBLCAweEQ2LCAweDcxLCAvKiAweDA0LTB4MDcgKi8KKwkweEQ2LCAweDc5LCAweEFGLCAweDVCLCAweEIyLCAweDc4LCAweEQ2LCAweDc3LCAvKiAweDA4LTB4MEIgKi8KKwkweEQ2LCAweDc2LCAweEIyLCAweDdDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweDdFLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweEExLCAweEI1LCAweDYwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweERBLCAweEE3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweERBLCAweEE5LCAweERBLCAweEEyLCAweEI1LCAweDVBLCAweERBLCAweEE2LCAvKiAweDIwLTB4MjMgKi8KKwkweERBLCAweEE1LCAweEI1LCAweDVCLCAweEI1LCAweDYxLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweEI1LCAweDYyLCAweERBLCAweEE4LCAweEI1LCAweDU4LCAweERBLCAweDdELCAvKiAweDI4LTB4MkIgKi8KKwkweERBLCAweDdCLCAweERBLCAweEEzLCAweERBLCAweDdBLCAweEI1LCAweDVGLCAvKiAweDJDLTB4MkYgKi8KKwkweERBLCAweDdDLCAweERBLCAweEE0LCAweERBLCAweEFBLCAweEI1LCAweDU5LCAvKiAweDMwLTB4MzMgKi8KKwkweEI1LCAweDVFLCAweEI1LCAweDVDLCAweEI1LCAweDVELCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI1LCAweDU3LCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI3LCAweEU5LCAvKiAweDNDLTB4M0YgKi8KKwkweERFLCAweEI3LCAweEI3LCAweEU4LCAweERFLCAweEJCLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweERFLCAweEIxLCAweDAwLCAweDAwLCAweERFLCAweEJDLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweEIyLCAweERFLCAweEIzLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweERFLCAweEJELCAweERFLCAweEJBLCAweERFLCAweEI4LCAvKiAweDRDLTB4NEYgKi8KKwkweERFLCAweEI5LCAweERFLCAweEI1LCAweERFLCAweEI0LCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweERFLCAweEJFLCAweEI3LCAweEU1LCAweDAwLCAweDAwLCAweERFLCAweEI2LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEI3LCAweEVBLCAweEI3LCAweEU0LCAweEI3LCAweEVCLCAvKiAweDU4LTB4NUIgKi8KKwkweEI3LCAweEVDLCAweDAwLCAweDAwLCAweEI3LCAweEU3LCAweEI3LCAweEU2LCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweENFLCAweEJBLCAweEJFLCAvKiAweDYwLTB4NjMgKi8KKwkweEJBLCAweEJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEQzLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEJDLCAweEZDLCAweEJBLCAweEJGLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEJBLCAweEMxLCAweEUyLCAweEQ0LCAweEI3LCAweEUzLCAvKiAweDZDLTB4NkYgKi8KKwkweEJBLCAweEMwLCAweEUyLCAweEQwLCAweEUyLCAweEQyLCAweEUyLCAweENGLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEFCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEU2LCAweEFBLCAweEU2LCAweEE3LCAweEJELCAweDQwLCAweEVBLCAweDYyLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEJELCAweDQxLCAweEU2LCAweEE2LCAweDAwLCAweDAwLCAweEJDLCAweEZFLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEE4LCAweEU2LCAweEE1LCAweEU2LCAweEEyLCAvKiAweDg0LTB4ODcgKi8KKwkweEU2LCAweEE5LCAweEU2LCAweEEzLCAweEU2LCAweEE0LCAweEJDLCAweEZELCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweEVELCAweDY5LCAweDAwLCAweDAwLCAweEVBLCAweDY2LCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEVBLCAweDY1LCAweEVBLCAweDY3LCAweDAwLCAweDAwLCAweEVELCAweDY2LCAvKiAweDk0LTB4OTcgKi8KKwkweEJGLCAweDVBLCAweDAwLCAweDAwLCAweEVBLCAweDYzLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEJGLCAweDU4LCAweDAwLCAweDAwLCAweEJGLCAweDVDLCAweEJGLCAweDVCLCAvKiAweDlDLTB4OUYgKi8KKwkweEVBLCAweDY0LCAweEVBLCAweDY4LCAweDAwLCAweDAwLCAweEJGLCAweDU5LCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweEVELCAweDZELCAweEMwLCAweEY1LCAweEMyLCAweDdBLCAvKiAweEE0LTB4QTcgKi8KKwkweEMwLCAweEY2LCAweEMwLCAweEYzLCAweEVELCAweDZBLCAweEVELCAweDY4LCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweEVELCAweDZCLCAweDAwLCAweDAwLCAweEVELCAweDZFLCAvKiAweEFDLTB4QUYgKi8KKwkweEMwLCAweEY0LCAweEVELCAweDZDLCAweEVELCAweDY3LCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweDQyLCAweEYwLCAweDQ1LCAweEYyLCAweDc1LCAvKiAweEI0LTB4QjcgKi8KKwkweEYwLCAweDQwLCAweDAwLCAweDAwLCAweEY0LCAweDZGLCAweEYwLCAweDQ2LCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweEMzLCAweEEyLCAweEYwLCAweDQ0LCAweEMyLCAweDdCLCAvKiAweEJDLTB4QkYgKi8KKwkweEYwLCAweDQxLCAweEYwLCAweDQzLCAweEYwLCAweDQ3LCAweEYyLCAweDc2LCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweDc0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMzLCAweEEzLCAweEYyLCAweDczLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM0LCAweDZFLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEM0LCAweEVELCAweEY2LCAweEYxLCAweEM0LCAweEVDLCAweEY2LCAweEYzLCAvKiAweEQ0LTB4RDcgKi8KKwkweEY2LCAweEYwLCAweEY2LCAweEYyLCAweEM1LCAweEQwLCAweEY4LCAweEIyLCAvKiAweEQ4LTB4REIgKi8KKwkweEE1LCAweENBLCAweENELCAweDZFLCAweEQyLCAweEJDLCAweEQyLCAweEJELCAvKiAweERDLTB4REYgKi8KKwkweEIyLCAweDdELCAweERFLCAweEJGLCAweEJGLCAweDVELCAweEMzLCAweEE0LCAvKiAweEUwLTB4RTMgKi8KKwkweEM1LCAweDdCLCAweEY4LCAweEIzLCAweEE1LCAweENCLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweENELCAweDZGLCAweEEyLCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweENGLCAweEQ3LCAweDAwLCAweDAwLCAweENGLCAweEQ4LCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEQyLCAweEJFLCAweEQyLCAweEJGLCAweEIyLCAweDdFLCAweEIyLCAweEExLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweEFCLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweERFLCAweEMyLCAweERFLCAweEMxLCAweERFLCAweEMwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183NVs1MTJdID0geworCTB4RTIsIDB4RDUsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RDYsIDB4RTIsIDB4RDcsIC8qIDB4MDAtMHgwMyAqLworCTB4QkEsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4QUQsIC8qIDB4MDQtMHgwNyAqLworCTB4RTYsIDB4QUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4NjksIC8qIDB4MDgtMHgwQiAqLworCTB4QkYsIDB4NUUsIDB4QkYsIDB4NUYsIDB4MDAsIDB4MDAsIDB4RUQsIDB4NzIsIC8qIDB4MEMtMHgwRiAqLworCTB4RUQsIDB4NkYsIDB4RUQsIDB4NzAsIDB4RUQsIDB4NzEsIDB4RjAsIDB4NDksIC8qIDB4MTAtMHgxMyAqLworCTB4RjAsIDB4NDgsIDB4QzIsIDB4N0MsIDB4RjIsIDB4NzcsIDB4RjUsIDB4REUsIC8qIDB4MTQtMHgxNyAqLworCTB4QTUsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4QUMsIDB4QzYsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4QjIsIDB4QTIsIDB4REUsIDB4QzMsIDB4MDAsIDB4MDAsIDB4QTUsIDB4Q0QsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4RDIsIDB4QzAsIDB4QjIsIDB4QTMsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4QjUsIDB4NjMsIDB4QjUsIDB4NjQsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4QTUsIDB4Q0UsIDB4QTUsIDB4Q0YsIDB4Q0EsIDB4NDYsIDB4QTgsIDB4NkEsIC8qIDB4MjgtMHgyQiAqLworCTB4QTgsIDB4NjksIDB4QUMsIDB4QzcsIDB4Q0YsIDB4RDksIDB4REEsIDB4QUMsIC8qIDB4MkMtMHgyRiAqLworCTB4QTUsIDB4RDAsIDB4QTUsIDB4RDEsIDB4QTUsIDB4RDIsIDB4QTUsIDB4RDMsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4NkIsIC8qIDB4MzQtMHgzNyAqLworCTB4QTgsIDB4NkMsIDB4Q0IsIDB4NkUsIDB4Q0IsIDB4NkQsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4QUEsIDB4QjYsIDB4Q0QsIDB4NzIsIDB4Q0QsIDB4NzAsIC8qIDB4M0MtMHgzRiAqLworCTB4Q0QsIDB4NzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4REEsIC8qIDB4NDQtMHg0NyAqLworCTB4Q0YsIDB4REIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUMsIDB4Q0IsIC8qIDB4NDgtMHg0QiAqLworCTB4QUMsIDB4QzksIDB4MDAsIDB4MDAsIDB4QUMsIDB4Q0EsIDB4QUMsIDB4QzgsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4QUYsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4QUYsIDB4NjQsIDB4QUYsIDB4NjMsIDB4RDIsIDB4QzEsIC8qIDB4NTgtMHg1QiAqLworCTB4QUYsIDB4NjIsIDB4QUYsIDB4NjEsIDB4MDAsIDB4MDAsIDB4RDIsIDB4QzIsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjIsIDB4QTYsIDB4RDYsIDB4N0IsIC8qIDB4NjAtMHg2MyAqLworCTB4RDYsIDB4N0EsIDB4QjIsIDB4QTQsIDB4QjIsIDB4QTUsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjUsIDB4NjYsIDB4QjUsIDB4NjUsIC8qIDB4NjgtMHg2QiAqLworCTB4REEsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4QUQsIC8qIDB4NkMtMHg2RiAqLworCTB4QjIsIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjcsIDB4RUQsIDB4REUsIDB4QzUsIC8qIDB4NzQtMHg3NyAqLworCTB4QjcsIDB4RUUsIDB4REUsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4RDgsIDB4RTYsIDB4QUUsIDB4QkQsIDB4NDIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RUEsIDB4NkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4RUQsIDB4NzMsIDB4MDAsIDB4MDAsIDB4QzMsIDB4QTYsIDB4QzMsIDB4QTUsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzUsIDB4N0MsIDB4QTUsIDB4RDQsIC8qIDB4ODgtMHg4QiAqLworCTB4Q0QsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjIsIDB4QTgsIC8qIDB4OEMtMHg4RiAqLworCTB4RTIsIDB4RDksIDB4QkEsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4Q0IsIDB4NkYsIDB4Q0IsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4Q0QsIDB4NzQsIDB4QUEsIDB4QjgsIDB4QUEsIDB4QjksIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4QUEsIDB4QjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUMsIDB4Q0YsIDB4QUMsIDB4RDAsIC8qIDB4QTAtMHhBMyAqLworCTB4QUMsIDB4Q0QsIDB4QUMsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4REMsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4REQsIDB4QUMsIDB4Q0MsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4RDIsIDB4QzMsIDB4MDAsIDB4MDAsIDB4QUYsIDB4NjgsIDB4QUYsIDB4NjksIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4QjIsIDB4QUIsIDB4RDIsIDB4QzksIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4QUYsIDB4NkUsIDB4QUYsIDB4NkMsIDB4RDIsIDB4Q0EsIDB4RDIsIDB4QzUsIC8qIDB4QjgtMHhCQiAqLworCTB4QUYsIDB4NkIsIDB4QUYsIDB4NkEsIDB4QUYsIDB4NjUsIDB4RDIsIDB4QzgsIC8qIDB4QkMtMHhCRiAqLworCTB4RDIsIDB4QzcsIDB4RDIsIDB4QzQsIDB4QUYsIDB4NkQsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RDIsIDB4QzYsIDB4QUYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4QUYsIDB4NjcsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjIsIDB4QUMsIDB4RDYsIDB4QTEsIC8qIDB4QzgtMHhDQiAqLworCTB4RDYsIDB4QTIsIDB4QjIsIDB4QUQsIDB4RDYsIDB4N0MsIDB4RDYsIDB4N0UsIC8qIDB4Q0MtMHhDRiAqLworCTB4RDYsIDB4QTQsIDB4RDYsIDB4QTMsIDB4RDYsIDB4N0QsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4QjIsIDB4QTksIDB4QjIsIDB4QUEsIDB4MDAsIDB4MDAsIDB4REEsIDB4QjYsIC8qIDB4RDQtMHhENyAqLworCTB4QjUsIDB4NkIsIDB4QjUsIDB4NkEsIDB4REEsIDB4QjAsIDB4QjUsIDB4NjgsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4REEsIDB4QjMsIDB4QjUsIDB4NkMsIDB4REEsIDB4QjQsIC8qIDB4REMtMHhERiAqLworCTB4QjUsIDB4NkQsIDB4REEsIDB4QjEsIDB4QjUsIDB4NjcsIDB4QjUsIDB4NjksIC8qIDB4RTAtMHhFMyAqLworCTB4REEsIDB4QjUsIDB4MDAsIDB4MDAsIDB4REEsIDB4QjIsIDB4REEsIDB4QUYsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4REUsIDB4RDIsIDB4MDAsIDB4MDAsIDB4REUsIDB4QzcsIC8qIDB4RUMtMHhFRiAqLworCTB4QjcsIDB4RjAsIDB4QjcsIDB4RjMsIDB4QjcsIDB4RjIsIDB4QjcsIDB4RjcsIC8qIDB4RjAtMHhGMyAqLworCTB4QjcsIDB4RjYsIDB4REUsIDB4RDMsIDB4REUsIDB4RDEsIDB4REUsIDB4Q0EsIC8qIDB4RjQtMHhGNyAqLworCTB4REUsIDB4Q0UsIDB4REUsIDB4Q0QsIDB4QjcsIDB4RjQsIDB4REUsIDB4RDAsIC8qIDB4RjgtMHhGQiAqLworCTB4REUsIDB4Q0MsIDB4REUsIDB4RDQsIDB4REUsIDB4Q0IsIDB4QjcsIDB4RjUsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzc2WzUxMl0gPSB7CisJMHhCNywgMHhFRiwgMHhCNywgMHhGMSwgMHgwMCwgMHgwMCwgMHhERSwgMHhDOSwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhFMiwgMHhEQiwgMHhCQSwgMHhDNywgMHhFMiwgMHhERiwgMHhCQSwgMHhDNiwgLyogMHgwOC0weDBCICovCisJMHhFMiwgMHhEQywgMHhCQSwgMHhDNSwgMHgwMCwgMHgwMCwgMHhERSwgMHhDOCwgLyogMHgwQy0weDBGICovCisJMHhERSwgMHhDRiwgMHhFMiwgMHhERSwgMHgwMCwgMHgwMCwgMHhCQSwgMHhDOCwgLyogMHgxMC0weDEzICovCisJMHhFMiwgMHhFMCwgMHhFMiwgMHhERCwgMHhFMiwgMHhEQSwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhCMSwgMHhFNiwgMHhCNSwgMHhFNiwgMHhCNywgLyogMHgxOC0weDFCICovCisJMHhFNiwgMHhCMywgMHhFNiwgMHhCMiwgMHhFNiwgMHhCMCwgMHhCRCwgMHg0NSwgLyogMHgxQy0weDFGICovCisJMHhCRCwgMHg0MywgMHhCRCwgMHg0OCwgMHhCRCwgMHg0OSwgMHhFNiwgMHhCNCwgLyogMHgyMC0weDIzICovCisJMHhCRCwgMHg0NiwgMHhFNiwgMHhBRiwgMHhCRCwgMHg0NywgMHhCQSwgMHhDNCwgLyogMHgyNC0weDI3ICovCisJMHhFNiwgMHhCNiwgMHhCRCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHg2QywgMHgwMCwgMHgwMCwgMHhFQSwgMHg2QiwgLyogMHgyQy0weDJGICovCisJMHhFQSwgMHg3MywgMHhFQSwgMHg2RCwgMHhFQSwgMHg3MiwgMHhFQSwgMHg2RiwgLyogMHgzMC0weDMzICovCisJMHhCRiwgMHg2MCwgMHhFQSwgMHg3MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhCRiwgMHg2MSwgMHgwMCwgMHgwMCwgMHhCRiwgMHg2MiwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhFQSwgMHg3MCwgMHhFQSwgMHg2RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMCwgMHhGOCwgMHhFRCwgMHg3NCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMCwgMHhGNywgMHhFRCwgMHg3NywgLyogMHg0NC0weDQ3ICovCisJMHhFRCwgMHg3NSwgMHhFRCwgMHg3NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhDMCwgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhGMCwgMHg0RCwgMHgwMCwgMHgwMCwgMHhDMiwgMHhBMSwgMHhGMCwgMHg0RSwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMiwgMHg3RCwgMHhGMCwgMHg0RiwgLyogMHg1NC0weDU3ICovCisJMHhDMiwgMHg3RSwgMHhGMCwgMHg0QywgMHhGMCwgMHg1MCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHhGMCwgMHg0QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMywgMHhBNywgLyogMHg1Qy0weDVGICovCisJMHhGMiwgMHg3OCwgMHhDMywgMHhBOCwgMHhDNCwgMHg2RiwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhGMCwgMHg0QiwgMHhDNCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhDNCwgMHhFRSwgMHhGNSwgMHhERiwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhDNSwgMHg3RSwgMHhGNiwgMHhGNCwgMHhDNSwgMHg3RCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhGNywgMHhFQSwgMHhDNSwgMHhGNSwgMHhDNSwgMHhGNiwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhGOSwgMHhDQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHhBQywgMHhEMSwgMHhDRiwgMHhERSwgMHgwMCwgMHgwMCwgMHhCNSwgMHg2RSwgLyogMHg3OC0weDdCICovCisJMHhCNSwgMHg2RiwgMHhBNSwgMHhENSwgMHhBNiwgMHhDQSwgMHhDQSwgMHg0NywgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhDQiwgMHg3MSwgMHhBOCwgMHg2RCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhBQSwgMHhCQSwgMHgwMCwgMHgwMCwgMHhBQywgMHhEMiwgMHhBQywgMHhEMywgLyogMHg4NC0weDg3ICovCisJMHhBQywgMHhENCwgMHhENiwgMHhBNiwgMHhEMiwgMHhDQiwgMHhBRiwgMHg2RiwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMiwgMHhBRSwgMHhENiwgMHhBNSwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQSwgMHhCOCwgMHhCNSwgMHg3MSwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhEQSwgMHhCNywgMHhCNSwgMHg3MCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHhERSwgMHhENSwgMHhCRCwgMHg0QSwgMHhFNiwgMHhCQiwgLyogMHg5OC0weDlCICovCisJMHhFNiwgMHhCOCwgMHhFNiwgMHhCOSwgMHhFNiwgMHhCQSwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhFRCwgMHg3OCwgMHgwMCwgMHgwMCwgMHhGMCwgMHg1MSwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHg3MSwgMHhGNCwgMHg3MCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhGNSwgMHhBNSwgMHhENiwgMHhDRCwgMHg3NSwgLyogMHhBQy0weEFGICovCisJMHhBRiwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHhCNSwgMHg3MiwgMHhERSwgMHhENiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhFMiwgMHhFMSwgMHgwMCwgMHgwMCwgMHhCRCwgMHg0QiwgMHhFQSwgMHg3NCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHg1MiwgMHhGNCwgMHg3MiwgMHhBNSwgMHhENywgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQSwgMHhCQiwgMHhBQywgMHhENywgLyogMHhDMC0weEMzICovCisJMHhDRiwgMHhERiwgMHhBQywgMHhEOCwgMHhBQywgMHhENiwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHhBQywgMHhENSwgMHhEMiwgMHhDQywgMHhBRiwgMHg3MSwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhBRiwgMHg3MiwgMHhBRiwgMHg3MywgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMiwgMHhCMCwgMHhENiwgMHhBNywgLyogMHhEMC0weEQzICovCisJMHhCMiwgMHhBRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQSwgMHhCOSwgMHhCMiwgMHhCMSwgLyogMHhEOC0weERCICovCisJMHhCNSwgMHg3MywgMHhERSwgMHhENywgMHhCNywgMHhGOCwgMHhCNywgMHhGOSwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhCQSwgMHhDOSwgMHgwMCwgMHgwMCwgMHhCQSwgMHhDQSwgLyogMHhFMC0weEUzICovCisJMHhCRCwgMHg0QywgMHhCRiwgMHg2NCwgMHhFQSwgMHg3NSwgMHhCRiwgMHg2MywgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHg3OSwgMHhDMCwgMHhGQSwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHhGMCwgMHg1MywgMHhGNCwgMHg3MywgMHhBNSwgMHhEOCwgMHhBOCwgMHg2RSwgLyogMHhFQy0weEVGICovCisJMHhDRCwgMHg3OCwgMHhDRCwgMHg3NywgMHhBQSwgMHhCQywgMHhDRCwgMHg3NiwgLyogMHhGMC0weEYzICovCisJMHhBQSwgMHhCRCwgMHhDRCwgMHg3OSwgMHgwMCwgMHgwMCwgMHhDRiwgMHhFNSwgLyogMHhGNC0weEY3ICovCisJMHhBQywgMHhEQiwgMHhBQywgMHhEQSwgMHhDRiwgMHhFNywgMHhDRiwgMHhFNiwgLyogMHhGOC0weEZCICovCisJMHhBQywgMHhERiwgMHgwMCwgMHgwMCwgMHhBQywgMHhERSwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzdbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEFDLCAweEQ5LCAweDAwLCAweDAwLCAweENGLCAweEUxLCAvKiAweDAwLTB4MDMgKi8KKwkweENGLCAweEUyLCAweENGLCAweEUzLCAweDAwLCAweDAwLCAweEFDLCAweEUwLCAvKiAweDA0LTB4MDcgKi8KKwkweENGLCAweEUwLCAweEFDLCAweERDLCAweENGLCAweEU0LCAweEFDLCAweERELCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEQyLCAweENGLCAweEQyLCAweEQzLCAweEQyLCAweEQxLCAweEQyLCAweEQwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweEQyLCAweEQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEQyLCAweEQ1LCAweEQyLCAweEQ2LCAweEQyLCAweENFLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweEQyLCAweENELCAweDAwLCAweDAwLCAweEFGLCAweDc1LCAvKiAweDFDLTB4MUYgKi8KKwkweEFGLCAweDc2LCAweDAwLCAweDAwLCAweEQyLCAweEQ3LCAweEQyLCAweEQyLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEQ2LCAweEIwLCAweDAwLCAweDAwLCAweEQyLCAweEQ4LCAvKiAweDI0LTB4MjcgKi8KKwkweEFGLCAweDc3LCAweEFGLCAweDc0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweEQ2LCAweEFBLCAweDAwLCAweDAwLCAweEQ2LCAweEE5LCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEQ2LCAweEFCLCAweEQ2LCAweEFDLCAweEQ2LCAweEFFLCAvKiAweDMwLTB4MzMgKi8KKwkweEQ2LCAweEFELCAweEQ2LCAweEIyLCAweEIyLCAweEI1LCAweEIyLCAweEIyLCAvKiAweDM0LTB4MzcgKi8KKwkweEIyLCAweEI2LCAweEQ2LCAweEE4LCAweEIyLCAweEI3LCAweEQ2LCAweEIxLCAvKiAweDM4LTB4M0IgKi8KKwkweEIyLCAweEI0LCAweEQ2LCAweEFGLCAweEIyLCAweEIzLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweERBLCAweEJDLCAweERBLCAweEJFLCAweERBLCAweEJBLCAweERBLCAweEJCLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweEJGLCAweERBLCAweEMxLCAvKiAweDQ4LTB4NEIgKi8KKwkweERBLCAweEMyLCAweERBLCAweEJELCAweERBLCAweEMwLCAweEI1LCAweDc0LCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweERCLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweERFLCAweEUwLCAweERFLCAweEQ4LCAweERFLCAweERDLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweERFLCAweEUxLCAweERFLCAweERELCAweEI3LCAweEZBLCAvKiAweDU4LTB4NUIgKi8KKwkweEI4LCAweDQzLCAweDAwLCAweDAwLCAweEI3LCAweEZELCAweERFLCAweEQ5LCAvKiAweDVDLTB4NUYgKi8KKwkweERFLCAweERBLCAweEJBLCAweENFLCAweEI4LCAweDQ2LCAweEI3LCAweEZFLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweEI4LCAweDQ0LCAweEI3LCAweEZDLCAweERFLCAweERGLCAvKiAweDY0LTB4NjcgKi8KKwkweEI4LCAweDQ1LCAweERFLCAweERFLCAweEI4LCAweDQxLCAweEI3LCAweEZCLCAvKiAweDY4LTB4NkIgKi8KKwkweEI4LCAweDQyLCAweERFLCAweEUyLCAweEUyLCAweEU2LCAweEUyLCAweEU4LCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEI4LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEUyLCAweEUzLCAweEJBLCAweENDLCAweEUyLCAweEU5LCAweEJBLCAweENELCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEUyLCAweEU3LCAweEUyLCAweEUyLCAweEUyLCAweEU1LCAweEUyLCAweEVBLCAvKiAweDgwLTB4ODMgKi8KKwkweEJBLCAweENCLCAweEUyLCAweEU0LCAweDAwLCAweDAwLCAweEJELCAweDRFLCAvKiAweDg0LTB4ODcgKi8KKwkweEU2LCAweEJGLCAweEU2LCAweEJFLCAweDAwLCAweDAwLCAweEJELCAweDUxLCAvKiAweDg4LTB4OEIgKi8KKwkweEJELCAweDRGLCAweEU2LCAweEJDLCAweEJELCAweDRELCAweEU2LCAweEJELCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEJELCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweDdELCAweDAwLCAweDAwLCAweEVBLCAweEExLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweDdFLCAweEVBLCAweDc2LCAweEVBLCAweDdBLCAvKiAweDk4LTB4OUIgKi8KKwkweEVBLCAweDc5LCAweEVBLCAweDc3LCAweEJGLCAweDY2LCAweEJGLCAweDY3LCAvKiAweDlDLTB4OUYgKi8KKwkweEJGLCAweDY1LCAweEVBLCAweDc4LCAweEVBLCAweDdCLCAweEVBLCAweDdDLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweEJGLCAweDY4LCAweDAwLCAweDAwLCAweEMxLCAweDQwLCAvKiAweEE0LTB4QTcgKi8KKwkweEVELCAweEEzLCAweDAwLCAweDAwLCAweEMwLCAweEZDLCAweEVELCAweDdCLCAvKiAweEE4LTB4QUIgKi8KKwkweEMwLCAweEZFLCAweEMxLCAweDQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweEMwLCAweEZELCAweEVELCAweEEyLCAweEVELCAweDdDLCAweEMwLCAweEZCLCAvKiAweEIwLTB4QjMgKi8KKwkweEVELCAweEExLCAweEVELCAweDdBLCAweEVELCAweDdFLCAweEVELCAweDdELCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweDU1LCAweEMyLCAweEE0LCAvKiAweEI4LTB4QkIgKi8KKwkweEMyLCAweEE1LCAweEMyLCAweEEyLCAweDAwLCAweDAwLCAweEMyLCAweEEzLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweDU0LCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEYyLCAweDdCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMzLCAweEE5LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweDc5LCAweEYyLCAweDdBLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEY0LCAweDc0LCAweEY0LCAweDc3LCAweEY0LCAweDc1LCAweEY0LCAweDc2LCAvKiAweENDLTB4Q0YgKi8KKwkweEY1LCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM0LCAweEVGLCAvKiAweEQwLTB4RDMgKi8KKwkweEY3LCAweEVCLCAweEY4LCAweEI0LCAweDAwLCAweDAwLCAweEM1LCAweEY3LCAvKiAweEQ0LTB4RDcgKi8KKwkweEY4LCAweEY4LCAweEY4LCAweEY5LCAweEM2LCAweDY2LCAweEE1LCAweEQ5LCAvKiAweEQ4LTB4REIgKi8KKwkweEFDLCAweEUxLCAweDAwLCAweDAwLCAweERBLCAweEMzLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweERFLCAweEUzLCAweDAwLCAweDAwLCAweEE1LCAweERBLCAweEE4LCAweDZGLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweEFBLCAweEJFLCAweDAwLCAweDAwLCAweENGLCAweEU4LCAvKiAweEU0LTB4RTcgKi8KKwkweENGLCAweEU5LCAweEFGLCAweDc4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweERBLCAweEM0LCAweEI1LCAweDc1LCAweEI4LCAweDQ3LCAweEMxLCAweDQyLCAvKiAweEVDLTB4RUYgKi8KKwkweEVELCAweEE0LCAweEYyLCAweDdDLCAweEY0LCAweDc4LCAweEE1LCAweERCLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENELCAweEExLCAvKiAweEY0LTB4RjcgKi8KKwkweENELCAweDdBLCAweENELCAweDdDLCAweENELCAweDdFLCAweENELCAweDdELCAvKiAweEY4LTB4RkIgKi8KKwkweENELCAweDdCLCAweEFBLCAweEJGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183OFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUMsIDB4RTIsIDB4Q0YsIDB4RjIsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4Q0YsIDB4RUQsIDB4Q0YsIDB4RUEsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4Q0YsIDB4RjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4QUMsIDB4RTQsIDB4QUMsIDB4RTUsIDB4Q0YsIDB4RjAsIDB4Q0YsIDB4RUYsIC8qIDB4MEMtMHgwRiAqLworCTB4Q0YsIDB4RUUsIDB4Q0YsIDB4RUIsIDB4Q0YsIDB4RUMsIDB4Q0YsIDB4RjMsIC8qIDB4MTAtMHgxMyAqLworCTB4QUMsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4QUYsIDB4N0MsIDB4MDAsIDB4MDAsIDB4QUYsIDB4QTQsIC8qIDB4MUMtMHgxRiAqLworCTB4QUYsIDB4QTMsIDB4RDIsIDB4RTEsIDB4RDIsIDB4REIsIDB4RDIsIDB4RDksIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4QUYsIDB4QTEsIDB4RDYsIDB4QjksIDB4QUYsIDB4N0EsIC8qIDB4MjQtMHgyNyAqLworCTB4RDIsIDB4REUsIDB4RDIsIDB4RTIsIDB4RDIsIDB4RTQsIDB4RDIsIDB4RTAsIC8qIDB4MjgtMHgyQiAqLworCTB4RDIsIDB4REEsIDB4QUYsIDB4QTIsIDB4RDIsIDB4REYsIDB4RDIsIDB4REQsIC8qIDB4MkMtMHgyRiAqLworCTB4QUYsIDB4NzksIDB4RDIsIDB4RTUsIDB4QUYsIDB4QTUsIDB4RDIsIDB4RTMsIC8qIDB4MzAtMHgzMyAqLworCTB4QUYsIDB4N0QsIDB4RDIsIDB4REMsIDB4MDAsIDB4MDAsIDB4QUYsIDB4N0UsIC8qIDB4MzQtMHgzNyAqLworCTB4QUYsIDB4N0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjIsIDB4QjksIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4RDYsIDB4QkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RDYsIDB4QjMsIDB4RDYsIDB4QjUsIDB4RDYsIDB4QjcsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4RDYsIDB4QjgsIDB4RDYsIDB4QjYsIDB4QjIsIDB4QkEsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4RDYsIDB4QkIsIDB4MDAsIDB4MDAsIDB4RDYsIDB4QjQsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4REEsIDB4QzgsIDB4QjUsIDB4NzYsIDB4REEsIDB4RDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4REEsIDB4QzUsIDB4MDAsIDB4MDAsIDB4REEsIDB4RDEsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4REEsIDB4QzYsIDB4REEsIDB4QzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4REEsIDB4Q0YsIDB4REEsIDB4Q0UsIDB4REEsIDB4Q0IsIDB4QjIsIDB4QjgsIC8qIDB4NjgtMHg2QiAqLworCTB4QjUsIDB4NzcsIDB4REEsIDB4QzksIDB4REEsIDB4Q0MsIDB4QjUsIDB4NzgsIC8qIDB4NkMtMHg2RiAqLworCTB4REEsIDB4Q0QsIDB4REEsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4REUsIDB4RUUsIDB4MDAsIDB4MDAsIDB4REUsIDB4RjIsIC8qIDB4NzgtMHg3QiAqLworCTB4QjgsIDB4NEUsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RjAsIDB4QjgsIDB4NTEsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4REUsIDB4RjAsIDB4RjksIDB4RDYsIDB4MDAsIDB4MDAsIDB4REUsIDB4RUQsIC8qIDB4ODAtMHg4MyAqLworCTB4REUsIDB4RTgsIDB4REUsIDB4RUEsIDB4REUsIDB4RUIsIDB4REUsIDB4RTQsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4QjgsIDB4NEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4QjgsIDB4NEMsIDB4MDAsIDB4MDAsIDB4QjgsIDB4NDgsIDB4REUsIDB4RTcsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4QjgsIDB4NEYsIDB4MDAsIDB4MDAsIDB4QjgsIDB4NTAsIC8qIDB4OTAtMHg5MyAqLworCTB4REUsIDB4RTYsIDB4REUsIDB4RTksIDB4REUsIDB4RjEsIDB4QjgsIDB4NEEsIC8qIDB4OTQtMHg5NyAqLworCTB4QjgsIDB4NEIsIDB4REUsIDB4RUYsIDB4REUsIDB4RTUsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RjIsIDB4QkEsIDB4RDAsIC8qIDB4OUMtMHg5RiAqLworCTB4RTIsIDB4RjQsIDB4REUsIDB4RUMsIDB4RTIsIDB4RjYsIDB4QkEsIDB4RDQsIC8qIDB4QTAtMHhBMyAqLworCTB4RTIsIDB4RjcsIDB4RTIsIDB4RjMsIDB4MDAsIDB4MDAsIDB4QkEsIDB4RDEsIC8qIDB4QTQtMHhBNyAqLworCTB4RTIsIDB4RUYsIDB4QkEsIDB4RDMsIDB4RTIsIDB4RUMsIDB4RTIsIDB4RjEsIC8qIDB4QTgtMHhBQiAqLworCTB4RTIsIDB4RjUsIDB4RTIsIDB4RUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4QjgsIDB4NDksIDB4MDAsIDB4MDAsIDB4RTIsIDB4RUIsIDB4QkEsIDB4RDIsIC8qIDB4QjAtMHhCMyAqLworCTB4RTIsIDB4RUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkQsIDB4NTQsIDB4RTYsIDB4QzEsIC8qIDB4QjgtMHhCQiAqLworCTB4QkQsIDB4NTgsIDB4MDAsIDB4MDAsIDB4QkQsIDB4NTYsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4QkEsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4RTYsIDB4QzgsIC8qIDB4QzAtMHhDMyAqLworCTB4RTYsIDB4QzksIDB4QkQsIDB4NTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4RTYsIDB4QzcsIDB4RTYsIDB4Q0EsIDB4QkQsIDB4NTUsIDB4QkQsIDB4NTIsIC8qIDB4QzgtMHhDQiAqLworCTB4RTYsIDB4QzMsIDB4RTYsIDB4QzAsIDB4RTYsIDB4QzUsIDB4RTYsIDB4QzIsIC8qIDB4Q0MtMHhDRiAqLworCTB4QkQsIDB4NTksIDB4RTYsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RTYsIDB4QzYsIDB4QkQsIDB4NTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkYsIDB4NkEsIDB4RUEsIDB4QTgsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4QTIsIDB4RUEsIDB4QTYsIDB4RUEsIDB4QUMsIC8qIDB4REMtMHhERiAqLworCTB4RUEsIDB4QUQsIDB4RUEsIDB4QTksIDB4RUEsIDB4QUEsIDB4RUEsIDB4QTcsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4QTQsIDB4MDAsIDB4MDAsIDB4QkYsIDB4NkMsIC8qIDB4RTQtMHhFNyAqLworCTB4QkYsIDB4NjksIDB4RUEsIDB4QTMsIDB4RUEsIDB4QTUsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4QkYsIDB4NkIsIDB4RUEsIDB4QUIsIDB4MDAsIDB4MDAsIDB4QzEsIDB4NDYsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4QUEsIDB4RUQsIDB4QTUsIC8qIDB4RjAtMHhGMyAqLworCTB4QzEsIDB4NDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzEsIDB4NDMsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4QUMsIDB4QzEsIDB4NDQsIDB4RUQsIDB4QTgsIC8qIDB4RjgtMHhGQiAqLworCTB4RUQsIDB4QTksIDB4RUQsIDB4QTYsIDB4RUQsIDB4QUQsIDB4RjAsIDB4NTYsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzc5WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhDMSwgMHg0NywgMHhFRCwgMHhBNywgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhFRCwgMHhBRSwgMHhFRCwgMHhBQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHg1QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhGMCwgMHg1NywgMHgwMCwgMHgwMCwgMHhDMiwgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhGMCwgMHg1QiwgMHhGMCwgMHg1RCwgMHhGMCwgMHg1QywgMHhGMCwgMHg1OCwgLyogMHgxMC0weDEzICovCisJMHhGMCwgMHg1OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhBMywgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhDMywgMHhBQSwgMHgwMCwgMHgwMCwgMHhGMiwgMHg3RSwgLyogMHgxOC0weDFCICovCisJMHhGMiwgMHhBMiwgMHhGMiwgMHg3RCwgMHhGMiwgMHhBNCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhGMiwgMHhBMSwgMHgwMCwgMHgwMCwgMHhGNCwgMHg3QSwgLyogMHgyMC0weDIzICovCisJMHhGNCwgMHg3RCwgMHhGNCwgMHg3OSwgMHhDNCwgMHg3MSwgMHhGNCwgMHg3QiwgLyogMHgyNC0weDI3ICovCisJMHhGNCwgMHg3QywgMHhGNCwgMHg3RSwgMHhDNCwgMHg3MiwgMHhDNCwgMHg3NCwgLyogMHgyOC0weDJCICovCisJMHhDNCwgMHg3MywgMHhGNSwgMHhFMSwgMHgwMCwgMHgwMCwgMHhGNSwgMHhFMywgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhFMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhGNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhGOCwgMHhCNSwgMHhGOCwgMHhGQSwgMHhBNSwgMHhEQywgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhDQiwgMHg3MiwgMHhBQSwgMHhDMCwgMHhDRCwgMHhBMywgLyogMHgzQy0weDNGICovCisJMHhBQSwgMHhDMSwgMHhBQSwgMHhDMiwgMHhDRCwgMHhBMiwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhDRiwgMHhGOCwgMHhDRiwgMHhGNywgMHhBQywgMHhFNiwgMHhBQywgMHhFOSwgLyogMHg0NC0weDQ3ICovCisJMHhBQywgMHhFOCwgMHhBQywgMHhFNywgMHhDRiwgMHhGNCwgMHhDRiwgMHhGNiwgLyogMHg0OC0weDRCICovCisJMHhDRiwgMHhGNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMiwgMHhFOCwgLyogMHg0Qy0weDRGICovCisJMHhBRiwgMHhBNywgMHhEMiwgMHhFQywgMHhEMiwgMHhFQiwgMHhEMiwgMHhFQSwgLyogMHg1MC0weDUzICovCisJMHhEMiwgMHhFNiwgMHhBRiwgMHhBNiwgMHhBRiwgMHhBQSwgMHhBRiwgMHhBRCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBRiwgMHhBRSwgMHhEMiwgMHhFNywgLyogMHg1OC0weDVCICovCisJMHhEMiwgMHhFOSwgMHhBRiwgMHhBQywgMHhBRiwgMHhBQiwgMHhBRiwgMHhBOSwgLyogMHg1Qy0weDVGICovCisJMHhBRiwgMHhBOCwgMHhENiwgMHhDMiwgMHgwMCwgMHgwMCwgMHhENiwgMHhDMCwgLyogMHg2MC0weDYzICovCisJMHhENiwgMHhCQywgMHhCMiwgMHhCQiwgMHgwMCwgMHgwMCwgMHhENiwgMHhCRCwgLyogMHg2NC0weDY3ICovCisJMHhCMiwgMHhCQywgMHhENiwgMHhCRSwgMHhENiwgMHhCRiwgMHhENiwgMHhDMSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhCMiwgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhEQSwgMHhENSwgMHgwMCwgMHgwMCwgMHhEQSwgMHhENCwgMHhEQSwgMHhEMywgLyogMHg3MC0weDczICovCisJMHhEQSwgMHhEMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhERSwgMHhGNiwgMHhCOCwgMHg1MiwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhERSwgMHhGMywgMHhERSwgMHhGNSwgMHgwMCwgMHgwMCwgMHhCOCwgMHg1MywgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhCOCwgMHg1NCwgMHhERSwgMHhGNCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhFMywgMHg0MSwgMHgwMCwgMHgwMCwgMHhFMiwgMHhGOSwgMHhFMiwgMHhGQSwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhCQSwgMHhENywgMHhCQSwgMHhENSwgMHhCQSwgMHhENiwgLyogMHg4Qy0weDhGICovCisJMHhFMywgMHg0MywgMHgwMCwgMHgwMCwgMHhFMywgMHg0MiwgMHhFMiwgMHhGRSwgLyogMHg5MC0weDkzICovCisJMHhFMiwgMHhGRCwgMHhFMiwgMHhGQywgMHhFMiwgMHhGQiwgMHhFMywgMHg0MCwgLyogMHg5NC0weDk3ICovCisJMHhFMiwgMHhGOCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhDQiwgMHhFNiwgMHhEMCwgLyogMHg5OC0weDlCICovCisJMHhFNiwgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhFNiwgMHhDRCwgMHhFNiwgMHhDQywgMHhFNiwgMHhDRiwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhFQSwgMHhBRSwgMHgwMCwgMHgwMCwgMHhCRiwgMHg2RCwgMHhDMSwgMHg0OCwgLyogMHhBNC0weEE3ICovCisJMHhFRCwgMHhCMCwgMHgwMCwgMHgwMCwgMHhDMSwgMHg0OSwgMHhFRCwgMHhBRiwgLyogMHhBOC0weEFCICovCisJMHhGMCwgMHg1RiwgMHhGMCwgMHg1RSwgMHhDMiwgMHhBNywgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhGMiwgMHhBNSwgMHhDMywgMHhBQiwgMHhGNCwgMHhBMSwgMHhDNSwgMHhBMSwgLyogMHhCMC0weEIzICovCisJMHhGNiwgMHhGNywgMHgwMCwgMHgwMCwgMHhGOCwgMHhCNywgMHhGOCwgMHhCNiwgLyogMHhCNC0weEI3ICovCisJMHhDOSwgMHhBOCwgMHhBQywgMHhFQSwgMHhBQywgMHhFQiwgMHhENiwgMHhDMywgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhCOCwgMHg1NiwgMHhBNSwgMHhERCwgMHhBOCwgMHg3MiwgLyogMHhCQy0weEJGICovCisJMHhBOCwgMHg3MSwgMHhBOCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHhBQSwgMHhDNCwgMHhBQSwgMHhDMywgMHgwMCwgMHgwMCwgMHhBQywgMHhFRSwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhDRiwgMHhGQSwgMHhDRiwgMHhGRCwgMHhDRiwgMHhGQiwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhBQywgMHhFQywgMHhBQywgMHhFRCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhDRiwgMHhGOSwgMHhDRiwgMHhGQywgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhBRiwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhEMiwgMHhGMywgMHhEMiwgMHhGNSwgMHhEMiwgMHhGNCwgMHhBRiwgMHhCMiwgLyogMHhEQy0weERGICovCisJMHhEMiwgMHhFRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBRiwgMHhCMCwgLyogMHhFMC0weEUzICovCisJMHhBRiwgMHhBRiwgMHgwMCwgMHgwMCwgMHhBRiwgMHhCMywgMHhBRiwgMHhCMSwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhBRiwgMHhCNCwgMHhEMiwgMHhGMiwgMHhEMiwgMHhFRCwgLyogMHhFOC0weEVCICovCisJMHhEMiwgMHhFRSwgMHhEMiwgMHhGMSwgMHhEMiwgMHhGMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhDNiwgMHhENiwgMHhDNywgLyogMHhGNC0weEY3ICovCisJMHhENiwgMHhDNSwgMHgwMCwgMHgwMCwgMHhENiwgMHhDNCwgMHhCMiwgMHhCRSwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfN0FbNTEyXSA9IHsKKwkweEI1LCAweDdELCAweDAwLCAweDAwLCAweERBLCAweEQ2LCAweERBLCAweEQ4LCAvKiAweDAwLTB4MDMgKi8KKwkweERBLCAweERBLCAweEI1LCAweDdDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEI1LCAweDdBLCAweDAwLCAweDAwLCAweERBLCAweEQ3LCAweEI1LCAweDdCLCAvKiAweDA4LTB4MEIgKi8KKwkweERBLCAweEQ5LCAweEI1LCAweDc5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweERGLCAweDQxLCAweERFLCAweEY3LCAweERFLCAweEZBLCAweERFLCAweEZFLCAvKiAweDEwLTB4MTMgKi8KKwkweEI4LCAweDVBLCAweERFLCAweEZDLCAweDAwLCAweDAwLCAweERFLCAweEZCLCAvKiAweDE0LTB4MTcgKi8KKwkweERFLCAweEY4LCAweERFLCAweEY5LCAweEI4LCAweDU4LCAweERGLCAweDQwLCAvKiAweDE4LTB4MUIgKi8KKwkweEI4LCAweDU3LCAweDAwLCAweDAwLCAweEI4LCAweDVDLCAweEI4LCAweDVCLCAvKiAweDFDLTB4MUYgKi8KKwkweEI4LCAweDU5LCAweDAwLCAweDAwLCAweERFLCAweEZELCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweDQ5LCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweEUzLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweDQ0LCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJBLCAweEQ4LCAweEUzLCAweDQ3LCAvKiAweDJDLTB4MkYgKi8KKwkweEUzLCAweDQ2LCAweEJBLCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJELCAweDVFLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEQyLCAweDAwLCAweDAwLCAweEJELCAweDVGLCAvKiAweDM4LTB4M0IgKi8KKwkweEJELCAweDVCLCAweEJELCAweDVELCAweDAwLCAweDAwLCAweEJELCAweDVBLCAvKiAweDNDLTB4M0YgKi8KKwkweEJELCAweDVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEVBLCAweEFGLCAweDAwLCAweDAwLCAweEJGLCAweDcwLCAweEVBLCAweEIxLCAvKiAweDQ0LTB4NDcgKi8KKwkweEVBLCAweEIwLCAweDAwLCAweDAwLCAweEUzLCAweDQ1LCAweEJGLCAweDcyLCAvKiAweDQ4LTB4NEIgKi8KKwkweEJGLCAweDcxLCAweEJGLCAweDZFLCAweEJGLCAweDZGLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweEVELCAweEI1LCAweDAwLCAweDAwLCAweEVELCAweEIzLCAweEMxLCAweDRBLCAvKiAweDU0LTB4NTcgKi8KKwkweEVELCAweEI0LCAweDAwLCAweDAwLCAweEVELCAweEI2LCAweEVELCAweEIyLCAvKiAweDU4LTB4NUIgKi8KKwkweEVELCAweEIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweDYwLCAvKiAweDVDLTB4NUYgKi8KKwkweEMyLCAweEFBLCAweEMyLCAweEE4LCAweEMyLCAweEE5LCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweEE2LCAvKiAweDY0LTB4NjcgKi8KKwkweEYyLCAweEE3LCAweEMzLCAweEFELCAweDAwLCAweDAwLCAweEMzLCAweEFDLCAvKiAweDY4LTB4NkIgKi8KKwkweEY0LCAweEEzLCAweEY0LCAweEE0LCAweEY0LCAweEEyLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEY2LCAweEY4LCAweEY2LCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEE1LCAweERFLCAweENBLCAweDQ4LCAweEE4LCAweDczLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweENELCAweEE1LCAweEFBLCAweEM2LCAweEFBLCAweEM1LCAweENELCAweEE2LCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweDQwLCAweEFDLCAweEVGLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweENGLCAweEZFLCAweEFDLCAweEYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEFGLCAweEI2LCAweEQyLCAweEY4LCAweEQyLCAweEY2LCAweEQyLCAweEZDLCAvKiAweDg0LTB4ODcgKi8KKwkweEFGLCAweEI3LCAweEQyLCAweEY3LCAweEQyLCAweEZCLCAweEQyLCAweEY5LCAvKiAweDg4LTB4OEIgKi8KKwkweEQyLCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEM4LCAvKiAweDhDLTB4OEYgKi8KKwkweEQ2LCAweENBLCAweDAwLCAweDAwLCAweEIyLCAweEJGLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEQ2LCAweEM5LCAweEIyLCAweEMwLCAweEI1LCAweEEyLCAweEI1LCAweEExLCAvKiAweDk0LTB4OTcgKi8KKwkweEI1LCAweDdFLCAweERBLCAweERCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweDQ0LCAweEI4LCAweDVELCAvKiAweDlDLTB4OUYgKi8KKwkweEI4LCAweDVFLCAweDAwLCAweDAwLCAweERGLCAweDQzLCAweERGLCAweDQyLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEUzLCAweDRBLCAweEJBLCAweERCLCAweEJBLCAweERBLCAweEUzLCAweDRCLCAvKiAweEE4LTB4QUIgKi8KKwkweEUzLCAweDRDLCAweDAwLCAweDAwLCAweEJELCAweDYxLCAweEJELCAweDYwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweEI1LCAweEU2LCAweEQzLCAweEU2LCAweEQ1LCAvKiAweEIwLTB4QjMgKi8KKwkweEU2LCAweEQ0LCAweEVBLCAweEI0LCAweEVBLCAweEIyLCAweEVBLCAweEI2LCAvKiAweEI0LTB4QjcgKi8KKwkweEVBLCAweEIzLCAweDAwLCAweDAwLCAweEJGLCAweDczLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEI3LCAweEMxLCAweDRCLCAvKiAweEJDLTB4QkYgKi8KKwkweEVELCAweEI4LCAweEVELCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEMyLCAweEFCLCAweEMyLCAweEFDLCAweDAwLCAweDAwLCAweEM0LCAweDc1LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM1LCAweEQxLCAweEE1LCAweERGLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEQwLCAweDQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEQyLCAweEZELCAweEFGLCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIzLCAweEJBLCAvKiAweERDLTB4REYgKi8KKwkweEIzLCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI1LCAweEE0LCAvKiAweEUwLTB4RTMgKi8KKwkweERBLCAweERELCAweEI1LCAweEEzLCAweERBLCAweERDLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweDQ1LCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweEJBLCAweERDLCAweEUzLCAweDRELCAweEJBLCAweERELCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM0LCAweDc2LCAweEY0LCAweEE1LCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEE2LCAweENCLCAweEFBLCAweEM3LCAweENELCAweEE3LCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEFDLCAweEYyLCAweDAwLCAweDAwLCAweEFDLCAweEYxLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183Qls1MTJdID0geworCTB4RDAsIDB4NDIsIDB4RDAsIDB4NDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RDMsIDB4NDAsIDB4RDMsIDB4NDIsIDB4QUYsIDB4QjksIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4RDMsIDB4NDQsIDB4RDMsIDB4NDcsIDB4RDMsIDB4NDUsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4NDYsIDB4RDMsIDB4NDMsIC8qIDB4MEMtMHgwRiAqLworCTB4RDIsIDB4RkUsIDB4QUYsIDB4QkEsIDB4RDMsIDB4NDgsIDB4RDMsIDB4NDEsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4RDYsIDB4RDMsIDB4QjIsIDB4QzYsIDB4RDYsIDB4REMsIDB4QjIsIDB4QzMsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4RDYsIDB4RDUsIDB4QjIsIDB4QzcsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4QjIsIDB4QzEsIDB4MDAsIDB4MDAsIDB4RDYsIDB4RDAsIDB4RDYsIDB4REQsIC8qIDB4MjAtMHgyMyAqLworCTB4RDYsIDB4RDEsIDB4RDYsIDB4Q0UsIDB4QjIsIDB4QzUsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4QjIsIDB4QzIsIDB4MDAsIDB4MDAsIDB4RDYsIDB4RDQsIDB4RDYsIDB4RDcsIC8qIDB4MjgtMHgyQiAqLworCTB4QjIsIDB4QzQsIDB4RDYsIDB4RDgsIDB4QjIsIDB4QzgsIDB4RDYsIDB4RDksIC8qIDB4MkMtMHgyRiAqLworCTB4RDYsIDB4Q0YsIDB4RDYsIDB4RDYsIDB4RDYsIDB4REEsIDB4RDYsIDB4RDIsIC8qIDB4MzAtMHgzMyAqLworCTB4RDYsIDB4Q0QsIDB4RDYsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4RDYsIDB4REIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4REYsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4REEsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4REEsIDB4RTAsIDB4REEsIDB4RTYsIDB4QjUsIDB4QTcsIDB4RDYsIDB4Q0MsIC8qIDB4NDQtMHg0NyAqLworCTB4REEsIDB4RTEsIDB4QjUsIDB4QTUsIDB4REEsIDB4REUsIDB4QjUsIDB4QUMsIC8qIDB4NDgtMHg0QiAqLworCTB4REEsIDB4RTIsIDB4QjUsIDB4QUIsIDB4REEsIDB4RTMsIDB4QjUsIDB4QUQsIC8qIDB4NEMtMHg0RiAqLworCTB4QjUsIDB4QTgsIDB4QjUsIDB4QUUsIDB4QjUsIDB4QTksIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4QjUsIDB4QUEsIDB4MDAsIDB4MDAsIDB4QjUsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4REEsIDB4RTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4QjgsIDB4NjEsIDB4REYsIDB4NTAsIDB4MDAsIDB4MDAsIDB4REYsIDB4NTMsIC8qIDB4NjAtMHg2MyAqLworCTB4REYsIDB4NDcsIDB4REYsIDB4NEMsIDB4REYsIDB4NDYsIDB4QjgsIDB4NjMsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4NEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4NDgsIDB4QjgsIDB4NjIsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4REYsIDB4NEYsIDB4REYsIDB4NEUsIDB4REYsIDB4NEIsIDB4REYsIDB4NEQsIC8qIDB4NzAtMHg3MyAqLworCTB4REYsIDB4NDksIDB4QkEsIDB4RTEsIDB4REYsIDB4NTIsIDB4QjgsIDB4NUYsIC8qIDB4NzQtMHg3NyAqLworCTB4REYsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NUQsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4QkEsIDB4RTgsIDB4RTMsIDB4NTgsIDB4MDAsIDB4MDAsIDB4QkEsIDB4RTcsIC8qIDB4ODQtMHg4NyAqLworCTB4RTMsIDB4NEUsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NTAsIDB4QkEsIDB4RTAsIC8qIDB4ODgtMHg4QiAqLworCTB4RTMsIDB4NTUsIDB4RTMsIDB4NTQsIDB4RTMsIDB4NTcsIDB4QkEsIDB4RTUsIC8qIDB4OEMtMHg4RiAqLworCTB4RTMsIDB4NTIsIDB4RTMsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4QkEsIDB4RTQsIDB4QkEsIDB4REYsIDB4RTMsIDB4NTMsIDB4QkEsIDB4RTIsIC8qIDB4OTQtMHg5NyAqLworCTB4RTMsIDB4NTksIDB4RTMsIDB4NUIsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NTYsIC8qIDB4OTgtMHg5QiAqLworCTB4RTMsIDB4NEYsIDB4QkEsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4QkQsIDB4NjksIDB4QkEsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4RTMsIDB4NUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4RTYsIDB4RDksIDB4QkQsIDB4NjIsIDB4MDAsIDB4MDAsIDB4RTYsIDB4REIsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4QkQsIDB4NjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4QkQsIDB4NjUsIDB4RTYsIDB4REUsIDB4MDAsIDB4MDAsIDB4RTYsIDB4RDYsIC8qIDB4QjQtMHhCNyAqLworCTB4QkEsIDB4RTYsIDB4RTYsIDB4REMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4RDgsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4QjgsIDB4NjAsIDB4QkQsIDB4NjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4QkQsIDB4NjQsIDB4MDAsIDB4MDAsIDB4QkQsIDB4NjYsIDB4QkQsIDB4NjcsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4QkYsIDB4NzYsIDB4RTYsIDB4REQsIDB4RTYsIDB4RDcsIC8qIDB4QzgtMHhDQiAqLworCTB4QkQsIDB4NkEsIDB4MDAsIDB4MDAsIDB4RTYsIDB4REEsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RUEsIDB4QzAsIDB4RUEsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4RUEsIDB4QzUsIDB4QkYsIDB4NzQsIDB4RUEsIDB4QkQsIDB4QkYsIDB4NzgsIC8qIDB4RDgtMHhEQiAqLworCTB4RUEsIDB4QzMsIDB4RUEsIDB4QkEsIDB4RUEsIDB4QjcsIDB4RUEsIDB4QzYsIC8qIDB4REMtMHhERiAqLworCTB4QzEsIDB4NTEsIDB4QkYsIDB4NzksIDB4RUEsIDB4QzIsIDB4RUEsIDB4QjgsIC8qIDB4RTAtMHhFMyAqLworCTB4QkYsIDB4NzcsIDB4RUEsIDB4QkMsIDB4QkYsIDB4N0IsIDB4RUEsIDB4QjksIC8qIDB4RTQtMHhFNyAqLworCTB4RUEsIDB4QkUsIDB4QkYsIDB4N0EsIDB4RUEsIDB4QzEsIDB4RUEsIDB4QzQsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4RUQsIDB4Q0IsIDB4RUQsIDB4Q0MsIDB4RUQsIDB4QkMsIDB4RUQsIDB4QzMsIC8qIDB4RjAtMHhGMyAqLworCTB4RUQsIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzEsIDB4NEYsIC8qIDB4RjQtMHhGNyAqLworCTB4RUQsIDB4QzgsIDB4RUEsIDB4QkYsIDB4MDAsIDB4MDAsIDB4RUQsIDB4QkYsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4QzksIDB4QzEsIDB4NEUsIDB4RUQsIDB4QkUsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzdDWzUxMl0gPSB7CisJMHhFRCwgMHhCRCwgMHhFRCwgMHhDNywgMHhFRCwgMHhDNCwgMHhFRCwgMHhDNiwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhCQSwgMHhFRCwgMHhDQSwgMHhDMSwgMHg0QywgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhDNSwgMHhFRCwgMHhDRSwgMHhFRCwgMHhDMiwgLyogMHgwOC0weDBCICovCisJMHhDMSwgMHg1MCwgMHhDMSwgMHg0RCwgMHhFRCwgMHhDMCwgMHhFRCwgMHhCQiwgLyogMHgwQy0weDBGICovCisJMHhFRCwgMHhDRCwgMHhCRiwgMHg3NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHg2MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhGMCwgMHg2MSwgMHhGMCwgMHg2NywgMHhDMiwgMHhCMCwgMHhGMCwgMHg2NSwgLyogMHgxQy0weDFGICovCisJMHhGMCwgMHg2NCwgMHhDMiwgMHhCMiwgMHhGMCwgMHg2QSwgMHhDMiwgMHhCMSwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHg2QiwgMHhGMCwgMHg2OCwgMHhDMiwgMHhBRSwgLyogMHgyNC0weDI3ICovCisJMHhGMCwgMHg2OSwgMHhGMCwgMHg2MiwgMHhDMiwgMHhBRiwgMHhDMiwgMHhBRCwgLyogMHgyOC0weDJCICovCisJMHhGMiwgMHhBQiwgMHhGMCwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhGMCwgMHg2QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhBOCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMywgMHhCMiwgLyogMHgzNC0weDM3ICovCisJMHhDMywgMHhCMCwgMHhGMiwgMHhBQSwgMHgwMCwgMHgwMCwgMHhGMiwgMHhBQywgLyogMHgzOC0weDNCICovCisJMHhGMiwgMHhBOSwgMHhDMywgMHhCMSwgMHhDMywgMHhBRSwgMHhDMywgMHhBRiwgLyogMHgzQy0weDNGICovCisJMHhDMywgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDNCwgMHg3OCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhGNCwgMHhBQSwgMHgwMCwgMHgwMCwgMHhGNCwgMHhBOSwgLyogMHg0NC0weDQ3ICovCisJMHhGNCwgMHhBNywgMHhGNCwgMHhBNiwgMHhGNCwgMHhBOCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhDNCwgMHg3NywgMHhDNCwgMHg3OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhDNCwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHhFNSwgLyogMHg1MC0weDUzICovCisJMHhGNSwgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNiwgMHhGQSwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhGQywgMHhGNiwgMHhGRSwgMHhGNiwgMHhGRCwgLyogMHg1OC0weDVCICovCisJMHhGNiwgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDNSwgMHhBMywgLyogMHg1Qy0weDVGICovCisJMHhDNSwgMHhBMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDNSwgMHhEMywgLyogMHg2MC0weDYzICovCisJMHhDNSwgMHhEMiwgMHhDNSwgMHhENCwgMHhGNywgMHhFRCwgMHhGNywgMHhFQywgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhGQiwgMHhGOCwgMHhCOCwgMHhGOCwgMHhGQywgLyogMHg2OC0weDZCICovCisJMHhDNiwgMHg1OCwgMHgwMCwgMHgwMCwgMHhDNiwgMHg1OSwgMHhGOSwgMHg2RCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDNiwgMHg3RSwgMHhBNiwgMHhDQywgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhBOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHhEMCwgMHg0NSwgMHhEMCwgMHg0NiwgMHhEMCwgMHg0NCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhBQywgMHhGMywgMHgwMCwgMHgwMCwgMHhEMCwgMHg0NywgLyogMHg3Qy0weDdGICovCisJCisJMHhEMCwgMHg0OCwgMHhEMCwgMHg0OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhEMywgMHg0OSwgMHhEMywgMHg0RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhEMywgMHg0RCwgMHhBRiwgMHhCQiwgMHhEMywgMHg0QiwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHhEMywgMHg0QywgMHhEMywgMHg0RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhEMywgMHg0QSwgMHhCMiwgMHhDOSwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhENiwgMHhERSwgMHhCMiwgMHhDQiwgMHhENiwgMHhFMCwgMHhCMiwgMHhDQSwgLyogMHg5NC0weDk3ICovCisJMHhENiwgMHhERiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQSwgMHhFOCwgMHhCNSwgMHhBRiwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHhEQSwgMHhFQSwgMHhEQSwgMHhFNywgMHhENiwgMHhFMSwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhCNSwgMHhCMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhEQiwgLyogMHhBNC0weEE3ICovCisJMHhEQSwgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERiwgMHg1NiwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhCOCwgMHg2NCwgMHhERiwgMHg1NCwgMHhCOCwgMHg2NSwgLyogMHhCMC0weEIzICovCisJMHhERiwgMHg1NSwgMHhCOCwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhCQSwgMHhFOSwgMHhFMywgMHg2MSwgMHhFMywgMHg1RSwgLyogMHhCOC0weEJCICovCisJMHhFMywgMHg2MCwgMHhCQSwgMHhFQSwgMHhCQSwgMHhFQiwgMHhFMywgMHg1RiwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhERiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHhFNiwgMHhFMCwgMHgwMCwgMHgwMCwgMHhCRCwgMHg2QiwgMHhFNiwgMHhFMiwgLyogMHhDOC0weENCICovCisJMHhFNiwgMHhFMSwgMHgwMCwgMHgwMCwgMHhBMiwgMHg2MSwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHhFQSwgMHhDQSwgMHhFQSwgMHhDQiwgMHhFQSwgMHhDNywgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhFQSwgMHhDOCwgMHhCRiwgMHg3QywgMHhCRiwgMHg3RCwgMHhFQSwgMHhDOSwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHhDMSwgMHg1NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhDMSwgMHg1MywgMHhDMSwgMHg1OCwgMHhDMSwgMHg1NCwgMHhDMSwgMHg1NiwgLyogMHhEQy0weERGICovCisJMHhDMSwgMHg1MiwgMHgwMCwgMHgwMCwgMHhDMSwgMHg1NSwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMiwgMHhCMywgLyogMHhFNC0weEU3ICovCisJMHhFRCwgMHhDRiwgMHgwMCwgMHgwMCwgMHhGMiwgMHhBRSwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHhGMiwgMHhBRCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhBQiwgMHhDNCwgMHg3QSwgLyogMHhFQy0weEVGICovCisJMHhDNCwgMHg3QiwgMHhGNywgMHg0MSwgMHhGNSwgMHhFNiwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhGNywgMHg0MCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhGRCwgMHhGOSwgMHhBNCwgLyogMHhGNC0weEY3ICovCisJMHhBNiwgMHhDRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHg3NCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhBOSwgMHhBQSwgMHhDOCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfN0RbNTEyXSA9IHsKKwkweEFDLCAweEY2LCAweEQwLCAweDRDLCAweEFDLCAweEY0LCAweEQwLCAweDRBLCAvKiAweDAwLTB4MDMgKi8KKwkweEFDLCAweEY5LCAweEFDLCAweEY1LCAweEFDLCAweEZBLCAweEFDLCAweEY4LCAvKiAweDA0LTB4MDcgKi8KKwkweEQwLCAweDRCLCAweEFDLCAweEY3LCAweEFGLCAweEJGLCAweEFGLCAweEJFLCAvKiAweDA4LTB4MEIgKi8KKwkweEQzLCAweDVBLCAweEFGLCAweEM3LCAweEQzLCAweDUzLCAweEQzLCAweDU5LCAvKiAweDBDLTB4MEYgKi8KKwkweEFGLCAweEMzLCAweEQzLCAweDUyLCAweEQzLCAweDU4LCAweEQzLCAweDU2LCAvKiAweDEwLTB4MTMgKi8KKwkweEFGLCAweEMyLCAweEFGLCAweEM0LCAweEQzLCAweDU1LCAweEFGLCAweEJELCAvKiAweDE0LTB4MTcgKi8KKwkweEQzLCAweDU0LCAweEFGLCAweEM4LCAweEFGLCAweEM1LCAweEFGLCAweEM5LCAvKiAweDE4LTB4MUIgKi8KKwkweEFGLCAweEM2LCAweEQzLCAweDUxLCAweEQzLCAweDUwLCAweEQzLCAweDU3LCAvKiAweDFDLTB4MUYgKi8KKwkweEFGLCAweEMwLCAweEFGLCAweEJDLCAweEFGLCAweEMxLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweEQ2LCAweEYwLCAweEQ2LCAweEU5LCAweDAwLCAweDAwLCAweEI1LCAweEI1LCAvKiAweDI4LTB4MkIgKi8KKwkweEQ2LCAweEU4LCAweDAwLCAweDAwLCAweEIyLCAweENGLCAweEIyLCAweEQ2LCAvKiAweDJDLTB4MkYgKi8KKwkweEIyLCAweEQzLCAweEIyLCAweEQ5LCAweEIyLCAweEQ4LCAweEIyLCAweEQ0LCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEQ2LCAweEUyLCAweEQ2LCAweEU1LCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEQ2LCAweEU0LCAweEIyLCAweEQwLCAweEQ2LCAweEU2LCAweEQ2LCAweEVGLCAvKiAweDM4LTB4M0IgKi8KKwkweEIyLCAweEQxLCAweEQ2LCAweEUzLCAweEQ2LCAweEVDLCAweEQ2LCAweEVELCAvKiAweDNDLTB4M0YgKi8KKwkweEIyLCAweEQyLCAweEQ2LCAweEVBLCAweEIyLCAweEQ3LCAweEIyLCAweENELCAvKiAweDQwLTB4NDMgKi8KKwkweEIyLCAweEQ1LCAweEQ2LCAweEU3LCAweEIyLCAweENDLCAweEQ2LCAweEVCLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEVFLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweEZCLCAweERBLCAweEYyLCAvKiAweDRDLTB4NEYgKi8KKwkweEI1LCAweEIyLCAweERBLCAweEY5LCAweERBLCAweEY2LCAweERBLCAweEVFLCAvKiAweDUwLTB4NTMgKi8KKwkweERBLCAweEY3LCAweEI1LCAweEI0LCAweERBLCAweEVGLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweERBLCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI4LCAweDZDLCAvKiAweDU4LTB4NUIgKi8KKwkweERBLCAweEY0LCAweDAwLCAweDAwLCAweEI1LCAweEIxLCAweERBLCAweEZBLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweEI1LCAweEI4LCAweEI1LCAweEJBLCAweERBLCAweEVELCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI1LCAweEI5LCAweERBLCAweEYwLCAvKiAweDY0LTB4NjcgKi8KKwkweEI1LCAweEIzLCAweERBLCAweEY4LCAweERBLCAweEYxLCAweERBLCAweEY1LCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweERBLCAweEYzLCAweEI1LCAweEI2LCAweERBLCAweEVDLCAvKiAweDZDLTB4NkYgKi8KKwkweEI1LCAweEJCLCAweEIyLCAweENFLCAweEI1LCAweEI3LCAweEI1LCAweEJDLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEI4LCAweDY4LCAweERGLCAweDVELCAweERGLCAweDVGLCAvKiAweDc4LTB4N0IgKi8KKwkweERGLCAweDYxLCAweERGLCAweDY1LCAweDAwLCAweDAwLCAweERGLCAweDVCLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweERGLCAweDU5LCAweEI4LCAweDZBLCAweDAwLCAweDAwLCAweERGLCAweDYwLCAvKiAweDgwLTB4ODMgKi8KKwkweERGLCAweDY0LCAweERGLCAweDVDLCAweERGLCAweDU4LCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweERGLCAweDU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweERGLCAweDYyLCAweERGLCAweDVBLCAweERGLCAweDVFLCAweEI4LCAweDZCLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEI4LCAweDY5LCAweERGLCAweDY2LCAweEI4LCAweDY3LCAvKiAweDkwLTB4OTMgKi8KKwkweERGLCAweDYzLCAweDAwLCAweDAwLCAweEUzLCAweDcyLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEJBLCAweEVFLCAweEUzLCAweDZBLCAweEJELCAweDc4LCAweEUzLCAweDc0LCAvKiAweDlDLTB4OUYgKi8KKwkweEJBLCAweEYxLCAweEUzLCAweDc4LCAweEJBLCAweEY3LCAweEUzLCAweDY1LCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweDc1LCAweEUzLCAweDYyLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweDc3LCAweEUzLCAweDY2LCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweEJBLCAweEZFLCAweEJBLCAweEZCLCAweEUzLCAweDc2LCAweEUzLCAweDcwLCAvKiAweEFDLTB4QUYgKi8KKwkweEJBLCAweEVELCAweEJBLCAweEY1LCAweEJBLCAweEY0LCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweEJBLCAweEYzLCAweEJBLCAweEY5LCAweDAwLCAweDAwLCAweEUzLCAweDYzLCAvKiAweEI0LTB4QjcgKi8KKwkweEJBLCAweEZBLCAweEUzLCAweDcxLCAweEJBLCAweEY2LCAweEJBLCAweEVDLCAvKiAweEI4LTB4QkIgKi8KKwkweEUzLCAweDczLCAweEJBLCAweEVGLCAweEJBLCAweEYwLCAweEJBLCAweEY4LCAvKiAweEJDLTB4QkYgKi8KKwkweEUzLCAweDY4LCAweEUzLCAweDY3LCAweEUzLCAweDY0LCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEUzLCAweDZDLCAweEUzLCAweDY5LCAweEUzLCAweDZELCAweEJBLCAweEZELCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweDc5LCAweEJBLCAweEYyLCAweEUzLCAweDZFLCAvKiAweEM4LTB4Q0IgKi8KKwkweEUzLCAweDZGLCAweDAwLCAweDAwLCAweEUzLCAweDZCLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJBLCAweEZDLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEU3LCAvKiAweEQ0LTB4RDcgKi8KKwkweEJELCAweDcwLCAweEJELCAweDc5LCAweEJELCAweDc1LCAweEU2LCAweEU0LCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweEJELCAweDcyLCAweEJELCAweDc2LCAweEU2LCAweEYwLCAvKiAweERDLTB4REYgKi8KKwkweEJELCAweDZDLCAweEU2LCAweEU4LCAweDAwLCAweDAwLCAweEJELCAweDc0LCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEVCLCAweEU2LCAweEU2LCAvKiAweEU0LTB4RTcgKi8KKwkweEJELCAweDczLCAweEJELCAweDc3LCAweEU2LCAweEU1LCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweEJELCAweDcxLCAweDAwLCAweDAwLCAweEU2LCAweEVGLCAweEJELCAweDZFLCAvKiAweEVDLTB4RUYgKi8KKwkweEU2LCAweEVFLCAweEU2LCAweEVELCAweEJELCAweDdBLCAweEU1LCAweDcyLCAvKiAweEYwLTB4RjMgKi8KKwkweEJELCAweDZELCAweDAwLCAweDAwLCAweEU2LCAweEVDLCAweEU2LCAweEUzLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEJELCAweDdCLCAweEU2LCAweEVBLCAweEJELCAweDZGLCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183RVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4RTksIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4QkYsIDB4QTIsIDB4QkYsIDB4QTcsIDB4QkYsIDB4N0UsIDB4RUEsIDB4RDgsIC8qIDB4MDgtMHgwQiAqLworCTB4RUEsIDB4Q0YsIDB4RUEsIDB4REIsIDB4RUEsIDB4RDMsIDB4RUEsIDB4RDksIC8qIDB4MEMtMHgwRiAqLworCTB4QkYsIDB4QTgsIDB4QkYsIDB4QTEsIDB4RUEsIDB4Q0MsIDB4RUEsIDB4RDIsIC8qIDB4MTAtMHgxMyAqLworCTB4RUEsIDB4REMsIDB4RUEsIDB4RDUsIDB4RUEsIDB4REEsIDB4RUEsIDB4Q0UsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4RDYsIDB4QkYsIDB4QTMsIC8qIDB4MTgtMHgxQiAqLworCTB4RUEsIDB4RDQsIDB4QkYsIDB4QTYsIDB4QkYsIDB4QTUsIDB4RUEsIDB4RDAsIC8qIDB4MUMtMHgxRiAqLworCTB4RUEsIDB4RDEsIDB4RUEsIDB4Q0QsIDB4RUEsIDB4RDcsIDB4QkYsIDB4QTQsIC8qIDB4MjAtMHgyMyAqLworCTB4RUEsIDB4REUsIDB4RUEsIDB4REQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4REEsIDB4RUQsIDB4RDYsIDB4QzEsIDB4NUYsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4RDAsIDB4QzEsIDB4NTksIDB4QzEsIDB4NjksIC8qIDB4MkMtMHgyRiAqLworCTB4RUQsIDB4REMsIDB4QzEsIDB4NjEsIDB4QzEsIDB4NUQsIDB4RUQsIDB4RDMsIC8qIDB4MzAtMHgzMyAqLworCTB4QzEsIDB4NjQsIDB4QzEsIDB4NjcsIDB4RUQsIDB4REUsIDB4QzEsIDB4NUMsIC8qIDB4MzQtMHgzNyAqLworCTB4RUQsIDB4RDUsIDB4QzEsIDB4NjUsIDB4RUQsIDB4RTAsIDB4RUQsIDB4REQsIC8qIDB4MzgtMHgzQiAqLworCTB4RUQsIDB4RDEsIDB4QzEsIDB4NjAsIDB4QzEsIDB4NUEsIDB4QzEsIDB4NjgsIC8qIDB4M0MtMHgzRiAqLworCTB4RUQsIDB4RDgsIDB4QzEsIDB4NjMsIDB4RUQsIDB4RDIsIDB4QzEsIDB4NUUsIC8qIDB4NDAtMHg0MyAqLworCTB4RUQsIDB4REYsIDB4QzEsIDB4NjIsIDB4QzEsIDB4NUIsIDB4RUQsIDB4RDksIC8qIDB4NDQtMHg0NyAqLworCTB4QzEsIDB4NjYsIDB4RUQsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4RUQsIDB4REIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4RjAsIDB4NkUsIDB4RjAsIDB4NzQsIDB4QzIsIDB4QjksIDB4RjAsIDB4NzcsIC8qIDB4NTAtMHg1MyAqLworCTB4QzIsIDB4QjQsIDB4QzIsIDB4QjUsIDB4RjAsIDB4NkYsIDB4RjAsIDB4NzYsIC8qIDB4NTQtMHg1NyAqLworCTB4RjAsIDB4NzEsIDB4QzIsIDB4QkEsIDB4QzIsIDB4QjcsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4RjAsIDB4NkQsIDB4MDAsIDB4MDAsIDB4QzIsIDB4QjYsIDB4RjAsIDB4NzMsIC8qIDB4NUMtMHg1RiAqLworCTB4RjAsIDB4NzUsIDB4QzIsIDB4QjgsIDB4RjAsIDB4NzIsIDB4RjAsIDB4NzAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4RjIsIDB4QjgsIDB4QzMsIDB4QjcsIDB4QzMsIDB4QjgsIDB4QzMsIDB4QjQsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4QzMsIDB4QjUsIDB4MDAsIDB4MDAsIDB4RjIsIDB4QjQsIC8qIDB4NkMtMHg2RiAqLworCTB4RjIsIDB4QjIsIDB4MDAsIDB4MDAsIDB4RjIsIDB4QjYsIDB4QzMsIDB4QkEsIC8qIDB4NzAtMHg3MyAqLworCTB4RjIsIDB4QjcsIDB4RjIsIDB4QjAsIDB4RjIsIDB4QUYsIDB4RjIsIDB4QjMsIC8qIDB4NzQtMHg3NyAqLworCTB4RjIsIDB4QjEsIDB4QzMsIDB4QjYsIDB4RjIsIDB4QjUsIDB4RjQsIDB4QUMsIC8qIDB4NzgtMHg3QiAqLworCTB4QzQsIDB4N0UsIDB4QzQsIDB4N0QsIDB4RjQsIDB4QUQsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RjQsIDB4QUYsIDB4RjQsIDB4QUUsIDB4QzQsIDB4QTEsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjUsIDB4RUIsIDB4RjUsIDB4RTgsIC8qIDB4ODQtMHg4NyAqLworCTB4RjUsIDB4RTksIDB4MDAsIDB4MDAsIDB4RjUsIDB4RTcsIDB4RjUsIDB4RUEsIC8qIDB4ODgtMHg4QiAqLworCTB4QzQsIDB4RjIsIDB4RjUsIDB4RUMsIDB4MDAsIDB4MDAsIDB4QzQsIDB4RjEsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4RjcsIDB4NDIsIDB4MDAsIDB4MDAsIDB4QzUsIDB4RDUsIC8qIDB4OTAtMHg5MyAqLworCTB4QzUsIDB4RDcsIDB4RjcsIDB4RUUsIDB4QzUsIDB4RDYsIDB4RjgsIDB4QjksIC8qIDB4OTQtMHg5NyAqLworCTB4RjksIDB4NDAsIDB4RjksIDB4NDIsIDB4RjgsIDB4RkUsIDB4RjksIDB4NDEsIC8qIDB4OTgtMHg5QiAqLworCTB4QzYsIDB4NkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzdGWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNiwgMHhDRSwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhBQywgMHhGQiwgMHhEMiwgMHg2RiwgMHhBRiwgMHhDQSwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhCMiwgMHhEQSwgMHhEQSwgMHhGQywgMHhEQSwgMHhGRCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhERiwgLyogMHg0MC0weDQzICovCisJMHhDMSwgMHg2QSwgMHhFRCwgMHhFMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhDMiwgMHhCQiwgMHgwMCwgMHgwMCwgMHhGMiwgMHhCQSwgMHhGMiwgMHhCOSwgLyogMHg0OC0weDRCICovCisJMHhDNCwgMHhBMiwgMHhGNSwgMHhFRCwgMHgwMCwgMHgwMCwgMHhGNywgMHg0MywgLyogMHg0Qy0weDRGICovCisJMHhDNSwgMHhGOCwgMHhDQSwgMHg0OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhBQSwgMHhDOSwgMHhBOCwgMHg3NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhEMCwgMHg0RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHg2MCwgLyogMHg1OC0weDVCICovCisJMHhEMywgMHg1QiwgMHhEMywgMHg1RiwgMHhEMywgMHg1RCwgMHhBRiwgMHhDQiwgLyogMHg1Qy0weDVGICovCisJMHhEMywgMHg1RSwgMHhEMywgMHg1QywgMHgwMCwgMHgwMCwgMHhENiwgMHhGMSwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhEQSwgMHhGRSwgMHhEQiwgMHg0MCwgMHhERiwgMHg2OSwgLyogMHg2NC0weDY3ICovCisJMHhERiwgMHg2QSwgMHhCOCwgMHg2RSwgMHhCOCwgMHg2RiwgMHhERiwgMHg2OCwgLyogMHg2OC0weDZCICovCisJMHhERiwgMHg2QiwgMHhERiwgMHg2NywgMHhCOCwgMHg2RCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhCQiwgMHg0MCwgMHgwMCwgMHgwMCwgMHhCOCwgMHg3MCwgMHhFMywgMHg3QSwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhCRCwgMHg3QywgMHhFNiwgMHhGMSwgMHhCRCwgMHg3RCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhCRiwgMHhBOSwgMHhFQSwgMHhFMiwgMHhFQSwgMHhFMCwgLyogMHg3OC0weDdCICovCisJMHhFQSwgMHhFMSwgMHhFRCwgMHhFNCwgMHhFRCwgMHhFMywgMHhFRCwgMHhFMiwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhCQiwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHhDMywgMHhCOSwgMHhGMiwgMHhCQywgMHhGNywgMHg0NCwgLyogMHg4NC0weDg3ICovCisJMHhDNSwgMHhGOSwgMHhGOCwgMHhCQSwgMHhBNiwgMHhDRiwgMHhBQSwgMHhDQiwgLyogMHg4OC0weDhCICovCisJMHhBQSwgMHhDQSwgMHhEMCwgMHg0RiwgMHhBQywgMHhGQywgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhEMCwgMHg0RSwgMHhEMywgMHg2MiwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhBRiwgMHhDQywgMHhENiwgMHhGMiwgMHhEMywgMHg2MSwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMiwgMHhEQywgMHhENiwgMHhGNSwgLyogMHg5OC0weDlCICovCisJMHhENiwgMHhGMywgMHhENiwgMHhGNCwgMHhCMiwgMHhEQiwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhEQiwgMHg0MiwgMHhEQiwgMHg0MywgMHhEQiwgMHg0MSwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhCOCwgMHg3MywgMHhERiwgMHg2RCwgMHhERiwgMHg2QywgMHhERiwgMHg2RSwgLyogMHhBNC0weEE3ICovCisJMHhCOCwgMHg3MiwgMHhCOCwgMHg3MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhFNiwgMHhGMiwgMHhFNiwgMHhGNCwgMHgwMCwgMHgwMCwgMHhCRCwgMHg3RSwgLyogMHhBQy0weEFGICovCisJMHhFNiwgMHhGMywgMHhFQSwgMHhFMywgMHhCRiwgMHhBQSwgMHhGMCwgMHg3OSwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHg3OCwgMHhDMywgMHhCQiwgMHhGMiwgMHhCRCwgLyogMHhCNC0weEI3ICovCisJMHhDMywgMHhCRCwgMHhDMywgMHhCQywgMHhGNCwgMHhCMCwgMHhGNSwgMHhFRSwgLyogMHhCOC0weEJCICovCisJMHhDNCwgMHhGMywgMHhBNiwgMHhEMCwgMHhEMCwgMHg1MCwgMHhBQywgMHhGRCwgLyogMHhCQy0weEJGICovCisJMHhEMywgMHg2NSwgMHhBRiwgMHhDRSwgMHhEMywgMHg2NCwgMHhEMywgMHg2MywgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhBRiwgMHhDRCwgMHgwMCwgMHgwMCwgMHhENiwgMHhGQiwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhENiwgMHhGRCwgMHhENiwgMHhGNiwgMHhENiwgMHhGNywgLyogMHhDOC0weENCICovCisJMHhCMiwgMHhERCwgMHhENiwgMHhGOCwgMHhCMiwgMHhERSwgMHhENiwgMHhGQywgLyogMHhDQy0weENGICovCisJMHhENiwgMHhGOSwgMHhENiwgMHhGQSwgMHhCMiwgMHhERiwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhCNSwgMHhCRSwgMHhCNSwgMHhCRiwgMHgwMCwgMHgwMCwgMHhEQiwgMHg0NCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERiwgMHg2RiwgLyogMHhEOC0weERCICovCisJMHhERiwgMHg3MCwgMHgwMCwgMHgwMCwgMHhFMywgMHg3RSwgMHhCQiwgMHg0MywgLyogMHhEQy0weERGICovCisJMHhCQiwgMHg0MSwgMHhCQiwgMHg0MiwgMHhFMywgMHg3QiwgMHhFMywgMHg3QywgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHg3RCwgMHhFNiwgMHhGOSwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhFNiwgMHhGQSwgMHhCRCwgMHhBMSwgMHhFNiwgMHhGNywgMHhFNiwgMHhGNiwgLyogMHhFOC0weEVCICovCisJMHhFNiwgMHhGOCwgMHhFNiwgMHhGNSwgMHhCRiwgMHhBRCwgMHhFQSwgMHhFNCwgLyogMHhFQy0weEVGICovCisJMHhCRiwgMHhBQiwgMHhCRiwgMHhBQywgMHhFRCwgMHhFNiwgMHhDMSwgMHg2QiwgLyogMHhGMC0weEYzICovCisJMHhFRCwgMHhFNSwgMHhFRiwgMHhBOCwgMHgwMCwgMHgwMCwgMHhGMCwgMHg3QSwgLyogMHhGNC0weEY3ICovCisJMHhGMCwgMHg3QiwgMHhDMiwgMHhCQywgMHgwMCwgMHgwMCwgMHhDMiwgMHhCRCwgLyogMHhGOC0weEZCICovCisJMHhDMSwgMHg2QywgMHhGMiwgMHhCRSwgMHhGMiwgMHhCRiwgMHhGNCwgMHhCMSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODBbNTEyXSA9IHsKKwkweEM0LCAweEEzLCAweEE2LCAweEQxLCAweDAwLCAweDAwLCAweEE2LCAweEQyLCAvKiAweDAwLTB4MDMgKi8KKwkweEFDLCAweEZFLCAweEFBLCAweENDLCAweEFGLCAweENGLCAweEQwLCAweDUxLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI1LCAweEMwLCAvKiAweDA4LTB4MEIgKi8KKwkweEE2LCAweEQzLCAweEFELCAweDQxLCAweEQwLCAweDUyLCAweEQwLCAweDUzLCAvKiAweDBDLTB4MEYgKi8KKwkweEFELCAweDQwLCAweEFELCAweDQyLCAweEE2LCAweEQ0LCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweEQwLCAweDU0LCAweEFGLCAweEQxLCAweEQzLCAweDY2LCAweEFGLCAweEQzLCAvKiAweDE0LTB4MTcgKi8KKwkweEFGLCAweEQwLCAweEFGLCAweEQyLCAweDAwLCAweDAwLCAweEQ3LCAweDQxLCAvKiAweDE4LTB4MUIgKi8KKwkweEIyLCAweEUwLCAweDAwLCAweDAwLCAweEQ3LCAweDQwLCAweEQ2LCAweEZFLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweERGLCAweDcxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweEUzLCAweEExLCAweDAwLCAweDAwLCAweEJELCAweEEyLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweEJGLCAweEFFLCAweEVBLCAweEU2LCAweEVBLCAweEU1LCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweEVELCAweEU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEY1LCAweEVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE2LCAweEQ1LCAvKiAweDMwLTB4MzMgKi8KKwkweENCLCAweDczLCAweENELCAweEFBLCAweEFELCAweDQzLCAweEQwLCAweDU1LCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweEQzLCAweDY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEFGLCAweEQ0LCAweEQzLCAweDY3LCAweEFGLCAweEQ1LCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweDQzLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIyLCAweEUyLCAweEQ3LCAweDQyLCAvKiAweDQ0LTB4NDcgKi8KKwkweEQ3LCAweDQ0LCAweDAwLCAweDAwLCAweEIyLCAweEUxLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERCLCAweDQ2LCAvKiAweDRDLTB4NEYgKi8KKwkweERCLCAweDQ3LCAweERCLCAweDQ1LCAweEI1LCAweEMxLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI4LCAweDc0LCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEI4LCAweDc1LCAweDAwLCAweDAwLCAweEJCLCAweDQ1LCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweEUzLCAweEEzLCAweEUzLCAweEEyLCAweEJCLCAweDQ0LCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEU2LCAweEZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEZDLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEVBLCAweEU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMxLCAweDcwLCAvKiAweDZDLTB4NkYgKi8KKwkweEMxLCAweDZGLCAweEMxLCAweDZELCAweEMxLCAweDZFLCAweEMxLCAweDcxLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweDdDLCAweEMyLCAweEJGLCAweEMyLCAweEJFLCAvKiAweDc0LTB4NzcgKi8KKwkweEYyLCAweEMwLCAweEY0LCAweEIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEM1LCAweEE1LCAweEM1LCAweEE0LCAweEE2LCAweEQ2LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQxLCAweEZCLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEI4LCAweDc3LCAweEI1LCAweEMyLCAweEI4LCAweDc2LCAweEJCLCAweDQ2LCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEE2LCAweEQ3LCAweEM5LCAweEE5LCAweEE2LCAweEQ4LCAvKiAweDg4LTB4OEIgKi8KKwkweEE2LCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENELCAweEFCLCAvKiAweDhDLTB4OEYgKi8KKwkweENCLCAweDc2LCAweDAwLCAweDAwLCAweENCLCAweDc3LCAweEE4LCAweDc3LCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweENCLCAweDc0LCAweEE4LCAweDc2LCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweEE4LCAweDc5LCAweENCLCAweDc1LCAweEE4LCAweDdCLCAweEE4LCAweDdBLCAvKiAweDk4LTB4OUIgKi8KKwkweENCLCAweDc4LCAweEE4LCAweDc4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEFBLCAweEQxLCAweEFBLCAweENGLCAweENELCAweEFELCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweEFBLCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweEFBLCAweEQzLCAweEFBLCAweEQ1LCAweEFBLCAweEQyLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweENELCAweEIwLCAweENELCAweEFDLCAweEFBLCAweEQ2LCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEFBLCAweEQwLCAweEE4LCAweDdDLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweEFBLCAweEQ0LCAweENELCAweEFGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweENELCAweEFFLCAweDAwLCAweDAwLCAweEFBLCAweENELCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweDVCLCAweEFELCAweDQ3LCAvKiAweEMwLTB4QzMgKi8KKwkweEFELCAweDQ4LCAweEQwLCAweDVELCAweDAwLCAweDAwLCAweEQwLCAweDU3LCAvKiAweEM0LTB4QzcgKi8KKwkweEQwLCAweDVBLCAweEQwLCAweDYzLCAweEQwLCAweDYxLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEFELCAweDQ5LCAweEQwLCAweDY3LCAweEFELCAweDRDLCAweEQwLCAweDY0LCAvKiAweENDLTB4Q0YgKi8KKwkweEQwLCAweDVDLCAweEQwLCAweDU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweERCLCAweDQ5LCAweEQwLCAweDYyLCAweEFELCAweDQ0LCAweEQwLCAweDY1LCAvKiAweEQ0LTB4RDcgKi8KKwkweEQwLCAweDU2LCAweEQwLCAweDVGLCAweEFELCAweDQ2LCAweEFELCAweDRCLCAvKiAweEQ4LTB4REIgKi8KKwkweEQwLCAweDYwLCAweEFELCAweDRGLCAweEFELCAweDRELCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweEQwLCAweDU4LCAweEFELCAweDRBLCAweDAwLCAweDAwLCAweEQwLCAweDVFLCAvKiAweEUwLTB4RTMgKi8KKwkweEFELCAweDRFLCAweEFELCAweDQ1LCAweEQwLCAweDY2LCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweEFGLCAweERBLCAweDAwLCAweDAwLCAweEFGLCAweEUzLCAvKiAweEVDLTB4RUYgKi8KKwkweEFGLCAweEQ4LCAweEFGLCAweEQ2LCAweEQzLCAweDZBLCAweEFGLCAweERFLCAvKiAweEYwLTB4RjMgKi8KKwkweEFGLCAweERCLCAweEQzLCAweDZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEFGLCAweERELCAweEQzLCAweDZCLCAweEQzLCAweDY5LCAweEQzLCAweDZFLCAvKiAweEY4LTB4RkIgKi8KKwkweEFGLCAweEUyLCAweEFGLCAweEUwLCAweERCLCAweDQ4LCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184MVs1MTJdID0geworCTB4RDMsIDB4NkYsIDB4RDMsIDB4NkQsIDB4QUYsIDB4RDcsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4QUYsIDB4RDksIDB4QUYsIDB4REMsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4QUYsIDB4REYsIDB4MDAsIDB4MDAsIDB4QUYsIDB4RTEsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4NEUsIDB4QjIsIDB4RTQsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4RDcsIDB4NDUsIDB4RDcsIDB4NDcsIDB4MDAsIDB4MDAsIDB4RDcsIDB4NDgsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4NTAsIDB4RDcsIDB4NEMsIDB4RDcsIDB4NEEsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4NEQsIDB4RDcsIDB4NTEsIDB4QjIsIDB4RTUsIC8qIDB4MjAtMHgyMyAqLworCTB4QjIsIDB4RTksIDB4RDcsIDB4NDYsIDB4MDAsIDB4MDAsIDB4RDcsIDB4NEYsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4QjIsIDB4RTcsIDB4MDAsIDB4MDAsIDB4QjIsIDB4RTYsIC8qIDB4MjgtMHgyQiAqLworCTB4RDcsIDB4NEIsIDB4RDcsIDB4NDksIDB4MDAsIDB4MDAsIDB4QjIsIDB4RTMsIC8qIDB4MkMtMHgyRiAqLworCTB4QjIsIDB4RTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4QjUsIDB4QzgsIDB4REIsIDB4NTEsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4NEYsIDB4QjUsIDB4Q0EsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4NEEsIC8qIDB4NDAtMHg0MyAqLworCTB4REYsIDB4QTEsIDB4MDAsIDB4MDAsIDB4QjUsIDB4QzksIDB4REIsIDB4NEUsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4NEIsIDB4QjUsIDB4QzUsIC8qIDB4NDgtMHg0QiAqLworCTB4QjUsIDB4Q0IsIDB4REIsIDB4NTAsIDB4QjUsIDB4QzcsIDB4REIsIDB4NEQsIC8qIDB4NEMtMHg0RiAqLworCTB4QkIsIDB4NDcsIDB4QjUsIDB4QzYsIDB4REIsIDB4NEMsIDB4QjUsIDB4Q0MsIC8qIDB4NTAtMHg1MyAqLworCTB4QjUsIDB4QzQsIDB4QjUsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4NzcsIC8qIDB4NTgtMHg1QiAqLworCTB4REYsIDB4NzUsIDB4MDAsIDB4MDAsIDB4REYsIDB4N0IsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4REYsIDB4NzMsIDB4REYsIDB4QTIsIDB4REYsIDB4NzgsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4REYsIDB4NzIsIDB4QjgsIDB4N0IsIDB4QjgsIDB4QTMsIDB4REYsIDB4N0QsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4NzYsIDB4MDAsIDB4MDAsIDB4QjgsIDB4N0UsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjgsIDB4N0MsIDB4REYsIDB4N0UsIC8qIDB4NkMtMHg2RiAqLworCTB4QjgsIDB4NzksIDB4QjgsIDB4NzgsIDB4REYsIDB4NzksIDB4QjgsIDB4N0QsIC8qIDB4NzAtMHg3MyAqLworCTB4QjUsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4REYsIDB4N0MsIDB4REYsIDB4NzQsIC8qIDB4NzQtMHg3NyAqLworCTB4QjgsIDB4N0EsIDB4QjgsIDB4QTEsIDB4QjgsIDB4QTIsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkIsIDB4NEMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QkIsIDB4NDgsIDB4MDAsIDB4MDAsIDB4QkIsIDB4NEQsIDB4RTMsIDB4QTYsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QTUsIDB4RTMsIDB4QTcsIC8qIDB4ODQtMHg4NyAqLworCTB4QkIsIDB4NEEsIDB4RTMsIDB4QTQsIDB4QkIsIDB4NEIsIDB4RTMsIDB4QUEsIC8qIDB4ODgtMHg4QiAqLworCTB4RTMsIDB4QTksIDB4RTMsIDB4QTgsIDB4MDAsIDB4MDAsIDB4QkIsIDB4NDksIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4NDEsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NDQsIC8qIDB4OTQtMHg5NyAqLworCTB4QkQsIDB4QTgsIDB4RTcsIDB4NDMsIDB4QkQsIDB4QTcsIDB4QkQsIDB4QTMsIC8qIDB4OTgtMHg5QiAqLworCTB4QkQsIDB4QTQsIDB4QkQsIDB4QTUsIDB4RTcsIDB4NDAsIDB4RTYsIDB4RkUsIC8qIDB4OUMtMHg5RiAqLworCTB4QkQsIDB4QTYsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NDIsIDB4RTYsIDB4RkQsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4RTksIDB4RUEsIDB4RjMsIC8qIDB4QTQtMHhBNyAqLworCTB4QkYsIDB4QjEsIDB4QkYsIDB4QjAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4RUQsIC8qIDB4QTgtMHhBQiAqLworCTB4RUEsIDB4RUYsIDB4MDAsIDB4MDAsIDB4RUEsIDB4RUEsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4RUEsIDB4RUUsIDB4RUEsIDB4RTgsIDB4RUEsIDB4RjEsIDB4QkYsIDB4QUYsIC8qIDB4QjAtMHhCMyAqLworCTB4RUEsIDB4RjAsIDB4RUEsIDB4RUMsIDB4MDAsIDB4MDAsIDB4RUEsIDB4RjIsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4RUIsIDB4QzEsIDB4NzQsIDB4RUQsIDB4RTgsIC8qIDB4QjgtMHhCQiAqLworCTB4RUQsIDB4RUUsIDB4QzEsIDB4NzgsIDB4QzEsIDB4N0EsIDB4QzEsIDB4NzcsIC8qIDB4QkMtMHhCRiAqLworCTB4QzEsIDB4NzYsIDB4MDAsIDB4MDAsIDB4QzEsIDB4NzUsIDB4QzEsIDB4NzMsIC8qIDB4QzAtMHhDMyAqLworCTB4RUQsIDB4RTksIDB4RUQsIDB4RUMsIDB4QzEsIDB4NzIsIDB4RUQsIDB4RUQsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4QzEsIDB4NzksIDB4RUQsIDB4RUIsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4RUQsIDB4RUEsIDB4QzIsIDB4QzAsIDB4MDAsIDB4MDAsIDB4QzIsIDB4QzEsIC8qIDB4Q0MtMHhDRiAqLworCTB4RjAsIDB4QTEsIDB4RjAsIDB4N0QsIDB4RjAsIDB4N0UsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4QzIsIDB4MDAsIDB4MDAsIDB4RjIsIDB4QzEsIC8qIDB4RDQtMHhENyAqLworCTB4QzMsIDB4QkUsIDB4RjQsIDB4QjQsIDB4QzQsIDB4QTQsIDB4RjQsIDB4QjMsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4RjAsIDB4RjcsIDB4NDUsIDB4QzUsIDB4QTYsIC8qIDB4REMtMHhERiAqLworCTB4RjksIDB4NDMsIDB4RjksIDB4NDQsIDB4QzUsIDB4RDgsIDB4QTYsIDB4REEsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4QUEsIDB4RDcsIDB4REIsIDB4NTIsIDB4QkIsIDB4NEUsIC8qIDB4RTQtMHhFNyAqLworCTB4QzEsIDB4N0IsIDB4RUQsIDB4RUYsIDB4QTYsIDB4REIsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4QUYsIDB4RTUsIDB4QUYsIDB4RTQsIDB4REIsIDB4NTMsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4RjQsIDB4QTYsIDB4REMsIC8qIDB4RjAtMHhGMyAqLworCTB4QUQsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4NTQsIC8qIDB4RjQtMHhGNyAqLworCTB4REIsIDB4NTUsIDB4REIsIDB4NTYsIDB4QkIsIDB4NEYsIDB4QkYsIDB4QjIsIC8qIDB4RjgtMHhGQiAqLworCTB4QTYsIDB4REQsIDB4MDAsIDB4MDAsIDB4QUEsIDB4RDgsIDB4RDAsIDB4NjgsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzgyWzUxMl0gPSB7CisJMHhBRiwgMHhFNiwgMHhEMywgMHg3MCwgMHhCMiwgMHhFQSwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhEQiwgMHg1NywgMHhCOCwgMHhBNCwgMHgwMCwgMHgwMCwgMHhCQiwgMHg1MCwgLyogMHgwNC0weDA3ICovCisJMHhCRiwgMHhCMywgMHhDMSwgMHg3QywgMHhDMiwgMHhDMiwgMHhGNCwgMHhCNSwgLyogMHgwOC0weDBCICovCisJMHhBNiwgMHhERSwgMHhBQSwgMHhEOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhBRiwgMHhFNywgMHhENywgMHg1MiwgMHhCNSwgMHhDRSwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhCQiwgMHg1MSwgMHhFMywgMHhBQiwgMHhFNywgMHg0NSwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNiwgMHhERiwgLyogMHgxOC0weDFCICovCisJMHhCNSwgMHhDRiwgMHhERiwgMHhBMywgMHhCQiwgMHg1MiwgMHhBNiwgMHhFMCwgLyogMHgxQy0weDFGICovCisJMHhDRCwgMHhCMSwgMHhEMCwgMHg2OSwgMHhBRCwgMHg1MSwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhEMywgMHg3MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhBRiwgMHhFQSwgMHgwMCwgMHgwMCwgMHhBRiwgMHhFOCwgMHhBRiwgMHhFOSwgLyogMHgyOC0weDJCICovCisJMHhBRiwgMHhFQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHg3MSwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHg1NywgMHhENywgMHg1NCwgLyogMHgzMC0weDMzICovCisJMHhENywgMHg1NiwgMHhCMiwgMHhFQiwgMHhCMiwgMHhFRCwgMHhCMiwgMHhFQywgLyogMHgzNC0weDM3ICovCisJMHhENywgMHg1MywgMHhCMiwgMHhFRSwgMHhENywgMHg1NSwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhEQiwgMHg1OCwgMHhEQiwgMHg1OSwgMHgwMCwgMHgwMCwgMHhEQiwgMHg1QSwgLyogMHgzQy0weDNGICovCisJMHhERiwgMHhBNiwgMHgwMCwgMHgwMCwgMHhERiwgMHhBNywgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhERiwgMHhBNSwgMHhERiwgMHhBOCwgMHgwMCwgMHgwMCwgMHhCOCwgMHhBNSwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHhBNCwgMHgwMCwgMHgwMCwgMHhCQiwgMHg1MywgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHg0QSwgMHhFNywgMHg0NiwgLyogMHg0Qy0weDRGICovCisJMHhFNywgMHg0OSwgMHhFNywgMHg0QiwgMHhFNywgMHg0OCwgMHhFNywgMHg0NywgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHhGNSwgMHhFQSwgMHhGNiwgMHhFQSwgMHhGNywgLyogMHg1NC0weDU3ICovCisJMHhCRiwgMHhCNCwgMHhCRiwgMHhCNSwgMHhFRCwgMHhGMSwgMHhFRCwgMHhGMCwgLyogMHg1OC0weDVCICovCisJMHhFRCwgMHhGMiwgMHgwMCwgMHgwMCwgMHhGMCwgMHhBMywgMHhGMCwgMHhBMiwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhGMiwgMHhDNCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhDNSwgLyogMHg2MC0weDYzICovCisJMHhGMiwgMHhDMywgMHgwMCwgMHgwMCwgMHhDNCwgMHhBNSwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhGNCwgMHhCNiwgMHhGNCwgMHhCNywgMHgwMCwgMHgwMCwgMHhGNywgMHg0NiwgLyogMHg2OC0weDZCICovCisJMHhGNywgMHhFRiwgMHhGOCwgMHhCQiwgMHhBNiwgMHhFMSwgMHhBOCwgMHg3RCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHhDMSwgMHg3RCwgMHhBNiwgMHhFMiwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhENywgMHg1OCwgMHhEQiwgMHg1QiwgMHgwMCwgMHgwMCwgMHhDNiwgMHg0MSwgLyogMHg3NC0weDc3ICovCisJMHhDQSwgMHg0QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhDQSwgMHg0QiwgMHhDQSwgMHg0RCwgMHhBNiwgMHhFMywgMHhDQSwgMHg0RSwgLyogMHg3Qy0weDdGICovCisJCisJMHhDQSwgMHg0QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhBMiwgLyogMHg4MC0weDgzICovCisJMHhDQiwgMHhBMywgMHhDQiwgMHg3QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhBMSwgMHhBOCwgMHhBMSwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhBOCwgMHhBMiwgMHhDQiwgMHg3QywgMHhDQiwgMHg3QSwgLyogMHg4Qy0weDhGICovCisJMHhDQiwgMHg3OSwgMHhDQiwgMHg3RCwgMHhBOCwgMHg3RSwgMHhDQiwgMHg3RSwgLyogMHg5MC0weDkzICovCisJMHhEMCwgMHg2QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhDRCwgMHhCNiwgMHhBQSwgMHhEQywgMHhDRCwgMHhCNSwgMHhDRCwgMHhCNywgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHhBQSwgMHhEQiwgMHhDRCwgMHhCQywgMHhBQSwgMHhERiwgLyogMHg5Qy0weDlGICovCisJMHhDRCwgMHhCMiwgMHhDRCwgMHhDMCwgMHhDRCwgMHhDNiwgMHhBQSwgMHhFNiwgLyogMHhBMC0weEEzICovCisJMHhDRCwgMHhDMywgMHhBQSwgMHhFMywgMHgwMCwgMHgwMCwgMHhDRCwgMHhCOSwgLyogMHhBNC0weEE3ICovCisJMHhDRCwgMHhCRiwgMHhDRCwgMHhDMSwgMHgwMCwgMHgwMCwgMHhDRCwgMHhCNCwgLyogMHhBOC0weEFCICovCisJMHhBQSwgMHhFMiwgMHhBQSwgMHhERCwgMHhDRCwgMHhCQSwgMHhBQSwgMHhFNCwgLyogMHhBQy0weEFGICovCisJMHhBQSwgMHhFNywgMHhBQSwgMHhFMSwgMHgwMCwgMHgwMCwgMHhBQSwgMHhEQSwgLyogMHhCMC0weEIzICovCisJMHhDRCwgMHhCRSwgMHhDRCwgMHhCOCwgMHhDRCwgMHhDNSwgMHhBQSwgMHhFOSwgLyogMHhCNC0weEI3ICovCisJMHhBQSwgMHhFNSwgMHhBQSwgMHhFMCwgMHhDRCwgMHhCRCwgMHhBRiwgMHhFQywgLyogMHhCOC0weEJCICovCisJMHhDRCwgMHhCQiwgMHhBQSwgMHhERSwgMHhBQSwgMHhFOCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhDRCwgMHhCMywgMHgwMCwgMHgwMCwgMHhDRCwgMHhDMiwgMHhDRCwgMHhDNCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhBRCwgMHg2MiwgMHhBRCwgMHg1QywgMHhBRCwgMHg2NCwgLyogMHhEMC0weEQzICovCisJMHhBRCwgMHg2MSwgMHhEMCwgMHg3MSwgMHhEMCwgMHg3NCwgMHhBRCwgMHg1RCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHhEMCwgMHg2QiwgMHgwMCwgMHgwMCwgMHhBRCwgMHg1NiwgLyogMHhEOC0weERCICovCisJMHhBRCwgMHg2MCwgMHgwMCwgMHgwMCwgMHhBRCwgMHg2MywgMHhBRCwgMHg2NSwgLyogMHhEQy0weERGICovCisJMHhEMCwgMHhBMiwgMHhEMCwgMHg3NywgMHgwMCwgMHgwMCwgMHhBRCwgMHg1NSwgLyogMHhFMC0weEUzICovCisJMHhEMCwgMHhBMSwgMHhBRCwgMHg1OSwgMHhBRCwgMHg1NywgMHhBRCwgMHg1MiwgLyogMHhFNC0weEU3ICovCisJMHhEMCwgMHg2RiwgMHgwMCwgMHgwMCwgMHhEMCwgMHg3RSwgMHhEMCwgMHg3MywgLyogMHhFOC0weEVCICovCisJMHhEMCwgMHg3NiwgMHhEMCwgMHhBNSwgMHgwMCwgMHgwMCwgMHhBRCwgMHg2NiwgLyogMHhFQy0weEVGICovCisJMHhEMCwgMHg3RCwgMHhBRCwgMHg1RSwgMHhEMCwgMHg3OCwgMHhEMCwgMHhBNCwgLyogMHhGMC0weEYzICovCisJMHhEMCwgMHg3NSwgMHhEMCwgMHg3OSwgMHhEMCwgMHg3QywgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhEMCwgMHg2RCwgMHhEMCwgMHhBMywgMHhEMCwgMHg3QiwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHg2QywgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODNbNTEyXSA9IHsKKwkweEQwLCAweDcwLCAweEFELCAweDVGLCAweEFELCAweDVBLCAweEFELCAweDUzLCAvKiAweDAwLTB4MDMgKi8KKwkweEFELCAweDU4LCAweEFELCAweDU0LCAweEFELCAweDY3LCAweEQwLCAweDZFLCAvKiAweDA0LTB4MDcgKi8KKwkweEQzLCAweEE1LCAweEFELCAweDVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEQwLCAweDdBLCAweENFLCAweDQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEE4LCAweEFGLCAweEZBLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEQzLCAweDc2LCAweDAwLCAweDAwLCAweEQzLCAweEEzLCAvKiAweDE4LTB4MUIgKi8KKwkweEQzLCAweDdELCAweDAwLCAweDAwLCAweEQzLCAweEIyLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEQzLCAweEFBLCAweDAwLCAweDAwLCAweEQzLCAweDdFLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweEQzLCAweEE5LCAweEQzLCAweDc4LCAweEQzLCAweDdDLCAweEQzLCAweEI1LCAvKiAweDI0LTB4MjcgKi8KKwkweEFGLCAweEZELCAweEQzLCAweEFELCAweEQzLCAweEE0LCAweEFGLCAweEVELCAvKiAweDI4LTB4MkIgKi8KKwkweEQzLCAweEIzLCAweEQzLCAweDc0LCAweDAwLCAweDAwLCAweEQzLCAweEFDLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEFGLCAweEZDLCAweEFGLCAweEY3LCAweEQzLCAweDczLCAvKiAweDMwLTB4MzMgKi8KKwkweEFGLCAweEY1LCAweEFGLCAweEY0LCAweEFGLCAweEY5LCAweEQzLCAweEFCLCAvKiAweDM0LTB4MzcgKi8KKwkweEFGLCAweEYxLCAweEFGLCAweEY4LCAweEQwLCAweDcyLCAweERCLCAweDVDLCAvKiAweDM4LTB4M0IgKi8KKwkweEQzLCAweEE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweDdBLCAvKiAweDNDLTB4M0YgKi8KKwkweEFGLCAweEZCLCAweEQzLCAweDdCLCAweEQzLCAweEExLCAweEFGLCAweEZFLCAvKiAweDQwLTB4NDMgKi8KKwkweEQzLCAweDc1LCAweEQzLCAweEFGLCAweDAwLCAweDAwLCAweEQzLCAweEFFLCAvKiAweDQ0LTB4NDcgKi8KKwkweEQzLCAweEI2LCAweEFGLCAweEYzLCAweEFGLCAweEYwLCAweEQzLCAweEI0LCAvKiAweDQ4LTB4NEIgKi8KKwkweEQzLCAweEIwLCAweEQzLCAweEE3LCAweEQzLCAweEEyLCAweEFGLCAweEY2LCAvKiAweDRDLTB4NEYgKi8KKwkweEFGLCAweEYyLCAweEQzLCAweDc3LCAweEFGLCAweEVFLCAweEQzLCAweEIxLCAvKiAweDUwLTB4NTMgKi8KKwkweEFGLCAweEVGLCAweDAwLCAweDAwLCAweEQzLCAweDc5LCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweDVFLCAvKiAweDcwLTB4NzMgKi8KKwkweEQ3LCAweDYwLCAweEQ3LCAweDY1LCAweEQ3LCAweDc5LCAweEIyLCAweEZDLCAvKiAweDc0LTB4NzcgKi8KKwkweEIyLCAweEYyLCAweDAwLCAweDAwLCAweEQ3LCAweDVELCAweEIyLCAweEZELCAvKiAweDc4LTB4N0IgKi8KKwkweEIyLCAweEZFLCAweEQ3LCAweDY4LCAweEQ3LCAweDZGLCAweEQ3LCAweDc1LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweEQ3LCAweDYyLCAweDAwLCAweDAwLCAweEQ3LCAweDY5LCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIzLCAweDQwLCAweEQ3LCAweDc3LCAvKiAweDg0LTB4ODcgKi8KKwkweEQ3LCAweDcyLCAweEIyLCAweEZBLCAweEIyLCAweEY4LCAweEQ3LCAweDZFLCAvKiAweDg4LTB4OEIgKi8KKwkweEQ3LCAweDZBLCAweEQ3LCAweDVDLCAweEIyLCAweEVGLCAweEQ3LCAweDYxLCAvKiAweDhDLTB4OEYgKi8KKwkweEQ3LCAweDU5LCAweDAwLCAweDAwLCAweEIyLCAweEY3LCAweEIyLCAweEY5LCAvKiAweDkwLTB4OTMgKi8KKwkweEQ3LCAweDY2LCAweEQ3LCAweDYzLCAweEIyLCAweEY0LCAweEQ3LCAweDczLCAvKiAweDk0LTB4OTcgKi8KKwkweEIyLCAweEYxLCAweEQ3LCAweDY0LCAweEQ3LCAweDdBLCAweEQ3LCAweDZDLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweEQ3LCAweDZCLCAweEIyLCAweEYwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweEIyLCAweEZCLCAweDAwLCAweDAwLCAweEIyLCAweEYzLCAweEQ3LCAweDVBLCAvKiAweEEwLTB4QTMgKi8KKwkweEQ3LCAweDVGLCAweEQ3LCAweDcwLCAweEQ3LCAweDc2LCAweEIzLCAweDQxLCAvKiAweEE0LTB4QTcgKi8KKwkweEQ3LCAweDVCLCAweEQ3LCAweDY3LCAweEQ3LCAweDZELCAweEIyLCAweEY2LCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweDc4LCAweEQ3LCAweDcxLCAvKiAweEFDLTB4QUYgKi8KKwkweEQ3LCAweDc0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweEIyLCAweEY1LCAweDAwLCAweDAwLCAweERCLCAweDZDLCAvKiAweEJDLTB4QkYgKi8KKwkweERCLCAweDYwLCAweEI1LCAweEQ3LCAweERCLCAweDdELCAweERCLCAweEE3LCAvKiAweEMwLTB4QzMgKi8KKwkweERCLCAweEFBLCAweEI1LCAweEQ1LCAweERCLCAweDY4LCAweERCLCAweEEzLCAvKiAweEM0LTB4QzcgKi8KKwkweERCLCAweDY5LCAweERCLCAweDc3LCAweEI1LCAweEUyLCAweERCLCAweDczLCAvKiAweEM4LTB4Q0IgKi8KKwkweEI1LCAweERGLCAweDAwLCAweDAwLCAweERCLCAweDc0LCAweERCLCAweDVELCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweERCLCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEI1LCAweEU4LCAweERCLCAweEExLCAweERCLCAweDc1LCAweERCLCAweEFDLCAvKiAweEQ0LTB4RDcgKi8KKwkweERCLCAweDcwLCAweERGLCAweEM4LCAweDAwLCAweDAwLCAweERCLCAweEFGLCAvKiAweEQ4LTB4REIgKi8KKwkweEI1LCAweEU2LCAweERCLCAweDZFLCAweERCLCAweDdBLCAweEI1LCAweEU5LCAvKiAweERDLTB4REYgKi8KKwkweEI1LCAweEQ0LCAweERCLCAweDcyLCAweERCLCAweEFELCAweERCLCAweDZCLCAvKiAweEUwLTB4RTMgKi8KKwkweERCLCAweDY0LCAweERCLCAweDZGLCAweDAwLCAweDAwLCAweERCLCAweDYzLCAvKiAweEU0LTB4RTcgKi8KKwkweERCLCAweDYxLCAweEI1LCAweEQwLCAweERCLCAweEE1LCAweERCLCAweDZBLCAvKiAweEU4LTB4RUIgKi8KKwkweERCLCAweEE4LCAweDAwLCAweDAwLCAweERCLCAweEE5LCAweEI1LCAweEQ4LCAvKiAweEVDLTB4RUYgKi8KKwkweEI1LCAweERELCAweEI1LCAweEQ5LCAweEI1LCAweEUxLCAweERCLCAweDdFLCAvKiAweEYwLTB4RjMgKi8KKwkweEI1LCAweERBLCAweERCLCAweDc2LCAweERCLCAweDY2LCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEI1LCAweEQyLCAweERCLCAweDVFLCAweERCLCAweEEyLCAweERCLCAweEFCLCAvKiAweEY4LTB4RkIgKi8KKwkweERCLCAweDY1LCAweEI1LCAweEUwLCAweERCLCAweEIwLCAweERCLCAweDcxLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184NFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4REIsIDB4NkQsIDB4MDAsIDB4MDAsIDB4QjUsIDB4RDEsIC8qIDB4MDAtMHgwMyAqLworCTB4QjUsIDB4RTUsIDB4MDAsIDB4MDAsIDB4REIsIDB4N0MsIDB4QjUsIDB4RTcsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4NzgsIDB4QjUsIDB4REMsIDB4QjUsIDB4RDYsIC8qIDB4MDgtMHgwQiAqLworCTB4QjUsIDB4REUsIDB4QjUsIDB4RDMsIDB4QjUsIDB4RTQsIDB4REIsIDB4NzksIC8qIDB4MEMtMHgwRiAqLworCTB4REIsIDB4NjcsIDB4REIsIDB4N0IsIDB4REIsIDB4NjIsIDB4REIsIDB4QTYsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4QUUsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4NUYsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4QzcsIDB4MDAsIDB4MDAsIDB4REYsIDB4REQsIC8qIDB4MjgtMHgyQiAqLworCTB4QjgsIDB4NTUsIDB4REYsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4REYsIDB4Q0EsIC8qIDB4MkMtMHgyRiAqLworCTB4REYsIDB4QjUsIDB4QjgsIDB4QTksIDB4REYsIDB4QzUsIDB4REYsIDB4RDksIC8qIDB4MzAtMHgzMyAqLworCTB4REYsIDB4QzEsIDB4QjgsIDB4QjEsIDB4REYsIDB4RDgsIDB4REYsIDB4QkYsIC8qIDB4MzQtMHgzNyAqLworCTB4QjUsIDB4RTMsIDB4REYsIDB4Q0YsIDB4REYsIDB4QzAsIDB4REYsIDB4RDYsIC8qIDB4MzgtMHgzQiAqLworCTB4QjgsIDB4QjAsIDB4QjgsIDB4QTgsIDB4MDAsIDB4MDAsIDB4REYsIDB4QUEsIC8qIDB4M0MtMHgzRiAqLworCTB4REYsIDB4QjIsIDB4MDAsIDB4MDAsIDB4REYsIDB4Q0IsIDB4REYsIDB4QzMsIC8qIDB4NDAtMHg0MyAqLworCTB4REYsIDB4REMsIDB4REYsIDB4QzYsIDB4QjgsIDB4QjYsIDB4REYsIDB4RDcsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4QjgsIDB4QUQsIDB4MDAsIDB4MDAsIDB4REYsIDB4QzksIC8qIDB4NDgtMHg0QiAqLworCTB4REYsIDB4RDEsIDB4REYsIDB4QjYsIDB4REYsIDB4RDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4REYsIDB4RTEsIDB4REYsIDB4QjEsIDB4REYsIDB4RDIsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4REYsIDB4REYsIDB4MDAsIDB4MDAsIDB4REYsIDB4QUIsIDB4QjUsIDB4REIsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4QjksIDB4REYsIDB4QjgsIDB4QjgsIDB4QUYsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4QkMsIDB4REYsIDB4QkUsIDB4REYsIDB4Q0QsIC8qIDB4NUMtMHg1RiAqLworCTB4REYsIDB4REUsIDB4QjgsIDB4QjIsIDB4MDAsIDB4MDAsIDB4QjgsIDB4QjMsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4QjAsIDB4QjgsIDB4QUIsIDB4REYsIDB4QjQsIC8qIDB4NjQtMHg2NyAqLworCTB4REYsIDB4REEsIDB4QjgsIDB4QjQsIDB4MDAsIDB4MDAsIDB4QjgsIDB4QUMsIC8qIDB4NjgtMHg2QiAqLworCTB4QjgsIDB4QUUsIDB4QjgsIDB4QjUsIDB4REYsIDB4RTAsIDB4REYsIDB4RDMsIC8qIDB4NkMtMHg2RiAqLworCTB4REYsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4QkIsIC8qIDB4NzAtMHg3MyAqLworCTB4REYsIDB4QkEsIDB4QjgsIDB4QUEsIDB4REYsIDB4QUMsIDB4QjgsIDB4QTcsIC8qIDB4NzQtMHg3NyAqLworCTB4REYsIDB4QzQsIDB4REYsIDB4QUQsIDB4REYsIDB4QzIsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4QjcsIDB4REYsIDB4REIsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjgsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4QjMsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4QUYsIDB4REYsIDB4RDUsIDB4REYsIDB4QUUsIC8qIDB4OEMtMHg4RiAqLworCTB4QkIsIDB4NjAsIDB4RTMsIDB4RDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4RTMsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QUMsIC8qIDB4OTQtMHg5NyAqLworCTB4RTMsIDB4Q0EsIDB4QkIsIDB4NTgsIDB4RTMsIDB4QkIsIDB4RTMsIDB4QzUsIC8qIDB4OTgtMHg5QiAqLworCTB4QkIsIDB4NUIsIDB4RTMsIDB4QkUsIDB4QkIsIDB4NTksIDB4RTMsIDB4QUYsIC8qIDB4OUMtMHg5RiAqLworCTB4RTMsIDB4Q0QsIDB4RTMsIDB4QUUsIDB4RTMsIDB4QzEsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4RTMsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QkYsIC8qIDB4QTQtMHhBNyAqLworCTB4RTMsIDB4QzgsIDB4RTMsIDB4QzYsIDB4RTMsIDB4QkEsIDB4RTMsIDB4QjUsIC8qIDB4QTgtMHhBQiAqLworCTB4RTMsIDB4QjMsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QjQsIDB4RTMsIDB4QzcsIC8qIDB4QUMtMHhBRiAqLworCTB4RTMsIDB4RDIsIDB4RTMsIDB4QkMsIDB4QkIsIDB4NUEsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4RTMsIDB4QjcsIDB4MDAsIDB4MDAsIDB4RTMsIDB4Q0IsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4QkIsIDB4NUQsIDB4RTMsIDB4QjYsIDB4RTMsIDB4QjAsIDB4RTMsIDB4QzAsIC8qIDB4QjgtMHhCQiAqLworCTB4QkIsIDB4NjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkIsIDB4NTUsIC8qIDB4QkMtMHhCRiAqLworCTB4QkIsIDB4NUUsIDB4RTMsIDB4QjgsIDB4RTMsIDB4QjIsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4QkIsIDB4NTcsIDB4REYsIDB4RDQsIDB4QkIsIDB4NTYsIDB4RTMsIDB4QzMsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4QkIsIDB4NTQsIDB4QkIsIDB4NjMsIDB4QkIsIDB4NUMsIC8qIDB4QzgtMHhDQiAqLworCTB4RTMsIDB4QzQsIDB4RTMsIDB4QjksIDB4RTMsIDB4QjEsIDB4RTMsIDB4Q0MsIC8qIDB4Q0MtMHhDRiAqLworCTB4RTMsIDB4QkQsIDB4QkIsIDB4NjIsIDB4RTMsIDB4RDAsIDB4QkIsIDB4NUYsIC8qIDB4RDAtMHhEMyAqLworCTB4RTMsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QzksIDB4RTMsIDB4Q0UsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RDEsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NzMsIC8qIDB4RTQtMHhFNyAqLworCTB4RTcsIDB4NzQsIDB4RTcsIDB4NjcsIDB4RTcsIDB4NjYsIDB4RTcsIDB4NjIsIC8qIDB4RTgtMHhFQiAqLworCTB4QkQsIDB4QjQsIDB4MDAsIDB4MDAsIDB4QkQsIDB4QUMsIDB4RTcsIDB4NzYsIC8qIDB4RUMtMHhFRiAqLworCTB4RTcsIDB4NzUsIDB4REYsIDB4QTksIDB4RTcsIDB4NUYsIDB4RTcsIDB4NjMsIC8qIDB4RjAtMHhGMyAqLworCTB4RTcsIDB4NUQsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NzAsIDB4RTcsIDB4NjEsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4NzcsIDB4RTcsIDB4NUEsIDB4RTcsIDB4NTgsIC8qIDB4RjgtMHhGQiAqLworCTB4RTcsIDB4NjQsIDB4RTcsIDB4NkUsIDB4RTcsIDB4NjksIDB4QkQsIDB4QjYsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzg1WzUxMl0gPSB7CisJMHhFNywgMHg0RiwgMHgwMCwgMHgwMCwgMHhFNywgMHg2RCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCRCwgMHhCNywgMHhERiwgMHhCRCwgLyogMHgwNC0weDA3ICovCisJMHhFNywgMHg1QiwgMHhFNywgMHg1MiwgMHhFNywgMHg1NSwgMHhFNywgMHg3QiwgLyogMHgwOC0weDBCICovCisJMHhFNywgMHg1QywgMHhFNywgMHg1MywgMHhFNywgMHg1MSwgMHhFNywgMHg0RSwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhCRCwgMHhCMCwgMHhFNywgMHg2NSwgMHhCRCwgMHhBRiwgLyogMHgxMC0weDEzICovCisJMHhCRCwgMHhCMywgMHhFNywgMHg2MCwgMHhFNywgMHg2OCwgMHhCRCwgMHhBOSwgLyogMHgxNC0weDE3ICovCisJMHhFNywgMHg3OCwgMHhFNywgMHg3QywgMHhCRCwgMHhBQiwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhFNywgMHg1NywgMHhFNywgMHg2QiwgMHhFNywgMHg2RiwgMHhFNywgMHg1NCwgLyogMHgxQy0weDFGICovCisJMHhFNywgMHg3OSwgMHhCRCwgMHhCMiwgMHgwMCwgMHgwMCwgMHhCRCwgMHhCMSwgLyogMHgyMC0weDIzICovCisJMHhFNywgMHg0QywgMHhCRCwgMHhCNSwgMHhFNywgMHg3MiwgMHhFNywgMHg1NiwgLyogMHgyNC0weDI3ICovCisJMHhFNywgMHg2QSwgMHhFNywgMHg1MCwgMHhFNywgMHg1RSwgMHhFNywgMHg1OSwgLyogMHgyOC0weDJCICovCisJMHhCRCwgMHhBRCwgMHhCRCwgMHhBRSwgMHhFNywgMHg2QywgMHhFNywgMHg3RCwgLyogMHgyQy0weDJGICovCisJMHhFNywgMHg3QSwgMHhFNywgMHg3MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHg0RCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhCRCwgMHhBQSwgMHhFQiwgMHg0OSwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhFQiwgMHg0MCwgMHhFQiwgMHg0MywgMHgwMCwgMHgwMCwgMHhCRiwgMHhCQiwgLyogMHg0MC0weDQzICovCisJMHhFQiwgMHg0NSwgMHhFQSwgMHhGOSwgMHhFQiwgMHg0MSwgMHhFQiwgMHg0NywgLyogMHg0NC0weDQ3ICovCisJMHhCRiwgMHhCOCwgMHhCRiwgMHhCQywgMHhCRiwgMHhCNiwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHhGQiwgMHhFQiwgMHg0QywgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHhFQiwgMHg0NiwgMHgwMCwgMHgwMCwgMHhFQSwgMHhGQywgLyogMHg1MC0weDUzICovCisJMHhFQiwgMHg1NSwgMHhFQiwgMHg0RiwgMHhFQSwgMHhGOCwgMHhFRSwgMHg0NiwgLyogMHg1NC0weDU3ICovCisJMHhFQSwgMHhGRSwgMHhCRiwgMHhCNywgMHgwMCwgMHgwMCwgMHhFQiwgMHg0QSwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhFQiwgMHg1NCwgMHhCRiwgMHhCRiwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhFQiwgMHg1MSwgMHhFQSwgMHhGRCwgMHhFQiwgMHg0NCwgMHhFQiwgMHg0OCwgLyogMHg2MC0weDYzICovCisJMHhFQiwgMHg0MiwgMHhFQiwgMHg1NiwgMHhFQiwgMHg1MywgMHhFQiwgMHg1MCwgLyogMHg2NC0weDY3ICovCisJMHhCRiwgMHhCOSwgMHhCRiwgMHhCQSwgMHhCRiwgMHhCRSwgMHhFQSwgMHhGQSwgLyogMHg2OC0weDZCICovCisJMHhFQiwgMHg1NywgMHhCRiwgMHhCRCwgMHhFQiwgMHg0RCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHhFQiwgMHg0QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhFQiwgMHg0RSwgMHhFRSwgMHg1MywgMHhFRSwgMHg0MCwgLyogMHg3NC0weDc3ICovCisJMHhFRSwgMHg0NSwgMHhFRSwgMHg1MiwgMHhFRSwgMHg0NCwgMHhFRCwgMHhGQiwgLyogMHg3OC0weDdCICovCisJMHhFRSwgMHg0MSwgMHgwMCwgMHgwMCwgMHhDMSwgMHhBMiwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhFRCwgMHhGNCwgMHhFRSwgMHg0RCwgMHhFRSwgMHg0RiwgMHhFRCwgMHhGMywgLyogMHg4MC0weDgzICovCisJMHhDMSwgMHhBMSwgMHhFRSwgMHg1MSwgMHhFRSwgMHg0OSwgMHhDMSwgMHhBOCwgLyogMHg4NC0weDg3ICovCisJMHhFRSwgMHg1MCwgMHhFRSwgMHg0MiwgMHhDMSwgMHhBQSwgMHhFRCwgMHhGOSwgLyogMHg4OC0weDhCICovCisJMHhFQiwgMHg1MiwgMHhFRSwgMHg0QSwgMHhFRSwgMHg0NywgMHhFRCwgMHhGNSwgLyogMHg4Qy0weDhGICovCisJMHhFRSwgMHg1NSwgMHhDMSwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhDMSwgMHhBNSwgMHhFRCwgMHhGNywgMHhFRSwgMHg0OCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhFRSwgMHg1NCwgMHhFRSwgMHg0QiwgMHhFRCwgMHhGRCwgMHhDMSwgMHhBNywgLyogMHg5OC0weDlCICovCisJMHhDMSwgMHhBMywgMHhFRSwgMHg0QywgMHhFRCwgMHhGRSwgMHhFRSwgMHg1NiwgLyogMHg5Qy0weDlGICovCisJMHhFRCwgMHhGOCwgMHhFRSwgMHg0MywgMHhFRSwgMHg0RSwgMHhFRCwgMHhGQSwgLyogMHhBMC0weEEzICovCisJMHhFRCwgMHhGQywgMHgwMCwgMHgwMCwgMHhDMiwgMHhDQiwgMHhFRCwgMHhGNiwgLyogMHhBNC0weEE3ICovCisJMHhDMSwgMHhBOSwgMHhDMiwgMHhDNCwgMHhDMSwgMHg3RSwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMSwgMHhBNiwgLyogMHhBQy0weEFGICovCisJMHhDMiwgMHhDOCwgMHhGMCwgMHhCMywgMHgwMCwgMHgwMCwgMHhGMCwgMHhBOSwgLyogMHhCMC0weEIzICovCisJMHhGMCwgMHhBNCwgMHhGMCwgMHhBQSwgMHhGMCwgMHhCNCwgMHhGMCwgMHhCOCwgLyogMHhCNC0weEI3ICovCisJMHhGMCwgMHhCNywgMHhDMiwgMHhDQSwgMHhDMiwgMHhDOSwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhBQiwgMHhGMCwgMHhCOSwgMHhGMCwgMHhBRSwgLyogMHhCQy0weEJGICovCisJMHhGMCwgMHhBNiwgMHgwMCwgMHgwMCwgMHhGMCwgMHhBOCwgMHhGMCwgMHhBNywgLyogMHhDMC0weEMzICovCisJMHhGMCwgMHhBRCwgMHhGMCwgMHhCMiwgMHhGMCwgMHhBNSwgMHhGMCwgMHhBQywgLyogMHhDNC0weEM3ICovCisJMHhGMCwgMHhCMSwgMHhDMiwgMHhDNywgMHgwMCwgMHgwMCwgMHhGMCwgMHhBRiwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhDMiwgMHhDNSwgMHhGMCwgMHhCMCwgMHhDMiwgMHhDMywgLyogMHhDQy0weENGICovCisJMHhDMiwgMHhDNiwgMHhGMiwgMHhENSwgMHhGMCwgMHhCNSwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhDMywgMHhDMiwgMHgwMCwgMHgwMCwgMHhGMiwgMHhDRCwgLyogMHhENC0weEQ3ICovCisJMHhGMiwgMHhEMSwgMHhGMiwgMHhDOSwgMHhGMiwgMHhDQywgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhGMiwgMHhENCwgMHhDMywgMHhDMCwgMHhGMiwgMHhEOSwgMHhGMiwgMHhEMiwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhGMiwgMHhDQSwgMHhGMiwgMHhEQSwgMHhGMiwgMHhEMywgLyogMHhFMC0weEUzICovCisJMHhDMywgMHhDMywgMHhDMywgMHhDNCwgMHhGMiwgMHhENywgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhGMiwgMHhDQiwgMHhDMywgMHhCRiwgMHhDMywgMHhDMSwgMHhGMiwgMHhDNiwgLyogMHhFOC0weEVCICovCisJMHhGMiwgMHhDRSwgMHhGMiwgMHhDOCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhEOCwgLyogMHhFQy0weEVGICovCisJMHhGMiwgMHhENiwgMHhGMiwgMHhDNywgMHhGMiwgMHhDRiwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhCRSwgMHhDMywgMHhDNSwgLyogMHhGNC0weEY3ICovCisJMHhGMiwgMHhEMCwgMHhDNCwgMHhBNywgMHhDNCwgMHhBOSwgMHhDNCwgMHhBNiwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhGNCwgMHhDMywgMHhGNCwgMHhCQiwgMHhGNCwgMHhCOSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODZbNTEyXSA9IHsKKwkweEY0LCAweEJELCAweEY0LCAweEJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEY0LCAweEJGLCAweEY0LCAweEMxLCAweEM0LCAweEFBLCAweEM0LCAweEFDLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweEMwLCAweEM0LCAweEFELCAweEM0LCAweEFCLCAvKiAweDA4LTB4MEIgKi8KKwkweEY0LCAweEMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEM0LCAweEE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM0LCAweEY0LCAvKiAweDE0LTB4MTcgKi8KKwkweEY1LCAweEYxLCAweEY1LCAweEY3LCAweEM0LCAweEY2LCAweEY0LCAweEJDLCAvKiAweDE4LTB4MUIgKi8KKwkweEY1LCAweEY2LCAweDAwLCAweDAwLCAweEY1LCAweEZELCAweEY1LCAweEY0LCAvKiAweDFDLTB4MUYgKi8KKwkweEY1LCAweEZCLCAweEY1LCAweEZBLCAweEY0LCAweEI4LCAweEY1LCAweEY1LCAvKiAweDIwLTB4MjMgKi8KKwkweEYwLCAweEI2LCAweEY1LCAweEZFLCAweEY1LCAweEYzLCAweEY1LCAweEY4LCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEY1LCAweEZDLCAweEY1LCAweEYyLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweEY3LCAweDRBLCAweEM0LCAweEY1LCAweEY1LCAweEY5LCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEY3LCAweEY0LCAweEY3LCAweDRCLCAweEY3LCAweDQ5LCAvKiAweDMwLTB4MzMgKi8KKwkweEY3LCAweDQ3LCAweEY3LCAweDQ4LCAweEY3LCAweDRDLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEM1LCAweEQ5LCAweEY3LCAweEYyLCAweEY3LCAweEYwLCAweEY3LCAweEY1LCAvKiAweDM4LTB4M0IgKi8KKwkweEY3LCAweEYzLCAweDAwLCAweDAwLCAweEY3LCAweEY2LCAweEM1LCAweERBLCAvKiAweDNDLTB4M0YgKi8KKwkweEY3LCAweEYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY4LCAweEJDLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LCAweDQ1LCAweEY5LCAweDQ2LCAvKiAweDQ0LTB4NDcgKi8KKwkweEY5LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LCAweEM3LCAvKiAweDQ4LTB4NEIgKi8KKwkweEY5LCAweEJELCAweENBLCAweDRGLCAweEFBLCAweEVBLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEFELCAweDY4LCAweDAwLCAweDAwLCAweEQzLCAweEI4LCAweEQzLCAweEI3LCAvKiAweDUwLTB4NTMgKi8KKwkweEIwLCAweDQwLCAweEIzLCAweDQyLCAweEQ3LCAweDdDLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEQ3LCAweDdCLCAweDAwLCAweDAwLCAweEI1LCAweEVBLCAvKiAweDU4LTB4NUIgKi8KKwkweEI4LCAweEI4LCAweDAwLCAweDAwLCAweEI4LCAweEI3LCAweEI4LCAweEI5LCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweEQ0LCAweEU3LCAweDdFLCAweEVCLCAweDU4LCAvKiAweDYwLTB4NjMgKi8KKwkweEVCLCAweDVBLCAweEVCLCAweDU5LCAweDAwLCAweDAwLCAweEMxLCAweEFCLCAvKiAweDY0LTB4NjcgKi8KKwkweEVFLCAweDU3LCAweEYwLCAweEJBLCAweEY5LCAweEE1LCAweEE2LCAweEU0LCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweENELCAweEM5LCAweENELCAweENBLCAweENELCAweEM4LCAvKiAweDZDLTB4NkYgKi8KKwkweENELCAweEM3LCAweEFBLCAweEVCLCAweDAwLCAweDAwLCAweEQwLCAweEE5LCAvKiAweDcwLTB4NzMgKi8KKwkweEQwLCAweEE3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEE2LCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEFELCAweDY5LCAweEFELCAweDZCLCAweEFELCAweDZBLCAvKiAweDc4LTB4N0IgKi8KKwkweEQwLCAweEE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweEQzLCAweEM0LCAweEQzLCAweEMxLCAweEQzLCAweEJGLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIwLCAweDQxLCAweEQzLCAweEMyLCAvKiAweDg4LTB4OEIgKi8KKwkweEIwLCAweDQ2LCAweEQzLCAweEJDLCAweEQzLCAweENCLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweEQzLCAweENELCAweEQzLCAweEJELCAweDAwLCAweDAwLCAweEIwLCAweDQzLCAvKiAweDkwLTB4OTMgKi8KKwkweEQzLCAweENFLCAweEQzLCAweEM5LCAweEQzLCAweEJCLCAweEQzLCAweEMwLCAvKiAweDk0LTB4OTcgKi8KKwkweEQzLCAweENBLCAweEQzLCAweEM2LCAweEQzLCAweEMzLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEIwLCAweDQ4LCAweEQzLCAweENDLCAweEQzLCAweEJFLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEQzLCAweEM3LCAweEQzLCAweEI5LCAweEIwLCAweDQ3LCAvKiAweEEwLTB4QTMgKi8KKwkweEIwLCAweDQ0LCAweEQzLCAweEM1LCAweDAwLCAweDAwLCAweEQzLCAweEM4LCAvKiAweEE0LTB4QTcgKi8KKwkweEQzLCAweEJBLCAweEIwLCAweDQ1LCAweEIwLCAweDQyLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIzLCAweDRDLCAvKiAweEFDLTB4QUYgKi8KKwkweEQ3LCAweEE1LCAweEIzLCAweDRCLCAweDAwLCAweDAwLCAweEQ3LCAweEE4LCAvKiAweEIwLTB4QjMgKi8KKwkweEQ3LCAweEFCLCAweEIzLCAweDQ4LCAweEIzLCAweDQ2LCAweEQ3LCAweDdFLCAvKiAweEI0LTB4QjcgKi8KKwkweEQ3LCAweEE5LCAweEQ3LCAweEE3LCAweEQ3LCAweEE0LCAweEQ3LCAweEFDLCAvKiAweEI4LTB4QkIgKi8KKwkweEQ3LCAweEFELCAweEQ3LCAweEFGLCAweEQ3LCAweEIwLCAweEQ3LCAweDdELCAvKiAweEJDLTB4QkYgKi8KKwkweEIzLCAweDQ1LCAweEQ3LCAweEEyLCAweEQ3LCAweEExLCAweEQ3LCAweEFFLCAvKiAweEMwLTB4QzMgKi8KKwkweEIzLCAweDQ3LCAweEQ3LCAweEEzLCAweEIzLCAweDQ5LCAweEIzLCAweDQ0LCAvKiAweEM0LTB4QzcgKi8KKwkweEQ3LCAweEE2LCAweEIzLCAweDRELCAweDAwLCAweDAwLCAweEIzLCAweDRBLCAvKiAweEM4LTB4Q0IgKi8KKwkweEQ3LCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweEI1LCAweEYxLCAweERCLCAweEJGLCAweDAwLCAweDAwLCAweERCLCAweEI0LCAvKiAweEQwLTB4RDMgKi8KKwkweEI1LCAweEVFLCAweDAwLCAweDAwLCAweERGLCAweEU3LCAweERCLCAweEJELCAvKiAweEQ0LTB4RDcgKi8KKwkweERCLCAweEIxLCAweEI1LCAweEVDLCAweERCLCAweEI2LCAweEI1LCAweEVGLCAvKiAweEQ4LTB4REIgKi8KKwkweERCLCAweEJBLCAweERCLCAweEI4LCAweEI1LCAweEYyLCAweEI1LCAweEVCLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERCLCAweEIyLCAweERCLCAweEI1LCAvKiAweEUwLTB4RTMgKi8KKwkweEI1LCAweEYwLCAweDAwLCAweDAwLCAweERCLCAweEIzLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweERCLCAweEJFLCAweERCLCAweEJDLCAweERCLCAweEI3LCAweERCLCAweEI5LCAvKiAweEU4LTB4RUIgKi8KKwkweERCLCAweEJCLCAweEI1LCAweEVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweERGLCAweEU4LCAweERGLCAweEVFLCAweERGLCAweEU0LCAvKiAweEY0LTB4RjcgKi8KKwkweERGLCAweEVBLCAweEI4LCAweEJBLCAweERGLCAweEU2LCAweEI4LCAweEMwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI4LCAweEJGLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184N1s1MTJdID0geworCTB4QjgsIDB4QkUsIDB4REYsIDB4RUQsIDB4QjgsIDB4QzEsIDB4QjgsIDB4QzIsIC8qIDB4MDAtMHgwMyAqLworCTB4REYsIDB4RTMsIDB4REYsIDB4RjAsIDB4QjgsIDB4QzMsIDB4QjgsIDB4QkQsIC8qIDB4MDQtMHgwNyAqLworCTB4QjgsIDB4QkMsIDB4REYsIDB4RUMsIDB4QjgsIDB4QzQsIDB4REYsIDB4RTIsIC8qIDB4MDgtMHgwQiAqLworCTB4REYsIDB4RTUsIDB4REYsIDB4RUYsIDB4REYsIDB4RUIsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4RjQsIDB4RTMsIDB4RTksIDB4QjgsIDB4QkIsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4QkIsIDB4NkEsIDB4RTMsIDB4REQsIDB4RTMsIDB4RjIsIDB4RTMsIDB4REUsIC8qIDB4MTgtMHgxQiAqLworCTB4QkIsIDB4NjUsIDB4MDAsIDB4MDAsIDB4RTMsIDB4REIsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4RTMsIDB4RTQsIDB4RTMsIDB4REMsIDB4QkIsIDB4NjcsIDB4RTMsIDB4RDYsIC8qIDB4MjAtMHgyMyAqLworCTB4RTMsIDB4RjEsIDB4QkIsIDB4NjgsIDB4RTMsIDB4RUUsIDB4RTMsIDB4RUYsIC8qIDB4MjQtMHgyNyAqLworCTB4RTMsIDB4RDcsIDB4QkIsIDB4NkQsIDB4RTMsIDB4RTYsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4RTMsIDB4RTAsIDB4RTMsIDB4RTcsIDB4RTMsIDB4REEsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RTMsIDB4RjMsIDB4RTMsIDB4RUIsIDB4RTMsIDB4RTUsIDB4RTMsIDB4RDUsIC8qIDB4MzAtMHgzMyAqLworCTB4QkIsIDB4NjksIDB4RTMsIDB4RUMsIDB4MDAsIDB4MDAsIDB4QkIsIDB4NkMsIC8qIDB4MzQtMHgzNyAqLworCTB4RTMsIDB4RjAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RUEsIDB4QkIsIDB4NjYsIC8qIDB4MzgtMHgzQiAqLworCTB4RTMsIDB4RTgsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RTIsIDB4QkIsIDB4NjQsIC8qIDB4M0MtMHgzRiAqLworCTB4RTMsIDB4RDksIDB4RTMsIDB4RTEsIDB4RTMsIDB4RUQsIDB4RTMsIDB4REYsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RTMsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4QkQsIDB4QzEsIDB4REYsIDB4RTksIDB4RTcsIDB4QjIsIDB4RTcsIDB4QkIsIC8qIDB4NEMtMHg0RiAqLworCTB4RTcsIDB4QjEsIDB4RTcsIDB4QUQsIDB4RTcsIDB4QUEsIDB4QkQsIDB4QzIsIC8qIDB4NTAtMHg1MyAqLworCTB4RTcsIDB4QTgsIDB4QkIsIDB4NkIsIDB4RTcsIDB4QTEsIDB4QkQsIDB4QzAsIC8qIDB4NTQtMHg1NyAqLworCTB4RTcsIDB4QTcsIDB4QkQsIDB4QkYsIDB4RTcsIDB4QUMsIDB4RTcsIDB4QTksIC8qIDB4NTgtMHg1QiAqLworCTB4RTcsIDB4QjksIDB4RTcsIDB4QjQsIDB4RTcsIDB4QUUsIDB4RTcsIDB4QjMsIC8qIDB4NUMtMHg1RiAqLworCTB4QkQsIDB4QkIsIDB4RTcsIDB4QUIsIDB4RTcsIDB4QkUsIDB4RTcsIDB4QTIsIC8qIDB4NjAtMHg2MyAqLworCTB4RTcsIDB4QTMsIDB4RTcsIDB4QkEsIDB4QkQsIDB4QkMsIDB4RTcsIDB4QkYsIC8qIDB4NjQtMHg2NyAqLworCTB4QkQsIDB4QkUsIDB4RTcsIDB4QzAsIDB4RTcsIDB4QjAsIDB4RTMsIDB4RDgsIC8qIDB4NjgtMHg2QiAqLworCTB4RTcsIDB4QjYsIDB4RTcsIDB4QUYsIDB4RTcsIDB4QjgsIDB4RTcsIDB4QjUsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4QTYsIC8qIDB4NzAtMHg3MyAqLworCTB4QkQsIDB4QjksIDB4RTcsIDB4QkQsIDB4QkQsIDB4QkEsIDB4RTcsIDB4QTQsIC8qIDB4NzQtMHg3NyAqLworCTB4QkQsIDB4QkQsIDB4RUIsIDB4NjQsIDB4RTcsIDB4QjcsIDB4RTcsIDB4QkMsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4RUIsIDB4NjEsIDB4QkQsIDB4QjgsIDB4QkYsIDB4QzAsIC8qIDB4ODAtMHg4MyAqLworCTB4RUIsIDB4NkIsIDB4RUIsIDB4NjcsIDB4MDAsIDB4MDAsIDB4RUIsIDB4NjUsIC8qIDB4ODQtMHg4NyAqLworCTB4RUIsIDB4NjAsIDB4RUIsIDB4NkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4QkYsIDB4QzQsIDB4MDAsIDB4MDAsIDB4RUIsIDB4NUMsIC8qIDB4OEMtMHg4RiAqLworCTB4RUIsIDB4NjgsIDB4RUIsIDB4NjksIDB4RUIsIDB4NUYsIDB4RUIsIDB4NUUsIC8qIDB4OTAtMHg5MyAqLworCTB4RUIsIDB4NkMsIDB4MDAsIDB4MDAsIDB4RUIsIDB4NjIsIDB4RUIsIDB4NUQsIC8qIDB4OTQtMHg5NyAqLworCTB4RUIsIDB4NjMsIDB4MDAsIDB4MDAsIDB4RUIsIDB4NkUsIDB4RUIsIDB4NUIsIC8qIDB4OTgtMHg5QiAqLworCTB4RUIsIDB4NkQsIDB4RUIsIDB4NkEsIDB4QkYsIDB4QzIsIDB4QkYsIDB4QzEsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkYsIDB4QzMsIDB4RUIsIDB4NjYsIC8qIDB4QTAtMHhBMyAqLworCTB4RjAsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NTksIDB4QzEsIDB4QjEsIC8qIDB4QTgtMHhBQiAqLworCTB4RUUsIDB4NUQsIDB4RUUsIDB4NUEsIDB4RUUsIDB4NjEsIDB4RUUsIDB4NjcsIC8qIDB4QUMtMHhBRiAqLworCTB4RUUsIDB4NUMsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NzAsIDB4QzEsIDB4QUUsIC8qIDB4QjAtMHhCMyAqLworCTB4RUUsIDB4NkEsIDB4RUUsIDB4NUYsIDB4RUUsIDB4NkIsIDB4RUUsIDB4NjYsIC8qIDB4QjQtMHhCNyAqLworCTB4RUUsIDB4NkQsIDB4RUUsIDB4NUUsIDB4QzEsIDB4QjMsIDB4QzEsIDB4QjIsIC8qIDB4QjgtMHhCQiAqLworCTB4RUUsIDB4NjAsIDB4RUUsIDB4NkUsIDB4RUUsIDB4NTgsIDB4RUUsIDB4NkMsIC8qIDB4QkMtMHhCRiAqLworCTB4QzEsIDB4QUMsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NjQsIDB4RUUsIDB4NjMsIC8qIDB4QzAtMHhDMyAqLworCTB4RUUsIDB4NjgsIDB4RUUsIDB4NUIsIDB4QzEsIDB4QjAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4QzEsIDB4QjQsIDB4RUUsIDB4NjIsIDB4RUUsIDB4NjksIDB4QzEsIDB4QjUsIC8qIDB4QzgtMHhDQiAqLworCTB4RUUsIDB4NjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4QzEsIDB4QUQsIDB4QzEsIDB4QUYsIDB4RjAsIDB4QzcsIC8qIDB4RDAtMHhEMyAqLworCTB4RjAsIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4Q0MsIC8qIDB4RDQtMHhENyAqLworCTB4RjAsIDB4QzksIDB4RjAsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4RjAsIDB4QkUsIC8qIDB4RDgtMHhEQiAqLworCTB4RjAsIDB4QzYsIDB4RjAsIDB4RDEsIDB4RUUsIDB4NkYsIDB4RjAsIDB4QzIsIC8qIDB4REMtMHhERiAqLworCTB4QzIsIDB4Q0YsIDB4RTcsIDB4QTUsIDB4RjAsIDB4QkQsIDB4RjAsIDB4Q0EsIC8qIDB4RTAtMHhFMyAqLworCTB4RjAsIDB4QzQsIDB4RjAsIDB4QzEsIDB4RjAsIDB4QkMsIDB4RjAsIDB4QkIsIC8qIDB4RTQtMHhFNyAqLworCTB4RjAsIDB4RDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4QzAsIDB4RjAsIDB4QkYsIC8qIDB4RTgtMHhFQiAqLworCTB4QzIsIDB4Q0QsIDB4RjAsIDB4QzgsIDB4MDAsIDB4MDAsIDB4QzIsIDB4Q0MsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzIsIDB4Q0UsIDB4RjAsIDB4QzMsIC8qIDB4RjAtMHhGMyAqLworCTB4RjAsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4RjIsIDB4REUsIDB4RjIsIDB4REYsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4QzMsIDB4QzksIDB4RjIsIDB4REMsIDB4QzMsIDB4QzYsIC8qIDB4RjgtMHhGQiAqLworCTB4RjIsIDB4RTQsIDB4MDAsIDB4MDAsIDB4QzMsIDB4Q0EsIDB4RjIsIDB4RTYsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzg4WzUxMl0gPSB7CisJMHhGMiwgMHhEQiwgMHhGMCwgMHhDRSwgMHhGMiwgMHhFOCwgMHhGMiwgMHhERCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhDMywgMHhDNywgMHhGMiwgMHhFMywgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhGMiwgMHhFNSwgMHhGMiwgMHhFMCwgMHhGMiwgMHhFNywgMHhGMiwgMHhFMiwgLyogMHgwOC0weDBCICovCisJMHhGMiwgMHhFMSwgMHhDMywgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhGNCwgMHhDNSwgMHhGNCwgMHhDNiwgMHgwMCwgMHgwMCwgMHhGNCwgMHhDOCwgLyogMHgxMC0weDEzICovCisJMHhDNCwgMHhBRSwgMHhDNCwgMHhBRiwgMHhGNCwgMHhDOSwgMHhGNCwgMHhDNywgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhGNCwgMHhDNCwgMHgwMCwgMHgwMCwgMHhGNiwgMHg0MiwgLyogMHgxOC0weDFCICovCisJMHhGNiwgMHg0NSwgMHhGNiwgMHg0MSwgMHgwMCwgMHgwMCwgMHhDNCwgMHhGQSwgLyogMHgxQy0weDFGICovCisJMHhGNiwgMHg0MywgMHhDNCwgMHhGOSwgMHhDNCwgMHhGOCwgMHhDNCwgMHhGNywgLyogMHgyMC0weDIzICovCisJMHhGNiwgMHg0NCwgMHhGNywgMHg1MSwgMHhGNywgMHg0RiwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhGNywgMHg0RSwgMHhGNiwgMHg0MCwgMHhGNywgMHg1MCwgMHhGNiwgMHg0NiwgLyogMHgyOC0weDJCICovCisJMHhGNywgMHg0RCwgMHgwMCwgMHgwMCwgMHhGNywgMHhGOSwgMHhGNywgMHhENywgLyogMHgyQy0weDJGICovCisJMHhGNywgMHhGNywgMHhDNSwgMHhEQiwgMHhGNywgMHhGOCwgMHhGNywgMHhGQSwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhCRiwgMHhDNSwgMHhGQSwgMHhGOCwgMHhCRSwgLyogMHgzNC0weDM3ICovCisJMHhGOCwgMHhCRCwgMHhDNSwgMHhGQiwgMHgwMCwgMHgwMCwgMHhDNiwgMHg1QSwgLyogMHgzOC0weDNCICovCisJMHhGOSwgMHg2RSwgMHhGOSwgMHhBNywgMHhGOSwgMHhBNiwgMHhGOSwgMHhBOCwgLyogMHgzQy0weDNGICovCisJMHhBNiwgMHhFNSwgMHhEMCwgMHhBQSwgMHgwMCwgMHgwMCwgMHhEMywgMHhDRiwgLyogMHg0MC0weDQzICovCisJMHhEMywgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhEQiwgMHhDMCwgMHgwMCwgMHgwMCwgMHhGNiwgMHg0NywgMHhGOCwgMHhDMCwgLyogMHg0OC0weDRCICovCisJMHhBNiwgMHhFNiwgMHhBRCwgMHg2QywgMHhEMCwgMHhBQiwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhCMSwgMHhCMywgMHg0RSwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhEQiwgMHhDMiwgMHhEQiwgMHhDMSwgMHhCNSwgMHhGMywgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhCOCwgMHhDNSwgMHhFNywgMHhDMSwgMHhCRCwgMHhDMywgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhCRCwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhCRiwgMHhDNSwgMHhDNSwgMHhGQywgMHhBNiwgMHhFNywgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhBQywgLyogMHg2NC0weDY3ICovCisJMHhBQSwgMHhFRCwgMHhEMCwgMHhBRSwgMHhEMCwgMHhBRCwgMHhBRCwgMHg2RCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhEMywgMHhEMSwgMHgwMCwgMHgwMCwgMHhEMywgMHhEOCwgLyogMHg2Qy0weDZGICovCisJMHhCMCwgMHg0OSwgMHhEMywgMHhENiwgMHhEMywgMHhENCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhEMywgMHhEQiwgMHhEMywgMHhEMiwgMHhEMywgMHhEMywgMHhCMCwgMHg0QSwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhCMCwgMHg0RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhEMywgMHhEQywgMHhCMCwgMHg0RCwgMHhEMywgMHhEQSwgMHhEMywgMHhENywgLyogMHg3Qy0weDdGICovCisJCisJMHhEMywgMHhENSwgMHhCMCwgMHg0QiwgMHhCMCwgMHg0QywgMHhEMywgMHhEOSwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhCMywgMHg1MCwgMHhENywgMHhCMiwgMHgwMCwgMHgwMCwgMHhCMywgMHg1NSwgLyogMHg4OC0weDhCICovCisJMHhENywgMHhDMiwgMHhCMywgMHg1NCwgMHhENywgMHhDNCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhENywgMHhCOCwgMHhCMywgMHg1MiwgMHhENywgMHhDMywgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhENywgMHhCMywgMHhCMywgMHg1MywgMHhENywgMHhCRiwgLyogMHg5NC0weDk3ICovCisJMHhENywgMHhCQiwgMHhENywgMHhCRCwgMHhENywgMHhCNywgMHhENywgMHhCRSwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMywgMHg0RiwgMHhENywgMHhCQSwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHhENywgMHhCOSwgMHhENywgMHhCNSwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhENywgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhCQywgLyogMHhBNC0weEE3ICovCisJMHhENywgMHhCNCwgMHgwMCwgMHgwMCwgMHhENywgMHhCNiwgMHhCMywgMHg1MSwgLyogMHhBOC0weEFCICovCisJMHhENywgMHhDMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhCNSwgMHhGNiwgMHhEQiwgMHhDRCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhDOSwgMHhEQiwgMHhDQiwgLyogMHhCNC0weEI3ICovCisJMHhEQiwgMHhDNiwgMHhEQiwgMHhDNSwgMHhEQiwgMHhDMywgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHhEQiwgMHhDQSwgMHhEQiwgMHhDQywgMHhEQiwgMHhDOCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhEQiwgMHhDNywgMHhCNSwgMHhGNCwgMHhCNSwgMHhGNSwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhEQiwgMHhDRiwgMHhCOCwgMHhDRCwgMHhERiwgMHhGMiwgLyogMHhDOC0weENCICovCisJMHhERiwgMHhGOCwgMHhERiwgMHhGMywgMHhERiwgMHhGNCwgMHhGOSwgMHhEOCwgLyogMHhDQy0weENGICovCisJMHhERiwgMHhGOSwgMHgwMCwgMHgwMCwgMHhCOCwgMHhDRiwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhCOCwgMHhDNywgMHhCOCwgMHhDRSwgMHhERiwgMHhGMSwgMHhEQiwgMHhDNCwgLyogMHhENC0weEQ3ICovCisJMHhCOCwgMHhDQSwgMHhCOCwgMHhDOCwgMHhERiwgMHhGNywgMHhERiwgMHhGNiwgLyogMHhEOC0weERCICovCisJMHhCOCwgMHhDOSwgMHhCOCwgMHhDQiwgMHhERiwgMHhGNSwgMHhCOCwgMHhDNiwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhCOCwgMHhDQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhGNiwgLyogMHhFNC0weEU3ICovCisJMHhCQiwgMHg3NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHg0MiwgLyogMHhFOC0weEVCICovCisJMHhFNCwgMHg0MSwgMHgwMCwgMHgwMCwgMHhFMywgMHhGQiwgMHhCQiwgMHg3NiwgLyogMHhFQy0weEVGICovCisJMHhFNCwgMHg0MCwgMHhFMywgMHhGNywgMHhFMywgMHhGOCwgMHhCQiwgMHg2RSwgLyogMHhGMC0weEYzICovCisJMHhCQiwgMHg3MCwgMHgwMCwgMHgwMCwgMHhFMywgMHhGRCwgMHhFMywgMHhGNSwgLyogMHhGNC0weEY3ICovCisJMHhCQiwgMHg3MiwgMHhCQiwgMHg3MSwgMHhFMywgMHhGOSwgMHhFMywgMHhGRSwgLyogMHhGOC0weEZCICovCisJMHhFMywgMHhGQywgMHhCQiwgMHg3MywgMHhFMywgMHhGQSwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODlbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweERCLCAweENFLCAweEJCLCAweDZGLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweEMyLCAweEU3LCAweEM5LCAweEJELCAweEM2LCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweENELCAweEJELCAweENBLCAweEU3LCAweEM1LCAvKiAweDA4LTB4MEIgKi8KKwkweEU3LCAweEMzLCAweDAwLCAweDAwLCAweEU3LCAweENDLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEJELCAweEM1LCAweEU3LCAweENCLCAweEJELCAweEM3LCAweEJELCAweEM4LCAvKiAweDEwLTB4MTMgKi8KKwkweEU3LCAweEM0LCAweEJELCAweEM5LCAweEU3LCAweENBLCAweEU3LCAweEM2LCAvKiAweDE0LTB4MTcgKi8KKwkweEU3LCAweEM3LCAweEU3LCAweEM4LCAweEJCLCAweDc1LCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVCLCAweDcwLCAweEVCLCAweDdDLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweEJGLCAweENBLCAweEVCLCAweDc3LCAweEVCLCAweDc5LCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEJGLCAweEM4LCAweEVCLCAweDcxLCAweEVCLCAweDc1LCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEVCLCAweDc4LCAweEJGLCAweEM2LCAweEJGLCAweEM5LCAvKiAweDI4LTB4MkIgKi8KKwkweEVCLCAweDdCLCAweEVCLCAweDczLCAweEVCLCAweDc0LCAweEVCLCAweDdBLCAvKiAweDJDLTB4MkYgKi8KKwkweEVCLCAweDcyLCAweEVCLCAweDc2LCAweEJGLCAweEM3LCAweEVFLCAweDcyLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweDcxLCAweEMxLCAweEI3LCAweEVFLCAweDc3LCAvKiAweDM0LTB4MzcgKi8KKwkweEMxLCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMxLCAweEI2LCAvKiAweDM4LTB4M0IgKi8KKwkweEVFLCAweDczLCAweEMxLCAweEJBLCAweEVFLCAweDc0LCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweDc1LCAweEVFLCAweDc4LCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEMxLCAweEI4LCAweDAwLCAweDAwLCAweEYwLCAweEQ2LCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweEQ5LCAweDAwLCAweDAwLCAweEYwLCAweEQzLCAvKiAweDQ4LTB4NEIgKi8KKwkweEYwLCAweEQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweEQ0LCAvKiAweDRDLTB4NEYgKi8KKwkweEYwLCAweEQ3LCAweEYwLCAweEQ4LCAweEVFLCAweDc2LCAweEYwLCAweEQyLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMzLCAweENELCAweEYyLCAweEVDLCAvKiAweDU0LTB4NTcgKi8KKwkweEYyLCAweEVGLCAweEYyLCAweEYxLCAweEYyLCAweEVBLCAweEYyLCAweEVCLCAvKiAweDU4LTB4NUIgKi8KKwkweEYyLCAweEVFLCAweEYyLCAweEYwLCAweEMzLCAweENFLCAweEMzLCAweENDLCAvKiAweDVDLTB4NUYgKi8KKwkweEMzLCAweENCLCAweEYyLCAweEVELCAweEYyLCAweEU5LCAweEY0LCAweENBLCAvKiAweDYwLTB4NjMgKi8KKwkweEM0LCAweEIwLCAweDAwLCAweDAwLCAweEY0LCAweENCLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweDQ5LCAweEM0LCAweEZCLCAweEY2LCAweDRCLCAvKiAweDY4LTB4NkIgKi8KKwkweEM0LCAweEZDLCAweEY2LCAweDQ4LCAweEY2LCAweDRBLCAweEM1LCAweEE4LCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweEY3LCAweDUyLCAweEM1LCAweEE3LCAweEY3LCAweEZELCAvKiAweDcwLTB4NzMgKi8KKwkweEY3LCAweEZDLCAweDAwLCAweDAwLCAweEY3LCAweEZCLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEY5LCAweDQ4LCAweEY5LCAweDQ5LCAweEY5LCAweDRCLCAvKiAweDc4LTB4N0IgKi8KKwkweEY5LCAweDRBLCAweDAwLCAweDAwLCAweENBLCAweDUwLCAweEE2LCAweEU4LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweEFELCAweDZFLCAweEQ3LCAweEM1LCAweEI1LCAweEY3LCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweERGLCAweEZBLCAweEMyLCAweEQwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweEYyLCAweEYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweEEzLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIzLCAweDU3LCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIzLCAweDU2LCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweERCLCAweEQwLCAweEI1LCAweEY4LCAweERCLCAweEQyLCAvKiAweDk0LTB4OTcgKi8KKwkweERCLCAweEQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweEZCLCAvKiAweDk4LTB4OUIgKi8KKwkweEI4LCAweEQwLCAweEU0LCAweDQzLCAweEU0LCAweDQ2LCAweEU0LCAweDQ1LCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweDQ0LCAweEU3LCAweENFLCAweEU3LCAweEQwLCAvKiAweEEwLTB4QTMgKi8KKwkweEU3LCAweENGLCAweDAwLCAweDAwLCAweEJGLCAweENDLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJGLCAweENCLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweEMxLCAweEJCLCAweEVFLCAweDc5LCAweEVFLCAweDdCLCAweEVFLCAweDdBLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMyLCAweEQxLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweEY0LCAweEYyLCAweEYzLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweENDLCAweEM0LCAweEIxLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweEM0LCAweEZELCAweEY3LCAweDU0LCAweEY3LCAweDUzLCAvKiAweEJDLTB4QkYgKi8KKwkweEM2LCAweDVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweEE0LCAweEQwLCAweEFGLCAvKiAweEQwLTB4RDMgKi8KKwkweEFELCAweDZGLCAweEQ3LCAweEM4LCAweEQ3LCAweEM2LCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweEQ3LCAweEM3LCAweERCLCAweEQ0LCAweERCLCAweEQ1LCAvKiAweEQ4LTB4REIgKi8KKwkweEUwLCAweDQzLCAweERCLCAweEQzLCAweDAwLCAweDAwLCAweERGLCAweEZDLCAvKiAweERDLTB4REYgKi8KKwkweEUwLCAweDQxLCAweEUwLCAweDQwLCAweEUwLCAweDQyLCAweEI4LCAweEQxLCAvKiAweEUwLTB4RTMgKi8KKwkweERGLCAweEZFLCAweERGLCAweEZELCAweEUwLCAweDQ0LCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEU0LCAweDQ5LCAweEU0LCAweDQ3LCAweDAwLCAweDAwLCAweEU0LCAweDQ4LCAvKiAweEU4LTB4RUIgKi8KKwkweEU3LCAweEQzLCAweEU3LCAweEQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweEU3LCAweEQyLCAweEVCLCAweDdELCAweEVFLCAweDdDLCAweEVFLCAweDdELCAvKiAweEYwLTB4RjMgKi8KKwkweEMyLCAweEQyLCAweDAwLCAweDAwLCAweEYyLCAweEY1LCAweEY0LCAweENELCAvKiAweEY0LTB4RjcgKi8KKwkweEM0LCAweEIyLCAweDAwLCAweDAwLCAweEY2LCAweDRDLCAweEY3LCAweDU1LCAvKiAweEY4LTB4RkIgKi8KKwkweEM1LCAweEE5LCAweDAwLCAweDAwLCAweEY3LCAweEZFLCAweEY5LCAweDRDLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184QVs1MTJdID0geworCTB4QTgsIDB4QTUsIDB4MDAsIDB4MDAsIDB4QUQsIDB4NzEsIDB4QUQsIDB4NzIsIC8qIDB4MDAtMHgwMyAqLworCTB4RDAsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QjEsIC8qIDB4MDQtMHgwNyAqLworCTB4QUQsIDB4NzAsIDB4MDAsIDB4MDAsIDB4QjAsIDB4NTQsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4QjAsIDB4NTIsIDB4MDAsIDB4MDAsIDB4QjAsIDB4NTEsIDB4QjAsIDB4NTgsIC8qIDB4MEMtMHgwRiAqLworCTB4QjAsIDB4NTAsIDB4QjAsIDB4NTksIDB4RDMsIDB4REQsIDB4QjAsIDB4NTYsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4QjAsIDB4NTMsIDB4QjAsIDB4NTcsIDB4QjAsIDB4NTUsIC8qIDB4MTQtMHgxNyAqLworCTB4QjAsIDB4NEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjMsIDB4NUYsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4QjMsIDB4NTksIDB4RDcsIDB4Q0MsIDB4QjMsIDB4NUUsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjMsIDB4NjAsIDB4QjMsIDB4NUEsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4QjMsIDB4NUIsIDB4MDAsIDB4MDAsIDB4RDcsIDB4Q0EsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjMsIDB4NTgsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4RDcsIDB4Q0IsIDB4QjMsIDB4NUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RDcsIDB4QzksIDB4QjMsIDB4NUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4QjYsIDB4NDQsIDB4MDAsIDB4MDAsIDB4QjYsIDB4NDYsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4RDgsIDB4QjYsIDB4NDUsIDB4QjUsIDB4RjksIC8qIDB4MzgtMHgzQiAqLworCTB4QjUsIDB4RkQsIDB4MDAsIDB4MDAsIDB4QjgsIDB4RTQsIDB4RTAsIDB4NDksIC8qIDB4M0MtMHgzRiAqLworCTB4REIsIDB4REEsIDB4QjUsIDB4RkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4REIsIDB4REQsIDB4REIsIDB4REUsIDB4QjYsIDB4NDMsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4REIsIDB4RTAsIDB4MDAsIDB4MDAsIDB4REIsIDB4RTIsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4REIsIDB4RTMsIDB4REIsIDB4RDcsIDB4REIsIDB4RDYsIDB4REIsIDB4RTQsIC8qIDB4NEMtMHg0RiAqLworCTB4QjYsIDB4NDIsIDB4REIsIDB4RTEsIDB4REIsIDB4REYsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4QjYsIDB4NDAsIDB4QjUsIDB4RkIsIDB4QjYsIDB4NDcsIDB4REIsIDB4REIsIC8qIDB4NTQtMHg1NyAqLworCTB4REIsIDB4REMsIDB4REIsIDB4RDksIDB4MDAsIDB4MDAsIDB4QjYsIDB4NDEsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjUsIDB4RkMsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4QjUsIDB4RkEsIDB4RTAsIDB4NDgsIDB4QjgsIDB4REYsIDB4QjgsIDB4REEsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjgsIDB4RDUsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4QjgsIDB4RTUsIDB4QjgsIDB4RDYsIDB4MDAsIDB4MDAsIDB4QjgsIDB4RDIsIC8qIDB4NjgtMHg2QiAqLworCTB4QjgsIDB4RTEsIDB4QjgsIDB4REUsIDB4QjgsIDB4RTAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4QjgsIDB4RDcsIDB4QjgsIDB4REMsIDB4QjgsIDB4RDMsIDB4QjgsIDB4RDQsIC8qIDB4NzAtMHg3MyAqLworCTB4RTAsIDB4NTAsIDB4RTAsIDB4NEQsIDB4RTAsIDB4NDUsIDB4RTAsIDB4NEEsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4QjgsIDB4RTIsIDB4RTAsIDB4NTEsIDB4QjgsIDB4RTMsIC8qIDB4NzgtMHg3QiAqLworCTB4QjgsIDB4RDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4NDcsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4RTAsIDB4NEYsIDB4RTAsIDB4NEIsIDB4RTAsIDB4NEUsIC8qIDB4ODAtMHg4MyAqLworCTB4RTAsIDB4NEMsIDB4QjgsIDB4REQsIDB4RTAsIDB4NDYsIDB4QjgsIDB4RDgsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4NEMsIC8qIDB4ODgtMHg4QiAqLworCTB4QkIsIDB4NzgsIDB4QkIsIDB4N0IsIDB4MDAsIDB4MDAsIDB4RTQsIDB4NEUsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4QkIsIDB4QTUsIDB4RTQsIDB4NEQsIDB4QkIsIDB4N0QsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4QkQsIDB4Q0YsIDB4RTQsIDB4NEYsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4QkIsIDB4QTQsIDB4RTQsIDB4NEIsIDB4QkIsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkIsIDB4NzksIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4QjgsIDB4REIsIDB4QkIsIDB4N0MsIDB4MDAsIDB4MDAsIDB4QkIsIDB4N0EsIC8qIDB4QTAtMHhBMyAqLworCTB4QkIsIDB4N0UsIDB4QkIsIDB4QTIsIDB4QkIsIDB4NzcsIDB4QkIsIDB4QTcsIC8qIDB4QTQtMHhBNyAqLworCTB4QkIsIDB4QTMsIDB4MDAsIDB4MDAsIDB4QkIsIDB4QTEsIDB4RTQsIDB4NEEsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4QkQsIDB4RDYsIDB4MDAsIDB4MDAsIDB4QkQsIDB4RDIsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkQsIDB4RDksIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4RTcsIDB4RDYsIDB4QkQsIDB4REEsIDB4RTcsIDB4RTIsIDB4RTcsIDB4REIsIC8qIDB4QjgtMHhCQiAqLworCTB4QkQsIDB4Q0IsIDB4RTcsIDB4RTMsIDB4RTcsIDB4REQsIDB4QkQsIDB4RDUsIC8qIDB4QkMtMHhCRiAqLworCTB4RTcsIDB4REUsIDB4MDAsIDB4MDAsIDB4QkQsIDB4RDQsIDB4RTcsIDB4RTEsIC8qIDB4QzAtMHhDMyAqLworCTB4QkQsIDB4Q0UsIDB4RTcsIDB4REYsIDB4RTcsIDB4RDUsIDB4QkQsIDB4Q0QsIC8qIDB4QzQtMHhDNyAqLworCTB4RUIsIDB4QUEsIDB4QkQsIDB4RDMsIDB4MDAsIDB4MDAsIDB4QkQsIDB4RDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4QkQsIDB4RDgsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RDQsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4RDgsIDB4QkQsIDB4Q0MsIDB4RTcsIDB4RDcsIC8qIDB4RDAtMHhEMyAqLworCTB4RTcsIDB4RDksIDB4RTcsIDB4REEsIDB4QkQsIDB4RDcsIDB4RTcsIDB4REMsIC8qIDB4RDQtMHhENyAqLworCTB4RTcsIDB4RTAsIDB4RTcsIDB4RTQsIDB4MDAsIDB4MDAsIDB4QkQsIDB4REIsIC8qIDB4RDgtMHhEQiAqLworCTB4QkYsIDB4RDIsIDB4RUIsIDB4QTUsIDB4RUIsIDB4QUIsIDB4RUIsIDB4QTgsIC8qIDB4REMtMHhERiAqLworCTB4RUIsIDB4N0UsIDB4RUIsIDB4QUMsIDB4RUIsIDB4QTEsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4RUIsIDB4QTcsIDB4MDAsIDB4MDAsIDB4QkYsIDB4Q0QsIDB4QkYsIDB4RDMsIC8qIDB4RTQtMHhFNyAqLworCTB4RUIsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkYsIDB4Q0YsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4QkYsIDB4RDksIDB4QkYsIDB4RDQsIDB4RUIsIDB4QUYsIC8qIDB4RUMtMHhFRiAqLworCTB4RUIsIDB4QTksIDB4QkYsIDB4RDAsIDB4RUIsIDB4QTIsIDB4QkYsIDB4REEsIC8qIDB4RjAtMHhGMyAqLworCTB4RUIsIDB4QTMsIDB4RUIsIDB4QTQsIDB4QkYsIDB4REIsIDB4QkYsIDB4RDgsIC8qIDB4RjQtMHhGNyAqLworCTB4QkQsIDB4RDEsIDB4MDAsIDB4MDAsIDB4QkYsIDB4Q0UsIDB4RUIsIDB4QjAsIC8qIDB4RjgtMHhGQiAqLworCTB4QkYsIDB4REMsIDB4MDAsIDB4MDAsIDB4QkYsIDB4RDUsIDB4RUIsIDB4QUUsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzhCWzUxMl0gPSB7CisJMHhCRiwgMHhEMSwgMHhCRiwgMHhENiwgMHhCRiwgMHhENywgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhDMSwgMHhDMywgMHhFRSwgMHhBNCwgMHhFRSwgMHhBRCwgMHhFRSwgMHhBQSwgLyogMHgwNC0weDA3ICovCisJMHhFRSwgMHhBQywgMHgwMCwgMHgwMCwgMHhDMSwgMHhDMCwgMHhFRSwgMHhBNSwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhBQiwgMHhDMSwgMHhCQywgMHhFRSwgMHhBNywgLyogMHgwQy0weDBGICovCisJMHhDMSwgMHhDNCwgMHhFRSwgMHhBMywgMHhFRSwgMHhBOCwgMHhFRSwgMHhBRiwgLyogMHgxMC0weDEzICovCisJMHhFQiwgMHhBNiwgMHhFRSwgMHhBOSwgMHhFRSwgMHhBMiwgMHhDMSwgMHhCRCwgLyogMHgxNC0weDE3ICovCisJMHhFRSwgMHhBMSwgMHhDMSwgMHhCRSwgMHhFRSwgMHhCMCwgMHhDMSwgMHhCRiwgLyogMHgxOC0weDFCICovCisJMHhFRSwgMHhBRSwgMHhDMSwgMHhDMiwgMHhFRSwgMHg3RSwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhDMSwgMHhDMSwgMHgwMCwgMHgwMCwgMHhFRSwgMHhBNiwgMHhGMCwgMHhEQywgLyogMHgyMC0weDIzICovCisJMHhGMCwgMHhFQSwgMHhGMCwgMHhFNSwgMHhGMCwgMHhFNywgMHhGMCwgMHhEQiwgLyogMHgyNC0weDI3ICovCisJMHhDMiwgMHhEMywgMHgwMCwgMHgwMCwgMHhGMCwgMHhEQSwgMHhDMiwgMHhENiwgLyogMHgyOC0weDJCICovCisJMHhDMiwgMHhENSwgMHgwMCwgMHgwMCwgMHhGMCwgMHhFOSwgMHhGMCwgMHhFMSwgLyogMHgyQy0weDJGICovCisJMHhGMCwgMHhERSwgMHhGMCwgMHhFNCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhERCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhERiwgMHhGMCwgMHhFOCwgMHhGMCwgMHhFNiwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHhDMiwgMHhENCwgMHhGMCwgMHhFRCwgMHhGMCwgMHhFQiwgLyogMHgzOC0weDNCICovCisJMHhGMCwgMHhFMiwgMHhGMCwgMHhFQywgMHhGMCwgMHhFMywgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhGMiwgMHhGOSwgMHhDMywgMHhDRiwgMHhGMywgMHg0MSwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHg0RiwgMHhDMywgMHhENiwgMHhGMCwgMHhFMCwgLyogMHg0NC0weDQ3ICovCisJMHhGMiwgMHhGNywgMHhDMywgMHhEMiwgMHhGMiwgMHhGOCwgMHhGMiwgMHhGRCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMywgMHhENCwgMHhDMywgMHhENSwgLyogMHg0Qy0weDRGICovCisJMHhGMiwgMHhGNiwgMHhGMywgMHg0MCwgMHhGMywgMHg0MiwgMHhGMiwgMHhGQSwgLyogMHg1MC0weDUzICovCisJMHhGMiwgMHhGQywgMHhGMiwgMHhGRSwgMHhGMiwgMHhGQiwgMHhGMywgMHg0MywgLyogMHg1NC0weDU3ICovCisJMHhDMywgMHhEMSwgMHhDMywgMHhENywgMHhDMywgMHhEMywgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHhDMywgMHhEMCwgMHhGNCwgMHhEMCwgMHgwMCwgMHgwMCwgMHhDNCwgMHhCNywgLyogMHg1Qy0weDVGICovCisJMHhGNCwgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhEMiwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhGNCwgMHhEMywgMHhDNCwgMHhCNSwgMHhGNCwgMHhENCwgLyogMHg2NC0weDY3ICovCisJMHhGNCwgMHhEMSwgMHgwMCwgMHgwMCwgMHhGNCwgMHhDRiwgMHhDNCwgMHhCOCwgLyogMHg2OC0weDZCICovCisJMHhDNCwgMHhCNCwgMHhGNCwgMHhENSwgMHgwMCwgMHgwMCwgMHhDNCwgMHhCNiwgLyogMHg2Qy0weDZGICovCisJMHhDNCwgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhDNCwgMHhGRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDNSwgMHg0MCwgLyogMHg3NC0weDc3ICovCisJMHhGNiwgMHg0RSwgMHhGNiwgMHg0RCwgMHhGNiwgMHg1MCwgMHhGNiwgMHg1MSwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhDNSwgMHg0MSwgMHhGNywgMHg1NiwgMHhGNywgMHg1QiwgLyogMHg3Qy0weDdGICovCisJCisJMHhDNSwgMHhBQSwgMHgwMCwgMHgwMCwgMHhGNywgMHg1OCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhGNywgMHg1NywgMHhGNywgMHg1QSwgMHhGNywgMHg1OSwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhGOCwgMHg0MywgMHgwMCwgMHgwMCwgMHhDNSwgMHhEQywgMHhGOCwgMHg0MiwgLyogMHg4OC0weDhCICovCisJMHhGOCwgMHg0MCwgMHgwMCwgMHgwMCwgMHhGOCwgMHg0MSwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDNSwgMHhGRSwgMHhDNSwgMHhGRCwgLyogMHg5MC0weDkzICovCisJMHhGOCwgMHhDMSwgMHhGOCwgMHhDMiwgMHhDNiwgMHg0MCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhGOSwgMHg0RCwgMHhGOSwgMHg0RSwgMHhDNiwgMHg2NywgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhDNiwgMHg2RCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhBOSwgMHhGOSwgMHhDOCwgLyogMHg5Qy0weDlGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOENbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweEE2LCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweEQ3LCAweENELCAweDAwLCAweDAwLCAweEQ3LCAweENFLCAvKiAweDM4LTB4M0IgKi8KKwkweEUwLCAweDUyLCAweEU0LCAweDUwLCAweEU3LCAweEU1LCAweEMxLCAweEM2LCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweEMxLCAweEM1LCAweEYwLCAweEVFLCAweEYzLCAweDQ0LCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweDQ0LCAweEE4LCAweEE3LCAweEQzLCAweERFLCAvKiAweDQ0LTB4NDcgKi8KKwkweEIwLCAweDVBLCAweEIzLCAweDYxLCAweEUwLCAweDU0LCAweEUwLCAweDUzLCAvKiAweDQ4LTB4NEIgKi8KKwkweEJELCAweERDLCAweEU3LCAweEU2LCAweEJELCAweERELCAweEVFLCAweEIxLCAvKiAweDRDLTB4NEYgKi8KKwkweEMyLCAweEQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweEM2LCAweDc2LCAweEE4LCAweEE4LCAweENELCAweENCLCAweEQzLCAweERGLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIzLCAweDYyLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweEQ3LCAweENGLCAweEQ3LCAweEQwLCAweDAwLCAweDAwLCAweERCLCAweEU1LCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweEI2LCAweDQ4LCAweEI4LCAweEU2LCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEUwLCAweDU2LCAweEUwLCAweDU1LCAweEUwLCAweDU3LCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEU0LCAweDUxLCAweEU0LCAweDUyLCAweEJCLCAweEE4LCAweEJGLCAweERELCAvKiAweDY4LTB4NkIgKi8KKwkweEJELCAweERFLCAweEJGLCAweERFLCAweDAwLCAweDAwLCAweEVFLCAweEI1LCAvKiAweDZDLTB4NkYgKi8KKwkweEVFLCAweEIyLCAweEVFLCAweEI0LCAweEVFLCAweEIzLCAweEMxLCAweEM3LCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweEVGLCAweEYzLCAweDQ2LCAweEYzLCAweDQ1LCAvKiAweDc0LTB4NzcgKi8KKwkweENCLCAweEE0LCAweEIwLCAweDVDLCAweEIwLCAweDVCLCAweEQzLCAweEUwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEQ3LCAweEQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweERCLCAweEU3LCAweERCLCAweEU2LCAweEI2LCAweDQ5LCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEUwLCAweDU5LCAweEUwLCAweDVBLCAweEUwLCAweDU4LCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEI4LCAweEU4LCAweEI4LCAweEU3LCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweEJCLCAweEFBLCAweEJCLCAweEE5LCAweDAwLCAweDAwLCAweEU3LCAweEU3LCAvKiAweDhDLTB4OEYgKi8KKwkweEVCLCAweEIzLCAweEVCLCAweEIxLCAweEVCLCAweEIyLCAweEJGLCAweERGLCAvKiAweDkwLTB4OTMgKi8KKwkweEVFLCAweEI3LCAweEVFLCAweEI2LCAweDAwLCAweDAwLCAweEYwLCAweEYyLCAvKiAweDk0LTB4OTcgKi8KKwkweEYwLCAweEYxLCAweEYwLCAweEYwLCAweEYzLCAweDQ3LCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEY5LCAweEFBLCAweEE4LCAweEE5LCAweEFELCAweDczLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweEFELCAweDc0LCAweEIwLCAweDVELCAweEIwLCAweDVFLCAweEQzLCAweEUyLCAvKiAweEEwLTB4QTMgKi8KKwkweEQzLCAweEUxLCAweEQ3LCAweEQyLCAweDAwLCAweDAwLCAweEIzLCAweDY4LCAvKiAweEE0LTB4QTcgKi8KKwkweEIzLCAweDY2LCAweEIzLCAweDYzLCAweEIzLCAweDY3LCAweEIzLCAweDY1LCAvKiAweEE4LTB4QUIgKi8KKwkweEIzLCAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI2LCAweDRBLCAvKiAweEFDLTB4QUYgKi8KKwkweERCLCAweEVBLCAweDAwLCAweDAwLCAweEI4LCAweEVELCAweEI2LCAweDRDLCAvKiAweEIwLTB4QjMgKi8KKwkweEI2LCAweDUxLCAweERCLCAweEVDLCAweEI2LCAweDUzLCAweEI2LCAweDUyLCAvKiAweEI0LTB4QjcgKi8KKwkweEI2LCAweDU1LCAweERCLCAweEVCLCAweERCLCAweEU4LCAweEI2LCAweDRGLCAvKiAweEI4LTB4QkIgKi8KKwkweEI2LCAweDRCLCAweEI2LCAweDRELCAweERCLCAweEU5LCAweEI2LCAweDU0LCAvKiAweEJDLTB4QkYgKi8KKwkweEI2LCAweDUwLCAweEI2LCAweDRFLCAweEI4LCAweEVGLCAweEI4LCAweEVFLCAvKiAweEMwLTB4QzMgKi8KKwkweEI4LCAweEVDLCAweEI4LCAweEYwLCAweDAwLCAweDAwLCAweEI4LCAweEVBLCAvKiAweEM0LTB4QzcgKi8KKwkweEI4LCAweEVCLCAweDAwLCAweDAwLCAweEI4LCAweEU5LCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEUwLCAweDVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweDU0LCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEJCLCAweEFDLCAweEJCLCAweEFELCAweEJCLCAweEFCLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweDUzLCAweDAwLCAweDAwLCAweEU0LCAweDU1LCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweEVBLCAweEU3LCAweEVDLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweEJELCAweEU3LCAweEU3LCAweEVELCAweEJELCAweEUwLCAweEU3LCAweEU5LCAvKiAweERDLTB4REYgKi8KKwkweEJELCAweERGLCAweEJELCAweEU5LCAweEJELCAweEU1LCAweEJELCAweEU2LCAvKiAweEUwLTB4RTMgKi8KKwkweEJELCAweEUyLCAweEU3LCAweEU4LCAweEJELCAweEUxLCAweEU3LCAweEVFLCAvKiAweEU0LTB4RTcgKi8KKwkweEU3LCAweEVCLCAweDAwLCAweDAwLCAweEJELCAweEU4LCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweEJELCAweEUzLCAweEJELCAweEU0LCAweEVCLCAweEI1LCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweEVCLCAweEI3LCAweEVCLCAweEI2LCAweDAwLCAweDAwLCAweEVCLCAweEI4LCAvKiAweEYwLTB4RjMgKi8KKwkweEJGLCAweEUwLCAweEVCLCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEMxLCAweENCLCAweEVFLCAweEI4LCAweEMxLCAweEM4LCAweEMxLCAweENDLCAvKiAweEY4LTB4RkIgKi8KKwkweEMxLCAweENBLCAweEMxLCAweEM5LCAweEYwLCAweEYzLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184RFs1MTJdID0geworCTB4RjAsIDB4RjYsIDB4MDAsIDB4MDAsIDB4RjAsIDB4RjUsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RjAsIDB4RjQsIDB4QzIsIDB4RDgsIDB4RjMsIDB4NDgsIDB4RjMsIDB4NDksIC8qIDB4MDQtMHgwNyAqLworCTB4QzMsIDB4RDgsIDB4RjMsIDB4NEEsIDB4QzMsIDB4RDksIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4QzQsIDB4QkEsIDB4MDAsIDB4MDAsIDB4QzQsIDB4QjksIC8qIDB4MEMtMHgwRiAqLworCTB4RjYsIDB4NTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzUsIDB4NDIsIC8qIDB4MTAtMHgxMyAqLworCTB4RjYsIDB4NTMsIDB4RjcsIDB4NUMsIDB4QzUsIDB4QUIsIDB4QzUsIDB4QUMsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RjgsIDB4NDUsIDB4MDAsIDB4MDAsIDB4QzYsIDB4NDIsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4QTgsIDB4QUEsIDB4MDAsIDB4MDAsIDB4QjMsIDB4NkEsIDB4QjMsIDB4NjksIC8qIDB4NjQtMHg2NyAqLworCTB4RTAsIDB4NUMsIDB4RTAsIDB4NUQsIDB4MDAsIDB4MDAsIDB4QkIsIDB4QUUsIC8qIDB4NjgtMHg2QiAqLworCTB4RUIsIDB4QjksIDB4QkQsIDB4RUEsIDB4RUIsIDB4QkEsIDB4RUUsIDB4QjksIC8qIDB4NkMtMHg2RiAqLworCTB4QTgsIDB4QUIsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QjIsIDB4QUQsIDB4NzYsIC8qIDB4NzAtMHg3MyAqLworCTB4QUQsIDB4NzUsIDB4MDAsIDB4MDAsIDB4RDMsIDB4RTMsIDB4QjAsIDB4NUYsIC8qIDB4NzQtMHg3NyAqLworCTB4RDMsIDB4RTQsIDB4RDcsIDB4RDUsIDB4MDAsIDB4MDAsIDB4RDcsIDB4RDQsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4RDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4REIsIDB4RUUsIDB4QjYsIDB4NTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4REIsIDB4RUQsIDB4QjYsIDB4NTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4RUYsIDB4QjYsIDB4NTYsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4RTAsIDB4NUYsIDB4RTAsIDB4NjIsIDB4RTAsIDB4NjAsIDB4RTAsIDB4NjEsIC8qIDB4OEMtMHg4RiAqLworCTB4RTAsIDB4NjUsIDB4RTAsIDB4NUUsIDB4RTAsIDB4NjYsIDB4RTAsIDB4NjMsIC8qIDB4OTAtMHg5MyAqLworCTB4RTAsIDB4NjQsIDB4QkIsIDB4QjAsIDB4RTQsIDB4NTYsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4QkIsIDB4QUYsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RjIsIC8qIDB4OTgtMHg5QiAqLworCTB4RTcsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkQsIDB4RUIsIC8qIDB4OUMtMHg5RiAqLworCTB4RTcsIDB4RUYsIDB4RTcsIDB4RjEsIDB4MDAsIDB4MDAsIDB4QkQsIDB4RUMsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4RUIsIDB4QkIsIDB4MDAsIDB4MDAsIDB4RUIsIDB4QkMsIC8qIDB4QTQtMHhBNyAqLworCTB4QzEsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4RjMsIDB4NEMsIDB4RjMsIDB4NEUsIC8qIDB4QTgtMHhBQiAqLworCTB4RjMsIDB4NEIsIDB4RjMsIDB4NEQsIDB4RjQsIDB4RDYsIDB4RjYsIDB4NTQsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4NkYsIDB4QTgsIDB4QUMsIC8qIDB4QjAtMHhCMyAqLworCTB4QUQsIDB4NzcsIDB4RDMsIDB4RTUsIDB4RDMsIDB4RTcsIDB4RDMsIDB4RTYsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4RDgsIDB4QjMsIDB4NkMsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4RDcsIDB4RDYsIDB4MDAsIDB4MDAsIDB4QjMsIDB4NkIsIDB4RDcsIDB4RDksIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4REEsIDB4RDcsIDB4RDcsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4RkIsIDB4QjYsIDB4NjAsIDB4REIsIDB4RjMsIC8qIDB4QzQtMHhDNyAqLworCTB4REIsIDB4RjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjYsIDB4NUIsIC8qIDB4QzgtMHhDQiAqLworCTB4QjYsIDB4NUUsIDB4REIsIDB4RjIsIDB4QjYsIDB4NTksIDB4REIsIDB4RjYsIC8qIDB4Q0MtMHhDRiAqLworCTB4RTAsIDB4NkMsIDB4QjYsIDB4NUQsIDB4MDAsIDB4MDAsIDB4REIsIDB4RjEsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4RjcsIDB4REIsIDB4RjQsIDB4REIsIDB4RkEsIC8qIDB4RDQtMHhENyAqLworCTB4REIsIDB4RjAsIDB4REIsIDB4RjgsIDB4QjYsIDB4NUMsIDB4QjYsIDB4NUYsIC8qIDB4RDgtMHhEQiAqLworCTB4REIsIDB4RjUsIDB4QjYsIDB4NUEsIDB4MDAsIDB4MDAsIDB4QjgsIDB4RjIsIC8qIDB4REMtMHhERiAqLworCTB4RTAsIDB4NjgsIDB4QjgsIDB4RjEsIDB4RTAsIDB4NkYsIDB4RTAsIDB4NkUsIC8qIDB4RTAtMHhFMyAqLworCTB4QjgsIDB4RjgsIDB4MDAsIDB4MDAsIDB4QjgsIDB4RjksIDB4RTAsIDB4NzAsIC8qIDB4RTQtMHhFNyAqLworCTB4QjgsIDB4RjMsIDB4RTAsIDB4NkQsIDB4QjgsIDB4RjcsIDB4RTAsIDB4NzIsIC8qIDB4RTgtMHhFQiAqLworCTB4RTAsIDB4NjksIDB4MDAsIDB4MDAsIDB4RTAsIDB4NkIsIDB4QjgsIDB4RjQsIC8qIDB4RUMtMHhFRiAqLworCTB4RTAsIDB4NjcsIDB4RTAsIDB4NkEsIDB4RTAsIDB4NzEsIDB4QjgsIDB4RjUsIC8qIDB4RjAtMHhGMyAqLworCTB4RTAsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjgsIDB4RjYsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4QkIsIDB4QjEsIDB4RTQsIDB4NUIsIDB4RTQsIDB4NjEsIDB4RTQsIDB4NTksIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzhFWzUxMl0gPSB7CisJMHhFNCwgMHg2MiwgMHgwMCwgMHgwMCwgMHhFNCwgMHg1OCwgMHhFNCwgMHg1RCwgLyogMHgwMC0weDAzICovCisJMHhFNCwgMHg2MywgMHhFNCwgMHg2MCwgMHhFNCwgMHg1RiwgMHhFNCwgMHg1RSwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHg1NywgMHhFNCwgMHg1QywgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHg1QSwgMHgwMCwgMHgwMCwgMHhCRCwgMHhGMSwgLyogMHgwQy0weDBGICovCisJMHhCRCwgMHhFRSwgMHhFNywgMHhGQiwgMHhFOCwgMHg0MSwgMHhFOCwgMHg0MywgLyogMHgxMC0weDEzICovCisJMHhFOCwgMHg0MCwgMHhFNywgMHhGOCwgMHhFNywgMHhGQSwgMHhFOCwgMHg0NSwgLyogMHgxNC0weDE3ICovCisJMHhFOCwgMHg0MiwgMHhFNywgMHhGQywgMHhFOCwgMHg0NiwgMHhFNywgMHhGOSwgLyogMHgxOC0weDFCICovCisJMHhFOCwgMHg0NCwgMHhCRCwgMHhFRiwgMHhCRCwgMHhGNSwgMHhCRCwgMHhGMywgLyogMHgxQy0weDFGICovCisJMHhFNywgMHhGMywgMHhCRCwgMHhGNCwgMHhCRCwgMHhGMCwgMHhFNywgMHhGNCwgLyogMHgyMC0weDIzICovCisJMHhFNywgMHhGNiwgMHhFNywgMHhGNSwgMHhFNywgMHhGRCwgMHhFNywgMHhGRSwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhCRCwgMHhGMiwgMHgwMCwgMHgwMCwgMHhCRCwgMHhFRCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhGNywgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhFQiwgMHhDNiwgMHhCRiwgMHhFMiwgMHgwMCwgMHgwMCwgMHhFQiwgMHhCRCwgLyogMHgzMC0weDMzICovCisJMHhCRiwgMHhFMywgMHhCRiwgMHhFNiwgMHhFQiwgMHhDMiwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhFQiwgMHhCRiwgMHhCRiwgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhFQiwgMHhDMywgMHhFQiwgMHhDNCwgMHhFQiwgMHhCRSwgMHhFQiwgMHhDNywgLyogMHgzQy0weDNGICovCisJMHhFQiwgMHhDMCwgMHhFQiwgMHhDNSwgMHhCRiwgMHhFNCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhCRiwgMHhFMSwgMHhFQiwgMHhDMSwgMHgwMCwgMHgwMCwgMHhFRSwgMHhCRiwgLyogMHg0NC0weDQ3ICovCisJMHhDMSwgMHhEMCwgMHhDMSwgMHhDRSwgMHhDMSwgMHhEMSwgMHhDMSwgMHhDRiwgLyogMHg0OC0weDRCICovCisJMHhFRSwgMHhCRSwgMHhFRSwgMHhCQiwgMHhFRSwgMHhCQSwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhFRSwgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhCQywgLyogMHg1MC0weDUzICovCisJMHhGMSwgMHg0NSwgMHhDMiwgMHhERSwgMHhGMCwgMHhGQiwgMHhGMCwgMHhGQSwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhDMiwgMHhEOSwgMHhGMSwgMHg0MSwgMHhGMSwgMHg0MCwgLyogMHg1OC0weDVCICovCisJMHhGMCwgMHhGNywgMHhGMSwgMHg0MywgMHhGMCwgMHhGQywgMHhDMiwgMHhERCwgLyogMHg1Qy0weDVGICovCisJMHhGMCwgMHhGOSwgMHhGMSwgMHg0MiwgMHhGMCwgMHhGOCwgMHhDMiwgMHhEQSwgLyogMHg2MC0weDYzICovCisJMHhDMiwgMHhEQywgMHhGMCwgMHhGRCwgMHhDMiwgMHhEQiwgMHhGMCwgMHhGRSwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHg0NCwgMHhGMywgMHg1MiwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhDMywgMHhERSwgMHhGMywgMHg0RiwgMHgwMCwgMHgwMCwgMHhGMywgMHg1MywgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMywgMHhEQiwgMHhGMywgMHg1MSwgLyogMHg3MC0weDczICovCisJMHhDMywgMHhFMCwgMHgwMCwgMHgwMCwgMHhDMywgMHhERCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHhGMywgMHg1MCwgMHgwMCwgMHgwMCwgMHhDMywgMHhERiwgMHhGMywgMHg1NCwgLyogMHg3OC0weDdCICovCisJMHhDMywgMHhEQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhDNCwgMHhCQywgMHhDNCwgMHhCRSwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhGNCwgMHhEOSwgMHhDNCwgMHhCRCwgMHhGNCwgMHhENywgMHhDMywgMHhEQywgLyogMHg4NC0weDg3ICovCisJMHhGNCwgMHhEOCwgMHhDNCwgMHhCQiwgMHhDNSwgMHg0MywgMHhDNSwgMHg0NSwgLyogMHg4OC0weDhCICovCisJMHhGNiwgMHg1NiwgMHhDNSwgMHg0NCwgMHhGNiwgMHg1NSwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhGNywgMHg2MSwgMHhDNSwgMHhBRCwgMHhGNywgMHg2MCwgMHhDNSwgMHhBRSwgLyogMHg5MC0weDkzICovCisJMHhGNywgMHg1RSwgMHhGNywgMHg1RCwgMHhGNywgMHg2MiwgMHhGNywgMHg2MywgLyogMHg5NC0weDk3ICovCisJMHhGOCwgMHg0NiwgMHgwMCwgMHgwMCwgMHhGNywgMHg1RiwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhDNiwgMHhGOCwgMHhDMywgMHhGOCwgMHhDNCwgLyogMHg5Qy0weDlGICovCisJMHhGOCwgMHhDNSwgMHhDNiwgMHg1QywgMHgwMCwgMHgwMCwgMHhGOSwgMHg1MSwgLyogMHhBMC0weEEzICovCisJMHhGOSwgMHg1MCwgMHhGOSwgMHg0RiwgMHhGOSwgMHg3MCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhGOSwgMHhCRSwgMHhGOSwgMHhBQiwgMHhDNiwgMHg2RSwgMHhBOCwgMHhBRCwgLyogMHhBOC0weEFCICovCisJMHhCMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCOCwgMHhGQSwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCRCwgMHhGNiwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhFQiwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhDMiwgMHhERiwgMHgwMCwgMHgwMCwgMHhGMywgMHg1NSwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhGOSwgMHhBQywgMHhBOCwgMHhBRSwgMHhBQSwgMHhFRSwgLyogMHhDOC0weENCICovCisJMHhBRCwgMHg3OSwgMHhBRCwgMHg3OCwgMHgwMCwgMHgwMCwgMHhCMCwgMHg2MywgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhEMywgMHhFOCwgMHhCMCwgMHg2MSwgMHhEMywgMHhFOSwgLyogMHhEMC0weEQzICovCisJMHhCMCwgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhERiwgLyogMHhENC0weEQ3ICovCisJMHhENywgMHhEQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMywgMHg2RCwgLyogMHhEOC0weERCICovCisJMHhENywgMHhERSwgMHhENywgMHhERCwgMHhENywgMHhEQywgMHhCMywgMHg2RSwgLyogMHhEQy0weERGICovCisJMHhENywgMHhFMCwgMHhENywgMHhFMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHg0MywgMHhEQywgMHg0MSwgMHhEQywgMHg0NSwgLyogMHhFNC0weEU3ICovCisJMHhEQywgMHg0NiwgMHhEQywgMHg0QywgMHgwMCwgMHgwMCwgMHhEQywgMHg0OCwgLyogMHhFOC0weEVCICovCisJMHhEQywgMHg0QSwgMHgwMCwgMHgwMCwgMHhEQywgMHg0MiwgMHhEQiwgMHhGQywgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHg0OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhEQywgMHg0QiwgMHhEQywgMHg0NCwgMHhEQywgMHg0NywgMHhEQiwgMHhGRCwgLyogMHhGNC0weEY3ICovCisJMHhCNiwgMHg2MiwgMHhEQywgMHg0MCwgMHhEQiwgMHhGRSwgMHhCNiwgMHg2MSwgLyogMHhGOC0weEZCICovCisJMHhCNiwgMHg2MywgMHgwMCwgMHgwMCwgMHhCOCwgMHhGRCwgMHhFMCwgMHg3NSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOEZbNTEyXSA9IHsKKwkweEUwLCAweDc3LCAweEUwLCAweDc2LCAweEUwLCAweDdCLCAweEI4LCAweEZCLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweDc4LCAweEUwLCAweDc0LCAweEUwLCAweDc5LCAvKiAweDA0LTB4MDcgKi8KKwkweEUwLCAweDdBLCAweEI4LCAweEZDLCAweEI4LCAweEZFLCAweEUwLCAweDdDLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweDY3LCAweEU0LCAweDY2LCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEU0LCAweDY0LCAweEU0LCAweDY1LCAweEJCLCAweEIzLCAweEJCLCAweEI1LCAvKiAweDEwLTB4MTMgKi8KKwkweEJCLCAweEIyLCAweEJCLCAweEI0LCAweEU4LCAweDRELCAweEU4LCAweDRFLCAvKiAweDE0LTB4MTcgKi8KKwkweEU4LCAweDQ5LCAweDAwLCAweDAwLCAweEU4LCAweDRBLCAweEJELCAweEY4LCAvKiAweDE4LTB4MUIgKi8KKwkweEJELCAweEZELCAweEJELCAweEY3LCAweEJELCAweEZFLCAweEJELCAweEY5LCAvKiAweDFDLTB4MUYgKi8KKwkweEU4LCAweDRCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweDRDLCAvKiAweDIwLTB4MjMgKi8KKwkweEU4LCAweDQ4LCAweEJFLCAweDQwLCAweEJELCAweEZCLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEJELCAweEZBLCAweEJELCAweEZDLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweEU4LCAweDQ3LCAweDAwLCAweDAwLCAweEVCLCAweENBLCAweEJGLCAweEU4LCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVCLCAweENDLCAweEJGLCAweEVBLCAvKiAweDMwLTB4MzMgKi8KKwkweEVCLCAweENGLCAweEVCLCAweENCLCAweEVCLCAweEM5LCAweEVCLCAweENFLCAvKiAweDM0LTB4MzcgKi8KKwkweEJGLCAweEU5LCAweEVCLCAweENELCAweDAwLCAweDAwLCAweEJGLCAweEU3LCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMxLCAweEQzLCAweEMxLCAweEQ2LCAvKiAweDNDLTB4M0YgKi8KKwkweEVFLCAweEMxLCAweDAwLCAweDAwLCAweEMxLCAweEQ0LCAweEVFLCAweEMwLCAvKiAweDQwLTB4NDMgKi8KKwkweEMxLCAweEQyLCAweEMxLCAweEQ1LCAweEYxLCAweDQ2LCAweEYxLCAweDQ3LCAvKiAweDQ0LTB4NDcgKi8KKwkweEYxLCAweDQ4LCAweEMyLCAweEUwLCAweDAwLCAweDAwLCAweEYxLCAweDQ5LCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweEMyLCAweEUxLCAweEMzLCAweEUyLCAweEYzLCAweDU4LCAvKiAweDRDLTB4NEYgKi8KKwkweEYzLCAweDU5LCAweEYzLCAweDU3LCAweEYzLCAweDU2LCAweEYzLCAweDVBLCAvKiAweDUwLTB4NTMgKi8KKwkweEMzLCAweEUxLCAweEY0LCAweERELCAweEY0LCAweERCLCAweEY0LCAweERDLCAvKiAweDU0LTB4NTcgKi8KKwkweEY0LCAweERFLCAweEY0LCAweERBLCAweEY0LCAweERGLCAweEY2LCAweDU4LCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweDU5LCAweEY2LCAweDU3LCAweEM1LCAweDQ2LCAvKiAweDVDLTB4NUYgKi8KKwkweEY3LCAweDY0LCAweEM1LCAweEFGLCAweEY3LCAweDY1LCAweEY4LCAweDQ4LCAvKiAweDYwLTB4NjMgKi8KKwkweEY4LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweEFGLCAvKiAweDk4LTB4OUIgKi8KKwkweEI2LCAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI5LCAweDQwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEI2LCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJGLCAweEVDLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEJGLCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweEMzLCAweEUzLCAweEM0LCAweDdDLCAweEM1LCAweDQ3LCAvKiAweEFDLTB4QUYgKi8KKwkweEE4LCAweEIwLCAweEIwLCAweDY0LCAweEI5LCAweDQxLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweEYzLCAweDVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENCLCAweEE2LCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweEIxLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEE4LCAweEI0LCAweEE4LCAweEIzLCAweEE4LCAweEIyLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweENCLCAweEE1LCAweDAwLCAweDAwLCAweENELCAweENELCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweENELCAweENGLCAweEFBLCAweEVGLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEFBLCAweEYxLCAweENELCAweENDLCAweENELCAweENFLCAvKiAweEQwLTB4RDMgKi8KKwkweEFBLCAweEYwLCAweENELCAweEQxLCAweENELCAweEQwLCAweENELCAweEQyLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweEQwLCAweEI2LCAweEQwLCAweEI0LCAweEFELCAweDdDLCAweEQwLCAweEIzLCAvKiAweEUwLTB4RTMgKi8KKwkweEFELCAweEEzLCAweEFELCAweDdFLCAweEFELCAweDdCLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEFELCAweEE0LCAweDAwLCAweDAwLCAweEFELCAweDdELCAweEFELCAweEEyLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweEFELCAweEExLCAweEQwLCAweEI1LCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweEFELCAweDdBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEIwLCAweDZBLCAweEQzLCAweEVCLCAweEQzLCAweEYxLCAweEIwLCAweDY3LCAvKiAweEY0LTB4RjcgKi8KKwkweEIwLCAweDZFLCAweDAwLCAweDAwLCAweEIwLCAweDY5LCAweEQzLCAweEVFLCAvKiAweEY4LTB4RkIgKi8KKwkweEQzLCAweEYwLCAweEIwLCAweDZDLCAweEQzLCAweEVBLCAweEQzLCAweEVELCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185MFs1MTJdID0geworCTB4QjAsIDB4NjgsIDB4QjAsIDB4NjUsIDB4RDMsIDB4RUMsIDB4QjAsIDB4NkIsIC8qIDB4MDAtMHgwMyAqLworCTB4RDMsIDB4RUYsIDB4QjAsIDB4NkQsIDB4QjAsIDB4NjYsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4RTMsIC8qIDB4MDgtMHgwQiAqLworCTB4RDcsIDB4RTYsIDB4QjMsIDB4NzAsIDB4MDAsIDB4MDAsIDB4QjMsIDB4N0EsIC8qIDB4MEMtMHgwRiAqLworCTB4QjMsIDB4NzYsIDB4RDcsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4QjMsIDB4N0UsIDB4QjMsIDB4NzcsIDB4QjMsIDB4N0MsIDB4QjMsIDB4NzIsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4QjMsIDB4NkYsIDB4QjMsIDB4NzEsIDB4QjMsIDB4N0QsIC8qIDB4MTgtMHgxQiAqLworCTB4RDcsIDB4RTUsIDB4QjMsIDB4NzUsIDB4QjMsIDB4NzgsIDB4QjMsIDB4NzQsIC8qIDB4MUMtMHgxRiAqLworCTB4QjMsIDB4NzksIDB4RDcsIDB4RTcsIDB4QjMsIDB4N0IsIDB4QjMsIDB4NzMsIC8qIDB4MjAtMHgyMyAqLworCTB4RDcsIDB4RTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4REMsIDB4NEQsIDB4QjYsIDB4NjUsIDB4REMsIDB4NEYsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4QjYsIDB4NjcsIDB4QjYsIDB4NjksIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4REMsIDB4NEUsIDB4QjYsIDB4NjYsIDB4QjYsIDB4NkEsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4QjYsIDB4NjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4QjksIDB4NDcsIDB4RTAsIDB4QTMsIDB4QjksIDB4NEYsIDB4RTAsIDB4N0UsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4QjksIDB4NTAsIDB4QjksIDB4NDUsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4RTAsIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjksIDB4NEEsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4QTIsIDB4QjksIDB4NDMsIDB4QjksIDB4NDIsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4QjksIDB4NEQsIDB4QjksIDB4NEMsIDB4QjksIDB4NEIsIC8qIDB4NEMtMHg0RiAqLworCTB4QjksIDB4NDksIDB4QjksIDB4NEUsIDB4RTAsIDB4N0QsIDB4QjksIDB4NDQsIC8qIDB4NTAtMHg1MyAqLworCTB4QjksIDB4NDYsIDB4QjksIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4QkIsIDB4QjgsIDB4QkIsIDB4QkIsIDB4MDAsIDB4MDAsIDB4QkIsIDB4QkYsIC8qIDB4NTgtMHg1QiAqLworCTB4QkIsIDB4QjksIDB4QkIsIDB4QkUsIDB4QkIsIDB4QkMsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4QkIsIDB4QjcsIDB4MDAsIDB4MDAsIDB4QkIsIDB4QkQsIDB4QkIsIDB4QkEsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NTIsIC8qIDB4NjQtMHg2NyAqLworCTB4QkUsIDB4NDMsIDB4QkUsIDB4NDEsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NTMsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4QkUsIDB4NDQsIDB4QkUsIDB4NDIsIDB4RTgsIDB4NTEsIC8qIDB4NkMtMHg2RiAqLworCTB4RTgsIDB4NTAsIDB4MDAsIDB4MDAsIDB4QkYsIDB4RjAsIDB4RTgsIDB4NEYsIC8qIDB4NzAtMHg3MyAqLworCTB4QkYsIDB4RUUsIDB4QkYsIDB4RUQsIDB4RUIsIDB4RDAsIDB4QkUsIDB4NDUsIC8qIDB4NzQtMHg3NyAqLworCTB4QkYsIDB4RUYsIDB4RUIsIDB4RDEsIDB4QkYsIDB4RjIsIDB4RUIsIDB4RDIsIC8qIDB4NzgtMHg3QiAqLworCTB4QkYsIDB4RjEsIDB4QzEsIDB4RDgsIDB4RUUsIDB4QzMsIDB4QzEsIDB4RDcsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QzEsIDB4REMsIDB4QzEsIDB4REEsIDB4QzEsIDB4REIsIDB4QzIsIDB4RTMsIC8qIDB4ODAtMHg4MyAqLworCTB4QzEsIDB4RDksIDB4RUUsIDB4QzIsIDB4RUIsIDB4RDMsIDB4QzIsIDB4RTIsIC8qIDB4ODQtMHg4NyAqLworCTB4QzIsIDB4RTQsIDB4MDAsIDB4MDAsIDB4QzMsIDB4RTQsIDB4QzMsIDB4RTUsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4RjQsIDB4RTAsIDB4MDAsIDB4MDAsIDB4QzUsIDB4REUsIC8qIDB4OEMtMHg4RiAqLworCTB4QzUsIDB4REQsIDB4QTgsIDB4QjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4Q0EsIDB4NTUsIDB4QjAsIDB4NkYsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4NTIsIC8qIDB4OTQtMHg5NyAqLworCTB4Q0EsIDB4NTMsIDB4Q0EsIDB4NTEsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4NTQsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4QUEsIDB4Q0IsIDB4QTcsIC8qIDB4OUMtMHg5RiAqLworCTB4Q0IsIDB4QUMsIDB4Q0IsIDB4QTgsIDB4QTgsIDB4QjcsIDB4QTgsIDB4QkEsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4QTksIDB4QTgsIDB4QjksIDB4Q0IsIDB4QUIsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QjgsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4RDUsIC8qIDB4QUMtMHhBRiAqLworCTB4Q0QsIDB4RDcsIDB4QUEsIDB4RjQsIDB4Q0QsIDB4RDMsIDB4Q0QsIDB4RDYsIC8qIDB4QjAtMHhCMyAqLworCTB4Q0QsIDB4RDQsIDB4QUEsIDB4RjIsIDB4QUEsIDB4RjUsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4QUEsIDB4RjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4RDAsIDB4QjgsIDB4RDAsIDB4QkMsIDB4RDAsIDB4QjksIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4QUQsIDB4QTcsIDB4MDAsIDB4MDAsIDB4QUQsIDB4QTgsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4RDAsIDB4QkIsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QkQsIC8qIDB4QzQtMHhDNyAqLworCTB4RDAsIDB4QkYsIDB4MDAsIDB4MDAsIDB4QUQsIDB4QTUsIDB4RDAsIDB4QkUsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUQsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RDcsIDB4RUUsIDB4RDAsIDB4QkEsIDB4RDMsIDB4RjIsIDB4RDMsIDB4RkIsIC8qIDB4RDQtMHhENyAqLworCTB4RDMsIDB4RjksIDB4RDMsIDB4RjQsIDB4RDMsIDB4RjUsIDB4RDMsIDB4RkEsIC8qIDB4RDgtMHhEQiAqLworCTB4RDMsIDB4RkMsIDB4QjAsIDB4NzEsIDB4MDAsIDB4MDAsIDB4RDMsIDB4RjcsIC8qIDB4REMtMHhERiAqLworCTB4RDMsIDB4RjMsIDB4QjAsIDB4NzAsIDB4QjAsIDB4NzIsIDB4RDMsIDB4RjYsIC8qIDB4RTAtMHhFMyAqLworCTB4RDMsIDB4RkQsIDB4RDMsIDB4RjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4QjMsIDB4QTEsIDB4RDcsIDB4RjEsIDB4RDcsIDB4RTksIDB4RDcsIDB4RUYsIC8qIDB4RTgtMHhFQiAqLworCTB4RDcsIDB4RjAsIDB4QjMsIDB4QTIsIDB4MDAsIDB4MDAsIDB4RDcsIDB4RTgsIC8qIDB4RUMtMHhFRiAqLworCTB4RDcsIDB4RUEsIDB4RDAsIDB4QjcsIDB4RDcsIDB4RUMsIDB4RDcsIDB4RUQsIC8qIDB4RjAtMHhGMyAqLworCTB4RDcsIDB4RUIsIDB4QjYsIDB4NkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4REMsIDB4NTYsIDB4RUIsIDB4RDQsIDB4REMsIDB4NTcsIC8qIDB4RjgtMHhGQiAqLworCTB4REMsIDB4NTQsIDB4QjMsIDB4QTMsIDB4QjYsIDB4NkUsIDB4REMsIDB4NTMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzkxWzUxMl0gPSB7CisJMHhEQywgMHg1OSwgMHhEQywgMHg1OCwgMHhCNiwgMHg2QiwgMHhEQywgMHg1QywgLyogMHgwMC0weDAzICovCisJMHhEQywgMHg1MiwgMHhEQywgMHg1QiwgMHhEQywgMHg1MCwgMHhEQywgMHg1QSwgLyogMHgwNC0weDA3ICovCisJMHhEQywgMHg1NSwgMHhCNiwgMHg2RCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhBQSwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhBNSwgMHhFMCwgMHhBQiwgMHhFMCwgMHhBNiwgLyogMHgwQy0weDBGICovCisJMHhFMCwgMHhBNCwgMHhFMCwgMHhBNywgMHhCOSwgMHg1MSwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhFMCwgMHhBOSwgMHgwMCwgMHgwMCwgMHhFMCwgMHhBOCwgMHhCOSwgMHg1MiwgLyogMHgxNC0weDE3ICovCisJMHhCQiwgMHhDMSwgMHhCQiwgMHhDMCwgMHhFNCwgMHg2RSwgMHhFNCwgMHg3MSwgLyogMHgxOC0weDFCICovCisJMHhFNCwgMHg2OSwgMHhFNCwgMHg2RCwgMHhCQiwgMHhDMiwgMHhFNCwgMHg2QywgLyogMHgxQy0weDFGICovCisJMHhFNCwgMHg2QSwgMHhFNCwgMHg3MCwgMHhFNCwgMHg2QiwgMHhFNCwgMHg2OCwgLyogMHgyMC0weDIzICovCisJMHhFNCwgMHg2RiwgMHgwMCwgMHgwMCwgMHhFOCwgMHg1OSwgMHhCRSwgMHg0OCwgLyogMHgyNC0weDI3ICovCisJMHhGMSwgMHg0QSwgMHhFOCwgMHg1NiwgMHhFOCwgMHg1NywgMHhFOCwgMHg1NSwgLyogMHgyOC0weDJCICovCisJMHhEQywgMHg1MSwgMHhCRSwgMHg0NywgMHhFOCwgMHg1QSwgMHhFOCwgMHg1NCwgLyogMHgyQy0weDJGICovCisJMHhCRSwgMHg0NiwgMHhCRSwgMHg0OSwgMHhFOCwgMHg1OCwgMHhFQiwgMHhENSwgLyogMHgzMC0weDMzICovCisJMHhCRiwgMHhGMywgMHhFQiwgMHhENiwgMHhFQiwgMHhENywgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhFRSwgMHhDNCwgMHhDMSwgMHhERCwgMHhGMSwgMHg0QiwgMHhGMSwgMHg0QywgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHg0RCwgMHhGMywgMHg1RCwgLyogMHgzQy0weDNGICovCisJMHhGMywgMHg1QywgMHhGNCwgMHhFMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHhFMSwgLyogMHg0MC0weDQzICovCisJMHhGNiwgMHg1QiwgMHhGNiwgMHg1QywgMHhGNiwgMHg1QSwgMHhGNywgMHg2NiwgLyogMHg0NC0weDQ3ICovCisJMHhDNSwgMHhCMCwgMHhBOCwgMHhCQiwgMHhBRCwgMHhBQSwgMHhBRCwgMHhBOSwgLyogMHg0OC0weDRCICovCisJMHhCMCwgMHg3NSwgMHhCMCwgMHg3NCwgMHhENCwgMHg0MCwgMHhENCwgMHg0MSwgLyogMHg0Qy0weDRGICovCisJMHhEMywgMHhGRSwgMHgwMCwgMHgwMCwgMHhCMCwgMHg3MywgMHhENywgMHhGNSwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhENywgMHhGNiwgMHhENywgMHhGMiwgMHhCMywgMHhBNCwgLyogMHg1NC0weDU3ICovCisJMHhENywgMHhGMywgMHgwMCwgMHgwMCwgMHhENywgMHhGNCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHg1RiwgLyogMHg1Qy0weDVGICovCisJMHhEQywgMHg2MSwgMHhEQywgMHg1RCwgMHhEQywgMHg2MCwgMHhCNiwgMHg2RiwgLyogMHg2MC0weDYzICovCisJMHhEQywgMHg1RSwgMHhCNiwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhERCwgMHg3MywgMHhCOSwgMHg1NSwgMHhCOSwgMHg1NCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhCOSwgMHg1MywgMHgwMCwgMHgwMCwgMHhFMCwgMHhBQywgMHhFMCwgMHhBRCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHg3MywgMHhFNCwgMHg3NSwgLyogMHg3MC0weDczICovCisJMHhCQiwgMHhDNiwgMHhCQiwgMHhDMywgMHgwMCwgMHgwMCwgMHhCQiwgMHhDNSwgLyogMHg3NC0weDc3ICovCisJMHhCQiwgMHhDNCwgMHhFNCwgMHg3NCwgMHhFNCwgMHg3MiwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhFOCwgMHg2MSwgMHhFOCwgMHg1RSwgMHhFOCwgMHg1RiwgMHhCRSwgMHg0RCwgLyogMHg4MC0weDgzICovCisJMHhFOCwgMHg2MCwgMHhFOCwgMHg1QiwgMHhFOCwgMHg1QywgMHhCRSwgMHg0QSwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhCRSwgMHg0QiwgMHhFOCwgMHg1RCwgMHhCRSwgMHg0QywgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhFQiwgMHhEQiwgMHgwMCwgMHgwMCwgMHhFQiwgMHhEQywgLyogMHg4Qy0weDhGICovCisJMHhFQiwgMHhEOSwgMHhFQiwgMHhEQSwgMHhCRiwgMHhGNCwgMHhFQiwgMHhEOCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhDOCwgMHhFRSwgMHhDNSwgMHhFRSwgMHhDNywgLyogMHg5OC0weDlCICovCisJMHhDMSwgMHhFMCwgMHhFRSwgMHhDQiwgMHhDMSwgMHhERiwgMHhFRSwgMHhDOSwgLyogMHg5Qy0weDlGICovCisJMHhFRSwgMHhDQywgMHhFRSwgMHhDQSwgMHhFRSwgMHhDNiwgMHhDMSwgMHhERSwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHg0RiwgMHgwMCwgMHgwMCwgMHhGMSwgMHg1MCwgLyogMHhBNC0weEE3ICovCisJMHhGMSwgMHg0RSwgMHgwMCwgMHgwMCwgMHhGMSwgMHg1MiwgMHhDMiwgMHhFNSwgLyogMHhBOC0weEFCICovCisJMHhDMiwgMHhFNiwgMHhGMywgMHg1RiwgMHhDMywgMHhFNywgMHhGMSwgMHg1MSwgLyogMHhBQy0weEFGICovCisJMHhGMywgMHg1RSwgMHhDMywgMHhFNiwgMHhGNCwgMHhFNSwgMHhGNCwgMHhFNiwgLyogMHhCMC0weEIzICovCisJMHhDNCwgMHhCRiwgMHhGNCwgMHhFNCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhFMywgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHg1RCwgMHhDNSwgMHg0OCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHhGOCwgMHg0OSwgMHhGOCwgMHhDOCwgMHhGOCwgMHhDNywgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhDNiwgMHg0MywgMHhDNiwgMHg1RCwgMHhGOCwgMHhDOSwgMHhGOSwgMHg3MSwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhDNiwgMHg2RiwgMHhBOCwgMHhCQywgMHhBQSwgMHhGNiwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhCOSwgMHg1NiwgMHgwMCwgMHgwMCwgMHhDNCwgMHhDMCwgLyogMHhDOC0weENCICovCisJMHhBOCwgMHhCRCwgMHhBRCwgMHhBQiwgMHhCMywgMHhBNSwgMHhCNiwgMHg3MSwgLyogMHhDQy0weENGICovCisJMHhDMiwgMHhFNywgMHhBQSwgMHhGNywgMHgwMCwgMHgwMCwgMHhEMCwgMHhDMSwgLyogMHhEMC0weEQzICovCisJMHhEMCwgMHhDMCwgMHhENCwgMHg0MiwgMHgwMCwgMHgwMCwgMHhCMCwgMHg3OCwgLyogMHhENC0weEQ3ICovCisJMHhCMCwgMHg3NiwgMHhCMCwgMHg3QSwgMHhENCwgMHg0NCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhCMCwgMHg3OSwgMHhCMCwgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENCwgMHg0MywgMHhCMywgMHhBOCwgLyogMHhFMC0weEUzICovCisJMHhENywgMHhGQywgMHgwMCwgMHgwMCwgMHhCMywgMHhBNywgMHhCMywgMHhBOSwgLyogMHhFNC0weEU3ICovCisJMHhEOCwgMHg0MiwgMHhCMywgMHhBQiwgMHhENywgMHhGRSwgMHhEOCwgMHg0MCwgLyogMHhFOC0weEVCICovCisJMHhENywgMHhGNywgMHhCMywgMHhBQSwgMHhEOCwgMHg0MywgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhENywgMHhGOSwgMHgwMCwgMHgwMCwgMHhENywgMHhGQSwgLyogMHhGMC0weEYzICovCisJMHhENywgMHhGOCwgMHhCMywgMHhBNiwgMHgwMCwgMHgwMCwgMHhEOCwgMHg0MSwgLyogMHhGNC0weEY3ICovCisJMHhENywgMHhGQiwgMHhENywgMHhGRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHg2RCwgMHgwMCwgMHgwMCwgMHhEQywgMHg2QywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTJbNTEyXSA9IHsKKwkweERDLCAweDZBLCAweERDLCAweDYyLCAweERDLCAweDcxLCAweERDLCAweDY1LCAvKiAweDAwLTB4MDMgKi8KKwkweERDLCAweDZGLCAweERDLCAweDc2LCAweERDLCAweDZFLCAweEI2LCAweDc5LCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEI2LCAweDc1LCAweERDLCAweDYzLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweERDLCAweDY5LCAweEI2LCAweDc3LCAweDAwLCAweDAwLCAweERDLCAweDY4LCAvKiAweDBDLTB4MEYgKi8KKwkweEI2LCAweDc4LCAweEI2LCAweDdBLCAweERDLCAweDZCLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweEI2LCAweDcyLCAweEI2LCAweDczLCAweERDLCAweDc3LCAweERDLCAweDc1LCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweERDLCAweDc0LCAweERDLCAweDY2LCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweERDLCAweDcyLCAweDAwLCAweDAwLCAweEI2LCAweDc2LCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI2LCAweDc0LCAvKiAweDIwLTB4MjMgKi8KKwkweERDLCAweDczLCAweERDLCAweDY0LCAweERDLCAweDY3LCAweERDLCAweDcwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweEJBLCAweEUwLCAweEI3LCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEUwLCAweEIwLCAweEUwLCAweEMzLCAweEUwLCAweENDLCAweEUwLCAweEIzLCAvKiAweDMwLTB4MzMgKi8KKwkweEI5LCAweDYxLCAweDAwLCAweDAwLCAweEUwLCAweEMwLCAweEI5LCAweDU3LCAvKiAweDM0LTB4MzcgKi8KKwkweEI5LCAweDU5LCAweEI5LCAweDY1LCAweEUwLCAweEIxLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEI5LCAweDVBLCAweEI5LCAweDVDLCAweEI5LCAweDY2LCAvKiAweDNDLTB4M0YgKi8KKwkweEI5LCAweDVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweEI5LCAweDY0LCAweEUwLCAweEI5LCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEUwLCAweEFFLCAweEI5LCAweDYyLCAweEUwLCAweEI4LCAweEI5LCAweDVFLCAvKiAweDQ4LTB4NEIgKi8KKwkweEUwLCAweENBLCAweEI5LCAweDYzLCAweEUwLCAweEM4LCAweEUwLCAweEJDLCAvKiAweDRDLTB4NEYgKi8KKwkweEUwLCAweEM2LCAweEI5LCAweDYwLCAweEUwLCAweEFGLCAweEUwLCAweEM5LCAvKiAweDUwLTB4NTMgKi8KKwkweEUwLCAweEM0LCAweDAwLCAweDAwLCAweEUwLCAweENCLCAweEI5LCAweDU4LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI5LCAweDY3LCAweEI5LCAweDVELCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEI1LCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEUwLCAweEJELCAweEUwLCAweEMxLCAweDAwLCAweDAwLCAweEUwLCAweEM1LCAvKiAweDYwLTB4NjMgKi8KKwkweEI5LCAweDVGLCAweEUwLCAweEI0LCAweEUwLCAweEIyLCAweEUwLCAweEJFLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEUwLCAweEJCLCAweEUwLCAweEJBLCAweDAwLCAweDAwLCAweEUwLCAweEJGLCAvKiAweDZDLTB4NkYgKi8KKwkweEUwLCAweEMyLCAweDAwLCAweDAwLCAweEUwLCAweEM3LCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweDc4LCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweEJCLCAweEM3LCAweEU0LCAweEE0LCAweEU0LCAweDdBLCAweEJCLCAweENDLCAvKiAweDc4LTB4N0IgKi8KKwkweEJCLCAweEQwLCAweEU0LCAweEFELCAweEU0LCAweEI1LCAweEU0LCAweEE2LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEJCLCAweEM4LCAweDAwLCAweDAwLCAweEU0LCAweEFBLCAweEUwLCAweEI2LCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweEJCLCAweEM5LCAweEU0LCAweEIxLCAweEU0LCAweEI2LCAvKiAweDg0LTB4ODcgKi8KKwkweEU0LCAweEFFLCAweDAwLCAweDAwLCAweEU0LCAweEIwLCAweEU0LCAweEI5LCAvKiAweDg4LTB4OEIgKi8KKwkweEU0LCAweEIyLCAweEU0LCAweDdFLCAweEU0LCAweEE5LCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEJCLCAweEQxLCAweDAwLCAweDAwLCAweEJCLCAweENELCAvKiAweDkwLTB4OTMgKi8KKwkweEU0LCAweDdDLCAweEU0LCAweEFCLCAweEJCLCAweENCLCAweEU0LCAweEE1LCAvKiAweDk0LTB4OTcgKi8KKwkweEJCLCAweENBLCAweEU0LCAweEIzLCAweEU0LCAweEEyLCAweEU0LCAweDc5LCAvKiAweDk4LTB4OUIgKi8KKwkweEJCLCAweENFLCAweEU0LCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweEU0LCAweDdCLCAweEU0LCAweEFGLCAweEU0LCAweEFDLCAweEU0LCAweEE3LCAvKiAweEEwLTB4QTMgKi8KKwkweEU0LCAweDc3LCAweEU0LCAweDc2LCAweEU0LCAweEExLCAweEU0LCAweEI0LCAvKiAweEE0LTB4QTcgKi8KKwkweEJCLCAweENGLCAweEU0LCAweEI3LCAweEU0LCAweDdELCAweEU0LCAweEEzLCAvKiAweEE4LTB4QUIgKi8KKwkweEJFLCAweDUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJFLCAweDVBLCAweEJFLCAweDU1LCAvKiAweEIwLTB4QjMgKi8KKwkweEU4LCAweEE0LCAweEU4LCAweEExLCAweEU4LCAweDY3LCAweEJFLCAweDUwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEY5LCAweEQ3LCAweDAwLCAweDAwLCAweEJFLCAweDRGLCAvKiAweEI4LTB4QkIgKi8KKwkweEJFLCAweDU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweEU4LCAweDY1LCAweEJFLCAweDU0LCAweEU4LCAweDcxLCAweEU4LCAweDYzLCAvKiAweEMwLTB4QzMgKi8KKwkweEU4LCAweDY0LCAweEJFLCAweDRFLCAweEU4LCAweEEzLCAweEJFLCAweDU4LCAvKiAweEM0LTB4QzcgKi8KKwkweEU4LCAweDc0LCAweEU4LCAweDc5LCAweEU4LCAweDczLCAweEVCLCAweEVFLCAvKiAweEM4LTB4Q0IgKi8KKwkweEU4LCAweDZGLCAweEU4LCAweDc3LCAweEU4LCAweDc1LCAweEU4LCAweDY4LCAvKiAweENDLTB4Q0YgKi8KKwkweEU4LCAweDYyLCAweEU4LCAweDdELCAweEJFLCAweDU3LCAweEU4LCAweDdFLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweDc4LCAweDAwLCAweDAwLCAweEU4LCAweDZELCAvKiAweEQ0LTB4RDcgKi8KKwkweEU4LCAweDZCLCAweEU4LCAweDY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweDZFLCAweEU4LCAweDdCLCAweEU4LCAweDZBLCAvKiAweERDLTB4REYgKi8KKwkweEU4LCAweDdBLCAweEU4LCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweEJFLCAweDUzLCAweDAwLCAweDAwLCAweEU4LCAweDc2LCAweEU4LCAweDdDLCAvKiAweEU0LTB4RTcgKi8KKwkweEU4LCAweDcyLCAweEU4LCAweDZDLCAweEJFLCAweDUxLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEE4LCAweEU4LCAweDcwLCAvKiAweEVDLTB4RUYgKi8KKwkweEJFLCAweDU5LCAweEU4LCAweDY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVCLCAweEY0LCAvKiAweEY0LTB4RjcgKi8KKwkweEJGLCAweEY3LCAweEVCLCAweEYzLCAweEVCLCAweEYwLCAweEVDLCAweDQ0LCAvKiAweEY4LTB4RkIgKi8KKwkweEJGLCAweEZCLCAweDAwLCAweDAwLCAweEVDLCAweDQxLCAweEVCLCAweEY4LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185M1s1MTJdID0geworCTB4RUMsIDB4NDMsIDB4RUIsIDB4RTksIDB4RUIsIDB4RjYsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4QkYsIDB4RkQsIDB4MDAsIDB4MDAsIDB4RUIsIDB4RTEsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4RUIsIDB4REYsIDB4RUMsIDB4NDIsIDB4MDAsIDB4MDAsIDB4RUMsIDB4NDAsIC8qIDB4MDgtMHgwQiAqLworCTB4RUIsIDB4RkUsIDB4RUIsIDB4RUQsIDB4RUIsIDB4RUMsIDB4RUIsIDB4RTIsIC8qIDB4MEMtMHgwRiAqLworCTB4QzAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4RUIsIDB4RTgsIDB4RUIsIDB4RjIsIC8qIDB4MTAtMHgxMyAqLworCTB4RUIsIDB4RkQsIDB4QzAsIDB4NDMsIDB4RUMsIDB4NDUsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4QzEsIDB4RTgsIDB4QzAsIDB4NDUsIDB4QkYsIDB4RkUsIDB4RUIsIDB4RTYsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4RUIsIDB4RUYsIDB4RUIsIDB4REUsIDB4RUIsIDB4RTAsIC8qIDB4MUMtMHgxRiAqLworCTB4QkYsIDB4RjUsIDB4QzAsIDB4NDIsIDB4QkYsIDB4RkEsIDB4RUIsIDB4RTcsIC8qIDB4MjAtMHgyMyAqLworCTB4RUIsIDB4RjcsIDB4RUIsIDB4RjEsIDB4QzAsIDB4NDEsIDB4RUIsIDB4REQsIC8qIDB4MjQtMHgyNyAqLworCTB4QzEsIDB4RTMsIDB4RUIsIDB4RjksIDB4RUIsIDB4RkMsIDB4QkYsIDB4RkMsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4RUIsIDB4RUIsIDB4QzAsIDB4NDQsIDB4QkYsIDB4RjksIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkYsIDB4RjgsIC8qIDB4MzAtMHgzMyAqLworCTB4RUIsIDB4RjUsIDB4RUIsIDB4RkIsIDB4QkYsIDB4RjYsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4RUIsIDB4RTQsIDB4RUIsIDB4RkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4RUIsIDB4RTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUIsIDB4RUEsIDB4RUUsIDB4RDIsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4RDcsIDB4QzEsIDB4RTUsIDB4QzEsIDB4RTcsIC8qIDB4NDgtMHg0QiAqLworCTB4RUUsIDB4REQsIDB4QzEsIDB4RTEsIDB4RUUsIDB4RUMsIDB4RUUsIDB4RTMsIC8qIDB4NEMtMHg0RiAqLworCTB4RUUsIDB4RDgsIDB4RUUsIDB4RDksIDB4RUUsIDB4RTIsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4QzEsIDB4RUUsIDB4RUUsIDB4RTEsIDB4RUUsIDB4RDEsIDB4RUUsIDB4RTAsIC8qIDB4NTQtMHg1NyAqLworCTB4RUUsIDB4RDQsIDB4RUUsIDB4RUQsIDB4QzEsIDB4RUQsIDB4QzEsIDB4RUIsIC8qIDB4NTgtMHg1QiAqLworCTB4RUUsIDB4RDUsIDB4MDAsIDB4MDAsIDB4RUUsIDB4RTgsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4RUUsIDB4REEsIDB4RUUsIDB4RTcsIDB4MDAsIDB4MDAsIDB4RUUsIDB4RTksIC8qIDB4NjAtMHg2MyAqLworCTB4RUUsIDB4RDAsIDB4QzEsIDB4RTYsIDB4MDAsIDB4MDAsIDB4RUUsIDB4RUEsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4REUsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4QzEsIDB4RUEsIDB4RUUsIDB4REIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4QzEsIDB4RUMsIDB4RUUsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4QzEsIDB4RTQsIDB4RUUsIDB4RDYsIDB4RUUsIDB4RTUsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4REYsIDB4RUIsIDB4RTMsIDB4RUUsIDB4RTYsIC8qIDB4NzgtMHg3QiAqLworCTB4RUUsIDB4RDMsIDB4MDAsIDB4MDAsIDB4QzEsIDB4RTksIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RUUsIDB4RUIsIDB4MDAsIDB4MDAsIDB4QzEsIDB4RTIsIDB4RUUsIDB4Q0UsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4RjEsIDB4NjAsIDB4RjEsIDB4NTksIDB4QzIsIDB4RTksIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4RjEsIDB4NTQsIDB4RjEsIDB4NjMsIDB4RjEsIDB4NUIsIDB4RUUsIDB4REMsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4RjEsIDB4NjUsIDB4RjEsIDB4NTUsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4QzIsIDB4RTgsIDB4RjEsIDB4NUYsIDB4QzIsIDB4RUEsIDB4QzIsIDB4RjIsIC8qIDB4OTQtMHg5NyAqLworCTB4QzIsIDB4RjAsIDB4RjEsIDB4NjEsIDB4QzIsIDB4RjEsIDB4RjEsIDB4NTcsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4RjEsIDB4NTgsIDB4RjEsIDB4NUQsIDB4RjEsIDB4NjIsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4Q0QsIDB4QzIsIDB4RUIsIDB4RjEsIDB4NkEsIC8qIDB4QTAtMHhBMyAqLworCTB4RjEsIDB4NjcsIDB4RjEsIDB4NkIsIDB4RjEsIDB4NUUsIDB4RjEsIDB4NUEsIC8qIDB4QTQtMHhBNyAqLworCTB4RjEsIDB4NjgsIDB4RjMsIDB4NkEsIDB4RjEsIDB4NUMsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4QzIsIDB4RUUsIDB4MDAsIDB4MDAsIDB4QzIsIDB4RUQsIDB4RUUsIDB4Q0YsIC8qIDB4QUMtMHhBRiAqLworCTB4QzIsIDB4RUYsIDB4RjEsIDB4NjQsIDB4RjEsIDB4NjYsIDB4QzIsIDB4RUMsIC8qIDB4QjAtMHhCMyAqLworCTB4RjEsIDB4NjksIDB4RjEsIDB4NTMsIDB4MDAsIDB4MDAsIDB4RjEsIDB4NTYsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4RjMsIDB4NzMsIDB4MDAsIDB4MDAsIDB4RjMsIDB4NjMsIDB4QzMsIDB4RUIsIC8qIDB4QzAtMHhDMyAqLworCTB4RjMsIDB4NzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjMsIDB4NjEsIC8qIDB4QzQtMHhDNyAqLworCTB4QzMsIDB4RUMsIDB4MDAsIDB4MDAsIDB4RjMsIDB4NkMsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4RjMsIDB4NjgsIDB4QzMsIDB4RjEsIDB4RjMsIDB4NzIsIDB4RjMsIDB4NjIsIC8qIDB4Q0MtMHhDRiAqLworCTB4RjMsIDB4NjUsIDB4QzMsIDB4RTksIDB4RjMsIDB4NzQsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RjMsIDB4NkQsIDB4RjMsIDB4NzAsIDB4QzMsIDB4RUYsIDB4QzMsIDB4RjQsIC8qIDB4RDQtMHhENyAqLworCTB4QzMsIDB4RjIsIDB4RjMsIDB4NjksIDB4RjMsIDB4NjQsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4QzMsIDB4RUQsIDB4QzMsIDB4RUUsIDB4RjMsIDB4NjAsIDB4QzMsIDB4RUEsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4QzMsIDB4RTgsIDB4QzMsIDB4RjAsIDB4RjMsIDB4NkYsIC8qIDB4RTAtMHhFMyAqLworCTB4QzMsIDB4RjMsIDB4MDAsIDB4MDAsIDB4RjMsIDB4NkIsIDB4RjMsIDB4NzUsIC8qIDB4RTQtMHhFNyAqLworCTB4QzMsIDB4RjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4RjMsIDB4NjcsIDB4MDAsIDB4MDAsIDB4RjMsIDB4NkUsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4RjQsIDB4RjMsIDB4RjUsIDB4NDIsIDB4RjQsIDB4RjUsIC8qIDB4RjQtMHhGNyAqLworCTB4RjQsIDB4RkMsIDB4RjMsIDB4NjYsIDB4RjQsIDB4RkEsIDB4RjQsIDB4RTksIC8qIDB4RjgtMHhGQiAqLworCTB4RjUsIDB4NDAsIDB4QzQsIDB4QzMsIDB4RjQsIDB4RUQsIDB4RjQsIDB4RkUsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzk0WzUxMl0gPSB7CisJMHhGNCwgMHhGNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDNCwgMHhDMiwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHg0NCwgMHhGNCwgMHhGNiwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhGNCwgMHhGQiwgMHhGNCwgMHhGRCwgMHhGNCwgMHhFNywgLyogMHgwOC0weDBCICovCisJMHhGNSwgMHg0MSwgMHhGNCwgMHhGMiwgMHhGNCwgMHhGNywgMHhGNCwgMHhFQiwgLyogMHgwQy0weDBGICovCisJMHhGNCwgMHhFRiwgMHhGNSwgMHg0MywgMHhGNCwgMHhGOSwgMHhGNCwgMHhFOCwgLyogMHgxMC0weDEzICovCisJMHhGNCwgMHhFQywgMHhGNCwgMHhFRSwgMHhGNCwgMHhGOCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhDNCwgMHhDMSwgMHhGNCwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhGNCwgMHhFQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhGNCwgMHhGMCwgMHhGNiwgMHg2MSwgMHhGNiwgMHg2NiwgMHhDNSwgMHg0RiwgLyogMHgyOC0weDJCICovCisJMHhGNiwgMHg2OCwgMHgwMCwgMHgwMCwgMHhDNSwgMHg0OSwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhGNiwgMHg2NCwgMHhGNiwgMHg2QSwgMHhDNSwgMHg0RSwgMHhDNSwgMHg0QSwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhDNSwgMHg0QiwgMHhGNiwgMHg2MCwgMHhGNiwgMHg2NywgLyogMHgzNC0weDM3ICovCisJMHhDNSwgMHg0RCwgMHhGNiwgMHg2NSwgMHhDNSwgMHg0QywgMHhGNiwgMHg1RiwgLyogMHgzOC0weDNCICovCisJMHhGNiwgMHg2MywgMHhGNiwgMHg2MiwgMHgwMCwgMHgwMCwgMHhGNiwgMHg1RSwgLyogMHgzQy0weDNGICovCisJMHhGNiwgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhDNSwgMHhCMSwgMHhGNywgMHg2RCwgMHhGNywgMHg3MCwgMHhGNywgMHg2QywgLyogMHg0NC0weDQ3ICovCisJMHhGNywgMHg2RSwgMHhGNywgMHg2RiwgMHhGNywgMHg2OSwgMHhGNywgMHg2QSwgLyogMHg0OC0weDRCICovCisJMHhGNywgMHg2NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNywgMHg2QiwgLyogMHg0Qy0weDRGICovCisJMHhGNywgMHg2OCwgMHhDNSwgMHhCMiwgMHhDNSwgMHhCMywgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHg0QiwgMHgwMCwgMHgwMCwgMHhGOCwgMHg0RCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHg0QywgMHhGOCwgMHg0RSwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhDNSwgMHhFMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHg0QSwgMHhDNSwgMHhERiwgLyogMHg2MC0weDYzICovCisJMHhDNSwgMHhFMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhGOCwgMHhDQiwgMHhGOCwgMHhDQywgMHhDNiwgMHg0NCwgMHhGOCwgMHhDQSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhGOSwgMHg1MywgMHhGOSwgMHg1MiwgMHhGOSwgMHg1NCwgLyogMHg2Qy0weDZGICovCisJMHhDNiwgMHg1RiwgMHhGOSwgMHg1NSwgMHhDNiwgMHg1RSwgMHhGOSwgMHg1NiwgLyogMHg3MC0weDczICovCisJMHhGOSwgMHg3MiwgMHhGOSwgMHg3NSwgMHhGOSwgMHg3NCwgMHhDNiwgMHg2OCwgLyogMHg3NC0weDc3ICovCisJMHhGOSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhDNiwgMHg3MiwgMHhDNiwgMHg3MCwgMHhDNiwgMHg3MSwgMHhDNiwgMHg3NywgLyogMHg3Qy0weDdGICovCisJCisJMHhGOSwgMHhDMCwgMHhGOSwgMHhDMSwgMHhGOSwgMHhCRiwgMHhGOSwgMHhDOSwgLyogMHg4MC0weDgzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTVbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFBLCAweEY4LCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweDQ0LCAweERDLCAweDc4LCAvKiAweDc4LTB4N0IgKi8KKwkweEU4LCAweEE1LCAweEYzLCAweDc2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEFBLCAweEY5LCAweDAwLCAweDAwLCAweEFELCAweEFDLCAweEIwLCAweDdCLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweDQ1LCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweEQ4LCAweDQ2LCAweEIzLCAweEFDLCAweDAwLCAweDAwLCAweEI2LCAweDdELCAvKiAweDg4LTB4OEIgKi8KKwkweERDLCAweDdBLCAweERDLCAweDc5LCAweEI2LCAweEEzLCAweEI2LCAweDdDLCAvKiAweDhDLTB4OEYgKi8KKwkweERDLCAweDdCLCAweEI2LCAweDdFLCAweEI2LCAweEEyLCAweEI2LCAweEExLCAvKiAweDkwLTB4OTMgKi8KKwkweEI2LCAweDdCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweEI5LCAweDY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEQwLCAvKiAweDk4LTB4OUIgKi8KKwkweEUwLCAweENFLCAweDAwLCAweDAwLCAweEUwLCAweENGLCAweEUwLCAweENELCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEJCLCAweEQyLCAweDAwLCAweDAwLCAweEJCLCAweEQ1LCAvKiAweEEwLTB4QTMgKi8KKwkweEJCLCAweEQ3LCAweEJCLCAweEQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEJCLCAweEQzLCAweEJCLCAweEQ0LCAweDAwLCAweDAwLCAweEU4LCAweEE3LCAvKiAweEE4LTB4QUIgKi8KKwkweEU4LCAweEE2LCAweEJFLCAweDVCLCAweEU4LCAweEE4LCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweEU4LCAweEE5LCAweEJFLCAweDVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEVDLCAweDRELCAweEVDLCAweDRCLCAweEVFLCAweEYzLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEVDLCAweDQ5LCAweEVDLCAweDRBLCAweEMwLCAweDQ2LCAvKiAweEI4LTB4QkIgKi8KKwkweEVDLCAweDQ2LCAweEVDLCAweDRFLCAweEVDLCAweDQ4LCAweEVDLCAweDRDLCAvKiAweEJDLTB4QkYgKi8KKwkweEVFLCAweEVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweEYxLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEYyLCAweEMxLCAweEYzLCAweEVFLCAweEVFLCAvKiAweEM0LTB4QzcgKi8KKwkweEMxLCAweEYyLCAweEVFLCAweEYwLCAweEMxLCAweEVGLCAweEMxLCAweEYwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEMxLCAweEYxLCAweEVDLCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweEMyLCAweEY1LCAweEYxLCAweDZFLCAweEYxLCAweDZDLCAweEYxLCAweDZELCAvKiAweEQwLTB4RDMgKi8KKwkweEMyLCAweEYzLCAweEMyLCAweEY2LCAweEMyLCAweEY0LCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYzLCAweDc3LCAweEYzLCAweDc4LCAvKiAweEQ4LTB4REIgKi8KKwkweEMzLCAweEY2LCAweDAwLCAweDAwLCAweEY1LCAweDQ1LCAweEY1LCAweDQ3LCAvKiAweERDLTB4REYgKi8KKwkweEY1LCAweDQ2LCAweEM0LCAweEM0LCAweEM1LCAweDUwLCAweEY2LCAweDZELCAvKiAweEUwLTB4RTMgKi8KKwkweEY2LCAweDZDLCAweEY2LCAweDZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185Nls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4QUEsIDB4RkEsIDB4MDAsIDB4MDAsIDB4QzksIDB4QUEsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4Q0EsIDB4NTgsIDB4QTYsIDB4RTksIDB4Q0EsIDB4NTYsIDB4Q0EsIDB4NTksIC8qIDB4MjAtMHgyMyAqLworCTB4Q0EsIDB4NTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4Q0IsIDB4QUUsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QzEsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4QTgsIDB4QzIsIDB4Q0IsIDB4QjAsIDB4QTgsIDB4QkYsIDB4Q0IsIDB4QUYsIC8qIDB4MkMtMHgyRiAqLworCTB4Q0IsIDB4QUQsIDB4QTgsIDB4QzAsIDB4QTgsIDB4QkUsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4Q0QsIDB4RDgsIDB4Q0QsIDB4REIsIDB4QUEsIDB4RkQsIC8qIDB4MzgtMHgzQiAqLworCTB4Q0QsIDB4REEsIDB4Q0QsIDB4RDksIDB4MDAsIDB4MDAsIDB4QUEsIDB4RkMsIC8qIDB4M0MtMHgzRiAqLworCTB4QUEsIDB4RkIsIDB4MDAsIDB4MDAsIDB4QUIsIDB4NDAsIDB4Q0QsIDB4REMsIC8qIDB4NDAtMHg0MyAqLworCTB4QUEsIDB4RkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QzYsIDB4QUQsIDB4QUUsIC8qIDB4NDgtMHg0QiAqLworCTB4QUQsIDB4QUYsIDB4QUQsIDB4QjAsIDB4RDAsIDB4QzcsIDB4RDAsIDB4QzMsIC8qIDB4NEMtMHg0RiAqLworCTB4QUQsIDB4QUQsIDB4RDAsIDB4QzQsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QzUsIC8qIDB4NTAtMHg1MyAqLworCTB4RDAsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4QjAsIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjAsIDB4QTEsIC8qIDB4NTgtMHg1QiAqLworCTB4RDQsIDB4NDUsIDB4QjAsIDB4QTIsIDB4QjAsIDB4QTUsIDB4RDQsIDB4NDYsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4QjAsIDB4N0UsIDB4QjAsIDB4N0MsIDB4QjAsIDB4N0QsIC8qIDB4NjAtMHg2MyAqLworCTB4QjAsIDB4QTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjMsIDB4QUQsIDB4RDgsIDB4NDksIC8qIDB4NjgtMHg2QiAqLworCTB4QjMsIDB4QjUsIDB4RDgsIDB4NDgsIDB4MDAsIDB4MDAsIDB4RDgsIDB4NEIsIC8qIDB4NkMtMHg2RiAqLworCTB4QjMsIDB4QjEsIDB4RDgsIDB4NEEsIDB4QjYsIDB4QUIsIDB4QjMsIDB4QUYsIC8qIDB4NzAtMHg3MyAqLworCTB4QjMsIDB4QjIsIDB4QjMsIDB4QUUsIDB4QjMsIDB4QjMsIDB4QjMsIDB4QjQsIC8qIDB4NzQtMHg3NyAqLworCTB4QjMsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4RDgsIDB4NDcsIDB4QjYsIDB4QTcsIDB4REMsIDB4N0QsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4REMsIDB4QTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4QTIsIC8qIDB4ODAtMHg4MyAqLworCTB4QjYsIDB4QUMsIDB4QjYsIDB4QTgsIDB4QjYsIDB4QTksIDB4REMsIDB4N0MsIC8qIDB4ODQtMHg4NyAqLworCTB4REMsIDB4N0UsIDB4REMsIDB4QTEsIDB4QjYsIDB4QTQsIDB4QjYsIDB4QTYsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4QjYsIDB4QUEsIDB4QjYsIDB4QTUsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RDMsIDB4RTAsIDB4RDEsIDB4RTAsIDB4RDIsIC8qIDB4OTAtMHg5MyAqLworCTB4QjksIDB4NkEsIDB4QjksIDB4NkIsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RDQsIC8qIDB4OTQtMHg5NyAqLworCTB4QjksIDB4NjksIDB4QkIsIDB4RDgsIDB4MDAsIDB4MDAsIDB4QkIsIDB4REEsIC8qIDB4OTgtMHg5QiAqLworCTB4QkIsIDB4RDksIDB4MDAsIDB4MDAsIDB4RTQsIDB4QkIsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4QkMsIDB4RTgsIDB4QUIsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4RTgsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzAsIDB4NDcsIC8qIDB4QTQtMHhBNyAqLworCTB4QzAsIDB4NDgsIDB4RUMsIDB4NEYsIDB4QzAsIDB4NDksIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4RUUsIDB4RjYsIDB4MDAsIDB4MDAsIDB4RUUsIDB4RjQsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4RUUsIDB4RjUsIDB4QzEsIDB4RjQsIDB4MDAsIDB4MDAsIDB4RjEsIDB4NkYsIC8qIDB4QjAtMHhCMyAqLworCTB4QzMsIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4QzEsIDB4RjUsIDB4QUIsIDB4NDEsIDB4MDAsIDB4MDAsIDB4QjAsIDB4QTYsIC8qIDB4QjgtMHhCQiAqLworCTB4RDQsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4NEMsIC8qIDB4QkMtMHhCRiAqLworCTB4QjMsIDB4QjYsIDB4QjYsIDB4QUQsIDB4REMsIDB4QTQsIDB4REMsIDB4QTYsIC8qIDB4QzAtMHhDMyAqLworCTB4QjYsIDB4QUYsIDB4QjYsIDB4QUUsIDB4QjYsIDB4QjAsIDB4QjYsIDB4QjEsIC8qIDB4QzQtMHhDNyAqLworCTB4REMsIDB4QTUsIDB4QjksIDB4NkUsIDB4QjksIDB4NkYsIDB4QjksIDB4NkQsIC8qIDB4QzgtMHhDQiAqLworCTB4QkIsIDB4REIsIDB4QjksIDB4NkMsIDB4RTAsIDB4RDUsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkIsIDB4REMsIDB4RTgsIDB4QUMsIC8qIDB4RDAtMHhEMyAqLworCTB4RUMsIDB4NTAsIDB4QzAsIDB4NEEsIDB4QzEsIDB4RjYsIDB4RjEsIDB4NzAsIC8qIDB4RDQtMHhENyAqLworCTB4RjEsIDB4NzQsIDB4QzIsIDB4RjksIDB4RjEsIDB4NzEsIDB4QzIsIDB4RkEsIC8qIDB4RDgtMHhEQiAqLworCTB4QzIsIDB4RjgsIDB4RjEsIDB4NzUsIDB4QzIsIDB4RkIsIDB4RjEsIDB4NzMsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4RjMsIDB4NzksIDB4QzIsIDB4RjcsIDB4QzMsIDB4RjgsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4RjgsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4QUIsIDB4NDIsIDB4QjMsIDB4QjgsIDB4QjMsIDB4QjcsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjYsIDB4QjIsIC8qIDB4RUMtMHhFRiAqLworCTB4REMsIDB4QTgsIDB4REMsIDB4QTcsIDB4QjYsIDB4QjMsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RDksIDB4QjksIDB4NzMsIDB4QjksIDB4NzAsIC8qIDB4RjQtMHhGNyAqLworCTB4RTAsIDB4RDgsIDB4QjksIDB4NzIsIDB4RTAsIDB4RDYsIDB4QjksIDB4NzEsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RDcsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QkQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzk3WzUxMl0gPSB7CisJMHhCQiwgMHhERCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhBRiwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhCRSwgMHg1RCwgMHhFOCwgMHhBRCwgMHhCRSwgMHg1RSwgMHhCRSwgMHg1RiwgLyogMHgwNC0weDA3ICovCisJMHhFOCwgMHhBRSwgMHhCRSwgMHg2MCwgMHgwMCwgMHgwMCwgMHhFQywgMHg1MSwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhDMCwgMHg0RSwgMHhDMCwgMHg0QiwgMHhDMCwgMHg1MCwgLyogMHgwQy0weDBGICovCisJMHhFQywgMHg1MywgMHhDMCwgMHg0QywgMHhFQywgMHg1MiwgMHhDMCwgMHg0RiwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMCwgMHg0RCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhFRSwgMHhGOSwgMHhFRSwgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhDMSwgMHhGNywgMHhFRSwgMHhGQSwgMHhDMSwgMHhGOCwgMHhFRSwgMHhGOCwgLyogMHgxQy0weDFGICovCisJMHhFRSwgMHhGNywgMHgwMCwgMHgwMCwgMHhGMSwgMHg3NywgMHhGMSwgMHg3NiwgLyogMHgyMC0weDIzICovCisJMHhDMiwgMHhGQywgMHhGMSwgMHg3OCwgMHhGMywgMHg3RSwgMHhDMywgMHhGQSwgLyogMHgyNC0weDI3ICovCisJMHhGMywgMHg3RCwgMHhGMywgMHg3QSwgMHhDMywgMHhGOSwgMHhGMywgMHg3QiwgLyogMHgyOC0weDJCICovCisJMHhGMywgMHg3QywgMHgwMCwgMHgwMCwgMHhGNSwgMHg0OCwgMHhGNSwgMHg0OSwgLyogMHgyQy0weDJGICovCisJMHhDNCwgMHhDNSwgMHgwMCwgMHgwMCwgMHhDNSwgMHg1MywgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHg2RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhDNSwgMHg1MSwgMHhDNSwgMHg1MiwgMHhGNiwgMHg2RiwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhDNSwgMHhCNCwgMHhDNSwgMHhCNSwgMHhGNywgMHg3MSwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDNiwgMHg0NSwgMHhGOCwgMHhDRiwgLyogMHg0MC0weDQzICovCisJMHhDNiwgMHg0NywgMHgwMCwgMHgwMCwgMHhGOCwgMHhDRSwgMHhGOCwgMHhEMCwgLyogMHg0NC0weDQ3ICovCisJMHhDNiwgMHg0NiwgMHhGOSwgMHg1NywgMHgwMCwgMHgwMCwgMHhGOSwgMHhBRCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQiwgMHg0MywgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCOSwgMHg3NCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhFNCwgMHhCRSwgMHgwMCwgMHgwMCwgMHhFOCwgMHhCMCwgMHhDMCwgMHg1MSwgLyogMHg1OC0weDVCICovCisJMHhDMCwgMHg1MiwgMHgwMCwgMHgwMCwgMHhBQiwgMHg0NCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhCRSwgMHg2MSwgMHhDMywgMHhGQiwgMHhBRCwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMCwgMHg1MywgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhDNSwgMHhFMiwgMHhBRCwgMHhCMiwgMHhEOCwgMHg0RCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhEQywgMHhBOSwgMHgwMCwgMHgwMCwgMHhEQywgMHhBQiwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhEQywgMHhBQSwgMHgwMCwgMHgwMCwgMHhFMCwgMHhERCwgMHhFMCwgMHhEQSwgLyogMHg3MC0weDczICovCisJMHhCOSwgMHg3NSwgMHgwMCwgMHgwMCwgMHhCOSwgMHg3NiwgMHhFMCwgMHhEQiwgLyogMHg3NC0weDc3ICovCisJMHhFMCwgMHhEQywgMHgwMCwgMHgwMCwgMHhFNCwgMHhDMCwgMHhFNCwgMHhDNSwgLyogMHg3OC0weDdCICovCisJMHhCQiwgMHhERSwgMHhFNCwgMHhCRiwgMHhFNCwgMHhDMSwgMHhFNCwgMHhDOCwgLyogMHg3Qy0weDdGICovCisJCisJMHhFNCwgMHhDMywgMHhFNCwgMHhDNywgMHhFNCwgMHhDNCwgMHhFNCwgMHhDMiwgLyogMHg4MC0weDgzICovCisJMHhFNCwgMHhDNiwgMHhCQiwgMHhERiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhFOCwgMHhCMywgMHgwMCwgMHgwMCwgMHhFOCwgMHhCMSwgMHhCRSwgMHg2MywgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhCRSwgMHg2MiwgMHhFOCwgMHhCMiwgMHhCRSwgMHg2NCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhFQywgMHg1NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQywgMHg1NSwgLyogMHg5NC0weDk3ICovCisJMHhDMCwgMHg1NCwgMHhFQywgMHg1NCwgMHhFRSwgMHhGQywgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhFRSwgMHhGRSwgMHhFRiwgMHg0MSwgMHhFRiwgMHg0MCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhDMSwgMHhGOSwgMHhFRSwgMHhGRCwgMHhGMSwgMHhBMSwgMHhDMiwgMHhGRCwgLyogMHhBMC0weEEzICovCisJMHhGMSwgMHg3RCwgMHhGMSwgMHhBMiwgMHhDMiwgMHhGRSwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhGMSwgMHg3QiwgMHgwMCwgMHgwMCwgMHhGMSwgMHg3RSwgMHhGMSwgMHg3QywgLyogMHhBOC0weEFCICovCisJMHhGMSwgMHg3OSwgMHhDMywgMHg0MCwgMHhGMSwgMHg3QSwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHhBMSwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHhBMywgMHhGMywgMHhBMiwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHg0QSwgMHgwMCwgMHgwMCwgMHhGNSwgMHg0QiwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNiwgMHg3MCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhDNSwgMHhCNywgMHgwMCwgMHgwMCwgMHhDNSwgMHhCNiwgLyogMHhDMC0weEMzICovCisJMHhGOCwgMHg0RiwgMHhGOCwgMHg1MCwgMHhDNiwgMHg0OCwgMHhGOCwgMHhEMSwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhDNiwgMHg2OSwgMHgwMCwgMHgwMCwgMHhBRCwgMHhCMywgLyogMHhDOC0weENCICovCisJMHhCNiwgMHhCNCwgMHhFNCwgMHhDQSwgMHhFNCwgMHhDOSwgMHhFOCwgMHhCNSwgLyogMHhDQy0weENGICovCisJMHhFOCwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMSwgMHhGQSwgLyogMHhEMC0weEQzICovCisJMHhFRiwgMHg0MywgMHhFRiwgMHg0MiwgMHhGMSwgMHhBNSwgMHhGMSwgMHhBMywgLyogMHhENC0weEQ3ICovCisJMHhGMSwgMHhBNiwgMHhGMSwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhDMywgMHhGQywgMHhGMywgMHhBNCwgMHhGMywgMHhBNSwgMHhGMywgMHhBNiwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHg3MSwgMHgwMCwgMHgwMCwgMHhGNywgMHg3MiwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhEMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHhBRCwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhFQywgMHg1NywgMHhFRiwgMHg0NCwgMHgwMCwgMHgwMCwgMHhBRCwgMHhCNSwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhFMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHhFQywgMHg1OCwgMHhDMywgMHg0MSwgMHhGMSwgMHhBNywgMHhDMywgMHhGRCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHg0QywgMHhGNSwgMHg0RCwgMHhDNSwgMHg1NCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOThbNTEyXSA9IHsKKwkweEY4LCAweDUxLCAweEFELCAweEI2LCAweEIzLCAweEJCLCAweEIzLCAweEJDLCAvKiAweDAwLTB4MDMgKi8KKwkweEQ4LCAweDRFLCAweEI2LCAweEI1LCAweEI2LCAweEI2LCAweERDLCAweEFDLCAvKiAweDA0LTB4MDcgKi8KKwkweEI2LCAweEI3LCAweDAwLCAweDAwLCAweEI5LCAweDdBLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEI5LCAweDdDLCAweEUwLCAweERGLCAweEUwLCAweEUwLCAweEUwLCAweERFLCAvKiAweDBDLTB4MEYgKi8KKwkweEI5LCAweDc3LCAweEI5LCAweDc4LCAweEI5LCAweDdCLCAweEI5LCAweDc5LCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweENCLCAweEJCLCAweEUxLCAvKiAweDE0LTB4MTcgKi8KKwkweEJCLCAweEUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEJDLCAvKiAweDE4LTB4MUIgKi8KKwkweEJFLCAweDY3LCAweEU4LCAweEI3LCAweEU4LCAweEI2LCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEU4LCAweEJCLCAweEJFLCAweDY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweEMwLCAweDVCLCAweDAwLCAweDAwLCAweEU4LCAweEI4LCAweEU4LCAweEJELCAvKiAweDI0LTB4MjcgKi8KKwkweEU4LCAweEJBLCAweEU4LCAweEI5LCAweDAwLCAweDAwLCAweEJFLCAweDY2LCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweEMwLCAweDU5LCAweDAwLCAweDAwLCAweEVDLCAweDVBLCAvKiAweDJDLTB4MkYgKi8KKwkweEMwLCAweDU1LCAweDAwLCAweDAwLCAweEVDLCAweDVCLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEVDLCAweDU5LCAweDAwLCAweDAwLCAweEMwLCAweDU4LCAvKiAweDM0LTB4MzcgKi8KKwkweEMwLCAweDU2LCAweEMwLCAweDVBLCAweDAwLCAweDAwLCAweEMwLCAweDU3LCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweEVGLCAweDQ1LCAweDAwLCAweDAwLCAweEVGLCAweDRBLCAvKiAweDQwLTB4NDMgKi8KKwkweEVGLCAweDQ2LCAweEVGLCAweDQ5LCAweEMxLCAweEZCLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEVELCAweEQ0LCAweEVGLCAweDQ4LCAweEVGLCAweDQ3LCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEMzLCAweDQ0LCAweEMzLCAweDQyLCAweEMzLCAweDQ1LCAweEMzLCAweDQzLCAvKiAweDRDLTB4NEYgKi8KKwkweEYxLCAweEE4LCAweEYxLCAweEE5LCAweEYxLCAweEFBLCAweEMzLCAweDQ2LCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYzLCAweEFBLCAvKiAweDU0LTB4NTcgKi8KKwkweEM0LCAweDQwLCAweEYzLCAweEE4LCAweDAwLCAweDAwLCAweEM0LCAweDQxLCAvKiAweDU4LTB4NUIgKi8KKwkweEYzLCAweEE3LCAweEYzLCAweEE5LCAweEMzLCAweEZFLCAweEY1LCAweDUxLCAvKiAweDVDLTB4NUYgKi8KKwkweEY1LCAweDRFLCAweDAwLCAweDAwLCAweEY1LCAweDRGLCAweEY1LCAweDUwLCAvKiAweDYwLTB4NjMgKi8KKwkweEY2LCAweDcyLCAweEM1LCAweDU2LCAweDAwLCAweDAwLCAweEM1LCAweDU1LCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEY3LCAweDc0LCAweEY3LCAweDczLCAweEM1LCAweEI4LCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM1LCAweEUzLCAvKiAweDZDLTB4NkYgKi8KKwkweEM2LCAweDQ5LCAweEM2LCAweDYwLCAweEY5LCAweDU4LCAweEY5LCAweEFFLCAvKiAweDcwLTB4NzMgKi8KKwkweEY5LCAweEFGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEFELCAweEI3LCAweERDLCAweEFELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweEUwLCAweEUxLCAweEU0LCAweENDLCAweEU0LCAweENELCAweEJCLCAweEUzLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEJCLCAweEU0LCAweEU4LCAweEJFLCAweEJFLCAweDY4LCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMxLCAweEZDLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweEYxLCAweEFCLCAweDAwLCAweDAwLCAweEMzLCAweDQ3LCAweEYzLCAweEFELCAvKiAweEI4LTB4QkIgKi8KKwkweEM0LCAweDQyLCAweEYzLCAweEFDLCAweEYzLCAweEFFLCAweEYzLCAweEFCLCAvKiAweEJDLTB4QkYgKi8KKwkweEY2LCAweDc1LCAweEY1LCAweDUyLCAweEY1LCAweDUzLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEM0LCAweEM2LCAweDAwLCAweDAwLCAweEY2LCAweDc0LCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweDczLCAweDAwLCAweDAwLCAweEY3LCAweDc1LCAvKiAweEM4LTB4Q0IgKi8KKwkweEY5LCAweEIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFELCAweEI4LCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFELCAweEI5LCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIwLCAweEE3LCAweEQ0LCAweDQ4LCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweEQ4LCAweDRGLCAweDAwLCAweDAwLCAweEI2LCAweEI4LCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweEI2LCAweEJCLCAweEI2LCAweEI5LCAweERDLCAweEFFLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweEI2LCAweEJELCAweDAwLCAweDAwLCAweEI2LCAweEJBLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI2LCAweEJDLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEI5LCAweDdFLCAweDAwLCAweDAwLCAweEUwLCAweEUyLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweEUzLCAweEU4LCAweEMwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweEI5LCAweDdELCAweEI5LCAweEExLCAweEI5LCAweEEyLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185OVs1MTJdID0geworCTB4RTQsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4RTQsIDB4Q0UsIDB4QkIsIDB4RTUsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4QkIsIDB4RTYsIDB4MDAsIDB4MDAsIDB4RTQsIDB4RDAsIC8qIDB4MDQtMHgwNyAqLworCTB4RTgsIDB4QkYsIDB4QkIsIDB4RTgsIDB4QkUsIDB4NjksIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4QkIsIDB4RTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4QzAsIDB4NUMsIDB4RTgsIDB4QzEsIDB4QkUsIDB4NkIsIDB4QkUsIDB4NkEsIC8qIDB4MTAtMHgxMyAqLworCTB4RTgsIDB4QzIsIDB4RTgsIDB4QzUsIDB4RTgsIDB4QzMsIDB4RTgsIDB4QzQsIC8qIDB4MTQtMHgxNyAqLworCTB4QkUsIDB4NkMsIDB4MDAsIDB4MDAsIDB4QzAsIDB4NjEsIDB4QzAsIDB4NUYsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzAsIDB4NUUsIDB4RUMsIDB4NUQsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4QzAsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4RUMsIDB4NUMsIDB4RUYsIDB4NEIsIDB4MDAsIDB4MDAsIDB4RUMsIDB4NUUsIC8qIDB4MjQtMHgyNyAqLworCTB4QzAsIDB4NUQsIDB4RUMsIDB4NUYsIDB4RUYsIDB4NEUsIDB4RUYsIDB4NEMsIC8qIDB4MjgtMHgyQiAqLworCTB4RUYsIDB4NEQsIDB4RUYsIDB4NTIsIDB4QzMsIDB4NEIsIDB4RUYsIDB4NTEsIC8qIDB4MkMtMHgyRiAqLworCTB4RUYsIDB4NTQsIDB4RUYsIDB4NTMsIDB4RUYsIDB4NTAsIDB4RUYsIDB4NEYsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4QzEsIDB4RkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjEsIDB4QUUsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4RjEsIDB4QUQsIDB4QzMsIDB4NEEsIDB4QzMsIDB4NDgsIDB4QzMsIDB4NDksIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4RjEsIDB4QUMsIDB4MDAsIDB4MDAsIDB4RjMsIDB4QjEsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4QzQsIDB4NDMsIDB4MDAsIDB4MDAsIDB4RjMsIDB4QjAsIC8qIDB4NDQtMHg0NyAqLworCTB4RjMsIDB4QUYsIDB4QzQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4RjUsIDB4NTgsIC8qIDB4NDgtMHg0QiAqLworCTB4RjUsIDB4NTcsIDB4MDAsIDB4MDAsIDB4RjUsIDB4NTUsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4RjUsIDB4NTQsIDB4QzQsIDB4QzgsIDB4QzQsIDB4QzcsIDB4RjUsIDB4NTksIC8qIDB4NTAtMHg1MyAqLworCTB4RjcsIDB4NzYsIDB4QzUsIDB4QjksIDB4RjYsIDB4NzcsIDB4QzUsIDB4NTcsIC8qIDB4NTQtMHg1NyAqLworCTB4RjYsIDB4NzYsIDB4RjUsIDB4NTYsIDB4MDAsIDB4MDAsIDB4RjcsIDB4NzcsIC8qIDB4NTgtMHg1QiAqLworCTB4QzUsIDB4RTQsIDB4MDAsIDB4MDAsIDB4QzYsIDB4NjEsIDB4RjksIDB4NTksIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4RjksIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUQsIDB4QkEsIDB4RDgsIDB4NTAsIC8qIDB4OTQtMHg5NyAqLworCTB4RUYsIDB4NTUsIDB4QUQsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4RTQsIDB4RDIsIDB4RTQsIDB4RDEsIDB4RUMsIDB4NjAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4RUYsIDB4NTcsIDB4MDAsIDB4MDAsIDB4RUYsIDB4NTYsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4QzMsIDB4NEMsIDB4RjMsIDB4QjIsIDB4RjMsIDB4QjMsIC8qIDB4QTQtMHhBNyAqLworCTB4QzQsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4QjIsIC8qIDB4QTgtMHhBQiAqLworCTB4QjAsIDB4QTgsIDB4QjYsIDB4QkYsIDB4QjYsIDB4QkUsIDB4RTAsIDB4RTQsIC8qIDB4QUMtMHhBRiAqLworCTB4RTAsIDB4RTYsIDB4QjksIDB4QTQsIDB4RTAsIDB4RTUsIDB4QjksIDB4QTMsIC8qIDB4QjAtMHhCMyAqLworCTB4QjksIDB4QTUsIDB4RTAsIDB4RTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4RDQsIDB4RTQsIDB4RDYsIDB4RTQsIDB4RDUsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4QkIsIDB4RTksIDB4RTQsIDB4RDcsIDB4RTQsIDB4RDMsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4RDksIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4RTgsIDB4Q0YsIC8qIDB4QzgtMHhDQiAqLworCTB4RTgsIDB4RDEsIDB4RTgsIDB4QzcsIDB4RTgsIDB4Q0IsIDB4RTgsIDB4QzgsIC8qIDB4Q0MtMHhDRiAqLworCTB4QkUsIDB4NkUsIDB4QkUsIDB4NzEsIDB4QkUsIDB4NzMsIDB4RTgsIDB4QzksIC8qIDB4RDAtMHhEMyAqLworCTB4RTgsIDB4Q0EsIDB4QkUsIDB4NzIsIDB4RTgsIDB4Q0QsIDB4RTgsIDB4RDAsIC8qIDB4RDQtMHhENyAqLworCTB4RTgsIDB4Q0UsIDB4QkUsIDB4NzQsIDB4MDAsIDB4MDAsIDB4QkUsIDB4NzAsIC8qIDB4RDgtMHhEQiAqLworCTB4RTgsIDB4QzYsIDB4QkUsIDB4NkQsIDB4MDAsIDB4MDAsIDB4QkUsIDB4NkYsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzAsIDB4NjMsIDB4RUMsIDB4NjYsIC8qIDB4RTAtMHhFMyAqLworCTB4RUMsIDB4NjQsIDB4RUMsIDB4NjMsIDB4MDAsIDB4MDAsIDB4RUMsIDB4NjksIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4RUMsIDB4NjgsIDB4RUMsIDB4NjcsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4RUMsIDB4NjIsIDB4QzAsIDB4NjIsIDB4RUMsIDB4NjEsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4RUMsIDB4NjUsIDB4QzAsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RUYsIDB4NUEsIDB4MDAsIDB4MDAsIDB4RUYsIDB4NUUsIDB4RUYsIDB4NUIsIC8qIDB4RjQtMHhGNyAqLworCTB4RUYsIDB4NUQsIDB4RUYsIDB4NUMsIDB4RUYsIDB4NTksIDB4RUYsIDB4NUYsIC8qIDB4RjgtMHhGQiAqLworCTB4RUYsIDB4NjIsIDB4RUYsIDB4NjAsIDB4RUYsIDB4NjEsIDB4QzIsIDB4NDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzlBWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhDMSwgMHhGRSwgMHhFRiwgMHg1OCwgMHhFRiwgMHg2MywgLyogMHgwMC0weDAzICovCisJMHhGMSwgMHhCMywgMHhGMSwgMHhCNiwgMHhGMSwgMHhCOCwgMHhGMSwgMHhCNywgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHhCMSwgMHhGMSwgMHhCNSwgMHhGMSwgMHhCMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHhCMiwgMHhDMywgMHg0RCwgMHhGMSwgMHhBRiwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhGMywgMHhDMCwgMHhGMywgMHhCNSwgMHhDNCwgMHg0NSwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhDNCwgMHg0NiwgMHhGMywgMHhCNCwgMHhGMywgMHhCOSwgLyogMHgxOC0weDFCICovCisJMHhGMywgMHhCRiwgMHhGMywgMHhCNywgMHhGMywgMHhCRSwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhGMywgMHhCQiwgMHgwMCwgMHgwMCwgMHhGMywgMHhCQSwgMHhGMywgMHhCRCwgLyogMHgyMC0weDIzICovCisJMHhGMywgMHhCOCwgMHhGMywgMHhCNiwgMHgwMCwgMHgwMCwgMHhGMywgMHhCQywgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHg2MCwgMHhGNSwgMHg1RSwgMHhDNCwgMHhDQSwgLyogMHgyOC0weDJCICovCisJMHhGNSwgMHg1RCwgMHhGNSwgMHg2MywgMHhGNSwgMHg2MSwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhDNCwgMHhDQiwgMHhGNSwgMHg1QywgMHhGNSwgMHg1QSwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhGNSwgMHg1QiwgMHhDNCwgMHhDRCwgMHhGNSwgMHg1RiwgMHhDNCwgMHhDQywgLyogMHgzNC0weDM3ICovCisJMHhGNSwgMHg2MiwgMHhGNiwgMHg3OCwgMHhGNiwgMHg3RSwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHg3OSwgMHhDNSwgMHg1QiwgMHhGNiwgMHhBMSwgLyogMHgzQy0weDNGICovCisJMHhDNSwgMHg1QSwgMHhGNiwgMHg3RCwgMHhGNiwgMHg3QywgMHhDNSwgMHg1OSwgLyogMHg0MC0weDQzICovCisJMHhGNiwgMHg3QiwgMHhDNSwgMHg1OCwgMHhGNiwgMHg3QSwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhGNywgMHg3RCwgMHhGNywgMHhBMSwgMHhGNywgMHg3RSwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhGNywgMHg3QiwgMHhDNSwgMHhCQiwgMHhGNywgMHg3OCwgMHhGNywgMHg3QywgLyogMHg0Qy0weDRGICovCisJMHhGNywgMHhBMywgMHgwMCwgMHgwMCwgMHhGNywgMHhBMiwgMHhGNywgMHg3OSwgLyogMHg1MC0weDUzICovCisJMHhGNywgMHg3QSwgMHhDNSwgMHhCQSwgMHhGOCwgMHg1MiwgMHhDNSwgMHhFNywgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHg1MywgMHhDNSwgMHhFNSwgMHhDNSwgMHhFNiwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhEMywgMHhDNiwgMHg0QSwgLyogMHg1Qy0weDVGICovCisJMHhGOSwgMHg3NiwgMHgwMCwgMHgwMCwgMHhDNiwgMHg2QSwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhGOSwgMHhCMywgMHhDNiwgMHg2QiwgMHhGOSwgMHhCNCwgMHhGOSwgMHhCNSwgLyogMHg2NC0weDY3ICovCisJMHhGOSwgMHhDMywgMHhGOSwgMHhDMiwgMHhDNiwgMHg3QSwgMHhGOSwgMHhDRCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhCMCwgMHhBOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhFOSwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhFOCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhFQSwgLyogMHhBQy0weEFGICovCisJMHhCQiwgMHhFQiwgMHhFNCwgMHhEQSwgMHgwMCwgMHgwMCwgMHhFOCwgMHhEMiwgLyogMHhCMC0weEIzICovCisJMHhFQywgMHg2QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCRSwgMHg3NSwgLyogMHhCNC0weEI3ICovCisJMHhDMCwgMHg2NSwgMHhFQywgMHg2QSwgMHgwMCwgMHgwMCwgMHhFQywgMHg2RCwgLyogMHhCOC0weEJCICovCisJMHhDMCwgMHg2NiwgMHgwMCwgMHgwMCwgMHhFRiwgMHg2NCwgMHhFQywgMHg2QiwgLyogMHhCQy0weEJGICovCisJMHhGMSwgMHhCOSwgMHhDMywgMHg0RSwgMHhGMywgMHhDMSwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHg2NiwgMHhGNSwgMHg2NCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHg2NSwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhBMiwgMHgwMCwgMHgwMCwgMHhDNSwgMHg1QywgLyogMHhDQy0weENGICovCisJMHhGNywgMHhBNCwgMHhDNSwgMHhFQSwgMHhDNSwgMHhCQywgMHhDNSwgMHhFOCwgLyogMHhEMC0weEQzICovCisJMHhDNSwgMHhFOSwgMHhGOCwgMHhENCwgMHhDNiwgMHg2MiwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhCMCwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhGMSwgMHhCQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENCwgMHg0OSwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhCOSwgMHhBNiwgMHgwMCwgMHgwMCwgMHhFNCwgMHhEQiwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhFQywgMHhFNCwgMHhEQywgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhENCwgLyogMHhFOC0weEVCICovCisJMHhFOCwgMHhEMywgMHhDMCwgMHg2OCwgMHhCRSwgMHg3NiwgMHhCRSwgMHg3NywgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhENywgMHhFOCwgMHhENiwgMHhFOCwgMHhENSwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQywgMHg2RSwgMHhFQywgMHg3MSwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhFQywgMHg3MCwgMHhFQywgMHg2RiwgMHhDMCwgMHg2NywgLyogMHhGOC0weEZCICovCisJMHhFRiwgMHg2OCwgMHhFRiwgMHg2NiwgMHhFRiwgMHg2NSwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOUJbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEVGLCAweDY3LCAweDAwLCAweDAwLCAweEMzLCAweDRGLCAvKiAweDAwLTB4MDMgKi8KKwkweEYxLCAweEJDLCAweEYxLCAweEJELCAweEMzLCAweDUwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEYxLCAweEJCLCAweDAwLCAweDAwLCAweEYzLCAweEMzLCAweEYzLCAweEMyLCAvKiAweDA4LTB4MEIgKi8KKwkweEYzLCAweEM1LCAweEM0LCAweDQ3LCAweEYzLCAweEM0LCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEY1LCAweDY3LCAweEY1LCAweDY5LCAweEY1LCAweDY4LCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEEzLCAweEY2LCAweEE2LCAweEY2LCAweEE0LCAvKiAweDE0LTB4MTcgKi8KKwkweEY2LCAweEE1LCAweEY3LCAweEE1LCAweEM1LCAweEJELCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY4LCAweDU0LCAweEY4LCAweDU1LCAvKiAweDFDLTB4MUYgKi8KKwkweEY4LCAweDU2LCAweDAwLCAweDAwLCAweEM2LCAweDRCLCAweEM2LCAweDYzLCAvKiAweDIwLTB4MjMgKi8KKwkweEY5LCAweEI2LCAweEIwLCAweEFCLCAweDAwLCAweDAwLCAweEJFLCAweDc4LCAvKiAweDI0LTB4MjcgKi8KKwkweEMwLCAweDY5LCAweEYxLCAweEJFLCAweDAwLCAweDAwLCAweEY3LCAweEE2LCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LCAweEM0LCAweEQ0LCAweDRBLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEM2LCAweDdCLCAweEIwLCAweEFDLCAweEVDLCAweDcyLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEYxLCAweEJGLCAweDAwLCAweDAwLCAweEYzLCAweEM2LCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY2LCAweEE3LCAweEY3LCAweEE3LCAvKiAweDM4LTB4M0IgKi8KKwkweEIwLCAweEFELCAweDAwLCAweDAwLCAweEU0LCAweERELCAweEU0LCAweERFLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweEJCLCAweEVELCAweEJCLCAweEVFLCAweEU4LCAweEQ5LCAvKiAweDQwLTB4NDMgKi8KKwkweEJFLCAweDdBLCAweEJFLCAweDc5LCAweEU4LCAweEQ4LCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEVGLCAweDY5LCAweDAwLCAweDAwLCAweEYxLCAweEMwLCAweEYxLCAweEMyLCAvKiAweDQ4LTB4NEIgKi8KKwkweEYxLCAweEMxLCAweEMzLCAweDUzLCAweEMzLCAweDUyLCAweEMzLCAweDUxLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweEM1LCAweDVFLCAweEY2LCAweEE4LCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweEM1LCAweDVELCAweEY3LCAweEE5LCAweEY3LCAweEE4LCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEM2LCAweDRDLCAweEY4LCAweEQ1LCAweEIzLCAweEJELCAweEUwLCAweEVBLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEUxLCAvKiAweDVDLTB4NUYgKi8KKwkweEU0LCAweERGLCAweEU0LCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEU4LCAweEUyLCAweDAwLCAweDAwLCAweEU4LCAweERELCAweEU4LCAweERBLCAvKiAweDY0LTB4NjcgKi8KKwkweEU4LCAweEUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEU4LCAweEUzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJFLCAweDdDLCAvKiAweDZDLTB4NkYgKi8KKwkweEU4LCAweEUwLCAweEU4LCAweERDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEU4LCAweERCLCAweEU4LCAweERGLCAweEU4LCAweERFLCAweEJFLCAweDdCLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweDdELCAweEVDLCAweDc4LCAvKiAweDc4LTB4N0IgKi8KKwkweEVDLCAweDc2LCAweEVDLCAweEExLCAweEVDLCAweDc3LCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEVDLCAweDczLCAweDAwLCAweDAwLCAweEVDLCAweDc5LCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweEVDLCAweDc0LCAweEVGLCAweDcyLCAweEVDLCAweDc1LCAvKiAweDg0LTB4ODcgKi8KKwkweEVDLCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweEVDLCAweDdDLCAweEMwLCAweDZBLCAweEVDLCAweDdCLCAweEVDLCAweDdBLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweEVDLCAweDdFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweDZBLCAweEVGLCAweDZELCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweDZDLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweEVGLCAweDc0LCAweEVGLCAweDZGLCAweEVGLCAweDczLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEVGLCAweDcxLCAweEVGLCAweDcwLCAweEVGLCAweDZFLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEVGLCAweDZCLCAweDAwLCAweDAwLCAweEMyLCAweDQzLCAweEMyLCAweDQyLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweEMyLCAweDQ0LCAweEMyLCAweDQxLCAweEVGLCAweDc1LCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEYxLCAweEM4LCAweEYxLCAweENCLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweEYxLCAweEM5LCAweEYxLCAweENELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweEYxLCAweENFLCAweDAwLCAweDAwLCAweEYxLCAweEM2LCAvKiAweEJDLTB4QkYgKi8KKwkweEMzLCAweDU4LCAweEYxLCAweEM3LCAweDAwLCAweDAwLCAweEYxLCAweEM1LCAvKiAweEMwLTB4QzMgKi8KKwkweEYxLCAweENDLCAweDAwLCAweDAwLCAweEYxLCAweEM0LCAweEYxLCAweEMzLCAvKiAweEM0LTB4QzcgKi8KKwkweEMzLCAweDU3LCAweEMzLCAweDU1LCAweEMzLCAweDU0LCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweENBLCAvKiAweEQwLTB4RDMgKi8KKwkweEYzLCAweENGLCAweEYzLCAweEQ1LCAweEM0LCAweDRBLCAweEYzLCAweEQwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweEYzLCAweEQzLCAweEYzLCAweEQ3LCAweEM0LCAweDRCLCAvKiAweEQ4LTB4REIgKi8KKwkweEYzLCAweEQyLCAweDAwLCAweDAwLCAweEYzLCAweENBLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweEYzLCAweEM5LCAweEYzLCAweEQ2LCAweEYzLCAweENELCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweEYzLCAweENCLCAweEYzLCAweEQ0LCAweEYzLCAweENDLCAweEM0LCAweDQ5LCAvKiAweEU0LTB4RTcgKi8KKwkweEM0LCAweDQ4LCAweDAwLCAweDAwLCAweEYzLCAweEM3LCAweEYzLCAweEM4LCAvKiAweEU4LTB4RUIgKi8KKwkweEYzLCAweEQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweEYzLCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweDZDLCAvKiAweEY0LTB4RjcgKi8KKwkweEY1LCAweDZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEMzLCAweDU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185Q1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4NkQsIDB4RjUsIDB4NzMsIDB4RjUsIDB4NzEsIC8qIDB4MDQtMHgwNyAqLworCTB4RjUsIDB4NkIsIDB4RjUsIDB4NzYsIDB4MDAsIDB4MDAsIDB4RjUsIDB4NkEsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4QzQsIDB4Q0YsIDB4RjUsIDB4NzIsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjUsIDB4NkUsIDB4QzQsIDB4Q0UsIC8qIDB4MTAtMHgxMyAqLworCTB4RjUsIDB4NzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjUsIDB4NzQsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4RjYsIDB4QUIsIDB4RjYsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4QjEsIDB4MDAsIDB4MDAsIDB4RjYsIDB4QUQsIC8qIDB4MjAtMHgyMyAqLworCTB4RjYsIDB4QjAsIDB4QzUsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4RjYsIDB4QUUsIDB4RjYsIDB4QUYsIDB4MDAsIDB4MDAsIDB4RjYsIDB4QTksIC8qIDB4MjgtMHgyQiAqLworCTB4RjYsIDB4QUMsIDB4QzUsIDB4NUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4QzUsIDB4QkYsIDB4RjcsIDB4QjQsIDB4RjcsIDB4QUYsIC8qIDB4MzAtMHgzMyAqLworCTB4RjcsIDB4QjMsIDB4MDAsIDB4MDAsIDB4RjcsIDB4QjYsIDB4RjcsIDB4QjIsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4RjcsIDB4QUUsIDB4MDAsIDB4MDAsIDB4QzUsIDB4QzEsIC8qIDB4MzgtMHgzQiAqLworCTB4RjcsIDB4QjEsIDB4RjcsIDB4QjUsIDB4QzUsIDB4QzAsIDB4RjcsIDB4QUMsIC8qIDB4M0MtMHgzRiAqLworCTB4RjUsIDB4NzAsIDB4RjcsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4RjcsIDB4QUQsIDB4MDAsIDB4MDAsIDB4RjcsIDB4QUEsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RjcsIDB4QUIsIDB4QzUsIDB4QkUsIDB4RjgsIDB4NUEsIDB4RjgsIDB4NUMsIC8qIDB4NDgtMHg0QiAqLworCTB4RjgsIDB4NUYsIDB4RjgsIDB4NUIsIDB4RjgsIDB4NjAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4RjgsIDB4NTksIDB4MDAsIDB4MDAsIDB4RjgsIDB4NTcsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4QzUsIDB4RUIsIDB4RjgsIDB4NUQsIDB4QzUsIDB4RUQsIDB4QzUsIDB4RUMsIC8qIDB4NTQtMHg1NyAqLworCTB4RjgsIDB4NTgsIDB4RjgsIDB4NUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4REEsIDB4QzYsIDB4NEQsIC8qIDB4NUMtMHg1RiAqLworCTB4RjgsIDB4REIsIDB4MDAsIDB4MDAsIDB4RjgsIDB4RDksIDB4RjgsIDB4RDYsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4RDgsIDB4RjgsIDB4RDcsIC8qIDB4NjQtMHg2NyAqLworCTB4RjksIDB4NUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4RjksIDB4NUMsIDB4RjksIDB4NUIsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4RjksIDB4NzksIDB4MDAsIDB4MDAsIDB4RjksIDB4NzgsIC8qIDB4NzAtMHg3MyAqLworCTB4RjksIDB4NzcsIDB4RjksIDB4N0EsIDB4MDAsIDB4MDAsIDB4QzYsIDB4NzMsIC8qIDB4NzQtMHg3NyAqLworCTB4QzYsIDB4NzQsIDB4RjksIDB4Q0EsIDB4RjksIDB4Q0UsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4QjMsIDB4QkUsIDB4REMsIDB4QUYsIDB4RTAsIDB4RUQsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4QjksIDB4QTcsIDB4RTAsIDB4RUIsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4RTIsIDB4RTQsIDB4RTMsIDB4QkIsIDB4RjEsIC8qIDB4RjAtMHhGMyAqLworCTB4QkIsIDB4RUYsIDB4RTQsIDB4RTQsIDB4QkIsIDB4RjAsIDB4RTgsIDB4RTgsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4RUIsIDB4RTgsIDB4RTUsIDB4RTgsIDB4RUMsIC8qIDB4RjgtMHhGQiAqLworCTB4RTgsIDB4RTQsIDB4RTgsIDB4RTYsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RTcsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzlEWzUxMl0gPSB7CisJMHhFOCwgMHhFQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCRSwgMHhBMSwgLyogMHgwMC0weDAzICovCisJMHhFOCwgMHhFRiwgMHhFOCwgMHhFRSwgMHhCRSwgMHg3RCwgMHhFOCwgMHhFOSwgLyogMHgwNC0weDA3ICovCisJMHhFOCwgMHhFRCwgMHhCRSwgMHg3RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhFQywgMHhBQywgMHgwMCwgMHgwMCwgMHhDMCwgMHg2RiwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhFQywgMHhBNywgMHhDMCwgMHg2QiwgMHgwMCwgMHgwMCwgMHhFQywgMHhBNCwgLyogMHgxNC0weDE3ICovCisJMHhFQywgMHhBQSwgMHhFQywgMHhBRCwgMHgwMCwgMHgwMCwgMHhDMCwgMHg3MCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhFQywgMHhBOSwgMHhFQywgMHhBNiwgMHhFQywgMHhBRSwgLyogMHgxQy0weDFGICovCisJMHhFQywgMHhBNSwgMHgwMCwgMHgwMCwgMHhFQywgMHhBQiwgMHhDMCwgMHg2QywgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhFQywgMHhBMywgMHhDMCwgMHg2RCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhDMCwgMHg2RSwgMHhFQywgMHhBOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHhFRiwgMHhBOSwgMHhFRiwgMHg3QSwgMHhFRiwgMHg3QiwgLyogMHgyQy0weDJGICovCisJMHhFRiwgMHg3RSwgMHhFRiwgMHg3QywgMHgwMCwgMHgwMCwgMHhFRiwgMHg3NiwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHg3OSwgMHhFRiwgMHhBNSwgLyogMHgzNC0weDM3ICovCisJMHhFRiwgMHg3RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMiwgMHg0NSwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhFRiwgMHhBNywgMHhFRiwgMHhBNCwgMHhDMiwgMHg0NiwgLyogMHgzQy0weDNGICovCisJMHhFRiwgMHhBNiwgMHhFRiwgMHg3NywgMHhFRiwgMHhBMiwgMHhFRiwgMHhBMywgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhFRiwgMHhBMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhEMiwgMHhGMSwgMHhENCwgLyogMHg0OC0weDRCICovCisJMHhGMSwgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhEMSwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHhDMywgMHg1OSwgMHhGMSwgMHhEOSwgMHhGMSwgMHhEMCwgLyogMHg1MC0weDUzICovCisJMHhGMSwgMHhEQSwgMHgwMCwgMHgwMCwgMHhGMSwgMHhENiwgMHhGMSwgMHhEOCwgLyogMHg1NC0weDU3ICovCisJMHhGMSwgMHhEQywgMHhGMSwgMHhENSwgMHhGMSwgMHhERCwgMHhGMSwgMHhEMywgLyogMHg1OC0weDVCICovCisJMHhGMSwgMHhDRiwgMHhDMywgMHg1QSwgMHgwMCwgMHgwMCwgMHhGMSwgMHhEQiwgLyogMHg1Qy0weDVGICovCisJMHhDMywgMHg1QiwgMHhDNCwgMHg0RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHg3OCwgLyogMHg2NC0weDY3ICovCisJMHhGMywgMHhGMSwgMHhGMywgMHhFOCwgMHhDNCwgMHg0RiwgMHhGMywgMHhFNCwgLyogMHg2OC0weDZCICovCisJMHhDNCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHhFRCwgLyogMHg2Qy0weDZGICovCisJMHhGMywgMHhFNywgMHhGMywgMHhERCwgMHhDNCwgMHg0RSwgMHhGMywgMHhFQSwgLyogMHg3MC0weDczICovCisJMHhGMywgMHhFNSwgMHhGMywgMHhFNiwgMHgwMCwgMHgwMCwgMHhGMywgMHhEOCwgLyogMHg3NC0weDc3ICovCisJMHhGMywgMHhERiwgMHhGMywgMHhFRSwgMHgwMCwgMHgwMCwgMHhGMywgMHhFQiwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhGMywgMHhFMywgMHgwMCwgMHgwMCwgMHhGMywgMHhFRiwgLyogMHg3Qy0weDdGICovCisJCisJMHhGMywgMHhERSwgMHhGMywgMHhEOSwgMHhGMywgMHhFQywgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhGMywgMHhEQiwgMHhGMywgMHhFOSwgMHhGMywgMHhFMCwgMHhGMywgMHhGMCwgLyogMHg4NC0weDg3ICovCisJMHhGMywgMHhEQywgMHhDNCwgMHg0QywgMHhGMywgMHhEQSwgMHhGMywgMHhFMSwgLyogMHg4OC0weDhCICovCisJMHhGMywgMHhFMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhGNSwgMHg3RCwgMHgwMCwgMHgwMCwgMHhGNSwgMHg3QiwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhGNSwgMHhBMiwgMHgwMCwgMHgwMCwgMHhGNSwgMHhBRSwgMHhGNSwgMHhBNSwgLyogMHg5NC0weDk3ICovCisJMHhGNSwgMHg3QywgMHhGNSwgMHg3OCwgMHhGNSwgMHhBNywgMHhGNSwgMHg3RSwgLyogMHg5OC0weDlCICovCisJMHhGNSwgMHhBMywgMHhGNSwgMHg3QSwgMHhGNSwgMHhBQSwgMHhGNSwgMHg3NywgLyogMHg5Qy0weDlGICovCisJMHhGNSwgMHhBMSwgMHhGNSwgMHhBNiwgMHhGNSwgMHhBOCwgMHhGNSwgMHhBQiwgLyogMHhBMC0weEEzICovCisJMHhGNSwgMHg3OSwgMHgwMCwgMHgwMCwgMHhGNSwgMHhBRiwgMHhGNSwgMHhCMCwgLyogMHhBNC0weEE3ICovCisJMHhGNSwgMHhBOSwgMHhGNSwgMHhBRCwgMHhGNSwgMHhBNCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhGNiwgMHhDMSwgMHhGNiwgMHhDNCwgMHgwMCwgMHgwMCwgMHhDNSwgMHg2MSwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhDMywgMHhGNiwgMHhDOCwgMHhGNiwgMHhDNiwgLyogMHhCMC0weEIzICovCisJMHhDNSwgMHg2MiwgMHhGNiwgMHhCRCwgMHhGNiwgMHhCMywgMHhGNiwgMHhCMiwgLyogMHhCNC0weEI3ICovCisJMHhDNSwgMHg2NCwgMHhGNiwgMHhCRiwgMHhGNiwgMHhDMCwgMHhGNiwgMHhCQywgLyogMHhCOC0weEJCICovCisJMHhGNiwgMHhCNCwgMHgwMCwgMHgwMCwgMHhGNiwgMHhCOSwgMHhGNSwgMHhBQywgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhCNSwgMHhDNSwgMHg2MywgMHhGNiwgMHhCQiwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhCQSwgMHgwMCwgMHgwMCwgMHhGNiwgMHhCNiwgLyogMHhDNC0weEM3ICovCisJMHhGNiwgMHhDMiwgMHgwMCwgMHgwMCwgMHhGNiwgMHhCNywgMHhGNywgMHhCQiwgLyogMHhDOC0weENCICovCisJMHhGNiwgMHhDNSwgMHhGNiwgMHhDNywgMHhGNiwgMHhCRSwgMHhGNiwgMHhCOCwgLyogMHhDQy0weENGICovCisJMHhGNywgMHhCQywgMHhGNywgMHhCRSwgMHhGNywgMHhCOCwgMHhDNSwgMHhDMiwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhGNywgMHhDNSwgMHhGNywgMHhDMywgMHhDNSwgMHhDMywgLyogMHhENC0weEQ3ICovCisJMHhGNywgMHhDMiwgMHhGNywgMHhDMSwgMHhGNywgMHhCQSwgMHhGNywgMHhCNywgLyogMHhEOC0weERCICovCisJMHhGNywgMHhCRCwgMHhGNywgMHhDNiwgMHhGNywgMHhCOSwgMHhGNywgMHhCRiwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHg2OSwgMHhGOCwgMHg2RSwgMHhGOCwgMHg2NCwgLyogMHhFMC0weEUzICovCisJMHhGOCwgMHg2NywgMHhDNSwgMHhFRSwgMHhGOCwgMHg2QiwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhGOCwgMHg3MiwgMHhGNywgMHhDMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHg2NSwgLyogMHhFOC0weEVCICovCisJMHhGOCwgMHg2RiwgMHhGOCwgMHg3MywgMHhGOCwgMHg2QSwgMHhGOCwgMHg2MywgLyogMHhFQy0weEVGICovCisJMHhGOCwgMHg2RCwgMHgwMCwgMHgwMCwgMHhGOCwgMHg2QywgMHhGOCwgMHg3MSwgLyogMHhGMC0weEYzICovCisJMHhGOCwgMHg3MCwgMHhGNywgMHhDNCwgMHhGOCwgMHg2OCwgMHhGOCwgMHg2MiwgLyogMHhGNC0weEY3ICovCisJMHhGOCwgMHg2NiwgMHhDNiwgMHg0RSwgMHhDNiwgMHg0RiwgMHhGOCwgMHg2MSwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhFNiwgMHhGOCwgMHhERCwgMHhGOCwgMHhFNSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOUVbNTEyXSA9IHsKKwkweEY4LCAweEUyLCAweEY4LCAweEUzLCAweEY4LCAweERDLCAweEY4LCAweERGLCAvKiAweDAwLTB4MDMgKi8KKwkweEY4LCAweEU3LCAweEY4LCAweEUxLCAweEY4LCAweEUwLCAweEY4LCAweERFLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEU0LCAweDAwLCAweDAwLCAweEY5LCAweDVELCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEY5LCAweDVFLCAweDAwLCAweDAwLCAweEY5LCAweDYwLCAvKiAweDBDLTB4MEYgKi8KKwkweEY5LCAweDVGLCAweEY5LCAweDYyLCAweEY5LCAweDYxLCAweEY5LCAweDdDLCAvKiAweDEwLTB4MTMgKi8KKwkweEY5LCAweDdCLCAweEY5LCAweEI3LCAweDAwLCAweDAwLCAweEY5LCAweEI4LCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEY5LCAweEM1LCAweEM2LCAweDc4LCAweEM2LCAweDdDLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweEY5LCAweENGLCAweEM2LCAweDdELCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEIzLCAweEJGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEM0LCAweEQwLCAweEY2LCAweEM5LCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEM2LCAweDUwLCAweEM2LCAweDUxLCAweDAwLCAweDAwLCAweEIzLCAweEMwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEUwLCAweEVFLCAweDAwLCAweDAwLCAweEI5LCAweEE4LCAweEU4LCAweEYwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEIwLCAweEVDLCAweEIxLCAvKiAweDg0LTB4ODcgKi8KKwkweEVDLCAweEFGLCAweEVGLCAweEFCLCAweEVGLCAweEFBLCAweEMyLCAweDQ3LCAvKiAweDg4LTB4OEIgKi8KKwkweEYxLCAweERGLCAweEVGLCAweEFDLCAweEYxLCAweERFLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEYzLCAweEYzLCAweEM0LCAweDUxLCAweEM0LCAweDUzLCAvKiAweDkwLTB4OTMgKi8KKwkweEYzLCAweEYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM0LCAweDUyLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweEY1LCAweEIxLCAweEY1LCAweEIzLCAweEY1LCAweEIyLCAvKiAweDk4LTB4OUIgKi8KKwkweEY2LCAweENBLCAweEM1LCAweDY1LCAweDAwLCAweDAwLCAweEM1LCAweEVGLCAvKiAweDlDLTB4OUYgKi8KKwkweEY4LCAweEU4LCAweEY5LCAweDYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEY5LCAweEQyLCAweEIzLCAweEMxLCAweDAwLCAweDAwLCAweEU0LCAweEU1LCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweEJFLCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweEVDLCAweEIzLCAweEVDLCAweEIyLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweEVGLCAweEFELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweEM0LCAweDU0LCAweEM0LCAweEQxLCAweEY3LCAweEM3LCAweEY5LCAweENCLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIzLCAweEMyLCAvKiAweEI4LTB4QkIgKi8KKwkweEJCLCAweEYyLCAweDAwLCAweDAwLCAweEJFLCAweEEzLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweEYzLCAweEY0LCAweDAwLCAweDAwLCAweEY4LCAweDc0LCAweEI2LCAweEMwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweEVGLCAweEFFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEM2LCAweDY0LCAweEI2LCAweEMxLCAweEJFLCAweEE0LCAweEMyLCAweDQ4LCAvKiAweENDLTB4Q0YgKi8KKwkweEY4LCAweDc1LCAweEI2LCAweEMyLCAweDAwLCAweDAwLCAweEU4LCAweEYxLCAvKiAweEQwLTB4RDMgKi8KKwkweEMwLCAweDcyLCAweEVDLCAweEI0LCAweEVDLCAweEI1LCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEMwLCAweDcxLCAweDAwLCAweDAwLCAweEVGLCAweEFGLCAweEMyLCAweDRDLCAvKiAweEQ4LTB4REIgKi8KKwkweEMyLCAweDRBLCAweEMyLCAweDRCLCAweEMyLCAweDQ5LCAweEYxLCAweEUwLCAvKiAweERDLTB4REYgKi8KKwkweEMzLCAweDVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweEY1LCAweEI1LCAweEY1LCAweEI0LCAweEY1LCAweEI3LCAweEY1LCAweEI2LCAvKiAweEU0LTB4RTcgKi8KKwkweEM0LCAweEQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY2LCAweENCLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweENELCAweEY2LCAweENDLCAweEM1LCAweDY2LCAvKiAweEVDLTB4RUYgKi8KKwkweEY3LCAweEM4LCAweDAwLCAweDAwLCAweEY4LCAweDc2LCAweEY4LCAweDc3LCAvKiAweEYwLTB4RjMgKi8KKwkweEM1LCAweEYwLCAweEY5LCAweDY0LCAweEY5LCAweDdELCAweEM2LCAweDc1LCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweERDLCAweEIwLCAweEVDLCAweEI2LCAweEVGLCAweEIwLCAvKiAweEY4LTB4RkIgKi8KKwkweEYzLCAweEY1LCAweEUwLCAweEVGLCAweDAwLCAweDAwLCAweEVGLCAweEIxLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185Rls1MTJdID0geworCTB4RjEsIDB4RTIsIDB4RjEsIDB4RTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4NzgsIDB4QzYsIDB4NTIsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4RjksIDB4NjUsIDB4RjksIDB4N0UsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjksIDB4QTksIDB4RTgsIDB4RjIsIC8qIDB4MEMtMHgwRiAqLworCTB4RTgsIDB4RjMsIDB4MDAsIDB4MDAsIDB4RUMsIDB4QjcsIDB4QjksIDB4QUEsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4QzMsIDB4NUQsIDB4RjEsIDB4RTMsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4RjYsIDB4Q0YsIDB4QzUsIDB4NjcsIDB4RjYsIDB4RDAsIDB4RjYsIDB4Q0UsIC8qIDB4MTgtMHgxQiAqLworCTB4RjgsIDB4NzksIDB4MDAsIDB4MDAsIDB4RjgsIDB4RTksIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4QjksIDB4QUIsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QjQsIDB4RUYsIDB4QjMsIC8qIDB4MjAtMHgyMyAqLworCTB4RUYsIDB4QjIsIDB4RjEsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4RjEsIDB4RTgsIDB4RjEsIDB4RTcsIDB4RjEsIDB4RTYsIDB4RjEsIDB4RTUsIC8qIDB4MjgtMHgyQiAqLworCTB4QzMsIDB4NUUsIDB4RjMsIDB4RjYsIDB4RjUsIDB4QjksIDB4QzQsIDB4RDMsIC8qIDB4MkMtMHgyRiAqLworCTB4RjUsIDB4QjgsIDB4RjYsIDB4RDEsIDB4RjcsIDB4Q0IsIDB4RjcsIDB4Q0EsIC8qIDB4MzAtMHgzMyAqLworCTB4QzUsIDB4QzQsIDB4RjcsIDB4QzksIDB4RjgsIDB4N0MsIDB4RjgsIDB4N0IsIC8qIDB4MzQtMHgzNyAqLworCTB4RjgsIDB4N0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkIsIDB4RjMsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4RUMsIDB4QjgsIDB4QzIsIDB4NEQsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4RjMsIDB4RjcsIDB4RjMsIDB4RjgsIDB4RjcsIDB4Q0MsIDB4RjgsIDB4N0QsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4RUEsIDB4RjksIDB4NjYsIC8qIDB4NDQtMHg0NyAqLworCTB4RjksIDB4QjksIDB4RjksIDB4RDQsIDB4QkIsIDB4RjQsIDB4QzIsIDB4NEUsIC8qIDB4NDgtMHg0QiAqLworCTB4RjEsIDB4RTksIDB4RjMsIDB4RjksIDB4RjYsIDB4RDIsIDB4RjgsIDB4N0UsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkUsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4RUYsIDB4QjUsIDB4RjEsIDB4RUEsIDB4RjMsIDB4RkEsIDB4RjMsIDB4RkIsIC8qIDB4NTQtMHg1NyAqLworCTB4RjMsIDB4RkMsIDB4RjUsIDB4QkUsIDB4MDAsIDB4MDAsIDB4RjUsIDB4QkEsIC8qIDB4NTgtMHg1QiAqLworCTB4QzUsIDB4NjgsIDB4RjUsIDB4QkQsIDB4RjUsIDB4QkMsIDB4QzQsIDB4RDQsIC8qIDB4NUMtMHg1RiAqLworCTB4RjUsIDB4QkIsIDB4QzQsIDB4RDYsIDB4MDAsIDB4MDAsIDB4QzQsIDB4RDUsIC8qIDB4NjAtMHg2MyAqLworCTB4RjYsIDB4RDQsIDB4RjYsIDB4RDMsIDB4QzUsIDB4NjksIDB4QzUsIDB4NkEsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzUsIDB4QzYsIDB4RjcsIDB4Q0QsIC8qIDB4NjgtMHg2QiAqLworCTB4QzUsIDB4QzUsIDB4MDAsIDB4MDAsIDB4RjgsIDB4QTMsIDB4RjgsIDB4QTQsIC8qIDB4NkMtMHg2RiAqLworCTB4RjgsIDB4QTIsIDB4RjgsIDB4QTEsIDB4QzYsIDB4NTQsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4RjgsIDB4RUIsIDB4RjgsIDB4RUMsIDB4RjgsIDB4RUQsIDB4QzYsIDB4NTMsIC8qIDB4NzQtMHg3NyAqLworCTB4RjksIDB4NjcsIDB4RjksIDB4NkEsIDB4RjksIDB4NjksIDB4RjksIDB4NjgsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4RDMsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4QzAsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4QzMsIDB4NjUsIDB4RjUsIDB4QkYsIDB4RjYsIDB4RDUsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4QzUsIDB4QzcsIDB4RjcsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4RjksIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4QzAsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4RUYsIDB4QjYsIDB4MDAsIDB4MDAsIDB4RjcsIDB4Q0YsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4RjksIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0RDWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfRjlbNTEyXSA9IHsKKwkweEIwLCAweDVBLCAweEE3LCAweEYzLCAweEE4LCAweEFFLCAweEI4LCAweEVCLCAvKiAweDAwLTB4MDMgKi8KKwkweEI3LCAweEM2LCAweEE2LCAweEVBLCAweEE1LCAweDc5LCAweEMwLCAweDc0LCAvKiAweDA0LTB4MDcgKi8KKwkweEMwLCAweDc0LCAweEFCLCAweEI0LCAweEFBLCAweEY3LCAweEIzLCAweEUyLCAvKiAweDA4LTB4MEIgKi8KKwkweEE5LCAweDYwLCAweEMzLCAweDY5LCAweEM0LCAweEVFLCAweEMzLCAweEI5LCAvKiAweDBDLTB4MEYgKi8KKwkweEM1LCAweERBLCAweEMxLCAweEIzLCAweEJCLCAweDcyLCAweEM1LCAweERFLCAvKiAweDEwLTB4MTMgKi8KKwkweEJDLCAweEQ2LCAweEFDLCAweEE1LCAweEFGLCAweDRGLCAweEFGLCAweDVGLCAvKiAweDE0LTB4MTcgKi8KKwkweEI4LCAweEE4LCAweEI5LCAweDU0LCAweEMwLCAweDY0LCAweEI2LCAweEMzLCAvKiAweDE4LTB4MUIgKi8KKwkweEE3LCAweDVBLCAweEM0LCAweEU2LCAweEM0LCAweEVBLCAweEM0LCAweEY1LCAvKiAweDFDLTB4MUYgKi8KKwkweEM2LCAweDdELCAweEI0LCAweDUwLCAweEMwLCAweERELCAweEMyLCAweEM1LCAvKiAweDIwLTB4MjMgKi8KKwkweEM0LCAweEIwLCAweEE5LCAweEQ0LCAweEMzLCAweEJFLCAweEM0LCAweEZBLCAvKiAweDI0LTB4MjcgKi8KKwkweEI0LCAweDU5LCAweEFFLCAweEQ0LCAweEFFLCAweEY2LCAweEFGLCAweDU0LCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweEE4LCAweEQzLCAweEE3LCAweDRFLCAweEIzLCAweEQyLCAvKiAweDJDLTB4MkYgKi8KKwkweEJFLCAweERCLCAweEMzLCAweDcyLCAweEM0LCAweDZDLCAweEJGLCAweDYzLCAvKiAweDMwLTB4MzMgKi8KKwkweEE2LCAweEQxLCAweEM0LCAweEFBLCAweEI4LCAweEI4LCAweEI4LCAweEY0LCAvKiAweDM0LTB4MzcgKi8KKwkweEM1LCAweDUzLCAweEJFLCAweDdDLCAweEM2LCAweDRGLCAweEI4LCAweDRDLCAvKiAweDM4LTB4M0IgKi8KKwkweEI4LCAweDUzLCAweEJBLCAweEYxLCAweERCLCAweDc3LCAweEJGLCAweEZELCAvKiAweDNDLTB4M0YgKi8KKwkweEIzLCAweEMwLCAweEJELCAweEQ3LCAweEMzLCAweDYyLCAweEE3LCAweENCLCAvKiAweDQwLTB4NDMgKi8KKwkweEM1LCAweEEyLCAweEM1LCAweEE0LCAweEE4LCAweDYzLCAweEJELCAweDU1LCAvKiAweDQ0LTB4NDcgKi8KKwkweEI4LCAweEVGLCAweEI5LCAweDcwLCAweEMyLCAweDUzLCAweEI5LCAweEYwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEJDLCAweEQzLCAweEIyLCAweDVDLCAweEJBLCAweDdDLCAweEIyLCAweEQ2LCAvKiAweDRDLTB4NEYgKi8KKwkweEMxLCAweDVDLCAweEFELCAweEFFLCAweEIwLCAweEM3LCAweEE2LCAweEQ4LCAvKiAweDUwLTB4NTMgKi8KKwkweEJCLCAweEZFLCAweEFELCAweEUyLCAweEI4LCAweDU3LCAweEJBLCAweEYwLCAvKiAweDU0LTB4NTcgKi8KKwkweEI1LCAweEQ5LCAweEIzLCAweEFFLCAweEM1LCAweEFBLCAweENFLCAweEQ0LCAvKiAweDU4LTB4NUIgKi8KKwkweEJDLCAweEQ2LCAweEJGLCAweEQ1LCAweEE0LCAweEE2LCAweEI5LCAweEU3LCAvKiAweDVDLTB4NUYgKi8KKwkweEFCLCAweEUzLCAweEIyLCAweDc2LCAweEIyLCAweEE3LCAweEE1LCAweDVGLCAvKiAweDYwLTB4NjMgKi8KKwkweEVELCAweEE4LCAweEFCLCAweDRCLCAweEI0LCAweDVGLCAweEE0LCAweEEzLCAvKiAweDY0LTB4NjcgKi8KKwkweEFBLCAweDYzLCAweEJDLCAweEM2LCAweEFGLCAweEMxLCAweEIwLCAweEQxLCAvKiAweDY4LTB4NkIgKi8KKwkweEI2LCAweEVCLCAweEFDLCAweEQ5LCAweEI4LCAweEFELCAweEJCLCAweEExLCAvKiAweDZDLTB4NkYgKi8KKwkweEIxLCAweEZFLCAweEE4LCAweEIwLCAweEE4LCAweDQ4LCAweEFDLCAweDQyLCAvKiAweDcwLTB4NzMgKi8KKwkweEFELCAweDU5LCAweEIxLCAweEIwLCAweEIyLCAweEE0LCAweEFCLCAweDQ3LCAvKiAweDc0LTB4NzcgKi8KKwkweEE4LCAweEUyLCAweDAwLCAweDAwLCAweEIxLCAweEU3LCAweEMyLCAweEIzLCAvKiAweDc4LTB4N0IgKi8KKwkweEE4LCAweDdELCAweEJELCAweENDLCAweEI2LCAweDcxLCAweEMwLCAweDc5LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEE3LCAweDY2LCAweEE0LCAweDZCLCAweEMzLCAweDY2LCAweEFFLCAweEM4LCAvKiAweDgwLTB4ODMgKi8KKwkweEMyLCAweDZGLCAweEM0LCAweDcyLCAweEJFLCAweDVCLCAweEM2LCAweDdBLCAvKiAweDg0LTB4ODcgKi8KKwkweEM0LCAweDUyLCAweEJFLCAweEE0LCAweEE0LCAweDRGLCAweEJFLCAweEU0LCAvKiAweDg4LTB4OEIgKi8KKwkweEJFLCAweEZBLCAweEY3LCAweDY1LCAweEE2LCAweDdFLCAweEJDLCAweEE2LCAvKiAweDhDLTB4OEYgKi8KKwkweEM1LCAweENBLCAweEJDLCAweEJGLCAweEJBLCAweEE3LCAweEI3LCAweEQyLCAvKiAweDkwLTB4OTMgKi8KKwkweEU2LCAweEEzLCAweDAwLCAweDAwLCAweEJELCAweDZELCAweEMxLCAweDcwLCAvKiAweDk0LTB4OTcgKi8KKwkweEJELCAweEZCLCAweEJELCAweEFDLCAweEIzLCAweDczLCAweEMxLCAweEU1LCAvKiAweDk4LTB4OUIgKi8KKwkweEE2LCAweDQzLCAweEE2LCAweDQ4LCAweEFCLCAweDdDLCAweEFGLCAweDUwLCAvKiAweDlDLTB4OUYgKi8KKwkweEI1LCAweEY1LCAweEJCLCAweEExLCAweEI3LCAweDQ3LCAweEE5LCAweEMwLCAvKiAweEEwLTB4QTMgKi8KKwkweEIxLCAweEM5LCAweEMwLCAweEQ0LCAweEMzLCAweEFFLCAweEMyLCAweDc5LCAvKiAweEE0LTB4QTcgKi8KKwkweEE1LCAweDRGLCAweENCLCAweEYxLCAweEI5LCAweEU3LCAweEMwLCAweEFELCAvKiAweEE4LTB4QUIgKi8KKwkweENDLCAweEIwLCAweEFDLCAweEMyLCAweEJDLCAweEZDLCAweEIyLCAweERDLCAvKiAweEFDLTB4QUYgKi8KKwkweEIyLCAweEUyLCAweEI5LCAweDYxLCAweEI5LCAweDczLCAweEM2LCAweDQ2LCAvKiAweEIwLTB4QjMgKi8KKwkweEJCLCAweEUyLCAweEE4LCAweEQyLCAweEMyLCAweEE3LCAweEM0LCAweEJGLCAvKiAweEI0LTB4QjcgKi8KKwkweEMxLCAweEY1LCAweEI0LCAweDYzLCAweEE0LCAweDQ2LCAweEI5LCAweEIxLCAvKiAweEI4LTB4QkIgKi8KKwkweEJDLCAweDY0LCAweEE3LCAweEJGLCAweEFFLCAweEM2LCAweEJDLCAweEQ2LCAvKiAweEJDLTB4QkYgKi8KKwkweEJGLCAweDUyLCAweEMwLCAweEY4LCAweEU3LCAweDY0LCAweEJGLCAweEYxLCAvKiAweEMwLTB4QzMgKi8KKwkweEMwLCAweDczLCAweEI3LCAweDc3LCAweEE4LCAweEJGLCAweEJDLCAweDQyLCAvKiAweEM0LTB4QzcgKi8KKwkweENDLCAweEQ4LCAweEFDLCAweDY4LCAweEFDLCAweDc5LCAweEI3LCAweEM4LCAvKiAweEM4LTB4Q0IgKi8KKwkweEFGLCAweDVCLCAweEFGLCAweDY0LCAweEIyLCAweEI4LCAweEFGLCAweEMzLCAvKiAweENDLTB4Q0YgKi8KKwkweEMzLCAweEZFLCAweEE0LCAweEJCLCAweEJDLCAweEFFLCAweEIzLCAweEIwLCAvKiAweEQwLTB4RDMgKi8KKwkweEFELCAweERCLCAweEIxLCAweDVCLCAweEIyLCAweDVGLCAweEJELCAweEZDLCAvKiAweEQ0LTB4RDcgKi8KKwkweEFCLCAweERGLCAweEI3LCAweDU4LCAweEFFLCAweERGLCAweEIyLCAweDc2LCAvKiAweEQ4LTB4REIgKi8KKwkweEI2LCAweEE5LCAweEE3LCAweDUxLCAweEE2LCAweDRGLCAweEJDLCAweDY5LCAvKiAweERDLTB4REYgKi8KKwkweEE5LCAweEY2LCAweEE3LCAweEY1LCAweEIxLCAweEY5LCAweEFBLCAweDY0LCAvKiAweEUwLTB4RTMgKi8KKwkweEIyLCAweDdBLCAweEI1LCAweDY3LCAweEJGLCAweEE5LCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEI4LCAweENDLCAweEE4LCAweEJELCAweEMyLCAweEY3LCAweEIwLCAweENFLCAvKiAweEU4LTB4RUIgKi8KKwkweEI3LCAweEM0LCAweEE3LCAweDVCLCAweEJGLCAweDRELCAweEJGLCAweDVBLCAvKiAweEVDLTB4RUYgKi8KKwkweEM0LCAweEE5LCAweDAwLCAweDAwLCAweEM1LCAweEVDLCAweEM1LCAweEVGLCAvKiAweEYwLTB4RjMgKi8KKwkweEFBLCAweDRDLCAweEIyLCAweDRGLCAweEMxLCAweDdCLCAweEE1LCAweERGLCAvKiAweEY0LTB4RjcgKi8KKwkweEIyLCAweEMxLCAweEIyLCAweEM5LCAweEFBLCAweEFDLCAweEFBLCAweEE1LCAvKiAweEY4LTB4RkIgKi8KKwkweEMzLCAweEQxLCAweEE0LCAweEIwLCAweEFGLCAweEY5LCAweEE4LCAweEVCLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19GQVs1MTJdID0geworCTB4QTQsIDB4QzEsIDB4QUIsIDB4RDcsIDB4QTksIDB4REQsIDB4QkYsIDB4N0QsIC8qIDB4MDAtMHgwMyAqLworCTB4QTYsIDB4NzYsIDB4QUMsIDB4N0QsIDB4QkMsIDB4QzksIDB4QkYsIDB4RTcsIC8qIDB4MDQtMHgwNyAqLworCTB4QTYsIDB4RTYsIDB4QUQsIDB4QjAsIDB4QTgsIDB4QTMsIDB4QjksIDB4RjgsIC8qIDB4MDgtMHgwQiAqLworCTB4QzksIDB4NEEsIDB4REQsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4QjYsIDB4RUYsIDB4MDAsIDB4MDAsIDB4QjQsIDB4QjgsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4RjksIDB4QkQsIDB4REUsIDB4QUYsIDB4NzEsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4QUYsIDB4QUIsIDB4QjIsIDB4QkIsIDB4QkEsIDB4RDYsIC8qIDB4MTgtMHgxQiAqLworCTB4QjksIDB4NzQsIDB4QkEsIDB4RUIsIDB4QTYsIDB4RDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkQsIDB4RDEsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4QjYsIDB4NjgsIDB4QjMsIDB4QTMsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjYsIDB4QkEsIDB4QjksIDB4N0QsIC8qIDB4MjgtMHgyQiAqLworCTB4QzAsIDB4NUQsIDB4QzUsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0ZFWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhBMSwgMHg0QSwgMHhBMSwgMHg1NywgMHgwMCwgMHgwMCwgMHhBMSwgMHg1OSwgLyogMHgzMC0weDMzICovCisJMHhBMSwgMHg1QiwgMHhBMSwgMHg1RiwgMHhBMSwgMHg2MCwgMHhBMSwgMHg2MywgLyogMHgzNC0weDM3ICovCisJMHhBMSwgMHg2NCwgMHhBMSwgMHg2NywgMHhBMSwgMHg2OCwgMHhBMSwgMHg2QiwgLyogMHgzOC0weDNCICovCisJMHhBMSwgMHg2QywgMHhBMSwgMHg2RiwgMHhBMSwgMHg3MCwgMHhBMSwgMHg3MywgLyogMHgzQy0weDNGICovCisJMHhBMSwgMHg3NCwgMHhBMSwgMHg3NywgMHhBMSwgMHg3OCwgMHhBMSwgMHg3QiwgLyogMHg0MC0weDQzICovCisJMHhBMSwgMHg3QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhDNiwgMHhBMSwgMHhDNywgMHhBMSwgMHhDQSwgLyogMHg0OC0weDRCICovCisJMHhBMSwgMHhDQiwgMHhBMSwgMHhDOCwgMHhBMSwgMHhDOSwgMHhBMSwgMHg1QywgLyogMHg0Qy0weDRGICovCisJMHhBMSwgMHg0RCwgMHhBMSwgMHg0RSwgMHhBMSwgMHg0RiwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhBMSwgMHg1MSwgMHhBMSwgMHg1MiwgMHhBMSwgMHg1MywgMHhBMSwgMHg1NCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHg3RCwgMHhBMSwgMHg3RSwgMHhBMSwgMHhBMSwgLyogMHg1OC0weDVCICovCisJMHhBMSwgMHhBMiwgMHhBMSwgMHhBMywgMHhBMSwgMHhBNCwgMHhBMSwgMHhDQywgLyogMHg1Qy0weDVGICovCisJMHhBMSwgMHhDRCwgMHhBMSwgMHhDRSwgMHhBMSwgMHhERSwgMHhBMSwgMHhERiwgLyogMHg2MC0weDYzICovCisJMHhBMSwgMHhFMCwgMHhBMSwgMHhFMSwgMHhBMSwgMHhFMiwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhBMiwgMHg0MiwgMHhBMiwgMHg0QywgMHhBMiwgMHg0RCwgMHhBMiwgMHg0RSwgLyogMHg2OC0weDZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfRkZbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEExLCAweDQ5LCAweEExLCAweEE4LCAweEExLCAweEFELCAvKiAweDAwLTB4MDMgKi8KKwkweEEyLCAweDQzLCAweEEyLCAweDQ4LCAweEExLCAweEFFLCAweEExLCAweEE2LCAvKiAweDA0LTB4MDcgKi8KKwkweEExLCAweDVELCAweEExLCAweDVFLCAweEExLCAweEFGLCAweEExLCAweENGLCAvKiAweDA4LTB4MEIgKi8KKwkweEExLCAweDQxLCAweEExLCAweEQwLCAweEExLCAweDQ0LCAweEExLCAweEZFLCAvKiAweDBDLTB4MEYgKi8KKwkweEEyLCAweEFGLCAweEEyLCAweEIwLCAweEEyLCAweEIxLCAweEEyLCAweEIyLCAvKiAweDEwLTB4MTMgKi8KKwkweEEyLCAweEIzLCAweEEyLCAweEI0LCAweEEyLCAweEI1LCAweEEyLCAweEI2LCAvKiAweDE0LTB4MTcgKi8KKwkweEEyLCAweEI3LCAweEEyLCAweEI4LCAweEExLCAweDQ3LCAweEExLCAweDQ2LCAvKiAweDE4LTB4MUIgKi8KKwkweEExLCAweEQ1LCAweEExLCAweEQ3LCAweEExLCAweEQ2LCAweEExLCAweDQ4LCAvKiAweDFDLTB4MUYgKi8KKwkweEEyLCAweDQ5LCAweEEyLCAweENGLCAweEEyLCAweEQwLCAweEEyLCAweEQxLCAvKiAweDIwLTB4MjMgKi8KKwkweEEyLCAweEQyLCAweEEyLCAweEQzLCAweEEyLCAweEQ0LCAweEEyLCAweEQ1LCAvKiAweDI0LTB4MjcgKi8KKwkweEEyLCAweEQ2LCAweEEyLCAweEQ3LCAweEEyLCAweEQ4LCAweEEyLCAweEQ5LCAvKiAweDI4LTB4MkIgKi8KKwkweEEyLCAweERBLCAweEEyLCAweERCLCAweEEyLCAweERDLCAweEEyLCAweERELCAvKiAweDJDLTB4MkYgKi8KKwkweEEyLCAweERFLCAweEEyLCAweERGLCAweEEyLCAweEUwLCAweEEyLCAweEUxLCAvKiAweDMwLTB4MzMgKi8KKwkweEEyLCAweEUyLCAweEEyLCAweEUzLCAweEEyLCAweEU0LCAweEEyLCAweEU1LCAvKiAweDM0LTB4MzcgKi8KKwkweEEyLCAweEU2LCAweEEyLCAweEU3LCAweEEyLCAweEU4LCAweEExLCAweDY1LCAvKiAweDM4LTB4M0IgKi8KKwkweEEyLCAweDQwLCAweEExLCAweDY2LCAweEExLCAweDczLCAweEExLCAweEM0LCAvKiAweDNDLTB4M0YgKi8KKwkweEExLCAweEE1LCAweEEyLCAweEU5LCAweEEyLCAweEVBLCAweEEyLCAweEVCLCAvKiAweDQwLTB4NDMgKi8KKwkweEEyLCAweEVDLCAweEEyLCAweEVELCAweEEyLCAweEVFLCAweEEyLCAweEVGLCAvKiAweDQ0LTB4NDcgKi8KKwkweEEyLCAweEYwLCAweEEyLCAweEYxLCAweEEyLCAweEYyLCAweEEyLCAweEYzLCAvKiAweDQ4LTB4NEIgKi8KKwkweEEyLCAweEY0LCAweEEyLCAweEY1LCAweEEyLCAweEY2LCAweEEyLCAweEY3LCAvKiAweDRDLTB4NEYgKi8KKwkweEEyLCAweEY4LCAweEEyLCAweEY5LCAweEEyLCAweEZBLCAweEEyLCAweEZCLCAvKiAweDUwLTB4NTMgKi8KKwkweEEyLCAweEZDLCAweEEyLCAweEZELCAweEEyLCAweEZFLCAweEEzLCAweDQwLCAvKiAweDU0LTB4NTcgKi8KKwkweEEzLCAweDQxLCAweEEzLCAweDQyLCAweEEzLCAweDQzLCAweEExLCAweDYxLCAvKiAweDU4LTB4NUIgKi8KKwkweEExLCAweDU1LCAweEExLCAweDYyLCAweEExLCAweEUzLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEExLCAweDRFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweEEyLCAweDQ2LCAweEEyLCAweDQ3LCAweDAwLCAweDAwLCAweEExLCAweEMzLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweEEyLCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJTlVMTCwgICBOVUxMLCAgIHUyY18wMiwgdTJjXzAzLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCXUyY18yMCwgdTJjXzIxLCB1MmNfMjIsIHUyY18yMywgTlVMTCwgICB1MmNfMjUsIHUyY18yNiwgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJdTJjXzMwLCB1MmNfMzEsIHUyY18zMiwgdTJjXzMzLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgdTJjXzRFLCB1MmNfNEYsIAorCXUyY181MCwgdTJjXzUxLCB1MmNfNTIsIHUyY181MywgdTJjXzU0LCB1MmNfNTUsIHUyY181NiwgdTJjXzU3LCAKKwl1MmNfNTgsIHUyY181OSwgdTJjXzVBLCB1MmNfNUIsIHUyY181QywgdTJjXzVELCB1MmNfNUUsIHUyY181RiwgCisJdTJjXzYwLCB1MmNfNjEsIHUyY182MiwgdTJjXzYzLCB1MmNfNjQsIHUyY182NSwgdTJjXzY2LCB1MmNfNjcsIAorCXUyY182OCwgdTJjXzY5LCB1MmNfNkEsIHUyY182QiwgdTJjXzZDLCB1MmNfNkQsIHUyY182RSwgdTJjXzZGLCAKKwl1MmNfNzAsIHUyY183MSwgdTJjXzcyLCB1MmNfNzMsIHUyY183NCwgdTJjXzc1LCB1MmNfNzYsIHUyY183NywgCisJdTJjXzc4LCB1MmNfNzksIHUyY183QSwgdTJjXzdCLCB1MmNfN0MsIHUyY183RCwgdTJjXzdFLCB1MmNfN0YsIAorCXUyY184MCwgdTJjXzgxLCB1MmNfODIsIHUyY184MywgdTJjXzg0LCB1MmNfODUsIHUyY184NiwgdTJjXzg3LCAKKwl1MmNfODgsIHUyY184OSwgdTJjXzhBLCB1MmNfOEIsIHUyY184QywgdTJjXzhELCB1MmNfOEUsIHUyY184RiwgCisJdTJjXzkwLCB1MmNfOTEsIHUyY185MiwgdTJjXzkzLCB1MmNfOTQsIHUyY185NSwgdTJjXzk2LCB1MmNfOTcsIAorCXUyY185OCwgdTJjXzk5LCB1MmNfOUEsIHUyY185QiwgdTJjXzlDLCB1MmNfOUQsIHUyY185RSwgdTJjXzlGLCAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICB1MmNfREMsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgdTJjX0Y5LCB1MmNfRkEsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIHUyY19GRSwgdTJjX0ZGLCB9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg0MC0weDQ3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg0OC0weDRmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg1MC0weDU3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIGludCB1bmkyY2hhcihjb25zdCB3Y2hhcl90IHVuaSwKKwkJCXVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkmMHhGRjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaT4+OCkmMHhGRjsKKwlpbnQgbjsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQpIHsKKwkJaWYgKGJvdW5kbGVuIDw9IDEpCisJCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2wqMl07CisJCW91dFsxXSA9IHVuaTJjaGFyc2V0W2NsKjIrMV07CisJCWlmIChvdXRbMF0gPT0gMHgwMCAmJiBvdXRbMV0gPT0gMHgwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQluID0gMjsKKwl9IGVsc2UgaWYgKGNoPT0wICYmIGNsKSB7CisJCW91dFswXSA9IGNsOworCQluID0gMTsKKwl9CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLAorCQkJd2NoYXJfdCAqdW5pKQoreworCXVuc2lnbmVkIGNoYXIgY2gsIGNsOworCXdjaGFyX3QgKmNoYXJzZXQydW5pOworCWludCBuOworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJaWYgKGJvdW5kbGVuID09IDEpIHsKKwkJKnVuaSA9IHJhd3N0cmluZ1swXTsKKwkJcmV0dXJuIDE7CisJfQorCisJY2ggPSByYXdzdHJpbmdbMF07CisJY2wgPSByYXdzdHJpbmdbMV07CisKKwljaGFyc2V0MnVuaSA9IHBhZ2VfY2hhcnNldDJ1bmlbY2hdOworCWlmIChjaGFyc2V0MnVuaSAmJiBjbCkgeworCQkqdW5pID0gY2hhcnNldDJ1bmlbY2xdOworCQlpZiAoKnVuaSA9PSAweDAwMDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbiA9IDI7CisJfSBlbHNleworCQkqdW5pID0gY2g7CisJCW4gPSAxOworCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAiY3A5NTAiLAorCS5hbGlhcwkJPSAiYmlnNSIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19jcDk1MCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2NwOTUwKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfY3A5NTApCittb2R1bGVfZXhpdChleGl0X25sc19jcDk1MCkKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX0FMSUFTX05MUyhiaWc1KTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfZXVjLWpwLmMgYi9mcy9ubHMvbmxzX2V1Yy1qcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZjEwOGEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2V1Yy1qcC5jCkBAIC0wLDAgKzEsNTgzIEBACisvKgorICogbGludXgvZnMvbmxzX2V1Yy1qcC5jCisgKgorICogQWRkZWQgYE9TRi9KVkMgUmVjb21tZW5kZWQgQ29kZSBTZXQgQ29udmVyc2lvbiBTcGVjaWZpY2F0aW9uCisgKiBiZXR3ZWVuIEphcGFuZXNlIEVVQyBhbmQgU2hpZnQtSklTJyBzdXBwb3J0OiA8aGlyb2Z1bWlAbWFpbC5wYXJrbmV0LmNvLmpwPgorICogKGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yLmpwL2p2Yy9jZGUvc2ppcy1ldWMtZS5odG1sKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSAqcF9ubHM7CisKKyNkZWZpbmUgSVNfU0pJU19MT1dfQllURShsKQkoKDB4NDAgPD0gKGwpKSAmJiAoKGwpIDw9IDB4RkMpICYmICgobCkgIT0gMHg3RikpCisvKiBKSVMgWCAwMjA4IChpbmNsdWRlIE5FQyBzcGVzaWFsIGNoYXJhY3RlcnMpICovCisjZGVmaW5lIElTX1NKSVNfSklTWDAyMDgoaCwgbCkJKCgoKDB4ODEgPD0gKGgpKSAmJiAoKGgpIDw9IDB4OUYpKQlcCisJCQkJIHx8ICgoMHhFMCA8PSAoaCkpICYmICgoaCkgPD0gMHhFQSkpKQlcCisJCQkJICYmIElTX1NKSVNfTE9XX0JZVEUobCkpCisjZGVmaW5lIElTX1NKSVNfSklTWDAyMDFLQU5BKGMpCSgoMHhBMSA8PSAoYykpICYmICgoYykgPD0gMHhERikpCisjZGVmaW5lIElTX1NKSVNfVURDX0xPVyhoLCBsKQkoKCgweEYwIDw9IChoKSkgJiYgKChoKSA8PSAweEY0KSkJXAorCQkJCSAmJiBJU19TSklTX0xPV19CWVRFKGwpKQorI2RlZmluZSBJU19TSklTX1VEQ19ISShoLCBsKQkoKCgweEY1IDw9IChoKSkgJiYgKChoKSA8PSAweEY5KSkJXAorCQkJCSAmJiBJU19TSklTX0xPV19CWVRFKGwpKQorI2RlZmluZSBJU19TSklTX0lCTShoLCBsKQkoKCgweEZBIDw9IChoKSkgJiYgKChoKSA8PSAweEZDKSkJXAorCQkJCSAmJiBJU19TSklTX0xPV19CWVRFKGwpKQorI2RlZmluZSBJU19TSklTX05FQ0lCTShoLCBsKQkoKCgweEVEIDw9IChoKSkgJiYgKChoKSA8PSAweEVFKSkJXAorCQkJCSAmJiBJU19TSklTX0xPV19CWVRFKGwpKQorI2RlZmluZSBNQVBfU0pJUzJFVUMoc2ppc19oaSwgc2ppc19sbywgc2ppc19wLCBldWNfaGksIGV1Y19sbywgZXVjX3ApIHsJCVwKKwlpZiAoKHNqaXNfbG8pID49IDB4OUYpIHsJCQkJCQlcCisJCShldWNfaGkpID0gKHNqaXNfaGkpICogMiAtICgoKHNqaXNfcCkgKiAyIC0gKGV1Y19wKSkgLSAxKTsJXAorCQkoZXVjX2xvKSA9IChzamlzX2xvKSArIDI7CQkJCQlcCisJfSBlbHNlIHsJCQkJCQkJCVwKKwkJKGV1Y19oaSkgPSAoc2ppc19oaSkgKiAyIC0gKChzamlzX3ApICogMiAtIChldWNfcCkpOwkJXAorCQkoZXVjX2xvKSA9IChzamlzX2xvKSArICgoc2ppc19sbykgPj0gMHg3RiA/IDB4NjAgOiAweDYxKTsJXAorCX0JCQkJCQkJCQlcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgU1MyCQkoMHg4RSkJCS8qIFNpbmdsZSBTaGlmdCAyICovCisjZGVmaW5lIFNTMwkJKDB4OEYpCQkvKiBTaW5nbGUgU2hpZnQgMyAqLworI2RlZmluZSBJU19FVUNfQllURShjKQkJKCgweEExIDw9IChjKSkgJiYgKChjKSA8PSAweEZFKSkKKyNkZWZpbmUgSVNfRVVDX0pJU1gwMjA4KGgsIGwpCShJU19FVUNfQllURShoKSAmJiBJU19FVUNfQllURShsKSkKKyNkZWZpbmUgSVNfRVVDX0pJU1gwMjAxS0FOQShoLCBsKQkoKChoKSA9PSBTUzIpICYmICgweEExIDw9IChsKSAmJiAobCkgPD0gMHhERikpCisjZGVmaW5lIElTX0VVQ19VRENfTE9XKGgsIGwpCSgoKDB4RjUgPD0gKGgpKSAmJiAoKGgpIDw9IDB4RkUpKQlcCisJCQkJICYmIElTX0VVQ19CWVRFKGwpKQorI2RlZmluZSBJU19FVUNfVURDX0hJKGgsIGwpCUlTX0VVQ19VRENfTE9XKGgsIGwpIC8qIEczIGJsb2NrICovCisjZGVmaW5lIE1BUF9FVUMyU0pJUyhldWNfaGksIGV1Y19sbywgZXVjX3AsIHNqaXNfaGksIHNqaXNfbG8sIHNqaXNfcCkgewkJXAorCWlmICgoZXVjX2hpKSAmIDEpIHsJCQkJCQkJXAorCQkoc2ppc19oaSkgPSAoZXVjX2hpKSAvIDIgKyAoKHNqaXNfcCkgLSAoZXVjX3ApIC8gMik7CQlcCisJCShzamlzX2xvKSA9IChldWNfbG8pIC0gKChldWNfbG8pID49IDB4RTAgPyAweDYwIDogMHg2MSk7CVwKKwl9IGVsc2UgewkJCQkJCQkJXAorCQkoc2ppc19oaSkgPSAoZXVjX2hpKSAvIDIgKyAoKChzamlzX3ApIC0gKGV1Y19wKSAvIDIpIC0gMSk7CVwKKwkJKHNqaXNfbG8pID0gKGV1Y19sbykgLSAyOwkJCQkJXAorCX0JCQkJCQkJCQlcCit9IHdoaWxlKDApCisKKy8qIFNKSVMgSUJNIGV4dGVuZGVkIGNoYXJhY3RlcnMgdG8gRVVDIG1hcCAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2ppc2libTJldWNfbWFwW11bMl0gPSB7CisJezB4RjMsIDB4RjN9LCB7MHhGMywgMHhGNH0sIHsweEYzLCAweEY1fSwgezB4RjMsIDB4RjZ9LCB7MHhGMywgMHhGN30sCisJezB4RjMsIDB4Rjh9LCB7MHhGMywgMHhGOX0sIHsweEYzLCAweEZBfSwgezB4RjMsIDB4RkJ9LCB7MHhGMywgMHhGQ30sCisJezB4RjMsIDB4RkR9LCB7MHhGMywgMHhGRX0sIHsweEY0LCAweEExfSwgezB4RjQsIDB4QTJ9LCB7MHhGNCwgMHhBM30sCisJezB4RjQsIDB4QTR9LCB7MHhGNCwgMHhBNX0sIHsweEY0LCAweEE2fSwgezB4RjQsIDB4QTd9LCB7MHhGNCwgMHhBOH0sCisJezB4QTIsIDB4Q0N9LCB7MHhBMiwgMHhDM30sIHsweEY0LCAweEE5fSwgezB4RjQsIDB4QUF9LCB7MHhGNCwgMHhBQn0sCisJezB4RjQsIDB4QUN9LCB7MHhGNCwgMHhBRH0sIHsweEEyLCAweEU4fSwgezB4RDQsIDB4RTN9LCB7MHhEQywgMHhERn0sCisJezB4RTQsIDB4RTl9LCB7MHhFMywgMHhGOH0sIHsweEQ5LCAweEExfSwgezB4QjEsIDB4QkJ9LCB7MHhGNCwgMHhBRX0sCisJezB4QzIsIDB4QUR9LCB7MHhDMywgMHhGQ30sIHsweEU0LCAweEQwfSwgezB4QzIsIDB4QkZ9LCB7MHhCQywgMHhGNH0sCisJezB4QjAsIDB4QTl9LCB7MHhCMCwgMHhDOH0sIHsweEY0LCAweEFGfSwgezB4QjAsIDB4RDJ9LCB7MHhCMCwgMHhENH0sCisJezB4QjAsIDB4RTN9LCB7MHhCMCwgMHhFRX0sIHsweEIxLCAweEE3fSwgezB4QjEsIDB4QTN9LCB7MHhCMSwgMHhBQ30sCisJezB4QjEsIDB4QTl9LCB7MHhCMSwgMHhCRX0sIHsweEIxLCAweERGfSwgezB4QjEsIDB4RDh9LCB7MHhCMSwgMHhDOH0sCisJezB4QjEsIDB4RDd9LCB7MHhCMSwgMHhFM30sIHsweEIxLCAweEY0fSwgezB4QjEsIDB4RTF9LCB7MHhCMiwgMHhBM30sCisJezB4RjQsIDB4QjB9LCB7MHhCMiwgMHhCQn0sIHsweEIyLCAweEU2fSwgezB4MDAsIDB4MDB9LCB7MHhCMiwgMHhFRH0sCisJezB4QjIsIDB4RjV9LCB7MHhCMiwgMHhGQ30sIHsweEY0LCAweEIxfSwgezB4QjMsIDB4QjV9LCB7MHhCMywgMHhEOH0sCisJezB4QjMsIDB4REJ9LCB7MHhCMywgMHhFNX0sIHsweEIzLCAweEVFfSwgezB4QjMsIDB4RkJ9LCB7MHhGNCwgMHhCMn0sCisJezB4RjQsIDB4QjN9LCB7MHhCNCwgMHhDMH0sIHsweEI0LCAweEM3fSwgezB4QjQsIDB4RDB9LCB7MHhCNCwgMHhERX0sCisJezB4RjQsIDB4QjR9LCB7MHhCNSwgMHhBQX0sIHsweEY0LCAweEI1fSwgezB4QjUsIDB4QUZ9LCB7MHhCNSwgMHhDNH0sCisJezB4QjUsIDB4RTh9LCB7MHhGNCwgMHhCNn0sIHsweEI3LCAweEMyfSwgezB4QjcsIDB4RTR9LCB7MHhCNywgMHhFOH0sCisJezB4QjcsIDB4RTd9LCB7MHhGNCwgMHhCN30sIHsweEY0LCAweEI4fSwgezB4RjQsIDB4Qjl9LCB7MHhCOCwgMHhDRX0sCisJezB4QjgsIDB4RTF9LCB7MHhCOCwgMHhGNX0sIHsweEI4LCAweEY3fSwgezB4QjgsIDB4Rjh9LCB7MHhCOCwgMHhGQ30sCisJezB4QjksIDB4QUZ9LCB7MHhCOSwgMHhCN30sIHsweEJBLCAweEJFfSwgezB4QkEsIDB4REJ9LCB7MHhDRCwgMHhBQX0sCisJezB4QkEsIDB4RTF9LCB7MHhGNCwgMHhCQX0sIHsweEJBLCAweEVCfSwgezB4QkIsIDB4QjN9LCB7MHhCQiwgMHhCOH0sCisJezB4RjQsIDB4QkJ9LCB7MHhCQiwgMHhDQX0sIHsweEY0LCAweEJDfSwgezB4RjQsIDB4QkR9LCB7MHhCQiwgMHhEMH0sCisJezB4QkIsIDB4REV9LCB7MHhCQiwgMHhGNH0sIHsweEJCLCAweEY1fSwgezB4QkIsIDB4Rjl9LCB7MHhCQywgMHhFNH0sCisJezB4QkMsIDB4RUR9LCB7MHhCQywgMHhGRX0sIHsweEY0LCAweEJFfSwgezB4QkQsIDB4QzJ9LCB7MHhCRCwgMHhFN30sCisJezB4RjQsIDB4QkZ9LCB7MHhCRCwgMHhGMH0sIHsweEJFLCAweEIwfSwgezB4QkUsIDB4QUN9LCB7MHhGNCwgMHhDMH0sCisJezB4QkUsIDB4QjN9LCB7MHhCRSwgMHhCRH0sIHsweEJFLCAweENEfSwgezB4QkUsIDB4Qzl9LCB7MHhCRSwgMHhFNH0sCisJezB4QkYsIDB4QTh9LCB7MHhCRiwgMHhDOX0sIHsweEMwLCAweEM0fSwgezB4QzAsIDB4RTR9LCB7MHhDMCwgMHhGNH0sCisJezB4QzEsIDB4QTZ9LCB7MHhGNCwgMHhDMX0sIHsweEMxLCAweEY1fSwgezB4QzEsIDB4RkN9LCB7MHhGNCwgMHhDMn0sCisJezB4QzEsIDB4Rjh9LCB7MHhDMiwgMHhBQn0sIHsweEMyLCAweEExfSwgezB4QzIsIDB4QTV9LCB7MHhGNCwgMHhDM30sCisJezB4QzIsIDB4Qjh9LCB7MHhDMiwgMHhCQX0sIHsweEY0LCAweEM0fSwgezB4QzIsIDB4QzR9LCB7MHhDMiwgMHhEMn0sCisJezB4QzIsIDB4RDd9LCB7MHhDMiwgMHhEQn0sIHsweEMyLCAweERFfSwgezB4QzIsIDB4RUR9LCB7MHhDMiwgMHhGMH0sCisJezB4RjQsIDB4QzV9LCB7MHhDMywgMHhBMX0sIHsweEMzLCAweEI1fSwgezB4QzMsIDB4Qzl9LCB7MHhDMywgMHhCOX0sCisJezB4RjQsIDB4QzZ9LCB7MHhDMywgMHhEOH0sIHsweEMzLCAweEZFfSwgezB4RjQsIDB4Qzd9LCB7MHhDNCwgMHhDQ30sCisJezB4RjQsIDB4Qzh9LCB7MHhDNCwgMHhEOX0sIHsweEM0LCAweEVBfSwgezB4QzQsIDB4RkR9LCB7MHhGNCwgMHhDOX0sCisJezB4QzUsIDB4QTd9LCB7MHhDNSwgMHhCNX0sIHsweEM1LCAweEI2fSwgezB4RjQsIDB4Q0F9LCB7MHhDNSwgMHhENX0sCisJezB4QzYsIDB4Qjh9LCB7MHhDNiwgMHhEN30sIHsweEM2LCAweEUwfSwgezB4QzYsIDB4RUF9LCB7MHhDNiwgMHhFM30sCisJezB4QzcsIDB4QTF9LCB7MHhDNywgMHhBQn0sIHsweEM3LCAweEM3fSwgezB4QzcsIDB4QzN9LCB7MHhDNywgMHhDQn0sCisJezB4QzcsIDB4Q0Z9LCB7MHhDNywgMHhEOX0sIHsweEY0LCAweENCfSwgezB4RjQsIDB4Q0N9LCB7MHhDNywgMHhFNn0sCisJezB4QzcsIDB4RUV9LCB7MHhDNywgMHhGQ30sIHsweEM3LCAweEVCfSwgezB4QzcsIDB4RjB9LCB7MHhDOCwgMHhCMX0sCisJezB4QzgsIDB4RTV9LCB7MHhDOCwgMHhGOH0sIHsweEM5LCAweEE2fSwgezB4QzksIDB4QUJ9LCB7MHhDOSwgMHhBRH0sCisJezB4RjQsIDB4Q0R9LCB7MHhDOSwgMHhDQX0sIHsweEM5LCAweEQzfSwgezB4QzksIDB4RTl9LCB7MHhDOSwgMHhFM30sCisJezB4QzksIDB4RkN9LCB7MHhDOSwgMHhGNH0sIHsweEM5LCAweEY1fSwgezB4RjQsIDB4Q0V9LCB7MHhDQSwgMHhCM30sCisJezB4Q0EsIDB4QkR9LCB7MHhDQSwgMHhFRn0sIHsweENBLCAweEYxfSwgezB4Q0IsIDB4QUV9LCB7MHhGNCwgMHhDRn0sCisJezB4Q0IsIDB4Q0F9LCB7MHhDQiwgMHhFNn0sIHsweENCLCAweEVBfSwgezB4Q0IsIDB4RjB9LCB7MHhDQiwgMHhGNH0sCisJezB4Q0IsIDB4RUV9LCB7MHhDQywgMHhBNX0sIHsweENCLCAweEY5fSwgezB4Q0MsIDB4QUJ9LCB7MHhDQywgMHhBRX0sCisJezB4Q0MsIDB4QUR9LCB7MHhDQywgMHhCMn0sIHsweENDLCAweEMyfSwgezB4Q0MsIDB4RDB9LCB7MHhDQywgMHhEOX0sCisJezB4RjQsIDB4RDB9LCB7MHhDRCwgMHhCQn0sIHsweEY0LCAweEQxfSwgezB4Q0UsIDB4QkJ9LCB7MHhGNCwgMHhEMn0sCisJezB4Q0UsIDB4QkF9LCB7MHhDRSwgMHhDM30sIHsweEY0LCAweEQzfSwgezB4Q0UsIDB4RjJ9LCB7MHhCMywgMHhERH0sCisJezB4Q0YsIDB4RDV9LCB7MHhDRiwgMHhFMn0sIHsweENGLCAweEU5fSwgezB4Q0YsIDB4RUR9LCB7MHhGNCwgMHhENH0sCisJezB4RjQsIDB4RDV9LCB7MHhGNCwgMHhENn0sIHsweDAwLCAweDAwfSwgezB4RjQsIDB4RDd9LCB7MHhEMCwgMHhFNX0sCisJezB4RjQsIDB4RDh9LCB7MHhEMCwgMHhFOX0sIHsweEQxLCAweEU4fSwgezB4RjQsIDB4RDl9LCB7MHhGNCwgMHhEQX0sCisJezB4RDEsIDB4RUN9LCB7MHhEMiwgMHhCQn0sIHsweEY0LCAweERCfSwgezB4RDMsIDB4RTF9LCB7MHhEMywgMHhFOH0sCisJezB4RDQsIDB4QTd9LCB7MHhGNCwgMHhEQ30sIHsweEY0LCAweEREfSwgezB4RDQsIDB4RDR9LCB7MHhENCwgMHhGMn0sCisJezB4RDUsIDB4QUV9LCB7MHhGNCwgMHhERX0sIHsweEQ3LCAweERFfSwgezB4RjQsIDB4REZ9LCB7MHhEOCwgMHhBMn0sCisJezB4RDgsIDB4Qjd9LCB7MHhEOCwgMHhDMX0sIHsweEQ4LCAweEQxfSwgezB4RDgsIDB4RjR9LCB7MHhEOSwgMHhDNn0sCisJezB4RDksIDB4Qzh9LCB7MHhEOSwgMHhEMX0sIHsweEY0LCAweEUwfSwgezB4RjQsIDB4RTF9LCB7MHhGNCwgMHhFMn0sCisJezB4RjQsIDB4RTN9LCB7MHhGNCwgMHhFNH0sIHsweERDLCAweEQzfSwgezB4REQsIDB4Qzh9LCB7MHhERCwgMHhENH0sCisJezB4REQsIDB4RUF9LCB7MHhERCwgMHhGQX0sIHsweERFLCAweEE0fSwgezB4REUsIDB4QjB9LCB7MHhGNCwgMHhFNX0sCisJezB4REUsIDB4QjV9LCB7MHhERSwgMHhDQn0sIHsweEY0LCAweEU2fSwgezB4REYsIDB4Qjl9LCB7MHhGNCwgMHhFN30sCisJezB4REYsIDB4QzN9LCB7MHhGNCwgMHhFOH0sIHsweEY0LCAweEU5fSwgezB4RTAsIDB4RDl9LCB7MHhGNCwgMHhFQX0sCisJezB4RjQsIDB4RUJ9LCB7MHhFMSwgMHhFMn0sIHsweEY0LCAweEVDfSwgezB4RjQsIDB4RUR9LCB7MHhGNCwgMHhFRX0sCisJezB4RTIsIDB4Qzd9LCB7MHhFMywgMHhBOH0sIHsweEUzLCAweEE2fSwgezB4RTMsIDB4QTl9LCB7MHhFMywgMHhBRn0sCisJezB4RTMsIDB4QjB9LCB7MHhFMywgMHhBQX0sIHsweEUzLCAweEFCfSwgezB4RTMsIDB4QkN9LCB7MHhFMywgMHhDMX0sCisJezB4RTMsIDB4QkZ9LCB7MHhFMywgMHhENX0sIHsweEUzLCAweEQ4fSwgezB4RTMsIDB4RDZ9LCB7MHhFMywgMHhERn0sCisJezB4RTMsIDB4RTN9LCB7MHhFMywgMHhFMX0sIHsweEUzLCAweEQ0fSwgezB4RTMsIDB4RTl9LCB7MHhFNCwgMHhBNn0sCisJezB4RTMsIDB4RjF9LCB7MHhFMywgMHhGMn0sIHsweEU0LCAweENCfSwgezB4RTQsIDB4QzF9LCB7MHhFNCwgMHhDM30sCisJezB4RTQsIDB4QkV9LCB7MHhGNCwgMHhFRn0sIHsweEU0LCAweEMwfSwgezB4RTQsIDB4Qzd9LCB7MHhFNCwgMHhCRn0sCisJezB4RTQsIDB4RTB9LCB7MHhFNCwgMHhERX0sIHsweEU0LCAweEQxfSwgezB4RjQsIDB4RjB9LCB7MHhFNCwgMHhEQ30sCisJezB4RTQsIDB4RDJ9LCB7MHhFNCwgMHhEQn0sIHsweEU0LCAweEQ0fSwgezB4RTQsIDB4RkF9LCB7MHhFNCwgMHhFRn0sCisJezB4RTUsIDB4QjN9LCB7MHhFNSwgMHhCRn0sIHsweEU1LCAweEM5fSwgezB4RTUsIDB4RDB9LCB7MHhFNSwgMHhFMn0sCisJezB4RTUsIDB4RUF9LCB7MHhFNSwgMHhFQn0sIHsweEY0LCAweEYxfSwgezB4RjQsIDB4RjJ9LCB7MHhGNCwgMHhGM30sCisJezB4RTYsIDB4RTh9LCB7MHhFNiwgMHhFRn0sIHsweEU3LCAweEFDfSwgezB4RjQsIDB4RjR9LCB7MHhFNywgMHhBRX0sCisJezB4RjQsIDB4RjV9LCB7MHhFNywgMHhCMX0sIHsweEY0LCAweEY2fSwgezB4RTcsIDB4QjJ9LCB7MHhFOCwgMHhCMX0sCisJezB4RTgsIDB4QjZ9LCB7MHhGNCwgMHhGN30sIHsweEY0LCAweEY4fSwgezB4RTgsIDB4RER9LCB7MHhGNCwgMHhGOX0sCisJezB4RjQsIDB4RkF9LCB7MHhFOSwgMHhEMX0sIHsweEY0LCAweEZCfSwgezB4RTksIDB4RUR9LCB7MHhFQSwgMHhDRH0sCisJezB4RjQsIDB4RkN9LCB7MHhFQSwgMHhEQn0sIHsweEVBLCAweEU2fSwgezB4RUEsIDB4RUF9LCB7MHhFQiwgMHhBNX0sCisJezB4RUIsIDB4RkJ9LCB7MHhFQiwgMHhGQX0sIHsweEY0LCAweEZEfSwgezB4RUMsIDB4RDZ9LCB7MHhGNCwgMHhGRX0sCit9OworCisjZGVmaW5lIElTX0VVQ19JQk0ySklTWDAyMDgoaCwgbCkgXAorCQkoKChoKSA9PSAweEEyICYmIChsKSA9PSAweENDKSB8fCAoKGgpID09IDB4QTIgJiYgKGwpID09IDB4RTgpKQorCisvKiBFVUMgdG8gU0pJUyBJQk0gZXh0ZW5kZWQgY2hhcmFjdGVycyBtYXAgKEczIEpJUyBYIDAyMTIgYmxvY2spICovCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBldWM7CisJdW5zaWduZWQgY2hhciBzamlzWzJdOworfSBldWMyc2ppc2libV9qaXN4MDIxMl9tYXBbXSA9IHsKKwl7MHhBMkMzLCB7MHhGQSwgMHg1NX19LCB7MHhCMEE5LCB7MHhGQSwgMHg2OH19LCB7MHhCMEM4LCB7MHhGQSwgMHg2OX19LAorCXsweEIwRDIsIHsweEZBLCAweDZCfX0sIHsweEIwRDQsIHsweEZBLCAweDZDfX0sIHsweEIwRTMsIHsweEZBLCAweDZEfX0sCisJezB4QjBFRSwgezB4RkEsIDB4NkV9fSwgezB4QjFBMywgezB4RkEsIDB4NzB9fSwgezB4QjFBNywgezB4RkEsIDB4NkZ9fSwKKwl7MHhCMUE5LCB7MHhGQSwgMHg3Mn19LCB7MHhCMUFDLCB7MHhGQSwgMHg3MX19LCB7MHhCMUJCLCB7MHhGQSwgMHg2MX19LAorCXsweEIxQkUsIHsweEZBLCAweDczfX0sIHsweEIxQzgsIHsweEZBLCAweDc2fX0sIHsweEIxRDcsIHsweEZBLCAweDc3fX0sCisJezB4QjFEOCwgezB4RkEsIDB4NzV9fSwgezB4QjFERiwgezB4RkEsIDB4NzR9fSwgezB4QjFFMSwgezB4RkEsIDB4N0F9fSwKKwl7MHhCMUUzLCB7MHhGQSwgMHg3OH19LCB7MHhCMUY0LCB7MHhGQSwgMHg3OX19LCB7MHhCMkEzLCB7MHhGQSwgMHg3Qn19LAorCXsweEIyQkIsIHsweEZBLCAweDdEfX0sIHsweEIyRTYsIHsweEZBLCAweDdFfX0sIHsweEIyRUQsIHsweEZBLCAweDgwfX0sCisJezB4QjJGNSwgezB4RkEsIDB4ODF9fSwgezB4QjJGQywgezB4RkEsIDB4ODJ9fSwgezB4QjNCNSwgezB4RkEsIDB4ODR9fSwKKwl7MHhCM0Q4LCB7MHhGQSwgMHg4NX19LCB7MHhCM0RCLCB7MHhGQSwgMHg4Nn19LCB7MHhCM0RELCB7MHhGQiwgMHg3N319LAorCXsweEIzRTUsIHsweEZBLCAweDg3fX0sIHsweEIzRUUsIHsweEZBLCAweDg4fX0sIHsweEIzRkIsIHsweEZBLCAweDg5fX0sCisJezB4QjRDMCwgezB4RkEsIDB4OEN9fSwgezB4QjRDNywgezB4RkEsIDB4OER9fSwgezB4QjREMCwgezB4RkEsIDB4OEV9fSwKKwl7MHhCNERFLCB7MHhGQSwgMHg4Rn19LCB7MHhCNUFBLCB7MHhGQSwgMHg5MX19LCB7MHhCNUFGLCB7MHhGQSwgMHg5M319LAorCXsweEI1QzQsIHsweEZBLCAweDk0fX0sIHsweEI1RTgsIHsweEZBLCAweDk1fX0sIHsweEI3QzIsIHsweEZBLCAweDk3fX0sCisJezB4QjdFNCwgezB4RkEsIDB4OTh9fSwgezB4QjdFNywgezB4RkEsIDB4OUF9fSwgezB4QjdFOCwgezB4RkEsIDB4OTl9fSwKKwl7MHhCOENFLCB7MHhGQSwgMHg5RX19LCB7MHhCOEUxLCB7MHhGQSwgMHg5Rn19LCB7MHhCOEY1LCB7MHhGQSwgMHhBMH19LAorCXsweEI4RjcsIHsweEZBLCAweEExfX0sIHsweEI4RjgsIHsweEZBLCAweEEyfX0sIHsweEI4RkMsIHsweEZBLCAweEEzfX0sCisJezB4QjlBRiwgezB4RkEsIDB4QTR9fSwgezB4QjlCNywgezB4RkEsIDB4QTV9fSwgezB4QkFCRSwgezB4RkEsIDB4QTZ9fSwKKwl7MHhCQURCLCB7MHhGQSwgMHhBN319LCB7MHhCQUUxLCB7MHhGQSwgMHhBOX19LCB7MHhCQUVCLCB7MHhGQSwgMHhBQn19LAorCXsweEJCQjMsIHsweEZBLCAweEFDfX0sIHsweEJCQjgsIHsweEZBLCAweEFEfX0sIHsweEJCQ0EsIHsweEZBLCAweEFGfX0sCisJezB4QkJEMCwgezB4RkEsIDB4QjJ9fSwgezB4QkJERSwgezB4RkEsIDB4QjN9fSwgezB4QkJGNCwgezB4RkEsIDB4QjR9fSwKKwl7MHhCQkY1LCB7MHhGQSwgMHhCNX19LCB7MHhCQkY5LCB7MHhGQSwgMHhCNn19LCB7MHhCQ0U0LCB7MHhGQSwgMHhCN319LAorCXsweEJDRUQsIHsweEZBLCAweEI4fX0sIHsweEJDRjQsIHsweEZBLCAweDY3fX0sIHsweEJDRkUsIHsweEZBLCAweEI5fX0sCisJezB4QkRDMiwgezB4RkEsIDB4QkJ9fSwgezB4QkRFNywgezB4RkEsIDB4QkN9fSwgezB4QkRGMCwgezB4RkEsIDB4QkV9fSwKKwl7MHhCRUFDLCB7MHhGQSwgMHhDMH19LCB7MHhCRUIwLCB7MHhGQSwgMHhCRn19LCB7MHhCRUIzLCB7MHhGQSwgMHhDMn19LAorCXsweEJFQkQsIHsweEZBLCAweEMzfX0sIHsweEJFQzksIHsweEZBLCAweEM1fX0sIHsweEJFQ0QsIHsweEZBLCAweEM0fX0sCisJezB4QkVFNCwgezB4RkEsIDB4QzZ9fSwgezB4QkZBOCwgezB4RkEsIDB4Qzd9fSwgezB4QkZDOSwgezB4RkEsIDB4Qzh9fSwKKwl7MHhDMEM0LCB7MHhGQSwgMHhDOX19LCB7MHhDMEU0LCB7MHhGQSwgMHhDQX19LCB7MHhDMEY0LCB7MHhGQSwgMHhDQn19LAorCXsweEMxQTYsIHsweEZBLCAweENDfX0sIHsweEMxRjUsIHsweEZBLCAweENFfX0sIHsweEMxRjgsIHsweEZBLCAweEQxfX0sCisJezB4QzFGQywgezB4RkEsIDB4Q0Z9fSwgezB4QzJBMSwgezB4RkEsIDB4RDN9fSwgezB4QzJBNSwgezB4RkEsIDB4RDR9fSwKKwl7MHhDMkFCLCB7MHhGQSwgMHhEMn19LCB7MHhDMkFELCB7MHhGQSwgMHg2M319LCB7MHhDMkI4LCB7MHhGQSwgMHhENn19LAorCXsweEMyQkEsIHsweEZBLCAweEQ3fX0sIHsweEMyQkYsIHsweEZBLCAweDY2fX0sIHsweEMyQzQsIHsweEZBLCAweEQ5fX0sCisJezB4QzJEMiwgezB4RkEsIDB4REF9fSwgezB4QzJENywgezB4RkEsIDB4REJ9fSwgezB4QzJEQiwgezB4RkEsIDB4REN9fSwKKwl7MHhDMkRFLCB7MHhGQSwgMHhERH19LCB7MHhDMkVELCB7MHhGQSwgMHhERX19LCB7MHhDMkYwLCB7MHhGQSwgMHhERn19LAorCXsweEMzQTEsIHsweEZBLCAweEUxfX0sIHsweEMzQjUsIHsweEZBLCAweEUyfX0sIHsweEMzQjksIHsweEZBLCAweEU0fX0sCisJezB4QzNDOSwgezB4RkEsIDB4RTN9fSwgezB4QzNEOCwgezB4RkEsIDB4RTZ9fSwgezB4QzNGQywgezB4RkEsIDB4NjR9fSwKKwl7MHhDM0ZFLCB7MHhGQSwgMHhFN319LCB7MHhDNENDLCB7MHhGQSwgMHhFOX19LCB7MHhDNEQ5LCB7MHhGQSwgMHhFQn19LAorCXsweEM0RUEsIHsweEZBLCAweEVDfX0sIHsweEM0RkQsIHsweEZBLCAweEVEfX0sIHsweEM1QTcsIHsweEZBLCAweEVGfX0sCisJezB4QzVCNSwgezB4RkEsIDB4RjB9fSwgezB4QzVCNiwgezB4RkEsIDB4RjF9fSwgezB4QzVENSwgezB4RkEsIDB4RjN9fSwKKwl7MHhDNkI4LCB7MHhGQSwgMHhGNH19LCB7MHhDNkQ3LCB7MHhGQSwgMHhGNX19LCB7MHhDNkUwLCB7MHhGQSwgMHhGNn19LAorCXsweEM2RTMsIHsweEZBLCAweEY4fX0sIHsweEM2RUEsIHsweEZBLCAweEY3fX0sIHsweEM3QTEsIHsweEZBLCAweEY5fX0sCisJezB4QzdBQiwgezB4RkEsIDB4RkF9fSwgezB4QzdDMywgezB4RkEsIDB4RkN9fSwgezB4QzdDNywgezB4RkEsIDB4RkJ9fSwKKwl7MHhDN0NCLCB7MHhGQiwgMHg0MH19LCB7MHhDN0NGLCB7MHhGQiwgMHg0MX19LCB7MHhDN0Q5LCB7MHhGQiwgMHg0Mn19LAorCXsweEM3RTYsIHsweEZCLCAweDQ1fX0sIHsweEM3RUIsIHsweEZCLCAweDQ4fX0sIHsweEM3RUUsIHsweEZCLCAweDQ2fX0sCisJezB4QzdGMCwgezB4RkIsIDB4NDl9fSwgezB4QzdGQywgezB4RkIsIDB4NDd9fSwgezB4QzhCMSwgezB4RkIsIDB4NEF9fSwKKwl7MHhDOEU1LCB7MHhGQiwgMHg0Qn19LCB7MHhDOEY4LCB7MHhGQiwgMHg0Q319LCB7MHhDOUE2LCB7MHhGQiwgMHg0RH19LAorCXsweEM5QUIsIHsweEZCLCAweDRFfX0sIHsweEM5QUQsIHsweEZCLCAweDRGfX0sIHsweEM5Q0EsIHsweEZCLCAweDUxfX0sCisJezB4QzlEMywgezB4RkIsIDB4NTJ9fSwgezB4QzlFMywgezB4RkIsIDB4NTR9fSwgezB4QzlFOSwgezB4RkIsIDB4NTN9fSwKKwl7MHhDOUY0LCB7MHhGQiwgMHg1Nn19LCB7MHhDOUY1LCB7MHhGQiwgMHg1N319LCB7MHhDOUZDLCB7MHhGQiwgMHg1NX19LAorCXsweENBQjMsIHsweEZCLCAweDU5fX0sIHsweENBQkQsIHsweEZCLCAweDVBfX0sIHsweENBRUYsIHsweEZCLCAweDVCfX0sCisJezB4Q0FGMSwgezB4RkIsIDB4NUN9fSwgezB4Q0JBRSwgezB4RkIsIDB4NUR9fSwgezB4Q0JDQSwgezB4RkIsIDB4NUZ9fSwKKwl7MHhDQkU2LCB7MHhGQiwgMHg2MH19LCB7MHhDQkVBLCB7MHhGQiwgMHg2MX19LCB7MHhDQkVFLCB7MHhGQiwgMHg2NH19LAorCXsweENCRjAsIHsweEZCLCAweDYyfX0sIHsweENCRjQsIHsweEZCLCAweDYzfX0sIHsweENCRjksIHsweEZCLCAweDY2fX0sCisJezB4Q0NBNSwgezB4RkIsIDB4NjV9fSwgezB4Q0NBQiwgezB4RkIsIDB4Njd9fSwgezB4Q0NBRCwgezB4RkIsIDB4Njl9fSwKKwl7MHhDQ0FFLCB7MHhGQiwgMHg2OH19LCB7MHhDQ0IyLCB7MHhGQiwgMHg2QX19LCB7MHhDQ0MyLCB7MHhGQiwgMHg2Qn19LAorCXsweENDRDAsIHsweEZCLCAweDZDfX0sIHsweENDRDksIHsweEZCLCAweDZEfX0sIHsweENEQUEsIHsweEZBLCAweEE4fX0sCisJezB4Q0RCQiwgezB4RkIsIDB4NkZ9fSwgezB4Q0VCQSwgezB4RkIsIDB4NzN9fSwgezB4Q0VCQiwgezB4RkIsIDB4NzF9fSwKKwl7MHhDRUMzLCB7MHhGQiwgMHg3NH19LCB7MHhDRUYyLCB7MHhGQiwgMHg3Nn19LCB7MHhDRkQ1LCB7MHhGQiwgMHg3OH19LAorCXsweENGRTIsIHsweEZCLCAweDc5fX0sIHsweENGRTksIHsweEZCLCAweDdBfX0sIHsweENGRUQsIHsweEZCLCAweDdCfX0sCisJezB4RDBFNSwgezB4RkIsIDB4ODF9fSwgezB4RDBFOSwgezB4RkIsIDB4ODN9fSwgezB4RDFFOCwgezB4RkIsIDB4ODR9fSwKKwl7MHhEMUVDLCB7MHhGQiwgMHg4N319LCB7MHhEMkJCLCB7MHhGQiwgMHg4OH19LCB7MHhEM0UxLCB7MHhGQiwgMHg4QX19LAorCXsweEQzRTgsIHsweEZCLCAweDhCfX0sIHsweEQ0QTcsIHsweEZCLCAweDhDfX0sIHsweEQ0RDQsIHsweEZCLCAweDhGfX0sCisJezB4RDRFMywgezB4RkEsIDB4NUN9fSwgezB4RDRGMiwgezB4RkIsIDB4OTB9fSwgezB4RDVBRSwgezB4RkIsIDB4OTF9fSwKKwl7MHhEN0RFLCB7MHhGQiwgMHg5M319LCB7MHhEOEEyLCB7MHhGQiwgMHg5NX19LCB7MHhEOEI3LCB7MHhGQiwgMHg5Nn19LAorCXsweEQ4QzEsIHsweEZCLCAweDk3fX0sIHsweEQ4RDEsIHsweEZCLCAweDk4fX0sIHsweEQ4RjQsIHsweEZCLCAweDk5fX0sCisJezB4RDlBMSwgezB4RkEsIDB4NjB9fSwgezB4RDlDNiwgezB4RkIsIDB4OUF9fSwgezB4RDlDOCwgezB4RkIsIDB4OUJ9fSwKKwl7MHhEOUQxLCB7MHhGQiwgMHg5Q319LCB7MHhEQ0QzLCB7MHhGQiwgMHhBMn19LCB7MHhEQ0RGLCB7MHhGQSwgMHg1RH19LAorCXsweEREQzgsIHsweEZCLCAweEEzfX0sIHsweERERDQsIHsweEZCLCAweEE0fX0sIHsweERERUEsIHsweEZCLCAweEE1fX0sCisJezB4RERGQSwgezB4RkIsIDB4QTZ9fSwgezB4REVBNCwgezB4RkIsIDB4QTd9fSwgezB4REVCMCwgezB4RkIsIDB4QTh9fSwKKwl7MHhERUI1LCB7MHhGQiwgMHhBQX19LCB7MHhERUNCLCB7MHhGQiwgMHhBQn19LCB7MHhERkI5LCB7MHhGQiwgMHhBRH19LAorCXsweERGQzMsIHsweEZCLCAweEFGfX0sIHsweEUwRDksIHsweEZCLCAweEIyfX0sIHsweEUxRTIsIHsweEZCLCAweEI1fX0sCisJezB4RTJDNywgezB4RkIsIDB4Qjl9fSwgezB4RTNBNiwgezB4RkIsIDB4QkJ9fSwgezB4RTNBOCwgezB4RkIsIDB4QkF9fSwKKwl7MHhFM0E5LCB7MHhGQiwgMHhCQ319LCB7MHhFM0FBLCB7MHhGQiwgMHhCRn19LCB7MHhFM0FCLCB7MHhGQiwgMHhDMH19LAorCXsweEUzQUYsIHsweEZCLCAweEJEfX0sIHsweEUzQjAsIHsweEZCLCAweEJFfX0sIHsweEUzQkMsIHsweEZCLCAweEMxfX0sCisJezB4RTNCRiwgezB4RkIsIDB4QzN9fSwgezB4RTNDMSwgezB4RkIsIDB4QzJ9fSwgezB4RTNENCwgezB4RkIsIDB4Q0F9fSwKKwl7MHhFM0Q1LCB7MHhGQiwgMHhDNH19LCB7MHhFM0Q2LCB7MHhGQiwgMHhDNn19LCB7MHhFM0Q4LCB7MHhGQiwgMHhDNX19LAorCXsweEUzREYsIHsweEZCLCAweEM3fX0sIHsweEUzRTEsIHsweEZCLCAweEM5fX0sIHsweEUzRTMsIHsweEZCLCAweEM4fX0sCisJezB4RTNFOSwgezB4RkIsIDB4Q0J9fSwgezB4RTNGMSwgezB4RkIsIDB4Q0R9fSwgezB4RTNGMiwgezB4RkIsIDB4Q0V9fSwKKwl7MHhFM0Y4LCB7MHhGQSwgMHg1Rn19LCB7MHhFNEE2LCB7MHhGQiwgMHhDQ319LCB7MHhFNEJFLCB7MHhGQiwgMHhEMn19LAorCXsweEU0QkYsIHsweEZCLCAweEQ2fX0sIHsweEU0QzAsIHsweEZCLCAweEQ0fX0sIHsweEU0QzEsIHsweEZCLCAweEQwfX0sCisJezB4RTRDMywgezB4RkIsIDB4RDF9fSwgezB4RTRDNywgezB4RkIsIDB4RDV9fSwgezB4RTRDQiwgezB4RkIsIDB4Q0Z9fSwKKwl7MHhFNEQwLCB7MHhGQSwgMHg2NX19LCB7MHhFNEQxLCB7MHhGQiwgMHhEOX19LCB7MHhFNEQyLCB7MHhGQiwgMHhEQ319LAorCXsweEU0RDQsIHsweEZCLCAweERFfX0sIHsweEU0REIsIHsweEZCLCAweEREfX0sIHsweEU0REMsIHsweEZCLCAweERCfX0sCisJezB4RTRERSwgezB4RkIsIDB4RDh9fSwgezB4RTRFMCwgezB4RkIsIDB4RDd9fSwgezB4RTRFOSwgezB4RkEsIDB4NUV9fSwKKwl7MHhFNEVGLCB7MHhGQiwgMHhFMH19LCB7MHhFNEZBLCB7MHhGQiwgMHhERn19LCB7MHhFNUIzLCB7MHhGQiwgMHhFMX19LAorCXsweEU1QkYsIHsweEZCLCAweEUyfX0sIHsweEU1QzksIHsweEZCLCAweEUzfX0sIHsweEU1RDAsIHsweEZCLCAweEU0fX0sCisJezB4RTVFMiwgezB4RkIsIDB4RTV9fSwgezB4RTVFQSwgezB4RkIsIDB4RTZ9fSwgezB4RTVFQiwgezB4RkIsIDB4RTd9fSwKKwl7MHhFNkU4LCB7MHhGQiwgMHhFQn19LCB7MHhFNkVGLCB7MHhGQiwgMHhFQ319LCB7MHhFN0FDLCB7MHhGQiwgMHhFRH19LAorCXsweEU3QUUsIHsweEZCLCAweEVGfX0sIHsweEU3QjEsIHsweEZCLCAweEYxfX0sIHsweEU3QjIsIHsweEZCLCAweEYzfX0sCisJezB4RThCMSwgezB4RkIsIDB4RjR9fSwgezB4RThCNiwgezB4RkIsIDB4RjV9fSwgezB4RThERCwgezB4RkIsIDB4Rjh9fSwKKwl7MHhFOUQxLCB7MHhGQiwgMHhGQn19LCB7MHhFOUVELCB7MHhGQywgMHg0MH19LCB7MHhFQUNELCB7MHhGQywgMHg0MX19LAorCXsweEVBREIsIHsweEZDLCAweDQzfX0sIHsweEVBRTYsIHsweEZDLCAweDQ0fX0sIHsweEVBRUEsIHsweEZDLCAweDQ1fX0sCisJezB4RUJBNSwgezB4RkMsIDB4NDZ9fSwgezB4RUJGQSwgezB4RkMsIDB4NDh9fSwgezB4RUJGQiwgezB4RkMsIDB4NDd9fSwKKwl7MHhFQ0Q2LCB7MHhGQywgMHg0QX19LAorfTsKKworLyogRVVDIHRvIFNKSVMgSUJNIGV4dGVuZGVkIGNoYXJhY3RlcnMgbWFwIChHMyBVcHBlciBibG9jaykgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGV1YzJzamlzaWJtX2czdXBwZXJfbWFwW11bMl0gPSB7CisJezB4RkEsIDB4NDB9LCB7MHhGQSwgMHg0MX0sIHsweEZBLCAweDQyfSwgezB4RkEsIDB4NDN9LCB7MHhGQSwgMHg0NH0sCisJezB4RkEsIDB4NDV9LCB7MHhGQSwgMHg0Nn0sIHsweEZBLCAweDQ3fSwgezB4RkEsIDB4NDh9LCB7MHhGQSwgMHg0OX0sCisJezB4RkEsIDB4NEF9LCB7MHhGQSwgMHg0Qn0sIHsweEZBLCAweDRDfSwgezB4RkEsIDB4NER9LCB7MHhGQSwgMHg0RX0sCisJezB4RkEsIDB4NEZ9LCB7MHhGQSwgMHg1MH0sIHsweEZBLCAweDUxfSwgezB4RkEsIDB4NTJ9LCB7MHhGQSwgMHg1M30sCisJezB4RkEsIDB4NTZ9LCB7MHhGQSwgMHg1N30sIHsweEZBLCAweDU4fSwgezB4RkEsIDB4NTl9LCB7MHhGQSwgMHg1QX0sCisJezB4RkEsIDB4NjJ9LCB7MHhGQSwgMHg2QX0sIHsweEZBLCAweDdDfSwgezB4RkEsIDB4ODN9LCB7MHhGQSwgMHg4QX0sCisJezB4RkEsIDB4OEJ9LCB7MHhGQSwgMHg5MH0sIHsweEZBLCAweDkyfSwgezB4RkEsIDB4OTZ9LCB7MHhGQSwgMHg5Qn0sCisJezB4RkEsIDB4OUN9LCB7MHhGQSwgMHg5RH0sIHsweEZBLCAweEFBfSwgezB4RkEsIDB4QUV9LCB7MHhGQSwgMHhCMH0sCisJezB4RkEsIDB4QjF9LCB7MHhGQSwgMHhCQX0sIHsweEZBLCAweEJEfSwgezB4RkEsIDB4QzF9LCB7MHhGQSwgMHhDRH0sCisJezB4RkEsIDB4RDB9LCB7MHhGQSwgMHhENX0sIHsweEZBLCAweEQ4fSwgezB4RkEsIDB4RTB9LCB7MHhGQSwgMHhFNX0sCisJezB4RkEsIDB4RTh9LCB7MHhGQSwgMHhFQX0sIHsweEZBLCAweEVFfSwgezB4RkEsIDB4RjJ9LCB7MHhGQiwgMHg0M30sCisJezB4RkIsIDB4NDR9LCB7MHhGQiwgMHg1MH0sIHsweEZCLCAweDU4fSwgezB4RkIsIDB4NUV9LCB7MHhGQiwgMHg2RX0sCisJezB4RkIsIDB4NzB9LCB7MHhGQiwgMHg3Mn0sIHsweEZCLCAweDc1fSwgezB4RkIsIDB4N0N9LCB7MHhGQiwgMHg3RH0sCisJezB4RkIsIDB4N0V9LCB7MHhGQiwgMHg4MH0sIHsweEZCLCAweDgyfSwgezB4RkIsIDB4ODV9LCB7MHhGQiwgMHg4Nn0sCisJezB4RkIsIDB4ODl9LCB7MHhGQiwgMHg4RH0sIHsweEZCLCAweDhFfSwgezB4RkIsIDB4OTJ9LCB7MHhGQiwgMHg5NH0sCisJezB4RkIsIDB4OUR9LCB7MHhGQiwgMHg5RX0sIHsweEZCLCAweDlGfSwgezB4RkIsIDB4QTB9LCB7MHhGQiwgMHhBMX0sCisJezB4RkIsIDB4QTl9LCB7MHhGQiwgMHhBQ30sIHsweEZCLCAweEFFfSwgezB4RkIsIDB4QjB9LCB7MHhGQiwgMHhCMX0sCisJezB4RkIsIDB4QjN9LCB7MHhGQiwgMHhCNH0sIHsweEZCLCAweEI2fSwgezB4RkIsIDB4Qjd9LCB7MHhGQiwgMHhCOH0sCisJezB4RkIsIDB4RDN9LCB7MHhGQiwgMHhEQX0sIHsweEZCLCAweEU4fSwgezB4RkIsIDB4RTl9LCB7MHhGQiwgMHhFQX0sCisJezB4RkIsIDB4RUV9LCB7MHhGQiwgMHhGMH0sIHsweEZCLCAweEYyfSwgezB4RkIsIDB4RjZ9LCB7MHhGQiwgMHhGN30sCisJezB4RkIsIDB4Rjl9LCB7MHhGQiwgMHhGQX0sIHsweEZCLCAweEZDfSwgezB4RkMsIDB4NDJ9LCB7MHhGQywgMHg0OX0sCisJezB4RkMsIDB4NEJ9LAorfTsKKworI2RlZmluZSBNQVBfRUxFTUVOVF9PRihtYXApCShzaXplb2YobWFwKSAvIHNpemVvZihtYXBbMF0pKQorCitzdGF0aWMgaW5saW5lIGludCBzamlzaWJtMmV1Yyh1bnNpZ25lZCBjaGFyICpldWMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgc2ppc19oaSwKKwkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgc2ppc19sbyk7CitzdGF0aWMgaW5saW5lIGludCBldWMyc2ppc2libV9qaXN4MDIxMih1bnNpZ25lZCBjaGFyICpzamlzLCBjb25zdCB1bnNpZ25lZCBjaGFyIGV1Y19oaSwKKwkJCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBldWNfbG8pOworc3RhdGljIGlubGluZSBpbnQgZXVjMnNqaXNpYm1fZzN1cHBlcih1bnNpZ25lZCBjaGFyICpzamlzLCBjb25zdCB1bnNpZ25lZCBjaGFyIGV1Y19oaSwKKwkJCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGV1Y19sbyk7CitzdGF0aWMgaW5saW5lIGludCBldWMyc2ppc2libSh1bnNpZ25lZCBjaGFyICpzamlzLCBjb25zdCB1bnNpZ25lZCBjaGFyIGV1Y19oaSwKKwkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgZXVjX2xvKTsKK3N0YXRpYyBpbmxpbmUgaW50IHNqaXNuZWMyc2ppc2libSh1bnNpZ25lZCBjaGFyICpzamlzaWJtLAorCQkJCSAgY29uc3QgdW5zaWduZWQgY2hhciBzamlzbmVjX2hpLAorCQkJCSAgY29uc3QgdW5zaWduZWQgY2hhciBzamlzbmVjX2xvKTsKKworLyogU0pJUyBJQk0gZXh0ZW5kZWQgY2hhcmFjdGVycyB0byBFVUMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNqaXNpYm0yZXVjKHVuc2lnbmVkIGNoYXIgKmV1YywgY29uc3QgdW5zaWduZWQgY2hhciBzamlzX2hpLAorCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBzamlzX2xvKQoreworCWludCBpbmRleDsKKworCWluZGV4ID0gKChzamlzX2hpIC0gMHhGQSkgKiAoMHhGRCAtIDB4NDApKSArIChzamlzX2xvIC0gMHg0MCk7CisJaWYgKElTX0VVQ19JQk0ySklTWDAyMDgoc2ppc2libTJldWNfbWFwW2luZGV4XVswXSwKKwkJCQlzamlzaWJtMmV1Y19tYXBbaW5kZXhdWzFdKSkgeworCQlldWNbMF0gPSBzamlzaWJtMmV1Y19tYXBbaW5kZXhdWzBdOworCQlldWNbMV0gPSBzamlzaWJtMmV1Y19tYXBbaW5kZXhdWzFdOworCQlyZXR1cm4gMjsKKwl9IGVsc2UgeworCQlldWNbMF0gPSBTUzM7CisJCWV1Y1sxXSA9IHNqaXNpYm0yZXVjX21hcFtpbmRleF1bMF07CisJCWV1Y1syXSA9IHNqaXNpYm0yZXVjX21hcFtpbmRleF1bMV07CisJCXJldHVybiAzOworCX0KK30KKworLyogRVVDIHRvIFNKSVMgSUJNIGV4dGVuZGVkIGNoYXJhY3RlcnMgKEczIEpJUyBYIDAyMTIgYmxvY2spICovCitzdGF0aWMgaW5saW5lIGludCBldWMyc2ppc2libV9qaXN4MDIxMih1bnNpZ25lZCBjaGFyICpzamlzLCBjb25zdCB1bnNpZ25lZCBjaGFyIGV1Y19oaSwKKwkJCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBldWNfbG8pCit7CisJaW50IGluZGV4LCBtaW5faW5kZXgsIG1heF9pbmRleDsKKwl1bnNpZ25lZCBzaG9ydCBldWM7CisKKwltaW5faW5kZXggPSAwOworCW1heF9pbmRleCA9IE1BUF9FTEVNRU5UX09GKGV1YzJzamlzaWJtX2ppc3gwMjEyX21hcCkgLSAxOworCWV1YyA9IChldWNfaGkgPDwgOCkgfCBldWNfbG87CisKKwl3aGlsZSAobWluX2luZGV4IDw9IG1heF9pbmRleCkgeworCQlpbmRleCA9IChtaW5faW5kZXggKyBtYXhfaW5kZXgpIC8gMjsKKwkJaWYgKGV1YyA8IGV1YzJzamlzaWJtX2ppc3gwMjEyX21hcFtpbmRleF0uZXVjKQorCQkJbWF4X2luZGV4ID0gaW5kZXggLSAxOworCQllbHNlCisJCQltaW5faW5kZXggPSBpbmRleCArIDE7CisJCWlmIChldWMgPT0gZXVjMnNqaXNpYm1famlzeDAyMTJfbWFwW2luZGV4XS5ldWMpIHsKKwkJCXNqaXNbMF0gPSBldWMyc2ppc2libV9qaXN4MDIxMl9tYXBbaW5kZXhdLnNqaXNbMF07CisJCQlzamlzWzFdID0gZXVjMnNqaXNpYm1famlzeDAyMTJfbWFwW2luZGV4XS5zamlzWzFdOworCQkJcmV0dXJuIDM7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIEVVQyB0byBTSklTIElCTSBleHRlbmRlZCBjaGFyYWN0ZXJzIChHMyBVcHBlciBibG9jaykgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGV1YzJzamlzaWJtX2czdXBwZXIodW5zaWduZWQgY2hhciAqc2ppcywgY29uc3QgdW5zaWduZWQgY2hhciBldWNfaGksCisJCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBldWNfbG8pCit7CisJaW50IGluZGV4OworCisJaWYgKGV1Y19oaSA9PSAweEYzKQorCQlpbmRleCA9ICgoZXVjX2hpIDw8IDgpIHwgZXVjX2xvKSAtIDB4RjNGMzsKKwllbHNlCisJCWluZGV4ID0gKChldWNfaGkgPDwgOCkgfCBldWNfbG8pIC0gMHhGNEExICsgMTI7CisKKwlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IE1BUF9FTEVNRU5UX09GKGV1YzJzamlzaWJtX2czdXBwZXJfbWFwKSkpCisJCXJldHVybiAwOworCisJc2ppc1swXSA9IGV1YzJzamlzaWJtX2czdXBwZXJfbWFwW2luZGV4XVswXTsKKwlzamlzWzFdID0gZXVjMnNqaXNpYm1fZzN1cHBlcl9tYXBbaW5kZXhdWzFdOworCisJcmV0dXJuIDM7Cit9CisKKy8qIEVVQyB0byBTSklTIElCTSBleHRlbmRlZCBjaGFyYWN0ZXJzIChHMyBibG9jaykgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGV1YzJzamlzaWJtKHVuc2lnbmVkIGNoYXIgKnNqaXMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgZXVjX2hpLAorCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBldWNfbG8pCit7CisJaW50IG47CisKKyNpZiAwCisJaWYgKChldWNfaGkgPT0gMHhBMikgJiYgKGV1Y19sbyA9PSAweENDKSkgeworCQlzamlzWzBdID0gMHhGQTsKKwkJc2ppc1sxXSA9IDB4NTQ7CisJCXJldHVybiAyOworCX0gZWxzZSBpZiAoKGV1Y19oaSA9PSAweEEyKSAmJiAoZXVjX2xvID09IDB4RTgpKSB7CisJCXNqaXNbMF0gPSAweEZBOworCQlzamlzWzFdID0gMHg1QjsKKwkJcmV0dXJuIDI7CisJfQorI2VuZGlmCisJaWYgKChuID0gZXVjMnNqaXNpYm1fZzN1cHBlcihzamlzLCBldWNfaGksIGV1Y19sbykpKSB7CisJCXJldHVybiBuOworCX0gZWxzZSBpZiAoKG4gPSBldWMyc2ppc2libV9qaXN4MDIxMihzamlzLCBldWNfaGksIGV1Y19sbykpKSB7CisJCXJldHVybiBuOworCX0KKworCXJldHVybiAwOworfQorCisvKiBORUMvSUJNIGV4dGVuZGVkIGNoYXJhY3RlcnMgdG8gSUJNIGV4dGVuZGVkIGNoYXJhY3RlcnMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNqaXNuZWMyc2ppc2libSh1bnNpZ25lZCBjaGFyICpzamlzaWJtLAorCQkJCSAgY29uc3QgdW5zaWduZWQgY2hhciBzamlzbmVjX2hpLAorCQkJCSAgY29uc3QgdW5zaWduZWQgY2hhciBzamlzbmVjX2xvKQoreworCWludCBjb3VudDsKKworCWlmICghIElTX1NKSVNfTkVDSUJNKHNqaXNuZWNfaGksIHNqaXNuZWNfbG8pKQorCQlyZXR1cm4gMDsKKworCWlmICgoc2ppc25lY19oaSA9PSAweEVFKSAmJiAoc2ppc25lY19sbyA9PSAweEY5KSkgeworCQlzamlzaWJtWzBdID0gMHg4MTsKKwkJc2ppc2libVsxXSA9IDB4Q0E7CisJCXJldHVybiAyOworCX0KKworCWlmICgoc2ppc25lY19oaSA9PSAweEVFKSAmJiAoc2ppc25lY19sbyA+PSAweEVGKSkgeworCQljb3VudCA9IChzamlzbmVjX2hpIDw8IDggfCBzamlzbmVjX2xvKQorCQkJLSAoc2ppc25lY19sbyA8PSAweEY5ID8gMHhFRUVGIDogKDB4RUVFRiAtIDEwKSk7CisJfSBlbHNlIHsKKwkJY291bnQgPSAoc2ppc25lY19oaSAtIDB4RUQpICogKDB4RkMgLSAweDQwKQorCQkJKyAoc2ppc25lY19sbyAtIDB4NDApICsgKDB4NUMgLSAweDQwKTsKKwkJaWYgKHNqaXNuZWNfbG8gPj0gMHg3RikKKwkJCWNvdW50LS07CisJfQorCisJc2ppc2libVswXSA9IDB4RkEgKyAoY291bnQgLyAoMHhGQyAtIDB4NDApKTsKKwlzamlzaWJtWzFdID0gMHg0MCArIChjb3VudCAlICgweEZDIC0gMHg0MCkpOworCWlmIChzamlzaWJtWzFdID49IDB4N0YpCisJCXNqaXNpYm1bMV0rKzsKKworCXJldHVybiAyOworfQorCitzdGF0aWMgaW50IHVuaTJjaGFyKGNvbnN0IHdjaGFyX3QgdW5pLAorCQkgICAgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJaW50IG47CisKKwlpZiAoIXBfbmxzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKG4gPSBwX25scy0+dW5pMmNoYXIodW5pLCBvdXQsIGJvdW5kbGVuKSkgPCAwKQorCQlyZXR1cm4gbjsKKworCS8qIHRyYW5zbGF0ZSBTSklTIGludG8gRVVDLUpQICovCisJaWYgKG4gPT0gMSkgeworCQlpZiAoSVNfU0pJU19KSVNYMDIwMUtBTkEob3V0WzBdKSkgeworCQkJLyogSklTIFggMDIwMSBLQU5BICovCisJCQlpZiAoYm91bmRsZW4gPCAyKQorCQkJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJCQlvdXRbMV0gPSBvdXRbMF07CisJCQlvdXRbMF0gPSBTUzI7CisJCQlyZXR1cm4gMjsKKwkJfQorCX0gZWxzZSBpZiAobiA9PSAyKSB7CisJCS8qIE5FQy9JQk0gZXh0ZW5kZWQgY2hhcmFjdGVycyB0byBJQk0gZXh0ZW5kZWQgY2hhcmFjdGVycyAqLworCQlzamlzbmVjMnNqaXNpYm0ob3V0LCBvdXRbMF0sIG91dFsxXSk7CisKKwkJaWYgKElTX1NKSVNfVURDX0xPVyhvdXRbMF0sIG91dFsxXSkpIHsKKwkJCS8qIFVzZXIgZGVmaW5lZCBjaGFyYWN0ZXJzIGhhbGYgbG93ICovCisJCQlNQVBfU0pJUzJFVUMob3V0WzBdLCBvdXRbMV0sIDB4RjAsIG91dFswXSwgb3V0WzFdLCAweEY1KTsKKwkJfSBlbHNlIGlmIChJU19TSklTX1VEQ19ISShvdXRbMF0sIG91dFsxXSkpIHsKKwkJCS8qIFVzZXIgZGVmaW5lZCBjaGFyYWN0ZXJzIGhhbGYgaGlnaCAqLworCQkJdW5zaWduZWQgY2hhciBjaCwgY2w7CisKKwkJCWlmIChib3VuZGxlbiA8IDMpCisJCQkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwkJCW4gPSAzOyBjaCA9IG91dFswXTsgY2wgPSBvdXRbMV07CisJCQlvdXRbMF0gPSBTUzM7CisJCQlNQVBfU0pJUzJFVUMoY2gsIGNsLCAweEY1LCBvdXRbMV0sIG91dFsyXSwgMHhGNSk7CisJCX0gZWxzZSBpZiAoSVNfU0pJU19JQk0ob3V0WzBdLCBvdXRbMV0pKSB7CisJCQkvKiBJQk0gZXh0ZW5kZWQgY2hhcmFjdGVycyAqLworCQkJdW5zaWduZWQgY2hhciBldWNbM10sIGk7CisKKwkJCW4gPSBzamlzaWJtMmV1YyhldWMsIG91dFswXSwgb3V0WzFdKTsKKwkJCWlmIChib3VuZGxlbiA8IG4pCisJCQkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJCW91dFtpXSA9IGV1Y1tpXTsKKwkJfSBlbHNlIGlmIChJU19TSklTX0pJU1gwMjA4KG91dFswXSwgb3V0WzFdKSkgeworCQkJLyogSklTIFggMDIwOCAoaW5jbHVkZSBORUMgc3BlY2lhbCBjaGFyYWN0ZXJzKSAqLworCQkJb3V0WzBdID0gKG91dFswXV4weEEwKSoyICsgMHg1RjsKKwkJCWlmIChvdXRbMV0gPiAweDlFKQorCQkJCW91dFswXSsrOworCisJCQlpZiAob3V0WzFdIDwgMHg3RikKKwkJCQlvdXRbMV0gPSBvdXRbMV0gKyAweDYxOworCQkJZWxzZSBpZiAob3V0WzFdIDwgMHg5RikKKwkJCQlvdXRbMV0gPSBvdXRbMV0gKyAweDYwOworCQkJZWxzZQorCQkJCW91dFsxXSA9IG91dFsxXSArIDB4MDI7CisJCX0gZWxzZSB7CisJCQkvKiBJbnZhbGlkIGNoYXJhY3RlcnMgKi8KKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwKKwkJICAgIHdjaGFyX3QgKnVuaSkKK3sKKwl1bnNpZ25lZCBjaGFyIHNqaXNfdGVtcFsyXTsKKwlpbnQgZXVjX29mZnNldCwgbjsKKworCWlmICggIXBfbmxzICkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJLyogdHJhbnNsYXRlIEVVQy1KUCBpbnRvIFNKSVMgKi8KKwlpZiAocmF3c3RyaW5nWzBdID4gMHg3RikgeworCQlpZiAocmF3c3RyaW5nWzBdID09IFNTMykgeworCQkJaWYgKGJvdW5kbGVuIDwgMykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWV1Y19vZmZzZXQgPSAzOworCisJCQlpZiAoSVNfRVVDX1VEQ19ISShyYXdzdHJpbmdbMV0sIHJhd3N0cmluZ1syXSkpIHsKKwkJCQkvKiBVc2VyIGRlZmluZWQgY2hhcmFjdGVycyBoYWxmIGhpZ2ggKi8KKwkJCQlNQVBfRVVDMlNKSVMocmF3c3RyaW5nWzFdLCByYXdzdHJpbmdbMl0sIDB4RjUsCisJCQkJCSAgICAgc2ppc190ZW1wWzBdLCBzamlzX3RlbXBbMV0sIDB4RjUpOworCQkJfSBlbHNlIGlmIChldWMyc2ppc2libShzamlzX3RlbXAscmF3c3RyaW5nWzFdLHJhd3N0cmluZ1syXSkpIHsKKwkJCQkvKiBJQk0gZXh0ZW5kZWQgY2hhcmFjdGVycyAqLworCQkJfSBlbHNlIHsKKwkJCQkvKiBKSVMgWCAwMjEyIGFuZCBJbnZhbGlkIGNoYXJhY3RlcnMqLworCQkJCXJldHVybiAtRUlOVkFMOworCisJCQkJLyogJ0dFVEEnIHdpdGggU0pJUyBjb2RpbmcgKi8KKwkJCQkvKiBzamlzX3RlbXBbMF0gPSAweDgxOyAqLworCQkJCS8qIHNqaXNfdGVtcFsxXSA9IDB4QUM7ICovCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoYm91bmRsZW4gPCAyKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJZXVjX29mZnNldCA9IDI7CisKKwkJCWlmIChJU19FVUNfSklTWDAyMDFLQU5BKHJhd3N0cmluZ1swXSwgcmF3c3RyaW5nWzFdKSkgeworCQkJCS8qIEpJUyBYIDAyMDEgS0FOQSAqLworCQkJCXNqaXNfdGVtcFswXSA9IHJhd3N0cmluZ1sxXTsKKwkJCQlzamlzX3RlbXBbMV0gPSAweDAwOworCQkJfSBlbHNlIGlmIChJU19FVUNfVURDX0xPVyhyYXdzdHJpbmdbMF0sIHJhd3N0cmluZ1sxXSkpIHsKKwkJCQkvKiBVc2VyIGRlZmluZWQgY2hhcmFjdGVycyBoYWxmIGxvdyAqLworCQkJCU1BUF9FVUMyU0pJUyhyYXdzdHJpbmdbMF0sIHJhd3N0cmluZ1sxXSwgMHhGNSwKKwkJCQkJICAgICBzamlzX3RlbXBbMF0sIHNqaXNfdGVtcFsxXSwgMHhGMCk7CisJCQl9IGVsc2UgaWYgKElTX0VVQ19KSVNYMDIwOChyYXdzdHJpbmdbMF0sIHJhd3N0cmluZ1sxXSkpIHsKKwkJCQkvKiBKSVMgWCAwMjA4IChpbmNsdWRlIE5FQyBzcGVzaWFsIGNoYXJhY3RlcnMpICovCisJCQkJc2ppc190ZW1wWzBdID0gKChyYXdzdHJpbmdbMF0tMHg1ZikvMikgXiAweEEwOworCQkJCWlmICghKHJhd3N0cmluZ1swXSAmIDEpKQorCQkJCQlzamlzX3RlbXBbMV0gPSByYXdzdHJpbmdbMV0gLSAweDAyOworCQkJCWVsc2UgaWYgKHJhd3N0cmluZ1sxXSA8IDB4RTApCisJCQkJCXNqaXNfdGVtcFsxXSA9IHJhd3N0cmluZ1sxXSAtIDB4NjE7CisJCQkJZWxzZQorCQkJCQlzamlzX3RlbXBbMV0gPSByYXdzdHJpbmdbMV0gLSAweDYwOworCQkJfSBlbHNlIHsKKwkJCQkvKiBJbnZhbGlkIGNoYXJhY3RlcnMgKi8KKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWV1Y19vZmZzZXQgPSAxOworCisJCS8qIEpJUyBYIDAyMDEgUk9NQUpJICovCisJCXNqaXNfdGVtcFswXSA9IHJhd3N0cmluZ1swXTsKKwkJc2ppc190ZW1wWzFdID0gMHgwMDsKKwl9CisKKwlpZiAoIChuID0gcF9ubHMtPmNoYXIydW5pKHNqaXNfdGVtcCwgc2l6ZW9mKHNqaXNfdGVtcCksIHVuaSkpIDwgMCkKKwkJcmV0dXJuIG47CisKKwlyZXR1cm4gZXVjX29mZnNldDsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAiZXVjLWpwIiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19ldWNfanAodm9pZCkKK3sKKwlwX25scyA9IGxvYWRfbmxzKCJjcDkzMiIpOworCisJaWYgKHBfbmxzKSB7CisJCXRhYmxlLmNoYXJzZXQydXBwZXIgPSBwX25scy0+Y2hhcnNldDJ1cHBlcjsKKwkJdGFibGUuY2hhcnNldDJsb3dlciA9IHBfbmxzLT5jaGFyc2V0Mmxvd2VyOworCQlyZXR1cm4gcmVnaXN0ZXJfbmxzKCZ0YWJsZSk7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sc19ldWNfanAodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworCXVubG9hZF9ubHMocF9ubHMpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19ldWNfanApCittb2R1bGVfZXhpdChleGl0X25sc19ldWNfanApCisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfaXNvODg1OS0xLmMgYi9mcy9ubHMvbmxzX2lzbzg4NTktMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYTJjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2lzbzg4NTktMS5jCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICogbGludXgvZnMvbmxzX2lzbzg4NTktMS5jCisgKgorICogQ2hhcnNldCBpc284ODU5LTEgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDA4MCwgMHgwMDgxLCAweDAwODIsIDB4MDA4MywKKwkweDAwODQsIDB4MDA4NSwgMHgwMDg2LCAweDAwODcsCisJMHgwMDg4LCAweDAwODksIDB4MDA4YSwgMHgwMDhiLAorCTB4MDA4YywgMHgwMDhkLCAweDAwOGUsIDB4MDA4ZiwKKwkvKiAweDkwKi8KKwkweDAwOTAsIDB4MDA5MSwgMHgwMDkyLCAweDAwOTMsCisJMHgwMDk0LCAweDAwOTUsIDB4MDA5NiwgMHgwMDk3LAorCTB4MDA5OCwgMHgwMDk5LCAweDAwOWEsIDB4MDA5YiwKKwkweDAwOWMsIDB4MDA5ZCwgMHgwMDllLCAweDAwOWYsCisJLyogMHhhMCovCisJMHgwMGEwLCAweDAwYTEsIDB4MDBhMiwgMHgwMGEzLAorCTB4MDBhNCwgMHgwMGE1LCAweDAwYTYsIDB4MDBhNywKKwkweDAwYTgsIDB4MDBhOSwgMHgwMGFhLCAweDAwYWIsCisJMHgwMGFjLCAweDAwYWQsIDB4MDBhZSwgMHgwMGFmLAorCS8qIDB4YjAqLworCTB4MDBiMCwgMHgwMGIxLCAweDAwYjIsIDB4MDBiMywKKwkweDAwYjQsIDB4MDBiNSwgMHgwMGI2LCAweDAwYjcsCisJMHgwMGI4LCAweDAwYjksIDB4MDBiYSwgMHgwMGJiLAorCTB4MDBiYywgMHgwMGJkLCAweDAwYmUsIDB4MDBiZiwKKwkvKiAweGMwKi8KKwkweDAwYzAsIDB4MDBjMSwgMHgwMGMyLCAweDAwYzMsCisJMHgwMGM0LCAweDAwYzUsIDB4MDBjNiwgMHgwMGM3LAorCTB4MDBjOCwgMHgwMGM5LCAweDAwY2EsIDB4MDBjYiwKKwkweDAwY2MsIDB4MDBjZCwgMHgwMGNlLCAweDAwY2YsCisJLyogMHhkMCovCisJMHgwMGQwLCAweDAwZDEsIDB4MDBkMiwgMHgwMGQzLAorCTB4MDBkNCwgMHgwMGQ1LCAweDAwZDYsIDB4MDBkNywKKwkweDAwZDgsIDB4MDBkOSwgMHgwMGRhLCAweDAwZGIsCisJMHgwMGRjLCAweDAwZGQsIDB4MDBkZSwgMHgwMGRmLAorCS8qIDB4ZTAqLworCTB4MDBlMCwgMHgwMGUxLCAweDAwZTIsIDB4MDBlMywKKwkweDAwZTQsIDB4MDBlNSwgMHgwMGU2LCAweDAwZTcsCisJMHgwMGU4LCAweDAwZTksIDB4MDBlYSwgMHgwMGViLAorCTB4MDBlYywgMHgwMGVkLCAweDAwZWUsIDB4MDBlZiwKKwkvKiAweGYwKi8KKwkweDAwZjAsIDB4MDBmMSwgMHgwMGYyLCAweDAwZjMsCisJMHgwMGY0LCAweDAwZjUsIDB4MDBmNiwgMHgwMGY3LAorCTB4MDBmOCwgMHgwMGY5LCAweDAwZmEsIDB4MDBmYiwKKwkweDAwZmMsIDB4MDBmZCwgMHgwMGZlLCAweDAwZmYsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg0MC0weDQ3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg0OC0weDRmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg1MC0weDU3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGMwLTB4YzcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4MDAsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4ZTAtMHhlNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4MDAsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSAmIDB4MDBmZjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaSAmIDB4ZmYwMCkgPj4gODsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXVuaTJjaGFyc2V0ID0gcGFnZV91bmkyY2hhcnNldFtjaF07CisJaWYgKHVuaTJjaGFyc2V0ICYmIHVuaTJjaGFyc2V0W2NsXSkKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2xdOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKwkqdW5pID0gY2hhcnNldDJ1bmlbKnJhd3N0cmluZ107CisJaWYgKCp1bmkgPT0gMHgwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAiaXNvODg1OS0xIiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2lzbzg4NTlfMSh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2lzbzg4NTlfMSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2lzbzg4NTlfMSkKK21vZHVsZV9leGl0KGV4aXRfbmxzX2lzbzg4NTlfMSkKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19pc284ODU5LTEzLmMgYi9mcy9ubHMvbmxzX2lzbzg4NTktMTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTQ3MDM1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19pc284ODU5LTEzLmMKQEAgLTAsMCArMSwyODYgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfaXNvODg1OS0xMy5jCisgKgorICogQ2hhcnNldCBpc284ODU5LTEzIHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIFRoZSBVbmljb2RlIHRvIGNoYXJzZXQgdGFibGUgaGFzIG9ubHkgZXhhY3QgbWFwcGluZ3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGNoYXJzZXQydW5pWzI1Nl0gPSB7CisJLyogMHgwMCovCisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLAorCTB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsCisJMHgwMDBjLCAweDAwMGQsIDB4MDAwZSwgMHgwMDBmLAorCS8qIDB4MTAqLworCTB4MDAxMCwgMHgwMDExLCAweDAwMTIsIDB4MDAxMywKKwkweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisJMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLAorCTB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwKKwkvKiAweDIwKi8KKwkweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsCisJMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorCTB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwKKwkweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisJLyogMHgzMCovCisJMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLAorCTB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKwkweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsCisJMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorCS8qIDB4NDAqLworCTB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywKKwkweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisJMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLAorCTB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKwkvKiAweDUwKi8KKwkweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsCisJMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwKKwkweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisJLyogMHg2MCovCisJMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAorCTB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKwkweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsCisJMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLAorCS8qIDB4NzAqLworCTB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywKKwkweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisJMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLAorCTB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDA3ZiwKKwkvKiAweDgwKi8KKwkweDAwODAsIDB4MDA4MSwgMHgwMDgyLCAweDAwODMsCisJMHgwMDg0LCAweDAwODUsIDB4MDA4NiwgMHgwMDg3LAorCTB4MDA4OCwgMHgwMDg5LCAweDAwOGEsIDB4MDA4YiwKKwkweDAwOGMsIDB4MDA4ZCwgMHgwMDhlLCAweDAwOGYsCisJLyogMHg5MCovCisJMHgwMDkwLCAweDAwOTEsIDB4MDA5MiwgMHgwMDkzLAorCTB4MDA5NCwgMHgwMDk1LCAweDAwOTYsIDB4MDA5NywKKwkweDAwOTgsIDB4MDA5OSwgMHgwMDlhLCAweDAwOWIsCisJMHgwMDljLCAweDAwOWQsIDB4MDA5ZSwgMHgwMDlmLAorCS8qIDB4YTAqLworCTB4MDBhMCwgMHgyMDFkLCAweDAwYTIsIDB4MDBhMywKKwkweDAwYTQsIDB4MjAxZSwgMHgwMGE2LCAweDAwYTcsCisJMHgwMGQ4LCAweDAwYTksIDB4MDE1NiwgMHgwMGFiLAorCTB4MDBhYywgMHgwMGFkLCAweDAwYWUsIDB4MDBjNiwKKwkvKiAweGIwKi8KKwkweDAwYjAsIDB4MDBiMSwgMHgwMGIyLCAweDAwYjMsCisJMHgyMDFjLCAweDAwYjUsIDB4MDBiNiwgMHgwMGI3LAorCTB4MDBmOCwgMHgwMGI5LCAweDAxNTcsIDB4MDBiYiwKKwkweDAwYmMsIDB4MDBiZCwgMHgwMGJlLCAweDAwZTYsCisJLyogMHhjMCovCisJMHgwMTA0LCAweDAxMmUsIDB4MDEwMCwgMHgwMTA2LAorCTB4MDBjNCwgMHgwMGM1LCAweDAxMTgsIDB4MDExMiwKKwkweDAxMGMsIDB4MDBjOSwgMHgwMTc5LCAweDAxMTYsCisJMHgwMTIyLCAweDAxMzYsIDB4MDEyYSwgMHgwMTNiLAorCS8qIDB4ZDAqLworCTB4MDE2MCwgMHgwMTQzLCAweDAxNDUsIDB4MDBkMywKKwkweDAxNGMsIDB4MDBkNSwgMHgwMGQ2LCAweDAwZDcsCisJMHgwMTcyLCAweDAxNDEsIDB4MDE1YSwgMHgwMTZhLAorCTB4MDBkYywgMHgwMTdiLCAweDAxN2QsIDB4MDBkZiwKKwkvKiAweGUwKi8KKwkweDAxMDUsIDB4MDEyZiwgMHgwMTAxLCAweDAxMDcsCisJMHgwMGU0LCAweDAwZTUsIDB4MDExOSwgMHgwMTEzLAorCTB4MDEwZCwgMHgwMGU5LCAweDAxN2EsIDB4MDExNywKKwkweDAxMjMsIDB4MDEzNywgMHgwMTJiLCAweDAxM2MsCisJLyogMHhmMCovCisJMHgwMTYxLCAweDAxNDQsIDB4MDE0NiwgMHgwMGYzLAorCTB4MDE0ZCwgMHgwMGY1LCAweDAwZjYsIDB4MDBmNywKKwkweDAxNzMsIDB4MDE0MiwgMHgwMTViLCAweDAxNmIsCisJMHgwMGZjLCAweDAxN2MsIDB4MDE3ZSwgMHgyMDE5LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweDAwLCAweGEyLCAweGEzLCAweGE0LCAweDAwLCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweGE5LCAweDAwLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweDAwLCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweGI5LCAweDAwLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGM0LCAweGM1LCAweGFmLCAweDAwLCAvKiAweGMwLTB4YzcgKi8KKwkweDAwLCAweGM5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGQzLCAweDAwLCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGE4LCAweDAwLCAweDAwLCAweDAwLCAweGRjLCAweDAwLCAweDAwLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGU0LCAweGU1LCAweGJmLCAweDAwLCAvKiAweGUwLTB4ZTcgKi8KKwkweDAwLCAweGU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGU4LTB4ZWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGYzLCAweDAwLCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGI4LCAweDAwLCAweDAwLCAweDAwLCAweGZjLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMVsyNTZdID0geworCTB4YzIsIDB4ZTIsIDB4MDAsIDB4MDAsIDB4YzAsIDB4ZTAsIDB4YzMsIDB4ZTMsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzgsIDB4ZTgsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4YzcsIDB4ZTcsIDB4MDAsIDB4MDAsIDB4Y2IsIDB4ZWIsIC8qIDB4MTAtMHgxNyAqLworCTB4YzYsIDB4ZTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4Y2MsIDB4ZWMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4Y2UsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4YzEsIDB4ZTEsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Y2QsIDB4ZWQsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4Y2YsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4ZDksIDB4ZjksIDB4ZDEsIDB4ZjEsIDB4ZDIsIDB4ZjIsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZDQsIDB4ZjQsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YmEsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4ZGEsIDB4ZmEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4ZDAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4ZGIsIDB4ZmIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4ZDgsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4Y2EsIDB4ZWEsIDB4ZGQsIDB4ZmQsIDB4ZGUsIDB4ZmUsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHhiNCwgMHhhMSwgMHhhNSwgMHgwMCwgLyogMHgxOC0weDFmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFnZV91bmkyY2hhcnNldFsyNTZdID0geworCXBhZ2UwMCwgcGFnZTAxLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCSAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCSAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCSAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCXBhZ2UyMCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhiMSwgMHhhMiwgMHhiMywgMHhhNCwgMHhiNSwgMHhiNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhhZCwgMHhiZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZiwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhjMC0weGM3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhjOC0weGNmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGExLCAweGIyLCAweGEzLCAweGI0LCAweGE1LCAweGE2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGJkLCAweGFlLCAweGJkLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImlzbzg4NTktMTMiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfaXNvODg1OV8xMyh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2lzbzg4NTlfMTModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19pc284ODU5XzEzKQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfaXNvODg1OV8xMykKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19pc284ODU5LTE0LmMgYi9mcy9ubHMvbmxzX2lzbzg4NTktMTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzYyOGQwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19pc284ODU5LTE0LmMKQEAgLTAsMCArMSwzNDIgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfaXNvODg1OS0xNC5jCisgKgorICogQ2hhcnNldCBpc284ODU5LTE0IHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0IHRhYmxlCisgKiBwcm92aWRlZCBieSB0aGUgVW5pY29kZSBPcmdhbmlzYXRpb24gYXQKKyAqIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICoKKyAqIFJoeXMgSm9uZXMsIFN3YW5zZWEgVW5pdmVyc2l0eSBDb21wdXRlciBTb2NpZXR5CisgKiByaHlzQHN1Y3Muc3dhbi5hYy51aworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywgCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LCAKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsIAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwgCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLCAKKwkweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsIAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwgCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLCAKKwkvKiAweDIwKi8KKwkweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywgCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAKKwkweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsIAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAKKwkweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwgCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAKKwkweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwgCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLCAKKwkvKiAweDUwKi8KKwkweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLCAKKwkweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsIAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAKKwkweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsIAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwgCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAKKwkweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwgCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLCAKKwkvKiAweDgwKi8KKwkweDAwODAsIDB4MDA4MSwgMHgwMDgyLCAweDAwODMsCisJMHgwMDg0LCAweDAwODUsIDB4MDA4NiwgMHgwMDg3LAorCTB4MDA4OCwgMHgwMDg5LCAweDAwOGEsIDB4MDA4YiwKKwkweDAwOGMsIDB4MDA4ZCwgMHgwMDhlLCAweDAwOGYsCisJLyogMHg5MCovCisJMHgwMDkwLCAweDAwOTEsIDB4MDA5MiwgMHgwMDkzLAorCTB4MDA5NCwgMHgwMDk1LCAweDAwOTYsIDB4MDA5NywKKwkweDAwOTgsIDB4MDA5OSwgMHgwMDlhLCAweDAwOWIsCisJMHgwMDljLCAweDAwOWQsIDB4MDA5ZSwgMHgwMDlmLAorCS8qIDB4YTAqLworCTB4MDBhMCwgMHgxZTAyLCAweDFlMDMsIDB4MDBhMywgCisJMHgwMTBhLCAweDAxMGIsIDB4MWUwYSwgMHgwMGE3LCAKKwkweDFlODAsIDB4MDBhOSwgMHgxZTgyLCAweDFlMGIsIAorCTB4MWVmMiwgMHgwMGFkLCAweDAwYWUsIDB4MDE3OCwgCisJLyogMHhiMCovCisJMHgxZTFlLCAweDFlMWYsIDB4MDEyMCwgMHgwMTIxLCAKKwkweDFlNDAsIDB4MWU0MSwgMHgwMGI2LCAweDFlNTYsIAorCTB4MWU4MSwgMHgxZTU3LCAweDFlODMsIDB4MWU2MCwgCisJMHgxZWYzLCAweDFlODQsIDB4MWU4NSwgMHgxZTYxLCAKKwkvKiAweGMwKi8KKwkweDAwYzAsIDB4MDBjMSwgMHgwMGMyLCAweDAwYzMsIAorCTB4MDBjNCwgMHgwMGM1LCAweDAwYzYsIDB4MDBjNywgCisJMHgwMGM4LCAweDAwYzksIDB4MDBjYSwgMHgwMGNiLCAKKwkweDAwY2MsIDB4MDBjZCwgMHgwMGNlLCAweDAwY2YsIAorCS8qIDB4ZDAqLworCTB4MDE3NCwgMHgwMGQxLCAweDAwZDIsIDB4MDBkMywgCisJMHgwMGQ0LCAweDAwZDUsIDB4MDBkNiwgMHgxZTZhLCAKKwkweDAwZDgsIDB4MDBkOSwgMHgwMGRhLCAweDAwZGIsIAorCTB4MDBkYywgMHgwMGRkLCAweDAxNzYsIDB4MDBkZiwgCisJLyogMHhlMCovCisJMHgwMGUwLCAweDAwZTEsIDB4MDBlMiwgMHgwMGUzLCAKKwkweDAwZTQsIDB4MDBlNSwgMHgwMGU2LCAweDAwZTcsIAorCTB4MDBlOCwgMHgwMGU5LCAweDAwZWEsIDB4MDBlYiwgCisJMHgwMGVjLCAweDAwZWQsIDB4MDBlZSwgMHgwMGVmLCAKKwkvKiAweGYwKi8KKwkweDAxNzUsIDB4MDBmMSwgMHgwMGYyLCAweDAwZjMsIAorCTB4MDBmNCwgMHgwMGY1LCAweDAwZjYsIDB4MWU2YiwgCisJMHgwMGY4LCAweDAwZjksIDB4MDBmYSwgMHgwMGZiLCAKKwkweDAwZmMsIDB4MDBmZCwgMHgwMTc3LCAweDAwZmYsIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweDAwLCAweDAwLCAweGEzLCAweDAwLCAweDAwLCAweDAwLCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweGE5LCAweDAwLCAweDAwLCAweDAwLCAweGFkLCAweGFlLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI2LCAweDAwLCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweDAwLCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweDAwLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweDAwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweDAwLCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweDAwLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMVsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4YTEsIDB4YTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4YTYsIDB4YWIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjAsIDB4YjEsIC8qIDB4MTgtMHgxZiAqLworCTB4YjIsIDB4YjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4YjQsIDB4YjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjcsIDB4YjksIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4YmIsIDB4YmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4ZDcsIDB4ZjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZDAsIDB4ZjAsIDB4ZGUsIDB4ZmUsIC8qIDB4NzAtMHg3NyAqLworCTB4YWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCQorCTB4YTgsIDB4YjgsIDB4YWEsIDB4YmEsIDB4YmQsIDB4YmUsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZDAtMHhkNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZDgtMHhkZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZTAtMHhlNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZTgtMHhlZiAqLworCTB4MDAsIDB4MDAsIDB4YWMsIDB4YmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZjAtMHhmNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTFlWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHhhMSwgMHhhMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhhNiwgMHhhYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHhiMSwgLyogMHgxOC0weDFmICovCisJMHhiMiwgMHhiMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHhiNCwgMHhiNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNywgMHhiOSwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHhiYiwgMHhiZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhkNywgMHhmNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkMCwgMHhmMCwgMHhkZSwgMHhmZSwgLyogMHg3MC0weDc3ICovCisJMHhhZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweGE4LCAweGI4LCAweGFhLCAweGJhLCAweGJkLCAweGJlLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGMwLTB4YzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQwLTB4ZDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGUwLTB4ZTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGU4LTB4ZWYgKi8KKwkweDAwLCAweDAwLCAweGFjLCAweGJjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGYwLTB4ZjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLAlwYWdlMDEsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCisKKwlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAorCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCXBhZ2UxZSwJTlVMTCwKKworCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCisJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTIsIDB4YTIsIDB4YTMsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YjgsIDB4YTksIDB4YmEsIDB4YWIsIDB4YmMsIDB4YWQsIDB4YWUsIDB4ZmYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjEsIDB4YjEsIDB4YjMsIDB4YjMsIDB4YjUsIDB4YjUsIDB4YjYsIDB4YjksIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmYsIDB4YmMsIDB4YmUsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4YzAtMHhjNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4YzgtMHhjZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMSwgMHhhMywgMHhhNiwgMHhhNiwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhNiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMCwgMHhiMiwgMHhiMiwgMHhiNCwgMHhiNCwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhhOCwgMHhiNywgMHhhYSwgMHhiYiwgMHhhYywgMHhiZCwgMHhiZCwgMHhiYiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhlMC0weGU3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhlOC0weGVmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhmMC0weGY3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhhZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJpc284ODU5LTE0IiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2lzbzg4NTlfMTQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sc19pc284ODU5XzE0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfaXNvODg1OV8xNCkKK21vZHVsZV9leGl0KGV4aXRfbmxzX2lzbzg4NTlfMTQpCisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfaXNvODg1OS0xNS5jIGIvZnMvbmxzL25sc19pc284ODU5LTE1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiOTI0YgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfaXNvODg1OS0xNS5jCkBAIC0wLDAgKzEsMzA4IEBACisvKgorICogbGludXgvZnMvbmxzX2lzbzg4NTktMTUuYworICoKKyAqIENoYXJzZXQgaXNvODg1OS0xNSB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwMDgwLCAweDAwODEsIDB4MDA4MiwgMHgwMDgzLAorCTB4MDA4NCwgMHgwMDg1LCAweDAwODYsIDB4MDA4NywKKwkweDAwODgsIDB4MDA4OSwgMHgwMDhhLCAweDAwOGIsCisJMHgwMDhjLCAweDAwOGQsIDB4MDA4ZSwgMHgwMDhmLAorCS8qIDB4OTAqLworCTB4MDA5MCwgMHgwMDkxLCAweDAwOTIsIDB4MDA5MywKKwkweDAwOTQsIDB4MDA5NSwgMHgwMDk2LCAweDAwOTcsCisJMHgwMDk4LCAweDAwOTksIDB4MDA5YSwgMHgwMDliLAorCTB4MDA5YywgMHgwMDlkLCAweDAwOWUsIDB4MDA5ZiwKKwkvKiAweGEwKi8KKwkweDAwYTAsIDB4MDBhMSwgMHgwMGEyLCAweDAwYTMsCisJMHgyMGFjLCAweDAwYTUsIDB4MDE2MCwgMHgwMGE3LAorCTB4MDE2MSwgMHgwMGE5LCAweDAwYWEsIDB4MDBhYiwKKwkweDAwYWMsIDB4MDBhZCwgMHgwMGFlLCAweDAwYWYsCisJLyogMHhiMCovCisJMHgwMGIwLCAweDAwYjEsIDB4MDBiMiwgMHgwMGIzLAorCTB4MDE3ZCwgMHgwMGI1LCAweDAwYjYsIDB4MDBiNywKKwkweDAxN2UsIDB4MDBiOSwgMHgwMGJhLCAweDAwYmIsCisJMHgwMTUyLCAweDAxNTMsIDB4MDE3OCwgMHgwMGJmLAorCS8qIDB4YzAqLworCTB4MDBjMCwgMHgwMGMxLCAweDAwYzIsIDB4MDBjMywKKwkweDAwYzQsIDB4MDBjNSwgMHgwMGM2LCAweDAwYzcsCisJMHgwMGM4LCAweDAwYzksIDB4MDBjYSwgMHgwMGNiLAorCTB4MDBjYywgMHgwMGNkLCAweDAwY2UsIDB4MDBjZiwKKwkvKiAweGQwKi8KKwkweDAwZDAsIDB4MDBkMSwgMHgwMGQyLCAweDAwZDMsCisJMHgwMGQ0LCAweDAwZDUsIDB4MDBkNiwgMHgwMGQ3LAorCTB4MDBkOCwgMHgwMGQ5LCAweDAwZGEsIDB4MDBkYiwKKwkweDAwZGMsIDB4MDBkZCwgMHgwMGRlLCAweDAwZGYsCisJLyogMHhlMCovCisJMHgwMGUwLCAweDAwZTEsIDB4MDBlMiwgMHgwMGUzLAorCTB4MDBlNCwgMHgwMGU1LCAweDAwZTYsIDB4MDBlNywKKwkweDAwZTgsIDB4MDBlOSwgMHgwMGVhLCAweDAwZWIsCisJMHgwMGVjLCAweDAwZWQsIDB4MDBlZSwgMHgwMGVmLAorCS8qIDB4ZjAqLworCTB4MDBmMCwgMHgwMGYxLCAweDAwZjIsIDB4MDBmMywKKwkweDAwZjQsIDB4MDBmNSwgMHgwMGY2LCAweDAwZjcsCisJMHgwMGY4LCAweDAwZjksIDB4MDBmYSwgMHgwMGZiLAorCTB4MDBmYywgMHgwMGZkLCAweDAwZmUsIDB4MDBmZiwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHgwMCwgMHhhNSwgMHgwMCwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHgwMCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHhiOSwgMHhiYSwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDFbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweGJjLCAweGJkLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweGE2LCAweGE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweGJlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI0LCAweGI4LCAweDAwLCAvKiAweDc4LTB4N2YgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMFsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFnZV91bmkyY2hhcnNldFsyNTZdID0geworCXBhZ2UwMCwgcGFnZTAxLAlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAorCisJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwKKwlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAorCisJcGFnZTIwLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAorCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg0MC0weDQ3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg0OC0weDRmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg1MC0weDU3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE4LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI4LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJkLCAweGJkLCAweGZmLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGMwLTB4YzcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTYsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4MDAsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjQsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmMsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4ZTAtMHhlNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4YmUsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSAmIDB4MDBmZjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaSAmIDB4ZmYwMCkgPj4gODsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXVuaTJjaGFyc2V0ID0gcGFnZV91bmkyY2hhcnNldFtjaF07CisJaWYgKHVuaTJjaGFyc2V0ICYmIHVuaTJjaGFyc2V0W2NsXSkKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2xdOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKwkqdW5pID0gY2hhcnNldDJ1bmlbKnJhd3N0cmluZ107CisJaWYgKCp1bmkgPT0gMHgwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAiaXNvODg1OS0xNSIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19pc284ODU5XzE1KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfaXNvODg1OV8xNSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2lzbzg4NTlfMTUpCittb2R1bGVfZXhpdChleGl0X25sc19pc284ODU5XzE1KQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2lzbzg4NTktMi5jIGIvZnMvbmxzL25sc19pc284ODU5LTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzI1MjhhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19pc284ODU5LTIuYwpAQCAtMCwwICsxLDMwOSBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19pc284ODU5LTIuYworICoKKyAqIENoYXJzZXQgaXNvODg1OS0yIHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIFVuaWNvZGUgYW5kIGNoYXJzZXQKKyAqIHRhYmxlcyBmcm9tIHRoZSBVbmljb2RlIE9yZ2FuaXphdGlvbiAod3d3LnVuaWNvZGUub3JnKS4KKyAqIFRoZSBVbmljb2RlIHRvIGNoYXJzZXQgdGFibGUgaGFzIG9ubHkgZXhhY3QgbWFwcGluZ3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGNoYXJzZXQydW5pWzI1Nl0gPSB7CisJLyogMHgwMCovCisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLAorCTB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsCisJMHgwMDBjLCAweDAwMGQsIDB4MDAwZSwgMHgwMDBmLAorCS8qIDB4MTAqLworCTB4MDAxMCwgMHgwMDExLCAweDAwMTIsIDB4MDAxMywKKwkweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisJMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLAorCTB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwKKwkvKiAweDIwKi8KKwkweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsCisJMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorCTB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwKKwkweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisJLyogMHgzMCovCisJMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLAorCTB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKwkweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsCisJMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorCS8qIDB4NDAqLworCTB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywKKwkweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisJMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLAorCTB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKwkvKiAweDUwKi8KKwkweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsCisJMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwKKwkweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisJLyogMHg2MCovCisJMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAorCTB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKwkweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsCisJMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLAorCS8qIDB4NzAqLworCTB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywKKwkweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisJMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLAorCTB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDA3ZiwKKwkvKiAweDgwKi8KKwkweDAwODAsIDB4MDA4MSwgMHgwMDgyLCAweDAwODMsCisJMHgwMDg0LCAweDAwODUsIDB4MDA4NiwgMHgwMDg3LAorCTB4MDA4OCwgMHgwMDg5LCAweDAwOGEsIDB4MDA4YiwKKwkweDAwOGMsIDB4MDA4ZCwgMHgwMDhlLCAweDAwOGYsCisJLyogMHg5MCovCisJMHgwMDkwLCAweDAwOTEsIDB4MDA5MiwgMHgwMDkzLAorCTB4MDA5NCwgMHgwMDk1LCAweDAwOTYsIDB4MDA5NywKKwkweDAwOTgsIDB4MDA5OSwgMHgwMDlhLCAweDAwOWIsCisJMHgwMDljLCAweDAwOWQsIDB4MDA5ZSwgMHgwMDlmLAorCS8qIDB4YTAqLworCTB4MDBhMCwgMHgwMTA0LCAweDAyZDgsIDB4MDE0MSwKKwkweDAwYTQsIDB4MDEzZCwgMHgwMTVhLCAweDAwYTcsCisJMHgwMGE4LCAweDAxNjAsIDB4MDE1ZSwgMHgwMTY0LAorCTB4MDE3OSwgMHgwMGFkLCAweDAxN2QsIDB4MDE3YiwKKwkvKiAweGIwKi8KKwkweDAwYjAsIDB4MDEwNSwgMHgwMmRiLCAweDAxNDIsCisJMHgwMGI0LCAweDAxM2UsIDB4MDE1YiwgMHgwMmM3LAorCTB4MDBiOCwgMHgwMTYxLCAweDAxNWYsIDB4MDE2NSwKKwkweDAxN2EsIDB4MDJkZCwgMHgwMTdlLCAweDAxN2MsCisJLyogMHhjMCovCisJMHgwMTU0LCAweDAwYzEsIDB4MDBjMiwgMHgwMTAyLAorCTB4MDBjNCwgMHgwMTM5LCAweDAxMDYsIDB4MDBjNywKKwkweDAxMGMsIDB4MDBjOSwgMHgwMTE4LCAweDAwY2IsCisJMHgwMTFhLCAweDAwY2QsIDB4MDBjZSwgMHgwMTBlLAorCS8qIDB4ZDAqLworCTB4MDExMCwgMHgwMTQzLCAweDAxNDcsIDB4MDBkMywKKwkweDAwZDQsIDB4MDE1MCwgMHgwMGQ2LCAweDAwZDcsCisJMHgwMTU4LCAweDAxNmUsIDB4MDBkYSwgMHgwMTcwLAorCTB4MDBkYywgMHgwMGRkLCAweDAxNjIsIDB4MDBkZiwKKwkvKiAweGUwKi8KKwkweDAxNTUsIDB4MDBlMSwgMHgwMGUyLCAweDAxMDMsCisJMHgwMGU0LCAweDAxM2EsIDB4MDEwNywgMHgwMGU3LAorCTB4MDEwZCwgMHgwMGU5LCAweDAxMTksIDB4MDBlYiwKKwkweDAxMWIsIDB4MDBlZCwgMHgwMGVlLCAweDAxMGYsCisJLyogMHhmMCovCisJMHgwMTExLCAweDAxNDQsIDB4MDE0OCwgMHgwMGYzLAorCTB4MDBmNCwgMHgwMTUxLCAweDAwZjYsIDB4MDBmNywKKwkweDAxNTksIDB4MDE2ZiwgMHgwMGZhLCAweDAxNzEsCisJMHgwMGZjLCAweDAwZmQsIDB4MDE2MywgMHgwMmQ5LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDAwLCAweDAwLCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGFkLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweDAwLCAweDAwLCAweDAwLCAweGI0LCAweDAwLCAweDAwLCAweDAwLCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweDAwLCAweGMxLCAweGMyLCAweDAwLCAweGM0LCAweDAwLCAweDAwLCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweDAwLCAweGM5LCAweDAwLCAweGNiLCAweDAwLCAweGNkLCAweGNlLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGQzLCAweGQ0LCAweDAwLCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweDAwLCAweDAwLCAweGRhLCAweDAwLCAweGRjLCAweGRkLCAweDAwLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDAwLCAweGUxLCAweGUyLCAweDAwLCAweGU0LCAweDAwLCAweDAwLCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweDAwLCAweGU5LCAweDAwLCAweGViLCAweDAwLCAweGVkLCAweGVlLCAweDAwLCAvKiAweGU4LTB4ZWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGYzLCAweGY0LCAweDAwLCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweDAwLCAweDAwLCAweGZhLCAweDAwLCAweGZjLCAweGZkLCAweDAwLCAweDAwLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMVsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4YzMsIDB4ZTMsIDB4YTEsIDB4YjEsIDB4YzYsIDB4ZTYsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzgsIDB4ZTgsIDB4Y2YsIDB4ZWYsIC8qIDB4MDgtMHgwZiAqLworCTB4ZDAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4Y2EsIDB4ZWEsIDB4Y2MsIDB4ZWMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4YzUsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4YTUsIDB4YjUsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4YTMsIDB4YjMsIDB4ZDEsIDB4ZjEsIDB4MDAsIDB4MDAsIDB4ZDIsIC8qIDB4NDAtMHg0NyAqLworCTB4ZjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4ZDUsIDB4ZjUsIDB4MDAsIDB4MDAsIDB4YzAsIDB4ZTAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4ZDgsIDB4ZjgsIDB4YTYsIDB4YjYsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YmEsIC8qIDB4NTgtMHg1ZiAqLworCTB4YTksIDB4YjksIDB4ZGUsIDB4ZmUsIDB4YWIsIDB4YmIsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZDksIDB4ZjksIC8qIDB4NjgtMHg2ZiAqLworCTB4ZGIsIDB4ZmIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4YWMsIDB4YmMsIDB4YWYsIDB4YmYsIDB4YWUsIDB4YmUsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI3LCAvKiAweGMwLTB4YzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQwLTB4ZDcgKi8KKwkweGEyLCAweGZmLCAweDAwLCAweGIyLCAweDAwLCAweGJkLCAweDAwLCAweDAwLCAvKiAweGQ4LTB4ZGYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBwYWdlMDEsIHBhZ2UwMiwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhiMSwgMHhhMiwgMHhiMywgMHhhNCwgMHhiNSwgMHhiNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhhZCwgMHhiZSwgMHhiZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhjMC0weGM3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhjOC0weGNmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGExLCAweGIyLCAweGEzLCAweGI0LCAweGE1LCAweGE2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGJkLCAweGFlLCAweGFmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImlzbzg4NTktMiIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19pc284ODU5XzIodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sc19pc284ODU5XzIodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19pc284ODU5XzIpCittb2R1bGVfZXhpdChleGl0X25sc19pc284ODU5XzIpCisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfaXNvODg1OS0zLmMgYi9mcy9ubHMvbmxzX2lzbzg4NTktMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYjQ1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2lzbzg4NTktMy5jCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogbGludXgvZnMvbmxzX2lzbzg4NTktMy5jCisgKgorICogQ2hhcnNldCBpc284ODU5LTMgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDA4MCwgMHgwMDgxLCAweDAwODIsIDB4MDA4MywKKwkweDAwODQsIDB4MDA4NSwgMHgwMDg2LCAweDAwODcsCisJMHgwMDg4LCAweDAwODksIDB4MDA4YSwgMHgwMDhiLAorCTB4MDA4YywgMHgwMDhkLCAweDAwOGUsIDB4MDA4ZiwKKwkvKiAweDkwKi8KKwkweDAwOTAsIDB4MDA5MSwgMHgwMDkyLCAweDAwOTMsCisJMHgwMDk0LCAweDAwOTUsIDB4MDA5NiwgMHgwMDk3LAorCTB4MDA5OCwgMHgwMDk5LCAweDAwOWEsIDB4MDA5YiwKKwkweDAwOWMsIDB4MDA5ZCwgMHgwMDllLCAweDAwOWYsCisJLyogMHhhMCovCisJMHgwMGEwLCAweDAxMjYsIDB4MDJkOCwgMHgwMGEzLAorCTB4MDBhNCwgMHgwMDAwLCAweDAxMjQsIDB4MDBhNywKKwkweDAwYTgsIDB4MDEzMCwgMHgwMTVlLCAweDAxMWUsCisJMHgwMTM0LCAweDAwYWQsIDB4MDAwMCwgMHgwMTdiLAorCS8qIDB4YjAqLworCTB4MDBiMCwgMHgwMTI3LCAweDAwYjIsIDB4MDBiMywKKwkweDAwYjQsIDB4MDBiNSwgMHgwMTI1LCAweDAwYjcsCisJMHgwMGI4LCAweDAxMzEsIDB4MDE1ZiwgMHgwMTFmLAorCTB4MDEzNSwgMHgwMGJkLCAweDAwMDAsIDB4MDE3YywKKwkvKiAweGMwKi8KKwkweDAwYzAsIDB4MDBjMSwgMHgwMGMyLCAweDAwMDAsCisJMHgwMGM0LCAweDAxMGEsIDB4MDEwOCwgMHgwMGM3LAorCTB4MDBjOCwgMHgwMGM5LCAweDAwY2EsIDB4MDBjYiwKKwkweDAwY2MsIDB4MDBjZCwgMHgwMGNlLCAweDAwY2YsCisJLyogMHhkMCovCisJMHgwMDAwLCAweDAwZDEsIDB4MDBkMiwgMHgwMGQzLAorCTB4MDBkNCwgMHgwMTIwLCAweDAwZDYsIDB4MDBkNywKKwkweDAxMWMsIDB4MDBkOSwgMHgwMGRhLCAweDAwZGIsCisJMHgwMGRjLCAweDAxNmMsIDB4MDE1YywgMHgwMGRmLAorCS8qIDB4ZTAqLworCTB4MDBlMCwgMHgwMGUxLCAweDAwZTIsIDB4MDAwMCwKKwkweDAwZTQsIDB4MDEwYiwgMHgwMTA5LCAweDAwZTcsCisJMHgwMGU4LCAweDAwZTksIDB4MDBlYSwgMHgwMGViLAorCTB4MDBlYywgMHgwMGVkLCAweDAwZWUsIDB4MDBlZiwKKwkvKiAweGYwKi8KKwkweDAwMDAsIDB4MDBmMSwgMHgwMGYyLCAweDAwZjMsCisJMHgwMGY0LCAweDAxMjEsIDB4MDBmNiwgMHgwMGY3LAorCTB4MDExZCwgMHgwMGY5LCAweDAwZmEsIDB4MDBmYiwKKwkweDAwZmMsIDB4MDE2ZCwgMHgwMTVkLCAweDAyZDksCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4MDAsIDB4MDAsIDB4YTMsIDB4YTQsIDB4MDAsIDB4MDAsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YWQsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4MDAsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4MDAsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YmQsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4MDAsIDB4YzQsIDB4MDAsIDB4MDAsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4MDAsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4MDAsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4MDAsIDB4MDAsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4MDAsIDB4ZTQsIDB4MDAsIDB4MDAsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4MDAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4MDAsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4MDAsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAxWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHhjNiwgMHhlNiwgMHhjNSwgMHhlNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkOCwgMHhmOCwgMHhhYiwgMHhiYiwgLyogMHgxOC0weDFmICovCisJMHhkNSwgMHhmNSwgMHgwMCwgMHgwMCwgMHhhNiwgMHhiNiwgMHhhMSwgMHhiMSwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHhhOSwgMHhiOSwgMHgwMCwgMHgwMCwgMHhhYywgMHhiYywgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkZSwgMHhmZSwgMHhhYSwgMHhiYSwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkZCwgMHhmZCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhhZiwgMHhiZiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDJbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZDAtMHhkNyAqLworCTB4YTIsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZDgtMHhkZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIHBhZ2UwMSwgcGFnZTAyLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg0MC0weDQ3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg0OC0weDRmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg1MC0weDU3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGIxLCAweGEyLCAweGEzLCAweGE0LCAweDAwLCAweGI2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweDY5LCAweGJhLCAweGJiLCAweGJjLCAweGFkLCAweDAwLCAweGJmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweDAwLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweDAwLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGMwLTB4YzcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweDAwLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweDAwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4MDAsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4MDAsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YTEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4MDAsIDB4YTYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4NDksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YmQsIDB4MDAsIDB4YWYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4MDAsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4MDAsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4ZTAtMHhlNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4ZTgtMHhlZiAqLworCTB4MDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSAmIDB4MDBmZjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaSAmIDB4ZmYwMCkgPj4gODsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXVuaTJjaGFyc2V0ID0gcGFnZV91bmkyY2hhcnNldFtjaF07CisJaWYgKHVuaTJjaGFyc2V0ICYmIHVuaTJjaGFyc2V0W2NsXSkKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2xdOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKwkqdW5pID0gY2hhcnNldDJ1bmlbKnJhd3N0cmluZ107CisJaWYgKCp1bmkgPT0gMHgwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAiaXNvODg1OS0zIiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2lzbzg4NTlfMyh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2lzbzg4NTlfMyh2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2lzbzg4NTlfMykKK21vZHVsZV9leGl0KGV4aXRfbmxzX2lzbzg4NTlfMykKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19pc284ODU5LTQuYyBiL2ZzL25scy9ubHNfaXNvODg1OS00LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxYjg3ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfaXNvODg1OS00LmMKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfaXNvODg1OS00LmMKKyAqCisgKiBDaGFyc2V0IGlzbzg4NTktNCB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwMDgwLCAweDAwODEsIDB4MDA4MiwgMHgwMDgzLAorCTB4MDA4NCwgMHgwMDg1LCAweDAwODYsIDB4MDA4NywKKwkweDAwODgsIDB4MDA4OSwgMHgwMDhhLCAweDAwOGIsCisJMHgwMDhjLCAweDAwOGQsIDB4MDA4ZSwgMHgwMDhmLAorCS8qIDB4OTAqLworCTB4MDA5MCwgMHgwMDkxLCAweDAwOTIsIDB4MDA5MywKKwkweDAwOTQsIDB4MDA5NSwgMHgwMDk2LCAweDAwOTcsCisJMHgwMDk4LCAweDAwOTksIDB4MDA5YSwgMHgwMDliLAorCTB4MDA5YywgMHgwMDlkLCAweDAwOWUsIDB4MDA5ZiwKKwkvKiAweGEwKi8KKwkweDAwYTAsIDB4MDEwNCwgMHgwMTM4LCAweDAxNTYsCisJMHgwMGE0LCAweDAxMjgsIDB4MDEzYiwgMHgwMGE3LAorCTB4MDBhOCwgMHgwMTYwLCAweDAxMTIsIDB4MDEyMiwKKwkweDAxNjYsIDB4MDBhZCwgMHgwMTdkLCAweDAwYWYsCisJLyogMHhiMCovCisJMHgwMGIwLCAweDAxMDUsIDB4MDJkYiwgMHgwMTU3LAorCTB4MDBiNCwgMHgwMTI5LCAweDAxM2MsIDB4MDJjNywKKwkweDAwYjgsIDB4MDE2MSwgMHgwMTEzLCAweDAxMjMsCisJMHgwMTY3LCAweDAxNGEsIDB4MDE3ZSwgMHgwMTRiLAorCS8qIDB4YzAqLworCTB4MDEwMCwgMHgwMGMxLCAweDAwYzIsIDB4MDBjMywKKwkweDAwYzQsIDB4MDBjNSwgMHgwMGM2LCAweDAxMmUsCisJMHgwMTBjLCAweDAwYzksIDB4MDExOCwgMHgwMGNiLAorCTB4MDExNiwgMHgwMGNkLCAweDAwY2UsIDB4MDEyYSwKKwkvKiAweGQwKi8KKwkweDAxMTAsIDB4MDE0NSwgMHgwMTRjLCAweDAxMzYsCisJMHgwMGQ0LCAweDAwZDUsIDB4MDBkNiwgMHgwMGQ3LAorCTB4MDBkOCwgMHgwMTcyLCAweDAwZGEsIDB4MDBkYiwKKwkweDAwZGMsIDB4MDE2OCwgMHgwMTZhLCAweDAwZGYsCisJLyogMHhlMCovCisJMHgwMTAxLCAweDAwZTEsIDB4MDBlMiwgMHgwMGUzLAorCTB4MDBlNCwgMHgwMGU1LCAweDAwZTYsIDB4MDEyZiwKKwkweDAxMGQsIDB4MDBlOSwgMHgwMTE5LCAweDAwZWIsCisJMHgwMTE3LCAweDAwZWQsIDB4MDBlZSwgMHgwMTJiLAorCS8qIDB4ZjAqLworCTB4MDExMSwgMHgwMTQ2LCAweDAxNGQsIDB4MDEzNywKKwkweDAwZjQsIDB4MDBmNSwgMHgwMGY2LCAweDAwZjcsCisJMHgwMGY4LCAweDAxNzMsIDB4MDBmYSwgMHgwMGZiLAorCTB4MDBmYywgMHgwMTY5LCAweDAxNmIsIDB4MDJkOSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwMCwgMHgwMCwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhZCwgMHgwMCwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHgwMCwgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHhjOSwgMHgwMCwgMHhjYiwgMHgwMCwgMHhjZCwgMHhjZSwgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHgwMCwgMHhkYSwgMHhkYiwgMHhkYywgMHgwMCwgMHgwMCwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHgwMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHgwMCwgLyogMHhlMC0weGU3ICovCisJMHgwMCwgMHhlOSwgMHgwMCwgMHhlYiwgMHgwMCwgMHhlZCwgMHhlZSwgMHgwMCwgLyogMHhlOC0weGVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHgwMCwgMHhmYSwgMHhmYiwgMHhmYywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDFbMjU2XSA9IHsKKwkweGMwLCAweGUwLCAweDAwLCAweDAwLCAweGExLCAweGIxLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGM4LCAweGU4LCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweGQwLCAweGYwLCAweGFhLCAweGJhLCAweDAwLCAweDAwLCAweGNjLCAweGVjLCAvKiAweDEwLTB4MTcgKi8KKwkweGNhLCAweGVhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweGFiLCAweGJiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweGE1LCAweGI1LCAweGNmLCAweGVmLCAweDAwLCAweDAwLCAweGM3LCAweGU3LCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGQzLCAweGYzLCAvKiAweDMwLTB4MzcgKi8KKwkweGEyLCAweDAwLCAweDAwLCAweGE2LCAweGI2LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGQxLCAweGYxLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweGJkLCAweGJmLCAweGQyLCAweGYyLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGEzLCAweGIzLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweGE5LCAweGI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGFjLCAweGJjLCAvKiAweDYwLTB4NjcgKi8KKwkweGRkLCAweGZkLCAweGRlLCAweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweGQ5LCAweGY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGFlLCAweGJlLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMlsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNywgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkMC0weGQ3ICovCisJMHgwMCwgMHhmZiwgMHgwMCwgMHhiMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkOC0weGRmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFnZV91bmkyY2hhcnNldFsyNTZdID0geworCXBhZ2UwMCwgcGFnZTAxLCBwYWdlMDIsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YjEsIDB4YTIsIDB4YjMsIDB4YTQsIDB4YjUsIDB4YjYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YWQsIDB4YmUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmYsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4YzAtMHhjNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4YzgtMHhjZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhhMSwgMHhiMiwgMHhhMywgMHhiNCwgMHhhNSwgMHhhNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhiZCwgMHhhZSwgMHhiZCwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhlMC0weGU3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhlOC0weGVmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJpc284ODU5LTQiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfaXNvODg1OV80KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfaXNvODg1OV80KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfaXNvODg1OV80KQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfaXNvODg1OV80KQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2lzbzg4NTktNS5jIGIvZnMvbmxzL25sc19pc284ODU5LTUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2IwMDg0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19pc284ODU5LTUuYwpAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19pc284ODU5LTUuYworICoKKyAqIENoYXJzZXQgaXNvODg1OS01IHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIFVuaWNvZGUgYW5kIGNoYXJzZXQKKyAqIHRhYmxlcyBmcm9tIHRoZSBVbmljb2RlIE9yZ2FuaXphdGlvbiAod3d3LnVuaWNvZGUub3JnKS4KKyAqIFRoZSBVbmljb2RlIHRvIGNoYXJzZXQgdGFibGUgaGFzIG9ubHkgZXhhY3QgbWFwcGluZ3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGNoYXJzZXQydW5pWzI1Nl0gPSB7CisJLyogMHgwMCovCisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLAorCTB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsCisJMHgwMDBjLCAweDAwMGQsIDB4MDAwZSwgMHgwMDBmLAorCS8qIDB4MTAqLworCTB4MDAxMCwgMHgwMDExLCAweDAwMTIsIDB4MDAxMywKKwkweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisJMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLAorCTB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwKKwkvKiAweDIwKi8KKwkweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsCisJMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorCTB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwKKwkweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisJLyogMHgzMCovCisJMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLAorCTB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKwkweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsCisJMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorCS8qIDB4NDAqLworCTB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywKKwkweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisJMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLAorCTB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKwkvKiAweDUwKi8KKwkweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsCisJMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwKKwkweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisJLyogMHg2MCovCisJMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAorCTB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKwkweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsCisJMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLAorCS8qIDB4NzAqLworCTB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywKKwkweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisJMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLAorCTB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDA3ZiwKKwkvKiAweDgwKi8KKwkweDAwODAsIDB4MDA4MSwgMHgwMDgyLCAweDAwODMsCisJMHgwMDg0LCAweDAwODUsIDB4MDA4NiwgMHgwMDg3LAorCTB4MDA4OCwgMHgwMDg5LCAweDAwOGEsIDB4MDA4YiwKKwkweDAwOGMsIDB4MDA4ZCwgMHgwMDhlLCAweDAwOGYsCisJLyogMHg5MCovCisJMHgwMDkwLCAweDAwOTEsIDB4MDA5MiwgMHgwMDkzLAorCTB4MDA5NCwgMHgwMDk1LCAweDAwOTYsIDB4MDA5NywKKwkweDAwOTgsIDB4MDA5OSwgMHgwMDlhLCAweDAwOWIsCisJMHgwMDljLCAweDAwOWQsIDB4MDA5ZSwgMHgwMDlmLAorCS8qIDB4YTAqLworCTB4MDBhMCwgMHgwNDAxLCAweDA0MDIsIDB4MDQwMywKKwkweDA0MDQsIDB4MDQwNSwgMHgwNDA2LCAweDA0MDcsCisJMHgwNDA4LCAweDA0MDksIDB4MDQwYSwgMHgwNDBiLAorCTB4MDQwYywgMHgwMGFkLCAweDA0MGUsIDB4MDQwZiwKKwkvKiAweGIwKi8KKwkweDA0MTAsIDB4MDQxMSwgMHgwNDEyLCAweDA0MTMsCisJMHgwNDE0LCAweDA0MTUsIDB4MDQxNiwgMHgwNDE3LAorCTB4MDQxOCwgMHgwNDE5LCAweDA0MWEsIDB4MDQxYiwKKwkweDA0MWMsIDB4MDQxZCwgMHgwNDFlLCAweDA0MWYsCisJLyogMHhjMCovCisJMHgwNDIwLCAweDA0MjEsIDB4MDQyMiwgMHgwNDIzLAorCTB4MDQyNCwgMHgwNDI1LCAweDA0MjYsIDB4MDQyNywKKwkweDA0MjgsIDB4MDQyOSwgMHgwNDJhLCAweDA0MmIsCisJMHgwNDJjLCAweDA0MmQsIDB4MDQyZSwgMHgwNDJmLAorCS8qIDB4ZDAqLworCTB4MDQzMCwgMHgwNDMxLCAweDA0MzIsIDB4MDQzMywKKwkweDA0MzQsIDB4MDQzNSwgMHgwNDM2LCAweDA0MzcsCisJMHgwNDM4LCAweDA0MzksIDB4MDQzYSwgMHgwNDNiLAorCTB4MDQzYywgMHgwNDNkLCAweDA0M2UsIDB4MDQzZiwKKwkvKiAweGUwKi8KKwkweDA0NDAsIDB4MDQ0MSwgMHgwNDQyLCAweDA0NDMsCisJMHgwNDQ0LCAweDA0NDUsIDB4MDQ0NiwgMHgwNDQ3LAorCTB4MDQ0OCwgMHgwNDQ5LCAweDA0NGEsIDB4MDQ0YiwKKwkweDA0NGMsIDB4MDQ0ZCwgMHgwNDRlLCAweDA0NGYsCisJLyogMHhmMCovCisJMHgyMTE2LCAweDA0NTEsIDB4MDQ1MiwgMHgwNDUzLAorCTB4MDQ1NCwgMHgwNDU1LCAweDA0NTYsIDB4MDQ1NywKKwkweDA0NTgsIDB4MDQ1OSwgMHgwNDVhLCAweDA0NWIsCisJMHgwNDVjLCAweDAwYTcsIDB4MDQ1ZSwgMHgwNDVmLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZkLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGFkLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwNFsyNTZdID0geworCTB4MDAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4MDAtMHgwNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4MDAsIDB4YWUsIDB4YWYsIC8qIDB4MDgtMHgwZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4MTAtMHgxNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4MTgtMHgxZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4MjAtMHgyNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4MjgtMHgyZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4MzAtMHgzNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4MzgtMHgzZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4NDAtMHg0NyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4NTAtMHg1NyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4MDAsIDB4ZmUsIDB4ZmYsIC8qIDB4NTgtMHg1ZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIxWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFnZV91bmkyY2hhcnNldFsyNTZdID0geworCXBhZ2UwMCwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgcGFnZTA0LCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIHBhZ2UyMSwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg0MC0weDQ3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg0OC0weDRmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg1MC0weDU3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGEwLTB4YTcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGFkLCAweGZlLCAweGZmLCAvKiAweGE4LTB4YWYgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGIwLTB4YjcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGI4LTB4YmYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGMwLTB4YzcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4ZDAtMHhkNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4ZDgtMHhkZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4ZTAtMHhlNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4ZjAtMHhmNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4ZmQsIDB4YWUsIDB4YWYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSAmIDB4MDBmZjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaSAmIDB4ZmYwMCkgPj4gODsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXVuaTJjaGFyc2V0ID0gcGFnZV91bmkyY2hhcnNldFtjaF07CisJaWYgKHVuaTJjaGFyc2V0ICYmIHVuaTJjaGFyc2V0W2NsXSkKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2xdOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKwkqdW5pID0gY2hhcnNldDJ1bmlbKnJhd3N0cmluZ107CisJaWYgKCp1bmkgPT0gMHgwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAiaXNvODg1OS01IiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2lzbzg4NTlfNSh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2lzbzg4NTlfNSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2lzbzg4NTlfNSkKK21vZHVsZV9leGl0KGV4aXRfbmxzX2lzbzg4NTlfNSkKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19pc284ODU5LTYuYyBiL2ZzL25scy9ubHNfaXNvODg1OS02LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1MTlkNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfaXNvODg1OS02LmMKQEAgLTAsMCArMSwyNjQgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfaXNvODg1OS02LmMKKyAqCisgKiBDaGFyc2V0IGlzbzg4NTktNiB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDY2MCwgMHgwNjYxLCAweDA2NjIsIDB4MDY2MywKKwkweDA2NjQsIDB4MDY2NSwgMHgwNjY2LCAweDA2NjcsCisJMHgwNjY4LCAweDA2NjksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwMDgwLCAweDAwODEsIDB4MDA4MiwgMHgwMDgzLAorCTB4MDA4NCwgMHgwMDg1LCAweDAwODYsIDB4MDA4NywKKwkweDAwODgsIDB4MDA4OSwgMHgwMDhhLCAweDAwOGIsCisJMHgwMDhjLCAweDAwOGQsIDB4MDA4ZSwgMHgwMDhmLAorCS8qIDB4OTAqLworCTB4MDA5MCwgMHgwMDkxLCAweDAwOTIsIDB4MDA5MywKKwkweDAwOTQsIDB4MDA5NSwgMHgwMDk2LCAweDAwOTcsCisJMHgwMDk4LCAweDAwOTksIDB4MDA5YSwgMHgwMDliLAorCTB4MDA5YywgMHgwMDlkLCAweDAwOWUsIDB4MDA5ZiwKKwkvKiAweGEwKi8KKwkweDAwYTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMGE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDA2MGMsIDB4MDBhZCwgMHgwMDAwLCAweDAwMDAsCisJLyogMHhiMCovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDA2MWIsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwNjFmLAorCS8qIDB4YzAqLworCTB4MDAwMCwgMHgwNjIxLCAweDA2MjIsIDB4MDYyMywKKwkweDA2MjQsIDB4MDYyNSwgMHgwNjI2LCAweDA2MjcsCisJMHgwNjI4LCAweDA2MjksIDB4MDYyYSwgMHgwNjJiLAorCTB4MDYyYywgMHgwNjJkLCAweDA2MmUsIDB4MDYyZiwKKwkvKiAweGQwKi8KKwkweDA2MzAsIDB4MDYzMSwgMHgwNjMyLCAweDA2MzMsCisJMHgwNjM0LCAweDA2MzUsIDB4MDYzNiwgMHgwNjM3LAorCTB4MDYzOCwgMHgwNjM5LCAweDA2M2EsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogMHhlMCovCisJMHgwNjQwLCAweDA2NDEsIDB4MDY0MiwgMHgwNjQzLAorCTB4MDY0NCwgMHgwNjQ1LCAweDA2NDYsIDB4MDY0NywKKwkweDA2NDgsIDB4MDY0OSwgMHgwNjRhLCAweDA2NGIsCisJMHgwNjRjLCAweDA2NGQsIDB4MDY0ZSwgMHgwNjRmLAorCS8qIDB4ZjAqLworCTB4MDY1MCwgMHgwNjUxLCAweDA2NTIsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhZCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDZbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGFjLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDAwLCAweGJmLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweDIwLTB4MjcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweDI4LTB4MmYgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweDMwLTB4MzcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweDQwLTB4NDcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweDQ4LTB4NGYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDYwLTB4NjcgKi8KKwkweDM4LCAweDM5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgcGFnZTA2LCBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhYywgMHhhZCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhmMC0weGY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGFjLCAweGFkLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDAwLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweDAwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGYwLTB4ZjcgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImlzbzg4NTktNiIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19pc284ODU5XzYodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sc19pc284ODU5XzYodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19pc284ODU5XzYpCittb2R1bGVfZXhpdChleGl0X25sc19pc284ODU5XzYpCisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfaXNvODg1OS03LmMgYi9mcy9ubHMvbmxzX2lzbzg4NTktNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMDg1NDYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2lzbzg4NTktNy5jCkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogbGludXgvZnMvbmxzX2lzbzg4NTktNy5jCisgKgorICogQ2hhcnNldCBpc284ODU5LTcgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDA4MCwgMHgwMDgxLCAweDAwODIsIDB4MDA4MywKKwkweDAwODQsIDB4MDA4NSwgMHgwMDg2LCAweDAwODcsCisJMHgwMDg4LCAweDAwODksIDB4MDA4YSwgMHgwMDhiLAorCTB4MDA4YywgMHgwMDhkLCAweDAwOGUsIDB4MDA4ZiwKKwkvKiAweDkwKi8KKwkweDAwOTAsIDB4MDA5MSwgMHgwMDkyLCAweDAwOTMsCisJMHgwMDk0LCAweDAwOTUsIDB4MDA5NiwgMHgwMDk3LAorCTB4MDA5OCwgMHgwMDk5LCAweDAwOWEsIDB4MDA5YiwKKwkweDAwOWMsIDB4MDA5ZCwgMHgwMDllLCAweDAwOWYsCisJLyogMHhhMCovCisJMHgwMGEwLCAweDAyYmQsIDB4MDJiYywgMHgwMGEzLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwYTYsIDB4MDBhNywKKwkweDAwYTgsIDB4MDBhOSwgMHgwMDAwLCAweDAwYWIsCisJMHgwMGFjLCAweDAwYWQsIDB4MDAwMCwgMHgyMDE1LAorCS8qIDB4YjAqLworCTB4MDBiMCwgMHgwMGIxLCAweDAwYjIsIDB4MDBiMywKKwkweDAzODQsIDB4MDM4NSwgMHgwMzg2LCAweDAwYjcsCisJMHgwMzg4LCAweDAzODksIDB4MDM4YSwgMHgwMGJiLAorCTB4MDM4YywgMHgwMGJkLCAweDAzOGUsIDB4MDM4ZiwKKwkvKiAweGMwKi8KKwkweDAzOTAsIDB4MDM5MSwgMHgwMzkyLCAweDAzOTMsCisJMHgwMzk0LCAweDAzOTUsIDB4MDM5NiwgMHgwMzk3LAorCTB4MDM5OCwgMHgwMzk5LCAweDAzOWEsIDB4MDM5YiwKKwkweDAzOWMsIDB4MDM5ZCwgMHgwMzllLCAweDAzOWYsCisJLyogMHhkMCovCisJMHgwM2EwLCAweDAzYTEsIDB4MDAwMCwgMHgwM2EzLAorCTB4MDNhNCwgMHgwM2E1LCAweDAzYTYsIDB4MDNhNywKKwkweDAzYTgsIDB4MDNhOSwgMHgwM2FhLCAweDAzYWIsCisJMHgwM2FjLCAweDAzYWQsIDB4MDNhZSwgMHgwM2FmLAorCS8qIDB4ZTAqLworCTB4MDNiMCwgMHgwM2IxLCAweDAzYjIsIDB4MDNiMywKKwkweDAzYjQsIDB4MDNiNSwgMHgwM2I2LCAweDAzYjcsCisJMHgwM2I4LCAweDAzYjksIDB4MDNiYSwgMHgwM2JiLAorCTB4MDNiYywgMHgwM2JkLCAweDAzYmUsIDB4MDNiZiwKKwkvKiAweGYwKi8KKwkweDAzYzAsIDB4MDNjMSwgMHgwM2MyLCAweDAzYzMsCisJMHgwM2M0LCAweDAzYzUsIDB4MDNjNiwgMHgwM2M3LAorCTB4MDNjOCwgMHgwM2M5LCAweDAzY2EsIDB4MDNjYiwKKwkweDAzY2MsIDB4MDNjZCwgMHgwM2NlLCAweDAwMDAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4MDAsIDB4MDAsIDB4YTMsIDB4MDAsIDB4MDAsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4MDAsIDB4YWIsIDB4YWMsIDB4YWQsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4YmIsIDB4MDAsIDB4YmQsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGEyLCAweGExLCAweDAwLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwM1syNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNCwgMHhiNSwgMHhiNiwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHgwMCwgMHhiYywgMHgwMCwgMHhiZSwgMHhiZiwgLyogMHg4OC0weDhmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHg5MC0weDk3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHg5OC0weDlmICovCisJMHhkMCwgMHhkMSwgMHgwMCwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhhMC0weGE3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhhOC0weGFmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhiMC0weGI3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhiOC0weGJmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhjMC0weGM3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHgwMCwgLyogMHhjOC0weGNmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjBbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGFmLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBOVUxMLCAgIHBhZ2UwMiwgcGFnZTAzLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCXBhZ2UyMCwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4MDAsIDB4MDAsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4MDAsIDB4YWIsIDB4YWMsIDB4YWQsIDB4MDAsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4ZGMsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4ZGQsIDB4ZGUsIDB4ZGYsIDB4YmIsIDB4ZmMsIDB4YmQsIDB4ZmQsIDB4ZmUsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4YzAtMHhjNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4YzgtMHhjZiAqLworCTB4ZjAsIDB4ZjEsIDB4MDAsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4MDAsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHgwMCwgMHgwMCwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHgwMCwgMHhhYiwgMHhhYywgMHhhZCwgMHgwMCwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHgwMCwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhiNiwgMHhiOCwgMHhiOSwgMHhiYSwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhlMC0weGU3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhlOC0weGVmICovCisJMHhkMCwgMHhkMSwgMHhkMywgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhmMC0weGY3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhiYywgMHhiZSwgMHhiZiwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJpc284ODU5LTciLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfaXNvODg1OV83KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfaXNvODg1OV83KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfaXNvODg1OV83KQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfaXNvODg1OV83KQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2lzbzg4NTktOS5jIGIvZnMvbmxzL25sc19pc284ODU5LTkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODhlZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19pc284ODU5LTkuYwpAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19pc284ODU5LTkuYworICoKKyAqIENoYXJzZXQgaXNvODg1OS05IHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIFVuaWNvZGUgYW5kIGNoYXJzZXQKKyAqIHRhYmxlcyBmcm9tIHRoZSBVbmljb2RlIE9yZ2FuaXphdGlvbiAod3d3LnVuaWNvZGUub3JnKS4KKyAqIFRoZSBVbmljb2RlIHRvIGNoYXJzZXQgdGFibGUgaGFzIG9ubHkgZXhhY3QgbWFwcGluZ3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGNoYXJzZXQydW5pWzI1Nl0gPSB7CisJLyogMHgwMCovCisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLAorCTB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsCisJMHgwMDBjLCAweDAwMGQsIDB4MDAwZSwgMHgwMDBmLAorCS8qIDB4MTAqLworCTB4MDAxMCwgMHgwMDExLCAweDAwMTIsIDB4MDAxMywKKwkweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisJMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLAorCTB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwKKwkvKiAweDIwKi8KKwkweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsCisJMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorCTB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwKKwkweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisJLyogMHgzMCovCisJMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLAorCTB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKwkweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsCisJMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorCS8qIDB4NDAqLworCTB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywKKwkweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisJMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLAorCTB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKwkvKiAweDUwKi8KKwkweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsCisJMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwKKwkweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisJLyogMHg2MCovCisJMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAorCTB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKwkweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsCisJMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLAorCS8qIDB4NzAqLworCTB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywKKwkweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisJMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLAorCTB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDA3ZiwKKwkvKiAweDgwKi8KKwkweDAwODAsIDB4MDA4MSwgMHgwMDgyLCAweDAwODMsCisJMHgwMDg0LCAweDAwODUsIDB4MDA4NiwgMHgwMDg3LAorCTB4MDA4OCwgMHgwMDg5LCAweDAwOGEsIDB4MDA4YiwKKwkweDAwOGMsIDB4MDA4ZCwgMHgwMDhlLCAweDAwOGYsCisJLyogMHg5MCovCisJMHgwMDkwLCAweDAwOTEsIDB4MDA5MiwgMHgwMDkzLAorCTB4MDA5NCwgMHgwMDk1LCAweDAwOTYsIDB4MDA5NywKKwkweDAwOTgsIDB4MDA5OSwgMHgwMDlhLCAweDAwOWIsCisJMHgwMDljLCAweDAwOWQsIDB4MDA5ZSwgMHgwMDlmLAorCS8qIDB4YTAqLworCTB4MDBhMCwgMHgwMGExLCAweDAwYTIsIDB4MDBhMywKKwkweDAwYTQsIDB4MDBhNSwgMHgwMGE2LCAweDAwYTcsCisJMHgwMGE4LCAweDAwYTksIDB4MDBhYSwgMHgwMGFiLAorCTB4MDBhYywgMHgwMGFkLCAweDAwYWUsIDB4MDBhZiwKKwkvKiAweGIwKi8KKwkweDAwYjAsIDB4MDBiMSwgMHgwMGIyLCAweDAwYjMsCisJMHgwMGI0LCAweDAwYjUsIDB4MDBiNiwgMHgwMGI3LAorCTB4MDBiOCwgMHgwMGI5LCAweDAwYmEsIDB4MDBiYiwKKwkweDAwYmMsIDB4MDBiZCwgMHgwMGJlLCAweDAwYmYsCisJLyogMHhjMCovCisJMHgwMGMwLCAweDAwYzEsIDB4MDBjMiwgMHgwMGMzLAorCTB4MDBjNCwgMHgwMGM1LCAweDAwYzYsIDB4MDBjNywKKwkweDAwYzgsIDB4MDBjOSwgMHgwMGNhLCAweDAwY2IsCisJMHgwMGNjLCAweDAwY2QsIDB4MDBjZSwgMHgwMGNmLAorCS8qIDB4ZDAqLworCTB4MDExZSwgMHgwMGQxLCAweDAwZDIsIDB4MDBkMywKKwkweDAwZDQsIDB4MDBkNSwgMHgwMGQ2LCAweDAwZDcsCisJMHgwMGQ4LCAweDAwZDksIDB4MDBkYSwgMHgwMGRiLAorCTB4MDBkYywgMHgwMTMwLCAweDAxNWUsIDB4MDBkZiwKKwkvKiAweGUwKi8KKwkweDAwZTAsIDB4MDBlMSwgMHgwMGUyLCAweDAwZTMsCisJMHgwMGU0LCAweDAwZTUsIDB4MDBlNiwgMHgwMGU3LAorCTB4MDBlOCwgMHgwMGU5LCAweDAwZWEsIDB4MDBlYiwKKwkweDAwZWMsIDB4MDBlZCwgMHgwMGVlLCAweDAwZWYsCisJLyogMHhmMCovCisJMHgwMTFmLCAweDAwZjEsIDB4MDBmMiwgMHgwMGYzLAorCTB4MDBmNCwgMHgwMGY1LCAweDAwZjYsIDB4MDBmNywKKwkweDAwZjgsIDB4MDBmOSwgMHgwMGZhLCAweDAwZmIsCisJMHgwMGZjLCAweDAxMzEsIDB4MDE1ZiwgMHgwMGZmLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweDAwLCAweDAwLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweDAwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweDAwLCAweDAwLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMVsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZDAsIDB4ZjAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4ZGQsIDB4ZmQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGUsIDB4ZmUsIC8qIDB4NTgtMHg1ZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIHBhZ2UwMSwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg0MC0weDQ3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg0OC0weDRmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg1MC0weDU3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGMwLTB4YzcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweDY5LCAweGZlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4MDAsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4ZTAtMHhlNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4NDksIDB4ZGUsIDB4MDAsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSAmIDB4MDBmZjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaSAmIDB4ZmYwMCkgPj4gODsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXVuaTJjaGFyc2V0ID0gcGFnZV91bmkyY2hhcnNldFtjaF07CisJaWYgKHVuaTJjaGFyc2V0ICYmIHVuaTJjaGFyc2V0W2NsXSkKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2xdOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKwkqdW5pID0gY2hhcnNldDJ1bmlbKnJhd3N0cmluZ107CisJaWYgKCp1bmkgPT0gMHgwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAiaXNvODg1OS05IiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2lzbzg4NTlfOSh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2lzbzg4NTlfOSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2lzbzg4NTlfOSkKK21vZHVsZV9leGl0KGV4aXRfbmxzX2lzbzg4NTlfOSkKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19rb2k4LXIuYyBiL2ZzL25scy9ubHNfa29pOC1yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFkMjJjMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfa29pOC1yLmMKQEAgLTAsMCArMSwzMjQgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfa29pOC1yLmMKKyAqCisgKiBDaGFyc2V0IGtvaTgtciB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgyNTAwLCAweDI1MDIsIDB4MjUwYywgMHgyNTEwLAorCTB4MjUxNCwgMHgyNTE4LCAweDI1MWMsIDB4MjUyNCwKKwkweDI1MmMsIDB4MjUzNCwgMHgyNTNjLCAweDI1ODAsCisJMHgyNTg0LCAweDI1ODgsIDB4MjU4YywgMHgyNTkwLAorCS8qIDB4OTAqLworCTB4MjU5MSwgMHgyNTkyLCAweDI1OTMsIDB4MjMyMCwKKwkweDI1YTAsIDB4MjIxOSwgMHgyMjFhLCAweDIyNDgsCisJMHgyMjY0LCAweDIyNjUsIDB4MDBhMCwgMHgyMzIxLAorCTB4MDBiMCwgMHgwMGIyLCAweDAwYjcsIDB4MDBmNywKKwkvKiAweGEwKi8KKwkweDI1NTAsIDB4MjU1MSwgMHgyNTUyLCAweDA0NTEsCisJMHgyNTUzLCAweDI1NTQsIDB4MjU1NSwgMHgyNTU2LAorCTB4MjU1NywgMHgyNTU4LCAweDI1NTksIDB4MjU1YSwKKwkweDI1NWIsIDB4MjU1YywgMHgyNTVkLCAweDI1NWUsCisJLyogMHhiMCovCisJMHgyNTVmLCAweDI1NjAsIDB4MjU2MSwgMHgwNDAxLAorCTB4MjU2MiwgMHgyNTYzLCAweDI1NjQsIDB4MjU2NSwKKwkweDI1NjYsIDB4MjU2NywgMHgyNTY4LCAweDI1NjksCisJMHgyNTZhLCAweDI1NmIsIDB4MjU2YywgMHgwMGE5LAorCS8qIDB4YzAqLworCTB4MDQ0ZSwgMHgwNDMwLCAweDA0MzEsIDB4MDQ0NiwKKwkweDA0MzQsIDB4MDQzNSwgMHgwNDQ0LCAweDA0MzMsCisJMHgwNDQ1LCAweDA0MzgsIDB4MDQzOSwgMHgwNDNhLAorCTB4MDQzYiwgMHgwNDNjLCAweDA0M2QsIDB4MDQzZSwKKwkvKiAweGQwKi8KKwkweDA0M2YsIDB4MDQ0ZiwgMHgwNDQwLCAweDA0NDEsCisJMHgwNDQyLCAweDA0NDMsIDB4MDQzNiwgMHgwNDMyLAorCTB4MDQ0YywgMHgwNDRiLCAweDA0MzcsIDB4MDQ0OCwKKwkweDA0NGQsIDB4MDQ0OSwgMHgwNDQ3LCAweDA0NGEsCisJLyogMHhlMCovCisJMHgwNDJlLCAweDA0MTAsIDB4MDQxMSwgMHgwNDI2LAorCTB4MDQxNCwgMHgwNDE1LCAweDA0MjQsIDB4MDQxMywKKwkweDA0MjUsIDB4MDQxOCwgMHgwNDE5LCAweDA0MWEsCisJMHgwNDFiLCAweDA0MWMsIDB4MDQxZCwgMHgwNDFlLAorCS8qIDB4ZjAqLworCTB4MDQxZiwgMHgwNDJmLCAweDA0MjAsIDB4MDQyMSwKKwkweDA0MjIsIDB4MDQyMywgMHgwNDE2LCAweDA0MTIsCisJMHgwNDJjLCAweDA0MmIsIDB4MDQxNywgMHgwNDI4LAorCTB4MDQyZCwgMHgwNDI5LCAweDA0MjcsIDB4MDQyYSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHg5YSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHhiZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHg5YywgMHgwMCwgMHg5ZCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5ZSwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkMC0weGQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkOC0weGRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhlMC0weGU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhlOC0weGVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5ZiwgLyogMHhmMC0weGY3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDRbMjU2XSA9IHsKKwkweDAwLCAweGIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweGUxLCAweGUyLCAweGY3LCAweGU3LCAweGU0LCAweGU1LCAweGY2LCAweGZhLCAvKiAweDEwLTB4MTcgKi8KKwkweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAweGYwLCAvKiAweDE4LTB4MWYgKi8KKwkweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGU2LCAweGU4LCAweGUzLCAweGZlLCAvKiAweDIwLTB4MjcgKi8KKwkweGZiLCAweGZkLCAweGZmLCAweGY5LCAweGY4LCAweGZjLCAweGUwLCAweGYxLCAvKiAweDI4LTB4MmYgKi8KKwkweGMxLCAweGMyLCAweGQ3LCAweGM3LCAweGM0LCAweGM1LCAweGQ2LCAweGRhLCAvKiAweDMwLTB4MzcgKi8KKwkweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAweGQwLCAvKiAweDM4LTB4M2YgKi8KKwkweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGM2LCAweGM4LCAweGMzLCAweGRlLCAvKiAweDQwLTB4NDcgKi8KKwkweGRiLCAweGRkLCAweGRmLCAweGQ5LCAweGQ4LCAweGRjLCAweGMwLCAweGQxLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweGEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMlsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4OTUsIDB4OTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4OTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTgsIDB4OTksIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIzWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHg5MywgMHg5YiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjVbMjU2XSA9IHsKKwkweDgwLCAweDAwLCAweDgxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgyLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDgzLCAweDAwLCAweDAwLCAweDAwLCAweDg0LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDg1LCAweDAwLCAweDAwLCAweDAwLCAweDg2LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg3LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhhLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAweGE4LCAvKiAweDUwLTB4NTcgKi8KKwkweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAweGIwLCAvKiAweDU4LTB4NWYgKi8KKwkweGIxLCAweGIyLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGI5LCAvKiAweDYwLTB4NjcgKi8KKwkweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4OGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGMsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4OGQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGUsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4OGYsIDB4OTAsIDB4OTEsIDB4OTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4OTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIHBhZ2UwNCwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIHBhZ2UyMiwgcGFnZTIzLCBOVUxMLCAgIHBhZ2UyNSwgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhhMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhlMC0weGU3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhlOC0weGVmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhmMC0weGY3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGIzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGMwLTB4YzcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImtvaTgtciIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19rb2k4X3Iodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sc19rb2k4X3Iodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19rb2k4X3IpCittb2R1bGVfZXhpdChleGl0X25sc19rb2k4X3IpCisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfa29pOC1ydS5jIGIvZnMvbmxzL25sc19rb2k4LXJ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiODNlZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfa29pOC1ydS5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfa29pOC1ydS5jCisgKgorICogQ2hhcnNldCBrb2k4LXJ1IHRyYW5zbGF0aW9uIGJhc2VkIG9uIGNoYXJzZXQga29pOC11LgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgKnBfbmxzOworCitzdGF0aWMgaW50IHVuaTJjaGFyKGNvbnN0IHdjaGFyX3QgdW5pLAorCQkgICAgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJaWYgKCh1bmkgJiAweGZmYWYpID09IDB4MDQwZSB8fCAodW5pICYgMHhmZmNlKSA9PSAweDI1NGMpIHsKKwkJLyoga29pOC1ydSBhbmQga29pOC11IGRpZmZlciBvbmx5IG9uIHR3byBjaGFyYWN0ZXJzICovCisJCWlmICh1bmkgPT0gMHgwNDBlKQorCQkJb3V0WzBdID0gMHhiZTsKKwkJZWxzZSBpZiAodW5pID09IDB4MDQ1ZSkKKwkJCW91dFswXSA9IDB4YWU7CisJCWVsc2UgaWYgKHVuaSA9PSAweDI1NWQgfHwgdW5pID09IDB4MjU2YykKKwkJCXJldHVybiAwOworCQllbHNlCisJCQlyZXR1cm4gcF9ubHMtPnVuaTJjaGFyKHVuaSwgb3V0LCBib3VuZGxlbik7CisJCXJldHVybiAxOworCX0KKwllbHNlCisJCS8qIGZhc3QgcGF0aCAqLworCQlyZXR1cm4gcF9ubHMtPnVuaTJjaGFyKHVuaSwgb3V0LCBib3VuZGxlbik7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sCisJCSAgICB3Y2hhcl90ICp1bmkpCit7CisJaW50IG47CisKKwlpZiAoKCpyYXdzdHJpbmcgJiAweGVmKSAhPSAweGFlKSB7CisJCS8qIGtvaTgtcnUgYW5kIGtvaTgtdSBkaWZmZXIgb25seSBvbiB0d28gY2hhcmFjdGVycyAqLworCQkqdW5pID0gKCpyYXdzdHJpbmcgJiAweDEwKSA/IDB4MDQwZSA6IDB4MDQ1ZTsKKwkJcmV0dXJuIDE7CisJfQorCisJbiA9IHBfbmxzLT5jaGFyMnVuaShyYXdzdHJpbmcsIGJvdW5kbGVuLCB1bmkpOworCXJldHVybiBuOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJrb2k4LXJ1IiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19rb2k4X3J1KHZvaWQpCit7CisJcF9ubHMgPSBsb2FkX25scygia29pOC11Iik7CisKKwlpZiAocF9ubHMpIHsKKwkJdGFibGUuY2hhcnNldDJ1cHBlciA9IHBfbmxzLT5jaGFyc2V0MnVwcGVyOworCQl0YWJsZS5jaGFyc2V0Mmxvd2VyID0gcF9ubHMtPmNoYXJzZXQybG93ZXI7CisJCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2tvaThfcnUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworCXVubG9hZF9ubHMocF9ubHMpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19rb2k4X3J1KQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfa29pOF9ydSkKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19rb2k4LXUuYyBiL2ZzL25scy9ubHNfa29pOC11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQzMGZkNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfa29pOC11LmMKQEAgLTAsMCArMSwzMzEgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfa29pOC11LmMKKyAqCisgKiBDaGFyc2V0IGtvaTgtdSB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgyNTAwLCAweDI1MDIsIDB4MjUwYywgMHgyNTEwLAorCTB4MjUxNCwgMHgyNTE4LCAweDI1MWMsIDB4MjUyNCwKKwkweDI1MmMsIDB4MjUzNCwgMHgyNTNjLCAweDI1ODAsCisJMHgyNTg0LCAweDI1ODgsIDB4MjU4YywgMHgyNTkwLAorCS8qIDB4OTAqLworCTB4MjU5MSwgMHgyNTkyLCAweDI1OTMsIDB4MjMyMCwKKwkweDI1YTAsIDB4MjIxOSwgMHgyMjFhLCAweDIyNDgsCisJMHgyMjY0LCAweDIyNjUsIDB4MDBhMCwgMHgyMzIxLAorCTB4MDBiMCwgMHgwMGIyLCAweDAwYjcsIDB4MDBmNywKKwkvKiAweGEwKi8KKwkweDI1NTAsIDB4MjU1MSwgMHgyNTUyLCAweDA0NTEsCisJMHgwNDU0LCAweDI1NTQsIDB4MDQ1NiwgMHgwNDU3LAorCTB4MjU1NywgMHgyNTU4LCAweDI1NTksIDB4MjU1YSwKKwkweDI1NWIsIDB4MDQ5MSwgMHgyNTVkLCAweDI1NWUsCisJLyogMHhiMCovCisJMHgyNTVmLCAweDI1NjAsIDB4MjU2MSwgMHgwNDAxLAorCTB4MDQwNCwgMHgyNTYzLCAweDA0MDYsIDB4MDQwNywKKwkweDI1NjYsIDB4MjU2NywgMHgyNTY4LCAweDI1NjksCisJMHgyNTZhLCAweDA0OTAsIDB4MjU2YywgMHgwMGE5LAorCS8qIDB4YzAqLworCTB4MDQ0ZSwgMHgwNDMwLCAweDA0MzEsIDB4MDQ0NiwKKwkweDA0MzQsIDB4MDQzNSwgMHgwNDQ0LCAweDA0MzMsCisJMHgwNDQ1LCAweDA0MzgsIDB4MDQzOSwgMHgwNDNhLAorCTB4MDQzYiwgMHgwNDNjLCAweDA0M2QsIDB4MDQzZSwKKwkvKiAweGQwKi8KKwkweDA0M2YsIDB4MDQ0ZiwgMHgwNDQwLCAweDA0NDEsCisJMHgwNDQyLCAweDA0NDMsIDB4MDQzNiwgMHgwNDMyLAorCTB4MDQ0YywgMHgwNDRiLCAweDA0MzcsIDB4MDQ0OCwKKwkweDA0NGQsIDB4MDQ0OSwgMHgwNDQ3LCAweDA0NGEsCisJLyogMHhlMCovCisJMHgwNDJlLCAweDA0MTAsIDB4MDQxMSwgMHgwNDI2LAorCTB4MDQxNCwgMHgwNDE1LCAweDA0MjQsIDB4MDQxMywKKwkweDA0MjUsIDB4MDQxOCwgMHgwNDE5LCAweDA0MWEsCisJMHgwNDFiLCAweDA0MWMsIDB4MDQxZCwgMHgwNDFlLAorCS8qIDB4ZjAqLworCTB4MDQxZiwgMHgwNDJmLCAweDA0MjAsIDB4MDQyMSwKKwkweDA0MjIsIDB4MDQyMywgMHgwNDE2LCAweDA0MTIsCisJMHgwNDJjLCAweDA0MmIsIDB4MDQxNywgMHgwNDI4LAorCTB4MDQyZCwgMHgwNDI5LCAweDA0MjcsIDB4MDQyYSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHg5YSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHhiZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHg5YywgMHgwMCwgMHg5ZCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5ZSwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkMC0weGQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkOC0weGRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhlMC0weGU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhlOC0weGVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5ZiwgLyogMHhmMC0weGY3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDRbMjU2XSA9IHsKKwkweDAwLCAweGIzLCAweDAwLCAweDAwLCAweGI0LCAweDAwLCAweGI2LCAweGI3LCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweGUxLCAweGUyLCAweGY3LCAweGU3LCAweGU0LCAweGU1LCAweGY2LCAweGZhLCAvKiAweDEwLTB4MTcgKi8KKwkweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAweGYwLCAvKiAweDE4LTB4MWYgKi8KKwkweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGU2LCAweGU4LCAweGUzLCAweGZlLCAvKiAweDIwLTB4MjcgKi8KKwkweGZiLCAweGZkLCAweGZmLCAweGY5LCAweGY4LCAweGZjLCAweGUwLCAweGYxLCAvKiAweDI4LTB4MmYgKi8KKwkweGMxLCAweGMyLCAweGQ3LCAweGM3LCAweGM0LCAweGM1LCAweGQ2LCAweGRhLCAvKiAweDMwLTB4MzcgKi8KKwkweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAweGQwLCAvKiAweDM4LTB4M2YgKi8KKwkweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGM2LCAweGM4LCAweGMzLCAweGRlLCAvKiAweDQwLTB4NDcgKi8KKwkweGRiLCAweGRkLCAweGRmLCAweGQ5LCAweGQ4LCAweGRjLCAweGMwLCAweGQxLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweGEzLCAweDAwLCAweDAwLCAweGE0LCAweDAwLCAweGE2LCAweGE3LCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4YmQsIDB4YWQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHg5NSwgMHg5NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHg5NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OCwgMHg5OSwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjNbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDkzLCAweDliLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyNVsyNTZdID0geworCTB4ODAsIDB4MDAsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODIsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4ODMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4ODUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODYsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODcsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGEsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4MDAsIDB4YTUsIDB4MDAsIDB4MDAsIDB4YTgsIC8qIDB4NTAtMHg1NyAqLworCTB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4MDAsIDB4YWUsIDB4YWYsIDB4YjAsIC8qIDB4NTgtMHg1ZiAqLworCTB4YjEsIDB4YjIsIDB4MDAsIDB4YjUsIDB4MDAsIDB4MDAsIDB4YjgsIDB4YjksIC8qIDB4NjAtMHg2NyAqLworCTB4YmEsIDB4YmIsIDB4YmMsIDB4MDAsIDB4YmUsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4YiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4YywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHg4ZCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHg4ZiwgMHg5MCwgMHg5MSwgMHg5MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHg5NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFnZV91bmkyY2hhcnNldFsyNTZdID0geworCXBhZ2UwMCwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgcGFnZTA0LCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgcGFnZTIyLCBwYWdlMjMsIE5VTEwsICAgcGFnZTI1LCBOVUxMLCAgIE5VTEwsICAgCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg0MC0weDQ3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg0OC0weDRmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg1MC0weDU3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGEzLCAweGE0LCAweGI1LCAweGE2LCAweGE3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGFkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YjMsIDB4YjQsIDB4YTUsIDB4YjYsIDB4YjcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YmQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4YzAtMHhjNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4YzgtMHhjZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSAmIDB4MDBmZjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaSAmIDB4ZmYwMCkgPj4gODsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXVuaTJjaGFyc2V0ID0gcGFnZV91bmkyY2hhcnNldFtjaF07CisJaWYgKHVuaTJjaGFyc2V0ICYmIHVuaTJjaGFyc2V0W2NsXSkKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2xdOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKwkqdW5pID0gY2hhcnNldDJ1bmlbKnJhd3N0cmluZ107CisJaWYgKCp1bmkgPT0gMHgwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAia29pOC11IiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2tvaThfdSh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2tvaThfdSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2tvaThfdSkKK21vZHVsZV9leGl0KGV4aXRfbmxzX2tvaThfdSkKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc191dGY4LmMgYi9mcy9ubHMvbmxzX3V0ZjguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTJjNDJmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc191dGY4LmMKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIE1vZHVsZSBmb3IgaGFuZGxpbmcgdXRmOCBqdXN0IGxpa2UgYW55IG90aGVyIGNoYXJzZXQuCisgKiBCeSBVcmJhbiBXaWRtYXJrIDIwMDAKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgaWRlbnRpdHlbMjU2XTsKKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJaW50IG47CisKKwlpZiAoIChuID0gdXRmOF93Y3RvbWIob3V0LCB1bmksIGJvdW5kbGVuKSkgPT0gLTEpIHsKKwkJKm91dCA9ICc/JzsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJaW50IG47CisKKwlpZiAoIChuID0gdXRmOF9tYnRvd2ModW5pLCByYXdzdHJpbmcsIGJvdW5kbGVuKSkgPT0gLTEpIHsKKwkJKnVuaSA9IDB4MDAzZjsJLyogPyAqLworCQluID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gInV0ZjgiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gaWRlbnRpdHksCS8qIG5vIGNvbnZlcnNpb24gKi8KKwkuY2hhcnNldDJ1cHBlcgk9IGlkZW50aXR5LAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX3V0Zjgodm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGk9MDsgaTwyNTY7IGkrKykKKwkJaWRlbnRpdHlbaV0gPSBpOworCisgICAgICAgIHJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX3V0Zjgodm9pZCkKK3sKKyAgICAgICAgdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfdXRmOCkKK21vZHVsZV9leGl0KGV4aXRfbmxzX3V0ZjgpCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9udGZzL0NoYW5nZUxvZyBiL2ZzL250ZnMvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMmFkMTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL0NoYW5nZUxvZwpAQCAtMCwwICsxLDEzNTAgQEAKK1RvRG8vTm90ZXM6CisJLSBGaW5kIGFuZCBmaXggYnVncy4KKwktIENoZWNrcG9pbnQgb3IgZGlzYWJsZSB0aGUgdXNlciBzcGFjZSBqb3VybmFsICgkVXNuSnJubCkuCisJLSBJbiBiZXR3ZWVuIG50ZnNfcHJlcGFyZS9jb21taXRfd3JpdGUsIG5lZWQgZXhjbHVzaW9uIGJldHdlZW4KKwkgIHNpbXVsdGFuZW91cyBmaWxlIGV4dGVuc2lvbnMuIE5lZWQgcGVyaGFwcyBhbiBOSW5vUmVzaXplVW5kZXJ3YXkoKQorCSAgZmxhZyB3aGljaCB3ZSBjYW4gc2V0IGluIG50ZnNfcHJlcGFyZV93cml0ZSgpIGFuZCBjbGVhciBhZ2FpbiBpbgorCSAgbnRmc19jb21taXRfd3JpdGUoKS4gSnVzdCBoYXZlIHRvIGJlIGNhcmVmdWwgaW4gcmVhZHBhZ2Uvd3JpdGVwYWdlLAorCSAgYXMgd2VsbCBhcyBpbiB0cnVuY2F0ZSwgdGhhdCB3ZSBwbGF5IG5pY2UuLi4gV2UgbWlnaHQgbmVlZCB0byBoYXZlCisJICBhIGRhdGFfc2l6ZSBmaWVsZCBpbiB0aGUgbnRmc19pbm9kZSB0byBzdG9yZSB0aGUgcmVhbCBhdHRyaWJ1dGUKKwkgIGxlbmd0aC4gQWxzbyBuZWVkIHRvIGJlIGNhcmVmdWwgd2l0aCBpbml0aWFsaXplZF9zaXplIGV4dGVudGlvbiBpbgorCSAgbnRmc19wcmVwYXJlX3dyaXRlLiBCYXNpY2FsbHksIGp1c3QgYmUgX3ZlcnlfIGNhcmVmdWwgaW4gdGhpcyBjb2RlLi4uCisJICBPVE9ILCBwZXJoYXBzIGlfc2VtLCB3aGljaCBpcyBoZWxkIGFjY3Jvc3MgZ2VuZXJpY19maWxlX3dyaXRlIGlzCisJICBzdWZmaWNpZW50IGZvciBzeW5jaHJvbmlzYXRpb24gaGVyZS4gV2UgdGhlbiBqdXN0IG5lZWQgdG8gbWFrZSBzdXJlCisJICBudGZzX3JlYWRwYWdlL3dyaXRlcGFnZS90cnVuY2F0ZSBpbnRlcm9wZXJhdGUgcHJvcGVybHkgd2l0aCB1cy4KKwkgIFVQREFURTogVGhlIGFib3ZlIGlzIGFsbCBvayBhcyBpdCBpcyBkdWUgdG8gaV9zZW0gaGVsZC4gIFRoZSBvbmx5CisJICB0aGluZyB0aGF0IG5lZWRzIHRvIGJlIGNoZWNrZWQgaXMgbnRmc193cml0ZXBhZ2UoKSB3aGljaCBkb2VzIG5vdAorCSAgaG9sZCBpX3NlbS4gIEl0IGNhbm5vdCBjaGFuZ2UgaV9zaXplIGJ1dCBpdCBuZWVkcyB0byBjb3BlIHdpdGggYQorCSAgY29uY3VycmVudCBpX3NpemUgY2hhbmdlLgorCS0gSW1wbGVtZW50IG1mdC5jOjpzeW5jX21mdF9taXJyb3JfdW1vdW50KCkuICBXZSBjdXJyZW50bHkgd2lsbCBqdXN0CisJICBsZWF2ZSB0aGUgdm9sdW1lIGRpcnR5IG9uIHVtb3VudCBpZiB0aGUgZmluYWwgaXB1dCh2b2wtPm1mdF9pbm8pCisJICBjYXVzZXMgYSB3cml0ZSBvZiBhbnkgbWlycm9yZWQgbWZ0IHJlY29yZHMgZHVlIHRvIHRoZSBtZnQgbWlycm9yCisJICBpbm9kZSBoYXZpbmcgYmVlbiBkaXNjYXJkZWQgYWxyZWFkeS4gIFdoZXRoZXIgdGhpcyBjYW4gYWN0dWFsbHkgZXZlcgorCSAgaGFwcGVuIGlzIHVuY2xlYXIgaG93ZXZlciBzbyBpdCBpcyB3b3J0aCB3YWl0aW5nIHVudGlsIHNvbWVvbmUgaGl0cworCSAgdGhlIHByb2JsZW0uCisJLSBFbmFibGUgdGhlIGNvZGUgZm9yIHNldHRpbmcgdGhlIE5UNCBjb21wYXRpYmlsaXR5IGZsYWcgd2hlbiB3ZSBzdGFydAorCSAgbWFraW5nIE5URlMgMS4yIHNwZWNpZmljIG1vZGlmaWNhdGlvbnMuCisKKzIuMS4yMy1XSVAKKworCS0gQWRkIHByaW50ayByYXRlIGxpbWl0aW5nIGZvciBudGZzX3dhcm5pbmcoKSBhbmQgbnRmc19lcnJvcigpIHdoZW4KKwkgIGNvbXBpbGVkIHdpdGhvdXQgZGVidWcuICBUaGlzIGF2b2lkcyBhIHBvc3NpYmxlIGRlbmlhbCBvZiBzZXJ2aWNlCisJICBhdHRhY2suICBUaGFua3MgdG8gQ2FybC1EYW5pZWwgSGFpbGZpbmdlciBmcm9tIFN1U0UgZm9yIHBvaW50aW5nIHRoaXMKKwkgIG91dC4KKworMi4xLjIyIC0gTWFueSBidWcgYW5kIHJhY2UgZml4ZXMgYW5kIGVycm9yIGhhbmRsaW5nIGltcHJvdmVtZW50cy4KKworCS0gSW1wcm92ZSBlcnJvciBoYW5kbGluZyBpbiBmcy9udGZzL2lub2RlLmM6Om50ZnNfdHJ1bmNhdGUoKS4KKwktIENoYW5nZSBmcy9udGZzL2lub2RlLmM6Om50ZnNfdHJ1bmNhdGUoKSB0byByZXR1cm4gYW4gZXJyb3IgY29kZQorCSAgaW5zdGVhZCBvZiB2b2lkIGFuZCBwcm92aWRlIGEgaGVscGVyIG50ZnNfdHJ1bmNhdGVfdmZzKCkgZm9yIHRoZQorCSAgdmZzIC0+dHJ1bmNhdGUgbWV0aG9kLgorCS0gQWRkIGEgbmV3IG50ZnMgaW5vZGUgZmxhZyBOSW5vVHJ1bmNhdGVGYWlsZWQoKSBhbmQgbW9kaWZ5CisJICBmcy9udGZzL2lub2RlLmM6Om50ZnNfdHJ1bmNhdGUoKSB0byBzZXQgYW5kIGNsZWFyIGl0IGFwcHJvcHJpYXRlbHkuCisJLSBGaXggbWluX3NpemUgYW5kIG1heF9zaXplIGRlZmluaXRpb25zIGluIEFUVFJfREVGIHN0cnVjdHVyZSBpbgorCSAgZnMvbnRmcy9sYXlvdXQuaCB0byBiZSBzaWduZWQuCisJLSBBZGQgYXR0cmlidXRlIGRlZmluaXRpb24gaGFuZGxpbmcgaGVscGVycyB0byBmcy9udGZzL2F0dHJpYi5baGNdOgorCSAgbnRmc19hdHRyX3NpemVfYm91bmRzX2NoZWNrKCksIG50ZnNfYXR0cl9jYW5fYmVfbm9uX3Jlc2lkZW50KCksIGFuZAorCSAgbnRmc19hdHRyX2Nhbl9iZV9yZXNpZGVudCgpLCB3aGljaCBpbiB0dXJuIHVzZSB0aGUgbmV3IHByaXZhdGUgaGVscGVyCisJICBudGZzX2F0dHJfZmluZF9pbl9hdHRyZGVmKCkuCisJLSBJbiBmcy9udGZzL2FvcHMuYzo6bWFya19udGZzX3JlY29yZF9kaXJ0eSgpLCB0YWtlIHRoZQorCSAgbWFwcGluZy0+cHJpdmF0ZV9sb2NrIGFyb3VuZCB0aGUgZGlydHlpbmcgb2YgdGhlIGJ1ZmZlciBoZWFkcworCSAgYW5hbGFnb3VzIHRvIHRoZSB3YXkgaXQgaXMgZG9uZSBpbiBfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnMoKS4KKwktIEVuc3VyZSB0aGUgbWZ0IHJlY29yZCBzaXplIGRvZXMgbm90IGV4Y2VlZCB0aGUgUEFHRV9DQUNIRV9TSVpFIGF0CisJICBtb3VudCB0aW1lIGFzIHRoaXMgY2Fubm90IHdvcmsgd2l0aCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4KKwktIENoZWNrIGZvciBsb2NhdGlvbiBvZiBhdHRyaWJ1dGUgbmFtZSBhbmQgaW1wcm92ZSBlcnJvciBoYW5kbGluZyBpbgorCSAgZ2VuZXJhbCBpbiBmcy9udGZzL2lub2RlLmM6Om50ZnNfcmVhZF9sb2NrZWRfaW5vZGUoKSBhbmQgZnJpZW5kcy4KKwktIEluIGZzL250ZnMvYW9wcy5jOjpudGZzX3dyaXRlcGFnZSgpLCBpZiB0aGUgcGFnZSBpcyBmdWxseSBvdXRzaWRlCisJICBpX3NpemUsIGkuZS4gcmFjZSB3aXRoIHRydW5jYXRlLCBpbnZhbGlkYXRlIHRoZSBidWZmZXJzIG9uIHRoZSBwYWdlCisJICBzbyB0aGF0IHRoZXkgYmVjb21lIGZyZWVhYmxlIGFuZCBoZW5jZSB0aGUgcGFnZSBkb2VzIG5vdCBsZWFrLgorCS0gUmVtb3ZlIHVudXNlZCBmdW5jdGlvbiBmcy9udGZzL3J1bmxpc3QuYzo6bnRmc19ybF9tZXJnZSgpLiAgKEFkcmlhbgorCSAgQnVuaykKKwktIEZpeCBzdHVwaWQgYnVnIGluIGZzL250ZnMvYXR0cmliLmM6Om50ZnNfYXR0cl9maW5kKCkgdGhhdCByZXN1bHRlZCBpbgorCSAgYSBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UgaW4gdGhlIGVycm9yIGNvZGUgcGF0aCB3aGVuIGEgY29ycnVwdAorCSAgYXR0cmlidXRlIHdhcyBmb3VuZC4gIChUaGFua3MgdG8gRG9tZW4gUHVuY2VyIGZvciB0aGUgYnVnIHJlcG9ydC4pCisJLSBBZGQgTU9EVUxFX1ZFUlNJT04oKSB0byBmcy9udGZzL3N1cGVyLmMuCisJLSBNYWtlIHNldmVyYWwgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgc3RhdGljLiAgKEFkcmlhbiBCdW5rKQorCS0gTW9kaWZ5IGZzL250ZnMvYW9wcy5jOjptYXJrX250ZnNfcmVjb3JkX2RpcnR5KCkgc28gaXQgYWxsb2NhdGVzCisJICBidWZmZXJzIGZvciB0aGUgcGFnZSBpZiB0aGV5IGFyZSBub3QgcHJlc2VudCBhbmQgdGhlbiBtYXJrcyB0aGUKKwkgIGJ1ZmZlcnMgYmVsb25naW5nIHRvIHRoZSBudGZzIHJlY29yZCBkaXJ0eS4gIFRoaXMgY2F1c2VzIHRoZSBidWZmZXJzCisJICB0byBiZWNvbWUgYnVzeSBhbmQgaGVuY2UgdGhleSBhcmUgc2FmZSBmcm9tIHJlbW92YWwgdW50aWwgdGhlIHBhZ2UKKwkgIGhhcyBiZWVuIHdyaXR0ZW4gb3V0LgorCS0gRml4IHN0dXBpZCBidWcgaW4gZnMvbnRmcy9hdHRyaWIuYzo6bnRmc19leHRlcm5hbF9hdHRyX2ZpbmQoKSBpbiB0aGUKKwkgIGVycm9yIGhhbmRsaW5nIGNvZGUgcGF0aCB0aGF0IHJlc3VsdGVkIGluIGEgQlVHKCkgZHVlIHRvIHRyeWluZyB0bworCSAgdW5tYXAgYW4gZXh0ZW50IG1mdCByZWNvcmQgd2hlbiB0aGUgbWFwcGluZyBvZiBpdCBoYWQgZmFpbGVkIGFuZCBpdAorCSAgdGh1cyB3YXMgbm90IG1hcHBlZC4gIChUaGFua3MgdG8gS2VuIE1hY0ZlcnJpbiBmb3IgdGhlIGJ1ZyByZXBvcnQuKQorCS0gRHJvcCB0aGUgcnVubGlzdCBsb2NrIGFmdGVyIHRoZSB2Y24gaGFzIGJlZW4gcmVhZCBpbgorCSAgZnMvbnRmcy9sY25hbGxvYy5jOjpfX250ZnNfY2x1c3Rlcl9mcmVlKCkuCisJLSBSZXdyaXRlIGhhbmRsaW5nIG9mIG11bHRpIHNlY3RvciB0cmFuc2ZlciBlcnJvcnMuICBXZSBub3cgZG8gbm90IHNldAorCSAgUGFnZUVycm9yKCkgd2hlbiBzdWNoIGVycm9ycyBhcmUgZGV0ZWN0ZWQgaW4gdGhlIGFzeW5jIGkvbyBoYW5kbGVyCisJICBmcy9udGZzL2FvcHMuYzo6bnRmc19lbmRfYnVmZmVyX2FzeW5jX3JlYWQoKS4gIEFsbCB1c2VycyBvZiBtc3QKKwkgIHByb3RlY3RlZCBhdHRyaWJ1dGVzIG5vdyBjaGVjayB0aGUgbWFnaWMgb2YgZWFjaCBudGZzIHJlY29yZCBhcyB0aGV5CisJICB1c2UgaXQgYW5kIGFjdCBhcHByb3ByaWF0ZWx5LiAgVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBtYWtpbmcgZXJyb3JzCisJICBncmFudWxhciBwZXIgbnRmcyByZWNvcmQgcmF0aGVyIHRoYW4gcGVyIHBhZ2Ugd2hpY2ggc29sdmVzIHRoZSBjYXNlCisJICB3aGVyZSB3ZSBjYW5ub3QgYWNjZXNzIGFueSBvZiB0aGUgbnRmcyByZWNvcmRzIGluIGEgcGFnZSB3aGVuIGEKKwkgIHNpbmdsZSBvbmUgb2YgdGhlbSBoYWQgYW4gbXN0IGVycm9yLiAgKFRoYW5rcyB0byBLZW4gTWFjRmVycmluIGZvcgorCSAgdGhlIGJ1ZyByZXBvcnQuKQorCS0gRml4IGVycm9yIGhhbmRsaW5nIGluIGZzL250ZnMvcXVvdGEuYzo6bnRmc19tYXJrX3F1b3Rhc19vdXRfb2ZfZGF0ZSgpCisJICB3aGVyZSB3ZSBmYWlsZWQgdG8gcmVsZWFzZSBpX3NlbSBvbiB0aGUgJFF1b3RhLyRRIGF0dHJpYnV0ZSBpbm9kZS4KKwktIEZpeCBidWcgaW4gaGFuZGxpbmcgb2YgYmFkIGlub2RlcyBpbiBmcy9udGZzL25hbWVpLmM6Om50ZnNfbG9va3VwKCkuCisJLSBBZGQgbWFwcGluZyBvZiB1bm1hcHBlZCBidWZmZXJzIHRvIGFsbCByZW1haW5pbmcgY29kZSBwYXRocywgaS5lLgorCSAgZnMvbnRmcy9hb3BzLmM6Om50ZnNfd3JpdGVfbXN0X2Jsb2NrKCksIG1mdC5jOjpudGZzX3N5bmNfbWZ0X21pcnJvcigpLAorCSAgYW5kIHdyaXRlX21mdF9yZWNvcmRfbm9sb2NrKCkuICBGcm9tIG5vdyBvbiB3ZSByZXF1aXJlIHRoYXQgdGhlCisJICBjb21wbGV0ZSBydW5saXN0IGZvciB0aGUgbWZ0IG1pcnJvciBpcyBhbHdheXMgbWFwcGVkIGludG8gbWVtb3J5LgorCS0gQWRkIGNyZWF0aW9uIG9mIGJ1ZmZlcnMgdG8gZnMvbnRmcy9tZnQuYzo6bnRmc19zeW5jX21mdF9taXJyb3IoKS4KKwktIEltcHJvdmUgZXJyb3IgaGFuZGxpbmcgaW4gZnMvbnRmcy9hb3BzLmM6Om50ZnNfe3JlYWQsd3JpdGV9X2Jsb2NrKCkuCisJLSBDbGVhbnVwIGZzL250ZnMvYW9wcy5jOjpudGZzX3tyZWFkLHdyaXRlfXBhZ2UoKSBzaW5jZSB3ZSBrbm93IHRoYXQgYQorCSAgcmVzaWRlbnQgYXR0cmlidXRlIHdpbGwgYmUgc21hbGxlciB0aGFuIGEgcGFnZSB3aGljaCBtYWtlcyB0aGUgY29kZQorCSAgc2ltcGxlci4gIEFsc28gbWFrZSB0aGUgY29kZSBtb3JlIHRvbGVyYW50IHRvIGNvbmN1cnJlbnQgLT50cnVuY2F0ZS4KKworMi4xLjIxIC0gRml4IHNvbWUgcmFjZXMgYW5kIGJ1Z3MsIHJld3JpdGUgbWZ0IHdyaXRlIGNvZGUsIGFkZCBtZnQgYWxsb2NhdG9yLgorCisJLSBJbXBsZW1lbnQgZXh0ZW50IG1mdCByZWNvcmQgZGVhbGxvY2F0aW9uCisJICBmcy9udGZzL21mdC5jOjpudGZzX2V4dGVudF9tZnRfcmVjb3JkX2ZyZWUoKS4KKwktIFNwbGl0dCBydW5saXN0IHJlbGF0ZWQgZnVuY3Rpb25zIG9mZiBmcm9tIGF0dHJpYi5baGNdIHRvIHJ1bmxpc3QuW2hjXS4KKwktIEFkZCB2b2wtPm1mdF9kYXRhX3BvcyBhbmQgaW5pdGlhbGl6ZSBpdCBhdCBtb3VudCB0aW1lLgorCS0gUmVuYW1lIGluaXRfcnVubGlzdCgpIHRvIG50ZnNfaW5pdF9ydW5saXN0KCksIG50ZnNfdmNuX3RvX2xjbigpIHRvCisJICBudGZzX3JsX3Zjbl90b19sY24oKSwgZGVjb21wcmVzc19tYXBwaW5nX3BhaXJzKCkgdG8KKwkgIG50ZnNfbWFwcGluZ19wYWlyc19kZWNvbXByZXNzKCksIG50ZnNfbWVyZ2VfcnVubGlzdHMoKSB0bworCSAgbnRmc19ydW5saXN0c19tZXJnZSgpIGFuZCBhZGFwdCBhbGwgY2FsbGVycy4KKwktIEFkZCBmcy9udGZzL3J1bmxpc3QuW2hjXTo6bnRmc19nZXRfbnJfc2lnbmlmaWNhbnRfYnl0ZXMoKSwKKwkgIG50ZnNfZ2V0X3NpemVfZm9yX21hcHBpbmdfcGFpcnMoKSwgbnRmc193cml0ZV9zaWduaWZpY2FudF9ieXRlcygpLAorCSAgYW5kIG50ZnNfbWFwcGluZ19wYWlyc19idWlsZCgpLCBhZGFwdGVkIGZyb20gbGlibnRmcy4KKwktIE1ha2UgZnMvbnRmcy9sY25hbGxvYy5jOjpudGZzX2NsdXN0ZXJfZnJlZV9mcm9tX3JsX25vbG9jaygpIG5vdAorCSAgc3RhdGljIGFuZCBhZGQgYSBkZWNsYXJhdGlvbiBmb3IgaXQgdG8gbGNuYWxsb2MuaC4KKwktIEFkZCBmcy9udGZzL2xjbmFsbG9jLmg6Om50ZnNfY2x1c3Rlcl9mcmVlX2Zyb21fcmwoKSB3aGljaCBpcyBhIHN0YXRpYworCSAgaW5saW5lIHdyYXBwZXIgZm9yIG50ZnNfY2x1c3Rlcl9mcmVlX2Zyb21fcmxfbm9sb2NrKCkgd2hpY2ggdGFrZXMgdGhlCisJICBjbHVzdGVyIGJpdG1hcCBsb2NrIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNhbGwuCisJLSBBZGQgZnMvbnRmcy9hdHRyaWIuW2hjXTo6bnRmc19hdHRyX3JlY29yZF9yZXNpemUoKS4KKwktIEltcGxlbWVudCB0aGUgZXF1aXZhbGVudCBvZiBtZW1zZXQoKSBmb3IgYW4gbnRmcyBhdHRyaWJ1dGUgaW4KKwkgIGZzL250ZnMvYXR0cmliLltoY106Om50ZnNfYXR0cl9zZXQoKSBhbmQgc3dpdGNoCisJICBmcy9udGZzL2xvZ2ZpbGUuYzo6bnRmc19lbXB0eV9sb2dmaWxlKCkgdG8gdXNpbmcgaXQuCisJLSBSZW1vdmUgdW5uZWNlc3NhcnkgY2FzdHMgZnJvbSBMQ05fKiBjb25zdGFudHMuCisJLSBJbXBsZW1lbnQgZnMvbnRmcy9ydW5saXN0LmM6Om50ZnNfcmxfdHJ1bmNhdGVfbm9sb2NrKCkuCisJLSBBZGQgTUZUX1JFQ09SRF9PTEQgYXMgYSBjb3B5IG9mIE1GVF9SRUNPUkQgaW4gZnMvbnRmcy9sYXlvdXQuaCBhbmQKKwkgIGNoYW5nZSBNRlRfUkVDT1JEIHRvIGNvbnRhaW4gdGhlIE5URlMgMy4xKyBzcGVjaWZpYyBmaWVsZHMuCisJLSBBZGQgYSBoZWxwZXIgZnVuY3Rpb24gZnMvbnRmcy9hb3BzLmM6Om1hcmtfbnRmc19yZWNvcmRfZGlydHkoKSB3aGljaAorCSAgbWFya3MgYWxsIGJ1ZmZlcnMgYmVsb25naW5nIHRvIGFuIG50ZnMgcmVjb3JkIGRpcnR5LCBmb2xsb3dlZCBieQorCSAgbWFya2luZyB0aGUgcGFnZSB0aGUgbnRmcyByZWNvcmQgaXMgaW4gZGlydHkgYW5kIGFsc28gbWFya2luZyB0aGUgdmZzCisJICBpbm9kZSBjb250YWluaW5nIHRoZSBudGZzIHJlY29yZCBkaXJ0eSAoSV9ESVJUWV9QQUdFUykuCisJLSBTd2l0Y2ggZnMvbnRmcy9pbmRleC5oOjpudGZzX2luZGV4X2VudHJ5X21hcmtfZGlydHkoKSB0byB1c2luZyB0aGUKKwkgIG5ldyBoZWxwZXIgZnMvbnRmcy9hb3BzLmM6Om1hcmtfbnRmc19yZWNvcmRfZGlydHkoKSBhbmQgcmVtb3ZlIHRoZSBubworCSAgbG9uZ2VyIG5lZWRlZCBmcy9udGZzL2luZGV4LltoY106Ol9fbnRmc19pbmRleF9lbnRyeV9tYXJrX2RpcnR5KCkuCisJLSBNb3ZlIG50ZnNfe3VuLH1tYXBfcGFnZSgpIGZyb20gbnRmcy5oIHRvIGFvcHMuaCBhbmQgZml4IHJlc3VsdGluZworCSAgaW5jbHVkZSBlcnJvcnMuCisJLSBNb3ZlIHRoZSB0eXBlZGVmcyBmb3IgcnVubGlzdF9lbGVtZW50IGFuZCBydW5saXN0IGZyb20gdHlwZXMuaCB0bworCSAgcnVubGlzdC5oIGFuZCBmaXggcmVzdWx0aW5nIGluY2x1ZGUgZXJyb3JzLgorCS0gUmVtb3ZlIHVudXNlZCB7X18sfWZvcm1hdF9tZnRfcmVjb3JkKCkgZnJvbSBmcy9udGZzL21mdC5jLgorCS0gTW9kaWZ5IGZzL250ZnMvbWZ0LmM6Ol9fbWFya19tZnRfcmVjb3JkX2RpcnR5KCkgdG8gdXNlIHRoZSBoZWxwZXIKKwkgIG1hcmtfbnRmc19yZWNvcmRfZGlydHkoKSB3aGljaCBhbHNvIGNoYW5nZXMgdGhlIGJlaGF2aW91ciBpbiB0aGF0IHdlCisJICBub3cgc2V0IHRoZSBidWZmZXJzIGJlbG9uZ2luZyB0byB0aGUgbWZ0IHJlY29yZCBkaXJ0eSBhcyB3ZWxsIGFzIHRoZQorCSAgcGFnZSBpdHNlbGYuCisJLSBVcGRhdGUgZnMvbnRmcy9tZnQuYzo6d3JpdGVfbWZ0X3JlY29yZF9ub2xvY2soKSBhbmQgc3luY19tZnRfbWlycm9yKCkKKwkgIHRvIGNvcGUgd2l0aCB0aGUgZmFjdCB0aGF0IHRoZXJlIG5vdyBhcmUgZGlydHkgYnVmZmVycyBpbiBtZnQgcGFnZXMuCisJLSBVcGRhdGUgZnMvbnRmcy9pbm9kZS5jOjpudGZzX3dyaXRlX2lub2RlKCkgdG8gYWxzbyB1c2UgdGhlIGhlbHBlcgorCSAgbWFya19udGZzX3JlY29yZF9kaXJ0eSgpIGFuZCB0aHVzIHRvIHNldCB0aGUgYnVmZmVycyBiZWxvbmdpbmcgdG8gdGhlCisJICBtZnQgcmVjb3JkIGRpcnR5IGFzIHdlbGwgYXMgdGhlIHBhZ2UgaXRzZWxmLgorCS0gRml4IGNvbXBpbGVyIHdhcm5pbmdzIG9uIHg4Ni02NCBpbiBmcy9udGZzL2Rpci5jLiAgKFJhbmR5IER1bmxhcCwKKwkgIHNsaWdodGx5IG1vZGlmaWVkIGJ5IG1lKQorCS0gQWRkIGZzL250ZnMvbWZ0LmM6OnRyeV9tYXBfbWZ0X3JlY29yZCgpIHdoaWNoIGZhaWxzIHdpdGggLUVBTFJFQURZIGlmCisJICB0aGUgbWZ0IHJlY29yZCBpcyBhbHJlYWR5IGxvY2tlZCBhbmQgb3RoZXJ3aXNlIGJlaGF2ZXMgdGhlIHNhbWUgd2F5CisJICBhcyBmcy9udGZzL21mdC5jOjptYXBfbWZ0X3JlY29yZCgpLgorCS0gTW9kaWZ5IGZzL250ZnMvbWZ0LmM6OndyaXRlX21mdF9yZWNvcmRfbm9sb2NrKCkgc28gdGhhdCBpdCBvbmx5CisJICB3cml0ZXMgdGhlIG1mdCByZWNvcmQgaWYgdGhlIGJ1ZmZlcnMgYmVsb25naW5nIHRvIGl0IGFyZSBkaXJ0eS4KKwkgIE90aGVyd2lzZSB3ZSBhc3N1bWUgdGhhdCBpdCB3YXMgd3JpdHRlbiBvdXQgYnkgb3RoZXIgbWVhbnMgYWxyZWFkeS4KKwktIEF0dGVtcHRpbmcgdG8gd3JpdGUgb3V0c2lkZSBpbml0aWFsaXplZCBzaXplIGlzIF9ub3RfIGEgYnVnIHNvIHJlbW92ZQorCSAgdGhlIGJ1ZyBjaGVjayBmcm9tIGZzL250ZnMvYW9wcy5jOjpudGZzX3dyaXRlX21zdF9ibG9jaygpLiAgSXQgaXMgaW4KKwkgIGZhY3QgcmVxdWlyZWQgdG8gd3JpdGUgb3V0c2lkZSBpbml0aWFsaXplZCBzaXplIHdoZW4gcHJlcGFyaW5nIHRvCisJICBleHRlbmQgdGhlIGluaXRpYWxpemVkIHNpemUuCisJLSBNYXAgdGhlIHBhZ2UgaW5zdGVhZCBvZiB1c2luZyBwYWdlX2FkZHJlc3MoKSBiZWZvcmUgd3JpdGluZyB0byBpdCBpbgorCSAgZnMvbnRmcy9hb3BzLmM6Om50ZnNfbWZ0X3dyaXRlcGFnZSgpLgorCS0gUHJvdmlkZSBleGNsdXNpb24gYmV0d2VlbiBvcGVuaW5nIGFuIGlub2RlIC8gbWFwcGluZyBhbiBtZnQgcmVjb3JkCisJICBhbmQgYWNjZXNzaW5nIHRoZSBtZnQgcmVjb3JkIGluIGZzL250ZnMvbWZ0LmM6Om50ZnNfbWZ0X3dyaXRlcGFnZSgpCisJICBieSBzZXR0aW5nIHRoZSBwYWdlIG5vdCB1cHRvZGF0ZSB0aHJvdWdob3V0IG50ZnNfbWZ0X3dyaXRlcGFnZSgpLgorCS0gQ2xlYXIgdGhlIHBhZ2UgdXB0b2RhdGUgZmxhZyBpbiBmcy9udGZzL2FvcHMuYzo6bnRmc193cml0ZV9tc3RfYmxvY2soKQorCSAgdG8gZW5zdXJlIG5vb25lIGNhbiBzZWUgdGhlIHBhZ2Ugd2hpbHN0IHRoZSBtc3QgZml4dXBzIGFyZSBhcHBsaWVkLgorCS0gQWRkIHRoZSBoZWxwZXIgZnMvbnRmcy9tZnQuYzo6bnRmc19tYXlfd3JpdGVfbWZ0X3JlY29yZCgpIHdoaWNoCisJICBjaGVja3MgaWYgYW4gbWZ0IHJlY29yZCBtYXkgYmUgd3JpdHRlbiBvdXQgc2FmZWx5IG9idGFpbmluZyBhbnkKKwkgIG5lY2Vzc2FyeSBsb2NrcyBpbiB0aGUgcHJvY2Vzcy4gIFRoaXMgaXMgdXNlZCBieQorCSAgZnMvbnRmcy9hb3BzLmM6Om50ZnNfd3JpdGVfbXN0X2Jsb2NrKCkuCisJLSBNb2RpZnkgZnMvbnRmcy9hb3BzLmM6Om50ZnNfd3JpdGVfbXN0X2Jsb2NrKCkgdG8gYWxzbyB3b3JrIGZvcgorCSAgd3JpdGluZyBtZnQgcmVjb3JkcyBhbmQgaW1wcm92ZSBpdHMgZXJyb3IgaGFuZGxpbmcgaW4gdGhlIHByb2Nlc3MuCisJICBOb3cgaWYgYW55IG9mIHRoZSByZWNvcmRzIGluIHRoZSBwYWdlIGZhaWwgdG8gYmUgd3JpdHRlbiBvdXQsIGFsbAorCSAgb3RoZXIgcmVjb3JkcyB3aWxsIGJlIHdyaXR0ZW4gb3V0IGluc3RlYWQgb2YgYWJvcnRpbmcgY29tcGxldGVseS4KKwktIFJlbW92ZSBudGZzX21mdF9hb3BzIGFuZCB1cGRhdGUgYWxsIHVzZXJzIHRvIHVzZSBudGZzX21zdF9hb3BzLgorCS0gTW9kaWZ5IGZzL250ZnMvaW5vZGUuYzo6bnRmc19yZWFkX2xvY2tlZF9pbm9kZSgpIHRvIHNldCB0aGUKKwkgIG50ZnNfbXN0X2FvcHMgZm9yIGFsbCBpbm9kZXMgd2hpY2ggYXJlIE5Jbm9Nc3RQcm90ZWN0ZWQoKSBhbmQKKwkgIG50ZnNfYW9wcyBmb3IgYWxsIG90aGVyIGlub2Rlcy4KKwktIFJlbmFtZSBmcy9udGZzL21mdC5jOjpzeW5jX21mdF9taXJyb3J7LF91bW91bnR9KCkgdG8KKwkgIG50ZnNfc3luY19tZnRfbWlycm9yeyxfdW1vdW50fSgpIGFuZCBjaGFuZ2UgdGhlaXIgcGFyYW1ldGVycyBzbyB0aGV5CisJICBubyBsb25nZXIgcmVxdWlyZSBhbiBudGZzIGlub2RlIHRvIGJlIHByZXNlbnQuICBVcGRhdGUgYWxsIGNhbGxlcnMuCisJLSBDbGVhbnVwIHRoZSBlcnJvciBoYW5kbGluZyBpbiBmcy9udGZzL21mdC5jOjpudGZzX3N5bmNfbWZ0X21pcnJvcigpLgorCS0gQ2xlYXIgdGhlIHBhZ2UgdXB0b2RhdGUgZmxhZyBpbiBmcy9udGZzL21mdC5jOjpudGZzX3N5bmNfbWZ0X21pcnJvcigpCisJICB0byBlbnN1cmUgbm9vbmUgY2FuIHNlZSB0aGUgcGFnZSB3aGlsc3QgdGhlIG1zdCBmaXh1cHMgYXJlIGFwcGxpZWQuCisJLSBSZW1vdmUgdGhlIG5vIGxvbmdlciBuZWVkZWQgZnMvbnRmcy9tZnQuYzo6bnRmc19tZnRfd3JpdGVwYWdlKCkgYW5kCisJICBmcy9udGZzL21mdC5jOjp0cnlfbWFwX21mdF9yZWNvcmQoKS4KKwktIEZpeCBjYWxsZXJzIG9mIGZzL250ZnMvYW9wcy5jOjptYXJrX250ZnNfcmVjb3JkX2RpcnR5KCkgdG8gY2FsbCBpdAorCSAgd2l0aCB0aGUgbnRmcyBpbm9kZSB3aGljaCBjb250YWlucyB0aGUgcGFnZSByYXRoZXIgdGhhbiB0aGUgbnRmcworCSAgaW5vZGUgdGhlIG1mdCByZWNvcmQgb2Ygd2hpY2ggaXMgaW4gdGhlIHBhZ2UuCisJLSBGaXggcmFjZSBjb25kaXRpb24gaW4gZnMvbnRmcy9pbm9kZS5jOjpudGZzX3B1dF9pbm9kZSgpIGJ5IG1vdmluZyB0aGUKKwkgIGluZGV4IGlub2RlIGJpdG1hcCBpbm9kZSByZWxlYXNlIGNvZGUgZnJvbSB0aGVyZSB0bworCSAgZnMvbnRmcy9pbm9kZS5jOjpudGZzX2NsZWFyX2JpZ19pbm9kZSgpLiAgKFRoYW5rcyB0byBDaHJpc3RvcGgKKwkgIEhlbGx3aWcgZm9yIHNwb3R0aW5nIHRoaXMuKQorCS0gRml4IHJhY2UgY29uZGl0aW9uIGluIGZzL250ZnMvaW5vZGUuYzo6bnRmc19wdXRfaW5vZGUoKSBieSB0YWtpbmcgdGhlCisJICBpbm9kZSBzZW1hcGhvcmUgYXJvdW5kIHRoZSBjb2RlIHRoYXQgc2V0cyBuaS0+aXR5cGUuaW5kZXguYm1wX2lubyB0bworCSAgTlVMTCBhbmQgcmVvcmdhbml6ZSB0aGUgY29kZSB0byBvcHRpbWl6ZSBpdCBhIGJpdC4gIChUaGFua3MgdG8KKwkgIENocmlzdG9waCBIZWxsd2lnIGZvciBzcG90dGluZyB0aGlzLikKKwktIE1vZGlmeSBmcy9udGZzL2FvcHMuYzo6bWFya19udGZzX3JlY29yZF9kaXJ0eSgpIHRvIG5vIGxvbmdlciB0YWtlIHRoZQorCSAgbnRmcyBpbm9kZSBhcyBhIHBhcmFtZXRlciBhcyB0aGlzIGlzIGNvbmZ1c2luZyBhbmQgbWlzbGVhZGluZyBhbmQgdGhlCisJICBuZWVkZWQgbnRmcyBpbm9kZSBpcyBhdmFpbGFibGUgdmlhIE5URlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KS4KKwkgIEFkYXB0IGFsbCBjYWxsZXJzIHRvIHRoaXMgY2hhbmdlLgorCS0gTW9kaWZ5IGZzL250ZnMvbWZ0LmM6OndyaXRlX21mdF9yZWNvcmRfbm9sb2NrKCkgYW5kCisJICBmcy9udGZzL2FvcHMuYzo6bnRmc193cml0ZV9tc3RfYmxvY2soKSB0byBvbmx5IGNoZWNrIHRoZSBkaXJ0eSBzdGF0ZQorCSAgb2YgdGhlIGZpcnN0IGJ1ZmZlciBpbiBhIHJlY29yZCBhbmQgdG8gdGFrZSB0aGlzIGFzIHRoZSBudGZzIHJlY29yZAorCSAgZGlydHkgc3RhdGUuICBXZSBjYW5ub3QgbG9vayBhdCB0aGUgZGlydHkgc3RhdGUgZm9yIHN1YnNlcXVlbnQKKwkgIGJ1ZmZlcnMgYmVjYXVzZSB3ZSBtaWdodCBiZSByYWNpbmcgd2l0aAorCSAgZnMvbnRmcy9hb3BzLmM6Om1hcmtfbnRmc19yZWNvcmRfZGlydHkoKS4KKwktIE1vdmUgdGhlIHN0YXRpYyBpbmxpbmUgbnRmc19pbml0X2JpZ19pbm9kZSgpIGZyb20gZnMvbnRmcy9pbm9kZS5jIHRvCisJICBpbm9kZS5oIGFuZCBtYWtlIGZzL250ZnMvaW5vZGUuYzo6X19udGZzX2luaXRfaW5vZGUoKSBub24tc3RhdGljIGFuZAorCSAgYWRkIGEgZGVjbGFyYXRpb24gZm9yIGl0IHRvIGlub2RlLmguICBGaXggc29tZSBjb21waWxhdGlvbiBpc3N1ZXMKKwkgIHRoYXQgcmVzdWx0ZWQgZHVlIHRvICNpbmNsdWRlcyBhbmQgaGVhZGVyIGZpbGUgaW50ZXJkZXBlbmRlbmNpZXMuCisJLSBTaW1wbGlmeSBzZXR1cCBvZiBpX21vZGUgaW4gZnMvbnRmcy9pbm9kZS5jOjpudGZzX3JlYWRfbG9ja2VkX2lub2RlKCkuCisJLSBBZGQgaGVscGVycyBmcy9udGZzL2xheW91dC5oOjpNS19NUkVGKCkgYW5kIE1LX0xFX01SRUYoKS4KKwktIE1vZGlmeSBmcy9udGZzL21mdC5jOjptYXBfZXh0ZW50X21mdF9yZWNvcmQoKSB0byBvbmx5IHZlcmlmeSB0aGUgbWZ0CisJICByZWNvcmQgc2VxdWVuY2UgbnVtYmVyIGlmIGl0IGlzIHNwZWNpZmllZCAoaS5lLiBub3QgemVybykuCisJLSBBZGQgZnMvbnRmcy9tZnQuW2hjXTo6bnRmc19tZnRfcmVjb3JkX2FsbG9jKCkgYW5kIHZhcmlvdXMgaGVscGVyCisJICBmdW5jdGlvbnMgdXNlZCBieSBpdC4KKwktIFVwZGF0ZSBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL250ZnMudHh0IHdpdGggaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0bworCSAgdXNlIHRoZSBEZXZpY2UtTWFwcGVyIGRyaXZlciB3aXRoIE5URlMgZnRkaXNrL0xETSByYWlkLiAgVGhpcyByZW1vdmVzCisJICB0aGUgbGluZWFyIHJhaWQgcHJvYmxlbSB3aXRoIHRoZSBTb2Z0d2FyZSBSQUlEIC8gTUQgZHJpdmVyIHdoZW4gb25lCisJICBvciBtb3JlIG9mIHRoZSBkZXZpY2VzIGhhcyBhbiBvZGQgbnVtYmVyIG9mIHNlY3RvcnMuCisKKzIuMS4yMCAtIEZpeCB0d28gc3R1cGlkIGJ1Z3MgaW50cm9kdWNlZCBpbiAyLjEuMTggcmVsZWFzZS4KKworCS0gRml4IHN0dXBpZCBidWcgaW4gZnMvbnRmcy9hdHRyaWIuYzo6bnRmc19hdHRyX3JlaW5pdF9zZWFyY2hfY3R4KCkKKwkgIHdoZXJlIHdlIGRpZCBub3QgY2xlYXIgY3R4LT5hbF9lbnRyeSBidXQgaXQgd2FzIHN0aWxsIHNldCBkdWUgdG8KKwkgIGNoYW5nZXMgaW4gbnRmc19hdHRyX2xvb2t1cCgpIGFuZCBudGZzX2V4dGVybmFsX2F0dHJfZmluZCgpIGluCisJICBwYXJ0aWN1bGFyLgorCS0gRml4IGFub3RoZXIgc3R1cGlkIGJ1ZyBpbiBmcy9udGZzL2F0dHJpYi5jOjpudGZzX2V4dGVybmFsX2F0dHJfZmluZCgpCisJICB3aGVyZSB3ZSBmb3Jnb3QgdG8gdW5tYXAgdGhlIGV4dGVudCBtZnQgcmVjb3JkIHdoZW4gd2UgaGFkIGZpbmlzaGVkCisJICBlbnVtZXJhdGluZyBhbiBhdHRyaWJ1dGUgd2hpY2ggY2F1c2VkIGEgYnVnIGNoZWNrIHRvIHRyaWdnZXIgd2hlbiB0aGUKKwkgIFZGUyBjYWxscyAtPmNsZWFyX2lub2RlLgorCisyLjEuMTkgLSBNYW55IGNsZWFudXBzLCBpbXByb3ZlbWVudHMsIGFuZCBhIG1pbm9yIGJ1ZyBmaXguCisKKwktIFVwZGF0ZSAtPnNldGF0dHIgKGZzL250ZnMvaW5vZGUuYzo6bnRmc19zZXRhdHRyKCkpIHRvIHJlZnVzZSB0bworCSAgY2hhbmdlIHRoZSB1aWQsIGdpZCwgYW5kIG1vZGUgb2YgYW4gaW5vZGUgYXMgd2UgZG8gbm90IHN1cHBvcnQgTlRGUworCSAgQUNMcyB5ZXQuCisJLSBSZW1vdmUgQktMIHVzZSBmcm9tIG50ZnNfc2V0YXR0cigpIHN5bmNpbmcgdXAgd2l0aCB0aGUgcmVzdCBvZiB0aGUKKwkgIGtlcm5lbC4KKwktIEdldCByaWQgb2YgdGhlIHVnbHkgdHJhbnNwYXJlbnQgdW5pb24gaW4gZnMvbnRmcy9kaXIuYzo6bnRmc19yZWFkZGlyKCkKKwkgIGFuZCBudGZzX2ZpbGxkaXIoKSBhcyBwZXIgc3VnZ2VzdGlvbiBmcm9tIEFsIFZpcm8uCisJLSBDaGFuZ2UgJ1wwJyBhbmQgTCdcMCcgdG8gc2ltcGx5IDAgYXMgcGVyIGFkdmljZSBmcm9tIExpbnVzIFRvcnZhbGRzLgorCS0gVXBkYXRlIC0+dHJ1bmNhdGUgKGZzL250ZnMvaW5vZGUuYzo6bnRmc190cnVuY2F0ZSgpKSB0byBjaGVjayBpZiB0aGUKKwkgIGlub2RlIHNpemUgaGFzIGNoYW5nZWQgYW5kIHRvIG9ubHkgb3V0cHV0IGFuIGVycm9yIGlmIHNvLgorCS0gUmVuYW1lIGZzL250ZnMvYXR0cmliLmg6OmF0dHJpYnV0ZV92YWx1ZV9sZW5ndGgoKSB0byBudGZzX2F0dHJfc2l6ZSgpLgorCS0gQWRkIGxlezE2LDMyLDY0fSBhcyB3ZWxsIGFzIHNsZXsxNiwzMiw2NH0gZGF0YSB0eXBlcyB0bworCSAgZnMvbnRmcy90eXBlcy5oLgorCS0gQ2hhbmdlIG50ZnNjaGFyIHRvIGJlIGxlMTYgaW5zdGVhZCBvZiB1MTYgaW4gZnMvbnRmcy90eXBlcy5oLgorCS0gQWRkIGxlIHZlcnNpb25zIG9mIFZDTiwgTENOLCBhbmQgTFNOIGNhbGxlZCBsZVZDTiwgbGVMQ04sIGFuZCBsZUxTTiwKKwkgIHJlc3BlY3RpdmVseSwgdG8gZnMvbnRmcy90eXBlcy5oLgorCS0gVXBkYXRlIGVuZGlhbm5lc3MgY29udmVyc2lvbiBtYWNyb3MgaW4gZnMvbnRmcy9lbmRpYW4uaCB0byB1c2UgdGhlCisJICBuZXcgdHlwZXMgYXMgYXBwcm9wcmlhdGUuCisJLSBEbyBwcm9wZXIgdHlwZSBjYXN0aW5nIHdoZW4gdXNpbmcgc2xlNjRfdG9fY3B1cCgpIGluIGZzL250ZnMvZGlyLmMKKwkgIGFuZCBpbmRleC5jLgorCS0gQWRkIGxlTUZUX1JFRiBkYXRhIHR5cGUgdG8gZnMvbnRmcy9sYXlvdXQuaC4KKwktIFVwZGF0ZSBhbGwgTlRGUyBoZWFkZXIgZmlsZXMgd2l0aCB0aGUgbmV3IGxpdHRsZSBlbmRpYW4gZGF0YSB0eXBlcy4KKwkgIEFmZmVjdGVkIGZpbGVzIGFyZSBmcy9udGZzL2xheW91dC5oLCBsb2dmaWxlLmgsIGFuZCB0aW1lLmguCisJLSBEbyBwcm9wZXIgdHlwZSBjYXN0aW5nIHdoZW4gdXNpbmcgbnRmc19pc18qX3JlY29yZHAoKSBpbgorCSAgZnMvbnRmcy9sb2dmaWxlLmMsIG1mdC5jLCBhbmQgc3VwZXIuYy4gCisJLSBGaXggYWxsIHRoZSBzcGFyc2UgYml0d2lzZSB3YXJuaW5ncy4gIEhhZCB0byBjaGFuZ2UgYWxsIHRoZSB0eXBlZGVmCisJICBlbnVtcyBzdG9yaW5nIGxpdHRsZSBlbmRpYW4gdmFsdWVzIHRvIHNpbXBsZSBlbnVtcyBwbHVzIGEgdHlwZWRlZiBmb3IKKwkgIHRoZSBkYXRhdHlwZSB0byBtYWtlIHNwYXJzZSBoYXBweS4KKwktIEZpeCBhIGJ1ZyBmb3VuZCBieSB0aGUgbmV3IHNwYXJzZSBiaXR3aXNlIHdhcm5pbmdzIHdoZXJlIHRoZSBkZWZhdWx0CisJICB1cGNhc2UgdGFibGUgd2FzIGRlZmluZWQgYXMgYSBwb2ludGVyIHRvIHdjaGFyX3QgcmF0aGVyIHRoYW4gbnRmc2NoYXIKKwkgIGluIGZzL250ZnMvbnRmcy5oIGFuZCBzdXBlci5jLgorCS0gQ2hhbmdlIHtjb25zdF8sfWNwdV90b19sZXsxNiwzMn0oMCkgdG8ganVzdCAwIGFzIHN1Z2dlc3RlZCBieSBBbCBWaXJvLgorCisyLjEuMTggLSBGaXggc2NoZWR1bGluZyBsYXRlbmNpZXMgYXQgbW91bnQgdGltZSBhcyB3ZWxsIGFzIGFuIGVuZGlhbm5lc3MgYnVnLgorCisJLSBSZW1vdmUgdm9sLT5ucl9tZnRfcmVjb3JkcyBhcyBpdCB3YXMgcHJldHR5IG1lYW5pbmdsZXNzIGFuZCBvcHRpbWl6ZQorCSAgdGhlIGNhbGN1bGF0aW9uIG9mIHRvdGFsL2ZyZWUgaW5vZGVzIGFzIHVzZWQgYnkgc3RhdGZzKCkuCisJLSBGaXggc2NoZWR1bGluZyBsYXRlbmNpZXMgaW4gbnRmc19maWxsX3N1cGVyKCkgYnkgZHJvcHBpbmcgdGhlIEJLTAorCSAgYmVjYXVzZSB0aGUgY29kZSBpdHNlbGYgaXMgdXNpbmcgdGhlIG50ZnNfbG9jayBzZW1hcGhvcmUgd2hpY2gKKwkgIHByb3ZpZGVzIHNhZmUgbG9ja2luZy4gIChJbmdvIE1vbG5hcikKKwktIEZpeCBhIHBvdGVudGlhbCBidWcgaW4gZnMvbnRmcy9tZnQuYzo6bWFwX2V4dGVudF9tZnRfcmVjb3JkKCkgdGhhdAorCSAgY291bGQgb2NjdXIgaW4gdGhlIGZ1dHVyZSBmb3Igd2hlbiB3ZSBzdGFydCBjbG9zaW5nL2ZyZWVpbmcgZXh0ZW50CisJICBpbm9kZXMgaWYgd2UgZG9uJ3Qgc2V0IGJhc2VfbmktPmV4dC5leHRlbnRfbnRmc19pbm9zIHRvIE5VTEwgYWZ0ZXIKKwkgIHdlIGZyZWUgaXQuCisJLSBSZW5hbWUge2ZpbmQsbG9va3VwfV9hdHRyKCkgdG8gbnRmc19hdHRyX3tmaW5kLGxvb2t1cH0oKSBhcyB3ZWxsIGFzCisJICBmaW5kX2V4dGVybmFsX2F0dHIoKSB0byBudGZzX2V4dGVybmFsX2F0dHJfZmluZCgpIHRvIGNsZWFudXAgdGhlCisJICBuYW1lc3BhY2UgYSBiaXQgYW5kIHRvIGJlIG1vcmUgY29uc2lzdGVudCB3aXRoIGxpYm50ZnMuCisJLSBSZW5hbWUge3tyZSx9aW5pdCxnZXQscHV0fV9hdHRyX3NlYXJjaF9jdHgoKSB0bworCSAgbnRmc19hdHRyX3t7cmUsfWluaXQsZ2V0LHB1dH1fc2VhcmNoX2N0eCgpIGFzIHdlbGwgYXMgdGhlIHR5cGUKKwkgIGF0dHJfc2VhcmNoX2NvbnRleHQgdG8gbnRmc19hdHRyX3NlYXJjaF9jdHguCisJLSBGb3JjZSB1c2Ugb2YgbnRmc19hdHRyX2ZpbmQoKSBpbiBudGZzX2F0dHJfbG9va3VwKCkgd2hlbiBzZWFyY2hpbmcKKwkgIGZvciB0aGUgYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlIGl0c2VsZi4KKwktIEZpeCBlbmRpYW5uZXNzIGJ1ZyBpbiBudGZzX2V4dGVybmFsX2F0dHJfZmluZCgpLgorCS0gQ2hhbmdlIG50ZnNfe2V4dGVybmFsXyx9YXR0cl9maW5kKCkgdG8gcmV0dXJuIDAgb24gc3VjY2VzcywgLUVOT0VOVAorCSAgaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQsIGFuZCAtRUlPIG9uIHJlYWwgZXJyb3IuICBJbiB0aGUgY2FzZQorCSAgb2YgLUVOT0VOVCwgdGhlIHNlYXJjaCBjb250ZXh0IGlzIHVwZGF0ZWQgdG8gZGVzY3JpYmUgdGhlIGF0dHJpYnV0ZQorCSAgYmVmb3JlIHdoaWNoIHRoZSBhdHRyaWJ1dGUgYmVpbmcgc2VhcmNoZWQgZm9yIHdvdWxkIG5lZWQgdG8gYmUKKwkgIGluc2VydGVkIGlmIHN1Y2ggYW4gYWN0aW9uIHdlcmUgdG8gYmUgZGVzaXJlZCBhbmQgaW4gdGhlIGNhc2Ugb2YKKwkgIG50ZnNfZXh0ZXJuYWxfYXR0cl9maW5kKCkgdGhlIHNlYXJjaCBjb250ZXh0IGlzIGFsc28gdXBkYXRlZCB0bworCSAgaW5kaWNhdGUgdGhlIGF0dHJpYnV0ZSBsaXN0IGVudHJ5IGJlZm9yZSB3aGljaCB0aGUgYXR0cmlidXRlIGxpc3QKKwkgIGVudHJ5IG9mIHRoZSBhdHRyaWJ1dGUgYmVpbmcgc2VhcmNoZWQgZm9yIHdvdWxkIG5lZWQgdG8gYmUgaW5zZXJ0ZWQKKwkgIGlmIHN1Y2ggYW4gYWN0aW9uIHdlcmUgdG8gYmUgZGVzaXJlZC4gIEFsc28gbWFrZSBudGZzX2ZpbmRfYXR0cigpCisJICBzdGF0aWMgYW5kIHJlbW92ZSBpdHMgcHJvdG90eXBlIGZyb20gYXR0cmliLmggYXMgaXQgaXMgbm90IHVzZWQKKwkgIGFueXdoZXJlIG90aGVyIHRoYW4gYXR0cmliLmMuICBVcGRhdGUgbnRmc19hdHRyX2xvb2t1cCgpIGFuZCBhbGwKKwkgIGNhbGxlcnMgb2YgbnRmc197ZXh0ZXJuYWwsfWF0dHJfe2ZpbmQsbG9va3VwfSgpIGZvciB0aGUgbmV3IHJldHVybgorCSAgdmFsdWVzLgorCS0gTWlub3IgY2xlYW51cCBvZiBmcy9udGZzL2lub2RlLmM6Om50ZnNfaW5pdF9sb2NrZWRfaW5vZGUoKS4KKworMi4xLjE3IC0gRml4IGJ1Z3MgaW4gbW91bnQgdGltZSBlcnJvciBjb2RlIHBhdGhzIGFuZCBvdGhlciB1cGRhdGVzLgorCisJLSBJbXBsZW1lbnQgYml0bWFwIG1vZGlmaWNhdGlvbiBjb2RlIChmcy9udGZzL2JpdG1hcC5baGNdKS4gIFRoaXMKKwkgIGluY2x1ZGVzIGZ1bmN0aW9ucyB0byBzZXQvY2xlYXIgYSBzaW5nbGUgYml0IG9yIGEgcnVuIG9mIGJpdHMuCisJLSBBZGQgZnMvbnRmcy9hdHRyaWIuW2hjXTo6bnRmc19maW5kX3ZjbigpIHdoaWNoIHJldHVybnMgdGhlIGxvY2tlZAorCSAgcnVubGlzdCBlbGVtZW50IGNvbnRhaW5pbmcgYSBwYXJ0aWN1bGFyIHZjbi4gIEl0IGFsc28gdGFrZXMgY2FyZSBvZgorCSAgbWFwcGluZyBhbnkgbmVlZGVkIHJ1bmxpc3QgZnJhZ21lbnRzLgorCS0gSW1wbGVtZW50IGNsdXN0ZXIgKGRlLSlhbGxvY2F0aW9uIGNvZGUgKGZzL250ZnMvbGNuYWxsb2MuW2hjXSkuCisJLSBMb2FkIGF0dHJpYnV0ZSBkZWZpbml0aW9uIHRhYmxlIGZyb20gJEF0dHJEZWYgYXQgbW91bnQgdGltZS4KKwktIEZpeCBidWdzIGluIG1vdW50IHRpbWUgZXJyb3IgY29kZSBwYXRocyBpbnZvbHZpbmcgKGRlKWFsbG9jYXRpb24gb2YKKwkgIHRoZSBkZWZhdWx0IGFuZCB2b2x1bWUgdXBjYXNlIHRhYmxlcy4KKwktIFJlbW92ZSBudGZzX25yX21vdW50cyBhcyBpdCBpcyBubyBsb25nZXIgdXNlZC4KKworMi4xLjE2IC0gSW1wbGVtZW50IGFjY2VzcyB0aW1lIHVwZGF0ZXMsIGZpbGUgc3luYywgYXN5bmMgaW8sIGFuZCByZWFkL3dyaXRldi4KKworCS0gQWRkIHN1cHBvcnQgZm9yIHJlYWR2L3dyaXRldiBhbmQgYWlvX3JlYWQvYWlvX3dyaXRlIChmcy9udGZzL2ZpbGUuYykuCisJICBUaGlzIGlzIGRvbmUgYnkgc2V0dGluZyB0aGUgYXBwcm9wcmlhdGUgZmlsZSBvcGVyYXRpb25zIHBvaW50ZXJzIHRvCisJICB0aGUgZ2VuZXJpYyBoZWxwZXIgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5IG1tL2ZpbGVtYXAuYy4KKwktIEltcGxlbWVudCBmc3luYywgZmRhdGFzeW5jLCBhbmQgbXN5bmMgYm90aCBmb3IgZmlsZXMgKGZzL250ZnMvZmlsZS5jKQorCSAgYW5kIGRpcmVjdG9yaWVzIChmcy9udGZzL2Rpci5jKS4KKwktIEFkZCBzdXBwb3J0IGZvciB7YSxtLGN9dGltZSB1cGRhdGVzIHRvIGlub2RlLmM6Om50ZnNfd3JpdGVfaW5vZGUoKS4KKwkgIE5vdGUsIGV4Y2VwdCBmb3IgdGhlIHJvb3QgZGlyZWN0b3J5IGFuZCBhbnkgb3RoZXIgc3lzdGVtIGZpbGVzIG9wZW5lZAorCSAgYnkgdGhlIHVzZXIsIHRoZSBzeXN0ZW0gZmlsZXMgd2lsbCBub3QgaGF2ZSB0aGVpciBhY2Nlc3MgdGltZXMKKwkgIHVwZGF0ZWQgYXMgdGhleSBhcmUgb25seSBhY2Nlc3NlZCBhdCB0aGUgaW5vZGUgbGV2ZWwgYW4gaGVuY2UgdGhlCisJICBmaWxlIGxldmVsIGZ1bmN0aW9ucyB3aGljaCBjYXVzZSB0aGUgdGltZXMgdG8gYmUgdXBkYXRlZCBhcmUgbmV2ZXIKKwkgIGludm9rZWQuCisKKzIuMS4xNSAtIEludmFsaWRhdGUgcXVvdGFzIHdoZW4gKHJlKW1vdW50aW5nIHJlYWQtd3JpdGUuCisKKwktIEFkZCBuZXcgZWxlbWVudCBpdHlwZS5pbmRleC5jb2xsYXRpb25fcnVsZSB0byB0aGUgbnRmcyBpbm9kZQorCSAgc3RydWN0dXJlIGFuZCBzZXQgaXQgYXBwcm9wcmlhdGVseSBpbiBudGZzX3JlYWRfbG9ja2VkX2lub2RlKCkuCisJLSBJbXBsZW1lbnQgYSBuZXcgaW5vZGUgdHlwZSAiaW5kZXgiIHRvIGFsbG93IGVmZmljaWVudCBhY2Nlc3MgdG8gdGhlCisJICBpbmRpY2VzIGZvdW5kIGluIHZhcmlvdXMgc3lzdGVtIGZpbGVzIGFuZCBhZGFwdCBpbm9kZSBoYW5kbGluZworCSAgYWNjb3JkaW5nbHkgKGZzL250ZnMvaW5vZGUuW2hjXSkuICBBbiBpbmRleCBpbm9kZSBpcyBlc3NlbnRpYWxseSBhbgorCSAgYXR0cmlidXRlIGlub2RlIChOSW5vQXR0cigpIGlzIHRydWUpIHdpdGggYW4gYXR0cmlidXRlIHR5cGUgb2YKKwkgIEFUX0lOREVYX0FMTE9DQVRJT04uICBBcyBzdWNoLCBpdCBpcyBubyBsb25nZXIgYWxsb3dlZCB0byBjYWxsCisJICBudGZzX2F0dHJfaWdldCgpIHdpdGggYW4gYXR0cmlidXRlIHR5cGUgb2YgQVRfSU5ERVhfQUxMT0NBVElPTiBhcworCSAgdGhlcmUgd291bGQgYmUgbm8gd2F5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbm9ybWFsIGF0dHJpYnV0ZSBpbm9kZXMKKwkgIGFuZCBpbmRleCBpbm9kZXMuICBUaGUgZnVuY3Rpb24gdG8gb2J0YWluIGFuIGluZGV4IGlub2RlIGlzCisJICBudGZzX2luZGV4X2lnZXQoKSBhbmQgaXQgdXNlcyB0aGUgaGVscGVyIGZ1bmN0aW9uCisJICBudGZzX3JlYWRfbG9ja2VkX2luZGV4X2lub2RlKCkuICBOb3RlLCB3ZSBkbyBub3Qgb3ZlcmxvYWQKKwkgIG50ZnNfYXR0cl9pZ2V0KCkgYXMgaW5kaWNlcyBjb25zaXN0IG9mIG11bHRpcGxlIGF0dHJpYnV0ZXMgc28gdXNpbmcKKwkgIG50ZnNfYXR0cl9pZ2V0KCkgdG8gb2J0YWluIGFuIGluZGV4IGlub2RlIHdvdWxkIGJlIGNvbmZ1c2luZy4KKwktIEVuc3VyZSB0aGF0IHRoZXJlIGlzIG5vIG92ZXJmbG93IHdoZW4gZG9pbmcgcGFnZS0+aW5kZXggPDwKKwkgIFBBR0VfQ0FDSEVfU0hJRlQgYnkgY2FzdGluZyBwYWdlLT5pbmRleCB0byBzNjQgaW4gZnMvbnRmcy9hb3BzLmMuCisJLSBVc2UgYXRvbWljIGttYXAgaW5zdGVhZCBvZiBrbWFwKCkgaW4gZnMvbnRmcy9hb3BzLmM6Om50ZnNfcmVhZF9wYWdlKCkKKwkgIGFuZCBudGZzX3JlYWRfYmxvY2soKS4KKwktIFVzZSBjYXNlIHNlbnNpdGl2ZSBhdHRyaWJ1dGUgbG9va3VwcyBpbnN0ZWFkIG9mIGNhc2UgaW5zZW5zaXRpdmUgb25lcy4KKwktIExvY2sgYWxsIHBhZ2UgY2FjaGUgcGFnZXMgYmVsb25naW5nIHRvIG1zdCBwcm90ZWN0ZWQgYXR0cmlidXRlcyB3aGlsZQorCSAgYWNjZXNzaW5nIHRoZW0gdG8gZW5zdXJlIHdlIG5ldmVyIHNlZSBjb3JydXB0IGRhdGEgd2hpbGUgdGhlIHBhZ2UgaXMKKwkgIHVuZGVyIHdyaXRlb3V0LgorCS0gQWRkIGZyYW1ld29yayBmb3IgZ2VuZXJpYyBudGZzIGNvbGxhdGlvbiAoZnMvbnRmcy9jb2xsYXRpb24uW2hjXSkuCisJICBXZSBoYXZlIG50ZnNfaXNfY29sbGF0aW9uX3J1bGVfc3VwcG9ydGVkKCkgdG8gY2hlY2sgaWYgdGhlIGNvbGxhdGlvbgorCSAgcnVsZSB5b3Ugd2FudCB0byB1c2UgaXMgc3VwcG9ydGVkIGFuZCBudGZzX2NvbGxhdGlvbigpIHdoaWNoIGFjdHVhbGx5CisJICBjb2xsYXRlcyB0d28gZGF0YSBpdGVtcy4gIFdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgQ09MTEFUSU9OX0JJTkFSWQorCSAgYW5kIENPTExBVElPTl9OVE9GU19VTE9ORyBidXQgc3VwcG9ydCBmb3Igb3RoZXIgY29sbGF0aW9uIHJ1bGVzIHdpbGwKKwkgIGJlIGFkZGVkIGFzIHRoZSBuZWVkIGFyaXNlcy4KKwktIEFkZCBhIG5ldyB0eXBlLCBudGZzX2luZGV4X2NvbnRleHQsIHRvIGFsbG93IHJldHJpZXZhbCBvZiBhbiBpbmRleAorCSAgZW50cnkgdXNpbmcgdGhlIGNvcnJlc3BvbmRpbmcgaW5kZXgga2V5LiAgVG8gZ2V0IGFuIGluZGV4IGNvbnRleHQsCisJICB1c2UgbnRmc19pbmRleF9jdHhfZ2V0KCkgYW5kIHRvIHJlbGVhc2UgaXQsIHVzZSBudGZzX2luZGV4X2N0eF9wdXQoKS4KKwkgIFRoaXMgYWxzbyBhZGRzIGEgbmV3IHNsYWIgY2FjaGUgZm9yIHRoZSBpbmRleCBjb250ZXh0cy4gIFRvIGxvb2t1cCBhCisJICBrZXkgaW4gYW4gaW5kZXggaW5vZGUsIHVzZSBudGZzX2luZGV4X2xvb2t1cCgpLiAgQWZ0ZXIgbW9kaWZ5aW5nIGFuCisJICBpbmRleCBlbnRyeSwgY2FsbCBudGZzX2luZGV4X2VudHJ5X2ZsdXNoX2RjYWNoZV9wYWdlKCkgZm9sbG93ZWQgYnkKKwkgIG50ZnNfaW5kZXhfZW50cnlfbWFya19kaXJ0eSgpIHRvIGVuc3VyZSB0aGUgY2hhbmdlcyBhcmUgd3JpdHRlbiBvdXQKKwkgIHRvIGRpc2suICBGb3IgZGV0YWlscyBzZWUgZnMvbnRmcy9pbmRleC5baGNdLiAgTm90ZSwgYXQgcHJlc2VudCwgaWYKKwkgIGFuIGluZGV4IGVudHJ5IGlzIGluIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSByYXRoZXIgdGhhbiB0aGUKKwkgIGluZGV4IHJvb3QgYXR0cmlidXRlIGl0IHdpbGwgbm90IGJlIHdyaXR0ZW4gb3V0ICh5b3Ugd2lsbCBnZXQgYQorCSAgd2FybmluZyBtZXNzYWdlIGFib3V0IGRpc2NhcmRlZCBjaGFuZ2VzIGluc3RlYWQpLgorCS0gTG9hZCB0aGUgcXVvdGEgZmlsZSAoJFF1b3RhKSBhbmQgY2hlY2sgaWYgcXVvdGEgdHJhY2tpbmcgaXMgZW5hYmxlZAorCSAgYW5kIGlmIHNvLCBtYXJrIHRoZSBxdW90YXMgb3V0IG9mIGRhdGUuICBUaGlzIGNhdXNlcyB3aW5kb3dzIHRvCisJICByZXNjYW4gdGhlIHZvbHVtZSBvbiBib290IGFuZCB1cGRhdGUgYWxsIHF1b3RhIGVudHJpZXMuCisJLSBBZGQgYSBzZXRfcGFnZV9kaXJ0eSBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbiBmb3IgbnRmc19tW2ZzXXRfYW9wcy4KKwkgIEl0IGlzIHNpbXBseSBzZXQgdG8gX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMoKSB0byBtYWtlIHN1cmUgdGhhdAorCSAgcnVubmluZyBzZXRfcGFnZV9kaXJ0eSgpIG9uIGEgcGFnZSBjb250YWluaW5nIG1mdC9udGZzIHJlY29yZHMgd2lsbAorCSAgbm90IGFmZmVjdCB0aGUgZGlydHkgc3RhdGUgb2YgdGhlIHBhZ2UgYnVmZmVycy4KKwktIEFkZCBmcy9udGZzL2luZGV4LmM6Ol9fbnRmc19pbmRleF9lbnRyeV9tYXJrX2RpcnR5KCkgd2hpY2ggc2V0cyBhbGwKKwkgIGJ1ZmZlcnMgdGhhdCBhcmUgaW5zaWRlIHRoZSBudGZzIHJlY29yZCBpbiB0aGUgcGFnZSBkaXJ0eSBhZnRlciB3aGljaAorCSAgaXQgc2V0cyB0aGUgcGFnZSBkaXJ0eS4gIFRoaXMgYWxsb3dzIC0+d3JpdGVwYWdlIHRvIG9ubHkgd3JpdGUgdGhlCisJICBkaXJ0eSBpbmRleCByZWNvcmRzIHJhdGhlciB0aGFuIGhhdmluZyB0byB3cml0ZSBhbGwgdGhlIHJlY29yZHMgaW4KKwkgIHRoZSBwYWdlLiAgTW9kaWZ5IGZzL250ZnMvaW5kZXguaDo6bnRmc19pbmRleF9lbnRyeV9tYXJrX2RpcnR5KCkgdG8KKwkgIHVzZSB0aGlzIHJhdGhlciB0aGFuIF9fc2V0X3BhZ2VfZGlydHlfbm9idWZmZXJzKCkuCisJLSBJbXBsZW1lbnQgZnMvbnRmcy9hb3BzLmM6Om50ZnNfd3JpdGVfbXN0X2Jsb2NrKCkgd2hpY2ggZW5hYmxlcyB0aGUKKwkgIHdyaXRpbmcgb2YgcGFnZSBjYWNoZSBwYWdlcyBiZWxvbmdpbmcgdG8gbXN0IHByb3RlY3RlZCBhdHRyaWJ1dGVzCisJICBsaWtlIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSBpbiBkaXJlY3RvcnkgaW5kaWNlcyBhbmQgb3RoZXIKKwkgIGluZGljZXMgbGlrZSAkUXVvdGEvJFEsIGV0Yy4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgcXVvdGEgaXMgbm93IG1hcmtlZAorCSAgb3V0IG9mIGRhdGUgb24gYWxsIHZvbHVtZXMgcmF0aGVyIHRoYW4gb25seSBvbiBvbmVzIHdoZXJlIHRoZSBxdW90YQorCSAgZGVmYXVsdHMgZW50cnkgaXMgaW4gdGhlIGluZGV4IHJvb3QgYXR0cmlidXRlIG9mIHRoZSAkUXVvdGEvJFEgaW5kZXguCisKKzIuMS4xNCAtIEZpeCBhbiBORlNkIGNhdXNlZCBkZWFkbG9jayByZXBvcnRlZCBieSBzZXZlcmFsIHVzZXJzLgorCisJLSBNb2RpZnkgZnMvbnRmcy9udGZzX3JlYWRkaXIoKSB0byBjb3B5IHRoZSBpbmRleCByb290IGF0dHJpYnV0ZSB2YWx1ZQorCSAgdG8gYSBidWZmZXIgc28gdGhhdCB3ZSBjYW4gcHV0IHRoZSBzZWFyY2ggY29udGV4dCBhbmQgdW5tYXAgdGhlIG1mdAorCSAgcmVjb3JkIGJlZm9yZSBjYWxsaW5nIHRoZSBmaWxsZGlyKCkgY2FsbGJhY2suICBXZSBuZWVkIHRvIGRvIHRoaXMKKwkgIGJlY2F1c2Ugb2YgTkZTZCB3aGljaCBjYWxscyAtPmxvb2t1cCgpIGZyb20gaXRzIGZpbGxkaXIgY2FsbGJhY2soKQorCSAgYW5kIHRoaXMgY2F1c2VzIE5URlMgdG8gZGVhZGxvY2sgYXMgbnRmc19sb29rdXAoKSBtYXBzIHRoZSBtZnQgcmVjb3JkCisJICBvZiB0aGUgZGlyZWN0b3J5IGFuZCBzaW5jZSBudGZzX3JlYWRkaXIoKSBoYXMgZ290IGl0IG1hcHBlZCBhbHJlYWR5CisJICBudGZzX2xvb2t1cCgpIGRlYWRsb2Nrcy4KKworMi4xLjEzIC0gRW5hYmxlIG92ZXJ3cml0aW5nIG9mIHJlc2lkZW50IGZpbGVzIGFuZCBob3VzZWtlZXBpbmcgb2Ygc3lzdGVtIGZpbGVzLgorCisJLSBJbXBsZW1lbnQgd3JpdGluZyBvZiBtZnQgcmVjb3JkcyAoZnMvbnRmcy9tZnQuW2hjXSksIHdoaWNoIGluY2x1ZGVzCisJICBrZWVwaW5nIHRoZSBtZnQgbWlycm9yIGluIHN5bmMgd2l0aCB0aGUgbWZ0IHdoZW4gbWlycm9yZWQgbWZ0IHJlY29yZHMKKwkgIGFyZSB3cml0dGVuLiAgVGhlIGZ1bmN0aW9ucyBhcmUgd3JpdGVfbWZ0X3JlY29yZHssX25vbG9ja30oKS4gIFRoZQorCSAgaW1wbGVtZW50YXRpb24gaXMgcXVpdGUgcnVkaW1lbnRhcnkgZm9yIG5vdyB3aXRoIGxvdHMgb2YgdGhpbmdzIG5vdAorCSAgaW1wbGVtZW50ZWQgeWV0IGJ1dCBJIGFtIG5vdCBzdXJlIGFueSBvZiB0aGVtIGNhbiBhY3R1YWxseSBvY2N1ciBzbworCSAgSSB3aWxsIHdhaXQgZm9yIHBlb3BsZSB0byBoaXQgZWFjaCBvbmUgYW5kIG9ubHkgdGhlbiBpbXBsZW1lbnQgaXQuCisJLSBDb21taXQgb3BlbiBzeXN0ZW0gaW5vZGVzIGF0IHVtb3VudCB0aW1lLiAgVGhpcyBzaG91bGQgbWFrZSBpdAorCSAgdmlydHVhbGx5IGltcG9zc2libGUgZm9yIHN5bmNfbWZ0X21pcnJvcl91bW91bnQoKSB0byBldmVyIGJlIG5lZWRlZC4KKwktIEltcGxlbWVudCAtPndyaXRlX2lub2RlIChmcy9udGZzL2lub2RlLmM6Om50ZnNfd3JpdGVfaW5vZGUoKSkgZm9yIHRoZQorCSAgbnRmcyBzdXBlciBvcGVyYXRpb25zLiAgVGhpcyBnaXZlcyB1cyBpbm9kZSB3cml0aW5nIHZpYSB0aGUgVkZTIGlub2RlCisJICBkaXJ0eSBjb2RlIHBhdGhzLiAgTm90ZTogIEFjY2VzcyB0aW1lIHVwZGF0ZXMgYXJlIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCisJLSBJbXBsZW1lbnQgZnMvbnRmcy9tZnQuW2hjXTo6eyxfX31tYXJrX21mdF9yZWNvcmRfZGlydHkoKSBhbmQgbWFrZQorCSAgZnMvbnRmcy9hb3BzLmM6Om50ZnNfd3JpdGVwYWdlKCkgYW5kIG50ZnNfY29tbWl0X3dyaXRlKCkgdXNlIGl0LCB0aHVzCisJICBmaW5hbGx5IGVuYWJsaW5nIHJlc2lkZW50IGZpbGUgb3ZlcndyaXRlISAgKC04ICBUaGlzIGFsc28gaW5jbHVkZXMgYQorCSAgcGxhY2Vob2xkZXIgZm9yIC0+d3JpdGVwYWdlIChudGZzX21mdF93cml0ZXBhZ2UoKSksIHdoaWNoIGZvciBub3cKKwkgIGp1c3QgcmVkaXJ0aWVzIHRoZSBwYWdlIGFuZCByZXR1cm5zLiAgQWxzbywgYXQgdW1vdW50IHRpbWUsIHdlIGZvcgorCSAgbm93IHRocm93IGF3YXkgYWxsIG1mdCBkYXRhIHBhZ2UgY2FjaGUgcGFnZXMgYWZ0ZXIgdGhlIGxhc3QgY2FsbCB0bworCSAgbnRmc19jb21taXRfaW5vZGUoKSBpbiB0aGUgaG9wZSB0aGF0IGFsbCBpbm9kZXMgd2lsbCBoYXZlIGJlZW4KKwkgIHdyaXR0ZW4gb3V0IGJ5IHRoZW4gYW5kIGhlbmNlIG5vIGRpcnR5IChtZXRhKWRhdGEgd2lsbCBiZSBsb3N0LiAgV2UKKwkgIGFsc28gY2hlY2sgZm9yIHRoaXMgY2FzZSBhbmQgZW1pdCBhbiBlcnJvciBtZXNzYWdlIHRlbGxpbmcgdGhlIHVzZXIKKwkgIHRvIHJ1biBjaGtkc2suCisJLSBVc2Ugc2V0X3BhZ2Vfd3JpdGViYWNrKCkgYW5kIGVuZF9wYWdlX3dyaXRlYmFjaygpIGluIHRoZSByZXNpZGVudAorCSAgYXR0cmlidXRlIGNvZGUgcGF0aCBvZiBmcy9udGZzL2FvcHMuYzo6bnRmc193cml0ZXBhZ2UoKSBvdGhlcndpc2UKKwkgIHRoZSByYWRpeC10cmVlIHRhZyBQQUdFQ0FDSEVfVEFHX0RJUlRZIHJlbWFpbnMgc2V0IGV2ZW4gdGhvdWdoIHRoZQorCSAgcGFnZSBpcyBjbGVhbi4KKwktIEltcGxlbWVudCBudGZzX21mdF93cml0ZXBhZ2UoKSBzbyBpdCBub3cgY2hlY2tzIGlmIGFueSBvZiB0aGUgbWZ0CisJICByZWNvcmRzIGluIHRoZSBwYWdlIGFyZSBkaXJ0eSBhbmQgaWYgc28gcmVkaXJ0aWVzIHRoZSBwYWdlIGFuZAorCSAgcmV0dXJucy4gIE90aGVyd2lzZSBpdCBqdXN0IHJldHVybnMgKGFmdGVyIGRvaW5nIHNldF9wYWdlX3dyaXRlYmFjaygpLAorCSAgdW5sb2NrX3BhZ2UoKSwgZW5kX3BhZ2Vfd3JpdGViYWNrKCkgb3IgdGhlIHJhZGl4LXRyZWUgdGFnCisJICBQQUdFQ0FDSEVfVEFHX0RJUlRZIHJlbWFpbnMgc2V0IGV2ZW4gdGhvdWdoIHRoZSBwYWdlIGlzIGNsZWFuKSwgdGh1cworCSAgYWxvd2luZyB0aGUgVk0gdG8gZG8gd2l0aCB0aGUgcGFnZSBhcyBpdCBwbGVhc2VzLiAgQWxzbywgYXQgdW1vdW50CisJICB0aW1lLCBub3cgb25seSB0aHJvdyBhd2F5IGRpcnR5IG1mdCAobWV0YSlkYXRhIHBhZ2VzIGlmIGRpcnR5IGlub2RlcworCSAgYXJlIHByZXNlbnQgYW5kIGFzayB0aGUgdXNlciB0byBlbWFpbCB1cyBpZiB0aGV5IHNlZSB0aGlzIGhhcHBlbmluZy4KKwktIEFkZCBmdW5jdGlvbnMgbnRmc197Y2xlYXIsc2V0fV92b2x1bWVfZmxhZ3MoKSwgdG8gbW9kaWZ5IHRoZSB2b2x1bWUKKwkgIGluZm9ybWF0aW9uIGZsYWdzIChmcy9udGZzL3N1cGVyLmMpLgorCS0gTWFyayB0aGUgdm9sdW1lIGRpcnR5IHdoZW4gKHJlKW1vdW50aW5nIHJlYWQtd3JpdGUgYW5kIG1hcmsgaXQgY2xlYW4KKwkgIHdoZW4gdW5tb3VudGluZyBvciByZW1vdW50aW5nIHJlYWQtb25seS4gIElmIGFueSB2b2x1bWUgZXJyb3JzIGFyZQorCSAgZm91bmQsIHRoZSB2b2x1bWUgaXMgbGVmdCBtYXJrZWQgZGlydHkgdG8gZm9yY2UgY2hrZHNrIHRvIHJ1bi4KKwktIEFkZCBjb2RlIHRvIHNldCB0aGUgTlQ0IGNvbXBhdGliaWxpdHkgZmxhZyB3aGVuIChyZSltb3VudGluZworCSAgcmVhZC13cml0ZSBmb3IgbmV3ZXIgTlRGUyB2ZXJzaW9ucyBidXQgbGVhdmUgaXQgY29tbWVudGVkIG91dCBmb3Igbm93CisJICBzaW5jZSB3ZSBkbyBub3QgbWFrZSBhbnkgbW9kaWZpY2F0aW9ucyB0aGF0IGFyZSBOVEZTIDEuMiBzcGVjaWZpYyB5ZXQKKwkgIGFuZCBzaW5jZSBzZXR0aW5nIHRoaXMgZmxhZyBicmVha3MgQ2FwdGl2ZS1OVEZTIHdoaWNoIGlzIG5vdCBuaWNlLgorCSAgVGhpcyBjb2RlIG11c3QgYmUgZW5hYmxlZCBvbmNlIHdlIHN0YXJ0IHdyaXRpbmcgTlRGUyAxLjIgc3BlY2lmaWMKKwkgIGNoYW5nZXMgb3RoZXJ3aXNlIFdpbmRvd3MgTlRGUyBkcml2ZXIgbWlnaHQgY3Jhc2ggLyBjYXVzZSBjb3JydXB0aW9uLgorCisyLjEuMTIgLSBGaXggdGhlIHNlY29uZCBmaXggdG8gdGhlIGRlY29tcHJlc3Npb24gZW5naW5lIGFuZCBzb21lIGNsZWFudXBzLgorCisJLSBBZGQgYSBuZXcgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIHN0cnVjdCwgbnRmc19tc3RfYW9wcywgZm9yIG1zdAorCSAgcHJvdGVjdGVkIGF0dHJpYnV0ZXMuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGRlZmF1bHQgbnRmc19hb3BzIGRvIG5vdAorCSAgbWFrZSBzZW5zZSB3aXRoIG1zdCBwcm90ZWN0ZWQgZGF0YSBhbmQgd2VyZSB0aGV5IHRvIHdyaXRlIGFueXRoaW5nIHRvCisJICBzdWNoIGFuIGF0dHJpYnV0ZSB0aGV5IHdvdWxkIGNhdXNlIGRhdGEgY29ycnVwdGlvbiBzbyB3ZSBwcm92aWRlCisJICBudGZzX21zdF9hb3BzIHdoaWNoIGRvZXMgbm90IGhhdmUgYW55IHdyaXRlIHJlbGF0ZWQgb3BlcmF0aW9ucyBzZXQuCisJLSBDbGVhbnVwIGRpcnR5IG50ZnMgaW5vZGUgaGFuZGxpbmcgKGZzL250ZnMvaW5vZGUuW2hjXSkgd2hpY2ggYWxzbworCSAgaW5jbHVkZXMgYW4gYWRhcHRlZCBudGZzX2NvbW1pdF9pbm9kZSgpIGFuZCBhbiBpbXBsZW1lbnRhdGlvbiBvZgorCSAgbnRmc193cml0ZV9pbm9kZSgpIHdoaWNoIGZvciBub3cganVzdCBjbGVhbnMgZGlydHkgaW5vZGVzIHdpdGhvdXQKKwkgIHdyaXRpbmcgdGhlbSAoaXQgZG9lcyBlbWl0IGEgd2FybmluZyB0aGF0IHRoaXMgaXMgaGFwcGVuaW5nKS4KKwktIFVuZG8gdGhlIHNlY29uZCBkZWNvbXByZXNzaW9uIGVuZ2luZSBmaXggKHNlZSAyLjEuOSByZWxlYXNlIENoYW5nZUxvZworCSAgZW50cnkpIGFzIGl0IHdhcyBvbmx5IGZpeGluZyBhIHRoZW9yZXRpY2FsIGJ1ZyBidXQgYXQgdGhlIHNhbWUgdGltZQorCSAgaXQgYmFkbHkgYnJva2UgdGhlIGhhbmRsaW5nIG9mIHNwYXJzZSBhbmQgdW5jb21wcmVzc2VkIGNvbXByZXNzaW9uCisJICBibG9ja3MuCisKKzIuMS4xMSAtIERyaXZlciBpbnRlcm5hbCBjbGVhbnVwcy4KKworCS0gT25seSBidWlsZCBsb2dmaWxlLm8gaWYgYnVpbGRpbmcgdGhlIGRyaXZlciB3aXRoIHJlYWQtd3JpdGUgc3VwcG9ydC4KKwktIFJlYWxseSBmaW5hbCB3aGl0ZSBzcGFjZSBjbGVhbnVwcy4KKwktIFVzZSBnZW5lcmljX2ZmcygpIGluc3RlYWQgb2YgZmZzKCkgaW4gbG9nZmlsZS5jIHdoaWNoIGFsbG93cyB0aGUKKwkgIGxvZ19wYWdlX3NpemUgdmFyaWFibGUgdG8gYmUgb3B0aW1pemVkIGJ5IGdjYyBpbnRvIGEgY29uc3RhbnQuCisJLSBSZW5hbWUgdWNoYXJfdCB0byBudGZzY2hhciBldmVyeXdoZXJlIGFzIHVjaGFyX3QgaXMgdW5zaWduZWQgMS1ieXRlCisJICBjaGFyIGFzIGRlZmluZWQgYnkgUE9TSVggYW5kIGFzIGZvdW5kIG9uIHNvbWUgc3lzdGVtcy4KKworMi4xLjEwIC0gRm9yY2UgcmVhZC1vbmx5IChyZSltb3VudGluZyBvZiB2b2x1bWVzIHdpdGggdW5zdXBwb3J0ZWQgdm9sdW1lIGZsYWdzLgorCisJLSBGaW5pc2ggb2ZmIHRoZSB3aGl0ZSBzcGFjZSBjbGVhbnVwcyAocmVtb3ZlIHRyYWlsaW5nIHNwYWNlcywgZXRjKS4KKwktIENsZWFuIHVwIG50ZnNfZmlsbF9zdXBlcigpIGFuZCBudGZzX3JlYWRfaW5vZGVfbW91bnQoKSBieSByZW1vdmluZworCSAgdGhlIGtsdWRnZXMgYXJvdW5kIHRoZSBmaXJzdCBpZ2V0KCkuICBJbnN0ZWFkIG9mIChyZSlzZXR0aW5nIC0+c19vcAorCSAgd2UgaGF2ZSB0aGUgJE1GVCBpbm9kZSBzZXQgdXAgYnkgZXhwbGljaXQgbmV3X2lub2RlKCkgLyBzZXQgLT5pX2lubyAvCisJICBpbnNlcnRfaW5vZGVfaGFzaCgpIC8gY2FsbCBudGZzX3JlYWRfaW5vZGVfbW91bnQoKSBkaXJlY3RseS4gIFRoaXMKKwkgIGtpbGxzIHRoZSBuZWVkIGZvciBzZWNvbmQgc3VwZXJfb3BlcmF0aW9ucyBhbmQgYWxsb3dzIHRvIHJldHVybiBlcnJvcgorCSAgZnJvbSBudGZzX3JlYWRfaW5vZGVfbW91bnQoKSB3aXRob3V0IHJlc29ydGluZyB0byB1Z2x5ICJwb2lzb25pbmciCisJICB0cmlja3MuICAoQWwgVmlybykKKwktIEZvcmNlIHJlYWQtb25seSAocmUpbW91bnRpbmcgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgYml0cyBhcmUgc2V0IGluCisJICB0aGUgdm9sdW1lIGluZm9ybWF0aW9uIGZsYWdzOgorCSAgCVZPTFVNRV9JU19ESVJUWSwgVk9MVU1FX1JFU0laRV9MT0dfRklMRSwKKwkJVk9MVU1FX1VQR1JBREVfT05fTU9VTlQsIFZPTFVNRV9ERUxFVEVfVVNOX1VOREVSV0FZLAorCQlWT0xVTUVfUkVQQUlSX09CSkVDVF9JRCwgVk9MVU1FX01PRElGSUVEX0JZX0NIS0RTSworCSAgVG8gbWFrZSB0aGlzIGVhc2llciB3ZSBkZWZpbmUgVk9MVU1FX01VU1RfTU9VTlRfUk9fTUFTSyB3aXRoIGFsbCB0aGUKKwkgIGFib3ZlIGJpdHMgc2V0IHNvIHRoZSB0ZXN0IGlzIG1hZGUgZWFzeS4KKworMi4xLjkgLSBGaXggdHdvIGJ1Z3MgaW4gZGVjb21wcmVzc2lvbiBlbmdpbmUuCisKKwktIEZpeCBhIGJ1ZyB3aGVyZSB3ZSB3b3VsZCBub3QgYWx3YXlzIGRldGVjdCB0aGF0IHdlIGhhdmUgcmVhY2hlZCB0aGUKKwkgIGVuZCBvZiBhIGNvbXByZXNzaW9uIGJsb2NrIGJlY2F1c2Ugd2Ugd2VyZSBlbmRpbmcgYXQgbWludXMgb25lIGJ5dGUKKwkgIHdoaWNoIGlzIGVmZmVjdGl2ZWx5IHRoZSBzYW1lIGFzIGJlaW5nIGF0IHRoZSBlbmQuICBUaGUgZml4IGlzIHRvCisJICBjaGVjayB3aGV0aGVyIHRoZSB1bmNvbXByZXNzZWQgYnVmZmVyIGhhcyBiZWVuIGZ1bGx5IGZpbGxlZCBhbmQgaWYgc28KKwkgIHdlIGFzc3VtZSB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3Npb24gYmxvY2suICBBIGJpZworCSAgdGhhbmsgeW91IHRvIE1hcmNpbiBHaWJ1xYJhIGZvciB0aGUgYnVnIHJlcG9ydCwgdGhlIGFzc2lzdGFuY2UgaW4KKwkgIHRyYWNraW5nIGRvd24gdGhlIGJ1ZyBhbmQgdGVzdGluZyB0aGUgZml4LgorCS0gRml4IGEgcG9zc2libGUgYnVnIHdoZXJlIHdoZW4gYSBjb21wcmVzc2VkIHJlYWQgaXMgdHJ1bmNhdGVkIHRvIHRoZQorCSAgZW5kIG9mIHRoZSBmaWxlLCB0aGUgb2Zmc2V0IGluc2lkZSB0aGUgbGFzdCBwYWdlIHdhcyBub3QgdHJ1bmNhdGVkLgorCisyLjEuOCAtIEhhbmRsZSAkTUZUIG1pcnJvciBhbmQgJExvZ0ZpbGUsIGltcHJvdmUgdGltZSBoYW5kbGluZywgYW5kIGNsZWFudXBzLgorCisJLSBVc2UgZ2V0X2JoKCkgaW5zdGVhZCBvZiBtYW51YWwgYXRvbWljX2luYygpIGluIGZzL250ZnMvY29tcHJlc3MuYy4KKwktIE1vZGlmeSBmcy9udGZzL3RpbWUuYzo6bnRmczJ1dGMoKSwgZ2V0X2N1cnJlbnRfbnRmc190aW1lKCksIGFuZAorCSAgdXRjMm50ZnMoKSB0byB3b3JrIHdpdGggc3RydWN0IHRpbWVzcGVjIGluc3RlYWQgb2YgdGltZV90IG9uIHRoZQorCSAgTGludXggVVRDIHRpbWUgc2lkZSB0aHVzIHByZXNlcnZpbmcgdGhlIGZ1bGwgcHJlY2lzaW9uIG9mIHRoZSBOVEZTCisJICB0aW1lIGFuZCBvbmx5IGxvb3NpbmcgdXAgdG8gOTkgbmFuby1zZWNvbmRzIGluIHRoZSBMaW51eCBVVEMgdGltZS4KKwktIE1vdmUgZnMvbnRmcy90aW1lLmMgdG8gZnMvbnRmcy90aW1lLmggYW5kIG1ha2UgdGhlIHRpbWUgZnVuY3Rpb25zCisJICBzdGF0aWMgaW5saW5lLgorCS0gUmVtb3ZlIHVudXNlZCBudGZzX2RpcnR5X2lub2RlKCkuCisJLSBDbGVhbnVwIHN1cGVyIG9wZXJhdGlvbnMgZGVjbGFyYXRpb24gaW4gZnMvbnRmcy9zdXBlci5jLgorCS0gV3JhcCBmbHVzaF9kY2FjaGVfbWZ0X3JlY29yZF9wYWdlKCkgaW4gI2lmZGVmIE5URlNfUlcuCisJLSBBZGQgTklub1Rlc3RTZXRGb28oKSBhbmQgTklub1Rlc3RDbGVhckZvbygpIG1hY3JvIG1hZ2ljIHRvCisJICBmcy9udGZzL2lub2RlLmggYW5kIHVzZSBpdCB0byBkZWNsYXJlIE5Jbm9UZXN0e1NldCxDbGVhcn1EaXJ0eS4KKwktIE1vdmUgdHlwZWRlZnMgZm9yIG50ZnNfYXR0ciBhbmQgdGVzdF90IGZyb20gZnMvbnRmcy9pbm9kZS5jIHRvCisJICBmcy9udGZzL2lub2RlLmggc28gdGhleSBjYW4gYmUgdXNlZCBlbHNld2hlcmUuCisJLSBEZXRlcm1pbmUgdGhlIG1mdCBtaXJyb3Igc2l6ZSBhcyB0aGUgbnVtYmVyIG9mIG1pcnJvcmVkIG1mdCByZWNvcmRzCisJICBhbmQgc3RvcmUgaXQgaW4gbnRmc192b2x1bWUtPm1mdG1pcnJfc2l6ZSAoZnMvbnRmcy9zdXBlci5jKS4KKwktIExvYWQgdGhlIG1mdCBtaXJyb3IgYXQgbW91bnQgdGltZSBhbmQgY29tcGFyZSB0aGUgbWZ0IHJlY29yZHMgc3RvcmVkCisJICBpbiBpdCB0byB0aGUgb25lcyBpbiB0aGUgbWZ0LiAgRm9yY2UgYSByZWFkLW9ubHkgbW91bnQgaWYgdGhlIHR3byBkbworCSAgbm90IG1hdGNoIChmcy9udGZzL3N1cGVyLmMpLgorCS0gRml4IHR5cGUgY2FzdGluZyByZWxhdGVkIHdhcm5pbmdzIG9uIDY0LWJpdCBhcmNoaXRlY3R1cmVzLiAgVGhhbmtzCisJICB0byBNZWVsaXMgUm9vcyBmb3IgcmVwb3J0aW5nIHRoZW0uCisJLSBNb3ZlICVMIHRvICVsbCBhcyAlTCBpcyBmbG9hdGluZyBwb2ludCBhbmQgJWxsIGlzIGludGVnZXIgd2hpY2ggaXMKKwkgIHdoYXQgd2Ugd2FudC4KKwktIFJlYWQgdGhlIGpvdXJuYWwgKCRMb2dGaWxlKSBhbmQgZGV0ZXJtaW5lIGlmIHRoZSB2b2x1bWUgaGFzIGJlZW4KKwkgIHNodXRkb3duIGNsZWFubHkgYW5kIGZvcmNlIGEgcmVhZC1vbmx5IG1vdW50IGlmIG5vdCAoZnMvbnRmcy9zdXBlci5jCisJICBhbmQgZnMvbnRmcy9sb2dmaWxlLmMpLiAgVGhpcyBpcyBhIGxpdHRsZSBiaXQgb2YgYSBjcnVkZSBjaGVjayBpbgorCSAgdGhhdCB3ZSBvbmx5IGxvb2sgYXQgdGhlIHJlc3RhcnQgYXJlYXMgYW5kIG5vdCBhdCB0aGUgYWN0dWFsIGxvZworCSAgcmVjb3JkcyBzbyB0aGF0IHRoZXJlIHdpbGwgYmUgYSB2ZXJ5IHNtYWxsIG51bWJlciBvZiBjYXNlcyB3aGVyZSB3ZQorCSAgdGhpbmsgdGhhdCBhIHZvbHVtZSBpcyBkaXJ0eSB3aGVuIGluIGZhY3QgaXQgaXMgY2xlYW4uICBUaGlzIHNob3VsZAorCSAgb25seSBhZmZlY3Qgdm9sdW1lcyB0aGF0IGhhdmUgbm90IGJlZW4gc2h1dGRvd24gY2xlYW5seSBhbmQgZGlkIG5vdAorCSAgaGF2ZSBhbnkgcGVuZGluZywgbm9uLWNoZWNrLXBvaW50ZWQgaS9vLgorCS0gSWYgdGhlICRMb2dGaWxlIGluZGljYXRlcyBhIGNsZWFuIHNodXRkb3duIGFuZCBhIHJlYWQtd3JpdGUgKHJlKW1vdW50CisJICBpcyByZXF1ZXN0ZWQsIGVtcHR5ICRMb2dGaWxlIGJ5IG92ZXJ3cml0aW5nIGl0IHdpdGggMHhmZiBieXRlcyB0bworCSAgZW5zdXJlIHRoYXQgV2luZG93cyBjYW5ub3QgY2F1c2UgZGF0YSBjb3JydXB0aW9uIGJ5IHJlcGxheWluZyBhIHN0YWxlCisJICBqb3VybmFsIGFmdGVyIExpbnV4IGhhcyB3cml0dGVuIHRvIHRoZSB2b2x1bWUuCisKKzIuMS43IC0gRW5hYmxlIE5GUyBleHBvcnRpbmcgb2YgbW91bnRlZCBOVEZTIHZvbHVtZXMuCisKKwktIFNldCBpX2dlbmVyYXRpb24gaW4gdGhlIFZGUyBpbm9kZSBmcm9tIHRoZSBzZXFfbm8gb2YgdGhlIE5URlMgaW5vZGUuCisJLSBNYWtlIG50ZnNfbG9va3VwKCkgTkZTIGV4cG9ydCBzYWZlLCBpLmUuIHVzZSBkX3NwbGljZV9hbGlhcygpLCBldGMuCisJLSBJbXBsZW1lbnQgLT5nZXRfZGVudHJ5KCkgaW4gZnMvbnRmcy9uYW1laS5jOjpudGZzX2dldF9kZW50cnkoKSBhcyB0aGUKKwkgIGRlZmF1bHQgZG9lc24ndCBhbGxvdyBpbm9kZSBudW1iZXIgMCB3aGljaCBpcyBhIHZhbGlkIGlub2RlIG9uIE5URlMKKwkgIGFuZCBldmVuIGlmIGl0IGRpZCBhbGxvdyB0aGF0IGl0IHVzZXMgaWdldCgpIGluc3RlYWQgb2YgbnRmc19pZ2V0KCkKKwkgIHdoaWNoIG1ha2VzIGl0IHVzZWxlc3MgZm9yIHVzLgorCS0gSW1wbGVtZW50IC0+Z2V0X3BhcmVudCgpIGluIGZzL250ZnMvbmFtZWkuYzo6bnRmc19nZXRfcGFyZW50KCkgYXMgdGhlCisJICBkZWZhdWx0IGp1c3QgcmV0dXJucyAtRUFDQ0VTIHdoaWNoIGlzIG5vdCB2ZXJ5IHVzZWZ1bC4KKwktIERlZmluZSBleHBvcnQgb3BlcmF0aW9ucyAoLT5zX2V4cG9ydF9vcCkgZm9yIE5URlMgKG50ZnNfZXhwb3J0X29wcykKKwkgIGFuZCBzZXQgdGhlbSB1cCBpbiB0aGUgc3VwZXIgYmxvY2sgYXQgbW91bnQgdGltZSAoc3VwZXIuYykgdGhpcworCSAgYWxsb3dzIG1vdW50ZWQgTlRGUyB2b2x1bWVzIHRvIGJlIGV4cG9ydGVkIHZpYSBORlMuCisJLSBBZGQgbWlzc2luZyByZXR1cm4gLUVPUE5PVFNVUFA7IGluCisJICBmcy9udGZzL2FvcHMuYzo6bnRmc19jb21taXRfbm9ucmVzaWRlbnRfd3JpdGUoKS4KKwktIEVuZm9yY2Ugbm8gYXRpbWUgYW5kIG5vIGRpciBhdGltZSB1cGRhdGVzIGF0IG1vdW50L3JlbW91bnQgdGltZSBhcworCSAgdGhleSBhcmUgbm90IGltcGxlbWVudGVkIHlldCBhbnl3YXkuCisJLSBNb3ZlIGEgZmV3IGFzc2lnbm1lbnRzIGluIGZzL250ZnMvYXR0cmliLmM6OmxvYWRfYXR0cmlidXRlX2xpc3QoKSB0bworCSAgYWZ0ZXIgYSBOVUxMIGNoZWNrLiAgVGhhbmtzIHRvIERhdmUgSm9uZXMgZm9yIHBvaW50aW5nIHRoaXMgb3V0LgorCisyLjEuNiAtIEZpeCBtaW5vciBidWcgaW4gaGFuZGxpbmcgb2YgY29tcHJlc3NlZCBkaXJlY3Rvcmllcy4KKworCS0gRml4IGJ1ZyBpbiBoYW5kbGluZyBvZiBjb21wcmVzc2VkIGRpcmVjdG9yaWVzLiAgQSBjb21wcmVzc2VkCisJICBkaXJlY3RvcnkgaXMgbm90IHJlYWxseSBjb21wcmVzc2VkIHNvIHdoZW4gd2Ugc2V0IHRoZSAtPmlfYmxvY2tzCisJICBmaWVsZCBvZiBhIGNvbXByZXNzZWQgZGlyZWN0b3J5IGlub2RlIHdlIHdlcmUgc2V0dGluZyBpdCBmcm9tIHRoZQorCSAgbm9uLWV4aXN0aW5nIGZpZWxkIG5pLT5pdHlwZS5jb21wcmVzc2VkLnNpemUgd2hpY2ggZ2F2ZSByYW5kb20KKwkgIHJlc3VsdHMuLi4gIEZvciBkaXJlY3RvcmllcyB3ZSBub3cgYWx3YXlzIHVzZSBuaS0+YWxsb2NhdGVkX3NpemUuCisKKzIuMS41IC0gRml4IG1pbm9yIGJ1ZyBpbiBhdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgaGFuZGxpbmcuCisKKwktIEZpeCBidWcgaW4gYXR0cmlidXRlIGxpc3QgaGFuZGxpbmcuICBBY3R1YWxseSBpdCBpcyBub3QgYXMgbXVjaCBhIGJ1ZworCSAgYXMgdG9vIG11Y2ggcHJvdGVjdGlvbiBpbiB0aGF0IHdlIHdlcmUgbm90IGFsbG93aW5nIGF0dHJpYnV0ZSBsaXN0cworCSAgd2hpY2ggd2FzdGUgc3BhY2Ugb24gZGlzayB3aGlsZSBXaW5kb3dzIFhQIGNsZWFybHkgYWxsb3dzIGl0IGFuZCBpbgorCSAgZmFjdCBjcmVhdGVzIHN1Y2ggYXR0cmlidXRlIGxpc3RzIHNvIG91ciBkcml2ZXIgd2FzIGZhaWxpbmcuCisJLSBVcGRhdGUgTlRGUyBkb2N1bWVudGF0aW9uIHJlYWR5IGZvciAyLjYga2VybmVsIHJlbGVhc2UuCisKKzIuMS40IC0gUmVkdWNlIGNvbXBpbGVyIHJlcXVpcmVtZW50cy4KKworCS0gUmVtb3ZlIGFsbCB1c2VzIG9mIHVubmFtZWQgc3RydWN0cyBhbmQgdW5pb25zIGluIHRoZSBkcml2ZXIgdG8gbWFrZQorCSAgb2xkIGFuZCBuZXdlciBnY2MgdmVyc2lvbnMgaGFwcHkuIE1ha2VzIGl0IGEgYml0IHVnbGllciBJTU8gYnV0IGF0CisJICBsZWFzdCBwZW9wbGUgd2lsbCBzdG9wIGhhc3NsaW5nIG1lIGFib3V0IGl0LgorCisyLjEuMyAtIEltcG9ydGFudCBidWcgZml4ZXMgaW4gY29ybmVyIGNhc2VzLgorCisJLSBzdXBlci5jOjpwYXJzZV9udGZzX2Jvb3Rfc2VjdG9yKCk6IENvcnJlY3QgdGhlIGNoZWNrIGZvciA2NC1iaXQKKwkgIGNsdXN0ZXJzLiAoUGhpbGlwcCBUaG9tYXMpCisJLSBhdHRyaWIuYzo6bG9hZF9hdHRyaWJ1dGVfbGlzdCgpOiBGaXggYnVnIHdoZW4gaW5pdGlhbGl6ZWRfc2l6ZSBpcyBhCisJICBtdWx0aXBsZSBvZiB0aGUgYmxvY2tfc2l6ZSBidXQgbm90IHRoZSBjbHVzdGVyIHNpemUuIChTemFib2xjcworCSAgU3pha2Fjc2l0cyA8c3pha2FAc2llbmV0Lmh1PikKKworMi4xLjIgLSBJbXBvcnRhbnQgYnVnIGZpeGVzIGFsZXZpYXRpbmcgdGhlIGhhbmdzIGluIHN0YXRmcy4KKworCS0gRml4IGJ1Z2d5IGZyZWUgY2x1c3RlciBhbmQgZnJlZSBpbm9kZSBkZXRlcm1pbmF0aW9uIGxvZ2ljLgorCisyLjEuMSAtIE1pbm9yIHVwZGF0ZXMuCisKKwktIEFkZCBoYW5kbGluZyBmb3IgaW5pdGlhbGl6ZWRfc2l6ZSAhPSBkYXRhX3NpemUgaW4gY29tcHJlc3NlZCBmaWxlcy4KKwktIFJlZHVjZSBmdW5jdGlvbiBsb2NhbCBzdGFjayB1c2FnZSBmcm9tIDB4M2Q0IGJ5dGVzIHRvIGp1c3Qgbm9pc2UgaW4KKwkgIGZzL250ZnMvdXBjYXNlLmMuIChSYW5keSBEdW5sYXAgPHJkZHVubGFwQG9zZGwub3JkPikKKwktIFJlbW92ZSBjb21waWxlciB3YXJuaW5ncyBmb3IgbmV3ZXIgZ2NjLgorCS0gUGFnZXMgYXJlIG5vIGxvbmdlciBrbWFwcGVkIGJ5IG1tL2ZpbGVtYXAuYzo6Z2VuZXJpY19maWxlX3dyaXRlKCkKKwkgIGFyb3VuZCBjYWxscyB0byAtPntwcmVwYXJlLGNvbW1pdH1fd3JpdGUuICBBZGFwdCBOVEZTIGFwcHJvcHJpYXRlbHkKKwkgIGluIGZzL250ZnMvYW9wcy5jOjpudGZzX3ByZXBhcmVfbm9ucmVzaWRlbnRfd3JpdGUoKSBieSB1c2luZworCSAga21hcF9hdG9taWMoS01fVVNFUjApLgorCisyLjEuMCAtIEZpcnN0IHN0ZXBzIHRvd2FyZHMgd3JpdGUgc3VwcG9ydDogaW1wbGVtZW50IGZpbGUgb3ZlcndyaXRlLgorCisJLSBBZGQgY29uZmlndXJhdGlvbiBvcHRpb24gZm9yIGRldmVsb3BtZW50YWwgd3JpdGUgc3VwcG9ydCB3aXRoIGFuCisJICBhcHByb3ByaWF0ZWx5IHNjYXJ5IGNvbmZpZ3VyYXRpb24gaGVscCB0ZXh0LgorCS0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBmcy9udGZzL2FvcHMuYzo6bnRmc193cml0ZXBhZ2UoKSBhbmQgaXRzCisJICBoZWxwZXIgZnMvbnRmcy9hb3BzLmM6Om50ZnNfd3JpdGVfYmxvY2soKS4gVGhpcyBlbmFibGVzIG1tYXAoMikgYmFzZWQKKwkgIG92ZXJ3cml0aW5nIG9mIGV4aXN0aW5nIGZpbGVzIG9uIG50ZnMuIE5vdGU6IFJlc2lkZW50IGZpbGVzIGFyZQorCSAgb25seSB3cml0dGVuIGludG8gbWVtb3J5LCBhbmQgbm90IHdyaXR0ZW4gb3V0IHRvIGRpc2sgYXQgcHJlc2VudCwgc28KKwkgIGF2b2lkIHdyaXRpbmcgdG8gZmlsZXMgc21hbGxlciB0aGFuIGFib3V0IDFraUIuCisJLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIG9mIGZzL250ZnMvYW9wcy5jOjpudGZzX3ByZXBhcmVfd3JpdGUoKSwgaXRzCisJICBoZWxwZXIgZnMvbnRmcy9hb3BzLmM6Om50ZnNfcHJlcGFyZV9ub25yZXNpZGVudF93cml0ZSgpIGFuZCB0aGVpcgorCSAgY291bnRlcnBhcnRzLCBmcy9udGZzL2FvcHMuYzo6bnRmc19jb21taXRfd3JpdGUoKSwgYW5kCisJICBmcy9udGZzL2FvcHMuYzo6bnRmc19jb21taXRfbm9ucmVzaWRlbnRfd3JpdGUoKSwgcmVzcGVjdGl2ZWx5LiBBbHNvLAorCSAgYWRkIGdlbmVyaWNfZmlsZV93cml0ZSgpIHRvIHRoZSBudGZzIGZpbGUgb3BlcmF0aW9ucyAoZnMvbnRmcy9maWxlLmMpLgorCSAgVGhpcyBlbmFibGVzIHdyaXRlKDIpIGJhc2VkIG92ZXJ3cml0aW5nIG9mIGV4aXN0aW5nIGZpbGVzIG9uIG50ZnMuCisJICBOb3RlOiBBcyB3aXRoIG1tYXAoMikgYmFzZWQgb3ZlcndyaXRpbmcsIHJlc2lkZW50IGZpbGVzIGFyZSBvbmx5CisJICB3cml0dGVuIGludG8gbWVtb3J5LCBhbmQgbm90IHdyaXR0ZW4gb3V0IHRvIGRpc2sgYXQgcHJlc2VudCwgc28gYXZvaWQKKwkgIHdyaXRpbmcgdG8gZmlsZXMgc21hbGxlciB0aGFuIGFib3V0IDFraUIuCisJLSBJbXBsZW1lbnQgLT50cnVuY2F0ZSAoZnMvbnRmcy9pbm9kZS5jOjpudGZzX3RydW5jYXRlKCkpIGFuZAorCSAgLT5zZXRhdHRyKCkgKGZzL250ZnMvaW5vZGUuYzo6bnRmc19zZXRhdHRyKCkpIGlub2RlIG9wZXJhdGlvbnMgZm9yCisJICBmaWxlcyB3aXRoIHRoZSBwdXJwb3NlIG9mIGludGVyY2VwdGluZyBhbmQgYWJvcnRpbmcgYWxsIGlfc2l6ZQorCSAgY2hhbmdlcyB3aGljaCB3ZSBkbyBub3Qgc3VwcG9ydCB5ZXQuIG50ZnNfdHJ1bmNhdGUoKSBhY3R1YWxseSBvbmx5CisJICBlbWl0cyBhIHdhcm5pbmcgbWVzc2FnZSBidXQgQUZBSUNTIG91ciBpbnRlcmNlcHRpb24gb2YgaV9zaXplIGNoYW5nZXMKKwkgIGVsc2V3aGVyZSBtZWFucyBudGZzX3RydW5jYXRlKCkgbmV2ZXIgZ2V0cyBjYWxsZWQgZm9yIGlfc2l6ZSBjaGFuZ2VzLgorCSAgSXQgaXMgb25seSBjYWxsZWQgZnJvbSBnZW5lcmljX2ZpbGVfd3JpdGUoKSB3aGVuIHdlIGZhaWwgaW4KKwkgIG50ZnNfcHJlcGFyZV97LG5vbnJlc2lkZW50X313cml0ZSgpIGluIG9yZGVyIHRvIGRpc2NhcmQgYW55CisJICBpbnN0YW50aWF0ZWQgYnVmZmVycyBiZXlvbmQgaV9zaXplLiBUaHVzIGlfc2l6ZSBpcyBub3QgYWN0dWFsbHkKKwkgIGNoYW5nZWQgc28gb3VyIHdhcm5pbmcgbWVzc2FnZSBpcyBlbm91Z2guIFVuZm9ydHVuYXRlbHkgaXQgaXMgbm90CisJICBwb3NzaWJsZSB0byBlYXNpbHkgZGV0ZXJtaW5lIGlmIGlfc2l6ZSBpcyBiZWluZyBjaGFuZ2VkIG9yIG5vdCBoZW5jZQorCSAgd2UganVzdCBlbWl0IGFuIGFwcHJvcHJpYXRlbHkgd29yZGVkIGVycm9yIG1lc3NhZ2UuCisKKzIuMC4yNSAtIFNtYWxsIGJ1ZyBmaXhlcyBhbmQgY2xlYW51cHMuCisKKwktIFVubG9jayB0aGUgcGFnZSBpbiBhbiBvdXQgb2YgbWVtb3J5IGVycm9yIGNvZGUgcGF0aCBpbgorCSAgZnMvbnRmcy9hb3BzLmM6Om50ZnNfcmVhZF9ibG9jaygpLgorCS0gSWYgZnMvbnRmcy9hb3BzLmM6Om50ZnNfcmVhZF9wYWdlKCkgaXMgY2FsbGVkIG9uIGFuIHVwdG9kYXRlIHBhZ2UsCisJICBqdXN0IHVubG9jayB0aGUgcGFnZSBhbmQgcmV0dXJuLiAoVGhpcyBjYW4gaGFwcGVuIGR1ZSB0byAtPndyaXRlcGFnZQorCSAgY2xlYXJpbmcgUGFnZVVwdG9kYXRlKCkgZHVyaW5nIHdyaXRlIG91dCBvZiBNc3RQcm90ZWN0ZWQoKQorCSAgYXR0cmlidXRlcy4KKwktIFJlbW92ZSBsZWFrZWQgd3JpdGUgY29kZSBhZ2Fpbi4KKworMi4wLjI0IC0gQ2xlYW51cHMuCisKKwktIFRyZWF0IEJVR19PTigpIGFzIEFTU0VSVCgpIG5vdCBWRVJJRlkoKSwgaS5lLiBkbyBub3QgdXNlIHNpZGUgZWZmZWN0cworCSAgaW5zaWRlIEJVR19PTigpLiAoQWRhbSBKLiBSaWNodGVyKQorCS0gU3BsaXQgbG9naWNhbCBPUiBleHByZXNzaW9ucyBpbnNpZGUgQlVHX09OKCkgaW50byBpbmRpdmlkdWFsIEJVR19PTigpCisJICBjYWxscyBmb3IgaW1wcm92ZWQgZGVidWdnaW5nLiAoQWRhbSBKLiBSaWNodGVyKQorCS0gQWRkIGVycm9ycyBmbGFnIHRvIHRoZSBudGZzIHZvbHVtZSBzdGF0ZSwgYWNjZXNzZWQgdmlhCisJICBOVm9seyxTZXQsQ2xlYXJ9RXJyb3JzKHZvbCkuCisJLSBEbyBub3QgYWxsb3cgcmVhZC13cml0ZSByZW1vdW50cyBvZiByZWFkLW9ubHkgdm9sdW1lcyB3aXRoIGVycm9ycy4KKwktIENsYXJpZnkgY29tbWVudCBmb3IgbnRmcyBmaWxlIG9wZXJhdGlvbiBzZW5kZmlsZSB3aGljaCB3YXMgYWRkZWQgYnkKKwkgIENocmlzdG9waCBIZWxsd2lnIGEgd2hpbGUgYWdvIChqdXN0IHVzaW5nIGdlbmVyaWNfZmlsZV9zZW5kZmlsZSgpKQorCSAgdG8gc2F5IHRoYXQgbnRmcyAtPnNlbmRmaWxlIGlzIG9ubHkgdXNlZCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlCisJICBzb3VyY2UgZGF0YSBpcyBvbiB0aGUgbnRmcyBwYXJ0aXRpb24gYW5kIHRoZSBkZXN0aW5hdGlvbiBpcworCSAgc29tZXdoZXJlIGVsc2UsIGkuZS4gbm90aGluZyB3ZSBuZWVkIHRvIGNvbmNlcm4gb3Vyc2VsdmVzIHdpdGguCisJLSBBZGQgZ2VuZXJpY19maWxlX3dyaXRlKCkgYXMgb3VyIG50ZnMgZmlsZSB3cml0ZSBvcGVyYXRpb24uCisKKzIuMC4yMyAtIE1ham9yIGJ1ZyBmaXhlcyAocmFjZXMsIGRlYWRsb2Nrcywgbm9uLWkzODYgYXJjaGl0ZWN0dXJlcykuCisKKwktIE1hc3NpdmUgaW50ZXJuYWwgbG9ja2luZyBjaGFuZ2VzIHRvIG1mdCByZWNvcmQgbG9ja2luZy4gRml4ZXMgbG9jaworCSAgcmVjdXJzaW9uIGFuZCByZXBsYWNlcyB0aGUgbXJlY19sb2NrIHJlYWQvd3JpdGUgc2VtYXBob3JlIHdpdGggYQorCSAgbXV0ZXguIEFsc28gcmVtb3ZlcyB0aGUgbm93IHN1cGVyZmx1b3VzIG1mdF9jb3VudC4gVGhpcyBmaXhlcyBzZXZlcmFsCisJICByYWNlIGNvbmRpdGlvbnMgYW5kIGRlYWRsb2NrcywgZXNwZWNpYWxseSBpbiB0aGUgZnV0dXJlIHdyaXRlIGNvZGUuCisJLSBGaXggbnRmcyBvdmVyIGxvb3BiYWNrIGZvciBjb21wcmVzc2VkIGZpbGVzIGJ5IGFkZGluZyBhbgorCSAgb3B0aW1pemF0aW9uIGJhcnJpZXIuIChnY2Mgd2FzIHNjcmV3aW5nIHVwIG90aGVyd2lzZSA/KQorCS0gTWlzY2VsbGFuZW91cyBjbGVhbnVwcyBhbGwgb3ZlciB0aGUgY29kZSBhbmQgYSBmaXggb3IgdHdvIGluIGVycm9yCisJICBoYW5kbGluZyBjb2RlIHBhdGhzLgorCVRoYW5rcyBnbyB0byBDaHJpc3RvcGggSGVsbHdpZyBmb3IgcG9pbnRpbmcgb3V0IHRoZSBmb2xsb3dpbmcgdHdvOgorCS0gUmVtb3ZlIG5vdyB1bnVzZWQgZnVuY3Rpb24gZnMvbnRmcy9tYWxsb2MuaDo6dm1hbGxvY19ub2ZzKCkuCisJLSBGaXggbnRmc19mcmVlKCkgZm9yIGlhNjQgYW5kIHBhcmlzYyBieSBjaGVja2luZyBmb3IgVk1BTExPQ19FTkQsIHRvby4KKworMi4wLjIyIC0gQ2xlYW51cHMsIG1haW5seSB0byBudGZzX3JlYWRkaXIoKSwgYW5kIHVzZSBDOTkgaW5pdGlhbGl6ZXJzLgorCisJLSBDaGFuZ2UgZnMvbnRmcy9kaXIuYzo6bnRmc19yZWRkaXIoKSB0byBvbmx5IHJlYWQvd3JpdGUgLT5mX3BvcyBvbmNlCisJICBhdCBlbnRyeS9leGl0IHJlc3BlY3RpdmVseS4KKwktIFVzZSBDOTkgaW5pdGlhbGl6ZXJzIGZvciBzdHJ1Y3R1cmVzLgorCS0gUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBibG9ja3MgZnJvbSBmcy9udGZzL2FvcHMuYzo6bnRmc19yZWFkX2Jsb2NrKCkuCisKKzIuMC4yMSAtIENoZWNrIGZvciwgYW5kIHJlZnVzZSB0byB3b3JrIHdpdGggdG9vIGxhcmdlIGZpbGVzL2RpcmVjdG9yaWVzL3ZvbHVtZXMuCisKKwktIExpbWl0IHZvbHVtZSBzaXplIGF0IG1vdW50IHRpbWUgdG8gMlRpQiBvbiBhcmNoaXRlY3R1cmVzIHdoZXJlCisJICB1bnNpZ25lZCBsb25nIGlzIDMyLWJpdHMgKGZzL250ZnMvc3VwZXIuYzo6cGFyc2VfbnRmc19ib290X3NlY3RvcigpKS4KKwkgIFRoaXMgaXMgdGhlIG1vc3Qgd2UgY2FuIGRvIHdpdGhvdXQgb3ZlcmZsb3dpbmcgdGhlIDMyLWJpdCBsaW1pdCBvZgorCSAgdGhlIGJsb2NrIGRldmljZSBzaXplIGltcG9zZWQgb24gdXMgYnkgc2JfYnJlYWQoKSBhbmQgc2JfZ2V0YmxrKCkKKwkgIGZvciB0aGUgdGltZSBiZWluZy4KKwktIExpbWl0IGZpbGUvZGlyZWN0b3J5IHNpemUgYXQgb3BlbigpIHRpbWUgdG8gMTZUaUIgb24gYXJjaGl0ZWN0dXJlcworCSAgd2hlcmUgdW5zaWduZWQgbG9uZyBpcyAzMi1iaXRzIChmcy9udGZzL2ZpbGUuYzo6bnRmc19maWxlX29wZW4oKSBhbmQKKwkgIGZzL250ZnMvZGlyLmM6Om50ZnNfZGlyX29wZW4oKSkuIFRoaXMgaXMgdGhlIG1vc3Qgd2UgY2FuIGRvIHdpdGhvdXQKKwkgIG92ZXJmbG93aW5nIHRoZSBwYWdlIGNhY2hlIHBhZ2UgaW5kZXguCisKKzIuMC4yMCAtIFN1cHBvcnQgbm9uLXJlc2lkZW50IGRpcmVjdG9yeSBpbmRleCBiaXRtYXBzLCBmaXggcGFnZSBsZWFrIGluIHJlYWRkaXIuCisKKwktIE1vdmUgdGhlIGRpcmVjdG9yeSBpbmRleCBiaXRtYXAgdG8gdXNlIGFuIGF0dHJpYnV0ZSBpbm9kZSBpbnN0ZWFkIG9mCisJICBoYXZpbmcgc3BlY2lhbCBmaWVsZHMgZm9yIGl0IGluc2lkZSB0aGUgbnRmcyBpbm9kZSBzdHJ1Y3R1cmUuIFRoaXMKKwkgIG1lYW5zIHRoYXQgdGhlIGluZGV4IGJpdG1hcHMgbm93IHVzZSB0aGUgcGFnZSBjYWNoZSBmb3IgaS9vLCB0b28sCisJICBhbmQgYWxzbyBhcyBhIHNpZGUgZWZmZWN0IHdlIGdldCBzdXBwb3J0IGZvciBub24tcmVzaWRlbnQgaW5kZXgKKwkgIGJpdG1hcHMgZm9yIGZyZWUuCisJLSBTaW1wbGlmeS9jbGVhbnVwIGVycm9yIGhhbmRsaW5nIGluIGZzL250ZnMvZGlyLmM6Om50ZnNfcmVhZGRpcigpIGFuZAorCSAgZml4IGEgcGFnZSBsZWFrIHRoYXQgbWFuaWZlc3RlZCBpdHNlbGYgaW4gc29tZSBjYXNlcy4KKwktIEFkZCBmcy9udGZzL2lub2RlLmM6Om50ZnNfcHV0X2lub2RlKCksIHdoaWNoIHdlIG5lZWQgdG8gcmVsZWFzZSB0aGUKKwkgIGluZGV4IGJpdG1hcCBpbm9kZSBvbiB0aGUgZmluYWwgaXB1dCgpLgorCisyLjAuMTkgLSBGaXggcmFjZSBjb25kaXRpb24sIGltcHJvdmVtZW50cywgYW5kIG9wdGltaXphdGlvbnMgaW4gaS9vIGludGVyZmFjZS4KKworCS0gQXBwbHkgYmxvY2sgb3B0aW1pemF0aW9uIGFkZGVkIHRvIGZzL250ZnMvYW9wcy5jOjpudGZzX3JlYWRfYmxvY2soKQorCSAgdG8gZnMvbnRmcy9jb21wcmVzcy5jOjpudGZzX2ZpbGVfcmVhZF9jb21wcmVzc2VkX2Jsb2NrKCkgYXMgd2VsbC4KKwktIERyb3AgdGhlICJmaWxlIiBmcm9tIG50ZnNfZmlsZV9yZWFkX2NvbXByZXNzZWRfYmxvY2soKS4KKwktIFJlbmFtZSBmcy9udGZzL2FvcHMuYzo6bnRmc19lbmJfYnVmZmVyX3JlYWRfYXN5bmMoKSB0bworCSAgbnRmc19lbmRfYnVmZmVyX2FzeW5jX3JlYWQoKSAobW9yZSBsaWtlIHRoZSBmcy9idWZmZXIuYyBjb3VudGVycGFydCkuCisJLSBVcGRhdGUgbnRmc19lbmRfYnVmZmVyX2FzeW5jX3JlYWQoKSB3aXRoIHRoZSBpbXByb3ZlZCBsb2dpYyBmcm9tCisJICBpdHMgdXBkYXRlZCBjb3VudGVycGFydCBmcy9idWZmZXIuYzo6ZW5kX2J1ZmZlcl9hc3luY19yZWFkKCkuIEFwcGx5CisJICBmdXJ0aGVyIGxvZ2ljIGltcHJvdmVtZW50cyB0byBiZXR0ZXIgZGV0ZXJtaW5lIHdoZW4gd2Ugc2V0IFBhZ2VFcnJvci4KKwktIFVwZGF0ZSBzdWJtaXNzaW9uIG9mIGJ1ZmZlcnMgaW4gZnMvbnRmcy9hb3BzLmM6Om50ZnNfcmVhZF9ibG9jaygpIHRvCisJICBjaGVjayBmb3IgdGhlIGJ1ZmZlcnMgYmVpbmcgdXB0b2RhdGUgZmlyc3QgaW4gbGluZSB3aXRoIHRoZSB1cGRhdGVkCisJICBmcy9idWZmZXIuYzo6YmxvY2tfcmVhZF9mdWxsX3BhZ2UoKS4gVGhpcyBwbHVncyBhIHNtYWxsIHJhY2UKKwkgIGNvbmRpdGlvbi4KKworMi4wLjE4IC0gRml4IHJhY2UgY29uZGl0aW9uIGluIHJlYWRpbmcgb2YgY29tcHJlc3NlZCBmaWxlcy4KKworCS0gVGhlcmUgd2FzIGEgbmFycm93IHdpbmRvdyBiZXR3ZWVuIGNoZWNraW5nIGEgYnVmZmVyIGhlYWQgZm9yIGJlaW5nCisJICB1cHRvZGF0ZSBhbmQgbG9ja2luZyBpdCBpbiBudGZzX2ZpbGVfcmVhZF9jb21wcmVzc2VkX2Jsb2NrKCkuIFdlIG5vdworCSAgbG9jayB0aGUgYnVmZmVyIGFuZCB0aGVuIGNoZWNrIHdoZXRoZXIgaXQgaXMgdXB0b2RhdGUgb3Igbm90LgorCisyLjAuMTcgLSBDbGVhbnVwcyBhbmQgb3B0aW1pemF0aW9ucyAtIHNocmlua2luZyB0aGUgVG9EbyBsaXN0LgorCisJLSBNb2RpZnkgZnMvbnRmcy9pbm9kZS5jOjpudGZzX3JlYWRfbG9ja2VkX2lub2RlKCkgdG8gcmV0dXJuIGFuIGVycm9yCisJICBjb2RlIGFuZCB1cGRhdGUgY2FsbGVycywgaS5lLiBudGZzX2lnZXQoKSwgdG8gcGFzcyB0aGF0IGVycm9yIGNvZGUKKwkgIHVwIGluc3RlYWQgb2YganVzdCB1c2luZyAtRUlPLgorCS0gTW9kaWZpY2F0aW9ucyB0byBzdXBlci5jIHRvIGVuc3VyZSB0aGF0IGJvdGggbW91bnQgYW5kIHJlbW91bnQKKwkgIGNhbm5vdCBzZXQgYW55IHdyaXRlIHJlbGF0ZWQgb3B0aW9ucyB3aGVuIHRoZSBkcml2ZXIgaXMgY29tcGlsZWQKKwkgIHJlYWQtb25seS4KKwktIE9wdGltaXplIGJsb2NrIHJlc29sdXRpb24gaW4gZnMvbnRmcy9hb3BzLmM6Om50ZnNfcmVhZF9ibG9jaygpIHRvCisJICBjYWNoZSB0aGUgY3VycmVudCBydW5saXN0IGVsZW1lbnQuIFRoaXMgc2hvdWxkIGltcHJvdmUgcGVyZm9ybWFuY2UKKwkgIHdoZW4gcmVhZGluZyB2ZXJ5IGxhcmdlIGFuZC9vciB2ZXJ5IGZyYWdtZW50ZWQgZGF0YS4KKworMi4wLjE2IC0gQ29udmVydCBhY2Nlc3MgdG8gJE1GVC8kQklUTUFQIHRvIGF0dHJpYnV0ZSBpbm9kZSBBUEkuCisKKwktIEZpeCBhIHN0dXBpZCBidWcgaW50cm9kdWNlZCBpbiAyLjAuMTUgd2hlcmUgd2Ugd2VyZSB1bm1hcHBpbmcgdGhlCisJICB3cm9uZyBpbm9kZSBpbiBmcy9udGZzL2lub2RlLmM6Om50ZnNfYXR0cl9pZ2V0KCkuCisJLSBGaXggZGVidWdnaW5nIGNoZWNrIGluIGZzL250ZnMvYW9wcy5jOjpudGZzX3JlYWRfYmxvY2soKS4KKwktIENvbnZlcnQgJE1GVC8kQklUTUFQIGFjY2VzcyB0byBhdHRyaWJ1dGUgaW5vZGUgQVBJIGFuZCByZW1vdmUgYWxsCisJICByZW1uYW50cyBvZiB0aGUgdWdseSBtZnRibXAgYWRkcmVzcyBzcGFjZSBhbmQgb3BlcmF0aW9ucyBoYWNrLiBUaGlzCisJICBtZWFucyB3ZSBmaW5hbGx5IGhhdmUgb25seSBvbmUgcmVhZHBhZ2UgZnVuY3Rpb24gYXMgd2VsbCBhcyBvbmx5IG9uZQorCSAgYXN5bmMgaW8gY29tcGxldGlvbiBoYW5kbGVyLiBZZXkhIFRoZSBtZnQgYml0bWFwIGlzIG5vdyBqdXN0IGFuCisJICBhdHRyaWJ1dGUgaW5vZGUgYW5kIGlzIGFjY2Vzc2VkIGZyb20gdm9sLT5tZnRibXBfaW5vIGp1c3QgYXMgaWYgaXQKKwkgIHdlcmUgYSBub3JtYWwgZmlsZS4gRmFrZSBpbm9kZXMgcnVsZS4gKC06CisKKzIuMC4xNSAtIEZha2UgaW5vZGVzIGJhc2VkIGF0dHJpYnV0ZSBpL28gdmlhIHRoZSBwYWdlY2FjaGUsIGZpeGVzIGFuZCBjbGVhbnVwcy4KKworCS0gRml4IHNpbGx5IGJ1ZyBpbiBmcy9udGZzL3N1cGVyLmM6OnBhcnNlX29wdGlvbnMoKSB3aGljaCB3YXMgY2F1c2luZworCSAgcmVtb3VudHMgdG8gZmFpbCB3aGVuIHRoZSBwYXJ0aXRpb24gaGFkIGFuIGVudHJ5IGluIC9ldGMvZnN0YWIgYW5kCisJICB0aGUgZW50cnkgc3BlY2lmaWVkIHRoZSBubHM9IG9wdGlvbi4KKwktIEFwcGx5IHNhbWUgbWFjcm8gbWFnaWMgdXNlZCBpbiBmcy9udGZzL2lub2RlLmggdG8gZnMvbnRmcy92b2x1bWUuaCB0bworCSAgZXhwYW5kIGFsbCB0aGUgaGVscGVyIGZ1bmN0aW9ucyBOVm9sRm9vKCksIE5Wb2xTZXRGb28oKSwgYW5kCisJICBOVm9sQ2xlYXJGb28oKS4KKwktIE1vdmUgY29weXJpZ2h0IHN0YXRlbWVudCBmcm9tIGRyaXZlciBpbml0aWFsaXNhdGlvbiBtZXNzYWdlIHRvCisJICBtb2R1bGUgZGVzY3JpcHRpb24gKGZzL3N1cGVyLmMpLiBUaGlzIG1ha2VzIHRoZSBpbml0aWFsaXNhdGlvbgorCSAgbWVzc2FnZSBmaXQgb24gb25lIGxpbmUgYW5kIGZpdHMgaW4gYmV0dGVyIHdpdGggcmVzdCBvZiBrZXJuZWwuCisJLSBVcGRhdGUgZnMvbnRmcy9hdHRyaWIuYzo6bWFwX3J1bl9saXN0KCkgdG8gd29yayBvbiBib3RoIHJlYWwgYW5kCisJICBhdHRyaWJ1dGUgaW5vZGVzLCBhbmQgYm90aCBmb3IgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLgorCS0gSW1wbGVtZW50IGZha2UgYXR0cmlidXRlIGlub2RlcyBhbGxvd2luZyBhbGwgYXR0cmlidXRlIGkvbyB0byBnbyB2aWEKKwkgIHRoZSBwYWdlIGNhY2hlIGFuZCB0byB1c2UgYWxsIHRoZSBub3JtYWwgdmZzL21tIGZ1bmN0aW9uYWxpdHk6CisJICAtIEFkZCBudGZzX2F0dHJfaWdldCgpIGFuZCBpdHMgaGVscGVyIG50ZnNfcmVhZF9sb2NrZWRfYXR0cl9pbm9kZSgpCisJICAgIHRvIGZzL250ZnMvaW5vZGUuYy4KKwkgIC0gQWRkIG5lZWRlZCBjbGVhbnVwIGNvZGUgdG8gbnRmc19jbGVhcl9iaWdfaW5vZGUoKS4KKwktIE1lcmdlIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyBmb3IgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIChhb3BzLmMpLAorCSAgbm93IGp1c3QgaGF2ZSBudGZzX2FvcHM6CisJICAtIFJlbmFtZToKKwkJZW5kX2J1ZmZlcl9yZWFkX2F0dHJfYXN5bmMoKSAtPgludGZzX2VuZF9idWZmZXJfcmVhZF9hc3luYygpLAorCQludGZzX2F0dHJfcmVhZF9ibG9jaygpCSAgICAgLT4JbnRmc19yZWFkX2Jsb2NrKCksCisJCW50ZnNfZmlsZV9yZWFkX3BhZ2UoKQkgICAgIC0+CW50ZnNfcmVhZHBhZ2UoKS4KKwkgIC0gUmV3cml0ZSBmcy9udGZzL2FvcHMuYzo6bnRmc19yZWFkcGFnZSgpIHRvIHdvcmsgb24gYm90aCByZWFsIGFuZAorCSAgICBhdHRyaWJ1dGUgaW5vZGVzLCBhbmQgYm90aCBmb3IgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLgorCSAgLSBSZW1vdmUgb2Jzb2xldGUgZnMvbnRmcy9hb3BzLmM6Om50ZnNfbXN0X3JlYWRwYWdlKCkuCisKKzIuMC4xNCAtIFJ1biBsaXN0IG1lcmdpbmcgY29kZSBjbGVhbnVwLCBtaW5vciBsb2NraW5nIGNoYW5nZXMsIHR5cG8gZml4ZXMuCisKKwktIENoYW5nZSBmcy9udGZzL3N1cGVyLmM6Om50ZnNfc3RhdGZzKCkgdG8gbm90IHJlbHkgb24gQktMIGJ5IG1vdmluZworCSAgdGhlIGxvY2tpbmcgb3V0IG9mIHN1cGVyLmM6OmdldF9ucl9mcmVlX21mdF9yZWNvcmRzKCkgYW5kIHRha2luZyBhbmQKKwkgIGRyb3BwaW5nIHRoZSBtZnRibXBfbG9jayByd19zZW1hcGhvcmUgaW4gbnRmc19zdGF0ZnMoKSBpdHNlbGYuCisJLSBCcmluZyBhdHRyaWJ1dGUgcnVubGlzdCBtZXJnaW5nIGNvZGUgKGZzL250ZnMvYXR0cmliLmMpIGluIHN5bmMgd2l0aAorCSAgY3VycmVudCB1c2Vyc3BhY2UgbnRmcyBsaWJyYXJ5IGNvZGUuIFRoaXMgbWVhbnMgdGhhdCBpZiBhIG1lcmdlCisJICBmYWlscyB0aGUgb3JpZ2luYWwgcnVubGlzdHMgYXJlIGFsd2F5cyBsZWZ0IHVubW9kaWZpZWQgaW5zdGVhZCBvZgorCSAgYmVpbmcgc2lsZW50bHkgY29ycnVwdGVkLgorCS0gTWlzYyB0eXBvIGZpeGVzLgorCisyLjAuMTMgLSBVc2UgaWdldDVfbG9ja2VkKCkgaW4gcHJlcGFyYXRpb24gZm9yIGZha2UgaW5vZGVzIGFuZCBzbWFsbCBjbGVhbnVwcy4KKworCS0gUmVtb3ZlIG5yX21mdF9iaXRzIGFuZCB0aGUgbm93IHN1cGVyZmx1b3VzIHVuaW9uIHdpdGggbnJfbWZ0X3JlY29yZHMKKwkgIGZyb20gbnRmc192b2x1bWUgc3RydWN0dXJlLgorCS0gUmVtb3ZlIG5yX2xjbl9iaXRzIGFuZCB0aGUgbm93IHN1cGVyZmx1b3VzIHVuaW9uIHdpdGggbnJfY2x1c3RlcnMKKwkgIGZyb20gbnRmc192b2x1bWUgc3RydWN0dXJlLgorCS0gVXNlIGlnZXQ1X2xvY2tlZCgpIGFuZCBmcmllbmRzIGluc3RlYWQgb2YgY29udmVudGlvbmFsIGlnZXQoKS4gV3JhcAorCSAgdGhlIGNhbGwgaW4gZnMvbnRmcy9pbm9kZS5jOjpudGZzX2lnZXQoKSBhbmQgdXBkYXRlIGNhbGxlcnMgb2YgaWdldCgpCisJICB0byB1c2UgbnRmc19pZ2V0KCkuIExlYXZlIG9ubHkgb25lIGlnZXQoKSBjYWxsIGF0IG1vdW50IHRpbWUgc28gd2UKKwkgIGRvbid0IG5lZWQgYW4gbnRmc19pZ2V0X21vdW50KCkuCisJLSBDaGFuZ2UgZnMvbnRmcy9pbm9kZS5jOjpudGZzX25ld19leHRlbnRfaW5vZGUoKSB0byB0YWtlIG1mdF9ubyBhcyBhbgorCSAgYWRkaXRpb25hbCBhcmd1bWVudC4KKworMi4wLjEyIC0gSW5pdGlhbCBjbGVhbnVwIG9mIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyBmb2xsb3dpbmcgMi4wLjExIGNoYW5nZXMuCisKKwktIE1lcmdlIGZzL250ZnMvYW9wcy5jOjplbmRfYnVmZmVyX3JlYWRfbXN0X2FzeW5jKCkgYW5kCisJICBmcy9udGZzL2FvcHMuYzo6ZW5kX2J1ZmZlcl9yZWFkX2ZpbGVfYXN5bmMoKSBpbnRvIG9uZSBmdW5jdGlvbgorCSAgZnMvbnRmcy9hb3BzLmM6OmVuZF9idWZmZXJfcmVhZF9hdHRyX2FzeW5jKCkgdXNpbmcgTklub01zdFByb3RlY3RlZCgpCisJICB0byBkZXRlcm1pbmUgd2hldGhlciB0byBhcHBseSBtc3QgZml4dXBzIG9yIG5vdC4KKwktIEFib3ZlIGNoYW5nZSBhbGxvd3MgbWVyZ2luZyBmcy9udGZzL2FvcHMuYzo6bnRmc19maWxlX3JlYWRfYmxvY2soKQorCSAgYW5kIGZzL250ZnMvYW9wcy5jOjpudGZzX21zdF9yZWFkcGFnZSgpIGludG8gb25lIGZ1bmN0aW9uCisJICBmcy9udGZzL2FvcHMuYzo6bnRmc19hdHRyX3JlYWRfYmxvY2soKS4gQWxzbywgY3JlYXRlIGEgdGlueSB3cmFwcGVyCisJICBmcy9udGZzL2FvcHMuYzo6bnRmc19tc3RfcmVhZHBhZ2UoKSB0byB0cmFuc2Zvcm0gdGhlIHBhcmFtZXRlcnMgZnJvbQorCSAgdGhlIFZGUyByZWFkcGFnZSBmdW5jdGlvbiBwcm90b3R5cGUgdG8gdGhlIG50ZnNfYXR0cl9yZWFkX2Jsb2NrKCkKKwkgIGZ1bmN0aW9uIHByb3RvdHlwZS4KKworMi4wLjExIC0gSW5pdGlhbCBwcmVwYXJhdGlvbnMgZm9yIGZha2UgaW5vZGUgYmFzZWQgYXR0cmlidXRlIGkvby4KKworCS0gTW92ZSBkZWZpbml0aW9uIG9mIG50ZnNfaW5vZGVfc3RhdGVfYml0cyB0byBmcy9udGZzL2lub2RlLmggYW5kCisJICBkbyBzb21lIG1hY3JvIG1hZ2ljIChhZGFwdGVkIGZyb20gaW5jbHVkZS9saW51eC9idWZmZXJfaGVhZC5oKSB0bworCSAgZXhwYW5kIGFsbCB0aGUgaGVscGVyIGZ1bmN0aW9ucyBOSW5vRm9vKCksIE5Jbm9TZXRGb28oKSwgYW5kCisJICBOSW5vQ2xlYXJGb28oKS4KKwktIEFkZCBuZXcgZmxhZyB0byBudGZzX2lub2RlX3N0YXRlX2JpdHM6IE5JX1NwYXJzZS4KKwktIEFkZCBuZXcgZmllbGRzIHRvIG50ZnNfaW5vZGUgc3RydWN0dXJlIHRvIGFsbG93IHVzZSBvZiBmYWtlIGlub2RlcworCSAgZm9yIGF0dHJpYnV0ZSBpL286IHR5cGUsIG5hbWUsIG5hbWVfbGVuLiBBbHNvIGFkZCBuZXcgc3RhdGUgYml0czoKKwkgIE5JX0F0dHIsIHdoaWNoLCBpZiBzZXQsIGluZGljYXRlcyB0aGUgaW5vZGUgaXMgYSBmYWtlIGlub2RlLCBhbmQKKwkgIE5JX01zdFByb3RlY3RlZCwgd2hpY2gsIGlmIHNldCwgaW5kaWNhdGVzIHRoZSBhdHRyaWJ1dGUgdXNlcyBtdWx0aQorCSAgc2VjdG9yIHRyYW5zZmVyIHByb3RlY3Rpb24sIGkuZS4gZml4dXBzIG5lZWQgdG8gYmUgYXBwbGllZCBhZnRlcgorCSAgcmVhZHMgYW5kIGJlZm9yZS9hZnRlciB3cml0ZXMuCisJLSBSZW5hbWUgZnMvbnRmcy9pbm9kZS5jOjpudGZzX3tuZXcsY2xlYXIsZGVzdHJveX1faW5vZGUoKSB0bworCSAgbnRmc197bmV3LGNsZWFyLGRlc3Ryb3l9X2V4dGVudF9pbm9kZSgpIGFuZCB1cGRhdGUgY2FsbGVycy4KKwktIFVzZSBudGZzX2NsZWFyX2V4dGVudF9pbm9kZSgpIGluIGZzL250ZnMvaW5vZGUuYzo6X19udGZzX2NsZWFyX2lub2RlKCkKKwkgIGluc3RlYWQgb2YgbnRmc19kZXN0cm95X2V4dGVudF9pbm9kZSgpLgorCS0gQ2xlYW51cCBtZW1vcnkgZGVhbGxvY2F0aW9ucyBpbiB7X18sfW50ZnNfY2xlYXJfeyxiaWdffWlub2RlKCkuCisJLSBNYWtlIGFsbCBvcGVyYXRpb25zIG9uIG50ZnMgaW5vZGUgc3RhdGUgYml0cyB1c2UgdGhlIE5Jbm8qIGZ1bmN0aW9ucy4KKwktIFNldCB1cCB0aGUgbmV3IG50ZnMgaW5vZGUgZmllbGRzIGFuZCBzdGF0ZSBiaXRzIGluCisJICBmcy9udGZzL2lub2RlLmM6Om50ZnNfcmVhZF9pbm9kZSgpIGFuZCBhZGQgYXBwcm9wcmlhdGUgY2xlYW51cCBvZgorCSAgYWxsb2NhdGVkIG1lbW9yeSB0byBfX250ZnNfY2xlYXJfaW5vZGUoKS4KKwktIENsZWFudXAgbnRmc19pbm9kZSBzdHJ1Y3R1cmUgYSBiaXQgZm9yIGJldHRlciBvcmRlcmluZyBvZiBlbGVtZW50cworCSAgdy5yLnQuIHRoZWlyIHNpemUgdG8gYWxsb3cgYmV0dGVyIHBhY2tpbmcgb2YgdGhlIHN0cnVjdHVyZSBpbiBtZW1vcnkuCisKKzIuMC4xMCAtIFRoZXJlIGNhbiBvbmx5IGJlIDJeMzIgLSAxIGlub2RlcyBvbiBhbiBOVEZTIHZvbHVtZS4KKworCS0gQWRkIGNoZWNrIGF0IG1vdW50IHRpbWUgdG8gdmVyaWZ5IHRoYXQgdGhlIG51bWJlciBvZiBpbm9kZXMgb24gdGhlCisJICB2b2x1bWUgZG9lcyBub3QgZXhjZWVkIDJeMzIgLSAxLCB3aGljaCBpcyB0aGUgbWF4aW11bSBhbGxvd2VkIGZvcgorCSAgTlRGUyBhY2NvcmRpbmcgdG8gTWljcm9zb2Z0LgorCS0gQ2hhbmdlIG1mdF9ubyBtZW1iZXIgb2YgbnRmc19pbm9kZSBzdHJ1Y3R1cmUgdG8gYmUgdW5zaWduZWQgbG9uZy4KKwkgIFVwZGF0ZSBhbGwgdXNlcnMuIFRoaXMgbWFrZXMgbnRmc19pbm9kZS0+bWZ0X25vIGp1c3QgYSBjb3B5IG9mIHN0cnVjdAorCSAgaW5vZGUtPmlfaW5vLiBCdXQgd2UgY2FuJ3QganVzdCBhbHdheXMgdXNlIHN0cnVjdCBpbm9kZS0+aV9pbm8gYW5kCisJICByZW1vdmUgbWZ0X25vIGJlY2F1c2UgZXh0ZW50IGlub2RlcyBkbyBub3QgaGF2ZSBhbiBhdHRhY2hlZCBzdHJ1Y3QKKwkgIGlub2RlLgorCisyLjAuOSAtIERlY29tcHJlc3Npb24gZW5naW5lIG5vdyB1c2VzIGEgc2luZ2xlIGJ1ZmZlciBhbmQgb3RoZXIgY2xlYW51cHMuCisKKwktIENoYW5nZSBkZWNvbXByZXNzaW9uIGVuZ2luZSB0byB1c2UgYSBzaW5nbGUgYnVmZmVyIHByb3RlY3RlZCBieSBhCisJICBzcGluIGxvY2sgaW5zdGVhZCBvZiBwZXItQ1BVIGJ1ZmZlcnMuIChSdXN0eSBSdXNzZWxsKQorCS0gRG8gbm90IHVwZGF0ZSBjYl9wb3Mgd2hlbiBoYW5kbGluZyBhIHBhcnRpYWwgZmluYWwgcGFnZSBkdXJpbmcKKwkgIGRlY29tcHJlc3Npb24gb2YgYSBzcGFyc2UgY29tcHJlc3Npb24gYmxvY2ssIGFzIHRoZSB2YWx1ZSBpcyBsYXRlcgorCSAgcmVzZXQgd2l0aG91dCBiZWluZyByZWFkL3VzZWQuIChSdXN0eSBSdXNzZWxsKQorCS0gU3dpdGNoIHRvIHVzaW5nIHRoZSBuZXcgS01fQklPX1NSQ19JUlEgZm9yIGF0b21pYyBrbWFwKClzLiAoQW5kcmV3CisJICBNb3J0b24pCisJLSBDaGFuZ2UgYnVmZmVyIHNpemUgaW4gbnRmc19yZWFkZGlyKCkvbnRmc19maWxsZGlyKCkgdG8gdXNlCisJICBOTFNfTUFYX0NIQVJTRVRfU0laRSB3aGljaCBtYWtlcyB0aGUgYnVmZmVycyBhbG1vc3QgMWtpQiBlYWNoIGJ1dAorCSAgaXQgYWxzbyBtYWtlcyBldmVyeXRoaW5nIHNhZmVyIHNvIGl0IGlzIGEgZ29vZCB0aGluZy4KKwktIE1pc2NlbGxhbmVvdXMgbWlub3IgY2xlYW51cHMgdG8gY29tbWVudHMuCisKKzIuMC44IC0gTWFqb3IgdXBkYXRlcyBmb3IgaGFuZGxpbmcgb2YgY2FzZSBzZW5zaXRpdml0eSBhbmQgZGNhY2hlIGFsaWFzaW5nLgorCisJQmlnIHRoYW5rcyBnbyB0byBBbCBWaXJvIGFuZCBvdGhlciBpbmhhYml0YW50cyBvZiAja2VybmVsIGZvciBpbnZlc3RpbmcKKwl0aGVpciB0aW1lIHRvIGRpc2N1c3MgdGhlIGNhc2Ugc2Vuc2l0aXZpdHkgYW5kIGRjYWNoZSBhbGlhc2luZyBpc3N1ZXMuCisKKwktIFJlbW92ZSB1bnVzZWQgc291cmNlIGZpbGUgZnMvbnRmcy9hdHRyYW9wcy5jLgorCS0gUmVtb3ZlIHNob3dfaW5vZGVzIG1vdW50IG9wdGlvbihzKSwgdGh1cyBkcm9wcGluZyBzdXBwb3J0IGZvcgorCSAgZGlzcGxheWluZyBvZiBzaG9ydCBmaWxlIG5hbWVzLgorCS0gUmVtb3ZlIGRlcHJlY2F0ZWQgbW91bnQgb3B0aW9uIHBvc2l4LgorCS0gUmVzdG9yZSBzaG93X3N5c19maWxlcyBtb3VudCBvcHRpb24uCisJLSBBZGQgbmV3IG1vdW50IG9wdGlvbiBjYXNlX3NlbnNpdGl2ZSwgdG8gZGV0ZXJtaW5lIGlmIHRoZSBkcml2ZXIKKwkgIHRyZWF0cyBmaWxlIG5hbWVzIGFzIGNhc2Ugc2Vuc2l0aXZlIG9yIG5vdC4gSWYgY2FzZSBzZW5zaXRpdmUsIGNyZWF0ZQorCSAgZmlsZSBuYW1lcyBpbiB0aGUgUE9TSVggbmFtZXNwYWNlLiBPdGhlcndpc2UgY3JlYXRlIGZpbGUgbmFtZXMgaW4gdGhlCisJICBMT05HL1dJTjMyIG5hbWVzcGFjZS4gTm90ZSwgZmlsZXMgcmVtYWluIGFjY2Vzc2libGUgdmlhIHRoZWlyIHNob3J0CisJICBmaWxlIG5hbWUsIGlmIGl0IGV4aXN0cy4KKwktIFJlbW92ZSByZWFsbHkgZHVtYiBsb2dpYyBidWcgaW4gYm9vdCBzZWN0b3IgcmVjb3ZlcnkgY29kZS4KKwktIEZpeCBkY2FjaGUgYWxpYXNpbmcgaXNzdWVzIHdydCBzaG9ydC9sb25nIGZpbGUgbmFtZXMgdmlhIGNoYW5nZXMKKwkgIHRvIGZzL250ZnMvZGlyLmM6Om50ZnNfbG9va3VwX2lub2RlX2J5X25hbWUoKSBhbmQKKwkgIGZzL250ZnMvbmFtZWkuYzo6bnRmc19sb29rdXAoKToKKwkgIC0gQWRkIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gbnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZSgpIGluIHdoaWNoIHdlCisJICAgIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWF0Y2hpbmcgZmlsZSBuYW1lIGlmIHRoZSBjYXNlIGlzIG5vdAorCSAgICBtYXRjaGluZyBvciB0aGUgbWF0Y2ggaXMgYSBzaG9ydCBmaWxlIG5hbWUuIFNlZSBjb21tZW50cyBhYm92ZSB0aGUKKwkgICAgZnVuY3Rpb24gZGVmaW5pdGlvbiBmb3IgZGV0YWlscy4KKwkgIC0gQ2hhbmdlIG50ZnNfbG9va3VwKCkgdG8gb25seSBjcmVhdGUgZGNhY2hlIGVudHJpZXMgZm9yIHRoZSBjb3JyZWN0bHkKKwkgICAgY2FzZWQgZmlsZSBuYW1lIGFuZCBvbmx5IGZvciB0aGUgV0lOMzIgbmFtZXNwYWNlIGNvdW50ZXJwYXJ0IG9mIERPUworCSAgICBuYW1lc3BhY2UgZmlsZSBuYW1lcy4gVGhpcyBlbnN1cmVzIHdlIGhhdmUgb25seSBvbmUgZGVudHJ5IHBlcgorCSAgICBkaXJlY3RvcnkgYW5kIGFsc28gcmVtb3ZlcyBhbGwgZGNhY2hlIGFsaWFzaW5nIGlzc3VlcyBiZXR3ZWVuIHNob3J0CisJICAgIGFuZCBsb25nIGZpbGUgbmFtZXMgb25jZSB3ZSBhZGQgd3JpdGUgc3VwcG9ydC4gU2VlIGNvbW1lbnRzIGFib3ZlCisJICAgIGZ1bmN0aW9uIGZvciBkZXRhaWxzLgorCS0gRml4IHBvdGVudGlhbCAxIGJ5dGUgb3ZlcmZsb3cgaW4gZnMvbnRmcy91bmlzdHIuYzo6bnRmc191Y3N0b25scygpLgorCisyLjAuNyAtIE1pbm9yIGNsZWFudXBzIGFuZCB1cGRhdGVzIGZvciBjaGFuZ2VzIGluIGNvcmUga2VybmVsIGNvZGUuCisKKwktIFJlbW92ZSBtdWNoIG9mIHRoZSBOVUxMIHN0cnVjdCBlbGVtZW50IGluaXRpYWxpemVycy4KKwktIFZhcmlvdXMgdXBkYXRlcyB0byBtYWtlIGNvbXBhdGlibGUgd2l0aCByZWNlbnQga2VybmVscy4KKwktIFJlbW92ZSBkZWZpbmVzIG9mIE1BWF9CVUZfUEVSX1BBR0UgYW5kIGluY2x1ZGUgbGludXgvYnVmZmVyX2hlYWQuaAorCSAgaW4gZnMvbnRmcy9udGZzLmggaW5zdGVhZC4KKwktIFJlbW92ZSBubyBsb25nZXIgbmVlZGVkIEtFUk5FTF9WRVJTSU9OIGNoZWNrcy4gV2UgYXJlIG5vdyBpbiB0aGUKKwkgIGtlcm5lbCBwcm9wZXIgc28gdGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KKworMi4wLjYgLSBNYWpvciBidWdmaXggdG8gbWFrZSBjb21wYXRpYmxlIHdpdGggb3RoZXIga2VybmVsIGNoYW5nZXMuCisKKwktIEluaXRpYWxpemUgdGhlIG1mdGJtcCBhZGRyZXNzIHNwYWNlIHByb3Blcmx5IG5vdyB0aGF0IHRoZXJlIGFyZSBtb3JlCisJICBmaWVsZHMgaW4gdGhlIHN0cnVjdCBhZGRyZXNzX3NwYWNlLiBUaGlzIHdhcyBsZWFkaW5nIHRvIGhhbmdzIGFuZAorCSAgb29wc2VzIG9uIHVtb3VudCBzaW5jZSAyLjUuMTIgYmVjYXVzZSBvZiBjaGFuZ2VzIHRvIG90aGVyIHBhcnRzIG9mCisJICB0aGUga2VybmVsLiBXZSBwcm9iYWJseSB3YW50IGEga2VybmVsIGdlbmVyaWMgaW5pdF9hZGRyZXNzX3NwYWNlKCkKKwkgIGZ1bmN0aW9uLi4uCisJLSBEcm9wIEJLTCBmcm9tIG50ZnNfcmVhZGRpcigpIGFmdGVyIGNvbnN1bHRhdGlvbiB3aXRoIEFsIFZpcm8uIFRoZQorCSAgb25seSBjYWxsZXIgb2YgLT5yZWFkZGlyKCkgaXMgdmZzX3JlYWRkaXIoKSB3aGljaCBob2xkcyBpX3NlbSBkdXJpbmcKKwkgIHRoZSBjYWxsLCBhbmQgaV9zZW0gaXMgc3VmZmljaWVudCBwcm90ZWN0aW9uIGFnYWluc3QgY2hhbmdlcyBpbiB0aGUKKwkgIGRpcmVjdG9yeSBpbm9kZSAoaW5jbHVkaW5nIC0+aV9zaXplKS4KKwktIFVzZSBnZW5lcmljX2ZpbGVfbGxzZWVrKCkgZm9yIGRpcmVjdG9yaWVzIChhcyBvcHBvc2VkIHRvCisJICBkZWZhdWx0X2xsc2VlaygpKSBhcyB0aGlzIGRvd25zIGlfc2VtIGluc3RlYWQgb2YgdGhlIEJLTCB3aGljaCBpcworCSAgd2hhdCB3ZSBub3cgbmVlZCBmb3IgZXhjbHVzaW9uIGFnYWluc3QgLT5mX3BvcyBjaGFuZ2VzIGNvbnNpZGVyaW5nIHdlCisJICBubyBsb25nZXIgdGFrZSB0aGUgQktMIGluIG50ZnNfcmVhZGRpcigpLgorCisyLjAuNSAtIE1ham9yIGJ1Z2ZpeC4gQnVmZmVyIG92ZXJmbG93IGluIGV4dGVudCBpbm9kZSBoYW5kbGluZy4KKworCS0gTm8gbmVlZCB0byBzZXQgb2xkIGJsb2Nrc2l6ZSBpbiBzdXBlci5jOjpudGZzX2ZpbGxfc3VwZXIoKSBhcyB0aGUKKwkgIFZGUyBkb2VzIHNvIHZpYSBpbnZvY2F0aW9uIG9mIGRlYWN0aXZhdGVfc3VwZXIoKSBjYWxsaW5nCisJICBmcy0+ZmlsbF9zdXBlcigpIGNhbGxpbmcgYmxvY2tfa2lsbF9zdXBlcigpIHdoaWNoIGRvZXMgaXQuCisJLSBCS0wgbW92ZWQgZnJvbSBWRlMgaW50byBkaXIuYzo6bnRmc19yZWFkZGlyKCkuIChMaW51cyBUb3J2YWxkcykKKwkgIC0+IERvIHdlIHJlYWxseSBuZWVkIGl0PyBJIGRvbid0IHRoaW5rIHNvIGFzIHdlIGhhdmUgZXhjbHVzaW9uIG9uCisJICB0aGUgZGlyZWN0b3J5IG50ZnNfaW5vZGUgcndfc2VtYXBob3JlIG1yZWNfbG9jay4gV2UgbW1pZ2h0IGhhdmUgdG8KKwkgIG1vdmUgdGhlIC0+Zl9wb3MgYWNjZXNzZXMgdW5kZXIgdGhlIG1yZWNfbG9jayB0aG91Z2guIENoZWNrIHRoaXMuLi4KKwktIEZpeCByZWFsbHksIHJlYWxseSwgcmVhbGx5IHN0dXBpZCBidWZmZXIgb3ZlcmZsb3cgaW4gZXh0ZW50IGlub2RlCisJICBoYW5kbGluZyBpbiBtZnQuYzo6bWFwX2V4dGVudF9tZnRfcmVjb3JkKCkuCisKKzIuMC40IC0gQ2xlYW51cHMgYW5kIHVwZGF0ZXMgZm9yIGtlcm5lbCAyLjUuMTEuCisKKwktIEFkZCBkb2N1bWVudGF0aW9uIG9uIGhvdyB0byB1c2UgdGhlIE1EIGRyaXZlciB0byBiZSBhYmxlIHRvIHVzZSBOVEZTCisJICBzdHJpcGUgYW5kIHZvbHVtZSBzZXRzIGluIExpbnV4IGFuZCBnZW5lcmFsbHkgY2xlYW51cCBkb2N1bWVudGF0aW9uCisJICBhIGJpdC4KKwlSZW1vdmUgYWxsIHVzZXMgb2Yga2Rldl90IGluIGZhdm91ciBvZiBzdHJ1Y3QgYmxvY2tfZGV2aWNlICo6CisJLSBDaGFuZ2UgY29tcHJlc3MuYzo6bnRmc19maWxlX3JlYWRfY29tcHJlc3NlZF9ibG9jaygpIHRvIHVzZQorCSAgc2JfZ2V0YmxrKCkgaW5zdGVhZCBvZiBnZXRibGsoKS4KKwktIENoYW5nZSBzdXBlci5jOjpudGZzX2ZpbGxfc3VwZXIoKSB0byB1c2UgYmRldl9oYXJkc2VjdF9zaXplKCkgaW5zdGVhZAorCSAgb2YgZ2V0X2hhcmRzZWN0X3NpemUoKS4KKwktIE5vIG5lZWQgdG8gZ2V0IG9sZCBibG9ja3NpemUgaW4gc3VwZXIuYzo6bnRmc19maWxsX3N1cGVyKCkgYXMKKwkgIGZzL3N1cGVyLmM6OmdldF9zYl9iZGV2KCkgYWxyZWFkeSBkb2VzIHRoaXMuCisJLSBTZXQgYmgtPmJfYmRldiBpbnN0ZWFkIG9mIGJoLT5iX2RldiB0aHJvdWdob3V0IGFvcHMuYy4KKworMi4wLjMgLSBTbWFsbCBidWcgZml4ZXMsIGNsZWFudXBzLCBhbmQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzLgorCisJLSBSZW1vdmUgc29tZSBkZWFkIGNvZGUgZnJvbSBtZnQuYy4KKwktIE9wdGltaXplIHJlYWRwYWdlIGFuZCByZWFkX2Jsb2NrIGZ1bmN0aW9ucyB0aHJvdWdob3V0IGFvcHMuYyBzbyB0aGF0CisJICBvbmx5IGluaXRpYWxpemVkIGJsb2NrcyBhcmUgcmVhZC4gTm9uLWluaXRpYWxpemVkIG9uZXMgaGF2ZSB0aGVpcgorCSAgYnVmZmVyIGhlYWQgbWFwcGVkLCB6ZXJvZWQsIGFuZCBzZXQgdXAgdG8gZGF0ZSwgd2l0aG91dCBzY2hlZHVsaW5nCisJICBhbnkgaS9vLiBUaGFua3MgdG8gQWwgVmlybyBmb3IgYWR2aWNlIG9uIGhvdyB0byBhdm9pZCB0aGUgZGV2aWNlIGkvby4KKwlUaGFua3MgZ28gdG8gQW5kcmV3IE1vcnRvbiBmb3Igc3BvdHRpbmcgdGhlIGJlbG93OgorCS0gRml4IGJ1Z2xldCBpbiBhbGxvY2F0ZV9jb21wcmVzc2lvbl9idWZmZXJzKCkgZXJyb3IgY29kZSBwYXRoLgorCS0gQ2FsbCBmbHVzaF9kY2FjaGVfcGFnZSgpIGFmdGVyIG1vZGlmeWluZyBwYWdlIGNhY2hlIHBhZ2UgY29udGVudHMgaW4KKwkgIG50ZnNfZmlsZV9yZWFkcGFnZSgpLgorCS0gQ2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBwYWdlIGJ1ZmZlcnMgdGhyb3VnaG91dCBhb3BzLmMgYmVmb3JlIGNhbGxpbmcKKwkgIGNyZWF0ZV9lbXB0eV9idWZmZXJzKCkuIFRoaXMgaGFwcGVucyB3aGVuIGFuIEkvTyBlcnJvciBvY2N1cnMgYW5kIHRoZQorCSAgcmVhZCBpcyByZXRyaWVkLiAoSXQgYWxzbyBoYXBwZW5zIG9uY2Ugd3JpdGluZyBpcyBpbXBsZW1lbnRlZCBzbyB0aGF0CisJICBuZWVkZWQgZG9pbmcgYW55d2F5IGJ1dCBJIGhhZCBsZWZ0IGl0IGZvciBsYXRlci4uLikKKwktIERvbid0IEJVR19PTigpIHVwdG9kYXRlIGFuZC9vciBtYXBwZWQgYnVmZmVycyB0aHJvdWdob3V0IGFvcHMuYyBpbgorCSAgcmVhZHBhZ2UgYW5kIHJlYWRfYmxvY2sgZnVuY3Rpb25zLiBSZWFzb25pbmcgc2FtZSBhcyBhYm92ZSAoaS5lLiBJL08KKwkgIGVycm9yIHJldHJpZXMgYW5kIGZ1dHVyZSB3cml0ZSBjb2RlIHBhdGhzLikKKworMi4wLjIgLSBNaW5vciB1cGRhdGVzIGFuZCBjbGVhbnVwcy4KKworCS0gQ2xlYW51cDogcmVuYW1lIG1zdC5jOjpfX3Bvc3RfcmVhZF9tc3RfZml4dXAgdG8gcG9zdF93cml0ZV9tc3RfZml4dXAKKwkgIGFuZCBjbGVhbnVwIHRoZSBjb2RlIGEgYml0LCByZW1vdmluZyB0aGUgdW51c2VkIHNpemUgcGFyYW1ldGVyLgorCS0gQ2hhbmdlIGRlZmF1bHQgZm1hc2sgdG8gMDE3NyBhbmQgdXBkYXRlIGRvY3VtZW50YXRpb24uCisJLSBDaGFuZ2UgYXR0cmliLmM6OmdldF9hdHRyX3NlYXJjaF9jdHgoKSB0byByZXR1cm4gdGhlIHNlYXJjaCBjb250ZXh0CisJICBkaXJlY3RseSBpbnN0ZWFkIG9mIHRha2luZyB0aGUgYWRkcmVzcyBvZiBhIHBvaW50ZXIuIEEgcmV0dXJuIHZhbHVlCisJICBvZiBOVUxMIG1lYW5zIHRoZSBhbGxvY2F0aW9uIGZhaWxlZC4gVXBkYXRlZCBhbGwgY2FsbGVycworCSAgYXBwcm9wcmlhdGVseS4KKwktIFVwZGF0ZSB0byAyLjUuOSBrZXJuZWwgKHByZXNlcnZpbmcgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpIGJ5CisJICByZXBsYWNpbmcgYWxsIG9jY3VyZW5jZXMgb2YgcGFnZS0+YnVmZmVycyB3aXRoIHBhZ2VfYnVmZmVycyhwYWdlKS4KKwktIEZpeCBtaW5vciBidWdzIGluIHJ1bmxpc3QgbWVyZ2luZywgYWxzbyBtaW5vciBjbGVhbnVwLgorCS0gVXBkYXRlcyB0byBib290c2VjdG9yIGxheW91dCBhbmQgbWZ0IG1pcnJvciBjb250ZW50cyBkZXNjcmlwdGlvbnMuCisJLSBTbWFsbCBidWcgZml4IGluIGVycm9yIGRldGVjdGlvbiBpbiB1bmlzdHIuYyBhbmQgc29tZSBjbGVhbnVwcy4KKwktIEdyb3cgbmFtZSBidWZmZXIgYWxsb2NhdGlvbnMgaW4gdW5pc3RyLmMgaW4gYWxpZ25lZCBtdXRsaXBsZWQgb2YgNjQKKwkgIGJ5dGVzLgorCisyLjAuMSAtIE1pbm9yIHVwZGF0ZXMuCisKKwktIE1ha2UgZGVmYXVsdCB1bWFzayBjb3JyZXNwb25kIHRvIGRvY3VtZW50YXRpb24uCisJLSBJbXByb3ZlIGRvY3VtZW50YXRpb24uCisJLSBTZXQgZGVmYXVsdCBtb2RlIHRvIGluY2x1ZGUgZXhlY3V0ZSBiaXQuIFRoZSB7dSxmLGR9bWFzayBjYW4gYmUgdXNlZAorCSAgdG8gdGFrZSBpdCBhd2F5IGlmIGRlc2lyZWQuIFRoaXMgYWxsb3dzIGJpbmFyaWVzIHRvIGJlIGV4ZWN1dGVkIGZyb20KKwkgIGEgbW91bnRlZCBudGZzIHBhcnRpdGlvbi4KKworMi4wLjAgLSBOZXcgdmVyc2lvbiBudW1iZXIuIFJlbW92ZSBUTkcgZnJvbSB0aGUgbmFtZS4gTm93IGluIHRoZSBrZXJuZWwuCisKKwktIEFkZCBraWxsX3N1cGVyLCBqdXN0IGtlZXBpbmcgdXAgd2l0aCB0aGUgdmZzIGNoYW5nZXMgaW4gdGhlIGtlcm5lbC4KKwktIFJlcGVhdCBzb21lIGNoYW5nZXMgZnJvbSB0bmctMC4wLjggdGhhdCBzb21laG93IGdvdCBsb3N0IG9uIHRoZSB3YXkKKwkgIGZyb20gdGhlIENWUyBpbXBvcnQgaW50byBCaXRLZWVwZXIuCisJLSBCZWdpbiB0byBpbXBsZW1lbnQgcHJvcGVyIGhhbmRsaW5nIG9mIGFsbG9jYXRlZF9zaXplIHZzCisJICBpbml0aWFsaXplZF9zaXplIHZzIGRhdGFfc2l6ZSAoaS5lLiBpX3NpemUpLiBEb25lIGFyZQorCSAgbWZ0LmM6Om50ZnNfbWZ0X3JlYWRwYWdlKCksIGFvcHMuYzo6ZW5kX2J1ZmZlcl9yZWFkX2luZGV4X2FzeW5jKCksCisJICBhbmQgYXR0cmliLmM6OmxvYWRfYXR0cmlidXRlX2xpc3QoKS4KKwktIExvY2sgdGhlIHJ1bmxpc3QgaW4gYXR0cmliLmM6OmxvYWRfYXR0cmlidXRlX2xpc3QoKSB3aGlsZSB1c2luZyBpdC4KKwktIEZpeCBtZW1vcnkgbGVhayBpbiBudGZzX2ZpbGVfcmVhZF9jb21wcmVzc2VkX2Jsb2NrKCkgYW5kIGdlbmVyYWxseQorCSAgY2xlYW4gdXAgY29tcHJlc3MuYyBhIGxpdHRsZSwgcmVtb3Zpbmcgc29tZSB1bmNvbW1lbnRlZC91bnVzZWQgZGVidWcKKwkgIGNvZGUuCisJLSBUaWR5IHVwIGRpci5jIGEgbGl0dGxlIGJpdC4KKwktIERvbid0IGJvdGhlciBnZXR0aW5nIHRoZSBydW5saXN0IGluIGlub2RlLmM6Om50ZnNfcmVhZF9pbm9kZSgpLgorCS0gTWVyZ2UgbWZ0LmM6Om50ZnNfbWZ0X3JlYWRwYWdlKCkgYW5kIGFvcHMuYzo6bnRmc19pbmRleF9yZWFkcGFnZSgpCisJICBjcmVhdGluZyBhb3BzLmM6Om50ZnNfbXN0X3JlYWRwYWdlKCksIGltcHJvdmluZyB0aGUgaGFuZGxpbmcgb2YKKwkgIGhvbGVzIGFuZCBvdmVyZmxvdyBpbiB0aGUgcHJvY2VzcyBhbmQgaW1wbGVtZW50aW5nIHRoZSBjb3JyZWN0CisJICBlcXVpdmFsZW50IG9mIG50ZnNfZmlsZV9nZXRfYmxvY2soKSBpbiBudGZzX21zdF9yZWFkcGFnZSgpIGl0c2VsZi4KKwkgIEkgYW0gYWltaW5nIGZvciBjb3JyZWN0bmVzcyBhdCB0aGUgbW9tZW50LiBNb2R1bGFyaXNhdGlvbiBjYW4gY29tZQorCSAgbGF0ZXIuCisJLSBSZW5hbWUgYW9wcy5jOjplbmRfYnVmZmVyX3JlYWRfaW5kZXhfYXN5bmMoKSB0bworCSAgZW5kX2J1ZmZlcl9yZWFkX21zdF9hc3luYygpIGFuZCBvcHRpbWl6ZSB0aGUgb3ZlcmZsb3cgY2hlY2tpbmcgYW5kCisJICBoYW5kbGluZy4KKwktIFVzZSB0aGUgaG9zdCBvZiB0aGUgbWZ0Ym1wIGFkZHJlc3Mgc3BhY2UgbWFwcGluZyB0byBob2xkIHRoZSBudGZzCisJICB2b2x1bWUuIFRoaXMgaXMgbmVlZGVkIHNvIHRoZSBhc3luYyBpL28gY29tcGxldGlvbiBoYW5kbGVyIGNhbgorCSAgcmV0cmlldmUgYSBwb2ludGVyIHRvIHRoZSB2b2x1bWUuIEhvcGVmdWxseSB0aGlzIHdpbGwgbm90IGNhdXNlCisJICBwcm9ibGVtcyBlbHNld2hlcmUgaW4gdGhlIGtlcm5lbC4uLiBPdGhlcndpc2Ugd2lsbCBuZWVkIHRvIHVzZSBhCisJICBmYWtlIGlub2RlLgorCS0gQ29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgcHJvcGVyIGhhbmRsaW5nIG9mIGFsbG9jYXRlZF9zaXplIHZzCisJICBpbml0aWFsaXplZF9zaXplIHZzIGRhdGFfc2l6ZSAoaS5lLiBpX3NpemUpIGluIHdob2xlIGRyaXZlci4KKwkgIEJhc2ljYWxseSBhb3BzLmMgaXMgbm93IGNvbXBsZXRlbHkgcmV3cml0dGVuLgorCS0gQ2hhbmdlIE5URlMgZHJpdmVyIG5hbWUgdG8ganVzdCBOVEZTIGFuZCBzZXQgdmVyc2lvbiBudW1iZXIgdG8gMi4wLjAKKwkgIHRvIG1ha2UgYSBjbGVhciBkaXN0aW5jdGlvbiBmcm9tIHRoZSBvbGQgZHJpdmVyIHdoaWNoIGlzIHN0aWxsIG9uCisJICB2ZXJzaW9uIDEuMS4yMi4KKwordG5nLTAuMC44IC0gMDgvMDMvMjAwMiAtIE5vdyB1c2luZyBCaXRLZWVwZXIsIGh0dHA6Ly9saW51eC1udGZzLmJrYml0cy5uZXQvCisKKwktIFJlcGxhY2UgYmRldm5hbWUoc2ItPnNfZGV2KSB3aXRoIHNiLT5zX2lkLgorCS0gUmVtb3ZlIG5vdyBzdXBlcmZsdW91cyBuZXctbGluZSBjaGFyYWN0ZXJzIGluIGFsbCBjYWxsZXJzIG9mCisJICBudGZzX2RlYnVnKCkuCisJLSBBcHBseSBrbHVkZ2UgaW4gbnRmc19yZWFkX2lub2RlKCksIHNldHRpbmcgaV9ubGluayB0byAxIGZvcgorCSAgZGlyZWN0b3JpZXMuIFdpdGhvdXQgdGhpcyB0aGUgImZpbmQiIHV0aWxpdHkgZ2V0cyB2ZXJ5IHVwc2V0IHdoaWNoIGlzCisJICBmYWlyIGVub3VnaCBhcyBMaW51eC9Vbml4IGRvIG5vdCBzdXBwb3J0IGRpcmVjdG9yeSBoYXJkIGxpbmtzLgorCS0gRnVydGhlciBydW5saXN0IG1lcmdpbmcgd29yay4gKFJpY2hhcmQgUnVzc29uKQorCS0gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIGdjYy0yLjk1LiAoUmljaGFyZCBSdXNzb24pCisJLSBVcGRhdGUgdG8ga2VybmVsIDIuNS41LXByZTEgYW5kIHJlZGlmZiB0aGUgbm93IHRpbnkgcGF0Y2guCisJLSBDb252ZXJ0IHRvIG5ldyBmaWxlIHN5c3RlbSBkZWNsYXJhdGlvbiB1c2luZyAtPm50ZnNfZ2V0X3NiKCkgYW5kCisJICByZXBsYWNpbmcgbnRmc19yZWFkX3N1cGVyKCkgd2l0aCBudGZzX2ZpbGxfc3VwZXIoKS4KKwktIFNldCBzX21heGJ5dGVzIHRvIE1BWF9MRlNfRklMRVNJWkUgdG8gYXZvaWQgcGFnZSBjYWNoZSBwYWdlIGluZGV4CisJICBvdmVyZmxvdyBvbiAzMi1iaXQgYXJjaGl0ZWN0dXJlcy4KKwktIENsZWFudXAgdXBjYXNlIGxvYWRpbmcgY29kZSB0byB1c2UgbnRmc18odW4pbWFwX3BhZ2UoKS4KKwktIERpc2FibGUvcmVlbmFibGUgcHJlZW10aW9uIGluIGNyaXRpY2FsIHNlY3Rpb25zIG9mIGNvbXBlc3Npb24gZW5naW5lLgorCS0gUmVwbGFjZSBkZXZpY2Ugc2l6ZSBkZXRlcm1pbmF0aW9uIGluIG50ZnNfZmlsbF9zdXBlcigpIHdpdGgKKwkgIHNiLT5zX2JkZXYtPmJkX2lub2RlLT5pX3NpemUgKGluIGJ5dGVzKSBhbmQgcmVtb3ZlIG5vdyBzdXBlcmZsdW91cworCSAgZnVuY3Rpb24gc3VwZXIuYzo6Z2V0X25yX2Jsb2NrcygpLgorCS0gSW1wbGVtZW50IGEgbW91bnQgdGltZSBvcHRpb24gKHNob3dfaW5vZGVzKSBhbGxvd2luZyBjaG9pY2Ugb2Ygd2hpY2gKKwkgIHR5cGVzIG9mIGlub2RlIG5hbWVzIHJlYWRkaXIoKSByZXR1cm5zIGFuZCBtb2RpZnkgbnRmc19maWxsZGlyKCkKKwkgIGFjY29yZGluZ2x5LiBUaGVyZSBhcmUgc2V2ZXJhbCBwYXJhbWV0ZXJzIHRvIHNob3dfaW5vZGVzOgorCQlzeXN0ZW06CXN5c3RlbSBmaWxlcworCQl3aW4zMjoJbG9uZyBmaWxlIG5hbWVzIChpbmNsdWRpbmcgUE9TSVggZmlsZSBuYW1lcykgW0RFRkFVTFRdCisJCWxvbmc6CXNhbWUgYXMgd2luMzIKKwkJZG9zOglzaG9ydCBmaWxlIG5hbWVzIG9ubHkgKGV4Y2x1ZGluZyBQT1NJWCBmaWxlIG5hbWVzKQorCQlzaG9ydDoJc2FtZSBhcyBkb3MKKwkJcG9zaXg6CXNhbWUgYXMgYm90aCB3aW4zMiBhbmQgZG9zCisJCWFsbDoJYWxsIGZpbGUgbmFtZXMKKwkgIE5vdGUgdGhhdCB0aGUgb3B0aW9ucyBhcmUgYWRkaXRpdmUsIGkuZS4gc3BlY2lmeWluZzoKKwkJLW8gc2hvd19pbm9kZXM9c3lzdGVtLHNob3dfaW5vZGVzPXdpbjMyLHNob3dfaW5vZGVzPWRvcworCSAgaXMgdGhlIHNhbWUgYXMgc3BlY2lmeWluZzoKKwkJLW8gc2hvd19pbm9kZXM9YWxsCisJICBOb3RlIHRoYXQgdGhlICJwb3NpeCIgYW5kICJhbGwiIG9wdGlvbnMgd2lsbCBzaG93IGFsbCBkaXJlY3RvcnkKKwkgIG5hbWVzLCBCVVQgdGhlIGxpbmsgY291bnQgb24gZWFjaCBkaXJlY3RvcnkgaW5vZGUgZW50cnkgaXMgc2V0IHRvIDEsCisJICBkdWUgdG8gTGludXggbm90IHN1cHBvcnRpbmcgZGlyZWN0b3J5IGhhcmQgbGlua3MuIFRoaXMgbWF5IHdlbGwKKwkgIGNvbmZ1c2Ugc29tZSB1c2Vyc3BhY2UgYXBwbGljYXRpb25zLCBzaW5jZSB0aGUgZGlyZWN0b3J5IG5hbWVzIHdpbGwKKwkgIGhhdmUgdGhlIHNhbWUgaW5vZGUgbnVtYmVycy4gVGh1cyBpdCBpcyBOT1QgYWR2aXNhYmxlIHRvIHVzZSB0aGUKKwkgICJwb3NpeCIgb3IgImFsbCIgb3B0aW9ucy4gV2UgcHJvdmlkZSB0aGVtIG9ubHkgZm9yIGNvbXBsZXRlbmVzcyBzYWtlLgorCS0gQWRkIGNvcGllcyBvZiBhbGxvY2F0ZWRfc2l6ZSwgaW5pdGlhbGl6ZWRfc2l6ZSwgYW5kIGNvbXByZXNzZWRfc2l6ZSB0bworCSAgdGhlIG50ZnMgaW5vZGUgc3RydWN0dXJlIGFuZCBzZXQgdGhlbSB1cCBpbgorCSAgaW5vZGUuYzo6bnRmc19yZWFkX2lub2RlKCkuIFRoZXNlIHJlZmxlY3QgdGhlIHVubmFtZWQgZGF0YSBhdHRyaWJ1dGUKKwkgIGZvciBmaWxlcyBhbmQgdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlIGZvciBkaXJlY3Rvcmllcy4KKwktIEFkZCBjb3BpZXMgb2YgYWxsb2NhdGVkX3NpemUgYW5kIGluaXRpYWxpemVkX3NpemUgdG8gbnRmcyBpbm9kZSBmb3IKKwkgICRCSVRNQVAgYXR0cmlidXRlIG9mIGxhcmdlIGRpcmVjdG9yaWVzIGFuZCBzZXQgdGhlbSB1cCBpbgorCSAgaW5vZGUuYzo6bnRmc19yZWFkX2lub2RlKCkuCisJLSBBZGQgY29waWVzIG9mIGFsbG9jYXRlZF9zaXplIGFuZCBpbml0aWFsaXplZF9zaXplIHRvIG50ZnMgdm9sdW1lIGZvcgorCSAgJEJJVE1BUCBhdHRyaWJ1dGUgb2YgJE1GVCBhbmQgc2V0IHRoZW0gdXAgaW4KKwkgIHN1cGVyLmM6OmxvYWRfc3lzdGVtX2ZpbGVzKCkuCisJLSBQYXJzZSBkZXByZWNhdGVkIG50ZnMgZHJpdmVyIG9wdGlvbnMgKGlvY2hhcnNldCwgc2hvd19zeXNfZmlsZXMsCisJICBwb3NpeCwgYW5kIHV0ZjgpIGFuZCB0ZWxsIHVzZXIgd2hhdCB0aGUgbmV3IG9wdGlvbnMgdG8gdXNlIGFyZS4gTm90ZQorCSAgd2Ugc3RpbGwgZG8gc3VwcG9ydCB0aGVtIGJ1dCB0aGV5IHdpbGwgYmUgcmVtb3ZlZCB3aXRoIGtlcm5lbCAyLjcueC4KKwktIENoYW5nZSBhbGwgb2NjdXJlbmNlcyBvZiBpbnRlZ2VyIGxvbmcgbG9uZyBwcmludGYgZm9ybWF0dGluZyB0byBoZXgKKwkgIGFzIHByaW50aygpIHdpbGwgbm90IHN1cHBvcnQgbG9uZyBsb25nIGludGVnZXIgZm9ybWF0IGlmL3doZW4gdGhlCisJICBkaXY2NCBwYXRjaCBnb2VzIGludG8gdGhlIGtlcm5lbC4KKwktIE1ha2Ugc2xhYiBjYWNoZXMgaGF2ZSBzdGFibGUgbmFtZXMgYW5kIGNoYW5nZSB0aGUgbmFtZXMgdG8gd2hhdCB0aGV5CisJICB3ZXJlIGludGVuZGVkIHRvIGJlLiBUaGVzZSBjaGFuZ2VzIGFyZSByZXF1aXJlZC9tYWRlIHBvc3NpYmxlIGJ5IHRoZQorCSAgbmV3IHNsYWIgY2FjaGUgbmFtZSBoYW5kbGluZyB3aGljaCByZW1vdmVzIHRoZSBsZW5ndGggbGltaXRhdGlvbiBieQorCSAgcmVxdWlyaW5nIHRoZSBjYWxsZXIgb2Yga21lbV9jYWNoZV9jcmVhdGUoKSB0byBzdXBwbHkgYSBzdGFibGUgbmFtZQorCSAgd2hpY2ggaXMgdGhlbiByZWZlcmVuY2VkIGJ1dCBub3QgY29waWVkLgorCS0gUmVuYW1lIHJ1bl9saXN0IHN0cnVjdHVyZSB0byBydW5fbGlzdF9lbGVtZW50IGFuZCBjcmVhdGUgYSBuZXcKKwkgIHJ1bl9saXN0IHN0cnVjdHVyZSBjb250YWluaW5nIGEgcG9pbnRlciB0byBhIHJ1bl9saXN0X2VsZW1lbnQKKwkgIHN0cnVjdHVyZSBhbmQgYSByZWFkL3dyaXRlIHNlbWFwaG9yZS4gQWRhcHQgYWxsIHVzZXJzIG9mIHJ1bmxpc3RzCisJICB0byBuZXcgc2NoZW1lIGFuZCB0YWtlIGFuZCByZWxlYXNlIHRoZSBsb2NrIGFzIG5lZWRlZC4gVGhpcyBmaXhlcyBhCisJICBuYXN0eSByYWNlIGFzIHRoZSBydW5fbGlzdCBjaGFuZ2VzIGV2ZW4gd2hlbiBpbm9kZXMgYXJlIGxvY2tlZCBmb3IKKwkgIHJlYWRpbmcgYW5kIGV2ZW4gd2hlbiB0aGUgaW5vZGUgaXNuJ3QgbG9ja2VkIGF0IGFsbCwgc28gd2UgcmVhbGx5CisJICBuZWVkZWQgdGhlIHNlcmlhbGl6YXRpb24uIFdlIHVzZSBhIHNlbWFwaG9yZSByYXRoZXIgdGhhbiBhIHNwaW5sb2NrCisJICBhcyBtZW1vcnkgYWxsb2NhdGlvbnMgY2FuIHNsZWVwIGFuZCBkb2luZyBldmVyeXRoaW5nIEdGUF9BVE9NSUMKKwkgIHdvdWxkIGJlIHNpbGx5LgorCS0gQ2xlYW51cCByZWFkX2lub2RlKCkgcmVtb3ZpbmcgYWxsIGNvZGUgY2hlY2tpbmcgZm9yIGxvd2VzdF92Y24gIT0gMC4KKwkgIFRoaXMgY2FuIG5ldmVyIGhhcHBlbiBkdWUgdG8gdGhlIG5hdHVyZSBvZiBsb29rdXBfYXR0cigpIGFuZCBob3cgd2UKKwkgIHN1cHBvcnQgYXR0cmlidXRlIGxpc3RzLiBJZiBpdCBkaWQgaGFwcGVuIGl0IHdvdWxkIGltcGx5IHRoZSBpbm9kZQorCSAgYmVpbmcgY29ycnVwdC4KKwktIENoZWNrIGZvciBsb3dlc3RfdmNuICE9IDAgaW4gbnRmc19yZWFkX2lub2RlKCkgYW5kIG1hcmsgdGhlIGlub2RlIGFzCisJICBiYWQgaWYgZm91bmQuCisJLSBVcGRhdGUgdG8gMi41LjYtcHJlMiBjaGFuZ2VzIGluIHN0cnVjdCBhZGRyZXNzX3NwYWNlLgorCS0gVXNlIHBhcmVudF9pbm8oKSB3aGVuIGFjY2Vzc2luZyBkX3BhcmVudCBpbm9kZSBudW1iZXIgaW4gZGlyLmMuCisJLSBJbXBvcnQgU291cmNlZm9yZ2UgQ1ZTIHJlcG9zaXRvcnkgaW50byBCaXRLZWVwZXIgcmVwb3NpdG9yeToKKwkJaHR0cDovL2xpbnV4LW50ZnMuYmtiaXRzLm5ldC9udGZzLXRuZy0yLjUKKwktIFVwZGF0ZSBmcy9NYWtlZmlsZSwgZnMvQ29uZmlnLmhlbHAsIGZzL0NvbmZpZy5pbiwgYW5kCisJICBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL250ZnMudHh0IGZvciBOVEZTIFRORy4KKwktIENyZWF0ZSBrZXJuZWwgY29uZmlndXJhdGlvbiBvcHRpb24gY29udHJvbGxpbmcgd2hldGhlciBkZWJ1Z2dpbmcKKwkgIGlzIGVuYWJsZWQgb3Igbm90LgorCS0gQWRkIHRoZSByZXF1aXJlZCBleHBvcnQgb2YgZW5kX2J1ZmZlcl9pb19zeW5jKCkgZnJvbSB0aGUgcGF0Y2hlcworCSAgZGlyZWN0b3J5IHRvIHRoZSBrZXJuZWwgY29kZS4KKwktIFVwZGF0ZSBpbm9kZS5jOjpudGZzX3Nob3dfb3B0aW9ucygpIHdpdGggc2hvd19pbm9kZXMgbW91bnQgb3B0aW9uLgorCS0gVXBkYXRlIGVycm9ycyBtb3VudCBvcHRpb24uCisKK3RuZy0wLjAuNyAtIDEzLzAyLzIwMDIgLSBUaGUgZHJpdmVyIGlzIG5vdyBmZWF0dXJlIGNvbXBsZXRlIGZvciByZWFkLW9ubHkhCisKKwktIENsZWFudXAgbWZ0LmMgYW5kIGl0J3MgZGVidWcvZXJyb3Igb3V0cHV0IGluIHBhcnRpY3VsYXIuIEZpeCBhIG1pbm9yCisJICBidWcgaW4gbWFwcGluZyBvZiBleHRlbnQgaW5vZGVzLiBVcGRhdGUgYWxsIHRoZSBjb21tZW50cyB0byBmaXQgYWxsCisJICB0aGUgcmVjZW50IGNvZGUgY2hhbmdlcy4KKwktIE1vZGlmeSB2Y25fdG9fbGNuKCkgdG8gY29wZSB3aXRoIGVudGlyZWx5IHVubWFwcGVkIHJ1bmxpc3RzLgorCS0gQ2xlYW51cHMgaW4gY29tcHJlc3MuYywgbW9zdGx5IGNvbW1lbnRzIGFuZCBmb2xkaW5nIGhlbHAuCisJLSBJbXBsZW1lbnQgYXR0cmliLmM6Om1hcF9ydW5fbGlzdCgpIGFzIGEgZ2VuZXJpYyBoZWxwZXIuCisJLSBNYWtlIGNvbXByZXNzLmM6Om50ZnNfZmlsZV9yZWFkX2NvbXByZXNzZWRfYmxvY2soKSB1c2UgbWFwX3J1bl9saXN0KCkKKwkgIHRodXMgbWFraW5nIGNvZGUgc2hvcnRlciBhbmQgZW5hYmxpbmcgYXR0cmlidXRlIGxpc3Qgc3VwcG9ydC4KKwktIENsZWFudXAgaW5jb3JyZWN0IHVzZSBvZiBbc3VdNjQgd2l0aCAlTCBwcmludGYgZm9ybWF0IHNwZWNpZmllciBpbgorCSAgYWxsIHNvdXJjZSBmaWxlcy4gVHlwZSBjYXN0cyB0byBbdW5zaWduZWRdIGxvbmcgbG9uZyBhZGRlZCB0byBjb3JyZWN0CisJICB0aGUgbWlzbWF0Y2hlcyAoaW1wb3J0YW50IGZvciBhcmNoaXRlY3R1cmVzIHdoaWNoIGhhdmUgbG9uZyBsb25nIG5vdAorCSAgYmVpbmcgNjQgYml0cykuCisJLSBNZXJnZSBhc3luYyBpbyBjb21wbGV0aW9uIGhhbmRsZXJzIGZvciBkaXJlY3RvcnkgaW5kZXhlcyBhbmQgJE1GVAorCSAgZGF0YSBpbnRvIG9uZSBieSBzZXR0aW5nIHRoZSBpbmRleF9ibG9ja19zaXple19iaXRzfSBvZiB0aGUgbnRmcworCSAgaW5vZGUgZm9yICRNRlQgdG8gdGhlIG1mdF9yZWNvcmRfc2l6ZXtfYml0c30gb2YgdGhlIG50ZnNfdm9sdW1lLgorCS0gQ2xlYW51cCBhb3BzLmMsIHVwZGF0ZSBjb21tZW50cy4KKwktIE1ha2UgbnRmc19maWxlX2dldF9ibG9jaygpIHVzZSBtYXBfcnVuX2xpc3QoKSBzbyBhbGwgZmlsZXMgbm93CisJICBzdXBwb3J0IGF0dHJpYnV0ZSBsaXN0cy4KKwktIE1ha2UgbnRmc19kaXJfcmVhZHBhZ2UoKSBhbG1vc3QgdmVyYmF0aW0gY29weSBvZgorCSAgYmxvY2tfcmVhZF9mdWxsX3BhZ2UoKSBieSB1c2luZyBudGZzX2ZpbGVfZ2V0X2Jsb2NrKCkgd2l0aCBvbmx5IHJlYWwKKwkgIGRpZmZlcmVuY2UgYmVpbmcgdGhlIHVzZSBvZiBvdXIgb3duIGFzeW5jIGlvIGNvbXBsZXRpb24gaGFuZGxlcgorCSAgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQgb25lLCB0aHVzIHJlZHVjaW5nIHRoZSBhbW91bnQgb2YgY29kZSBhbmQKKwkgIGF1dG9tYXRpY2FsbHkgZW5hYmxpbmcgYXR0cmlidXRlIGxpc3Qgc3VwcG9ydCBmb3IgZGlyZWN0b3J5IGluZGljZXMuCisJLSBGaXggYnVnIGluIGxvYWRfYXR0cmlidXRlX2xpc3QoKSAtIGZvcmdvdCB0byBjYWxsIGJyZWxzZSBpbiBlcnJvcgorCSAgY29kZSBwYXRoLgorCS0gQ2hhbmdlIHBhcmFtZXRlcnMgdG8gZmluZF9hdHRyKCkgYW5kIGxvb2t1cF9hdHRyKCkuIFdlIG5vIGxvbmdlcgorCSAgcGFzcyBpbiB0aGUgdXBjYXNlIHRhYmxlIGFuZCBpdHMgbGVuZ3RoLiBUaGVzZSBjYW4gYmUgZ290dGVuIGZyb20KKwkgIGN0eC0+bnRmc19pbm8tPnZvbC0+dXBjYXNle19sZW59LiBVcGRhdGUgYWxsIGNhbGxlcnMuCisJLSBDbGVhbnVwcyBpbiBhdHRyaWIuYy4KKwktIEltcGxlbWVudCBtZXJnaW5nIG9mIHJ1bmxpc3RzLCBhdHRyaWIuYzo6bWVyZ2VfcnVuX2xpc3RzKCkgYW5kIGl0cworCSAgaGVscGVycy4gKFJpY2hhcmQgUnVzc29uKQorCS0gQXR0cmlidXRlIGxpc3RzIHBhcnQgMiwgYXR0cmlidXRlIGV4dGVudHMgYW5kIG11bHRpIHBhcnQgcnVubGlzdHM6CisJICBlbmFibGUgcHJvcGVyIHN1cHBvcnQgZm9yIExDTl9STF9OT1RfTUFQUEVEIGFuZCBhdXRvbWF0aWMgbWFwcGluZyBvZgorCSAgZnVydGhlciBydW5saXN0IHBhcnRzIHZpYSBhdHRyaWIuYzo6bWFwX3J1bl9saXN0KCkuCisJLSBUaW55IGVuZGlhbm5lc3MgYnVnIGZpeCBpbiBkZWNvbXByZXNzX21hcHBpbmdfcGFpcnMoKS4KKwordG5nLTAuMC42IC0gRW5jcnlwdGVkIGRpcmVjdG9yaWVzLCBidWcgZml4ZXMsIGNsZWFudXBzLCBkZWJ1Z2dpbmcgZW5oYW5jZW1lbnRzLgorCisJLSBFbmFibGUgZW5jcnlwdGVkIGRpcmVjdG9yaWVzLiAoVGhlaXIgaW5kZXggcm9vdCBpcyBtYXJrZWQgZW5jcnlwdGVkCisJICB0byBpbmRpY2F0ZSB0aGF0IG5ldyBmaWxlcyBpbiB0aGF0IGRpcmVjdG9yeSBzaG91bGQgYmUgY3JlYXRlZAorCSAgZW5jcnlwdGVkLikKKwktIEZpeCBidWcgaW4gTklub0JtcE5vblJlc2lkZW50KCkgbWFjcm8uIChDdXQgYW5kIHBhc3RlIGVycm9yLikKKwktIEVuYWJsZSAkRXh0ZW5kIHN5c3RlbSBkaXJlY3RvcnkuIE1vc3QgKGlmIG5vdCBhbGwpIGV4dGVuZGVkIHN5c3RlbQorCSAgZmlsZXMgZG8gbm90IGhhdmUgdW5uYW1lZCBkYXRhIGF0dHJpYnV0ZXMgc28gbnRmc19yZWFkX2lub2RlKCkgaGFkIHRvCisJICBzcGVjaWFsIGNhc2UgdGhlbSBidXQgdGhhdCBpcyBvaywgYXMgdGhlIHNwZWNpYWwgY2FzaW5nIHJlY292ZXJ5CisJICBoYXBwZW5zIGluc2lkZSBhbiBlcnJvciBjb2RlIHBhdGggc28gdGhlcmUgaXMgemVybyBzbG93IGRvd24gaW4gdGhlCisJICBub3JtYWwgZmFzdCBwYXRoLiBUaGUgc3BlY2lhbCBjYXNpbmcgaXMgZG9uZSBieSBpbnRyb2R1Y2luZyBhIG5ldworCSAgZnVuY3Rpb24gaW5vZGUuYzo6bnRmc19pc19leHRlbmRlZF9zeXN0ZW1fZmlsZSgpIHdoaWNoIGNoZWNrcyBpZiBhbnkKKwkgIG9mIHRoZSBoYXJkIGxpbmtzIGluIHRoZSBpbm9kZSBwb2ludCB0byAkRXh0ZW5kIGFzIGJlaW5nIHRoZWlyIHBhcmVudAorCSAgZGlyZWN0b3J5IGFuZCBpZiB0aGV5IGRvIHdlIGFzc3VtZSB0aGlzIGlzIGFuIGV4dGVuZGVkIHN5c3RlbSBmaWxlLgorCS0gQ3JlYXRlIGEgc3lzY3RsL3Byb2MgaW50ZXJmYWNlIHRvIGFsbG93IHtkaXMsZW59YWJsaW5nIG9mIGRlYnVnIG91dHB1dAorCSAgd2hlbiBjb21waWxlZCB3aXRoIC1EREVCVUcuIERlZmF1bHQgaXMgZGVidWcgbWVzc2FnZXMgdG8gYmUgZGlzYWJsZWQuCisJICBUbyBlbmFibGUgdGhlbSwgb25lIHdyaXRlcyBhIG5vbi16ZXJvIHZhbHVlIHRvIC9wcm9jL3N5cy9mcy9udGZzLWRlYnVnCisJICAoaWYgL3Byb2MgaXMgZW5hYmxlZCkgb3IgdXNlcyBzeXNjdGwoMikgdG8gZWZmZWN0IHRoZSBzYW1lIChpZiBzeXNjdGwKKwkgIGludGVyZmFjZSBpcyBlbmFibGVkKS4gSW5zcGlyZWQgYnkgb2xkIG50ZnMgZHJpdmVyLgorCS0gQWRkIGRlYnVnX21zZ3MgaW5zbW9kL2tlcm5lbCBib290IHBhcmFtZXRlciB0byBzZXQgd2hldGhlciBkZWJ1ZworCSAgbWVzc2FnZXMgYXJlIHtkaXMsZW59YWJsZWQuIFRoaXMgaXMgdXNlZnVsIHRvIGVuYWJsZSBkZWJ1ZyBtZXNzYWdlcworCSAgZHVyaW5nIG50ZnMgaW5pdGlhbGl6YXRpb24gYW5kIGlzIHRoZSBvbmx5IHdheSB0byBhY3RpdmF0ZSBkZWJ1Z2dpbmcKKwkgIHdoZW4gdGhlIHN5c2N0bCBpbnRlcmZhY2UgaXMgbm90IGVuYWJsZWQuCisJLSBDbGVhbnVwIGRlYnVnIG91dHB1dCBpbiB2YXJpb3VzIHBsYWNlcy4KKwktIFJlbW92ZSBhbGwgZG9sbGFyIHNpZ25zICgkKSBmcm9tIHRoZSBzb3VyY2UgKGV4Y2VwdCBjb21tZW50cykgdG8KKwkgIGVuYWJsZSBjb21waWxhdGlvbiBvbiBhcmNoaXRlY3R1cmVzIHdob3NlIGdjYyBjb21waWxlciBkb2VzIG5vdAorCSAgc3VwcG9ydCBkb2xsYXIgc2lnbnMgaW4gdGhlIG5hbWVzIG9mIHZhcmlhYmxlcy9jb25zdGFudHMuIEF0dHJpYnV0ZQorCSAgdHlwZXMgbm93IHN0YXJ0IHdpdGggQVRfIGluc3RlYWQgb2YgJCBhbmQgJEkzMCBpcyBub3cganVzdCBJMzAuCisJLSBDbGVhbnVwIG50ZnNfbG9va3VwKCkgYW5kIGFkZCBjb25zaXN0ZW5jeSBjaGVjayBvZiBzZXF1ZW5jZSBudW1iZXJzLgorCS0gTG9hZCBjb21wbGV0ZSBydW5saXN0IGZvciAkTUZULyRCSVRNQVAgZHVyaW5nIG1vdW50IGFuZCBjbGVhbnVwCisJICBhY2Nlc3MgZnVuY3Rpb25zLiBUaGlzIG1lYW5zIHdlIG5vdyBjb3BlIHdpdGggJE1GVC8kQklUTUFQIGJlaW5nCisJICBzcHJlYWQgYWNjcm9zcyBzZXZlcmFsIG1mdCByZWNvcmRzLgorCS0gRGlzYWJsZSBtb2RpZmljYXRpb24gb2YgbWZ0X3pvbmVfbXVsdGlwbGllciBvbiByZW1vdW50LiBXZSBjYW4gYWx3YXlzCisJICByZWVuYWJsZSB0aGlzIGxhdGVyIG9uIGlmIHdlIHJlYWxseSB3YW50IHRvLCBidXQgd2Ugd2lsbCBuZWVkIHRvIG1ha2UKKwkgIHN1cmUgd2UgcmVhZGp1c3QgdGhlIG1mdF96b25lIHNpemUgLyBsYXlvdXQgYWNjb3JkaW5nbHkuCisKK3RuZy0wLjAuNSAtIE1vZGVybml6ZSBmb3IgMi41LnggYW5kIGZ1cnRoZXIgaW4gbGluZS1pbmcgd2l0aCBBbCBWaXJvJ3MgY29tbWVudHMuCisKKwktIFVzZSBzYl9zZXRfYmxvY2tzaXplKCkgaW5zdGVhZCBvZiBzZXRfYmxvY2tzaXplKCkgYW5kIHZlcmlmeSB0aGUKKwkgIHJldHVybiB2YWx1ZS4KKwktIFVzZSBzYl9icmVhZCgpIGluc3RlYWQgb2YgYnJlYWQoKSB0aHJvdWdob3V0LgorCS0gQWRkIGluZGV4X3Zjbl9zaXple19iaXRzfSB0byBudGZzX2lub2RlIHN0cnVjdHVyZSB0byBzdG9yZSB0aGUgc2l6ZQorCSAgb2YgYSBkaXJlY3RvcnkgaW5kZXggYmxvY2sgdmNuLiBBcHBseSByZXN1bHRpbmcgc2ltcGxpZmljYXRpb25zIGluCisJICBkaXIuYyBldmVyeXdoZXJlLgorCS0gRml4IGEgc21hbGwgYnVnIHNvbWV3aGVyZSAoYnV0IGZvcmdvdCB3aGF0IGl0IHdhcykuCisJLSBDaGFuZ2UgbnRmc197ZGVidWcsZXJyb3Isd2FybmluZ30gdG8gZW5hYmxlIGdjYyB0byBkbyB0eXBlIGNoZWNraW5nCisJICBvbiB0aGUgcHJpbnRmLWZvcm1hdCBwYXJhbWV0ZXIgbGlzdCBhbmQgZml4IGJ1Z3MgcmVwb3J0ZWQgYnkgZ2NjCisJICBhcyBhIHJlc3VsdC4gKFJpY2hhcmQgUnVzc29uKQorCS0gTW92ZSBpbm9kZSBhbGxvY2F0aW9uIHN0cmF0ZWd5IHRvIEFsJ3MgbmV3IHN0dWZmIGJ1dCBtYWludGFpbiB0aGUKKwkgIGRpdm9yY2Ugb2YgbnRmc19pbm9kZSBmcm9tIHN0cnVjdCBpbm9kZS4gVG8gYWNoaWV2ZSB0aGlzIHdlIGhhdmUgdHdvCisJICBzZXBhcmF0ZSBzbGFiIGNhY2hlcywgb25lIGZvciBiaWcgbnRmcyBpbm9kZXMgY29udGFpbmluZyBhIHN0cnVjdAorCSAgaW5vZGUgYW5kIHB1cmUgbnRmcyBpbm9kZXMgYW5kIGF0IHRoZSBzYW1lIHRpbWUgZml4IHNvbWUgZmF1bHR5CisJICBlcnJvciBjb2RlIHBhdGhzIGluIG50ZnNfcmVhZF9pbm9kZSgpLgorCS0gU2hvdyBtb3VudCBvcHRpb25zIGluIHByb2MgKGlub2RlLmM6Om50ZnNfc2hvd19vcHRpb25zKCkpLgorCit0bmctMC4wLjQgLSBCaWcgY2hhbmdlcywgZ2V0dGluZyBpbiBsaW5lIHdpdGggQWwgVmlybydzIGNvbW1lbnRzLgorCisJLSBNb2RpZmllZCAodW4pbWFwX21mdF9yZWNvcmQgZnVuY3Rpb25zIHRvIGJlIGNvbW1vbiBmb3IgcmVhZCBhbmQgd3JpdGUKKwkgIGNhc2UuIFRvIHNwZWNpZnkgd2hpY2ggaXMgd2hpY2gsIGFkZGVkIGV4dHJhIHBhcmFtZXRlciBhdCBmcm9udCBvZgorCSAgcGFyYW1ldGVyIGxpc3QuIFBhc3MgZWl0aGVyIFJFQUQgb3IgV1JJVEUgdG8gdGhpcywgZWFjaCBoYXMgdGhlCisJICBvYnZpb3VzIG1lYW5pbmcuCisJLSBHZW5lcmFsIGNsZWFudXBzIHRvIGFsbG93IGZvciBlYXNpZXIgZm9sZGluZyBpbiB2aS4KKwktIGF0dHJpYi5jOjpkZWNvbXByZXNzX21hcHBpbmdfcGFpcnMoKSBub3cgYWNjZXB0cyB0aGUgb2xkIHJ1bmxpc3QKKwkgIGFyZ3VtZW50LCBhbmQgaW52b2tlcyBhdHRyaWIuYzo6bWVyZ2VfcnVuX2xpc3RzKCkgdG8gbWVyZ2UgdGhlIG9sZAorCSAgYW5kIHRoZSBuZXcgcnVubGlzdHMuCisJLSBSZW1vdmVkIGF0dHJpYi5jOjpmaW5kX2ZpcnN0X2F0dHIoKS4KKwktIEltcGxlbWVudGVkIGxvYWRpbmcgb2YgYXR0cmlidXRlIGxpc3QgYW5kIGNvbXBsZXRlIHJ1bmxpc3QgZm9yICRNRlQuCisJICBUaGlzIG1lYW5zIHdlIG5vdyBjb3BlIHdpdGggJE1GVCBiZWluZyBzcHJlYWQgYWNyb3NzIHNldmVyYWwgbWZ0CisJICByZWNvcmRzLgorCS0gQWRhcHQgdG8gMi41LjItcHJlOSBhbmQgdGhlIGNoYW5nZWQgY3JlYXRlX2VtcHR5X2J1ZmZlcnMoKSBzeW50YXguCisJLSBBZGFwdCBtYWpvci9taW5vci9rZGV2X3QvW2JrXWRldm5hbWUgc3R1ZmYgdG8gbmV3IDIuNS54IGtlcm5lbHMuCisJLSBNYWtlIG50ZnNfdm9sdW1lIGJlIGFsbG9jYXRlZCB2aWEga21hbGxvYygpIGluc3RlYWQgb2YgdXNpbmcgYSBzbGFiCisJICBjYWNoZS4gVGhlcmUgYXJlIHRvbyBsaXR0bGUgbnRmc192b2x1bWUgc3RydWN0dXJlcyBhdCBhbnkgb25lIHRpbWUKKwkgIHRvIGp1c3RpZnkgYSBwcml2YXRlIHNsYWIgY2FjaGUuCisJLSBGaXggYm9ndXMga21hcCgpIHVzZSBpbiBhc3luYyBpbyBjb21wbGV0aW9uLiBOb3cgdXNlIGttYXBfYXRvbWljKCkuCisJICBVc2UgS01fQklPX0lSUSBvbiBhZHZpY2UgZnJvbSBJUkMva2VybmVsLi4uCisJLSBVc2UgbnRmc19tYXBfcGFnZSgpIGluIG1hcF9tZnRfcmVjb3JkKCkgYW5kIGNyZWF0ZSAtPnJlYWRwYWdlIG1ldGhvZAorCSAgZm9yIHJlYWRpbmcgJE1GVCAobnRmc19tZnRfcmVhZHBhZ2UpLiBJbiB0aGUgcHJvY2VzcyBjcmVhdGUgZGVkaWNhdGVkCisJICBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgKG50ZnNfbWZ0X2FvcHMpIGZvciAkTUZUIGlub2RlIG1hcHBpbmcuIEFsc28KKwkgIHJlbW92ZWQgdGhlIG5vdyBzdXBlcmZsdW91cyBleHBvcnRzIGZyb20gdGhlIGtlcm5lbCBjb3JlIHBhdGNoLgorCS0gRml4IGEgYnVnIHdoZXJlIGtmcmVlKCkgd2FzIHVzZWQgaW5zdGVkIG9mIG50ZnNfZnJlZSgpLgorCS0gQ2hhbmdlIG1hcF9tZnRfcmVjb3JkKCkgdG8gdGFrZSBudGZzX2lub2RlIGFzIGFyZ3VtZW50IGluc3RlYWQgb2YKKwkgIHZmcyBpbm9kZS4gRGl0byBmb3IgdW5tYXBfbWZ0X3JlY29yZCgpLiBBZGFwdCBhbGwgY2FsbGVycy4KKwktIEFkZCBwb2ludGVyIHRvIG50ZnNfdm9sdW1lIHRvIG50ZnNfaW5vZGUuCisJLSBBZGQgbWZ0IHJlY29yZCBudW1iZXIgYW5kIHNlcXVlbmNlIG51bWJlciB0byBudGZzX2lub2RlLiBTdG9wIHVzaW5nCisJICBpX2lubyBhbmQgaV9nZW5lcmF0aW9uIGZvciBpbi1kcml2ZXIgcHVycG9zZXMuCisJLSBJbXBsZW1lbnQgYXR0cmliLmM6Om1lcmdlX3J1bl9saXN0cygpLiAoUmljaGFyZCBSdXNzb24pCisJLSBSZW1vdmUgdXNlIG9mIHByb3BlciBpbm9kZXMgYnkgZXh0ZW50IGlub2Rlcy4gTW92ZSBpX2lubyBhbmQKKwkgIGlfZ2VuZXJhdGlvbiB0byBudGZzX2lub2RlIHRvIGRvIHRoaXMuIEFwcGx5IHNpbXBsaWZpY2F0aW9ucyB0aGF0CisJICByZXN1bHQgYW5kIHJlbW92ZSBpZ2V0X25vX3dhaXQoKSwgZXRjLgorCS0gUGFzcyBudGZzX2lub2RlIGV2ZXJ5d2hlcmUgaW4gdGhlIGRyaXZlciAodXNlZCB0byBiZSBzdHJ1Y3QgaW5vZGUpLgorCS0gQWRkIHJlZmVyZW5jZSBjb3VudGluZyBpbiBudGZzX2lub2RlIGZvciB0aGUgbnRmcyBpbm9kZSBpdHNlbGYgYW5kCisJICBmb3IgdGhlIG1hcHBlZCBtZnQgcmVjb3JkLgorCS0gRXh0ZW5kIG1mdCByZWNvcmQgbWFwcGluZyBzbyB3ZSBjYW4gKHVuKW1hcCBleHRlbnQgbWZ0IHJlY29yZHMgKG5ldworCSAgZnVuY3Rpb25zICh1biltYXBfZXh0ZW50X21mdF9yZWNvcmQpLCBhbmQgc28gbWFwcGluZ3MgYXJlIHJlZmVyZW5jZQorCSAgY291bnRlZCBhbmQgZG9uJ3QgaGF2ZSB0byBoYXBwZW4gdHdpY2UgaWYgYWxyZWFkeSBtYXBwZWQgLSBqdXN0IHJlZgorCSAgY291bnQgaW5jcmVhc2VzLgorCS0gQWRkIC1vIGlvY2hhcnNldCBhcyBhbGlhcyB0byAtbyBubHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorCS0gVGhlIGxhdGVzdCBjb3JlIHBhdGNoIGlzIG5vdyB0aW55LiBJbiBmYWN0IGp1c3QgYSBzaW5nbGUgYWRkaXRpb25hbAorCSAgZXhwb3J0IGlzIG5lY2Vzc2FyeSBvdmVyIHRoZSBiYXNlIGtlcm5lbC4KKwordG5nLTAuMC4zIC0gQ2xlYW51cHMsIGVuaGFuY2VtZW50cywgYnVnIGZpeGVzLgorCisJLSBXb3JrIG9uIGF0dHJpYi5jOjpkZWNvbXByZXNzX21hcHBpbmdfcGFpcnMoKSB0byBkZXRlY3QgYmFzZSBleHRlbnRzCisJICBhbmQgc2V0dXAgdGhlIHJ1bmxpc3QgYXBwcm9wcmlhdGVseSB1c2luZyBrbm93bGVkZ2UgcHJvdmlkZWQgYnkgdGhlCisJICBzaXplcyBpbiB0aGUgYmFzZSBhdHRyaWJ1dGUgcmVjb3JkLgorCS0gQmFsYW5jZSB0aGUgZ2V0Xy9wdXRfYXR0cl9zZWFyY2hfY3R4KCkgY2FsbHMgc28gd2UgZG9uJ3QgbGVhayBtZW1vcnkKKwkgIGFueSBtb3JlLgorCS0gSW50cm9kdWNlIG50ZnNfbWFsbG9jX25vZnMoKSBhbmQgbnRmc19mcmVlKCkgdG8gYWxsb2NhdGUvZnJlZSBhIHNpbmdsZQorCSAgcGFnZSBvciB1c2Ugdm1hbGxvYyBkZXBlbmRpbmcgb24gdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWVzdGVkLgorCS0gQ2xlYW51cCBlcnJvciBvdXRwdXQuIFRoZSBfX0ZVTkNUSU9OX18gIigpOiAiIGlzIG5vdyBhZGRlZAorCSAgYXV0b21hdGljYWxseS4gSW50cm9kdWNlZCBhIG5ldyBoZWFkZXIgZmlsZSBkZWJ1Zy5oIHRvIHN1cHBvcnQgdGhpcworCSAgYW5kIGFsc28gbW92ZWQgbnRmc19kZWJ1ZygpIGZ1bmN0aW9uIGludG8gaXQuCisJLSBNYWtlIHJlYWRpbmcgb2YgY29tcHJlc3NlZCBmaWxlcyBtb3JlIGludGVsbGlnZW50IGFuZCBlc3BlY2lhbGx5IGdldAorCSAgcmlkIG9mIHRoZSB2bWFsbG9jX25vZnMoKSBmcm9tIHJlYWRwYWdlKCkuIFRoaXMgbm93IHVzZXMgcGVyIENQVQorCSAgYnVmZmVycyAoYWxsb2NhdGVkIGF0IGZpcnN0IG1vdW50IHdpdGggY2x1c3RlciBzaXplIDw9IDRraUIgYW5kCisJICBkZWFsbG9jYXRlZCBvbiBsYXN0IHVtb3VudCB3aXRoIGNsdXN0ZXIgc2l6ZSA8PSA0a2lCKSwgYW5kCisJICBhc3luY2hyb25vdXMgaW8gZm9yIHRoZSBjb21wcmVzc2VkIGRhdGEgdXNpbmcgYSBsaXN0IG9mIGJ1ZmZlciBoZWFkcy4KKwkgIEVyLCB3ZSB1c2Ugc3luY2hyb25vdXMgaW8gYXMgYXN5bmMgaW8gb25seSB3b3JrcyBvbiB3aG9sZSBwYWdlcworCSAgY292ZXJlZCBieSBidWZmZXJzIGFuZCBub3Qgb24gaW5kaXZpZHVhbCBidWZmZXIgaGVhZHMuLi4KKwktIEJ1ZyBmaXggZm9yIHJlYWRpbmcgY29tcHJlc3NlZCBmaWxlcyB3aXRoIHNwYXJzZSBjb21wcmVzc2lvbiBibG9ja3MuCisKK3RuZy0wLjAuMiAtIE5vdyBoYW5kbGVzIGxhcmdlci9mcmFnbWVudGVkL2NvbXByZXNzZWQgdm9sdW1lcy9maWxlcy9kaXJzLgorCisJLSBGaXhlZCBoYW5kbGluZyBvZiBkaXJlY3RvcmllcyB3aGVuIGNsdXN0ZXIgc2l6ZSBleGNlZWRzIGluZGV4IGJsb2NrCisJICBzaXplLgorCS0gSGlkZSBET1Mgb25seSBuYW1lIHNwYWNlIGRpcmVjdG9yeSBlbnRyaWVzIGZyb20gcmVhZGRpcigpIGJ1dCBhbGxvdworCSAgdGhlbSBpbiBsb29rdXAoKS4gVGhpcyBzaG91bGQgZml4IHRoZSBwcm9ibGVtIHRoYXQgTGludXggZG9lc24ndAorCSAgc3VwcG9ydCBkaXJlY3RvcnkgaGFyZCBsaW5rcywgd2hpbGUgc3RpbGwgYWxsb3dpbmcgYWNjZXNzIHRvIGVudHJpZXMKKwkgIHZpYSB0aGVpciBzaG9ydCBmaWxlIG5hbWUuIFRoaXMgYWxzbyBoYXMgdGhlIGJlbmVmaXQgb2YgbWltaWNraW5nCisJICB3aGF0IFdpbmRvd3MgdXNlcnMgYXJlIHVzZWQgdG8sIHNvIGl0IGlzIHRoZSBpZGVhbCBzb2x1dGlvbi4KKwktIEltcGxlbWVudGVkIHN5bmNfcGFnZSBldmVyeXdoZXJlIHNvIG5vIG1vcmUgaGFuZ3MgaW4gRCBzdGF0ZSB3aGVuCisJICB3YWl0aW5nIGZvciBhIHBhZ2UuCisJLSBTdG9wIHVzaW5nIGJmb3JnZXQoKSBpbiBmYXZvdXIgb2YgYnJlbHNlKCkuCisJLSBTdG9wIGxvY2tpbmcgYnVmZmVycyB1bm5lY2Vzc2FyaWx5LgorCS0gSW1wbGVtZW50ZWQgY29tcHJlc3NlZCBmaWxlcyAoaW5vZGUtPm1hcHBpbmcgY29udGFpbnMgdW5jb21wcmVzc2VkCisJICBkYXRhLCByYXcgY29tcHJlc3NlZCBkYXRhIGlzIGN1cnJlbnRseSBicmVhZCgpIGludG8gYSB2bWFsbG9jKCllZAorCSAgbWVtb3J5IGJ1ZmZlcikuCisJLSBFbmFibGUgY29tcHJlc3NlZCBkaXJlY3Rvcmllcy4gKFRoZWlyIGluZGV4IHJvb3QgaXMgbWFya2VkIGNvbXByZXNzZWQKKwkgIHRvIGluZGljYXRlIHRoYXQgbmV3IGZpbGVzIGluIHRoYXQgZGlyZWN0b3J5IHNob3VsZCBiZSBjcmVhdGVkCisJICBjb21wcmVzc2VkLikKKwktIFVzZSB2c25wcmludGYgcmF0aGVyIHRoYW4gdnNwcmludGYgaW4gdGhlIG50ZnNfZXJyb3IgYW5kIG50ZnNfd2FybmluZworCSAgZnVuY3Rpb25zLiAoVGhhbmtzIHRvIFdpbGwgRHlzb24gZm9yIHBvaW50aW5nIHRoaXMgb3V0LikKKwktIE1vdmVkIHRoZSBudGZzX2lub2RlIGFuZCBudGZzX3ZvbHVtZSAodGhlIGZvcm1lciBudGZzX2lub2RlX2luZm8gYW5kCisJICBudGZzX3NiX2luZm8pIG91dCBvZiB0aGUgY29tbW9uIGlub2RlIGFuZCBzdXBlcl9ibG9jayBzdHJ1Y3R1cmVzIGFuZAorCSAgc3RhcnRlZCB1c2luZyB0aGUgZ2VuZXJpY19pcCBhbmQgZ2VuZXJpY19zYnAgcG9pbnRlcnMgaW5zdGVhZC4gVGhpcworCSAgbWFrZXMgbnRmcyBlbnRpcmVseSBwcml2YXRlIHdpdGggcmVzcGVjdCB0byB0aGUga2VybmVsIHRyZWUuCisJLSBEZXRlY3QgY29tcGlsZXIgdmVyc2lvbiBhbmQgYWJvcnQgd2l0aCBlcnJvciBtZXNzYWdlIGlmIGdjYyBsZXNzIHRoYW4KKwkgIDIuOTYgaXMgdXNlZC4KKwktIEZpeCBidWcgaW4gbmFtZSBjb21wYXJpc29uIGZ1bmN0aW9uIGluIHVuaXN0ci5jLgorCS0gSW1wbGVtZW50IGF0dHJpYnV0ZSBsaXN0cyBwYXJ0IDEsIHRoZSBpbmZyYXN0cnVjdHVyZTogc2VhcmNoIGNvbnRleHRzCisJICBhbmQgb3BlcmF0aW9ucywgZmluZF9leHRlcm5hbF9hdHRyKCksIGxvb2t1cF9hdHRyKCkpIGFuZCBtYWtlIHRoZQorCSAgY29kZSB1c2UgdGhlIGluZnJhc3RydWN0dXJlLgorCS0gRml4IHN0dXBpZCBidWZmZXIgb3ZlcmZsb3cgYnVnIHRoYXQgYmVjYW1lIGFwcGFyZW50IG9uIGxhcmdlciBydW4KKwkgIGxpc3QgY29udGFpbmluZyBhdHRyaWJ1dGVzLgorCS0gRml4IGJ1Z3MgaW4gcmVhZGRpcigpIHRoYXQgYmVjYW1lIGFwcGFyZW50IG9uIGxhcmdlciBkaXJlY3Rvcmllcy4KKworCVRoZSBkcml2ZXIgaXMgbm93IHJlYWxseSB1c2VmdWwgYW5kIHN1cnZpdmVzIHRoZSB0ZXN0CisJCWZpbmQgLiAtdHlwZSBmIC1leGVjIG1kNXN1bSAie30iIFw7CisJd2l0aG91dCBhbnkgZXJyb3IgbWVzc2FnZXMgb24gYSBvdmVyIDFHaUIgc2l6ZWQgcGFydGl0aW9uIHdpdGggPjE2aworCWZpbGVzIG9uIGl0LCBpbmNsdWRpbmcgY29tcHJlc3NlZCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYW5kIG1hbnkgZmlsZXMKKwlhbmQgZGlyZWN0b3JpZXMgd2l0aCBhdHRyaWJ1dGUgbGlzdHMuCisKK3RuZy0wLjAuMSAtIFRoZSBmaXJzdCB1c2VmdWwgdmVyc2lvbi4KKworCS0gQWRkZWQgbnRmc19sb29rdXAoKS4KKwktIEFkZGVkIGRlZmF1bHQgdXBjYXNlIGdlbmVyYXRpb24gYW5kIGhhbmRsaW5nLgorCS0gQWRkZWQgY29tcGlsZSBvcHRpb25zIHRvIGJlIHNob3duIG9uIG1vZHVsZSBpbml0LgorCS0gTWFueSBidWcgZml4ZXMgdGhhdCB3ZXJlICJoaWRkZW4iIGJlZm9yZS4KKwktIFVwZGF0ZSB0byBsYXRlc3Qga2VybmVsLgorCS0gQWRkZWQgbnRmc19yZWFkZGlyKCkuCisJLSBBZGRlZCBmaWxlIG9wZXJhdGlvbnMgZm9yIG1tYXAoKSwgcmVhZCgpLCBvcGVuKCkgYW5kIGxsc2VlaygpLiBXZSBqdXN0CisJICB1c2UgdGhlIGdlbmVyaWMgb25lcy4gVGhlIHdob2xlIHBvaW50IG9mIGdvaW5nIHRocm91Z2ggaW1wbGVtZW50aW5nCisJICByZWFkcGFnZSgpIG1ldGhvZHMgYW5kIHdoZXJlIHBvc3NpYmxlIGdldF9ibG9jaygpIGNhbGwgYmFja3MgaXMgdGhhdAorCSAgdGhpcyBhbGxvd3MgdXMgdG8gbWFrZSB1c2Ugb2YgdGhlIGdlbmVyaWMgaGlnaCBsZXZlbCBtZXRob2RzIHByb3ZpZGVkCisJICBieSB0aGUga2VybmVsLgorCisJVGhlIGRyaXZlciBpcyBub3cgYWN0dWFsbHkgdXNlZnVsISBZZXkuICgtOiBJdCB1bmRvdWJ0ZWRseSBoYXMgZ290IGJ1Z3MKKwl0aG91Z2ggYW5kIGl0IGRvZXNuJ3QgaW1wbGVtZW50IGFjY2Vzc3NpbmcgY29tcHJlc3NlZCBmaWxlcyB5ZXQuIEFsc28sCisJYWNjZXNzaW5nIGZpbGVzIHdpdGggYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlcyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0CisJZWl0aGVyLiBCdXQgZm9yIHNtYWxsIG9yIHNpbXBsZSBmaWxlIHN5c3RlbXMgaXQgc2hvdWxkIHdvcmsgYW5kIGFsbG93CisJeW91IHRvIGxpc3QgZGlyZWN0b3JpZXMsIHVzZSBzdGF0IG9uIGRpcmVjdG9yeSBlbnRyaWVzIGFuZCB0aGUgZmlsZQorCXN5c3RlbSwgb3BlbiwgcmVhZCwgbW1hcCBhbmQgbGxzZWVrIGFyb3VuZCBpbiBmaWxlcy4gQSBiaWcgbWlsZSBzdG9uZQorCWhhcyBiZWVuIHJlYWNoZWQhCisKK3RuZy0wLjAuMCAtIEluaXRpYWwgdmVyc2lvbiB0YWcuCisKKwlJbml0aWFsIGRyaXZlciBpbXBsZW1lbnRhdGlvbi4gVGhlIGRyaXZlciBjYW4gbW91bnQgYW5kIHVtb3VudCBzaW1wbGUKKwlOVEZTIGZpbGUgc3lzdGVtcyAoaS5lLiBvbmVzIHdpdGhvdXQgYXR0cmlidXRlIGxpc3RzIGluIHRoZSBzeXN0ZW0KKwlmaWxlcykuIElmIHRoZSBtb3VudCBmYWlscyB0aGVyZSBtaWdodCBiZSBwcm9ibGVtcyBpbiB0aGUgZXJyb3IgaGFuZGxpbmcKKwljb2RlIHBhdGhzLCBzbyBiZSB3YXJuZWQuIE90aGVyd2lzZSBpdCBzZWVtcyB0byBiZSBsb2FkaW5nIHRoZSBzeXN0ZW0KKwlmaWxlcyBuaWNlbHkgYW5kIHRoZSBtZnQgcmVjb3JkIHJlYWQgbWFwcGluZy91bm1hcHBpbmcgc2VlbXMgdG8gYmUKKwl3b3JraW5nIG5pY2VseSwgdG9vLiBQcm9vZiBvZiBpbm9kZSBtZXRhZGF0YSBpbiB0aGUgcGFnZSBjYWNoZSBhbmQgbm9uLQorCXJlc2lkZW50IGZpbGUgdW5uYW1lZCBzdHJlYW0gZGF0YSBpbiB0aGUgcGFnZSBjYWNoZSBjb25jZXB0cyBpcyB0aHVzCisJY29tcGxldGUuCmRpZmYgLS1naXQgYS9mcy9udGZzL01ha2VmaWxlIGIvZnMvbnRmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjY2MzgxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDE5IEBACisjIFJ1bGVzIGZvciBtYWtpbmcgdGhlIE5URlMgZHJpdmVyLgorCitvYmotJChDT05GSUdfTlRGU19GUykgKz0gbnRmcy5vCisKK250ZnMtb2JqcyA6PSBhb3BzLm8gYXR0cmliLm8gY29sbGF0ZS5vIGNvbXByZXNzLm8gZGVidWcubyBkaXIubyBmaWxlLm8gXAorCSAgICAgaW5kZXgubyBpbm9kZS5vIG1mdC5vIG1zdC5vIG5hbWVpLm8gcnVubGlzdC5vIHN1cGVyLm8gc3lzY3RsLm8gXAorCSAgICAgdW5pc3RyLm8gdXBjYXNlLm8KKworRVhUUkFfQ0ZMQUdTID0gLUROVEZTX1ZFUlNJT049XCIyLjEuMjJcIgorCitpZmVxICgkKENPTkZJR19OVEZTX0RFQlVHKSx5KQorRVhUUkFfQ0ZMQUdTICs9IC1EREVCVUcKK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX05URlNfUlcpLHkpCitFWFRSQV9DRkxBR1MgKz0gLUROVEZTX1JXCisKK250ZnMtb2JqcyArPSBiaXRtYXAubyBsY25hbGxvYy5vIGxvZ2ZpbGUubyBxdW90YS5vCitlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9hb3BzLmMgYi9mcy9udGZzL2FvcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWQ1NmU0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9hb3BzLmMKQEAgLTAsMCArMSwyMzI0IEBACisvKioKKyAqIGFvcHMuYyAtIE5URlMga2VybmVsIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyBhbmQgcGFnZSBjYWNoZSBoYW5kbGluZy4KKyAqCSAgICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUmljaGFyZCBSdXNzb24KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKworI2luY2x1ZGUgImFvcHMuaCIKKyNpbmNsdWRlICJhdHRyaWIuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImlub2RlLmgiCisjaW5jbHVkZSAibWZ0LmgiCisjaW5jbHVkZSAicnVubGlzdC5oIgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAibnRmcy5oIgorCisvKioKKyAqIG50ZnNfZW5kX2J1ZmZlcl9hc3luY19yZWFkIC0gYXN5bmMgaW8gY29tcGxldGlvbiBmb3IgcmVhZGluZyBhdHRyaWJ1dGVzCisgKiBAYmg6CQlidWZmZXIgaGVhZCBvbiB3aGljaCBpbyBpcyBjb21wbGV0ZWQKKyAqIEB1cHRvZGF0ZToJd2hldGhlciBAYmggaXMgbm93IHVwdG9kYXRlIG9yIG5vdAorICoKKyAqIEFzeW5jaHJvbm91cyBJL08gY29tcGxldGlvbiBoYW5kbGVyIGZvciByZWFkaW5nIHBhZ2VzIGJlbG9uZ2luZyB0byB0aGUKKyAqIGF0dHJpYnV0ZSBhZGRyZXNzIHNwYWNlIG9mIGFuIGlub2RlLiAgVGhlIGlub2RlcyBjYW4gZWl0aGVyIGJlIGZpbGVzIG9yCisgKiBkaXJlY3RvcmllcyBvciB0aGV5IGNhbiBiZSBmYWtlIGlub2RlcyBkZXNjcmliaW5nIHNvbWUgYXR0cmlidXRlLgorICoKKyAqIElmIE5Jbm9Nc3RQcm90ZWN0ZWQoKSwgcGVyZm9ybSB0aGUgcG9zdCByZWFkIG1zdCBmaXh1cHMgd2hlbiBhbGwgSU8gb24gdGhlCisgKiBwYWdlIGhhcyBiZWVuIGNvbXBsZXRlZCBhbmQgbWFyayB0aGUgcGFnZSB1cHRvZGF0ZSBvciBzZXQgdGhlIGVycm9yIGJpdCBvbgorICogdGhlIHBhZ2UuICBUbyBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIHJlY29yZHMgdGhhdCBuZWVkIGZpeGluZyB1cCwgd2UKKyAqIGNoZWF0IGEgbGl0dGxlIGJpdCBieSBzZXR0aW5nIHRoZSBpbmRleF9ibG9ja19zaXplIGluIG50ZnNfaW5vZGUgdG8gdGhlIG50ZnMKKyAqIHJlY29yZCBzaXplLCBhbmQgaW5kZXhfYmxvY2tfc2l6ZV9iaXRzLCB0byB0aGUgbG9nKGJhc2UgMikgb2YgdGhlIG50ZnMKKyAqIHJlY29yZCBzaXplLgorICovCitzdGF0aWMgdm9pZCBudGZzX2VuZF9idWZmZXJfYXN5bmNfcmVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdXB0b2RhdGUpCit7CisJc3RhdGljIERFRklORV9TUElOTE9DSyhwYWdlX3VwdG9kYXRlX2xvY2spOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICp0bXA7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJbnRmc19pbm9kZSAqbmk7CisJaW50IHBhZ2VfdXB0b2RhdGUgPSAxOworCisJcGFnZSA9IGJoLT5iX3BhZ2U7CisJbmkgPSBOVEZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCk7CisKKwlpZiAobGlrZWx5KHVwdG9kYXRlKSkgeworCQlzNjQgZmlsZV9vZnM7CisKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisKKwkJZmlsZV9vZnMgPSAoKHM2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArCisJCQkJYmhfb2Zmc2V0KGJoKTsKKwkJLyogQ2hlY2sgZm9yIHRoZSBjdXJyZW50IGJ1ZmZlciBoZWFkIG92ZXJmbG93aW5nLiAqLworCQlpZiAoZmlsZV9vZnMgKyBiaC0+Yl9zaXplID4gbmktPmluaXRpYWxpemVkX3NpemUpIHsKKwkJCWNoYXIgKmFkZHI7CisJCQlpbnQgb2ZzID0gMDsKKworCQkJaWYgKGZpbGVfb2ZzIDwgbmktPmluaXRpYWxpemVkX3NpemUpCisJCQkJb2ZzID0gbmktPmluaXRpYWxpemVkX3NpemUgLSBmaWxlX29mczsKKwkJCWFkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9CSU9fU1JDX0lSUSk7CisJCQltZW1zZXQoYWRkciArIGJoX29mZnNldChiaCkgKyBvZnMsIDAsIGJoLT5iX3NpemUgLSBvZnMpOworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQlrdW5tYXBfYXRvbWljKGFkZHIsIEtNX0JJT19TUkNfSVJRKTsKKwkJfQorCX0gZWxzZSB7CisJCWNsZWFyX2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCW50ZnNfZXJyb3IobmktPnZvbC0+c2IsICJCdWZmZXIgSS9PIGVycm9yLCBsb2dpY2FsIGJsb2NrICVsbHUuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOworCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZwYWdlX3VwdG9kYXRlX2xvY2ssIGZsYWdzKTsKKwljbGVhcl9idWZmZXJfYXN5bmNfcmVhZChiaCk7CisJdW5sb2NrX2J1ZmZlcihiaCk7CisJdG1wID0gYmg7CisJZG8geworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZSh0bXApKQorCQkJcGFnZV91cHRvZGF0ZSA9IDA7CisJCWlmIChidWZmZXJfYXN5bmNfcmVhZCh0bXApKSB7CisJCQlpZiAobGlrZWx5KGJ1ZmZlcl9sb2NrZWQodG1wKSkpCisJCQkJZ290byBzdGlsbF9idXN5OworCQkJLyogQXN5bmMgYnVmZmVycyBtdXN0IGJlIGxvY2tlZC4gKi8KKwkJCUJVRygpOworCQl9CisJCXRtcCA9IHRtcC0+Yl90aGlzX3BhZ2U7CisJfSB3aGlsZSAodG1wICE9IGJoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYWdlX3VwdG9kYXRlX2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIElmIG5vbmUgb2YgdGhlIGJ1ZmZlcnMgaGFkIGVycm9ycyB0aGVuIHdlIGNhbiBzZXQgdGhlIHBhZ2UgdXB0b2RhdGUsCisJICogYnV0IHdlIGZpcnN0IGhhdmUgdG8gcGVyZm9ybSB0aGUgcG9zdCByZWFkIG1zdCBmaXh1cHMsIGlmIHRoZQorCSAqIGF0dHJpYnV0ZSBpcyBtc3QgcHJvdGVjdGVkLCBpLmUuIGlmIE5Jbm9Nc3RQcm90ZWNlZChuaSkgaXMgdHJ1ZS4KKwkgKiBOb3RlIHdlIGlnbm9yZSBmaXh1cCBlcnJvcnMgYXMgdGhvc2UgYXJlIGRldGVjdGVkIHdoZW4KKwkgKiBtYXBfbWZ0X3JlY29yZCgpIGlzIGNhbGxlZCB3aGljaCBnaXZlcyB1cyBwZXIgcmVjb3JkIGdyYW51bGFyaXR5CisJICogcmF0aGVyIHRoYW4gcGVyIHBhZ2UgZ3JhbnVsYXJpdHkuCisJICovCisJaWYgKCFOSW5vTXN0UHJvdGVjdGVkKG5pKSkgeworCQlpZiAobGlrZWx5KHBhZ2VfdXB0b2RhdGUgJiYgIVBhZ2VFcnJvcihwYWdlKSkpCisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJfSBlbHNlIHsKKwkJY2hhciAqYWRkcjsKKwkJdW5zaWduZWQgaW50IGksIHJlY3M7CisJCXUzMiByZWNfc2l6ZTsKKworCQlyZWNfc2l6ZSA9IG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplOworCQlyZWNzID0gUEFHRV9DQUNIRV9TSVpFIC8gcmVjX3NpemU7CisJCS8qIFNob3VsZCBoYXZlIGJlZW4gdmVyaWZpZWQgYmVmb3JlIHdlIGdvdCBoZXJlLi4uICovCisJCUJVR19PTighcmVjcyk7CisJCWFkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9CSU9fU1JDX0lSUSk7CisJCWZvciAoaSA9IDA7IGkgPCByZWNzOyBpKyspCisJCQlwb3N0X3JlYWRfbXN0X2ZpeHVwKChOVEZTX1JFQ09SRCopKGFkZHIgKworCQkJCQlpICogcmVjX3NpemUpLCByZWNfc2l6ZSk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlrdW5tYXBfYXRvbWljKGFkZHIsIEtNX0JJT19TUkNfSVJRKTsKKwkJaWYgKGxpa2VseSghUGFnZUVycm9yKHBhZ2UpICYmIHBhZ2VfdXB0b2RhdGUpKQorCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCX0KKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm47CitzdGlsbF9idXN5OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhZ2VfdXB0b2RhdGVfbG9jaywgZmxhZ3MpOworCXJldHVybjsKK30KKworLyoqCisgKiBudGZzX3JlYWRfYmxvY2sgLSBmaWxsIGEgQHBhZ2Ugb2YgYW4gYWRkcmVzcyBzcGFjZSB3aXRoIGRhdGEKKyAqIEBwYWdlOglwYWdlIGNhY2hlIHBhZ2UgdG8gZmlsbCB3aXRoIGRhdGEKKyAqCisgKiBGaWxsIHRoZSBwYWdlIEBwYWdlIG9mIHRoZSBhZGRyZXNzIHNwYWNlIGJlbG9uZ2luZyB0byB0aGUgQHBhZ2UtPmhvc3QgaW5vZGUuCisgKiBXZSByZWFkIGVhY2ggYnVmZmVyIGFzeW5jaHJvbm91c2x5IGFuZCB3aGVuIGFsbCBidWZmZXJzIGFyZSByZWFkIGluLCBvdXIgaW8KKyAqIGNvbXBsZXRpb24gaGFuZGxlciBudGZzX2VuZF9idWZmZXJfcmVhZF9hc3luYygpLCBpZiByZXF1aXJlZCwgYXV0b21hdGljYWxseQorICogYXBwbGllcyB0aGUgbXN0IGZpeHVwcyB0byB0aGUgcGFnZSBiZWZvcmUgZmluYWxseSBtYXJraW5nIGl0IHVwdG9kYXRlIGFuZAorICogdW5sb2NraW5nIGl0LgorICoKKyAqIFdlIG9ubHkgZW5mb3JjZSBhbGxvY2F0ZWRfc2l6ZSBsaW1pdCBiZWNhdXNlIGlfc2l6ZSBpcyBjaGVja2VkIGZvciBpbgorICogZ2VuZXJpY19maWxlX3JlYWQoKS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKgorICogQ29udGFpbnMgYW4gYWRhcHRlZCB2ZXJzaW9uIG9mIGZzL2J1ZmZlci5jOjpibG9ja19yZWFkX2Z1bGxfcGFnZSgpLgorICovCitzdGF0aWMgaW50IG50ZnNfcmVhZF9ibG9jayhzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlWQ04gdmNuOworCUxDTiBsY247CisJbnRmc19pbm9kZSAqbmk7CisJbnRmc192b2x1bWUgKnZvbDsKKwlydW5saXN0X2VsZW1lbnQgKnJsOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkLCAqYXJyW01BWF9CVUZfUEVSX1BBR0VdOworCXNlY3Rvcl90IGlibG9jaywgbGJsb2NrLCB6YmxvY2s7CisJdW5zaWduZWQgaW50IGJsb2Nrc2l6ZSwgdmNuX29mczsKKwlpbnQgaSwgbnI7CisJdW5zaWduZWQgY2hhciBibG9ja3NpemVfYml0czsKKworCW5pID0gTlRGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpOworCXZvbCA9IG5pLT52b2w7CisKKwkvKiAkTUZULyREQVRBIG11c3QgaGF2ZSBpdHMgY29tcGxldGUgcnVubGlzdCBpbiBtZW1vcnkgYXQgYWxsIHRpbWVzLiAqLworCUJVR19PTighbmktPnJ1bmxpc3QucmwgJiYgIW5pLT5tZnRfbm8gJiYgIU5Jbm9BdHRyKG5pKSk7CisKKwlibG9ja3NpemVfYml0cyA9IFZGU19JKG5pKS0+aV9ibGtiaXRzOworCWJsb2Nrc2l6ZSA9IDEgPDwgYmxvY2tzaXplX2JpdHM7CisKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCWNyZWF0ZV9lbXB0eV9idWZmZXJzKHBhZ2UsIGJsb2Nrc2l6ZSwgMCk7CisJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWlmICh1bmxpa2VseSghYmgpKSB7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpYmxvY2sgPSAoczY0KXBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gYmxvY2tzaXplX2JpdHMpOworCWxibG9jayA9IChuaS0+YWxsb2NhdGVkX3NpemUgKyBibG9ja3NpemUgLSAxKSA+PiBibG9ja3NpemVfYml0czsKKwl6YmxvY2sgPSAobmktPmluaXRpYWxpemVkX3NpemUgKyBibG9ja3NpemUgLSAxKSA+PiBibG9ja3NpemVfYml0czsKKworCS8qIExvb3AgdGhyb3VnaCBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIHBhZ2UuICovCisJcmwgPSBOVUxMOworCW5yID0gaSA9IDA7CisJZG8geworCQl1OCAqa2FkZHI7CisKKwkJaWYgKHVubGlrZWx5KGJ1ZmZlcl91cHRvZGF0ZShiaCkpKQorCQkJY29udGludWU7CisJCWlmICh1bmxpa2VseShidWZmZXJfbWFwcGVkKGJoKSkpIHsKKwkJCWFycltucisrXSA9IGJoOworCQkJY29udGludWU7CisJCX0KKwkJYmgtPmJfYmRldiA9IHZvbC0+c2ItPnNfYmRldjsKKwkJLyogSXMgdGhlIGJsb2NrIHdpdGhpbiB0aGUgYWxsb3dlZCBsaW1pdHM/ICovCisJCWlmIChpYmxvY2sgPCBsYmxvY2spIHsKKwkJCUJPT0wgaXNfcmV0cnkgPSBGQUxTRTsKKworCQkJLyogQ29udmVydCBpYmxvY2sgaW50byBjb3JyZXNwb25kaW5nIHZjbiBhbmQgb2Zmc2V0LiAqLworCQkJdmNuID0gKFZDTilpYmxvY2sgPDwgYmxvY2tzaXplX2JpdHMgPj4KKwkJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJCXZjbl9vZnMgPSAoKFZDTilpYmxvY2sgPDwgYmxvY2tzaXplX2JpdHMpICYKKwkJCQkJdm9sLT5jbHVzdGVyX3NpemVfbWFzazsKKwkJCWlmICghcmwpIHsKK2xvY2tfcmV0cnlfcmVtYXA6CisJCQkJZG93bl9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJCQlybCA9IG5pLT5ydW5saXN0LnJsOworCQkJfQorCQkJaWYgKGxpa2VseShybCAhPSBOVUxMKSkgeworCQkJCS8qIFNlZWsgdG8gZWxlbWVudCBjb250YWluaW5nIHRhcmdldCB2Y24uICovCisJCQkJd2hpbGUgKHJsLT5sZW5ndGggJiYgcmxbMV0udmNuIDw9IHZjbikKKwkJCQkJcmwrKzsKKwkJCQlsY24gPSBudGZzX3JsX3Zjbl90b19sY24ocmwsIHZjbik7CisJCQl9IGVsc2UKKwkJCQlsY24gPSBMQ05fUkxfTk9UX01BUFBFRDsKKwkJCS8qIFN1Y2Nlc3NmdWwgcmVtYXAuICovCisJCQlpZiAobGNuID49IDApIHsKKwkJCQkvKiBTZXR1cCBidWZmZXIgaGVhZCB0byBjb3JyZWN0IGJsb2NrLiAqLworCQkJCWJoLT5iX2Jsb2NrbnIgPSAoKGxjbiA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKQorCQkJCQkJKyB2Y25fb2ZzKSA+PiBibG9ja3NpemVfYml0czsKKwkJCQlzZXRfYnVmZmVyX21hcHBlZChiaCk7CisJCQkJLyogT25seSByZWFkIGluaXRpYWxpemVkIGRhdGEgYmxvY2tzLiAqLworCQkJCWlmIChpYmxvY2sgPCB6YmxvY2spIHsKKwkJCQkJYXJyW25yKytdID0gYmg7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKiBGdWxseSBub24taW5pdGlhbGl6ZWQgZGF0YSBibG9jaywgemVybyBpdC4gKi8KKwkJCQlnb3RvIGhhbmRsZV96YmxvY2s7CisJCQl9CisJCQkvKiBJdCBpcyBhIGhvbGUsIG5lZWQgdG8gemVybyBpdC4gKi8KKwkJCWlmIChsY24gPT0gTENOX0hPTEUpCisJCQkJZ290byBoYW5kbGVfaG9sZTsKKwkJCS8qIElmIGZpcnN0IHRyeSBhbmQgcnVubGlzdCB1bm1hcHBlZCwgbWFwIGFuZCByZXRyeS4gKi8KKwkJCWlmICghaXNfcmV0cnkgJiYgbGNuID09IExDTl9STF9OT1RfTUFQUEVEKSB7CisJCQkJaW50IGVycjsKKwkJCQlpc19yZXRyeSA9IFRSVUU7CisJCQkJLyoKKwkJCQkgKiBBdHRlbXB0IHRvIG1hcCBydW5saXN0LCBkcm9wcGluZyBsb2NrIGZvcgorCQkJCSAqIHRoZSBkdXJhdGlvbi4KKwkJCQkgKi8KKwkJCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJCQllcnIgPSBudGZzX21hcF9ydW5saXN0KG5pLCB2Y24pOworCQkJCWlmIChsaWtlbHkoIWVycikpCisJCQkJCWdvdG8gbG9ja19yZXRyeV9yZW1hcDsKKwkJCQlybCA9IE5VTEw7CisJCQkJbGNuID0gZXJyOworCQkJfQorCQkJLyogSGFyZCBlcnJvciwgemVybyBvdXQgcmVnaW9uLiAqLworCQkJYmgtPmJfYmxvY2tuciA9IC0xOworCQkJU2V0UGFnZUVycm9yKHBhZ2UpOworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJlYWQgZnJvbSBpbm9kZSAweCVseCwgIgorCQkJCQkiYXR0cmlidXRlIHR5cGUgMHgleCwgdmNuIDB4JWxseCwgIgorCQkJCQkib2Zmc2V0IDB4JXggYmVjYXVzZSBpdHMgbG9jYXRpb24gb24gIgorCQkJCQkiZGlzayBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCVzICIKKwkJCQkJIihlcnJvciBjb2RlICVsbGkpLiIsIG5pLT5tZnRfbm8sCisJCQkJCW5pLT50eXBlLCAodW5zaWduZWQgbG9uZyBsb25nKXZjbiwKKwkJCQkJdmNuX29mcywgaXNfcmV0cnkgPyAiIGV2ZW4gYWZ0ZXIgIgorCQkJCQkicmV0cnlpbmciIDogIiIsIChsb25nIGxvbmcpbGNuKTsKKwkJfQorCQkvKgorCQkgKiBFaXRoZXIgaWJsb2NrIHdhcyBvdXRzaWRlIGxibG9jayBsaW1pdHMgb3IKKwkJICogbnRmc19ybF92Y25fdG9fbGNuKCkgcmV0dXJuZWQgZXJyb3IuICBKdXN0IHplcm8gdGhhdCBwb3J0aW9uCisJCSAqIG9mIHRoZSBwYWdlIGFuZCBzZXQgdGhlIGJ1ZmZlciB1cHRvZGF0ZS4KKwkJICovCitoYW5kbGVfaG9sZToKKwkJYmgtPmJfYmxvY2tuciA9IC0xVUw7CisJCWNsZWFyX2J1ZmZlcl9tYXBwZWQoYmgpOworaGFuZGxlX3pibG9jazoKKwkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCW1lbXNldChrYWRkciArIGkgKiBibG9ja3NpemUsIDAsIGJsb2Nrc2l6ZSk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCX0gd2hpbGUgKGkrKywgaWJsb2NrKyssIChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisKKwkvKiBSZWxlYXNlIHRoZSBsb2NrIGlmIHdlIHRvb2sgaXQuICovCisJaWYgKHJsKQorCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKworCS8qIENoZWNrIHdlIGhhdmUgYXQgbGVhc3Qgb25lIGJ1ZmZlciByZWFkeSBmb3IgaS9vLiAqLworCWlmIChucikgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRiaDsKKworCQkvKiBMb2NrIHRoZSBidWZmZXJzLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQkJdGJoID0gYXJyW2ldOworCQkJbG9ja19idWZmZXIodGJoKTsKKwkJCXRiaC0+Yl9lbmRfaW8gPSBudGZzX2VuZF9idWZmZXJfYXN5bmNfcmVhZDsKKwkJCXNldF9idWZmZXJfYXN5bmNfcmVhZCh0YmgpOworCQl9CisJCS8qIEZpbmFsbHksIHN0YXJ0IGkvbyBvbiB0aGUgYnVmZmVycy4gKi8KKwkJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJCXRiaCA9IGFycltpXTsKKwkJCWlmIChsaWtlbHkoIWJ1ZmZlcl91cHRvZGF0ZSh0YmgpKSkKKwkJCQlzdWJtaXRfYmgoUkVBRCwgdGJoKTsKKwkJCWVsc2UKKwkJCQludGZzX2VuZF9idWZmZXJfYXN5bmNfcmVhZCh0YmgsIDEpOworCQl9CisJCXJldHVybiAwOworCX0KKwkvKiBObyBpL28gd2FzIHNjaGVkdWxlZCBvbiBhbnkgb2YgdGhlIGJ1ZmZlcnMuICovCisJaWYgKGxpa2VseSghUGFnZUVycm9yKHBhZ2UpKSkKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWVsc2UgLyogU2lnbmFsIHN5bmNocm9ub3VzIGkvbyBlcnJvci4gKi8KKwkJbnIgPSAtRUlPOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiBucjsKK30KKworLyoqCisgKiBudGZzX3JlYWRwYWdlIC0gZmlsbCBhIEBwYWdlIG9mIGEgQGZpbGUgd2l0aCBkYXRhIGZyb20gdGhlIGRldmljZQorICogQGZpbGU6CW9wZW4gZmlsZSB0byB3aGljaCB0aGUgcGFnZSBAcGFnZSBiZWxvbmdzIG9yIE5VTEwKKyAqIEBwYWdlOglwYWdlIGNhY2hlIHBhZ2UgdG8gZmlsbCB3aXRoIGRhdGEKKyAqCisgKiBGb3Igbm9uLXJlc2lkZW50IGF0dHJpYnV0ZXMsIG50ZnNfcmVhZHBhZ2UoKSBmaWxscyB0aGUgQHBhZ2Ugb2YgdGhlIG9wZW4KKyAqIGZpbGUgQGZpbGUgYnkgY2FsbGluZyB0aGUgbnRmcyB2ZXJzaW9uIG9mIHRoZSBnZW5lcmljIGJsb2NrX3JlYWRfZnVsbF9wYWdlKCkKKyAqIGZ1bmN0aW9uLCBudGZzX3JlYWRfYmxvY2soKSwgd2hpY2ggaW4gdHVybiBjcmVhdGVzIGFuZCByZWFkcyBpbiB0aGUgYnVmZmVycworICogYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWdlIGFzeW5jaHJvbm91c2x5LgorICoKKyAqIEZvciByZXNpZGVudCBhdHRyaWJ1dGVzLCBPVE9ILCBudGZzX3JlYWRwYWdlKCkgZmlsbHMgQHBhZ2UgYnkgY29weWluZyB0aGUKKyAqIGRhdGEgZnJvbSB0aGUgbWZ0IHJlY29yZCAod2hpY2ggYXQgdGhpcyBzdGFnZSBpcyBtb3N0IGxpa2VseSBpbiBtZW1vcnkpIGFuZAorICogZmlsbHMgdGhlIHJlbWFpbmRlciB3aXRoIHplcm9lcy4gVGh1cywgaW4gdGhpcyBjYXNlLCBJL08gaXMgc3luY2hyb25vdXMsIGFzCisgKiBldmVuIGlmIHRoZSBtZnQgcmVjb3JkIGlzIG5vdCBjYWNoZWQgYXQgdGhpcyBwb2ludCBpbiB0aW1lLCB3ZSBuZWVkIHRvIHdhaXQKKyAqIGZvciBpdCB0byBiZSByZWFkIGluIGJlZm9yZSB3ZSBjYW4gZG8gdGhlIGNvcHkuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50IG50ZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCWxvZmZfdCBpX3NpemU7CisJbnRmc19pbm9kZSAqbmksICpiYXNlX25pOworCXU4ICprYWRkcjsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OworCU1GVF9SRUNPUkQgKm1yZWM7CisJdTMyIGF0dHJfbGVuOworCWludCBlcnIgPSAwOworCisJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwkvKgorCSAqIFRoaXMgY2FuIHBvdGVudGlhbGx5IGhhcHBlbiBiZWNhdXNlIHdlIGNsZWFyIFBhZ2VVcHRvZGF0ZSgpIGR1cmluZworCSAqIG50ZnNfd3JpdGVwYWdlKCkgb2YgTXN0UHJvdGVjdGVkKCkgYXR0cmlidXRlcy4KKwkgKi8KKwlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlyZXR1cm4gMDsKKwl9CisJbmkgPSBOVEZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCk7CisKKwkvKiBOSW5vTm9uUmVzaWRlbnQoKSA9PSBOSW5vSW5kZXhBbGxvY1ByZXNlbnQoKSAqLworCWlmIChOSW5vTm9uUmVzaWRlbnQobmkpKSB7CisJCS8qCisJCSAqIE9ubHkgdW5uYW1lZCAkREFUQSBhdHRyaWJ1dGVzIGNhbiBiZSBjb21wcmVzc2VkIG9yCisJCSAqIGVuY3J5cHRlZC4KKwkJICovCisJCWlmIChuaS0+dHlwZSA9PSBBVF9EQVRBICYmICFuaS0+bmFtZV9sZW4pIHsKKwkJCS8qIElmIGZpbGUgaXMgZW5jcnlwdGVkLCBkZW55IGFjY2VzcywganVzdCBsaWtlIE5UNC4gKi8KKwkJCWlmIChOSW5vRW5jcnlwdGVkKG5pKSkgeworCQkJCWVyciA9IC1FQUNDRVM7CisJCQkJZ290byBlcnJfb3V0OworCQkJfQorCQkJLyogQ29tcHJlc3NlZCBkYXRhIHN0cmVhbXMgYXJlIGhhbmRsZWQgaW4gY29tcHJlc3MuYy4gKi8KKwkJCWlmIChOSW5vQ29tcHJlc3NlZChuaSkpCisJCQkJcmV0dXJuIG50ZnNfcmVhZF9jb21wcmVzc2VkX2Jsb2NrKHBhZ2UpOworCQl9CisJCS8qIE5vcm1hbCBkYXRhIHN0cmVhbS4gKi8KKwkJcmV0dXJuIG50ZnNfcmVhZF9ibG9jayhwYWdlKTsKKwl9CisJLyoKKwkgKiBBdHRyaWJ1dGUgaXMgcmVzaWRlbnQsIGltcGx5aW5nIGl0IGlzIG5vdCBjb21wcmVzc2VkIG9yIGVuY3J5cHRlZC4KKwkgKiBUaGlzIGFsc28gbWVhbnMgdGhlIGF0dHJpYnV0ZSBpcyBzbWFsbGVyIHRoYW4gYW4gbWZ0IHJlY29yZCBhbmQKKwkgKiBoZW5jZSBzbWFsbGVyIHRoYW4gYSBwYWdlLCBzbyBjYW4gc2ltcGx5IHplcm8gb3V0IGFueSBwYWdlcyB3aXRoCisJICogaW5kZXggYWJvdmUgMC4gIFdlIGNhbiBhbHNvIGRvIHRoaXMgaWYgdGhlIGZpbGUgc2l6ZSBpcyAwLgorCSAqLworCWlmICh1bmxpa2VseShwYWdlLT5pbmRleCA+IDAgfHwgIWlfc2l6ZV9yZWFkKFZGU19JKG5pKSkpKSB7CisJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQltZW1zZXQoa2FkZHIsIDAsIFBBR0VfQ0FDSEVfU0laRSk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKCFOSW5vQXR0cihuaSkpCisJCWJhc2VfbmkgPSBuaTsKKwllbHNlCisJCWJhc2VfbmkgPSBuaS0+ZXh0LmJhc2VfbnRmc19pbm87CisJLyogTWFwLCBwaW4sIGFuZCBsb2NrIHRoZSBtZnQgcmVjb3JkLiAqLworCW1yZWMgPSBtYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwlpZiAoSVNfRVJSKG1yZWMpKSB7CisJCWVyciA9IFBUUl9FUlIobXJlYyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KGJhc2VfbmksIG1yZWMpOworCWlmICh1bmxpa2VseSghY3R4KSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwllcnIgPSBudGZzX2F0dHJfbG9va3VwKG5pLT50eXBlLCBuaS0+bmFtZSwgbmktPm5hbWVfbGVuLAorCQkJQ0FTRV9TRU5TSVRJVkUsIDAsIE5VTEwsIDAsIGN0eCk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gcHV0X3VubV9lcnJfb3V0OworCWF0dHJfbGVuID0gbGUzMl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCk7CisJaV9zaXplID0gaV9zaXplX3JlYWQoVkZTX0kobmkpKTsKKwlpZiAodW5saWtlbHkoYXR0cl9sZW4gPiBpX3NpemUpKQorCQlhdHRyX2xlbiA9IGlfc2l6ZTsKKwlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkvKiBDb3B5IHRoZSBkYXRhIHRvIHRoZSBwYWdlLiAqLworCW1lbWNweShrYWRkciwgKHU4KiljdHgtPmF0dHIgKworCQkJbGUxNl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCksCisJCQlhdHRyX2xlbik7CisJLyogWmVybyB0aGUgcmVtYWluZGVyIG9mIHRoZSBwYWdlLiAqLworCW1lbXNldChrYWRkciArIGF0dHJfbGVuLCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBhdHRyX2xlbik7CisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworcHV0X3VubV9lcnJfb3V0OgorCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOwordW5tX2Vycl9vdXQ6CisJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKK2RvbmU6CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworZXJyX291dDoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gZXJyOworfQorCisjaWZkZWYgTlRGU19SVworCisvKioKKyAqIG50ZnNfd3JpdGVfYmxvY2sgLSB3cml0ZSBhIEBwYWdlIHRvIHRoZSBiYWNraW5nIHN0b3JlCisgKiBAcGFnZToJcGFnZSBjYWNoZSBwYWdlIHRvIHdyaXRlIG91dAorICogQHdiYzoJd3JpdGViYWNrIGNvbnRyb2wgc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBmb3Igd3JpdGluZyBwYWdlcyBiZWxvbmdpbmcgdG8gbm9uLXJlc2lkZW50LCBub24tbXN0CisgKiBwcm90ZWN0ZWQgYXR0cmlidXRlcyB0byB0aGVpciBiYWNraW5nIHN0b3JlLgorICoKKyAqIEZvciBhIHBhZ2Ugd2l0aCBidWZmZXJzLCBtYXAgYW5kIHdyaXRlIHRoZSBkaXJ0eSBidWZmZXJzIGFzeW5jaHJvbm91c2x5CisgKiB1bmRlciBwYWdlIHdyaXRlYmFjay4gRm9yIGEgcGFnZSB3aXRob3V0IGJ1ZmZlcnMsIGNyZWF0ZSBidWZmZXJzIGZvciB0aGUKKyAqIHBhZ2UsIHRoZW4gcHJvY2VlZCBhcyBhYm92ZS4KKyAqCisgKiBJZiBhIHBhZ2UgZG9lc24ndCBoYXZlIGJ1ZmZlcnMgdGhlIHBhZ2UgZGlydHkgc3RhdGUgaXMgZGVmaW5pdGl2ZS4gSWYgYSBwYWdlCisgKiBkb2VzIGhhdmUgYnVmZmVycywgdGhlIHBhZ2UgZGlydHkgc3RhdGUgaXMganVzdCBhIGhpbnQsIGFuZCB0aGUgYnVmZmVyIGRpcnR5CisgKiBzdGF0ZSBpcyBkZWZpbml0aXZlLiAoQSBoaW50IHdoaWNoIGhhcyBydWxlczogZGlydHkgYnVmZmVycyBhZ2FpbnN0IGEgY2xlYW4KKyAqIHBhZ2UgaXMgaWxsZWdhbC4gT3RoZXIgY29tYmluYXRpb25zIGFyZSBsZWdhbCBhbmQgbmVlZCB0byBiZSBoYW5kbGVkLiBJbgorICogcGFydGljdWxhciBhIGRpcnR5IHBhZ2UgY29udGFpbmluZyBjbGVhbiBidWZmZXJzIGZvciBleGFtcGxlLikKKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKgorICogQmFzZWQgb24gbnRmc19yZWFkX2Jsb2NrKCkgYW5kIF9fYmxvY2tfd3JpdGVfZnVsbF9wYWdlKCkuCisgKi8KK3N0YXRpYyBpbnQgbnRmc193cml0ZV9ibG9jayhzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJVkNOIHZjbjsKKwlMQ04gbGNuOworCXNlY3Rvcl90IGJsb2NrLCBkYmxvY2ssIGlibG9jazsKKwlzdHJ1Y3QgaW5vZGUgKnZpOworCW50ZnNfaW5vZGUgKm5pOworCW50ZnNfdm9sdW1lICp2b2w7CisJcnVubGlzdF9lbGVtZW50ICpybDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZDsKKwl1bnNpZ25lZCBpbnQgYmxvY2tzaXplLCB2Y25fb2ZzOworCWludCBlcnI7CisJQk9PTCBuZWVkX2VuZF93cml0ZWJhY2s7CisJdW5zaWduZWQgY2hhciBibG9ja3NpemVfYml0czsKKworCXZpID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwluaSA9IE5URlNfSSh2aSk7CisJdm9sID0gbmktPnZvbDsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpbm9kZSAweCVseCwgYXR0cmlidXRlIHR5cGUgMHgleCwgcGFnZSBpbmRleCAiCisJCQkiMHglbHguIiwgbmktPm1mdF9ubywgbmktPnR5cGUsIHBhZ2UtPmluZGV4KTsKKworCUJVR19PTighTklub05vblJlc2lkZW50KG5pKSk7CisJQlVHX09OKE5Jbm9Nc3RQcm90ZWN0ZWQobmkpKTsKKworCWJsb2Nrc2l6ZV9iaXRzID0gdmktPmlfYmxrYml0czsKKwlibG9ja3NpemUgPSAxIDw8IGJsb2Nrc2l6ZV9iaXRzOworCisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCUJVR19PTighUGFnZVVwdG9kYXRlKHBhZ2UpKTsKKwkJY3JlYXRlX2VtcHR5X2J1ZmZlcnMocGFnZSwgYmxvY2tzaXplLAorCQkJCSgxIDw8IEJIX1VwdG9kYXRlKSB8ICgxIDw8IEJIX0RpcnR5KSk7CisJfQorCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlpZiAodW5saWtlbHkoIWJoKSkgeworCQludGZzX3dhcm5pbmcodm9sLT5zYiwgIkVycm9yIGFsbG9jYXRpbmcgcGFnZSBidWZmZXJzLiAiCisJCQkJIlJlZGlydHlpbmcgcGFnZSBzbyB3ZSB0cnkgYWdhaW4gbGF0ZXIuIik7CisJCS8qCisJCSAqIFB1dCB0aGUgcGFnZSBiYWNrIG9uIG1hcHBpbmctPmRpcnR5X3BhZ2VzLCBidXQgbGVhdmUgaXRzCisJCSAqIGJ1ZmZlcidzIGRpcnR5IHN0YXRlIGFzLWlzLgorCQkgKi8KKwkJcmVkaXJ0eV9wYWdlX2Zvcl93cml0ZXBhZ2Uod2JjLCBwYWdlKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIE5PVEU6IERpZmZlcmVudCBuYW1pbmcgc2NoZW1lIHRvIG50ZnNfcmVhZF9ibG9jaygpISAqLworCisJLyogVGhlIGZpcnN0IGJsb2NrIGluIHRoZSBwYWdlLiAqLworCWJsb2NrID0gKHM2NClwYWdlLT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGJsb2Nrc2l6ZV9iaXRzKTsKKworCS8qIFRoZSBmaXJzdCBvdXQgb2YgYm91bmRzIGJsb2NrIGZvciB0aGUgZGF0YSBzaXplLiAqLworCWRibG9jayA9ICh2aS0+aV9zaXplICsgYmxvY2tzaXplIC0gMSkgPj4gYmxvY2tzaXplX2JpdHM7CisKKwkvKiBUaGUgbGFzdCAoZnVsbHkgb3IgcGFydGlhbGx5KSBpbml0aWFsaXplZCBibG9jay4gKi8KKwlpYmxvY2sgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA+PiBibG9ja3NpemVfYml0czsKKworCS8qCisJICogQmUgdmVyeSBjYXJlZnVsLiAgV2UgaGF2ZSBubyBleGNsdXNpb24gZnJvbSBfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnMKKwkgKiBoZXJlLCBhbmQgdGhlIChwb3RlbnRpYWxseSB1bm1hcHBlZCkgYnVmZmVycyBtYXkgYmVjb21lIGRpcnR5IGF0CisJICogYW55IHRpbWUuICBJZiBhIGJ1ZmZlciBiZWNvbWVzIGRpcnR5IGhlcmUgYWZ0ZXIgd2UndmUgaW5zcGVjdGVkIGl0CisJICogdGhlbiB3ZSBqdXN0IG1pc3MgdGhhdCBmYWN0LCBhbmQgdGhlIHBhZ2Ugc3RheXMgZGlydHkuCisJICoKKwkgKiBCdWZmZXJzIG91dHNpZGUgaV9zaXplIG1heSBiZSBkaXJ0aWVkIGJ5IF9fc2V0X3BhZ2VfZGlydHlfYnVmZmVyczsKKwkgKiBoYW5kbGUgdGhhdCBoZXJlIGJ5IGp1c3QgY2xlYW5pbmcgdGhlbS4KKwkgKi8KKworCS8qCisJICogTG9vcCB0aHJvdWdoIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgcGFnZSwgbWFwcGluZyBhbGwgdGhlIGRpcnR5CisJICogYnVmZmVycyB0byBkaXNrIGFkZHJlc3NlcyBhbmQgaGFuZGxpbmcgYW55IGFsaWFzZXMgZnJvbSB0aGUKKwkgKiB1bmRlcmx5aW5nIGJsb2NrIGRldmljZSdzIG1hcHBpbmcuCisJICovCisJcmwgPSBOVUxMOworCWVyciA9IDA7CisJZG8geworCQlCT09MIGlzX3JldHJ5ID0gRkFMU0U7CisKKwkJaWYgKHVubGlrZWx5KGJsb2NrID49IGRibG9jaykpIHsKKwkJCS8qCisJCQkgKiBNYXBwZWQgYnVmZmVycyBvdXRzaWRlIGlfc2l6ZSB3aWxsIG9jY3VyLCBiZWNhdXNlCisJCQkgKiB0aGlzIHBhZ2UgY2FuIGJlIG91dHNpZGUgaV9zaXplIHdoZW4gdGhlcmUgaXMgYQorCQkJICogdHJ1bmNhdGUgaW4gcHJvZ3Jlc3MuIFRoZSBjb250ZW50cyBvZiBzdWNoIGJ1ZmZlcnMKKwkJCSAqIHdlcmUgemVyb2VkIGJ5IG50ZnNfd3JpdGVwYWdlKCkuCisJCQkgKgorCQkJICogRklYTUU6IFdoYXQgYWJvdXQgdGhlIHNtYWxsIHJhY2Ugd2luZG93IHdoZXJlCisJCQkgKiBudGZzX3dyaXRlcGFnZSgpIGhhcyBub3QgZG9uZSBhbnkgY2xlYXJpbmcgYmVjYXVzZQorCQkJICogdGhlIHBhZ2Ugd2FzIHdpdGhpbiBpX3NpemUgYnV0IGJlZm9yZSB3ZSBnZXQgaGVyZSwKKwkJCSAqIHZtdHJ1bmNhdGUoKSBtb2RpZmllcyBpX3NpemU/CisJCQkgKi8KKwkJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogQ2xlYW4gYnVmZmVycyBhcmUgbm90IHdyaXR0ZW4gb3V0LCBzbyBubyBuZWVkIHRvIG1hcCB0aGVtLiAqLworCQlpZiAoIWJ1ZmZlcl9kaXJ0eShiaCkpCisJCQljb250aW51ZTsKKworCQkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggaW5pdGlhbGl6ZWQgc2l6ZS4gKi8KKwkJaWYgKHVubGlrZWx5KChibG9jayA+PSBpYmxvY2spICYmCisJCQkJKG5pLT5pbml0aWFsaXplZF9zaXplIDwgdmktPmlfc2l6ZSkpKSB7CisJCQkvKgorCQkJICogSWYgdGhpcyBwYWdlIGlzIGZ1bGx5IG91dHNpZGUgaW5pdGlhbGl6ZWQgc2l6ZSwgemVybworCQkJICogb3V0IGFsbCBwYWdlcyBiZXR3ZWVuIHRoZSBjdXJyZW50IGluaXRpYWxpemVkIHNpemUKKwkJCSAqIGFuZCB0aGUgY3VycmVudCBwYWdlLiBKdXN0IHVzZSBudGZzX3JlYWRwYWdlKCkgdG8gZG8KKwkJCSAqIHRoZSB6ZXJvaW5nIHRyYW5zcGFyZW50bHkuCisJCQkgKi8KKwkJCWlmIChibG9jayA+IGlibG9jaykgeworCQkJCS8vIFRPRE86CisJCQkJLy8gRm9yIGVhY2ggcGFnZSBkbzoKKwkJCQkvLyAtIHJlYWRfY2FjaGVfcGFnZSgpCisJCQkJLy8gQWdhaW4gZm9yIGVhY2ggcGFnZSBkbzoKKwkJCQkvLyAtIHdhaXRfb25fcGFnZV9sb2NrZWQoKQorCQkJCS8vIC0gQ2hlY2sgKFBhZ2VVcHRvZGF0ZShwYWdlKSAmJgorCQkJCS8vCQkJIVBhZ2VFcnJvcihwYWdlKSkKKwkJCQkvLyBVcGRhdGUgaW5pdGlhbGl6ZWQgc2l6ZSBpbiB0aGUgYXR0cmlidXRlIGFuZAorCQkJCS8vIGluIHRoZSBpbm9kZS4KKwkJCQkvLyBBZ2FpbiwgZm9yIGVhY2ggcGFnZSBkbzoKKwkJCQkvLwlfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnMoKTsKKwkJCQkvLyBwYWdlX2NhY2hlX3JlbGVhc2UoKQorCQkJCS8vIFdlIGRvbid0IG5lZWQgdG8gd2FpdCBvbiB0aGUgd3JpdGVzLgorCQkJCS8vIFVwZGF0ZSBpYmxvY2suCisJCQl9CisJCQkvKgorCQkJICogVGhlIGN1cnJlbnQgcGFnZSBzdHJhZGRsZXMgaW5pdGlhbGl6ZWQgc2l6ZS4gWmVybworCQkJICogYWxsIG5vbi11cHRvZGF0ZSBidWZmZXJzIGFuZCBzZXQgdGhlbSB1cHRvZGF0ZSAoYW5kCisJCQkgKiBkaXJ0eT8pLiBOb3RlLCB0aGVyZSBhcmVuJ3QgYW55IG5vbi11cHRvZGF0ZSBidWZmZXJzCisJCQkgKiBpZiB0aGUgcGFnZSBpcyB1cHRvZGF0ZS4KKwkJCSAqIEZJWE1FOiBGb3IgYW4gdXB0b2RhdGUgcGFnZSwgdGhlIGJ1ZmZlcnMgbWF5IG5lZWQgdG8KKwkJCSAqIGJlIHdyaXR0ZW4gb3V0IGJlY2F1c2UgdGhleSB3ZXJlIG5vdCBpbml0aWFsaXplZCBvbgorCQkJICogZGlzayBiZWZvcmUuCisJCQkgKi8KKwkJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQkJLy8gVE9ETzoKKwkJCQkvLyBaZXJvIGFueSBub24tdXB0b2RhdGUgYnVmZmVycyB1cCB0byBpX3NpemUuCisJCQkJLy8gU2V0IHRoZW0gdXB0b2RhdGUgYW5kIGRpcnR5LgorCQkJfQorCQkJLy8gVE9ETzoKKwkJCS8vIFVwZGF0ZSBpbml0aWFsaXplZCBzaXplIGluIHRoZSBhdHRyaWJ1dGUgYW5kIGluIHRoZQorCQkJLy8gaW5vZGUgKHVwIHRvIGlfc2l6ZSkuCisJCQkvLyBVcGRhdGUgaWJsb2NrLgorCQkJLy8gRklYTUU6IFRoaXMgaXMgaW5lZmZpY2llbnQuIFRyeSB0byBiYXRjaCB0aGUgdHdvCisJCQkvLyBzaXplIGNoYW5nZXMgdG8gaGFwcGVuIGluIG9uZSBnby4KKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIldyaXRpbmcgYmV5b25kIGluaXRpYWxpemVkIHNpemUgIgorCQkJCQkiaXMgbm90IHN1cHBvcnRlZCB5ZXQuIFNvcnJ5LiIpOworCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwkJCS8vIERvIE5PVCBzZXRfYnVmZmVyX25ldygpIEJVVCBETyBjbGVhciBidWZmZXIgcmFuZ2UKKwkJCS8vIG91dHNpZGUgd3JpdGUgcmVxdWVzdCByYW5nZS4KKwkJCS8vIHNldF9idWZmZXJfdXB0b2RhdGUoKSBvbiBjb21wbGV0ZSBidWZmZXJzIGFzIHdlbGwgYXMKKwkJCS8vIHNldF9idWZmZXJfZGlydHkoKS4KKwkJfQorCisJCS8qIE5vIG5lZWQgdG8gbWFwIGJ1ZmZlcnMgdGhhdCBhcmUgYWxyZWFkeSBtYXBwZWQuICovCisJCWlmIChidWZmZXJfbWFwcGVkKGJoKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIFVubWFwcGVkLCBkaXJ0eSBidWZmZXIuIE5lZWQgdG8gbWFwIGl0LiAqLworCQliaC0+Yl9iZGV2ID0gdm9sLT5zYi0+c19iZGV2OworCisJCS8qIENvbnZlcnQgYmxvY2sgaW50byBjb3JyZXNwb25kaW5nIHZjbiBhbmQgb2Zmc2V0LiAqLworCQl2Y24gPSAoVkNOKWJsb2NrIDw8IGJsb2Nrc2l6ZV9iaXRzOworCQl2Y25fb2ZzID0gdmNuICYgdm9sLT5jbHVzdGVyX3NpemVfbWFzazsKKwkJdmNuID4+PSB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzOworCQlpZiAoIXJsKSB7Citsb2NrX3JldHJ5X3JlbWFwOgorCQkJZG93bl9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJCXJsID0gbmktPnJ1bmxpc3Qucmw7CisJCX0KKwkJaWYgKGxpa2VseShybCAhPSBOVUxMKSkgeworCQkJLyogU2VlayB0byBlbGVtZW50IGNvbnRhaW5pbmcgdGFyZ2V0IHZjbi4gKi8KKwkJCXdoaWxlIChybC0+bGVuZ3RoICYmIHJsWzFdLnZjbiA8PSB2Y24pCisJCQkJcmwrKzsKKwkJCWxjbiA9IG50ZnNfcmxfdmNuX3RvX2xjbihybCwgdmNuKTsKKwkJfSBlbHNlCisJCQlsY24gPSBMQ05fUkxfTk9UX01BUFBFRDsKKwkJLyogU3VjY2Vzc2Z1bCByZW1hcC4gKi8KKwkJaWYgKGxjbiA+PSAwKSB7CisJCQkvKiBTZXR1cCBidWZmZXIgaGVhZCB0byBwb2ludCB0byBjb3JyZWN0IGJsb2NrLiAqLworCQkJYmgtPmJfYmxvY2tuciA9ICgobGNuIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpICsKKwkJCQkJdmNuX29mcykgPj4gYmxvY2tzaXplX2JpdHM7CisJCQlzZXRfYnVmZmVyX21hcHBlZChiaCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBJdCBpcyBhIGhvbGUsIG5lZWQgdG8gaW5zdGFudGlhdGUgaXQuICovCisJCWlmIChsY24gPT0gTENOX0hPTEUpIHsKKwkJCS8vIFRPRE86IEluc3RhbnRpYXRlIHRoZSBob2xlLgorCQkJLy8gY2xlYXJfYnVmZmVyX25ldyhiaCk7CisJCQkvLyB1bm1hcF91bmRlcmx5aW5nX21ldGFkYXRhKGJoLT5iX2JkZXYsIGJoLT5iX2Jsb2NrbnIpOworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiV3JpdGluZyBpbnRvIHNwYXJzZSByZWdpb25zIGlzICIKKwkJCQkJIm5vdCBzdXBwb3J0ZWQgeWV0LiBTb3JyeS4iKTsKKwkJCWVyciA9IC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisJCX0KKwkJLyogSWYgZmlyc3QgdHJ5IGFuZCBydW5saXN0IHVubWFwcGVkLCBtYXAgYW5kIHJldHJ5LiAqLworCQlpZiAoIWlzX3JldHJ5ICYmIGxjbiA9PSBMQ05fUkxfTk9UX01BUFBFRCkgeworCQkJaXNfcmV0cnkgPSBUUlVFOworCQkJLyoKKwkJCSAqIEF0dGVtcHQgdG8gbWFwIHJ1bmxpc3QsIGRyb3BwaW5nIGxvY2sgZm9yCisJCQkgKiB0aGUgZHVyYXRpb24uCisJCQkgKi8KKwkJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJZXJyID0gbnRmc19tYXBfcnVubGlzdChuaSwgdmNuKTsKKwkJCWlmIChsaWtlbHkoIWVycikpCisJCQkJZ290byBsb2NrX3JldHJ5X3JlbWFwOworCQkJcmwgPSBOVUxMOworCQkJbGNuID0gZXJyOworCQl9CisJCS8qIEZhaWxlZCB0byBtYXAgdGhlIGJ1ZmZlciwgZXZlbiBhZnRlciByZXRyeWluZy4gKi8KKwkJYmgtPmJfYmxvY2tuciA9IC0xOworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gd3JpdGUgdG8gaW5vZGUgMHglbHgsICIKKwkJCQkiYXR0cmlidXRlIHR5cGUgMHgleCwgdmNuIDB4JWxseCwgb2Zmc2V0IDB4JXggIgorCQkJCSJiZWNhdXNlIGl0cyBsb2NhdGlvbiBvbiBkaXNrIGNvdWxkIG5vdCBiZSAiCisJCQkJImRldGVybWluZWQlcyAoZXJyb3IgY29kZSAlbGxpKS4iLCBuaS0+bWZ0X25vLAorCQkJCW5pLT50eXBlLCAodW5zaWduZWQgbG9uZyBsb25nKXZjbiwKKwkJCQl2Y25fb2ZzLCBpc19yZXRyeSA/ICIgZXZlbiBhZnRlciAiCisJCQkJInJldHJ5aW5nIiA6ICIiLCAobG9uZyBsb25nKWxjbik7CisJCWlmICghZXJyKQorCQkJZXJyID0gLUVJTzsKKwkJYnJlYWs7CisJfSB3aGlsZSAoYmxvY2srKywgKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKworCS8qIFJlbGVhc2UgdGhlIGxvY2sgaWYgd2UgdG9vayBpdC4gKi8KKwlpZiAocmwpCisJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCisJLyogRm9yIHRoZSBlcnJvciBjYXNlLCBuZWVkIHRvIHJlc2V0IGJoIHRvIHRoZSBiZWdpbm5pbmcuICovCisJYmggPSBoZWFkOworCisJLyogSnVzdCBhbiBvcHRpbWl6YXRpb24sIHNvIC0+cmVhZHBhZ2UoKSBpc24ndCBjYWxsZWQgbGF0ZXIuICovCisJaWYgKHVubGlrZWx5KCFQYWdlVXB0b2RhdGUocGFnZSkpKSB7CisJCWludCB1cHRvZGF0ZSA9IDE7CisJCWRvIHsKKwkJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJCXVwdG9kYXRlID0gMDsKKwkJCQliaCA9IGhlYWQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisJCWlmICh1cHRvZGF0ZSkKKwkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwl9CisKKwkvKiBTZXR1cCBhbGwgbWFwcGVkLCBkaXJ0eSBidWZmZXJzIGZvciBhc3luYyB3cml0ZSBpL28uICovCisJZG8geworCQlnZXRfYmgoYmgpOworCQlpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYnVmZmVyX2RpcnR5KGJoKSkgeworCQkJbG9ja19idWZmZXIoYmgpOworCQkJaWYgKHRlc3RfY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSkgeworCQkJCUJVR19PTighYnVmZmVyX3VwdG9kYXRlKGJoKSk7CisJCQkJbWFya19idWZmZXJfYXN5bmNfd3JpdGUoYmgpOworCQkJfSBlbHNlCisJCQkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCX0gZWxzZSBpZiAodW5saWtlbHkoZXJyKSkgeworCQkJLyoKKwkJCSAqIEZvciB0aGUgZXJyb3IgY2FzZS4gVGhlIGJ1ZmZlciBtYXkgaGF2ZSBiZWVuIHNldAorCQkJICogZGlydHkgZHVyaW5nIGF0dGFjaG1lbnQgdG8gYSBkaXJ0eSBwYWdlLgorCQkJICovCisJCQlpZiAoZXJyICE9IC1FTk9NRU0pCisJCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJfQorCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQkvLyBUT0RPOiBSZW1vdmUgdGhlIC1FT1BOT1RTVVBQIGNoZWNrIGxhdGVyIG9uLi4uCisJCWlmICh1bmxpa2VseShlcnIgPT0gLUVPUE5PVFNVUFApKQorCQkJZXJyID0gMDsKKwkJZWxzZSBpZiAoZXJyID09IC1FTk9NRU0pIHsKKwkJCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkuICIKKwkJCQkJIlJlZGlydHlpbmcgcGFnZSBzbyB3ZSB0cnkgYWdhaW4gIgorCQkJCQkibGF0ZXIuIik7CisJCQkvKgorCQkJICogUHV0IHRoZSBwYWdlIGJhY2sgb24gbWFwcGluZy0+ZGlydHlfcGFnZXMsIGJ1dAorCQkJICogbGVhdmUgaXRzIGJ1ZmZlcidzIGRpcnR5IHN0YXRlIGFzLWlzLgorCQkJICovCisJCQlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOworCQkJZXJyID0gMDsKKwkJfSBlbHNlCisJCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJfQorCisJQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOworCXNldF9wYWdlX3dyaXRlYmFjayhwYWdlKTsJLyogS2VlcHMgdHJ5X3RvX2ZyZWVfYnVmZmVycygpIGF3YXkuICovCisJdW5sb2NrX3BhZ2UocGFnZSk7CisKKwkvKgorCSAqIFN1Ym1pdCB0aGUgcHJlcGFyZWQgYnVmZmVycyBmb3IgaS9vLiBOb3RlIHRoZSBwYWdlIGlzIHVubG9ja2VkLAorCSAqIGFuZCB0aGUgYXN5bmMgd3JpdGUgaS9vIGNvbXBsZXRpb24gaGFuZGxlciBjYW4gZW5kX3BhZ2Vfd3JpdGViYWNrKCkKKwkgKiBhdCBhbnkgdGltZSBhZnRlciB0aGUgKmZpcnN0KiBzdWJtaXRfYmgoKS4gU28gdGhlIGJ1ZmZlcnMgY2FuIHRoZW4KKwkgKiBkaXNhcHBlYXIuLi4KKwkgKi8KKwluZWVkX2VuZF93cml0ZWJhY2sgPSBUUlVFOworCWRvIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXh0ID0gYmgtPmJfdGhpc19wYWdlOworCQlpZiAoYnVmZmVyX2FzeW5jX3dyaXRlKGJoKSkgeworCQkJc3VibWl0X2JoKFdSSVRFLCBiaCk7CisJCQluZWVkX2VuZF93cml0ZWJhY2sgPSBGQUxTRTsKKwkJfQorCQlwdXRfYmgoYmgpOworCQliaCA9IG5leHQ7CisJfSB3aGlsZSAoYmggIT0gaGVhZCk7CisKKwkvKiBJZiBubyBpL28gd2FzIHN0YXJ0ZWQsIG5lZWQgdG8gZW5kX3BhZ2Vfd3JpdGViYWNrKCkuICovCisJaWYgKHVubGlrZWx5KG5lZWRfZW5kX3dyaXRlYmFjaykpCisJCWVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBudGZzX3dyaXRlX21zdF9ibG9jayAtIHdyaXRlIGEgQHBhZ2UgdG8gdGhlIGJhY2tpbmcgc3RvcmUKKyAqIEBwYWdlOglwYWdlIGNhY2hlIHBhZ2UgdG8gd3JpdGUgb3V0CisgKiBAd2JjOgl3cml0ZWJhY2sgY29udHJvbCBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGZvciB3cml0aW5nIHBhZ2VzIGJlbG9uZ2luZyB0byBub24tcmVzaWRlbnQsIG1zdCBwcm90ZWN0ZWQKKyAqIGF0dHJpYnV0ZXMgdG8gdGhlaXIgYmFja2luZyBzdG9yZS4gIFRoZSBvbmx5IHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGFyZSBpbmRleAorICogYWxsb2NhdGlvbiBhbmQgJE1GVC8kREFUQS4gIEJvdGggZGlyZWN0b3J5IGlub2RlcyBhbmQgaW5kZXggaW5vZGVzIGFyZQorICogc3VwcG9ydGVkIGZvciB0aGUgaW5kZXggYWxsb2NhdGlvbiBjYXNlLgorICoKKyAqIFRoZSBwYWdlIG11c3QgcmVtYWluIGxvY2tlZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB3cml0ZSBiZWNhdXNlIHdlIGFwcGx5CisgKiB0aGUgbXN0IGZpeHVwcywgd3JpdGUsIGFuZCB0aGVuIHVuZG8gdGhlIGZpeHVwcywgc28gaWYgd2Ugd2VyZSB0byB1bmxvY2sgdGhlCisgKiBwYWdlIGJlZm9yZSB1bmRvaW5nIHRoZSBmaXh1cHMsIGFueSBvdGhlciB1c2VyIG9mIHRoZSBwYWdlIHdpbGwgc2VlIHRoZQorICogcGFnZSBjb250ZW50cyBhcyBjb3JydXB0LgorICoKKyAqIFdlIGNsZWFyIHRoZSBwYWdlIHVwdG9kYXRlIGZsYWcgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZnVuY3Rpb24gdG8gZW5zdXJlCisgKiBleGNsdXNpb24gZm9yIHRoZSAkTUZULyREQVRBIGNhc2UgYWdhaW5zdCBzb21lb25lIG1hcHBpbmcgYW4gbWZ0IHJlY29yZCB3ZQorICogYXJlIGFib3V0IHRvIGFwcGx5IHRoZSBtc3QgZml4dXBzIHRvLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBCYXNlZCBvbiBudGZzX3dyaXRlX2Jsb2NrKCksIG50ZnNfbWZ0X3dyaXRlcGFnZSgpLCBhbmQKKyAqIHdyaXRlX21mdF9yZWNvcmRfbm9sb2NrKCkuCisgKi8KK3N0YXRpYyBpbnQgbnRmc193cml0ZV9tc3RfYmxvY2soc3RydWN0IHBhZ2UgKnBhZ2UsCisJCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXNlY3Rvcl90IGJsb2NrLCBkYmxvY2ssIHJlY19ibG9jazsKKwlzdHJ1Y3QgaW5vZGUgKnZpID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwludGZzX2lub2RlICpuaSA9IE5URlNfSSh2aSk7CisJbnRmc192b2x1bWUgKnZvbCA9IG5pLT52b2w7CisJdTggKmthZGRyOworCXVuc2lnbmVkIGNoYXIgYmhfc2l6ZV9iaXRzID0gdmktPmlfYmxrYml0czsKKwl1bnNpZ25lZCBpbnQgYmhfc2l6ZSA9IDEgPDwgYmhfc2l6ZV9iaXRzOworCXVuc2lnbmVkIGludCByZWNfc2l6ZSA9IG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplOworCW50ZnNfaW5vZGUgKmxvY2tlZF9uaXNbUEFHRV9DQUNIRV9TSVpFIC8gcmVjX3NpemVdOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkLCAqdGJoLCAqcmVjX3N0YXJ0X2JoOworCWludCBtYXhfYmhzID0gUEFHRV9DQUNIRV9TSVpFIC8gYmhfc2l6ZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1ttYXhfYmhzXTsKKwlydW5saXN0X2VsZW1lbnQgKnJsOworCWludCBpLCBucl9sb2NrZWRfbmlzLCBucl9yZWNzLCBucl9iaHMsIGJoc19wZXJfcmVjLCBlcnIsIGVycjI7CisJdW5zaWduZWQgcmVjX3NpemVfYml0czsKKwlCT09MIHN5bmMsIGlzX21mdCwgcGFnZV9pc19kaXJ0eSwgcmVjX2lzX2RpcnR5OworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LCBhdHRyaWJ1dGUgdHlwZSAweCV4LCBwYWdlIGluZGV4ICIKKwkJCSIweCVseC4iLCB2aS0+aV9pbm8sIG5pLT50eXBlLCBwYWdlLT5pbmRleCk7CisJQlVHX09OKCFOSW5vTm9uUmVzaWRlbnQobmkpKTsKKwlCVUdfT04oIU5Jbm9Nc3RQcm90ZWN0ZWQobmkpKTsKKwlpc19tZnQgPSAoU19JU1JFRyh2aS0+aV9tb2RlKSAmJiAhdmktPmlfaW5vKTsKKwkvKgorCSAqIE5PVEU6IG50ZnNfd3JpdGVfbXN0X2Jsb2NrKCkgd291bGQgYmUgY2FsbGVkIGZvciAkTUZUTWlyciBpZiBhIHBhZ2UKKwkgKiBpbiBpdHMgcGFnZSBjYWNoZSB3ZXJlIHRvIGJlIG1hcmtlZCBkaXJ0eS4gIEhvd2V2ZXIgdGhpcyBzaG91bGQKKwkgKiBuZXZlciBoYXBwZW4gd2l0aCB0aGUgY3VycmVudCBkcml2ZXIgYW5kIGNvbnNpZGVyaW5nIHdlIGRvIG5vdAorCSAqIGhhbmRsZSB0aGlzIGNhc2UgaGVyZSB3ZSBkbyB3YW50IHRvIEJVRygpLCBhdCBsZWFzdCBmb3Igbm93LgorCSAqLworCUJVR19PTighKGlzX21mdCB8fCBTX0lTRElSKHZpLT5pX21vZGUpIHx8CisJCQkoTklub0F0dHIobmkpICYmIG5pLT50eXBlID09IEFUX0lOREVYX0FMTE9DQVRJT04pKSk7CisJQlVHX09OKCFtYXhfYmhzKTsKKworCS8qIFdlcmUgd2UgY2FsbGVkIGZvciBzeW5jIHB1cnBvc2VzPyAqLworCXN5bmMgPSAod2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19BTEwpOworCisJLyogTWFrZSBzdXJlIHdlIGhhdmUgbWFwcGVkIGJ1ZmZlcnMuICovCisJQlVHX09OKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKTsKKwliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJQlVHX09OKCFiaCk7CisKKwlyZWNfc2l6ZV9iaXRzID0gbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemVfYml0czsKKwlCVUdfT04oIShQQUdFX0NBQ0hFX1NJWkUgPj4gcmVjX3NpemVfYml0cykpOworCWJoc19wZXJfcmVjID0gcmVjX3NpemUgPj4gYmhfc2l6ZV9iaXRzOworCUJVR19PTighYmhzX3Blcl9yZWMpOworCisJLyogVGhlIGZpcnN0IGJsb2NrIGluIHRoZSBwYWdlLiAqLworCXJlY19ibG9jayA9IGJsb2NrID0gKHNlY3Rvcl90KXBhZ2UtPmluZGV4IDw8CisJCQkoUEFHRV9DQUNIRV9TSElGVCAtIGJoX3NpemVfYml0cyk7CisKKwkvKiBUaGUgZmlyc3Qgb3V0IG9mIGJvdW5kcyBibG9jayBmb3IgdGhlIGRhdGEgc2l6ZS4gKi8KKwlkYmxvY2sgPSAodmktPmlfc2l6ZSArIGJoX3NpemUgLSAxKSA+PiBiaF9zaXplX2JpdHM7CisKKwlybCA9IE5VTEw7CisJZXJyID0gZXJyMiA9IG5yX2JocyA9IG5yX3JlY3MgPSBucl9sb2NrZWRfbmlzID0gMDsKKwlwYWdlX2lzX2RpcnR5ID0gcmVjX2lzX2RpcnR5ID0gRkFMU0U7CisJcmVjX3N0YXJ0X2JoID0gTlVMTDsKKwlkbyB7CisJCUJPT0wgaXNfcmV0cnkgPSBGQUxTRTsKKworCQlpZiAobGlrZWx5KGJsb2NrIDwgcmVjX2Jsb2NrKSkgeworCQkJaWYgKHVubGlrZWx5KGJsb2NrID49IGRibG9jaykpIHsKKwkJCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyoKKwkJCSAqIFRoaXMgYmxvY2sgaXMgbm90IHRoZSBmaXJzdCBvbmUgaW4gdGhlIHJlY29yZC4gIFdlCisJCQkgKiBpZ25vcmUgdGhlIGJ1ZmZlcidzIGRpcnR5IHN0YXRlIGJlY2F1c2Ugd2UgY291bGQKKwkJCSAqIGhhdmUgcmFjZWQgd2l0aCBhIHBhcmFsbGVsIG1hcmtfbnRmc19yZWNvcmRfZGlydHkoKS4KKwkJCSAqLworCQkJaWYgKCFyZWNfaXNfZGlydHkpCisJCQkJY29udGludWU7CisJCQlpZiAodW5saWtlbHkoZXJyMikpIHsKKwkJCQlpZiAoZXJyMiAhPSAtRU5PTUVNKQorCQkJCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGVsc2UgLyogaWYgKGJsb2NrID09IHJlY19ibG9jaykgKi8geworCQkJQlVHX09OKGJsb2NrID4gcmVjX2Jsb2NrKTsKKwkJCS8qIFRoaXMgYmxvY2sgaXMgdGhlIGZpcnN0IG9uZSBpbiB0aGUgcmVjb3JkLiAqLworCQkJcmVjX2Jsb2NrICs9IGJoc19wZXJfcmVjOworCQkJZXJyMiA9IDA7CisJCQlpZiAodW5saWtlbHkoYmxvY2sgPj0gZGJsb2NrKSkgeworCQkJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIWJ1ZmZlcl9kaXJ0eShiaCkpIHsKKwkJCQkvKiBDbGVhbiByZWNvcmRzIGFyZSBub3Qgd3JpdHRlbiBvdXQuICovCisJCQkJcmVjX2lzX2RpcnR5ID0gRkFMU0U7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZWNfaXNfZGlydHkgPSBUUlVFOworCQkJcmVjX3N0YXJ0X2JoID0gYmg7CisJCX0KKwkJLyogTmVlZCB0byBtYXAgdGhlIGJ1ZmZlciBpZiBpdCBpcyBub3QgbWFwcGVkIGFscmVhZHkuICovCisJCWlmICh1bmxpa2VseSghYnVmZmVyX21hcHBlZChiaCkpKSB7CisJCQlWQ04gdmNuOworCQkJTENOIGxjbjsKKwkJCXVuc2lnbmVkIGludCB2Y25fb2ZzOworCisJCQkvKiBPYnRhaW4gdGhlIHZjbiBhbmQgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IGJsb2NrLiAqLworCQkJdmNuID0gKFZDTilibG9jayA8PCBiaF9zaXplX2JpdHM7CisJCQl2Y25fb2ZzID0gdmNuICYgdm9sLT5jbHVzdGVyX3NpemVfbWFzazsKKwkJCXZjbiA+Pj0gdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJCWlmICghcmwpIHsKK2xvY2tfcmV0cnlfcmVtYXA6CisJCQkJZG93bl9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJCQlybCA9IG5pLT5ydW5saXN0LnJsOworCQkJfQorCQkJaWYgKGxpa2VseShybCAhPSBOVUxMKSkgeworCQkJCS8qIFNlZWsgdG8gZWxlbWVudCBjb250YWluaW5nIHRhcmdldCB2Y24uICovCisJCQkJd2hpbGUgKHJsLT5sZW5ndGggJiYgcmxbMV0udmNuIDw9IHZjbikKKwkJCQkJcmwrKzsKKwkJCQlsY24gPSBudGZzX3JsX3Zjbl90b19sY24ocmwsIHZjbik7CisJCQl9IGVsc2UKKwkJCQlsY24gPSBMQ05fUkxfTk9UX01BUFBFRDsKKwkJCS8qIFN1Y2Nlc3NmdWwgcmVtYXAuICovCisJCQlpZiAobGlrZWx5KGxjbiA+PSAwKSkgeworCQkJCS8qIFNldHVwIGJ1ZmZlciBoZWFkIHRvIGNvcnJlY3QgYmxvY2suICovCisJCQkJYmgtPmJfYmxvY2tuciA9ICgobGNuIDw8CisJCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKSArCisJCQkJCQl2Y25fb2ZzKSA+PiBiaF9zaXplX2JpdHM7CisJCQkJc2V0X2J1ZmZlcl9tYXBwZWQoYmgpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFJlbWFwIGZhaWxlZC4gIFJldHJ5IHRvIG1hcCB0aGUgcnVubGlzdCBvbmNlCisJCQkJICogdW5sZXNzIHdlIGFyZSB3b3JraW5nIG9uICRNRlQgd2hpY2ggYWx3YXlzCisJCQkJICogaGFzIHRoZSB3aG9sZSBvZiBpdHMgcnVubGlzdCBpbiBtZW1vcnkuCisJCQkJICovCisJCQkJaWYgKCFpc19tZnQgJiYgIWlzX3JldHJ5ICYmCisJCQkJCQlsY24gPT0gTENOX1JMX05PVF9NQVBQRUQpIHsKKwkJCQkJaXNfcmV0cnkgPSBUUlVFOworCQkJCQkvKgorCQkJCQkgKiBBdHRlbXB0IHRvIG1hcCBydW5saXN0LCBkcm9wcGluZworCQkJCQkgKiBsb2NrIGZvciB0aGUgZHVyYXRpb24uCisJCQkJCSAqLworCQkJCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJCQkJZXJyMiA9IG50ZnNfbWFwX3J1bmxpc3QobmksIHZjbik7CisJCQkJCWlmIChsaWtlbHkoIWVycjIpKQorCQkJCQkJZ290byBsb2NrX3JldHJ5X3JlbWFwOworCQkJCQlpZiAoZXJyMiA9PSAtRU5PTUVNKQorCQkJCQkJcGFnZV9pc19kaXJ0eSA9IFRSVUU7CisJCQkJCWxjbiA9IGVycjI7CisJCQkJfSBlbHNlCisJCQkJCWVycjIgPSAtRUlPOworCQkJCS8qIEhhcmQgZXJyb3IuICBBYm9ydCB3cml0aW5nIHRoaXMgcmVjb3JkLiAqLworCQkJCWlmICghZXJyIHx8IGVyciA9PSAtRU5PTUVNKQorCQkJCQllcnIgPSBlcnIyOworCQkJCWJoLT5iX2Jsb2NrbnIgPSAtMTsKKwkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJDYW5ub3Qgd3JpdGUgbnRmcyByZWNvcmQgIgorCQkJCQkJIjB4JWxseCAoaW5vZGUgMHglbHgsICIKKwkJCQkJCSJhdHRyaWJ1dGUgdHlwZSAweCV4KSBiZWNhdXNlICIKKwkJCQkJCSJpdHMgbG9jYXRpb24gb24gZGlzayBjb3VsZCAiCisJCQkJCQkibm90IGJlIGRldGVybWluZWQgKGVycm9yICIKKwkJCQkJCSJjb2RlICVsbGkpLiIsIChzNjQpYmxvY2sgPDwKKwkJCQkJCWJoX3NpemVfYml0cyA+PgorCQkJCQkJdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cywKKwkJCQkJCW5pLT5tZnRfbm8sIG5pLT50eXBlLAorCQkJCQkJKGxvbmcgbG9uZylsY24pOworCQkJCS8qCisJCQkJICogSWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGJ1ZmZlciwgcmVtb3ZlIHRoZQorCQkJCSAqIGJ1ZmZlcnMgaW4gdGhpcyByZWNvcmQgZnJvbSB0aGUgbGlzdCBvZgorCQkJCSAqIGJ1ZmZlcnMgdG8gd3JpdGUgYW5kIGNsZWFyIHRoZWlyIGRpcnR5IGJpdAorCQkJCSAqIGlmIG5vdCBlcnJvciAtRU5PTUVNLgorCQkJCSAqLworCQkJCWlmIChyZWNfc3RhcnRfYmggIT0gYmgpIHsKKwkJCQkJd2hpbGUgKGJoc1stLW5yX2Joc10gIT0gcmVjX3N0YXJ0X2JoKQorCQkJCQkJOworCQkJCQlpZiAoZXJyMiAhPSAtRU5PTUVNKSB7CisJCQkJCQlkbyB7CisJCQkJCQkJY2xlYXJfYnVmZmVyX2RpcnR5KAorCQkJCQkJCQlyZWNfc3RhcnRfYmgpOworCQkJCQkJfSB3aGlsZSAoKHJlY19zdGFydF9iaCA9CisJCQkJCQkJCXJlY19zdGFydF9iaC0+CisJCQkJCQkJCWJfdGhpc19wYWdlKSAhPQorCQkJCQkJCQliaCk7CisJCQkJCX0KKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJQlVHX09OKCFidWZmZXJfdXB0b2RhdGUoYmgpKTsKKwkJQlVHX09OKG5yX2JocyA+PSBtYXhfYmhzKTsKKwkJYmhzW25yX2JocysrXSA9IGJoOworCX0gd2hpbGUgKGJsb2NrKyssIChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisJaWYgKHVubGlrZWx5KHJsKSkKKwkJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CisJLyogSWYgdGhlcmUgd2VyZSBubyBkaXJ0eSBidWZmZXJzLCB3ZSBhcmUgZG9uZS4gKi8KKwlpZiAoIW5yX2JocykKKwkJZ290byBkb25lOworCS8qIE1hcCB0aGUgcGFnZSBzbyB3ZSBjYW4gYWNjZXNzIGl0cyBjb250ZW50cy4gKi8KKwlrYWRkciA9IGttYXAocGFnZSk7CisJLyogQ2xlYXIgdGhlIHBhZ2UgdXB0b2RhdGUgZmxhZyB3aGlsc3QgdGhlIG1zdCBmaXh1cHMgYXJlIGFwcGxpZWQuICovCisJQlVHX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOworCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOworCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgb2ZzOworCisJCS8qIFNraXAgYnVmZmVycyB3aGljaCBhcmUgbm90IGF0IHRoZSBiZWdpbm5pbmcgb2YgcmVjb3Jkcy4gKi8KKwkJaWYgKGkgJSBiaHNfcGVyX3JlYykKKwkJCWNvbnRpbnVlOworCQl0YmggPSBiaHNbaV07CisJCW9mcyA9IGJoX29mZnNldCh0YmgpOworCQlpZiAoaXNfbWZ0KSB7CisJCQludGZzX2lub2RlICp0bmk7CisJCQl1bnNpZ25lZCBsb25nIG1mdF9ubzsKKworCQkJLyogR2V0IHRoZSBtZnQgcmVjb3JkIG51bWJlci4gKi8KKwkJCW1mdF9ubyA9ICgoKHM2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIG9mcykKKwkJCQkJPj4gcmVjX3NpemVfYml0czsKKwkJCS8qIENoZWNrIHdoZXRoZXIgdG8gd3JpdGUgdGhpcyBtZnQgcmVjb3JkLiAqLworCQkJdG5pID0gTlVMTDsKKwkJCWlmICghbnRmc19tYXlfd3JpdGVfbWZ0X3JlY29yZCh2b2wsIG1mdF9ubywKKwkJCQkJKE1GVF9SRUNPUkQqKShrYWRkciArIG9mcyksICZ0bmkpKSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgcmVjb3JkIHNob3VsZCBub3QgYmUgd3JpdHRlbi4gIFRoaXMKKwkJCQkgKiBtZWFucyB3ZSBuZWVkIHRvIHJlZGlydHkgdGhlIHBhZ2UgYmVmb3JlCisJCQkJICogcmV0dXJuaW5nLgorCQkJCSAqLworCQkJCXBhZ2VfaXNfZGlydHkgPSBUUlVFOworCQkJCS8qCisJCQkJICogUmVtb3ZlIHRoZSBidWZmZXJzIGluIHRoaXMgbWZ0IHJlY29yZCBmcm9tCisJCQkJICogdGhlIGxpc3Qgb2YgYnVmZmVycyB0byB3cml0ZS4KKwkJCQkgKi8KKwkJCQlkbyB7CisJCQkJCWJoc1tpXSA9IE5VTEw7CisJCQkJfSB3aGlsZSAoKytpICUgYmhzX3Blcl9yZWMpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyoKKwkJCSAqIFRoZSByZWNvcmQgc2hvdWxkIGJlIHdyaXR0ZW4uICBJZiBhIGxvY2tlZCBudGZzCisJCQkgKiBpbm9kZSB3YXMgcmV0dXJuZWQsIGFkZCBpdCB0byB0aGUgYXJyYXkgb2YgbG9ja2VkCisJCQkgKiBudGZzIGlub2Rlcy4KKwkJCSAqLworCQkJaWYgKHRuaSkKKwkJCQlsb2NrZWRfbmlzW25yX2xvY2tlZF9uaXMrK10gPSB0bmk7CisJCX0KKwkJLyogQXBwbHkgdGhlIG1zdCBwcm90ZWN0aW9uIGZpeHVwcy4gKi8KKwkJZXJyMiA9IHByZV93cml0ZV9tc3RfZml4dXAoKE5URlNfUkVDT1JEKikoa2FkZHIgKyBvZnMpLAorCQkJCXJlY19zaXplKTsKKwkJaWYgKHVubGlrZWx5KGVycjIpKSB7CisJCQlpZiAoIWVyciB8fCBlcnIgPT0gLUVOT01FTSkKKwkJCQllcnIgPSAtRUlPOworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGFwcGx5IG1zdCBmaXh1cHMgIgorCQkJCQkiKGlub2RlIDB4JWx4LCBhdHRyaWJ1dGUgdHlwZSAweCV4LCAiCisJCQkJCSJwYWdlIGluZGV4IDB4JWx4LCBwYWdlIG9mZnNldCAweCV4KSEiCisJCQkJCSIgIFVubW91bnQgYW5kIHJ1biBjaGtkc2suIiwgdmktPmlfaW5vLAorCQkJCQluaS0+dHlwZSwgcGFnZS0+aW5kZXgsIG9mcyk7CisJCQkvKgorCQkJICogTWFyayBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhpcyByZWNvcmQgY2xlYW4gYXMgd2UgZG8KKwkJCSAqIG5vdCB3YW50IHRvIHdyaXRlIGNvcnJ1cHQgZGF0YSB0byBkaXNrLgorCQkJICovCisJCQlkbyB7CisJCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoc1tpXSk7CisJCQkJYmhzW2ldID0gTlVMTDsKKwkJCX0gd2hpbGUgKCsraSAlIGJoc19wZXJfcmVjKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW5yX3JlY3MrKzsKKwl9CisJLyogSWYgbm8gcmVjb3JkcyBhcmUgdG8gYmUgd3JpdHRlbiBvdXQsIHdlIGFyZSBkb25lLiAqLworCWlmICghbnJfcmVjcykKKwkJZ290byB1bm1fZG9uZTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkvKiBMb2NrIGJ1ZmZlcnMgYW5kIHN0YXJ0IHN5bmNocm9ub3VzIHdyaXRlIGkvbyBvbiB0aGVtLiAqLworCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykgeworCQl0YmggPSBiaHNbaV07CisJCWlmICghdGJoKQorCQkJY29udGludWU7CisJCWlmICh1bmxpa2VseSh0ZXN0X3NldF9idWZmZXJfbG9ja2VkKHRiaCkpKQorCQkJQlVHKCk7CisJCS8qIFRoZSBidWZmZXIgZGlydHkgc3RhdGUgaXMgbm93IGlycmVsZXZhbnQsIGp1c3QgY2xlYW4gaXQuICovCisJCWNsZWFyX2J1ZmZlcl9kaXJ0eSh0YmgpOworCQlCVUdfT04oIWJ1ZmZlcl91cHRvZGF0ZSh0YmgpKTsKKwkJQlVHX09OKCFidWZmZXJfbWFwcGVkKHRiaCkpOworCQlnZXRfYmgodGJoKTsKKwkJdGJoLT5iX2VuZF9pbyA9IGVuZF9idWZmZXJfd3JpdGVfc3luYzsKKwkJc3VibWl0X2JoKFdSSVRFLCB0YmgpOworCX0KKwkvKiBTeW5jaHJvbml6ZSB0aGUgbWZ0IG1pcnJvciBub3cgaWYgbm90IEBzeW5jLiAqLworCWlmIChpc19tZnQgJiYgIXN5bmMpCisJCWdvdG8gZG9fbWlycm9yOworZG9fd2FpdDoKKwkvKiBXYWl0IG9uIGkvbyBjb21wbGV0aW9uIG9mIGJ1ZmZlcnMuICovCisJZm9yIChpID0gMDsgaSA8IG5yX2JoczsgaSsrKSB7CisJCXRiaCA9IGJoc1tpXTsKKwkJaWYgKCF0YmgpCisJCQljb250aW51ZTsKKwkJd2FpdF9vbl9idWZmZXIodGJoKTsKKwkJaWYgKHVubGlrZWx5KCFidWZmZXJfdXB0b2RhdGUodGJoKSkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkkvTyBlcnJvciB3aGlsZSB3cml0aW5nIG50ZnMgIgorCQkJCQkicmVjb3JkIGJ1ZmZlciAoaW5vZGUgMHglbHgsICIKKwkJCQkJImF0dHJpYnV0ZSB0eXBlIDB4JXgsIHBhZ2UgaW5kZXggIgorCQkJCQkiMHglbHgsIHBhZ2Ugb2Zmc2V0IDB4JWx4KSEgIFVubW91bnQgIgorCQkJCQkiYW5kIHJ1biBjaGtkc2suIiwgdmktPmlfaW5vLCBuaS0+dHlwZSwKKwkJCQkJcGFnZS0+aW5kZXgsIGJoX29mZnNldCh0YmgpKTsKKwkJCWlmICghZXJyIHx8IGVyciA9PSAtRU5PTUVNKQorCQkJCWVyciA9IC1FSU87CisJCQkvKgorCQkJICogU2V0IHRoZSBidWZmZXIgdXB0b2RhdGUgc28gdGhlIHBhZ2UgYW5kIGJ1ZmZlcgorCQkJICogc3RhdGVzIGRvIG5vdCBiZWNvbWUgb3V0IG9mIHN5bmMuCisJCQkgKi8KKwkJCXNldF9idWZmZXJfdXB0b2RhdGUodGJoKTsKKwkJfQorCX0KKwkvKiBJZiBAc3luYywgbm93IHN5bmNocm9uaXplIHRoZSBtZnQgbWlycm9yLiAqLworCWlmIChpc19tZnQgJiYgc3luYykgeworZG9fbWlycm9yOgorCQlmb3IgKGkgPSAwOyBpIDwgbnJfYmhzOyBpKyspIHsKKwkJCXVuc2lnbmVkIGxvbmcgbWZ0X25vOworCQkJdW5zaWduZWQgaW50IG9mczsKKworCQkJLyoKKwkJCSAqIFNraXAgYnVmZmVycyB3aGljaCBhcmUgbm90IGF0IHRoZSBiZWdpbm5pbmcgb2YKKwkJCSAqIHJlY29yZHMuCisJCQkgKi8KKwkJCWlmIChpICUgYmhzX3Blcl9yZWMpCisJCQkJY29udGludWU7CisJCQl0YmggPSBiaHNbaV07CisJCQkvKiBTa2lwIHJlbW92ZWQgYnVmZmVycyAoYW5kIGhlbmNlIHJlY29yZHMpLiAqLworCQkJaWYgKCF0YmgpCisJCQkJY29udGludWU7CisJCQlvZnMgPSBiaF9vZmZzZXQodGJoKTsKKwkJCS8qIEdldCB0aGUgbWZ0IHJlY29yZCBudW1iZXIuICovCisJCQltZnRfbm8gPSAoKChzNjQpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyBvZnMpCisJCQkJCT4+IHJlY19zaXplX2JpdHM7CisJCQlpZiAobWZ0X25vIDwgdm9sLT5tZnRtaXJyX3NpemUpCisJCQkJbnRmc19zeW5jX21mdF9taXJyb3Iodm9sLCBtZnRfbm8sCisJCQkJCQkoTUZUX1JFQ09SRCopKGthZGRyICsgb2ZzKSwKKwkJCQkJCXN5bmMpOworCQl9CisJCWlmICghc3luYykKKwkJCWdvdG8gZG9fd2FpdDsKKwl9CisJLyogUmVtb3ZlIHRoZSBtc3QgcHJvdGVjdGlvbiBmaXh1cHMgYWdhaW4uICovCisJZm9yIChpID0gMDsgaSA8IG5yX2JoczsgaSsrKSB7CisJCWlmICghKGkgJSBiaHNfcGVyX3JlYykpIHsKKwkJCXRiaCA9IGJoc1tpXTsKKwkJCWlmICghdGJoKQorCQkJCWNvbnRpbnVlOworCQkJcG9zdF93cml0ZV9tc3RfZml4dXAoKE5URlNfUkVDT1JEKikoa2FkZHIgKworCQkJCQliaF9vZmZzZXQodGJoKSkpOworCQl9CisJfQorCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwordW5tX2RvbmU6CisJLyogVW5sb2NrIGFueSBsb2NrZWQgaW5vZGVzLiAqLworCXdoaWxlIChucl9sb2NrZWRfbmlzLS0gPiAwKSB7CisJCW50ZnNfaW5vZGUgKnRuaSwgKmJhc2VfdG5pOworCQkKKwkJdG5pID0gbG9ja2VkX25pc1tucl9sb2NrZWRfbmlzXTsKKwkJLyogR2V0IHRoZSBiYXNlIGlub2RlLiAqLworCQlkb3duKCZ0bmktPmV4dGVudF9sb2NrKTsKKwkJaWYgKHRuaS0+bnJfZXh0ZW50cyA+PSAwKQorCQkJYmFzZV90bmkgPSB0bmk7CisJCWVsc2UgeworCQkJYmFzZV90bmkgPSB0bmktPmV4dC5iYXNlX250ZnNfaW5vOworCQkJQlVHX09OKCFiYXNlX3RuaSk7CisJCX0KKwkJdXAoJnRuaS0+ZXh0ZW50X2xvY2spOworCQludGZzX2RlYnVnKCJVbmxvY2tpbmcgJXMgaW5vZGUgMHglbHguIiwKKwkJCQl0bmkgPT0gYmFzZV90bmkgPyAiYmFzZSIgOiAiZXh0ZW50IiwKKwkJCQl0bmktPm1mdF9ubyk7CisJCXVwKCZ0bmktPm1yZWNfbG9jayk7CisJCWF0b21pY19kZWMoJnRuaS0+Y291bnQpOworCQlpcHV0KFZGU19JKGJhc2VfdG5pKSk7CisJfQorCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlrdW5tYXAocGFnZSk7Citkb25lOgorCWlmICh1bmxpa2VseShlcnIgJiYgZXJyICE9IC1FTk9NRU0pKSB7CisJCS8qCisJCSAqIFNldCBwYWdlIGVycm9yIGlmIHRoZXJlIGlzIG9ubHkgb25lIG50ZnMgcmVjb3JkIGluIHRoZSBwYWdlLgorCQkgKiBPdGhlcndpc2Ugd2Ugd291bGQgbG9vc2UgcGVyLXJlY29yZCBncmFudWxhcml0eS4KKwkJICovCisJCWlmIChuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSA9PSBQQUdFX0NBQ0hFX1NJWkUpCisJCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwl9CisJaWYgKHBhZ2VfaXNfZGlydHkpIHsKKwkJbnRmc19kZWJ1ZygiUGFnZSBzdGlsbCBjb250YWlucyBvbmUgb3IgbW9yZSBkaXJ0eSBudGZzICIKKwkJCQkicmVjb3Jkcy4gIFJlZGlydHlpbmcgdGhlIHBhZ2Ugc3RhcnRpbmcgYXQgIgorCQkJCSJyZWNvcmQgMHglbHguIiwgcGFnZS0+aW5kZXggPDwKKwkJCQkoUEFHRV9DQUNIRV9TSElGVCAtIHJlY19zaXplX2JpdHMpKTsKKwkJcmVkaXJ0eV9wYWdlX2Zvcl93cml0ZXBhZ2Uod2JjLCBwYWdlKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogS2VlcCB0aGUgVk0gaGFwcHkuICBUaGlzIG11c3QgYmUgZG9uZSBvdGhlcndpc2UgdGhlCisJCSAqIHJhZGl4LXRyZWUgdGFnIFBBR0VDQUNIRV9UQUdfRElSVFkgcmVtYWlucyBzZXQgZXZlbiB0aG91Z2gKKwkJICogdGhlIHBhZ2UgaXMgY2xlYW4uCisJCSAqLworCQlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CisJCXNldF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCWVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwl9CisJaWYgKGxpa2VseSghZXJyKSkKKwkJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIG50ZnNfd3JpdGVwYWdlIC0gd3JpdGUgYSBAcGFnZSB0byB0aGUgYmFja2luZyBzdG9yZQorICogQHBhZ2U6CXBhZ2UgY2FjaGUgcGFnZSB0byB3cml0ZSBvdXQKKyAqIEB3YmM6CXdyaXRlYmFjayBjb250cm9sIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20gdGhlIFZNIHdoZW4gaXQgd2FudHMgdG8gaGF2ZSBhIGRpcnR5IG50ZnMgcGFnZSBjYWNoZQorICogcGFnZSBjbGVhbmVkLiAgVGhlIFZNIGhhcyBhbHJlYWR5IGxvY2tlZCB0aGUgcGFnZSBhbmQgbWFya2VkIGl0IGNsZWFuLgorICoKKyAqIEZvciBub24tcmVzaWRlbnQgYXR0cmlidXRlcywgbnRmc193cml0ZXBhZ2UoKSB3cml0ZXMgdGhlIEBwYWdlIGJ5IGNhbGxpbmcKKyAqIHRoZSBudGZzIHZlcnNpb24gb2YgdGhlIGdlbmVyaWMgYmxvY2tfd3JpdGVfZnVsbF9wYWdlKCkgZnVuY3Rpb24sCisgKiBudGZzX3dyaXRlX2Jsb2NrKCksIHdoaWNoIGluIHR1cm4gaWYgbmVjZXNzYXJ5IGNyZWF0ZXMgYW5kIHdyaXRlcyB0aGUKKyAqIGJ1ZmZlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWdlIGFzeW5jaHJvbm91c2x5LgorICoKKyAqIEZvciByZXNpZGVudCBhdHRyaWJ1dGVzLCBPVE9ILCBudGZzX3dyaXRlcGFnZSgpIHdyaXRlcyB0aGUgQHBhZ2UgYnkgY29weWluZworICogdGhlIGRhdGEgdG8gdGhlIG1mdCByZWNvcmQgKHdoaWNoIGF0IHRoaXMgc3RhZ2UgaXMgbW9zdCBsaWtlbHkgaW4gbWVtb3J5KS4KKyAqIFRoZSBtZnQgcmVjb3JkIGlzIHRoZW4gbWFya2VkIGRpcnR5IGFuZCB3cml0dGVuIG91dCBhc3luY2hyb25vdXNseSB2aWEgdGhlCisgKiB2ZnMgaW5vZGUgZGlydHkgY29kZSBwYXRoIGZvciB0aGUgaW5vZGUgdGhlIG1mdCByZWNvcmQgYmVsb25ncyB0byBvciB2aWEgdGhlCisgKiB2bSBwYWdlIGRpcnR5IGNvZGUgcGF0aCBmb3IgdGhlIHBhZ2UgdGhlIG1mdCByZWNvcmQgaXMgaW4uCisgKgorICogQmFzZWQgb24gbnRmc19yZWFkcGFnZSgpIGFuZCBmcy9idWZmZXIuYzo6YmxvY2tfd3JpdGVfZnVsbF9wYWdlKCkuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50IG50ZnNfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlsb2ZmX3QgaV9zaXplOworCXN0cnVjdCBpbm9kZSAqdmk7CisJbnRmc19pbm9kZSAqbmksICpiYXNlX25pOworCWNoYXIgKmthZGRyOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJTUZUX1JFQ09SRCAqbTsKKwl1MzIgYXR0cl9sZW47CisJaW50IGVycjsKKworCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisKKwl2aSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJaV9zaXplID0gaV9zaXplX3JlYWQodmkpOworCisJLyogSXMgdGhlIHBhZ2UgZnVsbHkgb3V0c2lkZSBpX3NpemU/ICh0cnVuY2F0ZSBpbiBwcm9ncmVzcykgKi8KKwlpZiAodW5saWtlbHkocGFnZS0+aW5kZXggPj0gKGlfc2l6ZSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+CisJCQlQQUdFX0NBQ0hFX1NISUZUKSkgeworCQkvKgorCQkgKiBUaGUgcGFnZSBtYXkgaGF2ZSBkaXJ0eSwgdW5tYXBwZWQgYnVmZmVycy4gIE1ha2UgdGhlbQorCQkgKiBmcmVlYWJsZSBoZXJlLCBzbyB0aGUgcGFnZSBkb2VzIG5vdCBsZWFrLgorCQkgKi8KKwkJYmxvY2tfaW52YWxpZGF0ZXBhZ2UocGFnZSwgMCk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQludGZzX2RlYnVnKCJXcml0ZSBvdXRzaWRlIGlfc2l6ZSAtIHRydW5jYXRlZD8iKTsKKwkJcmV0dXJuIDA7CisJfQorCW5pID0gTlRGU19JKHZpKTsKKworCS8qIE5Jbm9Ob25SZXNpZGVudCgpID09IE5Jbm9JbmRleEFsbG9jUHJlc2VudCgpICovCisJaWYgKE5Jbm9Ob25SZXNpZGVudChuaSkpIHsKKwkJLyoKKwkJICogT25seSB1bm5hbWVkICREQVRBIGF0dHJpYnV0ZXMgY2FuIGJlIGNvbXByZXNzZWQsIGVuY3J5cHRlZCwKKwkJICogYW5kL29yIHNwYXJzZS4KKwkJICovCisJCWlmIChuaS0+dHlwZSA9PSBBVF9EQVRBICYmICFuaS0+bmFtZV9sZW4pIHsKKwkJCS8qIElmIGZpbGUgaXMgZW5jcnlwdGVkLCBkZW55IGFjY2VzcywganVzdCBsaWtlIE5UNC4gKi8KKwkJCWlmIChOSW5vRW5jcnlwdGVkKG5pKSkgeworCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJCW50ZnNfZGVidWcoIkRlbnlpbmcgd3JpdGUgYWNjZXNzIHRvIGVuY3J5cHRlZCAiCisJCQkJCQkiZmlsZS4iKTsKKwkJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJCX0KKwkJCS8qIENvbXByZXNzZWQgZGF0YSBzdHJlYW1zIGFyZSBoYW5kbGVkIGluIGNvbXByZXNzLmMuICovCisJCQlpZiAoTklub0NvbXByZXNzZWQobmkpKSB7CisJCQkJLy8gVE9ETzogSW1wbGVtZW50IGFuZCByZXBsYWNlIHRoaXMgY2hlY2sgd2l0aAorCQkJCS8vIHJldHVybiBudGZzX3dyaXRlX2NvbXByZXNzZWRfYmxvY2socGFnZSk7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIldyaXRpbmcgdG8gY29tcHJlc3NlZCAiCisJCQkJCQkiZmlsZXMgaXMgbm90IHN1cHBvcnRlZCB5ZXQuICIKKwkJCQkJCSJTb3JyeS4iKTsKKwkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQl9CisJCQkvLyBUT0RPOiBJbXBsZW1lbnQgYW5kIHJlbW92ZSB0aGlzIGNoZWNrLgorCQkJaWYgKE5Jbm9TcGFyc2UobmkpKSB7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIldyaXRpbmcgdG8gc3BhcnNlIGZpbGVzICIKKwkJCQkJCSJpcyBub3Qgc3VwcG9ydGVkIHlldC4gU29ycnkuIik7CisJCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQkJfQorCQl9CisJCS8qIFdlIGhhdmUgdG8gemVybyBldmVyeSB0aW1lIGR1ZSB0byBtbWFwLWF0LWVuZC1vZi1maWxlLiAqLworCQlpZiAocGFnZS0+aW5kZXggPj0gKGlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKSkgeworCQkJLyogVGhlIHBhZ2Ugc3RyYWRkbGVzIGlfc2l6ZS4gKi8KKwkJCXVuc2lnbmVkIGludCBvZnMgPSBpX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLOworCQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCQltZW1zZXQoa2FkZHIgKyBvZnMsIDAsIFBBR0VfQ0FDSEVfU0laRSAtIG9mcyk7CisJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJfQorCQkvKiBIYW5kbGUgbXN0IHByb3RlY3RlZCBhdHRyaWJ1dGVzLiAqLworCQlpZiAoTklub01zdFByb3RlY3RlZChuaSkpCisJCQlyZXR1cm4gbnRmc193cml0ZV9tc3RfYmxvY2socGFnZSwgd2JjKTsKKwkJLyogTm9ybWFsIGRhdGEgc3RyZWFtLiAqLworCQlyZXR1cm4gbnRmc193cml0ZV9ibG9jayhwYWdlLCB3YmMpOworCX0KKwkvKgorCSAqIEF0dHJpYnV0ZSBpcyByZXNpZGVudCwgaW1wbHlpbmcgaXQgaXMgbm90IGNvbXByZXNzZWQsIGVuY3J5cHRlZCwKKwkgKiBzcGFyc2UsIG9yIG1zdCBwcm90ZWN0ZWQuICBUaGlzIGFsc28gbWVhbnMgdGhlIGF0dHJpYnV0ZSBpcyBzbWFsbGVyCisJICogdGhhbiBhbiBtZnQgcmVjb3JkIGFuZCBoZW5jZSBzbWFsbGVyIHRoYW4gYSBwYWdlLCBzbyBjYW4gc2ltcGx5CisJICogcmV0dXJuIGVycm9yIG9uIGFueSBwYWdlcyB3aXRoIGluZGV4IGFib3ZlIDAuCisJICovCisJQlVHX09OKHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpOworCUJVR19PTighUGFnZVVwdG9kYXRlKHBhZ2UpKTsKKwlpZiAodW5saWtlbHkocGFnZS0+aW5kZXggPiAwKSkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiQlVHKCkhIHBhZ2UtPmluZGV4ICgweCVseCkgPiAwLiAgIgorCQkJCSJBYm9ydGluZyB3cml0ZS4iLCBwYWdlLT5pbmRleCk7CisJCUJVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKKwkJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKCFOSW5vQXR0cihuaSkpCisJCWJhc2VfbmkgPSBuaTsKKwllbHNlCisJCWJhc2VfbmkgPSBuaS0+ZXh0LmJhc2VfbnRmc19pbm87CisJLyogTWFwLCBwaW4sIGFuZCBsb2NrIHRoZSBtZnQgcmVjb3JkLiAqLworCW0gPSBtYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwlpZiAoSVNfRVJSKG0pKSB7CisJCWVyciA9IFBUUl9FUlIobSk7CisJCW0gPSBOVUxMOworCQljdHggPSBOVUxMOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChiYXNlX25pLCBtKTsKKwlpZiAodW5saWtlbHkoIWN0eCkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKwllcnIgPSBudGZzX2F0dHJfbG9va3VwKG5pLT50eXBlLCBuaS0+bmFtZSwgbmktPm5hbWVfbGVuLAorCQkJQ0FTRV9TRU5TSVRJVkUsIDAsIE5VTEwsIDAsIGN0eCk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gZXJyX291dDsKKwkvKgorCSAqIEtlZXAgdGhlIFZNIGhhcHB5LiAgVGhpcyBtdXN0IGJlIGRvbmUgb3RoZXJ3aXNlIHRoZSByYWRpeC10cmVlIHRhZworCSAqIFBBR0VDQUNIRV9UQUdfRElSVFkgcmVtYWlucyBzZXQgZXZlbiB0aG91Z2ggdGhlIHBhZ2UgaXMgY2xlYW4uCisJICovCisJQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOworCXNldF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKworCS8qCisJICogSGVyZSwgd2UgZG9uJ3QgbmVlZCB0byB6ZXJvIHRoZSBvdXQgb2YgYm91bmRzIGFyZWEgZXZlcnl0aW1lIGJlY2F1c2UKKwkgKiB0aGUgYmVsb3cgbWVtY3B5KCkgYWxyZWFkeSB0YWtlcyBjYXJlIG9mIHRoZSBtbWFwLWF0LWVuZC1vZi1maWxlCisJICogcmVxdWlyZW1lbnRzLiBJZiB0aGUgZmlsZSBpcyBjb252ZXJ0ZWQgdG8gYSBub24tcmVzaWRlbnQgb25lLCB0aGVuCisJICogdGhlIGNvZGUgcGF0aCB1c2UgaXMgc3dpdGNoZWQgdG8gdGhlIG5vbi1yZXNpZGVudCBvbmUgd2hlcmUgdGhlCisJICogemVyb2luZyBoYXBwZW5zIG9uIGVhY2ggbnRmc193cml0ZXBhZ2UoKSBpbnZvY2F0aW9uLgorCSAqCisJICogVGhlIGFib3ZlIGFsc28gYXBwbGllcyBuaWNlbHkgd2hlbiBpX3NpemUgaXMgZGVjcmVhc2VkLgorCSAqCisJICogV2hlbiBpX3NpemUgaXMgaW5jcmVhc2VkLCB0aGUgbWVtb3J5IGJldHdlZW4gdGhlIG9sZCBhbmQgbmV3IGlfc2l6ZQorCSAqIF9tdXN0XyBiZSB6ZXJvZWQgKG9yIG92ZXJ3cml0dGVuIHdpdGggbmV3IGRhdGEpLiBPdGhlcndpc2Ugd2Ugd2lsbAorCSAqIGV4cG9zZSBkYXRhIHRvIHVzZXJzcGFjZS9kaXNrIHdoaWNoIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gZXhwb3NlZC4KKwkgKgorCSAqIEZJWE1FOiBFbnN1cmUgdGhhdCBpX3NpemUgaW5jcmVhc2VzIGRvIHRoZSB6ZXJvaW5nL292ZXJ3cml0aW5nIGFuZAorCSAqIGlmIHdlIGNhbm5vdCBndWFyYW50ZWUgdGhhdCwgdGhlbiBlbmFibGUgdGhlIHplcm9pbmcgYmVsb3cuICBJZiB0aGUKKwkgKiB6ZXJvaW5nIGJlbG93IGlzIGVuYWJsZWQsIHdlIE1VU1QgbW92ZSB0aGUgdW5sb2NrX3BhZ2UoKSBmcm9tIGFib3ZlCisJICogdG8gYWZ0ZXIgdGhlIGt1bm1hcF9hdG9taWMoKSwgaS5lLiBqdXN0IGJlZm9yZSB0aGUKKwkgKiBlbmRfcGFnZV93cml0ZWJhY2soKS4KKwkgKiBVUERBVEU6IG50ZnNfcHJlcGFyZS9jb21taXRfd3JpdGUoKSBkbyB0aGUgemVyb2luZyBvbiBpX3NpemUKKwkgKiBpbmNyZWFzZXMgZm9yIHJlc2lkZW50IGF0dHJpYnV0ZXMgc28gdGhvc2UgYXJlIG9rLgorCSAqIFRPRE86IG50ZnNfdHJ1bmNhdGUoKSwgb3RoZXJzPworCSAqLworCisJYXR0cl9sZW4gPSBsZTMyX3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwlpX3NpemUgPSBpX3NpemVfcmVhZChWRlNfSShuaSkpOworCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCWlmICh1bmxpa2VseShhdHRyX2xlbiA+IGlfc2l6ZSkpIHsKKwkJLyogWmVybyBvdXQgb2YgYm91bmRzIGFyZWEgaW4gdGhlIG1mdCByZWNvcmQuICovCisJCW1lbXNldCgodTgqKWN0eC0+YXR0ciArIGxlMTZfdG9fY3B1KAorCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpICsKKwkJCQlpX3NpemUsIDAsIGF0dHJfbGVuIC0gaV9zaXplKTsKKwkJYXR0cl9sZW4gPSBpX3NpemU7CisJfQorCS8qIENvcHkgdGhlIGRhdGEgZnJvbSB0aGUgcGFnZSB0byB0aGUgbWZ0IHJlY29yZC4gKi8KKwltZW1jcHkoKHU4KiljdHgtPmF0dHIgKworCQkJbGUxNl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCksCisJCQlrYWRkciwgYXR0cl9sZW4pOworCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CisJLyogWmVybyBvdXQgb2YgYm91bmRzIGFyZWEgaW4gdGhlIHBhZ2UgY2FjaGUgcGFnZS4gKi8KKwltZW1zZXQoa2FkZHIgKyBhdHRyX2xlbiwgMCwgUEFHRV9DQUNIRV9TSVpFIC0gYXR0cl9sZW4pOworCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKworCWVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKworCS8qIE1hcmsgdGhlIG1mdCByZWNvcmQgZGlydHksIHNvIGl0IGdldHMgd3JpdHRlbiBiYWNrLiAqLworCW1hcmtfbWZ0X3JlY29yZF9kaXJ0eShjdHgtPm50ZnNfaW5vKTsKKwludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwl1bm1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCXJldHVybiAwOworZXJyX291dDoKKwlpZiAoZXJyID09IC1FTk9NRU0pIHsKKwkJbnRmc193YXJuaW5nKHZpLT5pX3NiLCAiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkuIFJlZGlydHlpbmcgIgorCQkJCSJwYWdlIHNvIHdlIHRyeSBhZ2FpbiBsYXRlci4iKTsKKwkJLyoKKwkJICogUHV0IHRoZSBwYWdlIGJhY2sgb24gbWFwcGluZy0+ZGlydHlfcGFnZXMsIGJ1dCBsZWF2ZSBpdHMKKwkJICogYnVmZmVycycgZGlydHkgc3RhdGUgYXMtaXMuCisJCSAqLworCQlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOworCQllcnIgPSAwOworCX0gZWxzZSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJSZXNpZGVudCBhdHRyaWJ1dGUgd3JpdGUgZmFpbGVkIHdpdGggIgorCQkJCSJlcnJvciAlaS4gIFNldHRpbmcgcGFnZSBlcnJvciBmbGFnLiIsIGVycik7CisJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwl9CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJaWYgKGN0eCkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJaWYgKG0pCisJCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBudGZzX3ByZXBhcmVfbm9ucmVzaWRlbnRfd3JpdGUgLQorICoKKyAqLworc3RhdGljIGludCBudGZzX3ByZXBhcmVfbm9ucmVzaWRlbnRfd3JpdGUoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCXVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCVZDTiB2Y247CisJTENOIGxjbjsKKwlzZWN0b3JfdCBibG9jaywgYWJsb2NrLCBpYmxvY2s7CisJc3RydWN0IGlub2RlICp2aTsKKwludGZzX2lub2RlICpuaTsKKwludGZzX3ZvbHVtZSAqdm9sOworCXJ1bmxpc3RfZWxlbWVudCAqcmw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQsICp3YWl0WzJdLCAqKndhaXRfYmggPSB3YWl0OworCXVuc2lnbmVkIGludCB2Y25fb2ZzLCBibG9ja19zdGFydCwgYmxvY2tfZW5kLCBibG9ja3NpemU7CisJaW50IGVycjsKKwlCT09MIGlzX3JldHJ5OworCXVuc2lnbmVkIGNoYXIgYmxvY2tzaXplX2JpdHM7CisKKwl2aSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJbmkgPSBOVEZTX0kodmkpOworCXZvbCA9IG5pLT52b2w7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaW5vZGUgMHglbHgsIGF0dHJpYnV0ZSB0eXBlIDB4JXgsIHBhZ2UgaW5kZXggIgorCQkJIjB4JWx4LCBmcm9tID0gJXUsIHRvID0gJXUuIiwgbmktPm1mdF9ubywgbmktPnR5cGUsCisJCQlwYWdlLT5pbmRleCwgZnJvbSwgdG8pOworCisJQlVHX09OKCFOSW5vTm9uUmVzaWRlbnQobmkpKTsKKworCWJsb2Nrc2l6ZV9iaXRzID0gdmktPmlfYmxrYml0czsKKwlibG9ja3NpemUgPSAxIDw8IGJsb2Nrc2l6ZV9iaXRzOworCisJLyoKKwkgKiBjcmVhdGVfZW1wdHlfYnVmZmVycygpIHdpbGwgY3JlYXRlIHVwdG9kYXRlL2RpcnR5IGJ1ZmZlcnMgaWYgdGhlCisJICogcGFnZSBpcyB1cHRvZGF0ZS9kaXJ0eS4KKwkgKi8KKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCWNyZWF0ZV9lbXB0eV9idWZmZXJzKHBhZ2UsIGJsb2Nrc2l6ZSwgMCk7CisJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWlmICh1bmxpa2VseSghYmgpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFRoZSBmaXJzdCBibG9jayBpbiB0aGUgcGFnZS4gKi8KKwlibG9jayA9IChzNjQpcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBibG9ja3NpemVfYml0cyk7CisKKwkvKgorCSAqIFRoZSBmaXJzdCBvdXQgb2YgYm91bmRzIGJsb2NrIGZvciB0aGUgYWxsb2NhdGVkIHNpemUuIE5vIG5lZWQgdG8KKwkgKiByb3VuZCB1cCBhcyBhbGxvY2F0ZWRfc2l6ZSBpcyBpbiBtdWx0aXBsZXMgb2YgY2x1c3RlciBzaXplIGFuZCB0aGUKKwkgKiBtaW5pbXVtIGNsdXN0ZXIgc2l6ZSBpcyA1MTIgYnl0ZXMsIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBzbWFsbGVzdAorCSAqIGJsb2Nrc2l6ZS4KKwkgKi8KKwlhYmxvY2sgPSBuaS0+YWxsb2NhdGVkX3NpemUgPj4gYmxvY2tzaXplX2JpdHM7CisKKwkvKiBUaGUgbGFzdCAoZnVsbHkgb3IgcGFydGlhbGx5KSBpbml0aWFsaXplZCBibG9jay4gKi8KKwlpYmxvY2sgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA+PiBibG9ja3NpemVfYml0czsKKworCS8qIExvb3AgdGhyb3VnaCBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIHBhZ2UuICovCisJYmxvY2tfc3RhcnQgPSAwOworCXJsID0gTlVMTDsKKwllcnIgPSAwOworCWRvIHsKKwkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBibG9ja3NpemU7CisJCS8qCisJCSAqIElmIGJ1ZmZlciBAYmggaXMgb3V0c2lkZSB0aGUgd3JpdGUsIGp1c3QgbWFyayBpdCB1cHRvZGF0ZQorCQkgKiBpZiB0aGUgcGFnZSBpcyB1cHRvZGF0ZSBhbmQgY29udGludWUgd2l0aCB0aGUgbmV4dCBidWZmZXIuCisJCSAqLworCQlpZiAoYmxvY2tfZW5kIDw9IGZyb20gfHwgYmxvY2tfc3RhcnQgPj0gdG8pIHsKKwkJCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJLyoKKwkJICogQGJoIGlzIGF0IGxlYXN0IHBhcnRpYWxseSBiZWluZyB3cml0dGVuIHRvLgorCQkgKiBNYWtlIHN1cmUgaXQgaXMgbm90IG1hcmtlZCBhcyBuZXcuCisJCSAqLworCQkvL2lmIChidWZmZXJfbmV3KGJoKSkKKwkJLy8JY2xlYXJfYnVmZmVyX25ldyhiaCk7CisKKwkJaWYgKGJsb2NrID49IGFibG9jaykgeworCQkJLy8gVE9ETzogYmxvY2sgaXMgYWJvdmUgYWxsb2NhdGVkX3NpemUsIG5lZWQgdG8KKwkJCS8vIGFsbG9jYXRlIGl0LiBCZXN0IGRvbmUgaW4gb25lIGdvIHRvIGFjY29tbW9kYXRlIG5vdAorCQkJLy8gb25seSBibG9jayBidXQgYWxsIGFib3ZlIGJsb2NrcyB1cCB0byBhbmQgaW5jbHVkaW5nOgorCQkJLy8gKChwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIHRvICsgYmxvY2tzaXplCisJCQkvLyAtIDEpID4+IGJsb2Jrc2l6ZV9iaXRzLiBPYnZpb3VzbHkgd2lsbCBuZWVkIHRvIHJvdW5kCisJCQkvLyB1cCB0byBuZXh0IGNsdXN0ZXIgYm91bmRhcnksIHRvby4gVGhpcyBzaG91bGQgYmUKKwkJCS8vIGRvbmUgd2l0aCBhIGhlbHBlciBmdW5jdGlvbiwgc28gaXQgY2FuIGJlIHJldXNlZC4KKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIldyaXRpbmcgYmV5b25kIGFsbG9jYXRlZCBzaXplICIKKwkJCQkJImlzIG5vdCBzdXBwb3J0ZWQgeWV0LiBTb3JyeS4iKTsKKwkJCWVyciA9IC1FT1BOT1RTVVBQOworCQkJZ290byBlcnJfb3V0OworCQkJLy8gTmVlZCB0byB1cGRhdGUgYWJsb2NrLgorCQkJLy8gTmVlZCB0byBzZXRfYnVmZmVyX25ldygpIG9uIGFsbCBibG9jayBiaHMgdGhhdCBhcmUKKwkJCS8vIG5ld2x5IGFsbG9jYXRlZC4KKwkJfQorCQkvKgorCQkgKiBOb3cgd2UgaGF2ZSBlbm91Z2ggYWxsb2NhdGVkIHNpemUgdG8gZnVsZmlsbCB0aGUgd2hvbGUKKwkJICogcmVxdWVzdCwgaS5lLiBibG9jayA8IGFibG9jayBpcyB0cnVlLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KChibG9jayA+PSBpYmxvY2spICYmCisJCQkJKG5pLT5pbml0aWFsaXplZF9zaXplIDwgdmktPmlfc2l6ZSkpKSB7CisJCQkvKgorCQkJICogSWYgdGhpcyBwYWdlIGlzIGZ1bGx5IG91dHNpZGUgaW5pdGlhbGl6ZWQgc2l6ZSwgemVybworCQkJICogb3V0IGFsbCBwYWdlcyBiZXR3ZWVuIHRoZSBjdXJyZW50IGluaXRpYWxpemVkIHNpemUKKwkJCSAqIGFuZCB0aGUgY3VycmVudCBwYWdlLiBKdXN0IHVzZSBudGZzX3JlYWRwYWdlKCkgdG8gZG8KKwkJCSAqIHRoZSB6ZXJvaW5nIHRyYW5zcGFyZW50bHkuCisJCQkgKi8KKwkJCWlmIChibG9jayA+IGlibG9jaykgeworCQkJCS8vIFRPRE86CisJCQkJLy8gRm9yIGVhY2ggcGFnZSBkbzoKKwkJCQkvLyAtIHJlYWRfY2FjaGVfcGFnZSgpCisJCQkJLy8gQWdhaW4gZm9yIGVhY2ggcGFnZSBkbzoKKwkJCQkvLyAtIHdhaXRfb25fcGFnZV9sb2NrZWQoKQorCQkJCS8vIC0gQ2hlY2sgKFBhZ2VVcHRvZGF0ZShwYWdlKSAmJgorCQkJCS8vCQkJIVBhZ2VFcnJvcihwYWdlKSkKKwkJCQkvLyBVcGRhdGUgaW5pdGlhbGl6ZWQgc2l6ZSBpbiB0aGUgYXR0cmlidXRlIGFuZAorCQkJCS8vIGluIHRoZSBpbm9kZS4KKwkJCQkvLyBBZ2FpbiwgZm9yIGVhY2ggcGFnZSBkbzoKKwkJCQkvLwlfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnMoKTsKKwkJCQkvLyBwYWdlX2NhY2hlX3JlbGVhc2UoKQorCQkJCS8vIFdlIGRvbid0IG5lZWQgdG8gd2FpdCBvbiB0aGUgd3JpdGVzLgorCQkJCS8vIFVwZGF0ZSBpYmxvY2suCisJCQl9CisJCQkvKgorCQkJICogVGhlIGN1cnJlbnQgcGFnZSBzdHJhZGRsZXMgaW5pdGlhbGl6ZWQgc2l6ZS4gWmVybworCQkJICogYWxsIG5vbi11cHRvZGF0ZSBidWZmZXJzIGFuZCBzZXQgdGhlbSB1cHRvZGF0ZSAoYW5kCisJCQkgKiBkaXJ0eT8pLiBOb3RlLCB0aGVyZSBhcmVuJ3QgYW55IG5vbi11cHRvZGF0ZSBidWZmZXJzCisJCQkgKiBpZiB0aGUgcGFnZSBpcyB1cHRvZGF0ZS4KKwkJCSAqIEZJWE1FOiBGb3IgYW4gdXB0b2RhdGUgcGFnZSwgdGhlIGJ1ZmZlcnMgbWF5IG5lZWQgdG8KKwkJCSAqIGJlIHdyaXR0ZW4gb3V0IGJlY2F1c2UgdGhleSB3ZXJlIG5vdCBpbml0aWFsaXplZCBvbgorCQkJICogZGlzayBiZWZvcmUuCisJCQkgKi8KKwkJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQkJLy8gVE9ETzoKKwkJCQkvLyBaZXJvIGFueSBub24tdXB0b2RhdGUgYnVmZmVycyB1cCB0byBpX3NpemUuCisJCQkJLy8gU2V0IHRoZW0gdXB0b2RhdGUgYW5kIGRpcnR5LgorCQkJfQorCQkJLy8gVE9ETzoKKwkJCS8vIFVwZGF0ZSBpbml0aWFsaXplZCBzaXplIGluIHRoZSBhdHRyaWJ1dGUgYW5kIGluIHRoZQorCQkJLy8gaW5vZGUgKHVwIHRvIGlfc2l6ZSkuCisJCQkvLyBVcGRhdGUgaWJsb2NrLgorCQkJLy8gRklYTUU6IFRoaXMgaXMgaW5lZmZpY2llbnQuIFRyeSB0byBiYXRjaCB0aGUgdHdvCisJCQkvLyBzaXplIGNoYW5nZXMgdG8gaGFwcGVuIGluIG9uZSBnby4KKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIldyaXRpbmcgYmV5b25kIGluaXRpYWxpemVkIHNpemUgIgorCQkJCQkiaXMgbm90IHN1cHBvcnRlZCB5ZXQuIFNvcnJ5LiIpOworCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCQlnb3RvIGVycl9vdXQ7CisJCQkvLyBEbyBOT1Qgc2V0X2J1ZmZlcl9uZXcoKSBCVVQgRE8gY2xlYXIgYnVmZmVyIHJhbmdlCisJCQkvLyBvdXRzaWRlIHdyaXRlIHJlcXVlc3QgcmFuZ2UuCisJCQkvLyBzZXRfYnVmZmVyX3VwdG9kYXRlKCkgb24gY29tcGxldGUgYnVmZmVycyBhcyB3ZWxsIGFzCisJCQkvLyBzZXRfYnVmZmVyX2RpcnR5KCkuCisJCX0KKworCQkvKiBOZWVkIHRvIG1hcCB1bm1hcHBlZCBidWZmZXJzLiAqLworCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKSB7CisJCQkvKiBVbm1hcHBlZCBidWZmZXIuIE5lZWQgdG8gbWFwIGl0LiAqLworCQkJYmgtPmJfYmRldiA9IHZvbC0+c2ItPnNfYmRldjsKKworCQkJLyogQ29udmVydCBibG9jayBpbnRvIGNvcnJlc3BvbmRpbmcgdmNuIGFuZCBvZmZzZXQuICovCisJCQl2Y24gPSAoVkNOKWJsb2NrIDw8IGJsb2Nrc2l6ZV9iaXRzID4+CisJCQkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CisJCQl2Y25fb2ZzID0gKChWQ04pYmxvY2sgPDwgYmxvY2tzaXplX2JpdHMpICYKKwkJCQkJdm9sLT5jbHVzdGVyX3NpemVfbWFzazsKKworCQkJaXNfcmV0cnkgPSBGQUxTRTsKKwkJCWlmICghcmwpIHsKK2xvY2tfcmV0cnlfcmVtYXA6CisJCQkJZG93bl9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJCQlybCA9IG5pLT5ydW5saXN0LnJsOworCQkJfQorCQkJaWYgKGxpa2VseShybCAhPSBOVUxMKSkgeworCQkJCS8qIFNlZWsgdG8gZWxlbWVudCBjb250YWluaW5nIHRhcmdldCB2Y24uICovCisJCQkJd2hpbGUgKHJsLT5sZW5ndGggJiYgcmxbMV0udmNuIDw9IHZjbikKKwkJCQkJcmwrKzsKKwkJCQlsY24gPSBudGZzX3JsX3Zjbl90b19sY24ocmwsIHZjbik7CisJCQl9IGVsc2UKKwkJCQlsY24gPSBMQ05fUkxfTk9UX01BUFBFRDsKKwkJCWlmICh1bmxpa2VseShsY24gPCAwKSkgeworCQkJCS8qCisJCQkJICogV2UgZXh0ZW5kZWQgdGhlIGF0dHJpYnV0ZSBhbGxvY2F0aW9uIGFib3ZlLgorCQkJCSAqIElmIHdlIGhpdCBhbiBFTk9FTlQgaGVyZSBpdCBtZWFucyB0aGF0IHRoZQorCQkJCSAqIGFsbG9jYXRpb24gd2FzIGluc3VmZmljaWVudCB3aGljaCBpcyBhIGJ1Zy4KKwkJCQkgKi8KKwkJCQlCVUdfT04obGNuID09IExDTl9FTk9FTlQpOworCisJCQkJLyogSXQgaXMgYSBob2xlLCBuZWVkIHRvIGluc3RhbnRpYXRlIGl0LiAqLworCQkJCWlmIChsY24gPT0gTENOX0hPTEUpIHsKKwkJCQkJLy8gVE9ETzogSW5zdGFudGlhdGUgdGhlIGhvbGUuCisJCQkJCS8vIGNsZWFyX2J1ZmZlcl9uZXcoYmgpOworCQkJCQkvLyB1bm1hcF91bmRlcmx5aW5nX21ldGFkYXRhKGJoLT5iX2JkZXYsCisJCQkJCS8vCQliaC0+Yl9ibG9ja25yKTsKKwkJCQkJLy8gRm9yIG5vbi11cHRvZGF0ZSBidWZmZXJzLCBuZWVkIHRvCisJCQkJCS8vIHplcm8gb3V0IHRoZSByZWdpb24gb3V0c2lkZSB0aGUKKwkJCQkJLy8gcmVxdWVzdCBpbiB0aGlzIGJoIG9yIGFsbCBiaHMsCisJCQkJCS8vIGRlcGVuZGluZyBvbiB3aGF0IHdlIGltcGxlbWVudGVkCisJCQkJCS8vIGFib3ZlLgorCQkJCQkvLyBOZWVkIHRvIGZsdXNoX2RjYWNoZV9wYWdlKCkuCisJCQkJCS8vIE9yIGNvdWxkIHVzZSBzZXRfYnVmZmVyX25ldygpCisJCQkJCS8vIGluc3RlYWQ/CisJCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIldyaXRpbmcgaW50byAiCisJCQkJCQkJInNwYXJzZSByZWdpb25zIGlzICIKKwkJCQkJCQkibm90IHN1cHBvcnRlZCB5ZXQuICIKKwkJCQkJCQkiU29ycnkuIik7CisJCQkJCWVyciA9IC1FT1BOT1RTVVBQOworCQkJCQlnb3RvIGVycl9vdXQ7CisJCQkJfSBlbHNlIGlmICghaXNfcmV0cnkgJiYKKwkJCQkJCWxjbiA9PSBMQ05fUkxfTk9UX01BUFBFRCkgeworCQkJCQlpc19yZXRyeSA9IFRSVUU7CisJCQkJCS8qCisJCQkJCSAqIEF0dGVtcHQgdG8gbWFwIHJ1bmxpc3QsIGRyb3BwaW5nCisJCQkJCSAqIGxvY2sgZm9yIHRoZSBkdXJhdGlvbi4KKwkJCQkJICovCisJCQkJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJCQllcnIgPSBudGZzX21hcF9ydW5saXN0KG5pLCB2Y24pOworCQkJCQlpZiAobGlrZWx5KCFlcnIpKQorCQkJCQkJZ290byBsb2NrX3JldHJ5X3JlbWFwOworCQkJCQlybCA9IE5VTEw7CisJCQkJCWxjbiA9IGVycjsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBGYWlsZWQgdG8gbWFwIHRoZSBidWZmZXIsIGV2ZW4gYWZ0ZXIKKwkJCQkgKiByZXRyeWluZy4KKwkJCQkgKi8KKwkJCQliaC0+Yl9ibG9ja25yID0gLTE7CisJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHdyaXRlIHRvIGlub2RlICIKKwkJCQkJCSIweCVseCwgYXR0cmlidXRlIHR5cGUgMHgleCwgIgorCQkJCQkJInZjbiAweCVsbHgsIG9mZnNldCAweCV4ICIKKwkJCQkJCSJiZWNhdXNlIGl0cyBsb2NhdGlvbiBvbiBkaXNrICIKKwkJCQkJCSJjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCVzICIKKwkJCQkJCSIoZXJyb3IgY29kZSAlbGxpKS4iLAorCQkJCQkJbmktPm1mdF9ubywgbmktPnR5cGUsCisJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZjbiwKKwkJCQkJCXZjbl9vZnMsIGlzX3JldHJ5ID8gIiBldmVuICIKKwkJCQkJCSJhZnRlciByZXRyeWluZyIgOiAiIiwKKwkJCQkJCShsb25nIGxvbmcpbGNuKTsKKwkJCQlpZiAoIWVycikKKwkJCQkJZXJyID0gLUVJTzsKKwkJCQlnb3RvIGVycl9vdXQ7CisJCQl9CisJCQkvKiBXZSBub3cgaGF2ZSBhIHN1Y2Nlc3NmdWwgcmVtYXAsIGkuZS4gbGNuID49IDAuICovCisKKwkJCS8qIFNldHVwIGJ1ZmZlciBoZWFkIHRvIGNvcnJlY3QgYmxvY2suICovCisJCQliaC0+Yl9ibG9ja25yID0gKChsY24gPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cykKKwkJCQkJKyB2Y25fb2ZzKSA+PiBibG9ja3NpemVfYml0czsKKwkJCXNldF9idWZmZXJfbWFwcGVkKGJoKTsKKworCQkJLy8gRklYTUU6IFNvbWV0aGluZyBhbmFsb2dvdXMgdG8gdGhpcyBpcyBuZWVkZWQgZm9yCisJCQkvLyBlYWNoIG5ld2x5IGFsbG9jYXRlZCBibG9jaywgaS5lLiBCSF9OZXcuCisJCQkvLyBGSVhNRTogTWlnaHQgbmVlZCB0byB0YWtlIHRoaXMgb3V0IG9mIHRoZQorCQkJLy8gaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkge30sIGRlcGVuZGluZyBvbiBob3cgd2UKKwkJCS8vIGltcGxlbWVudCB0aGluZ3MgZHVyaW5nIHRoZSBhbGxvY2F0ZWRfc2l6ZSBhbmQKKwkJCS8vIGluaXRpYWxpemVkX3NpemUgZXh0ZW5zaW9uIGNvZGUgYWJvdmUuCisJCQlpZiAoYnVmZmVyX25ldyhiaCkpIHsKKwkJCQljbGVhcl9idWZmZXJfbmV3KGJoKTsKKwkJCQl1bm1hcF91bmRlcmx5aW5nX21ldGFkYXRhKGJoLT5iX2JkZXYsCisJCQkJCQliaC0+Yl9ibG9ja25yKTsKKwkJCQlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBQYWdlIGlzIF9ub3RfIHVwdG9kYXRlLCB6ZXJvIHN1cnJvdW5kaW5nCisJCQkJICogcmVnaW9uLiBOT1RFOiBUaGlzIGlzIGhvdyB3ZSBkZWNpZGUgaWYgdG8KKwkJCQkgKiB6ZXJvIG9yIG5vdCEKKwkJCQkgKi8KKwkJCQlpZiAoYmxvY2tfZW5kID4gdG8gfHwgYmxvY2tfc3RhcnQgPCBmcm9tKSB7CisJCQkJCXZvaWQgKmthZGRyOworCisJCQkJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQkJCQlpZiAoYmxvY2tfZW5kID4gdG8pCisJCQkJCQltZW1zZXQoa2FkZHIgKyB0bywgMCwKKwkJCQkJCQkJYmxvY2tfZW5kIC0gdG8pOworCQkJCQlpZiAoYmxvY2tfc3RhcnQgPCBmcm9tKQorCQkJCQkJbWVtc2V0KGthZGRyICsgYmxvY2tfc3RhcnQsIDAsCisJCQkJCQkJCWZyb20gLQorCQkJCQkJCQlibG9ja19zdGFydCk7CisJCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCS8qIEBiaCBpcyBtYXBwZWQsIHNldCBpdCB1cHRvZGF0ZSBpZiB0aGUgcGFnZSBpcyB1cHRvZGF0ZS4gKi8KKwkJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJY29udGludWU7CisJCX0KKwkJLyoKKwkJICogVGhlIHBhZ2UgaXMgbm90IHVwdG9kYXRlLiBUaGUgYnVmZmVyIGlzIG1hcHBlZC4gSWYgaXQgaXMgbm90CisJCSAqIHVwdG9kYXRlLCBhbmQgaXQgaXMgb25seSBwYXJ0aWFsbHkgYmVpbmcgd3JpdHRlbiB0bywgd2UgbmVlZAorCQkgKiB0byByZWFkIHRoZSBidWZmZXIgaW4gYmVmb3JlIHRoZSB3cml0ZSwgaS5lLiByaWdodCBub3cuCisJCSAqLworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkgJiYKKwkJCQkoYmxvY2tfc3RhcnQgPCBmcm9tIHx8IGJsb2NrX2VuZCA+IHRvKSkgeworCQkJbGxfcndfYmxvY2soUkVBRCwgMSwgJmJoKTsKKwkJCSp3YWl0X2JoKysgPSBiaDsKKwkJfQorCX0gd2hpbGUgKGJsb2NrKyssIGJsb2NrX3N0YXJ0ID0gYmxvY2tfZW5kLAorCQkJKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKworCS8qIFJlbGVhc2UgdGhlIGxvY2sgaWYgd2UgdG9vayBpdC4gKi8KKwlpZiAocmwpIHsKKwkJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CisJCXJsID0gTlVMTDsKKwl9CisKKwkvKiBJZiB3ZSBpc3N1ZWQgcmVhZCByZXF1ZXN0cywgbGV0IHRoZW0gY29tcGxldGUuICovCisJd2hpbGUgKHdhaXRfYmggPiB3YWl0KSB7CisJCXdhaXRfb25fYnVmZmVyKCotLXdhaXRfYmgpOworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZSgqd2FpdF9iaCkpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiAwOworZXJyX291dDoKKwkvKgorCSAqIFplcm8gb3V0IGFueSBuZXdseSBhbGxvY2F0ZWQgYmxvY2tzIHRvIGF2b2lkIGV4cG9zaW5nIHN0YWxlIGRhdGEuCisJICogSWYgQkhfTmV3IGlzIHNldCwgd2Uga25vdyB0aGF0IHRoZSBibG9jayB3YXMgbmV3bHkgYWxsb2NhdGVkIGluIHRoZQorCSAqIGFib3ZlIGxvb3AuCisJICogRklYTUU6IFdoYXQgYWJvdXQgaW5pdGlhbGl6ZWRfc2l6ZSBpbmNyZW1lbnRzPyBIYXZlIHdlIGRvbmUgYWxsIHRoZQorCSAqIHJlcXVpcmVkIHplcm9pbmcgYWJvdmU/IElmIG5vdCB0aGlzIGVycm9yIGhhbmRsaW5nIGlzIGJyb2tlbiwgYW5kCisJICogaW4gcGFydGljdWxhciB0aGUgaWYgKGJsb2NrX2VuZCA8PSBmcm9tKSBjaGVjayBpcyBjb21wbGV0ZWx5IGJvZ3VzLgorCSAqLworCWJoID0gaGVhZDsKKwlibG9ja19zdGFydCA9IDA7CisJaXNfcmV0cnkgPSBGQUxTRTsKKwlkbyB7CisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYmxvY2tzaXplOworCQlpZiAoYmxvY2tfZW5kIDw9IGZyb20pCisJCQljb250aW51ZTsKKwkJaWYgKGJsb2NrX3N0YXJ0ID49IHRvKQorCQkJYnJlYWs7CisJCWlmIChidWZmZXJfbmV3KGJoKSkgeworCQkJdm9pZCAqa2FkZHI7CisKKwkJCWNsZWFyX2J1ZmZlcl9uZXcoYmgpOworCQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCQltZW1zZXQoa2FkZHIgKyBibG9ja19zdGFydCwgMCwgYmgtPmJfc2l6ZSk7CisJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCWlzX3JldHJ5ID0gVFJVRTsKKwkJfQorCX0gd2hpbGUgKGJsb2NrX3N0YXJ0ID0gYmxvY2tfZW5kLCAoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOworCWlmIChpc19yZXRyeSkKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJaWYgKHJsKQorCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIG50ZnNfcHJlcGFyZV93cml0ZSAtIHByZXBhcmUgYSBwYWdlIGZvciByZWNlaXZpbmcgZGF0YQorICoKKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20gZ2VuZXJpY19maWxlX3dyaXRlKCkgd2l0aCBpX3NlbSBoZWxkIG9uIHRoZSBpbm9kZQorICogKEBwYWdlLT5tYXBwaW5nLT5ob3N0KS4gIFRoZSBAcGFnZSBpcyBsb2NrZWQgYnV0IG5vdCBrbWFwKClwZWQuICBUaGUgc291cmNlCisgKiBkYXRhIGhhcyBub3QgeWV0IGJlZW4gY29waWVkIGludG8gdGhlIEBwYWdlLgorICoKKyAqIE5lZWQgdG8gZXh0ZW5kIHRoZSBhdHRyaWJ1dGUvZmlsbCBpbiBob2xlcyBpZiBuZWNlc3NhcnksIGNyZWF0ZSBibG9ja3MgYW5kCisgKiBtYWtlIHBhcnRpYWxseSBvdmVyd3JpdHRlbiBibG9ja3MgdXB0b2RhdGUsCisgKgorICogaV9zaXplIGlzIG5vdCB0byBiZSBtb2RpZmllZCB5ZXQuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBvciAtZXJybm8gb24gZXJyb3IuCisgKgorICogU2hvdWxkIGJlIHVzaW5nIGJsb2NrX3ByZXBhcmVfd3JpdGUoKSBbc3VwcG9ydCBmb3Igc3BhcnNlIGZpbGVzXSBvcgorICogY29udF9wcmVwYXJlX3dyaXRlKCkgW25vIHN1cHBvcnQgZm9yIHNwYXJzZSBmaWxlc10uICBDYW5ub3QgZG8gdGhhdCBkdWUgdG8KKyAqIG50ZnMgc3BlY2lmaWNzIGJ1dCBjYW4gbG9vayBhdCB0aGVtIGZvciBpbXBsZW1lbnRhdGlvbiBndWlkYW5jZS4KKyAqCisgKiBOb3RlOiBJbiB0aGUgcmFuZ2UsIEBmcm9tIGlzIGluY2x1c2l2ZSBhbmQgQHRvIGlzIGV4Y2x1c2l2ZSwgaS5lLiBAZnJvbSBpcworICogdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIHBhZ2UgdGhhdCB3aWxsIGJlIHdyaXR0ZW4gdG8gYW5kIEB0byBpcyB0aGUgZmlyc3QgYnl0ZQorICogYWZ0ZXIgdGhlIGxhc3QgYnl0ZSB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0by4KKyAqLworc3RhdGljIGludCBudGZzX3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQl1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlzNjQgbmV3X3NpemU7CisJc3RydWN0IGlub2RlICp2aSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJbnRmc19pbm9kZSAqYmFzZV9uaSA9IE5VTEwsICpuaSA9IE5URlNfSSh2aSk7CisJbnRmc192b2x1bWUgKnZvbCA9IG5pLT52b2w7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eCA9IE5VTEw7CisJTUZUX1JFQ09SRCAqbSA9IE5VTEw7CisJQVRUUl9SRUNPUkQgKmE7CisJdTggKmthZGRyOworCXUzMiBhdHRyX2xlbjsKKwlpbnQgZXJyOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LCBhdHRyaWJ1dGUgdHlwZSAweCV4LCBwYWdlIGluZGV4ICIKKwkJCSIweCVseCwgZnJvbSA9ICV1LCB0byA9ICV1LiIsIHZpLT5pX2lubywgbmktPnR5cGUsCisJCQlwYWdlLT5pbmRleCwgZnJvbSwgdG8pOworCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJQlVHX09OKGZyb20gPiBQQUdFX0NBQ0hFX1NJWkUpOworCUJVR19PTih0byA+IFBBR0VfQ0FDSEVfU0laRSk7CisJQlVHX09OKGZyb20gPiB0byk7CisJQlVHX09OKE5Jbm9Nc3RQcm90ZWN0ZWQobmkpKTsKKwkvKgorCSAqIElmIGEgcHJldmlvdXMgbnRmc190cnVuY2F0ZSgpIGZhaWxlZCwgcmVwZWF0IGl0IGFuZCBhYm9ydCBpZiBpdAorCSAqIGZhaWxzIGFnYWluLgorCSAqLworCWlmICh1bmxpa2VseShOSW5vVHJ1bmNhdGVGYWlsZWQobmkpKSkgeworCQlkb3duX3dyaXRlKCZ2aS0+aV9hbGxvY19zZW0pOworCQllcnIgPSBudGZzX3RydW5jYXRlKHZpKTsKKwkJdXBfd3JpdGUoJnZpLT5pX2FsbG9jX3NlbSk7CisJCWlmIChlcnIgfHwgTklub1RydW5jYXRlRmFpbGVkKG5pKSkgeworCQkJaWYgKCFlcnIpCisJCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCX0KKwkvKiBJZiB0aGUgYXR0cmlidXRlIGlzIG5vdCByZXNpZGVudCwgZGVhbCB3aXRoIGl0IGVsc2V3aGVyZS4gKi8KKwlpZiAoTklub05vblJlc2lkZW50KG5pKSkgeworCQkvKgorCQkgKiBPbmx5IHVubmFtZWQgJERBVEEgYXR0cmlidXRlcyBjYW4gYmUgY29tcHJlc3NlZCwgZW5jcnlwdGVkLAorCQkgKiBhbmQvb3Igc3BhcnNlLgorCQkgKi8KKwkJaWYgKG5pLT50eXBlID09IEFUX0RBVEEgJiYgIW5pLT5uYW1lX2xlbikgeworCQkJLyogSWYgZmlsZSBpcyBlbmNyeXB0ZWQsIGRlbnkgYWNjZXNzLCBqdXN0IGxpa2UgTlQ0LiAqLworCQkJaWYgKE5Jbm9FbmNyeXB0ZWQobmkpKSB7CisJCQkJbnRmc19kZWJ1ZygiRGVueWluZyB3cml0ZSBhY2Nlc3MgdG8gZW5jcnlwdGVkICIKKwkJCQkJCSJmaWxlLiIpOworCQkJCXJldHVybiAtRUFDQ0VTOworCQkJfQorCQkJLyogQ29tcHJlc3NlZCBkYXRhIHN0cmVhbXMgYXJlIGhhbmRsZWQgaW4gY29tcHJlc3MuYy4gKi8KKwkJCWlmIChOSW5vQ29tcHJlc3NlZChuaSkpIHsKKwkJCQkvLyBUT0RPOiBJbXBsZW1lbnQgYW5kIHJlcGxhY2UgdGhpcyBjaGVjayB3aXRoCisJCQkJLy8gcmV0dXJuIG50ZnNfd3JpdGVfY29tcHJlc3NlZF9ibG9jayhwYWdlKTsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiV3JpdGluZyB0byBjb21wcmVzc2VkICIKKwkJCQkJCSJmaWxlcyBpcyBub3Qgc3VwcG9ydGVkIHlldC4gIgorCQkJCQkJIlNvcnJ5LiIpOworCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCX0KKwkJCS8vIFRPRE86IEltcGxlbWVudCBhbmQgcmVtb3ZlIHRoaXMgY2hlY2suCisJCQlpZiAoTklub1NwYXJzZShuaSkpIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiV3JpdGluZyB0byBzcGFyc2UgZmlsZXMgIgorCQkJCQkJImlzIG5vdCBzdXBwb3J0ZWQgeWV0LiBTb3JyeS4iKTsKKwkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQl9CisJCX0KKwkJLyogTm9ybWFsIGRhdGEgc3RyZWFtLiAqLworCQlyZXR1cm4gbnRmc19wcmVwYXJlX25vbnJlc2lkZW50X3dyaXRlKHBhZ2UsIGZyb20sIHRvKTsKKwl9CisJLyoKKwkgKiBBdHRyaWJ1dGUgaXMgcmVzaWRlbnQsIGltcGx5aW5nIGl0IGlzIG5vdCBjb21wcmVzc2VkLCBlbmNyeXB0ZWQsIG9yCisJICogc3BhcnNlLgorCSAqLworCUJVR19PTihwYWdlX2hhc19idWZmZXJzKHBhZ2UpKTsKKwluZXdfc2l6ZSA9ICgoczY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgdG87CisJLyogSWYgd2UgZG8gbm90IG5lZWQgdG8gcmVzaXplIHRoZSBhdHRyaWJ1dGUgYWxsb2NhdGlvbiB3ZSBhcmUgZG9uZS4gKi8KKwlpZiAobmV3X3NpemUgPD0gdmktPmlfc2l6ZSkKKwkJZ290byBkb25lOworCisJLy8gRklYTUU6IFdlIGFib3J0IGZvciBub3cgYXMgdGhpcyBjb2RlIGlzIG5vdCBzYWZlLgorCW50ZnNfZXJyb3IodmktPmlfc2IsICJDaGFuZ2luZyB0aGUgZmlsZSBzaXplIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiAgIgorCQkJIlNvcnJ5LiIpOworCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIE1hcCwgcGluLCBhbmQgbG9jayB0aGUgKGJhc2UpIG1mdCByZWNvcmQuICovCisJaWYgKCFOSW5vQXR0cihuaSkpCisJCWJhc2VfbmkgPSBuaTsKKwllbHNlCisJCWJhc2VfbmkgPSBuaS0+ZXh0LmJhc2VfbnRmc19pbm87CisJbSA9IG1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCWlmIChJU19FUlIobSkpIHsKKwkJZXJyID0gUFRSX0VSUihtKTsKKwkJbSA9IE5VTEw7CisJCWN0eCA9IE5VTEw7CisJCWdvdG8gZXJyX291dDsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KGJhc2VfbmksIG0pOworCWlmICh1bmxpa2VseSghY3R4KSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWVyciA9IG50ZnNfYXR0cl9sb29rdXAobmktPnR5cGUsIG5pLT5uYW1lLCBuaS0+bmFtZV9sZW4sCisJCQlDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwgMCwgY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlpZiAoZXJyID09IC1FTk9FTlQpCisJCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW0gPSBjdHgtPm1yZWM7CisJYSA9IGN0eC0+YXR0cjsKKwkvKiBUaGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUuICovCisJYXR0cl9sZW4gPSBsZTMyX3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCk7CisJQlVHX09OKHZpLT5pX3NpemUgIT0gYXR0cl9sZW4pOworCS8qIENoZWNrIGlmIG5ldyBzaXplIGlzIGFsbG93ZWQgaW4gJEF0dHJEZWYuICovCisJZXJyID0gbnRmc19hdHRyX3NpemVfYm91bmRzX2NoZWNrKHZvbCwgbmktPnR5cGUsIG5ld19zaXplKTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlpZiAoZXJyID09IC1FUkFOR0UpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIldyaXRlIHdvdWxkIGNhdXNlIHRoZSBpbm9kZSAiCisJCQkJCSIweCVseCB0byBleGNlZWQgdGhlIG1heGltdW0gc2l6ZSBmb3IgIgorCQkJCQkiaXRzIGF0dHJpYnV0ZSB0eXBlICgweCV4KS4gIEFib3J0aW5nICIKKwkJCQkJIndyaXRlLiIsIHZpLT5pX2lubywKKwkJCQkJbGUzMl90b19jcHUobmktPnR5cGUpKTsKKwkJfSBlbHNlIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIklub2RlIDB4JWx4IGhhcyB1bmtub3duICIKKwkJCQkJImF0dHJpYnV0ZSB0eXBlIDB4JXguICBBYm9ydGluZyAiCisJCQkJCSJ3cml0ZS4iLCB2aS0+aV9pbm8sCisJCQkJCWxlMzJfdG9fY3B1KG5pLT50eXBlKSk7CisJCQllcnIgPSAtRUlPOworCQl9CisJCWdvdG8gZXJyX291dDI7CisJfQorCS8qCisJICogRXh0ZW5kIHRoZSBhdHRyaWJ1dGUgcmVjb3JkIHRvIGJlIGFibGUgdG8gc3RvcmUgdGhlIG5ldyBhdHRyaWJ1dGUKKwkgKiBzaXplLgorCSAqLworCWlmIChuZXdfc2l6ZSA+PSB2b2wtPm1mdF9yZWNvcmRfc2l6ZSB8fCBudGZzX2F0dHJfcmVjb3JkX3Jlc2l6ZShtLCBhLAorCQkJbGUxNl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpICsKKwkJCW5ld19zaXplKSkgeworCQkvKiBOb3QgZW5vdWdoIHNwYWNlIGluIHRoZSBtZnQgcmVjb3JkLiAqLworCQludGZzX2Vycm9yKHZvbC0+c2IsICJOb3QgZW5vdWdoIHNwYWNlIGluIHRoZSBtZnQgcmVjb3JkIGZvciAiCisJCQkJInRoZSByZXNpemVkIGF0dHJpYnV0ZSB2YWx1ZS4gIFRoaXMgaXMgbm90ICIKKwkJCQkic3VwcG9ydGVkIHlldC4gIEFib3J0aW5nIHdyaXRlLiIpOworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBlcnJfb3V0MjsKKwl9CisJLyoKKwkgKiBXZSBoYXZlIGVub3VnaCBzcGFjZSBpbiB0aGUgbWZ0IHJlY29yZCB0byBmaXQgdGhlIHdyaXRlLiAgVGhpcworCSAqIGltcGxpZXMgdGhlIGF0dHJpYnV0ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIG1mdCByZWNvcmQgYW5kIGhlbmNlIHRoZQorCSAqIGF0dHJpYnV0ZSBtdXN0IGJlIGluIGEgc2luZ2xlIHBhZ2UgYW5kIGhlbmNlIHBhZ2UtPmluZGV4IG11c3QgYmUgMC4KKwkgKi8KKwlCVUdfT04ocGFnZS0+aW5kZXgpOworCS8qCisJICogSWYgdGhlIGJlZ2lubmluZyBvZiB0aGUgd3JpdGUgaXMgcGFzdCB0aGUgb2xkIHNpemUsIGVubGFyZ2UgdGhlCisJICogYXR0cmlidXRlIHZhbHVlIHVwIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHdyaXRlIGFuZCBmaWxsIGl0IHdpdGgKKwkgKiB6ZXJvZXMuCisJICovCisJaWYgKGZyb20gPiBhdHRyX2xlbikgeworCQltZW1zZXQoKHU4KilhICsgbGUxNl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpICsKKwkJCQlhdHRyX2xlbiwgMCwgZnJvbSAtIGF0dHJfbGVuKTsKKwkJYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGggPSBjcHVfdG9fbGUzMihmcm9tKTsKKwkJLyogWmVybyB0aGUgY29ycmVzcG9uZGluZyBhcmVhIGluIHRoZSBwYWdlIGFzIHdlbGwuICovCisJCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQkJbWVtc2V0KGthZGRyICsgYXR0cl9sZW4sIDAsIGZyb20gLSBhdHRyX2xlbik7CisJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJfQorCX0KKwlmbHVzaF9kY2FjaGVfbWZ0X3JlY29yZF9wYWdlKGN0eC0+bnRmc19pbm8pOworCW1hcmtfbWZ0X3JlY29yZF9kaXJ0eShjdHgtPm50ZnNfaW5vKTsKKwludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwl1bm1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCS8qCisJICogQmVjYXVzZSByZXNpZGVudCBhdHRyaWJ1dGVzIGFyZSBoYW5kbGVkIGJ5IG1lbWNweSgpIHRvL2Zyb20gdGhlCisJICogY29ycmVzcG9uZGluZyBNRlQgcmVjb3JkLCBhbmQgYmVjYXVzZSB0aGlzIGZvcm0gb2YgaS9vIGlzIGJ5dGUKKwkgKiBhbGlnbmVkIHJhdGhlciB0aGFuIGJsb2NrIGFsaWduZWQsIHRoZXJlIGlzIG5vIG5lZWQgdG8gYnJpbmcgdGhlCisJICogcGFnZSB1cHRvZGF0ZSBoZXJlIGFzIGluIHRoZSBub24tcmVzaWRlbnQgY2FzZSB3aGVyZSB3ZSBuZWVkIHRvCisJICogYnJpbmcgdGhlIGJ1ZmZlcnMgc3RyYWRkbGVkIGJ5IHRoZSB3cml0ZSB1cHRvZGF0ZSBiZWZvcmUKKwkgKiBnZW5lcmljX2ZpbGVfd3JpdGUoKSBkb2VzIHRoZSBjb3B5aW5nIGZyb20gdXNlcnNwYWNlLgorCSAqCisJICogV2UgdGh1cyBkZWZlciB0aGUgdXB0b2RhdGUgYnJpbmdpbmcgb2YgdGhlIHBhZ2UgcmVnaW9uIG91dHNpZGUgdGhlCisJICogcmVnaW9uIHdyaXR0ZW4gdG8gdG8gbnRmc19jb21taXRfd3JpdGUoKSwgd2hpY2ggbWFrZXMgdGhlIGNvZGUKKwkgKiBzaW1wbGVyIGFuZCBzYXZlcyBvbmUgYXRvbWljIGttYXAgd2hpY2ggaXMgZ29vZC4KKwkgKi8KK2RvbmU6CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKK2Vycl9vdXQ6CisJaWYgKGVyciA9PSAtRU5PTUVNKQorCQludGZzX3dhcm5pbmcodmktPmlfc2IsICJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeSByZXF1aXJlZCB0byAiCisJCQkJInByZXBhcmUgdGhlIHdyaXRlLiIpOworCWVsc2UgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiUmVzaWRlbnQgYXR0cmlidXRlIHByZXBhcmUgd3JpdGUgZmFpbGVkICIKKwkJCQkid2l0aCBlcnJvciAlaS4iLCBlcnIpOworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCW1ha2VfYmFkX2lub2RlKHZpKTsKKwl9CitlcnJfb3V0MjoKKwlpZiAoY3R4KQorCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwlpZiAobSkKKwkJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIG50ZnNfY29tbWl0X25vbnJlc2lkZW50X3dyaXRlIC0KKyAqCisgKi8KK3N0YXRpYyBpbnQgbnRmc19jb21taXRfbm9ucmVzaWRlbnRfd3JpdGUoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCXVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXM2NCBwb3MgPSAoKHM2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIHRvOworCXN0cnVjdCBpbm9kZSAqdmkgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkOworCXVuc2lnbmVkIGludCBibG9ja19zdGFydCwgYmxvY2tfZW5kLCBibG9ja3NpemU7CisJQk9PTCBwYXJ0aWFsOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LCBhdHRyaWJ1dGUgdHlwZSAweCV4LCBwYWdlIGluZGV4ICIKKwkJCSIweCVseCwgZnJvbSA9ICV1LCB0byA9ICV1LiIsIHZpLT5pX2lubywKKwkJCU5URlNfSSh2aSktPnR5cGUsIHBhZ2UtPmluZGV4LCBmcm9tLCB0byk7CisJYmxvY2tzaXplID0gMSA8PCB2aS0+aV9ibGtiaXRzOworCisJLy8gRklYTUU6IFdlIG5lZWQgYSB3aG9sZSBzbGV3IG9mIHNwZWNpYWwgY2FzZXMgaW4gaGVyZSBmb3IgY29tcHJlc3NlZAorCS8vIGZpbGVzIGZvciBleGFtcGxlLi4uCisJLy8gRm9yIG5vdywgd2Uga25vdyBudGZzX3ByZXBhcmVfd3JpdGUoKSB3b3VsZCBoYXZlIGZhaWxlZCBzbyB3ZSBjYW4ndAorCS8vIGdldCBoZXJlIGluIGFueSBvZiB0aGUgY2FzZXMgd2hpY2ggd2UgaGF2ZSB0byBzcGVjaWFsIGNhc2UsIHNvIHdlCisJLy8gYXJlIGp1c3QgYSByaXBwZWQgb2ZmLCB1bnJvbGxlZCBnZW5lcmljX2NvbW1pdF93cml0ZSgpLgorCisJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWJsb2NrX3N0YXJ0ID0gMDsKKwlwYXJ0aWFsID0gRkFMU0U7CisJZG8geworCQlibG9ja19lbmQgPSBibG9ja19zdGFydCArIGJsb2Nrc2l6ZTsKKwkJaWYgKGJsb2NrX2VuZCA8PSBmcm9tIHx8IGJsb2NrX3N0YXJ0ID49IHRvKSB7CisJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQkJcGFydGlhbCA9IFRSVUU7CisJCX0gZWxzZSB7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJfQorCX0gd2hpbGUgKGJsb2NrX3N0YXJ0ID0gYmxvY2tfZW5kLCAoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOworCS8qCisJICogSWYgdGhpcyBpcyBhIHBhcnRpYWwgd3JpdGUgd2hpY2ggaGFwcGVuZWQgdG8gbWFrZSBhbGwgYnVmZmVycworCSAqIHVwdG9kYXRlIHRoZW4gd2UgY2FuIG9wdGltaXplIGF3YXkgYSBib2d1cyAtPnJlYWRwYWdlKCkgZm9yIHRoZSBuZXh0CisJICogcmVhZCgpLiAgSGVyZSB3ZSAnZGlzY292ZXInIHdoZXRoZXIgdGhlIHBhZ2Ugd2VudCB1cHRvZGF0ZSBhcyBhCisJICogcmVzdWx0IG9mIHRoaXMgKHBvdGVudGlhbGx5IHBhcnRpYWwpIHdyaXRlLgorCSAqLworCWlmICghcGFydGlhbCkKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCS8qCisJICogTm90IGNvbnZpbmNlZCBhYm91dCB0aGlzIGF0IGFsbC4gIFNlZSBkaXNwYXJpdHkgY29tbWVudCBhYm92ZS4gIEZvcgorCSAqIG5vdyB3ZSBrbm93IG50ZnNfcHJlcGFyZV93cml0ZSgpIHdvdWxkIGhhdmUgZmFpbGVkIGluIHRoZSB3cml0ZQorCSAqIGV4Y2VlZHMgaV9zaXplIGNhc2UsIHNvIHRoaXMgd2lsbCBuZXZlciB0cmlnZ2VyIHdoaWNoIGlzIGZpbmUuCisJICovCisJaWYgKHBvcyA+IHZpLT5pX3NpemUpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIldyaXRpbmcgYmV5b25kIHRoZSBleGlzdGluZyBmaWxlIHNpemUgaXMgIgorCQkJCSJub3Qgc3VwcG9ydGVkIHlldC4gIFNvcnJ5LiIpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCS8vIHZpLT5pX3NpemUgPSBwb3M7CisJCS8vIG1hcmtfaW5vZGVfZGlydHkodmkpOworCX0KKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiAwOworfQorCisvKioKKyAqIG50ZnNfY29tbWl0X3dyaXRlIC0gY29tbWl0IHRoZSByZWNlaXZlZCBkYXRhCisgKgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSBnZW5lcmljX2ZpbGVfd3JpdGUoKSB3aXRoIGlfc2VtIGhlbGQgb24gdGhlIGlub2RlCisgKiAoQHBhZ2UtPm1hcHBpbmctPmhvc3QpLiAgVGhlIEBwYWdlIGlzIGxvY2tlZCBidXQgbm90IGttYXAoKXBlZC4gIFRoZSBzb3VyY2UKKyAqIGRhdGEgaGFzIGFscmVhZHkgYmVlbiBjb3BpZWQgaW50byB0aGUgQHBhZ2UuICBudGZzX3ByZXBhcmVfd3JpdGUoKSBoYXMgYmVlbgorICogY2FsbGVkIGJlZm9yZSB0aGUgZGF0YSBjb3BpZWQgYW5kIGl0IHJldHVybmVkIHN1Y2Nlc3Mgc28gd2UgY2FuIHRha2UgdGhlCisgKiByZXN1bHRzIG9mIHZhcmlvdXMgQlVHIGNoZWNrcyBhbmQgc29tZSBlcnJvciBoYW5kbGluZyBmb3IgZ3JhbnRlZC4KKyAqCisgKiBOZWVkIHRvIG1hcmsgbW9kaWZpZWQgYmxvY2tzIGRpcnR5IHNvIHRoZXkgZ2V0IHdyaXR0ZW4gb3V0IGxhdGVyIHdoZW4KKyAqIG50ZnNfd3JpdGVwYWdlKCkgaXMgaW52b2tlZCBieSB0aGUgVk0uCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBvciAtZXJybm8gb24gZXJyb3IuCisgKgorICogU2hvdWxkIGJlIHVzaW5nIGdlbmVyaWNfY29tbWl0X3dyaXRlKCkuICBUaGlzIG1hcmtzIGJ1ZmZlcnMgdXB0b2RhdGUgYW5kCisgKiBkaXJ0eSwgc2V0cyB0aGUgcGFnZSB1cHRvZGF0ZSBpZiBhbGwgYnVmZmVycyBpbiB0aGUgcGFnZSBhcmUgdXB0b2RhdGUsIGFuZAorICogdXBkYXRlcyBpX3NpemUgaWYgdGhlIGVuZCBvZiBpbyBpcyBiZXlvbmQgaV9zaXplLiAgSW4gdGhhdCBjYXNlLCBpdCBhbHNvCisgKiBtYXJrcyB0aGUgaW5vZGUgZGlydHkuCisgKgorICogQ2Fubm90IHVzZSBnZW5lcmljX2NvbW1pdF93cml0ZSgpIGR1ZSB0byBudGZzIHNwZWNpYWxpdGllcyBidXQgY2FuIGxvb2sgYXQKKyAqIGl0IGZvciBpbXBsZW1lbnRhdGlvbiBndWlkYW5jZS4KKyAqCisgKiBJZiB0aGluZ3MgaGF2ZSBnb25lIGFzIG91dGxpbmVkIGluIG50ZnNfcHJlcGFyZV93cml0ZSgpLCB0aGVuIHdlIGRvIG5vdAorICogbmVlZCB0byBkbyBhbnkgcGFnZSBjb250ZW50IG1vZGlmaWNhdGlvbnMgaGVyZSBhdCBhbGwsIGV4Y2VwdCBpbiB0aGUgd3JpdGUKKyAqIHRvIHJlc2lkZW50IGF0dHJpYnV0ZSBjYXNlLCB3aGVyZSB3ZSBuZWVkIHRvIGRvIHRoZSB1cHRvZGF0ZSBicmluZ2luZyBoZXJlCisgKiB3aGljaCB3ZSBjb21iaW5lIHdpdGggdGhlIGNvcHlpbmcgaW50byB0aGUgbWZ0IHJlY29yZCB3aGljaCBtZWFucyB3ZSBzYXZlCisgKiBvbmUgYXRvbWljIGttYXAuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQl1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgaW5vZGUgKnZpID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwludGZzX2lub2RlICpiYXNlX25pLCAqbmkgPSBOVEZTX0kodmkpOworCWNoYXIgKmthZGRyLCAqa2F0dHI7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKwlNRlRfUkVDT1JEICptOworCUFUVFJfUkVDT1JEICphOworCXUzMiBhdHRyX2xlbjsKKwlpbnQgZXJyOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LCBhdHRyaWJ1dGUgdHlwZSAweCV4LCBwYWdlIGluZGV4ICIKKwkJCSIweCVseCwgZnJvbSA9ICV1LCB0byA9ICV1LiIsIHZpLT5pX2lubywgbmktPnR5cGUsCisJCQlwYWdlLT5pbmRleCwgZnJvbSwgdG8pOworCS8qIElmIHRoZSBhdHRyaWJ1dGUgaXMgbm90IHJlc2lkZW50LCBkZWFsIHdpdGggaXQgZWxzZXdoZXJlLiAqLworCWlmIChOSW5vTm9uUmVzaWRlbnQobmkpKSB7CisJCS8qIE9ubHkgdW5uYW1lZCAkREFUQSBhdHRyaWJ1dGVzIGNhbiBiZSBjb21wcmVzc2VkL2VuY3J5cHRlZC4gKi8KKwkJaWYgKG5pLT50eXBlID09IEFUX0RBVEEgJiYgIW5pLT5uYW1lX2xlbikgeworCQkJLyogRW5jcnlwdGVkIGZpbGVzIG5lZWQgc2VwYXJhdGUgaGFuZGxpbmcuICovCisJCQlpZiAoTklub0VuY3J5cHRlZChuaSkpIHsKKwkJCQkvLyBXZSBuZXZlciBnZXQgaGVyZSBhdCBwcmVzZW50IQorCQkJCUJVRygpOworCQkJfQorCQkJLyogQ29tcHJlc3NlZCBkYXRhIHN0cmVhbXMgYXJlIGhhbmRsZWQgaW4gY29tcHJlc3MuYy4gKi8KKwkJCWlmIChOSW5vQ29tcHJlc3NlZChuaSkpIHsKKwkJCQkvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyEKKwkJCQkvLyByZXR1cm4gbnRmc193cml0ZV9jb21wcmVzc2VkX2Jsb2NrKHBhZ2UpOworCQkJCS8vIFdlIG5ldmVyIGdldCBoZXJlIGF0IHByZXNlbnQhCisJCQkJQlVHKCk7CisJCQl9CisJCX0KKwkJLyogTm9ybWFsIGRhdGEgc3RyZWFtLiAqLworCQlyZXR1cm4gbnRmc19jb21taXRfbm9ucmVzaWRlbnRfd3JpdGUocGFnZSwgZnJvbSwgdG8pOworCX0KKwkvKgorCSAqIEF0dHJpYnV0ZSBpcyByZXNpZGVudCwgaW1wbHlpbmcgaXQgaXMgbm90IGNvbXByZXNzZWQsIGVuY3J5cHRlZCwgb3IKKwkgKiBzcGFyc2UuCisJICovCisJaWYgKCFOSW5vQXR0cihuaSkpCisJCWJhc2VfbmkgPSBuaTsKKwllbHNlCisJCWJhc2VfbmkgPSBuaS0+ZXh0LmJhc2VfbnRmc19pbm87CisJLyogTWFwLCBwaW4sIGFuZCBsb2NrIHRoZSBtZnQgcmVjb3JkLiAqLworCW0gPSBtYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwlpZiAoSVNfRVJSKG0pKSB7CisJCWVyciA9IFBUUl9FUlIobSk7CisJCW0gPSBOVUxMOworCQljdHggPSBOVUxMOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChiYXNlX25pLCBtKTsKKwlpZiAodW5saWtlbHkoIWN0eCkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKwllcnIgPSBudGZzX2F0dHJfbG9va3VwKG5pLT50eXBlLCBuaS0+bmFtZSwgbmktPm5hbWVfbGVuLAorCQkJQ0FTRV9TRU5TSVRJVkUsIDAsIE5VTEwsIDAsIGN0eCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJaWYgKGVyciA9PSAtRU5PRU5UKQorCQkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJfb3V0OworCX0KKwlhID0gY3R4LT5hdHRyOworCS8qIFRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4gKi8KKwlhdHRyX2xlbiA9IGxlMzJfdG9fY3B1KGEtPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwlCVUdfT04oZnJvbSA+IGF0dHJfbGVuKTsKKwlrYXR0ciA9ICh1OCopYSArIGxlMTZfdG9fY3B1KGEtPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KTsKKwlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkvKiBDb3B5IHRoZSByZWNlaXZlZCBkYXRhIGZyb20gdGhlIHBhZ2UgdG8gdGhlIG1mdCByZWNvcmQuICovCisJbWVtY3B5KGthdHRyICsgZnJvbSwga2FkZHIgKyBmcm9tLCB0byAtIGZyb20pOworCS8qIFVwZGF0ZSB0aGUgYXR0cmlidXRlIGxlbmd0aCBpZiBuZWNlc3NhcnkuICovCisJaWYgKHRvID4gYXR0cl9sZW4pIHsKKwkJYXR0cl9sZW4gPSB0bzsKKwkJYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGggPSBjcHVfdG9fbGUzMihhdHRyX2xlbik7CisJfQorCS8qCisJICogSWYgdGhlIHBhZ2UgaXMgbm90IHVwdG9kYXRlLCBicmluZyB0aGUgb3V0IG9mIGJvdW5kcyBhcmVhKHMpCisJICogdXB0b2RhdGUgYnkgY29weWluZyBkYXRhIGZyb20gdGhlIG1mdCByZWNvcmQgdG8gdGhlIHBhZ2UuCisJICovCisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJaWYgKGZyb20gPiAwKQorCQkJbWVtY3B5KGthZGRyLCBrYXR0ciwgZnJvbSk7CisJCWlmICh0byA8IGF0dHJfbGVuKQorCQkJbWVtY3B5KGthZGRyICsgdG8sIGthdHRyICsgdG8sIGF0dHJfbGVuIC0gdG8pOworCQkvKiBaZXJvIHRoZSByZWdpb24gb3V0c2lkZSB0aGUgZW5kIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUuICovCisJCWlmIChhdHRyX2xlbiA8IFBBR0VfQ0FDSEVfU0laRSkKKwkJCW1lbXNldChrYWRkciArIGF0dHJfbGVuLCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBhdHRyX2xlbik7CisJCS8qCisJCSAqIFRoZSBwcm9iYWJpbGl0eSBvZiBub3QgaGF2aW5nIGRvbmUgYW55IG9mIHRoZSBhYm92ZSBpcworCQkgKiBleHRyZW1lbHkgc21hbGwsIHNvIHdlIGp1c3QgZmx1c2ggdW5jb25kaXRpb25hbGx5LgorCQkgKi8KKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwl9CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCS8qIFVwZGF0ZSBpX3NpemUgaWYgbmVjZXNzYXJ5LiAqLworCWlmICh2aS0+aV9zaXplIDwgYXR0cl9sZW4pIHsKKwkJbmktPmFsbG9jYXRlZF9zaXplID0gbmktPmluaXRpYWxpemVkX3NpemUgPSBhdHRyX2xlbjsKKwkJaV9zaXplX3dyaXRlKHZpLCBhdHRyX2xlbik7CisJfQorCS8qIE1hcmsgdGhlIG1mdCByZWNvcmQgZGlydHksIHNvIGl0IGdldHMgd3JpdHRlbiBiYWNrLiAqLworCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CisJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOworCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKK2Vycl9vdXQ6CisJaWYgKGVyciA9PSAtRU5PTUVNKSB7CisJCW50ZnNfd2FybmluZyh2aS0+aV9zYiwgIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5IHJlcXVpcmVkIHRvICIKKwkJCQkiY29tbWl0IHRoZSB3cml0ZS4iKTsKKwkJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQkJbnRmc193YXJuaW5nKHZpLT5pX3NiLCAiUGFnZSBpcyB1cHRvZGF0ZSwgc2V0dGluZyAiCisJCQkJCSJkaXJ0eSBzbyB0aGUgd3JpdGUgd2lsbCBiZSByZXRyaWVkICIKKwkJCQkJImxhdGVyIG9uIGJ5IHRoZSBWTS4iKTsKKwkJCS8qCisJCQkgKiBQdXQgdGhlIHBhZ2Ugb24gbWFwcGluZy0+ZGlydHlfcGFnZXMsIGJ1dCBsZWF2ZSBpdHMKKwkJCSAqIGJ1ZmZlcnMnIGRpcnR5IHN0YXRlIGFzLWlzLgorCQkJICovCisJCQlfX3NldF9wYWdlX2RpcnR5X25vYnVmZmVycyhwYWdlKTsKKwkJCWVyciA9IDA7CisJCX0gZWxzZQorCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIlBhZ2UgaXMgbm90IHVwdG9kYXRlLiAgV3JpdHRlbiAiCisJCQkJCSJkYXRhIGhhcyBiZWVuIGxvc3QuIik7CisJfSBlbHNlIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIlJlc2lkZW50IGF0dHJpYnV0ZSBjb21taXQgd3JpdGUgZmFpbGVkICIKKwkJCQkid2l0aCBlcnJvciAlaS4iLCBlcnIpOworCQlOVm9sU2V0RXJyb3JzKG5pLT52b2wpOworCQltYWtlX2JhZF9pbm9kZSh2aSk7CisJfQorCWlmIChjdHgpCisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCWlmIChtKQorCQl1bm1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCXJldHVybiBlcnI7Cit9CisKKyNlbmRpZgkvKiBOVEZTX1JXICovCisKKy8qKgorICogbnRmc19hb3BzIC0gZ2VuZXJhbCBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgZm9yIGlub2RlcyBhbmQgYXR0cmlidXRlcworICovCitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIG50ZnNfYW9wcyA9IHsKKwkucmVhZHBhZ2UJPSBudGZzX3JlYWRwYWdlLAkvKiBGaWxsIHBhZ2Ugd2l0aCBkYXRhLiAqLworCS5zeW5jX3BhZ2UJPSBibG9ja19zeW5jX3BhZ2UsCS8qIEN1cnJlbnRseSwganVzdCB1bnBsdWdzIHRoZQorCQkJCQkJICAgZGlzayByZXF1ZXN0IHF1ZXVlLiAqLworI2lmZGVmIE5URlNfUlcKKwkud3JpdGVwYWdlCT0gbnRmc193cml0ZXBhZ2UsCS8qIFdyaXRlIGRpcnR5IHBhZ2UgdG8gZGlzay4gKi8KKwkucHJlcGFyZV93cml0ZQk9IG50ZnNfcHJlcGFyZV93cml0ZSwJLyogUHJlcGFyZSBwYWdlIGFuZCBidWZmZXJzCisJCQkJCQkgICByZWFkeSB0byByZWNlaXZlIGRhdGEuICovCisJLmNvbW1pdF93cml0ZQk9IG50ZnNfY29tbWl0X3dyaXRlLAkvKiBDb21taXQgcmVjZWl2ZWQgZGF0YS4gKi8KKyNlbmRpZiAvKiBOVEZTX1JXICovCit9OworCisvKioKKyAqIG50ZnNfbXN0X2FvcHMgLSBnZW5lcmFsIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyBmb3IgbXN0IHByb3RlY3RlZWQgaW5vZGVzCisgKgkJICAgYW5kIGF0dHJpYnV0ZXMKKyAqLworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBudGZzX21zdF9hb3BzID0geworCS5yZWFkcGFnZQk9IG50ZnNfcmVhZHBhZ2UsCS8qIEZpbGwgcGFnZSB3aXRoIGRhdGEuICovCisJLnN5bmNfcGFnZQk9IGJsb2NrX3N5bmNfcGFnZSwJLyogQ3VycmVudGx5LCBqdXN0IHVucGx1Z3MgdGhlCisJCQkJCQkgICBkaXNrIHJlcXVlc3QgcXVldWUuICovCisjaWZkZWYgTlRGU19SVworCS53cml0ZXBhZ2UJPSBudGZzX3dyaXRlcGFnZSwJLyogV3JpdGUgZGlydHkgcGFnZSB0byBkaXNrLiAqLworCS5zZXRfcGFnZV9kaXJ0eQk9IF9fc2V0X3BhZ2VfZGlydHlfbm9idWZmZXJzLAkvKiBTZXQgdGhlIHBhZ2UgZGlydHkKKwkJCQkJCSAgIHdpdGhvdXQgdG91Y2hpbmcgdGhlIGJ1ZmZlcnMKKwkJCQkJCSAgIGJlbG9uZ2luZyB0byB0aGUgcGFnZS4gKi8KKyNlbmRpZiAvKiBOVEZTX1JXICovCit9OworCisjaWZkZWYgTlRGU19SVworCisvKioKKyAqIG1hcmtfbnRmc19yZWNvcmRfZGlydHkgLSBtYXJrIGFuIG50ZnMgcmVjb3JkIGRpcnR5CisgKiBAcGFnZToJcGFnZSBjb250YWluaW5nIHRoZSBudGZzIHJlY29yZCB0byBtYXJrIGRpcnR5CisgKiBAb2ZzOglieXRlIG9mZnNldCB3aXRoaW4gQHBhZ2UgYXQgd2hpY2ggdGhlIG50ZnMgcmVjb3JkIGJlZ2lucworICoKKyAqIFNldCB0aGUgYnVmZmVycyBhbmQgdGhlIHBhZ2UgaW4gd2hpY2ggdGhlIG50ZnMgcmVjb3JkIGlzIGxvY2F0ZWQgZGlydHkuCisgKgorICogVGhlIGxhdHRlciBhbHNvIG1hcmtzIHRoZSB2ZnMgaW5vZGUgdGhlIG50ZnMgcmVjb3JkIGJlbG9uZ3MgdG8gZGlydHkKKyAqIChJX0RJUlRZX1BBR0VTIG9ubHkpLgorICoKKyAqIElmIHRoZSBwYWdlIGRvZXMgbm90IGhhdmUgYnVmZmVycywgd2UgY3JlYXRlIHRoZW0gYW5kIHNldCB0aGVtIHVwdG9kYXRlLgorICogVGhlIHBhZ2UgbWF5IG5vdCBiZSBsb2NrZWQgd2hpY2ggaXMgd2h5IHdlIG5lZWQgdG8gaGFuZGxlIHRoZSBidWZmZXJzIHVuZGVyCisgKiB0aGUgbWFwcGluZy0+cHJpdmF0ZV9sb2NrLiAgT25jZSB0aGUgYnVmZmVycyBhcmUgbWFya2VkIGRpcnR5IHdlIG5vIGxvbmdlcgorICogbmVlZCB0aGUgbG9jayBzaW5jZSB0cnlfdG9fZnJlZV9idWZmZXJzKCkgZG9lcyBub3QgZnJlZSBkaXJ0eSBidWZmZXJzLgorICovCit2b2lkIG1hcmtfbnRmc19yZWNvcmRfZGlydHkoc3RydWN0IHBhZ2UgKnBhZ2UsIGNvbnN0IHVuc2lnbmVkIGludCBvZnMpIHsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2UtPm1hcHBpbmc7CisJbnRmc19pbm9kZSAqbmkgPSBOVEZTX0kobWFwcGluZy0+aG9zdCk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQsICpidWZmZXJzX3RvX2ZyZWUgPSBOVUxMOworCXVuc2lnbmVkIGludCBlbmQsIGJoX3NpemUsIGJoX29mczsKKworCUJVR19PTighUGFnZVVwdG9kYXRlKHBhZ2UpKTsKKwllbmQgPSBvZnMgKyBuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZTsKKwliaF9zaXplID0gMSA8PCBWRlNfSShuaSktPmlfYmxrYml0czsKKwlzcGluX2xvY2soJm1hcHBpbmctPnByaXZhdGVfbG9jayk7CisJaWYgKHVubGlrZWx5KCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSkgeworCQlzcGluX3VubG9jaygmbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKKwkJYmggPSBoZWFkID0gYWxsb2NfcGFnZV9idWZmZXJzKHBhZ2UsIGJoX3NpemUsIDEpOworCQlzcGluX2xvY2soJm1hcHBpbmctPnByaXZhdGVfbG9jayk7CisJCWlmIChsaWtlbHkoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpKSB7CisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRhaWw7CisKKwkJCWRvIHsKKwkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCQl0YWlsID0gYmg7CisJCQkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJCQl9IHdoaWxlIChiaCk7CisJCQl0YWlsLT5iX3RoaXNfcGFnZSA9IGhlYWQ7CisJCQlhdHRhY2hfcGFnZV9idWZmZXJzKHBhZ2UsIGhlYWQpOworCQl9IGVsc2UKKwkJCWJ1ZmZlcnNfdG9fZnJlZSA9IGJoOworCX0KKwliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJZG8geworCQliaF9vZnMgPSBiaF9vZmZzZXQoYmgpOworCQlpZiAoYmhfb2ZzICsgYmhfc2l6ZSA8PSBvZnMpCisJCQljb250aW51ZTsKKwkJaWYgKHVubGlrZWx5KGJoX29mcyA+PSBlbmQpKQorCQkJYnJlYWs7CisJCXNldF9idWZmZXJfZGlydHkoYmgpOworCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisJc3Bpbl91bmxvY2soJm1hcHBpbmctPnByaXZhdGVfbG9jayk7CisJX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMocGFnZSk7CisJaWYgKHVubGlrZWx5KGJ1ZmZlcnNfdG9fZnJlZSkpIHsKKwkJZG8geworCQkJYmggPSBidWZmZXJzX3RvX2ZyZWUtPmJfdGhpc19wYWdlOworCQkJZnJlZV9idWZmZXJfaGVhZChidWZmZXJzX3RvX2ZyZWUpOworCQkJYnVmZmVyc190b19mcmVlID0gYmg7CisJCX0gd2hpbGUgKGJ1ZmZlcnNfdG9fZnJlZSk7CisJfQorfQorCisjZW5kaWYgLyogTlRGU19SVyAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9hb3BzLmggYi9mcy9udGZzL2FvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjc0ZTY2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9hb3BzLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qKgorICogYW9wcy5oIC0gRGVmaW5lcyBmb3IgTlRGUyBrZXJuZWwgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIGFuZCBwYWdlIGNhY2hlCisgKgkgICAgaGFuZGxpbmcuICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUmljaGFyZCBSdXNzb24KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9MSU5VWF9OVEZTX0FPUFNfSAorI2RlZmluZSBfTElOVVhfTlRGU19BT1BTX0gKKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjaW5jbHVkZSAiaW5vZGUuaCIKKworLyoqCisgKiBudGZzX3VubWFwX3BhZ2UgLSByZWxlYXNlIGEgcGFnZSB0aGF0IHdhcyBtYXBwZWQgdXNpbmcgbnRmc19tYXBfcGFnZSgpCisgKiBAcGFnZToJdGhlIHBhZ2UgdG8gcmVsZWFzZQorICoKKyAqIFVucGluLCB1bm1hcCBhbmQgcmVsZWFzZSBhIHBhZ2UgdGhhdCB3YXMgb2J0YWluZWQgZnJvbSBudGZzX21hcF9wYWdlKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBudGZzX3VubWFwX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJa3VubWFwKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKK30KKworLyoqCisgKiBudGZzX21hcF9wYWdlIC0gbWFwIGEgcGFnZSBpbnRvIGFjY2Vzc2libGUgbWVtb3J5LCByZWFkaW5nIGl0IGlmIG5lY2Vzc2FyeQorICogQG1hcHBpbmc6CWFkZHJlc3Mgc3BhY2UgZm9yIHdoaWNoIHRvIG9idGFpbiB0aGUgcGFnZQorICogQGluZGV4OglpbmRleCBpbnRvIHRoZSBwYWdlIGNhY2hlIGZvciBAbWFwcGluZyBvZiB0aGUgcGFnZSB0byBtYXAKKyAqCisgKiBSZWFkIGEgcGFnZSBmcm9tIHRoZSBwYWdlIGNhY2hlIG9mIHRoZSBhZGRyZXNzIHNwYWNlIEBtYXBwaW5nIGF0IHBvc2l0aW9uCisgKiBAaW5kZXgsIHdoZXJlIEBpbmRleCBpcyBpbiB1bml0cyBvZiBQQUdFX0NBQ0hFX1NJWkUsIGFuZCBub3QgaW4gYnl0ZXMuCisgKgorICogSWYgdGhlIHBhZ2UgaXMgbm90IGluIG1lbW9yeSBpdCBpcyBsb2FkZWQgZnJvbSBkaXNrIGZpcnN0IHVzaW5nIHRoZSByZWFkcGFnZQorICogbWV0aG9kIGRlZmluZWQgaW4gdGhlIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyBvZiBAbWFwcGluZyBhbmQgdGhlIHBhZ2UgaXMKKyAqIGFkZGVkIHRvIHRoZSBwYWdlIGNhY2hlIG9mIEBtYXBwaW5nIGluIHRoZSBwcm9jZXNzLgorICoKKyAqIElmIHRoZSBwYWdlIGJlbG9uZ3MgdG8gYW4gbXN0IHByb3RlY3RlZCBhdHRyaWJ1dGUgYW5kIGl0IGlzIG1hcmtlZCBhcyBzdWNoCisgKiBpbiBpdHMgbnRmcyBpbm9kZSAoTklub01zdFByb3RlY3RlZCgpKSB0aGUgbXN0IGZpeHVwcyBhcmUgYXBwbGllZCBidXQgbm8KKyAqIGVycm9yIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4gIFRoaXMgbWVhbnMgdGhlIGNhbGxlciBoYXMgdG8gdmVyaWZ5IHdoZXRoZXIKKyAqIHRoZSBudGZzIHJlY29yZChzKSBjb250YWluZWQgaW4gdGhlIHBhZ2UgYXJlIHZhbGlkIG9yIG5vdCB1c2luZyBvbmUgb2YgdGhlCisgKiBudGZzX2lzX1hYWFhfcmVjb3JkeyxwfSgpIG1hY3Jvcywgd2hlcmUgWFhYWCBpcyB0aGUgcmVjb3JkIHR5cGUgeW91IGFyZQorICogZXhwZWN0aW5nIHRvIHNlZS4gIChGb3IgZGV0YWlscyBvZiB0aGUgbWFjcm9zLCBzZWUgZnMvbnRmcy9sYXlvdXQuaC4pCisgKgorICogSWYgdGhlIHBhZ2UgaXMgaW4gaGlnaCBtZW1vcnkgaXQgaXMgbWFwcGVkIGludG8gbWVtb3J5IGRpcmVjdGx5IGFkZHJlc3NpYmxlCisgKiBieSB0aGUga2VybmVsLgorICoKKyAqIEZpbmFsbHkgdGhlIHBhZ2UgY291bnQgaXMgaW5jcmVtZW50ZWQsIHRodXMgcGlubmluZyB0aGUgcGFnZSBpbnRvIHBsYWNlLgorICoKKyAqIFRoZSBhYm92ZSBtZWFucyB0aGF0IHBhZ2VfYWRkcmVzcyhwYWdlKSBjYW4gYmUgdXNlZCBvbiBhbGwgcGFnZXMgb2J0YWluZWQKKyAqIHdpdGggbnRmc19tYXBfcGFnZSgpIHRvIGdldCB0aGUga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgcGFnZS4KKyAqCisgKiBXaGVuIGZpbmlzaGVkIHdpdGggdGhlIHBhZ2UsIHRoZSBjYWxsZXIgaGFzIHRvIGNhbGwgbnRmc191bm1hcF9wYWdlKCkgdG8KKyAqIHVucGluLCB1bm1hcCBhbmQgcmVsZWFzZSB0aGUgcGFnZS4KKyAqCisgKiBOb3RlIHRoaXMgZG9lcyBub3QgZ3JhbnQgZXhjbHVzaXZlIGFjY2Vzcy4gSWYgc3VjaCBpcyBkZXNpcmVkLCB0aGUgY2FsbGVyCisgKiBtdXN0IHByb3ZpZGUgaXQgaW5kZXBlbmRlbnRseSBvZiB0aGUgbnRmc197dW59bWFwX3BhZ2UoKSBjYWxscyBieSB1c2luZworICogYSB7cndffXNlbWFwaG9yZSBvciBvdGhlciBtZWFucyBvZiBzZXJpYWxpemF0aW9uLiBBIHNwaW4gbG9jayBjYW5ub3QgYmUKKyAqIHVzZWQgYXMgbnRmc19tYXBfcGFnZSgpIGNhbiBibG9jay4KKyAqCisgKiBUaGUgdW5sb2NrZWQgYW5kIHVwdG9kYXRlIHBhZ2UgaXMgcmV0dXJuZWQgb24gc3VjY2VzcyBvciBhbiBlbmNvZGVkIGVycm9yCisgKiBvbiBmYWlsdXJlLiBDYWxsZXIgaGFzIHRvIHRlc3QgZm9yIGVycm9yIHVzaW5nIHRoZSBJU19FUlIoKSBtYWNybyBvbiB0aGUKKyAqIHJldHVybiB2YWx1ZS4gSWYgdGhhdCBldmFsdWF0ZXMgdG8gVFJVRSwgdGhlIG5lZ2F0aXZlIGVycm9yIGNvZGUgY2FuIGJlCisgKiBvYnRhaW5lZCB1c2luZyBQVFJfRVJSKCkgb24gdGhlIHJldHVybiB2YWx1ZSBvZiBudGZzX21hcF9wYWdlKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKm50ZnNfbWFwX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCXVuc2lnbmVkIGxvbmcgaW5kZXgpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgaW5kZXgsCisJCQkoZmlsbGVyX3QqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisKKwlpZiAoIUlTX0VSUihwYWdlKSkgeworCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCQlrbWFwKHBhZ2UpOworCQlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpICYmICFQYWdlRXJyb3IocGFnZSkpCisJCQlyZXR1cm4gcGFnZTsKKwkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwl9CisJcmV0dXJuIHBhZ2U7Cit9CisKKyNpZmRlZiBOVEZTX1JXCisKK2V4dGVybiB2b2lkIG1hcmtfbnRmc19yZWNvcmRfZGlydHkoc3RydWN0IHBhZ2UgKnBhZ2UsIGNvbnN0IHVuc2lnbmVkIGludCBvZnMpOworCisjZW5kaWYgLyogTlRGU19SVyAqLworCisjZW5kaWYgLyogX0xJTlVYX05URlNfQU9QU19IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2F0dHJpYi5jIGIvZnMvbnRmcy9hdHRyaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmY3ZjkwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9hdHRyaWIuYwpAQCAtMCwwICsxLDEyNTggQEAKKy8qKgorICogYXR0cmliLmMgLSBOVEZTIGF0dHJpYnV0ZSBvcGVyYXRpb25zLiAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKyNpbmNsdWRlICJhdHRyaWIuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImxheW91dC5oIgorI2luY2x1ZGUgIm1mdC5oIgorI2luY2x1ZGUgIm50ZnMuaCIKKyNpbmNsdWRlICJ0eXBlcy5oIgorCisvKioKKyAqIG50ZnNfbWFwX3J1bmxpc3QgLSBtYXAgKGEgcGFydCBvZikgYSBydW5saXN0IG9mIGFuIG50ZnMgaW5vZGUKKyAqIEBuaToJCW50ZnMgaW5vZGUgZm9yIHdoaWNoIHRvIG1hcCAocGFydCBvZikgYSBydW5saXN0CisgKiBAdmNuOgltYXAgcnVubGlzdCBwYXJ0IGNvbnRhaW5pbmcgdGhpcyB2Y24KKyAqCisgKiBNYXAgdGhlIHBhcnQgb2YgYSBydW5saXN0IGNvbnRhaW5pbmcgdGhlIEB2Y24gb2YgdGhlIG50ZnMgaW5vZGUgQG5pLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBMb2NraW5nOiAtIFRoZSBydW5saXN0IG11c3QgYmUgdW5sb2NrZWQgb24gZW50cnkgYW5kIGlzIHVubG9ja2VkIG9uIHJldHVybi4KKyAqCSAgICAtIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIGxvY2sgZm9yIHdyaXRpbmcgYW5kIG1vZGlmaWVzIHRoZSBydW5saXN0LgorICovCitpbnQgbnRmc19tYXBfcnVubGlzdChudGZzX2lub2RlICpuaSwgVkNOIHZjbikKK3sKKwludGZzX2lub2RlICpiYXNlX25pOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJTUZUX1JFQ09SRCAqbXJlYzsKKwlpbnQgZXJyID0gMDsKKworCW50ZnNfZGVidWcoIk1hcHBpbmcgcnVubGlzdCBwYXJ0IGNvbnRhaW5pbmcgdmNuIDB4JWxseC4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24pOworCisJaWYgKCFOSW5vQXR0cihuaSkpCisJCWJhc2VfbmkgPSBuaTsKKwllbHNlCisJCWJhc2VfbmkgPSBuaS0+ZXh0LmJhc2VfbnRmc19pbm87CisKKwltcmVjID0gbWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJaWYgKElTX0VSUihtcmVjKSkKKwkJcmV0dXJuIFBUUl9FUlIobXJlYyk7CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KGJhc2VfbmksIG1yZWMpOworCWlmICh1bmxpa2VseSghY3R4KSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWVyciA9IG50ZnNfYXR0cl9sb29rdXAobmktPnR5cGUsIG5pLT5uYW1lLCBuaS0+bmFtZV9sZW4sCisJCQlDQVNFX1NFTlNJVElWRSwgdmNuLCBOVUxMLCAwLCBjdHgpOworCWlmICh1bmxpa2VseShlcnIpKQorCQlnb3RvIHB1dF9lcnJfb3V0OworCisJZG93bl93cml0ZSgmbmktPnJ1bmxpc3QubG9jayk7CisJLyogTWFrZSBzdXJlIHNvbWVvbmUgZWxzZSBkaWRuJ3QgZG8gdGhlIHdvcmsgd2hpbGUgd2Ugd2VyZSBzbGVlcGluZy4gKi8KKwlpZiAobGlrZWx5KG50ZnNfcmxfdmNuX3RvX2xjbihuaS0+cnVubGlzdC5ybCwgdmNuKSA8PQorCQkJTENOX1JMX05PVF9NQVBQRUQpKSB7CisJCXJ1bmxpc3RfZWxlbWVudCAqcmw7CisKKwkJcmwgPSBudGZzX21hcHBpbmdfcGFpcnNfZGVjb21wcmVzcyhuaS0+dm9sLCBjdHgtPmF0dHIsCisJCQkJbmktPnJ1bmxpc3QucmwpOworCQlpZiAoSVNfRVJSKHJsKSkKKwkJCWVyciA9IFBUUl9FUlIocmwpOworCQllbHNlCisJCQluaS0+cnVubGlzdC5ybCA9IHJsOworCX0KKwl1cF93cml0ZSgmbmktPnJ1bmxpc3QubG9jayk7CisKK3B1dF9lcnJfb3V0OgorCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworZXJyX291dDoKKwl1bm1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogbnRmc19maW5kX3ZjbiAtIGZpbmQgYSB2Y24gaW4gdGhlIHJ1bmxpc3QgZGVzY3JpYmVkIGJ5IGFuIG50ZnMgaW5vZGUKKyAqIEBuaToJCW50ZnMgaW5vZGUgZGVzY3JpYmluZyB0aGUgcnVubGlzdCB0byBzZWFyY2gKKyAqIEB2Y246CXZjbiB0byBmaW5kCisgKiBAbmVlZF93cml0ZToJaWYgZmFsc2UsIGxvY2sgZm9yIHJlYWRpbmcgYW5kIGlmIHRydWUsIGxvY2sgZm9yIHdyaXRpbmcKKyAqCisgKiBGaW5kIHRoZSB2aXJ0dWFsIGNsdXN0ZXIgbnVtYmVyIEB2Y24gaW4gdGhlIHJ1bmxpc3QgZGVzY3JpYmVkIGJ5IHRoZSBudGZzCisgKiBpbm9kZSBAbmkgYW5kIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgcnVubGlzdCBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIEB2Y24uCisgKiBUaGUgcnVubGlzdCBpcyBsZWZ0IGxvY2tlZCBhbmQgdGhlIGNhbGxlciBoYXMgdG8gdW5sb2NrIGl0LiAgSWYgQG5lZWRfd3JpdGUKKyAqIGlzIHRydWUsIHRoZSBydW5saXN0IGlzIGxvY2tlZCBmb3Igd3JpdGluZyBhbmQgaWYgQG5lZWRfd3JpdGUgaXMgZmFsc2UsIHRoZQorICogcnVubGlzdCBpcyBsb2NrZWQgZm9yIHJlYWRpbmcuICBJbiB0aGUgZXJyb3IgY2FzZSwgdGhlIHJ1bmxpc3QgaXMgbm90IGxlZnQKKyAqIGxvY2tlZC4KKyAqCisgKiBOb3RlIHlvdSBuZWVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIGxjbiBvZiB0aGUgcmV0dXJuZWQgcnVubGlzdCBlbGVtZW50CisgKiBiZWluZyA+PSAwIGFuZCBMQ05fSE9MRS4gIEluIHRoZSBsYXRlciBjYXNlIHlvdSBoYXZlIHRvIHJldHVybiB6ZXJvZXMgb24KKyAqIHJlYWQgYW5kIGFsbG9jYXRlIGNsdXN0ZXJzIG9uIHdyaXRlLgorICoKKyAqIFJldHVybiB0aGUgcnVubGlzdCBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIEB2Y24gb24gc3VjY2VzcyBhbmQKKyAqIEVSUl9QVFIoLWVycm5vKSBvbiBlcnJvci4gIFlvdSBuZWVkIHRvIHRlc3QgdGhlIHJldHVybiB2YWx1ZSB3aXRoIElTX0VSUigpCisgKiB0byBkZWNpZGUgaWYgdGhlIHJldHVybiBpcyBzdWNjZXNzIG9yIGZhaWx1cmUgYW5kIFBUUl9FUlIoKSB0byBnZXQgdG8gdGhlCisgKiBlcnJvciBjb2RlIGlmIElTX0VSUigpIGlzIHRydWUuCisgKgorICogVGhlIHBvc3NpYmxlIGVycm9yIHJldHVybiBjb2RlcyBhcmU6CisgKgktRU5PRU5UIC0gTm8gc3VjaCB2Y24gaW4gdGhlIHJ1bmxpc3QsIGkuZS4gQHZjbiBpcyBvdXQgb2YgYm91bmRzLgorICoJLUVOT01FTSAtIE5vdCBlbm91Z2ggbWVtb3J5IHRvIG1hcCBydW5saXN0LgorICoJLUVJTwktIENyaXRpY2FsIGVycm9yIChydW5saXN0L2ZpbGUgaXMgY29ycnVwdCwgaS9vIGVycm9yLCBldGMpLgorICoKKyAqIExvY2tpbmc6IC0gVGhlIHJ1bmxpc3QgbXVzdCBiZSB1bmxvY2tlZCBvbiBlbnRyeS4KKyAqCSAgICAtIE9uIGZhaWxpbmcgcmV0dXJuLCB0aGUgcnVubGlzdCBpcyB1bmxvY2tlZC4KKyAqCSAgICAtIE9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCB0aGUgcnVubGlzdCBpcyBsb2NrZWQuICBJZiBAbmVlZF93cml0ZSB1cworICoJICAgICAgdHJ1ZSwgaXQgaXMgbG9ja2VkIGZvciB3cml0aW5nLiAgT3RoZXJ3aXNlIGlzIGlzIGxvY2tlZCBmb3IKKyAqCSAgICAgIHJlYWRpbmcuCisgKi8KK3J1bmxpc3RfZWxlbWVudCAqbnRmc19maW5kX3ZjbihudGZzX2lub2RlICpuaSwgY29uc3QgVkNOIHZjbiwKKwkJY29uc3QgQk9PTCBuZWVkX3dyaXRlKQoreworCXJ1bmxpc3RfZWxlbWVudCAqcmw7CisJaW50IGVyciA9IDA7CisJQk9PTCBpc19yZXRyeSA9IEZBTFNFOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlfaW5vIDB4JWx4LCB2Y24gMHglbGx4LCBsb2NrIGZvciAlc2luZy4iLAorCQkJbmktPm1mdF9ubywgKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sCisJCQkhbmVlZF93cml0ZSA/ICJyZWFkIiA6ICJ3cml0Iik7CisJQlVHX09OKCFuaSk7CisJQlVHX09OKCFOSW5vTm9uUmVzaWRlbnQobmkpKTsKKwlCVUdfT04odmNuIDwgMCk7Citsb2NrX3JldHJ5X3JlbWFwOgorCWlmICghbmVlZF93cml0ZSkKKwkJZG93bl9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwllbHNlCisJCWRvd25fd3JpdGUoJm5pLT5ydW5saXN0LmxvY2spOworCXJsID0gbmktPnJ1bmxpc3Qucmw7CisJaWYgKGxpa2VseShybCAmJiB2Y24gPj0gcmxbMF0udmNuKSkgeworCQl3aGlsZSAobGlrZWx5KHJsLT5sZW5ndGgpKSB7CisJCQlpZiAobGlrZWx5KHZjbiA8IHJsWzFdLnZjbikpIHsKKwkJCQlpZiAobGlrZWx5KHJsLT5sY24gPj0gTENOX0hPTEUpKSB7CisJCQkJCW50ZnNfZGVidWcoIkRvbmUuIik7CisJCQkJCXJldHVybiBybDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlybCsrOworCQl9CisJCWlmIChsaWtlbHkocmwtPmxjbiAhPSBMQ05fUkxfTk9UX01BUFBFRCkpIHsKKwkJCWlmIChsaWtlbHkocmwtPmxjbiA9PSBMQ05fRU5PRU5UKSkKKwkJCQllcnIgPSAtRU5PRU5UOworCQkJZWxzZQorCQkJCWVyciA9IC1FSU87CisJCX0KKwl9CisJaWYgKCFuZWVkX3dyaXRlKQorCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwllbHNlCisJCXVwX3dyaXRlKCZuaS0+cnVubGlzdC5sb2NrKTsKKwlpZiAoIWVyciAmJiAhaXNfcmV0cnkpIHsKKwkJLyoKKwkJICogVGhlIEB2Y24gaXMgaW4gYW4gdW5tYXBwZWQgcmVnaW9uLCBtYXAgdGhlIHJ1bmxpc3QgYW5kCisJCSAqIHJldHJ5LgorCQkgKi8KKwkJZXJyID0gbnRmc19tYXBfcnVubGlzdChuaSwgdmNuKTsKKwkJaWYgKGxpa2VseSghZXJyKSkgeworCQkJaXNfcmV0cnkgPSBUUlVFOworCQkJZ290byBsb2NrX3JldHJ5X3JlbWFwOworCQl9CisJCS8qCisJCSAqIC1FSU5WQUwgYW5kIC1FTk9FTlQgY29taW5nIGZyb20gYSBmYWlsZWQgbWFwcGluZyBhdHRlbXB0IGFyZQorCQkgKiBlcXVpdmFsZW50IHRvIGkvbyBlcnJvcnMgZm9yIHVzIGFzIHRoZXkgc2hvdWxkIG5vdCBoYXBwZW4gaW4KKwkJICogb3VyIGNvZGUgcGF0aHMuCisJCSAqLworCQlpZiAoZXJyID09IC1FSU5WQUwgfHwgZXJyID09IC1FTk9FTlQpCisJCQllcnIgPSAtRUlPOworCX0gZWxzZSBpZiAoIWVycikKKwkJZXJyID0gLUVJTzsKKwludGZzX2Vycm9yKG5pLT52b2wtPnNiLCAiRmFpbGVkIHdpdGggZXJyb3IgY29kZSAlaS4iLCBlcnIpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qKgorICogbnRmc19hdHRyX2ZpbmQgLSBmaW5kIChuZXh0KSBhdHRyaWJ1dGUgaW4gbWZ0IHJlY29yZAorICogQHR5cGU6CWF0dHJpYnV0ZSB0eXBlIHRvIGZpbmQKKyAqIEBuYW1lOglhdHRyaWJ1dGUgbmFtZSB0byBmaW5kIChvcHRpb25hbCwgaS5lLiBOVUxMIG1lYW5zIGRvbid0IGNhcmUpCisgKiBAbmFtZV9sZW46CWF0dHJpYnV0ZSBuYW1lIGxlbmd0aCAob25seSBuZWVkZWQgaWYgQG5hbWUgcHJlc2VudCkKKyAqIEBpYzoJCUlHTk9SRV9DQVNFIG9yIENBU0VfU0VOU0lUSVZFIChpZ25vcmVkIGlmIEBuYW1lIG5vdCBwcmVzZW50KQorICogQHZhbDoJYXR0cmlidXRlIHZhbHVlIHRvIGZpbmQgKG9wdGlvbmFsLCByZXNpZGVudCBhdHRyaWJ1dGVzIG9ubHkpCisgKiBAdmFsX2xlbjoJYXR0cmlidXRlIHZhbHVlIGxlbmd0aAorICogQGN0eDoJc2VhcmNoIGNvbnRleHQgd2l0aCBtZnQgcmVjb3JkIGFuZCBhdHRyaWJ1dGUgdG8gc2VhcmNoIGZyb20KKyAqCisgKiBZb3Ugc2hvdWxkIG5vdCBuZWVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBkaXJlY3RseS4gIFVzZSBudGZzX2F0dHJfbG9va3VwKCkKKyAqIGluc3RlYWQuCisgKgorICogbnRmc19hdHRyX2ZpbmQoKSB0YWtlcyBhIHNlYXJjaCBjb250ZXh0IEBjdHggYXMgcGFyYW1ldGVyIGFuZCBzZWFyY2hlcyB0aGUKKyAqIG1mdCByZWNvcmQgc3BlY2lmaWVkIGJ5IEBjdHgtPm1yZWMsIGJlZ2lubmluZyBhdCBAY3R4LT5hdHRyLCBmb3IgYW4KKyAqIGF0dHJpYnV0ZSBvZiBAdHlwZSwgb3B0aW9uYWxseSBAbmFtZSBhbmQgQHZhbC4KKyAqCisgKiBJZiB0aGUgYXR0cmlidXRlIGlzIGZvdW5kLCBudGZzX2F0dHJfZmluZCgpIHJldHVybnMgMCBhbmQgQGN0eC0+YXR0ciB3aWxsCisgKiBwb2ludCB0byB0aGUgZm91bmQgYXR0cmlidXRlLgorICoKKyAqIElmIHRoZSBhdHRyaWJ1dGUgaXMgbm90IGZvdW5kLCBudGZzX2F0dHJfZmluZCgpIHJldHVybnMgLUVOT0VOVCBhbmQKKyAqIEBjdHgtPmF0dHIgd2lsbCBwb2ludCB0byB0aGUgYXR0cmlidXRlIGJlZm9yZSB3aGljaCB0aGUgYXR0cmlidXRlIGJlaW5nCisgKiBzZWFyY2hlZCBmb3Igd291bGQgbmVlZCB0byBiZSBpbnNlcnRlZCBpZiBzdWNoIGFuIGFjdGlvbiB3ZXJlIHRvIGJlIGRlc2lyZWQuCisgKgorICogT24gYWN0dWFsIGVycm9yLCBudGZzX2F0dHJfZmluZCgpIHJldHVybnMgLUVJTy4gIEluIHRoaXMgY2FzZSBAY3R4LT5hdHRyIGlzCisgKiB1bmRlZmluZWQgYW5kIGluIHBhcnRpY3VsYXIgZG8gbm90IHJlbHkgb24gaXQgbm90IGNoYW5naW5nLgorICoKKyAqIElmIEBjdHgtPmlzX2ZpcnN0IGlzIFRSVUUsIHRoZSBzZWFyY2ggYmVnaW5zIHdpdGggQGN0eC0+YXR0ciBpdHNlbGYuICBJZiBpdAorICogaXMgRkFMU0UsIHRoZSBzZWFyY2ggYmVnaW5zIGFmdGVyIEBjdHgtPmF0dHIuCisgKgorICogSWYgQGljIGlzIElHTk9SRV9DQVNFLCB0aGUgQG5hbWUgY29tcGFyaXNzb24gaXMgbm90IGNhc2Ugc2Vuc2l0aXZlIGFuZAorICogQGN0eC0+bnRmc19pbm8gbXVzdCBiZSBzZXQgdG8gdGhlIG50ZnMgaW5vZGUgdG8gd2hpY2ggdGhlIG1mdCByZWNvcmQKKyAqIEBjdHgtPm1yZWMgYmVsb25ncy4gIFRoaXMgaXMgc28gd2UgY2FuIGdldCBhdCB0aGUgbnRmcyB2b2x1bWUgYW5kIGhlbmNlIGF0CisgKiB0aGUgdXBjYXNlIHRhYmxlLiAgSWYgQGljIGlzIENBU0VfU0VOU0lUSVZFLCB0aGUgY29tcGFyaXNvbiBpcyBjYXNlCisgKiBzZW5zaXRpdmUuICBXaGVuIEBuYW1lIGlzIHByZXNlbnQsIEBuYW1lX2xlbiBpcyB0aGUgQG5hbWUgbGVuZ3RoIGluIFVuaWNvZGUKKyAqIGNoYXJhY3RlcnMuCisgKgorICogSWYgQG5hbWUgaXMgbm90IHByZXNlbnQgKE5VTEwpLCB3ZSBhc3N1bWUgdGhhdCB0aGUgdW5uYW1lZCBhdHRyaWJ1dGUgaXMKKyAqIGJlaW5nIHNlYXJjaGVkIGZvci4KKyAqCisgKiBGaW5hbGx5LCB0aGUgcmVzaWRlbnQgYXR0cmlidXRlIHZhbHVlIEB2YWwgaXMgbG9va2VkIGZvciwgaWYgcHJlc2VudC4gIElmCisgKiBAdmFsIGlzIG5vdCBwcmVzZW50IChOVUxMKSwgQHZhbF9sZW4gaXMgaWdub3JlZC4KKyAqCisgKiBudGZzX2F0dHJfZmluZCgpIG9ubHkgc2VhcmNoZXMgdGhlIHNwZWNpZmllZCBtZnQgcmVjb3JkIGFuZCBpdCBpZ25vcmVzIHRoZQorICogcHJlc2VuY2Ugb2YgYW4gYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlICh1bmxlc3MgaXQgaXMgdGhlIG9uZSBiZWluZyBzZWFyY2hlZAorICogZm9yLCBvYnZpb3VzbHkpLiAgSWYgeW91IG5lZWQgdG8gdGFrZSBhdHRyaWJ1dGUgbGlzdHMgaW50byBjb25zaWRlcmF0aW9uLAorICogdXNlIG50ZnNfYXR0cl9sb29rdXAoKSBpbnN0ZWFkIChzZWUgYmVsb3cpLiAgVGhpcyBhbHNvIG1lYW5zIHRoYXQgeW91IGNhbm5vdAorICogdXNlIG50ZnNfYXR0cl9maW5kKCkgdG8gc2VhcmNoIGZvciBleHRlbnQgcmVjb3JkcyBvZiBub24tcmVzaWRlbnQKKyAqIGF0dHJpYnV0ZXMsIGFzIGV4dGVudHMgd2l0aCBsb3dlc3RfdmNuICE9IDAgYXJlIHVzdWFsbHkgZGVzY3JpYmVkIGJ5IHRoZQorICogYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlIG9ubHkuIC0gTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGZpcnN0CisgKiBleHRlbnQgaXMgb25seSBpbiB0aGUgYXR0cmlidXRlIGxpc3Qgd2hpbGUgdGhlIGxhc3QgZXh0ZW50IGlzIGluIHRoZSBiYXNlCisgKiBtZnQgcmVjb3JkLCBzbyBkbyBub3QgcmVseSBvbiBiZWluZyBhYmxlIHRvIGZpbmQgdGhlIGZpcnN0IGV4dGVudCBpbiB0aGUKKyAqIGJhc2UgbWZ0IHJlY29yZC4KKyAqCisgKiBXYXJuaW5nOiBOZXZlciB1c2UgQHZhbCB3aGVuIGxvb2tpbmcgZm9yIGF0dHJpYnV0ZSB0eXBlcyB3aGljaCBjYW4gYmUKKyAqCSAgICBub24tcmVzaWRlbnQgYXMgdGhpcyBtb3N0IGxpa2VseSB3aWxsIHJlc3VsdCBpbiBhIGNyYXNoIQorICovCitzdGF0aWMgaW50IG50ZnNfYXR0cl9maW5kKGNvbnN0IEFUVFJfVFlQRSB0eXBlLCBjb25zdCBudGZzY2hhciAqbmFtZSwKKwkJY29uc3QgdTMyIG5hbWVfbGVuLCBjb25zdCBJR05PUkVfQ0FTRV9CT09MIGljLAorCQljb25zdCB1OCAqdmFsLCBjb25zdCB1MzIgdmFsX2xlbiwgbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eCkKK3sKKwlBVFRSX1JFQ09SRCAqYTsKKwludGZzX3ZvbHVtZSAqdm9sID0gY3R4LT5udGZzX2luby0+dm9sOworCW50ZnNjaGFyICp1cGNhc2UgPSB2b2wtPnVwY2FzZTsKKwl1MzIgdXBjYXNlX2xlbiA9IHZvbC0+dXBjYXNlX2xlbjsKKworCS8qCisJICogSXRlcmF0ZSBvdmVyIGF0dHJpYnV0ZXMgaW4gbWZ0IHJlY29yZCBzdGFydGluZyBhdCBAY3R4LT5hdHRyLCBvciB0aGUKKwkgKiBhdHRyaWJ1dGUgZm9sbG93aW5nIHRoYXQsIGlmIEBjdHgtPmlzX2ZpcnN0IGlzIFRSVUUuCisJICovCisJaWYgKGN0eC0+aXNfZmlyc3QpIHsKKwkJYSA9IGN0eC0+YXR0cjsKKwkJY3R4LT5pc19maXJzdCA9IEZBTFNFOworCX0gZWxzZQorCQlhID0gKEFUVFJfUkVDT1JEKikoKHU4KiljdHgtPmF0dHIgKworCQkJCWxlMzJfdG9fY3B1KGN0eC0+YXR0ci0+bGVuZ3RoKSk7CisJZm9yICg7OwlhID0gKEFUVFJfUkVDT1JEKikoKHU4KilhICsgbGUzMl90b19jcHUoYS0+bGVuZ3RoKSkpIHsKKwkJaWYgKCh1OCopYSA8ICh1OCopY3R4LT5tcmVjIHx8ICh1OCopYSA+ICh1OCopY3R4LT5tcmVjICsKKwkJCQlsZTMyX3RvX2NwdShjdHgtPm1yZWMtPmJ5dGVzX2FsbG9jYXRlZCkpCisJCQlicmVhazsKKwkJY3R4LT5hdHRyID0gYTsKKwkJaWYgKHVubGlrZWx5KGxlMzJfdG9fY3B1KGEtPnR5cGUpID4gbGUzMl90b19jcHUodHlwZSkgfHwKKwkJCQlhLT50eXBlID09IEFUX0VORCkpCisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJaWYgKHVubGlrZWx5KCFhLT5sZW5ndGgpKQorCQkJYnJlYWs7CisJCWlmIChhLT50eXBlICE9IHR5cGUpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogSWYgQG5hbWUgaXMgcHJlc2VudCwgY29tcGFyZSB0aGUgdHdvIG5hbWVzLiAgSWYgQG5hbWUgaXMKKwkJICogbWlzc2luZywgYXNzdW1lIHdlIHdhbnQgYW4gdW5uYW1lZCBhdHRyaWJ1dGUuCisJCSAqLworCQlpZiAoIW5hbWUpIHsKKwkJCS8qIFRoZSBzZWFyY2ggZmFpbGVkIGlmIHRoZSBmb3VuZCBhdHRyaWJ1dGUgaXMgbmFtZWQuICovCisJCQlpZiAoYS0+bmFtZV9sZW5ndGgpCisJCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0gZWxzZSBpZiAoIW50ZnNfYXJlX25hbWVzX2VxdWFsKG5hbWUsIG5hbWVfbGVuLAorCQkJICAgIChudGZzY2hhciopKCh1OCopYSArIGxlMTZfdG9fY3B1KGEtPm5hbWVfb2Zmc2V0KSksCisJCQkgICAgYS0+bmFtZV9sZW5ndGgsIGljLCB1cGNhc2UsIHVwY2FzZV9sZW4pKSB7CisJCQlyZWdpc3RlciBpbnQgcmM7CisKKwkJCXJjID0gbnRmc19jb2xsYXRlX25hbWVzKG5hbWUsIG5hbWVfbGVuLAorCQkJCQkobnRmc2NoYXIqKSgodTgqKWEgKworCQkJCQlsZTE2X3RvX2NwdShhLT5uYW1lX29mZnNldCkpLAorCQkJCQlhLT5uYW1lX2xlbmd0aCwgMSwgSUdOT1JFX0NBU0UsCisJCQkJCXVwY2FzZSwgdXBjYXNlX2xlbik7CisJCQkvKgorCQkJICogSWYgQG5hbWUgY29sbGF0ZXMgYmVmb3JlIGEtPm5hbWUsIHRoZXJlIGlzIG5vCisJCQkgKiBtYXRjaGluZyBhdHRyaWJ1dGUuCisJCQkgKi8KKwkJCWlmIChyYyA9PSAtMSkKKwkJCQlyZXR1cm4gLUVOT0VOVDsKKwkJCS8qIElmIHRoZSBzdHJpbmdzIGFyZSBub3QgZXF1YWwsIGNvbnRpbnVlIHNlYXJjaC4gKi8KKwkJCWlmIChyYykKKwkJCQljb250aW51ZTsKKwkJCXJjID0gbnRmc19jb2xsYXRlX25hbWVzKG5hbWUsIG5hbWVfbGVuLAorCQkJCQkobnRmc2NoYXIqKSgodTgqKWEgKworCQkJCQlsZTE2X3RvX2NwdShhLT5uYW1lX29mZnNldCkpLAorCQkJCQlhLT5uYW1lX2xlbmd0aCwgMSwgQ0FTRV9TRU5TSVRJVkUsCisJCQkJCXVwY2FzZSwgdXBjYXNlX2xlbik7CisJCQlpZiAocmMgPT0gLTEpCisJCQkJcmV0dXJuIC1FTk9FTlQ7CisJCQlpZiAocmMpCisJCQkJY29udGludWU7CisJCX0KKwkJLyoKKwkJICogVGhlIG5hbWVzIG1hdGNoIG9yIEBuYW1lIG5vdCBwcmVzZW50IGFuZCBhdHRyaWJ1dGUgaXMKKwkJICogdW5uYW1lZC4gIElmIG5vIEB2YWwgc3BlY2lmaWVkLCB3ZSBoYXZlIGZvdW5kIHRoZSBhdHRyaWJ1dGUKKwkJICogYW5kIGFyZSBkb25lLgorCQkgKi8KKwkJaWYgKCF2YWwpCisJCQlyZXR1cm4gMDsKKwkJLyogQHZhbCBpcyBwcmVzZW50OyBjb21wYXJlIHZhbHVlcy4gKi8KKwkJZWxzZSB7CisJCQlyZWdpc3RlciBpbnQgcmM7CisKKwkJCXJjID0gbWVtY21wKHZhbCwgKHU4KilhICsgbGUxNl90b19jcHUoCisJCQkJCWEtPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSwKKwkJCQkJbWluX3QodTMyLCB2YWxfbGVuLCBsZTMyX3RvX2NwdSgKKwkJCQkJYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpKSk7CisJCQkvKgorCQkJICogSWYgQHZhbCBjb2xsYXRlcyBiZWZvcmUgdGhlIGN1cnJlbnQgYXR0cmlidXRlJ3MKKwkJCSAqIHZhbHVlLCB0aGVyZSBpcyBubyBtYXRjaGluZyBhdHRyaWJ1dGUuCisJCQkgKi8KKwkJCWlmICghcmMpIHsKKwkJCQlyZWdpc3RlciB1MzIgYXZsOworCisJCQkJYXZsID0gbGUzMl90b19jcHUoCisJCQkJCQlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCk7CisJCQkJaWYgKHZhbF9sZW4gPT0gYXZsKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlpZiAodmFsX2xlbiA8IGF2bCkKKwkJCQkJcmV0dXJuIC1FTk9FTlQ7CisJCQl9IGVsc2UgaWYgKHJjIDwgMCkKKwkJCQlyZXR1cm4gLUVOT0VOVDsKKwkJfQorCX0KKwludGZzX2Vycm9yKHZvbC0+c2IsICJJbm9kZSBpcyBjb3JydXB0LiAgUnVuIGNoa2Rzay4iKTsKKwlOVm9sU2V0RXJyb3JzKHZvbCk7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qKgorICogbG9hZF9hdHRyaWJ1dGVfbGlzdCAtIGxvYWQgYW4gYXR0cmlidXRlIGxpc3QgaW50byBtZW1vcnkKKyAqIEB2b2w6CQludGZzIHZvbHVtZSBmcm9tIHdoaWNoIHRvIHJlYWQKKyAqIEBydW5saXN0OgkJcnVubGlzdCBvZiB0aGUgYXR0cmlidXRlIGxpc3QKKyAqIEBhbF9zdGFydDoJCWRlc3RpbmF0aW9uIGJ1ZmZlcgorICogQHNpemU6CQlzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgaW4gYnl0ZXMKKyAqIEBpbml0aWFsaXplZF9zaXplOglpbml0aWFsaXplZCBzaXplIG9mIHRoZSBhdHRyaWJ1dGUgbGlzdAorICoKKyAqIFdhbGsgdGhlIHJ1bmxpc3QgQHJ1bmxpc3QgYW5kIGxvYWQgYWxsIGNsdXN0ZXJzIGZyb20gaXQgY29weWluZyB0aGVtIGludG8KKyAqIHRoZSBsaW5lYXIgYnVmZmVyIEBhbC4gVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCB0byBAYWwgaXMgQHNpemUKKyAqIGJ5dGVzLiBOb3RlLCBAc2l6ZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNsdXN0ZXIgc2l6ZS4gSWYKKyAqIEBpbml0aWFsaXplZF9zaXplIGlzIGxlc3MgdGhhbiBAc2l6ZSwgdGhlIHJlZ2lvbiBpbiBAYWwgYmV0d2VlbgorICogQGluaXRpYWxpemVkX3NpemUgYW5kIEBzaXplIHdpbGwgYmUgemVyb2VkIGFuZCBub3QgcmVhZCBmcm9tIGRpc2suCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBvciAtZXJybm8gb24gZXJyb3IuCisgKi8KK2ludCBsb2FkX2F0dHJpYnV0ZV9saXN0KG50ZnNfdm9sdW1lICp2b2wsIHJ1bmxpc3QgKnJ1bmxpc3QsIHU4ICphbF9zdGFydCwKKwkJY29uc3QgczY0IHNpemUsIGNvbnN0IHM2NCBpbml0aWFsaXplZF9zaXplKQoreworCUxDTiBsY247CisJdTggKmFsID0gYWxfc3RhcnQ7CisJdTggKmFsX2VuZCA9IGFsICsgaW5pdGlhbGl6ZWRfc2l6ZTsKKwlydW5saXN0X2VsZW1lbnQgKnJsOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwl1bnNpZ25lZCBsb25nIGJsb2NrX3NpemU7CisJdW5zaWduZWQgbG9uZyBibG9jaywgbWF4X2Jsb2NrOworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGNoYXIgYmxvY2tfc2l6ZV9iaXRzOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJaWYgKCF2b2wgfHwgIXJ1bmxpc3QgfHwgIWFsIHx8IHNpemUgPD0gMCB8fCBpbml0aWFsaXplZF9zaXplIDwgMCB8fAorCQkJaW5pdGlhbGl6ZWRfc2l6ZSA+IHNpemUpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghaW5pdGlhbGl6ZWRfc2l6ZSkgeworCQltZW1zZXQoYWwsIDAsIHNpemUpOworCQlyZXR1cm4gMDsKKwl9CisJc2IgPSB2b2wtPnNiOworCWJsb2NrX3NpemUgPSBzYi0+c19ibG9ja3NpemU7CisJYmxvY2tfc2l6ZV9iaXRzID0gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJZG93bl9yZWFkKCZydW5saXN0LT5sb2NrKTsKKwlybCA9IHJ1bmxpc3QtPnJsOworCS8qIFJlYWQgYWxsIGNsdXN0ZXJzIHNwZWNpZmllZCBieSB0aGUgcnVubGlzdCBvbmUgcnVuIGF0IGEgdGltZS4gKi8KKwl3aGlsZSAocmwtPmxlbmd0aCkgeworCQlsY24gPSBudGZzX3JsX3Zjbl90b19sY24ocmwsIHJsLT52Y24pOworCQludGZzX2RlYnVnKCJSZWFkaW5nIHZjbiA9IDB4JWxseCwgbGNuID0gMHglbGx4LiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylybC0+dmNuLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGNuKTsKKwkJLyogVGhlIGF0dHJpYnV0ZSBsaXN0IGNhbm5vdCBiZSBzcGFyc2UuICovCisJCWlmIChsY24gPCAwKSB7CisJCQludGZzX2Vycm9yKHNiLCAibnRmc19ybF92Y25fdG9fbGNuKCkgZmFpbGVkLiAgQ2Fubm90ICIKKwkJCQkJInJlYWQgYXR0cmlidXRlIGxpc3QuIik7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJYmxvY2sgPSBsY24gPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cyA+PiBibG9ja19zaXplX2JpdHM7CisJCS8qIFJlYWQgdGhlIHJ1biBmcm9tIGRldmljZSBpbiBjaHVua3Mgb2YgYmxvY2tfc2l6ZSBieXRlcy4gKi8KKwkJbWF4X2Jsb2NrID0gYmxvY2sgKyAocmwtPmxlbmd0aCA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzID4+CisJCQkJYmxvY2tfc2l6ZV9iaXRzKTsKKwkJbnRmc19kZWJ1ZygibWF4X2Jsb2NrID0gMHglbHguIiwgbWF4X2Jsb2NrKTsKKwkJZG8geworCQkJbnRmc19kZWJ1ZygiUmVhZGluZyBibG9jayA9IDB4JWx4LiIsIGJsb2NrKTsKKwkJCWJoID0gc2JfYnJlYWQoc2IsIGJsb2NrKTsKKwkJCWlmICghYmgpIHsKKwkJCQludGZzX2Vycm9yKHNiLCAic2JfYnJlYWQoKSBmYWlsZWQuIENhbm5vdCAiCisJCQkJCQkicmVhZCBhdHRyaWJ1dGUgbGlzdC4iKTsKKwkJCQlnb3RvIGVycl9vdXQ7CisJCQl9CisJCQlpZiAoYWwgKyBibG9ja19zaXplID49IGFsX2VuZCkKKwkJCQlnb3RvIGRvX2ZpbmFsOworCQkJbWVtY3B5KGFsLCBiaC0+Yl9kYXRhLCBibG9ja19zaXplKTsKKwkJCWJyZWxzZShiaCk7CisJCQlhbCArPSBibG9ja19zaXplOworCQl9IHdoaWxlICgrK2Jsb2NrIDwgbWF4X2Jsb2NrKTsKKwkJcmwrKzsKKwl9CisJaWYgKGluaXRpYWxpemVkX3NpemUgPCBzaXplKSB7Citpbml0aWFsaXplOgorCQltZW1zZXQoYWxfc3RhcnQgKyBpbml0aWFsaXplZF9zaXplLCAwLCBzaXplIC0gaW5pdGlhbGl6ZWRfc2l6ZSk7CisJfQorZG9uZToKKwl1cF9yZWFkKCZydW5saXN0LT5sb2NrKTsKKwlyZXR1cm4gZXJyOworZG9fZmluYWw6CisJaWYgKGFsIDwgYWxfZW5kKSB7CisJCS8qCisJCSAqIFBhcnRpYWwgYmxvY2suCisJCSAqCisJCSAqIE5vdGU6IFRoZSBhdHRyaWJ1dGUgbGlzdCBjYW4gYmUgc21hbGxlciB0aGFuIGl0cyBhbGxvY2F0aW9uCisJCSAqIGJ5IG11bHRpcGxlIGNsdXN0ZXJzLiAgVGhpcyBoYXMgYmVlbiBlbmNvdW50ZXJlZCBieSBhdCBsZWFzdAorCQkgKiB0d28gcGVvcGxlIHJ1bm5pbmcgV2luZG93cyBYUCwgdGh1cyB3ZSBjYW5ub3QgZG8gYW55CisJCSAqIHRydW5jYXRpb24gc2FuaXR5IGNoZWNraW5nIGhlcmUuIChBSUEpCisJCSAqLworCQltZW1jcHkoYWwsIGJoLT5iX2RhdGEsIGFsX2VuZCAtIGFsKTsKKwkJYnJlbHNlKGJoKTsKKwkJaWYgKGluaXRpYWxpemVkX3NpemUgPCBzaXplKQorCQkJZ290byBpbml0aWFsaXplOworCQlnb3RvIGRvbmU7CisJfQorCWJyZWxzZShiaCk7CisJLyogUmVhbCBvdmVyZmxvdyEgKi8KKwludGZzX2Vycm9yKHNiLCAiQXR0cmlidXRlIGxpc3QgYnVmZmVyIG92ZXJmbG93LiBSZWFkIGF0dHJpYnV0ZSBsaXN0ICIKKwkJCSJpcyB0cnVuY2F0ZWQuIik7CitlcnJfb3V0OgorCWVyciA9IC1FSU87CisJZ290byBkb25lOworfQorCisvKioKKyAqIG50ZnNfZXh0ZXJuYWxfYXR0cl9maW5kIC0gZmluZCBhbiBhdHRyaWJ1dGUgaW4gdGhlIGF0dHJpYnV0ZSBsaXN0IG9mIGFuIGlub2RlCisgKiBAdHlwZToJYXR0cmlidXRlIHR5cGUgdG8gZmluZAorICogQG5hbWU6CWF0dHJpYnV0ZSBuYW1lIHRvIGZpbmQgKG9wdGlvbmFsLCBpLmUuIE5VTEwgbWVhbnMgZG9uJ3QgY2FyZSkKKyAqIEBuYW1lX2xlbjoJYXR0cmlidXRlIG5hbWUgbGVuZ3RoIChvbmx5IG5lZWRlZCBpZiBAbmFtZSBwcmVzZW50KQorICogQGljOgkJSUdOT1JFX0NBU0Ugb3IgQ0FTRV9TRU5TSVRJVkUgKGlnbm9yZWQgaWYgQG5hbWUgbm90IHByZXNlbnQpCisgKiBAbG93ZXN0X3ZjbjoJbG93ZXN0IHZjbiB0byBmaW5kIChvcHRpb25hbCwgbm9uLXJlc2lkZW50IGF0dHJpYnV0ZXMgb25seSkKKyAqIEB2YWw6CWF0dHJpYnV0ZSB2YWx1ZSB0byBmaW5kIChvcHRpb25hbCwgcmVzaWRlbnQgYXR0cmlidXRlcyBvbmx5KQorICogQHZhbF9sZW46CWF0dHJpYnV0ZSB2YWx1ZSBsZW5ndGgKKyAqIEBjdHg6CXNlYXJjaCBjb250ZXh0IHdpdGggbWZ0IHJlY29yZCBhbmQgYXR0cmlidXRlIHRvIHNlYXJjaCBmcm9tCisgKgorICogWW91IHNob3VsZCBub3QgbmVlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkuICBVc2UgbnRmc19hdHRyX2xvb2t1cCgpCisgKiBpbnN0ZWFkLgorICoKKyAqIEZpbmQgYW4gYXR0cmlidXRlIGJ5IHNlYXJjaGluZyB0aGUgYXR0cmlidXRlIGxpc3QgZm9yIHRoZSBjb3JyZXNwb25kaW5nCisgKiBhdHRyaWJ1dGUgbGlzdCBlbnRyeS4gIEhhdmluZyBmb3VuZCB0aGUgZW50cnksIG1hcCB0aGUgbWZ0IHJlY29yZCBpZiB0aGUKKyAqIGF0dHJpYnV0ZSBpcyBpbiBhIGRpZmZlcmVudCBtZnQgcmVjb3JkL2lub2RlLCBudGZzX2F0dHJfZmluZCgpIHRoZSBhdHRyaWJ1dGUKKyAqIGluIHRoZXJlIGFuZCByZXR1cm4gaXQuCisgKgorICogT24gZmlyc3Qgc2VhcmNoIEBjdHgtPm50ZnNfaW5vIG11c3QgYmUgdGhlIGJhc2UgbWZ0IHJlY29yZCBhbmQgQGN0eCBtdXN0CisgKiBoYXZlIGJlZW4gb2J0YWluZWQgZnJvbSBhIGNhbGwgdG8gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KCkuICBPbiBzdWJzZXF1ZW50CisgKiBjYWxscyBAY3R4LT5udGZzX2lubyBjYW4gYmUgYW55IGV4dGVudCBpbm9kZSwgdG9vIChAY3R4LT5iYXNlX250ZnNfaW5vIGlzCisgKiB0aGVuIHRoZSBiYXNlIGlub2RlKS4KKyAqCisgKiBBZnRlciBmaW5pc2hpbmcgd2l0aCB0aGUgYXR0cmlidXRlL21mdCByZWNvcmQgeW91IG5lZWQgdG8gY2FsbAorICogbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KCkgdG8gY2xlYW51cCB0aGUgc2VhcmNoIGNvbnRleHQgKHVubWFwcGluZyBhbnkKKyAqIG1hcHBlZCBpbm9kZXMsIGV0YykuCisgKgorICogSWYgdGhlIGF0dHJpYnV0ZSBpcyBmb3VuZCwgbnRmc19leHRlcm5hbF9hdHRyX2ZpbmQoKSByZXR1cm5zIDAgYW5kCisgKiBAY3R4LT5hdHRyIHdpbGwgcG9pbnQgdG8gdGhlIGZvdW5kIGF0dHJpYnV0ZS4gIEBjdHgtPm1yZWMgd2lsbCBwb2ludCB0byB0aGUKKyAqIG1mdCByZWNvcmQgaW4gd2hpY2ggQGN0eC0+YXR0ciBpcyBsb2NhdGVkIGFuZCBAY3R4LT5hbF9lbnRyeSB3aWxsIHBvaW50IHRvCisgKiB0aGUgYXR0cmlidXRlIGxpc3QgZW50cnkgZm9yIHRoZSBhdHRyaWJ1dGUuCisgKgorICogSWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQsIG50ZnNfZXh0ZXJuYWxfYXR0cl9maW5kKCkgcmV0dXJucyAtRU5PRU5UIGFuZAorICogQGN0eC0+YXR0ciB3aWxsIHBvaW50IHRvIHRoZSBhdHRyaWJ1dGUgaW4gdGhlIGJhc2UgbWZ0IHJlY29yZCBiZWZvcmUgd2hpY2gKKyAqIHRoZSBhdHRyaWJ1dGUgYmVpbmcgc2VhcmNoZWQgZm9yIHdvdWxkIG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaWYgc3VjaCBhbiBhY3Rpb24KKyAqIHdlcmUgdG8gYmUgZGVzaXJlZC4gIEBjdHgtPm1yZWMgd2lsbCBwb2ludCB0byB0aGUgbWZ0IHJlY29yZCBpbiB3aGljaAorICogQGN0eC0+YXR0ciBpcyBsb2NhdGVkIGFuZCBAY3R4LT5hbF9lbnRyeSB3aWxsIHBvaW50IHRvIHRoZSBhdHRyaWJ1dGUgbGlzdAorICogZW50cnkgb2YgdGhlIGF0dHJpYnV0ZSBiZWZvcmUgd2hpY2ggdGhlIGF0dHJpYnV0ZSBiZWluZyBzZWFyY2hlZCBmb3Igd291bGQKKyAqIG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaWYgc3VjaCBhbiBhY3Rpb24gd2VyZSB0byBiZSBkZXNpcmVkLgorICoKKyAqIFRodXMgdG8gaW5zZXJ0IHRoZSBub3QgZm91bmQgYXR0cmlidXRlLCBvbmUgd2FudHMgdG8gYWRkIHRoZSBhdHRyaWJ1dGUgdG8KKyAqIEBjdHgtPm1yZWMgKHRoZSBiYXNlIG1mdCByZWNvcmQpIGFuZCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIHNwYWNlLCB0aGUKKyAqIGF0dHJpYnV0ZSBzaG91bGQgYmUgcGxhY2VkIGluIGEgbmV3bHkgYWxsb2NhdGVkIGV4dGVudCBtZnQgcmVjb3JkLiAgVGhlCisgKiBhdHRyaWJ1dGUgbGlzdCBlbnRyeSBmb3IgdGhlIGluc2VydGVkIGF0dHJpYnV0ZSBzaG91bGQgYmUgaW5zZXJ0ZWQgaW4gdGhlCisgKiBhdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgYXQgQGN0eC0+YWxfZW50cnkuCisgKgorICogT24gYWN0dWFsIGVycm9yLCBudGZzX2V4dGVybmFsX2F0dHJfZmluZCgpIHJldHVybnMgLUVJTy4gIEluIHRoaXMgY2FzZQorICogQGN0eC0+YXR0ciBpcyB1bmRlZmluZWQgYW5kIGluIHBhcnRpY3VsYXIgZG8gbm90IHJlbHkgb24gaXQgbm90IGNoYW5naW5nLgorICovCitzdGF0aWMgaW50IG50ZnNfZXh0ZXJuYWxfYXR0cl9maW5kKGNvbnN0IEFUVFJfVFlQRSB0eXBlLAorCQljb25zdCBudGZzY2hhciAqbmFtZSwgY29uc3QgdTMyIG5hbWVfbGVuLAorCQljb25zdCBJR05PUkVfQ0FTRV9CT09MIGljLCBjb25zdCBWQ04gbG93ZXN0X3ZjbiwKKwkJY29uc3QgdTggKnZhbCwgY29uc3QgdTMyIHZhbF9sZW4sIG50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHgpCit7CisJbnRmc19pbm9kZSAqYmFzZV9uaSwgKm5pOworCW50ZnNfdm9sdW1lICp2b2w7CisJQVRUUl9MSVNUX0VOVFJZICphbF9lbnRyeSwgKm5leHRfYWxfZW50cnk7CisJdTggKmFsX3N0YXJ0LCAqYWxfZW5kOworCUFUVFJfUkVDT1JEICphOworCW50ZnNjaGFyICphbF9uYW1lOworCXUzMiBhbF9uYW1lX2xlbjsKKwlpbnQgZXJyID0gMDsKKwlzdGF0aWMgY29uc3QgY2hhciAqZXMgPSAiIFVubW91bnQgYW5kIHJ1biBjaGtkc2suIjsKKworCW5pID0gY3R4LT5udGZzX2lubzsKKwliYXNlX25pID0gY3R4LT5iYXNlX250ZnNfaW5vOworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpbm9kZSAweCVseCwgdHlwZSAweCV4LiIsIG5pLT5tZnRfbm8sIHR5cGUpOworCWlmICghYmFzZV9uaSkgeworCQkvKiBGaXJzdCBjYWxsIGhhcHBlbnMgd2l0aCB0aGUgYmFzZSBtZnQgcmVjb3JkLiAqLworCQliYXNlX25pID0gY3R4LT5iYXNlX250ZnNfaW5vID0gY3R4LT5udGZzX2lubzsKKwkJY3R4LT5iYXNlX21yZWMgPSBjdHgtPm1yZWM7CisJfQorCWlmIChuaSA9PSBiYXNlX25pKQorCQljdHgtPmJhc2VfYXR0ciA9IGN0eC0+YXR0cjsKKwlpZiAodHlwZSA9PSBBVF9FTkQpCisJCWdvdG8gbm90X2ZvdW5kOworCXZvbCA9IGJhc2VfbmktPnZvbDsKKwlhbF9zdGFydCA9IGJhc2VfbmktPmF0dHJfbGlzdDsKKwlhbF9lbmQgPSBhbF9zdGFydCArIGJhc2VfbmktPmF0dHJfbGlzdF9zaXplOworCWlmICghY3R4LT5hbF9lbnRyeSkKKwkJY3R4LT5hbF9lbnRyeSA9IChBVFRSX0xJU1RfRU5UUlkqKWFsX3N0YXJ0OworCS8qCisJICogSXRlcmF0ZSBvdmVyIGVudHJpZXMgaW4gYXR0cmlidXRlIGxpc3Qgc3RhcnRpbmcgYXQgQGN0eC0+YWxfZW50cnksCisJICogb3IgdGhlIGVudHJ5IGZvbGxvd2luZyB0aGF0LCBpZiBAY3R4LT5pc19maXJzdCBpcyBUUlVFLgorCSAqLworCWlmIChjdHgtPmlzX2ZpcnN0KSB7CisJCWFsX2VudHJ5ID0gY3R4LT5hbF9lbnRyeTsKKwkJY3R4LT5pc19maXJzdCA9IEZBTFNFOworCX0gZWxzZQorCQlhbF9lbnRyeSA9IChBVFRSX0xJU1RfRU5UUlkqKSgodTgqKWN0eC0+YWxfZW50cnkgKworCQkJCWxlMTZfdG9fY3B1KGN0eC0+YWxfZW50cnktPmxlbmd0aCkpOworCWZvciAoOzsgYWxfZW50cnkgPSBuZXh0X2FsX2VudHJ5KSB7CisJCS8qIE91dCBvZiBib3VuZHMgY2hlY2suICovCisJCWlmICgodTgqKWFsX2VudHJ5IDwgYmFzZV9uaS0+YXR0cl9saXN0IHx8CisJCQkJKHU4KilhbF9lbnRyeSA+IGFsX2VuZCkKKwkJCWJyZWFrOwkvKiBJbm9kZSBpcyBjb3JydXB0LiAqLworCQljdHgtPmFsX2VudHJ5ID0gYWxfZW50cnk7CisJCS8qIENhdGNoIHRoZSBlbmQgb2YgdGhlIGF0dHJpYnV0ZSBsaXN0LiAqLworCQlpZiAoKHU4KilhbF9lbnRyeSA9PSBhbF9lbmQpCisJCQlnb3RvIG5vdF9mb3VuZDsKKwkJaWYgKCFhbF9lbnRyeS0+bGVuZ3RoKQorCQkJYnJlYWs7CisJCWlmICgodTgqKWFsX2VudHJ5ICsgNiA+IGFsX2VuZCB8fCAodTgqKWFsX2VudHJ5ICsKKwkJCQlsZTE2X3RvX2NwdShhbF9lbnRyeS0+bGVuZ3RoKSA+IGFsX2VuZCkKKwkJCWJyZWFrOworCQluZXh0X2FsX2VudHJ5ID0gKEFUVFJfTElTVF9FTlRSWSopKCh1OCopYWxfZW50cnkgKworCQkJCWxlMTZfdG9fY3B1KGFsX2VudHJ5LT5sZW5ndGgpKTsKKwkJaWYgKGxlMzJfdG9fY3B1KGFsX2VudHJ5LT50eXBlKSA+IGxlMzJfdG9fY3B1KHR5cGUpKQorCQkJZ290byBub3RfZm91bmQ7CisJCWlmICh0eXBlICE9IGFsX2VudHJ5LT50eXBlKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIElmIEBuYW1lIGlzIHByZXNlbnQsIGNvbXBhcmUgdGhlIHR3byBuYW1lcy4gIElmIEBuYW1lIGlzCisJCSAqIG1pc3NpbmcsIGFzc3VtZSB3ZSB3YW50IGFuIHVubmFtZWQgYXR0cmlidXRlLgorCQkgKi8KKwkJYWxfbmFtZV9sZW4gPSBhbF9lbnRyeS0+bmFtZV9sZW5ndGg7CisJCWFsX25hbWUgPSAobnRmc2NoYXIqKSgodTgqKWFsX2VudHJ5ICsgYWxfZW50cnktPm5hbWVfb2Zmc2V0KTsKKwkJaWYgKCFuYW1lKSB7CisJCQlpZiAoYWxfbmFtZV9sZW4pCisJCQkJZ290byBub3RfZm91bmQ7CisJCX0gZWxzZSBpZiAoIW50ZnNfYXJlX25hbWVzX2VxdWFsKGFsX25hbWUsIGFsX25hbWVfbGVuLCBuYW1lLAorCQkJCW5hbWVfbGVuLCBpYywgdm9sLT51cGNhc2UsIHZvbC0+dXBjYXNlX2xlbikpIHsKKwkJCXJlZ2lzdGVyIGludCByYzsKKworCQkJcmMgPSBudGZzX2NvbGxhdGVfbmFtZXMobmFtZSwgbmFtZV9sZW4sIGFsX25hbWUsCisJCQkJCWFsX25hbWVfbGVuLCAxLCBJR05PUkVfQ0FTRSwKKwkJCQkJdm9sLT51cGNhc2UsIHZvbC0+dXBjYXNlX2xlbik7CisJCQkvKgorCQkJICogSWYgQG5hbWUgY29sbGF0ZXMgYmVmb3JlIGFsX25hbWUsIHRoZXJlIGlzIG5vCisJCQkgKiBtYXRjaGluZyBhdHRyaWJ1dGUuCisJCQkgKi8KKwkJCWlmIChyYyA9PSAtMSkKKwkJCQlnb3RvIG5vdF9mb3VuZDsKKwkJCS8qIElmIHRoZSBzdHJpbmdzIGFyZSBub3QgZXF1YWwsIGNvbnRpbnVlIHNlYXJjaC4gKi8KKwkJCWlmIChyYykKKwkJCQljb250aW51ZTsKKwkJCS8qCisJCQkgKiBGSVhNRTogUmV2ZXJzZSBlbmdpbmVlcmluZyBzaG93ZWQgMCwgSUdOT1JFX0NBU0UgYnV0CisJCQkgKiB0aGF0IGlzIGluY29uc2lzdGVudCB3aXRoIG50ZnNfYXR0cl9maW5kKCkuICBUaGUKKwkJCSAqIHN1YnNlcXVlbnQgcmMgY2hlY2tzIHdlcmUgYWxzbyBkaWZmZXJlbnQuICBQZXJoYXBzIEkKKwkJCSAqIG1hZGUgYSBtaXN0YWtlIGluIG9uZSBvZiB0aGUgdHdvLiAgTmVlZCB0byByZWNoZWNrCisJCQkgKiB3aGljaCBpcyBjb3JyZWN0IG9yIGF0IGxlYXN0IHNlZSB3aGF0IGlzIGdvaW5nIG9uLi4uCisJCQkgKiAoQUlBKQorCQkJICovCisJCQlyYyA9IG50ZnNfY29sbGF0ZV9uYW1lcyhuYW1lLCBuYW1lX2xlbiwgYWxfbmFtZSwKKwkJCQkJYWxfbmFtZV9sZW4sIDEsIENBU0VfU0VOU0lUSVZFLAorCQkJCQl2b2wtPnVwY2FzZSwgdm9sLT51cGNhc2VfbGVuKTsKKwkJCWlmIChyYyA9PSAtMSkKKwkJCQlnb3RvIG5vdF9mb3VuZDsKKwkJCWlmIChyYykKKwkJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBUaGUgbmFtZXMgbWF0Y2ggb3IgQG5hbWUgbm90IHByZXNlbnQgYW5kIGF0dHJpYnV0ZSBpcworCQkgKiB1bm5hbWVkLiAgTm93IGNoZWNrIEBsb3dlc3RfdmNuLiAgQ29udGludWUgc2VhcmNoIGlmIHRoZQorCQkgKiBuZXh0IGF0dHJpYnV0ZSBsaXN0IGVudHJ5IHN0aWxsIGZpdHMgQGxvd2VzdF92Y24uICBPdGhlcndpc2UKKwkJICogd2UgaGF2ZSByZWFjaGVkIHRoZSByaWdodCBvbmUgb3IgdGhlIHNlYXJjaCBoYXMgZmFpbGVkLgorCQkgKi8KKwkJaWYgKGxvd2VzdF92Y24gJiYgKHU4KiluZXh0X2FsX2VudHJ5ID49IGFsX3N0YXJ0CSAgICAmJgorCQkJCSh1OCopbmV4dF9hbF9lbnRyeSArIDYgPCBhbF9lbmQJCSAgICAmJgorCQkJCSh1OCopbmV4dF9hbF9lbnRyeSArIGxlMTZfdG9fY3B1KAorCQkJCQluZXh0X2FsX2VudHJ5LT5sZW5ndGgpIDw9IGFsX2VuZCAgICAmJgorCQkJCXNsZTY0X3RvX2NwdShuZXh0X2FsX2VudHJ5LT5sb3dlc3RfdmNuKSA8PQorCQkJCQlsb3dlc3RfdmNuCQkJICAgICYmCisJCQkJbmV4dF9hbF9lbnRyeS0+dHlwZSA9PSBhbF9lbnRyeS0+dHlwZQkgICAgJiYKKwkJCQluZXh0X2FsX2VudHJ5LT5uYW1lX2xlbmd0aCA9PSBhbF9uYW1lX2xlbiAgICYmCisJCQkJbnRmc19hcmVfbmFtZXNfZXF1YWwoKG50ZnNjaGFyKikoKHU4KikKKwkJCQkJbmV4dF9hbF9lbnRyeSArCisJCQkJCW5leHRfYWxfZW50cnktPm5hbWVfb2Zmc2V0KSwKKwkJCQkJbmV4dF9hbF9lbnRyeS0+bmFtZV9sZW5ndGgsCisJCQkJCWFsX25hbWUsIGFsX25hbWVfbGVuLCBDQVNFX1NFTlNJVElWRSwKKwkJCQkJdm9sLT51cGNhc2UsIHZvbC0+dXBjYXNlX2xlbikpCisJCQljb250aW51ZTsKKwkJaWYgKE1SRUZfTEUoYWxfZW50cnktPm1mdF9yZWZlcmVuY2UpID09IG5pLT5tZnRfbm8pIHsKKwkJCWlmIChNU0VRTk9fTEUoYWxfZW50cnktPm1mdF9yZWZlcmVuY2UpICE9IG5pLT5zZXFfbm8pIHsKKwkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGb3VuZCBzdGFsZSBtZnQgIgorCQkJCQkJInJlZmVyZW5jZSBpbiBhdHRyaWJ1dGUgbGlzdCAiCisJCQkJCQkib2YgYmFzZSBpbm9kZSAweCVseC4lcyIsCisJCQkJCQliYXNlX25pLT5tZnRfbm8sIGVzKTsKKwkJCQllcnIgPSAtRUlPOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeyAvKiBNZnQgcmVmZXJlbmNlcyBkbyBub3QgbWF0Y2guICovCisJCQkvKiBJZiB0aGVyZSBpcyBhIG1hcHBlZCByZWNvcmQgdW5tYXAgaXQgZmlyc3QuICovCisJCQlpZiAobmkgIT0gYmFzZV9uaSkKKwkJCQl1bm1hcF9leHRlbnRfbWZ0X3JlY29yZChuaSk7CisJCQkvKiBEbyB3ZSB3YW50IHRoZSBiYXNlIHJlY29yZCBiYWNrPyAqLworCQkJaWYgKE1SRUZfTEUoYWxfZW50cnktPm1mdF9yZWZlcmVuY2UpID09CisJCQkJCWJhc2VfbmktPm1mdF9ubykgeworCQkJCW5pID0gY3R4LT5udGZzX2lubyA9IGJhc2Vfbmk7CisJCQkJY3R4LT5tcmVjID0gY3R4LT5iYXNlX21yZWM7CisJCQl9IGVsc2UgeworCQkJCS8qIFdlIHdhbnQgYW4gZXh0ZW50IHJlY29yZC4gKi8KKwkJCQljdHgtPm1yZWMgPSBtYXBfZXh0ZW50X21mdF9yZWNvcmQoYmFzZV9uaSwKKwkJCQkJCWxlNjRfdG9fY3B1KAorCQkJCQkJYWxfZW50cnktPm1mdF9yZWZlcmVuY2UpLCAmbmkpOworCQkJCWlmIChJU19FUlIoY3R4LT5tcmVjKSkgeworCQkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWFwICIKKwkJCQkJCQkiZXh0ZW50IG1mdCByZWNvcmQgIgorCQkJCQkJCSIweCVseCBvZiBiYXNlIGlub2RlICIKKwkJCQkJCQkiMHglbHguJXMiLAorCQkJCQkJCU1SRUZfTEUoYWxfZW50cnktPgorCQkJCQkJCW1mdF9yZWZlcmVuY2UpLAorCQkJCQkJCWJhc2VfbmktPm1mdF9ubywgZXMpOworCQkJCQllcnIgPSBQVFJfRVJSKGN0eC0+bXJlYyk7CisJCQkJCWlmIChlcnIgPT0gLUVOT0VOVCkKKwkJCQkJCWVyciA9IC1FSU87CisJCQkJCS8qIENhdXNlIEBjdHggdG8gYmUgc2FuaXRpemVkIGJlbG93LiAqLworCQkJCQluaSA9IE5VTEw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljdHgtPm50ZnNfaW5vID0gbmk7CisJCQl9CisJCQljdHgtPmF0dHIgPSAoQVRUUl9SRUNPUkQqKSgodTgqKWN0eC0+bXJlYyArCisJCQkJCWxlMTZfdG9fY3B1KGN0eC0+bXJlYy0+YXR0cnNfb2Zmc2V0KSk7CisJCX0KKwkJLyoKKwkJICogY3R4LT52ZnNfaW5vLCBjdHgtPm1yZWMsIGFuZCBjdHgtPmF0dHIgbm93IHBvaW50IHRvIHRoZQorCQkgKiBtZnQgcmVjb3JkIGNvbnRhaW5pbmcgdGhlIGF0dHJpYnV0ZSByZXByZXNlbnRlZCBieSB0aGUKKwkJICogY3VycmVudCBhbF9lbnRyeS4KKwkJICovCisJCS8qCisJCSAqIFdlIGNvdWxkIGNhbGwgaW50byBudGZzX2F0dHJfZmluZCgpIHRvIGZpbmQgdGhlIHJpZ2h0CisJCSAqIGF0dHJpYnV0ZSBpbiB0aGlzIG1mdCByZWNvcmQgYnV0IHRoaXMgd291bGQgYmUgbGVzcworCQkgKiBlZmZpY2llbnQgYW5kIG5vdCBxdWl0ZSBhY2N1cmF0ZSBhcyBudGZzX2F0dHJfZmluZCgpIGlnbm9yZXMKKwkJICogdGhlIGF0dHJpYnV0ZSBpbnN0YW5jZSBudW1iZXJzIGZvciBleGFtcGxlIHdoaWNoIGJlY29tZQorCQkgKiBpbXBvcnRhbnQgd2hlbiBvbmUgcGxheXMgd2l0aCBhdHRyaWJ1dGUgbGlzdHMuICBBbHNvLAorCQkgKiBiZWNhdXNlIGEgcHJvcGVyIG1hdGNoIGhhcyBiZWVuIGZvdW5kIGluIHRoZSBhdHRyaWJ1dGUgbGlzdAorCQkgKiBlbnRyeSBhYm92ZSwgdGhlIGNvbXBhcmlzb24gY2FuIG5vdyBiZSBvcHRpbWl6ZWQuICBTbyBpdCBpcworCQkgKiB3b3J0aCByZS1pbXBsZW1lbnRpbmcgYSBzaW1wbGlmaWVkIG50ZnNfYXR0cl9maW5kKCkgaGVyZS4KKwkJICovCisJCWEgPSBjdHgtPmF0dHI7CisJCS8qCisJCSAqIFVzZSBhIG1hbnVhbCBsb29wIHNvIHdlIGNhbiBzdGlsbCB1c2UgYnJlYWsgYW5kIGNvbnRpbnVlCisJCSAqIHdpdGggdGhlIHNhbWUgbWVhbmluZ3MgYXMgYWJvdmUuCisJCSAqLworZG9fbmV4dF9hdHRyX2xvb3A6CisJCWlmICgodTgqKWEgPCAodTgqKWN0eC0+bXJlYyB8fCAodTgqKWEgPiAodTgqKWN0eC0+bXJlYyArCisJCQkJbGUzMl90b19jcHUoY3R4LT5tcmVjLT5ieXRlc19hbGxvY2F0ZWQpKQorCQkJYnJlYWs7CisJCWlmIChhLT50eXBlID09IEFUX0VORCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWEtPmxlbmd0aCkKKwkJCWJyZWFrOworCQlpZiAoYWxfZW50cnktPmluc3RhbmNlICE9IGEtPmluc3RhbmNlKQorCQkJZ290byBkb19uZXh0X2F0dHI7CisJCS8qCisJCSAqIElmIHRoZSB0eXBlIGFuZC9vciB0aGUgbmFtZSBhcmUgbWlzbWF0Y2hlZCBiZXR3ZWVuIHRoZQorCQkgKiBhdHRyaWJ1dGUgbGlzdCBlbnRyeSBhbmQgdGhlIGF0dHJpYnV0ZSByZWNvcmQsIHRoZXJlIGlzCisJCSAqIGNvcnJ1cHRpb24gc28gd2UgYnJlYWsgYW5kIHJldHVybiBlcnJvciBFSU8uCisJCSAqLworCQlpZiAoYWxfZW50cnktPnR5cGUgIT0gYS0+dHlwZSkKKwkJCWJyZWFrOworCQlpZiAoIW50ZnNfYXJlX25hbWVzX2VxdWFsKChudGZzY2hhciopKCh1OCopYSArCisJCQkJbGUxNl90b19jcHUoYS0+bmFtZV9vZmZzZXQpKSwgYS0+bmFtZV9sZW5ndGgsCisJCQkJYWxfbmFtZSwgYWxfbmFtZV9sZW4sIENBU0VfU0VOU0lUSVZFLAorCQkJCXZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pKQorCQkJYnJlYWs7CisJCWN0eC0+YXR0ciA9IGE7CisJCS8qCisJCSAqIElmIG5vIEB2YWwgc3BlY2lmaWVkIG9yIEB2YWwgc3BlY2lmaWVkIGFuZCBpdCBtYXRjaGVzLCB3ZQorCQkgKiBoYXZlIGZvdW5kIGl0IQorCQkgKi8KKwkJaWYgKCF2YWwgfHwgKCFhLT5ub25fcmVzaWRlbnQgJiYgbGUzMl90b19jcHUoCisJCQkJYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpID09IHZhbF9sZW4gJiYKKwkJCQkhbWVtY21wKCh1OCopYSArCisJCQkJbGUxNl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpLAorCQkJCXZhbCwgdmFsX2xlbikpKSB7CisJCQludGZzX2RlYnVnKCJEb25lLCBmb3VuZC4iKTsKKwkJCXJldHVybiAwOworCQl9Citkb19uZXh0X2F0dHI6CisJCS8qIFByb2NlZWQgdG8gdGhlIG5leHQgYXR0cmlidXRlIGluIHRoZSBjdXJyZW50IG1mdCByZWNvcmQuICovCisJCWEgPSAoQVRUUl9SRUNPUkQqKSgodTgqKWEgKyBsZTMyX3RvX2NwdShhLT5sZW5ndGgpKTsKKwkJZ290byBkb19uZXh0X2F0dHJfbG9vcDsKKwl9CisJaWYgKCFlcnIpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiQmFzZSBpbm9kZSAweCVseCBjb250YWlucyBjb3JydXB0ICIKKwkJCQkiYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlLiVzIiwgYmFzZV9uaS0+bWZ0X25vLAorCQkJCWVzKTsKKwkJZXJyID0gLUVJTzsKKwl9CisJaWYgKG5pICE9IGJhc2VfbmkpIHsKKwkJaWYgKG5pKQorCQkJdW5tYXBfZXh0ZW50X21mdF9yZWNvcmQobmkpOworCQljdHgtPm50ZnNfaW5vID0gYmFzZV9uaTsKKwkJY3R4LT5tcmVjID0gY3R4LT5iYXNlX21yZWM7CisJCWN0eC0+YXR0ciA9IGN0eC0+YmFzZV9hdHRyOworCX0KKwlpZiAoZXJyICE9IC1FTk9NRU0pCisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwlyZXR1cm4gZXJyOworbm90X2ZvdW5kOgorCS8qCisJICogSWYgd2Ugd2VyZSBsb29raW5nIGZvciBBVF9FTkQsIHdlIHJlc2V0IHRoZSBzZWFyY2ggY29udGV4dCBAY3R4IGFuZAorCSAqIHVzZSBudGZzX2F0dHJfZmluZCgpIHRvIHNlZWsgdG8gdGhlIGVuZCBvZiB0aGUgYmFzZSBtZnQgcmVjb3JkLgorCSAqLworCWlmICh0eXBlID09IEFUX0VORCkgeworCQludGZzX2F0dHJfcmVpbml0X3NlYXJjaF9jdHgoY3R4KTsKKwkJcmV0dXJuIG50ZnNfYXR0cl9maW5kKEFUX0VORCwgbmFtZSwgbmFtZV9sZW4sIGljLCB2YWwsIHZhbF9sZW4sCisJCQkJY3R4KTsKKwl9CisJLyoKKwkgKiBUaGUgYXR0cmlidXRlIHdhcyBub3QgZm91bmQuICBCZWZvcmUgd2UgcmV0dXJuLCB3ZSB3YW50IHRvIGVuc3VyZQorCSAqIEBjdHgtPm1yZWMgYW5kIEBjdHgtPmF0dHIgaW5kaWNhdGUgdGhlIHBvc2l0aW9uIGF0IHdoaWNoIHRoZQorCSAqIGF0dHJpYnV0ZSBzaG91bGQgYmUgaW5zZXJ0ZWQgaW4gdGhlIGJhc2UgbWZ0IHJlY29yZC4gIFNpbmNlIHdlIGFsc28KKwkgKiB3YW50IHRvIHByZXNlcnZlIEBjdHgtPmFsX2VudHJ5IHdlIGNhbm5vdCByZWluaXRpYWxpemUgdGhlIHNlYXJjaAorCSAqIGNvbnRleHQgdXNpbmcgbnRmc19hdHRyX3JlaW5pdF9zZWFyY2hfY3R4KCkgYXMgdGhpcyB3b3VsZCBzZXQKKwkgKiBAY3R4LT5hbF9lbnRyeSB0byBOVUxMLiAgVGh1cyB3ZSBkbyB0aGUgbmVjZXNzYXJ5IGJpdHMgbWFudWFsbHkgKHNlZQorCSAqIG50ZnNfYXR0cl9pbml0X3NlYXJjaF9jdHgoKSBiZWxvdykuICBOb3RlLCB3ZSBfb25seV8gcHJlc2VydmUKKwkgKiBAY3R4LT5hbF9lbnRyeSBhcyB0aGUgcmVtYWluaW5nIGZpZWxkcyAoYmFzZV8qKSBhcmUgaWRlbnRpY2FsIHRvCisJICogdGhlaXIgbm9uIGJhc2VfIGNvdW50ZXJwYXJ0cyBhbmQgd2UgY2Fubm90IHNldCBAY3R4LT5iYXNlX2F0dHIKKwkgKiBjb3JyZWN0bHkgeWV0IGFzIHdlIGRvIG5vdCBrbm93IHdoYXQgQGN0eC0+YXR0ciB3aWxsIGJlIHNldCB0byBieQorCSAqIHRoZSBjYWxsIHRvIG50ZnNfYXR0cl9maW5kKCkgYmVsb3cuCisJICovCisJaWYgKG5pICE9IGJhc2VfbmkpCisJCXVubWFwX2V4dGVudF9tZnRfcmVjb3JkKG5pKTsKKwljdHgtPm1yZWMgPSBjdHgtPmJhc2VfbXJlYzsKKwljdHgtPmF0dHIgPSAoQVRUUl9SRUNPUkQqKSgodTgqKWN0eC0+bXJlYyArCisJCQlsZTE2X3RvX2NwdShjdHgtPm1yZWMtPmF0dHJzX29mZnNldCkpOworCWN0eC0+aXNfZmlyc3QgPSBUUlVFOworCWN0eC0+bnRmc19pbm8gPSBiYXNlX25pOworCWN0eC0+YmFzZV9udGZzX2lubyA9IE5VTEw7CisJY3R4LT5iYXNlX21yZWMgPSBOVUxMOworCWN0eC0+YmFzZV9hdHRyID0gTlVMTDsKKwkvKgorCSAqIEluIGNhc2UgdGhlcmUgYXJlIG11bHRpcGxlIG1hdGNoZXMgaW4gdGhlIGJhc2UgbWZ0IHJlY29yZCwgbmVlZCB0bworCSAqIGtlZXAgZW51bWVyYXRpbmcgdW50aWwgd2UgZ2V0IGFuIGF0dHJpYnV0ZSBub3QgZm91bmQgcmVzcG9uc2UgKG9yCisJICogYW5vdGhlciBlcnJvciksIG90aGVyd2lzZSB3ZSB3b3VsZCBrZWVwIHJldHVybmluZyB0aGUgc2FtZSBhdHRyaWJ1dGUKKwkgKiBvdmVyIGFuZCBvdmVyIGFnYWluIGFuZCBhbGwgcHJvZ3JhbXMgdXNpbmcgdXMgZm9yIGVudW1lcmF0aW9uIHdvdWxkCisJICogbG9jayB1cCBpbiBhIHRpZ2h0IGxvb3AuCisJICovCisJZG8geworCQllcnIgPSBudGZzX2F0dHJfZmluZCh0eXBlLCBuYW1lLCBuYW1lX2xlbiwgaWMsIHZhbCwgdmFsX2xlbiwKKwkJCQljdHgpOworCX0gd2hpbGUgKCFlcnIpOworCW50ZnNfZGVidWcoIkRvbmUsIG5vdCBmb3VuZC4iKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIG50ZnNfYXR0cl9sb29rdXAgLSBmaW5kIGFuIGF0dHJpYnV0ZSBpbiBhbiBudGZzIGlub2RlCisgKiBAdHlwZToJYXR0cmlidXRlIHR5cGUgdG8gZmluZAorICogQG5hbWU6CWF0dHJpYnV0ZSBuYW1lIHRvIGZpbmQgKG9wdGlvbmFsLCBpLmUuIE5VTEwgbWVhbnMgZG9uJ3QgY2FyZSkKKyAqIEBuYW1lX2xlbjoJYXR0cmlidXRlIG5hbWUgbGVuZ3RoIChvbmx5IG5lZWRlZCBpZiBAbmFtZSBwcmVzZW50KQorICogQGljOgkJSUdOT1JFX0NBU0Ugb3IgQ0FTRV9TRU5TSVRJVkUgKGlnbm9yZWQgaWYgQG5hbWUgbm90IHByZXNlbnQpCisgKiBAbG93ZXN0X3ZjbjoJbG93ZXN0IHZjbiB0byBmaW5kIChvcHRpb25hbCwgbm9uLXJlc2lkZW50IGF0dHJpYnV0ZXMgb25seSkKKyAqIEB2YWw6CWF0dHJpYnV0ZSB2YWx1ZSB0byBmaW5kIChvcHRpb25hbCwgcmVzaWRlbnQgYXR0cmlidXRlcyBvbmx5KQorICogQHZhbF9sZW46CWF0dHJpYnV0ZSB2YWx1ZSBsZW5ndGgKKyAqIEBjdHg6CXNlYXJjaCBjb250ZXh0IHdpdGggbWZ0IHJlY29yZCBhbmQgYXR0cmlidXRlIHRvIHNlYXJjaCBmcm9tCisgKgorICogRmluZCBhbiBhdHRyaWJ1dGUgaW4gYW4gbnRmcyBpbm9kZS4gIE9uIGZpcnN0IHNlYXJjaCBAY3R4LT5udGZzX2lubyBtdXN0CisgKiBiZSB0aGUgYmFzZSBtZnQgcmVjb3JkIGFuZCBAY3R4IG11c3QgaGF2ZSBiZWVuIG9idGFpbmVkIGZyb20gYSBjYWxsIHRvCisgKiBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoKS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRyYW5zcGFyZW50bHkgaGFuZGxlcyBhdHRyaWJ1dGUgbGlzdHMgYW5kIEBjdHggaXMgdXNlZCB0bworICogY29udGludWUgc2VhcmNoZXMgd2hlcmUgdGhleSB3ZXJlIGxlZnQgb2ZmIGF0LgorICoKKyAqIEFmdGVyIGZpbmlzaGluZyB3aXRoIHRoZSBhdHRyaWJ1dGUvbWZ0IHJlY29yZCB5b3UgbmVlZCB0byBjYWxsCisgKiBudGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoKSB0byBjbGVhbnVwIHRoZSBzZWFyY2ggY29udGV4dCAodW5tYXBwaW5nIGFueQorICogbWFwcGVkIGlub2RlcywgZXRjKS4KKyAqCisgKiBSZXR1cm4gMCBpZiB0aGUgc2VhcmNoIHdhcyBzdWNjZXNzZnVsIGFuZCAtZXJybm8gaWYgbm90LgorICoKKyAqIFdoZW4gMCwgQGN0eC0+YXR0ciBpcyB0aGUgZm91bmQgYXR0cmlidXRlIGFuZCBpdCBpcyBpbiBtZnQgcmVjb3JkCisgKiBAY3R4LT5tcmVjLiAgSWYgYW4gYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlIGlzIHByZXNlbnQsIEBjdHgtPmFsX2VudHJ5IGlzCisgKiB0aGUgYXR0cmlidXRlIGxpc3QgZW50cnkgb2YgdGhlIGZvdW5kIGF0dHJpYnV0ZS4KKyAqCisgKiBXaGVuIC1FTk9FTlQsIEBjdHgtPmF0dHIgaXMgdGhlIGF0dHJpYnV0ZSB3aGljaCBjb2xsYXRlcyBqdXN0IGFmdGVyIHRoZQorICogYXR0cmlidXRlIGJlaW5nIHNlYXJjaGVkIGZvciwgaS5lLiBpZiBvbmUgd2FudHMgdG8gYWRkIHRoZSBhdHRyaWJ1dGUgdG8gdGhlCisgKiBtZnQgcmVjb3JkIHRoaXMgaXMgdGhlIGNvcnJlY3QgcGxhY2UgdG8gaW5zZXJ0IGl0IGludG8uICBJZiBhbiBhdHRyaWJ1dGUKKyAqIGxpc3QgYXR0cmlidXRlIGlzIHByZXNlbnQsIEBjdHgtPmFsX2VudHJ5IGlzIHRoZSBhdHRyaWJ1dGUgbGlzdCBlbnRyeSB3aGljaAorICogY29sbGF0ZXMganVzdCBhZnRlciB0aGUgYXR0cmlidXRlIGxpc3QgZW50cnkgb2YgdGhlIGF0dHJpYnV0ZSBiZWluZyBzZWFyY2hlZAorICogZm9yLCBpLmUuIGlmIG9uZSB3YW50cyB0byBhZGQgdGhlIGF0dHJpYnV0ZSB0byB0aGUgbWZ0IHJlY29yZCB0aGlzIGlzIHRoZQorICogY29ycmVjdCBwbGFjZSB0byBpbnNlcnQgaXRzIGF0dHJpYnV0ZSBsaXN0IGVudHJ5IGludG8uCisgKgorICogV2hlbiAtZXJybm8gIT0gLUVOT0VOVCwgYW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgdGhlIGxvb2t1cC4gIEBjdHgtPmF0dHIgaXMKKyAqIHRoZW4gdW5kZWZpbmVkIGFuZCBpbiBwYXJ0aWN1bGFyIHlvdSBzaG91bGQgbm90IHJlbHkgb24gaXQgbm90IGNoYW5naW5nLgorICovCitpbnQgbnRmc19hdHRyX2xvb2t1cChjb25zdCBBVFRSX1RZUEUgdHlwZSwgY29uc3QgbnRmc2NoYXIgKm5hbWUsCisJCWNvbnN0IHUzMiBuYW1lX2xlbiwgY29uc3QgSUdOT1JFX0NBU0VfQk9PTCBpYywKKwkJY29uc3QgVkNOIGxvd2VzdF92Y24sIGNvbnN0IHU4ICp2YWwsIGNvbnN0IHUzMiB2YWxfbGVuLAorCQludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4KQoreworCW50ZnNfaW5vZGUgKmJhc2Vfbmk7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlpZiAoY3R4LT5iYXNlX250ZnNfaW5vKQorCQliYXNlX25pID0gY3R4LT5iYXNlX250ZnNfaW5vOworCWVsc2UKKwkJYmFzZV9uaSA9IGN0eC0+bnRmc19pbm87CisJLyogU2FuaXR5IGNoZWNrLCBqdXN0IGZvciBkZWJ1Z2dpbmcgcmVhbGx5LiAqLworCUJVR19PTighYmFzZV9uaSk7CisJaWYgKCFOSW5vQXR0ckxpc3QoYmFzZV9uaSkgfHwgdHlwZSA9PSBBVF9BVFRSSUJVVEVfTElTVCkKKwkJcmV0dXJuIG50ZnNfYXR0cl9maW5kKHR5cGUsIG5hbWUsIG5hbWVfbGVuLCBpYywgdmFsLCB2YWxfbGVuLAorCQkJCWN0eCk7CisJcmV0dXJuIG50ZnNfZXh0ZXJuYWxfYXR0cl9maW5kKHR5cGUsIG5hbWUsIG5hbWVfbGVuLCBpYywgbG93ZXN0X3ZjbiwKKwkJCXZhbCwgdmFsX2xlbiwgY3R4KTsKK30KKworLyoqCisgKiBudGZzX2F0dHJfaW5pdF9zZWFyY2hfY3R4IC0gaW5pdGlhbGl6ZSBhbiBhdHRyaWJ1dGUgc2VhcmNoIGNvbnRleHQKKyAqIEBjdHg6CWF0dHJpYnV0ZSBzZWFyY2ggY29udGV4dCB0byBpbml0aWFsaXplCisgKiBAbmk6CQludGZzIGlub2RlIHdpdGggd2hpY2ggdG8gaW5pdGlhbGl6ZSB0aGUgc2VhcmNoIGNvbnRleHQKKyAqIEBtcmVjOgltZnQgcmVjb3JkIHdpdGggd2hpY2ggdG8gaW5pdGlhbGl6ZSB0aGUgc2VhcmNoIGNvbnRleHQKKyAqCisgKiBJbml0aWFsaXplIHRoZSBhdHRyaWJ1dGUgc2VhcmNoIGNvbnRleHQgQGN0eCB3aXRoIEBuaSBhbmQgQG1yZWMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBudGZzX2F0dHJfaW5pdF9zZWFyY2hfY3R4KG50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHgsCisJCW50ZnNfaW5vZGUgKm5pLCBNRlRfUkVDT1JEICptcmVjKQoreworCWN0eC0+bXJlYyA9IG1yZWM7CisJLyogU2FuaXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGVsc2V3aGVyZS4gKi8KKwljdHgtPmF0dHIgPSAoQVRUUl9SRUNPUkQqKSgodTgqKW1yZWMgKyBsZTE2X3RvX2NwdShtcmVjLT5hdHRyc19vZmZzZXQpKTsKKwljdHgtPmlzX2ZpcnN0ID0gVFJVRTsKKwljdHgtPm50ZnNfaW5vID0gbmk7CisJY3R4LT5hbF9lbnRyeSA9IE5VTEw7CisJY3R4LT5iYXNlX250ZnNfaW5vID0gTlVMTDsKKwljdHgtPmJhc2VfbXJlYyA9IE5VTEw7CisJY3R4LT5iYXNlX2F0dHIgPSBOVUxMOworfQorCisvKioKKyAqIG50ZnNfYXR0cl9yZWluaXRfc2VhcmNoX2N0eCAtIHJlaW5pdGlhbGl6ZSBhbiBhdHRyaWJ1dGUgc2VhcmNoIGNvbnRleHQKKyAqIEBjdHg6CWF0dHJpYnV0ZSBzZWFyY2ggY29udGV4dCB0byByZWluaXRpYWxpemUKKyAqCisgKiBSZWluaXRpYWxpemUgdGhlIGF0dHJpYnV0ZSBzZWFyY2ggY29udGV4dCBAY3R4LCB1bm1hcHBpbmcgYW4gYXNzb2NpYXRlZAorICogZXh0ZW50IG1mdCByZWNvcmQgaWYgcHJlc2VudCwgYW5kIGluaXRpYWxpemUgdGhlIHNlYXJjaCBjb250ZXh0IGFnYWluLgorICoKKyAqIFRoaXMgaXMgdXNlZCB3aGVuIGEgc2VhcmNoIGZvciBhIG5ldyBhdHRyaWJ1dGUgaXMgYmVpbmcgc3RhcnRlZCB0byByZXNldAorICogdGhlIHNlYXJjaCBjb250ZXh0IHRvIHRoZSBiZWdpbm5pbmcuCisgKi8KK3ZvaWQgbnRmc19hdHRyX3JlaW5pdF9zZWFyY2hfY3R4KG50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHgpCit7CisJaWYgKGxpa2VseSghY3R4LT5iYXNlX250ZnNfaW5vKSkgeworCQkvKiBObyBhdHRyaWJ1dGUgbGlzdC4gKi8KKwkJY3R4LT5pc19maXJzdCA9IFRSVUU7CisJCS8qIFNhbml0eSBjaGVja3MgYXJlIHBlcmZvcm1lZCBlbHNld2hlcmUuICovCisJCWN0eC0+YXR0ciA9IChBVFRSX1JFQ09SRCopKCh1OCopY3R4LT5tcmVjICsKKwkJCQlsZTE2X3RvX2NwdShjdHgtPm1yZWMtPmF0dHJzX29mZnNldCkpOworCQkvKgorCQkgKiBUaGlzIG5lZWRzIHJlc2V0dGluZyBkdWUgdG8gbnRmc19leHRlcm5hbF9hdHRyX2ZpbmQoKSB3aGljaAorCQkgKiBjYW4gbGVhdmUgaXQgc2V0IGRlc3BpdGUgaGF2aW5nIHplcm9lZCBjdHgtPmJhc2VfbnRmc19pbm8uCisJCSAqLworCQljdHgtPmFsX2VudHJ5ID0gTlVMTDsKKwkJcmV0dXJuOworCX0gLyogQXR0cmlidXRlIGxpc3QuICovCisJaWYgKGN0eC0+bnRmc19pbm8gIT0gY3R4LT5iYXNlX250ZnNfaW5vKQorCQl1bm1hcF9leHRlbnRfbWZ0X3JlY29yZChjdHgtPm50ZnNfaW5vKTsKKwludGZzX2F0dHJfaW5pdF9zZWFyY2hfY3R4KGN0eCwgY3R4LT5iYXNlX250ZnNfaW5vLCBjdHgtPmJhc2VfbXJlYyk7CisJcmV0dXJuOworfQorCisvKioKKyAqIG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eCAtIGFsbG9jYXRlL2luaXRpYWxpemUgYSBuZXcgYXR0cmlidXRlIHNlYXJjaCBjb250ZXh0CisgKiBAbmk6CQludGZzIGlub2RlIHdpdGggd2hpY2ggdG8gaW5pdGlhbGl6ZSB0aGUgc2VhcmNoIGNvbnRleHQKKyAqIEBtcmVjOgltZnQgcmVjb3JkIHdpdGggd2hpY2ggdG8gaW5pdGlhbGl6ZSB0aGUgc2VhcmNoIGNvbnRleHQKKyAqCisgKiBBbGxvY2F0ZSBhIG5ldyBhdHRyaWJ1dGUgc2VhcmNoIGNvbnRleHQsIGluaXRpYWxpemUgaXQgd2l0aCBAbmkgYW5kIEBtcmVjLAorICogYW5kIHJldHVybiBpdC4gUmV0dXJuIE5VTEwgaWYgYWxsb2NhdGlvbiBmYWlsZWQuCisgKi8KK250ZnNfYXR0cl9zZWFyY2hfY3R4ICpudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgobnRmc19pbm9kZSAqbmksIE1GVF9SRUNPUkQgKm1yZWMpCit7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKworCWN0eCA9IGttZW1fY2FjaGVfYWxsb2MobnRmc19hdHRyX2N0eF9jYWNoZSwgU0xBQl9OT0ZTKTsKKwlpZiAoY3R4KQorCQludGZzX2F0dHJfaW5pdF9zZWFyY2hfY3R4KGN0eCwgbmksIG1yZWMpOworCXJldHVybiBjdHg7Cit9CisKKy8qKgorICogbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4IC0gcmVsZWFzZSBhbiBhdHRyaWJ1dGUgc2VhcmNoIGNvbnRleHQKKyAqIEBjdHg6CWF0dHJpYnV0ZSBzZWFyY2ggY29udGV4dCB0byBmcmVlCisgKgorICogUmVsZWFzZSB0aGUgYXR0cmlidXRlIHNlYXJjaCBjb250ZXh0IEBjdHgsIHVubWFwcGluZyBhbiBhc3NvY2lhdGVkIGV4dGVudAorICogbWZ0IHJlY29yZCBpZiBwcmVzZW50LgorICovCit2b2lkIG50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChudGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4KQoreworCWlmIChjdHgtPmJhc2VfbnRmc19pbm8gJiYgY3R4LT5udGZzX2lubyAhPSBjdHgtPmJhc2VfbnRmc19pbm8pCisJCXVubWFwX2V4dGVudF9tZnRfcmVjb3JkKGN0eC0+bnRmc19pbm8pOworCWttZW1fY2FjaGVfZnJlZShudGZzX2F0dHJfY3R4X2NhY2hlLCBjdHgpOworCXJldHVybjsKK30KKworLyoqCisgKiBudGZzX2F0dHJfZmluZF9pbl9hdHRyZGVmIC0gZmluZCBhbiBhdHRyaWJ1dGUgaW4gdGhlICRBdHRyRGVmIHN5c3RlbSBmaWxlCisgKiBAdm9sOgludGZzIHZvbHVtZSB0byB3aGljaCB0aGUgYXR0cmlidXRlIGJlbG9uZ3MKKyAqIEB0eXBlOglhdHRyaWJ1dGUgdHlwZSB3aGljaCB0byBmaW5kCisgKgorICogU2VhcmNoIGZvciB0aGUgYXR0cmlidXRlIGRlZmluaXRpb24gcmVjb3JkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGF0dHJpYnV0ZQorICogQHR5cGUgaW4gdGhlICRBdHRyRGVmIHN5c3RlbSBmaWxlLgorICoKKyAqIFJldHVybiB0aGUgYXR0cmlidXRlIHR5cGUgZGVmaW5pdGlvbiByZWNvcmQgaWYgZm91bmQgYW5kIE5VTEwgaWYgbm90IGZvdW5kLgorICovCitzdGF0aWMgQVRUUl9ERUYgKm50ZnNfYXR0cl9maW5kX2luX2F0dHJkZWYoY29uc3QgbnRmc192b2x1bWUgKnZvbCwKKwkJY29uc3QgQVRUUl9UWVBFIHR5cGUpCit7CisJQVRUUl9ERUYgKmFkOworCisJQlVHX09OKCF2b2wtPmF0dHJkZWYpOworCUJVR19PTighdHlwZSk7CisJZm9yIChhZCA9IHZvbC0+YXR0cmRlZjsgKHU4KilhZCAtICh1OCopdm9sLT5hdHRyZGVmIDwKKwkJCXZvbC0+YXR0cmRlZl9zaXplICYmIGFkLT50eXBlOyArK2FkKSB7CisJCS8qIFdlIGhhdmUgbm90IGZvdW5kIGl0IHlldCwgY2Fycnkgb24gc2VhcmNoaW5nLiAqLworCQlpZiAobGlrZWx5KGxlMzJfdG9fY3B1KGFkLT50eXBlKSA8IGxlMzJfdG9fY3B1KHR5cGUpKSkKKwkJCWNvbnRpbnVlOworCQkvKiBXZSBmb3VuZCB0aGUgYXR0cmlidXRlOyByZXR1cm4gaXQuICovCisJCWlmIChsaWtlbHkoYWQtPnR5cGUgPT0gdHlwZSkpCisJCQlyZXR1cm4gYWQ7CisJCS8qIFdlIGhhdmUgZ29uZSB0b28gZmFyIGFscmVhZHkuICBObyBwb2ludCBpbiBjb250aW51aW5nLiAqLworCQlicmVhazsKKwl9CisJLyogQXR0cmlidXRlIG5vdCBmb3VuZC4gKi8KKwludGZzX2RlYnVnKCJBdHRyaWJ1dGUgdHlwZSAweCV4IG5vdCBmb3VuZCBpbiAkQXR0ckRlZi4iLAorCQkJbGUzMl90b19jcHUodHlwZSkpOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIG50ZnNfYXR0cl9zaXplX2JvdW5kc19jaGVjayAtIGNoZWNrIGEgc2l6ZSBvZiBhbiBhdHRyaWJ1dGUgdHlwZSBmb3IgdmFsaWRpdHkKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIHRvIHdoaWNoIHRoZSBhdHRyaWJ1dGUgYmVsb25ncworICogQHR5cGU6CWF0dHJpYnV0ZSB0eXBlIHdoaWNoIHRvIGNoZWNrCisgKiBAc2l6ZToJc2l6ZSB3aGljaCB0byBjaGVjaworICoKKyAqIENoZWNrIHdoZXRoZXIgdGhlIEBzaXplIGluIGJ5dGVzIGlzIHZhbGlkIGZvciBhbiBhdHRyaWJ1dGUgb2YgQHR5cGUgb24gdGhlCisgKiBudGZzIHZvbHVtZSBAdm9sLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBvYnRhaW5lZCBmcm9tICRBdHRyRGVmIHN5c3RlbSBmaWxlLgorICoKKyAqIFJldHVybiAwIGlmIHZhbGlkLCAtRVJBTkdFIGlmIG5vdCB2YWxpZCwgb3IgLUVOT0VOVCBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdAorICogbGlzdGVkIGluICRBdHRyRGVmLgorICovCitpbnQgbnRmc19hdHRyX3NpemVfYm91bmRzX2NoZWNrKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsIGNvbnN0IEFUVFJfVFlQRSB0eXBlLAorCQljb25zdCBzNjQgc2l6ZSkKK3sKKwlBVFRSX0RFRiAqYWQ7CisKKwlCVUdfT04oc2l6ZSA8IDApOworCS8qCisJICogJEFUVFJJQlVURV9MSVNUIGhhcyBhIG1heGltdW0gc2l6ZSBvZiAyNTZraUIsIGJ1dCB0aGlzIGlzIG5vdAorCSAqIGxpc3RlZCBpbiAkQXR0ckRlZi4KKwkgKi8KKwlpZiAodW5saWtlbHkodHlwZSA9PSBBVF9BVFRSSUJVVEVfTElTVCAmJiBzaXplID4gMjU2ICogMTAyNCkpCisJCXJldHVybiAtRVJBTkdFOworCS8qIEdldCB0aGUgJEF0dHJEZWYgZW50cnkgZm9yIHRoZSBhdHRyaWJ1dGUgQHR5cGUuICovCisJYWQgPSBudGZzX2F0dHJfZmluZF9pbl9hdHRyZGVmKHZvbCwgdHlwZSk7CisJaWYgKHVubGlrZWx5KCFhZCkpCisJCXJldHVybiAtRU5PRU5UOworCS8qIERvIHRoZSBib3VuZHMgY2hlY2suICovCisJaWYgKCgoc2xlNjRfdG9fY3B1KGFkLT5taW5fc2l6ZSkgPiAwKSAmJgorCQkJc2l6ZSA8IHNsZTY0X3RvX2NwdShhZC0+bWluX3NpemUpKSB8fAorCQkJKChzbGU2NF90b19jcHUoYWQtPm1heF9zaXplKSA+IDApICYmIHNpemUgPgorCQkJc2xlNjRfdG9fY3B1KGFkLT5tYXhfc2l6ZSkpKQorCQlyZXR1cm4gLUVSQU5HRTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBudGZzX2F0dHJfY2FuX2JlX25vbl9yZXNpZGVudCAtIGNoZWNrIGlmIGFuIGF0dHJpYnV0ZSBjYW4gYmUgbm9uLXJlc2lkZW50CisgKiBAdm9sOgludGZzIHZvbHVtZSB0byB3aGljaCB0aGUgYXR0cmlidXRlIGJlbG9uZ3MKKyAqIEB0eXBlOglhdHRyaWJ1dGUgdHlwZSB3aGljaCB0byBjaGVjaworICoKKyAqIENoZWNrIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBvZiBAdHlwZSBvbiB0aGUgbnRmcyB2b2x1bWUgQHZvbCBpcyBhbGxvd2VkIHRvCisgKiBiZSBub24tcmVzaWRlbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIG9idGFpbmVkIGZyb20gJEF0dHJEZWYgc3lzdGVtIGZpbGUuCisgKgorICogUmV0dXJuIDAgaWYgdGhlIGF0dHJpYnV0ZSBpcyBhbGxvd2VkIHRvIGJlIG5vbi1yZXNpZGVudCwgLUVQRVJNIGlmIG5vdCwgb3IKKyAqIC1FTk9FTlQgaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgbGlzdGVkIGluICRBdHRyRGVmLgorICovCitpbnQgbnRmc19hdHRyX2Nhbl9iZV9ub25fcmVzaWRlbnQoY29uc3QgbnRmc192b2x1bWUgKnZvbCwgY29uc3QgQVRUUl9UWVBFIHR5cGUpCit7CisJQVRUUl9ERUYgKmFkOworCisJLyoKKwkgKiAkREFUQSBpcyBhbHdheXMgYWxsb3dlZCB0byBiZSBub24tcmVzaWRlbnQgZXZlbiBpZiAkQXR0ckRlZiBkb2VzIG5vdAorCSAqIHNwZWNpZnkgdGhpcyBpbiB0aGUgZmxhZ3Mgb2YgdGhlICREQVRBIGF0dHJpYnV0ZSBkZWZpbml0aW9uIHJlY29yZC4KKwkgKi8KKwlpZiAodHlwZSA9PSBBVF9EQVRBKQorCQlyZXR1cm4gMDsKKwkvKiBGaW5kIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiByZWNvcmQgaW4gJEF0dHJEZWYuICovCisJYWQgPSBudGZzX2F0dHJfZmluZF9pbl9hdHRyZGVmKHZvbCwgdHlwZSk7CisJaWYgKHVubGlrZWx5KCFhZCkpCisJCXJldHVybiAtRU5PRU5UOworCS8qIENoZWNrIHRoZSBmbGFncyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuICovCisJaWYgKGFkLT5mbGFncyAmIENBTl9CRV9OT05fUkVTSURFTlQpCisJCXJldHVybiAwOworCXJldHVybiAtRVBFUk07Cit9CisKKy8qKgorICogbnRmc19hdHRyX2Nhbl9iZV9yZXNpZGVudCAtIGNoZWNrIGlmIGFuIGF0dHJpYnV0ZSBjYW4gYmUgcmVzaWRlbnQKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIHRvIHdoaWNoIHRoZSBhdHRyaWJ1dGUgYmVsb25ncworICogQHR5cGU6CWF0dHJpYnV0ZSB0eXBlIHdoaWNoIHRvIGNoZWNrCisgKgorICogQ2hlY2sgd2hldGhlciB0aGUgYXR0cmlidXRlIG9mIEB0eXBlIG9uIHRoZSBudGZzIHZvbHVtZSBAdm9sIGlzIGFsbG93ZWQgdG8KKyAqIGJlIHJlc2lkZW50LiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBkZXJpdmVkIGZyb20gb3VyIG50ZnMga25vd2xlZGdlIGFuZCBtYXkKKyAqIG5vdCBiZSBjb21wbGV0ZWx5IGFjY3VyYXRlLCBlc3BlY2lhbGx5IHdoZW4gdXNlciBkZWZpbmVkIGF0dHJpYnV0ZXMgYXJlCisgKiBwcmVzZW50LiAgQmFzaWNhbGx5IHdlIGFsbG93IGV2ZXJ5dGhpbmcgdG8gYmUgcmVzaWRlbnQgZXhjZXB0IGZvciBpbmRleAorICogYWxsb2NhdGlvbiBhbmQgJEVBIGF0dHJpYnV0ZXMuCisgKgorICogUmV0dXJuIDAgaWYgdGhlIGF0dHJpYnV0ZSBpcyBhbGxvd2VkIHRvIGJlIG5vbi1yZXNpZGVudCBhbmQgLUVQRVJNIGlmIG5vdC4KKyAqCisgKiBXYXJuaW5nOiBJbiB0aGUgc3lzdGVtIGZpbGUgJE1GVCB0aGUgYXR0cmlidXRlICRCaXRtYXAgbXVzdCBiZSBub24tcmVzaWRlbnQKKyAqCSAgICBvdGhlcndpc2Ugd2luZG93cyB3aWxsIG5vdCBib290IChibHVlIHNjcmVlbiBvZiBkZWF0aCkhICBXZSBjYW5ub3QKKyAqCSAgICBjaGVjayBmb3IgdGhpcyBoZXJlIGFzIHdlIGRvIG5vdCBrbm93IHdoaWNoIGlub2RlJ3MgJEJpdG1hcCBpcworICoJICAgIGJlaW5nIGFza2VkIGFib3V0IHNvIHRoZSBjYWxsZXIgbmVlZHMgdG8gc3BlY2lhbCBjYXNlIHRoaXMuCisgKi8KK2ludCBudGZzX2F0dHJfY2FuX2JlX3Jlc2lkZW50KGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsIGNvbnN0IEFUVFJfVFlQRSB0eXBlKQoreworCWlmICh0eXBlICE9IEFUX0lOREVYX0FMTE9DQVRJT04gJiYgdHlwZSAhPSBBVF9FQSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FUEVSTTsKK30KKworLyoqCisgKiBudGZzX2F0dHJfcmVjb3JkX3Jlc2l6ZSAtIHJlc2l6ZSBhbiBhdHRyaWJ1dGUgcmVjb3JkCisgKiBAbToJCW1mdCByZWNvcmQgY29udGFpbmluZyBhdHRyaWJ1dGUgcmVjb3JkCisgKiBAYToJCWF0dHJpYnV0ZSByZWNvcmQgdG8gcmVzaXplCisgKiBAbmV3X3NpemU6CW5ldyBzaXplIGluIGJ5dGVzIHRvIHdoaWNoIHRvIHJlc2l6ZSB0aGUgYXR0cmlidXRlIHJlY29yZCBAYQorICoKKyAqIFJlc2l6ZSB0aGUgYXR0cmlidXRlIHJlY29yZCBAYSwgaS5lLiB0aGUgcmVzaWRlbnQgcGFydCBvZiB0aGUgYXR0cmlidXRlLCBpbgorICogdGhlIG1mdCByZWNvcmQgQG0gdG8gQG5ld19zaXplIGJ5dGVzLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4gIFRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXMgYXJlCisgKiBkZWZpbmVkOgorICoJLUVOT1NQQwktIE5vdCBlbm91Z2ggc3BhY2UgaW4gdGhlIG1mdCByZWNvcmQgQG0gdG8gcGVyZm9ybSB0aGUgcmVzaXplLgorICoKKyAqIE5vdGU6IE9uIGVycm9yLCBubyBtb2RpZmljYXRpb25zIGhhdmUgYmVlbiBwZXJmb3JtZWQgd2hhdHNvZXZlci4KKyAqCisgKiBXYXJuaW5nOiBJZiB5b3UgbWFrZSBhIHJlY29yZCBzbWFsbGVyIHdpdGhvdXQgaGF2aW5nIGNvcGllZCBhbGwgdGhlIGRhdGEgeW91CisgKgkgICAgYXJlIGludGVyZXN0ZWQgaW4gdGhlIGRhdGEgbWF5IGJlIG92ZXJ3cml0dGVuLgorICovCitpbnQgbnRmc19hdHRyX3JlY29yZF9yZXNpemUoTUZUX1JFQ09SRCAqbSwgQVRUUl9SRUNPUkQgKmEsIHUzMiBuZXdfc2l6ZSkKK3sKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgbmV3X3NpemUgJXUuIiwgbmV3X3NpemUpOworCS8qIEFsaWduIHRvIDggYnl0ZXMgaWYgaXQgaXMgbm90IGFscmVhZHkgZG9uZS4gKi8KKwlpZiAobmV3X3NpemUgJiA3KQorCQluZXdfc2l6ZSA9IChuZXdfc2l6ZSArIDcpICYgfjc7CisJLyogSWYgdGhlIGFjdHVhbCBhdHRyaWJ1dGUgbGVuZ3RoIGhhcyBjaGFuZ2VkLCBtb3ZlIHRoaW5ncyBhcm91bmQuICovCisJaWYgKG5ld19zaXplICE9IGxlMzJfdG9fY3B1KGEtPmxlbmd0aCkpIHsKKwkJdTMyIG5ld19tdXNlID0gbGUzMl90b19jcHUobS0+Ynl0ZXNfaW5fdXNlKSAtCisJCQkJbGUzMl90b19jcHUoYS0+bGVuZ3RoKSArIG5ld19zaXplOworCQkvKiBOb3QgZW5vdWdoIHNwYWNlIGluIHRoaXMgbWZ0IHJlY29yZC4gKi8KKwkJaWYgKG5ld19tdXNlID4gbGUzMl90b19jcHUobS0+Ynl0ZXNfYWxsb2NhdGVkKSkKKwkJCXJldHVybiAtRU5PU1BDOworCQkvKiBNb3ZlIGF0dHJpYnV0ZXMgZm9sbG93aW5nIEBhIHRvIHRoZWlyIG5ldyBsb2NhdGlvbi4gKi8KKwkJbWVtbW92ZSgodTgqKWEgKyBuZXdfc2l6ZSwgKHU4KilhICsgbGUzMl90b19jcHUoYS0+bGVuZ3RoKSwKKwkJCQlsZTMyX3RvX2NwdShtLT5ieXRlc19pbl91c2UpIC0gKCh1OCopYSAtCisJCQkJKHU4KiltKSAtIGxlMzJfdG9fY3B1KGEtPmxlbmd0aCkpOworCQkvKiBBZGp1c3QgQG0gdG8gcmVmbGVjdCB0aGUgY2hhbmdlIGluIHVzZWQgc3BhY2UuICovCisJCW0tPmJ5dGVzX2luX3VzZSA9IGNwdV90b19sZTMyKG5ld19tdXNlKTsKKwkJLyogQWRqdXN0IEBhIHRvIHJlZmxlY3QgdGhlIG5ldyBzaXplLiAqLworCQlpZiAobmV3X3NpemUgPj0gb2Zmc2V0b2YoQVRUUl9SRUMsIGxlbmd0aCkgKyBzaXplb2YoYS0+bGVuZ3RoKSkKKwkJCWEtPmxlbmd0aCA9IGNwdV90b19sZTMyKG5ld19zaXplKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbnRmc19hdHRyX3NldCAtIGZpbGwgKGEgcGFydCBvZikgYW4gYXR0cmlidXRlIHdpdGggYSBieXRlCisgKiBAbmk6CQludGZzIGlub2RlIGRlc2NyaWJpbmcgdGhlIGF0dHJpYnV0ZSB0byBmaWxsCisgKiBAb2ZzOglvZmZzZXQgaW5zaWRlIHRoZSBhdHRyaWJ1dGUgYXQgd2hpY2ggdG8gc3RhcnQgdG8gZmlsbAorICogQGNudDoJbnVtYmVyIG9mIGJ5dGVzIHRvIGZpbGwKKyAqIEB2YWw6CXRoZSB1bnNpZ25lZCA4LWJpdCB2YWx1ZSB3aXRoIHdoaWNoIHRvIGZpbGwgdGhlIGF0dHJpYnV0ZQorICoKKyAqIEZpbGwgQGNudCBieXRlcyBvZiB0aGUgYXR0cmlidXRlIGRlc2NyaWJlZCBieSB0aGUgbnRmcyBpbm9kZSBAbmkgc3RhcnRpbmcgYXQKKyAqIGJ5dGUgb2Zmc2V0IEBvZnMgaW5zaWRlIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgY29uc3RhbnQgYnl0ZSBAdmFsLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZWZmZWN0aXZlbHkgbGlrZSBtZW1zZXQoKSBhcHBsaWVkIHRvIGFuIG50ZnMgYXR0cmlidXRlLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4gIEFuIGVycm9yIGNvZGUgb2YgLUVTUElQRSBtZWFucworICogdGhhdCBAb2ZzICsgQGNudCB3ZXJlIG91dHNpZGUgdGhlIGVuZCBvZiB0aGUgYXR0cmlidXRlIGFuZCBubyB3cml0ZSB3YXMKKyAqIHBlcmZvcm1lZC4KKyAqLworaW50IG50ZnNfYXR0cl9zZXQobnRmc19pbm9kZSAqbmksIGNvbnN0IHM2NCBvZnMsIGNvbnN0IHM2NCBjbnQsIGNvbnN0IHU4IHZhbCkKK3sKKwludGZzX3ZvbHVtZSAqdm9sID0gbmktPnZvbDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1OCAqa2FkZHI7CisJcGdvZmZfdCBpZHgsIGVuZDsKKwl1bnNpZ25lZCBpbnQgc3RhcnRfb2ZzLCBlbmRfb2ZzLCBzaXplOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIG9mcyAweCVsbHgsIGNudCAweCVsbHgsIHZhbCAweCVoeC4iLAorCQkJKGxvbmcgbG9uZylvZnMsIChsb25nIGxvbmcpY250LCB2YWwpOworCUJVR19PTihvZnMgPCAwKTsKKwlCVUdfT04oY250IDwgMCk7CisJaWYgKCFjbnQpCisJCWdvdG8gZG9uZTsKKwltYXBwaW5nID0gVkZTX0kobmkpLT5pX21hcHBpbmc7CisJLyogV29yayBvdXQgdGhlIHN0YXJ0aW5nIGluZGV4IGFuZCBwYWdlIG9mZnNldC4gKi8KKwlpZHggPSBvZnMgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlzdGFydF9vZnMgPSBvZnMgJiB+UEFHRV9DQUNIRV9NQVNLOworCS8qIFdvcmsgb3V0IHRoZSBlbmRpbmcgaW5kZXggYW5kIHBhZ2Ugb2Zmc2V0LiAqLworCWVuZCA9IG9mcyArIGNudDsKKwllbmRfb2ZzID0gZW5kICYgflBBR0VfQ0FDSEVfTUFTSzsKKwkvKiBJZiB0aGUgZW5kIGlzIG91dHNpZGUgdGhlIGlub2RlIHNpemUgcmV0dXJuIC1FU1BJUEUuICovCisJaWYgKHVubGlrZWx5KGVuZCA+IFZGU19JKG5pKS0+aV9zaXplKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJSZXF1ZXN0IGV4Y2VlZHMgZW5kIG9mIGF0dHJpYnV0ZS4iKTsKKwkJcmV0dXJuIC1FU1BJUEU7CisJfQorCWVuZCA+Pj0gUEFHRV9DQUNIRV9TSElGVDsKKwkvKiBJZiB0aGVyZSBpcyBhIGZpcnN0IHBhcnRpYWwgcGFnZSwgbmVlZCB0byBkbyBpdCB0aGUgc2xvdyB3YXkuICovCisJaWYgKHN0YXJ0X29mcykgeworCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIGlkeCwKKwkJCQkoZmlsbGVyX3QqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisJCWlmIChJU19FUlIocGFnZSkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByZWFkIGZpcnN0IHBhcnRpYWwgIgorCQkJCQkicGFnZSAoc3luYyBlcnJvciwgaW5kZXggMHglbHgpLiIsIGlkeCk7CisJCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKKwkJfQorCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCQlpZiAodW5saWtlbHkoIVBhZ2VVcHRvZGF0ZShwYWdlKSkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByZWFkIGZpcnN0IHBhcnRpYWwgcGFnZSAiCisJCQkJCSIoYXN5bmMgZXJyb3IsIGluZGV4IDB4JWx4KS4iLCBpZHgpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CisJCX0KKwkJLyoKKwkJICogSWYgdGhlIGxhc3QgcGFnZSBpcyB0aGUgc2FtZSBhcyB0aGUgZmlyc3QgcGFnZSwgbmVlZCB0bworCQkgKiBsaW1pdCB0aGUgd3JpdGUgdG8gdGhlIGVuZCBvZmZzZXQuCisJCSAqLworCQlzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCQlpZiAoaWR4ID09IGVuZCkKKwkJCXNpemUgPSBlbmRfb2ZzOworCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtc2V0KGthZGRyICsgc3RhcnRfb2ZzLCB2YWwsIHNpemUgLSBzdGFydF9vZnMpOworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQlpZiAoaWR4ID09IGVuZCkKKwkJCWdvdG8gZG9uZTsKKwkJaWR4Kys7CisJfQorCS8qIERvIHRoZSB3aG9sZSBwYWdlcyB0aGUgZmFzdCB3YXkuICovCisJZm9yICg7IGlkeCA8IGVuZDsgaWR4KyspIHsKKwkJLyogRmluZCBvciBjcmVhdGUgdGhlIGN1cnJlbnQgcGFnZS4gIChUaGUgcGFnZSBpcyBsb2NrZWQuKSAqLworCQlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGlkeCk7CisJCWlmICh1bmxpa2VseSghcGFnZSkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkluc3VmZmljaWVudCBtZW1vcnkgdG8gZ3JhYiAiCisJCQkJCSJwYWdlIChpbmRleCAweCVseCkuIiwgaWR4KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQltZW1zZXQoa2FkZHIsIHZhbCwgUEFHRV9DQUNIRV9TSVpFKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJLyoKKwkJICogSWYgdGhlIHBhZ2UgaGFzIGJ1ZmZlcnMsIG1hcmsgdGhlbSB1cHRvZGF0ZSBzaW5jZSBidWZmZXIKKwkJICogc3RhdGUgYW5kIG5vdCBwYWdlIHN0YXRlIGlzIGRlZmluaXRpdmUgaW4gMi42IGtlcm5lbHMuCisJCSAqLworCQlpZiAocGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQ7CisKKwkJCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwkJCWRvIHsKKwkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisJCX0KKwkJLyogTm93IHRoYXQgYnVmZmVycyBhcmUgdXB0b2RhdGUsIHNldCB0aGUgcGFnZSB1cHRvZGF0ZSwgdG9vLiAqLworCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCS8qCisJCSAqIFNldCB0aGUgcGFnZSBhbmQgYWxsIGl0cyBidWZmZXJzIGRpcnR5IGFuZCBtYXJrIHRoZSBpbm9kZQorCQkgKiBkaXJ0eSwgdG9vLiAgVGhlIFZNIHdpbGwgd3JpdGUgdGhlIHBhZ2UgbGF0ZXIgb24uCisJCSAqLworCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJLyogRmluYWxseSB1bmxvY2sgYW5kIHJlbGVhc2UgdGhlIHBhZ2UuICovCisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJfQorCS8qIElmIHRoZXJlIGlzIGEgbGFzdCBwYXJ0aWFsIHBhZ2UsIG5lZWQgdG8gZG8gaXQgdGhlIHNsb3cgd2F5LiAqLworCWlmIChlbmRfb2ZzKSB7CisJCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgaWR4LAorCQkJCShmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJlYWQgbGFzdCBwYXJ0aWFsIHBhZ2UgIgorCQkJCQkiKHN5bmMgZXJyb3IsIGluZGV4IDB4JWx4KS4iLCBpZHgpOworCQkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CisJCX0KKwkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKwkJaWYgKHVubGlrZWx5KCFQYWdlVXB0b2RhdGUocGFnZSkpKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gcmVhZCBsYXN0IHBhcnRpYWwgcGFnZSAiCisJCQkJCSIoYXN5bmMgZXJyb3IsIGluZGV4IDB4JWx4KS4iLCBpZHgpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CisJCX0KKwkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCW1lbXNldChrYWRkciwgdmFsLCBlbmRfb2ZzKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9Citkb25lOgorCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9udGZzL2F0dHJpYi5oIGIvZnMvbnRmcy9hdHRyaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGMyYzZjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9hdHRyaWIuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIGF0dHJpYi5oIC0gRGVmaW5lcyBmb3IgYXR0cmlidXRlIGhhbmRsaW5nIGluIE5URlMgTGludXgga2VybmVsIGRyaXZlci4KKyAqCSAgICAgIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMiBSaWNoYXJkIFJ1c3NvbgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfQVRUUklCX0gKKyNkZWZpbmUgX0xJTlVYX05URlNfQVRUUklCX0gKKworI2luY2x1ZGUgImVuZGlhbi5oIgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAibGF5b3V0LmgiCisjaW5jbHVkZSAiaW5vZGUuaCIKKyNpbmNsdWRlICJydW5saXN0LmgiCisjaW5jbHVkZSAidm9sdW1lLmgiCisKKy8qKgorICogbnRmc19hdHRyX3NlYXJjaF9jdHggLSB1c2VkIGluIGF0dHJpYnV0ZSBzZWFyY2ggZnVuY3Rpb25zCisgKiBAbXJlYzoJYnVmZmVyIGNvbnRhaW5pbmcgbWZ0IHJlY29yZCB0byBzZWFyY2gKKyAqIEBhdHRyOglhdHRyaWJ1dGUgcmVjb3JkIGluIEBtcmVjIHdoZXJlIHRvIGJlZ2luL2NvbnRpbnVlIHNlYXJjaAorICogQGlzX2ZpcnN0OglpZiB0cnVlIG50ZnNfYXR0cl9sb29rdXAoKSBiZWdpbnMgc2VhcmNoIHdpdGggQGF0dHIsIGVsc2UgYWZ0ZXIKKyAqCisgKiBTdHJ1Y3R1cmUgbXVzdCBiZSBpbml0aWFsaXplZCB0byB6ZXJvIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCB0byBvbmUgb2YgdGhlCisgKiBhdHRyaWJ1dGUgc2VhcmNoIGZ1bmN0aW9ucy4gSW5pdGlhbGl6ZSBAbXJlYyB0byBwb2ludCB0byB0aGUgbWZ0IHJlY29yZCB0bworICogc2VhcmNoLCBhbmQgQGF0dHIgdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGF0dHJpYnV0ZSB3aXRoaW4gQG1yZWMgKG5vdCBuZWNlc3NhcnkKKyAqIGlmIGNhbGxpbmcgdGhlIF9maXJzdCgpIGZ1bmN0aW9ucyksIGFuZCBzZXQgQGlzX2ZpcnN0IHRvIFRSVUUgKG5vdCBuZWNlc3NhcnkKKyAqIGlmIGNhbGxpbmcgdGhlIF9maXJzdCgpIGZ1bmN0aW9ucykuCisgKgorICogSWYgQGlzX2ZpcnN0IGlzIFRSVUUsIHRoZSBzZWFyY2ggYmVnaW5zIHdpdGggQGF0dHIuIElmIEBpc19maXJzdCBpcyBGQUxTRSwKKyAqIHRoZSBzZWFyY2ggYmVnaW5zIGFmdGVyIEBhdHRyLiBUaGlzIGlzIHNvIHRoYXQsIGFmdGVyIHRoZSBmaXJzdCBjYWxsIHRvIG9uZQorICogb2YgdGhlIHNlYXJjaCBhdHRyaWJ1dGUgZnVuY3Rpb25zLCB3ZSBjYW4gY2FsbCB0aGUgZnVuY3Rpb24gYWdhaW4sIHdpdGhvdXQKKyAqIGFueSBtb2RpZmljYXRpb24gb2YgdGhlIHNlYXJjaCBjb250ZXh0LCB0byBhdXRvbWFnaWNhbGx5IGdldCB0aGUgbmV4dAorICogbWF0Y2hpbmcgYXR0cmlidXRlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJTUZUX1JFQ09SRCAqbXJlYzsKKwlBVFRSX1JFQ09SRCAqYXR0cjsKKwlCT09MIGlzX2ZpcnN0OworCW50ZnNfaW5vZGUgKm50ZnNfaW5vOworCUFUVFJfTElTVF9FTlRSWSAqYWxfZW50cnk7CisJbnRmc19pbm9kZSAqYmFzZV9udGZzX2lubzsKKwlNRlRfUkVDT1JEICpiYXNlX21yZWM7CisJQVRUUl9SRUNPUkQgKmJhc2VfYXR0cjsKK30gbnRmc19hdHRyX3NlYXJjaF9jdHg7CisKK2V4dGVybiBpbnQgbnRmc19tYXBfcnVubGlzdChudGZzX2lub2RlICpuaSwgVkNOIHZjbik7CisKK2V4dGVybiBydW5saXN0X2VsZW1lbnQgKm50ZnNfZmluZF92Y24obnRmc19pbm9kZSAqbmksIGNvbnN0IFZDTiB2Y24sCisJCWNvbnN0IEJPT0wgbmVlZF93cml0ZSk7CisKK2ludCBudGZzX2F0dHJfbG9va3VwKGNvbnN0IEFUVFJfVFlQRSB0eXBlLCBjb25zdCBudGZzY2hhciAqbmFtZSwKKwkJY29uc3QgdTMyIG5hbWVfbGVuLCBjb25zdCBJR05PUkVfQ0FTRV9CT09MIGljLAorCQljb25zdCBWQ04gbG93ZXN0X3ZjbiwgY29uc3QgdTggKnZhbCwgY29uc3QgdTMyIHZhbF9sZW4sCisJCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHgpOworCitleHRlcm4gaW50IGxvYWRfYXR0cmlidXRlX2xpc3QobnRmc192b2x1bWUgKnZvbCwgcnVubGlzdCAqcmwsIHU4ICphbF9zdGFydCwKKwkJY29uc3QgczY0IHNpemUsIGNvbnN0IHM2NCBpbml0aWFsaXplZF9zaXplKTsKKworc3RhdGljIGlubGluZSBzNjQgbnRmc19hdHRyX3NpemUoY29uc3QgQVRUUl9SRUNPUkQgKmEpCit7CisJaWYgKCFhLT5ub25fcmVzaWRlbnQpCisJCXJldHVybiAoczY0KWxlMzJfdG9fY3B1KGEtPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwlyZXR1cm4gc2xlNjRfdG9fY3B1KGEtPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZSk7Cit9CisKK2V4dGVybiB2b2lkIG50ZnNfYXR0cl9yZWluaXRfc2VhcmNoX2N0eChudGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4KTsKK2V4dGVybiBudGZzX2F0dHJfc2VhcmNoX2N0eCAqbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KG50ZnNfaW5vZGUgKm5pLAorCQlNRlRfUkVDT1JEICptcmVjKTsKK2V4dGVybiB2b2lkIG50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChudGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4KTsKKworZXh0ZXJuIGludCBudGZzX2F0dHJfc2l6ZV9ib3VuZHNfY2hlY2soY29uc3QgbnRmc192b2x1bWUgKnZvbCwKKwkJY29uc3QgQVRUUl9UWVBFIHR5cGUsIGNvbnN0IHM2NCBzaXplKTsKK2V4dGVybiBpbnQgbnRmc19hdHRyX2Nhbl9iZV9ub25fcmVzaWRlbnQoY29uc3QgbnRmc192b2x1bWUgKnZvbCwKKwkJY29uc3QgQVRUUl9UWVBFIHR5cGUpOworZXh0ZXJuIGludCBudGZzX2F0dHJfY2FuX2JlX3Jlc2lkZW50KGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IEFUVFJfVFlQRSB0eXBlKTsKKworZXh0ZXJuIGludCBudGZzX2F0dHJfcmVjb3JkX3Jlc2l6ZShNRlRfUkVDT1JEICptLCBBVFRSX1JFQ09SRCAqYSwgdTMyIG5ld19zaXplKTsKKworZXh0ZXJuIGludCBudGZzX2F0dHJfc2V0KG50ZnNfaW5vZGUgKm5pLCBjb25zdCBzNjQgb2ZzLCBjb25zdCBzNjQgY250LAorCQljb25zdCB1OCB2YWwpOworCisjZW5kaWYgLyogX0xJTlVYX05URlNfQVRUUklCX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvYml0bWFwLmMgYi9mcy9udGZzL2JpdG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyY2YyZTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2JpdG1hcC5jCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogYml0bWFwLmMgLSBOVEZTIGtlcm5lbCBiaXRtYXAgaGFuZGxpbmcuICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZmRlZiBOVEZTX1JXCisKKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisKKyNpbmNsdWRlICJiaXRtYXAuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImFvcHMuaCIKKyNpbmNsdWRlICJudGZzLmgiCisKKy8qKgorICogX19udGZzX2JpdG1hcF9zZXRfYml0c19pbl9ydW4gLSBzZXQgYSBydW4gb2YgYml0cyBpbiBhIGJpdG1hcCB0byBhIHZhbHVlCisgKiBAdmk6CQkJdmZzIGlub2RlIGRlc2NyaWJpbmcgdGhlIGJpdG1hcAorICogQHN0YXJ0X2JpdDoJCWZpcnN0IGJpdCB0byBzZXQKKyAqIEBjb3VudDoJCW51bWJlciBvZiBiaXRzIHRvIHNldAorICogQHZhbHVlOgkJdmFsdWUgdG8gc2V0IHRoZSBiaXRzIHRvIChpLmUuIDAgb3IgMSkKKyAqIEBpc19yb2xsYmFjazoJaWYgVFJVRSB0aGlzIGlzIGEgcm9sbGJhY2sgb3BlcmF0aW9uCisgKgorICogU2V0IEBjb3VudCBiaXRzIHN0YXJ0aW5nIGF0IGJpdCBAc3RhcnRfYml0IGluIHRoZSBiaXRtYXAgZGVzY3JpYmVkIGJ5IHRoZQorICogdmZzIGlub2RlIEB2aSB0byBAdmFsdWUsIHdoZXJlIEB2YWx1ZSBpcyBlaXRoZXIgMCBvciAxLgorICoKKyAqIEBpc19yb2xsYmFjayBzaG91bGQgYWx3YXlzIGJlIEZBTFNFLCBpdCBpcyBmb3IgaW50ZXJuYWwgdXNlIHRvIHJvbGxiYWNrCisgKiBlcnJvcnMuICBZb3UgcHJvYmFibHkgd2FudCB0byB1c2UgbnRmc19iaXRtYXBfc2V0X2JpdHNfaW5fcnVuKCkgaW5zdGVhZC4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKi8KK2ludCBfX250ZnNfYml0bWFwX3NldF9iaXRzX2luX3J1bihzdHJ1Y3QgaW5vZGUgKnZpLCBjb25zdCBzNjQgc3RhcnRfYml0LAorCQljb25zdCBzNjQgY291bnQsIGNvbnN0IHU4IHZhbHVlLCBjb25zdCBCT09MIGlzX3JvbGxiYWNrKQoreworCXM2NCBjbnQgPSBjb3VudDsKKwlwZ29mZl90IGluZGV4LCBlbmRfaW5kZXg7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdTggKmthZGRyOworCWludCBwb3MsIGxlbjsKKwl1OCBiaXQ7CisKKwlCVUdfT04oIXZpKTsKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaV9pbm8gMHglbHgsIHN0YXJ0X2JpdCAweCVsbHgsIGNvdW50IDB4JWxseCwgIgorCQkJInZhbHVlICV1LiVzIiwgdmktPmlfaW5vLCAodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0X2JpdCwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpY250LCAodW5zaWduZWQgaW50KXZhbHVlLAorCQkJaXNfcm9sbGJhY2sgPyAiIChyb2xsYmFjaykiIDogIiIpOworCUJVR19PTihzdGFydF9iaXQgPCAwKTsKKwlCVUdfT04oY250IDwgMCk7CisJQlVHX09OKHZhbHVlID4gMSk7CisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIGluZGljZXMgZm9yIHRoZSBwYWdlcyBjb250YWluaW5nIHRoZSBmaXJzdCBhbmQgbGFzdAorCSAqIGJpdHMsIGkuZS4gQHN0YXJ0X2JpdCBhbmQgQHN0YXJ0X2JpdCArIEBjbnQgLSAxLCByZXNwZWN0aXZlbHkuCisJICovCisJaW5kZXggPSBzdGFydF9iaXQgPj4gKDMgKyBQQUdFX0NBQ0hFX1NISUZUKTsKKwllbmRfaW5kZXggPSAoc3RhcnRfYml0ICsgY250IC0gMSkgPj4gKDMgKyBQQUdFX0NBQ0hFX1NISUZUKTsKKworCS8qIEdldCB0aGUgcGFnZSBjb250YWluaW5nIHRoZSBmaXJzdCBiaXQgKEBzdGFydF9iaXQpLiAqLworCW1hcHBpbmcgPSB2aS0+aV9tYXBwaW5nOworCXBhZ2UgPSBudGZzX21hcF9wYWdlKG1hcHBpbmcsIGluZGV4KTsKKwlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCWlmICghaXNfcm9sbGJhY2spCisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmFpbGVkIHRvIG1hcCBmaXJzdCBwYWdlIChlcnJvciAiCisJCQkJCSIlbGkpLCBhYm9ydGluZy4iLCBQVFJfRVJSKHBhZ2UpKTsKKwkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CisJfQorCWthZGRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCisJLyogU2V0IEBwb3MgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBieXRlIGNvbnRhaW5pbmcgQHN0YXJ0X2JpdC4gKi8KKwlwb3MgPSAoc3RhcnRfYml0ID4+IDMpICYgflBBR0VfQ0FDSEVfTUFTSzsKKworCS8qIENhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgQHN0YXJ0X2JpdCBpbiB0aGUgZmlyc3QgYnl0ZS4gKi8KKwliaXQgPSBzdGFydF9iaXQgJiA3OworCisJLyogSWYgdGhlIGZpcnN0IGJ5dGUgaXMgcGFydGlhbCwgbW9kaWZ5IHRoZSBhcHByb3ByaWF0ZSBiaXRzIGluIGl0LiAqLworCWlmIChiaXQpIHsKKwkJdTggKmJ5dGUgPSBrYWRkciArIHBvczsKKwkJd2hpbGUgKChiaXQgJiA3KSAmJiBjbnQtLSkgeworCQkJaWYgKHZhbHVlKQorCQkJCSpieXRlIHw9IDEgPDwgYml0Kys7CisJCQllbHNlCisJCQkJKmJ5dGUgJj0gfigxIDw8IGJpdCsrKTsKKwkJfQorCQkvKiBJZiB3ZSBhcmUgZG9uZSwgdW5tYXAgdGhlIHBhZ2UgYW5kIHJldHVybiBzdWNjZXNzLiAqLworCQlpZiAoIWNudCkKKwkJCWdvdG8gZG9uZTsKKworCQkvKiBVcGRhdGUgQHBvcyB0byB0aGUgbmV3IHBvc2l0aW9uLiAqLworCQlwb3MrKzsKKwl9CisJLyoKKwkgKiBEZXBlbmRpbmcgb24gQHZhbHVlLCBtb2RpZnkgYWxsIHJlbWFpbmluZyB3aG9sZSBieXRlcyBpbiB0aGUgcGFnZSB1cAorCSAqIHRvIEBjbnQuCisJICovCisJbGVuID0gbWluX3QoczY0LCBjbnQgPj4gMywgUEFHRV9DQUNIRV9TSVpFIC0gcG9zKTsKKwltZW1zZXQoa2FkZHIgKyBwb3MsIHZhbHVlID8gMHhmZiA6IDAsIGxlbik7CisJY250IC09IGxlbiA8PCAzOworCisJLyogVXBkYXRlIEBsZW4gdG8gcG9pbnQgdG8gdGhlIGZpcnN0IG5vdC1kb25lIGJ5dGUgaW4gdGhlIHBhZ2UuICovCisJaWYgKGNudCA8IDgpCisJCWxlbiArPSBwb3M7CisKKwkvKiBJZiB3ZSBhcmUgbm90IGluIHRoZSBsYXN0IHBhZ2UsIGRlYWwgd2l0aCBhbGwgc3Vic2VxdWVudCBwYWdlcy4gKi8KKwl3aGlsZSAoaW5kZXggPCBlbmRfaW5kZXgpIHsKKwkJQlVHX09OKGNudCA8PSAwKTsKKworCQkvKiBVcGRhdGUgQGluZGV4IGFuZCBnZXQgdGhlIG5leHQgcGFnZS4gKi8KKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCXBhZ2UgPSBudGZzX21hcF9wYWdlKG1hcHBpbmcsICsraW5kZXgpOworCQlpZiAoSVNfRVJSKHBhZ2UpKQorCQkJZ290byByb2xsYmFjazsKKwkJa2FkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCS8qCisJCSAqIERlcGVuZGluZyBvbiBAdmFsdWUsIG1vZGlmeSBhbGwgcmVtYWluaW5nIHdob2xlIGJ5dGVzIGluIHRoZQorCQkgKiBwYWdlIHVwIHRvIEBjbnQuCisJCSAqLworCQlsZW4gPSBtaW5fdChzNjQsIGNudCA+PiAzLCBQQUdFX0NBQ0hFX1NJWkUpOworCQltZW1zZXQoa2FkZHIsIHZhbHVlID8gMHhmZiA6IDAsIGxlbik7CisJCWNudCAtPSBsZW4gPDwgMzsKKwl9CisJLyoKKwkgKiBUaGUgY3VycmVudGx5IG1hcHBlZCBwYWdlIGlzIHRoZSBsYXN0IG9uZS4gIElmIHRoZSBsYXN0IGJ5dGUgaXMKKwkgKiBwYXJ0aWFsLCBtb2RpZnkgdGhlIGFwcHJvcHJpYXRlIGJpdHMgaW4gaXQuICBOb3RlLCBAbGVuIGlzIHRoZQorCSAqIHBvc2l0aW9uIG9mIHRoZSBsYXN0IGJ5dGUgaW5zaWRlIHRoZSBwYWdlLgorCSAqLworCWlmIChjbnQpIHsKKwkJdTggKmJ5dGU7CisKKwkJQlVHX09OKGNudCA+IDcpOworCisJCWJpdCA9IGNudDsKKwkJYnl0ZSA9IGthZGRyICsgbGVuOworCQl3aGlsZSAoYml0LS0pIHsKKwkJCWlmICh2YWx1ZSkKKwkJCQkqYnl0ZSB8PSAxIDw8IGJpdDsKKwkJCWVsc2UKKwkJCQkqYnl0ZSAmPSB+KDEgPDwgYml0KTsKKwkJfQorCX0KK2RvbmU6CisJLyogV2UgYXJlIGRvbmUuICBVbm1hcCB0aGUgcGFnZSBhbmQgcmV0dXJuIHN1Y2Nlc3MuICovCisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIDA7Cityb2xsYmFjazoKKwkvKgorCSAqIEN1cnJlbnQgc3RhdGU6CisJICoJLSBubyBwYWdlcyBhcmUgbWFwcGVkCisJICoJLSBAY291bnQgLSBAY250IGlzIHRoZSBudW1iZXIgb2YgYml0cyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZAorCSAqLworCWlmIChpc19yb2xsYmFjaykKKwkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CisJaWYgKGNvdW50ICE9IGNudCkKKwkJcG9zID0gX19udGZzX2JpdG1hcF9zZXRfYml0c19pbl9ydW4odmksIHN0YXJ0X2JpdCwgY291bnQgLSBjbnQsCisJCQkJdmFsdWUgPyAwIDogMSwgVFJVRSk7CisJZWxzZQorCQlwb3MgPSAwOworCWlmICghcG9zKSB7CisJCS8qIFJvbGxiYWNrIHdhcyBzdWNjZXNzZnVsLiAqLworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmFpbGVkIHRvIG1hcCBzdWJzZXF1ZW50IHBhZ2UgKGVycm9yICIKKwkJCQkiJWxpKSwgYWJvcnRpbmcuIiwgUFRSX0VSUihwYWdlKSk7CisJfSBlbHNlIHsKKwkJLyogUm9sbGJhY2sgZmFpbGVkLiAqLworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmFpbGVkIHRvIG1hcCBzdWJzZXF1ZW50IHBhZ2UgKGVycm9yICIKKwkJCQkiJWxpKSBhbmQgcm9sbGJhY2sgZmFpbGVkIChlcnJvciAlaSkuICAiCisJCQkJIkFib3J0aW5nIGFuZCBsZWF2aW5nIGluY29uc2lzdGVudCBtZXRhZGF0YS4gICIKKwkJCQkiVW5tb3VudCBhbmQgcnVuIGNoa2Rzay4iLCBQVFJfRVJSKHBhZ2UpLCBwb3MpOworCQlOVm9sU2V0RXJyb3JzKE5URlNfU0IodmktPmlfc2IpKTsKKwl9CisJcmV0dXJuIFBUUl9FUlIocGFnZSk7Cit9CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2JpdG1hcC5oIGIvZnMvbnRmcy9iaXRtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjUwZDZiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9iaXRtYXAuaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIGJpdG1hcC5oIC0gRGVmaW5lcyBmb3IgTlRGUyBrZXJuZWwgYml0bWFwIGhhbmRsaW5nLiAgUGFydCBvZiB0aGUgTGludXgtTlRGUworICoJICAgICAgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19CSVRNQVBfSAorI2RlZmluZSBfTElOVVhfTlRGU19CSVRNQVBfSAorCisjaWZkZWYgTlRGU19SVworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworI2luY2x1ZGUgInR5cGVzLmgiCisKK2V4dGVybiBpbnQgX19udGZzX2JpdG1hcF9zZXRfYml0c19pbl9ydW4oc3RydWN0IGlub2RlICp2aSwgY29uc3QgczY0IHN0YXJ0X2JpdCwKKwkJY29uc3QgczY0IGNvdW50LCBjb25zdCB1OCB2YWx1ZSwgY29uc3QgQk9PTCBpc19yb2xsYmFjayk7CisKKy8qKgorICogbnRmc19iaXRtYXBfc2V0X2JpdHNfaW5fcnVuIC0gc2V0IGEgcnVuIG9mIGJpdHMgaW4gYSBiaXRtYXAgdG8gYSB2YWx1ZQorICogQHZpOgkJCXZmcyBpbm9kZSBkZXNjcmliaW5nIHRoZSBiaXRtYXAKKyAqIEBzdGFydF9iaXQ6CQlmaXJzdCBiaXQgdG8gc2V0CisgKiBAY291bnQ6CQludW1iZXIgb2YgYml0cyB0byBzZXQKKyAqIEB2YWx1ZToJCXZhbHVlIHRvIHNldCB0aGUgYml0cyB0byAoaS5lLiAwIG9yIDEpCisgKgorICogU2V0IEBjb3VudCBiaXRzIHN0YXJ0aW5nIGF0IGJpdCBAc3RhcnRfYml0IGluIHRoZSBiaXRtYXAgZGVzY3JpYmVkIGJ5IHRoZQorICogdmZzIGlub2RlIEB2aSB0byBAdmFsdWUsIHdoZXJlIEB2YWx1ZSBpcyBlaXRoZXIgMCBvciAxLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbnRmc19iaXRtYXBfc2V0X2JpdHNfaW5fcnVuKHN0cnVjdCBpbm9kZSAqdmksCisJCWNvbnN0IHM2NCBzdGFydF9iaXQsIGNvbnN0IHM2NCBjb3VudCwgY29uc3QgdTggdmFsdWUpCit7CisJcmV0dXJuIF9fbnRmc19iaXRtYXBfc2V0X2JpdHNfaW5fcnVuKHZpLCBzdGFydF9iaXQsIGNvdW50LCB2YWx1ZSwKKwkJCUZBTFNFKTsKK30KKworLyoqCisgKiBudGZzX2JpdG1hcF9zZXRfcnVuIC0gc2V0IGEgcnVuIG9mIGJpdHMgaW4gYSBiaXRtYXAKKyAqIEB2aToJCXZmcyBpbm9kZSBkZXNjcmliaW5nIHRoZSBiaXRtYXAKKyAqIEBzdGFydF9iaXQ6CWZpcnN0IGJpdCB0byBzZXQKKyAqIEBjb3VudDoJbnVtYmVyIG9mIGJpdHMgdG8gc2V0CisgKgorICogU2V0IEBjb3VudCBiaXRzIHN0YXJ0aW5nIGF0IGJpdCBAc3RhcnRfYml0IGluIHRoZSBiaXRtYXAgZGVzY3JpYmVkIGJ5IHRoZQorICogdmZzIGlub2RlIEB2aS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG50ZnNfYml0bWFwX3NldF9ydW4oc3RydWN0IGlub2RlICp2aSwgY29uc3QgczY0IHN0YXJ0X2JpdCwKKwkJY29uc3QgczY0IGNvdW50KQoreworCXJldHVybiBudGZzX2JpdG1hcF9zZXRfYml0c19pbl9ydW4odmksIHN0YXJ0X2JpdCwgY291bnQsIDEpOworfQorCisvKioKKyAqIG50ZnNfYml0bWFwX2NsZWFyX3J1biAtIGNsZWFyIGEgcnVuIG9mIGJpdHMgaW4gYSBiaXRtYXAKKyAqIEB2aToJCXZmcyBpbm9kZSBkZXNjcmliaW5nIHRoZSBiaXRtYXAKKyAqIEBzdGFydF9iaXQ6CWZpcnN0IGJpdCB0byBjbGVhcgorICogQGNvdW50OgludW1iZXIgb2YgYml0cyB0byBjbGVhcgorICoKKyAqIENsZWFyIEBjb3VudCBiaXRzIHN0YXJ0aW5nIGF0IGJpdCBAc3RhcnRfYml0IGluIHRoZSBiaXRtYXAgZGVzY3JpYmVkIGJ5IHRoZQorICogdmZzIGlub2RlIEB2aS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG50ZnNfYml0bWFwX2NsZWFyX3J1bihzdHJ1Y3QgaW5vZGUgKnZpLCBjb25zdCBzNjQgc3RhcnRfYml0LAorCQljb25zdCBzNjQgY291bnQpCit7CisJcmV0dXJuIG50ZnNfYml0bWFwX3NldF9iaXRzX2luX3J1bih2aSwgc3RhcnRfYml0LCBjb3VudCwgMCk7Cit9CisKKy8qKgorICogbnRmc19iaXRtYXBfc2V0X2JpdCAtIHNldCBhIGJpdCBpbiBhIGJpdG1hcAorICogQHZpOgkJdmZzIGlub2RlIGRlc2NyaWJpbmcgdGhlIGJpdG1hcAorICogQGJpdDoJYml0IHRvIHNldAorICoKKyAqIFNldCBiaXQgQGJpdCBpbiB0aGUgYml0bWFwIGRlc2NyaWJlZCBieSB0aGUgdmZzIGlub2RlIEB2aS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG50ZnNfYml0bWFwX3NldF9iaXQoc3RydWN0IGlub2RlICp2aSwgY29uc3QgczY0IGJpdCkKK3sKKwlyZXR1cm4gbnRmc19iaXRtYXBfc2V0X3J1bih2aSwgYml0LCAxKTsKK30KKworLyoqCisgKiBudGZzX2JpdG1hcF9jbGVhcl9iaXQgLSBjbGVhciBhIGJpdCBpbiBhIGJpdG1hcAorICogQHZpOgkJdmZzIGlub2RlIGRlc2NyaWJpbmcgdGhlIGJpdG1hcAorICogQGJpdDoJYml0IHRvIGNsZWFyCisgKgorICogQ2xlYXIgYml0IEBiaXQgaW4gdGhlIGJpdG1hcCBkZXNjcmliZWQgYnkgdGhlIHZmcyBpbm9kZSBAdmkuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICovCitzdGF0aWMgaW5saW5lIGludCBudGZzX2JpdG1hcF9jbGVhcl9iaXQoc3RydWN0IGlub2RlICp2aSwgY29uc3QgczY0IGJpdCkKK3sKKwlyZXR1cm4gbnRmc19iaXRtYXBfY2xlYXJfcnVuKHZpLCBiaXQsIDEpOworfQorCisjZW5kaWYgLyogTlRGU19SVyAqLworCisjZW5kaWYgLyogZGVmaW5lZCBfTElOVVhfTlRGU19CSVRNQVBfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9jb2xsYXRlLmMgYi9mcy9udGZzL2NvbGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTI4YWIzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9jb2xsYXRlLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBjb2xsYXRlLmMgLSBOVEZTIGtlcm5lbCBjb2xsYXRpb24gaGFuZGxpbmcuICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlICJjb2xsYXRlLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJudGZzLmgiCisKK3N0YXRpYyBpbnQgbnRmc19jb2xsYXRlX2JpbmFyeShudGZzX3ZvbHVtZSAqdm9sLAorCQljb25zdCB2b2lkICpkYXRhMSwgY29uc3QgaW50IGRhdGExX2xlbiwKKwkJY29uc3Qgdm9pZCAqZGF0YTIsIGNvbnN0IGludCBkYXRhMl9sZW4pCit7CisJaW50IHJjOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJcmMgPSBtZW1jbXAoZGF0YTEsIGRhdGEyLCBtaW4oZGF0YTFfbGVuLCBkYXRhMl9sZW4pKTsKKwlpZiAoIXJjICYmIChkYXRhMV9sZW4gIT0gZGF0YTJfbGVuKSkgeworCQlpZiAoZGF0YTFfbGVuIDwgZGF0YTJfbGVuKQorCQkJcmMgPSAtMTsKKwkJZWxzZQorCQkJcmMgPSAxOworCX0KKwludGZzX2RlYnVnKCJEb25lLCByZXR1cm5pbmcgJWkiLCByYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG50ZnNfY29sbGF0ZV9udG9mc191bG9uZyhudGZzX3ZvbHVtZSAqdm9sLAorCQljb25zdCB2b2lkICpkYXRhMSwgY29uc3QgaW50IGRhdGExX2xlbiwKKwkJY29uc3Qgdm9pZCAqZGF0YTIsIGNvbnN0IGludCBkYXRhMl9sZW4pCit7CisJaW50IHJjOworCXUzMiBkMSwgZDI7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwkvLyBGSVhNRTogIFdlIGRvbid0IHJlYWxseSB3YW50IHRvIGJ1ZyBoZXJlLgorCUJVR19PTihkYXRhMV9sZW4gIT0gZGF0YTJfbGVuKTsKKwlCVUdfT04oZGF0YTFfbGVuICE9IDQpOworCWQxID0gbGUzMl90b19jcHVwKGRhdGExKTsKKwlkMiA9IGxlMzJfdG9fY3B1cChkYXRhMik7CisJaWYgKGQxIDwgZDIpCisJCXJjID0gLTE7CisJZWxzZSB7CisJCWlmIChkMSA9PSBkMikKKwkJCXJjID0gMDsKKwkJZWxzZQorCQkJcmMgPSAxOworCX0KKwludGZzX2RlYnVnKCJEb25lLCByZXR1cm5pbmcgJWkiLCByYyk7CisJcmV0dXJuIHJjOworfQorCit0eXBlZGVmIGludCAoKm50ZnNfY29sbGF0ZV9mdW5jX3QpKG50ZnNfdm9sdW1lICosIGNvbnN0IHZvaWQgKiwgY29uc3QgaW50LAorCQljb25zdCB2b2lkICosIGNvbnN0IGludCk7CisKK3N0YXRpYyBudGZzX2NvbGxhdGVfZnVuY190IG50ZnNfZG9fY29sbGF0ZTB4MFszXSA9IHsKKwludGZzX2NvbGxhdGVfYmluYXJ5LAorCU5VTEwvKm50ZnNfY29sbGF0ZV9maWxlX25hbWUqLywKKwlOVUxMLypudGZzX2NvbGxhdGVfdW5pY29kZV9zdHJpbmcqLywKK307CisKK3N0YXRpYyBudGZzX2NvbGxhdGVfZnVuY190IG50ZnNfZG9fY29sbGF0ZTB4MVs0XSA9IHsKKwludGZzX2NvbGxhdGVfbnRvZnNfdWxvbmcsCisJTlVMTC8qbnRmc19jb2xsYXRlX250b2ZzX3NpZCovLAorCU5VTEwvKm50ZnNfY29sbGF0ZV9udG9mc19zZWN1cml0eV9oYXNoKi8sCisJTlVMTC8qbnRmc19jb2xsYXRlX250b2ZzX3Vsb25ncyovLAorfTsKKworLyoqCisgKiBudGZzX2NvbGxhdGUgLSBjb2xsYXRlIHR3byBkYXRhIGl0ZW1zIHVzaW5nIGEgc3BlY2lmaWVkIGNvbGxhdGlvbiBydWxlCisgKiBAdm9sOgludGZzIHZvbHVtZSB0byB3aGljaCB0aGUgZGF0YSBpdGVtcyBiZWxvbmcKKyAqIEBjcjoJCWNvbGxhdGlvbiBydWxlIHRvIHVzZSB3aGVuIGNvbXBhcmluZyB0aGUgaXRlbXMKKyAqIEBkYXRhMToJZmlyc3QgZGF0YSBpdGVtIHRvIGNvbGxhdGUKKyAqIEBkYXRhMV9sZW46CWxlbmd0aCBpbiBieXRlcyBvZiBAZGF0YTEKKyAqIEBkYXRhMjoJc2Vjb25kIGRhdGEgaXRlbSB0byBjb2xsYXRlCisgKiBAZGF0YTJfbGVuOglsZW5ndGggaW4gYnl0ZXMgb2YgQGRhdGEyCisgKgorICogQ29sbGF0ZSB0aGUgdHdvIGRhdGEgaXRlbXMgQGRhdGExIGFuZCBAZGF0YTIgdXNpbmcgdGhlIGNvbGxhdGlvbiBydWxlIEBjcgorICogYW5kIHJldHVybiAtMSwgMCwgaXIgMSBpZiBAZGF0YTEgaXMgZm91bmQsIHJlc3BlY3RpdmVseSwgdG8gY29sbGF0ZSBiZWZvcmUsCisgKiB0byBtYXRjaCwgb3IgdG8gY29sbGF0ZSBhZnRlciBAZGF0YTIuCisgKgorICogRm9yIHNwZWVkIHdlIHVzZSB0aGUgY29sbGF0aW9uIHJ1bGUgQGNyIGFzIGFuIGluZGV4IGludG8gdHdvIHRhYmxlcyBvZgorICogZnVuY3Rpb24gcG9pbnRlcnMgdG8gY2FsbCB0aGUgYXBwcm9wcmlhdGUgY29sbGF0aW9uIGZ1bmN0aW9uLgorICovCitpbnQgbnRmc19jb2xsYXRlKG50ZnNfdm9sdW1lICp2b2wsIENPTExBVElPTl9SVUxFIGNyLAorCQljb25zdCB2b2lkICpkYXRhMSwgY29uc3QgaW50IGRhdGExX2xlbiwKKwkJY29uc3Qgdm9pZCAqZGF0YTIsIGNvbnN0IGludCBkYXRhMl9sZW4pIHsKKwlpbnQgaTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCS8qCisJICogRklYTUU6ICBBdCB0aGUgbW9tZW50IHdlIG9ubHkgc3VwcG9ydCBDT0xMQVRJT05fQklOQVJZIGFuZAorCSAqIENPTExBVElPTl9OVE9GU19VTE9ORywgc28gd2UgQlVHKCkgZm9yIGV2ZXJ5dGhpbmcgZWxzZSBmb3Igbm93LgorCSAqLworCUJVR19PTihjciAhPSBDT0xMQVRJT05fQklOQVJZICYmIGNyICE9IENPTExBVElPTl9OVE9GU19VTE9ORyk7CisJaSA9IGxlMzJfdG9fY3B1KGNyKTsKKwlCVUdfT04oaSA8IDApOworCWlmIChpIDw9IDB4MDIpCisJCXJldHVybiBudGZzX2RvX2NvbGxhdGUweDBbaV0odm9sLCBkYXRhMSwgZGF0YTFfbGVuLAorCQkJCWRhdGEyLCBkYXRhMl9sZW4pOworCUJVR19PTihpIDwgMHgxMCk7CisJaSAtPSAweDEwOworCWlmIChsaWtlbHkoaSA8PSAzKSkKKwkJcmV0dXJuIG50ZnNfZG9fY29sbGF0ZTB4MVtpXSh2b2wsIGRhdGExLCBkYXRhMV9sZW4sCisJCQkJZGF0YTIsIGRhdGEyX2xlbik7CisJQlVHKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9udGZzL2NvbGxhdGUuaCBiL2ZzL250ZnMvY29sbGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMjdmMzYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2NvbGxhdGUuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogY29sbGF0ZS5oIC0gRGVmaW5lcyBmb3IgTlRGUyBrZXJuZWwgY29sbGF0aW9uIGhhbmRsaW5nLiAgUGFydCBvZiB0aGUKKyAqCSAgICAgICBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfQ09MTEFURV9ICisjZGVmaW5lIF9MSU5VWF9OVEZTX0NPTExBVEVfSAorCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJ2b2x1bWUuaCIKKworc3RhdGljIGlubGluZSBCT09MIG50ZnNfaXNfY29sbGF0aW9uX3J1bGVfc3VwcG9ydGVkKENPTExBVElPTl9SVUxFIGNyKSB7CisJaW50IGk7CisKKwkvKgorCSAqIEZJWE1FOiAgQXQgdGhlIG1vbWVudCB3ZSBvbmx5IHN1cHBvcnQgQ09MTEFUSU9OX0JJTkFSWSBhbmQKKwkgKiBDT0xMQVRJT05fTlRPRlNfVUxPTkcsIHNvIHdlIHJldHVybiBmYWxzZSBmb3IgZXZlcnl0aGluZyBlbHNlIGZvcgorCSAqIG5vdy4KKwkgKi8KKwlpZiAodW5saWtlbHkoY3IgIT0gQ09MTEFUSU9OX0JJTkFSWSAmJiBjciAhPSBDT0xMQVRJT05fTlRPRlNfVUxPTkcpKQorCQlyZXR1cm4gRkFMU0U7CisJaSA9IGxlMzJfdG9fY3B1KGNyKTsKKwlpZiAobGlrZWx5KCgoaSA+PSAwKSAmJiAoaSA8PSAweDAyKSkgfHwKKwkJCSgoaSA+PSAweDEwKSAmJiAoaSA8PSAweDEzKSkpKQorCQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKK2V4dGVybiBpbnQgbnRmc19jb2xsYXRlKG50ZnNfdm9sdW1lICp2b2wsIENPTExBVElPTl9SVUxFIGNyLAorCQljb25zdCB2b2lkICpkYXRhMSwgY29uc3QgaW50IGRhdGExX2xlbiwKKwkJY29uc3Qgdm9pZCAqZGF0YTIsIGNvbnN0IGludCBkYXRhMl9sZW4pOworCisjZW5kaWYgLyogX0xJTlVYX05URlNfQ09MTEFURV9IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2NvbXByZXNzLmMgYi9mcy9udGZzL2NvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1YWU3MAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvY29tcHJlc3MuYwpAQCAtMCwwICsxLDk1NyBAQAorLyoqCisgKiBjb21wcmVzcy5jIC0gTlRGUyBrZXJuZWwgY29tcHJlc3NlZCBhdHRyaWJ1dGVzIGhhbmRsaW5nLgorICoJCVBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMiBSaWNoYXJkIFJ1c3NvbgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSAiYXR0cmliLmgiCisjaW5jbHVkZSAiaW5vZGUuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgIm50ZnMuaCIKKworLyoqCisgKiBudGZzX2NvbXByZXNzaW9uX2NvbnN0YW50cyAtIGVudW0gb2YgY29uc3RhbnRzIHVzZWQgaW4gdGhlIGNvbXByZXNzaW9uIGNvZGUKKyAqLwordHlwZWRlZiBlbnVtIHsKKwkvKiBUb2tlbiB0eXBlcyBhbmQgYWNjZXNzIG1hc2suICovCisJTlRGU19TWU1CT0xfVE9LRU4JPQkwLAorCU5URlNfUEhSQVNFX1RPS0VOCT0JMSwKKwlOVEZTX1RPS0VOX01BU0sJCT0JMSwKKworCS8qIENvbXByZXNzaW9uIHN1Yi1ibG9jayBjb25zdGFudHMuICovCisJTlRGU19TQl9TSVpFX01BU0sJPQkweDBmZmYsCisJTlRGU19TQl9TSVpFCQk9CTB4MTAwMCwKKwlOVEZTX1NCX0lTX0NPTVBSRVNTRUQJPQkweDgwMDAsCisKKwkvKgorCSAqIFRoZSBtYXhpbXVtIGNvbXByZXNzaW9uIGJsb2NrIHNpemUgaXMgYnkgZGVmaW5pdGlvbiAxNiAqIHRoZSBjbHVzdGVyCisJICogc2l6ZSwgd2l0aCB0aGUgbWF4aW11bSBzdXBwb3J0ZWQgY2x1c3RlciBzaXplIGJlaW5nIDRraUIuIFRodXMgdGhlCisJICogbWF4aW11bSBjb21wcmVzc2lvbiBidWZmZXIgc2l6ZSBpcyA2NGtpQiwgc28gd2UgdXNlIHRoaXMgd2hlbgorCSAqIGluaXRpYWxpemluZyB0aGUgY29tcHJlc3Npb24gYnVmZmVyLgorCSAqLworCU5URlNfTUFYX0NCX1NJWkUJPSA2NCAqIDEwMjQsCit9IG50ZnNfY29tcHJlc3Npb25fY29uc3RhbnRzOworCisvKioKKyAqIG50ZnNfY29tcHJlc3Npb25fYnVmZmVyIC0gb25lIGJ1ZmZlciBmb3IgdGhlIGRlY29tcHJlc3Npb24gZW5naW5lCisgKi8KK3N0YXRpYyB1OCAqbnRmc19jb21wcmVzc2lvbl9idWZmZXIgPSBOVUxMOworCisvKioKKyAqIG50ZnNfY2JfbG9jayAtIHNwaW5sb2NrIHdoaWNoIHByb3RlY3RzIG50ZnNfY29tcHJlc3Npb25fYnVmZmVyCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobnRmc19jYl9sb2NrKTsKKworLyoqCisgKiBhbGxvY2F0ZV9jb21wcmVzc2lvbl9idWZmZXJzIC0gYWxsb2NhdGUgdGhlIGRlY29tcHJlc3Npb24gYnVmZmVycworICoKKyAqIENhbGxlciBoYXMgdG8gaG9sZCB0aGUgbnRmc19sb2NrIHNlbWFwaG9yZS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIC1FTk9NRU0gaWYgdGhlIGFsbG9jYXRpb25zIGZhaWxlZC4KKyAqLworaW50IGFsbG9jYXRlX2NvbXByZXNzaW9uX2J1ZmZlcnModm9pZCkKK3sKKwlCVUdfT04obnRmc19jb21wcmVzc2lvbl9idWZmZXIpOworCisJbnRmc19jb21wcmVzc2lvbl9idWZmZXIgPSB2bWFsbG9jKE5URlNfTUFYX0NCX1NJWkUpOworCWlmICghbnRmc19jb21wcmVzc2lvbl9idWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZyZWVfY29tcHJlc3Npb25fYnVmZmVycyAtIGZyZWUgdGhlIGRlY29tcHJlc3Npb24gYnVmZmVycworICoKKyAqIENhbGxlciBoYXMgdG8gaG9sZCB0aGUgbnRmc19sb2NrIHNlbWFwaG9yZS4KKyAqLwordm9pZCBmcmVlX2NvbXByZXNzaW9uX2J1ZmZlcnModm9pZCkKK3sKKwlCVUdfT04oIW50ZnNfY29tcHJlc3Npb25fYnVmZmVyKTsKKwl2ZnJlZShudGZzX2NvbXByZXNzaW9uX2J1ZmZlcik7CisJbnRmc19jb21wcmVzc2lvbl9idWZmZXIgPSBOVUxMOworfQorCisvKioKKyAqIHplcm9fcGFydGlhbF9jb21wcmVzc2VkX3BhZ2UgLSB6ZXJvIG91dCBvZiBib3VuZHMgY29tcHJlc3NlZCBwYWdlIHJlZ2lvbgorICovCitzdGF0aWMgdm9pZCB6ZXJvX3BhcnRpYWxfY29tcHJlc3NlZF9wYWdlKG50ZnNfaW5vZGUgKm5pLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwl1OCAqa3AgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJdW5zaWduZWQgaW50IGtwX29mczsKKworCW50ZnNfZGVidWcoIlplcm9pbmcgcGFnZSByZWdpb24gb3V0c2lkZSBpbml0aWFsaXplZCBzaXplLiIpOworCWlmICgoKHM2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSA+PSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSkgeworCQkvKgorCQkgKiBGSVhNRTogVXNpbmcgY2xlYXJfcGFnZSgpIHdpbGwgYmVjb21lIHdyb25nIHdoZW4gd2UgZ2V0CisJCSAqIFBBR0VfQ0FDSEVfU0laRSAhPSBQQUdFX1NJWkUgYnV0IGZvciBub3cgdGhlcmUgaXMgbm8gcHJvYmxlbS4KKwkJICovCisJCWNsZWFyX3BhZ2Uoa3ApOworCQlyZXR1cm47CisJfQorCWtwX29mcyA9IG5pLT5pbml0aWFsaXplZF9zaXplICYgflBBR0VfQ0FDSEVfTUFTSzsKKwltZW1zZXQoa3AgKyBrcF9vZnMsIDAsIFBBR0VfQ0FDSEVfU0laRSAtIGtwX29mcyk7CisJcmV0dXJuOworfQorCisvKioKKyAqIGhhbmRsZV9ib3VuZHNfY29tcHJlc3NlZF9wYWdlIC0gdGVzdCBmb3ImaGFuZGxlIG91dCBvZiBib3VuZHMgY29tcHJlc3NlZCBwYWdlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoYW5kbGVfYm91bmRzX2NvbXByZXNzZWRfcGFnZShudGZzX2lub2RlICpuaSwKKwkJc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJaWYgKChwYWdlLT5pbmRleCA+PSAobmktPmluaXRpYWxpemVkX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVCkpICYmCisJCQkobmktPmluaXRpYWxpemVkX3NpemUgPCBWRlNfSShuaSktPmlfc2l6ZSkpCisJCXplcm9fcGFydGlhbF9jb21wcmVzc2VkX3BhZ2UobmksIHBhZ2UpOworCXJldHVybjsKK30KKworLyoqCisgKiBudGZzX2RlY29tcHJlc3MgLSBkZWNvbXByZXNzIGEgY29tcHJlc3Npb24gYmxvY2sgaW50byBhbiBhcnJheSBvZiBwYWdlcworICogQGRlc3RfcGFnZXM6CQlkZXN0aW5hdGlvbiBhcnJheSBvZiBwYWdlcworICogQGRlc3RfaW5kZXg6CQljdXJyZW50IGluZGV4IGludG8gQGRlc3RfcGFnZXMgKElOL09VVCkKKyAqIEBkZXN0X29mczoJCWN1cnJlbnQgb2Zmc2V0IHdpdGhpbiBAZGVzdF9wYWdlc1tAZGVzdF9pbmRleF0gKElOL09VVCkKKyAqIEBkZXN0X21heF9pbmRleDoJbWF4aW11bSBpbmRleCBpbnRvIEBkZXN0X3BhZ2VzIChJTikKKyAqIEBkZXN0X21heF9vZnM6CW1heGltdW0gb2Zmc2V0IHdpdGhpbiBAZGVzdF9wYWdlc1tAZGVzdF9tYXhfaW5kZXhdIChJTikKKyAqIEB4cGFnZToJCXRoZSB0YXJnZXQgcGFnZSAoLTEgaWYgbm9uZSkgKElOKQorICogQHhwYWdlX2RvbmU6CQlzZXQgdG8gMSBpZiB4cGFnZSB3YXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAoSU4vT1VUKQorICogQGNiX3N0YXJ0OgkJY29tcHJlc3Npb24gYmxvY2sgdG8gZGVjb21wcmVzcyAoSU4pCisgKiBAY2Jfc2l6ZToJCXNpemUgb2YgY29tcHJlc3Npb24gYmxvY2sgQGNiX3N0YXJ0IGluIGJ5dGVzIChJTikKKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgaGF2ZSBkaXNhYmxlZCBwcmVlbXB0aW9uLiBudGZzX2RlY29tcHJlc3MoKSByZWVuYWJsZXMgaXQgd2hlbgorICogdGhlIGNyaXRpY2FsIHNlY3Rpb24gaXMgZmluaXNoZWQuCisgKgorICogVGhpcyBkZWNvbXByZXNzZXMgdGhlIGNvbXByZXNzaW9uIGJsb2NrIEBjYl9zdGFydCBpbnRvIHRoZSBhcnJheSBvZgorICogZGVzdGluYXRpb24gcGFnZXMgQGRlc3RfcGFnZXMgc3RhcnRpbmcgYXQgaW5kZXggQGRlc3RfaW5kZXggaW50byBAZGVzdF9wYWdlcworICogYW5kIGF0IG9mZnNldCBAZGVzdF9wb3MgaW50byB0aGUgcGFnZSBAZGVzdF9wYWdlc1tAZGVzdF9pbmRleF0uCisgKgorICogV2hlbiB0aGUgcGFnZSBAZGVzdF9wYWdlc1tAeHBhZ2VdIGlzIGNvbXBsZXRlZCwgQHhwYWdlX2RvbmUgaXMgc2V0IHRvIDEuCisgKiBJZiB4cGFnZSBpcyAtMSBvciBAeHBhZ2UgaGFzIG5vdCBiZWVuIGNvbXBsZXRlZCwgQHhwYWdlX2RvbmUgaXMgbm90IG1vZGlmaWVkLgorICoKKyAqIEBjYl9zdGFydCBpcyBhIHBvaW50ZXIgdG8gdGhlIGNvbXByZXNzaW9uIGJsb2NrIHdoaWNoIG5lZWRzIGRlY29tcHJlc3NpbmcKKyAqIGFuZCBAY2Jfc2l6ZSBpcyB0aGUgc2l6ZSBvZiBAY2Jfc3RhcnQgaW4gYnl0ZXMgKDgtNjRraUIpLgorICoKKyAqIFJldHVybiAwIGlmIHN1Y2Nlc3Mgb3IgLUVPVkVSRkxPVyBvbiBlcnJvciBpbiB0aGUgY29tcHJlc3NlZCBzdHJlYW0uCisgKiBAeHBhZ2VfZG9uZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdGFyZ2V0IHBhZ2UgKEBkZXN0X3BhZ2VzW0B4cGFnZV0pIHdhcworICogY29tcGxldGVkIGR1cmluZyB0aGUgZGVjb21wcmVzc2lvbiBvZiB0aGUgY29tcHJlc3Npb24gYmxvY2sgKEBjYl9zdGFydCkuCisgKgorICogV2FybmluZzogVGhpcyBmdW5jdGlvbiAqUkVRVUlSRVMqIFBBR0VfQ0FDSEVfU0laRSA+PSA0MDk2IG9yIGl0IHdpbGwgYmxvdyB1cAorICogdW5wcmVkaWNhdGJseSEgWW91IGhhdmUgYmVlbiB3YXJuZWQhCisgKgorICogTm90ZSB0byBoYWNrZXJzOiBUaGlzIGZ1bmN0aW9uIG1heSBub3Qgc2xlZXAgdW50aWwgaXQgaGFzIGZpbmlzaGVkIGFjY2Vzc2luZworICogdGhlIGNvbXByZXNzaW9uIGJsb2NrIEBjYl9zdGFydCBhcyBpdCBpcyBhIHBlci1DUFUgYnVmZmVyLgorICovCitzdGF0aWMgaW50IG50ZnNfZGVjb21wcmVzcyhzdHJ1Y3QgcGFnZSAqZGVzdF9wYWdlc1tdLCBpbnQgKmRlc3RfaW5kZXgsCisJCWludCAqZGVzdF9vZnMsIGNvbnN0IGludCBkZXN0X21heF9pbmRleCwgY29uc3QgaW50IGRlc3RfbWF4X29mcywKKwkJY29uc3QgaW50IHhwYWdlLCBjaGFyICp4cGFnZV9kb25lLCB1OCAqY29uc3QgY2Jfc3RhcnQsCisJCWNvbnN0IHUzMiBjYl9zaXplKQoreworCS8qCisJICogUG9pbnRlcnMgaW50byB0aGUgY29tcHJlc3NlZCBkYXRhLCBpLmUuIHRoZSBjb21wcmVzc2lvbiBibG9jayAoY2IpLAorCSAqIGFuZCB0aGUgdGhlcmVpbiBjb250YWluZWQgc3ViLWJsb2NrcyAoc2IpLgorCSAqLworCXU4ICpjYl9lbmQgPSBjYl9zdGFydCArIGNiX3NpemU7IC8qIEVuZCBvZiBjYi4gKi8KKwl1OCAqY2IgPSBjYl9zdGFydDsJLyogQ3VycmVudCBwb3NpdGlvbiBpbiBjYi4gKi8KKwl1OCAqY2Jfc2Jfc3RhcnQgPSBjYjsJLyogQmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IHNiIGluIHRoZSBjYi4gKi8KKwl1OCAqY2Jfc2JfZW5kOwkJLyogRW5kIG9mIGN1cnJlbnQgc2IgLyBiZWdpbm5pbmcgb2YgbmV4dCBzYi4gKi8KKworCS8qIFZhcmlhYmxlcyBmb3IgdW5jb21wcmVzc2VkIGRhdGEgLyBkZXN0aW5hdGlvbi4gKi8KKwlzdHJ1Y3QgcGFnZSAqZHA7CS8qIEN1cnJlbnQgZGVzdGluYXRpb24gcGFnZSBiZWluZyB3b3JrZWQgb24uICovCisJdTggKmRwX2FkZHI7CQkvKiBDdXJyZW50IHBvaW50ZXIgaW50byBkcC4gKi8KKwl1OCAqZHBfc2Jfc3RhcnQ7CS8qIFN0YXJ0IG9mIGN1cnJlbnQgc3ViLWJsb2NrIGluIGRwLiAqLworCXU4ICpkcF9zYl9lbmQ7CQkvKiBFbmQgb2YgY3VycmVudCBzYiBpbiBkcCAoZHBfc2Jfc3RhcnQgKworCQkJCSAgIE5URlNfU0JfU0laRSkuICovCisJdTE2IGRvX3NiX3N0YXJ0OwkvKiBAZGVzdF9vZnMgd2hlbiBzdGFydGluZyB0aGlzIHN1Yi1ibG9jay4gKi8KKwl1MTYgZG9fc2JfZW5kOwkJLyogQGRlc3Rfb2ZzIG9mIGVuZCBvZiB0aGlzIHNiIChkb19zYl9zdGFydCArCisJCQkJICAgTlRGU19TQl9TSVpFKS4gKi8KKworCS8qIFZhcmlhYmxlcyBmb3IgdGFnIGFuZCB0b2tlbiBwYXJzaW5nLiAqLworCXU4IHRhZzsJCQkvKiBDdXJyZW50IHRhZy4gKi8KKwlpbnQgdG9rZW47CQkvKiBMb29wIGNvdW50ZXIgZm9yIHRoZSBlaWdodCB0b2tlbnMgaW4gdGFnLiAqLworCisJLyogTmVlZCB0aGlzIGJlY2F1c2Ugd2UgY2FuJ3Qgc2xlZXAsIHNvIG5lZWQgdHdvIHN0YWdlcy4gKi8KKwlpbnQgY29tcGxldGVkX3BhZ2VzW2Rlc3RfbWF4X2luZGV4IC0gKmRlc3RfaW5kZXggKyAxXTsKKwlpbnQgbnJfY29tcGxldGVkX3BhZ2VzID0gMDsKKworCS8qIERlZmF1bHQgZXJyb3IgY29kZS4gKi8KKwlpbnQgZXJyID0gLUVPVkVSRkxPVzsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLCBjYl9zaXplID0gMHgleC4iLCBjYl9zaXplKTsKK2RvX25leHRfc2I6CisJbnRmc19kZWJ1ZygiQmVnaW5uaW5nIHN1Yi1ibG9jayBhdCBvZmZzZXQgPSAweCV6eCBpbiB0aGUgY2IuIiwKKwkJCWNiIC0gY2Jfc3RhcnQpOworCS8qCisJICogSGF2ZSB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGNvbXByZXNzaW9uIGJsb2NrIG9yIHRoZSBlbmQgb2YgdGhlCisJICogZGVjb21wcmVzc2VkIGRhdGE/ICBUaGUgbGF0dGVyIGNhbiBoYXBwZW4gZm9yIGV4YW1wbGUgaWYgdGhlIGN1cnJlbnQKKwkgKiBwb3NpdGlvbiBpbiB0aGUgY29tcHJlc3Npb24gYmxvY2sgaXMgb25lIGJ5dGUgYmVmb3JlIGl0cyBlbmQgc28gdGhlCisJICogZmlyc3QgdHdvIGNoZWNrcyBkbyBub3QgZGV0ZWN0IGl0LgorCSAqLworCWlmIChjYiA9PSBjYl9lbmQgfHwgIWxlMTZfdG9fY3B1cCgobGUxNiopY2IpIHx8CisJCQkoKmRlc3RfaW5kZXggPT0gZGVzdF9tYXhfaW5kZXggJiYKKwkJCSpkZXN0X29mcyA9PSBkZXN0X21heF9vZnMpKSB7CisJCWludCBpOworCisJCW50ZnNfZGVidWcoIkNvbXBsZXRlZC4gUmV0dXJuaW5nIHN1Y2Nlc3MgKDApLiIpOworCQllcnIgPSAwOworcmV0dXJuX2Vycm9yOgorCQkvKiBXZSBjYW4gc2xlZXAgZnJvbSBub3cgb24sIHNvIHdlIGRyb3AgbG9jay4gKi8KKwkJc3Bpbl91bmxvY2soJm50ZnNfY2JfbG9jayk7CisJCS8qIFNlY29uZCBzdGFnZTogZmluYWxpemUgY29tcGxldGVkIHBhZ2VzLiAqLworCQlpZiAobnJfY29tcGxldGVkX3BhZ2VzID4gMCkgeworCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBkZXN0X3BhZ2VzW2NvbXBsZXRlZF9wYWdlc1swXV07CisJCQludGZzX2lub2RlICpuaSA9IE5URlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KTsKKworCQkJZm9yIChpID0gMDsgaSA8IG5yX2NvbXBsZXRlZF9wYWdlczsgaSsrKSB7CisJCQkJaW50IGRpID0gY29tcGxldGVkX3BhZ2VzW2ldOworCisJCQkJZHAgPSBkZXN0X3BhZ2VzW2RpXTsKKwkJCQkvKgorCQkJCSAqIElmIHdlIGFyZSBvdXRzaWRlIHRoZSBpbml0aWFsaXplZCBzaXplLCB6ZXJvCisJCQkJICogdGhlIG91dCBvZiBib3VuZHMgcGFnZSByYW5nZS4KKwkJCQkgKi8KKwkJCQloYW5kbGVfYm91bmRzX2NvbXByZXNzZWRfcGFnZShuaSwgZHApOworCQkJCWZsdXNoX2RjYWNoZV9wYWdlKGRwKTsKKwkJCQlrdW5tYXAoZHApOworCQkJCVNldFBhZ2VVcHRvZGF0ZShkcCk7CisJCQkJdW5sb2NrX3BhZ2UoZHApOworCQkJCWlmIChkaSA9PSB4cGFnZSkKKwkJCQkJKnhwYWdlX2RvbmUgPSAxOworCQkJCWVsc2UKKwkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKGRwKTsKKwkJCQlkZXN0X3BhZ2VzW2RpXSA9IE5VTEw7CisJCQl9CisJCX0KKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBTZXR1cCBvZmZzZXRzIGZvciB0aGUgY3VycmVudCBzdWItYmxvY2sgZGVzdGluYXRpb24uICovCisJZG9fc2Jfc3RhcnQgPSAqZGVzdF9vZnM7CisJZG9fc2JfZW5kID0gZG9fc2Jfc3RhcnQgKyBOVEZTX1NCX1NJWkU7CisKKwkvKiBDaGVjayB0aGF0IHdlIGFyZSBzdGlsbCB3aXRoaW4gYWxsb3dlZCBib3VuZGFyaWVzLiAqLworCWlmICgqZGVzdF9pbmRleCA9PSBkZXN0X21heF9pbmRleCAmJiBkb19zYl9lbmQgPiBkZXN0X21heF9vZnMpCisJCWdvdG8gcmV0dXJuX292ZXJmbG93OworCisJLyogRG9lcyB0aGUgbWluaW11bSBzaXplIG9mIGEgY29tcHJlc3NlZCBzYiBvdmVyZmxvdyB2YWxpZCByYW5nZT8gKi8KKwlpZiAoY2IgKyA2ID4gY2JfZW5kKQorCQlnb3RvIHJldHVybl9vdmVyZmxvdzsKKworCS8qIFNldHVwIHRoZSBjdXJyZW50IHN1Yi1ibG9jayBzb3VyY2UgcG9pbnRlcnMgYW5kIHZhbGlkYXRlIHJhbmdlLiAqLworCWNiX3NiX3N0YXJ0ID0gY2I7CisJY2Jfc2JfZW5kID0gY2Jfc2Jfc3RhcnQgKyAobGUxNl90b19jcHVwKChsZTE2KiljYikgJiBOVEZTX1NCX1NJWkVfTUFTSykKKwkJCSsgMzsKKwlpZiAoY2Jfc2JfZW5kID4gY2JfZW5kKQorCQlnb3RvIHJldHVybl9vdmVyZmxvdzsKKworCS8qIEdldCB0aGUgY3VycmVudCBkZXN0aW5hdGlvbiBwYWdlLiAqLworCWRwID0gZGVzdF9wYWdlc1sqZGVzdF9pbmRleF07CisJaWYgKCFkcCkgeworCQkvKiBObyBwYWdlIHByZXNlbnQuIFNraXAgZGVjb21wcmVzc2lvbiBvZiB0aGlzIHN1Yi1ibG9jay4gKi8KKwkJY2IgPSBjYl9zYl9lbmQ7CisKKwkJLyogQWR2YW5jZSBkZXN0aW5hdGlvbiBwb3NpdGlvbiB0byBuZXh0IHN1Yi1ibG9jay4gKi8KKwkJKmRlc3Rfb2ZzID0gKCpkZXN0X29mcyArIE5URlNfU0JfU0laRSkgJiB+UEFHRV9DQUNIRV9NQVNLOworCQlpZiAoISpkZXN0X29mcyAmJiAoKysqZGVzdF9pbmRleCA+IGRlc3RfbWF4X2luZGV4KSkKKwkJCWdvdG8gcmV0dXJuX292ZXJmbG93OworCQlnb3RvIGRvX25leHRfc2I7CisJfQorCisJLyogV2UgaGF2ZSBhIHZhbGlkIGRlc3RpbmF0aW9uIHBhZ2UuIFNldHVwIHRoZSBkZXN0aW5hdGlvbiBwb2ludGVycy4gKi8KKwlkcF9hZGRyID0gKHU4KilwYWdlX2FkZHJlc3MoZHApICsgZG9fc2Jfc3RhcnQ7CisKKwkvKiBOb3csIHdlIGFyZSByZWFkeSB0byBwcm9jZXNzIHRoZSBjdXJyZW50IHN1Yi1ibG9jayAoc2IpLiAqLworCWlmICghKGxlMTZfdG9fY3B1cCgobGUxNiopY2IpICYgTlRGU19TQl9JU19DT01QUkVTU0VEKSkgeworCQludGZzX2RlYnVnKCJGb3VuZCB1bmNvbXByZXNzZWQgc3ViLWJsb2NrLiIpOworCQkvKiBUaGlzIHNiIGlzIG5vdCBjb21wcmVzc2VkLCBqdXN0IGNvcHkgaXQgaW50byBkZXN0aW5hdGlvbi4gKi8KKworCQkvKiBBZHZhbmNlIHNvdXJjZSBwb3NpdGlvbiB0byBmaXJzdCBkYXRhIGJ5dGUuICovCisJCWNiICs9IDI7CisKKwkJLyogQW4gdW5jb21wcmVzc2VkIHNiIG11c3QgYmUgZnVsbCBzaXplLiAqLworCQlpZiAoY2Jfc2JfZW5kIC0gY2IgIT0gTlRGU19TQl9TSVpFKQorCQkJZ290byByZXR1cm5fb3ZlcmZsb3c7CisKKwkJLyogQ29weSB0aGUgYmxvY2sgYW5kIGFkdmFuY2UgdGhlIHNvdXJjZSBwb3NpdGlvbi4gKi8KKwkJbWVtY3B5KGRwX2FkZHIsIGNiLCBOVEZTX1NCX1NJWkUpOworCQljYiArPSBOVEZTX1NCX1NJWkU7CisKKwkJLyogQWR2YW5jZSBkZXN0aW5hdGlvbiBwb3NpdGlvbiB0byBuZXh0IHN1Yi1ibG9jay4gKi8KKwkJKmRlc3Rfb2ZzICs9IE5URlNfU0JfU0laRTsKKwkJaWYgKCEoKmRlc3Rfb2ZzICY9IH5QQUdFX0NBQ0hFX01BU0spKSB7CitmaW5hbGl6ZV9wYWdlOgorCQkJLyoKKwkJCSAqIEZpcnN0IHN0YWdlOiBhZGQgY3VycmVudCBwYWdlIGluZGV4IHRvIGFycmF5IG9mCisJCQkgKiBjb21wbGV0ZWQgcGFnZXMuCisJCQkgKi8KKwkJCWNvbXBsZXRlZF9wYWdlc1tucl9jb21wbGV0ZWRfcGFnZXMrK10gPSAqZGVzdF9pbmRleDsKKwkJCWlmICgrKypkZXN0X2luZGV4ID4gZGVzdF9tYXhfaW5kZXgpCisJCQkJZ290byByZXR1cm5fb3ZlcmZsb3c7CisJCX0KKwkJZ290byBkb19uZXh0X3NiOworCX0KKwludGZzX2RlYnVnKCJGb3VuZCBjb21wcmVzc2VkIHN1Yi1ibG9jay4iKTsKKwkvKiBUaGlzIHNiIGlzIGNvbXByZXNzZWQsIGRlY29tcHJlc3MgaXQgaW50byBkZXN0aW5hdGlvbi4gKi8KKworCS8qIFNldHVwIGRlc3RpbmF0aW9uIHBvaW50ZXJzLiAqLworCWRwX3NiX3N0YXJ0ID0gZHBfYWRkcjsKKwlkcF9zYl9lbmQgPSBkcF9zYl9zdGFydCArIE5URlNfU0JfU0laRTsKKworCS8qIEZvcndhcmQgdG8gdGhlIGZpcnN0IHRhZyBpbiB0aGUgc3ViLWJsb2NrLiAqLworCWNiICs9IDI7Citkb19uZXh0X3RhZzoKKwlpZiAoY2IgPT0gY2Jfc2JfZW5kKSB7CisJCS8qIENoZWNrIGlmIHRoZSBkZWNvbXByZXNzZWQgc3ViLWJsb2NrIHdhcyBub3QgZnVsbC1sZW5ndGguICovCisJCWlmIChkcF9hZGRyIDwgZHBfc2JfZW5kKSB7CisJCQlpbnQgbnJfYnl0ZXMgPSBkb19zYl9lbmQgLSAqZGVzdF9vZnM7CisKKwkJCW50ZnNfZGVidWcoIkZpbGxpbmcgaW5jb21wbGV0ZSBzdWItYmxvY2sgd2l0aCAiCisJCQkJCSJ6ZXJvZXMuIik7CisJCQkvKiBaZXJvIHJlbWFpbmRlciBhbmQgdXBkYXRlIGRlc3RpbmF0aW9uIHBvc2l0aW9uLiAqLworCQkJbWVtc2V0KGRwX2FkZHIsIDAsIG5yX2J5dGVzKTsKKwkJCSpkZXN0X29mcyArPSBucl9ieXRlczsKKwkJfQorCQkvKiBXZSBoYXZlIGZpbmlzaGVkIHRoZSBjdXJyZW50IHN1Yi1ibG9jay4gKi8KKwkJaWYgKCEoKmRlc3Rfb2ZzICY9IH5QQUdFX0NBQ0hFX01BU0spKQorCQkJZ290byBmaW5hbGl6ZV9wYWdlOworCQlnb3RvIGRvX25leHRfc2I7CisJfQorCisJLyogQ2hlY2sgd2UgYXJlIHN0aWxsIGluIHJhbmdlLiAqLworCWlmIChjYiA+IGNiX3NiX2VuZCB8fCBkcF9hZGRyID4gZHBfc2JfZW5kKQorCQlnb3RvIHJldHVybl9vdmVyZmxvdzsKKworCS8qIEdldCB0aGUgbmV4dCB0YWcgYW5kIGFkdmFuY2UgdG8gZmlyc3QgdG9rZW4uICovCisJdGFnID0gKmNiKys7CisKKwkvKiBQYXJzZSB0aGUgZWlnaHQgdG9rZW5zIGRlc2NyaWJlZCBieSB0aGUgdGFnLiAqLworCWZvciAodG9rZW4gPSAwOyB0b2tlbiA8IDg7IHRva2VuKyssIHRhZyA+Pj0gMSkgeworCQl1MTYgbGcsIHB0LCBsZW5ndGgsIG1heF9ub25fb3ZlcmxhcDsKKwkJcmVnaXN0ZXIgdTE2IGk7CisJCXU4ICpkcF9iYWNrX2FkZHI7CisKKwkJLyogQ2hlY2sgaWYgd2UgYXJlIGRvbmUgLyBzdGlsbCBpbiByYW5nZS4gKi8KKwkJaWYgKGNiID49IGNiX3NiX2VuZCB8fCBkcF9hZGRyID4gZHBfc2JfZW5kKQorCQkJYnJlYWs7CisKKwkJLyogRGV0ZXJtaW5lIHRva2VuIHR5cGUgYW5kIHBhcnNlIGFwcHJvcHJpYXRlbHkuKi8KKwkJaWYgKCh0YWcgJiBOVEZTX1RPS0VOX01BU0spID09IE5URlNfU1lNQk9MX1RPS0VOKSB7CisJCQkvKgorCQkJICogV2UgaGF2ZSBhIHN5bWJvbCB0b2tlbiwgY29weSB0aGUgc3ltYm9sIGFjcm9zcywgYW5kCisJCQkgKiBhZHZhbmNlIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvc2l0aW9ucy4KKwkJCSAqLworCQkJKmRwX2FkZHIrKyA9ICpjYisrOworCQkJKysqZGVzdF9vZnM7CisKKwkJCS8qIENvbnRpbnVlIHdpdGggdGhlIG5leHQgdG9rZW4uICovCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFdlIGhhdmUgYSBwaHJhc2UgdG9rZW4uIE1ha2Ugc3VyZSBpdCBpcyBub3QgdGhlIGZpcnN0IHRhZyBpbgorCQkgKiB0aGUgc2IgYXMgdGhpcyBpcyBpbGxlZ2FsIGFuZCB3b3VsZCBjb25mdXNlIHRoZSBjb2RlIGJlbG93LgorCQkgKi8KKwkJaWYgKGRwX2FkZHIgPT0gZHBfc2Jfc3RhcnQpCisJCQlnb3RvIHJldHVybl9vdmVyZmxvdzsKKworCQkvKgorCQkgKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBieXRlcyB0byBnbyBiYWNrIChwKSBhbmQgdGhlIG51bWJlcgorCQkgKiBvZiBieXRlcyB0byBjb3B5IChsKS4gV2UgdXNlIGFuIG9wdGltaXplZCBhbGdvcml0aG0gaW4gd2hpY2gKKwkJICogd2UgZmlyc3QgY2FsY3VsYXRlIGxvZzIoY3VycmVudCBkZXN0aW5hdGlvbiBwb3NpdGlvbiBpbiBzYiksCisJCSAqIHdoaWNoIGFsbG93cyBkZXRlcm1pbmF0aW9uIG9mIGwgYW5kIHAgaW4gTygxKSByYXRoZXIgdGhhbgorCQkgKiBPKG4pLiBXZSBqdXN0IG5lZWQgYW4gYXJjaC1vcHRpbWl6ZWQgbG9nMigpIGZ1bmN0aW9uIG5vdy4KKwkJICovCisJCWxnID0gMDsKKwkJZm9yIChpID0gKmRlc3Rfb2ZzIC0gZG9fc2Jfc3RhcnQgLSAxOyBpID49IDB4MTA7IGkgPj49IDEpCisJCQlsZysrOworCisJCS8qIEdldCB0aGUgcGhyYXNlIHRva2VuIGludG8gaS4gKi8KKwkJcHQgPSBsZTE2X3RvX2NwdXAoKGxlMTYqKWNiKTsKKworCQkvKgorCQkgKiBDYWxjdWxhdGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIGJ5dGUgc2VxdWVuY2UgaW4KKwkJICogdGhlIGRlc3RpbmF0aW9uIHVzaW5nIHRoZSBmYWN0IHRoYXQgcCA9IChwdCA+PiAoMTIgLSBsZykpICsgMQorCQkgKiBhbmQgbWFrZSBzdXJlIHdlIGRvbid0IGdvIHRvbyBmYXIgYmFjay4KKwkJICovCisJCWRwX2JhY2tfYWRkciA9IGRwX2FkZHIgLSAocHQgPj4gKDEyIC0gbGcpKSAtIDE7CisJCWlmIChkcF9iYWNrX2FkZHIgPCBkcF9zYl9zdGFydCkKKwkJCWdvdG8gcmV0dXJuX292ZXJmbG93OworCisJCS8qIE5vdyBjYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgYnl0ZSBzZXF1ZW5jZS4gKi8KKwkJbGVuZ3RoID0gKHB0ICYgKDB4ZmZmID4+IGxnKSkgKyAzOworCisJCS8qIEFkdmFuY2UgZGVzdGluYXRpb24gcG9zaXRpb24gYW5kIHZlcmlmeSBpdCBpcyBpbiByYW5nZS4gKi8KKwkJKmRlc3Rfb2ZzICs9IGxlbmd0aDsKKwkJaWYgKCpkZXN0X29mcyA+IGRvX3NiX2VuZCkKKwkJCWdvdG8gcmV0dXJuX292ZXJmbG93OworCisJCS8qIFRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIGJ5dGVzLiAqLworCQltYXhfbm9uX292ZXJsYXAgPSBkcF9hZGRyIC0gZHBfYmFja19hZGRyOworCisJCWlmIChsZW5ndGggPD0gbWF4X25vbl9vdmVybGFwKSB7CisJCQkvKiBUaGUgYnl0ZSBzZXF1ZW5jZSBkb2Vzbid0IG92ZXJsYXAsIGp1c3QgY29weSBpdC4gKi8KKwkJCW1lbWNweShkcF9hZGRyLCBkcF9iYWNrX2FkZHIsIGxlbmd0aCk7CisKKwkJCS8qIEFkdmFuY2UgZGVzdGluYXRpb24gcG9pbnRlci4gKi8KKwkJCWRwX2FkZHIgKz0gbGVuZ3RoOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFRoZSBieXRlIHNlcXVlbmNlIGRvZXMgb3ZlcmxhcCwgY29weSBub24tb3ZlcmxhcHBpbmcKKwkJCSAqIHBhcnQgYW5kIHRoZW4gZG8gYSBzbG93IGJ5dGUgYnkgYnl0ZSBjb3B5IGZvciB0aGUKKwkJCSAqIG92ZXJsYXBwaW5nIHBhcnQuIEFsc28sIGFkdmFuY2UgdGhlIGRlc3RpbmF0aW9uCisJCQkgKiBwb2ludGVyLgorCQkJICovCisJCQltZW1jcHkoZHBfYWRkciwgZHBfYmFja19hZGRyLCBtYXhfbm9uX292ZXJsYXApOworCQkJZHBfYWRkciArPSBtYXhfbm9uX292ZXJsYXA7CisJCQlkcF9iYWNrX2FkZHIgKz0gbWF4X25vbl9vdmVybGFwOworCQkJbGVuZ3RoIC09IG1heF9ub25fb3ZlcmxhcDsKKwkJCXdoaWxlIChsZW5ndGgtLSkKKwkJCQkqZHBfYWRkcisrID0gKmRwX2JhY2tfYWRkcisrOworCQl9CisKKwkJLyogQWR2YW5jZSBzb3VyY2UgcG9zaXRpb24gYW5kIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgdG9rZW4uICovCisJCWNiICs9IDI7CisJfQorCisJLyogTm8gdG9rZW5zIGxlZnQgaW4gdGhlIGN1cnJlbnQgdGFnLiBDb250aW51ZSB3aXRoIHRoZSBuZXh0IHRhZy4gKi8KKwlnb3RvIGRvX25leHRfdGFnOworCityZXR1cm5fb3ZlcmZsb3c6CisJbnRmc19lcnJvcihOVUxMLCAiRmFpbGVkLiBSZXR1cm5pbmcgLUVPVkVSRkxPVy4iKTsKKwlnb3RvIHJldHVybl9lcnJvcjsKK30KKworLyoqCisgKiBudGZzX3JlYWRfY29tcHJlc3NlZF9ibG9jayAtIHJlYWQgYSBjb21wcmVzc2VkIGJsb2NrIGludG8gdGhlIHBhZ2UgY2FjaGUKKyAqIEBwYWdlOglsb2NrZWQgcGFnZSBpbiB0aGUgY29tcHJlc3Npb24gYmxvY2socykgd2UgbmVlZCB0byByZWFkCisgKgorICogV2hlbiB3ZSBhcmUgY2FsbGVkIHRoZSBwYWdlIGhhcyBhbHJlYWR5IGJlZW4gdmVyaWZpZWQgdG8gYmUgbG9ja2VkIGFuZCB0aGUKKyAqIGF0dHJpYnV0ZSBpcyBrbm93biB0byBiZSBub24tcmVzaWRlbnQsIG5vdCBlbmNyeXB0ZWQsIGJ1dCBjb21wcmVzc2VkLgorICoKKyAqIDEuIERldGVybWluZSB3aGljaCBjb21wcmVzc2lvbiBibG9jayhzKSBAcGFnZSBpcyBpbi4KKyAqIDIuIEdldCBob2xkIG9mIGFsbCBwYWdlcyBjb3JyZXNwb25kaW5nIHRvIHRoaXMvdGhlc2UgY29tcHJlc3Npb24gYmxvY2socykuCisgKiAzLiBSZWFkIHRoZSAoZmlyc3QpIGNvbXByZXNzaW9uIGJsb2NrLgorICogNC4gRGVjb21wcmVzcyBpdCBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIHBhZ2VzLgorICogNS4gVGhyb3cgdGhlIGNvbXByZXNzZWQgZGF0YSBhd2F5IGFuZCBwcm9jZWVkIHRvIDMuIGZvciB0aGUgbmV4dCBjb21wcmVzc2lvbgorICogICAgYmxvY2sgb3IgcmV0dXJuIHN1Y2Nlc3MgaWYgbm8gbW9yZSBjb21wcmVzc2lvbiBibG9ja3MgbGVmdC4KKyAqCisgKiBXYXJuaW5nOiBXZSBoYXZlIHRvIGJlIGNhcmVmdWwgd2hhdCB3ZSBkbyBhYm91dCBleGlzdGluZyBwYWdlcy4gVGhleSBtaWdodAorICogaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gc28gdGhhdCB3ZSB3b3VsZCBsb3NlIGRhdGEgaWYgd2Ugd2VyZSB0byBqdXN0IG92ZXJ3cml0ZQorICogdGhlbSB3aXRoIHRoZSBvdXQtb2YtZGF0ZSB1bmNvbXByZXNzZWQgZGF0YS4KKyAqCisgKiBGSVhNRTogRm9yIFBBR0VfQ0FDSEVfU0laRSA+IGNiX3NpemUgd2UgYXJlIG5vdCBkb2luZyB0aGUgUmlnaHQgVGhpbmcoVE0pIGF0CisgKiB0aGUgZW5kIG9mIHRoZSBmaWxlIEkgdGhpbmsuIFdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMgY2FzZSBhbmQgemVybyB0aGUgb3V0CisgKiBvZiBib3VuZHMgcmVtYWluZGVyIG9mIHRoZSBwYWdlIGluIHF1ZXN0aW9uIGFuZCBtYXJrIGl0IGFzIGhhbmRsZWQuIEF0IHRoZQorICogbW9tZW50IHdlIHdvdWxkIGp1c3QgcmV0dXJuIC1FSU8gb24gc3VjaCBhIHBhZ2UuIFRoaXMgYnVnIHdpbGwgb25seSBiZWNvbWUKKyAqIGFwcGFyZW50IGlmIHBhZ2VzIGFyZSBhYm92ZSA4a2lCIGFuZCB0aGUgTlRGUyB2b2x1bWUgb25seSB1c2VzIDUxMiBieXRlCisgKiBjbHVzdGVycyBzbyBpcyBwcm9iYWJseSBub3QgZ29pbmcgdG8gYmUgc2VlbiBieSBhbnlvbmUuIFN0aWxsIHRoaXMgc2hvdWxkCisgKiBiZSBmaXhlZC4gKEFJQSkKKyAqCisgKiBGSVhNRTogQWdhaW4gZm9yIFBBR0VfQ0FDSEVfU0laRSA+IGNiX3NpemUgd2UgYXJlIHNjcmV3aW5nIHVwIGJvdGggaW4KKyAqIGhhbmRsaW5nIHNwYXJzZSBhbmQgY29tcHJlc3NlZCBjYnMuIChBSUEpCisgKgorICogRklYTUU6IEF0IHRoZSBtb21lbnQgd2UgZG9uJ3QgZG8gYW55IHplcm9pbmcgb3V0IGluIHRoZSBjYXNlIHRoYXQKKyAqIGluaXRpYWxpemVkX3NpemUgaXMgbGVzcyB0aGFuIGRhdGFfc2l6ZS4gVGhpcyBzaG91bGQgYmUgc2FmZSBiZWNhdXNlIG9mIHRoZQorICogbmF0dXJlIG9mIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gdXNlZC4gSnVzdCBpbiBjYXNlIHdlIGNoZWNrIGFuZCBvdXRwdXQKKyAqIGFuIGVycm9yIG1lc3NhZ2UgaW4gcmVhZCBpbm9kZSBpZiB0aGUgdHdvIHNpemVzIGFyZSBub3QgZXF1YWwgZm9yIGEKKyAqIGNvbXByZXNzZWQgZmlsZS4gKEFJQSkKKyAqLworaW50IG50ZnNfcmVhZF9jb21wcmVzc2VkX2Jsb2NrKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKKwludGZzX2lub2RlICpuaSA9IE5URlNfSShtYXBwaW5nLT5ob3N0KTsKKwludGZzX3ZvbHVtZSAqdm9sID0gbmktPnZvbDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gdm9sLT5zYjsKKwlydW5saXN0X2VsZW1lbnQgKnJsOworCXVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIGJsb2NrX3NpemVfYml0cyA9IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCXU4ICpjYiwgKmNiX3BvcywgKmNiX2VuZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHM7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQsIGluZGV4ID0gcGFnZS0+aW5kZXg7CisJdTMyIGNiX3NpemUgPSBuaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19zaXplOworCXU2NCBjYl9zaXplX21hc2sgPSBjYl9zaXplIC0gMVVMOworCVZDTiB2Y247CisJTENOIGxjbjsKKwkvKiBUaGUgZmlyc3Qgd2FudGVkIHZjbiAobWluaW11bSBhbGlnbm1lbnQgaXMgUEFHRV9DQUNIRV9TSVpFKS4gKi8KKwlWQ04gc3RhcnRfdmNuID0gKCgoczY0KWluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICYgfmNiX3NpemVfbWFzaykgPj4KKwkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CisJLyoKKwkgKiBUaGUgZmlyc3QgdmNuIGFmdGVyIHRoZSBsYXN0IHdhbnRlZCB2Y24gKG1pbnVtdW0gYWxpZ25tZW50IGlzIGFnYWluCisJICogUEFHRV9DQUNIRV9TSVpFLgorCSAqLworCVZDTiBlbmRfdmNuID0gKCgoKHM2NCkoaW5kZXggKyAxVUwpIDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgY2Jfc2l6ZSAtIDEpCisJCQkmIH5jYl9zaXplX21hc2spID4+IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CisJLyogTnVtYmVyIG9mIGNvbXByZXNzaW9uIGJsb2NrcyAoY2JzKSBpbiB0aGUgd2FudGVkIHZjbiByYW5nZS4gKi8KKwl1bnNpZ25lZCBpbnQgbnJfY2JzID0gKGVuZF92Y24gLSBzdGFydF92Y24pIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMKKwkJCT4+IG5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX3NpemVfYml0czsKKwkvKgorCSAqIE51bWJlciBvZiBwYWdlcyByZXF1aXJlZCB0byBzdG9yZSB0aGUgdW5jb21wcmVzc2VkIGRhdGEgZnJvbSBhbGwKKwkgKiBjb21wcmVzc2lvbiBibG9ja3MgKGNicykgb3ZlcmxhcHBpbmcgQHBhZ2UuIER1ZSB0byBhbGlnbm1lbnQKKwkgKiBndWFyYW50ZWVzIG9mIHN0YXJ0X3ZjbiBhbmQgZW5kX3Zjbiwgbm8gbmVlZCB0byByb3VuZCB1cCBoZXJlLgorCSAqLworCXVuc2lnbmVkIGludCBucl9wYWdlcyA9IChlbmRfdmNuIC0gc3RhcnRfdmNuKSA8PAorCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0cyA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIGludCB4cGFnZSwgbWF4X3BhZ2UsIGN1cl9wYWdlLCBjdXJfb2ZzLCBpOworCXVuc2lnbmVkIGludCBjYl9jbHVzdGVycywgY2JfbWF4X29mczsKKwlpbnQgYmxvY2ssIG1heF9ibG9jaywgY2JfbWF4X3BhZ2UsIGJoc19zaXplLCBucl9iaHMsIGVyciA9IDA7CisJc3RydWN0IHBhZ2UgKipwYWdlczsKKwl1bnNpZ25lZCBjaGFyIHhwYWdlX2RvbmUgPSAwOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcsIHBhZ2UtPmluZGV4ID0gMHglbHgsIGNiX3NpemUgPSAweCV4LCBucl9wYWdlcyA9ICIKKwkJCSIlaS4iLCBpbmRleCwgY2Jfc2l6ZSwgbnJfcGFnZXMpOworCS8qCisJICogQmFkIHRoaW5ncyBoYXBwZW4gaWYgd2UgZ2V0IGhlcmUgZm9yIGFueXRoaW5nIHRoYXQgaXMgbm90IGFuCisJICogdW5uYW1lZCAkREFUQSBhdHRyaWJ1dGUuCisJICovCisJQlVHX09OKG5pLT50eXBlICE9IEFUX0RBVEEpOworCUJVR19PTihuaS0+bmFtZV9sZW4pOworCisJcGFnZXMgPSBrbWFsbG9jKG5yX3BhZ2VzICogc2l6ZW9mKHN0cnVjdCBwYWdlICopLCBHRlBfTk9GUyk7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgdGhlIGJ1ZmZlciBoZWFkcyB3ZSBuZWVkLiAqLworCWJoc19zaXplID0gY2Jfc2l6ZSAvIGJsb2NrX3NpemUgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopOworCWJocyA9IGttYWxsb2MoYmhzX3NpemUsIEdGUF9OT0ZTKTsKKworCWlmICh1bmxpa2VseSghcGFnZXMgfHwgIWJocykpIHsKKwkJa2ZyZWUoYmhzKTsKKwkJa2ZyZWUocGFnZXMpOworCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gYWxsb2NhdGUgaW50ZXJuYWwgYnVmZmVycy4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyoKKwkgKiBXZSBoYXZlIGFscmVhZHkgYmVlbiBnaXZlbiBvbmUgcGFnZSwgdGhpcyBpcyB0aGUgb25lIHdlIG11c3QgZG8uCisJICogT25jZSBhZ2FpbiwgdGhlIGFsaWdubWVudCBndWFyYW50ZWVzIGtlZXAgaXQgc2ltcGxlLgorCSAqLworCW9mZnNldCA9IHN0YXJ0X3ZjbiA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJeHBhZ2UgPSBpbmRleCAtIG9mZnNldDsKKwlwYWdlc1t4cGFnZV0gPSBwYWdlOworCS8qCisJICogVGhlIHJlbWFpbmluZyBwYWdlcyBuZWVkIHRvIGJlIGFsbG9jYXRlZCBhbmQgaW5zZXJ0ZWQgaW50byB0aGUgcGFnZQorCSAqIGNhY2hlLCBhbGlnbm1lbnQgZ3VhcmFudGVlcyBrZWVwIGFsbCB0aGUgYmVsb3cgbXVjaCBzaW1wbGVyLiAoLTgKKwkgKi8KKwltYXhfcGFnZSA9ICgoVkZTX0kobmkpLT5pX3NpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PgorCQkJUEFHRV9DQUNIRV9TSElGVCkgLSBvZmZzZXQ7CisJaWYgKG5yX3BhZ2VzIDwgbWF4X3BhZ2UpCisJCW1heF9wYWdlID0gbnJfcGFnZXM7CisJZm9yIChpID0gMDsgaSA8IG1heF9wYWdlOyBpKyssIG9mZnNldCsrKSB7CisJCWlmIChpICE9IHhwYWdlKQorCQkJcGFnZXNbaV0gPSBncmFiX2NhY2hlX3BhZ2Vfbm93YWl0KG1hcHBpbmcsIG9mZnNldCk7CisJCXBhZ2UgPSBwYWdlc1tpXTsKKwkJaWYgKHBhZ2UpIHsKKwkJCS8qCisJCQkgKiBXZSBvbmx5IChyZSlyZWFkIHRoZSBwYWdlIGlmIGl0IGlzbid0IGFscmVhZHkgcmVhZAorCQkJICogaW4gYW5kL29yIGRpcnR5IG9yIHdlIHdvdWxkIGJlIGxvc2luZyBkYXRhIG9yIGF0CisJCQkgKiBsZWFzdCB3YXN0aW5nIG91ciB0aW1lLgorCQkJICovCisJCQlpZiAoIVBhZ2VEaXJ0eShwYWdlKSAmJiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSB8fAorCQkJCQlQYWdlRXJyb3IocGFnZSkpKSB7CisJCQkJQ2xlYXJQYWdlRXJyb3IocGFnZSk7CisJCQkJa21hcChwYWdlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJcGFnZXNbaV0gPSBOVUxMOworCQl9CisJfQorCisJLyoKKwkgKiBXZSBoYXZlIHRoZSBydW5saXN0LCBhbmQgYWxsIHRoZSBkZXN0aW5hdGlvbiBwYWdlcyB3ZSBuZWVkIHRvIGZpbGwuCisJICogTm93IHJlYWQgdGhlIGZpcnN0IGNvbXByZXNzaW9uIGJsb2NrLgorCSAqLworCWN1cl9wYWdlID0gMDsKKwljdXJfb2ZzID0gMDsKKwljYl9jbHVzdGVycyA9IG5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX2NsdXN0ZXJzOworZG9fbmV4dF9jYjoKKwlucl9jYnMtLTsKKwlucl9iaHMgPSAwOworCisJLyogUmVhZCBhbGwgY2IgYnVmZmVyIGhlYWRzIG9uZSBjbHVzdGVyIGF0IGEgdGltZS4gKi8KKwlybCA9IE5VTEw7CisJZm9yICh2Y24gPSBzdGFydF92Y24sIHN0YXJ0X3ZjbiArPSBjYl9jbHVzdGVyczsgdmNuIDwgc3RhcnRfdmNuOworCQkJdmNuKyspIHsKKwkJQk9PTCBpc19yZXRyeSA9IEZBTFNFOworCisJCWlmICghcmwpIHsKK2xvY2tfcmV0cnlfcmVtYXA6CisJCQlkb3duX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJcmwgPSBuaS0+cnVubGlzdC5ybDsKKwkJfQorCQlpZiAobGlrZWx5KHJsICE9IE5VTEwpKSB7CisJCQkvKiBTZWVrIHRvIGVsZW1lbnQgY29udGFpbmluZyB0YXJnZXQgdmNuLiAqLworCQkJd2hpbGUgKHJsLT5sZW5ndGggJiYgcmxbMV0udmNuIDw9IHZjbikKKwkJCQlybCsrOworCQkJbGNuID0gbnRmc19ybF92Y25fdG9fbGNuKHJsLCB2Y24pOworCQl9IGVsc2UKKwkJCWxjbiA9IExDTl9STF9OT1RfTUFQUEVEOworCQludGZzX2RlYnVnKCJSZWFkaW5nIHZjbiA9IDB4JWxseCwgbGNuID0gMHglbGx4LiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsY24pOworCQlpZiAobGNuIDwgMCkgeworCQkJLyoKKwkJCSAqIFdoZW4gd2UgcmVhY2ggdGhlIGZpcnN0IHNwYXJzZSBjbHVzdGVyIHdlIGhhdmUKKwkJCSAqIGZpbmlzaGVkIHdpdGggdGhlIGNiLgorCQkJICovCisJCQlpZiAobGNuID09IExDTl9IT0xFKQorCQkJCWJyZWFrOworCQkJaWYgKGlzX3JldHJ5IHx8IGxjbiAhPSBMQ05fUkxfTk9UX01BUFBFRCkKKwkJCQlnb3RvIHJsX2VycjsKKwkJCWlzX3JldHJ5ID0gVFJVRTsKKwkJCS8qCisJCQkgKiBBdHRlbXB0IHRvIG1hcCBydW5saXN0LCBkcm9wcGluZyBsb2NrIGZvciB0aGUKKwkJCSAqIGR1cmF0aW9uLgorCQkJICovCisJCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJCWlmICghbnRmc19tYXBfcnVubGlzdChuaSwgdmNuKSkKKwkJCQlnb3RvIGxvY2tfcmV0cnlfcmVtYXA7CisJCQlnb3RvIG1hcF9ybF9lcnI7CisJCX0KKwkJYmxvY2sgPSBsY24gPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cyA+PiBibG9ja19zaXplX2JpdHM7CisJCS8qIFJlYWQgdGhlIGxjbiBmcm9tIGRldmljZSBpbiBjaHVua3Mgb2YgYmxvY2tfc2l6ZSBieXRlcy4gKi8KKwkJbWF4X2Jsb2NrID0gYmxvY2sgKyAodm9sLT5jbHVzdGVyX3NpemUgPj4gYmxvY2tfc2l6ZV9iaXRzKTsKKwkJZG8geworCQkJbnRmc19kZWJ1ZygiYmxvY2sgPSAweCV4LiIsIGJsb2NrKTsKKwkJCWlmICh1bmxpa2VseSghKGJoc1tucl9iaHNdID0gc2JfZ2V0YmxrKHNiLCBibG9jaykpKSkKKwkJCQlnb3RvIGdldGJsa19lcnI7CisJCQlucl9iaHMrKzsKKwkJfSB3aGlsZSAoKytibG9jayA8IG1heF9ibG9jayk7CisJfQorCisJLyogUmVsZWFzZSB0aGUgbG9jayBpZiB3ZSB0b29rIGl0LiAqLworCWlmIChybCkKKwkJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CisKKwkvKiBTZXR1cCBhbmQgaW5pdGlhdGUgaW8gb24gYWxsIGJ1ZmZlciBoZWFkcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfYmhzOyBpKyspIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICp0YmggPSBiaHNbaV07CisKKwkJaWYgKHVubGlrZWx5KHRlc3Rfc2V0X2J1ZmZlcl9sb2NrZWQodGJoKSkpCisJCQljb250aW51ZTsKKwkJaWYgKHVubGlrZWx5KGJ1ZmZlcl91cHRvZGF0ZSh0YmgpKSkgeworCQkJdW5sb2NrX2J1ZmZlcih0YmgpOworCQkJY29udGludWU7CisJCX0KKwkJZ2V0X2JoKHRiaCk7CisJCXRiaC0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX3JlYWRfc3luYzsKKwkJc3VibWl0X2JoKFJFQUQsIHRiaCk7CisJfQorCisJLyogV2FpdCBmb3IgaW8gY29tcGxldGlvbiBvbiBhbGwgYnVmZmVyIGhlYWRzLiAqLworCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRiaCA9IGJoc1tpXTsKKworCQlpZiAoYnVmZmVyX3VwdG9kYXRlKHRiaCkpCisJCQljb250aW51ZTsKKwkJd2FpdF9vbl9idWZmZXIodGJoKTsKKwkJLyoKKwkJICogV2UgbmVlZCBhbiBvcHRpbWl6YXRpb24gYmFycmllciBoZXJlLCBvdGhlcndpc2Ugd2Ugc3RhcnQKKwkJICogaGl0dGluZyB0aGUgYmVsb3cgZml4dXAgY29kZSB3aGVuIGFjY2Vzc2luZyBhIGxvb3BiYWNrCisJCSAqIG1vdW50ZWQgbnRmcyBwYXJ0aXRpb24uIFRoaXMgaW5kaWNhdGVzIGVpdGhlciB0aGVyZSBpcyBhCisJCSAqIHJhY2UgY29uZGl0aW9uIGluIHRoZSBsb29wIGRyaXZlciBvciwgbW9yZSBsaWtlbHksIGdjYworCQkgKiBvdmVyb3B0aW1pc2VzIHRoZSBjb2RlIHdpdGhvdXQgdGhlIGJhcnJpZXIgYW5kIGl0IGRvZXNuJ3QKKwkJICogZG8gdGhlIFJpZ2h0IFRoaW5nKFRNKS4KKwkJICovCisJCWJhcnJpZXIoKTsKKwkJaWYgKHVubGlrZWx5KCFidWZmZXJfdXB0b2RhdGUodGJoKSkpIHsKKwkJCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiQnVmZmVyIGlzIHVubG9ja2VkIGJ1dCBub3QgIgorCQkJCQkidXB0b2RhdGUhIFVucGx1Z2dpbmcgdGhlIGRpc2sgcXVldWUgIgorCQkJCQkiYW5kIHJlc2NoZWR1bGluZy4iKTsKKwkJCWdldF9iaCh0YmgpOworCQkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKG1hcHBpbmcpOworCQkJc2NoZWR1bGUoKTsKKwkJCXB1dF9iaCh0YmgpOworCQkJaWYgKHVubGlrZWx5KCFidWZmZXJfdXB0b2RhdGUodGJoKSkpCisJCQkJZ290byByZWFkX2VycjsKKwkJCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiQnVmZmVyIGlzIG5vdyB1cHRvZGF0ZS4gR29vZC4iKTsKKwkJfQorCX0KKworCS8qCisJICogR2V0IHRoZSBjb21wcmVzc2lvbiBidWZmZXIuIFdlIG11c3Qgbm90IHNsZWVwIGFueSBtb3JlCisJICogdW50aWwgd2UgYXJlIGZpbmlzaGVkIHdpdGggaXQuCisJICovCisJc3Bpbl9sb2NrKCZudGZzX2NiX2xvY2spOworCWNiID0gbnRmc19jb21wcmVzc2lvbl9idWZmZXI7CisKKwlCVUdfT04oIWNiKTsKKworCWNiX3BvcyA9IGNiOworCWNiX2VuZCA9IGNiICsgY2Jfc2l6ZTsKKworCS8qIENvcHkgdGhlIGJ1ZmZlciBoZWFkcyBpbnRvIHRoZSBjb250aWd1b3VzIGJ1ZmZlci4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfYmhzOyBpKyspIHsKKwkJbWVtY3B5KGNiX3BvcywgYmhzW2ldLT5iX2RhdGEsIGJsb2NrX3NpemUpOworCQljYl9wb3MgKz0gYmxvY2tfc2l6ZTsKKwl9CisKKwkvKiBKdXN0IGEgcHJlY2F1dGlvbi4gKi8KKwlpZiAoY2JfcG9zICsgMiA8PSBjYiArIGNiX3NpemUpCisJCSoodTE2KiljYl9wb3MgPSAwOworCisJLyogUmVzZXQgY2JfcG9zIGJhY2sgdG8gdGhlIGJlZ2lubmluZy4gKi8KKwljYl9wb3MgPSBjYjsKKworCS8qIFdlIG5vdyBoYXZlIGJvdGggc291cmNlIChpZiBwcmVzZW50KSBhbmQgZGVzdGluYXRpb24uICovCisJbnRmc19kZWJ1ZygiU3VjY2Vzc2Z1bGx5IHJlYWQgdGhlIGNvbXByZXNzaW9uIGJsb2NrLiIpOworCisJLyogVGhlIGxhc3QgcGFnZSBhbmQgbWF4aW11bSBvZmZzZXQgd2l0aGluIGl0IGZvciB0aGUgY3VycmVudCBjYi4gKi8KKwljYl9tYXhfcGFnZSA9IChjdXJfcGFnZSA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIGN1cl9vZnMgKyBjYl9zaXplOworCWNiX21heF9vZnMgPSBjYl9tYXhfcGFnZSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJY2JfbWF4X3BhZ2UgPj49IFBBR0VfQ0FDSEVfU0hJRlQ7CisKKwkvKiBDYXRjaCBlbmQgb2YgZmlsZSBpbnNpZGUgYSBjb21wcmVzc2lvbiBibG9jay4gKi8KKwlpZiAoY2JfbWF4X3BhZ2UgPiBtYXhfcGFnZSkKKwkJY2JfbWF4X3BhZ2UgPSBtYXhfcGFnZTsKKworCWlmICh2Y24gPT0gc3RhcnRfdmNuIC0gY2JfY2x1c3RlcnMpIHsKKwkJLyogU3BhcnNlIGNiLCB6ZXJvIG91dCBwYWdlIHJhbmdlIG92ZXJsYXBwaW5nIHRoZSBjYi4gKi8KKwkJbnRmc19kZWJ1ZygiRm91bmQgc3BhcnNlIGNvbXByZXNzaW9uIGJsb2NrLiIpOworCQkvKiBXZSBjYW4gc2xlZXAgZnJvbSBub3cgb24sIHNvIHdlIGRyb3AgbG9jay4gKi8KKwkJc3Bpbl91bmxvY2soJm50ZnNfY2JfbG9jayk7CisJCWlmIChjYl9tYXhfb2ZzKQorCQkJY2JfbWF4X3BhZ2UtLTsKKwkJZm9yICg7IGN1cl9wYWdlIDwgY2JfbWF4X3BhZ2U7IGN1cl9wYWdlKyspIHsKKwkJCXBhZ2UgPSBwYWdlc1tjdXJfcGFnZV07CisJCQlpZiAocGFnZSkgeworCQkJCS8qCisJCQkJICogRklYTUU6IFVzaW5nIGNsZWFyX3BhZ2UoKSB3aWxsIGJlY29tZSB3cm9uZworCQkJCSAqIHdoZW4gd2UgZ2V0IFBBR0VfQ0FDSEVfU0laRSAhPSBQQUdFX1NJWkUgYnV0CisJCQkJICogZm9yIG5vdyB0aGVyZSBpcyBubyBwcm9ibGVtLgorCQkJCSAqLworCQkJCWlmIChsaWtlbHkoIWN1cl9vZnMpKQorCQkJCQljbGVhcl9wYWdlKHBhZ2VfYWRkcmVzcyhwYWdlKSk7CisJCQkJZWxzZQorCQkJCQltZW1zZXQocGFnZV9hZGRyZXNzKHBhZ2UpICsgY3VyX29mcywgMCwKKwkJCQkJCQlQQUdFX0NBQ0hFX1NJWkUgLQorCQkJCQkJCWN1cl9vZnMpOworCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJCWt1bm1hcChwYWdlKTsKKwkJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJaWYgKGN1cl9wYWdlID09IHhwYWdlKQorCQkJCQl4cGFnZV9kb25lID0gMTsKKwkJCQllbHNlCisJCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCQlwYWdlc1tjdXJfcGFnZV0gPSBOVUxMOworCQkJfQorCQkJY2JfcG9zICs9IFBBR0VfQ0FDSEVfU0laRSAtIGN1cl9vZnM7CisJCQljdXJfb2ZzID0gMDsKKwkJCWlmIChjYl9wb3MgPj0gY2JfZW5kKQorCQkJCWJyZWFrOworCQl9CisJCS8qIElmIHdlIGhhdmUgYSBwYXJ0aWFsIGZpbmFsIHBhZ2UsIGRlYWwgd2l0aCBpdCBub3cuICovCisJCWlmIChjYl9tYXhfb2ZzICYmIGNiX3BvcyA8IGNiX2VuZCkgeworCQkJcGFnZSA9IHBhZ2VzW2N1cl9wYWdlXTsKKwkJCWlmIChwYWdlKQorCQkJCW1lbXNldChwYWdlX2FkZHJlc3MocGFnZSkgKyBjdXJfb2ZzLCAwLAorCQkJCQkJY2JfbWF4X29mcyAtIGN1cl9vZnMpOworCQkJLyoKKwkJCSAqIE5vIG5lZWQgdG8gdXBkYXRlIGNiX3BvcyBhdCB0aGlzIHN0YWdlOgorCQkJICoJY2JfcG9zICs9IGNiX21heF9vZnMgLSBjdXJfb2ZzOworCQkJICovCisJCQljdXJfb2ZzID0gY2JfbWF4X29mczsKKwkJfQorCX0gZWxzZSBpZiAodmNuID09IHN0YXJ0X3ZjbikgeworCQkvKiBXZSBjYW4ndCBzbGVlcCBzbyB3ZSBuZWVkIHR3byBzdGFnZXMuICovCisJCXVuc2lnbmVkIGludCBjdXIyX3BhZ2UgPSBjdXJfcGFnZTsKKwkJdW5zaWduZWQgaW50IGN1cl9vZnMyID0gY3VyX29mczsKKwkJdTggKmNiX3BvczIgPSBjYl9wb3M7CisKKwkJbnRmc19kZWJ1ZygiRm91bmQgdW5jb21wcmVzc2VkIGNvbXByZXNzaW9uIGJsb2NrLiIpOworCQkvKiBVbmNvbXByZXNzZWQgY2IsIGNvcHkgaXQgdG8gdGhlIGRlc3RpbmF0aW9uIHBhZ2VzLiAqLworCQkvKgorCQkgKiBUT0RPOiBBcyBhIGJpZyBvcHRpbWl6YXRpb24sIHdlIGNvdWxkIGRldGVjdCB0aGlzIGNhc2UKKwkJICogYmVmb3JlIHdlIHJlYWQgYWxsIHRoZSBwYWdlcyBhbmQgdXNlIGJsb2NrX3JlYWRfZnVsbF9wYWdlKCkKKwkJICogb24gYWxsIGZ1bGwgcGFnZXMgaW5zdGVhZCAod2Ugc3RpbGwgaGF2ZSB0byB0cmVhdCBwYXJ0aWFsCisJCSAqIHBhZ2VzIGVzcGVjaWFsbHkgYnV0IGF0IGxlYXN0IHdlIGFyZSBnZXR0aW5nIHJpZCBvZiB0aGUKKwkJICogc3luY2hyb25vdXMgaW8gZm9yIHRoZSBtYWpvcml0eSBvZiBwYWdlcy4KKwkJICogT3IgaWYgd2UgY2hvb3NlIG5vdCB0byBkbyB0aGUgcmVhZC1haGVhZC8tYmVoaW5kIHN0dWZmLCB3ZQorCQkgKiBjb3VsZCBqdXN0IHJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlc1t4cGFnZV0pIGFzIGxvbmcKKwkJICogYXMgUEFHRV9DQUNIRV9TSVpFIDw9IGNiX3NpemUuCisJCSAqLworCQlpZiAoY2JfbWF4X29mcykKKwkJCWNiX21heF9wYWdlLS07CisJCS8qIEZpcnN0IHN0YWdlOiBjb3B5IGRhdGEgaW50byBkZXN0aW5hdGlvbiBwYWdlcy4gKi8KKwkJZm9yICg7IGN1cl9wYWdlIDwgY2JfbWF4X3BhZ2U7IGN1cl9wYWdlKyspIHsKKwkJCXBhZ2UgPSBwYWdlc1tjdXJfcGFnZV07CisJCQlpZiAocGFnZSkKKwkJCQltZW1jcHkocGFnZV9hZGRyZXNzKHBhZ2UpICsgY3VyX29mcywgY2JfcG9zLAorCQkJCQkJUEFHRV9DQUNIRV9TSVpFIC0gY3VyX29mcyk7CisJCQljYl9wb3MgKz0gUEFHRV9DQUNIRV9TSVpFIC0gY3VyX29mczsKKwkJCWN1cl9vZnMgPSAwOworCQkJaWYgKGNiX3BvcyA+PSBjYl9lbmQpCisJCQkJYnJlYWs7CisJCX0KKwkJLyogSWYgd2UgaGF2ZSBhIHBhcnRpYWwgZmluYWwgcGFnZSwgZGVhbCB3aXRoIGl0IG5vdy4gKi8KKwkJaWYgKGNiX21heF9vZnMgJiYgY2JfcG9zIDwgY2JfZW5kKSB7CisJCQlwYWdlID0gcGFnZXNbY3VyX3BhZ2VdOworCQkJaWYgKHBhZ2UpCisJCQkJbWVtY3B5KHBhZ2VfYWRkcmVzcyhwYWdlKSArIGN1cl9vZnMsIGNiX3BvcywKKwkJCQkJCWNiX21heF9vZnMgLSBjdXJfb2ZzKTsKKwkJCWNiX3BvcyArPSBjYl9tYXhfb2ZzIC0gY3VyX29mczsKKwkJCWN1cl9vZnMgPSBjYl9tYXhfb2ZzOworCQl9CisJCS8qIFdlIGNhbiBzbGVlcCBmcm9tIG5vdyBvbiwgc28gZHJvcCBsb2NrLiAqLworCQlzcGluX3VubG9jaygmbnRmc19jYl9sb2NrKTsKKwkJLyogU2Vjb25kIHN0YWdlOiBmaW5hbGl6ZSBwYWdlcy4gKi8KKwkJZm9yICg7IGN1cjJfcGFnZSA8IGNiX21heF9wYWdlOyBjdXIyX3BhZ2UrKykgeworCQkJcGFnZSA9IHBhZ2VzW2N1cjJfcGFnZV07CisJCQlpZiAocGFnZSkgeworCQkJCS8qCisJCQkJICogSWYgd2UgYXJlIG91dHNpZGUgdGhlIGluaXRpYWxpemVkIHNpemUsIHplcm8KKwkJCQkgKiB0aGUgb3V0IG9mIGJvdW5kcyBwYWdlIHJhbmdlLgorCQkJCSAqLworCQkJCWhhbmRsZV9ib3VuZHNfY29tcHJlc3NlZF9wYWdlKG5pLCBwYWdlKTsKKwkJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCQlrdW5tYXAocGFnZSk7CisJCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJCWlmIChjdXIyX3BhZ2UgPT0geHBhZ2UpCisJCQkJCXhwYWdlX2RvbmUgPSAxOworCQkJCWVsc2UKKwkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCXBhZ2VzW2N1cjJfcGFnZV0gPSBOVUxMOworCQkJfQorCQkJY2JfcG9zMiArPSBQQUdFX0NBQ0hFX1NJWkUgLSBjdXJfb2ZzMjsKKwkJCWN1cl9vZnMyID0gMDsKKwkJCWlmIChjYl9wb3MyID49IGNiX2VuZCkKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCS8qIENvbXByZXNzZWQgY2IsIGRlY29tcHJlc3MgaXQgaW50byB0aGUgZGVzdGluYXRpb24gcGFnZShzKS4gKi8KKwkJdW5zaWduZWQgaW50IHByZXZfY3VyX3BhZ2UgPSBjdXJfcGFnZTsKKworCQludGZzX2RlYnVnKCJGb3VuZCBjb21wcmVzc2VkIGNvbXByZXNzaW9uIGJsb2NrLiIpOworCQllcnIgPSBudGZzX2RlY29tcHJlc3MocGFnZXMsICZjdXJfcGFnZSwgJmN1cl9vZnMsCisJCQkJY2JfbWF4X3BhZ2UsIGNiX21heF9vZnMsIHhwYWdlLCAmeHBhZ2VfZG9uZSwKKwkJCQljYl9wb3MsCWNiX3NpemUgLSAoY2JfcG9zIC0gY2IpKTsKKwkJLyoKKwkJICogV2UgY2FuIHNsZWVwIGZyb20gbm93IG9uLCBsb2NrIGFscmVhZHkgZHJvcHBlZCBieQorCQkgKiBudGZzX2RlY29tcHJlc3MoKS4KKwkJICovCisJCWlmIChlcnIpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIm50ZnNfZGVjb21wcmVzcygpIGZhaWxlZCBpbiBpbm9kZSAiCisJCQkJCSIweCVseCB3aXRoIGVycm9yIGNvZGUgJWkuIFNraXBwaW5nICIKKwkJCQkJInRoaXMgY29tcHJlc3Npb24gYmxvY2suIiwKKwkJCQkJbmktPm1mdF9ubywgLWVycik7CisJCQkvKiBSZWxlYXNlIHRoZSB1bmZpbmlzaGVkIHBhZ2VzLiAqLworCQkJZm9yICg7IHByZXZfY3VyX3BhZ2UgPCBjdXJfcGFnZTsgcHJldl9jdXJfcGFnZSsrKSB7CisJCQkJcGFnZSA9IHBhZ2VzW3ByZXZfY3VyX3BhZ2VdOworCQkJCWlmIChwYWdlKSB7CisJCQkJCWlmIChwcmV2X2N1cl9wYWdlID09IHhwYWdlICYmCisJCQkJCQkJIXhwYWdlX2RvbmUpCisJCQkJCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJCQlrdW5tYXAocGFnZSk7CisJCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJCQlpZiAocHJldl9jdXJfcGFnZSAhPSB4cGFnZSkKKwkJCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCQkJcGFnZXNbcHJldl9jdXJfcGFnZV0gPSBOVUxMOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qIFJlbGVhc2UgdGhlIGJ1ZmZlciBoZWFkcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfYmhzOyBpKyspCisJCWJyZWxzZShiaHNbaV0pOworCisJLyogRG8gd2UgaGF2ZSBtb3JlIHdvcmsgdG8gZG8/ICovCisJaWYgKG5yX2NicykKKwkJZ290byBkb19uZXh0X2NiOworCisJLyogV2Ugbm8gbG9uZ2VyIG5lZWQgdGhlIGxpc3Qgb2YgYnVmZmVyIGhlYWRzLiAqLworCWtmcmVlKGJocyk7CisKKwkvKiBDbGVhbiB1cCBpZiB3ZSBoYXZlIGFueSBwYWdlcyBsZWZ0LiBTaG91bGQgbmV2ZXIgaGFwcGVuLiAqLworCWZvciAoY3VyX3BhZ2UgPSAwOyBjdXJfcGFnZSA8IG1heF9wYWdlOyBjdXJfcGFnZSsrKSB7CisJCXBhZ2UgPSBwYWdlc1tjdXJfcGFnZV07CisJCWlmIChwYWdlKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJTdGlsbCBoYXZlIHBhZ2VzIGxlZnQhICIKKwkJCQkJIlRlcm1pbmF0aW5nIHRoZW0gd2l0aCBleHRyZW1lICIKKwkJCQkJInByZWp1ZGljZS4gIElub2RlIDB4JWx4LCBwYWdlIGluZGV4ICIKKwkJCQkJIjB4JWx4LiIsIG5pLT5tZnRfbm8sIHBhZ2UtPmluZGV4KTsKKwkJCWlmIChjdXJfcGFnZSA9PSB4cGFnZSAmJiAheHBhZ2VfZG9uZSkKKwkJCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCWt1bm1hcChwYWdlKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJaWYgKGN1cl9wYWdlICE9IHhwYWdlKQorCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCXBhZ2VzW2N1cl9wYWdlXSA9IE5VTEw7CisJCX0KKwl9CisKKwkvKiBXZSBubyBsb25nZXIgbmVlZCB0aGUgbGlzdCBvZiBwYWdlcy4gKi8KKwlrZnJlZShwYWdlcyk7CisKKwkvKiBJZiB3ZSBoYXZlIGNvbXBsZXRlZCB0aGUgcmVxdWVzdGVkIHBhZ2UsIHdlIHJldHVybiBzdWNjZXNzLiAqLworCWlmIChsaWtlbHkoeHBhZ2VfZG9uZSkpCisJCXJldHVybiAwOworCisJbnRmc19kZWJ1ZygiRmFpbGVkLiBSZXR1cm5pbmcgZXJyb3IgY29kZSAlcy4iLCBlcnIgPT0gLUVPVkVSRkxPVyA/CisJCQkiRU9WRVJGTE9XIiA6ICghZXJyID8gIkVJTyIgOiAidW5rb3duIGVycm9yIikpOworCXJldHVybiBlcnIgPCAwID8gZXJyIDogLUVJTzsKKworcmVhZF9lcnI6CisJbnRmc19lcnJvcih2b2wtPnNiLCAiSU8gZXJyb3Igd2hpbGUgcmVhZGluZyBjb21wcmVzc2VkIGRhdGEuIik7CisJLyogUmVsZWFzZSB0aGUgYnVmZmVyIGhlYWRzLiAqLworCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykKKwkJYnJlbHNlKGJoc1tpXSk7CisJZ290byBlcnJfb3V0OworCittYXBfcmxfZXJyOgorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIm50ZnNfbWFwX3J1bmxpc3QoKSBmYWlsZWQuIENhbm5vdCByZWFkICIKKwkJCSJjb21wcmVzc2lvbiBibG9jay4iKTsKKwlnb3RvIGVycl9vdXQ7CisKK3JsX2VycjoKKwl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwludGZzX2Vycm9yKHZvbC0+c2IsICJudGZzX3JsX3Zjbl90b19sY24oKSBmYWlsZWQuIENhbm5vdCByZWFkICIKKwkJCSJjb21wcmVzc2lvbiBibG9jay4iKTsKKwlnb3RvIGVycl9vdXQ7CisKK2dldGJsa19lcnI6CisJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CisJbnRmc19lcnJvcih2b2wtPnNiLCAiZ2V0YmxrKCkgZmFpbGVkLiBDYW5ub3QgcmVhZCBjb21wcmVzc2lvbiBibG9jay4iKTsKKworZXJyX291dDoKKwlrZnJlZShiaHMpOworCWZvciAoaSA9IGN1cl9wYWdlOyBpIDwgbWF4X3BhZ2U7IGkrKykgeworCQlwYWdlID0gcGFnZXNbaV07CisJCWlmIChwYWdlKSB7CisJCQlpZiAoaSA9PSB4cGFnZSAmJiAheHBhZ2VfZG9uZSkKKwkJCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCWt1bm1hcChwYWdlKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJaWYgKGkgIT0geHBhZ2UpCisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQl9CisJfQorCWtmcmVlKHBhZ2VzKTsKKwlyZXR1cm4gLUVJTzsKK30KZGlmZiAtLWdpdCBhL2ZzL250ZnMvZGVidWcuYyBiL2ZzL250ZnMvZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmI2YmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9kZWJ1Zy5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogZGVidWcuYyAtIE5URlMga2VybmVsIGRlYnVnIHN1cHBvcnQuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAiZGVidWcuaCIKKworLyoKKyAqIEEgc3RhdGljIGJ1ZmZlciB0byBob2xkIHRoZSBlcnJvciBzdHJpbmcgYmVpbmcgZGlzcGxheWVkIGFuZCBhIHNwaW5sb2NrCisgKiB0byBwcm90ZWN0IGNvbmN1cnJlbnQgYWNjZXNzZXMgdG8gaXQuCisgKi8KK3N0YXRpYyBjaGFyIGVycl9idWZbMTAyNF07CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGVycl9idWZfbG9jayk7CisKKy8qKgorICogX19udGZzX3dhcm5pbmcgLSBvdXRwdXQgYSB3YXJuaW5nIHRvIHRoZSBzeXNsb2cKKyAqIEBmdW5jdGlvbjoJbmFtZSBvZiBmdW5jdGlvbiBvdXRwdXR0aW5nIHRoZSB3YXJuaW5nCisgKiBAc2I6CQlzdXBlciBibG9jayBvZiBtb3VudGVkIG50ZnMgZmlsZXN5c3RlbQorICogQGZtdDoJd2FybmluZyBzdHJpbmcgY29udGFpbmluZyBmb3JtYXQgc3BlY2lmaWNhdGlvbnMKKyAqIEAuLi46CWEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBzcGVjaWZpZWQgaW4gQGZtdAorICoKKyAqIE91dHB1dHMgYSB3YXJuaW5nIHRvIHRoZSBzeXNsb2cgZm9yIHRoZSBtb3VudGVkIG50ZnMgZmlsZXN5c3RlbSBkZXNjcmliZWQKKyAqIGJ5IEBzYi4KKyAqCisgKiBAZm10IGFuZCB0aGUgY29ycmVzcG9uZGluZyBALi4uIGlzIHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5pbmcKKyAqIHRoZSB3YXJuaW5nIHN0cmluZyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybWF0IGFyZ3VtZW50cywgcmVzcGVjdGl2ZWx5LgorICoKKyAqIEBmdW5jdGlvbiBpcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gZnJvbSB3aGljaCBfX250ZnNfd2FybmluZyBpcyBiZWluZworICogY2FsbGVkLgorICoKKyAqIE5vdGUsIHlvdSBzaG91bGQgYmUgdXNpbmcgZGVidWcuaDo6bnRmc193YXJuaW5nKEBzYiwgQGZtdCwgQC4uLikgaW5zdGVhZAorICogYXMgdGhpcyBwcm92aWRlcyB0aGUgQGZ1bmN0aW9uIHBhcmFtZXRlciBhdXRvbWF0aWNhbGx5LgorICovCit2b2lkIF9fbnRmc193YXJuaW5nKGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQljb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IGZsZW4gPSAwOworCisjaWZuZGVmIERFQlVHCisJaWYgKCFwcmludGtfcmF0ZWxpbWl0KCkpCisJCXJldHVybjsKKyNlbmRpZgorCWlmIChmdW5jdGlvbikKKwkJZmxlbiA9IHN0cmxlbihmdW5jdGlvbik7CisJc3Bpbl9sb2NrKCZlcnJfYnVmX2xvY2spOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnNucHJpbnRmKGVycl9idWYsIHNpemVvZihlcnJfYnVmKSwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJaWYgKHNiKQorCQlwcmludGsoS0VSTl9FUlIgIk5URlMtZnMgd2FybmluZyAoZGV2aWNlICVzKTogJXMoKTogJXNcbiIsCisJCQkJc2ItPnNfaWQsIGZsZW4gPyBmdW5jdGlvbiA6ICIiLCBlcnJfYnVmKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0VSUiAiTlRGUy1mcyB3YXJuaW5nOiAlcygpOiAlc1xuIiwKKwkJCQlmbGVuID8gZnVuY3Rpb24gOiAiIiwgZXJyX2J1Zik7CisJc3Bpbl91bmxvY2soJmVycl9idWZfbG9jayk7Cit9CisKKy8qKgorICogX19udGZzX2Vycm9yIC0gb3V0cHV0IGFuIGVycm9yIHRvIHRoZSBzeXNsb2cKKyAqIEBmdW5jdGlvbjoJbmFtZSBvZiBmdW5jdGlvbiBvdXRwdXR0aW5nIHRoZSBlcnJvcgorICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgbW91bnRlZCBudGZzIGZpbGVzeXN0ZW0KKyAqIEBmbXQ6CWVycm9yIHN0cmluZyBjb250YWluaW5nIGZvcm1hdCBzcGVjaWZpY2F0aW9ucworICogQC4uLjoJYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzIHNwZWNpZmllZCBpbiBAZm10CisgKgorICogT3V0cHV0cyBhbiBlcnJvciB0byB0aGUgc3lzbG9nIGZvciB0aGUgbW91bnRlZCBudGZzIGZpbGVzeXN0ZW0gZGVzY3JpYmVkCisgKiBieSBAc2IuCisgKgorICogQGZtdCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgQC4uLiBpcyBwcmludGYgc3R5bGUgZm9ybWF0IHN0cmluZyBjb250YWluaW5nCisgKiB0aGUgZXJyb3Igc3RyaW5nIGFuZCB0aGUgY29ycmVzcG9uZGluZyBmb3JtYXQgYXJndW1lbnRzLCByZXNwZWN0aXZlbHkuCisgKgorICogQGZ1bmN0aW9uIGlzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBmcm9tIHdoaWNoIF9fbnRmc19lcnJvciBpcyBiZWluZworICogY2FsbGVkLgorICoKKyAqIE5vdGUsIHlvdSBzaG91bGQgYmUgdXNpbmcgZGVidWcuaDo6bnRmc19lcnJvcihAc2IsIEBmbXQsIEAuLi4pIGluc3RlYWQKKyAqIGFzIHRoaXMgcHJvdmlkZXMgdGhlIEBmdW5jdGlvbiBwYXJhbWV0ZXIgYXV0b21hdGljYWxseS4KKyAqLwordm9pZCBfX250ZnNfZXJyb3IoY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCWNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgZmxlbiA9IDA7CisKKyNpZm5kZWYgREVCVUcKKwlpZiAoIXByaW50a19yYXRlbGltaXQoKSkKKwkJcmV0dXJuOworI2VuZGlmCisJaWYgKGZ1bmN0aW9uKQorCQlmbGVuID0gc3RybGVuKGZ1bmN0aW9uKTsKKwlzcGluX2xvY2soJmVycl9idWZfbG9jayk7CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwl2c25wcmludGYoZXJyX2J1Ziwgc2l6ZW9mKGVycl9idWYpLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlpZiAoc2IpCisJCXByaW50ayhLRVJOX0VSUiAiTlRGUy1mcyBlcnJvciAoZGV2aWNlICVzKTogJXMoKTogJXNcbiIsCisJCQkJc2ItPnNfaWQsIGZsZW4gPyBmdW5jdGlvbiA6ICIiLCBlcnJfYnVmKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0VSUiAiTlRGUy1mcyBlcnJvcjogJXMoKTogJXNcbiIsCisJCQkJZmxlbiA/IGZ1bmN0aW9uIDogIiIsIGVycl9idWYpOworCXNwaW5fdW5sb2NrKCZlcnJfYnVmX2xvY2spOworfQorCisjaWZkZWYgREVCVUcKKworLyogSWYgMSwgb3V0cHV0IGRlYnVnIG1lc3NhZ2VzLCBhbmQgaWYgMCwgZG9uJ3QuICovCitpbnQgZGVidWdfbXNncyA9IDA7CisKK3ZvaWQgX19udGZzX2RlYnVnIChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqZnVuY3Rpb24sCisJCWNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgZmxlbiA9IDA7CisKKwlpZiAoIWRlYnVnX21zZ3MpCisJCXJldHVybjsKKwlpZiAoZnVuY3Rpb24pCisJCWZsZW4gPSBzdHJsZW4oZnVuY3Rpb24pOworCXNwaW5fbG9jaygmZXJyX2J1Zl9sb2NrKTsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzbnByaW50ZihlcnJfYnVmLCBzaXplb2YoZXJyX2J1ZiksIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXByaW50ayhLRVJOX0RFQlVHICJOVEZTLWZzIERFQlVHICglcywgJWQpOiAlcygpOiAlc1xuIiwgZmlsZSwgbGluZSwKKwkJCWZsZW4gPyBmdW5jdGlvbiA6ICIiLCBlcnJfYnVmKTsKKwlzcGluX3VubG9jaygmZXJyX2J1Zl9sb2NrKTsKK30KKworLyogRHVtcCBhIHJ1bmxpc3QuIENhbGxlciBoYXMgdG8gcHJvdmlkZSBzeW5jaHJvbmlzYXRpb24gZm9yIEBybC4gKi8KK3ZvaWQgbnRmc19kZWJ1Z19kdW1wX3J1bmxpc3QoY29uc3QgcnVubGlzdF9lbGVtZW50ICpybCkKK3sKKwlpbnQgaTsKKwljb25zdCBjaGFyICpsY25fc3RyWzVdID0geyAiTENOX0hPTEUgICAgICAgICAiLCAiTENOX1JMX05PVF9NQVBQRUQiLAorCQkJCSAgICJMQ05fRU5PRU5UICAgICAgICIsICJMQ05fdW5rbm93biAgICAgICIgfTsKKworCWlmICghZGVidWdfbXNncykKKwkJcmV0dXJuOworCXByaW50ayhLRVJOX0RFQlVHICJOVEZTLWZzIERFQlVHOiBEdW1waW5nIHJ1bmxpc3QgKHZhbHVlcyBpbiBoZXgpOlxuIik7CisJaWYgKCFybCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiUnVuIGxpc3Qgbm90IHByZXNlbnQuXG4iKTsKKwkJcmV0dXJuOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiVkNOICAgICAgICAgICAgICBMQ04gICAgICAgICAgICAgICBSdW4gbGVuZ3RoXG4iKTsKKwlmb3IgKGkgPSAwOyA7IGkrKykgeworCQlMQ04gbGNuID0gKHJsICsgaSktPmxjbjsKKworCQlpZiAobGNuIDwgKExDTikwKSB7CisJCQlpbnQgaW5kZXggPSAtbGNuIC0gMTsKKworCQkJaWYgKGluZGV4ID4gLUxDTl9FTk9FTlQgLSAxKQorCQkJCWluZGV4ID0gMzsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlLTE2THggJXMgJS0xNkx4JXNcbiIsCisJCQkJCShybCArIGkpLT52Y24sIGxjbl9zdHJbaW5kZXhdLAorCQkJCQkocmwgKyBpKS0+bGVuZ3RoLCAocmwgKyBpKS0+bGVuZ3RoID8KKwkJCQkJIiIgOiAiIChydW5saXN0IGVuZCkiKTsKKwkJfSBlbHNlCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJS0xNkx4ICUtMTZMeCAgJS0xNkx4JXNcbiIsCisJCQkJCShybCArIGkpLT52Y24sIChybCArIGkpLT5sY24sCisJCQkJCShybCArIGkpLT5sZW5ndGgsIChybCArIGkpLT5sZW5ndGggPworCQkJCQkiIiA6ICIgKHJ1bmxpc3QgZW5kKSIpOworCQlpZiAoIShybCArIGkpLT5sZW5ndGgpCisJCQlicmVhazsKKwl9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9kZWJ1Zy5oIGIvZnMvbnRmcy9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYzM3YzMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2RlYnVnLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIGRlYnVnLmggLSBOVEZTIGtlcm5lbCBkZWJ1ZyBzdXBwb3J0LiBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19ERUJVR19ICisjZGVmaW5lIF9MSU5VWF9OVEZTX0RFQlVHX0gKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNpbmNsdWRlICJydW5saXN0LmgiCisKKyNpZmRlZiBERUJVRworCitleHRlcm4gaW50IGRlYnVnX21zZ3M7CisKKyNpZiAwIC8qIEZvb2wga2VybmVsLWRvYyBzaW5jZSBpdCBkb2Vzbid0IGRvIG1hY3JvcyB5ZXQgKi8KKy8qKgorICogbnRmc19kZWJ1ZyAtIHdyaXRlIGEgZGVidWcgbGV2ZWwgbWVzc2FnZSB0byBzeXNsb2cKKyAqIEBmOgkJYSBwcmludGYgZm9ybWF0IHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlCisgKiBALi4uOgl0aGUgdmFyaWFibGVzIHRvIHN1YnN0aXR1dGUgaW50byBAZgorICoKKyAqIG50ZnNfZGVidWcoKSB3cml0ZXMgYSBERUJVRyBsZXZlbCBtZXNzYWdlIHRvIHRoZSBzeXNsb2cgYnV0IG9ubHkgaWYgdGhlCisgKiBkcml2ZXIgd2FzIGNvbXBpbGVkIHdpdGggLURERUJVRy4gT3RoZXJ3aXNlLCB0aGUgY2FsbCB0dXJucyBpbnRvIGEgTk9QLgorICovCitzdGF0aWMgdm9pZCBudGZzX2RlYnVnKGNvbnN0IGNoYXIgKmYsIC4uLik7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgX19udGZzX2RlYnVnIChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqZnVuY3Rpb24sCisJY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgNCwgNSkpKTsKKyNkZWZpbmUgbnRmc19kZWJ1ZyhmLCBhLi4uKQkJCQkJCVwKKwlfX250ZnNfZGVidWcoX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18sIGYsICMjYSkKKworZXh0ZXJuIHZvaWQgbnRmc19kZWJ1Z19kdW1wX3J1bmxpc3QoY29uc3QgcnVubGlzdF9lbGVtZW50ICpybCk7CisKKyNlbHNlCS8qICFERUJVRyAqLworCisjZGVmaW5lIG50ZnNfZGVidWcoZiwgYS4uLikJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBudGZzX2RlYnVnX2R1bXBfcnVubGlzdChybCkJZG8ge30gd2hpbGUgKDApCisKKyNlbmRpZgkvKiAhREVCVUcgKi8KKworZXh0ZXJuIHZvaWQgX19udGZzX3dhcm5pbmcoY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCWNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CisjZGVmaW5lIG50ZnNfd2FybmluZyhzYiwgZiwgYS4uLikJX19udGZzX3dhcm5pbmcoX19GVU5DVElPTl9fLCBzYiwgZiwgIyNhKQorCitleHRlcm4gdm9pZCBfX250ZnNfZXJyb3IoY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCWNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CisjZGVmaW5lIG50ZnNfZXJyb3Ioc2IsIGYsIGEuLi4pCQlfX250ZnNfZXJyb3IoX19GVU5DVElPTl9fLCBzYiwgZiwgIyNhKQorCisjZW5kaWYgLyogX0xJTlVYX05URlNfREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9kaXIuYyBiL2ZzL250ZnMvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1Nzc1NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvZGlyLmMKQEAgLTAsMCArMSwxNTY5IEBACisvKioKKyAqIGRpci5jIC0gTlRGUyBrZXJuZWwgZGlyZWN0b3J5IG9wZXJhdGlvbnMuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMiBSaWNoYXJkIFJ1c3NvbgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKyNpbmNsdWRlICJkaXIuaCIKKyNpbmNsdWRlICJhb3BzLmgiCisjaW5jbHVkZSAiYXR0cmliLmgiCisjaW5jbHVkZSAibWZ0LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJudGZzLmgiCisKKy8qKgorICogVGhlIGxpdHRsZSBlbmRpYW4gVW5pY29kZSBzdHJpbmcgJEkzMCBhcyBhIGdsb2JhbCBjb25zdGFudC4KKyAqLworbnRmc2NoYXIgSTMwWzVdID0geyBjb25zdF9jcHVfdG9fbGUxNignJCcpLCBjb25zdF9jcHVfdG9fbGUxNignSScpLAorCQljb25zdF9jcHVfdG9fbGUxNignMycpLAljb25zdF9jcHVfdG9fbGUxNignMCcpLCAwIH07CisKKy8qKgorICogbnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZSAtIGZpbmQgYW4gaW5vZGUgaW4gYSBkaXJlY3RvcnkgZ2l2ZW4gaXRzIG5hbWUKKyAqIEBkaXJfbmk6CW50ZnMgaW5vZGUgb2YgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBzZWFyY2ggZm9yIHRoZSBuYW1lCisgKiBAdW5hbWU6CVVuaWNvZGUgbmFtZSBmb3Igd2hpY2ggdG8gc2VhcmNoIGluIHRoZSBkaXJlY3RvcnkKKyAqIEB1bmFtZV9sZW46CWxlbmd0aCBvZiB0aGUgbmFtZSBAdW5hbWUgaW4gVW5pY29kZSBjaGFyYWN0ZXJzCisgKiBAcmVzOglyZXR1cm4gdGhlIGZvdW5kIGZpbGUgbmFtZSBpZiBuZWNlc3NhcnkgKHNlZSBiZWxvdykKKyAqCisgKiBMb29rIGZvciBhbiBpbm9kZSB3aXRoIG5hbWUgQHVuYW1lIGluIHRoZSBkaXJlY3Rvcnkgd2l0aCBpbm9kZSBAZGlyX25pLgorICogbnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZSgpIHdhbGtzIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IGxvb2tpbmcgZm9yCisgKiB0aGUgVW5pY29kZSBuYW1lLiBJZiB0aGUgbmFtZSBpcyBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5LCB0aGUgY29ycmVzcG9uZGluZworICogaW5vZGUgbnVtYmVyICg+PSAwKSBpcyByZXR1cm5lZCBhcyBhIG1mdCByZWZlcmVuY2UgaW4gY3B1IGZvcm1hdCwgaS5lLiBpdAorICogaXMgYSA2NC1iaXQgbnVtYmVyIGNvbnRhaW5pbmcgdGhlIHNlcXVlbmNlIG51bWJlci4KKyAqCisgKiBPbiBlcnJvciwgYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlcnJvciBjb2RlLiBJbgorICogcGFydGljdWxhciBpZiB0aGUgaW5vZGUgaXMgbm90IGZvdW5kIC1FTk9FTlQgaXMgcmV0dXJuZWQuIE5vdGUgdGhhdCB5b3UKKyAqIGNhbid0IGp1c3QgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBmb3IgYmVpbmcgbmVnYXRpdmUsIHlvdSBoYXZlIHRvIGNoZWNrIHRoZQorICogaW5vZGUgbnVtYmVyIGZvciBiZWluZyBuZWdhdGl2ZSB3aGljaCB5b3UgY2FuIGV4dHJhY3QgdXNpbmcgTVJFQyhyZXR1cm4KKyAqIHZhbHVlKS4KKyAqCisgKiBOb3RlLCBAdW5hbWVfbGVuIGRvZXMgbm90IGluY2x1ZGUgdGhlIChvcHRpb25hbCkgdGVybWluYXRpbmcgTlVMTCBjaGFyYWN0ZXIuCisgKgorICogTm90ZSwgd2UgbG9vayBmb3IgYSBjYXNlIHNlbnNpdGl2ZSBtYXRjaCBmaXJzdCBidXQgd2UgYWxzbyBsb29rIGZvciBhIGNhc2UKKyAqIGluc2Vuc2l0aXZlIG1hdGNoIGF0IHRoZSBzYW1lIHRpbWUuIElmIHdlIGZpbmQgYSBjYXNlIGluc2Vuc2l0aXZlIG1hdGNoLCB3ZQorICogc2F2ZSB0aGF0IGZvciB0aGUgY2FzZSB0aGF0IHdlIGRvbid0IGZpbmQgYW4gZXhhY3QgbWF0Y2gsIHdoZXJlIHdlIHJldHVybgorICogdGhlIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2ggYW5kIHNldHVwIEByZXMgKHdoaWNoIHdlIGFsbG9jYXRlISkgd2l0aCB0aGUgbWZ0CisgKiByZWZlcmVuY2UsIHRoZSBmaWxlIG5hbWUgdHlwZSwgbGVuZ3RoIGFuZCB3aXRoIGEgY29weSBvZiB0aGUgbGl0dGxlIGVuZGlhbgorICogVW5pY29kZSBmaWxlIG5hbWUgaXRzZWxmLiBJZiB3ZSBtYXRjaCBhIGZpbGUgbmFtZSB3aGljaCBpcyBpbiB0aGUgRE9TIG5hbWUKKyAqIHNwYWNlLCB3ZSBvbmx5IHJldHVybiB0aGUgbWZ0IHJlZmVyZW5jZSBhbmQgZmlsZSBuYW1lIHR5cGUgaW4gQHJlcy4KKyAqIG50ZnNfbG9va3VwKCkgdGhlbiB1c2VzIHRoaXMgdG8gZmluZCB0aGUgbG9uZyBmaWxlIG5hbWUgaW4gdGhlIGlub2RlIGl0c2VsZi4KKyAqIFRoaXMgaXMgdG8gYXZvaWQgcG9sbHV0aW5nIHRoZSBkY2FjaGUgd2l0aCBzaG9ydCBmaWxlIG5hbWVzLiBXZSB3YW50IHRoZW0gdG8KKyAqIHdvcmsgYnV0IHdlIGRvbid0IGNhcmUgZm9yIGhvdyBxdWlja2x5IG9uZSBjYW4gYWNjZXNzIHRoZW0uIFRoaXMgYWxzbyBmaXhlcworICogdGhlIGRjYWNoZSBhbGlhc2luZyBpc3N1ZXMuCisgKgorICogTG9ja2luZzogIC0gQ2FsbGVyIG11c3QgaG9sZCBpX3NlbSBvbiB0aGUgZGlyZWN0b3J5LgorICoJICAgICAtIEVhY2ggcGFnZSBjYWNoZSBwYWdlIGluIHRoZSBpbmRleCBhbGxvY2F0aW9uIG1hcHBpbmcgbXVzdCBiZQorICoJICAgICAgIGxvY2tlZCB3aGlsc3QgYmVpbmcgYWNjZXNzZWQgb3RoZXJ3aXNlIHdlIG1heSBmaW5kIGEgY29ycnVwdAorICoJICAgICAgIHBhZ2UgZHVlIHRvIGl0IGJlaW5nIHVuZGVyIC0+d3JpdGVwYWdlIGF0IHRoZSBtb21lbnQgd2hpY2gKKyAqCSAgICAgICBhcHBsaWVzIHRoZSBtc3QgcHJvdGVjdGlvbiBmaXh1cHMgYmVmb3JlIHdyaXRpbmcgb3V0IGFuZCB0aGVuCisgKgkgICAgICAgcmVtb3ZlcyB0aGVtIGFnYWluIGFmdGVyIHRoZSB3cml0ZSBpcyBjb21wbGV0ZSBhZnRlciB3aGljaCBpdCAKKyAqCSAgICAgICB1bmxvY2tzIHRoZSBwYWdlLgorICovCitNRlRfUkVGIG50ZnNfbG9va3VwX2lub2RlX2J5X25hbWUobnRmc19pbm9kZSAqZGlyX25pLCBjb25zdCBudGZzY2hhciAqdW5hbWUsCisJCWNvbnN0IGludCB1bmFtZV9sZW4sIG50ZnNfbmFtZSAqKnJlcykKK3sKKwludGZzX3ZvbHVtZSAqdm9sID0gZGlyX25pLT52b2w7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHZvbC0+c2I7CisJTUZUX1JFQ09SRCAqbTsKKwlJTkRFWF9ST09UICppcjsKKwlJTkRFWF9FTlRSWSAqaWU7CisJSU5ERVhfQUxMT0NBVElPTiAqaWE7CisJdTggKmluZGV4X2VuZDsKKwl1NjQgbXJlZjsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OworCWludCBlcnIsIHJjOworCVZDTiB2Y24sIG9sZF92Y247CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmlhX21hcHBpbmc7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdTggKmthZGRyOworCW50ZnNfbmFtZSAqbmFtZSA9IE5VTEw7CisKKwlCVUdfT04oIVNfSVNESVIoVkZTX0koZGlyX25pKS0+aV9tb2RlKSk7CisJQlVHX09OKE5Jbm9BdHRyKGRpcl9uaSkpOworCS8qIEdldCBob2xkIG9mIHRoZSBtZnQgcmVjb3JkIGZvciB0aGUgZGlyZWN0b3J5LiAqLworCW0gPSBtYXBfbWZ0X3JlY29yZChkaXJfbmkpOworCWlmIChJU19FUlIobSkpIHsKKwkJbnRmc19lcnJvcihzYiwgIm1hcF9tZnRfcmVjb3JkKCkgZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlbGQuIiwKKwkJCQktUFRSX0VSUihtKSk7CisJCXJldHVybiBFUlJfTVJFRihQVFJfRVJSKG0pKTsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KGRpcl9uaSwgbSk7CisJaWYgKHVubGlrZWx5KCFjdHgpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogRmluZCB0aGUgaW5kZXggcm9vdCBhdHRyaWJ1dGUgaW4gdGhlIG1mdCByZWNvcmQuICovCisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9JTkRFWF9ST09ULCBJMzAsIDQsIENBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLAorCQkJMCwgY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlpZiAoZXJyID09IC1FTk9FTlQpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCByb290IGF0dHJpYnV0ZSBtaXNzaW5nIGluICIKKwkJCQkJImRpcmVjdG9yeSBpbm9kZSAweCVseC4iLAorCQkJCQlkaXJfbmktPm1mdF9ubyk7CisJCQllcnIgPSAtRUlPOworCQl9CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogR2V0IHRvIHRoZSBpbmRleCByb290IHZhbHVlIChpdCdzIGJlZW4gdmVyaWZpZWQgaW4gcmVhZF9pbm9kZSkuICovCisJaXIgPSAoSU5ERVhfUk9PVCopKCh1OCopY3R4LT5hdHRyICsKKwkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpKTsKKwlpbmRleF9lbmQgPSAodTgqKSZpci0+aW5kZXggKyBsZTMyX3RvX2NwdShpci0+aW5kZXguaW5kZXhfbGVuZ3RoKTsKKwkvKiBUaGUgZmlyc3QgaW5kZXggZW50cnkuICovCisJaWUgPSAoSU5ERVhfRU5UUlkqKSgodTgqKSZpci0+aW5kZXggKworCQkJbGUzMl90b19jcHUoaXItPmluZGV4LmVudHJpZXNfb2Zmc2V0KSk7CisJLyoKKwkgKiBMb29wIHVudGlsIHdlIGV4Y2VlZCB2YWxpZCBtZW1vcnkgKGNvcnJ1cHRpb24gY2FzZSkgb3IgdW50aWwgd2UKKwkgKiByZWFjaCB0aGUgbGFzdCBlbnRyeS4KKwkgKi8KKwlmb3IgKDs7IGllID0gKElOREVYX0VOVFJZKikoKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5sZW5ndGgpKSkgeworCQkvKiBCb3VuZHMgY2hlY2tzLiAqLworCQlpZiAoKHU4KilpZSA8ICh1OCopY3R4LT5tcmVjIHx8ICh1OCopaWUgKworCQkJCXNpemVvZihJTkRFWF9FTlRSWV9IRUFERVIpID4gaW5kZXhfZW5kIHx8CisJCQkJKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5rZXlfbGVuZ3RoKSA+CisJCQkJaW5kZXhfZW5kKQorCQkJZ290byBkaXJfZXJyX291dDsKKwkJLyoKKwkJICogVGhlIGxhc3QgZW50cnkgY2Fubm90IGNvbnRhaW4gYSBuYW1lLiBJdCBjYW4gaG93ZXZlciBjb250YWluCisJCSAqIGEgcG9pbnRlciB0byBhIGNoaWxkIG5vZGUgaW4gdGhlIEIrdHJlZSBzbyB3ZSBqdXN0IGJyZWFrIG91dC4KKwkJICovCisJCWlmIChpZS0+ZmxhZ3MgJiBJTkRFWF9FTlRSWV9FTkQpCisJCQlicmVhazsKKwkJLyoKKwkJICogV2UgcGVyZm9ybSBhIGNhc2Ugc2Vuc2l0aXZlIGNvbXBhcmlzb24gYW5kIGlmIHRoYXQgbWF0Y2hlcworCQkgKiB3ZSBhcmUgZG9uZSBhbmQgcmV0dXJuIHRoZSBtZnQgcmVmZXJlbmNlIG9mIHRoZSBpbm9kZSAoaS5lLgorCQkgKiB0aGUgaW5vZGUgbnVtYmVyIHRvZ2V0aGVyIHdpdGggdGhlIHNlcXVlbmNlIG51bWJlciBmb3IKKwkJICogY29uc2lzdGVuY3kgY2hlY2tpbmcpLiBXZSBjb252ZXJ0IGl0IHRvIGNwdSBmb3JtYXQgYmVmb3JlCisJCSAqIHJldHVybmluZy4KKwkJICovCisJCWlmIChudGZzX2FyZV9uYW1lc19lcXVhbCh1bmFtZSwgdW5hbWVfbGVuLAorCQkJCShudGZzY2hhciopJmllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZSwKKwkJCQlpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfbGVuZ3RoLAorCQkJCUNBU0VfU0VOU0lUSVZFLCB2b2wtPnVwY2FzZSwgdm9sLT51cGNhc2VfbGVuKSkgeworZm91bmRfaXQ6CisJCQkvKgorCQkJICogV2UgaGF2ZSBhIHBlcmZlY3QgbWF0Y2gsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2FyZQorCQkJICogYWJvdXQgaGF2aW5nIG1hdGNoZWQgaW1wZXJmZWN0bHkgYmVmb3JlLCBzbyB3ZSBjYW4KKwkJCSAqIGZyZWUgbmFtZSBhbmQgc2V0ICpyZXMgdG8gTlVMTC4KKwkJCSAqIEhvd2V2ZXIsIGlmIHRoZSBwZXJmZWN0IG1hdGNoIGlzIGEgc2hvcnQgZmlsZSBuYW1lLAorCQkJICogd2UgbmVlZCB0byBzaWduYWwgdGhpcyB0aHJvdWdoICpyZXMsIHNvIHRoYXQKKwkJCSAqIG50ZnNfbG9va3VwKCkgY2FuIGZpeCBkY2FjaGUgYWxpYXNpbmcgaXNzdWVzLgorCQkJICogQXMgYW4gb3B0aW1pemF0aW9uIHdlIGp1c3QgcmV1c2UgYW4gZXhpc3RpbmcKKwkJCSAqIGFsbG9jYXRpb24gb2YgKnJlcy4KKwkJCSAqLworCQkJaWYgKGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV90eXBlID09IEZJTEVfTkFNRV9ET1MpIHsKKwkJCQlpZiAoIW5hbWUpIHsKKwkJCQkJbmFtZSA9IGttYWxsb2Moc2l6ZW9mKG50ZnNfbmFtZSksCisJCQkJCQkJR0ZQX05PRlMpOworCQkJCQlpZiAoIW5hbWUpIHsKKwkJCQkJCWVyciA9IC1FTk9NRU07CisJCQkJCQlnb3RvIGVycl9vdXQ7CisJCQkJCX0KKwkJCQl9CisJCQkJbmFtZS0+bXJlZiA9IGxlNjRfdG9fY3B1KAorCQkJCQkJaWUtPmRhdGEuZGlyLmluZGV4ZWRfZmlsZSk7CisJCQkJbmFtZS0+dHlwZSA9IEZJTEVfTkFNRV9ET1M7CisJCQkJbmFtZS0+bGVuID0gMDsKKwkJCQkqcmVzID0gbmFtZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG5hbWUpCisJCQkJCWtmcmVlKG5hbWUpOworCQkJCSpyZXMgPSBOVUxMOworCQkJfQorCQkJbXJlZiA9IGxlNjRfdG9fY3B1KGllLT5kYXRhLmRpci5pbmRleGVkX2ZpbGUpOworCQkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJCQl1bm1hcF9tZnRfcmVjb3JkKGRpcl9uaSk7CisJCQlyZXR1cm4gbXJlZjsKKwkJfQorCQkvKgorCQkgKiBGb3IgYSBjYXNlIGluc2Vuc2l0aXZlIG1vdW50LCB3ZSBhbHNvIHBlcmZvcm0gYSBjYXNlCisJCSAqIGluc2Vuc2l0aXZlIGNvbXBhcmlzb24gKHByb3ZpZGVkIHRoZSBmaWxlIG5hbWUgaXMgbm90IGluIHRoZQorCQkgKiBQT1NJWCBuYW1lc3BhY2UpLiBJZiB0aGUgY29tcGFyaXNvbiBtYXRjaGVzLCBhbmQgdGhlIG5hbWUgaXMKKwkJICogaW4gdGhlIFdJTjMyIG5hbWVzcGFjZSwgd2UgY2FjaGUgdGhlIGZpbGVuYW1lIGluICpyZXMgc28KKwkJICogdGhhdCB0aGUgY2FsbGVyLCBudGZzX2xvb2t1cCgpLCBjYW4gd29yayBvbiBpdC4gSWYgdGhlCisJCSAqIGNvbXBhcmlzb24gbWF0Y2hlcywgYW5kIHRoZSBuYW1lIGlzIGluIHRoZSBET1MgbmFtZXNwYWNlLCB3ZQorCQkgKiBvbmx5IGNhY2hlIHRoZSBtZnQgcmVmZXJlbmNlIGFuZCB0aGUgZmlsZSBuYW1lIHR5cGUgKHdlIHNldAorCQkgKiB0aGUgbmFtZSBsZW5ndGggdG8gemVybyBmb3Igc2ltcGxpY2l0eSkuCisJCSAqLworCQlpZiAoIU5Wb2xDYXNlU2Vuc2l0aXZlKHZvbCkgJiYKKwkJCQlpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfdHlwZSAmJgorCQkJCW50ZnNfYXJlX25hbWVzX2VxdWFsKHVuYW1lLCB1bmFtZV9sZW4sCisJCQkJKG50ZnNjaGFyKikmaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGgsCisJCQkJSUdOT1JFX0NBU0UsIHZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pKSB7CisJCQlpbnQgbmFtZV9zaXplID0gc2l6ZW9mKG50ZnNfbmFtZSk7CisJCQl1OCB0eXBlID0gaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX3R5cGU7CisJCQl1OCBsZW4gPSBpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfbGVuZ3RoOworCisJCQkvKiBPbmx5IG9uZSBjYXNlIGluc2Vuc2l0aXZlIG1hdGNoaW5nIG5hbWUgYWxsb3dlZC4gKi8KKwkJCWlmIChuYW1lKSB7CisJCQkJbnRmc19lcnJvcihzYiwgIkZvdW5kIGFscmVhZHkgYWxsb2NhdGVkIG5hbWUgIgorCQkJCQkJImluIHBoYXNlIDEuIFBsZWFzZSBydW4gY2hrZHNrICIKKwkJCQkJCSJhbmQgaWYgdGhhdCBkb2Vzbid0IGZpbmQgYW55ICIKKwkJCQkJCSJlcnJvcnMgcGxlYXNlIHJlcG9ydCB5b3Ugc2F3ICIKKwkJCQkJCSJ0aGlzIG1lc3NhZ2UgdG8gIgorCQkJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLiIKKwkJCQkJCSJzb3VyY2Vmb3JnZS5uZXQuIik7CisJCQkJZ290byBkaXJfZXJyX291dDsKKwkJCX0KKworCQkJaWYgKHR5cGUgIT0gRklMRV9OQU1FX0RPUykKKwkJCQluYW1lX3NpemUgKz0gbGVuICogc2l6ZW9mKG50ZnNjaGFyKTsKKwkJCW5hbWUgPSBrbWFsbG9jKG5hbWVfc2l6ZSwgR0ZQX05PRlMpOworCQkJaWYgKCFuYW1lKSB7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlnb3RvIGVycl9vdXQ7CisJCQl9CisJCQluYW1lLT5tcmVmID0gbGU2NF90b19jcHUoaWUtPmRhdGEuZGlyLmluZGV4ZWRfZmlsZSk7CisJCQluYW1lLT50eXBlID0gdHlwZTsKKwkJCWlmICh0eXBlICE9IEZJTEVfTkFNRV9ET1MpIHsKKwkJCQluYW1lLT5sZW4gPSBsZW47CisJCQkJbWVtY3B5KG5hbWUtPm5hbWUsIGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZSwKKwkJCQkJCWxlbiAqIHNpemVvZihudGZzY2hhcikpOworCQkJfSBlbHNlCisJCQkJbmFtZS0+bGVuID0gMDsKKwkJCSpyZXMgPSBuYW1lOworCQl9CisJCS8qCisJCSAqIE5vdCBhIHBlcmZlY3QgbWF0Y2gsIG5lZWQgdG8gZG8gZnVsbCBibG93biBjb2xsYXRpb24gc28gd2UKKwkJICoga25vdyB3aGljaCB3YXkgaW4gdGhlIEIrdHJlZSB3ZSBoYXZlIHRvIGdvLgorCQkgKi8KKwkJcmMgPSBudGZzX2NvbGxhdGVfbmFtZXModW5hbWUsIHVuYW1lX2xlbiwKKwkJCQkobnRmc2NoYXIqKSZpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWUsCisJCQkJaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX2xlbmd0aCwgMSwKKwkJCQlJR05PUkVfQ0FTRSwgdm9sLT51cGNhc2UsIHZvbC0+dXBjYXNlX2xlbik7CisJCS8qCisJCSAqIElmIHVuYW1lIGNvbGxhdGVzIGJlZm9yZSB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBlbnRyeSwgdGhlcmUKKwkJICogaXMgZGVmaW5pdGVseSBubyBzdWNoIG5hbWUgaW4gdGhpcyBpbmRleCBidXQgd2UgbWlnaHQgbmVlZCB0bworCQkgKiBkZXNjZW5kIGludG8gdGhlIEIrdHJlZSBzbyB3ZSBqdXN0IGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KKwkJICovCisJCWlmIChyYyA9PSAtMSkKKwkJCWJyZWFrOworCQkvKiBUaGUgbmFtZXMgYXJlIG5vdCBlcXVhbCwgY29udGludWUgdGhlIHNlYXJjaC4gKi8KKwkJaWYgKHJjKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIE5hbWVzIG1hdGNoIHdpdGggY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uLCBub3cgdHJ5IHRoZQorCQkgKiBjYXNlIHNlbnNpdGl2ZSBjb21wYXJpc29uLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgcHJvcGVyCisJCSAqIGNvbGxhdGlvbi4KKwkJICovCisJCXJjID0gbnRmc19jb2xsYXRlX25hbWVzKHVuYW1lLCB1bmFtZV9sZW4sCisJCQkJKG50ZnNjaGFyKikmaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGgsIDEsCisJCQkJQ0FTRV9TRU5TSVRJVkUsIHZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pOworCQlpZiAocmMgPT0gLTEpCisJCQlicmVhazsKKwkJaWYgKHJjKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIFBlcmZlY3QgbWF0Y2gsIHRoaXMgd2lsbCBuZXZlciBoYXBwZW4gYXMgdGhlCisJCSAqIG50ZnNfYXJlX25hbWVzX2VxdWFsKCkgY2FsbCB3aWxsIGhhdmUgZ290dGVuIGEgbWF0Y2ggYnV0IHdlCisJCSAqIHN0aWxsIHRyZWF0IGl0IGNvcnJlY3RseS4KKwkJICovCisJCWdvdG8gZm91bmRfaXQ7CisJfQorCS8qCisJICogV2UgaGF2ZSBmaW5pc2hlZCB3aXRoIHRoaXMgaW5kZXggd2l0aG91dCBzdWNjZXNzLiBDaGVjayBmb3IgdGhlCisJICogcHJlc2VuY2Ugb2YgYSBjaGlsZCBub2RlIGFuZCBpZiBub3QgcHJlc2VudCByZXR1cm4gLUVOT0VOVCwgdW5sZXNzCisJICogd2UgaGF2ZSBnb3QgYSBtYXRjaGluZyBuYW1lIGNhY2hlZCBpbiBuYW1lIGluIHdoaWNoIGNhc2UgcmV0dXJuIHRoZQorCSAqIG1mdCByZWZlcmVuY2UgYXNzb2NpYXRlZCB3aXRoIGl0LgorCSAqLworCWlmICghKGllLT5mbGFncyAmIElOREVYX0VOVFJZX05PREUpKSB7CisJCWlmIChuYW1lKSB7CisJCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwkJCXVubWFwX21mdF9yZWNvcmQoZGlyX25pKTsKKwkJCXJldHVybiBuYW1lLT5tcmVmOworCQl9CisJCW50ZnNfZGVidWcoIkVudHJ5IG5vdCBmb3VuZC4iKTsKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBlcnJfb3V0OworCX0gLyogQ2hpbGQgbm9kZSBwcmVzZW50LCBkZXNjZW5kIGludG8gaXQuICovCisJLyogQ29uc2lzdGVuY3kgY2hlY2s6IFZlcmlmeSB0aGF0IGFuIGluZGV4IGFsbG9jYXRpb24gZXhpc3RzLiAqLworCWlmICghTklub0luZGV4QWxsb2NQcmVzZW50KGRpcl9uaSkpIHsKKwkJbnRmc19lcnJvcihzYiwgIk5vIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlIGJ1dCBpbmRleCBlbnRyeSAiCisJCQkJInJlcXVpcmVzIG9uZS4gRGlyZWN0b3J5IGlub2RlIDB4JWx4IGlzICIKKwkJCQkiY29ycnVwdCBvciBkcml2ZXIgYnVnLiIsIGRpcl9uaS0+bWZ0X25vKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBHZXQgdGhlIHN0YXJ0aW5nIHZjbiBvZiB0aGUgaW5kZXhfYmxvY2sgaG9sZGluZyB0aGUgY2hpbGQgbm9kZS4gKi8KKwl2Y24gPSBzbGU2NF90b19jcHVwKChzbGU2NCopKCh1OCopaWUgKyBsZTE2X3RvX2NwdShpZS0+bGVuZ3RoKSAtIDgpKTsKKwlpYV9tYXBwaW5nID0gVkZTX0koZGlyX25pKS0+aV9tYXBwaW5nOworCS8qCisJICogV2UgYXJlIGRvbmUgd2l0aCB0aGUgaW5kZXggcm9vdCBhbmQgdGhlIG1mdCByZWNvcmQuIFJlbGVhc2UgdGhlbSwKKwkgKiBvdGhlcndpc2Ugd2UgZGVhZGxvY2sgd2l0aCBudGZzX21hcF9wYWdlKCkuCisJICovCisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChkaXJfbmkpOworCW0gPSBOVUxMOworCWN0eCA9IE5VTEw7CitkZXNjZW5kX2ludG9fY2hpbGRfbm9kZToKKwkvKgorCSAqIENvbnZlcnQgdmNuIHRvIGluZGV4IGludG8gdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlIGluIHVuaXRzCisJICogb2YgUEFHRV9DQUNIRV9TSVpFIGFuZCBtYXAgdGhlIHBhZ2UgY2FjaGUgcGFnZSwgcmVhZGluZyBpdCBmcm9tCisJICogZGlzayBpZiBuZWNlc3NhcnkuCisJICovCisJcGFnZSA9IG50ZnNfbWFwX3BhZ2UoaWFfbWFwcGluZywgdmNuIDw8CisJCQlkaXJfbmktPml0eXBlLmluZGV4LnZjbl9zaXplX2JpdHMgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJaWYgKElTX0VSUihwYWdlKSkgeworCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIG1hcCBkaXJlY3RvcnkgaW5kZXggcGFnZSwgZXJyb3IgJWxkLiIsCisJCQkJLVBUUl9FUlIocGFnZSkpOworCQllcnIgPSBQVFJfRVJSKHBhZ2UpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWxvY2tfcGFnZShwYWdlKTsKKwlrYWRkciA9ICh1OCopcGFnZV9hZGRyZXNzKHBhZ2UpOworZmFzdF9kZXNjZW5kX2ludG9fY2hpbGRfbm9kZToKKwkvKiBHZXQgdG8gdGhlIGluZGV4IGFsbG9jYXRpb24gYmxvY2suICovCisJaWEgPSAoSU5ERVhfQUxMT0NBVElPTiopKGthZGRyICsgKCh2Y24gPDwKKwkJCWRpcl9uaS0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cykgJiB+UEFHRV9DQUNIRV9NQVNLKSk7CisJLyogQm91bmRzIGNoZWNrcy4gKi8KKwlpZiAoKHU4KilpYSA8IGthZGRyIHx8ICh1OCopaWEgPiBrYWRkciArIFBBR0VfQ0FDSEVfU0laRSkgeworCQludGZzX2Vycm9yKHNiLCAiT3V0IG9mIGJvdW5kcyBjaGVjayBmYWlsZWQuIENvcnJ1cHQgZGlyZWN0b3J5ICIKKwkJCQkiaW5vZGUgMHglbHggb3IgZHJpdmVyIGJ1Zy4iLCBkaXJfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCS8qIENhdGNoIG11bHRpIHNlY3RvciB0cmFuc2ZlciBmaXh1cCBlcnJvcnMuICovCisJaWYgKHVubGlrZWx5KCFudGZzX2lzX2luZHhfcmVjb3JkKGlhLT5tYWdpYykpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJEaXJlY3RvcnkgaW5kZXggcmVjb3JkIHdpdGggdmNuIDB4JWxseCBpcyAiCisJCQkJImNvcnJ1cHQuICBDb3JydXB0IGlub2RlIDB4JWx4LiAgUnVuIGNoa2Rzay4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLCBkaXJfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWlmIChzbGU2NF90b19jcHUoaWEtPmluZGV4X2Jsb2NrX3ZjbikgIT0gdmNuKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJBY3R1YWwgVkNOICgweCVsbHgpIG9mIGluZGV4IGJ1ZmZlciBpcyAiCisJCQkJImRpZmZlcmVudCBmcm9tIGV4cGVjdGVkIFZDTiAoMHglbGx4KS4gIgorCQkJCSJEaXJlY3RvcnkgaW5vZGUgMHglbHggaXMgY29ycnVwdCBvciBkcml2ZXIgIgorCQkJCSJidWcuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQlzbGU2NF90b19jcHUoaWEtPmluZGV4X2Jsb2NrX3ZjbiksCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sIGRpcl9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaWYgKGxlMzJfdG9fY3B1KGlhLT5pbmRleC5hbGxvY2F0ZWRfc2l6ZSkgKyAweDE4ICE9CisJCQlkaXJfbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUpIHsKKwkJbnRmc19lcnJvcihzYiwgIkluZGV4IGJ1ZmZlciAoVkNOIDB4JWxseCkgb2YgZGlyZWN0b3J5IGlub2RlICIKKwkJCQkiMHglbHggaGFzIGEgc2l6ZSAoJXUpIGRpZmZlcmluZyBmcm9tIHRoZSAiCisJCQkJImRpcmVjdG9yeSBzcGVjaWZpZWQgc2l6ZSAoJXUpLiBEaXJlY3RvcnkgIgorCQkJCSJpbm9kZSBpcyBjb3JydXB0IG9yIGRyaXZlciBidWcuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZjbiwgZGlyX25pLT5tZnRfbm8sCisJCQkJbGUzMl90b19jcHUoaWEtPmluZGV4LmFsbG9jYXRlZF9zaXplKSArIDB4MTgsCisJCQkJZGlyX25pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaW5kZXhfZW5kID0gKHU4KilpYSArIGRpcl9uaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZTsKKwlpZiAoaW5kZXhfZW5kID4ga2FkZHIgKyBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJbnRmc19lcnJvcihzYiwgIkluZGV4IGJ1ZmZlciAoVkNOIDB4JWxseCkgb2YgZGlyZWN0b3J5IGlub2RlICIKKwkJCQkiMHglbHggY3Jvc3NlcyBwYWdlIGJvdW5kYXJ5LiBJbXBvc3NpYmxlISAiCisJCQkJIkNhbm5vdCBhY2Nlc3MhIFRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gdGhlICIKKwkJCQkiZHJpdmVyLiIsICh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLAorCQkJCWRpcl9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaW5kZXhfZW5kID0gKHU4KikmaWEtPmluZGV4ICsgbGUzMl90b19jcHUoaWEtPmluZGV4LmluZGV4X2xlbmd0aCk7CisJaWYgKGluZGV4X2VuZCA+ICh1OCopaWEgKyBkaXJfbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUpIHsKKwkJbnRmc19lcnJvcihzYiwgIlNpemUgb2YgaW5kZXggYnVmZmVyIChWQ04gMHglbGx4KSBvZiBkaXJlY3RvcnkgIgorCQkJCSJpbm9kZSAweCVseCBleGNlZWRzIG1heGltdW0gc2l6ZS4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLCBkaXJfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCS8qIFRoZSBmaXJzdCBpbmRleCBlbnRyeS4gKi8KKwlpZSA9IChJTkRFWF9FTlRSWSopKCh1OCopJmlhLT5pbmRleCArCisJCQlsZTMyX3RvX2NwdShpYS0+aW5kZXguZW50cmllc19vZmZzZXQpKTsKKwkvKgorCSAqIEl0ZXJhdGUgc2ltaWxhciB0byBhYm92ZSBiaWcgbG9vcCBidXQgYXBwbGllZCB0byBpbmRleCBidWZmZXIsIHRodXMKKwkgKiBsb29wIHVudGlsIHdlIGV4Y2VlZCB2YWxpZCBtZW1vcnkgKGNvcnJ1cHRpb24gY2FzZSkgb3IgdW50aWwgd2UKKwkgKiByZWFjaCB0aGUgbGFzdCBlbnRyeS4KKwkgKi8KKwlmb3IgKDs7IGllID0gKElOREVYX0VOVFJZKikoKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5sZW5ndGgpKSkgeworCQkvKiBCb3VuZHMgY2hlY2suICovCisJCWlmICgodTgqKWllIDwgKHU4KilpYSB8fCAodTgqKWllICsKKwkJCQlzaXplb2YoSU5ERVhfRU5UUllfSEVBREVSKSA+IGluZGV4X2VuZCB8fAorCQkJCSh1OCopaWUgKyBsZTE2X3RvX2NwdShpZS0+a2V5X2xlbmd0aCkgPgorCQkJCWluZGV4X2VuZCkgeworCQkJbnRmc19lcnJvcihzYiwgIkluZGV4IGVudHJ5IG91dCBvZiBib3VuZHMgaW4gIgorCQkJCQkiZGlyZWN0b3J5IGlub2RlIDB4JWx4LiIsCisJCQkJCWRpcl9uaS0+bWZ0X25vKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJLyoKKwkJICogVGhlIGxhc3QgZW50cnkgY2Fubm90IGNvbnRhaW4gYSBuYW1lLiBJdCBjYW4gaG93ZXZlciBjb250YWluCisJCSAqIGEgcG9pbnRlciB0byBhIGNoaWxkIG5vZGUgaW4gdGhlIEIrdHJlZSBzbyB3ZSBqdXN0IGJyZWFrIG91dC4KKwkJICovCisJCWlmIChpZS0+ZmxhZ3MgJiBJTkRFWF9FTlRSWV9FTkQpCisJCQlicmVhazsKKwkJLyoKKwkJICogV2UgcGVyZm9ybSBhIGNhc2Ugc2Vuc2l0aXZlIGNvbXBhcmlzb24gYW5kIGlmIHRoYXQgbWF0Y2hlcworCQkgKiB3ZSBhcmUgZG9uZSBhbmQgcmV0dXJuIHRoZSBtZnQgcmVmZXJlbmNlIG9mIHRoZSBpbm9kZSAoaS5lLgorCQkgKiB0aGUgaW5vZGUgbnVtYmVyIHRvZ2V0aGVyIHdpdGggdGhlIHNlcXVlbmNlIG51bWJlciBmb3IKKwkJICogY29uc2lzdGVuY3kgY2hlY2tpbmcpLiBXZSBjb252ZXJ0IGl0IHRvIGNwdSBmb3JtYXQgYmVmb3JlCisJCSAqIHJldHVybmluZy4KKwkJICovCisJCWlmIChudGZzX2FyZV9uYW1lc19lcXVhbCh1bmFtZSwgdW5hbWVfbGVuLAorCQkJCShudGZzY2hhciopJmllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZSwKKwkJCQlpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfbGVuZ3RoLAorCQkJCUNBU0VfU0VOU0lUSVZFLCB2b2wtPnVwY2FzZSwgdm9sLT51cGNhc2VfbGVuKSkgeworZm91bmRfaXQyOgorCQkJLyoKKwkJCSAqIFdlIGhhdmUgYSBwZXJmZWN0IG1hdGNoLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNhcmUKKwkJCSAqIGFib3V0IGhhdmluZyBtYXRjaGVkIGltcGVyZmVjdGx5IGJlZm9yZSwgc28gd2UgY2FuCisJCQkgKiBmcmVlIG5hbWUgYW5kIHNldCAqcmVzIHRvIE5VTEwuCisJCQkgKiBIb3dldmVyLCBpZiB0aGUgcGVyZmVjdCBtYXRjaCBpcyBhIHNob3J0IGZpbGUgbmFtZSwKKwkJCSAqIHdlIG5lZWQgdG8gc2lnbmFsIHRoaXMgdGhyb3VnaCAqcmVzLCBzbyB0aGF0CisJCQkgKiBudGZzX2xvb2t1cCgpIGNhbiBmaXggZGNhY2hlIGFsaWFzaW5nIGlzc3Vlcy4KKwkJCSAqIEFzIGFuIG9wdGltaXphdGlvbiB3ZSBqdXN0IHJldXNlIGFuIGV4aXN0aW5nCisJCQkgKiBhbGxvY2F0aW9uIG9mICpyZXMuCisJCQkgKi8KKwkJCWlmIChpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfdHlwZSA9PSBGSUxFX05BTUVfRE9TKSB7CisJCQkJaWYgKCFuYW1lKSB7CisJCQkJCW5hbWUgPSBrbWFsbG9jKHNpemVvZihudGZzX25hbWUpLAorCQkJCQkJCUdGUF9OT0ZTKTsKKwkJCQkJaWYgKCFuYW1lKSB7CisJCQkJCQllcnIgPSAtRU5PTUVNOworCQkJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCQkJfQorCQkJCX0KKwkJCQluYW1lLT5tcmVmID0gbGU2NF90b19jcHUoCisJCQkJCQlpZS0+ZGF0YS5kaXIuaW5kZXhlZF9maWxlKTsKKwkJCQluYW1lLT50eXBlID0gRklMRV9OQU1FX0RPUzsKKwkJCQluYW1lLT5sZW4gPSAwOworCQkJCSpyZXMgPSBuYW1lOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobmFtZSkKKwkJCQkJa2ZyZWUobmFtZSk7CisJCQkJKnJlcyA9IE5VTEw7CisJCQl9CisJCQltcmVmID0gbGU2NF90b19jcHUoaWUtPmRhdGEuZGlyLmluZGV4ZWRfZmlsZSk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJCXJldHVybiBtcmVmOworCQl9CisJCS8qCisJCSAqIEZvciBhIGNhc2UgaW5zZW5zaXRpdmUgbW91bnQsIHdlIGFsc28gcGVyZm9ybSBhIGNhc2UKKwkJICogaW5zZW5zaXRpdmUgY29tcGFyaXNvbiAocHJvdmlkZWQgdGhlIGZpbGUgbmFtZSBpcyBub3QgaW4gdGhlCisJCSAqIFBPU0lYIG5hbWVzcGFjZSkuIElmIHRoZSBjb21wYXJpc29uIG1hdGNoZXMsIGFuZCB0aGUgbmFtZSBpcworCQkgKiBpbiB0aGUgV0lOMzIgbmFtZXNwYWNlLCB3ZSBjYWNoZSB0aGUgZmlsZW5hbWUgaW4gKnJlcyBzbworCQkgKiB0aGF0IHRoZSBjYWxsZXIsIG50ZnNfbG9va3VwKCksIGNhbiB3b3JrIG9uIGl0LiBJZiB0aGUKKwkJICogY29tcGFyaXNvbiBtYXRjaGVzLCBhbmQgdGhlIG5hbWUgaXMgaW4gdGhlIERPUyBuYW1lc3BhY2UsIHdlCisJCSAqIG9ubHkgY2FjaGUgdGhlIG1mdCByZWZlcmVuY2UgYW5kIHRoZSBmaWxlIG5hbWUgdHlwZSAod2Ugc2V0CisJCSAqIHRoZSBuYW1lIGxlbmd0aCB0byB6ZXJvIGZvciBzaW1wbGljaXR5KS4KKwkJICovCisJCWlmICghTlZvbENhc2VTZW5zaXRpdmUodm9sKSAmJgorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV90eXBlICYmCisJCQkJbnRmc19hcmVfbmFtZXNfZXF1YWwodW5hbWUsIHVuYW1lX2xlbiwKKwkJCQkobnRmc2NoYXIqKSZpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWUsCisJCQkJaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX2xlbmd0aCwKKwkJCQlJR05PUkVfQ0FTRSwgdm9sLT51cGNhc2UsIHZvbC0+dXBjYXNlX2xlbikpIHsKKwkJCWludCBuYW1lX3NpemUgPSBzaXplb2YobnRmc19uYW1lKTsKKwkJCXU4IHR5cGUgPSBpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfdHlwZTsKKwkJCXU4IGxlbiA9IGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGg7CisKKwkJCS8qIE9ubHkgb25lIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2hpbmcgbmFtZSBhbGxvd2VkLiAqLworCQkJaWYgKG5hbWUpIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiRm91bmQgYWxyZWFkeSBhbGxvY2F0ZWQgbmFtZSAiCisJCQkJCQkiaW4gcGhhc2UgMi4gUGxlYXNlIHJ1biBjaGtkc2sgIgorCQkJCQkJImFuZCBpZiB0aGF0IGRvZXNuJ3QgZmluZCBhbnkgIgorCQkJCQkJImVycm9ycyBwbGVhc2UgcmVwb3J0IHlvdSBzYXcgIgorCQkJCQkJInRoaXMgbWVzc2FnZSB0byAiCisJCQkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuIgorCQkJCQkJInNvdXJjZWZvcmdlLm5ldC4iKTsKKwkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCQkJZ290byBkaXJfZXJyX291dDsKKwkJCX0KKworCQkJaWYgKHR5cGUgIT0gRklMRV9OQU1FX0RPUykKKwkJCQluYW1lX3NpemUgKz0gbGVuICogc2l6ZW9mKG50ZnNjaGFyKTsKKwkJCW5hbWUgPSBrbWFsbG9jKG5hbWVfc2l6ZSwgR0ZQX05PRlMpOworCQkJaWYgKCFuYW1lKSB7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJfQorCQkJbmFtZS0+bXJlZiA9IGxlNjRfdG9fY3B1KGllLT5kYXRhLmRpci5pbmRleGVkX2ZpbGUpOworCQkJbmFtZS0+dHlwZSA9IHR5cGU7CisJCQlpZiAodHlwZSAhPSBGSUxFX05BTUVfRE9TKSB7CisJCQkJbmFtZS0+bGVuID0gbGVuOworCQkJCW1lbWNweShuYW1lLT5uYW1lLCBpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWUsCisJCQkJCQlsZW4gKiBzaXplb2YobnRmc2NoYXIpKTsKKwkJCX0gZWxzZQorCQkJCW5hbWUtPmxlbiA9IDA7CisJCQkqcmVzID0gbmFtZTsKKwkJfQorCQkvKgorCQkgKiBOb3QgYSBwZXJmZWN0IG1hdGNoLCBuZWVkIHRvIGRvIGZ1bGwgYmxvd24gY29sbGF0aW9uIHNvIHdlCisJCSAqIGtub3cgd2hpY2ggd2F5IGluIHRoZSBCK3RyZWUgd2UgaGF2ZSB0byBnby4KKwkJICovCisJCXJjID0gbnRmc19jb2xsYXRlX25hbWVzKHVuYW1lLCB1bmFtZV9sZW4sCisJCQkJKG50ZnNjaGFyKikmaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGgsIDEsCisJCQkJSUdOT1JFX0NBU0UsIHZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pOworCQkvKgorCQkgKiBJZiB1bmFtZSBjb2xsYXRlcyBiZWZvcmUgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZW50cnksIHRoZXJlCisJCSAqIGlzIGRlZmluaXRlbHkgbm8gc3VjaCBuYW1lIGluIHRoaXMgaW5kZXggYnV0IHdlIG1pZ2h0IG5lZWQgdG8KKwkJICogZGVzY2VuZCBpbnRvIHRoZSBCK3RyZWUgc28gd2UganVzdCBicmVhayBvdXQgb2YgdGhlIGxvb3AuCisJCSAqLworCQlpZiAocmMgPT0gLTEpCisJCQlicmVhazsKKwkJLyogVGhlIG5hbWVzIGFyZSBub3QgZXF1YWwsIGNvbnRpbnVlIHRoZSBzZWFyY2guICovCisJCWlmIChyYykKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBOYW1lcyBtYXRjaCB3aXRoIGNhc2UgaW5zZW5zaXRpdmUgY29tcGFyaXNvbiwgbm93IHRyeSB0aGUKKwkJICogY2FzZSBzZW5zaXRpdmUgY29tcGFyaXNvbiwgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHByb3BlcgorCQkgKiBjb2xsYXRpb24uCisJCSAqLworCQlyYyA9IG50ZnNfY29sbGF0ZV9uYW1lcyh1bmFtZSwgdW5hbWVfbGVuLAorCQkJCShudGZzY2hhciopJmllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZSwKKwkJCQlpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfbGVuZ3RoLCAxLAorCQkJCUNBU0VfU0VOU0lUSVZFLCB2b2wtPnVwY2FzZSwgdm9sLT51cGNhc2VfbGVuKTsKKwkJaWYgKHJjID09IC0xKQorCQkJYnJlYWs7CisJCWlmIChyYykKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBQZXJmZWN0IG1hdGNoLCB0aGlzIHdpbGwgbmV2ZXIgaGFwcGVuIGFzIHRoZQorCQkgKiBudGZzX2FyZV9uYW1lc19lcXVhbCgpIGNhbGwgd2lsbCBoYXZlIGdvdHRlbiBhIG1hdGNoIGJ1dCB3ZQorCQkgKiBzdGlsbCB0cmVhdCBpdCBjb3JyZWN0bHkuCisJCSAqLworCQlnb3RvIGZvdW5kX2l0MjsKKwl9CisJLyoKKwkgKiBXZSBoYXZlIGZpbmlzaGVkIHdpdGggdGhpcyBpbmRleCBidWZmZXIgd2l0aG91dCBzdWNjZXNzLiBDaGVjayBmb3IKKwkgKiB0aGUgcHJlc2VuY2Ugb2YgYSBjaGlsZCBub2RlLgorCSAqLworCWlmIChpZS0+ZmxhZ3MgJiBJTkRFWF9FTlRSWV9OT0RFKSB7CisJCWlmICgoaWEtPmluZGV4LmZsYWdzICYgTk9ERV9NQVNLKSA9PSBMRUFGX05PREUpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCBlbnRyeSB3aXRoIGNoaWxkIG5vZGUgZm91bmQgaW4gIgorCQkJCQkiYSBsZWFmIG5vZGUgaW4gZGlyZWN0b3J5IGlub2RlIDB4JWx4LiIsCisJCQkJCWRpcl9uaS0+bWZ0X25vKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJLyogQ2hpbGQgbm9kZSBwcmVzZW50LCBkZXNjZW5kIGludG8gaXQuICovCisJCW9sZF92Y24gPSB2Y247CisJCXZjbiA9IHNsZTY0X3RvX2NwdXAoKHNsZTY0KikoKHU4KilpZSArCisJCQkJbGUxNl90b19jcHUoaWUtPmxlbmd0aCkgLSA4KSk7CisJCWlmICh2Y24gPj0gMCkgeworCQkJLyogSWYgdmNuIGlzIGluIHRoZSBzYW1lIHBhZ2UgY2FjaGUgcGFnZSBhcyBvbGRfdmNuIHdlCisJCQkgKiByZWN5Y2xlIHRoZSBtYXBwZWQgcGFnZS4gKi8KKwkJCWlmIChvbGRfdmNuIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMgPj4KKwkJCQkJUEFHRV9DQUNIRV9TSElGVCA9PSB2Y24gPDwKKwkJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0cyA+PgorCQkJCQlQQUdFX0NBQ0hFX1NISUZUKQorCQkJCWdvdG8gZmFzdF9kZXNjZW5kX2ludG9fY2hpbGRfbm9kZTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQkJZ290byBkZXNjZW5kX2ludG9fY2hpbGRfbm9kZTsKKwkJfQorCQludGZzX2Vycm9yKHNiLCAiTmVnYXRpdmUgY2hpbGQgbm9kZSB2Y24gaW4gZGlyZWN0b3J5IGlub2RlICIKKwkJCQkiMHglbHguIiwgZGlyX25pLT5tZnRfbm8pOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwkvKgorCSAqIE5vIGNoaWxkIG5vZGUgcHJlc2VudCwgcmV0dXJuIC1FTk9FTlQsIHVubGVzcyB3ZSBoYXZlIGdvdCBhIG1hdGNoaW5nCisJICogbmFtZSBjYWNoZWQgaW4gbmFtZSBpbiB3aGljaCBjYXNlIHJldHVybiB0aGUgbWZ0IHJlZmVyZW5jZQorCSAqIGFzc29jaWF0ZWQgd2l0aCBpdC4KKwkgKi8KKwlpZiAobmFtZSkgeworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQlyZXR1cm4gbmFtZS0+bXJlZjsKKwl9CisJbnRmc19kZWJ1ZygiRW50cnkgbm90IGZvdW5kLiIpOworCWVyciA9IC1FTk9FTlQ7Cit1bm1fZXJyX291dDoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwludGZzX3VubWFwX3BhZ2UocGFnZSk7CitlcnJfb3V0OgorCWlmICghZXJyKQorCQllcnIgPSAtRUlPOworCWlmIChjdHgpCisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCWlmIChtKQorCQl1bm1hcF9tZnRfcmVjb3JkKGRpcl9uaSk7CisJaWYgKG5hbWUpIHsKKwkJa2ZyZWUobmFtZSk7CisJCSpyZXMgPSBOVUxMOworCX0KKwlyZXR1cm4gRVJSX01SRUYoZXJyKTsKK2Rpcl9lcnJfb3V0OgorCW50ZnNfZXJyb3Ioc2IsICJDb3JydXB0IGRpcmVjdG9yeS4gIEFib3J0aW5nIGxvb2t1cC4iKTsKKwlnb3RvIGVycl9vdXQ7Cit9CisKKyNpZiAwCisKKy8vIFRPRE86IChBSUEpCisvLyBUaGUgYWxnb3JpdGhtIGVtYmVkZGVkIGluIHRoaXMgY29kZSB3aWxsIGJlIHJlcXVpcmVkIGZvciB0aGUgdGltZSB3aGVuIHdlCisvLyB3YW50IHRvIHN1cHBvcnQgYWRkaW5nIG9mIGVudHJpZXMgdG8gZGlyZWN0b3JpZXMsIHdoZXJlIHdlIHJlcXVpcmUgY29ycmVjdAorLy8gY29sbGF0aW9uIG9mIGZpbGUgbmFtZXMgaW4gb3JkZXIgbm90IHRvIGNhdXNlIGNvcnJ1cHRpb24gb2YgdGhlIGZpbGUgc3lzdGVtLgorCisvKioKKyAqIG50ZnNfbG9va3VwX2lub2RlX2J5X25hbWUgLSBmaW5kIGFuIGlub2RlIGluIGEgZGlyZWN0b3J5IGdpdmVuIGl0cyBuYW1lCisgKiBAZGlyX25pOgludGZzIGlub2RlIG9mIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gc2VhcmNoIGZvciB0aGUgbmFtZQorICogQHVuYW1lOglVbmljb2RlIG5hbWUgZm9yIHdoaWNoIHRvIHNlYXJjaCBpbiB0aGUgZGlyZWN0b3J5CisgKiBAdW5hbWVfbGVuOglsZW5ndGggb2YgdGhlIG5hbWUgQHVuYW1lIGluIFVuaWNvZGUgY2hhcmFjdGVycworICoKKyAqIExvb2sgZm9yIGFuIGlub2RlIHdpdGggbmFtZSBAdW5hbWUgaW4gdGhlIGRpcmVjdG9yeSB3aXRoIGlub2RlIEBkaXJfbmkuCisgKiBudGZzX2xvb2t1cF9pbm9kZV9ieV9uYW1lKCkgd2Fsa3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgbG9va2luZyBmb3IKKyAqIHRoZSBVbmljb2RlIG5hbWUuIElmIHRoZSBuYW1lIGlzIGZvdW5kIGluIHRoZSBkaXJlY3RvcnksIHRoZSBjb3JyZXNwb25kaW5nCisgKiBpbm9kZSBudW1iZXIgKD49IDApIGlzIHJldHVybmVkIGFzIGEgbWZ0IHJlZmVyZW5jZSBpbiBjcHUgZm9ybWF0LCBpLmUuIGl0CisgKiBpcyBhIDY0LWJpdCBudW1iZXIgY29udGFpbmluZyB0aGUgc2VxdWVuY2UgbnVtYmVyLgorICoKKyAqIE9uIGVycm9yLCBhIG5lZ2F0aXZlIHZhbHVlIGlzIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVycm9yIGNvZGUuIEluCisgKiBwYXJ0aWN1bGFyIGlmIHRoZSBpbm9kZSBpcyBub3QgZm91bmQgLUVOT0VOVCBpcyByZXR1cm5lZC4gTm90ZSB0aGF0IHlvdQorICogY2FuJ3QganVzdCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIGZvciBiZWluZyBuZWdhdGl2ZSwgeW91IGhhdmUgdG8gY2hlY2sgdGhlCisgKiBpbm9kZSBudW1iZXIgZm9yIGJlaW5nIG5lZ2F0aXZlIHdoaWNoIHlvdSBjYW4gZXh0cmFjdCB1c2luZyBNUkVDKHJldHVybgorICogdmFsdWUpLgorICoKKyAqIE5vdGUsIEB1bmFtZV9sZW4gZG9lcyBub3QgaW5jbHVkZSB0aGUgKG9wdGlvbmFsKSB0ZXJtaW5hdGluZyBOVUxMIGNoYXJhY3Rlci4KKyAqLwordTY0IG50ZnNfbG9va3VwX2lub2RlX2J5X25hbWUobnRmc19pbm9kZSAqZGlyX25pLCBjb25zdCBudGZzY2hhciAqdW5hbWUsCisJCWNvbnN0IGludCB1bmFtZV9sZW4pCit7CisJbnRmc192b2x1bWUgKnZvbCA9IGRpcl9uaS0+dm9sOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB2b2wtPnNiOworCU1GVF9SRUNPUkQgKm07CisJSU5ERVhfUk9PVCAqaXI7CisJSU5ERVhfRU5UUlkgKmllOworCUlOREVYX0FMTE9DQVRJT04gKmlhOworCXU4ICppbmRleF9lbmQ7CisJdTY0IG1yZWY7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKwlpbnQgZXJyLCByYzsKKwlJR05PUkVfQ0FTRV9CT09MIGljOworCVZDTiB2Y24sIG9sZF92Y247CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmlhX21hcHBpbmc7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdTggKmthZGRyOworCisJLyogR2V0IGhvbGQgb2YgdGhlIG1mdCByZWNvcmQgZm9yIHRoZSBkaXJlY3RvcnkuICovCisJbSA9IG1hcF9tZnRfcmVjb3JkKGRpcl9uaSk7CisJaWYgKElTX0VSUihtKSkgeworCQludGZzX2Vycm9yKHNiLCAibWFwX21mdF9yZWNvcmQoKSBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVsZC4iLAorCQkJCS1QVFJfRVJSKG0pKTsKKwkJcmV0dXJuIEVSUl9NUkVGKFBUUl9FUlIobSkpOworCX0KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoZGlyX25pLCBtKTsKKwlpZiAoIWN0eCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIEZpbmQgdGhlIGluZGV4IHJvb3QgYXR0cmlidXRlIGluIHRoZSBtZnQgcmVjb3JkLiAqLworCWVyciA9IG50ZnNfYXR0cl9sb29rdXAoQVRfSU5ERVhfUk9PVCwgSTMwLCA0LCBDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwKKwkJCTAsIGN0eCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJaWYgKGVyciA9PSAtRU5PRU5UKSB7CisJCQludGZzX2Vycm9yKHNiLCAiSW5kZXggcm9vdCBhdHRyaWJ1dGUgbWlzc2luZyBpbiAiCisJCQkJCSJkaXJlY3RvcnkgaW5vZGUgMHglbHguIiwKKwkJCQkJZGlyX25pLT5tZnRfbm8pOworCQkJZXJyID0gLUVJTzsKKwkJfQorCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIEdldCB0byB0aGUgaW5kZXggcm9vdCB2YWx1ZSAoaXQncyBiZWVuIHZlcmlmaWVkIGluIHJlYWRfaW5vZGUpLiAqLworCWlyID0gKElOREVYX1JPT1QqKSgodTgqKWN0eC0+YXR0ciArCisJCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSk7CisJaW5kZXhfZW5kID0gKHU4KikmaXItPmluZGV4ICsgbGUzMl90b19jcHUoaXItPmluZGV4LmluZGV4X2xlbmd0aCk7CisJLyogVGhlIGZpcnN0IGluZGV4IGVudHJ5LiAqLworCWllID0gKElOREVYX0VOVFJZKikoKHU4KikmaXItPmluZGV4ICsKKwkJCWxlMzJfdG9fY3B1KGlyLT5pbmRleC5lbnRyaWVzX29mZnNldCkpOworCS8qCisJICogTG9vcCB1bnRpbCB3ZSBleGNlZWQgdmFsaWQgbWVtb3J5IChjb3JydXB0aW9uIGNhc2UpIG9yIHVudGlsIHdlCisJICogcmVhY2ggdGhlIGxhc3QgZW50cnkuCisJICovCisJZm9yICg7OyBpZSA9IChJTkRFWF9FTlRSWSopKCh1OCopaWUgKyBsZTE2X3RvX2NwdShpZS0+bGVuZ3RoKSkpIHsKKwkJLyogQm91bmRzIGNoZWNrcy4gKi8KKwkJaWYgKCh1OCopaWUgPCAodTgqKWN0eC0+bXJlYyB8fCAodTgqKWllICsKKwkJCQlzaXplb2YoSU5ERVhfRU5UUllfSEVBREVSKSA+IGluZGV4X2VuZCB8fAorCQkJCSh1OCopaWUgKyBsZTE2X3RvX2NwdShpZS0+a2V5X2xlbmd0aCkgPgorCQkJCWluZGV4X2VuZCkKKwkJCWdvdG8gZGlyX2Vycl9vdXQ7CisJCS8qCisJCSAqIFRoZSBsYXN0IGVudHJ5IGNhbm5vdCBjb250YWluIGEgbmFtZS4gSXQgY2FuIGhvd2V2ZXIgY29udGFpbgorCQkgKiBhIHBvaW50ZXIgdG8gYSBjaGlsZCBub2RlIGluIHRoZSBCK3RyZWUgc28gd2UganVzdCBicmVhayBvdXQuCisJCSAqLworCQlpZiAoaWUtPmZsYWdzICYgSU5ERVhfRU5UUllfRU5EKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIElmIHRoZSBjdXJyZW50IGVudHJ5IGhhcyBhIG5hbWUgdHlwZSBvZiBQT1NJWCwgdGhlIG5hbWUgaXMKKwkJICogY2FzZSBzZW5zaXRpdmUgYW5kIG5vdCBvdGhlcndpc2UuIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgdXMKKwkJICogbm90IGJlaW5nIGFibGUgdG8gYWNjZXNzIGFueSBQT1NJWCBmaWxlIG5hbWVzIHdoaWNoIGNvbGxhdGUKKwkJICogYWZ0ZXIgdGhlIG5vbi1QT1NJWCBvbmUgd2hlbiB0aGV5IG9ubHkgZGlmZmVyIGluIGNhc2UsIGJ1dAorCQkgKiBhbnlvbmUgZG9pbmcgc2NyZXd5IHN0dWZmIGxpa2UgdGhhdCBkZXNlcnZlcyB0byBidXJuIGluCisJCSAqIGhlbGwuLi4gRG9pbmcgdGhhdCBraW5kIG9mIHN0dWZmIG9uIE5UNCBhY3R1YWxseSBjYXVzZXMKKwkJICogY29ycnVwdGlvbiBvbiB0aGUgcGFydGl0aW9uIGV2ZW4gd2hlbiB1c2luZyBTUDZhIGFuZCBMaW51eAorCQkgKiBpcyBub3QgaW52b2x2ZWQgYXQgYWxsLgorCQkgKi8KKwkJaWMgPSBpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfdHlwZSA/IElHTk9SRV9DQVNFIDoKKwkJCQlDQVNFX1NFTlNJVElWRTsKKwkJLyoKKwkJICogSWYgdGhlIG5hbWVzIG1hdGNoIHBlcmZlY3RseSwgd2UgYXJlIGRvbmUgYW5kIHJldHVybiB0aGUKKwkJICogbWZ0IHJlZmVyZW5jZSBvZiB0aGUgaW5vZGUgKGkuZS4gdGhlIGlub2RlIG51bWJlciB0b2dldGhlcgorCQkgKiB3aXRoIHRoZSBzZXF1ZW5jZSBudW1iZXIgZm9yIGNvbnNpc3RlbmN5IGNoZWNraW5nLiBXZQorCQkgKiBjb252ZXJ0IGl0IHRvIGNwdSBmb3JtYXQgYmVmb3JlIHJldHVybmluZy4KKwkJICovCisJCWlmIChudGZzX2FyZV9uYW1lc19lcXVhbCh1bmFtZSwgdW5hbWVfbGVuLAorCQkJCShudGZzY2hhciopJmllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZSwKKwkJCQlpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfbGVuZ3RoLCBpYywKKwkJCQl2b2wtPnVwY2FzZSwgdm9sLT51cGNhc2VfbGVuKSkgeworZm91bmRfaXQ6CisJCQltcmVmID0gbGU2NF90b19jcHUoaWUtPmRhdGEuZGlyLmluZGV4ZWRfZmlsZSk7CisJCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwkJCXVubWFwX21mdF9yZWNvcmQoZGlyX25pKTsKKwkJCXJldHVybiBtcmVmOworCQl9CisJCS8qCisJCSAqIE5vdCBhIHBlcmZlY3QgbWF0Y2gsIG5lZWQgdG8gZG8gZnVsbCBibG93biBjb2xsYXRpb24gc28gd2UKKwkJICoga25vdyB3aGljaCB3YXkgaW4gdGhlIEIrdHJlZSB3ZSBoYXZlIHRvIGdvLgorCQkgKi8KKwkJcmMgPSBudGZzX2NvbGxhdGVfbmFtZXModW5hbWUsIHVuYW1lX2xlbiwKKwkJCQkobnRmc2NoYXIqKSZpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWUsCisJCQkJaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX2xlbmd0aCwgMSwKKwkJCQlJR05PUkVfQ0FTRSwgdm9sLT51cGNhc2UsIHZvbC0+dXBjYXNlX2xlbik7CisJCS8qCisJCSAqIElmIHVuYW1lIGNvbGxhdGVzIGJlZm9yZSB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBlbnRyeSwgdGhlcmUKKwkJICogaXMgZGVmaW5pdGVseSBubyBzdWNoIG5hbWUgaW4gdGhpcyBpbmRleCBidXQgd2UgbWlnaHQgbmVlZCB0bworCQkgKiBkZXNjZW5kIGludG8gdGhlIEIrdHJlZSBzbyB3ZSBqdXN0IGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KKwkJICovCisJCWlmIChyYyA9PSAtMSkKKwkJCWJyZWFrOworCQkvKiBUaGUgbmFtZXMgYXJlIG5vdCBlcXVhbCwgY29udGludWUgdGhlIHNlYXJjaC4gKi8KKwkJaWYgKHJjKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIE5hbWVzIG1hdGNoIHdpdGggY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uLCBub3cgdHJ5IHRoZQorCQkgKiBjYXNlIHNlbnNpdGl2ZSBjb21wYXJpc29uLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgcHJvcGVyCisJCSAqIGNvbGxhdGlvbi4KKwkJICovCisJCXJjID0gbnRmc19jb2xsYXRlX25hbWVzKHVuYW1lLCB1bmFtZV9sZW4sCisJCQkJKG50ZnNjaGFyKikmaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGgsIDEsCisJCQkJQ0FTRV9TRU5TSVRJVkUsIHZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pOworCQlpZiAocmMgPT0gLTEpCisJCQlicmVhazsKKwkJaWYgKHJjKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIFBlcmZlY3QgbWF0Y2gsIHRoaXMgd2lsbCBuZXZlciBoYXBwZW4gYXMgdGhlCisJCSAqIG50ZnNfYXJlX25hbWVzX2VxdWFsKCkgY2FsbCB3aWxsIGhhdmUgZ290dGVuIGEgbWF0Y2ggYnV0IHdlCisJCSAqIHN0aWxsIHRyZWF0IGl0IGNvcnJlY3RseS4KKwkJICovCisJCWdvdG8gZm91bmRfaXQ7CisJfQorCS8qCisJICogV2UgaGF2ZSBmaW5pc2hlZCB3aXRoIHRoaXMgaW5kZXggd2l0aG91dCBzdWNjZXNzLiBDaGVjayBmb3IgdGhlCisJICogcHJlc2VuY2Ugb2YgYSBjaGlsZCBub2RlLgorCSAqLworCWlmICghKGllLT5mbGFncyAmIElOREVYX0VOVFJZX05PREUpKSB7CisJCS8qIE5vIGNoaWxkIG5vZGUsIHJldHVybiAtRU5PRU5ULiAqLworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGVycl9vdXQ7CisJfSAvKiBDaGlsZCBub2RlIHByZXNlbnQsIGRlc2NlbmQgaW50byBpdC4gKi8KKwkvKiBDb25zaXN0ZW5jeSBjaGVjazogVmVyaWZ5IHRoYXQgYW4gaW5kZXggYWxsb2NhdGlvbiBleGlzdHMuICovCisJaWYgKCFOSW5vSW5kZXhBbGxvY1ByZXNlbnQoZGlyX25pKSkgeworCQludGZzX2Vycm9yKHNiLCAiTm8gaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUgYnV0IGluZGV4IGVudHJ5ICIKKwkJCQkicmVxdWlyZXMgb25lLiBEaXJlY3RvcnkgaW5vZGUgMHglbHggaXMgIgorCQkJCSJjb3JydXB0IG9yIGRyaXZlciBidWcuIiwgZGlyX25pLT5tZnRfbm8pOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIEdldCB0aGUgc3RhcnRpbmcgdmNuIG9mIHRoZSBpbmRleF9ibG9jayBob2xkaW5nIHRoZSBjaGlsZCBub2RlLiAqLworCXZjbiA9IHNsZTY0X3RvX2NwdXAoKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5sZW5ndGgpIC0gOCk7CisJaWFfbWFwcGluZyA9IFZGU19JKGRpcl9uaSktPmlfbWFwcGluZzsKKwkvKgorCSAqIFdlIGFyZSBkb25lIHdpdGggdGhlIGluZGV4IHJvb3QgYW5kIHRoZSBtZnQgcmVjb3JkLiBSZWxlYXNlIHRoZW0sCisJICogb3RoZXJ3aXNlIHdlIGRlYWRsb2NrIHdpdGggbnRmc19tYXBfcGFnZSgpLgorCSAqLworCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQoZGlyX25pKTsKKwltID0gTlVMTDsKKwljdHggPSBOVUxMOworZGVzY2VuZF9pbnRvX2NoaWxkX25vZGU6CisJLyoKKwkgKiBDb252ZXJ0IHZjbiB0byBpbmRleCBpbnRvIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSBpbiB1bml0cworCSAqIG9mIFBBR0VfQ0FDSEVfU0laRSBhbmQgbWFwIHRoZSBwYWdlIGNhY2hlIHBhZ2UsIHJlYWRpbmcgaXQgZnJvbQorCSAqIGRpc2sgaWYgbmVjZXNzYXJ5LgorCSAqLworCXBhZ2UgPSBudGZzX21hcF9wYWdlKGlhX21hcHBpbmcsIHZjbiA8PAorCQkJZGlyX25pLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCWlmIChJU19FUlIocGFnZSkpIHsKKwkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBtYXAgZGlyZWN0b3J5IGluZGV4IHBhZ2UsIGVycm9yICVsZC4iLAorCQkJCS1QVFJfRVJSKHBhZ2UpKTsKKwkJZXJyID0gUFRSX0VSUihwYWdlKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlsb2NrX3BhZ2UocGFnZSk7CisJa2FkZHIgPSAodTgqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKK2Zhc3RfZGVzY2VuZF9pbnRvX2NoaWxkX25vZGU6CisJLyogR2V0IHRvIHRoZSBpbmRleCBhbGxvY2F0aW9uIGJsb2NrLiAqLworCWlhID0gKElOREVYX0FMTE9DQVRJT04qKShrYWRkciArICgodmNuIDw8CisJCQlkaXJfbmktPml0eXBlLmluZGV4LnZjbl9zaXplX2JpdHMpICYgflBBR0VfQ0FDSEVfTUFTSykpOworCS8qIEJvdW5kcyBjaGVja3MuICovCisJaWYgKCh1OCopaWEgPCBrYWRkciB8fCAodTgqKWlhID4ga2FkZHIgKyBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJbnRmc19lcnJvcihzYiwgIk91dCBvZiBib3VuZHMgY2hlY2sgZmFpbGVkLiBDb3JydXB0IGRpcmVjdG9yeSAiCisJCQkJImlub2RlIDB4JWx4IG9yIGRyaXZlciBidWcuIiwgZGlyX25pLT5tZnRfbm8pOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwkvKiBDYXRjaCBtdWx0aSBzZWN0b3IgdHJhbnNmZXIgZml4dXAgZXJyb3JzLiAqLworCWlmICh1bmxpa2VseSghbnRmc19pc19pbmR4X3JlY29yZChpYS0+bWFnaWMpKSkgeworCQludGZzX2Vycm9yKHNiLCAiRGlyZWN0b3J5IGluZGV4IHJlY29yZCB3aXRoIHZjbiAweCVsbHggaXMgIgorCQkJCSJjb3JydXB0LiAgQ29ycnVwdCBpbm9kZSAweCVseC4gIFJ1biBjaGtkc2suIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZjbiwgZGlyX25pLT5tZnRfbm8pOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpZiAoc2xlNjRfdG9fY3B1KGlhLT5pbmRleF9ibG9ja192Y24pICE9IHZjbikgeworCQludGZzX2Vycm9yKHNiLCAiQWN0dWFsIFZDTiAoMHglbGx4KSBvZiBpbmRleCBidWZmZXIgaXMgIgorCQkJCSJkaWZmZXJlbnQgZnJvbSBleHBlY3RlZCBWQ04gKDB4JWxseCkuICIKKwkJCQkiRGlyZWN0b3J5IGlub2RlIDB4JWx4IGlzIGNvcnJ1cHQgb3IgZHJpdmVyICIKKwkJCQkiYnVnLiIsICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJc2xlNjRfdG9fY3B1KGlhLT5pbmRleF9ibG9ja192Y24pLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLCBkaXJfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWlmIChsZTMyX3RvX2NwdShpYS0+aW5kZXguYWxsb2NhdGVkX3NpemUpICsgMHgxOCAhPQorCQkJZGlyX25pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCBidWZmZXIgKFZDTiAweCVsbHgpIG9mIGRpcmVjdG9yeSBpbm9kZSAiCisJCQkJIjB4JWx4IGhhcyBhIHNpemUgKCV1KSBkaWZmZXJpbmcgZnJvbSB0aGUgIgorCQkJCSJkaXJlY3Rvcnkgc3BlY2lmaWVkIHNpemUgKCV1KS4gRGlyZWN0b3J5ICIKKwkJCQkiaW5vZGUgaXMgY29ycnVwdCBvciBkcml2ZXIgYnVnLiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sIGRpcl9uaS0+bWZ0X25vLAorCQkJCWxlMzJfdG9fY3B1KGlhLT5pbmRleC5hbGxvY2F0ZWRfc2l6ZSkgKyAweDE4LAorCQkJCWRpcl9uaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWluZGV4X2VuZCA9ICh1OCopaWEgKyBkaXJfbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemU7CisJaWYgKGluZGV4X2VuZCA+IGthZGRyICsgUEFHRV9DQUNIRV9TSVpFKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCBidWZmZXIgKFZDTiAweCVsbHgpIG9mIGRpcmVjdG9yeSBpbm9kZSAiCisJCQkJIjB4JWx4IGNyb3NzZXMgcGFnZSBib3VuZGFyeS4gSW1wb3NzaWJsZSEgIgorCQkJCSJDYW5ub3QgYWNjZXNzISBUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIHRoZSAiCisJCQkJImRyaXZlci4iLCAodW5zaWduZWQgbG9uZyBsb25nKXZjbiwKKwkJCQlkaXJfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWluZGV4X2VuZCA9ICh1OCopJmlhLT5pbmRleCArIGxlMzJfdG9fY3B1KGlhLT5pbmRleC5pbmRleF9sZW5ndGgpOworCWlmIChpbmRleF9lbmQgPiAodTgqKWlhICsgZGlyX25pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJTaXplIG9mIGluZGV4IGJ1ZmZlciAoVkNOIDB4JWxseCkgb2YgZGlyZWN0b3J5ICIKKwkJCQkiaW5vZGUgMHglbHggZXhjZWVkcyBtYXhpbXVtIHNpemUuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZjbiwgZGlyX25pLT5tZnRfbm8pOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwkvKiBUaGUgZmlyc3QgaW5kZXggZW50cnkuICovCisJaWUgPSAoSU5ERVhfRU5UUlkqKSgodTgqKSZpYS0+aW5kZXggKworCQkJbGUzMl90b19jcHUoaWEtPmluZGV4LmVudHJpZXNfb2Zmc2V0KSk7CisJLyoKKwkgKiBJdGVyYXRlIHNpbWlsYXIgdG8gYWJvdmUgYmlnIGxvb3AgYnV0IGFwcGxpZWQgdG8gaW5kZXggYnVmZmVyLCB0aHVzCisJICogbG9vcCB1bnRpbCB3ZSBleGNlZWQgdmFsaWQgbWVtb3J5IChjb3JydXB0aW9uIGNhc2UpIG9yIHVudGlsIHdlCisJICogcmVhY2ggdGhlIGxhc3QgZW50cnkuCisJICovCisJZm9yICg7OyBpZSA9IChJTkRFWF9FTlRSWSopKCh1OCopaWUgKyBsZTE2X3RvX2NwdShpZS0+bGVuZ3RoKSkpIHsKKwkJLyogQm91bmRzIGNoZWNrLiAqLworCQlpZiAoKHU4KilpZSA8ICh1OCopaWEgfHwgKHU4KilpZSArCisJCQkJc2l6ZW9mKElOREVYX0VOVFJZX0hFQURFUikgPiBpbmRleF9lbmQgfHwKKwkJCQkodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmtleV9sZW5ndGgpID4KKwkJCQlpbmRleF9lbmQpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCBlbnRyeSBvdXQgb2YgYm91bmRzIGluICIKKwkJCQkJImRpcmVjdG9yeSBpbm9kZSAweCVseC4iLAorCQkJCQlkaXJfbmktPm1mdF9ubyk7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCS8qCisJCSAqIFRoZSBsYXN0IGVudHJ5IGNhbm5vdCBjb250YWluIGEgbmFtZS4gSXQgY2FuIGhvd2V2ZXIgY29udGFpbgorCQkgKiBhIHBvaW50ZXIgdG8gYSBjaGlsZCBub2RlIGluIHRoZSBCK3RyZWUgc28gd2UganVzdCBicmVhayBvdXQuCisJCSAqLworCQlpZiAoaWUtPmZsYWdzICYgSU5ERVhfRU5UUllfRU5EKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIElmIHRoZSBjdXJyZW50IGVudHJ5IGhhcyBhIG5hbWUgdHlwZSBvZiBQT1NJWCwgdGhlIG5hbWUgaXMKKwkJICogY2FzZSBzZW5zaXRpdmUgYW5kIG5vdCBvdGhlcndpc2UuIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgdXMKKwkJICogbm90IGJlaW5nIGFibGUgdG8gYWNjZXNzIGFueSBQT1NJWCBmaWxlIG5hbWVzIHdoaWNoIGNvbGxhdGUKKwkJICogYWZ0ZXIgdGhlIG5vbi1QT1NJWCBvbmUgd2hlbiB0aGV5IG9ubHkgZGlmZmVyIGluIGNhc2UsIGJ1dAorCQkgKiBhbnlvbmUgZG9pbmcgc2NyZXd5IHN0dWZmIGxpa2UgdGhhdCBkZXNlcnZlcyB0byBidXJuIGluCisJCSAqIGhlbGwuLi4gRG9pbmcgdGhhdCBraW5kIG9mIHN0dWZmIG9uIE5UNCBhY3R1YWxseSBjYXVzZXMKKwkJICogY29ycnVwdGlvbiBvbiB0aGUgcGFydGl0aW9uIGV2ZW4gd2hlbiB1c2luZyBTUDZhIGFuZCBMaW51eAorCQkgKiBpcyBub3QgaW52b2x2ZWQgYXQgYWxsLgorCQkgKi8KKwkJaWMgPSBpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfdHlwZSA/IElHTk9SRV9DQVNFIDoKKwkJCQlDQVNFX1NFTlNJVElWRTsKKwkJLyoKKwkJICogSWYgdGhlIG5hbWVzIG1hdGNoIHBlcmZlY3RseSwgd2UgYXJlIGRvbmUgYW5kIHJldHVybiB0aGUKKwkJICogbWZ0IHJlZmVyZW5jZSBvZiB0aGUgaW5vZGUgKGkuZS4gdGhlIGlub2RlIG51bWJlciB0b2dldGhlcgorCQkgKiB3aXRoIHRoZSBzZXF1ZW5jZSBudW1iZXIgZm9yIGNvbnNpc3RlbmN5IGNoZWNraW5nLiBXZQorCQkgKiBjb252ZXJ0IGl0IHRvIGNwdSBmb3JtYXQgYmVmb3JlIHJldHVybmluZy4KKwkJICovCisJCWlmIChudGZzX2FyZV9uYW1lc19lcXVhbCh1bmFtZSwgdW5hbWVfbGVuLAorCQkJCShudGZzY2hhciopJmllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZSwKKwkJCQlpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfbGVuZ3RoLCBpYywKKwkJCQl2b2wtPnVwY2FzZSwgdm9sLT51cGNhc2VfbGVuKSkgeworZm91bmRfaXQyOgorCQkJbXJlZiA9IGxlNjRfdG9fY3B1KGllLT5kYXRhLmRpci5pbmRleGVkX2ZpbGUpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCQlyZXR1cm4gbXJlZjsKKwkJfQorCQkvKgorCQkgKiBOb3QgYSBwZXJmZWN0IG1hdGNoLCBuZWVkIHRvIGRvIGZ1bGwgYmxvd24gY29sbGF0aW9uIHNvIHdlCisJCSAqIGtub3cgd2hpY2ggd2F5IGluIHRoZSBCK3RyZWUgd2UgaGF2ZSB0byBnby4KKwkJICovCisJCXJjID0gbnRmc19jb2xsYXRlX25hbWVzKHVuYW1lLCB1bmFtZV9sZW4sCisJCQkJKG50ZnNjaGFyKikmaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGgsIDEsCisJCQkJSUdOT1JFX0NBU0UsIHZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pOworCQkvKgorCQkgKiBJZiB1bmFtZSBjb2xsYXRlcyBiZWZvcmUgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZW50cnksIHRoZXJlCisJCSAqIGlzIGRlZmluaXRlbHkgbm8gc3VjaCBuYW1lIGluIHRoaXMgaW5kZXggYnV0IHdlIG1pZ2h0IG5lZWQgdG8KKwkJICogZGVzY2VuZCBpbnRvIHRoZSBCK3RyZWUgc28gd2UganVzdCBicmVhayBvdXQgb2YgdGhlIGxvb3AuCisJCSAqLworCQlpZiAocmMgPT0gLTEpCisJCQlicmVhazsKKwkJLyogVGhlIG5hbWVzIGFyZSBub3QgZXF1YWwsIGNvbnRpbnVlIHRoZSBzZWFyY2guICovCisJCWlmIChyYykKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBOYW1lcyBtYXRjaCB3aXRoIGNhc2UgaW5zZW5zaXRpdmUgY29tcGFyaXNvbiwgbm93IHRyeSB0aGUKKwkJICogY2FzZSBzZW5zaXRpdmUgY29tcGFyaXNvbiwgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHByb3BlcgorCQkgKiBjb2xsYXRpb24uCisJCSAqLworCQlyYyA9IG50ZnNfY29sbGF0ZV9uYW1lcyh1bmFtZSwgdW5hbWVfbGVuLAorCQkJCShudGZzY2hhciopJmllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZSwKKwkJCQlpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfbGVuZ3RoLCAxLAorCQkJCUNBU0VfU0VOU0lUSVZFLCB2b2wtPnVwY2FzZSwgdm9sLT51cGNhc2VfbGVuKTsKKwkJaWYgKHJjID09IC0xKQorCQkJYnJlYWs7CisJCWlmIChyYykKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBQZXJmZWN0IG1hdGNoLCB0aGlzIHdpbGwgbmV2ZXIgaGFwcGVuIGFzIHRoZQorCQkgKiBudGZzX2FyZV9uYW1lc19lcXVhbCgpIGNhbGwgd2lsbCBoYXZlIGdvdHRlbiBhIG1hdGNoIGJ1dCB3ZQorCQkgKiBzdGlsbCB0cmVhdCBpdCBjb3JyZWN0bHkuCisJCSAqLworCQlnb3RvIGZvdW5kX2l0MjsKKwl9CisJLyoKKwkgKiBXZSBoYXZlIGZpbmlzaGVkIHdpdGggdGhpcyBpbmRleCBidWZmZXIgd2l0aG91dCBzdWNjZXNzLiBDaGVjayBmb3IKKwkgKiB0aGUgcHJlc2VuY2Ugb2YgYSBjaGlsZCBub2RlLgorCSAqLworCWlmIChpZS0+ZmxhZ3MgJiBJTkRFWF9FTlRSWV9OT0RFKSB7CisJCWlmICgoaWEtPmluZGV4LmZsYWdzICYgTk9ERV9NQVNLKSA9PSBMRUFGX05PREUpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCBlbnRyeSB3aXRoIGNoaWxkIG5vZGUgZm91bmQgaW4gIgorCQkJCQkiYSBsZWFmIG5vZGUgaW4gZGlyZWN0b3J5IGlub2RlIDB4JWx4LiIsCisJCQkJCWRpcl9uaS0+bWZ0X25vKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJLyogQ2hpbGQgbm9kZSBwcmVzZW50LCBkZXNjZW5kIGludG8gaXQuICovCisJCW9sZF92Y24gPSB2Y247CisJCXZjbiA9IHNsZTY0X3RvX2NwdXAoKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5sZW5ndGgpIC0gOCk7CisJCWlmICh2Y24gPj0gMCkgeworCQkJLyogSWYgdmNuIGlzIGluIHRoZSBzYW1lIHBhZ2UgY2FjaGUgcGFnZSBhcyBvbGRfdmNuIHdlCisJCQkgKiByZWN5Y2xlIHRoZSBtYXBwZWQgcGFnZS4gKi8KKwkJCWlmIChvbGRfdmNuIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMgPj4KKwkJCQkJUEFHRV9DQUNIRV9TSElGVCA9PSB2Y24gPDwKKwkJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0cyA+PgorCQkJCQlQQUdFX0NBQ0hFX1NISUZUKQorCQkJCWdvdG8gZmFzdF9kZXNjZW5kX2ludG9fY2hpbGRfbm9kZTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQkJZ290byBkZXNjZW5kX2ludG9fY2hpbGRfbm9kZTsKKwkJfQorCQludGZzX2Vycm9yKHNiLCAiTmVnYXRpdmUgY2hpbGQgbm9kZSB2Y24gaW4gZGlyZWN0b3J5IGlub2RlICIKKwkJCQkiMHglbHguIiwgZGlyX25pLT5tZnRfbm8pOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwkvKiBObyBjaGlsZCBub2RlLCByZXR1cm4gLUVOT0VOVC4gKi8KKwludGZzX2RlYnVnKCJFbnRyeSBub3QgZm91bmQuIik7CisJZXJyID0gLUVOT0VOVDsKK3VubV9lcnJfb3V0OgorCXVubG9ja19wYWdlKHBhZ2UpOworCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKK2Vycl9vdXQ6CisJaWYgKCFlcnIpCisJCWVyciA9IC1FSU87CisJaWYgKGN0eCkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJaWYgKG0pCisJCXVubWFwX21mdF9yZWNvcmQoZGlyX25pKTsKKwlyZXR1cm4gRVJSX01SRUYoZXJyKTsKK2Rpcl9lcnJfb3V0OgorCW50ZnNfZXJyb3Ioc2IsICJDb3JydXB0IGRpcmVjdG9yeS4gQWJvcnRpbmcgbG9va3VwLiIpOworCWdvdG8gZXJyX291dDsKK30KKworI2VuZGlmCisKKy8qKgorICogbnRmc19maWxsZGlyIC0gbnRmcyBzcGVjaWZpYyBmaWxsZGlyIG1ldGhvZAorICogQHZvbDoJY3VycmVudCBudGZzIHZvbHVtZQorICogQGZwb3M6CXBvc2l0aW9uIGluIHRoZSBkaXJlY3RvcnkKKyAqIEBuZGlyOgludGZzIGlub2RlIG9mIGN1cnJlbnQgZGlyZWN0b3J5CisgKiBAaWFfcGFnZToJcGFnZSBpbiB3aGljaCB0aGUgaW5kZXggYWxsb2NhdGlvbiBidWZmZXIgQGllIGlzIGluIHJlc2lkZXMKKyAqIEBpZToJCWN1cnJlbnQgaW5kZXggZW50cnkKKyAqIEBuYW1lOglidWZmZXIgdG8gdXNlIGZvciB0aGUgY29udmVydGVkIG5hbWUKKyAqIEBkaXJlbnQ6CXZmcyBmaWxsZGlyIGNhbGxiYWNrIGNvbnRleHQKKyAqIEBmaWxsZGlyOgl2ZnMgZmlsbGRpciBjYWxsYmFjaworICoKKyAqIENvbnZlcnQgdGhlIFVuaWNvZGUgQG5hbWUgdG8gdGhlIGxvYWRlZCBOTFMgYW5kIHBhc3MgaXQgdG8gdGhlIEBmaWxsZGlyCisgKiBjYWxsYmFjay4KKyAqCisgKiBJZiBAaWFfcGFnZSBpcyBub3QgTlVMTCBpdCBpcyB0aGUgbG9ja2VkIHBhZ2UgY29udGFpbmluZyB0aGUgaW5kZXgKKyAqIGFsbG9jYXRpb24gYmxvY2sgY29udGFpbmluZyB0aGUgaW5kZXggZW50cnkgQGllLgorICoKKyAqIE5vdGUsIHdlIGRyb3AgKGFuZCB0aGVuIHJlYWNxdWlyZSkgdGhlIHBhZ2UgbG9jayBvbiBAaWFfcGFnZSBhY3Jvc3MgdGhlCisgKiBAZmlsbGRpcigpIGNhbGwgb3RoZXJ3aXNlIHdlIHdvdWxkIGRlYWRsb2NrIHdpdGggTkZTZCB3aGVuIGl0IGNhbGxzIC0+bG9va3VwCisgKiBzaW5jZSBudGZzX2xvb2t1cCgpIHdpbGwgbG9jayB0aGUgc2FtZSBwYWdlLiAgQXMgYW4gb3B0aW1pemF0aW9uLCB3ZSBkbyBub3QKKyAqIHJldGFrZSB0aGUgbG9jayBpZiB3ZSBhcmUgcmV0dXJuaW5nIGEgbm9uLXplcm8gdmFsdWUgYXMgbnRmc19yZWFkZGlyKCkKKyAqIHdvdWxkIG5lZWQgdG8gZHJvcCB0aGUgbG9jayBpbW1lZGlhdGVseSBhbnl3YXkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG50ZnNfZmlsbGRpcihudGZzX3ZvbHVtZSAqdm9sLCBsb2ZmX3QgZnBvcywKKwkJbnRmc19pbm9kZSAqbmRpciwgc3RydWN0IHBhZ2UgKmlhX3BhZ2UsIElOREVYX0VOVFJZICppZSwKKwkJdTggKm5hbWUsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJdW5zaWduZWQgbG9uZyBtcmVmOworCWludCBuYW1lX2xlbiwgcmM7CisJdW5zaWduZWQgZHRfdHlwZTsKKwlGSUxFX05BTUVfVFlQRV9GTEFHUyBuYW1lX3R5cGU7CisKKwluYW1lX3R5cGUgPSBpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfdHlwZTsKKwlpZiAobmFtZV90eXBlID09IEZJTEVfTkFNRV9ET1MpIHsKKwkJbnRmc19kZWJ1ZygiU2tpcHBpbmcgRE9TIG5hbWUgc3BhY2UgZW50cnkuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoTVJFRl9MRShpZS0+ZGF0YS5kaXIuaW5kZXhlZF9maWxlKSA9PSBGSUxFX3Jvb3QpIHsKKwkJbnRmc19kZWJ1ZygiU2tpcHBpbmcgcm9vdCBkaXJlY3Rvcnkgc2VsZiByZWZlcmVuY2UgZW50cnkuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoTVJFRl9MRShpZS0+ZGF0YS5kaXIuaW5kZXhlZF9maWxlKSA8IEZJTEVfZmlyc3RfdXNlciAmJgorCQkJIU5Wb2xTaG93U3lzdGVtRmlsZXModm9sKSkgeworCQludGZzX2RlYnVnKCJTa2lwcGluZyBzeXN0ZW0gZmlsZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCW5hbWVfbGVuID0gbnRmc191Y3N0b25scyh2b2wsIChudGZzY2hhciopJmllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZSwKKwkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGgsICZuYW1lLAorCQkJTlRGU19NQVhfTkFNRV9MRU4gKiBOTFNfTUFYX0NIQVJTRVRfU0laRSArIDEpOworCWlmIChuYW1lX2xlbiA8PSAwKSB7CisJCW50ZnNfZGVidWcoIlNraXBwaW5nIHVucmVwcmVzZW50YWJsZSBmaWxlLiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfYXR0cmlidXRlcyAmCisJCQlGSUxFX0FUVFJfRFVQX0ZJTEVfTkFNRV9JTkRFWF9QUkVTRU5UKQorCQlkdF90eXBlID0gRFRfRElSOworCWVsc2UKKwkJZHRfdHlwZSA9IERUX1JFRzsKKwltcmVmID0gTVJFRl9MRShpZS0+ZGF0YS5kaXIuaW5kZXhlZF9maWxlKTsKKwkvKgorCSAqIERyb3AgdGhlIHBhZ2UgbG9jayBvdGhlcndpc2Ugd2UgZGVhZGxvY2sgd2l0aCBORlMgd2hlbiBpdCBjYWxscworCSAqIC0+bG9va3VwIHNpbmNlIG50ZnNfbG9va3VwKCkgd2lsbCBsb2NrIHRoZSBzYW1lIHBhZ2UuCisJICovCisJaWYgKGlhX3BhZ2UpCisJCXVubG9ja19wYWdlKGlhX3BhZ2UpOworCW50ZnNfZGVidWcoIkNhbGxpbmcgZmlsbGRpciBmb3IgJXMgd2l0aCBsZW4gJWksIGZwb3MgMHglbGx4LCBpbm9kZSAiCisJCQkiMHglbHgsIERUXyVzLiIsIG5hbWUsIG5hbWVfbGVuLCBmcG9zLCBtcmVmLAorCQkJZHRfdHlwZSA9PSBEVF9ESVIgPyAiRElSIiA6ICJSRUciKTsKKwlyYyA9IGZpbGxkaXIoZGlyZW50LCBuYW1lLCBuYW1lX2xlbiwgZnBvcywgbXJlZiwgZHRfdHlwZSk7CisJLyogUmVsb2NrIHRoZSBwYWdlIGJ1dCBub3QgaWYgd2UgYXJlIGFib3J0aW5nIC0+cmVhZGRpci4gKi8KKwlpZiAoIXJjICYmIGlhX3BhZ2UpCisJCWxvY2tfcGFnZShpYV9wYWdlKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBXZSB1c2UgdGhlIHNhbWUgYmFzaWMgYXBwcm9hY2ggYXMgdGhlIG9sZCBOVEZTIGRyaXZlciwgaS5lLiB3ZSBwYXJzZSB0aGUKKyAqIGluZGV4IHJvb3QgZW50cmllcyBhbmQgdGhlbiB0aGUgaW5kZXggYWxsb2NhdGlvbiBlbnRyaWVzIHRoYXQgYXJlIG1hcmtlZAorICogYXMgaW4gdXNlIGluIHRoZSBpbmRleCBiaXRtYXAuCisgKgorICogV2hpbGUgdGhpcyB3aWxsIHJldHVybiB0aGUgbmFtZXMgaW4gcmFuZG9tIG9yZGVyIHRoaXMgZG9lc24ndCBtYXR0ZXIgZm9yCisgKiAtPnJlYWRkaXIgYnV0IE9UT0ggcmVzdWx0cyBpbiBhIGZhc3RlciAtPnJlYWRkaXIuCisgKgorICogVkZTIGNhbGxzIC0+cmVhZGRpciB3aXRob3V0IEJLTCBidXQgd2l0aCBpX3NlbSBoZWxkLiBUaGlzIHByb3RlY3RzIHRoZSBWRlMKKyAqIHBhcnRzIChlLmcuIC0+Zl9wb3MgYW5kIC0+aV9zaXplLCBhbmQgaXQgYWxzbyBwcm90ZWN0cyBhZ2FpbnN0IGRpcmVjdG9yeQorICogbW9kaWZpY2F0aW9ucykuCisgKgorICogTG9ja2luZzogIC0gQ2FsbGVyIG11c3QgaG9sZCBpX3NlbSBvbiB0aGUgZGlyZWN0b3J5LgorICoJICAgICAtIEVhY2ggcGFnZSBjYWNoZSBwYWdlIGluIHRoZSBpbmRleCBhbGxvY2F0aW9uIG1hcHBpbmcgbXVzdCBiZQorICoJICAgICAgIGxvY2tlZCB3aGlsc3QgYmVpbmcgYWNjZXNzZWQgb3RoZXJ3aXNlIHdlIG1heSBmaW5kIGEgY29ycnVwdAorICoJICAgICAgIHBhZ2UgZHVlIHRvIGl0IGJlaW5nIHVuZGVyIC0+d3JpdGVwYWdlIGF0IHRoZSBtb21lbnQgd2hpY2gKKyAqCSAgICAgICBhcHBsaWVzIHRoZSBtc3QgcHJvdGVjdGlvbiBmaXh1cHMgYmVmb3JlIHdyaXRpbmcgb3V0IGFuZCB0aGVuCisgKgkgICAgICAgcmVtb3ZlcyB0aGVtIGFnYWluIGFmdGVyIHRoZSB3cml0ZSBpcyBjb21wbGV0ZSBhZnRlciB3aGljaCBpdCAKKyAqCSAgICAgICB1bmxvY2tzIHRoZSBwYWdlLgorICovCitzdGF0aWMgaW50IG50ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzNjQgaWFfcG9zLCBpYV9zdGFydCwgcHJldl9pYV9wb3MsIGJtcF9wb3M7CisJbG9mZl90IGZwb3M7CisJc3RydWN0IGlub2RlICpibXBfdmksICp2ZGlyID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHZkaXItPmlfc2I7CisJbnRmc19pbm9kZSAqbmRpciA9IE5URlNfSSh2ZGlyKTsKKwludGZzX3ZvbHVtZSAqdm9sID0gTlRGU19TQihzYik7CisJTUZUX1JFQ09SRCAqbTsKKwlJTkRFWF9ST09UICppciA9IE5VTEw7CisJSU5ERVhfRU5UUlkgKmllOworCUlOREVYX0FMTE9DQVRJT04gKmlhOworCXU4ICpuYW1lID0gTlVMTDsKKwlpbnQgcmMsIGVyciwgaXJfcG9zLCBjdXJfYm1wX3BvczsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqaWFfbWFwcGluZywgKmJtcF9tYXBwaW5nOworCXN0cnVjdCBwYWdlICpibXBfcGFnZSA9IE5VTEwsICppYV9wYWdlID0gTlVMTDsKKwl1OCAqa2FkZHIsICpibXAsICppbmRleF9lbmQ7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKworCWZwb3MgPSBmaWxwLT5mX3BvczsKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaW5vZGUgMHglbHgsIGZwb3MgMHglbGx4LiIsCisJCQl2ZGlyLT5pX2lubywgZnBvcyk7CisJcmMgPSBlcnIgPSAwOworCS8qIEFyZSB3ZSBhdCBlbmQgb2YgZGlyIHlldD8gKi8KKwlpZiAoZnBvcyA+PSB2ZGlyLT5pX3NpemUgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZSkKKwkJZ290byBkb25lOworCS8qIEVtdWxhdGUgLiBhbmQgLi4gZm9yIGFsbCBkaXJlY3Rvcmllcy4gKi8KKwlpZiAoIWZwb3MpIHsKKwkJbnRmc19kZWJ1ZygiQ2FsbGluZyBmaWxsZGlyIGZvciAuIHdpdGggbGVuIDEsIGZwb3MgMHgwLCAiCisJCQkJImlub2RlIDB4JWx4LCBEVF9ESVIuIiwgdmRpci0+aV9pbm8pOworCQlyYyA9IGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIGZwb3MsIHZkaXItPmlfaW5vLCBEVF9ESVIpOworCQlpZiAocmMpCisJCQlnb3RvIGRvbmU7CisJCWZwb3MrKzsKKwl9CisJaWYgKGZwb3MgPT0gMSkgeworCQludGZzX2RlYnVnKCJDYWxsaW5nIGZpbGxkaXIgZm9yIC4uIHdpdGggbGVuIDIsIGZwb3MgMHgxLCAiCisJCQkJImlub2RlIDB4JWx4LCBEVF9ESVIuIiwKKwkJCQlwYXJlbnRfaW5vKGZpbHAtPmZfZGVudHJ5KSk7CisJCXJjID0gZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIGZwb3MsCisJCQkJcGFyZW50X2lubyhmaWxwLT5mX2RlbnRyeSksIERUX0RJUik7CisJCWlmIChyYykKKwkJCWdvdG8gZG9uZTsKKwkJZnBvcysrOworCX0KKwltID0gTlVMTDsKKwljdHggPSBOVUxMOworCS8qCisJICogQWxsb2NhdGUgYSBidWZmZXIgdG8gc3RvcmUgdGhlIGN1cnJlbnQgbmFtZSBiZWluZyBwcm9jZXNzZWQKKwkgKiBjb252ZXJ0ZWQgdG8gZm9ybWF0IGRldGVybWluZWQgYnkgY3VycmVudCBOTFMuCisJICovCisJbmFtZSA9ICh1OCopa21hbGxvYyhOVEZTX01BWF9OQU1FX0xFTiAqIE5MU19NQVhfQ0hBUlNFVF9TSVpFICsgMSwKKwkJCUdGUF9OT0ZTKTsKKwlpZiAodW5saWtlbHkoIW5hbWUpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogQXJlIHdlIGp1bXBpbmcgc3RyYWlnaHQgaW50byB0aGUgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGU/ICovCisJaWYgKGZwb3MgPj0gdm9sLT5tZnRfcmVjb3JkX3NpemUpCisJCWdvdG8gc2tpcF9pbmRleF9yb290OworCS8qIEdldCBob2xkIG9mIHRoZSBtZnQgcmVjb3JkIGZvciB0aGUgZGlyZWN0b3J5LiAqLworCW0gPSBtYXBfbWZ0X3JlY29yZChuZGlyKTsKKwlpZiAoSVNfRVJSKG0pKSB7CisJCWVyciA9IFBUUl9FUlIobSk7CisJCW0gPSBOVUxMOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChuZGlyLCBtKTsKKwlpZiAodW5saWtlbHkoIWN0eCkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBHZXQgdGhlIG9mZnNldCBpbnRvIHRoZSBpbmRleCByb290IGF0dHJpYnV0ZS4gKi8KKwlpcl9wb3MgPSAoczY0KWZwb3M7CisJLyogRmluZCB0aGUgaW5kZXggcm9vdCBhdHRyaWJ1dGUgaW4gdGhlIG1mdCByZWNvcmQuICovCisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9JTkRFWF9ST09ULCBJMzAsIDQsIENBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLAorCQkJMCwgY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQludGZzX2Vycm9yKHNiLCAiSW5kZXggcm9vdCBhdHRyaWJ1dGUgbWlzc2luZyBpbiBkaXJlY3RvcnkgIgorCQkJCSJpbm9kZSAweCVseC4iLCB2ZGlyLT5pX2lubyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyoKKwkgKiBDb3B5IHRoZSBpbmRleCByb290IGF0dHJpYnV0ZSB2YWx1ZSB0byBhIGJ1ZmZlciBzbyB0aGF0IHdlIGNhbiBwdXQKKwkgKiB0aGUgc2VhcmNoIGNvbnRleHQgYW5kIHVubWFwIHRoZSBtZnQgcmVjb3JkIGJlZm9yZSBjYWxsaW5nIHRoZQorCSAqIGZpbGxkaXIoKSBjYWxsYmFjay4gIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIG9mIE5GU2Qgd2hpY2ggY2FsbHMKKwkgKiAtPmxvb2t1cCgpIGZyb20gaXRzIGZpbGxkaXIgY2FsbGJhY2soKSBhbmQgdGhpcyBjYXVzZXMgTlRGUyB0bworCSAqIGRlYWRsb2NrIGFzIG50ZnNfbG9va3VwKCkgbWFwcyB0aGUgbWZ0IHJlY29yZCBvZiB0aGUgZGlyZWN0b3J5IGFuZAorCSAqIHdlIGhhdmUgZ290IGl0IG1hcHBlZCBoZXJlIGFscmVhZHkuICBUaGUgb25seSBzb2x1dGlvbiBpcyBmb3IgdXMgdG8KKwkgKiB1bm1hcCB0aGUgbWZ0IHJlY29yZCBoZXJlIHNvIHRoYXQgYSBjYWxsIHRvIG50ZnNfbG9va3VwKCkgaXMgYWJsZSB0bworCSAqIG1hcCB0aGUgbWZ0IHJlY29yZCB3aXRob3V0IGRlYWRsb2NraW5nLgorCSAqLworCXJjID0gbGUzMl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCk7CisJaXIgPSAoSU5ERVhfUk9PVCopa21hbGxvYyhyYywgR0ZQX05PRlMpOworCWlmICh1bmxpa2VseSghaXIpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogQ29weSB0aGUgaW5kZXggcm9vdCB2YWx1ZSAoaXQgaGFzIGJlZW4gdmVyaWZpZWQgaW4gcmVhZF9pbm9kZSkuICovCisJbWVtY3B5KGlyLCAodTgqKWN0eC0+YXR0ciArCisJCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSwgcmMpOworCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQobmRpcik7CisJY3R4ID0gTlVMTDsKKwltID0gTlVMTDsKKwlpbmRleF9lbmQgPSAodTgqKSZpci0+aW5kZXggKyBsZTMyX3RvX2NwdShpci0+aW5kZXguaW5kZXhfbGVuZ3RoKTsKKwkvKiBUaGUgZmlyc3QgaW5kZXggZW50cnkuICovCisJaWUgPSAoSU5ERVhfRU5UUlkqKSgodTgqKSZpci0+aW5kZXggKworCQkJbGUzMl90b19jcHUoaXItPmluZGV4LmVudHJpZXNfb2Zmc2V0KSk7CisJLyoKKwkgKiBMb29wIHVudGlsIHdlIGV4Y2VlZCB2YWxpZCBtZW1vcnkgKGNvcnJ1cHRpb24gY2FzZSkgb3IgdW50aWwgd2UKKwkgKiByZWFjaCB0aGUgbGFzdCBlbnRyeSBvciB1bnRpbCBmaWxsZGlyIHRlbGxzIHVzIGl0IGhhcyBoYWQgZW5vdWdoCisJICogb3Igc2lnbmFscyBhbiBlcnJvciAoYm90aCBjb3ZlcmVkIGJ5IHRoZSByYyB0ZXN0KS4KKwkgKi8KKwlmb3IgKDs7IGllID0gKElOREVYX0VOVFJZKikoKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5sZW5ndGgpKSkgeworCQludGZzX2RlYnVnKCJJbiBpbmRleCByb290LCBvZmZzZXQgMHglenguIiwgKHU4KilpZSAtICh1OCopaXIpOworCQkvKiBCb3VuZHMgY2hlY2tzLiAqLworCQlpZiAodW5saWtlbHkoKHU4KilpZSA8ICh1OCopaXIgfHwgKHU4KilpZSArCisJCQkJc2l6ZW9mKElOREVYX0VOVFJZX0hFQURFUikgPiBpbmRleF9lbmQgfHwKKwkJCQkodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmtleV9sZW5ndGgpID4KKwkJCQlpbmRleF9lbmQpKQorCQkJZ290byBlcnJfb3V0OworCQkvKiBUaGUgbGFzdCBlbnRyeSBjYW5ub3QgY29udGFpbiBhIG5hbWUuICovCisJCWlmIChpZS0+ZmxhZ3MgJiBJTkRFWF9FTlRSWV9FTkQpCisJCQlicmVhazsKKwkJLyogU2tpcCBpbmRleCByb290IGVudHJ5IGlmIGNvbnRpbnVpbmcgcHJldmlvdXMgcmVhZGRpci4gKi8KKwkJaWYgKGlyX3BvcyA+ICh1OCopaWUgLSAodTgqKWlyKQorCQkJY29udGludWU7CisJCS8qIEFkdmFuY2UgdGhlIHBvc2l0aW9uIGV2ZW4gaWYgZ29pbmcgdG8gc2tpcCB0aGUgZW50cnkuICovCisJCWZwb3MgPSAodTgqKWllIC0gKHU4KilpcjsKKwkJLyogU3VibWl0IHRoZSBuYW1lIHRvIHRoZSBmaWxsZGlyIGNhbGxiYWNrLiAqLworCQlyYyA9IG50ZnNfZmlsbGRpcih2b2wsIGZwb3MsIG5kaXIsIE5VTEwsIGllLCBuYW1lLCBkaXJlbnQsCisJCQkJZmlsbGRpcik7CisJCWlmIChyYykgeworCQkJa2ZyZWUoaXIpOworCQkJZ290byBhYm9ydDsKKwkJfQorCX0KKwkvKiBXZSBhcmUgZG9uZSB3aXRoIHRoZSBpbmRleCByb290IGFuZCBjYW4gZnJlZSB0aGUgYnVmZmVyLiAqLworCWtmcmVlKGlyKTsKKwlpciA9IE5VTEw7CisJLyogSWYgdGhlcmUgaXMgbm8gaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUgd2UgYXJlIGZpbmlzaGVkLiAqLworCWlmICghTklub0luZGV4QWxsb2NQcmVzZW50KG5kaXIpKQorCQlnb3RvIEVPRDsKKwkvKiBBZHZhbmNlIGZwb3MgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5kZXggYWxsb2NhdGlvbi4gKi8KKwlmcG9zID0gdm9sLT5tZnRfcmVjb3JkX3NpemU7Citza2lwX2luZGV4X3Jvb3Q6CisJa2FkZHIgPSBOVUxMOworCXByZXZfaWFfcG9zID0gLTFMTDsKKwkvKiBHZXQgdGhlIG9mZnNldCBpbnRvIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZS4gKi8KKwlpYV9wb3MgPSAoczY0KWZwb3MgLSB2b2wtPm1mdF9yZWNvcmRfc2l6ZTsKKwlpYV9tYXBwaW5nID0gdmRpci0+aV9tYXBwaW5nOworCWJtcF92aSA9IG5kaXItPml0eXBlLmluZGV4LmJtcF9pbm87CisJaWYgKHVubGlrZWx5KCFibXBfdmkpKSB7CisJCW50ZnNfZGVidWcoIklub2RlIDB4JWx4LCByZWdldHRpbmcgaW5kZXggYml0bWFwLiIsIHZkaXItPmlfaW5vKTsKKwkJYm1wX3ZpID0gbnRmc19hdHRyX2lnZXQodmRpciwgQVRfQklUTUFQLCBJMzAsIDQpOworCQlpZiAoSVNfRVJSKGJtcF92aSkpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gZ2V0IGJpdG1hcCBhdHRyaWJ1dGUuIik7CisJCQllcnIgPSBQVFJfRVJSKGJtcF92aSk7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJbmRpci0+aXR5cGUuaW5kZXguYm1wX2lubyA9IGJtcF92aTsKKwl9CisJYm1wX21hcHBpbmcgPSBibXBfdmktPmlfbWFwcGluZzsKKwkvKiBHZXQgdGhlIHN0YXJ0aW5nIGJpdG1hcCBiaXQgcG9zaXRpb24gYW5kIHNhbml0eSBjaGVjayBpdC4gKi8KKwlibXBfcG9zID0gaWFfcG9zID4+IG5kaXItPml0eXBlLmluZGV4LmJsb2NrX3NpemVfYml0czsKKwlpZiAodW5saWtlbHkoYm1wX3BvcyA+PiAzID49IGJtcF92aS0+aV9zaXplKSkgeworCQludGZzX2Vycm9yKHNiLCAiQ3VycmVudCBpbmRleCBhbGxvY2F0aW9uIHBvc2l0aW9uIGV4Y2VlZHMgIgorCQkJCSJpbmRleCBiaXRtYXAgc2l6ZS4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBHZXQgdGhlIHN0YXJ0aW5nIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBiaXRtYXAgcGFnZS4gKi8KKwljdXJfYm1wX3BvcyA9IGJtcF9wb3MgJiAoKFBBR0VfQ0FDSEVfU0laRSAqIDgpIC0gMSk7CisJYm1wX3BvcyAmPSB+KHU2NCkoKFBBR0VfQ0FDSEVfU0laRSAqIDgpIC0gMSk7CitnZXRfbmV4dF9ibXBfcGFnZToKKwludGZzX2RlYnVnKCJSZWFkaW5nIGJpdG1hcCB3aXRoIHBhZ2UgaW5kZXggMHglbGx4LCBiaXQgb2ZzIDB4JWxseCIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWJtcF9wb3MgPj4gKDMgKyBQQUdFX0NBQ0hFX1NISUZUKSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYm1wX3BvcyAmCisJCQkodW5zaWduZWQgbG9uZyBsb25nKSgoUEFHRV9DQUNIRV9TSVpFICogOCkgLSAxKSk7CisJYm1wX3BhZ2UgPSBudGZzX21hcF9wYWdlKGJtcF9tYXBwaW5nLAorCQkJYm1wX3BvcyA+PiAoMyArIFBBR0VfQ0FDSEVfU0hJRlQpKTsKKwlpZiAoSVNfRVJSKGJtcF9wYWdlKSkgeworCQludGZzX2Vycm9yKHNiLCAiUmVhZGluZyBpbmRleCBiaXRtYXAgZmFpbGVkLiIpOworCQllcnIgPSBQVFJfRVJSKGJtcF9wYWdlKTsKKwkJYm1wX3BhZ2UgPSBOVUxMOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWJtcCA9ICh1OCopcGFnZV9hZGRyZXNzKGJtcF9wYWdlKTsKKwkvKiBGaW5kIG5leHQgaW5kZXggYmxvY2sgaW4gdXNlLiAqLworCXdoaWxlICghKGJtcFtjdXJfYm1wX3BvcyA+PiAzXSAmICgxIDw8IChjdXJfYm1wX3BvcyAmIDcpKSkpIHsKK2ZpbmRfbmV4dF9pbmRleF9idWZmZXI6CisJCWN1cl9ibXBfcG9zKys7CisJCS8qCisJCSAqIElmIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBiaXRtYXAgcGFnZSwgZ2V0IHRoZSBuZXh0CisJCSAqIHBhZ2UsIGFuZCBwdXQgYXdheSB0aGUgb2xkIG9uZS4KKwkJICovCisJCWlmICh1bmxpa2VseSgoY3VyX2JtcF9wb3MgPj4gMykgPj0gUEFHRV9DQUNIRV9TSVpFKSkgeworCQkJbnRmc191bm1hcF9wYWdlKGJtcF9wYWdlKTsKKwkJCWJtcF9wb3MgKz0gUEFHRV9DQUNIRV9TSVpFICogODsKKwkJCWN1cl9ibXBfcG9zID0gMDsKKwkJCWdvdG8gZ2V0X25leHRfYm1wX3BhZ2U7CisJCX0KKwkJLyogSWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGJpdG1hcCwgd2UgYXJlIGRvbmUuICovCisJCWlmICh1bmxpa2VseSgoKGJtcF9wb3MgKyBjdXJfYm1wX3BvcykgPj4gMykgPj0gdmRpci0+aV9zaXplKSkKKwkJCWdvdG8gdW5tX0VPRDsKKwkJaWFfcG9zID0gKGJtcF9wb3MgKyBjdXJfYm1wX3BvcykgPDwKKwkJCQluZGlyLT5pdHlwZS5pbmRleC5ibG9ja19zaXplX2JpdHM7CisJfQorCW50ZnNfZGVidWcoIkhhbmRsaW5nIGluZGV4IGJ1ZmZlciAweCVsbHguIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYm1wX3BvcyArIGN1cl9ibXBfcG9zKTsKKwkvKiBJZiB0aGUgY3VycmVudCBpbmRleCBidWZmZXIgaXMgaW4gdGhlIHNhbWUgcGFnZSB3ZSByZXVzZSB0aGUgcGFnZS4gKi8KKwlpZiAoKHByZXZfaWFfcG9zICYgUEFHRV9DQUNIRV9NQVNLKSAhPSAoaWFfcG9zICYgUEFHRV9DQUNIRV9NQVNLKSkgeworCQlwcmV2X2lhX3BvcyA9IGlhX3BvczsKKwkJaWYgKGxpa2VseShpYV9wYWdlICE9IE5VTEwpKSB7CisJCQl1bmxvY2tfcGFnZShpYV9wYWdlKTsKKwkJCW50ZnNfdW5tYXBfcGFnZShpYV9wYWdlKTsKKwkJfQorCQkvKgorCQkgKiBNYXAgdGhlIHBhZ2UgY2FjaGUgcGFnZSBjb250YWluaW5nIHRoZSBjdXJyZW50IGlhX3BvcywKKwkJICogcmVhZGluZyBpdCBmcm9tIGRpc2sgaWYgbmVjZXNzYXJ5LgorCQkgKi8KKwkJaWFfcGFnZSA9IG50ZnNfbWFwX3BhZ2UoaWFfbWFwcGluZywgaWFfcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCQlpZiAoSVNfRVJSKGlhX3BhZ2UpKSB7CisJCQludGZzX2Vycm9yKHNiLCAiUmVhZGluZyBpbmRleCBhbGxvY2F0aW9uIGRhdGEgZmFpbGVkLiIpOworCQkJZXJyID0gUFRSX0VSUihpYV9wYWdlKTsKKwkJCWlhX3BhZ2UgPSBOVUxMOworCQkJZ290byBlcnJfb3V0OworCQl9CisJCWxvY2tfcGFnZShpYV9wYWdlKTsKKwkJa2FkZHIgPSAodTgqKXBhZ2VfYWRkcmVzcyhpYV9wYWdlKTsKKwl9CisJLyogR2V0IHRoZSBjdXJyZW50IGluZGV4IGJ1ZmZlci4gKi8KKwlpYSA9IChJTkRFWF9BTExPQ0FUSU9OKikoa2FkZHIgKyAoaWFfcG9zICYgflBBR0VfQ0FDSEVfTUFTSyAmCisJCQl+KHM2NCkobmRpci0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSAtIDEpKSk7CisJLyogQm91bmRzIGNoZWNrcy4gKi8KKwlpZiAodW5saWtlbHkoKHU4KilpYSA8IGthZGRyIHx8ICh1OCopaWEgPiBrYWRkciArIFBBR0VfQ0FDSEVfU0laRSkpIHsKKwkJbnRmc19lcnJvcihzYiwgIk91dCBvZiBib3VuZHMgY2hlY2sgZmFpbGVkLiBDb3JydXB0IGRpcmVjdG9yeSAiCisJCQkJImlub2RlIDB4JWx4IG9yIGRyaXZlciBidWcuIiwgdmRpci0+aV9pbm8pOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIENhdGNoIG11bHRpIHNlY3RvciB0cmFuc2ZlciBmaXh1cCBlcnJvcnMuICovCisJaWYgKHVubGlrZWx5KCFudGZzX2lzX2luZHhfcmVjb3JkKGlhLT5tYWdpYykpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJEaXJlY3RvcnkgaW5kZXggcmVjb3JkIHdpdGggdmNuIDB4JWxseCBpcyAiCisJCQkJImNvcnJ1cHQuICBDb3JydXB0IGlub2RlIDB4JWx4LiAgUnVuIGNoa2Rzay4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaWFfcG9zID4+CisJCQkJbmRpci0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cywgdmRpci0+aV9pbm8pOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWlmICh1bmxpa2VseShzbGU2NF90b19jcHUoaWEtPmluZGV4X2Jsb2NrX3ZjbikgIT0gKGlhX3BvcyAmCisJCQl+KHM2NCkobmRpci0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSAtIDEpKSA+PgorCQkJbmRpci0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cykpIHsKKwkJbnRmc19lcnJvcihzYiwgIkFjdHVhbCBWQ04gKDB4JWxseCkgb2YgaW5kZXggYnVmZmVyIGlzICIKKwkJCQkiZGlmZmVyZW50IGZyb20gZXhwZWN0ZWQgVkNOICgweCVsbHgpLiAiCisJCQkJIkRpcmVjdG9yeSBpbm9kZSAweCVseCBpcyBjb3JydXB0IG9yIGRyaXZlciAiCisJCQkJImJ1Zy4gIiwgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQlzbGU2NF90b19jcHUoaWEtPmluZGV4X2Jsb2NrX3ZjbiksCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylpYV9wb3MgPj4KKwkJCQluZGlyLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzLCB2ZGlyLT5pX2lubyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJaWYgKHVubGlrZWx5KGxlMzJfdG9fY3B1KGlhLT5pbmRleC5hbGxvY2F0ZWRfc2l6ZSkgKyAweDE4ICE9CisJCQluZGlyLT5pdHlwZS5pbmRleC5ibG9ja19zaXplKSkgeworCQludGZzX2Vycm9yKHNiLCAiSW5kZXggYnVmZmVyIChWQ04gMHglbGx4KSBvZiBkaXJlY3RvcnkgaW5vZGUgIgorCQkJCSIweCVseCBoYXMgYSBzaXplICgldSkgZGlmZmVyaW5nIGZyb20gdGhlICIKKwkJCQkiZGlyZWN0b3J5IHNwZWNpZmllZCBzaXplICgldSkuIERpcmVjdG9yeSAiCisJCQkJImlub2RlIGlzIGNvcnJ1cHQgb3IgZHJpdmVyIGJ1Zy4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaWFfcG9zID4+CisJCQkJbmRpci0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cywgdmRpci0+aV9pbm8sCisJCQkJbGUzMl90b19jcHUoaWEtPmluZGV4LmFsbG9jYXRlZF9zaXplKSArIDB4MTgsCisJCQkJbmRpci0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJaW5kZXhfZW5kID0gKHU4KilpYSArIG5kaXItPml0eXBlLmluZGV4LmJsb2NrX3NpemU7CisJaWYgKHVubGlrZWx5KGluZGV4X2VuZCA+IGthZGRyICsgUEFHRV9DQUNIRV9TSVpFKSkgeworCQludGZzX2Vycm9yKHNiLCAiSW5kZXggYnVmZmVyIChWQ04gMHglbGx4KSBvZiBkaXJlY3RvcnkgaW5vZGUgIgorCQkJCSIweCVseCBjcm9zc2VzIHBhZ2UgYm91bmRhcnkuIEltcG9zc2libGUhICIKKwkJCQkiQ2Fubm90IGFjY2VzcyEgVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiB0aGUgIgorCQkJCSJkcml2ZXIuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylpYV9wb3MgPj4KKwkJCQluZGlyLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzLCB2ZGlyLT5pX2lubyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJaWFfc3RhcnQgPSBpYV9wb3MgJiB+KHM2NCkobmRpci0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSAtIDEpOworCWluZGV4X2VuZCA9ICh1OCopJmlhLT5pbmRleCArIGxlMzJfdG9fY3B1KGlhLT5pbmRleC5pbmRleF9sZW5ndGgpOworCWlmICh1bmxpa2VseShpbmRleF9lbmQgPiAodTgqKWlhICsgbmRpci0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSkpIHsKKwkJbnRmc19lcnJvcihzYiwgIlNpemUgb2YgaW5kZXggYnVmZmVyIChWQ04gMHglbGx4KSBvZiBkaXJlY3RvcnkgIgorCQkJCSJpbm9kZSAweCVseCBleGNlZWRzIG1heGltdW0gc2l6ZS4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaWFfcG9zID4+CisJCQkJbmRpci0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cywgdmRpci0+aV9pbm8pOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIFRoZSBmaXJzdCBpbmRleCBlbnRyeSBpbiB0aGlzIGluZGV4IGJ1ZmZlci4gKi8KKwlpZSA9IChJTkRFWF9FTlRSWSopKCh1OCopJmlhLT5pbmRleCArCisJCQlsZTMyX3RvX2NwdShpYS0+aW5kZXguZW50cmllc19vZmZzZXQpKTsKKwkvKgorCSAqIExvb3AgdW50aWwgd2UgZXhjZWVkIHZhbGlkIG1lbW9yeSAoY29ycnVwdGlvbiBjYXNlKSBvciB1bnRpbCB3ZQorCSAqIHJlYWNoIHRoZSBsYXN0IGVudHJ5IG9yIHVudGlsIGZpbGxkaXIgdGVsbHMgdXMgaXQgaGFzIGhhZCBlbm91Z2gKKwkgKiBvciBzaWduYWxzIGFuIGVycm9yIChib3RoIGNvdmVyZWQgYnkgdGhlIHJjIHRlc3QpLgorCSAqLworCWZvciAoOzsgaWUgPSAoSU5ERVhfRU5UUlkqKSgodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmxlbmd0aCkpKSB7CisJCW50ZnNfZGVidWcoIkluIGluZGV4IGFsbG9jYXRpb24sIG9mZnNldCAweCVsbHguIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWlhX3N0YXJ0ICsKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKSgodTgqKWllIC0gKHU4KilpYSkpOworCQkvKiBCb3VuZHMgY2hlY2tzLiAqLworCQlpZiAodW5saWtlbHkoKHU4KilpZSA8ICh1OCopaWEgfHwgKHU4KilpZSArCisJCQkJc2l6ZW9mKElOREVYX0VOVFJZX0hFQURFUikgPiBpbmRleF9lbmQgfHwKKwkJCQkodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmtleV9sZW5ndGgpID4KKwkJCQlpbmRleF9lbmQpKQorCQkJZ290byBlcnJfb3V0OworCQkvKiBUaGUgbGFzdCBlbnRyeSBjYW5ub3QgY29udGFpbiBhIG5hbWUuICovCisJCWlmIChpZS0+ZmxhZ3MgJiBJTkRFWF9FTlRSWV9FTkQpCisJCQlicmVhazsKKwkJLyogU2tpcCBpbmRleCBibG9jayBlbnRyeSBpZiBjb250aW51aW5nIHByZXZpb3VzIHJlYWRkaXIuICovCisJCWlmIChpYV9wb3MgLSBpYV9zdGFydCA+ICh1OCopaWUgLSAodTgqKWlhKQorCQkJY29udGludWU7CisJCS8qIEFkdmFuY2UgdGhlIHBvc2l0aW9uIGV2ZW4gaWYgZ29pbmcgdG8gc2tpcCB0aGUgZW50cnkuICovCisJCWZwb3MgPSAodTgqKWllIC0gKHU4KilpYSArCisJCQkJKHNsZTY0X3RvX2NwdShpYS0+aW5kZXhfYmxvY2tfdmNuKSA8PAorCQkJCW5kaXItPml0eXBlLmluZGV4LnZjbl9zaXplX2JpdHMpICsKKwkJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZTsKKwkJLyoKKwkJICogU3VibWl0IHRoZSBuYW1lIHRvIHRoZSBAZmlsbGRpciBjYWxsYmFjay4gIE5vdGUsCisJCSAqIG50ZnNfZmlsbGRpcigpIGRyb3BzIHRoZSBsb2NrIG9uIEBpYV9wYWdlIGJ1dCBpdCByZXRha2VzIGl0CisJCSAqIGJlZm9yZSByZXR1cm5pbmcsIHVubGVzcyBhIG5vbi16ZXJvIHZhbHVlIGlzIHJldHVybmVkIGluCisJCSAqIHdoaWNoIGNhc2UgdGhlIHBhZ2UgaXMgbGVmdCB1bmxvY2tlZC4KKwkJICovCisJCXJjID0gbnRmc19maWxsZGlyKHZvbCwgZnBvcywgbmRpciwgaWFfcGFnZSwgaWUsIG5hbWUsIGRpcmVudCwKKwkJCQlmaWxsZGlyKTsKKwkJaWYgKHJjKSB7CisJCQkvKiBAaWFfcGFnZSBpcyBhbHJlYWR5IHVubG9ja2VkIGluIHRoaXMgY2FzZS4gKi8KKwkJCW50ZnNfdW5tYXBfcGFnZShpYV9wYWdlKTsKKwkJCW50ZnNfdW5tYXBfcGFnZShibXBfcGFnZSk7CisJCQlnb3RvIGFib3J0OworCQl9CisJfQorCWdvdG8gZmluZF9uZXh0X2luZGV4X2J1ZmZlcjsKK3VubV9FT0Q6CisJaWYgKGlhX3BhZ2UpIHsKKwkJdW5sb2NrX3BhZ2UoaWFfcGFnZSk7CisJCW50ZnNfdW5tYXBfcGFnZShpYV9wYWdlKTsKKwl9CisJbnRmc191bm1hcF9wYWdlKGJtcF9wYWdlKTsKK0VPRDoKKwkvKiBXZSBhcmUgZmluaXNoZWQsIHNldCBmcG9zIHRvIEVPRC4gKi8KKwlmcG9zID0gdmRpci0+aV9zaXplICsgdm9sLT5tZnRfcmVjb3JkX3NpemU7CithYm9ydDoKKwlrZnJlZShuYW1lKTsKK2RvbmU6CisjaWZkZWYgREVCVUcKKwlpZiAoIXJjKQorCQludGZzX2RlYnVnKCJFT0QsIGZwb3MgMHglbGx4LCByZXR1cm5pbmcgMC4iLCBmcG9zKTsKKwllbHNlCisJCW50ZnNfZGVidWcoImZpbGxkaXIgcmV0dXJuZWQgJWksIGZwb3MgMHglbGx4LCByZXR1cm5pbmcgMC4iLAorCQkJCXJjLCBmcG9zKTsKKyNlbmRpZgorCWZpbHAtPmZfcG9zID0gZnBvczsKKwlyZXR1cm4gMDsKK2Vycl9vdXQ6CisJaWYgKGJtcF9wYWdlKQorCQludGZzX3VubWFwX3BhZ2UoYm1wX3BhZ2UpOworCWlmIChpYV9wYWdlKSB7CisJCXVubG9ja19wYWdlKGlhX3BhZ2UpOworCQludGZzX3VubWFwX3BhZ2UoaWFfcGFnZSk7CisJfQorCWlmIChpcikKKwkJa2ZyZWUoaXIpOworCWlmIChuYW1lKQorCQlrZnJlZShuYW1lKTsKKwlpZiAoY3R4KQorCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwlpZiAobSkKKwkJdW5tYXBfbWZ0X3JlY29yZChuZGlyKTsKKwlpZiAoIWVycikKKwkJZXJyID0gLUVJTzsKKwludGZzX2RlYnVnKCJGYWlsZWQuIFJldHVybmluZyBlcnJvciBjb2RlICVpLiIsIC1lcnIpOworCWZpbHAtPmZfcG9zID0gZnBvczsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIG50ZnNfZGlyX29wZW4gLSBjYWxsZWQgd2hlbiBhbiBpbm9kZSBpcyBhYm91dCB0byBiZSBvcGVuZWQKKyAqIEB2aToJCWlub2RlIHRvIGJlIG9wZW5lZAorICogQGZpbHA6CWZpbGUgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIGlub2RlCisgKgorICogTGltaXQgZGlyZWN0b3J5IHNpemUgdG8gdGhlIHBhZ2UgY2FjaGUgbGltaXQgb24gYXJjaGl0ZWN0dXJlcyB3aGVyZSB1bnNpZ25lZAorICogbG9uZyBpcyAzMi1iaXRzLiBUaGlzIGlzIHRoZSBtb3N0IHdlIGNhbiBkbyBmb3Igbm93IHdpdGhvdXQgb3ZlcmZsb3dpbmcgdGhlCisgKiBwYWdlIGNhY2hlIHBhZ2UgaW5kZXguIERvaW5nIGl0IHRoaXMgd2F5IG1lYW5zIHdlIGRvbid0IHJ1biBpbnRvIHByb2JsZW1zCisgKiBiZWNhdXNlIG9mIGV4aXN0aW5nIHRvbyBsYXJnZSBkaXJlY3Rvcmllcy4gSXQgd291bGQgYmUgYmV0dGVyIHRvIGFsbG93IHRoZQorICogdXNlciB0byByZWFkIHRoZSBhY2Nlc3NpYmxlIHBhcnQgb2YgdGhlIGRpcmVjdG9yeSBidXQgSSBkb3VidCB2ZXJ5IG11Y2gKKyAqIGFueW9uZSBpcyBnb2luZyB0byBoaXQgdGhpcyBjaGVjayBvbiBhIDMyLWJpdCBhcmNoaXRlY3R1cmUsIHNvIHRoZXJlIGlzIG5vCisgKiBwb2ludCBpbiBhZGRpbmcgdGhlIGV4dHJhIGNvbXBsZXhpdHkgcmVxdWlyZWQgdG8gc3VwcG9ydCB0aGlzLgorICoKKyAqIE9uIDY0LWJpdCBhcmNoaXRlY3R1cmVzLCB0aGUgY2hlY2sgaXMgaG9wZWZ1bGx5IG9wdGltaXplZCBhd2F5IGJ5IHRoZQorICogY29tcGlsZXIuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKnZpLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpZiAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIDwgOCkgeworCQlpZiAodmktPmlfc2l6ZSA+IE1BWF9MRlNfRklMRVNJWkUpCisJCQlyZXR1cm4gLUVGQklHOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIE5URlNfUlcKKworLyoqCisgKiBudGZzX2Rpcl9mc3luYyAtIHN5bmMgYSBkaXJlY3RvcnkgdG8gZGlzaworICogQGZpbHA6CWRpcmVjdG9yeSB0byBiZSBzeW5jZWQKKyAqIEBkZW50cnk6CWRlbnRyeSBkZXNjcmliaW5nIHRoZSBkaXJlY3RvcnkgdG8gc3luYworICogQGRhdGFzeW5jOglpZiBub24temVybyBvbmx5IGZsdXNoIHVzZXIgZGF0YSBhbmQgbm90IG1ldGFkYXRhCisgKgorICogRGF0YSBpbnRlZ3JpdHkgc3luYyBvZiBhIGRpcmVjdG9yeSB0byBkaXNrLiAgVXNlZCBmb3IgZnN5bmMsIGZkYXRhc3luYywgYW5kCisgKiBtc3luYyBzeXN0ZW0gY2FsbHMuICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2VkIG9uIGZpbGUuYzo6bnRmc19maWxlX2ZzeW5jKCkuCisgKgorICogV3JpdGUgdGhlIG1mdCByZWNvcmQgYW5kIGFsbCBhc3NvY2lhdGVkIGV4dGVudCBtZnQgcmVjb3JkcyBhcyB3ZWxsIGFzIHRoZQorICogJElOREVYX0FMTE9DQVRJT04gYW5kICRCSVRNQVAgYXR0cmlidXRlcyBhbmQgdGhlbiBzeW5jIHRoZSBibG9jayBkZXZpY2UuCisgKgorICogSWYgQGRhdGFzeW5jIGlzIHRydWUsIHdlIGRvIG5vdCB3YWl0IG9uIHRoZSBpbm9kZShzKSB0byBiZSB3cml0dGVuIG91dAorICogYnV0IHdlIGFsd2F5cyB3YWl0IG9uIHRoZSBwYWdlIGNhY2hlIHBhZ2VzIHRvIGJlIHdyaXR0ZW4gb3V0LgorICoKKyAqIE5vdGU6IEluIHRoZSBwYXN0IEBmaWxwIGNvdWxkIGJlIE5VTEwgc28gd2UgaWdub3JlIGl0IGFzIHdlIGRvbid0IG5lZWQgaXQKKyAqIGFueXdheS4KKyAqCisgKiBMb2NraW5nOiBDYWxsZXIgbXVzdCBob2xkIGlfc2VtIG9uIHRoZSBpbm9kZS4KKyAqCisgKiBUT0RPOiBXZSBzaG91bGQgcHJvYmFibHkgYWxzbyB3cml0ZSBhbGwgYXR0cmlidXRlL2luZGV4IGlub2RlcyBhc3NvY2lhdGVkCisgKiB3aXRoIHRoaXMgaW5vZGUgYnV0IHNpbmNlIHdlIGhhdmUgbm8gc2ltcGxlIHdheSBvZiBnZXR0aW5nIHRvIHRoZW0gd2UgaWdub3JlCisgKiB0aGlzIHByb2JsZW0gZm9yIG5vdy4gIFdlIGRvIHdyaXRlIHRoZSAkQklUTUFQIGF0dHJpYnV0ZSBpZiBpdCBpcyBwcmVzZW50CisgKiB3aGljaCBpcyB0aGUgaW1wb3J0YW50IG9uZSBmb3IgYSBkaXJlY3Rvcnkgc28gdGhpbmdzIGFyZSBub3QgdG9vIGJhZC4KKyAqLworc3RhdGljIGludCBudGZzX2Rpcl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQlpbnQgZGF0YXN5bmMpCit7CisJc3RydWN0IGlub2RlICp2aSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwludGZzX2lub2RlICpuaSA9IE5URlNfSSh2aSk7CisJaW50IGVyciwgcmV0OworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LiIsIHZpLT5pX2lubyk7CisJQlVHX09OKCFTX0lTRElSKHZpLT5pX21vZGUpKTsKKwlpZiAoTklub0luZGV4QWxsb2NQcmVzZW50KG5pKSAmJiBuaS0+aXR5cGUuaW5kZXguYm1wX2lubykKKwkJd3JpdGVfaW5vZGVfbm93KG5pLT5pdHlwZS5pbmRleC5ibXBfaW5vLCAhZGF0YXN5bmMpOworCXJldCA9IG50ZnNfd3JpdGVfaW5vZGUodmksIDEpOworCXdyaXRlX2lub2RlX25vdyh2aSwgIWRhdGFzeW5jKTsKKwllcnIgPSBzeW5jX2Jsb2NrZGV2KHZpLT5pX3NiLT5zX2JkZXYpOworCWlmICh1bmxpa2VseShlcnIgJiYgIXJldCkpCisJCXJldCA9IGVycjsKKwlpZiAobGlrZWx5KCFyZXQpKQorCQludGZzX2RlYnVnKCJEb25lLiIpOworCWVsc2UKKwkJbnRmc193YXJuaW5nKHZpLT5pX3NiLCAiRmFpbGVkIHRvIGYlc3N5bmMgaW5vZGUgMHglbHguICBFcnJvciAiCisJCQkJIiV1LiIsIGRhdGFzeW5jID8gImRhdGEiIDogIiIsIHZpLT5pX2lubywgLXJldCk7CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBudGZzX2Rpcl9vcHMgPSB7CisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAkvKiBTZWVrIGluc2lkZSBkaXJlY3RvcnkuICovCisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwJLyogUmV0dXJuIC1FSVNESVIuICovCisJLnJlYWRkaXIJPSBudGZzX3JlYWRkaXIsCQkvKiBSZWFkIGRpcmVjdG9yeSBjb250ZW50cy4gKi8KKyNpZmRlZiBOVEZTX1JXCisJLmZzeW5jCQk9IG50ZnNfZGlyX2ZzeW5jLAkvKiBTeW5jIGEgZGlyZWN0b3J5IHRvIGRpc2suICovCisJLyouYWlvX2ZzeW5jCT0gLCovCQkJLyogU3luYyBhbGwgb3V0c3RhbmRpbmcgYXN5bmMKKwkJCQkJCSAgIGkvbyBvcGVyYXRpb25zIG9uIGEga2lvY2IuICovCisjZW5kaWYgLyogTlRGU19SVyAqLworCS8qLmlvY3RsCT0gLCovCQkJLyogUGVyZm9ybSBmdW5jdGlvbiBvbiB0aGUKKwkJCQkJCSAgIG1vdW50ZWQgZmlsZXN5c3RlbS4gKi8KKwkub3BlbgkJPSBudGZzX2Rpcl9vcGVuLAkvKiBPcGVuIGRpcmVjdG9yeS4gKi8KK307CmRpZmYgLS1naXQgYS9mcy9udGZzL2Rpci5oIGIvZnMvbnRmcy9kaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWE3NTgyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9kaXIuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogZGlyLmggLSBEZWZpbmVzIGZvciBkaXJlY3RvcnkgaGFuZGxpbmcgaW4gTlRGUyBMaW51eCBrZXJuZWwgZHJpdmVyLiBQYXJ0IG9mCisgKgkgICB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfRElSX0gKKyNkZWZpbmUgX0xJTlVYX05URlNfRElSX0gKKworI2luY2x1ZGUgImxheW91dC5oIgorI2luY2x1ZGUgImlub2RlLmgiCisjaW5jbHVkZSAidHlwZXMuaCIKKworLyoKKyAqIG50ZnNfbmFtZSBpcyB1c2VkIHRvIHJldHVybiB0aGUgZmlsZSBuYW1lIHRvIHRoZSBjYWxsZXIgb2YKKyAqIG50ZnNfbG9va3VwX2lub2RlX2J5X25hbWUoKSBpbiBvcmRlciBmb3IgdGhlIGNhbGxlciAobmFtZWkuYzo6bnRmc19sb29rdXAoKSkKKyAqIHRvIGJlIGFibGUgdG8gZGVhbCB3aXRoIGRjYWNoZSBhbGlhc2luZyBpc3N1ZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlNRlRfUkVGIG1yZWY7CisJRklMRV9OQU1FX1RZUEVfRkxBR1MgdHlwZTsKKwl1OCBsZW47CisJbnRmc2NoYXIgbmFtZVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBudGZzX25hbWU7CisKKy8qIFRoZSBsaXR0bGUgZW5kaWFuIFVuaWNvZGUgc3RyaW5nICRJMzAgYXMgYSBnbG9iYWwgY29uc3RhbnQuICovCitleHRlcm4gbnRmc2NoYXIgSTMwWzVdOworCitleHRlcm4gTUZUX1JFRiBudGZzX2xvb2t1cF9pbm9kZV9ieV9uYW1lKG50ZnNfaW5vZGUgKmRpcl9uaSwKKwkJY29uc3QgbnRmc2NoYXIgKnVuYW1lLCBjb25zdCBpbnQgdW5hbWVfbGVuLCBudGZzX25hbWUgKipyZXMpOworCisjZW5kaWYgLyogX0xJTlVYX05URlNfRlNfRElSX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvZW5kaWFuLmggYi9mcy9udGZzL2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyN2I1YmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2VuZGlhbi5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBlbmRpYW4uaCAtIERlZmluZXMgZm9yIGVuZGlhbm5lc3MgaGFuZGxpbmcgaW4gTlRGUyBMaW51eCBrZXJuZWwgZHJpdmVyLgorICoJICAgICAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfRU5ESUFOX0gKKyNkZWZpbmUgX0xJTlVYX05URlNfRU5ESUFOX0gKKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlICJ0eXBlcy5oIgorCisvKgorICogU2lnbmVkIGVuZGlhbm5lc3MgY29udmVyc2lvbiBmdW5jdGlvbnMuCisgKi8KKworc3RhdGljIGlubGluZSBzMTYgc2xlMTZfdG9fY3B1KHNsZTE2IHgpCit7CisJcmV0dXJuIGxlMTZfdG9fY3B1KChfX2ZvcmNlIGxlMTYpeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgczMyIHNsZTMyX3RvX2NwdShzbGUzMiB4KQoreworCXJldHVybiBsZTMyX3RvX2NwdSgoX19mb3JjZSBsZTMyKXgpOworfQorCitzdGF0aWMgaW5saW5lIHM2NCBzbGU2NF90b19jcHUoc2xlNjQgeCkKK3sKKwlyZXR1cm4gbGU2NF90b19jcHUoKF9fZm9yY2UgbGU2NCl4KTsKK30KKworc3RhdGljIGlubGluZSBzMTYgc2xlMTZfdG9fY3B1cChzbGUxNiAqeCkKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUoKihfX2ZvcmNlIGxlMTYqKXgpOworfQorCitzdGF0aWMgaW5saW5lIHMzMiBzbGUzMl90b19jcHVwKHNsZTMyICp4KQoreworCXJldHVybiBsZTMyX3RvX2NwdSgqKF9fZm9yY2UgbGUzMiopeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgczY0IHNsZTY0X3RvX2NwdXAoc2xlNjQgKngpCit7CisJcmV0dXJuIGxlNjRfdG9fY3B1KCooX19mb3JjZSBsZTY0Kil4KTsKK30KKworc3RhdGljIGlubGluZSBzbGUxNiBjcHVfdG9fc2xlMTYoczE2IHgpCit7CisJcmV0dXJuIChfX2ZvcmNlIHNsZTE2KWNwdV90b19sZTE2KHgpOworfQorCitzdGF0aWMgaW5saW5lIHNsZTMyIGNwdV90b19zbGUzMihzMzIgeCkKK3sKKwlyZXR1cm4gKF9fZm9yY2Ugc2xlMzIpY3B1X3RvX2xlMzIoeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2xlNjQgY3B1X3RvX3NsZTY0KHM2NCB4KQoreworCXJldHVybiAoX19mb3JjZSBzbGU2NCljcHVfdG9fbGU2NCh4KTsKK30KKworc3RhdGljIGlubGluZSBzbGUxNiBjcHVfdG9fc2xlMTZwKHMxNiAqeCkKK3sKKwlyZXR1cm4gKF9fZm9yY2Ugc2xlMTYpY3B1X3RvX2xlMTYoKngpOworfQorCitzdGF0aWMgaW5saW5lIHNsZTMyIGNwdV90b19zbGUzMnAoczMyICp4KQoreworCXJldHVybiAoX19mb3JjZSBzbGUzMiljcHVfdG9fbGUzMigqeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2xlNjQgY3B1X3RvX3NsZTY0cChzNjQgKngpCit7CisJcmV0dXJuIChfX2ZvcmNlIHNsZTY0KWNwdV90b19sZTY0KCp4KTsKK30KKworI2VuZGlmIC8qIF9MSU5VWF9OVEZTX0VORElBTl9IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2ZpbGUuYyBiL2ZzL250ZnMvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiODcxM2UKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2ZpbGUuYwpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIGZpbGUuYyAtIE5URlMga2VybmVsIGZpbGUgb3BlcmF0aW9ucy4gUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworI2luY2x1ZGUgImlub2RlLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJudGZzLmgiCisKKy8qKgorICogbnRmc19maWxlX29wZW4gLSBjYWxsZWQgd2hlbiBhbiBpbm9kZSBpcyBhYm91dCB0byBiZSBvcGVuZWQKKyAqIEB2aToJCWlub2RlIHRvIGJlIG9wZW5lZAorICogQGZpbHA6CWZpbGUgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIGlub2RlCisgKgorICogTGltaXQgZmlsZSBzaXplIHRvIHRoZSBwYWdlIGNhY2hlIGxpbWl0IG9uIGFyY2hpdGVjdHVyZXMgd2hlcmUgdW5zaWduZWQgbG9uZworICogaXMgMzItYml0cy4gVGhpcyBpcyB0aGUgbW9zdCB3ZSBjYW4gZG8gZm9yIG5vdyB3aXRob3V0IG92ZXJmbG93aW5nIHRoZSBwYWdlCisgKiBjYWNoZSBwYWdlIGluZGV4LiBEb2luZyBpdCB0aGlzIHdheSBtZWFucyB3ZSBkb24ndCBydW4gaW50byBwcm9ibGVtcyBiZWNhdXNlCisgKiBvZiBleGlzdGluZyB0b28gbGFyZ2UgZmlsZXMuIEl0IHdvdWxkIGJlIGJldHRlciB0byBhbGxvdyB0aGUgdXNlciB0byByZWFkCisgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIGJ1dCBJIGRvdWJ0IHZlcnkgbXVjaCBhbnlvbmUgaXMgZ29pbmcgdG8gaGl0IHRoaXMKKyAqIGNoZWNrIG9uIGEgMzItYml0IGFyY2hpdGVjdHVyZSwgc28gdGhlcmUgaXMgbm8gcG9pbnQgaW4gYWRkaW5nIHRoZSBleHRyYQorICogY29tcGxleGl0eSByZXF1aXJlZCB0byBzdXBwb3J0IHRoaXMuCisgKgorICogT24gNjQtYml0IGFyY2hpdGVjdHVyZXMsIHRoZSBjaGVjayBpcyBob3BlZnVsbHkgb3B0aW1pemVkIGF3YXkgYnkgdGhlCisgKiBjb21waWxlci4KKyAqCisgKiBBZnRlciB0aGUgY2hlY2sgcGFzc2VzLCBqdXN0IGNhbGwgZ2VuZXJpY19maWxlX29wZW4oKSB0byBkbyBpdHMgd29yay4KKyAqLworc3RhdGljIGludCBudGZzX2ZpbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKnZpLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpZiAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIDwgOCkgeworCQlpZiAodmktPmlfc2l6ZSA+IE1BWF9MRlNfRklMRVNJWkUpCisJCQlyZXR1cm4gLUVGQklHOworCX0KKwlyZXR1cm4gZ2VuZXJpY19maWxlX29wZW4odmksIGZpbHApOworfQorCisjaWZkZWYgTlRGU19SVworCisvKioKKyAqIG50ZnNfZmlsZV9mc3luYyAtIHN5bmMgYSBmaWxlIHRvIGRpc2sKKyAqIEBmaWxwOglmaWxlIHRvIGJlIHN5bmNlZAorICogQGRlbnRyeToJZGVudHJ5IGRlc2NyaWJpbmcgdGhlIGZpbGUgdG8gc3luYworICogQGRhdGFzeW5jOglpZiBub24temVybyBvbmx5IGZsdXNoIHVzZXIgZGF0YSBhbmQgbm90IG1ldGFkYXRhCisgKgorICogRGF0YSBpbnRlZ3JpdHkgc3luYyBvZiBhIGZpbGUgdG8gZGlzay4gIFVzZWQgZm9yIGZzeW5jLCBmZGF0YXN5bmMsIGFuZCBtc3luYworICogc3lzdGVtIGNhbGxzLiAgVGhpcyBmdW5jdGlvbiBpcyBpbnNwaXJlZCBieSBmcy9idWZmZXIuYzo6ZmlsZV9mc3luYygpLgorICoKKyAqIElmIEBkYXRhc3luYyBpcyBmYWxzZSwgd3JpdGUgdGhlIG1mdCByZWNvcmQgYW5kIGFsbCBhc3NvY2lhdGVkIGV4dGVudCBtZnQKKyAqIHJlY29yZHMgYXMgd2VsbCBhcyB0aGUgJERBVEEgYXR0cmlidXRlIGFuZCB0aGVuIHN5bmMgdGhlIGJsb2NrIGRldmljZS4KKyAqCisgKiBJZiBAZGF0YXN5bmMgaXMgdHJ1ZSBhbmQgdGhlIGF0dHJpYnV0ZSBpcyBub24tcmVzaWRlbnQsIHdlIHNraXAgdGhlIHdyaXRpbmcKKyAqIG9mIHRoZSBtZnQgcmVjb3JkIGFuZCBhbGwgYXNzb2NpYXRlZCBleHRlbnQgbWZ0IHJlY29yZHMgKHRoaXMgbWlnaHQgc3RpbGwKKyAqIGhhcHBlbiBkdWUgdG8gdGhlIHdyaXRlX2lub2RlX25vdygpIGNhbGwpLgorICoKKyAqIEFsc28sIGlmIEBkYXRhc3luYyBpcyB0cnVlLCB3ZSBkbyBub3Qgd2FpdCBvbiB0aGUgaW5vZGUgdG8gYmUgd3JpdHRlbiBvdXQKKyAqIGJ1dCB3ZSBhbHdheXMgd2FpdCBvbiB0aGUgcGFnZSBjYWNoZSBwYWdlcyB0byBiZSB3cml0dGVuIG91dC4KKyAqCisgKiBOb3RlOiBJbiB0aGUgcGFzdCBAZmlscCBjb3VsZCBiZSBOVUxMIHNvIHdlIGlnbm9yZSBpdCBhcyB3ZSBkb24ndCBuZWVkIGl0CisgKiBhbnl3YXkuCisgKgorICogTG9ja2luZzogQ2FsbGVyIG11c3QgaG9sZCBpX3NlbSBvbiB0aGUgaW5vZGUuCisgKgorICogVE9ETzogV2Ugc2hvdWxkIHByb2JhYmx5IGFsc28gd3JpdGUgYWxsIGF0dHJpYnV0ZS9pbmRleCBpbm9kZXMgYXNzb2NpYXRlZAorICogd2l0aCB0aGlzIGlub2RlIGJ1dCBzaW5jZSB3ZSBoYXZlIG5vIHNpbXBsZSB3YXkgb2YgZ2V0dGluZyB0byB0aGVtIHdlIGlnbm9yZQorICogdGhpcyBwcm9ibGVtIGZvciBub3cuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19maWxlX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCWludCBkYXRhc3luYykKK3sKKwlzdHJ1Y3QgaW5vZGUgKnZpID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnIsIHJldCA9IDA7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaW5vZGUgMHglbHguIiwgdmktPmlfaW5vKTsKKwlCVUdfT04oU19JU0RJUih2aS0+aV9tb2RlKSk7CisJaWYgKCFkYXRhc3luYyB8fCAhTklub05vblJlc2lkZW50KE5URlNfSSh2aSkpKQorCQlyZXQgPSBudGZzX3dyaXRlX2lub2RlKHZpLCAxKTsKKwl3cml0ZV9pbm9kZV9ub3codmksICFkYXRhc3luYyk7CisJZXJyID0gc3luY19ibG9ja2Rldih2aS0+aV9zYi0+c19iZGV2KTsKKwlpZiAodW5saWtlbHkoZXJyICYmICFyZXQpKQorCQlyZXQgPSBlcnI7CisJaWYgKGxpa2VseSghcmV0KSkKKwkJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwllbHNlCisJCW50ZnNfd2FybmluZyh2aS0+aV9zYiwgIkZhaWxlZCB0byBmJXNzeW5jIGlub2RlIDB4JWx4LiAgRXJyb3IgIgorCQkJCSIldS4iLCBkYXRhc3luYyA/ICJkYXRhIiA6ICIiLCB2aS0+aV9pbm8sIC1yZXQpOworCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgbnRmc19maWxlX29wcyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCSAgLyogU2VlayBpbnNpZGUgZmlsZS4gKi8KKwkucmVhZAkJPSBnZW5lcmljX2ZpbGVfcmVhZCwJICAvKiBSZWFkIGZyb20gZmlsZS4gKi8KKwkuYWlvX3JlYWQJPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsICAvKiBBc3luYyByZWFkIGZyb20gZmlsZS4gKi8KKwkucmVhZHYJCT0gZ2VuZXJpY19maWxlX3JlYWR2LAkgIC8qIFJlYWQgZnJvbSBmaWxlLiAqLworI2lmZGVmIE5URlNfUlcKKwkud3JpdGUJCT0gZ2VuZXJpY19maWxlX3dyaXRlLAkgIC8qIFdyaXRlIHRvIGZpbGUuICovCisJLmFpb193cml0ZQk9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUsIC8qIEFzeW5jIHdyaXRlIHRvIGZpbGUuICovCisJLndyaXRldgkJPSBnZW5lcmljX2ZpbGVfd3JpdGV2LAkgIC8qIFdyaXRlIHRvIGZpbGUuICovCisJLyoucmVsZWFzZQk9ICwqLwkJCSAgLyogTGFzdCBmaWxlIGlzIGNsb3NlZC4gIFNlZQorCQkJCQkJICAgICBmcy9leHQyL2ZpbGUuYzo6CisJCQkJCQkgICAgIGV4dDJfcmVsZWFzZV9maWxlKCkgZm9yCisJCQkJCQkgICAgIGhvdyB0byB1c2UgdGhpcyB0byBkaXNjYXJkCisJCQkJCQkgICAgIHByZWFsbG9jYXRlZCBzcGFjZSBmb3IKKwkJCQkJCSAgICAgd3JpdGUgb3BlbmVkIGZpbGVzLiAqLworCS5mc3luYwkJPSBudGZzX2ZpbGVfZnN5bmMsCSAgLyogU3luYyBhIGZpbGUgdG8gZGlzay4gKi8KKwkvKi5haW9fZnN5bmMJPSAsKi8JCQkgIC8qIFN5bmMgYWxsIG91dHN0YW5kaW5nIGFzeW5jCisJCQkJCQkgICAgIGkvbyBvcGVyYXRpb25zIG9uIGEKKwkJCQkJCSAgICAga2lvY2IuICovCisjZW5kaWYgLyogTlRGU19SVyAqLworCS8qLmlvY3RsCT0gLCovCQkJICAvKiBQZXJmb3JtIGZ1bmN0aW9uIG9uIHRoZQorCQkJCQkJICAgICBtb3VudGVkIGZpbGVzeXN0ZW0uICovCisJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCSAgLyogTW1hcCBmaWxlLiAqLworCS5vcGVuCQk9IG50ZnNfZmlsZV9vcGVuLAkgIC8qIE9wZW4gZmlsZS4gKi8KKwkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsICAvKiBaZXJvLWNvcHkgZGF0YSBzZW5kIHdpdGgKKwkJCQkJCSAgICAgdGhlIGRhdGEgc291cmNlIGJlaW5nIG9uCisJCQkJCQkgICAgIHRoZSBudGZzIHBhcnRpdGlvbi4gIFdlCisJCQkJCQkgICAgIGRvIG5vdCBuZWVkIHRvIGNhcmUgYWJvdXQKKwkJCQkJCSAgICAgdGhlIGRhdGEgZGVzdGluYXRpb24uICovCisJLyouc2VuZHBhZ2UJPSAsKi8JCQkgIC8qIFplcm8tY29weSBkYXRhIHNlbmQgd2l0aAorCQkJCQkJICAgICB0aGUgZGF0YSBkZXN0aW5hdGlvbiBiZWluZworCQkJCQkJICAgICBvbiB0aGUgbnRmcyBwYXJ0aXRpb24uICBXZQorCQkJCQkJICAgICBkbyBub3QgbmVlZCB0byBjYXJlIGFib3V0CisJCQkJCQkgICAgIHRoZSBkYXRhIHNvdXJjZS4gKi8KK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG50ZnNfZmlsZV9pbm9kZV9vcHMgPSB7CisjaWZkZWYgTlRGU19SVworCS50cnVuY2F0ZQk9IG50ZnNfdHJ1bmNhdGVfdmZzLAorCS5zZXRhdHRyCT0gbnRmc19zZXRhdHRyLAorI2VuZGlmIC8qIE5URlNfUlcgKi8KK307CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgbnRmc19lbXB0eV9maWxlX29wcyA9IHt9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBudGZzX2VtcHR5X2lub2RlX29wcyA9IHt9OwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9pbmRleC5jIGIvZnMvbnRmcy9pbmRleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYmQyY2QKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2luZGV4LmMKQEAgLTAsMCArMSw0NjEgQEAKKy8qCisgKiBpbmRleC5jIC0gTlRGUyBrZXJuZWwgaW5kZXggaGFuZGxpbmcuICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlICJhb3BzLmgiCisjaW5jbHVkZSAiY29sbGF0ZS5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiaW5kZXguaCIKKyNpbmNsdWRlICJudGZzLmgiCisKKy8qKgorICogbnRmc19pbmRleF9jdHhfZ2V0IC0gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgaW5kZXggY29udGV4dAorICogQGlkeF9uaToJbnRmcyBpbmRleCBpbm9kZSB3aXRoIHdoaWNoIHRvIGluaXRpYWxpemUgdGhlIGNvbnRleHQKKyAqCisgKiBBbGxvY2F0ZSBhIG5ldyBpbmRleCBjb250ZXh0LCBpbml0aWFsaXplIGl0IHdpdGggQGlkeF9uaSBhbmQgcmV0dXJuIGl0LgorICogUmV0dXJuIE5VTEwgaWYgYWxsb2NhdGlvbiBmYWlsZWQuCisgKgorICogTG9ja2luZzogIENhbGxlciBtdXN0IGhvbGQgaV9zZW0gb24gdGhlIGluZGV4IGlub2RlLgorICovCitudGZzX2luZGV4X2NvbnRleHQgKm50ZnNfaW5kZXhfY3R4X2dldChudGZzX2lub2RlICppZHhfbmkpCit7CisJbnRmc19pbmRleF9jb250ZXh0ICppY3R4OworCisJaWN0eCA9IGttZW1fY2FjaGVfYWxsb2MobnRmc19pbmRleF9jdHhfY2FjaGUsIFNMQUJfTk9GUyk7CisJaWYgKGljdHgpIHsKKwkJaWN0eC0+aWR4X25pID0gaWR4X25pOworCQlpY3R4LT5lbnRyeSA9IE5VTEw7CisJCWljdHgtPmRhdGEgPSBOVUxMOworCQlpY3R4LT5kYXRhX2xlbiA9IDA7CisJCWljdHgtPmlzX2luX3Jvb3QgPSAwOworCQlpY3R4LT5pciA9IE5VTEw7CisJCWljdHgtPmFjdHggPSBOVUxMOworCQlpY3R4LT5iYXNlX25pID0gTlVMTDsKKwkJaWN0eC0+aWEgPSBOVUxMOworCQlpY3R4LT5wYWdlID0gTlVMTDsKKwl9CisJcmV0dXJuIGljdHg7Cit9CisKKy8qKgorICogbnRmc19pbmRleF9jdHhfcHV0IC0gcmVsZWFzZSBhbiBpbmRleCBjb250ZXh0CisgKiBAaWN0eDoJaW5kZXggY29udGV4dCB0byBmcmVlCisgKgorICogUmVsZWFzZSB0aGUgaW5kZXggY29udGV4dCBAaWN0eCwgcmVsZWFzaW5nIGFsbCBhc3NvY2lhdGVkIHJlc291cmNlcy4KKyAqCisgKiBMb2NraW5nOiAgQ2FsbGVyIG11c3QgaG9sZCBpX3NlbSBvbiB0aGUgaW5kZXggaW5vZGUuCisgKi8KK3ZvaWQgbnRmc19pbmRleF9jdHhfcHV0KG50ZnNfaW5kZXhfY29udGV4dCAqaWN0eCkKK3sKKwlpZiAoaWN0eC0+ZW50cnkpIHsKKwkJaWYgKGljdHgtPmlzX2luX3Jvb3QpIHsKKwkJCWlmIChpY3R4LT5hY3R4KQorCQkJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChpY3R4LT5hY3R4KTsKKwkJCWlmIChpY3R4LT5iYXNlX25pKQorCQkJCXVubWFwX21mdF9yZWNvcmQoaWN0eC0+YmFzZV9uaSk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGljdHgtPnBhZ2U7CisJCQlpZiAocGFnZSkgeworCQkJCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQkJfQorCQl9CisJfQorCWttZW1fY2FjaGVfZnJlZShudGZzX2luZGV4X2N0eF9jYWNoZSwgaWN0eCk7CisJcmV0dXJuOworfQorCisvKioKKyAqIG50ZnNfaW5kZXhfbG9va3VwIC0gZmluZCBhIGtleSBpbiBhbiBpbmRleCBhbmQgcmV0dXJuIGl0cyBpbmRleCBlbnRyeQorICogQGtleToJW0lOXSBrZXkgZm9yIHdoaWNoIHRvIHNlYXJjaCBpbiB0aGUgaW5kZXgKKyAqIEBrZXlfbGVuOglbSU5dIGxlbmd0aCBvZiBAa2V5IGluIGJ5dGVzCisgKiBAaWN0eDoJW0lOL09VVF0gY29udGV4dCBkZXNjcmliaW5nIHRoZSBpbmRleCBhbmQgdGhlIHJldHVybmVkIGVudHJ5CisgKgorICogQmVmb3JlIGNhbGxpbmcgbnRmc19pbmRleF9sb29rdXAoKSwgQGljdHggbXVzdCBoYXZlIGJlZW4gb2J0YWluZWQgZnJvbSBhCisgKiBjYWxsIHRvIG50ZnNfaW5kZXhfY3R4X2dldCgpLgorICoKKyAqIExvb2sgZm9yIHRoZSBAa2V5IGluIHRoZSBpbmRleCBzcGVjaWZpZWQgYnkgdGhlIGluZGV4IGxvb2t1cCBjb250ZXh0IEBpY3R4LgorICogbnRmc19pbmRleF9sb29rdXAoKSB3YWxrcyB0aGUgY29udGVudHMgb2YgdGhlIGluZGV4IGxvb2tpbmcgZm9yIHRoZSBAa2V5LgorICoKKyAqIElmIHRoZSBAa2V5IGlzIGZvdW5kIGluIHRoZSBpbmRleCwgMCBpcyByZXR1cm5lZCBhbmQgQGljdHggaXMgc2V0dXAgdG8KKyAqIGRlc2NyaWJlIHRoZSBpbmRleCBlbnRyeSBjb250YWluaW5nIHRoZSBtYXRjaGluZyBAa2V5LiAgQGljdHgtPmVudHJ5IGlzIHRoZQorICogaW5kZXggZW50cnkgYW5kIEBpY3R4LT5kYXRhIGFuZCBAaWN0eC0+ZGF0YV9sZW4gYXJlIHRoZSBpbmRleCBlbnRyeSBkYXRhIGFuZAorICogaXRzIGxlbmd0aCBpbiBieXRlcywgcmVzcGVjdGl2ZWx5LgorICoKKyAqIElmIHRoZSBAa2V5IGlzIG5vdCBmb3VuZCBpbiB0aGUgaW5kZXgsIC1FTk9FTlQgaXMgcmV0dXJuZWQgYW5kIEBpY3R4IGlzCisgKiBzZXR1cCB0byBkZXNjcmliZSB0aGUgaW5kZXggZW50cnkgd2hvc2Uga2V5IGNvbGxhdGVzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZQorICogc2VhcmNoIEBrZXksIGkuZS4gdGhpcyBpcyB0aGUgcG9zaXRpb24gaW4gdGhlIGluZGV4IGF0IHdoaWNoIGFuIGluZGV4IGVudHJ5CisgKiB3aXRoIGEga2V5IG9mIEBrZXkgd291bGQgbmVlZCB0byBiZSBpbnNlcnRlZC4KKyAqCisgKiBJZiBhbiBlcnJvciBvY2N1cnMgcmV0dXJuIHRoZSBuZWdhdGl2ZSBlcnJvciBjb2RlIGFuZCBAaWN0eCBpcyBsZWZ0CisgKiB1bnRvdWNoZWQuCisgKgorICogV2hlbiBmaW5pc2hlZCB3aXRoIHRoZSBlbnRyeSBhbmQgaXRzIGRhdGEsIGNhbGwgbnRmc19pbmRleF9jdHhfcHV0KCkgdG8gZnJlZQorICogdGhlIGNvbnRleHQgYW5kIG90aGVyIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgorICoKKyAqIElmIHRoZSBpbmRleCBlbnRyeSB3YXMgbW9kaWZpZWQsIGNhbGwgZmx1c2hfZGNhY2hlX2luZGV4X2VudHJ5X3BhZ2UoKQorICogaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG1vZGlmaWNhdGlvbiBhbmQgZWl0aGVyIG50ZnNfaW5kZXhfZW50cnlfbWFya19kaXJ0eSgpCisgKiBvciBudGZzX2luZGV4X2VudHJ5X3dyaXRlKCkgYmVmb3JlIHRoZSBjYWxsIHRvIG50ZnNfaW5kZXhfY3R4X3B1dCgpIHRvCisgKiBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlcyBhcmUgd3JpdHRlbiB0byBkaXNrLgorICoKKyAqIExvY2tpbmc6ICAtIENhbGxlciBtdXN0IGhvbGQgaV9zZW0gb24gdGhlIGluZGV4IGlub2RlLgorICoJICAgICAtIEVhY2ggcGFnZSBjYWNoZSBwYWdlIGluIHRoZSBpbmRleCBhbGxvY2F0aW9uIG1hcHBpbmcgbXVzdCBiZQorICoJICAgICAgIGxvY2tlZCB3aGlsc3QgYmVpbmcgYWNjZXNzZWQgb3RoZXJ3aXNlIHdlIG1heSBmaW5kIGEgY29ycnVwdAorICoJICAgICAgIHBhZ2UgZHVlIHRvIGl0IGJlaW5nIHVuZGVyIC0+d3JpdGVwYWdlIGF0IHRoZSBtb21lbnQgd2hpY2gKKyAqCSAgICAgICBhcHBsaWVzIHRoZSBtc3QgcHJvdGVjdGlvbiBmaXh1cHMgYmVmb3JlIHdyaXRpbmcgb3V0IGFuZCB0aGVuCisgKgkgICAgICAgcmVtb3ZlcyB0aGVtIGFnYWluIGFmdGVyIHRoZSB3cml0ZSBpcyBjb21wbGV0ZSBhZnRlciB3aGljaCBpdCAKKyAqCSAgICAgICB1bmxvY2tzIHRoZSBwYWdlLgorICovCitpbnQgbnRmc19pbmRleF9sb29rdXAoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCBpbnQga2V5X2xlbiwKKwkJbnRmc19pbmRleF9jb250ZXh0ICppY3R4KQoreworCVZDTiB2Y24sIG9sZF92Y247CisJbnRmc19pbm9kZSAqaWR4X25pID0gaWN0eC0+aWR4X25pOworCW50ZnNfdm9sdW1lICp2b2wgPSBpZHhfbmktPnZvbDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gdm9sLT5zYjsKKwludGZzX2lub2RlICpiYXNlX25pID0gaWR4X25pLT5leHQuYmFzZV9udGZzX2lubzsKKwlNRlRfUkVDT1JEICptOworCUlOREVYX1JPT1QgKmlyOworCUlOREVYX0VOVFJZICppZTsKKwlJTkRFWF9BTExPQ0FUSU9OICppYTsKKwl1OCAqaW5kZXhfZW5kLCAqa2FkZHI7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmFjdHg7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmlhX21hcHBpbmc7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IHJjLCBlcnIgPSAwOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJQlVHX09OKCFOSW5vQXR0cihpZHhfbmkpKTsKKwlCVUdfT04oaWR4X25pLT50eXBlICE9IEFUX0lOREVYX0FMTE9DQVRJT04pOworCUJVR19PTihpZHhfbmktPm5yX2V4dGVudHMgIT0gLTEpOworCUJVR19PTighYmFzZV9uaSk7CisJQlVHX09OKCFrZXkpOworCUJVR19PTihrZXlfbGVuIDw9IDApOworCWlmICghbnRmc19pc19jb2xsYXRpb25fcnVsZV9zdXBwb3J0ZWQoCisJCQlpZHhfbmktPml0eXBlLmluZGV4LmNvbGxhdGlvbl9ydWxlKSkgeworCQludGZzX2Vycm9yKHNiLCAiSW5kZXggdXNlcyB1bnN1cHBvcnRlZCBjb2xsYXRpb24gcnVsZSAweCV4LiAgIgorCQkJCSJBYm9ydGluZyBsb29rdXAuIiwgbGUzMl90b19jcHUoCisJCQkJaWR4X25pLT5pdHlwZS5pbmRleC5jb2xsYXRpb25fcnVsZSkpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCS8qIEdldCBob2xkIG9mIHRoZSBtZnQgcmVjb3JkIGZvciB0aGUgaW5kZXggaW5vZGUuICovCisJbSA9IG1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCWlmIChJU19FUlIobSkpIHsKKwkJbnRmc19lcnJvcihzYiwgIm1hcF9tZnRfcmVjb3JkKCkgZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlbGQuIiwKKwkJCQktUFRSX0VSUihtKSk7CisJCXJldHVybiBQVFJfRVJSKG0pOworCX0KKwlhY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KGJhc2VfbmksIG0pOworCWlmICh1bmxpa2VseSghYWN0eCkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBGaW5kIHRoZSBpbmRleCByb290IGF0dHJpYnV0ZSBpbiB0aGUgbWZ0IHJlY29yZC4gKi8KKwllcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX0lOREVYX1JPT1QsIGlkeF9uaS0+bmFtZSwgaWR4X25pLT5uYW1lX2xlbiwKKwkJCUNBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLCAwLCBhY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlpZiAoZXJyID09IC1FTk9FTlQpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCByb290IGF0dHJpYnV0ZSBtaXNzaW5nIGluIGlub2RlICIKKwkJCQkJIjB4JWx4LiIsIGlkeF9uaS0+bWZ0X25vKTsKKwkJCWVyciA9IC1FSU87CisJCX0KKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBHZXQgdG8gdGhlIGluZGV4IHJvb3QgdmFsdWUgKGl0IGhhcyBiZWVuIHZlcmlmaWVkIGluIHJlYWRfaW5vZGUpLiAqLworCWlyID0gKElOREVYX1JPT1QqKSgodTgqKWFjdHgtPmF0dHIgKworCQkJbGUxNl90b19jcHUoYWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpKTsKKwlpbmRleF9lbmQgPSAodTgqKSZpci0+aW5kZXggKyBsZTMyX3RvX2NwdShpci0+aW5kZXguaW5kZXhfbGVuZ3RoKTsKKwkvKiBUaGUgZmlyc3QgaW5kZXggZW50cnkuICovCisJaWUgPSAoSU5ERVhfRU5UUlkqKSgodTgqKSZpci0+aW5kZXggKworCQkJbGUzMl90b19jcHUoaXItPmluZGV4LmVudHJpZXNfb2Zmc2V0KSk7CisJLyoKKwkgKiBMb29wIHVudGlsIHdlIGV4Y2VlZCB2YWxpZCBtZW1vcnkgKGNvcnJ1cHRpb24gY2FzZSkgb3IgdW50aWwgd2UKKwkgKiByZWFjaCB0aGUgbGFzdCBlbnRyeS4KKwkgKi8KKwlmb3IgKDs7IGllID0gKElOREVYX0VOVFJZKikoKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5sZW5ndGgpKSkgeworCQkvKiBCb3VuZHMgY2hlY2tzLiAqLworCQlpZiAoKHU4KilpZSA8ICh1OCopYWN0eC0+bXJlYyB8fCAodTgqKWllICsKKwkJCQlzaXplb2YoSU5ERVhfRU5UUllfSEVBREVSKSA+IGluZGV4X2VuZCB8fAorCQkJCSh1OCopaWUgKyBsZTE2X3RvX2NwdShpZS0+bGVuZ3RoKSA+IGluZGV4X2VuZCkKKwkJCWdvdG8gaWR4X2Vycl9vdXQ7CisJCS8qCisJCSAqIFRoZSBsYXN0IGVudHJ5IGNhbm5vdCBjb250YWluIGEga2V5LiAgSXQgY2FuIGhvd2V2ZXIgY29udGFpbgorCQkgKiBhIHBvaW50ZXIgdG8gYSBjaGlsZCBub2RlIGluIHRoZSBCK3RyZWUgc28gd2UganVzdCBicmVhayBvdXQuCisJCSAqLworCQlpZiAoaWUtPmZsYWdzICYgSU5ERVhfRU5UUllfRU5EKQorCQkJYnJlYWs7CisJCS8qIEZ1cnRoZXIgYm91bmRzIGNoZWNrcy4gKi8KKwkJaWYgKCh1MzIpc2l6ZW9mKElOREVYX0VOVFJZX0hFQURFUikgKworCQkJCWxlMTZfdG9fY3B1KGllLT5rZXlfbGVuZ3RoKSA+CisJCQkJbGUxNl90b19jcHUoaWUtPmRhdGEudmkuZGF0YV9vZmZzZXQpIHx8CisJCQkJKHUzMilsZTE2X3RvX2NwdShpZS0+ZGF0YS52aS5kYXRhX29mZnNldCkgKworCQkJCWxlMTZfdG9fY3B1KGllLT5kYXRhLnZpLmRhdGFfbGVuZ3RoKSA+CisJCQkJbGUxNl90b19jcHUoaWUtPmxlbmd0aCkpCisJCQlnb3RvIGlkeF9lcnJfb3V0OworCQkvKiBJZiB0aGUga2V5cyBtYXRjaCBwZXJmZWN0bHksIHdlIHNldHVwIEBpY3R4IGFuZCByZXR1cm4gMC4gKi8KKwkJaWYgKChrZXlfbGVuID09IGxlMTZfdG9fY3B1KGllLT5rZXlfbGVuZ3RoKSkgJiYgIW1lbWNtcChrZXksCisJCQkJJmllLT5rZXksIGtleV9sZW4pKSB7Citpcl9kb25lOgorCQkJaWN0eC0+aXNfaW5fcm9vdCA9IFRSVUU7CisJCQlpY3R4LT5hY3R4ID0gYWN0eDsKKwkJCWljdHgtPmJhc2VfbmkgPSBiYXNlX25pOworCQkJaWN0eC0+aWEgPSBOVUxMOworCQkJaWN0eC0+cGFnZSA9IE5VTEw7Citkb25lOgorCQkJaWN0eC0+ZW50cnkgPSBpZTsKKwkJCWljdHgtPmRhdGEgPSAodTgqKWllICsKKwkJCQkJbGUxNl90b19jcHUoaWUtPmRhdGEudmkuZGF0YV9vZmZzZXQpOworCQkJaWN0eC0+ZGF0YV9sZW4gPSBsZTE2X3RvX2NwdShpZS0+ZGF0YS52aS5kYXRhX2xlbmd0aCk7CisJCQludGZzX2RlYnVnKCJEb25lLiIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQkvKgorCQkgKiBOb3QgYSBwZXJmZWN0IG1hdGNoLCBuZWVkIHRvIGRvIGZ1bGwgYmxvd24gY29sbGF0aW9uIHNvIHdlCisJCSAqIGtub3cgd2hpY2ggd2F5IGluIHRoZSBCK3RyZWUgd2UgaGF2ZSB0byBnby4KKwkJICovCisJCXJjID0gbnRmc19jb2xsYXRlKHZvbCwgaWR4X25pLT5pdHlwZS5pbmRleC5jb2xsYXRpb25fcnVsZSwga2V5LAorCQkJCWtleV9sZW4sICZpZS0+a2V5LCBsZTE2X3RvX2NwdShpZS0+a2V5X2xlbmd0aCkpOworCQkvKgorCQkgKiBJZiBAa2V5IGNvbGxhdGVzIGJlZm9yZSB0aGUga2V5IG9mIHRoZSBjdXJyZW50IGVudHJ5LCB0aGVyZQorCQkgKiBpcyBkZWZpbml0ZWx5IG5vIHN1Y2gga2V5IGluIHRoaXMgaW5kZXggYnV0IHdlIG1pZ2h0IG5lZWQgdG8KKwkJICogZGVzY2VuZCBpbnRvIHRoZSBCK3RyZWUgc28gd2UganVzdCBicmVhayBvdXQgb2YgdGhlIGxvb3AuCisJCSAqLworCQlpZiAocmMgPT0gLTEpCisJCQlicmVhazsKKwkJLyoKKwkJICogQSBtYXRjaCBzaG91bGQgbmV2ZXIgaGFwcGVuIGFzIHRoZSBtZW1jbXAoKSBjYWxsIHNob3VsZCBoYXZlCisJCSAqIGNvdWdodCBpdCwgYnV0IHdlIHN0aWxsIHRyZWF0IGl0IGNvcnJlY3RseS4KKwkJICovCisJCWlmICghcmMpCisJCQlnb3RvIGlyX2RvbmU7CisJCS8qIFRoZSBrZXlzIGFyZSBub3QgZXF1YWwsIGNvbnRpbnVlIHRoZSBzZWFyY2guICovCisJfQorCS8qCisJICogV2UgaGF2ZSBmaW5pc2hlZCB3aXRoIHRoaXMgaW5kZXggd2l0aG91dCBzdWNjZXNzLiAgQ2hlY2sgZm9yIHRoZQorCSAqIHByZXNlbmNlIG9mIGEgY2hpbGQgbm9kZSBhbmQgaWYgbm90IHByZXNlbnQgc2V0dXAgQGljdHggYW5kIHJldHVybgorCSAqIC1FTk9FTlQuCisJICovCisJaWYgKCEoaWUtPmZsYWdzICYgSU5ERVhfRU5UUllfTk9ERSkpIHsKKwkJbnRmc19kZWJ1ZygiRW50cnkgbm90IGZvdW5kLiIpOworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGlyX2RvbmU7CisJfSAvKiBDaGlsZCBub2RlIHByZXNlbnQsIGRlc2NlbmQgaW50byBpdC4gKi8KKwkvKiBDb25zaXN0ZW5jeSBjaGVjazogVmVyaWZ5IHRoYXQgYW4gaW5kZXggYWxsb2NhdGlvbiBleGlzdHMuICovCisJaWYgKCFOSW5vSW5kZXhBbGxvY1ByZXNlbnQoaWR4X25pKSkgeworCQludGZzX2Vycm9yKHNiLCAiTm8gaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUgYnV0IGluZGV4IGVudHJ5ICIKKwkJCQkicmVxdWlyZXMgb25lLiAgSW5vZGUgMHglbHggaXMgY29ycnVwdCBvciAiCisJCQkJImRyaXZlciBidWcuIiwgaWR4X25pLT5tZnRfbm8pOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIEdldCB0aGUgc3RhcnRpbmcgdmNuIG9mIHRoZSBpbmRleF9ibG9jayBob2xkaW5nIHRoZSBjaGlsZCBub2RlLiAqLworCXZjbiA9IHNsZTY0X3RvX2NwdXAoKHNsZTY0KikoKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5sZW5ndGgpIC0gOCkpOworCWlhX21hcHBpbmcgPSBWRlNfSShpZHhfbmkpLT5pX21hcHBpbmc7CisJLyoKKwkgKiBXZSBhcmUgZG9uZSB3aXRoIHRoZSBpbmRleCByb290IGFuZCB0aGUgbWZ0IHJlY29yZC4gIFJlbGVhc2UgdGhlbSwKKwkgKiBvdGhlcndpc2Ugd2UgZGVhZGxvY2sgd2l0aCBudGZzX21hcF9wYWdlKCkuCisJICovCisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGFjdHgpOworCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJbSA9IE5VTEw7CisJYWN0eCA9IE5VTEw7CitkZXNjZW5kX2ludG9fY2hpbGRfbm9kZToKKwkvKgorCSAqIENvbnZlcnQgdmNuIHRvIGluZGV4IGludG8gdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlIGluIHVuaXRzCisJICogb2YgUEFHRV9DQUNIRV9TSVpFIGFuZCBtYXAgdGhlIHBhZ2UgY2FjaGUgcGFnZSwgcmVhZGluZyBpdCBmcm9tCisJICogZGlzayBpZiBuZWNlc3NhcnkuCisJICovCisJcGFnZSA9IG50ZnNfbWFwX3BhZ2UoaWFfbWFwcGluZywgdmNuIDw8CisJCQlpZHhfbmktPml0eXBlLmluZGV4LnZjbl9zaXplX2JpdHMgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJaWYgKElTX0VSUihwYWdlKSkgeworCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIG1hcCBpbmRleCBwYWdlLCBlcnJvciAlbGQuIiwKKwkJCQktUFRSX0VSUihwYWdlKSk7CisJCWVyciA9IFBUUl9FUlIocGFnZSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJbG9ja19wYWdlKHBhZ2UpOworCWthZGRyID0gKHU4KilwYWdlX2FkZHJlc3MocGFnZSk7CitmYXN0X2Rlc2NlbmRfaW50b19jaGlsZF9ub2RlOgorCS8qIEdldCB0byB0aGUgaW5kZXggYWxsb2NhdGlvbiBibG9jay4gKi8KKwlpYSA9IChJTkRFWF9BTExPQ0FUSU9OKikoa2FkZHIgKyAoKHZjbiA8PAorCQkJaWR4X25pLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzKSAmIH5QQUdFX0NBQ0hFX01BU0spKTsKKwkvKiBCb3VuZHMgY2hlY2tzLiAqLworCWlmICgodTgqKWlhIDwga2FkZHIgfHwgKHU4KilpYSA+IGthZGRyICsgUEFHRV9DQUNIRV9TSVpFKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJPdXQgb2YgYm91bmRzIGNoZWNrIGZhaWxlZC4gIENvcnJ1cHQgaW5vZGUgIgorCQkJCSIweCVseCBvciBkcml2ZXIgYnVnLiIsIGlkeF9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogQ2F0Y2ggbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGZpeHVwIGVycm9ycy4gKi8KKwlpZiAodW5saWtlbHkoIW50ZnNfaXNfaW5keF9yZWNvcmQoaWEtPm1hZ2ljKSkpIHsKKwkJbnRmc19lcnJvcihzYiwgIkluZGV4IHJlY29yZCB3aXRoIHZjbiAweCVsbHggaXMgY29ycnVwdC4gICIKKwkJCQkiQ29ycnVwdCBpbm9kZSAweCVseC4gIFJ1biBjaGtkc2suIiwKKwkJCQkobG9uZyBsb25nKXZjbiwgaWR4X25pLT5tZnRfbm8pOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpZiAoc2xlNjRfdG9fY3B1KGlhLT5pbmRleF9ibG9ja192Y24pICE9IHZjbikgeworCQludGZzX2Vycm9yKHNiLCAiQWN0dWFsIFZDTiAoMHglbGx4KSBvZiBpbmRleCBidWZmZXIgaXMgIgorCQkJCSJkaWZmZXJlbnQgZnJvbSBleHBlY3RlZCBWQ04gKDB4JWxseCkuICBJbm9kZSAiCisJCQkJIjB4JWx4IGlzIGNvcnJ1cHQgb3IgZHJpdmVyIGJ1Zy4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJc2xlNjRfdG9fY3B1KGlhLT5pbmRleF9ibG9ja192Y24pLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLCBpZHhfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWlmIChsZTMyX3RvX2NwdShpYS0+aW5kZXguYWxsb2NhdGVkX3NpemUpICsgMHgxOCAhPQorCQkJaWR4X25pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCBidWZmZXIgKFZDTiAweCVsbHgpIG9mIGlub2RlIDB4JWx4IGhhcyAiCisJCQkJImEgc2l6ZSAoJXUpIGRpZmZlcmluZyBmcm9tIHRoZSBpbmRleCAiCisJCQkJInNwZWNpZmllZCBzaXplICgldSkuICBJbm9kZSBpcyBjb3JydXB0IG9yICIKKwkJCQkiZHJpdmVyIGJ1Zy4iLCAodW5zaWduZWQgbG9uZyBsb25nKXZjbiwKKwkJCQlpZHhfbmktPm1mdF9ubywKKwkJCQlsZTMyX3RvX2NwdShpYS0+aW5kZXguYWxsb2NhdGVkX3NpemUpICsgMHgxOCwKKwkJCQlpZHhfbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpbmRleF9lbmQgPSAodTgqKWlhICsgaWR4X25pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplOworCWlmIChpbmRleF9lbmQgPiBrYWRkciArIFBBR0VfQ0FDSEVfU0laRSkgeworCQludGZzX2Vycm9yKHNiLCAiSW5kZXggYnVmZmVyIChWQ04gMHglbGx4KSBvZiBpbm9kZSAweCVseCAiCisJCQkJImNyb3NzZXMgcGFnZSBib3VuZGFyeS4gIEltcG9zc2libGUhICBDYW5ub3QgIgorCQkJCSJhY2Nlc3MhICBUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIHRoZSAiCisJCQkJImRyaXZlci4iLCAodW5zaWduZWQgbG9uZyBsb25nKXZjbiwKKwkJCQlpZHhfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWluZGV4X2VuZCA9ICh1OCopJmlhLT5pbmRleCArIGxlMzJfdG9fY3B1KGlhLT5pbmRleC5pbmRleF9sZW5ndGgpOworCWlmIChpbmRleF9lbmQgPiAodTgqKWlhICsgaWR4X25pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJTaXplIG9mIGluZGV4IGJ1ZmZlciAoVkNOIDB4JWxseCkgb2YgaW5vZGUgIgorCQkJCSIweCVseCBleGNlZWRzIG1heGltdW0gc2l6ZS4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLCBpZHhfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCS8qIFRoZSBmaXJzdCBpbmRleCBlbnRyeS4gKi8KKwlpZSA9IChJTkRFWF9FTlRSWSopKCh1OCopJmlhLT5pbmRleCArCisJCQlsZTMyX3RvX2NwdShpYS0+aW5kZXguZW50cmllc19vZmZzZXQpKTsKKwkvKgorCSAqIEl0ZXJhdGUgc2ltaWxhciB0byBhYm92ZSBiaWcgbG9vcCBidXQgYXBwbGllZCB0byBpbmRleCBidWZmZXIsIHRodXMKKwkgKiBsb29wIHVudGlsIHdlIGV4Y2VlZCB2YWxpZCBtZW1vcnkgKGNvcnJ1cHRpb24gY2FzZSkgb3IgdW50aWwgd2UKKwkgKiByZWFjaCB0aGUgbGFzdCBlbnRyeS4KKwkgKi8KKwlmb3IgKDs7IGllID0gKElOREVYX0VOVFJZKikoKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5sZW5ndGgpKSkgeworCQkvKiBCb3VuZHMgY2hlY2tzLiAqLworCQlpZiAoKHU4KilpZSA8ICh1OCopaWEgfHwgKHU4KilpZSArCisJCQkJc2l6ZW9mKElOREVYX0VOVFJZX0hFQURFUikgPiBpbmRleF9lbmQgfHwKKwkJCQkodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmxlbmd0aCkgPiBpbmRleF9lbmQpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCBlbnRyeSBvdXQgb2YgYm91bmRzIGluIGlub2RlICIKKwkJCQkJIjB4JWx4LiIsIGlkeF9uaS0+bWZ0X25vKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJLyoKKwkJICogVGhlIGxhc3QgZW50cnkgY2Fubm90IGNvbnRhaW4gYSBrZXkuICBJdCBjYW4gaG93ZXZlciBjb250YWluCisJCSAqIGEgcG9pbnRlciB0byBhIGNoaWxkIG5vZGUgaW4gdGhlIEIrdHJlZSBzbyB3ZSBqdXN0IGJyZWFrIG91dC4KKwkJICovCisJCWlmIChpZS0+ZmxhZ3MgJiBJTkRFWF9FTlRSWV9FTkQpCisJCQlicmVhazsKKwkJLyogRnVydGhlciBib3VuZHMgY2hlY2tzLiAqLworCQlpZiAoKHUzMilzaXplb2YoSU5ERVhfRU5UUllfSEVBREVSKSArCisJCQkJbGUxNl90b19jcHUoaWUtPmtleV9sZW5ndGgpID4KKwkJCQlsZTE2X3RvX2NwdShpZS0+ZGF0YS52aS5kYXRhX29mZnNldCkgfHwKKwkJCQkodTMyKWxlMTZfdG9fY3B1KGllLT5kYXRhLnZpLmRhdGFfb2Zmc2V0KSArCisJCQkJbGUxNl90b19jcHUoaWUtPmRhdGEudmkuZGF0YV9sZW5ndGgpID4KKwkJCQlsZTE2X3RvX2NwdShpZS0+bGVuZ3RoKSkgeworCQkJbnRmc19lcnJvcihzYiwgIkluZGV4IGVudHJ5IG91dCBvZiBib3VuZHMgaW4gaW5vZGUgIgorCQkJCQkiMHglbHguIiwgaWR4X25pLT5tZnRfbm8pOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKiBJZiB0aGUga2V5cyBtYXRjaCBwZXJmZWN0bHksIHdlIHNldHVwIEBpY3R4IGFuZCByZXR1cm4gMC4gKi8KKwkJaWYgKChrZXlfbGVuID09IGxlMTZfdG9fY3B1KGllLT5rZXlfbGVuZ3RoKSkgJiYgIW1lbWNtcChrZXksCisJCQkJJmllLT5rZXksIGtleV9sZW4pKSB7CitpYV9kb25lOgorCQkJaWN0eC0+aXNfaW5fcm9vdCA9IEZBTFNFOworCQkJaWN0eC0+YWN0eCA9IE5VTEw7CisJCQlpY3R4LT5iYXNlX25pID0gTlVMTDsKKwkJCWljdHgtPmlhID0gaWE7CisJCQlpY3R4LT5wYWdlID0gcGFnZTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQkvKgorCQkgKiBOb3QgYSBwZXJmZWN0IG1hdGNoLCBuZWVkIHRvIGRvIGZ1bGwgYmxvd24gY29sbGF0aW9uIHNvIHdlCisJCSAqIGtub3cgd2hpY2ggd2F5IGluIHRoZSBCK3RyZWUgd2UgaGF2ZSB0byBnby4KKwkJICovCisJCXJjID0gbnRmc19jb2xsYXRlKHZvbCwgaWR4X25pLT5pdHlwZS5pbmRleC5jb2xsYXRpb25fcnVsZSwga2V5LAorCQkJCWtleV9sZW4sICZpZS0+a2V5LCBsZTE2X3RvX2NwdShpZS0+a2V5X2xlbmd0aCkpOworCQkvKgorCQkgKiBJZiBAa2V5IGNvbGxhdGVzIGJlZm9yZSB0aGUga2V5IG9mIHRoZSBjdXJyZW50IGVudHJ5LCB0aGVyZQorCQkgKiBpcyBkZWZpbml0ZWx5IG5vIHN1Y2gga2V5IGluIHRoaXMgaW5kZXggYnV0IHdlIG1pZ2h0IG5lZWQgdG8KKwkJICogZGVzY2VuZCBpbnRvIHRoZSBCK3RyZWUgc28gd2UganVzdCBicmVhayBvdXQgb2YgdGhlIGxvb3AuCisJCSAqLworCQlpZiAocmMgPT0gLTEpCisJCQlicmVhazsKKwkJLyoKKwkJICogQSBtYXRjaCBzaG91bGQgbmV2ZXIgaGFwcGVuIGFzIHRoZSBtZW1jbXAoKSBjYWxsIHNob3VsZCBoYXZlCisJCSAqIGNvdWdodCBpdCwgYnV0IHdlIHN0aWxsIHRyZWF0IGl0IGNvcnJlY3RseS4KKwkJICovCisJCWlmICghcmMpCisJCQlnb3RvIGlhX2RvbmU7CisJCS8qIFRoZSBrZXlzIGFyZSBub3QgZXF1YWwsIGNvbnRpbnVlIHRoZSBzZWFyY2guICovCisJfQorCS8qCisJICogV2UgaGF2ZSBmaW5pc2hlZCB3aXRoIHRoaXMgaW5kZXggYnVmZmVyIHdpdGhvdXQgc3VjY2Vzcy4gIENoZWNrIGZvcgorCSAqIHRoZSBwcmVzZW5jZSBvZiBhIGNoaWxkIG5vZGUgYW5kIGlmIG5vdCBwcmVzZW50IHJldHVybiAtRU5PRU5ULgorCSAqLworCWlmICghKGllLT5mbGFncyAmIElOREVYX0VOVFJZX05PREUpKSB7CisJCW50ZnNfZGVidWcoIkVudHJ5IG5vdCBmb3VuZC4iKTsKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBpYV9kb25lOworCX0KKwlpZiAoKGlhLT5pbmRleC5mbGFncyAmIE5PREVfTUFTSykgPT0gTEVBRl9OT0RFKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCBlbnRyeSB3aXRoIGNoaWxkIG5vZGUgZm91bmQgaW4gYSBsZWFmICIKKwkJCQkibm9kZSBpbiBpbm9kZSAweCVseC4iLCBpZHhfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCS8qIENoaWxkIG5vZGUgcHJlc2VudCwgZGVzY2VuZCBpbnRvIGl0LiAqLworCW9sZF92Y24gPSB2Y247CisJdmNuID0gc2xlNjRfdG9fY3B1cCgoc2xlNjQqKSgodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmxlbmd0aCkgLSA4KSk7CisJaWYgKHZjbiA+PSAwKSB7CisJCS8qCisJCSAqIElmIHZjbiBpcyBpbiB0aGUgc2FtZSBwYWdlIGNhY2hlIHBhZ2UgYXMgb2xkX3ZjbiB3ZSByZWN5Y2xlCisJCSAqIHRoZSBtYXBwZWQgcGFnZS4KKwkJICovCisJCWlmIChvbGRfdmNuIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMgPj4KKwkJCQlQQUdFX0NBQ0hFX1NISUZUID09IHZjbiA8PAorCQkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMgPj4KKwkJCQlQQUdFX0NBQ0hFX1NISUZUKQorCQkJZ290byBmYXN0X2Rlc2NlbmRfaW50b19jaGlsZF9ub2RlOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQlnb3RvIGRlc2NlbmRfaW50b19jaGlsZF9ub2RlOworCX0KKwludGZzX2Vycm9yKHNiLCAiTmVnYXRpdmUgY2hpbGQgbm9kZSB2Y24gaW4gaW5vZGUgMHglbHguIiwKKwkJCWlkeF9uaS0+bWZ0X25vKTsKK3VubV9lcnJfb3V0OgorCXVubG9ja19wYWdlKHBhZ2UpOworCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKK2Vycl9vdXQ6CisJaWYgKCFlcnIpCisJCWVyciA9IC1FSU87CisJaWYgKGFjdHgpCisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChhY3R4KTsKKwlpZiAobSkKKwkJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwlyZXR1cm4gZXJyOworaWR4X2Vycl9vdXQ6CisJbnRmc19lcnJvcihzYiwgIkNvcnJ1cHQgaW5kZXguICBBYm9ydGluZyBsb29rdXAuIik7CisJZ290byBlcnJfb3V0OworfQpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9pbmRleC5oIGIvZnMvbnRmcy9pbmRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NmE0ODkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2luZGV4LmgKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBpbmRleC5oIC0gRGVmaW5lcyBmb3IgTlRGUyBrZXJuZWwgaW5kZXggaGFuZGxpbmcuICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTCisgKgkgICAgIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfSU5ERVhfSAorI2RlZmluZSBfTElOVVhfTlRGU19JTkRFWF9ICisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJsYXlvdXQuaCIKKyNpbmNsdWRlICJpbm9kZS5oIgorI2luY2x1ZGUgImF0dHJpYi5oIgorI2luY2x1ZGUgIm1mdC5oIgorI2luY2x1ZGUgImFvcHMuaCIKKworLyoqCisgKiBAaWR4X25pOglpbmRleCBpbm9kZSBjb250YWluaW5nIHRoZSBAZW50cnkgZGVzY3JpYmVkIGJ5IHRoaXMgY29udGV4dAorICogQGVudHJ5OglpbmRleCBlbnRyeSAocG9pbnRzIGludG8gQGlyIG9yIEBpYSkKKyAqIEBkYXRhOglpbmRleCBlbnRyeSBkYXRhIChwb2ludHMgaW50byBAZW50cnkpCisgKiBAZGF0YV9sZW46CWxlbmd0aCBpbiBieXRlcyBvZiBAZGF0YQorICogQGlzX2luX3Jvb3Q6CVRSVUUgaWYgQGVudHJ5IGlzIGluIEBpciBhbmQgRkFMU0UgaWYgaXQgaXMgaW4gQGlhCisgKiBAaXI6CQlpbmRleCByb290IGlmIEBpc19pbl9yb290IGFuZCBOVUxMIG90aGVyd2lzZQorICogQGFjdHg6CWF0dHJpYnV0ZSBzZWFyY2ggY29udGV4dCBpZiBAaXNfaW5fcm9vdCBhbmQgTlVMTCBvdGhlcndpc2UKKyAqIEBiYXNlX25pOgliYXNlIGlub2RlIGlmIEBpc19pbl9yb290IGFuZCBOVUxMIG90aGVyd2lzZQorICogQGlhOgkJaW5kZXggYmxvY2sgaWYgQGlzX2luX3Jvb3QgaXMgRkFMU0UgYW5kIE5VTEwgb3RoZXJ3aXNlCisgKiBAcGFnZToJcGFnZSBpZiBAaXNfaW5fcm9vdCBpcyBGQUxTRSBhbmQgTlVMTCBvdGhlcndpc2UKKyAqCisgKiBAaWR4X25pIGlzIHRoZSBpbmRleCBpbm9kZSB0aGlzIGNvbnRleHQgYmVsb25ncyB0by4KKyAqCisgKiBAZW50cnkgaXMgdGhlIGluZGV4IGVudHJ5IGRlc2NyaWJlZCBieSB0aGlzIGNvbnRleHQuICBAZGF0YSBhbmQgQGRhdGFfbGVuCisgKiBhcmUgdGhlIGluZGV4IGVudHJ5IGRhdGEgYW5kIGl0cyBsZW5ndGggaW4gYnl0ZXMsIHJlc3BlY3RpdmVseS4gIEBkYXRhCisgKiBzaW1wbHkgcG9pbnRzIGludG8gQGVudHJ5LiAgVGhpcyBpcyBwcm9iYWJseSB3aGF0IHRoZSB1c2VyIGlzIGludGVyZXN0ZWQgaW4uCisgKgorICogSWYgQGlzX2luX3Jvb3QgaXMgVFJVRSwgQGVudHJ5IGlzIGluIHRoZSBpbmRleCByb290IGF0dHJpYnV0ZSBAaXIgZGVzY3JpYmVkCisgKiBieSB0aGUgYXR0cmlidXRlIHNlYXJjaCBjb250ZXh0IEBhY3R4IGFuZCB0aGUgYmFzZSBpbm9kZSBAYmFzZV9uaS4gIEBpYSBhbmQKKyAqIEBwYWdlIGFyZSBOVUxMIGluIHRoaXMgY2FzZS4KKyAqCisgKiBJZiBAaXNfaW5fcm9vdCBpcyBGQUxTRSwgQGVudHJ5IGlzIGluIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSBhbmQgQGlhCisgKiBhbmQgQHBhZ2UgcG9pbnQgdG8gdGhlIGluZGV4IGFsbG9jYXRpb24gYmxvY2sgYW5kIHRoZSBtYXBwZWQsIGxvY2tlZCBwYWdlIGl0CisgKiBpcyBpbiwgcmVzcGVjdGl2ZWx5LiAgQGlyLCBAYWN0eCBhbmQgQGJhc2VfbmkgYXJlIE5VTEwgaW4gdGhpcyBjYXNlLgorICoKKyAqIFRvIG9idGFpbiBhIGNvbnRleHQgY2FsbCBudGZzX2luZGV4X2N0eF9nZXQoKS4KKyAqCisgKiBXZSB1c2UgdGhpcyBjb250ZXh0IHRvIGFsbG93IG50ZnNfaW5kZXhfbG9va3VwKCkgdG8gcmV0dXJuIHRoZSBmb3VuZCBpbmRleAorICogQGVudHJ5IGFuZCBpdHMgQGRhdGEgd2l0aG91dCBoYXZpbmcgdG8gYWxsb2NhdGUgYSBidWZmZXIgYW5kIGNvcHkgdGhlIEBlbnRyeQorICogYW5kL29yIGl0cyBAZGF0YSBpbnRvIGl0LgorICoKKyAqIFdoZW4gZmluaXNoZWQgd2l0aCB0aGUgQGVudHJ5IGFuZCBpdHMgQGRhdGEsIGNhbGwgbnRmc19pbmRleF9jdHhfcHV0KCkgdG8KKyAqIGZyZWUgdGhlIGNvbnRleHQgYW5kIG90aGVyIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgorICoKKyAqIElmIHRoZSBpbmRleCBlbnRyeSB3YXMgbW9kaWZpZWQsIGNhbGwgZmx1c2hfZGNhY2hlX2luZGV4X2VudHJ5X3BhZ2UoKQorICogaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG1vZGlmaWNhdGlvbiBhbmQgZWl0aGVyIG50ZnNfaW5kZXhfZW50cnlfbWFya19kaXJ0eSgpCisgKiBvciBudGZzX2luZGV4X2VudHJ5X3dyaXRlKCkgYmVmb3JlIHRoZSBjYWxsIHRvIG50ZnNfaW5kZXhfY3R4X3B1dCgpIHRvCisgKiBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlcyBhcmUgd3JpdHRlbiB0byBkaXNrLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJbnRmc19pbm9kZSAqaWR4X25pOworCUlOREVYX0VOVFJZICplbnRyeTsKKwl2b2lkICpkYXRhOworCXUxNiBkYXRhX2xlbjsKKwlCT09MIGlzX2luX3Jvb3Q7CisJSU5ERVhfUk9PVCAqaXI7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmFjdHg7CisJbnRmc19pbm9kZSAqYmFzZV9uaTsKKwlJTkRFWF9BTExPQ0FUSU9OICppYTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKK30gbnRmc19pbmRleF9jb250ZXh0OworCitleHRlcm4gbnRmc19pbmRleF9jb250ZXh0ICpudGZzX2luZGV4X2N0eF9nZXQobnRmc19pbm9kZSAqaWR4X25pKTsKK2V4dGVybiB2b2lkIG50ZnNfaW5kZXhfY3R4X3B1dChudGZzX2luZGV4X2NvbnRleHQgKmljdHgpOworCitleHRlcm4gaW50IG50ZnNfaW5kZXhfbG9va3VwKGNvbnN0IHZvaWQgKmtleSwgY29uc3QgaW50IGtleV9sZW4sCisJCW50ZnNfaW5kZXhfY29udGV4dCAqaWN0eCk7CisKKyNpZmRlZiBOVEZTX1JXCisKKy8qKgorICogbnRmc19pbmRleF9lbnRyeV9mbHVzaF9kY2FjaGVfcGFnZSAtIGZsdXNoX2RjYWNoZV9wYWdlKCkgZm9yIGluZGV4IGVudHJpZXMKKyAqIEBpY3R4OgludGZzIGluZGV4IGNvbnRleHQgZGVzY3JpYmluZyB0aGUgaW5kZXggZW50cnkKKyAqCisgKiBDYWxsIGZsdXNoX2RjYWNoZV9wYWdlKCkgZm9yIHRoZSBwYWdlIGluIHdoaWNoIGFuIGluZGV4IGVudHJ5IHJlc2lkZXMuCisgKgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGFuIGluZGV4IGVudHJ5IGlzIG1vZGlmaWVkLCBqdXN0IGFmdGVyIHRoZQorICogbW9kaWZpY2F0aW9uLgorICoKKyAqIElmIHRoZSBpbmRleCBlbnRyeSBpcyBpbiB0aGUgaW5kZXggcm9vdCBhdHRyaWJ1dGUsIHNpbXBseSBmbHVzaCB0aGUgcGFnZQorICogY29udGFpbmluZyB0aGUgbWZ0IHJlY29yZCBjb250YWluaW5nIHRoZSBpbmRleCByb290IGF0dHJpYnV0ZS4KKyAqCisgKiBJZiB0aGUgaW5kZXggZW50cnkgaXMgaW4gYW4gaW5kZXggYmxvY2sgYmVsb25naW5nIHRvIHRoZSBpbmRleCBhbGxvY2F0aW9uCisgKiBhdHRyaWJ1dGUsIHNpbXBseSBmbHVzaCB0aGUgcGFnZSBjYWNoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIGluZGV4IGJsb2NrLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbnRmc19pbmRleF9lbnRyeV9mbHVzaF9kY2FjaGVfcGFnZShudGZzX2luZGV4X2NvbnRleHQgKmljdHgpCit7CisJaWYgKGljdHgtPmlzX2luX3Jvb3QpCisJCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoaWN0eC0+YWN0eC0+bnRmc19pbm8pOworCWVsc2UKKwkJZmx1c2hfZGNhY2hlX3BhZ2UoaWN0eC0+cGFnZSk7Cit9CisKKy8qKgorICogbnRmc19pbmRleF9lbnRyeV9tYXJrX2RpcnR5IC0gbWFyayBhbiBpbmRleCBlbnRyeSBkaXJ0eQorICogQGljdHg6CW50ZnMgaW5kZXggY29udGV4dCBkZXNjcmliaW5nIHRoZSBpbmRleCBlbnRyeQorICoKKyAqIE1hcmsgdGhlIGluZGV4IGVudHJ5IGRlc2NyaWJlZCBieSB0aGUgaW5kZXggZW50cnkgY29udGV4dCBAaWN0eCBkaXJ0eS4KKyAqCisgKiBJZiB0aGUgaW5kZXggZW50cnkgaXMgaW4gdGhlIGluZGV4IHJvb3QgYXR0cmlidXRlLCBzaW1wbHkgbWFyayB0aGUgbWZ0CisgKiByZWNvcmQgY29udGFpbmluZyB0aGUgaW5kZXggcm9vdCBhdHRyaWJ1dGUgZGlydHkuICBUaGlzIGVuc3VyZXMgdGhlIG1mdAorICogcmVjb3JkLCBhbmQgaGVuY2UgdGhlIGluZGV4IHJvb3QgYXR0cmlidXRlLCB3aWxsIGJlIHdyaXR0ZW4gb3V0IHRvIGRpc2sKKyAqIGxhdGVyLgorICoKKyAqIElmIHRoZSBpbmRleCBlbnRyeSBpcyBpbiBhbiBpbmRleCBibG9jayBiZWxvbmdpbmcgdG8gdGhlIGluZGV4IGFsbG9jYXRpb24KKyAqIGF0dHJpYnV0ZSwgbWFyayB0aGUgYnVmZmVycyBiZWxvbmdpbmcgdG8gdGhlIGluZGV4IHJlY29yZCBhcyB3ZWxsIGFzIHRoZQorICogcGFnZSBjYWNoZSBwYWdlIHRoZSBpbmRleCBibG9jayBpcyBpbiBkaXJ0eS4gIFRoaXMgYXV0b21hdGljYWxseSBtYXJrcyB0aGUKKyAqIFZGUyBpbm9kZSBvZiB0aGUgbnRmcyBpbmRleCBpbm9kZSB0byB3aGljaCB0aGUgaW5kZXggZW50cnkgYmVsb25ncyBkaXJ0eSwKKyAqIHRvbyAoSV9ESVJUWV9QQUdFUykgYW5kIHRoaXMgaW4gdHVybiBlbnN1cmVzIHRoZSBwYWdlIGJ1ZmZlcnMsIGFuZCBoZW5jZSB0aGUKKyAqIGRpcnR5IGluZGV4IGJsb2NrLCB3aWxsIGJlIHdyaXR0ZW4gb3V0IHRvIGRpc2sgbGF0ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBudGZzX2luZGV4X2VudHJ5X21hcmtfZGlydHkobnRmc19pbmRleF9jb250ZXh0ICppY3R4KQoreworCWlmIChpY3R4LT5pc19pbl9yb290KQorCQltYXJrX21mdF9yZWNvcmRfZGlydHkoaWN0eC0+YWN0eC0+bnRmc19pbm8pOworCWVsc2UKKwkJbWFya19udGZzX3JlY29yZF9kaXJ0eShpY3R4LT5wYWdlLAorCQkJCSh1OCopaWN0eC0+aWEgLSAodTgqKXBhZ2VfYWRkcmVzcyhpY3R4LT5wYWdlKSk7Cit9CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19JTkRFWF9IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2lub2RlLmMgYi9mcy9udGZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4NDBiYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvaW5vZGUuYwpAQCAtMCwwICsxLDI2MTYgQEAKKy8qKgorICogaW5vZGUuYyAtIE5URlMga2VybmVsIGlub2RlIGhhbmRsaW5nLiBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorCisjaW5jbHVkZSAiYW9wcy5oIgorI2luY2x1ZGUgImRpci5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiaW5vZGUuaCIKKyNpbmNsdWRlICJhdHRyaWIuaCIKKyNpbmNsdWRlICJtYWxsb2MuaCIKKyNpbmNsdWRlICJtZnQuaCIKKyNpbmNsdWRlICJ0aW1lLmgiCisjaW5jbHVkZSAibnRmcy5oIgorCisvKioKKyAqIG50ZnNfdGVzdF9pbm9kZSAtIGNvbXBhcmUgdHdvIChwb3NzaWJseSBmYWtlKSBpbm9kZXMgZm9yIGVxdWFsaXR5CisgKiBAdmk6CQl2ZnMgaW5vZGUgd2hpY2ggdG8gdGVzdAorICogQG5hOgkJbnRmcyBhdHRyaWJ1dGUgd2hpY2ggaXMgYmVpbmcgdGVzdGVkIHdpdGgKKyAqCisgKiBDb21wYXJlIHRoZSBudGZzIGF0dHJpYnV0ZSBlbWJlZGRlZCBpbiB0aGUgbnRmcyBzcGVjaWZpYyBwYXJ0IG9mIHRoZSB2ZnMKKyAqIGlub2RlIEB2aSBmb3IgZXF1YWxpdHkgd2l0aCB0aGUgbnRmcyBhdHRyaWJ1dGUgQG5hLgorICoKKyAqIElmIHNlYXJjaGluZyBmb3IgdGhlIG5vcm1hbCBmaWxlL2RpcmVjdG9yeSBpbm9kZSwgc2V0IEBuYS0+dHlwZSB0byBBVF9VTlVTRUQuCisgKiBAbmEtPm5hbWUgYW5kIEBuYS0+bmFtZV9sZW4gYXJlIHRoZW4gaWdub3JlZC4KKyAqCisgKiBSZXR1cm4gMSBpZiB0aGUgYXR0cmlidXRlcyBtYXRjaCBhbmQgMCBpZiBub3QuCisgKgorICogTk9URTogVGhpcyBmdW5jdGlvbiBydW5zIHdpdGggdGhlIGlub2RlX2xvY2sgc3BpbiBsb2NrIGhlbGQgc28gaXQgaXMgbm90CisgKiBhbGxvd2VkIHRvIHNsZWVwLgorICovCitpbnQgbnRmc190ZXN0X2lub2RlKHN0cnVjdCBpbm9kZSAqdmksIG50ZnNfYXR0ciAqbmEpCit7CisJbnRmc19pbm9kZSAqbmk7CisKKwlpZiAodmktPmlfaW5vICE9IG5hLT5tZnRfbm8pCisJCXJldHVybiAwOworCW5pID0gTlRGU19JKHZpKTsKKwkvKiBJZiAhTklub0F0dHIobmkpLCBAdmkgaXMgYSBub3JtYWwgZmlsZSBvciBkaXJlY3RvcnkgaW5vZGUuICovCisJaWYgKGxpa2VseSghTklub0F0dHIobmkpKSkgeworCQkvKiBJZiBub3QgbG9va2luZyBmb3IgYSBub3JtYWwgaW5vZGUgdGhpcyBpcyBhIG1pc21hdGNoLiAqLworCQlpZiAodW5saWtlbHkobmEtPnR5cGUgIT0gQVRfVU5VU0VEKSkKKwkJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIEEgZmFrZSBpbm9kZSBkZXNjcmliaW5nIGFuIGF0dHJpYnV0ZS4gKi8KKwkJaWYgKG5pLT50eXBlICE9IG5hLT50eXBlKQorCQkJcmV0dXJuIDA7CisJCWlmIChuaS0+bmFtZV9sZW4gIT0gbmEtPm5hbWVfbGVuKQorCQkJcmV0dXJuIDA7CisJCWlmIChuYS0+bmFtZV9sZW4gJiYgbWVtY21wKG5pLT5uYW1lLCBuYS0+bmFtZSwKKwkJCQluYS0+bmFtZV9sZW4gKiBzaXplb2YobnRmc2NoYXIpKSkKKwkJCXJldHVybiAwOworCX0KKwkvKiBNYXRjaCEgKi8KKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBudGZzX2luaXRfbG9ja2VkX2lub2RlIC0gaW5pdGlhbGl6ZSBhbiBpbm9kZQorICogQHZpOgkJdmZzIGlub2RlIHRvIGluaXRpYWxpemUKKyAqIEBuYToJCW50ZnMgYXR0cmlidXRlIHdoaWNoIHRvIGluaXRpYWxpemUgQHZpIHRvCisgKgorICogSW5pdGlhbGl6ZSB0aGUgdmZzIGlub2RlIEB2aSB3aXRoIHRoZSB2YWx1ZXMgZnJvbSB0aGUgbnRmcyBhdHRyaWJ1dGUgQG5hIGluCisgKiBvcmRlciB0byBlbmFibGUgbnRmc190ZXN0X2lub2RlKCkgdG8gZG8gaXRzIHdvcmsuCisgKgorICogSWYgaW5pdGlhbGl6aW5nIHRoZSBub3JtYWwgZmlsZS9kaXJlY3RvcnkgaW5vZGUsIHNldCBAbmEtPnR5cGUgdG8gQVRfVU5VU0VELgorICogSW4gdGhhdCBjYXNlLCBAbmEtPm5hbWUgYW5kIEBuYS0+bmFtZV9sZW4gc2hvdWxkIGJlIHNldCB0byBOVUxMIGFuZCAwLAorICogcmVzcGVjdGl2ZWx5LiBBbHRob3VnaCB0aGF0IGlzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkgYXMKKyAqIG50ZnNfcmVhZF9pbm9kZV9sb2NrZWQoKSB3aWxsIGZpbGwgdGhlbSBpbiBsYXRlci4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKgorICogTk9URTogVGhpcyBmdW5jdGlvbiBydW5zIHdpdGggdGhlIGlub2RlX2xvY2sgc3BpbiBsb2NrIGhlbGQgc28gaXQgaXMgbm90CisgKiBhbGxvd2VkIHRvIHNsZWVwLiAoSGVuY2UgdGhlIEdGUF9BVE9NSUMgYWxsb2NhdGlvbi4pCisgKi8KK3N0YXRpYyBpbnQgbnRmc19pbml0X2xvY2tlZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKnZpLCBudGZzX2F0dHIgKm5hKQoreworCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKHZpKTsKKworCXZpLT5pX2lubyA9IG5hLT5tZnRfbm87CisKKwluaS0+dHlwZSA9IG5hLT50eXBlOworCWlmIChuYS0+dHlwZSA9PSBBVF9JTkRFWF9BTExPQ0FUSU9OKQorCQlOSW5vU2V0TXN0UHJvdGVjdGVkKG5pKTsKKworCW5pLT5uYW1lID0gbmEtPm5hbWU7CisJbmktPm5hbWVfbGVuID0gbmEtPm5hbWVfbGVuOworCisJLyogSWYgaW5pdGlhbGl6aW5nIGEgbm9ybWFsIGlub2RlLCB3ZSBhcmUgZG9uZS4gKi8KKwlpZiAobGlrZWx5KG5hLT50eXBlID09IEFUX1VOVVNFRCkpIHsKKwkJQlVHX09OKG5hLT5uYW1lKTsKKwkJQlVHX09OKG5hLT5uYW1lX2xlbik7CisJCXJldHVybiAwOworCX0KKworCS8qIEl0IGlzIGEgZmFrZSBpbm9kZS4gKi8KKwlOSW5vU2V0QXR0cihuaSk7CisKKwkvKgorCSAqIFdlIGhhdmUgSTMwIGdsb2JhbCBjb25zdGFudCBhcyBhbiBvcHRpbWl6YXRpb24gYXMgaXQgaXMgdGhlIG5hbWUKKwkgKiBpbiA+OTkuOSUgb2YgbmFtZWQgYXR0cmlidXRlcyEgVGhlIG90aGVyIDwwLjElIGluY3VyIGEgR0ZQX0FUT01JQworCSAqIGFsbG9jYXRpb24gYnV0IHRoYXQgaXMgb2suIEFuZCBtb3N0IGF0dHJpYnV0ZXMgYXJlIHVubmFtZWQgYW55d2F5LAorCSAqIHRodXMgdGhlIGZyYWN0aW9uIG9mIG5hbWVkIGF0dHJpYnV0ZXMgd2l0aCBuYW1lICE9IEkzMCBpcyBhY3R1YWxseQorCSAqIGFic29sdXRlbHkgdGlueS4KKwkgKi8KKwlpZiAobmEtPm5hbWVfbGVuICYmIG5hLT5uYW1lICE9IEkzMCkgeworCQl1bnNpZ25lZCBpbnQgaTsKKworCQlCVUdfT04oIW5hLT5uYW1lKTsKKwkJaSA9IG5hLT5uYW1lX2xlbiAqIHNpemVvZihudGZzY2hhcik7CisJCW5pLT5uYW1lID0gKG50ZnNjaGFyKilrbWFsbG9jKGkgKyBzaXplb2YobnRmc2NoYXIpLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFuaS0+bmFtZSkKKwkJCXJldHVybiAtRU5PTUVNOworCQltZW1jcHkobmktPm5hbWUsIG5hLT5uYW1lLCBpKTsKKwkJbmktPm5hbWVbaV0gPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKwordHlwZWRlZiBpbnQgKCpzZXRfdCkoc3RydWN0IGlub2RlICosIHZvaWQgKik7CitzdGF0aWMgaW50IG50ZnNfcmVhZF9sb2NrZWRfaW5vZGUoc3RydWN0IGlub2RlICp2aSk7CitzdGF0aWMgaW50IG50ZnNfcmVhZF9sb2NrZWRfYXR0cl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmJhc2VfdmksIHN0cnVjdCBpbm9kZSAqdmkpOworc3RhdGljIGludCBudGZzX3JlYWRfbG9ja2VkX2luZGV4X2lub2RlKHN0cnVjdCBpbm9kZSAqYmFzZV92aSwKKwkJc3RydWN0IGlub2RlICp2aSk7CisKKy8qKgorICogbnRmc19pZ2V0IC0gb2J0YWluIGEgc3RydWN0IGlub2RlIGNvcnJlc3BvbmRpbmcgdG8gYSBzcGVjaWZpYyBub3JtYWwgaW5vZGUKKyAqIEBzYjoJCXN1cGVyIGJsb2NrIG9mIG1vdW50ZWQgdm9sdW1lCisgKiBAbWZ0X25vOgltZnQgcmVjb3JkIG51bWJlciAvIGlub2RlIG51bWJlciB0byBvYnRhaW4KKyAqCisgKiBPYnRhaW4gdGhlIHN0cnVjdCBpbm9kZSBjb3JyZXNwb25kaW5nIHRvIGEgc3BlY2lmaWMgbm9ybWFsIGlub2RlIChpLmUuIGEKKyAqIGZpbGUgb3IgZGlyZWN0b3J5KS4KKyAqCisgKiBJZiB0aGUgaW5vZGUgaXMgaW4gdGhlIGNhY2hlLCBpdCBpcyBqdXN0IHJldHVybmVkIHdpdGggYW4gaW5jcmVhc2VkCisgKiByZWZlcmVuY2UgY291bnQuIE90aGVyd2lzZSwgYSBuZXcgc3RydWN0IGlub2RlIGlzIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQsCisgKiBhbmQgZmluYWxseSBudGZzX3JlYWRfbG9ja2VkX2lub2RlKCkgaXMgY2FsbGVkIHRvIHJlYWQgaW4gdGhlIGlub2RlIGFuZAorICogZmlsbCBpbiB0aGUgcmVtYWluZGVyIG9mIHRoZSBpbm9kZSBzdHJ1Y3R1cmUuCisgKgorICogUmV0dXJuIHRoZSBzdHJ1Y3QgaW5vZGUgb24gc3VjY2Vzcy4gQ2hlY2sgdGhlIHJldHVybiB2YWx1ZSB3aXRoIElTX0VSUigpIGFuZAorICogaWYgdHJ1ZSwgdGhlIGZ1bmN0aW9uIGZhaWxlZCBhbmQgdGhlIGVycm9yIGNvZGUgaXMgb2J0YWluZWQgZnJvbSBQVFJfRVJSKCkuCisgKi8KK3N0cnVjdCBpbm9kZSAqbnRmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgbWZ0X25vKQoreworCXN0cnVjdCBpbm9kZSAqdmk7CisJbnRmc19hdHRyIG5hOworCWludCBlcnI7CisKKwluYS5tZnRfbm8gPSBtZnRfbm87CisJbmEudHlwZSA9IEFUX1VOVVNFRDsKKwluYS5uYW1lID0gTlVMTDsKKwluYS5uYW1lX2xlbiA9IDA7CisKKwl2aSA9IGlnZXQ1X2xvY2tlZChzYiwgbWZ0X25vLCAodGVzdF90KW50ZnNfdGVzdF9pbm9kZSwKKwkJCShzZXRfdCludGZzX2luaXRfbG9ja2VkX2lub2RlLCAmbmEpOworCWlmICghdmkpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZXJyID0gMDsKKworCS8qIElmIHRoaXMgaXMgYSBmcmVzaGx5IGFsbG9jYXRlZCBpbm9kZSwgbmVlZCB0byByZWFkIGl0IG5vdy4gKi8KKwlpZiAodmktPmlfc3RhdGUgJiBJX05FVykgeworCQllcnIgPSBudGZzX3JlYWRfbG9ja2VkX2lub2RlKHZpKTsKKwkJdW5sb2NrX25ld19pbm9kZSh2aSk7CisJfQorCS8qCisJICogVGhlcmUgaXMgbm8gcG9pbnQgaW4ga2VlcGluZyBiYWQgaW5vZGVzIGFyb3VuZCBpZiB0aGUgZmFpbHVyZSB3YXMKKwkgKiBkdWUgdG8gRU5PTUVNLiBXZSB3YW50IHRvIGJlIGFibGUgdG8gcmV0cnkgYWdhaW4gbGF0ZXIuCisJICovCisJaWYgKGVyciA9PSAtRU5PTUVNKSB7CisJCWlwdXQodmkpOworCQl2aSA9IEVSUl9QVFIoZXJyKTsKKwl9CisJcmV0dXJuIHZpOworfQorCisvKioKKyAqIG50ZnNfYXR0cl9pZ2V0IC0gb2J0YWluIGEgc3RydWN0IGlub2RlIGNvcnJlc3BvbmRpbmcgdG8gYW4gYXR0cmlidXRlCisgKiBAYmFzZV92aToJdmZzIGJhc2UgaW5vZGUgY29udGFpbmluZyB0aGUgYXR0cmlidXRlCisgKiBAdHlwZToJYXR0cmlidXRlIHR5cGUKKyAqIEBuYW1lOglVbmljb2RlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSAoTlVMTCBpZiB1bm5hbWVkKQorICogQG5hbWVfbGVuOglsZW5ndGggb2YgQG5hbWUgaW4gVW5pY29kZSBjaGFyYWN0ZXJzICgwIGlmIHVubmFtZWQpCisgKgorICogT2J0YWluIHRoZSAoZmFrZSkgc3RydWN0IGlub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGF0dHJpYnV0ZSBzcGVjaWZpZWQgYnkKKyAqIEB0eXBlLCBAbmFtZSwgYW5kIEBuYW1lX2xlbiwgd2hpY2ggaXMgcHJlc2VudCBpbiB0aGUgYmFzZSBtZnQgcmVjb3JkCisgKiBzcGVjaWZpZWQgYnkgdGhlIHZmcyBpbm9kZSBAYmFzZV92aS4KKyAqCisgKiBJZiB0aGUgYXR0cmlidXRlIGlub2RlIGlzIGluIHRoZSBjYWNoZSwgaXQgaXMganVzdCByZXR1cm5lZCB3aXRoIGFuCisgKiBpbmNyZWFzZWQgcmVmZXJlbmNlIGNvdW50LiBPdGhlcndpc2UsIGEgbmV3IHN0cnVjdCBpbm9kZSBpcyBhbGxvY2F0ZWQgYW5kCisgKiBpbml0aWFsaXplZCwgYW5kIGZpbmFsbHkgbnRmc19yZWFkX2xvY2tlZF9hdHRyX2lub2RlKCkgaXMgY2FsbGVkIHRvIHJlYWQgdGhlCisgKiBhdHRyaWJ1dGUgYW5kIGZpbGwgaW4gdGhlIGlub2RlIHN0cnVjdHVyZS4KKyAqCisgKiBOb3RlLCBmb3IgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGVzLCB5b3UgbmVlZCB0byB1c2UgbnRmc19pbmRleF9pZ2V0KCkKKyAqIGluc3RlYWQgb2YgbnRmc19hdHRyX2lnZXQoKSBhcyB3b3JraW5nIHdpdGggaW5kaWNlcyBpcyBhIGxvdCBtb3JlIGNvbXBsZXguCisgKgorICogUmV0dXJuIHRoZSBzdHJ1Y3QgaW5vZGUgb2YgdGhlIGF0dHJpYnV0ZSBpbm9kZSBvbiBzdWNjZXNzLiBDaGVjayB0aGUgcmV0dXJuCisgKiB2YWx1ZSB3aXRoIElTX0VSUigpIGFuZCBpZiB0cnVlLCB0aGUgZnVuY3Rpb24gZmFpbGVkIGFuZCB0aGUgZXJyb3IgY29kZSBpcworICogb2J0YWluZWQgZnJvbSBQVFJfRVJSKCkuCisgKi8KK3N0cnVjdCBpbm9kZSAqbnRmc19hdHRyX2lnZXQoc3RydWN0IGlub2RlICpiYXNlX3ZpLCBBVFRSX1RZUEUgdHlwZSwKKwkJbnRmc2NoYXIgKm5hbWUsIHUzMiBuYW1lX2xlbikKK3sKKwlzdHJ1Y3QgaW5vZGUgKnZpOworCW50ZnNfYXR0ciBuYTsKKwlpbnQgZXJyOworCisJLyogTWFrZSBzdXJlIG5vIG9uZSBjYWxscyBudGZzX2F0dHJfaWdldCgpIGZvciBpbmRpY2VzLiAqLworCUJVR19PTih0eXBlID09IEFUX0lOREVYX0FMTE9DQVRJT04pOworCisJbmEubWZ0X25vID0gYmFzZV92aS0+aV9pbm87CisJbmEudHlwZSA9IHR5cGU7CisJbmEubmFtZSA9IG5hbWU7CisJbmEubmFtZV9sZW4gPSBuYW1lX2xlbjsKKworCXZpID0gaWdldDVfbG9ja2VkKGJhc2VfdmktPmlfc2IsIG5hLm1mdF9ubywgKHRlc3RfdCludGZzX3Rlc3RfaW5vZGUsCisJCQkoc2V0X3QpbnRmc19pbml0X2xvY2tlZF9pbm9kZSwgJm5hKTsKKwlpZiAoIXZpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWVyciA9IDA7CisKKwkvKiBJZiB0aGlzIGlzIGEgZnJlc2hseSBhbGxvY2F0ZWQgaW5vZGUsIG5lZWQgdG8gcmVhZCBpdCBub3cuICovCisJaWYgKHZpLT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJZXJyID0gbnRmc19yZWFkX2xvY2tlZF9hdHRyX2lub2RlKGJhc2VfdmksIHZpKTsKKwkJdW5sb2NrX25ld19pbm9kZSh2aSk7CisJfQorCS8qCisJICogVGhlcmUgaXMgbm8gcG9pbnQgaW4ga2VlcGluZyBiYWQgYXR0cmlidXRlIGlub2RlcyBhcm91bmQuIFRoaXMgYWxzbworCSAqIHNpbXBsaWZpZXMgdGhpbmdzIGluIHRoYXQgd2UgbmV2ZXIgbmVlZCB0byBjaGVjayBmb3IgYmFkIGF0dHJpYnV0ZQorCSAqIGlub2RlcyBlbHNld2hlcmUuCisJICovCisJaWYgKGVycikgeworCQlpcHV0KHZpKTsKKwkJdmkgPSBFUlJfUFRSKGVycik7CisJfQorCXJldHVybiB2aTsKK30KKworLyoqCisgKiBudGZzX2luZGV4X2lnZXQgLSBvYnRhaW4gYSBzdHJ1Y3QgaW5vZGUgY29ycmVzcG9uZGluZyB0byBhbiBpbmRleAorICogQGJhc2Vfdmk6CXZmcyBiYXNlIGlub2RlIGNvbnRhaW5pbmcgdGhlIGluZGV4IHJlbGF0ZWQgYXR0cmlidXRlcworICogQG5hbWU6CVVuaWNvZGUgbmFtZSBvZiB0aGUgaW5kZXgKKyAqIEBuYW1lX2xlbjoJbGVuZ3RoIG9mIEBuYW1lIGluIFVuaWNvZGUgY2hhcmFjdGVycworICoKKyAqIE9idGFpbiB0aGUgKGZha2UpIHN0cnVjdCBpbm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbmRleCBzcGVjaWZpZWQgYnkgQG5hbWUKKyAqIGFuZCBAbmFtZV9sZW4sIHdoaWNoIGlzIHByZXNlbnQgaW4gdGhlIGJhc2UgbWZ0IHJlY29yZCBzcGVjaWZpZWQgYnkgdGhlIHZmcworICogaW5vZGUgQGJhc2VfdmkuCisgKgorICogSWYgdGhlIGluZGV4IGlub2RlIGlzIGluIHRoZSBjYWNoZSwgaXQgaXMganVzdCByZXR1cm5lZCB3aXRoIGFuIGluY3JlYXNlZAorICogcmVmZXJlbmNlIGNvdW50LiAgT3RoZXJ3aXNlLCBhIG5ldyBzdHJ1Y3QgaW5vZGUgaXMgYWxsb2NhdGVkIGFuZAorICogaW5pdGlhbGl6ZWQsIGFuZCBmaW5hbGx5IG50ZnNfcmVhZF9sb2NrZWRfaW5kZXhfaW5vZGUoKSBpcyBjYWxsZWQgdG8gcmVhZAorICogdGhlIGluZGV4IHJlbGF0ZWQgYXR0cmlidXRlcyBhbmQgZmlsbCBpbiB0aGUgaW5vZGUgc3RydWN0dXJlLgorICoKKyAqIFJldHVybiB0aGUgc3RydWN0IGlub2RlIG9mIHRoZSBpbmRleCBpbm9kZSBvbiBzdWNjZXNzLiBDaGVjayB0aGUgcmV0dXJuCisgKiB2YWx1ZSB3aXRoIElTX0VSUigpIGFuZCBpZiB0cnVlLCB0aGUgZnVuY3Rpb24gZmFpbGVkIGFuZCB0aGUgZXJyb3IgY29kZSBpcworICogb2J0YWluZWQgZnJvbSBQVFJfRVJSKCkuCisgKi8KK3N0cnVjdCBpbm9kZSAqbnRmc19pbmRleF9pZ2V0KHN0cnVjdCBpbm9kZSAqYmFzZV92aSwgbnRmc2NoYXIgKm5hbWUsCisJCXUzMiBuYW1lX2xlbikKK3sKKwlzdHJ1Y3QgaW5vZGUgKnZpOworCW50ZnNfYXR0ciBuYTsKKwlpbnQgZXJyOworCisJbmEubWZ0X25vID0gYmFzZV92aS0+aV9pbm87CisJbmEudHlwZSA9IEFUX0lOREVYX0FMTE9DQVRJT047CisJbmEubmFtZSA9IG5hbWU7CisJbmEubmFtZV9sZW4gPSBuYW1lX2xlbjsKKworCXZpID0gaWdldDVfbG9ja2VkKGJhc2VfdmktPmlfc2IsIG5hLm1mdF9ubywgKHRlc3RfdCludGZzX3Rlc3RfaW5vZGUsCisJCQkoc2V0X3QpbnRmc19pbml0X2xvY2tlZF9pbm9kZSwgJm5hKTsKKwlpZiAoIXZpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWVyciA9IDA7CisKKwkvKiBJZiB0aGlzIGlzIGEgZnJlc2hseSBhbGxvY2F0ZWQgaW5vZGUsIG5lZWQgdG8gcmVhZCBpdCBub3cuICovCisJaWYgKHZpLT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJZXJyID0gbnRmc19yZWFkX2xvY2tlZF9pbmRleF9pbm9kZShiYXNlX3ZpLCB2aSk7CisJCXVubG9ja19uZXdfaW5vZGUodmkpOworCX0KKwkvKgorCSAqIFRoZXJlIGlzIG5vIHBvaW50IGluIGtlZXBpbmcgYmFkIGluZGV4IGlub2RlcyBhcm91bmQuICBUaGlzIGFsc28KKwkgKiBzaW1wbGlmaWVzIHRoaW5ncyBpbiB0aGF0IHdlIG5ldmVyIG5lZWQgdG8gY2hlY2sgZm9yIGJhZCBpbmRleAorCSAqIGlub2RlcyBlbHNld2hlcmUuCisJICovCisJaWYgKGVycikgeworCQlpcHV0KHZpKTsKKwkJdmkgPSBFUlJfUFRSKGVycik7CisJfQorCXJldHVybiB2aTsKK30KKworc3RydWN0IGlub2RlICpudGZzX2FsbG9jX2JpZ19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCW50ZnNfaW5vZGUgKm5pOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJbmkgPSAobnRmc19pbm9kZSAqKWttZW1fY2FjaGVfYWxsb2MobnRmc19iaWdfaW5vZGVfY2FjaGUsCisJCQlTTEFCX05PRlMpOworCWlmIChsaWtlbHkobmkgIT0gTlVMTCkpIHsKKwkJbmktPnN0YXRlID0gMDsKKwkJcmV0dXJuIFZGU19JKG5pKTsKKwl9CisJbnRmc19lcnJvcihzYiwgIkFsbG9jYXRpb24gb2YgTlRGUyBiaWcgaW5vZGUgc3RydWN0dXJlIGZhaWxlZC4iKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBudGZzX2Rlc3Ryb3lfYmlnX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJbnRmc19pbm9kZSAqbmkgPSBOVEZTX0koaW5vZGUpOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJQlVHX09OKG5pLT5wYWdlKTsKKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJm5pLT5jb3VudCkpCisJCUJVRygpOworCWttZW1fY2FjaGVfZnJlZShudGZzX2JpZ19pbm9kZV9jYWNoZSwgTlRGU19JKGlub2RlKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbnRmc19pbm9kZSAqbnRmc19hbGxvY19leHRlbnRfaW5vZGUodm9pZCkKK3sKKwludGZzX2lub2RlICpuaTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCW5pID0gKG50ZnNfaW5vZGUgKilrbWVtX2NhY2hlX2FsbG9jKG50ZnNfaW5vZGVfY2FjaGUsIFNMQUJfTk9GUyk7CisJaWYgKGxpa2VseShuaSAhPSBOVUxMKSkgeworCQluaS0+c3RhdGUgPSAwOworCQlyZXR1cm4gbmk7CisJfQorCW50ZnNfZXJyb3IoTlVMTCwgIkFsbG9jYXRpb24gb2YgTlRGUyBpbm9kZSBzdHJ1Y3R1cmUgZmFpbGVkLiIpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBudGZzX2Rlc3Ryb3lfZXh0ZW50X2lub2RlKG50ZnNfaW5vZGUgKm5pKQoreworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCUJVR19PTihuaS0+cGFnZSk7CisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZuaS0+Y291bnQpKQorCQlCVUcoKTsKKwlrbWVtX2NhY2hlX2ZyZWUobnRmc19pbm9kZV9jYWNoZSwgbmkpOworfQorCisvKioKKyAqIF9fbnRmc19pbml0X2lub2RlIC0gaW5pdGlhbGl6ZSBudGZzIHNwZWNpZmljIHBhcnQgb2YgYW4gaW5vZGUKKyAqIEBzYjoJCXN1cGVyIGJsb2NrIG9mIG1vdW50ZWQgdm9sdW1lCisgKiBAbmk6CQlmcmVzaGx5IGFsbG9jYXRlZCBudGZzIGlub2RlIHdoaWNoIHRvIGluaXRpYWxpemUKKyAqCisgKiBJbml0aWFsaXplIGFuIG50ZnMgaW5vZGUgdG8gZGVmYXVsdHMuCisgKgorICogTk9URTogbmktPm1mdF9ubywgbmktPnN0YXRlLCBuaS0+dHlwZSwgbmktPm5hbWUsIGFuZCBuaS0+bmFtZV9sZW4gYXJlIGxlZnQKKyAqIHVudG91Y2hlZC4gTWFrZSBzdXJlIHRvIGluaXRpYWxpemUgdGhlbSBlbHNld2hlcmUuCisgKgorICogUmV0dXJuIHplcm8gb24gc3VjY2VzcyBhbmQgLUVOT01FTSBvbiBlcnJvci4KKyAqLwordm9pZCBfX250ZnNfaW5pdF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBudGZzX2lub2RlICpuaSkKK3sKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwluaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA9IDA7CisJbmktPnNlcV9ubyA9IDA7CisJYXRvbWljX3NldCgmbmktPmNvdW50LCAxKTsKKwluaS0+dm9sID0gTlRGU19TQihzYik7CisJbnRmc19pbml0X3J1bmxpc3QoJm5pLT5ydW5saXN0KTsKKwlpbml0X01VVEVYKCZuaS0+bXJlY19sb2NrKTsKKwluaS0+cGFnZSA9IE5VTEw7CisJbmktPnBhZ2Vfb2ZzID0gMDsKKwluaS0+YXR0cl9saXN0X3NpemUgPSAwOworCW5pLT5hdHRyX2xpc3QgPSBOVUxMOworCW50ZnNfaW5pdF9ydW5saXN0KCZuaS0+YXR0cl9saXN0X3JsKTsKKwluaS0+aXR5cGUuaW5kZXguYm1wX2lubyA9IE5VTEw7CisJbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUgPSAwOworCW5pLT5pdHlwZS5pbmRleC52Y25fc2l6ZSA9IDA7CisJbmktPml0eXBlLmluZGV4LmNvbGxhdGlvbl9ydWxlID0gMDsKKwluaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZV9iaXRzID0gMDsKKwluaS0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cyA9IDA7CisJaW5pdF9NVVRFWCgmbmktPmV4dGVudF9sb2NrKTsKKwluaS0+bnJfZXh0ZW50cyA9IDA7CisJbmktPmV4dC5iYXNlX250ZnNfaW5vID0gTlVMTDsKK30KKworaW5saW5lIG50ZnNfaW5vZGUgKm50ZnNfbmV3X2V4dGVudF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQl1bnNpZ25lZCBsb25nIG1mdF9ubykKK3sKKwludGZzX2lub2RlICpuaSA9IG50ZnNfYWxsb2NfZXh0ZW50X2lub2RlKCk7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlpZiAobGlrZWx5KG5pICE9IE5VTEwpKSB7CisJCV9fbnRmc19pbml0X2lub2RlKHNiLCBuaSk7CisJCW5pLT5tZnRfbm8gPSBtZnRfbm87CisJCW5pLT50eXBlID0gQVRfVU5VU0VEOworCQluaS0+bmFtZSA9IE5VTEw7CisJCW5pLT5uYW1lX2xlbiA9IDA7CisJfQorCXJldHVybiBuaTsKK30KKworLyoqCisgKiBudGZzX2lzX2V4dGVuZGVkX3N5c3RlbV9maWxlIC0gY2hlY2sgaWYgYSBmaWxlIGlzIGluIHRoZSAkRXh0ZW5kIGRpcmVjdG9yeQorICogQGN0eDoJaW5pdGlhbGl6ZWQgYXR0cmlidXRlIHNlYXJjaCBjb250ZXh0CisgKgorICogU2VhcmNoIGFsbCBmaWxlIG5hbWUgYXR0cmlidXRlcyBpbiB0aGUgaW5vZGUgZGVzY3JpYmVkIGJ5IHRoZSBhdHRyaWJ1dGUKKyAqIHNlYXJjaCBjb250ZXh0IEBjdHggYW5kIGNoZWNrIGlmIGFueSBvZiB0aGUgbmFtZXMgYXJlIGluIHRoZSAkRXh0ZW5kIHN5c3RlbQorICogZGlyZWN0b3J5LgorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKgkgICAxOiBmaWxlIGlzIGluICRFeHRlbmQgZGlyZWN0b3J5CisgKgkgICAwOiBmaWxlIGlzIG5vdCBpbiAkRXh0ZW5kIGRpcmVjdG9yeQorICogICAgLWVycm5vOiBmYWlsZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmaWxlIGlzIGluIHRoZSAkRXh0ZW5kIGRpcmVjdG9yeQorICovCitzdGF0aWMgaW50IG50ZnNfaXNfZXh0ZW5kZWRfc3lzdGVtX2ZpbGUobnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eCkKK3sKKwlpbnQgbnJfbGlua3MsIGVycjsKKworCS8qIFJlc3RhcnQgc2VhcmNoLiAqLworCW50ZnNfYXR0cl9yZWluaXRfc2VhcmNoX2N0eChjdHgpOworCisJLyogR2V0IG51bWJlciBvZiBoYXJkIGxpbmtzLiAqLworCW5yX2xpbmtzID0gbGUxNl90b19jcHUoY3R4LT5tcmVjLT5saW5rX2NvdW50KTsKKworCS8qIExvb3AgdGhyb3VnaCBhbGwgaGFyZCBsaW5rcy4gKi8KKwl3aGlsZSAoIShlcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX0ZJTEVfTkFNRSwgTlVMTCwgMCwgMCwgMCwgTlVMTCwgMCwKKwkJCWN0eCkpKSB7CisJCUZJTEVfTkFNRV9BVFRSICpmaWxlX25hbWVfYXR0cjsKKwkJQVRUUl9SRUNPUkQgKmF0dHIgPSBjdHgtPmF0dHI7CisJCXU4ICpwLCAqcDI7CisKKwkJbnJfbGlua3MtLTsKKwkJLyoKKwkJICogTWF4aW11bSBzYW5pdHkgY2hlY2tpbmcgYXMgd2UgYXJlIGNhbGxlZCBvbiBhbiBpbm9kZSB0aGF0CisJCSAqIHdlIHN1c3BlY3QgbWlnaHQgYmUgY29ycnVwdC4KKwkJICovCisJCXAgPSAodTgqKWF0dHIgKyBsZTMyX3RvX2NwdShhdHRyLT5sZW5ndGgpOworCQlpZiAocCA8ICh1OCopY3R4LT5tcmVjIHx8ICh1OCopcCA+ICh1OCopY3R4LT5tcmVjICsKKwkJCQlsZTMyX3RvX2NwdShjdHgtPm1yZWMtPmJ5dGVzX2luX3VzZSkpIHsKK2Vycl9jb3JydXB0X2F0dHI6CisJCQludGZzX2Vycm9yKGN0eC0+bnRmc19pbm8tPnZvbC0+c2IsICJDb3JydXB0IGZpbGUgbmFtZSAiCisJCQkJCSJhdHRyaWJ1dGUuIFlvdSBzaG91bGQgcnVuIGNoa2Rzay4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWlmIChhdHRyLT5ub25fcmVzaWRlbnQpIHsKKwkJCW50ZnNfZXJyb3IoY3R4LT5udGZzX2luby0+dm9sLT5zYiwgIk5vbi1yZXNpZGVudCBmaWxlICIKKwkJCQkJIm5hbWUuIFlvdSBzaG91bGQgcnVuIGNoa2Rzay4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWlmIChhdHRyLT5mbGFncykgeworCQkJbnRmc19lcnJvcihjdHgtPm50ZnNfaW5vLT52b2wtPnNiLCAiRmlsZSBuYW1lIHdpdGggIgorCQkJCQkiaW52YWxpZCBmbGFncy4gWW91IHNob3VsZCBydW4gIgorCQkJCQkiY2hrZHNrLiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJaWYgKCEoYXR0ci0+ZGF0YS5yZXNpZGVudC5mbGFncyAmIFJFU0lERU5UX0FUVFJfSVNfSU5ERVhFRCkpIHsKKwkJCW50ZnNfZXJyb3IoY3R4LT5udGZzX2luby0+dm9sLT5zYiwgIlVuaW5kZXhlZCBmaWxlICIKKwkJCQkJIm5hbWUuIFlvdSBzaG91bGQgcnVuIGNoa2Rzay4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWZpbGVfbmFtZV9hdHRyID0gKEZJTEVfTkFNRV9BVFRSKikoKHU4KilhdHRyICsKKwkJCQlsZTE2X3RvX2NwdShhdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpOworCQlwMiA9ICh1OCopYXR0ciArIGxlMzJfdG9fY3B1KGF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwkJaWYgKHAyIDwgKHU4KilhdHRyIHx8IHAyID4gcCkKKwkJCWdvdG8gZXJyX2NvcnJ1cHRfYXR0cjsKKwkJLyogVGhpcyBhdHRyaWJ1dGUgaXMgb2ssIGJ1dCBpcyBpdCBpbiB0aGUgJEV4dGVuZCBkaXJlY3Rvcnk/ICovCisJCWlmIChNUkVGX0xFKGZpbGVfbmFtZV9hdHRyLT5wYXJlbnRfZGlyZWN0b3J5KSA9PSBGSUxFX0V4dGVuZCkKKwkJCXJldHVybiAxOwkvKiBZRVMsIGl0J3MgYW4gZXh0ZW5kZWQgc3lzdGVtIGZpbGUuICovCisJfQorCWlmICh1bmxpa2VseShlcnIgIT0gLUVOT0VOVCkpCisJCXJldHVybiBlcnI7CisJaWYgKHVubGlrZWx5KG5yX2xpbmtzKSkgeworCQludGZzX2Vycm9yKGN0eC0+bnRmc19pbm8tPnZvbC0+c2IsICJJbm9kZSBoYXJkIGxpbmsgY291bnQgIgorCQkJCSJkb2Vzbid0IG1hdGNoIG51bWJlciBvZiBuYW1lIGF0dHJpYnV0ZXMuIFlvdSAiCisJCQkJInNob3VsZCBydW4gY2hrZHNrLiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7CS8qIE5PLCBpdCBpcyBub3QgYW4gZXh0ZW5kZWQgc3lzdGVtIGZpbGUuICovCit9CisKKy8qKgorICogbnRmc19yZWFkX2xvY2tlZF9pbm9kZSAtIHJlYWQgYW4gaW5vZGUgZnJvbSBpdHMgZGV2aWNlCisgKiBAdmk6CQlpbm9kZSB0byByZWFkCisgKgorICogbnRmc19yZWFkX2xvY2tlZF9pbm9kZSgpIGlzIGNhbGxlZCBmcm9tIG50ZnNfaWdldCgpIHRvIHJlYWQgdGhlIGlub2RlCisgKiBkZXNjcmliZWQgYnkgQHZpIGludG8gbWVtb3J5IGZyb20gdGhlIGRldmljZS4KKyAqCisgKiBUaGUgb25seSBmaWVsZHMgaW4gQHZpIHRoYXQgd2UgbmVlZCB0by9jYW4gbG9vayBhdCB3aGVuIHRoZSBmdW5jdGlvbiBpcworICogY2FsbGVkIGFyZSBpX3NiLCBwb2ludGluZyB0byB0aGUgbW91bnRlZCBkZXZpY2UncyBzdXBlciBibG9jaywgYW5kIGlfaW5vLAorICogdGhlIG51bWJlciBvZiB0aGUgaW5vZGUgdG8gbG9hZC4KKyAqCisgKiBudGZzX3JlYWRfbG9ja2VkX2lub2RlKCkgbWFwcywgcGlucyBhbmQgbG9ja3MgdGhlIG1mdCByZWNvcmQgbnVtYmVyIGlfaW5vCisgKiBmb3IgcmVhZGluZyBhbmQgc2V0cyB1cCB0aGUgbmVjZXNzYXJ5IEB2aSBmaWVsZHMgYXMgd2VsbCBhcyBpbml0aWFsaXppbmcKKyAqIHRoZSBudGZzIGlub2RlLgorICoKKyAqIFE6IFdoYXQgbG9ja3MgYXJlIGhlbGQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkPworICogQTogaV9zdGF0ZSBoYXMgSV9MT0NLIHNldCwgaGVuY2UgdGhlIGlub2RlIGlzIGxvY2tlZCwgYWxzbworICogICAgaV9jb3VudCBpcyBzZXQgdG8gMSwgc28gaXQgaXMgbm90IGdvaW5nIHRvIGdvIGF3YXkKKyAqICAgIGlfZmxhZ3MgaXMgc2V0IHRvIDAgYW5kIHdlIGhhdmUgbm8gYnVzaW5lc3MgdG91Y2hpbmcgaXQuICBPbmx5IGFuIGlvY3RsKCkKKyAqICAgIGlzIGFsbG93ZWQgdG8gd3JpdGUgdG8gdGhlbS4gV2Ugc2hvdWxkIG9mIGNvdXJzZSBiZSBob25vdXJpbmcgdGhlbSBidXQKKyAqICAgIHdlIG5lZWQgdG8gZG8gdGhhdCB1c2luZyB0aGUgSVNfKiBtYWNyb3MgZGVmaW5lZCBpbiBpbmNsdWRlL2xpbnV4L2ZzLmguCisgKiAgICBJbiBhbnkgY2FzZSBudGZzX3JlYWRfbG9ja2VkX2lub2RlKCkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBpX2ZsYWdzLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4gIEluIHRoZSBlcnJvciBjYXNlLCB0aGUgaW5vZGUgd2lsbAorICogaGF2ZSBoYWQgbWFrZV9iYWRfaW5vZGUoKSBleGVjdXRlZCBvbiBpdC4KKyAqLworc3RhdGljIGludCBudGZzX3JlYWRfbG9ja2VkX2lub2RlKHN0cnVjdCBpbm9kZSAqdmkpCit7CisJbnRmc192b2x1bWUgKnZvbCA9IE5URlNfU0IodmktPmlfc2IpOworCW50ZnNfaW5vZGUgKm5pOworCU1GVF9SRUNPUkQgKm07CisJU1RBTkRBUkRfSU5GT1JNQVRJT04gKnNpOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJaW50IGVyciA9IDA7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaV9pbm8gMHglbHguIiwgdmktPmlfaW5vKTsKKworCS8qIFNldHVwIHRoZSBnZW5lcmljIHZmcyBpbm9kZSBwYXJ0cyBub3cuICovCisKKwkvKiBUaGlzIGlzIHRoZSBvcHRpbWFsIElPIHNpemUgKGZvciBzdGF0KSwgbm90IHRoZSBmcyBibG9jayBzaXplLiAqLworCXZpLT5pX2Jsa3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJLyoKKwkgKiBUaGlzIGlzIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGlub2RlIGhhcyBjaGFuZ2VkIHcuci50LiBhIGZpbGUgc28KKwkgKiB0aGF0IHRoZSBmaWxlIGNhbiBiZSB1cGRhdGVkIGlmIG5lY2Vzc2FyeSAoY29tcGFyZSB3aXRoIGZfdmVyc2lvbikuCisJICovCisJdmktPmlfdmVyc2lvbiA9IDE7CisKKwl2aS0+aV91aWQgPSB2b2wtPnVpZDsKKwl2aS0+aV9naWQgPSB2b2wtPmdpZDsKKwl2aS0+aV9tb2RlID0gMDsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgbnRmcyBzcGVjaWZpYyBwYXJ0IG9mIEB2aSBzcGVjaWFsIGNhc2luZworCSAqIEZJTEVfTUZUIHdoaWNoIHdlIG5lZWQgdG8gZG8gYXQgbW91bnQgdGltZS4KKwkgKi8KKwlpZiAodmktPmlfaW5vICE9IEZJTEVfTUZUKQorCQludGZzX2luaXRfYmlnX2lub2RlKHZpKTsKKwluaSA9IE5URlNfSSh2aSk7CisKKwltID0gbWFwX21mdF9yZWNvcmQobmkpOworCWlmIChJU19FUlIobSkpIHsKKwkJZXJyID0gUFRSX0VSUihtKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgobmksIG0pOworCWlmICghY3R4KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCisJaWYgKCEobS0+ZmxhZ3MgJiBNRlRfUkVDT1JEX0lOX1VTRSkpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIklub2RlIGlzIG5vdCBpbiB1c2UhIik7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWlmIChtLT5iYXNlX21mdF9yZWNvcmQpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIklub2RlIGlzIGFuIGV4dGVudCBpbm9kZSEiKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisKKwkvKiBUcmFuc2ZlciBpbmZvcm1hdGlvbiBmcm9tIG1mdCByZWNvcmQgaW50byB2ZnMgYW5kIG50ZnMgaW5vZGVzLiAqLworCXZpLT5pX2dlbmVyYXRpb24gPSBuaS0+c2VxX25vID0gbGUxNl90b19jcHUobS0+c2VxdWVuY2VfbnVtYmVyKTsKKworCS8qCisJICogRklYTUU6IEtlZXAgaW4gbWluZCB0aGF0IGxpbmtfY291bnQgaXMgdHdvIGZvciBmaWxlcyB3aGljaCBoYXZlIGJvdGgKKwkgKiBhIGxvbmcgZmlsZSBuYW1lIGFuZCBhIHNob3J0IGZpbGUgbmFtZSBhcyBzZXBhcmF0ZSBlbnRyaWVzLCBzbyBpZgorCSAqIHdlIGFyZSBoaWRpbmcgc2hvcnQgZmlsZSBuYW1lcyB0aGlzIHdpbGwgYmUgdG9vIGhpZ2guIEVpdGhlciB3ZSBuZWVkCisJICogdG8gYWNjb3VudCBmb3IgdGhlIHNob3J0IGZpbGUgbmFtZXMgYnkgc3VidHJhY3RpbmcgdGhlbSBvciB3ZSBuZWVkCisJICogdG8gbWFrZSBzdXJlIHdlIGRlbGV0ZSBmaWxlcyBldmVuIHRob3VnaCBpX25saW5rIGlzIG5vdCB6ZXJvIHdoaWNoCisJICogbWlnaHQgYmUgdHJpY2t5IGR1ZSB0byB2ZnMgaW50ZXJhY3Rpb25zLiBOZWVkIHRvIHRoaW5rIGFib3V0IHRoaXMKKwkgKiBzb21lIG1vcmUgd2hlbiBpbXBsZW1lbnRpbmcgdGhlIHVubGluayBjb21tYW5kLgorCSAqLworCXZpLT5pX25saW5rID0gbGUxNl90b19jcHUobS0+bGlua19jb3VudCk7CisJLyoKKwkgKiBGSVhNRTogUmVwYXJzZSBwb2ludHMgY2FuIGhhdmUgdGhlIGRpcmVjdG9yeSBiaXQgc2V0IGV2ZW4gdGhvdWdoCisJICogdGhleSB3b3VsZCBiZSBTX0lGTE5LLiBOZWVkIHRvIGRlYWwgd2l0aCB0aGlzIGZ1cnRoZXIgYmVsb3cgd2hlbiB3ZQorCSAqIGltcGxlbWVudCByZXBhcnNlIHBvaW50cyAvIHN5bWJvbGljIGxpbmtzIGJ1dCBpdCB3aWxsIGRvIGZvciBub3cuCisJICogQWxzbyBpZiBub3QgYSBkaXJlY3RvcnksIGl0IGNvdWxkIGJlIHNvbWV0aGluZyBlbHNlLCByYXRoZXIgdGhhbgorCSAqIGEgcmVndWxhciBmaWxlLiBCdXQgYWdhaW4sIHdpbGwgZG8gZm9yIG5vdy4KKwkgKi8KKwkvKiBFdmVyeW9uZSBnZXRzIGFsbCBwZXJtaXNzaW9ucy4gKi8KKwl2aS0+aV9tb2RlIHw9IFNfSVJXWFVHTzsKKwkvKiBJZiByZWFkLW9ubHksIG5vb25lIGdldHMgd3JpdGUgcGVybWlzc2lvbnMuICovCisJaWYgKElTX1JET05MWSh2aSkpCisJCXZpLT5pX21vZGUgJj0gflNfSVdVR087CisJaWYgKG0tPmZsYWdzICYgTUZUX1JFQ09SRF9JU19ESVJFQ1RPUlkpIHsKKwkJdmktPmlfbW9kZSB8PSBTX0lGRElSOworCQkvKgorCQkgKiBBcHBseSB0aGUgZGlyZWN0b3J5IHBlcm1pc3Npb25zIG1hc2sgc2V0IGluIHRoZSBtb3VudAorCQkgKiBvcHRpb25zLgorCQkgKi8KKwkJdmktPmlfbW9kZSAmPSB+dm9sLT5kbWFzazsKKwkJLyogVGhpbmdzIGJyZWFrIHdpdGhvdXQgdGhpcyBrbHVkZ2UhICovCisJCWlmICh2aS0+aV9ubGluayA+IDEpCisJCQl2aS0+aV9ubGluayA9IDE7CisJfSBlbHNlIHsKKwkJdmktPmlfbW9kZSB8PSBTX0lGUkVHOworCQkvKiBBcHBseSB0aGUgZmlsZSBwZXJtaXNzaW9ucyBtYXNrIHNldCBpbiB0aGUgbW91bnQgb3B0aW9ucy4gKi8KKwkJdmktPmlfbW9kZSAmPSB+dm9sLT5mbWFzazsKKwl9CisJLyoKKwkgKiBGaW5kIHRoZSBzdGFuZGFyZCBpbmZvcm1hdGlvbiBhdHRyaWJ1dGUgaW4gdGhlIG1mdCByZWNvcmQuIEF0IHRoaXMKKwkgKiBzdGFnZSB3ZSBoYXZlbid0IHNldHVwIHRoZSBhdHRyaWJ1dGUgbGlzdCBzdHVmZiB5ZXQsIHNvIHRoaXMgY291bGQKKwkgKiBpbiBmYWN0IGZhaWwgaWYgdGhlIHN0YW5kYXJkIGluZm9ybWF0aW9uIGlzIGluIGFuIGV4dGVudCByZWNvcmQsIGJ1dAorCSAqIEkgZG9uJ3QgdGhpbmsgdGhpcyBhY3R1YWxseSBldmVyIGhhcHBlbnMuCisJICovCisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9TVEFOREFSRF9JTkZPUk1BVElPTiwgTlVMTCwgMCwgMCwgMCwgTlVMTCwgMCwKKwkJCWN0eCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJaWYgKGVyciA9PSAtRU5PRU5UKSB7CisJCQkvKgorCQkJICogVE9ETzogV2Ugc2hvdWxkIGJlIHBlcmZvcm1pbmcgYSBob3QgZml4IGhlcmUgKGlmIHRoZQorCQkJICogcmVjb3ZlciBtb3VudCBvcHRpb24gaXMgc2V0KSBieSBjcmVhdGluZyBhIG5ldworCQkJICogYXR0cmlidXRlLgorCQkJICovCisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJFNUQU5EQVJEX0lORk9STUFUSU9OIGF0dHJpYnV0ZSAiCisJCQkJCSJpcyBtaXNzaW5nLiIpOworCQl9CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCS8qIEdldCB0aGUgc3RhbmRhcmQgaW5mb3JtYXRpb24gYXR0cmlidXRlIHZhbHVlLiAqLworCXNpID0gKFNUQU5EQVJEX0lORk9STUFUSU9OKikoKGNoYXIqKWN0eC0+YXR0ciArCisJCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSk7CisKKwkvKiBUcmFuc2ZlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdGFuZGFyZCBpbmZvcm1hdGlvbiBpbnRvIHZpLiAqLworCS8qCisJICogTm90ZTogVGhlIGlfP3RpbWVzIGRvIG5vdCBxdWl0ZSBtYXAgcGVyZmVjdGx5IG9udG8gdGhlIE5URlMgdGltZXMsCisJICogYnV0IHRoZXkgYXJlIGNsb3NlIGVub3VnaCwgYW5kIGluIHRoZSBlbmQgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyCisJICogdGhhdCBtdWNoLi4uCisJICovCisJLyoKKwkgKiBtdGltZSBpcyB0aGUgbGFzdCBjaGFuZ2Ugb2YgdGhlIGRhdGEgd2l0aGluIHRoZSBmaWxlLiBOb3QgY2hhbmdlZAorCSAqIHdoZW4gb25seSBtZXRhZGF0YSBpcyBjaGFuZ2VkLCBlLmcuIGEgcmVuYW1lIGRvZXNuJ3QgYWZmZWN0IG10aW1lLgorCSAqLworCXZpLT5pX210aW1lID0gbnRmczJ1dGMoc2ktPmxhc3RfZGF0YV9jaGFuZ2VfdGltZSk7CisJLyoKKwkgKiBjdGltZSBpcyB0aGUgbGFzdCBjaGFuZ2Ugb2YgdGhlIG1ldGFkYXRhIG9mIHRoZSBmaWxlLiBUaGlzIG9idmlvdXNseQorCSAqIGFsd2F5cyBjaGFuZ2VzLCB3aGVuIG10aW1lIGlzIGNoYW5nZWQuIGN0aW1lIGNhbiBiZSBjaGFuZ2VkIG9uIGl0cworCSAqIG93biwgbXRpbWUgaXMgdGhlbiBub3QgY2hhbmdlZCwgZS5nLiB3aGVuIGEgZmlsZSBpcyByZW5hbWVkLgorCSAqLworCXZpLT5pX2N0aW1lID0gbnRmczJ1dGMoc2ktPmxhc3RfbWZ0X2NoYW5nZV90aW1lKTsKKwkvKgorCSAqIExhc3QgYWNjZXNzIHRvIHRoZSBkYXRhIHdpdGhpbiB0aGUgZmlsZS4gTm90IGNoYW5nZWQgZHVyaW5nIGEgcmVuYW1lCisJICogZm9yIGV4YW1wbGUgYnV0IGNoYW5nZWQgd2hlbmV2ZXIgdGhlIGZpbGUgaXMgd3JpdHRlbiB0by4KKwkgKi8KKwl2aS0+aV9hdGltZSA9IG50ZnMydXRjKHNpLT5sYXN0X2FjY2Vzc190aW1lKTsKKworCS8qIEZpbmQgdGhlIGF0dHJpYnV0ZSBsaXN0IGF0dHJpYnV0ZSBpZiBwcmVzZW50LiAqLworCW50ZnNfYXR0cl9yZWluaXRfc2VhcmNoX2N0eChjdHgpOworCWVyciA9IG50ZnNfYXR0cl9sb29rdXAoQVRfQVRUUklCVVRFX0xJU1QsIE5VTEwsIDAsIDAsIDAsIE5VTEwsIDAsIGN0eCk7CisJaWYgKGVycikgeworCQlpZiAodW5saWtlbHkoZXJyICE9IC1FTk9FTlQpKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmFpbGVkIHRvIGxvb2t1cCBhdHRyaWJ1dGUgbGlzdCAiCisJCQkJCSJhdHRyaWJ1dGUuIik7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJfSBlbHNlIC8qIGlmICghZXJyKSAqLyB7CisJCWlmICh2aS0+aV9pbm8gPT0gRklMRV9NRlQpCisJCQlnb3RvIHNraXBfYXR0cl9saXN0X2xvYWQ7CisJCW50ZnNfZGVidWcoIkF0dHJpYnV0ZSBsaXN0IGZvdW5kIGluIGlub2RlIDB4JWx4LiIsIHZpLT5pX2lubyk7CisJCU5Jbm9TZXRBdHRyTGlzdChuaSk7CisJCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19FTkNSWVBURUQgfHwKKwkJCQljdHgtPmF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLIHx8CisJCQkJY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfU1BBUlNFKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiQXR0cmlidXRlIGxpc3QgYXR0cmlidXRlIGlzICIKKwkJCQkJImNvbXByZXNzZWQvZW5jcnlwdGVkL3NwYXJzZS4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJLyogTm93IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0LiAqLworCQluaS0+YXR0cl9saXN0X3NpemUgPSAodTMyKW50ZnNfYXR0cl9zaXplKGN0eC0+YXR0cik7CisJCW5pLT5hdHRyX2xpc3QgPSBudGZzX21hbGxvY19ub2ZzKG5pLT5hdHRyX2xpc3Rfc2l6ZSk7CisJCWlmICghbmktPmF0dHJfbGlzdCkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlICIKKwkJCQkJImJ1ZmZlciBmb3IgYXR0cmlidXRlIGxpc3QuIik7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQlpZiAoY3R4LT5hdHRyLT5ub25fcmVzaWRlbnQpIHsKKwkJCU5Jbm9TZXRBdHRyTGlzdE5vblJlc2lkZW50KG5pKTsKKwkJCWlmIChjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiQXR0cmlidXRlIGxpc3QgaGFzIG5vbiAiCisJCQkJCQkiemVybyBsb3dlc3RfdmNuLiIpOworCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQl9CisJCQkvKgorCQkJICogU2V0dXAgdGhlIHJ1bmxpc3QuIE5vIG5lZWQgZm9yIGxvY2tpbmcgYXMgd2UgaGF2ZQorCQkJICogZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgaW5vZGUgYXQgdGhpcyB0aW1lLgorCQkJICovCisJCQluaS0+YXR0cl9saXN0X3JsLnJsID0gbnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3Modm9sLAorCQkJCQljdHgtPmF0dHIsIE5VTEwpOworCQkJaWYgKElTX0VSUihuaS0+YXR0cl9saXN0X3JsLnJsKSkgeworCQkJCWVyciA9IFBUUl9FUlIobmktPmF0dHJfbGlzdF9ybC5ybCk7CisJCQkJbmktPmF0dHJfbGlzdF9ybC5ybCA9IE5VTEw7CisJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIk1hcHBpbmcgcGFpcnMgIgorCQkJCQkJImRlY29tcHJlc3Npb24gZmFpbGVkLiIpOworCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQl9CisJCQkvKiBOb3cgbG9hZCB0aGUgYXR0cmlidXRlIGxpc3QuICovCisJCQlpZiAoKGVyciA9IGxvYWRfYXR0cmlidXRlX2xpc3Qodm9sLCAmbmktPmF0dHJfbGlzdF9ybCwKKwkJCQkJbmktPmF0dHJfbGlzdCwgbmktPmF0dHJfbGlzdF9zaXplLAorCQkJCQlzbGU2NF90b19jcHUoY3R4LT5hdHRyLT5kYXRhLgorCQkJCQlub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSkpKSkgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gbG9hZCAiCisJCQkJCQkiYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlLiIpOworCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQl9CisJCX0gZWxzZSAvKiBpZiAoIWN0eC5hdHRyLT5ub25fcmVzaWRlbnQpICovIHsKKwkJCWlmICgodTgqKWN0eC0+YXR0ciArIGxlMTZfdG9fY3B1KAorCQkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSArCisJCQkJCWxlMzJfdG9fY3B1KAorCQkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKSA+CisJCQkJCSh1OCopY3R4LT5tcmVjICsgdm9sLT5tZnRfcmVjb3JkX3NpemUpIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiQ29ycnVwdCBhdHRyaWJ1dGUgbGlzdCAiCisJCQkJCQkiaW4gaW5vZGUuIik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCS8qIE5vdyBjb3B5IHRoZSBhdHRyaWJ1dGUgbGlzdC4gKi8KKwkJCW1lbWNweShuaS0+YXR0cl9saXN0LCAodTgqKWN0eC0+YXR0ciArIGxlMTZfdG9fY3B1KAorCQkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSwKKwkJCQkJbGUzMl90b19jcHUoCisJCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpKTsKKwkJfQorCX0KK3NraXBfYXR0cl9saXN0X2xvYWQ6CisJLyoKKwkgKiBJZiBhbiBhdHRyaWJ1dGUgbGlzdCBpcyBwcmVzZW50IHdlIG5vdyBoYXZlIHRoZSBhdHRyaWJ1dGUgbGlzdCB2YWx1ZQorCSAqIGluIG50ZnNfaW5vLT5hdHRyX2xpc3QgYW5kIGl0IGlzIG50ZnNfaW5vLT5hdHRyX2xpc3Rfc2l6ZSBieXRlcy4KKwkgKi8KKwlpZiAoU19JU0RJUih2aS0+aV9tb2RlKSkgeworCQlzdHJ1Y3QgaW5vZGUgKmJ2aTsKKwkJbnRmc19pbm9kZSAqYm5pOworCQlJTkRFWF9ST09UICppcjsKKwkJY2hhciAqaXJfZW5kLCAqaW5kZXhfZW5kOworCisJCS8qIEl0IGlzIGEgZGlyZWN0b3J5LCBmaW5kIGluZGV4IHJvb3QgYXR0cmlidXRlLiAqLworCQludGZzX2F0dHJfcmVpbml0X3NlYXJjaF9jdHgoY3R4KTsKKwkJZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9JTkRFWF9ST09ULCBJMzAsIDQsIENBU0VfU0VOU0lUSVZFLAorCQkJCTAsIE5VTEwsIDAsIGN0eCk7CisJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQlpZiAoZXJyID09IC1FTk9FTlQpIHsKKwkJCQkvLyBGSVhNRTogRmlsZSBpcyBjb3JydXB0ISBIb3QtZml4IHdpdGggZW1wdHkKKwkJCQkvLyBpbmRleCByb290IGF0dHJpYnV0ZSBpZiByZWNvdmVyeSBvcHRpb24gaXMKKwkJCQkvLyBzZXQuCisJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9ST09UIGF0dHJpYnV0ZSAiCisJCQkJCQkiaXMgbWlzc2luZy4iKTsKKwkJCX0KKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJLyogU2V0IHVwIHRoZSBzdGF0ZS4gKi8KKwkJaWYgKHVubGlrZWx5KGN0eC0+YXR0ci0+bm9uX3Jlc2lkZW50KSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiJElOREVYX1JPT1QgYXR0cmlidXRlIGlzIG5vdCAiCisJCQkJCSJyZXNpZGVudC4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJLyogRW5zdXJlIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBwbGFjZWQgYmVmb3JlIHRoZSB2YWx1ZS4gKi8KKwkJaWYgKHVubGlrZWx5KGN0eC0+YXR0ci0+bmFtZV9sZW5ndGggJiYKKwkJCQkobGUxNl90b19jcHUoY3R4LT5hdHRyLT5uYW1lX29mZnNldCkgPj0KKwkJCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQuCisJCQkJdmFsdWVfb2Zmc2V0KSkpKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICIkSU5ERVhfUk9PVCBhdHRyaWJ1dGUgbmFtZSBpcyAiCisJCQkJCSJwbGFjZWQgYWZ0ZXIgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJLyoKKwkJICogQ29tcHJlc3NlZC9lbmNyeXB0ZWQgaW5kZXggcm9vdCBqdXN0IG1lYW5zIHRoYXQgdGhlIG5ld2x5CisJCSAqIGNyZWF0ZWQgZmlsZXMgaW4gdGhhdCBkaXJlY3Rvcnkgc2hvdWxkIGJlIGNyZWF0ZWQgY29tcHJlc3NlZC8KKwkJICogZW5jcnlwdGVkLiBIb3dldmVyIGluZGV4IHJvb3QgY2Fubm90IGJlIGJvdGggY29tcHJlc3NlZCBhbmQKKwkJICogZW5jcnlwdGVkLgorCQkgKi8KKwkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spCisJCQlOSW5vU2V0Q29tcHJlc3NlZChuaSk7CisJCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19FTkNSWVBURUQpIHsKKwkJCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7CisJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIGVuY3J5cHRlZCBhbmQgIgorCQkJCQkJImNvbXByZXNzZWQgYXR0cmlidXRlLiIpOworCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQl9CisJCQlOSW5vU2V0RW5jcnlwdGVkKG5pKTsKKwkJfQorCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfU1BBUlNFKQorCQkJTklub1NldFNwYXJzZShuaSk7CisJCWlyID0gKElOREVYX1JPT1QqKSgoY2hhciopY3R4LT5hdHRyICsgbGUxNl90b19jcHUoCisJCQkJY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpOworCQlpcl9lbmQgPSAoY2hhciopaXIgKyBsZTMyX3RvX2NwdSgKKwkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwkJaWYgKGlyX2VuZCA+IChjaGFyKiljdHgtPm1yZWMgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZSkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9ST09UIGF0dHJpYnV0ZSBpcyAiCisJCQkJCSJjb3JydXB0LiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQlpbmRleF9lbmQgPSAoY2hhciopJmlyLT5pbmRleCArCisJCQkJbGUzMl90b19jcHUoaXItPmluZGV4LmluZGV4X2xlbmd0aCk7CisJCWlmIChpbmRleF9lbmQgPiBpcl9lbmQpIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJEaXJlY3RvcnkgaW5kZXggaXMgY29ycnVwdC4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJaWYgKGlyLT50eXBlICE9IEFUX0ZJTEVfTkFNRSkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkluZGV4ZWQgYXR0cmlidXRlIGlzIG5vdCAiCisJCQkJCSIkRklMRV9OQU1FLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQlpZiAoaXItPmNvbGxhdGlvbl9ydWxlICE9IENPTExBVElPTl9GSUxFX05BTUUpIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJJbmRleCBjb2xsYXRpb24gcnVsZSBpcyBub3QgIgorCQkJCQkiQ09MTEFUSU9OX0ZJTEVfTkFNRS4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJbmktPml0eXBlLmluZGV4LmNvbGxhdGlvbl9ydWxlID0gaXItPmNvbGxhdGlvbl9ydWxlOworCQluaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSA9IGxlMzJfdG9fY3B1KGlyLT5pbmRleF9ibG9ja19zaXplKTsKKwkJaWYgKG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplICYKKwkJCQkobmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUgLSAxKSkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkluZGV4IGJsb2NrIHNpemUgKCV1KSBpcyBub3QgYSAiCisJCQkJCSJwb3dlciBvZiB0d28uIiwKKwkJCQkJbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQlpZiAobmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUgPiBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJJbmRleCBibG9jayBzaXplICgldSkgPiAiCisJCQkJCSJQQUdFX0NBQ0hFX1NJWkUgKCVsZCkgaXMgbm90ICIKKwkJCQkJInN1cHBvcnRlZC4gIFNvcnJ5LiIsCisJCQkJCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplLAorCQkJCQlQQUdFX0NBQ0hFX1NJWkUpOworCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCWlmIChuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSA8IE5URlNfQkxPQ0tfU0laRSkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkluZGV4IGJsb2NrIHNpemUgKCV1KSA8ICIKKwkJCQkJIk5URlNfQkxPQ0tfU0laRSAoJWkpIGlzIG5vdCAiCisJCQkJCSJzdXBwb3J0ZWQuICBTb3JyeS4iLAorCQkJCQluaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSwKKwkJCQkJTlRGU19CTE9DS19TSVpFKTsKKwkJCWVyciA9IC1FT1BOT1RTVVBQOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQluaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZV9iaXRzID0KKwkJCQlmZnMobmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUpIC0gMTsKKwkJLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgdmNuIGluIHRoZSBkaXJlY3RvcnkgaW5kZXguICovCisJCWlmICh2b2wtPmNsdXN0ZXJfc2l6ZSA8PSBuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSkgeworCQkJbmktPml0eXBlLmluZGV4LnZjbl9zaXplID0gdm9sLT5jbHVzdGVyX3NpemU7CisJCQluaS0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cyA9IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CisJCX0gZWxzZSB7CisJCQluaS0+aXR5cGUuaW5kZXgudmNuX3NpemUgPSB2b2wtPnNlY3Rvcl9zaXplOworCQkJbmktPml0eXBlLmluZGV4LnZjbl9zaXplX2JpdHMgPSB2b2wtPnNlY3Rvcl9zaXplX2JpdHM7CisJCX0KKworCQkvKiBTZXR1cCB0aGUgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUsIGV2ZW4gaWYgbm90IHByZXNlbnQuICovCisJCU5Jbm9TZXRNc3RQcm90ZWN0ZWQobmkpOworCQluaS0+dHlwZSA9IEFUX0lOREVYX0FMTE9DQVRJT047CisJCW5pLT5uYW1lID0gSTMwOworCQluaS0+bmFtZV9sZW4gPSA0OworCisJCWlmICghKGlyLT5pbmRleC5mbGFncyAmIExBUkdFX0lOREVYKSkgeworCQkJLyogTm8gaW5kZXggYWxsb2NhdGlvbi4gKi8KKwkJCXZpLT5pX3NpemUgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9CisJCQkJCW5pLT5hbGxvY2F0ZWRfc2l6ZSA9IDA7CisJCQkvKiBXZSBhcmUgZG9uZSB3aXRoIHRoZSBtZnQgcmVjb3JkLCBzbyB3ZSByZWxlYXNlIGl0LiAqLworCQkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJCQl1bm1hcF9tZnRfcmVjb3JkKG5pKTsKKwkJCW0gPSBOVUxMOworCQkJY3R4ID0gTlVMTDsKKwkJCWdvdG8gc2tpcF9sYXJnZV9kaXJfc3R1ZmY7CisJCX0gLyogTEFSR0VfSU5ERVg6IEluZGV4IGFsbG9jYXRpb24gcHJlc2VudC4gU2V0dXAgc3RhdGUuICovCisJCU5Jbm9TZXRJbmRleEFsbG9jUHJlc2VudChuaSk7CisJCS8qIEZpbmQgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUuICovCisJCW50ZnNfYXR0cl9yZWluaXRfc2VhcmNoX2N0eChjdHgpOworCQllcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX0lOREVYX0FMTE9DQVRJT04sIEkzMCwgNCwKKwkJCQlDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwgMCwgY3R4KTsKKwkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCWlmIChlcnIgPT0gLUVOT0VOVCkKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJElOREVYX0FMTE9DQVRJT04gIgorCQkJCQkJImF0dHJpYnV0ZSBpcyBub3QgcHJlc2VudCBidXQgIgorCQkJCQkJIiRJTkRFWF9ST09UIGluZGljYXRlZCBpdCBpcy4iKTsKKwkJCWVsc2UKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmFpbGVkIHRvIGxvb2t1cCAiCisJCQkJCQkiJElOREVYX0FMTE9DQVRJT04gIgorCQkJCQkJImF0dHJpYnV0ZS4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJaWYgKCFjdHgtPmF0dHItPm5vbl9yZXNpZGVudCkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSAiCisJCQkJCSJpcyByZXNpZGVudC4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJLyoKKwkJICogRW5zdXJlIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBwbGFjZWQgYmVmb3JlIHRoZSBtYXBwaW5nIHBhaXJzCisJCSAqIGFycmF5LgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KGN0eC0+YXR0ci0+bmFtZV9sZW5ndGggJiYKKwkJCQkobGUxNl90b19jcHUoY3R4LT5hdHRyLT5uYW1lX29mZnNldCkgPj0KKwkJCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgorCQkJCW1hcHBpbmdfcGFpcnNfb2Zmc2V0KSkpKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgbmFtZSAiCisJCQkJCSJpcyBwbGFjZWQgYWZ0ZXIgdGhlIG1hcHBpbmcgcGFpcnMgIgorCQkJCQkiYXJyYXkuIik7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19FTkNSWVBURUQpIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgIgorCQkJCQkiaXMgZW5jcnlwdGVkLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfU1BBUlNFKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJElOREVYX0FMTE9DQVRJT04gYXR0cmlidXRlICIKKwkJCQkJImlzIHNwYXJzZS4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgIgorCQkJCQkiaXMgY29tcHJlc3NlZC4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJaWYgKGN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZpcnN0IGV4dGVudCBvZiAiCisJCQkJCSIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgaGFzIG5vbiAiCisJCQkJCSJ6ZXJvIGxvd2VzdF92Y24uIik7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCXZpLT5pX3NpemUgPSBzbGU2NF90b19jcHUoCisJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUpOworCQluaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKKwkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmluaXRpYWxpemVkX3NpemUpOworCQluaS0+YWxsb2NhdGVkX3NpemUgPSBzbGU2NF90b19jcHUoCisJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSk7CisJCS8qCisJCSAqIFdlIGFyZSBkb25lIHdpdGggdGhlIG1mdCByZWNvcmQsIHNvIHdlIHJlbGVhc2UgaXQuIE90aGVyd2lzZQorCQkgKiB3ZSB3b3VsZCBkZWFkbG9jayBpbiBudGZzX2F0dHJfaWdldCgpLgorCQkgKi8KKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJCXVubWFwX21mdF9yZWNvcmQobmkpOworCQltID0gTlVMTDsKKwkJY3R4ID0gTlVMTDsKKwkJLyogR2V0IHRoZSBpbmRleCBiaXRtYXAgYXR0cmlidXRlIGlub2RlLiAqLworCQlidmkgPSBudGZzX2F0dHJfaWdldCh2aSwgQVRfQklUTUFQLCBJMzAsIDQpOworCQlpZiAoSVNfRVJSKGJ2aSkpIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gZ2V0IGJpdG1hcCBhdHRyaWJ1dGUuIik7CisJCQllcnIgPSBQVFJfRVJSKGJ2aSk7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCW5pLT5pdHlwZS5pbmRleC5ibXBfaW5vID0gYnZpOworCQlibmkgPSBOVEZTX0koYnZpKTsKKwkJaWYgKE5Jbm9Db21wcmVzc2VkKGJuaSkgfHwgTklub0VuY3J5cHRlZChibmkpIHx8CisJCQkJTklub1NwYXJzZShibmkpKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJEJJVE1BUCBhdHRyaWJ1dGUgaXMgY29tcHJlc3NlZCAiCisJCQkJCSJhbmQvb3IgZW5jcnlwdGVkIGFuZC9vciBzcGFyc2UuIik7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCS8qIENvbnNpc3RlbmN5IGNoZWNrIGJpdG1hcCBzaXplIHZzLiBpbmRleCBhbGxvY2F0aW9uIHNpemUuICovCisJCWlmICgoYnZpLT5pX3NpemUgPDwgMykgPCAodmktPmlfc2l6ZSA+PgorCQkJCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplX2JpdHMpKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiSW5kZXggYml0bWFwIHRvbyBzbWFsbCAoMHglbGx4KSAiCisJCQkJCSJmb3IgaW5kZXggYWxsb2NhdGlvbiAoMHglbGx4KS4iLAorCQkJCQlidmktPmlfc2l6ZSA8PCAzLCB2aS0+aV9zaXplKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KK3NraXBfbGFyZ2VfZGlyX3N0dWZmOgorCQkvKiBTZXR1cCB0aGUgb3BlcmF0aW9ucyBmb3IgdGhpcyBpbm9kZS4gKi8KKwkJdmktPmlfb3AgPSAmbnRmc19kaXJfaW5vZGVfb3BzOworCQl2aS0+aV9mb3AgPSAmbnRmc19kaXJfb3BzOworCX0gZWxzZSB7CisJCS8qIEl0IGlzIGEgZmlsZS4gKi8KKwkJbnRmc19hdHRyX3JlaW5pdF9zZWFyY2hfY3R4KGN0eCk7CisKKwkJLyogU2V0dXAgdGhlIGRhdGEgYXR0cmlidXRlLCBldmVuIGlmIG5vdCBwcmVzZW50LiAqLworCQluaS0+dHlwZSA9IEFUX0RBVEE7CisJCW5pLT5uYW1lID0gTlVMTDsKKwkJbmktPm5hbWVfbGVuID0gMDsKKworCQkvKiBGaW5kIGZpcnN0IGV4dGVudCBvZiB0aGUgdW5uYW1lZCBkYXRhIGF0dHJpYnV0ZS4gKi8KKwkJZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9EQVRBLCBOVUxMLCAwLCAwLCAwLCBOVUxMLCAwLCBjdHgpOworCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJdmktPmlfc2l6ZSA9IG5pLT5pbml0aWFsaXplZF9zaXplID0KKwkJCQkJbmktPmFsbG9jYXRlZF9zaXplID0gMDsKKwkJCWlmIChlcnIgIT0gLUVOT0VOVCkgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gbG9va3VwICREQVRBICIKKwkJCQkJCSJhdHRyaWJ1dGUuIik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCS8qCisJCQkgKiBGSUxFX1NlY3VyZSBkb2VzIG5vdCBoYXZlIGFuIHVubmFtZWQgJERBVEEKKwkJCSAqIGF0dHJpYnV0ZSwgc28gd2Ugc3BlY2lhbCBjYXNlIGl0IGhlcmUuCisJCQkgKi8KKwkJCWlmICh2aS0+aV9pbm8gPT0gRklMRV9TZWN1cmUpCisJCQkJZ290byBub19kYXRhX2F0dHJfc3BlY2lhbF9jYXNlOworCQkJLyoKKwkJCSAqIE1vc3QgaWYgbm90IGFsbCB0aGUgc3lzdGVtIGZpbGVzIGluIHRoZSAkRXh0ZW5kCisJCQkgKiBzeXN0ZW0gZGlyZWN0b3J5IGRvIG5vdCBoYXZlIHVubmFtZWQgZGF0YQorCQkJICogYXR0cmlidXRlcyBzbyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBwYXJlbnQKKwkJCSAqIGRpcmVjdG9yeSBvZiB0aGUgZmlsZSBpcyBGSUxFX0V4dGVuZCBhbmQgaWYgaXQgaXMKKwkJCSAqIGlnbm9yZSB0aGlzIGVycm9yLiBUbyBkbyB0aGlzIHdlIG5lZWQgdG8gZ2V0IHRoZQorCQkJICogbmFtZSBvZiB0aGlzIGlub2RlIGZyb20gdGhlIG1mdCByZWNvcmQgYXMgdGhlIG5hbWUKKwkJCSAqIGNvbnRhaW5zIHRoZSBiYWNrIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKwkJCSAqLworCQkJaWYgKG50ZnNfaXNfZXh0ZW5kZWRfc3lzdGVtX2ZpbGUoY3R4KSA+IDApCisJCQkJZ290byBub19kYXRhX2F0dHJfc3BlY2lhbF9jYXNlOworCQkJLy8gRklYTUU6IEZpbGUgaXMgY29ycnVwdCEgSG90LWZpeCB3aXRoIGVtcHR5IGRhdGEKKwkJCS8vIGF0dHJpYnV0ZSBpZiByZWNvdmVyeSBvcHRpb24gaXMgc2V0LgorCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiREQVRBIGF0dHJpYnV0ZSBpcyBtaXNzaW5nLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKiBTZXR1cCB0aGUgc3RhdGUuICovCisJCWlmIChjdHgtPmF0dHItPm5vbl9yZXNpZGVudCkgeworCQkJTklub1NldE5vblJlc2lkZW50KG5pKTsKKwkJCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7CisJCQkJTklub1NldENvbXByZXNzZWQobmkpOworCQkJCWlmICh2b2wtPmNsdXN0ZXJfc2l6ZSA+IDQwOTYpIHsKKwkJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kICIKKwkJCQkJCSJjb21wcmVzc2VkIGRhdGEgYnV0ICIKKwkJCQkJCSJjb21wcmVzc2lvbiBpcyBkaXNhYmxlZCBkdWUgIgorCQkJCQkJInRvIGNsdXN0ZXIgc2l6ZSAoJWkpID4gNGtpQi4iLAorCQkJCQkJdm9sLT5jbHVzdGVyX3NpemUpOworCQkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJCX0KKwkJCQlpZiAoKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spCisJCQkJCQkhPSBBVFRSX0lTX0NPTVBSRVNTRUQpIHsKKwkJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kICIKKwkJCQkJCSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCBvciAiCisJCQkJCQkiY29ycnVwdCBmaWxlLiIpOworCQkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJCX0KKwkJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19jbHVzdGVycyA9IDFVIDw8CisJCQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgorCQkJCQkJY29tcHJlc3Npb25fdW5pdDsKKwkJCQlpZiAoY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC4KKwkJCQkJCWNvbXByZXNzaW9uX3VuaXQgIT0gNCkgeworCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgIgorCQkJCQkJIm5vbnN0YW5kYXJkIGNvbXByZXNzaW9uIHVuaXQgIgorCQkJCQkJIigldSBpbnN0ZWFkIG9mIDQpLiAgQ2Fubm90ICIKKwkJCQkJCSJoYW5kbGUgdGhpcy4iLAorCQkJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC4KKwkJCQkJCWNvbXByZXNzaW9uX3VuaXQpOworCQkJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCQl9CisJCQkJbmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfc2l6ZSA9IDFVIDw8ICgKKwkJCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCisJCQkJCQljb21wcmVzc2lvbl91bml0ICsKKwkJCQkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpOworCQkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX3NpemVfYml0cyA9IGZmcygKKwkJCQkJbmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfc2l6ZSkgLSAxOworCQkJfQorCQkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCkgeworCQkJCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7CisJCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBlbmNyeXB0ZWQgIgorCQkJCQkJCSJhbmQgY29tcHJlc3NlZCBkYXRhLiIpOworCQkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJCX0KKwkJCQlOSW5vU2V0RW5jcnlwdGVkKG5pKTsKKwkJCX0KKwkJCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpCisJCQkJTklub1NldFNwYXJzZShuaSk7CisJCQlpZiAoY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CisJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZpcnN0IGV4dGVudCBvZiAkREFUQSAiCisJCQkJCQkiYXR0cmlidXRlIGhhcyBub24gemVybyAiCisJCQkJCQkibG93ZXN0X3Zjbi4iKTsKKwkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJfQorCQkJLyogU2V0dXAgYWxsIHRoZSBzaXplcy4gKi8KKwkJCXZpLT5pX3NpemUgPSBzbGU2NF90b19jcHUoCisJCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuZGF0YV9zaXplKTsKKwkJCW5pLT5pbml0aWFsaXplZF9zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgorCQkJCQlpbml0aWFsaXplZF9zaXplKTsKKwkJCW5pLT5hbGxvY2F0ZWRfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKKwkJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC4KKwkJCQkJYWxsb2NhdGVkX3NpemUpOworCQkJaWYgKE5Jbm9Db21wcmVzc2VkKG5pKSkgeworCQkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLnNpemUgPSBzbGU2NF90b19jcHUoCisJCQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgorCQkJCQkJY29tcHJlc3NlZF9zaXplKTsKKwkJCX0KKwkJfSBlbHNlIHsgLyogUmVzaWRlbnQgYXR0cmlidXRlLiAqLworCQkJLyoKKwkJCSAqIE1ha2UgYWxsIHNpemVzIGVxdWFsIGZvciBzaW1wbGljaXR5IGluIHJlYWQgY29kZQorCQkJICogcGF0aHMuIEZJWE1FOiBOZWVkIHRvIGtlZXAgdGhpcyBpbiBtaW5kIHdoZW4KKwkJCSAqIGNvbnZlcnRpbmcgdG8gbm9uLXJlc2lkZW50IGF0dHJpYnV0ZSBpbiB3cml0ZSBjb2RlCisJCQkgKiBwYXRoLiAoUHJvYmFibHkgb25seSBhZmZlY3RzIHRydW5jYXRlKCkuKQorCQkJICovCisJCQl2aS0+aV9zaXplID0gbmktPmluaXRpYWxpemVkX3NpemUgPSBuaS0+YWxsb2NhdGVkX3NpemUgPQorCQkJCQlsZTMyX3RvX2NwdSgKKwkJCQkJY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCk7CisJCX0KK25vX2RhdGFfYXR0cl9zcGVjaWFsX2Nhc2U6CisJCS8qIFdlIGFyZSBkb25lIHdpdGggdGhlIG1mdCByZWNvcmQsIHNvIHdlIHJlbGVhc2UgaXQuICovCisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCQl1bm1hcF9tZnRfcmVjb3JkKG5pKTsKKwkJbSA9IE5VTEw7CisJCWN0eCA9IE5VTEw7CisJCS8qIFNldHVwIHRoZSBvcGVyYXRpb25zIGZvciB0aGlzIGlub2RlLiAqLworCQl2aS0+aV9vcCA9ICZudGZzX2ZpbGVfaW5vZGVfb3BzOworCQl2aS0+aV9mb3AgPSAmbnRmc19maWxlX29wczsKKwl9CisJaWYgKE5Jbm9Nc3RQcm90ZWN0ZWQobmkpKQorCQl2aS0+aV9tYXBwaW5nLT5hX29wcyA9ICZudGZzX21zdF9hb3BzOworCWVsc2UKKwkJdmktPmlfbWFwcGluZy0+YV9vcHMgPSAmbnRmc19hb3BzOworCS8qCisJICogVGhlIG51bWJlciBvZiA1MTItYnl0ZSBibG9ja3MgdXNlZCBvbiBkaXNrIChmb3Igc3RhdCkuIFRoaXMgaXMgaW4gc28KKwkgKiBmYXIgaW5hY2N1cmF0ZSBhcyBpdCBkb2Vzbid0IGFjY291bnQgZm9yIGFueSBuYW1lZCBzdHJlYW1zIG9yIG90aGVyCisJICogc3BlY2lhbCBub24tcmVzaWRlbnQgYXR0cmlidXRlcywgYnV0IHRoYXQgaXMgaG93IFdpbmRvd3Mgd29ya3MsIHRvbywKKwkgKiBzbyB3ZSBhcmUgYXQgbGVhc3QgY29uc2lzdGVudCB3aXRoIFdpbmRvd3MsIGlmIG5vdCBlbnRpcmVseQorCSAqIGNvbnNpc3RlbnQgd2l0aCB0aGUgTGludXggV2F5LiBEb2luZyBpdCB0aGUgTGludXggV2F5IHdvdWxkIGNhdXNlIGEKKwkgKiBzaWduaWZpY2FudCBzbG93ZG93biBhcyBpdCB3b3VsZCBpbnZvbHZlIGl0ZXJhdGluZyBvdmVyIGFsbAorCSAqIGF0dHJpYnV0ZXMgaW4gdGhlIG1mdCByZWNvcmQgYW5kIGFkZGluZyB0aGUgYWxsb2NhdGVkL2NvbXByZXNzZWQKKwkgKiBzaXplcyBvZiBhbGwgbm9uLXJlc2lkZW50IGF0dHJpYnV0ZXMgcHJlc2VudCB0byBnaXZlIHVzIHRoZSBMaW51eAorCSAqIGNvcnJlY3Qgc2l6ZSB0aGF0IHNob3VsZCBnbyBpbnRvIGlfYmxvY2tzIChhZnRlciBkaXZpc2lvbiBieSA1MTIpLgorCSAqLworCWlmIChTX0lTRElSKHZpLT5pX21vZGUpIHx8ICFOSW5vQ29tcHJlc3NlZChuaSkpCisJCXZpLT5pX2Jsb2NrcyA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA+PiA5OworCWVsc2UKKwkJdmktPmlfYmxvY2tzID0gbmktPml0eXBlLmNvbXByZXNzZWQuc2l6ZSA+PiA5OworCisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKKwordW5tX2Vycl9vdXQ6CisJaWYgKCFlcnIpCisJCWVyciA9IC1FSU87CisJaWYgKGN0eCkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJaWYgKG0pCisJCXVubWFwX21mdF9yZWNvcmQobmkpOworZXJyX291dDoKKwludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgd2l0aCBlcnJvciBjb2RlICVpLiAgTWFya2luZyBjb3JydXB0ICIKKwkJCSJpbm9kZSAweCVseCBhcyBiYWQuICBSdW4gY2hrZHNrLiIsIGVyciwgdmktPmlfaW5vKTsKKwltYWtlX2JhZF9pbm9kZSh2aSk7CisJaWYgKGVyciAhPSAtRU9QTk9UU1VQUCAmJiBlcnIgIT0gLUVOT01FTSkKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogbnRmc19yZWFkX2xvY2tlZF9hdHRyX2lub2RlIC0gcmVhZCBhbiBhdHRyaWJ1dGUgaW5vZGUgZnJvbSBpdHMgYmFzZSBpbm9kZQorICogQGJhc2Vfdmk6CWJhc2UgaW5vZGUKKyAqIEB2aToJCWF0dHJpYnV0ZSBpbm9kZSB0byByZWFkCisgKgorICogbnRmc19yZWFkX2xvY2tlZF9hdHRyX2lub2RlKCkgaXMgY2FsbGVkIGZyb20gbnRmc19hdHRyX2lnZXQoKSB0byByZWFkIHRoZQorICogYXR0cmlidXRlIGlub2RlIGRlc2NyaWJlZCBieSBAdmkgaW50byBtZW1vcnkgZnJvbSB0aGUgYmFzZSBtZnQgcmVjb3JkCisgKiBkZXNjcmliZWQgYnkgQGJhc2VfbmkuCisgKgorICogbnRmc19yZWFkX2xvY2tlZF9hdHRyX2lub2RlKCkgbWFwcywgcGlucyBhbmQgbG9ja3MgdGhlIGJhc2UgaW5vZGUgZm9yCisgKiByZWFkaW5nIGFuZCBsb29rcyB1cCB0aGUgYXR0cmlidXRlIGRlc2NyaWJlZCBieSBAdmkgYmVmb3JlIHNldHRpbmcgdXAgdGhlCisgKiBuZWNlc3NhcnkgZmllbGRzIGluIEB2aSBhcyB3ZWxsIGFzIGluaXRpYWxpemluZyB0aGUgbnRmcyBpbm9kZS4KKyAqCisgKiBROiBXaGF0IGxvY2tzIGFyZSBoZWxkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZD8KKyAqIEE6IGlfc3RhdGUgaGFzIElfTE9DSyBzZXQsIGhlbmNlIHRoZSBpbm9kZSBpcyBsb2NrZWQsIGFsc28KKyAqICAgIGlfY291bnQgaXMgc2V0IHRvIDEsIHNvIGl0IGlzIG5vdCBnb2luZyB0byBnbyBhd2F5CisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLiAgSW4gdGhlIGVycm9yIGNhc2UsIHRoZSBpbm9kZSB3aWxsCisgKiBoYXZlIGhhZCBtYWtlX2JhZF9pbm9kZSgpIGV4ZWN1dGVkIG9uIGl0LgorICovCitzdGF0aWMgaW50IG50ZnNfcmVhZF9sb2NrZWRfYXR0cl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmJhc2VfdmksIHN0cnVjdCBpbm9kZSAqdmkpCit7CisJbnRmc192b2x1bWUgKnZvbCA9IE5URlNfU0IodmktPmlfc2IpOworCW50ZnNfaW5vZGUgKm5pLCAqYmFzZV9uaTsKKwlNRlRfUkVDT1JEICptOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJaW50IGVyciA9IDA7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaV9pbm8gMHglbHguIiwgdmktPmlfaW5vKTsKKworCW50ZnNfaW5pdF9iaWdfaW5vZGUodmkpOworCisJbmkJPSBOVEZTX0kodmkpOworCWJhc2VfbmkgPSBOVEZTX0koYmFzZV92aSk7CisKKwkvKiBKdXN0IG1pcnJvciB0aGUgdmFsdWVzIGZyb20gdGhlIGJhc2UgaW5vZGUuICovCisJdmktPmlfYmxrc2l6ZQk9IGJhc2VfdmktPmlfYmxrc2l6ZTsKKwl2aS0+aV92ZXJzaW9uCT0gYmFzZV92aS0+aV92ZXJzaW9uOworCXZpLT5pX3VpZAk9IGJhc2VfdmktPmlfdWlkOworCXZpLT5pX2dpZAk9IGJhc2VfdmktPmlfZ2lkOworCXZpLT5pX25saW5rCT0gYmFzZV92aS0+aV9ubGluazsKKwl2aS0+aV9tdGltZQk9IGJhc2VfdmktPmlfbXRpbWU7CisJdmktPmlfY3RpbWUJPSBiYXNlX3ZpLT5pX2N0aW1lOworCXZpLT5pX2F0aW1lCT0gYmFzZV92aS0+aV9hdGltZTsKKwl2aS0+aV9nZW5lcmF0aW9uID0gbmktPnNlcV9ubyA9IGJhc2VfbmktPnNlcV9ubzsKKworCS8qIFNldCBpbm9kZSB0eXBlIHRvIHplcm8gYnV0IHByZXNlcnZlIHBlcm1pc3Npb25zLiAqLworCXZpLT5pX21vZGUJPSBiYXNlX3ZpLT5pX21vZGUgJiB+U19JRk1UOworCisJbSA9IG1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCWlmIChJU19FUlIobSkpIHsKKwkJZXJyID0gUFRSX0VSUihtKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoYmFzZV9uaSwgbSk7CisJaWYgKCFjdHgpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisKKwkvKiBGaW5kIHRoZSBhdHRyaWJ1dGUuICovCisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChuaS0+dHlwZSwgbmktPm5hbWUsIG5pLT5uYW1lX2xlbiwKKwkJCUNBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLCAwLCBjdHgpOworCWlmICh1bmxpa2VseShlcnIpKQorCQlnb3RvIHVubV9lcnJfb3V0OworCisJaWYgKCFjdHgtPmF0dHItPm5vbl9yZXNpZGVudCkgeworCQkvKiBFbnN1cmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIHBsYWNlZCBiZWZvcmUgdGhlIHZhbHVlLiAqLworCQlpZiAodW5saWtlbHkoY3R4LT5hdHRyLT5uYW1lX2xlbmd0aCAmJgorCQkJCShsZTE2X3RvX2NwdShjdHgtPmF0dHItPm5hbWVfb2Zmc2V0KSA+PQorCQkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC4KKwkJCQl2YWx1ZV9vZmZzZXQpKSkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkF0dHJpYnV0ZSBuYW1lIGlzIHBsYWNlZCBhZnRlciAiCisJCQkJCSJ0aGUgYXR0cmlidXRlIHZhbHVlLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQlpZiAoTklub01zdFByb3RlY3RlZChuaSkgfHwgY3R4LT5hdHRyLT5mbGFncykgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIG1zdCBwcm90ZWN0ZWQgYXR0cmlidXRlICIKKwkJCQkJIm9yIGF0dHJpYnV0ZSB3aXRoIG5vbi16ZXJvIGZsYWdzIGJ1dCAiCisJCQkJCSJ0aGUgYXR0cmlidXRlIGlzIHJlc2lkZW50LiAgUGxlYXNlICIKKwkJCQkJInJlcG9ydCB5b3Ugc2F3IHRoaXMgbWVzc2FnZSB0byAiCisJCQkJCSJsaW51eC1udGZzLWRldkBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQiKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJLyoKKwkJICogUmVzaWRlbnQgYXR0cmlidXRlLiBNYWtlIGFsbCBzaXplcyBlcXVhbCBmb3Igc2ltcGxpY2l0eSBpbgorCQkgKiByZWFkIGNvZGUgcGF0aHMuCisJCSAqLworCQl2aS0+aV9zaXplID0gbmktPmluaXRpYWxpemVkX3NpemUgPSBuaS0+YWxsb2NhdGVkX3NpemUgPQorCQkJbGUzMl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCk7CisJfSBlbHNlIHsKKwkJTklub1NldE5vblJlc2lkZW50KG5pKTsKKwkJLyoKKwkJICogRW5zdXJlIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBwbGFjZWQgYmVmb3JlIHRoZSBtYXBwaW5nIHBhaXJzCisJCSAqIGFycmF5LgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KGN0eC0+YXR0ci0+bmFtZV9sZW5ndGggJiYKKwkJCQkobGUxNl90b19jcHUoY3R4LT5hdHRyLT5uYW1lX29mZnNldCkgPj0KKwkJCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgorCQkJCW1hcHBpbmdfcGFpcnNfb2Zmc2V0KSkpKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJBdHRyaWJ1dGUgbmFtZSBpcyBwbGFjZWQgYWZ0ZXIgIgorCQkJCQkidGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkuIik7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7CisJCQlpZiAoTklub01zdFByb3RlY3RlZChuaSkpIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgbXN0IHByb3RlY3RlZCAiCisJCQkJCQkiYXR0cmlidXRlIGJ1dCB0aGUgYXR0cmlidXRlICIKKwkJCQkJCSJpcyBjb21wcmVzc2VkLiAgUGxlYXNlIHJlcG9ydCAiCisJCQkJCQkieW91IHNhdyB0aGlzIG1lc3NhZ2UgdG8gIgorCQkJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLiIKKwkJCQkJCSJzb3VyY2Vmb3JnZS5uZXQiKTsKKwkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJfQorCQkJTklub1NldENvbXByZXNzZWQobmkpOworCQkJaWYgKChuaS0+dHlwZSAhPSBBVF9EQVRBKSB8fCAobmktPnR5cGUgPT0gQVRfREFUQSAmJgorCQkJCQluaS0+bmFtZV9sZW4pKSB7CisJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIGNvbXByZXNzZWQgIgorCQkJCQkJIm5vbi1kYXRhIG9yIG5hbWVkIGRhdGEgIgorCQkJCQkJImF0dHJpYnV0ZS4gIFBsZWFzZSByZXBvcnQgIgorCQkJCQkJInlvdSBzYXcgdGhpcyBtZXNzYWdlIHRvICIKKwkJCQkJCSJsaW51eC1udGZzLWRldkBsaXN0cy4iCisJCQkJCQkic291cmNlZm9yZ2UubmV0Iik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCWlmICh2b2wtPmNsdXN0ZXJfc2l6ZSA+IDQwOTYpIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgY29tcHJlc3NlZCAiCisJCQkJCQkiYXR0cmlidXRlIGJ1dCBjb21wcmVzc2lvbiBpcyAiCisJCQkJCQkiZGlzYWJsZWQgZHVlIHRvIGNsdXN0ZXIgc2l6ZSAiCisJCQkJCQkiKCVpKSA+IDRraUIuIiwKKwkJCQkJCXZvbC0+Y2x1c3Rlcl9zaXplKTsKKwkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJfQorCQkJaWYgKChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKQorCQkJCQkhPSBBVFRSX0lTX0NPTVBSRVNTRUQpIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgdW5rbm93biAiCisJCQkJCQkiY29tcHJlc3Npb24gbWV0aG9kLiIpOworCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQl9CisJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19jbHVzdGVycyA9IDFVIDw8CisJCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCisJCQkJCWNvbXByZXNzaW9uX3VuaXQ7CisJCQlpZiAoY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5jb21wcmVzc2lvbl91bml0ICE9CisJCQkJCTQpIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgbm9uc3RhbmRhcmQgIgorCQkJCQkJImNvbXByZXNzaW9uIHVuaXQgKCV1IGluc3RlYWQgIgorCQkJCQkJIm9mIDQpLiAgQ2Fubm90IGhhbmRsZSB0aGlzLiIsCisJCQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgorCQkJCQkJY29tcHJlc3Npb25fdW5pdCk7CisJCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX3NpemUgPSAxVSA8PCAoCisJCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCisJCQkJCWNvbXByZXNzaW9uX3VuaXQgKworCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKTsKKwkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX3NpemVfYml0cyA9IGZmcygKKwkJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19zaXplKSAtIDE7CisJCX0KKwkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCkgeworCQkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgZW5jcnlwdGVkICIKKwkJCQkJCSJhbmQgY29tcHJlc3NlZCBkYXRhLiIpOworCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQl9CisJCQlpZiAoTklub01zdFByb3RlY3RlZChuaSkpIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgbXN0IHByb3RlY3RlZCAiCisJCQkJCQkiYXR0cmlidXRlIGJ1dCB0aGUgYXR0cmlidXRlICIKKwkJCQkJCSJpcyBlbmNyeXB0ZWQuICBQbGVhc2UgcmVwb3J0ICIKKwkJCQkJCSJ5b3Ugc2F3IHRoaXMgbWVzc2FnZSB0byAiCisJCQkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuIgorCQkJCQkJInNvdXJjZWZvcmdlLm5ldCIpOworCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQl9CisJCQlOSW5vU2V0RW5jcnlwdGVkKG5pKTsKKwkJfQorCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfU1BBUlNFKSB7CisJCQlpZiAoTklub01zdFByb3RlY3RlZChuaSkpIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgbXN0IHByb3RlY3RlZCAiCisJCQkJCQkiYXR0cmlidXRlIGJ1dCB0aGUgYXR0cmlidXRlICIKKwkJCQkJCSJpcyBzcGFyc2UuICBQbGVhc2UgcmVwb3J0ICIKKwkJCQkJCSJ5b3Ugc2F3IHRoaXMgbWVzc2FnZSB0byAiCisJCQkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuIgorCQkJCQkJInNvdXJjZWZvcmdlLm5ldCIpOworCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQl9CisJCQlOSW5vU2V0U3BhcnNlKG5pKTsKKwkJfQorCQlpZiAoY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmlyc3QgZXh0ZW50IG9mIGF0dHJpYnV0ZSBoYXMgIgorCQkJCQkibm9uLXplcm8gbG93ZXN0X3Zjbi4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJLyogU2V0dXAgYWxsIHRoZSBzaXplcy4gKi8KKwkJdmktPmlfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKKwkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZSk7CisJCW5pLT5pbml0aWFsaXplZF9zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSk7CisJCW5pLT5hbGxvY2F0ZWRfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKKwkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmFsbG9jYXRlZF9zaXplKTsKKwkJaWYgKE5Jbm9Db21wcmVzc2VkKG5pKSkgeworCQkJbmktPml0eXBlLmNvbXByZXNzZWQuc2l6ZSA9IHNsZTY0X3RvX2NwdSgKKwkJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC4KKwkJCQkJY29tcHJlc3NlZF9zaXplKTsKKwkJfQorCX0KKworCS8qIFNldHVwIHRoZSBvcGVyYXRpb25zIGZvciB0aGlzIGF0dHJpYnV0ZSBpbm9kZS4gKi8KKwl2aS0+aV9vcCA9IE5VTEw7CisJdmktPmlfZm9wID0gTlVMTDsKKwlpZiAoTklub01zdFByb3RlY3RlZChuaSkpCisJCXZpLT5pX21hcHBpbmctPmFfb3BzID0gJm50ZnNfbXN0X2FvcHM7CisJZWxzZQorCQl2aS0+aV9tYXBwaW5nLT5hX29wcyA9ICZudGZzX2FvcHM7CisKKwlpZiAoIU5Jbm9Db21wcmVzc2VkKG5pKSkKKwkJdmktPmlfYmxvY2tzID0gbmktPmFsbG9jYXRlZF9zaXplID4+IDk7CisJZWxzZQorCQl2aS0+aV9ibG9ja3MgPSBuaS0+aXR5cGUuY29tcHJlc3NlZC5zaXplID4+IDk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgYmFzZSBpbm9kZSBkb2Vzbid0IGdvIGF3YXkgYW5kIGF0dGFjaCBpdCB0byB0aGUKKwkgKiBhdHRyaWJ1dGUgaW5vZGUuCisJICovCisJaWdyYWIoYmFzZV92aSk7CisJbmktPmV4dC5iYXNlX250ZnNfaW5vID0gYmFzZV9uaTsKKwluaS0+bnJfZXh0ZW50cyA9IC0xOworCisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIDA7CisKK3VubV9lcnJfb3V0OgorCWlmICghZXJyKQorCQllcnIgPSAtRUlPOworCWlmIChjdHgpCisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CitlcnJfb3V0OgorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWkgd2hpbGUgcmVhZGluZyBhdHRyaWJ1dGUgIgorCQkJImlub2RlIChtZnRfbm8gMHglbHgsIHR5cGUgMHgleCwgbmFtZV9sZW4gJWkpLiAgIgorCQkJIk1hcmtpbmcgY29ycnVwdCBpbm9kZSBhbmQgYmFzZSBpbm9kZSAweCVseCBhcyBiYWQuICAiCisJCQkiUnVuIGNoa2Rzay4iLCBlcnIsIHZpLT5pX2lubywgbmktPnR5cGUsIG5pLT5uYW1lX2xlbiwKKwkJCWJhc2VfdmktPmlfaW5vKTsKKwltYWtlX2JhZF9pbm9kZSh2aSk7CisJbWFrZV9iYWRfaW5vZGUoYmFzZV92aSk7CisJaWYgKGVyciAhPSAtRU5PTUVNKQorCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBudGZzX3JlYWRfbG9ja2VkX2luZGV4X2lub2RlIC0gcmVhZCBhbiBpbmRleCBpbm9kZSBmcm9tIGl0cyBiYXNlIGlub2RlCisgKiBAYmFzZV92aToJYmFzZSBpbm9kZQorICogQHZpOgkJaW5kZXggaW5vZGUgdG8gcmVhZAorICoKKyAqIG50ZnNfcmVhZF9sb2NrZWRfaW5kZXhfaW5vZGUoKSBpcyBjYWxsZWQgZnJvbSBudGZzX2luZGV4X2lnZXQoKSB0byByZWFkIHRoZQorICogaW5kZXggaW5vZGUgZGVzY3JpYmVkIGJ5IEB2aSBpbnRvIG1lbW9yeSBmcm9tIHRoZSBiYXNlIG1mdCByZWNvcmQgZGVzY3JpYmVkCisgKiBieSBAYmFzZV9uaS4KKyAqCisgKiBudGZzX3JlYWRfbG9ja2VkX2luZGV4X2lub2RlKCkgbWFwcywgcGlucyBhbmQgbG9ja3MgdGhlIGJhc2UgaW5vZGUgZm9yCisgKiByZWFkaW5nIGFuZCBsb29rcyB1cCB0aGUgYXR0cmlidXRlcyByZWxhdGluZyB0byB0aGUgaW5kZXggZGVzY3JpYmVkIGJ5IEB2aQorICogYmVmb3JlIHNldHRpbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWVsZHMgaW4gQHZpIGFzIHdlbGwgYXMgaW5pdGlhbGl6aW5nIHRoZQorICogbnRmcyBpbm9kZS4KKyAqCisgKiBOb3RlLCBpbmRleCBpbm9kZXMgYXJlIGVzc2VudGlhbGx5IGF0dHJpYnV0ZSBpbm9kZXMgKE5Jbm9BdHRyKCkgaXMgdHJ1ZSkKKyAqIHdpdGggdGhlIGF0dHJpYnV0ZSB0eXBlIHNldCB0byBBVF9JTkRFWF9BTExPQ0FUSU9OLiAgQXBhcnQgZnJvbSB0aGF0LCB0aGV5CisgKiBhcmUgc2V0dXAgbGlrZSBkaXJlY3RvcnkgaW5vZGVzIHNpbmNlIGRpcmVjdG9yaWVzIGFyZSBhIHNwZWNpYWwgY2FzZSBvZgorICogaW5kaWNlcyBhbyB0aGV5IG5lZWQgdG8gYmUgdHJlYXRlZCBpbiBtdWNoIHRoZSBzYW1lIHdheS4gIE1vc3QgaW1wb3J0YW50bHksCisgKiBmb3Igc21hbGwgaW5kaWNlcyB0aGUgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUgbWlnaHQgbm90IGFjdHVhbGx5IGV4aXN0LgorICogSG93ZXZlciwgdGhlIGluZGV4IHJvb3QgYXR0cmlidXRlIGFsd2F5cyBleGlzdHMgYnV0IHRoaXMgZG9lcyBub3QgbmVlZCB0bworICogaGF2ZSBhbiBpbm9kZSBhc3NvY2lhdGVkIHdpdGggaXQgYW5kIHRoaXMgaXMgd2h5IHdlIGRlZmluZSBhIG5ldyBpbm9kZSB0eXBlCisgKiBpbmRleC4gIEFsc28sIGxpa2UgZm9yIGRpcmVjdG9yaWVzLCB3ZSBuZWVkIHRvIGhhdmUgYW4gYXR0cmlidXRlIGlub2RlIGZvcgorICogdGhlIGJpdG1hcCBhdHRyaWJ1dGUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUgYW5kIHdlCisgKiBjYW4gc3RvcmUgdGhpcyBpbiB0aGUgYXBwcm9wcmlhdGUgZmllbGQgb2YgdGhlIGlub2RlLCBqdXN0IGxpa2Ugd2UgZG8gZm9yCisgKiBub3JtYWwgZGlyZWN0b3J5IGlub2Rlcy4KKyAqCisgKiBROiBXaGF0IGxvY2tzIGFyZSBoZWxkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZD8KKyAqIEE6IGlfc3RhdGUgaGFzIElfTE9DSyBzZXQsIGhlbmNlIHRoZSBpbm9kZSBpcyBsb2NrZWQsIGFsc28KKyAqICAgIGlfY291bnQgaXMgc2V0IHRvIDEsIHNvIGl0IGlzIG5vdCBnb2luZyB0byBnbyBhd2F5CisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLiAgSW4gdGhlIGVycm9yIGNhc2UsIHRoZSBpbm9kZSB3aWxsCisgKiBoYXZlIGhhZCBtYWtlX2JhZF9pbm9kZSgpIGV4ZWN1dGVkIG9uIGl0LgorICovCitzdGF0aWMgaW50IG50ZnNfcmVhZF9sb2NrZWRfaW5kZXhfaW5vZGUoc3RydWN0IGlub2RlICpiYXNlX3ZpLCBzdHJ1Y3QgaW5vZGUgKnZpKQoreworCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKHZpLT5pX3NiKTsKKwludGZzX2lub2RlICpuaSwgKmJhc2VfbmksICpibmk7CisJc3RydWN0IGlub2RlICpidmk7CisJTUZUX1JFQ09SRCAqbTsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OworCUlOREVYX1JPT1QgKmlyOworCXU4ICppcl9lbmQsICppbmRleF9lbmQ7CisJaW50IGVyciA9IDA7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaV9pbm8gMHglbHguIiwgdmktPmlfaW5vKTsKKwludGZzX2luaXRfYmlnX2lub2RlKHZpKTsKKwluaQk9IE5URlNfSSh2aSk7CisJYmFzZV9uaSA9IE5URlNfSShiYXNlX3ZpKTsKKwkvKiBKdXN0IG1pcnJvciB0aGUgdmFsdWVzIGZyb20gdGhlIGJhc2UgaW5vZGUuICovCisJdmktPmlfYmxrc2l6ZQk9IGJhc2VfdmktPmlfYmxrc2l6ZTsKKwl2aS0+aV92ZXJzaW9uCT0gYmFzZV92aS0+aV92ZXJzaW9uOworCXZpLT5pX3VpZAk9IGJhc2VfdmktPmlfdWlkOworCXZpLT5pX2dpZAk9IGJhc2VfdmktPmlfZ2lkOworCXZpLT5pX25saW5rCT0gYmFzZV92aS0+aV9ubGluazsKKwl2aS0+aV9tdGltZQk9IGJhc2VfdmktPmlfbXRpbWU7CisJdmktPmlfY3RpbWUJPSBiYXNlX3ZpLT5pX2N0aW1lOworCXZpLT5pX2F0aW1lCT0gYmFzZV92aS0+aV9hdGltZTsKKwl2aS0+aV9nZW5lcmF0aW9uID0gbmktPnNlcV9ubyA9IGJhc2VfbmktPnNlcV9ubzsKKwkvKiBTZXQgaW5vZGUgdHlwZSB0byB6ZXJvIGJ1dCBwcmVzZXJ2ZSBwZXJtaXNzaW9ucy4gKi8KKwl2aS0+aV9tb2RlCT0gYmFzZV92aS0+aV9tb2RlICYgflNfSUZNVDsKKwkvKiBNYXAgdGhlIG1mdCByZWNvcmQgZm9yIHRoZSBiYXNlIGlub2RlLiAqLworCW0gPSBtYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwlpZiAoSVNfRVJSKG0pKSB7CisJCWVyciA9IFBUUl9FUlIobSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KGJhc2VfbmksIG0pOworCWlmICghY3R4KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCS8qIEZpbmQgdGhlIGluZGV4IHJvb3QgYXR0cmlidXRlLiAqLworCWVyciA9IG50ZnNfYXR0cl9sb29rdXAoQVRfSU5ERVhfUk9PVCwgbmktPm5hbWUsIG5pLT5uYW1lX2xlbiwKKwkJCUNBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLCAwLCBjdHgpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCWlmIChlcnIgPT0gLUVOT0VOVCkKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfUk9PVCBhdHRyaWJ1dGUgaXMgIgorCQkJCQkibWlzc2luZy4iKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogU2V0IHVwIHRoZSBzdGF0ZS4gKi8KKwlpZiAodW5saWtlbHkoY3R4LT5hdHRyLT5ub25fcmVzaWRlbnQpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIiRJTkRFWF9ST09UIGF0dHJpYnV0ZSBpcyBub3QgcmVzaWRlbnQuIik7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCS8qIEVuc3VyZSB0aGUgYXR0cmlidXRlIG5hbWUgaXMgcGxhY2VkIGJlZm9yZSB0aGUgdmFsdWUuICovCisJaWYgKHVubGlrZWx5KGN0eC0+YXR0ci0+bmFtZV9sZW5ndGggJiYKKwkJCShsZTE2X3RvX2NwdShjdHgtPmF0dHItPm5hbWVfb2Zmc2V0KSA+PQorCQkJbGUxNl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LgorCQkJdmFsdWVfb2Zmc2V0KSkpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIiRJTkRFWF9ST09UIGF0dHJpYnV0ZSBuYW1lIGlzIHBsYWNlZCAiCisJCQkJImFmdGVyIHRoZSBhdHRyaWJ1dGUgdmFsdWUuIik7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCS8qIENvbXByZXNzZWQvZW5jcnlwdGVkL3NwYXJzZSBpbmRleCByb290IGlzIG5vdCBhbGxvd2VkLiAqLworCWlmIChjdHgtPmF0dHItPmZsYWdzICYgKEFUVFJfQ09NUFJFU1NJT05fTUFTSyB8IEFUVFJfSVNfRU5DUllQVEVEIHwKKwkJCUFUVFJfSVNfU1BBUlNFKSkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgY29tcHJlc3NlZC9lbmNyeXB0ZWQvc3BhcnNlIGluZGV4ICIKKwkJCQkicm9vdCBhdHRyaWJ1dGUuIik7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWlyID0gKElOREVYX1JPT1QqKSgodTgqKWN0eC0+YXR0ciArCisJCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSk7CisJaXJfZW5kID0gKHU4KilpciArIGxlMzJfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOworCWlmIChpcl9lbmQgPiAodTgqKWN0eC0+bXJlYyArIHZvbC0+bWZ0X3JlY29yZF9zaXplKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfUk9PVCBhdHRyaWJ1dGUgaXMgY29ycnVwdC4iKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaW5kZXhfZW5kID0gKHU4KikmaXItPmluZGV4ICsgbGUzMl90b19jcHUoaXItPmluZGV4LmluZGV4X2xlbmd0aCk7CisJaWYgKGluZGV4X2VuZCA+IGlyX2VuZCkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiSW5kZXggaXMgY29ycnVwdC4iKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaWYgKGlyLT50eXBlKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJJbmRleCB0eXBlIGlzIG5vdCAwICh0eXBlIGlzIDB4JXgpLiIsCisJCQkJbGUzMl90b19jcHUoaXItPnR5cGUpKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJbmktPml0eXBlLmluZGV4LmNvbGxhdGlvbl9ydWxlID0gaXItPmNvbGxhdGlvbl9ydWxlOworCW50ZnNfZGVidWcoIkluZGV4IGNvbGxhdGlvbiBydWxlIGlzIDB4JXguIiwKKwkJCWxlMzJfdG9fY3B1KGlyLT5jb2xsYXRpb25fcnVsZSkpOworCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplID0gbGUzMl90b19jcHUoaXItPmluZGV4X2Jsb2NrX3NpemUpOworCWlmIChuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSAmIChuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSAtIDEpKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJJbmRleCBibG9jayBzaXplICgldSkgaXMgbm90IGEgcG93ZXIgb2YgIgorCQkJCSJ0d28uIiwgbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpZiAobmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUgPiBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkluZGV4IGJsb2NrIHNpemUgKCV1KSA+IFBBR0VfQ0FDSEVfU0laRSAiCisJCQkJIiglbGQpIGlzIG5vdCBzdXBwb3J0ZWQuICBTb3JyeS4iLAorCQkJCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplLCBQQUdFX0NBQ0hFX1NJWkUpOworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaWYgKG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplIDwgTlRGU19CTE9DS19TSVpFKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJJbmRleCBibG9jayBzaXplICgldSkgPCBOVEZTX0JMT0NLX1NJWkUgIgorCQkJCSIoJWkpIGlzIG5vdCBzdXBwb3J0ZWQuICBTb3JyeS4iLAorCQkJCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplLCBOVEZTX0JMT0NLX1NJWkUpOworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemVfYml0cyA9IGZmcyhuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSkgLSAxOworCS8qIERldGVybWluZSB0aGUgc2l6ZSBvZiBhIHZjbiBpbiB0aGUgaW5kZXguICovCisJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplIDw9IG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplKSB7CisJCW5pLT5pdHlwZS5pbmRleC52Y25fc2l6ZSA9IHZvbC0+Y2x1c3Rlcl9zaXplOworCQluaS0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cyA9IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CisJfSBlbHNlIHsKKwkJbmktPml0eXBlLmluZGV4LnZjbl9zaXplID0gdm9sLT5zZWN0b3Jfc2l6ZTsKKwkJbmktPml0eXBlLmluZGV4LnZjbl9zaXplX2JpdHMgPSB2b2wtPnNlY3Rvcl9zaXplX2JpdHM7CisJfQorCS8qIENoZWNrIGZvciBwcmVzZW5jZSBvZiBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZS4gKi8KKwlpZiAoIShpci0+aW5kZXguZmxhZ3MgJiBMQVJHRV9JTkRFWCkpIHsKKwkJLyogTm8gaW5kZXggYWxsb2NhdGlvbi4gKi8KKwkJdmktPmlfc2l6ZSA9IG5pLT5pbml0aWFsaXplZF9zaXplID0gbmktPmFsbG9jYXRlZF9zaXplID0gMDsKKwkJLyogV2UgYXJlIGRvbmUgd2l0aCB0aGUgbWZ0IHJlY29yZCwgc28gd2UgcmVsZWFzZSBpdC4gKi8KKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJCW0gPSBOVUxMOworCQljdHggPSBOVUxMOworCQlnb3RvIHNraXBfbGFyZ2VfaW5kZXhfc3R1ZmY7CisJfSAvKiBMQVJHRV9JTkRFWDogIEluZGV4IGFsbG9jYXRpb24gcHJlc2VudC4gIFNldHVwIHN0YXRlLiAqLworCU5Jbm9TZXRJbmRleEFsbG9jUHJlc2VudChuaSk7CisJLyogRmluZCBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZS4gKi8KKwludGZzX2F0dHJfcmVpbml0X3NlYXJjaF9jdHgoY3R4KTsKKwllcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX0lOREVYX0FMTE9DQVRJT04sIG5pLT5uYW1lLCBuaS0+bmFtZV9sZW4sCisJCQlDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwgMCwgY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlpZiAoZXJyID09IC1FTk9FTlQpCisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJElOREVYX0FMTE9DQVRJT04gYXR0cmlidXRlIGlzICIKKwkJCQkJIm5vdCBwcmVzZW50IGJ1dCAkSU5ERVhfUk9PVCAiCisJCQkJCSJpbmRpY2F0ZWQgaXQgaXMuIik7CisJCWVsc2UKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gbG9va3VwICIKKwkJCQkJIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZS4iKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaWYgKCFjdHgtPmF0dHItPm5vbl9yZXNpZGVudCkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJElOREVYX0FMTE9DQVRJT04gYXR0cmlidXRlIGlzICIKKwkJCQkicmVzaWRlbnQuIik7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCS8qCisJICogRW5zdXJlIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBwbGFjZWQgYmVmb3JlIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5LgorCSAqLworCWlmICh1bmxpa2VseShjdHgtPmF0dHItPm5hbWVfbGVuZ3RoICYmIChsZTE2X3RvX2NwdSgKKwkJCWN0eC0+YXR0ci0+bmFtZV9vZmZzZXQpID49IGxlMTZfdG9fY3B1KAorCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCkpKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgbmFtZSBpcyAiCisJCQkJInBsYWNlZCBhZnRlciB0aGUgbWFwcGluZyBwYWlycyBhcnJheS4iKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJElOREVYX0FMTE9DQVRJT04gYXR0cmlidXRlIGlzICIKKwkJCQkiZW5jcnlwdGVkLiIpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfU1BBUlNFKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgaXMgc3BhcnNlLiIpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJElOREVYX0FMTE9DQVRJT04gYXR0cmlidXRlIGlzICIKKwkJCQkiY29tcHJlc3NlZC4iKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaWYgKGN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmlyc3QgZXh0ZW50IG9mICRJTkRFWF9BTExPQ0FUSU9OICIKKwkJCQkiYXR0cmlidXRlIGhhcyBub24gemVybyBsb3dlc3RfdmNuLiIpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwl2aS0+aV9zaXplID0gc2xlNjRfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuZGF0YV9zaXplKTsKKwluaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKKwkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSk7CisJbmktPmFsbG9jYXRlZF9zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSk7CisJLyoKKwkgKiBXZSBhcmUgZG9uZSB3aXRoIHRoZSBtZnQgcmVjb3JkLCBzbyB3ZSByZWxlYXNlIGl0LiAgT3RoZXJ3aXNlCisJICogd2Ugd291bGQgZGVhZGxvY2sgaW4gbnRmc19hdHRyX2lnZXQoKS4KKwkgKi8KKwludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwl1bm1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCW0gPSBOVUxMOworCWN0eCA9IE5VTEw7CisJLyogR2V0IHRoZSBpbmRleCBiaXRtYXAgYXR0cmlidXRlIGlub2RlLiAqLworCWJ2aSA9IG50ZnNfYXR0cl9pZ2V0KGJhc2VfdmksIEFUX0JJVE1BUCwgbmktPm5hbWUsIG5pLT5uYW1lX2xlbik7CisJaWYgKElTX0VSUihidmkpKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gZ2V0IGJpdG1hcCBhdHRyaWJ1dGUuIik7CisJCWVyciA9IFBUUl9FUlIoYnZpKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJYm5pID0gTlRGU19JKGJ2aSk7CisJaWYgKE5Jbm9Db21wcmVzc2VkKGJuaSkgfHwgTklub0VuY3J5cHRlZChibmkpIHx8CisJCQlOSW5vU3BhcnNlKGJuaSkpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRCSVRNQVAgYXR0cmlidXRlIGlzIGNvbXByZXNzZWQgYW5kL29yICIKKwkJCQkiZW5jcnlwdGVkIGFuZC9vciBzcGFyc2UuIik7CisJCWdvdG8gaXB1dF91bm1fZXJyX291dDsKKwl9CisJLyogQ29uc2lzdGVuY3kgY2hlY2sgYml0bWFwIHNpemUgdnMuIGluZGV4IGFsbG9jYXRpb24gc2l6ZS4gKi8KKwlpZiAoKGJ2aS0+aV9zaXplIDw8IDMpIDwgKHZpLT5pX3NpemUgPj4KKwkJCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplX2JpdHMpKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJJbmRleCBiaXRtYXAgdG9vIHNtYWxsICgweCVsbHgpIGZvciAiCisJCQkJImluZGV4IGFsbG9jYXRpb24gKDB4JWxseCkuIiwgYnZpLT5pX3NpemUgPDwgMywKKwkJCQl2aS0+aV9zaXplKTsKKwkJZ290byBpcHV0X3VubV9lcnJfb3V0OworCX0KKwluaS0+aXR5cGUuaW5kZXguYm1wX2lubyA9IGJ2aTsKK3NraXBfbGFyZ2VfaW5kZXhfc3R1ZmY6CisJLyogU2V0dXAgdGhlIG9wZXJhdGlvbnMgZm9yIHRoaXMgaW5kZXggaW5vZGUuICovCisJdmktPmlfb3AgPSBOVUxMOworCXZpLT5pX2ZvcCA9IE5VTEw7CisJdmktPmlfbWFwcGluZy0+YV9vcHMgPSAmbnRmc19tc3RfYW9wczsKKwl2aS0+aV9ibG9ja3MgPSBuaS0+YWxsb2NhdGVkX3NpemUgPj4gOTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZSBiYXNlIGlub2RlIGRvZXNuJ3QgZ28gYXdheSBhbmQgYXR0YWNoIGl0IHRvIHRoZQorCSAqIGluZGV4IGlub2RlLgorCSAqLworCWlncmFiKGJhc2VfdmkpOworCW5pLT5leHQuYmFzZV9udGZzX2lubyA9IGJhc2Vfbmk7CisJbmktPm5yX2V4dGVudHMgPSAtMTsKKworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIDA7CisKK2lwdXRfdW5tX2Vycl9vdXQ6CisJaXB1dChidmkpOwordW5tX2Vycl9vdXQ6CisJaWYgKCFlcnIpCisJCWVyciA9IC1FSU87CisJaWYgKGN0eCkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJaWYgKG0pCisJCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CitlcnJfb3V0OgorCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgd2l0aCBlcnJvciBjb2RlICVpIHdoaWxlIHJlYWRpbmcgaW5kZXggIgorCQkJImlub2RlIChtZnRfbm8gMHglbHgsIG5hbWVfbGVuICVpLiIsIGVyciwgdmktPmlfaW5vLAorCQkJbmktPm5hbWVfbGVuKTsKKwltYWtlX2JhZF9pbm9kZSh2aSk7CisJaWYgKGVyciAhPSAtRU9QTk9UU1VQUCAmJiBlcnIgIT0gLUVOT01FTSkKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogbnRmc19yZWFkX2lub2RlX21vdW50IC0gc3BlY2lhbCByZWFkX2lub2RlIGZvciBtb3VudCB0aW1lIHVzZSBvbmx5CisgKiBAdmk6CQlpbm9kZSB0byByZWFkCisgKgorICogUmVhZCBpbm9kZSBGSUxFX01GVCBhdCBtb3VudCB0aW1lLCBvbmx5IGNhbGxlZCB3aXRoIHN1cGVyX2Jsb2NrIGxvY2sKKyAqIGhlbGQgZnJvbSB3aXRoaW4gdGhlIHJlYWRfc3VwZXIoKSBjb2RlIHBhdGguCisgKgorICogVGhpcyBmdW5jdGlvbiBleGlzdHMgYmVjYXVzZSB3aGVuIGl0IGlzIGNhbGxlZCB0aGUgcGFnZSBjYWNoZSBmb3IgJE1GVC8kREFUQQorICogaXMgbm90IGluaXRpYWxpemVkIGFuZCBoZW5jZSB3ZSBjYW5ub3QgZ2V0IGF0IHRoZSBjb250ZW50cyBvZiBtZnQgcmVjb3JkcworICogYnkgY2FsbGluZyBtYXBfbWZ0X3JlY29yZCooKS4KKyAqCisgKiBGdXJ0aGVyIGl0IG5lZWRzIHRvIGNvcGUgd2l0aCB0aGUgY2lyY3VsYXIgcmVmZXJlbmNlcyBwcm9ibGVtLCBpLmUuIGNhbm5vdAorICogbG9hZCBhbnkgYXR0cmlidXRlcyBvdGhlciB0aGFuICRBVFRSSUJVVEVfTElTVCB1bnRpbCAkREFUQSBpcyBsb2FkZWQsIGJlY2F1c2UKKyAqIHdlIGRvIG5vdCBrbm93IHdoZXJlIHRoZSBvdGhlciBleHRlbnQgbWZ0IHJlY29yZHMgYXJlIHlldCBhbmQgYWdhaW4sIGJlY2F1c2UKKyAqIHdlIGNhbm5vdCBjYWxsIG1hcF9tZnRfcmVjb3JkKigpIHlldC4gIE9idmlvdXNseSB0aGlzIGFwcGxpZXMgb25seSB3aGVuIGFuCisgKiBhdHRyaWJ1dGUgbGlzdCBpcyBhY3R1YWxseSBwcmVzZW50IGluICRNRlQgaW5vZGUuCisgKgorICogV2Ugc29sdmUgdGhlc2UgcHJvYmxlbXMgYnkgc3RhcnRpbmcgd2l0aCB0aGUgJERBVEEgYXR0cmlidXRlIGJlZm9yZSBhbnl0aGluZworICogZWxzZSBhbmQgaXRlcmF0aW5nIHVzaW5nIG50ZnNfYXR0cl9sb29rdXAoJERBVEEpIG92ZXIgYWxsIGV4dGVudHMuICBBcyBlYWNoCisgKiBleHRlbnQgaXMgZm91bmQsIHdlIG50ZnNfbWFwcGluZ19wYWlyc19kZWNvbXByZXNzKCkgaW5jbHVkaW5nIHRoZSBpbXBsaWVkCisgKiBudGZzX3J1bmxpc3RzX21lcmdlKCkuICBFYWNoIHN0ZXAgb2YgdGhlIGl0ZXJhdGlvbiBuZWNlc3NhcmlseSBwcm92aWRlcworICogc3VmZmljaWVudCBpbmZvcm1hdGlvbiBmb3IgdGhlIG5leHQgc3RlcCB0byBjb21wbGV0ZS4KKyAqCisgKiBUaGlzIHNob3VsZCB3b3JrIGJ1dCB0aGVyZSBhcmUgdHdvIHBvc3NpYmxlIHBpdCBmYWxscyAoc2VlIGlubGluZSBjb21tZW50cworICogYmVsb3cpLCBidXQgb25seSB0aW1lIHdpbGwgdGVsbCBpZiB0aGV5IGFyZSByZWFsIHBpdHMgb3IganVzdCBzbW9rZS4uLgorICovCitpbnQgbnRmc19yZWFkX2lub2RlX21vdW50KHN0cnVjdCBpbm9kZSAqdmkpCit7CisJVkNOIG5leHRfdmNuLCBsYXN0X3ZjbiwgaGlnaGVzdF92Y247CisJczY0IGJsb2NrOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB2aS0+aV9zYjsKKwludGZzX3ZvbHVtZSAqdm9sID0gTlRGU19TQihzYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwludGZzX2lub2RlICpuaTsKKwlNRlRfUkVDT1JEICptID0gTlVMTDsKKwlBVFRSX1JFQ09SRCAqYXR0cjsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OworCXVuc2lnbmVkIGludCBpLCBucl9ibG9ja3M7CisJaW50IGVycjsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgbnRmcyBzcGVjaWZpYyBwYXJ0IG9mIEB2aS4gKi8KKwludGZzX2luaXRfYmlnX2lub2RlKHZpKTsKKworCW5pID0gTlRGU19JKHZpKTsKKworCS8qIFNldHVwIHRoZSBkYXRhIGF0dHJpYnV0ZS4gSXQgaXMgc3BlY2lhbCBhcyBpdCBpcyBtc3QgcHJvdGVjdGVkLiAqLworCU5Jbm9TZXROb25SZXNpZGVudChuaSk7CisJTklub1NldE1zdFByb3RlY3RlZChuaSk7CisJbmktPnR5cGUgPSBBVF9EQVRBOworCW5pLT5uYW1lID0gTlVMTDsKKwluaS0+bmFtZV9sZW4gPSAwOworCisJLyoKKwkgKiBUaGlzIHNldHMgdXAgb3VyIGxpdHRsZSBjaGVhdCBhbGxvd2luZyB1cyB0byByZXVzZSB0aGUgYXN5bmMgcmVhZCBpbworCSAqIGNvbXBsZXRpb24gaGFuZGxlciBmb3IgZGlyZWN0b3JpZXMuCisJICovCisJbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUgPSB2b2wtPm1mdF9yZWNvcmRfc2l6ZTsKKwluaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZV9iaXRzID0gdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0czsKKworCS8qIFZlcnkgaW1wb3J0YW50ISBOZWVkZWQgdG8gYmUgYWJsZSB0byBjYWxsIG1hcF9tZnRfcmVjb3JkKigpLiAqLworCXZvbC0+bWZ0X2lubyA9IHZpOworCisJLyogQWxsb2NhdGUgZW5vdWdoIG1lbW9yeSB0byByZWFkIHRoZSBmaXJzdCBtZnQgcmVjb3JkLiAqLworCWlmICh2b2wtPm1mdF9yZWNvcmRfc2l6ZSA+IDY0ICogMTAyNCkgeworCQludGZzX2Vycm9yKHNiLCAiVW5zdXBwb3J0ZWQgbWZ0IHJlY29yZCBzaXplICVpIChtYXggNjRraUIpLiIsCisJCQkJdm9sLT5tZnRfcmVjb3JkX3NpemUpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWkgPSB2b2wtPm1mdF9yZWNvcmRfc2l6ZTsKKwlpZiAoaSA8IHNiLT5zX2Jsb2Nrc2l6ZSkKKwkJaSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwltID0gKE1GVF9SRUNPUkQqKW50ZnNfbWFsbG9jX25vZnMoaSk7CisJaWYgKCFtKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciAkTUZUIHJlY29yZCAwLiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogRGV0ZXJtaW5lIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgJE1GVC8kREFUQSBhdHRyaWJ1dGUuICovCisJYmxvY2sgPSB2b2wtPm1mdF9sY24gPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cyA+PgorCQkJc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJbnJfYmxvY2tzID0gdm9sLT5tZnRfcmVjb3JkX3NpemUgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJaWYgKCFucl9ibG9ja3MpCisJCW5yX2Jsb2NrcyA9IDE7CisKKwkvKiBMb2FkICRNRlQvJERBVEEncyBmaXJzdCBtZnQgcmVjb3JkLiAqLworCWZvciAoaSA9IDA7IGkgPCBucl9ibG9ja3M7IGkrKykgeworCQliaCA9IHNiX2JyZWFkKHNiLCBibG9jaysrKTsKKwkJaWYgKCFiaCkgeworCQkJbnRmc19lcnJvcihzYiwgIkRldmljZSByZWFkIGZhaWxlZC4iKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQltZW1jcHkoKGNoYXIqKW0gKyAoaSA8PCBzYi0+c19ibG9ja3NpemVfYml0cyksIGJoLT5iX2RhdGEsCisJCQkJc2ItPnNfYmxvY2tzaXplKTsKKwkJYnJlbHNlKGJoKTsKKwl9CisKKwkvKiBBcHBseSB0aGUgbXN0IGZpeHVwcy4gKi8KKwlpZiAocG9zdF9yZWFkX21zdF9maXh1cCgoTlRGU19SRUNPUkQqKW0sIHZvbC0+bWZ0X3JlY29yZF9zaXplKSkgeworCQkvKiBGSVhNRTogVHJ5IHRvIHVzZSB0aGUgJE1GVE1pcnIgbm93LiAqLworCQludGZzX2Vycm9yKHNiLCAiTVNUIGZpeHVwIGZhaWxlZC4gJE1GVCBpcyBjb3JydXB0LiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogTmVlZCB0aGlzIHRvIHNhbml0eSBjaGVjayBhdHRyaWJ1dGUgbGlzdCByZWZlcmVuY2VzIHRvICRNRlQuICovCisJdmktPmlfZ2VuZXJhdGlvbiA9IG5pLT5zZXFfbm8gPSBsZTE2X3RvX2NwdShtLT5zZXF1ZW5jZV9udW1iZXIpOworCisJLyogUHJvdmlkZXMgcmVhZHBhZ2UoKSBhbmQgc3luY19wYWdlKCkgZm9yIG1hcF9tZnRfcmVjb3JkKCkuICovCisJdmktPmlfbWFwcGluZy0+YV9vcHMgPSAmbnRmc19tc3RfYW9wczsKKworCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChuaSwgbSk7CisJaWYgKCFjdHgpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIEZpbmQgdGhlIGF0dHJpYnV0ZSBsaXN0IGF0dHJpYnV0ZSBpZiBwcmVzZW50LiAqLworCWVyciA9IG50ZnNfYXR0cl9sb29rdXAoQVRfQVRUUklCVVRFX0xJU1QsIE5VTEwsIDAsIDAsIDAsIE5VTEwsIDAsIGN0eCk7CisJaWYgKGVycikgeworCQlpZiAodW5saWtlbHkoZXJyICE9IC1FTk9FTlQpKSB7CisJCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGxvb2t1cCBhdHRyaWJ1dGUgbGlzdCAiCisJCQkJCSJhdHRyaWJ1dGUuIFlvdSBzaG91bGQgcnVuIGNoa2Rzay4iKTsKKwkJCWdvdG8gcHV0X2Vycl9vdXQ7CisJCX0KKwl9IGVsc2UgLyogaWYgKCFlcnIpICovIHsKKwkJQVRUUl9MSVNUX0VOVFJZICphbF9lbnRyeSwgKm5leHRfYWxfZW50cnk7CisJCXU4ICphbF9lbmQ7CisKKwkJbnRmc19kZWJ1ZygiQXR0cmlidXRlIGxpc3QgYXR0cmlidXRlIGZvdW5kIGluICRNRlQuIik7CisJCU5Jbm9TZXRBdHRyTGlzdChuaSk7CisJCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19FTkNSWVBURUQgfHwKKwkJCQljdHgtPmF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLIHx8CisJCQkJY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfU1BBUlNFKSB7CisJCQludGZzX2Vycm9yKHNiLCAiQXR0cmlidXRlIGxpc3QgYXR0cmlidXRlIGlzICIKKwkJCQkJImNvbXByZXNzZWQvZW5jcnlwdGVkL3NwYXJzZS4gTm90ICIKKwkJCQkJImFsbG93ZWQuICRNRlQgaXMgY29ycnVwdC4gWW91IHNob3VsZCAiCisJCQkJCSJydW4gY2hrZHNrLiIpOworCQkJZ290byBwdXRfZXJyX291dDsKKwkJfQorCQkvKiBOb3cgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgYXR0cmlidXRlIGxpc3QuICovCisJCW5pLT5hdHRyX2xpc3Rfc2l6ZSA9ICh1MzIpbnRmc19hdHRyX3NpemUoY3R4LT5hdHRyKTsKKwkJbmktPmF0dHJfbGlzdCA9IG50ZnNfbWFsbG9jX25vZnMobmktPmF0dHJfbGlzdF9zaXplKTsKKwkJaWYgKCFuaS0+YXR0cl9saXN0KSB7CisJCQludGZzX2Vycm9yKHNiLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgYnVmZmVyICIKKwkJCQkJImZvciBhdHRyaWJ1dGUgbGlzdC4iKTsKKwkJCWdvdG8gcHV0X2Vycl9vdXQ7CisJCX0KKwkJaWYgKGN0eC0+YXR0ci0+bm9uX3Jlc2lkZW50KSB7CisJCQlOSW5vU2V0QXR0ckxpc3ROb25SZXNpZGVudChuaSk7CisJCQlpZiAoY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CisJCQkJbnRmc19lcnJvcihzYiwgIkF0dHJpYnV0ZSBsaXN0IGhhcyBub24gemVybyAiCisJCQkJCQkibG93ZXN0X3Zjbi4gJE1GVCBpcyBjb3JydXB0LiAiCisJCQkJCQkiWW91IHNob3VsZCBydW4gY2hrZHNrLiIpOworCQkJCWdvdG8gcHV0X2Vycl9vdXQ7CisJCQl9CisJCQkvKiBTZXR1cCB0aGUgcnVubGlzdC4gKi8KKwkJCW5pLT5hdHRyX2xpc3RfcmwucmwgPSBudGZzX21hcHBpbmdfcGFpcnNfZGVjb21wcmVzcyh2b2wsCisJCQkJCWN0eC0+YXR0ciwgTlVMTCk7CisJCQlpZiAoSVNfRVJSKG5pLT5hdHRyX2xpc3RfcmwucmwpKSB7CisJCQkJZXJyID0gUFRSX0VSUihuaS0+YXR0cl9saXN0X3JsLnJsKTsKKwkJCQluaS0+YXR0cl9saXN0X3JsLnJsID0gTlVMTDsKKwkJCQludGZzX2Vycm9yKHNiLCAiTWFwcGluZyBwYWlycyBkZWNvbXByZXNzaW9uICIKKwkJCQkJCSJmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVpLiIsCisJCQkJCQktZXJyKTsKKwkJCQlnb3RvIHB1dF9lcnJfb3V0OworCQkJfQorCQkJLyogTm93IGxvYWQgdGhlIGF0dHJpYnV0ZSBsaXN0LiAqLworCQkJaWYgKChlcnIgPSBsb2FkX2F0dHJpYnV0ZV9saXN0KHZvbCwgJm5pLT5hdHRyX2xpc3RfcmwsCisJCQkJCW5pLT5hdHRyX2xpc3QsIG5pLT5hdHRyX2xpc3Rfc2l6ZSwKKwkJCQkJc2xlNjRfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS4KKwkJCQkJbm9uX3Jlc2lkZW50LmluaXRpYWxpemVkX3NpemUpKSkpIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGxvYWQgYXR0cmlidXRlIGxpc3QgIgorCQkJCQkJImF0dHJpYnV0ZSB3aXRoIGVycm9yIGNvZGUgJWkuIiwKKwkJCQkJCS1lcnIpOworCQkJCWdvdG8gcHV0X2Vycl9vdXQ7CisJCQl9CisJCX0gZWxzZSAvKiBpZiAoIWN0eC5hdHRyLT5ub25fcmVzaWRlbnQpICovIHsKKwkJCWlmICgodTgqKWN0eC0+YXR0ciArIGxlMTZfdG9fY3B1KAorCQkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSArCisJCQkJCWxlMzJfdG9fY3B1KAorCQkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKSA+CisJCQkJCSh1OCopY3R4LT5tcmVjICsgdm9sLT5tZnRfcmVjb3JkX3NpemUpIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiQ29ycnVwdCBhdHRyaWJ1dGUgbGlzdCAiCisJCQkJCQkiYXR0cmlidXRlLiIpOworCQkJCWdvdG8gcHV0X2Vycl9vdXQ7CisJCQl9CisJCQkvKiBOb3cgY29weSB0aGUgYXR0cmlidXRlIGxpc3QuICovCisJCQltZW1jcHkobmktPmF0dHJfbGlzdCwgKHU4KiljdHgtPmF0dHIgKyBsZTE2X3RvX2NwdSgKKwkJCQkJY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCksCisJCQkJCWxlMzJfdG9fY3B1KAorCQkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKSk7CisJCX0KKwkJLyogVGhlIGF0dHJpYnV0ZSBsaXN0IGlzIG5vdyBzZXR1cCBpbiBtZW1vcnkuICovCisJCS8qCisJCSAqIEZJWE1FOiBJIGRvbid0IGtub3cgaWYgdGhpcyBjYXNlIGlzIGFjdHVhbGx5IHBvc3NpYmxlLgorCQkgKiBBY2NvcmRpbmcgdG8gbG9naWMgaXQgaXMgbm90IHBvc3NpYmxlIGJ1dCBJIGhhdmUgc2VlbiB0b28KKwkJICogbWFueSB3ZWlyZCB0aGluZ3MgaW4gTVMgc29mdHdhcmUgdG8gcmVseSBvbiBsb2dpYy4uLiBUaHVzIHdlCisJCSAqIHBlcmZvcm0gYSBtYW51YWwgc2VhcmNoIGFuZCBtYWtlIHN1cmUgdGhlIGZpcnN0ICRNRlQvJERBVEEKKwkJICogZXh0ZW50IGlzIGluIHRoZSBiYXNlIGlub2RlLiBJZiBpdCBpcyBub3Qgd2UgYWJvcnQgd2l0aCBhbgorCQkgKiBlcnJvciBhbmQgaWYgd2UgZXZlciBzZWUgYSByZXBvcnQgb2YgdGhpcyBlcnJvciB3ZSB3aWxsIG5lZWQKKwkJICogdG8gZG8gc29tZSBtYWdpYyBpbiBvcmRlciB0byBoYXZlIHRoZSBuZWNlc3NhcnkgbWZ0IHJlY29yZAorCQkgKiBsb2FkZWQgYW5kIGluIHRoZSByaWdodCBwbGFjZSBpbiB0aGUgcGFnZSBjYWNoZS4gQnV0CisJCSAqIGhvcGVmdWxseSBsb2dpYyB3aWxsIHByZXZhaWwgYW5kIHRoaXMgbmV2ZXIgaGFwcGVucy4uLgorCQkgKi8KKwkJYWxfZW50cnkgPSAoQVRUUl9MSVNUX0VOVFJZKiluaS0+YXR0cl9saXN0OworCQlhbF9lbmQgPSAodTgqKWFsX2VudHJ5ICsgbmktPmF0dHJfbGlzdF9zaXplOworCQlmb3IgKDs7IGFsX2VudHJ5ID0gbmV4dF9hbF9lbnRyeSkgeworCQkJLyogT3V0IG9mIGJvdW5kcyBjaGVjay4gKi8KKwkJCWlmICgodTgqKWFsX2VudHJ5IDwgbmktPmF0dHJfbGlzdCB8fAorCQkJCQkodTgqKWFsX2VudHJ5ID4gYWxfZW5kKQorCQkJCWdvdG8gZW1fcHV0X2Vycl9vdXQ7CisJCQkvKiBDYXRjaCB0aGUgZW5kIG9mIHRoZSBhdHRyaWJ1dGUgbGlzdC4gKi8KKwkJCWlmICgodTgqKWFsX2VudHJ5ID09IGFsX2VuZCkKKwkJCQlnb3RvIGVtX3B1dF9lcnJfb3V0OworCQkJaWYgKCFhbF9lbnRyeS0+bGVuZ3RoKQorCQkJCWdvdG8gZW1fcHV0X2Vycl9vdXQ7CisJCQlpZiAoKHU4KilhbF9lbnRyeSArIDYgPiBhbF9lbmQgfHwgKHU4KilhbF9lbnRyeSArCisJCQkJCWxlMTZfdG9fY3B1KGFsX2VudHJ5LT5sZW5ndGgpID4gYWxfZW5kKQorCQkJCWdvdG8gZW1fcHV0X2Vycl9vdXQ7CisJCQluZXh0X2FsX2VudHJ5ID0gKEFUVFJfTElTVF9FTlRSWSopKCh1OCopYWxfZW50cnkgKworCQkJCQlsZTE2X3RvX2NwdShhbF9lbnRyeS0+bGVuZ3RoKSk7CisJCQlpZiAobGUzMl90b19jcHUoYWxfZW50cnktPnR5cGUpID4KKwkJCQkJY29uc3RfbGUzMl90b19jcHUoQVRfREFUQSkpCisJCQkJZ290byBlbV9wdXRfZXJyX291dDsKKwkJCWlmIChBVF9EQVRBICE9IGFsX2VudHJ5LT50eXBlKQorCQkJCWNvbnRpbnVlOworCQkJLyogV2Ugd2FudCBhbiB1bm5hbWVkIGF0dHJpYnV0ZS4gKi8KKwkJCWlmIChhbF9lbnRyeS0+bmFtZV9sZW5ndGgpCisJCQkJZ290byBlbV9wdXRfZXJyX291dDsKKwkJCS8qIFdhbnQgdGhlIGZpcnN0IGVudHJ5LCBpLmUuIGxvd2VzdF92Y24gPT0gMC4gKi8KKwkJCWlmIChhbF9lbnRyeS0+bG93ZXN0X3ZjbikKKwkJCQlnb3RvIGVtX3B1dF9lcnJfb3V0OworCQkJLyogRmlyc3QgZW50cnkgaGFzIHRvIGJlIGluIHRoZSBiYXNlIG1mdCByZWNvcmQuICovCisJCQlpZiAoTVJFRl9MRShhbF9lbnRyeS0+bWZ0X3JlZmVyZW5jZSkgIT0gdmktPmlfaW5vKSB7CisJCQkJLyogTUZUIHJlZmVyZW5jZXMgZG8gbm90IG1hdGNoLCBsb2dpYyBmYWlscy4gKi8KKwkJCQludGZzX2Vycm9yKHNiLCAiQlVHOiBUaGUgZmlyc3QgJERBVEEgZXh0ZW50ICIKKwkJCQkJCSJvZiAkTUZUIGlzIG5vdCBpbiB0aGUgYmFzZSAiCisJCQkJCQkibWZ0IHJlY29yZC4gUGxlYXNlIHJlcG9ydCAiCisJCQkJCQkieW91IHNhdyB0aGlzIG1lc3NhZ2UgdG8gIgorCQkJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLiIKKwkJCQkJCSJzb3VyY2Vmb3JnZS5uZXQiKTsKKwkJCQlnb3RvIHB1dF9lcnJfb3V0OworCQkJfSBlbHNlIHsKKwkJCQkvKiBTZXF1ZW5jZSBudW1iZXJzIG11c3QgbWF0Y2guICovCisJCQkJaWYgKE1TRVFOT19MRShhbF9lbnRyeS0+bWZ0X3JlZmVyZW5jZSkgIT0KKwkJCQkJCW5pLT5zZXFfbm8pCisJCQkJCWdvdG8gZW1fcHV0X2Vycl9vdXQ7CisJCQkJLyogR290IGl0LiBBbGwgaXMgb2suIFdlIGNhbiBzdG9wIG5vdy4gKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCW50ZnNfYXR0cl9yZWluaXRfc2VhcmNoX2N0eChjdHgpOworCisJLyogTm93IGxvYWQgYWxsIGF0dHJpYnV0ZSBleHRlbnRzLiAqLworCWF0dHIgPSBOVUxMOworCW5leHRfdmNuID0gbGFzdF92Y24gPSBoaWdoZXN0X3ZjbiA9IDA7CisJd2hpbGUgKCEoZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9EQVRBLCBOVUxMLCAwLCAwLCBuZXh0X3ZjbiwgTlVMTCwgMCwKKwkJCWN0eCkpKSB7CisJCXJ1bmxpc3RfZWxlbWVudCAqbnJsOworCisJCS8qIENhY2hlIHRoZSBjdXJyZW50IGF0dHJpYnV0ZS4gKi8KKwkJYXR0ciA9IGN0eC0+YXR0cjsKKwkJLyogJE1GVCBtdXN0IGJlIG5vbi1yZXNpZGVudC4gKi8KKwkJaWYgKCFhdHRyLT5ub25fcmVzaWRlbnQpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICIkTUZUIG11c3QgYmUgbm9uLXJlc2lkZW50IGJ1dCBhICIKKwkJCQkJInJlc2lkZW50IGV4dGVudCB3YXMgZm91bmQuICRNRlQgaXMgIgorCQkJCQkiY29ycnVwdC4gUnVuIGNoa2Rzay4iKTsKKwkJCWdvdG8gcHV0X2Vycl9vdXQ7CisJCX0KKwkJLyogJE1GVCBtdXN0IGJlIHVuY29tcHJlc3NlZCBhbmQgdW5lbmNyeXB0ZWQuICovCisJCWlmIChhdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSyB8fAorCQkJCWF0dHItPmZsYWdzICYgQVRUUl9JU19FTkNSWVBURUQgfHwKKwkJCQlhdHRyLT5mbGFncyAmIEFUVFJfSVNfU1BBUlNFKSB7CisJCQludGZzX2Vycm9yKHNiLCAiJE1GVCBtdXN0IGJlIHVuY29tcHJlc3NlZCwgIgorCQkJCQkibm9uLXNwYXJzZSwgYW5kIHVuZW5jcnlwdGVkIGJ1dCBhICIKKwkJCQkJImNvbXByZXNzZWQvc3BhcnNlL2VuY3J5cHRlZCBleHRlbnQgIgorCQkJCQkid2FzIGZvdW5kLiAkTUZUIGlzIGNvcnJ1cHQuIFJ1biAiCisJCQkJCSJjaGtkc2suIik7CisJCQlnb3RvIHB1dF9lcnJfb3V0OworCQl9CisJCS8qCisJCSAqIERlY29tcHJlc3MgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkgb2YgdGhpcyBleHRlbnQgYW5kIG1lcmdlCisJCSAqIHRoZSByZXN1bHQgaW50byB0aGUgZXhpc3RpbmcgcnVubGlzdC4gTm8gbmVlZCBmb3IgbG9ja2luZworCQkgKiBhcyB3ZSBoYXZlIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIGlub2RlIGF0IHRoaXMgdGltZSBhbmQgd2UKKwkJICogYXJlIGEgbW91bnQgaW4gcHJvZ3Jlc3MgdGFzaywgdG9vLgorCQkgKi8KKwkJbnJsID0gbnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3Modm9sLCBhdHRyLCBuaS0+cnVubGlzdC5ybCk7CisJCWlmIChJU19FUlIobnJsKSkgeworCQkJbnRmc19lcnJvcihzYiwgIm50ZnNfbWFwcGluZ19wYWlyc19kZWNvbXByZXNzKCkgIgorCQkJCQkiZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlbGQuICAkTUZUIGlzICIKKwkJCQkJImNvcnJ1cHQuIiwgUFRSX0VSUihucmwpKTsKKwkJCWdvdG8gcHV0X2Vycl9vdXQ7CisJCX0KKwkJbmktPnJ1bmxpc3QucmwgPSBucmw7CisKKwkJLyogQXJlIHdlIGluIHRoZSBmaXJzdCBleHRlbnQ/ICovCisJCWlmICghbmV4dF92Y24pIHsKKwkJCWlmIChhdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CisJCQkJbnRmc19lcnJvcihzYiwgIkZpcnN0IGV4dGVudCBvZiAkREFUQSAiCisJCQkJCQkiYXR0cmlidXRlIGhhcyBub24gemVybyAiCisJCQkJCQkibG93ZXN0X3Zjbi4gJE1GVCBpcyBjb3JydXB0LiAiCisJCQkJCQkiWW91IHNob3VsZCBydW4gY2hrZHNrLiIpOworCQkJCWdvdG8gcHV0X2Vycl9vdXQ7CisJCQl9CisJCQkvKiBHZXQgdGhlIGxhc3QgdmNuIGluIHRoZSAkREFUQSBhdHRyaWJ1dGUuICovCisJCQlsYXN0X3ZjbiA9IHNsZTY0X3RvX2NwdSgKKwkJCQkJYXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUpCisJCQkJCT4+IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CisJCQkvKiBGaWxsIGluIHRoZSBpbm9kZSBzaXplLiAqLworCQkJdmktPmlfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKKwkJCQkJYXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuZGF0YV9zaXplKTsKKwkJCW5pLT5pbml0aWFsaXplZF9zaXplID0gc2xlNjRfdG9fY3B1KGF0dHItPmRhdGEuCisJCQkJCW5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplKTsKKwkJCW5pLT5hbGxvY2F0ZWRfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKKwkJCQkJYXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUpOworCQkJLyoKKwkJCSAqIFZlcmlmeSB0aGUgbnVtYmVyIG9mIG1mdCByZWNvcmRzIGRvZXMgbm90IGV4Y2VlZAorCQkJICogMl4zMiAtIDEuCisJCQkgKi8KKwkJCWlmICgodmktPmlfc2l6ZSA+PiB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzKSA+PQorCQkJCQkoMVVMTCA8PCAzMikpIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiJE1GVCBpcyB0b28gYmlnISBBYm9ydGluZy4iKTsKKwkJCQlnb3RvIHB1dF9lcnJfb3V0OworCQkJfQorCQkJLyoKKwkJCSAqIFdlIGhhdmUgZ290IHRoZSBmaXJzdCBleHRlbnQgb2YgdGhlIHJ1bmxpc3QgZm9yCisJCQkgKiAkTUZUIHdoaWNoIG1lYW5zIGl0IGlzIG5vdyByZWxhdGl2ZWx5IHNhZmUgdG8gY2FsbAorCQkJICogdGhlIG5vcm1hbCBudGZzX3JlYWRfaW5vZGUoKSBmdW5jdGlvbi4KKwkJCSAqIENvbXBsZXRlIHJlYWRpbmcgdGhlIGlub2RlLCB0aGlzIHdpbGwgYWN0dWFsbHkKKwkJCSAqIHJlLXJlYWQgdGhlIG1mdCByZWNvcmQgZm9yICRNRlQsIHRoaXMgdGltZSBlbnRlcmluZworCQkJICogaXQgaW50byB0aGUgcGFnZSBjYWNoZSB3aXRoIHdoaWNoIHdlIGNvbXBsZXRlIHRoZQorCQkJICoga2ljayBzdGFydCBvZiB0aGUgdm9sdW1lLiBJdCBzaG91bGQgYmUgc2FmZSB0byBkbworCQkJICogdGhpcyBub3cgYXMgdGhlIGZpcnN0IGV4dGVudCBvZiAkTUZULyREQVRBIGlzCisJCQkgKiBhbHJlYWR5IGtub3duIGFuZCB3ZSB3b3VsZCBob3BlIHRoYXQgd2UgZG9uJ3QgbmVlZAorCQkJICogZnVydGhlciBleHRlbnRzIGluIG9yZGVyIHRvIGZpbmQgdGhlIG90aGVyCisJCQkgKiBhdHRyaWJ1dGVzIGJlbG9uZ2luZyB0byAkTUZULiBPbmx5IHRpbWUgd2lsbCB0ZWxsIGlmCisJCQkgKiB0aGlzIGlzIHJlYWxseSB0aGUgY2FzZS4gSWYgbm90IHdlIHdpbGwgaGF2ZSB0byBwbGF5CisJCQkgKiBtYWdpYyBhdCB0aGlzIHBvaW50LCBwb3NzaWJseSBkdXBsaWNhdGluZyBhIGxvdCBvZgorCQkJICogbnRmc19yZWFkX2lub2RlKCkgYXQgdGhpcyBwb2ludC4gV2Ugd2lsbCBuZWVkIHRvCisJCQkgKiBlbnN1cmUgd2UgZG8gZW5vdWdoIG9mIGl0cyB3b3JrIHRvIGJlIGFibGUgdG8gY2FsbAorCQkJICogbnRmc19yZWFkX2lub2RlKCkgb24gZXh0ZW50cyBvZiAkTUZULyREQVRBLiBCdXQgbGV0cworCQkJICogaG9wZSB0aGlzIG5ldmVyIGhhcHBlbnMuLi4KKwkJCSAqLworCQkJbnRmc19yZWFkX2xvY2tlZF9pbm9kZSh2aSk7CisJCQlpZiAoaXNfYmFkX2lub2RlKHZpKSkgeworCQkJCW50ZnNfZXJyb3Ioc2IsICJudGZzX3JlYWRfaW5vZGUoKSBvZiAkTUZUICIKKwkJCQkJCSJmYWlsZWQuIEJVRyBvciBjb3JydXB0ICRNRlQuICIKKwkJCQkJCSJSdW4gY2hrZHNrIGFuZCBpZiBubyBlcnJvcnMgIgorCQkJCQkJImFyZSBmb3VuZCwgcGxlYXNlIHJlcG9ydCB5b3UgIgorCQkJCQkJInNhdyB0aGlzIG1lc3NhZ2UgdG8gIgorCQkJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLiIKKwkJCQkJCSJzb3VyY2Vmb3JnZS5uZXQiKTsKKwkJCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwkJCQkvKiBSZXZlcnQgdG8gdGhlIHNhZmUgc3VwZXIgb3BlcmF0aW9ucy4gKi8KKwkJCQludGZzX2ZyZWUobSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJLyoKKwkJCSAqIFJlLWluaXRpYWxpemUgc29tZSBzcGVjaWZpY3MgYWJvdXQgJE1GVCdzIGlub2RlIGFzCisJCQkgKiBudGZzX3JlYWRfaW5vZGUoKSB3aWxsIGhhdmUgc2V0IHVwIHRoZSBkZWZhdWx0IG9uZXMuCisJCQkgKi8KKwkJCS8qIFNldCB1aWQgYW5kIGdpZCB0byByb290LiAqLworCQkJdmktPmlfdWlkID0gdmktPmlfZ2lkID0gMDsKKwkJCS8qIFJlZ3VsYXIgZmlsZS4gTm8gYWNjZXNzIGZvciBhbnlvbmUuICovCisJCQl2aS0+aV9tb2RlID0gU19JRlJFRzsKKwkJCS8qIE5vIFZGUyBpbml0aWF0ZWQgb3BlcmF0aW9ucyBhbGxvd2VkIGZvciAkTUZULiAqLworCQkJdmktPmlfb3AgPSAmbnRmc19lbXB0eV9pbm9kZV9vcHM7CisJCQl2aS0+aV9mb3AgPSAmbnRmc19lbXB0eV9maWxlX29wczsKKwkJfQorCisJCS8qIEdldCB0aGUgbG93ZXN0IHZjbiBmb3IgdGhlIG5leHQgZXh0ZW50LiAqLworCQloaWdoZXN0X3ZjbiA9IHNsZTY0X3RvX2NwdShhdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5oaWdoZXN0X3Zjbik7CisJCW5leHRfdmNuID0gaGlnaGVzdF92Y24gKyAxOworCisJCS8qIE9ubHkgb25lIGV4dGVudCBvciBlcnJvciwgd2hpY2ggd2UgY2F0Y2ggYmVsb3cuICovCisJCWlmIChuZXh0X3ZjbiA8PSAwKQorCQkJYnJlYWs7CisKKwkJLyogQXZvaWQgZW5kbGVzcyBsb29wcyBkdWUgdG8gY29ycnVwdGlvbi4gKi8KKwkJaWYgKG5leHRfdmNuIDwgc2xlNjRfdG9fY3B1KAorCQkJCWF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pKSB7CisJCQludGZzX2Vycm9yKHNiLCAiJE1GVCBoYXMgY29ycnVwdCBhdHRyaWJ1dGUgbGlzdCAiCisJCQkJCSJhdHRyaWJ1dGUuIFJ1biBjaGtkc2suIik7CisJCQlnb3RvIHB1dF9lcnJfb3V0OworCQl9CisJfQorCWlmIChlcnIgIT0gLUVOT0VOVCkgeworCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGxvb2t1cCAkTUZULyREQVRBIGF0dHJpYnV0ZSBleHRlbnQuICIKKwkJCQkiJE1GVCBpcyBjb3JydXB0LiBSdW4gY2hrZHNrLiIpOworCQlnb3RvIHB1dF9lcnJfb3V0OworCX0KKwlpZiAoIWF0dHIpIHsKKwkJbnRmc19lcnJvcihzYiwgIiRNRlQvJERBVEEgYXR0cmlidXRlIG5vdCBmb3VuZC4gJE1GVCBpcyAiCisJCQkJImNvcnJ1cHQuIFJ1biBjaGtkc2suIik7CisJCWdvdG8gcHV0X2Vycl9vdXQ7CisJfQorCWlmIChoaWdoZXN0X3ZjbiAmJiBoaWdoZXN0X3ZjbiAhPSBsYXN0X3ZjbiAtIDEpIHsKKwkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBsb2FkIHRoZSBjb21wbGV0ZSBydW5saXN0IGZvciAiCisJCQkJIiRNRlQvJERBVEEuIERyaXZlciBidWcgb3IgY29ycnVwdCAkTUZULiAiCisJCQkJIlJ1biBjaGtkc2suIik7CisJCW50ZnNfZGVidWcoImhpZ2hlc3RfdmNuID0gMHglbGx4LCBsYXN0X3ZjbiAtIDEgPSAweCVsbHgiLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaGlnaGVzdF92Y24sCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X3ZjbiAtIDEpOworCQlnb3RvIHB1dF9lcnJfb3V0OworCX0KKwludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwludGZzX2RlYnVnKCJEb25lLiIpOworCW50ZnNfZnJlZShtKTsKKwlyZXR1cm4gMDsKKworZW1fcHV0X2Vycl9vdXQ6CisJbnRmc19lcnJvcihzYiwgIkNvdWxkbid0IGZpbmQgZmlyc3QgZXh0ZW50IG9mICREQVRBIGF0dHJpYnV0ZSBpbiAiCisJCQkiYXR0cmlidXRlIGxpc3QuICRNRlQgaXMgY29ycnVwdC4gUnVuIGNoa2Rzay4iKTsKK3B1dF9lcnJfb3V0OgorCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworZXJyX291dDoKKwludGZzX2Vycm9yKHNiLCAiRmFpbGVkLiBNYXJraW5nIGlub2RlIGFzIGJhZC4iKTsKKwltYWtlX2JhZF9pbm9kZSh2aSk7CisJbnRmc19mcmVlKG0pOworCXJldHVybiAtMTsKK30KKworLyoqCisgKiBudGZzX3B1dF9pbm9kZSAtIGhhbmRsZXIgZm9yIHdoZW4gdGhlIGlub2RlIHJlZmVyZW5jZSBjb3VudCBpcyBkZWNyZW1lbnRlZAorICogQHZpOgkJdmZzIGlub2RlCisgKgorICogVGhlIFZGUyBjYWxscyBudGZzX3B1dF9pbm9kZSgpIGV2ZXJ5IHRpbWUgdGhlIGlub2RlIHJlZmVyZW5jZSBjb3VudCAoaV9jb3VudCkKKyAqIGlzIGFib3V0IHRvIGJlIGRlY3JlbWVudGVkIChidXQgYmVmb3JlIHRoZSBkZWNyZW1lbnQgaXRzZWxmLgorICoKKyAqIElmIHRoZSBpbm9kZSBAdmkgaXMgYSBkaXJlY3Rvcnkgd2l0aCB0d28gcmVmZXJlbmNlcywgb25lIG9mIHdoaWNoIGlzIGJlaW5nCisgKiBkcm9wcGVkLCB3ZSBuZWVkIHRvIHB1dCB0aGUgYXR0cmlidXRlIGlub2RlIGZvciB0aGUgZGlyZWN0b3J5IGluZGV4IGJpdG1hcCwKKyAqIGlmIGl0IGlzIHByZXNlbnQsIG90aGVyd2lzZSB0aGUgZGlyZWN0b3J5IGlub2RlIHdvdWxkIHJlbWFpbiBwaW5uZWQgZm9yCisgKiBldmVyLgorICovCit2b2lkIG50ZnNfcHV0X2lub2RlKHN0cnVjdCBpbm9kZSAqdmkpCit7CisJaWYgKFNfSVNESVIodmktPmlfbW9kZSkgJiYgYXRvbWljX3JlYWQoJnZpLT5pX2NvdW50KSA9PSAyKSB7CisJCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKHZpKTsKKwkJaWYgKE5Jbm9JbmRleEFsbG9jUHJlc2VudChuaSkpIHsKKwkJCXN0cnVjdCBpbm9kZSAqYnZpID0gTlVMTDsKKwkJCWRvd24oJnZpLT5pX3NlbSk7CisJCQlpZiAoYXRvbWljX3JlYWQoJnZpLT5pX2NvdW50KSA9PSAyKSB7CisJCQkJYnZpID0gbmktPml0eXBlLmluZGV4LmJtcF9pbm87CisJCQkJaWYgKGJ2aSkKKwkJCQkJbmktPml0eXBlLmluZGV4LmJtcF9pbm8gPSBOVUxMOworCQkJfQorCQkJdXAoJnZpLT5pX3NlbSk7CisJCQlpZiAoYnZpKQorCQkJCWlwdXQoYnZpKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgX19udGZzX2NsZWFyX2lub2RlKG50ZnNfaW5vZGUgKm5pKQoreworCS8qIEZyZWUgYWxsIGFsb2NhdGVkIG1lbW9yeS4gKi8KKwlkb3duX3dyaXRlKCZuaS0+cnVubGlzdC5sb2NrKTsKKwlpZiAobmktPnJ1bmxpc3QucmwpIHsKKwkJbnRmc19mcmVlKG5pLT5ydW5saXN0LnJsKTsKKwkJbmktPnJ1bmxpc3QucmwgPSBOVUxMOworCX0KKwl1cF93cml0ZSgmbmktPnJ1bmxpc3QubG9jayk7CisKKwlpZiAobmktPmF0dHJfbGlzdCkgeworCQludGZzX2ZyZWUobmktPmF0dHJfbGlzdCk7CisJCW5pLT5hdHRyX2xpc3QgPSBOVUxMOworCX0KKworCWRvd25fd3JpdGUoJm5pLT5hdHRyX2xpc3RfcmwubG9jayk7CisJaWYgKG5pLT5hdHRyX2xpc3RfcmwucmwpIHsKKwkJbnRmc19mcmVlKG5pLT5hdHRyX2xpc3RfcmwucmwpOworCQluaS0+YXR0cl9saXN0X3JsLnJsID0gTlVMTDsKKwl9CisJdXBfd3JpdGUoJm5pLT5hdHRyX2xpc3RfcmwubG9jayk7CisKKwlpZiAobmktPm5hbWVfbGVuICYmIG5pLT5uYW1lICE9IEkzMCkgeworCQkvKiBDYXRjaCBidWdzLi4uICovCisJCUJVR19PTighbmktPm5hbWUpOworCQlrZnJlZShuaS0+bmFtZSk7CisJfQorfQorCit2b2lkIG50ZnNfY2xlYXJfZXh0ZW50X2lub2RlKG50ZnNfaW5vZGUgKm5pKQoreworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpbm9kZSAweCVseC4iLCBuaS0+bWZ0X25vKTsKKworCUJVR19PTihOSW5vQXR0cihuaSkpOworCUJVR19PTihuaS0+bnJfZXh0ZW50cyAhPSAtMSk7CisKKyNpZmRlZiBOVEZTX1JXCisJaWYgKE5Jbm9EaXJ0eShuaSkpIHsKKwkJaWYgKCFpc19iYWRfaW5vZGUoVkZTX0kobmktPmV4dC5iYXNlX250ZnNfaW5vKSkpCisJCQludGZzX2Vycm9yKG5pLT52b2wtPnNiLCAiQ2xlYXJpbmcgZGlydHkgZXh0ZW50IGlub2RlISAgIgorCQkJCQkiTG9zaW5nIGRhdGEhICBUaGlzIGlzIGEgQlVHISEhIik7CisJCS8vIEZJWE1FOiAgRG8gc29tZXRoaW5nISEhCisJfQorI2VuZGlmIC8qIE5URlNfUlcgKi8KKworCV9fbnRmc19jbGVhcl9pbm9kZShuaSk7CisKKwkvKiBCeWUsIGJ5ZS4uLiAqLworCW50ZnNfZGVzdHJveV9leHRlbnRfaW5vZGUobmkpOworfQorCisvKioKKyAqIG50ZnNfY2xlYXJfYmlnX2lub2RlIC0gY2xlYW4gdXAgdGhlIG50ZnMgc3BlY2lmaWMgcGFydCBvZiBhbiBpbm9kZQorICogQHZpOgkJdmZzIGlub2RlIHBlbmRpbmcgYW5uaWhpbGF0aW9uCisgKgorICogV2hlbiB0aGUgVkZTIGlzIGdvaW5nIHRvIHJlbW92ZSBhbiBpbm9kZSBmcm9tIG1lbW9yeSwgbnRmc19jbGVhcl9iaWdfaW5vZGUoKQorICogaXMgY2FsbGVkLCB3aGljaCBkZWFsbG9jYXRlcyBhbGwgbWVtb3J5IGJlbG9uZ2luZyB0byB0aGUgTlRGUyBzcGVjaWZpYyBwYXJ0CisgKiBvZiB0aGUgaW5vZGUgYW5kIHJldHVybnMuCisgKgorICogSWYgdGhlIE1GVCByZWNvcmQgaXMgZGlydHksIHdlIGNvbW1pdCBpdCBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4KKyAqLwordm9pZCBudGZzX2NsZWFyX2JpZ19pbm9kZShzdHJ1Y3QgaW5vZGUgKnZpKQoreworCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKHZpKTsKKworCS8qCisJICogSWYgdGhlIGlub2RlIEB2aSBpcyBhbiBpbmRleCBpbm9kZSB3ZSBuZWVkIHRvIHB1dCB0aGUgYXR0cmlidXRlCisJICogaW5vZGUgZm9yIHRoZSBpbmRleCBiaXRtYXAsIGlmIGl0IGlzIHByZXNlbnQsIG90aGVyd2lzZSB0aGUgaW5kZXgKKwkgKiBpbm9kZSB3b3VsZCBkaXNhcHBlYXIgYW5kIHRoZSBhdHRyaWJ1dGUgaW5vZGUgZm9yIHRoZSBpbmRleCBiaXRtYXAKKwkgKiB3b3VsZCBubyBsb25nZXIgYmUgcmVmZXJlbmNlZCBmcm9tIGFueXdoZXJlIGFuZCB0aHVzIGl0IHdvdWxkIHJlbWFpbgorCSAqIHBpbm5lZCBmb3IgZXZlci4KKwkgKi8KKwlpZiAoTklub0F0dHIobmkpICYmIChuaS0+dHlwZSA9PSBBVF9JTkRFWF9BTExPQ0FUSU9OKSAmJgorCQkJTklub0luZGV4QWxsb2NQcmVzZW50KG5pKSAmJiBuaS0+aXR5cGUuaW5kZXguYm1wX2lubykgeworCQlpcHV0KG5pLT5pdHlwZS5pbmRleC5ibXBfaW5vKTsKKwkJbmktPml0eXBlLmluZGV4LmJtcF9pbm8gPSBOVUxMOworCX0KKyNpZmRlZiBOVEZTX1JXCisJaWYgKE5Jbm9EaXJ0eShuaSkpIHsKKwkJQk9PTCB3YXNfYmFkID0gKGlzX2JhZF9pbm9kZSh2aSkpOworCisJCS8qIENvbW1pdHRpbmcgdGhlIGlub2RlIGFsc28gY29tbWl0cyBhbGwgZXh0ZW50IGlub2Rlcy4gKi8KKwkJbnRmc19jb21taXRfaW5vZGUodmkpOworCisJCWlmICghd2FzX2JhZCAmJiAoaXNfYmFkX2lub2RlKHZpKSB8fCBOSW5vRGlydHkobmkpKSkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCB0byBjb21taXQgZGlydHkgaW5vZGUgIgorCQkJCQkiMHglbHguICBMb3NpbmcgZGF0YSEiLCB2aS0+aV9pbm8pOworCQkJLy8gRklYTUU6ICBEbyBzb21ldGhpbmchISEKKwkJfQorCX0KKyNlbmRpZiAvKiBOVEZTX1JXICovCisKKwkvKiBObyBuZWVkIHRvIGxvY2sgYXQgdGhpcyBzdGFnZSBhcyBubyBvbmUgZWxzZSBoYXMgYSByZWZlcmVuY2UuICovCisJaWYgKG5pLT5ucl9leHRlbnRzID4gMCkgeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbmktPm5yX2V4dGVudHM7IGkrKykKKwkJCW50ZnNfY2xlYXJfZXh0ZW50X2lub2RlKG5pLT5leHQuZXh0ZW50X250ZnNfaW5vc1tpXSk7CisJCWtmcmVlKG5pLT5leHQuZXh0ZW50X250ZnNfaW5vcyk7CisJfQorCisJX19udGZzX2NsZWFyX2lub2RlKG5pKTsKKworCWlmIChOSW5vQXR0cihuaSkpIHsKKwkJLyogUmVsZWFzZSB0aGUgYmFzZSBpbm9kZSBpZiB3ZSBhcmUgaG9sZGluZyBpdC4gKi8KKwkJaWYgKG5pLT5ucl9leHRlbnRzID09IC0xKSB7CisJCQlpcHV0KFZGU19JKG5pLT5leHQuYmFzZV9udGZzX2lubykpOworCQkJbmktPm5yX2V4dGVudHMgPSAwOworCQkJbmktPmV4dC5iYXNlX250ZnNfaW5vID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm47Cit9CisKKy8qKgorICogbnRmc19zaG93X29wdGlvbnMgLSBzaG93IG1vdW50IG9wdGlvbnMgaW4gL3Byb2MvbW91bnRzCisgKiBAc2Y6CQlzZXFfZmlsZSBpbiB3aGljaCB0byB3cml0ZSBvdXIgbW91bnQgb3B0aW9ucworICogQG1udDoJdmZzIG1vdW50IHdob3NlIG1vdW50IG9wdGlvbnMgdG8gZGlzcGxheQorICoKKyAqIENhbGxlZCBieSB0aGUgVkZTIG9uY2UgZm9yIGVhY2ggbW91bnRlZCBudGZzIHZvbHVtZSB3aGVuIHNvbWVvbmUgcmVhZHMKKyAqIC9wcm9jL21vdW50cyBpbiBvcmRlciB0byBkaXNwbGF5IHRoZSBOVEZTIHNwZWNpZmljIG1vdW50IG9wdGlvbnMgb2YgZWFjaAorICogbW91bnQuIFRoZSBtb3VudCBvcHRpb25zIG9mIHRoZSB2ZnMgbW91bnQgQG1udCBhcmUgd3JpdHRlbiB0byB0aGUgc2VxIGZpbGUKKyAqIEBzZiBhbmQgc3VjY2VzcyBpcyByZXR1cm5lZC4KKyAqLworaW50IG50ZnNfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqc2YsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKG1udC0+bW50X3NiKTsKKwlpbnQgaTsKKworCXNlcV9wcmludGYoc2YsICIsdWlkPSVpIiwgdm9sLT51aWQpOworCXNlcV9wcmludGYoc2YsICIsZ2lkPSVpIiwgdm9sLT5naWQpOworCWlmICh2b2wtPmZtYXNrID09IHZvbC0+ZG1hc2spCisJCXNlcV9wcmludGYoc2YsICIsdW1hc2s9MCVvIiwgdm9sLT5mbWFzayk7CisJZWxzZSB7CisJCXNlcV9wcmludGYoc2YsICIsZm1hc2s9MCVvIiwgdm9sLT5mbWFzayk7CisJCXNlcV9wcmludGYoc2YsICIsZG1hc2s9MCVvIiwgdm9sLT5kbWFzayk7CisJfQorCXNlcV9wcmludGYoc2YsICIsbmxzPSVzIiwgdm9sLT5ubHNfbWFwLT5jaGFyc2V0KTsKKwlpZiAoTlZvbENhc2VTZW5zaXRpdmUodm9sKSkKKwkJc2VxX3ByaW50ZihzZiwgIixjYXNlX3NlbnNpdGl2ZSIpOworCWlmIChOVm9sU2hvd1N5c3RlbUZpbGVzKHZvbCkpCisJCXNlcV9wcmludGYoc2YsICIsc2hvd19zeXNfZmlsZXMiKTsKKwlmb3IgKGkgPSAwOyBvbl9lcnJvcnNfYXJyW2ldLnZhbDsgaSsrKSB7CisJCWlmIChvbl9lcnJvcnNfYXJyW2ldLnZhbCAmIHZvbC0+b25fZXJyb3JzKQorCQkJc2VxX3ByaW50ZihzZiwgIixlcnJvcnM9JXMiLCBvbl9lcnJvcnNfYXJyW2ldLnN0cik7CisJfQorCXNlcV9wcmludGYoc2YsICIsbWZ0X3pvbmVfbXVsdGlwbGllcj0laSIsIHZvbC0+bWZ0X3pvbmVfbXVsdGlwbGllcik7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBOVEZTX1JXCisKKy8qKgorICogbnRmc190cnVuY2F0ZSAtIGNhbGxlZCB3aGVuIHRoZSBpX3NpemUgb2YgYW4gbnRmcyBpbm9kZSBpcyBjaGFuZ2VkCisgKiBAdmk6CQlpbm9kZSBmb3Igd2hpY2ggdGhlIGlfc2l6ZSB3YXMgY2hhbmdlZAorICoKKyAqIFdlIGRvIG5vdCBzdXBwb3J0IGlfc2l6ZSBjaGFuZ2VzIHlldC4KKyAqCisgKiBUaGUga2VybmVsIGd1YXJhbnRlZXMgdGhhdCBAdmkgaXMgYSByZWd1bGFyIGZpbGUgKFNfSVNSRUcoKSBpcyB0cnVlKSBhbmQKKyAqIHRoYXQgdGhlIGNoYW5nZSBpcyBhbGxvd2VkLgorICoKKyAqIFRoaXMgaW1wbGllcyBmb3IgdXMgdGhhdCBAdmkgaXMgYSBmaWxlIGlub2RlIHJhdGhlciB0aGFuIGEgZGlyZWN0b3J5LCBpbmRleCwKKyAqIG9yIGF0dHJpYnV0ZSBpbm9kZSBhcyB3ZWxsIGFzIHRoYXQgQHZpIGlzIGEgYmFzZSBpbm9kZS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciAtZXJybm8gb24gZXJyb3IuCisgKgorICogQ2FsbGVkIHdpdGggLT5pX3NlbSBoZWxkLiAgSW4gYWxsIGJ1dCBvbmUgY2FzZSAtPmlfYWxsb2Nfc2VtIGlzIGhlbGQgZm9yCisgKiB3cml0aW5nLiAgVGhlIG9ubHkgY2FzZSB3aGVyZSAtPmlfYWxsb2Nfc2VtIGlzIG5vdCBoZWxkIGlzCisgKiBtbS9maWxlbWFwLmM6OmdlbmVyaWNfZmlsZV9idWZmZXJlZF93cml0ZSgpIHdoZXJlIHZtdHJ1bmNhdGUoKSBpcyBjYWxsZWQKKyAqIHdpdGggdGhlIGN1cnJlbnQgaV9zaXplIGFzIHRoZSBvZmZzZXQgd2hpY2ggbWVhbnMgdGhhdCBpdCBpcyBhIG5vb3AgYXMgZmFyCisgKiBhcyBudGZzX3RydW5jYXRlKCkgaXMgY29uY2VybmVkLgorICovCitpbnQgbnRmc190cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKnZpKQoreworCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKHZpKTsKKwludGZzX3ZvbHVtZSAqdm9sID0gbmktPnZvbDsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OworCU1GVF9SRUNPUkQgKm07CisJY29uc3QgY2hhciAqdGUgPSAiICBMZWF2aW5nIGZpbGUgbGVuZ3RoIG91dCBvZiBzeW5jIHdpdGggaV9zaXplLiI7CisJaW50IGVycjsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpbm9kZSAweCVseC4iLCB2aS0+aV9pbm8pOworCUJVR19PTihOSW5vQXR0cihuaSkpOworCUJVR19PTihuaS0+bnJfZXh0ZW50cyA8IDApOworCW0gPSBtYXBfbWZ0X3JlY29yZChuaSk7CisJaWYgKElTX0VSUihtKSkgeworCQllcnIgPSBQVFJfRVJSKG0pOworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmFpbGVkIHRvIG1hcCBtZnQgcmVjb3JkIGZvciBpbm9kZSAweCVseCAiCisJCQkJIihlcnJvciBjb2RlICVkKS4lcyIsIHZpLT5pX2lubywgZXJyLCB0ZSk7CisJCWN0eCA9IE5VTEw7CisJCW0gPSBOVUxMOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChuaSwgbSk7CisJaWYgKHVubGlrZWx5KCFjdHgpKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gYWxsb2NhdGUgYSBzZWFyY2ggY29udGV4dCBmb3IgIgorCQkJCSJpbm9kZSAweCVseCAobm90IGVub3VnaCBtZW1vcnkpLiVzIiwKKwkJCQl2aS0+aV9pbm8sIHRlKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKwllcnIgPSBudGZzX2F0dHJfbG9va3VwKG5pLT50eXBlLCBuaS0+bmFtZSwgbmktPm5hbWVfbGVuLAorCQkJQ0FTRV9TRU5TSVRJVkUsIDAsIE5VTEwsIDAsIGN0eCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJaWYgKGVyciA9PSAtRU5PRU5UKQorCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIk9wZW4gYXR0cmlidXRlIGlzIG1pc3NpbmcgZnJvbSAiCisJCQkJCSJtZnQgcmVjb3JkLiAgSW5vZGUgMHglbHggaXMgY29ycnVwdC4gICIKKwkJCQkJIlJ1biBjaGtkc2suIiwgdmktPmlfaW5vKTsKKwkJZWxzZQorCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCB0byBsb29rdXAgYXR0cmlidXRlIGluICIKKwkJCQkJImlub2RlIDB4JWx4IChlcnJvciBjb2RlICVkKS4iLAorCQkJCQl2aS0+aV9pbm8sIGVycik7CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogSWYgdGhlIHNpemUgaGFzIG5vdCBjaGFuZ2VkIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uICovCisJaWYgKG50ZnNfYXR0cl9zaXplKGN0eC0+YXR0cikgPT0gaV9zaXplX3JlYWQodmkpKQorCQlnb3RvIGRvbmU7CisJLy8gVE9ETzogSW1wbGVtZW50IHRoZSB0cnVuY2F0ZS4uLgorCW50ZnNfZXJyb3IodmktPmlfc2IsICJJbm9kZSBzaXplIGhhcyBjaGFuZ2VkIGJ1dCB0aGlzIGlzIG5vdCAiCisJCQkiaW1wbGVtZW50ZWQgeWV0LiAgUmVzZXR0aW5nIGlub2RlIHNpemUgdG8gb2xkIHZhbHVlLiAiCisJCQkiIFRoaXMgaXMgbW9zdCBsaWtlbHkgYSBidWcgaW4gdGhlIG50ZnMgZHJpdmVyISIpOworCWlfc2l6ZV93cml0ZSh2aSwgbnRmc19hdHRyX3NpemUoY3R4LT5hdHRyKSk7IAorZG9uZToKKwludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwl1bm1hcF9tZnRfcmVjb3JkKG5pKTsKKwlOSW5vQ2xlYXJUcnVuY2F0ZUZhaWxlZChuaSk7CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKK2Vycl9vdXQ6CisJaWYgKGVyciAhPSAtRU5PTUVNKSB7CisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJbWFrZV9iYWRfaW5vZGUodmkpOworCX0KKwlpZiAoY3R4KQorCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwlpZiAobSkKKwkJdW5tYXBfbWZ0X3JlY29yZChuaSk7CisJTklub1NldFRydW5jYXRlRmFpbGVkKG5pKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIG50ZnNfdHJ1bmNhdGVfdmZzIC0gd3JhcHBlciBmb3IgbnRmc190cnVuY2F0ZSgpIHRoYXQgaGFzIG5vIHJldHVybiB2YWx1ZQorICogQHZpOgkJaW5vZGUgZm9yIHdoaWNoIHRoZSBpX3NpemUgd2FzIGNoYW5nZWQKKyAqCisgKiBXcmFwcGVyIGZvciBudGZzX3RydW5jYXRlKCkgdGhhdCBoYXMgbm8gcmV0dXJuIHZhbHVlLgorICoKKyAqIFNlZSBudGZzX3RydW5jYXRlKCkgZGVzY3JpcHRpb24gYWJvdmUgZm9yIGRldGFpbHMuCisgKi8KK3ZvaWQgbnRmc190cnVuY2F0ZV92ZnMoc3RydWN0IGlub2RlICp2aSkgeworCW50ZnNfdHJ1bmNhdGUodmkpOworfQorCisvKioKKyAqIG50ZnNfc2V0YXR0ciAtIGNhbGxlZCBmcm9tIG5vdGlmeV9jaGFuZ2UoKSB3aGVuIGFuIGF0dHJpYnV0ZSBpcyBiZWluZyBjaGFuZ2VkCisgKiBAZGVudHJ5OglkZW50cnkgd2hvc2UgYXR0cmlidXRlcyB0byBjaGFuZ2UKKyAqIEBhdHRyOglzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgYXR0cmlidXRlcyBhbmQgdGhlIGNoYW5nZXMKKyAqCisgKiBXZSBoYXZlIHRvIHRyYXAgVkZTIGF0dGVtcHRzIHRvIHRydW5jYXRlIHRoZSBmaWxlIGRlc2NyaWJlZCBieSBAZGVudHJ5IGFzCisgKiBzb29uIGFzIHBvc3NpYmxlLCBiZWNhdXNlIHdlIGRvIG5vdCBpbXBsZW1lbnQgY2hhbmdlcyBpbiBpX3NpemUgeWV0LiAgU28gd2UKKyAqIGFib3J0IGFsbCBpX3NpemUgY2hhbmdlcyBoZXJlLgorICoKKyAqIFdlIGFsc28gYWJvcnQgYWxsIGNoYW5nZXMgb2YgdXNlciwgZ3JvdXAsIGFuZCBtb2RlIGFzIHdlIGRvIG5vdCBpbXBsZW1lbnQKKyAqIHRoZSBOVEZTIEFDTHMgeWV0LgorICoKKyAqIENhbGxlZCB3aXRoIC0+aV9zZW0gaGVsZC4gIEZvciB0aGUgQVRUUl9TSVpFIChpLmUuIC0+dHJ1bmNhdGUpIGNhc2UsIGFsc28KKyAqIGNhbGxlZCB3aXRoIC0+aV9hbGxvY19zZW0gaGVsZCBmb3Igd3JpdGluZy4KKyAqCisgKiBCYXNpY2FsbHkgdGhpcyBpcyBhIGNvcHkgb2YgZ2VuZXJpYyBub3RpZnlfY2hhbmdlKCkgYW5kIGlub2RlX3NldGF0dHIoKQorICogZnVuY3Rpb25hbGl0eSwgZXhjZXB0IHdlIGludGVyY2VwdCBhbmQgYWJvcnQgY2hhbmdlcyBpbiBpX3NpemUuCisgKi8KK2ludCBudGZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCit7CisJc3RydWN0IGlub2RlICp2aSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHItPmlhX3ZhbGlkOworCisJZXJyID0gaW5vZGVfY2hhbmdlX29rKHZpLCBhdHRyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogV2UgZG8gbm90IHN1cHBvcnQgTlRGUyBBQ0xzIHlldC4gKi8KKwlpZiAoaWFfdmFsaWQgJiAoQVRUUl9VSUQgfCBBVFRSX0dJRCB8IEFUVFJfTU9ERSkpIHsKKwkJbnRmc193YXJuaW5nKHZpLT5pX3NiLCAiQ2hhbmdlcyBpbiB1c2VyL2dyb3VwL21vZGUgYXJlIG5vdCAiCisJCQkJInN1cHBvcnRlZCB5ZXQsIGlnbm9yaW5nLiIpOworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CisJCWlmIChhdHRyLT5pYV9zaXplICE9IGlfc2l6ZV9yZWFkKHZpKSkgeworCQkJbnRmc193YXJuaW5nKHZpLT5pX3NiLCAiQ2hhbmdlcyBpbiBpbm9kZSBzaXplIGFyZSBub3QgIgorCQkJCQkic3VwcG9ydGVkIHlldCwgaWdub3JpbmcuIik7CisJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJCS8vIFRPRE86IEltcGxlbWVudC4uLgorCQkJLy8gZXJyID0gdm10cnVuY2F0ZSh2aSwgYXR0ci0+aWFfc2l6ZSk7CisJCQlpZiAoZXJyIHx8IGlhX3ZhbGlkID09IEFUVFJfU0laRSkKKwkJCQlnb3RvIG91dDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBXZSBza2lwcGVkIHRoZSB0cnVuY2F0ZSBidXQgbXVzdCBzdGlsbCB1cGRhdGUKKwkJCSAqIHRpbWVzdGFtcHMuCisJCQkgKi8KKwkJCWlhX3ZhbGlkIHw9IEFUVFJfTVRJTUV8QVRUUl9DVElNRTsKKwkJfQorCX0KKworCWlmIChpYV92YWxpZCAmIEFUVFJfQVRJTUUpCisJCXZpLT5pX2F0aW1lID0gYXR0ci0+aWFfYXRpbWU7CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9NVElNRSkKKwkJdmktPmlfbXRpbWUgPSBhdHRyLT5pYV9tdGltZTsKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX0NUSU1FKQorCQl2aS0+aV9jdGltZSA9IGF0dHItPmlhX2N0aW1lOworCW1hcmtfaW5vZGVfZGlydHkodmkpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogbnRmc193cml0ZV9pbm9kZSAtIHdyaXRlIG91dCBhIGRpcnR5IGlub2RlCisgKiBAdmk6CQlpbm9kZSB0byB3cml0ZSBvdXQKKyAqIEBzeW5jOglpZiB0cnVlLCB3cml0ZSBvdXQgc3luY2hyb25vdXNseQorICoKKyAqIFdyaXRlIG91dCBhIGRpcnR5IGlub2RlIHRvIGRpc2sgaW5jbHVkaW5nIGFueSBleHRlbnQgaW5vZGVzIGlmIHByZXNlbnQuCisgKgorICogSWYgQHN5bmMgaXMgdHJ1ZSwgY29tbWl0IHRoZSBpbm9kZSB0byBkaXNrIGFuZCB3YWl0IGZvciBpbyBjb21wbGV0aW9uLiAgVGhpcworICogaXMgZG9uZSB1c2luZyB3cml0ZV9tZnRfcmVjb3JkKCkuCisgKgorICogSWYgQHN5bmMgaXMgZmFsc2UsIGp1c3Qgc2NoZWR1bGUgdGhlIHdyaXRlIHRvIGhhcHBlbiBidXQgZG8gbm90IHdhaXQgZm9yIGkvbworICogY29tcGxldGlvbi4gIEluIDIuNiBrZXJuZWxzLCBzY2hlZHVsaW5nIHVzdWFsbHkgaGFwcGVucyBqdXN0IGJ5IHZpcnR1ZSBvZgorICogbWFya2luZyB0aGUgcGFnZSAoYW5kIGluIHRoaXMgY2FzZSBtZnQgcmVjb3JkKSBkaXJ0eSBidXQgd2UgZG8gbm90IGltcGxlbWVudAorICogdGhpcyB5ZXQgYXMgd3JpdGVfbWZ0X3JlY29yZCgpIGxhcmdlbHkgaWdub3JlcyB0aGUgQHN5bmMgcGFyYW1ldGVyIGFuZAorICogYWx3YXlzIHBlcmZvcm1zIHN5bmNocm9ub3VzIHdyaXRlcy4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKi8KK2ludCBudGZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqdmksIGludCBzeW5jKQoreworCXNsZTY0IG50OworCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKHZpKTsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OworCU1GVF9SRUNPUkQgKm07CisJU1RBTkRBUkRfSU5GT1JNQVRJT04gKnNpOworCWludCBlcnIgPSAwOworCUJPT0wgbW9kaWZpZWQgPSBGQUxTRTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciAlc2lub2RlIDB4JWx4LiIsIE5Jbm9BdHRyKG5pKSA/ICJhdHRyICIgOiAiIiwKKwkJCXZpLT5pX2lubyk7CisJLyoKKwkgKiBEaXJ0eSBhdHRyaWJ1dGUgaW5vZGVzIGFyZSB3cml0dGVuIHZpYSB0aGVpciByZWFsIGlub2RlcyBzbyBqdXN0CisJICogY2xlYW4gdGhlbSBoZXJlLiAgQWNjZXNzIHRpbWUgdXBkYXRlcyBhcmUgdGFrZW4gY2FyZSBvZmYgd2hlbiB0aGUKKwkgKiByZWFsIGlub2RlIGlzIHdyaXR0ZW4uCisJICovCisJaWYgKE5Jbm9BdHRyKG5pKSkgeworCQlOSW5vQ2xlYXJEaXJ0eShuaSk7CisJCW50ZnNfZGVidWcoIkRvbmUuIik7CisJCXJldHVybiAwOworCX0KKwkvKiBNYXAsIHBpbiwgYW5kIGxvY2sgdGhlIG1mdCByZWNvcmQgYmVsb25naW5nIHRvIHRoZSBpbm9kZS4gKi8KKwltID0gbWFwX21mdF9yZWNvcmQobmkpOworCWlmIChJU19FUlIobSkpIHsKKwkJZXJyID0gUFRSX0VSUihtKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBVcGRhdGUgdGhlIGFjY2VzcyB0aW1lcyBpbiB0aGUgc3RhbmRhcmQgaW5mb3JtYXRpb24gYXR0cmlidXRlLiAqLworCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChuaSwgbSk7CisJaWYgKHVubGlrZWx5KCFjdHgpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWVyciA9IG50ZnNfYXR0cl9sb29rdXAoQVRfU1RBTkRBUkRfSU5GT1JNQVRJT04sIE5VTEwsIDAsCisJCQlDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwgMCwgY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJc2kgPSAoU1RBTkRBUkRfSU5GT1JNQVRJT04qKSgodTgqKWN0eC0+YXR0ciArCisJCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSk7CisJLyogVXBkYXRlIHRoZSBhY2Nlc3MgdGltZXMgaWYgdGhleSBoYXZlIGNoYW5nZWQuICovCisJbnQgPSB1dGMybnRmcyh2aS0+aV9tdGltZSk7CisJaWYgKHNpLT5sYXN0X2RhdGFfY2hhbmdlX3RpbWUgIT0gbnQpIHsKKwkJbnRmc19kZWJ1ZygiVXBkYXRpbmcgbXRpbWUgZm9yIGlub2RlIDB4JWx4OiBvbGQgPSAweCVsbHgsICIKKwkJCQkibmV3ID0gMHglbGx4IiwgdmktPmlfaW5vLAorCQkJCXNsZTY0X3RvX2NwdShzaS0+bGFzdF9kYXRhX2NoYW5nZV90aW1lKSwKKwkJCQlzbGU2NF90b19jcHUobnQpKTsKKwkJc2ktPmxhc3RfZGF0YV9jaGFuZ2VfdGltZSA9IG50OworCQltb2RpZmllZCA9IFRSVUU7CisJfQorCW50ID0gdXRjMm50ZnModmktPmlfY3RpbWUpOworCWlmIChzaS0+bGFzdF9tZnRfY2hhbmdlX3RpbWUgIT0gbnQpIHsKKwkJbnRmc19kZWJ1ZygiVXBkYXRpbmcgY3RpbWUgZm9yIGlub2RlIDB4JWx4OiBvbGQgPSAweCVsbHgsICIKKwkJCQkibmV3ID0gMHglbGx4IiwgdmktPmlfaW5vLAorCQkJCXNsZTY0X3RvX2NwdShzaS0+bGFzdF9tZnRfY2hhbmdlX3RpbWUpLAorCQkJCXNsZTY0X3RvX2NwdShudCkpOworCQlzaS0+bGFzdF9tZnRfY2hhbmdlX3RpbWUgPSBudDsKKwkJbW9kaWZpZWQgPSBUUlVFOworCX0KKwludCA9IHV0YzJudGZzKHZpLT5pX2F0aW1lKTsKKwlpZiAoc2ktPmxhc3RfYWNjZXNzX3RpbWUgIT0gbnQpIHsKKwkJbnRmc19kZWJ1ZygiVXBkYXRpbmcgYXRpbWUgZm9yIGlub2RlIDB4JWx4OiBvbGQgPSAweCVsbHgsICIKKwkJCQkibmV3ID0gMHglbGx4IiwgdmktPmlfaW5vLAorCQkJCXNsZTY0X3RvX2NwdShzaS0+bGFzdF9hY2Nlc3NfdGltZSksCisJCQkJc2xlNjRfdG9fY3B1KG50KSk7CisJCXNpLT5sYXN0X2FjY2Vzc190aW1lID0gbnQ7CisJCW1vZGlmaWVkID0gVFJVRTsKKwl9CisJLyoKKwkgKiBJZiB3ZSBqdXN0IG1vZGlmaWVkIHRoZSBzdGFuZGFyZCBpbmZvcm1hdGlvbiBhdHRyaWJ1dGUgd2UgbmVlZCB0bworCSAqIG1hcmsgdGhlIG1mdCByZWNvcmQgaXQgaXMgaW4gZGlydHkuICBXZSBkbyB0aGlzIG1hbnVhbGx5IHNvIHRoYXQKKwkgKiBtYXJrX2lub2RlX2RpcnR5KCkgaXMgbm90IGNhbGxlZCB3aGljaCB3b3VsZCByZWRpcnR5IHRoZSBpbm9kZSBhbmQKKwkgKiBoZW5jZSByZXN1bHQgaW4gYW4gaW5maW5pdGUgbG9vcCBvZiB0cnlpbmcgdG8gd3JpdGUgdGhlIGlub2RlLgorCSAqIFRoZXJlIGlzIG5vIG5lZWQgdG8gbWFyayB0aGUgYmFzZSBpbm9kZSBub3IgdGhlIGJhc2UgbWZ0IHJlY29yZAorCSAqIGRpcnR5LCBzaW5jZSB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgdGhpcyBtZnQgcmVjb3JkIGJlbG93IGluIGFueSBjYXNlCisJICogYW5kIHRoZSBiYXNlIG1mdCByZWNvcmQgbWF5IGFjdHVhbGx5IG5vdCBoYXZlIGJlZW4gbW9kaWZpZWQgc28gaXQKKwkgKiBtaWdodCBub3QgbmVlZCB0byBiZSB3cml0dGVuIG91dC4KKwkgKiBOT1RFOiBJdCBpcyBub3QgYSBwcm9ibGVtIHdoZW4gdGhlIGlub2RlIGZvciAkTUZUIGl0c2VsZiBpcyBiZWluZworCSAqIHdyaXR0ZW4gb3V0IGFzIG1hcmtfbnRmc19yZWNvcmRfZGlydHkoKSB3aWxsIG9ubHkgc2V0IElfRElSVFlfUEFHRVMKKwkgKiBvbiB0aGUgJE1GVCBpbm9kZSBhbmQgaGVuY2UgbnRmc193cml0ZV9pbm9kZSgpIHdpbGwgbm90IGJlCisJICogcmUtaW52b2tlZCBiZWNhdXNlIG9mIGl0IHdoaWNoIGluIHR1cm4gaXMgb2sgc2luY2UgdGhlIGRpcnRpZWQgbWZ0CisJICogcmVjb3JkIHdpbGwgYmUgY2xlYW5lZCBhbmQgd3JpdHRlbiBvdXQgdG8gZGlzayBiZWxvdywgaS5lLiBiZWZvcmUKKwkgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCisJICovCisJaWYgKG1vZGlmaWVkICYmICFOSW5vVGVzdFNldERpcnR5KGN0eC0+bnRmc19pbm8pKQorCQltYXJrX250ZnNfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8tPnBhZ2UsCisJCQkJY3R4LT5udGZzX2luby0+cGFnZV9vZnMpOworCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCS8qIE5vdyB0aGUgYWNjZXNzIHRpbWVzIGFyZSB1cGRhdGVkLCB3cml0ZSB0aGUgYmFzZSBtZnQgcmVjb3JkLiAqLworCWlmIChOSW5vRGlydHkobmkpKQorCQllcnIgPSB3cml0ZV9tZnRfcmVjb3JkKG5pLCBtLCBzeW5jKTsKKwkvKiBXcml0ZSBhbGwgYXR0YWNoZWQgZXh0ZW50IG1mdCByZWNvcmRzLiAqLworCWRvd24oJm5pLT5leHRlbnRfbG9jayk7CisJaWYgKG5pLT5ucl9leHRlbnRzID4gMCkgeworCQludGZzX2lub2RlICoqZXh0ZW50X25pcyA9IG5pLT5leHQuZXh0ZW50X250ZnNfaW5vczsKKwkJaW50IGk7CisKKwkJbnRmc19kZWJ1ZygiV3JpdGluZyAlaSBleHRlbnQgaW5vZGVzLiIsIG5pLT5ucl9leHRlbnRzKTsKKwkJZm9yIChpID0gMDsgaSA8IG5pLT5ucl9leHRlbnRzOyBpKyspIHsKKwkJCW50ZnNfaW5vZGUgKnRuaSA9IGV4dGVudF9uaXNbaV07CisKKwkJCWlmIChOSW5vRGlydHkodG5pKSkgeworCQkJCU1GVF9SRUNPUkQgKnRtID0gbWFwX21mdF9yZWNvcmQodG5pKTsKKwkJCQlpbnQgcmV0OworCisJCQkJaWYgKElTX0VSUih0bSkpIHsKKwkJCQkJaWYgKCFlcnIgfHwgZXJyID09IC1FTk9NRU0pCisJCQkJCQllcnIgPSBQVFJfRVJSKHRtKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXJldCA9IHdyaXRlX21mdF9yZWNvcmQodG5pLCB0bSwgc3luYyk7CisJCQkJdW5tYXBfbWZ0X3JlY29yZCh0bmkpOworCQkJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQkJCWlmICghZXJyIHx8IGVyciA9PSAtRU5PTUVNKQorCQkJCQkJZXJyID0gcmV0OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwl1cCgmbmktPmV4dGVudF9sb2NrKTsKKwl1bm1hcF9tZnRfcmVjb3JkKG5pKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBlcnJfb3V0OworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIDA7Cit1bm1fZXJyX291dDoKKwl1bm1hcF9tZnRfcmVjb3JkKG5pKTsKK2Vycl9vdXQ6CisJaWYgKGVyciA9PSAtRU5PTUVNKSB7CisJCW50ZnNfd2FybmluZyh2aS0+aV9zYiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHdyaXRlIGlub2RlLiAgIgorCQkJCSJNYXJraW5nIHRoZSBpbm9kZSBkaXJ0eSBhZ2Fpbiwgc28gdGhlIFZGUyAiCisJCQkJInJldHJpZXMgbGF0ZXIuIik7CisJCW1hcmtfaW5vZGVfZGlydHkodmkpOworCX0gZWxzZSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgKGVycm9yIGNvZGUgJWkpOiAgTWFya2luZyBpbm9kZSAiCisJCQkJImFzIGJhZC4gIFlvdSBzaG91bGQgcnVuIGNoa2Rzay4iLCAtZXJyKTsKKwkJbWFrZV9iYWRfaW5vZGUodmkpOworCQlOVm9sU2V0RXJyb3JzKG5pLT52b2wpOworCX0KKwlyZXR1cm4gZXJyOworfQorCisjZW5kaWYgLyogTlRGU19SVyAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9pbm9kZS5oIGIvZnMvbnRmcy9pbm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NTgwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2lub2RlLmgKQEAgLTAsMCArMSwzMjEgQEAKKy8qCisgKiBpbm9kZS5oIC0gRGVmaW5lcyBmb3IgaW5vZGUgc3RydWN0dXJlcyBOVEZTIExpbnV4IGtlcm5lbCBkcml2ZXIuIFBhcnQgb2YKKyAqCSAgICAgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMiBSaWNoYXJkIFJ1c3NvbgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfSU5PREVfSAorI2RlZmluZSBfTElOVVhfTlRGU19JTk9ERV9ICisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgImxheW91dC5oIgorI2luY2x1ZGUgInZvbHVtZS5oIgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAicnVubGlzdC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKK3R5cGVkZWYgc3RydWN0IF9udGZzX2lub2RlIG50ZnNfaW5vZGU7CisKKy8qCisgKiBUaGUgTlRGUyBpbi1tZW1vcnkgaW5vZGUgc3RydWN0dXJlLiBJdCBpcyBqdXN0IHVzZWQgYXMgYW4gZXh0ZW5zaW9uIHRvIHRoZQorICogZmllbGRzIGFscmVhZHkgcHJvdmlkZWQgaW4gdGhlIFZGUyBpbm9kZS4KKyAqLworc3RydWN0IF9udGZzX2lub2RlIHsKKwlzNjQgaW5pdGlhbGl6ZWRfc2l6ZTsJLyogQ29weSBmcm9tIHRoZSBhdHRyaWJ1dGUgcmVjb3JkLiAqLworCXM2NCBhbGxvY2F0ZWRfc2l6ZTsJLyogQ29weSBmcm9tIHRoZSBhdHRyaWJ1dGUgcmVjb3JkLiAqLworCXVuc2lnbmVkIGxvbmcgc3RhdGU7CS8qIE5URlMgc3BlY2lmaWMgZmxhZ3MgZGVzY3JpYmluZyB0aGlzIGlub2RlLgorCQkJCSAgIFNlZSBudGZzX2lub2RlX3N0YXRlX2JpdHMgYmVsb3cuICovCisJdW5zaWduZWQgbG9uZyBtZnRfbm87CS8qIE51bWJlciBvZiB0aGUgbWZ0IHJlY29yZCAvIGlub2RlLiAqLworCXUxNiBzZXFfbm87CQkvKiBTZXF1ZW5jZSBudW1iZXIgb2YgdGhlIG1mdCByZWNvcmQuICovCisJYXRvbWljX3QgY291bnQ7CQkvKiBJbm9kZSByZWZlcmVuY2UgY291bnQgZm9yIGJvb2sga2VlcGluZy4gKi8KKwludGZzX3ZvbHVtZSAqdm9sOwkvKiBQb2ludGVyIHRvIHRoZSBudGZzIHZvbHVtZSBvZiB0aGlzIGlub2RlLiAqLworCS8qCisJICogSWYgTklub0F0dHIoKSBpcyB0cnVlLCB0aGUgYmVsb3cgZmllbGRzIGRlc2NyaWJlIHRoZSBhdHRyaWJ1dGUgd2hpY2gKKwkgKiB0aGlzIGZha2UgaW5vZGUgYmVsb25ncyB0by4gVGhlIGFjdHVhbCBpbm9kZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcworCSAqIHBvaW50ZWQgdG8gYnkgYmFzZV9udGZzX2lubyBhbmQgbnJfZXh0ZW50cyBpcyBhbHdheXMgc2V0IHRvIC0xIChzZWUKKwkgKiBiZWxvdykuIEZvciByZWFsIGlub2Rlcywgd2UgYWxzbyBzZXQgdGhlIHR5cGUgKEFUX0RBVEEgZm9yIGZpbGVzIGFuZAorCSAqIEFUX0lOREVYX0FMTE9DQVRJT04gZm9yIGRpcmVjdG9yaWVzKSwgd2l0aCB0aGUgbmFtZSA9IE5VTEwgYW5kCisJICogbmFtZV9sZW4gPSAwIGZvciBmaWxlcyBhbmQgbmFtZSA9IEkzMCAoZ2xvYmFsIGNvbnN0YW50KSBhbmQKKwkgKiBuYW1lX2xlbiA9IDQgZm9yIGRpcmVjdG9yaWVzLgorCSAqLworCUFUVFJfVFlQRSB0eXBlOwkvKiBBdHRyaWJ1dGUgdHlwZSBvZiB0aGlzIGZha2UgaW5vZGUuICovCisJbnRmc2NoYXIgKm5hbWU7CQkvKiBBdHRyaWJ1dGUgbmFtZSBvZiB0aGlzIGZha2UgaW5vZGUuICovCisJdTMyIG5hbWVfbGVuOwkJLyogQXR0cmlidXRlIG5hbWUgbGVuZ3RoIG9mIHRoaXMgZmFrZSBpbm9kZS4gKi8KKwlydW5saXN0IHJ1bmxpc3Q7CS8qIElmIHN0YXRlIGhhcyB0aGUgTklfTm9uUmVzaWRlbnQgYml0IHNldCwKKwkJCQkgICB0aGUgcnVubGlzdCBvZiB0aGUgdW5uYW1lZCBkYXRhIGF0dHJpYnV0ZQorCQkJCSAgIChpZiBhIGZpbGUpIG9yIG9mIHRoZSBpbmRleCBhbGxvY2F0aW9uCisJCQkJICAgYXR0cmlidXRlIChkaXJlY3RvcnkpIG9yIG9mIHRoZSBhdHRyaWJ1dGUKKwkJCQkgICBkZXNjcmliZWQgYnkgdGhlIGZha2UgaW5vZGUgKGlmIE5Jbm9BdHRyKCkpLgorCQkJCSAgIElmIHJ1bmxpc3QucmwgaXMgTlVMTCwgdGhlIHJ1bmxpc3QgaGFzIG5vdAorCQkJCSAgIGJlZW4gcmVhZCBpbiB5ZXQgb3IgaGFzIGJlZW4gdW5tYXBwZWQuIElmCisJCQkJICAgTklfTm9uUmVzaWRlbnQgaXMgY2xlYXIsIHRoZSBhdHRyaWJ1dGUgaXMKKwkJCQkgICByZXNpZGVudCAoZmlsZSBhbmQgZmFrZSBpbm9kZSkgb3IgdGhlcmUgaXMKKwkJCQkgICBubyAkSTMwIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlCisJCQkJICAgKHNtYWxsIGRpcmVjdG9yeSkuIEluIHRoZSBsYXR0ZXIgY2FzZQorCQkJCSAgIHJ1bmxpc3QucmwgaXMgYWx3YXlzIE5VTEwuKi8KKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBvbmx5IHZhbGlkIGZvciByZWFsIGlub2RlcyBhbmQgZXh0ZW50CisJICogaW5vZGVzLgorCSAqLworCXN0cnVjdCBzZW1hcGhvcmUgbXJlY19sb2NrOyAvKiBMb2NrIGZvciBzZXJpYWxpemluZyBhY2Nlc3MgdG8gdGhlCisJCQkJICAgbWZ0IHJlY29yZCBiZWxvbmdpbmcgdG8gdGhpcyBpbm9kZS4gKi8KKwlzdHJ1Y3QgcGFnZSAqcGFnZTsJLyogVGhlIHBhZ2UgY29udGFpbmluZyB0aGUgbWZ0IHJlY29yZCBvZiB0aGUKKwkJCQkgICBpbm9kZS4gVGhpcyBzaG91bGQgb25seSBiZSB0b3VjaGVkIGJ5IHRoZQorCQkJCSAgICh1biltYXBfbWZ0X3JlY29yZCooKSBmdW5jdGlvbnMuICovCisJaW50IHBhZ2Vfb2ZzOwkJLyogT2Zmc2V0IGludG8gdGhlIHBhZ2UgYXQgd2hpY2ggdGhlIG1mdCByZWNvcmQKKwkJCQkgICBiZWdpbnMuIFRoaXMgc2hvdWxkIG9ubHkgYmUgdG91Y2hlZCBieSB0aGUKKwkJCQkgICAodW4pbWFwX21mdF9yZWNvcmQqKCkgZnVuY3Rpb25zLiAqLworCS8qCisJICogQXR0cmlidXRlIGxpc3Qgc3VwcG9ydCAob25seSBmb3IgdXNlIGJ5IHRoZSBhdHRyaWJ1dGUgbG9va3VwCisJICogZnVuY3Rpb25zKS4gU2V0dXAgZHVyaW5nIHJlYWRfaW5vZGUgZm9yIGFsbCBpbm9kZXMgd2l0aCBhdHRyaWJ1dGUKKwkgKiBsaXN0cy4gT25seSB2YWxpZCBpZiBOSV9BdHRyTGlzdCBpcyBzZXQgaW4gc3RhdGUsIGFuZCBhdHRyX2xpc3RfcmwgaXMKKwkgKiBmdXJ0aGVyIG9ubHkgdmFsaWQgaWYgTklfQXR0ckxpc3ROb25SZXNpZGVudCBpcyBzZXQuCisJICovCisJdTMyIGF0dHJfbGlzdF9zaXplOwkvKiBMZW5ndGggb2YgYXR0cmlidXRlIGxpc3QgdmFsdWUgaW4gYnl0ZXMuICovCisJdTggKmF0dHJfbGlzdDsJCS8qIEF0dHJpYnV0ZSBsaXN0IHZhbHVlIGl0c2VsZi4gKi8KKwlydW5saXN0IGF0dHJfbGlzdF9ybDsJLyogUnVuIGxpc3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCB2YWx1ZS4gKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7IC8qIEl0IGlzIGEgZGlyZWN0b3J5LCAkTUZULCBvciBhbiBpbmRleCBpbm9kZS4gKi8KKwkJCXN0cnVjdCBpbm9kZSAqYm1wX2lubzsJLyogQXR0cmlidXRlIGlub2RlIGZvciB0aGUKKwkJCQkJCSAgIGluZGV4ICRCSVRNQVAuICovCisJCQl1MzIgYmxvY2tfc2l6ZTsJCS8qIFNpemUgb2YgYW4gaW5kZXggYmxvY2suICovCisJCQl1MzIgdmNuX3NpemU7CQkvKiBTaXplIG9mIGEgdmNuIGluIHRoaXMKKwkJCQkJCSAgIGluZGV4LiAqLworCQkJQ09MTEFUSU9OX1JVTEUgY29sbGF0aW9uX3J1bGU7IC8qIFRoZSBjb2xsYXRpb24gcnVsZQorCQkJCQkJICAgZm9yIHRoZSBpbmRleC4gKi8KKwkJCXU4IGJsb2NrX3NpemVfYml0czsgCS8qIExvZzIgb2YgdGhlIGFib3ZlLiAqLworCQkJdTggdmNuX3NpemVfYml0czsJLyogTG9nMiBvZiB0aGUgYWJvdmUuICovCisJCX0gaW5kZXg7CisJCXN0cnVjdCB7IC8qIEl0IGlzIGEgY29tcHJlc3NlZCBmaWxlIG9yIGFuIGF0dHJpYnV0ZSBpbm9kZS4gKi8KKwkJCXM2NCBzaXplOwkJLyogQ29weSBvZiBjb21wcmVzc2VkX3NpemUgZnJvbQorCQkJCQkJICAgJERBVEEuICovCisJCQl1MzIgYmxvY2tfc2l6ZTsJCS8qIFNpemUgb2YgYSBjb21wcmVzc2lvbiBibG9jaworCQkJCQkJICAgKGNiKS4gKi8KKwkJCXU4IGJsb2NrX3NpemVfYml0czsJLyogTG9nMiBvZiB0aGUgc2l6ZSBvZiBhIGNiLiAqLworCQkJdTggYmxvY2tfY2x1c3RlcnM7CS8qIE51bWJlciBvZiBjbHVzdGVycyBwZXIgY2IuICovCisJCX0gY29tcHJlc3NlZDsKKwl9IGl0eXBlOworCXN0cnVjdCBzZW1hcGhvcmUgZXh0ZW50X2xvY2s7CS8qIExvY2sgZm9yIGFjY2Vzc2luZy9tb2RpZnlpbmcgdGhlCisJCQkJCSAgIGJlbG93IC4gKi8KKwlzMzIgbnJfZXh0ZW50czsJLyogRm9yIGEgYmFzZSBtZnQgcmVjb3JkLCB0aGUgbnVtYmVyIG9mIGF0dGFjaGVkIGV4dGVudAorCQkJICAgaW5vZGVzICgwIGlmIG5vbmUpLCBmb3IgZXh0ZW50IHJlY29yZHMgYW5kIGZvciBmYWtlCisJCQkgICBpbm9kZXMgZGVzY3JpYmluZyBhbiBhdHRyaWJ1dGUgdGhpcyBpcyAtMS4gKi8KKwl1bmlvbiB7CQkvKiBUaGlzIHVuaW9uIGlzIG9ubHkgdXNlZCBpZiBucl9leHRlbnRzICE9IDAuICovCisJCW50ZnNfaW5vZGUgKipleHRlbnRfbnRmc19pbm9zOwkvKiBGb3IgbnJfZXh0ZW50cyA+IDAsIGFycmF5IG9mCisJCQkJCQkgICB0aGUgbnRmcyBpbm9kZXMgb2YgdGhlIGV4dGVudAorCQkJCQkJICAgbWZ0IHJlY29yZHMgYmVsb25naW5nIHRvCisJCQkJCQkgICB0aGlzIGJhc2UgaW5vZGUgd2hpY2ggaGF2ZQorCQkJCQkJICAgYmVlbiBsb2FkZWQuICovCisJCW50ZnNfaW5vZGUgKmJhc2VfbnRmc19pbm87CS8qIEZvciBucl9leHRlbnRzID09IC0xLCB0aGUKKwkJCQkJCSAgIG50ZnMgaW5vZGUgb2YgdGhlIGJhc2UgbWZ0CisJCQkJCQkgICByZWNvcmQuIEZvciBmYWtlIGlub2RlcywgdGhlCisJCQkJCQkgICByZWFsIChiYXNlKSBpbm9kZSB0byB3aGljaAorCQkJCQkJICAgdGhlIGF0dHJpYnV0ZSBiZWxvbmdzLiAqLworCX0gZXh0OworfTsKKworLyoKKyAqIERlZmluZWQgYml0cyBmb3IgdGhlIHN0YXRlIGZpZWxkIGluIHRoZSBudGZzX2lub2RlIHN0cnVjdHVyZS4KKyAqIChmKSA9IGZpbGVzIG9ubHksIChkKSA9IGRpcmVjdG9yaWVzIG9ubHksIChhKSA9IGF0dHJpYnV0ZXMvZmFrZSBpbm9kZXMgb25seQorICovCit0eXBlZGVmIGVudW0geworCU5JX0RpcnR5LAkJLyogMTogTWZ0IHJlY29yZCBuZWVkcyB0byBiZSB3cml0dGVuIHRvIGRpc2suICovCisJTklfQXR0ckxpc3QsCQkvKiAxOiBNZnQgcmVjb3JkIGNvbnRhaW5zIGFuIGF0dHJpYnV0ZSBsaXN0LiAqLworCU5JX0F0dHJMaXN0Tm9uUmVzaWRlbnQsCS8qIDE6IEF0dHJpYnV0ZSBsaXN0IGlzIG5vbi1yZXNpZGVudC4gSW1wbGllcworCQkJCSAgICAgIE5JX0F0dHJMaXN0IGlzIHNldC4gKi8KKworCU5JX0F0dHIsCQkvKiAxOiBGYWtlIGlub2RlIGZvciBhdHRyaWJ1dGUgaS9vLgorCQkJCSAgIDA6IFJlYWwgaW5vZGUgb3IgZXh0ZW50IGlub2RlLiAqLworCisJTklfTXN0UHJvdGVjdGVkLAkvKiAxOiBBdHRyaWJ1dGUgaXMgcHJvdGVjdGVkIGJ5IE1TVCBmaXh1cHMuCisJCQkJICAgMDogQXR0cmlidXRlIGlzIG5vdCBwcm90ZWN0ZWQgYnkgZml4dXBzLiAqLworCU5JX05vblJlc2lkZW50LAkJLyogMTogVW5uYW1lZCBkYXRhIGF0dHIgaXMgbm9uLXJlc2lkZW50IChmKS4KKwkJCQkgICAxOiBBdHRyaWJ1dGUgaXMgbm9uLXJlc2lkZW50IChhKS4gKi8KKwlOSV9JbmRleEFsbG9jUHJlc2VudCA9IE5JX05vblJlc2lkZW50LAkvKiAxOiAkSTMwIGluZGV4IGFsbG9jIGF0dHIgaXMKKwkJCQkJCSAgIHByZXNlbnQgKGQpLiAqLworCU5JX0NvbXByZXNzZWQsCQkvKiAxOiBVbm5hbWVkIGRhdGEgYXR0ciBpcyBjb21wcmVzc2VkIChmKS4KKwkJCQkgICAxOiBDcmVhdGUgY29tcHJlc3NlZCBmaWxlcyBieSBkZWZhdWx0IChkKS4KKwkJCQkgICAxOiBBdHRyaWJ1dGUgaXMgY29tcHJlc3NlZCAoYSkuICovCisJTklfRW5jcnlwdGVkLAkJLyogMTogVW5uYW1lZCBkYXRhIGF0dHIgaXMgZW5jcnlwdGVkIChmKS4KKwkJCQkgICAxOiBDcmVhdGUgZW5jcnlwdGVkIGZpbGVzIGJ5IGRlZmF1bHQgKGQpLgorCQkJCSAgIDE6IEF0dHJpYnV0ZSBpcyBlbmNyeXB0ZWQgKGEpLiAqLworCU5JX1NwYXJzZSwJCS8qIDE6IFVubmFtZWQgZGF0YSBhdHRyIGlzIHNwYXJzZSAoZikuCisJCQkJICAgMTogQ3JlYXRlIHNwYXJzZSBmaWxlcyBieSBkZWZhdWx0IChkKS4KKwkJCQkgICAxOiBBdHRyaWJ1dGUgaXMgc3BhcnNlIChhKS4gKi8KKwlOSV9UcnVuY2F0ZUZhaWxlZCwJLyogMTogTGFzdCBudGZzX3RydW5jYXRlKCkgY2FsbCBmYWlsZWQuICovCit9IG50ZnNfaW5vZGVfc3RhdGVfYml0czsKKworLyoKKyAqIE5PVEU6IFdlIHNob3VsZCBiZSBhZGRpbmcgZGlydHkgbWZ0IHJlY29yZHMgdG8gYSBsaXN0IHNvbWV3aGVyZSBhbmQgdGhleQorICogc2hvdWxkIGJlIGluZGVwZW5kZW50IG9mIHRoZSAobnRmcy92ZnMpIGlub2RlIHN0cnVjdHVyZSBzbyB0aGF0IGFuIGlub2RlIGNhbgorICogYmUgcmVtb3ZlZCBidXQgdGhlIHJlY29yZCBjYW4gYmUgbGVmdCBkaXJ0eSBmb3Igc3luY2luZyBsYXRlci4KKyAqLworCisvKgorICogTWFjcm8gdHJpY2tzIHRvIGV4cGFuZCB0aGUgTklub0ZvbygpLCBOSW5vU2V0Rm9vKCksIGFuZCBOSW5vQ2xlYXJGb28oKQorICogZnVuY3Rpb25zLgorICovCisjZGVmaW5lIE5JTk9fRk5TKGZsYWcpCQkJCQlcCitzdGF0aWMgaW5saW5lIGludCBOSW5vIyNmbGFnKG50ZnNfaW5vZGUgKm5pKQkJXAorewkJCQkJCQlcCisJcmV0dXJuIHRlc3RfYml0KE5JXyMjZmxhZywgJihuaSktPnN0YXRlKTsJXAorfQkJCQkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgTklub1NldCMjZmxhZyhudGZzX2lub2RlICpuaSkJXAorewkJCQkJCQlcCisJc2V0X2JpdChOSV8jI2ZsYWcsICYobmkpLT5zdGF0ZSk7CQlcCit9CQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCBOSW5vQ2xlYXIjI2ZsYWcobnRmc19pbm9kZSAqbmkpCVwKK3sJCQkJCQkJXAorCWNsZWFyX2JpdChOSV8jI2ZsYWcsICYobmkpLT5zdGF0ZSk7CQlcCit9CisKKy8qCisgKiBBcyBhYm92ZSBmb3IgTklub1Rlc3RTZXRGb28oKSBhbmQgTklub1Rlc3RDbGVhckZvbygpLgorICovCisjZGVmaW5lIFRBU19OSU5PX0ZOUyhmbGFnKQkJCQkJXAorc3RhdGljIGlubGluZSBpbnQgTklub1Rlc3RTZXQjI2ZsYWcobnRmc19pbm9kZSAqbmkpCQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHRlc3RfYW5kX3NldF9iaXQoTklfIyNmbGFnLCAmKG5pKS0+c3RhdGUpOwlcCit9CQkJCQkJCQlcCitzdGF0aWMgaW5saW5lIGludCBOSW5vVGVzdENsZWFyIyNmbGFnKG50ZnNfaW5vZGUgKm5pKQkJXAorewkJCQkJCQkJXAorCXJldHVybiB0ZXN0X2FuZF9jbGVhcl9iaXQoTklfIyNmbGFnLCAmKG5pKS0+c3RhdGUpOwlcCit9CisKKy8qIEVtaXQgdGhlIG50ZnMgaW5vZGUgYml0b3BzIGZ1bmN0aW9ucy4gKi8KK05JTk9fRk5TKERpcnR5KQorVEFTX05JTk9fRk5TKERpcnR5KQorTklOT19GTlMoQXR0ckxpc3QpCitOSU5PX0ZOUyhBdHRyTGlzdE5vblJlc2lkZW50KQorTklOT19GTlMoQXR0cikKK05JTk9fRk5TKE1zdFByb3RlY3RlZCkKK05JTk9fRk5TKE5vblJlc2lkZW50KQorTklOT19GTlMoSW5kZXhBbGxvY1ByZXNlbnQpCitOSU5PX0ZOUyhDb21wcmVzc2VkKQorTklOT19GTlMoRW5jcnlwdGVkKQorTklOT19GTlMoU3BhcnNlKQorTklOT19GTlMoVHJ1bmNhdGVGYWlsZWQpCisKKy8qCisgKiBUaGUgZnVsbCBzdHJ1Y3R1cmUgY29udGFpbmluZyBhIG50ZnNfaW5vZGUgYW5kIGEgdmZzIHN0cnVjdCBpbm9kZS4gVXNlZCBmb3IKKyAqIGFsbCByZWFsIGFuZCBmYWtlIGlub2RlcyBidXQgbm90IGZvciBleHRlbnQgaW5vZGVzIHdoaWNoIGxhY2sgdGhlIHZmcyBzdHJ1Y3QKKyAqIGlub2RlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJbnRmc19pbm9kZSBudGZzX2lub2RlOworCXN0cnVjdCBpbm9kZSB2ZnNfaW5vZGU7CQkvKiBUaGUgdmZzIGlub2RlIHN0cnVjdHVyZS4gKi8KK30gYmlnX250ZnNfaW5vZGU7CisKKy8qKgorICogTlRGU19JIC0gcmV0dXJuIHRoZSBudGZzIGlub2RlIGdpdmVuIGEgdmZzIGlub2RlCisgKiBAaW5vZGU6CVZGUyBpbm9kZQorICoKKyAqIE5URlNfSSgpIHJldHVybnMgdGhlIG50ZnMgaW5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBWRlMgQGlub2RlLgorICovCitzdGF0aWMgaW5saW5lIG50ZnNfaW5vZGUgKk5URlNfSShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiAobnRmc19pbm9kZSAqKWxpc3RfZW50cnkoaW5vZGUsIGJpZ19udGZzX2lub2RlLCB2ZnNfaW5vZGUpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbm9kZSAqVkZTX0kobnRmc19pbm9kZSAqbmkpCit7CisJcmV0dXJuICYoKGJpZ19udGZzX2lub2RlICopbmkpLT52ZnNfaW5vZGU7Cit9CisKKy8qKgorICogbnRmc19hdHRyIC0gbnRmcyBpbiBtZW1vcnkgYXR0cmlidXRlIHN0cnVjdHVyZQorICogQG1mdF9ubzoJbWZ0IHJlY29yZCBudW1iZXIgb2YgdGhlIGJhc2UgbWZ0IHJlY29yZCBvZiB0aGlzIGF0dHJpYnV0ZQorICogQG5hbWU6CVVuaWNvZGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIChOVUxMIGlmIHVubmFtZWQpCisgKiBAbmFtZV9sZW46CWxlbmd0aCBvZiBAbmFtZSBpbiBVbmljb2RlIGNoYXJhY3RlcnMgKDAgaWYgdW5uYW1lZCkKKyAqIEB0eXBlOglhdHRyaWJ1dGUgdHlwZSAoc2VlIGxheW91dC5oKQorICoKKyAqIFRoaXMgc3RydWN0dXJlIGV4aXN0cyBvbmx5IHRvIHByb3ZpZGUgYSBzbWFsbCBzdHJ1Y3R1cmUgZm9yIHRoZQorICogbnRmc197YXR0cl99aWdldCgpL250ZnNfdGVzdF9pbm9kZSgpL250ZnNfaW5pdF9sb2NrZWRfaW5vZGUoKSBtZWNoYW5pc20uCisgKgorICogTk9URTogRWxlbWVudHMgYXJlIG9yZGVyZWQgYnkgc2l6ZSB0byBtYWtlIHRoZSBzdHJ1Y3R1cmUgYXMgY29tcGFjdCBhcworICogcG9zc2libGUgb24gYWxsIGFyY2hpdGVjdHVyZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIG1mdF9ubzsKKwludGZzY2hhciAqbmFtZTsKKwl1MzIgbmFtZV9sZW47CisJQVRUUl9UWVBFIHR5cGU7Cit9IG50ZnNfYXR0cjsKKwordHlwZWRlZiBpbnQgKCp0ZXN0X3QpKHN0cnVjdCBpbm9kZSAqLCB2b2lkICopOworCitleHRlcm4gaW50IG50ZnNfdGVzdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKnZpLCBudGZzX2F0dHIgKm5hKTsKKworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqbnRmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgbWZ0X25vKTsKK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKm50ZnNfYXR0cl9pZ2V0KHN0cnVjdCBpbm9kZSAqYmFzZV92aSwgQVRUUl9UWVBFIHR5cGUsCisJCW50ZnNjaGFyICpuYW1lLCB1MzIgbmFtZV9sZW4pOworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqbnRmc19pbmRleF9pZ2V0KHN0cnVjdCBpbm9kZSAqYmFzZV92aSwgbnRmc2NoYXIgKm5hbWUsCisJCXUzMiBuYW1lX2xlbik7CisKK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKm50ZnNfYWxsb2NfYmlnX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworZXh0ZXJuIHZvaWQgbnRmc19kZXN0cm95X2JpZ19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2V4dGVybiB2b2lkIG50ZnNfY2xlYXJfYmlnX2lub2RlKHN0cnVjdCBpbm9kZSAqdmkpOworCitleHRlcm4gdm9pZCBfX250ZnNfaW5pdF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBudGZzX2lub2RlICpuaSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBudGZzX2luaXRfYmlnX2lub2RlKHN0cnVjdCBpbm9kZSAqdmkpCit7CisJbnRmc19pbm9kZSAqbmkgPSBOVEZTX0kodmkpOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJX19udGZzX2luaXRfaW5vZGUodmktPmlfc2IsIG5pKTsKKwluaS0+bWZ0X25vID0gdmktPmlfaW5vOworfQorCitleHRlcm4gbnRmc19pbm9kZSAqbnRmc19uZXdfZXh0ZW50X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCXVuc2lnbmVkIGxvbmcgbWZ0X25vKTsKK2V4dGVybiB2b2lkIG50ZnNfY2xlYXJfZXh0ZW50X2lub2RlKG50ZnNfaW5vZGUgKm5pKTsKKworZXh0ZXJuIGludCBudGZzX3JlYWRfaW5vZGVfbW91bnQoc3RydWN0IGlub2RlICp2aSk7CisKK2V4dGVybiB2b2lkIG50ZnNfcHV0X2lub2RlKHN0cnVjdCBpbm9kZSAqdmkpOworCitleHRlcm4gaW50IG50ZnNfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqc2YsIHN0cnVjdCB2ZnNtb3VudCAqbW50KTsKKworI2lmZGVmIE5URlNfUlcKKworZXh0ZXJuIGludCBudGZzX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqdmkpOworZXh0ZXJuIHZvaWQgbnRmc190cnVuY2F0ZV92ZnMoc3RydWN0IGlub2RlICp2aSk7CisKK2V4dGVybiBpbnQgbnRmc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKTsKKworZXh0ZXJuIGludCBudGZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqdmksIGludCBzeW5jKTsKKworc3RhdGljIGlubGluZSB2b2lkIG50ZnNfY29tbWl0X2lub2RlKHN0cnVjdCBpbm9kZSAqdmkpCit7CisJaWYgKCFpc19iYWRfaW5vZGUodmkpKQorCQludGZzX3dyaXRlX2lub2RlKHZpLCAxKTsKKwlyZXR1cm47Cit9CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19JTk9ERV9IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2xheW91dC5oIGIvZnMvbnRmcy9sYXlvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2IzMzg5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9sYXlvdXQuaApAQCAtMCwwICsxLDI0MTMgQEAKKy8qCisgKiBsYXlvdXQuaCAtIEFsbCBOVEZTIGFzc29jaWF0ZWQgb24tZGlzayBzdHJ1Y3R1cmVzLiBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTCisgKgkgICAgICBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19MQVlPVVRfSAorI2RlZmluZSBfTElOVVhfTlRGU19MQVlPVVRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSAidHlwZXMuaCIKKworLyoKKyAqIENvbnN0YW50IGVuZGlhbm5lc3MgY29udmVyc2lvbiBkZWZpbmVzLgorICovCisjZGVmaW5lIGNvbnN0X2xlMTZfdG9fY3B1KHgpCV9fY29uc3RhbnRfbGUxNl90b19jcHUoeCkKKyNkZWZpbmUgY29uc3RfbGUzMl90b19jcHUoeCkJX19jb25zdGFudF9sZTMyX3RvX2NwdSh4KQorI2RlZmluZSBjb25zdF9sZTY0X3RvX2NwdSh4KQlfX2NvbnN0YW50X2xlNjRfdG9fY3B1KHgpCisKKyNkZWZpbmUgY29uc3RfY3B1X3RvX2xlMTYoeCkJX19jb25zdGFudF9jcHVfdG9fbGUxNih4KQorI2RlZmluZSBjb25zdF9jcHVfdG9fbGUzMih4KQlfX2NvbnN0YW50X2NwdV90b19sZTMyKHgpCisjZGVmaW5lIGNvbnN0X2NwdV90b19sZTY0KHgpCV9fY29uc3RhbnRfY3B1X3RvX2xlNjQoeCkKKworLyogVGhlIE5URlMgb2VtX2lkICJOVEZTICAgICIgKi8KKyNkZWZpbmUgbWFnaWNOVEZTCWNvbnN0X2NwdV90b19sZTY0KDB4MjAyMDIwMjA1MzQ2NTQ0ZVVMTCkKKworLyoKKyAqIExvY2F0aW9uIG9mIGJvb3RzZWN0b3Igb24gcGFydGl0aW9uOgorICoJVGhlIHN0YW5kYXJkIE5URlNfQk9PVF9TRUNUT1IgaXMgb24gc2VjdG9yIDAgb2YgdGhlIHBhcnRpdGlvbi4KKyAqCU9uIE5UNCBhbmQgYWJvdmUgdGhlcmUgaXMgb25lIGJhY2t1cCBjb3B5IG9mIHRoZSBib290IHNlY3RvciB0bworICoJYmUgZm91bmQgb24gdGhlIGxhc3Qgc2VjdG9yIG9mIHRoZSBwYXJ0aXRpb24gKG5vdCBub3JtYWxseSBhY2Nlc3NpYmxlCisgKglmcm9tIHdpdGhpbiBXaW5kb3dzIGFzIHRoZSBib290c2VjdG9yIGNvbnRhaW5lZCBudW1iZXIgb2Ygc2VjdG9ycworICoJdmFsdWUgaXMgb25lIGxlc3MgdGhhbiB0aGUgYWN0dWFsIHZhbHVlISkuCisgKglPbiB2ZXJzaW9ucyBvZiBOVCAzLjUxIGFuZCBlYXJsaWVyLCB0aGUgYmFja3VwIGNvcHkgd2FzIGxvY2F0ZWQgYXQKKyAqCW51bWJlciBvZiBzZWN0b3JzLzIgKGludGVnZXIgZGl2aWRlKSwgaS5lLiBpbiB0aGUgbWlkZGxlIG9mIHRoZSB2b2x1bWUuCisgKi8KKworLyoKKyAqIEJJT1MgcGFyYW1ldGVyIGJsb2NrIChicGIpIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWxlMTYgYnl0ZXNfcGVyX3NlY3RvcjsJCS8qIFNpemUgb2YgYSBzZWN0b3IgaW4gYnl0ZXMuICovCisJdTggIHNlY3RvcnNfcGVyX2NsdXN0ZXI7CS8qIFNpemUgb2YgYSBjbHVzdGVyIGluIHNlY3RvcnMuICovCisJbGUxNiByZXNlcnZlZF9zZWN0b3JzOwkJLyogemVybyAqLworCXU4ICBmYXRzOwkJCS8qIHplcm8gKi8KKwlsZTE2IHJvb3RfZW50cmllczsJCS8qIHplcm8gKi8KKwlsZTE2IHNlY3RvcnM7CQkJLyogemVybyAqLworCXU4ICBtZWRpYV90eXBlOwkJCS8qIDB4ZjggPSBoYXJkIGRpc2sgKi8KKwlsZTE2IHNlY3RvcnNfcGVyX2ZhdDsJCS8qIHplcm8gKi8KKwlsZTE2IHNlY3RvcnNfcGVyX3RyYWNrOwkJLyogaXJyZWxldmFudCAqLworCWxlMTYgaGVhZHM7CQkJLyogaXJyZWxldmFudCAqLworCWxlMzIgaGlkZGVuX3NlY3RvcnM7CQkvKiB6ZXJvICovCisJbGUzMiBsYXJnZV9zZWN0b3JzOwkJLyogemVybyAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIEJJT1NfUEFSQU1FVEVSX0JMT0NLOworCisvKgorICogTlRGUyBib290IHNlY3RvciBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1OCAganVtcFszXTsJCQkvKiBJcnJlbGV2YW50IChqdW1wIHRvIGJvb3QgdXAgY29kZSkuKi8KKwlsZTY0IG9lbV9pZDsJCQkvKiBNYWdpYyAiTlRGUyAgICAiLiAqLworCUJJT1NfUEFSQU1FVEVSX0JMT0NLIGJwYjsJLyogU2VlIEJJT1NfUEFSQU1FVEVSX0JMT0NLLiAqLworCXU4ICB1bnVzZWRbNF07CQkJLyogemVybywgTlRGUyBkaXNrZWRpdC5leGUgc3RhdGVzIHRoYXQKKwkJCQkJICAgdGhpcyBpcyBhY3R1YWxseToKKwkJCQkJCV9fdTggcGh5c2ljYWxfZHJpdmU7CS8vIDB4ODAKKwkJCQkJCV9fdTggY3VycmVudF9oZWFkOwkvLyB6ZXJvCisJCQkJCQlfX3U4IGV4dGVuZGVkX2Jvb3Rfc2lnbmF0dXJlOworCQkJCQkJCQkJLy8gMHg4MAorCQkJCQkJX191OCB1bnVzZWQ7CQkvLyB6ZXJvCisJCQkJCSAqLworLyoweDI4Ki9zbGU2NCBudW1iZXJfb2Zfc2VjdG9yczsJLyogTnVtYmVyIG9mIHNlY3RvcnMgaW4gdm9sdW1lLiBHaXZlcworCQkJCQkgICBtYXhpbXVtIHZvbHVtZSBzaXplIG9mIDJeNjMgc2VjdG9ycy4KKwkJCQkJICAgQXNzdW1pbmcgc3RhbmRhcmQgc2VjdG9yIHNpemUgb2YgNTEyCisJCQkJCSAgIGJ5dGVzLCB0aGUgbWF4aW11bSBieXRlIHNpemUgaXMKKwkJCQkJICAgYXBwcm94LiA0Ljd4MTBeMjEgYnl0ZXMuICgtOyAqLworCXNsZTY0IG1mdF9sY247CQkJLyogQ2x1c3RlciBsb2NhdGlvbiBvZiBtZnQgZGF0YS4gKi8KKwlzbGU2NCBtZnRtaXJyX2xjbjsJCS8qIENsdXN0ZXIgbG9jYXRpb24gb2YgY29weSBvZiBtZnQuICovCisJczggIGNsdXN0ZXJzX3Blcl9tZnRfcmVjb3JkOwkvKiBNZnQgcmVjb3JkIHNpemUgaW4gY2x1c3RlcnMuICovCisJdTggIHJlc2VydmVkMFszXTsJCS8qIHplcm8gKi8KKwlzOCAgY2x1c3RlcnNfcGVyX2luZGV4X3JlY29yZDsJLyogSW5kZXggYmxvY2sgc2l6ZSBpbiBjbHVzdGVycy4gKi8KKwl1OCAgcmVzZXJ2ZWQxWzNdOwkJLyogemVybyAqLworCWxlNjQgdm9sdW1lX3NlcmlhbF9udW1iZXI7CS8qIElycmVsZXZhbnQgKHNlcmlhbCBudW1iZXIpLiAqLworCWxlMzIgY2hlY2tzdW07CQkJLyogQm9vdCBzZWN0b3IgY2hlY2tzdW0uICovCisvKjB4NTQqL3U4ICBib290c3RyYXBbNDI2XTsJCS8qIElycmVsZXZhbnQgKGJvb3QgdXAgY29kZSkuICovCisJbGUxNiBlbmRfb2Zfc2VjdG9yX21hcmtlcjsJLyogRW5kIG9mIGJvb3RzZWN0b3IgbWFnaWMuIEFsd2F5cyBpcworCQkJCQkgICAweGFhNTUgaW4gbGl0dGxlIGVuZGlhbi4gKi8KKy8qIHNpemVvZigpID0gNTEyICgweDIwMCkgYnl0ZXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBOVEZTX0JPT1RfU0VDVE9SOworCisvKgorICogTWFnaWMgaWRlbnRpZmllcnMgcHJlc2VudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGFsbCBudGZzIHJlY29yZCBjb250YWluaW5nCisgKiByZWNvcmRzIChsaWtlIG1mdCByZWNvcmRzIGZvciBleGFtcGxlKS4KKyAqLworZW51bSB7CisJLyogRm91bmQgaW4gJE1GVC8kREFUQS4gKi8KKwltYWdpY19GSUxFID0gY29uc3RfY3B1X3RvX2xlMzIoMHg0NTRjNDk0NiksIC8qIE1mdCBlbnRyeS4gKi8KKwltYWdpY19JTkRYID0gY29uc3RfY3B1X3RvX2xlMzIoMHg1ODQ0NGU0OSksIC8qIEluZGV4IGJ1ZmZlci4gKi8KKwltYWdpY19IT0xFID0gY29uc3RfY3B1X3RvX2xlMzIoMHg0NTRjNGY0OCksIC8qID8gKE5URlMgMy4wKz8pICovCisKKwkvKiBGb3VuZCBpbiAkTG9nRmlsZS8kREFUQS4gKi8KKwltYWdpY19SU1RSID0gY29uc3RfY3B1X3RvX2xlMzIoMHg1MjU0NTM1MiksIC8qIFJlc3RhcnQgcGFnZS4gKi8KKwltYWdpY19SQ1JEID0gY29uc3RfY3B1X3RvX2xlMzIoMHg0NDUyNDM1MiksIC8qIExvZyByZWNvcmQgcGFnZS4gKi8KKworCS8qIEZvdW5kIGluICRMb2dGaWxlLyREQVRBLiAgKE1heSBiZSBmb3VuZCBpbiAkTUZULyREQVRBLCBhbHNvPykgKi8KKwltYWdpY19DSEtEID0gY29uc3RfY3B1X3RvX2xlMzIoMHg0MjRiNDg0MyksIC8qIE1vZGlmaWVkIGJ5IGNoa2Rzay4gKi8KKworCS8qIEZvdW5kIGluIGFsbCBudGZzIHJlY29yZCBjb250YWluaW5nIHJlY29yZHMuICovCisJbWFnaWNfQkFBRCA9IGNvbnN0X2NwdV90b19sZTMyKDB4NDQ0MTQxNDIpLCAvKiBGYWlsZWQgbXVsdGkgc2VjdG9yCisJCQkJCQkgICAgICAgdHJhbnNmZXIgd2FzIGRldGVjdGVkLiAqLworCS8qCisJICogRm91bmQgaW4gJExvZ0ZpbGUvJERBVEEgd2hlbiBhIHBhZ2UgaXMgZnVsbCBvZiAweGZmIGJ5dGVzIGFuZCBpcworCSAqIHRodXMgbm90IGluaXRpYWxpemVkLiAgUGFnZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB1c2luZyBpdC4KKwkgKi8KKwltYWdpY19lbXB0eSA9IGNvbnN0X2NwdV90b19sZTMyKDB4ZmZmZmZmZmYpIC8qIFJlY29yZCBpcyBlbXB0eS4gKi8KK307CisKK3R5cGVkZWYgbGUzMiBOVEZTX1JFQ09SRF9UWVBFOworCisvKgorICogR2VuZXJpYyBtYWdpYyBjb21wYXJpc29uIG1hY3Jvcy4gRmluYWxseSBmb3VuZCBhIHVzZSBmb3IgdGhlICMjIHByZXByb2Nlc3NvcgorICogb3BlcmF0b3IhICgtOAorICovCisKK3N0YXRpYyBpbmxpbmUgQk9PTCBfX250ZnNfaXNfbWFnaWMobGUzMiB4LCBOVEZTX1JFQ09SRF9UWVBFIHIpCit7CisJcmV0dXJuICh4ID09IHIpOworfQorI2RlZmluZSBudGZzX2lzX21hZ2ljKHgsIG0pCV9fbnRmc19pc19tYWdpYyh4LCBtYWdpY18jI20pCisKK3N0YXRpYyBpbmxpbmUgQk9PTCBfX250ZnNfaXNfbWFnaWNwKGxlMzIgKnAsIE5URlNfUkVDT1JEX1RZUEUgcikKK3sKKwlyZXR1cm4gKCpwID09IHIpOworfQorI2RlZmluZSBudGZzX2lzX21hZ2ljcChwLCBtKQlfX250ZnNfaXNfbWFnaWNwKHAsIG1hZ2ljXyMjbSkKKworLyoKKyAqIFNwZWNpYWxpc2VkIG1hZ2ljIGNvbXBhcmlzb24gbWFjcm9zIGZvciB0aGUgTlRGU19SRUNPUkRfVFlQRXMgZGVmaW5lZCBhYm92ZS4KKyAqLworI2RlZmluZSBudGZzX2lzX2ZpbGVfcmVjb3JkKHgpCQkoIG50ZnNfaXNfbWFnaWMgKHgsIEZJTEUpICkKKyNkZWZpbmUgbnRmc19pc19maWxlX3JlY29yZHAocCkJCSggbnRmc19pc19tYWdpY3AocCwgRklMRSkgKQorI2RlZmluZSBudGZzX2lzX21mdF9yZWNvcmQoeCkJCSggbnRmc19pc19maWxlX3JlY29yZCAoeCkgKQorI2RlZmluZSBudGZzX2lzX21mdF9yZWNvcmRwKHApCQkoIG50ZnNfaXNfZmlsZV9yZWNvcmRwKHApICkKKyNkZWZpbmUgbnRmc19pc19pbmR4X3JlY29yZCh4KQkJKCBudGZzX2lzX21hZ2ljICh4LCBJTkRYKSApCisjZGVmaW5lIG50ZnNfaXNfaW5keF9yZWNvcmRwKHApCQkoIG50ZnNfaXNfbWFnaWNwKHAsIElORFgpICkKKyNkZWZpbmUgbnRmc19pc19ob2xlX3JlY29yZCh4KQkJKCBudGZzX2lzX21hZ2ljICh4LCBIT0xFKSApCisjZGVmaW5lIG50ZnNfaXNfaG9sZV9yZWNvcmRwKHApCQkoIG50ZnNfaXNfbWFnaWNwKHAsIEhPTEUpICkKKworI2RlZmluZSBudGZzX2lzX3JzdHJfcmVjb3JkKHgpCQkoIG50ZnNfaXNfbWFnaWMgKHgsIFJTVFIpICkKKyNkZWZpbmUgbnRmc19pc19yc3RyX3JlY29yZHAocCkJCSggbnRmc19pc19tYWdpY3AocCwgUlNUUikgKQorI2RlZmluZSBudGZzX2lzX3JjcmRfcmVjb3JkKHgpCQkoIG50ZnNfaXNfbWFnaWMgKHgsIFJDUkQpICkKKyNkZWZpbmUgbnRmc19pc19yY3JkX3JlY29yZHAocCkJCSggbnRmc19pc19tYWdpY3AocCwgUkNSRCkgKQorCisjZGVmaW5lIG50ZnNfaXNfY2hrZF9yZWNvcmQoeCkJCSggbnRmc19pc19tYWdpYyAoeCwgQ0hLRCkgKQorI2RlZmluZSBudGZzX2lzX2Noa2RfcmVjb3JkcChwKQkJKCBudGZzX2lzX21hZ2ljcChwLCBDSEtEKSApCisKKyNkZWZpbmUgbnRmc19pc19iYWFkX3JlY29yZCh4KQkJKCBudGZzX2lzX21hZ2ljICh4LCBCQUFEKSApCisjZGVmaW5lIG50ZnNfaXNfYmFhZF9yZWNvcmRwKHApCQkoIG50ZnNfaXNfbWFnaWNwKHAsIEJBQUQpICkKKworI2RlZmluZSBudGZzX2lzX2VtcHR5X3JlY29yZCh4KQkJKCBudGZzX2lzX21hZ2ljICh4LCBlbXB0eSkgKQorI2RlZmluZSBudGZzX2lzX2VtcHR5X3JlY29yZHAocCkJKCBudGZzX2lzX21hZ2ljcChwLCBlbXB0eSkgKQorCisvKgorICogVGhlIFVwZGF0ZSBTZXF1ZW5jZSBBcnJheSAodXNhKSBpcyBhbiBhcnJheSBvZiB0aGUgbGUxNiB2YWx1ZXMgd2hpY2ggYmVsb25nCisgKiB0byB0aGUgZW5kIG9mIGVhY2ggc2VjdG9yIHByb3RlY3RlZCBieSB0aGUgdXBkYXRlIHNlcXVlbmNlIHJlY29yZCBpbiB3aGljaAorICogdGhpcyBhcnJheSBpcyBjb250YWluZWQuIE5vdGUgdGhhdCB0aGUgZmlyc3QgZW50cnkgaXMgdGhlIFVwZGF0ZSBTZXF1ZW5jZQorICogTnVtYmVyICh1c24pLCBhIGN5Y2xpYyBjb3VudGVyIG9mIGhvdyBtYW55IHRpbWVzIHRoZSBwcm90ZWN0ZWQgcmVjb3JkIGhhcworICogYmVlbiB3cml0dGVuIHRvIGRpc2suIFRoZSB2YWx1ZXMgMCBhbmQgLTEgKGllLiAweGZmZmYpIGFyZSBub3QgdXNlZC4gQWxsCisgKiBsYXN0IGxlMTYncyBvZiBlYWNoIHNlY3RvciBoYXZlIHRvIGJlIGVxdWFsIHRvIHRoZSB1c24gKGR1cmluZyByZWFkaW5nKSBvcgorICogYXJlIHNldCB0byBpdCAoZHVyaW5nIHdyaXRpbmcpLiBJZiB0aGV5IGFyZSBub3QsIGFuIGluY29tcGxldGUgbXVsdGkgc2VjdG9yCisgKiB0cmFuc2ZlciBoYXMgb2NjdXJyZWQgd2hlbiB0aGUgZGF0YSB3YXMgd3JpdHRlbi4KKyAqIFRoZSBtYXhpbXVtIHNpemUgZm9yIHRoZSB1cGRhdGUgc2VxdWVuY2UgYXJyYXkgaXMgZml4ZWQgdG86CisgKgltYXhpbXVtIHNpemUgPSB1c2Ffb2ZzICsgKHVzYV9jb3VudCAqIDIpID0gNTEwIGJ5dGVzCisgKiBUaGUgNTEwIGJ5dGVzIGNvbWVzIGZyb20gdGhlIGZhY3QgdGhhdCB0aGUgbGFzdCBsZTE2IGluIHRoZSBhcnJheSBoYXMgdG8KKyAqIChvYnZpb3VzbHkpIGZpbmlzaCBiZWZvcmUgdGhlIGxhc3QgbGUxNiBvZiB0aGUgZmlyc3QgNTEyLWJ5dGUgc2VjdG9yLgorICogVGhpcyBmb3JtdWxhIGNhbiBiZSB1c2VkIGFzIGEgY29uc2lzdGVuY3kgY2hlY2sgaW4gdGhhdCB1c2Ffb2ZzICsKKyAqICh1c2FfY291bnQgKiAyKSBoYXMgdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDUxMC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCU5URlNfUkVDT1JEX1RZUEUgbWFnaWM7CS8qIEEgZm91ci1ieXRlIG1hZ2ljIGlkZW50aWZ5aW5nIHRoZSByZWNvcmQKKwkJCQkgICB0eXBlIGFuZC9vciBzdGF0dXMuICovCisJbGUxNiB1c2Ffb2ZzOwkJLyogT2Zmc2V0IHRvIHRoZSBVcGRhdGUgU2VxdWVuY2UgQXJyYXkgKHVzYSkKKwkJCQkgICBmcm9tIHRoZSBzdGFydCBvZiB0aGUgbnRmcyByZWNvcmQuICovCisJbGUxNiB1c2FfY291bnQ7CQkvKiBOdW1iZXIgb2YgbGUxNiBzaXplZCBlbnRyaWVzIGluIHRoZSB1c2EKKwkJCQkgICBpbmNsdWRpbmcgdGhlIFVwZGF0ZSBTZXF1ZW5jZSBOdW1iZXIgKHVzbiksCisJCQkJICAgdGh1cyB0aGUgbnVtYmVyIG9mIGZpeHVwcyBpcyB0aGUgdXNhX2NvdW50CisJCQkJICAgbWludXMgMS4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBOVEZTX1JFQ09SRDsKKworLyoKKyAqIFN5c3RlbSBmaWxlcyBtZnQgcmVjb3JkIG51bWJlcnMuIEFsbCB0aGVzZSBmaWxlcyBhcmUgYWx3YXlzIG1hcmtlZCBhcyB1c2VkCisgKiBpbiB0aGUgYml0bWFwIGF0dHJpYnV0ZSBvZiB0aGUgbWZ0OyBwcmVzdW1hYmx5IGluIG9yZGVyIHRvIGF2b2lkIGFjY2lkZW50YWwKKyAqIGFsbG9jYXRpb24gZm9yIHJhbmRvbSBvdGhlciBtZnQgcmVjb3Jkcy4gQWxzbywgdGhlIHNlcXVlbmNlIG51bWJlciBmb3IgZWFjaAorICogb2YgdGhlIHN5c3RlbSBmaWxlcyBpcyBhbHdheXMgZXF1YWwgdG8gdGhlaXIgbWZ0IHJlY29yZCBudW1iZXIgYW5kIGl0IGlzCisgKiBuZXZlciBtb2RpZmllZC4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlGSUxFX01GVCAgICAgICA9IDAsCS8qIE1hc3RlciBmaWxlIHRhYmxlIChtZnQpLiBEYXRhIGF0dHJpYnV0ZQorCQkJCSAgIGNvbnRhaW5zIHRoZSBlbnRyaWVzIGFuZCBiaXRtYXAgYXR0cmlidXRlCisJCQkJICAgcmVjb3JkcyB3aGljaCBvbmVzIGFyZSBpbiB1c2UgKGJpdD09MSkuICovCisJRklMRV9NRlRNaXJyICAgPSAxLAkvKiBNZnQgbWlycm9yOiBjb3B5IG9mIGZpcnN0IGZvdXIgbWZ0IHJlY29yZHMKKwkJCQkgICBpbiBkYXRhIGF0dHJpYnV0ZS4gSWYgY2x1c3RlciBzaXplID4gNGtpQiwKKwkJCQkgICBjb3B5IG9mIGZpcnN0IE4gbWZ0IHJlY29yZHMsIHdpdGgKKwkJCQkJTiA9IGNsdXN0ZXJfc2l6ZSAvIG1mdF9yZWNvcmRfc2l6ZS4gKi8KKwlGSUxFX0xvZ0ZpbGUgICA9IDIsCS8qIEpvdXJuYWxsaW5nIGxvZyBpbiBkYXRhIGF0dHJpYnV0ZS4gKi8KKwlGSUxFX1ZvbHVtZSAgICA9IDMsCS8qIFZvbHVtZSBuYW1lIGF0dHJpYnV0ZSBhbmQgdm9sdW1lIGluZm9ybWF0aW9uCisJCQkJICAgYXR0cmlidXRlIChmbGFncyBhbmQgbnRmcyB2ZXJzaW9uKS4gV2luZG93cworCQkJCSAgIHJlZmVycyB0byB0aGlzIGZpbGUgYXMgdm9sdW1lIERBU0QgKERpcmVjdAorCQkJCSAgIEFjY2VzcyBTdG9yYWdlIERldmljZSkuICovCisJRklMRV9BdHRyRGVmICAgPSA0LAkvKiBBcnJheSBvZiBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMgaW4gZGF0YQorCQkJCSAgIGF0dHJpYnV0ZS4gKi8KKwlGSUxFX3Jvb3QgICAgICA9IDUsCS8qIFJvb3QgZGlyZWN0b3J5LiAqLworCUZJTEVfQml0bWFwICAgID0gNiwJLyogQWxsb2NhdGlvbiBiaXRtYXAgb2YgYWxsIGNsdXN0ZXJzIChsY25zKSBpbgorCQkJCSAgIGRhdGEgYXR0cmlidXRlLiAqLworCUZJTEVfQm9vdCAgICAgID0gNywJLyogQm9vdCBzZWN0b3IgKGFsd2F5cyBhdCBjbHVzdGVyIDApIGluIGRhdGEKKwkJCQkgICBhdHRyaWJ1dGUuICovCisJRklMRV9CYWRDbHVzICAgPSA4LAkvKiBDb250YWlucyBhbGwgYmFkIGNsdXN0ZXJzIGluIHRoZSBub24tcmVzaWRlbnQKKwkJCQkgICBkYXRhIGF0dHJpYnV0ZS4gKi8KKwlGSUxFX1NlY3VyZSAgICA9IDksCS8qIFNoYXJlZCBzZWN1cml0eSBkZXNjcmlwdG9ycyBpbiBkYXRhIGF0dHJpYnV0ZQorCQkJCSAgIGFuZCB0d28gaW5kZXhlcyBpbnRvIHRoZSBkZXNjcmlwdG9ycy4KKwkJCQkgICBBcHBlYXJlZCBpbiBXaW5kb3dzIDIwMDAuIEJlZm9yZSB0aGF0LCB0aGlzCisJCQkJICAgZmlsZSB3YXMgbmFtZWQgJFF1b3RhIGJ1dCB3YXMgdW51c2VkLiAqLworCUZJTEVfVXBDYXNlICAgID0gMTAsCS8qIFVwcGVyY2FzZSBlcXVpdmFsZW50cyBvZiBhbGwgNjU1MzYgVW5pY29kZQorCQkJCSAgIGNoYXJhY3RlcnMgaW4gZGF0YSBhdHRyaWJ1dGUuICovCisJRklMRV9FeHRlbmQgICAgPSAxMSwJLyogRGlyZWN0b3J5IGNvbnRhaW5pbmcgb3RoZXIgc3lzdGVtIGZpbGVzIChlZy4KKwkJCQkgICAkT2JqSWQsICRRdW90YSwgJFJlcGFyc2UgYW5kICRVc25Kcm5sKS4gVGhpcworCQkJCSAgIGlzIG5ldyB0byBOVEZTMy4wLiAqLworCUZJTEVfcmVzZXJ2ZWQxMiA9IDEyLAkvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAocmVjb3JkcyAxMi0xNSkuICovCisJRklMRV9yZXNlcnZlZDEzID0gMTMsCisJRklMRV9yZXNlcnZlZDE0ID0gMTQsCisJRklMRV9yZXNlcnZlZDE1ID0gMTUsCisJRklMRV9maXJzdF91c2VyID0gMTYsCS8qIEZpcnN0IHVzZXIgZmlsZSwgdXNlZCBhcyB0ZXN0IGxpbWl0IGZvcgorCQkJCSAgIHdoZXRoZXIgdG8gYWxsb3cgb3BlbmluZyBhIGZpbGUgb3Igbm90LiAqLworfSBOVEZTX1NZU1RFTV9GSUxFUzsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgc28gZmFyIGtub3duIE1GVF9SRUNPUkRfKiBmbGFncyAoMTYtYml0KSB3aGljaCBjb250YWluCisgKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWZ0IHJlY29yZCBpbiB3aGljaCB0aGV5IGFyZSBwcmVzZW50LgorICovCitlbnVtIHsKKwlNRlRfUkVDT1JEX0lOX1VTRQk9IGNvbnN0X2NwdV90b19sZTE2KDB4MDAwMSksCisJTUZUX1JFQ09SRF9JU19ESVJFQ1RPUlkgPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMDIpLAorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCit0eXBlZGVmIGxlMTYgTUZUX1JFQ09SRF9GTEFHUzsKKworLyoKKyAqIG1mdCByZWZlcmVuY2VzIChha2EgZmlsZSByZWZlcmVuY2VzIG9yIGZpbGUgcmVjb3JkIHNlZ21lbnQgcmVmZXJlbmNlcykgYXJlCisgKiB1c2VkIHdoZW5ldmVyIGEgc3RydWN0dXJlIG5lZWRzIHRvIHJlZmVyIHRvIGEgcmVjb3JkIGluIHRoZSBtZnQuCisgKgorICogQSByZWZlcmVuY2UgY29uc2lzdHMgb2YgYSA0OC1iaXQgaW5kZXggaW50byB0aGUgbWZ0IGFuZCBhIDE2LWJpdCBzZXF1ZW5jZQorICogbnVtYmVyIHVzZWQgdG8gZGV0ZWN0IHN0YWxlIHJlZmVyZW5jZXMuCisgKgorICogRm9yIGVycm9yIHJlcG9ydGluZyBwdXJwb3NlcyB3ZSB0cmVhdCB0aGUgNDgtYml0IGluZGV4IGFzIGEgc2lnbmVkIHF1YW50aXR5LgorICoKKyAqIFRoZSBzZXF1ZW5jZSBudW1iZXIgaXMgYSBjaXJjdWxhciBjb3VudGVyIChza2lwcGluZyAwKSBkZXNjcmliaW5nIGhvdyBtYW55CisgKiB0aW1lcyB0aGUgcmVmZXJlbmNlZCBtZnQgcmVjb3JkIGhhcyBiZWVuIChyZSl1c2VkLiBUaGlzIGhhcyB0byBtYXRjaCB0aGUKKyAqIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbWZ0IHJlY29yZCBiZWluZyByZWZlcmVuY2VkLCBvdGhlcndpc2UgdGhlIHJlZmVyZW5jZQorICogaXMgY29uc2lkZXJlZCBzdGFsZSBhbmQgcmVtb3ZlZCAoRklYTUU6IG9ubHkgbnRmc2NrIG9yIHRoZSBkcml2ZXIgaXRzZWxmPykuCisgKgorICogSWYgdGhlIHNlcXVlbmNlIG51bWJlciBpcyB6ZXJvIGl0IGlzIGFzc3VtZWQgdGhhdCBubyBzZXF1ZW5jZSBudW1iZXIKKyAqIGNvbnNpc3RlbmN5IGNoZWNraW5nIHNob3VsZCBiZSBwZXJmb3JtZWQuCisgKgorICogRklYTUU6IFNpbmNlIGlub2RlcyBhcmUgMzItYml0IGFzIG9mIG5vdywgdGhlIGRyaXZlciBuZWVkcyB0byBhbHdheXMgY2hlY2sKKyAqIGZvciBoaWdoX3BhcnQgYmVpbmcgMCBhbmQgaWYgbm90IGVpdGhlciBCVUcoKSwgY2F1c2UgYSBwYW5pYygpIG9yIGhhbmRsZQorICogdGhlIHNpdHVhdGlvbiBpbiBzb21lIG90aGVyIHdheS4gVGhpcyBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtIGFzIGEgdm9sdW1lIGhhcworICogdG8gYmVjb21lIEhVR0UgaW4gb3JkZXIgdG8gbmVlZCBtb3JlIHRoYW4gMzItYml0cyB3b3J0aCBvZiBtZnQgcmVjb3Jkcy4KKyAqIEFzc3VtaW5nIHRoZSBzdGFuZGFyZCBtZnQgcmVjb3JkIHNpemUgb2YgMWtiIG9ubHkgdGhlIHJlY29yZHMgKG5ldmVyIG1pbmQKKyAqIHRoZSBub24tcmVzaWRlbnQgYXR0cmlidXRlcywgZXRjLikgd291bGQgcmVxdWlyZSA0VGIgb2Ygc3BhY2Ugb24gdGhlaXIgb3duCisgKiBmb3IgdGhlIGZpcnN0IDMyIGJpdHMgd29ydGggb2YgcmVjb3Jkcy4gVGhpcyBpcyBvbmx5IGlmIHNvbWUgc3RyYW5nZSBwZXJzb24KKyAqIGRvZXNuJ3QgZGVjaWRlIHRvIGZvdWwgcGxheSBhbmQgbWFrZSB0aGUgbWZ0IHNwYXJzZSB3aGljaCB3b3VsZCBiZSBhIHJlYWxseQorICogaG9ycmlibGUgdGhpbmcgdG8gZG8gYXMgaXQgd291bGQgdHJhc2ggb3VyIGN1cnJlbnQgZHJpdmVyIGltcGxlbWVudGF0aW9uLiApLToKKyAqIERvIEkgaGVhciBzY3JlYW1zICJ3ZSB3YW50IDY0LWJpdCBpbm9kZXMhIiA/IT8gKC07CisgKgorICogRklYTUU6IFRoZSBtZnQgem9uZSBpcyBkZWZpbmVkIGFzIHRoZSBmaXJzdCAxMiUgb2YgdGhlIHZvbHVtZS4gVGhpcyBzcGFjZSBpcworICogcmVzZXJ2ZWQgc28gdGhhdCB0aGUgbWZ0IGNhbiBncm93IGNvbnRpZ3VvdXNseSBhbmQgaGVuY2UgZG9lc24ndCBiZWNvbWUKKyAqIGZyYWdtZW50ZWQuIFZvbHVtZSBmcmVlIHNwYWNlIGluY2x1ZGVzIHRoZSBlbXB0eSBwYXJ0IG9mIHRoZSBtZnQgem9uZSBhbmQKKyAqIHdoZW4gdGhlIHZvbHVtZSdzIGZyZWUgODglIGFyZSB1c2VkIHVwLCB0aGUgbWZ0IHpvbmUgaXMgc2hydW5rIGJ5IGEgZmFjdG9yCisgKiBvZiAyLCB0aHVzIG1ha2luZyBtb3JlIHNwYWNlIGF2YWlsYWJsZSBmb3IgbW9yZSBmaWxlcy9kYXRhLiBUaGlzIHByb2Nlc3MgaXMKKyAqIHJlcGVhdGVkIGV2ZXJ5dGltZSB0aGVyZSBpcyBubyBtb3JlIGZyZWUgc3BhY2UgZXhjZXB0IGZvciB0aGUgbWZ0IHpvbmUgdW50aWwKKyAqIHRoZXJlIHJlYWxseSBpcyBubyBtb3JlIGZyZWUgc3BhY2UuCisgKi8KKworLyoKKyAqIFR5cGVkZWYgdGhlIE1GVF9SRUYgYXMgYSA2NC1iaXQgdmFsdWUgZm9yIGVhc2llciBoYW5kbGluZy4KKyAqIEFsc28gZGVmaW5lIHR3byB1bnBhY2tpbmcgbWFjcm9zIHRvIGdldCB0byB0aGUgcmVmZXJlbmNlIChNUkVGKSBhbmQKKyAqIHNlcXVlbmNlIG51bWJlciAoTVNFUU5PKSByZXNwZWN0aXZlbHkuCisgKiBUaGUgX0xFIHZlcnNpb25zIGFyZSB0byBiZSBhcHBsaWVkIG9uIGxpdHRsZSBlbmRpYW4gTUZUX1JFRnMuCisgKiBOb3RlOiBUaGUgX0xFIHZlcnNpb25zIHdpbGwgcmV0dXJuIGEgQ1BVIGVuZGlhbiBmb3JtYXR0ZWQgdmFsdWUhCisgKi8KK3R5cGVkZWYgZW51bSB7CisJTUZUX1JFRl9NQVNLX0NQVQk9IDB4MDAwMGZmZmZmZmZmZmZmZlVMTCwKKwlNRlRfUkVGX01BU0tfTEUJCT0gY29uc3RfY3B1X3RvX2xlNjQoMHgwMDAwZmZmZmZmZmZmZmZmVUxMKSwKK30gTUZUX1JFRl9DT05TVFM7CisKK3R5cGVkZWYgdTY0IE1GVF9SRUY7Cit0eXBlZGVmIGxlNjQgbGVNRlRfUkVGOworCisjZGVmaW5lIE1LX01SRUYobSwgcykJKChNRlRfUkVGKSgoKE1GVF9SRUYpKHMpIDw8IDQ4KSB8CQlcCisJCQkJCSgoTUZUX1JFRikobSkgJiBNRlRfUkVGX01BU0tfQ1BVKSkpCisjZGVmaW5lIE1LX0xFX01SRUYobSwgcykgY3B1X3RvX2xlNjQoTUtfTVJFRihtLCBzKSkKKworI2RlZmluZSBNUkVGKHgpCQkoKHVuc2lnbmVkIGxvbmcpKCh4KSAmIE1GVF9SRUZfTUFTS19DUFUpKQorI2RlZmluZSBNU0VRTk8oeCkJKCh1MTYpKCgoeCkgPj4gNDgpICYgMHhmZmZmKSkKKyNkZWZpbmUgTVJFRl9MRSh4KQkoKHVuc2lnbmVkIGxvbmcpKGxlNjRfdG9fY3B1KHgpICYgTUZUX1JFRl9NQVNLX0NQVSkpCisjZGVmaW5lIE1TRVFOT19MRSh4KQkoKHUxNikoKGxlNjRfdG9fY3B1KHgpID4+IDQ4KSAmIDB4ZmZmZikpCisKKyNkZWZpbmUgSVNfRVJSX01SRUYoeCkJKCgoeCkgJiAweDAwMDA4MDAwMDAwMDAwMDBVTEwpID8gMSA6IDApCisjZGVmaW5lIEVSUl9NUkVGKHgpCSgodTY0KSgoczY0KSh4KSkpCisjZGVmaW5lIE1SRUZfRVJSKHgpCSgoaW50KSgoczY0KSh4KSkpCisKKy8qCisgKiBUaGUgbWZ0IHJlY29yZCBoZWFkZXIgcHJlc2VudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IHJlY29yZCBpbiB0aGUgbWZ0LgorICogVGhpcyBpcyBmb2xsb3dlZCBieSBhIHNlcXVlbmNlIG9mIHZhcmlhYmxlIGxlbmd0aCBhdHRyaWJ1dGUgcmVjb3JkcyB3aGljaAorICogaXMgdGVybWluYXRlZCBieSBhbiBhdHRyaWJ1dGUgb2YgdHlwZSBBVF9FTkQgd2hpY2ggaXMgYSB0cnVuY2F0ZWQgYXR0cmlidXRlCisgKiBpbiB0aGF0IGl0IG9ubHkgY29uc2lzdHMgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlIGNvZGUgQVRfRU5EIGFuZCBub25lIG9mIHRoZQorICogb3RoZXIgbWVtYmVycyBvZiB0aGUgYXR0cmlidXRlIHN0cnVjdHVyZSBhcmUgcHJlc2VudC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworLypPZnMqLworLyogIDAJTlRGU19SRUNPUkQ7IC0tIFVuZm9sZGVkIGhlcmUgYXMgZ2NjIGRvZXNuJ3QgbGlrZSB1bm5hbWVkIHN0cnVjdHMuICovCisJTlRGU19SRUNPUkRfVFlQRSBtYWdpYzsJLyogVXN1YWxseSB0aGUgbWFnaWMgaXMgIkZJTEUiLiAqLworCWxlMTYgdXNhX29mczsJCS8qIFNlZSBOVEZTX1JFQ09SRCBkZWZpbml0aW9uIGFib3ZlLiAqLworCWxlMTYgdXNhX2NvdW50OwkJLyogU2VlIE5URlNfUkVDT1JEIGRlZmluaXRpb24gYWJvdmUuICovCisKKy8qICA4Ki8JbGU2NCBsc247CQkvKiAkTG9nRmlsZSBzZXF1ZW5jZSBudW1iZXIgZm9yIHRoaXMgcmVjb3JkLgorCQkJCSAgIENoYW5nZWQgZXZlcnkgdGltZSB0aGUgcmVjb3JkIGlzIG1vZGlmaWVkLiAqLworLyogMTYqLwlsZTE2IHNlcXVlbmNlX251bWJlcjsJLyogTnVtYmVyIG9mIHRpbWVzIHRoaXMgbWZ0IHJlY29yZCBoYXMgYmVlbgorCQkJCSAgIHJldXNlZC4gKFNlZSBkZXNjcmlwdGlvbiBmb3IgTUZUX1JFRgorCQkJCSAgIGFib3ZlLikgTk9URTogVGhlIGluY3JlbWVudCAoc2tpcHBpbmcgemVybykKKwkJCQkgICBpcyBkb25lIHdoZW4gdGhlIGZpbGUgaXMgZGVsZXRlZC4gTk9URTogSWYKKwkJCQkgICB0aGlzIGlzIHplcm8gaXQgaXMgbGVmdCB6ZXJvLiAqLworLyogMTgqLwlsZTE2IGxpbmtfY291bnQ7CS8qIE51bWJlciBvZiBoYXJkIGxpbmtzLCBpLmUuIHRoZSBudW1iZXIgb2YKKwkJCQkgICBkaXJlY3RvcnkgZW50cmllcyByZWZlcmVuY2luZyB0aGlzIHJlY29yZC4KKwkJCQkgICBOT1RFOiBPbmx5IHVzZWQgaW4gbWZ0IGJhc2UgcmVjb3Jkcy4KKwkJCQkgICBOT1RFOiBXaGVuIGRlbGV0aW5nIGEgZGlyZWN0b3J5IGVudHJ5IHdlCisJCQkJICAgY2hlY2sgdGhlIGxpbmtfY291bnQgYW5kIGlmIGl0IGlzIDEgd2UKKwkJCQkgICBkZWxldGUgdGhlIGZpbGUuIE90aGVyd2lzZSB3ZSBkZWxldGUgdGhlCisJCQkJICAgRklMRV9OQU1FX0FUVFIgYmVpbmcgcmVmZXJlbmNlZCBieSB0aGUKKwkJCQkgICBkaXJlY3RvcnkgZW50cnkgZnJvbSB0aGUgbWZ0IHJlY29yZCBhbmQKKwkJCQkgICBkZWNyZW1lbnQgdGhlIGxpbmtfY291bnQuCisJCQkJICAgRklYTUU6IENhcmVmdWwgd2l0aCBXaW4zMiArIERPUyBuYW1lcyEgKi8KKy8qIDIwKi8JbGUxNiBhdHRyc19vZmZzZXQ7CS8qIEJ5dGUgb2Zmc2V0IHRvIHRoZSBmaXJzdCBhdHRyaWJ1dGUgaW4gdGhpcworCQkJCSAgIG1mdCByZWNvcmQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIG1mdCByZWNvcmQuCisJCQkJICAgTk9URTogTXVzdCBiZSBhbGlnbmVkIHRvIDgtYnl0ZSBib3VuZGFyeS4gKi8KKy8qIDIyKi8JTUZUX1JFQ09SRF9GTEFHUyBmbGFnczsJLyogQml0IGFycmF5IG9mIE1GVF9SRUNPUkRfRkxBR1MuIFdoZW4gYSBmaWxlCisJCQkJICAgaXMgZGVsZXRlZCwgdGhlIE1GVF9SRUNPUkRfSU5fVVNFIGZsYWcgaXMKKwkJCQkgICBzZXQgdG8gemVyby4gKi8KKy8qIDI0Ki8JbGUzMiBieXRlc19pbl91c2U7CS8qIE51bWJlciBvZiBieXRlcyB1c2VkIGluIHRoaXMgbWZ0IHJlY29yZC4KKwkJCQkgICBOT1RFOiBNdXN0IGJlIGFsaWduZWQgdG8gOC1ieXRlIGJvdW5kYXJ5LiAqLworLyogMjgqLwlsZTMyIGJ5dGVzX2FsbG9jYXRlZDsJLyogTnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBmb3IgdGhpcyBtZnQKKwkJCQkgICByZWNvcmQuIFRoaXMgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBtZnQKKwkJCQkgICByZWNvcmQgc2l6ZS4gKi8KKy8qIDMyKi8JbGVNRlRfUkVGIGJhc2VfbWZ0X3JlY29yZDsvKiBUaGlzIGlzIHplcm8gZm9yIGJhc2UgbWZ0IHJlY29yZHMuCisJCQkJICAgV2hlbiBpdCBpcyBub3QgemVybyBpdCBpcyBhIG1mdCByZWZlcmVuY2UKKwkJCQkgICBwb2ludGluZyB0byB0aGUgYmFzZSBtZnQgcmVjb3JkIHRvIHdoaWNoCisJCQkJICAgdGhpcyByZWNvcmQgYmVsb25ncyAodGhpcyBpcyB0aGVuIHVzZWQgdG8KKwkJCQkgICBsb2NhdGUgdGhlIGF0dHJpYnV0ZSBsaXN0IGF0dHJpYnV0ZSBwcmVzZW50CisJCQkJICAgaW4gdGhlIGJhc2UgcmVjb3JkIHdoaWNoIGRlc2NyaWJlcyB0aGlzCisJCQkJICAgZXh0ZW5zaW9uIHJlY29yZCBhbmQgaGVuY2UgbWlnaHQgbmVlZAorCQkJCSAgIG1vZGlmaWNhdGlvbiB3aGVuIHRoZSBleHRlbnNpb24gcmVjb3JkCisJCQkJICAgaXRzZWxmIGlzIG1vZGlmaWVkLCBhbHNvIGxvY2F0aW5nIHRoZQorCQkJCSAgIGF0dHJpYnV0ZSBsaXN0IGFsc28gbWVhbnMgZmluZGluZyB0aGUgb3RoZXIKKwkJCQkgICBwb3RlbnRpYWwgZXh0ZW50cywgYmVsb25naW5nIHRvIHRoZSBub24tYmFzZQorCQkJCSAgIG1mdCByZWNvcmQpLiAqLworLyogNDAqLwlsZTE2IG5leHRfYXR0cl9pbnN0YW5jZTsvKiBUaGUgaW5zdGFuY2UgbnVtYmVyIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0bworCQkJCSAgIHRoZSBuZXh0IGF0dHJpYnV0ZSBhZGRlZCB0byB0aGlzIG1mdCByZWNvcmQuCisJCQkJICAgTk9URTogSW5jcmVtZW50ZWQgZWFjaCB0aW1lIGFmdGVyIGl0IGlzIHVzZWQuCisJCQkJICAgTk9URTogRXZlcnkgdGltZSB0aGUgbWZ0IHJlY29yZCBpcyByZXVzZWQKKwkJCQkgICB0aGlzIG51bWJlciBpcyBzZXQgdG8gemVyby4gIE5PVEU6IFRoZSBmaXJzdAorCQkJCSAgIGluc3RhbmNlIG51bWJlciBpcyBhbHdheXMgMC4gKi8KKy8qIFRoZSBiZWxvdyBmaWVsZHMgYXJlIHNwZWNpZmljIHRvIE5URlMgMy4xKyAoV2luZG93cyBYUCBhbmQgYWJvdmUpOiAqLworLyogNDIqLyBsZTE2IHJlc2VydmVkOwkJLyogUmVzZXJ2ZWQvYWxpZ25tZW50LiAqLworLyogNDQqLyBsZTMyIG1mdF9yZWNvcmRfbnVtYmVyOwkvKiBOdW1iZXIgb2YgdGhpcyBtZnQgcmVjb3JkLiAqLworLyogc2l6ZW9mKCkgPSA0OCBieXRlcyAqLworLyoKKyAqIFdoZW4gKHJlKXVzaW5nIHRoZSBtZnQgcmVjb3JkLCB3ZSBwbGFjZSB0aGUgdXBkYXRlIHNlcXVlbmNlIGFycmF5IGF0IHRoaXMKKyAqIG9mZnNldCwgaS5lLiBiZWZvcmUgd2Ugc3RhcnQgd2l0aCB0aGUgYXR0cmlidXRlcy4gIFRoaXMgYWxzbyBtYWtlcyBzZW5zZSwKKyAqIG90aGVyd2lzZSB3ZSBjb3VsZCBydW4gaW50byBwcm9ibGVtcyB3aXRoIHRoZSB1cGRhdGUgc2VxdWVuY2UgYXJyYXkKKyAqIGNvbnRhaW5pbmcgaW4gaXRzZWxmIHRoZSBsYXN0IHR3byBieXRlcyBvZiBhIHNlY3RvciB3aGljaCB3b3VsZCBtZWFuIHRoYXQKKyAqIG11bHRpIHNlY3RvciB0cmFuc2ZlciBwcm90ZWN0aW9uIHdvdWxkbid0IHdvcmsuICBBcyB5b3UgY2FuJ3QgcHJvdGVjdCBkYXRhCisgKiBieSBvdmVyd3JpdGluZyBpdCBzaW5jZSB5b3UgdGhlbiBjYW4ndCBnZXQgaXQgYmFjay4uLgorICogV2hlbiByZWFkaW5nIHdlIG9idmlvdXNseSB1c2UgdGhlIGRhdGEgZnJvbSB0aGUgbnRmcyByZWNvcmQgaGVhZGVyLgorICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgTUZUX1JFQ09SRDsKKworLyogVGhpcyBpcyB0aGUgdmVyc2lvbiB3aXRob3V0IHRoZSBOVEZTIDMuMSsgc3BlY2lmaWMgZmllbGRzLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworLypPZnMqLworLyogIDAJTlRGU19SRUNPUkQ7IC0tIFVuZm9sZGVkIGhlcmUgYXMgZ2NjIGRvZXNuJ3QgbGlrZSB1bm5hbWVkIHN0cnVjdHMuICovCisJTlRGU19SRUNPUkRfVFlQRSBtYWdpYzsJLyogVXN1YWxseSB0aGUgbWFnaWMgaXMgIkZJTEUiLiAqLworCWxlMTYgdXNhX29mczsJCS8qIFNlZSBOVEZTX1JFQ09SRCBkZWZpbml0aW9uIGFib3ZlLiAqLworCWxlMTYgdXNhX2NvdW50OwkJLyogU2VlIE5URlNfUkVDT1JEIGRlZmluaXRpb24gYWJvdmUuICovCisKKy8qICA4Ki8JbGU2NCBsc247CQkvKiAkTG9nRmlsZSBzZXF1ZW5jZSBudW1iZXIgZm9yIHRoaXMgcmVjb3JkLgorCQkJCSAgIENoYW5nZWQgZXZlcnkgdGltZSB0aGUgcmVjb3JkIGlzIG1vZGlmaWVkLiAqLworLyogMTYqLwlsZTE2IHNlcXVlbmNlX251bWJlcjsJLyogTnVtYmVyIG9mIHRpbWVzIHRoaXMgbWZ0IHJlY29yZCBoYXMgYmVlbgorCQkJCSAgIHJldXNlZC4gKFNlZSBkZXNjcmlwdGlvbiBmb3IgTUZUX1JFRgorCQkJCSAgIGFib3ZlLikgTk9URTogVGhlIGluY3JlbWVudCAoc2tpcHBpbmcgemVybykKKwkJCQkgICBpcyBkb25lIHdoZW4gdGhlIGZpbGUgaXMgZGVsZXRlZC4gTk9URTogSWYKKwkJCQkgICB0aGlzIGlzIHplcm8gaXQgaXMgbGVmdCB6ZXJvLiAqLworLyogMTgqLwlsZTE2IGxpbmtfY291bnQ7CS8qIE51bWJlciBvZiBoYXJkIGxpbmtzLCBpLmUuIHRoZSBudW1iZXIgb2YKKwkJCQkgICBkaXJlY3RvcnkgZW50cmllcyByZWZlcmVuY2luZyB0aGlzIHJlY29yZC4KKwkJCQkgICBOT1RFOiBPbmx5IHVzZWQgaW4gbWZ0IGJhc2UgcmVjb3Jkcy4KKwkJCQkgICBOT1RFOiBXaGVuIGRlbGV0aW5nIGEgZGlyZWN0b3J5IGVudHJ5IHdlCisJCQkJICAgY2hlY2sgdGhlIGxpbmtfY291bnQgYW5kIGlmIGl0IGlzIDEgd2UKKwkJCQkgICBkZWxldGUgdGhlIGZpbGUuIE90aGVyd2lzZSB3ZSBkZWxldGUgdGhlCisJCQkJICAgRklMRV9OQU1FX0FUVFIgYmVpbmcgcmVmZXJlbmNlZCBieSB0aGUKKwkJCQkgICBkaXJlY3RvcnkgZW50cnkgZnJvbSB0aGUgbWZ0IHJlY29yZCBhbmQKKwkJCQkgICBkZWNyZW1lbnQgdGhlIGxpbmtfY291bnQuCisJCQkJICAgRklYTUU6IENhcmVmdWwgd2l0aCBXaW4zMiArIERPUyBuYW1lcyEgKi8KKy8qIDIwKi8JbGUxNiBhdHRyc19vZmZzZXQ7CS8qIEJ5dGUgb2Zmc2V0IHRvIHRoZSBmaXJzdCBhdHRyaWJ1dGUgaW4gdGhpcworCQkJCSAgIG1mdCByZWNvcmQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIG1mdCByZWNvcmQuCisJCQkJICAgTk9URTogTXVzdCBiZSBhbGlnbmVkIHRvIDgtYnl0ZSBib3VuZGFyeS4gKi8KKy8qIDIyKi8JTUZUX1JFQ09SRF9GTEFHUyBmbGFnczsJLyogQml0IGFycmF5IG9mIE1GVF9SRUNPUkRfRkxBR1MuIFdoZW4gYSBmaWxlCisJCQkJICAgaXMgZGVsZXRlZCwgdGhlIE1GVF9SRUNPUkRfSU5fVVNFIGZsYWcgaXMKKwkJCQkgICBzZXQgdG8gemVyby4gKi8KKy8qIDI0Ki8JbGUzMiBieXRlc19pbl91c2U7CS8qIE51bWJlciBvZiBieXRlcyB1c2VkIGluIHRoaXMgbWZ0IHJlY29yZC4KKwkJCQkgICBOT1RFOiBNdXN0IGJlIGFsaWduZWQgdG8gOC1ieXRlIGJvdW5kYXJ5LiAqLworLyogMjgqLwlsZTMyIGJ5dGVzX2FsbG9jYXRlZDsJLyogTnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBmb3IgdGhpcyBtZnQKKwkJCQkgICByZWNvcmQuIFRoaXMgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBtZnQKKwkJCQkgICByZWNvcmQgc2l6ZS4gKi8KKy8qIDMyKi8JbGVNRlRfUkVGIGJhc2VfbWZ0X3JlY29yZDsvKiBUaGlzIGlzIHplcm8gZm9yIGJhc2UgbWZ0IHJlY29yZHMuCisJCQkJICAgV2hlbiBpdCBpcyBub3QgemVybyBpdCBpcyBhIG1mdCByZWZlcmVuY2UKKwkJCQkgICBwb2ludGluZyB0byB0aGUgYmFzZSBtZnQgcmVjb3JkIHRvIHdoaWNoCisJCQkJICAgdGhpcyByZWNvcmQgYmVsb25ncyAodGhpcyBpcyB0aGVuIHVzZWQgdG8KKwkJCQkgICBsb2NhdGUgdGhlIGF0dHJpYnV0ZSBsaXN0IGF0dHJpYnV0ZSBwcmVzZW50CisJCQkJICAgaW4gdGhlIGJhc2UgcmVjb3JkIHdoaWNoIGRlc2NyaWJlcyB0aGlzCisJCQkJICAgZXh0ZW5zaW9uIHJlY29yZCBhbmQgaGVuY2UgbWlnaHQgbmVlZAorCQkJCSAgIG1vZGlmaWNhdGlvbiB3aGVuIHRoZSBleHRlbnNpb24gcmVjb3JkCisJCQkJICAgaXRzZWxmIGlzIG1vZGlmaWVkLCBhbHNvIGxvY2F0aW5nIHRoZQorCQkJCSAgIGF0dHJpYnV0ZSBsaXN0IGFsc28gbWVhbnMgZmluZGluZyB0aGUgb3RoZXIKKwkJCQkgICBwb3RlbnRpYWwgZXh0ZW50cywgYmVsb25naW5nIHRvIHRoZSBub24tYmFzZQorCQkJCSAgIG1mdCByZWNvcmQpLiAqLworLyogNDAqLwlsZTE2IG5leHRfYXR0cl9pbnN0YW5jZTsvKiBUaGUgaW5zdGFuY2UgbnVtYmVyIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0bworCQkJCSAgIHRoZSBuZXh0IGF0dHJpYnV0ZSBhZGRlZCB0byB0aGlzIG1mdCByZWNvcmQuCisJCQkJICAgTk9URTogSW5jcmVtZW50ZWQgZWFjaCB0aW1lIGFmdGVyIGl0IGlzIHVzZWQuCisJCQkJICAgTk9URTogRXZlcnkgdGltZSB0aGUgbWZ0IHJlY29yZCBpcyByZXVzZWQKKwkJCQkgICB0aGlzIG51bWJlciBpcyBzZXQgdG8gemVyby4gIE5PVEU6IFRoZSBmaXJzdAorCQkJCSAgIGluc3RhbmNlIG51bWJlciBpcyBhbHdheXMgMC4gKi8KKy8qIHNpemVvZigpID0gNDIgYnl0ZXMgKi8KKy8qCisgKiBXaGVuIChyZSl1c2luZyB0aGUgbWZ0IHJlY29yZCwgd2UgcGxhY2UgdGhlIHVwZGF0ZSBzZXF1ZW5jZSBhcnJheSBhdCB0aGlzCisgKiBvZmZzZXQsIGkuZS4gYmVmb3JlIHdlIHN0YXJ0IHdpdGggdGhlIGF0dHJpYnV0ZXMuICBUaGlzIGFsc28gbWFrZXMgc2Vuc2UsCisgKiBvdGhlcndpc2Ugd2UgY291bGQgcnVuIGludG8gcHJvYmxlbXMgd2l0aCB0aGUgdXBkYXRlIHNlcXVlbmNlIGFycmF5CisgKiBjb250YWluaW5nIGluIGl0c2VsZiB0aGUgbGFzdCB0d28gYnl0ZXMgb2YgYSBzZWN0b3Igd2hpY2ggd291bGQgbWVhbiB0aGF0CisgKiBtdWx0aSBzZWN0b3IgdHJhbnNmZXIgcHJvdGVjdGlvbiB3b3VsZG4ndCB3b3JrLiAgQXMgeW91IGNhbid0IHByb3RlY3QgZGF0YQorICogYnkgb3ZlcndyaXRpbmcgaXQgc2luY2UgeW91IHRoZW4gY2FuJ3QgZ2V0IGl0IGJhY2suLi4KKyAqIFdoZW4gcmVhZGluZyB3ZSBvYnZpb3VzbHkgdXNlIHRoZSBkYXRhIGZyb20gdGhlIG50ZnMgcmVjb3JkIGhlYWRlci4KKyAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIE1GVF9SRUNPUkRfT0xEOworCisvKgorICogU3lzdGVtIGRlZmluZWQgYXR0cmlidXRlcyAoMzItYml0KS4gIEVhY2ggYXR0cmlidXRlIHR5cGUgaGFzIGEgY29ycmVzcG9uZGluZworICogYXR0cmlidXRlIG5hbWUgKFVuaWNvZGUgc3RyaW5nIG9mIG1heGltdW0gNjQgY2hhcmFjdGVyIGxlbmd0aCkgYXMgZGVzY3JpYmVkCisgKiBieSB0aGUgYXR0cmlidXRlIGRlZmluaXRpb25zIHByZXNlbnQgaW4gdGhlIGRhdGEgYXR0cmlidXRlIG9mIHRoZSAkQXR0ckRlZgorICogc3lzdGVtIGZpbGUuICBPbiBOVEZTIDMuMCB2b2x1bWVzIHRoZSBuYW1lcyBhcmUganVzdCBhcyB0aGUgdHlwZXMgYXJlIG5hbWVkCisgKiBpbiB0aGUgYmVsb3cgZGVmaW5lcyBleGNoYW5naW5nIEFUXyBmb3IgdGhlIGRvbGxhciBzaWduICgkKS4gIElmIHRoYXQgaXMgbm90CisgKiBhIHJldmVhbGluZyBjaG9pY2Ugb2Ygc3ltYm9sIEkgZG8gbm90IGtub3cgd2hhdCBpcy4uLiAoLTsKKyAqLworZW51bSB7CisJQVRfVU5VU0VECQkJPSBjb25zdF9jcHVfdG9fbGUzMiggICAgICAgICAwKSwKKwlBVF9TVEFOREFSRF9JTkZPUk1BVElPTgkJPSBjb25zdF9jcHVfdG9fbGUzMiggICAgICAweDEwKSwKKwlBVF9BVFRSSUJVVEVfTElTVAkJPSBjb25zdF9jcHVfdG9fbGUzMiggICAgICAweDIwKSwKKwlBVF9GSUxFX05BTUUJCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgIDB4MzApLAorCUFUX09CSkVDVF9JRAkJCT0gY29uc3RfY3B1X3RvX2xlMzIoICAgICAgMHg0MCksCisJQVRfU0VDVVJJVFlfREVTQ1JJUFRPUgkJPSBjb25zdF9jcHVfdG9fbGUzMiggICAgICAweDUwKSwKKwlBVF9WT0xVTUVfTkFNRQkJCT0gY29uc3RfY3B1X3RvX2xlMzIoICAgICAgMHg2MCksCisJQVRfVk9MVU1FX0lORk9STUFUSU9OCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgIDB4NzApLAorCUFUX0RBVEEJCQkJPSBjb25zdF9jcHVfdG9fbGUzMiggICAgICAweDgwKSwKKwlBVF9JTkRFWF9ST09UCQkJPSBjb25zdF9jcHVfdG9fbGUzMiggICAgICAweDkwKSwKKwlBVF9JTkRFWF9BTExPQ0FUSU9OCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgIDB4YTApLAorCUFUX0JJVE1BUAkJCT0gY29uc3RfY3B1X3RvX2xlMzIoICAgICAgMHhiMCksCisJQVRfUkVQQVJTRV9QT0lOVAkJPSBjb25zdF9jcHVfdG9fbGUzMiggICAgICAweGMwKSwKKwlBVF9FQV9JTkZPUk1BVElPTgkJPSBjb25zdF9jcHVfdG9fbGUzMiggICAgICAweGQwKSwKKwlBVF9FQQkJCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgIDB4ZTApLAorCUFUX1BST1BFUlRZX1NFVAkJCT0gY29uc3RfY3B1X3RvX2xlMzIoICAgICAgMHhmMCksCisJQVRfTE9HR0VEX1VUSUxJVFlfU1RSRUFNCT0gY29uc3RfY3B1X3RvX2xlMzIoICAgICAweDEwMCksCisJQVRfRklSU1RfVVNFUl9ERUZJTkVEX0FUVFJJQlVURQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAweDEwMDApLAorCUFUX0VORAkJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4ZmZmZmZmZmYpCit9OworCit0eXBlZGVmIGxlMzIgQVRUUl9UWVBFOworCisvKgorICogVGhlIGNvbGxhdGlvbiBydWxlcyBmb3Igc29ydGluZyB2aWV3cy9pbmRleGVzL2V0YyAoMzItYml0KS4KKyAqCisgKiBDT0xMQVRJT05fQklOQVJZIC0gQ29sbGF0ZSBieSBiaW5hcnkgY29tcGFyZSB3aGVyZSB0aGUgZmlyc3QgYnl0ZSBpcyBtb3N0CisgKglzaWduaWZpY2FudC4KKyAqIENPTExBVElPTl9VTklDT0RFX1NUUklORyAtIENvbGxhdGUgVW5pY29kZSBzdHJpbmdzIGJ5IGNvbXBhcmluZyB0aGVpciBiaW5hcnkKKyAqCVVuaWNvZGUgdmFsdWVzLCBleGNlcHQgdGhhdCB3aGVuIGEgY2hhcmFjdGVyIGNhbiBiZSB1cHBlcmNhc2VkLCB0aGUKKyAqCXVwcGVyIGNhc2UgdmFsdWUgY29sbGF0ZXMgYmVmb3JlIHRoZSBsb3dlciBjYXNlIG9uZS4KKyAqIENPTExBVElPTl9GSUxFX05BTUUgLSBDb2xsYXRlIGZpbGUgbmFtZXMgYXMgVW5pY29kZSBzdHJpbmdzLiBUaGUgY29sbGF0aW9uCisgKglpcyBkb25lIHZlcnkgbXVjaCBsaWtlIENPTExBVElPTl9VTklDT0RFX1NUUklORy4gSW4gZmFjdCBJIGhhdmUgbm8gaWRlYQorICoJd2hhdCB0aGUgZGlmZmVyZW5jZSBpcy4gUGVyaGFwcyB0aGUgZGlmZmVyZW5jZSBpcyB0aGF0IGZpbGUgbmFtZXMKKyAqCXdvdWxkIHRyZWF0IHNvbWUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIGFuIG9kZCB3YXkgKHNlZQorICoJdW5pc3RyLmM6Om50ZnNfY29sbGF0ZV9uYW1lcygpIGFuZCB1bmlzdHIuYzo6bGVnYWxfYW5zaV9jaGFyX2FycmF5W10KKyAqCWZvciB3aGF0IEkgbWVhbiBidXQgQ09MTEFUSU9OX1VOSUNPREVfU1RSSU5HIHdvdWxkIG5vdCBnaXZlIGFueSBzcGVjaWFsCisgKgl0cmVhdG1lbnQgdG8gYW55IGNoYXJhY3RlcnMgYXQgYWxsLCBidXQgdGhpcyBpcyBzcGVjdWxhdGlvbi4KKyAqIENPTExBVElPTl9OVE9GU19VTE9ORyAtIFNvcnRpbmcgaXMgZG9uZSBhY2NvcmRpbmcgdG8gYXNjZW5kaW5nIGxlMzIga2V5CisgKgl2YWx1ZXMuIEUuZy4gdXNlZCBmb3IgJFNJSSBpbmRleCBpbiBGSUxFX1NlY3VyZSwgd2hpY2ggc29ydHMgYnkKKyAqCXNlY3VyaXR5X2lkIChsZTMyKS4KKyAqIENPTExBVElPTl9OVE9GU19TSUQgLSBTb3J0aW5nIGlzIGRvbmUgYWNjb3JkaW5nIHRvIGFzY2VuZGluZyBTSUQgdmFsdWVzLgorICoJRS5nLiB1c2VkIGZvciAkTyBpbmRleCBpbiBGSUxFX0V4dGVuZC8kUXVvdGEuCisgKiBDT0xMQVRJT05fTlRPRlNfU0VDVVJJVFlfSEFTSCAtIFNvcnRpbmcgaXMgZG9uZSBmaXJzdCBieSBhc2NlbmRpbmcgaGFzaAorICoJdmFsdWVzIGFuZCBzZWNvbmQgYnkgYXNjZW5kaW5nIHNlY3VyaXR5X2lkIHZhbHVlcy4gRS5nLiB1c2VkIGZvciAkU0RICisgKglpbmRleCBpbiBGSUxFX1NlY3VyZS4KKyAqIENPTExBVElPTl9OVE9GU19VTE9OR1MgLSBTb3J0aW5nIGlzIGRvbmUgYWNjb3JkaW5nIHRvIGEgc2VxdWVuY2Ugb2YgYXNjZW5kaW5nCisgKglsZTMyIGtleSB2YWx1ZXMuIEUuZy4gdXNlZCBmb3IgJE8gaW5kZXggaW4gRklMRV9FeHRlbmQvJE9iaklkLCB3aGljaAorICoJc29ydHMgYnkgb2JqZWN0X2lkICgxNi1ieXRlKSwgYnkgc3BsaXR0aW5nIHVwIHRoZSBvYmplY3RfaWQgaW4gZm91cgorICoJbGUzMiB2YWx1ZXMgYW5kIHVzaW5nIHRoZW0gYXMgaW5kaXZpZHVhbCBrZXlzLiBFLmcuIHRha2UgdGhlIGZvbGxvd2luZworICoJdHdvIHNlY3VyaXR5X2lkcywgc3RvcmVkIGFzIGZvbGxvd3Mgb24gZGlzazoKKyAqCQkxc3Q6IGExIDYxIDY1IGI3IDY1IDdiIGQ0IDExIDllIDNkIDAwIGUwIDgxIDEwIDQyIDU5CisgKgkJMm5kOiAzOCAxNCAzNyBkMiBkMiBmMyBkNCAxMSBhNSAyMSBjOCA2YiA3OSBiMSA5NyA0NQorICoJVG8gY29tcGFyZSB0aGVtLCB0aGV5IGFyZSBzcGxpdCBpbnRvIGZvdXIgbGUzMiB2YWx1ZXMgZWFjaCwgbGlrZSBzbzoKKyAqCQkxc3Q6IDB4Yjc2NTYxYTEgMHgxMWQ0N2I2NSAweGUwMDAzZDllIDB4NTk0MjEwODEKKyAqCQkybmQ6IDB4ZDIzNzE0MzggMHgxMWQ0ZjNkMiAweDZiYzgyMWE1IDB4NDU5N2IxNzkKKyAqCU5vdywgaXQgaXMgYXBwYXJlbnQgd2h5IHRoZSAybmQgb2JqZWN0X2lkIGNvbGxhdGVzIGFmdGVyIHRoZSAxc3Q6IHRoZQorICoJZmlyc3QgbGUzMiB2YWx1ZSBvZiB0aGUgMXN0IG9iamVjdF9pZCBpcyBsZXNzIHRoYW4gdGhlIGZpcnN0IGxlMzIgb2YKKyAqCXRoZSAybmQgb2JqZWN0X2lkLiBJZiB0aGUgZmlyc3QgbGUzMiB2YWx1ZXMgb2YgYm90aCBvYmplY3RfaWRzIHdlcmUKKyAqCWVxdWFsIHRoZW4gdGhlIHNlY29uZCBsZTMyIHZhbHVlcyB3b3VsZCBiZSBjb21wYXJlZCwgZXRjLgorICovCitlbnVtIHsKKwlDT0xMQVRJT05fQklOQVJZCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDApLAorCUNPTExBVElPTl9GSUxFX05BTUUJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMSksCisJQ09MTEFUSU9OX1VOSUNPREVfU1RSSU5HCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMiksCisJQ09MTEFUSU9OX05UT0ZTX1VMT05HCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MTApLAorCUNPTExBVElPTl9OVE9GU19TSUQJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgxMSksCisJQ09MTEFUSU9OX05UT0ZTX1NFQ1VSSVRZX0hBU0gJPSBjb25zdF9jcHVfdG9fbGUzMigweDEyKSwKKwlDT0xMQVRJT05fTlRPRlNfVUxPTkdTCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MTMpCit9OworCit0eXBlZGVmIGxlMzIgQ09MTEFUSU9OX1JVTEU7CisKKy8qCisgKiBUaGUgZmxhZ3MgKDMyLWJpdCkgZGVzY3JpYmluZyBhdHRyaWJ1dGUgcHJvcGVydGllcyBpbiB0aGUgYXR0cmlidXRlCisgKiBkZWZpbml0aW9uIHN0cnVjdHVyZS4gIEZJWE1FOiBUaGlzIGluZm9ybWF0aW9uIGlzIGZyb20gUmVnaXMncyBpbmZvcm1hdGlvbgorICogYW5kLCBhY2NvcmRpbmcgdG8gaGltLCBpdCBpcyBub3QgY2VydGFpbiBhbmQgcHJvYmFibHkgaW5jb21wbGV0ZS4KKyAqIFRoZSBJTkRFWEFCTEUgZmxhZyBpcyBmYWlybHkgY2VydGFpbmx5IGNvcnJlY3QgYXMgb25seSB0aGUgZmlsZSBuYW1lCisgKiBhdHRyaWJ1dGUgaGFzIHRoaXMgZmxhZyBzZXQgYW5kIHRoaXMgaXMgdGhlIG9ubHkgYXR0cmlidXRlIGluZGV4ZWQgaW4gTlQ0LgorICovCitlbnVtIHsKKwlJTkRFWEFCTEUJICAgID0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMiksIC8qIEF0dHJpYnV0ZSBjYW4gYmUKKwkJCQkJCQkgIGluZGV4ZWQuICovCisJTkVFRF9UT19SRUdFTkVSQVRFICA9IGNvbnN0X2NwdV90b19sZTMyKDB4NDApLCAvKiBOZWVkIHRvIHJlZ2VuZXJhdGUKKwkJCQkJCQkgIGR1cmluZyByZWdlbmVyYXRpb24KKwkJCQkJCQkgIHBoYXNlLiAqLworCUNBTl9CRV9OT05fUkVTSURFTlQgPSBjb25zdF9jcHVfdG9fbGUzMigweDgwKSwgLyogQXR0cmlidXRlIGNhbiBiZQorCQkJCQkJCSAgbm9uLXJlc2lkZW50LiAqLworfTsKKwordHlwZWRlZiBsZTMyIEFUVFJfREVGX0ZMQUdTOworCisvKgorICogVGhlIGRhdGEgYXR0cmlidXRlIG9mIEZJTEVfQXR0ckRlZiBjb250YWlucyBhIHNlcXVlbmNlIG9mIGF0dHJpYnV0ZQorICogZGVmaW5pdGlvbnMgZm9yIHRoZSBOVEZTIHZvbHVtZS4gV2l0aCB0aGlzLCBpdCBpcyBzdXBwb3NlZCB0byBiZSBzYWZlIGZvciBhbgorICogb2xkZXIgTlRGUyBkcml2ZXIgdG8gbW91bnQgYSB2b2x1bWUgY29udGFpbmluZyBhIG5ld2VyIE5URlMgdmVyc2lvbiB3aXRob3V0CisgKiBkYW1hZ2luZyBpdCAodGhhdCdzIHRoZSB0aGVvcnkuIEluIHByYWN0aWNlIGl0J3M6IG5vdCBkYW1hZ2luZyBpdCB0b28gbXVjaCkuCisgKiBFbnRyaWVzIGFyZSBzb3J0ZWQgYnkgYXR0cmlidXRlIHR5cGUuIFRoZSBmbGFncyBkZXNjcmliZSB3aGV0aGVyIHRoZQorICogYXR0cmlidXRlIGNhbiBiZSByZXNpZGVudC9ub24tcmVzaWRlbnQgYW5kIHBvc3NpYmx5IG90aGVyIHRoaW5ncywgYnV0IHRoZQorICogYWN0dWFsIGJpdHMgYXJlIHVua25vd24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKy8qaGV4IG9mcyovCisvKiAgMCovCW50ZnNjaGFyIG5hbWVbMHg0MF07CQkvKiBVbmljb2RlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gWmVybworCQkJCQkgICB0ZXJtaW5hdGVkLiAqLworLyogODAqLwlBVFRSX1RZUEUgdHlwZTsJCQkvKiBUeXBlIG9mIHRoZSBhdHRyaWJ1dGUuICovCisvKiA4NCovCWxlMzIgZGlzcGxheV9ydWxlOwkJLyogRGVmYXVsdCBkaXNwbGF5IHJ1bGUuCisJCQkJCSAgIEZJWE1FOiBXaGF0IGRvZXMgaXQgbWVhbj8gKEFJQSkgKi8KKy8qIDg4Ki8gQ09MTEFUSU9OX1JVTEUgY29sbGF0aW9uX3J1bGU7CS8qIERlZmF1bHQgY29sbGF0aW9uIHJ1bGUuICovCisvKiA4YyovCUFUVFJfREVGX0ZMQUdTIGZsYWdzOwkJLyogRmxhZ3MgZGVzY3JpYmluZyB0aGUgYXR0cmlidXRlLiAqLworLyogOTAqLwlzbGU2NCBtaW5fc2l6ZTsJCQkvKiBPcHRpb25hbCBtaW5pbXVtIGF0dHJpYnV0ZSBzaXplLiAqLworLyogOTgqLwlzbGU2NCBtYXhfc2l6ZTsJCQkvKiBNYXhpbXVtIHNpemUgb2YgYXR0cmlidXRlLiAqLworLyogc2l6ZW9mKCkgPSAweGEwIG9yIDE2MCBieXRlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIEFUVFJfREVGOworCisvKgorICogQXR0cmlidXRlIGZsYWdzICgxNi1iaXQpLgorICovCitlbnVtIHsKKwlBVFRSX0lTX0NPTVBSRVNTRUQgICAgPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMDEpLAorCUFUVFJfQ09NUFJFU1NJT05fTUFTSyA9IGNvbnN0X2NwdV90b19sZTE2KDB4MDBmZiksIC8qIENvbXByZXNzaW9uIG1ldGhvZAorCQkJCQkJCSAgICAgIG1hc2suICBBbHNvLCBmaXJzdAorCQkJCQkJCSAgICAgIGlsbGVnYWwgdmFsdWUuICovCisJQVRUUl9JU19FTkNSWVBURUQgICAgID0gY29uc3RfY3B1X3RvX2xlMTYoMHg0MDAwKSwKKwlBVFRSX0lTX1NQQVJTRQkgICAgICA9IGNvbnN0X2NwdV90b19sZTE2KDB4ODAwMCksCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3R5cGVkZWYgbGUxNiBBVFRSX0ZMQUdTOworCisvKgorICogQXR0cmlidXRlIGNvbXByZXNzaW9uLgorICoKKyAqIE9ubHkgdGhlIGRhdGEgYXR0cmlidXRlIGlzIGV2ZXIgY29tcHJlc3NlZCBpbiB0aGUgY3VycmVudCBudGZzIGRyaXZlciBpbgorICogV2luZG93cy4gRnVydGhlciwgY29tcHJlc3Npb24gaXMgb25seSBhcHBsaWVkIHdoZW4gdGhlIGRhdGEgYXR0cmlidXRlIGlzCisgKiBub24tcmVzaWRlbnQuIEZpbmFsbHksIHRvIHVzZSBjb21wcmVzc2lvbiwgdGhlIG1heGltdW0gYWxsb3dlZCBjbHVzdGVyIHNpemUKKyAqIG9uIGEgdm9sdW1lIGlzIDRraWIuCisgKgorICogVGhlIGNvbXByZXNzaW9uIG1ldGhvZCBpcyBiYXNlZCBvbiBpbmRlcGVuZGVudGx5IGNvbXByZXNzaW5nIGJsb2NrcyBvZiBYCisgKiBjbHVzdGVycywgd2hlcmUgWCBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGNvbXByZXNzaW9uX3VuaXQgdmFsdWUgZm91bmQgaW4gdGhlCisgKiBub24tcmVzaWRlbnQgYXR0cmlidXRlIHJlY29yZCBoZWFkZXIgKG1vcmUgcHJlY2lzZWx5OiBYID0gMl5jb21wcmVzc2lvbl91bml0CisgKiBjbHVzdGVycykuIE9uIFdpbmRvd3MgTlQvMmssIFggYWx3YXlzIGlzIDE2IGNsdXN0ZXJzIChjb21wcmVzc2lvbl91bml0ID0gNCkuCisgKgorICogVGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCBjYXNlcyBvZiBob3cgYSBjb21wcmVzc2lvbiBibG9jayBvZiBYIGNsdXN0ZXJzCisgKiBjYW4gYmUgc3RvcmVkOgorICoKKyAqICAgMSkgVGhlIGRhdGEgaW4gdGhlIGJsb2NrIGlzIGFsbCB6ZXJvIChhIHNwYXJzZSBibG9jayk6CisgKgkgIFRoaXMgaXMgc3RvcmVkIGFzIGEgc3BhcnNlIGJsb2NrIGluIHRoZSBydW5saXN0LCBpLmUuIHRoZSBydW5saXN0CisgKgkgIGVudHJ5IGhhcyBsZW5ndGggPSBYIGFuZCBsY24gPSAtMS4gVGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkgYWN0dWFsbHkKKyAqCSAgdXNlcyBhIGRlbHRhX2xjbiB2YWx1ZSBsZW5ndGggb2YgMCwgaS5lLiBkZWx0YV9sY24gaXMgbm90IHByZXNlbnQgYXQKKyAqCSAgYWxsLCB3aGljaCBpcyB0aGVuIGludGVycHJldGVkIGJ5IHRoZSBkcml2ZXIgYXMgbGNuID0gLTEuCisgKgkgIE5PVEU6IEV2ZW4gdW5jb21wcmVzc2VkIGZpbGVzIGNhbiBiZSBzcGFyc2Ugb24gTlRGUyAzLjAgdm9sdW1lcywgdGhlbgorICoJICB0aGUgc2FtZSBwcmluY2lwbGVzIGFwcGx5IGFzIGFib3ZlLCBleGNlcHQgdGhhdCB0aGUgbGVuZ3RoIGlzIG5vdAorICoJICByZXN0cmljdGVkIHRvIGJlaW5nIGFueSBwYXJ0aWN1bGFyIHZhbHVlLgorICoKKyAqICAgMikgVGhlIGRhdGEgaW4gdGhlIGJsb2NrIGlzIG5vdCBjb21wcmVzc2VkOgorICoJICBUaGlzIGhhcHBlbnMgd2hlbiBjb21wcmVzc2lvbiBkb2Vzbid0IHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgYmxvY2sKKyAqCSAgaW4gY2x1c3RlcnMuIEkuZS4gaWYgY29tcHJlc3Npb24gaGFzIGEgc21hbGwgZWZmZWN0IHNvIHRoYXQgdGhlCisgKgkgIGNvbXByZXNzZWQgZGF0YSBzdGlsbCBvY2N1cGllcyBYIGNsdXN0ZXJzLCB0aGVuIHRoZSB1bmNvbXByZXNzZWQgZGF0YQorICoJICBpcyBzdG9yZWQgaW4gdGhlIGJsb2NrLgorICoJICBUaGlzIGNhc2UgaXMgcmVjb2duaXNlZCBieSB0aGUgZmFjdCB0aGF0IHRoZSBydW5saXN0IGVudHJ5IGhhcworICoJICBsZW5ndGggPSBYIGFuZCBsY24gPj0gMC4gVGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkgc3RvcmVzIHRoaXMgYXMKKyAqCSAgbm9ybWFsIHdpdGggYSBydW4gbGVuZ3RoIG9mIFggYW5kIHNvbWUgc3BlY2lmaWMgZGVsdGFfbGNuLCBpLmUuCisgKgkgIGRlbHRhX2xjbiBoYXMgdG8gYmUgcHJlc2VudC4KKyAqCisgKiAgIDMpIFRoZSBkYXRhIGluIHRoZSBibG9jayBpcyBjb21wcmVzc2VkOgorICoJICBUaGUgY29tbW9uIGNhc2UuIFRoaXMgY2FzZSBpcyByZWNvZ25pc2VkIGJ5IHRoZSBmYWN0IHRoYXQgdGhlIHJ1bgorICoJICBsaXN0IGVudHJ5IGhhcyBsZW5ndGggTCA8IFggYW5kIGxjbiA+PSAwLiBUaGUgbWFwcGluZyBwYWlycyBhcnJheQorICoJICBzdG9yZXMgdGhpcyBhcyBub3JtYWwgd2l0aCBhIHJ1biBsZW5ndGggb2YgWCBhbmQgc29tZSBzcGVjaWZpYworICoJICBkZWx0YV9sY24sIGkuZS4gZGVsdGFfbGNuIGhhcyB0byBiZSBwcmVzZW50LiBUaGlzIHJ1bmxpc3QgZW50cnkgaXMKKyAqCSAgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBzcGFyc2UgZW50cnkgd2l0aCBsZW5ndGggPSBYIC0gTCBhbmQKKyAqCSAgbGNuID0gLTEuIFRoZSBsYXR0ZXIgZW50cnkgaXMgdG8gbWFrZSB1cCB0aGUgdmNuIGNvdW50aW5nIHRvIHRoZQorICoJICBmdWxsIGNvbXByZXNzaW9uIGJsb2NrIHNpemUgWC4KKyAqCisgKiBJbiBmYWN0LCBsaWZlIGlzIG1vcmUgY29tcGxpY2F0ZWQgYmVjYXVzZSBhZGphY2VudCBlbnRyaWVzIG9mIHRoZSBzYW1lIHR5cGUKKyAqIGNhbiBiZSBjb2FsZXNjZWQuIFRoaXMgbWVhbnMgdGhhdCBvbmUgaGFzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZgorICogY2x1c3RlcnMgaGFuZGxlZCBhbmQgd29yayBvbiBhIGJhc2lzIG9mIFggY2x1c3RlcnMgYXQgYSB0aW1lIGJlaW5nIG9uZQorICogYmxvY2suIEFuIGV4YW1wbGU6IGlmIGxlbmd0aCBMID4gWCB0aGlzIG1lYW5zIHRoYXQgdGhpcyBwYXJ0aWN1bGFyIHJ1bmxpc3QKKyAqIGVudHJ5IGNvbnRhaW5zIGEgYmxvY2sgb2YgbGVuZ3RoIFggYW5kIHBhcnQgb2Ygb25lIG9yIG1vcmUgYmxvY2tzIG9mIGxlbmd0aAorICogTCAtIFguIEFub3RoZXIgZXhhbXBsZTogaWYgbGVuZ3RoIEwgPCBYLCB0aGlzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdAorICogdGhlIGJsb2NrIGlzIGNvbXByZXNzZWQgYXMgaXQgbWlnaHQgYmUgdGhhdCB0aGUgbGNuIGNoYW5nZXMgaW5zaWRlIHRoZSBibG9jaworICogYW5kIGhlbmNlIHRoZSBmb2xsb3dpbmcgcnVubGlzdCBlbnRyeSBkZXNjcmliZXMgdGhlIGNvbnRpbnVhdGlvbiBvZiB0aGUKKyAqIHBvdGVudGlhbGx5IGNvbXByZXNzZWQgYmxvY2suIFRoZSBibG9jayB3b3VsZCBiZSBjb21wcmVzc2VkIGlmIHRoZQorICogZm9sbG93aW5nIHJ1bmxpc3QgZW50cnkgZGVzY3JpYmVzIGF0IGxlYXN0IFggLSBMIHNwYXJzZSBjbHVzdGVycywgdGh1cworICogbWFraW5nIHVwIHRoZSBjb21wcmVzc2lvbiBibG9jayBsZW5ndGggYXMgZGVzY3JpYmVkIGluIHBvaW50IDMgYWJvdmUuIChPZgorICogY291cnNlLCB0aGVyZSBjYW4gYmUgc2V2ZXJhbCBydW5saXN0IGVudHJpZXMgd2l0aCBzbWFsbCBsZW5ndGhzIHNvIHRoYXQgdGhlCisgKiBzcGFyc2UgZW50cnkgZG9lcyBub3QgZm9sbG93IHRoZSBmaXJzdCBkYXRhIGNvbnRhaW5pbmcgZW50cnkgd2l0aAorICogbGVuZ3RoIDwgWC4pCisgKgorICogTk9URTogQXQgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBhdHRyaWJ1dGUgdmFsdWUsIHRoZXJlIG1vc3QgbGlrZWx5IGlzIG5vdAorICoganVzdCB0aGUgcmlnaHQgYW1vdW50IG9mIGRhdGEgdG8gbWFrZSB1cCBhIGNvbXByZXNzaW9uIGJsb2NrLCB0aHVzIHRoaXMgZGF0YQorICogaXMgbm90IGV2ZW4gYXR0ZW1wdGVkIHRvIGJlIGNvbXByZXNzZWQuIEl0IGlzIGp1c3Qgc3RvcmVkIGFzIGlzLCB1bmxlc3MKKyAqIHRoZSBudW1iZXIgb2YgY2x1c3RlcnMgaXQgb2NjdXBpZXMgaXMgcmVkdWNlZCB3aGVuIGNvbXByZXNzZWQgaW4gd2hpY2ggY2FzZQorICogaXQgaXMgc3RvcmVkIGFzIGEgY29tcHJlc3NlZCBjb21wcmVzc2lvbiBibG9jaywgY29tcGxldGUgd2l0aCBzcGFyc2UKKyAqIGNsdXN0ZXJzIGF0IHRoZSBlbmQuCisgKi8KKworLyoKKyAqIEZsYWdzIG9mIHJlc2lkZW50IGF0dHJpYnV0ZXMgKDgtYml0KS4KKyAqLworZW51bSB7CisJUkVTSURFTlRfQVRUUl9JU19JTkRFWEVEID0gMHgwMSwgLyogQXR0cmlidXRlIGlzIHJlZmVyZW5jZWQgaW4gYW4gaW5kZXgKKwkJCQkJICAgIChoYXMgaW1wbGljYXRpb25zIGZvciBkZWxldGluZyBhbmQKKwkJCQkJICAgIG1vZGlmeWluZyB0aGUgYXR0cmlidXRlKS4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKwordHlwZWRlZiB1OCBSRVNJREVOVF9BVFRSX0ZMQUdTOworCisvKgorICogQXR0cmlidXRlIHJlY29yZCBoZWFkZXIuIEFsd2F5cyBhbGlnbmVkIHRvIDgtYnl0ZSBib3VuZGFyeS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworLypPZnMqLworLyogIDAqLwlBVFRSX1RZUEUgdHlwZTsJCS8qIFRoZSAoMzItYml0KSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUuICovCisvKiAgNCovCWxlMzIgbGVuZ3RoOwkJLyogQnl0ZSBzaXplIG9mIHRoZSByZXNpZGVudCBwYXJ0IG9mIHRoZQorCQkJCSAgIGF0dHJpYnV0ZSAoYWxpZ25lZCB0byA4LWJ5dGUgYm91bmRhcnkpLgorCQkJCSAgIFVzZWQgdG8gZ2V0IHRvIHRoZSBuZXh0IGF0dHJpYnV0ZS4gKi8KKy8qICA4Ki8JdTggbm9uX3Jlc2lkZW50OwkvKiBJZiAwLCBhdHRyaWJ1dGUgaXMgcmVzaWRlbnQuCisJCQkJICAgSWYgMSwgYXR0cmlidXRlIGlzIG5vbi1yZXNpZGVudC4gKi8KKy8qICA5Ki8JdTggbmFtZV9sZW5ndGg7CQkvKiBVbmljb2RlIGNoYXJhY3RlciBzaXplIG9mIG5hbWUgb2YgYXR0cmlidXRlLgorCQkJCSAgIDAgaWYgdW5uYW1lZC4gKi8KKy8qIDEwKi8JbGUxNiBuYW1lX29mZnNldDsJLyogSWYgbmFtZV9sZW5ndGggIT0gMCwgdGhlIGJ5dGUgb2Zmc2V0IHRvIHRoZQorCQkJCSAgIGJlZ2lubmluZyBvZiB0aGUgbmFtZSBmcm9tIHRoZSBhdHRyaWJ1dGUKKwkJCQkgICByZWNvcmQuIE5vdGUgdGhhdCB0aGUgbmFtZSBpcyBzdG9yZWQgYXMgYQorCQkJCSAgIFVuaWNvZGUgc3RyaW5nLiBXaGVuIGNyZWF0aW5nLCBwbGFjZSBvZmZzZXQKKwkJCQkgICBqdXN0IGF0IHRoZSBlbmQgb2YgdGhlIHJlY29yZCBoZWFkZXIuIFRoZW4sCisJCQkJICAgZm9sbG93IHdpdGggYXR0cmlidXRlIHZhbHVlIG9yIG1hcHBpbmcgcGFpcnMKKwkJCQkgICBhcnJheSwgcmVzaWRlbnQgYW5kIG5vbi1yZXNpZGVudCBhdHRyaWJ1dGVzCisJCQkJICAgcmVzcGVjdGl2ZWx5LCBhbGlnbmluZyB0byBhbiA4LWJ5dGUKKwkJCQkgICBib3VuZGFyeS4gKi8KKy8qIDEyKi8JQVRUUl9GTEFHUyBmbGFnczsJLyogRmxhZ3MgZGVzY3JpYmluZyB0aGUgYXR0cmlidXRlLiAqLworLyogMTQqLwlsZTE2IGluc3RhbmNlOwkJLyogVGhlIGluc3RhbmNlIG9mIHRoaXMgYXR0cmlidXRlIHJlY29yZC4gVGhpcworCQkJCSAgIG51bWJlciBpcyB1bmlxdWUgd2l0aGluIHRoaXMgbWZ0IHJlY29yZCAoc2VlCisJCQkJICAgTUZUX1JFQ09SRC9uZXh0X2F0dHJpYnV0ZV9pbnN0YW5jZSBub3RlcyBpbgorCQkJCSAgIGluIG1mdC5oIGZvciBtb3JlIGRldGFpbHMpLiAqLworLyogMTYqLwl1bmlvbiB7CisJCS8qIFJlc2lkZW50IGF0dHJpYnV0ZXMuICovCisJCXN0cnVjdCB7CisvKiAxNiAqLwkJbGUzMiB2YWx1ZV9sZW5ndGg7LyogQnl0ZSBzaXplIG9mIGF0dHJpYnV0ZSB2YWx1ZS4gKi8KKy8qIDIwICovCQlsZTE2IHZhbHVlX29mZnNldDsvKiBCeXRlIG9mZnNldCBvZiB0aGUgYXR0cmlidXRlCisJCQkJCSAgICAgdmFsdWUgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCisJCQkJCSAgICAgYXR0cmlidXRlIHJlY29yZC4gV2hlbiBjcmVhdGluZywKKwkJCQkJICAgICBhbGlnbiB0byA4LWJ5dGUgYm91bmRhcnkgaWYgd2UKKwkJCQkJICAgICBoYXZlIGEgbmFtZSBwcmVzZW50IGFzIHRoaXMgbWlnaHQKKwkJCQkJICAgICBub3QgaGF2ZSBhIGxlbmd0aCBvZiBhIG11bHRpcGxlCisJCQkJCSAgICAgb2YgOC1ieXRlcy4gKi8KKy8qIDIyICovCQlSRVNJREVOVF9BVFRSX0ZMQUdTIGZsYWdzOyAvKiBTZWUgYWJvdmUuICovCisvKiAyMyAqLwkJczggcmVzZXJ2ZWQ7CSAgLyogUmVzZXJ2ZWQvYWxpZ25tZW50IHRvIDgtYnl0ZQorCQkJCQkgICAgIGJvdW5kYXJ5LiAqLworCQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgcmVzaWRlbnQ7CisJCS8qIE5vbi1yZXNpZGVudCBhdHRyaWJ1dGVzLiAqLworCQlzdHJ1Y3QgeworLyogMTYqLwkJCWxlVkNOIGxvd2VzdF92Y247LyogTG93ZXN0IHZhbGlkIHZpcnR1YWwgY2x1c3RlciBudW1iZXIKKwkJCQlmb3IgdGhpcyBwb3J0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb3IKKwkJCQkwIGlmIHRoaXMgaXMgdGhlIG9ubHkgZXh0ZW50ICh1c3VhbGx5IHRoZQorCQkJCWNhc2UpLiAtIE9ubHkgd2hlbiBhbiBhdHRyaWJ1dGUgbGlzdCBpcyB1c2VkCisJCQkJZG9lcyBsb3dlc3RfdmNuICE9IDAgZXZlciBvY2N1ci4gKi8KKy8qIDI0Ki8JCQlsZVZDTiBoaWdoZXN0X3ZjbjsvKiBIaWdoZXN0IHZhbGlkIHZjbiBvZiB0aGlzIGV4dGVudCBvZgorCQkJCXRoZSBhdHRyaWJ1dGUgdmFsdWUuIC0gVXN1YWxseSB0aGVyZSBpcyBvbmx5IG9uZQorCQkJCXBvcnRpb24sIHNvIHRoaXMgdXN1YWxseSBlcXVhbHMgdGhlIGF0dHJpYnV0ZQorCQkJCXZhbHVlIHNpemUgaW4gY2x1c3RlcnMgbWludXMgMS4gQ2FuIGJlIC0xIGZvcgorCQkJCXplcm8gbGVuZ3RoIGZpbGVzLiBDYW4gYmUgMCBmb3IgInNpbmdsZSBleHRlbnQiCisJCQkJYXR0cmlidXRlcy4gKi8KKy8qIDMyKi8JCQlsZTE2IG1hcHBpbmdfcGFpcnNfb2Zmc2V0OyAvKiBCeXRlIG9mZnNldCBmcm9tIHRoZQorCQkJCWJlZ2lubmluZyBvZiB0aGUgc3RydWN0dXJlIHRvIHRoZSBtYXBwaW5nIHBhaXJzCisJCQkJYXJyYXkgd2hpY2ggY29udGFpbnMgdGhlIG1hcHBpbmdzIGJldHdlZW4gdGhlCisJCQkJdmNucyBhbmQgdGhlIGxvZ2ljYWwgY2x1c3RlciBudW1iZXJzIChsY25zKS4KKwkJCQlXaGVuIGNyZWF0aW5nLCBwbGFjZSB0aGlzIGF0IHRoZSBlbmQgb2YgdGhpcworCQkJCXJlY29yZCBoZWFkZXIgYWxpZ25lZCB0byA4LWJ5dGUgYm91bmRhcnkuICovCisvKiAzNCovCQkJdTggY29tcHJlc3Npb25fdW5pdDsgLyogVGhlIGNvbXByZXNzaW9uIHVuaXQgZXhwcmVzc2VkCisJCQkJYXMgdGhlIGxvZyB0byB0aGUgYmFzZSAyIG9mIHRoZSBudW1iZXIgb2YKKwkJCQljbHVzdGVycyBpbiBhIGNvbXByZXNzaW9uIHVuaXQuIDAgbWVhbnMgbm90CisJCQkJY29tcHJlc3NlZC4gKFRoaXMgZWZmZWN0aXZlbHkgbGltaXRzIHRoZQorCQkJCWNvbXByZXNzaW9uIHVuaXQgc2l6ZSB0byBiZSBhIHBvd2VyIG9mIHR3bworCQkJCWNsdXN0ZXJzLikgV2luTlQ0IG9ubHkgdXNlcyBhIHZhbHVlIG9mIDQuICovCisvKiAzNSovCQkJdTggcmVzZXJ2ZWRbNV07CQkvKiBBbGlnbiB0byA4LWJ5dGUgYm91bmRhcnkuICovCisvKiBUaGUgc2l6ZXMgYmVsb3cgYXJlIG9ubHkgdXNlZCB3aGVuIGxvd2VzdF92Y24gaXMgemVybywgYXMgb3RoZXJ3aXNlIGl0IHdvdWxkCisgICBiZSBkaWZmaWN1bHQgdG8ga2VlcCB0aGVtIHVwLXRvLWRhdGUuKi8KKy8qIDQwKi8JCQlzbGU2NCBhbGxvY2F0ZWRfc2l6ZTsJLyogQnl0ZSBzaXplIG9mIGRpc2sgc3BhY2UKKwkJCQlhbGxvY2F0ZWQgdG8gaG9sZCB0aGUgYXR0cmlidXRlIHZhbHVlLiBBbHdheXMKKwkJCQlpcyBhIG11bHRpcGxlIG9mIHRoZSBjbHVzdGVyIHNpemUuIFdoZW4gYSBmaWxlCisJCQkJaXMgY29tcHJlc3NlZCwgdGhpcyBmaWVsZCBpcyBhIG11bHRpcGxlIG9mIHRoZQorCQkJCWNvbXByZXNzaW9uIGJsb2NrIHNpemUgKDJeY29tcHJlc3Npb25fdW5pdCkgYW5kCisJCQkJaXQgcmVwcmVzZW50cyB0aGUgbG9naWNhbGx5IGFsbG9jYXRlZCBzcGFjZQorCQkJCXJhdGhlciB0aGFuIHRoZSBhY3R1YWwgb24gZGlzayB1c2FnZS4gRm9yIHRoaXMKKwkJCQl1c2UgdGhlIGNvbXByZXNzZWRfc2l6ZSAoc2VlIGJlbG93KS4gKi8KKy8qIDQ4Ki8JCQlzbGU2NCBkYXRhX3NpemU7CS8qIEJ5dGUgc2l6ZSBvZiB0aGUgYXR0cmlidXRlCisJCQkJdmFsdWUuIENhbiBiZSBsYXJnZXIgdGhhbiBhbGxvY2F0ZWRfc2l6ZSBpZgorCQkJCWF0dHJpYnV0ZSB2YWx1ZSBpcyBjb21wcmVzc2VkIG9yIHNwYXJzZS4gKi8KKy8qIDU2Ki8JCQlzbGU2NCBpbml0aWFsaXplZF9zaXplOwkvKiBCeXRlIHNpemUgb2YgaW5pdGlhbGl6ZWQKKwkJCQlwb3J0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUuIFVzdWFsbHkgZXF1YWxzCisJCQkJZGF0YV9zaXplLiAqLworLyogc2l6ZW9mKHVuY29tcHJlc3NlZCBhdHRyKSA9IDY0Ki8KKy8qIDY0Ki8JCQlzbGU2NCBjb21wcmVzc2VkX3NpemU7CS8qIEJ5dGUgc2l6ZSBvZiB0aGUgYXR0cmlidXRlCisJCQkJdmFsdWUgYWZ0ZXIgY29tcHJlc3Npb24uIE9ubHkgcHJlc2VudCB3aGVuCisJCQkJY29tcHJlc3NlZC4gQWx3YXlzIGlzIGEgbXVsdGlwbGUgb2YgdGhlCisJCQkJY2x1c3RlciBzaXplLiBSZXByZXNlbnRzIHRoZSBhY3R1YWwgYW1vdW50IG9mCisJCQkJZGlzayBzcGFjZSBiZWluZyB1c2VkIG9uIHRoZSBkaXNrLiAqLworLyogc2l6ZW9mKGNvbXByZXNzZWQgYXR0cikgPSA3MiovCisJCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBub25fcmVzaWRlbnQ7CisJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIGRhdGE7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgQVRUUl9SRUNPUkQ7CisKK3R5cGVkZWYgQVRUUl9SRUNPUkQgQVRUUl9SRUM7CisKKy8qCisgKiBGaWxlIGF0dHJpYnV0ZSBmbGFncyAoMzItYml0KS4KKyAqLworZW51bSB7CisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGZsYWdzIGFyZSBvbmx5IHByZXNlbnQgaW4gdGhlIFNUQU5EQVJEX0lORk9STUFUSU9OCisJICogYXR0cmlidXRlIChpbiB0aGUgZmllbGQgZmlsZV9hdHRyaWJ1dGVzKS4KKwkgKi8KKwlGSUxFX0FUVFJfUkVBRE9OTFkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMSksCisJRklMRV9BVFRSX0hJRERFTgkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDAyKSwKKwlGSUxFX0FUVFJfU1lTVEVNCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDQpLAorCS8qIE9sZCBET1Mgdm9saWQuIFVudXNlZCBpbiBOVC4JPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDA4KSwgKi8KKworCUZJTEVfQVRUUl9ESVJFQ1RPUlkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAxMCksCisJLyogTm90ZSwgRklMRV9BVFRSX0RJUkVDVE9SWSBpcyBub3QgY29uc2lkZXJlZCB2YWxpZCBpbiBOVC4gIEl0IGlzCisJICAgcmVzZXJ2ZWQgZm9yIHRoZSBET1MgU1VCRElSRUNUT1JZIGZsYWcuICovCisJRklMRV9BVFRSX0FSQ0hJVkUJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAyMCksCisJRklMRV9BVFRSX0RFVklDRQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDQwKSwKKwlGSUxFX0FUVFJfTk9STUFMCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwODApLAorCisJRklMRV9BVFRSX1RFTVBPUkFSWQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMTAwKSwKKwlGSUxFX0FUVFJfU1BBUlNFX0ZJTEUJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDIwMCksCisJRklMRV9BVFRSX1JFUEFSU0VfUE9JTlQJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDQwMCksCisJRklMRV9BVFRSX0NPTVBSRVNTRUQJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDgwMCksCisKKwlGSUxFX0FUVFJfT0ZGTElORQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAxMDAwKSwKKwlGSUxFX0FUVFJfTk9UX0NPTlRFTlRfSU5ERVhFRAk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDIwMDApLAorCUZJTEVfQVRUUl9FTkNSWVBURUQJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwNDAwMCksCisKKwlGSUxFX0FUVFJfVkFMSURfRkxBR1MJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwN2ZiNyksCisJLyogTm90ZSwgRklMRV9BVFRSX1ZBTElEX0ZMQUdTIG1hc2tzIG91dCB0aGUgb2xkIERPUyBWb2xJZCBhbmQgdGhlCisJICAgRklMRV9BVFRSX0RFVklDRSBhbmQgcHJlc2VydmVzIGV2ZXJ5dGhpbmcgZWxzZS4gIFRoaXMgbWFzayBpcyB1c2VkCisJICAgdG8gb2J0YWluIGFsbCBmbGFncyB0aGF0IGFyZSB2YWxpZCBmb3IgcmVhZGluZy4gKi8KKwlGSUxFX0FUVFJfVkFMSURfU0VUX0ZMQUdTCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMzFhNyksCisJLyogTm90ZSwgRklMRV9BVFRSX1ZBTElEX1NFVF9GTEFHUyBtYXNrcyBvdXQgdGhlIG9sZCBET1MgVm9sSWQsIHRoZQorCSAgIEZfQV9ERVZJQ0UsIEZfQV9ESVJFQ1RPUlksIEZfQV9TUEFSU0VfRklMRSwgRl9BX1JFUEFSU0VfUE9JTlQsCisJICAgRl9BX0NPTVBSRVNTRUQsIGFuZCBGX0FfRU5DUllQVEVEIGFuZCBwcmVzZXJ2ZXMgdGhlIHJlc3QuICBUaGlzIG1hc2sKKwkgICBpcyB1c2VkIHRvIHRvIG9idGFpbiBhbGwgZmxhZ3MgdGhhdCBhcmUgdmFsaWQgZm9yIHNldHRpbmcuICovCisKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgZmxhZ3MgYXJlIG9ubHkgcHJlc2VudCBpbiB0aGUgRklMRV9OQU1FIGF0dHJpYnV0ZSAoaW4KKwkgKiB0aGUgZmllbGQgZmlsZV9hdHRyaWJ1dGVzKS4KKwkgKi8KKwlGSUxFX0FUVFJfRFVQX0ZJTEVfTkFNRV9JTkRFWF9QUkVTRU5UCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgxMDAwMDAwMCksCisJLyogTm90ZSwgdGhpcyBpcyBhIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGZyb20gdGhlIG1mdCByZWNvcmQsCisJICAgdGVsbGluZyB1cyB3aGV0aGVyIHRoaXMgaXMgYSBkaXJlY3Rvcnkgb3Igbm90LCBpLmUuIHdoZXRoZXIgaXQgaGFzCisJICAgYW4gaW5kZXggcm9vdCBhdHRyaWJ1dGUgb3Igbm90LiAqLworCUZJTEVfQVRUUl9EVVBfVklFV19JTkRFWF9QUkVTRU5UCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgyMDAwMDAwMCksCisJLyogTm90ZSwgdGhpcyBpcyBhIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGZyb20gdGhlIG1mdCByZWNvcmQsCisJICAgdGVsbGluZyB1cyB3aGV0aGVyIHRoaXMgZmlsZSBoYXMgYSB2aWV3IGluZGV4IHByZXNlbnQgKGVnLiBvYmplY3QgaWQKKwkgICBpbmRleCwgcXVvdGEgaW5kZXgsIG9uZSBvZiB0aGUgc2VjdXJpdHkgaW5kZXhlcyBvciB0aGUgZW5jcnlwdGluZworCSAgIGZpbGUgc3lzdGVtIHJlbGF0ZWQgaW5kZXhlcykuICovCit9OworCit0eXBlZGVmIGxlMzIgRklMRV9BVFRSX0ZMQUdTOworCisvKgorICogTk9URSBvbiB0aW1lcyBpbiBOVEZTOiBBbGwgdGltZXMgYXJlIGluIE1TIHN0YW5kYXJkIHRpbWUgZm9ybWF0LCBpLmUuIHRoZXkKKyAqIGFyZSB0aGUgbnVtYmVyIG9mIDEwMC1uYW5vc2Vjb25kIGludGVydmFscyBzaW5jZSAxc3QgSmFudWFyeSAxNjAxLCAwMDowMDowMAorICogdW5pdmVyc2FsIGNvb3JkaW5hdGVkIHRpbWUgKFVUQykuIChJbiBMaW51eCB0aW1lIHN0YXJ0cyAxc3QgSmFudWFyeSAxOTcwLAorICogMDA6MDA6MDAgVVRDIGFuZCBpcyBzdG9yZWQgYXMgdGhlIG51bWJlciBvZiAxLXNlY29uZCBpbnRlcnZhbHMgc2luY2UgdGhlbi4pCisgKi8KKworLyoKKyAqIEF0dHJpYnV0ZTogU3RhbmRhcmQgaW5mb3JtYXRpb24gKDB4MTApLgorICoKKyAqIE5PVEU6IEFsd2F5cyByZXNpZGVudC4KKyAqIE5PVEU6IFByZXNlbnQgaW4gYWxsIGJhc2UgZmlsZSByZWNvcmRzIG9uIGEgdm9sdW1lLgorICogTk9URTogVGhlcmUgaXMgY29uZmxpY3RpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lYW5pbmcgb2YgZWFjaCBvZiB0aGUgdGltZQorICoJIGZpZWxkcyBidXQgdGhlIG1lYW5pbmcgYXMgZGVmaW5lZCBiZWxvdyBoYXMgYmVlbiB2ZXJpZmllZCB0byBiZQorICoJIGNvcnJlY3QgYnkgcHJhY3RpY2FsIGV4cGVyaW1lbnRhdGlvbiBvbiBXaW5kb3dzIE5UNCBTUDZhIGFuZCBpcyBoZW5jZQorICoJIGFzc3VtZWQgdG8gYmUgdGhlIG9uZSBhbmQgb25seSBjb3JyZWN0IGludGVycHJldGF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisvKk9mcyovCisvKiAgMCovCXNsZTY0IGNyZWF0aW9uX3RpbWU7CQkvKiBUaW1lIGZpbGUgd2FzIGNyZWF0ZWQuIFVwZGF0ZWQgd2hlbgorCQkJCQkgICBhIGZpbGVuYW1lIGlzIGNoYW5nZWQoPykuICovCisvKiAgOCovCXNsZTY0IGxhc3RfZGF0YV9jaGFuZ2VfdGltZTsJLyogVGltZSB0aGUgZGF0YSBhdHRyaWJ1dGUgd2FzIGxhc3QKKwkJCQkJICAgbW9kaWZpZWQuICovCisvKiAxNiovCXNsZTY0IGxhc3RfbWZ0X2NoYW5nZV90aW1lOwkvKiBUaW1lIHRoaXMgbWZ0IHJlY29yZCB3YXMgbGFzdAorCQkJCQkgICBtb2RpZmllZC4gKi8KKy8qIDI0Ki8Jc2xlNjQgbGFzdF9hY2Nlc3NfdGltZTsJCS8qIEFwcHJveGltYXRlIHRpbWUgd2hlbiB0aGUgZmlsZSB3YXMKKwkJCQkJICAgbGFzdCBhY2Nlc3NlZCAob2J2aW91c2x5IHRoaXMgaXMgbm90CisJCQkJCSAgIHVwZGF0ZWQgb24gcmVhZC1vbmx5IHZvbHVtZXMpLiBJbgorCQkJCQkgICBXaW5kb3dzIHRoaXMgaXMgb25seSB1cGRhdGVkIHdoZW4KKwkJCQkJICAgYWNjZXNzZWQgaWYgc29tZSB0aW1lIGRlbHRhIGhhcworCQkJCQkgICBwYXNzZWQgc2luY2UgdGhlIGxhc3QgdXBkYXRlLiBBbHNvLAorCQkJCQkgICBsYXN0IGFjY2VzcyB0aW1lcyB1cGRhdGVzIGNhbiBiZQorCQkJCQkgICBkaXNhYmxlZCBhbHRvZ2V0aGVyIGZvciBzcGVlZC4gKi8KKy8qIDMyKi8JRklMRV9BVFRSX0ZMQUdTIGZpbGVfYXR0cmlidXRlczsgLyogRmxhZ3MgZGVzY3JpYmluZyB0aGUgZmlsZS4gKi8KKy8qIDM2Ki8JdW5pb24geworCS8qIE5URlMgMS4yICovCisJCXN0cnVjdCB7CisJCS8qIDM2Ki8JdTggcmVzZXJ2ZWQxMlsxMl07CS8qIFJlc2VydmVkL2FsaWdubWVudCB0byA4LWJ5dGUKKwkJCQkJCSAgIGJvdW5kYXJ5LiAqLworCQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdjE7CisJLyogc2l6ZW9mKCkgPSA0OCBieXRlcyAqLworCS8qIE5URlMgMy54ICovCisJCXN0cnVjdCB7CisvKgorICogSWYgYSB2b2x1bWUgaGFzIGJlZW4gdXBncmFkZWQgZnJvbSBhIHByZXZpb3VzIE5URlMgdmVyc2lvbiwgdGhlbiB0aGVzZQorICogZmllbGRzIGFyZSBwcmVzZW50IG9ubHkgaWYgdGhlIGZpbGUgaGFzIGJlZW4gYWNjZXNzZWQgc2luY2UgdGhlIHVwZ3JhZGUuCisgKiBSZWNvZ25pemUgdGhlIGRpZmZlcmVuY2UgYnkgY29tcGFyaW5nIHRoZSBsZW5ndGggb2YgdGhlIHJlc2lkZW50IGF0dHJpYnV0ZQorICogdmFsdWUuIElmIGl0IGlzIDQ4LCB0aGVuIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBtaXNzaW5nLiBJZiBpdCBpcyA3MiB0aGVuCisgKiB0aGUgZmllbGRzIGFyZSBwcmVzZW50LiBNYXliZSBqdXN0IGNoZWNrIGxpa2UgdGhpczoKKyAqCWlmIChyZXNpZGVudC5WYWx1ZUxlbmd0aCA8IHNpemVvZihTVEFOREFSRF9JTkZPUk1BVElPTikpIHsKKyAqCQlBc3N1bWUgTlRGUyAxLjItIGZvcm1hdC4KKyAqCQlJZiAodm9sdW1lIHZlcnNpb24gaXMgMy54KQorICoJCQlVcGdyYWRlIGF0dHJpYnV0ZSB0byBOVEZTIDMueCBmb3JtYXQuCisgKgkJZWxzZQorICoJCQlVc2UgTlRGUyAxLjItIGZvcm1hdCBmb3IgYWNjZXNzLgorICoJfSBlbHNlCisgKgkJVXNlIE5URlMgMy54IGZvcm1hdCBmb3IgYWNjZXNzLgorICogT25seSBwcm9ibGVtIGlzIHRoYXQgaXQgbWlnaHQgYmUgbGVnYWwgdG8gc2V0IHRoZSBsZW5ndGggb2YgdGhlIHZhbHVlIHRvCisgKiBhcmJpdHJhcmlseSBsYXJnZSB2YWx1ZXMgdGh1cyBzcG9pbGluZyB0aGlzIGNoZWNrLiAtIEJ1dCBjaGtkc2sgcHJvYmFibHkKKyAqIHZpZXdzIHRoYXQgYXMgYSBjb3JydXB0aW9uLCBhc3N1bWluZyB0aGF0IGl0IGJlaGF2ZXMgbGlrZSB0aGlzIGZvciBhbGwKKyAqIGF0dHJpYnV0ZXMuCisgKi8KKwkJLyogMzYqLwlsZTMyIG1heGltdW1fdmVyc2lvbnM7CS8qIE1heGltdW0gYWxsb3dlZCB2ZXJzaW9ucyBmb3IKKwkJCQlmaWxlLiBaZXJvIGlmIHZlcnNpb24gbnVtYmVyaW5nIGlzIGRpc2FibGVkLiAqLworCQkvKiA0MCovCWxlMzIgdmVyc2lvbl9udW1iZXI7CS8qIFRoaXMgZmlsZSdzIHZlcnNpb24gKGlmIGFueSkuCisJCQkJU2V0IHRvIHplcm8gaWYgbWF4aW11bV92ZXJzaW9ucyBpcyB6ZXJvLiAqLworCQkvKiA0NCovCWxlMzIgY2xhc3NfaWQ7CQkvKiBDbGFzcyBpZCBmcm9tIGJpZGlyZWN0aW9uYWwKKwkJCQljbGFzcyBpZCBpbmRleCAoPykuICovCisJCS8qIDQ4Ki8JbGUzMiBvd25lcl9pZDsJCS8qIE93bmVyX2lkIG9mIHRoZSB1c2VyIG93bmluZworCQkJCXRoZSBmaWxlLiBUcmFuc2xhdGUgdmlhICRRIGluZGV4IGluIEZJTEVfRXh0ZW5kCisJCQkJLyRRdW90YSB0byB0aGUgcXVvdGEgY29udHJvbCBlbnRyeSBmb3IgdGhlIHVzZXIKKwkJCQlvd25pbmcgdGhlIGZpbGUuIFplcm8gaWYgcXVvdGFzIGFyZSBkaXNhYmxlZC4gKi8KKwkJLyogNTIqLwlsZTMyIHNlY3VyaXR5X2lkOwkvKiBTZWN1cml0eV9pZCBmb3IgdGhlIGZpbGUuCisJCQkJVHJhbnNsYXRlIHZpYSAkU0lJIGluZGV4IGFuZCAkU0RTIGRhdGEgc3RyZWFtCisJCQkJaW4gRklMRV9TZWN1cmUgdG8gdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3IuICovCisJCS8qIDU2Ki8JbGU2NCBxdW90YV9jaGFyZ2VkOwkvKiBCeXRlIHNpemUgb2YgdGhlIGNoYXJnZSB0bworCQkJCXRoZSBxdW90YSBmb3IgYWxsIHN0cmVhbXMgb2YgdGhlIGZpbGUuIE5vdGU6IElzCisJCQkJemVybyBpZiBxdW90YXMgYXJlIGRpc2FibGVkLiAqLworCQkvKiA2NCovCWxlNjQgdXNuOwkJLyogTGFzdCB1cGRhdGUgc2VxdWVuY2UgbnVtYmVyCisJCQkJb2YgdGhlIGZpbGUuIFRoaXMgaXMgYSBkaXJlY3QgaW5kZXggaW50byB0aGUKKwkJCQljaGFuZ2UgKGFrYSB1c24pIGpvdXJuYWwgZmlsZS4gSXQgaXMgemVybyBpZgorCQkJCXRoZSB1c24gam91cm5hbCBpcyBkaXNhYmxlZC4KKwkJCQlOT1RFOiBUbyBkaXNhYmxlIHRoZSBqb3VybmFsIG5lZWQgdG8gZGVsZXRlCisJCQkJdGhlIGpvdXJuYWwgZmlsZSBpdHNlbGYgYW5kIHRvIHRoZW4gd2FsayB0aGUKKwkJCQl3aG9sZSBtZnQgYW5kIHNldCBhbGwgVXNuIGVudHJpZXMgaW4gYWxsIG1mdAorCQkJCXJlY29yZHMgdG8gemVybyEgKFRoaXMgY2FuIHRha2UgYSB3aGlsZSEpCisJCQkJVGhlIGpvdXJuYWwgaXMgRklMRV9FeHRlbmQvJFVzbkpybmwuIFdpbjJrCisJCQkJd2lsbCByZWNyZWF0ZSB0aGUgam91cm5hbCBhbmQgaW5pdGlhdGUKKwkJCQlsb2dnaW5nIGlmIG5lY2Vzc2FyeSB3aGVuIG1vdW50aW5nIHRoZQorCQkJCXBhcnRpdGlvbi4gVGhpcywgaW4gY29udHJhc3QgdG8gZGlzYWJsaW5nIHRoZQorCQkJCWpvdXJuYWwgaXMgYSB2ZXJ5IGZhc3QgcHJvY2Vzcywgc28gdGhlIHVzZXIKKwkJCQl3b24ndCBldmVuIG5vdGljZSBpdC4gKi8KKwkJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHYzOworCS8qIHNpemVvZigpID0gNzIgYnl0ZXMgKE5URlMgMy54KSAqLworCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSB2ZXI7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgU1RBTkRBUkRfSU5GT1JNQVRJT047CisKKy8qCisgKiBBdHRyaWJ1dGU6IEF0dHJpYnV0ZSBsaXN0ICgweDIwKS4KKyAqCisgKiAtIENhbiBiZSBlaXRoZXIgcmVzaWRlbnQgb3Igbm9uLXJlc2lkZW50LgorICogLSBWYWx1ZSBjb25zaXN0cyBvZiBhIHNlcXVlbmNlIG9mIHZhcmlhYmxlIGxlbmd0aCwgOC1ieXRlIGFsaWduZWQsCisgKiBBVFRSX0xJU1RfRU5UUlkgcmVjb3Jkcy4KKyAqIC0gVGhlIGxpc3QgaXMgbm90IHRlcm1pbmF0ZWQgYnkgYW55dGhpbmcgYXQgYWxsISBUaGUgb25seSB3YXkgdG8ga25vdyB3aGVuCisgKiB0aGUgZW5kIGlzIHJlYWNoZWQgaXMgdG8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBvZmZzZXQgYW5kIGNvbXBhcmUgaXQgdG8KKyAqIHRoZSBhdHRyaWJ1dGUgdmFsdWUgc2l6ZS4KKyAqIC0gVGhlIGF0dHJpYnV0ZSBsaXN0IGF0dHJpYnV0ZSBjb250YWlucyBvbmUgZW50cnkgZm9yIGVhY2ggYXR0cmlidXRlIG9mCisgKiB0aGUgZmlsZSBpbiB3aGljaCB0aGUgbGlzdCBpcyBsb2NhdGVkLCBleGNlcHQgZm9yIHRoZSBsaXN0IGF0dHJpYnV0ZQorICogaXRzZWxmLiBUaGUgbGlzdCBpcyBzb3J0ZWQ6IGZpcnN0IGJ5IGF0dHJpYnV0ZSB0eXBlLCBzZWNvbmQgYnkgYXR0cmlidXRlCisgKiBuYW1lIChpZiBwcmVzZW50KSwgdGhpcmQgYnkgaW5zdGFuY2UgbnVtYmVyLiBUaGUgZXh0ZW50cyBvZiBvbmUKKyAqIG5vbi1yZXNpZGVudCBhdHRyaWJ1dGUgKGlmIHByZXNlbnQpIGltbWVkaWF0ZWx5IGZvbGxvdyBhZnRlciB0aGUgaW5pdGlhbAorICogZXh0ZW50LiBUaGV5IGFyZSBvcmRlcmVkIGJ5IGxvd2VzdF92Y24gYW5kIGhhdmUgdGhlaXIgaW5zdGFjZSBzZXQgdG8gemVyby4KKyAqIEl0IGlzIG5vdCBhbGxvd2VkIHRvIGhhdmUgdHdvIGF0dHJpYnV0ZXMgd2l0aCBhbGwgc29ydGluZyBrZXlzIGVxdWFsLgorICogLSBGdXJ0aGVyIHJlc3RyaWN0aW9uczoKKyAqCS0gSWYgbm90IHJlc2lkZW50LCB0aGUgdmNuIHRvIGxjbiBtYXBwaW5nIGFycmF5IGhhcyB0byBmaXQgaW5zaWRlIHRoZQorICoJICBiYXNlIG1mdCByZWNvcmQuCisgKgktIFRoZSBhdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgdmFsdWUgaGFzIGEgbWF4aW11bSBzaXplIG9mIDI1NmtiLiBUaGlzCisgKgkgIGlzIGltcG9zZWQgYnkgdGhlIFdpbmRvd3MgY2FjaGUgbWFuYWdlci4KKyAqIC0gQXR0cmlidXRlIGxpc3RzIGFyZSBvbmx5IHVzZWQgd2hlbiB0aGUgYXR0cmlidXRlcyBvZiBtZnQgcmVjb3JkIGRvIG5vdAorICogZml0IGluc2lkZSB0aGUgbWZ0IHJlY29yZCBkZXNwaXRlIGFsbCBhdHRyaWJ1dGVzICh0aGF0IGNhbiBiZSBtYWRlCisgKiBub24tcmVzaWRlbnQpIGhhdmluZyBiZWVuIG1hZGUgbm9uLXJlc2lkZW50LiBUaGlzIGNhbiBoYXBwZW4gZS5nLiB3aGVuOgorICoJLSBGaWxlIGhhcyBhIGxhcmdlIG51bWJlciBvZiBoYXJkIGxpbmtzIChsb3RzIG9mIGZpbGUgbmFtZQorICoJICBhdHRyaWJ1dGVzIHByZXNlbnQpLgorICoJLSBUaGUgbWFwcGluZyBwYWlycyBhcnJheSBvZiBzb21lIG5vbi1yZXNpZGVudCBhdHRyaWJ1dGUgYmVjb21lcyBzbworICoJICBsYXJnZSBkdWUgdG8gZnJhZ21lbnRhdGlvbiB0aGF0IGl0IG92ZXJmbG93cyB0aGUgbWZ0IHJlY29yZC4KKyAqCS0gVGhlIHNlY3VyaXR5IGRlc2NyaXB0b3IgaXMgdmVyeSBjb21wbGV4IChub3QgYXBwbGljYWJsZSB0bworICoJICBOVEZTIDMuMCB2b2x1bWVzKS4KKyAqCS0gVGhlcmUgYXJlIG1hbnkgbmFtZWQgc3RyZWFtcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworLypPZnMqLworLyogIDAqLwlBVFRSX1RZUEUgdHlwZTsJCS8qIFR5cGUgb2YgcmVmZXJlbmNlZCBhdHRyaWJ1dGUuICovCisvKiAgNCovCWxlMTYgbGVuZ3RoOwkJLyogQnl0ZSBzaXplIG9mIHRoaXMgZW50cnkgKDgtYnl0ZSBhbGlnbmVkKS4gKi8KKy8qICA2Ki8JdTggbmFtZV9sZW5ndGg7CQkvKiBTaXplIGluIFVuaWNvZGUgY2hhcnMgb2YgdGhlIG5hbWUgb2YgdGhlCisJCQkJICAgYXR0cmlidXRlIG9yIDAgaWYgdW5uYW1lZC4gKi8KKy8qICA3Ki8JdTggbmFtZV9vZmZzZXQ7CQkvKiBCeXRlIG9mZnNldCB0byBiZWdpbm5pbmcgb2YgYXR0cmlidXRlIG5hbWUKKwkJCQkgICAoYWx3YXlzIHNldCB0aGlzIHRvIHdoZXJlIHRoZSBuYW1lIHdvdWxkCisJCQkJICAgc3RhcnQgZXZlbiBpZiB1bm5hbWVkKS4gKi8KKy8qICA4Ki8JbGVWQ04gbG93ZXN0X3ZjbjsJLyogTG93ZXN0IHZpcnR1YWwgY2x1c3RlciBudW1iZXIgb2YgdGhpcyBwb3J0aW9uCisJCQkJICAgb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4gVGhpcyBpcyB1c3VhbGx5IDAuIEl0CisJCQkJICAgaXMgbm9uLXplcm8gZm9yIHRoZSBjYXNlIHdoZXJlIG9uZSBhdHRyaWJ1dGUKKwkJCQkgICBkb2VzIG5vdCBmaXQgaW50byBvbmUgbWZ0IHJlY29yZCBhbmQgdGh1cworCQkJCSAgIHNldmVyYWwgbWZ0IHJlY29yZHMgYXJlIGFsbG9jYXRlZCB0byBob2xkCisJCQkJICAgdGhpcyBhdHRyaWJ1dGUuIEluIHRoZSBsYXR0ZXIgY2FzZSwgZWFjaCBtZnQKKwkJCQkgICByZWNvcmQgaG9sZHMgb25lIGV4dGVudCBvZiB0aGUgYXR0cmlidXRlIGFuZAorCQkJCSAgIHRoZXJlIGlzIG9uZSBhdHRyaWJ1dGUgbGlzdCBlbnRyeSBmb3IgZWFjaAorCQkJCSAgIGV4dGVudC4gTk9URTogVGhpcyBpcyBERUZJTklURUxZIGEgc2lnbmVkCisJCQkJICAgdmFsdWUhIFRoZSB3aW5kb3dzIGRyaXZlciB1c2VzIGNtcCwgZm9sbG93ZWQKKwkJCQkgICBieSBqZyB3aGVuIGNvbXBhcmluZyB0aGlzLCB0aHVzIGl0IHRyZWF0cyBpdAorCQkJCSAgIGFzIHNpZ25lZC4gKi8KKy8qIDE2Ki8JbGVNRlRfUkVGIG1mdF9yZWZlcmVuY2U7LyogVGhlIHJlZmVyZW5jZSBvZiB0aGUgbWZ0IHJlY29yZCBob2xkaW5nCisJCQkJICAgdGhlIEFUVFJfUkVDT1JEIGZvciB0aGlzIHBvcnRpb24gb2YgdGhlCisJCQkJICAgYXR0cmlidXRlIHZhbHVlLiAqLworLyogMjQqLwlsZTE2IGluc3RhbmNlOwkJLyogSWYgbG93ZXN0X3ZjbiA9IDAsIHRoZSBpbnN0YW5jZSBvZiB0aGUKKwkJCQkgICBhdHRyaWJ1dGUgYmVpbmcgcmVmZXJlbmNlZDsgb3RoZXJ3aXNlIDAuICovCisvKiAyNiovCW50ZnNjaGFyIG5hbWVbMF07CS8qIFVzZSB3aGVuIGNyZWF0aW5nIG9ubHkuIFdoZW4gcmVhZGluZyB1c2UKKwkJCQkgICBuYW1lX29mZnNldCB0byBkZXRlcm1pbmUgdGhlIGxvY2F0aW9uIG9mIHRoZQorCQkJCSAgIG5hbWUuICovCisvKiBzaXplb2YoKSA9IDI2ICsgKGF0dHJpYnV0ZV9uYW1lX2xlbmd0aCAqIDIpIGJ5dGVzICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgQVRUUl9MSVNUX0VOVFJZOworCisvKgorICogVGhlIG1heGltdW0gYWxsb3dlZCBsZW5ndGggZm9yIGEgZmlsZSBuYW1lLgorICovCisjZGVmaW5lIE1BWElNVU1fRklMRV9OQU1FX0xFTkdUSAkyNTUKKworLyoKKyAqIFBvc3NpYmxlIG5hbWVzcGFjZXMgZm9yIGZpbGVuYW1lcyBpbiBudGZzICg4LWJpdCkuCisgKi8KK2VudW0geworCUZJTEVfTkFNRV9QT1NJWAkJPSAweDAwLAorCS8qIFRoaXMgaXMgdGhlIGxhcmdlc3QgbmFtZXNwYWNlLiBJdCBpcyBjYXNlIHNlbnNpdGl2ZSBhbmQgYWxsb3dzIGFsbAorCSAgIFVuaWNvZGUgY2hhcmFjdGVycyBleGNlcHQgZm9yOiAnXDAnIGFuZCAnLycuICBCZXdhcmUgdGhhdCBpbgorCSAgIFdpbk5ULzJrIGZpbGVzIHdoaWNoIGVnIGhhdmUgdGhlIHNhbWUgbmFtZSBleGNlcHQgZm9yIHRoZWlyIGNhc2UKKwkgICB3aWxsIG5vdCBiZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSBzdGFuZGFyZCB1dGlsaXRpZXMgYW5kIHRodXMgYSAiZGVsCisJICAgZmlsZW5hbWUiIHdpbGwgZGVsZXRlIGJvdGggImZpbGVuYW1lIiBhbmQgImZpbGVOYW1lIiB3aXRob3V0CisJICAgd2FybmluZy4gKi8KKwlGSUxFX05BTUVfV0lOMzIJCT0gMHgwMSwKKwkvKiBUaGUgc3RhbmRhcmQgV2luTlQvMmsgTlRGUyBsb25nIGZpbGVuYW1lcy4gQ2FzZSBpbnNlbnNpdGl2ZS4gIEFsbAorCSAgIFVuaWNvZGUgY2hhcnMgZXhjZXB0OiAnXDAnLCAnIicsICcqJywgJy8nLCAnOicsICc8JywgJz4nLCAnPycsICdcJywKKwkgICBhbmQgJ3wnLiAgRnVydGhlciwgbmFtZXMgY2Fubm90IGVuZCB3aXRoIGEgJy4nIG9yIGEgc3BhY2UuICovCisJRklMRV9OQU1FX0RPUwkJPSAweDAyLAorCS8qIFRoZSBzdGFuZGFyZCBET1MgZmlsZW5hbWVzICg4LjMgZm9ybWF0KS4gVXBwZXJjYXNlIG9ubHkuICBBbGwgOC1iaXQKKwkgICBjaGFyYWN0ZXJzIGdyZWF0ZXIgc3BhY2UsIGV4Y2VwdDogJyInLCAnKicsICcrJywgJywnLCAnLycsICc6JywgJzsnLAorCSAgICc8JywgJz0nLCAnPicsICc/JywgYW5kICdcJy4gKi8KKwlGSUxFX05BTUVfV0lOMzJfQU5EX0RPUwk9IDB4MDMsCisJLyogMyBtZWFucyB0aGF0IGJvdGggdGhlIFdpbjMyIGFuZCB0aGUgRE9TIGZpbGVuYW1lcyBhcmUgaWRlbnRpY2FsIGFuZAorCSAgIGhlbmNlIGhhdmUgYmVlbiBzYXZlZCBpbiB0aGlzIHNpbmdsZSBmaWxlbmFtZSByZWNvcmQuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3R5cGVkZWYgdTggRklMRV9OQU1FX1RZUEVfRkxBR1M7CisKKy8qCisgKiBBdHRyaWJ1dGU6IEZpbGVuYW1lICgweDMwKS4KKyAqCisgKiBOT1RFOiBBbHdheXMgcmVzaWRlbnQuCisgKiBOT1RFOiBBbGwgZmllbGRzLCBleGNlcHQgdGhlIHBhcmVudF9kaXJlY3RvcnksIGFyZSBvbmx5IHVwZGF0ZWQgd2hlbiB0aGUKKyAqCSBmaWxlbmFtZSBpcyBjaGFuZ2VkLiBVbnRpbCB0aGVuLCB0aGV5IGp1c3QgYmVjb21lIG91dCBvZiBzeW5jIHdpdGgKKyAqCSByZWFsaXR5IGFuZCB0aGUgbW9yZSB1cCB0byBkYXRlIHZhbHVlcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RhbmRhcmQKKyAqCSBpbmZvcm1hdGlvbiBhdHRyaWJ1dGUuCisgKiBOT1RFOiBUaGVyZSBpcyBjb25mbGljdGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVhbmluZyBvZiBlYWNoIG9mIHRoZSB0aW1lCisgKgkgZmllbGRzIGJ1dCB0aGUgbWVhbmluZyBhcyBkZWZpbmVkIGJlbG93IGhhcyBiZWVuIHZlcmlmaWVkIHRvIGJlCisgKgkgY29ycmVjdCBieSBwcmFjdGljYWwgZXhwZXJpbWVudGF0aW9uIG9uIFdpbmRvd3MgTlQ0IFNQNmEgYW5kIGlzIGhlbmNlCisgKgkgYXNzdW1lZCB0byBiZSB0aGUgb25lIGFuZCBvbmx5IGNvcnJlY3QgaW50ZXJwcmV0YXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKy8qaGV4IG9mcyovCisvKiAgMCovCWxlTUZUX1JFRiBwYXJlbnRfZGlyZWN0b3J5OwkvKiBEaXJlY3RvcnkgdGhpcyBmaWxlbmFtZSBpcworCQkJCQkgICByZWZlcmVuY2VkIGZyb20uICovCisvKiAgOCovCXNsZTY0IGNyZWF0aW9uX3RpbWU7CQkvKiBUaW1lIGZpbGUgd2FzIGNyZWF0ZWQuICovCisvKiAxMCovCXNsZTY0IGxhc3RfZGF0YV9jaGFuZ2VfdGltZTsJLyogVGltZSB0aGUgZGF0YSBhdHRyaWJ1dGUgd2FzIGxhc3QKKwkJCQkJICAgbW9kaWZpZWQuICovCisvKiAxOCovCXNsZTY0IGxhc3RfbWZ0X2NoYW5nZV90aW1lOwkvKiBUaW1lIHRoaXMgbWZ0IHJlY29yZCB3YXMgbGFzdAorCQkJCQkgICBtb2RpZmllZC4gKi8KKy8qIDIwKi8Jc2xlNjQgbGFzdF9hY2Nlc3NfdGltZTsJCS8qIFRpbWUgdGhpcyBtZnQgcmVjb3JkIHdhcyBsYXN0CisJCQkJCSAgIGFjY2Vzc2VkLiAqLworLyogMjgqLwlzbGU2NCBhbGxvY2F0ZWRfc2l6ZTsJCS8qIEJ5dGUgc2l6ZSBvZiBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZQorCQkJCQkgICBkYXRhIGF0dHJpYnV0ZS4gTk9URTogSXMgYSBtdWx0aXBsZQorCQkJCQkgICBvZiB0aGUgY2x1c3RlciBzaXplLiAqLworLyogMzAqLwlzbGU2NCBkYXRhX3NpemU7CQkvKiBCeXRlIHNpemUgb2YgYWN0dWFsIGRhdGEgaW4gZGF0YQorCQkJCQkgICBhdHRyaWJ1dGUuICovCisvKiAzOCovCUZJTEVfQVRUUl9GTEFHUyBmaWxlX2F0dHJpYnV0ZXM7CS8qIEZsYWdzIGRlc2NyaWJpbmcgdGhlIGZpbGUuICovCisvKiAzYyovCXVuaW9uIHsKKwkvKiAzYyovCXN0cnVjdCB7CisJCS8qIDNjKi8JbGUxNiBwYWNrZWRfZWFfc2l6ZTsJLyogU2l6ZSBvZiB0aGUgYnVmZmVyIG5lZWRlZCB0bworCQkJCQkJICAgcGFjayB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlcworCQkJCQkJICAgKEVBcyksIGlmIHN1Y2ggYXJlIHByZXNlbnQuKi8KKwkJLyogM2UqLwlsZTE2IHJlc2VydmVkOwkJLyogUmVzZXJ2ZWQgZm9yIGFsaWdubWVudC4gKi8KKwkJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIGVhOworCS8qIDNjKi8Jc3RydWN0IHsKKwkJLyogM2MqLwlsZTMyIHJlcGFyc2VfcG9pbnRfdGFnOwkvKiBUeXBlIG9mIHJlcGFyc2UgcG9pbnQsCisJCQkJCQkgICBwcmVzZW50IG9ubHkgaW4gcmVwYXJzZQorCQkJCQkJICAgcG9pbnRzIGFuZCBvbmx5IGlmIHRoZXJlIGFyZQorCQkJCQkJICAgbm8gRUFzLiAqLworCQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgcnA7CisJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHR5cGU7CisvKiA0MCovCXU4IGZpbGVfbmFtZV9sZW5ndGg7CQkJLyogTGVuZ3RoIG9mIGZpbGUgbmFtZSBpbgorCQkJCQkJICAgKFVuaWNvZGUpIGNoYXJhY3RlcnMuICovCisvKiA0MSovCUZJTEVfTkFNRV9UWVBFX0ZMQUdTIGZpbGVfbmFtZV90eXBlOwkvKiBOYW1lc3BhY2Ugb2YgdGhlIGZpbGUgbmFtZS4qLworLyogNDIqLwludGZzY2hhciBmaWxlX25hbWVbMF07CQkJLyogRmlsZSBuYW1lIGluIFVuaWNvZGUuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgRklMRV9OQU1FX0FUVFI7CisKKy8qCisgKiBHVUlEIHN0cnVjdHVyZXMgc3RvcmUgZ2xvYmFsbHkgdW5pcXVlIGlkZW50aWZpZXJzIChHVUlEKS4gQSBHVUlEIGlzIGEKKyAqIDEyOC1iaXQgdmFsdWUgY29uc2lzdGluZyBvZiBvbmUgZ3JvdXAgb2YgZWlnaHQgaGV4YWRlY2ltYWwgZGlnaXRzLCBmb2xsb3dlZAorICogYnkgdGhyZWUgZ3JvdXBzIG9mIGZvdXIgaGV4YWRlY2ltYWwgZGlnaXRzIGVhY2gsIGZvbGxvd2VkIGJ5IG9uZSBncm91cCBvZgorICogdHdlbHZlIGhleGFkZWNpbWFsIGRpZ2l0cy4gR1VJRHMgYXJlIE1pY3Jvc29mdCdzIGltcGxlbWVudGF0aW9uIG9mIHRoZQorICogZGlzdHJpYnV0ZWQgY29tcHV0aW5nIGVudmlyb25tZW50IChEQ0UpIHVuaXZlcnNhbGx5IHVuaXF1ZSBpZGVudGlmaWVyIChVVUlEKS4KKyAqIEV4YW1wbGUgb2YgYSBHVUlEOgorICoJMUYwMTA3NjgtNUE3My1CQzkxLTAwMTBBNTIyMTZBNworICovCit0eXBlZGVmIHN0cnVjdCB7CisJbGUzMiBkYXRhMTsJLyogVGhlIGZpcnN0IGVpZ2h0IGhleGFkZWNpbWFsIGRpZ2l0cyBvZiB0aGUgR1VJRC4gKi8KKwlsZTE2IGRhdGEyOwkvKiBUaGUgZmlyc3QgZ3JvdXAgb2YgZm91ciBoZXhhZGVjaW1hbCBkaWdpdHMuICovCisJbGUxNiBkYXRhMzsJLyogVGhlIHNlY29uZCBncm91cCBvZiBmb3VyIGhleGFkZWNpbWFsIGRpZ2l0cy4gKi8KKwl1OCBkYXRhNFs4XTsJLyogVGhlIGZpcnN0IHR3byBieXRlcyBhcmUgdGhlIHRoaXJkIGdyb3VwIG9mIGZvdXIKKwkJCSAgIGhleGFkZWNpbWFsIGRpZ2l0cy4gVGhlIHJlbWFpbmluZyBzaXggYnl0ZXMgYXJlIHRoZQorCQkJICAgZmluYWwgMTIgaGV4YWRlY2ltYWwgZGlnaXRzLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIEdVSUQ7CisKKy8qCisgKiBGSUxFX0V4dGVuZC8kT2JqSWQgY29udGFpbnMgYW4gaW5kZXggbmFtZWQgJE8uIFRoaXMgaW5kZXggY29udGFpbnMgYWxsCisgKiBvYmplY3RfaWRzIHByZXNlbnQgb24gdGhlIHZvbHVtZSBhcyB0aGUgaW5kZXgga2V5cyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIG1mdF9yZWNvcmQgbnVtYmVycyBhcyB0aGUgaW5kZXggZW50cnkgZGF0YSBwYXJ0cy4gVGhlIGRhdGEgcGFydCAoZGVmaW5lZAorICogYmVsb3cpIGFsc28gY29udGFpbnMgdGhyZWUgb3RoZXIgb2JqZWN0X2lkczoKKyAqCWJpcnRoX3ZvbHVtZV9pZCAtIG9iamVjdF9pZCBvZiBGSUxFX1ZvbHVtZSBvbiB3aGljaCB0aGUgZmlsZSB3YXMgZmlyc3QKKyAqCQkJICBjcmVhdGVkLiBPcHRpb25hbCAoaS5lLiBjYW4gYmUgemVybykuCisgKgliaXJ0aF9vYmplY3RfaWQgLSBvYmplY3RfaWQgb2YgZmlsZSB3aGVuIGl0IHdhcyBmaXJzdCBjcmVhdGVkLiBVc3VhbGx5CisgKgkJCSAgZXF1YWxzIHRoZSBvYmplY3RfaWQuIE9wdGlvbmFsIChpLmUuIGNhbiBiZSB6ZXJvKS4KKyAqCWRvbWFpbl9pZAktIFJlc2VydmVkIChhbHdheXMgemVybykuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlsZU1GVF9SRUYgbWZ0X3JlZmVyZW5jZTsvKiBNZnQgcmVjb3JkIGNvbnRhaW5pbmcgdGhlIG9iamVjdF9pZCBpbgorCQkJCSAgIHRoZSBpbmRleCBlbnRyeSBrZXkuICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJR1VJRCBiaXJ0aF92b2x1bWVfaWQ7CisJCQlHVUlEIGJpcnRoX29iamVjdF9pZDsKKwkJCUdVSUQgZG9tYWluX2lkOworCQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgb3JpZ2luOworCQl1OCBleHRlbmRlZF9pbmZvWzQ4XTsKKwl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgb3B0OworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIE9CSl9JRF9JTkRFWF9EQVRBOworCisvKgorICogQXR0cmlidXRlOiBPYmplY3QgaWQgKE5URlMgMy4wKykgKDB4NDApLgorICoKKyAqIE5PVEU6IEFsd2F5cyByZXNpZGVudC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUdVSUQgb2JqZWN0X2lkOwkJCQkvKiBVbmlxdWUgaWQgYXNzaWduZWQgdG8gdGhlCisJCQkJCQkgICBmaWxlLiovCisJLyogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG9wdGlvbmFsLiBUaGUgYXR0cmlidXRlIHZhbHVlIHNpemUgaXMgMTYKKwkgICBieXRlcywgaS5lLiBzaXplb2YoR1VJRCksIGlmIHRoZXNlIGFyZSBub3QgcHJlc2VudCBhdCBhbGwuIE5vdGUsCisJICAgdGhlIGVudHJpZXMgY2FuIGJlIHByZXNlbnQgYnV0IG9uZSBvciBtb3JlIChvciBhbGwpIGNhbiBiZSB6ZXJvCisJICAgbWVhbmluZyB0aGF0IHRoYXQgcGFydGljdWxhciB2YWx1ZShzKSBpcyhhcmUpIG5vdCBkZWZpbmVkLiAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCUdVSUQgYmlydGhfdm9sdW1lX2lkOwkvKiBVbmlxdWUgaWQgb2Ygdm9sdW1lIG9uIHdoaWNoCisJCQkJCQkgICB0aGUgZmlsZSB3YXMgZmlyc3QgY3JlYXRlZC4qLworCQkJR1VJRCBiaXJ0aF9vYmplY3RfaWQ7CS8qIFVuaXF1ZSBpZCBvZiBmaWxlIHdoZW4gaXQgd2FzCisJCQkJCQkgICBmaXJzdCBjcmVhdGVkLiAqLworCQkJR1VJRCBkb21haW5faWQ7CQkvKiBSZXNlcnZlZCwgemVyby4gKi8KKwkJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIG9yaWdpbjsKKwkJdTggZXh0ZW5kZWRfaW5mb1s0OF07CisJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIG9wdDsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBPQkpFQ1RfSURfQVRUUjsKKworLyoKKyAqIFRoZSBwcmUtZGVmaW5lZCBJREVOVElGSUVSX0FVVEhPUklUSUVTIHVzZWQgYXMgU0lEX0lERU5USUZJRVJfQVVUSE9SSVRZIGluCisgKiB0aGUgU0lEIHN0cnVjdHVyZSAoc2VlIGJlbG93KS4KKyAqLworLy90eXBlZGVmIGVudW0gewkJCQkJLyogU0lEIHN0cmluZyBwcmVmaXguICovCisvLwlTRUNVUklUWV9OVUxMX1NJRF9BVVRIT1JJVFkJPSB7MCwgMCwgMCwgMCwgMCwgMH0sCS8qIFMtMS0wICovCisvLwlTRUNVUklUWV9XT1JMRF9TSURfQVVUSE9SSVRZCT0gezAsIDAsIDAsIDAsIDAsIDF9LAkvKiBTLTEtMSAqLworLy8JU0VDVVJJVFlfTE9DQUxfU0lEX0FVVEhPUklUWQk9IHswLCAwLCAwLCAwLCAwLCAyfSwJLyogUy0xLTIgKi8KKy8vCVNFQ1VSSVRZX0NSRUFUT1JfU0lEX0FVVEhPUklUWQk9IHswLCAwLCAwLCAwLCAwLCAzfSwJLyogUy0xLTMgKi8KKy8vCVNFQ1VSSVRZX05PTl9VTklRVUVfQVVUSE9SSVRZCT0gezAsIDAsIDAsIDAsIDAsIDR9LAkvKiBTLTEtNCAqLworLy8JU0VDVVJJVFlfTlRfU0lEX0FVVEhPUklUWQk9IHswLCAwLCAwLCAwLCAwLCA1fSwJLyogUy0xLTUgKi8KKy8vfSBJREVOVElGSUVSX0FVVEhPUklUSUVTOworCisvKgorICogVGhlc2UgcmVsYXRpdmUgaWRlbnRpZmllcnMgKFJJRHMpIGFyZSB1c2VkIHdpdGggdGhlIGFib3ZlIGlkZW50aWZpZXIKKyAqIGF1dGhvcml0aWVzIHRvIG1ha2UgdXAgdW5pdmVyc2FsIHdlbGwta25vd24gU0lEcy4KKyAqCisgKiBOb3RlOiBUaGUgcmVsYXRpdmUgaWRlbnRpZmllciAoUklEKSByZWZlcnMgdG8gdGhlIHBvcnRpb24gb2YgYSBTSUQsIHdoaWNoCisgKiBpZGVudGlmaWVzIGEgdXNlciBvciBncm91cCBpbiByZWxhdGlvbiB0byB0aGUgYXV0aG9yaXR5IHRoYXQgaXNzdWVkIHRoZSBTSUQuCisgKiBGb3IgZXhhbXBsZSwgdGhlIHVuaXZlcnNhbCB3ZWxsLWtub3duIFNJRCBDcmVhdG9yIE93bmVyIElEIChTLTEtMy0wKSBpcworICogbWFkZSB1cCBvZiB0aGUgaWRlbnRpZmllciBhdXRob3JpdHkgU0VDVVJJVFlfQ1JFQVRPUl9TSURfQVVUSE9SSVRZICgzKSBhbmQKKyAqIHRoZSByZWxhdGl2ZSBpZGVudGlmaWVyIFNFQ1VSSVRZX0NSRUFUT1JfT1dORVJfUklEICgwKS4KKyAqLwordHlwZWRlZiBlbnVtIHsJCQkJCS8qIElkZW50aWZpZXIgYXV0aG9yaXR5LiAqLworCVNFQ1VSSVRZX05VTExfUklECQkgID0gMCwJLyogUy0xLTAgKi8KKwlTRUNVUklUWV9XT1JMRF9SSUQJCSAgPSAwLAkvKiBTLTEtMSAqLworCVNFQ1VSSVRZX0xPQ0FMX1JJRAkJICA9IDAsCS8qIFMtMS0yICovCisKKwlTRUNVUklUWV9DUkVBVE9SX09XTkVSX1JJRAkgID0gMCwJLyogUy0xLTMgKi8KKwlTRUNVUklUWV9DUkVBVE9SX0dST1VQX1JJRAkgID0gMSwJLyogUy0xLTMgKi8KKworCVNFQ1VSSVRZX0NSRUFUT1JfT1dORVJfU0VSVkVSX1JJRCA9IDIsCS8qIFMtMS0zICovCisJU0VDVVJJVFlfQ1JFQVRPUl9HUk9VUF9TRVJWRVJfUklEID0gMywJLyogUy0xLTMgKi8KKworCVNFQ1VSSVRZX0RJQUxVUF9SSUQJCSAgPSAxLAorCVNFQ1VSSVRZX05FVFdPUktfUklECQkgID0gMiwKKwlTRUNVUklUWV9CQVRDSF9SSUQJCSAgPSAzLAorCVNFQ1VSSVRZX0lOVEVSQUNUSVZFX1JJRAkgID0gNCwKKwlTRUNVUklUWV9TRVJWSUNFX1JJRAkJICA9IDYsCisJU0VDVVJJVFlfQU5PTllNT1VTX0xPR09OX1JJRAkgID0gNywKKwlTRUNVUklUWV9QUk9YWV9SSUQJCSAgPSA4LAorCVNFQ1VSSVRZX0VOVEVSUFJJU0VfQ09OVFJPTExFUlNfUklEPTksCisJU0VDVVJJVFlfU0VSVkVSX0xPR09OX1JJRAkgID0gOSwKKwlTRUNVUklUWV9QUklOQ0lQQUxfU0VMRl9SSUQJICA9IDB4YSwKKwlTRUNVUklUWV9BVVRIRU5USUNBVEVEX1VTRVJfUklECSAgPSAweGIsCisJU0VDVVJJVFlfUkVTVFJJQ1RFRF9DT0RFX1JJRAkgID0gMHhjLAorCVNFQ1VSSVRZX1RFUk1JTkFMX1NFUlZFUl9SSUQJICA9IDB4ZCwKKworCVNFQ1VSSVRZX0xPR09OX0lEU19SSUQJCSAgPSA1LAorCVNFQ1VSSVRZX0xPR09OX0lEU19SSURfQ09VTlQJICA9IDMsCisKKwlTRUNVUklUWV9MT0NBTF9TWVNURU1fUklECSAgPSAweDEyLAorCisJU0VDVVJJVFlfTlRfTk9OX1VOSVFVRQkJICA9IDB4MTUsCisKKwlTRUNVUklUWV9CVUlMVElOX0RPTUFJTl9SSUQJICA9IDB4MjAsCisKKwkvKgorCSAqIFdlbGwta25vd24gZG9tYWluIHJlbGF0aXZlIHN1Yi1hdXRob3JpdHkgdmFsdWVzIChSSURzKS4KKwkgKi8KKworCS8qIFVzZXJzLiAqLworCURPTUFJTl9VU0VSX1JJRF9BRE1JTgkJICA9IDB4MWY0LAorCURPTUFJTl9VU0VSX1JJRF9HVUVTVAkJICA9IDB4MWY1LAorCURPTUFJTl9VU0VSX1JJRF9LUkJUR1QJCSAgPSAweDFmNiwKKworCS8qIEdyb3Vwcy4gKi8KKwlET01BSU5fR1JPVVBfUklEX0FETUlOUwkJICA9IDB4MjAwLAorCURPTUFJTl9HUk9VUF9SSURfVVNFUlMJCSAgPSAweDIwMSwKKwlET01BSU5fR1JPVVBfUklEX0dVRVNUUwkJICA9IDB4MjAyLAorCURPTUFJTl9HUk9VUF9SSURfQ09NUFVURVJTCSAgPSAweDIwMywKKwlET01BSU5fR1JPVVBfUklEX0NPTlRST0xMRVJTCSAgPSAweDIwNCwKKwlET01BSU5fR1JPVVBfUklEX0NFUlRfQURNSU5TCSAgPSAweDIwNSwKKwlET01BSU5fR1JPVVBfUklEX1NDSEVNQV9BRE1JTlMJICA9IDB4MjA2LAorCURPTUFJTl9HUk9VUF9SSURfRU5URVJQUklTRV9BRE1JTlM9IDB4MjA3LAorCURPTUFJTl9HUk9VUF9SSURfUE9MSUNZX0FETUlOUwkgID0gMHgyMDgsCisKKwkvKiBBbGlhc2VzLiAqLworCURPTUFJTl9BTElBU19SSURfQURNSU5TCQkgID0gMHgyMjAsCisJRE9NQUlOX0FMSUFTX1JJRF9VU0VSUwkJICA9IDB4MjIxLAorCURPTUFJTl9BTElBU19SSURfR1VFU1RTCQkgID0gMHgyMjIsCisJRE9NQUlOX0FMSUFTX1JJRF9QT1dFUl9VU0VSUwkgID0gMHgyMjMsCisKKwlET01BSU5fQUxJQVNfUklEX0FDQ09VTlRfT1BTCSAgPSAweDIyNCwKKwlET01BSU5fQUxJQVNfUklEX1NZU1RFTV9PUFMJICA9IDB4MjI1LAorCURPTUFJTl9BTElBU19SSURfUFJJTlRfT1BTCSAgPSAweDIyNiwKKwlET01BSU5fQUxJQVNfUklEX0JBQ0tVUF9PUFMJICA9IDB4MjI3LAorCisJRE9NQUlOX0FMSUFTX1JJRF9SRVBMSUNBVE9SCSAgPSAweDIyOCwKKwlET01BSU5fQUxJQVNfUklEX1JBU19TRVJWRVJTCSAgPSAweDIyOSwKKwlET01BSU5fQUxJQVNfUklEX1BSRVcyS0NPTVBBQ0NFU1MgPSAweDIyYSwKK30gUkVMQVRJVkVfSURFTlRJRklFUlM7CisKKy8qCisgKiBUaGUgdW5pdmVyc2FsIHdlbGwta25vd24gU0lEczoKKyAqCisgKglOVUxMX1NJRAkJCVMtMS0wLTAKKyAqCVdPUkxEX1NJRAkJCVMtMS0xLTAKKyAqCUxPQ0FMX1NJRAkJCVMtMS0yLTAKKyAqCUNSRUFUT1JfT1dORVJfU0lECQlTLTEtMy0wCisgKglDUkVBVE9SX0dST1VQX1NJRAkJUy0xLTMtMQorICoJQ1JFQVRPUl9PV05FUl9TRVJWRVJfU0lECVMtMS0zLTIKKyAqCUNSRUFUT1JfR1JPVVBfU0VSVkVSX1NJRAlTLTEtMy0zCisgKgorICoJKE5vbi11bmlxdWUgSURzKQkJUy0xLTQKKyAqCisgKiBOVCB3ZWxsLWtub3duIFNJRHM6CisgKgorICoJTlRfQVVUSE9SSVRZX1NJRAlTLTEtNQorICoJRElBTFVQX1NJRAkJUy0xLTUtMQorICoKKyAqCU5FVFdPUkRfU0lECQlTLTEtNS0yCisgKglCQVRDSF9TSUQJCVMtMS01LTMKKyAqCUlOVEVSQUNUSVZFX1NJRAkJUy0xLTUtNAorICoJU0VSVklDRV9TSUQJCVMtMS01LTYKKyAqCUFOT05ZTU9VU19MT0dPTl9TSUQJUy0xLTUtNwkJKGFrYSBudWxsIGxvZ29uIHNlc3Npb24pCisgKglQUk9YWV9TSUQJCVMtMS01LTgKKyAqCVNFUlZFUl9MT0dPTl9TSUQJUy0xLTUtOQkJKGFrYSBkb21haW4gY29udHJvbGxlciBhY2NvdW50KQorICoJU0VMRl9TSUQJCVMtMS01LTEwCShzZWxmIFJJRCkKKyAqCUFVVEhFTlRJQ0FURURfVVNFUl9TSUQJUy0xLTUtMTEKKyAqCVJFU1RSSUNURURfQ09ERV9TSUQJUy0xLTUtMTIJKHJ1bm5pbmcgcmVzdHJpY3RlZCBjb2RlKQorICoJVEVSTUlOQUxfU0VSVkVSX1NJRAlTLTEtNS0xMwkocnVubmluZyBvbiB0ZXJtaW5hbCBzZXJ2ZXIpCisgKgorICoJKExvZ29uIElEcykJCVMtMS01LTUtWC1ZCisgKgorICoJKE5UIG5vbi11bmlxdWUgSURzKQlTLTEtNS0weDE1LS4uLgorICoKKyAqCShCdWlsdC1pbiBkb21haW4pCVMtMS01LTB4MjAKKyAqLworCisvKgorICogVGhlIFNJRF9JREVOVElGSUVSX0FVVEhPUklUWSBpcyBhIDQ4LWJpdCB2YWx1ZSB1c2VkIGluIHRoZSBTSUQgc3RydWN0dXJlLgorICoKKyAqIE5PVEU6IFRoaXMgaXMgc3RvcmVkIGFzIGEgYmlnIGVuZGlhbiBudW1iZXIsIGhlbmNlIHRoZSBoaWdoX3BhcnQgY29tZXMKKyAqIGJlZm9yZSB0aGUgbG93X3BhcnQuCisgKi8KK3R5cGVkZWYgdW5pb24geworCXN0cnVjdCB7CisJCXUxNiBoaWdoX3BhcnQ7CS8qIEhpZ2ggMTYtYml0cy4gKi8KKwkJdTMyIGxvd19wYXJ0OwkvKiBMb3cgMzItYml0cy4gKi8KKwl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgcGFydHM7CisJdTggdmFsdWVbNl07CQkvKiBWYWx1ZSBhcyBpbmRpdmlkdWFsIGJ5dGVzLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIFNJRF9JREVOVElGSUVSX0FVVEhPUklUWTsKKworLyoKKyAqIFRoZSBTSUQgc3RydWN0dXJlIGlzIGEgdmFyaWFibGUtbGVuZ3RoIHN0cnVjdHVyZSB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5CisgKiB1c2VycyBvciBncm91cHMuIFNJRCBzdGFuZHMgZm9yIHNlY3VyaXR5IGlkZW50aWZpZXIuCisgKgorICogVGhlIHN0YW5kYXJkIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIFNJRCBpcyBvZiB0aGUgZm9ybToKKyAqCVMtUi1JLVMtUy4uLgorICogV2hlcmU6CisgKiAgICAtIFRoZSBmaXJzdCAiUyIgaXMgdGhlIGxpdGVyYWwgY2hhcmFjdGVyICdTJyBpZGVudGlmeWluZyB0aGUgZm9sbG93aW5nCisgKglkaWdpdHMgYXMgYSBTSUQuCisgKiAgICAtIFIgaXMgdGhlIHJldmlzaW9uIGxldmVsIG9mIHRoZSBTSUQgZXhwcmVzc2VkIGFzIGEgc2VxdWVuY2Ugb2YgZGlnaXRzCisgKgllaXRoZXIgaW4gZGVjaW1hbCBvciBoZXhhZGVjaW1hbCAoaWYgdGhlIGxhdGVyLCBwcmVmaXhlZCBieSAiMHgiKS4KKyAqICAgIC0gSSBpcyB0aGUgNDgtYml0IGlkZW50aWZpZXJfYXV0aG9yaXR5LCBleHByZXNzZWQgYXMgZGlnaXRzIGFzIFIgYWJvdmUuCisgKiAgICAtIFMuLi4gaXMgb25lIG9yIG1vcmUgc3ViX2F1dGhvcml0eSB2YWx1ZXMsIGV4cHJlc3NlZCBhcyBkaWdpdHMgYXMgYWJvdmUuCisgKgorICogRXhhbXBsZSBTSUQ7IHRoZSBkb21haW4tcmVsYXRpdmUgU0lEIG9mIHRoZSBsb2NhbCBBZG1pbmlzdHJhdG9ycyBncm91cCBvbgorICogV2luZG93cyBOVC8yazoKKyAqCVMtMS01LTMyLTU0NAorICogVGhpcyB0cmFuc2xhdGVzIHRvIGEgU0lEIHdpdGg6CisgKglyZXZpc2lvbiA9IDEsCisgKglzdWJfYXV0aG9yaXR5X2NvdW50ID0gMiwKKyAqCWlkZW50aWZpZXJfYXV0aG9yaXR5ID0gezAsMCwwLDAsMCw1fSwJLy8gU0VDVVJJVFlfTlRfQVVUSE9SSVRZCisgKglzdWJfYXV0aG9yaXR5WzBdID0gMzIsCQkJLy8gU0VDVVJJVFlfQlVJTFRJTl9ET01BSU5fUklECisgKglzdWJfYXV0aG9yaXR5WzFdID0gNTQ0CQkJLy8gRE9NQUlOX0FMSUFTX1JJRF9BRE1JTlMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXU4IHJldmlzaW9uOworCXU4IHN1Yl9hdXRob3JpdHlfY291bnQ7CisJU0lEX0lERU5USUZJRVJfQVVUSE9SSVRZIGlkZW50aWZpZXJfYXV0aG9yaXR5OworCWxlMzIgc3ViX2F1dGhvcml0eVsxXTsJCS8qIEF0IGxlYXN0IG9uZSBzdWJfYXV0aG9yaXR5LiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIFNJRDsKKworLyoKKyAqIEN1cnJlbnQgY29uc3RhbnRzIGZvciBTSURzLgorICovCit0eXBlZGVmIGVudW0geworCVNJRF9SRVZJU0lPTgkJCT0gIDEsCS8qIEN1cnJlbnQgcmV2aXNpb24gbGV2ZWwuICovCisJU0lEX01BWF9TVUJfQVVUSE9SSVRJRVMJCT0gMTUsCS8qIE1heGltdW0gbnVtYmVyIG9mIHRob3NlLiAqLworCVNJRF9SRUNPTU1FTkRFRF9TVUJfQVVUSE9SSVRJRVMJPSAgMSwJLyogV2lsbCBjaGFuZ2UgdG8gYXJvdW5kIDYgaW4KKwkJCQkJCSAgIGEgZnV0dXJlIHJldmlzaW9uLiAqLworfSBTSURfQ09OU1RBTlRTOworCisvKgorICogVGhlIHByZWRlZmluZWQgQUNFIHR5cGVzICg4LWJpdCwgc2VlIGJlbG93KS4KKyAqLworZW51bSB7CisJQUNDRVNTX01JTl9NU19BQ0VfVFlQRQkJPSAwLAorCUFDQ0VTU19BTExPV0VEX0FDRV9UWVBFCQk9IDAsCisJQUNDRVNTX0RFTklFRF9BQ0VfVFlQRQkJPSAxLAorCVNZU1RFTV9BVURJVF9BQ0VfVFlQRQkJPSAyLAorCVNZU1RFTV9BTEFSTV9BQ0VfVFlQRQkJPSAzLCAvKiBOb3QgaW1wbGVtZW50ZWQgYXMgb2YgV2luMmsuICovCisJQUNDRVNTX01BWF9NU19WMl9BQ0VfVFlQRQk9IDMsCisKKwlBQ0NFU1NfQUxMT1dFRF9DT01QT1VORF9BQ0VfVFlQRT0gNCwKKwlBQ0NFU1NfTUFYX01TX1YzX0FDRV9UWVBFCT0gNCwKKworCS8qIFRoZSBmb2xsb3dpbmcgYXJlIFdpbjJrIG9ubHkuICovCisJQUNDRVNTX01JTl9NU19PQkpFQ1RfQUNFX1RZUEUJPSA1LAorCUFDQ0VTU19BTExPV0VEX09CSkVDVF9BQ0VfVFlQRQk9IDUsCisJQUNDRVNTX0RFTklFRF9PQkpFQ1RfQUNFX1RZUEUJPSA2LAorCVNZU1RFTV9BVURJVF9PQkpFQ1RfQUNFX1RZUEUJPSA3LAorCVNZU1RFTV9BTEFSTV9PQkpFQ1RfQUNFX1RZUEUJPSA4LAorCUFDQ0VTU19NQVhfTVNfT0JKRUNUX0FDRV9UWVBFCT0gOCwKKworCUFDQ0VTU19NQVhfTVNfVjRfQUNFX1RZUEUJPSA4LAorCisJLyogVGhpcyBvbmUgaXMgZm9yIFdpbk5ULzJrLiAqLworCUFDQ0VTU19NQVhfTVNfQUNFX1RZUEUJCT0gOCwKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKwordHlwZWRlZiB1OCBBQ0VfVFlQRVM7CisKKy8qCisgKiBUaGUgQUNFIGZsYWdzICg4LWJpdCkgZm9yIGF1ZGl0IGFuZCBpbmhlcml0YW5jZSAoc2VlIGJlbG93KS4KKyAqCisgKiBTVUNDRVNTRlVMX0FDQ0VTU19BQ0VfRkxBRyBpcyBvbmx5IHVzZWQgd2l0aCBzeXN0ZW0gYXVkaXQgYW5kIGFsYXJtIEFDRQorICogdHlwZXMgdG8gaW5kaWNhdGUgdGhhdCBhIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIChpbiBXaW5kb3dzISkgZm9yIHN1Y2Nlc3NmdWwKKyAqIGFjY2Vzc2VzLgorICoKKyAqIEZBSUxFRF9BQ0NFU1NfQUNFX0ZMQUcgaXMgb25seSB1c2VkIHdpdGggc3lzdGVtIGF1ZGl0IGFuZCBhbGFybSBBQ0UgdHlwZXMKKyAqIHRvIGluZGljYXRlIHRoYXQgYSBtZXNzYWdlIGlzIGdlbmVyYXRlZCAoaW4gV2luZG93cyEpIGZvciBmYWlsZWQgYWNjZXNzZXMuCisgKi8KK2VudW0geworCS8qIFRoZSBpbmhlcml0YW5jZSBmbGFncy4gKi8KKwlPQkpFQ1RfSU5IRVJJVF9BQ0UJCT0gMHgwMSwKKwlDT05UQUlORVJfSU5IRVJJVF9BQ0UJCT0gMHgwMiwKKwlOT19QUk9QQUdBVEVfSU5IRVJJVF9BQ0UJPSAweDA0LAorCUlOSEVSSVRfT05MWV9BQ0UJCT0gMHgwOCwKKwlJTkhFUklURURfQUNFCQkJPSAweDEwLAkvKiBXaW4yayBvbmx5LiAqLworCVZBTElEX0lOSEVSSVRfRkxBR1MJCT0gMHgxZiwKKworCS8qIFRoZSBhdWRpdCBmbGFncy4gKi8KKwlTVUNDRVNTRlVMX0FDQ0VTU19BQ0VfRkxBRwk9IDB4NDAsCisJRkFJTEVEX0FDQ0VTU19BQ0VfRkxBRwkJPSAweDgwLAorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCit0eXBlZGVmIHU4IEFDRV9GTEFHUzsKKworLyoKKyAqIEFuIEFDRSBpcyBhbiBhY2Nlc3MtY29udHJvbCBlbnRyeSBpbiBhbiBhY2Nlc3MtY29udHJvbCBsaXN0IChBQ0wpLgorICogQW4gQUNFIGRlZmluZXMgYWNjZXNzIHRvIGFuIG9iamVjdCBmb3IgYSBzcGVjaWZpYyB1c2VyIG9yIGdyb3VwIG9yIGRlZmluZXMKKyAqIHRoZSB0eXBlcyBvZiBhY2Nlc3MgdGhhdCBnZW5lcmF0ZSBzeXN0ZW0tYWRtaW5pc3RyYXRpb24gbWVzc2FnZXMgb3IgYWxhcm1zCisgKiBmb3IgYSBzcGVjaWZpYyB1c2VyIG9yIGdyb3VwLiBUaGUgdXNlciBvciBncm91cCBpcyBpZGVudGlmaWVkIGJ5IGEgc2VjdXJpdHkKKyAqIGlkZW50aWZpZXIgKFNJRCkuCisgKgorICogRWFjaCBBQ0Ugc3RhcnRzIHdpdGggYW4gQUNFX0hFQURFUiBzdHJ1Y3R1cmUgKGFsaWduZWQgb24gNC1ieXRlIGJvdW5kYXJ5KSwKKyAqIHdoaWNoIHNwZWNpZmllcyB0aGUgdHlwZSBhbmQgc2l6ZSBvZiB0aGUgQUNFLiBUaGUgZm9ybWF0IG9mIHRoZSBzdWJzZXF1ZW50CisgKiBkYXRhIGRlcGVuZHMgb24gdGhlIEFDRSB0eXBlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisvKk9mcyovCisvKiAgMCovCUFDRV9UWVBFUyB0eXBlOwkJLyogVHlwZSBvZiB0aGUgQUNFLiAqLworLyogIDEqLwlBQ0VfRkxBR1MgZmxhZ3M7CS8qIEZsYWdzIGRlc2NyaWJpbmcgdGhlIEFDRS4gKi8KKy8qICAyKi8JbGUxNiBzaXplOwkJLyogU2l6ZSBpbiBieXRlcyBvZiB0aGUgQUNFLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIEFDRV9IRUFERVI7CisKKy8qCisgKiBUaGUgYWNjZXNzIG1hc2sgKDMyLWJpdCkuIERlZmluZXMgdGhlIGFjY2VzcyByaWdodHMuCisgKgorICogVGhlIHNwZWNpZmljIHJpZ2h0cyAoYml0cyAwIHRvIDE1KS4gIFRoZXNlIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0CisgKiBiZWluZyBzZWN1cmVkIGJ5IHRoZSBBQ0UuCisgKi8KK2VudW0geworCS8qIFNwZWNpZmljIHJpZ2h0cyBmb3IgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGFyZSBhcyBmb2xsb3dzOiAqLworCisJLyogUmlnaHQgdG8gcmVhZCBkYXRhIGZyb20gdGhlIGZpbGUuIChGSUxFKSAqLworCUZJTEVfUkVBRF9EQVRBCQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDAxKSwKKwkvKiBSaWdodCB0byBsaXN0IGNvbnRlbnRzIG9mIGEgZGlyZWN0b3J5LiAoRElSRUNUT1JZKSAqLworCUZJTEVfTElTVF9ESVJFQ1RPUlkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMSksCisKKwkvKiBSaWdodCB0byB3cml0ZSBkYXRhIHRvIHRoZSBmaWxlLiAoRklMRSkgKi8KKwlGSUxFX1dSSVRFX0RBVEEJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDIpLAorCS8qIFJpZ2h0IHRvIGNyZWF0ZSBhIGZpbGUgaW4gdGhlIGRpcmVjdG9yeS4gKERJUkVDVE9SWSkgKi8KKwlGSUxFX0FERF9GSUxFCQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDAyKSwKKworCS8qIFJpZ2h0IHRvIGFwcGVuZCBkYXRhIHRvIHRoZSBmaWxlLiAoRklMRSkgKi8KKwlGSUxFX0FQUEVORF9EQVRBCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDQpLAorCS8qIFJpZ2h0IHRvIGNyZWF0ZSBhIHN1YmRpcmVjdG9yeS4gKERJUkVDVE9SWSkgKi8KKwlGSUxFX0FERF9TVUJESVJFQ1RPUlkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAwNCksCisKKwkvKiBSaWdodCB0byByZWFkIGV4dGVuZGVkIGF0dHJpYnV0ZXMuIChGSUxFL0RJUkVDVE9SWSkgKi8KKwlGSUxFX1JFQURfRUEJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDgpLAorCisJLyogUmlnaHQgdG8gd3JpdGUgZXh0ZW5kZWQgYXR0cmlidXRlcy4gKEZJTEUvRElSRUNUT1JZKSAqLworCUZJTEVfV1JJVEVfRUEJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMTApLAorCisJLyogUmlnaHQgdG8gZXhlY3V0ZSBhIGZpbGUuIChGSUxFKSAqLworCUZJTEVfRVhFQ1VURQkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAyMCksCisJLyogUmlnaHQgdG8gdHJhdmVyc2UgdGhlIGRpcmVjdG9yeS4gKERJUkVDVE9SWSkgKi8KKwlGSUxFX1RSQVZFUlNFCQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDIwKSwKKworCS8qCisJICogUmlnaHQgdG8gZGVsZXRlIGEgZGlyZWN0b3J5IGFuZCBhbGwgdGhlIGZpbGVzIGl0IGNvbnRhaW5zIChpdHMKKwkgKiBjaGlsZHJlbiksIGV2ZW4gaWYgdGhlIGZpbGVzIGFyZSByZWFkLW9ubHkuIChESVJFQ1RPUlkpCisJICovCisJRklMRV9ERUxFVEVfQ0hJTEQJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDA0MCksCisKKwkvKiBSaWdodCB0byByZWFkIGZpbGUgYXR0cmlidXRlcy4gKEZJTEUvRElSRUNUT1JZKSAqLworCUZJTEVfUkVBRF9BVFRSSUJVVEVTCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwODApLAorCisJLyogUmlnaHQgdG8gY2hhbmdlIGZpbGUgYXR0cmlidXRlcy4gKEZJTEUvRElSRUNUT1JZKSAqLworCUZJTEVfV1JJVEVfQVRUUklCVVRFUwkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMTAwKSwKKworCS8qCisJICogVGhlIHN0YW5kYXJkIHJpZ2h0cyAoYml0cyAxNiB0byAyMykuICBUaGVzZSBhcmUgaW5kZXBlbmRlbnQgb2YgdGhlCisJICogdHlwZSBvZiBvYmplY3QgYmVpbmcgc2VjdXJlZC4KKwkgKi8KKworCS8qIFJpZ2h0IHRvIGRlbGV0ZSB0aGUgb2JqZWN0LiAqLworCURFTEVURQkJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMTAwMDApLAorCisJLyoKKwkgKiBSaWdodCB0byByZWFkIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgb2JqZWN0J3Mgc2VjdXJpdHkgZGVzY3JpcHRvciwKKwkgKiBub3QgaW5jbHVkaW5nIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgU0FDTCwgaS5lLiByaWdodCB0byByZWFkIHRoZQorCSAqIHNlY3VyaXR5IGRlc2NyaXB0b3IgYW5kIG93bmVyLgorCSAqLworCVJFQURfQ09OVFJPTAkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAyMDAwMCksCisKKwkvKiBSaWdodCB0byBtb2RpZnkgdGhlIERBQ0wgaW4gdGhlIG9iamVjdCdzIHNlY3VyaXR5IGRlc2NyaXB0b3IuICovCisJV1JJVEVfREFDCQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDQwMDAwKSwKKworCS8qIFJpZ2h0IHRvIGNoYW5nZSB0aGUgb3duZXIgaW4gdGhlIG9iamVjdCdzIHNlY3VyaXR5IGRlc2NyaXB0b3IuICovCisJV1JJVEVfT1dORVIJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwODAwMDApLAorCisJLyoKKwkgKiBSaWdodCB0byB1c2UgdGhlIG9iamVjdCBmb3Igc3luY2hyb25pemF0aW9uLiAgRW5hYmxlcyBhIHByb2Nlc3MgdG8KKwkgKiB3YWl0IHVudGlsIHRoZSBvYmplY3QgaXMgaW4gdGhlIHNpZ25hbGxlZCBzdGF0ZS4gIFNvbWUgb2JqZWN0IHR5cGVzCisJICogZG8gbm90IHN1cHBvcnQgdGhpcyBhY2Nlc3MgcmlnaHQuCisJICovCisJU1lOQ0hST05JWkUJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAxMDAwMDApLAorCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIFNUQU5EQVJEX1JJR0hUU18qIGFyZSBjb21iaW5hdGlvbnMgb2YgdGhlIGFib3ZlIGZvcgorCSAqIGNvbnZlbmllbmNlIGFuZCBhcmUgZGVmaW5lZCBieSB0aGUgV2luMzIgQVBJLgorCSAqLworCisJLyogVGhlc2UgYXJlIGN1cnJlbnRseSBkZWZpbmVkIHRvIFJFQURfQ09OVFJPTC4gKi8KKwlTVEFOREFSRF9SSUdIVFNfUkVBRAkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDIwMDAwKSwKKwlTVEFOREFSRF9SSUdIVFNfV1JJVEUJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAyMDAwMCksCisJU1RBTkRBUkRfUklHSFRTX0VYRUNVVEUJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAyMDAwMCksCisKKwkvKiBDb21iaW5lcyBERUxFVEUsIFJFQURfQ09OVFJPTCwgV1JJVEVfREFDLCBhbmQgV1JJVEVfT1dORVIgYWNjZXNzLiAqLworCVNUQU5EQVJEX1JJR0hUU19SRVFVSVJFRAk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwZjAwMDApLAorCisJLyoKKwkgKiBDb21iaW5lcyBERUxFVEUsIFJFQURfQ09OVFJPTCwgV1JJVEVfREFDLCBXUklURV9PV05FUiwgYW5kCisJICogU1lOQ0hST05JWkUgYWNjZXNzLgorCSAqLworCVNUQU5EQVJEX1JJR0hUU19BTEwJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDFmMDAwMCksCisKKwkvKgorCSAqIFRoZSBhY2Nlc3Mgc3lzdGVtIEFDTCBhbmQgbWF4aW11bSBhbGxvd2VkIGFjY2VzcyB0eXBlcyAoYml0cyAyNCB0bworCSAqIDI1LCBiaXRzIDI2IHRvIDI3IGFyZSByZXNlcnZlZCkuCisJICovCisJQUNDRVNTX1NZU1RFTV9TRUNVUklUWQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAxMDAwMDAwKSwKKwlNQVhJTVVNX0FMTE9XRUQJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDIwMDAwMDApLAorCisJLyoKKwkgKiBUaGUgZ2VuZXJpYyByaWdodHMgKGJpdHMgMjggdG8gMzEpLiAgVGhlc2UgbWFwIG9udG8gdGhlIHN0YW5kYXJkIGFuZAorCSAqIHNwZWNpZmljIHJpZ2h0cy4KKwkgKi8KKworCS8qIFJlYWQsIHdyaXRlLCBhbmQgZXhlY3V0ZSBhY2Nlc3MuICovCisJR0VORVJJQ19BTEwJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MTAwMDAwMDApLAorCisJLyogRXhlY3V0ZSBhY2Nlc3MuICovCisJR0VORVJJQ19FWEVDVVRFCQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDIwMDAwMDAwKSwKKworCS8qCisJICogV3JpdGUgYWNjZXNzLiAgRm9yIGZpbGVzLCB0aGlzIG1hcHMgb250bzoKKwkgKglGSUxFX0FQUEVORF9EQVRBIHwgRklMRV9XUklURV9BVFRSSUJVVEVTIHwgRklMRV9XUklURV9EQVRBIHwKKwkgKglGSUxFX1dSSVRFX0VBIHwgU1RBTkRBUkRfUklHSFRTX1dSSVRFIHwgU1lOQ0hST05JWkUKKwkgKiBGb3IgZGlyZWN0b3JpZXMsIHRoZSBtYXBwaW5nIGhhcyB0aGUgc2FtZSBudW1lcmljYWwgdmFsdWUuICBTZWUKKwkgKiBhYm92ZSBmb3IgdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgcmlnaHRzIGdyYW50ZWQuCisJICovCisJR0VORVJJQ19XUklURQkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHg0MDAwMDAwMCksCisKKwkvKgorCSAqIFJlYWQgYWNjZXNzLiAgRm9yIGZpbGVzLCB0aGlzIG1hcHMgb250bzoKKwkgKglGSUxFX1JFQURfQVRUUklCVVRFUyB8IEZJTEVfUkVBRF9EQVRBIHwgRklMRV9SRUFEX0VBIHwKKwkgKglTVEFOREFSRF9SSUdIVFNfUkVBRCB8IFNZTkNIUk9OSVpFCisJICogRm9yIGRpcmVjdG9yaWVzLCB0aGUgbWFwcGluZyBoYXMgdGhlIHNhbWUgbnVtYmVyaWNhbCB2YWx1ZS4gIFNlZQorCSAqIGFib3ZlIGZvciB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSByaWdodHMgZ3JhbnRlZC4KKwkgKi8KKwlHRU5FUklDX1JFQUQJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4ODAwMDAwMDApLAorfTsKKwordHlwZWRlZiBsZTMyIEFDQ0VTU19NQVNLOworCisvKgorICogVGhlIGdlbmVyaWMgbWFwcGluZyBhcnJheS4gVXNlZCB0byBkZW5vdGUgdGhlIG1hcHBpbmcgb2YgZWFjaCBnZW5lcmljCisgKiBhY2Nlc3MgcmlnaHQgdG8gYSBzcGVjaWZpYyBhY2Nlc3MgbWFzay4KKyAqCisgKiBGSVhNRTogV2hhdCBleGFjdGx5IGlzIHRoaXMgYW5kIHdoYXQgaXMgaXQgZm9yPyAoQUlBKQorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQUNDRVNTX01BU0sgZ2VuZXJpY19yZWFkOworCUFDQ0VTU19NQVNLIGdlbmVyaWNfd3JpdGU7CisJQUNDRVNTX01BU0sgZ2VuZXJpY19leGVjdXRlOworCUFDQ0VTU19NQVNLIGdlbmVyaWNfYWxsOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIEdFTkVSSUNfTUFQUElORzsKKworLyoKKyAqIFRoZSBwcmVkZWZpbmVkIEFDRSB0eXBlIHN0cnVjdHVyZXMgYXJlIGFzIGRlZmluZWQgYmVsb3cuCisgKi8KKworLyoKKyAqIEFDQ0VTU19BTExPV0VEX0FDRSwgQUNDRVNTX0RFTklFRF9BQ0UsIFNZU1RFTV9BVURJVF9BQ0UsIFNZU1RFTV9BTEFSTV9BQ0UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworLyogIDAJQUNFX0hFQURFUjsgLS0gVW5mb2xkZWQgaGVyZSBhcyBnY2MgZG9lc24ndCBsaWtlIHVubmFtZWQgc3RydWN0cy4gKi8KKwlBQ0VfVFlQRVMgdHlwZTsJCS8qIFR5cGUgb2YgdGhlIEFDRS4gKi8KKwlBQ0VfRkxBR1MgZmxhZ3M7CS8qIEZsYWdzIGRlc2NyaWJpbmcgdGhlIEFDRS4gKi8KKwlsZTE2IHNpemU7CQkvKiBTaXplIGluIGJ5dGVzIG9mIHRoZSBBQ0UuICovCisvKiAgNCovCUFDQ0VTU19NQVNLIG1hc2s7CS8qIEFjY2VzcyBtYXNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgQUNFLiAqLworCisvKiAgOCovCVNJRCBzaWQ7CQkvKiBUaGUgU0lEIGFzc29jaWF0ZWQgd2l0aCB0aGUgQUNFLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIEFDQ0VTU19BTExPV0VEX0FDRSwgQUNDRVNTX0RFTklFRF9BQ0UsCisJCQkgICAgICAgU1lTVEVNX0FVRElUX0FDRSwgU1lTVEVNX0FMQVJNX0FDRTsKKworLyoKKyAqIFRoZSBvYmplY3QgQUNFIGZsYWdzICgzMi1iaXQpLgorICovCitlbnVtIHsKKwlBQ0VfT0JKRUNUX1RZUEVfUFJFU0VOVAkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMSksCisJQUNFX0lOSEVSSVRFRF9PQkpFQ1RfVFlQRV9QUkVTRU5UCT0gY29uc3RfY3B1X3RvX2xlMzIoMiksCit9OworCit0eXBlZGVmIGxlMzIgT0JKRUNUX0FDRV9GTEFHUzsKKwordHlwZWRlZiBzdHJ1Y3QgeworLyogIDAJQUNFX0hFQURFUjsgLS0gVW5mb2xkZWQgaGVyZSBhcyBnY2MgZG9lc24ndCBsaWtlIHVubmFtZWQgc3RydWN0cy4gKi8KKwlBQ0VfVFlQRVMgdHlwZTsJCS8qIFR5cGUgb2YgdGhlIEFDRS4gKi8KKwlBQ0VfRkxBR1MgZmxhZ3M7CS8qIEZsYWdzIGRlc2NyaWJpbmcgdGhlIEFDRS4gKi8KKwlsZTE2IHNpemU7CQkvKiBTaXplIGluIGJ5dGVzIG9mIHRoZSBBQ0UuICovCisvKiAgNCovCUFDQ0VTU19NQVNLIG1hc2s7CS8qIEFjY2VzcyBtYXNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgQUNFLiAqLworCisvKiAgOCovCU9CSkVDVF9BQ0VfRkxBR1Mgb2JqZWN0X2ZsYWdzOwkvKiBGbGFncyBkZXNjcmliaW5nIHRoZSBvYmplY3QgQUNFLiAqLworLyogMTIqLwlHVUlEIG9iamVjdF90eXBlOworLyogMjgqLwlHVUlEIGluaGVyaXRlZF9vYmplY3RfdHlwZTsKKworLyogNDQqLwlTSUQgc2lkOwkJLyogVGhlIFNJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEFDRS4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBBQ0NFU1NfQUxMT1dFRF9PQkpFQ1RfQUNFLAorCQkJICAgICAgIEFDQ0VTU19ERU5JRURfT0JKRUNUX0FDRSwKKwkJCSAgICAgICBTWVNURU1fQVVESVRfT0JKRUNUX0FDRSwKKwkJCSAgICAgICBTWVNURU1fQUxBUk1fT0JKRUNUX0FDRTsKKworLyoKKyAqIEFuIEFDTCBpcyBhbiBhY2Nlc3MtY29udHJvbCBsaXN0IChBQ0wpLgorICogQW4gQUNMIHN0YXJ0cyB3aXRoIGFuIEFDTCBoZWFkZXIgc3RydWN0dXJlLCB3aGljaCBzcGVjaWZpZXMgdGhlIHNpemUgb2YKKyAqIHRoZSBBQ0wgYW5kIHRoZSBudW1iZXIgb2YgQUNFcyBpdCBjb250YWlucy4gVGhlIEFDTCBoZWFkZXIgaXMgZm9sbG93ZWQgYnkKKyAqIHplcm8gb3IgbW9yZSBhY2Nlc3MgY29udHJvbCBlbnRyaWVzIChBQ0VzKS4gVGhlIEFDTCBhcyB3ZWxsIGFzIGVhY2ggQUNFCisgKiBhcmUgYWxpZ25lZCBvbiA0LWJ5dGUgYm91bmRhcmllcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXU4IHJldmlzaW9uOwkvKiBSZXZpc2lvbiBvZiB0aGlzIEFDTC4gKi8KKwl1OCBhbGlnbm1lbnQxOworCWxlMTYgc2l6ZTsJLyogQWxsb2NhdGVkIHNwYWNlIGluIGJ5dGVzIGZvciBBQ0wuIEluY2x1ZGVzIHRoaXMKKwkJCSAgIGhlYWRlciwgdGhlIEFDRXMgYW5kIHRoZSByZW1haW5pbmcgZnJlZSBzcGFjZS4gKi8KKwlsZTE2IGFjZV9jb3VudDsJLyogTnVtYmVyIG9mIEFDRXMgaW4gdGhlIEFDTC4gKi8KKwlsZTE2IGFsaWdubWVudDI7CisvKiBzaXplb2YoKSA9IDggYnl0ZXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBBQ0w7CisKKy8qCisgKiBDdXJyZW50IGNvbnN0YW50cyBmb3IgQUNMcy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwkvKiBDdXJyZW50IHJldmlzaW9uLiAqLworCUFDTF9SRVZJU0lPTgkJPSAyLAorCUFDTF9SRVZJU0lPTl9EUwkJPSA0LAorCisJLyogSGlzdG9yeSBvZiByZXZpc2lvbnMuICovCisJQUNMX1JFVklTSU9OMQkJPSAxLAorCU1JTl9BQ0xfUkVWSVNJT04JPSAyLAorCUFDTF9SRVZJU0lPTjIJCT0gMiwKKwlBQ0xfUkVWSVNJT04zCQk9IDMsCisJQUNMX1JFVklTSU9ONAkJPSA0LAorCU1BWF9BQ0xfUkVWSVNJT04JPSA0LAorfSBBQ0xfQ09OU1RBTlRTOworCisvKgorICogVGhlIHNlY3VyaXR5IGRlc2NyaXB0b3IgY29udHJvbCBmbGFncyAoMTYtYml0KS4KKyAqCisgKiBTRV9PV05FUl9ERUZBVUxURUQgLSBUaGlzIGJvb2xlYW4gZmxhZywgd2hlbiBzZXQsIGluZGljYXRlcyB0aGF0IHRoZSBTSUQKKyAqCXBvaW50ZWQgdG8gYnkgdGhlIE93bmVyIGZpZWxkIHdhcyBwcm92aWRlZCBieSBhIGRlZmF1bHRpbmcgbWVjaGFuaXNtCisgKglyYXRoZXIgdGhhbiBleHBsaWNpdGx5IHByb3ZpZGVkIGJ5IHRoZSBvcmlnaW5hbCBwcm92aWRlciBvZiB0aGUKKyAqCXNlY3VyaXR5IGRlc2NyaXB0b3IuICBUaGlzIG1heSBhZmZlY3QgdGhlIHRyZWF0bWVudCBvZiB0aGUgU0lEIHdpdGgKKyAqCXJlc3BlY3QgdG8gaW5oZXJpdGVuY2Ugb2YgYW4gb3duZXIuCisgKgorICogU0VfR1JPVVBfREVGQVVMVEVEIC0gVGhpcyBib29sZWFuIGZsYWcsIHdoZW4gc2V0LCBpbmRpY2F0ZXMgdGhhdCB0aGUgU0lEIGluCisgKgl0aGUgR3JvdXAgZmllbGQgd2FzIHByb3ZpZGVkIGJ5IGEgZGVmYXVsdGluZyBtZWNoYW5pc20gcmF0aGVyIHRoYW4KKyAqCWV4cGxpY2l0bHkgcHJvdmlkZWQgYnkgdGhlIG9yaWdpbmFsIHByb3ZpZGVyIG9mIHRoZSBzZWN1cml0eQorICoJZGVzY3JpcHRvci4gIFRoaXMgbWF5IGFmZmVjdCB0aGUgdHJlYXRtZW50IG9mIHRoZSBTSUQgd2l0aCByZXNwZWN0IHRvCisgKglpbmhlcml0ZW5jZSBvZiBhIHByaW1hcnkgZ3JvdXAuCisgKgorICogU0VfREFDTF9QUkVTRU5UIC0gVGhpcyBib29sZWFuIGZsYWcsIHdoZW4gc2V0LCBpbmRpY2F0ZXMgdGhhdCB0aGUgc2VjdXJpdHkKKyAqCWRlc2NyaXB0b3IgY29udGFpbnMgYSBkaXNjcmV0aW9uYXJ5IEFDTC4gIElmIHRoaXMgZmxhZyBpcyBzZXQgYW5kIHRoZQorICoJRGFjbCBmaWVsZCBvZiB0aGUgU0VDVVJJVFlfREVTQ1JJUFRPUiBpcyBudWxsLCB0aGVuIGEgbnVsbCBBQ0wgaXMKKyAqCWV4cGxpY2l0bHkgYmVpbmcgc3BlY2lmaWVkLgorICoKKyAqIFNFX0RBQ0xfREVGQVVMVEVEIC0gVGhpcyBib29sZWFuIGZsYWcsIHdoZW4gc2V0LCBpbmRpY2F0ZXMgdGhhdCB0aGUgQUNMCisgKglwb2ludGVkIHRvIGJ5IHRoZSBEYWNsIGZpZWxkIHdhcyBwcm92aWRlZCBieSBhIGRlZmF1bHRpbmcgbWVjaGFuaXNtCisgKglyYXRoZXIgdGhhbiBleHBsaWNpdGx5IHByb3ZpZGVkIGJ5IHRoZSBvcmlnaW5hbCBwcm92aWRlciBvZiB0aGUKKyAqCXNlY3VyaXR5IGRlc2NyaXB0b3IuICBUaGlzIG1heSBhZmZlY3QgdGhlIHRyZWF0bWVudCBvZiB0aGUgQUNMIHdpdGgKKyAqCXJlc3BlY3QgdG8gaW5oZXJpdGVuY2Ugb2YgYW4gQUNMLiAgVGhpcyBmbGFnIGlzIGlnbm9yZWQgaWYgdGhlCisgKglEYWNsUHJlc2VudCBmbGFnIGlzIG5vdCBzZXQuCisgKgorICogU0VfU0FDTF9QUkVTRU5UIC0gVGhpcyBib29sZWFuIGZsYWcsIHdoZW4gc2V0LCAgaW5kaWNhdGVzIHRoYXQgdGhlIHNlY3VyaXR5CisgKglkZXNjcmlwdG9yIGNvbnRhaW5zIGEgc3lzdGVtIEFDTCBwb2ludGVkIHRvIGJ5IHRoZSBTYWNsIGZpZWxkLiAgSWYgdGhpcworICoJZmxhZyBpcyBzZXQgYW5kIHRoZSBTYWNsIGZpZWxkIG9mIHRoZSBTRUNVUklUWV9ERVNDUklQVE9SIGlzIG51bGwsIHRoZW4KKyAqCWFuIGVtcHR5IChidXQgcHJlc2VudCkgQUNMIGlzIGJlaW5nIHNwZWNpZmllZC4KKyAqCisgKiBTRV9TQUNMX0RFRkFVTFRFRCAtIFRoaXMgYm9vbGVhbiBmbGFnLCB3aGVuIHNldCwgaW5kaWNhdGVzIHRoYXQgdGhlIEFDTAorICoJcG9pbnRlZCB0byBieSB0aGUgU2FjbCBmaWVsZCB3YXMgcHJvdmlkZWQgYnkgYSBkZWZhdWx0aW5nIG1lY2hhbmlzbQorICoJcmF0aGVyIHRoYW4gZXhwbGljaXRseSBwcm92aWRlZCBieSB0aGUgb3JpZ2luYWwgcHJvdmlkZXIgb2YgdGhlCisgKglzZWN1cml0eSBkZXNjcmlwdG9yLiAgVGhpcyBtYXkgYWZmZWN0IHRoZSB0cmVhdG1lbnQgb2YgdGhlIEFDTCB3aXRoCisgKglyZXNwZWN0IHRvIGluaGVyaXRlbmNlIG9mIGFuIEFDTC4gIFRoaXMgZmxhZyBpcyBpZ25vcmVkIGlmIHRoZQorICoJU2FjbFByZXNlbnQgZmxhZyBpcyBub3Qgc2V0LgorICoKKyAqIFNFX1NFTEZfUkVMQVRJVkUgLSBUaGlzIGJvb2xlYW4gZmxhZywgd2hlbiBzZXQsIGluZGljYXRlcyB0aGF0IHRoZSBzZWN1cml0eQorICoJZGVzY3JpcHRvciBpcyBpbiBzZWxmLXJlbGF0aXZlIGZvcm0uICBJbiB0aGlzIGZvcm0sIGFsbCBmaWVsZHMgb2YgdGhlCisgKglzZWN1cml0eSBkZXNjcmlwdG9yIGFyZSBjb250aWd1b3VzIGluIG1lbW9yeSBhbmQgYWxsIHBvaW50ZXIgZmllbGRzIGFyZQorICoJZXhwcmVzc2VkIGFzIG9mZnNldHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN1cml0eSBkZXNjcmlwdG9yLgorICovCitlbnVtIHsKKwlTRV9PV05FUl9ERUZBVUxURUQJCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwMDAxKSwKKwlTRV9HUk9VUF9ERUZBVUxURUQJCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwMDAyKSwKKwlTRV9EQUNMX1BSRVNFTlQJCQk9IGNvbnN0X2NwdV90b19sZTE2KDB4MDAwNCksCisJU0VfREFDTF9ERUZBVUxURUQJCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwMDA4KSwKKworCVNFX1NBQ0xfUFJFU0VOVAkJCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwMDEwKSwKKwlTRV9TQUNMX0RFRkFVTFRFRAkJPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMjApLAorCisJU0VfREFDTF9BVVRPX0lOSEVSSVRfUkVRCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwMTAwKSwKKwlTRV9TQUNMX0FVVE9fSU5IRVJJVF9SRVEJPSBjb25zdF9jcHVfdG9fbGUxNigweDAyMDApLAorCVNFX0RBQ0xfQVVUT19JTkhFUklURUQJCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwNDAwKSwKKwlTRV9TQUNMX0FVVE9fSU5IRVJJVEVECQk9IGNvbnN0X2NwdV90b19sZTE2KDB4MDgwMCksCisKKwlTRV9EQUNMX1BST1RFQ1RFRAkJPSBjb25zdF9jcHVfdG9fbGUxNigweDEwMDApLAorCVNFX1NBQ0xfUFJPVEVDVEVECQk9IGNvbnN0X2NwdV90b19sZTE2KDB4MjAwMCksCisJU0VfUk1fQ09OVFJPTF9WQUxJRAkJPSBjb25zdF9jcHVfdG9fbGUxNigweDQwMDApLAorCVNFX1NFTEZfUkVMQVRJVkUJCT0gY29uc3RfY3B1X3RvX2xlMTYoMHg4MDAwKQorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCit0eXBlZGVmIGxlMTYgU0VDVVJJVFlfREVTQ1JJUFRPUl9DT05UUk9MOworCisvKgorICogU2VsZi1yZWxhdGl2ZSBzZWN1cml0eSBkZXNjcmlwdG9yLiBDb250YWlucyB0aGUgb3duZXIgYW5kIGdyb3VwIFNJRHMgYXMgd2VsbAorICogYXMgdGhlIHNhY2wgYW5kIGRhY2wgQUNMcyBpbnNpZGUgdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3IgaXRzZWxmLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTggcmV2aXNpb247CS8qIFJldmlzaW9uIGxldmVsIG9mIHRoZSBzZWN1cml0eSBkZXNjcmlwdG9yLiAqLworCXU4IGFsaWdubWVudDsKKwlTRUNVUklUWV9ERVNDUklQVE9SX0NPTlRST0wgY29udHJvbDsgLyogRmxhZ3MgcXVhbGlmeWluZyB0aGUgdHlwZSBvZgorCQkJICAgdGhlIGRlc2NyaXB0b3IgYXMgd2VsbCBhcyB0aGUgZm9sbG93aW5nIGZpZWxkcy4gKi8KKwlsZTMyIG93bmVyOwkvKiBCeXRlIG9mZnNldCB0byBhIFNJRCByZXByZXNlbnRpbmcgYW4gb2JqZWN0J3MKKwkJCSAgIG93bmVyLiBJZiB0aGlzIGlzIE5VTEwsIG5vIG93bmVyIFNJRCBpcyBwcmVzZW50IGluCisJCQkgICB0aGUgZGVzY3JpcHRvci4gKi8KKwlsZTMyIGdyb3VwOwkvKiBCeXRlIG9mZnNldCB0byBhIFNJRCByZXByZXNlbnRpbmcgYW4gb2JqZWN0J3MKKwkJCSAgIHByaW1hcnkgZ3JvdXAuIElmIHRoaXMgaXMgTlVMTCwgbm8gcHJpbWFyeSBncm91cAorCQkJICAgU0lEIGlzIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IuICovCisJbGUzMiBzYWNsOwkvKiBCeXRlIG9mZnNldCB0byBhIHN5c3RlbSBBQ0wuIE9ubHkgdmFsaWQsIGlmCisJCQkgICBTRV9TQUNMX1BSRVNFTlQgaXMgc2V0IGluIHRoZSBjb250cm9sIGZpZWxkLiBJZgorCQkJICAgU0VfU0FDTF9QUkVTRU5UIGlzIHNldCBidXQgc2FjbCBpcyBOVUxMLCBhIE5VTEwgQUNMCisJCQkgICBpcyBzcGVjaWZpZWQuICovCisJbGUzMiBkYWNsOwkvKiBCeXRlIG9mZnNldCB0byBhIGRpc2NyZXRpb25hcnkgQUNMLiBPbmx5IHZhbGlkLCBpZgorCQkJICAgU0VfREFDTF9QUkVTRU5UIGlzIHNldCBpbiB0aGUgY29udHJvbCBmaWVsZC4gSWYKKwkJCSAgIFNFX0RBQ0xfUFJFU0VOVCBpcyBzZXQgYnV0IGRhY2wgaXMgTlVMTCwgYSBOVUxMIEFDTAorCQkJICAgKHVuY29uZGl0aW9uYWxseSBncmFudGluZyBhY2Nlc3MpIGlzIHNwZWNpZmllZC4gKi8KKy8qIHNpemVvZigpID0gMHgxNCBieXRlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIFNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVMQVRJVkU7CisKKy8qCisgKiBBYnNvbHV0ZSBzZWN1cml0eSBkZXNjcmlwdG9yLiBEb2VzIG5vdCBjb250YWluIHRoZSBvd25lciBhbmQgZ3JvdXAgU0lEcywgbm9yCisgKiB0aGUgc2FjbCBhbmQgZGFjbCBBQ0xzIGluc2lkZSB0aGUgc2VjdXJpdHkgZGVzY3JpcHRvci4gSW5zdGVhZCwgaXQgY29udGFpbnMKKyAqIHBvaW50ZXJzIHRvIHRoZXNlIHN0cnVjdHVyZXMgaW4gbWVtb3J5LiBPYnZpb3VzbHksIGFic29sdXRlIHNlY3VyaXR5CisgKiBkZXNjcmlwdG9ycyBhcmUgb25seSB1c2VmdWwgZm9yIGluIG1lbW9yeSByZXByZXNlbnRhdGlvbnMgb2Ygc2VjdXJpdHkKKyAqIGRlc2NyaXB0b3JzLiBPbiBkaXNrLCBhIHNlbGYtcmVsYXRpdmUgc2VjdXJpdHkgZGVzY3JpcHRvciBpcyB1c2VkLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTggcmV2aXNpb247CS8qIFJldmlzaW9uIGxldmVsIG9mIHRoZSBzZWN1cml0eSBkZXNjcmlwdG9yLiAqLworCXU4IGFsaWdubWVudDsKKwlTRUNVUklUWV9ERVNDUklQVE9SX0NPTlRST0wgY29udHJvbDsJLyogRmxhZ3MgcXVhbGlmeWluZyB0aGUgdHlwZSBvZgorCQkJICAgdGhlIGRlc2NyaXB0b3IgYXMgd2VsbCBhcyB0aGUgZm9sbG93aW5nIGZpZWxkcy4gKi8KKwlTSUQgKm93bmVyOwkvKiBQb2ludHMgdG8gYSBTSUQgcmVwcmVzZW50aW5nIGFuIG9iamVjdCdzIG93bmVyLiBJZgorCQkJICAgdGhpcyBpcyBOVUxMLCBubyBvd25lciBTSUQgaXMgcHJlc2VudCBpbiB0aGUKKwkJCSAgIGRlc2NyaXB0b3IuICovCisJU0lEICpncm91cDsJLyogUG9pbnRzIHRvIGEgU0lEIHJlcHJlc2VudGluZyBhbiBvYmplY3QncyBwcmltYXJ5CisJCQkgICBncm91cC4gSWYgdGhpcyBpcyBOVUxMLCBubyBwcmltYXJ5IGdyb3VwIFNJRCBpcworCQkJICAgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvci4gKi8KKwlBQ0wgKnNhY2w7CS8qIFBvaW50cyB0byBhIHN5c3RlbSBBQ0wuIE9ubHkgdmFsaWQsIGlmCisJCQkgICBTRV9TQUNMX1BSRVNFTlQgaXMgc2V0IGluIHRoZSBjb250cm9sIGZpZWxkLiBJZgorCQkJICAgU0VfU0FDTF9QUkVTRU5UIGlzIHNldCBidXQgc2FjbCBpcyBOVUxMLCBhIE5VTEwgQUNMCisJCQkgICBpcyBzcGVjaWZpZWQuICovCisJQUNMICpkYWNsOwkvKiBQb2ludHMgdG8gYSBkaXNjcmV0aW9uYXJ5IEFDTC4gT25seSB2YWxpZCwgaWYKKwkJCSAgIFNFX0RBQ0xfUFJFU0VOVCBpcyBzZXQgaW4gdGhlIGNvbnRyb2wgZmllbGQuIElmCisJCQkgICBTRV9EQUNMX1BSRVNFTlQgaXMgc2V0IGJ1dCBkYWNsIGlzIE5VTEwsIGEgTlVMTCBBQ0wKKwkJCSAgICh1bmNvbmRpdGlvbmFsbHkgZ3JhbnRpbmcgYWNjZXNzKSBpcyBzcGVjaWZpZWQuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgU0VDVVJJVFlfREVTQ1JJUFRPUjsKKworLyoKKyAqIEN1cnJlbnQgY29uc3RhbnRzIGZvciBzZWN1cml0eSBkZXNjcmlwdG9ycy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwkvKiBDdXJyZW50IHJldmlzaW9uLiAqLworCVNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVWSVNJT04JPSAxLAorCVNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVWSVNJT04xCT0gMSwKKworCS8qIFRoZSBzaXplcyBvZiBib3RoIHRoZSBhYnNvbHV0ZSBhbmQgcmVsYXRpdmUgc2VjdXJpdHkgZGVzY3JpcHRvcnMgaXMKKwkgICB0aGUgc2FtZSBhcyBwb2ludGVycywgYXQgbGVhc3Qgb24gaWEzMiBhcmNoaXRlY3R1cmUgYXJlIDMyLWJpdC4gKi8KKwlTRUNVUklUWV9ERVNDUklQVE9SX01JTl9MRU5HVEgJPSBzaXplb2YoU0VDVVJJVFlfREVTQ1JJUFRPUiksCit9IFNFQ1VSSVRZX0RFU0NSSVBUT1JfQ09OU1RBTlRTOworCisvKgorICogQXR0cmlidXRlOiBTZWN1cml0eSBkZXNjcmlwdG9yICgweDUwKS4gQSBzdGFuZGFyZCBzZWxmLXJlbGF0aXZlIHNlY3VyaXR5CisgKiBkZXNjcmlwdG9yLgorICoKKyAqIE5PVEU6IENhbiBiZSByZXNpZGVudCBvciBub24tcmVzaWRlbnQuCisgKiBOT1RFOiBOb3QgdXNlZCBpbiBOVEZTIDMuMCssIGFzIHNlY3VyaXR5IGRlc2NyaXB0b3JzIGFyZSBzdG9yZWQgY2VudHJhbGx5CisgKiBpbiBGSUxFX1NlY3VyZSBhbmQgdGhlIGNvcnJlY3QgZGVzY3JpcHRvciBpcyBmb3VuZCB1c2luZyB0aGUgc2VjdXJpdHlfaWQKKyAqIGZyb20gdGhlIHN0YW5kYXJkIGluZm9ybWF0aW9uIGF0dHJpYnV0ZS4KKyAqLwordHlwZWRlZiBTRUNVUklUWV9ERVNDUklQVE9SX1JFTEFUSVZFIFNFQ1VSSVRZX0RFU0NSSVBUT1JfQVRUUjsKKworLyoKKyAqIE9uIE5URlMgMy4wKywgYWxsIHNlY3VyaXR5IGRlc2NyaXB0b3JzIGFyZSBzdG9yZWQgaW4gRklMRV9TZWN1cmUuIE9ubHkgb25lCisgKiByZWZlcmVuY2VkIGluc3RhbmNlIG9mIGVhY2ggdW5pcXVlIHNlY3VyaXR5IGRlc2NyaXB0b3IgaXMgc3RvcmVkLgorICoKKyAqIEZJTEVfU2VjdXJlIGNvbnRhaW5zIG5vIHVubmFtZWQgZGF0YSBhdHRyaWJ1dGUsIGkuZS4gaXQgaGFzIHplcm8gbGVuZ3RoLiBJdAorICogZG9lcywgaG93ZXZlciwgY29udGFpbiB0d28gaW5kZXhlcyAoJFNESCBhbmQgJFNJSSkgYXMgd2VsbCBhcyBhIG5hbWVkIGRhdGEKKyAqIHN0cmVhbSAoJFNEUykuCisgKgorICogRXZlcnkgdW5pcXVlIHNlY3VyaXR5IGRlc2NyaXB0b3IgaXMgYXNzaWduZWQgYSB1bmlxdWUgc2VjdXJpdHkgaWRlbnRpZmllcgorICogKHNlY3VyaXR5X2lkLCBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBhIFNJRCkuIFRoZSBzZWN1cml0eV9pZCBpcyB1bmlxdWUgZm9yCisgKiB0aGUgTlRGUyB2b2x1bWUgYW5kIGlzIHVzZWQgYXMgYW4gaW5kZXggaW50byB0aGUgJFNJSSBpbmRleCwgd2hpY2ggbWFwcworICogc2VjdXJpdHlfaWRzIHRvIHRoZSBzZWN1cml0eSBkZXNjcmlwdG9yJ3Mgc3RvcmFnZSBsb2NhdGlvbiB3aXRoaW4gdGhlICRTRFMKKyAqIGRhdGEgYXR0cmlidXRlLiBUaGUgJFNJSSBpbmRleCBpcyBzb3J0ZWQgYnkgYXNjZW5kaW5nIHNlY3VyaXR5X2lkLgorICoKKyAqIEEgc2ltcGxlIGhhc2ggaXMgY29tcHV0ZWQgZnJvbSBlYWNoIHNlY3VyaXR5IGRlc2NyaXB0b3IuIFRoaXMgaGFzaCBpcyB1c2VkCisgKiBhcyBhbiBpbmRleCBpbnRvIHRoZSAkU0RIIGluZGV4LCB3aGljaCBtYXBzIHNlY3VyaXR5IGRlc2NyaXB0b3IgaGFzaGVzIHRvCisgKiB0aGUgc2VjdXJpdHkgZGVzY3JpcHRvcidzIHN0b3JhZ2UgbG9jYXRpb24gd2l0aGluIHRoZSAkU0RTIGRhdGEgYXR0cmlidXRlLgorICogVGhlICRTREggaW5kZXggaXMgc29ydGVkIGJ5IHNlY3VyaXR5IGRlc2NyaXB0b3IgaGFzaCBhbmQgaXMgc3RvcmVkIGluIGEgQisKKyAqIHRyZWUuIFdoZW4gc2VhcmNoaW5nICRTREggKHdpdGggdGhlIGludGVudCBvZiBkZXRlcm1pbmluZyB3aGV0aGVyIG9yIG5vdCBhCisgKiBuZXcgc2VjdXJpdHkgZGVzY3JpcHRvciBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlICRTRFMgZGF0YSBzdHJlYW0pLCBpZiBhCisgKiBtYXRjaGluZyBoYXNoIGlzIGZvdW5kLCBidXQgdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3JzIGRvIG5vdCBtYXRjaCwgdGhlCisgKiBzZWFyY2ggaW4gdGhlICRTREggaW5kZXggaXMgY29udGludWVkLCBzZWFyY2hpbmcgZm9yIGEgbmV4dCBtYXRjaGluZyBoYXNoLgorICoKKyAqIFdoZW4gYSBwcmVjaXNlIG1hdGNoIGlzIGZvdW5kLCB0aGUgc2VjdXJpdHlfaWQgY29yZXNwb25kaW5nIHRvIHRoZSBzZWN1cml0eQorICogZGVzY3JpcHRvciBpbiB0aGUgJFNEUyBhdHRyaWJ1dGUgaXMgcmVhZCBmcm9tIHRoZSBmb3VuZCAkU0RIIGluZGV4IGVudHJ5IGFuZAorICogaXMgc3RvcmVkIGluIHRoZSAkU1RBTkRBUkRfSU5GT1JNQVRJT04gYXR0cmlidXRlIG9mIHRoZSBmaWxlL2RpcmVjdG9yeSB0bworICogd2hpY2ggdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3IgaXMgYmVpbmcgYXBwbGllZC4gVGhlICRTVEFOREFSRF9JTkZPUk1BVElPTgorICogYXR0cmlidXRlIGlzIHByZXNlbnQgaW4gYWxsIGJhc2UgbWZ0IHJlY29yZHMgKGkuZS4gaW4gYWxsIGZpbGVzIGFuZAorICogZGlyZWN0b3JpZXMpLgorICoKKyAqIElmIGEgbWF0Y2ggaXMgbm90IGZvdW5kLCB0aGUgc2VjdXJpdHkgZGVzY3JpcHRvciBpcyBhc3NpZ25lZCBhIG5ldyB1bmlxdWUKKyAqIHNlY3VyaXR5X2lkIGFuZCBpcyBhZGRlZCB0byB0aGUgJFNEUyBkYXRhIGF0dHJpYnV0ZS4gVGhlbiwgZW50cmllcworICogcmVmZXJlbmNpbmcgdGhlIHRoaXMgc2VjdXJpdHkgZGVzY3JpcHRvciBpbiB0aGUgJFNEUyBkYXRhIGF0dHJpYnV0ZSBhcmUKKyAqIGFkZGVkIHRvIHRoZSAkU0RIIGFuZCAkU0lJIGluZGV4ZXMuCisgKgorICogTm90ZTogRW50cmllcyBhcmUgbmV2ZXIgZGVsZXRlZCBmcm9tIEZJTEVfU2VjdXJlLCBldmVuIGlmIG5vdGhpbmcKKyAqIHJlZmVyZW5jZXMgYW4gZW50cnkgYW55IG1vcmUuCisgKi8KKworLyoKKyAqIFRoaXMgaGVhZGVyIHByZWNlZGVzIGVhY2ggc2VjdXJpdHkgZGVzY3JpcHRvciBpbiB0aGUgJFNEUyBkYXRhIHN0cmVhbS4KKyAqIFRoaXMgaXMgYWxzbyB0aGUgaW5kZXggZW50cnkgZGF0YSBwYXJ0IG9mIGJvdGggdGhlICRTSUkgYW5kICRTREggaW5kZXhlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWxlMzIgaGFzaDsJICAvKiBIYXNoIG9mIHRoZSBzZWN1cml0eSBkZXNjcmlwdG9yLiAqLworCWxlMzIgc2VjdXJpdHlfaWQ7IC8qIFRoZSBzZWN1cml0eV9pZCBhc3NpZ25lZCB0byB0aGUgZGVzY3JpcHRvci4gKi8KKwlsZTY0IG9mZnNldDsJICAvKiBCeXRlIG9mZnNldCBvZiB0aGlzIGVudHJ5IGluIHRoZSAkU0RTIHN0cmVhbS4gKi8KKwlsZTMyIGxlbmd0aDsJICAvKiBTaXplIGluIGJ5dGVzIG9mIHRoaXMgZW50cnkgaW4gJFNEUyBzdHJlYW0uICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgU0VDVVJJVFlfREVTQ1JJUFRPUl9IRUFERVI7CisKKy8qCisgKiBUaGUgJFNEUyBkYXRhIHN0cmVhbSBjb250YWlucyB0aGUgc2VjdXJpdHkgZGVzY3JpcHRvcnMsIGFsaWduZWQgb24gMTYtYnl0ZQorICogYm91bmRhcmllcywgc29ydGVkIGJ5IHNlY3VyaXR5X2lkIGluIGEgQisgdHJlZS4gU2VjdXJpdHkgZGVzY3JpcHRvcnMgY2Fubm90CisgKiBjcm9zcyAyNTZraWIgYm91bmRhcmllcyAodGhpcyByZXN0cmljdGlvbiBpcyBpbXBvc2VkIGJ5IHRoZSBXaW5kb3dzIGNhY2hlCisgKiBtYW5hZ2VyKS4gRWFjaCBzZWN1cml0eSBkZXNjcmlwdG9yIGlzIGNvbnRhaW5lZCBpbiBhIFNEU19FTlRSWSBzdHJ1Y3R1cmUuCisgKiBBbHNvLCBlYWNoIHNlY3VyaXR5IGRlc2NyaXB0b3IgaXMgc3RvcmVkIHR3aWNlIGluIHRoZSAkU0RTIHN0cmVhbSB3aXRoIGEKKyAqIGZpeGVkIG9mZnNldCBvZiAweDQwMDAwIGJ5dGVzICgyNTZraWIsIHRoZSBXaW5kb3dzIGNhY2hlIG1hbmFnZXIncyBtYXggc2l6ZSkKKyAqIGJldHdlZW4gdGhlbTsgaS5lLiBpZiBhIFNEU19FTlRSWSBzcGVjaWZpZXMgYW4gb2Zmc2V0IG9mIDB4NTFkMCwgdGhlbiB0aGUKKyAqIHRoZSBmaXJzdCBjb3B5IG9mIHRoZSBzZWN1cml0eSBkZXNjcmlwdG9yIHdpbGwgYmUgYXQgb2Zmc2V0IDB4NTFkMCBpbiB0aGUKKyAqICRTRFMgZGF0YSBzdHJlYW0gYW5kIHRoZSBzZWNvbmQgY29weSB3aWxsIGJlIGF0IG9mZnNldCAweDQ1MWQwLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisvKk9mcyovCisvKiAgMAlTRUNVUklUWV9ERVNDUklQVE9SX0hFQURFUjsgLS0gVW5mb2xkZWQgaGVyZSBhcyBnY2MgZG9lc24ndCBsaWtlCisJCQkJICAgICAgIHVubmFtZWQgc3RydWN0cy4gKi8KKwlsZTMyIGhhc2g7CSAgLyogSGFzaCBvZiB0aGUgc2VjdXJpdHkgZGVzY3JpcHRvci4gKi8KKwlsZTMyIHNlY3VyaXR5X2lkOyAvKiBUaGUgc2VjdXJpdHlfaWQgYXNzaWduZWQgdG8gdGhlIGRlc2NyaXB0b3IuICovCisJbGU2NCBvZmZzZXQ7CSAgLyogQnl0ZSBvZmZzZXQgb2YgdGhpcyBlbnRyeSBpbiB0aGUgJFNEUyBzdHJlYW0uICovCisJbGUzMiBsZW5ndGg7CSAgLyogU2l6ZSBpbiBieXRlcyBvZiB0aGlzIGVudHJ5IGluICRTRFMgc3RyZWFtLiAqLworLyogMjAqLwlTRUNVUklUWV9ERVNDUklQVE9SX1JFTEFUSVZFIHNpZDsgLyogVGhlIHNlbGYtcmVsYXRpdmUgc2VjdXJpdHkKKwkJCQkJICAgICBkZXNjcmlwdG9yLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIFNEU19FTlRSWTsKKworLyoKKyAqIFRoZSBpbmRleCBlbnRyeSBrZXkgdXNlZCBpbiB0aGUgJFNJSSBpbmRleC4gVGhlIGNvbGxhdGlvbiB0eXBlIGlzCisgKiBDT0xMQVRJT05fTlRPRlNfVUxPTkcuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlsZTMyIHNlY3VyaXR5X2lkOyAvKiBUaGUgc2VjdXJpdHlfaWQgYXNzaWduZWQgdG8gdGhlIGRlc2NyaXB0b3IuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgU0lJX0lOREVYX0tFWTsKKworLyoKKyAqIFRoZSBpbmRleCBlbnRyeSBrZXkgdXNlZCBpbiB0aGUgJFNESCBpbmRleC4gVGhlIGtleXMgYXJlIHNvcnRlZCBmaXJzdCBieQorICogaGFzaCBhbmQgdGhlbiBieSBzZWN1cml0eV9pZC4gVGhlIGNvbGxhdGlvbiBydWxlIGlzCisgKiBDT0xMQVRJT05fTlRPRlNfU0VDVVJJVFlfSEFTSC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWxlMzIgaGFzaDsJICAvKiBIYXNoIG9mIHRoZSBzZWN1cml0eSBkZXNjcmlwdG9yLiAqLworCWxlMzIgc2VjdXJpdHlfaWQ7IC8qIFRoZSBzZWN1cml0eV9pZCBhc3NpZ25lZCB0byB0aGUgZGVzY3JpcHRvci4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBTREhfSU5ERVhfS0VZOworCisvKgorICogQXR0cmlidXRlOiBWb2x1bWUgbmFtZSAoMHg2MCkuCisgKgorICogTk9URTogQWx3YXlzIHJlc2lkZW50LgorICogTk9URTogUHJlc2VudCBvbmx5IGluIEZJTEVfVm9sdW1lLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJbnRmc2NoYXIgbmFtZVswXTsJLyogVGhlIG5hbWUgb2YgdGhlIHZvbHVtZSBpbiBVbmljb2RlLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIFZPTFVNRV9OQU1FOworCisvKgorICogUG9zc2libGUgZmxhZ3MgZm9yIHRoZSB2b2x1bWUgKDE2LWJpdCkuCisgKi8KK2VudW0geworCVZPTFVNRV9JU19ESVJUWQkJCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwMDAxKSwKKwlWT0xVTUVfUkVTSVpFX0xPR19GSUxFCQk9IGNvbnN0X2NwdV90b19sZTE2KDB4MDAwMiksCisJVk9MVU1FX1VQR1JBREVfT05fTU9VTlQJCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwMDA0KSwKKwlWT0xVTUVfTU9VTlRFRF9PTl9OVDQJCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwMDA4KSwKKworCVZPTFVNRV9ERUxFVEVfVVNOX1VOREVSV0FZCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwMDEwKSwKKwlWT0xVTUVfUkVQQUlSX09CSkVDVF9JRAkJPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMjApLAorCisJVk9MVU1FX01PRElGSUVEX0JZX0NIS0RTSwk9IGNvbnN0X2NwdV90b19sZTE2KDB4ODAwMCksCisKKwlWT0xVTUVfRkxBR1NfTUFTSwkJPSBjb25zdF9jcHVfdG9fbGUxNigweDgwM2YpLAorCisJLyogVG8gbWFrZSBvdXIgbGlmZSBlYXNpZXIgd2hlbiBjaGVja2luZyBpZiB3ZSBtdXN0IG1vdW50IHJlYWQtb25seS4gKi8KKwlWT0xVTUVfTVVTVF9NT1VOVF9ST19NQVNLCT0gY29uc3RfY3B1X3RvX2xlMTYoMHg4MDM3KSwKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKwordHlwZWRlZiBsZTE2IFZPTFVNRV9GTEFHUzsKKworLyoKKyAqIEF0dHJpYnV0ZTogVm9sdW1lIGluZm9ybWF0aW9uICgweDcwKS4KKyAqCisgKiBOT1RFOiBBbHdheXMgcmVzaWRlbnQuCisgKiBOT1RFOiBQcmVzZW50IG9ubHkgaW4gRklMRV9Wb2x1bWUuCisgKiBOT1RFOiBXaW5kb3dzIDIwMDAgdXNlcyBOVEZTIDMuMCB3aGlsZSBXaW5kb3dzIE5UNCBzZXJ2aWNlIHBhY2sgNmEgdXNlcworICoJIE5URlMgMS4yLiBJIGhhdmVuJ3QgcGVyc29uYWxseSBzZWVuIG90aGVyIHZhbHVlcyB5ZXQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlsZTY0IHJlc2VydmVkOwkJLyogTm90IHVzZWQgKHlldD8pLiAqLworCXU4IG1ham9yX3ZlcjsJCS8qIE1ham9yIHZlcnNpb24gb2YgdGhlIG50ZnMgZm9ybWF0LiAqLworCXU4IG1pbm9yX3ZlcjsJCS8qIE1pbm9yIHZlcnNpb24gb2YgdGhlIG50ZnMgZm9ybWF0LiAqLworCVZPTFVNRV9GTEFHUyBmbGFnczsJLyogQml0IGFycmF5IG9mIFZPTFVNRV8qIGZsYWdzLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIFZPTFVNRV9JTkZPUk1BVElPTjsKKworLyoKKyAqIEF0dHJpYnV0ZTogRGF0YSBhdHRyaWJ1dGUgKDB4ODApLgorICoKKyAqIE5PVEU6IENhbiBiZSByZXNpZGVudCBvciBub24tcmVzaWRlbnQuCisgKgorICogRGF0YSBjb250ZW50cyBvZiBhIGZpbGUgKGkuZS4gdGhlIHVubmFtZWQgc3RyZWFtKSBvciBvZiBhIG5hbWVkIHN0cmVhbS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXU4IGRhdGFbMF07CQkvKiBUaGUgZmlsZSdzIGRhdGEgY29udGVudHMuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgREFUQV9BVFRSOworCisvKgorICogSW5kZXggaGVhZGVyIGZsYWdzICg4LWJpdCkuCisgKi8KK2VudW0geworCS8qCisJICogV2hlbiBpbmRleCBoZWFkZXIgaXMgaW4gYW4gaW5kZXggcm9vdCBhdHRyaWJ1dGU6CisJICovCisJU01BTExfSU5ERVggPSAwLCAvKiBUaGUgaW5kZXggaXMgc21hbGwgZW5vdWdoIHRvIGZpdCBpbnNpZGUgdGhlIGluZGV4CisJCQkgICAgcm9vdCBhdHRyaWJ1dGUgYW5kIHRoZXJlIGlzIG5vIGluZGV4IGFsbG9jYXRpb24KKwkJCSAgICBhdHRyaWJ1dGUgcHJlc2VudC4gKi8KKwlMQVJHRV9JTkRFWCA9IDEsIC8qIFRoZSBpbmRleCBpcyB0b28gbGFyZ2UgdG8gZml0IGluIHRoZSBpbmRleCByb290CisJCQkgICAgYXR0cmlidXRlIGFuZC9vciBhbiBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSBpcworCQkJICAgIHByZXNlbnQuICovCisJLyoKKwkgKiBXaGVuIGluZGV4IGhlYWRlciBpcyBpbiBhbiBpbmRleCBibG9jaywgaS5lLiBpcyBwYXJ0IG9mIGluZGV4CisJICogYWxsb2NhdGlvbiBhdHRyaWJ1dGU6CisJICovCisJTEVBRl9OT0RFICA9IDAsIC8qIFRoaXMgaXMgYSBsZWFmIG5vZGUsIGkuZS4gdGhlcmUgYXJlIG5vIG1vcmUgbm9kZXMKKwkJCSAgIGJyYW5jaGluZyBvZmYgaXQuICovCisJSU5ERVhfTk9ERSA9IDEsIC8qIFRoaXMgbm9kZSBpbmRleGVzIG90aGVyIG5vZGVzLCBpLmUuIGl0IGlzIG5vdCBhIGxlYWYKKwkJCSAgIG5vZGUuICovCisJTk9ERV9NQVNLICA9IDEsIC8qIE1hc2sgZm9yIGFjY2Vzc2luZyB0aGUgKl9OT0RFIGJpdHMuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3R5cGVkZWYgdTggSU5ERVhfSEVBREVSX0ZMQUdTOworCisvKgorICogVGhpcyBpcyB0aGUgaGVhZGVyIGZvciBpbmRleGVzLCBkZXNjcmliaW5nIHRoZSBJTkRFWF9FTlRSWSByZWNvcmRzLCB3aGljaAorICogZm9sbG93IHRoZSBJTkRFWF9IRUFERVIuIFRvZ2V0aGVyIHRoZSBpbmRleCBoZWFkZXIgYW5kIHRoZSBpbmRleCBlbnRyaWVzCisgKiBtYWtlIHVwIGEgY29tcGxldGUgaW5kZXguCisgKgorICogSU1QT1JUQU5UIE5PVEU6IFRoZSBvZmZzZXQsIGxlbmd0aCBhbmQgc2l6ZSBzdHJ1Y3R1cmUgbWVtYmVycyBhcmUgY291bnRlZAorICogcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBpbmRleCBoZWFkZXIgc3RydWN0dXJlIGFuZCBub3QgcmVsYXRpdmUgdG8gdGhlCisgKiBzdGFydCBvZiB0aGUgaW5kZXggcm9vdCBvciBpbmRleCBhbGxvY2F0aW9uIHN0cnVjdHVyZXMgdGhlbXNlbHZlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWxlMzIgZW50cmllc19vZmZzZXQ7CQkvKiBCeXRlIG9mZnNldCB0byBmaXJzdCBJTkRFWF9FTlRSWQorCQkJCQkgICBhbGlnbmVkIHRvIDgtYnl0ZSBib3VuZGFyeS4gKi8KKwlsZTMyIGluZGV4X2xlbmd0aDsJCS8qIERhdGEgc2l6ZSBvZiB0aGUgaW5kZXggaW4gYnl0ZXMsCisJCQkJCSAgIGkuZS4gYnl0ZXMgdXNlZCBmcm9tIGFsbG9jYXRlZAorCQkJCQkgICBzaXplLCBhbGlnbmVkIHRvIDgtYnl0ZSBib3VuZGFyeS4gKi8KKwlsZTMyIGFsbG9jYXRlZF9zaXplOwkJLyogQnl0ZSBzaXplIG9mIHRoaXMgaW5kZXggKGJsb2NrKSwKKwkJCQkJICAgbXVsdGlwbGUgb2YgOCBieXRlcy4gKi8KKwkvKiBOT1RFOiBGb3IgdGhlIGluZGV4IHJvb3QgYXR0cmlidXRlLCB0aGUgYWJvdmUgdHdvIG51bWJlcnMgYXJlIGFsd2F5cworCSAgIGVxdWFsLCBhcyB0aGUgYXR0cmlidXRlIGlzIHJlc2lkZW50IGFuZCBpdCBpcyByZXNpemVkIGFzIG5lZWRlZC4gSW4KKwkgICB0aGUgY2FzZSBvZiB0aGUgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUgdGhlIGF0dHJpYnV0ZSBpcyBub3QKKwkgICByZXNpZGVudCBhbmQgaGVuY2UgdGhlIGFsbG9jYXRlZF9zaXplIGlzIGEgZml4ZWQgdmFsdWUgYW5kIG11c3QKKwkgICBlcXVhbCB0aGUgaW5kZXhfYmxvY2tfc2l6ZSBzcGVjaWZpZWQgYnkgdGhlIElOREVYX1JPT1QgYXR0cmlidXRlCisJICAgY29ycmVzcG9uZGluZyB0byB0aGUgSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgdGhpcyBJTkRFWF9CTE9DSworCSAgIGJlbG9uZ3MgdG8uICovCisJSU5ERVhfSEVBREVSX0ZMQUdTIGZsYWdzOwkvKiBCaXQgZmllbGQgb2YgSU5ERVhfSEVBREVSX0ZMQUdTLiAqLworCXU4IHJlc2VydmVkWzNdOwkJCS8qIFJlc2VydmVkL2FsaWduIHRvIDgtYnl0ZSBib3VuZGFyeS4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBJTkRFWF9IRUFERVI7CisKKy8qCisgKiBBdHRyaWJ1dGU6IEluZGV4IHJvb3QgKDB4OTApLgorICoKKyAqIE5PVEU6IEFsd2F5cyByZXNpZGVudC4KKyAqCisgKiBUaGlzIGlzIGZvbGxvd2VkIGJ5IGEgc2VxdWVuY2Ugb2YgaW5kZXggZW50cmllcyAoSU5ERVhfRU5UUlkgc3RydWN0dXJlcykKKyAqIGFzIGRlc2NyaWJlZCBieSB0aGUgaW5kZXggaGVhZGVyLgorICoKKyAqIFdoZW4gYSBkaXJlY3RvcnkgaXMgc21hbGwgZW5vdWdoIHRvIGZpdCBpbnNpZGUgdGhlIGluZGV4IHJvb3QgdGhlbiB0aGlzCisgKiBpcyB0aGUgb25seSBhdHRyaWJ1dGUgZGVzY3JpYmluZyB0aGUgZGlyZWN0b3J5LiBXaGVuIHRoZSBkaXJlY3RvcnkgaXMgdG9vCisgKiBsYXJnZSB0byBmaXQgaW4gdGhlIGluZGV4IHJvb3QsIG9uIHRoZSBvdGhlciBoYW5kLCB0d28gYWRpdGlvbmFsIGF0dHJpYnV0ZXMKKyAqIGFyZSBwcmVzZW50OiBhbiBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSwgY29udGFpbmluZyBzdWItbm9kZXMgb2YgdGhlIEIrCisgKiBkaXJlY3RvcnkgdHJlZSAoc2VlIGJlbG93KSwgYW5kIGEgYml0bWFwIGF0dHJpYnV0ZSwgZGVzY3JpYmluZyB3aGljaCB2aXJ0dWFsCisgKiBjbHVzdGVyIG51bWJlcnMgKHZjbnMpIGluIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSBhcmUgaW4gdXNlIGJ5IGFuCisgKiBpbmRleCBibG9jay4KKyAqCisgKiBOT1RFOiBUaGUgcm9vdCBkaXJlY3RvcnkgKEZJTEVfcm9vdCkgY29udGFpbnMgYW4gZW50cnkgZm9yIGl0c2VsZi4gT3RoZXIKKyAqIGRpcmNldG9yaWVzIGRvIG5vdCBjb250YWluIGVudHJpZXMgZm9yIHRoZW1zZWx2ZXMsIHRob3VnaC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCUFUVFJfVFlQRSB0eXBlOwkJCS8qIFR5cGUgb2YgdGhlIGluZGV4ZWQgYXR0cmlidXRlLiBJcworCQkJCQkgICAkRklMRV9OQU1FIGZvciBkaXJlY3RvcmllcywgemVybworCQkJCQkgICBmb3IgdmlldyBpbmRleGVzLiBObyBvdGhlciB2YWx1ZXMKKwkJCQkJICAgYWxsb3dlZC4gKi8KKwlDT0xMQVRJT05fUlVMRSBjb2xsYXRpb25fcnVsZTsJLyogQ29sbGF0aW9uIHJ1bGUgdXNlZCB0byBzb3J0IHRoZQorCQkJCQkgICBpbmRleCBlbnRyaWVzLiBJZiB0eXBlIGlzICRGSUxFX05BTUUsCisJCQkJCSAgIHRoaXMgbXVzdCBiZSBDT0xMQVRJT05fRklMRV9OQU1FLiAqLworCWxlMzIgaW5kZXhfYmxvY2tfc2l6ZTsJCS8qIFNpemUgb2YgZWFjaCBpbmRleCBibG9jayBpbiBieXRlcyAoaW4KKwkJCQkJICAgdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlKS4gKi8KKwl1OCBjbHVzdGVyc19wZXJfaW5kZXhfYmxvY2s7CS8qIENsdXN0ZXIgc2l6ZSBvZiBlYWNoIGluZGV4IGJsb2NrIChpbgorCQkJCQkgICB0aGUgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUpLCB3aGVuCisJCQkJCSAgIGFuIGluZGV4IGJsb2NrIGlzID49IHRoYW4gYSBjbHVzdGVyLAorCQkJCQkgICBvdGhlcndpc2UgdGhpcyB3aWxsIGJlIHRoZSBsb2cgb2YKKwkJCQkJICAgdGhlIHNpemUgKGxpa2UgaG93IHRoZSBlbmNvZGluZyBvZgorCQkJCQkgICB0aGUgbWZ0IHJlY29yZCBzaXplIGFuZCB0aGUgaW5kZXgKKwkJCQkJICAgcmVjb3JkIHNpemUgZm91bmQgaW4gdGhlIGJvb3Qgc2VjdG9yCisJCQkJCSAgIHdvcmspLiBIYXMgdG8gYmUgYSBwb3dlciBvZiAyLiAqLworCXU4IHJlc2VydmVkWzNdOwkJCS8qIFJlc2VydmVkL2FsaWduIHRvIDgtYnl0ZSBib3VuZGFyeS4gKi8KKwlJTkRFWF9IRUFERVIgaW5kZXg7CQkvKiBJbmRleCBoZWFkZXIgZGVzY3JpYmluZyB0aGUKKwkJCQkJICAgZm9sbG93aW5nIGluZGV4IGVudHJpZXMuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgSU5ERVhfUk9PVDsKKworLyoKKyAqIEF0dHJpYnV0ZTogSW5kZXggYWxsb2NhdGlvbiAoMHhhMCkuCisgKgorICogTk9URTogQWx3YXlzIG5vbi1yZXNpZGVudCAoZG9lc24ndCBtYWtlIHNlbnNlIHRvIGJlIHJlc2lkZW50IGFueXdheSEpLgorICoKKyAqIFRoaXMgaXMgYW4gYXJyYXkgb2YgaW5kZXggYmxvY2tzLiBFYWNoIGluZGV4IGJsb2NrIHN0YXJ0cyB3aXRoIGFuCisgKiBJTkRFWF9CTE9DSyBzdHJ1Y3R1cmUgY29udGFpbmluZyBhbiBpbmRleCBoZWFkZXIsIGZvbGxvd2VkIGJ5IGEgc2VxdWVuY2Ugb2YKKyAqIGluZGV4IGVudHJpZXMgKElOREVYX0VOVFJZIHN0cnVjdHVyZXMpLCBhcyBkZXNjcmliZWQgYnkgdGhlIElOREVYX0hFQURFUi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworLyogIDAJTlRGU19SRUNPUkQ7IC0tIFVuZm9sZGVkIGhlcmUgYXMgZ2NjIGRvZXNuJ3QgbGlrZSB1bm5hbWVkIHN0cnVjdHMuICovCisJTlRGU19SRUNPUkRfVFlQRSBtYWdpYzsJLyogTWFnaWMgaXMgIklORFgiLiAqLworCWxlMTYgdXNhX29mczsJCS8qIFNlZSBOVEZTX1JFQ09SRCBkZWZpbml0aW9uLiAqLworCWxlMTYgdXNhX2NvdW50OwkJLyogU2VlIE5URlNfUkVDT1JEIGRlZmluaXRpb24uICovCisKKy8qICA4Ki8Jc2xlNjQgbHNuOwkJLyogJExvZ0ZpbGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBsYXN0CisJCQkJICAgbW9kaWZpY2F0aW9uIG9mIHRoaXMgaW5kZXggYmxvY2suICovCisvKiAxNiovCWxlVkNOIGluZGV4X2Jsb2NrX3ZjbjsJLyogVmlydHVhbCBjbHVzdGVyIG51bWJlciBvZiB0aGUgaW5kZXggYmxvY2suCisJCQkJICAgSWYgdGhlIGNsdXN0ZXJfc2l6ZSBvbiB0aGUgdm9sdW1lIGlzIDw9IHRoZQorCQkJCSAgIGluZGV4X2Jsb2NrX3NpemUgb2YgdGhlIGRpcmVjdG9yeSwKKwkJCQkgICBpbmRleF9ibG9ja192Y24gY291bnRzIGluIHVuaXRzIG9mIGNsdXN0ZXJzLAorCQkJCSAgIGFuZCBpbiB1bml0cyBvZiBzZWN0b3JzIG90aGVyd2lzZS4gKi8KKy8qIDI0Ki8JSU5ERVhfSEVBREVSIGluZGV4OwkvKiBEZXNjcmliZXMgdGhlIGZvbGxvd2luZyBpbmRleCBlbnRyaWVzLiAqLworLyogc2l6ZW9mKCk9IDQwICgweDI4KSBieXRlcyAqLworLyoKKyAqIFdoZW4gY3JlYXRpbmcgdGhlIGluZGV4IGJsb2NrLCB3ZSBwbGFjZSB0aGUgdXBkYXRlIHNlcXVlbmNlIGFycmF5IGF0IHRoaXMKKyAqIG9mZnNldCwgaS5lLiBiZWZvcmUgd2Ugc3RhcnQgd2l0aCB0aGUgaW5kZXggZW50cmllcy4gVGhpcyBhbHNvIG1ha2VzIHNlbnNlLAorICogb3RoZXJ3aXNlIHdlIGNvdWxkIHJ1biBpbnRvIHByb2JsZW1zIHdpdGggdGhlIHVwZGF0ZSBzZXF1ZW5jZSBhcnJheQorICogY29udGFpbmluZyBpbiBpdHNlbGYgdGhlIGxhc3QgdHdvIGJ5dGVzIG9mIGEgc2VjdG9yIHdoaWNoIHdvdWxkIG1lYW4gdGhhdAorICogbXVsdGkgc2VjdG9yIHRyYW5zZmVyIHByb3RlY3Rpb24gd291bGRuJ3Qgd29yay4gQXMgeW91IGNhbid0IHByb3RlY3QgZGF0YQorICogYnkgb3ZlcndyaXRpbmcgaXQgc2luY2UgeW91IHRoZW4gY2FuJ3QgZ2V0IGl0IGJhY2suLi4KKyAqIFdoZW4gcmVhZGluZyB1c2UgdGhlIGRhdGEgZnJvbSB0aGUgbnRmcyByZWNvcmQgaGVhZGVyLgorICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgSU5ERVhfQkxPQ0s7CisKK3R5cGVkZWYgSU5ERVhfQkxPQ0sgSU5ERVhfQUxMT0NBVElPTjsKKworLyoKKyAqIFRoZSBzeXN0ZW0gZmlsZSBGSUxFX0V4dGVuZC8kUmVwYXJzZSBjb250YWlucyBhbiBpbmRleCBuYW1lZCAkUiBsaXN0aW5nCisgKiBhbGwgcmVwYXJzZSBwb2ludHMgb24gdGhlIHZvbHVtZS4gVGhlIGluZGV4IGVudHJ5IGtleXMgYXJlIGFzIGRlZmluZWQKKyAqIGJlbG93LiBOb3RlLCB0aGF0IHRoZXJlIGlzIG5vIGluZGV4IGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbmRleCBlbnRyaWVzLgorICoKKyAqIFRoZSBpbmRleCBlbnRyaWVzIGFyZSBzb3J0ZWQgYnkgdGhlIGluZGV4IGtleSBmaWxlX2lkLiBUaGUgY29sbGF0aW9uIHJ1bGUgaXMKKyAqIENPTExBVElPTl9OVE9GU19VTE9OR1MuIEZJWE1FOiBWZXJpZnkgd2hldGhlciB0aGUgcmVwYXJzZV90YWcgaXMgbm90IHRoZQorICogcHJpbWFyeSBrZXkgLyBpcyBub3QgYSBrZXkgYXQgYWxsLiAoQUlBKQorICovCit0eXBlZGVmIHN0cnVjdCB7CisJbGUzMiByZXBhcnNlX3RhZzsJLyogUmVwYXJzZSBwb2ludCB0eXBlIChpbmMuIGZsYWdzKS4gKi8KKwlsZU1GVF9SRUYgZmlsZV9pZDsJLyogTWZ0IHJlY29yZCBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorCQkJCSAgIHJlcGFyc2UgcG9pbnQgYXR0cmlidXRlLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIFJFUEFSU0VfSU5ERVhfS0VZOworCisvKgorICogUXVvdGEgZmxhZ3MgKDMyLWJpdCkuCisgKgorICogVGhlIHVzZXIgcXVvdGEgZmxhZ3MuICBOYW1lcyBleHBsYWluIG1lYW5pbmcuCisgKi8KK2VudW0geworCVFVT1RBX0ZMQUdfREVGQVVMVF9MSU1JVFMJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDAxKSwKKwlRVU9UQV9GTEFHX0xJTUlUX1JFQUNIRUQJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDAyKSwKKwlRVU9UQV9GTEFHX0lEX0RFTEVURUQJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAwNCksCisKKwlRVU9UQV9GTEFHX1VTRVJfTUFTSwkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDA3KSwKKwkvKiBUaGlzIGlzIGEgYml0IG1hc2sgZm9yIHRoZSB1c2VyIHF1b3RhIGZsYWdzLiAqLworCisJLyoKKwkgKiBUaGVzZSBmbGFncyBhcmUgb25seSBwcmVzZW50IGluIHRoZSBxdW90YSBkZWZhdWx0cyBpbmRleCBlbnRyeSwgaS5lLgorCSAqIGluIHRoZSBlbnRyeSB3aGVyZSBvd25lcl9pZCA9IFFVT1RBX0RFRkFVTFRTX0lELgorCSAqLworCVFVT1RBX0ZMQUdfVFJBQ0tJTkdfRU5BQkxFRAk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMTApLAorCVFVT1RBX0ZMQUdfRU5GT1JDRU1FTlRfRU5BQkxFRAk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMjApLAorCVFVT1RBX0ZMQUdfVFJBQ0tJTkdfUkVRVUVTVEVECT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDA0MCksCisJUVVPVEFfRkxBR19MT0dfVEhSRVNIT0xECT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDA4MCksCisKKwlRVU9UQV9GTEFHX0xPR19MSU1JVAkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMTAwKSwKKwlRVU9UQV9GTEFHX09VVF9PRl9EQVRFCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAyMDApLAorCVFVT1RBX0ZMQUdfQ09SUlVQVAkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwNDAwKSwKKwlRVU9UQV9GTEFHX1BFTkRJTkdfREVMRVRFUwk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDA4MDApLAorfTsKKwordHlwZWRlZiBsZTMyIFFVT1RBX0ZMQUdTOworCisvKgorICogVGhlIHN5c3RlbSBmaWxlIEZJTEVfRXh0ZW5kLyRRdW90YSBjb250YWlucyB0d28gaW5kZXhlcyAkTyBhbmQgJFEuIFF1b3RhcworICogYXJlIG9uIGEgcGVyIHZvbHVtZSBhbmQgcGVyIHVzZXIgYmFzaXMuCisgKgorICogVGhlICRRIGluZGV4IGNvbnRhaW5zIG9uZSBlbnRyeSBmb3IgZWFjaCBleGlzdGluZyB1c2VyX2lkIG9uIHRoZSB2b2x1bWUuIFRoZQorICogaW5kZXgga2V5IGlzIHRoZSB1c2VyX2lkIG9mIHRoZSB1c2VyL2dyb3VwIG93bmluZyB0aGlzIHF1b3RhIGNvbnRyb2wgZW50cnksCisgKiBpLmUuIHRoZSBrZXkgaXMgdGhlIG93bmVyX2lkLiBUaGUgdXNlcl9pZCBvZiB0aGUgb3duZXIgb2YgYSBmaWxlLCBpLmUuIHRoZQorICogb3duZXJfaWQsIGlzIGZvdW5kIGluIHRoZSBzdGFuZGFyZCBpbmZvcm1hdGlvbiBhdHRyaWJ1dGUuIFRoZSBjb2xsYXRpb24gcnVsZQorICogZm9yICRRIGlzIENPTExBVElPTl9OVE9GU19VTE9ORy4KKyAqCisgKiBUaGUgJE8gaW5kZXggY29udGFpbnMgb25lIGVudHJ5IGZvciBlYWNoIHVzZXIvZ3JvdXAgd2hvIGhhcyBiZWVuIGFzc2lnbmVkCisgKiBhIHF1b3RhIG9uIHRoYXQgdm9sdW1lLiBUaGUgaW5kZXgga2V5IGhvbGRzIHRoZSBTSUQgb2YgdGhlIHVzZXJfaWQgdGhlCisgKiBlbnRyeSBiZWxvbmdzIHRvLCBpLmUuIHRoZSBvd25lcl9pZC4gVGhlIGNvbGxhdGlvbiBydWxlIGZvciAkTyBpcworICogQ09MTEFUSU9OX05UT0ZTX1NJRC4KKyAqCisgKiBUaGUgJE8gaW5kZXggZW50cnkgZGF0YSBpcyB0aGUgdXNlcl9pZCBvZiB0aGUgdXNlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBTSUQuCisgKiBUaGlzIHVzZXJfaWQgaXMgdXNlZCBhcyBhbiBpbmRleCBpbnRvICRRIHRvIGZpbmQgdGhlIHF1b3RhIGNvbnRyb2wgZW50cnkKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgU0lELgorICoKKyAqIFRoZSAkUSBpbmRleCBlbnRyeSBkYXRhIGlzIHRoZSBxdW90YSBjb250cm9sIGVudHJ5IGFuZCBpcyBkZWZpbmVkIGJlbG93LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJbGUzMiB2ZXJzaW9uOwkJLyogQ3VycmVudGx5IGVxdWFscyAyLiAqLworCVFVT1RBX0ZMQUdTIGZsYWdzOwkvKiBGbGFncyBkZXNjcmliaW5nIHRoaXMgcXVvdGEgZW50cnkuICovCisJbGU2NCBieXRlc191c2VkOwkvKiBIb3cgbWFueSBieXRlcyBvZiB0aGUgcXVvdGEgYXJlIGluIHVzZS4gKi8KKwlzbGU2NCBjaGFuZ2VfdGltZTsJLyogTGFzdCB0aW1lIHRoaXMgcXVvdGEgZW50cnkgd2FzIGNoYW5nZWQuICovCisJc2xlNjQgdGhyZXNob2xkOwkvKiBTb2Z0IHF1b3RhICgtMSBpZiBub3QgbGltaXRlZCkuICovCisJc2xlNjQgbGltaXQ7CQkvKiBIYXJkIHF1b3RhICgtMSBpZiBub3QgbGltaXRlZCkuICovCisJc2xlNjQgZXhjZWVkZWRfdGltZTsJLyogSG93IGxvbmcgdGhlIHNvZnQgcXVvdGEgaGFzIGJlZW4gZXhjZWVkZWQuICovCisJU0lEIHNpZDsJCS8qIFRoZSBTSUQgb2YgdGhlIHVzZXIvb2JqZWN0IGFzc29jaWF0ZWQgd2l0aAorCQkJCSAgIHRoaXMgcXVvdGEgZW50cnkuICBFcXVhbHMgemVybyBmb3IgdGhlIHF1b3RhCisJCQkJICAgZGVmYXVsdHMgZW50cnkgKGFuZCBpbiBmYWN0IG9uIGEgV2luWFAKKwkJCQkgICB2b2x1bWUsIGl0IGlzIG5vdCBwcmVzZW50IGF0IGFsbCkuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgUVVPVEFfQ09OVFJPTF9FTlRSWTsKKworLyoKKyAqIFByZWRlZmluZWQgb3duZXJfaWQgdmFsdWVzICgzMi1iaXQpLgorICovCitlbnVtIHsKKwlRVU9UQV9JTlZBTElEX0lECT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMCksCisJUVVPVEFfREVGQVVMVFNfSUQJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDAxKSwKKwlRVU9UQV9GSVJTVF9VU0VSX0lECT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDEwMCksCit9OworCisvKgorICogQ3VycmVudCBjb25zdGFudHMgZm9yIHF1b3RhIGNvbnRyb2wgZW50cmllcy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwkvKiBDdXJyZW50IHZlcnNpb24uICovCisJUVVPVEFfVkVSU0lPTgk9IDIsCit9IFFVT1RBX0NPTlRST0xfRU5UUllfQ09OU1RBTlRTOworCisvKgorICogSW5kZXggZW50cnkgZmxhZ3MgKDE2LWJpdCkuCisgKi8KK2VudW0geworCUlOREVYX0VOVFJZX05PREUgPSBjb25zdF9jcHVfdG9fbGUxNigxKSwgLyogVGhpcyBlbnRyeSBjb250YWlucyBhCisJCQlzdWItbm9kZSwgaS5lLiBhIHJlZmVyZW5jZSB0byBhbiBpbmRleCBibG9jayBpbiBmb3JtIG9mCisJCQlhIHZpcnR1YWwgY2x1c3RlciBudW1iZXIgKHNlZSBiZWxvdykuICovCisJSU5ERVhfRU5UUllfRU5EICA9IGNvbnN0X2NwdV90b19sZTE2KDIpLCAvKiBUaGlzIHNpZ25pZmllcyB0aGUgbGFzdAorCQkJZW50cnkgaW4gYW4gaW5kZXggYmxvY2suICBUaGUgaW5kZXggZW50cnkgZG9lcyBub3QKKwkJCXJlcHJlc2VudCBhIGZpbGUgYnV0IGl0IGNhbiBwb2ludCB0byBhIHN1Yi1ub2RlLiAqLworCisJSU5ERVhfRU5UUllfU1BBQ0VfRklMTEVSID0gY29uc3RfY3B1X3RvX2xlMTYoMHhmZmZmKSwgLyogZ2NjOiBGb3JjZQorCQkJZW51bSBiaXQgd2lkdGggdG8gMTYtYml0LiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCit0eXBlZGVmIGxlMTYgSU5ERVhfRU5UUllfRkxBR1M7CisKKy8qCisgKiBUaGlzIHRoZSBpbmRleCBlbnRyeSBoZWFkZXIgKHNlZSBiZWxvdykuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKy8qICAwKi8JdW5pb24geworCQlzdHJ1Y3QgeyAvKiBPbmx5IHZhbGlkIHdoZW4gSU5ERVhfRU5UUllfRU5EIGlzIG5vdCBzZXQuICovCisJCQlsZU1GVF9SRUYgaW5kZXhlZF9maWxlOwkvKiBUaGUgbWZ0IHJlZmVyZW5jZSBvZiB0aGUgZmlsZQorCQkJCQkJICAgZGVzY3JpYmVkIGJ5IHRoaXMgaW5kZXgKKwkJCQkJCSAgIGVudHJ5LiBVc2VkIGZvciBkaXJlY3RvcnkKKwkJCQkJCSAgIGluZGV4ZXMuICovCisJCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBkaXI7CisJCXN0cnVjdCB7IC8qIFVzZWQgZm9yIHZpZXdzL2luZGV4ZXMgdG8gZmluZCB0aGUgZW50cnkncyBkYXRhLiAqLworCQkJbGUxNiBkYXRhX29mZnNldDsJLyogRGF0YSBieXRlIG9mZnNldCBmcm9tIHRoaXMKKwkJCQkJCSAgIElOREVYX0VOVFJZLiBGb2xsb3dzIHRoZQorCQkJCQkJICAgaW5kZXgga2V5LiAqLworCQkJbGUxNiBkYXRhX2xlbmd0aDsJLyogRGF0YSBsZW5ndGggaW4gYnl0ZXMuICovCisJCQlsZTMyIHJlc2VydmVkVjsJCS8qIFJlc2VydmVkICh6ZXJvKS4gKi8KKwkJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHZpOworCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBkYXRhOworLyogIDgqLwlsZTE2IGxlbmd0aDsJCSAvKiBCeXRlIHNpemUgb2YgdGhpcyBpbmRleCBlbnRyeSwgbXVsdGlwbGUgb2YKKwkJCQkgICAgOC1ieXRlcy4gKi8KKy8qIDEwKi8JbGUxNiBrZXlfbGVuZ3RoOwkgLyogQnl0ZSBzaXplIG9mIHRoZSBrZXkgdmFsdWUsIHdoaWNoIGlzIGluIHRoZQorCQkJCSAgICBpbmRleCBlbnRyeS4gSXQgZm9sbG93cyBmaWVsZCByZXNlcnZlZC4gTm90CisJCQkJICAgIG11bHRpcGxlIG9mIDgtYnl0ZXMuICovCisvKiAxMiovCUlOREVYX0VOVFJZX0ZMQUdTIGZsYWdzOyAvKiBCaXQgZmllbGQgb2YgSU5ERVhfRU5UUllfKiBmbGFncy4gKi8KKy8qIDE0Ki8JbGUxNiByZXNlcnZlZDsJCSAvKiBSZXNlcnZlZC9hbGlnbiB0byA4LWJ5dGUgYm91bmRhcnkuICovCisvKiBzaXplb2YoKSA9IDE2IGJ5dGVzICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgSU5ERVhfRU5UUllfSEVBREVSOworCisvKgorICogVGhpcyBpcyBhbiBpbmRleCBlbnRyeS4gQSBzZXF1ZW5jZSBvZiBzdWNoIGVudHJpZXMgZm9sbG93cyBlYWNoIElOREVYX0hFQURFUgorICogc3RydWN0dXJlLiBUb2dldGhlciB0aGV5IG1ha2UgdXAgYSBjb21wbGV0ZSBpbmRleC4gVGhlIGluZGV4IGZvbGxvd3MgZWl0aGVyCisgKiBhbiBpbmRleCByb290IGF0dHJpYnV0ZSBvciBhbiBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZS4KKyAqCisgKiBOT1RFOiBCZWZvcmUgTlRGUyAzLjAgb25seSBmaWxlbmFtZSBhdHRyaWJ1dGVzIHdlcmUgaW5kZXhlZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworLypPZnMqLworLyogIDAJSU5ERVhfRU5UUllfSEVBREVSOyAtLSBVbmZvbGRlZCBoZXJlIGFzIGdjYyBkaXNsaWtlcyB1bm5hbWVkIHN0cnVjdHMuICovCisJdW5pb24geworCQlzdHJ1Y3QgeyAvKiBPbmx5IHZhbGlkIHdoZW4gSU5ERVhfRU5UUllfRU5EIGlzIG5vdCBzZXQuICovCisJCQlsZU1GVF9SRUYgaW5kZXhlZF9maWxlOwkvKiBUaGUgbWZ0IHJlZmVyZW5jZSBvZiB0aGUgZmlsZQorCQkJCQkJICAgZGVzY3JpYmVkIGJ5IHRoaXMgaW5kZXgKKwkJCQkJCSAgIGVudHJ5LiBVc2VkIGZvciBkaXJlY3RvcnkKKwkJCQkJCSAgIGluZGV4ZXMuICovCisJCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBkaXI7CisJCXN0cnVjdCB7IC8qIFVzZWQgZm9yIHZpZXdzL2luZGV4ZXMgdG8gZmluZCB0aGUgZW50cnkncyBkYXRhLiAqLworCQkJbGUxNiBkYXRhX29mZnNldDsJLyogRGF0YSBieXRlIG9mZnNldCBmcm9tIHRoaXMKKwkJCQkJCSAgIElOREVYX0VOVFJZLiBGb2xsb3dzIHRoZQorCQkJCQkJICAgaW5kZXgga2V5LiAqLworCQkJbGUxNiBkYXRhX2xlbmd0aDsJLyogRGF0YSBsZW5ndGggaW4gYnl0ZXMuICovCisJCQlsZTMyIHJlc2VydmVkVjsJCS8qIFJlc2VydmVkICh6ZXJvKS4gKi8KKwkJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHZpOworCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBkYXRhOworCWxlMTYgbGVuZ3RoOwkJIC8qIEJ5dGUgc2l6ZSBvZiB0aGlzIGluZGV4IGVudHJ5LCBtdWx0aXBsZSBvZgorCQkJCSAgICA4LWJ5dGVzLiAqLworCWxlMTYga2V5X2xlbmd0aDsJIC8qIEJ5dGUgc2l6ZSBvZiB0aGUga2V5IHZhbHVlLCB3aGljaCBpcyBpbiB0aGUKKwkJCQkgICAgaW5kZXggZW50cnkuIEl0IGZvbGxvd3MgZmllbGQgcmVzZXJ2ZWQuIE5vdAorCQkJCSAgICBtdWx0aXBsZSBvZiA4LWJ5dGVzLiAqLworCUlOREVYX0VOVFJZX0ZMQUdTIGZsYWdzOyAvKiBCaXQgZmllbGQgb2YgSU5ERVhfRU5UUllfKiBmbGFncy4gKi8KKwlsZTE2IHJlc2VydmVkOwkJIC8qIFJlc2VydmVkL2FsaWduIHRvIDgtYnl0ZSBib3VuZGFyeS4gKi8KKworLyogMTYqLwl1bmlvbiB7CQkvKiBUaGUga2V5IG9mIHRoZSBpbmRleGVkIGF0dHJpYnV0ZS4gTk9URTogT25seSBwcmVzZW50CisJCQkgICBpZiBJTkRFWF9FTlRSWV9FTkQgYml0IGluIGZsYWdzIGlzIG5vdCBzZXQuIE5PVEU6IE9uCisJCQkgICBOVEZTIHZlcnNpb25zIGJlZm9yZSAzLjAgdGhlIG9ubHkgdmFsaWQga2V5IGlzIHRoZQorCQkJICAgRklMRV9OQU1FX0FUVFIuIE9uIE5URlMgMy4wKyB0aGUgZm9sbG93aW5nCisJCQkgICBhZGRpdGlvbmFsIGluZGV4IGtleXMgYXJlIGRlZmluZWQ6ICovCisJCUZJTEVfTkFNRV9BVFRSIGZpbGVfbmFtZTsvKiAkSTMwIGluZGV4IGluIGRpcmVjdG9yaWVzLiAqLworCQlTSUlfSU5ERVhfS0VZIHNpaTsJLyogJFNJSSBpbmRleCBpbiAkU2VjdXJlLiAqLworCQlTREhfSU5ERVhfS0VZIHNkaDsJLyogJFNESCBpbmRleCBpbiAkU2VjdXJlLiAqLworCQlHVUlEIG9iamVjdF9pZDsJCS8qICRPIGluZGV4IGluIEZJTEVfRXh0ZW5kLyRPYmpJZDogVGhlCisJCQkJCSAgIG9iamVjdF9pZCBvZiB0aGUgbWZ0IHJlY29yZCBmb3VuZCBpbgorCQkJCQkgICB0aGUgZGF0YSBwYXJ0IG9mIHRoZSBpbmRleC4gKi8KKwkJUkVQQVJTRV9JTkRFWF9LRVkgcmVwYXJzZTsJLyogJFIgaW5kZXggaW4KKwkJCQkJCSAgIEZJTEVfRXh0ZW5kLyRSZXBhcnNlLiAqLworCQlTSUQgc2lkOwkJLyogJE8gaW5kZXggaW4gRklMRV9FeHRlbmQvJFF1b3RhOgorCQkJCQkgICBTSUQgb2YgdGhlIG93bmVyIG9mIHRoZSB1c2VyX2lkLiAqLworCQlsZTMyIG93bmVyX2lkOwkJLyogJFEgaW5kZXggaW4gRklMRV9FeHRlbmQvJFF1b3RhOgorCQkJCQkgICB1c2VyX2lkIG9mIHRoZSBvd25lciBvZiB0aGUgcXVvdGEKKwkJCQkJICAgY29udHJvbCBlbnRyeSBpbiB0aGUgZGF0YSBwYXJ0IG9mCisJCQkJCSAgIHRoZSBpbmRleC4gKi8KKwl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkga2V5OworCS8qIFRoZSAob3B0aW9uYWwpIGluZGV4IGRhdGEgaXMgaW5zZXJ0ZWQgaGVyZSB3aGVuIGNyZWF0aW5nLiAqLworCS8vIGxlVkNOIHZjbjsJLyogSWYgSU5ERVhfRU5UUllfTk9ERSBiaXQgaW4gZmxhZ3MgaXMgc2V0LCB0aGUgbGFzdAorCS8vCQkgICBlaWdodCBieXRlcyBvZiB0aGlzIGluZGV4IGVudHJ5IGNvbnRhaW4gdGhlIHZpcnR1YWwKKwkvLwkJICAgY2x1c3RlciBudW1iZXIgb2YgdGhlIGluZGV4IGJsb2NrIHRoYXQgaG9sZHMgdGhlCisJLy8JCSAgIGVudHJpZXMgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHRoZSBjdXJyZW50IGVudHJ5ICh0aGUKKwkvLwkJICAgdmNuIHJlZmVyZW5jZXMgdGhlIGNvcnJlc3BvbmRpbmcgY2x1c3RlciBpbiB0aGUgZGF0YQorCS8vCQkgICBvZiB0aGUgbm9uLXJlc2lkZW50IGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlKS4gSWYKKwkvLwkJICAgdGhlIGtleV9sZW5ndGggaXMgemVybywgdGhlbiB0aGUgdmNuIGltbWVkaWF0ZWx5CisJLy8JCSAgIGZvbGxvd3MgdGhlIElOREVYX0VOVFJZX0hFQURFUi4gUmVnYXJkbGVzcyBvZgorCS8vCQkgICBrZXlfbGVuZ3RoLCB0aGUgYWRkcmVzcyBvZiB0aGUgOC1ieXRlIGJvdW5kYXJ5CisJLy8JCSAgIGFsbGlnbmVkIHZjbiBvZiBJTkRFWF9FTlRSWXtfSEVBREVSfSAqaWUgaXMgZ2l2ZW4gYnkKKwkvLwkJICAgKGNoYXIqKWllICsgbGUxNl90b19jcHUoaWUqKS0+bGVuZ3RoKSAtIHNpemVvZihWQ04pLAorCS8vCQkgICB3aGVyZSBzaXplb2YoVkNOKSBjYW4gYmUgaGFyZGNvZGVkIGFzIDggaWYgd2FudGVkLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIElOREVYX0VOVFJZOworCisvKgorICogQXR0cmlidXRlOiBCaXRtYXAgKDB4YjApLgorICoKKyAqIENvbnRhaW5zIGFuIGFycmF5IG9mIGJpdHMgKGFrYSBhIGJpdGZpZWxkKS4KKyAqCisgKiBXaGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUsIGVhY2ggYml0CisgKiBjb3JyZXNwb25kcyB0byBvbmUgaW5kZXggYmxvY2sgd2l0aGluIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZS4gVGh1cworICogdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBiaXRtYXAgKiBpbmRleCBibG9jayBzaXplIC8gY2x1c3RlciBzaXplIGlzIHRoZQorICogbnVtYmVyIG9mIGNsdXN0ZXJzIGluIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXU4IGJpdG1hcFswXTsJCQkvKiBBcnJheSBvZiBiaXRzLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIEJJVE1BUF9BVFRSOworCisvKgorICogVGhlIHJlcGFyc2UgcG9pbnQgdGFnIGRlZmluZXMgdGhlIHR5cGUgb2YgdGhlIHJlcGFyc2UgcG9pbnQuIEl0IGFsc28KKyAqIGluY2x1ZGVzIHNldmVyYWwgZmxhZ3MsIHdoaWNoIGZ1cnRoZXIgZGVzY3JpYmUgdGhlIHJlcGFyc2UgcG9pbnQuCisgKgorICogVGhlIHJlcGFyc2UgcG9pbnQgdGFnIGlzIGFuIHVuc2lnbmVkIDMyLWJpdCB2YWx1ZSBkaXZpZGVkIGluIHRocmVlIHBhcnRzOgorICoKKyAqIDEuIFRoZSBsZWFzdCBzaWduaWZpY2FudCAxNiBiaXRzIChpLmUuIGJpdHMgMCB0byAxNSkgc3BlY2lmaXkgdGhlIHR5cGUgb2YKKyAqICAgIHRoZSByZXBhcnNlIHBvaW50LgorICogMi4gVGhlIDEzIGJpdHMgYWZ0ZXIgdGhpcyAoaS5lLiBiaXRzIDE2IHRvIDI4KSBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCisgKiAzLiBUaGUgbW9zdCBzaWduaWZpY2FudCB0aHJlZSBiaXRzIGFyZSBmbGFncyBkZXNjcmliaW5nIHRoZSByZXBhcnNlIHBvaW50LgorICogICAgVGhleSBhcmUgZGVmaW5lZCBhcyBmb2xsb3dzOgorICoJYml0IDI5OiBOYW1lIHN1cnJvZ2F0ZSBiaXQuIElmIHNldCwgdGhlIGZpbGVuYW1lIGlzIGFuIGFsaWFzIGZvcgorICoJCWFub3RoZXIgb2JqZWN0IGluIHRoZSBzeXN0ZW0uCisgKgliaXQgMzA6IEhpZ2gtbGF0ZW5jeSBiaXQuIElmIHNldCwgYWNjZXNzaW5nIHRoZSBmaXJzdCBieXRlIG9mIGRhdGEgd2lsbAorICoJCWJlIHNsb3cuIChFLmcuIHRoZSBkYXRhIGlzIHN0b3JlZCBvbiBhIHRhcGUgZHJpdmUuKQorICoJYml0IDMxOiBNaWNyb3NvZnQgYml0LiBJZiBzZXQsIHRoZSB0YWcgaXMgb3duZWQgYnkgTWljcm9zb2Z0LiBVc2VyCisgKgkJZGVmaW5lZCB0YWdzIGhhdmUgdG8gdXNlIHplcm8gaGVyZS4KKyAqCisgKiBUaGVzZSBhcmUgdGhlIHByZWRlZmluZWQgcmVwYXJzZSBwb2ludCB0YWdzOgorICovCitlbnVtIHsKKwlJT19SRVBBUlNFX1RBR19JU19BTElBUwkJPSBjb25zdF9jcHVfdG9fbGUzMigweDIwMDAwMDAwKSwKKwlJT19SRVBBUlNFX1RBR19JU19ISUdIX0xBVEVOQ1kJPSBjb25zdF9jcHVfdG9fbGUzMigweDQwMDAwMDAwKSwKKwlJT19SRVBBUlNFX1RBR19JU19NSUNST1NPRlQJPSBjb25zdF9jcHVfdG9fbGUzMigweDgwMDAwMDAwKSwKKworCUlPX1JFUEFSU0VfVEFHX1JFU0VSVkVEX1pFUk8JPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDAwKSwKKwlJT19SRVBBUlNFX1RBR19SRVNFUlZFRF9PTkUJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDAxKSwKKwlJT19SRVBBUlNFX1RBR19SRVNFUlZFRF9SQU5HRQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDEpLAorCisJSU9fUkVQQVJTRV9UQUdfTlNTCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4NjgwMDAwMDUpLAorCUlPX1JFUEFSU0VfVEFHX05TU19SRUNPVkVSCT0gY29uc3RfY3B1X3RvX2xlMzIoMHg2ODAwMDAwNiksCisJSU9fUkVQQVJTRV9UQUdfU0lTCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4NjgwMDAwMDcpLAorCUlPX1JFUEFSU0VfVEFHX0RGUwkJPSBjb25zdF9jcHVfdG9fbGUzMigweDY4MDAwMDA4KSwKKworCUlPX1JFUEFSU0VfVEFHX01PVU5UX1BPSU5UCT0gY29uc3RfY3B1X3RvX2xlMzIoMHg4ODAwMDAwMyksCisKKwlJT19SRVBBUlNFX1RBR19IU00JCT0gY29uc3RfY3B1X3RvX2xlMzIoMHhhODAwMDAwNCksCisKKwlJT19SRVBBUlNFX1RBR19TWU1CT0xJQ19MSU5LCT0gY29uc3RfY3B1X3RvX2xlMzIoMHhlODAwMDAwMCksCisKKwlJT19SRVBBUlNFX1RBR19WQUxJRF9WQUxVRVMJPSBjb25zdF9jcHVfdG9fbGUzMigweGUwMDBmZmZmKSwKK307CisKKy8qCisgKiBBdHRyaWJ1dGU6IFJlcGFyc2UgcG9pbnQgKDB4YzApLgorICoKKyAqIE5PVEU6IENhbiBiZSByZXNpZGVudCBvciBub24tcmVzaWRlbnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlsZTMyIHJlcGFyc2VfdGFnOwkJLyogUmVwYXJzZSBwb2ludCB0eXBlIChpbmMuIGZsYWdzKS4gKi8KKwlsZTE2IHJlcGFyc2VfZGF0YV9sZW5ndGg7CS8qIEJ5dGUgc2l6ZSBvZiByZXBhcnNlIGRhdGEuICovCisJbGUxNiByZXNlcnZlZDsJCQkvKiBBbGlnbiB0byA4LWJ5dGUgYm91bmRhcnkuICovCisJdTggcmVwYXJzZV9kYXRhWzBdOwkJLyogTWVhbmluZyBkZXBlbmRzIG9uIHJlcGFyc2VfdGFnLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIFJFUEFSU0VfUE9JTlQ7CisKKy8qCisgKiBBdHRyaWJ1dGU6IEV4dGVuZGVkIGF0dHJpYnV0ZSAoRUEpIGluZm9ybWF0aW9uICgweGQwKS4KKyAqCisgKiBOT1RFOiBBbHdheXMgcmVzaWRlbnQuIChJcyB0aGlzIHRydWU/Pz8pCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlsZTE2IGVhX2xlbmd0aDsJCS8qIEJ5dGUgc2l6ZSBvZiB0aGUgcGFja2VkIGV4dGVuZGVkCisJCQkJICAgYXR0cmlidXRlcy4gKi8KKwlsZTE2IG5lZWRfZWFfY291bnQ7CS8qIFRoZSBudW1iZXIgb2YgZXh0ZW5kZWQgYXR0cmlidXRlcyB3aGljaCBoYXZlCisJCQkJICAgdGhlIE5FRURfRUEgYml0IHNldC4gKi8KKwlsZTMyIGVhX3F1ZXJ5X2xlbmd0aDsJLyogQnl0ZSBzaXplIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQgdG8gcXVlcnkKKwkJCQkgICB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlcyB3aGVuIGNhbGxpbmcKKwkJCQkgICBad1F1ZXJ5RWFGaWxlKCkgaW4gV2luZG93cyBOVC8yay4gSS5lLiB0aGUKKwkJCQkgICBieXRlIHNpemUgb2YgdGhlIHVucGFja2VkIGV4dGVuZGVkCisJCQkJICAgYXR0cmlidXRlcy4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBFQV9JTkZPUk1BVElPTjsKKworLyoKKyAqIEV4dGVuZGVkIGF0dHJpYnV0ZSBmbGFncyAoOC1iaXQpLgorICovCitlbnVtIHsKKwlORUVEX0VBCT0gMHg4MAorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCit0eXBlZGVmIHU4IEVBX0ZMQUdTOworCisvKgorICogQXR0cmlidXRlOiBFeHRlbmRlZCBhdHRyaWJ1dGUgKEVBKSAoMHhlMCkuCisgKgorICogTk9URTogQWx3YXlzIG5vbi1yZXNpZGVudC4gKElzIHRoaXMgdHJ1ZT8pCisgKgorICogTGlrZSB0aGUgYXR0cmlidXRlIGxpc3QgYW5kIHRoZSBpbmRleCBidWZmZXIgbGlzdCwgdGhlIEVBIGF0dHJpYnV0ZSB2YWx1ZSBpcworICogYSBzZXF1ZW5jZSBvZiBFQV9BVFRSIHZhcmlhYmxlIGxlbmd0aCByZWNvcmRzLgorICoKKyAqIEZJWE1FOiBJdCBhcHBlYXJzIHdlaXJkIHRoYXQgdGhlIEVBIG5hbWUgaXMgbm90IHVuaWNvZGUuIElzIGl0IHRydWU/CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlsZTMyIG5leHRfZW50cnlfb2Zmc2V0OwkvKiBPZmZzZXQgdG8gdGhlIG5leHQgRUFfQVRUUi4gKi8KKwlFQV9GTEFHUyBmbGFnczsJCS8qIEZsYWdzIGRlc2NyaWJpbmcgdGhlIEVBLiAqLworCXU4IGVhX25hbWVfbGVuZ3RoOwkvKiBMZW5ndGggb2YgdGhlIG5hbWUgb2YgdGhlIEVBIGluIGJ5dGVzLiAqLworCWxlMTYgZWFfdmFsdWVfbGVuZ3RoOwkvKiBCeXRlIHNpemUgb2YgdGhlIEVBJ3MgdmFsdWUuICovCisJdTggZWFfbmFtZVswXTsJCS8qIE5hbWUgb2YgdGhlIEVBLiAqLworCXU4IGVhX3ZhbHVlWzBdOwkJLyogVGhlIHZhbHVlIG9mIHRoZSBFQS4gSW1tZWRpYXRlbHkgZm9sbG93cworCQkJCSAgIHRoZSBuYW1lLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIEVBX0FUVFI7CisKKy8qCisgKiBBdHRyaWJ1dGU6IFByb3BlcnR5IHNldCAoMHhmMCkuCisgKgorICogSW50ZW5kZWQgdG8gc3VwcG9ydCBOYXRpdmUgU3RydWN0dXJlIFN0b3JhZ2UgKE5TUykgLSBhIGZlYXR1cmUgcmVtb3ZlZCBmcm9tCisgKiBOVEZTIDMuMCBkdXJpbmcgYmV0YSB0ZXN0aW5nLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyogSXJyZWxldmFudCBhcyBmZWF0dXJlIHVudXNlZC4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBQUk9QRVJUWV9TRVQ7CisKKy8qCisgKiBBdHRyaWJ1dGU6IExvZ2dlZCB1dGlsaXR5IHN0cmVhbSAoMHgxMDApLgorICoKKyAqIE5PVEU6IENhbiBiZSByZXNpZGVudCBvciBub24tcmVzaWRlbnQuCisgKgorICogT3BlcmF0aW9ucyBvbiB0aGlzIGF0dHJpYnV0ZSBhcmUgbG9nZ2VkIHRvIHRoZSBqb3VybmFsICgkTG9nRmlsZSkgbGlrZQorICogbm9ybWFsIG1ldGFkYXRhIGNoYW5nZXMuCisgKgorICogVXNlZCBieSB0aGUgRW5jcnlwdGluZyBGaWxlIFN5c3RlbSAoRUZTKS4gQWxsIGVuY3J5cHRlZCBmaWxlcyBoYXZlIHRoaXMKKyAqIGF0dHJpYnV0ZSB3aXRoIHRoZSBuYW1lICRFRlMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBDYW4gYmUgYW55dGhpbmcgdGhlIGNyZWF0b3IgY2hvb3Nlcy4gKi8KKwkvKiBFRlMgdXNlcyBpdCBhcyBmb2xsb3dzOiAqLworCS8vIEZJWE1FOiBUeXBlIHRoaXMgaW5mbywgdmVyaWZ5aW5nIGl0IGFsb25nIHRoZSB3YXkuIChBSUEpCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgTE9HR0VEX1VUSUxJVFlfU1RSRUFNLCBFRlNfQVRUUjsKKworI2VuZGlmIC8qIF9MSU5VWF9OVEZTX0xBWU9VVF9IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2xjbmFsbG9jLmMgYi9mcy9udGZzL2xjbmFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNmZDkxMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvbGNuYWxsb2MuYwpAQCAtMCwwICsxLDEwMDIgQEAKKy8qCisgKiBsY25hbGxvYy5jIC0gQ2x1c3RlciAoZGUpYWxsb2NhdGlvbiBjb2RlLiAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZkZWYgTlRGU19SVworCisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorCisjaW5jbHVkZSAibGNuYWxsb2MuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImJpdG1hcC5oIgorI2luY2x1ZGUgImlub2RlLmgiCisjaW5jbHVkZSAidm9sdW1lLmgiCisjaW5jbHVkZSAiYXR0cmliLmgiCisjaW5jbHVkZSAibWFsbG9jLmgiCisjaW5jbHVkZSAiYW9wcy5oIgorI2luY2x1ZGUgIm50ZnMuaCIKKworLyoqCisgKiBudGZzX2NsdXN0ZXJfZnJlZV9mcm9tX3JsX25vbG9jayAtIGZyZWUgY2x1c3RlcnMgZnJvbSBydW5saXN0CisgKiBAdm9sOgltb3VudGVkIG50ZnMgdm9sdW1lIG9uIHdoaWNoIHRvIGZyZWUgdGhlIGNsdXN0ZXJzCisgKiBAcmw6CQlydW5saXN0IGRlc2NyaWJpbmcgdGhlIGNsdXN0ZXJzIHRvIGZyZWUKKyAqCisgKiBGcmVlIGFsbCB0aGUgY2x1c3RlcnMgZGVzY3JpYmVkIGJ5IHRoZSBydW5saXN0IEBybCBvbiB0aGUgdm9sdW1lIEB2b2wuICBJbgorICogdGhlIGNhc2Ugb2YgYW4gZXJyb3IgYmVpbmcgcmV0dXJuZWQsIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGNsdXN0ZXJzIHdlcmUgbm90CisgKiBmcmVlZC4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKgorICogTG9ja2luZzogLSBUaGUgdm9sdW1lIGxjbiBiaXRtYXAgbXVzdCBiZSBsb2NrZWQgZm9yIHdyaXRpbmcgb24gZW50cnkgYW5kIGlzCisgKgkgICAgICBsZWZ0IGxvY2tlZCBvbiByZXR1cm4uCisgKi8KK2ludCBudGZzX2NsdXN0ZXJfZnJlZV9mcm9tX3JsX25vbG9jayhudGZzX3ZvbHVtZSAqdm9sLAorCQljb25zdCBydW5saXN0X2VsZW1lbnQgKnJsKQoreworCXN0cnVjdCBpbm9kZSAqbGNuYm1wX3ZpID0gdm9sLT5sY25ibXBfaW5vOworCWludCByZXQgPSAwOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJZm9yICg7IHJsLT5sZW5ndGg7IHJsKyspIHsKKwkJaW50IGVycjsKKworCQlpZiAocmwtPmxjbiA8IDApCisJCQljb250aW51ZTsKKwkJZXJyID0gbnRmc19iaXRtYXBfY2xlYXJfcnVuKGxjbmJtcF92aSwgcmwtPmxjbiwgcmwtPmxlbmd0aCk7CisJCWlmICh1bmxpa2VseShlcnIgJiYgKCFyZXQgfHwgcmV0ID09IEVOT01FTSkgJiYgcmV0ICE9IGVycikpCisJCQlyZXQgPSBlcnI7CisJfQorCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBudGZzX2NsdXN0ZXJfYWxsb2MgLSBhbGxvY2F0ZSBjbHVzdGVycyBvbiBhbiBudGZzIHZvbHVtZQorICogQHZvbDoJbW91bnRlZCBudGZzIHZvbHVtZSBvbiB3aGljaCB0byBhbGxvY2F0ZSB0aGUgY2x1c3RlcnMKKyAqIEBzdGFydF92Y246CXZjbiB0byB1c2UgZm9yIHRoZSBmaXJzdCBhbGxvY2F0ZWQgY2x1c3RlcgorICogQGNvdW50OgludW1iZXIgb2YgY2x1c3RlcnMgdG8gYWxsb2NhdGUKKyAqIEBzdGFydF9sY246CXN0YXJ0aW5nIGxjbiBhdCB3aGljaCB0byBhbGxvY2F0ZSB0aGUgY2x1c3RlcnMgKG9yIC0xIGlmIG5vbmUpCisgKiBAem9uZToJem9uZSBmcm9tIHdoaWNoIHRvIGFsbG9jYXRlIHRoZSBjbHVzdGVycworICoKKyAqIEFsbG9jYXRlIEBjb3VudCBjbHVzdGVycyBwcmVmZXJhYmx5IHN0YXJ0aW5nIGF0IGNsdXN0ZXIgQHN0YXJ0X2xjbiBvciBhdCB0aGUKKyAqIGN1cnJlbnQgYWxsb2NhdG9yIHBvc2l0aW9uIGlmIEBzdGFydF9sY24gaXMgLTEsIG9uIHRoZSBtb3VudGVkIG50ZnMgdm9sdW1lCisgKiBAdm9sLiBAem9uZSBpcyBlaXRoZXIgREFUQV9aT05FIGZvciBhbGxvY2F0aW9uIG9mIG5vcm1hbCBjbHVzdGVycyBvcgorICogTUZUX1pPTkUgZm9yIGFsbG9jYXRpb24gb2YgY2x1c3RlcnMgZm9yIHRoZSBtYXN0ZXIgZmlsZSB0YWJsZSwgaS5lLiB0aGUKKyAqICRNRlQvJERBVEEgYXR0cmlidXRlLgorICoKKyAqIEBzdGFydF92Y24gc3BlY2lmaWVzIHRoZSB2Y24gb2YgdGhlIGZpcnN0IGFsbG9jYXRlZCBjbHVzdGVyLiAgVGhpcyBtYWtlcworICogbWVyZ2luZyB0aGUgcmVzdWx0aW5nIHJ1bmxpc3Qgd2l0aCB0aGUgb2xkIHJ1bmxpc3QgZWFzaWVyLgorICoKKyAqIFlvdSBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgd2l0aCBJU19FUlIoKS4gIElmIHRoaXMgaXMgZmFsc2UsIHRoZQorICogZnVuY3Rpb24gd2FzIHN1Y2Nlc3NmdWwgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgYSBydW5saXN0IGRlc2NyaWJpbmcgdGhlCisgKiBhbGxvY2F0ZWQgY2x1c3RlcihzKS4gIElmIElTX0VSUigpIGlzIHRydWUsIHRoZSBmdW5jdGlvbiBmYWlsZWQgYW5kCisgKiBQVFJfRVJSKCkgZ2l2ZXMgeW91IHRoZSBlcnJvciBjb2RlLgorICoKKyAqIE5vdGVzIG9uIHRoZSBhbGxvY2F0aW9uIGFsZ29yaXRobQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhlcmUgYXJlIHR3byBkYXRhIHpvbmVzLiAgRmlyc3QgaXMgdGhlIGFyZWEgYmV0d2VlbiB0aGUgZW5kIG9mIHRoZSBtZnQgem9uZQorICogYW5kIHRoZSBlbmQgb2YgdGhlIHZvbHVtZSwgYW5kIHNlY29uZCBpcyB0aGUgYXJlYSBiZXR3ZWVuIHRoZSBzdGFydCBvZiB0aGUKKyAqIHZvbHVtZSBhbmQgdGhlIHN0YXJ0IG9mIHRoZSBtZnQgem9uZS4gIE9uIHVubW9kaWZpZWQvc3RhbmRhcmQgTlRGUyAxLngKKyAqIHZvbHVtZXMsIHRoZSBzZWNvbmQgZGF0YSB6b25lIGRvZXMgbm90IGV4aXN0IGR1ZSB0byB0aGUgbWZ0IHpvbmUgYmVpbmcKKyAqIGV4cGFuZGVkIHRvIGNvdmVyIHRoZSBzdGFydCBvZiB0aGUgdm9sdW1lIGluIG9yZGVyIHRvIHJlc2VydmUgc3BhY2UgZm9yIHRoZQorICogbWZ0IGJpdG1hcCBhdHRyaWJ1dGUuCisgKgorICogVGhpcyBpcyBub3QgdGhlIHByZXR0aWVzdCBmdW5jdGlvbiBidXQgdGhlIGNvbXBsZXhpdHkgc3RlbXMgZnJvbSB0aGUgbmVlZCBvZgorICogaW1wbGVtZW50aW5nIHRoZSBtZnQgdnMgZGF0YSB6b25lZCBhcHByb2FjaCBhbmQgZnJvbSB0aGUgZmFjdCB0aGF0IHdlIGhhdmUKKyAqIGFjY2VzcyB0byB0aGUgbGNuIGJpdG1hcCBpbiBwb3J0aW9ucyBvZiB1cCB0byA4MTkyIGJ5dGVzIGF0IGEgdGltZSwgc28gd2UKKyAqIG5lZWQgdG8gY29wZSB3aXRoIGNyb3NzaW5nIG92ZXIgYm91bmRhcmllcyBvZiB0d28gYnVmZmVycy4gIEZ1cnRoZXIsIHRoZQorICogZmFjdCB0aGF0IHRoZSBhbGxvY2F0b3IgYWxsb3dzIGZvciBjYWxsZXIgc3VwcGxpZWQgaGludHMgYXMgdG8gdGhlIGxvY2F0aW9uCisgKiBvZiB3aGVyZSBhbGxvY2F0aW9uIHNob3VsZCBiZWdpbiBhbmQgdGhlIGZhY3QgdGhhdCB0aGUgYWxsb2NhdG9yIGtlZXBzIHRyYWNrCisgKiBvZiB3aGVyZSBpbiB0aGUgZGF0YSB6b25lcyB0aGUgbmV4dCBuYXR1cmFsIGFsbG9jYXRpb24gc2hvdWxkIG9jY3VyLAorICogY29udHJpYnV0ZSB0byB0aGUgY29tcGxleGl0eSBvZiB0aGUgZnVuY3Rpb24uICBCdXQgaXQgc2hvdWxkIGFsbCBiZQorICogd29ydGh3aGlsZSwgYmVjYXVzZSB0aGlzIGFsbG9jYXRvciBzaG91bGQ6IDEpIGJlIGEgZnVsbCBpbXBsZW1lbnRhdGlvbiBvZgorICogdGhlIE1GVCB6b25lIGFwcHJvYWNoIHVzZWQgYnkgV2luZG93cyBOVCwgMikgY2F1c2UgcmVkdWN0aW9uIGluCisgKiBmcmFnbWVudGF0aW9uLCBhbmQgMykgYmUgc3BlZWR5IGluIGFsbG9jYXRpb25zICh0aGUgY29kZSBpcyBub3Qgb3B0aW1pemVkCisgKiBmb3Igc3BlZWQsIGJ1dCB0aGUgYWxnb3JpdGhtIGlzLCBzbyBmdXJ0aGVyIHNwZWVkIGltcHJvdmVtZW50cyBhcmUgcHJvYmFibHkKKyAqIHBvc3NpYmxlKS4KKyAqCisgKiBGSVhNRTogV2Ugc2hvdWxkIGJlIG1vbml0b3JpbmcgY2x1c3RlciBhbGxvY2F0aW9uIGFuZCBpbmNyZW1lbnQgdGhlIE1GVCB6b25lCisgKiBzaXplIGR5bmFtaWNhbGx5IGJ1dCB0aGlzIGlzIHNvbWV0aGluZyBmb3IgdGhlIGZ1dHVyZS4gIFdlIHdpbGwganVzdCBjYXVzZQorICogaGVhdmllciBmcmFnbWVudGF0aW9uIGJ5IG5vdCBkb2luZyBpdCBhbmQgSSBhbSBub3QgZXZlbiBzdXJlIFdpbmRvd3Mgd291bGQKKyAqIGdyb3cgdGhlIE1GVCB6b25lIGR5bmFtaWNhbGx5LCBzbyBpdCBtaWdodCBldmVuIGJlIGNvcnJlY3Qgbm90IHRvIGRvIHRoaXMuCisgKiBUaGUgb3ZlcmhlYWQgaW4gZG9pbmcgZHluYW1pYyBNRlQgem9uZSBleHBhbnNpb24gd291bGQgYmUgdmVyeSBsYXJnZSBhbmQKKyAqIHVubGlrZWx5IHdvcnRoIHRoZSBlZmZvcnQuIChBSUEpCisgKgorICogVE9ETzogSSBoYXZlIGFkZGVkIGluIGRvdWJsZSB0aGUgcmVxdWlyZWQgem9uZSBwb3NpdGlvbiBwb2ludGVyIHdyYXAgYXJvdW5kCisgKiBsb2dpYyB3aGljaCBjYW4gYmUgb3B0aW1pemVkIHRvIGhhdmluZyBvbmx5IG9uZSBvZiB0aGUgdHdvIGxvZ2ljIHNldHMuCisgKiBIb3dldmVyLCBoYXZpbmcgdGhlIGRvdWJsZSBsb2dpYyB3aWxsIHdvcmsgZmluZSwgYnV0IGlmIHdlIGhhdmUgb25seSBvbmUgb2YKKyAqIHRoZSBzZXRzIGFuZCB3ZSBnZXQgaXQgd3Jvbmcgc29tZXdoZXJlLCB0aGVuIHdlIGdldCBpbnRvIHRyb3VibGUsIHNvCisgKiByZW1vdmluZyB0aGUgZHVwbGljYXRlIGxvZ2ljIHJlcXVpcmVzIF92ZXJ5XyBjYXJlZnVsIGNvbnNpZGVyYXRpb24gb2YgX2FsbF8KKyAqIHBvc3NpYmxlIGNvZGUgcGF0aHMuICBTbyBhdCBsZWFzdCBmb3Igbm93LCBJIGFtIGxlYXZpbmcgdGhlIGRvdWJsZSBsb2dpYyAtCisgKiBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5Li4uIChBSUEpCisgKgorICogTG9ja2luZzogLSBUaGUgdm9sdW1lIGxjbiBiaXRtYXAgbXVzdCBiZSB1bmxvY2tlZCBvbiBlbnRyeSBhbmQgaXMgdW5sb2NrZWQKKyAqCSAgICAgIG9uIHJldHVybi4KKyAqCSAgICAtIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHZvbHVtZSBsY24gYml0bWFwIGxvY2sgZm9yIHdyaXRpbmcgYW5kCisgKgkgICAgICBtb2RpZmllcyB0aGUgYml0bWFwIGNvbnRlbnRzLgorICovCitydW5saXN0X2VsZW1lbnQgKm50ZnNfY2x1c3Rlcl9hbGxvYyhudGZzX3ZvbHVtZSAqdm9sLCBjb25zdCBWQ04gc3RhcnRfdmNuLAorCQljb25zdCBzNjQgY291bnQsIGNvbnN0IExDTiBzdGFydF9sY24sCisJCWNvbnN0IE5URlNfQ0xVU1RFUl9BTExPQ0FUSU9OX1pPTkVTIHpvbmUpCit7CisJTENOIHpvbmVfc3RhcnQsIHpvbmVfZW5kLCBibXBfcG9zLCBibXBfaW5pdGlhbF9wb3MsIGxhc3RfcmVhZF9wb3MsIGxjbjsKKwlMQ04gcHJldl9sY24gPSAwLCBwcmV2X3J1bl9sZW4gPSAwLCBtZnRfem9uZV9zaXplOworCXM2NCBjbHVzdGVyczsKKwlzdHJ1Y3QgaW5vZGUgKmxjbmJtcF92aTsKKwlydW5saXN0X2VsZW1lbnQgKnJsID0gTlVMTDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisJdTggKmJ1ZiwgKmJ5dGU7CisJaW50IGVyciA9IDAsIHJscG9zLCBybHNpemUsIGJ1Zl9zaXplOworCXU4IHBhc3MsIGRvbmVfem9uZXMsIHNlYXJjaF96b25lLCBuZWVkX3dyaXRlYmFjayA9IDAsIGJpdDsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBzdGFydF92Y24gMHglbGx4LCBjb3VudCAweCVsbHgsIHN0YXJ0X2xjbiAiCisJCQkiMHglbGx4LCB6b25lICVzX1pPTkUuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydF92Y24sCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWNvdW50LAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydF9sY24sCisJCQl6b25lID09IE1GVF9aT05FID8gIk1GVCIgOiAiREFUQSIpOworCUJVR19PTighdm9sKTsKKwlsY25ibXBfdmkgPSB2b2wtPmxjbmJtcF9pbm87CisJQlVHX09OKCFsY25ibXBfdmkpOworCUJVR19PTihzdGFydF92Y24gPCAwKTsKKwlCVUdfT04oY291bnQgPCAwKTsKKwlCVUdfT04oc3RhcnRfbGNuIDwgLTEpOworCUJVR19PTih6b25lIDwgRklSU1RfWk9ORSk7CisJQlVHX09OKHpvbmUgPiBMQVNUX1pPTkUpOworCisJLyogUmV0dXJuIGVtcHR5IHJ1bmxpc3QgaWYgQGNvdW50ID09IDAgKi8KKwkvLyBGSVhNRTogRG8gd2Ugd2FudCB0byBqdXN0IHJldHVybiBOVUxMIGluc3RlYWQ/IChBSUEpCisJaWYgKCFjb3VudCkgeworCQlybCA9IG50ZnNfbWFsbG9jX25vZnMoUEFHRV9TSVpFKTsKKwkJaWYgKCFybCkKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCQlybFswXS52Y24gPSBzdGFydF92Y247CisJCXJsWzBdLmxjbiA9IExDTl9STF9OT1RfTUFQUEVEOworCQlybFswXS5sZW5ndGggPSAwOworCQlyZXR1cm4gcmw7CisJfQorCS8qIFRha2UgdGhlIGxjbmJtcCBsb2NrIGZvciB3cml0aW5nLiAqLworCWRvd25fd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOworCS8qCisJICogSWYgbm8gc3BlY2lmaWMgQHN0YXJ0X2xjbiB3YXMgcmVxdWVzdGVkLCB1c2UgdGhlIGN1cnJlbnQgZGF0YSB6b25lCisJICogcG9zaXRpb24sIG90aGVyd2lzZSB1c2UgdGhlIHJlcXVlc3RlZCBAc3RhcnRfbGNuIGJ1dCBtYWtlIHN1cmUgaXQKKwkgKiBsaWVzIG91dHNpZGUgdGhlIG1mdCB6b25lLiAgQWxzbyBzZXQgZG9uZV96b25lcyB0byAwIChubyB6b25lcyBkb25lKQorCSAqIGFuZCBwYXNzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGFyZSBzdGFydGluZyBpbnNpZGUgYSB6b25lICgxKSBvcgorCSAqIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSB6b25lICgyKS4gIElmIHJlcXVlc3RpbmcgZnJvbSB0aGUgTUZUX1pPTkUsCisJICogd2UgZWl0aGVyIHN0YXJ0IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgbWZ0IHpvbmUgb3IgYXQKKwkgKiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiAgSWYgdGhlIGxhdHRlciBpcyBvdXQgb2YgYm91bmRzIHRoZW4gd2Ugc3RhcnQKKwkgKiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBNRlRfWk9ORS4KKwkgKi8KKwlkb25lX3pvbmVzID0gMDsKKwlwYXNzID0gMTsKKwkvKgorCSAqIHpvbmVfc3RhcnQgYW5kIHpvbmVfZW5kIGFyZSB0aGUgY3VycmVudCBzZWFyY2ggcmFuZ2UuICBzZWFyY2hfem9uZQorCSAqIGlzIDEgZm9yIG1mdCB6b25lLCAyIGZvciBkYXRhIHpvbmUgMSAoZW5kIG9mIG1mdCB6b25lIHRpbGwgZW5kIG9mCisJICogdm9sdW1lKSBhbmQgNCBmb3IgZGF0YSB6b25lIDIgKHN0YXJ0IG9mIHZvbHVtZSB0aWxsIHN0YXJ0IG9mIG1mdAorCSAqIHpvbmUpLgorCSAqLworCXpvbmVfc3RhcnQgPSBzdGFydF9sY247CisJaWYgKHpvbmVfc3RhcnQgPCAwKSB7CisJCWlmICh6b25lID09IERBVEFfWk9ORSkKKwkJCXpvbmVfc3RhcnQgPSB2b2wtPmRhdGExX3pvbmVfcG9zOworCQllbHNlCisJCQl6b25lX3N0YXJ0ID0gdm9sLT5tZnRfem9uZV9wb3M7CisJCWlmICghem9uZV9zdGFydCkgeworCQkJLyoKKwkJCSAqIFpvbmUgc3RhcnRzIGF0IGJlZ2lubmluZyBvZiB2b2x1bWUgd2hpY2ggbWVhbnMgYQorCQkJICogc2luZ2xlIHBhc3MgaXMgc3VmZmljaWVudC4KKwkJCSAqLworCQkJcGFzcyA9IDI7CisJCX0KKwl9IGVsc2UgaWYgKHpvbmUgPT0gREFUQV9aT05FICYmIHpvbmVfc3RhcnQgPj0gdm9sLT5tZnRfem9uZV9zdGFydCAmJgorCQkJem9uZV9zdGFydCA8IHZvbC0+bWZ0X3pvbmVfZW5kKSB7CisJCXpvbmVfc3RhcnQgPSB2b2wtPm1mdF96b25lX2VuZDsKKwkJLyoKKwkJICogU3RhcnRpbmcgYXQgYmVnaW5uaW5nIG9mIGRhdGExX3pvbmUgd2hpY2ggbWVhbnMgYSBzaW5nbGUKKwkJICogcGFzcyBpbiB0aGlzIHpvbmUgaXMgc3VmZmljaWVudC4KKwkJICovCisJCXBhc3MgPSAyOworCX0gZWxzZSBpZiAoem9uZSA9PSBNRlRfWk9ORSAmJiAoem9uZV9zdGFydCA8IHZvbC0+bWZ0X3pvbmVfc3RhcnQgfHwKKwkJCXpvbmVfc3RhcnQgPj0gdm9sLT5tZnRfem9uZV9lbmQpKSB7CisJCXpvbmVfc3RhcnQgPSB2b2wtPm1mdF9sY247CisJCWlmICghdm9sLT5tZnRfem9uZV9lbmQpCisJCQl6b25lX3N0YXJ0ID0gMDsKKwkJLyoKKwkJICogU3RhcnRpbmcgYXQgYmVnaW5uaW5nIG9mIHZvbHVtZSB3aGljaCBtZWFucyBhIHNpbmdsZSBwYXNzCisJCSAqIGlzIHN1ZmZpY2llbnQuCisJCSAqLworCQlwYXNzID0gMjsKKwl9CisJaWYgKHpvbmUgPT0gTUZUX1pPTkUpIHsKKwkJem9uZV9lbmQgPSB2b2wtPm1mdF96b25lX2VuZDsKKwkJc2VhcmNoX3pvbmUgPSAxOworCX0gZWxzZSAvKiBpZiAoem9uZSA9PSBEQVRBX1pPTkUpICovIHsKKwkJLyogU2tpcCBzZWFyY2hpbmcgdGhlIG1mdCB6b25lLiAqLworCQlkb25lX3pvbmVzIHw9IDE7CisJCWlmICh6b25lX3N0YXJ0ID49IHZvbC0+bWZ0X3pvbmVfZW5kKSB7CisJCQl6b25lX2VuZCA9IHZvbC0+bnJfY2x1c3RlcnM7CisJCQlzZWFyY2hfem9uZSA9IDI7CisJCX0gZWxzZSB7CisJCQl6b25lX2VuZCA9IHZvbC0+bWZ0X3pvbmVfc3RhcnQ7CisJCQlzZWFyY2hfem9uZSA9IDQ7CisJCX0KKwl9CisJLyoKKwkgKiBibXBfcG9zIGlzIHRoZSBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbnNpZGUgdGhlIGJpdG1hcC4gIFdlIHVzZQorCSAqIGJtcF9pbml0aWFsX3BvcyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdG8gZG8gYSB6b25lIHN3aXRjaC4KKwkgKi8KKwlibXBfcG9zID0gYm1wX2luaXRpYWxfcG9zID0gem9uZV9zdGFydDsKKworCS8qIExvb3AgdW50aWwgYWxsIGNsdXN0ZXJzIGFyZSBhbGxvY2F0ZWQsIGkuZS4gY2x1c3RlcnMgPT0gMC4gKi8KKwljbHVzdGVycyA9IGNvdW50OworCXJscG9zID0gcmxzaXplID0gMDsKKwltYXBwaW5nID0gbGNuYm1wX3ZpLT5pX21hcHBpbmc7CisJd2hpbGUgKDEpIHsKKwkJbnRmc19kZWJ1ZygiU3RhcnQgb2Ygb3V0ZXIgd2hpbGUgbG9vcDogZG9uZV96b25lcyAweCV4LCAiCisJCQkJInNlYXJjaF96b25lICVpLCBwYXNzICVpLCB6b25lX3N0YXJ0IDB4JWxseCwgIgorCQkJCSJ6b25lX2VuZCAweCVsbHgsIGJtcF9pbml0aWFsX3BvcyAweCVsbHgsICIKKwkJCQkiYm1wX3BvcyAweCVsbHgsIHJscG9zICVpLCBybHNpemUgJWkuIiwKKwkJCQlkb25lX3pvbmVzLCBzZWFyY2hfem9uZSwgcGFzcywKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXpvbmVfc3RhcnQsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl6b25lX2VuZCwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWJtcF9pbml0aWFsX3BvcywKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWJtcF9wb3MsIHJscG9zLCBybHNpemUpOworCQkvKiBMb29wIHVudGlsIHdlIHJ1biBvdXQgb2YgZnJlZSBjbHVzdGVycy4gKi8KKwkJbGFzdF9yZWFkX3BvcyA9IGJtcF9wb3MgPj4gMzsKKwkJbnRmc19kZWJ1ZygibGFzdF9yZWFkX3BvcyAweCVsbHguIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWxhc3RfcmVhZF9wb3MpOworCQlpZiAobGFzdF9yZWFkX3BvcyA+IGxjbmJtcF92aS0+aV9zaXplKSB7CisJCQludGZzX2RlYnVnKCJFbmQgb2YgYXR0cmlidXRlIHJlYWNoZWQuICAiCisJCQkJCSJTa2lwcGluZyB0byB6b25lX3Bhc3NfZG9uZS4iKTsKKwkJCWdvdG8gem9uZV9wYXNzX2RvbmU7CisJCX0KKwkJaWYgKGxpa2VseShwYWdlKSkgeworCQkJaWYgKG5lZWRfd3JpdGViYWNrKSB7CisJCQkJbnRmc19kZWJ1ZygiTWFya2luZyBwYWdlIGRpcnR5LiIpOworCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCQkJCW5lZWRfd3JpdGViYWNrID0gMDsKKwkJCX0KKwkJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJfQorCQlwYWdlID0gbnRmc19tYXBfcGFnZShtYXBwaW5nLCBsYXN0X3JlYWRfcG9zID4+CisJCQkJUEFHRV9DQUNIRV9TSElGVCk7CisJCWlmIChJU19FUlIocGFnZSkpIHsKKwkJCWVyciA9IFBUUl9FUlIocGFnZSk7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWFwIHBhZ2UuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlidWZfc2l6ZSA9IGxhc3RfcmVhZF9wb3MgJiB+UEFHRV9DQUNIRV9NQVNLOworCQlidWYgPSBwYWdlX2FkZHJlc3MocGFnZSkgKyBidWZfc2l6ZTsKKwkJYnVmX3NpemUgPSBQQUdFX0NBQ0hFX1NJWkUgLSBidWZfc2l6ZTsKKwkJaWYgKHVubGlrZWx5KGxhc3RfcmVhZF9wb3MgKyBidWZfc2l6ZSA+IGxjbmJtcF92aS0+aV9zaXplKSkKKwkJCWJ1Zl9zaXplID0gbGNuYm1wX3ZpLT5pX3NpemUgLSBsYXN0X3JlYWRfcG9zOworCQlidWZfc2l6ZSA8PD0gMzsKKwkJbGNuID0gYm1wX3BvcyAmIDc7CisJCWJtcF9wb3MgJj0gfjc7CisJCW50ZnNfZGVidWcoIkJlZm9yZSBpbm5lciB3aGlsZSBsb29wOiBidWZfc2l6ZSAlaSwgbGNuIDB4JWxseCwgIgorCQkJCSJibXBfcG9zIDB4JWxseCwgbmVlZF93cml0ZWJhY2sgJWkuIiwgYnVmX3NpemUsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsY24sCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylibXBfcG9zLCBuZWVkX3dyaXRlYmFjayk7CisJCXdoaWxlIChsY24gPCBidWZfc2l6ZSAmJiBsY24gKyBibXBfcG9zIDwgem9uZV9lbmQpIHsKKwkJCWJ5dGUgPSBidWYgKyAobGNuID4+IDMpOworCQkJbnRmc19kZWJ1ZygiSW4gaW5uZXIgd2hpbGUgbG9vcDogYnVmX3NpemUgJWksICIKKwkJCQkJImxjbiAweCVsbHgsIGJtcF9wb3MgMHglbGx4LCAiCisJCQkJCSJuZWVkX3dyaXRlYmFjayAlaSwgYnl0ZSBvZnMgMHgleCwgIgorCQkJCQkiKmJ5dGUgMHgleC4iLCBidWZfc2l6ZSwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsY24sCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYm1wX3BvcywKKwkJCQkJbmVlZF93cml0ZWJhY2ssCisJCQkJCSh1bnNpZ25lZCBpbnQpKGxjbiA+PiAzKSwKKwkJCQkJKHVuc2lnbmVkIGludCkqYnl0ZSk7CisJCQkvKiBTa2lwIGZ1bGwgYnl0ZXMuICovCisJCQlpZiAoKmJ5dGUgPT0gMHhmZikgeworCQkJCWxjbiA9IChsY24gKyA4KSAmIH43OworCQkJCW50ZnNfZGVidWcoIkNvbnRpbnVpbmcgd2hpbGUgbG9vcCAxLiIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYml0ID0gMSA8PCAobGNuICYgNyk7CisJCQludGZzX2RlYnVnKCJiaXQgJWkuIiwgYml0KTsKKwkJCS8qIElmIHRoZSBiaXQgaXMgYWxyZWFkeSBzZXQsIGdvIG9udG8gdGhlIG5leHQgb25lLiAqLworCQkJaWYgKCpieXRlICYgYml0KSB7CisJCQkJbGNuKys7CisJCQkJbnRmc19kZWJ1ZygiQ29udGludWluZyB3aGlsZSBsb29wIDIuIik7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKgorCQkJICogQWxsb2NhdGUgbW9yZSBtZW1vcnkgaWYgbmVlZGVkLCBpbmNsdWRpbmcgc3BhY2UgZm9yCisJCQkgKiB0aGUgdGVybWluYXRvciBlbGVtZW50LgorCQkJICogbnRmc19tYWxsb2Nfbm9mcygpIG9wZXJhdGVzIG9uIHdob2xlIHBhZ2VzIG9ubHkuCisJCQkgKi8KKwkJCWlmICgocmxwb3MgKyAyKSAqIHNpemVvZigqcmwpID4gcmxzaXplKSB7CisJCQkJcnVubGlzdF9lbGVtZW50ICpybDI7CisKKwkJCQludGZzX2RlYnVnKCJSZWFsbG9jYXRpbmcgbWVtb3J5LiIpOworCQkJCWlmICghcmwpCisJCQkJCW50ZnNfZGVidWcoIkZpcnN0IGZyZWUgYml0IGlzIGF0IExDTiAiCisJCQkJCQkJIjB4JWxseC4iLAorCQkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJCQkJKGxjbiArIGJtcF9wb3MpKTsKKwkJCQlybDIgPSBudGZzX21hbGxvY19ub2ZzKHJsc2l6ZSArIChpbnQpUEFHRV9TSVpFKTsKKwkJCQlpZiAodW5saWtlbHkoIXJsMikpIHsKKwkJCQkJZXJyID0gLUVOT01FTTsKKwkJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvICIKKwkJCQkJCQkiYWxsb2NhdGUgbWVtb3J5LiIpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJbWVtY3B5KHJsMiwgcmwsIHJsc2l6ZSk7CisJCQkJbnRmc19mcmVlKHJsKTsKKwkJCQlybCA9IHJsMjsKKwkJCQlybHNpemUgKz0gUEFHRV9TSVpFOworCQkJCW50ZnNfZGVidWcoIlJlYWxsb2NhdGVkIG1lbW9yeSwgcmxzaXplIDB4JXguIiwKKwkJCQkJCXJsc2l6ZSk7CisJCQl9CisJCQkvKiBBbGxvY2F0ZSB0aGUgYml0bWFwIGJpdC4gKi8KKwkJCSpieXRlIHw9IGJpdDsKKwkJCS8qIFdlIG5lZWQgdG8gd3JpdGUgdGhpcyBiaXRtYXAgcGFnZSB0byBkaXNrLiAqLworCQkJbmVlZF93cml0ZWJhY2sgPSAxOworCQkJbnRmc19kZWJ1ZygiKmJ5dGUgMHgleCwgbmVlZF93cml0ZWJhY2sgaXMgc2V0LiIsCisJCQkJCSh1bnNpZ25lZCBpbnQpKmJ5dGUpOworCQkJLyoKKwkJCSAqIENvYWxlc2NlIHdpdGggcHJldmlvdXMgcnVuIGlmIGFkamFjZW50IExDTnMuCisJCQkgKiBPdGhlcndpc2UsIGFwcGVuZCBhIG5ldyBydW4uCisJCQkgKi8KKwkJCW50ZnNfZGVidWcoIkFkZGluZyBydW4gKGxjbiAweCVsbHgsIGxlbiAweCVsbHgpLCAiCisJCQkJCSJwcmV2X2xjbiAweCVsbHgsIGxjbiAweCVsbHgsICIKKwkJCQkJImJtcF9wb3MgMHglbGx4LCBwcmV2X3J1bl9sZW4gMHglbGx4LCAiCisJCQkJCSJybHBvcyAlaS4iLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKShsY24gKyBibXBfcG9zKSwKKwkJCQkJMVVMTCwgKHVuc2lnbmVkIGxvbmcgbG9uZylwcmV2X2xjbiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsY24sCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYm1wX3BvcywKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwcmV2X3J1bl9sZW4sCisJCQkJCXJscG9zKTsKKwkJCWlmIChwcmV2X2xjbiA9PSBsY24gKyBibXBfcG9zIC0gcHJldl9ydW5fbGVuICYmIHJscG9zKSB7CisJCQkJbnRmc19kZWJ1ZygiQ29hbGVzY2luZyB0byBydW4gKGxjbiAweCVsbHgsICIKKwkJCQkJCSJsZW4gMHglbGx4KS4iLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCXJsW3JscG9zIC0gMV0ubGNuLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCXJsW3JscG9zIC0gMV0ubGVuZ3RoKTsKKwkJCQlybFtybHBvcyAtIDFdLmxlbmd0aCA9ICsrcHJldl9ydW5fbGVuOworCQkJCW50ZnNfZGVidWcoIlJ1biBub3cgKGxjbiAweCVsbHgsIGxlbiAweCVsbHgpLCAiCisJCQkJCQkicHJldl9ydW5fbGVuIDB4JWxseC4iLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCXJsW3JscG9zIC0gMV0ubGNuLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCXJsW3JscG9zIC0gMV0ubGVuZ3RoLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCXByZXZfcnVuX2xlbik7CisJCQl9IGVsc2UgeworCQkJCWlmIChsaWtlbHkocmxwb3MpKSB7CisJCQkJCW50ZnNfZGVidWcoIkFkZGluZyBuZXcgcnVuLCAocHJldmlvdXMgIgorCQkJCQkJCSJydW4gbGNuIDB4JWxseCwgIgorCQkJCQkJCSJsZW4gMHglbGx4KS4iLAorCQkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJCQkJcmxbcmxwb3MgLSAxXS5sY24sCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQlybFtybHBvcyAtIDFdLmxlbmd0aCk7CisJCQkJCXJsW3JscG9zXS52Y24gPSBybFtybHBvcyAtIDFdLnZjbiArCisJCQkJCQkJcHJldl9ydW5fbGVuOworCQkJCX0gZWxzZSB7CisJCQkJCW50ZnNfZGVidWcoIkFkZGluZyBuZXcgcnVuLCBpcyBmaXJzdCAiCisJCQkJCQkJInJ1bi4iKTsKKwkJCQkJcmxbcmxwb3NdLnZjbiA9IHN0YXJ0X3ZjbjsKKwkJCQl9CisJCQkJcmxbcmxwb3NdLmxjbiA9IHByZXZfbGNuID0gbGNuICsgYm1wX3BvczsKKwkJCQlybFtybHBvc10ubGVuZ3RoID0gcHJldl9ydW5fbGVuID0gMTsKKwkJCQlybHBvcysrOworCQkJfQorCQkJLyogRG9uZT8gKi8KKwkJCWlmICghLS1jbHVzdGVycykgeworCQkJCUxDTiB0YzsKKwkJCQkvKgorCQkJCSAqIFVwZGF0ZSB0aGUgY3VycmVudCB6b25lIHBvc2l0aW9uLiAgUG9zaXRpb25zCisJCQkJICogb2YgYWxyZWFkeSBzY2FubmVkIHpvbmVzIGhhdmUgYmVlbiB1cGRhdGVkCisJCQkJICogZHVyaW5nIHRoZSByZXNwZWN0aXZlIHpvbmUgc3dpdGNoZXMuCisJCQkJICovCisJCQkJdGMgPSBsY24gKyBibXBfcG9zICsgMTsKKwkJCQludGZzX2RlYnVnKCJEb25lLiBVcGRhdGluZyBjdXJyZW50IHpvbmUgIgorCQkJCQkJInBvc2l0aW9uLCB0YyAweCVsbHgsICIKKwkJCQkJCSJzZWFyY2hfem9uZSAlaS4iLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0YywKKwkJCQkJCXNlYXJjaF96b25lKTsKKwkJCQlzd2l0Y2ggKHNlYXJjaF96b25lKSB7CisJCQkJY2FzZSAxOgorCQkJCQludGZzX2RlYnVnKCJCZWZvcmUgY2hlY2tzLCAiCisJCQkJCQkJInZvbC0+bWZ0X3pvbmVfcG9zICIKKwkJCQkJCQkiMHglbGx4LiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQl2b2wtPm1mdF96b25lX3Bvcyk7CisJCQkJCWlmICh0YyA+PSB2b2wtPm1mdF96b25lX2VuZCkgeworCQkJCQkJdm9sLT5tZnRfem9uZV9wb3MgPQorCQkJCQkJCQl2b2wtPm1mdF9sY247CisJCQkJCQlpZiAoIXZvbC0+bWZ0X3pvbmVfZW5kKQorCQkJCQkJCXZvbC0+bWZ0X3pvbmVfcG9zID0gMDsKKwkJCQkJfSBlbHNlIGlmICgoYm1wX2luaXRpYWxfcG9zID49CisJCQkJCQkJdm9sLT5tZnRfem9uZV9wb3MgfHwKKwkJCQkJCQl0YyA+IHZvbC0+bWZ0X3pvbmVfcG9zKQorCQkJCQkJCSYmIHRjID49IHZvbC0+bWZ0X2xjbikKKwkJCQkJCXZvbC0+bWZ0X3pvbmVfcG9zID0gdGM7CisJCQkJCW50ZnNfZGVidWcoIkFmdGVyIGNoZWNrcywgIgorCQkJCQkJCSJ2b2wtPm1mdF96b25lX3BvcyAiCisJCQkJCQkJIjB4JWxseC4iLAorCQkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJCQkJdm9sLT5tZnRfem9uZV9wb3MpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI6CisJCQkJCW50ZnNfZGVidWcoIkJlZm9yZSBjaGVja3MsICIKKwkJCQkJCQkidm9sLT5kYXRhMV96b25lX3BvcyAiCisJCQkJCQkJIjB4JWxseC4iLAorCQkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJCQkJdm9sLT5kYXRhMV96b25lX3Bvcyk7CisJCQkJCWlmICh0YyA+PSB2b2wtPm5yX2NsdXN0ZXJzKQorCQkJCQkJdm9sLT5kYXRhMV96b25lX3BvcyA9CisJCQkJCQkJICAgICB2b2wtPm1mdF96b25lX2VuZDsKKwkJCQkJZWxzZSBpZiAoKGJtcF9pbml0aWFsX3BvcyA+PQorCQkJCQkJICAgIHZvbC0+ZGF0YTFfem9uZV9wb3MgfHwKKwkJCQkJCSAgICB0YyA+IHZvbC0+ZGF0YTFfem9uZV9wb3MpCisJCQkJCQkgICAgJiYgdGMgPj0gdm9sLT5tZnRfem9uZV9lbmQpCisJCQkJCQl2b2wtPmRhdGExX3pvbmVfcG9zID0gdGM7CisJCQkJCW50ZnNfZGVidWcoIkFmdGVyIGNoZWNrcywgIgorCQkJCQkJCSJ2b2wtPmRhdGExX3pvbmVfcG9zICIKKwkJCQkJCQkiMHglbGx4LiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQl2b2wtPmRhdGExX3pvbmVfcG9zKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA0OgorCQkJCQludGZzX2RlYnVnKCJCZWZvcmUgY2hlY2tzLCAiCisJCQkJCQkJInZvbC0+ZGF0YTJfem9uZV9wb3MgIgorCQkJCQkJCSIweCVsbHguIiwKKwkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJCXZvbC0+ZGF0YTJfem9uZV9wb3MpOworCQkJCQlpZiAodGMgPj0gdm9sLT5tZnRfem9uZV9zdGFydCkKKwkJCQkJCXZvbC0+ZGF0YTJfem9uZV9wb3MgPSAwOworCQkJCQllbHNlIGlmIChibXBfaW5pdGlhbF9wb3MgPj0KKwkJCQkJCSAgICAgIHZvbC0+ZGF0YTJfem9uZV9wb3MgfHwKKwkJCQkJCSAgICAgIHRjID4gdm9sLT5kYXRhMl96b25lX3BvcykKKwkJCQkJCXZvbC0+ZGF0YTJfem9uZV9wb3MgPSB0YzsKKwkJCQkJbnRmc19kZWJ1ZygiQWZ0ZXIgY2hlY2tzLCAiCisJCQkJCQkJInZvbC0+ZGF0YTJfem9uZV9wb3MgIgorCQkJCQkJCSIweCVsbHguIiwKKwkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJCXZvbC0+ZGF0YTJfem9uZV9wb3MpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlCVUcoKTsKKwkJCQl9CisJCQkJbnRmc19kZWJ1ZygiRmluaXNoZWQuICBHb2luZyB0byBvdXQuIik7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlsY24rKzsKKwkJfQorCQlibXBfcG9zICs9IGJ1Zl9zaXplOworCQludGZzX2RlYnVnKCJBZnRlciBpbm5lciB3aGlsZSBsb29wOiBidWZfc2l6ZSAweCV4LCBsY24gIgorCQkJCSIweCVsbHgsIGJtcF9wb3MgMHglbGx4LCBuZWVkX3dyaXRlYmFjayAlaS4iLAorCQkJCWJ1Zl9zaXplLCAodW5zaWduZWQgbG9uZyBsb25nKWxjbiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWJtcF9wb3MsIG5lZWRfd3JpdGViYWNrKTsKKwkJaWYgKGJtcF9wb3MgPCB6b25lX2VuZCkgeworCQkJbnRmc19kZWJ1ZygiQ29udGludWluZyBvdXRlciB3aGlsZSBsb29wLCAiCisJCQkJCSJibXBfcG9zIDB4JWxseCwgem9uZV9lbmQgMHglbGx4LiIsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYm1wX3BvcywKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl6b25lX2VuZCk7CisJCQljb250aW51ZTsKKwkJfQorem9uZV9wYXNzX2RvbmU6CS8qIEZpbmlzaGVkIHdpdGggdGhlIGN1cnJlbnQgem9uZSBwYXNzLiAqLworCQludGZzX2RlYnVnKCJBdCB6b25lX3Bhc3NfZG9uZSwgcGFzcyAlaS4iLCBwYXNzKTsKKwkJaWYgKHBhc3MgPT0gMSkgeworCQkJLyoKKwkJCSAqIE5vdyBkbyBwYXNzIDIsIHNjYW5uaW5nIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSB6b25lCisJCQkgKiB3ZSBvbWl0dGVkIGluIHBhc3MgMS4KKwkJCSAqLworCQkJcGFzcyA9IDI7CisJCQl6b25lX2VuZCA9IHpvbmVfc3RhcnQ7CisJCQlzd2l0Y2ggKHNlYXJjaF96b25lKSB7CisJCQljYXNlIDE6IC8qIG1mdF96b25lICovCisJCQkJem9uZV9zdGFydCA9IHZvbC0+bWZ0X3pvbmVfc3RhcnQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6IC8qIGRhdGExX3pvbmUgKi8KKwkJCQl6b25lX3N0YXJ0ID0gdm9sLT5tZnRfem9uZV9lbmQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6IC8qIGRhdGEyX3pvbmUgKi8KKwkJCQl6b25lX3N0YXJ0ID0gMDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQlVHKCk7CisJCQl9CisJCQkvKiBTYW5pdHkgY2hlY2suICovCisJCQlpZiAoem9uZV9lbmQgPCB6b25lX3N0YXJ0KQorCQkJCXpvbmVfZW5kID0gem9uZV9zdGFydDsKKwkJCWJtcF9wb3MgPSB6b25lX3N0YXJ0OworCQkJbnRmc19kZWJ1ZygiQ29udGludWluZyBvdXRlciB3aGlsZSBsb29wLCBwYXNzIDIsICIKKwkJCQkJInpvbmVfc3RhcnQgMHglbGx4LCB6b25lX2VuZCAweCVsbHgsICIKKwkJCQkJImJtcF9wb3MgMHglbGx4LiIsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpem9uZV9zdGFydCwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl6b25lX2VuZCwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylibXBfcG9zKTsKKwkJCWNvbnRpbnVlOworCQl9IC8qIHBhc3MgPT0gMiAqLworZG9uZV96b25lc19jaGVjazoKKwkJbnRmc19kZWJ1ZygiQXQgZG9uZV96b25lc19jaGVjaywgc2VhcmNoX3pvbmUgJWksIGRvbmVfem9uZXMgIgorCQkJCSJiZWZvcmUgMHgleCwgZG9uZV96b25lcyBhZnRlciAweCV4LiIsCisJCQkJc2VhcmNoX3pvbmUsIGRvbmVfem9uZXMsCisJCQkJZG9uZV96b25lcyB8IHNlYXJjaF96b25lKTsKKwkJZG9uZV96b25lcyB8PSBzZWFyY2hfem9uZTsKKwkJaWYgKGRvbmVfem9uZXMgPCA3KSB7CisJCQludGZzX2RlYnVnKCJTd2l0Y2hpbmcgem9uZS4iKTsKKwkJCS8qIE5vdyBzd2l0Y2ggdG8gdGhlIG5leHQgem9uZSB3ZSBoYXZlbid0IGRvbmUgeWV0LiAqLworCQkJcGFzcyA9IDE7CisJCQlzd2l0Y2ggKHNlYXJjaF96b25lKSB7CisJCQljYXNlIDE6CisJCQkJbnRmc19kZWJ1ZygiU3dpdGNoaW5nIGZyb20gbWZ0IHpvbmUgdG8gZGF0YTEgIgorCQkJCQkJInpvbmUuIik7CisJCQkJLyogVXBkYXRlIG1mdCB6b25lIHBvc2l0aW9uLiAqLworCQkJCWlmIChybHBvcykgeworCQkJCQlMQ04gdGM7CisKKwkJCQkJbnRmc19kZWJ1ZygiQmVmb3JlIGNoZWNrcywgIgorCQkJCQkJCSJ2b2wtPm1mdF96b25lX3BvcyAiCisJCQkJCQkJIjB4JWxseC4iLAorCQkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJCQkJdm9sLT5tZnRfem9uZV9wb3MpOworCQkJCQl0YyA9IHJsW3JscG9zIC0gMV0ubGNuICsKKwkJCQkJCQlybFtybHBvcyAtIDFdLmxlbmd0aDsKKwkJCQkJaWYgKHRjID49IHZvbC0+bWZ0X3pvbmVfZW5kKSB7CisJCQkJCQl2b2wtPm1mdF96b25lX3BvcyA9CisJCQkJCQkJCXZvbC0+bWZ0X2xjbjsKKwkJCQkJCWlmICghdm9sLT5tZnRfem9uZV9lbmQpCisJCQkJCQkJdm9sLT5tZnRfem9uZV9wb3MgPSAwOworCQkJCQl9IGVsc2UgaWYgKChibXBfaW5pdGlhbF9wb3MgPj0KKwkJCQkJCQl2b2wtPm1mdF96b25lX3BvcyB8fAorCQkJCQkJCXRjID4gdm9sLT5tZnRfem9uZV9wb3MpCisJCQkJCQkJJiYgdGMgPj0gdm9sLT5tZnRfbGNuKQorCQkJCQkJdm9sLT5tZnRfem9uZV9wb3MgPSB0YzsKKwkJCQkJbnRmc19kZWJ1ZygiQWZ0ZXIgY2hlY2tzLCAiCisJCQkJCQkJInZvbC0+bWZ0X3pvbmVfcG9zICIKKwkJCQkJCQkiMHglbGx4LiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQl2b2wtPm1mdF96b25lX3Bvcyk7CisJCQkJfQorCQkJCS8qIFN3aXRjaCBmcm9tIG1mdCB6b25lIHRvIGRhdGExIHpvbmUuICovCitzd2l0Y2hfdG9fZGF0YTFfem9uZToJCXNlYXJjaF96b25lID0gMjsKKwkJCQl6b25lX3N0YXJ0ID0gYm1wX2luaXRpYWxfcG9zID0KKwkJCQkJCXZvbC0+ZGF0YTFfem9uZV9wb3M7CisJCQkJem9uZV9lbmQgPSB2b2wtPm5yX2NsdXN0ZXJzOworCQkJCWlmICh6b25lX3N0YXJ0ID09IHZvbC0+bWZ0X3pvbmVfZW5kKQorCQkJCQlwYXNzID0gMjsKKwkJCQlpZiAoem9uZV9zdGFydCA+PSB6b25lX2VuZCkgeworCQkJCQl2b2wtPmRhdGExX3pvbmVfcG9zID0gem9uZV9zdGFydCA9CisJCQkJCQkJdm9sLT5tZnRfem9uZV9lbmQ7CisJCQkJCXBhc3MgPSAyOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQludGZzX2RlYnVnKCJTd2l0Y2hpbmcgZnJvbSBkYXRhMSB6b25lIHRvICIKKwkJCQkJCSJkYXRhMiB6b25lLiIpOworCQkJCS8qIFVwZGF0ZSBkYXRhMSB6b25lIHBvc2l0aW9uLiAqLworCQkJCWlmIChybHBvcykgeworCQkJCQlMQ04gdGM7CisKKwkJCQkJbnRmc19kZWJ1ZygiQmVmb3JlIGNoZWNrcywgIgorCQkJCQkJCSJ2b2wtPmRhdGExX3pvbmVfcG9zICIKKwkJCQkJCQkiMHglbGx4LiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQl2b2wtPmRhdGExX3pvbmVfcG9zKTsKKwkJCQkJdGMgPSBybFtybHBvcyAtIDFdLmxjbiArCisJCQkJCQkJcmxbcmxwb3MgLSAxXS5sZW5ndGg7CisJCQkJCWlmICh0YyA+PSB2b2wtPm5yX2NsdXN0ZXJzKQorCQkJCQkJdm9sLT5kYXRhMV96b25lX3BvcyA9CisJCQkJCQkJICAgICB2b2wtPm1mdF96b25lX2VuZDsKKwkJCQkJZWxzZSBpZiAoKGJtcF9pbml0aWFsX3BvcyA+PQorCQkJCQkJICAgIHZvbC0+ZGF0YTFfem9uZV9wb3MgfHwKKwkJCQkJCSAgICB0YyA+IHZvbC0+ZGF0YTFfem9uZV9wb3MpCisJCQkJCQkgICAgJiYgdGMgPj0gdm9sLT5tZnRfem9uZV9lbmQpCisJCQkJCQl2b2wtPmRhdGExX3pvbmVfcG9zID0gdGM7CisJCQkJCW50ZnNfZGVidWcoIkFmdGVyIGNoZWNrcywgIgorCQkJCQkJCSJ2b2wtPmRhdGExX3pvbmVfcG9zICIKKwkJCQkJCQkiMHglbGx4LiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQl2b2wtPmRhdGExX3pvbmVfcG9zKTsKKwkJCQl9CisJCQkJLyogU3dpdGNoIGZyb20gZGF0YTEgem9uZSB0byBkYXRhMiB6b25lLiAqLworCQkJCXNlYXJjaF96b25lID0gNDsKKwkJCQl6b25lX3N0YXJ0ID0gYm1wX2luaXRpYWxfcG9zID0KKwkJCQkJCXZvbC0+ZGF0YTJfem9uZV9wb3M7CisJCQkJem9uZV9lbmQgPSB2b2wtPm1mdF96b25lX3N0YXJ0OworCQkJCWlmICghem9uZV9zdGFydCkKKwkJCQkJcGFzcyA9IDI7CisJCQkJaWYgKHpvbmVfc3RhcnQgPj0gem9uZV9lbmQpIHsKKwkJCQkJdm9sLT5kYXRhMl96b25lX3BvcyA9IHpvbmVfc3RhcnQgPQorCQkJCQkJCWJtcF9pbml0aWFsX3BvcyA9IDA7CisJCQkJCXBhc3MgPSAyOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQludGZzX2RlYnVnKCJTd2l0Y2hpbmcgZnJvbSBkYXRhMiB6b25lIHRvICIKKwkJCQkJCSJkYXRhMSB6b25lLiIpOworCQkJCS8qIFVwZGF0ZSBkYXRhMiB6b25lIHBvc2l0aW9uLiAqLworCQkJCWlmIChybHBvcykgeworCQkJCQlMQ04gdGM7CisKKwkJCQkJbnRmc19kZWJ1ZygiQmVmb3JlIGNoZWNrcywgIgorCQkJCQkJCSJ2b2wtPmRhdGEyX3pvbmVfcG9zICIKKwkJCQkJCQkiMHglbGx4LiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQl2b2wtPmRhdGEyX3pvbmVfcG9zKTsKKwkJCQkJdGMgPSBybFtybHBvcyAtIDFdLmxjbiArCisJCQkJCQkJcmxbcmxwb3MgLSAxXS5sZW5ndGg7CisJCQkJCWlmICh0YyA+PSB2b2wtPm1mdF96b25lX3N0YXJ0KQorCQkJCQkJdm9sLT5kYXRhMl96b25lX3BvcyA9IDA7CisJCQkJCWVsc2UgaWYgKGJtcF9pbml0aWFsX3BvcyA+PQorCQkJCQkJICAgICAgdm9sLT5kYXRhMl96b25lX3BvcyB8fAorCQkJCQkJICAgICAgdGMgPiB2b2wtPmRhdGEyX3pvbmVfcG9zKQorCQkJCQkJdm9sLT5kYXRhMl96b25lX3BvcyA9IHRjOworCQkJCQludGZzX2RlYnVnKCJBZnRlciBjaGVja3MsICIKKwkJCQkJCQkidm9sLT5kYXRhMl96b25lX3BvcyAiCisJCQkJCQkJIjB4JWxseC4iLAorCQkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJCQkJdm9sLT5kYXRhMl96b25lX3Bvcyk7CisJCQkJfQorCQkJCS8qIFN3aXRjaCBmcm9tIGRhdGEyIHpvbmUgdG8gZGF0YTEgem9uZS4gKi8KKwkJCQlnb3RvIHN3aXRjaF90b19kYXRhMV96b25lOworCQkJZGVmYXVsdDoKKwkJCQlCVUcoKTsKKwkJCX0KKwkJCW50ZnNfZGVidWcoIkFmdGVyIHpvbmUgc3dpdGNoLCBzZWFyY2hfem9uZSAlaSwgIgorCQkJCQkicGFzcyAlaSwgYm1wX2luaXRpYWxfcG9zIDB4JWxseCwgIgorCQkJCQkiem9uZV9zdGFydCAweCVsbHgsIHpvbmVfZW5kIDB4JWxseC4iLAorCQkJCQlzZWFyY2hfem9uZSwgcGFzcywKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylibXBfaW5pdGlhbF9wb3MsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpem9uZV9zdGFydCwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl6b25lX2VuZCk7CisJCQlibXBfcG9zID0gem9uZV9zdGFydDsKKwkJCWlmICh6b25lX3N0YXJ0ID09IHpvbmVfZW5kKSB7CisJCQkJbnRmc19kZWJ1ZygiRW1wdHkgem9uZSwgZ29pbmcgdG8gIgorCQkJCQkJImRvbmVfem9uZXNfY2hlY2suIik7CisJCQkJLyogRW1wdHkgem9uZS4gRG9uJ3QgYm90aGVyIHNlYXJjaGluZyBpdC4gKi8KKwkJCQlnb3RvIGRvbmVfem9uZXNfY2hlY2s7CisJCQl9CisJCQludGZzX2RlYnVnKCJDb250aW51aW5nIG91dGVyIHdoaWxlIGxvb3AuIik7CisJCQljb250aW51ZTsKKwkJfSAvKiBkb25lX3pvbmVzID09IDcgKi8KKwkJbnRmc19kZWJ1ZygiQWxsIHpvbmVzIGFyZSBmaW5pc2hlZC4iKTsKKwkJLyoKKwkJICogQWxsIHpvbmVzIGFyZSBmaW5pc2hlZCEgIElmIERBVEFfWk9ORSwgc2hyaW5rIG1mdCB6b25lLiAgSWYKKwkJICogTUZUX1pPTkUsIHdlIGhhdmUgcmVhbGx5IHJ1biBvdXQgb2Ygc3BhY2UuCisJCSAqLworCQltZnRfem9uZV9zaXplID0gdm9sLT5tZnRfem9uZV9lbmQgLSB2b2wtPm1mdF96b25lX3N0YXJ0OworCQludGZzX2RlYnVnKCJ2b2wtPm1mdF96b25lX3N0YXJ0IDB4JWxseCwgdm9sLT5tZnRfem9uZV9lbmQgIgorCQkJCSIweCVsbHgsIG1mdF96b25lX3NpemUgMHglbGx4LiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2b2wtPm1mdF96b25lX3N0YXJ0LAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdm9sLT5tZnRfem9uZV9lbmQsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyltZnRfem9uZV9zaXplKTsKKwkJaWYgKHpvbmUgPT0gTUZUX1pPTkUgfHwgbWZ0X3pvbmVfc2l6ZSA8PSAwKSB7CisJCQludGZzX2RlYnVnKCJObyBmcmVlIGNsdXN0ZXJzIGxlZnQsIGdvaW5nIHRvIG91dC4iKTsKKwkJCS8qIFJlYWxseSBubyBtb3JlIHNwYWNlIGxlZnQgb24gZGV2aWNlLiAqLworCQkJZXJyID0gRU5PU1BDOworCQkJZ290byBvdXQ7CisJCX0gLyogem9uZSA9PSBEQVRBX1pPTkUgJiYgbWZ0X3pvbmVfc2l6ZSA+IDAgKi8KKwkJbnRmc19kZWJ1ZygiU2hyaW5raW5nIG1mdCB6b25lLiIpOworCQl6b25lX2VuZCA9IHZvbC0+bWZ0X3pvbmVfZW5kOworCQltZnRfem9uZV9zaXplID4+PSAxOworCQlpZiAobWZ0X3pvbmVfc2l6ZSA+IDApCisJCQl2b2wtPm1mdF96b25lX2VuZCA9IHZvbC0+bWZ0X3pvbmVfc3RhcnQgKyBtZnRfem9uZV9zaXplOworCQllbHNlIC8qIG1mdCB6b25lIGFuZCBkYXRhMiB6b25lIG5vIGxvbmdlciBleGlzdC4gKi8KKwkJCXZvbC0+ZGF0YTJfem9uZV9wb3MgPSB2b2wtPm1mdF96b25lX3N0YXJ0ID0KKwkJCQkJdm9sLT5tZnRfem9uZV9lbmQgPSAwOworCQlpZiAodm9sLT5tZnRfem9uZV9wb3MgPj0gdm9sLT5tZnRfem9uZV9lbmQpIHsKKwkJCXZvbC0+bWZ0X3pvbmVfcG9zID0gdm9sLT5tZnRfbGNuOworCQkJaWYgKCF2b2wtPm1mdF96b25lX2VuZCkKKwkJCQl2b2wtPm1mdF96b25lX3BvcyA9IDA7CisJCX0KKwkJYm1wX3BvcyA9IHpvbmVfc3RhcnQgPSBibXBfaW5pdGlhbF9wb3MgPQorCQkJCXZvbC0+ZGF0YTFfem9uZV9wb3MgPSB2b2wtPm1mdF96b25lX2VuZDsKKwkJc2VhcmNoX3pvbmUgPSAyOworCQlwYXNzID0gMjsKKwkJZG9uZV96b25lcyAmPSB+MjsKKwkJbnRmc19kZWJ1ZygiQWZ0ZXIgc2hyaW5raW5nIG1mdCB6b25lLCBtZnRfem9uZV9zaXplIDB4JWxseCwgIgorCQkJCSJ2b2wtPm1mdF96b25lX3N0YXJ0IDB4JWxseCwgIgorCQkJCSJ2b2wtPm1mdF96b25lX2VuZCAweCVsbHgsICIKKwkJCQkidm9sLT5tZnRfem9uZV9wb3MgMHglbGx4LCBzZWFyY2hfem9uZSAyLCAiCisJCQkJInBhc3MgMiwgZG9uZXNfem9uZXMgMHgleCwgem9uZV9zdGFydCAweCVsbHgsICIKKwkJCQkiem9uZV9lbmQgMHglbGx4LCB2b2wtPmRhdGExX3pvbmVfcG9zIDB4JWxseCwgIgorCQkJCSJjb250aW51aW5nIG91dGVyIHdoaWxlIGxvb3AuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKW1mdF96b25lX3NpemUsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2b2wtPm1mdF96b25lX3N0YXJ0LAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdm9sLT5tZnRfem9uZV9lbmQsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2b2wtPm1mdF96b25lX3BvcywKKwkJCQlkb25lX3pvbmVzLCAodW5zaWduZWQgbG9uZyBsb25nKXpvbmVfc3RhcnQsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl6b25lX2VuZCwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZvbC0+ZGF0YTFfem9uZV9wb3MpOworCX0KKwludGZzX2RlYnVnKCJBZnRlciBvdXRlciB3aGlsZSBsb29wLiIpOworb3V0OgorCW50ZnNfZGVidWcoIkF0IG91dC4iKTsKKwkvKiBBZGQgcnVubGlzdCB0ZXJtaW5hdG9yIGVsZW1lbnQuICovCisJaWYgKGxpa2VseShybCkpIHsKKwkJcmxbcmxwb3NdLnZjbiA9IHJsW3JscG9zIC0gMV0udmNuICsgcmxbcmxwb3MgLSAxXS5sZW5ndGg7CisJCXJsW3JscG9zXS5sY24gPSBMQ05fUkxfTk9UX01BUFBFRDsKKwkJcmxbcmxwb3NdLmxlbmd0aCA9IDA7CisJfQorCWlmIChsaWtlbHkocGFnZSAmJiAhSVNfRVJSKHBhZ2UpKSkgeworCQlpZiAobmVlZF93cml0ZWJhY2spIHsKKwkJCW50ZnNfZGVidWcoIk1hcmtpbmcgcGFnZSBkaXJ0eS4iKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCQluZWVkX3dyaXRlYmFjayA9IDA7CisJCX0KKwkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCX0KKwlpZiAobGlrZWx5KCFlcnIpKSB7CisJCXVwX3dyaXRlKCZ2b2wtPmxjbmJtcF9sb2NrKTsKKwkJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwkJcmV0dXJuIHJsOworCX0KKwludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gYWxsb2NhdGUgY2x1c3RlcnMsIGFib3J0aW5nICIKKwkJCSIoZXJyb3IgJWkpLiIsIGVycik7CisJaWYgKHJsKSB7CisJCWludCBlcnIyOworCisJCWlmIChlcnIgPT0gRU5PU1BDKQorCQkJbnRmc19kZWJ1ZygiTm90IGVub3VnaCBzcGFjZSB0byBjb21wbGV0ZSBhbGxvY2F0aW9uLCAiCisJCQkJCSJlcnIgRU5PU1BDLCBmaXJzdCBmcmVlIGxjbiAweCVsbHgsICIKKwkJCQkJImNvdWxkIGFsbG9jYXRlIHVwIHRvIDB4JWxseCAiCisJCQkJCSJjbHVzdGVycy4iLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJsWzBdLmxjbiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljb3VudCAtIGNsdXN0ZXJzKTsKKwkJLyogRGVhbGxvY2F0ZSBhbGwgYWxsb2NhdGVkIGNsdXN0ZXJzLiAqLworCQludGZzX2RlYnVnKCJBdHRlbXB0aW5nIHJvbGxiYWNrLi4uIik7CisJCWVycjIgPSBudGZzX2NsdXN0ZXJfZnJlZV9mcm9tX3JsX25vbG9jayh2b2wsIHJsKTsKKwkJaWYgKGVycjIpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByb2xsYmFjayAoZXJyb3IgJWkpLiAgIgorCQkJCQkiTGVhdmluZyBpbmNvbnNpc3RlbnQgbWV0YWRhdGEhICAiCisJCQkJCSJVbm1vdW50IGFuZCBydW4gY2hrZHNrLiIsIGVycjIpOworCQkJTlZvbFNldEVycm9ycyh2b2wpOworCQl9CisJCS8qIEZyZWUgdGhlIHJ1bmxpc3QuICovCisJCW50ZnNfZnJlZShybCk7CisJfSBlbHNlIGlmIChlcnIgPT0gRU5PU1BDKQorCQludGZzX2RlYnVnKCJObyBzcGFjZSBsZWZ0IGF0IGFsbCwgZXJyID0gRU5PU1BDLCAiCisJCQkJImZpcnN0IGZyZWUgbGNuID0gMHglbGx4LiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2b2wtPmRhdGExX3pvbmVfcG9zKTsKKwl1cF93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyoqCisgKiBfX250ZnNfY2x1c3Rlcl9mcmVlIC0gZnJlZSBjbHVzdGVycyBvbiBhbiBudGZzIHZvbHVtZQorICogQHZpOgkJdmZzIGlub2RlIHdob3NlIHJ1bmxpc3QgZGVzY3JpYmVzIHRoZSBjbHVzdGVycyB0byBmcmVlCisgKiBAc3RhcnRfdmNuOgl2Y24gaW4gdGhlIHJ1bmxpc3Qgb2YgQHZpIGF0IHdoaWNoIHRvIHN0YXJ0IGZyZWVpbmcgY2x1c3RlcnMKKyAqIEBjb3VudDoJbnVtYmVyIG9mIGNsdXN0ZXJzIHRvIGZyZWUgb3IgLTEgZm9yIGFsbCBjbHVzdGVycworICogQGlzX3JvbGxiYWNrOglpZiBUUlVFIHRoaXMgaXMgYSByb2xsYmFjayBvcGVyYXRpb24KKyAqCisgKiBGcmVlIEBjb3VudCBjbHVzdGVycyBzdGFydGluZyBhdCB0aGUgY2x1c3RlciBAc3RhcnRfdmNuIGluIHRoZSBydW5saXN0CisgKiBkZXNjcmliZWQgYnkgdGhlIHZmcyBpbm9kZSBAdmkuCisgKgorICogSWYgQGNvdW50IGlzIC0xLCBhbGwgY2x1c3RlcnMgZnJvbSBAc3RhcnRfdmNuIHRvIHRoZSBlbmQgb2YgdGhlIHJ1bmxpc3QgYXJlCisgKiBkZWFsbG9jYXRlZC4gIFRodXMsIHRvIGNvbXBsZXRlbHkgZnJlZSBhbGwgY2x1c3RlcnMgaW4gYSBydW5saXN0LCB1c2UKKyAqIEBzdGFydF92Y24gPSAwIGFuZCBAY291bnQgPSAtMS4KKyAqCisgKiBAaXNfcm9sbGJhY2sgc2hvdWxkIGFsd2F5cyBiZSBGQUxTRSwgaXQgaXMgZm9yIGludGVybmFsIHVzZSB0byByb2xsYmFjaworICogZXJyb3JzLiAgWW91IHByb2JhYmx5IHdhbnQgdG8gdXNlIG50ZnNfY2x1c3Rlcl9mcmVlKCkgaW5zdGVhZC4KKyAqCisgKiBOb3RlLCBudGZzX2NsdXN0ZXJfZnJlZSgpIGRvZXMgbm90IG1vZGlmeSB0aGUgcnVubGlzdCBhdCBhbGwsIHNvIHRoZSBjYWxsZXIKKyAqIGhhcyB0byBkZWFsIHdpdGggaXQgbGF0ZXIuCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZGVhbGxvY2F0ZWQgY2x1c3RlcnMgKG5vdCBjb3VudGluZyBzcGFyc2Ugb25lcykgb24KKyAqIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBMb2NraW5nOiAtIFRoZSBydW5saXN0IGRlc2NyaWJlZCBieSBAdmkgbXVzdCBiZSB1bmxvY2tlZCBvbiBlbnRyeSBhbmQgaXMKKyAqCSAgICAgIHVubG9ja2VkIG9uIHJldHVybi4KKyAqCSAgICAtIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHJ1bmxpc3QgbG9jayBvZiBAdmkgZm9yIHJlYWRpbmcgYW5kCisgKgkgICAgICBzb21ldGltZXMgZm9yIHdyaXRpbmcgYW5kIHNvbWV0aW1lcyBtb2RpZmllcyB0aGUgcnVubGlzdC4KKyAqCSAgICAtIFRoZSB2b2x1bWUgbGNuIGJpdG1hcCBtdXN0IGJlIHVubG9ja2VkIG9uIGVudHJ5IGFuZCBpcyB1bmxvY2tlZAorICoJICAgICAgb24gcmV0dXJuLgorICoJICAgIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdm9sdW1lIGxjbiBiaXRtYXAgbG9jayBmb3Igd3JpdGluZyBhbmQKKyAqCSAgICAgIG1vZGlmaWVzIHRoZSBiaXRtYXAgY29udGVudHMuCisgKi8KK3M2NCBfX250ZnNfY2x1c3Rlcl9mcmVlKHN0cnVjdCBpbm9kZSAqdmksIGNvbnN0IFZDTiBzdGFydF92Y24sIHM2NCBjb3VudCwKKwkJY29uc3QgQk9PTCBpc19yb2xsYmFjaykKK3sKKwlzNjQgZGVsdGEsIHRvX2ZyZWUsIHRvdGFsX2ZyZWVkLCByZWFsX2ZyZWVkOworCW50ZnNfaW5vZGUgKm5pOworCW50ZnNfdm9sdW1lICp2b2w7CisJc3RydWN0IGlub2RlICpsY25ibXBfdmk7CisJcnVubGlzdF9lbGVtZW50ICpybDsKKwlpbnQgZXJyOworCisJQlVHX09OKCF2aSk7CisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlfaW5vIDB4JWx4LCBzdGFydF92Y24gMHglbGx4LCBjb3VudCAiCisJCQkiMHglbGx4LiVzIiwgdmktPmlfaW5vLCAodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0X3ZjbiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpY291bnQsCisJCQlpc19yb2xsYmFjayA/ICIgKHJvbGxiYWNrKSIgOiAiIik7CisJbmkgPSBOVEZTX0kodmkpOworCXZvbCA9IG5pLT52b2w7CisJbGNuYm1wX3ZpID0gdm9sLT5sY25ibXBfaW5vOworCUJVR19PTighbGNuYm1wX3ZpKTsKKwlCVUdfT04oc3RhcnRfdmNuIDwgMCk7CisJQlVHX09OKGNvdW50IDwgLTEpOworCS8qCisJICogTG9jayB0aGUgbGNuIGJpdG1hcCBmb3Igd3JpdGluZyBidXQgb25seSBpZiBub3Qgcm9sbGluZyBiYWNrLiAgV2UKKwkgKiBtdXN0IGhvbGQgdGhlIGxvY2sgYWxsIHRoZSB3YXkgaW5jbHVkaW5nIHRocm91Z2ggcm9sbGJhY2sgb3RoZXJ3aXNlCisJICogcm9sbGJhY2sgaXMgbm90IHBvc3NpYmxlIGJlY2F1c2Ugb25jZSB3ZSBoYXZlIGNsZWFyZWQgYSBiaXQgYW5kCisJICogZHJvcHBlZCB0aGUgbG9jaywgYW55b25lIGNvdWxkIGhhdmUgc2V0IHRoZSBiaXQgYWdhaW4sIHRodXMKKwkgKiBhbGxvY2F0aW5nIHRoZSBjbHVzdGVyIGZvciBhbm90aGVyIHVzZS4KKwkgKi8KKwlpZiAobGlrZWx5KCFpc19yb2xsYmFjaykpCisJCWRvd25fd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOworCisJdG90YWxfZnJlZWQgPSByZWFsX2ZyZWVkID0gMDsKKworCS8qIFRoaXMgcmV0dXJucyB3aXRoIG5pLT5ydW5saXN0IGxvY2tlZCBmb3IgcmVhZGluZyBvbiBzdWNjZXNzLiAqLworCXJsID0gbnRmc19maW5kX3ZjbihuaSwgc3RhcnRfdmNuLCBGQUxTRSk7CisJaWYgKElTX0VSUihybCkpIHsKKwkJaWYgKCFpc19yb2xsYmFjaykKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmaW5kIGZpcnN0IHJ1bmxpc3QgIgorCQkJCQkiZWxlbWVudCAoZXJyb3IgJWxpKSwgYWJvcnRpbmcuIiwKKwkJCQkJUFRSX0VSUihybCkpOworCQllcnIgPSBQVFJfRVJSKHJsKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlpZiAodW5saWtlbHkocmwtPmxjbiA8IExDTl9IT0xFKSkgeworCQlpZiAoIWlzX3JvbGxiYWNrKQorCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmlyc3QgcnVubGlzdCBlbGVtZW50IGhhcyAiCisJCQkJCSJpbnZhbGlkIGxjbiwgYWJvcnRpbmcuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gdW5sX2Vycl9vdXQ7CisJfQorCS8qIEZpbmQgdGhlIHN0YXJ0aW5nIGNsdXN0ZXIgaW5zaWRlIHRoZSBydW4gdGhhdCBuZWVkcyBmcmVlaW5nLiAqLworCWRlbHRhID0gc3RhcnRfdmNuIC0gcmwtPnZjbjsKKworCS8qIFRoZSBudW1iZXIgb2YgY2x1c3RlcnMgaW4gdGhpcyBydW4gdGhhdCBuZWVkIGZyZWVpbmcuICovCisJdG9fZnJlZSA9IHJsLT5sZW5ndGggLSBkZWx0YTsKKwlpZiAoY291bnQgPj0gMCAmJiB0b19mcmVlID4gY291bnQpCisJCXRvX2ZyZWUgPSBjb3VudDsKKworCWlmIChsaWtlbHkocmwtPmxjbiA+PSAwKSkgeworCQkvKiBEbyB0aGUgYWN0dWFsIGZyZWVpbmcgb2YgdGhlIGNsdXN0ZXJzIGluIHRoaXMgcnVuLiAqLworCQllcnIgPSBudGZzX2JpdG1hcF9zZXRfYml0c19pbl9ydW4obGNuYm1wX3ZpLCBybC0+bGNuICsgZGVsdGEsCisJCQkJdG9fZnJlZSwgbGlrZWx5KCFpc19yb2xsYmFjaykgPyAwIDogMSk7CisJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQlpZiAoIWlzX3JvbGxiYWNrKQorCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBjbGVhciBmaXJzdCBydW4gIgorCQkJCQkJIihlcnJvciAlaSksIGFib3J0aW5nLiIsIGVycik7CisJCQlnb3RvIHVubF9lcnJfb3V0OworCQl9CisJCS8qIFdlIGhhdmUgZnJlZWQgQHRvX2ZyZWUgcmVhbCBjbHVzdGVycy4gKi8KKwkJcmVhbF9mcmVlZCA9IHRvX2ZyZWU7CisJfTsKKwkvKiBHbyB0byB0aGUgbmV4dCBydW4gYW5kIGFkanVzdCB0aGUgbnVtYmVyIG9mIGNsdXN0ZXJzIGxlZnQgdG8gZnJlZS4gKi8KKwkrK3JsOworCWlmIChjb3VudCA+PSAwKQorCQljb3VudCAtPSB0b19mcmVlOworCisJLyogS2VlcCB0cmFjayBvZiB0aGUgdG90YWwgImZyZWVkIiBjbHVzdGVycywgaW5jbHVkaW5nIHNwYXJzZSBvbmVzLiAqLworCXRvdGFsX2ZyZWVkID0gdG9fZnJlZTsKKwkvKgorCSAqIExvb3Agb3ZlciB0aGUgcmVtYWluaW5nIHJ1bnMsIHVzaW5nIEBjb3VudCBhcyBhIGNhcHBpbmcgdmFsdWUsIGFuZAorCSAqIGZyZWUgdGhlbS4KKwkgKi8KKwlmb3IgKDsgcmwtPmxlbmd0aCAmJiBjb3VudCAhPSAwOyArK3JsKSB7CisJCWlmICh1bmxpa2VseShybC0+bGNuIDwgTENOX0hPTEUpKSB7CisJCQlWQ04gdmNuOworCisJCQkvKgorCQkJICogQXR0ZW1wdCB0byBtYXAgcnVubGlzdCwgZHJvcHBpbmcgcnVubGlzdCBsb2NrIGZvcgorCQkJICogdGhlIGR1cmF0aW9uLgorCQkJICovCisJCQl2Y24gPSBybC0+dmNuOworCQkJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CisJCQllcnIgPSBudGZzX21hcF9ydW5saXN0KG5pLCB2Y24pOworCQkJaWYgKGVycikgeworCQkJCWlmICghaXNfcm9sbGJhY2spCisJCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBtYXAgIgorCQkJCQkJCSJydW5saXN0IGZyYWdtZW50LiIpOworCQkJCWlmIChlcnIgPT0gLUVJTlZBTCB8fCBlcnIgPT0gLUVOT0VOVCkKKwkJCQkJZXJyID0gLUVJTzsKKwkJCQlnb3RvIGVycl9vdXQ7CisJCQl9CisJCQkvKgorCQkJICogVGhpcyByZXR1cm5zIHdpdGggbmktPnJ1bmxpc3QgbG9ja2VkIGZvciByZWFkaW5nIG9uCisJCQkgKiBzdWNjZXNzLgorCQkJICovCisJCQlybCA9IG50ZnNfZmluZF92Y24obmksIHZjbiwgRkFMU0UpOworCQkJaWYgKElTX0VSUihybCkpIHsKKwkJCQllcnIgPSBQVFJfRVJSKHJsKTsKKwkJCQlpZiAoIWlzX3JvbGxiYWNrKQorCQkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZmluZCAiCisJCQkJCQkJInN1YnNlcXVlbnQgcnVubGlzdCAiCisJCQkJCQkJImVsZW1lbnQuIik7CisJCQkJZ290byBlcnJfb3V0OworCQkJfQorCQkJaWYgKHVubGlrZWx5KHJsLT5sY24gPCBMQ05fSE9MRSkpIHsKKwkJCQlpZiAoIWlzX3JvbGxiYWNrKQorCQkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJSdW5saXN0IGVsZW1lbnQgIgorCQkJCQkJCSJoYXMgaW52YWxpZCBsY24gIgorCQkJCQkJCSIoMHglbGx4KS4iLAorCQkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJCQkJcmwtPmxjbik7CisJCQkJZXJyID0gLUVJTzsKKwkJCQlnb3RvIHVubF9lcnJfb3V0OworCQkJfQorCQl9CisJCS8qIFRoZSBudW1iZXIgb2YgY2x1c3RlcnMgaW4gdGhpcyBydW4gdGhhdCBuZWVkIGZyZWVpbmcuICovCisJCXRvX2ZyZWUgPSBybC0+bGVuZ3RoOworCQlpZiAoY291bnQgPj0gMCAmJiB0b19mcmVlID4gY291bnQpCisJCQl0b19mcmVlID0gY291bnQ7CisKKwkJaWYgKGxpa2VseShybC0+bGNuID49IDApKSB7CisJCQkvKiBEbyB0aGUgYWN0dWFsIGZyZWVpbmcgb2YgdGhlIGNsdXN0ZXJzIGluIHRoZSBydW4uICovCisJCQllcnIgPSBudGZzX2JpdG1hcF9zZXRfYml0c19pbl9ydW4obGNuYm1wX3ZpLCBybC0+bGNuLAorCQkJCQl0b19mcmVlLCBsaWtlbHkoIWlzX3JvbGxiYWNrKSA/IDAgOiAxKTsKKwkJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQkJaWYgKCFpc19yb2xsYmFjaykKKwkJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGNsZWFyICIKKwkJCQkJCQkic3Vic2VxdWVudCBydW4uIik7CisJCQkJZ290byB1bmxfZXJyX291dDsKKwkJCX0KKwkJCS8qIFdlIGhhdmUgZnJlZWQgQHRvX2ZyZWUgcmVhbCBjbHVzdGVycy4gKi8KKwkJCXJlYWxfZnJlZWQgKz0gdG9fZnJlZTsKKwkJfQorCQkvKiBBZGp1c3QgdGhlIG51bWJlciBvZiBjbHVzdGVycyBsZWZ0IHRvIGZyZWUuICovCisJCWlmIChjb3VudCA+PSAwKQorCQkJY291bnQgLT0gdG9fZnJlZTsKKwkKKwkJLyogVXBkYXRlIHRoZSB0b3RhbCBkb25lIGNsdXN0ZXJzLiAqLworCQl0b3RhbF9mcmVlZCArPSB0b19mcmVlOworCX0KKwl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwlpZiAobGlrZWx5KCFpc19yb2xsYmFjaykpCisJCXVwX3dyaXRlKCZ2b2wtPmxjbmJtcF9sb2NrKTsKKworCUJVR19PTihjb3VudCA+IDApOworCisJLyogV2UgYXJlIGRvbmUuICBSZXR1cm4gdGhlIG51bWJlciBvZiBhY3R1YWxseSBmcmVlZCBjbHVzdGVycy4gKi8KKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiByZWFsX2ZyZWVkOwordW5sX2Vycl9vdXQ6CisJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CitlcnJfb3V0OgorCWlmIChpc19yb2xsYmFjaykKKwkJcmV0dXJuIGVycjsKKwkvKiBJZiBubyByZWFsIGNsdXN0ZXJzIHdlcmUgZnJlZWQsIG5vIG5lZWQgdG8gcm9sbGJhY2suICovCisJaWYgKCFyZWFsX2ZyZWVkKSB7CisJCXVwX3dyaXRlKCZ2b2wtPmxjbmJtcF9sb2NrKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLyoKKwkgKiBBdHRlbXB0IHRvIHJvbGxiYWNrIGFuZCBpZiB0aGF0IHN1Y2NlZWRzIGp1c3QgcmV0dXJuIHRoZSBlcnJvciBjb2RlLgorCSAqIElmIHJvbGxiYWNrIGZhaWxzLCBzZXQgdGhlIHZvbHVtZSBlcnJvcnMgZmxhZywgZW1pdCBhbiBlcnJvcgorCSAqIG1lc3NhZ2UsIGFuZCByZXR1cm4gdGhlIGVycm9yIGNvZGUuCisJICovCisJZGVsdGEgPSBfX250ZnNfY2x1c3Rlcl9mcmVlKHZpLCBzdGFydF92Y24sIHRvdGFsX2ZyZWVkLCBUUlVFKTsKKwlpZiAoZGVsdGEgPCAwKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByb2xsYmFjayAoZXJyb3IgJWkpLiAgTGVhdmluZyAiCisJCQkJImluY29uc2lzdGVudCBtZXRhZGF0YSEgIFVubW91bnQgYW5kIHJ1biAiCisJCQkJImNoa2Rzay4iLCAoaW50KWRlbHRhKTsKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCX0KKwl1cF93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisJbnRmc19lcnJvcih2b2wtPnNiLCAiQWJvcnRpbmcgKGVycm9yICVpKS4iLCBlcnIpOworCXJldHVybiBlcnI7Cit9CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2xjbmFsbG9jLmggYi9mcy9udGZzL2xjbmFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhYzFjMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvbGNuYWxsb2MuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIGxjbmFsbG9jLmggLSBFeHBvcnRzIGZvciBOVEZTIGtlcm5lbCBjbHVzdGVyIChkZSlhbGxvY2F0aW9uLiAgUGFydCBvZiB0aGUKKyAqCQlMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfTENOQUxMT0NfSAorI2RlZmluZSBfTElOVVhfTlRGU19MQ05BTExPQ19ICisKKyNpZmRlZiBOVEZTX1JXCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJydW5saXN0LmgiCisjaW5jbHVkZSAidm9sdW1lLmgiCisKK3R5cGVkZWYgZW51bSB7CisJRklSU1RfWk9ORQk9IDAsCS8qIEZvciBzYW5pdHkgY2hlY2tpbmcuICovCisJTUZUX1pPTkUJPSAwLAkvKiBBbGxvY2F0ZSBmcm9tICRNRlQgem9uZS4gKi8KKwlEQVRBX1pPTkUJPSAxLAkvKiBBbGxvY2F0ZSBmcm9tICREQVRBIHpvbmUuICovCisJTEFTVF9aT05FCT0gMSwJLyogRm9yIHNhbml0eSBjaGVja2luZy4gKi8KK30gTlRGU19DTFVTVEVSX0FMTE9DQVRJT05fWk9ORVM7CisKK2V4dGVybiBydW5saXN0X2VsZW1lbnQgKm50ZnNfY2x1c3Rlcl9hbGxvYyhudGZzX3ZvbHVtZSAqdm9sLAorCQljb25zdCBWQ04gc3RhcnRfdmNuLCBjb25zdCBzNjQgY291bnQsIGNvbnN0IExDTiBzdGFydF9sY24sCisJCWNvbnN0IE5URlNfQ0xVU1RFUl9BTExPQ0FUSU9OX1pPTkVTIHpvbmUpOworCitleHRlcm4gczY0IF9fbnRmc19jbHVzdGVyX2ZyZWUoc3RydWN0IGlub2RlICp2aSwgY29uc3QgVkNOIHN0YXJ0X3ZjbiwKKwkJczY0IGNvdW50LCBjb25zdCBCT09MIGlzX3JvbGxiYWNrKTsKKworLyoqCisgKiBudGZzX2NsdXN0ZXJfZnJlZSAtIGZyZWUgY2x1c3RlcnMgb24gYW4gbnRmcyB2b2x1bWUKKyAqIEB2aToJCXZmcyBpbm9kZSB3aG9zZSBydW5saXN0IGRlc2NyaWJlcyB0aGUgY2x1c3RlcnMgdG8gZnJlZQorICogQHN0YXJ0X3ZjbjoJdmNuIGluIHRoZSBydW5saXN0IG9mIEB2aSBhdCB3aGljaCB0byBzdGFydCBmcmVlaW5nIGNsdXN0ZXJzCisgKiBAY291bnQ6CW51bWJlciBvZiBjbHVzdGVycyB0byBmcmVlIG9yIC0xIGZvciBhbGwgY2x1c3RlcnMKKyAqCisgKiBGcmVlIEBjb3VudCBjbHVzdGVycyBzdGFydGluZyBhdCB0aGUgY2x1c3RlciBAc3RhcnRfdmNuIGluIHRoZSBydW5saXN0CisgKiBkZXNjcmliZWQgYnkgdGhlIHZmcyBpbm9kZSBAdmkuCisgKgorICogSWYgQGNvdW50IGlzIC0xLCBhbGwgY2x1c3RlcnMgZnJvbSBAc3RhcnRfdmNuIHRvIHRoZSBlbmQgb2YgdGhlIHJ1bmxpc3QgYXJlCisgKiBkZWFsbG9jYXRlZC4gIFRodXMsIHRvIGNvbXBsZXRlbHkgZnJlZSBhbGwgY2x1c3RlcnMgaW4gYSBydW5saXN0LCB1c2UKKyAqIEBzdGFydF92Y24gPSAwIGFuZCBAY291bnQgPSAtMS4KKyAqCisgKiBOb3RlLCBudGZzX2NsdXN0ZXJfZnJlZSgpIGRvZXMgbm90IG1vZGlmeSB0aGUgcnVubGlzdCBhdCBhbGwsIHNvIHRoZSBjYWxsZXIKKyAqIGhhcyB0byBkZWFsIHdpdGggaXQgbGF0ZXIuCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZGVhbGxvY2F0ZWQgY2x1c3RlcnMgKG5vdCBjb3VudGluZyBzcGFyc2Ugb25lcykgb24KKyAqIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBMb2NraW5nOiAtIFRoZSBydW5saXN0IGRlc2NyaWJlZCBieSBAdmkgbXVzdCBiZSB1bmxvY2tlZCBvbiBlbnRyeSBhbmQgaXMKKyAqCSAgICAgIHVubG9ja2VkIG9uIHJldHVybi4KKyAqCSAgICAtIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHJ1bmxpc3QgbG9jayBvZiBAdmkgZm9yIHJlYWRpbmcgYW5kCisgKgkgICAgICBzb21ldGltZXMgZm9yIHdyaXRpbmcgYW5kIHNvbWV0aW1lcyBtb2RpZmllcyB0aGUgcnVubGlzdC4KKyAqCSAgICAtIFRoZSB2b2x1bWUgbGNuIGJpdG1hcCBtdXN0IGJlIHVubG9ja2VkIG9uIGVudHJ5IGFuZCBpcyB1bmxvY2tlZAorICoJICAgICAgb24gcmV0dXJuLgorICoJICAgIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdm9sdW1lIGxjbiBiaXRtYXAgbG9jayBmb3Igd3JpdGluZyBhbmQKKyAqCSAgICAgIG1vZGlmaWVzIHRoZSBiaXRtYXAgY29udGVudHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgczY0IG50ZnNfY2x1c3Rlcl9mcmVlKHN0cnVjdCBpbm9kZSAqdmksIGNvbnN0IFZDTiBzdGFydF92Y24sCisJCXM2NCBjb3VudCkKK3sKKwlyZXR1cm4gX19udGZzX2NsdXN0ZXJfZnJlZSh2aSwgc3RhcnRfdmNuLCBjb3VudCwgRkFMU0UpOworfQorCitleHRlcm4gaW50IG50ZnNfY2x1c3Rlcl9mcmVlX2Zyb21fcmxfbm9sb2NrKG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IHJ1bmxpc3RfZWxlbWVudCAqcmwpOworCisvKioKKyAqIG50ZnNfY2x1c3Rlcl9mcmVlX2Zyb21fcmwgLSBmcmVlIGNsdXN0ZXJzIGZyb20gcnVubGlzdAorICogQHZvbDoJbW91bnRlZCBudGZzIHZvbHVtZSBvbiB3aGljaCB0byBmcmVlIHRoZSBjbHVzdGVycworICogQHJsOgkJcnVubGlzdCBkZXNjcmliaW5nIHRoZSBjbHVzdGVycyB0byBmcmVlCisgKgorICogRnJlZSBhbGwgdGhlIGNsdXN0ZXJzIGRlc2NyaWJlZCBieSB0aGUgcnVubGlzdCBAcmwgb24gdGhlIHZvbHVtZSBAdm9sLiAgSW4KKyAqIHRoZSBjYXNlIG9mIGFuIGVycm9yIGJlaW5nIHJldHVybmVkLCBhdCBsZWFzdCBzb21lIG9mIHRoZSBjbHVzdGVycyB3ZXJlIG5vdAorICogZnJlZWQuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICoKKyAqIExvY2tpbmc6IFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHZvbHVtZSBsY24gYml0bWFwIGxvY2sgZm9yIHdyaXRpbmcgYW5kCisgKgkgICAgbW9kaWZpZXMgdGhlIGJpdG1hcCBjb250ZW50cy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbnRmc19jbHVzdGVyX2ZyZWVfZnJvbV9ybChudGZzX3ZvbHVtZSAqdm9sLAorCQljb25zdCBydW5saXN0X2VsZW1lbnQgKnJsKQoreworCWludCByZXQ7CisKKwlkb3duX3dyaXRlKCZ2b2wtPmxjbmJtcF9sb2NrKTsKKwlyZXQgPSBudGZzX2NsdXN0ZXJfZnJlZV9mcm9tX3JsX25vbG9jayh2b2wsIHJsKTsKKwl1cF93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KKworI2VuZGlmIC8qIGRlZmluZWQgX0xJTlVYX05URlNfTENOQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9sb2dmaWxlLmMgYi9mcy9udGZzL2xvZ2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTI4MGFiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9sb2dmaWxlLmMKQEAgLTAsMCArMSw3MDUgQEAKKy8qCisgKiBsb2dmaWxlLmMgLSBOVEZTIGtlcm5lbCBqb3VybmFsIGhhbmRsaW5nLiBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmZGVmIE5URlNfUlcKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgImF0dHJpYi5oIgorI2luY2x1ZGUgImFvcHMuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImxvZ2ZpbGUuaCIKKyNpbmNsdWRlICJtYWxsb2MuaCIKKyNpbmNsdWRlICJ2b2x1bWUuaCIKKyNpbmNsdWRlICJudGZzLmgiCisKKy8qKgorICogbnRmc19jaGVja19yZXN0YXJ0X3BhZ2VfaGVhZGVyIC0gY2hlY2sgdGhlIHBhZ2UgaGVhZGVyIGZvciBjb25zaXN0ZW5jeQorICogQHZpOgkJJExvZ0ZpbGUgaW5vZGUgdG8gd2hpY2ggdGhlIHJlc3RhcnQgcGFnZSBoZWFkZXIgYmVsb25ncworICogQHJwOgkJcmVzdGFydCBwYWdlIGhlYWRlciB0byBjaGVjaworICogQHBvczoJcG9zaXRpb24gaW4gQHZpIGF0IHdoaWNoIHRoZSByZXN0YXJ0IHBhZ2UgaGVhZGVyIHJlc2lkZXMKKyAqCisgKiBDaGVjayB0aGUgcmVzdGFydCBwYWdlIGhlYWRlciBAcnAgZm9yIGNvbnNpc3RlbmN5IGFuZCByZXR1cm4gVFJVRSBpZiBpdCBpcworICogY29uc2lzdGVudCBhbmQgRkFMU0Ugb3RoZXJ3aXNlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gb25seSBuZWVkcyBOVEZTX0JMT0NLX1NJWkUgYnl0ZXMgaW4gQHJwLCBpLmUuIGl0IGRvZXMgbm90CisgKiByZXF1aXJlIHRoZSBmdWxsIHJlc3RhcnQgcGFnZS4KKyAqLworc3RhdGljIEJPT0wgbnRmc19jaGVja19yZXN0YXJ0X3BhZ2VfaGVhZGVyKHN0cnVjdCBpbm9kZSAqdmksCisJCVJFU1RBUlRfUEFHRV9IRUFERVIgKnJwLCBzNjQgcG9zKQoreworCXUzMiBsb2dmaWxlX3N5c3RlbV9wYWdlX3NpemUsIGxvZ2ZpbGVfbG9nX3BhZ2Vfc2l6ZTsKKwl1MTYgdXNhX2NvdW50LCB1c2Ffb2ZzLCB1c2FfZW5kLCByYV9vZnM7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwkvKgorCSAqIElmIHRoZSBzeXN0ZW0gb3IgbG9nIHBhZ2Ugc2l6ZXMgYXJlIHNtYWxsZXIgdGhhbiB0aGUgbnRmcyBibG9jayBzaXplCisJICogb3IgZWl0aGVyIGlzIG5vdCBhIHBvd2VyIG9mIDIgd2UgY2Fubm90IGhhbmRsZSB0aGlzIGxvZyBmaWxlLgorCSAqLworCWxvZ2ZpbGVfc3lzdGVtX3BhZ2Vfc2l6ZSA9IGxlMzJfdG9fY3B1KHJwLT5zeXN0ZW1fcGFnZV9zaXplKTsKKwlsb2dmaWxlX2xvZ19wYWdlX3NpemUgPSBsZTMyX3RvX2NwdShycC0+bG9nX3BhZ2Vfc2l6ZSk7CisJaWYgKGxvZ2ZpbGVfc3lzdGVtX3BhZ2Vfc2l6ZSA8IE5URlNfQkxPQ0tfU0laRSB8fAorCQkJbG9nZmlsZV9sb2dfcGFnZV9zaXplIDwgTlRGU19CTE9DS19TSVpFIHx8CisJCQlsb2dmaWxlX3N5c3RlbV9wYWdlX3NpemUgJgorCQkJKGxvZ2ZpbGVfc3lzdGVtX3BhZ2Vfc2l6ZSAtIDEpIHx8CisJCQlsb2dmaWxlX2xvZ19wYWdlX3NpemUgJiAobG9nZmlsZV9sb2dfcGFnZV9zaXplIC0gMSkpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHVzZXMgdW5zdXBwb3J0ZWQgcGFnZSBzaXplLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qCisJICogV2UgbXVzdCBiZSBlaXRoZXIgYXQgIXBvcyAoMXN0IHJlc3RhcnQgcGFnZSkgb3IgYXQgcG9zID0gc3lzdGVtIHBhZ2UKKwkgKiBzaXplICgybmQgcmVzdGFydCBwYWdlKS4KKwkgKi8KKwlpZiAocG9zICYmIHBvcyAhPSBsb2dmaWxlX3N5c3RlbV9wYWdlX3NpemUpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIHJlc3RhcnQgYXJlYSBpbiBpbmNvcnJlY3QgIgorCQkJCSJwb3NpdGlvbiBpbiAkTG9nRmlsZS4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKiBXZSBvbmx5IGtub3cgaG93IHRvIGhhbmRsZSB2ZXJzaW9uIDEuMS4gKi8KKwlpZiAoc2xlMTZfdG9fY3B1KHJwLT5tYWpvcl92ZXIpICE9IDEgfHwKKwkJCXNsZTE2X3RvX2NwdShycC0+bWlub3JfdmVyKSAhPSAxKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkTG9nRmlsZSB2ZXJzaW9uICVpLiVpIGlzIG5vdCAiCisJCQkJInN1cHBvcnRlZC4gIChUaGlzIGRyaXZlciBzdXBwb3J0cyB2ZXJzaW9uICIKKwkJCQkiMS4xIG9ubHkuKSIsIChpbnQpc2xlMTZfdG9fY3B1KHJwLT5tYWpvcl92ZXIpLAorCQkJCShpbnQpc2xlMTZfdG9fY3B1KHJwLT5taW5vcl92ZXIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKiBWZXJpZnkgdGhlIHNpemUgb2YgdGhlIHVwZGF0ZSBzZXF1ZW5jZSBhcnJheS4gKi8KKwl1c2FfY291bnQgPSAxICsgKGxvZ2ZpbGVfc3lzdGVtX3BhZ2Vfc2l6ZSA+PiBOVEZTX0JMT0NLX1NJWkVfQklUUyk7CisJaWYgKHVzYV9jb3VudCAhPSBsZTE2X3RvX2NwdShycC0+dXNhX2NvdW50KSkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJExvZ0ZpbGUgcmVzdGFydCBwYWdlIHNwZWNpZmllcyAiCisJCQkJImluY29uc2lzdGVudCB1cGRhdGUgc2VxdWVuY2UgYXJyYXkgY291bnQuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyogVmVyaWZ5IHRoZSBwb3NpdGlvbiBvZiB0aGUgdXBkYXRlIHNlcXVlbmNlIGFycmF5LiAqLworCXVzYV9vZnMgPSBsZTE2X3RvX2NwdShycC0+dXNhX29mcyk7CisJdXNhX2VuZCA9IHVzYV9vZnMgKyB1c2FfY291bnQgKiBzaXplb2YodTE2KTsKKwlpZiAodXNhX29mcyA8IHNpemVvZihSRVNUQVJUX1BBR0VfSEVBREVSKSB8fAorCQkJdXNhX2VuZCA+IE5URlNfQkxPQ0tfU0laRSAtIHNpemVvZih1MTYpKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkTG9nRmlsZSByZXN0YXJ0IHBhZ2Ugc3BlY2lmaWVzICIKKwkJCQkiaW5jb25zaXN0ZW50IHVwZGF0ZSBzZXF1ZW5jZSBhcnJheSBvZmZzZXQuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyoKKwkgKiBWZXJpZnkgdGhlIHBvc2l0aW9uIG9mIHRoZSByZXN0YXJ0IGFyZWEuICBJdCBtdXN0IGJlOgorCSAqCS0gYWxpZ25lZCB0byA4LWJ5dGUgYm91bmRhcnksCisJICoJLSBhZnRlciB0aGUgdXBkYXRlIHNlcXVlbmNlIGFycmF5LCBhbmQKKwkgKgktIHdpdGhpbiB0aGUgc3lzdGVtIHBhZ2Ugc2l6ZS4KKwkgKi8KKwlyYV9vZnMgPSBsZTE2X3RvX2NwdShycC0+cmVzdGFydF9hcmVhX29mZnNldCk7CisJaWYgKHJhX29mcyAmIDcgfHwgcmFfb2ZzIDwgdXNhX2VuZCB8fAorCQkJcmFfb2ZzID4gbG9nZmlsZV9zeXN0ZW1fcGFnZV9zaXplKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkTG9nRmlsZSByZXN0YXJ0IHBhZ2Ugc3BlY2lmaWVzICIKKwkJCQkiaW5jb25zaXN0ZW50IHJlc3RhcnQgYXJlYSBvZmZzZXQuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyoKKwkgKiBPbmx5IHJlc3RhcnQgcGFnZXMgbW9kaWZpZWQgYnkgY2hrZHNrIGFyZSBhbGxvd2VkIHRvIGhhdmUgY2hrZHNrX2xzbgorCSAqIHNldC4KKwkgKi8KKwlpZiAoIW50ZnNfaXNfY2hrZF9yZWNvcmQocnAtPm1hZ2ljKSAmJiBzbGU2NF90b19jcHUocnAtPmNoa2Rza19sc24pKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkTG9nRmlsZSByZXN0YXJ0IHBhZ2UgaXMgbm90IG1vZGlmaWVkICIKKwkJCQkiY2hrZHNrIGJ1dCBhIGNoa2RzayBMU04gaXMgc3BlY2lmaWVkLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogbnRmc19jaGVja19yZXN0YXJ0X2FyZWEgLSBjaGVjayB0aGUgcmVzdGFydCBhcmVhIGZvciBjb25zaXN0ZW5jeQorICogQHZpOgkJJExvZ0ZpbGUgaW5vZGUgdG8gd2hpY2ggdGhlIHJlc3RhcnQgcGFnZSBiZWxvbmdzCisgKiBAcnA6CQlyZXN0YXJ0IHBhZ2Ugd2hvc2UgcmVzdGFydCBhcmVhIHRvIGNoZWNrCisgKgorICogQ2hlY2sgdGhlIHJlc3RhcnQgYXJlYSBvZiB0aGUgcmVzdGFydCBwYWdlIEBycCBmb3IgY29uc2lzdGVuY3kgYW5kIHJldHVybgorICogVFJVRSBpZiBpdCBpcyBjb25zaXN0ZW50IGFuZCBGQUxTRSBvdGhlcndpc2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlIHJlc3RhcnQgcGFnZSBoZWFkZXIgaGFzIGFscmVhZHkgYmVlbgorICogY29uc2lzdGVuY3kgY2hlY2tlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgbmVlZHMgTlRGU19CTE9DS19TSVpFIGJ5dGVzIGluIEBycCwgaS5lLiBpdCBkb2VzIG5vdAorICogcmVxdWlyZSB0aGUgZnVsbCByZXN0YXJ0IHBhZ2UuCisgKi8KK3N0YXRpYyBCT09MIG50ZnNfY2hlY2tfcmVzdGFydF9hcmVhKHN0cnVjdCBpbm9kZSAqdmksIFJFU1RBUlRfUEFHRV9IRUFERVIgKnJwKQoreworCXU2NCBmaWxlX3NpemU7CisJUkVTVEFSVF9BUkVBICpyYTsKKwl1MTYgcmFfb2ZzLCByYV9sZW4sIGNhX29mczsKKwl1OCBmc19iaXRzOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJcmFfb2ZzID0gbGUxNl90b19jcHUocnAtPnJlc3RhcnRfYXJlYV9vZmZzZXQpOworCXJhID0gKFJFU1RBUlRfQVJFQSopKCh1OCopcnAgKyByYV9vZnMpOworCS8qCisJICogRXZlcnl0aGluZyBiZWZvcmUgcmEtPmZpbGVfc2l6ZSBtdXN0IGJlIGJlZm9yZSB0aGUgZmlyc3Qgd29yZAorCSAqIHByb3RlY3RlZCBieSBhbiB1cGRhdGUgc2VxdWVuY2UgbnVtYmVyLiAgVGhpcyBlbnN1cmVzIHRoYXQgaXQgaXMKKwkgKiBzYWZlIHRvIGFjY2VzcyByYS0+Y2xpZW50X2FycmF5X29mZnNldC4KKwkgKi8KKwlpZiAocmFfb2ZzICsgb2Zmc2V0b2YoUkVTVEFSVF9BUkVBLCBmaWxlX3NpemUpID4KKwkJCU5URlNfQkxPQ0tfU0laRSAtIHNpemVvZih1MTYpKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkTG9nRmlsZSByZXN0YXJ0IGFyZWEgc3BlY2lmaWVzICIKKwkJCQkiaW5jb25zaXN0ZW50IGZpbGUgb2Zmc2V0LiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qCisJICogTm93IHRoYXQgd2UgY2FuIGFjY2VzcyByYS0+Y2xpZW50X2FycmF5X29mZnNldCwgbWFrZSBzdXJlIGV2ZXJ5dGhpbmcKKwkgKiB1cCB0byB0aGUgbG9nIGNsaWVudCBhcnJheSBpcyBiZWZvcmUgdGhlIGZpcnN0IHdvcmQgcHJvdGVjdGVkIGJ5IGFuCisJICogdXBkYXRlIHNlcXVlbmNlIG51bWJlci4gIFRoaXMgZW5zdXJlcyB3ZSBjYW4gYWNjZXNzIGFsbCBvZiB0aGUKKwkgKiByZXN0YXJ0IGFyZWEgZWxlbWVudHMgc2FmZWx5LiAgQWxzbywgdGhlIGNsaWVudCBhcnJheSBvZmZzZXQgbXVzdCBiZQorCSAqIGFsaWduZWQgdG8gYW4gOC1ieXRlIGJvdW5kYXJ5LgorCSAqLworCWNhX29mcyA9IGxlMTZfdG9fY3B1KHJhLT5jbGllbnRfYXJyYXlfb2Zmc2V0KTsKKwlpZiAoKChjYV9vZnMgKyA3KSAmIH43KSAhPSBjYV9vZnMgfHwKKwkJCXJhX29mcyArIGNhX29mcyA+IE5URlNfQkxPQ0tfU0laRSAtIHNpemVvZih1MTYpKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkTG9nRmlsZSByZXN0YXJ0IGFyZWEgc3BlY2lmaWVzICIKKwkJCQkiaW5jb25zaXN0ZW50IGNsaWVudCBhcnJheSBvZmZzZXQuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyoKKwkgKiBUaGUgcmVzdGFydCBhcmVhIG11c3QgZW5kIHdpdGhpbiB0aGUgc3lzdGVtIHBhZ2Ugc2l6ZSBib3RoIHdoZW4KKwkgKiBjYWxjdWxhdGVkIG1hbnVhbGx5IGFuZCBhcyBzcGVjaWZpZWQgYnkgcmEtPnJlc3RhcnRfYXJlYV9sZW5ndGguCisJICogQWxzbywgdGhlIGNhbGN1bGF0ZWQgbGVuZ3RoIG11c3Qgbm90IGV4Y2VlZCB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KKwkgKi8KKwlyYV9sZW4gPSBjYV9vZnMgKyBsZTE2X3RvX2NwdShyYS0+bG9nX2NsaWVudHMpICoKKwkJCXNpemVvZihMT0dfQ0xJRU5UX1JFQ09SRCk7CisJaWYgKHJhX29mcyArIHJhX2xlbiA+IGxlMzJfdG9fY3B1KHJwLT5zeXN0ZW1fcGFnZV9zaXplKSB8fAorCQkJcmFfb2ZzICsgbGUxNl90b19jcHUocmEtPnJlc3RhcnRfYXJlYV9sZW5ndGgpID4KKwkJCWxlMzJfdG9fY3B1KHJwLT5zeXN0ZW1fcGFnZV9zaXplKSB8fAorCQkJcmFfbGVuID4gbGUxNl90b19jcHUocmEtPnJlc3RhcnRfYXJlYV9sZW5ndGgpKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkTG9nRmlsZSByZXN0YXJ0IGFyZWEgaXMgb3V0IG9mIGJvdW5kcyAiCisJCQkJIm9mIHRoZSBzeXN0ZW0gcGFnZSBzaXplIHNwZWNpZmllZCBieSB0aGUgIgorCQkJCSJyZXN0YXJ0IHBhZ2UgaGVhZGVyIGFuZC9vciB0aGUgc3BlY2lmaWVkICIKKwkJCQkicmVzdGFydCBhcmVhIGxlbmd0aCBpcyBpbmNvbnNpc3RlbnQuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyoKKwkgKiBUaGUgcmEtPmNsaWVudF9mcmVlX2xpc3QgYW5kIHJhLT5jbGllbnRfaW5fdXNlX2xpc3QgbXVzdCBiZSBlaXRoZXIKKwkgKiBMT0dGSUxFX05PX0NMSUVOVCBvciBsZXNzIHRoYW4gcmEtPmxvZ19jbGllbnRzIG9yIHRoZXkgYXJlCisJICogb3ZlcmZsb3dpbmcgdGhlIGNsaWVudCBhcnJheS4KKwkgKi8KKwlpZiAoKHJhLT5jbGllbnRfZnJlZV9saXN0ICE9IExPR0ZJTEVfTk9fQ0xJRU5UICYmCisJCQlsZTE2X3RvX2NwdShyYS0+Y2xpZW50X2ZyZWVfbGlzdCkgPj0KKwkJCWxlMTZfdG9fY3B1KHJhLT5sb2dfY2xpZW50cykpIHx8CisJCQkocmEtPmNsaWVudF9pbl91c2VfbGlzdCAhPSBMT0dGSUxFX05PX0NMSUVOVCAmJgorCQkJbGUxNl90b19jcHUocmEtPmNsaWVudF9pbl91c2VfbGlzdCkgPj0KKwkJCWxlMTZfdG9fY3B1KHJhLT5sb2dfY2xpZW50cykpKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkTG9nRmlsZSByZXN0YXJ0IGFyZWEgc3BlY2lmaWVzICIKKwkJCQkib3ZlcmZsb3dpbmcgY2xpZW50IGZyZWUgYW5kL29yIGluIHVzZSBsaXN0cy4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKgorCSAqIENoZWNrIHJhLT5zZXFfbnVtYmVyX2JpdHMgYWdhaW5zdCByYS0+ZmlsZV9zaXplIGZvciBjb25zaXN0ZW5jeS4KKwkgKiBXZSBjYW5ub3QganVzdCB1c2UgZmZzKCkgYmVjYXVzZSB0aGUgZmlsZSBzaXplIGlzIG5vdCBhIHBvd2VyIG9mIDIuCisJICovCisJZmlsZV9zaXplID0gKHU2NClzbGU2NF90b19jcHUocmEtPmZpbGVfc2l6ZSk7CisJZnNfYml0cyA9IDA7CisJd2hpbGUgKGZpbGVfc2l6ZSkgeworCQlmaWxlX3NpemUgPj49IDE7CisJCWZzX2JpdHMrKzsKKwl9CisJaWYgKGxlMzJfdG9fY3B1KHJhLT5zZXFfbnVtYmVyX2JpdHMpICE9IDY3IC0gZnNfYml0cykgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJExvZ0ZpbGUgcmVzdGFydCBhcmVhIHNwZWNpZmllcyAiCisJCQkJImluY29uc2lzdGVudCBzZXF1ZW5jZSBudW1iZXIgYml0cy4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKiBUaGUgbG9nIHJlY29yZCBoZWFkZXIgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAqLworCWlmICgoKGxlMTZfdG9fY3B1KHJhLT5sb2dfcmVjb3JkX2hlYWRlcl9sZW5ndGgpICsgNykgJiB+NykgIT0KKwkJCWxlMTZfdG9fY3B1KHJhLT5sb2dfcmVjb3JkX2hlYWRlcl9sZW5ndGgpKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkTG9nRmlsZSByZXN0YXJ0IGFyZWEgc3BlY2lmaWVzICIKKwkJCQkiaW5jb25zaXN0ZW50IGxvZyByZWNvcmQgaGVhZGVyIGxlbmd0aC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKiBEaXRvIGZvciB0aGUgbG9nIHBhZ2UgZGF0YSBvZmZzZXQuICovCisJaWYgKCgobGUxNl90b19jcHUocmEtPmxvZ19wYWdlX2RhdGFfb2Zmc2V0KSArIDcpICYgfjcpICE9CisJCQlsZTE2X3RvX2NwdShyYS0+bG9nX3BhZ2VfZGF0YV9vZmZzZXQpKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkTG9nRmlsZSByZXN0YXJ0IGFyZWEgc3BlY2lmaWVzICIKKwkJCQkiaW5jb25zaXN0ZW50IGxvZyBwYWdlIGRhdGEgb2Zmc2V0LiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogbnRmc19jaGVja19sb2dfY2xpZW50X2FycmF5IC0gY2hlY2sgdGhlIGxvZyBjbGllbnQgYXJyYXkgZm9yIGNvbnNpc3RlbmN5CisgKiBAdmk6CQkkTG9nRmlsZSBpbm9kZSB0byB3aGljaCB0aGUgcmVzdGFydCBwYWdlIGJlbG9uZ3MKKyAqIEBycDoJCXJlc3RhcnQgcGFnZSB3aG9zZSBsb2cgY2xpZW50IGFycmF5IHRvIGNoZWNrCisgKgorICogQ2hlY2sgdGhlIGxvZyBjbGllbnQgYXJyYXkgb2YgdGhlIHJlc3RhcnQgcGFnZSBAcnAgZm9yIGNvbnNpc3RlbmN5IGFuZAorICogcmV0dXJuIFRSVUUgaWYgaXQgaXMgY29uc2lzdGVudCBhbmQgRkFMU0Ugb3RoZXJ3aXNlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSByZXN0YXJ0IHBhZ2UgaGVhZGVyIGFuZCB0aGUgcmVzdGFydCBhcmVhIGhhdmUKKyAqIGFscmVhZHkgYmVlbiBjb25zaXN0ZW5jeSBjaGVja2VkLgorICoKKyAqIFVubGlrZSBudGZzX2NoZWNrX3Jlc3RhcnRfcGFnZV9oZWFkZXIoKSBhbmQgbnRmc19jaGVja19yZXN0YXJ0X2FyZWEoKSwgdGhpcworICogZnVuY3Rpb24gbmVlZHMgQHJwLT5zeXN0ZW1fcGFnZV9zaXplIGJ5dGVzIGluIEBycCwgaS5lLiBpdCByZXF1aXJlcyB0aGUgZnVsbAorICogcmVzdGFydCBwYWdlIGFuZCB0aGUgcGFnZSBtdXN0IGJlIG11bHRpIHNlY3RvciB0cmFuc2ZlciBkZXByb3RlY3RlZC4KKyAqLworc3RhdGljIEJPT0wgbnRmc19jaGVja19sb2dfY2xpZW50X2FycmF5KHN0cnVjdCBpbm9kZSAqdmksCisJCVJFU1RBUlRfUEFHRV9IRUFERVIgKnJwKQoreworCVJFU1RBUlRfQVJFQSAqcmE7CisJTE9HX0NMSUVOVF9SRUNPUkQgKmNhLCAqY3I7CisJdTE2IG5yX2NsaWVudHMsIGlkeDsKKwlCT09MIGluX2ZyZWVfbGlzdCwgaWR4X2lzX2ZpcnN0OworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJcmEgPSAoUkVTVEFSVF9BUkVBKikoKHU4KilycCArIGxlMTZfdG9fY3B1KHJwLT5yZXN0YXJ0X2FyZWFfb2Zmc2V0KSk7CisJY2EgPSAoTE9HX0NMSUVOVF9SRUNPUkQqKSgodTgqKXJhICsKKwkJCWxlMTZfdG9fY3B1KHJhLT5jbGllbnRfYXJyYXlfb2Zmc2V0KSk7CisJLyoKKwkgKiBDaGVjayB0aGUgcmEtPmNsaWVudF9mcmVlX2xpc3QgZmlyc3QgYW5kIHRoZW4gY2hlY2sgdGhlCisJICogcmEtPmNsaWVudF9pbl91c2VfbGlzdC4gIENoZWNrIGVhY2ggb2YgdGhlIGxvZyBjbGllbnQgcmVjb3JkcyBpbgorCSAqIGVhY2ggb2YgdGhlIGxpc3RzIGFuZCBjaGVjayB0aGF0IHRoZSBhcnJheSBkb2VzIG5vdCBvdmVyZmxvdyB0aGUKKwkgKiByYS0+bG9nX2NsaWVudHMgdmFsdWUuICBBbHNvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiByZWNvcmRzCisJICogdmlzaXRlZCBhcyB0aGVyZSBjYW5ub3QgYmUgbW9yZSB0aGFuIHJhLT5sb2dfY2xpZW50cyByZWNvcmRzIGFuZAorCSAqIHRoYXQgd2F5IHdlIGRldGVjdCBldmVudHVhbCBsb29wcyBpbiB3aXRoaW4gYSBsaXN0LgorCSAqLworCW5yX2NsaWVudHMgPSBsZTE2X3RvX2NwdShyYS0+bG9nX2NsaWVudHMpOworCWlkeCA9IGxlMTZfdG9fY3B1KHJhLT5jbGllbnRfZnJlZV9saXN0KTsKKwlpbl9mcmVlX2xpc3QgPSBUUlVFOworY2hlY2tfbGlzdDoKKwlmb3IgKGlkeF9pc19maXJzdCA9IFRSVUU7IGlkeCAhPSBMT0dGSUxFX05PX0NMSUVOVF9DUFU7IG5yX2NsaWVudHMtLSwKKwkJCWlkeCA9IGxlMTZfdG9fY3B1KGNyLT5uZXh0X2NsaWVudCkpIHsKKwkJaWYgKCFucl9jbGllbnRzIHx8IGlkeCA+PSBsZTE2X3RvX2NwdShyYS0+bG9nX2NsaWVudHMpKQorCQkJZ290byBlcnJfb3V0OworCQkvKiBTZXQgQGNyIHRvIHRoZSBjdXJyZW50IGxvZyBjbGllbnQgcmVjb3JkLiAqLworCQljciA9IGNhICsgaWR4OworCQkvKiBUaGUgZmlyc3QgbG9nIGNsaWVudCByZWNvcmQgbXVzdCBub3QgaGF2ZSBhIHByZXZfY2xpZW50LiAqLworCQlpZiAoaWR4X2lzX2ZpcnN0KSB7CisJCQlpZiAoY3ItPnByZXZfY2xpZW50ICE9IExPR0ZJTEVfTk9fQ0xJRU5UKQorCQkJCWdvdG8gZXJyX291dDsKKwkJCWlkeF9pc19maXJzdCA9IEZBTFNFOworCQl9CisJfQorCS8qIFN3aXRjaCB0byBhbmQgY2hlY2sgdGhlIGluIHVzZSBsaXN0IGlmIHdlIGp1c3QgZGlkIHRoZSBmcmVlIGxpc3QuICovCisJaWYgKGluX2ZyZWVfbGlzdCkgeworCQlpbl9mcmVlX2xpc3QgPSBGQUxTRTsKKwkJaWR4ID0gbGUxNl90b19jcHUocmEtPmNsaWVudF9pbl91c2VfbGlzdCk7CisJCWdvdG8gY2hlY2tfbGlzdDsKKwl9CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gVFJVRTsKK2Vycl9vdXQ6CisJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIGxvZyBjbGllbnQgYXJyYXkgaXMgY29ycnVwdC4iKTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogbnRmc19jaGVja19hbmRfbG9hZF9yZXN0YXJ0X3BhZ2UgLSBjaGVjayB0aGUgcmVzdGFydCBwYWdlIGZvciBjb25zaXN0ZW5jeQorICogQHZpOgkJJExvZ0ZpbGUgaW5vZGUgdG8gd2hpY2ggdGhlIHJlc3RhcnQgcGFnZSBiZWxvbmdzCisgKiBAcnA6CQlyZXN0YXJ0IHBhZ2UgdG8gY2hlY2sKKyAqIEBwb3M6CXBvc2l0aW9uIGluIEB2aSBhdCB3aGljaCB0aGUgcmVzdGFydCBwYWdlIHJlc2lkZXMKKyAqIEB3cnA6CWNvcHkgb2YgdGhlIG11bHRpIHNlY3RvciB0cmFuc2ZlciBkZXByb3RlY3RlZCByZXN0YXJ0IHBhZ2UKKyAqCisgKiBDaGVjayB0aGUgcmVzdGFydCBwYWdlIEBycCBmb3IgY29uc2lzdGVuY3kgYW5kIHJldHVybiBUUlVFIGlmIGl0IGlzCisgKiBjb25zaXN0ZW50IGFuZCBGQUxTRSBvdGhlcndpc2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBvbmx5IG5lZWRzIE5URlNfQkxPQ0tfU0laRSBieXRlcyBpbiBAcnAsIGkuZS4gaXQgZG9lcyBub3QKKyAqIHJlcXVpcmUgdGhlIGZ1bGwgcmVzdGFydCBwYWdlLgorICoKKyAqIElmIEB3cnAgaXMgbm90IE5VTEwsIG9uIHN1Y2Nlc3MsICpAd3JwIHdpbGwgcG9pbnQgdG8gYSBidWZmZXIgY29udGFpbmluZyBhCisgKiBjb3B5IG9mIHRoZSBjb21wbGV0ZSBtdWx0aSBzZWN0b3IgdHJhbnNmZXIgZGVwcm90ZWN0ZWQgcGFnZS4gIE9uIGZhaWx1cmUsCisgKiAqQHdycCBpcyB1bmRlZmluZWQuCisgKi8KK3N0YXRpYyBCT09MIG50ZnNfY2hlY2tfYW5kX2xvYWRfcmVzdGFydF9wYWdlKHN0cnVjdCBpbm9kZSAqdmksCisJCVJFU1RBUlRfUEFHRV9IRUFERVIgKnJwLCBzNjQgcG9zLCBSRVNUQVJUX1BBR0VfSEVBREVSICoqd3JwKQoreworCVJFU1RBUlRfQVJFQSAqcmE7CisJUkVTVEFSVF9QQUdFX0hFQURFUiAqdHJwOworCWludCBzaXplOworCUJPT0wgcmV0OworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJLyogQ2hlY2sgdGhlIHJlc3RhcnQgcGFnZSBoZWFkZXIgZm9yIGNvbnNpc3RlbmN5LiAqLworCWlmICghbnRmc19jaGVja19yZXN0YXJ0X3BhZ2VfaGVhZGVyKHZpLCBycCwgcG9zKSkgeworCQkvKiBFcnJvciBvdXRwdXQgYWxyZWFkeSBkb25lIGluc2lkZSB0aGUgZnVuY3Rpb24uICovCisJCXJldHVybiBGQUxTRTsKKwl9CisJLyogQ2hlY2sgdGhlIHJlc3RhcnQgYXJlYSBmb3IgY29uc2lzdGVuY3kuICovCisJaWYgKCFudGZzX2NoZWNrX3Jlc3RhcnRfYXJlYSh2aSwgcnApKSB7CisJCS8qIEVycm9yIG91dHB1dCBhbHJlYWR5IGRvbmUgaW5zaWRlIHRoZSBmdW5jdGlvbi4gKi8KKwkJcmV0dXJuIEZBTFNFOworCX0KKwlyYSA9IChSRVNUQVJUX0FSRUEqKSgodTgqKXJwICsgbGUxNl90b19jcHUocnAtPnJlc3RhcnRfYXJlYV9vZmZzZXQpKTsKKwkvKgorCSAqIEFsbG9jYXRlIGEgYnVmZmVyIHRvIHN0b3JlIHRoZSB3aG9sZSByZXN0YXJ0IHBhZ2Ugc28gd2UgY2FuIG11bHRpCisJICogc2VjdG9yIHRyYW5zZmVyIGRlcHJvdGVjdCBpdC4KKwkgKi8KKwl0cnAgPSBudGZzX21hbGxvY19ub2ZzKGxlMzJfdG9fY3B1KHJwLT5zeXN0ZW1fcGFnZV9zaXplKSk7CisJaWYgKCF0cnApIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yICRMb2dGaWxlICIKKwkJCQkicmVzdGFydCBwYWdlIGJ1ZmZlci4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKgorCSAqIFJlYWQgdGhlIHdob2xlIG9mIHRoZSByZXN0YXJ0IHBhZ2UgaW50byB0aGUgYnVmZmVyLiAgSWYgaXQgZml0cworCSAqIGNvbXBsZXRlbHkgaW5zaWRlIEBycCwganVzdCBjb3B5IGl0IGZyb20gdGhlcmUuICBPdGhlcndpc2UgbWFwIGFsbAorCSAqIHRoZSByZXF1aXJlZCBwYWdlcyBhbmQgY29weSB0aGUgZGF0YSBmcm9tIHRoZW0uCisJICovCisJc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRSAtIChwb3MgJiB+UEFHRV9DQUNIRV9NQVNLKTsKKwlpZiAoc2l6ZSA+PSBsZTMyX3RvX2NwdShycC0+c3lzdGVtX3BhZ2Vfc2l6ZSkpIHsKKwkJbWVtY3B5KHRycCwgcnAsIGxlMzJfdG9fY3B1KHJwLT5zeXN0ZW1fcGFnZV9zaXplKSk7CisJfSBlbHNlIHsKKwkJcGdvZmZfdCBpZHg7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCQlpbnQgaGF2ZV9yZWFkLCB0b19yZWFkOworCisJCS8qIEZpcnN0IGNvcHkgd2hhdCB3ZSBhbHJlYWR5IGhhdmUgaW4gQHJwLiAqLworCQltZW1jcHkodHJwLCBycCwgc2l6ZSk7CisJCS8qIENvcHkgdGhlIHJlbWFpbmluZyBkYXRhIG9uZSBwYWdlIGF0IGEgdGltZS4gKi8KKwkJaGF2ZV9yZWFkID0gc2l6ZTsKKwkJdG9fcmVhZCA9IGxlMzJfdG9fY3B1KHJwLT5zeXN0ZW1fcGFnZV9zaXplKSAtIHNpemU7CisJCWlkeCA9IChwb3MgKyBzaXplKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQlCVUdfT04oKHBvcyArIHNpemUpICYgflBBR0VfQ0FDSEVfTUFTSyk7CisJCWRvIHsKKwkJCXBhZ2UgPSBudGZzX21hcF9wYWdlKHZpLT5pX21hcHBpbmcsIGlkeCk7CisJCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkVycm9yIG1hcHBpbmcgJExvZ0ZpbGUgIgorCQkJCQkJInBhZ2UgKGluZGV4ICVsdSkuIiwgaWR4KTsKKwkJCQlnb3RvIGVycl9vdXQ7CisJCQl9CisJCQlzaXplID0gbWluX3QoaW50LCB0b19yZWFkLCBQQUdFX0NBQ0hFX1NJWkUpOworCQkJbWVtY3B5KCh1OCopdHJwICsgaGF2ZV9yZWFkLCBwYWdlX2FkZHJlc3MocGFnZSksIHNpemUpOworCQkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQkJaGF2ZV9yZWFkICs9IHNpemU7CisJCQl0b19yZWFkIC09IHNpemU7CisJCQlpZHgrKzsKKwkJfSB3aGlsZSAodG9fcmVhZCA+IDApOworCX0KKwkvKiBQZXJmb3JtIHRoZSBtdWx0aSBzZWN0b3IgdHJhbnNmZXIgZGVwcm90ZWN0aW9uIG9uIHRoZSBidWZmZXIuICovCisJaWYgKHBvc3RfcmVhZF9tc3RfZml4dXAoKE5URlNfUkVDT1JEKil0cnAsCisJCQlsZTMyX3RvX2NwdShycC0+c3lzdGVtX3BhZ2Vfc2l6ZSkpKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJNdWx0aSBzZWN0b3IgdHJhbnNmZXIgZXJyb3IgZGV0ZWN0ZWQgaW4gIgorCQkJCSIkTG9nRmlsZSByZXN0YXJ0IHBhZ2UuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogQ2hlY2sgdGhlIGxvZyBjbGllbnQgcmVjb3JkcyBmb3IgY29uc2lzdGVuY3kuICovCisJcmV0ID0gbnRmc19jaGVja19sb2dfY2xpZW50X2FycmF5KHZpLCB0cnApOworCWlmIChyZXQgJiYgd3JwKQorCQkqd3JwID0gdHJwOworCWVsc2UKKwkJbnRmc19mcmVlKHRycCk7CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gcmV0OworZXJyX291dDoKKwludGZzX2ZyZWUodHJwKTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogbnRmc19ja2Vja19sb2dmaWxlIC0gY2hlY2sgaW4gdGhlIGpvdXJuYWwgaWYgdGhlIHZvbHVtZSBpcyBjb25zaXN0ZW50CisgKiBAbG9nX3ZpOglzdHJ1Y3QgaW5vZGUgb2YgbG9hZGVkIGpvdXJuYWwgJExvZ0ZpbGUgdG8gY2hlY2sKKyAqCisgKiBDaGVjayB0aGUgJExvZ0ZpbGUgam91cm5hbCBmb3IgY29uc2lzdGVuY3kgYW5kIHJldHVybiBUUlVFIGlmIGl0IGlzCisgKiBjb25zaXN0ZW50IGFuZCBGQUxTRSBpZiBub3QuCisgKgorICogQXQgcHJlc2VudCB3ZSBvbmx5IGNoZWNrIHRoZSB0d28gcmVzdGFydCBwYWdlcyBhbmQgaWdub3JlIHRoZSBsb2cgcmVjb3JkCisgKiBwYWdlcy4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIE1zdFByb3RlY3RlZCBmbGFnIGlzIG5vdCBzZXQgb24gdGhlICRMb2dGaWxlIGlub2RlIGFuZCBoZW5jZQorICogd2hlbiByZWFkaW5nIHBhZ2VzIHRoZXkgYXJlIG5vdCBkZXByb3RlY3RlZC4gIFRoaXMgaXMgYmVjYXVzZSB3ZSBkbyBub3Qga25vdworICogaWYgdGhlICRMb2dGaWxlIHdhcyBjcmVhdGVkIG9uIGEgc3lzdGVtIHdpdGggYSBkaWZmZXJlbnQgcGFnZSBzaXplIHRvIG91cnMKKyAqIHlldCBhbmQgbXN0IGRlcHJvdGVjdGlvbiB3b3VsZCBmYWlsIGlmIG91ciBwYWdlIHNpemUgaXMgc21hbGxlci4KKyAqLworQk9PTCBudGZzX2NoZWNrX2xvZ2ZpbGUoc3RydWN0IGlub2RlICpsb2dfdmkpCit7CisJczY0IHNpemUsIHBvcywgcnN0cjFfcG9zLCByc3RyMl9wb3M7CisJbnRmc192b2x1bWUgKnZvbCA9IE5URlNfU0IobG9nX3ZpLT5pX3NiKTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGxvZ192aS0+aV9tYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwl1OCAqa2FkZHIgPSBOVUxMOworCVJFU1RBUlRfUEFHRV9IRUFERVIgKnJzdHIxX3BoID0gTlVMTDsKKwlSRVNUQVJUX1BBR0VfSEVBREVSICpyc3RyMl9waCA9IE5VTEw7CisJaW50IGxvZ19wYWdlX3NpemUsIGxvZ19wYWdlX21hc2ssIG9mczsKKwlCT09MIGxvZ2ZpbGVfaXNfZW1wdHkgPSBUUlVFOworCUJPT0wgcnN0cjFfZm91bmQgPSBGQUxTRTsKKwlCT09MIHJzdHIyX2ZvdW5kID0gRkFMU0U7CisJdTggbG9nX3BhZ2VfYml0czsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCS8qIEFuIGVtcHR5ICRMb2dGaWxlIG11c3QgaGF2ZSBiZWVuIGNsZWFuIGJlZm9yZSBpdCBnb3QgZW1wdGllZC4gKi8KKwlpZiAoTlZvbExvZ0ZpbGVFbXB0eSh2b2wpKQorCQlnb3RvIGlzX2VtcHR5OworCXNpemUgPSBsb2dfdmktPmlfc2l6ZTsKKwkvKiBNYWtlIHN1cmUgdGhlIGZpbGUgZG9lc24ndCBleGNlZWQgdGhlIG1heGltdW0gYWxsb3dlZCBzaXplLiAqLworCWlmIChzaXplID4gTWF4TG9nRmlsZVNpemUpCisJCXNpemUgPSBNYXhMb2dGaWxlU2l6ZTsKKwkvKgorCSAqIFRydW5jYXRlIHNpemUgdG8gYSBtdWx0aXBsZSBvZiB0aGUgcGFnZSBjYWNoZSBzaXplIG9yIHRoZSBkZWZhdWx0CisJICogbG9nIHBhZ2Ugc2l6ZSBpZiB0aGUgcGFnZSBjYWNoZSBzaXplIGlzIGJldHdlZW4gdGhlIGRlZmF1bHQgbG9nIHBhZ2UKKwkgKiBsb2cgcGFnZSBzaXplIGlmIHRoZSBwYWdlIGNhY2hlIHNpemUgaXMgYmV0d2VlbiB0aGUgZGVmYXVsdCBsb2cgcGFnZQorCSAqIHNpemUgYW5kIHR3aWNlIHRoYXQuCisJICovCisJaWYgKFBBR0VfQ0FDSEVfU0laRSA+PSBEZWZhdWx0TG9nUGFnZVNpemUgJiYgUEFHRV9DQUNIRV9TSVpFIDw9CisJCQlEZWZhdWx0TG9nUGFnZVNpemUgKiAyKQorCQlsb2dfcGFnZV9zaXplID0gRGVmYXVsdExvZ1BhZ2VTaXplOworCWVsc2UKKwkJbG9nX3BhZ2Vfc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwlsb2dfcGFnZV9tYXNrID0gbG9nX3BhZ2Vfc2l6ZSAtIDE7CisJLyoKKwkgKiBVc2UgZ2VuZXJpY19mZnMoKSBpbnN0ZWFkIG9mIGZmcygpIHRvIGVuYWJsZSB0aGUgY29tcGlsZXIgdG8KKwkgKiBvcHRpbWl6ZSBsb2dfcGFnZV9zaXplIGFuZCBsb2dfcGFnZV9iaXRzIGludG8gY29uc3RhbnRzLgorCSAqLworCWxvZ19wYWdlX2JpdHMgPSBnZW5lcmljX2Zmcyhsb2dfcGFnZV9zaXplKSAtIDE7CisJc2l6ZSAmPSB+KGxvZ19wYWdlX3NpemUgLSAxKTsKKwkvKgorCSAqIEVuc3VyZSB0aGUgbG9nIGZpbGUgaXMgYmlnIGVub3VnaCB0byBzdG9yZSBhdCBsZWFzdCB0aGUgdHdvIHJlc3RhcnQKKwkgKiBwYWdlcyBhbmQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGxvZyByZWNvcmQgcGFnZXMuCisJICovCisJaWYgKHNpemUgPCBsb2dfcGFnZV9zaXplICogMiB8fCAoc2l6ZSAtIGxvZ19wYWdlX3NpemUgKiAyKSA+PgorCQkJbG9nX3BhZ2VfYml0cyA8IE1pbkxvZ1JlY29yZFBhZ2VzKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIiRMb2dGaWxlIGlzIHRvbyBzbWFsbC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKgorCSAqIFJlYWQgdGhyb3VnaCB0aGUgZmlsZSBsb29raW5nIGZvciBhIHJlc3RhcnQgcGFnZS4gIFNpbmNlIHRoZSByZXN0YXJ0CisJICogcGFnZSBoZWFkZXIgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHBhZ2Ugd2Ugb25seSBuZWVkIHRvIHNlYXJjaCBhdAorCSAqIHdoYXQgY291bGQgYmUgdGhlIGJlZ2lubmluZyBvZiBhIHBhZ2UgKGZvciBlYWNoIHBhZ2Ugc2l6ZSkgcmF0aGVyCisJICogdGhhbiBzY2FubmluZyB0aGUgd2hvbGUgZmlsZSBieXRlIGJ5IGJ5dGUuICBJZiBhbGwgcG90ZW50aWFsIHBsYWNlcworCSAqIGNvbnRhaW4gZW1wdHkgYW5kIHVuaW5pdGlhbHplZCByZWNvcmRzLCB0aGUgbG9nIGZpbGUgY2FuIGJlIGFzc3VtZWQKKwkgKiB0byBiZSBlbXB0eS4KKwkgKi8KKwlmb3IgKHBvcyA9IDA7IHBvcyA8IHNpemU7IHBvcyA8PD0gMSkgeworCQlwZ29mZl90IGlkeCA9IHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQlpZiAoIXBhZ2UgfHwgcGFnZS0+aW5kZXggIT0gaWR4KSB7CisJCQlpZiAocGFnZSkKKwkJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCQlwYWdlID0gbnRmc19tYXBfcGFnZShtYXBwaW5nLCBpZHgpOworCQkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkVycm9yIG1hcHBpbmcgJExvZ0ZpbGUgIgorCQkJCQkJInBhZ2UgKGluZGV4ICVsdSkuIiwgaWR4KTsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCX0KKwkJa2FkZHIgPSAodTgqKXBhZ2VfYWRkcmVzcyhwYWdlKSArIChwb3MgJiB+UEFHRV9DQUNIRV9NQVNLKTsKKwkJLyoKKwkJICogQSBub24tZW1wdHkgYmxvY2sgbWVhbnMgdGhlIGxvZ2ZpbGUgaXMgbm90IGVtcHR5IHdoaWxlIGFuCisJCSAqIGVtcHR5IGJsb2NrIGFmdGVyIGEgbm9uLWVtcHR5IGJsb2NrIGhhcyBiZWVuIGVuY291bnRlcmVkCisJCSAqIG1lYW5zIHdlIGFyZSBkb25lLgorCQkgKi8KKwkJaWYgKCFudGZzX2lzX2VtcHR5X3JlY29yZHAoKGxlMzIqKWthZGRyKSkKKwkJCWxvZ2ZpbGVfaXNfZW1wdHkgPSBGQUxTRTsKKwkJZWxzZSBpZiAoIWxvZ2ZpbGVfaXNfZW1wdHkpCisJCQlicmVhazsKKwkJLyoKKwkJICogQSBsb2cgcmVjb3JkIHBhZ2UgbWVhbnMgdGhlcmUgY2Fubm90IGJlIGEgcmVzdGFydCBwYWdlIGFmdGVyCisJCSAqIHRoaXMgc28gbm8gbmVlZCB0byBjb250aW51ZSBzZWFyY2hpbmcuCisJCSAqLworCQlpZiAobnRmc19pc19yY3JkX3JlY29yZHAoKGxlMzIqKWthZGRyKSkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBBIG1vZGlmaWVkIGJ5IGNoa2RzayByZXN0YXJ0IHBhZ2UgbWVhbnMgd2UgY2Fubm90IGhhbmRsZQorCQkgKiB0aGlzIGxvZyBmaWxlLgorCQkgKi8KKwkJaWYgKG50ZnNfaXNfY2hrZF9yZWNvcmRwKChsZTMyKilrYWRkcikpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIiRMb2dGaWxlIGhhcyBiZWVuIG1vZGlmaWVkIGJ5ICIKKwkJCQkJImNoa2Rzay4gIE1vdW50IHRoaXMgdm9sdW1lIGluICIKKwkJCQkJIldpbmRvd3MuIik7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJLyogSWYgbm90IGEgcmVzdGFydCBwYWdlLCBjb250aW51ZS4gKi8KKwkJaWYgKCFudGZzX2lzX3JzdHJfcmVjb3JkcCgobGUzMiopa2FkZHIpKSB7CisJCQkvKiBTa2lwIHRvIHRoZSBtaW5pbXVtIHBhZ2Ugc2l6ZSBmb3IgdGhlIG5leHQgb25lLiAqLworCQkJaWYgKCFwb3MpCisJCQkJcG9zID0gTlRGU19CTE9DS19TSVpFID4+IDE7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBXZSBub3cga25vdyB3ZSBoYXZlIGEgcmVzdGFydCBwYWdlLiAqLworCQlpZiAoIXBvcykgeworCQkJcnN0cjFfZm91bmQgPSBUUlVFOworCQkJcnN0cjFfcG9zID0gcG9zOworCQl9IGVsc2UgeworCQkJaWYgKHJzdHIyX2ZvdW5kKSB7CisJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRm91bmQgbW9yZSB0aGFuIHR3byAiCisJCQkJCQkicmVzdGFydCBwYWdlcyBpbiAkTG9nRmlsZS4iKTsKKwkJCQlnb3RvIGVycl9vdXQ7CisJCQl9CisJCQlyc3RyMl9mb3VuZCA9IFRSVUU7CisJCQlyc3RyMl9wb3MgPSBwb3M7CisJCX0KKwkJLyoKKwkJICogQ2hlY2sgdGhlIHJlc3RhcnQgcGFnZSBmb3IgY29uc2lzdGVuY3kgYW5kIGdldCBhIGNvcHkgb2YgdGhlCisJCSAqIGNvbXBsZXRlIG11bHRpIHNlY3RvciB0cmFuc2ZlciBkZXByb3RlY3RlZCByZXN0YXJ0IHBhZ2UuCisJCSAqLworCQlpZiAoIW50ZnNfY2hlY2tfYW5kX2xvYWRfcmVzdGFydF9wYWdlKGxvZ192aSwKKwkJCQkoUkVTVEFSVF9QQUdFX0hFQURFUiopa2FkZHIsIHBvcywKKwkJCQkhcG9zID8gJnJzdHIxX3BoIDogJnJzdHIyX3BoKSkgeworCQkJLyogRXJyb3Igb3V0cHV0IGFscmVhZHkgZG9uZSBpbnNpZGUgdGhlIGZ1bmN0aW9uLiAqLworCQkJZ290byBlcnJfb3V0OworCQl9CisJCS8qCisJCSAqIFdlIGhhdmUgYSB2YWxpZCByZXN0YXJ0IHBhZ2UuICBUaGUgbmV4dCBvbmUgbXVzdCBiZSBhZnRlcgorCQkgKiBhIHdob2xlIHN5c3RlbSBwYWdlIHNpemUgYXMgc3BlY2lmaWVkIGJ5IHRoZSB2YWxpZCByZXN0YXJ0CisJCSAqIHBhZ2UuCisJCSAqLworCQlpZiAoIXBvcykKKwkJCXBvcyA9IGxlMzJfdG9fY3B1KHJzdHIxX3BoLT5zeXN0ZW1fcGFnZV9zaXplKSA+PiAxOworCX0KKwlpZiAocGFnZSkgeworCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCXBhZ2UgPSBOVUxMOworCX0KKwlpZiAobG9nZmlsZV9pc19lbXB0eSkgeworCQlOVm9sU2V0TG9nRmlsZUVtcHR5KHZvbCk7Citpc19lbXB0eToKKwkJbnRmc19kZWJ1ZygiRG9uZS4gICgkTG9nRmlsZSBpcyBlbXB0eS4pIik7CisJCXJldHVybiBUUlVFOworCX0KKwlpZiAoIXJzdHIxX2ZvdW5kIHx8ICFyc3RyMl9mb3VuZCkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJEaWQgbm90IGZpbmQgdHdvIHJlc3RhcnQgcGFnZXMgaW4gIgorCQkJCSIkTG9nRmlsZS4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKgorCSAqIFRoZSB0d28gcmVzdGFydCBhcmVhcyBtdXN0IGJlIGlkZW50aWNhbCBleGNlcHQgZm9yIHRoZSB1cGRhdGUKKwkgKiBzZXF1ZW5jZSBudW1iZXIuCisJICovCisJb2ZzID0gbGUxNl90b19jcHUocnN0cjFfcGgtPnVzYV9vZnMpOworCWlmIChtZW1jbXAocnN0cjFfcGgsIHJzdHIyX3BoLCBvZnMpIHx8IChvZnMgKz0gc2l6ZW9mKHUxNiksCisJCQltZW1jbXAoKHU4Kilyc3RyMV9waCArIG9mcywgKHU4Kilyc3RyMl9waCArIG9mcywKKwkJCWxlMzJfdG9fY3B1KHJzdHIxX3BoLT5zeXN0ZW1fcGFnZV9zaXplKSAtIG9mcykpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlRoZSB0d28gcmVzdGFydCBwYWdlcyBpbiAkTG9nRmlsZSBkbyBub3QgIgorCQkJCSJtYXRjaC4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwludGZzX2ZyZWUocnN0cjFfcGgpOworCW50ZnNfZnJlZShyc3RyMl9waCk7CisJLyogQWxsIGNvbnNpc3RlbmN5IGNoZWNrcyBwYXNzZWQuICovCisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gVFJVRTsKK2Vycl9vdXQ6CisJaWYgKHBhZ2UpCisJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwlpZiAocnN0cjFfcGgpCisJCW50ZnNfZnJlZShyc3RyMV9waCk7CisJaWYgKHJzdHIyX3BoKQorCQludGZzX2ZyZWUocnN0cjJfcGgpOworCXJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBudGZzX2lzX2xvZ2ZpbGVfY2xlYW4gLSBjaGVjayBpbiB0aGUgam91cm5hbCBpZiB0aGUgdm9sdW1lIGlzIGNsZWFuCisgKiBAbG9nX3ZpOglzdHJ1Y3QgaW5vZGUgb2YgbG9hZGVkIGpvdXJuYWwgJExvZ0ZpbGUgdG8gY2hlY2sKKyAqCisgKiBBbmFseXplIHRoZSAkTG9nRmlsZSBqb3VybmFsIGFuZCByZXR1cm4gVFJVRSBpZiBpdCBpbmRpY2F0ZXMgdGhlIHZvbHVtZSB3YXMKKyAqIHNodXRkb3duIGNsZWFubHkgYW5kIEZBTFNFIGlmIG5vdC4KKyAqCisgKiBBdCBwcmVzZW50IHdlIG9ubHkgbG9vayBhdCB0aGUgdHdvIHJlc3RhcnQgcGFnZXMgYW5kIGlnbm9yZSB0aGUgbG9nIHJlY29yZAorICogcGFnZXMuICBUaGlzIGlzIGEgbGl0dGxlIGJpdCBjcnVkZSBpbiB0aGF0IHRoZXJlIHdpbGwgYmUgYSB2ZXJ5IHNtYWxsIG51bWJlcgorICogb2YgY2FzZXMgd2hlcmUgd2UgdGhpbmsgdGhhdCBhIHZvbHVtZSBpcyBkaXJ0eSB3aGVuIGluIGZhY3QgaXQgaXMgY2xlYW4uCisgKiBUaGlzIHNob3VsZCBvbmx5IGFmZmVjdCB2b2x1bWVzIHRoYXQgaGF2ZSBub3QgYmVlbiBzaHV0ZG93biBjbGVhbmx5IGJ1dCBkaWQKKyAqIG5vdCBoYXZlIGFueSBwZW5kaW5nLCBub24tY2hlY2stcG9pbnRlZCBpL28sIGkuZS4gdGhleSB3ZXJlIGNvbXBsZXRlbHkgaWRsZQorICogYXQgbGVhc3QgZm9yIHRoZSBmaXZlIHNlY29uZHMgcHJlY2VlZGluZyB0aGUgdW5jbGVhbiBzaHV0ZG93bi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgJExvZ0ZpbGUgam91cm5hbCBoYXMgYWxyZWFkeSBiZWVuIGNvbnNpc3RlbmN5CisgKiBjaGVja2VkIGJ5IGEgY2FsbCB0byBudGZzX2NoZWNrX2xvZ2ZpbGUoKSBhbmQgaW4gcGFydGljdWxhciBpZiB0aGUgJExvZ0ZpbGUKKyAqIGlzIGVtcHR5IHRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgdGhhdCBOVm9sTG9nRmlsZUVtcHR5KCkgaXMgdHJ1ZSBvdGhlcndpc2UgYW4KKyAqIGVtcHR5IHZvbHVtZSB3aWxsIGJlIHJlcG9ydGVkIGFzIGRpcnR5LgorICovCitCT09MIG50ZnNfaXNfbG9nZmlsZV9jbGVhbihzdHJ1Y3QgaW5vZGUgKmxvZ192aSkKK3sKKwludGZzX3ZvbHVtZSAqdm9sID0gTlRGU19TQihsb2dfdmktPmlfc2IpOworCXN0cnVjdCBwYWdlICpwYWdlOworCVJFU1RBUlRfUEFHRV9IRUFERVIgKnJwOworCVJFU1RBUlRfQVJFQSAqcmE7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwkvKiBBbiBlbXB0eSAkTG9nRmlsZSBtdXN0IGhhdmUgYmVlbiBjbGVhbiBiZWZvcmUgaXQgZ290IGVtcHRpZWQuICovCisJaWYgKE5Wb2xMb2dGaWxlRW1wdHkodm9sKSkgeworCQludGZzX2RlYnVnKCJEb25lLiAgKCRMb2dGaWxlIGlzIGVtcHR5LikiKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCS8qCisJICogUmVhZCB0aGUgZmlyc3QgcmVzdGFydCBwYWdlLiAgSXQgd2lsbCBiZSBwb3NzaWJseSBpbmNvbXBsZXRlIGFuZAorCSAqIHdpbGwgbm90IGJlIG11bHRpIHNlY3RvciB0cmFuc2ZlciBkZXByb3RlY3RlZCBidXQgd2Ugb25seSBuZWVkIHRoZQorCSAqIGZpcnN0IE5URlNfQkxPQ0tfU0laRSBieXRlcyBzbyBpdCBkb2VzIG5vdCBtYXR0ZXIuCisJICovCisJcGFnZSA9IG50ZnNfbWFwX3BhZ2UobG9nX3ZpLT5pX21hcHBpbmcsIDApOworCWlmIChJU19FUlIocGFnZSkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRXJyb3IgbWFwcGluZyAkTG9nRmlsZSBwYWdlIChpbmRleCAwKS4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlycCA9IChSRVNUQVJUX1BBR0VfSEVBREVSKilwYWdlX2FkZHJlc3MocGFnZSk7CisJaWYgKCFudGZzX2lzX3JzdHJfcmVjb3JkKHJwLT5tYWdpYykpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiTm8gcmVzdGFydCBwYWdlIGZvdW5kIGF0IG9mZnNldCB6ZXJvIGluICIKKwkJCQkiJExvZ0ZpbGUuICBUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIHRoYXQgIgorCQkJCSJ0aGUgJExvZ0ZpbGUgc2hvdWxkIGhhdmUgYmVlbiBjb25zaXN0ZW5jeSAiCisJCQkJImNoZWNrZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlyYSA9IChSRVNUQVJUX0FSRUEqKSgodTgqKXJwICsgbGUxNl90b19jcHUocnAtPnJlc3RhcnRfYXJlYV9vZmZzZXQpKTsKKwkvKgorCSAqIElmIHRoZSAkTG9nRmlsZSBoYXMgYWN0aXZlIGNsaWVudHMsIGkuZS4gaXQgaXMgb3BlbiwgYW5kIHdlIGRvIG5vdAorCSAqIGhhdmUgdGhlIFJFU1RBUlRfVk9MVU1FX0lTX0NMRUFOIGJpdCBzZXQgaW4gdGhlIHJlc3RhcnQgYXJlYSBmbGFncywKKwkgKiB3ZSBhc3N1bWUgdGhlcmUgd2FzIGFuIHVuY2xlYW4gc2h1dGRvd24uCisJICovCisJaWYgKHJhLT5jbGllbnRfaW5fdXNlX2xpc3QgIT0gTE9HRklMRV9OT19DTElFTlQgJiYKKwkJCSEocmEtPmZsYWdzICYgUkVTVEFSVF9WT0xVTUVfSVNfQ0xFQU4pKSB7CisJCW50ZnNfZGVidWcoIkRvbmUuICAkTG9nRmlsZSBpbmRpY2F0ZXMgYSBkaXJ0eSBzaHV0ZG93bi4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJLyogJExvZ0ZpbGUgaW5kaWNhdGVzIGEgY2xlYW4gc2h1dGRvd24uICovCisJbnRmc19kZWJ1ZygiRG9uZS4gICRMb2dGaWxlIGluZGljYXRlcyBhIGNsZWFuIHNodXRkb3duLiIpOworCXJldHVybiBUUlVFOworZXJyX291dDoKKwludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIG50ZnNfZW1wdHlfbG9nZmlsZSAtIGVtcHR5IHRoZSBjb250ZW50cyBvZiB0aGUgJExvZ0ZpbGUgam91cm5hbAorICogQGxvZ192aToJc3RydWN0IGlub2RlIG9mIGxvYWRlZCBqb3VybmFsICRMb2dGaWxlIHRvIGVtcHR5CisgKgorICogRW1wdHkgdGhlIGNvbnRlbnRzIG9mIHRoZSAkTG9nRmlsZSBqb3VybmFsIEBsb2dfdmkgYW5kIHJldHVybiBUUlVFIG9uCisgKiBzdWNjZXNzIGFuZCBGQUxTRSBvbiBlcnJvci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgJExvZ0ZpbGUgam91cm5hbCBoYXMgYWxyZWFkeSBiZWVuIGNvbnNpc3RlbmN5CisgKiBjaGVja2VkIGJ5IGEgY2FsbCB0byBudGZzX2NoZWNrX2xvZ2ZpbGUoKSBhbmQgdGhhdCBudGZzX2lzX2xvZ2ZpbGVfY2xlYW4oKQorICogaGFzIGJlZW4gdXNlZCB0byBlbnN1cmUgdGhhdCB0aGUgJExvZ0ZpbGUgaXMgY2xlYW4uCisgKi8KK0JPT0wgbnRmc19lbXB0eV9sb2dmaWxlKHN0cnVjdCBpbm9kZSAqbG9nX3ZpKQoreworCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKGxvZ192aS0+aV9zYik7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlpZiAoIU5Wb2xMb2dGaWxlRW1wdHkodm9sKSkgeworCQlpbnQgZXJyOworCQkKKwkJZXJyID0gbnRmc19hdHRyX3NldChOVEZTX0kobG9nX3ZpKSwgMCwgbG9nX3ZpLT5pX3NpemUsIDB4ZmYpOworCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbGwgJExvZ0ZpbGUgd2l0aCAiCisJCQkJCSIweGZmIGJ5dGVzIChlcnJvciBjb2RlICVpKS4iLCBlcnIpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJCS8qIFNldCB0aGUgZmxhZyBzbyB3ZSBkbyBub3QgaGF2ZSB0byBkbyBpdCBhZ2FpbiBvbiByZW1vdW50LiAqLworCQlOVm9sU2V0TG9nRmlsZUVtcHR5KHZvbCk7CisJfQorCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2xvZ2ZpbGUuaCBiL2ZzL250ZnMvbG9nZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZTQzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2xvZ2ZpbGUuaApAQCAtMCwwICsxLDMwNyBAQAorLyoKKyAqIGxvZ2ZpbGUuaCAtIERlZmluZXMgZm9yIE5URlMga2VybmVsIGpvdXJuYWwgKCRMb2dGaWxlKSBoYW5kbGluZy4gIFBhcnQgb2YKKyAqCSAgICAgICB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfTE9HRklMRV9ICisjZGVmaW5lIF9MSU5VWF9OVEZTX0xPR0ZJTEVfSAorCisjaWZkZWYgTlRGU19SVworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiZW5kaWFuLmgiCisjaW5jbHVkZSAibGF5b3V0LmgiCisKKy8qCisgKiBKb3VybmFsICgkTG9nRmlsZSkgb3JnYW5pemF0aW9uOgorICoKKyAqIFR3byByZXN0YXJ0IGFyZWFzIHByZXNlbnQgaW4gdGhlIGZpcnN0IHR3byBwYWdlcyAocmVzdGFydCBwYWdlcywgb25lIHJlc3RhcnQKKyAqIGFyZWEgaW4gZWFjaCBwYWdlKS4gIFdoZW4gdGhlIHZvbHVtZSBpcyBkaXNtb3VudGVkIHRoZXkgc2hvdWxkIGJlIGlkZW50aWNhbCwKKyAqIGV4Y2VwdCBmb3IgdGhlIHVwZGF0ZSBzZXF1ZW5jZSBhcnJheSB3aGljaCB1c3VhbGx5IGhhcyBhIGRpZmZlcmVudCB1cGRhdGUKKyAqIHNlcXVlbmNlIG51bWJlci4KKyAqCisgKiBUaGVzZSBhcmUgZm9sbG93ZWQgYnkgbG9nIHJlY29yZHMgb3JnYW5pemVkIGluIHBhZ2VzIGhlYWRlZCBieSBhIGxvZyByZWNvcmQKKyAqIGhlYWRlciBnb2luZyB1cCB0byBsb2cgZmlsZSBzaXplLiAgTm90IGFsbCBwYWdlcyBjb250YWluIGxvZyByZWNvcmRzIHdoZW4gYQorICogdm9sdW1lIGlzIGZpcnN0IGZvcm1hdHRlZCwgYnV0IGFzIHRoZSB2b2x1bWUgYWdlcywgYWxsIHJlY29yZHMgd2lsbCBiZSB1c2VkLgorICogV2hlbiB0aGUgbG9nIGZpbGUgZmlsbHMgdXAsIHRoZSByZWNvcmRzIGF0IHRoZSBiZWdpbm5pbmcgYXJlIHB1cmdlZCAoYnkKKyAqIG1vZGlmeWluZyB0aGUgb2xkZXN0X2xzbiB0byBhIGhpZ2hlciB2YWx1ZSBwcmVzdW1hYmx5KSBhbmQgd3JpdGluZyBiZWdpbnMKKyAqIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuICBFZmZlY3RpdmVseSwgdGhlIGxvZyBmaWxlIGlzIHZpZXdlZCBhcyBhCisgKiBjaXJjdWxhciBlbnRpdHkuCisgKgorICogTk9URTogV2luZG93cyBOVCwgMjAwMCwgYW5kIFhQIGFsbCB1c2UgbG9nIGZpbGUgdmVyc2lvbiAxLjEgYnV0IHRoZXkgYWNjZXB0CisgKiB2ZXJzaW9ucyA8PSAxLngsIGluY2x1ZGluZyAwLi0xLiAgKFllcywgdGhhdCBpcyBhIG1pbnVzIG9uZSBpbiB0aGVyZSEpICBXZQorICogcHJvYmFibHkgb25seSB3YW50IHRvIHN1cHBvcnQgMS4xIGFzIHRoaXMgc2VlbXMgdG8gYmUgdGhlIGN1cnJlbnQgdmVyc2lvbgorICogYW5kIHdlIGRvbid0IGtub3cgaG93IHRoYXQgZGlmZmVycyBmcm9tIHRoZSBvbGRlciB2ZXJzaW9ucy4gIFRoZSBvbmx5CisgKiBleGNlcHRpb24gaXMgaWYgdGhlIGpvdXJuYWwgaXMgY2xlYW4gYXMgbWFya2VkIGJ5IHRoZSB0d28gcmVzdGFydCBwYWdlcworICogdGhlbiBpdCBkb2Vzbid0IG1hdHRlciB3aGV0aGVyIHdlIGFyZSBvbiBhbiBlYXJsaWVyIHZlcnNpb24uICBXZSBjYW4ganVzdAorICogcmVpbml0aWFsaXplIHRoZSBsb2dmaWxlIGFuZCBzdGFydCBhZ2FpbiB3aXRoIHZlcnNpb24gMS4xLgorICovCisKKy8qIFNvbWUgJExvZ0ZpbGUgcmVsYXRlZCBjb25zdGFudHMuICovCisjZGVmaW5lIE1heExvZ0ZpbGVTaXplCQkweDEwMDAwMDAwMFVMTAorI2RlZmluZSBEZWZhdWx0TG9nUGFnZVNpemUJNDA5NgorI2RlZmluZSBNaW5Mb2dSZWNvcmRQYWdlcwk0OAorCisvKgorICogTG9nIGZpbGUgcmVzdGFydCBwYWdlIGhlYWRlciAoYmVnaW5zIHRoZSByZXN0YXJ0IGFyZWEpLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisvKk9mcyovCisvKiAgMAlOVEZTX1JFQ09SRDsgLS0gVW5mb2xkZWQgaGVyZSBhcyBnY2MgZG9lc24ndCBsaWtlIHVubmFtZWQgc3RydWN0cy4gKi8KKy8qICAwKi8JTlRGU19SRUNPUkRfVFlQRSBtYWdpYzsJLyogVGhlIG1hZ2ljIGlzICJSU1RSIi4gKi8KKy8qICA0Ki8JbGUxNiB1c2Ffb2ZzOwkJLyogU2VlIE5URlNfUkVDT1JEIGRlZmluaXRpb24gaW4gbGF5b3V0LmguCisJCQkJICAgV2hlbiBjcmVhdGluZywgc2V0IHRoaXMgdG8gYmUgaW1tZWRpYXRlbHkKKwkJCQkgICBhZnRlciB0aGlzIGhlYWRlciBzdHJ1Y3R1cmUgKHdpdGhvdXQgYW55CisJCQkJICAgYWxpZ25tZW50KS4gKi8KKy8qICA2Ki8JbGUxNiB1c2FfY291bnQ7CQkvKiBTZWUgTlRGU19SRUNPUkQgZGVmaW5pdGlvbiBpbiBsYXlvdXQuaC4gKi8KKworLyogIDgqLwlsZUxTTiBjaGtkc2tfbHNuOwkvKiBUaGUgbGFzdCBsb2cgZmlsZSBzZXF1ZW5jZSBudW1iZXIgZm91bmQgYnkKKwkJCQkgICBjaGtkc2suICBPbmx5IHVzZWQgd2hlbiB0aGUgbWFnaWMgaXMgY2hhbmdlZAorCQkJCSAgIHRvICJDSEtEIi4gIE90aGVyd2lzZSB0aGlzIGlzIHplcm8uICovCisvKiAxNiovCWxlMzIgc3lzdGVtX3BhZ2Vfc2l6ZTsJLyogQnl0ZSBzaXplIG9mIHN5c3RlbSBwYWdlcyB3aGVuIHRoZSBsb2cgZmlsZQorCQkJCSAgIHdhcyBjcmVhdGVkLCBoYXMgdG8gYmUgPj0gNTEyIGFuZCBhIHBvd2VyIG9mCisJCQkJICAgMi4gIFVzZSB0aGlzIHRvIGNhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgc2l6ZQorCQkJCSAgIG9mIHRoZSB1c2EgKHVzYV9jb3VudCkgYW5kIGFkZCBpdCB0byB1c2Ffb2ZzLgorCQkJCSAgIFRoZW4gdmVyaWZ5IHRoYXQgdGhlIHJlc3VsdCBpcyBsZXNzIHRoYW4gdGhlCisJCQkJICAgdmFsdWUgb2YgdGhlIHJlc3RhcnRfYXJlYV9vZmZzZXQuICovCisvKiAyMCovCWxlMzIgbG9nX3BhZ2Vfc2l6ZTsJLyogQnl0ZSBzaXplIG9mIGxvZyBmaWxlIHBhZ2VzLCBoYXMgdG8gYmUgPj0KKwkJCQkgICA1MTIgYW5kIGEgcG93ZXIgb2YgMi4gIFRoZSBkZWZhdWx0IGlzIDQwOTYKKwkJCQkgICBhbmQgaXMgdXNlZCB3aGVuIHRoZSBzeXN0ZW0gcGFnZSBzaXplIGlzCisJCQkJICAgYmV0d2VlbiA0MDk2IGFuZCA4MTkyLiAgT3RoZXJ3aXNlIHRoaXMgaXMKKwkJCQkgICBzZXQgdG8gdGhlIHN5c3RlbSBwYWdlIHNpemUgaW5zdGVhZC4gKi8KKy8qIDI0Ki8JbGUxNiByZXN0YXJ0X2FyZWFfb2Zmc2V0Oy8qIEJ5dGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoaXMgaGVhZGVyIHRvCisJCQkJICAgdGhlIFJFU1RBUlRfQVJFQS4gIFZhbHVlIGhhcyB0byBiZSBhbGlnbmVkCisJCQkJICAgdG8gOC1ieXRlIGJvdW5kYXJ5LiAgV2hlbiBjcmVhdGluZywgc2V0IHRoaXMKKwkJCQkgICB0byBiZSBhZnRlciB0aGUgdXNhLiAqLworLyogMjYqLwlzbGUxNiBtaW5vcl92ZXI7CS8qIExvZyBmaWxlIG1pbm9yIHZlcnNpb24uICBPbmx5IGNoZWNrIGlmIG1ham9yCisJCQkJICAgdmVyc2lvbiBpcyAxLiAqLworLyogMjgqLwlzbGUxNiBtYWpvcl92ZXI7CS8qIExvZyBmaWxlIG1ham9yIHZlcnNpb24uICBXZSBvbmx5IHN1cHBvcnQKKwkJCQkgICB2ZXJzaW9uIDEuMS4gKi8KKy8qIHNpemVvZigpID0gMzAgKDB4MWUpIGJ5dGVzICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgUkVTVEFSVF9QQUdFX0hFQURFUjsKKworLyoKKyAqIENvbnN0YW50IGZvciB0aGUgbG9nIGNsaWVudCBpbmRpY2VzIG1lYW5pbmcgdGhhdCB0aGVyZSBhcmUgbm8gY2xpZW50IHJlY29yZHMKKyAqIGluIHRoaXMgcGFydGljdWxhciBjbGllbnQgYXJyYXkuICBBbHNvIGluc2lkZSB0aGUgY2xpZW50IHJlY29yZHMgdGhlbXNlbHZlcywKKyAqIHRoaXMgbWVhbnMgdGhhdCB0aGVyZSBhcmUgbm8gY2xpZW50IHJlY29yZHMgcHJlY2VkaW5nIG9yIGZvbGxvd2luZyB0aGlzIG9uZS4KKyAqLworI2RlZmluZSBMT0dGSUxFX05PX0NMSUVOVAljb25zdF9jcHVfdG9fbGUxNigweGZmZmYpCisjZGVmaW5lIExPR0ZJTEVfTk9fQ0xJRU5UX0NQVQkweGZmZmYKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgc28gZmFyIGtub3duIFJFU1RBUlRfQVJFQV8qIGZsYWdzICgxNi1iaXQpIHdoaWNoIGNvbnRhaW4KKyAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2cgZmlsZSBpbiB3aGljaCB0aGV5IGFyZSBwcmVzZW50LgorICovCitlbnVtIHsKKwlSRVNUQVJUX1ZPTFVNRV9JU19DTEVBTgk9IGNvbnN0X2NwdV90b19sZTE2KDB4MDAwMiksCisJUkVTVEFSVF9TUEFDRV9GSUxMRVIJPSAweGZmZmYsIC8qIGdjYzogRm9yY2UgZW51bSBiaXQgd2lkdGggdG8gMTYuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3R5cGVkZWYgbGUxNiBSRVNUQVJUX0FSRUFfRkxBR1M7CisKKy8qCisgKiBMb2cgZmlsZSByZXN0YXJ0IGFyZWEgcmVjb3JkLiAgVGhlIG9mZnNldCBvZiB0aGlzIHJlY29yZCBpcyBmb3VuZCBieSBhZGRpbmcKKyAqIHRoZSBvZmZzZXQgb2YgdGhlIFJFU1RBUlRfUEFHRV9IRUFERVIgdG8gdGhlIHJlc3RhcnRfYXJlYV9vZmZzZXQgdmFsdWUgZm91bmQKKyAqIGluIGl0LiAgU2VlIG5vdGVzIGF0IHJlc3RhcnRfYXJlYV9vZmZzZXQgYWJvdmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKy8qT2ZzKi8KKy8qICAwKi8JbGVMU04gY3VycmVudF9sc247CS8qIFRoZSBjdXJyZW50LCBpLmUuIGxhc3QgTFNOIGluc2lkZSB0aGUgbG9nCisJCQkJICAgd2hlbiB0aGUgcmVzdGFydCBhcmVhIHdhcyBsYXN0IHdyaXR0ZW4uCisJCQkJICAgVGhpcyBoYXBwZW5zIG9mdGVuIGJ1dCB3aGF0IGlzIHRoZSBpbnRlcnZhbD8KKwkJCQkgICBJcyBpdCBqdXN0IGZpeGVkIHRpbWUgb3IgaXMgaXQgZXZlcnkgdGltZSBhCisJCQkJICAgY2hlY2sgcG9pbnQgaXMgd3JpdHRlbiBvciBzb21ldGhpbmUgZWxzZT8KKwkJCQkgICBPbiBjcmVhdGUgc2V0IHRvIDAuICovCisvKiAgOCovCWxlMTYgbG9nX2NsaWVudHM7CS8qIE51bWJlciBvZiBsb2cgY2xpZW50IHJlY29yZHMgaW4gdGhlIGFycmF5IG9mCisJCQkJICAgbG9nIGNsaWVudCByZWNvcmRzIHdoaWNoIGZvbGxvd3MgdGhpcworCQkJCSAgIHJlc3RhcnQgYXJlYS4gIE11c3QgYmUgMS4gICovCisvKiAxMCovCWxlMTYgY2xpZW50X2ZyZWVfbGlzdDsJLyogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBmcmVlIGxvZyBjbGllbnQgcmVjb3JkCisJCQkJICAgaW4gdGhlIGFycmF5IG9mIGxvZyBjbGllbnQgcmVjb3Jkcy4KKwkJCQkgICBMT0dGSUxFX05PX0NMSUVOVCBtZWFucyB0aGF0IHRoZXJlIGFyZSBubworCQkJCSAgIGZyZWUgbG9nIGNsaWVudCByZWNvcmRzIGluIHRoZSBhcnJheS4KKwkJCQkgICBJZiAhPSBMT0dGSUxFX05PX0NMSUVOVCwgY2hlY2sgdGhhdAorCQkJCSAgIGxvZ19jbGllbnRzID4gY2xpZW50X2ZyZWVfbGlzdC4gIE9uIFdpbjJrCisJCQkJICAgYW5kIHByZXN1bWFibHkgZWFybGllciwgb24gYSBjbGVhbiB2b2x1bWUKKwkJCQkgICB0aGlzIGlzICE9IExPR0ZJTEVfTk9fQ0xJRU5ULCBhbmQgaXQgc2hvdWxkCisJCQkJICAgYmUgMCwgaS5lLiB0aGUgZmlyc3QgKGFuZCBvbmx5KSBjbGllbnQKKwkJCQkgICByZWNvcmQgaXMgZnJlZSBhbmQgdGh1cyB0aGUgbG9nZmlsZSBpcworCQkJCSAgIGNsb3NlZCBhbmQgaGVuY2UgY2xlYW4uICBBIGRpcnR5IHZvbHVtZQorCQkJCSAgIHdvdWxkIGhhdmUgbGVmdCB0aGUgbG9nZmlsZSBvcGVuIGFuZCBoZW5jZQorCQkJCSAgIHRoaXMgd291bGQgYmUgTE9HRklMRV9OT19DTElFTlQuICBPbiBXaW5YUAorCQkJCSAgIGFuZCBwcmVzdW1hYmx5IGxhdGVyLCB0aGUgbG9nZmlsZSBpcyBhbHdheXMKKwkJCQkgICBvcGVuLCBldmVuIG9uIGNsZWFuIHNodXRkb3duIHNvIHRoaXMgc2hvdWxkCisJCQkJICAgYWx3YXlzIGJlIExPR0ZJTEVfTk9fQ0xJRU5ULiAqLworLyogMTIqLwlsZTE2IGNsaWVudF9pbl91c2VfbGlzdDsvKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGluLXVzZSBsb2cgY2xpZW50CisJCQkJICAgcmVjb3JkIGluIHRoZSBhcnJheSBvZiBsb2cgY2xpZW50IHJlY29yZHMuCisJCQkJICAgTE9HRklMRV9OT19DTElFTlQgbWVhbnMgdGhhdCB0aGVyZSBhcmUgbm8KKwkJCQkgICBpbi11c2UgbG9nIGNsaWVudCByZWNvcmRzIGluIHRoZSBhcnJheS4gIElmCisJCQkJICAgIT0gTE9HRklMRV9OT19DTElFTlQgY2hlY2sgdGhhdCBsb2dfY2xpZW50cworCQkJCSAgID4gY2xpZW50X2luX3VzZV9saXN0LiAgT24gV2luMmsgYW5kCisJCQkJICAgcHJlc3VtYWJseSBlYXJsaWVyLCBvbiBhIGNsZWFuIHZvbHVtZSB0aGlzCisJCQkJICAgaXMgTE9HRklMRV9OT19DTElFTlQsIGkuZS4gdGhlcmUgYXJlIG5vCisJCQkJICAgY2xpZW50IHJlY29yZHMgaW4gdXNlIGFuZCB0aHVzIHRoZSBsb2dmaWxlCisJCQkJICAgaXMgY2xvc2VkIGFuZCBoZW5jZSBjbGVhbi4gIEEgZGlydHkgdm9sdW1lCisJCQkJICAgd291bGQgaGF2ZSBsZWZ0IHRoZSBsb2dmaWxlIG9wZW4gYW5kIGhlbmNlCisJCQkJICAgdGhpcyB3b3VsZCBiZSAhPSBMT0dGSUxFX05PX0NMSUVOVCwgYW5kIGl0CisJCQkJICAgc2hvdWxkIGJlIDAsIGkuZS4gdGhlIGZpcnN0IChhbmQgb25seSkKKwkJCQkgICBjbGllbnQgcmVjb3JkIGlzIGluIHVzZS4gIE9uIFdpblhQIGFuZAorCQkJCSAgIHByZXN1bWFibHkgbGF0ZXIsIHRoZSBsb2dmaWxlIGlzIGFsd2F5cworCQkJCSAgIG9wZW4sIGV2ZW4gb24gY2xlYW4gc2h1dGRvd24gc28gdGhpcyBzaG91bGQKKwkJCQkgICBhbHdheXMgYmUgMC4gKi8KKy8qIDE0Ki8JUkVTVEFSVF9BUkVBX0ZMQUdTIGZsYWdzOy8qIEZsYWdzIG1vZGlmeWluZyBMRlMgYmVoYXZpb3VyLiAgT24gV2luMmsKKwkJCQkgICBhbmQgcHJlc3VtYWJseSBlYXJsaWVyIHRoaXMgaXMgYWx3YXlzIDAuICBPbgorCQkJCSAgIFdpblhQIGFuZCBwcmVzdW1hYmx5IGxhdGVyLCBpZiB0aGUgbG9nZmlsZQorCQkJCSAgIHdhcyBzaHV0ZG93biBjbGVhbmx5LCB0aGUgc2Vjb25kIGJpdCwKKwkJCQkgICBSRVNUQVJUX1ZPTFVNRV9JU19DTEVBTiwgaXMgc2V0LiAgVGhpcyBiaXQKKwkJCQkgICBpcyBjbGVhcmVkIHdoZW4gdGhlIHZvbHVtZSBpcyBtb3VudGVkIGJ5CisJCQkJICAgV2luWFAgYW5kIHNldCB3aGVuIHRoZSB2b2x1bWUgaXMgZGlzbW91bnRlZCwKKwkJCQkgICB0aHVzIGlmIHRoZSBsb2dmaWxlIGlzIGRpcnR5LCB0aGlzIGJpdCBpcworCQkJCSAgIGNsZWFyLiAgVGh1cyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZQorCQkJCSAgIFdpbmRvd3MgdmVyc2lvbiB0byBkZXRlcm1pbmUgaWYgdGhlIGxvZ2ZpbGUKKwkJCQkgICBpcyBjbGVhbi4gIEluc3RlYWQgaWYgdGhlIGxvZ2ZpbGUgaXMgY2xvc2VkLAorCQkJCSAgIHdlIGtub3cgaXQgbXVzdCBiZSBjbGVhbi4gIElmIGl0IGlzIG9wZW4gYW5kCisJCQkJICAgdGhpcyBiaXQgaXMgc2V0LCB3ZSBhbHNvIGtub3cgaXQgbXVzdCBiZQorCQkJCSAgIGNsZWFuLiAgSWYgb24gdGhlIG90aGVyIGhhbmQgdGhlIGxvZ2ZpbGUgaXMKKwkJCQkgICBvcGVuIGFuZCB0aGlzIGJpdCBpcyBjbGVhciwgd2UgY2FuIGJlIGFsbW9zdAorCQkJCSAgIGNlcnRhaW4gdGhhdCB0aGUgbG9nZmlsZSBpcyBkaXJ0eS4gKi8KKy8qIDE2Ki8JbGUzMiBzZXFfbnVtYmVyX2JpdHM7CS8qIEhvdyBtYW55IGJpdHMgdG8gdXNlIGZvciB0aGUgc2VxdWVuY2UKKwkJCQkgICBudW1iZXIuICBUaGlzIGlzIGNhbGN1bGF0ZWQgYXMgNjcgLSB0aGUKKwkJCQkgICBudW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byBzdG9yZSB0aGUgbG9nZmlsZQorCQkJCSAgIHNpemUgaW4gYnl0ZXMgYW5kIHRoaXMgY2FuIGJlIHVzZWQgaW4gd2l0aAorCQkJCSAgIHRoZSBzcGVjaWZpZWQgZmlsZV9zaXplIGFzIGEgY29uc2lzdGVuY3kKKwkJCQkgICBjaGVjay4gKi8KKy8qIDIwKi8JbGUxNiByZXN0YXJ0X2FyZWFfbGVuZ3RoOy8qIExlbmd0aCBvZiB0aGUgcmVzdGFydCBhcmVhIGluY2x1ZGluZyB0aGUKKwkJCQkgICBjbGllbnQgYXJyYXkuICBGb2xsb3dpbmcgY2hlY2tzIHJlcXVpcmVkIGlmCisJCQkJICAgdmVyc2lvbiBtYXRjaGVzLiAgT3RoZXJ3aXNlLCBza2lwIHRoZW0uCisJCQkJICAgcmVzdGFydF9hcmVhX29mZnNldCArIHJlc3RhcnRfYXJlYV9sZW5ndGgKKwkJCQkgICBoYXMgdG8gYmUgPD0gc3lzdGVtX3BhZ2Vfc2l6ZS4gIEFsc28sCisJCQkJICAgcmVzdGFydF9hcmVhX2xlbmd0aCBoYXMgdG8gYmUgPj0KKwkJCQkgICBjbGllbnRfYXJyYXlfb2Zmc2V0ICsgKGxvZ19jbGllbnRzICoKKwkJCQkgICBzaXplb2YobG9nIGNsaWVudCByZWNvcmQpKS4gKi8KKy8qIDIyKi8JbGUxNiBjbGllbnRfYXJyYXlfb2Zmc2V0Oy8qIE9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGlzIHJlY29yZCB0bworCQkJCSAgIHRoZSBmaXJzdCBsb2cgY2xpZW50IHJlY29yZCBpZiB2ZXJzaW9ucyBhcmUKKwkJCQkgICBtYXRjaGVkLiAgV2hlbiBjcmVhdGluZywgc2V0IHRoaXMgdG8gYmUKKwkJCQkgICBhZnRlciB0aGlzIHJlc3RhcnQgYXJlYSBzdHJ1Y3R1cmUsIGFsaWduZWQKKwkJCQkgICB0byA4LWJ5dGVzIGJvdW5kYXJ5LiAgSWYgdGhlIHZlcnNpb25zIGRvIG5vdAorCQkJCSAgIG1hdGNoLCB0aGlzIGlzIGlnbm9yZWQgYW5kIHRoZSBvZmZzZXQgaXMKKwkJCQkgICBhc3N1bWVkIHRvIGJlIChzaXplb2YoUkVTVEFSVF9BUkVBKSArIDcpICYKKwkJCQkgICB+NywgaS5lLiByb3VuZGVkIHVwIHRvIGZpcnN0IDgtYnl0ZQorCQkJCSAgIGJvdW5kYXJ5LiAgRWl0aGVyIHdheSwgY2xpZW50X2FycmF5X29mZnNldAorCQkJCSAgIGhhcyB0byBiZSBhbGlnbmVkIHRvIGFuIDgtYnl0ZSBib3VuZGFyeS4KKwkJCQkgICBBbHNvLCByZXN0YXJ0X2FyZWFfb2Zmc2V0ICsKKwkJCQkgICBjbGllbnRfYXJyYXlfb2Zmc2V0IGhhcyB0byBiZSA8PSA1MTAuCisJCQkJICAgRmluYWxseSwgY2xpZW50X2FycmF5X29mZnNldCArIChsb2dfY2xpZW50cworCQkJCSAgICogc2l6ZW9mKGxvZyBjbGllbnQgcmVjb3JkKSkgaGFzIHRvIGJlIDw9CisJCQkJICAgc3lzdGVtX3BhZ2Vfc2l6ZS4gIE9uIFdpbjJrIGFuZCBwcmVzdW1hYmx5CisJCQkJICAgZWFybGllciwgdGhpcyBpcyAweDMwLCBpLmUuIGltbWVkaWF0ZWx5CisJCQkJICAgZm9sbG93aW5nIHRoaXMgcmVjb3JkLiAgT24gV2luWFAgYW5kCisJCQkJICAgcHJlc3VtYWJseSBsYXRlciwgdGhpcyBpcyAweDQwLCBpLmUuIHRoZXJlCisJCQkJICAgYXJlIDE2IGV4dHJhIGJ5dGVzIGJldHdlZW4gdGhpcyByZWNvcmQgYW5kCisJCQkJICAgdGhlIGNsaWVudCBhcnJheS4gIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdAorCQkJCSAgIHRoZSBSRVNUQVJUX0FSRUEgcmVjb3JkIGlzIGFjdHVhbGx5IGJpZ2dlcgorCQkJCSAgIGluIFdpblhQIGFuZCBsYXRlci4gKi8KKy8qIDI0Ki8Jc2xlNjQgZmlsZV9zaXplOwkvKiBVc2FibGUgYnl0ZSBzaXplIG9mIHRoZSBsb2cgZmlsZS4gIElmIHRoZQorCQkJCSAgIHJlc3RhcnRfYXJlYV9vZmZzZXQgKyB0aGUgb2Zmc2V0IG9mIHRoZQorCQkJCSAgIGZpbGVfc2l6ZSBhcmUgPiA1MTAgdGhlbiBjb3JydXB0aW9uIGhhcworCQkJCSAgIG9jY3VyZWQuICBUaGlzIGlzIHRoZSB2ZXJ5IGZpcnN0IGNoZWNrIHdoZW4KKwkJCQkgICBzdGFydGluZyB3aXRoIHRoZSByZXN0YXJ0X2FyZWEgYXMgaWYgaXQKKwkJCQkgICBmYWlscyBpdCBtZWFucyB0aGF0IHNvbWUgb2YgdGhlIGFib3ZlIHZhbHVlcworCQkJCSAgIHdpbGwgYmUgY29ycnVwdGVkIGJ5IHRoZSBtdWx0aSBzZWN0b3IKKwkJCQkgICB0cmFuc2ZlciBwcm90ZWN0aW9uLiAgVGhlIGZpbGVfc2l6ZSBoYXMgdG8KKwkJCQkgICBiZSByb3VuZGVkIGRvd24gdG8gYmUgYSBtdWx0aXBsZSBvZiB0aGUKKwkJCQkgICBsb2dfcGFnZV9zaXplIGluIHRoZSBSRVNUQVJUX1BBR0VfSEVBREVSIGFuZAorCQkJCSAgIHRoZW4gaXQgaGFzIHRvIGJlIGF0IGxlYXN0IGJpZyBlbm91Z2ggdG8KKwkJCQkgICBzdG9yZSB0aGUgdHdvIHJlc3RhcnQgcGFnZXMgYW5kIDQ4ICgweDMwKQorCQkJCSAgIGxvZyByZWNvcmQgcGFnZXMuICovCisvKiAzMiovCWxlMzIgbGFzdF9sc25fZGF0YV9sZW5ndGg7LyogTGVuZ3RoIG9mIGRhdGEgb2YgbGFzdCBMU04sIG5vdCBpbmNsdWRpbmcKKwkJCQkgICB0aGUgbG9nIHJlY29yZCBoZWFkZXIuICBPbiBjcmVhdGUgc2V0IHRvCisJCQkJICAgMC4gKi8KKy8qIDM2Ki8JbGUxNiBsb2dfcmVjb3JkX2hlYWRlcl9sZW5ndGg7LyogQnl0ZSBzaXplIG9mIHRoZSBsb2cgcmVjb3JkIGhlYWRlci4KKwkJCQkgICBJZiB0aGUgdmVyc2lvbiBtYXRjaGVzIHRoZW4gY2hlY2sgdGhhdCB0aGUKKwkJCQkgICB2YWx1ZSBvZiBsb2dfcmVjb3JkX2hlYWRlcl9sZW5ndGggaXMgYQorCQkJCSAgIG11bHRpcGxlIG9mIDgsIGkuZS4KKwkJCQkgICAobG9nX3JlY29yZF9oZWFkZXJfbGVuZ3RoICsgNykgJiB+NyA9PQorCQkJCSAgIGxvZ19yZWNvcmRfaGVhZGVyX2xlbmd0aC4gIFdoZW4gY3JlYXRpbmcgc2V0CisJCQkJICAgaXQgdG8gc2l6ZW9mKExPR19SRUNPUkRfSEVBREVSKSwgYWxpZ25lZCB0bworCQkJCSAgIDggYnl0ZXMuICovCisvKiAzOCovCWxlMTYgbG9nX3BhZ2VfZGF0YV9vZmZzZXQ7LyogT2Zmc2V0IHRvIHRoZSBzdGFydCBvZiBkYXRhIGluIGEgbG9nIHJlY29yZAorCQkJCSAgIHBhZ2UuICBNdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gIE9uIGNyZWF0ZQorCQkJCSAgIHNldCBpdCB0byBpbW1lZGlhdGVseSBhZnRlciB0aGUgdXBkYXRlCisJCQkJICAgc2VxdWVuY2UgYXJyYXkgb2YgdGhlIGxvZyByZWNvcmQgcGFnZS4gKi8KKy8qIDQwKi8JbGUzMiByZXN0YXJ0X2xvZ19vcGVuX2NvdW50Oy8qIEEgY291bnRlciB0aGF0IGdldHMgaW5jcmVtZW50ZWQgZXZlcnkKKwkJCQkgICB0aW1lIHRoZSBsb2dmaWxlIGlzIHJlc3RhcnRlZCB3aGljaCBoYXBwZW5zCisJCQkJICAgYXQgbW91bnQgdGltZSB3aGVuIHRoZSBsb2dmaWxlIGlzIG9wZW5lZC4KKwkJCQkgICBXaGVuIGNyZWF0aW5nIHNldCB0byBhIHJhbmRvbSB2YWx1ZS4gIFdpbjJrCisJCQkJICAgc2V0cyBpdCB0byB0aGUgbG93IDMyIGJpdHMgb2YgdGhlIGN1cnJlbnQKKwkJCQkgICBzeXN0ZW0gdGltZSBpbiBOVEZTIGZvcm1hdCAoc2VlIHRpbWUuaCkuICovCisvKiA0NCovCWxlMzIgcmVzZXJ2ZWQ7CQkvKiBSZXNlcnZlZC9hbGlnbm1lbnQgdG8gOC1ieXRlIGJvdW5kYXJ5LiAqLworLyogc2l6ZW9mKCkgPSA0OCAoMHgzMCkgYnl0ZXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBSRVNUQVJUX0FSRUE7CisKKy8qCisgKiBMb2cgY2xpZW50IHJlY29yZC4gIFRoZSBvZmZzZXQgb2YgdGhpcyByZWNvcmQgaXMgZm91bmQgYnkgYWRkaW5nIHRoZSBvZmZzZXQKKyAqIG9mIHRoZSBSRVNUQVJUX0FSRUEgdG8gdGhlIGNsaWVudF9hcnJheV9vZmZzZXQgdmFsdWUgZm91bmQgaW4gaXQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKy8qT2ZzKi8KKy8qICAwKi8JbGVMU04gb2xkZXN0X2xzbjsJLyogT2xkZXN0IExTTiBuZWVkZWQgYnkgdGhpcyBjbGllbnQuICBPbiBjcmVhdGUKKwkJCQkgICBzZXQgdG8gMC4gKi8KKy8qICA4Ki8JbGVMU04gY2xpZW50X3Jlc3RhcnRfbHNuOy8qIExTTiBhdCB3aGljaCB0aGlzIGNsaWVudCBuZWVkcyB0byByZXN0YXJ0CisJCQkJICAgdGhlIHZvbHVtZSwgaS5lLiB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4KKwkJCQkgICB0aGUgbG9nIGZpbGUuICBBdCBwcmVzZW50LCBpZiBjbGVhbiB0aGlzCisJCQkJICAgc2hvdWxkID0gY3VycmVudF9sc24gaW4gcmVzdGFydCBhcmVhIGJ1dCBpdAorCQkJCSAgIHByb2JhYmx5IGFsc28gPSBjdXJyZW50X2xzbiB3aGVuIGRpcnR5IG1vc3QKKwkJCQkgICBvZiB0aGUgdGltZS4gIEF0IGNyZWF0ZSBzZXQgdG8gMC4gKi8KKy8qIDE2Ki8JbGUxNiBwcmV2X2NsaWVudDsJLyogVGhlIG9mZnNldCB0byB0aGUgcHJldmlvdXMgbG9nIGNsaWVudCByZWNvcmQKKwkJCQkgICBpbiB0aGUgYXJyYXkgb2YgbG9nIGNsaWVudCByZWNvcmRzLgorCQkJCSAgIExPR0ZJTEVfTk9fQ0xJRU5UIG1lYW5zIHRoZXJlIGlzIG5vIHByZXZpb3VzCisJCQkJICAgY2xpZW50IHJlY29yZCwgaS5lLiB0aGlzIGlzIHRoZSBmaXJzdCBvbmUuCisJCQkJICAgVGhpcyBpcyBhbHdheXMgTE9HRklMRV9OT19DTElFTlQuICovCisvKiAxOCovCWxlMTYgbmV4dF9jbGllbnQ7CS8qIFRoZSBvZmZzZXQgdG8gdGhlIG5leHQgbG9nIGNsaWVudCByZWNvcmQgaW4KKwkJCQkgICB0aGUgYXJyYXkgb2YgbG9nIGNsaWVudCByZWNvcmRzLgorCQkJCSAgIExPR0ZJTEVfTk9fQ0xJRU5UIG1lYW5zIHRoZXJlIGFyZSBubyBuZXh0CisJCQkJICAgY2xpZW50IHJlY29yZHMsIGkuZS4gdGhpcyBpcyB0aGUgbGFzdCBvbmUuCisJCQkJICAgVGhpcyBpcyBhbHdheXMgTE9HRklMRV9OT19DTElFTlQuICovCisvKiAyMCovCWxlMTYgc2VxX251bWJlcjsJLyogT24gV2luMmsgYW5kIHByZXN1bWFibHkgZWFybGllciwgdGhpcyBpcyBzZXQKKwkJCQkgICB0byB6ZXJvIGV2ZXJ5IHRpbWUgdGhlIGxvZ2ZpbGUgaXMgcmVzdGFydGVkCisJCQkJICAgYW5kIGl0IGlzIGluY3JlbWVudGVkIHdoZW4gdGhlIGxvZ2ZpbGUgaXMKKwkJCQkgICBjbG9zZWQgYXQgZGlzbW91bnQgdGltZS4gIFRodXMgaXQgaXMgMCB3aGVuCisJCQkJICAgZGlydHkgYW5kIDEgd2hlbiBjbGVhbi4gIE9uIFdpblhQIGFuZAorCQkJCSAgIHByZXN1bWFibHkgbGF0ZXIsIHRoaXMgaXMgYWx3YXlzIDAuICovCisvKiAyMiovCXU4IHJlc2VydmVkWzZdOwkJLyogUmVzZXJ2ZWQvYWxpZ25tZW50LiAqLworLyogMjgqLwlsZTMyIGNsaWVudF9uYW1lX2xlbmd0aDsvKiBMZW5ndGggb2YgY2xpZW50IG5hbWUgaW4gYnl0ZXMuICBTaG91bGQKKwkJCQkgICBhbHdheXMgYmUgOC4gKi8KKy8qIDMyKi8JbnRmc2NoYXIgY2xpZW50X25hbWVbNjRdOy8qIE5hbWUgb2YgdGhlIGNsaWVudCBpbiBVbmljb2RlLiAgU2hvdWxkCisJCQkJICAgYWx3YXlzIGJlICJOVEZTIiB3aXRoIHRoZSByZW1haW5pbmcgYnl0ZXMKKwkJCQkgICBzZXQgdG8gMC4gKi8KKy8qIHNpemVvZigpID0gMTYwICgweGEwKSBieXRlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIExPR19DTElFTlRfUkVDT1JEOworCitleHRlcm4gQk9PTCBudGZzX2NoZWNrX2xvZ2ZpbGUoc3RydWN0IGlub2RlICpsb2dfdmkpOworCitleHRlcm4gQk9PTCBudGZzX2lzX2xvZ2ZpbGVfY2xlYW4oc3RydWN0IGlub2RlICpsb2dfdmkpOworCitleHRlcm4gQk9PTCBudGZzX2VtcHR5X2xvZ2ZpbGUoc3RydWN0IGlub2RlICpsb2dfdmkpOworCisjZW5kaWYgLyogTlRGU19SVyAqLworCisjZW5kaWYgLyogX0xJTlVYX05URlNfTE9HRklMRV9IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL21hbGxvYy5oIGIvZnMvbnRmcy9tYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWM1OTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9tYWxsb2MuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogbWFsbG9jLmggLSBOVEZTIGtlcm5lbCBtZW1vcnkgaGFuZGxpbmcuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9MSU5VWF9OVEZTX01BTExPQ19ICisjZGVmaW5lIF9MSU5VWF9OVEZTX01BTExPQ19ICisKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKworLyoqCisgKiBudGZzX21hbGxvY19ub2ZzIC0gYWxsb2NhdGUgbWVtb3J5IGluIG11bHRpcGxlcyBvZiBwYWdlcworICogQHNpemUJbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCisgKgorICogQWxsb2NhdGVzIEBzaXplIGJ5dGVzIG9mIG1lbW9yeSwgcm91bmRlZCB1cCB0byBtdWx0aXBsZXMgb2YgUEFHRV9TSVpFIGFuZAorICogcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBtZW1vcnkuCisgKgorICogSWYgdGhlcmUgd2FzIGluc3VmZmljaWVudCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIHJlcXVlc3QsIHJldHVybiBOVUxMLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKm50ZnNfbWFsbG9jX25vZnModW5zaWduZWQgbG9uZyBzaXplKQoreworCWlmIChsaWtlbHkoc2l6ZSA8PSBQQUdFX1NJWkUpKSB7CisJCUJVR19PTighc2l6ZSk7CisJCS8qIGttYWxsb2MoKSBoYXMgcGVyLUNQVSBjYWNoZXMgc28gaXMgZmFzdGVyIGZvciBub3cuICovCisJCXJldHVybiBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX05PRlMpOworCQkvKiByZXR1cm4gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX05PRlMgfCBfX0dGUF9ISUdITUVNKTsgKi8KKwl9CisJaWYgKGxpa2VseShzaXplID4+IFBBR0VfU0hJRlQgPCBudW1fcGh5c3BhZ2VzKSkKKwkJcmV0dXJuIF9fdm1hbGxvYyhzaXplLCBHRlBfTk9GUyB8IF9fR0ZQX0hJR0hNRU0sIFBBR0VfS0VSTkVMKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG50ZnNfZnJlZSh2b2lkICphZGRyKQoreworCWlmIChsaWtlbHkoKCh1bnNpZ25lZCBsb25nKWFkZHIgPCBWTUFMTE9DX1NUQVJUKSB8fAorCQkJKCh1bnNpZ25lZCBsb25nKWFkZHIgPj0gVk1BTExPQ19FTkQgKSkpIHsKKwkJa2ZyZWUoYWRkcik7CisJCS8qIGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhZGRyKTsgKi8KKwkJcmV0dXJuOworCX0KKwl2ZnJlZShhZGRyKTsKK30KKworI2VuZGlmIC8qIF9MSU5VWF9OVEZTX01BTExPQ19IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL21mdC5jIGIvZnMvbnRmcy9tZnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmE4NWFjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9tZnQuYwpAQCAtMCwwICsxLDI4MjkgQEAKKy8qKgorICogbWZ0LmMgLSBOVEZTIGtlcm5lbCBtZnQgcmVjb3JkIG9wZXJhdGlvbnMuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMiBSaWNoYXJkIFJ1c3NvbgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKworI2luY2x1ZGUgImF0dHJpYi5oIgorI2luY2x1ZGUgImFvcHMuaCIKKyNpbmNsdWRlICJiaXRtYXAuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImRpci5oIgorI2luY2x1ZGUgImxjbmFsbG9jLmgiCisjaW5jbHVkZSAibWFsbG9jLmgiCisjaW5jbHVkZSAibWZ0LmgiCisjaW5jbHVkZSAibnRmcy5oIgorCisvKioKKyAqIG1hcF9tZnRfcmVjb3JkX3BhZ2UgLSBtYXAgdGhlIHBhZ2UgaW4gd2hpY2ggYSBzcGVjaWZpYyBtZnQgcmVjb3JkIHJlc2lkZXMKKyAqIEBuaToJCW50ZnMgaW5vZGUgd2hvc2UgbWZ0IHJlY29yZCBwYWdlIHRvIG1hcAorICoKKyAqIFRoaXMgbWFwcyB0aGUgcGFnZSBpbiB3aGljaCB0aGUgbWZ0IHJlY29yZCBvZiB0aGUgbnRmcyBpbm9kZSBAbmkgaXMgc2l0dWF0ZWQKKyAqIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbWZ0IHJlY29yZCB3aXRoaW4gdGhlIG1hcHBlZCBwYWdlLgorICoKKyAqIFJldHVybiB2YWx1ZSBuZWVkcyB0byBiZSBjaGVja2VkIHdpdGggSVNfRVJSKCkgYW5kIGlmIHRoYXQgaXMgdHJ1ZSBQVFJfRVJSKCkKKyAqIGNvbnRhaW5zIHRoZSBuZWdhdGl2ZSBlcnJvciBjb2RlIHJldHVybmVkLgorICovCitzdGF0aWMgaW5saW5lIE1GVF9SRUNPUkQgKm1hcF9tZnRfcmVjb3JkX3BhZ2UobnRmc19pbm9kZSAqbmkpCit7CisJbnRmc192b2x1bWUgKnZvbCA9IG5pLT52b2w7CisJc3RydWN0IGlub2RlICptZnRfdmkgPSB2b2wtPm1mdF9pbm87CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyBpbmRleCwgb2ZzLCBlbmRfaW5kZXg7CisKKwlCVUdfT04obmktPnBhZ2UpOworCS8qCisJICogVGhlIGluZGV4IGludG8gdGhlIHBhZ2UgY2FjaGUgYW5kIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBwYWdlIGNhY2hlCisJICogcGFnZSBvZiB0aGUgd2FudGVkIG1mdCByZWNvcmQuIEZJWE1FOiBXZSBuZWVkIHRvIGNoZWNrIGZvcgorCSAqIG92ZXJmbG93aW5nIHRoZSB1bnNpZ25lZCBsb25nLCBidXQgSSBkb24ndCB0aGluayB3ZSB3b3VsZCBldmVyIGdldAorCSAqIGhlcmUgaWYgdGhlIHZvbHVtZSB3YXMgdGhhdCBiaWcuLi4KKwkgKi8KKwlpbmRleCA9IG5pLT5tZnRfbm8gPDwgdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cyA+PiBQQUdFX0NBQ0hFX1NISUZUOworCW9mcyA9IChuaS0+bWZ0X25vIDw8IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMpICYgflBBR0VfQ0FDSEVfTUFTSzsKKworCS8qIFRoZSBtYXhpbXVtIHZhbGlkIGluZGV4IGludG8gdGhlIHBhZ2UgY2FjaGUgZm9yICRNRlQncyBkYXRhLiAqLworCWVuZF9pbmRleCA9IG1mdF92aS0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisKKwkvKiBJZiB0aGUgd2FudGVkIGluZGV4IGlzIG91dCBvZiBib3VuZHMgdGhlIG1mdCByZWNvcmQgZG9lc24ndCBleGlzdC4gKi8KKwlpZiAodW5saWtlbHkoaW5kZXggPj0gZW5kX2luZGV4KSkgeworCQlpZiAoaW5kZXggPiBlbmRfaW5kZXggfHwgKG1mdF92aS0+aV9zaXplICYgflBBR0VfQ0FDSEVfTUFTSykgPAorCQkJCW9mcyArIHZvbC0+bWZ0X3JlY29yZF9zaXplKSB7CisJCQlwYWdlID0gRVJSX1BUUigtRU5PRU5UKTsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkF0dGVtdCB0byByZWFkIG1mdCByZWNvcmQgMHglbHgsICIKKwkJCQkJIndoaWNoIGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBtZnQuICAiCisJCQkJCSJUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIHRoZSBudGZzICIKKwkJCQkJImRyaXZlci4iLCBuaS0+bWZ0X25vKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCX0KKwkvKiBSZWFkLCBtYXAsIGFuZCBwaW4gdGhlIHBhZ2UuICovCisJcGFnZSA9IG50ZnNfbWFwX3BhZ2UobWZ0X3ZpLT5pX21hcHBpbmcsIGluZGV4KTsKKwlpZiAobGlrZWx5KCFJU19FUlIocGFnZSkpKSB7CisJCS8qIENhdGNoIG11bHRpIHNlY3RvciB0cmFuc2ZlciBmaXh1cCBlcnJvcnMuICovCisJCWlmIChsaWtlbHkobnRmc19pc19tZnRfcmVjb3JkcCgobGUzMiopKHBhZ2VfYWRkcmVzcyhwYWdlKSArCisJCQkJb2ZzKSkpKSB7CisJCQluaS0+cGFnZSA9IHBhZ2U7CisJCQluaS0+cGFnZV9vZnMgPSBvZnM7CisJCQlyZXR1cm4gcGFnZV9hZGRyZXNzKHBhZ2UpICsgb2ZzOworCQl9CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIk1mdCByZWNvcmQgMHglbHggaXMgY29ycnVwdC4gICIKKwkJCQkiUnVuIGNoa2Rzay4iLCBuaS0+bWZ0X25vKTsKKwkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQlwYWdlID0gRVJSX1BUUigtRUlPKTsKKwl9CitlcnJfb3V0OgorCW5pLT5wYWdlID0gTlVMTDsKKwluaS0+cGFnZV9vZnMgPSAwOworCXJldHVybiAodm9pZCopcGFnZTsKK30KKworLyoqCisgKiBtYXBfbWZ0X3JlY29yZCAtIG1hcCwgcGluIGFuZCBsb2NrIGFuIG1mdCByZWNvcmQKKyAqIEBuaToJCW50ZnMgaW5vZGUgd2hvc2UgTUZUIHJlY29yZCB0byBtYXAKKyAqCisgKiBGaXJzdCwgdGFrZSB0aGUgbXJlY19sb2NrIHNlbWFwaG9yZS4gV2UgbWlnaHQgbm93IGJlIHNsZWVwaW5nLCB3aGlsZSB3YWl0aW5nCisgKiBmb3IgdGhlIHNlbWFwaG9yZSBpZiBpdCB3YXMgYWxyZWFkeSBsb2NrZWQgYnkgc29tZW9uZSBlbHNlLgorICoKKyAqIFRoZSBwYWdlIG9mIHRoZSByZWNvcmQgaXMgbWFwcGVkIHVzaW5nIG1hcF9tZnRfcmVjb3JkX3BhZ2UoKSBiZWZvcmUgYmVpbmcKKyAqIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogVGhpcyBpbiB0dXJuIHVzZXMgbnRmc19tYXBfcGFnZSgpIHRvIGdldCB0aGUgcGFnZSBjb250YWluaW5nIHRoZSB3YW50ZWQgbWZ0CisgKiByZWNvcmQgKGl0IGluIHR1cm4gY2FsbHMgcmVhZF9jYWNoZV9wYWdlKCkgd2hpY2ggcmVhZHMgaXQgaW4gZnJvbSBkaXNrIGlmCisgKiBuZWNlc3NhcnksIGluY3JlbWVudHMgdGhlIHVzZSBjb3VudCBvbiB0aGUgcGFnZSBzbyB0aGF0IGl0IGNhbm5vdCBkaXNhcHBlYXIKKyAqIHVuZGVyIHVzIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBwYWdlIGNhY2hlIHBhZ2UpLgorICoKKyAqIElmIHJlYWRfY2FjaGVfcGFnZSgpIGludm9rZXMgbnRmc19yZWFkcGFnZSgpIHRvIGxvYWQgdGhlIHBhZ2UgZnJvbSBkaXNrLCBpdAorICogc2V0cyBQR19sb2NrZWQgYW5kIGNsZWFycyBQR191cHRvZGF0ZSBvbiB0aGUgcGFnZS4gT25jZSBJL08gaGFzIGNvbXBsZXRlZAorICogYW5kIHRoZSBwb3N0LXJlYWQgbXN0IGZpeHVwcyBvbiBlYWNoIG1mdCByZWNvcmQgaW4gdGhlIHBhZ2UgaGF2ZSBiZWVuCisgKiBwZXJmb3JtZWQsIHRoZSBwYWdlIGdldHMgUEdfdXB0b2RhdGUgc2V0IGFuZCBQR19sb2NrZWQgY2xlYXJlZCAodGhpcyBpcyBkb25lCisgKiBpbiBvdXIgYXN5bmNocm9ub3VzIEkvTyBjb21wbGV0aW9uIGhhbmRsZXIgZW5kX2J1ZmZlcl9yZWFkX21mdF9hc3luYygpKS4KKyAqIG50ZnNfbWFwX3BhZ2UoKSB3YWl0cyBmb3IgUEdfbG9ja2VkIHRvIGJlY29tZSBjbGVhciBhbmQgY2hlY2tzIGlmCisgKiBQR191cHRvZGF0ZSBpcyBzZXQgYW5kIHJldHVybnMgYW4gZXJyb3IgY29kZSBpZiBub3QuIFRoaXMgcHJvdmlkZXMKKyAqIHN1ZmZpY2llbnQgcHJvdGVjdGlvbiBhZ2FpbnN0IHJhY2VzIHdoZW4gcmVhZGluZy91c2luZyB0aGUgcGFnZS4KKyAqCisgKiBIb3dldmVyIHRoZXJlIGlzIHRoZSB3cml0ZSBtYXBwaW5nIHRvIHRoaW5rIGFib3V0LiBEb2luZyB0aGUgYWJvdmUgZGVzY3JpYmVkCisgKiBjaGVja2luZyBoZXJlIHdpbGwgYmUgZmluZSwgYmVjYXVzZSB3aGVuIGluaXRpYXRpbmcgdGhlIHdyaXRlIHdlIHdpbGwgc2V0CisgKiBQR19sb2NrZWQgYW5kIGNsZWFyIFBHX3VwdG9kYXRlIG1ha2luZyBzdXJlIG5vYm9keSBpcyB0b3VjaGluZyB0aGUgcGFnZQorICogY29udGVudHMuIERvaW5nIHRoZSBsb2NraW5nIHRoaXMgd2F5IG1lYW5zIHRoYXQgdGhlIGNvbW1pdCB0byBkaXNrIGNvZGUgaW4KKyAqIHRoZSBwYWdlIGNhY2hlIGNvZGUgcGF0aHMgaXMgYXV0b21hdGljYWxseSBzdWZmaWNpZW50bHkgbG9ja2VkIHdpdGggdXMgYXMKKyAqIHdlIHdpbGwgbm90IHRvdWNoIGEgcGFnZSB0aGF0IGhhcyBiZWVuIGxvY2tlZCBvciBpcyBub3QgdXB0b2RhdGUuIFRoZSBvbmx5CisgKiBsb2NraW5nIHByb2JsZW0gdGhlbiBpcyB0aGVtIGxvY2tpbmcgdGhlIHBhZ2Ugd2hpbGUgd2UgYXJlIGFjY2Vzc2luZyBpdC4KKyAqCisgKiBTbyB0aGF0IGNvZGUgd2lsbCBlbmQgdXAgaGF2aW5nIHRvIG93biB0aGUgbXJlY19sb2NrIG9mIGFsbCBtZnQKKyAqIHJlY29yZHMvaW5vZGVzIHByZXNlbnQgaW4gdGhlIHBhZ2UgYmVmb3JlIEkvTyBjYW4gcHJvY2VlZC4gSW4gdGhhdCBjYXNlIHdlCisgKiB3b3VsZG4ndCBuZWVkIHRvIGJvdGhlciB3aXRoIFBHX2xvY2tlZCBhbmQgUEdfdXB0b2RhdGUgYXMgbm9ib2R5IHdpbGwgYmUKKyAqIGFjY2Vzc2luZyBhbnl0aGluZyB3aXRob3V0IG93bmluZyB0aGUgbXJlY19sb2NrIHNlbWFwaG9yZS4gQnV0IHdlIGRvIG5lZWQKKyAqIHRvIHVzZSB0aGVtIGJlY2F1c2Ugb2YgdGhlIHJlYWRfY2FjaGVfcGFnZSgpIGludm9jYXRpb24gYW5kIHRoZSBjb2RlIGJlY29tZXMKKyAqIHNvIG11Y2ggc2ltcGxlciB0aGlzIHdheSB0aGF0IGl0IGlzIHdlbGwgd29ydGggaXQuCisgKgorICogVGhlIG1mdCByZWNvcmQgaXMgbm93IG91cnMgYW5kIHdlIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuIFlvdSBuZWVkIHRvIGNoZWNrCisgKiB0aGUgcmV0dXJuZWQgcG9pbnRlciB3aXRoIElTX0VSUigpIGFuZCBpZiB0aGF0IGlzIHRydWUsIFBUUl9FUlIoKSB3aWxsIHJldHVybgorICogdGhlIGVycm9yIGNvZGUuCisgKgorICogTk9URTogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHRoZSBtZnQgcmVjb3JkIGRpcnR5IGJlZm9yZSBjYWxsaW5nCisgKiB1bm1hcF9tZnRfcmVjb3JkKCkuIFRoaXMgaXMgb2J2aW91c2x5IG9ubHkgbmVjZXNzYXJ5IGlmIHRoZSBjYWxsZXIgcmVhbGx5CisgKiBtb2RpZmllZCB0aGUgbWZ0IHJlY29yZC4uLgorICogUTogRG8gd2Ugd2FudCB0byByZWN5Y2xlIG9uZSBvZiB0aGUgVkZTIGlub2RlIHN0YXRlIGJpdHMgaW5zdGVhZD8KKyAqIEE6IE5vLCB0aGUgaW5vZGUgb25lcyBtZWFuIHdlIHdhbnQgdG8gY2hhbmdlIHRoZSBtZnQgcmVjb3JkLCBub3Qgd2Ugd2FudCB0bworICogd3JpdGUgaXQgb3V0LgorICovCitNRlRfUkVDT1JEICptYXBfbWZ0X3JlY29yZChudGZzX2lub2RlICpuaSkKK3sKKwlNRlRfUkVDT1JEICptOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIG1mdF9ubyAweCVseC4iLCBuaS0+bWZ0X25vKTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgbnRmcyBpbm9kZSBkb2Vzbid0IGdvIGF3YXkuICovCisJYXRvbWljX2luYygmbmktPmNvdW50KTsKKworCS8qIFNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhpcyBtZnQgcmVjb3JkLiAqLworCWRvd24oJm5pLT5tcmVjX2xvY2spOworCisJbSA9IG1hcF9tZnRfcmVjb3JkX3BhZ2UobmkpOworCWlmIChsaWtlbHkoIUlTX0VSUihtKSkpCisJCXJldHVybiBtOworCisJdXAoJm5pLT5tcmVjX2xvY2spOworCWF0b21pY19kZWMoJm5pLT5jb3VudCk7CisJbnRmc19lcnJvcihuaS0+dm9sLT5zYiwgIkZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWx1LiIsIC1QVFJfRVJSKG0pKTsKKwlyZXR1cm4gbTsKK30KKworLyoqCisgKiB1bm1hcF9tZnRfcmVjb3JkX3BhZ2UgLSB1bm1hcCB0aGUgcGFnZSBpbiB3aGljaCBhIHNwZWNpZmljIG1mdCByZWNvcmQgcmVzaWRlcworICogQG5pOgkJbnRmcyBpbm9kZSB3aG9zZSBtZnQgcmVjb3JkIHBhZ2UgdG8gdW5tYXAKKyAqCisgKiBUaGlzIHVubWFwcyB0aGUgcGFnZSBpbiB3aGljaCB0aGUgbWZ0IHJlY29yZCBvZiB0aGUgbnRmcyBpbm9kZSBAbmkgaXMKKyAqIHNpdHVhdGVkIGFuZCByZXR1cm5zLiBUaGlzIGlzIGEgTk9PUCBpZiBoaWdobWVtIGlzIG5vdCBjb25maWd1cmVkLgorICoKKyAqIFRoZSB1bm1hcCBoYXBwZW5zIHZpYSBudGZzX3VubWFwX3BhZ2UoKSB3aGljaCBpbiB0dXJuIGRlY3JlbWVudHMgdGhlIHVzZQorICogY291bnQgb24gdGhlIHBhZ2UgdGh1cyByZWxlYXNpbmcgaXQgZnJvbSB0aGUgcGlubmVkIHN0YXRlLgorICoKKyAqIFdlIGRvIG5vdCBhY3R1YWxseSB1bm1hcCB0aGUgcGFnZSBmcm9tIG1lbW9yeSBvZiBjb3Vyc2UsIGFzIHRoYXQgd2lsbCBiZQorICogZG9uZSBieSB0aGUgcGFnZSBjYWNoZSBjb2RlIGl0c2VsZiB3aGVuIG1lbW9yeSBwcmVzc3VyZSBpbmNyZWFzZXMgb3IKKyAqIHdoYXRldmVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdW5tYXBfbWZ0X3JlY29yZF9wYWdlKG50ZnNfaW5vZGUgKm5pKQoreworCUJVR19PTighbmktPnBhZ2UpOworCisJLy8gVE9ETzogSWYgZGlydHksIGJsYWguLi4KKwludGZzX3VubWFwX3BhZ2UobmktPnBhZ2UpOworCW5pLT5wYWdlID0gTlVMTDsKKwluaS0+cGFnZV9vZnMgPSAwOworCXJldHVybjsKK30KKworLyoqCisgKiB1bm1hcF9tZnRfcmVjb3JkIC0gcmVsZWFzZSBhIG1hcHBlZCBtZnQgcmVjb3JkCisgKiBAbmk6CQludGZzIGlub2RlIHdob3NlIE1GVCByZWNvcmQgdG8gdW5tYXAKKyAqCisgKiBXZSByZWxlYXNlIHRoZSBwYWdlIG1hcHBpbmcgYW5kIHRoZSBtcmVjX2xvY2sgbXV0ZXggd2hpY2ggdW5tYXBzIHRoZSBtZnQKKyAqIHJlY29yZCBhbmQgcmVsZWFzZXMgaXQgZm9yIG90aGVycyB0byBnZXQgaG9sZCBvZi4gV2UgYWxzbyByZWxlYXNlIHRoZSBudGZzCisgKiBpbm9kZSBieSBkZWNyZW1lbnRpbmcgdGhlIG50ZnMgaW5vZGUgcmVmZXJlbmNlIGNvdW50LgorICoKKyAqIE5PVEU6IElmIGNhbGxlciBoYXMgbW9kaWZpZWQgdGhlIG1mdCByZWNvcmQsIGl0IGlzIGltcGVyYXRpdmUgdG8gc2V0IHRoZSBtZnQKKyAqIHJlY29yZCBkaXJ0eSBCRUZPUkUgY2FsbGluZyB1bm1hcF9tZnRfcmVjb3JkKCkuCisgKi8KK3ZvaWQgdW5tYXBfbWZ0X3JlY29yZChudGZzX2lub2RlICpuaSkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IG5pLT5wYWdlOworCisJQlVHX09OKCFwYWdlKTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBtZnRfbm8gMHglbHguIiwgbmktPm1mdF9ubyk7CisKKwl1bm1hcF9tZnRfcmVjb3JkX3BhZ2UobmkpOworCXVwKCZuaS0+bXJlY19sb2NrKTsKKwlhdG9taWNfZGVjKCZuaS0+Y291bnQpOworCS8qCisJICogSWYgcHVyZSBudGZzX2lub2RlLCBpLmUuIG5vIHZmcyBpbm9kZSBhdHRhY2hlZCwgd2UgbGVhdmUgaXQgdG8KKwkgKiBudGZzX2NsZWFyX2V4dGVudF9pbm9kZSgpIGluIHRoZSBleHRlbnQgaW5vZGUgY2FzZSwgYW5kIHRvIHRoZQorCSAqIGNhbGxlciBpbiB0aGUgbm9uLWV4dGVudCwgeWV0IHB1cmUgbnRmcyBpbm9kZSBjYXNlLCB0byBkbyB0aGUgYWN0dWFsCisJICogdGVhciBkb3duIG9mIGFsbCBzdHJ1Y3R1cmVzIGFuZCBmcmVlaW5nIG9mIGFsbCBhbGxvY2F0ZWQgbWVtb3J5LgorCSAqLworCXJldHVybjsKK30KKworLyoqCisgKiBtYXBfZXh0ZW50X21mdF9yZWNvcmQgLSBsb2FkIGFuIGV4dGVudCBpbm9kZSBhbmQgYXR0YWNoIGl0IHRvIGl0cyBiYXNlCisgKiBAYmFzZV9uaToJYmFzZSBudGZzIGlub2RlCisgKiBAbXJlZjoJbWZ0IHJlZmVyZW5jZSBvZiB0aGUgZXh0ZW50IGlub2RlIHRvIGxvYWQKKyAqIEBudGZzX2lubzoJb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHBvaW50ZXIgdG8gdGhlIG50ZnNfaW5vZGUgc3RydWN0dXJlCisgKgorICogTG9hZCB0aGUgZXh0ZW50IG1mdCByZWNvcmQgQG1yZWYgYW5kIGF0dGFjaCBpdCB0byBpdHMgYmFzZSBpbm9kZSBAYmFzZV9uaS4KKyAqIFJldHVybiB0aGUgbWFwcGVkIGV4dGVudCBtZnQgcmVjb3JkIGlmIElTX0VSUihyZXN1bHQpIGlzIGZhbHNlLiAgT3RoZXJ3aXNlCisgKiBQVFJfRVJSKHJlc3VsdCkgZ2l2ZXMgdGhlIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKgorICogT24gc3VjY2Vzc2Z1bCByZXR1cm4sIEBudGZzX2lubyBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIG50ZnNfaW5vZGUKKyAqIHN0cnVjdHVyZSBvZiB0aGUgbWFwcGVkIGV4dGVudCBpbm9kZS4KKyAqLworTUZUX1JFQ09SRCAqbWFwX2V4dGVudF9tZnRfcmVjb3JkKG50ZnNfaW5vZGUgKmJhc2VfbmksIE1GVF9SRUYgbXJlZiwKKwkJbnRmc19pbm9kZSAqKm50ZnNfaW5vKQoreworCU1GVF9SRUNPUkQgKm07CisJbnRmc19pbm9kZSAqbmkgPSBOVUxMOworCW50ZnNfaW5vZGUgKipleHRlbnRfbmlzID0gTlVMTDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIG1mdF9ubyA9IE1SRUYobXJlZik7CisJdTE2IHNlcV9ubyA9IE1TRVFOTyhtcmVmKTsKKwlCT09MIGRlc3Ryb3lfbmkgPSBGQUxTRTsKKworCW50ZnNfZGVidWcoIk1hcHBpbmcgZXh0ZW50IG1mdCByZWNvcmQgMHglbHggKGJhc2UgbWZ0IHJlY29yZCAweCVseCkuIiwKKwkJCW1mdF9ubywgYmFzZV9uaS0+bWZ0X25vKTsKKwkvKiBNYWtlIHN1cmUgdGhlIGJhc2UgbnRmcyBpbm9kZSBkb2Vzbid0IGdvIGF3YXkuICovCisJYXRvbWljX2luYygmYmFzZV9uaS0+Y291bnQpOworCS8qCisJICogQ2hlY2sgaWYgdGhpcyBleHRlbnQgaW5vZGUgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgYmFzZSBpbm9kZSwKKwkgKiBpbiB3aGljaCBjYXNlIGp1c3QgcmV0dXJuIGl0LiBJZiBub3QgZm91bmQsIGFkZCBpdCB0byB0aGUgYmFzZQorCSAqIGlub2RlIGJlZm9yZSByZXR1cm5pbmcgaXQuCisJICovCisJZG93bigmYmFzZV9uaS0+ZXh0ZW50X2xvY2spOworCWlmIChiYXNlX25pLT5ucl9leHRlbnRzID4gMCkgeworCQlleHRlbnRfbmlzID0gYmFzZV9uaS0+ZXh0LmV4dGVudF9udGZzX2lub3M7CisJCWZvciAoaSA9IDA7IGkgPCBiYXNlX25pLT5ucl9leHRlbnRzOyBpKyspIHsKKwkJCWlmIChtZnRfbm8gIT0gZXh0ZW50X25pc1tpXS0+bWZ0X25vKQorCQkJCWNvbnRpbnVlOworCQkJbmkgPSBleHRlbnRfbmlzW2ldOworCQkJLyogTWFrZSBzdXJlIHRoZSBudGZzIGlub2RlIGRvZXNuJ3QgZ28gYXdheS4gKi8KKwkJCWF0b21pY19pbmMoJm5pLT5jb3VudCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAobGlrZWx5KG5pICE9IE5VTEwpKSB7CisJCXVwKCZiYXNlX25pLT5leHRlbnRfbG9jayk7CisJCWF0b21pY19kZWMoJmJhc2VfbmktPmNvdW50KTsKKwkJLyogV2UgZm91bmQgdGhlIHJlY29yZDsganVzdCBoYXZlIHRvIG1hcCBhbmQgcmV0dXJuIGl0LiAqLworCQltID0gbWFwX21mdF9yZWNvcmQobmkpOworCQkvKiBtYXBfbWZ0X3JlY29yZCgpIGhhcyBpbmNyZW1lbnRlZCB0aGlzIG9uIHN1Y2Nlc3MuICovCisJCWF0b21pY19kZWMoJm5pLT5jb3VudCk7CisJCWlmIChsaWtlbHkoIUlTX0VSUihtKSkpIHsKKwkJCS8qIFZlcmlmeSB0aGUgc2VxdWVuY2UgbnVtYmVyLiAqLworCQkJaWYgKGxpa2VseShsZTE2X3RvX2NwdShtLT5zZXF1ZW5jZV9udW1iZXIpID09IHNlcV9ubykpIHsKKwkJCQludGZzX2RlYnVnKCJEb25lIDEuIik7CisJCQkJKm50ZnNfaW5vID0gbmk7CisJCQkJcmV0dXJuIG07CisJCQl9CisJCQl1bm1hcF9tZnRfcmVjb3JkKG5pKTsKKwkJCW50ZnNfZXJyb3IoYmFzZV9uaS0+dm9sLT5zYiwgIkZvdW5kIHN0YWxlIGV4dGVudCBtZnQgIgorCQkJCQkicmVmZXJlbmNlISBDb3JydXB0IGZpbGUgc3lzdGVtLiAiCisJCQkJCSJSdW4gY2hrZHNrLiIpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJCX0KK21hcF9lcnJfb3V0OgorCQludGZzX2Vycm9yKGJhc2VfbmktPnZvbC0+c2IsICJGYWlsZWQgdG8gbWFwIGV4dGVudCAiCisJCQkJIm1mdCByZWNvcmQsIGVycm9yIGNvZGUgJWxkLiIsIC1QVFJfRVJSKG0pKTsKKwkJcmV0dXJuIG07CisJfQorCS8qIFJlY29yZCB3YXNuJ3QgdGhlcmUuIEdldCBhIG5ldyBudGZzIGlub2RlIGFuZCBpbml0aWFsaXplIGl0LiAqLworCW5pID0gbnRmc19uZXdfZXh0ZW50X2lub2RlKGJhc2VfbmktPnZvbC0+c2IsIG1mdF9ubyk7CisJaWYgKHVubGlrZWx5KCFuaSkpIHsKKwkJdXAoJmJhc2VfbmktPmV4dGVudF9sb2NrKTsKKwkJYXRvbWljX2RlYygmYmFzZV9uaS0+Y291bnQpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJbmktPnZvbCA9IGJhc2VfbmktPnZvbDsKKwluaS0+c2VxX25vID0gc2VxX25vOworCW5pLT5ucl9leHRlbnRzID0gLTE7CisJbmktPmV4dC5iYXNlX250ZnNfaW5vID0gYmFzZV9uaTsKKwkvKiBOb3cgbWFwIHRoZSByZWNvcmQuICovCisJbSA9IG1hcF9tZnRfcmVjb3JkKG5pKTsKKwlpZiAoSVNfRVJSKG0pKSB7CisJCXVwKCZiYXNlX25pLT5leHRlbnRfbG9jayk7CisJCWF0b21pY19kZWMoJmJhc2VfbmktPmNvdW50KTsKKwkJbnRmc19jbGVhcl9leHRlbnRfaW5vZGUobmkpOworCQlnb3RvIG1hcF9lcnJfb3V0OworCX0KKwkvKiBWZXJpZnkgdGhlIHNlcXVlbmNlIG51bWJlciBpZiBpdCBpcyBwcmVzZW50LiAqLworCWlmIChzZXFfbm8gJiYgKGxlMTZfdG9fY3B1KG0tPnNlcXVlbmNlX251bWJlcikgIT0gc2VxX25vKSkgeworCQludGZzX2Vycm9yKGJhc2VfbmktPnZvbC0+c2IsICJGb3VuZCBzdGFsZSBleHRlbnQgbWZ0ICIKKwkJCQkicmVmZXJlbmNlISBDb3JydXB0IGZpbGUgc3lzdGVtLiBSdW4gY2hrZHNrLiIpOworCQlkZXN0cm95X25pID0gVFJVRTsKKwkJbSA9IEVSUl9QVFIoLUVJTyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCS8qIEF0dGFjaCBleHRlbnQgaW5vZGUgdG8gYmFzZSBpbm9kZSwgcmVhbGxvY2F0aW5nIG1lbW9yeSBpZiBuZWVkZWQuICovCisJaWYgKCEoYmFzZV9uaS0+bnJfZXh0ZW50cyAmIDMpKSB7CisJCW50ZnNfaW5vZGUgKip0bXA7CisJCWludCBuZXdfc2l6ZSA9IChiYXNlX25pLT5ucl9leHRlbnRzICsgNCkgKiBzaXplb2YobnRmc19pbm9kZSAqKTsKKworCQl0bXAgPSAobnRmc19pbm9kZSAqKilrbWFsbG9jKG5ld19zaXplLCBHRlBfTk9GUyk7CisJCWlmICh1bmxpa2VseSghdG1wKSkgeworCQkJbnRmc19lcnJvcihiYXNlX25pLT52b2wtPnNiLCAiRmFpbGVkIHRvIGFsbG9jYXRlICIKKwkJCQkJImludGVybmFsIGJ1ZmZlci4iKTsKKwkJCWRlc3Ryb3lfbmkgPSBUUlVFOworCQkJbSA9IEVSUl9QVFIoLUVOT01FTSk7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCWlmIChiYXNlX25pLT5ucl9leHRlbnRzKSB7CisJCQlCVUdfT04oIWJhc2VfbmktPmV4dC5leHRlbnRfbnRmc19pbm9zKTsKKwkJCW1lbWNweSh0bXAsIGJhc2VfbmktPmV4dC5leHRlbnRfbnRmc19pbm9zLCBuZXdfc2l6ZSAtCisJCQkJCTQgKiBzaXplb2YobnRmc19pbm9kZSAqKSk7CisJCQlrZnJlZShiYXNlX25pLT5leHQuZXh0ZW50X250ZnNfaW5vcyk7CisJCX0KKwkJYmFzZV9uaS0+ZXh0LmV4dGVudF9udGZzX2lub3MgPSB0bXA7CisJfQorCWJhc2VfbmktPmV4dC5leHRlbnRfbnRmc19pbm9zW2Jhc2VfbmktPm5yX2V4dGVudHMrK10gPSBuaTsKKwl1cCgmYmFzZV9uaS0+ZXh0ZW50X2xvY2spOworCWF0b21pY19kZWMoJmJhc2VfbmktPmNvdW50KTsKKwludGZzX2RlYnVnKCJEb25lIDIuIik7CisJKm50ZnNfaW5vID0gbmk7CisJcmV0dXJuIG07Cit1bm1fZXJyX291dDoKKwl1bm1hcF9tZnRfcmVjb3JkKG5pKTsKKwl1cCgmYmFzZV9uaS0+ZXh0ZW50X2xvY2spOworCWF0b21pY19kZWMoJmJhc2VfbmktPmNvdW50KTsKKwkvKgorCSAqIElmIHRoZSBleHRlbnQgaW5vZGUgd2FzIG5vdCBhdHRhY2hlZCB0byB0aGUgYmFzZSBpbm9kZSB3ZSBuZWVkIHRvCisJICogcmVsZWFzZSBpdCBvciB3ZSB3aWxsIGxlYWsgbWVtb3J5LgorCSAqLworCWlmIChkZXN0cm95X25pKQorCQludGZzX2NsZWFyX2V4dGVudF9pbm9kZShuaSk7CisJcmV0dXJuIG07Cit9CisKKyNpZmRlZiBOVEZTX1JXCisKKy8qKgorICogX19tYXJrX21mdF9yZWNvcmRfZGlydHkgLSBzZXQgdGhlIG1mdCByZWNvcmQgYW5kIHRoZSBwYWdlIGNvbnRhaW5pbmcgaXQgZGlydHkKKyAqIEBuaToJCW50ZnMgaW5vZGUgZGVzY3JpYmluZyB0aGUgbWFwcGVkIG1mdCByZWNvcmQKKyAqCisgKiBJbnRlcm5hbCBmdW5jdGlvbi4gIFVzZXJzIHNob3VsZCBjYWxsIG1hcmtfbWZ0X3JlY29yZF9kaXJ0eSgpIGluc3RlYWQuCisgKgorICogU2V0IHRoZSBtYXBwZWQgKGV4dGVudCkgbWZ0IHJlY29yZCBvZiB0aGUgKGJhc2Ugb3IgZXh0ZW50KSBudGZzIGlub2RlIEBuaSwKKyAqIGFzIHdlbGwgYXMgdGhlIHBhZ2UgY29udGFpbmluZyB0aGUgbWZ0IHJlY29yZCwgZGlydHkuICBBbHNvLCBtYXJrIHRoZSBiYXNlCisgKiB2ZnMgaW5vZGUgZGlydHkuICBUaGlzIGVuc3VyZXMgdGhhdCBhbnkgY2hhbmdlcyB0byB0aGUgbWZ0IHJlY29yZCBhcmUKKyAqIHdyaXR0ZW4gb3V0IHRvIGRpc2suCisgKgorICogTk9URTogIFdlIG9ubHkgc2V0IElfRElSVFlfU1lOQyBhbmQgSV9ESVJUWV9EQVRBU1lOQyAoYW5kIG5vdCBJX0RJUlRZX1BBR0VTKQorICogb24gdGhlIGJhc2UgdmZzIGlub2RlLCBiZWNhdXNlIGV2ZW4gdGhvdWdoIGZpbGUgZGF0YSBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkLAorICogaXQgaXMgZGlydHkgaW4gdGhlIGlub2RlIG1ldGEgZGF0YSByYXRoZXIgdGhhbiB0aGUgZGF0YSBwYWdlIGNhY2hlIG9mIHRoZQorICogaW5vZGUsIGFuZCB0aHVzIHRoZXJlIGFyZSBubyBkYXRhIHBhZ2VzIHRoYXQgbmVlZCB3cml0aW5nIG91dC4gIFRoZXJlZm9yZSwgYQorICogZnVsbCBtYXJrX2lub2RlX2RpcnR5KCkgaXMgb3ZlcmtpbGwuICBBIG1hcmtfaW5vZGVfZGlydHlfc3luYygpLCBvbiB0aGUKKyAqIG90aGVyIGhhbmQsIGlzIG5vdCBzdWZmaWNpZW50LCBiZWNhdXNlIElfRElSVFlfREFUQVNZTkMgbmVlZHMgdG8gYmUgc2V0IHRvCisgKiBlbnN1cmUgLT53cml0ZV9pbm9kZSBpcyBjYWxsZWQgZnJvbSBnZW5lcmljX29zeW5jX2lub2RlKCkgYW5kIHRoaXMgbmVlZHMgdG8KKyAqIGhhcHBlbiBvciB0aGUgZmlsZSBkYXRhIHdvdWxkIG5vdCBuZWNlc3NhcmlseSBoaXQgdGhlIGRldmljZSBzeW5jaHJvbm91c2x5LAorICogZXZlbiB0aG91Z2ggdGhlIHZmcyBpbm9kZSBoYXMgdGhlIE9fU1lOQyBmbGFnIHNldC4gIEFsc28sIElfRElSVFlfREFUQVNZTkMKKyAqIHNpbXBseSAiZmVlbHMiIGJldHRlciB0aGFuIGp1c3QgSV9ESVJUWV9TWU5DLCBzaW5jZSB0aGUgZmlsZSBkYXRhIGhhcyBub3QKKyAqIGFjdHVhbGx5IGhpdCB0aGUgYmxvY2sgZGV2aWNlIHlldCwgd2hpY2ggaXMgbm90IHdoYXQgSV9ESVJUWV9TWU5DIG9uIGl0cyBvd24KKyAqIHdvdWxkIHN1Z2dlc3QuCisgKi8KK3ZvaWQgX19tYXJrX21mdF9yZWNvcmRfZGlydHkobnRmc19pbm9kZSAqbmkpCit7CisJbnRmc19pbm9kZSAqYmFzZV9uaTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpbm9kZSAweCVseC4iLCBuaS0+bWZ0X25vKTsKKwlCVUdfT04oTklub0F0dHIobmkpKTsKKwltYXJrX250ZnNfcmVjb3JkX2RpcnR5KG5pLT5wYWdlLCBuaS0+cGFnZV9vZnMpOworCS8qIERldGVybWluZSB0aGUgYmFzZSB2ZnMgaW5vZGUgYW5kIG1hcmsgaXQgZGlydHksIHRvby4gKi8KKwlkb3duKCZuaS0+ZXh0ZW50X2xvY2spOworCWlmIChsaWtlbHkobmktPm5yX2V4dGVudHMgPj0gMCkpCisJCWJhc2VfbmkgPSBuaTsKKwllbHNlCisJCWJhc2VfbmkgPSBuaS0+ZXh0LmJhc2VfbnRmc19pbm87CisJdXAoJm5pLT5leHRlbnRfbG9jayk7CisJX19tYXJrX2lub2RlX2RpcnR5KFZGU19JKGJhc2VfbmkpLCBJX0RJUlRZX1NZTkMgfCBJX0RJUlRZX0RBVEFTWU5DKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKm50ZnNfcGxlYXNlX2VtYWlsID0gIlBsZWFzZSBlbWFpbCAiCisJCSJsaW51eC1udGZzLWRldkBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgYW5kIHNheSB0aGF0IHlvdSBzYXcgIgorCQkidGhpcyBtZXNzYWdlLiAgVGhhbmsgeW91LiI7CisKKy8qKgorICogbnRmc19zeW5jX21mdF9taXJyb3JfdW1vdW50IC0gc3luY2hyb25pc2UgYW4gbWZ0IHJlY29yZCB0byB0aGUgbWZ0IG1pcnJvcgorICogQHZvbDoJbnRmcyB2b2x1bWUgb24gd2hpY2ggdGhlIG1mdCByZWNvcmQgdG8gc3luY2hyb25pemUgcmVzaWRlcworICogQG1mdF9ubzoJbWZ0IHJlY29yZCBudW1iZXIgb2YgbWZ0IHJlY29yZCB0byBzeW5jaHJvbml6ZQorICogQG06CQltYXBwZWQsIG1zdCBwcm90ZWN0ZWQgKGV4dGVudCkgbWZ0IHJlY29yZCB0byBzeW5jaHJvbml6ZQorICoKKyAqIFdyaXRlIHRoZSBtYXBwZWQsIG1zdCBwcm90ZWN0ZWQgKGV4dGVudCkgbWZ0IHJlY29yZCBAbSB3aXRoIG1mdCByZWNvcmQKKyAqIG51bWJlciBAbWZ0X25vIHRvIHRoZSBtZnQgbWlycm9yICgkTUZUTWlycikgb2YgdGhlIG50ZnMgdm9sdW1lIEB2b2wsCisgKiBieXBhc3NpbmcgdGhlIHBhZ2UgY2FjaGUgYW5kIHRoZSAkTUZUTWlyciBpbm9kZSBpdHNlbGYuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGZvciB1c2UgYXQgdW1vdW50IHRpbWUgd2hlbiB0aGUgbWZ0IG1pcnJvciBpbm9kZSBoYXMKKyAqIGFscmVhZHkgYmVlbiBkaXNwb3NlZCBvZmYuICBXZSBCVUcoKSBpZiB3ZSBhcmUgY2FsbGVkIHdoaWxlIHRoZSBtZnQgbWlycm9yCisgKiBpbm9kZSBpcyBzdGlsbCBhdHRhY2hlZCB0byB0aGUgdm9sdW1lLgorICoKKyAqIE9uIHN1Y2Nlc3MgcmV0dXJuIDAuICBPbiBlcnJvciByZXR1cm4gLWVycm5vLgorICoKKyAqIE5PVEU6ICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQgYXMgSSBhbSBub3QgY29udmluY2VkIGl0IGNhbgorICogYWN0dWFsbHkgYmUgdHJpZ2dlcmVkIGNvbnNpZGVyaW5nIHRoZSBzZXF1ZW5jZSBvZiBjb21taXRzIHdlIGRvIGluIHN1cGVyLmM6OgorICogbnRmc19wdXRfc3VwZXIoKS4gIEJ1dCBqdXN0IGluIGNhc2Ugd2UgcHJvdmlkZSB0aGlzIHBsYWNlIGhvbGRlciBhcyB0aGUKKyAqIGFsdGVybmF0aXZlIHdvdWxkIGJlIGVpdGhlciB0byBCVUcoKSBvciB0byBnZXQgYSBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UKKyAqIGFuZCBPb3BzLgorICovCitzdGF0aWMgaW50IG50ZnNfc3luY19tZnRfbWlycm9yX3Vtb3VudChudGZzX3ZvbHVtZSAqdm9sLAorCQljb25zdCB1bnNpZ25lZCBsb25nIG1mdF9ubywgTUZUX1JFQ09SRCAqbSkKK3sKKwlCVUdfT04odm9sLT5tZnRtaXJyX2lubyk7CisJbnRmc19lcnJvcih2b2wtPnNiLCAiVW1vdW50IHRpbWUgbWZ0IG1pcnJvciBzeW5jaW5nIGlzIG5vdCAiCisJCQkiaW1wbGVtZW50ZWQgeWV0LiAgJXMiLCBudGZzX3BsZWFzZV9lbWFpbCk7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisvKioKKyAqIG50ZnNfc3luY19tZnRfbWlycm9yIC0gc3luY2hyb25pemUgYW4gbWZ0IHJlY29yZCB0byB0aGUgbWZ0IG1pcnJvcgorICogQHZvbDoJbnRmcyB2b2x1bWUgb24gd2hpY2ggdGhlIG1mdCByZWNvcmQgdG8gc3luY2hyb25pemUgcmVzaWRlcworICogQG1mdF9ubzoJbWZ0IHJlY29yZCBudW1iZXIgb2YgbWZ0IHJlY29yZCB0byBzeW5jaHJvbml6ZQorICogQG06CQltYXBwZWQsIG1zdCBwcm90ZWN0ZWQgKGV4dGVudCkgbWZ0IHJlY29yZCB0byBzeW5jaHJvbml6ZQorICogQHN5bmM6CWlmIHRydWUsIHdhaXQgZm9yIGkvbyBjb21wbGV0aW9uCisgKgorICogV3JpdGUgdGhlIG1hcHBlZCwgbXN0IHByb3RlY3RlZCAoZXh0ZW50KSBtZnQgcmVjb3JkIEBtIHdpdGggbWZ0IHJlY29yZAorICogbnVtYmVyIEBtZnRfbm8gdG8gdGhlIG1mdCBtaXJyb3IgKCRNRlRNaXJyKSBvZiB0aGUgbnRmcyB2b2x1bWUgQHZvbC4KKyAqCisgKiBPbiBzdWNjZXNzIHJldHVybiAwLiAgT24gZXJyb3IgcmV0dXJuIC1lcnJubyBhbmQgc2V0IHRoZSB2b2x1bWUgZXJyb3JzIGZsYWcKKyAqIGluIHRoZSBudGZzIHZvbHVtZSBAdm9sLgorICoKKyAqIE5PVEU6ICBXZSBhbHdheXMgcGVyZm9ybSBzeW5jaHJvbm91cyBpL28gYW5kIGlnbm9yZSB0aGUgQHN5bmMgcGFyYW1ldGVyLgorICoKKyAqIFRPRE86ICBJZiBAc3luYyBpcyBmYWxzZSwgd2FudCB0byBkbyB0cnVseSBhc3luY2hyb25vdXMgaS9vLCBpLmUuIGp1c3QKKyAqIHNjaGVkdWxlIGkvbyB2aWEgLT53cml0ZXBhZ2Ugb3IgZG8gaXQgdmlhIGtudGZzZCBvciB3aGF0ZXZlci4KKyAqLworaW50IG50ZnNfc3luY19tZnRfbWlycm9yKG50ZnNfdm9sdW1lICp2b2wsIGNvbnN0IHVuc2lnbmVkIGxvbmcgbWZ0X25vLAorCQlNRlRfUkVDT1JEICptLCBpbnQgc3luYykKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBpbnQgYmxvY2tzaXplID0gdm9sLT5zYi0+c19ibG9ja3NpemU7CisJaW50IG1heF9iaHMgPSB2b2wtPm1mdF9yZWNvcmRfc2l6ZSAvIGJsb2Nrc2l6ZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1ttYXhfYmhzXTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZDsKKwl1OCAqa21pcnI7CisJcnVubGlzdF9lbGVtZW50ICpybDsKKwl1bnNpZ25lZCBpbnQgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZCwgbV9zdGFydCwgbV9lbmQsIHBhZ2Vfb2ZzOworCWludCBpX2JocywgbnJfYmhzLCBlcnIgPSAwOworCXVuc2lnbmVkIGNoYXIgYmxvY2tzaXplX2JpdHMgPSB2b2wtPm1mdG1pcnJfaW5vLT5pX2Jsa2JpdHM7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaW5vZGUgMHglbHguIiwgbWZ0X25vKTsKKwlCVUdfT04oIW1heF9iaHMpOworCWlmICh1bmxpa2VseSghdm9sLT5tZnRtaXJyX2lubykpIHsKKwkJLyogVGhpcyBjb3VsZCBoYXBwZW4gZHVyaW5nIHVtb3VudC4uLiAqLworCQllcnIgPSBudGZzX3N5bmNfbWZ0X21pcnJvcl91bW91bnQodm9sLCBtZnRfbm8sIG0pOworCQlpZiAobGlrZWx5KCFlcnIpKQorCQkJcmV0dXJuIGVycjsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBHZXQgdGhlIHBhZ2UgY29udGFpbmluZyB0aGUgbWlycm9yIGNvcHkgb2YgdGhlIG1mdCByZWNvcmQgQG0uICovCisJcGFnZSA9IG50ZnNfbWFwX3BhZ2Uodm9sLT5tZnRtaXJyX2luby0+aV9tYXBwaW5nLCBtZnRfbm8gPj4KKwkJCShQQUdFX0NBQ0hFX1NISUZUIC0gdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cykpOworCWlmIChJU19FUlIocGFnZSkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIG1hcCBtZnQgbWlycm9yIHBhZ2UuIik7CisJCWVyciA9IFBUUl9FUlIocGFnZSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJbG9ja19wYWdlKHBhZ2UpOworCUJVR19PTighUGFnZVVwdG9kYXRlKHBhZ2UpKTsKKwlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkvKiBPZmZzZXQgb2YgdGhlIG1mdCBtaXJyb3IgcmVjb3JkIGluc2lkZSB0aGUgcGFnZS4gKi8KKwlwYWdlX29mcyA9IChtZnRfbm8gPDwgdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cykgJiB+UEFHRV9DQUNIRV9NQVNLOworCS8qIFRoZSBhZGRyZXNzIGluIHRoZSBwYWdlIG9mIHRoZSBtaXJyb3IgY29weSBvZiB0aGUgbWZ0IHJlY29yZCBAbS4gKi8KKwlrbWlyciA9IHBhZ2VfYWRkcmVzcyhwYWdlKSArIHBhZ2Vfb2ZzOworCS8qIENvcHkgdGhlIG1zdCBwcm90ZWN0ZWQgbWZ0IHJlY29yZCB0byB0aGUgbWlycm9yLiAqLworCW1lbWNweShrbWlyciwgbSwgdm9sLT5tZnRfcmVjb3JkX3NpemUpOworCS8qIENyZWF0ZSB1cHRvZGF0ZSBidWZmZXJzIGlmIG5vdCBwcmVzZW50LiAqLworCWlmICh1bmxpa2VseSghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICp0YWlsOworCisJCWJoID0gaGVhZCA9IGFsbG9jX3BhZ2VfYnVmZmVycyhwYWdlLCBibG9ja3NpemUsIDEpOworCQlkbyB7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCXRhaWwgPSBiaDsKKwkJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCQl9IHdoaWxlIChiaCk7CisJCXRhaWwtPmJfdGhpc19wYWdlID0gaGVhZDsKKwkJYXR0YWNoX3BhZ2VfYnVmZmVycyhwYWdlLCBoZWFkKTsKKwkJQlVHX09OKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKTsKKwl9CisJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCUJVR19PTighYmgpOworCXJsID0gTlVMTDsKKwlucl9iaHMgPSAwOworCWJsb2NrX3N0YXJ0ID0gMDsKKwltX3N0YXJ0ID0ga21pcnIgLSAodTgqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwltX2VuZCA9IG1fc3RhcnQgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZTsKKwlkbyB7CisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYmxvY2tzaXplOworCQkvKiBJZiB0aGUgYnVmZmVyIGlzIG91dHNpZGUgdGhlIG1mdCByZWNvcmQsIHNraXAgaXQuICovCisJCWlmIChibG9ja19lbmQgPD0gbV9zdGFydCkKKwkJCWNvbnRpbnVlOworCQlpZiAodW5saWtlbHkoYmxvY2tfc3RhcnQgPj0gbV9lbmQpKQorCQkJYnJlYWs7CisJCS8qIE5lZWQgdG8gbWFwIHRoZSBidWZmZXIgaWYgaXQgaXMgbm90IG1hcHBlZCBhbHJlYWR5LiAqLworCQlpZiAodW5saWtlbHkoIWJ1ZmZlcl9tYXBwZWQoYmgpKSkgeworCQkJVkNOIHZjbjsKKwkJCUxDTiBsY247CisJCQl1bnNpZ25lZCBpbnQgdmNuX29mczsKKworCQkJLyogT2J0YWluIHRoZSB2Y24gYW5kIG9mZnNldCBvZiB0aGUgY3VycmVudCBibG9jay4gKi8KKwkJCXZjbiA9ICgoVkNOKW1mdF9ubyA8PCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzKSArCisJCQkJCShibG9ja19zdGFydCAtIG1fc3RhcnQpOworCQkJdmNuX29mcyA9IHZjbiAmIHZvbC0+Y2x1c3Rlcl9zaXplX21hc2s7CisJCQl2Y24gPj49IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CisJCQlpZiAoIXJsKSB7CisJCQkJZG93bl9yZWFkKCZOVEZTX0kodm9sLT5tZnRtaXJyX2lubyktPgorCQkJCQkJcnVubGlzdC5sb2NrKTsKKwkJCQlybCA9IE5URlNfSSh2b2wtPm1mdG1pcnJfaW5vKS0+cnVubGlzdC5ybDsKKwkJCQkvKgorCQkJCSAqICRNRlRNaXJyIGFsd2F5cyBoYXMgdGhlIHdob2xlIG9mIGl0cyBydW5saXN0CisJCQkJICogaW4gbWVtb3J5LgorCQkJCSAqLworCQkJCUJVR19PTighcmwpOworCQkJfQorCQkJLyogU2VlayB0byBlbGVtZW50IGNvbnRhaW5pbmcgdGFyZ2V0IHZjbi4gKi8KKwkJCXdoaWxlIChybC0+bGVuZ3RoICYmIHJsWzFdLnZjbiA8PSB2Y24pCisJCQkJcmwrKzsKKwkJCWxjbiA9IG50ZnNfcmxfdmNuX3RvX2xjbihybCwgdmNuKTsKKwkJCS8qIEZvciAkTUZUTWlyciwgb25seSBsY24gPj0gMCBpcyBhIHN1Y2Nlc3NmdWwgcmVtYXAuICovCisJCQlpZiAobGlrZWx5KGxjbiA+PSAwKSkgeworCQkJCS8qIFNldHVwIGJ1ZmZlciBoZWFkIHRvIGNvcnJlY3QgYmxvY2suICovCisJCQkJYmgtPmJfYmxvY2tuciA9ICgobGNuIDw8CisJCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKSArCisJCQkJCQl2Y25fb2ZzKSA+PiBibG9ja3NpemVfYml0czsKKwkJCQlzZXRfYnVmZmVyX21hcHBlZChiaCk7CisJCQl9IGVsc2UgeworCQkJCWJoLT5iX2Jsb2NrbnIgPSAtMTsKKwkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJDYW5ub3Qgd3JpdGUgbWZ0IG1pcnJvciAiCisJCQkJCQkicmVjb3JkIDB4JWx4IGJlY2F1c2UgaXRzICIKKwkJCQkJCSJsb2NhdGlvbiBvbiBkaXNrIGNvdWxkIG5vdCAiCisJCQkJCQkiYmUgZGV0ZXJtaW5lZCAoZXJyb3IgY29kZSAiCisJCQkJCQkiJWxsaSkuIiwgbWZ0X25vLAorCQkJCQkJKGxvbmcgbG9uZylsY24pOworCQkJCWVyciA9IC1FSU87CisJCQl9CisJCX0KKwkJQlVHX09OKCFidWZmZXJfdXB0b2RhdGUoYmgpKTsKKwkJQlVHX09OKCFucl9iaHMgJiYgKG1fc3RhcnQgIT0gYmxvY2tfc3RhcnQpKTsKKwkJQlVHX09OKG5yX2JocyA+PSBtYXhfYmhzKTsKKwkJYmhzW25yX2JocysrXSA9IGJoOworCQlCVUdfT04oKG5yX2JocyA+PSBtYXhfYmhzKSAmJiAobV9lbmQgIT0gYmxvY2tfZW5kKSk7CisJfSB3aGlsZSAoYmxvY2tfc3RhcnQgPSBibG9ja19lbmQsIChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisJaWYgKHVubGlrZWx5KHJsKSkKKwkJdXBfcmVhZCgmTlRGU19JKHZvbC0+bWZ0bWlycl9pbm8pLT5ydW5saXN0LmxvY2spOworCWlmIChsaWtlbHkoIWVycikpIHsKKwkJLyogTG9jayBidWZmZXJzIGFuZCBzdGFydCBzeW5jaHJvbm91cyB3cml0ZSBpL28gb24gdGhlbS4gKi8KKwkJZm9yIChpX2JocyA9IDA7IGlfYmhzIDwgbnJfYmhzOyBpX2JocysrKSB7CisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRiaCA9IGJoc1tpX2Joc107CisKKwkJCWlmICh1bmxpa2VseSh0ZXN0X3NldF9idWZmZXJfbG9ja2VkKHRiaCkpKQorCQkJCUJVRygpOworCQkJQlVHX09OKCFidWZmZXJfdXB0b2RhdGUodGJoKSk7CisJCQljbGVhcl9idWZmZXJfZGlydHkodGJoKTsKKwkJCWdldF9iaCh0YmgpOworCQkJdGJoLT5iX2VuZF9pbyA9IGVuZF9idWZmZXJfd3JpdGVfc3luYzsKKwkJCXN1Ym1pdF9iaChXUklURSwgdGJoKTsKKwkJfQorCQkvKiBXYWl0IG9uIGkvbyBjb21wbGV0aW9uIG9mIGJ1ZmZlcnMuICovCisJCWZvciAoaV9iaHMgPSAwOyBpX2JocyA8IG5yX2JoczsgaV9iaHMrKykgeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICp0YmggPSBiaHNbaV9iaHNdOworCisJCQl3YWl0X29uX2J1ZmZlcih0YmgpOworCQkJaWYgKHVubGlrZWx5KCFidWZmZXJfdXB0b2RhdGUodGJoKSkpIHsKKwkJCQllcnIgPSAtRUlPOworCQkJCS8qCisJCQkJICogU2V0IHRoZSBidWZmZXIgdXB0b2RhdGUgc28gdGhlIHBhZ2UgYW5kCisJCQkJICogYnVmZmVyIHN0YXRlcyBkbyBub3QgYmVjb21lIG91dCBvZiBzeW5jLgorCQkJCSAqLworCQkJCXNldF9idWZmZXJfdXB0b2RhdGUodGJoKTsKKwkJCX0KKwkJfQorCX0gZWxzZSAvKiBpZiAodW5saWtlbHkoZXJyKSkgKi8geworCQkvKiBDbGVhbiB0aGUgYnVmZmVycy4gKi8KKwkJZm9yIChpX2JocyA9IDA7IGlfYmhzIDwgbnJfYmhzOyBpX2JocysrKQorCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoc1tpX2Joc10pOworCX0KKwkvKiBDdXJyZW50IHN0YXRlOiBhbGwgYnVmZmVycyBhcmUgY2xlYW4sIHVubG9ja2VkLCBhbmQgdXB0b2RhdGUuICovCisJLyogUmVtb3ZlIHRoZSBtc3QgcHJvdGVjdGlvbiBmaXh1cHMgYWdhaW4uICovCisJcG9zdF93cml0ZV9tc3RfZml4dXAoKE5URlNfUkVDT1JEKilrbWlycik7CisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwlpZiAobGlrZWx5KCFlcnIpKSB7CisJCW50ZnNfZGVidWcoIkRvbmUuIik7CisJfSBlbHNlIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiSS9PIGVycm9yIHdoaWxlIHdyaXRpbmcgbWZ0IG1pcnJvciAiCisJCQkJInJlY29yZCAweCVseCEiLCBtZnRfbm8pOworZXJyX291dDoKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHN5bmNocm9uaXplICRNRlRNaXJyIChlcnJvciAiCisJCQkJImNvZGUgJWkpLiAgVm9sdW1lIHdpbGwgYmUgbGVmdCBtYXJrZWQgZGlydHkgIgorCQkJCSJvbiB1bW91bnQuICBSdW4gbnRmc2ZpeCBvbiB0aGUgcGFydGl0aW9uICIKKwkJCQkiYWZ0ZXIgdW1vdW50aW5nIHRvIGNvcnJlY3QgdGhpcy4iLCAtZXJyKTsKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHdyaXRlX21mdF9yZWNvcmRfbm9sb2NrIC0gd3JpdGUgb3V0IGEgbWFwcGVkIChleHRlbnQpIG1mdCByZWNvcmQKKyAqIEBuaToJCW50ZnMgaW5vZGUgZGVzY3JpYmluZyB0aGUgbWFwcGVkIChleHRlbnQpIG1mdCByZWNvcmQKKyAqIEBtOgkJbWFwcGVkIChleHRlbnQpIG1mdCByZWNvcmQgdG8gd3JpdGUKKyAqIEBzeW5jOglpZiB0cnVlLCB3YWl0IGZvciBpL28gY29tcGxldGlvbgorICoKKyAqIFdyaXRlIHRoZSBtYXBwZWQgKGV4dGVudCkgbWZ0IHJlY29yZCBAbSBkZXNjcmliZWQgYnkgdGhlIChyZWd1bGFyIG9yIGV4dGVudCkKKyAqIG50ZnMgaW5vZGUgQG5pIHRvIGJhY2tpbmcgc3RvcmUuICBJZiB0aGUgbWZ0IHJlY29yZCBAbSBoYXMgYSBjb3VudGVycGFydCBpbgorICogdGhlIG1mdCBtaXJyb3IsIHRoYXQgaXMgYWxzbyB1cGRhdGVkLgorICoKKyAqIFdlIG9ubHkgd3JpdGUgdGhlIG1mdCByZWNvcmQgaWYgdGhlIG50ZnMgaW5vZGUgQG5pIGlzIGRpcnR5IGFuZCB0aGUgZmlyc3QKKyAqIGJ1ZmZlciBiZWxvbmdpbmcgdG8gaXRzIG1mdCByZWNvcmQgaXMgZGlydHksIHRvby4gIFdlIGlnbm9yZSB0aGUgZGlydHkgc3RhdGUKKyAqIG9mIHN1YnNlcXVlbnQgYnVmZmVycyBiZWNhdXNlIHdlIGNvdWxkIGhhdmUgcmFjZWQgd2l0aAorICogZnMvbnRmcy9hb3BzLmM6Om1hcmtfbnRmc19yZWNvcmRfZGlydHkoKS4KKyAqCisgKiBPbiBzdWNjZXNzLCBjbGVhbiB0aGUgbWZ0IHJlY29yZCBhbmQgcmV0dXJuIDAuICBPbiBlcnJvciwgbGVhdmUgdGhlIG1mdAorICogcmVjb3JkIGRpcnR5IGFuZCByZXR1cm4gLWVycm5vLiAgVGhlIGNhbGxlciBzaG91bGQgY2FsbCBtYWtlX2JhZF9pbm9kZSgpIG9uCisgKiB0aGUgYmFzZSBpbm9kZSB0byBlbnN1cmUgbm8gbW9yZSBhY2Nlc3MgaGFwcGVucyB0byB0aGlzIGlub2RlLiAgV2UgZG8gbm90IGRvCisgKiBpdCBoZXJlIGFzIHRoZSBjYWxsZXIgbWF5IHdhbnQgdG8gZmluaXNoIHdyaXRpbmcgb3RoZXIgZXh0ZW50IG1mdCByZWNvcmRzCisgKiBmaXJzdCB0byBtaW5pbWl6ZSBvbi1kaXNrIG1ldGFkYXRhIGluY29uc2lzdGVuY2llcy4KKyAqCisgKiBOT1RFOiAgV2UgYWx3YXlzIHBlcmZvcm0gc3luY2hyb25vdXMgaS9vIGFuZCBpZ25vcmUgdGhlIEBzeW5jIHBhcmFtZXRlci4KKyAqIEhvd2V2ZXIsIGlmIHRoZSBtZnQgcmVjb3JkIGhhcyBhIGNvdW50ZXJwYXJ0IGluIHRoZSBtZnQgbWlycm9yIGFuZCBAc3luYyBpcworICogdHJ1ZSwgd2Ugd3JpdGUgdGhlIG1mdCByZWNvcmQsIHdhaXQgZm9yIGkvbyBjb21wbGV0aW9uLCBhbmQgb25seSB0aGVuIHdyaXRlCisgKiB0aGUgbWZ0IG1pcnJvciBjb3B5LiAgVGhpcyBlbnN1cmVzIHRoYXQgaWYgdGhlIHN5c3RlbSBjcmFzaGVzIGVpdGhlciB0aGUgbWZ0CisgKiBvciB0aGUgbWZ0IG1pcnJvciB3aWxsIGNvbnRhaW4gYSBzZWxmLWNvbnNpc3RlbnQgbWZ0IHJlY29yZCBAbS4gIElmIEBzeW5jIGlzCisgKiBmYWxzZSBvbiB0aGUgb3RoZXIgaGFuZCwgd2Ugc3RhcnQgaS9vIG9uIGJvdGggYW5kIHRoZW4gd2FpdCBmb3IgY29tcGxldGlvbgorICogb24gdGhlbS4gIFRoaXMgcHJvdmlkZXMgYSBzcGVlZHVwIGJ1dCBubyBsb25nZXIgZ3VhcmFudGVlcyB0aGF0IHlvdSB3aWxsIGVuZAorICogdXAgd2l0aCBhIHNlbGYtY29uc2lzdGVudCBtZnQgcmVjb3JkIGluIHRoZSBjYXNlIG9mIGEgY3Jhc2ggYnV0IGlmIHlvdSBhc2tlZAorICogZm9yIGFzeW5jaHJvbm91cyB3cml0aW5nIHlvdSBwcm9iYWJseSBkbyBub3QgY2FyZSBhYm91dCB0aGF0IGFueXdheS4KKyAqCisgKiBUT0RPOiAgSWYgQHN5bmMgaXMgZmFsc2UsIHdhbnQgdG8gZG8gdHJ1bHkgYXN5bmNocm9ub3VzIGkvbywgaS5lLiBqdXN0CisgKiBzY2hlZHVsZSBpL28gdmlhIC0+d3JpdGVwYWdlIG9yIGRvIGl0IHZpYSBrbnRmc2Qgb3Igd2hhdGV2ZXIuCisgKi8KK2ludCB3cml0ZV9tZnRfcmVjb3JkX25vbG9jayhudGZzX2lub2RlICpuaSwgTUZUX1JFQ09SRCAqbSwgaW50IHN5bmMpCit7CisJbnRmc192b2x1bWUgKnZvbCA9IG5pLT52b2w7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBuaS0+cGFnZTsKKwl1bnNpZ25lZCBjaGFyIGJsb2Nrc2l6ZV9iaXRzID0gdm9sLT5tZnRfaW5vLT5pX2Jsa2JpdHM7CisJdW5zaWduZWQgaW50IGJsb2Nrc2l6ZSA9IDEgPDwgYmxvY2tzaXplX2JpdHM7CisJaW50IG1heF9iaHMgPSB2b2wtPm1mdF9yZWNvcmRfc2l6ZSAvIGJsb2Nrc2l6ZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1ttYXhfYmhzXTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZDsKKwlydW5saXN0X2VsZW1lbnQgKnJsOworCXVuc2lnbmVkIGludCBibG9ja19zdGFydCwgYmxvY2tfZW5kLCBtX3N0YXJ0LCBtX2VuZDsKKwlpbnQgaV9iaHMsIG5yX2JocywgZXJyID0gMDsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpbm9kZSAweCVseC4iLCBuaS0+bWZ0X25vKTsKKwlCVUdfT04oTklub0F0dHIobmkpKTsKKwlCVUdfT04oIW1heF9iaHMpOworCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJLyoKKwkgKiBJZiB0aGUgbnRmc19pbm9kZSBpcyBjbGVhbiBubyBuZWVkIHRvIGRvIGFueXRoaW5nLiAgSWYgaXQgaXMgZGlydHksCisJICogbWFyayBpdCBhcyBjbGVhbiBub3cgc28gdGhhdCBpdCBjYW4gYmUgcmVkaXJ0aWVkIGxhdGVyIG9uIGlmIG5lZWRlZC4KKwkgKiBUaGVyZSBpcyBubyBkYW5nZXIgb2YgcmFjZXMgc2luY2UgdGhlIGNhbGxlciBpcyBob2xkaW5nIHRoZSBsb2NrcworCSAqIGZvciB0aGUgbWZ0IHJlY29yZCBAbSBhbmQgdGhlIHBhZ2UgaXQgaXMgaW4uCisJICovCisJaWYgKCFOSW5vVGVzdENsZWFyRGlydHkobmkpKQorCQlnb3RvIGRvbmU7CisJQlVHX09OKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKTsKKwliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJQlVHX09OKCFiaCk7CisJcmwgPSBOVUxMOworCW5yX2JocyA9IDA7CisJYmxvY2tfc3RhcnQgPSAwOworCW1fc3RhcnQgPSBuaS0+cGFnZV9vZnM7CisJbV9lbmQgPSBtX3N0YXJ0ICsgdm9sLT5tZnRfcmVjb3JkX3NpemU7CisJZG8geworCQlibG9ja19lbmQgPSBibG9ja19zdGFydCArIGJsb2Nrc2l6ZTsKKwkJLyogSWYgdGhlIGJ1ZmZlciBpcyBvdXRzaWRlIHRoZSBtZnQgcmVjb3JkLCBza2lwIGl0LiAqLworCQlpZiAoYmxvY2tfZW5kIDw9IG1fc3RhcnQpCisJCQljb250aW51ZTsKKwkJaWYgKHVubGlrZWx5KGJsb2NrX3N0YXJ0ID49IG1fZW5kKSkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBJZiB0aGlzIGJsb2NrIGlzIG5vdCB0aGUgZmlyc3Qgb25lIGluIHRoZSByZWNvcmQsIHdlIGlnbm9yZQorCQkgKiB0aGUgYnVmZmVyJ3MgZGlydHkgc3RhdGUgYmVjYXVzZSB3ZSBjb3VsZCBoYXZlIHJhY2VkIHdpdGggYQorCQkgKiBwYXJhbGxlbCBtYXJrX250ZnNfcmVjb3JkX2RpcnR5KCkuCisJCSAqLworCQlpZiAoYmxvY2tfc3RhcnQgPT0gbV9zdGFydCkgeworCQkJLyogVGhpcyBibG9jayBpcyB0aGUgZmlyc3Qgb25lIGluIHRoZSByZWNvcmQuICovCisJCQlpZiAoIWJ1ZmZlcl9kaXJ0eShiaCkpIHsKKwkJCQlCVUdfT04obnJfYmhzKTsKKwkJCQkvKiBDbGVhbiByZWNvcmRzIGFyZSBub3Qgd3JpdHRlbiBvdXQuICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogTmVlZCB0byBtYXAgdGhlIGJ1ZmZlciBpZiBpdCBpcyBub3QgbWFwcGVkIGFscmVhZHkuICovCisJCWlmICh1bmxpa2VseSghYnVmZmVyX21hcHBlZChiaCkpKSB7CisJCQlWQ04gdmNuOworCQkJTENOIGxjbjsKKwkJCXVuc2lnbmVkIGludCB2Y25fb2ZzOworCisJCQkvKiBPYnRhaW4gdGhlIHZjbiBhbmQgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IGJsb2NrLiAqLworCQkJdmNuID0gKChWQ04pbmktPm1mdF9ubyA8PCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzKSArCisJCQkJCShibG9ja19zdGFydCAtIG1fc3RhcnQpOworCQkJdmNuX29mcyA9IHZjbiAmIHZvbC0+Y2x1c3Rlcl9zaXplX21hc2s7CisJCQl2Y24gPj49IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CisJCQlpZiAoIXJsKSB7CisJCQkJZG93bl9yZWFkKCZOVEZTX0kodm9sLT5tZnRfaW5vKS0+cnVubGlzdC5sb2NrKTsKKwkJCQlybCA9IE5URlNfSSh2b2wtPm1mdF9pbm8pLT5ydW5saXN0LnJsOworCQkJCUJVR19PTighcmwpOworCQkJfQorCQkJLyogU2VlayB0byBlbGVtZW50IGNvbnRhaW5pbmcgdGFyZ2V0IHZjbi4gKi8KKwkJCXdoaWxlIChybC0+bGVuZ3RoICYmIHJsWzFdLnZjbiA8PSB2Y24pCisJCQkJcmwrKzsKKwkJCWxjbiA9IG50ZnNfcmxfdmNuX3RvX2xjbihybCwgdmNuKTsKKwkJCS8qIEZvciAkTUZULCBvbmx5IGxjbiA+PSAwIGlzIGEgc3VjY2Vzc2Z1bCByZW1hcC4gKi8KKwkJCWlmIChsaWtlbHkobGNuID49IDApKSB7CisJCQkJLyogU2V0dXAgYnVmZmVyIGhlYWQgdG8gY29ycmVjdCBibG9jay4gKi8KKwkJCQliaC0+Yl9ibG9ja25yID0gKChsY24gPDwKKwkJCQkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpICsKKwkJCQkJCXZjbl9vZnMpID4+IGJsb2Nrc2l6ZV9iaXRzOworCQkJCXNldF9idWZmZXJfbWFwcGVkKGJoKTsKKwkJCX0gZWxzZSB7CisJCQkJYmgtPmJfYmxvY2tuciA9IC0xOworCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkNhbm5vdCB3cml0ZSBtZnQgcmVjb3JkICIKKwkJCQkJCSIweCVseCBiZWNhdXNlIGl0cyBsb2NhdGlvbiAiCisJCQkJCQkib24gZGlzayBjb3VsZCBub3QgYmUgIgorCQkJCQkJImRldGVybWluZWQgKGVycm9yIGNvZGUgJWxsaSkuIiwKKwkJCQkJCW5pLT5tZnRfbm8sIChsb25nIGxvbmcpbGNuKTsKKwkJCQllcnIgPSAtRUlPOworCQkJfQorCQl9CisJCUJVR19PTighYnVmZmVyX3VwdG9kYXRlKGJoKSk7CisJCUJVR19PTighbnJfYmhzICYmIChtX3N0YXJ0ICE9IGJsb2NrX3N0YXJ0KSk7CisJCUJVR19PTihucl9iaHMgPj0gbWF4X2Jocyk7CisJCWJoc1tucl9iaHMrK10gPSBiaDsKKwkJQlVHX09OKChucl9iaHMgPj0gbWF4X2JocykgJiYgKG1fZW5kICE9IGJsb2NrX2VuZCkpOworCX0gd2hpbGUgKGJsb2NrX3N0YXJ0ID0gYmxvY2tfZW5kLCAoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOworCWlmICh1bmxpa2VseShybCkpCisJCXVwX3JlYWQoJk5URlNfSSh2b2wtPm1mdF9pbm8pLT5ydW5saXN0LmxvY2spOworCWlmICghbnJfYmhzKQorCQlnb3RvIGRvbmU7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gY2xlYW51cF9vdXQ7CisJLyogQXBwbHkgdGhlIG1zdCBwcm90ZWN0aW9uIGZpeHVwcy4gKi8KKwllcnIgPSBwcmVfd3JpdGVfbXN0X2ZpeHVwKChOVEZTX1JFQ09SRCopbSwgdm9sLT5tZnRfcmVjb3JkX3NpemUpOworCWlmIChlcnIpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGFwcGx5IG1zdCBmaXh1cHMhIik7CisJCWdvdG8gY2xlYW51cF9vdXQ7CisJfQorCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UobmkpOworCS8qIExvY2sgYnVmZmVycyBhbmQgc3RhcnQgc3luY2hyb25vdXMgd3JpdGUgaS9vIG9uIHRoZW0uICovCisJZm9yIChpX2JocyA9IDA7IGlfYmhzIDwgbnJfYmhzOyBpX2JocysrKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqdGJoID0gYmhzW2lfYmhzXTsKKworCQlpZiAodW5saWtlbHkodGVzdF9zZXRfYnVmZmVyX2xvY2tlZCh0YmgpKSkKKwkJCUJVRygpOworCQlCVUdfT04oIWJ1ZmZlcl91cHRvZGF0ZSh0YmgpKTsKKwkJY2xlYXJfYnVmZmVyX2RpcnR5KHRiaCk7CisJCWdldF9iaCh0YmgpOworCQl0YmgtPmJfZW5kX2lvID0gZW5kX2J1ZmZlcl93cml0ZV9zeW5jOworCQlzdWJtaXRfYmgoV1JJVEUsIHRiaCk7CisJfQorCS8qIFN5bmNocm9uaXplIHRoZSBtZnQgbWlycm9yIG5vdyBpZiBub3QgQHN5bmMuICovCisJaWYgKCFzeW5jICYmIG5pLT5tZnRfbm8gPCB2b2wtPm1mdG1pcnJfc2l6ZSkKKwkJbnRmc19zeW5jX21mdF9taXJyb3Iodm9sLCBuaS0+bWZ0X25vLCBtLCBzeW5jKTsKKwkvKiBXYWl0IG9uIGkvbyBjb21wbGV0aW9uIG9mIGJ1ZmZlcnMuICovCisJZm9yIChpX2JocyA9IDA7IGlfYmhzIDwgbnJfYmhzOyBpX2JocysrKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqdGJoID0gYmhzW2lfYmhzXTsKKworCQl3YWl0X29uX2J1ZmZlcih0YmgpOworCQlpZiAodW5saWtlbHkoIWJ1ZmZlcl91cHRvZGF0ZSh0YmgpKSkgeworCQkJZXJyID0gLUVJTzsKKwkJCS8qCisJCQkgKiBTZXQgdGhlIGJ1ZmZlciB1cHRvZGF0ZSBzbyB0aGUgcGFnZSBhbmQgYnVmZmVyCisJCQkgKiBzdGF0ZXMgZG8gbm90IGJlY29tZSBvdXQgb2Ygc3luYy4KKwkJCSAqLworCQkJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKHRiaCk7CisJCX0KKwl9CisJLyogSWYgQHN5bmMsIG5vdyBzeW5jaHJvbml6ZSB0aGUgbWZ0IG1pcnJvci4gKi8KKwlpZiAoc3luYyAmJiBuaS0+bWZ0X25vIDwgdm9sLT5tZnRtaXJyX3NpemUpCisJCW50ZnNfc3luY19tZnRfbWlycm9yKHZvbCwgbmktPm1mdF9ubywgbSwgc3luYyk7CisJLyogUmVtb3ZlIHRoZSBtc3QgcHJvdGVjdGlvbiBmaXh1cHMgYWdhaW4uICovCisJcG9zdF93cml0ZV9tc3RfZml4dXAoKE5URlNfUkVDT1JEKiltKTsKKwlmbHVzaF9kY2FjaGVfbWZ0X3JlY29yZF9wYWdlKG5pKTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQkvKiBJL08gZXJyb3IgZHVyaW5nIHdyaXRpbmcuICBUaGlzIGlzIHJlYWxseSBiYWQhICovCisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkkvTyBlcnJvciB3aGlsZSB3cml0aW5nIG1mdCByZWNvcmQgIgorCQkJCSIweCVseCEgIE1hcmtpbmcgYmFzZSBpbm9kZSBhcyBiYWQuICBZb3UgIgorCQkJCSJzaG91bGQgdW5tb3VudCB0aGUgdm9sdW1lIGFuZCBydW4gY2hrZHNrLiIsCisJCQkJbmktPm1mdF9ubyk7CisJCWdvdG8gZXJyX291dDsKKwl9Citkb25lOgorCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIDA7CitjbGVhbnVwX291dDoKKwkvKiBDbGVhbiB0aGUgYnVmZmVycy4gKi8KKwlmb3IgKGlfYmhzID0gMDsgaV9iaHMgPCBucl9iaHM7IGlfYmhzKyspCisJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaHNbaV9iaHNdKTsKK2Vycl9vdXQ6CisJLyoKKwkgKiBDdXJyZW50IHN0YXRlOiBhbGwgYnVmZmVycyBhcmUgY2xlYW4sIHVubG9ja2VkLCBhbmQgdXB0b2RhdGUuCisJICogVGhlIGNhbGxlciBzaG91bGQgbWFyayB0aGUgYmFzZSBpbm9kZSBhcyBiYWQgc28gdGhhdCBubyBtb3JlIGkvbworCSAqIGhhcHBlbnMuICAtPmNsZWFyX2lub2RlKCkgd2lsbCBzdGlsbCBiZSBpbnZva2VkIHNvIGFsbCBleHRlbnQgaW5vZGVzCisJICogYW5kIG90aGVyIGFsbG9jYXRlZCBtZW1vcnkgd2lsbCBiZSBmcmVlZC4KKwkgKi8KKwlpZiAoZXJyID09IC1FTk9NRU0pIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gd3JpdGUgbWZ0IHJlY29yZC4gICIKKwkJCQkiUmVkaXJ0eWluZyBzbyB0aGUgd3JpdGUgaXMgcmV0cmllZCBsYXRlci4iKTsKKwkJbWFya19tZnRfcmVjb3JkX2RpcnR5KG5pKTsKKwkJZXJyID0gMDsKKwl9IGVsc2UKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogbnRmc19tYXlfd3JpdGVfbWZ0X3JlY29yZCAtIGNoZWNrIGlmIGFuIG1mdCByZWNvcmQgbWF5IGJlIHdyaXR0ZW4gb3V0CisgKiBAdm9sOglbSU5dICBudGZzIHZvbHVtZSBvbiB3aGljaCB0aGUgbWZ0IHJlY29yZCB0byBjaGVjayByZXNpZGVzCisgKiBAbWZ0X25vOglbSU5dICBtZnQgcmVjb3JkIG51bWJlciBvZiB0aGUgbWZ0IHJlY29yZCB0byBjaGVjaworICogQG06CQlbSU5dICBtYXBwZWQgbWZ0IHJlY29yZCB0byBjaGVjaworICogQGxvY2tlZF9uaToJW09VVF0gY2FsbGVyIGhhcyB0byB1bmxvY2sgdGhpcyBudGZzIGlub2RlIGlmIG9uZSBpcyByZXR1cm5lZAorICoKKyAqIENoZWNrIGlmIHRoZSBtYXBwZWQgKGJhc2Ugb3IgZXh0ZW50KSBtZnQgcmVjb3JkIEBtIHdpdGggbWZ0IHJlY29yZCBudW1iZXIKKyAqIEBtZnRfbm8gYmVsb25naW5nIHRvIHRoZSBudGZzIHZvbHVtZSBAdm9sIG1heSBiZSB3cml0dGVuIG91dC4gIElmIG5lY2Vzc2FyeQorICogYW5kIHBvc3NpYmxlIHRoZSBudGZzIGlub2RlIG9mIHRoZSBtZnQgcmVjb3JkIGlzIGxvY2tlZCBhbmQgdGhlIGJhc2UgdmZzCisgKiBpbm9kZSBpcyBwaW5uZWQuICBUaGUgbG9ja2VkIG50ZnMgaW5vZGUgaXMgdGhlbiByZXR1cm5lZCBpbiBAbG9ja2VkX25pLiAgVGhlCisgKiBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHVubG9ja2luZyB0aGUgbnRmcyBpbm9kZSBhbmQgdW5waW5uaW5nIHRoZSBiYXNlCisgKiB2ZnMgaW5vZGUuCisgKgorICogUmV0dXJuIFRSVUUgaWYgdGhlIG1mdCByZWNvcmQgbWF5IGJlIHdyaXR0ZW4gb3V0IGFuZCBGQUxTRSBpZiBub3QuCisgKgorICogVGhlIGNhbGxlciBoYXMgbG9ja2VkIHRoZSBwYWdlIGFuZCBjbGVhcmVkIHRoZSB1cHRvZGF0ZSBmbGFnIG9uIGl0IHdoaWNoCisgKiBtZWFucyB0aGF0IHdlIGNhbiBzYWZlbHkgd3JpdGUgb3V0IGFueSBkaXJ0eSBtZnQgcmVjb3JkcyB0aGF0IGRvIG5vdCBoYXZlCisgKiB0aGVpciBpbm9kZXMgaW4gaWNhY2hlIGFzIGRldGVybWluZWQgYnkgaWxvb2t1cDUoKSBhcyBhbnlvbmUKKyAqIG9wZW5pbmcvY3JlYXRpbmcgc3VjaCBhbiBpbm9kZSB3b3VsZCBibG9jayB3aGVuIGF0dGVtcHRpbmcgdG8gbWFwIHRoZSBtZnQKKyAqIHJlY29yZCBpbiByZWFkX2NhY2hlX3BhZ2UoKSB1bnRpbCB3ZSBhcmUgZmluaXNoZWQgd2l0aCB0aGUgd3JpdGUgb3V0LgorICoKKyAqIEhlcmUgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgdGVzdHMgd2UgcGVyZm9ybToKKyAqCisgKiBJZiB0aGUgaW5vZGUgaXMgZm91bmQgaW4gaWNhY2hlIHdlIGtub3cgdGhlIG1mdCByZWNvcmQgbXVzdCBiZSBhIGJhc2UgbWZ0CisgKiByZWNvcmQuICBJZiBpdCBpcyBkaXJ0eSwgd2UgZG8gbm90IHdyaXRlIGl0IGFuZCByZXR1cm4gRkFMU0UgYXMgdGhlIHZmcworICogaW5vZGUgd3JpdGUgcGF0aHMgd2lsbCByZXN1bHQgaW4gdGhlIGFjY2VzcyB0aW1lcyBiZWluZyB1cGRhdGVkIHdoaWNoIHdvdWxkCisgKiBjYXVzZSB0aGUgYmFzZSBtZnQgcmVjb3JkIHRvIGJlIHJlZGlydGllZCBhbmQgd3JpdHRlbiBvdXQgYWdhaW4uICAoV2Uga25vdworICogdGhlIGFjY2VzcyB0aW1lIHVwZGF0ZSB3aWxsIG1vZGlmeSB0aGUgYmFzZSBtZnQgcmVjb3JkIGJlY2F1c2UgV2luZG93cworICogY2hrZHNrIGNvbXBsYWlucyBpZiB0aGUgc3RhbmRhcmQgaW5mb3JtYXRpb24gYXR0cmlidXRlIGlzIG5vdCBpbiB0aGUgYmFzZQorICogbWZ0IHJlY29yZC4pCisgKgorICogSWYgdGhlIGlub2RlIGlzIGluIGljYWNoZSBhbmQgbm90IGRpcnR5LCB3ZSBhdHRlbXB0IHRvIGxvY2sgdGhlIG1mdCByZWNvcmQKKyAqIGFuZCBpZiB3ZSBmaW5kIHRoZSBsb2NrIHdhcyBhbHJlYWR5IHRha2VuLCBpdCBpcyBub3Qgc2FmZSB0byB3cml0ZSB0aGUgbWZ0CisgKiByZWNvcmQgYW5kIHdlIHJldHVybiBGQUxTRS4KKyAqCisgKiBJZiB3ZSBtYW5hZ2UgdG8gb2J0YWluIHRoZSBsb2NrIHdlIGhhdmUgZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgbWZ0IHJlY29yZCwKKyAqIHdoaWNoIGFsc28gYWxsb3dzIHVzIHNhZmUgd3JpdGVvdXQgb2YgdGhlIG1mdCByZWNvcmQuICBXZSB0aGVuIHNldAorICogQGxvY2tlZF9uaSB0byB0aGUgbG9ja2VkIG50ZnMgaW5vZGUgYW5kIHJldHVybiBUUlVFLgorICoKKyAqIE5vdGUgd2UgY2Fubm90IGp1c3QgbG9jayB0aGUgbWZ0IHJlY29yZCBhbmQgc2xlZXAgd2hpbGUgd2FpdGluZyBmb3IgdGhlIGxvY2sKKyAqIGJlY2F1c2UgdGhpcyB3b3VsZCBkZWFkbG9jayBkdWUgdG8gbG9jayByZXZlcnNhbCAobm9ybWFsbHkgdGhlIG1mdCByZWNvcmQgaXMKKyAqIGxvY2tlZCBiZWZvcmUgdGhlIHBhZ2UgaXMgbG9ja2VkIGJ1dCB3ZSBhbHJlYWR5IGhhdmUgdGhlIHBhZ2UgbG9ja2VkIGhlcmUKKyAqIHdoZW4gd2UgdHJ5IHRvIGxvY2sgdGhlIG1mdCByZWNvcmQpLgorICoKKyAqIElmIHRoZSBpbm9kZSBpcyBub3QgaW4gaWNhY2hlIHdlIG5lZWQgdG8gcGVyZm9ybSBmdXJ0aGVyIGNoZWNrcy4KKyAqCisgKiBJZiB0aGUgbWZ0IHJlY29yZCBpcyBub3QgYSBGSUxFIHJlY29yZCBvciBpdCBpcyBhIGJhc2UgbWZ0IHJlY29yZCwgd2UgY2FuCisgKiBzYWZlbHkgd3JpdGUgaXQgYW5kIHJldHVybiBUUlVFLgorICoKKyAqIFdlIG5vdyBrbm93IHRoZSBtZnQgcmVjb3JkIGlzIGFuIGV4dGVudCBtZnQgcmVjb3JkLiAgV2UgY2hlY2sgaWYgdGhlIGlub2RlCisgKiBjb3JyZXNwb25kaW5nIHRvIGl0cyBiYXNlIG1mdCByZWNvcmQgaXMgaW4gaWNhY2hlIGFuZCBvYnRhaW4gYSByZWZlcmVuY2UgdG8KKyAqIGl0IGlmIGl0IGlzLiAgSWYgaXQgaXMgbm90LCB3ZSBjYW4gc2FmZWx5IHdyaXRlIGl0IGFuZCByZXR1cm4gVFJVRS4KKyAqCisgKiBXZSBub3cgaGF2ZSB0aGUgYmFzZSBpbm9kZSBmb3IgdGhlIGV4dGVudCBtZnQgcmVjb3JkLiAgV2UgY2hlY2sgaWYgaXQgaGFzIGFuCisgKiBudGZzIGlub2RlIGZvciB0aGUgZXh0ZW50IG1mdCByZWNvcmQgYXR0YWNoZWQgYW5kIGlmIG5vdCBpdCBpcyBzYWZlIHRvIHdyaXRlCisgKiB0aGUgZXh0ZW50IG1mdCByZWNvcmQgYW5kIHdlIHJldHVybiBUUlVFLgorICoKKyAqIFRoZSBudGZzIGlub2RlIGZvciB0aGUgZXh0ZW50IG1mdCByZWNvcmQgaXMgYXR0YWNoZWQgdG8gdGhlIGJhc2UgaW5vZGUgc28gd2UKKyAqIGF0dGVtcHQgdG8gbG9jayB0aGUgZXh0ZW50IG1mdCByZWNvcmQgYW5kIGlmIHdlIGZpbmQgdGhlIGxvY2sgd2FzIGFscmVhZHkKKyAqIHRha2VuLCBpdCBpcyBub3Qgc2FmZSB0byB3cml0ZSB0aGUgZXh0ZW50IG1mdCByZWNvcmQgYW5kIHdlIHJldHVybiBGQUxTRS4KKyAqCisgKiBJZiB3ZSBtYW5hZ2UgdG8gb2J0YWluIHRoZSBsb2NrIHdlIGhhdmUgZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgZXh0ZW50IG1mdAorICogcmVjb3JkLCB3aGljaCBhbHNvIGFsbG93cyB1cyBzYWZlIHdyaXRlb3V0IG9mIHRoZSBleHRlbnQgbWZ0IHJlY29yZC4gIFdlCisgKiBzZXQgdGhlIG50ZnMgaW5vZGUgb2YgdGhlIGV4dGVudCBtZnQgcmVjb3JkIGNsZWFuIGFuZCB0aGVuIHNldCBAbG9ja2VkX25pIHRvCisgKiB0aGUgbm93IGxvY2tlZCBudGZzIGlub2RlIGFuZCByZXR1cm4gVFJVRS4KKyAqCisgKiBOb3RlLCB0aGUgcmVhc29uIGZvciBhY3R1YWxseSB3cml0aW5nIGRpcnR5IG1mdCByZWNvcmRzIGhlcmUgYW5kIG5vdCBqdXN0CisgKiByZWx5aW5nIG9uIHRoZSB2ZnMgaW5vZGUgZGlydHkgY29kZSBwYXRocyBpcyB0aGF0IHdlIGNhbiBoYXZlIG1mdCByZWNvcmRzCisgKiBtb2RpZmllZCB3aXRob3V0IHRoZW0gZXZlciBoYXZpbmcgYWN0dWFsIGlub2RlcyBpbiBtZW1vcnkuICBBbHNvIHdlIGNhbiBoYXZlCisgKiBkaXJ0eSBtZnQgcmVjb3JkcyB3aXRoIGNsZWFuIG50ZnMgaW5vZGVzIGluIG1lbW9yeS4gIE5vbmUgb2YgdGhlIGRlc2NyaWJlZAorICogY2FzZXMgd291bGQgcmVzdWx0IGluIHRoZSBkaXJ0eSBtZnQgcmVjb3JkcyBiZWluZyB3cml0dGVuIG91dCBpZiB3ZSBvbmx5CisgKiByZWxpZWQgb24gdGhlIHZmcyBpbm9kZSBkaXJ0eSBjb2RlIHBhdGhzLiAgQW5kIHRoZXNlIGNhc2VzIGNhbiByZWFsbHkgb2NjdXIKKyAqIGR1cmluZyBhbGxvY2F0aW9uIG9mIG5ldyBtZnQgcmVjb3JkcyBhbmQgaW4gcGFydGljdWxhciB3aGVuIHRoZQorICogaW5pdGlhbGl6ZWRfc2l6ZSBvZiB0aGUgJE1GVC8kREFUQSBhdHRyaWJ1dGUgaXMgZXh0ZW5kZWQgYW5kIHRoZSBuZXcgc3BhY2UKKyAqIGlzIGluaXRpYWxpemVkIHVzaW5nIG50ZnNfbWZ0X3JlY29yZF9mb3JtYXQoKS4gIFRoZSBjbGVhbiBpbm9kZSBjYW4gdGhlbgorICogYXBwZWFyIGlmIHRoZSBtZnQgcmVjb3JkIGlzIHJldXNlZCBmb3IgYSBuZXcgaW5vZGUgYmVmb3JlIGl0IGdvdCB3cml0dGVuCisgKiBvdXQuCisgKi8KK0JPT0wgbnRmc19tYXlfd3JpdGVfbWZ0X3JlY29yZChudGZzX3ZvbHVtZSAqdm9sLCBjb25zdCB1bnNpZ25lZCBsb25nIG1mdF9ubywKKwkJY29uc3QgTUZUX1JFQ09SRCAqbSwgbnRmc19pbm9kZSAqKmxvY2tlZF9uaSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gdm9sLT5zYjsKKwlzdHJ1Y3QgaW5vZGUgKm1mdF92aSA9IHZvbC0+bWZ0X2lubzsKKwlzdHJ1Y3QgaW5vZGUgKnZpOworCW50ZnNfaW5vZGUgKm5pLCAqZW5pLCAqKmV4dGVudF9uaXM7CisJaW50IGk7CisJbnRmc19hdHRyIG5hOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LiIsIG1mdF9ubyk7CisJLyoKKwkgKiBOb3JtYWxseSB3ZSBkbyBub3QgcmV0dXJuIGEgbG9ja2VkIGlub2RlIHNvIHNldCBAbG9ja2VkX25pIHRvIE5VTEwuCisJICovCisJQlVHX09OKCFsb2NrZWRfbmkpOworCSpsb2NrZWRfbmkgPSBOVUxMOworCS8qCisJICogQ2hlY2sgaWYgdGhlIGlub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZnQgcmVjb3JkIGlzIGluIHRoZSBWRlMKKwkgKiBpbm9kZSBjYWNoZSBhbmQgb2J0YWluIGEgcmVmZXJlbmNlIHRvIGl0IGlmIGl0IGlzLgorCSAqLworCW50ZnNfZGVidWcoIkxvb2tpbmcgZm9yIGlub2RlIDB4JWx4IGluIGljYWNoZS4iLCBtZnRfbm8pOworCW5hLm1mdF9ubyA9IG1mdF9ubzsKKwluYS5uYW1lID0gTlVMTDsKKwluYS5uYW1lX2xlbiA9IDA7CisJbmEudHlwZSA9IEFUX1VOVVNFRDsKKwkvKgorCSAqIEZvciBpbm9kZSAwLCBpLmUuICRNRlQgaXRzZWxmLCB3ZSBjYW5ub3QgdXNlIGlsb29rdXA1KCkgZnJvbSBoZXJlIG9yCisJICogd2UgZGVhZGxvY2sgYmVjYXVzZSB0aGUgaW5vZGUgaXMgYWxyZWFkeSBsb2NrZWQgYnkgdGhlIGtlcm5lbAorCSAqIChmcy9mcy13cml0ZWJhY2suYzo6X19zeW5jX3NpbmdsZV9pbm9kZSgpKSBhbmQgaWxvb2t1cDUoKSB3YWl0cworCSAqIHVudGlsIHRoZSBpbm9kZSBpcyB1bmxvY2tlZCBiZWZvcmUgcmV0dXJuaW5nIGl0IGFuZCBpdCBuZXZlciBnZXRzCisJICogdW5sb2NrZWQgYmVjYXVzZSBudGZzX3Nob3VsZF93cml0ZV9tZnRfcmVjb3JkKCkgbmV2ZXIgcmV0dXJucy4gICktOgorCSAqIEZvcnR1bmF0ZWx5LCB3ZSBoYXZlIGlub2RlIDAgcGlubmVkIGluIGljYWNoZSBmb3IgdGhlIGR1cmF0aW9uIG9mCisJICogdGhlIG1vdW50IHNvIHdlIGNhbiBhY2Nlc3MgaXQgZGlyZWN0bHkuCisJICovCisJaWYgKCFtZnRfbm8pIHsKKwkJLyogQmFsYW5jZSB0aGUgYmVsb3cgaXB1dCgpLiAqLworCQl2aSA9IGlncmFiKG1mdF92aSk7CisJCUJVR19PTih2aSAhPSBtZnRfdmkpOworCX0gZWxzZQorCQl2aSA9IGlsb29rdXA1KHNiLCBtZnRfbm8sICh0ZXN0X3QpbnRmc190ZXN0X2lub2RlLCAmbmEpOworCWlmICh2aSkgeworCQludGZzX2RlYnVnKCJCYXNlIGlub2RlIDB4JWx4IGlzIGluIGljYWNoZS4iLCBtZnRfbm8pOworCQkvKiBUaGUgaW5vZGUgaXMgaW4gaWNhY2hlLiAqLworCQluaSA9IE5URlNfSSh2aSk7CisJCS8qIFRha2UgYSByZWZlcmVuY2UgdG8gdGhlIG50ZnMgaW5vZGUuICovCisJCWF0b21pY19pbmMoJm5pLT5jb3VudCk7CisJCS8qIElmIHRoZSBpbm9kZSBpcyBkaXJ0eSwgZG8gbm90IHdyaXRlIHRoaXMgcmVjb3JkLiAqLworCQlpZiAoTklub0RpcnR5KG5pKSkgeworCQkJbnRmc19kZWJ1ZygiSW5vZGUgMHglbHggaXMgZGlydHksIGRvIG5vdCB3cml0ZSBpdC4iLAorCQkJCQltZnRfbm8pOworCQkJYXRvbWljX2RlYygmbmktPmNvdW50KTsKKwkJCWlwdXQodmkpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJCW50ZnNfZGVidWcoIklub2RlIDB4JWx4IGlzIG5vdCBkaXJ0eS4iLCBtZnRfbm8pOworCQkvKiBUaGUgaW5vZGUgaXMgbm90IGRpcnR5LCB0cnkgdG8gdGFrZSB0aGUgbWZ0IHJlY29yZCBsb2NrLiAqLworCQlpZiAodW5saWtlbHkoZG93bl90cnlsb2NrKCZuaS0+bXJlY19sb2NrKSkpIHsKKwkJCW50ZnNfZGVidWcoIk1mdCByZWNvcmQgMHglbHggaXMgYWxyZWFkeSBsb2NrZWQsIGRvICIKKwkJCQkJIm5vdCB3cml0ZSBpdC4iLCBtZnRfbm8pOworCQkJYXRvbWljX2RlYygmbmktPmNvdW50KTsKKwkJCWlwdXQodmkpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJCW50ZnNfZGVidWcoIk1hbmFnZWQgdG8gbG9jayBtZnQgcmVjb3JkIDB4JWx4LCB3cml0ZSBpdC4iLAorCQkJCW1mdF9ubyk7CisJCS8qCisJCSAqIFRoZSB3cml0ZSBoYXMgdG8gb2NjdXIgd2hpbGUgd2UgaG9sZCB0aGUgbWZ0IHJlY29yZCBsb2NrIHNvCisJCSAqIHJldHVybiB0aGUgbG9ja2VkIG50ZnMgaW5vZGUuCisJCSAqLworCQkqbG9ja2VkX25pID0gbmk7CisJCXJldHVybiBUUlVFOworCX0KKwludGZzX2RlYnVnKCJJbm9kZSAweCVseCBpcyBub3QgaW4gaWNhY2hlLiIsIG1mdF9ubyk7CisJLyogVGhlIGlub2RlIGlzIG5vdCBpbiBpY2FjaGUuICovCisJLyogV3JpdGUgdGhlIHJlY29yZCBpZiBpdCBpcyBub3QgYSBtZnQgcmVjb3JkICh0eXBlICJGSUxFIikuICovCisJaWYgKCFudGZzX2lzX21mdF9yZWNvcmQobS0+bWFnaWMpKSB7CisJCW50ZnNfZGVidWcoIk1mdCByZWNvcmQgMHglbHggaXMgbm90IGEgRklMRSByZWNvcmQsIHdyaXRlIGl0LiIsCisJCQkJbWZ0X25vKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCS8qIFdyaXRlIHRoZSBtZnQgcmVjb3JkIGlmIGl0IGlzIGEgYmFzZSBpbm9kZS4gKi8KKwlpZiAoIW0tPmJhc2VfbWZ0X3JlY29yZCkgeworCQludGZzX2RlYnVnKCJNZnQgcmVjb3JkIDB4JWx4IGlzIGEgYmFzZSByZWNvcmQsIHdyaXRlIGl0LiIsCisJCQkJbWZ0X25vKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCS8qCisJICogVGhpcyBpcyBhbiBleHRlbnQgbWZ0IHJlY29yZC4gIENoZWNrIGlmIHRoZSBpbm9kZSBjb3JyZXNwb25kaW5nIHRvCisJICogaXRzIGJhc2UgbWZ0IHJlY29yZCBpcyBpbiBpY2FjaGUgYW5kIG9idGFpbiBhIHJlZmVyZW5jZSB0byBpdCBpZiBpdAorCSAqIGlzLgorCSAqLworCW5hLm1mdF9ubyA9IE1SRUZfTEUobS0+YmFzZV9tZnRfcmVjb3JkKTsKKwludGZzX2RlYnVnKCJNZnQgcmVjb3JkIDB4JWx4IGlzIGFuIGV4dGVudCByZWNvcmQuICBMb29raW5nIGZvciBiYXNlICIKKwkJCSJpbm9kZSAweCVseCBpbiBpY2FjaGUuIiwgbWZ0X25vLCBuYS5tZnRfbm8pOworCXZpID0gaWxvb2t1cDUoc2IsIG5hLm1mdF9ubywgKHRlc3RfdCludGZzX3Rlc3RfaW5vZGUsICZuYSk7CisJaWYgKCF2aSkgeworCQkvKgorCQkgKiBUaGUgYmFzZSBpbm9kZSBpcyBub3QgaW4gaWNhY2hlLCB3cml0ZSB0aGlzIGV4dGVudCBtZnQKKwkJICogcmVjb3JkLgorCQkgKi8KKwkJbnRmc19kZWJ1ZygiQmFzZSBpbm9kZSAweCVseCBpcyBub3QgaW4gaWNhY2hlLCB3cml0ZSB0aGUgIgorCQkJCSJleHRlbnQgcmVjb3JkLiIsIG5hLm1mdF9ubyk7CisJCXJldHVybiBUUlVFOworCX0KKwludGZzX2RlYnVnKCJCYXNlIGlub2RlIDB4JWx4IGlzIGluIGljYWNoZS4iLCBuYS5tZnRfbm8pOworCS8qCisJICogVGhlIGJhc2UgaW5vZGUgaXMgaW4gaWNhY2hlLiAgQ2hlY2sgaWYgaXQgaGFzIHRoZSBleHRlbnQgaW5vZGUKKwkgKiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZXh0ZW50IG1mdCByZWNvcmQgYXR0YWNoZWQuCisJICovCisJbmkgPSBOVEZTX0kodmkpOworCWRvd24oJm5pLT5leHRlbnRfbG9jayk7CisJaWYgKG5pLT5ucl9leHRlbnRzIDw9IDApIHsKKwkJLyoKKwkJICogVGhlIGJhc2UgaW5vZGUgaGFzIG5vIGF0dGFjaGVkIGV4dGVudCBpbm9kZXMsIHdyaXRlIHRoaXMKKwkJICogZXh0ZW50IG1mdCByZWNvcmQuCisJCSAqLworCQl1cCgmbmktPmV4dGVudF9sb2NrKTsKKwkJaXB1dCh2aSk7CisJCW50ZnNfZGVidWcoIkJhc2UgaW5vZGUgMHglbHggaGFzIG5vIGF0dGFjaGVkIGV4dGVudCBpbm9kZXMsICIKKwkJCQkid3JpdGUgdGhlIGV4dGVudCByZWNvcmQuIiwgbmEubWZ0X25vKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCS8qIEl0ZXJhdGUgb3ZlciB0aGUgYXR0YWNoZWQgZXh0ZW50IGlub2Rlcy4gKi8KKwlleHRlbnRfbmlzID0gbmktPmV4dC5leHRlbnRfbnRmc19pbm9zOworCWZvciAoZW5pID0gTlVMTCwgaSA9IDA7IGkgPCBuaS0+bnJfZXh0ZW50czsgKytpKSB7CisJCWlmIChtZnRfbm8gPT0gZXh0ZW50X25pc1tpXS0+bWZ0X25vKSB7CisJCQkvKgorCQkJICogRm91bmQgdGhlIGV4dGVudCBpbm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZXh0ZW50CisJCQkgKiBtZnQgcmVjb3JkLgorCQkJICovCisJCQllbmkgPSBleHRlbnRfbmlzW2ldOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyoKKwkgKiBJZiB0aGUgZXh0ZW50IGlub2RlIHdhcyBub3QgYXR0YWNoZWQgdG8gdGhlIGJhc2UgaW5vZGUsIHdyaXRlIHRoaXMKKwkgKiBleHRlbnQgbWZ0IHJlY29yZC4KKwkgKi8KKwlpZiAoIWVuaSkgeworCQl1cCgmbmktPmV4dGVudF9sb2NrKTsKKwkJaXB1dCh2aSk7CisJCW50ZnNfZGVidWcoIkV4dGVudCBpbm9kZSAweCVseCBpcyBub3QgYXR0YWNoZWQgdG8gaXRzIGJhc2UgIgorCQkJCSJpbm9kZSAweCVseCwgd3JpdGUgdGhlIGV4dGVudCByZWNvcmQuIiwKKwkJCQltZnRfbm8sIG5hLm1mdF9ubyk7CisJCXJldHVybiBUUlVFOworCX0KKwludGZzX2RlYnVnKCJFeHRlbnQgaW5vZGUgMHglbHggaXMgYXR0YWNoZWQgdG8gaXRzIGJhc2UgaW5vZGUgMHglbHguIiwKKwkJCW1mdF9ubywgbmEubWZ0X25vKTsKKwkvKiBUYWtlIGEgcmVmZXJlbmNlIHRvIHRoZSBleHRlbnQgbnRmcyBpbm9kZS4gKi8KKwlhdG9taWNfaW5jKCZlbmktPmNvdW50KTsKKwl1cCgmbmktPmV4dGVudF9sb2NrKTsKKwkvKgorCSAqIEZvdW5kIHRoZSBleHRlbnQgaW5vZGUgY29yZXNwb25kaW5nIHRvIHRoaXMgZXh0ZW50IG1mdCByZWNvcmQuCisJICogVHJ5IHRvIHRha2UgdGhlIG1mdCByZWNvcmQgbG9jay4KKwkgKi8KKwlpZiAodW5saWtlbHkoZG93bl90cnlsb2NrKCZlbmktPm1yZWNfbG9jaykpKSB7CisJCWF0b21pY19kZWMoJmVuaS0+Y291bnQpOworCQlpcHV0KHZpKTsKKwkJbnRmc19kZWJ1ZygiRXh0ZW50IG1mdCByZWNvcmQgMHglbHggaXMgYWxyZWFkeSBsb2NrZWQsIGRvICIKKwkJCQkibm90IHdyaXRlIGl0LiIsIG1mdF9ubyk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJbnRmc19kZWJ1ZygiTWFuYWdlZCB0byBsb2NrIGV4dGVudCBtZnQgcmVjb3JkIDB4JWx4LCB3cml0ZSBpdC4iLAorCQkJbWZ0X25vKTsKKwlpZiAoTklub1Rlc3RDbGVhckRpcnR5KGVuaSkpCisJCW50ZnNfZGVidWcoIkV4dGVudCBpbm9kZSAweCVseCBpcyBkaXJ0eSwgbWFya2luZyBpdCBjbGVhbi4iLAorCQkJCW1mdF9ubyk7CisJLyoKKwkgKiBUaGUgd3JpdGUgaGFzIHRvIG9jY3VyIHdoaWxlIHdlIGhvbGQgdGhlIG1mdCByZWNvcmQgbG9jayBzbyByZXR1cm4KKwkgKiB0aGUgbG9ja2VkIGV4dGVudCBudGZzIGlub2RlLgorCSAqLworCSpsb2NrZWRfbmkgPSBlbmk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICplcyA9ICIgIExlYXZpbmcgaW5jb25zaXN0ZW50IG1ldGFkYXRhLiAgVW5tb3VudCBhbmQgcnVuICIKKwkJImNoa2Rzay4iOworCisvKioKKyAqIG50ZnNfbWZ0X2JpdG1hcF9maW5kX2FuZF9hbGxvY19mcmVlX3JlY19ub2xvY2sgLSBzZWUgbmFtZQorICogQHZvbDoJdm9sdW1lIG9uIHdoaWNoIHRvIHNlYXJjaCBmb3IgYSBmcmVlIG1mdCByZWNvcmQKKyAqIEBiYXNlX25pOglvcGVuIGJhc2UgaW5vZGUgaWYgYWxsb2NhdGluZyBhbiBleHRlbnQgbWZ0IHJlY29yZCBvciBOVUxMCisgKgorICogU2VhcmNoIGZvciBhIGZyZWUgbWZ0IHJlY29yZCBpbiB0aGUgbWZ0IGJpdG1hcCBhdHRyaWJ1dGUgb24gdGhlIG50ZnMgdm9sdW1lCisgKiBAdm9sLgorICoKKyAqIElmIEBiYXNlX25pIGlzIE5VTEwgc3RhcnQgdGhlIHNlYXJjaCBhdCB0aGUgZGVmYXVsdCBhbGxvY2F0b3IgcG9zaXRpb24uCisgKgorICogSWYgQGJhc2VfbmkgaXMgbm90IE5VTEwgc3RhcnQgdGhlIHNlYXJjaCBhdCB0aGUgbWZ0IHJlY29yZCBhZnRlciB0aGUgYmFzZQorICogbWZ0IHJlY29yZCBAYmFzZV9uaS4KKyAqCisgKiBSZXR1cm4gdGhlIGZyZWUgbWZ0IHJlY29yZCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuICBBbiBlcnJvciBjb2RlIG9mCisgKiAtRU5PU1BDIG1lYW5zIHRoYXQgdGhlcmUgYXJlIG5vIGZyZWUgbWZ0IHJlY29yZHMgaW4gdGhlIGN1cnJlbnRseQorICogaW5pdGlhbGl6ZWQgbWZ0IGJpdG1hcC4KKyAqCisgKiBMb2NraW5nOiBDYWxsZXIgbXVzdCBob2xkIHZvbC0+bWZ0Ym1wX2xvY2sgZm9yIHdyaXRpbmcuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19tZnRfYml0bWFwX2ZpbmRfYW5kX2FsbG9jX2ZyZWVfcmVjX25vbG9jayhudGZzX3ZvbHVtZSAqdm9sLAorCQludGZzX2lub2RlICpiYXNlX25pKQoreworCXM2NCBwYXNzX2VuZCwgbGwsIGRhdGFfcG9zLCBwYXNzX3N0YXJ0LCBvZnMsIGJpdDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWZ0Ym1wX21hcHBpbmc7CisJdTggKmJ1ZiwgKmJ5dGU7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgaW50IHBhZ2Vfb2ZzLCBzaXplOworCXU4IHBhc3MsIGI7CisKKwludGZzX2RlYnVnKCJTZWFyY2hpbmcgZm9yIGZyZWUgbWZ0IHJlY29yZCBpbiB0aGUgY3VycmVudGx5ICIKKwkJCSJpbml0aWFsaXplZCBtZnQgYml0bWFwLiIpOworCW1mdGJtcF9tYXBwaW5nID0gdm9sLT5tZnRibXBfaW5vLT5pX21hcHBpbmc7CisJLyoKKwkgKiBTZXQgdGhlIGVuZCBvZiB0aGUgcGFzcyBtYWtpbmcgc3VyZSB3ZSBkbyBub3Qgb3ZlcmZsb3cgdGhlIG1mdAorCSAqIGJpdG1hcC4KKwkgKi8KKwlwYXNzX2VuZCA9IE5URlNfSSh2b2wtPm1mdF9pbm8pLT5hbGxvY2F0ZWRfc2l6ZSA+PgorCQkJdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0czsKKwlsbCA9IE5URlNfSSh2b2wtPm1mdGJtcF9pbm8pLT5pbml0aWFsaXplZF9zaXplIDw8IDM7CisJaWYgKHBhc3NfZW5kID4gbGwpCisJCXBhc3NfZW5kID0gbGw7CisJcGFzcyA9IDE7CisJaWYgKCFiYXNlX25pKQorCQlkYXRhX3BvcyA9IHZvbC0+bWZ0X2RhdGFfcG9zOworCWVsc2UKKwkJZGF0YV9wb3MgPSBiYXNlX25pLT5tZnRfbm8gKyAxOworCWlmIChkYXRhX3BvcyA8IDI0KQorCQlkYXRhX3BvcyA9IDI0OworCWlmIChkYXRhX3BvcyA+PSBwYXNzX2VuZCkgeworCQlkYXRhX3BvcyA9IDI0OworCQlwYXNzID0gMjsKKwkJLyogVGhpcyBoYXBwZW5zIG9uIGEgZnJlc2hseSBmb3JtYXR0ZWQgdm9sdW1lLiAqLworCQlpZiAoZGF0YV9wb3MgPj0gcGFzc19lbmQpCisJCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisJcGFzc19zdGFydCA9IGRhdGFfcG9zOworCW50ZnNfZGVidWcoIlN0YXJ0aW5nIGJpdG1hcCBzZWFyY2g6IHBhc3MgJXUsIHBhc3Nfc3RhcnQgMHglbGx4LCAiCisJCQkicGFzc19lbmQgMHglbGx4LCBkYXRhX3BvcyAweCVsbHguIiwgcGFzcywKKwkJCShsb25nIGxvbmcpcGFzc19zdGFydCwgKGxvbmcgbG9uZylwYXNzX2VuZCwKKwkJCShsb25nIGxvbmcpZGF0YV9wb3MpOworCS8qIExvb3AgdW50aWwgYSBmcmVlIG1mdCByZWNvcmQgaXMgZm91bmQuICovCisJZm9yICg7IHBhc3MgPD0gMjspIHsKKwkJLyogQ2FwIHNpemUgdG8gcGFzc19lbmQuICovCisJCW9mcyA9IGRhdGFfcG9zID4+IDM7CisJCXBhZ2Vfb2ZzID0gb2ZzICYgflBBR0VfQ0FDSEVfTUFTSzsKKwkJc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRSAtIHBhZ2Vfb2ZzOworCQlsbCA9ICgocGFzc19lbmQgKyA3KSA+PiAzKSAtIG9mczsKKwkJaWYgKHNpemUgPiBsbCkKKwkJCXNpemUgPSBsbDsKKwkJc2l6ZSA8PD0gMzsKKwkJLyoKKwkJICogSWYgd2UgYXJlIHN0aWxsIHdpdGhpbiB0aGUgYWN0aXZlIHBhc3MsIHNlYXJjaCB0aGUgbmV4dCBwYWdlCisJCSAqIGZvciBhIHplcm8gYml0LgorCQkgKi8KKwkJaWYgKHNpemUpIHsKKwkJCXBhZ2UgPSBudGZzX21hcF9wYWdlKG1mdGJtcF9tYXBwaW5nLAorCQkJCQlvZnMgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJCQlpZiAodW5saWtlbHkoSVNfRVJSKHBhZ2UpKSkgeworCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByZWFkIG1mdCAiCisJCQkJCQkiYml0bWFwLCBhYm9ydGluZy4iKTsKKwkJCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKKwkJCX0KKwkJCWJ1ZiA9ICh1OCopcGFnZV9hZGRyZXNzKHBhZ2UpICsgcGFnZV9vZnM7CisJCQliaXQgPSBkYXRhX3BvcyAmIDc7CisJCQlkYXRhX3BvcyAmPSB+N3VsbDsKKwkJCW50ZnNfZGVidWcoIkJlZm9yZSBpbm5lciBmb3IgbG9vcDogc2l6ZSAweCV4LCAiCisJCQkJCSJkYXRhX3BvcyAweCVsbHgsIGJpdCAweCVsbHgiLCBzaXplLAorCQkJCQkobG9uZyBsb25nKWRhdGFfcG9zLCAobG9uZyBsb25nKWJpdCk7CisJCQlmb3IgKDsgYml0IDwgc2l6ZSAmJiBkYXRhX3BvcyArIGJpdCA8IHBhc3NfZW5kOworCQkJCQliaXQgJj0gfjd1bGwsIGJpdCArPSA4KSB7CisJCQkJYnl0ZSA9IGJ1ZiArIChiaXQgPj4gMyk7CisJCQkJaWYgKCpieXRlID09IDB4ZmYpCisJCQkJCWNvbnRpbnVlOworCQkJCWIgPSBmZnooKHVuc2lnbmVkIGxvbmcpKmJ5dGUpOworCQkJCWlmIChiIDwgOCAmJiBiID49IChiaXQgJiA3KSkgeworCQkJCQlsbCA9IGRhdGFfcG9zICsgKGJpdCAmIH43dWxsKSArIGI7CisJCQkJCWlmICh1bmxpa2VseShsbCA+ICgxbGwgPDwgMzIpKSkgeworCQkJCQkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQkJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQkJCX0KKwkJCQkJKmJ5dGUgfD0gMSA8PCBiOworCQkJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCQkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCQkJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJCQkJbnRmc19kZWJ1ZygiRG9uZS4gIChGb3VuZCBhbmQgIgorCQkJCQkJCSJhbGxvY2F0ZWQgbWZ0IHJlY29yZCAiCisJCQkJCQkJIjB4JWxseC4pIiwKKwkJCQkJCQkobG9uZyBsb25nKWxsKTsKKwkJCQkJcmV0dXJuIGxsOworCQkJCX0KKwkJCX0KKwkJCW50ZnNfZGVidWcoIkFmdGVyIGlubmVyIGZvciBsb29wOiBzaXplIDB4JXgsICIKKwkJCQkJImRhdGFfcG9zIDB4JWxseCwgYml0IDB4JWxseCIsIHNpemUsCisJCQkJCShsb25nIGxvbmcpZGF0YV9wb3MsIChsb25nIGxvbmcpYml0KTsKKwkJCWRhdGFfcG9zICs9IHNpemU7CisJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCQkvKgorCQkJICogSWYgdGhlIGVuZCBvZiB0aGUgcGFzcyBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXQsCisJCQkgKiBjb250aW51ZSBzZWFyY2hpbmcgdGhlIG1mdCBiaXRtYXAgZm9yIGEgemVybyBiaXQuCisJCQkgKi8KKwkJCWlmIChkYXRhX3BvcyA8IHBhc3NfZW5kKQorCQkJCWNvbnRpbnVlOworCQl9CisJCS8qIERvIHRoZSBuZXh0IHBhc3MuICovCisJCWlmICgrK3Bhc3MgPT0gMikgeworCQkJLyoKKwkJCSAqIFN0YXJ0aW5nIHRoZSBzZWNvbmQgcGFzcywgaW4gd2hpY2ggd2Ugc2NhbiB0aGUgZmlyc3QKKwkJCSAqIHBhcnQgb2YgdGhlIHpvbmUgd2hpY2ggd2Ugb21pdHRlZCBlYXJsaWVyLgorCQkJICovCisJCQlwYXNzX2VuZCA9IHBhc3Nfc3RhcnQ7CisJCQlkYXRhX3BvcyA9IHBhc3Nfc3RhcnQgPSAyNDsKKwkJCW50ZnNfZGVidWcoInBhc3MgJWksIHBhc3Nfc3RhcnQgMHglbGx4LCBwYXNzX2VuZCAiCisJCQkJCSIweCVsbHguIiwgcGFzcywgKGxvbmcgbG9uZylwYXNzX3N0YXJ0LAorCQkJCQkobG9uZyBsb25nKXBhc3NfZW5kKTsKKwkJCWlmIChkYXRhX3BvcyA+PSBwYXNzX2VuZCkKKwkJCQlicmVhazsKKwkJfQorCX0KKwkvKiBObyBmcmVlIG1mdCByZWNvcmRzIGluIGN1cnJlbnRseSBpbml0aWFsaXplZCBtZnQgYml0bWFwLiAqLworCW50ZnNfZGVidWcoIkRvbmUuICAoTm8gZnJlZSBtZnQgcmVjb3JkcyBsZWZ0IGluIGN1cnJlbnRseSBpbml0aWFsaXplZCAiCisJCQkibWZ0IGJpdG1hcC4pIik7CisJcmV0dXJuIC1FTk9TUEM7Cit9CisKKy8qKgorICogbnRmc19tZnRfYml0bWFwX2V4dGVuZF9hbGxvY2F0aW9uX25vbG9jayAtIGV4dGVuZCBtZnQgYml0bWFwIGJ5IGEgY2x1c3RlcgorICogQHZvbDoJdm9sdW1lIG9uIHdoaWNoIHRvIGV4dGVuZCB0aGUgbWZ0IGJpdG1hcCBhdHRyaWJ1dGUKKyAqCisgKiBFeHRlbmQgdGhlIG1mdCBiaXRtYXAgYXR0cmlidXRlIG9uIHRoZSBudGZzIHZvbHVtZSBAdm9sIGJ5IG9uZSBjbHVzdGVyLgorICoKKyAqIE5vdGU6IE9ubHkgY2hhbmdlcyBhbGxvY2F0ZWRfc2l6ZSwgaS5lLiBkb2VzIG5vdCB0b3VjaCBpbml0aWFsaXplZF9zaXplIG9yCisgKiBkYXRhX3NpemUuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICoKKyAqIExvY2tpbmc6IC0gQ2FsbGVyIG11c3QgaG9sZCB2b2wtPm1mdGJtcF9sb2NrIGZvciB3cml0aW5nLgorICoJICAgIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyBOVEZTX0kodm9sLT5tZnRibXBfaW5vKS0+cnVubGlzdC5sb2NrIGZvcgorICoJICAgICAgd3JpdGluZyBhbmQgcmVsZWFzZXMgaXQgYmVmb3JlIHJldHVybmluZy4KKyAqCSAgICAtIFRoaXMgZnVuY3Rpb24gdGFrZXMgdm9sLT5sY25ibXBfbG9jayBmb3Igd3JpdGluZyBhbmQgcmVsZWFzZXMgaXQKKyAqCSAgICAgIGJlZm9yZSByZXR1cm5pbmcuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19tZnRfYml0bWFwX2V4dGVuZF9hbGxvY2F0aW9uX25vbG9jayhudGZzX3ZvbHVtZSAqdm9sKQoreworCUxDTiBsY247CisJczY0IGxsOworCXN0cnVjdCBwYWdlICpwYWdlOworCW50ZnNfaW5vZGUgKm1mdF9uaSwgKm1mdGJtcF9uaTsKKwlydW5saXN0X2VsZW1lbnQgKnJsLCAqcmwyID0gTlVMTDsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4ID0gTlVMTDsKKwlNRlRfUkVDT1JEICptcmVjOworCUFUVFJfUkVDT1JEICphID0gTlVMTDsKKwlpbnQgcmV0LCBtcF9zaXplOworCXUzMiBvbGRfYWxlbiA9IDA7CisJdTggKmIsIHRiOworCXN0cnVjdCB7CisJCXU4IGFkZGVkX2NsdXN0ZXI6MTsKKwkJdTggYWRkZWRfcnVuOjE7CisJCXU4IG1wX3JlYnVpbHQ6MTsKKwl9IHN0YXR1cyA9IHsgMCwgMCwgMCB9OworCisJbnRmc19kZWJ1ZygiRXh0ZW5kaW5nIG1mdCBiaXRtYXAgYWxsb2NhdGlvbi4iKTsKKwltZnRfbmkgPSBOVEZTX0kodm9sLT5tZnRfaW5vKTsKKwltZnRibXBfbmkgPSBOVEZTX0kodm9sLT5tZnRibXBfaW5vKTsKKwkvKgorCSAqIERldGVybWluZSB0aGUgbGFzdCBsY24gb2YgdGhlIG1mdCBiaXRtYXAuICBUaGUgYWxsb2NhdGVkIHNpemUgb2YgdGhlCisJICogbWZ0IGJpdG1hcCBjYW5ub3QgYmUgemVybyBzbyB3ZSBhcmUgb2sgdG8gZG8gdGhpcy4KKwkgKiBudGZzX2ZpbmRfdmNuKCkgcmV0dXJucyB0aGUgcnVubGlzdCBsb2NrZWQgb24gc3VjY2Vzcy4KKwkgKi8KKwlybCA9IG50ZnNfZmluZF92Y24obWZ0Ym1wX25pLCAobWZ0Ym1wX25pLT5hbGxvY2F0ZWRfc2l6ZSAtIDEpID4+CisJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzLCBUUlVFKTsKKwlpZiAodW5saWtlbHkoSVNfRVJSKHJsKSB8fCAhcmwtPmxlbmd0aCB8fCBybC0+bGNuIDwgMCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGRldGVybWluZSBsYXN0IGFsbG9jYXRlZCAiCisJCQkJImNsdXN0ZXIgb2YgbWZ0IGJpdG1hcCBhdHRyaWJ1dGUuIik7CisJCWlmICghSVNfRVJSKHJsKSkgeworCQkJdXBfd3JpdGUoJm1mdGJtcF9uaS0+cnVubGlzdC5sb2NrKTsKKwkJCXJldCA9IC1FSU87CisJCX0gZWxzZQorCQkJcmV0ID0gUFRSX0VSUihybCk7CisJCXJldHVybiByZXQ7CisJfQorCWxjbiA9IHJsLT5sY24gKyBybC0+bGVuZ3RoOworCW50ZnNfZGVidWcoIkxhc3QgbGNuIG9mIG1mdCBiaXRtYXAgYXR0cmlidXRlIGlzIDB4JWxseC4iLAorCQkJKGxvbmcgbG9uZylsY24pOworCS8qCisJICogQXR0ZW1wdCB0byBnZXQgdGhlIGNsdXN0ZXIgZm9sbG93aW5nIHRoZSBsYXN0IGFsbG9jYXRlZCBjbHVzdGVyIGJ5CisJICogaGFuZCBhcyBpdCBtYXkgYmUgaW4gdGhlIE1GVCB6b25lIHNvIHRoZSBhbGxvY2F0b3Igd291bGQgbm90IGdpdmUgaXQKKwkgKiB0byB1cy4KKwkgKi8KKwlsbCA9IGxjbiA+PiAzOworCXBhZ2UgPSBudGZzX21hcF9wYWdlKHZvbC0+bGNuYm1wX2luby0+aV9tYXBwaW5nLAorCQkJbGwgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJaWYgKElTX0VSUihwYWdlKSkgeworCQl1cF93cml0ZSgmbWZ0Ym1wX25pLT5ydW5saXN0LmxvY2spOworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gcmVhZCBmcm9tIGxjbiBiaXRtYXAuIik7CisJCXJldHVybiBQVFJfRVJSKHBhZ2UpOworCX0KKwliID0gKHU4KilwYWdlX2FkZHJlc3MocGFnZSkgKyAobGwgJiB+UEFHRV9DQUNIRV9NQVNLKTsKKwl0YiA9IDEgPDwgKGxjbiAmIDd1bGwpOworCWRvd25fd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOworCWlmICgqYiAhPSAweGZmICYmICEoKmIgJiB0YikpIHsKKwkJLyogTmV4dCBjbHVzdGVyIGlzIGZyZWUsIGFsbG9jYXRlIGl0LiAqLworCQkqYiB8PSB0YjsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCQl1cF93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJLyogVXBkYXRlIHRoZSBtZnQgYml0bWFwIHJ1bmxpc3QuICovCisJCXJsLT5sZW5ndGgrKzsKKwkJcmxbMV0udmNuKys7CisJCXN0YXR1cy5hZGRlZF9jbHVzdGVyID0gMTsKKwkJbnRmc19kZWJ1ZygiQXBwZW5kaW5nIG9uZSBjbHVzdGVyIHRvIG1mdCBiaXRtYXAuIik7CisJfSBlbHNlIHsKKwkJdXBfd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOworCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCS8qIEFsbG9jYXRlIGEgY2x1c3RlciBmcm9tIHRoZSBEQVRBX1pPTkUuICovCisJCXJsMiA9IG50ZnNfY2x1c3Rlcl9hbGxvYyh2b2wsIHJsWzFdLnZjbiwgMSwgbGNuLCBEQVRBX1pPTkUpOworCQlpZiAoSVNfRVJSKHJsMikpIHsKKwkJCXVwX3dyaXRlKCZtZnRibXBfbmktPnJ1bmxpc3QubG9jayk7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gYWxsb2NhdGUgYSBjbHVzdGVyIGZvciAiCisJCQkJCSJ0aGUgbWZ0IGJpdG1hcC4iKTsKKwkJCXJldHVybiBQVFJfRVJSKHJsMik7CisJCX0KKwkJcmwgPSBudGZzX3J1bmxpc3RzX21lcmdlKG1mdGJtcF9uaS0+cnVubGlzdC5ybCwgcmwyKTsKKwkJaWYgKElTX0VSUihybCkpIHsKKwkJCXVwX3dyaXRlKCZtZnRibXBfbmktPnJ1bmxpc3QubG9jayk7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWVyZ2UgcnVubGlzdHMgZm9yIG1mdCAiCisJCQkJCSJiaXRtYXAuIik7CisJCQlpZiAobnRmc19jbHVzdGVyX2ZyZWVfZnJvbV9ybCh2b2wsIHJsMikpIHsKKwkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZGVhbG9jYXRlICIKKwkJCQkJCSJhbGxvY2F0ZWQgY2x1c3Rlci4lcyIsIGVzKTsKKwkJCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCQl9CisJCQludGZzX2ZyZWUocmwyKTsKKwkJCXJldHVybiBQVFJfRVJSKHJsKTsKKwkJfQorCQltZnRibXBfbmktPnJ1bmxpc3QucmwgPSBybDsKKwkJc3RhdHVzLmFkZGVkX3J1biA9IDE7CisJCW50ZnNfZGVidWcoIkFkZGluZyBvbmUgcnVuIHRvIG1mdCBiaXRtYXAuIik7CisJCS8qIEZpbmQgdGhlIGxhc3QgcnVuIGluIHRoZSBuZXcgcnVubGlzdC4gKi8KKwkJZm9yICg7IHJsWzFdLmxlbmd0aDsgcmwrKykKKwkJCTsKKwl9CisJLyoKKwkgKiBVcGRhdGUgdGhlIGF0dHJpYnV0ZSByZWNvcmQgYXMgd2VsbC4gIE5vdGU6IEBybCBpcyB0aGUgbGFzdAorCSAqIChub24tdGVybWluYXRvcikgcnVubGlzdCBlbGVtZW50IG9mIG1mdCBiaXRtYXAuCisJICovCisJbXJlYyA9IG1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJaWYgKElTX0VSUihtcmVjKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWFwIG1mdCByZWNvcmQuIik7CisJCXJldCA9IFBUUl9FUlIobXJlYyk7CisJCWdvdG8gdW5kb19hbGxvYzsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KG1mdF9uaSwgbXJlYyk7CisJaWYgKHVubGlrZWx5KCFjdHgpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBnZXQgc2VhcmNoIGNvbnRleHQuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gdW5kb19hbGxvYzsKKwl9CisJcmV0ID0gbnRmc19hdHRyX2xvb2t1cChtZnRibXBfbmktPnR5cGUsIG1mdGJtcF9uaS0+bmFtZSwKKwkJCW1mdGJtcF9uaS0+bmFtZV9sZW4sIENBU0VfU0VOU0lUSVZFLCBybFsxXS52Y24sIE5VTEwsCisJCQkwLCBjdHgpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmaW5kIGxhc3QgYXR0cmlidXRlIGV4dGVudCBvZiAiCisJCQkJIm1mdCBiaXRtYXAgYXR0cmlidXRlLiIpOworCQlpZiAocmV0ID09IC1FTk9FTlQpCisJCQlyZXQgPSAtRUlPOworCQlnb3RvIHVuZG9fYWxsb2M7CisJfQorCWEgPSBjdHgtPmF0dHI7CisJbGwgPSBzbGU2NF90b19jcHUoYS0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3Zjbik7CisJLyogU2VhcmNoIGJhY2sgZm9yIHRoZSBwcmV2aW91cyBsYXN0IGFsbG9jYXRlZCBjbHVzdGVyIG9mIG1mdCBiaXRtYXAuICovCisJZm9yIChybDIgPSBybDsgcmwyID4gbWZ0Ym1wX25pLT5ydW5saXN0LnJsOyBybDItLSkgeworCQlpZiAobGwgPj0gcmwyLT52Y24pCisJCQlicmVhazsKKwl9CisJQlVHX09OKGxsIDwgcmwyLT52Y24pOworCUJVR19PTihsbCA+PSBybDItPnZjbiArIHJsMi0+bGVuZ3RoKTsKKwkvKiBHZXQgdGhlIHNpemUgZm9yIHRoZSBuZXcgbWFwcGluZyBwYWlycyBhcnJheSBmb3IgdGhpcyBleHRlbnQuICovCisJbXBfc2l6ZSA9IG50ZnNfZ2V0X3NpemVfZm9yX21hcHBpbmdfcGFpcnModm9sLCBybDIsIGxsKTsKKwlpZiAodW5saWtlbHkobXBfc2l6ZSA8PSAwKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJHZXQgc2l6ZSBmb3IgbWFwcGluZyBwYWlycyBmYWlsZWQgZm9yICIKKwkJCQkibWZ0IGJpdG1hcCBhdHRyaWJ1dGUgZXh0ZW50LiIpOworCQlyZXQgPSBtcF9zaXplOworCQlpZiAoIXJldCkKKwkJCXJldCA9IC1FSU87CisJCWdvdG8gdW5kb19hbGxvYzsKKwl9CisJLyogRXhwYW5kIHRoZSBhdHRyaWJ1dGUgcmVjb3JkIGlmIG5lY2Vzc2FyeS4gKi8KKwlvbGRfYWxlbiA9IGxlMzJfdG9fY3B1KGEtPmxlbmd0aCk7CisJcmV0ID0gbnRmc19hdHRyX3JlY29yZF9yZXNpemUoY3R4LT5tcmVjLCBhLCBtcF9zaXplICsKKwkJCWxlMTZfdG9fY3B1KGEtPmRhdGEubm9uX3Jlc2lkZW50Lm1hcHBpbmdfcGFpcnNfb2Zmc2V0KSk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJaWYgKHJldCAhPSAtRU5PU1BDKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gcmVzaXplIGF0dHJpYnV0ZSAiCisJCQkJCSJyZWNvcmQgZm9yIG1mdCBiaXRtYXAgYXR0cmlidXRlLiIpOworCQkJZ290byB1bmRvX2FsbG9jOworCQl9CisJCS8vIFRPRE86IERlYWwgd2l0aCB0aGlzIGJ5IG1vdmluZyB0aGlzIGV4dGVudCB0byBhIG5ldyBtZnQKKwkJLy8gcmVjb3JkIG9yIGJ5IHN0YXJ0aW5nIGEgbmV3IGV4dGVudCBpbiBhIG5ldyBtZnQgcmVjb3JkIG9yIGJ5CisJCS8vIG1vdmluZyBvdGhlciBhdHRyaWJ1dGVzIG91dCBvZiB0aGlzIG1mdCByZWNvcmQuCisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIk5vdCBlbm91Z2ggc3BhY2UgaW4gdGhpcyBtZnQgcmVjb3JkIHRvICIKKwkJCQkiYWNjb21vZGF0ZSBleHRlbmRlZCBtZnQgYml0bWFwIGF0dHJpYnV0ZSAiCisJCQkJImV4dGVudC4gIENhbm5vdCBoYW5kbGUgdGhpcyB5ZXQuIik7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlnb3RvIHVuZG9fYWxsb2M7CisJfQorCXN0YXR1cy5tcF9yZWJ1aWx0ID0gMTsKKwkvKiBHZW5lcmF0ZSB0aGUgbWFwcGluZyBwYWlycyBhcnJheSBkaXJlY3RseSBpbnRvIHRoZSBhdHRyIHJlY29yZC4gKi8KKwlyZXQgPSBudGZzX21hcHBpbmdfcGFpcnNfYnVpbGQodm9sLCAodTgqKWEgKworCQkJbGUxNl90b19jcHUoYS0+ZGF0YS5ub25fcmVzaWRlbnQubWFwcGluZ19wYWlyc19vZmZzZXQpLAorCQkJbXBfc2l6ZSwgcmwyLCBsbCwgTlVMTCk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGJ1aWxkIG1hcHBpbmcgcGFpcnMgYXJyYXkgZm9yICIKKwkJCQkibWZ0IGJpdG1hcCBhdHRyaWJ1dGUuIik7CisJCWdvdG8gdW5kb19hbGxvYzsKKwl9CisJLyogVXBkYXRlIHRoZSBoaWdoZXN0X3Zjbi4gKi8KKwlhLT5kYXRhLm5vbl9yZXNpZGVudC5oaWdoZXN0X3ZjbiA9IGNwdV90b19zbGU2NChybFsxXS52Y24gLSAxKTsKKwkvKgorCSAqIFdlIG5vdyBoYXZlIGV4dGVuZGVkIHRoZSBtZnQgYml0bWFwIGFsbG9jYXRlZF9zaXplIGJ5IG9uZSBjbHVzdGVyLgorCSAqIFJlZmxlY3QgdGhpcyBpbiB0aGUgbnRmc19pbm9kZSBzdHJ1Y3R1cmUgYW5kIHRoZSBhdHRyaWJ1dGUgcmVjb3JkLgorCSAqLworCWlmIChhLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CisJCS8qCisJCSAqIFdlIGFyZSBub3QgaW4gdGhlIGZpcnN0IGF0dHJpYnV0ZSBleHRlbnQsIHN3aXRjaCB0byBpdCwgYnV0CisJCSAqIGZpcnN0IGVuc3VyZSB0aGUgY2hhbmdlcyB3aWxsIG1ha2UgaXQgdG8gZGlzayBsYXRlci4KKwkJICovCisJCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CisJCW1hcmtfbWZ0X3JlY29yZF9kaXJ0eShjdHgtPm50ZnNfaW5vKTsKKwkJbnRmc19hdHRyX3JlaW5pdF9zZWFyY2hfY3R4KGN0eCk7CisJCXJldCA9IG50ZnNfYXR0cl9sb29rdXAobWZ0Ym1wX25pLT50eXBlLCBtZnRibXBfbmktPm5hbWUsCisJCQkJbWZ0Ym1wX25pLT5uYW1lX2xlbiwgQ0FTRV9TRU5TSVRJVkUsIDAsIE5VTEwsCisJCQkJMCwgY3R4KTsKKwkJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmaW5kIGZpcnN0IGF0dHJpYnV0ZSAiCisJCQkJCSJleHRlbnQgb2YgbWZ0IGJpdG1hcCBhdHRyaWJ1dGUuIik7CisJCQlnb3RvIHJlc3RvcmVfdW5kb19hbGxvYzsKKwkJfQorCQlhID0gY3R4LT5hdHRyOworCX0KKwltZnRibXBfbmktPmFsbG9jYXRlZF9zaXplICs9IHZvbC0+Y2x1c3Rlcl9zaXplOworCWEtPmRhdGEubm9uX3Jlc2lkZW50LmFsbG9jYXRlZF9zaXplID0KKwkJCWNwdV90b19zbGU2NChtZnRibXBfbmktPmFsbG9jYXRlZF9zaXplKTsKKwkvKiBFbnN1cmUgdGhlIGNoYW5nZXMgbWFrZSBpdCB0byBkaXNrLiAqLworCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CisJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOworCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQobWZ0X25pKTsKKwl1cF93cml0ZSgmbWZ0Ym1wX25pLT5ydW5saXN0LmxvY2spOworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIDA7CityZXN0b3JlX3VuZG9fYWxsb2M6CisJbnRmc19hdHRyX3JlaW5pdF9zZWFyY2hfY3R4KGN0eCk7CisJaWYgKG50ZnNfYXR0cl9sb29rdXAobWZ0Ym1wX25pLT50eXBlLCBtZnRibXBfbmktPm5hbWUsCisJCQltZnRibXBfbmktPm5hbWVfbGVuLCBDQVNFX1NFTlNJVElWRSwgcmxbMV0udmNuLCBOVUxMLAorCQkJMCwgY3R4KSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZmluZCBsYXN0IGF0dHJpYnV0ZSBleHRlbnQgb2YgIgorCQkJCSJtZnQgYml0bWFwIGF0dHJpYnV0ZS4lcyIsIGVzKTsKKwkJbWZ0Ym1wX25pLT5hbGxvY2F0ZWRfc2l6ZSArPSB2b2wtPmNsdXN0ZXJfc2l6ZTsKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJCXVubWFwX21mdF9yZWNvcmQobWZ0X25pKTsKKwkJdXBfd3JpdGUoJm1mdGJtcF9uaS0+cnVubGlzdC5sb2NrKTsKKwkJLyoKKwkJICogVGhlIG9ubHkgdGhpbmcgdGhhdCBpcyBub3cgd3JvbmcgaXMgLT5hbGxvY2F0ZWRfc2l6ZSBvZiB0aGUKKwkJICogYmFzZSBhdHRyaWJ1dGUgZXh0ZW50IHdoaWNoIGNoa2RzayBzaG91bGQgYmUgYWJsZSB0byBmaXguCisJCSAqLworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCXJldHVybiByZXQ7CisJfQorCWEgPSBjdHgtPmF0dHI7CisJYS0+ZGF0YS5ub25fcmVzaWRlbnQuaGlnaGVzdF92Y24gPSBjcHVfdG9fc2xlNjQocmxbMV0udmNuIC0gMik7Cit1bmRvX2FsbG9jOgorCWlmIChzdGF0dXMuYWRkZWRfY2x1c3RlcikgeworCQkvKiBUcnVuY2F0ZSB0aGUgbGFzdCBydW4gaW4gdGhlIHJ1bmxpc3QgYnkgb25lIGNsdXN0ZXIuICovCisJCXJsLT5sZW5ndGgtLTsKKwkJcmxbMV0udmNuLS07CisJfSBlbHNlIGlmIChzdGF0dXMuYWRkZWRfcnVuKSB7CisJCWxjbiA9IHJsLT5sY247CisJCS8qIFJlbW92ZSB0aGUgbGFzdCBydW4gZnJvbSB0aGUgcnVubGlzdC4gKi8KKwkJcmwtPmxjbiA9IHJsWzFdLmxjbjsKKwkJcmwtPmxlbmd0aCA9IDA7CisJfQorCS8qIERlYWxsb2NhdGUgdGhlIGNsdXN0ZXIuICovCisJZG93bl93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisJaWYgKG50ZnNfYml0bWFwX2NsZWFyX2JpdCh2b2wtPmxjbmJtcF9pbm8sIGxjbikpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZyZWUgYWxsb2NhdGVkIGNsdXN0ZXIuJXMiLCBlcyk7CisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwl9CisJdXBfd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOworCWlmIChzdGF0dXMubXBfcmVidWlsdCkgeworCQlpZiAobnRmc19tYXBwaW5nX3BhaXJzX2J1aWxkKHZvbCwgKHU4KilhICsgbGUxNl90b19jcHUoCisJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQubWFwcGluZ19wYWlyc19vZmZzZXQpLAorCQkJCW9sZF9hbGVuIC0gbGUxNl90b19jcHUoCisJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQubWFwcGluZ19wYWlyc19vZmZzZXQpLAorCQkJCXJsMiwgbGwsIE5VTEwpKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gcmVzdG9yZSBtYXBwaW5nIHBhaXJzICIKKwkJCQkJImFycmF5LiVzIiwgZXMpOworCQkJTlZvbFNldEVycm9ycyh2b2wpOworCQl9CisJCWlmIChudGZzX2F0dHJfcmVjb3JkX3Jlc2l6ZShjdHgtPm1yZWMsIGEsIG9sZF9hbGVuKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJlc3RvcmUgYXR0cmlidXRlICIKKwkJCQkJInJlY29yZC4lcyIsIGVzKTsKKwkJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJfQorCQlmbHVzaF9kY2FjaGVfbWZ0X3JlY29yZF9wYWdlKGN0eC0+bnRmc19pbm8pOworCQltYXJrX21mdF9yZWNvcmRfZGlydHkoY3R4LT5udGZzX2lubyk7CisJfQorCWlmIChjdHgpCisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCWlmICghSVNfRVJSKG1yZWMpKQorCQl1bm1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJdXBfd3JpdGUoJm1mdGJtcF9uaS0+cnVubGlzdC5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG50ZnNfbWZ0X2JpdG1hcF9leHRlbmRfaW5pdGlhbGl6ZWRfbm9sb2NrIC0gZXh0ZW5kIG1mdGJtcCBpbml0aWFsaXplZCBkYXRhCisgKiBAdm9sOgl2b2x1bWUgb24gd2hpY2ggdG8gZXh0ZW5kIHRoZSBtZnQgYml0bWFwIGF0dHJpYnV0ZQorICoKKyAqIEV4dGVuZCB0aGUgaW5pdGlhbGl6ZWQgcG9ydGlvbiBvZiB0aGUgbWZ0IGJpdG1hcCBhdHRyaWJ1dGUgb24gdGhlIG50ZnMKKyAqIHZvbHVtZSBAdm9sIGJ5IDggYnl0ZXMuCisgKgorICogTm90ZTogIE9ubHkgY2hhbmdlcyBpbml0aWFsaXplZF9zaXplIGFuZCBkYXRhX3NpemUsIGkuZS4gcmVxdWlyZXMgdGhhdAorICogYWxsb2NhdGVkX3NpemUgaXMgYmlnIGVub3VnaCB0byBmaXQgdGhlIG5ldyBpbml0aWFsaXplZF9zaXplLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJvciBvbiBlcnJvci4KKyAqCisgKiBMb2NraW5nOiBDYWxsZXIgbXVzdCBob2xkIHZvbC0+bWZ0Ym1wX2xvY2sgZm9yIHdyaXRpbmcuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19tZnRfYml0bWFwX2V4dGVuZF9pbml0aWFsaXplZF9ub2xvY2sobnRmc192b2x1bWUgKnZvbCkKK3sKKwlzNjQgb2xkX2RhdGFfc2l6ZSwgb2xkX2luaXRpYWxpemVkX3NpemU7CisJc3RydWN0IGlub2RlICptZnRibXBfdmk7CisJbnRmc19pbm9kZSAqbWZ0X25pLCAqbWZ0Ym1wX25pOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJTUZUX1JFQ09SRCAqbXJlYzsKKwlBVFRSX1JFQ09SRCAqYTsKKwlpbnQgcmV0OworCisJbnRmc19kZWJ1ZygiRXh0ZW5kaW5nIG1mdCBiaXRtYXAgaW5pdGlhaWxpemVkIChhbmQgZGF0YSkgc2l6ZS4iKTsKKwltZnRfbmkgPSBOVEZTX0kodm9sLT5tZnRfaW5vKTsKKwltZnRibXBfdmkgPSB2b2wtPm1mdGJtcF9pbm87CisJbWZ0Ym1wX25pID0gTlRGU19JKG1mdGJtcF92aSk7CisJLyogR2V0IHRoZSBhdHRyaWJ1dGUgcmVjb3JkLiAqLworCW1yZWMgPSBtYXBfbWZ0X3JlY29yZChtZnRfbmkpOworCWlmIChJU19FUlIobXJlYykpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIG1hcCBtZnQgcmVjb3JkLiIpOworCQlyZXR1cm4gUFRSX0VSUihtcmVjKTsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KG1mdF9uaSwgbXJlYyk7CisJaWYgKHVubGlrZWx5KCFjdHgpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBnZXQgc2VhcmNoIGNvbnRleHQuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCXJldCA9IG50ZnNfYXR0cl9sb29rdXAobWZ0Ym1wX25pLT50eXBlLCBtZnRibXBfbmktPm5hbWUsCisJCQltZnRibXBfbmktPm5hbWVfbGVuLCBDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwgMCwgY3R4KTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZmluZCBmaXJzdCBhdHRyaWJ1dGUgZXh0ZW50IG9mICIKKwkJCQkibWZ0IGJpdG1hcCBhdHRyaWJ1dGUuIik7CisJCWlmIChyZXQgPT0gLUVOT0VOVCkKKwkJCXJldCA9IC1FSU87CisJCWdvdG8gcHV0X2Vycl9vdXQ7CisJfQorCWEgPSBjdHgtPmF0dHI7CisJb2xkX2RhdGFfc2l6ZSA9IG1mdGJtcF92aS0+aV9zaXplOworCW9sZF9pbml0aWFsaXplZF9zaXplID0gbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplOworCS8qCisJICogV2UgY2FuIHNpbXBseSB1cGRhdGUgdGhlIGluaXRpYWxpemVkX3NpemUgYmVmb3JlIGZpbGxpbmcgdGhlIHNwYWNlCisJICogd2l0aCB6ZXJvZXMgYmVjYXVzZSB0aGUgY2FsbGVyIGlzIGhvbGRpbmcgdGhlIG1mdCBiaXRtYXAgbG9jayBmb3IKKwkgKiB3cml0aW5nIHdoaWNoIGVuc3VyZXMgdGhhdCBubyBvbmUgZWxzZSBpcyB0cnlpbmcgdG8gYWNjZXNzIHRoZSBkYXRhLgorCSAqLworCW1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSArPSA4OworCWEtPmRhdGEubm9uX3Jlc2lkZW50LmluaXRpYWxpemVkX3NpemUgPQorCQkJY3B1X3RvX3NsZTY0KG1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSk7CisJaWYgKG1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSA+IG1mdGJtcF92aS0+aV9zaXplKSB7CisJCW1mdGJtcF92aS0+aV9zaXplID0gbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplOworCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUgPQorCQkJCWNwdV90b19zbGU2NChtZnRibXBfdmktPmlfc2l6ZSk7CisJfQorCS8qIEVuc3VyZSB0aGUgY2hhbmdlcyBtYWtlIGl0IHRvIGRpc2suICovCisJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKKwltYXJrX21mdF9yZWNvcmRfZGlydHkoY3R4LT5udGZzX2lubyk7CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChtZnRfbmkpOworCS8qIEluaXRpYWxpemUgdGhlIG1mdCBiaXRtYXAgYXR0cmlidXRlIHZhbHVlIHdpdGggemVyb2VzLiAqLworCXJldCA9IG50ZnNfYXR0cl9zZXQobWZ0Ym1wX25pLCBvbGRfaW5pdGlhbGl6ZWRfc2l6ZSwgOCwgMCk7CisJaWYgKGxpa2VseSghcmV0KSkgeworCQludGZzX2RlYnVnKCJEb25lLiAgKFdyb3RlIGVpZ2h0IGluaXRpYWxpemVkIGJ5dGVzIHRvIG1mdCAiCisJCQkJImJpdG1hcC4iKTsKKwkJcmV0dXJuIDA7CisJfQorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byB3cml0ZSB0byBtZnQgYml0bWFwLiIpOworCS8qIFRyeSB0byByZWNvdmVyIGZyb20gdGhlIGVycm9yLiAqLworCW1yZWMgPSBtYXBfbWZ0X3JlY29yZChtZnRfbmkpOworCWlmIChJU19FUlIobXJlYykpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIG1hcCBtZnQgcmVjb3JkLiVzIiwgZXMpOworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCXJldHVybiByZXQ7CisJfQorCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChtZnRfbmksIG1yZWMpOworCWlmICh1bmxpa2VseSghY3R4KSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZ2V0IHNlYXJjaCBjb250ZXh0LiVzIiwgZXMpOworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWlmIChudGZzX2F0dHJfbG9va3VwKG1mdGJtcF9uaS0+dHlwZSwgbWZ0Ym1wX25pLT5uYW1lLAorCQkJbWZ0Ym1wX25pLT5uYW1lX2xlbiwgQ0FTRV9TRU5TSVRJVkUsIDAsIE5VTEwsIDAsIGN0eCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbmQgZmlyc3QgYXR0cmlidXRlIGV4dGVudCBvZiAiCisJCQkJIm1mdCBiaXRtYXAgYXR0cmlidXRlLiVzIiwgZXMpOworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CitwdXRfZXJyX291dDoKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7Cit1bm1fZXJyX291dDoKKwkJdW5tYXBfbWZ0X3JlY29yZChtZnRfbmkpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWEgPSBjdHgtPmF0dHI7CisJbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplID0gb2xkX2luaXRpYWxpemVkX3NpemU7CisJYS0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSA9CisJCQljcHVfdG9fc2xlNjQob2xkX2luaXRpYWxpemVkX3NpemUpOworCWlmIChtZnRibXBfdmktPmlfc2l6ZSAhPSBvbGRfZGF0YV9zaXplKSB7CisJCW1mdGJtcF92aS0+aV9zaXplID0gb2xkX2RhdGFfc2l6ZTsKKwkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuZGF0YV9zaXplID0gY3B1X3RvX3NsZTY0KG9sZF9kYXRhX3NpemUpOworCX0KKwlmbHVzaF9kY2FjaGVfbWZ0X3JlY29yZF9wYWdlKGN0eC0+bnRmc19pbm8pOworCW1hcmtfbWZ0X3JlY29yZF9kaXJ0eShjdHgtPm50ZnNfaW5vKTsKKwludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwl1bm1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJbnRmc19kZWJ1ZygiUmVzdG9yZWQgc3RhdHVzIG9mIG1mdGJtcDogYWxsb2NhdGVkX3NpemUgMHglbGx4LCAiCisJCQkiZGF0YV9zaXplIDB4JWxseCwgaW5pdGlhbGl6ZWRfc2l6ZSAweCVsbHguIiwKKwkJCShsb25nIGxvbmcpbWZ0Ym1wX25pLT5hbGxvY2F0ZWRfc2l6ZSwKKwkJCShsb25nIGxvbmcpbWZ0Ym1wX3ZpLT5pX3NpemUsCisJCQkobG9uZyBsb25nKW1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSk7CitlcnJfb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogbnRmc19tZnRfZGF0YV9leHRlbmRfYWxsb2NhdGlvbl9ub2xvY2sgLSBleHRlbmQgbWZ0IGRhdGEgYXR0cmlidXRlCisgKiBAdm9sOgl2b2x1bWUgb24gd2hpY2ggdG8gZXh0ZW5kIHRoZSBtZnQgZGF0YSBhdHRyaWJ1dGUKKyAqCisgKiBFeHRlbmQgdGhlIG1mdCBkYXRhIGF0dHJpYnV0ZSBvbiB0aGUgbnRmcyB2b2x1bWUgQHZvbCBieSAxNiBtZnQgcmVjb3JkcworICogd29ydGggb2YgY2x1c3RlcnMgb3IgaWYgbm90IGVub3VnaCBzcGFjZSBmb3IgdGhpcyBieSBvbmUgbWZ0IHJlY29yZCB3b3J0aAorICogb2YgY2x1c3RlcnMuCisgKgorICogTm90ZTogIE9ubHkgY2hhbmdlcyBhbGxvY2F0ZWRfc2l6ZSwgaS5lLiBkb2VzIG5vdCB0b3VjaCBpbml0aWFsaXplZF9zaXplIG9yCisgKiBkYXRhX3NpemUuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICoKKyAqIExvY2tpbmc6IC0gQ2FsbGVyIG11c3QgaG9sZCB2b2wtPm1mdGJtcF9sb2NrIGZvciB3cml0aW5nLgorICoJICAgIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyBOVEZTX0kodm9sLT5tZnRfaW5vKS0+cnVubGlzdC5sb2NrIGZvcgorICoJICAgICAgd3JpdGluZyBhbmQgcmVsZWFzZXMgaXQgYmVmb3JlIHJldHVybmluZy4KKyAqCSAgICAtIFRoaXMgZnVuY3Rpb24gY2FsbHMgZnVuY3Rpb25zIHdoaWNoIHRha2Ugdm9sLT5sY25ibXBfbG9jayBmb3IKKyAqCSAgICAgIHdyaXRpbmcgYW5kIHJlbGVhc2UgaXQgYmVmb3JlIHJldHVybmluZy4KKyAqLworc3RhdGljIGludCBudGZzX21mdF9kYXRhX2V4dGVuZF9hbGxvY2F0aW9uX25vbG9jayhudGZzX3ZvbHVtZSAqdm9sKQoreworCUxDTiBsY247CisJVkNOIG9sZF9sYXN0X3ZjbjsKKwlzNjQgbWluX25yLCBuciwgbGwgPSAwOworCW50ZnNfaW5vZGUgKm1mdF9uaTsKKwlydW5saXN0X2VsZW1lbnQgKnJsLCAqcmwyOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHggPSBOVUxMOworCU1GVF9SRUNPUkQgKm1yZWM7CisJQVRUUl9SRUNPUkQgKmEgPSBOVUxMOworCWludCByZXQsIG1wX3NpemU7CisJdTMyIG9sZF9hbGVuID0gMDsKKwlCT09MIG1wX3JlYnVpbHQgPSBGQUxTRTsKKworCW50ZnNfZGVidWcoIkV4dGVuZGluZyBtZnQgZGF0YSBhbGxvY2F0aW9uLiIpOworCW1mdF9uaSA9IE5URlNfSSh2b2wtPm1mdF9pbm8pOworCS8qCisJICogRGV0ZXJtaW5lIHRoZSBwcmVmZXJyZWQgYWxsb2NhdGlvbiBsb2NhdGlvbiwgaS5lLiB0aGUgbGFzdCBsY24gb2YKKwkgKiB0aGUgbWZ0IGRhdGEgYXR0cmlidXRlLiAgVGhlIGFsbG9jYXRlZCBzaXplIG9mIHRoZSBtZnQgZGF0YQorCSAqIGF0dHJpYnV0ZSBjYW5ub3QgYmUgemVybyBzbyB3ZSBhcmUgb2sgdG8gZG8gdGhpcy4KKwkgKiBudGZzX2ZpbmRfdmNuKCkgcmV0dXJucyB0aGUgcnVubGlzdCBsb2NrZWQgb24gc3VjY2Vzcy4KKwkgKi8KKwlybCA9IG50ZnNfZmluZF92Y24obWZ0X25pLCAobWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSAtIDEpID4+CisJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzLCBUUlVFKTsKKwlpZiAodW5saWtlbHkoSVNfRVJSKHJsKSB8fCAhcmwtPmxlbmd0aCB8fCBybC0+bGNuIDwgMCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGRldGVybWluZSBsYXN0IGFsbG9jYXRlZCAiCisJCQkJImNsdXN0ZXIgb2YgbWZ0IGRhdGEgYXR0cmlidXRlLiIpOworCQlpZiAoIUlTX0VSUihybCkpIHsKKwkJCXVwX3dyaXRlKCZtZnRfbmktPnJ1bmxpc3QubG9jayk7CisJCQlyZXQgPSAtRUlPOworCQl9IGVsc2UKKwkJCXJldCA9IFBUUl9FUlIocmwpOworCQlyZXR1cm4gcmV0OworCX0KKwlsY24gPSBybC0+bGNuICsgcmwtPmxlbmd0aDsKKwludGZzX2RlYnVnKCJMYXN0IGxjbiBvZiBtZnQgZGF0YSBhdHRyaWJ1dGUgaXMgMHglbGx4LiIsCisJCQkobG9uZyBsb25nKWxjbik7CisJLyogTWluaW11bSBhbGxvY2F0aW9uIGlzIG9uZSBtZnQgcmVjb3JkIHdvcnRoIG9mIGNsdXN0ZXJzLiAqLworCW1pbl9uciA9IHZvbC0+bWZ0X3JlY29yZF9zaXplID4+IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CisJaWYgKCFtaW5fbnIpCisJCW1pbl9uciA9IDE7CisJLyogV2FudCB0byBhbGxvY2F0ZSAxNiBtZnQgcmVjb3JkcyB3b3J0aCBvZiBjbHVzdGVycy4gKi8KKwluciA9IHZvbC0+bWZ0X3JlY29yZF9zaXplIDw8IDQgPj4gdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwlpZiAoIW5yKQorCQluciA9IG1pbl9ucjsKKwkvKiBFbnN1cmUgd2UgZG8gbm90IGdvIGFib3ZlIDJeMzItMSBtZnQgcmVjb3Jkcy4gKi8KKwlpZiAodW5saWtlbHkoKG1mdF9uaS0+YWxsb2NhdGVkX3NpemUgKworCQkJKG5yIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpKSA+PgorCQkJdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cyA+PSAoMWxsIDw8IDMyKSkpIHsKKwkJbnIgPSBtaW5fbnI7CisJCWlmICh1bmxpa2VseSgobWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSArCisJCQkJKG5yIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpKSA+PgorCQkJCXZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMgPj0gKDFsbCA8PCAzMikpKSB7CisJCQludGZzX3dhcm5pbmcodm9sLT5zYiwgIkNhbm5vdCBhbGxvY2F0ZSBtZnQgcmVjb3JkICIKKwkJCQkJImJlY2F1c2UgdGhlIG1heGltdW0gbnVtYmVyIG9mIGlub2RlcyAiCisJCQkJCSIoMl4zMikgaGFzIGFscmVhZHkgYmVlbiByZWFjaGVkLiIpOworCQkJdXBfd3JpdGUoJm1mdF9uaS0+cnVubGlzdC5sb2NrKTsKKwkJCXJldHVybiAtRU5PU1BDOworCQl9CisJfQorCW50ZnNfZGVidWcoIlRyeWluZyBtZnQgZGF0YSBhbGxvY2F0aW9uIHdpdGggJXMgY2x1c3RlciBjb3VudCAlbGxpLiIsCisJCQluciA+IG1pbl9uciA/ICJkZWZhdWx0IiA6ICJtaW5pbWFsIiwgKGxvbmcgbG9uZylucik7CisJb2xkX2xhc3RfdmNuID0gcmxbMV0udmNuOworCWRvIHsKKwkJcmwyID0gbnRmc19jbHVzdGVyX2FsbG9jKHZvbCwgb2xkX2xhc3RfdmNuLCBuciwgbGNuLCBNRlRfWk9ORSk7CisJCWlmIChsaWtlbHkoIUlTX0VSUihybDIpKSkKKwkJCWJyZWFrOworCQlpZiAoUFRSX0VSUihybDIpICE9IC1FTk9TUEMgfHwgbnIgPT0gbWluX25yKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gYWxsb2NhdGUgdGhlIG1pbmltYWwgIgorCQkJCQkibnVtYmVyIG9mIGNsdXN0ZXJzICglbGxpKSBmb3IgdGhlICIKKwkJCQkJIm1mdCBkYXRhIGF0dHJpYnV0ZS4iLCAobG9uZyBsb25nKW5yKTsKKwkJCXVwX3dyaXRlKCZtZnRfbmktPnJ1bmxpc3QubG9jayk7CisJCQlyZXR1cm4gUFRSX0VSUihybDIpOworCQl9CisJCS8qCisJCSAqIFRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UgdG8gZG8gdGhlIGFsbG9jYXRpb24sIGJ1dCB0aGVyZQorCQkgKiBtaWdodCBiZSBlbm91Z2ggc3BhY2UgdG8gZG8gYSBtaW5pbWFsIGFsbG9jYXRpb24gc28gdHJ5IHRoYXQKKwkJICogYmVmb3JlIGZhaWxpbmcuCisJCSAqLworCQluciA9IG1pbl9ucjsKKwkJbnRmc19kZWJ1ZygiUmV0cnlpbmcgbWZ0IGRhdGEgYWxsb2NhdGlvbiB3aXRoIG1pbmltYWwgY2x1c3RlciAiCisJCQkJImNvdW50ICVsbGkuIiwgKGxvbmcgbG9uZylucik7CisJfSB3aGlsZSAoMSk7CisJcmwgPSBudGZzX3J1bmxpc3RzX21lcmdlKG1mdF9uaS0+cnVubGlzdC5ybCwgcmwyKTsKKwlpZiAoSVNfRVJSKHJsKSkgeworCQl1cF93cml0ZSgmbWZ0X25pLT5ydW5saXN0LmxvY2spOworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWVyZ2UgcnVubGlzdHMgZm9yIG1mdCBkYXRhICIKKwkJCQkiYXR0cmlidXRlLiIpOworCQlpZiAobnRmc19jbHVzdGVyX2ZyZWVfZnJvbV9ybCh2b2wsIHJsMikpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBkZWFsb2NhdGUgY2x1c3RlcnMgIgorCQkJCQkiZnJvbSB0aGUgbWZ0IGRhdGEgYXR0cmlidXRlLiVzIiwgZXMpOworCQkJTlZvbFNldEVycm9ycyh2b2wpOworCQl9CisJCW50ZnNfZnJlZShybDIpOworCQlyZXR1cm4gUFRSX0VSUihybCk7CisJfQorCW1mdF9uaS0+cnVubGlzdC5ybCA9IHJsOworCW50ZnNfZGVidWcoIkFsbG9jYXRlZCAlbGxpIGNsdXN0ZXJzLiIsIG5yKTsKKwkvKiBGaW5kIHRoZSBsYXN0IHJ1biBpbiB0aGUgbmV3IHJ1bmxpc3QuICovCisJZm9yICg7IHJsWzFdLmxlbmd0aDsgcmwrKykKKwkJOworCS8qIFVwZGF0ZSB0aGUgYXR0cmlidXRlIHJlY29yZCBhcyB3ZWxsLiAqLworCW1yZWMgPSBtYXBfbWZ0X3JlY29yZChtZnRfbmkpOworCWlmIChJU19FUlIobXJlYykpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIG1hcCBtZnQgcmVjb3JkLiIpOworCQlyZXQgPSBQVFJfRVJSKG1yZWMpOworCQlnb3RvIHVuZG9fYWxsb2M7CisJfQorCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChtZnRfbmksIG1yZWMpOworCWlmICh1bmxpa2VseSghY3R4KSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZ2V0IHNlYXJjaCBjb250ZXh0LiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHVuZG9fYWxsb2M7CisJfQorCXJldCA9IG50ZnNfYXR0cl9sb29rdXAobWZ0X25pLT50eXBlLCBtZnRfbmktPm5hbWUsIG1mdF9uaS0+bmFtZV9sZW4sCisJCQlDQVNFX1NFTlNJVElWRSwgcmxbMV0udmNuLCBOVUxMLCAwLCBjdHgpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmaW5kIGxhc3QgYXR0cmlidXRlIGV4dGVudCBvZiAiCisJCQkJIm1mdCBkYXRhIGF0dHJpYnV0ZS4iKTsKKwkJaWYgKHJldCA9PSAtRU5PRU5UKQorCQkJcmV0ID0gLUVJTzsKKwkJZ290byB1bmRvX2FsbG9jOworCX0KKwlhID0gY3R4LT5hdHRyOworCWxsID0gc2xlNjRfdG9fY3B1KGEtPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pOworCS8qIFNlYXJjaCBiYWNrIGZvciB0aGUgcHJldmlvdXMgbGFzdCBhbGxvY2F0ZWQgY2x1c3RlciBvZiBtZnQgYml0bWFwLiAqLworCWZvciAocmwyID0gcmw7IHJsMiA+IG1mdF9uaS0+cnVubGlzdC5ybDsgcmwyLS0pIHsKKwkJaWYgKGxsID49IHJsMi0+dmNuKQorCQkJYnJlYWs7CisJfQorCUJVR19PTihsbCA8IHJsMi0+dmNuKTsKKwlCVUdfT04obGwgPj0gcmwyLT52Y24gKyBybDItPmxlbmd0aCk7CisJLyogR2V0IHRoZSBzaXplIGZvciB0aGUgbmV3IG1hcHBpbmcgcGFpcnMgYXJyYXkgZm9yIHRoaXMgZXh0ZW50LiAqLworCW1wX3NpemUgPSBudGZzX2dldF9zaXplX2Zvcl9tYXBwaW5nX3BhaXJzKHZvbCwgcmwyLCBsbCk7CisJaWYgKHVubGlrZWx5KG1wX3NpemUgPD0gMCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiR2V0IHNpemUgZm9yIG1hcHBpbmcgcGFpcnMgZmFpbGVkIGZvciAiCisJCQkJIm1mdCBkYXRhIGF0dHJpYnV0ZSBleHRlbnQuIik7CisJCXJldCA9IG1wX3NpemU7CisJCWlmICghcmV0KQorCQkJcmV0ID0gLUVJTzsKKwkJZ290byB1bmRvX2FsbG9jOworCX0KKwkvKiBFeHBhbmQgdGhlIGF0dHJpYnV0ZSByZWNvcmQgaWYgbmVjZXNzYXJ5LiAqLworCW9sZF9hbGVuID0gbGUzMl90b19jcHUoYS0+bGVuZ3RoKTsKKwlyZXQgPSBudGZzX2F0dHJfcmVjb3JkX3Jlc2l6ZShjdHgtPm1yZWMsIGEsIG1wX3NpemUgKworCQkJbGUxNl90b19jcHUoYS0+ZGF0YS5ub25fcmVzaWRlbnQubWFwcGluZ19wYWlyc19vZmZzZXQpKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlpZiAocmV0ICE9IC1FTk9TUEMpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByZXNpemUgYXR0cmlidXRlICIKKwkJCQkJInJlY29yZCBmb3IgbWZ0IGRhdGEgYXR0cmlidXRlLiIpOworCQkJZ290byB1bmRvX2FsbG9jOworCQl9CisJCS8vIFRPRE86IERlYWwgd2l0aCB0aGlzIGJ5IG1vdmluZyB0aGlzIGV4dGVudCB0byBhIG5ldyBtZnQKKwkJLy8gcmVjb3JkIG9yIGJ5IHN0YXJ0aW5nIGEgbmV3IGV4dGVudCBpbiBhIG5ldyBtZnQgcmVjb3JkIG9yIGJ5CisJCS8vIG1vdmluZyBvdGhlciBhdHRyaWJ1dGVzIG91dCBvZiB0aGlzIG1mdCByZWNvcmQuCisJCS8vIE5vdGU6IFVzZSB0aGUgc3BlY2lhbCByZXNlcnZlZCBtZnQgcmVjb3JkcyBhbmQgZW5zdXJlIHRoYXQKKwkJLy8gdGhpcyBleHRlbnQgaXMgbm90IHJlcXVpcmVkIHRvIGZpbmQgdGhlIG1mdCByZWNvcmQgaW4KKwkJLy8gcXVlc3Rpb24uCisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIk5vdCBlbm91Z2ggc3BhY2UgaW4gdGhpcyBtZnQgcmVjb3JkIHRvICIKKwkJCQkiYWNjb21vZGF0ZSBleHRlbmRlZCBtZnQgZGF0YSBhdHRyaWJ1dGUgIgorCQkJCSJleHRlbnQuICBDYW5ub3QgaGFuZGxlIHRoaXMgeWV0LiIpOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJZ290byB1bmRvX2FsbG9jOworCX0KKwltcF9yZWJ1aWx0ID0gVFJVRTsKKwkvKiBHZW5lcmF0ZSB0aGUgbWFwcGluZyBwYWlycyBhcnJheSBkaXJlY3RseSBpbnRvIHRoZSBhdHRyIHJlY29yZC4gKi8KKwlyZXQgPSBudGZzX21hcHBpbmdfcGFpcnNfYnVpbGQodm9sLCAodTgqKWEgKworCQkJbGUxNl90b19jcHUoYS0+ZGF0YS5ub25fcmVzaWRlbnQubWFwcGluZ19wYWlyc19vZmZzZXQpLAorCQkJbXBfc2l6ZSwgcmwyLCBsbCwgTlVMTCk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGJ1aWxkIG1hcHBpbmcgcGFpcnMgYXJyYXkgb2YgIgorCQkJCSJtZnQgZGF0YSBhdHRyaWJ1dGUuIik7CisJCWdvdG8gdW5kb19hbGxvYzsKKwl9CisJLyogVXBkYXRlIHRoZSBoaWdoZXN0X3Zjbi4gKi8KKwlhLT5kYXRhLm5vbl9yZXNpZGVudC5oaWdoZXN0X3ZjbiA9IGNwdV90b19zbGU2NChybFsxXS52Y24gLSAxKTsKKwkvKgorCSAqIFdlIG5vdyBoYXZlIGV4dGVuZGVkIHRoZSBtZnQgZGF0YSBhbGxvY2F0ZWRfc2l6ZSBieSBuciBjbHVzdGVycy4KKwkgKiBSZWZsZWN0IHRoaXMgaW4gdGhlIG50ZnNfaW5vZGUgc3RydWN0dXJlIGFuZCB0aGUgYXR0cmlidXRlIHJlY29yZC4KKwkgKiBAcmwgaXMgdGhlIGxhc3QgKG5vbi10ZXJtaW5hdG9yKSBydW5saXN0IGVsZW1lbnQgb2YgbWZ0IGRhdGEKKwkgKiBhdHRyaWJ1dGUuCisJICovCisJaWYgKGEtPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKKwkJLyoKKwkJICogV2UgYXJlIG5vdCBpbiB0aGUgZmlyc3QgYXR0cmlidXRlIGV4dGVudCwgc3dpdGNoIHRvIGl0LCBidXQKKwkJICogZmlyc3QgZW5zdXJlIHRoZSBjaGFuZ2VzIHdpbGwgbWFrZSBpdCB0byBkaXNrIGxhdGVyLgorCQkgKi8KKwkJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKKwkJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOworCQludGZzX2F0dHJfcmVpbml0X3NlYXJjaF9jdHgoY3R4KTsKKwkJcmV0ID0gbnRmc19hdHRyX2xvb2t1cChtZnRfbmktPnR5cGUsIG1mdF9uaS0+bmFtZSwKKwkJCQltZnRfbmktPm5hbWVfbGVuLCBDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwgMCwKKwkJCQljdHgpOworCQlpZiAodW5saWtlbHkocmV0KSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbmQgZmlyc3QgYXR0cmlidXRlICIKKwkJCQkJImV4dGVudCBvZiBtZnQgZGF0YSBhdHRyaWJ1dGUuIik7CisJCQlnb3RvIHJlc3RvcmVfdW5kb19hbGxvYzsKKwkJfQorCQlhID0gY3R4LT5hdHRyOworCX0KKwltZnRfbmktPmFsbG9jYXRlZF9zaXplICs9IG5yIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CisJYS0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUgPQorCQkJY3B1X3RvX3NsZTY0KG1mdF9uaS0+YWxsb2NhdGVkX3NpemUpOworCS8qIEVuc3VyZSB0aGUgY2hhbmdlcyBtYWtlIGl0IHRvIGRpc2suICovCisJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKKwltYXJrX21mdF9yZWNvcmRfZGlydHkoY3R4LT5udGZzX2lubyk7CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChtZnRfbmkpOworCXVwX3dyaXRlKCZtZnRfbmktPnJ1bmxpc3QubG9jayk7CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKK3Jlc3RvcmVfdW5kb19hbGxvYzoKKwludGZzX2F0dHJfcmVpbml0X3NlYXJjaF9jdHgoY3R4KTsKKwlpZiAobnRmc19hdHRyX2xvb2t1cChtZnRfbmktPnR5cGUsIG1mdF9uaS0+bmFtZSwgbWZ0X25pLT5uYW1lX2xlbiwKKwkJCUNBU0VfU0VOU0lUSVZFLCBybFsxXS52Y24sIE5VTEwsIDAsIGN0eCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbmQgbGFzdCBhdHRyaWJ1dGUgZXh0ZW50IG9mICIKKwkJCQkibWZ0IGRhdGEgYXR0cmlidXRlLiVzIiwgZXMpOworCQltZnRfbmktPmFsbG9jYXRlZF9zaXplICs9IG5yIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCQl1bm1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJCXVwX3dyaXRlKCZtZnRfbmktPnJ1bmxpc3QubG9jayk7CisJCS8qCisJCSAqIFRoZSBvbmx5IHRoaW5nIHRoYXQgaXMgbm93IHdyb25nIGlzIC0+YWxsb2NhdGVkX3NpemUgb2YgdGhlCisJCSAqIGJhc2UgYXR0cmlidXRlIGV4dGVudCB3aGljaCBjaGtkc2sgc2hvdWxkIGJlIGFibGUgdG8gZml4LgorCQkgKi8KKwkJTlZvbFNldEVycm9ycyh2b2wpOworCQlyZXR1cm4gcmV0OworCX0KKwlhID0gY3R4LT5hdHRyOworCWEtPmRhdGEubm9uX3Jlc2lkZW50LmhpZ2hlc3RfdmNuID0gY3B1X3RvX3NsZTY0KG9sZF9sYXN0X3ZjbiAtIDEpOwordW5kb19hbGxvYzoKKwlpZiAobnRmc19jbHVzdGVyX2ZyZWUodm9sLT5tZnRfaW5vLCBvbGRfbGFzdF92Y24sIC0xKSA8IDApIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZyZWUgY2x1c3RlcnMgZnJvbSBtZnQgZGF0YSAiCisJCQkJImF0dHJpYnV0ZS4lcyIsIGVzKTsKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCX0KKwlpZiAobnRmc19ybF90cnVuY2F0ZV9ub2xvY2sodm9sLCAmbWZ0X25pLT5ydW5saXN0LCBvbGRfbGFzdF92Y24pKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byB0cnVuY2F0ZSBtZnQgZGF0YSBhdHRyaWJ1dGUgIgorCQkJCSJydW5saXN0LiVzIiwgZXMpOworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQorCWlmIChtcF9yZWJ1aWx0KSB7CisJCWlmIChudGZzX21hcHBpbmdfcGFpcnNfYnVpbGQodm9sLCAodTgqKWEgKyBsZTE2X3RvX2NwdSgKKwkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCksCisJCQkJb2xkX2FsZW4gLSBsZTE2X3RvX2NwdSgKKwkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCksCisJCQkJcmwyLCBsbCwgTlVMTCkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByZXN0b3JlIG1hcHBpbmcgcGFpcnMgIgorCQkJCQkiYXJyYXkuJXMiLCBlcyk7CisJCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCX0KKwkJaWYgKG50ZnNfYXR0cl9yZWNvcmRfcmVzaXplKGN0eC0+bXJlYywgYSwgb2xkX2FsZW4pKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gcmVzdG9yZSBhdHRyaWJ1dGUgIgorCQkJCQkicmVjb3JkLiVzIiwgZXMpOworCQkJTlZvbFNldEVycm9ycyh2b2wpOworCQl9CisJCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CisJCW1hcmtfbWZ0X3JlY29yZF9kaXJ0eShjdHgtPm50ZnNfaW5vKTsKKwl9CisJaWYgKGN0eCkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJaWYgKCFJU19FUlIobXJlYykpCisJCXVubWFwX21mdF9yZWNvcmQobWZ0X25pKTsKKwl1cF93cml0ZSgmbWZ0X25pLT5ydW5saXN0LmxvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogbnRmc19tZnRfcmVjb3JkX2xheW91dCAtIGxheW91dCBhbiBtZnQgcmVjb3JkIGludG8gYSBtZW1vcnkgYnVmZmVyCisgKiBAdm9sOgl2b2x1bWUgdG8gd2hpY2ggdGhlIG1mdCByZWNvcmQgd2lsbCBiZWxvbmcKKyAqIEBtZnRfbm86CW1mdCByZWZlcmVuY2Ugc3BlY2lmeWluZyB0aGUgbWZ0IHJlY29yZCBudW1iZXIKKyAqIEBtOgkJZGVzdGluYXRpb24gYnVmZmVyIG9mIHNpemUgPj0gQHZvbC0+bWZ0X3JlY29yZF9zaXplIGJ5dGVzCisgKgorICogTGF5b3V0IGFuIGVtcHR5LCB1bnVzZWQgbWZ0IHJlY29yZCB3aXRoIHRoZSBtZnQgcmVjb3JkIG51bWJlciBAbWZ0X25vIGludG8KKyAqIHRoZSBidWZmZXIgQG0uICBUaGUgdm9sdW1lIEB2b2wgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIG1mdCByZWNvcmQgc3RydWN0dXJlCisgKiB3YXMgbW9kaWZpZWQgaW4gTlRGUyAzLjEgc28gd2UgbmVlZCB0byBrbm93IHdoaWNoIHZvbHVtZSB2ZXJzaW9uIHRoaXMgbWZ0CisgKiByZWNvcmQgd2lsbCBiZSB1c2VkIG9uLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqLworc3RhdGljIGludCBudGZzX21mdF9yZWNvcmRfbGF5b3V0KGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsIGNvbnN0IHM2NCBtZnRfbm8sCisJCU1GVF9SRUNPUkQgKm0pCit7CisJQVRUUl9SRUNPUkQgKmE7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgbWZ0IHJlY29yZCAweCVsbHguIiwgKGxvbmcgbG9uZyltZnRfbm8pOworCWlmIChtZnRfbm8gPj0gKDFsbCA8PCAzMikpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiTWZ0IHJlY29yZCBudW1iZXIgMHglbGx4IGV4Y2VlZHMgIgorCQkJCSJtYXhpbXVtIG9mIDJeMzIuIiwgKGxvbmcgbG9uZyltZnRfbm8pOworCQlyZXR1cm4gLUVSQU5HRTsKKwl9CisJLyogU3RhcnQgYnkgY2xlYXJpbmcgdGhlIHdob2xlIG1mdCByZWNvcmQgdG8gZ2l2ZXMgdXMgYSBjbGVhbiBzbGF0ZS4gKi8KKwltZW1zZXQobSwgMCwgdm9sLT5tZnRfcmVjb3JkX3NpemUpOworCS8qIEFsaWduZWQgdG8gMi1ieXRlIGJvdW5kYXJ5LiAqLworCWlmICh2b2wtPm1ham9yX3ZlciA8IDMgfHwgKHZvbC0+bWFqb3JfdmVyID09IDMgJiYgIXZvbC0+bWlub3JfdmVyKSkKKwkJbS0+dXNhX29mcyA9IGNwdV90b19sZTE2KChzaXplb2YoTUZUX1JFQ09SRF9PTEQpICsgMSkgJiB+MSk7CisJZWxzZSB7CisJCW0tPnVzYV9vZnMgPSBjcHVfdG9fbGUxNigoc2l6ZW9mKE1GVF9SRUNPUkQpICsgMSkgJiB+MSk7CisJCS8qCisJCSAqIFNldCB0aGUgTlRGUyAzLjErIHNwZWNpZmljIGZpZWxkcyB3aGlsZSB3ZSBrbm93IHRoYXQgdGhlCisJCSAqIHZvbHVtZSB2ZXJzaW9uIGlzIDMuMSsuCisJCSAqLworCQltLT5yZXNlcnZlZCA9IDA7CisJCW0tPm1mdF9yZWNvcmRfbnVtYmVyID0gY3B1X3RvX2xlMzIoKHUzMiltZnRfbm8pOworCX0KKwltLT5tYWdpYyA9IG1hZ2ljX0ZJTEU7CisJaWYgKHZvbC0+bWZ0X3JlY29yZF9zaXplID49IE5URlNfQkxPQ0tfU0laRSkKKwkJbS0+dXNhX2NvdW50ID0gY3B1X3RvX2xlMTYodm9sLT5tZnRfcmVjb3JkX3NpemUgLworCQkJCU5URlNfQkxPQ0tfU0laRSArIDEpOworCWVsc2UgeworCQltLT51c2FfY291bnQgPSBjcHVfdG9fbGUxNigxKTsKKwkJbnRmc193YXJuaW5nKHZvbC0+c2IsICJTZWN0b3Igc2l6ZSBpcyBiaWdnZXIgdGhhbiBtZnQgcmVjb3JkICIKKwkJCQkic2l6ZS4gIFNldHRpbmcgdXNhX2NvdW50IHRvIDEuICBJZiBjaGtkc2sgIgorCQkJCSJyZXBvcnRzIHRoaXMgYXMgY29ycnVwdGlvbiwgcGxlYXNlIGVtYWlsICIKKwkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuc291cmNlZm9yZ2UubmV0IHN0YXRpbmcgIgorCQkJCSJ0aGF0IHlvdSBzYXcgdGhpcyBtZXNzYWdlIGFuZCB0aGF0IHRoZSAiCisJCQkJIm1vZGlmaWVkIGZpbGUgc3lzdGVtIGNyZWF0ZWQgd2FzIGNvcnJ1cHQuICAiCisJCQkJIlRoYW5rIHlvdS4iKTsKKwl9CisJLyogU2V0IHRoZSB1cGRhdGUgc2VxdWVuY2UgbnVtYmVyIHRvIDEuICovCisJKihsZTE2KikoKHU4KiltICsgbGUxNl90b19jcHUobS0+dXNhX29mcykpID0gY3B1X3RvX2xlMTYoMSk7CisJbS0+bHNuID0gMDsKKwltLT5zZXF1ZW5jZV9udW1iZXIgPSBjcHVfdG9fbGUxNigxKTsKKwltLT5saW5rX2NvdW50ID0gMDsKKwkvKgorCSAqIFBsYWNlIHRoZSBhdHRyaWJ1dGVzIHN0cmFpZ2h0IGFmdGVyIHRoZSB1cGRhdGUgc2VxdWVuY2UgYXJyYXksCisJICogYWxpZ25lZCB0byA4LWJ5dGUgYm91bmRhcnkuCisJICovCisJbS0+YXR0cnNfb2Zmc2V0ID0gY3B1X3RvX2xlMTYoKGxlMTZfdG9fY3B1KG0tPnVzYV9vZnMpICsKKwkJCShsZTE2X3RvX2NwdShtLT51c2FfY291bnQpIDw8IDEpICsgNykgJiB+Nyk7CisJbS0+ZmxhZ3MgPSAwOworCS8qCisJICogVXNpbmcgYXR0cnNfb2Zmc2V0IHBsdXMgZWlnaHQgYnl0ZXMgKGZvciB0aGUgdGVybWluYXRpb24gYXR0cmlidXRlKS4KKwkgKiBhdHRyc19vZmZzZXQgaXMgYWxyZWFkeSBhbGlnbmVkIHRvIDgtYnl0ZSBib3VuZGFyeSwgc28gbm8gbmVlZCB0bworCSAqIGFsaWduIGFnYWluLgorCSAqLworCW0tPmJ5dGVzX2luX3VzZSA9IGNwdV90b19sZTMyKGxlMTZfdG9fY3B1KG0tPmF0dHJzX29mZnNldCkgKyA4KTsKKwltLT5ieXRlc19hbGxvY2F0ZWQgPSBjcHVfdG9fbGUzMih2b2wtPm1mdF9yZWNvcmRfc2l6ZSk7CisJbS0+YmFzZV9tZnRfcmVjb3JkID0gMDsKKwltLT5uZXh0X2F0dHJfaW5zdGFuY2UgPSAwOworCS8qIEFkZCB0aGUgdGVybWluYXRpb24gYXR0cmlidXRlLiAqLworCWEgPSAoQVRUUl9SRUNPUkQqKSgodTgqKW0gKyBsZTE2X3RvX2NwdShtLT5hdHRyc19vZmZzZXQpKTsKKwlhLT50eXBlID0gQVRfRU5EOworCWEtPmxlbmd0aCA9IDA7CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBudGZzX21mdF9yZWNvcmRfZm9ybWF0IC0gZm9ybWF0IGFuIG1mdCByZWNvcmQgb24gYW4gbnRmcyB2b2x1bWUKKyAqIEB2b2w6CXZvbHVtZSBvbiB3aGljaCB0byBmb3JtYXQgdGhlIG1mdCByZWNvcmQKKyAqIEBtZnRfbm86CW1mdCByZWNvcmQgbnVtYmVyIHRvIGZvcm1hdAorICoKKyAqIEZvcm1hdCB0aGUgbWZ0IHJlY29yZCBAbWZ0X25vIGluICRNRlQvJERBVEEsIGkuZS4gbGF5IG91dCBhbiBlbXB0eSwgdW51c2VkCisgKiBtZnQgcmVjb3JkIGludG8gdGhlIGFwcHJvcHJpYXRlIHBsYWNlIG9mIHRoZSBtZnQgZGF0YSBhdHRyaWJ1dGUuICBUaGlzIGlzCisgKiB1c2VkIHdoZW4gZXh0ZW5kaW5nIHRoZSBtZnQgZGF0YSBhdHRyaWJ1dGUuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50IG50ZnNfbWZ0X3JlY29yZF9mb3JtYXQoY29uc3QgbnRmc192b2x1bWUgKnZvbCwgY29uc3QgczY0IG1mdF9ubykKK3sKKwlzdHJ1Y3QgaW5vZGUgKm1mdF92aSA9IHZvbC0+bWZ0X2lubzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlNRlRfUkVDT1JEICptOworCXBnb2ZmX3QgaW5kZXgsIGVuZF9pbmRleDsKKwl1bnNpZ25lZCBpbnQgb2ZzOworCWludCBlcnI7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgbWZ0IHJlY29yZCAweCVsbHguIiwgKGxvbmcgbG9uZyltZnRfbm8pOworCS8qCisJICogVGhlIGluZGV4IGludG8gdGhlIHBhZ2UgY2FjaGUgYW5kIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBwYWdlIGNhY2hlCisJICogcGFnZSBvZiB0aGUgd2FudGVkIG1mdCByZWNvcmQuCisJICovCisJaW5kZXggPSBtZnRfbm8gPDwgdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cyA+PiBQQUdFX0NBQ0hFX1NISUZUOworCW9mcyA9IChtZnRfbm8gPDwgdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cykgJiB+UEFHRV9DQUNIRV9NQVNLOworCS8qIFRoZSBtYXhpbXVtIHZhbGlkIGluZGV4IGludG8gdGhlIHBhZ2UgY2FjaGUgZm9yICRNRlQncyBkYXRhLiAqLworCWVuZF9pbmRleCA9IG1mdF92aS0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaWYgKHVubGlrZWx5KGluZGV4ID49IGVuZF9pbmRleCkpIHsKKwkJaWYgKHVubGlrZWx5KGluZGV4ID4gZW5kX2luZGV4IHx8IG9mcyArIHZvbC0+bWZ0X3JlY29yZF9zaXplID49CisJCQkJKG1mdF92aS0+aV9zaXplICYgflBBR0VfQ0FDSEVfTUFTSykpKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJUcmllZCB0byBmb3JtYXQgbm9uLWV4aXN0aW5nIG1mdCAiCisJCQkJCSJyZWNvcmQgMHglbGx4LiIsIChsb25nIGxvbmcpbWZ0X25vKTsKKwkJCXJldHVybiAtRU5PRU5UOworCQl9CisJfQorCS8qIFJlYWQsIG1hcCwgYW5kIHBpbiB0aGUgcGFnZSBjb250YWluaW5nIHRoZSBtZnQgcmVjb3JkLiAqLworCXBhZ2UgPSBudGZzX21hcF9wYWdlKG1mdF92aS0+aV9tYXBwaW5nLCBpbmRleCk7CisJaWYgKHVubGlrZWx5KElTX0VSUihwYWdlKSkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIG1hcCBwYWdlIGNvbnRhaW5pbmcgbWZ0IHJlY29yZCAiCisJCQkJInRvIGZvcm1hdCAweCVsbHguIiwgKGxvbmcgbG9uZyltZnRfbm8pOworCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKKwl9CisJbG9ja19wYWdlKHBhZ2UpOworCUJVR19PTighUGFnZVVwdG9kYXRlKHBhZ2UpKTsKKwlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKKwltID0gKE1GVF9SRUNPUkQqKSgodTgqKXBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mcyk7CisJZXJyID0gbnRmc19tZnRfcmVjb3JkX2xheW91dCh2b2wsIG1mdF9ubywgbSk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGxheW91dCBtZnQgcmVjb3JkIDB4JWxseC4iLAorCQkJCShsb25nIGxvbmcpbWZ0X25vKTsKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQlyZXR1cm4gZXJyOworCX0KKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIG1mdCByZWNvcmQgaXMgd3JpdHRlbiBvdXQgdG8gZGlzay4gIFdlIGNvdWxkIHVzZQorCSAqIGlsb29rdXA1KCkgdG8gY2hlY2sgaWYgYW4gaW5vZGUgaXMgaW4gaWNhY2hlIGFuZCBzbyBvbiBidXQgdGhpcyBpcworCSAqIHVubmVjZXNzYXJ5IGFzIG50ZnNfd3JpdGVwYWdlKCkgd2lsbCB3cml0ZSB0aGUgZGlydHkgcmVjb3JkIGFueXdheS4KKwkgKi8KKwltYXJrX250ZnNfcmVjb3JkX2RpcnR5KHBhZ2UsIG9mcyk7CisJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbnRmc19tZnRfcmVjb3JkX2FsbG9jIC0gYWxsb2NhdGUgYW4gbWZ0IHJlY29yZCBvbiBhbiBudGZzIHZvbHVtZQorICogQHZvbDoJW0lOXSAgdm9sdW1lIG9uIHdoaWNoIHRvIGFsbG9jYXRlIHRoZSBtZnQgcmVjb3JkCisgKiBAbW9kZToJW0lOXSAgbW9kZSBpZiB3YW50IGEgZmlsZSBvciBkaXJlY3RvcnksIGkuZS4gYmFzZSBpbm9kZSBvciAwCisgKiBAYmFzZV9uaToJW0lOXSAgb3BlbiBiYXNlIGlub2RlIGlmIGFsbG9jYXRpbmcgYW4gZXh0ZW50IG1mdCByZWNvcmQgb3IgTlVMTAorICogQG1yZWM6CVtPVVRdIG9uIHN1Y2Nlc3NmdWwgcmV0dXJuIHRoaXMgaXMgdGhlIG1hcHBlZCBtZnQgcmVjb3JkCisgKgorICogQWxsb2NhdGUgYW4gbWZ0IHJlY29yZCBpbiAkTUZULyREQVRBIG9mIGFuIG9wZW4gbnRmcyB2b2x1bWUgQHZvbC4KKyAqCisgKiBJZiBAYmFzZV9uaSBpcyBOVUxMIG1ha2UgdGhlIG1mdCByZWNvcmQgYSBiYXNlIG1mdCByZWNvcmQsIGkuZS4gYSBmaWxlIG9yCisgKiBkaXJldmN0b3J5IGlub2RlLCBhbmQgYWxsb2NhdGUgaXQgYXQgdGhlIGRlZmF1bHQgYWxsb2NhdG9yIHBvc2l0aW9uLiAgSW4KKyAqIHRoaXMgY2FzZSBAbW9kZSBpcyB0aGUgZmlsZSBtb2RlIGFzIGdpdmVuIHRvIHVzIGJ5IHRoZSBjYWxsZXIuICBXZSBpbgorICogcGFydGljdWxhciB1c2UgQG1vZGUgdG8gZGlzdGluZ3Vpc2ggd2hldGhlciBhIGZpbGUgb3IgYSBkaXJlY3RvcnkgaXMgYmVpbmcKKyAqIGNyZWF0ZWQgKFNfSUZESVIobW9kZSkgYW5kIFNfSUZSRUcobW9kZSksIHJlc3BlY3RpdmVseSkuCisgKgorICogSWYgQGJhc2VfbmkgaXMgbm90IE5VTEwgbWFrZSB0aGUgYWxsb2NhdGVkIG1mdCByZWNvcmQgYW4gZXh0ZW50IHJlY29yZCwKKyAqIGFsbG9jYXRlIGl0IHN0YXJ0aW5nIGF0IHRoZSBtZnQgcmVjb3JkIGFmdGVyIHRoZSBiYXNlIG1mdCByZWNvcmQgYW5kIGF0dGFjaAorICogdGhlIGFsbG9jYXRlZCBhbmQgb3BlbmVkIG50ZnMgaW5vZGUgdG8gdGhlIGJhc2UgaW5vZGUgQGJhc2VfbmkuICBJbiB0aGlzCisgKiBjYXNlIEBtb2RlIG11c3QgYmUgMCBhcyBpdCBpcyBtZWFuaW5nbGVzcyBmb3IgZXh0ZW50IGlub2Rlcy4KKyAqCisgKiBZb3UgbmVlZCB0byBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIHdpdGggSVNfRVJSKCkuICBJZiBmYWxzZSwgdGhlIGZ1bmN0aW9uCisgKiB3YXMgc3VjY2Vzc2Z1bCBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbm93IG9wZW5lZCBudGZzIGlub2RlIG9mIHRoZQorICogYWxsb2NhdGVkIG1mdCByZWNvcmQuICAqQG1yZWMgaXMgdGhlbiBzZXQgdG8gdGhlIGFsbG9jYXRlZCwgbWFwcGVkLCBwaW5uZWQsCisgKiBhbmQgbG9ja2VkIG1mdCByZWNvcmQuICBJZiBJU19FUlIoKSBpcyB0cnVlLCB0aGUgZnVuY3Rpb24gZmFpbGVkIGFuZCB0aGUKKyAqIGVycm9yIGNvZGUgaXMgb2J0YWluZWQgZnJvbSBQVFJfRVJSKHJldHVybiB2YWx1ZSkuICAqQG1yZWMgaXMgdW5kZWZpbmVkIGluCisgKiB0aGlzIGNhc2UuCisgKgorICogQWxsb2NhdGlvbiBzdHJhdGVneToKKyAqCisgKiBUbyBmaW5kIGEgZnJlZSBtZnQgcmVjb3JkLCB3ZSBzY2FuIHRoZSBtZnQgYml0bWFwIGZvciBhIHplcm8gYml0LiAgVG8KKyAqIG9wdGltaXplIHRoaXMgd2Ugc3RhcnQgc2Nhbm5pbmcgYXQgdGhlIHBsYWNlIHNwZWNpZmllZCBieSBAYmFzZV9uaSBvciBpZgorICogQGJhc2VfbmkgaXMgTlVMTCB3ZSBzdGFydCB3aGVyZSB3ZSBsYXN0IHN0b3BwZWQgYW5kIHdlIHBlcmZvcm0gd3JhcCBhcm91bmQKKyAqIHdoZW4gd2UgcmVhY2ggdGhlIGVuZC4gIE5vdGUsIHdlIGRvIG5vdCB0cnkgdG8gYWxsb2NhdGUgbWZ0IHJlY29yZHMgYmVsb3cKKyAqIG51bWJlciAyNCBiZWNhdXNlIG51bWJlcnMgMCB0byAxNSBhcmUgdGhlIGRlZmluZWQgc3lzdGVtIGZpbGVzIGFueXdheSBhbmQgMTYKKyAqIHRvIDI0IGFyZSBzcGVjaWFsIGluIHRoYXQgdGhleSBhcmUgdXNlZCBmb3Igc3RvcmluZyBleHRlbnNpb24gbWZ0IHJlY29yZHMKKyAqIGZvciB0aGUgJERBVEEgYXR0cmlidXRlIG9mICRNRlQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIGF2b2lkIHRoZSBwb3NzaWJpbGl0eQorICogb2YgY3JlYXRpbmcgYSBydW5saXN0IHdpdGggYSBjaXJjdWxhciBkZXBlbmRlbmN5IHdoaWNoIG9uY2Ugd3JpdHRlbiB0byBkaXNrCisgKiBjYW4gbmV2ZXIgYmUgcmVhZCBpbiBhZ2Fpbi4gIFdpbmRvd3Mgd2lsbCBvbmx5IHVzZSByZWNvcmRzIDE2IHRvIDI0IGZvcgorICogbm9ybWFsIGZpbGVzIGlmIHRoZSB2b2x1bWUgaXMgY29tcGxldGVseSBvdXQgb2Ygc3BhY2UuICBXZSBuZXZlciB1c2UgdGhlbQorICogd2hpY2ggbWVhbnMgdGhhdCB3aGVuIHRoZSB2b2x1bWUgaXMgcmVhbGx5IG91dCBvZiBzcGFjZSB3ZSBjYW5ub3QgY3JlYXRlIGFueQorICogbW9yZSBmaWxlcyB3aGlsZSBXaW5kb3dzIGNhbiBzdGlsbCBjcmVhdGUgdXAgdG8gOCBzbWFsbCBmaWxlcy4gIFdlIGNhbiBzdGFydAorICogZG9pbmcgdGhpcyBhdCBzb21lIGxhdGVyIHRpbWUsIGl0IGRvZXMgbm90IG1hdHRlciBtdWNoIGZvciBub3cuCisgKgorICogV2hlbiBzY2FubmluZyB0aGUgbWZ0IGJpdG1hcCwgd2Ugb25seSBzZWFyY2ggdXAgdG8gdGhlIGxhc3QgYWxsb2NhdGVkIG1mdAorICogcmVjb3JkLiAgSWYgdGhlcmUgYXJlIG5vIGZyZWUgcmVjb3JkcyBsZWZ0IGluIHRoZSByYW5nZSAyNCB0byBudW1iZXIgb2YKKyAqIGFsbG9jYXRlZCBtZnQgcmVjb3JkcywgdGhlbiB3ZSBleHRlbmQgdGhlICRNRlQvJERBVEEgYXR0cmlidXRlIGluIG9yZGVyIHRvCisgKiBjcmVhdGUgZnJlZSBtZnQgcmVjb3Jkcy4gIFdlIGV4dGVuZCB0aGUgYWxsb2NhdGVkIHNpemUgb2YgJE1GVC8kREFUQSBieSAxNgorICogcmVjb3JkcyBhdCBhIHRpbWUgb3Igb25lIGNsdXN0ZXIsIGlmIGNsdXN0ZXIgc2l6ZSBpcyBhYm92ZSAxNmtpQi4gIElmIHRoZXJlCisgKiBpcyBub3Qgc3VmZmljaWVudCBzcGFjZSB0byBkbyB0aGlzLCB3ZSB0cnkgdG8gZXh0ZW5kIGJ5IGEgc2luZ2xlIG1mdCByZWNvcmQKKyAqIG9yIG9uZSBjbHVzdGVyLCBpZiBjbHVzdGVyIHNpemUgaXMgYWJvdmUgdGhlIG1mdCByZWNvcmQgc2l6ZS4KKyAqCisgKiBObyBtYXR0ZXIgaG93IG1hbnkgbWZ0IHJlY29yZHMgd2UgYWxsb2NhdGUsIHdlIGluaXRpYWxpemUgb25seSB0aGUgZmlyc3QKKyAqIGFsbG9jYXRlZCBtZnQgcmVjb3JkLCBpbmNyZW1lbnRpbmcgbWZ0IGRhdGEgc2l6ZSBhbmQgaW5pdGlhbGl6ZWQgc2l6ZQorICogYWNjb3JkaW5nbHksIG9wZW4gYW4gbnRmc19pbm9kZSBmb3IgaXQgYW5kIHJldHVybiBpdCB0byB0aGUgY2FsbGVyLCB1bmxlc3MKKyAqIHRoZXJlIGFyZSBsZXNzIHRoYW4gMjQgbWZ0IHJlY29yZHMsIGluIHdoaWNoIGNhc2Ugd2UgYWxsb2NhdGUgYW5kIGluaXRpYWxpemUKKyAqIG1mdCByZWNvcmRzIHVudGlsIHdlIHJlYWNoIHJlY29yZCAyNCB3aGljaCB3ZSBjb25zaWRlciBhcyB0aGUgZmlyc3QgZnJlZSBtZnQKKyAqIHJlY29yZCBmb3IgdXNlIGJ5IG5vcm1hbCBmaWxlcy4KKyAqCisgKiBJZiBkdXJpbmcgYW55IHN0YWdlIHdlIG92ZXJmbG93IHRoZSBpbml0aWFsaXplZCBkYXRhIGluIHRoZSBtZnQgYml0bWFwLCB3ZQorICogZXh0ZW5kIHRoZSBpbml0aWFsaXplZCBzaXplIChhbmQgZGF0YSBzaXplKSBieSA4IGJ5dGVzLCBhbGxvY2F0aW5nIGFub3RoZXIKKyAqIGNsdXN0ZXIgaWYgcmVxdWlyZWQuICBUaGUgYml0bWFwIGRhdGEgc2l6ZSBoYXMgdG8gYmUgYXQgbGVhc3QgZXF1YWwgdG8gdGhlCisgKiBudW1iZXIgb2YgbWZ0IHJlY29yZHMgaW4gdGhlIG1mdCwgYnV0IGl0IGNhbiBiZSBiaWdnZXIsIGluIHdoaWNoIGNhc2UgdGhlCisgKiBzdXBlcmZsb3VzIGJpdHMgYXJlIHBhZGRlZCB3aXRoIHplcm9lcy4KKyAqCisgKiBUaHVzLCB3aGVuIHdlIHJldHVybiBzdWNjZXNzZnVsbHkgKElTX0VSUigpIGlzIGZhbHNlKSwgd2Ugd2lsbCBoYXZlOgorICoJLSBpbml0aWFsaXplZCAvIGV4dGVuZGVkIHRoZSBtZnQgYml0bWFwIGlmIG5lY2Vzc2FyeSwKKyAqCS0gaW5pdGlhbGl6ZWQgLyBleHRlbmRlZCB0aGUgbWZ0IGRhdGEgaWYgbmVjZXNzYXJ5LAorICoJLSBzZXQgdGhlIGJpdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBtZnQgcmVjb3JkIGJlaW5nIGFsbG9jYXRlZCBpbiB0aGUKKyAqCSAgbWZ0IGJpdG1hcCwKKyAqCS0gb3BlbmVkIGFuIG50ZnNfaW5vZGUgZm9yIHRoZSBhbGxvY2F0ZWQgbWZ0IHJlY29yZCwgYW5kIHdlIHdpbGwgaGF2ZQorICoJLSByZXR1cm5lZCB0aGUgbnRmc19pbm9kZSBhcyB3ZWxsIGFzIHRoZSBhbGxvY2F0ZWQgbWFwcGVkLCBwaW5uZWQsIGFuZAorICoJICBsb2NrZWQgbWZ0IHJlY29yZC4KKyAqCisgKiBPbiBlcnJvciwgdGhlIHZvbHVtZSB3aWxsIGJlIGxlZnQgaW4gYSBjb25zaXN0ZW50IHN0YXRlIGFuZCBubyByZWNvcmQgd2lsbAorICogYmUgYWxsb2NhdGVkLiAgSWYgcm9sbGluZyBiYWNrIGEgcGFydGlhbCBvcGVyYXRpb24gZmFpbHMsIHdlIG1heSBsZWF2ZSBzb21lCisgKiBpbmNvbnNpc3RlbnQgbWV0YWRhdGEgaW4gd2hpY2ggY2FzZSB3ZSBzZXQgTlZvbEVycm9ycygpIHNvIHRoZSB2b2x1bWUgaXMKKyAqIGxlZnQgZGlydHkgd2hlbiB1bm1vdW50ZWQuCisgKgorICogTm90ZSwgdGhpcyBmdW5jdGlvbiBjYW5ub3QgbWFrZSB1c2Ugb2YgbW9zdCBvZiB0aGUgbm9ybWFsIGZ1bmN0aW9ucywgbGlrZQorICogZm9yIGV4YW1wbGUgZm9yIGF0dHJpYnV0ZSByZXNpemluZywgZXRjLCBiZWNhdXNlIHdoZW4gdGhlIHJ1biBsaXN0IG92ZXJmbG93cworICogdGhlIGJhc2UgbWZ0IHJlY29yZCBhbmQgYW4gYXR0cmlidXRlIGxpc3QgaXMgdXNlZCwgaXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdAorICogdGhlIGV4dGVuc2lvbiBtZnQgcmVjb3JkcyB1c2VkIHRvIHN0b3JlIHRoZSAkREFUQSBhdHRyaWJ1dGUgb2YgJE1GVCBjYW4gYmUKKyAqIHJlYWNoZWQgd2l0aG91dCBoYXZpbmcgdG8gcmVhZCB0aGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGluc2lkZSB0aGVtLCBhcworICogdGhpcyB3b3VsZCBtYWtlIGl0IGltcG9zc2libGUgdG8gZmluZCB0aGVtIGluIHRoZSBmaXJzdCBwbGFjZSBhZnRlciB0aGUKKyAqIHZvbHVtZSBpcyB1bm1vdW50ZWQuICAkTUZULyRCSVRNQVAgcHJvYmFibHkgZG9lcyBub3QgbmVlZCB0byBmb2xsb3cgdGhpcworICogcnVsZSBiZWNhdXNlIHRoZSBiaXRtYXAgaXMgbm90IGVzc2VudGlhbCBmb3IgZmluZGluZyB0aGUgbWZ0IHJlY29yZHMsIGJ1dCBvbgorICogdGhlIG90aGVyIGhhbmQsIGhhbmRsaW5nIHRoZSBiaXRtYXAgaW4gdGhpcyBzcGVjaWFsIHdheSB3b3VsZCBtYWtlIGxpZmUKKyAqIGVhc2llciBiZWNhdXNlIG90aGVyd2lzZSB0aGVyZSBtaWdodCBiZSBjaXJjdWxhciBpbnZvY2F0aW9ucyBvZiBmdW5jdGlvbnMKKyAqIHdoZW4gcmVhZGluZyB0aGUgYml0bWFwLgorICovCitudGZzX2lub2RlICpudGZzX21mdF9yZWNvcmRfYWxsb2MobnRmc192b2x1bWUgKnZvbCwgY29uc3QgaW50IG1vZGUsCisJCW50ZnNfaW5vZGUgKmJhc2VfbmksIE1GVF9SRUNPUkQgKiptcmVjKQoreworCXM2NCBsbCwgYml0LCBvbGRfZGF0YV9pbml0aWFsaXplZCwgb2xkX2RhdGFfc2l6ZTsKKwlzdHJ1Y3QgaW5vZGUgKnZpOworCXN0cnVjdCBwYWdlICpwYWdlOworCW50ZnNfaW5vZGUgKm1mdF9uaSwgKm1mdGJtcF9uaSwgKm5pOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJTUZUX1JFQ09SRCAqbTsKKwlBVFRSX1JFQ09SRCAqYTsKKwlwZ29mZl90IGluZGV4OworCXVuc2lnbmVkIGludCBvZnM7CisJaW50IGVycjsKKwlsZTE2IHNlcV9ubywgdXNuOworCUJPT0wgcmVjb3JkX2Zvcm1hdHRlZCA9IEZBTFNFOworCisJaWYgKGJhc2VfbmkpIHsKKwkJbnRmc19kZWJ1ZygiRW50ZXJpbmcgKGFsbG9jYXRpbmcgYW4gZXh0ZW50IG1mdCByZWNvcmQgZm9yICIKKwkJCQkiYmFzZSBtZnQgcmVjb3JkIDB4JWxseCkuIiwKKwkJCQkobG9uZyBsb25nKWJhc2VfbmktPm1mdF9ubyk7CisJCS8qIEBtb2RlIGFuZCBAYmFzZV9uaSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAqLworCQlCVUdfT04obW9kZSk7CisJfSBlbHNlCisJCW50ZnNfZGVidWcoIkVudGVyaW5nIChhbGxvY2F0aW5nIGEgYmFzZSBtZnQgcmVjb3JkKS4iKTsKKwlpZiAobW9kZSkgeworCQkvKiBAbW9kZSBhbmQgQGJhc2VfbmkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gKi8KKwkJQlVHX09OKGJhc2VfbmkpOworCQkvKiBXZSBvbmx5IHN1cHBvcnQgY3JlYXRpb24gb2Ygbm9ybWFsIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4gKi8KKwkJaWYgKCFTX0lTUkVHKG1vZGUpICYmICFTX0lTRElSKG1vZGUpKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApOworCX0KKwlCVUdfT04oIW1yZWMpOworCW1mdF9uaSA9IE5URlNfSSh2b2wtPm1mdF9pbm8pOworCW1mdGJtcF9uaSA9IE5URlNfSSh2b2wtPm1mdGJtcF9pbm8pOworCWRvd25fd3JpdGUoJnZvbC0+bWZ0Ym1wX2xvY2spOworCWJpdCA9IG50ZnNfbWZ0X2JpdG1hcF9maW5kX2FuZF9hbGxvY19mcmVlX3JlY19ub2xvY2sodm9sLCBiYXNlX25pKTsKKwlpZiAoYml0ID49IDApIHsKKwkJbnRmc19kZWJ1ZygiRm91bmQgYW5kIGFsbG9jYXRlZCBmcmVlIHJlY29yZCAoIzEpLCBiaXQgMHglbGx4LiIsCisJCQkJKGxvbmcgbG9uZyliaXQpOworCQlnb3RvIGhhdmVfYWxsb2NfcmVjOworCX0KKwlpZiAoYml0ICE9IC1FTk9TUEMpIHsKKwkJdXBfd3JpdGUoJnZvbC0+bWZ0Ym1wX2xvY2spOworCQlyZXR1cm4gRVJSX1BUUihiaXQpOworCX0KKwkvKgorCSAqIE5vIGZyZWUgbWZ0IHJlY29yZHMgbGVmdC4gIElmIHRoZSBtZnQgYml0bWFwIGFscmVhZHkgY292ZXJzIG1vcmUKKwkgKiB0aGFuIHRoZSBjdXJyZW50bHkgdXNlZCBtZnQgcmVjb3JkcywgdGhlIG5leHQgcmVjb3JkcyBhcmUgYWxsIGZyZWUsCisJICogc28gd2UgY2FuIHNpbXBseSBhbGxvY2F0ZSB0aGUgZmlyc3QgdW51c2VkIG1mdCByZWNvcmQuCisJICogTm90ZTogV2UgYWxzbyBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBtZnQgYml0bWFwIGF0IGxlYXN0IGNvdmVycworCSAqIHRoZSBmaXJzdCAyNCBtZnQgcmVjb3JkcyBhcyB0aGV5IGFyZSBzcGVjaWFsIGFuZCB3aGlsc3QgdGhleSBtYXkgbm90CisJICogYmUgaW4gdXNlLCB3ZSBkbyBub3QgYWxsb2NhdGUgZnJvbSB0aGVtLgorCSAqLworCWxsID0gbWZ0X25pLT5pbml0aWFsaXplZF9zaXplID4+IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHM7CisJaWYgKG1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSA8PCAzID4gbGwgJiYKKwkJCW1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSA+IDMpIHsKKwkJYml0ID0gbGw7CisJCWlmIChiaXQgPCAyNCkKKwkJCWJpdCA9IDI0OworCQlpZiAodW5saWtlbHkoYml0ID49ICgxbGwgPDwgMzIpKSkKKwkJCWdvdG8gbWF4X2Vycl9vdXQ7CisJCW50ZnNfZGVidWcoIkZvdW5kIGZyZWUgcmVjb3JkICgjMiksIGJpdCAweCVsbHguIiwKKwkJCQkobG9uZyBsb25nKWJpdCk7CisJCWdvdG8gZm91bmRfZnJlZV9yZWM7CisJfQorCS8qCisJICogVGhlIG1mdCBiaXRtYXAgbmVlZHMgdG8gYmUgZXhwYW5kZWQgdW50aWwgaXQgY292ZXJzIHRoZSBmaXJzdCB1bnVzZWQKKwkgKiBtZnQgcmVjb3JkIHRoYXQgd2UgY2FuIGFsbG9jYXRlLgorCSAqIE5vdGU6IFRoZSBzbWFsbGVzdCBtZnQgcmVjb3JkIHdlIGFsbG9jYXRlIGlzIG1mdCByZWNvcmQgMjQuCisJICovCisJYml0ID0gbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplIDw8IDM7CisJaWYgKHVubGlrZWx5KGJpdCA+PSAoMWxsIDw8IDMyKSkpCisJCWdvdG8gbWF4X2Vycl9vdXQ7CisJbnRmc19kZWJ1ZygiU3RhdHVzIG9mIG1mdGJtcCBiZWZvcmUgZXh0ZW5zaW9uOiBhbGxvY2F0ZWRfc2l6ZSAweCVsbHgsICIKKwkJCSJkYXRhX3NpemUgMHglbGx4LCBpbml0aWFsaXplZF9zaXplIDB4JWxseC4iLAorCQkJKGxvbmcgbG9uZyltZnRibXBfbmktPmFsbG9jYXRlZF9zaXplLAorCQkJKGxvbmcgbG9uZyl2b2wtPm1mdGJtcF9pbm8tPmlfc2l6ZSwKKwkJCShsb25nIGxvbmcpbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplKTsKKwlpZiAobWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplICsgOCA+IG1mdGJtcF9uaS0+YWxsb2NhdGVkX3NpemUpIHsKKwkJLyogTmVlZCB0byBleHRlbmQgYml0bWFwIGJ5IG9uZSBtb3JlIGNsdXN0ZXIuICovCisJCW50ZnNfZGVidWcoIm1mdGJtcDogaW5pdGlhbGl6ZWRfc2l6ZSArIDggPiBhbGxvY2F0ZWRfc2l6ZS4iKTsKKwkJZXJyID0gbnRmc19tZnRfYml0bWFwX2V4dGVuZF9hbGxvY2F0aW9uX25vbG9jayh2b2wpOworCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJdXBfd3JpdGUoJnZvbC0+bWZ0Ym1wX2xvY2spOworCQkJZ290byBlcnJfb3V0OworCQl9CisJCW50ZnNfZGVidWcoIlN0YXR1cyBvZiBtZnRibXAgYWZ0ZXIgYWxsb2NhdGlvbiBleHRlbnNpb246ICIKKwkJCQkiYWxsb2NhdGVkX3NpemUgMHglbGx4LCBkYXRhX3NpemUgMHglbGx4LCAiCisJCQkJImluaXRpYWxpemVkX3NpemUgMHglbGx4LiIsCisJCQkJKGxvbmcgbG9uZyltZnRibXBfbmktPmFsbG9jYXRlZF9zaXplLAorCQkJCShsb25nIGxvbmcpdm9sLT5tZnRibXBfaW5vLT5pX3NpemUsCisJCQkJKGxvbmcgbG9uZyltZnRibXBfbmktPmluaXRpYWxpemVkX3NpemUpOworCX0KKwkvKgorCSAqIFdlIG5vdyBoYXZlIHN1ZmZpY2llbnQgYWxsb2NhdGVkIHNwYWNlLCBleHRlbmQgdGhlIGluaXRpYWxpemVkX3NpemUKKwkgKiBhcyB3ZWxsIGFzIHRoZSBkYXRhX3NpemUgaWYgbmVjZXNzYXJ5IGFuZCBmaWxsIHRoZSBuZXcgc3BhY2Ugd2l0aAorCSAqIHplcm9lcy4KKwkgKi8KKwllcnIgPSBudGZzX21mdF9iaXRtYXBfZXh0ZW5kX2luaXRpYWxpemVkX25vbG9jayh2b2wpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCXVwX3dyaXRlKCZ2b2wtPm1mdGJtcF9sb2NrKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwludGZzX2RlYnVnKCJTdGF0dXMgb2YgbWZ0Ym1wIGFmdGVyIGluaXRpYWxpemVkIGV4dGVudGlvbjogIgorCQkJImFsbG9jYXRlZF9zaXplIDB4JWxseCwgZGF0YV9zaXplIDB4JWxseCwgIgorCQkJImluaXRpYWxpemVkX3NpemUgMHglbGx4LiIsCisJCQkobG9uZyBsb25nKW1mdGJtcF9uaS0+YWxsb2NhdGVkX3NpemUsCisJCQkobG9uZyBsb25nKXZvbC0+bWZ0Ym1wX2luby0+aV9zaXplLAorCQkJKGxvbmcgbG9uZyltZnRibXBfbmktPmluaXRpYWxpemVkX3NpemUpOworCW50ZnNfZGVidWcoIkZvdW5kIGZyZWUgcmVjb3JkICgjMyksIGJpdCAweCVsbHguIiwgKGxvbmcgbG9uZyliaXQpOworZm91bmRfZnJlZV9yZWM6CisJLyogQGJpdCBpcyB0aGUgZm91bmQgZnJlZSBtZnQgcmVjb3JkLCBhbGxvY2F0ZSBpdCBpbiB0aGUgbWZ0IGJpdG1hcC4gKi8KKwludGZzX2RlYnVnKCJBdCBmb3VuZF9mcmVlX3JlYy4iKTsKKwllcnIgPSBudGZzX2JpdG1hcF9zZXRfYml0KHZvbC0+bWZ0Ym1wX2lubywgYml0KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gYWxsb2NhdGUgYml0IGluIG1mdCBiaXRtYXAuIik7CisJCXVwX3dyaXRlKCZ2b2wtPm1mdGJtcF9sb2NrKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwludGZzX2RlYnVnKCJTZXQgYml0IDB4JWxseCBpbiBtZnQgYml0bWFwLiIsIChsb25nIGxvbmcpYml0KTsKK2hhdmVfYWxsb2NfcmVjOgorCS8qCisJICogVGhlIG1mdCBiaXRtYXAgaXMgbm93IHVwdG9kYXRlLiAgRGVhbCB3aXRoIG1mdCBkYXRhIGF0dHJpYnV0ZSBub3cuCisJICogTm90ZSwgd2Uga2VlcCBob2xkIG9mIHRoZSBtZnQgYml0bWFwIGxvY2sgZm9yIHdyaXRpbmcgdW50aWwgYWxsCisJICogbW9kaWZpY2F0aW9ucyB0byB0aGUgbWZ0IGRhdGEgYXR0cmlidXRlIGFyZSBjb21wbGV0ZSwgdG9vLCBhcyB0aGV5CisJICogd2lsbCBpbXBhY3QgZGVjaXNpb25zIGZvciBtZnQgYml0bWFwIGFuZCBtZnQgcmVjb3JkIGFsbG9jYXRpb24gZG9uZQorCSAqIGJ5IGEgcGFyYWxsZWwgYWxsb2NhdGlvbiBhbmQgaWYgdGhlIGxvY2sgaXMgbm90IG1haW50YWluZWQgYQorCSAqIHBhcmFsbGVsIGFsbG9jYXRpb24gY291bGQgYWxsb2NhdGUgdGhlIHNhbWUgbWZ0IHJlY29yZCBhcyB0aGlzIG9uZS4KKwkgKi8KKwlsbCA9IChiaXQgKyAxKSA8PCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzOworCWlmIChsbCA8PSBtZnRfbmktPmluaXRpYWxpemVkX3NpemUpIHsKKwkJbnRmc19kZWJ1ZygiQWxsb2NhdGVkIG1mdCByZWNvcmQgYWxyZWFkeSBpbml0aWFsaXplZC4iKTsKKwkJZ290byBtZnRfcmVjX2FscmVhZHlfaW5pdGlhbGl6ZWQ7CisJfQorCW50ZnNfZGVidWcoIkluaXRpYWxpemluZyBhbGxvY2F0ZWQgbWZ0IHJlY29yZC4iKTsKKwkvKgorCSAqIFRoZSBtZnQgcmVjb3JkIGlzIG91dHNpZGUgdGhlIGluaXRpYWxpemVkIGRhdGEuICBFeHRlbmQgdGhlIG1mdCBkYXRhCisJICogYXR0cmlidXRlIHVudGlsIGl0IGNvdmVycyB0aGUgYWxsb2NhdGVkIHJlY29yZC4gIFRoZSBsb29wIGlzIG9ubHkKKwkgKiBhY3R1YWxseSB0cmF2ZXJzZWQgbW9yZSB0aGFuIG9uY2Ugd2hlbiBhIGZyZXNobHkgZm9ybWF0dGVkIHZvbHVtZSBpcworCSAqIGZpcnN0IHdyaXR0ZW4gdG8gc28gaXQgb3B0aW1pemVzIGF3YXkgbmljZWx5IGluIHRoZSBjb21tb24gY2FzZS4KKwkgKi8KKwludGZzX2RlYnVnKCJTdGF0dXMgb2YgbWZ0IGRhdGEgYmVmb3JlIGV4dGVuc2lvbjogIgorCQkJImFsbG9jYXRlZF9zaXplIDB4JWxseCwgZGF0YV9zaXplIDB4JWxseCwgIgorCQkJImluaXRpYWxpemVkX3NpemUgMHglbGx4LiIsCisJCQkobG9uZyBsb25nKW1mdF9uaS0+YWxsb2NhdGVkX3NpemUsCisJCQkobG9uZyBsb25nKXZvbC0+bWZ0X2luby0+aV9zaXplLAorCQkJKGxvbmcgbG9uZyltZnRfbmktPmluaXRpYWxpemVkX3NpemUpOworCXdoaWxlIChsbCA+IG1mdF9uaS0+YWxsb2NhdGVkX3NpemUpIHsKKwkJZXJyID0gbnRmc19tZnRfZGF0YV9leHRlbmRfYWxsb2NhdGlvbl9ub2xvY2sodm9sKTsKKwkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBleHRlbmQgbWZ0IGRhdGEgIgorCQkJCQkiYWxsb2NhdGlvbi4iKTsKKwkJCWdvdG8gdW5kb19tZnRibXBfYWxsb2Nfbm9sb2NrOworCQl9CisJCW50ZnNfZGVidWcoIlN0YXR1cyBvZiBtZnQgZGF0YSBhZnRlciBhbGxvY2F0aW9uIGV4dGVuc2lvbjogIgorCQkJCSJhbGxvY2F0ZWRfc2l6ZSAweCVsbHgsIGRhdGFfc2l6ZSAweCVsbHgsICIKKwkJCQkiaW5pdGlhbGl6ZWRfc2l6ZSAweCVsbHguIiwKKwkJCQkobG9uZyBsb25nKW1mdF9uaS0+YWxsb2NhdGVkX3NpemUsCisJCQkJKGxvbmcgbG9uZyl2b2wtPm1mdF9pbm8tPmlfc2l6ZSwKKwkJCQkobG9uZyBsb25nKW1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSk7CisJfQorCS8qCisJICogRXh0ZW5kIG1mdCBkYXRhIGluaXRpYWxpemVkIHNpemUgKGFuZCBkYXRhIHNpemUgb2YgY291cnNlKSB0byByZWFjaAorCSAqIHRoZSBhbGxvY2F0ZWQgbWZ0IHJlY29yZCwgZm9ybWF0dGluZyB0aGUgbWZ0IHJlY29yZHMgYWxsb25nIHRoZSB3YXkuCisJICogTm90ZTogV2Ugb25seSBtb2RpZnkgdGhlIG50ZnNfaW5vZGUgc3RydWN0dXJlIGFzIHRoYXQgaXMgYWxsIHRoYXQgaXMKKwkgKiBuZWVkZWQgYnkgbnRmc19tZnRfcmVjb3JkX2Zvcm1hdCgpLiAgV2Ugd2lsbCB1cGRhdGUgdGhlIGF0dHJpYnV0ZQorCSAqIHJlY29yZCBpdHNlbGYgaW4gb25lIGZlbGwgc3dvb3AgbGF0ZXIgb24uCisJICovCisJb2xkX2RhdGFfaW5pdGlhbGl6ZWQgPSBtZnRfbmktPmluaXRpYWxpemVkX3NpemU7CisJb2xkX2RhdGFfc2l6ZSA9IHZvbC0+bWZ0X2luby0+aV9zaXplOworCXdoaWxlIChsbCA+IG1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSkgeworCQlzNjQgbmV3X2luaXRpYWxpemVkX3NpemUsIG1mdF9ubzsKKwkJCisJCW5ld19pbml0aWFsaXplZF9zaXplID0gbWZ0X25pLT5pbml0aWFsaXplZF9zaXplICsKKwkJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZTsKKwkJbWZ0X25vID0gbWZ0X25pLT5pbml0aWFsaXplZF9zaXplID4+IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHM7CisJCWlmIChuZXdfaW5pdGlhbGl6ZWRfc2l6ZSA+IHZvbC0+bWZ0X2luby0+aV9zaXplKQorCQkJdm9sLT5tZnRfaW5vLT5pX3NpemUgPSBuZXdfaW5pdGlhbGl6ZWRfc2l6ZTsKKwkJbnRmc19kZWJ1ZygiSW5pdGlhbGl6aW5nIG1mdCByZWNvcmQgMHglbGx4LiIsCisJCQkJKGxvbmcgbG9uZyltZnRfbm8pOworCQllcnIgPSBudGZzX21mdF9yZWNvcmRfZm9ybWF0KHZvbCwgbWZ0X25vKTsKKwkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmb3JtYXQgbWZ0IHJlY29yZC4iKTsKKwkJCWdvdG8gdW5kb19kYXRhX2luaXQ7CisJCX0KKwkJbWZ0X25pLT5pbml0aWFsaXplZF9zaXplID0gbmV3X2luaXRpYWxpemVkX3NpemU7CisJfQorCXJlY29yZF9mb3JtYXR0ZWQgPSBUUlVFOworCS8qIFVwZGF0ZSB0aGUgbWZ0IGRhdGEgYXR0cmlidXRlIHJlY29yZCB0byByZWZsZWN0IHRoZSBuZXcgc2l6ZXMuICovCisJbSA9IG1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJaWYgKElTX0VSUihtKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWFwIG1mdCByZWNvcmQuIik7CisJCWVyciA9IFBUUl9FUlIobSk7CisJCWdvdG8gdW5kb19kYXRhX2luaXQ7CisJfQorCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChtZnRfbmksIG0pOworCWlmICh1bmxpa2VseSghY3R4KSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZ2V0IHNlYXJjaCBjb250ZXh0LiIpOworCQllcnIgPSAtRU5PTUVNOworCQl1bm1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJCWdvdG8gdW5kb19kYXRhX2luaXQ7CisJfQorCWVyciA9IG50ZnNfYXR0cl9sb29rdXAobWZ0X25pLT50eXBlLCBtZnRfbmktPm5hbWUsIG1mdF9uaS0+bmFtZV9sZW4sCisJCQlDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwgMCwgY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZmluZCBmaXJzdCBhdHRyaWJ1dGUgZXh0ZW50IG9mICIKKwkJCQkibWZ0IGRhdGEgYXR0cmlidXRlLiIpOworCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwkJdW5tYXBfbWZ0X3JlY29yZChtZnRfbmkpOworCQlnb3RvIHVuZG9fZGF0YV9pbml0OworCX0KKwlhID0gY3R4LT5hdHRyOworCWEtPmRhdGEubm9uX3Jlc2lkZW50LmluaXRpYWxpemVkX3NpemUgPQorCQkJY3B1X3RvX3NsZTY0KG1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSk7CisJYS0+ZGF0YS5ub25fcmVzaWRlbnQuZGF0YV9zaXplID0gY3B1X3RvX3NsZTY0KHZvbC0+bWZ0X2luby0+aV9zaXplKTsKKwkvKiBFbnN1cmUgdGhlIGNoYW5nZXMgbWFrZSBpdCB0byBkaXNrLiAqLworCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CisJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOworCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQobWZ0X25pKTsKKwludGZzX2RlYnVnKCJTdGF0dXMgb2YgbWZ0IGRhdGEgYWZ0ZXIgbWZ0IHJlY29yZCBpbml0aWFsaXphdGlvbjogIgorCQkJImFsbG9jYXRlZF9zaXplIDB4JWxseCwgZGF0YV9zaXplIDB4JWxseCwgIgorCQkJImluaXRpYWxpemVkX3NpemUgMHglbGx4LiIsCisJCQkobG9uZyBsb25nKW1mdF9uaS0+YWxsb2NhdGVkX3NpemUsCisJCQkobG9uZyBsb25nKXZvbC0+bWZ0X2luby0+aV9zaXplLAorCQkJKGxvbmcgbG9uZyltZnRfbmktPmluaXRpYWxpemVkX3NpemUpOworCUJVR19PTih2b2wtPm1mdF9pbm8tPmlfc2l6ZSA+IG1mdF9uaS0+YWxsb2NhdGVkX3NpemUpOworCUJVR19PTihtZnRfbmktPmluaXRpYWxpemVkX3NpemUgPiB2b2wtPm1mdF9pbm8tPmlfc2l6ZSk7CittZnRfcmVjX2FscmVhZHlfaW5pdGlhbGl6ZWQ6CisJLyoKKwkgKiBXZSBjYW4gZmluYWxseSBkcm9wIHRoZSBtZnQgYml0bWFwIGxvY2sgYXMgdGhlIG1mdCBkYXRhIGF0dHJpYnV0ZQorCSAqIGhhcyBiZWVuIGZ1bGx5IHVwZGF0ZWQuICBUaGUgb25seSBkaXNwYXJpdHkgbGVmdCBpcyB0aGF0IHRoZQorCSAqIGFsbG9jYXRlZCBtZnQgcmVjb3JkIHN0aWxsIG5lZWRzIHRvIGJlIG1hcmtlZCBhcyBpbiB1c2UgdG8gbWF0Y2ggdGhlCisJICogc2V0IGJpdCBpbiB0aGUgbWZ0IGJpdG1hcCBidXQgdGhpcyBpcyBhY3R1YWxseSBub3QgYSBwcm9ibGVtIHNpbmNlCisJICogdGhpcyBtZnQgcmVjb3JkIGlzIG5vdCByZWZlcmVuY2VkIGZyb20gYW55d2hlcmUgeWV0IGFuZCB0aGUgZmFjdAorCSAqIHRoYXQgaXQgaXMgYWxsb2NhdGVkIGluIHRoZSBtZnQgYml0bWFwIG1lYW5zIHRoYXQgbm8tb25lIHdpbGwgdHJ5IHRvCisJICogYWxsb2NhdGUgaXQgZWl0aGVyLgorCSAqLworCXVwX3dyaXRlKCZ2b2wtPm1mdGJtcF9sb2NrKTsKKwkvKgorCSAqIFdlIG5vdyBoYXZlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgdGhlIG1mdCByZWNvcmQuICBDYWxjdWxhdGUgdGhlCisJICogaW5kZXggb2YgYW5kIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBwYWdlIGNhY2hlIHBhZ2UgdGhlIHJlY29yZCBpcyBpbi4KKwkgKi8KKwlpbmRleCA9IGJpdCA8PCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJb2ZzID0gKGJpdCA8PCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzKSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJLyogUmVhZCwgbWFwLCBhbmQgcGluIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIG1mdCByZWNvcmQuICovCisJcGFnZSA9IG50ZnNfbWFwX3BhZ2Uodm9sLT5tZnRfaW5vLT5pX21hcHBpbmcsIGluZGV4KTsKKwlpZiAodW5saWtlbHkoSVNfRVJSKHBhZ2UpKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWFwIHBhZ2UgY29udGFpbmluZyBhbGxvY2F0ZWQgIgorCQkJCSJtZnQgcmVjb3JkIDB4JWxseC4iLCAobG9uZyBsb25nKWJpdCk7CisJCWVyciA9IFBUUl9FUlIocGFnZSk7CisJCWdvdG8gdW5kb19tZnRibXBfYWxsb2M7CisJfQorCWxvY2tfcGFnZShwYWdlKTsKKwlCVUdfT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CisJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CisJbSA9IChNRlRfUkVDT1JEKikoKHU4KilwYWdlX2FkZHJlc3MocGFnZSkgKyBvZnMpOworCS8qIElmIHdlIGp1c3QgZm9ybWF0dGVkIHRoZSBtZnQgcmVjb3JkIG5vIG5lZWQgdG8gZG8gaXQgYWdhaW4uICovCisJaWYgKCFyZWNvcmRfZm9ybWF0dGVkKSB7CisJCS8qIFNhbml0eSBjaGVjayB0aGF0IHRoZSBtZnQgcmVjb3JkIGlzIHJlYWxseSBub3QgaW4gdXNlLiAqLworCQlpZiAobnRmc19pc19maWxlX3JlY29yZChtLT5tYWdpYykgJiYKKwkJCQkobS0+ZmxhZ3MgJiBNRlRfUkVDT1JEX0lOX1VTRSkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIk1mdCByZWNvcmQgMHglbGx4IHdhcyBtYXJrZWQgIgorCQkJCQkiZnJlZSBpbiBtZnQgYml0bWFwIGJ1dCBpcyBtYXJrZWQgIgorCQkJCQkidXNlZCBpdHNlbGYuICBDb3JydXB0IGZpbGVzeXN0ZW0uICAiCisJCQkJCSJVbm1vdW50IGFuZCBydW4gY2hrZHNrLiIsCisJCQkJCShsb25nIGxvbmcpYml0KTsKKwkJCWVyciA9IC1FSU87CisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJCWdvdG8gdW5kb19tZnRibXBfYWxsb2M7CisJCX0KKwkJLyoKKwkJICogV2UgbmVlZCB0byAocmUtKWZvcm1hdCB0aGUgbWZ0IHJlY29yZCwgcHJlc2VydmluZyB0aGUKKwkJICogc2VxdWVuY2UgbnVtYmVyIGlmIGl0IGlzIG5vdCB6ZXJvIGFzIHdlbGwgYXMgdGhlIHVwZGF0ZQorCQkgKiBzZXF1ZW5jZSBudW1iZXIgaWYgaXQgaXMgbm90IHplcm8gb3IgLTEgKDB4ZmZmZikuICBUaGlzCisJCSAqIG1lYW5zIHdlIGRvIG5vdCBuZWVkIHRvIGNhcmUgd2hldGhlciBvciBub3Qgc29tZXRoaW5nIHdlbnQKKwkJICogd3Jvbmcgd2l0aCB0aGUgcHJldmlvdXMgbWZ0IHJlY29yZC4KKwkJICovCisJCXNlcV9ubyA9IG0tPnNlcXVlbmNlX251bWJlcjsKKwkJdXNuID0gKihsZTE2KikoKHU4KiltICsgbGUxNl90b19jcHUobS0+dXNhX29mcykpOworCQllcnIgPSBudGZzX21mdF9yZWNvcmRfbGF5b3V0KHZvbCwgYml0LCBtKTsKKwkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBsYXlvdXQgYWxsb2NhdGVkIG1mdCAiCisJCQkJCSJyZWNvcmQgMHglbGx4LiIsIChsb25nIGxvbmcpYml0KTsKKwkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQkJZ290byB1bmRvX21mdGJtcF9hbGxvYzsKKwkJfQorCQlpZiAoc2VxX25vKQorCQkJbS0+c2VxdWVuY2VfbnVtYmVyID0gc2VxX25vOworCQlpZiAodXNuICYmIGxlMTZfdG9fY3B1KHVzbikgIT0gMHhmZmZmKQorCQkJKihsZTE2KikoKHU4KiltICsgbGUxNl90b19jcHUobS0+dXNhX29mcykpID0gdXNuOworCX0KKwkvKiBTZXQgdGhlIG1mdCByZWNvcmQgaXRzZWxmIGluIHVzZS4gKi8KKwltLT5mbGFncyB8PSBNRlRfUkVDT1JEX0lOX1VTRTsKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJbS0+ZmxhZ3MgfD0gTUZUX1JFQ09SRF9JU19ESVJFQ1RPUlk7CisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWlmIChiYXNlX25pKSB7CisJCS8qCisJCSAqIFNldHVwIHRoZSBiYXNlIG1mdCByZWNvcmQgaW4gdGhlIGV4dGVudCBtZnQgcmVjb3JkLiAgVGhpcworCQkgKiBjb21wbGV0ZXMgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGFsbG9jYXRlZCBleHRlbnQgbWZ0IHJlY29yZAorCQkgKiBhbmQgd2UgY2FuIHNpbXBseSB1c2UgaXQgd2l0aCBtYXBfZXh0ZW50X21mdF9yZWNvcmQoKS4KKwkJICovCisJCW0tPmJhc2VfbWZ0X3JlY29yZCA9IE1LX0xFX01SRUYoYmFzZV9uaS0+bWZ0X25vLAorCQkJCWJhc2VfbmktPnNlcV9ubyk7CisJCS8qCisJCSAqIEFsbG9jYXRlIGFuIGV4dGVudCBpbm9kZSBzdHJ1Y3R1cmUgZm9yIHRoZSBuZXcgbWZ0IHJlY29yZCwKKwkJICogYXR0YWNoIGl0IHRvIHRoZSBiYXNlIGlub2RlIEBiYXNlX25pIGFuZCBtYXAsIHBpbiwgYW5kIGxvY2sKKwkJICogaXRzLCBpLmUuIHRoZSBhbGxvY2F0ZWQsIG1mdCByZWNvcmQuCisJCSAqLworCQltID0gbWFwX2V4dGVudF9tZnRfcmVjb3JkKGJhc2VfbmksIGJpdCwgJm5pKTsKKwkJaWYgKElTX0VSUihtKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIG1hcCBhbGxvY2F0ZWQgZXh0ZW50ICIKKwkJCQkJIm1mdCByZWNvcmQgMHglbGx4LiIsIChsb25nIGxvbmcpYml0KTsKKwkJCWVyciA9IFBUUl9FUlIobSk7CisJCQkvKiBTZXQgdGhlIG1mdCByZWNvcmQgaXRzZWxmIG5vdCBpbiB1c2UuICovCisJCQltLT5mbGFncyAmPSBjcHVfdG9fbGUxNigKKwkJCQkJfmxlMTZfdG9fY3B1KE1GVF9SRUNPUkRfSU5fVVNFKSk7CisJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCS8qIE1ha2Ugc3VyZSB0aGUgbWZ0IHJlY29yZCBpcyB3cml0dGVuIG91dCB0byBkaXNrLiAqLworCQkJbWFya19udGZzX3JlY29yZF9kaXJ0eShwYWdlLCBvZnMpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCQlnb3RvIHVuZG9fbWZ0Ym1wX2FsbG9jOworCQl9CisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGUgYWxsb2NhdGVkIG1mdCByZWNvcmQgaXMgd3JpdHRlbiBvdXQgdG8gZGlzay4KKwkJICogTm8gbmVlZCB0byBzZXQgdGhlIGlub2RlIGRpcnR5IGJlY2F1c2UgdGhlIGNhbGxlciBpcyBnb2luZworCQkgKiB0byBkbyB0aGF0IGFueXdheSBhZnRlciBmaW5pc2hpbmcgd2l0aCB0aGUgbmV3IGV4dGVudCBtZnQKKwkJICogcmVjb3JkIChlLmcuIGF0IGEgbWluaW11bSBhIG5ldyBhdHRyaWJ1dGUgd2lsbCBiZSBhZGRlZCB0bworCQkgKiB0aGUgbWZ0IHJlY29yZC4KKwkJICovCisJCW1hcmtfbnRmc19yZWNvcmRfZGlydHkocGFnZSwgb2ZzKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCS8qCisJCSAqIE5lZWQgdG8gdW5tYXAgdGhlIHBhZ2Ugc2luY2UgbWFwX2V4dGVudF9tZnRfcmVjb3JkKCkgbWFwcGVkCisJCSAqIGl0IGFzIHdlbGwgc28gd2UgaGF2ZSBpdCBtYXBwZWQgdHdpY2UgYXQgdGhlIG1vbWVudC4KKwkJICovCisJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBBbGxvY2F0ZSBhIG5ldyBWRlMgaW5vZGUgYW5kIHNldCBpdCB1cC4gIE5PVEU6IEB2aS0+aV9ubGluaworCQkgKiBpcyBzZXQgdG8gMSBidXQgdGhlIG1mdCByZWNvcmQtPmxpbmtfY291bnQgaXMgMC4gIFRoZSBjYWxsZXIKKwkJICogbmVlZHMgdG8gYmVhciB0aGlzIGluIG1pbmQuCisJCSAqLworCQl2aSA9IG5ld19pbm9kZSh2b2wtPnNiKTsKKwkJaWYgKHVubGlrZWx5KCF2aSkpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQkvKiBTZXQgdGhlIG1mdCByZWNvcmQgaXRzZWxmIG5vdCBpbiB1c2UuICovCisJCQltLT5mbGFncyAmPSBjcHVfdG9fbGUxNigKKwkJCQkJfmxlMTZfdG9fY3B1KE1GVF9SRUNPUkRfSU5fVVNFKSk7CisJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCS8qIE1ha2Ugc3VyZSB0aGUgbWZ0IHJlY29yZCBpcyB3cml0dGVuIG91dCB0byBkaXNrLiAqLworCQkJbWFya19udGZzX3JlY29yZF9kaXJ0eShwYWdlLCBvZnMpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCQlnb3RvIHVuZG9fbWZ0Ym1wX2FsbG9jOworCQl9CisJCXZpLT5pX2lubyA9IGJpdDsKKwkJLyoKKwkJICogVGhpcyBpcyB0aGUgb3B0aW1hbCBJTyBzaXplIChmb3Igc3RhdCksIG5vdCB0aGUgZnMgYmxvY2sKKwkJICogc2l6ZS4KKwkJICovCisJCXZpLT5pX2Jsa3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJCS8qCisJCSAqIFRoaXMgaXMgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gaW5vZGUgaGFzIGNoYW5nZWQgdy5yLnQuIGEKKwkJICogZmlsZSBzbyB0aGF0IHRoZSBmaWxlIGNhbiBiZSB1cGRhdGVkIGlmIG5lY2Vzc2FyeSAoY29tcGFyZQorCQkgKiB3aXRoIGZfdmVyc2lvbikuCisJCSAqLworCQl2aS0+aV92ZXJzaW9uID0gMTsKKworCQkvKiBUaGUgb3duZXIgYW5kIGdyb3VwIGNvbWUgZnJvbSB0aGUgbnRmcyB2b2x1bWUuICovCisJCXZpLT5pX3VpZCA9IHZvbC0+dWlkOworCQl2aS0+aV9naWQgPSB2b2wtPmdpZDsKKworCQkvKiBJbml0aWFsaXplIHRoZSBudGZzIHNwZWNpZmljIHBhcnQgb2YgQHZpLiAqLworCQludGZzX2luaXRfYmlnX2lub2RlKHZpKTsKKwkJbmkgPSBOVEZTX0kodmkpOworCQkvKgorCQkgKiBTZXQgdGhlIGFwcHJvcHJpYXRlIG1vZGUsIGF0dHJpYnV0ZSB0eXBlLCBhbmQgbmFtZS4gIEZvcgorCQkgKiBkaXJlY3RvcmllcywgYWxzbyBzZXR1cCB0aGUgaW5kZXggdmFsdWVzIHRvIHRoZSBkZWZhdWx0cy4KKwkJICovCisJCWlmIChTX0lTRElSKG1vZGUpKSB7CisJCQl2aS0+aV9tb2RlID0gU19JRkRJUiB8IFNfSVJXWFVHTzsKKwkJCXZpLT5pX21vZGUgJj0gfnZvbC0+ZG1hc2s7CisKKwkJCU5Jbm9TZXRNc3RQcm90ZWN0ZWQobmkpOworCQkJbmktPnR5cGUgPSBBVF9JTkRFWF9BTExPQ0FUSU9OOworCQkJbmktPm5hbWUgPSBJMzA7CisJCQluaS0+bmFtZV9sZW4gPSA0OworCisJCQluaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSA9IDQwOTY7CisJCQluaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZV9iaXRzID0gZ2VuZXJpY19mZnMoNDA5NikgLSAxOworCQkJbmktPml0eXBlLmluZGV4LmNvbGxhdGlvbl9ydWxlID0gQ09MTEFUSU9OX0ZJTEVfTkFNRTsKKwkJCWlmICh2b2wtPmNsdXN0ZXJfc2l6ZSA8PSBuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSkgeworCQkJCW5pLT5pdHlwZS5pbmRleC52Y25fc2l6ZSA9IHZvbC0+Y2x1c3Rlcl9zaXplOworCQkJCW5pLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzID0KKwkJCQkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CisJCQl9IGVsc2UgeworCQkJCW5pLT5pdHlwZS5pbmRleC52Y25fc2l6ZSA9IHZvbC0+c2VjdG9yX3NpemU7CisJCQkJbmktPml0eXBlLmluZGV4LnZjbl9zaXplX2JpdHMgPQorCQkJCQkJdm9sLT5zZWN0b3Jfc2l6ZV9iaXRzOworCQkJfQorCQl9IGVsc2UgeworCQkJdmktPmlfbW9kZSA9IFNfSUZSRUcgfCBTX0lSV1hVR087CisJCQl2aS0+aV9tb2RlICY9IH52b2wtPmZtYXNrOworCisJCQluaS0+dHlwZSA9IEFUX0RBVEE7CisJCQluaS0+bmFtZSA9IE5VTEw7CisJCQluaS0+bmFtZV9sZW4gPSAwOworCQl9CisJCWlmIChJU19SRE9OTFkodmkpKQorCQkJdmktPmlfbW9kZSAmPSB+U19JV1VHTzsKKworCQkvKiBTZXQgdGhlIGlub2RlIHRpbWVzIHRvIHRoZSBjdXJyZW50IHRpbWUuICovCisJCXZpLT5pX2F0aW1lID0gdmktPmlfbXRpbWUgPSB2aS0+aV9jdGltZSA9CisJCQljdXJyZW50X2ZzX3RpbWUodmktPmlfc2IpOworCQkvKgorCQkgKiBTZXQgdGhlIGZpbGUgc2l6ZSB0byAwLCB0aGUgbnRmcyBpbm9kZSBzaXplcyBhcmUgc2V0IHRvIDAgYnkKKwkJICogdGhlIGNhbGwgdG8gbnRmc19pbml0X2JpZ19pbm9kZSgpIGJlbG93LgorCQkgKi8KKwkJdmktPmlfc2l6ZSA9IDA7CisJCXZpLT5pX2Jsb2NrcyA9IDA7CisKKwkJLyogU2V0IHRoZSBzZXF1ZW5jZSBudW1iZXIuICovCisJCXZpLT5pX2dlbmVyYXRpb24gPSBuaS0+c2VxX25vID0gbGUxNl90b19jcHUobS0+c2VxdWVuY2VfbnVtYmVyKTsKKwkJLyoKKwkJICogTWFudWFsbHkgbWFwLCBwaW4sIGFuZCBsb2NrIHRoZSBtZnQgcmVjb3JkIGFzIHdlIGFscmVhZHkKKwkJICogaGF2ZSBpdHMgcGFnZSBtYXBwZWQgYW5kIGl0IGlzIHZlcnkgZWFzeSB0byBkby4KKwkJICovCisJCWF0b21pY19pbmMoJm5pLT5jb3VudCk7CisJCWRvd24oJm5pLT5tcmVjX2xvY2spOworCQluaS0+cGFnZSA9IHBhZ2U7CisJCW5pLT5wYWdlX29mcyA9IG9mczsKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZSBhbGxvY2F0ZWQgbWZ0IHJlY29yZCBpcyB3cml0dGVuIG91dCB0byBkaXNrLgorCQkgKiBOT1RFOiBXZSBkbyBub3Qgc2V0IHRoZSBudGZzIGlub2RlIGRpcnR5IGJlY2F1c2UgdGhpcyB3b3VsZAorCQkgKiBmYWlsIGluIG50ZnNfd3JpdGVfaW5vZGUoKSBiZWNhdXNlIHRoZSBpbm9kZSBkb2VzIG5vdCBoYXZlIGEKKwkJICogc3RhbmRhcmQgaW5mb3JtYXRpb24gYXR0cmlidXRlIHlldC4gIEFsc28sIHRoZXJlIGlzIG5vIG5lZWQKKwkJICogdG8gc2V0IHRoZSBpbm9kZSBkaXJ0eSBiZWNhdXNlIHRoZSBjYWxsZXIgaXMgZ29pbmcgdG8gZG8KKwkJICogdGhhdCBhbnl3YXkgYWZ0ZXIgZmluaXNoaW5nIHdpdGggdGhlIG5ldyBtZnQgcmVjb3JkIChlLmcuIGF0CisJCSAqIGEgbWluaW11bSBzb21lIG5ldyBhdHRyaWJ1dGVzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIG1mdAorCQkgKiByZWNvcmQuCisJCSAqLworCQltYXJrX250ZnNfcmVjb3JkX2RpcnR5KHBhZ2UsIG9mcyk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCisJCS8qIEFkZCB0aGUgaW5vZGUgdG8gdGhlIGlub2RlIGhhc2ggZm9yIHRoZSBzdXBlcmJsb2NrLiAqLworCQlpbnNlcnRfaW5vZGVfaGFzaCh2aSk7CisKKwkJLyogVXBkYXRlIHRoZSBkZWZhdWx0IG1mdCBhbGxvY2F0aW9uIHBvc2l0aW9uLiAqLworCQl2b2wtPm1mdF9kYXRhX3BvcyA9IGJpdCArIDE7CisJfQorCS8qCisJICogUmV0dXJuIHRoZSBvcGVuZWQsIGFsbG9jYXRlZCBpbm9kZSBvZiB0aGUgYWxsb2NhdGVkIG1mdCByZWNvcmQgYXMKKwkgKiB3ZWxsIGFzIHRoZSBtYXBwZWQsIHBpbm5lZCwgYW5kIGxvY2tlZCBtZnQgcmVjb3JkLgorCSAqLworCW50ZnNfZGVidWcoIlJldHVybmluZyBvcGVuZWQsIGFsbG9jYXRlZCAlc2lub2RlIDB4JWxseC4iLAorCQkJYmFzZV9uaSA/ICJleHRlbnQgIiA6ICIiLCAobG9uZyBsb25nKWJpdCk7CisJKm1yZWMgPSBtOworCXJldHVybiBuaTsKK3VuZG9fZGF0YV9pbml0OgorCW1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IG9sZF9kYXRhX2luaXRpYWxpemVkOworCXZvbC0+bWZ0X2luby0+aV9zaXplID0gb2xkX2RhdGFfc2l6ZTsKKwlnb3RvIHVuZG9fbWZ0Ym1wX2FsbG9jX25vbG9jazsKK3VuZG9fbWZ0Ym1wX2FsbG9jOgorCWRvd25fd3JpdGUoJnZvbC0+bWZ0Ym1wX2xvY2spOwordW5kb19tZnRibXBfYWxsb2Nfbm9sb2NrOgorCWlmIChudGZzX2JpdG1hcF9jbGVhcl9iaXQodm9sLT5tZnRibXBfaW5vLCBiaXQpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBjbGVhciBiaXQgaW4gbWZ0IGJpdG1hcC4lcyIsIGVzKTsKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCX0KKwl1cF93cml0ZSgmdm9sLT5tZnRibXBfbG9jayk7CitlcnJfb3V0OgorCXJldHVybiBFUlJfUFRSKGVycik7CittYXhfZXJyX291dDoKKwludGZzX3dhcm5pbmcodm9sLT5zYiwgIkNhbm5vdCBhbGxvY2F0ZSBtZnQgcmVjb3JkIGJlY2F1c2UgdGhlIG1heGltdW0gIgorCQkJIm51bWJlciBvZiBpbm9kZXMgKDJeMzIpIGhhcyBhbHJlYWR5IGJlZW4gcmVhY2hlZC4iKTsKKwl1cF93cml0ZSgmdm9sLT5tZnRibXBfbG9jayk7CisJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7Cit9CisKKy8qKgorICogbnRmc19leHRlbnRfbWZ0X3JlY29yZF9mcmVlIC0gZnJlZSBhbiBleHRlbnQgbWZ0IHJlY29yZCBvbiBhbiBudGZzIHZvbHVtZQorICogQG5pOgkJbnRmcyBpbm9kZSBvZiB0aGUgbWFwcGVkIGV4dGVudCBtZnQgcmVjb3JkIHRvIGZyZWUKKyAqIEBtOgkJbWFwcGVkIGV4dGVudCBtZnQgcmVjb3JkIG9mIHRoZSBudGZzIGlub2RlIEBuaQorICoKKyAqIEZyZWUgdGhlIG1hcHBlZCBleHRlbnQgbWZ0IHJlY29yZCBAbSBvZiB0aGUgZXh0ZW50IG50ZnMgaW5vZGUgQG5pLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHVubWFwcyB0aGUgbWZ0IHJlY29yZCBhbmQgY2xvc2VzIGFuZCBkZXN0cm95cyBAbmkKKyAqIGludGVybmFsbHkgYW5kIGhlbmNlIHlvdSBjYW5ub3QgdXNlIGVpdGhlciBAbmkgbm9yIEBtIGFueSBtb3JlIGFmdGVyIHRoaXMKKyAqIGZ1bmN0aW9uIHJldHVybnMgc3VjY2Vzcy4KKyAqCisgKiBPbiBzdWNjZXNzIHJldHVybiAwIGFuZCBvbiBlcnJvciByZXR1cm4gLWVycm5vLiAgQG5pIGFuZCBAbSBhcmUgc3RpbGwgdmFsaWQKKyAqIGluIHRoaXMgY2FzZSBhbmQgaGF2ZSBub3QgYmVlbiBmcmVlZC4KKyAqCisgKiBGb3Igc29tZSBlcnJvcnMgYW4gZXJyb3IgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgYW5kIHRoZSBzdWNjZXNzIGNvZGUgMCBpcworICogcmV0dXJuZWQgYW5kIHRoZSB2b2x1bWUgaXMgdGhlbiBsZWZ0IGRpcnR5IG9uIHVtb3VudC4gIFRoaXMgbWFrZXMgc2Vuc2UgaW4KKyAqIGNhc2Ugd2UgY291bGQgbm90IHJvbGxiYWNrIHRoZSBjaGFuZ2VzIHRoYXQgd2VyZSBhbHJlYWR5IGRvbmUgc2luY2UgdGhlCisgKiBjYWxsZXIgbm8gbG9uZ2VyIHdhbnRzIHRvIHJlZmVyZW5jZSB0aGlzIG1mdCByZWNvcmQgc28gaXQgZG9lcyBub3QgbWF0dGVyIHRvCisgKiB0aGUgY2FsbGVyIGlmIHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIGl0IGFzIGxvbmcgYXMgaXQgaXMgcHJvcGVybHkgZGV0YWNoZWQKKyAqIGZyb20gdGhlIGJhc2UgaW5vZGUuCisgKi8KK2ludCBudGZzX2V4dGVudF9tZnRfcmVjb3JkX2ZyZWUobnRmc19pbm9kZSAqbmksIE1GVF9SRUNPUkQgKm0pCit7CisJdW5zaWduZWQgbG9uZyBtZnRfbm8gPSBuaS0+bWZ0X25vOworCW50ZnNfdm9sdW1lICp2b2wgPSBuaS0+dm9sOworCW50ZnNfaW5vZGUgKmJhc2Vfbmk7CisJbnRmc19pbm9kZSAqKmV4dGVudF9uaXM7CisJaW50IGksIGVycjsKKwlsZTE2IG9sZF9zZXFfbm87CisJdTE2IHNlcV9ubzsKKwkKKwlCVUdfT04oTklub0F0dHIobmkpKTsKKwlCVUdfT04obmktPm5yX2V4dGVudHMgIT0gLTEpOworCisJZG93bigmbmktPmV4dGVudF9sb2NrKTsKKwliYXNlX25pID0gbmktPmV4dC5iYXNlX250ZnNfaW5vOworCXVwKCZuaS0+ZXh0ZW50X2xvY2spOworCisJQlVHX09OKGJhc2VfbmktPm5yX2V4dGVudHMgPD0gMCk7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgZXh0ZW50IGlub2RlIDB4JWx4LCBiYXNlIGlub2RlIDB4JWx4LlxuIiwKKwkJCW1mdF9ubywgYmFzZV9uaS0+bWZ0X25vKTsKKworCWRvd24oJmJhc2VfbmktPmV4dGVudF9sb2NrKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgaG9sZGluZyB0aGUgb25seSByZWZlcmVuY2UgdG8gdGhlIGV4dGVudCBpbm9kZS4gKi8KKwlpZiAoYXRvbWljX3JlYWQoJm5pLT5jb3VudCkgPiAyKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlRyaWVkIHRvIGZyZWUgYnVzeSBleHRlbnQgaW5vZGUgMHglbHgsICIKKwkJCQkibm90IGZyZWVpbmcuIiwgYmFzZV9uaS0+bWZ0X25vKTsKKwkJdXAoJmJhc2VfbmktPmV4dGVudF9sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBEaXNzb2NpYXRlIHRoZSBudGZzIGlub2RlIGZyb20gdGhlIGJhc2UgaW5vZGUuICovCisJZXh0ZW50X25pcyA9IGJhc2VfbmktPmV4dC5leHRlbnRfbnRmc19pbm9zOworCWVyciA9IC1FTk9FTlQ7CisJZm9yIChpID0gMDsgaSA8IGJhc2VfbmktPm5yX2V4dGVudHM7IGkrKykgeworCQlpZiAobmkgIT0gZXh0ZW50X25pc1tpXSkKKwkJCWNvbnRpbnVlOworCQlleHRlbnRfbmlzICs9IGk7CisJCWJhc2VfbmktPm5yX2V4dGVudHMtLTsKKwkJbWVtbW92ZShleHRlbnRfbmlzLCBleHRlbnRfbmlzICsgMSwgKGJhc2VfbmktPm5yX2V4dGVudHMgLSBpKSAqCisJCQkJc2l6ZW9mKG50ZnNfaW5vZGUqKSk7CisJCWVyciA9IDA7CisJCWJyZWFrOworCX0KKworCXVwKCZiYXNlX25pLT5leHRlbnRfbG9jayk7CisKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJFeHRlbnQgaW5vZGUgMHglbHggaXMgbm90IGF0dGFjaGVkIHRvICIKKwkJCQkiaXRzIGJhc2UgaW5vZGUgMHglbHguIiwgbWZ0X25vLAorCQkJCWJhc2VfbmktPm1mdF9ubyk7CisJCUJVRygpOworCX0KKworCS8qCisJICogVGhlIGV4dGVudCBpbm9kZSBpcyBubyBsb25nZXIgYXR0YWNoZWQgdG8gdGhlIGJhc2UgaW5vZGUgc28gbm8gb25lCisJICogY2FuIGdldCBhIHJlZmVyZW5jZSB0byBpdCBhbnkgbW9yZS4KKwkgKi8KKworCS8qIE1hcmsgdGhlIG1mdCByZWNvcmQgYXMgbm90IGluIHVzZS4gKi8KKwltLT5mbGFncyAmPSBjb25zdF9jcHVfdG9fbGUxNih+Y29uc3RfbGUxNl90b19jcHUoTUZUX1JFQ09SRF9JTl9VU0UpKTsKKworCS8qIEluY3JlbWVudCB0aGUgc2VxdWVuY2UgbnVtYmVyLCBza2lwcGluZyB6ZXJvLCBpZiBpdCBpcyBub3QgemVyby4gKi8KKwlvbGRfc2VxX25vID0gbS0+c2VxdWVuY2VfbnVtYmVyOworCXNlcV9ubyA9IGxlMTZfdG9fY3B1KG9sZF9zZXFfbm8pOworCWlmIChzZXFfbm8gPT0gMHhmZmZmKQorCQlzZXFfbm8gPSAxOworCWVsc2UgaWYgKHNlcV9ubykKKwkJc2VxX25vKys7CisJbS0+c2VxdWVuY2VfbnVtYmVyID0gY3B1X3RvX2xlMTYoc2VxX25vKTsKKworCS8qCisJICogU2V0IHRoZSBudGZzIGlub2RlIGRpcnR5IGFuZCB3cml0ZSBpdCBvdXQuICBXZSBkbyBub3QgbmVlZCB0byB3b3JyeQorCSAqIGFib3V0IHRoZSBiYXNlIGlub2RlIGhlcmUgc2luY2Ugd2hhdGV2ZXIgY2F1c2VkIHRoZSBleHRlbnQgbWZ0CisJICogcmVjb3JkIHRvIGJlIGZyZWVkIGlzIGd1YXJhbnRlZWQgdG8gZG8gaXQgYWxyZWFkeS4KKwkgKi8KKwlOSW5vU2V0RGlydHkobmkpOworCWVyciA9IHdyaXRlX21mdF9yZWNvcmQobmksIG0sIDApOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byB3cml0ZSBtZnQgcmVjb3JkIDB4JWx4LCBub3QgIgorCQkJCSJmcmVlaW5nLiIsIG1mdF9ubyk7CisJCWdvdG8gcm9sbGJhY2s7CisJfQorcm9sbGJhY2tfZXJyb3I6CisJLyogVW5tYXAgYW5kIHRocm93IGF3YXkgdGhlIG5vdyBmcmVlZCBleHRlbnQgaW5vZGUuICovCisJdW5tYXBfZXh0ZW50X21mdF9yZWNvcmQobmkpOworCW50ZnNfY2xlYXJfZXh0ZW50X2lub2RlKG5pKTsKKworCS8qIENsZWFyIHRoZSBiaXQgaW4gdGhlICRNRlQvJEJJVE1BUCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcmVjb3JkLiAqLworCWRvd25fd3JpdGUoJnZvbC0+bWZ0Ym1wX2xvY2spOworCWVyciA9IG50ZnNfYml0bWFwX2NsZWFyX2JpdCh2b2wtPm1mdGJtcF9pbm8sIG1mdF9ubyk7CisJdXBfd3JpdGUoJnZvbC0+bWZ0Ym1wX2xvY2spOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCS8qCisJCSAqIFRoZSBleHRlbnQgaW5vZGUgaXMgZ29uZSBidXQgd2UgZmFpbGVkIHRvIGRlYWxsb2NhdGUgaXQgaW4KKwkJICogdGhlIG1mdCBiaXRtYXAuICBKdXN0IGVtaXQgYSB3YXJuaW5nIGFuZCBsZWF2ZSB0aGUgdm9sdW1lCisJCSAqIGRpcnR5IG9uIHVtb3VudC4KKwkJICovCisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBjbGVhciBiaXQgaW4gbWZ0IGJpdG1hcC4lcyIsIGVzKTsKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCX0KKwlyZXR1cm4gMDsKK3JvbGxiYWNrOgorCS8qIFJvbGxiYWNrIHdoYXQgd2UgZGlkLi4uICovCisJZG93bigmYmFzZV9uaS0+ZXh0ZW50X2xvY2spOworCWV4dGVudF9uaXMgPSBiYXNlX25pLT5leHQuZXh0ZW50X250ZnNfaW5vczsKKwlpZiAoIShiYXNlX25pLT5ucl9leHRlbnRzICYgMykpIHsKKwkJaW50IG5ld19zaXplID0gKGJhc2VfbmktPm5yX2V4dGVudHMgKyA0KSAqIHNpemVvZihudGZzX2lub2RlKik7CisKKwkJZXh0ZW50X25pcyA9IChudGZzX2lub2RlKiopa21hbGxvYyhuZXdfc2l6ZSwgR0ZQX05PRlMpOworCQlpZiAodW5saWtlbHkoIWV4dGVudF9uaXMpKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gYWxsb2NhdGUgaW50ZXJuYWwgIgorCQkJCQkiYnVmZmVyIGR1cmluZyByb2xsYmFjay4lcyIsIGVzKTsKKwkJCXVwKCZiYXNlX25pLT5leHRlbnRfbG9jayk7CisJCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCQlnb3RvIHJvbGxiYWNrX2Vycm9yOworCQl9CisJCWlmIChiYXNlX25pLT5ucl9leHRlbnRzKSB7CisJCQlCVUdfT04oIWJhc2VfbmktPmV4dC5leHRlbnRfbnRmc19pbm9zKTsKKwkJCW1lbWNweShleHRlbnRfbmlzLCBiYXNlX25pLT5leHQuZXh0ZW50X250ZnNfaW5vcywKKwkJCQkJbmV3X3NpemUgLSA0ICogc2l6ZW9mKG50ZnNfaW5vZGUqKSk7CisJCQlrZnJlZShiYXNlX25pLT5leHQuZXh0ZW50X250ZnNfaW5vcyk7CisJCX0KKwkJYmFzZV9uaS0+ZXh0LmV4dGVudF9udGZzX2lub3MgPSBleHRlbnRfbmlzOworCX0KKwltLT5mbGFncyB8PSBNRlRfUkVDT1JEX0lOX1VTRTsKKwltLT5zZXF1ZW5jZV9udW1iZXIgPSBvbGRfc2VxX25vOworCWV4dGVudF9uaXNbYmFzZV9uaS0+bnJfZXh0ZW50cysrXSA9IG5pOworCXVwKCZiYXNlX25pLT5leHRlbnRfbG9jayk7CisJbWFya19tZnRfcmVjb3JkX2RpcnR5KG5pKTsKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmIC8qIE5URlNfUlcgKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvbWZ0LmggYi9mcy9udGZzL21mdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwN2RlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL21mdC5oCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogbWZ0LmggLSBEZWZpbmVzIGZvciBtZnQgcmVjb3JkIGhhbmRsaW5nIGluIE5URlMgTGludXgga2VybmVsIGRyaXZlci4KKyAqCSAgIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9MSU5VWF9OVEZTX01GVF9ICisjZGVmaW5lIF9MSU5VWF9OVEZTX01GVF9ICisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisKKyNpbmNsdWRlICJpbm9kZS5oIgorCitleHRlcm4gTUZUX1JFQ09SRCAqbWFwX21mdF9yZWNvcmQobnRmc19pbm9kZSAqbmkpOworZXh0ZXJuIHZvaWQgdW5tYXBfbWZ0X3JlY29yZChudGZzX2lub2RlICpuaSk7CisKK2V4dGVybiBNRlRfUkVDT1JEICptYXBfZXh0ZW50X21mdF9yZWNvcmQobnRmc19pbm9kZSAqYmFzZV9uaSwgTUZUX1JFRiBtcmVmLAorCQludGZzX2lub2RlICoqbnRmc19pbm8pOworCitzdGF0aWMgaW5saW5lIHZvaWQgdW5tYXBfZXh0ZW50X21mdF9yZWNvcmQobnRmc19pbm9kZSAqbmkpCit7CisJdW5tYXBfbWZ0X3JlY29yZChuaSk7CisJcmV0dXJuOworfQorCisjaWZkZWYgTlRGU19SVworCisvKioKKyAqIGZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UgLSBmbHVzaF9kY2FjaGVfcGFnZSgpIGZvciBtZnQgcmVjb3JkcworICogQG5pOgkJbnRmcyBpbm9kZSBzdHJ1Y3R1cmUgb2YgbWZ0IHJlY29yZAorICoKKyAqIENhbGwgZmx1c2hfZGNhY2hlX3BhZ2UoKSBmb3IgdGhlIHBhZ2UgaW4gd2hpY2ggYW4gbWZ0IHJlY29yZCByZXNpZGVzLgorICoKKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhbiBtZnQgcmVjb3JkIGlzIG1vZGlmaWVkLCBqdXN0IGFmdGVyIHRoZQorICogbW9kaWZpY2F0aW9uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShudGZzX2lub2RlICpuaSkKK3sKKwlmbHVzaF9kY2FjaGVfcGFnZShuaS0+cGFnZSk7Cit9CisKK2V4dGVybiB2b2lkIF9fbWFya19tZnRfcmVjb3JkX2RpcnR5KG50ZnNfaW5vZGUgKm5pKTsKKworLyoqCisgKiBtYXJrX21mdF9yZWNvcmRfZGlydHkgLSBzZXQgdGhlIG1mdCByZWNvcmQgYW5kIHRoZSBwYWdlIGNvbnRhaW5pbmcgaXQgZGlydHkKKyAqIEBuaToJCW50ZnMgaW5vZGUgZGVzY3JpYmluZyB0aGUgbWFwcGVkIG1mdCByZWNvcmQKKyAqCisgKiBTZXQgdGhlIG1hcHBlZCAoZXh0ZW50KSBtZnQgcmVjb3JkIG9mIHRoZSAoYmFzZSBvciBleHRlbnQpIG50ZnMgaW5vZGUgQG5pLAorICogYXMgd2VsbCBhcyB0aGUgcGFnZSBjb250YWluaW5nIHRoZSBtZnQgcmVjb3JkLCBkaXJ0eS4gIEFsc28sIG1hcmsgdGhlIGJhc2UKKyAqIHZmcyBpbm9kZSBkaXJ0eS4gIFRoaXMgZW5zdXJlcyB0aGF0IGFueSBjaGFuZ2VzIHRvIHRoZSBtZnQgcmVjb3JkIGFyZQorICogd3JpdHRlbiBvdXQgdG8gZGlzay4KKyAqCisgKiBOT1RFOiAgRG8gbm90IGRvIGFueXRoaW5nIGlmIHRoZSBtZnQgcmVjb3JkIGlzIGFscmVhZHkgbWFya2VkIGRpcnR5LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbWFya19tZnRfcmVjb3JkX2RpcnR5KG50ZnNfaW5vZGUgKm5pKQoreworCWlmICghTklub1Rlc3RTZXREaXJ0eShuaSkpCisJCV9fbWFya19tZnRfcmVjb3JkX2RpcnR5KG5pKTsKK30KKworZXh0ZXJuIGludCBudGZzX3N5bmNfbWZ0X21pcnJvcihudGZzX3ZvbHVtZSAqdm9sLCBjb25zdCB1bnNpZ25lZCBsb25nIG1mdF9ubywKKwkJTUZUX1JFQ09SRCAqbSwgaW50IHN5bmMpOworCitleHRlcm4gaW50IHdyaXRlX21mdF9yZWNvcmRfbm9sb2NrKG50ZnNfaW5vZGUgKm5pLCBNRlRfUkVDT1JEICptLCBpbnQgc3luYyk7CisKKy8qKgorICogd3JpdGVfbWZ0X3JlY29yZCAtIHdyaXRlIG91dCBhIG1hcHBlZCAoZXh0ZW50KSBtZnQgcmVjb3JkCisgKiBAbmk6CQludGZzIGlub2RlIGRlc2NyaWJpbmcgdGhlIG1hcHBlZCAoZXh0ZW50KSBtZnQgcmVjb3JkCisgKiBAbToJCW1hcHBlZCAoZXh0ZW50KSBtZnQgcmVjb3JkIHRvIHdyaXRlCisgKiBAc3luYzoJaWYgdHJ1ZSwgd2FpdCBmb3IgaS9vIGNvbXBsZXRpb24KKyAqCisgKiBUaGlzIGlzIGp1c3QgYSB3cmFwcGVyIGZvciB3cml0ZV9tZnRfcmVjb3JkX25vbG9jaygpIChzZWUgbWZ0LmMpLCB3aGljaAorICogbG9ja3MgdGhlIHBhZ2UgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgd3JpdGUuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGVyZSBhcmUKKyAqIG5vIHJhY2UgY29uZGl0aW9ucyBiZXR3ZWVuIHdyaXRpbmcgdGhlIG1mdCByZWNvcmQgdmlhIHRoZSBkaXJ0eSBpbm9kZSBjb2RlCisgKiBwYXRocyBhbmQgdmlhIHRoZSBwYWdlIGNhY2hlIHdyaXRlIGJhY2sgY29kZSBwYXRocyBvciBiZXR3ZWVuIHdyaXRpbmcKKyAqIG5laWdoYm91cmluZyBtZnQgcmVjb3JkcyByZXNpZGluZyBpbiB0aGUgc2FtZSBwYWdlLgorICoKKyAqIExvY2tpbmcgdGhlIHBhZ2UgYWxzbyBzZXJpYWxpemVzIHVzIGFnYWluc3QgLT5yZWFkcGFnZSgpIGlmIHRoZSBwYWdlIGlzIG5vdAorICogdXB0b2RhdGUuCisgKgorICogT24gc3VjY2VzcywgY2xlYW4gdGhlIG1mdCByZWNvcmQgYW5kIHJldHVybiAwLiAgT24gZXJyb3IsIGxlYXZlIHRoZSBtZnQKKyAqIHJlY29yZCBkaXJ0eSBhbmQgcmV0dXJuIC1lcnJuby4gIFRoZSBjYWxsZXIgc2hvdWxkIGNhbGwgbWFrZV9iYWRfaW5vZGUoKSBvbgorICogdGhlIGJhc2UgaW5vZGUgdG8gZW5zdXJlIG5vIG1vcmUgYWNjZXNzIGhhcHBlbnMgdG8gdGhpcyBpbm9kZS4gIFdlIGRvIG5vdCBkbworICogaXQgaGVyZSBhcyB0aGUgY2FsbGVyIG1heSB3YW50IHRvIGZpbmlzaCB3cml0aW5nIG90aGVyIGV4dGVudCBtZnQgcmVjb3JkcworICogZmlyc3QgdG8gbWluaW1pemUgb24tZGlzayBtZXRhZGF0YSBpbmNvbnNpc3RlbmNpZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHdyaXRlX21mdF9yZWNvcmQobnRmc19pbm9kZSAqbmksIE1GVF9SRUNPUkQgKm0sIGludCBzeW5jKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gbmktPnBhZ2U7CisJaW50IGVycjsKKworCUJVR19PTighcGFnZSk7CisJbG9ja19wYWdlKHBhZ2UpOworCWVyciA9IHdyaXRlX21mdF9yZWNvcmRfbm9sb2NrKG5pLCBtLCBzeW5jKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gZXJyOworfQorCitleHRlcm4gQk9PTCBudGZzX21heV93cml0ZV9tZnRfcmVjb3JkKG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IHVuc2lnbmVkIGxvbmcgbWZ0X25vLCBjb25zdCBNRlRfUkVDT1JEICptLAorCQludGZzX2lub2RlICoqbG9ja2VkX25pKTsKKworZXh0ZXJuIG50ZnNfaW5vZGUgKm50ZnNfbWZ0X3JlY29yZF9hbGxvYyhudGZzX3ZvbHVtZSAqdm9sLCBjb25zdCBpbnQgbW9kZSwKKwkJbnRmc19pbm9kZSAqYmFzZV9uaSwgTUZUX1JFQ09SRCAqKm1yZWMpOworZXh0ZXJuIGludCBudGZzX2V4dGVudF9tZnRfcmVjb3JkX2ZyZWUobnRmc19pbm9kZSAqbmksIE1GVF9SRUNPUkQgKm0pOworCisjZW5kaWYgLyogTlRGU19SVyAqLworCisjZW5kaWYgLyogX0xJTlVYX05URlNfTUZUX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvbXN0LmMgYi9mcy9udGZzL21zdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhODU4ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL21zdC5jCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogbXN0LmMgLSBOVEZTIG11bHRpIHNlY3RvciB0cmFuc2ZlciBwcm90ZWN0aW9uIGhhbmRsaW5nIGNvZGUuIFBhcnQgb2YgdGhlCisgKgkgICBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgIm50ZnMuaCIKKworLyoqCisgKiBwb3N0X3JlYWRfbXN0X2ZpeHVwIC0gZGVwcm90ZWN0IG11bHRpIHNlY3RvciB0cmFuc2ZlciBwcm90ZWN0ZWQgZGF0YQorICogQGI6CQlwb2ludGVyIHRvIHRoZSBkYXRhIHRvIGRlcHJvdGVjdAorICogQHNpemU6CXNpemUgaW4gYnl0ZXMgb2YgQGIKKyAqCisgKiBQZXJmb3JtIHRoZSBuZWNlc3NhcnkgcG9zdCByZWFkIG11bHRpIHNlY3RvciB0cmFuc2ZlciBmaXh1cCBhbmQgZGV0ZWN0IHRoZQorICogcHJlc2VuY2Ugb2YgaW5jb21wbGV0ZSBtdWx0aSBzZWN0b3IgdHJhbnNmZXJzLiAtIEluIHRoYXQgY2FzZSwgb3ZlcndyaXRlIHRoZQorICogbWFnaWMgb2YgdGhlIG50ZnMgcmVjb3JkIGhlYWRlciBiZWluZyBwcm9jZXNzZWQgd2l0aCAiQkFBRCIgKGluIG1lbW9yeSBvbmx5ISkKKyAqIGFuZCBhYm9ydCBwcm9jZXNzaW5nLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1FSU5WQUwgb24gZXJyb3IgKCJCQUFEIiBtYWdpYyB3aWxsIGJlIHByZXNlbnQpLgorICoKKyAqIE5PVEU6IFdlIGNvbnNpZGVyIHRoZSBhYnNlbmNlIC8gaW52YWxpZGl0eSBvZiBhbiB1cGRhdGUgc2VxdWVuY2UgYXJyYXkgdG8KKyAqIG1lYW4gdGhhdCB0aGUgc3RydWN0dXJlIGlzIG5vdCBwcm90ZWN0ZWQgYXQgYWxsIGFuZCBoZW5jZSBkb2Vzbid0IG5lZWQgdG8KKyAqIGJlIGZpeGVkIHVwLiBUaHVzLCB3ZSByZXR1cm4gc3VjY2VzcyBhbmQgbm90IGZhaWx1cmUgaW4gdGhpcyBjYXNlLiBUaGlzIGlzCisgKiBpbiBjb250cmFzdCB0byBwcmVfd3JpdGVfbXN0X2ZpeHVwKCksIHNlZSBiZWxvdy4KKyAqLworaW50IHBvc3RfcmVhZF9tc3RfZml4dXAoTlRGU19SRUNPUkQgKmIsIGNvbnN0IHUzMiBzaXplKQoreworCXUxNiB1c2Ffb2ZzLCB1c2FfY291bnQsIHVzbjsKKwl1MTYgKnVzYV9wb3MsICpkYXRhX3BvczsKKworCS8qIFNldHVwIHRoZSB2YXJpYWJsZXMuICovCisJdXNhX29mcyA9IGxlMTZfdG9fY3B1KGItPnVzYV9vZnMpOworCS8qIERlY3JlbWVudCB1c2FfY291bnQgdG8gZ2V0IG51bWJlciBvZiBmaXh1cHMuICovCisJdXNhX2NvdW50ID0gbGUxNl90b19jcHUoYi0+dXNhX2NvdW50KSAtIDE7CisJLyogU2l6ZSBhbmQgYWxpZ25tZW50IGNoZWNrcy4gKi8KKwlpZiAoIHNpemUgJiAoTlRGU19CTE9DS19TSVpFIC0gMSkJfHwKKwkgICAgIHVzYV9vZnMgJiAxCQkJfHwKKwkgICAgIHVzYV9vZnMgKyAodXNhX2NvdW50ICogMikgPiBzaXplCXx8CisJICAgICAoc2l6ZSA+PiBOVEZTX0JMT0NLX1NJWkVfQklUUykgIT0gdXNhX2NvdW50KQorCQlyZXR1cm4gMDsKKwkvKiBQb3NpdGlvbiBvZiB1c24gaW4gdXBkYXRlIHNlcXVlbmNlIGFycmF5LiAqLworCXVzYV9wb3MgPSAodTE2KiliICsgdXNhX29mcy9zaXplb2YodTE2KTsKKwkvKgorCSAqIFRoZSB1cGRhdGUgc2VxdWVuY2UgbnVtYmVyIHdoaWNoIGhhcyB0byBiZSBlcXVhbCB0byBlYWNoIG9mIHRoZQorCSAqIHUxNiB2YWx1ZXMgYmVmb3JlIHRoZXkgYXJlIGZpeGVkIHVwLiBOb3RlIG5vIG5lZWQgdG8gY2FyZSBmb3IKKwkgKiBlbmRpYW5uZXNzIHNpbmNlIHdlIGFyZSBjb21wYXJpbmcgYW5kIG1vdmluZyBkYXRhIGZvciBvbiBkaXNrCisJICogc3RydWN0dXJlcyB3aGljaCBtZWFucyB0aGUgZGF0YSBpcyBjb25zaXN0ZW50LiAtIElmIGl0IGlzCisJICogY29uc2lzdGVudHkgdGhlIHdyb25nIGVuZGlhbm5lc3MgaXQgZG9lc24ndCBtYWtlIGFueSBkaWZmZXJlbmNlLgorCSAqLworCXVzbiA9ICp1c2FfcG9zOworCS8qCisJICogUG9zaXRpb24gaW4gcHJvdGVjdGVkIGRhdGEgb2YgZmlyc3QgdTE2IHRoYXQgbmVlZHMgZml4aW5nIHVwLgorCSAqLworCWRhdGFfcG9zID0gKHUxNiopYiArIE5URlNfQkxPQ0tfU0laRS9zaXplb2YodTE2KSAtIDE7CisJLyoKKwkgKiBDaGVjayBmb3IgaW5jb21wbGV0ZSBtdWx0aSBzZWN0b3IgdHJhbnNmZXIocykuCisJICovCisJd2hpbGUgKHVzYV9jb3VudC0tKSB7CisJCWlmICgqZGF0YV9wb3MgIT0gdXNuKSB7CisJCQkvKgorCQkJICogSW5jb21wbGV0ZSBtdWx0aSBzZWN0b3IgdHJhbnNmZXIgZGV0ZWN0ZWQhICktOgorCQkJICogU2V0IHRoZSBtYWdpYyB0byAiQkFBRCIgYW5kIHJldHVybiBmYWlsdXJlLgorCQkJICogTm90ZSB0aGF0IG1hZ2ljX0JBQUQgaXMgYWxyZWFkeSBjb252ZXJ0ZWQgdG8gbGUzMi4KKwkJCSAqLworCQkJYi0+bWFnaWMgPSBtYWdpY19CQUFEOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZGF0YV9wb3MgKz0gTlRGU19CTE9DS19TSVpFL3NpemVvZih1MTYpOworCX0KKwkvKiBSZS1zZXR1cCB0aGUgdmFyaWFibGVzLiAqLworCXVzYV9jb3VudCA9IGxlMTZfdG9fY3B1KGItPnVzYV9jb3VudCkgLSAxOworCWRhdGFfcG9zID0gKHUxNiopYiArIE5URlNfQkxPQ0tfU0laRS9zaXplb2YodTE2KSAtIDE7CisJLyogRml4dXAgYWxsIHNlY3RvcnMuICovCisJd2hpbGUgKHVzYV9jb3VudC0tKSB7CisJCS8qCisJCSAqIEluY3JlbWVudCBwb3NpdGlvbiBpbiB1c2EgYW5kIHJlc3RvcmUgb3JpZ2luYWwgZGF0YSBmcm9tCisJCSAqIHRoZSB1c2EgaW50byB0aGUgZGF0YSBidWZmZXIuCisJCSAqLworCQkqZGF0YV9wb3MgPSAqKCsrdXNhX3Bvcyk7CisJCS8qIEluY3JlbWVudCBwb3NpdGlvbiBpbiBkYXRhIGFzIHdlbGwuICovCisJCWRhdGFfcG9zICs9IE5URlNfQkxPQ0tfU0laRS9zaXplb2YodTE2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHJlX3dyaXRlX21zdF9maXh1cCAtIGFwcGx5IG11bHRpIHNlY3RvciB0cmFuc2ZlciBwcm90ZWN0aW9uCisgKiBAYjoJCXBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gcHJvdGVjdAorICogQHNpemU6CXNpemUgaW4gYnl0ZXMgb2YgQGIKKyAqCisgKiBQZXJmb3JtIHRoZSBuZWNlc3NhcnkgcHJlIHdyaXRlIG11bHRpIHNlY3RvciB0cmFuc2ZlciBmaXh1cCBvbiB0aGUgZGF0YQorICogcG9pbnRlciB0byBieSBAYiBvZiBAc2l6ZS4KKyAqCisgKiBSZXR1cm4gMCBpZiBmaXh1cCBhcHBsaWVkIChzdWNjZXNzKSBvciAtRUlOVkFMIGlmIG5vIGZpeHVwIHdhcyBwZXJmb3JtZWQKKyAqIChhc3N1bWVkIG5vdCBuZWVkZWQpLiBUaGlzIGlzIGluIGNvbnRyYXN0IHRvIHBvc3RfcmVhZF9tc3RfZml4dXAoKSBhYm92ZS4KKyAqCisgKiBOT1RFOiBXZSBjb25zaWRlciB0aGUgYWJzZW5jZSAvIGludmFsaWRpdHkgb2YgYW4gdXBkYXRlIHNlcXVlbmNlIGFycmF5IHRvCisgKiBtZWFuIHRoYXQgdGhlIHN0cnVjdHVyZSBpcyBub3Qgc3ViamVjdCB0byBwcm90ZWN0aW9uIGFuZCBoZW5jZSBkb2Vzbid0IG5lZWQKKyAqIHRvIGJlIGZpeGVkIHVwLiBUaGlzIG1lYW5zIHRoYXQgeW91IGhhdmUgdG8gY3JlYXRlIGEgdmFsaWQgdXBkYXRlIHNlcXVlbmNlCisgKiBhcnJheSBoZWFkZXIgaW4gdGhlIG50ZnMgcmVjb3JkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIG90aGVyd2lzZSBpdAorICogd2lsbCBmYWlsICh0aGUgaGVhZGVyIG5lZWRzIHRvIGNvbnRhaW4gdGhlIHBvc2l0aW9uIG9mIHRoZSB1cGRhdGUgc2VxdWVuY2UKKyAqIGFycmF5IHRvZ2V0aGVyIHdpdGggdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkpLiBZb3UgYWxzbyBuZWVkIHRvCisgKiBpbml0aWFsaXNlIHRoZSB1cGRhdGUgc2VxdWVuY2UgbnVtYmVyIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKyAqIG90aGVyd2lzZSBhIHJhbmRvbSB3b3JkIHdpbGwgYmUgdXNlZCAod2hhdGV2ZXIgd2FzIGluIHRoZSByZWNvcmQgYXQgdGhhdAorICogcG9zaXRpb24gYXQgdGhhdCB0aW1lKS4KKyAqLworaW50IHByZV93cml0ZV9tc3RfZml4dXAoTlRGU19SRUNPUkQgKmIsIGNvbnN0IHUzMiBzaXplKQoreworCWxlMTYgKnVzYV9wb3MsICpkYXRhX3BvczsKKwl1MTYgdXNhX29mcywgdXNhX2NvdW50LCB1c247CisJbGUxNiBsZV91c247CisKKwkvKiBTYW5pdHkgY2hlY2sgKyBvbmx5IGZpeHVwIGlmIGl0IG1ha2VzIHNlbnNlLiAqLworCWlmICghYiB8fCBudGZzX2lzX2JhYWRfcmVjb3JkKGItPm1hZ2ljKSB8fAorCQkJbnRmc19pc19ob2xlX3JlY29yZChiLT5tYWdpYykpCisJCXJldHVybiAtRUlOVkFMOworCS8qIFNldHVwIHRoZSB2YXJpYWJsZXMuICovCisJdXNhX29mcyA9IGxlMTZfdG9fY3B1KGItPnVzYV9vZnMpOworCS8qIERlY3JlbWVudCB1c2FfY291bnQgdG8gZ2V0IG51bWJlciBvZiBmaXh1cHMuICovCisJdXNhX2NvdW50ID0gbGUxNl90b19jcHUoYi0+dXNhX2NvdW50KSAtIDE7CisJLyogU2l6ZSBhbmQgYWxpZ25tZW50IGNoZWNrcy4gKi8KKwlpZiAoIHNpemUgJiAoTlRGU19CTE9DS19TSVpFIC0gMSkJfHwKKwkgICAgIHVzYV9vZnMgJiAxCQkJfHwKKwkgICAgIHVzYV9vZnMgKyAodXNhX2NvdW50ICogMikgPiBzaXplCXx8CisJICAgICAoc2l6ZSA+PiBOVEZTX0JMT0NLX1NJWkVfQklUUykgIT0gdXNhX2NvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBQb3NpdGlvbiBvZiB1c24gaW4gdXBkYXRlIHNlcXVlbmNlIGFycmF5LiAqLworCXVzYV9wb3MgPSAobGUxNiopKCh1OCopYiArIHVzYV9vZnMpOworCS8qCisJICogQ3ljbGljYWxseSBpbmNyZW1lbnQgdGhlIHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIKKwkgKiAoc2tpcHBpbmcgMCBhbmQgLTEsIGkuZS4gMHhmZmZmKS4KKwkgKi8KKwl1c24gPSBsZTE2X3RvX2NwdXAodXNhX3BvcykgKyAxOworCWlmICh1c24gPT0gMHhmZmZmIHx8ICF1c24pCisJCXVzbiA9IDE7CisJbGVfdXNuID0gY3B1X3RvX2xlMTYodXNuKTsKKwkqdXNhX3BvcyA9IGxlX3VzbjsKKwkvKiBQb3NpdGlvbiBpbiBkYXRhIG9mIGZpcnN0IHUxNiB0aGF0IG5lZWRzIGZpeGluZyB1cC4gKi8KKwlkYXRhX3BvcyA9IChsZTE2KiliICsgTlRGU19CTE9DS19TSVpFL3NpemVvZihsZTE2KSAtIDE7CisJLyogRml4dXAgYWxsIHNlY3RvcnMuICovCisJd2hpbGUgKHVzYV9jb3VudC0tKSB7CisJCS8qCisJCSAqIEluY3JlbWVudCB0aGUgcG9zaXRpb24gaW4gdGhlIHVzYSBhbmQgc2F2ZSB0aGUKKwkJICogb3JpZ2luYWwgZGF0YSBmcm9tIHRoZSBkYXRhIGJ1ZmZlciBpbnRvIHRoZSB1c2EuCisJCSAqLworCQkqKCsrdXNhX3BvcykgPSAqZGF0YV9wb3M7CisJCS8qIEFwcGx5IGZpeHVwIHRvIGRhdGEuICovCisJCSpkYXRhX3BvcyA9IGxlX3VzbjsKKwkJLyogSW5jcmVtZW50IHBvc2l0aW9uIGluIGRhdGEgYXMgd2VsbC4gKi8KKwkJZGF0YV9wb3MgKz0gTlRGU19CTE9DS19TSVpFL3NpemVvZihsZTE2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcG9zdF93cml0ZV9tc3RfZml4dXAgLSBmYXN0IGRlcHJvdGVjdCBtdWx0aSBzZWN0b3IgdHJhbnNmZXIgcHJvdGVjdGVkIGRhdGEKKyAqIEBiOgkJcG9pbnRlciB0byB0aGUgZGF0YSB0byBkZXByb3RlY3QKKyAqCisgKiBQZXJmb3JtIHRoZSBuZWNlc3NhcnkgcG9zdCB3cml0ZSBtdWx0aSBzZWN0b3IgdHJhbnNmZXIgZml4dXAsIG5vdCBjaGVja2luZworICogZm9yIGFueSBlcnJvcnMsIGJlY2F1c2Ugd2UgYXNzdW1lIHdlIGhhdmUganVzdCB1c2VkIHByZV93cml0ZV9tc3RfZml4dXAoKSwKKyAqIHRodXMgdGhlIGRhdGEgd2lsbCBiZSBmaW5lIG9yIHdlIHdvdWxkIG5ldmVyIGhhdmUgZ290dGVuIGhlcmUuCisgKi8KK3ZvaWQgcG9zdF93cml0ZV9tc3RfZml4dXAoTlRGU19SRUNPUkQgKmIpCit7CisJbGUxNiAqdXNhX3BvcywgKmRhdGFfcG9zOworCisJdTE2IHVzYV9vZnMgPSBsZTE2X3RvX2NwdShiLT51c2Ffb2ZzKTsKKwl1MTYgdXNhX2NvdW50ID0gbGUxNl90b19jcHUoYi0+dXNhX2NvdW50KSAtIDE7CisKKwkvKiBQb3NpdGlvbiBvZiB1c24gaW4gdXBkYXRlIHNlcXVlbmNlIGFycmF5LiAqLworCXVzYV9wb3MgPSAobGUxNiopYiArIHVzYV9vZnMvc2l6ZW9mKGxlMTYpOworCisJLyogUG9zaXRpb24gaW4gcHJvdGVjdGVkIGRhdGEgb2YgZmlyc3QgdTE2IHRoYXQgbmVlZHMgZml4aW5nIHVwLiAqLworCWRhdGFfcG9zID0gKGxlMTYqKWIgKyBOVEZTX0JMT0NLX1NJWkUvc2l6ZW9mKGxlMTYpIC0gMTsKKworCS8qIEZpeHVwIGFsbCBzZWN0b3JzLiAqLworCXdoaWxlICh1c2FfY291bnQtLSkgeworCQkvKgorCQkgKiBJbmNyZW1lbnQgcG9zaXRpb24gaW4gdXNhIGFuZCByZXN0b3JlIG9yaWdpbmFsIGRhdGEgZnJvbQorCQkgKiB0aGUgdXNhIGludG8gdGhlIGRhdGEgYnVmZmVyLgorCQkgKi8KKwkJKmRhdGFfcG9zID0gKigrK3VzYV9wb3MpOworCisJCS8qIEluY3JlbWVudCBwb3NpdGlvbiBpbiBkYXRhIGFzIHdlbGwuICovCisJCWRhdGFfcG9zICs9IE5URlNfQkxPQ0tfU0laRS9zaXplb2YobGUxNik7CisJfQorfQpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9uYW1laS5jIGIvZnMvbnRmcy9uYW1laS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjN2UxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL25hbWVpLmMKQEAgLTAsMCArMSw0OTggQEAKKy8qCisgKiBuYW1laS5jIC0gTlRGUyBrZXJuZWwgZGlyZWN0b3J5IGlub2RlIG9wZXJhdGlvbnMuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMKKyAqCSAgICAgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKworI2luY2x1ZGUgImF0dHJpYi5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiZGlyLmgiCisjaW5jbHVkZSAibWZ0LmgiCisjaW5jbHVkZSAibnRmcy5oIgorCisvKioKKyAqIG50ZnNfbG9va3VwIC0gZmluZCB0aGUgaW5vZGUgcmVwcmVzZW50ZWQgYnkgYSBkZW50cnkgaW4gYSBkaXJlY3RvcnkgaW5vZGUKKyAqIEBkaXJfaW5vOglkaXJlY3RvcnkgaW5vZGUgaW4gd2hpY2ggdG8gbG9vayBmb3IgdGhlIGlub2RlCisgKiBAZGVudDoJZGVudHJ5IHJlcHJlc2VudGluZyB0aGUgaW5vZGUgdG8gbG9vayBmb3IKKyAqIEBuZDoJCWxvb2t1cCBuYW1laWRhdGEKKyAqCisgKiBJbiBzaG9ydCwgbnRmc19sb29rdXAoKSBsb29rcyBmb3IgdGhlIGlub2RlIHJlcHJlc2VudGVkIGJ5IHRoZSBkZW50cnkgQGRlbnQKKyAqIGluIHRoZSBkaXJlY3RvcnkgaW5vZGUgQGRpcl9pbm8gYW5kIGlmIGZvdW5kIGF0dGFjaGVzIHRoZSBpbm9kZSB0byB0aGUKKyAqIGRlbnRyeSBAZGVudC4KKyAqCisgKiBJbiBtb3JlIGRldGFpbCwgdGhlIGRlbnRyeSBAZGVudCBzcGVjaWZpZXMgd2hpY2ggaW5vZGUgdG8gbG9vayBmb3IgYnkKKyAqIHN1cHBseWluZyB0aGUgbmFtZSBvZiB0aGUgaW5vZGUgaW4gQGRlbnQtPmRfbmFtZS5uYW1lLiBudGZzX2xvb2t1cCgpCisgKiBjb252ZXJ0cyB0aGUgbmFtZSB0byBVbmljb2RlIGFuZCB3YWxrcyB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSBpbm9kZQorICogQGRpcl9pbm8gbG9va2luZyBmb3IgdGhlIGNvbnZlcnRlZCBVbmljb2RlIG5hbWUuIElmIHRoZSBuYW1lIGlzIGZvdW5kIGluIHRoZQorICogZGlyZWN0b3J5LCB0aGUgY29ycmVzcG9uZGluZyBpbm9kZSBpcyBsb2FkZWQgYnkgY2FsbGluZyBudGZzX2lnZXQoKSBvbiBpdHMKKyAqIGlub2RlIG51bWJlciBhbmQgdGhlIGlub2RlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVudHJ5IEBkZW50IHZpYSBhIGNhbGwgdG8KKyAqIGRfc3BsaWNlX2FsaWFzKCkuCisgKgorICogSWYgdGhlIG5hbWUgaXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnksIGEgTlVMTCBpbm9kZSBpcyBpbnNlcnRlZCBpbnRvIHRoZQorICogZGVudHJ5IEBkZW50IHZpYSBhIGNhbGwgdG8gZF9hZGQoKS4gVGhlIGRlbnRyeSBpcyB0aGVuIHRlcm1lZCBhIG5lZ2F0aXZlCisgKiBkZW50cnkuCisgKgorICogT25seSBpZiBhbiBhY3R1YWwgZXJyb3Igb2NjdXJzLCBkbyB3ZSByZXR1cm4gYW4gZXJyb3IgdmlhIEVSUl9QVFIoKS4KKyAqCisgKiBJbiBvcmRlciB0byBoYW5kbGUgdGhlIGNhc2UgaW5zZW5zaXRpdml0eSBpc3N1ZXMgb2YgTlRGUyB3aXRoIHJlZ2FyZHMgdG8gdGhlCisgKiBkY2FjaGUgYW5kIHRoZSBkY2FjaGUgcmVxdWlyaW5nIG9ubHkgb25lIGRlbnRyeSBwZXIgZGlyZWN0b3J5LCB3ZSBkZWFsIHdpdGgKKyAqIGRlbnRyeSBhbGlhc2VzIHRoYXQgb25seSBkaWZmZXIgaW4gY2FzZSBpbiAtPm50ZnNfbG9va3VwKCkgd2hpbGUgbWFpbnRhaW5pbmcKKyAqIGEgY2FzZSBzZW5zaXRpdmUgZGNhY2hlLiBUaGlzIG1lYW5zIHRoYXQgd2UgZ2V0IHRoZSBmdWxsIGJlbmVmaXQgb2YgZGNhY2hlCisgKiBzcGVlZCB3aGVuIHRoZSBmaWxlL2RpcmVjdG9yeSBpcyBsb29rZWQgdXAgd2l0aCB0aGUgc2FtZSBjYXNlIGFzIHJldHVybmVkIGJ5CisgKiAtPm50ZnNfcmVhZGRpcigpIGJ1dCB0aGF0IGEgbG9va3VwIGZvciBhbnkgb3RoZXIgY2FzZSAob3IgZm9yIHRoZSBzaG9ydCBmaWxlCisgKiBuYW1lKSB3aWxsIG5vdCBmaW5kIGFueXRoaW5nIGluIGRjYWNoZSBhbmQgd2lsbCBlbnRlciAtPm50ZnNfbG9va3VwKCkKKyAqIGluc3RlYWQsIHdoZXJlIHdlIHNlYXJjaCB0aGUgZGlyZWN0b3J5IGZvciBhIGZ1bGx5IG1hdGNoaW5nIGZpbGUgbmFtZQorICogKGluY2x1ZGluZyBjYXNlKSBhbmQgaWYgdGhhdCBpcyBub3QgZm91bmQsIHdlIHNlYXJjaCBmb3IgYSBmaWxlIG5hbWUgdGhhdAorICogbWF0Y2hlcyB3aXRoIGRpZmZlcmVudCBjYXNlIGFuZCBpZiB0aGF0IGhhcyBub24tUE9TSVggc2VtYW50aWNzIHdlIHJldHVybgorICogdGhhdC4gV2UgYWN0dWFsbHkgZG8gb25seSBvbmUgc2VhcmNoIChjYXNlIHNlbnNpdGl2ZSkgYW5kIGtlZXAgdGFicyBvbgorICogd2hldGhlciB3ZSBoYXZlIGZvdW5kIGEgY2FzZSBpbnNlbnNpdGl2ZSBtYXRjaCBpbiB0aGUgcHJvY2Vzcy4KKyAqCisgKiBUbyBzaW1wbGlmeSBtYXR0ZXJzIGZvciB1cywgd2UgZG8gbm90IHRyZWF0IHRoZSBzaG9ydCB2cyBsb25nIGZpbGVuYW1lcyBhcworICogdHdvIGhhcmQgbGlua3MgYnV0IGluc3RlYWQgaWYgdGhlIGxvb2t1cCBtYXRjaGVzIGEgc2hvcnQgZmlsZW5hbWUsIHdlCisgKiByZXR1cm4gdGhlIGRlbnRyeSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgbG9uZyBmaWxlbmFtZSBpbnN0ZWFkLgorICoKKyAqIFRoZXJlIGFyZSB0aHJlZSBjYXNlcyB3ZSBuZWVkIHRvIGRpc3Rpbmd1aXNoIGhlcmU6CisgKgorICogMSkgQGRlbnQgcGVyZmVjdGx5IG1hdGNoZXMgKGkuZS4gaW5jbHVkaW5nIGNhc2UpIGEgZGlyZWN0b3J5IGVudHJ5IHdpdGggYQorICogICAgZmlsZSBuYW1lIGluIHRoZSBXSU4zMiBvciBQT1NJWCBuYW1lc3BhY2VzLiBJbiB0aGlzIGNhc2UKKyAqICAgIG50ZnNfbG9va3VwX2lub2RlX2J5X25hbWUoKSB3aWxsIHJldHVybiB3aXRoIG5hbWUgc2V0IHRvIE5VTEwgYW5kIHdlCisgKiAgICBqdXN0IGRfc3BsaWNlX2FsaWFzKCkgQGRlbnQuCisgKiAyKSBAZGVudCBtYXRjaGVzIChub3QgaW5jbHVkaW5nIGNhc2UpIGEgZGlyZWN0b3J5IGVudHJ5IHdpdGggYSBmaWxlIG5hbWUgaW4KKyAqICAgIHRoZSBXSU4zMiBuYW1lc3BhY2UuIEluIHRoaXMgY2FzZSBudGZzX2xvb2t1cF9pbm9kZV9ieV9uYW1lKCkgd2lsbCByZXR1cm4KKyAqICAgIHdpdGggbmFtZSBzZXQgdG8gcG9pbnQgdG8gYSBrbWFsbG9jKCllZCBudGZzX25hbWUgc3RydWN0dXJlIGNvbnRhaW5pbmcKKyAqICAgIHRoZSBwcm9wZXJseSBjYXNlZCBsaXR0bGUgZW5kaWFuIFVuaWNvZGUgbmFtZS4gV2UgY29udmVydCB0aGUgbmFtZSB0byB0aGUKKyAqICAgIGN1cnJlbnQgTkxTIGNvZGUgcGFnZSwgc2VhcmNoIGlmIGEgZGVudHJ5IHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzCisgKiAgICBhbmQgaWYgc28gcmV0dXJuIHRoYXQgaW5zdGVhZCBvZiBAZGVudC4gIEF0IHRoaXMgcG9pbnQgdGhpbmdzIGFyZQorICogICAgY29tcGxpY2F0ZWQgYnkgdGhlIHBvc3NpYmlsaXR5IG9mICdkaXNjb25uZWN0ZWQnIGRlbnRyaWVzIGR1ZSB0byBORlMKKyAqICAgIHdoaWNoIHdlIGRlYWwgd2l0aCBhcHByb3ByaWF0ZWx5IChzZWUgdGhlIGNvZGUgY29tbWVudHMpLiAgVGhlIFZGUyB3aWxsCisgKiAgICB0aGVuIGRlc3Ryb3kgdGhlIG9sZCBAZGVudCBhbmQgdXNlIHRoZSBvbmUgd2UgcmV0dXJuZWQuICBJZiBhIGRlbnRyeSBpcworICogICAgbm90IGZvdW5kLCB3ZSBhbGxvY2F0ZSBhIG5ldyBvbmUsIGRfc3BsaWNlX2FsaWFzKCkgaXQsIGFuZCByZXR1cm4gaXQgYXMKKyAqICAgIGFib3ZlLgorICogMykgQGRlbnQgbWF0Y2hlcyBlaXRoZXIgcGVyZmVjdGx5IG9yIG5vdCAoaS5lLiB3ZSBkb24ndCBjYXJlIGFib3V0IGNhc2UpIGEKKyAqICAgIGRpcmVjdG9yeSBlbnRyeSB3aXRoIGEgZmlsZSBuYW1lIGluIHRoZSBET1MgbmFtZXNwYWNlLiBJbiB0aGlzIGNhc2UKKyAqICAgIG50ZnNfbG9va3VwX2lub2RlX2J5X25hbWUoKSB3aWxsIHJldHVybiB3aXRoIG5hbWUgc2V0IHRvIHBvaW50IHRvIGEKKyAqICAgIGttYWxsb2MoKWVkIG50ZnNfbmFtZSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgbWZ0IHJlZmVyZW5jZSAoY3B1IGVuZGlhbikKKyAqICAgIG9mIHRoZSBpbm9kZS4gV2UgdXNlIHRoZSBtZnQgcmVmZXJlbmNlIHRvIHJlYWQgdGhlIGlub2RlIGFuZCB0byBmaW5kIHRoZQorICogICAgZmlsZSBuYW1lIGluIHRoZSBXSU4zMiBuYW1lc3BhY2UgY29ycmVzcG9uZGluZyB0byB0aGUgbWF0Y2hlZCBzaG9ydCBmaWxlCisgKiAgICBuYW1lLiBXZSB0aGVuIGNvbnZlcnQgdGhlIG5hbWUgdG8gdGhlIGN1cnJlbnQgTkxTIGNvZGUgcGFnZSwgYW5kIHByb2NlZWQKKyAqICAgIHNlYXJjaGluZyBmb3IgYSBkZW50cnkgd2l0aCB0aGlzIG5hbWUsIGV0YywgYXMgaW4gY2FzZSAyKSwgYWJvdmUuCisgKgorICogTG9ja2luZzogQ2FsbGVyIG11c3QgaG9sZCBpX3NlbSBvbiB0aGUgZGlyZWN0b3J5LgorICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqbnRmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXJfaW5vLCBzdHJ1Y3QgZGVudHJ5ICpkZW50LAorCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwludGZzX3ZvbHVtZSAqdm9sID0gTlRGU19TQihkaXJfaW5vLT5pX3NiKTsKKwlzdHJ1Y3QgaW5vZGUgKmRlbnRfaW5vZGU7CisJbnRmc2NoYXIgKnVuYW1lOworCW50ZnNfbmFtZSAqbmFtZSA9IE5VTEw7CisJTUZUX1JFRiBtcmVmOworCXVuc2lnbmVkIGxvbmcgZGVudF9pbm87CisJaW50IHVuYW1lX2xlbjsKKworCW50ZnNfZGVidWcoIkxvb2tpbmcgdXAgJXMgaW4gZGlyZWN0b3J5IGlub2RlIDB4JWx4LiIsCisJCQlkZW50LT5kX25hbWUubmFtZSwgZGlyX2luby0+aV9pbm8pOworCS8qIENvbnZlcnQgdGhlIG5hbWUgb2YgdGhlIGRlbnRyeSB0byBVbmljb2RlLiAqLworCXVuYW1lX2xlbiA9IG50ZnNfbmxzdG91Y3Modm9sLCBkZW50LT5kX25hbWUubmFtZSwgZGVudC0+ZF9uYW1lLmxlbiwKKwkJCSZ1bmFtZSk7CisJaWYgKHVuYW1lX2xlbiA8IDApIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGNvbnZlcnQgbmFtZSB0byBVbmljb2RlLiIpOworCQlyZXR1cm4gRVJSX1BUUih1bmFtZV9sZW4pOworCX0KKwltcmVmID0gbnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZShOVEZTX0koZGlyX2lubyksIHVuYW1lLCB1bmFtZV9sZW4sCisJCQkmbmFtZSk7CisJa21lbV9jYWNoZV9mcmVlKG50ZnNfbmFtZV9jYWNoZSwgdW5hbWUpOworCWlmICghSVNfRVJSX01SRUYobXJlZikpIHsKKwkJZGVudF9pbm8gPSBNUkVGKG1yZWYpOworCQludGZzX2RlYnVnKCJGb3VuZCBpbm9kZSAweCVseC4gQ2FsbGluZyBudGZzX2lnZXQuIiwgZGVudF9pbm8pOworCQlkZW50X2lub2RlID0gbnRmc19pZ2V0KHZvbC0+c2IsIGRlbnRfaW5vKTsKKwkJaWYgKGxpa2VseSghSVNfRVJSKGRlbnRfaW5vZGUpKSkgeworCQkJLyogQ29uc2lzdGVuY3kgY2hlY2suICovCisJCQlpZiAoaXNfYmFkX2lub2RlKGRlbnRfaW5vZGUpIHx8IE1TRVFOTyhtcmVmKSA9PQorCQkJCQlOVEZTX0koZGVudF9pbm9kZSktPnNlcV9ubyB8fAorCQkJCQlkZW50X2lubyA9PSBGSUxFX01GVCkgeworCQkJCS8qIFBlcmZlY3QgV0lOMzIvUE9TSVggbWF0Y2guIC0tIENhc2UgMS4gKi8KKwkJCQlpZiAoIW5hbWUpIHsKKwkJCQkJbnRmc19kZWJ1ZygiRG9uZS4gIChDYXNlIDEuKSIpOworCQkJCQlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoZGVudF9pbm9kZSwgZGVudCk7CisJCQkJfQorCQkJCS8qCisJCQkJICogV2UgYXJlIHRvbyBpbmRlbnRlZC4gIEhhbmRsZSBpbXBlcmZlY3QKKwkJCQkgKiBtYXRjaGVzIGFuZCBzaG9ydCBmaWxlIG5hbWVzIGZ1cnRoZXIgYmVsb3cuCisJCQkJICovCisJCQkJZ290byBoYW5kbGVfbmFtZTsKKwkJCX0KKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZvdW5kIHN0YWxlIHJlZmVyZW5jZSB0byBpbm9kZSAiCisJCQkJCSIweCVseCAocmVmZXJlbmNlIHNlcXVlbmNlIG51bWJlciA9ICIKKwkJCQkJIjB4JXgsIGlub2RlIHNlcXVlbmNlIG51bWJlciA9IDB4JXgpLCAiCisJCQkJCSJyZXR1cm5pbmcgLUVJTy4gUnVuIGNoa2Rzay4iLAorCQkJCQlkZW50X2lubywgTVNFUU5PKG1yZWYpLAorCQkJCQlOVEZTX0koZGVudF9pbm9kZSktPnNlcV9ubyk7CisJCQlpcHV0KGRlbnRfaW5vZGUpOworCQkJZGVudF9pbm9kZSA9IEVSUl9QVFIoLUVJTyk7CisJCX0gZWxzZQorCQkJbnRmc19lcnJvcih2b2wtPnNiLCAibnRmc19pZ2V0KDB4JWx4KSBmYWlsZWQgd2l0aCAiCisJCQkJCSJlcnJvciBjb2RlICVsaS4iLCBkZW50X2lubywKKwkJCQkJUFRSX0VSUihkZW50X2lub2RlKSk7CisJCWlmIChuYW1lKQorCQkJa2ZyZWUobmFtZSk7CisJCS8qIFJldHVybiB0aGUgZXJyb3IgY29kZS4gKi8KKwkJcmV0dXJuIChzdHJ1Y3QgZGVudHJ5ICopZGVudF9pbm9kZTsKKwl9CisJLyogSXQgaXMgZ3VhcmFudGVlZCB0aGF0IG5hbWUgaXMgbm8gbG9uZ2VyIGFsbG9jYXRlZCBhdCB0aGlzIHBvaW50LiAqLworCWlmIChNUkVGX0VSUihtcmVmKSA9PSAtRU5PRU5UKSB7CisJCW50ZnNfZGVidWcoIkVudHJ5IHdhcyBub3QgZm91bmQsIGFkZGluZyBuZWdhdGl2ZSBkZW50cnkuIik7CisJCS8qIFRoZSBkY2FjaGUgd2lsbCBoYW5kbGUgbmVnYXRpdmUgZW50cmllcy4gKi8KKwkJZF9hZGQoZGVudCwgTlVMTCk7CisJCW50ZnNfZGVidWcoIkRvbmUuIik7CisJCXJldHVybiBOVUxMOworCX0KKwludGZzX2Vycm9yKHZvbC0+c2IsICJudGZzX2xvb2t1cF9pbm9fYnlfbmFtZSgpIGZhaWxlZCB3aXRoIGVycm9yICIKKwkJCSJjb2RlICVpLiIsIC1NUkVGX0VSUihtcmVmKSk7CisJcmV0dXJuIEVSUl9QVFIoTVJFRl9FUlIobXJlZikpOworCisJLy8gVE9ETzogQ29uc2lkZXIgbW92aW5nIHRoaXMgbG90IHRvIGEgc2VwYXJhdGUgZnVuY3Rpb24hIChBSUEpCitoYW5kbGVfbmFtZToKKyAgIHsKKwlzdHJ1Y3QgZGVudHJ5ICpyZWFsX2RlbnQsICpuZXdfZGVudDsKKwlNRlRfUkVDT1JEICptOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJbnRmc19pbm9kZSAqbmkgPSBOVEZTX0koZGVudF9pbm9kZSk7CisJaW50IGVycjsKKwlzdHJ1Y3QgcXN0ciBubHNfbmFtZTsKKworCW5sc19uYW1lLm5hbWUgPSBOVUxMOworCWlmIChuYW1lLT50eXBlICE9IEZJTEVfTkFNRV9ET1MpIHsJCQkvKiBDYXNlIDIuICovCisJCW50ZnNfZGVidWcoIkNhc2UgMi4iKTsKKwkJbmxzX25hbWUubGVuID0gKHVuc2lnbmVkKW50ZnNfdWNzdG9ubHModm9sLAorCQkJCShudGZzY2hhciopJm5hbWUtPm5hbWUsIG5hbWUtPmxlbiwKKwkJCQkodW5zaWduZWQgY2hhcioqKSZubHNfbmFtZS5uYW1lLCAwKTsKKwkJa2ZyZWUobmFtZSk7CisJfSBlbHNlIC8qIGlmIChuYW1lLT50eXBlID09IEZJTEVfTkFNRV9ET1MpICovIHsJCS8qIENhc2UgMy4gKi8KKwkJRklMRV9OQU1FX0FUVFIgKmZuOworCisJCW50ZnNfZGVidWcoIkNhc2UgMy4iKTsKKwkJa2ZyZWUobmFtZSk7CisKKwkJLyogRmluZCB0aGUgV0lOMzIgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYXRjaGVkIERPUyBuYW1lLiAqLworCQluaSA9IE5URlNfSShkZW50X2lub2RlKTsKKwkJbSA9IG1hcF9tZnRfcmVjb3JkKG5pKTsKKwkJaWYgKElTX0VSUihtKSkgeworCQkJZXJyID0gUFRSX0VSUihtKTsKKwkJCW0gPSBOVUxMOworCQkJY3R4ID0gTlVMTDsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgobmksIG0pOworCQlpZiAodW5saWtlbHkoIWN0eCkpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJZG8geworCQkJQVRUUl9SRUNPUkQgKmE7CisJCQl1MzIgdmFsX2xlbjsKKworCQkJZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9GSUxFX05BTUUsIE5VTEwsIDAsIDAsIDAsCisJCQkJCU5VTEwsIDAsIGN0eCk7CisJCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIklub2RlIGNvcnJ1cHQ6IE5vIFdJTjMyICIKKwkJCQkJCSJuYW1lc3BhY2UgY291bnRlcnBhcnQgdG8gRE9TICIKKwkJCQkJCSJmaWxlIG5hbWUuIFJ1biBjaGtkc2suIik7CisJCQkJaWYgKGVyciA9PSAtRU5PRU5UKQorCQkJCQllcnIgPSAtRUlPOworCQkJCWdvdG8gZXJyX291dDsKKwkJCX0KKwkJCS8qIENvbnNpc3RlbmN5IGNoZWNrcy4gKi8KKwkJCWEgPSBjdHgtPmF0dHI7CisJCQlpZiAoYS0+bm9uX3Jlc2lkZW50IHx8IGEtPmZsYWdzKQorCQkJCWdvdG8gZWlvX2Vycl9vdXQ7CisJCQl2YWxfbGVuID0gbGUzMl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOworCQkJaWYgKGxlMTZfdG9fY3B1KGEtPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSArCisJCQkJCXZhbF9sZW4gPiBsZTMyX3RvX2NwdShhLT5sZW5ndGgpKQorCQkJCWdvdG8gZWlvX2Vycl9vdXQ7CisJCQlmbiA9IChGSUxFX05BTUVfQVRUUiopKCh1OCopY3R4LT5hdHRyICsgbGUxNl90b19jcHUoCisJCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpKTsKKwkJCWlmICgodTMyKShmbi0+ZmlsZV9uYW1lX2xlbmd0aCAqIHNpemVvZihudGZzY2hhcikgKworCQkJCQlzaXplb2YoRklMRV9OQU1FX0FUVFIpKSA+IHZhbF9sZW4pCisJCQkJZ290byBlaW9fZXJyX291dDsKKwkJfSB3aGlsZSAoZm4tPmZpbGVfbmFtZV90eXBlICE9IEZJTEVfTkFNRV9XSU4zMik7CisKKwkJLyogQ29udmVydCB0aGUgZm91bmQgV0lOMzIgbmFtZSB0byBjdXJyZW50IE5MUyBjb2RlIHBhZ2UuICovCisJCW5sc19uYW1lLmxlbiA9ICh1bnNpZ25lZCludGZzX3Vjc3RvbmxzKHZvbCwKKwkJCQkobnRmc2NoYXIqKSZmbi0+ZmlsZV9uYW1lLCBmbi0+ZmlsZV9uYW1lX2xlbmd0aCwKKwkJCQkodW5zaWduZWQgY2hhcioqKSZubHNfbmFtZS5uYW1lLCAwKTsKKworCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwkJdW5tYXBfbWZ0X3JlY29yZChuaSk7CisJfQorCW0gPSBOVUxMOworCWN0eCA9IE5VTEw7CisKKwkvKiBDaGVjayBpZiBhIGNvbnZlcnNpb24gZXJyb3Igb2NjdXJyZWQuICovCisJaWYgKChzaWduZWQpbmxzX25hbWUubGVuIDwgMCkgeworCQllcnIgPSAoc2lnbmVkKW5sc19uYW1lLmxlbjsKKwkJZ290byBlcnJfb3V0OworCX0KKwlubHNfbmFtZS5oYXNoID0gZnVsbF9uYW1lX2hhc2gobmxzX25hbWUubmFtZSwgbmxzX25hbWUubGVuKTsKKworCS8qCisJICogTm90ZTogTm8gbmVlZCBmb3IgZGVudC0+ZF9sb2NrIGxvY2sgYXMgaV9zZW0gaXMgaGVsZCBvbiB0aGUKKwkgKiBwYXJlbnQgaW5vZGUuCisJICovCisKKwkvKiBEb2VzIGEgZGVudHJ5IG1hdGNoaW5nIHRoZSBubHNfbmFtZSBleGlzdCBhbHJlYWR5PyAqLworCXJlYWxfZGVudCA9IGRfbG9va3VwKGRlbnQtPmRfcGFyZW50LCAmbmxzX25hbWUpOworCS8qIElmIG5vdCwgY3JlYXRlIGl0IG5vdy4gKi8KKwlpZiAoIXJlYWxfZGVudCkgeworCQlyZWFsX2RlbnQgPSBkX2FsbG9jKGRlbnQtPmRfcGFyZW50LCAmbmxzX25hbWUpOworCQlrZnJlZShubHNfbmFtZS5uYW1lKTsKKwkJaWYgKCFyZWFsX2RlbnQpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJbmV3X2RlbnQgPSBkX3NwbGljZV9hbGlhcyhkZW50X2lub2RlLCByZWFsX2RlbnQpOworCQlpZiAobmV3X2RlbnQpCisJCQlkcHV0KHJlYWxfZGVudCk7CisJCWVsc2UKKwkJCW5ld19kZW50ID0gcmVhbF9kZW50OworCQludGZzX2RlYnVnKCJEb25lLiAgKENyZWF0ZWQgbmV3IGRlbnRyeS4pIik7CisJCXJldHVybiBuZXdfZGVudDsKKwl9CisJa2ZyZWUobmxzX25hbWUubmFtZSk7CisJLyogTWF0Y2hpbmcgZGVudHJ5IGV4aXN0cywgY2hlY2sgaWYgaXQgaXMgbmVnYXRpdmUuICovCisJaWYgKHJlYWxfZGVudC0+ZF9pbm9kZSkgeworCQlpZiAodW5saWtlbHkocmVhbF9kZW50LT5kX2lub2RlICE9IGRlbnRfaW5vZGUpKSB7CisJCQkvKiBUaGlzIGNhbiBoYXBwZW4gYmVjYXVzZSBiYWQgaW5vZGVzIGFyZSB1bmhhc2hlZC4gKi8KKwkJCUJVR19PTighaXNfYmFkX2lub2RlKGRlbnRfaW5vZGUpKTsKKwkJCUJVR19PTighaXNfYmFkX2lub2RlKHJlYWxfZGVudC0+ZF9pbm9kZSkpOworCQl9CisJCS8qCisJCSAqIEFscmVhZHkgaGF2ZSB0aGUgaW5vZGUgYW5kIHRoZSBkZW50cnkgYXR0YWNoZWQsIGRlY3JlbWVudAorCQkgKiB0aGUgcmVmZXJlbmNlIGNvdW50IHRvIGJhbGFuY2UgdGhlIG50ZnNfaWdldCgpIHdlIGRpZAorCQkgKiBlYXJsaWVyIG9uLiAgV2UgZm91bmQgdGhlIGRlbnRyeSB1c2luZyBkX2xvb2t1cCgpIHNvIGl0CisJCSAqIGNhbm5vdCBiZSBkaXNjb25uZWN0ZWQgYW5kIHRodXMgd2UgZG8gbm90IG5lZWQgdG8gd29ycnkKKwkJICogYWJvdXQgYW55IE5GUy9kaXNjb25uZWN0ZWRuZXNzIGlzc3VlcyBoZXJlLgorCQkgKi8KKwkJaXB1dChkZW50X2lub2RlKTsKKwkJbnRmc19kZWJ1ZygiRG9uZS4gIChBbHJlYWR5IGhhZCBpbm9kZSBhbmQgZGVudHJ5LikiKTsKKwkJcmV0dXJuIHJlYWxfZGVudDsKKwl9CisJLyoKKwkgKiBOZWdhdGl2ZSBkZW50cnk6IGluc3RhbnRpYXRlIGl0IHVubGVzcyB0aGUgaW5vZGUgaXMgYSBkaXJlY3RvcnkgYW5kCisJICogaGFzIGEgJ2Rpc2Nvbm5lY3RlZCcgZGVudHJ5IChpLmUuIElTX1JPT1QgYW5kIERDQUNIRV9ESVNDT05ORUNURUQpLAorCSAqIGluIHdoaWNoIGNhc2UgZF9tb3ZlKCkgdGhhdCBpbiBwbGFjZSBvZiB0aGUgZm91bmQgZGVudHJ5LgorCSAqLworCWlmICghU19JU0RJUihkZW50X2lub2RlLT5pX21vZGUpKSB7CisJCS8qIE5vdCBhIGRpcmVjdG9yeTsgZXZlcnl0aGluZyBpcyBlYXN5LiAqLworCQlkX2luc3RhbnRpYXRlKHJlYWxfZGVudCwgZGVudF9pbm9kZSk7CisJCW50ZnNfZGVidWcoIkRvbmUuICAoQWxyZWFkeSBoYWQgbmVnYXRpdmUgZmlsZSBkZW50cnkuKSIpOworCQlyZXR1cm4gcmVhbF9kZW50OworCX0KKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmZGVudF9pbm9kZS0+aV9kZW50cnkpKSB7CisJCS8qCisJCSAqIERpcmVjdG9yeSB3aXRob3V0IGEgJ2Rpc2Nvbm5lY3RlZCcgZGVudHJ5OyB3ZSBuZWVkIHRvIGRvCisJCSAqIGRfaW5zdGFudGlhdGUoKSBieSBoYW5kIGJlY2F1c2UgaXQgdGFrZXMgZGNhY2hlX2xvY2sgd2hpY2gKKwkJICogd2UgYWxyZWFkeSBob2xkLgorCQkgKi8KKwkJbGlzdF9hZGQoJnJlYWxfZGVudC0+ZF9hbGlhcywgJmRlbnRfaW5vZGUtPmlfZGVudHJ5KTsKKwkJcmVhbF9kZW50LT5kX2lub2RlID0gZGVudF9pbm9kZTsKKwkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJc2VjdXJpdHlfZF9pbnN0YW50aWF0ZShyZWFsX2RlbnQsIGRlbnRfaW5vZGUpOworCQludGZzX2RlYnVnKCJEb25lLiAgKEFscmVhZHkgaGFkIG5lZ2F0aXZlIGRpcmVjdG9yeSBkZW50cnkuKSIpOworCQlyZXR1cm4gcmVhbF9kZW50OworCX0KKwkvKgorCSAqIERpcmVjdG9yeSB3aXRoIGEgJ2Rpc2Nvbm5lY3RlZCcgZGVudHJ5OyBnZXQgYSByZWZlcmVuY2UgdG8gdGhlCisJICogJ2Rpc2Nvbm5lY3RlZCcgZGVudHJ5LgorCSAqLworCW5ld19kZW50ID0gbGlzdF9lbnRyeShkZW50X2lub2RlLT5pX2RlbnRyeS5uZXh0LCBzdHJ1Y3QgZGVudHJ5LAorCQkJZF9hbGlhcyk7CisJZGdldF9sb2NrZWQobmV3X2RlbnQpOworCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJLyogRG8gc2VjdXJpdHkgdm9kb28uICovCisJc2VjdXJpdHlfZF9pbnN0YW50aWF0ZShyZWFsX2RlbnQsIGRlbnRfaW5vZGUpOworCS8qIE1vdmUgbmV3X2RlbnQgaW4gcGxhY2Ugb2YgcmVhbF9kZW50LiAqLworCWRfbW92ZShuZXdfZGVudCwgcmVhbF9kZW50KTsKKwkvKiBCYWxhbmNlIHRoZSBudGZzX2lnZXQoKSB3ZSBkaWQgYWJvdmUuICovCisJaXB1dChkZW50X2lub2RlKTsKKwkvKiBUaHJvdyBhd2F5IHJlYWxfZGVudC4gKi8KKwlkcHV0KHJlYWxfZGVudCk7CisJLyogVXNlIG5ld19kZW50IGFzIHRoZSBhY3R1YWwgZGVudHJ5LiAqLworCW50ZnNfZGVidWcoIkRvbmUuICAoQWxyZWFkeSBoYWQgbmVnYXRpdmUsIGRpc2Nvbm5lY3RlZCBkaXJlY3RvcnkgIgorCQkJImRlbnRyeS4pIik7CisJcmV0dXJuIG5ld19kZW50OworCitlaW9fZXJyX291dDoKKwludGZzX2Vycm9yKHZvbC0+c2IsICJJbGxlZ2FsIGZpbGUgbmFtZSBhdHRyaWJ1dGUuIFJ1biBjaGtkc2suIik7CisJZXJyID0gLUVJTzsKK2Vycl9vdXQ6CisJaWYgKGN0eCkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJaWYgKG0pCisJCXVubWFwX21mdF9yZWNvcmQobmkpOworCWlwdXQoZGVudF9pbm9kZSk7CisJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkLCByZXR1cm5pbmcgZXJyb3IgY29kZSAlaS4iLCBlcnIpOworCXJldHVybiBFUlJfUFRSKGVycik7CisgICB9Cit9CisKKy8qKgorICogSW5vZGUgb3BlcmF0aW9ucyBmb3IgZGlyZWN0b3JpZXMuCisgKi8KK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG50ZnNfZGlyX2lub2RlX29wcyA9IHsKKwkubG9va3VwCT0gbnRmc19sb29rdXAsCS8qIFZGUzogTG9va3VwIGRpcmVjdG9yeS4gKi8KK307CisKKy8qKgorICogbnRmc19nZXRfcGFyZW50IC0gZmluZCB0aGUgZGVudHJ5IG9mIHRoZSBwYXJlbnQgb2YgYSBnaXZlbiBkaXJlY3RvcnkgZGVudHJ5CisgKiBAY2hpbGRfZGVudDoJCWRlbnRyeSBvZiB0aGUgZGlyZWN0b3J5IHdob3NlIHBhcmVudCBkaXJlY3RvcnkgdG8gZmluZAorICoKKyAqIEZpbmQgdGhlIGRlbnRyeSBmb3IgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgdGhlCisgKiBkZW50cnkgQGNoaWxkX2RlbnQuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tCisgKiBmcy9leHBvcnRmcy9leHBmcy5jOjpmaW5kX2V4cG9ydGVkX2RlbnRyeSgpIHdoaWNoIGluIHR1cm4gaXMgY2FsbGVkIGZyb20gdGhlCisgKiBkZWZhdWx0IC0+ZGVjb2RlX2ZoKCkgd2hpY2ggaXMgZXhwb3J0X2RlY29kZV9maCgpIGluIHRoZSBzYW1lIGZpbGUuCisgKgorICogVGhlIGNvZGUgaXMgYmFzZWQgb24gdGhlIGV4dDMgLT5nZXRfcGFyZW50KCkgaW1wbGVtZW50YXRpb24gZm91bmQgaW4KKyAqIGZzL2V4dDMvbmFtZWkuYzo6ZXh0M19nZXRfcGFyZW50KCkuCisgKgorICogTm90ZTogbnRmc19nZXRfcGFyZW50KCkgaXMgY2FsbGVkIHdpdGggQGNoaWxkX2RlbnQtPmRfaW5vZGUtPmlfc2VtIGRvd24uCisgKgorICogUmV0dXJuIHRoZSBkZW50cnkgb2YgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb24gc3VjY2VzcyBvciB0aGUgZXJyb3IgY29kZSBvbgorICogZXJyb3IgKElTX0VSUigpIGlzIHRydWUpLgorICovCitzdHJ1Y3QgZGVudHJ5ICpudGZzX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGRfZGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKnZpID0gY2hpbGRfZGVudC0+ZF9pbm9kZTsKKwludGZzX2lub2RlICpuaSA9IE5URlNfSSh2aSk7CisJTUZUX1JFQ09SRCAqbXJlYzsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OworCUFUVFJfUkVDT1JEICphdHRyOworCUZJTEVfTkFNRV9BVFRSICpmbjsKKwlzdHJ1Y3QgaW5vZGUgKnBhcmVudF92aTsKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnRfZGVudDsKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9pbm87CisJaW50IGVycjsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpbm9kZSAweCVseC4iLCB2aS0+aV9pbm8pOworCS8qIEdldCB0aGUgbWZ0IHJlY29yZCBvZiB0aGUgaW5vZGUgYmVsb25naW5nIHRvIHRoZSBjaGlsZCBkZW50cnkuICovCisJbXJlYyA9IG1hcF9tZnRfcmVjb3JkKG5pKTsKKwlpZiAoSVNfRVJSKG1yZWMpKQorCQlyZXR1cm4gKHN0cnVjdCBkZW50cnkgKiltcmVjOworCS8qIEZpbmQgdGhlIGZpcnN0IGZpbGUgbmFtZSBhdHRyaWJ1dGUgaW4gdGhlIG1mdCByZWNvcmQuICovCisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KG5pLCBtcmVjKTsKKwlpZiAodW5saWtlbHkoIWN0eCkpIHsKKwkJdW5tYXBfbWZ0X3JlY29yZChuaSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KK3RyeV9uZXh0OgorCWVyciA9IG50ZnNfYXR0cl9sb29rdXAoQVRfRklMRV9OQU1FLCBOVUxMLCAwLCBDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwKKwkJCTAsIGN0eCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJCXVubWFwX21mdF9yZWNvcmQobmkpOworCQlpZiAoZXJyID09IC1FTk9FTlQpCisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiSW5vZGUgMHglbHggZG9lcyBub3QgaGF2ZSBhICIKKwkJCQkJImZpbGUgbmFtZSBhdHRyaWJ1dGUuICBSdW4gY2hrZHNrLiIsCisJCQkJCXZpLT5pX2lubyk7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCWF0dHIgPSBjdHgtPmF0dHI7CisJaWYgKHVubGlrZWx5KGF0dHItPm5vbl9yZXNpZGVudCkpCisJCWdvdG8gdHJ5X25leHQ7CisJZm4gPSAoRklMRV9OQU1FX0FUVFIgKikoKHU4ICopYXR0ciArCisJCQlsZTE2X3RvX2NwdShhdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpOworCWlmICh1bmxpa2VseSgodTggKilmbiArIGxlMzJfdG9fY3B1KGF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKSA+CisJCQkodTgqKWF0dHIgKyBsZTMyX3RvX2NwdShhdHRyLT5sZW5ndGgpKSkKKwkJZ290byB0cnlfbmV4dDsKKwkvKiBHZXQgdGhlIGlub2RlIG51bWJlciBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeS4gKi8KKwlwYXJlbnRfaW5vID0gTVJFRl9MRShmbi0+cGFyZW50X2RpcmVjdG9yeSk7CisJLyogUmVsZWFzZSB0aGUgc2VhcmNoIGNvbnRleHQgYW5kIHRoZSBtZnQgcmVjb3JkIG9mIHRoZSBjaGlsZC4gKi8KKwludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwl1bm1hcF9tZnRfcmVjb3JkKG5pKTsKKwkvKiBHZXQgdGhlIGlub2RlIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5LiAqLworCXBhcmVudF92aSA9IG50ZnNfaWdldCh2aS0+aV9zYiwgcGFyZW50X2lubyk7CisJaWYgKElTX0VSUihwYXJlbnRfdmkpIHx8IHVubGlrZWx5KGlzX2JhZF9pbm9kZShwYXJlbnRfdmkpKSkgeworCQlpZiAoIUlTX0VSUihwYXJlbnRfdmkpKQorCQkJaXB1dChwYXJlbnRfdmkpOworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmFpbGVkIHRvIGdldCBwYXJlbnQgZGlyZWN0b3J5IGlub2RlICIKKwkJCQkiMHglbHggb2YgY2hpbGQgaW5vZGUgMHglbHguIiwgcGFyZW50X2lubywKKwkJCQl2aS0+aV9pbm8pOworCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKwl9CisJLyogRmluYWxseSBnZXQgYSBkZW50cnkgZm9yIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGFuZCByZXR1cm4gaXQuICovCisJcGFyZW50X2RlbnQgPSBkX2FsbG9jX2Fub24ocGFyZW50X3ZpKTsKKwlpZiAodW5saWtlbHkoIXBhcmVudF9kZW50KSkgeworCQlpcHV0KHBhcmVudF92aSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKwludGZzX2RlYnVnKCJEb25lIGZvciBpbm9kZSAweCVseC4iLCB2aS0+aV9pbm8pOworCXJldHVybiBwYXJlbnRfZGVudDsKK30KKworLyoqCisgKiBudGZzX2dldF9kZW50cnkgLSBmaW5kIGEgZGVudHJ5IGZvciB0aGUgaW5vZGUgZnJvbSBhIGZpbGUgaGFuZGxlIHN1Yi1mcmFnbWVudAorICogQHNiOgkJc3VwZXIgYmxvY2sgaWRlbnRpZnlpbmcgdGhlIG1vdW50ZWQgbnRmcyB2b2x1bWUKKyAqIEBmaDoJCXRoZSBmaWxlIGhhbmRsZSBzdWItZnJhZ21lbnQKKyAqCisgKiBGaW5kIGEgZGVudHJ5IGZvciB0aGUgaW5vZGUgZ2l2ZW4gYSBmaWxlIGhhbmRsZSBzdWItZnJhZ21lbnQuICBUaGlzIGZ1bmN0aW9uCisgKiBpcyBjYWxsZWQgZnJvbSBmcy9leHBvcnRmcy9leHBmcy5jOjpmaW5kX2V4cG9ydGVkX2RlbnRyeSgpIHdoaWNoIGluIHR1cm4gaXMKKyAqIGNhbGxlZCBmcm9tIHRoZSBkZWZhdWx0IC0+ZGVjb2RlX2ZoKCkgd2hpY2ggaXMgZXhwb3J0X2RlY29kZV9maCgpIGluIHRoZQorICogc2FtZSBmaWxlLiAgVGhlIGNvZGUgaXMgY2xvc2VseSBiYXNlZCBvbiB0aGUgZGVmYXVsdCAtPmdldF9kZW50cnkoKSBoZWxwZXIKKyAqIGZzL2V4cG9ydGZzL2V4cGZzLmM6OmdldF9vYmplY3QoKS4KKyAqCisgKiBUaGUgQGZoIGNvbnRhaW5zIHR3byAzMi1iaXQgdW5zaWduZWQgdmFsdWVzLCB0aGUgZmlyc3Qgb25lIGlzIHRoZSBpbm9kZQorICogbnVtYmVyIGFuZCB0aGUgc2Vjb25kIG9uZSBpcyB0aGUgaW5vZGUgZ2VuZXJhdGlvbi4KKyAqCisgKiBSZXR1cm4gdGhlIGRlbnRyeSBvbiBzdWNjZXNzIG9yIHRoZSBlcnJvciBjb2RlIG9uIGVycm9yIChJU19FUlIoKSBpcyB0cnVlKS4KKyAqLworc3RydWN0IGRlbnRyeSAqbnRmc19nZXRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmZoKQoreworCXN0cnVjdCBpbm9kZSAqdmk7CisJc3RydWN0IGRlbnRyeSAqZGVudDsKKwl1bnNpZ25lZCBsb25nIGlubyA9ICgodTMyICopZmgpWzBdOworCXUzMiBnZW4gPSAoKHUzMiAqKWZoKVsxXTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpbm9kZSAweCVseCwgZ2VuZXJhdGlvbiAweCV4LiIsIGlubywgZ2VuKTsKKwl2aSA9IG50ZnNfaWdldChzYiwgaW5vKTsKKwlpZiAoSVNfRVJSKHZpKSkgeworCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGdldCBpbm9kZSAweCVseC4iLCBpbm8pOworCQlyZXR1cm4gKHN0cnVjdCBkZW50cnkgKil2aTsKKwl9CisJaWYgKHVubGlrZWx5KGlzX2JhZF9pbm9kZSh2aSkgfHwgdmktPmlfZ2VuZXJhdGlvbiAhPSBnZW4pKSB7CisJCS8qIFdlIGRpZG4ndCBmaW5kIHRoZSByaWdodCBpbm9kZS4gKi8KKwkJbnRmc19lcnJvcihzYiwgIklub2RlIDB4JWx4LCBiYWQgY291bnQ6ICVkICVkIG9yIHZlcnNpb24gMHgleCAiCisJCQkJIjB4JXguIiwgdmktPmlfaW5vLCB2aS0+aV9ubGluaywKKwkJCQlhdG9taWNfcmVhZCgmdmktPmlfY291bnQpLCB2aS0+aV9nZW5lcmF0aW9uLAorCQkJCWdlbik7CisJCWlwdXQodmkpOworCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKKwl9CisJLyogTm93IGZpbmQgYSBkZW50cnkuICBJZiBwb3NzaWJsZSwgZ2V0IGEgd2VsbC1jb25uZWN0ZWQgb25lLiAqLworCWRlbnQgPSBkX2FsbG9jX2Fub24odmkpOworCWlmICh1bmxpa2VseSghZGVudCkpIHsKKwkJaXB1dCh2aSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKwludGZzX2RlYnVnKCJEb25lIGZvciBpbm9kZSAweCVseCwgZ2VuZXJhdGlvbiAweCV4LiIsIGlubywgZ2VuKTsKKwlyZXR1cm4gZGVudDsKK30KZGlmZiAtLWdpdCBhL2ZzL250ZnMvbnRmcy5oIGIvZnMvbnRmcy9udGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwZmZiNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvbnRmcy5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogbnRmcy5oIC0gRGVmaW5lcyBmb3IgTlRGUyBMaW51eCBrZXJuZWwgZHJpdmVyLiBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTCisgKgkgICAgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSaWNoYXJkIFJ1c3NvbgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfSAorI2RlZmluZSBfTElOVVhfTlRGU19ICisKKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgInZvbHVtZS5oIgorI2luY2x1ZGUgImxheW91dC5oIgorCit0eXBlZGVmIGVudW0geworCU5URlNfQkxPQ0tfU0laRQkJPSA1MTIsCisJTlRGU19CTE9DS19TSVpFX0JJVFMJPSA5LAorCU5URlNfU0JfTUFHSUMJCT0gMHg1MzQ2NTQ0ZSwJLyogJ05URlMnICovCisJTlRGU19NQVhfTkFNRV9MRU4JPSAyNTUsCit9IE5URlNfQ09OU1RBTlRTOworCisvKiBHbG9iYWwgdmFyaWFibGVzLiAqLworCisvKiBTbGFiIGNhY2hlcyAoZnJvbSBzdXBlci5jKS4gKi8KK2V4dGVybiBrbWVtX2NhY2hlX3QgKm50ZnNfbmFtZV9jYWNoZTsKK2V4dGVybiBrbWVtX2NhY2hlX3QgKm50ZnNfaW5vZGVfY2FjaGU7CitleHRlcm4ga21lbV9jYWNoZV90ICpudGZzX2JpZ19pbm9kZV9jYWNoZTsKK2V4dGVybiBrbWVtX2NhY2hlX3QgKm50ZnNfYXR0cl9jdHhfY2FjaGU7CitleHRlcm4ga21lbV9jYWNoZV90ICpudGZzX2luZGV4X2N0eF9jYWNoZTsKKworLyogVGhlIHZhcmlvdXMgb3BlcmF0aW9ucyBzdHJ1Y3RzIGRlZmluZWQgdGhyb3VnaG91dCB0aGUgZHJpdmVyIGZpbGVzLiAqLworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgbnRmc19hb3BzOworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgbnRmc19tc3RfYW9wczsKKworZXh0ZXJuIHN0cnVjdCAgZmlsZV9vcGVyYXRpb25zIG50ZnNfZmlsZV9vcHM7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbnRmc19maWxlX2lub2RlX29wczsKKworZXh0ZXJuIHN0cnVjdCAgZmlsZV9vcGVyYXRpb25zIG50ZnNfZGlyX29wczsKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBudGZzX2Rpcl9pbm9kZV9vcHM7CisKK2V4dGVybiBzdHJ1Y3QgIGZpbGVfb3BlcmF0aW9ucyBudGZzX2VtcHR5X2ZpbGVfb3BzOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG50ZnNfZW1wdHlfaW5vZGVfb3BzOworCisvKioKKyAqIE5URlNfU0IgLSByZXR1cm4gdGhlIG50ZnMgdm9sdW1lIGdpdmVuIGEgdmZzIHN1cGVyIGJsb2NrCisgKiBAc2I6CQlWRlMgc3VwZXIgYmxvY2sKKyAqCisgKiBOVEZTX1NCKCkgcmV0dXJucyB0aGUgbnRmcyB2b2x1bWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBWRlMgc3VwZXIgYmxvY2sgQHNiLgorICovCitzdGF0aWMgaW5saW5lIG50ZnNfdm9sdW1lICpOVEZTX1NCKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIHNiLT5zX2ZzX2luZm87Cit9CisKKy8qIERlY2xhcmF0aW9ucyBvZiBmdW5jdGlvbnMgYW5kIGdsb2JhbCB2YXJpYWJsZXMuICovCisKKy8qIEZyb20gZnMvbnRmcy9jb21wcmVzcy5jICovCitleHRlcm4gaW50IG50ZnNfcmVhZF9jb21wcmVzc2VkX2Jsb2NrKHN0cnVjdCBwYWdlICpwYWdlKTsKK2V4dGVybiBpbnQgYWxsb2NhdGVfY29tcHJlc3Npb25fYnVmZmVycyh2b2lkKTsKK2V4dGVybiB2b2lkIGZyZWVfY29tcHJlc3Npb25fYnVmZmVycyh2b2lkKTsKKworLyogRnJvbSBmcy9udGZzL3N1cGVyLmMgKi8KKyNkZWZpbmUgZGVmYXVsdF91cGNhc2VfbGVuIDB4MTAwMDAKK2V4dGVybiBzdHJ1Y3Qgc2VtYXBob3JlIG50ZnNfbG9jazsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB2YWw7CisJY2hhciAqc3RyOworfSBvcHRpb25fdDsKK2V4dGVybiBjb25zdCBvcHRpb25fdCBvbl9lcnJvcnNfYXJyW107CisKKy8qIEZyb20gZnMvbnRmcy9tc3QuYyAqLworZXh0ZXJuIGludCBwb3N0X3JlYWRfbXN0X2ZpeHVwKE5URlNfUkVDT1JEICpiLCBjb25zdCB1MzIgc2l6ZSk7CitleHRlcm4gaW50IHByZV93cml0ZV9tc3RfZml4dXAoTlRGU19SRUNPUkQgKmIsIGNvbnN0IHUzMiBzaXplKTsKK2V4dGVybiB2b2lkIHBvc3Rfd3JpdGVfbXN0X2ZpeHVwKE5URlNfUkVDT1JEICpiKTsKKworLyogRnJvbSBmcy9udGZzL3VuaXN0ci5jICovCitleHRlcm4gQk9PTCBudGZzX2FyZV9uYW1lc19lcXVhbChjb25zdCBudGZzY2hhciAqczEsIHNpemVfdCBzMV9sZW4sCisJCWNvbnN0IG50ZnNjaGFyICpzMiwgc2l6ZV90IHMyX2xlbiwKKwkJY29uc3QgSUdOT1JFX0NBU0VfQk9PTCBpYywKKwkJY29uc3QgbnRmc2NoYXIgKnVwY2FzZSwgY29uc3QgdTMyIHVwY2FzZV9zaXplKTsKK2V4dGVybiBpbnQgbnRmc19jb2xsYXRlX25hbWVzKGNvbnN0IG50ZnNjaGFyICpuYW1lMSwgY29uc3QgdTMyIG5hbWUxX2xlbiwKKwkJY29uc3QgbnRmc2NoYXIgKm5hbWUyLCBjb25zdCB1MzIgbmFtZTJfbGVuLAorCQljb25zdCBpbnQgZXJyX3ZhbCwgY29uc3QgSUdOT1JFX0NBU0VfQk9PTCBpYywKKwkJY29uc3QgbnRmc2NoYXIgKnVwY2FzZSwgY29uc3QgdTMyIHVwY2FzZV9sZW4pOworZXh0ZXJuIGludCBudGZzX3Vjc25jbXAoY29uc3QgbnRmc2NoYXIgKnMxLCBjb25zdCBudGZzY2hhciAqczIsIHNpemVfdCBuKTsKK2V4dGVybiBpbnQgbnRmc191Y3NuY2FzZWNtcChjb25zdCBudGZzY2hhciAqczEsIGNvbnN0IG50ZnNjaGFyICpzMiwgc2l6ZV90IG4sCisJCWNvbnN0IG50ZnNjaGFyICp1cGNhc2UsIGNvbnN0IHUzMiB1cGNhc2Vfc2l6ZSk7CitleHRlcm4gdm9pZCBudGZzX3VwY2FzZV9uYW1lKG50ZnNjaGFyICpuYW1lLCB1MzIgbmFtZV9sZW4sCisJCWNvbnN0IG50ZnNjaGFyICp1cGNhc2UsIGNvbnN0IHUzMiB1cGNhc2VfbGVuKTsKK2V4dGVybiB2b2lkIG50ZnNfZmlsZV91cGNhc2VfdmFsdWUoRklMRV9OQU1FX0FUVFIgKmZpbGVfbmFtZV9hdHRyLAorCQljb25zdCBudGZzY2hhciAqdXBjYXNlLCBjb25zdCB1MzIgdXBjYXNlX2xlbik7CitleHRlcm4gaW50IG50ZnNfZmlsZV9jb21wYXJlX3ZhbHVlcyhGSUxFX05BTUVfQVRUUiAqZmlsZV9uYW1lX2F0dHIxLAorCQlGSUxFX05BTUVfQVRUUiAqZmlsZV9uYW1lX2F0dHIyLAorCQljb25zdCBpbnQgZXJyX3ZhbCwgY29uc3QgSUdOT1JFX0NBU0VfQk9PTCBpYywKKwkJY29uc3QgbnRmc2NoYXIgKnVwY2FzZSwgY29uc3QgdTMyIHVwY2FzZV9sZW4pOworZXh0ZXJuIGludCBudGZzX25sc3RvdWNzKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsIGNvbnN0IGNoYXIgKmlucywKKwkJY29uc3QgaW50IGluc19sZW4sIG50ZnNjaGFyICoqb3V0cyk7CitleHRlcm4gaW50IG50ZnNfdWNzdG9ubHMoY29uc3QgbnRmc192b2x1bWUgKnZvbCwgY29uc3QgbnRmc2NoYXIgKmlucywKKwkJY29uc3QgaW50IGluc19sZW4sIHVuc2lnbmVkIGNoYXIgKipvdXRzLCBpbnQgb3V0c19sZW4pOworCisvKiBGcm9tIGZzL250ZnMvdXBjYXNlLmMgKi8KK2V4dGVybiBudGZzY2hhciAqZ2VuZXJhdGVfZGVmYXVsdF91cGNhc2Uodm9pZCk7CisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL3F1b3RhLmMgYi9mcy9udGZzL3F1b3RhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzZGYyYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvcXVvdGEuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIHF1b3RhLmMgLSBOVEZTIGtlcm5lbCBxdW90YSAoJFF1b3RhKSBoYW5kbGluZy4gIFBhcnQgb2YgdGhlIExpbnV4LU5URlMKKyAqCSAgICAgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmZGVmIE5URlNfUlcKKworI2luY2x1ZGUgImluZGV4LmgiCisjaW5jbHVkZSAicXVvdGEuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgIm50ZnMuaCIKKworLyoqCisgKiBudGZzX21hcmtfcXVvdGFzX291dF9vZl9kYXRlIC0gbWFyayB0aGUgcXVvdGFzIG91dCBvZiBkYXRlIG9uIGFuIG50ZnMgdm9sdW1lCisgKiBAdm9sOgludGZzIHZvbHVtZSBvbiB3aGljaCB0byBtYXJrIHRoZSBxdW90YXMgb3V0IG9mIGRhdGUKKyAqCisgKiBNYXJrIHRoZSBxdW90YXMgb3V0IG9mIGRhdGUgb24gdGhlIG50ZnMgdm9sdW1lIEB2b2wgYW5kIHJldHVybiBUUlVFIG9uCisgKiBzdWNjZXNzIGFuZCBGQUxTRSBvbiBlcnJvci4KKyAqLworQk9PTCBudGZzX21hcmtfcXVvdGFzX291dF9vZl9kYXRlKG50ZnNfdm9sdW1lICp2b2wpCit7CisJbnRmc19pbmRleF9jb250ZXh0ICppY3R4OworCVFVT1RBX0NPTlRST0xfRU5UUlkgKnFjZTsKKwljb25zdCBsZTMyIHFpZCA9IFFVT1RBX0RFRkFVTFRTX0lEOworCWludCBlcnI7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlpZiAoTlZvbFF1b3RhT3V0T2ZEYXRlKHZvbCkpCisJCWdvdG8gZG9uZTsKKwlpZiAoIXZvbC0+cXVvdGFfaW5vIHx8ICF2b2wtPnF1b3RhX3FfaW5vKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlF1b3RhIGlub2RlcyBhcmUgbm90IG9wZW4uIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJZG93bigmdm9sLT5xdW90YV9xX2luby0+aV9zZW0pOworCWljdHggPSBudGZzX2luZGV4X2N0eF9nZXQoTlRGU19JKHZvbC0+cXVvdGFfcV9pbm8pKTsKKwlpZiAoIWljdHgpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGdldCBpbmRleCBjb250ZXh0LiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWVyciA9IG50ZnNfaW5kZXhfbG9va3VwKCZxaWQsIHNpemVvZihxaWQpLCBpY3R4KTsKKwlpZiAoZXJyKSB7CisJCWlmIChlcnIgPT0gLUVOT0VOVCkKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlF1b3RhIGRlZmF1bHRzIGVudHJ5IGlzIG5vdCAiCisJCQkJCSJwcmVzZW50LiIpOworCQllbHNlCisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJMb29rdXAgb2YgcXVvdGEgZGVmYXVsdHMgZW50cnkgIgorCQkJCQkiZmFpbGVkLiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWlmIChpY3R4LT5kYXRhX2xlbiA8IG9mZnNldG9mKFFVT1RBX0NPTlRST0xfRU5UUlksIHNpZCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiUXVvdGEgZGVmYXVsdHMgZW50cnkgc2l6ZSBpcyBpbnZhbGlkLiAgIgorCQkJCSJSdW4gY2hrZHNrLiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCXFjZSA9IChRVU9UQV9DT05UUk9MX0VOVFJZKilpY3R4LT5kYXRhOworCWlmIChsZTMyX3RvX2NwdShxY2UtPnZlcnNpb24pICE9IFFVT1RBX1ZFUlNJT04pIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiUXVvdGEgZGVmYXVsdHMgZW50cnkgdmVyc2lvbiAweCV4IGlzIG5vdCAiCisJCQkJInN1cHBvcnRlZC4iLCBsZTMyX3RvX2NwdShxY2UtPnZlcnNpb24pKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwludGZzX2RlYnVnKCJRdW90YSBkZWZhdWx0cyBmbGFncyA9IDB4JXguIiwgbGUzMl90b19jcHUocWNlLT5mbGFncykpOworCS8qIElmIHF1b3RhcyBhcmUgYWxyZWFkeSBtYXJrZWQgb3V0IG9mIGRhdGUsIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcuICovCisJaWYgKHFjZS0+ZmxhZ3MgJiBRVU9UQV9GTEFHX09VVF9PRl9EQVRFKQorCQlnb3RvIHNldF9kb25lOworCS8qCisJICogSWYgcXVvdGEgdHJhY2tpbmcgaXMgbmVpdGhlciByZXF1ZXN0ZWQsIG5vciBlbmFibGVkIGFuZCB0aGVyZSBhcmUgbm8KKwkgKiBwZW5kaW5nIGRlbGV0ZXMsIG5vIG5lZWQgdG8gbWFyayB0aGUgcXVvdGFzIG91dCBvZiBkYXRlLgorCSAqLworCWlmICghKHFjZS0+ZmxhZ3MgJiAoUVVPVEFfRkxBR19UUkFDS0lOR19FTkFCTEVEIHwKKwkJCVFVT1RBX0ZMQUdfVFJBQ0tJTkdfUkVRVUVTVEVEIHwKKwkJCVFVT1RBX0ZMQUdfUEVORElOR19ERUxFVEVTKSkpCisJCWdvdG8gc2V0X2RvbmU7CisJLyoKKwkgKiBTZXQgdGhlIFFVT1RBX0ZMQUdfT1VUX09GX0RBVEUgYml0IHRodXMgbWFya2luZyBxdW90YXMgb3V0IG9mIGRhdGUuCisJICogVGhpcyBpcyB2ZXJpZmllZCBvbiBXaW5YUCB0byBiZSBzdWZmaWNpZW50IHRvIGNhdXNlIHdpbmRvd3MgdG8KKwkgKiByZXNjYW4gdGhlIHZvbHVtZSBvbiBib290IGFuZCB1cGRhdGUgYWxsIHF1b3RhIGVudHJpZXMuCisJICovCisJcWNlLT5mbGFncyB8PSBRVU9UQV9GTEFHX09VVF9PRl9EQVRFOworCS8qIEVuc3VyZSB0aGUgbW9kaWZpZWQgZmxhZ3MgYXJlIHdyaXR0ZW4gdG8gZGlzay4gKi8KKwludGZzX2luZGV4X2VudHJ5X2ZsdXNoX2RjYWNoZV9wYWdlKGljdHgpOworCW50ZnNfaW5kZXhfZW50cnlfbWFya19kaXJ0eShpY3R4KTsKK3NldF9kb25lOgorCW50ZnNfaW5kZXhfY3R4X3B1dChpY3R4KTsKKwl1cCgmdm9sLT5xdW90YV9xX2luby0+aV9zZW0pOworCS8qCisJICogV2Ugc2V0IHRoZSBmbGFnIHNvIHdlIGRvIG5vdCB0cnkgdG8gbWFyayB0aGUgcXVvdGFzIG91dCBvZiBkYXRlCisJICogYWdhaW4gb24gcmVtb3VudC4KKwkgKi8KKwlOVm9sU2V0UXVvdGFPdXRPZkRhdGUodm9sKTsKK2RvbmU6CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gVFJVRTsKK2Vycl9vdXQ6CisJaWYgKGljdHgpCisJCW50ZnNfaW5kZXhfY3R4X3B1dChpY3R4KTsKKwl1cCgmdm9sLT5xdW90YV9xX2luby0+aV9zZW0pOworCXJldHVybiBGQUxTRTsKK30KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvcXVvdGEuaCBiL2ZzL250ZnMvcXVvdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGU0NzYzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9xdW90YS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBxdW90YS5oIC0gRGVmaW5lcyBmb3IgTlRGUyBrZXJuZWwgcXVvdGEgKCRRdW90YSkgaGFuZGxpbmcuICBQYXJ0IG9mIHRoZQorICoJICAgICBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfUVVPVEFfSAorI2RlZmluZSBfTElOVVhfTlRGU19RVU9UQV9ICisKKyNpZmRlZiBOVEZTX1JXCisKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgInZvbHVtZS5oIgorCitleHRlcm4gQk9PTCBudGZzX21hcmtfcXVvdGFzX291dF9vZl9kYXRlKG50ZnNfdm9sdW1lICp2b2wpOworCisjZW5kaWYgLyogTlRGU19SVyAqLworCisjZW5kaWYgLyogX0xJTlVYX05URlNfUVVPVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9ydW5saXN0LmMgYi9mcy9udGZzL3J1bmxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDM4ZmIxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9ydW5saXN0LmMKQEAgLTAsMCArMSwxNDM4IEBACisvKioKKyAqIHJ1bmxpc3QuYyAtIE5URlMgcnVubGlzdCBoYW5kbGluZyBjb2RlLiAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiZGlyLmgiCisjaW5jbHVkZSAiZW5kaWFuLmgiCisjaW5jbHVkZSAibWFsbG9jLmgiCisjaW5jbHVkZSAibnRmcy5oIgorCisvKioKKyAqIG50ZnNfcmxfbW0gLSBydW5saXN0IG1lbW1vdmUKKyAqCisgKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHJ1bmxpc3QgQGJhc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBudGZzX3JsX21tKHJ1bmxpc3RfZWxlbWVudCAqYmFzZSwgaW50IGRzdCwgaW50IHNyYywKKwkJaW50IHNpemUpCit7CisJaWYgKGxpa2VseSgoZHN0ICE9IHNyYykgJiYgKHNpemUgPiAwKSkpCisJCW1lbW1vdmUoYmFzZSArIGRzdCwgYmFzZSArIHNyYywgc2l6ZSAqIHNpemVvZiAoKmJhc2UpKTsKK30KKworLyoqCisgKiBudGZzX3JsX21jIC0gcnVubGlzdCBtZW1vcnkgY29weQorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdHMgQGRzdGJhc2UgYW5kCisgKiBAc3JjYmFzZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG50ZnNfcmxfbWMocnVubGlzdF9lbGVtZW50ICpkc3RiYXNlLCBpbnQgZHN0LAorCQlydW5saXN0X2VsZW1lbnQgKnNyY2Jhc2UsIGludCBzcmMsIGludCBzaXplKQoreworCWlmIChsaWtlbHkoc2l6ZSA+IDApKQorCQltZW1jcHkoZHN0YmFzZSArIGRzdCwgc3JjYmFzZSArIHNyYywgc2l6ZSAqIHNpemVvZigqZHN0YmFzZSkpOworfQorCisvKioKKyAqIG50ZnNfcmxfcmVhbGxvYyAtIFJlYWxsb2NhdGUgbWVtb3J5IGZvciBydW5saXN0cworICogQHJsOgkJb3JpZ2luYWwgcnVubGlzdAorICogQG9sZF9zaXplOgludW1iZXIgb2YgcnVubGlzdCBlbGVtZW50cyBpbiB0aGUgb3JpZ2luYWwgcnVubGlzdCBAcmwKKyAqIEBuZXdfc2l6ZToJbnVtYmVyIG9mIHJ1bmxpc3QgZWxlbWVudHMgd2UgbmVlZCBzcGFjZSBmb3IKKyAqCisgKiBBcyB0aGUgcnVubGlzdHMgZ3JvdywgbW9yZSBtZW1vcnkgd2lsbCBiZSByZXF1aXJlZC4gIFRvIHByZXZlbnQgdGhlCisgKiBrZXJuZWwgaGF2aW5nIHRvIGFsbG9jYXRlIGFuZCByZWFsbG9jYXRlIGxhcmdlIG51bWJlcnMgb2Ygc21hbGwgYml0cyBvZgorICogbWVtb3J5LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW5kIGVudGlyZSBwYWdlIG9mIG1lbW9yeS4KKyAqCisgKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHJ1bmxpc3QgQHJsLgorICoKKyAqIE4uQi4gIElmIHRoZSBuZXcgYWxsb2NhdGlvbiBkb2Vzbid0IHJlcXVpcmUgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIHBhZ2VzIGluCisgKiAgICAgICBtZW1vcnksIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgb3JpZ2luYWwgcG9pbnRlci4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXdseSBhbGxvY2F0ZWQsIG9yIHJlY3ljbGVkLCBtZW1vcnkuCisgKiBPbiBlcnJvciwgcmV0dXJuIC1lcnJuby4gVGhlIGZvbGxvd2luZyBlcnJvciBjb2RlcyBhcmUgZGVmaW5lZDoKKyAqCS1FTk9NRU0JLSBOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBydW5saXN0IGFycmF5LgorICoJLUVJTlZBTAktIEludmFsaWQgcGFyYW1ldGVycyB3ZXJlIHBhc3NlZCBpbi4KKyAqLworc3RhdGljIGlubGluZSBydW5saXN0X2VsZW1lbnQgKm50ZnNfcmxfcmVhbGxvYyhydW5saXN0X2VsZW1lbnQgKnJsLAorCQlpbnQgb2xkX3NpemUsIGludCBuZXdfc2l6ZSkKK3sKKwlydW5saXN0X2VsZW1lbnQgKm5ld19ybDsKKworCW9sZF9zaXplID0gUEFHRV9BTElHTihvbGRfc2l6ZSAqIHNpemVvZigqcmwpKTsKKwluZXdfc2l6ZSA9IFBBR0VfQUxJR04obmV3X3NpemUgKiBzaXplb2YoKnJsKSk7CisJaWYgKG9sZF9zaXplID09IG5ld19zaXplKQorCQlyZXR1cm4gcmw7CisKKwluZXdfcmwgPSBudGZzX21hbGxvY19ub2ZzKG5ld19zaXplKTsKKwlpZiAodW5saWtlbHkoIW5ld19ybCkpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKGxpa2VseShybCAhPSBOVUxMKSkgeworCQlpZiAodW5saWtlbHkob2xkX3NpemUgPiBuZXdfc2l6ZSkpCisJCQlvbGRfc2l6ZSA9IG5ld19zaXplOworCQltZW1jcHkobmV3X3JsLCBybCwgb2xkX3NpemUpOworCQludGZzX2ZyZWUocmwpOworCX0KKwlyZXR1cm4gbmV3X3JsOworfQorCisvKioKKyAqIG50ZnNfYXJlX3JsX21lcmdlYWJsZSAtIHRlc3QgaWYgdHdvIHJ1bmxpc3RzIGNhbiBiZSBqb2luZWQgdG9nZXRoZXIKKyAqIEBkc3Q6CW9yaWdpbmFsIHJ1bmxpc3QKKyAqIEBzcmM6CW5ldyBydW5saXN0IHRvIHRlc3QgZm9yIG1lcmdlYWJpbGl0eSB3aXRoIEBkc3QKKyAqCisgKiBUZXN0IGlmIHR3byBydW5saXN0cyBjYW4gYmUgam9pbmVkIHRvZ2V0aGVyLiBGb3IgdGhpcywgdGhlaXIgVkNOcyBhbmQgTENOcworICogbXVzdCBiZSBhZGphY2VudC4KKyAqCisgKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHJ1bmxpc3RzIEBkc3QgYW5kIEBzcmMuCisgKgorICogUmV0dXJuOiBUUlVFICAgU3VjY2VzcywgdGhlIHJ1bmxpc3RzIGNhbiBiZSBtZXJnZWQuCisgKgkgICBGQUxTRSAgRmFpbHVyZSwgdGhlIHJ1bmxpc3RzIGNhbm5vdCBiZSBtZXJnZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgQk9PTCBudGZzX2FyZV9ybF9tZXJnZWFibGUocnVubGlzdF9lbGVtZW50ICpkc3QsCisJCXJ1bmxpc3RfZWxlbWVudCAqc3JjKQoreworCUJVR19PTighZHN0KTsKKwlCVUdfT04oIXNyYyk7CisKKwlpZiAoKGRzdC0+bGNuIDwgMCkgfHwgKHNyYy0+bGNuIDwgMCkpICAgICAvKiBBcmUgd2UgbWVyZ2luZyBob2xlcz8gKi8KKwkJcmV0dXJuIEZBTFNFOworCWlmICgoZHN0LT5sY24gKyBkc3QtPmxlbmd0aCkgIT0gc3JjLT5sY24pIC8qIEFyZSB0aGUgcnVucyBjb250aWd1b3VzPyAqLworCQlyZXR1cm4gRkFMU0U7CisJaWYgKChkc3QtPnZjbiArIGRzdC0+bGVuZ3RoKSAhPSBzcmMtPnZjbikgLyogQXJlIHRoZSBydW5zIG1pc2FsaWduZWQ/ICovCisJCXJldHVybiBGQUxTRTsKKworCXJldHVybiBUUlVFOworfQorCisvKioKKyAqIF9fbnRmc19ybF9tZXJnZSAtIG1lcmdlIHR3byBydW5saXN0cyB3aXRob3V0IHRlc3RpbmcgaWYgdGhleSBjYW4gYmUgbWVyZ2VkCisgKiBAZHN0OglvcmlnaW5hbCwgZGVzdGluYXRpb24gcnVubGlzdAorICogQHNyYzoJbmV3IHJ1bmxpc3QgdG8gbWVyZ2Ugd2l0aCBAZHN0CisgKgorICogTWVyZ2UgdGhlIHR3byBydW5saXN0cywgd3JpdGluZyBpbnRvIHRoZSBkZXN0aW5hdGlvbiBydW5saXN0IEBkc3QuIFRoZQorICogY2FsbGVyIG11c3QgbWFrZSBzdXJlIHRoZSBydW5saXN0cyBjYW4gYmUgbWVyZ2VkIG9yIHRoaXMgd2lsbCBjb3JydXB0IHRoZQorICogZGVzdGluYXRpb24gcnVubGlzdC4KKyAqCisgKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHJ1bmxpc3RzIEBkc3QgYW5kIEBzcmMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX250ZnNfcmxfbWVyZ2UocnVubGlzdF9lbGVtZW50ICpkc3QsIHJ1bmxpc3RfZWxlbWVudCAqc3JjKQoreworCWRzdC0+bGVuZ3RoICs9IHNyYy0+bGVuZ3RoOworfQorCisvKioKKyAqIG50ZnNfcmxfYXBwZW5kIC0gYXBwZW5kIGEgcnVubGlzdCBhZnRlciBhIGdpdmVuIGVsZW1lbnQKKyAqIEBkc3Q6CW9yaWdpbmFsIHJ1bmxpc3QgdG8gYmUgd29ya2VkIG9uCisgKiBAZHNpemU6CW51bWJlciBvZiBlbGVtZW50cyBpbiBAZHN0IChpbmNsdWRpbmcgZW5kIG1hcmtlcikKKyAqIEBzcmM6CXJ1bmxpc3QgdG8gYmUgaW5zZXJ0ZWQgaW50byBAZHN0CisgKiBAc3NpemU6CW51bWJlciBvZiBlbGVtZW50cyBpbiBAc3JjIChleGNsdWRpbmcgZW5kIG1hcmtlcikKKyAqIEBsb2M6CWFwcGVuZCB0aGUgbmV3IHJ1bmxpc3QgQHNyYyBhZnRlciB0aGlzIGVsZW1lbnQgaW4gQGRzdAorICoKKyAqIEFwcGVuZCB0aGUgcnVubGlzdCBAc3JjIGFmdGVyIGVsZW1lbnQgQGxvYyBpbiBAZHN0LiAgTWVyZ2UgdGhlIHJpZ2h0IGVuZCBvZgorICogdGhlIG5ldyBydW5saXN0LCBpZiBuZWNlc3NhcnkuIEFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgaG9sZSBiZWZvcmUgdGhlCisgKiBhcHBlbmRlZCBydW5saXN0LgorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdHMgQGRzdCBhbmQgQHNyYy4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXcsIGNvbWJpbmVkLCBydW5saXN0LiBOb3RlLCBib3RoCisgKiBydW5saXN0cyBAZHN0IGFuZCBAc3JjIGFyZSBkZWFsbG9jYXRlZCBiZWZvcmUgcmV0dXJuaW5nIHNvIHlvdSBjYW5ub3QgdXNlCisgKiB0aGUgcG9pbnRlcnMgZm9yIGFueXRoaW5nIGFueSBtb3JlLiAoU3RyaWN0bHkgc3BlYWtpbmcgdGhlIHJldHVybmVkIHJ1bmxpc3QKKyAqIG1heSBiZSB0aGUgc2FtZSBhcyBAZHN0IGJ1dCB0aGlzIGlzIGlycmVsZXZhbnQuKQorICoKKyAqIE9uIGVycm9yLCByZXR1cm4gLWVycm5vLiBCb3RoIHJ1bmxpc3RzIGFyZSBsZWZ0IHVubW9kaWZpZWQuIFRoZSBmb2xsb3dpbmcKKyAqIGVycm9yIGNvZGVzIGFyZSBkZWZpbmVkOgorICoJLUVOT01FTQktIE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHJ1bmxpc3QgYXJyYXkuCisgKgktRUlOVkFMCS0gSW52YWxpZCBwYXJhbWV0ZXJzIHdlcmUgcGFzc2VkIGluLgorICovCitzdGF0aWMgaW5saW5lIHJ1bmxpc3RfZWxlbWVudCAqbnRmc19ybF9hcHBlbmQocnVubGlzdF9lbGVtZW50ICpkc3QsCisJCWludCBkc2l6ZSwgcnVubGlzdF9lbGVtZW50ICpzcmMsIGludCBzc2l6ZSwgaW50IGxvYykKK3sKKwlCT09MIHJpZ2h0OworCWludCBtYWdpYzsKKworCUJVR19PTighZHN0KTsKKwlCVUdfT04oIXNyYyk7CisKKwkvKiBGaXJzdCwgY2hlY2sgaWYgdGhlIHJpZ2h0IGhhbmQgZW5kIG5lZWRzIG1lcmdpbmcuICovCisJcmlnaHQgPSBudGZzX2FyZV9ybF9tZXJnZWFibGUoc3JjICsgc3NpemUgLSAxLCBkc3QgKyBsb2MgKyAxKTsKKworCS8qIFNwYWNlIHJlcXVpcmVkOiBAZHN0IHNpemUgKyBAc3JjIHNpemUsIGxlc3Mgb25lIGlmIHdlIG1lcmdlZC4gKi8KKwlkc3QgPSBudGZzX3JsX3JlYWxsb2MoZHN0LCBkc2l6ZSwgZHNpemUgKyBzc2l6ZSAtIHJpZ2h0KTsKKwlpZiAoSVNfRVJSKGRzdCkpCisJCXJldHVybiBkc3Q7CisJLyoKKwkgKiBXZSBhcmUgZ3VhcmFudGVlZCB0byBzdWNjZWVkIGZyb20gaGVyZSBzbyBjYW4gc3RhcnQgbW9kaWZ5aW5nIHRoZQorCSAqIG9yaWdpbmFsIHJ1bmxpc3RzLgorCSAqLworCisJLyogRmlyc3QsIG1lcmdlIHRoZSByaWdodCBoYW5kIGVuZCwgaWYgbmVjZXNzYXJ5LiAqLworCWlmIChyaWdodCkKKwkJX19udGZzX3JsX21lcmdlKHNyYyArIHNzaXplIC0gMSwgZHN0ICsgbG9jICsgMSk7CisKKwltYWdpYyA9IGxvYyArIHNzaXplOworCisJLyogTW92ZSB0aGUgdGFpbCBvZiBAZHN0IG91dCBvZiB0aGUgd2F5LCB0aGVuIGNvcHkgaW4gQHNyYy4gKi8KKwludGZzX3JsX21tKGRzdCwgbWFnaWMgKyAxLCBsb2MgKyAxICsgcmlnaHQsIGRzaXplIC0gbG9jIC0gMSAtIHJpZ2h0KTsKKwludGZzX3JsX21jKGRzdCwgbG9jICsgMSwgc3JjLCAwLCBzc2l6ZSk7CisKKwkvKiBBZGp1c3QgdGhlIHNpemUgb2YgdGhlIHByZWNlZGluZyBob2xlLiAqLworCWRzdFtsb2NdLmxlbmd0aCA9IGRzdFtsb2MgKyAxXS52Y24gLSBkc3RbbG9jXS52Y247CisKKwkvKiBXZSBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBsZW5ndGggb2YgdGhlIGZpbGUsIHNvIGZpeCB0aGUgZW5kIG1hcmtlciAqLworCWlmIChkc3RbbWFnaWMgKyAxXS5sY24gPT0gTENOX0VOT0VOVCkKKwkJZHN0W21hZ2ljICsgMV0udmNuID0gZHN0W21hZ2ljXS52Y24gKyBkc3RbbWFnaWNdLmxlbmd0aDsKKworCXJldHVybiBkc3Q7Cit9CisKKy8qKgorICogbnRmc19ybF9pbnNlcnQgLSBpbnNlcnQgYSBydW5saXN0IGludG8gYW5vdGhlcgorICogQGRzdDoJb3JpZ2luYWwgcnVubGlzdCB0byBiZSB3b3JrZWQgb24KKyAqIEBkc2l6ZToJbnVtYmVyIG9mIGVsZW1lbnRzIGluIEBkc3QgKGluY2x1ZGluZyBlbmQgbWFya2VyKQorICogQHNyYzoJbmV3IHJ1bmxpc3QgdG8gYmUgaW5zZXJ0ZWQKKyAqIEBzc2l6ZToJbnVtYmVyIG9mIGVsZW1lbnRzIGluIEBzcmMgKGV4Y2x1ZGluZyBlbmQgbWFya2VyKQorICogQGxvYzoJaW5zZXJ0IHRoZSBuZXcgcnVubGlzdCBAc3JjIGJlZm9yZSB0aGlzIGVsZW1lbnQgaW4gQGRzdAorICoKKyAqIEluc2VydCB0aGUgcnVubGlzdCBAc3JjIGJlZm9yZSBlbGVtZW50IEBsb2MgaW4gdGhlIHJ1bmxpc3QgQGRzdC4gTWVyZ2UgdGhlCisgKiBsZWZ0IGVuZCBvZiB0aGUgbmV3IHJ1bmxpc3QsIGlmIG5lY2Vzc2FyeS4gQWRqdXN0IHRoZSBzaXplIG9mIHRoZSBob2xlCisgKiBhZnRlciB0aGUgaW5zZXJ0ZWQgcnVubGlzdC4KKyAqCisgKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHJ1bmxpc3RzIEBkc3QgYW5kIEBzcmMuCisgKgorICogT24gc3VjY2VzcywgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbmV3LCBjb21iaW5lZCwgcnVubGlzdC4gTm90ZSwgYm90aAorICogcnVubGlzdHMgQGRzdCBhbmQgQHNyYyBhcmUgZGVhbGxvY2F0ZWQgYmVmb3JlIHJldHVybmluZyBzbyB5b3UgY2Fubm90IHVzZQorICogdGhlIHBvaW50ZXJzIGZvciBhbnl0aGluZyBhbnkgbW9yZS4gKFN0cmljdGx5IHNwZWFraW5nIHRoZSByZXR1cm5lZCBydW5saXN0CisgKiBtYXkgYmUgdGhlIHNhbWUgYXMgQGRzdCBidXQgdGhpcyBpcyBpcnJlbGV2YW50LikKKyAqCisgKiBPbiBlcnJvciwgcmV0dXJuIC1lcnJuby4gQm90aCBydW5saXN0cyBhcmUgbGVmdCB1bm1vZGlmaWVkLiBUaGUgZm9sbG93aW5nCisgKiBlcnJvciBjb2RlcyBhcmUgZGVmaW5lZDoKKyAqCS1FTk9NRU0JLSBOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBydW5saXN0IGFycmF5LgorICoJLUVJTlZBTAktIEludmFsaWQgcGFyYW1ldGVycyB3ZXJlIHBhc3NlZCBpbi4KKyAqLworc3RhdGljIGlubGluZSBydW5saXN0X2VsZW1lbnQgKm50ZnNfcmxfaW5zZXJ0KHJ1bmxpc3RfZWxlbWVudCAqZHN0LAorCQlpbnQgZHNpemUsIHJ1bmxpc3RfZWxlbWVudCAqc3JjLCBpbnQgc3NpemUsIGludCBsb2MpCit7CisJQk9PTCBsZWZ0ID0gRkFMU0U7CisJQk9PTCBkaXNjID0gRkFMU0U7CS8qIERpc2NvbnRpbnVpdHkgKi8KKwlCT09MIGhvbGUgPSBGQUxTRTsJLyogRm9sbG93aW5nIGEgaG9sZSAqLworCWludCBtYWdpYzsKKworCUJVR19PTighZHN0KTsKKwlCVUdfT04oIXNyYyk7CisKKwkvKiBkaXNjID0+IERpc2NvbnRpbnVpdHkgYmV0d2VlbiB0aGUgZW5kIG9mIEBkc3QgYW5kIHRoZSBzdGFydCBvZiBAc3JjLgorCSAqCSAgIFRoaXMgbWVhbnMgd2UgbWlnaHQgbmVlZCB0byBpbnNlcnQgYSBob2xlLgorCSAqIGhvbGUgPT4gQGRzdCBlbmRzIHdpdGggYSBob2xlIG9yIGFuIHVubWFwcGVkIHJlZ2lvbiB3aGljaCB3ZSBjYW4KKwkgKgkgICBleHRlbmQgdG8gbWF0Y2ggdGhlIGRpc2NvbnRpbnVpdHkuICovCisJaWYgKGxvYyA9PSAwKQorCQlkaXNjID0gKHNyY1swXS52Y24gPiAwKTsKKwllbHNlIHsKKwkJczY0IG1lcmdlZF9sZW5ndGg7CisKKwkJbGVmdCA9IG50ZnNfYXJlX3JsX21lcmdlYWJsZShkc3QgKyBsb2MgLSAxLCBzcmMpOworCisJCW1lcmdlZF9sZW5ndGggPSBkc3RbbG9jIC0gMV0ubGVuZ3RoOworCQlpZiAobGVmdCkKKwkJCW1lcmdlZF9sZW5ndGggKz0gc3JjLT5sZW5ndGg7CisKKwkJZGlzYyA9IChzcmNbMF0udmNuID4gZHN0W2xvYyAtIDFdLnZjbiArIG1lcmdlZF9sZW5ndGgpOworCQlpZiAoZGlzYykKKwkJCWhvbGUgPSAoZHN0W2xvYyAtIDFdLmxjbiA9PSBMQ05fSE9MRSk7CisJfQorCisJLyogU3BhY2UgcmVxdWlyZWQ6IEBkc3Qgc2l6ZSArIEBzcmMgc2l6ZSwgbGVzcyBvbmUgaWYgd2UgbWVyZ2VkLCBwbHVzCisJICogb25lIGlmIHRoZXJlIHdhcyBhIGRpc2NvbnRpbnVpdHksIGxlc3Mgb25lIGZvciBhIHRyYWlsaW5nIGhvbGUuICovCisJZHN0ID0gbnRmc19ybF9yZWFsbG9jKGRzdCwgZHNpemUsIGRzaXplICsgc3NpemUgLSBsZWZ0ICsgZGlzYyAtIGhvbGUpOworCWlmIChJU19FUlIoZHN0KSkKKwkJcmV0dXJuIGRzdDsKKwkvKgorCSAqIFdlIGFyZSBndWFyYW50ZWVkIHRvIHN1Y2NlZWQgZnJvbSBoZXJlIHNvIGNhbiBzdGFydCBtb2RpZnlpbmcgdGhlCisJICogb3JpZ2luYWwgcnVubGlzdC4KKwkgKi8KKworCWlmIChsZWZ0KQorCQlfX250ZnNfcmxfbWVyZ2UoZHN0ICsgbG9jIC0gMSwgc3JjKTsKKworCW1hZ2ljID0gbG9jICsgc3NpemUgLSBsZWZ0ICsgZGlzYyAtIGhvbGU7CisKKwkvKiBNb3ZlIHRoZSB0YWlsIG9mIEBkc3Qgb3V0IG9mIHRoZSB3YXksIHRoZW4gY29weSBpbiBAc3JjLiAqLworCW50ZnNfcmxfbW0oZHN0LCBtYWdpYywgbG9jLCBkc2l6ZSAtIGxvYyk7CisJbnRmc19ybF9tYyhkc3QsIGxvYyArIGRpc2MgLSBob2xlLCBzcmMsIGxlZnQsIHNzaXplIC0gbGVmdCk7CisKKwkvKiBBZGp1c3QgdGhlIFZDTiBvZiB0aGUgbGFzdCBydW4gLi4uICovCisJaWYgKGRzdFttYWdpY10ubGNuIDw9IExDTl9IT0xFKQorCQlkc3RbbWFnaWNdLnZjbiA9IGRzdFttYWdpYyAtIDFdLnZjbiArIGRzdFttYWdpYyAtIDFdLmxlbmd0aDsKKwkvKiAuLi4gYW5kIHRoZSBsZW5ndGguICovCisJaWYgKGRzdFttYWdpY10ubGNuID09IExDTl9IT0xFIHx8IGRzdFttYWdpY10ubGNuID09IExDTl9STF9OT1RfTUFQUEVEKQorCQlkc3RbbWFnaWNdLmxlbmd0aCA9IGRzdFttYWdpYyArIDFdLnZjbiAtIGRzdFttYWdpY10udmNuOworCisJLyogV3JpdGluZyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgdGhlcmUncyBhIGRpc2NvbnRpbnVpdHkuICovCisJaWYgKGRpc2MpIHsKKwkJaWYgKGhvbGUpCisJCQlkc3RbbG9jIC0gMV0ubGVuZ3RoID0gZHN0W2xvY10udmNuIC0gZHN0W2xvYyAtIDFdLnZjbjsKKwkJZWxzZSB7CisJCQlpZiAobG9jID4gMCkgeworCQkJCWRzdFtsb2NdLnZjbiA9IGRzdFtsb2MgLSAxXS52Y24gKworCQkJCQkJZHN0W2xvYyAtIDFdLmxlbmd0aDsKKwkJCQlkc3RbbG9jXS5sZW5ndGggPSBkc3RbbG9jICsgMV0udmNuIC0KKwkJCQkJCWRzdFtsb2NdLnZjbjsKKwkJCX0gZWxzZSB7CisJCQkJZHN0W2xvY10udmNuID0gMDsKKwkJCQlkc3RbbG9jXS5sZW5ndGggPSBkc3RbbG9jICsgMV0udmNuOworCQkJfQorCQkJZHN0W2xvY10ubGNuID0gTENOX1JMX05PVF9NQVBQRUQ7CisJCX0KKworCQltYWdpYyArPSBob2xlOworCisJCWlmIChkc3RbbWFnaWNdLmxjbiA9PSBMQ05fRU5PRU5UKQorCQkJZHN0W21hZ2ljXS52Y24gPSBkc3RbbWFnaWMgLSAxXS52Y24gKworCQkJCQlkc3RbbWFnaWMgLSAxXS5sZW5ndGg7CisJfQorCXJldHVybiBkc3Q7Cit9CisKKy8qKgorICogbnRmc19ybF9yZXBsYWNlIC0gb3ZlcndyaXRlIGEgcnVubGlzdCBlbGVtZW50IHdpdGggYW5vdGhlciBydW5saXN0CisgKiBAZHN0OglvcmlnaW5hbCBydW5saXN0IHRvIGJlIHdvcmtlZCBvbgorICogQGRzaXplOgludW1iZXIgb2YgZWxlbWVudHMgaW4gQGRzdCAoaW5jbHVkaW5nIGVuZCBtYXJrZXIpCisgKiBAc3JjOgluZXcgcnVubGlzdCB0byBiZSBpbnNlcnRlZAorICogQHNzaXplOgludW1iZXIgb2YgZWxlbWVudHMgaW4gQHNyYyAoZXhjbHVkaW5nIGVuZCBtYXJrZXIpCisgKiBAbG9jOglpbmRleCBpbiBydW5saXN0IEBkc3QgdG8gb3ZlcndyaXRlIHdpdGggQHNyYworICoKKyAqIFJlcGxhY2UgdGhlIHJ1bmxpc3QgZWxlbWVudCBAZHN0IGF0IEBsb2Mgd2l0aCBAc3JjLiBNZXJnZSB0aGUgbGVmdCBhbmQKKyAqIHJpZ2h0IGVuZHMgb2YgdGhlIGluc2VydGVkIHJ1bmxpc3QsIGlmIG5lY2Vzc2FyeS4KKyAqCisgKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHJ1bmxpc3RzIEBkc3QgYW5kIEBzcmMuCisgKgorICogT24gc3VjY2VzcywgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbmV3LCBjb21iaW5lZCwgcnVubGlzdC4gTm90ZSwgYm90aAorICogcnVubGlzdHMgQGRzdCBhbmQgQHNyYyBhcmUgZGVhbGxvY2F0ZWQgYmVmb3JlIHJldHVybmluZyBzbyB5b3UgY2Fubm90IHVzZQorICogdGhlIHBvaW50ZXJzIGZvciBhbnl0aGluZyBhbnkgbW9yZS4gKFN0cmljdGx5IHNwZWFraW5nIHRoZSByZXR1cm5lZCBydW5saXN0CisgKiBtYXkgYmUgdGhlIHNhbWUgYXMgQGRzdCBidXQgdGhpcyBpcyBpcnJlbGV2YW50LikKKyAqCisgKiBPbiBlcnJvciwgcmV0dXJuIC1lcnJuby4gQm90aCBydW5saXN0cyBhcmUgbGVmdCB1bm1vZGlmaWVkLiBUaGUgZm9sbG93aW5nCisgKiBlcnJvciBjb2RlcyBhcmUgZGVmaW5lZDoKKyAqCS1FTk9NRU0JLSBOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBydW5saXN0IGFycmF5LgorICoJLUVJTlZBTAktIEludmFsaWQgcGFyYW1ldGVycyB3ZXJlIHBhc3NlZCBpbi4KKyAqLworc3RhdGljIGlubGluZSBydW5saXN0X2VsZW1lbnQgKm50ZnNfcmxfcmVwbGFjZShydW5saXN0X2VsZW1lbnQgKmRzdCwKKwkJaW50IGRzaXplLCBydW5saXN0X2VsZW1lbnQgKnNyYywgaW50IHNzaXplLCBpbnQgbG9jKQoreworCUJPT0wgbGVmdCA9IEZBTFNFOworCUJPT0wgcmlnaHQ7CisJaW50IG1hZ2ljOworCisJQlVHX09OKCFkc3QpOworCUJVR19PTighc3JjKTsKKworCS8qIEZpcnN0LCBtZXJnZSB0aGUgbGVmdCBhbmQgcmlnaHQgZW5kcywgaWYgbmVjZXNzYXJ5LiAqLworCXJpZ2h0ID0gbnRmc19hcmVfcmxfbWVyZ2VhYmxlKHNyYyArIHNzaXplIC0gMSwgZHN0ICsgbG9jICsgMSk7CisJaWYgKGxvYyA+IDApCisJCWxlZnQgPSBudGZzX2FyZV9ybF9tZXJnZWFibGUoZHN0ICsgbG9jIC0gMSwgc3JjKTsKKworCS8qIEFsbG9jYXRlIHNvbWUgc3BhY2UuIFdlJ2xsIG5lZWQgbGVzcyBpZiB0aGUgbGVmdCwgcmlnaHQsIG9yIGJvdGgKKwkgKiBlbmRzIHdlcmUgbWVyZ2VkLiAqLworCWRzdCA9IG50ZnNfcmxfcmVhbGxvYyhkc3QsIGRzaXplLCBkc2l6ZSArIHNzaXplIC0gbGVmdCAtIHJpZ2h0KTsKKwlpZiAoSVNfRVJSKGRzdCkpCisJCXJldHVybiBkc3Q7CisJLyoKKwkgKiBXZSBhcmUgZ3VhcmFudGVlZCB0byBzdWNjZWVkIGZyb20gaGVyZSBzbyBjYW4gc3RhcnQgbW9kaWZ5aW5nIHRoZQorCSAqIG9yaWdpbmFsIHJ1bmxpc3RzLgorCSAqLworCWlmIChyaWdodCkKKwkJX19udGZzX3JsX21lcmdlKHNyYyArIHNzaXplIC0gMSwgZHN0ICsgbG9jICsgMSk7CisJaWYgKGxlZnQpCisJCV9fbnRmc19ybF9tZXJnZShkc3QgKyBsb2MgLSAxLCBzcmMpOworCisJLyogRklYTUU6IFdoYXQgZG9lcyB0aGlzIG1lYW4/IChBSUEpICovCisJbWFnaWMgPSBsb2MgKyBzc2l6ZSAtIGxlZnQ7CisKKwkvKiBNb3ZlIHRoZSB0YWlsIG9mIEBkc3Qgb3V0IG9mIHRoZSB3YXksIHRoZW4gY29weSBpbiBAc3JjLiAqLworCW50ZnNfcmxfbW0oZHN0LCBtYWdpYywgbG9jICsgcmlnaHQgKyAxLCBkc2l6ZSAtIGxvYyAtIHJpZ2h0IC0gMSk7CisJbnRmc19ybF9tYyhkc3QsIGxvYywgc3JjLCBsZWZ0LCBzc2l6ZSAtIGxlZnQpOworCisJLyogV2UgbWF5IGhhdmUgY2hhbmdlZCB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxlLCBzbyBmaXggdGhlIGVuZCBtYXJrZXIgKi8KKwlpZiAoZHN0W21hZ2ljXS5sY24gPT0gTENOX0VOT0VOVCkKKwkJZHN0W21hZ2ljXS52Y24gPSBkc3RbbWFnaWMgLSAxXS52Y24gKyBkc3RbbWFnaWMgLSAxXS5sZW5ndGg7CisJcmV0dXJuIGRzdDsKK30KKworLyoqCisgKiBudGZzX3JsX3NwbGl0IC0gaW5zZXJ0IGEgcnVubGlzdCBpbnRvIHRoZSBjZW50cmUgb2YgYSBob2xlCisgKiBAZHN0OglvcmlnaW5hbCBydW5saXN0IHRvIGJlIHdvcmtlZCBvbgorICogQGRzaXplOgludW1iZXIgb2YgZWxlbWVudHMgaW4gQGRzdCAoaW5jbHVkaW5nIGVuZCBtYXJrZXIpCisgKiBAc3JjOgluZXcgcnVubGlzdCB0byBiZSBpbnNlcnRlZAorICogQHNzaXplOgludW1iZXIgb2YgZWxlbWVudHMgaW4gQHNyYyAoZXhjbHVkaW5nIGVuZCBtYXJrZXIpCisgKiBAbG9jOglpbmRleCBpbiBydW5saXN0IEBkc3QgYXQgd2hpY2ggdG8gc3BsaXQgYW5kIGluc2VydCBAc3JjCisgKgorICogU3BsaXQgdGhlIHJ1bmxpc3QgQGRzdCBhdCBAbG9jIGludG8gdHdvIGFuZCBpbnNlcnQgQG5ldyBpbiBiZXR3ZWVuIHRoZSB0d28KKyAqIGZyYWdtZW50cy4gTm8gbWVyZ2luZyBvZiBydW5saXN0cyBpcyBuZWNlc3NhcnkuIEFkanVzdCB0aGUgc2l6ZSBvZiB0aGUKKyAqIGhvbGVzIGVpdGhlciBzaWRlLgorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdHMgQGRzdCBhbmQgQHNyYy4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXcsIGNvbWJpbmVkLCBydW5saXN0LiBOb3RlLCBib3RoCisgKiBydW5saXN0cyBAZHN0IGFuZCBAc3JjIGFyZSBkZWFsbG9jYXRlZCBiZWZvcmUgcmV0dXJuaW5nIHNvIHlvdSBjYW5ub3QgdXNlCisgKiB0aGUgcG9pbnRlcnMgZm9yIGFueXRoaW5nIGFueSBtb3JlLiAoU3RyaWN0bHkgc3BlYWtpbmcgdGhlIHJldHVybmVkIHJ1bmxpc3QKKyAqIG1heSBiZSB0aGUgc2FtZSBhcyBAZHN0IGJ1dCB0aGlzIGlzIGlycmVsZXZhbnQuKQorICoKKyAqIE9uIGVycm9yLCByZXR1cm4gLWVycm5vLiBCb3RoIHJ1bmxpc3RzIGFyZSBsZWZ0IHVubW9kaWZpZWQuIFRoZSBmb2xsb3dpbmcKKyAqIGVycm9yIGNvZGVzIGFyZSBkZWZpbmVkOgorICoJLUVOT01FTQktIE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHJ1bmxpc3QgYXJyYXkuCisgKgktRUlOVkFMCS0gSW52YWxpZCBwYXJhbWV0ZXJzIHdlcmUgcGFzc2VkIGluLgorICovCitzdGF0aWMgaW5saW5lIHJ1bmxpc3RfZWxlbWVudCAqbnRmc19ybF9zcGxpdChydW5saXN0X2VsZW1lbnQgKmRzdCwgaW50IGRzaXplLAorCQlydW5saXN0X2VsZW1lbnQgKnNyYywgaW50IHNzaXplLCBpbnQgbG9jKQoreworCUJVR19PTighZHN0KTsKKwlCVUdfT04oIXNyYyk7CisKKwkvKiBTcGFjZSByZXF1aXJlZDogQGRzdCBzaXplICsgQHNyYyBzaXplICsgb25lIG5ldyBob2xlLiAqLworCWRzdCA9IG50ZnNfcmxfcmVhbGxvYyhkc3QsIGRzaXplLCBkc2l6ZSArIHNzaXplICsgMSk7CisJaWYgKElTX0VSUihkc3QpKQorCQlyZXR1cm4gZHN0OworCS8qCisJICogV2UgYXJlIGd1YXJhbnRlZWQgdG8gc3VjY2VlZCBmcm9tIGhlcmUgc28gY2FuIHN0YXJ0IG1vZGlmeWluZyB0aGUKKwkgKiBvcmlnaW5hbCBydW5saXN0cy4KKwkgKi8KKworCS8qIE1vdmUgdGhlIHRhaWwgb2YgQGRzdCBvdXQgb2YgdGhlIHdheSwgdGhlbiBjb3B5IGluIEBzcmMuICovCisJbnRmc19ybF9tbShkc3QsIGxvYyArIDEgKyBzc2l6ZSwgbG9jLCBkc2l6ZSAtIGxvYyk7CisJbnRmc19ybF9tYyhkc3QsIGxvYyArIDEsIHNyYywgMCwgc3NpemUpOworCisJLyogQWRqdXN0IHRoZSBzaXplIG9mIHRoZSBob2xlcyBlaXRoZXIgc2l6ZSBvZiBAc3JjLiAqLworCWRzdFtsb2NdLmxlbmd0aAkJPSBkc3RbbG9jKzFdLnZjbiAgICAgICAtIGRzdFtsb2NdLnZjbjsKKwlkc3RbbG9jK3NzaXplKzFdLnZjbiAgICA9IGRzdFtsb2Mrc3NpemVdLnZjbiAgICsgZHN0W2xvYytzc2l6ZV0ubGVuZ3RoOworCWRzdFtsb2Mrc3NpemUrMV0ubGVuZ3RoID0gZHN0W2xvYytzc2l6ZSsyXS52Y24gLSBkc3RbbG9jK3NzaXplKzFdLnZjbjsKKworCXJldHVybiBkc3Q7Cit9CisKKy8qKgorICogbnRmc19ydW5saXN0c19tZXJnZSAtIG1lcmdlIHR3byBydW5saXN0cyBpbnRvIG9uZQorICogQGRybDoJb3JpZ2luYWwgcnVubGlzdCB0byBiZSB3b3JrZWQgb24KKyAqIEBzcmw6CW5ldyBydW5saXN0IHRvIGJlIG1lcmdlZCBpbnRvIEBkcmwKKyAqCisgKiBGaXJzdCB3ZSBzYW5pdHkgY2hlY2sgdGhlIHR3byBydW5saXN0cyBAc3JsIGFuZCBAZHJsIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXkKKyAqIGFyZSBzZW5zaWJsZSBhbmQgY2FuIGJlIG1lcmdlZC4gVGhlIHJ1bmxpc3QgQHNybCBtdXN0IGJlIGVpdGhlciBhZnRlciB0aGUKKyAqIHJ1bmxpc3QgQGRybCBvciBjb21wbGV0ZWx5IHdpdGhpbiBhIGhvbGUgKG9yIHVubWFwcGVkIHJlZ2lvbikgaW4gQGRybC4KKyAqCisgKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHJ1bmxpc3RzIEBkcmwgYW5kIEBzcmwuCisgKgorICogTWVyZ2luZyBvZiBydW5saXN0cyBpcyBuZWNlc3NhcnkgaW4gdHdvIGNhc2VzOgorICogICAxLiBXaGVuIGF0dHJpYnV0ZSBsaXN0cyBhcmUgdXNlZCBhbmQgYSBmdXJ0aGVyIGV4dGVudCBpcyBiZWluZyBtYXBwZWQuCisgKiAgIDIuIFdoZW4gbmV3IGNsdXN0ZXJzIGFyZSBhbGxvY2F0ZWQgdG8gZmlsbCBhIGhvbGUgb3IgZXh0ZW5kIGEgZmlsZS4KKyAqCisgKiBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSB3YXlzIEBzcmwgY2FuIGJlIG1lcmdlZC4gSXQgY2FuOgorICoJLSBiZSBpbnNlcnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgaG9sZSwKKyAqCS0gc3BsaXQgdGhlIGhvbGUgaW4gdHdvIGFuZCBiZSBpbnNlcnRlZCBiZXR3ZWVuIHRoZSB0d28gZnJhZ21lbnRzLAorICoJLSBiZSBhcHBlbmRlZCBhdCB0aGUgZW5kIG9mIGEgaG9sZSwgb3IgaXQgY2FuCisgKgktIHJlcGxhY2UgdGhlIHdob2xlIGhvbGUuCisgKiBJdCBjYW4gYWxzbyBiZSBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBydW5saXN0LCB3aGljaCBpcyBqdXN0IGEgdmFyaWFudAorICogb2YgdGhlIGluc2VydCBjYXNlLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5ldywgY29tYmluZWQsIHJ1bmxpc3QuIE5vdGUsIGJvdGgKKyAqIHJ1bmxpc3RzIEBkcmwgYW5kIEBzcmwgYXJlIGRlYWxsb2NhdGVkIGJlZm9yZSByZXR1cm5pbmcgc28geW91IGNhbm5vdCB1c2UKKyAqIHRoZSBwb2ludGVycyBmb3IgYW55dGhpbmcgYW55IG1vcmUuIChTdHJpY3RseSBzcGVha2luZyB0aGUgcmV0dXJuZWQgcnVubGlzdAorICogbWF5IGJlIHRoZSBzYW1lIGFzIEBkc3QgYnV0IHRoaXMgaXMgaXJyZWxldmFudC4pCisgKgorICogT24gZXJyb3IsIHJldHVybiAtZXJybm8uIEJvdGggcnVubGlzdHMgYXJlIGxlZnQgdW5tb2RpZmllZC4gVGhlIGZvbGxvd2luZworICogZXJyb3IgY29kZXMgYXJlIGRlZmluZWQ6CisgKgktRU5PTUVNCS0gTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgcnVubGlzdCBhcnJheS4KKyAqCS1FSU5WQUwJLSBJbnZhbGlkIHBhcmFtZXRlcnMgd2VyZSBwYXNzZWQgaW4uCisgKgktRVJBTkdFCS0gVGhlIHJ1bmxpc3RzIG92ZXJsYXAgYW5kIGNhbm5vdCBiZSBtZXJnZWQuCisgKi8KK3J1bmxpc3RfZWxlbWVudCAqbnRmc19ydW5saXN0c19tZXJnZShydW5saXN0X2VsZW1lbnQgKmRybCwKKwkJcnVubGlzdF9lbGVtZW50ICpzcmwpCit7CisJaW50IGRpLCBzaTsJCS8qIEN1cnJlbnQgaW5kZXggaW50byBAW2RzXXJsLiAqLworCWludCBzc3RhcnQ7CQkvKiBGaXJzdCBpbmRleCB3aXRoIGxjbiA+IExDTl9STF9OT1RfTUFQUEVELiAqLworCWludCBkaW5zOwkJLyogSW5kZXggaW50byBAZHJsIGF0IHdoaWNoIHRvIGluc2VydCBAc3JsLiAqLworCWludCBkZW5kLCBzZW5kOwkJLyogTGFzdCBpbmRleCBpbnRvIEBbZHNdcmwuICovCisJaW50IGRmaW5hbCwgc2ZpbmFsOwkvKiBUaGUgbGFzdCBpbmRleCBpbnRvIEBbZHNdcmwgd2l0aAorCQkJCSAgIGxjbiA+PSBMQ05fSE9MRS4gKi8KKwlpbnQgbWFya2VyID0gMDsKKwlWQ04gbWFya2VyX3ZjbiA9IDA7CisKKyNpZmRlZiBERUJVRworCW50ZnNfZGVidWcoImRzdDoiKTsKKwludGZzX2RlYnVnX2R1bXBfcnVubGlzdChkcmwpOworCW50ZnNfZGVidWcoInNyYzoiKTsKKwludGZzX2RlYnVnX2R1bXBfcnVubGlzdChzcmwpOworI2VuZGlmCisKKwkvKiBDaGVjayBmb3Igc2lsbHkgY2FsbGluZy4uLiAqLworCWlmICh1bmxpa2VseSghc3JsKSkKKwkJcmV0dXJuIGRybDsKKwlpZiAoSVNfRVJSKHNybCkgfHwgSVNfRVJSKGRybCkpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJLyogQ2hlY2sgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBmaXJzdCBtYXBwaW5nIGlzIGJlaW5nIGRvbmUgbm93LiAqLworCWlmICh1bmxpa2VseSghZHJsKSkgeworCQlkcmwgPSBzcmw7CisJCS8qIENvbXBsZXRlIHRoZSBzb3VyY2UgcnVubGlzdCBpZiBuZWNlc3NhcnkuICovCisJCWlmICh1bmxpa2VseShkcmxbMF0udmNuKSkgeworCQkJLyogU2NhbiB0byB0aGUgZW5kIG9mIHRoZSBzb3VyY2UgcnVubGlzdC4gKi8KKwkJCWZvciAoZGVuZCA9IDA7IGxpa2VseShkcmxbZGVuZF0ubGVuZ3RoKTsgZGVuZCsrKQorCQkJCTsKKwkJCWRybCA9IG50ZnNfcmxfcmVhbGxvYyhkcmwsIGRlbmQsIGRlbmQgKyAxKTsKKwkJCWlmIChJU19FUlIoZHJsKSkKKwkJCQlyZXR1cm4gZHJsOworCQkJLyogSW5zZXJ0IHN0YXJ0IGVsZW1lbnQgYXQgdGhlIGZyb250IG9mIHRoZSBydW5saXN0LiAqLworCQkJbnRmc19ybF9tbShkcmwsIDEsIDAsIGRlbmQpOworCQkJZHJsWzBdLnZjbiA9IDA7CisJCQlkcmxbMF0ubGNuID0gTENOX1JMX05PVF9NQVBQRUQ7CisJCQlkcmxbMF0ubGVuZ3RoID0gZHJsWzFdLnZjbjsKKwkJfQorCQlnb3RvIGZpbmlzaGVkOworCX0KKworCXNpID0gZGkgPSAwOworCisJLyogU2tpcCBhbnkgdW5tYXBwZWQgc3RhcnQgZWxlbWVudChzKSBpbiB0aGUgc291cmNlIHJ1bmxpc3QuICovCisJd2hpbGUgKHNybFtzaV0ubGVuZ3RoICYmIHNybFtzaV0ubGNuIDwgTENOX0hPTEUpCisJCXNpKys7CisKKwkvKiBDYW4ndCBoYXZlIGFuIGVudGlyZWx5IHVubWFwcGVkIHNvdXJjZSBydW5saXN0LiAqLworCUJVR19PTighc3JsW3NpXS5sZW5ndGgpOworCisJLyogUmVjb3JkIHRoZSBzdGFydGluZyBwb2ludHMuICovCisJc3N0YXJ0ID0gc2k7CisKKwkvKgorCSAqIFNraXAgZm9yd2FyZCBpbiBAZHJsIHVudGlsIHdlIHJlYWNoIHRoZSBwb3NpdGlvbiB3aGVyZSBAc3JsIG5lZWRzIHRvCisJICogYmUgaW5zZXJ0ZWQuIElmIHdlIHJlYWNoIHRoZSBlbmQgb2YgQGRybCwgQHNybCBqdXN0IG5lZWRzIHRvIGJlCisJICogYXBwZW5kZWQgdG8gQGRybC4KKwkgKi8KKwlmb3IgKDsgZHJsW2RpXS5sZW5ndGg7IGRpKyspIHsKKwkJaWYgKGRybFtkaV0udmNuICsgZHJsW2RpXS5sZW5ndGggPiBzcmxbc3N0YXJ0XS52Y24pCisJCQlicmVhazsKKwl9CisJZGlucyA9IGRpOworCisJLyogU2FuaXR5IGNoZWNrIGZvciBpbGxlZ2FsIG92ZXJsYXBzLiAqLworCWlmICgoZHJsW2RpXS52Y24gPT0gc3JsW3NpXS52Y24pICYmIChkcmxbZGldLmxjbiA+PSAwKSAmJgorCQkJKHNybFtzaV0ubGNuID49IDApKSB7CisJCW50ZnNfZXJyb3IoTlVMTCwgIlJ1biBsaXN0cyBvdmVybGFwLiBDYW5ub3QgbWVyZ2UhIik7CisJCXJldHVybiBFUlJfUFRSKC1FUkFOR0UpOworCX0KKworCS8qIFNjYW4gdG8gdGhlIGVuZCBvZiBib3RoIHJ1bmxpc3RzIGluIG9yZGVyIHRvIGtub3cgdGhlaXIgc2l6ZXMuICovCisJZm9yIChzZW5kID0gc2k7IHNybFtzZW5kXS5sZW5ndGg7IHNlbmQrKykKKwkJOworCWZvciAoZGVuZCA9IGRpOyBkcmxbZGVuZF0ubGVuZ3RoOyBkZW5kKyspCisJCTsKKworCWlmIChzcmxbc2VuZF0ubGNuID09IExDTl9FTk9FTlQpCisJCW1hcmtlcl92Y24gPSBzcmxbbWFya2VyID0gc2VuZF0udmNuOworCisJLyogU2NhbiB0byB0aGUgbGFzdCBlbGVtZW50IHdpdGggbGNuID49IExDTl9IT0xFLiAqLworCWZvciAoc2ZpbmFsID0gc2VuZDsgc2ZpbmFsID49IDAgJiYgc3JsW3NmaW5hbF0ubGNuIDwgTENOX0hPTEU7IHNmaW5hbC0tKQorCQk7CisJZm9yIChkZmluYWwgPSBkZW5kOyBkZmluYWwgPj0gMCAmJiBkcmxbZGZpbmFsXS5sY24gPCBMQ05fSE9MRTsgZGZpbmFsLS0pCisJCTsKKworCXsKKwlCT09MIHN0YXJ0OworCUJPT0wgZmluaXNoOworCWludCBkcyA9IGRlbmQgKyAxOwkJLyogTnVtYmVyIG9mIGVsZW1lbnRzIGluIGRybCAmIHNybCAqLworCWludCBzcyA9IHNmaW5hbCAtIHNzdGFydCArIDE7CisKKwlzdGFydCAgPSAoKGRybFtkaW5zXS5sY24gPCAgTENOX1JMX05PVF9NQVBQRUQpIHx8ICAgIC8qIEVuZCBvZiBmaWxlICAgKi8KKwkJICAoZHJsW2RpbnNdLnZjbiA9PSBzcmxbc3N0YXJ0XS52Y24pKTsJICAgICAvKiBTdGFydCBvZiBob2xlICovCisJZmluaXNoID0gKChkcmxbZGluc10ubGNuID49IExDTl9STF9OT1RfTUFQUEVEKSAmJiAgICAvKiBFbmQgb2YgZmlsZSAgICovCisJCSAoKGRybFtkaW5zXS52Y24gKyBkcmxbZGluc10ubGVuZ3RoKSA8PSAgICAgIC8qIEVuZCBvZiBob2xlICAgKi8KKwkJICAoc3JsW3NlbmQgLSAxXS52Y24gKyBzcmxbc2VuZCAtIDFdLmxlbmd0aCkpKTsKKworCS8qIE9yIHdlJ2xsIGxvc2UgYW4gZW5kIG1hcmtlciAqLworCWlmIChzdGFydCAmJiBmaW5pc2ggJiYgKGRybFtkaW5zXS5sZW5ndGggPT0gMCkpCisJCXNzKys7CisJaWYgKG1hcmtlciAmJiAoZHJsW2RpbnNdLnZjbiArIGRybFtkaW5zXS5sZW5ndGggPiBzcmxbc2VuZCAtIDFdLnZjbikpCisJCWZpbmlzaCA9IEZBTFNFOworI2lmIDAKKwludGZzX2RlYnVnKCJkZmluYWwgPSAlaSwgZGVuZCA9ICVpIiwgZGZpbmFsLCBkZW5kKTsKKwludGZzX2RlYnVnKCJzc3RhcnQgPSAlaSwgc2ZpbmFsID0gJWksIHNlbmQgPSAlaSIsIHNzdGFydCwgc2ZpbmFsLCBzZW5kKTsKKwludGZzX2RlYnVnKCJzdGFydCA9ICVpLCBmaW5pc2ggPSAlaSIsIHN0YXJ0LCBmaW5pc2gpOworCW50ZnNfZGVidWcoImRzID0gJWksIHNzID0gJWksIGRpbnMgPSAlaSIsIGRzLCBzcywgZGlucyk7CisjZW5kaWYKKwlpZiAoc3RhcnQpIHsKKwkJaWYgKGZpbmlzaCkKKwkJCWRybCA9IG50ZnNfcmxfcmVwbGFjZShkcmwsIGRzLCBzcmwgKyBzc3RhcnQsIHNzLCBkaW5zKTsKKwkJZWxzZQorCQkJZHJsID0gbnRmc19ybF9pbnNlcnQoZHJsLCBkcywgc3JsICsgc3N0YXJ0LCBzcywgZGlucyk7CisJfSBlbHNlIHsKKwkJaWYgKGZpbmlzaCkKKwkJCWRybCA9IG50ZnNfcmxfYXBwZW5kKGRybCwgZHMsIHNybCArIHNzdGFydCwgc3MsIGRpbnMpOworCQllbHNlCisJCQlkcmwgPSBudGZzX3JsX3NwbGl0KGRybCwgZHMsIHNybCArIHNzdGFydCwgc3MsIGRpbnMpOworCX0KKwlpZiAoSVNfRVJSKGRybCkpIHsKKwkJbnRmc19lcnJvcihOVUxMLCAiTWVyZ2UgZmFpbGVkLiIpOworCQlyZXR1cm4gZHJsOworCX0KKwludGZzX2ZyZWUoc3JsKTsKKwlpZiAobWFya2VyKSB7CisJCW50ZnNfZGVidWcoIlRyaWdnZXJpbmcgbWFya2VyIGNvZGUuIik7CisJCWZvciAoZHMgPSBkZW5kOyBkcmxbZHNdLmxlbmd0aDsgZHMrKykKKwkJCTsKKwkJLyogV2Ugb25seSBuZWVkIHRvIGNhcmUgaWYgQHNybCBlbmRlZCBhZnRlciBAZHJsLiAqLworCQlpZiAoZHJsW2RzXS52Y24gPD0gbWFya2VyX3ZjbikgeworCQkJaW50IHNsb3RzID0gMDsKKworCQkJaWYgKGRybFtkc10udmNuID09IG1hcmtlcl92Y24pIHsKKwkJCQludGZzX2RlYnVnKCJPbGQgbWFya2VyID0gMHglbGx4LCByZXBsYWNpbmcgIgorCQkJCQkJIndpdGggTENOX0VOT0VOVC4iLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCWRybFtkc10ubGNuKTsKKwkJCQlkcmxbZHNdLmxjbiA9IExDTl9FTk9FTlQ7CisJCQkJZ290byBmaW5pc2hlZDsKKwkJCX0KKwkJCS8qCisJCQkgKiBXZSBuZWVkIHRvIGNyZWF0ZSBhbiB1bm1hcHBlZCBydW5saXN0IGVsZW1lbnQgaW4KKwkJCSAqIEBkcmwgb3IgZXh0ZW5kIGFuIGV4aXN0aW5nIG9uZSBiZWZvcmUgYWRkaW5nIHRoZQorCQkJICogRU5PRU5UIHRlcm1pbmF0b3IuCisJCQkgKi8KKwkJCWlmIChkcmxbZHNdLmxjbiA9PSBMQ05fRU5PRU5UKSB7CisJCQkJZHMtLTsKKwkJCQlzbG90cyA9IDE7CisJCQl9CisJCQlpZiAoZHJsW2RzXS5sY24gIT0gTENOX1JMX05PVF9NQVBQRUQpIHsKKwkJCQkvKiBBZGQgYW4gdW5tYXBwZWQgcnVubGlzdCBlbGVtZW50LiAqLworCQkJCWlmICghc2xvdHMpIHsKKwkJCQkJLyogRklYTUUvVE9ETzogV2UgbmVlZCB0byBoYXZlIHRoZQorCQkJCQkgKiBleHRyYSBtZW1vcnkgYWxyZWFkeSEgKEFJQSkgKi8KKwkJCQkJZHJsID0gbnRmc19ybF9yZWFsbG9jKGRybCwgZHMsIGRzICsgMik7CisJCQkJCWlmICghZHJsKQorCQkJCQkJZ290byBjcml0aWNhbF9lcnJvcjsKKwkJCQkJc2xvdHMgPSAyOworCQkJCX0KKwkJCQlkcysrOworCQkJCS8qIE5lZWQgdG8gc2V0IHZjbiBpZiBpdCBpc24ndCBzZXQgYWxyZWFkeS4gKi8KKwkJCQlpZiAoc2xvdHMgIT0gMSkKKwkJCQkJZHJsW2RzXS52Y24gPSBkcmxbZHMgLSAxXS52Y24gKworCQkJCQkJCWRybFtkcyAtIDFdLmxlbmd0aDsKKwkJCQlkcmxbZHNdLmxjbiA9IExDTl9STF9OT1RfTUFQUEVEOworCQkJCS8qIFdlIG5vdyB1c2VkIHVwIGEgc2xvdC4gKi8KKwkJCQlzbG90cy0tOworCQkJfQorCQkJZHJsW2RzXS5sZW5ndGggPSBtYXJrZXJfdmNuIC0gZHJsW2RzXS52Y247CisJCQkvKiBGaW5hbGx5IGFkZCB0aGUgRU5PRU5UIHRlcm1pbmF0b3IuICovCisJCQlkcysrOworCQkJaWYgKCFzbG90cykgeworCQkJCS8qIEZJWE1FL1RPRE86IFdlIG5lZWQgdG8gaGF2ZSB0aGUgZXh0cmEKKwkJCQkgKiBtZW1vcnkgYWxyZWFkeSEgKEFJQSkgKi8KKwkJCQlkcmwgPSBudGZzX3JsX3JlYWxsb2MoZHJsLCBkcywgZHMgKyAxKTsKKwkJCQlpZiAoIWRybCkKKwkJCQkJZ290byBjcml0aWNhbF9lcnJvcjsKKwkJCX0KKwkJCWRybFtkc10udmNuID0gbWFya2VyX3ZjbjsKKwkJCWRybFtkc10ubGNuID0gTENOX0VOT0VOVDsKKwkJCWRybFtkc10ubGVuZ3RoID0gKHM2NCkwOworCQl9CisJfQorCX0KKworZmluaXNoZWQ6CisJLyogVGhlIG1lcmdlIHdhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiAqLworCW50ZnNfZGVidWcoIk1lcmdlZCBydW5saXN0OiIpOworCW50ZnNfZGVidWdfZHVtcF9ydW5saXN0KGRybCk7CisJcmV0dXJuIGRybDsKKworY3JpdGljYWxfZXJyb3I6CisJLyogQ3JpdGljYWwgZXJyb3IhIFdlIGNhbm5vdCBhZmZvcmQgdG8gZmFpbCBoZXJlLiAqLworCW50ZnNfZXJyb3IoTlVMTCwgIkNyaXRpY2FsIGVycm9yISBOb3QgZW5vdWdoIG1lbW9yeS4iKTsKKwlwYW5pYygiTlRGUzogQ2Fubm90IGNvbnRpbnVlLiIpOworfQorCisvKioKKyAqIG50ZnNfbWFwcGluZ19wYWlyc19kZWNvbXByZXNzIC0gY29udmVydCBtYXBwaW5nIHBhaXJzIGFycmF5IHRvIHJ1bmxpc3QKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIG9uIHdoaWNoIHRoZSBhdHRyaWJ1dGUgcmVzaWRlcworICogQGF0dHI6CWF0dHJpYnV0ZSByZWNvcmQgd2hvc2UgbWFwcGluZyBwYWlycyBhcnJheSB0byBkZWNvbXByZXNzCisgKiBAb2xkX3JsOglvcHRpb25hbCBydW5saXN0IGluIHdoaWNoIHRvIGluc2VydCBAYXR0cidzIHJ1bmxpc3QKKyAqCisgKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHJ1bmxpc3QgQG9sZF9ybC4KKyAqCisgKiBEZWNvbXByZXNzIHRoZSBhdHRyaWJ1dGUgQGF0dHIncyBtYXBwaW5nIHBhaXJzIGFycmF5IGludG8gYSBydW5saXN0LiBPbgorICogc3VjY2VzcywgcmV0dXJuIHRoZSBkZWNvbXByZXNzZWQgcnVubGlzdC4KKyAqCisgKiBJZiBAb2xkX3JsIGlzIG5vdCBOVUxMLCBkZWNvbXByZXNzZWQgcnVubGlzdCBpcyBpbnNlcnRlZCBpbnRvIHRoZQorICogYXBwcm9wcmlhdGUgcGxhY2UgaW4gQG9sZF9ybCBhbmQgdGhlIHJlc3VsdGFudCwgY29tYmluZWQgcnVubGlzdCBpcworICogcmV0dXJuZWQuIFRoZSBvcmlnaW5hbCBAb2xkX3JsIGlzIGRlYWxsb2NhdGVkLgorICoKKyAqIE9uIGVycm9yLCByZXR1cm4gLWVycm5vLiBAb2xkX3JsIGlzIGxlZnQgdW5tb2RpZmllZCBpbiB0aGF0IGNhc2UuCisgKgorICogVGhlIGZvbGxvd2luZyBlcnJvciBjb2RlcyBhcmUgZGVmaW5lZDoKKyAqCS1FTk9NRU0JLSBOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBydW5saXN0IGFycmF5LgorICoJLUVJTwktIENvcnJ1cHQgcnVubGlzdC4KKyAqCS1FSU5WQUwJLSBJbnZhbGlkIHBhcmFtZXRlcnMgd2VyZSBwYXNzZWQgaW4uCisgKgktRVJBTkdFCS0gVGhlIHR3byBydW5saXN0cyBvdmVybGFwLgorICoKKyAqIEZJWE1FOiBGb3Igbm93IHdlIHRha2UgdGhlIGNvbmNlcHRpb25hbGx5IHNpbXBsZXN0IGFwcHJvYWNoIG9mIGNyZWF0aW5nIHRoZQorICogbmV3IHJ1bmxpc3QgZGlzcmVnYXJkaW5nIHRoZSBhbHJlYWR5IGV4aXN0aW5nIG9uZSBhbmQgdGhlbiBzcGxpY2luZyB0aGUKKyAqIHR3byBpbnRvIG9uZSwgaWYgdGhhdCBpcyBwb3NzaWJsZSAod2UgY2hlY2sgZm9yIG92ZXJsYXAgYW5kIGRpc2NhcmQgdGhlIG5ldworICogcnVubGlzdCBpZiBvdmVybGFwIHByZXNlbnQgYmVmb3JlIHJldHVybmluZyBFUlJfUFRSKC1FUkFOR0UpKS4KKyAqLworcnVubGlzdF9lbGVtZW50ICpudGZzX21hcHBpbmdfcGFpcnNfZGVjb21wcmVzcyhjb25zdCBudGZzX3ZvbHVtZSAqdm9sLAorCQljb25zdCBBVFRSX1JFQ09SRCAqYXR0ciwgcnVubGlzdF9lbGVtZW50ICpvbGRfcmwpCit7CisJVkNOIHZjbjsJCS8qIEN1cnJlbnQgdmNuLiAqLworCUxDTiBsY247CQkvKiBDdXJyZW50IGxjbi4gKi8KKwlzNjQgZGVsdGF4Y247CQkvKiBDaGFuZ2UgaW4gW3ZsXWNuLiAqLworCXJ1bmxpc3RfZWxlbWVudCAqcmw7CS8qIFRoZSBvdXRwdXQgcnVubGlzdC4gKi8KKwl1OCAqYnVmOwkJLyogQ3VycmVudCBwb3NpdGlvbiBpbiBtYXBwaW5nIHBhaXJzIGFycmF5LiAqLworCXU4ICphdHRyX2VuZDsJCS8qIEVuZCBvZiBhdHRyaWJ1dGUuICovCisJaW50IHJsc2l6ZTsJCS8qIFNpemUgb2YgcnVubGlzdCBidWZmZXIuICovCisJdTE2IHJscG9zOwkJLyogQ3VycmVudCBydW5saXN0IHBvc2l0aW9uIGluIHVuaXRzIG9mCisJCQkJICAgcnVubGlzdF9lbGVtZW50cy4gKi8KKwl1OCBiOwkJCS8qIEN1cnJlbnQgYnl0ZSBvZmZzZXQgaW4gYnVmLiAqLworCisjaWZkZWYgREVCVUcKKwkvKiBNYWtlIHN1cmUgYXR0ciBleGlzdHMgYW5kIGlzIG5vbi1yZXNpZGVudC4gKi8KKwlpZiAoIWF0dHIgfHwgIWF0dHItPm5vbl9yZXNpZGVudCB8fCBzbGU2NF90b19jcHUoCisJCQlhdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSA8IChWQ04pMCkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJJbnZhbGlkIGFyZ3VtZW50cy4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorI2VuZGlmCisJLyogU3RhcnQgYXQgdmNuID0gbG93ZXN0X3ZjbiBhbmQgbGNuIDAuICovCisJdmNuID0gc2xlNjRfdG9fY3B1KGF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pOworCWxjbiA9IDA7CisJLyogR2V0IHN0YXJ0IG9mIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5LiAqLworCWJ1ZiA9ICh1OCopYXR0ciArIGxlMTZfdG9fY3B1KAorCQkJYXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQubWFwcGluZ19wYWlyc19vZmZzZXQpOworCWF0dHJfZW5kID0gKHU4KilhdHRyICsgbGUzMl90b19jcHUoYXR0ci0+bGVuZ3RoKTsKKwlpZiAodW5saWtlbHkoYnVmIDwgKHU4KilhdHRyIHx8IGJ1ZiA+IGF0dHJfZW5kKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJDb3JydXB0IGF0dHJpYnV0ZS4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJfQorCS8qIEN1cnJlbnQgcG9zaXRpb24gaW4gcnVubGlzdCBhcnJheS4gKi8KKwlybHBvcyA9IDA7CisJLyogQWxsb2NhdGUgZmlyc3QgcGFnZSBhbmQgc2V0IGN1cnJlbnQgcnVubGlzdCBzaXplIHRvIG9uZSBwYWdlLiAqLworCXJsID0gbnRmc19tYWxsb2Nfbm9mcyhybHNpemUgPSBQQUdFX1NJWkUpOworCWlmICh1bmxpa2VseSghcmwpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkvKiBJbnNlcnQgdW5tYXBwZWQgc3RhcnRpbmcgZWxlbWVudCBpZiBuZWNlc3NhcnkuICovCisJaWYgKHZjbikgeworCQlybC0+dmNuID0gMDsKKwkJcmwtPmxjbiA9IExDTl9STF9OT1RfTUFQUEVEOworCQlybC0+bGVuZ3RoID0gdmNuOworCQlybHBvcysrOworCX0KKwl3aGlsZSAoYnVmIDwgYXR0cl9lbmQgJiYgKmJ1ZikgeworCQkvKgorCQkgKiBBbGxvY2F0ZSBtb3JlIG1lbW9yeSBpZiBuZWVkZWQsIGluY2x1ZGluZyBzcGFjZSBmb3IgdGhlCisJCSAqIG5vdC1tYXBwZWQgYW5kIHRlcm1pbmF0b3IgZWxlbWVudHMuIG50ZnNfbWFsbG9jX25vZnMoKQorCQkgKiBvcGVyYXRlcyBvbiB3aG9sZSBwYWdlcyBvbmx5LgorCQkgKi8KKwkJaWYgKCgocmxwb3MgKyAzKSAqIHNpemVvZigqb2xkX3JsKSkgPiBybHNpemUpIHsKKwkJCXJ1bmxpc3RfZWxlbWVudCAqcmwyOworCisJCQlybDIgPSBudGZzX21hbGxvY19ub2ZzKHJsc2l6ZSArIChpbnQpUEFHRV9TSVpFKTsKKwkJCWlmICh1bmxpa2VseSghcmwyKSkgeworCQkJCW50ZnNfZnJlZShybCk7CisJCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCQl9CisJCQltZW1jcHkocmwyLCBybCwgcmxzaXplKTsKKwkJCW50ZnNfZnJlZShybCk7CisJCQlybCA9IHJsMjsKKwkJCXJsc2l6ZSArPSBQQUdFX1NJWkU7CisJCX0KKwkJLyogRW50ZXIgdGhlIGN1cnJlbnQgdmNuIGludG8gdGhlIGN1cnJlbnQgcnVubGlzdCBlbGVtZW50LiAqLworCQlybFtybHBvc10udmNuID0gdmNuOworCQkvKgorCQkgKiBHZXQgdGhlIGNoYW5nZSBpbiB2Y24sIGkuZS4gdGhlIHJ1biBsZW5ndGggaW4gY2x1c3RlcnMuCisJCSAqIERvaW5nIGl0IHRoaXMgd2F5IGVuc3VyZXMgdGhhdCB3ZSBzaWduZXh0ZW5kIG5lZ2F0aXZlIHZhbHVlcy4KKwkJICogQSBuZWdhdGl2ZSBydW4gbGVuZ3RoIGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2UsIGJ1dCBoZXksIEkKKwkJICogZGlkbid0IG1ha2UgdXAgdGhlIE5URlMgc3BlY3MgYW5kIFdpbmRvd3MgTlQ0IHRyZWF0cyB0aGUgcnVuCisJCSAqIGxlbmd0aCBhcyBhIHNpZ25lZCB2YWx1ZSBzbyB0aGF0J3MgaG93IGl0IGlzLi4uCisJCSAqLworCQliID0gKmJ1ZiAmIDB4ZjsKKwkJaWYgKGIpIHsKKwkJCWlmICh1bmxpa2VseShidWYgKyBiID4gYXR0cl9lbmQpKQorCQkJCWdvdG8gaW9fZXJyb3I7CisJCQlmb3IgKGRlbHRheGNuID0gKHM4KWJ1ZltiLS1dOyBiOyBiLS0pCisJCQkJZGVsdGF4Y24gPSAoZGVsdGF4Y24gPDwgOCkgKyBidWZbYl07CisJCX0gZWxzZSB7IC8qIFRoZSBsZW5ndGggZW50cnkgaXMgY29tcHVsc29yeS4gKi8KKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIk1pc3NpbmcgbGVuZ3RoIGVudHJ5IGluIG1hcHBpbmcgIgorCQkJCQkicGFpcnMgYXJyYXkuIik7CisJCQlkZWx0YXhjbiA9IChzNjQpLTE7CisJCX0KKwkJLyoKKwkJICogQXNzdW1lIGEgbmVnYXRpdmUgbGVuZ3RoIHRvIGluZGljYXRlIGRhdGEgY29ycnVwdGlvbiBhbmQKKwkJICogaGVuY2UgY2xlYW4tdXAgYW5kIHJldHVybiBOVUxMLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KGRlbHRheGNuIDwgMCkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkludmFsaWQgbGVuZ3RoIGluIG1hcHBpbmcgcGFpcnMgIgorCQkJCQkiYXJyYXkuIik7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJLyoKKwkJICogRW50ZXIgdGhlIGN1cnJlbnQgcnVuIGxlbmd0aCBpbnRvIHRoZSBjdXJyZW50IHJ1bmxpc3QKKwkJICogZWxlbWVudC4KKwkJICovCisJCXJsW3JscG9zXS5sZW5ndGggPSBkZWx0YXhjbjsKKwkJLyogSW5jcmVtZW50IHRoZSBjdXJyZW50IHZjbiBieSB0aGUgY3VycmVudCBydW4gbGVuZ3RoLiAqLworCQl2Y24gKz0gZGVsdGF4Y247CisJCS8qCisJCSAqIFRoZXJlIG1pZ2h0IGJlIG5vIGxjbiBjaGFuZ2UgYXQgYWxsLCBhcyBpcyB0aGUgY2FzZSBmb3IKKwkJICogc3BhcnNlIGNsdXN0ZXJzIG9uIE5URlMgMy4wKywgaW4gd2hpY2ggY2FzZSB3ZSBzZXQgdGhlIGxjbgorCQkgKiB0byBMQ05fSE9MRS4KKwkJICovCisJCWlmICghKCpidWYgJiAweGYwKSkKKwkJCXJsW3JscG9zXS5sY24gPSBMQ05fSE9MRTsKKwkJZWxzZSB7CisJCQkvKiBHZXQgdGhlIGxjbiBjaGFuZ2Ugd2hpY2ggcmVhbGx5IGNhbiBiZSBuZWdhdGl2ZS4gKi8KKwkJCXU4IGIyID0gKmJ1ZiAmIDB4ZjsKKwkJCWIgPSBiMiArICgoKmJ1ZiA+PiA0KSAmIDB4Zik7CisJCQlpZiAoYnVmICsgYiA+IGF0dHJfZW5kKQorCQkJCWdvdG8gaW9fZXJyb3I7CisJCQlmb3IgKGRlbHRheGNuID0gKHM4KWJ1ZltiLS1dOyBiID4gYjI7IGItLSkKKwkJCQlkZWx0YXhjbiA9IChkZWx0YXhjbiA8PCA4KSArIGJ1ZltiXTsKKwkJCS8qIENoYW5nZSB0aGUgY3VycmVudCBsY24gdG8gaXRzIG5ldyB2YWx1ZS4gKi8KKwkJCWxjbiArPSBkZWx0YXhjbjsKKyNpZmRlZiBERUJVRworCQkJLyoKKwkJCSAqIE9uIE5URlMgMS4yLSwgYXBwYXJlbnRseSBjYW4gaGF2ZSBsY24gPT0gLTEgdG8KKwkJCSAqIGluZGljYXRlIGEgaG9sZS4gQnV0IHdlIGhhdmVuJ3QgdmVyaWZpZWQgb3Vyc2VsdmVzCisJCQkgKiB3aGV0aGVyIGl0IGlzIHJlYWxseSB0aGUgbGNuIG9yIHRoZSBkZWx0YXhjbiB0aGF0IGlzCisJCQkgKiAtMS4gU28gaWYgZWl0aGVyIGlzIGZvdW5kIGdpdmUgdXMgYSBtZXNzYWdlIHNvIHdlCisJCQkgKiBjYW4gaW52ZXN0aWdhdGUgaXQgZnVydGhlciEKKwkJCSAqLworCQkJaWYgKHZvbC0+bWFqb3JfdmVyIDwgMykgeworCQkJCWlmICh1bmxpa2VseShkZWx0YXhjbiA9PSAoTENOKS0xKSkKKwkJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAibGNuIGRlbHRhID09IC0xIik7CisJCQkJaWYgKHVubGlrZWx5KGxjbiA9PSAoTENOKS0xKSkKKwkJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAibGNuID09IC0xIik7CisJCQl9CisjZW5kaWYKKwkJCS8qIENoZWNrIGxjbiBpcyBub3QgYmVsb3cgLTEuICovCisJCQlpZiAodW5saWtlbHkobGNuIDwgKExDTiktMSkpIHsKKwkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJJbnZhbGlkIExDTiA8IC0xIGluICIKKwkJCQkJCSJtYXBwaW5nIHBhaXJzIGFycmF5LiIpOworCQkJCWdvdG8gZXJyX291dDsKKwkJCX0KKwkJCS8qIEVudGVyIHRoZSBjdXJyZW50IGxjbiBpbnRvIHRoZSBydW5saXN0IGVsZW1lbnQuICovCisJCQlybFtybHBvc10ubGNuID0gbGNuOworCQl9CisJCS8qIEdldCB0byB0aGUgbmV4dCBydW5saXN0IGVsZW1lbnQuICovCisJCXJscG9zKys7CisJCS8qIEluY3JlbWVudCB0aGUgYnVmZmVyIHBvc2l0aW9uIHRvIHRoZSBuZXh0IG1hcHBpbmcgcGFpci4gKi8KKwkJYnVmICs9ICgqYnVmICYgMHhmKSArICgoKmJ1ZiA+PiA0KSAmIDB4ZikgKyAxOworCX0KKwlpZiAodW5saWtlbHkoYnVmID49IGF0dHJfZW5kKSkKKwkJZ290byBpb19lcnJvcjsKKwkvKgorCSAqIElmIHRoZXJlIGlzIGEgaGlnaGVzdF92Y24gc3BlY2lmaWVkLCBpdCBtdXN0IGJlIGVxdWFsIHRvIHRoZSBmaW5hbAorCSAqIHZjbiBpbiB0aGUgcnVubGlzdCAtIDEsIG9yIHNvbWV0aGluZyBoYXMgZ29uZSBiYWRseSB3cm9uZy4KKwkgKi8KKwlkZWx0YXhjbiA9IHNsZTY0X3RvX2NwdShhdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5oaWdoZXN0X3Zjbik7CisJaWYgKHVubGlrZWx5KGRlbHRheGNuICYmIHZjbiAtIDEgIT0gZGVsdGF4Y24pKSB7CittcGFfZXJyOgorCQludGZzX2Vycm9yKHZvbC0+c2IsICJDb3JydXB0IG1hcHBpbmcgcGFpcnMgYXJyYXkgaW4gIgorCQkJCSJub24tcmVzaWRlbnQgYXR0cmlidXRlLiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIFNldHVwIG5vdCBtYXBwZWQgcnVubGlzdCBlbGVtZW50IGlmIHRoaXMgaXMgdGhlIGJhc2UgZXh0ZW50LiAqLworCWlmICghYXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgeworCQlWQ04gbWF4X2NsdXN0ZXI7CisKKwkJbWF4X2NsdXN0ZXIgPSAoc2xlNjRfdG9fY3B1KAorCQkJCWF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmFsbG9jYXRlZF9zaXplKSArCisJCQkJdm9sLT5jbHVzdGVyX3NpemUgLSAxKSA+PgorCQkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CisJCS8qCisJCSAqIElmIHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBoaWdoZXN0X3ZjbiBhbmQgdGhlCisJCSAqIGhpZ2hlc3QgY2x1c3RlciwgdGhlIHJ1bmxpc3QgaXMgZWl0aGVyIGNvcnJ1cHQgb3IsIG1vcmUKKwkJICogbGlrZWx5LCB0aGVyZSBhcmUgbW9yZSBleHRlbnRzIGZvbGxvd2luZyB0aGlzIG9uZS4KKwkJICovCisJCWlmIChkZWx0YXhjbiA8IC0tbWF4X2NsdXN0ZXIpIHsKKwkJCW50ZnNfZGVidWcoIk1vcmUgZXh0ZW50cyB0byBmb2xsb3c7IGRlbHRheGNuID0gMHglbGx4LCAiCisJCQkJCSJtYXhfY2x1c3RlciA9IDB4JWxseCIsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZGVsdGF4Y24sCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWF4X2NsdXN0ZXIpOworCQkJcmxbcmxwb3NdLnZjbiA9IHZjbjsKKwkJCXZjbiArPSBybFtybHBvc10ubGVuZ3RoID0gbWF4X2NsdXN0ZXIgLSBkZWx0YXhjbjsKKwkJCXJsW3JscG9zXS5sY24gPSBMQ05fUkxfTk9UX01BUFBFRDsKKwkJCXJscG9zKys7CisJCX0gZWxzZSBpZiAodW5saWtlbHkoZGVsdGF4Y24gPiBtYXhfY2x1c3RlcikpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkNvcnJ1cHQgYXR0cmlidXRlLiBkZWx0YXhjbiA9ICIKKwkJCQkJIjB4JWxseCwgbWF4X2NsdXN0ZXIgPSAweCVsbHgiLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWRlbHRheGNuLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKW1heF9jbHVzdGVyKTsKKwkJCWdvdG8gbXBhX2VycjsKKwkJfQorCQlybFtybHBvc10ubGNuID0gTENOX0VOT0VOVDsKKwl9IGVsc2UgLyogTm90IHRoZSBiYXNlIGV4dGVudC4gVGhlcmUgbWF5IGJlIG1vcmUgZXh0ZW50cyB0byBmb2xsb3cuICovCisJCXJsW3JscG9zXS5sY24gPSBMQ05fUkxfTk9UX01BUFBFRDsKKworCS8qIFNldHVwIHRlcm1pbmF0aW5nIHJ1bmxpc3QgZWxlbWVudC4gKi8KKwlybFtybHBvc10udmNuID0gdmNuOworCXJsW3JscG9zXS5sZW5ndGggPSAoczY0KTA7CisJLyogSWYgbm8gZXhpc3RpbmcgcnVubGlzdCB3YXMgc3BlY2lmaWVkLCB3ZSBhcmUgZG9uZS4gKi8KKwlpZiAoIW9sZF9ybCkgeworCQludGZzX2RlYnVnKCJNYXBwaW5nIHBhaXJzIGFycmF5IHN1Y2Nlc3NmdWxseSBkZWNvbXByZXNzZWQ6Iik7CisJCW50ZnNfZGVidWdfZHVtcF9ydW5saXN0KHJsKTsKKwkJcmV0dXJuIHJsOworCX0KKwkvKiBOb3cgY29tYmluZSB0aGUgbmV3IGFuZCBvbGQgcnVubGlzdHMgY2hlY2tpbmcgZm9yIG92ZXJsYXBzLiAqLworCW9sZF9ybCA9IG50ZnNfcnVubGlzdHNfbWVyZ2Uob2xkX3JsLCBybCk7CisJaWYgKGxpa2VseSghSVNfRVJSKG9sZF9ybCkpKQorCQlyZXR1cm4gb2xkX3JsOworCW50ZnNfZnJlZShybCk7CisJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIG1lcmdlIHJ1bmxpc3RzLiIpOworCXJldHVybiBvbGRfcmw7Citpb19lcnJvcjoKKwludGZzX2Vycm9yKHZvbC0+c2IsICJDb3JydXB0IGF0dHJpYnV0ZS4iKTsKK2Vycl9vdXQ6CisJbnRmc19mcmVlKHJsKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlPKTsKK30KKworLyoqCisgKiBudGZzX3JsX3Zjbl90b19sY24gLSBjb252ZXJ0IGEgdmNuIGludG8gYSBsY24gZ2l2ZW4gYSBydW5saXN0CisgKiBAcmw6CQlydW5saXN0IHRvIHVzZSBmb3IgY29udmVyc2lvbgorICogQHZjbjoJdmNuIHRvIGNvbnZlcnQKKyAqCisgKiBDb252ZXJ0IHRoZSB2aXJ0dWFsIGNsdXN0ZXIgbnVtYmVyIEB2Y24gb2YgYW4gYXR0cmlidXRlIGludG8gYSBsb2dpY2FsCisgKiBjbHVzdGVyIG51bWJlciAobGNuKSBvZiBhIGRldmljZSB1c2luZyB0aGUgcnVubGlzdCBAcmwgdG8gbWFwIHZjbnMgdG8gdGhlaXIKKyAqIGNvcnJlc3BvbmRpbmcgbGNucy4KKyAqCisgKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHJ1bmxpc3QgQHJsLgorICoKKyAqIFNpbmNlIGxjbnMgbXVzdCBiZSA+PSAwLCB3ZSB1c2UgbmVnYXRpdmUgcmV0dXJuIHZhbHVlcyB3aXRoIHNwZWNpYWwgbWVhbmluZzoKKyAqCisgKiBSZXR1cm4gdmFsdWUJCQlNZWFuaW5nIC8gRGVzY3JpcHRpb24KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgLTEgPSBMQ05fSE9MRQkJSG9sZSAvIG5vdCBhbGxvY2F0ZWQgb24gZGlzay4KKyAqICAtMiA9IExDTl9STF9OT1RfTUFQUEVECVRoaXMgaXMgcGFydCBvZiB0aGUgcnVubGlzdCB3aGljaCBoYXMgbm90IGJlZW4KKyAqCQkJCWluc2VydGVkIGludG8gdGhlIHJ1bmxpc3QgeWV0LgorICogIC0zID0gTENOX0VOT0VOVAkJVGhlcmUgaXMgbm8gc3VjaCB2Y24gaW4gdGhlIGF0dHJpYnV0ZS4KKyAqCisgKiBMb2NraW5nOiAtIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGxvY2tlZCB0aGUgcnVubGlzdCAoZm9yIHJlYWRpbmcgb3Igd3JpdGluZykuCisgKgkgICAgLSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRvdWNoIHRoZSBsb2NrLgorICovCitMQ04gbnRmc19ybF92Y25fdG9fbGNuKGNvbnN0IHJ1bmxpc3RfZWxlbWVudCAqcmwsIGNvbnN0IFZDTiB2Y24pCit7CisJaW50IGk7CisKKwlCVUdfT04odmNuIDwgMCk7CisJLyoKKwkgKiBJZiBybCBpcyBOVUxMLCBhc3N1bWUgdGhhdCB3ZSBoYXZlIGZvdW5kIGFuIHVubWFwcGVkIHJ1bmxpc3QuIFRoZQorCSAqIGNhbGxlciBjYW4gdGhlbiBhdHRlbXB0IHRvIG1hcCBpdCBhbmQgZmFpbCBhcHByb3ByaWF0ZWx5IGlmCisJICogbmVjZXNzYXJ5LgorCSAqLworCWlmICh1bmxpa2VseSghcmwpKQorCQlyZXR1cm4gTENOX1JMX05PVF9NQVBQRUQ7CisKKwkvKiBDYXRjaCBvdXQgb2YgbG93ZXIgYm91bmRzIHZjbi4gKi8KKwlpZiAodW5saWtlbHkodmNuIDwgcmxbMF0udmNuKSkKKwkJcmV0dXJuIExDTl9FTk9FTlQ7CisKKwlmb3IgKGkgPSAwOyBsaWtlbHkocmxbaV0ubGVuZ3RoKTsgaSsrKSB7CisJCWlmICh1bmxpa2VseSh2Y24gPCBybFtpKzFdLnZjbikpIHsKKwkJCWlmIChsaWtlbHkocmxbaV0ubGNuID49IChMQ04pMCkpCisJCQkJcmV0dXJuIHJsW2ldLmxjbiArICh2Y24gLSBybFtpXS52Y24pOworCQkJcmV0dXJuIHJsW2ldLmxjbjsKKwkJfQorCX0KKwkvKgorCSAqIFRoZSB0ZXJtaW5hdG9yIGVsZW1lbnQgaXMgc2V0dXAgdG8gdGhlIGNvcnJlY3QgdmFsdWUsIGkuZS4gb25lIG9mCisJICogTENOX0hPTEUsIExDTl9STF9OT1RfTUFQUEVELCBvciBMQ05fRU5PRU5ULgorCSAqLworCWlmIChsaWtlbHkocmxbaV0ubGNuIDwgKExDTikwKSkKKwkJcmV0dXJuIHJsW2ldLmxjbjsKKwkvKiBKdXN0IGluIGNhc2UuLi4gV2UgY291bGQgcmVwbGFjZSB0aGlzIHdpdGggQlVHKCkgc29tZSBkYXkuICovCisJcmV0dXJuIExDTl9FTk9FTlQ7Cit9CisKKy8qKgorICogbnRmc19nZXRfbnJfc2lnbmlmaWNhbnRfYnl0ZXMgLSBnZXQgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBzdG9yZSBhIG51bWJlcgorICogQG46CQludW1iZXIgZm9yIHdoaWNoIHRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZvcgorICoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIEBuIHVuYW1iaWd1b3VzbHkgYXMKKyAqIGEgc2lnbmVkIG51bWJlci4KKyAqCisgKiBUaGlzIGlzIHVzZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkgdG8gZGV0ZXJtaW5lIGhvdworICogbWFueSBieXRlcyB3aWxsIGJlIG5lZWRlZCBpbiB0aGUgYXJyYXkgdG8gc3RvcmUgYSBnaXZlbiBsb2dpY2FsIGNsdXN0ZXIKKyAqIG51bWJlciAobGNuKSBvciBhIHNwZWNpZmljIHJ1biBsZW5ndGguCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gIFRoaXMgZnVuY3Rpb24gY2Fubm90IGZhaWwuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG50ZnNfZ2V0X25yX3NpZ25pZmljYW50X2J5dGVzKGNvbnN0IHM2NCBuKQoreworCXM2NCBsID0gbjsKKwlpbnQgaTsKKwlzOCBqOworCisJaSA9IDA7CisJZG8geworCQlsID4+PSA4OworCQlpKys7CisJfSB3aGlsZSAobCAhPSAwICYmIGwgIT0gLTEpOworCWogPSAobiA+PiA4ICogKGkgLSAxKSkgJiAweGZmOworCS8qIElmIHRoZSBzaWduIGJpdCBpcyB3cm9uZywgd2UgbmVlZCBhbiBleHRyYSBieXRlLiAqLworCWlmICgobiA8IDAgJiYgaiA+PSAwKSB8fCAobiA+IDAgJiYgaiA8IDApKQorCQlpKys7CisJcmV0dXJuIGk7Cit9CisKKy8qKgorICogbnRmc19nZXRfc2l6ZV9mb3JfbWFwcGluZ19wYWlycyAtIGdldCBieXRlcyBuZWVkZWQgZm9yIG1hcHBpbmcgcGFpcnMgYXJyYXkKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIChuZWVkZWQgZm9yIHRoZSBudGZzIHZlcnNpb24pCisgKiBAcmw6CQlsb2NrZWQgcnVubGlzdCB0byBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIG1hcHBpbmcgcGFpcnMgb2YKKyAqIEBzdGFydF92Y246CXZjbiBhdCB3aGljaCB0byBzdGFydCB0aGUgbWFwcGluZyBwYWlycyBhcnJheQorICoKKyAqIFdhbGsgdGhlIGxvY2tlZCBydW5saXN0IEBybCBhbmQgY2FsY3VsYXRlIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBtYXBwaW5nCisgKiBwYWlycyBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBydW5saXN0IEBybCwgc3RhcnRpbmcgYXQgdmNuIEBzdGFydF92Y24uCisgKiBUaGlzIGZvciBleGFtcGxlIGFsbG93cyB1cyB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBvZiB0aGUgcmlnaHQgc2l6ZSB3aGVuCisgKiBidWlsZGluZyB0aGUgbWFwcGluZyBwYWlycyBhcnJheS4KKyAqCisgKiBJZiBAcmwgaXMgTlVMTCwganVzdCByZXR1cm4gMSAoZm9yIHRoZSBzaW5nbGUgdGVybWluYXRvciBieXRlKS4KKyAqCisgKiBSZXR1cm4gdGhlIGNhbGN1bGF0ZWQgc2l6ZSBpbiBieXRlcyBvbiBzdWNjZXNzLiAgT24gZXJyb3IsIHJldHVybiAtZXJybm8uCisgKiBUaGUgZm9sbG93aW5nIGVycm9yIGNvZGVzIGFyZSBkZWZpbmVkOgorICoJLUVJTlZBTAktIFJ1biBsaXN0IGNvbnRhaW5zIHVubWFwcGVkIGVsZW1lbnRzLiAgTWFrZSBzdXJlIHRvIG9ubHkgcGFzcworICoJCSAgZnVsbHkgbWFwcGVkIHJ1bmxpc3RzIHRvIHRoaXMgZnVuY3Rpb24uCisgKgktRUlPCS0gVGhlIHJ1bmxpc3QgaXMgY29ycnVwdC4KKyAqCisgKiBMb2NraW5nOiBAcmwgbXVzdCBiZSBsb2NrZWQgb24gZW50cnkgKGVpdGhlciBmb3IgcmVhZGluZyBvciB3cml0aW5nKSwgaXQKKyAqCSAgICByZW1haW5zIGxvY2tlZCB0aHJvdWdob3V0LCBhbmQgaXMgbGVmdCBsb2NrZWQgdXBvbiByZXR1cm4uCisgKi8KK2ludCBudGZzX2dldF9zaXplX2Zvcl9tYXBwaW5nX3BhaXJzKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IHJ1bmxpc3RfZWxlbWVudCAqcmwsIGNvbnN0IFZDTiBzdGFydF92Y24pCit7CisJTENOIHByZXZfbGNuOworCWludCBybHM7CisKKwlCVUdfT04oc3RhcnRfdmNuIDwgMCk7CisJaWYgKCFybCkgeworCQlCVUdfT04oc3RhcnRfdmNuKTsKKwkJcmV0dXJuIDE7CisJfQorCS8qIFNraXAgdG8gcnVubGlzdCBlbGVtZW50IGNvbnRhaW5pbmcgQHN0YXJ0X3Zjbi4gKi8KKwl3aGlsZSAocmwtPmxlbmd0aCAmJiBzdGFydF92Y24gPj0gcmxbMV0udmNuKQorCQlybCsrOworCWlmICgoIXJsLT5sZW5ndGggJiYgc3RhcnRfdmNuID4gcmwtPnZjbikgfHwgc3RhcnRfdmNuIDwgcmwtPnZjbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHJldl9sY24gPSAwOworCS8qIEFsd2F5cyBuZWVkIHRoZSB0ZXJtaW5pbmcgemVybyBieXRlLiAqLworCXJscyA9IDE7CisJLyogRG8gdGhlIGZpcnN0IHBhcnRpYWwgcnVuIGlmIHByZXNlbnQuICovCisJaWYgKHN0YXJ0X3ZjbiA+IHJsLT52Y24pIHsKKwkJczY0IGRlbHRhOworCisJCS8qIFdlIGtub3cgcmwtPmxlbmd0aCAhPSAwIGFscmVhZHkuICovCisJCWlmIChybC0+bGVuZ3RoIDwgMCB8fCBybC0+bGNuIDwgTENOX0hPTEUpCisJCQlnb3RvIGVycl9vdXQ7CisJCWRlbHRhID0gc3RhcnRfdmNuIC0gcmwtPnZjbjsKKwkJLyogSGVhZGVyIGJ5dGUgKyBsZW5ndGguICovCisJCXJscyArPSAxICsgbnRmc19nZXRfbnJfc2lnbmlmaWNhbnRfYnl0ZXMocmwtPmxlbmd0aCAtIGRlbHRhKTsKKwkJLyoKKwkJICogSWYgdGhlIGxvZ2ljYWwgY2x1c3RlciBudW1iZXIgKGxjbikgZGVub3RlcyBhIGhvbGUgYW5kIHdlCisJCSAqIGFyZSBvbiBOVEZTIDMuMCssIHdlIGRvbid0IHN0b3JlIGl0IGF0IGFsbCwgaS5lLiB3ZSBuZWVkCisJCSAqIHplcm8gc3BhY2UuICBPbiBlYXJsaWVyIE5URlMgdmVyc2lvbnMgd2UganVzdCBzdG9yZSB0aGUgbGNuLgorCQkgKiBOb3RlOiB0aGlzIGFzc3VtZXMgdGhhdCBvbiBOVEZTIDEuMi0sIGhvbGVzIGFyZSBzdG9yZWQgd2l0aAorCQkgKiBhbiBsY24gb2YgLTEgYW5kIG5vdCBhIGRlbHRhX2xjbiBvZiAtMSAodW5sZXNzIGJvdGggYXJlIC0xKS4KKwkJICovCisJCWlmIChybC0+bGNuID49IDAgfHwgdm9sLT5tYWpvcl92ZXIgPCAzKSB7CisJCQlwcmV2X2xjbiA9IHJsLT5sY247CisJCQlpZiAocmwtPmxjbiA+PSAwKQorCQkJCXByZXZfbGNuICs9IGRlbHRhOworCQkJLyogQ2hhbmdlIGluIGxjbi4gKi8KKwkJCXJscyArPSBudGZzX2dldF9ucl9zaWduaWZpY2FudF9ieXRlcyhwcmV2X2xjbik7CisJCX0KKwkJLyogR28gdG8gbmV4dCBydW5saXN0IGVsZW1lbnQuICovCisJCXJsKys7CisJfQorCS8qIERvIHRoZSBmdWxsIHJ1bnMuICovCisJZm9yICg7IHJsLT5sZW5ndGg7IHJsKyspIHsKKwkJaWYgKHJsLT5sZW5ndGggPCAwIHx8IHJsLT5sY24gPCBMQ05fSE9MRSkKKwkJCWdvdG8gZXJyX291dDsKKwkJLyogSGVhZGVyIGJ5dGUgKyBsZW5ndGguICovCisJCXJscyArPSAxICsgbnRmc19nZXRfbnJfc2lnbmlmaWNhbnRfYnl0ZXMocmwtPmxlbmd0aCk7CisJCS8qCisJCSAqIElmIHRoZSBsb2dpY2FsIGNsdXN0ZXIgbnVtYmVyIChsY24pIGRlbm90ZXMgYSBob2xlIGFuZCB3ZQorCQkgKiBhcmUgb24gTlRGUyAzLjArLCB3ZSBkb24ndCBzdG9yZSBpdCBhdCBhbGwsIGkuZS4gd2UgbmVlZAorCQkgKiB6ZXJvIHNwYWNlLiAgT24gZWFybGllciBOVEZTIHZlcnNpb25zIHdlIGp1c3Qgc3RvcmUgdGhlIGxjbi4KKwkJICogTm90ZTogdGhpcyBhc3N1bWVzIHRoYXQgb24gTlRGUyAxLjItLCBob2xlcyBhcmUgc3RvcmVkIHdpdGgKKwkJICogYW4gbGNuIG9mIC0xIGFuZCBub3QgYSBkZWx0YV9sY24gb2YgLTEgKHVubGVzcyBib3RoIGFyZSAtMSkuCisJCSAqLworCQlpZiAocmwtPmxjbiA+PSAwIHx8IHZvbC0+bWFqb3JfdmVyIDwgMykgeworCQkJLyogQ2hhbmdlIGluIGxjbi4gKi8KKwkJCXJscyArPSBudGZzX2dldF9ucl9zaWduaWZpY2FudF9ieXRlcyhybC0+bGNuIC0KKwkJCQkJcHJldl9sY24pOworCQkJcHJldl9sY24gPSBybC0+bGNuOworCQl9CisJfQorCXJldHVybiBybHM7CitlcnJfb3V0OgorCWlmIChybC0+bGNuID09IExDTl9STF9OT1RfTUFQUEVEKQorCQlybHMgPSAtRUlOVkFMOworCWVsc2UKKwkJcmxzID0gLUVJTzsKKwlyZXR1cm4gcmxzOworfQorCisvKioKKyAqIG50ZnNfd3JpdGVfc2lnbmlmaWNhbnRfYnl0ZXMgLSB3cml0ZSB0aGUgc2lnbmlmaWNhbnQgYnl0ZXMgb2YgYSBudW1iZXIKKyAqIEBkc3Q6CWRlc3RpbmF0aW9uIGJ1ZmZlciB0byB3cml0ZSB0bworICogQGRzdF9tYXg6CXBvaW50ZXIgdG8gbGFzdCBieXRlIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlciBmb3IgYm91bmRzIGNoZWNraW5nCisgKiBAbjoJCW51bWJlciB3aG9zZSBzaWduaWZpY2FudCBieXRlcyB0byB3cml0ZQorICoKKyAqIFN0b3JlIGluIEBkc3QsIHRoZSBtaW5pbXVtIGJ5dGVzIG9mIHRoZSBudW1iZXIgQG4gd2hpY2ggYXJlIHJlcXVpcmVkIHRvCisgKiBpZGVudGlmeSBAbiB1bmFtYmlndW91c2x5IGFzIGEgc2lnbmVkIG51bWJlciwgdGFraW5nIGNhcmUgbm90IHRvIGV4Y2VlZAorICogQGRlc3RfbWF4LCB0aGUgbWF4aW11bSBwb3NpdGlvbiB3aXRoaW4gQGRzdCB0byB3aGljaCB3ZSBhcmUgYWxsb3dlZCB0bworICogd3JpdGUuCisgKgorICogVGhpcyBpcyB1c2VkIHdoZW4gYnVpbGRpbmcgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkgb2YgYSBydW5saXN0IHRvIGNvbXByZXNzCisgKiBhIGdpdmVuIGxvZ2ljYWwgY2x1c3RlciBudW1iZXIgKGxjbikgb3IgYSBzcGVjaWZpYyBydW4gbGVuZ3RoIHRvIHRoZSBtaW51bXVtCisgKiBzaXplIHBvc3NpYmxlLgorICoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gb24gc3VjY2Vzcy4gIE9uIGVycm9yLCBpLmUuIHRoZQorICogZGVzdGluYXRpb24gYnVmZmVyIEBkc3QgaXMgdG9vIHNtYWxsLCByZXR1cm4gLUVOT1NQQy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbnRmc193cml0ZV9zaWduaWZpY2FudF9ieXRlcyhzOCAqZHN0LCBjb25zdCBzOCAqZHN0X21heCwKKwkJY29uc3QgczY0IG4pCit7CisJczY0IGwgPSBuOworCWludCBpOworCXM4IGo7CisKKwlpID0gMDsKKwlkbyB7CisJCWlmIChkc3QgPiBkc3RfbWF4KQorCQkJZ290byBlcnJfb3V0OworCQkqZHN0KysgPSBsICYgMHhmZmxsOworCQlsID4+PSA4OworCQlpKys7CisJfSB3aGlsZSAobCAhPSAwICYmIGwgIT0gLTEpOworCWogPSAobiA+PiA4ICogKGkgLSAxKSkgJiAweGZmOworCS8qIElmIHRoZSBzaWduIGJpdCBpcyB3cm9uZywgd2UgbmVlZCBhbiBleHRyYSBieXRlLiAqLworCWlmIChuIDwgMCAmJiBqID49IDApIHsKKwkJaWYgKGRzdCA+IGRzdF9tYXgpCisJCQlnb3RvIGVycl9vdXQ7CisJCWkrKzsKKwkJKmRzdCA9IChzOCktMTsKKwl9IGVsc2UgaWYgKG4gPiAwICYmIGogPCAwKSB7CisJCWlmIChkc3QgPiBkc3RfbWF4KQorCQkJZ290byBlcnJfb3V0OworCQlpKys7CisJCSpkc3QgPSAoczgpMDsKKwl9CisJcmV0dXJuIGk7CitlcnJfb3V0OgorCXJldHVybiAtRU5PU1BDOworfQorCisvKioKKyAqIG50ZnNfbWFwcGluZ19wYWlyc19idWlsZCAtIGJ1aWxkIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5IGZyb20gYSBydW5saXN0CisgKiBAdm9sOgludGZzIHZvbHVtZSAobmVlZGVkIGZvciB0aGUgbnRmcyB2ZXJzaW9uKQorICogQGRzdDoJZGVzdGluYXRpb24gYnVmZmVyIHRvIHdoaWNoIHRvIHdyaXRlIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5CisgKiBAZHN0X2xlbjoJc2l6ZSBvZiBkZXN0aW5hdGlvbiBidWZmZXIgQGRzdCBpbiBieXRlcworICogQHJsOgkJbG9ja2VkIHJ1bmxpc3QgZm9yIHdoaWNoIHRvIGJ1aWxkIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5CisgKiBAc3RhcnRfdmNuOgl2Y24gYXQgd2hpY2ggdG8gc3RhcnQgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkKKyAqIEBzdG9wX3ZjbjoJZmlyc3QgdmNuIG91dHNpZGUgZGVzdGluYXRpb24gYnVmZmVyIG9uIHN1Y2Nlc3Mgb3IgLUVOT1NQQworICoKKyAqIENyZWF0ZSB0aGUgbWFwcGluZyBwYWlycyBhcnJheSBmcm9tIHRoZSBsb2NrZWQgcnVubGlzdCBAcmwsIHN0YXJ0aW5nIGF0IHZjbgorICogQHN0YXJ0X3ZjbiBhbmQgc2F2ZSB0aGUgYXJyYXkgaW4gQGRzdC4gIEBkc3RfbGVuIGlzIHRoZSBzaXplIG9mIEBkc3QgaW4KKyAqIGJ5dGVzIGFuZCBpdCBzaG91bGQgYmUgYXQgbGVhc3QgZXF1YWwgdG8gdGhlIHZhbHVlIG9idGFpbmVkIGJ5IGNhbGxpbmcKKyAqIG50ZnNfZ2V0X3NpemVfZm9yX21hcHBpbmdfcGFpcnMoKS4KKyAqCisgKiBJZiBAcmwgaXMgTlVMTCwganVzdCB3cml0ZSBhIHNpbmdsZSB0ZXJtaW5hdG9yIGJ5dGUgdG8gQGRzdC4KKyAqCisgKiBPbiBzdWNjZXNzIG9yIC1FTk9TUEMgZXJyb3IsIGlmIEBzdG9wX3ZjbiBpcyBub3QgTlVMTCwgKkBzdG9wX3ZjbiBpcyBzZXQgdG8KKyAqIHRoZSBmaXJzdCB2Y24gb3V0c2lkZSB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgTm90ZSB0aGF0IG9uIGVycm9yLCBAZHN0IGhhcworICogYmVlbiBmaWxsZWQgd2l0aCBhbGwgdGhlIG1hcHBpbmcgcGFpcnMgdGhhdCB3aWxsIGZpdCwgdGh1cyBpdCBjYW4gYmUgdHJlYXRlZAorICogYXMgcGFydGlhbCBzdWNjZXNzLCBpbiB0aGF0IGEgbmV3IGF0dHJpYnV0ZSBleHRlbnQgbmVlZHMgdG8gYmUgY3JlYXRlZCBvcgorICogdGhlIG5leHQgZXh0ZW50IGhhcyB0byBiZSB1c2VkIGFuZCB0aGUgbWFwcGluZyBwYWlycyBidWlsZCBoYXMgdG8gYmUKKyAqIGNvbnRpbnVlZCB3aXRoIEBzdGFydF92Y24gc2V0IHRvICpAc3RvcF92Y24uCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLiAgVGhlIGZvbGxvd2luZyBlcnJvciBjb2RlcyBhcmUKKyAqIGRlZmluZWQ6CisgKgktRUlOVkFMCS0gUnVuIGxpc3QgY29udGFpbnMgdW5tYXBwZWQgZWxlbWVudHMuICBNYWtlIHN1cmUgdG8gb25seSBwYXNzCisgKgkJICBmdWxseSBtYXBwZWQgcnVubGlzdHMgdG8gdGhpcyBmdW5jdGlvbi4KKyAqCS1FSU8JLSBUaGUgcnVubGlzdCBpcyBjb3JydXB0LgorICoJLUVOT1NQQwktIFRoZSBkZXN0aW5hdGlvbiBidWZmZXIgaXMgdG9vIHNtYWxsLgorICoKKyAqIExvY2tpbmc6IEBybCBtdXN0IGJlIGxvY2tlZCBvbiBlbnRyeSAoZWl0aGVyIGZvciByZWFkaW5nIG9yIHdyaXRpbmcpLCBpdAorICoJICAgIHJlbWFpbnMgbG9ja2VkIHRocm91Z2hvdXQsIGFuZCBpcyBsZWZ0IGxvY2tlZCB1cG9uIHJldHVybi4KKyAqLworaW50IG50ZnNfbWFwcGluZ19wYWlyc19idWlsZChjb25zdCBudGZzX3ZvbHVtZSAqdm9sLCBzOCAqZHN0LAorCQljb25zdCBpbnQgZHN0X2xlbiwgY29uc3QgcnVubGlzdF9lbGVtZW50ICpybCwKKwkJY29uc3QgVkNOIHN0YXJ0X3ZjbiwgVkNOICpjb25zdCBzdG9wX3ZjbikKK3sKKwlMQ04gcHJldl9sY247CisJczggKmRzdF9tYXgsICpkc3RfbmV4dDsKKwlpbnQgZXJyID0gLUVOT1NQQzsKKwlzOCBsZW5fbGVuLCBsY25fbGVuOworCisJQlVHX09OKHN0YXJ0X3ZjbiA8IDApOworCUJVR19PTihkc3RfbGVuIDwgMSk7CisJaWYgKCFybCkgeworCQlCVUdfT04oc3RhcnRfdmNuKTsKKwkJaWYgKHN0b3BfdmNuKQorCQkJKnN0b3BfdmNuID0gMDsKKwkJLyogVGVybWluYXRvciBieXRlLiAqLworCQkqZHN0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCS8qIFNraXAgdG8gcnVubGlzdCBlbGVtZW50IGNvbnRhaW5pbmcgQHN0YXJ0X3Zjbi4gKi8KKwl3aGlsZSAocmwtPmxlbmd0aCAmJiBzdGFydF92Y24gPj0gcmxbMV0udmNuKQorCQlybCsrOworCWlmICgoIXJsLT5sZW5ndGggJiYgc3RhcnRfdmNuID4gcmwtPnZjbikgfHwgc3RhcnRfdmNuIDwgcmwtPnZjbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyoKKwkgKiBAZHN0X21heCBpcyB1c2VkIGZvciBib3VuZHMgY2hlY2tpbmcgaW4KKwkgKiBudGZzX3dyaXRlX3NpZ25pZmljYW50X2J5dGVzKCkuCisJICovCisJZHN0X21heCA9IGRzdCArIGRzdF9sZW4gLSAxOworCXByZXZfbGNuID0gMDsKKwkvKiBEbyB0aGUgZmlyc3QgcGFydGlhbCBydW4gaWYgcHJlc2VudC4gKi8KKwlpZiAoc3RhcnRfdmNuID4gcmwtPnZjbikgeworCQlzNjQgZGVsdGE7CisKKwkJLyogV2Uga25vdyBybC0+bGVuZ3RoICE9IDAgYWxyZWFkeS4gKi8KKwkJaWYgKHJsLT5sZW5ndGggPCAwIHx8IHJsLT5sY24gPCBMQ05fSE9MRSkKKwkJCWdvdG8gZXJyX291dDsKKwkJZGVsdGEgPSBzdGFydF92Y24gLSBybC0+dmNuOworCQkvKiBXcml0ZSBsZW5ndGguICovCisJCWxlbl9sZW4gPSBudGZzX3dyaXRlX3NpZ25pZmljYW50X2J5dGVzKGRzdCArIDEsIGRzdF9tYXgsCisJCQkJcmwtPmxlbmd0aCAtIGRlbHRhKTsKKwkJaWYgKGxlbl9sZW4gPCAwKQorCQkJZ290byBzaXplX2VycjsKKwkJLyoKKwkJICogSWYgdGhlIGxvZ2ljYWwgY2x1c3RlciBudW1iZXIgKGxjbikgZGVub3RlcyBhIGhvbGUgYW5kIHdlCisJCSAqIGFyZSBvbiBOVEZTIDMuMCssIHdlIGRvbid0IHN0b3JlIGl0IGF0IGFsbCwgaS5lLiB3ZSBuZWVkCisJCSAqIHplcm8gc3BhY2UuICBPbiBlYXJsaWVyIE5URlMgdmVyc2lvbnMgd2UganVzdCB3cml0ZSB0aGUgbGNuCisJCSAqIGNoYW5nZS4gIEZJWE1FOiBEbyB3ZSBuZWVkIHRvIHdyaXRlIHRoZSBsY24gY2hhbmdlIG9yIGp1c3QKKwkJICogdGhlIGxjbiBpbiB0aGF0IGNhc2U/ICBOb3Qgc3VyZSBhcyBJIGhhdmUgbmV2ZXIgc2VlbiB0aGlzCisJCSAqIGNhc2Ugb24gTlQ0LiAtIFdlIGFzc3VtZSB0aGF0IHdlIGp1c3QgbmVlZCB0byB3cml0ZSB0aGUgbGNuCisJCSAqIGNoYW5nZSB1bnRpbCBzb21lb25lIHRlbGxzIHVzIG90aGVyd2lzZS4uLiAoQUlBKQorCQkgKi8KKwkJaWYgKHJsLT5sY24gPj0gMCB8fCB2b2wtPm1ham9yX3ZlciA8IDMpIHsKKwkJCXByZXZfbGNuID0gcmwtPmxjbjsKKwkJCWlmIChybC0+bGNuID49IDApCisJCQkJcHJldl9sY24gKz0gZGVsdGE7CisJCQkvKiBXcml0ZSBjaGFuZ2UgaW4gbGNuLiAqLworCQkJbGNuX2xlbiA9IG50ZnNfd3JpdGVfc2lnbmlmaWNhbnRfYnl0ZXMoZHN0ICsgMSArCisJCQkJCWxlbl9sZW4sIGRzdF9tYXgsIHByZXZfbGNuKTsKKwkJCWlmIChsY25fbGVuIDwgMCkKKwkJCQlnb3RvIHNpemVfZXJyOworCQl9IGVsc2UKKwkJCWxjbl9sZW4gPSAwOworCQlkc3RfbmV4dCA9IGRzdCArIGxlbl9sZW4gKyBsY25fbGVuICsgMTsKKwkJaWYgKGRzdF9uZXh0ID4gZHN0X21heCkKKwkJCWdvdG8gc2l6ZV9lcnI7CisJCS8qIFVwZGF0ZSBoZWFkZXIgYnl0ZS4gKi8KKwkJKmRzdCA9IGxjbl9sZW4gPDwgNCB8IGxlbl9sZW47CisJCS8qIFBvc2l0aW9uIGF0IG5leHQgbWFwcGluZyBwYWlycyBhcnJheSBlbGVtZW50LiAqLworCQlkc3QgPSBkc3RfbmV4dDsKKwkJLyogR28gdG8gbmV4dCBydW5saXN0IGVsZW1lbnQuICovCisJCXJsKys7CisJfQorCS8qIERvIHRoZSBmdWxsIHJ1bnMuICovCisJZm9yICg7IHJsLT5sZW5ndGg7IHJsKyspIHsKKwkJaWYgKHJsLT5sZW5ndGggPCAwIHx8IHJsLT5sY24gPCBMQ05fSE9MRSkKKwkJCWdvdG8gZXJyX291dDsKKwkJLyogV3JpdGUgbGVuZ3RoLiAqLworCQlsZW5fbGVuID0gbnRmc193cml0ZV9zaWduaWZpY2FudF9ieXRlcyhkc3QgKyAxLCBkc3RfbWF4LAorCQkJCXJsLT5sZW5ndGgpOworCQlpZiAobGVuX2xlbiA8IDApCisJCQlnb3RvIHNpemVfZXJyOworCQkvKgorCQkgKiBJZiB0aGUgbG9naWNhbCBjbHVzdGVyIG51bWJlciAobGNuKSBkZW5vdGVzIGEgaG9sZSBhbmQgd2UKKwkJICogYXJlIG9uIE5URlMgMy4wKywgd2UgZG9uJ3Qgc3RvcmUgaXQgYXQgYWxsLCBpLmUuIHdlIG5lZWQKKwkJICogemVybyBzcGFjZS4gIE9uIGVhcmxpZXIgTlRGUyB2ZXJzaW9ucyB3ZSBqdXN0IHdyaXRlIHRoZSBsY24KKwkJICogY2hhbmdlLiAgRklYTUU6IERvIHdlIG5lZWQgdG8gd3JpdGUgdGhlIGxjbiBjaGFuZ2Ugb3IganVzdAorCQkgKiB0aGUgbGNuIGluIHRoYXQgY2FzZT8gIE5vdCBzdXJlIGFzIEkgaGF2ZSBuZXZlciBzZWVuIHRoaXMKKwkJICogY2FzZSBvbiBOVDQuIC0gV2UgYXNzdW1lIHRoYXQgd2UganVzdCBuZWVkIHRvIHdyaXRlIHRoZSBsY24KKwkJICogY2hhbmdlIHVudGlsIHNvbWVvbmUgdGVsbHMgdXMgb3RoZXJ3aXNlLi4uIChBSUEpCisJCSAqLworCQlpZiAocmwtPmxjbiA+PSAwIHx8IHZvbC0+bWFqb3JfdmVyIDwgMykgeworCQkJLyogV3JpdGUgY2hhbmdlIGluIGxjbi4gKi8KKwkJCWxjbl9sZW4gPSBudGZzX3dyaXRlX3NpZ25pZmljYW50X2J5dGVzKGRzdCArIDEgKworCQkJCQlsZW5fbGVuLCBkc3RfbWF4LCBybC0+bGNuIC0gcHJldl9sY24pOworCQkJaWYgKGxjbl9sZW4gPCAwKQorCQkJCWdvdG8gc2l6ZV9lcnI7CisJCQlwcmV2X2xjbiA9IHJsLT5sY247CisJCX0gZWxzZQorCQkJbGNuX2xlbiA9IDA7CisJCWRzdF9uZXh0ID0gZHN0ICsgbGVuX2xlbiArIGxjbl9sZW4gKyAxOworCQlpZiAoZHN0X25leHQgPiBkc3RfbWF4KQorCQkJZ290byBzaXplX2VycjsKKwkJLyogVXBkYXRlIGhlYWRlciBieXRlLiAqLworCQkqZHN0ID0gbGNuX2xlbiA8PCA0IHwgbGVuX2xlbjsKKwkJLyogUG9zaXRpb24gYXQgbmV4dCBtYXBwaW5nIHBhaXJzIGFycmF5IGVsZW1lbnQuICovCisJCWRzdCA9IGRzdF9uZXh0OworCX0KKwkvKiBTdWNjZXNzLiAqLworCWVyciA9IDA7CitzaXplX2VycjoKKwkvKiBTZXQgc3RvcCB2Y24uICovCisJaWYgKHN0b3BfdmNuKQorCQkqc3RvcF92Y24gPSBybC0+dmNuOworCS8qIEFkZCB0ZXJtaW5hdG9yIGJ5dGUuICovCisJKmRzdCA9IDA7CisJcmV0dXJuIGVycjsKK2Vycl9vdXQ6CisJaWYgKHJsLT5sY24gPT0gTENOX1JMX05PVF9NQVBQRUQpCisJCWVyciA9IC1FSU5WQUw7CisJZWxzZQorCQllcnIgPSAtRUlPOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogbnRmc19ybF90cnVuY2F0ZV9ub2xvY2sgLSB0cnVuY2F0ZSBhIHJ1bmxpc3Qgc3RhcnRpbmcgYXQgYSBzcGVjaWZpZWQgdmNuCisgKiBAcnVubGlzdDoJcnVubGlzdCB0byB0cnVuY2F0ZQorICogQG5ld19sZW5ndGg6CXRoZSBuZXcgbGVuZ3RoIG9mIHRoZSBydW5saXN0IGluIFZDTnMKKyAqCisgKiBUcnVuY2F0ZSB0aGUgcnVubGlzdCBkZXNjcmliZWQgYnkgQHJ1bmxpc3QgYXMgd2VsbCBhcyB0aGUgbWVtb3J5IGJ1ZmZlcgorICogaG9sZGluZyB0aGUgcnVubGlzdCBlbGVtZW50cyB0byBhIGxlbmd0aCBvZiBAbmV3X2xlbmd0aCBWQ05zLgorICoKKyAqIElmIEBuZXdfbGVuZ3RoIGxpZXMgd2l0aGluIHRoZSBydW5saXN0LCB0aGUgcnVubGlzdCBlbGVtZW50cyB3aXRoIFZDTnMgb2YKKyAqIEBuZXdfbGVuZ3RoIGFuZCBhYm92ZSBhcmUgZGlzY2FyZGVkLgorICoKKyAqIElmIEBuZXdfbGVuZ3RoIGxpZXMgYmV5b25kIHRoZSBydW5saXN0LCBhIHNwYXJzZSBydW5saXN0IGVsZW1lbnQgaXMgYWRkZWQgdG8KKyAqIHRoZSBlbmQgb2YgdGhlIHJ1bmxpc3QgQHJ1bmxpc3Qgb3IgaWYgdGhlIGxhc3QgcnVubGlzdCBlbGVtZW50IGlzIGEgc3BhcnNlCisgKiBvbmUgYWxyZWFkeSwgdGhpcyBpcyBleHRlbmRlZC4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKgorICogTG9ja2luZzogVGhlIGNhbGxlciBtdXN0IGhvbGQgQHJ1bmxpc3QtPmxvY2sgZm9yIHdyaXRpbmcuCisgKi8KK2ludCBudGZzX3JsX3RydW5jYXRlX25vbG9jayhjb25zdCBudGZzX3ZvbHVtZSAqdm9sLCBydW5saXN0ICpjb25zdCBydW5saXN0LAorCQljb25zdCBzNjQgbmV3X2xlbmd0aCkKK3sKKwlydW5saXN0X2VsZW1lbnQgKnJsOworCWludCBvbGRfc2l6ZTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBuZXdfbGVuZ3RoIDB4JWxseC4iLCAobG9uZyBsb25nKW5ld19sZW5ndGgpOworCUJVR19PTighcnVubGlzdCk7CisJQlVHX09OKG5ld19sZW5ndGggPCAwKTsKKwlybCA9IHJ1bmxpc3QtPnJsOworCWlmICh1bmxpa2VseSghcmwpKSB7CisJCS8qCisJCSAqIENyZWF0ZSBhIHJ1bmxpc3QgY29uc2lzdGluZyBvZiBhIHNwYXJzZSBydW5saXN0IGVsZW1lbnQgb2YKKwkJICogbGVuZ3RoIEBuZXdfbGVuZ3RoIGZvbGxvd2VkIGJ5IGEgdGVybWluYXRvciBydW5saXN0IGVsZW1lbnQuCisJCSAqLworCQlybCA9IG50ZnNfbWFsbG9jX25vZnMoUEFHRV9TSVpFKTsKKwkJaWYgKHVubGlrZWx5KCFybCkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlICIKKwkJCQkJInJ1bmxpc3QgZWxlbWVudCBidWZmZXIuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlydW5saXN0LT5ybCA9IHJsOworCQlybFsxXS5sZW5ndGggPSBybC0+dmNuID0gMDsKKwkJcmwtPmxjbiA9IExDTl9IT0xFOworCQlybFsxXS52Y24gPSBybC0+bGVuZ3RoID0gbmV3X2xlbmd0aDsKKwkJcmxbMV0ubGNuID0gTENOX0VOT0VOVDsKKwkJcmV0dXJuIDA7CisJfQorCUJVR19PTihuZXdfbGVuZ3RoIDwgcmwtPnZjbik7CisJLyogRmluZCBAbmV3X2xlbmd0aCBpbiB0aGUgcnVubGlzdC4gKi8KKwl3aGlsZSAobGlrZWx5KHJsLT5sZW5ndGggJiYgbmV3X2xlbmd0aCA+PSBybFsxXS52Y24pKQorCQlybCsrOworCS8qCisJICogSWYgbm90IGF0IHRoZSBlbmQgb2YgdGhlIHJ1bmxpc3Qgd2UgbmVlZCB0byBzaHJpbmsgaXQuCisJICogSWYgYXQgdGhlIGVuZCBvZiB0aGUgcnVubGlzdCB3ZSBuZWVkIHRvIGV4cGFuZCBpdC4KKwkgKi8KKwlpZiAocmwtPmxlbmd0aCkgeworCQlydW5saXN0X2VsZW1lbnQgKnRybDsKKwkJQk9PTCBpc19lbmQ7CisKKwkJbnRmc19kZWJ1ZygiU2hyaW5raW5nIHJ1bmxpc3QuIik7CisJCS8qIERldGVybWluZSB0aGUgcnVubGlzdCBzaXplLiAqLworCQl0cmwgPSBybCArIDE7CisJCXdoaWxlIChsaWtlbHkodHJsLT5sZW5ndGgpKQorCQkJdHJsKys7CisJCW9sZF9zaXplID0gdHJsIC0gcnVubGlzdC0+cmwgKyAxOworCQkvKiBUcnVuY2F0ZSB0aGUgcnVuLiAqLworCQlybC0+bGVuZ3RoID0gbmV3X2xlbmd0aCAtIHJsLT52Y247CisJCS8qCisJCSAqIElmIGEgcnVuIHdhcyBwYXJ0aWFsbHkgdHJ1bmNhdGVkLCBtYWtlIHRoZSBmb2xsb3dpbmcgcnVubGlzdAorCQkgKiBlbGVtZW50IGEgdGVybWluYXRvci4KKwkJICovCisJCWlzX2VuZCA9IEZBTFNFOworCQlpZiAocmwtPmxlbmd0aCkgeworCQkJcmwrKzsKKwkJCWlmICghcmwtPmxlbmd0aCkKKwkJCQlpc19lbmQgPSBUUlVFOworCQkJcmwtPnZjbiA9IG5ld19sZW5ndGg7CisJCQlybC0+bGVuZ3RoID0gMDsKKwkJfQorCQlybC0+bGNuID0gTENOX0VOT0VOVDsKKwkJLyogUmVhbGxvY2F0ZSBtZW1vcnkgaWYgbmVjZXNzYXJ5LiAqLworCQlpZiAoIWlzX2VuZCkgeworCQkJaW50IG5ld19zaXplID0gcmwgLSBydW5saXN0LT5ybCArIDE7CisJCQlybCA9IG50ZnNfcmxfcmVhbGxvYyhydW5saXN0LT5ybCwgb2xkX3NpemUsIG5ld19zaXplKTsKKwkJCWlmIChJU19FUlIocmwpKQorCQkJCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiRmFpbGVkIHRvIHNocmluayAiCisJCQkJCQkicnVubGlzdCBidWZmZXIuICBUaGlzIGp1c3QgIgorCQkJCQkJIndhc3RlcyBhIGJpdCBvZiBtZW1vcnkgIgorCQkJCQkJInRlbXBvcmFyaWx5IHNvIHdlIGlnbm9yZSBpdCAiCisJCQkJCQkiYW5kIHJldHVybiBzdWNjZXNzLiIpOworCQkJZWxzZQorCQkJCXJ1bmxpc3QtPnJsID0gcmw7CisJCX0KKwl9IGVsc2UgaWYgKGxpa2VseSgvKiAhcmwtPmxlbmd0aCAmJiAqLyBuZXdfbGVuZ3RoID4gcmwtPnZjbikpIHsKKwkJbnRmc19kZWJ1ZygiRXhwYW5kaW5nIHJ1bmxpc3QuIik7CisJCS8qCisJCSAqIElmIHRoZXJlIGlzIGEgcHJldmlvdXMgcnVubGlzdCBlbGVtZW50IGFuZCBpdCBpcyBhIHNwYXJzZQorCQkgKiBvbmUsIGV4dGVuZCBpdC4gIE90aGVyd2lzZSBuZWVkIHRvIGFkZCBhIG5ldywgc3BhcnNlIHJ1bmxpc3QKKwkJICogZWxlbWVudC4KKwkJICovCisJCWlmICgocmwgPiBydW5saXN0LT5ybCkgJiYgKChybCAtIDEpLT5sY24gPT0gTENOX0hPTEUpKQorCQkJKHJsIC0gMSktPmxlbmd0aCA9IG5ld19sZW5ndGggLSAocmwgLSAxKS0+dmNuOworCQllbHNlIHsKKwkJCS8qIERldGVybWluZSB0aGUgcnVubGlzdCBzaXplLiAqLworCQkJb2xkX3NpemUgPSBybCAtIHJ1bmxpc3QtPnJsICsgMTsKKwkJCS8qIFJlYWxsb2NhdGUgbWVtb3J5IGlmIG5lY2Vzc2FyeS4gKi8KKwkJCXJsID0gbnRmc19ybF9yZWFsbG9jKHJ1bmxpc3QtPnJsLCBvbGRfc2l6ZSwKKwkJCQkJb2xkX3NpemUgKyAxKTsKKwkJCWlmIChJU19FUlIocmwpKSB7CisJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGV4cGFuZCBydW5saXN0ICIKKwkJCQkJCSJidWZmZXIsIGFib3J0aW5nLiIpOworCQkJCXJldHVybiBQVFJfRVJSKHJsKTsKKwkJCX0KKwkJCXJ1bmxpc3QtPnJsID0gcmw7CisJCQkvKgorCQkJICogU2V0IEBybCB0byB0aGUgc2FtZSBydW5saXN0IGVsZW1lbnQgaW4gdGhlIG5ldworCQkJICogcnVubGlzdCBhcyBiZWZvcmUgaW4gdGhlIG9sZCBydW5saXN0LgorCQkJICovCisJCQlybCArPSBvbGRfc2l6ZSAtIDE7CisJCQkvKiBBZGQgYSBuZXcsIHNwYXJzZSBydW5saXN0IGVsZW1lbnQuICovCisJCQlybC0+bGNuID0gTENOX0hPTEU7CisJCQlybC0+bGVuZ3RoID0gbmV3X2xlbmd0aCAtIHJsLT52Y247CisJCQkvKiBBZGQgYSBuZXcgdGVybWluYXRvciBydW5saXN0IGVsZW1lbnQuICovCisJCQlybCsrOworCQkJcmwtPmxlbmd0aCA9IDA7CisJCX0KKwkJcmwtPnZjbiA9IG5ld19sZW5ndGg7CisJCXJsLT5sY24gPSBMQ05fRU5PRU5UOworCX0gZWxzZSAvKiBpZiAodW5saWtlbHkoIXJsLT5sZW5ndGggJiYgbmV3X2xlbmd0aCA9PSBybC0+dmNuKSkgKi8geworCQkvKiBSdW5saXN0IGFscmVhZHkgaGFzIHNhbWUgc2l6ZSBhcyByZXF1ZXN0ZWQuICovCisJCXJsLT5sY24gPSBMQ05fRU5PRU5UOworCX0KKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9ydW5saXN0LmggYi9mcy9udGZzL3J1bmxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTA3ZmRlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9ydW5saXN0LmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIHJ1bmxpc3QuaCAtIERlZmluZXMgZm9yIHJ1bmxpc3QgaGFuZGxpbmcgaW4gTlRGUyBMaW51eCBrZXJuZWwgZHJpdmVyLgorICoJICAgICAgIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMiBSaWNoYXJkIFJ1c3NvbgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfUlVOTElTVF9ICisjZGVmaW5lIF9MSU5VWF9OVEZTX1JVTkxJU1RfSAorCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJsYXlvdXQuaCIKKyNpbmNsdWRlICJ2b2x1bWUuaCIKKworLyoqCisgKiBydW5saXN0X2VsZW1lbnQgLSBpbiBtZW1vcnkgdmNuIHRvIGxjbiBtYXBwaW5nIGFycmF5IGVsZW1lbnQKKyAqIEB2Y246CXN0YXJ0aW5nIHZjbiBvZiB0aGUgY3VycmVudCBhcnJheSBlbGVtZW50CisgKiBAbGNuOglzdGFydGluZyBsY24gb2YgdGhlIGN1cnJlbnQgYXJyYXkgZWxlbWVudAorICogQGxlbmd0aDoJbGVuZ3RoIGluIGNsdXN0ZXJzIG9mIHRoZSBjdXJyZW50IGFycmF5IGVsZW1lbnQKKyAqCisgKiBUaGUgbGFzdCB2Y24gKGluIGZhY3QgdGhlIGxhc3QgdmNuICsgMSkgaXMgcmVhY2hlZCB3aGVuIGxlbmd0aCA9PSAwLgorICoKKyAqIFdoZW4gbGNuID09IC0xIHRoaXMgbWVhbnMgdGhhdCB0aGUgY291bnQgdmNucyBzdGFydGluZyBhdCB2Y24gYXJlIG5vdAorICogcGh5c2ljYWxseSBhbGxvY2F0ZWQgKGkuZS4gdGhpcyBpcyBhIGhvbGUgLyBkYXRhIGlzIHNwYXJzZSkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsJLyogSW4gbWVtb3J5IHZjbiB0byBsY24gbWFwcGluZyBzdHJ1Y3R1cmUgZWxlbWVudC4gKi8KKwlWQ04gdmNuOwkvKiB2Y24gPSBTdGFydGluZyB2aXJ0dWFsIGNsdXN0ZXIgbnVtYmVyLiAqLworCUxDTiBsY247CS8qIGxjbiA9IFN0YXJ0aW5nIGxvZ2ljYWwgY2x1c3RlciBudW1iZXIuICovCisJczY0IGxlbmd0aDsJLyogUnVuIGxlbmd0aCBpbiBjbHVzdGVycy4gKi8KK30gcnVubGlzdF9lbGVtZW50OworCisvKioKKyAqIHJ1bmxpc3QgLSBpbiBtZW1vcnkgdmNuIHRvIGxjbiBtYXBwaW5nIGFycmF5IGluY2x1ZGluZyBhIHJlYWQvd3JpdGUgbG9jaworICogQHJsOgkJcG9pbnRlciB0byBhbiBhcnJheSBvZiBydW5saXN0IGVsZW1lbnRzCisgKiBAbG9jazoJcmVhZC93cml0ZSBzcGlubG9jayBmb3Igc2VyaWFsaXppbmcgYWNjZXNzIHRvIEBybAorICoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXJ1bmxpc3RfZWxlbWVudCAqcmw7CisJc3RydWN0IHJ3X3NlbWFwaG9yZSBsb2NrOworfSBydW5saXN0OworCitzdGF0aWMgaW5saW5lIHZvaWQgbnRmc19pbml0X3J1bmxpc3QocnVubGlzdCAqcmwpCit7CisJcmwtPnJsID0gTlVMTDsKKwlpbml0X3J3c2VtKCZybC0+bG9jayk7Cit9CisKK3R5cGVkZWYgZW51bSB7CisJTENOX0hPTEUJCT0gLTEsCS8qIEtlZXAgdGhpcyBhcyBoaWdoZXN0IHZhbHVlIG9yIGRpZSEgKi8KKwlMQ05fUkxfTk9UX01BUFBFRAk9IC0yLAorCUxDTl9FTk9FTlQJCT0gLTMsCit9IExDTl9TUEVDSUFMX1ZBTFVFUzsKKworZXh0ZXJuIHJ1bmxpc3RfZWxlbWVudCAqbnRmc19ydW5saXN0c19tZXJnZShydW5saXN0X2VsZW1lbnQgKmRybCwKKwkJcnVubGlzdF9lbGVtZW50ICpzcmwpOworCitleHRlcm4gcnVubGlzdF9lbGVtZW50ICpudGZzX21hcHBpbmdfcGFpcnNfZGVjb21wcmVzcyhjb25zdCBudGZzX3ZvbHVtZSAqdm9sLAorCQljb25zdCBBVFRSX1JFQ09SRCAqYXR0ciwgcnVubGlzdF9lbGVtZW50ICpvbGRfcmwpOworCitleHRlcm4gTENOIG50ZnNfcmxfdmNuX3RvX2xjbihjb25zdCBydW5saXN0X2VsZW1lbnQgKnJsLCBjb25zdCBWQ04gdmNuKTsKKworZXh0ZXJuIGludCBudGZzX2dldF9zaXplX2Zvcl9tYXBwaW5nX3BhaXJzKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IHJ1bmxpc3RfZWxlbWVudCAqcmwsIGNvbnN0IFZDTiBzdGFydF92Y24pOworCitleHRlcm4gaW50IG50ZnNfbWFwcGluZ19wYWlyc19idWlsZChjb25zdCBudGZzX3ZvbHVtZSAqdm9sLCBzOCAqZHN0LAorCQljb25zdCBpbnQgZHN0X2xlbiwgY29uc3QgcnVubGlzdF9lbGVtZW50ICpybCwKKwkJY29uc3QgVkNOIHN0YXJ0X3ZjbiwgVkNOICpjb25zdCBzdG9wX3Zjbik7CisKK2V4dGVybiBpbnQgbnRmc19ybF90cnVuY2F0ZV9ub2xvY2soY29uc3QgbnRmc192b2x1bWUgKnZvbCwKKwkJcnVubGlzdCAqY29uc3QgcnVubGlzdCwgY29uc3QgczY0IG5ld19sZW5ndGgpOworCisjZW5kaWYgLyogX0xJTlVYX05URlNfUlVOTElTVF9IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL3N1cGVyLmMgYi9mcy9udGZzL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyYTNkMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvc3VwZXIuYwpAQCAtMCwwICsxLDI3NzEgQEAKKy8qCisgKiBzdXBlci5jIC0gTlRGUyBrZXJuZWwgc3VwZXIgYmxvY2sgaGFuZGxpbmcuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMSwyMDAyIFJpY2hhcmQgUnVzc29uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgkvKiBGb3IgYmRldl9oYXJkc2VjdF9zaXplKCkuICovCisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworI2luY2x1ZGUgInN5c2N0bC5oIgorI2luY2x1ZGUgImxvZ2ZpbGUuaCIKKyNpbmNsdWRlICJxdW90YS5oIgorI2luY2x1ZGUgImRpci5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiaW5kZXguaCIKKyNpbmNsdWRlICJhb3BzLmgiCisjaW5jbHVkZSAibWFsbG9jLmgiCisjaW5jbHVkZSAibnRmcy5oIgorCisvKiBOdW1iZXIgb2YgbW91bnRlZCBmaWxlIHN5c3RlbXMgd2hpY2ggaGF2ZSBjb21wcmVzc2lvbiBlbmFibGVkLiAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbnRmc19ucl9jb21wcmVzc2lvbl91c2VyczsKKworLyogQSBnbG9iYWwgZGVmYXVsdCB1cGNhc2UgdGFibGUgYW5kIGEgY29ycmVzcG9uZGluZyByZWZlcmVuY2UgY291bnQuICovCitzdGF0aWMgbnRmc2NoYXIgKmRlZmF1bHRfdXBjYXNlID0gTlVMTDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG50ZnNfbnJfdXBjYXNlX3VzZXJzID0gMDsKKworLyogRXJyb3IgY29uc3RhbnRzL3N0cmluZ3MgdXNlZCBpbiBpbm9kZS5jOjpudGZzX3Nob3dfb3B0aW9ucygpLiAqLwordHlwZWRlZiBlbnVtIHsKKwkvKiBPbmUgb2YgdGhlc2UgbXVzdCBiZSBwcmVzZW50LCBkZWZhdWx0IGlzIE9OX0VSUk9SU19DT05USU5VRS4gKi8KKwlPTl9FUlJPUlNfUEFOSUMJCQk9IDB4MDEsCisJT05fRVJST1JTX1JFTU9VTlRfUk8JCT0gMHgwMiwKKwlPTl9FUlJPUlNfQ09OVElOVUUJCT0gMHgwNCwKKwkvKiBPcHRpb25hbCwgY2FuIGJlIGNvbWJpbmVkIHdpdGggYW55IG9mIHRoZSBhYm92ZS4gKi8KKwlPTl9FUlJPUlNfUkVDT1ZFUgkJPSAweDEwLAorfSBPTl9FUlJPUlNfQUNUSU9OUzsKKworY29uc3Qgb3B0aW9uX3Qgb25fZXJyb3JzX2FycltdID0geworCXsgT05fRVJST1JTX1BBTklDLAkicGFuaWMiIH0sCisJeyBPTl9FUlJPUlNfUkVNT1VOVF9STywJInJlbW91bnQtcm8iLCB9LAorCXsgT05fRVJST1JTX0NPTlRJTlVFLAkiY29udGludWUiLCB9LAorCXsgT05fRVJST1JTX1JFQ09WRVIsCSJyZWNvdmVyIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKKy8qKgorICogc2ltcGxlX2dldGJvb2wgLQorICoKKyAqIENvcGllZCBmcm9tIG9sZCBudGZzIGRyaXZlciAod2hpY2ggY29waWVkIGZyb20gdmZhdCBkcml2ZXIpLgorICovCitzdGF0aWMgaW50IHNpbXBsZV9nZXRib29sKGNoYXIgKnMsIEJPT0wgKnNldHZhbCkKK3sKKwlpZiAocykgeworCQlpZiAoIXN0cmNtcChzLCAiMSIpIHx8ICFzdHJjbXAocywgInllcyIpIHx8ICFzdHJjbXAocywgInRydWUiKSkKKwkJCSpzZXR2YWwgPSBUUlVFOworCQllbHNlIGlmICghc3RyY21wKHMsICIwIikgfHwgIXN0cmNtcChzLCAibm8iKSB8fAorCQkJCQkJCSFzdHJjbXAocywgImZhbHNlIikpCisJCQkqc2V0dmFsID0gRkFMU0U7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0gZWxzZQorCQkqc2V0dmFsID0gVFJVRTsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBwYXJzZV9vcHRpb25zIC0gcGFyc2UgdGhlIChyZSltb3VudCBvcHRpb25zCisgKiBAdm9sOgludGZzIHZvbHVtZQorICogQG9wdDoJc3RyaW5nIGNvbnRhaW5pbmcgdGhlIChyZSltb3VudCBvcHRpb25zCisgKgorICogUGFyc2UgdGhlIHJlY29nbml6ZWQgb3B0aW9ucyBpbiBAb3B0IGZvciB0aGUgbnRmcyB2b2x1bWUgZGVzY3JpYmVkIGJ5IEB2b2wuCisgKi8KK3N0YXRpYyBCT09MIHBhcnNlX29wdGlvbnMobnRmc192b2x1bWUgKnZvbCwgY2hhciAqb3B0KQoreworCWNoYXIgKnAsICp2LCAqb3Y7CisJc3RhdGljIGNoYXIgKnV0ZjggPSAidXRmOCI7CisJaW50IGVycm9ycyA9IDAsIHNsb3BweSA9IDA7CisJdWlkX3QgdWlkID0gKHVpZF90KS0xOworCWdpZF90IGdpZCA9IChnaWRfdCktMTsKKwltb2RlX3QgZm1hc2sgPSAobW9kZV90KS0xLCBkbWFzayA9IChtb2RlX3QpLTE7CisJaW50IG1mdF96b25lX211bHRpcGxpZXIgPSAtMSwgb25fZXJyb3JzID0gLTE7CisJaW50IHNob3dfc3lzX2ZpbGVzID0gLTEsIGNhc2Vfc2Vuc2l0aXZlID0gLTE7CisJc3RydWN0IG5sc190YWJsZSAqbmxzX21hcCA9IE5VTEwsICpvbGRfbmxzOworCisJLyogSSBhbSBsYXp5Li4uICgtOCAqLworI2RlZmluZSBOVEZTX0dFVE9QVF9XSVRIX0RFRkFVTFQob3B0aW9uLCB2YXJpYWJsZSwgZGVmYXVsdF92YWx1ZSkJXAorCWlmICghc3RyY21wKHAsIG9wdGlvbikpIHsJCQkJCVwKKwkJaWYgKCF2IHx8ICEqdikJCQkJCQlcCisJCQl2YXJpYWJsZSA9IGRlZmF1bHRfdmFsdWU7CQkJXAorCQllbHNlIHsJCQkJCQkJXAorCQkJdmFyaWFibGUgPSBzaW1wbGVfc3RydG91bChvdiA9IHYsICZ2LCAwKTsJXAorCQkJaWYgKCp2KQkJCQkJCVwKKwkJCQlnb3RvIG5lZWRzX3ZhbDsJCQkJXAorCQl9CQkJCQkJCVwKKwl9CisjZGVmaW5lIE5URlNfR0VUT1BUKG9wdGlvbiwgdmFyaWFibGUpCQkJCQlcCisJaWYgKCFzdHJjbXAocCwgb3B0aW9uKSkgewkJCQkJXAorCQlpZiAoIXYgfHwgISp2KQkJCQkJCVwKKwkJCWdvdG8gbmVlZHNfYXJnOwkJCQkJXAorCQl2YXJpYWJsZSA9IHNpbXBsZV9zdHJ0b3VsKG92ID0gdiwgJnYsIDApOwkJXAorCQlpZiAoKnYpCQkJCQkJCVwKKwkJCWdvdG8gbmVlZHNfdmFsOwkJCQkJXAorCX0KKyNkZWZpbmUgTlRGU19HRVRPUFRfQk9PTChvcHRpb24sIHZhcmlhYmxlKQkJCQlcCisJaWYgKCFzdHJjbXAocCwgb3B0aW9uKSkgewkJCQkJXAorCQlCT09MIHZhbDsJCQkJCQlcCisJCWlmICghc2ltcGxlX2dldGJvb2wodiwgJnZhbCkpCQkJCVwKKwkJCWdvdG8gbmVlZHNfYm9vbDsJCQkJXAorCQl2YXJpYWJsZSA9IHZhbDsJCQkJCQlcCisJfQorI2RlZmluZSBOVEZTX0dFVE9QVF9PUFRJT05TX0FSUkFZKG9wdGlvbiwgdmFyaWFibGUsIG9wdF9hcnJheSkJCVwKKwlpZiAoIXN0cmNtcChwLCBvcHRpb24pKSB7CQkJCQlcCisJCWludCBfaTsJCQkJCQkJXAorCQlpZiAoIXYgfHwgISp2KQkJCQkJCVwKKwkJCWdvdG8gbmVlZHNfYXJnOwkJCQkJXAorCQlvdiA9IHY7CQkJCQkJCVwKKwkJaWYgKHZhcmlhYmxlID09IC0xKQkJCQkJXAorCQkJdmFyaWFibGUgPSAwOwkJCQkJXAorCQlmb3IgKF9pID0gMDsgb3B0X2FycmF5W19pXS5zdHIgJiYgKm9wdF9hcnJheVtfaV0uc3RyOyBfaSsrKSBcCisJCQlpZiAoIXN0cmNtcChvcHRfYXJyYXlbX2ldLnN0ciwgdikpIHsJCVwKKwkJCQl2YXJpYWJsZSB8PSBvcHRfYXJyYXlbX2ldLnZhbDsJCVwKKwkJCQlicmVhazsJCQkJCVwKKwkJCX0JCQkJCQlcCisJCWlmICghb3B0X2FycmF5W19pXS5zdHIgfHwgISpvcHRfYXJyYXlbX2ldLnN0cikJCVwKKwkJCWdvdG8gbmVlZHNfdmFsOwkJCQkJXAorCX0KKwlpZiAoIW9wdCB8fCAhKm9wdCkKKwkJZ290byBub19tb3VudF9vcHRpb25zOworCW50ZnNfZGVidWcoIkVudGVyaW5nIHdpdGggbW91bnQgb3B0aW9ucyBzdHJpbmc6ICVzIiwgb3B0KTsKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJm9wdCwgIiwiKSkpIHsKKwkJaWYgKCh2ID0gc3RyY2hyKHAsICc9JykpKQorCQkJKnYrKyA9IDA7CisJCU5URlNfR0VUT1BUKCJ1aWQiLCB1aWQpCisJCWVsc2UgTlRGU19HRVRPUFQoImdpZCIsIGdpZCkKKwkJZWxzZSBOVEZTX0dFVE9QVCgidW1hc2siLCBmbWFzayA9IGRtYXNrKQorCQllbHNlIE5URlNfR0VUT1BUKCJmbWFzayIsIGZtYXNrKQorCQllbHNlIE5URlNfR0VUT1BUKCJkbWFzayIsIGRtYXNrKQorCQllbHNlIE5URlNfR0VUT1BUKCJtZnRfem9uZV9tdWx0aXBsaWVyIiwgbWZ0X3pvbmVfbXVsdGlwbGllcikKKwkJZWxzZSBOVEZTX0dFVE9QVF9XSVRIX0RFRkFVTFQoInNsb3BweSIsIHNsb3BweSwgVFJVRSkKKwkJZWxzZSBOVEZTX0dFVE9QVF9CT09MKCJzaG93X3N5c19maWxlcyIsIHNob3dfc3lzX2ZpbGVzKQorCQllbHNlIE5URlNfR0VUT1BUX0JPT0woImNhc2Vfc2Vuc2l0aXZlIiwgY2FzZV9zZW5zaXRpdmUpCisJCWVsc2UgTlRGU19HRVRPUFRfT1BUSU9OU19BUlJBWSgiZXJyb3JzIiwgb25fZXJyb3JzLAorCQkJCW9uX2Vycm9yc19hcnIpCisJCWVsc2UgaWYgKCFzdHJjbXAocCwgInBvc2l4IikgfHwgIXN0cmNtcChwLCAic2hvd19pbm9kZXMiKSkKKwkJCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiSWdub3Jpbmcgb2Jzb2xldGUgb3B0aW9uICVzLiIsCisJCQkJCXApOworCQllbHNlIGlmICghc3RyY21wKHAsICJubHMiKSB8fCAhc3RyY21wKHAsICJpb2NoYXJzZXQiKSkgeworCQkJaWYgKCFzdHJjbXAocCwgImlvY2hhcnNldCIpKQorCQkJCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiT3B0aW9uIGlvY2hhcnNldCBpcyAiCisJCQkJCQkiZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSAiCisJCQkJCQkib3B0aW9uIG5scz08Y2hhcnNldG5hbWU+IGluICIKKwkJCQkJCSJ0aGUgZnV0dXJlLiIpOworCQkJaWYgKCF2IHx8ICEqdikKKwkJCQlnb3RvIG5lZWRzX2FyZzsKK3VzZV91dGY4OgorCQkJb2xkX25scyA9IG5sc19tYXA7CisJCQlubHNfbWFwID0gbG9hZF9ubHModik7CisJCQlpZiAoIW5sc19tYXApIHsKKwkJCQlpZiAoIW9sZF9ubHMpIHsKKwkJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiTkxTIGNoYXJhY3RlciBzZXQgIgorCQkJCQkJCSIlcyBub3QgZm91bmQuIiwgdik7CisJCQkJCXJldHVybiBGQUxTRTsKKwkJCQl9CisJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiTkxTIGNoYXJhY3RlciBzZXQgJXMgbm90ICIKKwkJCQkJCSJmb3VuZC4gVXNpbmcgcHJldmlvdXMgb25lICVzLiIsCisJCQkJCQl2LCBvbGRfbmxzLT5jaGFyc2V0KTsKKwkJCQlubHNfbWFwID0gb2xkX25sczsKKwkJCX0gZWxzZSAvKiBubHNfbWFwICovIHsKKwkJCQlpZiAob2xkX25scykKKwkJCQkJdW5sb2FkX25scyhvbGRfbmxzKTsKKwkJCX0KKwkJfSBlbHNlIGlmICghc3RyY21wKHAsICJ1dGY4IikpIHsKKwkJCUJPT0wgdmFsID0gRkFMU0U7CisJCQludGZzX3dhcm5pbmcodm9sLT5zYiwgIk9wdGlvbiB1dGY4IGlzIG5vIGxvbmdlciAiCisJCQkJICAgInN1cHBvcnRlZCwgdXNpbmcgb3B0aW9uIG5scz11dGY4LiBQbGVhc2UgIgorCQkJCSAgICJ1c2Ugb3B0aW9uIG5scz11dGY4IGluIHRoZSBmdXR1cmUgYW5kICIKKwkJCQkgICAibWFrZSBzdXJlIHV0ZjggaXMgY29tcGlsZWQgZWl0aGVyIGFzIGEgIgorCQkJCSAgICJtb2R1bGUgb3IgaW50byB0aGUga2VybmVsLiIpOworCQkJaWYgKCF2IHx8ICEqdikKKwkJCQl2YWwgPSBUUlVFOworCQkJZWxzZSBpZiAoIXNpbXBsZV9nZXRib29sKHYsICZ2YWwpKQorCQkJCWdvdG8gbmVlZHNfYm9vbDsKKwkJCWlmICh2YWwpIHsKKwkJCQl2ID0gdXRmODsKKwkJCQlnb3RvIHVzZV91dGY4OworCQkJfQorCQl9IGVsc2UgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiVW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbiAlcy4iLCBwKTsKKwkJCWlmIChlcnJvcnMgPCBJTlRfTUFYKQorCQkJCWVycm9ycysrOworCQl9CisjdW5kZWYgTlRGU19HRVRPUFRfT1BUSU9OU19BUlJBWQorI3VuZGVmIE5URlNfR0VUT1BUX0JPT0wKKyN1bmRlZiBOVEZTX0dFVE9QVAorI3VuZGVmIE5URlNfR0VUT1BUX1dJVEhfREVGQVVMVAorCX0KK25vX21vdW50X29wdGlvbnM6CisJaWYgKGVycm9ycyAmJiAhc2xvcHB5KQorCQlyZXR1cm4gRkFMU0U7CisJaWYgKHNsb3BweSkKKwkJbnRmc193YXJuaW5nKHZvbC0+c2IsICJTbG9wcHkgb3B0aW9uIGdpdmVuLiBJZ25vcmluZyAiCisJCQkJInVucmVjb2duaXplZCBtb3VudCBvcHRpb24ocykgYW5kIGNvbnRpbnVpbmcuIik7CisJLyogS2VlcCB0aGlzIGZpcnN0ISAqLworCWlmIChvbl9lcnJvcnMgIT0gLTEpIHsKKwkJaWYgKCFvbl9lcnJvcnMpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkludmFsaWQgZXJyb3JzIG9wdGlvbiBhcmd1bWVudCAiCisJCQkJCSJvciBidWcgaW4gb3B0aW9ucyBwYXJzZXIuIik7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisJaWYgKG5sc19tYXApIHsKKwkJaWYgKHZvbC0+bmxzX21hcCAmJiB2b2wtPm5sc19tYXAgIT0gbmxzX21hcCkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiQ2Fubm90IGNoYW5nZSBOTFMgY2hhcmFjdGVyIHNldCAiCisJCQkJCSJvbiByZW1vdW50LiIpOworCQkJcmV0dXJuIEZBTFNFOworCQl9IC8qIGVsc2UgKCF2b2wtPm5sc19tYXApICovCisJCW50ZnNfZGVidWcoIlVzaW5nIE5MUyBjaGFyYWN0ZXIgc2V0ICVzLiIsIG5sc19tYXAtPmNoYXJzZXQpOworCQl2b2wtPm5sc19tYXAgPSBubHNfbWFwOworCX0gZWxzZSAvKiAoIW5sc19tYXApICovIHsKKwkJaWYgKCF2b2wtPm5sc19tYXApIHsKKwkJCXZvbC0+bmxzX21hcCA9IGxvYWRfbmxzX2RlZmF1bHQoKTsKKwkJCWlmICghdm9sLT5ubHNfbWFwKSB7CisJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGxvYWQgZGVmYXVsdCAiCisJCQkJCQkiTkxTIGNoYXJhY3RlciBzZXQuIik7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJbnRmc19kZWJ1ZygiVXNpbmcgZGVmYXVsdCBOTFMgY2hhcmFjdGVyIHNldCAoJXMpLiIsCisJCQkJCXZvbC0+bmxzX21hcC0+Y2hhcnNldCk7CisJCX0KKwl9CisJaWYgKG1mdF96b25lX211bHRpcGxpZXIgIT0gLTEpIHsKKwkJaWYgKHZvbC0+bWZ0X3pvbmVfbXVsdGlwbGllciAmJiB2b2wtPm1mdF96b25lX211bHRpcGxpZXIgIT0KKwkJCQltZnRfem9uZV9tdWx0aXBsaWVyKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJDYW5ub3QgY2hhbmdlIG1mdF96b25lX211bHRpcGxpZXIgIgorCQkJCQkib24gcmVtb3VudC4iKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQlpZiAobWZ0X3pvbmVfbXVsdGlwbGllciA8IDEgfHwgbWZ0X3pvbmVfbXVsdGlwbGllciA+IDQpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkludmFsaWQgbWZ0X3pvbmVfbXVsdGlwbGllci4gIgorCQkJCQkiVXNpbmcgZGVmYXVsdCB2YWx1ZSwgaS5lLiAxLiIpOworCQkJbWZ0X3pvbmVfbXVsdGlwbGllciA9IDE7CisJCX0KKwkJdm9sLT5tZnRfem9uZV9tdWx0aXBsaWVyID0gbWZ0X3pvbmVfbXVsdGlwbGllcjsKKwl9CisJaWYgKCF2b2wtPm1mdF96b25lX211bHRpcGxpZXIpCisJCXZvbC0+bWZ0X3pvbmVfbXVsdGlwbGllciA9IDE7CisJaWYgKG9uX2Vycm9ycyAhPSAtMSkKKwkJdm9sLT5vbl9lcnJvcnMgPSBvbl9lcnJvcnM7CisJaWYgKCF2b2wtPm9uX2Vycm9ycyB8fCB2b2wtPm9uX2Vycm9ycyA9PSBPTl9FUlJPUlNfUkVDT1ZFUikKKwkJdm9sLT5vbl9lcnJvcnMgfD0gT05fRVJST1JTX0NPTlRJTlVFOworCWlmICh1aWQgIT0gKHVpZF90KS0xKQorCQl2b2wtPnVpZCA9IHVpZDsKKwlpZiAoZ2lkICE9IChnaWRfdCktMSkKKwkJdm9sLT5naWQgPSBnaWQ7CisJaWYgKGZtYXNrICE9IChtb2RlX3QpLTEpCisJCXZvbC0+Zm1hc2sgPSBmbWFzazsKKwlpZiAoZG1hc2sgIT0gKG1vZGVfdCktMSkKKwkJdm9sLT5kbWFzayA9IGRtYXNrOworCWlmIChzaG93X3N5c19maWxlcyAhPSAtMSkgeworCQlpZiAoc2hvd19zeXNfZmlsZXMpCisJCQlOVm9sU2V0U2hvd1N5c3RlbUZpbGVzKHZvbCk7CisJCWVsc2UKKwkJCU5Wb2xDbGVhclNob3dTeXN0ZW1GaWxlcyh2b2wpOworCX0KKwlpZiAoY2FzZV9zZW5zaXRpdmUgIT0gLTEpIHsKKwkJaWYgKGNhc2Vfc2Vuc2l0aXZlKQorCQkJTlZvbFNldENhc2VTZW5zaXRpdmUodm9sKTsKKwkJZWxzZQorCQkJTlZvbENsZWFyQ2FzZVNlbnNpdGl2ZSh2b2wpOworCX0KKwlyZXR1cm4gVFJVRTsKK25lZWRzX2FyZzoKKwludGZzX2Vycm9yKHZvbC0+c2IsICJUaGUgJXMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50LiIsIHApOworCXJldHVybiBGQUxTRTsKK25lZWRzX2Jvb2w6CisJbnRmc19lcnJvcih2b2wtPnNiLCAiVGhlICVzIG9wdGlvbiByZXF1aXJlcyBhIGJvb2xlYW4gYXJndW1lbnQuIiwgcCk7CisJcmV0dXJuIEZBTFNFOworbmVlZHNfdmFsOgorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkludmFsaWQgJXMgb3B0aW9uIGFyZ3VtZW50OiAlcyIsIHAsIG92KTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKKyNpZmRlZiBOVEZTX1JXCisKKy8qKgorICogbnRmc193cml0ZV92b2x1bWVfZmxhZ3MgLSB3cml0ZSBuZXcgZmxhZ3MgdG8gdGhlIHZvbHVtZSBpbmZvcm1hdGlvbiBmbGFncworICogQHZvbDoJbnRmcyB2b2x1bWUgb24gd2hpY2ggdG8gbW9kaWZ5IHRoZSBmbGFncworICogQGZsYWdzOgluZXcgZmxhZ3MgdmFsdWUgZm9yIHRoZSB2b2x1bWUgaW5mb3JtYXRpb24gZmxhZ3MKKyAqCisgKiBJbnRlcm5hbCBmdW5jdGlvbi4gIFlvdSBwcm9iYWJseSB3YW50IHRvIHVzZSBudGZzX3tzZXQsY2xlYXJ9X3ZvbHVtZV9mbGFncygpCisgKiBpbnN0ZWFkIChzZWUgYmVsb3cpLgorICoKKyAqIFJlcGxhY2UgdGhlIHZvbHVtZSBpbmZvcm1hdGlvbiBmbGFncyBvbiB0aGUgdm9sdW1lIEB2b2wgd2l0aCB0aGUgdmFsdWUKKyAqIHN1cHBsaWVkIGluIEBmbGFncy4gIE5vdGUsIHRoaXMgb3ZlcndyaXRlcyB0aGUgdm9sdW1lIGluZm9ybWF0aW9uIGZsYWdzLCBzbworICogbWFrZSBzdXJlIHRvIGNvbWJpbmUgdGhlIGZsYWdzIHlvdSB3YW50IHRvIG1vZGlmeSB3aXRoIHRoZSBvbGQgZmxhZ3MgYW5kIHVzZQorICogdGhlIHJlc3VsdCB3aGVuIGNhbGxpbmcgbnRmc193cml0ZV92b2x1bWVfZmxhZ3MoKS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgbnRmc193cml0ZV92b2x1bWVfZmxhZ3MobnRmc192b2x1bWUgKnZvbCwgY29uc3QgVk9MVU1FX0ZMQUdTIGZsYWdzKQoreworCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKHZvbC0+dm9sX2lubyk7CisJTUZUX1JFQ09SRCAqbTsKKwlWT0xVTUVfSU5GT1JNQVRJT04gKnZpOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJaW50IGVycjsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLCBvbGQgZmxhZ3MgPSAweCV4LCBuZXcgZmxhZ3MgPSAweCV4LiIsCisJCQlsZTE2X3RvX2NwdSh2b2wtPnZvbF9mbGFncyksIGxlMTZfdG9fY3B1KGZsYWdzKSk7CisJaWYgKHZvbC0+dm9sX2ZsYWdzID09IGZsYWdzKQorCQlnb3RvIGRvbmU7CisJQlVHX09OKCFuaSk7CisJbSA9IG1hcF9tZnRfcmVjb3JkKG5pKTsKKwlpZiAoSVNfRVJSKG0pKSB7CisJCWVyciA9IFBUUl9FUlIobSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KG5pLCBtKTsKKwlpZiAoIWN0eCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIHB1dF91bm1fZXJyX291dDsKKwl9CisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9WT0xVTUVfSU5GT1JNQVRJT04sIE5VTEwsIDAsIDAsIDAsIE5VTEwsIDAsCisJCQljdHgpOworCWlmIChlcnIpCisJCWdvdG8gcHV0X3VubV9lcnJfb3V0OworCXZpID0gKFZPTFVNRV9JTkZPUk1BVElPTiopKCh1OCopY3R4LT5hdHRyICsKKwkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpKTsKKwl2b2wtPnZvbF9mbGFncyA9IHZpLT5mbGFncyA9IGZsYWdzOworCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CisJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOworCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQobmkpOworZG9uZToKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiAwOworcHV0X3VubV9lcnJfb3V0OgorCWlmIChjdHgpCisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQobmkpOworZXJyX291dDoKKwludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgd2l0aCBlcnJvciBjb2RlICVpLiIsIC1lcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogbnRmc19zZXRfdm9sdW1lX2ZsYWdzIC0gc2V0IGJpdHMgaW4gdGhlIHZvbHVtZSBpbmZvcm1hdGlvbiBmbGFncworICogQHZvbDoJbnRmcyB2b2x1bWUgb24gd2hpY2ggdG8gbW9kaWZ5IHRoZSBmbGFncworICogQGZsYWdzOglmbGFncyB0byBzZXQgb24gdGhlIHZvbHVtZQorICoKKyAqIFNldCB0aGUgYml0cyBpbiBAZmxhZ3MgaW4gdGhlIHZvbHVtZSBpbmZvcm1hdGlvbiBmbGFncyBvbiB0aGUgdm9sdW1lIEB2b2wuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICovCitzdGF0aWMgaW5saW5lIGludCBudGZzX3NldF92b2x1bWVfZmxhZ3MobnRmc192b2x1bWUgKnZvbCwgVk9MVU1FX0ZMQUdTIGZsYWdzKQoreworCWZsYWdzICY9IFZPTFVNRV9GTEFHU19NQVNLOworCXJldHVybiBudGZzX3dyaXRlX3ZvbHVtZV9mbGFncyh2b2wsIHZvbC0+dm9sX2ZsYWdzIHwgZmxhZ3MpOworfQorCisvKioKKyAqIG50ZnNfY2xlYXJfdm9sdW1lX2ZsYWdzIC0gY2xlYXIgYml0cyBpbiB0aGUgdm9sdW1lIGluZm9ybWF0aW9uIGZsYWdzCisgKiBAdm9sOgludGZzIHZvbHVtZSBvbiB3aGljaCB0byBtb2RpZnkgdGhlIGZsYWdzCisgKiBAZmxhZ3M6CWZsYWdzIHRvIGNsZWFyIG9uIHRoZSB2b2x1bWUKKyAqCisgKiBDbGVhciB0aGUgYml0cyBpbiBAZmxhZ3MgaW4gdGhlIHZvbHVtZSBpbmZvcm1hdGlvbiBmbGFncyBvbiB0aGUgdm9sdW1lIEB2b2wuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICovCitzdGF0aWMgaW5saW5lIGludCBudGZzX2NsZWFyX3ZvbHVtZV9mbGFncyhudGZzX3ZvbHVtZSAqdm9sLCBWT0xVTUVfRkxBR1MgZmxhZ3MpCit7CisJZmxhZ3MgJj0gVk9MVU1FX0ZMQUdTX01BU0s7CisJZmxhZ3MgPSB2b2wtPnZvbF9mbGFncyAmIGNwdV90b19sZTE2KH5sZTE2X3RvX2NwdShmbGFncykpOworCXJldHVybiBudGZzX3dyaXRlX3ZvbHVtZV9mbGFncyh2b2wsIGZsYWdzKTsKK30KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KKworLyoqCisgKiBudGZzX3JlbW91bnQgLSBjaGFuZ2UgdGhlIG1vdW50IG9wdGlvbnMgb2YgYSBtb3VudGVkIG50ZnMgZmlsZXN5c3RlbQorICogQHNiOgkJc3VwZXJibG9jayBvZiBtb3VudGVkIG50ZnMgZmlsZXN5c3RlbQorICogQGZsYWdzOglyZW1vdW50IGZsYWdzCisgKiBAb3B0OglyZW1vdW50IG9wdGlvbnMgc3RyaW5nCisgKgorICogQ2hhbmdlIHRoZSBtb3VudCBvcHRpb25zIG9mIGFuIGFscmVhZHkgbW91bnRlZCBudGZzIGZpbGVzeXN0ZW0uCisgKgorICogTk9URTogIFRoZSBWRlMgc2V0cyB0aGUgQHNiLT5zX2ZsYWdzIHJlbW91bnQgZmxhZ3MgdG8gQGZsYWdzIGFmdGVyCisgKiBudGZzX3JlbW91bnQoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseSAoaS5lLiByZXR1cm5zIDApLiAgT3RoZXJ3aXNlLAorICogQHNiLT5zX2ZsYWdzIGFyZSBub3QgY2hhbmdlZC4KKyAqLworc3RhdGljIGludCBudGZzX3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqb3B0KQoreworCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKHNiKTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIHdpdGggcmVtb3VudCBvcHRpb25zIHN0cmluZzogJXMiLCBvcHQpOworI2lmbmRlZiBOVEZTX1JXCisJLyogRm9yIHJlYWQtb25seSBjb21waWxlZCBkcml2ZXIsIGVuZm9yY2UgYWxsIHJlYWQtb25seSBmbGFncy4gKi8KKwkqZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CisjZWxzZSAvKiBOVEZTX1JXICovCisJLyoKKwkgKiBGb3IgdGhlIHJlYWQtd3JpdGUgY29tcGlsZWQgZHJpdmVyLCBpZiB3ZSBhcmUgcmVtb3VudGluZyByZWFkLXdyaXRlLAorCSAqIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gdm9sdW1lIGVycm9ycyBhbmQgdGhhdCBubyB1bnN1cHBvcnRlZCB2b2x1bWUKKwkgKiBmbGFncyBhcmUgc2V0LiAgQWxzbywgZW1wdHkgdGhlIGxvZ2ZpbGUgam91cm5hbCBhcyBpdCB3b3VsZCBiZWNvbWUKKwkgKiBzdGFsZSBhcyBzb29uIGFzIHNvbWV0aGluZyBpcyB3cml0dGVuIHRvIHRoZSB2b2x1bWUgYW5kIG1hcmsgdGhlCisJICogdm9sdW1lIGRpcnR5IHNvIHRoYXQgY2hrZHNrIGlzIHJ1biBpZiB0aGUgdm9sdW1lIGlzIG5vdCB1bW91bnRlZAorCSAqIGNsZWFubHkuICBGaW5hbGx5LCBtYXJrIHRoZSBxdW90YXMgb3V0IG9mIGRhdGUgc28gV2luZG93cyByZXNjYW5zCisJICogdGhlIHZvbHVtZSBvbiBib290IGFuZCB1cGRhdGVzIHRoZW0uCisJICoKKwkgKiBXaGVuIHJlbW91bnRpbmcgcmVhZC1vbmx5LCBtYXJrIHRoZSB2b2x1bWUgY2xlYW4gaWYgbm8gdm9sdW1lIGVycm9ycworCSAqIGhhdmUgb2NjdXJlZC4KKwkgKi8KKwlpZiAoKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJiAhKCpmbGFncyAmIE1TX1JET05MWSkpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzID0gIi4gIENhbm5vdCByZW1vdW50IHJlYWQtd3JpdGUuIjsKKworCQkvKiBSZW1vdW50aW5nIHJlYWQtd3JpdGUuICovCisJCWlmIChOVm9sRXJyb3JzKHZvbCkpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJWb2x1bWUgaGFzIGVycm9ycyBhbmQgaXMgcmVhZC1vbmx5JXMiLAorCQkJCQllcyk7CisJCQlyZXR1cm4gLUVST0ZTOworCQl9CisJCWlmICh2b2wtPnZvbF9mbGFncyAmIFZPTFVNRV9JU19ESVJUWSkgeworCQkJbnRmc19lcnJvcihzYiwgIlZvbHVtZSBpcyBkaXJ0eSBhbmQgcmVhZC1vbmx5JXMiLCBlcyk7CisJCQlyZXR1cm4gLUVST0ZTOworCQl9CisJCWlmICh2b2wtPnZvbF9mbGFncyAmIFZPTFVNRV9NVVNUX01PVU5UX1JPX01BU0spIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJWb2x1bWUgaGFzIHVuc3VwcG9ydGVkIGZsYWdzIHNldCBhbmQgIgorCQkJCQkiaXMgcmVhZC1vbmx5JXMiLCBlcyk7CisJCQlyZXR1cm4gLUVST0ZTOworCQl9CisJCWlmIChudGZzX3NldF92b2x1bWVfZmxhZ3Modm9sLCBWT0xVTUVfSVNfRElSVFkpKSB7CisJCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIHNldCBkaXJ0eSBiaXQgaW4gdm9sdW1lICIKKwkJCQkJImluZm9ybWF0aW9uIGZsYWdzJXMiLCBlcyk7CisJCQlyZXR1cm4gLUVST0ZTOworCQl9CisjaWYgMAorCQkvLyBUT0RPOiBFbmFibGUgdGhpcyBjb2RlIG9uY2Ugd2Ugc3RhcnQgbW9kaWZ5aW5nIGFueXRoaW5nIHRoYXQKKwkJLy8JIGlzIGRpZmZlcmVudCBiZXR3ZWVuIE5URlMgMS4yIGFuZCAzLnguLi4KKwkJLyogU2V0IE5UNCBjb21wYXRpYmlsaXR5IGZsYWcgb24gbmV3ZXIgTlRGUyB2ZXJzaW9uIHZvbHVtZXMuICovCisJCWlmICgodm9sLT5tYWpvcl92ZXIgPiAxKSkgeworCQkJaWYgKG50ZnNfc2V0X3ZvbHVtZV9mbGFncyh2b2wsIFZPTFVNRV9NT1VOVEVEX09OX05UNCkpIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIHNldCBOVDQgIgorCQkJCQkJImNvbXBhdGliaWxpdHkgZmxhZyVzIiwgZXMpOworCQkJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJCQlyZXR1cm4gLUVST0ZTOworCQkJfQorCQl9CisjZW5kaWYKKwkJaWYgKCFudGZzX2VtcHR5X2xvZ2ZpbGUodm9sLT5sb2dmaWxlX2lubykpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gZW1wdHkgam91cm5hbCAkTG9nRmlsZSVzIiwKKwkJCQkJZXMpOworCQkJTlZvbFNldEVycm9ycyh2b2wpOworCQkJcmV0dXJuIC1FUk9GUzsKKwkJfQorCQlpZiAoIW50ZnNfbWFya19xdW90YXNfb3V0X29mX2RhdGUodm9sKSkgeworCQkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBtYXJrIHF1b3RhcyBvdXQgb2YgZGF0ZSVzIiwKKwkJCQkJZXMpOworCQkJTlZvbFNldEVycm9ycyh2b2wpOworCQkJcmV0dXJuIC1FUk9GUzsKKwkJfQorCX0gZWxzZSBpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkgJiYgKCpmbGFncyAmIE1TX1JET05MWSkpIHsKKwkJLyogUmVtb3VudGluZyByZWFkLW9ubHkuICovCisJCWlmICghTlZvbEVycm9ycyh2b2wpKSB7CisJCQlpZiAobnRmc19jbGVhcl92b2x1bWVfZmxhZ3Modm9sLCBWT0xVTUVfSVNfRElSVFkpKQorCQkJCW50ZnNfd2FybmluZyhzYiwgIkZhaWxlZCB0byBjbGVhciBkaXJ0eSBiaXQgIgorCQkJCQkJImluIHZvbHVtZSBpbmZvcm1hdGlvbiAiCisJCQkJCQkiZmxhZ3MuICBSdW4gY2hrZHNrLiIpOworCQl9CisJfQorI2VuZGlmIC8qIE5URlNfUlcgKi8KKworCS8vIFRPRE86IERlYWwgd2l0aCAqZmxhZ3MuCisKKwlpZiAoIXBhcnNlX29wdGlvbnModm9sLCBvcHQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGlzX2Jvb3Rfc2VjdG9yX250ZnMgLSBjaGVjayB3aGV0aGVyIGEgYm9vdCBzZWN0b3IgaXMgYSB2YWxpZCBOVEZTIGJvb3Qgc2VjdG9yCisgKiBAc2I6CQlTdXBlciBibG9jayBvZiB0aGUgZGV2aWNlIHRvIHdoaWNoIEBiIGJlbG9uZ3MuCisgKiBAYjoJCUJvb3Qgc2VjdG9yIG9mIGRldmljZSBAc2IgdG8gY2hlY2suCisgKiBAc2lsZW50OglJZiBUUlVFLCBhbGwgb3V0cHV0IHdpbGwgYmUgc2lsZW5jZWQuCisgKgorICogaXNfYm9vdF9zZWN0b3JfbnRmcygpIGNoZWNrcyB3aGV0aGVyIHRoZSBib290IHNlY3RvciBAYiBpcyBhIHZhbGlkIE5URlMgYm9vdAorICogc2VjdG9yLiBSZXR1cm5zIFRSVUUgaWYgaXQgaXMgdmFsaWQgYW5kIEZBTFNFIGlmIG5vdC4KKyAqCisgKiBAc2IgaXMgb25seSBuZWVkZWQgZm9yIHdhcm5pbmcvZXJyb3Igb3V0cHV0LCBpLmUuIGl0IGNhbiBiZSBOVUxMIHdoZW4gc2lsZW50CisgKiBpcyBUUlVFLgorICovCitzdGF0aWMgQk9PTCBpc19ib290X3NlY3Rvcl9udGZzKGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCWNvbnN0IE5URlNfQk9PVF9TRUNUT1IgKmIsIGNvbnN0IEJPT0wgc2lsZW50KQoreworCS8qCisJICogQ2hlY2sgdGhhdCBjaGVja3N1bSA9PSBzdW0gb2YgdTMyIHZhbHVlcyBmcm9tIGIgdG8gdGhlIGNoZWNrc3VtCisJICogZmllbGQuIElmIGNoZWNrc3VtIGlzIHplcm8sIG5vIGNoZWNraW5nIGlzIGRvbmUuCisJICovCisJaWYgKCh2b2lkKiliIDwgKHZvaWQqKSZiLT5jaGVja3N1bSAmJiBiLT5jaGVja3N1bSkgeworCQlsZTMyICp1OworCQl1MzIgaTsKKworCQlmb3IgKGkgPSAwLCB1ID0gKGxlMzIqKWI7IHUgPCAobGUzMiopKCZiLT5jaGVja3N1bSk7ICsrdSkKKwkJCWkgKz0gbGUzMl90b19jcHVwKHUpOworCQlpZiAobGUzMl90b19jcHUoYi0+Y2hlY2tzdW0pICE9IGkpCisJCQlnb3RvIG5vdF9udGZzOworCX0KKwkvKiBDaGVjayBPRU1pZGVudGlmaWVyIGlzICJOVEZTICAgICIgKi8KKwlpZiAoYi0+b2VtX2lkICE9IG1hZ2ljTlRGUykKKwkJZ290byBub3RfbnRmczsKKwkvKiBDaGVjayBieXRlcyBwZXIgc2VjdG9yIHZhbHVlIGlzIGJldHdlZW4gMjU2IGFuZCA0MDk2LiAqLworCWlmIChsZTE2X3RvX2NwdShiLT5icGIuYnl0ZXNfcGVyX3NlY3RvcikgPCAweDEwMCB8fAorCQkJbGUxNl90b19jcHUoYi0+YnBiLmJ5dGVzX3Blcl9zZWN0b3IpID4gMHgxMDAwKQorCQlnb3RvIG5vdF9udGZzOworCS8qIENoZWNrIHNlY3RvcnMgcGVyIGNsdXN0ZXIgdmFsdWUgaXMgdmFsaWQuICovCisJc3dpdGNoIChiLT5icGIuc2VjdG9yc19wZXJfY2x1c3RlcikgeworCWNhc2UgMTogY2FzZSAyOiBjYXNlIDQ6IGNhc2UgODogY2FzZSAxNjogY2FzZSAzMjogY2FzZSA2NDogY2FzZSAxMjg6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gbm90X250ZnM7CisJfQorCS8qIENoZWNrIHRoZSBjbHVzdGVyIHNpemUgaXMgbm90IGFib3ZlIDY1NTM2IGJ5dGVzLiAqLworCWlmICgodTMyKWxlMTZfdG9fY3B1KGItPmJwYi5ieXRlc19wZXJfc2VjdG9yKSAqCisJCQliLT5icGIuc2VjdG9yc19wZXJfY2x1c3RlciA+IDB4MTAwMDApCisJCWdvdG8gbm90X250ZnM7CisJLyogQ2hlY2sgcmVzZXJ2ZWQvdW51c2VkIGZpZWxkcyBhcmUgcmVhbGx5IHplcm8uICovCisJaWYgKGxlMTZfdG9fY3B1KGItPmJwYi5yZXNlcnZlZF9zZWN0b3JzKSB8fAorCQkJbGUxNl90b19jcHUoYi0+YnBiLnJvb3RfZW50cmllcykgfHwKKwkJCWxlMTZfdG9fY3B1KGItPmJwYi5zZWN0b3JzKSB8fAorCQkJbGUxNl90b19jcHUoYi0+YnBiLnNlY3RvcnNfcGVyX2ZhdCkgfHwKKwkJCWxlMzJfdG9fY3B1KGItPmJwYi5sYXJnZV9zZWN0b3JzKSB8fCBiLT5icGIuZmF0cykKKwkJZ290byBub3RfbnRmczsKKwkvKiBDaGVjayBjbHVzdGVycyBwZXIgZmlsZSBtZnQgcmVjb3JkIHZhbHVlIGlzIHZhbGlkLiAqLworCWlmICgodTgpYi0+Y2x1c3RlcnNfcGVyX21mdF9yZWNvcmQgPCAweGUxIHx8CisJCQkodTgpYi0+Y2x1c3RlcnNfcGVyX21mdF9yZWNvcmQgPiAweGY3KQorCQlzd2l0Y2ggKGItPmNsdXN0ZXJzX3Blcl9tZnRfcmVjb3JkKSB7CisJCWNhc2UgMTogY2FzZSAyOiBjYXNlIDQ6IGNhc2UgODogY2FzZSAxNjogY2FzZSAzMjogY2FzZSA2NDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBub3RfbnRmczsKKwkJfQorCS8qIENoZWNrIGNsdXN0ZXJzIHBlciBpbmRleCBibG9jayB2YWx1ZSBpcyB2YWxpZC4gKi8KKwlpZiAoKHU4KWItPmNsdXN0ZXJzX3Blcl9pbmRleF9yZWNvcmQgPCAweGUxIHx8CisJCQkodTgpYi0+Y2x1c3RlcnNfcGVyX2luZGV4X3JlY29yZCA+IDB4ZjcpCisJCXN3aXRjaCAoYi0+Y2x1c3RlcnNfcGVyX2luZGV4X3JlY29yZCkgeworCQljYXNlIDE6IGNhc2UgMjogY2FzZSA0OiBjYXNlIDg6IGNhc2UgMTY6IGNhc2UgMzI6IGNhc2UgNjQ6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gbm90X250ZnM7CisJCX0KKwkvKgorCSAqIENoZWNrIGZvciB2YWxpZCBlbmQgb2Ygc2VjdG9yIG1hcmtlci4gV2Ugd2lsbCB3b3JrIHdpdGhvdXQgaXQsIGJ1dAorCSAqIG1hbnkgQklPU2VzIHdpbGwgcmVmdXNlIHRvIGJvb3QgZnJvbSBhIGJvb3RzZWN0b3IgaWYgdGhlIG1hZ2ljIGlzCisJICogaW5jb3JyZWN0LCBzbyB3ZSBlbWl0IGEgd2FybmluZy4KKwkgKi8KKwlpZiAoIXNpbGVudCAmJiBiLT5lbmRfb2Zfc2VjdG9yX21hcmtlciAhPSBjcHVfdG9fbGUxNigweGFhNTUpKQorCQludGZzX3dhcm5pbmcoc2IsICJJbnZhbGlkIGVuZCBvZiBzZWN0b3IgbWFya2VyLiIpOworCXJldHVybiBUUlVFOworbm90X250ZnM6CisJcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIHJlYWRfbnRmc19ib290X3NlY3RvciAtIHJlYWQgdGhlIE5URlMgYm9vdCBzZWN0b3Igb2YgYSBkZXZpY2UKKyAqIEBzYjoJCXN1cGVyIGJsb2NrIG9mIGRldmljZSB0byByZWFkIHRoZSBib290IHNlY3RvciBmcm9tCisgKiBAc2lsZW50OglpZiB0cnVlLCBzdXBwcmVzcyBhbGwgb3V0cHV0CisgKgorICogUmVhZHMgdGhlIGJvb3Qgc2VjdG9yIGZyb20gdGhlIGRldmljZSBhbmQgdmFsaWRhdGVzIGl0LiBJZiB0aGF0IGZhaWxzLCB0cmllcworICogdG8gcmVhZCB0aGUgYmFja3VwIGJvb3Qgc2VjdG9yLCBmaXJzdCBmcm9tIHRoZSBlbmQgb2YgdGhlIGRldmljZSBhLWxhIE5UNCBhbmQKKyAqIGxhdGVyIGFuZCB0aGVuIGZyb20gdGhlIG1pZGRsZSBvZiB0aGUgZGV2aWNlIGEtbGEgTlQzLjUxIGFuZCBiZWZvcmUuCisgKgorICogSWYgYSB2YWxpZCBib290IHNlY3RvciBpcyBmb3VuZCBidXQgaXQgaXMgbm90IHRoZSBwcmltYXJ5IGJvb3Qgc2VjdG9yLCB3ZQorICogcmVwYWlyIHRoZSBwcmltYXJ5IGJvb3Qgc2VjdG9yIHNpbGVudGx5ICh1bmxlc3MgdGhlIGRldmljZSBpcyByZWFkLW9ubHkgb3IKKyAqIHRoZSBwcmltYXJ5IGJvb3Qgc2VjdG9yIGlzIG5vdCBhY2Nlc3NpYmxlKS4KKyAqCisgKiBOT1RFOiBUbyBjYWxsIHRoaXMgZnVuY3Rpb24sIEBzYiBtdXN0IGhhdmUgdGhlIGZpZWxkcyBzX2RldiwgdGhlIG50ZnMgc3VwZXIKKyAqIGJsb2NrICh1Lm50ZnNfc2IpLCBucl9ibG9ja3MgYW5kIHRoZSBkZXZpY2UgZmxhZ3MgKHNfZmxhZ3MpIGluaXRpYWxpemVkCisgKiB0byB0aGVpciByZXNwZWN0aXZlIHZhbHVlcy4KKyAqCisgKiBSZXR1cm4gdGhlIHVubG9ja2VkIGJ1ZmZlciBoZWFkIGNvbnRhaW5pbmcgdGhlIGJvb3Qgc2VjdG9yIG9yIE5VTEwgb24gZXJyb3IuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJlYWRfbnRmc19ib290X3NlY3RvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQljb25zdCBpbnQgc2lsZW50KQoreworCWNvbnN0IGNoYXIgKnJlYWRfZXJyX3N0ciA9ICJVbmFibGUgdG8gcmVhZCAlcyBib290IHNlY3Rvci4iOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcHJpbWFyeSwgKmJoX2JhY2t1cDsKKwlsb25nIG5yX2Jsb2NrcyA9IE5URlNfU0Ioc2IpLT5ucl9ibG9ja3M7CisKKwkvKiBUcnkgdG8gcmVhZCBwcmltYXJ5IGJvb3Qgc2VjdG9yLiAqLworCWlmICgoYmhfcHJpbWFyeSA9IHNiX2JyZWFkKHNiLCAwKSkpIHsKKwkJaWYgKGlzX2Jvb3Rfc2VjdG9yX250ZnMoc2IsIChOVEZTX0JPT1RfU0VDVE9SKikKKwkJCQliaF9wcmltYXJ5LT5iX2RhdGEsIHNpbGVudCkpCisJCQlyZXR1cm4gYmhfcHJpbWFyeTsKKwkJaWYgKCFzaWxlbnQpCisJCQludGZzX2Vycm9yKHNiLCAiUHJpbWFyeSBib290IHNlY3RvciBpcyBpbnZhbGlkLiIpOworCX0gZWxzZSBpZiAoIXNpbGVudCkKKwkJbnRmc19lcnJvcihzYiwgcmVhZF9lcnJfc3RyLCAicHJpbWFyeSIpOworCWlmICghKE5URlNfU0Ioc2IpLT5vbl9lcnJvcnMgJiBPTl9FUlJPUlNfUkVDT1ZFUikpIHsKKwkJaWYgKGJoX3ByaW1hcnkpCisJCQlicmVsc2UoYmhfcHJpbWFyeSk7CisJCWlmICghc2lsZW50KQorCQkJbnRmc19lcnJvcihzYiwgIk1vdW50IG9wdGlvbiBlcnJvcnM9cmVjb3ZlciBub3QgdXNlZC4gIgorCQkJCQkiQWJvcnRpbmcgd2l0aG91dCB0cnlpbmcgdG8gcmVjb3Zlci4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qIFRyeSB0byByZWFkIE5UNCsgYmFja3VwIGJvb3Qgc2VjdG9yLiAqLworCWlmICgoYmhfYmFja3VwID0gc2JfYnJlYWQoc2IsIG5yX2Jsb2NrcyAtIDEpKSkgeworCQlpZiAoaXNfYm9vdF9zZWN0b3JfbnRmcyhzYiwgKE5URlNfQk9PVF9TRUNUT1IqKQorCQkJCWJoX2JhY2t1cC0+Yl9kYXRhLCBzaWxlbnQpKQorCQkJZ290byBob3RmaXhfcHJpbWFyeV9ib290X3NlY3RvcjsKKwkJYnJlbHNlKGJoX2JhY2t1cCk7CisJfSBlbHNlIGlmICghc2lsZW50KQorCQludGZzX2Vycm9yKHNiLCByZWFkX2Vycl9zdHIsICJiYWNrdXAiKTsKKwkvKiBUcnkgdG8gcmVhZCBOVDMuNTEtIGJhY2t1cCBib290IHNlY3Rvci4gKi8KKwlpZiAoKGJoX2JhY2t1cCA9IHNiX2JyZWFkKHNiLCBucl9ibG9ja3MgPj4gMSkpKSB7CisJCWlmIChpc19ib290X3NlY3Rvcl9udGZzKHNiLCAoTlRGU19CT09UX1NFQ1RPUiopCisJCQkJYmhfYmFja3VwLT5iX2RhdGEsIHNpbGVudCkpCisJCQlnb3RvIGhvdGZpeF9wcmltYXJ5X2Jvb3Rfc2VjdG9yOworCQlpZiAoIXNpbGVudCkKKwkJCW50ZnNfZXJyb3Ioc2IsICJDb3VsZCBub3QgZmluZCBhIHZhbGlkIGJhY2t1cCBib290ICIKKwkJCQkJInNlY3Rvci4iKTsKKwkJYnJlbHNlKGJoX2JhY2t1cCk7CisJfSBlbHNlIGlmICghc2lsZW50KQorCQludGZzX2Vycm9yKHNiLCByZWFkX2Vycl9zdHIsICJiYWNrdXAiKTsKKwkvKiBXZSBmYWlsZWQuIENsZWFudXAgYW5kIHJldHVybi4gKi8KKwlpZiAoYmhfcHJpbWFyeSkKKwkJYnJlbHNlKGJoX3ByaW1hcnkpOworCXJldHVybiBOVUxMOworaG90Zml4X3ByaW1hcnlfYm9vdF9zZWN0b3I6CisJaWYgKGJoX3ByaW1hcnkpIHsKKwkJLyoKKwkJICogSWYgd2UgbWFuYWdlZCB0byByZWFkIHNlY3RvciB6ZXJvIGFuZCB0aGUgdm9sdW1lIGlzIG5vdAorCQkgKiByZWFkLW9ubHksIGNvcHkgdGhlIGZvdW5kLCB2YWxpZCBiYWNrdXAgYm9vdCBzZWN0b3IgdG8gdGhlCisJCSAqIHByaW1hcnkgYm9vdCBzZWN0b3IuCisJCSAqLworCQlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJCW50ZnNfd2FybmluZyhzYiwgIkhvdC1maXg6IFJlY292ZXJpbmcgaW52YWxpZCBwcmltYXJ5ICIKKwkJCQkJImJvb3Qgc2VjdG9yIGZyb20gYmFja3VwIGNvcHkuIik7CisJCQltZW1jcHkoYmhfcHJpbWFyeS0+Yl9kYXRhLCBiaF9iYWNrdXAtPmJfZGF0YSwKKwkJCQkJc2ItPnNfYmxvY2tzaXplKTsKKwkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoX3ByaW1hcnkpOworCQkJc3luY19kaXJ0eV9idWZmZXIoYmhfcHJpbWFyeSk7CisJCQlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoX3ByaW1hcnkpKSB7CisJCQkJYnJlbHNlKGJoX2JhY2t1cCk7CisJCQkJcmV0dXJuIGJoX3ByaW1hcnk7CisJCQl9CisJCQludGZzX2Vycm9yKHNiLCAiSG90LWZpeDogRGV2aWNlIHdyaXRlIGVycm9yIHdoaWxlICIKKwkJCQkJInJlY292ZXJpbmcgcHJpbWFyeSBib290IHNlY3Rvci4iKTsKKwkJfSBlbHNlIHsKKwkJCW50ZnNfd2FybmluZyhzYiwgIkhvdC1maXg6IFJlY292ZXJ5IG9mIHByaW1hcnkgYm9vdCAiCisJCQkJCSJzZWN0b3IgZmFpbGVkOiBSZWFkLW9ubHkgbW91bnQuIik7CisJCX0KKwkJYnJlbHNlKGJoX3ByaW1hcnkpOworCX0KKwludGZzX3dhcm5pbmcoc2IsICJVc2luZyBiYWNrdXAgYm9vdCBzZWN0b3IuIik7CisJcmV0dXJuIGJoX2JhY2t1cDsKK30KKworLyoqCisgKiBwYXJzZV9udGZzX2Jvb3Rfc2VjdG9yIC0gcGFyc2UgdGhlIGJvb3Qgc2VjdG9yIGFuZCBzdG9yZSB0aGUgZGF0YSBpbiBAdm9sCisgKiBAdm9sOgl2b2x1bWUgc3RydWN0dXJlIHRvIGluaXRpYWxpc2Ugd2l0aCBkYXRhIGZyb20gYm9vdCBzZWN0b3IKKyAqIEBiOgkJYm9vdCBzZWN0b3IgdG8gcGFyc2UKKyAqCisgKiBQYXJzZSB0aGUgbnRmcyBib290IHNlY3RvciBAYiBhbmQgc3RvcmUgYWxsIGltcG9yYW50IGluZm9ybWF0aW9uIHRoZXJlaW4gaW4KKyAqIHRoZSBudGZzIHN1cGVyIGJsb2NrIEB2b2wuICBSZXR1cm4gVFJVRSBvbiBzdWNjZXNzIGFuZCBGQUxTRSBvbiBlcnJvci4KKyAqLworc3RhdGljIEJPT0wgcGFyc2VfbnRmc19ib290X3NlY3RvcihudGZzX3ZvbHVtZSAqdm9sLCBjb25zdCBOVEZTX0JPT1RfU0VDVE9SICpiKQoreworCXVuc2lnbmVkIGludCBzZWN0b3JzX3Blcl9jbHVzdGVyX2JpdHMsIG5yX2hpZGRlbl9zZWN0czsKKwlpbnQgY2x1c3RlcnNfcGVyX21mdF9yZWNvcmQsIGNsdXN0ZXJzX3Blcl9pbmRleF9yZWNvcmQ7CisJczY0IGxsOworCisJdm9sLT5zZWN0b3Jfc2l6ZSA9IGxlMTZfdG9fY3B1KGItPmJwYi5ieXRlc19wZXJfc2VjdG9yKTsKKwl2b2wtPnNlY3Rvcl9zaXplX2JpdHMgPSBmZnModm9sLT5zZWN0b3Jfc2l6ZSkgLSAxOworCW50ZnNfZGVidWcoInZvbC0+c2VjdG9yX3NpemUgPSAlaSAoMHgleCkiLCB2b2wtPnNlY3Rvcl9zaXplLAorCQkJdm9sLT5zZWN0b3Jfc2l6ZSk7CisJbnRmc19kZWJ1Zygidm9sLT5zZWN0b3Jfc2l6ZV9iaXRzID0gJWkgKDB4JXgpIiwgdm9sLT5zZWN0b3Jfc2l6ZV9iaXRzLAorCQkJdm9sLT5zZWN0b3Jfc2l6ZV9iaXRzKTsKKwlpZiAodm9sLT5zZWN0b3Jfc2l6ZSAhPSB2b2wtPnNiLT5zX2Jsb2Nrc2l6ZSkKKwkJbnRmc193YXJuaW5nKHZvbC0+c2IsICJUaGUgYm9vdCBzZWN0b3IgaW5kaWNhdGVzIGEgc2VjdG9yIHNpemUgIgorCQkJCSJkaWZmZXJlbnQgZnJvbSB0aGUgZGV2aWNlIHNlY3RvciBzaXplLiIpOworCW50ZnNfZGVidWcoInNlY3RvcnNfcGVyX2NsdXN0ZXIgPSAweCV4IiwgYi0+YnBiLnNlY3RvcnNfcGVyX2NsdXN0ZXIpOworCXNlY3RvcnNfcGVyX2NsdXN0ZXJfYml0cyA9IGZmcyhiLT5icGIuc2VjdG9yc19wZXJfY2x1c3RlcikgLSAxOworCW50ZnNfZGVidWcoInNlY3RvcnNfcGVyX2NsdXN0ZXJfYml0cyA9IDB4JXgiLAorCQkJc2VjdG9yc19wZXJfY2x1c3Rlcl9iaXRzKTsKKwlucl9oaWRkZW5fc2VjdHMgPSBsZTMyX3RvX2NwdShiLT5icGIuaGlkZGVuX3NlY3RvcnMpOworCW50ZnNfZGVidWcoIm51bWJlciBvZiBoaWRkZW4gc2VjdG9ycyA9IDB4JXgiLCBucl9oaWRkZW5fc2VjdHMpOworCXZvbC0+Y2x1c3Rlcl9zaXplID0gdm9sLT5zZWN0b3Jfc2l6ZSA8PCBzZWN0b3JzX3Blcl9jbHVzdGVyX2JpdHM7CisJdm9sLT5jbHVzdGVyX3NpemVfbWFzayA9IHZvbC0+Y2x1c3Rlcl9zaXplIC0gMTsKKwl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzID0gZmZzKHZvbC0+Y2x1c3Rlcl9zaXplKSAtIDE7CisJbnRmc19kZWJ1Zygidm9sLT5jbHVzdGVyX3NpemUgPSAlaSAoMHgleCkiLCB2b2wtPmNsdXN0ZXJfc2l6ZSwKKwkJCXZvbC0+Y2x1c3Rlcl9zaXplKTsKKwludGZzX2RlYnVnKCJ2b2wtPmNsdXN0ZXJfc2l6ZV9tYXNrID0gMHgleCIsIHZvbC0+Y2x1c3Rlcl9zaXplX21hc2spOworCW50ZnNfZGVidWcoInZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMgPSAlaSAoMHgleCkiLAorCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0cywgdm9sLT5jbHVzdGVyX3NpemVfYml0cyk7CisJaWYgKHZvbC0+c2VjdG9yX3NpemUgPiB2b2wtPmNsdXN0ZXJfc2l6ZSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJTZWN0b3Igc2l6ZXMgYWJvdmUgdGhlIGNsdXN0ZXIgc2l6ZSBhcmUgIgorCQkJCSJub3Qgc3VwcG9ydGVkLiAgU29ycnkuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJaWYgKHZvbC0+c2ItPnNfYmxvY2tzaXplID4gdm9sLT5jbHVzdGVyX3NpemUpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiQ2x1c3RlciBzaXplcyBzbWFsbGVyIHRoYW4gdGhlIGRldmljZSAiCisJCQkJInNlY3RvciBzaXplIGFyZSBub3Qgc3VwcG9ydGVkLiAgU29ycnkuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJY2x1c3RlcnNfcGVyX21mdF9yZWNvcmQgPSBiLT5jbHVzdGVyc19wZXJfbWZ0X3JlY29yZDsKKwludGZzX2RlYnVnKCJjbHVzdGVyc19wZXJfbWZ0X3JlY29yZCA9ICVpICgweCV4KSIsCisJCQljbHVzdGVyc19wZXJfbWZ0X3JlY29yZCwgY2x1c3RlcnNfcGVyX21mdF9yZWNvcmQpOworCWlmIChjbHVzdGVyc19wZXJfbWZ0X3JlY29yZCA+IDApCisJCXZvbC0+bWZ0X3JlY29yZF9zaXplID0gdm9sLT5jbHVzdGVyX3NpemUgPDwKKwkJCQkoZmZzKGNsdXN0ZXJzX3Blcl9tZnRfcmVjb3JkKSAtIDEpOworCWVsc2UKKwkJLyoKKwkJICogV2hlbiBtZnRfcmVjb3JkX3NpemUgPCBjbHVzdGVyX3NpemUsIGNsdXN0ZXJzX3Blcl9tZnRfcmVjb3JkCisJCSAqID0gLWxvZzIobWZ0X3JlY29yZF9zaXplKSBieXRlcy4gbWZ0X3JlY29yZF9zaXplIG5vcm1hbHkgaXMKKwkJICogMTAyNCBieXRlcywgd2hpY2ggaXMgZW5jb2RlZCBhcyAweEY2ICgtMTAgaW4gZGVjaW1hbCkuCisJCSAqLworCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZSA9IDEgPDwgLWNsdXN0ZXJzX3Blcl9tZnRfcmVjb3JkOworCXZvbC0+bWZ0X3JlY29yZF9zaXplX21hc2sgPSB2b2wtPm1mdF9yZWNvcmRfc2l6ZSAtIDE7CisJdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cyA9IGZmcyh2b2wtPm1mdF9yZWNvcmRfc2l6ZSkgLSAxOworCW50ZnNfZGVidWcoInZvbC0+bWZ0X3JlY29yZF9zaXplID0gJWkgKDB4JXgpIiwgdm9sLT5tZnRfcmVjb3JkX3NpemUsCisJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZSk7CisJbnRmc19kZWJ1Zygidm9sLT5tZnRfcmVjb3JkX3NpemVfbWFzayA9IDB4JXgiLAorCQkJdm9sLT5tZnRfcmVjb3JkX3NpemVfbWFzayk7CisJbnRmc19kZWJ1Zygidm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cyA9ICVpICgweCV4KSIsCisJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzLCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzKTsKKwkvKgorCSAqIFdlIGNhbm5vdCBzdXBwb3J0IG1mdCByZWNvcmQgc2l6ZXMgYWJvdmUgdGhlIFBBR0VfQ0FDSEVfU0laRSBzaW5jZQorCSAqIHdlIHN0b3JlICRNRlQvJERBVEEsIHRoZSB0YWJsZSBvZiBtZnQgcmVjb3JkcyBpbiB0aGUgcGFnZSBjYWNoZS4KKwkgKi8KKwlpZiAodm9sLT5tZnRfcmVjb3JkX3NpemUgPiBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiTWZ0IHJlY29yZCBzaXplICVpICgweCV4KSBleGNlZWRzIHRoZSAiCisJCQkJInBhZ2UgY2FjaGUgc2l6ZSBvbiB5b3VyIHN5c3RlbSAlbHUgKDB4JWx4KS4gICIKKwkJCQkiVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAgU29ycnkuIiwKKwkJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZSwgdm9sLT5tZnRfcmVjb3JkX3NpemUsCisJCQkJUEFHRV9DQUNIRV9TSVpFLCBQQUdFX0NBQ0hFX1NJWkUpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWNsdXN0ZXJzX3Blcl9pbmRleF9yZWNvcmQgPSBiLT5jbHVzdGVyc19wZXJfaW5kZXhfcmVjb3JkOworCW50ZnNfZGVidWcoImNsdXN0ZXJzX3Blcl9pbmRleF9yZWNvcmQgPSAlaSAoMHgleCkiLAorCQkJY2x1c3RlcnNfcGVyX2luZGV4X3JlY29yZCwgY2x1c3RlcnNfcGVyX2luZGV4X3JlY29yZCk7CisJaWYgKGNsdXN0ZXJzX3Blcl9pbmRleF9yZWNvcmQgPiAwKQorCQl2b2wtPmluZGV4X3JlY29yZF9zaXplID0gdm9sLT5jbHVzdGVyX3NpemUgPDwKKwkJCQkoZmZzKGNsdXN0ZXJzX3Blcl9pbmRleF9yZWNvcmQpIC0gMSk7CisJZWxzZQorCQkvKgorCQkgKiBXaGVuIGluZGV4X3JlY29yZF9zaXplIDwgY2x1c3Rlcl9zaXplLAorCQkgKiBjbHVzdGVyc19wZXJfaW5kZXhfcmVjb3JkID0gLWxvZzIoaW5kZXhfcmVjb3JkX3NpemUpIGJ5dGVzLgorCQkgKiBpbmRleF9yZWNvcmRfc2l6ZSBub3JtYWx5IGVxdWFscyA0MDk2IGJ5dGVzLCB3aGljaCBpcworCQkgKiBlbmNvZGVkIGFzIDB4RjQgKC0xMiBpbiBkZWNpbWFsKS4KKwkJICovCisJCXZvbC0+aW5kZXhfcmVjb3JkX3NpemUgPSAxIDw8IC1jbHVzdGVyc19wZXJfaW5kZXhfcmVjb3JkOworCXZvbC0+aW5kZXhfcmVjb3JkX3NpemVfbWFzayA9IHZvbC0+aW5kZXhfcmVjb3JkX3NpemUgLSAxOworCXZvbC0+aW5kZXhfcmVjb3JkX3NpemVfYml0cyA9IGZmcyh2b2wtPmluZGV4X3JlY29yZF9zaXplKSAtIDE7CisJbnRmc19kZWJ1Zygidm9sLT5pbmRleF9yZWNvcmRfc2l6ZSA9ICVpICgweCV4KSIsCisJCQl2b2wtPmluZGV4X3JlY29yZF9zaXplLCB2b2wtPmluZGV4X3JlY29yZF9zaXplKTsKKwludGZzX2RlYnVnKCJ2b2wtPmluZGV4X3JlY29yZF9zaXplX21hc2sgPSAweCV4IiwKKwkJCXZvbC0+aW5kZXhfcmVjb3JkX3NpemVfbWFzayk7CisJbnRmc19kZWJ1Zygidm9sLT5pbmRleF9yZWNvcmRfc2l6ZV9iaXRzID0gJWkgKDB4JXgpIiwKKwkJCXZvbC0+aW5kZXhfcmVjb3JkX3NpemVfYml0cywKKwkJCXZvbC0+aW5kZXhfcmVjb3JkX3NpemVfYml0cyk7CisJLyoKKwkgKiBHZXQgdGhlIHNpemUgb2YgdGhlIHZvbHVtZSBpbiBjbHVzdGVycyBhbmQgY2hlY2sgZm9yIDY0LWJpdC1uZXNzLgorCSAqIFdpbmRvd3MgY3VycmVudGx5IG9ubHkgdXNlcyAzMiBiaXRzIHRvIHNhdmUgdGhlIGNsdXN0ZXJzIHNvIHdlIGRvCisJICogdGhlIHNhbWUgYXMgaXQgaXMgbXVjaCBmYXN0ZXIgb24gMzItYml0IENQVXMuCisJICovCisJbGwgPSBzbGU2NF90b19jcHUoYi0+bnVtYmVyX29mX3NlY3RvcnMpID4+IHNlY3RvcnNfcGVyX2NsdXN0ZXJfYml0czsKKwlpZiAoKHU2NClsbCA+PSAxVUxMIDw8IDMyKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkNhbm5vdCBoYW5kbGUgNjQtYml0IGNsdXN0ZXJzLiAgU29ycnkuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJdm9sLT5ucl9jbHVzdGVycyA9IGxsOworCW50ZnNfZGVidWcoInZvbC0+bnJfY2x1c3RlcnMgPSAweCVsbHgiLCAobG9uZyBsb25nKXZvbC0+bnJfY2x1c3RlcnMpOworCS8qCisJICogT24gYW4gYXJjaGl0ZWN0dXJlIHdoZXJlIHVuc2lnbmVkIGxvbmcgaXMgMzItYml0cywgd2UgcmVzdHJpY3QgdGhlCisJICogdm9sdW1lIHNpemUgdG8gMlRpQiAoMl40MSkuIE9uIGEgNjQtYml0IGFyY2hpdGVjdHVyZSwgdGhlIGNvbXBpbGVyCisJICogd2lsbCBob3BlZnVsbHkgb3B0aW1pemUgdGhlIHdob2xlIGNoZWNrIGF3YXkuCisJICovCisJaWYgKHNpemVvZih1bnNpZ25lZCBsb25nKSA8IDgpIHsKKwkJaWYgKChsbCA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKSA+PSAoMVVMTCA8PCA0MSkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlZvbHVtZSBzaXplICglbGx1VGlCKSBpcyB0b28gIgorCQkJCQkibGFyZ2UgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLiAgIgorCQkJCQkiTWF4aW11bSBzdXBwb3J0ZWQgaXMgMlRpQi4gIFNvcnJ5LiIsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGwgPj4gKDQwIC0KKwkJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0cykpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCWxsID0gc2xlNjRfdG9fY3B1KGItPm1mdF9sY24pOworCWlmIChsbCA+PSB2b2wtPm5yX2NsdXN0ZXJzKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIk1GVCBMQ04gaXMgYmV5b25kIGVuZCBvZiB2b2x1bWUuICBXZWlyZC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwl2b2wtPm1mdF9sY24gPSBsbDsKKwludGZzX2RlYnVnKCJ2b2wtPm1mdF9sY24gPSAweCVsbHgiLCAobG9uZyBsb25nKXZvbC0+bWZ0X2xjbik7CisJbGwgPSBzbGU2NF90b19jcHUoYi0+bWZ0bWlycl9sY24pOworCWlmIChsbCA+PSB2b2wtPm5yX2NsdXN0ZXJzKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIk1GVE1pcnIgTENOIGlzIGJleW9uZCBlbmQgb2Ygdm9sdW1lLiAgIgorCQkJCSJXZWlyZC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwl2b2wtPm1mdG1pcnJfbGNuID0gbGw7CisJbnRmc19kZWJ1Zygidm9sLT5tZnRtaXJyX2xjbiA9IDB4JWxseCIsIChsb25nIGxvbmcpdm9sLT5tZnRtaXJyX2xjbik7CisjaWZkZWYgTlRGU19SVworCS8qCisJICogV29yayBvdXQgdGhlIHNpemUgb2YgdGhlIG1mdCBtaXJyb3IgaW4gbnVtYmVyIG9mIG1mdCByZWNvcmRzLiBJZiB0aGUKKwkgKiBjbHVzdGVyIHNpemUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIHRha2VuIGJ5IGZvdXIgbWZ0CisJICogcmVjb3JkcywgdGhlIG1mdCBtaXJyb3Igc3RvcmVzIHRoZSBmaXJzdCBmb3VyIG1mdCByZWNvcmRzLiBJZiB0aGUKKwkgKiBjbHVzdGVyIHNpemUgaXMgYmlnZ2VyIHRoYW4gdGhlIHNpemUgdGFrZW4gYnkgZm91ciBtZnQgcmVjb3JkcywgdGhlCisJICogbWZ0IG1pcnJvciBjb250YWlucyBhcyBtYW55IG1mdCByZWNvcmRzIGFzIHdpbGwgZml0IGludG8gb25lCisJICogY2x1c3Rlci4KKwkgKi8KKwlpZiAodm9sLT5jbHVzdGVyX3NpemUgPD0gKDQgPDwgdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cykpCisJCXZvbC0+bWZ0bWlycl9zaXplID0gNDsKKwllbHNlCisJCXZvbC0+bWZ0bWlycl9zaXplID0gdm9sLT5jbHVzdGVyX3NpemUgPj4KKwkJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzOworCW50ZnNfZGVidWcoInZvbC0+bWZ0bWlycl9zaXplID0gJWkiLCB2b2wtPm1mdG1pcnJfc2l6ZSk7CisjZW5kaWYgLyogTlRGU19SVyAqLworCXZvbC0+c2VyaWFsX25vID0gbGU2NF90b19jcHUoYi0+dm9sdW1lX3NlcmlhbF9udW1iZXIpOworCW50ZnNfZGVidWcoInZvbC0+c2VyaWFsX25vID0gMHglbGx4IiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdm9sLT5zZXJpYWxfbm8pOworCXJldHVybiBUUlVFOworfQorCisvKioKKyAqIG50ZnNfc2V0dXBfYWxsb2NhdG9ycyAtIGluaXRpYWxpemUgdGhlIGNsdXN0ZXIgYW5kIG1mdCBhbGxvY2F0b3JzCisgKiBAdm9sOgl2b2x1bWUgc3RydWN0dXJlIGZvciB3aGljaCB0byBzZXR1cCB0aGUgYWxsb2NhdG9ycworICoKKyAqIFNldHVwIHRoZSBjbHVzdGVyIChsY24pIGFuZCBtZnQgYWxsb2NhdG9ycyB0byB0aGUgc3RhcnRpbmcgdmFsdWVzLgorICovCitzdGF0aWMgdm9pZCBudGZzX3NldHVwX2FsbG9jYXRvcnMobnRmc192b2x1bWUgKnZvbCkKK3sKKyNpZmRlZiBOVEZTX1JXCisJTENOIG1mdF96b25lX3NpemUsIG1mdF9sY247CisjZW5kaWYgLyogTlRGU19SVyAqLworCisJbnRmc19kZWJ1Zygidm9sLT5tZnRfem9uZV9tdWx0aXBsaWVyID0gMHgleCIsCisJCQl2b2wtPm1mdF96b25lX211bHRpcGxpZXIpOworI2lmZGVmIE5URlNfUlcKKwkvKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIE1GVCB6b25lLiAqLworCW1mdF96b25lX3NpemUgPSB2b2wtPm5yX2NsdXN0ZXJzOworCXN3aXRjaCAodm9sLT5tZnRfem9uZV9tdWx0aXBsaWVyKSB7ICAvKiAlIG9mIHZvbHVtZSBzaXplIGluIGNsdXN0ZXJzICovCisJY2FzZSA0OgorCQltZnRfem9uZV9zaXplID4+PSAxOwkJCS8qIDUwJSAgICovCisJCWJyZWFrOworCWNhc2UgMzoKKwkJbWZ0X3pvbmVfc2l6ZSA9IChtZnRfem9uZV9zaXplICsKKwkJCQkobWZ0X3pvbmVfc2l6ZSA+PiAxKSkgPj4gMjsJLyogMzcuNSUgKi8KKwkJYnJlYWs7CisJY2FzZSAyOgorCQltZnRfem9uZV9zaXplID4+PSAyOwkJCS8qIDI1JSAgICovCisJCWJyZWFrOworCS8qIGNhc2UgMTogKi8KKwlkZWZhdWx0OgorCQltZnRfem9uZV9zaXplID4+PSAzOwkJCS8qIDEyLjUlICovCisJCWJyZWFrOworCX0KKwkvKiBTZXR1cCB0aGUgbWZ0IHpvbmUuICovCisJdm9sLT5tZnRfem9uZV9zdGFydCA9IHZvbC0+bWZ0X3pvbmVfcG9zID0gdm9sLT5tZnRfbGNuOworCW50ZnNfZGVidWcoInZvbC0+bWZ0X3pvbmVfcG9zID0gMHglbGx4IiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdm9sLT5tZnRfem9uZV9wb3MpOworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBtZnRfbGNuIGZvciBhbiB1bm1vZGlmaWVkIE5URlMgdm9sdW1lIChzZWUgbWtudGZzCisJICogc291cmNlKSBhbmQgaWYgdGhlIGFjdHVhbCBtZnRfbGNuIGlzIGluIHRoZSBleHBlY3RlZCBwbGFjZSBvciBldmVuCisJICogZnVydGhlciB0byB0aGUgZnJvbnQgb2YgdGhlIHZvbHVtZSwgZXh0ZW5kIHRoZSBtZnRfem9uZSB0byBjb3ZlciB0aGUKKwkgKiBiZWdpbm5pbmcgb2YgdGhlIHZvbHVtZSBhcyB3ZWxsLiAgVGhpcyBpcyBpbiBvcmRlciB0byBwcm90ZWN0IHRoZQorCSAqIGFyZWEgcmVzZXJ2ZWQgZm9yIHRoZSBtZnQgYml0bWFwIGFzIHdlbGwgd2l0aGluIHRoZSBtZnRfem9uZSBpdHNlbGYuCisJICogT24gbm9uLXN0YW5kYXJkIHZvbHVtZXMgd2UgZG8gbm90IHByb3RlY3QgaXQgYXMgdGhlIG92ZXJoZWFkIHdvdWxkCisJICogYmUgaGlnaGVyIHRoYW4gdGhlIHNwZWVkIGluY3JlYXNlIHdlIHdvdWxkIGdldCBieSBkb2luZyBpdC4KKwkgKi8KKwltZnRfbGNuID0gKDgxOTIgKyAyICogdm9sLT5jbHVzdGVyX3NpemUgLSAxKSAvIHZvbC0+Y2x1c3Rlcl9zaXplOworCWlmIChtZnRfbGNuICogdm9sLT5jbHVzdGVyX3NpemUgPCAxNiAqIDEwMjQpCisJCW1mdF9sY24gPSAoMTYgKiAxMDI0ICsgdm9sLT5jbHVzdGVyX3NpemUgLSAxKSAvCisJCQkJdm9sLT5jbHVzdGVyX3NpemU7CisJaWYgKHZvbC0+bWZ0X3pvbmVfc3RhcnQgPD0gbWZ0X2xjbikKKwkJdm9sLT5tZnRfem9uZV9zdGFydCA9IDA7CisJbnRmc19kZWJ1Zygidm9sLT5tZnRfem9uZV9zdGFydCA9IDB4JWxseCIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXZvbC0+bWZ0X3pvbmVfc3RhcnQpOworCS8qCisJICogTmVlZCB0byBjYXAgdGhlIG1mdCB6b25lIG9uIG5vbi1zdGFuZGFyZCB2b2x1bWVzIHNvIHRoYXQgaXQgZG9lcworCSAqIG5vdCBwb2ludCBvdXRzaWRlIHRoZSBib3VuZGFyaWVzIG9mIHRoZSB2b2x1bWUuICBXZSBkbyB0aGlzIGJ5CisJICogaGFsdmluZyB0aGUgem9uZSBzaXplIHVudGlsIHdlIGFyZSBpbnNpZGUgdGhlIHZvbHVtZS4KKwkgKi8KKwl2b2wtPm1mdF96b25lX2VuZCA9IHZvbC0+bWZ0X2xjbiArIG1mdF96b25lX3NpemU7CisJd2hpbGUgKHZvbC0+bWZ0X3pvbmVfZW5kID49IHZvbC0+bnJfY2x1c3RlcnMpIHsKKwkJbWZ0X3pvbmVfc2l6ZSA+Pj0gMTsKKwkJdm9sLT5tZnRfem9uZV9lbmQgPSB2b2wtPm1mdF9sY24gKyBtZnRfem9uZV9zaXplOworCX0KKwludGZzX2RlYnVnKCJ2b2wtPm1mdF96b25lX2VuZCA9IDB4JWxseCIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXZvbC0+bWZ0X3pvbmVfZW5kKTsKKwkvKgorCSAqIFNldCB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gZWFjaCBkYXRhIHpvbmUgdG8gdGhlIHN0YXJ0IG9mIHRoZQorCSAqIHJlc3BlY3RpdmUgem9uZS4KKwkgKi8KKwl2b2wtPmRhdGExX3pvbmVfcG9zID0gdm9sLT5tZnRfem9uZV9lbmQ7CisJbnRmc19kZWJ1Zygidm9sLT5kYXRhMV96b25lX3BvcyA9IDB4JWxseCIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXZvbC0+ZGF0YTFfem9uZV9wb3MpOworCXZvbC0+ZGF0YTJfem9uZV9wb3MgPSAwOworCW50ZnNfZGVidWcoInZvbC0+ZGF0YTJfem9uZV9wb3MgPSAweCVsbHgiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2b2wtPmRhdGEyX3pvbmVfcG9zKTsKKworCS8qIFNldCB0aGUgbWZ0IGRhdGEgYWxsb2NhdGlvbiBwb3NpdGlvbiB0byBtZnQgcmVjb3JkIDI0LiAqLworCXZvbC0+bWZ0X2RhdGFfcG9zID0gMjQ7CisJbnRmc19kZWJ1Zygidm9sLT5tZnRfZGF0YV9wb3MgPSAweCVsbHgiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2b2wtPm1mdF9kYXRhX3Bvcyk7CisjZW5kaWYgLyogTlRGU19SVyAqLworfQorCisjaWZkZWYgTlRGU19SVworCisvKioKKyAqIGxvYWRfYW5kX2luaXRfbWZ0X21pcnJvciAtIGxvYWQgYW5kIHNldHVwIHRoZSBtZnQgbWlycm9yIGlub2RlIGZvciBhIHZvbHVtZQorICogQHZvbDoJbnRmcyBzdXBlciBibG9jayBkZXNjcmliaW5nIGRldmljZSB3aG9zZSBtZnQgbWlycm9yIHRvIGxvYWQKKyAqCisgKiBSZXR1cm4gVFJVRSBvbiBzdWNjZXNzIG9yIEZBTFNFIG9uIGVycm9yLgorICovCitzdGF0aWMgQk9PTCBsb2FkX2FuZF9pbml0X21mdF9taXJyb3IobnRmc192b2x1bWUgKnZvbCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKnRtcF9pbm87CisJbnRmc19pbm9kZSAqdG1wX25pOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJLyogR2V0IG1mdCBtaXJyb3IgaW5vZGUuICovCisJdG1wX2lubyA9IG50ZnNfaWdldCh2b2wtPnNiLCBGSUxFX01GVE1pcnIpOworCWlmIChJU19FUlIodG1wX2lubykgfHwgaXNfYmFkX2lub2RlKHRtcF9pbm8pKSB7CisJCWlmICghSVNfRVJSKHRtcF9pbm8pKQorCQkJaXB1dCh0bXBfaW5vKTsKKwkJLyogQ2FsbGVyIHdpbGwgZGlzcGxheSBlcnJvciBtZXNzYWdlLiAqLworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qCisJICogUmUtaW5pdGlhbGl6ZSBzb21lIHNwZWNpZmljcyBhYm91dCAkTUZUTWlycidzIGlub2RlIGFzCisJICogbnRmc19yZWFkX2lub2RlKCkgd2lsbCBoYXZlIHNldCB1cCB0aGUgZGVmYXVsdCBvbmVzLgorCSAqLworCS8qIFNldCB1aWQgYW5kIGdpZCB0byByb290LiAqLworCXRtcF9pbm8tPmlfdWlkID0gdG1wX2luby0+aV9naWQgPSAwOworCS8qIFJlZ3VsYXIgZmlsZS4gIE5vIGFjY2VzcyBmb3IgYW55b25lLiAqLworCXRtcF9pbm8tPmlfbW9kZSA9IFNfSUZSRUc7CisJLyogTm8gVkZTIGluaXRpYXRlZCBvcGVyYXRpb25zIGFsbG93ZWQgZm9yICRNRlRNaXJyLiAqLworCXRtcF9pbm8tPmlfb3AgPSAmbnRmc19lbXB0eV9pbm9kZV9vcHM7CisJdG1wX2luby0+aV9mb3AgPSAmbnRmc19lbXB0eV9maWxlX29wczsKKwkvKiBQdXQgaW4gb3VyIHNwZWNpYWwgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zLiAqLworCXRtcF9pbm8tPmlfbWFwcGluZy0+YV9vcHMgPSAmbnRmc19tc3RfYW9wczsKKwl0bXBfbmkgPSBOVEZTX0kodG1wX2lubyk7CisJLyogVGhlICRNRlRNaXJyLCBsaWtlIHRoZSAkTUZUIGlzIG11bHRpIHNlY3RvciB0cmFuc2ZlciBwcm90ZWN0ZWQuICovCisJTklub1NldE1zdFByb3RlY3RlZCh0bXBfbmkpOworCS8qCisJICogU2V0IHVwIG91ciBsaXR0bGUgY2hlYXQgYWxsb3dpbmcgdXMgdG8gcmV1c2UgdGhlIGFzeW5jIHJlYWQgaW8KKwkgKiBjb21wbGV0aW9uIGhhbmRsZXIgZm9yIGRpcmVjdG9yaWVzLgorCSAqLworCXRtcF9uaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSA9IHZvbC0+bWZ0X3JlY29yZF9zaXplOworCXRtcF9uaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZV9iaXRzID0gdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0czsKKwl2b2wtPm1mdG1pcnJfaW5vID0gdG1wX2lubzsKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiBUUlVFOworfQorCisvKioKKyAqIGNoZWNrX21mdF9taXJyb3IgLSBjb21wYXJlIGNvbnRlbnRzIG9mIHRoZSBtZnQgbWlycm9yIHdpdGggdGhlIG1mdAorICogQHZvbDoJbnRmcyBzdXBlciBibG9jayBkZXNjcmliaW5nIGRldmljZSB3aG9zZSBtZnQgbWlycm9yIHRvIGNoZWNrCisgKgorICogUmV0dXJuIFRSVUUgb24gc3VjY2VzcyBvciBGQUxTRSBvbiBlcnJvci4KKyAqCisgKiBOb3RlLCB0aGlzIGZ1bmN0aW9uIGFsc28gcmVzdWx0cyBpbiB0aGUgbWZ0IG1pcnJvciBydW5saXN0IGJlaW5nIGNvbXBsZXRlbHkKKyAqIG1hcHBlZCBpbnRvIG1lbW9yeS4gIFRoZSBtZnQgbWlycm9yIHdyaXRlIGNvZGUgcmVxdWlyZXMgdGhpcyBhbmQgd2lsbCBCVUcoKQorICogc2hvdWxkIGl0IGZpbmQgYW4gdW5tYXBwZWQgcnVubGlzdCBlbGVtZW50LgorICovCitzdGF0aWMgQk9PTCBjaGVja19tZnRfbWlycm9yKG50ZnNfdm9sdW1lICp2b2wpCit7CisJdW5zaWduZWQgbG9uZyBpbmRleDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gdm9sLT5zYjsKKwludGZzX2lub2RlICptaXJyX25pOworCXN0cnVjdCBwYWdlICptZnRfcGFnZSwgKm1pcnJfcGFnZTsKKwl1OCAqa21mdCwgKmttaXJyOworCXJ1bmxpc3RfZWxlbWVudCAqcmwsIHJsMlsyXTsKKwlpbnQgbXJlY3NfcGVyX3BhZ2UsIGk7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwkvKiBDb21wYXJlIGNvbnRlbnRzIG9mICRNRlQgYW5kICRNRlRNaXJyLiAqLworCW1yZWNzX3Blcl9wYWdlID0gUEFHRV9DQUNIRV9TSVpFIC8gdm9sLT5tZnRfcmVjb3JkX3NpemU7CisJQlVHX09OKCFtcmVjc19wZXJfcGFnZSk7CisJQlVHX09OKCF2b2wtPm1mdG1pcnJfc2l6ZSk7CisJbWZ0X3BhZ2UgPSBtaXJyX3BhZ2UgPSBOVUxMOworCWttZnQgPSBrbWlyciA9IE5VTEw7CisJaW5kZXggPSBpID0gMDsKKwlkbyB7CisJCXUzMiBieXRlczsKKworCQkvKiBTd2l0Y2ggcGFnZXMgaWYgbmVjZXNzYXJ5LiAqLworCQlpZiAoIShpICUgbXJlY3NfcGVyX3BhZ2UpKSB7CisJCQlpZiAoaW5kZXgpIHsKKwkJCQludGZzX3VubWFwX3BhZ2UobWZ0X3BhZ2UpOworCQkJCW50ZnNfdW5tYXBfcGFnZShtaXJyX3BhZ2UpOworCQkJfQorCQkJLyogR2V0IHRoZSAkTUZUIHBhZ2UuICovCisJCQltZnRfcGFnZSA9IG50ZnNfbWFwX3BhZ2Uodm9sLT5tZnRfaW5vLT5pX21hcHBpbmcsCisJCQkJCWluZGV4KTsKKwkJCWlmIChJU19FUlIobWZ0X3BhZ2UpKSB7CisJCQkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byByZWFkICRNRlQuIik7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJa21mdCA9IHBhZ2VfYWRkcmVzcyhtZnRfcGFnZSk7CisJCQkvKiBHZXQgdGhlICRNRlRNaXJyIHBhZ2UuICovCisJCQltaXJyX3BhZ2UgPSBudGZzX21hcF9wYWdlKHZvbC0+bWZ0bWlycl9pbm8tPmlfbWFwcGluZywKKwkJCQkJaW5kZXgpOworCQkJaWYgKElTX0VSUihtaXJyX3BhZ2UpKSB7CisJCQkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byByZWFkICRNRlRNaXJyLiIpOworCQkJCWdvdG8gbWZ0X3VubWFwX291dDsKKwkJCX0KKwkJCWttaXJyID0gcGFnZV9hZGRyZXNzKG1pcnJfcGFnZSk7CisJCQkrK2luZGV4OworCQl9CisJCS8qIE1ha2Ugc3VyZSB0aGUgcmVjb3JkIGlzIG9rLiAqLworCQlpZiAobnRmc19pc19iYWFkX3JlY29yZHAoKGxlMzIqKWttZnQpKSB7CisJCQludGZzX2Vycm9yKHNiLCAiSW5jb21wbGV0ZSBtdWx0aSBzZWN0b3IgdHJhbnNmZXIgIgorCQkJCQkiZGV0ZWN0ZWQgaW4gbWZ0IHJlY29yZCAlaS4iLCBpKTsKK21tX3VubWFwX291dDoKKwkJCW50ZnNfdW5tYXBfcGFnZShtaXJyX3BhZ2UpOworbWZ0X3VubWFwX291dDoKKwkJCW50ZnNfdW5tYXBfcGFnZShtZnRfcGFnZSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwkJaWYgKG50ZnNfaXNfYmFhZF9yZWNvcmRwKChsZTMyKilrbWlycikpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJJbmNvbXBsZXRlIG11bHRpIHNlY3RvciB0cmFuc2ZlciAiCisJCQkJCSJkZXRlY3RlZCBpbiBtZnQgbWlycm9yIHJlY29yZCAlaS4iLCBpKTsKKwkJCWdvdG8gbW1fdW5tYXBfb3V0OworCQl9CisJCS8qIEdldCB0aGUgYW1vdW50IG9mIGRhdGEgaW4gdGhlIGN1cnJlbnQgcmVjb3JkLiAqLworCQlieXRlcyA9IGxlMzJfdG9fY3B1KCgoTUZUX1JFQ09SRCopa21mdCktPmJ5dGVzX2luX3VzZSk7CisJCWlmICghYnl0ZXMgfHwgYnl0ZXMgPiB2b2wtPm1mdF9yZWNvcmRfc2l6ZSkgeworCQkJYnl0ZXMgPSBsZTMyX3RvX2NwdSgoKE1GVF9SRUNPUkQqKWttaXJyKS0+Ynl0ZXNfaW5fdXNlKTsKKwkJCWlmICghYnl0ZXMgfHwgYnl0ZXMgPiB2b2wtPm1mdF9yZWNvcmRfc2l6ZSkKKwkJCQlieXRlcyA9IHZvbC0+bWZ0X3JlY29yZF9zaXplOworCQl9CisJCS8qIENvbXBhcmUgdGhlIHR3byByZWNvcmRzLiAqLworCQlpZiAobWVtY21wKGttZnQsIGttaXJyLCBieXRlcykpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICIkTUZUIGFuZCAkTUZUTWlyciAocmVjb3JkICVpKSBkbyBub3QgIgorCQkJCQkibWF0Y2guICBSdW4gbnRmc2ZpeCBvciBjaGtkc2suIiwgaSk7CisJCQlnb3RvIG1tX3VubWFwX291dDsKKwkJfQorCQlrbWZ0ICs9IHZvbC0+bWZ0X3JlY29yZF9zaXplOworCQlrbWlyciArPSB2b2wtPm1mdF9yZWNvcmRfc2l6ZTsKKwl9IHdoaWxlICgrK2kgPCB2b2wtPm1mdG1pcnJfc2l6ZSk7CisJLyogUmVsZWFzZSB0aGUgbGFzdCBwYWdlcy4gKi8KKwludGZzX3VubWFwX3BhZ2UobWZ0X3BhZ2UpOworCW50ZnNfdW5tYXBfcGFnZShtaXJyX3BhZ2UpOworCisJLyogQ29uc3RydWN0IHRoZSBtZnQgbWlycm9yIHJ1bmxpc3QgYnkgaGFuZC4gKi8KKwlybDJbMF0udmNuID0gMDsKKwlybDJbMF0ubGNuID0gdm9sLT5tZnRtaXJyX2xjbjsKKwlybDJbMF0ubGVuZ3RoID0gKHZvbC0+bWZ0bWlycl9zaXplICogdm9sLT5tZnRfcmVjb3JkX3NpemUgKworCQkJdm9sLT5jbHVzdGVyX3NpemUgLSAxKSAvIHZvbC0+Y2x1c3Rlcl9zaXplOworCXJsMlsxXS52Y24gPSBybDJbMF0ubGVuZ3RoOworCXJsMlsxXS5sY24gPSBMQ05fRU5PRU5UOworCXJsMlsxXS5sZW5ndGggPSAwOworCS8qCisJICogQmVjYXVzZSB3ZSBoYXZlIGp1c3QgcmVhZCBhbGwgb2YgdGhlIG1mdCBtaXJyb3IsIHdlIGtub3cgd2UgaGF2ZQorCSAqIG1hcHBlZCB0aGUgZnVsbCBydW5saXN0IGZvciBpdC4KKwkgKi8KKwltaXJyX25pID0gTlRGU19JKHZvbC0+bWZ0bWlycl9pbm8pOworCWRvd25fcmVhZCgmbWlycl9uaS0+cnVubGlzdC5sb2NrKTsKKwlybCA9IG1pcnJfbmktPnJ1bmxpc3Qucmw7CisJLyogQ29tcGFyZSB0aGUgdHdvIHJ1bmxpc3RzLiAgVGhleSBtdXN0IGJlIGlkZW50aWNhbC4gKi8KKwlpID0gMDsKKwlkbyB7CisJCWlmIChybDJbaV0udmNuICE9IHJsW2ldLnZjbiB8fCBybDJbaV0ubGNuICE9IHJsW2ldLmxjbiB8fAorCQkJCXJsMltpXS5sZW5ndGggIT0gcmxbaV0ubGVuZ3RoKSB7CisJCQludGZzX2Vycm9yKHNiLCAiJE1GVE1pcnIgbG9jYXRpb24gbWlzbWF0Y2guICAiCisJCQkJCSJSdW4gY2hrZHNrLiIpOworCQkJdXBfcmVhZCgmbWlycl9uaS0+cnVubGlzdC5sb2NrKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0gd2hpbGUgKHJsMltpKytdLmxlbmd0aCk7CisJdXBfcmVhZCgmbWlycl9uaS0+cnVubGlzdC5sb2NrKTsKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiBUUlVFOworfQorCisvKioKKyAqIGxvYWRfYW5kX2NoZWNrX2xvZ2ZpbGUgLSBsb2FkIGFuZCBjaGVjayB0aGUgbG9nZmlsZSBpbm9kZSBmb3IgYSB2b2x1bWUKKyAqIEB2b2w6CW50ZnMgc3VwZXIgYmxvY2sgZGVzY3JpYmluZyBkZXZpY2Ugd2hvc2UgbG9nZmlsZSB0byBsb2FkCisgKgorICogUmV0dXJuIFRSVUUgb24gc3VjY2VzcyBvciBGQUxTRSBvbiBlcnJvci4KKyAqLworc3RhdGljIEJPT0wgbG9hZF9hbmRfY2hlY2tfbG9nZmlsZShudGZzX3ZvbHVtZSAqdm9sKQoreworCXN0cnVjdCBpbm9kZSAqdG1wX2lubzsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCXRtcF9pbm8gPSBudGZzX2lnZXQodm9sLT5zYiwgRklMRV9Mb2dGaWxlKTsKKwlpZiAoSVNfRVJSKHRtcF9pbm8pIHx8IGlzX2JhZF9pbm9kZSh0bXBfaW5vKSkgeworCQlpZiAoIUlTX0VSUih0bXBfaW5vKSkKKwkJCWlwdXQodG1wX2lubyk7CisJCS8qIENhbGxlciB3aWxsIGRpc3BsYXkgZXJyb3IgbWVzc2FnZS4gKi8KKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZiAoIW50ZnNfY2hlY2tfbG9nZmlsZSh0bXBfaW5vKSkgeworCQlpcHV0KHRtcF9pbm8pOworCQkvKiBudGZzX2NoZWNrX2xvZ2ZpbGUoKSB3aWxsIGhhdmUgZGlzcGxheWVkIGVycm9yIG91dHB1dC4gKi8KKwkJcmV0dXJuIEZBTFNFOworCX0KKwl2b2wtPmxvZ2ZpbGVfaW5vID0gdG1wX2lubzsKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiBUUlVFOworfQorCisvKioKKyAqIGxvYWRfYW5kX2luaXRfcXVvdGEgLSBsb2FkIGFuZCBzZXR1cCB0aGUgcXVvdGEgZmlsZSBmb3IgYSB2b2x1bWUgaWYgcHJlc2VudAorICogQHZvbDoJbnRmcyBzdXBlciBibG9jayBkZXNjcmliaW5nIGRldmljZSB3aG9zZSBxdW90YSBmaWxlIHRvIGxvYWQKKyAqCisgKiBSZXR1cm4gVFJVRSBvbiBzdWNjZXNzIG9yIEZBTFNFIG9uIGVycm9yLiAgSWYgJFF1b3RhIGlzIG5vdCBwcmVzZW50LCB3ZQorICogbGVhdmUgdm9sLT5xdW90YV9pbm8gYXMgTlVMTCBhbmQgcmV0dXJuIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBCT09MIGxvYWRfYW5kX2luaXRfcXVvdGEobnRmc192b2x1bWUgKnZvbCkKK3sKKwlNRlRfUkVGIG1yZWY7CisJc3RydWN0IGlub2RlICp0bXBfaW5vOworCW50ZnNfbmFtZSAqbmFtZSA9IE5VTEw7CisJc3RhdGljIGNvbnN0IG50ZnNjaGFyIFF1b3RhWzddID0geyBjb25zdF9jcHVfdG9fbGUxNignJCcpLAorCQkJY29uc3RfY3B1X3RvX2xlMTYoJ1EnKSwgY29uc3RfY3B1X3RvX2xlMTYoJ3UnKSwKKwkJCWNvbnN0X2NwdV90b19sZTE2KCdvJyksIGNvbnN0X2NwdV90b19sZTE2KCd0JyksCisJCQljb25zdF9jcHVfdG9fbGUxNignYScpLCAwIH07CisJc3RhdGljIG50ZnNjaGFyIFFbM10gPSB7IGNvbnN0X2NwdV90b19sZTE2KCckJyksCisJCQljb25zdF9jcHVfdG9fbGUxNignUScpLCAwIH07CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwkvKgorCSAqIEZpbmQgdGhlIGlub2RlIG51bWJlciBmb3IgdGhlIHF1b3RhIGZpbGUgYnkgbG9va2luZyB1cCB0aGUgZmlsZW5hbWUKKwkgKiAkUXVvdGEgaW4gdGhlIGV4dGVuZGVkIHN5c3RlbSBmaWxlcyBkaXJlY3RvcnkgJEV4dGVuZC4KKwkgKi8KKwlkb3duKCZ2b2wtPmV4dGVuZF9pbm8tPmlfc2VtKTsKKwltcmVmID0gbnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZShOVEZTX0kodm9sLT5leHRlbmRfaW5vKSwgUXVvdGEsIDYsCisJCQkmbmFtZSk7CisJdXAoJnZvbC0+ZXh0ZW5kX2luby0+aV9zZW0pOworCWlmIChJU19FUlJfTVJFRihtcmVmKSkgeworCQkvKgorCQkgKiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgcXVvdGFzIGFyZSBkaXNhYmxlZCBhbmQgaGF2ZQorCQkgKiBuZXZlciBiZWVuIGVuYWJsZWQgb24gdGhpcyB2b2x1bWUsIGp1c3QgcmV0dXJuIHN1Y2Nlc3MuCisJCSAqLworCQlpZiAoTVJFRl9FUlIobXJlZikgPT0gLUVOT0VOVCkgeworCQkJbnRmc19kZWJ1ZygiJFF1b3RhIG5vdCBwcmVzZW50LiAgVm9sdW1lIGRvZXMgbm90IGhhdmUgIgorCQkJCQkicXVvdGFzIGVuYWJsZWQuIik7CisJCQkvKgorCQkJICogTm8gbmVlZCB0byB0cnkgdG8gc2V0IHF1b3RhcyBvdXQgb2YgZGF0ZSBpZiB0aGV5IGFyZQorCQkJICogbm90IGVuYWJsZWQuCisJCQkgKi8KKwkJCU5Wb2xTZXRRdW90YU91dE9mRGF0ZSh2b2wpOworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwkJLyogQSByZWFsIGVycm9yIG9jY3VyZWQuICovCisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmaW5kIGlub2RlIG51bWJlciBmb3IgJFF1b3RhLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qIFdlIGRvIG5vdCBjYXJlIGZvciB0aGUgdHlwZSBvZiBtYXRjaCB0aGF0IHdhcyBmb3VuZC4gKi8KKwlpZiAobmFtZSkKKwkJa2ZyZWUobmFtZSk7CisJLyogR2V0IHRoZSBpbm9kZS4gKi8KKwl0bXBfaW5vID0gbnRmc19pZ2V0KHZvbC0+c2IsIE1SRUYobXJlZikpOworCWlmIChJU19FUlIodG1wX2lubykgfHwgaXNfYmFkX2lub2RlKHRtcF9pbm8pKSB7CisJCWlmICghSVNfRVJSKHRtcF9pbm8pKQorCQkJaXB1dCh0bXBfaW5vKTsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGxvYWQgJFF1b3RhLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXZvbC0+cXVvdGFfaW5vID0gdG1wX2lubzsKKwkvKiBHZXQgdGhlICRRIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlLiAqLworCXRtcF9pbm8gPSBudGZzX2luZGV4X2lnZXQodm9sLT5xdW90YV9pbm8sIFEsIDIpOworCWlmIChJU19FUlIodG1wX2lubykpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGxvYWQgJFF1b3RhLyRRIGluZGV4LiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXZvbC0+cXVvdGFfcV9pbm8gPSB0bXBfaW5vOworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogbG9hZF9hbmRfaW5pdF9hdHRyZGVmIC0gbG9hZCB0aGUgYXR0cmlidXRlIGRlZmluaXRpb25zIHRhYmxlIGZvciBhIHZvbHVtZQorICogQHZvbDoJbnRmcyBzdXBlciBibG9jayBkZXNjcmliaW5nIGRldmljZSB3aG9zZSBhdHRyZGVmIHRvIGxvYWQKKyAqCisgKiBSZXR1cm4gVFJVRSBvbiBzdWNjZXNzIG9yIEZBTFNFIG9uIGVycm9yLgorICovCitzdGF0aWMgQk9PTCBsb2FkX2FuZF9pbml0X2F0dHJkZWYobnRmc192b2x1bWUgKnZvbCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gdm9sLT5zYjsKKwlzdHJ1Y3QgaW5vZGUgKmlubzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIGluZGV4LCBtYXhfaW5kZXg7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwkvKiBSZWFkIGF0dHJkZWYgdGFibGUgYW5kIHNldHVwIHZvbC0+YXR0cmRlZiBhbmQgdm9sLT5hdHRyZGVmX3NpemUuICovCisJaW5vID0gbnRmc19pZ2V0KHNiLCBGSUxFX0F0dHJEZWYpOworCWlmIChJU19FUlIoaW5vKSB8fCBpc19iYWRfaW5vZGUoaW5vKSkgeworCQlpZiAoIUlTX0VSUihpbm8pKQorCQkJaXB1dChpbm8pOworCQlnb3RvIGZhaWxlZDsKKwl9CisJLyogVGhlIHNpemUgb2YgRklMRV9BdHRyRGVmIG11c3QgYmUgYWJvdmUgMCBhbmQgZml0IGluc2lkZSAzMSBiaXRzLiAqLworCWlmICghaW5vLT5pX3NpemUgfHwgaW5vLT5pX3NpemUgPiAweDdmZmZmZmZmKQorCQlnb3RvIGlwdXRfZmFpbGVkOworCXZvbC0+YXR0cmRlZiA9IChBVFRSX0RFRiopbnRmc19tYWxsb2Nfbm9mcyhpbm8tPmlfc2l6ZSk7CisJaWYgKCF2b2wtPmF0dHJkZWYpCisJCWdvdG8gaXB1dF9mYWlsZWQ7CisJaW5kZXggPSAwOworCW1heF9pbmRleCA9IGluby0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwl3aGlsZSAoaW5kZXggPCBtYXhfaW5kZXgpIHsKKwkJLyogUmVhZCB0aGUgYXR0cmRlZiB0YWJsZSBhbmQgY29weSBpdCBpbnRvIHRoZSBsaW5lYXIgYnVmZmVyLiAqLworcmVhZF9wYXJ0aWFsX2F0dHJkZWZfcGFnZToKKwkJcGFnZSA9IG50ZnNfbWFwX3BhZ2UoaW5vLT5pX21hcHBpbmcsIGluZGV4KTsKKwkJaWYgKElTX0VSUihwYWdlKSkKKwkJCWdvdG8gZnJlZV9pcHV0X2ZhaWxlZDsKKwkJbWVtY3B5KCh1OCopdm9sLT5hdHRyZGVmICsgKGluZGV4KysgPDwgUEFHRV9DQUNIRV9TSElGVCksCisJCQkJcGFnZV9hZGRyZXNzKHBhZ2UpLCBzaXplKTsKKwkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCX07CisJaWYgKHNpemUgPT0gUEFHRV9DQUNIRV9TSVpFKSB7CisJCXNpemUgPSBpbm8tPmlfc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJCWlmIChzaXplKQorCQkJZ290byByZWFkX3BhcnRpYWxfYXR0cmRlZl9wYWdlOworCX0KKwl2b2wtPmF0dHJkZWZfc2l6ZSA9IGluby0+aV9zaXplOworCW50ZnNfZGVidWcoIlJlYWQgJWxsdSBieXRlcyBmcm9tICRBdHRyRGVmLiIsIGluby0+aV9zaXplKTsKKwlpcHV0KGlubyk7CisJcmV0dXJuIFRSVUU7CitmcmVlX2lwdXRfZmFpbGVkOgorCW50ZnNfZnJlZSh2b2wtPmF0dHJkZWYpOworCXZvbC0+YXR0cmRlZiA9IE5VTEw7CitpcHV0X2ZhaWxlZDoKKwlpcHV0KGlubyk7CitmYWlsZWQ6CisJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBpbml0aWFsaXplIGF0dHJpYnV0ZSBkZWZpbml0aW9uIHRhYmxlLiIpOworCXJldHVybiBGQUxTRTsKK30KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KKworLyoqCisgKiBsb2FkX2FuZF9pbml0X3VwY2FzZSAtIGxvYWQgdGhlIHVwY2FzZSB0YWJsZSBmb3IgYW4gbnRmcyB2b2x1bWUKKyAqIEB2b2w6CW50ZnMgc3VwZXIgYmxvY2sgZGVzY3JpYmluZyBkZXZpY2Ugd2hvc2UgdXBjYXNlIHRvIGxvYWQKKyAqCisgKiBSZXR1cm4gVFJVRSBvbiBzdWNjZXNzIG9yIEZBTFNFIG9uIGVycm9yLgorICovCitzdGF0aWMgQk9PTCBsb2FkX2FuZF9pbml0X3VwY2FzZShudGZzX3ZvbHVtZSAqdm9sKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB2b2wtPnNiOworCXN0cnVjdCBpbm9kZSAqaW5vOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgaW5kZXgsIG1heF9pbmRleDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwlpbnQgaSwgbWF4OworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJLyogUmVhZCB1cGNhc2UgdGFibGUgYW5kIHNldHVwIHZvbC0+dXBjYXNlIGFuZCB2b2wtPnVwY2FzZV9sZW4uICovCisJaW5vID0gbnRmc19pZ2V0KHNiLCBGSUxFX1VwQ2FzZSk7CisJaWYgKElTX0VSUihpbm8pIHx8IGlzX2JhZF9pbm9kZShpbm8pKSB7CisJCWlmICghSVNfRVJSKGlubykpCisJCQlpcHV0KGlubyk7CisJCWdvdG8gdXBjYXNlX2ZhaWxlZDsKKwl9CisJLyoKKwkgKiBUaGUgdXBjYXNlIHNpemUgbXVzdCBub3QgYmUgYWJvdmUgNjRrIFVuaWNvZGUgY2hhcmFjdGVycywgbXVzdCBub3QKKwkgKiBiZSB6ZXJvIGFuZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygc2l6ZW9mKG50ZnNjaGFyKS4KKwkgKi8KKwlpZiAoIWluby0+aV9zaXplIHx8IGluby0+aV9zaXplICYgKHNpemVvZihudGZzY2hhcikgLSAxKSB8fAorCQkJaW5vLT5pX3NpemUgPiA2NFVMTCAqIDEwMjQgKiBzaXplb2YobnRmc2NoYXIpKQorCQlnb3RvIGlwdXRfdXBjYXNlX2ZhaWxlZDsKKwl2b2wtPnVwY2FzZSA9IChudGZzY2hhciopbnRmc19tYWxsb2Nfbm9mcyhpbm8tPmlfc2l6ZSk7CisJaWYgKCF2b2wtPnVwY2FzZSkKKwkJZ290byBpcHV0X3VwY2FzZV9mYWlsZWQ7CisJaW5kZXggPSAwOworCW1heF9pbmRleCA9IGluby0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwl3aGlsZSAoaW5kZXggPCBtYXhfaW5kZXgpIHsKKwkJLyogUmVhZCB0aGUgdXBjYXNlIHRhYmxlIGFuZCBjb3B5IGl0IGludG8gdGhlIGxpbmVhciBidWZmZXIuICovCityZWFkX3BhcnRpYWxfdXBjYXNlX3BhZ2U6CisJCXBhZ2UgPSBudGZzX21hcF9wYWdlKGluby0+aV9tYXBwaW5nLCBpbmRleCk7CisJCWlmIChJU19FUlIocGFnZSkpCisJCQlnb3RvIGlwdXRfdXBjYXNlX2ZhaWxlZDsKKwkJbWVtY3B5KChjaGFyKil2b2wtPnVwY2FzZSArIChpbmRleCsrIDw8IFBBR0VfQ0FDSEVfU0hJRlQpLAorCQkJCXBhZ2VfYWRkcmVzcyhwYWdlKSwgc2l6ZSk7CisJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwl9OworCWlmIChzaXplID09IFBBR0VfQ0FDSEVfU0laRSkgeworCQlzaXplID0gaW5vLT5pX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLOworCQlpZiAoc2l6ZSkKKwkJCWdvdG8gcmVhZF9wYXJ0aWFsX3VwY2FzZV9wYWdlOworCX0KKwl2b2wtPnVwY2FzZV9sZW4gPSBpbm8tPmlfc2l6ZSA+PiBVQ0hBUl9UX1NJWkVfQklUUzsKKwludGZzX2RlYnVnKCJSZWFkICVsbHUgYnl0ZXMgZnJvbSAkVXBDYXNlIChleHBlY3RlZCAlenUgYnl0ZXMpLiIsCisJCQlpbm8tPmlfc2l6ZSwgNjQgKiAxMDI0ICogc2l6ZW9mKG50ZnNjaGFyKSk7CisJaXB1dChpbm8pOworCWRvd24oJm50ZnNfbG9jayk7CisJaWYgKCFkZWZhdWx0X3VwY2FzZSkgeworCQludGZzX2RlYnVnKCJVc2luZyB2b2x1bWUgc3BlY2lmaWVkICRVcENhc2Ugc2luY2UgZGVmYXVsdCBpcyAiCisJCQkJIm5vdCBwcmVzZW50LiIpOworCQl1cCgmbnRmc19sb2NrKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCW1heCA9IGRlZmF1bHRfdXBjYXNlX2xlbjsKKwlpZiAobWF4ID4gdm9sLT51cGNhc2VfbGVuKQorCQltYXggPSB2b2wtPnVwY2FzZV9sZW47CisJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKQorCQlpZiAodm9sLT51cGNhc2VbaV0gIT0gZGVmYXVsdF91cGNhc2VbaV0pCisJCQlicmVhazsKKwlpZiAoaSA9PSBtYXgpIHsKKwkJbnRmc19mcmVlKHZvbC0+dXBjYXNlKTsKKwkJdm9sLT51cGNhc2UgPSBkZWZhdWx0X3VwY2FzZTsKKwkJdm9sLT51cGNhc2VfbGVuID0gbWF4OworCQludGZzX25yX3VwY2FzZV91c2VycysrOworCQl1cCgmbnRmc19sb2NrKTsKKwkJbnRmc19kZWJ1ZygiVm9sdW1lIHNwZWNpZmllZCAkVXBDYXNlIG1hdGNoZXMgZGVmYXVsdC4gVXNpbmcgIgorCQkJCSJkZWZhdWx0LiIpOworCQlyZXR1cm4gVFJVRTsKKwl9CisJdXAoJm50ZnNfbG9jayk7CisJbnRmc19kZWJ1ZygiVXNpbmcgdm9sdW1lIHNwZWNpZmllZCAkVXBDYXNlIHNpbmNlIGl0IGRvZXMgbm90IG1hdGNoICIKKwkJCSJ0aGUgZGVmYXVsdC4iKTsKKwlyZXR1cm4gVFJVRTsKK2lwdXRfdXBjYXNlX2ZhaWxlZDoKKwlpcHV0KGlubyk7CisJbnRmc19mcmVlKHZvbC0+dXBjYXNlKTsKKwl2b2wtPnVwY2FzZSA9IE5VTEw7Cit1cGNhc2VfZmFpbGVkOgorCWRvd24oJm50ZnNfbG9jayk7CisJaWYgKGRlZmF1bHRfdXBjYXNlKSB7CisJCXZvbC0+dXBjYXNlID0gZGVmYXVsdF91cGNhc2U7CisJCXZvbC0+dXBjYXNlX2xlbiA9IGRlZmF1bHRfdXBjYXNlX2xlbjsKKwkJbnRmc19ucl91cGNhc2VfdXNlcnMrKzsKKwkJdXAoJm50ZnNfbG9jayk7CisJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbG9hZCAkVXBDYXNlIGZyb20gdGhlIHZvbHVtZS4gVXNpbmcgIgorCQkJCSJkZWZhdWx0LiIpOworCQlyZXR1cm4gVFJVRTsKKwl9CisJdXAoJm50ZnNfbG9jayk7CisJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBpbml0aWFsaXplIHVwY2FzZSB0YWJsZS4iKTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogbG9hZF9zeXN0ZW1fZmlsZXMgLSBvcGVuIHRoZSBzeXN0ZW0gZmlsZXMgdXNpbmcgbm9ybWFsIGZ1bmN0aW9ucworICogQHZvbDoJbnRmcyBzdXBlciBibG9jayBkZXNjcmliaW5nIGRldmljZSB3aG9zZSBzeXN0ZW0gZmlsZXMgdG8gbG9hZAorICoKKyAqIE9wZW4gdGhlIHN5c3RlbSBmaWxlcyB3aXRoIG5vcm1hbCBhY2Nlc3MgZnVuY3Rpb25zIGFuZCBjb21wbGV0ZSBzZXR0aW5nIHVwCisgKiB0aGUgbnRmcyBzdXBlciBibG9jayBAdm9sLgorICoKKyAqIFJldHVybiBUUlVFIG9uIHN1Y2Nlc3Mgb3IgRkFMU0Ugb24gZXJyb3IuCisgKi8KK3N0YXRpYyBCT09MIGxvYWRfc3lzdGVtX2ZpbGVzKG50ZnNfdm9sdW1lICp2b2wpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHZvbC0+c2I7CisJTUZUX1JFQ09SRCAqbTsKKwlWT0xVTUVfSU5GT1JNQVRJT04gKnZpOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKyNpZmRlZiBOVEZTX1JXCisJLyogR2V0IG1mdCBtaXJyb3IgaW5vZGUgY29tcGFyZSB0aGUgY29udGVudHMgb2YgJE1GVCBhbmQgJE1GVE1pcnIuICovCisJaWYgKCFsb2FkX2FuZF9pbml0X21mdF9taXJyb3Iodm9sKSB8fCAhY2hlY2tfbWZ0X21pcnJvcih2b2wpKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczEgPSAiRmFpbGVkIHRvIGxvYWQgJE1GVE1pcnIiOworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMyID0gIiRNRlRNaXJyIGRvZXMgbm90IG1hdGNoICRNRlQiOworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMzID0gIi4gIFJ1biBudGZzZml4IGFuZC9vciBjaGtkc2suIjsKKworCQkvKiBJZiBhIHJlYWQtd3JpdGUgbW91bnQsIGNvbnZlcnQgaXQgdG8gYSByZWFkLW9ubHkgbW91bnQuICovCisJCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJaWYgKCEodm9sLT5vbl9lcnJvcnMgJiAoT05fRVJST1JTX1JFTU9VTlRfUk8gfAorCQkJCQlPTl9FUlJPUlNfQ09OVElOVUUpKSkgeworCQkJCW50ZnNfZXJyb3Ioc2IsICIlcyBhbmQgbmVpdGhlciBvbl9lcnJvcnM9IgorCQkJCQkJImNvbnRpbnVlIG5vciBvbl9lcnJvcnM9IgorCQkJCQkJInJlbW91bnQtcm8gd2FzIHNwZWNpZmllZCVzIiwKKwkJCQkJCSF2b2wtPm1mdG1pcnJfaW5vID8gZXMxIDogZXMyLAorCQkJCQkJZXMzKTsKKwkJCQlnb3RvIGlwdXRfbWlycl9lcnJfb3V0OworCQkJfQorCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CisJCQludGZzX2Vycm9yKHNiLCAiJXMuICBNb3VudGluZyByZWFkLW9ubHklcyIsCisJCQkJCSF2b2wtPm1mdG1pcnJfaW5vID8gZXMxIDogZXMyLCBlczMpOworCQl9IGVsc2UKKwkJCW50ZnNfd2FybmluZyhzYiwgIiVzLiAgV2lsbCBub3QgYmUgYWJsZSB0byByZW1vdW50ICIKKwkJCQkJInJlYWQtd3JpdGUlcyIsCisJCQkJCSF2b2wtPm1mdG1pcnJfaW5vID8gZXMxIDogZXMyLCBlczMpOworCQkvKiBUaGlzIHdpbGwgcHJldmVudCBhIHJlYWQtd3JpdGUgcmVtb3VudC4gKi8KKwkJTlZvbFNldEVycm9ycyh2b2wpOworCX0KKyNlbmRpZiAvKiBOVEZTX1JXICovCisJLyogR2V0IG1mdCBiaXRtYXAgYXR0cmlidXRlIGlub2RlLiAqLworCXZvbC0+bWZ0Ym1wX2lubyA9IG50ZnNfYXR0cl9pZ2V0KHZvbC0+bWZ0X2lubywgQVRfQklUTUFQLCBOVUxMLCAwKTsKKwlpZiAoSVNfRVJSKHZvbC0+bWZ0Ym1wX2lubykpIHsKKwkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBsb2FkICRNRlQvJEJJVE1BUCBhdHRyaWJ1dGUuIik7CisJCWdvdG8gaXB1dF9taXJyX2Vycl9vdXQ7CisJfQorCS8qIFJlYWQgdXBjYXNlIHRhYmxlIGFuZCBzZXR1cCBAdm9sLT51cGNhc2UgYW5kIEB2b2wtPnVwY2FzZV9sZW4uICovCisJaWYgKCFsb2FkX2FuZF9pbml0X3VwY2FzZSh2b2wpKQorCQlnb3RvIGlwdXRfbWZ0Ym1wX2Vycl9vdXQ7CisjaWZkZWYgTlRGU19SVworCS8qCisJICogUmVhZCBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMgdGFibGUgYW5kIHNldHVwIEB2b2wtPmF0dHJkZWYgYW5kCisJICogQHZvbC0+YXR0cmRlZl9zaXplLgorCSAqLworCWlmICghbG9hZF9hbmRfaW5pdF9hdHRyZGVmKHZvbCkpCisJCWdvdG8gaXB1dF91cGNhc2VfZXJyX291dDsKKyNlbmRpZiAvKiBOVEZTX1JXICovCisJLyoKKwkgKiBHZXQgdGhlIGNsdXN0ZXIgYWxsb2NhdGlvbiBiaXRtYXAgaW5vZGUgYW5kIHZlcmlmeSB0aGUgc2l6ZSwgbm8KKwkgKiBuZWVkIGZvciBhbnkgbG9ja2luZyBhdCB0aGlzIHN0YWdlIGFzIHdlIGFyZSBhbHJlYWR5IHJ1bm5pbmcKKwkgKiBleGNsdXNpdmVseSBhcyB3ZSBhcmUgbW91bnQgaW4gcHJvZ3Jlc3MgdGFzay4KKwkgKi8KKwl2b2wtPmxjbmJtcF9pbm8gPSBudGZzX2lnZXQoc2IsIEZJTEVfQml0bWFwKTsKKwlpZiAoSVNfRVJSKHZvbC0+bGNuYm1wX2lubykgfHwgaXNfYmFkX2lub2RlKHZvbC0+bGNuYm1wX2lubykpIHsKKwkJaWYgKCFJU19FUlIodm9sLT5sY25ibXBfaW5vKSkKKwkJCWlwdXQodm9sLT5sY25ibXBfaW5vKTsKKwkJZ290byBiaXRtYXBfZmFpbGVkOworCX0KKwlpZiAoKHZvbC0+bnJfY2x1c3RlcnMgKyA3KSA+PiAzID4gdm9sLT5sY25ibXBfaW5vLT5pX3NpemUpIHsKKwkJaXB1dCh2b2wtPmxjbmJtcF9pbm8pOworYml0bWFwX2ZhaWxlZDoKKwkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBsb2FkICRCaXRtYXAuIik7CisJCWdvdG8gaXB1dF9hdHRyZGVmX2Vycl9vdXQ7CisJfQorCS8qCisJICogR2V0IHRoZSB2b2x1bWUgaW5vZGUgYW5kIHNldHVwIG91ciBjYWNoZSBvZiB0aGUgdm9sdW1lIGZsYWdzIGFuZAorCSAqIHZlcnNpb24uCisJICovCisJdm9sLT52b2xfaW5vID0gbnRmc19pZ2V0KHNiLCBGSUxFX1ZvbHVtZSk7CisJaWYgKElTX0VSUih2b2wtPnZvbF9pbm8pIHx8IGlzX2JhZF9pbm9kZSh2b2wtPnZvbF9pbm8pKSB7CisJCWlmICghSVNfRVJSKHZvbC0+dm9sX2lubykpCisJCQlpcHV0KHZvbC0+dm9sX2lubyk7Cit2b2x1bWVfZmFpbGVkOgorCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGxvYWQgJFZvbHVtZS4iKTsKKwkJZ290byBpcHV0X2xjbmJtcF9lcnJfb3V0OworCX0KKwltID0gbWFwX21mdF9yZWNvcmQoTlRGU19JKHZvbC0+dm9sX2lubykpOworCWlmIChJU19FUlIobSkpIHsKK2lwdXRfdm9sdW1lX2ZhaWxlZDoKKwkJaXB1dCh2b2wtPnZvbF9pbm8pOworCQlnb3RvIHZvbHVtZV9mYWlsZWQ7CisJfQorCWlmICghKGN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChOVEZTX0kodm9sLT52b2xfaW5vKSwgbSkpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gZ2V0IGF0dHJpYnV0ZSBzZWFyY2ggY29udGV4dC4iKTsKKwkJZ290byBnZXRfY3R4X3ZvbF9mYWlsZWQ7CisJfQorCWlmIChudGZzX2F0dHJfbG9va3VwKEFUX1ZPTFVNRV9JTkZPUk1BVElPTiwgTlVMTCwgMCwgMCwgMCwgTlVMTCwgMCwKKwkJCWN0eCkgfHwgY3R4LT5hdHRyLT5ub25fcmVzaWRlbnQgfHwgY3R4LT5hdHRyLT5mbGFncykgeworZXJyX3B1dF92b2w6CisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworZ2V0X2N0eF92b2xfZmFpbGVkOgorCQl1bm1hcF9tZnRfcmVjb3JkKE5URlNfSSh2b2wtPnZvbF9pbm8pKTsKKwkJZ290byBpcHV0X3ZvbHVtZV9mYWlsZWQ7CisJfQorCXZpID0gKFZPTFVNRV9JTkZPUk1BVElPTiopKChjaGFyKiljdHgtPmF0dHIgKworCQkJbGUxNl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpOworCS8qIFNvbWUgYm91bmRzIGNoZWNrcy4gKi8KKwlpZiAoKHU4Kil2aSA8ICh1OCopY3R4LT5hdHRyIHx8ICh1OCopdmkgKworCQkJbGUzMl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCkgPgorCQkJKHU4KiljdHgtPmF0dHIgKyBsZTMyX3RvX2NwdShjdHgtPmF0dHItPmxlbmd0aCkpCisJCWdvdG8gZXJyX3B1dF92b2w7CisJLyogQ29weSB0aGUgdm9sdW1lIGZsYWdzIGFuZCB2ZXJzaW9uIHRvIHRoZSBudGZzX3ZvbHVtZSBzdHJ1Y3R1cmUuICovCisJdm9sLT52b2xfZmxhZ3MgPSB2aS0+ZmxhZ3M7CisJdm9sLT5tYWpvcl92ZXIgPSB2aS0+bWFqb3JfdmVyOworCXZvbC0+bWlub3JfdmVyID0gdmktPm1pbm9yX3ZlcjsKKwludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwl1bm1hcF9tZnRfcmVjb3JkKE5URlNfSSh2b2wtPnZvbF9pbm8pKTsKKwlwcmludGsoS0VSTl9JTkZPICJOVEZTIHZvbHVtZSB2ZXJzaW9uICVpLiVpLlxuIiwgdm9sLT5tYWpvcl92ZXIsCisJCQl2b2wtPm1pbm9yX3Zlcik7CisjaWZkZWYgTlRGU19SVworCS8qIE1ha2Ugc3VyZSB0aGF0IG5vIHVuc3VwcG9ydGVkIHZvbHVtZSBmbGFncyBhcmUgc2V0LiAqLworCWlmICh2b2wtPnZvbF9mbGFncyAmIFZPTFVNRV9NVVNUX01PVU5UX1JPX01BU0spIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMWEgPSAiVm9sdW1lIGlzIGRpcnR5IjsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMWIgPSAiVm9sdW1lIGhhcyB1bnN1cHBvcnRlZCBmbGFncyBzZXQiOworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMyID0gIi4gIFJ1biBjaGtkc2sgYW5kIG1vdW50IGluIFdpbmRvd3MuIjsKKwkJY29uc3QgY2hhciAqZXMxOworCQkKKwkJZXMxID0gdm9sLT52b2xfZmxhZ3MgJiBWT0xVTUVfSVNfRElSVFkgPyBlczFhIDogZXMxYjsKKwkJLyogSWYgYSByZWFkLXdyaXRlIG1vdW50LCBjb252ZXJ0IGl0IHRvIGEgcmVhZC1vbmx5IG1vdW50LiAqLworCQlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJCWlmICghKHZvbC0+b25fZXJyb3JzICYgKE9OX0VSUk9SU19SRU1PVU5UX1JPIHwKKwkJCQkJT05fRVJST1JTX0NPTlRJTlVFKSkpIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiJXMgYW5kIG5laXRoZXIgb25fZXJyb3JzPSIKKwkJCQkJCSJjb250aW51ZSBub3Igb25fZXJyb3JzPSIKKwkJCQkJCSJyZW1vdW50LXJvIHdhcyBzcGVjaWZpZWQlcyIsCisJCQkJCQllczEsIGVzMik7CisJCQkJZ290byBpcHV0X3ZvbF9lcnJfb3V0OworCQkJfQorCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CisJCQludGZzX2Vycm9yKHNiLCAiJXMuICBNb3VudGluZyByZWFkLW9ubHklcyIsIGVzMSwgZXMyKTsKKwkJfSBlbHNlCisJCQludGZzX3dhcm5pbmcoc2IsICIlcy4gIFdpbGwgbm90IGJlIGFibGUgdG8gcmVtb3VudCAiCisJCQkJCSJyZWFkLXdyaXRlJXMiLCBlczEsIGVzMik7CisJCS8qCisJCSAqIERvIG5vdCBzZXQgTlZvbEVycm9ycygpIGJlY2F1c2UgbnRmc19yZW1vdW50KCkgcmUtY2hlY2tzIHRoZQorCQkgKiBmbGFncyB3aGljaCB3ZSBuZWVkIHRvIGRvIGluIGNhc2UgYW55IGZsYWdzIGhhdmUgY2hhbmdlZC4KKwkJICovCisJfQorCS8qCisJICogR2V0IHRoZSBpbm9kZSBmb3IgdGhlIGxvZ2ZpbGUsIGNoZWNrIGl0IGFuZCBkZXRlcm1pbmUgaWYgdGhlIHZvbHVtZQorCSAqIHdhcyBzaHV0ZG93biBjbGVhbmx5LgorCSAqLworCWlmICghbG9hZF9hbmRfY2hlY2tfbG9nZmlsZSh2b2wpIHx8CisJCQkhbnRmc19pc19sb2dmaWxlX2NsZWFuKHZvbC0+bG9nZmlsZV9pbm8pKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczFhID0gIkZhaWxlZCB0byBsb2FkICRMb2dGaWxlIjsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMWIgPSAiJExvZ0ZpbGUgaXMgbm90IGNsZWFuIjsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMiA9ICIuICBNb3VudCBpbiBXaW5kb3dzLiI7CisJCWNvbnN0IGNoYXIgKmVzMTsKKworCQllczEgPSAhdm9sLT5sb2dmaWxlX2lubyA/IGVzMWEgOiBlczFiOworCQkvKiBJZiBhIHJlYWQtd3JpdGUgbW91bnQsIGNvbnZlcnQgaXQgdG8gYSByZWFkLW9ubHkgbW91bnQuICovCisJCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJaWYgKCEodm9sLT5vbl9lcnJvcnMgJiAoT05fRVJST1JTX1JFTU9VTlRfUk8gfAorCQkJCQlPTl9FUlJPUlNfQ09OVElOVUUpKSkgeworCQkJCW50ZnNfZXJyb3Ioc2IsICIlcyBhbmQgbmVpdGhlciBvbl9lcnJvcnM9IgorCQkJCQkJImNvbnRpbnVlIG5vciBvbl9lcnJvcnM9IgorCQkJCQkJInJlbW91bnQtcm8gd2FzIHNwZWNpZmllZCVzIiwKKwkJCQkJCWVzMSwgZXMyKTsKKwkJCQlnb3RvIGlwdXRfbG9nZmlsZV9lcnJfb3V0OworCQkJfQorCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CisJCQludGZzX2Vycm9yKHNiLCAiJXMuICBNb3VudGluZyByZWFkLW9ubHklcyIsIGVzMSwgZXMyKTsKKwkJfSBlbHNlCisJCQludGZzX3dhcm5pbmcoc2IsICIlcy4gIFdpbGwgbm90IGJlIGFibGUgdG8gcmVtb3VudCAiCisJCQkJCSJyZWFkLXdyaXRlJXMiLCBlczEsIGVzMik7CisJCS8qIFRoaXMgd2lsbCBwcmV2ZW50IGEgcmVhZC13cml0ZSByZW1vdW50LiAqLworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQorCS8qIElmIChzdGlsbCkgYSByZWFkLXdyaXRlIG1vdW50LCBtYXJrIHRoZSB2b2x1bWUgZGlydHkuICovCisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpICYmCisJCQludGZzX3NldF92b2x1bWVfZmxhZ3Modm9sLCBWT0xVTUVfSVNfRElSVFkpKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczEgPSAiRmFpbGVkIHRvIHNldCBkaXJ0eSBiaXQgaW4gdm9sdW1lICIKKwkJCQkiaW5mb3JtYXRpb24gZmxhZ3MiOworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMyID0gIi4gIFJ1biBjaGtkc2suIjsKKworCQkvKiBDb252ZXJ0IHRvIGEgcmVhZC1vbmx5IG1vdW50LiAqLworCQlpZiAoISh2b2wtPm9uX2Vycm9ycyAmIChPTl9FUlJPUlNfUkVNT1VOVF9STyB8CisJCQkJT05fRVJST1JTX0NPTlRJTlVFKSkpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICIlcyBhbmQgbmVpdGhlciBvbl9lcnJvcnM9Y29udGludWUgbm9yICIKKwkJCQkJIm9uX2Vycm9ycz1yZW1vdW50LXJvIHdhcyBzcGVjaWZpZWQlcyIsCisJCQkJCWVzMSwgZXMyKTsKKwkJCWdvdG8gaXB1dF9sb2dmaWxlX2Vycl9vdXQ7CisJCX0KKwkJbnRmc19lcnJvcihzYiwgIiVzLiAgTW91bnRpbmcgcmVhZC1vbmx5JXMiLCBlczEsIGVzMik7CisJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWSB8IE1TX05PQVRJTUUgfCBNU19OT0RJUkFUSU1FOworCQkvKgorCQkgKiBEbyBub3Qgc2V0IE5Wb2xFcnJvcnMoKSBiZWNhdXNlIG50ZnNfcmVtb3VudCgpIG1pZ2h0IG1hbmFnZQorCQkgKiB0byBzZXQgdGhlIGRpcnR5IGZsYWcgaW4gd2hpY2ggY2FzZSBhbGwgd291bGQgYmUgd2VsbC4KKwkJICovCisJfQorI2lmIDAKKwkvLyBUT0RPOiBFbmFibGUgdGhpcyBjb2RlIG9uY2Ugd2Ugc3RhcnQgbW9kaWZ5aW5nIGFueXRoaW5nIHRoYXQgaXMKKwkvLwkgZGlmZmVyZW50IGJldHdlZW4gTlRGUyAxLjIgYW5kIDMueC4uLgorCS8qCisJICogSWYgKHN0aWxsKSBhIHJlYWQtd3JpdGUgbW91bnQsIHNldCB0aGUgTlQ0IGNvbXBhdGliaWxpdHkgZmxhZyBvbgorCSAqIG5ld2VyIE5URlMgdmVyc2lvbiB2b2x1bWVzLgorCSAqLworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJiAodm9sLT5tYWpvcl92ZXIgPiAxKSAmJgorCQkJbnRmc19zZXRfdm9sdW1lX2ZsYWdzKHZvbCwgVk9MVU1FX01PVU5URURfT05fTlQ0KSkgeworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMxID0gIkZhaWxlZCB0byBzZXQgTlQ0IGNvbXBhdGliaWxpdHkgZmxhZyI7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczIgPSAiLiAgUnVuIGNoa2Rzay4iOworCisJCS8qIENvbnZlcnQgdG8gYSByZWFkLW9ubHkgbW91bnQuICovCisJCWlmICghKHZvbC0+b25fZXJyb3JzICYgKE9OX0VSUk9SU19SRU1PVU5UX1JPIHwKKwkJCQlPTl9FUlJPUlNfQ09OVElOVUUpKSkgeworCQkJbnRmc19lcnJvcihzYiwgIiVzIGFuZCBuZWl0aGVyIG9uX2Vycm9ycz1jb250aW51ZSBub3IgIgorCQkJCQkib25fZXJyb3JzPXJlbW91bnQtcm8gd2FzIHNwZWNpZmllZCVzIiwKKwkJCQkJZXMxLCBlczIpOworCQkJZ290byBpcHV0X2xvZ2ZpbGVfZXJyX291dDsKKwkJfQorCQludGZzX2Vycm9yKHNiLCAiJXMuICBNb3VudGluZyByZWFkLW9ubHklcyIsIGVzMSwgZXMyKTsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwl9CisjZW5kaWYKKwkvKiBJZiAoc3RpbGwpIGEgcmVhZC13cml0ZSBtb3VudCwgZW1wdHkgdGhlIGxvZ2ZpbGUuICovCisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpICYmCisJCQkhbnRmc19lbXB0eV9sb2dmaWxlKHZvbC0+bG9nZmlsZV9pbm8pKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczEgPSAiRmFpbGVkIHRvIGVtcHR5ICRMb2dGaWxlIjsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMiA9ICIuICBNb3VudCBpbiBXaW5kb3dzLiI7CisKKwkJLyogQ29udmVydCB0byBhIHJlYWQtb25seSBtb3VudC4gKi8KKwkJaWYgKCEodm9sLT5vbl9lcnJvcnMgJiAoT05fRVJST1JTX1JFTU9VTlRfUk8gfAorCQkJCU9OX0VSUk9SU19DT05USU5VRSkpKSB7CisJCQludGZzX2Vycm9yKHNiLCAiJXMgYW5kIG5laXRoZXIgb25fZXJyb3JzPWNvbnRpbnVlIG5vciAiCisJCQkJCSJvbl9lcnJvcnM9cmVtb3VudC1ybyB3YXMgc3BlY2lmaWVkJXMiLAorCQkJCQllczEsIGVzMik7CisJCQlnb3RvIGlwdXRfbG9nZmlsZV9lcnJfb3V0OworCQl9CisJCW50ZnNfZXJyb3Ioc2IsICIlcy4gIE1vdW50aW5nIHJlYWQtb25seSVzIiwgZXMxLCBlczIpOworCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCX0KKyNlbmRpZiAvKiBOVEZTX1JXICovCisJLyogR2V0IHRoZSByb290IGRpcmVjdG9yeSBpbm9kZS4gKi8KKwl2b2wtPnJvb3RfaW5vID0gbnRmc19pZ2V0KHNiLCBGSUxFX3Jvb3QpOworCWlmIChJU19FUlIodm9sLT5yb290X2lubykgfHwgaXNfYmFkX2lub2RlKHZvbC0+cm9vdF9pbm8pKSB7CisJCWlmICghSVNfRVJSKHZvbC0+cm9vdF9pbm8pKQorCQkJaXB1dCh2b2wtPnJvb3RfaW5vKTsKKwkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBsb2FkIHJvb3QgZGlyZWN0b3J5LiIpOworCQlnb3RvIGlwdXRfbG9nZmlsZV9lcnJfb3V0OworCX0KKwkvKiBJZiBvbiBOVEZTIHZlcnNpb25zIGJlZm9yZSAzLjAsIHdlIGFyZSBkb25lLiAqLworCWlmICh2b2wtPm1ham9yX3ZlciA8IDMpCisJCXJldHVybiBUUlVFOworCS8qIE5URlMgMy4wKyBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4gKi8KKwkvKiBHZXQgdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3JzIGlub2RlLiAqLworCXZvbC0+c2VjdXJlX2lubyA9IG50ZnNfaWdldChzYiwgRklMRV9TZWN1cmUpOworCWlmIChJU19FUlIodm9sLT5zZWN1cmVfaW5vKSB8fCBpc19iYWRfaW5vZGUodm9sLT5zZWN1cmVfaW5vKSkgeworCQlpZiAoIUlTX0VSUih2b2wtPnNlY3VyZV9pbm8pKQorCQkJaXB1dCh2b2wtPnNlY3VyZV9pbm8pOworCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGxvYWQgJFNlY3VyZS4iKTsKKwkJZ290byBpcHV0X3Jvb3RfZXJyX291dDsKKwl9CisJLy8gRklYTUU6IEluaXRpYWxpemUgc2VjdXJpdHkuCisJLyogR2V0IHRoZSBleHRlbmRlZCBzeXN0ZW0gZmlsZXMnIGRpcmVjdG9yeSBpbm9kZS4gKi8KKwl2b2wtPmV4dGVuZF9pbm8gPSBudGZzX2lnZXQoc2IsIEZJTEVfRXh0ZW5kKTsKKwlpZiAoSVNfRVJSKHZvbC0+ZXh0ZW5kX2lubykgfHwgaXNfYmFkX2lub2RlKHZvbC0+ZXh0ZW5kX2lubykpIHsKKwkJaWYgKCFJU19FUlIodm9sLT5leHRlbmRfaW5vKSkKKwkJCWlwdXQodm9sLT5leHRlbmRfaW5vKTsKKwkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBsb2FkICRFeHRlbmQuIik7CisJCWdvdG8gaXB1dF9zZWNfZXJyX291dDsKKwl9CisjaWZkZWYgTlRGU19SVworCS8qIEZpbmQgdGhlIHF1b3RhIGZpbGUsIGxvYWQgaXQgaWYgcHJlc2VudCwgYW5kIHNldCBpdCB1cC4gKi8KKwlpZiAoIWxvYWRfYW5kX2luaXRfcXVvdGEodm9sKSkgeworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMxID0gIkZhaWxlZCB0byBsb2FkICRRdW90YSI7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczIgPSAiLiAgUnVuIGNoa2Rzay4iOworCisJCS8qIElmIGEgcmVhZC13cml0ZSBtb3VudCwgY29udmVydCBpdCB0byBhIHJlYWQtb25seSBtb3VudC4gKi8KKwkJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCQlpZiAoISh2b2wtPm9uX2Vycm9ycyAmIChPTl9FUlJPUlNfUkVNT1VOVF9STyB8CisJCQkJCU9OX0VSUk9SU19DT05USU5VRSkpKSB7CisJCQkJbnRmc19lcnJvcihzYiwgIiVzIGFuZCBuZWl0aGVyIG9uX2Vycm9ycz0iCisJCQkJCQkiY29udGludWUgbm9yIG9uX2Vycm9ycz0iCisJCQkJCQkicmVtb3VudC1ybyB3YXMgc3BlY2lmaWVkJXMiLAorCQkJCQkJZXMxLCBlczIpOworCQkJCWdvdG8gaXB1dF9xdW90YV9lcnJfb3V0OworCQkJfQorCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CisJCQludGZzX2Vycm9yKHNiLCAiJXMuICBNb3VudGluZyByZWFkLW9ubHklcyIsIGVzMSwgZXMyKTsKKwkJfSBlbHNlCisJCQludGZzX3dhcm5pbmcoc2IsICIlcy4gIFdpbGwgbm90IGJlIGFibGUgdG8gcmVtb3VudCAiCisJCQkJCSJyZWFkLXdyaXRlJXMiLCBlczEsIGVzMik7CisJCS8qIFRoaXMgd2lsbCBwcmV2ZW50IGEgcmVhZC13cml0ZSByZW1vdW50LiAqLworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQorCS8qIElmIChzdGlsbCkgYSByZWFkLXdyaXRlIG1vdW50LCBtYXJrIHRoZSBxdW90YXMgb3V0IG9mIGRhdGUuICovCisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpICYmCisJCQkhbnRmc19tYXJrX3F1b3Rhc19vdXRfb2ZfZGF0ZSh2b2wpKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczEgPSAiRmFpbGVkIHRvIG1hcmsgcXVvdGFzIG91dCBvZiBkYXRlIjsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMiA9ICIuICBSdW4gY2hrZHNrLiI7CisKKwkJLyogQ29udmVydCB0byBhIHJlYWQtb25seSBtb3VudC4gKi8KKwkJaWYgKCEodm9sLT5vbl9lcnJvcnMgJiAoT05fRVJST1JTX1JFTU9VTlRfUk8gfAorCQkJCU9OX0VSUk9SU19DT05USU5VRSkpKSB7CisJCQludGZzX2Vycm9yKHNiLCAiJXMgYW5kIG5laXRoZXIgb25fZXJyb3JzPWNvbnRpbnVlIG5vciAiCisJCQkJCSJvbl9lcnJvcnM9cmVtb3VudC1ybyB3YXMgc3BlY2lmaWVkJXMiLAorCQkJCQllczEsIGVzMik7CisJCQlnb3RvIGlwdXRfcXVvdGFfZXJyX291dDsKKwkJfQorCQludGZzX2Vycm9yKHNiLCAiJXMuICBNb3VudGluZyByZWFkLW9ubHklcyIsIGVzMSwgZXMyKTsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwl9CisJLy8gVE9ETzogRGVsZXRlIG9yIGNoZWNrcG9pbnQgdGhlICRVc25Kcm5sIGlmIGl0IGV4aXN0cy4KKyNlbmRpZiAvKiBOVEZTX1JXICovCisJcmV0dXJuIFRSVUU7CisjaWZkZWYgTlRGU19SVworaXB1dF9xdW90YV9lcnJfb3V0OgorCWlmICh2b2wtPnF1b3RhX3FfaW5vKQorCQlpcHV0KHZvbC0+cXVvdGFfcV9pbm8pOworCWlmICh2b2wtPnF1b3RhX2lubykKKwkJaXB1dCh2b2wtPnF1b3RhX2lubyk7CisJaXB1dCh2b2wtPmV4dGVuZF9pbm8pOworI2VuZGlmIC8qIE5URlNfUlcgKi8KK2lwdXRfc2VjX2Vycl9vdXQ6CisJaXB1dCh2b2wtPnNlY3VyZV9pbm8pOworaXB1dF9yb290X2Vycl9vdXQ6CisJaXB1dCh2b2wtPnJvb3RfaW5vKTsKK2lwdXRfbG9nZmlsZV9lcnJfb3V0OgorI2lmZGVmIE5URlNfUlcKKwlpZiAodm9sLT5sb2dmaWxlX2lubykKKwkJaXB1dCh2b2wtPmxvZ2ZpbGVfaW5vKTsKK2lwdXRfdm9sX2Vycl9vdXQ6CisjZW5kaWYgLyogTlRGU19SVyAqLworCWlwdXQodm9sLT52b2xfaW5vKTsKK2lwdXRfbGNuYm1wX2Vycl9vdXQ6CisJaXB1dCh2b2wtPmxjbmJtcF9pbm8pOworaXB1dF9hdHRyZGVmX2Vycl9vdXQ6CisJdm9sLT5hdHRyZGVmX3NpemUgPSAwOworCWlmICh2b2wtPmF0dHJkZWYpIHsKKwkJbnRmc19mcmVlKHZvbC0+YXR0cmRlZik7CisJCXZvbC0+YXR0cmRlZiA9IE5VTEw7CisJfQorI2lmZGVmIE5URlNfUlcKK2lwdXRfdXBjYXNlX2Vycl9vdXQ6CisjZW5kaWYgLyogTlRGU19SVyAqLworCXZvbC0+dXBjYXNlX2xlbiA9IDA7CisJZG93bigmbnRmc19sb2NrKTsKKwlpZiAodm9sLT51cGNhc2UgPT0gZGVmYXVsdF91cGNhc2UpIHsKKwkJbnRmc19ucl91cGNhc2VfdXNlcnMtLTsKKwkJdm9sLT51cGNhc2UgPSBOVUxMOworCX0KKwl1cCgmbnRmc19sb2NrKTsKKwlpZiAodm9sLT51cGNhc2UpIHsKKwkJbnRmc19mcmVlKHZvbC0+dXBjYXNlKTsKKwkJdm9sLT51cGNhc2UgPSBOVUxMOworCX0KK2lwdXRfbWZ0Ym1wX2Vycl9vdXQ6CisJaXB1dCh2b2wtPm1mdGJtcF9pbm8pOworaXB1dF9taXJyX2Vycl9vdXQ6CisjaWZkZWYgTlRGU19SVworCWlmICh2b2wtPm1mdG1pcnJfaW5vKQorCQlpcHV0KHZvbC0+bWZ0bWlycl9pbm8pOworI2VuZGlmIC8qIE5URlNfUlcgKi8KKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogbnRmc19wdXRfc3VwZXIgLSBjYWxsZWQgYnkgdGhlIHZmcyB0byB1bm1vdW50IGEgdm9sdW1lCisgKiBAc2I6CQl2ZnMgc3VwZXJibG9jayBvZiB2b2x1bWUgdG8gdW5tb3VudAorICoKKyAqIG50ZnNfcHV0X3N1cGVyKCkgaXMgY2FsbGVkIGJ5IHRoZSBWRlMgKGZyb20gZnMvc3VwZXIuYzo6ZG9fdW1vdW50KCkpIHdoZW4KKyAqIHRoZSB2b2x1bWUgaXMgYmVpbmcgdW5tb3VudGVkICh1bW91bnQgc3lzdGVtIGNhbGwgaGFzIGJlZW4gaW52b2tlZCkgYW5kIGl0CisgKiByZWxlYXNlcyBhbGwgaW5vZGVzIGFuZCBtZW1vcnkgYmVsb25naW5nIHRvIHRoZSBOVEZTIHNwZWNpZmljIHBhcnQgb2YgdGhlCisgKiBzdXBlciBibG9jay4KKyAqLworc3RhdGljIHZvaWQgbnRmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwludGZzX3ZvbHVtZSAqdm9sID0gTlRGU19TQihzYik7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKyNpZmRlZiBOVEZTX1JXCisJLyoKKwkgKiBDb21taXQgYWxsIGlub2RlcyB3aGlsZSB0aGV5IGFyZSBzdGlsbCBvcGVuIGluIGNhc2Ugc29tZSBvZiB0aGVtCisJICogY2F1c2Ugb3RoZXJzIHRvIGJlIGRpcnRpZWQuCisJICovCisJbnRmc19jb21taXRfaW5vZGUodm9sLT52b2xfaW5vKTsKKworCS8qIE5URlMgMy4wKyBzcGVjaWZpYy4gKi8KKwlpZiAodm9sLT5tYWpvcl92ZXIgPj0gMykgeworCQlpZiAodm9sLT5xdW90YV9xX2lubykKKwkJCW50ZnNfY29tbWl0X2lub2RlKHZvbC0+cXVvdGFfcV9pbm8pOworCQlpZiAodm9sLT5xdW90YV9pbm8pCisJCQludGZzX2NvbW1pdF9pbm9kZSh2b2wtPnF1b3RhX2lubyk7CisJCWlmICh2b2wtPmV4dGVuZF9pbm8pCisJCQludGZzX2NvbW1pdF9pbm9kZSh2b2wtPmV4dGVuZF9pbm8pOworCQlpZiAodm9sLT5zZWN1cmVfaW5vKQorCQkJbnRmc19jb21taXRfaW5vZGUodm9sLT5zZWN1cmVfaW5vKTsKKwl9CisKKwludGZzX2NvbW1pdF9pbm9kZSh2b2wtPnJvb3RfaW5vKTsKKworCWRvd25fd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOworCW50ZnNfY29tbWl0X2lub2RlKHZvbC0+bGNuYm1wX2lubyk7CisJdXBfd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOworCisJZG93bl93cml0ZSgmdm9sLT5tZnRibXBfbG9jayk7CisJbnRmc19jb21taXRfaW5vZGUodm9sLT5tZnRibXBfaW5vKTsKKwl1cF93cml0ZSgmdm9sLT5tZnRibXBfbG9jayk7CisKKwlpZiAodm9sLT5sb2dmaWxlX2lubykKKwkJbnRmc19jb21taXRfaW5vZGUodm9sLT5sb2dmaWxlX2lubyk7CisKKwlpZiAodm9sLT5tZnRtaXJyX2lubykKKwkJbnRmc19jb21taXRfaW5vZGUodm9sLT5tZnRtaXJyX2lubyk7CisJbnRmc19jb21taXRfaW5vZGUodm9sLT5tZnRfaW5vKTsKKworCS8qCisJICogSWYgYSByZWFkLXdyaXRlIG1vdW50IGFuZCBubyB2b2x1bWUgZXJyb3JzIGhhdmUgb2NjdXJlZCwgbWFyayB0aGUKKwkgKiB2b2x1bWUgY2xlYW4uICBBbHNvLCByZS1jb21taXQgYWxsIGFmZmVjdGVkIGlub2Rlcy4KKwkgKi8KKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJaWYgKCFOVm9sRXJyb3JzKHZvbCkpIHsKKwkJCWlmIChudGZzX2NsZWFyX3ZvbHVtZV9mbGFncyh2b2wsIFZPTFVNRV9JU19ESVJUWSkpCisJCQkJbnRmc193YXJuaW5nKHNiLCAiRmFpbGVkIHRvIGNsZWFyIGRpcnR5IGJpdCAiCisJCQkJCQkiaW4gdm9sdW1lIGluZm9ybWF0aW9uICIKKwkJCQkJCSJmbGFncy4gIFJ1biBjaGtkc2suIik7CisJCQludGZzX2NvbW1pdF9pbm9kZSh2b2wtPnZvbF9pbm8pOworCQkJbnRmc19jb21taXRfaW5vZGUodm9sLT5yb290X2lubyk7CisJCQlpZiAodm9sLT5tZnRtaXJyX2lubykKKwkJCQludGZzX2NvbW1pdF9pbm9kZSh2b2wtPm1mdG1pcnJfaW5vKTsKKwkJCW50ZnNfY29tbWl0X2lub2RlKHZvbC0+bWZ0X2lubyk7CisJCX0gZWxzZSB7CisJCQludGZzX3dhcm5pbmcoc2IsICJWb2x1bWUgaGFzIGVycm9ycy4gIExlYXZpbmcgdm9sdW1lICIKKwkJCQkJIm1hcmtlZCBkaXJ0eS4gIFJ1biBjaGtkc2suIik7CisJCX0KKwl9CisjZW5kaWYgLyogTlRGU19SVyAqLworCisJaXB1dCh2b2wtPnZvbF9pbm8pOworCXZvbC0+dm9sX2lubyA9IE5VTEw7CisKKwkvKiBOVEZTIDMuMCsgc3BlY2lmaWMgY2xlYW4gdXAuICovCisJaWYgKHZvbC0+bWFqb3JfdmVyID49IDMpIHsKKyNpZmRlZiBOVEZTX1JXCisJCWlmICh2b2wtPnF1b3RhX3FfaW5vKSB7CisJCQlpcHV0KHZvbC0+cXVvdGFfcV9pbm8pOworCQkJdm9sLT5xdW90YV9xX2lubyA9IE5VTEw7CisJCX0KKwkJaWYgKHZvbC0+cXVvdGFfaW5vKSB7CisJCQlpcHV0KHZvbC0+cXVvdGFfaW5vKTsKKwkJCXZvbC0+cXVvdGFfaW5vID0gTlVMTDsKKwkJfQorI2VuZGlmIC8qIE5URlNfUlcgKi8KKwkJaWYgKHZvbC0+ZXh0ZW5kX2lubykgeworCQkJaXB1dCh2b2wtPmV4dGVuZF9pbm8pOworCQkJdm9sLT5leHRlbmRfaW5vID0gTlVMTDsKKwkJfQorCQlpZiAodm9sLT5zZWN1cmVfaW5vKSB7CisJCQlpcHV0KHZvbC0+c2VjdXJlX2lubyk7CisJCQl2b2wtPnNlY3VyZV9pbm8gPSBOVUxMOworCQl9CisJfQorCisJaXB1dCh2b2wtPnJvb3RfaW5vKTsKKwl2b2wtPnJvb3RfaW5vID0gTlVMTDsKKworCWRvd25fd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOworCWlwdXQodm9sLT5sY25ibXBfaW5vKTsKKwl2b2wtPmxjbmJtcF9pbm8gPSBOVUxMOworCXVwX3dyaXRlKCZ2b2wtPmxjbmJtcF9sb2NrKTsKKworCWRvd25fd3JpdGUoJnZvbC0+bWZ0Ym1wX2xvY2spOworCWlwdXQodm9sLT5tZnRibXBfaW5vKTsKKwl2b2wtPm1mdGJtcF9pbm8gPSBOVUxMOworCXVwX3dyaXRlKCZ2b2wtPm1mdGJtcF9sb2NrKTsKKworI2lmZGVmIE5URlNfUlcKKwlpZiAodm9sLT5sb2dmaWxlX2lubykgeworCQlpcHV0KHZvbC0+bG9nZmlsZV9pbm8pOworCQl2b2wtPmxvZ2ZpbGVfaW5vID0gTlVMTDsKKwl9CisJaWYgKHZvbC0+bWZ0bWlycl9pbm8pIHsKKwkJLyogUmUtY29tbWl0IHRoZSBtZnQgbWlycm9yIGFuZCBtZnQganVzdCBpbiBjYXNlLiAqLworCQludGZzX2NvbW1pdF9pbm9kZSh2b2wtPm1mdG1pcnJfaW5vKTsKKwkJbnRmc19jb21taXRfaW5vZGUodm9sLT5tZnRfaW5vKTsKKwkJaXB1dCh2b2wtPm1mdG1pcnJfaW5vKTsKKwkJdm9sLT5tZnRtaXJyX2lubyA9IE5VTEw7CisJfQorCS8qCisJICogSWYgYW55IGRpcnR5IGlub2RlcyBhcmUgbGVmdCwgdGhyb3cgYXdheSBhbGwgbWZ0IGRhdGEgcGFnZSBjYWNoZQorCSAqIHBhZ2VzIHRvIGFsbG93IGEgY2xlYW4gdW1vdW50LiAgVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGFueSBtb3JlCisJICogZHVlIHRvIG1mdC5jOjpudGZzX21mdF93cml0ZXBhZ2UoKSBjbGVhbmluZyBhbGwgdGhlIGRpcnR5IHBhZ2VzIGFzCisJICogdGhlIHVuZGVybHlpbmcgbWZ0IHJlY29yZHMgYXJlIHdyaXR0ZW4gb3V0IGFuZCBjbGVhbmVkLiAgSWYgaXQgZG9lcywKKwkgKiBoYXBwZW4gYW55d2F5LCB3ZSB3YW50IHRvIGtub3cuLi4KKwkgKi8KKwludGZzX2NvbW1pdF9pbm9kZSh2b2wtPm1mdF9pbm8pOworCXdyaXRlX2lub2RlX25vdyh2b2wtPm1mdF9pbm8sIDEpOworCWlmICghbGlzdF9lbXB0eSgmc2ItPnNfZGlydHkpKSB7CisJCWNvbnN0IGNoYXIgKnMxLCAqczI7CisKKwkJZG93bigmdm9sLT5tZnRfaW5vLT5pX3NlbSk7CisJCXRydW5jYXRlX2lub2RlX3BhZ2VzKHZvbC0+bWZ0X2luby0+aV9tYXBwaW5nLCAwKTsKKwkJdXAoJnZvbC0+bWZ0X2luby0+aV9zZW0pOworCQl3cml0ZV9pbm9kZV9ub3codm9sLT5tZnRfaW5vLCAxKTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZzYi0+c19kaXJ0eSkpIHsKKwkJCXN0YXRpYyBjb25zdCBjaGFyICpfczEgPSAiaW5vZGVzIjsKKwkJCXN0YXRpYyBjb25zdCBjaGFyICpfczIgPSAiIjsKKwkJCXMxID0gX3MxOworCQkJczIgPSBfczI7CisJCX0gZWxzZSB7CisJCQlzdGF0aWMgY29uc3QgY2hhciAqX3MxID0gIm1mdCBwYWdlcyI7CisJCQlzdGF0aWMgY29uc3QgY2hhciAqX3MyID0gIlRoZXkgaGF2ZSBiZWVuIHRocm93biAiCisJCQkJCSJhd2F5LiAgIjsKKwkJCXMxID0gX3MxOworCQkJczIgPSBfczI7CisJCX0KKwkJbnRmc19lcnJvcihzYiwgIkRpcnR5ICVzIGZvdW5kIGF0IHVtb3VudCB0aW1lLiAgJXNZb3Ugc2hvdWxkICIKKwkJCQkicnVuIGNoa2Rzay4gIFBsZWFzZSBlbWFpbCAiCisJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLnNvdXJjZWZvcmdlLm5ldCBhbmQgc2F5ICIKKwkJCQkidGhhdCB5b3Ugc2F3IHRoaXMgbWVzc2FnZS4gIFRoYW5rIHlvdS4iLCBzMSwKKwkJCQlzMik7CisJfQorI2VuZGlmIC8qIE5URlNfUlcgKi8KKworCWlwdXQodm9sLT5tZnRfaW5vKTsKKwl2b2wtPm1mdF9pbm8gPSBOVUxMOworCisJLyogVGhyb3cgYXdheSB0aGUgdGFibGUgb2YgYXR0cmlidXRlIGRlZmluaXRpb25zLiAqLworCXZvbC0+YXR0cmRlZl9zaXplID0gMDsKKwlpZiAodm9sLT5hdHRyZGVmKSB7CisJCW50ZnNfZnJlZSh2b2wtPmF0dHJkZWYpOworCQl2b2wtPmF0dHJkZWYgPSBOVUxMOworCX0KKwl2b2wtPnVwY2FzZV9sZW4gPSAwOworCS8qCisJICogRGVzdHJveSB0aGUgZ2xvYmFsIGRlZmF1bHQgdXBjYXNlIHRhYmxlIGlmIG5lY2Vzc2FyeS4gIEFsc28gZGVjcmVhc2UKKwkgKiB0aGUgbnVtYmVyIG9mIHVwY2FzZSB1c2VycyBpZiB3ZSBhcmUgYSB1c2VyLgorCSAqLworCWRvd24oJm50ZnNfbG9jayk7CisJaWYgKHZvbC0+dXBjYXNlID09IGRlZmF1bHRfdXBjYXNlKSB7CisJCW50ZnNfbnJfdXBjYXNlX3VzZXJzLS07CisJCXZvbC0+dXBjYXNlID0gTlVMTDsKKwl9CisJaWYgKCFudGZzX25yX3VwY2FzZV91c2VycyAmJiBkZWZhdWx0X3VwY2FzZSkgeworCQludGZzX2ZyZWUoZGVmYXVsdF91cGNhc2UpOworCQlkZWZhdWx0X3VwY2FzZSA9IE5VTEw7CisJfQorCWlmICh2b2wtPmNsdXN0ZXJfc2l6ZSA8PSA0MDk2ICYmICEtLW50ZnNfbnJfY29tcHJlc3Npb25fdXNlcnMpCisJCWZyZWVfY29tcHJlc3Npb25fYnVmZmVycygpOworCXVwKCZudGZzX2xvY2spOworCWlmICh2b2wtPnVwY2FzZSkgeworCQludGZzX2ZyZWUodm9sLT51cGNhc2UpOworCQl2b2wtPnVwY2FzZSA9IE5VTEw7CisJfQorCWlmICh2b2wtPm5sc19tYXApIHsKKwkJdW5sb2FkX25scyh2b2wtPm5sc19tYXApOworCQl2b2wtPm5sc19tYXAgPSBOVUxMOworCX0KKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlrZnJlZSh2b2wpOworCXJldHVybjsKK30KKworLyoqCisgKiBnZXRfbnJfZnJlZV9jbHVzdGVycyAtIHJldHVybiB0aGUgbnVtYmVyIG9mIGZyZWUgY2x1c3RlcnMgb24gYSB2b2x1bWUKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIGZvciB3aGljaCB0byBvYnRhaW4gZnJlZSBjbHVzdGVyIGNvdW50CisgKgorICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZnJlZSBjbHVzdGVycyBvbiB0aGUgbW91bnRlZCBOVEZTIHZvbHVtZSBAdm9sLiBXZQorICogYWN0dWFsbHkgY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgY2x1c3RlcnMgaW4gdXNlIGluc3RlYWQgYmVjYXVzZSB0aGlzCisgKiBhbGxvd3MgdXMgdG8gbm90IGNhcmUgYWJvdXQgcGFydGlhbCBwYWdlcyBhcyB0aGVzZSB3aWxsIGJlIGp1c3QgemVybyBmaWxsZWQKKyAqIGFuZCBoZW5jZSBub3QgYmUgY291bnRlZCBhcyBhbGxvY2F0ZWQgY2x1c3RlcnMuCisgKgorICogVGhlIG9ubHkgcGFydGljdWxhcml0eSBpcyB0aGF0IGNsdXN0ZXJzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBsb2dpY2FsIG50ZnMKKyAqIHZvbHVtZSB3aWxsIGJlIG1hcmtlZCBhcyBhbGxvY2F0ZWQgdG8gcHJldmVudCBlcnJvcnMgd2hpY2ggbWVhbnMgd2UgaGF2ZSB0bworICogZGlzY291bnQgdGhvc2UgYXQgdGhlIGVuZC4gVGhpcyBpcyBpbXBvcnRhbnQgYXMgdGhlIGNsdXN0ZXIgYml0bWFwIGFsd2F5cworICogaGFzIGEgc2l6ZSBpbiBtdWx0aXBsZXMgb2YgOCBieXRlcywgaS5lLiB1cCB0byA2MyBjbHVzdGVycyBjb3VsZCBiZSBvdXRzaWRlCisgKiB0aGUgbG9naWNhbCB2b2x1bWUgYW5kIG1hcmtlZCBpbiB1c2Ugd2hlbiB0aGV5IGFyZSBub3QgYXMgdGhleSBkbyBub3QgZXhpc3QuCisgKgorICogSWYgYW55IHBhZ2VzIGNhbm5vdCBiZSByZWFkIHdlIGFzc3VtZSBhbGwgY2x1c3RlcnMgaW4gdGhlIGVycm9yaW5nIHBhZ2VzIGFyZQorICogaW4gdXNlLiBUaGlzIG1lYW5zIHdlIHJldHVybiBhbiB1bmRlcmVzdGltYXRlIG9uIGVycm9ycyB3aGljaCBpcyBiZXR0ZXIgdGhhbgorICogYW4gb3ZlcmVzdGltYXRlLgorICovCitzdGF0aWMgczY0IGdldF9ucl9mcmVlX2NsdXN0ZXJzKG50ZnNfdm9sdW1lICp2b2wpCit7CisJczY0IG5yX2ZyZWUgPSB2b2wtPm5yX2NsdXN0ZXJzOworCXUzMiAqa2FkZHI7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSB2b2wtPmxjbmJtcF9pbm8tPmlfbWFwcGluZzsKKwlmaWxsZXJfdCAqcmVhZHBhZ2UgPSAoZmlsbGVyX3QqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIGluZGV4LCBtYXhfaW5kZXg7CisJdW5zaWduZWQgaW50IG1heF9zaXplOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJLyogU2VyaWFsaXplIGFjY2Vzc2VzIHRvIHRoZSBjbHVzdGVyIGJpdG1hcC4gKi8KKwlkb3duX3JlYWQoJnZvbC0+bGNuYm1wX2xvY2spOworCS8qCisJICogQ29udmVydCB0aGUgbnVtYmVyIG9mIGJpdHMgaW50byBieXRlcyByb3VuZGVkIHVwLCB0aGVuIGNvbnZlcnQgaW50bworCSAqIG11bHRpcGxlcyBvZiBQQUdFX0NBQ0hFX1NJWkUsIHJvdW5kaW5nIHVwIHNvIHRoYXQgaWYgd2UgaGF2ZSBvbmUKKwkgKiBmdWxsIGFuZCBvbmUgcGFydGlhbCBwYWdlIG1heF9pbmRleCA9IDIuCisJICovCisJbWF4X2luZGV4ID0gKCgodm9sLT5ucl9jbHVzdGVycyArIDcpID4+IDMpICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4KKwkJCVBBR0VfQ0FDSEVfU0hJRlQ7CisJLyogVXNlIG11bHRpcGxlcyBvZiA0IGJ5dGVzLiAqLworCW1heF9zaXplID0gUEFHRV9DQUNIRV9TSVpFID4+IDI7CisJbnRmc19kZWJ1ZygiUmVhZGluZyAkQml0bWFwLCBtYXhfaW5kZXggPSAweCVseCwgbWF4X3NpemUgPSAweCV4LiIsCisJCQltYXhfaW5kZXgsIG1heF9zaXplKTsKKwlmb3IgKGluZGV4ID0gMFVMOyBpbmRleCA8IG1heF9pbmRleDsgaW5kZXgrKykgeworCQl1bnNpZ25lZCBpbnQgaTsKKwkJLyoKKwkJICogUmVhZCB0aGUgcGFnZSBmcm9tIHBhZ2UgY2FjaGUsIGdldHRpbmcgaXQgZnJvbSBiYWNraW5nIHN0b3JlCisJCSAqIGlmIG5lY2Vzc2FyeSwgYW5kIGluY3JlbWVudCB0aGUgdXNlIGNvdW50LgorCQkgKi8KKwkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCwgKGZpbGxlcl90KilyZWFkcGFnZSwKKwkJCQlOVUxMKTsKKwkJLyogSWdub3JlIHBhZ2VzIHdoaWNoIGVycm9yZWQgc3luY2hyb25vdXNseS4gKi8KKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJbnRmc19kZWJ1ZygiU3luYyByZWFkX2NhY2hlX3BhZ2UoKSBlcnJvci4gU2tpcHBpbmcgIgorCQkJCQkicGFnZSAoaW5kZXggMHglbHgpLiIsIGluZGV4KTsKKwkJCW5yX2ZyZWUgLT0gUEFHRV9DQUNIRV9TSVpFICogODsKKwkJCWNvbnRpbnVlOworCQl9CisJCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7CisJCS8qIElnbm9yZSBwYWdlcyB3aGljaCBlcnJvcmVkIGFzeW5jaHJvbm91c2x5LiAqLworCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQkJbnRmc19kZWJ1ZygiQXN5bmMgcmVhZF9jYWNoZV9wYWdlKCkgZXJyb3IuIFNraXBwaW5nICIKKwkJCQkJInBhZ2UgKGluZGV4IDB4JWx4KS4iLCBpbmRleCk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQlucl9mcmVlIC09IFBBR0VfQ0FDSEVfU0laRSAqIDg7CisJCQljb250aW51ZTsKKwkJfQorCQlrYWRkciA9ICh1MzIqKWttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJLyoKKwkJICogRm9yIGVhY2ggNCBieXRlcywgc3VidHJhY3QgdGhlIG51bWJlciBvZiBzZXQgYml0cy4gSWYgdGhpcworCQkgKiBpcyB0aGUgbGFzdCBwYWdlIGFuZCBpdCBpcyBwYXJ0aWFsIHdlIGRvbid0IHJlYWxseSBjYXJlIGFzCisJCSAqIGl0IGp1c3QgbWVhbnMgd2UgZG8gYSBsaXR0bGUgZXh0cmEgd29yayBidXQgaXQgd29uJ3QgYWZmZWN0CisJCSAqIHRoZSByZXN1bHQgYXMgYWxsIG91dCBvZiByYW5nZSBieXRlcyBhcmUgc2V0IHRvIHplcm8gYnkKKwkJICogbnRmc19yZWFkcGFnZSgpLgorCQkgKi8KKwkgIAlmb3IgKGkgPSAwOyBpIDwgbWF4X3NpemU7IGkrKykKKwkJCW5yX2ZyZWUgLT0gKHM2NClod2VpZ2h0MzIoa2FkZHJbaV0pOworCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CisJbnRmc19kZWJ1ZygiRmluaXNoZWQgcmVhZGluZyAkQml0bWFwLCBsYXN0IGluZGV4ID0gMHglbHguIiwgaW5kZXggLSAxKTsKKwkvKgorCSAqIEZpeHVwIGZvciBldmVudHVhbCBiaXRzIG91dHNpZGUgbG9naWNhbCBudGZzIHZvbHVtZSAoc2VlIGZ1bmN0aW9uCisJICogZGVzY3JpcHRpb24gYWJvdmUpLgorCSAqLworCWlmICh2b2wtPm5yX2NsdXN0ZXJzICYgNjMpCisJCW5yX2ZyZWUgKz0gNjQgLSAodm9sLT5ucl9jbHVzdGVycyAmIDYzKTsKKwl1cF9yZWFkKCZ2b2wtPmxjbmJtcF9sb2NrKTsKKwkvKiBJZiBlcnJvcnMgb2NjdXJlZCB3ZSBtYXkgd2VsbCBoYXZlIGdvbmUgYmVsb3cgemVybywgZml4IHRoaXMuICovCisJaWYgKG5yX2ZyZWUgPCAwKQorCQlucl9mcmVlID0gMDsKKwludGZzX2RlYnVnKCJFeGl0aW5nLiIpOworCXJldHVybiBucl9mcmVlOworfQorCisvKioKKyAqIF9fZ2V0X25yX2ZyZWVfbWZ0X3JlY29yZHMgLSByZXR1cm4gdGhlIG51bWJlciBvZiBmcmVlIGlub2RlcyBvbiBhIHZvbHVtZQorICogQHZvbDoJbnRmcyB2b2x1bWUgZm9yIHdoaWNoIHRvIG9idGFpbiBmcmVlIGlub2RlIGNvdW50CisgKgorICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZnJlZSBtZnQgcmVjb3JkcyAoaW5vZGVzKSBvbiB0aGUgbW91bnRlZCBOVEZTCisgKiB2b2x1bWUgQHZvbC4gV2UgYWN0dWFsbHkgY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgbWZ0IHJlY29yZHMgaW4gdXNlIGluc3RlYWQKKyAqIGJlY2F1c2UgdGhpcyBhbGxvd3MgdXMgdG8gbm90IGNhcmUgYWJvdXQgcGFydGlhbCBwYWdlcyBhcyB0aGVzZSB3aWxsIGJlIGp1c3QKKyAqIHplcm8gZmlsbGVkIGFuZCBoZW5jZSBub3QgYmUgY291bnRlZCBhcyBhbGxvY2F0ZWQgbWZ0IHJlY29yZC4KKyAqCisgKiBJZiBhbnkgcGFnZXMgY2Fubm90IGJlIHJlYWQgd2UgYXNzdW1lIGFsbCBtZnQgcmVjb3JkcyBpbiB0aGUgZXJyb3JpbmcgcGFnZXMKKyAqIGFyZSBpbiB1c2UuIFRoaXMgbWVhbnMgd2UgcmV0dXJuIGFuIHVuZGVyZXN0aW1hdGUgb24gZXJyb3JzIHdoaWNoIGlzIGJldHRlcgorICogdGhhbiBhbiBvdmVyZXN0aW1hdGUuCisgKgorICogTk9URTogQ2FsbGVyIG11c3QgaG9sZCBtZnRibXBfbG9jayByd19zZW1hcGhvcmUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19nZXRfbnJfZnJlZV9tZnRfcmVjb3JkcyhudGZzX3ZvbHVtZSAqdm9sKQoreworCXM2NCBucl9mcmVlOworCXUzMiAqa2FkZHI7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSB2b2wtPm1mdGJtcF9pbm8tPmlfbWFwcGluZzsKKwlmaWxsZXJfdCAqcmVhZHBhZ2UgPSAoZmlsbGVyX3QqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIGluZGV4LCBtYXhfaW5kZXg7CisJdW5zaWduZWQgaW50IG1heF9zaXplOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJLyogTnVtYmVyIG9mIG1mdCByZWNvcmRzIGluIGZpbGUgc3lzdGVtIChhdCB0aGlzIHBvaW50IGluIHRpbWUpLiAqLworCW5yX2ZyZWUgPSB2b2wtPm1mdF9pbm8tPmlfc2l6ZSA+PiB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzOworCS8qCisJICogQ29udmVydCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2V0IGJpdHMgaW50byBieXRlcyByb3VuZGVkIHVwLCB0aGVuCisJICogY29udmVydCBpbnRvIG11bHRpcGxlcyBvZiBQQUdFX0NBQ0hFX1NJWkUsIHJvdW5kaW5nIHVwIHNvIHRoYXQgaWYgd2UKKwkgKiBoYXZlIG9uZSBmdWxsIGFuZCBvbmUgcGFydGlhbCBwYWdlIG1heF9pbmRleCA9IDIuCisJICovCisJbWF4X2luZGV4ID0gKCgoKE5URlNfSSh2b2wtPm1mdF9pbm8pLT5pbml0aWFsaXplZF9zaXplID4+CisJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzKSArIDcpID4+IDMpICsKKwkJCVBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJLyogVXNlIG11bHRpcGxlcyBvZiA0IGJ5dGVzLiAqLworCW1heF9zaXplID0gUEFHRV9DQUNIRV9TSVpFID4+IDI7CisJbnRmc19kZWJ1ZygiUmVhZGluZyAkTUZULyRCSVRNQVAsIG1heF9pbmRleCA9IDB4JWx4LCBtYXhfc2l6ZSA9ICIKKwkJCSIweCV4LiIsIG1heF9pbmRleCwgbWF4X3NpemUpOworCWZvciAoaW5kZXggPSAwVUw7IGluZGV4IDwgbWF4X2luZGV4OyBpbmRleCsrKSB7CisJCXVuc2lnbmVkIGludCBpOworCQkvKgorCQkgKiBSZWFkIHRoZSBwYWdlIGZyb20gcGFnZSBjYWNoZSwgZ2V0dGluZyBpdCBmcm9tIGJhY2tpbmcgc3RvcmUKKwkJICogaWYgbmVjZXNzYXJ5LCBhbmQgaW5jcmVtZW50IHRoZSB1c2UgY291bnQuCisJCSAqLworCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4LCAoZmlsbGVyX3QqKXJlYWRwYWdlLAorCQkJCU5VTEwpOworCQkvKiBJZ25vcmUgcGFnZXMgd2hpY2ggZXJyb3JlZCBzeW5jaHJvbm91c2x5LiAqLworCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCQludGZzX2RlYnVnKCJTeW5jIHJlYWRfY2FjaGVfcGFnZSgpIGVycm9yLiBTa2lwcGluZyAiCisJCQkJCSJwYWdlIChpbmRleCAweCVseCkuIiwgaW5kZXgpOworCQkJbnJfZnJlZSAtPSBQQUdFX0NBQ0hFX1NJWkUgKiA4OworCQkJY29udGludWU7CisJCX0KKwkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKwkJLyogSWdub3JlIHBhZ2VzIHdoaWNoIGVycm9yZWQgYXN5bmNocm9ub3VzbHkuICovCisJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQludGZzX2RlYnVnKCJBc3luYyByZWFkX2NhY2hlX3BhZ2UoKSBlcnJvci4gU2tpcHBpbmcgIgorCQkJCQkicGFnZSAoaW5kZXggMHglbHgpLiIsIGluZGV4KTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCW5yX2ZyZWUgLT0gUEFHRV9DQUNIRV9TSVpFICogODsKKwkJCWNvbnRpbnVlOworCQl9CisJCWthZGRyID0gKHUzMiopa21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQkvKgorCQkgKiBGb3IgZWFjaCA0IGJ5dGVzLCBzdWJ0cmFjdCB0aGUgbnVtYmVyIG9mIHNldCBiaXRzLiBJZiB0aGlzCisJCSAqIGlzIHRoZSBsYXN0IHBhZ2UgYW5kIGl0IGlzIHBhcnRpYWwgd2UgZG9uJ3QgcmVhbGx5IGNhcmUgYXMKKwkJICogaXQganVzdCBtZWFucyB3ZSBkbyBhIGxpdHRsZSBleHRyYSB3b3JrIGJ1dCBpdCB3b24ndCBhZmZlY3QKKwkJICogdGhlIHJlc3VsdCBhcyBhbGwgb3V0IG9mIHJhbmdlIGJ5dGVzIGFyZSBzZXQgdG8gemVybyBieQorCQkgKiBudGZzX3JlYWRwYWdlKCkuCisJCSAqLworCSAgCWZvciAoaSA9IDA7IGkgPCBtYXhfc2l6ZTsgaSsrKQorCQkJbnJfZnJlZSAtPSAoczY0KWh3ZWlnaHQzMihrYWRkcltpXSk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KKwludGZzX2RlYnVnKCJGaW5pc2hlZCByZWFkaW5nICRNRlQvJEJJVE1BUCwgbGFzdCBpbmRleCA9IDB4JWx4LiIsCisJCQlpbmRleCAtIDEpOworCS8qIElmIGVycm9ycyBvY2N1cmVkIHdlIG1heSB3ZWxsIGhhdmUgZ29uZSBiZWxvdyB6ZXJvLCBmaXggdGhpcy4gKi8KKwlpZiAobnJfZnJlZSA8IDApCisJCW5yX2ZyZWUgPSAwOworCW50ZnNfZGVidWcoIkV4aXRpbmcuIik7CisJcmV0dXJuIG5yX2ZyZWU7Cit9CisKKy8qKgorICogbnRmc19zdGF0ZnMgLSByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgbW91bnRlZCBOVEZTIHZvbHVtZQorICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgbW91bnRlZCB2b2x1bWUKKyAqIEBzZnM6CXN0YXRmcyBzdHJ1Y3R1cmUgaW4gd2hpY2ggdG8gcmV0dXJuIHRoZSBpbmZvcm1hdGlvbgorICoKKyAqIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbW91bnRlZCBOVEZTIHZvbHVtZSBAc2IgaW4gdGhlIHN0YXRmcyBzdHJ1Y3R1cmUKKyAqIHBvaW50ZWQgdG8gYnkgQHNmcyAodGhpcyBpcyBpbml0aWFsaXplZCB3aXRoIHplcm9zIGJlZm9yZSBudGZzX3N0YXRmcyBpcworICogY2FsbGVkKS4gV2UgaW50ZXJwcmV0IHRoZSB2YWx1ZXMgdG8gYmUgY29ycmVjdCBvZiB0aGUgbW9tZW50IGluIHRpbWUgYXQKKyAqIHdoaWNoIHdlIGFyZSBjYWxsZWQuIE1vc3QgdmFsdWVzIGFyZSB2YXJpYWJsZSBvdGhlcndpc2UgYW5kIHRoaXMgaXNuJ3QganVzdAorICogdGhlIGZyZWUgdmFsdWVzIGJ1dCB0aGUgdG90YWxzIGFzIHdlbGwuIEZvciBleGFtcGxlIHdlIGNhbiBpbmNyZWFzZSB0aGUKKyAqIHRvdGFsIG51bWJlciBvZiBmaWxlIG5vZGVzIGlmIHdlIHJ1biBvdXQgYW5kIHdlIGNhbiBrZWVwIGRvaW5nIHRoaXMgdW50aWwKKyAqIHRoZXJlIGlzIG5vIG1vcmUgc3BhY2Ugb24gdGhlIHZvbHVtZSBsZWZ0IGF0IGFsbC4KKyAqCisgKiBDYWxsZWQgZnJvbSB2ZnNfc3RhdGZzIHdoaWNoIGlzIHVzZWQgdG8gaGFuZGxlIHRoZSBzdGF0ZnMsIGZzdGF0ZnMsIGFuZAorICogdXN0YXQgc3lzdGVtIGNhbGxzLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgLWVycm5vIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50IG50ZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpzZnMpCit7CisJbnRmc192b2x1bWUgKnZvbCA9IE5URlNfU0Ioc2IpOworCXM2NCBzaXplOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJLyogVHlwZSBvZiBmaWxlc3lzdGVtLiAqLworCXNmcy0+Zl90eXBlICAgPSBOVEZTX1NCX01BR0lDOworCS8qIE9wdGltYWwgdHJhbnNmZXIgYmxvY2sgc2l6ZS4gKi8KKwlzZnMtPmZfYnNpemUgID0gUEFHRV9DQUNIRV9TSVpFOworCS8qCisJICogVG90YWwgZGF0YSBibG9ja3MgaW4gZmlsZSBzeXN0ZW0gaW4gdW5pdHMgb2YgZl9ic2l6ZSBhbmQgc2luY2UKKwkgKiBpbm9kZXMgYXJlIGFsc28gc3RvcmVkIGluIGRhdGEgYmxvY3MgKCRNRlQgaXMgYSBmaWxlKSB0aGlzIGlzIGp1c3QKKwkgKiB0aGUgdG90YWwgY2x1c3RlcnMuCisJICovCisJc2ZzLT5mX2Jsb2NrcyA9IHZvbC0+bnJfY2x1c3RlcnMgPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cyA+PgorCQkJCVBBR0VfQ0FDSEVfU0hJRlQ7CisJLyogRnJlZSBkYXRhIGJsb2NrcyBpbiBmaWxlIHN5c3RlbSBpbiB1bml0cyBvZiBmX2JzaXplLiAqLworCXNpemUJICAgICAgPSBnZXRfbnJfZnJlZV9jbHVzdGVycyh2b2wpIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMgPj4KKwkJCQlQQUdFX0NBQ0hFX1NISUZUOworCWlmIChzaXplIDwgMExMKQorCQlzaXplID0gMExMOworCS8qIEZyZWUgYmxvY2tzIGF2YWlsIHRvIG5vbi1zdXBlcnVzZXIsIHNhbWUgYXMgYWJvdmUgb24gTlRGUy4gKi8KKwlzZnMtPmZfYmF2YWlsID0gc2ZzLT5mX2JmcmVlID0gc2l6ZTsKKwkvKiBTZXJpYWxpemUgYWNjZXNzZXMgdG8gdGhlIGlub2RlIGJpdG1hcC4gKi8KKwlkb3duX3JlYWQoJnZvbC0+bWZ0Ym1wX2xvY2spOworCS8qIE51bWJlciBvZiBpbm9kZXMgaW4gZmlsZSBzeXN0ZW0gKGF0IHRoaXMgcG9pbnQgaW4gdGltZSkuICovCisJc2ZzLT5mX2ZpbGVzID0gdm9sLT5tZnRfaW5vLT5pX3NpemUgPj4gdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0czsKKwkvKiBGcmVlIGlub2RlcyBpbiBmcyAoYmFzZWQgb24gY3VycmVudCB0b3RhbCBjb3VudCkuICovCisJc2ZzLT5mX2ZmcmVlID0gX19nZXRfbnJfZnJlZV9tZnRfcmVjb3Jkcyh2b2wpOworCXVwX3JlYWQoJnZvbC0+bWZ0Ym1wX2xvY2spOworCS8qCisJICogRmlsZSBzeXN0ZW0gaWQuIFRoaXMgaXMgZXh0cmVtZWx5ICpuaXggZmxhdm91ciBkZXBlbmRlbnQgYW5kIGV2ZW4KKwkgKiB3aXRoaW4gTGludXggaXRzZWxmIGFsbCBmcyBkbyB0aGVpciBvd24gdGhpbmcuIEkgaW50ZXJwcmV0IHRoaXMgdG8KKwkgKiBtZWFuIGEgdW5pcXVlIGlkIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW91bnRlZCBmcyBhbmQgbm90IHRoZSBpZAorCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZSBzeXN0ZW0gZHJpdmVyLCB0aGUgbGF0dGVyIGlzIGFscmVhZHkgZ2l2ZW4KKwkgKiBieSB0aGUgZmlsZSBzeXN0ZW0gdHlwZSBpbiBzZnMtPmZfdHlwZS4gVGh1cyB3ZSB1c2UgdGhlIDY0LWJpdAorCSAqIHZvbHVtZSBzZXJpYWwgbnVtYmVyIHNwbGl0dGluZyBpdCBpbnRvIHR3byAzMi1iaXQgcGFydHMuIFdlIGVudGVyCisJICogdGhlIGxlYXN0IHNpZ25pZmljYW50IDMyLWJpdHMgaW4gZl9mc2lkWzBdIGFuZCB0aGUgbW9zdCBzaWduaWZpY2FudAorCSAqIDMyLWJpdHMgaW4gZl9mc2lkWzFdLgorCSAqLworCXNmcy0+Zl9mc2lkLnZhbFswXSA9IHZvbC0+c2VyaWFsX25vICYgMHhmZmZmZmZmZjsKKwlzZnMtPmZfZnNpZC52YWxbMV0gPSAodm9sLT5zZXJpYWxfbm8gPj4gMzIpICYgMHhmZmZmZmZmZjsKKwkvKiBNYXhpbXVtIGxlbmd0aCBvZiBmaWxlbmFtZXMuICovCisJc2ZzLT5mX25hbWVsZW4JICAgPSBOVEZTX01BWF9OQU1FX0xFTjsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBUaGUgY29tcGxldGUgc3VwZXIgb3BlcmF0aW9ucy4KKyAqLworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIG50ZnNfc29wcyA9IHsKKwkuYWxsb2NfaW5vZGUJPSBudGZzX2FsbG9jX2JpZ19pbm9kZSwJICAvKiBWRlM6IEFsbG9jYXRlIG5ldyBpbm9kZS4gKi8KKwkuZGVzdHJveV9pbm9kZQk9IG50ZnNfZGVzdHJveV9iaWdfaW5vZGUsIC8qIFZGUzogRGVhbGxvY2F0ZSBpbm9kZS4gKi8KKwkucHV0X2lub2RlCT0gbnRmc19wdXRfaW5vZGUsCSAgLyogVkZTOiBDYWxsZWQganVzdCBiZWZvcmUKKwkJCQkJCSAgICAgdGhlIGlub2RlIHJlZmVyZW5jZSBjb3VudAorCQkJCQkJICAgICBpcyBkZWNyZWFzZWQuICovCisjaWZkZWYgTlRGU19SVworCS8vLmRpcnR5X2lub2RlCT0gTlVMTCwJCQkvKiBWRlM6IENhbGxlZCBmcm9tCisJLy8JCQkJCSAgIF9fbWFya19pbm9kZV9kaXJ0eSgpLiAqLworCS53cml0ZV9pbm9kZQk9IG50ZnNfd3JpdGVfaW5vZGUsCS8qIFZGUzogV3JpdGUgZGlydHkgaW5vZGUgdG8KKwkJCQkJCSAgIGRpc2suICovCisJLy8uZHJvcF9pbm9kZQk9IE5VTEwsCQkJLyogVkZTOiBDYWxsZWQganVzdCBhZnRlciB0aGUKKwkvLwkJCQkJICAgaW5vZGUgcmVmZXJlbmNlIGNvdW50IGhhcworCS8vCQkJCQkgICBiZWVuIGRlY3JlYXNlZCB0byB6ZXJvLgorCS8vCQkJCQkgICBOT1RFOiBUaGUgaW5vZGUgbG9jayBpcworCS8vCQkJCQkgICBoZWxkLiBTZWUgZnMvaW5vZGUuYzo6CisJLy8JCQkJCSAgIGdlbmVyaWNfZHJvcF9pbm9kZSgpLiAqLworCS8vLmRlbGV0ZV9pbm9kZQk9IE5VTEwsCQkJLyogVkZTOiBEZWxldGUgaW5vZGUgZnJvbSBkaXNrLgorCS8vCQkJCQkgICBDYWxsZWQgd2hlbiBpX2NvdW50IGJlY29tZXMKKwkvLwkJCQkJICAgMCBhbmQgaV9ubGluayBpcyBhbHNvIDAuICovCisJLy8ud3JpdGVfc3VwZXIJPSBOVUxMLAkJCS8qIEZsdXNoIGRpcnR5IHN1cGVyIGJsb2NrIHRvCisJLy8JCQkJCSAgIGRpc2suICovCisJLy8uc3luY19mcwk9IE5VTEwsCQkJLyogPyAqLworCS8vLndyaXRlX3N1cGVyX2xvY2tmcwk9IE5VTEwsCQkvKiA/ICovCisJLy8udW5sb2NrZnMJPSBOVUxMLAkJCS8qID8gKi8KKyNlbmRpZiAvKiBOVEZTX1JXICovCisJLnB1dF9zdXBlcgk9IG50ZnNfcHV0X3N1cGVyLAkvKiBTeXNjYWxsOiB1bW91bnQuICovCisJLnN0YXRmcwkJPSBudGZzX3N0YXRmcywJCS8qIFN5c2NhbGw6IHN0YXRmcyAqLworCS5yZW1vdW50X2ZzCT0gbnRmc19yZW1vdW50LAkJLyogU3lzY2FsbDogbW91bnQgLW8gcmVtb3VudC4gKi8KKwkuY2xlYXJfaW5vZGUJPSBudGZzX2NsZWFyX2JpZ19pbm9kZSwJLyogVkZTOiBDYWxsZWQgd2hlbiBhbiBpbm9kZSBpcworCQkJCQkJICAgcmVtb3ZlZCBmcm9tIG1lbW9yeS4gKi8KKwkvLy51bW91bnRfYmVnaW4JPSBOVUxMLAkJCS8qIEZvcmNlZCB1bW91bnQuICovCisJLnNob3dfb3B0aW9ucwk9IG50ZnNfc2hvd19vcHRpb25zLAkvKiBTaG93IG1vdW50IG9wdGlvbnMgaW4KKwkJCQkJCSAgIHByb2MuICovCit9OworCisKKy8qKgorICogRGVjbGFyYXRpb25zIGZvciBOVEZTIHNwZWNpZmljIGV4cG9ydCBvcGVyYXRpb25zIChmcy9udGZzL25hbWVpLmMpLgorICovCitleHRlcm4gc3RydWN0IGRlbnRyeSAqbnRmc19nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmNoaWxkX2RlbnQpOworZXh0ZXJuIHN0cnVjdCBkZW50cnkgKm50ZnNfZ2V0X2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpmaCk7CisKKy8qKgorICogRXhwb3J0IG9wZXJhdGlvbnMgYWxsb3dpbmcgTkZTIGV4cG9ydGluZyBvZiBtb3VudGVkIE5URlMgcGFydGl0aW9ucy4KKyAqCisgKiBXZSB1c2UgdGhlIGRlZmF1bHQgLT5kZWNvZGVfZmgoKSBhbmQgLT5lbmNvZGVfZmgoKSBmb3Igbm93LiAgTm90ZSB0aGF0IHRoZXkKKyAqIHVzZSAzMiBiaXRzIHRvIHN0b3JlIHRoZSBpbm9kZSBudW1iZXIgd2hpY2ggaXMgYW4gdW5zaWduZWQgbG9uZyBzbyBvbiA2NC1iaXQKKyAqIGFyY2hpdGVjdHVyZXMgaXMgdXN1YWxseSA2NCBiaXRzIHNvIGl0IHdvdWxkIGFsbCBmYWlsIGhvcnJpYmx5IG9uIGh1Z2UKKyAqIHZvbHVtZXMuICBJIGd1ZXNzIHdlIG5lZWQgdG8gZGVmaW5lIG91ciBvd24gZW5jb2RlIGFuZCBkZWNvZGUgZmggZnVuY3Rpb25zCisgKiB0aGF0IHN0b3JlIDY0LWJpdCBpbm9kZSBudW1iZXJzIGF0IHNvbWUgcG9pbnQgYnV0IGZvciBub3cgd2Ugd2lsbCBpZ25vcmUgdGhlCisgKiBwcm9ibGVtLi4uCisgKgorICogV2UgYWxzbyB1c2UgdGhlIGRlZmF1bHQgLT5nZXRfbmFtZSgpIGhlbHBlciAodXNlZCBieSAtPmRlY29kZV9maCgpIHZpYQorICogZnMvZXhwb3J0ZnMvZXhwZnMuYzo6ZmluZF9leHBvcnRlZF9kZW50cnkoKSkgYXMgdGhhdCBpcyBjb21wbGV0ZWx5IGZzCisgKiBpbmRlcGVuZGVudC4KKyAqCisgKiBUaGUgZGVmYXVsdCAtPmdldF9wYXJlbnQoKSBqdXN0IHJldHVybnMgLUVBQ0NFUyBzbyB3ZSBoYXZlIHRvIHByb3ZpZGUgb3VyCisgKiBvd24gYW5kIHRoZSBkZWZhdWx0IC0+Z2V0X2RlbnRyeSgpIGlzIGluY29tcGF0aWJsZSB3aXRoIE5URlMgZHVlIHRvIG5vdAorICogYWxsb3dpbmcgdGhlIGlub2RlIG51bWJlciAwIHdoaWNoIGlzIHVzZWQgaW4gTlRGUyBmb3IgdGhlIHN5c3RlbSBmaWxlICRNRlQKKyAqIGFuZCBkdWUgdG8gdXNpbmcgaWdldCgpIHdoZXJlYXMgTlRGUyBuZWVkcyBudGZzX2lnZXQoKS4KKyAqLworc3RhdGljIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBudGZzX2V4cG9ydF9vcHMgPSB7CisJLmdldF9wYXJlbnQJPSBudGZzX2dldF9wYXJlbnQsCS8qIEZpbmQgdGhlIHBhcmVudCBvZiBhIGdpdmVuCisJCQkJCQkgICBkaXJlY3RvcnkuICovCisJLmdldF9kZW50cnkJPSBudGZzX2dldF9kZW50cnksCS8qIEZpbmQgYSBkZW50cnkgZm9yIHRoZSBpbm9kZQorCQkJCQkJICAgZ2l2ZW4gYSBmaWxlIGhhbmRsZQorCQkJCQkJICAgc3ViLWZyYWdtZW50LiAqLworfTsKKworLyoqCisgKiBudGZzX2ZpbGxfc3VwZXIgLSBtb3VudCBhbiBudGZzIGZpbGVzIHN5c3RlbQorICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgbnRmcyBmaWxlIHN5c3RlbSB0byBtb3VudAorICogQG9wdDoJc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1vdW50IG9wdGlvbnMKKyAqIEBzaWxlbnQ6CXNpbGVuY2UgZXJyb3Igb3V0cHV0CisgKgorICogbnRmc19maWxsX3N1cGVyKCkgaXMgY2FsbGVkIGJ5IHRoZSBWRlMgdG8gbW91bnQgdGhlIGRldmljZSBkZXNjcmliZWQgYnkgQHNiCisgKiB3aXRoIHRoZSBtb3VudCBvdGlvbnMgaW4gQGRhdGEgd2l0aCB0aGUgTlRGUyBmaWxlIHN5c3RlbS4KKyAqCisgKiBJZiBAc2lsZW50IGlzIHRydWUsIHJlbWFpbiBzaWxlbnQgZXZlbiBpZiBlcnJvcnMgYXJlIGRldGVjdGVkLiBUaGlzIGlzIHVzZWQKKyAqIGR1cmluZyBib290dXAsIHdoZW4gdGhlIGtlcm5lbCB0cmllcyB0byBtb3VudCB0aGUgcm9vdCBmaWxlIHN5c3RlbSB3aXRoIGFsbAorICogcmVnaXN0ZXJlZCBmaWxlIHN5c3RlbXMgb25lIGFmdGVyIHRoZSBvdGhlciB1bnRpbCBvbmUgc3VjY2VlZHMuIFRoaXMgaW1wbGllcworICogdGhhdCBhbGwgZmlsZSBzeXN0ZW1zIGV4Y2VwdCB0aGUgY29ycmVjdCBvbmUgd2lsbCBxdWl0ZSBjb3JyZWN0bHkgYW5kCisgKiBleHBlY3RlZGx5IHJldHVybiBhbiBlcnJvciwgYnV0IG5vYm9keSB3YW50cyB0byBzZWUgZXJyb3IgbWVzc2FnZXMgd2hlbiBpbgorICogZmFjdCB0aGlzIGlzIHdoYXQgaXMgc3VwcG9zZWQgdG8gaGFwcGVuLgorICoKKyAqIE5PVEU6IEBzYi0+c19mbGFncyBjb250YWlucyB0aGUgbW91bnQgb3B0aW9ucyBmbGFncy4KKyAqLworc3RhdGljIGludCBudGZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqb3B0LCBjb25zdCBpbnQgc2lsZW50KQoreworCW50ZnNfdm9sdW1lICp2b2w7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgaW5vZGUgKnRtcF9pbm87CisJaW50IHJlc3VsdDsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworI2lmbmRlZiBOVEZTX1JXCisJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CisjZW5kaWYgLyogISBOVEZTX1JXICovCisJLyogQWxsb2NhdGUgYSBuZXcgbnRmc192b2x1bWUgYW5kIHBsYWNlIGl0IGluIHNiLT5zX2ZzX2luZm8uICovCisJc2ItPnNfZnNfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKG50ZnNfdm9sdW1lKSwgR0ZQX05PRlMpOworCXZvbCA9IE5URlNfU0Ioc2IpOworCWlmICghdm9sKSB7CisJCWlmICghc2lsZW50KQorCQkJbnRmc19lcnJvcihzYiwgIkFsbG9jYXRpb24gb2YgTlRGUyB2b2x1bWUgc3RydWN0dXJlICIKKwkJCQkJImZhaWxlZC4gQWJvcnRpbmcgbW91bnQuLi4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIEluaXRpYWxpemUgbnRmc192b2x1bWUgc3RydWN0dXJlLiAqLworCW1lbXNldCh2b2wsIDAsIHNpemVvZihudGZzX3ZvbHVtZSkpOworCXZvbC0+c2IgPSBzYjsKKwl2b2wtPnVwY2FzZSA9IE5VTEw7CisJdm9sLT5hdHRyZGVmID0gTlVMTDsKKwl2b2wtPm1mdF9pbm8gPSBOVUxMOworCXZvbC0+bWZ0Ym1wX2lubyA9IE5VTEw7CisJaW5pdF9yd3NlbSgmdm9sLT5tZnRibXBfbG9jayk7CisjaWZkZWYgTlRGU19SVworCXZvbC0+bWZ0bWlycl9pbm8gPSBOVUxMOworCXZvbC0+bG9nZmlsZV9pbm8gPSBOVUxMOworI2VuZGlmIC8qIE5URlNfUlcgKi8KKwl2b2wtPmxjbmJtcF9pbm8gPSBOVUxMOworCWluaXRfcndzZW0oJnZvbC0+bGNuYm1wX2xvY2spOworCXZvbC0+dm9sX2lubyA9IE5VTEw7CisJdm9sLT5yb290X2lubyA9IE5VTEw7CisJdm9sLT5zZWN1cmVfaW5vID0gTlVMTDsKKwl2b2wtPmV4dGVuZF9pbm8gPSBOVUxMOworI2lmZGVmIE5URlNfUlcKKwl2b2wtPnF1b3RhX2lubyA9IE5VTEw7CisJdm9sLT5xdW90YV9xX2lubyA9IE5VTEw7CisjZW5kaWYgLyogTlRGU19SVyAqLworCXZvbC0+bmxzX21hcCA9IE5VTEw7CisKKwkvKgorCSAqIERlZmF1bHQgaXMgZ3JvdXAgYW5kIG90aGVyIGRvbid0IGhhdmUgYW55IGFjY2VzcyB0byBmaWxlcyBvcgorCSAqIGRpcmVjdG9yaWVzIHdoaWxlIG93bmVyIGhhcyBmdWxsIGFjY2Vzcy4gRnVydGhlciwgZmlsZXMgYnkgZGVmYXVsdAorCSAqIGFyZSBub3QgZXhlY3V0YWJsZSBidXQgZGlyZWN0b3JpZXMgYXJlIG9mIGNvdXJzZSBicm93c2VhYmxlLgorCSAqLworCXZvbC0+Zm1hc2sgPSAwMTc3OworCXZvbC0+ZG1hc2sgPSAwMDc3OworCisJdW5sb2NrX2tlcm5lbCgpOworCisJLyogSW1wb3J0YW50IHRvIGdldCB0aGUgbW91bnQgb3B0aW9ucyBkZWFsdCB3aXRoIG5vdy4gKi8KKwlpZiAoIXBhcnNlX29wdGlvbnModm9sLCAoY2hhciopb3B0KSkKKwkJZ290byBlcnJfb3V0X25vdzsKKworCS8qCisJICogVE9ETzogRmFpbCBzYWZldHkgY2hlY2suIEluIHRoZSBmdXR1cmUgd2Ugc2hvdWxkIHJlYWxseSBiZSBhYmxlIHRvCisJICogY29wZSB3aXRoIHRoaXMgYmVpbmcgdGhlIGNhc2UsIGJ1dCBmb3Igbm93IGp1c3QgYmFpbCBvdXQuCisJICovCisJaWYgKGJkZXZfaGFyZHNlY3Rfc2l6ZShzYi0+c19iZGV2KSA+IE5URlNfQkxPQ0tfU0laRSkgeworCQlpZiAoIXNpbGVudCkKKwkJCW50ZnNfZXJyb3Ioc2IsICJEZXZpY2UgaGFzIHVuc3VwcG9ydGVkIGhhcmRzZWN0X3NpemUuIik7CisJCWdvdG8gZXJyX291dF9ub3c7CisJfQorCisJLyogU2V0dXAgdGhlIGRldmljZSBhY2Nlc3MgYmxvY2sgc2l6ZSB0byBOVEZTX0JMT0NLX1NJWkUuICovCisJaWYgKHNiX3NldF9ibG9ja3NpemUoc2IsIE5URlNfQkxPQ0tfU0laRSkgIT0gTlRGU19CTE9DS19TSVpFKSB7CisJCWlmICghc2lsZW50KQorCQkJbnRmc19lcnJvcihzYiwgIlVuYWJsZSB0byBzZXQgYmxvY2sgc2l6ZS4iKTsKKwkJZ290byBlcnJfb3V0X25vdzsKKwl9CisKKwkvKiBHZXQgdGhlIHNpemUgb2YgdGhlIGRldmljZSBpbiB1bml0cyBvZiBOVEZTX0JMT0NLX1NJWkUgYnl0ZXMuICovCisJdm9sLT5ucl9ibG9ja3MgPSBzYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9zaXplID4+IE5URlNfQkxPQ0tfU0laRV9CSVRTOworCisJLyogUmVhZCB0aGUgYm9vdCBzZWN0b3IgYW5kIHJldHVybiB1bmxvY2tlZCBidWZmZXIgaGVhZCB0byBpdC4gKi8KKwlpZiAoIShiaCA9IHJlYWRfbnRmc19ib290X3NlY3RvcihzYiwgc2lsZW50KSkpIHsKKwkJaWYgKCFzaWxlbnQpCisJCQludGZzX2Vycm9yKHNiLCAiTm90IGFuIE5URlMgdm9sdW1lLiIpOworCQlnb3RvIGVycl9vdXRfbm93OworCX0KKworCS8qCisJICogRXh0cmFjdCB0aGUgZGF0YSBmcm9tIHRoZSBib290IHNlY3RvciBhbmQgc2V0dXAgdGhlIG50ZnMgc3VwZXIgYmxvY2sKKwkgKiB1c2luZyBpdC4KKwkgKi8KKwlyZXN1bHQgPSBwYXJzZV9udGZzX2Jvb3Rfc2VjdG9yKHZvbCwgKE5URlNfQk9PVF9TRUNUT1IqKWJoLT5iX2RhdGEpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY2x1c3RlciBhbmQgbWZ0IGFsbG9jYXRvcnMuICovCisJbnRmc19zZXR1cF9hbGxvY2F0b3JzKHZvbCk7CisKKwlicmVsc2UoYmgpOworCisJaWYgKCFyZXN1bHQpIHsKKwkJaWYgKCFzaWxlbnQpCisJCQludGZzX2Vycm9yKHNiLCAiVW5zdXBwb3J0ZWQgTlRGUyBmaWxlc3lzdGVtLiIpOworCQlnb3RvIGVycl9vdXRfbm93OworCX0KKworCS8qCisJICogVE9ETzogV2hlbiB3ZSBzdGFydCBjb3Bpbmcgd2l0aCBzZWN0b3Igc2l6ZXMgZGlmZmVyZW50IGZyb20KKwkgKiBOVEZTX0JMT0NLX1NJWkUsIHdlIG5vdyBwcm9iYWJseSBuZWVkIHRvIHNldCB0aGUgYmxvY2tzaXplIG9mIHRoZQorCSAqIGRldmljZSAocHJvYmFibHkgdG8gTlRGU19CTE9DS19TSVpFKS4KKwkgKi8KKworCS8qIFNldHVwIHJlbWFpbmluZyBmaWVsZHMgaW4gdGhlIHN1cGVyIGJsb2NrLiAqLworCXNiLT5zX21hZ2ljID0gTlRGU19TQl9NQUdJQzsKKworCS8qCisJICogTnRmcyBhbGxvd3MgNjMgYml0cyBmb3IgdGhlIGZpbGUgc2l6ZSwgaS5lLiBjb3JyZWN0IHdvdWxkIGJlOgorCSAqCXNiLT5zX21heGJ5dGVzID0gfjBVTEwgPj4gMTsKKwkgKiBCdXQgdGhlIGtlcm5lbCB1c2VzIGEgbG9uZyBhcyB0aGUgcGFnZSBjYWNoZSBwYWdlIGluZGV4IHdoaWNoIG9uCisJICogMzItYml0IGFyY2hpdGVjdHVyZXMgaXMgb25seSAzMi1iaXRzLiBNQVhfTEZTX0ZJTEVTSVpFIGlzIGtlcm5lbAorCSAqIGRlZmluZWQgdG8gdGhlIG1heGltdW0gdGhlIHBhZ2UgY2FjaGUgcGFnZSBpbmRleCBjYW4gY29wZSB3aXRoCisJICogd2l0aG91dCBvdmVyZmxvd2luZyB0aGUgaW5kZXggb3IgdG8gMl42MyAtIDEsIHdoaWNoZXZlciBpcyBzbWFsbGVyLgorCSAqLworCXNiLT5zX21heGJ5dGVzID0gTUFYX0xGU19GSUxFU0laRTsKKworCXNiLT5zX3RpbWVfZ3JhbiA9IDEwMDsKKworCS8qCisJICogTm93IGxvYWQgdGhlIG1ldGFkYXRhIHJlcXVpcmVkIGZvciB0aGUgcGFnZSBjYWNoZSBhbmQgb3VyIGFkZHJlc3MKKwkgKiBzcGFjZSBvcGVyYXRpb25zIHRvIGZ1bmN0aW9uLiBXZSBkbyB0aGlzIGJ5IHNldHRpbmcgdXAgYSBzcGVjaWFsaXNlZAorCSAqIHJlYWRfaW5vZGUgbWV0aG9kIGFuZCB0aGVuIGp1c3QgY2FsbGluZyB0aGUgbm9ybWFsIGlnZXQoKSB0byBvYnRhaW4KKwkgKiB0aGUgaW5vZGUgZm9yICRNRlQgd2hpY2ggaXMgc3VmZmljaWVudCB0byBhbGxvdyBvdXIgbm9ybWFsIGlub2RlCisJICogb3BlcmF0aW9ucyBhbmQgYXNzb2NpYXRlZCBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgdG8gZnVuY3Rpb24uCisJICovCisJc2ItPnNfb3AgPSAmbnRmc19zb3BzOworCXRtcF9pbm8gPSBuZXdfaW5vZGUoc2IpOworCWlmICghdG1wX2lubykgeworCQlpZiAoIXNpbGVudCkKKwkJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbG9hZCBlc3NlbnRpYWwgbWV0YWRhdGEuIik7CisJCWdvdG8gZXJyX291dF9ub3c7CisJfQorCXRtcF9pbm8tPmlfaW5vID0gRklMRV9NRlQ7CisJaW5zZXJ0X2lub2RlX2hhc2godG1wX2lubyk7CisJaWYgKG50ZnNfcmVhZF9pbm9kZV9tb3VudCh0bXBfaW5vKSA8IDApIHsKKwkJaWYgKCFzaWxlbnQpCisJCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGxvYWQgZXNzZW50aWFsIG1ldGFkYXRhLiIpOworCQlnb3RvIGlwdXRfdG1wX2lub19lcnJfb3V0X25vdzsKKwl9CisJZG93bigmbnRmc19sb2NrKTsKKwkvKgorCSAqIFRoZSBjdXJyZW50IG1vdW50IGlzIGEgY29tcHJlc3Npb24gdXNlciBpZiB0aGUgY2x1c3RlciBzaXplIGlzCisJICogbGVzcyB0aGFuIG9yIGVxdWFsIDRraUIuCisJICovCisJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplIDw9IDQwOTYgJiYgIW50ZnNfbnJfY29tcHJlc3Npb25fdXNlcnMrKykgeworCQlyZXN1bHQgPSBhbGxvY2F0ZV9jb21wcmVzc2lvbl9idWZmZXJzKCk7CisJCWlmIChyZXN1bHQpIHsKKwkJCW50ZnNfZXJyb3IoTlVMTCwgIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXJzICIKKwkJCQkJImZvciBjb21wcmVzc2lvbiBlbmdpbmUuIik7CisJCQludGZzX25yX2NvbXByZXNzaW9uX3VzZXJzLS07CisJCQl1cCgmbnRmc19sb2NrKTsKKwkJCWdvdG8gaXB1dF90bXBfaW5vX2Vycl9vdXRfbm93OworCQl9CisJfQorCS8qCisJICogR2VuZXJhdGUgdGhlIGdsb2JhbCBkZWZhdWx0IHVwY2FzZSB0YWJsZSBpZiBuZWNlc3NhcnkuICBBbHNvCisJICogdGVtcG9yYXJpbHkgaW5jcmVtZW50IHRoZSBudW1iZXIgb2YgdXBjYXNlIHVzZXJzIHRvIGF2b2lkIHJhY2UKKwkgKiBjb25kaXRpb25zIHdpdGggY29uY3VycmVudCAodSltb3VudHMuCisJICovCisJaWYgKCFkZWZhdWx0X3VwY2FzZSkKKwkJZGVmYXVsdF91cGNhc2UgPSBnZW5lcmF0ZV9kZWZhdWx0X3VwY2FzZSgpOworCW50ZnNfbnJfdXBjYXNlX3VzZXJzKys7CisJdXAoJm50ZnNfbG9jayk7CisJLyoKKwkgKiBGcm9tIG5vdyBvbiwgaWdub3JlIEBzaWxlbnQgcGFyYW1ldGVyLiBJZiB3ZSBmYWlsIGJlbG93IHRoaXMgbGluZSwKKwkgKiBpdCB3aWxsIGJlIGR1ZSB0byBhIGNvcnJ1cHQgZnMgb3IgYSBzeXN0ZW0gZXJyb3IsIHNvIHdlIHJlcG9ydCBpdC4KKwkgKi8KKwkvKgorCSAqIE9wZW4gdGhlIHN5c3RlbSBmaWxlcyB3aXRoIG5vcm1hbCBhY2Nlc3MgZnVuY3Rpb25zIGFuZCBjb21wbGV0ZQorCSAqIHNldHRpbmcgdXAgdGhlIG50ZnMgc3VwZXIgYmxvY2suCisJICovCisJaWYgKCFsb2FkX3N5c3RlbV9maWxlcyh2b2wpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbG9hZCBzeXN0ZW0gZmlsZXMuIik7CisJCWdvdG8gdW5sX3VwY2FzZV9pcHV0X3RtcF9pbm9fZXJyX291dF9ub3c7CisJfQorCWlmICgoc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdCh2b2wtPnJvb3RfaW5vKSkpIHsKKwkJLyogV2UgaW5jcmVtZW50IGlfY291bnQgc2ltdWxhdGluZyBhbiBudGZzX2lnZXQoKS4gKi8KKwkJYXRvbWljX2luYygmdm9sLT5yb290X2luby0+aV9jb3VudCk7CisJCW50ZnNfZGVidWcoIkV4aXRpbmcsIHN0YXR1cyBzdWNjZXNzZnVsLiIpOworCQkvKiBSZWxlYXNlIHRoZSBkZWZhdWx0IHVwY2FzZSBpZiBpdCBoYXMgbm8gdXNlcnMuICovCisJCWRvd24oJm50ZnNfbG9jayk7CisJCWlmICghLS1udGZzX25yX3VwY2FzZV91c2VycyAmJiBkZWZhdWx0X3VwY2FzZSkgeworCQkJbnRmc19mcmVlKGRlZmF1bHRfdXBjYXNlKTsKKwkJCWRlZmF1bHRfdXBjYXNlID0gTlVMTDsKKwkJfQorCQl1cCgmbnRmc19sb2NrKTsKKwkJc2ItPnNfZXhwb3J0X29wID0gJm50ZnNfZXhwb3J0X29wczsKKwkJbG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIDA7CisJfQorCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gYWxsb2NhdGUgcm9vdCBkaXJlY3RvcnkuIik7CisJLyogQ2xlYW4gdXAgYWZ0ZXIgdGhlIHN1Y2Nlc3NmdWwgbG9hZF9zeXN0ZW1fZmlsZXMoKSBjYWxsIGZyb20gYWJvdmUuICovCisJLy8gVE9ETzogVXNlIG50ZnNfcHV0X3N1cGVyKCkgaW5zdGVhZCBvZiByZXBlYXRpbmcgYWxsIHRoaXMgY29kZS4uLgorCS8vIEZJWE1FOiBTaG91bGQgbWFyayB0aGUgdm9sdW1lIGNsZWFuIGFzIHRoZSBlcnJvciBpcyBtb3N0IGxpa2VseQorCS8vIAkgIC1FTk9NRU0uCisJaXB1dCh2b2wtPnZvbF9pbm8pOworCXZvbC0+dm9sX2lubyA9IE5VTEw7CisJLyogTlRGUyAzLjArIHNwZWNpZmljIGNsZWFuIHVwLiAqLworCWlmICh2b2wtPm1ham9yX3ZlciA+PSAzKSB7CisjaWZkZWYgTlRGU19SVworCQlpZiAodm9sLT5xdW90YV9xX2lubykgeworCQkJaXB1dCh2b2wtPnF1b3RhX3FfaW5vKTsKKwkJCXZvbC0+cXVvdGFfcV9pbm8gPSBOVUxMOworCQl9CisJCWlmICh2b2wtPnF1b3RhX2lubykgeworCQkJaXB1dCh2b2wtPnF1b3RhX2lubyk7CisJCQl2b2wtPnF1b3RhX2lubyA9IE5VTEw7CisJCX0KKyNlbmRpZiAvKiBOVEZTX1JXICovCisJCWlmICh2b2wtPmV4dGVuZF9pbm8pIHsKKwkJCWlwdXQodm9sLT5leHRlbmRfaW5vKTsKKwkJCXZvbC0+ZXh0ZW5kX2lubyA9IE5VTEw7CisJCX0KKwkJaWYgKHZvbC0+c2VjdXJlX2lubykgeworCQkJaXB1dCh2b2wtPnNlY3VyZV9pbm8pOworCQkJdm9sLT5zZWN1cmVfaW5vID0gTlVMTDsKKwkJfQorCX0KKwlpcHV0KHZvbC0+cm9vdF9pbm8pOworCXZvbC0+cm9vdF9pbm8gPSBOVUxMOworCWlwdXQodm9sLT5sY25ibXBfaW5vKTsKKwl2b2wtPmxjbmJtcF9pbm8gPSBOVUxMOworCWlwdXQodm9sLT5tZnRibXBfaW5vKTsKKwl2b2wtPm1mdGJtcF9pbm8gPSBOVUxMOworI2lmZGVmIE5URlNfUlcKKwlpZiAodm9sLT5sb2dmaWxlX2lubykgeworCQlpcHV0KHZvbC0+bG9nZmlsZV9pbm8pOworCQl2b2wtPmxvZ2ZpbGVfaW5vID0gTlVMTDsKKwl9CisJaWYgKHZvbC0+bWZ0bWlycl9pbm8pIHsKKwkJaXB1dCh2b2wtPm1mdG1pcnJfaW5vKTsKKwkJdm9sLT5tZnRtaXJyX2lubyA9IE5VTEw7CisJfQorI2VuZGlmIC8qIE5URlNfUlcgKi8KKwkvKiBUaHJvdyBhd2F5IHRoZSB0YWJsZSBvZiBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMuICovCisJdm9sLT5hdHRyZGVmX3NpemUgPSAwOworCWlmICh2b2wtPmF0dHJkZWYpIHsKKwkJbnRmc19mcmVlKHZvbC0+YXR0cmRlZik7CisJCXZvbC0+YXR0cmRlZiA9IE5VTEw7CisJfQorCXZvbC0+dXBjYXNlX2xlbiA9IDA7CisJZG93bigmbnRmc19sb2NrKTsKKwlpZiAodm9sLT51cGNhc2UgPT0gZGVmYXVsdF91cGNhc2UpIHsKKwkJbnRmc19ucl91cGNhc2VfdXNlcnMtLTsKKwkJdm9sLT51cGNhc2UgPSBOVUxMOworCX0KKwl1cCgmbnRmc19sb2NrKTsKKwlpZiAodm9sLT51cGNhc2UpIHsKKwkJbnRmc19mcmVlKHZvbC0+dXBjYXNlKTsKKwkJdm9sLT51cGNhc2UgPSBOVUxMOworCX0KKwlpZiAodm9sLT5ubHNfbWFwKSB7CisJCXVubG9hZF9ubHModm9sLT5ubHNfbWFwKTsKKwkJdm9sLT5ubHNfbWFwID0gTlVMTDsKKwl9CisJLyogRXJyb3IgZXhpdCBjb2RlIHBhdGguICovCit1bmxfdXBjYXNlX2lwdXRfdG1wX2lub19lcnJfb3V0X25vdzoKKwkvKgorCSAqIERlY3JlYXNlIHRoZSBudW1iZXIgb2YgdXBjYXNlIHVzZXJzIGFuZCBkZXN0cm95IHRoZSBnbG9iYWwgZGVmYXVsdAorCSAqIHVwY2FzZSB0YWJsZSBpZiBuZWNlc3NhcnkuCisJICovCisJZG93bigmbnRmc19sb2NrKTsKKwlpZiAoIS0tbnRmc19ucl91cGNhc2VfdXNlcnMgJiYgZGVmYXVsdF91cGNhc2UpIHsKKwkJbnRmc19mcmVlKGRlZmF1bHRfdXBjYXNlKTsKKwkJZGVmYXVsdF91cGNhc2UgPSBOVUxMOworCX0KKwlpZiAodm9sLT5jbHVzdGVyX3NpemUgPD0gNDA5NiAmJiAhLS1udGZzX25yX2NvbXByZXNzaW9uX3VzZXJzKQorCQlmcmVlX2NvbXByZXNzaW9uX2J1ZmZlcnMoKTsKKwl1cCgmbnRmc19sb2NrKTsKK2lwdXRfdG1wX2lub19lcnJfb3V0X25vdzoKKwlpcHV0KHRtcF9pbm8pOworCWlmICh2b2wtPm1mdF9pbm8gJiYgdm9sLT5tZnRfaW5vICE9IHRtcF9pbm8pCisJCWlwdXQodm9sLT5tZnRfaW5vKTsKKwl2b2wtPm1mdF9pbm8gPSBOVUxMOworCS8qCisJICogVGhpcyBpcyBuZWVkZWQgdG8gZ2V0IG50ZnNfY2xlYXJfZXh0ZW50X2lub2RlKCkgY2FsbGVkIGZvciBlYWNoCisJICogaW5vZGUgd2UgaGF2ZSBldmVyIGNhbGxlZCBudGZzX2lnZXQoKS9pcHV0KCkgb24sIG90aGVyd2lzZSB3ZSBBKQorCSAqIGxlYWsgcmVzb3VyY2VzIGFuZCBCKSBhIHN1YnNlcXVlbnQgbW91bnQgZmFpbHMgYXV0b21hdGljYWxseSBkdWUgdG8KKwkgKiBudGZzX2lnZXQoKSBuZXZlciBjYWxsaW5nIGRvd24gaW50byBvdXIgbnRmc19yZWFkX2xvY2tlZF9pbm9kZSgpCisJICogbWV0aG9kIGFnYWluLi4uIEZJWE1FOiBEbyB3ZSBuZWVkIHRvIGRvIHRoaXMgdHdpY2Ugbm93IGJlY2F1c2Ugb2YKKwkgKiBhdHRyaWJ1dGUgaW5vZGVzPyBJIHRoaW5rIG5vdCwgc28gbGVhdmUgYXMgaXMgZm9yIG5vdy4uLiAoQUlBKQorCSAqLworCWlmIChpbnZhbGlkYXRlX2lub2RlcyhzYikpIHsKKwkJbnRmc19lcnJvcihzYiwgIkJ1c3kgaW5vZGVzIGxlZnQuIFRoaXMgaXMgbW9zdCBsaWtlbHkgYSBOVEZTICIKKwkJCQkiZHJpdmVyIGJ1Zy4iKTsKKwkJLyogQ29waWVkIGZyb20gZnMvc3VwZXIuYy4gSSBqdXN0IGxvdmUgdGhpcyBtZXNzYWdlLiAoLTsgKi8KKwkJcHJpbnRrKCJOVEZTOiBCdXN5IGlub2RlcyBhZnRlciB1bW91bnQuIFNlbGYtZGVzdHJ1Y3QgaW4gNSAiCisJCQkJInNlY29uZHMuICBIYXZlIGEgbmljZSBkYXkuLi5cbiIpOworCX0KKwkvKiBFcnJvcnMgYXQgdGhpcyBzdGFnZSBhcmUgaXJyZWxldmFudC4gKi8KK2Vycl9vdXRfbm93OgorCWxvY2tfa2VybmVsKCk7CisJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CisJa2ZyZWUodm9sKTsKKwludGZzX2RlYnVnKCJGYWlsZWQsIHJldHVybmluZyAtRUlOVkFMLiIpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICogVGhpcyBpcyBhIHNsYWIgY2FjaGUgdG8gb3B0aW1pemUgYWxsb2NhdGlvbnMgYW5kIGRlYWxsb2NhdGlvbnMgb2YgVW5pY29kZQorICogc3RyaW5ncyBvZiB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dlZCBieSBOVEZTLCB3aGljaCBpcyBOVEZTX01BWF9OQU1FX0xFTgorICogKDI1NSkgVW5pY29kZSBjaGFyYWN0ZXJzICsgYSB0ZXJtaW5hdGluZyBOVUxMIFVuaWNvZGUgY2hhcmFjdGVyLgorICovCitrbWVtX2NhY2hlX3QgKm50ZnNfbmFtZV9jYWNoZTsKKworLyogU2xhYiBjYWNoZXMgZm9yIGVmZmljaWVudCBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiBvZiBvZiBpbm9kZXMuICovCitrbWVtX2NhY2hlX3QgKm50ZnNfaW5vZGVfY2FjaGU7CitrbWVtX2NhY2hlX3QgKm50ZnNfYmlnX2lub2RlX2NhY2hlOworCisvKiBJbml0IG9uY2UgY29uc3RydWN0b3IgZm9yIHRoZSBpbm9kZSBzbGFiIGNhY2hlLiAqLworc3RhdGljIHZvaWQgbnRmc19iaWdfaW5vZGVfaW5pdF9vbmNlKHZvaWQgKmZvbywga21lbV9jYWNoZV90ICpjYWNoZXAsCisJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJbnRmc19pbm9kZSAqbmkgPSAobnRmc19pbm9kZSAqKWZvbzsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQorCQkJU0xBQl9DVE9SX0NPTlNUUlVDVE9SKQorCQlpbm9kZV9pbml0X29uY2UoVkZTX0kobmkpKTsKK30KKworLyoKKyAqIFNsYWIgY2FjaGVzIHRvIG9wdGltaXplIGFsbG9jYXRpb25zIGFuZCBkZWFsbG9jYXRpb25zIG9mIGF0dHJpYnV0ZSBzZWFyY2gKKyAqIGNvbnRleHRzIGFuZCBpbmRleCBjb250ZXh0cywgcmVzcGVjdGl2ZWx5LgorICovCitrbWVtX2NhY2hlX3QgKm50ZnNfYXR0cl9jdHhfY2FjaGU7CitrbWVtX2NhY2hlX3QgKm50ZnNfaW5kZXhfY3R4X2NhY2hlOworCisvKiBEcml2ZXIgd2lkZSBzZW1hcGhvcmUuICovCitERUNMQVJFX01VVEVYKG50ZnNfbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKm50ZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgbnRmc19maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIG50ZnNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIm50ZnMiLAorCS5nZXRfc2IJCT0gbnRmc19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2Jsb2NrX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwKK307CisKKy8qIFN0YWJsZSBuYW1lcyBmb3IgdGhlIHNsYWIgY2FjaGVzLiAqLworc3RhdGljIGNvbnN0IGNoYXIgbnRmc19pbmRleF9jdHhfY2FjaGVfbmFtZVtdID0gIm50ZnNfaW5kZXhfY3R4X2NhY2hlIjsKK3N0YXRpYyBjb25zdCBjaGFyIG50ZnNfYXR0cl9jdHhfY2FjaGVfbmFtZVtdID0gIm50ZnNfYXR0cl9jdHhfY2FjaGUiOworc3RhdGljIGNvbnN0IGNoYXIgbnRmc19uYW1lX2NhY2hlX25hbWVbXSA9ICJudGZzX25hbWVfY2FjaGUiOworc3RhdGljIGNvbnN0IGNoYXIgbnRmc19pbm9kZV9jYWNoZV9uYW1lW10gPSAibnRmc19pbm9kZV9jYWNoZSI7CitzdGF0aWMgY29uc3QgY2hhciBudGZzX2JpZ19pbm9kZV9jYWNoZV9uYW1lW10gPSAibnRmc19iaWdfaW5vZGVfY2FjaGUiOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X250ZnNfZnModm9pZCkKK3sKKwlpbnQgZXJyID0gMDsKKworCS8qIFRoaXMgbWF5IGJlIHVnbHkgYnV0IGl0IHJlc3VsdHMgaW4gcHJldHR5IG91dHB1dCBzbyB3aG8gY2FyZXMuICgtOCAqLworCXByaW50ayhLRVJOX0lORk8gIk5URlMgZHJpdmVyICIgTlRGU19WRVJTSU9OICIgW0ZsYWdzOiBSLyIKKyNpZmRlZiBOVEZTX1JXCisJCQkiVyIKKyNlbHNlCisJCQkiTyIKKyNlbmRpZgorI2lmZGVmIERFQlVHCisJCQkiIERFQlVHIgorI2VuZGlmCisjaWZkZWYgTU9EVUxFCisJCQkiIE1PRFVMRSIKKyNlbmRpZgorCQkJIl0uXG4iKTsKKworCW50ZnNfZGVidWcoIkRlYnVnIG1lc3NhZ2VzIGFyZSBlbmFibGVkLiIpOworCisJbnRmc19pbmRleF9jdHhfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZShudGZzX2luZGV4X2N0eF9jYWNoZV9uYW1lLAorCQkJc2l6ZW9mKG50ZnNfaW5kZXhfY29udGV4dCksIDAgLyogb2Zmc2V0ICovLAorCQkJU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMIC8qIGN0b3IgKi8sIE5VTEwgLyogZHRvciAqLyk7CisJaWYgKCFudGZzX2luZGV4X2N0eF9jYWNoZSkgeworCQlwcmludGsoS0VSTl9DUklUICJOVEZTOiBGYWlsZWQgdG8gY3JlYXRlICVzIVxuIiwKKwkJCQludGZzX2luZGV4X2N0eF9jYWNoZV9uYW1lKTsKKwkJZ290byBpY3R4X2Vycl9vdXQ7CisJfQorCW50ZnNfYXR0cl9jdHhfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZShudGZzX2F0dHJfY3R4X2NhY2hlX25hbWUsCisJCQlzaXplb2YobnRmc19hdHRyX3NlYXJjaF9jdHgpLCAwIC8qIG9mZnNldCAqLywKKwkJCVNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCAvKiBjdG9yICovLCBOVUxMIC8qIGR0b3IgKi8pOworCWlmICghbnRmc19hdHRyX2N0eF9jYWNoZSkgeworCQlwcmludGsoS0VSTl9DUklUICJOVEZTOiBGYWlsZWQgdG8gY3JlYXRlICVzIVxuIiwKKwkJCQludGZzX2F0dHJfY3R4X2NhY2hlX25hbWUpOworCQlnb3RvIGFjdHhfZXJyX291dDsKKwl9CisKKwludGZzX25hbWVfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZShudGZzX25hbWVfY2FjaGVfbmFtZSwKKwkJCShOVEZTX01BWF9OQU1FX0xFTisxKSAqIHNpemVvZihudGZzY2hhciksIDAsCisJCQlTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwsIE5VTEwpOworCWlmICghbnRmc19uYW1lX2NhY2hlKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IEZhaWxlZCB0byBjcmVhdGUgJXMhXG4iLAorCQkJCW50ZnNfbmFtZV9jYWNoZV9uYW1lKTsKKwkJZ290byBuYW1lX2Vycl9vdXQ7CisJfQorCisJbnRmc19pbm9kZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKG50ZnNfaW5vZGVfY2FjaGVfbmFtZSwKKwkJCXNpemVvZihudGZzX2lub2RlKSwgMCwKKwkJCVNMQUJfUkVDTEFJTV9BQ0NPVU5ULCBOVUxMLCBOVUxMKTsKKwlpZiAoIW50ZnNfaW5vZGVfY2FjaGUpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiTlRGUzogRmFpbGVkIHRvIGNyZWF0ZSAlcyFcbiIsCisJCQkJbnRmc19pbm9kZV9jYWNoZV9uYW1lKTsKKwkJZ290byBpbm9kZV9lcnJfb3V0OworCX0KKworCW50ZnNfYmlnX2lub2RlX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUobnRmc19iaWdfaW5vZGVfY2FjaGVfbmFtZSwKKwkJCXNpemVvZihiaWdfbnRmc19pbm9kZSksIDAsCisJCQlTTEFCX0hXQ0FDSEVfQUxJR058U0xBQl9SRUNMQUlNX0FDQ09VTlQsCisJCQludGZzX2JpZ19pbm9kZV9pbml0X29uY2UsIE5VTEwpOworCWlmICghbnRmc19iaWdfaW5vZGVfY2FjaGUpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiTlRGUzogRmFpbGVkIHRvIGNyZWF0ZSAlcyFcbiIsCisJCQkJbnRmc19iaWdfaW5vZGVfY2FjaGVfbmFtZSk7CisJCWdvdG8gYmlnX2lub2RlX2Vycl9vdXQ7CisJfQorCisJLyogUmVnaXN0ZXIgdGhlIG50ZnMgc3lzY3Rscy4gKi8KKwllcnIgPSBudGZzX3N5c2N0bCgxKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IEZhaWxlZCB0byByZWdpc3RlciBOVEZTIHN5c2N0bHMhXG4iKTsKKwkJZ290byBzeXNjdGxfZXJyX291dDsKKwl9CisKKwllcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZudGZzX2ZzX3R5cGUpOworCWlmICghZXJyKSB7CisJCW50ZnNfZGVidWcoIk5URlMgZHJpdmVyIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5LiIpOworCQlyZXR1cm4gMDsgLyogU3VjY2VzcyEgKi8KKwl9CisJcHJpbnRrKEtFUk5fQ1JJVCAiTlRGUzogRmFpbGVkIHRvIHJlZ2lzdGVyIE5URlMgZmlsZSBzeXN0ZW0gZHJpdmVyIVxuIik7CisKK3N5c2N0bF9lcnJfb3V0OgorCWttZW1fY2FjaGVfZGVzdHJveShudGZzX2JpZ19pbm9kZV9jYWNoZSk7CitiaWdfaW5vZGVfZXJyX291dDoKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kobnRmc19pbm9kZV9jYWNoZSk7Citpbm9kZV9lcnJfb3V0OgorCWttZW1fY2FjaGVfZGVzdHJveShudGZzX25hbWVfY2FjaGUpOworbmFtZV9lcnJfb3V0OgorCWttZW1fY2FjaGVfZGVzdHJveShudGZzX2F0dHJfY3R4X2NhY2hlKTsKK2FjdHhfZXJyX291dDoKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kobnRmc19pbmRleF9jdHhfY2FjaGUpOworaWN0eF9lcnJfb3V0OgorCWlmICghZXJyKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IEFib3J0aW5nIE5URlMgZmlsZSBzeXN0ZW0gZHJpdmVyICIKKwkJCQkicmVnaXN0cmF0aW9uLi4uXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbnRmc19mcyh2b2lkKQoreworCWludCBlcnIgPSAwOworCisJbnRmc19kZWJ1ZygiVW5yZWdpc3RlcmluZyBOVEZTIGRyaXZlci4iKTsKKworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmbnRmc19mc190eXBlKTsKKworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kobnRmc19iaWdfaW5vZGVfY2FjaGUpICYmIChlcnIgPSAxKSkKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiTlRGUzogRmFpbGVkIHRvIGRlc3RvcnkgJXMuXG4iLAorCQkJCW50ZnNfYmlnX2lub2RlX2NhY2hlX25hbWUpOworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kobnRmc19pbm9kZV9jYWNoZSkgJiYgKGVyciA9IDEpKQorCQlwcmludGsoS0VSTl9DUklUICJOVEZTOiBGYWlsZWQgdG8gZGVzdG9yeSAlcy5cbiIsCisJCQkJbnRmc19pbm9kZV9jYWNoZV9uYW1lKTsKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KG50ZnNfbmFtZV9jYWNoZSkgJiYgKGVyciA9IDEpKQorCQlwcmludGsoS0VSTl9DUklUICJOVEZTOiBGYWlsZWQgdG8gZGVzdG9yeSAlcy5cbiIsCisJCQkJbnRmc19uYW1lX2NhY2hlX25hbWUpOworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kobnRmc19hdHRyX2N0eF9jYWNoZSkgJiYgKGVyciA9IDEpKQorCQlwcmludGsoS0VSTl9DUklUICJOVEZTOiBGYWlsZWQgdG8gZGVzdG9yeSAlcy5cbiIsCisJCQkJbnRmc19hdHRyX2N0eF9jYWNoZV9uYW1lKTsKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KG50ZnNfaW5kZXhfY3R4X2NhY2hlKSAmJiAoZXJyID0gMSkpCisJCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IEZhaWxlZCB0byBkZXN0b3J5ICVzLlxuIiwKKwkJCQludGZzX2luZGV4X2N0eF9jYWNoZV9uYW1lKTsKKwlpZiAoZXJyKQorCQlwcmludGsoS0VSTl9DUklUICJOVEZTOiBUaGlzIGNhdXNlcyBtZW1vcnkgdG8gbGVhayEgVGhlcmUgaXMgIgorCQkJCSJwcm9iYWJseSBhIEJVRyBpbiB0aGUgZHJpdmVyISBQbGVhc2UgcmVwb3J0ICIKKwkJCQkieW91IHNhdyB0aGlzIG1lc3NhZ2UgdG8gIgorCQkJCSJsaW51eC1udGZzLWRldkBsaXN0cy5zb3VyY2Vmb3JnZS5uZXRcbiIpOworCS8qIFVucmVnaXN0ZXIgdGhlIG50ZnMgc3lzY3Rscy4gKi8KKwludGZzX3N5c2N0bCgwKTsKK30KKworTU9EVUxFX0FVVEhPUigiQW50b24gQWx0YXBhcm1ha292IDxhaWEyMUBjYW50YWIubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOVEZTIDEuMi8zLnggZHJpdmVyIC0gQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292Iik7CitNT0RVTEVfVkVSU0lPTihOVEZTX1ZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworI2lmZGVmIERFQlVHCittb2R1bGVfcGFyYW0oZGVidWdfbXNncywgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX21zZ3MsICJFbmFibGUgZGVidWcgbWVzc2FnZXMuIik7CisjZW5kaWYKKworbW9kdWxlX2luaXQoaW5pdF9udGZzX2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9udGZzX2ZzKQpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9zeXNjdGwuYyBiL2ZzL250ZnMvc3lzY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwNjdlNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvc3lzY3RsLmMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIHN5c2N0bC5jIC0gQ29kZSBmb3Igc3lzY3RsIGhhbmRsaW5nIGluIE5URlMgTGludXgga2VybmVsIGRyaXZlci4gUGFydCBvZgorICoJICAgICAgdGhlIExpbnV4LU5URlMgcHJvamVjdC4gQWRhcHRlZCBmcm9tIHRoZSBvbGQgTlRGUyBkcml2ZXIsCisgKgkgICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgTWFydGluIHZvbiBM9ndpcywgUulnaXMgRHVjaGVzbmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZkZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorCisjaW5jbHVkZSAic3lzY3RsLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworI2RlZmluZSBGU19OVEZTCTEKKworLyogRGVmaW5pdGlvbiBvZiB0aGUgbnRmcyBzeXNjdGwuICovCitzdGF0aWMgY3RsX3RhYmxlIG50ZnNfc3lzY3Rsc1tdID0geworCXsgRlNfTlRGUywgIm50ZnMtZGVidWciLAkJLyogQmluYXJ5IGFuZCB0ZXh0IElEcy4gKi8KKwkgICZkZWJ1Z19tc2dzLHNpemVvZihkZWJ1Z19tc2dzKSwJLyogRGF0YSBwb2ludGVyIGFuZCBzaXplLiAqLworCSAgMDY0NCwJTlVMTCwgJnByb2NfZG9pbnR2ZWMgfSwJCS8qIE1vZGUsIGNoaWxkLCBwcm9jIGhhbmRsZXIuICovCisJeyAwIH0KK307CisKKy8qIERlZmluZSB0aGUgcGFyZW50IGRpcmVjdG9yeSAvcHJvYy9zeXMvZnMuICovCitzdGF0aWMgY3RsX3RhYmxlIHN5c2N0bHNfcm9vdFtdID0geworCXsgQ1RMX0ZTLCAiZnMiLCBOVUxMLCAwLCAwNTU1LCBudGZzX3N5c2N0bHMgfSwKKwl7IDAgfQorfTsKKworLyogU3RvcmFnZSBmb3IgdGhlIHN5c2N0bHMgaGVhZGVyLiAqLworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpzeXNjdGxzX3Jvb3RfdGFibGUgPSBOVUxMOworCisvKioKKyAqIG50ZnNfc3lzY3RsIC0gYWRkIG9yIHJlbW92ZSB0aGUgZGVidWcgc3lzY3RsCisgKiBAYWRkOglhZGQgKDEpIG9yIHJlbW92ZSAoMCkgdGhlIHN5c2N0bAorICoKKyAqIEFkZCBvciByZW1vdmUgdGhlIGRlYnVnIHN5c2N0bC4gUmV0dXJuIDAgb24gc3VjY2VzcyBvciAtZXJybm8gb24gZXJyb3IuCisgKi8KK2ludCBudGZzX3N5c2N0bChpbnQgYWRkKQoreworCWlmIChhZGQpIHsKKwkJQlVHX09OKHN5c2N0bHNfcm9vdF90YWJsZSk7CisJCXN5c2N0bHNfcm9vdF90YWJsZSA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShzeXNjdGxzX3Jvb3QsIDApOworCQlpZiAoIXN5c2N0bHNfcm9vdF90YWJsZSkKKwkJCXJldHVybiAtRU5PTUVNOworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJCS8qCisJCSAqIElmIHRoZSBwcm9jIGZpbGUgc3lzdGVtIGlzIGluIHVzZSBhbmQgd2UgYXJlIGEgbW9kdWxlLCBuZWVkCisJCSAqIHRvIHNldCB0aGUgb3duZXIgb2Ygb3VyIHByb2MgZW50cnkgdG8gb3VyIG1vZHVsZS4gSW4gdGhlCisJCSAqIG5vbi1tb2R1bGFyIGNhc2UsIFRISVNfTU9EVUxFIGlzIE5VTEwsIHNvIHRoaXMgaXMgb2suCisJCSAqLworCQludGZzX3N5c2N0bHNbMF0uZGUtPm93bmVyID0gVEhJU19NT0RVTEU7CisjZW5kaWYKKwl9IGVsc2UgeworCQlCVUdfT04oIXN5c2N0bHNfcm9vdF90YWJsZSk7CisJCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHN5c2N0bHNfcm9vdF90YWJsZSk7CisJCXN5c2N0bHNfcm9vdF90YWJsZSA9IE5VTEw7CisJfQorCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLworI2VuZGlmIC8qIERFQlVHICovCmRpZmYgLS1naXQgYS9mcy9udGZzL3N5c2N0bC5oIGIvZnMvbnRmcy9zeXNjdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjc0OWNjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9zeXNjdGwuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogc3lzY3RsLmggLSBEZWZpbmVzIGZvciBzeXNjdGwgaGFuZGxpbmcgaW4gTlRGUyBMaW51eCBrZXJuZWwgZHJpdmVyLiBQYXJ0IG9mCisgKgkgICAgICB0aGUgTGludXgtTlRGUyBwcm9qZWN0LiBBZGFwdGVkIGZyb20gdGhlIG9sZCBOVEZTIGRyaXZlciwKKyAqCSAgICAgIENvcHlyaWdodCAoQykgMTk5NyBNYXJ0aW4gdm9uIEz2d2lzLCBS6WdpcyBEdWNoZXNuZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfU1lTQ1RMX0gKKyNkZWZpbmUgX0xJTlVYX05URlNfU1lTQ1RMX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaWYgKERFQlVHICYmIENPTkZJR19TWVNDVEwpCisKK2V4dGVybiBpbnQgbnRmc19zeXNjdGwoaW50IGFkZCk7CisKKyNlbHNlCisKKy8qIEp1c3QgcmV0dXJuIHN1Y2Nlc3MuICovCitzdGF0aWMgaW5saW5lIGludCBudGZzX3N5c2N0bChpbnQgYWRkKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogREVCVUcgJiYgQ09ORklHX1NZU0NUTCAqLworI2VuZGlmIC8qIF9MSU5VWF9OVEZTX1NZU0NUTF9IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL3RpbWUuaCBiL2ZzL250ZnMvdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOWE1MWQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL3RpbWUuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIHRpbWUuaCAtIE5URlMgdGltZSBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9MSU5VWF9OVEZTX1RJTUVfSAorI2RlZmluZSBfTElOVVhfTlRGU19USU1FX0gKKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4JCS8qIEZvciBjdXJyZW50X2tlcm5lbF90aW1lKCkuICovCisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CQkvKiBGb3IgZG9fZGl2KCkuICovCisKKyNpbmNsdWRlICJlbmRpYW4uaCIKKworI2RlZmluZSBOVEZTX1RJTUVfT0ZGU0VUICgoczY0KSgzNjkgKiAzNjUgKyA4OSkgKiAyNCAqIDM2MDAgKiAxMDAwMDAwMCkKKworLyoqCisgKiB1dGMybnRmcyAtIGNvbnZlcnQgTGludXggVVRDIHRpbWUgdG8gTlRGUyB0aW1lCisgKiBAdHM6CQlMaW51eCBVVEMgdGltZSB0byBjb252ZXJ0IHRvIE5URlMgdGltZQorICoKKyAqIENvbnZlcnQgdGhlIExpbnV4IFVUQyB0aW1lIEB0cyB0byBpdHMgY29ycmVzcG9uZGluZyBOVEZTIHRpbWUgYW5kIHJldHVybgorICogdGhhdCBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdC4KKyAqCisgKiBMaW51eCBzdG9yZXMgdGltZSBpbiBhIHN0cnVjdCB0aW1lc3BlYyBjb25zaXN0aW5nIG9mIGEgdGltZV90IChsb25nIGF0CisgKiBwcmVzZW50KSB0dl9zZWMgYW5kIGEgbG9uZyB0dl9uc2VjIHdoZXJlIHR2X3NlYyBpcyB0aGUgbnVtYmVyIG9mIDEtc2Vjb25kCisgKiBpbnRlcnZhbHMgc2luY2UgMXN0IEphbnVhcnkgMTk3MCwgMDA6MDA6MDAgVVRDIGFuZCB0dl9uc2VjIGlzIHRoZSBudW1iZXIgb2YKKyAqIDEtbmFuby1zZWNvbmQgaW50ZXJ2YWxzIHNpbmNlIHRoZSB2YWx1ZSBvZiB0dl9zZWMuCisgKgorICogTlRGUyB1c2VzIE1pY3Jvc29mdCdzIHN0YW5kYXJkIHRpbWUgZm9ybWF0IHdoaWNoIGlzIHN0b3JlZCBpbiBhIHM2NCBhbmQgaXMKKyAqIG1lYXN1cmVkIGFzIHRoZSBudW1iZXIgb2YgMTAwLW5hbm8tc2Vjb25kIGludGVydmFscyBzaW5jZSAxc3QgSmFudWFyeSAxNjAxLAorICogMDA6MDA6MDAgVVRDLgorICovCitzdGF0aWMgaW5saW5lIHNsZTY0IHV0YzJudGZzKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyB0cykKK3sKKwkvKgorCSAqIENvbnZlcnQgdGhlIHNlY29uZHMgdG8gMTAwbnMgaW50ZXJ2YWxzLCBhZGQgdGhlIG5hbm8tc2Vjb25kcworCSAqIGNvbnZlcnRlZCB0byAxMDBucyBpbnRlcnZhbHMsIGFuZCB0aGVuIGFkZCB0aGUgTlRGUyB0aW1lIG9mZnNldC4KKwkgKi8KKwlyZXR1cm4gY3B1X3RvX3NsZTY0KChzNjQpdHMudHZfc2VjICogMTAwMDAwMDAgKyB0cy50dl9uc2VjIC8gMTAwICsKKwkJCU5URlNfVElNRV9PRkZTRVQpOworfQorCisvKioKKyAqIGdldF9jdXJyZW50X250ZnNfdGltZSAtIGdldCB0aGUgY3VycmVudCB0aW1lIGluIGxpdHRsZSBlbmRpYW4gTlRGUyBmb3JtYXQKKyAqCisgKiBHZXQgdGhlIGN1cnJlbnQgdGltZSBmcm9tIHRoZSBMaW51eCBrZXJuZWwsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcKKyAqIE5URlMgdGltZSBhbmQgcmV0dXJuIHRoYXQgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc2xlNjQgZ2V0X2N1cnJlbnRfbnRmc190aW1lKHZvaWQpCit7CisJcmV0dXJuIHV0YzJudGZzKGN1cnJlbnRfa2VybmVsX3RpbWUoKSk7Cit9CisKKy8qKgorICogbnRmczJ1dGMgLSBjb252ZXJ0IE5URlMgdGltZSB0byBMaW51eCB0aW1lCisgKiBAdGltZToJTlRGUyB0aW1lIChsaXR0bGUgZW5kaWFuKSB0byBjb252ZXJ0IHRvIExpbnV4IFVUQworICoKKyAqIENvbnZlcnQgdGhlIGxpdHRsZSBlbmRpYW4gTlRGUyB0aW1lIEB0aW1lIHRvIGl0cyBjb3JyZXNwb25kaW5nIExpbnV4IFVUQworICogdGltZSBhbmQgcmV0dXJuIHRoYXQgaW4gY3B1IGZvcm1hdC4KKyAqCisgKiBMaW51eCBzdG9yZXMgdGltZSBpbiBhIHN0cnVjdCB0aW1lc3BlYyBjb25zaXN0aW5nIG9mIGEgdGltZV90IChsb25nIGF0CisgKiBwcmVzZW50KSB0dl9zZWMgYW5kIGEgbG9uZyB0dl9uc2VjIHdoZXJlIHR2X3NlYyBpcyB0aGUgbnVtYmVyIG9mIDEtc2Vjb25kCisgKiBpbnRlcnZhbHMgc2luY2UgMXN0IEphbnVhcnkgMTk3MCwgMDA6MDA6MDAgVVRDIGFuZCB0dl9uc2VjIGlzIHRoZSBudW1iZXIgb2YKKyAqIDEtbmFuby1zZWNvbmQgaW50ZXJ2YWxzIHNpbmNlIHRoZSB2YWx1ZSBvZiB0dl9zZWMuCisgKgorICogTlRGUyB1c2VzIE1pY3Jvc29mdCdzIHN0YW5kYXJkIHRpbWUgZm9ybWF0IHdoaWNoIGlzIHN0b3JlZCBpbiBhIHM2NCBhbmQgaXMKKyAqIG1lYXN1cmVkIGFzIHRoZSBudW1iZXIgb2YgMTAwIG5hbm8tc2Vjb25kIGludGVydmFscyBzaW5jZSAxc3QgSmFudWFyeSAxNjAxLAorICogMDA6MDA6MDAgVVRDLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0aW1lc3BlYyBudGZzMnV0Yyhjb25zdCBzbGU2NCB0aW1lKQoreworCXN0cnVjdCB0aW1lc3BlYyB0czsKKworCS8qIFN1YnRyYWN0IHRoZSBOVEZTIHRpbWUgb2Zmc2V0LiAqLworCXM2NCB0ID0gc2xlNjRfdG9fY3B1KHRpbWUpIC0gTlRGU19USU1FX09GRlNFVDsKKwkvKgorCSAqIENvbnZlcnQgdGhlIHRpbWUgdG8gMS1zZWNvbmQgaW50ZXJ2YWxzIGFuZCB0aGUgcmVtYWluZGVyIHRvCisJICogMS1uYW5vLXNlY29uZCBpbnRlcnZhbHMuCisJICovCisJdHMudHZfbnNlYyA9IGRvX2Rpdih0LCAxMDAwMDAwMCkgKiAxMDA7CisJdHMudHZfc2VjID0gdDsKKwlyZXR1cm4gdHM7Cit9CisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19USU1FX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvdHlwZXMuaCBiL2ZzL250ZnMvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGE1NWFhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy90eXBlcy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiB0eXBlcy5oIC0gRGVmaW5lcyBmb3IgTlRGUyBMaW51eCBrZXJuZWwgZHJpdmVyIHNwZWNpZmljIHR5cGVzLgorICoJICAgICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19UWVBFU19ICisjZGVmaW5lIF9MSU5VWF9OVEZTX1RZUEVTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3R5cGVkZWYgX19sZTE2IGxlMTY7Cit0eXBlZGVmIF9fbGUzMiBsZTMyOwordHlwZWRlZiBfX2xlNjQgbGU2NDsKK3R5cGVkZWYgX191MTYgX19iaXR3aXNlIHNsZTE2OwordHlwZWRlZiBfX3UzMiBfX2JpdHdpc2Ugc2xlMzI7Cit0eXBlZGVmIF9fdTY0IF9fYml0d2lzZSBzbGU2NDsKKworLyogMi1ieXRlIFVuaWNvZGUgY2hhcmFjdGVyIHR5cGUuICovCit0eXBlZGVmIGxlMTYgbnRmc2NoYXI7CisjZGVmaW5lIFVDSEFSX1RfU0laRV9CSVRTIDEKKworLyoKKyAqIENsdXN0ZXJzIGFyZSBzaWduZWQgNjQtYml0IHZhbHVlcyBvbiBOVEZTIHZvbHVtZXMuIFdlIGRlZmluZSB0d28gdHlwZXMsIExDTgorICogYW5kIFZDTiwgdG8gYWxsb3cgZm9yIHR5cGUgY2hlY2tpbmcgYW5kIGJldHRlciBjb2RlIHJlYWRhYmlsaXR5LgorICovCit0eXBlZGVmIHM2NCBWQ047Cit0eXBlZGVmIHNsZTY0IGxlVkNOOwordHlwZWRlZiBzNjQgTENOOwordHlwZWRlZiBzbGU2NCBsZUxDTjsKKworLyoKKyAqIFRoZSBOVEZTIGpvdXJuYWwgJExvZ0ZpbGUgdXNlcyBsb2cgc2VxdWVuY2UgbnVtYmVycyB3aGljaCBhcmUgc2lnbmVkIDY0LWJpdAorICogdmFsdWVzLiAgV2UgZGVmaW5lIG91ciBvd24gdHlwZSBMU04sIHRvIGFsbG93IGZvciB0eXBlIGNoZWNraW5nIGFuZCBiZXR0ZXIKKyAqIGNvZGUgcmVhZGFiaWxpdHkuCisgKi8KK3R5cGVkZWYgczY0IExTTjsKK3R5cGVkZWYgc2xlNjQgbGVMU047CisKK3R5cGVkZWYgZW51bSB7CisJRkFMU0UgPSAwLAorCVRSVUUgPSAxCit9IEJPT0w7CisKK3R5cGVkZWYgZW51bSB7CisJQ0FTRV9TRU5TSVRJVkUgPSAwLAorCUlHTk9SRV9DQVNFID0gMSwKK30gSUdOT1JFX0NBU0VfQk9PTDsKKworI2VuZGlmIC8qIF9MSU5VWF9OVEZTX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvdW5pc3RyLmMgYi9mcy9udGZzL3VuaXN0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MGIwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL3VuaXN0ci5jCkBAIC0wLDAgKzEsMzg0IEBACisvKgorICogdW5pc3RyLmMgLSBOVEZTIFVuaWNvZGUgc3RyaW5nIGhhbmRsaW5nLiBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJudGZzLmgiCisKKy8qCisgKiBJTVBPUlRBTlQKKyAqID09PT09PT09PQorICoKKyAqIEFsbCB0aGVzZSByb3V0aW5lcyBhc3N1bWUgdGhhdCB0aGUgVW5pY29kZSBjaGFyYWN0ZXJzIGFyZSBpbiBsaXR0bGUgZW5kaWFuCisgKiBlbmNvZGluZyBpbnNpZGUgdGhlIHN0cmluZ3MhISEKKyAqLworCisvKgorICogVGhpcyBpcyB1c2VkIGJ5IHRoZSBuYW1lIGNvbGxhdGlvbiBmdW5jdGlvbnMgdG8gcXVpY2tseSBkZXRlcm1pbmUgd2hhdAorICogY2hhcmFjdGVycyBhcmUgKGluKXZhbGlkLgorICovCitzdGF0aWMgY29uc3QgdTggbGVnYWxfYW5zaV9jaGFyX2FycmF5WzB4NDBdID0geworCTB4MDAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKworCTB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKworCTB4MTcsIDB4MDcsIDB4MTgsIDB4MTcsIDB4MTcsIDB4MTcsIDB4MTcsIDB4MTcsCisJMHgxNywgMHgxNywgMHgxOCwgMHgxNiwgMHgxNiwgMHgxNywgMHgwNywgMHgwMCwKKworCTB4MTcsIDB4MTcsIDB4MTcsIDB4MTcsIDB4MTcsIDB4MTcsIDB4MTcsIDB4MTcsCisJMHgxNywgMHgxNywgMHgwNCwgMHgxNiwgMHgxOCwgMHgxNiwgMHgxOCwgMHgxOCwKK307CisKKy8qKgorICogbnRmc19hcmVfbmFtZXNfZXF1YWwgLSBjb21wYXJlIHR3byBVbmljb2RlIG5hbWVzIGZvciBlcXVhbGl0eQorICogQHMxOgkJCW5hbWUgdG8gY29tcGFyZSB0byBAczIKKyAqIEBzMV9sZW46CQlsZW5ndGggaW4gVW5pY29kZSBjaGFyYWN0ZXJzIG9mIEBzMQorICogQHMyOgkJCW5hbWUgdG8gY29tcGFyZSB0byBAczEKKyAqIEBzMl9sZW46CQlsZW5ndGggaW4gVW5pY29kZSBjaGFyYWN0ZXJzIG9mIEBzMgorICogQGljOgkJCWlnbm9yZSBjYXNlIGJvb2wKKyAqIEB1cGNhc2U6CQl1cGNhc2UgdGFibGUgKG9ubHkgaWYgQGljID09IElHTk9SRV9DQVNFKQorICogQHVwY2FzZV9zaXplOglsZW5ndGggaW4gVW5pY29kZSBjaGFyYWN0ZXJzIG9mIEB1cGNhc2UgKGlmIHByZXNlbnQpCisgKgorICogQ29tcGFyZSB0aGUgbmFtZXMgQHMxIGFuZCBAczIgYW5kIHJldHVybiBUUlVFICgxKSBpZiB0aGUgbmFtZXMgYXJlCisgKiBpZGVudGljYWwsIG9yIEZBTFNFICgwKSBpZiB0aGV5IGFyZSBub3QgaWRlbnRpY2FsLiBJZiBAaWMgaXMgSUdOT1JFX0NBU0UsCisgKiB0aGUgQHVwY2FzZSB0YWJsZSBpcyB1c2VkIHRvIHBlcmZvcm1hIGEgY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uLgorICovCitCT09MIG50ZnNfYXJlX25hbWVzX2VxdWFsKGNvbnN0IG50ZnNjaGFyICpzMSwgc2l6ZV90IHMxX2xlbiwKKwkJY29uc3QgbnRmc2NoYXIgKnMyLCBzaXplX3QgczJfbGVuLCBjb25zdCBJR05PUkVfQ0FTRV9CT09MIGljLAorCQljb25zdCBudGZzY2hhciAqdXBjYXNlLCBjb25zdCB1MzIgdXBjYXNlX3NpemUpCit7CisJaWYgKHMxX2xlbiAhPSBzMl9sZW4pCisJCXJldHVybiBGQUxTRTsKKwlpZiAoaWMgPT0gQ0FTRV9TRU5TSVRJVkUpCisJCXJldHVybiAhbnRmc191Y3NuY21wKHMxLCBzMiwgczFfbGVuKTsKKwlyZXR1cm4gIW50ZnNfdWNzbmNhc2VjbXAoczEsIHMyLCBzMV9sZW4sIHVwY2FzZSwgdXBjYXNlX3NpemUpOworfQorCisvKioKKyAqIG50ZnNfY29sbGF0ZV9uYW1lcyAtIGNvbGxhdGUgdHdvIFVuaWNvZGUgbmFtZXMKKyAqIEBuYW1lMToJZmlyc3QgVW5pY29kZSBuYW1lIHRvIGNvbXBhcmUKKyAqIEBuYW1lMjoJc2Vjb25kIFVuaWNvZGUgbmFtZSB0byBjb21wYXJlCisgKiBAZXJyX3ZhbDoJaWYgQG5hbWUxIGNvbnRhaW5zIGFuIGludmFsaWQgY2hhcmFjdGVyIHJldHVybiB0aGlzIHZhbHVlCisgKiBAaWM6CQllaXRoZXIgQ0FTRV9TRU5TSVRJVkUgb3IgSUdOT1JFX0NBU0UKKyAqIEB1cGNhc2U6CXVwY2FzZSB0YWJsZSAoaWdub3JlZCBpZiBAaWMgaXMgQ0FTRV9TRU5TSVRJVkUpCisgKiBAdXBjYXNlX2xlbjoJdXBjYXNlIHRhYmxlIHNpemUgKGlnbm9yZWQgaWYgQGljIGlzIENBU0VfU0VOU0lUSVZFKQorICoKKyAqIG50ZnNfY29sbGF0ZV9uYW1lcyBjb2xsYXRlcyB0d28gVW5pY29kZSBuYW1lcyBhbmQgcmV0dXJuczoKKyAqCisgKiAgLTEgaWYgdGhlIGZpcnN0IG5hbWUgY29sbGF0ZXMgYmVmb3JlIHRoZSBzZWNvbmQgb25lLAorICogICAwIGlmIHRoZSBuYW1lcyBtYXRjaCwKKyAqICAgMSBpZiB0aGUgc2Vjb25kIG5hbWUgY29sbGF0ZXMgYmVmb3JlIHRoZSBmaXJzdCBvbmUsIG9yCisgKiBAZXJyX3ZhbCBpZiBhbiBpbnZhbGlkIGNoYXJhY3RlciBpcyBmb3VuZCBpbiBAbmFtZTEgZHVyaW5nIHRoZSBjb21wYXJpc29uLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycyBhcmUgY29uc2lkZXJlZCBpbnZhbGlkOiAnIicsICcqJywgJzwnLCAnPicgYW5kICc/Jy4KKyAqLworaW50IG50ZnNfY29sbGF0ZV9uYW1lcyhjb25zdCBudGZzY2hhciAqbmFtZTEsIGNvbnN0IHUzMiBuYW1lMV9sZW4sCisJCWNvbnN0IG50ZnNjaGFyICpuYW1lMiwgY29uc3QgdTMyIG5hbWUyX2xlbiwKKwkJY29uc3QgaW50IGVycl92YWwsIGNvbnN0IElHTk9SRV9DQVNFX0JPT0wgaWMsCisJCWNvbnN0IG50ZnNjaGFyICp1cGNhc2UsIGNvbnN0IHUzMiB1cGNhc2VfbGVuKQoreworCXUzMiBjbnQsIG1pbl9sZW47CisJdTE2IGMxLCBjMjsKKworCW1pbl9sZW4gPSBuYW1lMV9sZW47CisJaWYgKG5hbWUxX2xlbiA+IG5hbWUyX2xlbikKKwkJbWluX2xlbiA9IG5hbWUyX2xlbjsKKwlmb3IgKGNudCA9IDA7IGNudCA8IG1pbl9sZW47ICsrY250KSB7CisJCWMxID0gbGUxNl90b19jcHUoKm5hbWUxKyspOworCQljMiA9IGxlMTZfdG9fY3B1KCpuYW1lMisrKTsKKwkJaWYgKGljKSB7CisJCQlpZiAoYzEgPCB1cGNhc2VfbGVuKQorCQkJCWMxID0gbGUxNl90b19jcHUodXBjYXNlW2MxXSk7CisJCQlpZiAoYzIgPCB1cGNhc2VfbGVuKQorCQkJCWMyID0gbGUxNl90b19jcHUodXBjYXNlW2MyXSk7CisJCX0KKwkJaWYgKGMxIDwgNjQgJiYgbGVnYWxfYW5zaV9jaGFyX2FycmF5W2MxXSAmIDgpCisJCQlyZXR1cm4gZXJyX3ZhbDsKKwkJaWYgKGMxIDwgYzIpCisJCQlyZXR1cm4gLTE7CisJCWlmIChjMSA+IGMyKQorCQkJcmV0dXJuIDE7CisJfQorCWlmIChuYW1lMV9sZW4gPCBuYW1lMl9sZW4pCisJCXJldHVybiAtMTsKKwlpZiAobmFtZTFfbGVuID09IG5hbWUyX2xlbikKKwkJcmV0dXJuIDA7CisJLyogbmFtZTFfbGVuID4gbmFtZTJfbGVuICovCisJYzEgPSBsZTE2X3RvX2NwdSgqbmFtZTEpOworCWlmIChjMSA8IDY0ICYmIGxlZ2FsX2Fuc2lfY2hhcl9hcnJheVtjMV0gJiA4KQorCQlyZXR1cm4gZXJyX3ZhbDsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBudGZzX3Vjc25jbXAgLSBjb21wYXJlIHR3byBsaXR0bGUgZW5kaWFuIFVuaWNvZGUgc3RyaW5ncworICogQHMxOgkJZmlyc3Qgc3RyaW5nCisgKiBAczI6CQlzZWNvbmQgc3RyaW5nCisgKiBAbjoJCW1heGltdW0gdW5pY29kZSBjaGFyYWN0ZXJzIHRvIGNvbXBhcmUKKyAqCisgKiBDb21wYXJlIHRoZSBmaXJzdCBAbiBjaGFyYWN0ZXJzIG9mIHRoZSBVbmljb2RlIHN0cmluZ3MgQHMxIGFuZCBAczIsCisgKiBUaGUgc3RyaW5ncyBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCBhbmQgYXBwcm9wcmlhdGUgbGUxNl90b19jcHUoKQorICogY29udmVyc2lvbiBpcyBwZXJmb3JtZWQgb24gbm9uLWxpdHRsZSBlbmRpYW4gbWFjaGluZXMuCisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZWdlciBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gemVybworICogaWYgQHMxIChvciB0aGUgZmlyc3QgQG4gVW5pY29kZSBjaGFyYWN0ZXJzIHRoZXJlb2YpIGlzIGZvdW5kLCByZXNwZWN0aXZlbHksCisgKiB0byBiZSBsZXNzIHRoYW4sIHRvIG1hdGNoLCBvciBiZSBncmVhdGVyIHRoYW4gQHMyLgorICovCitpbnQgbnRmc191Y3NuY21wKGNvbnN0IG50ZnNjaGFyICpzMSwgY29uc3QgbnRmc2NoYXIgKnMyLCBzaXplX3QgbikKK3sKKwl1MTYgYzEsIGMyOworCXNpemVfdCBpOworCisJZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworCQljMSA9IGxlMTZfdG9fY3B1KHMxW2ldKTsKKwkJYzIgPSBsZTE2X3RvX2NwdShzMltpXSk7CisJCWlmIChjMSA8IGMyKQorCQkJcmV0dXJuIC0xOworCQlpZiAoYzEgPiBjMikKKwkJCXJldHVybiAxOworCQlpZiAoIWMxKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIG50ZnNfdWNzbmNhc2VjbXAgLSBjb21wYXJlIHR3byBsaXR0bGUgZW5kaWFuIFVuaWNvZGUgc3RyaW5ncywgaWdub3JpbmcgY2FzZQorICogQHMxOgkJCWZpcnN0IHN0cmluZworICogQHMyOgkJCXNlY29uZCBzdHJpbmcKKyAqIEBuOgkJCW1heGltdW0gdW5pY29kZSBjaGFyYWN0ZXJzIHRvIGNvbXBhcmUKKyAqIEB1cGNhc2U6CQl1cGNhc2UgdGFibGUKKyAqIEB1cGNhc2Vfc2l6ZToJdXBjYXNlIHRhYmxlIHNpemUgaW4gVW5pY29kZSBjaGFyYWN0ZXJzCisgKgorICogQ29tcGFyZSB0aGUgZmlyc3QgQG4gY2hhcmFjdGVycyBvZiB0aGUgVW5pY29kZSBzdHJpbmdzIEBzMSBhbmQgQHMyLAorICogaWdub3JpbmcgY2FzZS4gVGhlIHN0cmluZ3MgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQgYW5kIGFwcHJvcHJpYXRlCisgKiBsZTE2X3RvX2NwdSgpIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkIG9uIG5vbi1saXR0bGUgZW5kaWFuIG1hY2hpbmVzLgorICoKKyAqIEVhY2ggY2hhcmFjdGVyIGlzIHVwcGVyY2FzZWQgdXNpbmcgdGhlIEB1cGNhc2UgdGFibGUgYmVmb3JlIHRoZSBjb21wYXJpc29uLgorICoKKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIGludGVnZXIgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHplcm8KKyAqIGlmIEBzMSAob3IgdGhlIGZpcnN0IEBuIFVuaWNvZGUgY2hhcmFjdGVycyB0aGVyZW9mKSBpcyBmb3VuZCwgcmVzcGVjdGl2ZWx5LAorICogdG8gYmUgbGVzcyB0aGFuLCB0byBtYXRjaCwgb3IgYmUgZ3JlYXRlciB0aGFuIEBzMi4KKyAqLworaW50IG50ZnNfdWNzbmNhc2VjbXAoY29uc3QgbnRmc2NoYXIgKnMxLCBjb25zdCBudGZzY2hhciAqczIsIHNpemVfdCBuLAorCQljb25zdCBudGZzY2hhciAqdXBjYXNlLCBjb25zdCB1MzIgdXBjYXNlX3NpemUpCit7CisJc2l6ZV90IGk7CisJdTE2IGMxLCBjMjsKKworCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKwkJaWYgKChjMSA9IGxlMTZfdG9fY3B1KHMxW2ldKSkgPCB1cGNhc2Vfc2l6ZSkKKwkJCWMxID0gbGUxNl90b19jcHUodXBjYXNlW2MxXSk7CisJCWlmICgoYzIgPSBsZTE2X3RvX2NwdShzMltpXSkpIDwgdXBjYXNlX3NpemUpCisJCQljMiA9IGxlMTZfdG9fY3B1KHVwY2FzZVtjMl0pOworCQlpZiAoYzEgPCBjMikKKwkJCXJldHVybiAtMTsKKwkJaWYgKGMxID4gYzIpCisJCQlyZXR1cm4gMTsKKwkJaWYgKCFjMSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBudGZzX3VwY2FzZV9uYW1lKG50ZnNjaGFyICpuYW1lLCB1MzIgbmFtZV9sZW4sIGNvbnN0IG50ZnNjaGFyICp1cGNhc2UsCisJCWNvbnN0IHUzMiB1cGNhc2VfbGVuKQoreworCXUzMiBpOworCXUxNiB1OworCisJZm9yIChpID0gMDsgaSA8IG5hbWVfbGVuOyBpKyspCisJCWlmICgodSA9IGxlMTZfdG9fY3B1KG5hbWVbaV0pKSA8IHVwY2FzZV9sZW4pCisJCQluYW1lW2ldID0gdXBjYXNlW3VdOworfQorCit2b2lkIG50ZnNfZmlsZV91cGNhc2VfdmFsdWUoRklMRV9OQU1FX0FUVFIgKmZpbGVfbmFtZV9hdHRyLAorCQljb25zdCBudGZzY2hhciAqdXBjYXNlLCBjb25zdCB1MzIgdXBjYXNlX2xlbikKK3sKKwludGZzX3VwY2FzZV9uYW1lKChudGZzY2hhciopJmZpbGVfbmFtZV9hdHRyLT5maWxlX25hbWUsCisJCQlmaWxlX25hbWVfYXR0ci0+ZmlsZV9uYW1lX2xlbmd0aCwgdXBjYXNlLCB1cGNhc2VfbGVuKTsKK30KKworaW50IG50ZnNfZmlsZV9jb21wYXJlX3ZhbHVlcyhGSUxFX05BTUVfQVRUUiAqZmlsZV9uYW1lX2F0dHIxLAorCQlGSUxFX05BTUVfQVRUUiAqZmlsZV9uYW1lX2F0dHIyLAorCQljb25zdCBpbnQgZXJyX3ZhbCwgY29uc3QgSUdOT1JFX0NBU0VfQk9PTCBpYywKKwkJY29uc3QgbnRmc2NoYXIgKnVwY2FzZSwgY29uc3QgdTMyIHVwY2FzZV9sZW4pCit7CisJcmV0dXJuIG50ZnNfY29sbGF0ZV9uYW1lcygobnRmc2NoYXIqKSZmaWxlX25hbWVfYXR0cjEtPmZpbGVfbmFtZSwKKwkJCWZpbGVfbmFtZV9hdHRyMS0+ZmlsZV9uYW1lX2xlbmd0aCwKKwkJCShudGZzY2hhciopJmZpbGVfbmFtZV9hdHRyMi0+ZmlsZV9uYW1lLAorCQkJZmlsZV9uYW1lX2F0dHIyLT5maWxlX25hbWVfbGVuZ3RoLAorCQkJZXJyX3ZhbCwgaWMsIHVwY2FzZSwgdXBjYXNlX2xlbik7Cit9CisKKy8qKgorICogbnRmc19ubHN0b3VjcyAtIGNvbnZlcnQgTkxTIHN0cmluZyB0byBsaXR0bGUgZW5kaWFuIFVuaWNvZGUgc3RyaW5nCisgKiBAdm9sOgludGZzIHZvbHVtZSB3aGljaCB3ZSBhcmUgd29ya2luZyB3aXRoCisgKiBAaW5zOglpbnB1dCBOTFMgc3RyaW5nIGJ1ZmZlcgorICogQGluc19sZW46CWxlbmd0aCBvZiBpbnB1dCBzdHJpbmcgaW4gYnl0ZXMKKyAqIEBvdXRzOglvbiByZXR1cm4gY29udGFpbnMgdGhlIGFsbG9jYXRlZCBvdXRwdXQgVW5pY29kZSBzdHJpbmcgYnVmZmVyCisgKgorICogQ29udmVydCB0aGUgaW5wdXQgc3RyaW5nIEBpbnMsIHdoaWNoIGlzIGluIHdoYXRldmVyIGZvcm1hdCB0aGUgbG9hZGVkIE5MUworICogbWFwIGRpY3RhdGVzLCBpbnRvIGEgbGl0dGxlIGVuZGlhbiwgMi1ieXRlIFVuaWNvZGUgc3RyaW5nLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIHRoZSBzdHJpbmcgYW5kIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCisgKiBjYWxsaW5nIGttZW1fY2FjaGVfZnJlZShudGZzX25hbWVfY2FjaGUsIEBvdXRzKTsgd2hlbiBmaW5pc2hlZCB3aXRoIGl0LgorICoKKyAqIE9uIHN1Y2Nlc3MgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBVbmljb2RlIGNoYXJhY3RlcnMgd3JpdHRlbiB0bworICogdGhlIG91dHB1dCBzdHJpbmcgKkBvdXRzICg+PSAwKSwgbm90IGNvdW50aW5nIHRoZSB0ZXJtaW5hdGluZyBVbmljb2RlIE5VTEwKKyAqIGNoYXJhY3Rlci4gKkBvdXRzIGlzIHNldCB0byB0aGUgYWxsb2NhdGVkIG91dHB1dCBzdHJpbmcgYnVmZmVyLgorICoKKyAqIE9uIGVycm9yLCBhIG5lZ2F0aXZlIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBlcnJvciBjb2RlIGlzIHJldHVybmVkLiBJbgorICogdGhhdCBjYXNlIHRoZSBvdXRwdXQgc3RyaW5nIGlzIG5vdCBhbGxvY2F0ZWQuIEJvdGggKkBvdXRzIGFuZCAqQG91dHNfbGVuCisgKiBhcmUgdGhlbiB1bmRlZmluZWQuCisgKgorICogVGhpcyBtaWdodCBsb29rIGEgYml0IG9kZCBkdWUgdG8gZmFzdCBwYXRoIG9wdGltaXphdGlvbi4uLgorICovCitpbnQgbnRmc19ubHN0b3Vjcyhjb25zdCBudGZzX3ZvbHVtZSAqdm9sLCBjb25zdCBjaGFyICppbnMsCisJCWNvbnN0IGludCBpbnNfbGVuLCBudGZzY2hhciAqKm91dHMpCit7CisJc3RydWN0IG5sc190YWJsZSAqbmxzID0gdm9sLT5ubHNfbWFwOworCW50ZnNjaGFyICp1Y3M7CisJd2NoYXJfdCB3YzsKKwlpbnQgaSwgbywgd2NfbGVuOworCisJLyogV2UgZG9uJ3QgdHJ1c3Qgb3V0c2lkZSBzb3VyY2VzLiAqLworCWlmIChpbnMpIHsKKwkJdWNzID0gKG50ZnNjaGFyKilrbWVtX2NhY2hlX2FsbG9jKG50ZnNfbmFtZV9jYWNoZSwgU0xBQl9OT0ZTKTsKKwkJaWYgKHVjcykgeworCQkJZm9yIChpID0gbyA9IDA7IGkgPCBpbnNfbGVuOyBpICs9IHdjX2xlbikgeworCQkJCXdjX2xlbiA9IG5scy0+Y2hhcjJ1bmkoaW5zICsgaSwgaW5zX2xlbiAtIGksCisJCQkJCQkmd2MpOworCQkJCWlmICh3Y19sZW4gPj0gMCkgeworCQkJCQlpZiAod2MpIHsKKwkJCQkJCXVjc1tvKytdID0gY3B1X3RvX2xlMTYod2MpOworCQkJCQkJY29udGludWU7CisJCQkJCX0gLyogZWxzZSAoIXdjKSAqLworCQkJCQlicmVhazsKKwkJCQl9IC8qIGVsc2UgKHdjX2xlbiA8IDApICovCisJCQkJZ290byBjb252ZXJzaW9uX2VycjsKKwkJCX0KKwkJCXVjc1tvXSA9IDA7CisJCQkqb3V0cyA9IHVjczsKKwkJCXJldHVybiBvOworCQl9IC8qIGVsc2UgKCF1Y3MpICovCisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBuYW1lIGZyb20gIgorCQkJCSJudGZzX25hbWVfY2FjaGUhIik7CisJCXJldHVybiAtRU5PTUVNOworCX0gLyogZWxzZSAoIWlucykgKi8KKwludGZzX2Vycm9yKE5VTEwsICJSZWNlaXZlZCBOVUxMIHBvaW50ZXIuIik7CisJcmV0dXJuIC1FSU5WQUw7Citjb252ZXJzaW9uX2VycjoKKwludGZzX2Vycm9yKHZvbC0+c2IsICJOYW1lIHVzaW5nIGNoYXJhY3RlciBzZXQgJXMgY29udGFpbnMgY2hhcmFjdGVycyAiCisJCQkidGhhdCBjYW5ub3QgYmUgY29udmVydGVkIHRvIFVuaWNvZGUuIiwgbmxzLT5jaGFyc2V0KTsKKwlrbWVtX2NhY2hlX2ZyZWUobnRmc19uYW1lX2NhY2hlLCB1Y3MpOworCXJldHVybiAtRUlMU0VROworfQorCisvKioKKyAqIG50ZnNfdWNzdG9ubHMgLSBjb252ZXJ0IGxpdHRsZSBlbmRpYW4gVW5pY29kZSBzdHJpbmcgdG8gTkxTIHN0cmluZworICogQHZvbDoJbnRmcyB2b2x1bWUgd2hpY2ggd2UgYXJlIHdvcmtpbmcgd2l0aAorICogQGluczoJaW5wdXQgVW5pY29kZSBzdHJpbmcgYnVmZmVyCisgKiBAaW5zX2xlbjoJbGVuZ3RoIG9mIGlucHV0IHN0cmluZyBpbiBVbmljb2RlIGNoYXJhY3RlcnMKKyAqIEBvdXRzOglvbiByZXR1cm4gY29udGFpbnMgdGhlIChhbGxvY2F0ZWQpIG91dHB1dCBOTFMgc3RyaW5nIGJ1ZmZlcgorICogQG91dHNfbGVuOglsZW5ndGggb2Ygb3V0cHV0IHN0cmluZyBidWZmZXIgaW4gYnl0ZXMKKyAqCisgKiBDb252ZXJ0IHRoZSBpbnB1dCBsaXR0bGUgZW5kaWFuLCAyLWJ5dGUgVW5pY29kZSBzdHJpbmcgQGlucywgb2YgbGVuZ3RoCisgKiBAaW5zX2xlbiBpbnRvIHRoZSBzdHJpbmcgZm9ybWF0IGRpY3RhdGVkIGJ5IHRoZSBsb2FkZWQgTkxTLgorICoKKyAqIElmICpAb3V0cyBpcyBOVUxMLCB0aGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyB0aGUgc3RyaW5nIGFuZCB0aGUgY2FsbGVyIGlzCisgKiByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBrZnJlZSgqQG91dHMpOyB3aGVuIGZpbmlzaGVkIHdpdGggaXQuIEluIHRoaXMgY2FzZQorICogQG91dHNfbGVuIGlzIGlnbm9yZWQgYW5kIGNhbiBiZSAwLgorICoKKyAqIE9uIHN1Y2Nlc3MgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQKKyAqIHN0cmluZyAqQG91dHMgKD49IDApLCBub3QgY291bnRpbmcgdGhlIHRlcm1pbmF0aW5nIE5VTEwgYnl0ZS4gSWYgdGhlIG91dHB1dAorICogc3RyaW5nIGJ1ZmZlciB3YXMgYWxsb2NhdGVkLCAqQG91dHMgaXMgc2V0IHRvIGl0LgorICoKKyAqIE9uIGVycm9yLCBhIG5lZ2F0aXZlIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBlcnJvciBjb2RlIGlzIHJldHVybmVkLiBJbgorICogdGhhdCBjYXNlIHRoZSBvdXRwdXQgc3RyaW5nIGlzIG5vdCBhbGxvY2F0ZWQuIFRoZSBjb250ZW50cyBvZiAqQG91dHMgYXJlCisgKiB0aGVuIHVuZGVmaW5lZC4KKyAqCisgKiBUaGlzIG1pZ2h0IGxvb2sgYSBiaXQgb2RkIGR1ZSB0byBmYXN0IHBhdGggb3B0aW1pemF0aW9uLi4uCisgKi8KK2ludCBudGZzX3Vjc3RvbmxzKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsIGNvbnN0IG50ZnNjaGFyICppbnMsCisJCWNvbnN0IGludCBpbnNfbGVuLCB1bnNpZ25lZCBjaGFyICoqb3V0cywgaW50IG91dHNfbGVuKQoreworCXN0cnVjdCBubHNfdGFibGUgKm5scyA9IHZvbC0+bmxzX21hcDsKKwl1bnNpZ25lZCBjaGFyICpuczsKKwlpbnQgaSwgbywgbnNfbGVuLCB3YzsKKworCS8qIFdlIGRvbid0IHRydXN0IG91dHNpZGUgc291cmNlcy4gKi8KKwlpZiAoaW5zKSB7CisJCW5zID0gKm91dHM7CisJCW5zX2xlbiA9IG91dHNfbGVuOworCQlpZiAobnMgJiYgIW5zX2xlbikgeworCQkJd2MgPSAtRU5BTUVUT09MT05HOworCQkJZ290byBjb252ZXJzaW9uX2VycjsKKwkJfQorCQlpZiAoIW5zKSB7CisJCQluc19sZW4gPSBpbnNfbGVuICogTkxTX01BWF9DSEFSU0VUX1NJWkU7CisJCQlucyA9ICh1bnNpZ25lZCBjaGFyKilrbWFsbG9jKG5zX2xlbiArIDEsIEdGUF9OT0ZTKTsKKwkJCWlmICghbnMpCisJCQkJZ290byBtZW1fZXJyX291dDsKKwkJfQorCQlmb3IgKGkgPSBvID0gMDsgaSA8IGluc19sZW47IGkrKykgeworcmV0cnk6CQkJd2MgPSBubHMtPnVuaTJjaGFyKGxlMTZfdG9fY3B1KGluc1tpXSksIG5zICsgbywKKwkJCQkJbnNfbGVuIC0gbyk7CisJCQlpZiAod2MgPiAwKSB7CisJCQkJbyArPSB3YzsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAoIXdjKQorCQkJCWJyZWFrOworCQkJZWxzZSBpZiAod2MgPT0gLUVOQU1FVE9PTE9ORyAmJiBucyAhPSAqb3V0cykgeworCQkJCXVuc2lnbmVkIGNoYXIgKnRjOworCQkJCS8qIEdyb3cgaW4gbXVsdGlwbGVzIG9mIDY0IGJ5dGVzLiAqLworCQkJCXRjID0gKHVuc2lnbmVkIGNoYXIqKWttYWxsb2MoKG5zX2xlbiArIDY0KSAmCisJCQkJCQl+NjMsIEdGUF9OT0ZTKTsKKwkJCQlpZiAodGMpIHsKKwkJCQkJbWVtY3B5KHRjLCBucywgbnNfbGVuKTsKKwkJCQkJbnNfbGVuID0gKChuc19sZW4gKyA2NCkgJiB+NjMpIC0gMTsKKwkJCQkJa2ZyZWUobnMpOworCQkJCQlucyA9IHRjOworCQkJCQlnb3RvIHJldHJ5OworCQkJCX0gLyogTm8gbWVtb3J5IHNvIGdvdG8gY29udmVyc2lvbl9lcnJvcjsgKi8KKwkJCX0gLyogd2MgPCAwLCByZWFsIGVycm9yLiAqLworCQkJZ290byBjb252ZXJzaW9uX2VycjsKKwkJfQorCQluc1tvXSA9IDA7CisJCSpvdXRzID0gbnM7CisJCXJldHVybiBvOworCX0gLyogZWxzZSAoIWlucykgKi8KKwludGZzX2Vycm9yKHZvbC0+c2IsICJSZWNlaXZlZCBOVUxMIHBvaW50ZXIuIik7CisJcmV0dXJuIC1FSU5WQUw7Citjb252ZXJzaW9uX2VycjoKKwludGZzX2Vycm9yKHZvbC0+c2IsICJVbmljb2RlIG5hbWUgY29udGFpbnMgY2hhcmFjdGVycyB0aGF0IGNhbm5vdCBiZSAiCisJCQkiY29udmVydGVkIHRvIGNoYXJhY3RlciBzZXQgJXMuIiwgbmxzLT5jaGFyc2V0KTsKKwlpZiAobnMgIT0gKm91dHMpCisJCWtmcmVlKG5zKTsKKwlpZiAod2MgIT0gLUVOQU1FVE9PTE9ORykKKwkJd2MgPSAtRUlMU0VROworCXJldHVybiB3YzsKK21lbV9lcnJfb3V0OgorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBuYW1lISIpOworCXJldHVybiAtRU5PTUVNOworfQpkaWZmIC0tZ2l0IGEvZnMvbnRmcy91cGNhc2UuYyBiL2ZzL250ZnMvdXBjYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc5Y2RmMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvdXBjYXNlLmMKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIHVwY2FzZS5jIC0gR2VuZXJhdGUgdGhlIGZ1bGwgTlRGUyBVbmljb2RlIHVwY2FzZSB0YWJsZSBpbiBsaXR0bGUgZW5kaWFuLgorICoJICAgICAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBSaWNoYXJkIFJ1c3NvbiA8bnRmc0BmbGF0Y2FwLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIE1vZGlmaWVkIGZvciBta250ZnMgaW5jbHVzaW9uIDkgSnVuZSAyMDAxIGJ5IEFudG9uIEFsdGFwYXJtYWtvdi4KKyAqIE1vZGlmaWVkIGZvciBrZXJuZWwgaW5jbHVzaW9uIDEwIFNlcHRlbWJlciAyMDAxIGJ5IEFudG9uIEFsdHBhcm1ha292LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUyBzb3VyY2UKKyAqIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgIm1hbGxvYy5oIgorI2luY2x1ZGUgIm50ZnMuaCIKKworbnRmc2NoYXIgKmdlbmVyYXRlX2RlZmF1bHRfdXBjYXNlKHZvaWQpCit7CisJc3RhdGljIGNvbnN0IGludCB1Y19ydW5fdGFibGVbXVszXSA9IHsgLyogU3RhcnQsIEVuZCwgQWRkICovCisJezB4MDA2MSwgMHgwMDdCLCAgLTMyfSwgezB4MDQ1MSwgMHgwNDVELCAtODB9LCB7MHgxRjcwLCAweDFGNzIsICA3NH0sCisJezB4MDBFMCwgMHgwMEY3LCAgLTMyfSwgezB4MDQ1RSwgMHgwNDYwLCAtODB9LCB7MHgxRjcyLCAweDFGNzYsICA4Nn0sCisJezB4MDBGOCwgMHgwMEZGLCAgLTMyfSwgezB4MDU2MSwgMHgwNTg3LCAtNDh9LCB7MHgxRjc2LCAweDFGNzgsIDEwMH0sCisJezB4MDI1NiwgMHgwMjU4LCAtMjA1fSwgezB4MUYwMCwgMHgxRjA4LCAgIDh9LCB7MHgxRjc4LCAweDFGN0EsIDEyOH0sCisJezB4MDI4QSwgMHgwMjhDLCAtMjE3fSwgezB4MUYxMCwgMHgxRjE2LCAgIDh9LCB7MHgxRjdBLCAweDFGN0MsIDExMn0sCisJezB4MDNBQywgMHgwM0FELCAgLTM4fSwgezB4MUYyMCwgMHgxRjI4LCAgIDh9LCB7MHgxRjdDLCAweDFGN0UsIDEyNn0sCisJezB4MDNBRCwgMHgwM0IwLCAgLTM3fSwgezB4MUYzMCwgMHgxRjM4LCAgIDh9LCB7MHgxRkIwLCAweDFGQjIsICAgOH0sCisJezB4MDNCMSwgMHgwM0MyLCAgLTMyfSwgezB4MUY0MCwgMHgxRjQ2LCAgIDh9LCB7MHgxRkQwLCAweDFGRDIsICAgOH0sCisJezB4MDNDMiwgMHgwM0MzLCAgLTMxfSwgezB4MUY1MSwgMHgxRjUyLCAgIDh9LCB7MHgxRkUwLCAweDFGRTIsICAgOH0sCisJezB4MDNDMywgMHgwM0NDLCAgLTMyfSwgezB4MUY1MywgMHgxRjU0LCAgIDh9LCB7MHgxRkU1LCAweDFGRTYsICAgN30sCisJezB4MDNDQywgMHgwM0NELCAgLTY0fSwgezB4MUY1NSwgMHgxRjU2LCAgIDh9LCB7MHgyMTcwLCAweDIxODAsIC0xNn0sCisJezB4MDNDRCwgMHgwM0NGLCAgLTYzfSwgezB4MUY1NywgMHgxRjU4LCAgIDh9LCB7MHgyNEQwLCAweDI0RUEsIC0yNn0sCisJezB4MDQzMCwgMHgwNDUwLCAgLTMyfSwgezB4MUY2MCwgMHgxRjY4LCAgIDh9LCB7MHhGRjQxLCAweEZGNUIsIC0zMn0sCisJezB9CisJfTsKKworCXN0YXRpYyBjb25zdCBpbnQgdWNfZHVwX3RhYmxlW11bMl0gPSB7IC8qIFN0YXJ0LCBFbmQgKi8KKwl7MHgwMTAwLCAweDAxMkZ9LCB7MHgwMUEwLCAweDAxQTZ9LCB7MHgwM0UyLCAweDAzRUZ9LCB7MHgwNENCLCAweDA0Q0N9LAorCXsweDAxMzIsIDB4MDEzN30sIHsweDAxQjMsIDB4MDFCN30sIHsweDA0NjAsIDB4MDQ4MX0sIHsweDA0RDAsIDB4MDRFQn0sCisJezB4MDEzOSwgMHgwMTQ5fSwgezB4MDFDRCwgMHgwMUREfSwgezB4MDQ5MCwgMHgwNEJGfSwgezB4MDRFRSwgMHgwNEY1fSwKKwl7MHgwMTRBLCAweDAxNzh9LCB7MHgwMURFLCAweDAxRUZ9LCB7MHgwNEJGLCAweDA0QkZ9LCB7MHgwNEY4LCAweDA0Rjl9LAorCXsweDAxNzksIDB4MDE3RX0sIHsweDAxRjQsIDB4MDFGNX0sIHsweDA0QzEsIDB4MDRDNH0sIHsweDFFMDAsIDB4MUU5NX0sCisJezB4MDE4QiwgMHgwMThCfSwgezB4MDFGQSwgMHgwMjE4fSwgezB4MDRDNywgMHgwNEM4fSwgezB4MUVBMCwgMHgxRUY5fSwKKwl7MH0KKwl9OworCisJc3RhdGljIGNvbnN0IGludCB1Y193b3JkX3RhYmxlW11bMl0gPSB7IC8qIE9mZnNldCwgVmFsdWUgKi8KKwl7MHgwMEZGLCAweDAxNzh9LCB7MHgwMUFELCAweDAxQUN9LCB7MHgwMUYzLCAweDAxRjF9LCB7MHgwMjY5LCAweDAxOTZ9LAorCXsweDAxODMsIDB4MDE4Mn0sIHsweDAxQjAsIDB4MDFBRn0sIHsweDAyNTMsIDB4MDE4MX0sIHsweDAyNkYsIDB4MDE5Q30sCisJezB4MDE4NSwgMHgwMTg0fSwgezB4MDFCOSwgMHgwMUI4fSwgezB4MDI1NCwgMHgwMTg2fSwgezB4MDI3MiwgMHgwMTlEfSwKKwl7MHgwMTg4LCAweDAxODd9LCB7MHgwMUJELCAweDAxQkN9LCB7MHgwMjU5LCAweDAxOEZ9LCB7MHgwMjc1LCAweDAxOUZ9LAorCXsweDAxOEMsIDB4MDE4Qn0sIHsweDAxQzYsIDB4MDFDNH0sIHsweDAyNUIsIDB4MDE5MH0sIHsweDAyODMsIDB4MDFBOX0sCisJezB4MDE5MiwgMHgwMTkxfSwgezB4MDFDOSwgMHgwMUM3fSwgezB4MDI2MCwgMHgwMTkzfSwgezB4MDI4OCwgMHgwMUFFfSwKKwl7MHgwMTk5LCAweDAxOTh9LCB7MHgwMUNDLCAweDAxQ0F9LCB7MHgwMjYzLCAweDAxOTR9LCB7MHgwMjkyLCAweDAxQjd9LAorCXsweDAxQTgsIDB4MDFBN30sIHsweDAxREQsIDB4MDE4RX0sIHsweDAyNjgsIDB4MDE5N30sCisJezB9CisJfTsKKworCWludCBpLCByOworCW50ZnNjaGFyICp1YzsKKworCXVjID0gbnRmc19tYWxsb2Nfbm9mcyhkZWZhdWx0X3VwY2FzZV9sZW4gKiBzaXplb2YobnRmc2NoYXIpKTsKKwlpZiAoIXVjKQorCQlyZXR1cm4gdWM7CisJbWVtc2V0KHVjLCAwLCBkZWZhdWx0X3VwY2FzZV9sZW4gKiBzaXplb2YobnRmc2NoYXIpKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGVmYXVsdF91cGNhc2VfbGVuOyBpKyspCisJCXVjW2ldID0gY3B1X3RvX2xlMTYoaSk7CisJZm9yIChyID0gMDsgdWNfcnVuX3RhYmxlW3JdWzBdOyByKyspCisJCWZvciAoaSA9IHVjX3J1bl90YWJsZVtyXVswXTsgaSA8IHVjX3J1bl90YWJsZVtyXVsxXTsgaSsrKQorCQkJdWNbaV0gPSBjcHVfdG9fbGUxNigobGUxNl90b19jcHUodWNbaV0pICsKKwkJCQkJdWNfcnVuX3RhYmxlW3JdWzJdKSk7CisJZm9yIChyID0gMDsgdWNfZHVwX3RhYmxlW3JdWzBdOyByKyspCisJCWZvciAoaSA9IHVjX2R1cF90YWJsZVtyXVswXTsgaSA8IHVjX2R1cF90YWJsZVtyXVsxXTsgaSArPSAyKQorCQkJdWNbaSArIDFdID0gY3B1X3RvX2xlMTYobGUxNl90b19jcHUodWNbaSArIDFdKSAtIDEpOworCWZvciAociA9IDA7IHVjX3dvcmRfdGFibGVbcl1bMF07IHIrKykKKwkJdWNbdWNfd29yZF90YWJsZVtyXVswXV0gPSBjcHVfdG9fbGUxNih1Y193b3JkX3RhYmxlW3JdWzFdKTsKKwlyZXR1cm4gdWM7Cit9CmRpZmYgLS1naXQgYS9mcy9udGZzL3ZvbHVtZS5oIGIvZnMvbnRmcy92b2x1bWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yjk3ZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy92b2x1bWUuaApAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIHZvbHVtZS5oIC0gRGVmaW5lcyBmb3Igdm9sdW1lIHN0cnVjdHVyZXMgaW4gTlRGUyBMaW51eCBrZXJuZWwgZHJpdmVyLiBQYXJ0CisgKgkgICAgICBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19WT0xVTUVfSAorI2RlZmluZSBfTElOVVhfTlRGU19WT0xVTUVfSAorCisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKworI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAibGF5b3V0LmgiCisKKy8qCisgKiBUaGUgTlRGUyBpbiBtZW1vcnkgc3VwZXIgYmxvY2sgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJLyoKKwkgKiBGSVhNRTogUmVvcmRlciB0byBoYXZlIGNvbW1vbmx5IHVzZWQgdG9nZXRoZXIgZWxlbWVudCB3aXRoaW4gdGhlCisJICogc2FtZSBjYWNoZSBsaW5lLCBhaW1pbmcgYXQgYSBjYWNoZSBsaW5lIHNpemUgb2YgMzIgYnl0ZXMuIEFpbSBmb3IKKwkgKiA2NCBieXRlcyBmb3IgbGVzcyBjb21tb25seSB1c2VkIHRvZ2V0aGVyIGVsZW1lbnRzLiBQdXQgbW9zdCBjb21tb25seQorCSAqIHVzZWQgZWxlbWVudHMgdG8gZnJvbnQgb2Ygc3RydWN0dXJlLiBPYnZpb3VzbHkgZG8gdGhpcyBvbmx5IHdoZW4gdGhlCisJICogc3RydWN0dXJlIGhhcyBzdGFiaWxpemVkLi4uIChBSUEpCisJICovCisJLyogRGV2aWNlIHNwZWNpZmljcy4gKi8KKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwkJLyogUG9pbnRlciBiYWNrIHRvIHRoZSBzdXBlcl9ibG9jaywKKwkJCQkJICAgc28gd2UgZG9uJ3QgaGF2ZSB0byBnZXQgdGhlIG9mZnNldAorCQkJCQkgICBldmVyeSB0aW1lLiAqLworCUxDTiBucl9ibG9ja3M7CQkJLyogTnVtYmVyIG9mIE5URlNfQkxPQ0tfU0laRSBieXRlcworCQkJCQkgICBzaXplZCBibG9ja3Mgb24gdGhlIGRldmljZS4gKi8KKwkvKiBDb25maWd1cmF0aW9uIHByb3ZpZGVkIGJ5IHVzZXIgYXQgbW91bnQgdGltZS4gKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogTWlzY2VsbGFuZW91cyBmbGFncywgc2VlIGJlbG93LiAqLworCXVpZF90IHVpZDsJCQkvKiB1aWQgdGhhdCBmaWxlcyB3aWxsIGJlIG1vdW50ZWQgYXMuICovCisJZ2lkX3QgZ2lkOwkJCS8qIGdpZCB0aGF0IGZpbGVzIHdpbGwgYmUgbW91bnRlZCBhcy4gKi8KKwltb2RlX3QgZm1hc2s7CQkJLyogVGhlIG1hc2sgZm9yIGZpbGUgcGVybWlzc2lvbnMuICovCisJbW9kZV90IGRtYXNrOwkJCS8qIFRoZSBtYXNrIGZvciBkaXJlY3RvcnkKKwkJCQkJICAgcGVybWlzc2lvbnMuICovCisJdTggbWZ0X3pvbmVfbXVsdGlwbGllcjsJCS8qIEluaXRpYWwgbWZ0IHpvbmUgbXVsdGlwbGllci4gKi8KKwl1OCBvbl9lcnJvcnM7CQkJLyogV2hhdCB0byBkbyBvbiBmaWxlIHN5c3RlbSBlcnJvcnMuICovCisJLyogTlRGUyBib290c2VjdG9yIHByb3ZpZGVkIGluZm9ybWF0aW9uLiAqLworCXUxNiBzZWN0b3Jfc2l6ZTsJCS8qIGluIGJ5dGVzICovCisJdTggc2VjdG9yX3NpemVfYml0czsJCS8qIGxvZzIoc2VjdG9yX3NpemUpICovCisJdTMyIGNsdXN0ZXJfc2l6ZTsJCS8qIGluIGJ5dGVzICovCisJdTMyIGNsdXN0ZXJfc2l6ZV9tYXNrOwkJLyogY2x1c3Rlcl9zaXplIC0gMSAqLworCXU4IGNsdXN0ZXJfc2l6ZV9iaXRzOwkJLyogbG9nMihjbHVzdGVyX3NpemUpICovCisJdTMyIG1mdF9yZWNvcmRfc2l6ZTsJCS8qIGluIGJ5dGVzICovCisJdTMyIG1mdF9yZWNvcmRfc2l6ZV9tYXNrOwkvKiBtZnRfcmVjb3JkX3NpemUgLSAxICovCisJdTggbWZ0X3JlY29yZF9zaXplX2JpdHM7CS8qIGxvZzIobWZ0X3JlY29yZF9zaXplKSAqLworCXUzMiBpbmRleF9yZWNvcmRfc2l6ZTsJCS8qIGluIGJ5dGVzICovCisJdTMyIGluZGV4X3JlY29yZF9zaXplX21hc2s7CS8qIGluZGV4X3JlY29yZF9zaXplIC0gMSAqLworCXU4IGluZGV4X3JlY29yZF9zaXplX2JpdHM7CS8qIGxvZzIoaW5kZXhfcmVjb3JkX3NpemUpICovCisJTENOIG5yX2NsdXN0ZXJzOwkJLyogVm9sdW1lIHNpemUgaW4gY2x1c3RlcnMgPT0gbnVtYmVyIG9mCisJCQkJCSAgIGJpdHMgaW4gbGNuIGJpdG1hcC4gKi8KKwlMQ04gbWZ0X2xjbjsJCQkvKiBDbHVzdGVyIGxvY2F0aW9uIG9mIG1mdCBkYXRhLiAqLworCUxDTiBtZnRtaXJyX2xjbjsJCS8qIENsdXN0ZXIgbG9jYXRpb24gb2YgY29weSBvZiBtZnQuICovCisJdTY0IHNlcmlhbF9ubzsJCQkvKiBUaGUgdm9sdW1lIHNlcmlhbCBudW1iZXIuICovCisJLyogTW91bnQgc3BlY2lmaWMgTlRGUyBpbmZvcm1hdGlvbi4gKi8KKwl1MzIgdXBjYXNlX2xlbjsJCQkvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB1cGNhc2VbXS4gKi8KKwludGZzY2hhciAqdXBjYXNlOwkJLyogVGhlIHVwY2FzZSB0YWJsZS4gKi8KKworCXMzMiBhdHRyZGVmX3NpemU7CQkvKiBTaXplIG9mIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbgorCQkJCQkgICB0YWJsZSBpbiBieXRlcy4gKi8KKwlBVFRSX0RFRiAqYXR0cmRlZjsJCS8qIFRhYmxlIG9mIGF0dHJpYnV0ZSBkZWZpbml0aW9ucy4KKwkJCQkJICAgT2J0YWluZWQgZnJvbSBGSUxFX0F0dHJEZWYuICovCisKKyNpZmRlZiBOVEZTX1JXCisJLyogVmFyaWFibGVzIHVzZWQgYnkgdGhlIGNsdXN0ZXIgYW5kIG1mdCBhbGxvY2F0b3JzLiAqLworCXM2NCBtZnRfZGF0YV9wb3M7CQkvKiBNZnQgcmVjb3JkIG51bWJlciBhdCB3aGljaCB0bworCQkJCQkgICBhbGxvY2F0ZSB0aGUgbmV4dCBtZnQgcmVjb3JkLiAqLworCUxDTiBtZnRfem9uZV9zdGFydDsJCS8qIEZpcnN0IGNsdXN0ZXIgb2YgdGhlIG1mdCB6b25lLiAqLworCUxDTiBtZnRfem9uZV9lbmQ7CQkvKiBGaXJzdCBjbHVzdGVyIGJleW9uZCB0aGUgbWZ0IHpvbmUuICovCisJTENOIG1mdF96b25lX3BvczsJCS8qIEN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIG1mdCB6b25lLiAqLworCUxDTiBkYXRhMV96b25lX3BvczsJCS8qIEN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGZpcnN0IGRhdGEKKwkJCQkJICAgem9uZS4gKi8KKwlMQ04gZGF0YTJfem9uZV9wb3M7CQkvKiBDdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzZWNvbmQgZGF0YQorCQkJCQkgICB6b25lLiAqLworI2VuZGlmIC8qIE5URlNfUlcgKi8KKworCXN0cnVjdCBpbm9kZSAqbWZ0X2lubzsJCS8qIFRoZSBWRlMgaW5vZGUgb2YgJE1GVC4gKi8KKworCXN0cnVjdCBpbm9kZSAqbWZ0Ym1wX2lubzsJLyogQXR0cmlidXRlIGlub2RlIGZvciAkTUZULyRCSVRNQVAuICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZSBtZnRibXBfbG9jazsgLyogTG9jayBmb3Igc2VyaWFsaXppbmcgYWNjZXNzZXMgdG8gdGhlCisJCQkJCSAgICBtZnQgcmVjb3JkIGJpdG1hcCAoJE1GVC8kQklUTUFQKS4gKi8KKyNpZmRlZiBOVEZTX1JXCisJc3RydWN0IGlub2RlICptZnRtaXJyX2lubzsJLyogVGhlIFZGUyBpbm9kZSBvZiAkTUZUTWlyci4gKi8KKwlpbnQgbWZ0bWlycl9zaXplOwkJLyogU2l6ZSBvZiBtZnQgbWlycm9yIGluIG1mdCByZWNvcmRzLiAqLworCisJc3RydWN0IGlub2RlICpsb2dmaWxlX2lubzsJLyogVGhlIFZGUyBpbm9kZSBvZiAkTG9nRmlsZS4gKi8KKyNlbmRpZiAvKiBOVEZTX1JXICovCisKKwlzdHJ1Y3QgaW5vZGUgKmxjbmJtcF9pbm87CS8qIFRoZSBWRlMgaW5vZGUgb2YgJEJpdG1hcC4gKi8KKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIGxjbmJtcF9sb2NrOyAvKiBMb2NrIGZvciBzZXJpYWxpemluZyBhY2Nlc3NlcyB0byB0aGUKKwkJCQkJICAgIGNsdXN0ZXIgYml0bWFwICgkQml0bWFwLyREQVRBKS4gKi8KKworCXN0cnVjdCBpbm9kZSAqdm9sX2lubzsJCS8qIFRoZSBWRlMgaW5vZGUgb2YgJFZvbHVtZS4gKi8KKwlWT0xVTUVfRkxBR1Mgdm9sX2ZsYWdzOwkJLyogVm9sdW1lIGZsYWdzLiAqLworCXU4IG1ham9yX3ZlcjsJCQkvKiBOdGZzIG1ham9yIHZlcnNpb24gb2Ygdm9sdW1lLiAqLworCXU4IG1pbm9yX3ZlcjsJCQkvKiBOdGZzIG1pbm9yIHZlcnNpb24gb2Ygdm9sdW1lLiAqLworCisJc3RydWN0IGlub2RlICpyb290X2lubzsJCS8qIFRoZSBWRlMgaW5vZGUgb2YgdGhlIHJvb3QKKwkJCQkJICAgZGlyZWN0b3J5LiAqLworCXN0cnVjdCBpbm9kZSAqc2VjdXJlX2lubzsJLyogVGhlIFZGUyBpbm9kZSBvZiAkU2VjdXJlIChOVEZTMy4wKworCQkJCQkgICBvbmx5LCBvdGhlcndpc2UgTlVMTCkuICovCisJc3RydWN0IGlub2RlICpleHRlbmRfaW5vOwkvKiBUaGUgVkZTIGlub2RlIG9mICRFeHRlbmQgKE5URlMzLjArCisJCQkJCSAgIG9ubHksIG90aGVyd2lzZSBOVUxMKS4gKi8KKyNpZmRlZiBOVEZTX1JXCisJLyogJFF1b3RhIHN0dWZmIGlzIE5URlMzLjArIHNwZWNpZmljLiAgVW51c2VkL05VTEwgb3RoZXJ3aXNlLiAqLworCXN0cnVjdCBpbm9kZSAqcXVvdGFfaW5vOwkvKiBUaGUgVkZTIGlub2RlIG9mICRRdW90YS4gKi8KKwlzdHJ1Y3QgaW5vZGUgKnF1b3RhX3FfaW5vOwkvKiBBdHRyaWJ1dGUgaW5vZGUgZm9yICRRdW90YS8kUS4gKi8KKyNlbmRpZiAvKiBOVEZTX1JXICovCisJc3RydWN0IG5sc190YWJsZSAqbmxzX21hcDsKK30gbnRmc192b2x1bWU7CisKKy8qCisgKiBEZWZpbmVkIGJpdHMgZm9yIHRoZSBmbGFncyBmaWVsZCBpbiB0aGUgbnRmc192b2x1bWUgc3RydWN0dXJlLgorICovCit0eXBlZGVmIGVudW0geworCU5WX0Vycm9ycywJCS8qIDE6IFZvbHVtZSBoYXMgZXJyb3JzLCBwcmV2ZW50IHJlbW91bnQgcncuICovCisJTlZfU2hvd1N5c3RlbUZpbGVzLAkvKiAxOiBSZXR1cm4gc3lzdGVtIGZpbGVzIGluIG50ZnNfcmVhZGRpcigpLiAqLworCU5WX0Nhc2VTZW5zaXRpdmUsCS8qIDE6IFRyZWF0IGZpbGUgbmFtZXMgYXMgY2FzZSBzZW5zaXRpdmUgYW5kCisJCQkJICAgICAgY3JlYXRlIGZpbGVuYW1lcyBpbiB0aGUgUE9TSVggbmFtZXNwYWNlLgorCQkJCSAgICAgIE90aGVyd2lzZSBiZSBjYXNlIGluc2Vuc2l0aXZlIGFuZCBjcmVhdGUKKwkJCQkgICAgICBmaWxlIG5hbWVzIGluIFdJTjMyIG5hbWVzcGFjZS4gKi8KKwlOVl9Mb2dGaWxlRW1wdHksCS8qIDE6ICRMb2dGaWxlIGpvdXJuYWwgaXMgZW1wdHkuICovCisJTlZfUXVvdGFPdXRPZkRhdGUsCS8qIDE6ICRRdW90YSBpcyBvdXQgb2YgZGF0ZS4gKi8KK30gbnRmc192b2x1bWVfZmxhZ3M7CisKKy8qCisgKiBNYWNybyB0cmlja3MgdG8gZXhwYW5kIHRoZSBOVm9sRm9vKCksIE5Wb2xTZXRGb28oKSwgYW5kIE5Wb2xDbGVhckZvbygpCisgKiBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUgTlZPTF9GTlMoZmxhZykJCQkJCVwKK3N0YXRpYyBpbmxpbmUgaW50IE5Wb2wjI2ZsYWcobnRmc192b2x1bWUgKnZvbCkJCVwKK3sJCQkJCQkJXAorCXJldHVybiB0ZXN0X2JpdChOVl8jI2ZsYWcsICYodm9sKS0+ZmxhZ3MpOwlcCit9CQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCBOVm9sU2V0IyNmbGFnKG50ZnNfdm9sdW1lICp2b2wpCVwKK3sJCQkJCQkJXAorCXNldF9iaXQoTlZfIyNmbGFnLCAmKHZvbCktPmZsYWdzKTsJCVwKK30JCQkJCQkJXAorc3RhdGljIGlubGluZSB2b2lkIE5Wb2xDbGVhciMjZmxhZyhudGZzX3ZvbHVtZSAqdm9sKQlcCit7CQkJCQkJCVwKKwljbGVhcl9iaXQoTlZfIyNmbGFnLCAmKHZvbCktPmZsYWdzKTsJCVwKK30KKworLyogRW1pdCB0aGUgbnRmcyB2b2x1bWUgYml0b3BzIGZ1bmN0aW9ucy4gKi8KK05WT0xfRk5TKEVycm9ycykKK05WT0xfRk5TKFNob3dTeXN0ZW1GaWxlcykKK05WT0xfRk5TKENhc2VTZW5zaXRpdmUpCitOVk9MX0ZOUyhMb2dGaWxlRW1wdHkpCitOVk9MX0ZOUyhRdW90YU91dE9mRGF0ZSkKKworI2VuZGlmIC8qIF9MSU5VWF9OVEZTX1ZPTFVNRV9IICovCmRpZmYgLS1naXQgYS9mcy9vcGVuLmMgYi9mcy9vcGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzYmQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL29wZW4uYwpAQCAtMCwwICsxLDEwNzYgQEAKKy8qCisgKiAgbGludXgvZnMvb3Blbi5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC91dGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvZG5vdGlmeS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworaW50IHZmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlpbnQgcmV0dmFsID0gLUVOT0RFVjsKKworCWlmIChzYikgeworCQlyZXR2YWwgPSAtRU5PU1lTOworCQlpZiAoc2ItPnNfb3AtPnN0YXRmcykgeworCQkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKCpidWYpKTsKKwkJCXJldHZhbCA9IHNlY3VyaXR5X3NiX3N0YXRmcyhzYik7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHVybiByZXR2YWw7CisJCQlyZXR2YWwgPSBzYi0+c19vcC0+c3RhdGZzKHNiLCBidWYpOworCQkJaWYgKHJldHZhbCA9PSAwICYmIGJ1Zi0+Zl9mcnNpemUgPT0gMCkKKwkJCQlidWYtPmZfZnJzaXplID0gYnVmLT5mX2JzaXplOworCQl9CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK0VYUE9SVF9TWU1CT0wodmZzX3N0YXRmcyk7CisKK3N0YXRpYyBpbnQgdmZzX3N0YXRmc19uYXRpdmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHN0YXRmcyAqYnVmKQoreworCXN0cnVjdCBrc3RhdGZzIHN0OworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSB2ZnNfc3RhdGZzKHNiLCAmc3QpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAoc2l6ZW9mKCpidWYpID09IHNpemVvZihzdCkpCisJCW1lbWNweShidWYsICZzdCwgc2l6ZW9mKHN0KSk7CisJZWxzZSB7CisJCWlmIChzaXplb2YgYnVmLT5mX2Jsb2NrcyA9PSA0KSB7CisJCQlpZiAoKHN0LmZfYmxvY2tzIHwgc3QuZl9iZnJlZSB8IHN0LmZfYmF2YWlsKSAmCisJCQkgICAgMHhmZmZmZmZmZjAwMDAwMDAwVUxMKQorCQkJCXJldHVybiAtRU9WRVJGTE9XOworCQkJLyoKKwkJCSAqIGZfZmlsZXMgYW5kIGZfZmZyZWUgbWF5IGJlIC0xOyBpdCdzIG9rYXkgdG8gc3R1ZmYKKwkJCSAqIHRoYXQgaW50byAzMiBiaXRzCisJCQkgKi8KKwkJCWlmIChzdC5mX2ZpbGVzICE9IC0xICYmCisJCQkgICAgKHN0LmZfZmlsZXMgJiAweGZmZmZmZmZmMDAwMDAwMDBVTEwpKQorCQkJCXJldHVybiAtRU9WRVJGTE9XOworCQkJaWYgKHN0LmZfZmZyZWUgIT0gLTEgJiYKKwkJCSAgICAoc3QuZl9mZnJlZSAmIDB4ZmZmZmZmZmYwMDAwMDAwMFVMTCkpCisJCQkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJCX0KKworCQlidWYtPmZfdHlwZSA9IHN0LmZfdHlwZTsKKwkJYnVmLT5mX2JzaXplID0gc3QuZl9ic2l6ZTsKKwkJYnVmLT5mX2Jsb2NrcyA9IHN0LmZfYmxvY2tzOworCQlidWYtPmZfYmZyZWUgPSBzdC5mX2JmcmVlOworCQlidWYtPmZfYmF2YWlsID0gc3QuZl9iYXZhaWw7CisJCWJ1Zi0+Zl9maWxlcyA9IHN0LmZfZmlsZXM7CisJCWJ1Zi0+Zl9mZnJlZSA9IHN0LmZfZmZyZWU7CisJCWJ1Zi0+Zl9mc2lkID0gc3QuZl9mc2lkOworCQlidWYtPmZfbmFtZWxlbiA9IHN0LmZfbmFtZWxlbjsKKwkJYnVmLT5mX2Zyc2l6ZSA9IHN0LmZfZnJzaXplOworCQltZW1zZXQoYnVmLT5mX3NwYXJlLCAwLCBzaXplb2YoYnVmLT5mX3NwYXJlKSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZmc19zdGF0ZnM2NChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qgc3RhdGZzNjQgKmJ1ZikKK3sKKwlzdHJ1Y3Qga3N0YXRmcyBzdDsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gdmZzX3N0YXRmcyhzYiwgJnN0KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKHNpemVvZigqYnVmKSA9PSBzaXplb2Yoc3QpKQorCQltZW1jcHkoYnVmLCAmc3QsIHNpemVvZihzdCkpOworCWVsc2UgeworCQlidWYtPmZfdHlwZSA9IHN0LmZfdHlwZTsKKwkJYnVmLT5mX2JzaXplID0gc3QuZl9ic2l6ZTsKKwkJYnVmLT5mX2Jsb2NrcyA9IHN0LmZfYmxvY2tzOworCQlidWYtPmZfYmZyZWUgPSBzdC5mX2JmcmVlOworCQlidWYtPmZfYmF2YWlsID0gc3QuZl9iYXZhaWw7CisJCWJ1Zi0+Zl9maWxlcyA9IHN0LmZfZmlsZXM7CisJCWJ1Zi0+Zl9mZnJlZSA9IHN0LmZfZmZyZWU7CisJCWJ1Zi0+Zl9mc2lkID0gc3QuZl9mc2lkOworCQlidWYtPmZfbmFtZWxlbiA9IHN0LmZfbmFtZWxlbjsKKwkJYnVmLT5mX2Zyc2l6ZSA9IHN0LmZfZnJzaXplOworCQltZW1zZXQoYnVmLT5mX3NwYXJlLCAwLCBzaXplb2YoYnVmLT5mX3NwYXJlKSk7CisJfQorCXJldHVybiAwOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX3N0YXRmcyhjb25zdCBjaGFyIF9fdXNlciAqIHBhdGgsIHN0cnVjdCBzdGF0ZnMgX191c2VyICogYnVmKQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJaW50IGVycm9yOworCisJZXJyb3IgPSB1c2VyX3BhdGhfd2FsayhwYXRoLCAmbmQpOworCWlmICghZXJyb3IpIHsKKwkJc3RydWN0IHN0YXRmcyB0bXA7CisJCWVycm9yID0gdmZzX3N0YXRmc19uYXRpdmUobmQuZGVudHJ5LT5kX2lub2RlLT5pX3NiLCAmdG1wKTsKKwkJaWYgKCFlcnJvciAmJiBjb3B5X3RvX3VzZXIoYnVmLCAmdG1wLCBzaXplb2YodG1wKSkpCisJCQllcnJvciA9IC1FRkFVTFQ7CisJCXBhdGhfcmVsZWFzZSgmbmQpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKworYXNtbGlua2FnZSBsb25nIHN5c19zdGF0ZnM2NChjb25zdCBjaGFyIF9fdXNlciAqcGF0aCwgc2l6ZV90IHN6LCBzdHJ1Y3Qgc3RhdGZzNjQgX191c2VyICpidWYpCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlsb25nIGVycm9yOworCisJaWYgKHN6ICE9IHNpemVvZigqYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZXJyb3IgPSB1c2VyX3BhdGhfd2FsayhwYXRoLCAmbmQpOworCWlmICghZXJyb3IpIHsKKwkJc3RydWN0IHN0YXRmczY0IHRtcDsKKwkJZXJyb3IgPSB2ZnNfc3RhdGZzNjQobmQuZGVudHJ5LT5kX2lub2RlLT5pX3NiLCAmdG1wKTsKKwkJaWYgKCFlcnJvciAmJiBjb3B5X3RvX3VzZXIoYnVmLCAmdG1wLCBzaXplb2YodG1wKSkpCisJCQllcnJvciA9IC1FRkFVTFQ7CisJCXBhdGhfcmVsZWFzZSgmbmQpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKworYXNtbGlua2FnZSBsb25nIHN5c19mc3RhdGZzKHVuc2lnbmVkIGludCBmZCwgc3RydWN0IHN0YXRmcyBfX3VzZXIgKiBidWYpCit7CisJc3RydWN0IGZpbGUgKiBmaWxlOworCXN0cnVjdCBzdGF0ZnMgdG1wOworCWludCBlcnJvcjsKKworCWVycm9yID0gLUVCQURGOworCWZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gb3V0OworCWVycm9yID0gdmZzX3N0YXRmc19uYXRpdmUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2IsICZ0bXApOworCWlmICghZXJyb3IgJiYgY29weV90b191c2VyKGJ1ZiwgJnRtcCwgc2l6ZW9mKHRtcCkpKQorCQllcnJvciA9IC1FRkFVTFQ7CisJZnB1dChmaWxlKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfZnN0YXRmczY0KHVuc2lnbmVkIGludCBmZCwgc2l6ZV90IHN6LCBzdHJ1Y3Qgc3RhdGZzNjQgX191c2VyICpidWYpCit7CisJc3RydWN0IGZpbGUgKiBmaWxlOworCXN0cnVjdCBzdGF0ZnM2NCB0bXA7CisJaW50IGVycm9yOworCisJaWYgKHN6ICE9IHNpemVvZigqYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnJvciA9IC1FQkFERjsKKwlmaWxlID0gZmdldChmZCk7CisJaWYgKCFmaWxlKQorCQlnb3RvIG91dDsKKwllcnJvciA9IHZmc19zdGF0ZnM2NChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYiwgJnRtcCk7CisJaWYgKCFlcnJvciAmJiBjb3B5X3RvX3VzZXIoYnVmLCAmdG1wLCBzaXplb2YodG1wKSkpCisJCWVycm9yID0gLUVGQVVMVDsKKwlmcHV0KGZpbGUpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworaW50IGRvX3RydW5jYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgbG9mZl90IGxlbmd0aCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBpYXR0ciBuZXdhdHRyczsKKworCS8qIE5vdCBwcmV0dHk6ICJpbm9kZS0+aV9zaXplIiBzaG91bGRuJ3QgcmVhbGx5IGJlIHNpZ25lZC4gQnV0IGl0IGlzLiAqLworCWlmIChsZW5ndGggPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5ld2F0dHJzLmlhX3NpemUgPSBsZW5ndGg7CisJbmV3YXR0cnMuaWFfdmFsaWQgPSBBVFRSX1NJWkUgfCBBVFRSX0NUSU1FOworCisJZG93bigmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJZXJyID0gbm90aWZ5X2NoYW5nZShkZW50cnksICZuZXdhdHRycyk7CisJdXAoJmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBkb19zeXNfdHJ1bmNhdGUoY29uc3QgY2hhciBfX3VzZXIgKiBwYXRoLCBsb2ZmX3QgbGVuZ3RoKQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJaW50IGVycm9yOworCisJZXJyb3IgPSAtRUlOVkFMOworCWlmIChsZW5ndGggPCAwKQkvKiBzb3JyeSwgYnV0IGxvZmZfdCBzYXlzLi4uICovCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSB1c2VyX3BhdGhfd2FsayhwYXRoLCAmbmQpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisJaW5vZGUgPSBuZC5kZW50cnktPmRfaW5vZGU7CisKKwkvKiBGb3IgZGlyZWN0b3JpZXMgaXQncyAtRUlTRElSLCBmb3Igb3RoZXIgbm9uLXJlZ3VsYXJzIC0gLUVJTlZBTCAqLworCWVycm9yID0gLUVJU0RJUjsKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJZ290byBkcHV0X2FuZF9vdXQ7CisKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQlnb3RvIGRwdXRfYW5kX291dDsKKworCWVycm9yID0gcGVybWlzc2lvbihpbm9kZSxNQVlfV1JJVEUsJm5kKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZHB1dF9hbmRfb3V0OworCisJZXJyb3IgPSAtRVJPRlM7CisJaWYgKElTX1JET05MWShpbm9kZSkpCisJCWdvdG8gZHB1dF9hbmRfb3V0OworCisJZXJyb3IgPSAtRVBFUk07CisJaWYgKElTX0lNTVVUQUJMRShpbm9kZSkgfHwgSVNfQVBQRU5EKGlub2RlKSkKKwkJZ290byBkcHV0X2FuZF9vdXQ7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZXJlIGFyZSBubyBsZWFzZXMuCisJICovCisJZXJyb3IgPSBicmVha19sZWFzZShpbm9kZSwgRk1PREVfV1JJVEUpOworCWlmIChlcnJvcikKKwkJZ290byBkcHV0X2FuZF9vdXQ7CisKKwllcnJvciA9IGdldF93cml0ZV9hY2Nlc3MoaW5vZGUpOworCWlmIChlcnJvcikKKwkJZ290byBkcHV0X2FuZF9vdXQ7CisKKwllcnJvciA9IGxvY2tzX3ZlcmlmeV90cnVuY2F0ZShpbm9kZSwgTlVMTCwgbGVuZ3RoKTsKKwlpZiAoIWVycm9yKSB7CisJCURRVU9UX0lOSVQoaW5vZGUpOworCQllcnJvciA9IGRvX3RydW5jYXRlKG5kLmRlbnRyeSwgbGVuZ3RoKTsKKwl9CisJcHV0X3dyaXRlX2FjY2Vzcyhpbm9kZSk7CisKK2RwdXRfYW5kX291dDoKKwlwYXRoX3JlbGVhc2UoJm5kKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfdHJ1bmNhdGUoY29uc3QgY2hhciBfX3VzZXIgKiBwYXRoLCB1bnNpZ25lZCBsb25nIGxlbmd0aCkKK3sKKwkvKiBvbiAzMi1iaXQgYm94ZW4gaXQgd2lsbCBjdXQgdGhlIHJhbmdlIDJeMzEtLTJeMzItMSBvZmYgKi8KKwlyZXR1cm4gZG9fc3lzX3RydW5jYXRlKHBhdGgsIChsb25nKWxlbmd0aCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBkb19zeXNfZnRydW5jYXRlKHVuc2lnbmVkIGludCBmZCwgbG9mZl90IGxlbmd0aCwgaW50IHNtYWxsKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlzdHJ1Y3QgZmlsZSAqIGZpbGU7CisJaW50IGVycm9yOworCisJZXJyb3IgPSAtRUlOVkFMOworCWlmIChsZW5ndGggPCAwKQorCQlnb3RvIG91dDsKKwllcnJvciA9IC1FQkFERjsKKwlmaWxlID0gZmdldChmZCk7CisJaWYgKCFmaWxlKQorCQlnb3RvIG91dDsKKworCS8qIGV4cGxpY2l0bHkgb3BlbmVkIGFzIGxhcmdlIG9yIHdlIGFyZSBvbiA2NC1iaXQgYm94ICovCisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0xBUkdFRklMRSkKKwkJc21hbGwgPSAwOworCisJZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJZXJyb3IgPSAtRUlOVkFMOworCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCAhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJZ290byBvdXRfcHV0ZjsKKworCWVycm9yID0gLUVJTlZBTDsKKwkvKiBDYW5ub3QgZnRydW5jYXRlIG92ZXIgMl4zMSBieXRlcyB3aXRob3V0IGxhcmdlIGZpbGUgc3VwcG9ydCAqLworCWlmIChzbWFsbCAmJiBsZW5ndGggPiBNQVhfTk9OX0xGUykKKwkJZ290byBvdXRfcHV0ZjsKKworCWVycm9yID0gLUVQRVJNOworCWlmIChJU19BUFBFTkQoaW5vZGUpKQorCQlnb3RvIG91dF9wdXRmOworCisJZXJyb3IgPSBsb2Nrc192ZXJpZnlfdHJ1bmNhdGUoaW5vZGUsIGZpbGUsIGxlbmd0aCk7CisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBkb190cnVuY2F0ZShkZW50cnksIGxlbmd0aCk7CitvdXRfcHV0ZjoKKwlmcHV0KGZpbGUpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19mdHJ1bmNhdGUodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBsb25nIGxlbmd0aCkKK3sKKwlyZXR1cm4gZG9fc3lzX2Z0cnVuY2F0ZShmZCwgbGVuZ3RoLCAxKTsKK30KKworLyogTEZTIHZlcnNpb25zIG9mIHRydW5jYXRlIGFyZSBvbmx5IG5lZWRlZCBvbiAzMiBiaXQgbWFjaGluZXMgKi8KKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCithc21saW5rYWdlIGxvbmcgc3lzX3RydW5jYXRlNjQoY29uc3QgY2hhciBfX3VzZXIgKiBwYXRoLCBsb2ZmX3QgbGVuZ3RoKQoreworCXJldHVybiBkb19zeXNfdHJ1bmNhdGUocGF0aCwgbGVuZ3RoKTsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19mdHJ1bmNhdGU2NCh1bnNpZ25lZCBpbnQgZmQsIGxvZmZfdCBsZW5ndGgpCit7CisJcmV0dXJuIGRvX3N5c19mdHJ1bmNhdGUoZmQsIGxlbmd0aCwgMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fQVJDSF9XQU5UX1NZU19VVElNRQorCisvKgorICogc3lzX3V0aW1lKCkgY2FuIGJlIGltcGxlbWVudGVkIGluIHVzZXItbGV2ZWwgdXNpbmcgc3lzX3V0aW1lcygpLgorICogSXMgdGhpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk/ICBJZiBzbywgd2h5IG5vdCBtb3ZlIGl0CisgKiBpbnRvIHRoZSBhcHByb3ByaWF0ZSBhcmNoIGRpcmVjdG9yeSAoZm9yIHRob3NlIGFyY2hpdGVjdHVyZXMgdGhhdAorICogbmVlZCBpdCkuCisgKi8KKworLyogSWYgdGltZXM9PU5VTEwsIHNldCBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiB0byBjdXJyZW50IHRpbWUsCisgKiBtdXN0IGJlIG93bmVyIG9yIGhhdmUgd3JpdGUgcGVybWlzc2lvbi4KKyAqIEVsc2UsIHVwZGF0ZSBmcm9tICp0aW1lcywgbXVzdCBiZSBvd25lciBvciBzdXBlciB1c2VyLgorICovCithc21saW5rYWdlIGxvbmcgc3lzX3V0aW1lKGNoYXIgX191c2VyICogZmlsZW5hbWUsIHN0cnVjdCB1dGltYnVmIF9fdXNlciAqIHRpbWVzKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCXN0cnVjdCBpYXR0ciBuZXdhdHRyczsKKworCWVycm9yID0gdXNlcl9wYXRoX3dhbGsoZmlsZW5hbWUsICZuZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKwlpbm9kZSA9IG5kLmRlbnRyeS0+ZF9pbm9kZTsKKworCWVycm9yID0gLUVST0ZTOworCWlmIChJU19SRE9OTFkoaW5vZGUpKQorCQlnb3RvIGRwdXRfYW5kX291dDsKKworCS8qIERvbid0IHdvcnJ5LCB0aGUgY2hlY2tzIGFyZSBkb25lIGluIGlub2RlX2NoYW5nZV9vaygpICovCisJbmV3YXR0cnMuaWFfdmFsaWQgPSBBVFRSX0NUSU1FIHwgQVRUUl9NVElNRSB8IEFUVFJfQVRJTUU7CisJaWYgKHRpbWVzKSB7CisJCWVycm9yID0gLUVQRVJNOworCQlpZiAoSVNfQVBQRU5EKGlub2RlKSB8fCBJU19JTU1VVEFCTEUoaW5vZGUpKQorCQkJZ290byBkcHV0X2FuZF9vdXQ7CisKKwkJZXJyb3IgPSBnZXRfdXNlcihuZXdhdHRycy5pYV9hdGltZS50dl9zZWMsICZ0aW1lcy0+YWN0aW1lKTsKKwkJbmV3YXR0cnMuaWFfYXRpbWUudHZfbnNlYyA9IDA7CisJCWlmICghZXJyb3IpIAorCQkJZXJyb3IgPSBnZXRfdXNlcihuZXdhdHRycy5pYV9tdGltZS50dl9zZWMsICZ0aW1lcy0+bW9kdGltZSk7CisJCW5ld2F0dHJzLmlhX210aW1lLnR2X25zZWMgPSAwOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGRwdXRfYW5kX291dDsKKworCQluZXdhdHRycy5pYV92YWxpZCB8PSBBVFRSX0FUSU1FX1NFVCB8IEFUVFJfTVRJTUVfU0VUOworCX0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSAtRUFDQ0VTOworICAgICAgICAgICAgICAgIGlmIChJU19JTU1VVEFCTEUoaW5vZGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkcHV0X2FuZF9vdXQ7CisKKwkJaWYgKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCAmJgorCQkgICAgKGVycm9yID0gcGVybWlzc2lvbihpbm9kZSxNQVlfV1JJVEUsJm5kKSkgIT0gMCkKKwkJCWdvdG8gZHB1dF9hbmRfb3V0OworCX0KKwlkb3duKCZpbm9kZS0+aV9zZW0pOworCWVycm9yID0gbm90aWZ5X2NoYW5nZShuZC5kZW50cnksICZuZXdhdHRycyk7CisJdXAoJmlub2RlLT5pX3NlbSk7CitkcHV0X2FuZF9vdXQ6CisJcGF0aF9yZWxlYXNlKCZuZCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisjZW5kaWYKKworLyogSWYgdGltZXM9PU5VTEwsIHNldCBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiB0byBjdXJyZW50IHRpbWUsCisgKiBtdXN0IGJlIG93bmVyIG9yIGhhdmUgd3JpdGUgcGVybWlzc2lvbi4KKyAqIEVsc2UsIHVwZGF0ZSBmcm9tICp0aW1lcywgbXVzdCBiZSBvd25lciBvciBzdXBlciB1c2VyLgorICovCitsb25nIGRvX3V0aW1lcyhjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBzdHJ1Y3QgdGltZXZhbCAqIHRpbWVzKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCXN0cnVjdCBpYXR0ciBuZXdhdHRyczsKKworCWVycm9yID0gdXNlcl9wYXRoX3dhbGsoZmlsZW5hbWUsICZuZCk7CisKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCWlub2RlID0gbmQuZGVudHJ5LT5kX2lub2RlOworCisJZXJyb3IgPSAtRVJPRlM7CisJaWYgKElTX1JET05MWShpbm9kZSkpCisJCWdvdG8gZHB1dF9hbmRfb3V0OworCisJLyogRG9uJ3Qgd29ycnksIHRoZSBjaGVja3MgYXJlIGRvbmUgaW4gaW5vZGVfY2hhbmdlX29rKCkgKi8KKwluZXdhdHRycy5pYV92YWxpZCA9IEFUVFJfQ1RJTUUgfCBBVFRSX01USU1FIHwgQVRUUl9BVElNRTsKKwlpZiAodGltZXMpIHsKKwkJZXJyb3IgPSAtRVBFUk07CisgICAgICAgICAgICAgICAgaWYgKElTX0FQUEVORChpbm9kZSkgfHwgSVNfSU1NVVRBQkxFKGlub2RlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZHB1dF9hbmRfb3V0OworCisJCW5ld2F0dHJzLmlhX2F0aW1lLnR2X3NlYyA9IHRpbWVzWzBdLnR2X3NlYzsKKwkJbmV3YXR0cnMuaWFfYXRpbWUudHZfbnNlYyA9IHRpbWVzWzBdLnR2X3VzZWMgKiAxMDAwOworCQluZXdhdHRycy5pYV9tdGltZS50dl9zZWMgPSB0aW1lc1sxXS50dl9zZWM7CisJCW5ld2F0dHJzLmlhX210aW1lLnR2X25zZWMgPSB0aW1lc1sxXS50dl91c2VjICogMTAwMDsKKwkJbmV3YXR0cnMuaWFfdmFsaWQgfD0gQVRUUl9BVElNRV9TRVQgfCBBVFRSX01USU1FX1NFVDsKKwl9IGVsc2UgeworCQllcnJvciA9IC1FQUNDRVM7CisgICAgICAgICAgICAgICAgaWYgKElTX0lNTVVUQUJMRShpbm9kZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRwdXRfYW5kX291dDsKKworCQlpZiAoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkICYmCisJCSAgICAoZXJyb3IgPSBwZXJtaXNzaW9uKGlub2RlLE1BWV9XUklURSwmbmQpKSAhPSAwKQorCQkJZ290byBkcHV0X2FuZF9vdXQ7CisJfQorCWRvd24oJmlub2RlLT5pX3NlbSk7CisJZXJyb3IgPSBub3RpZnlfY2hhbmdlKG5kLmRlbnRyeSwgJm5ld2F0dHJzKTsKKwl1cCgmaW5vZGUtPmlfc2VtKTsKK2RwdXRfYW5kX291dDoKKwlwYXRoX3JlbGVhc2UoJm5kKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfdXRpbWVzKGNoYXIgX191c2VyICogZmlsZW5hbWUsIHN0cnVjdCB0aW1ldmFsIF9fdXNlciAqIHV0aW1lcykKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lc1syXTsKKworCWlmICh1dGltZXMgJiYgY29weV9mcm9tX3VzZXIoJnRpbWVzLCB1dGltZXMsIHNpemVvZih0aW1lcykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gZG9fdXRpbWVzKGZpbGVuYW1lLCB1dGltZXMgPyB0aW1lcyA6IE5VTEwpOworfQorCisKKy8qCisgKiBhY2Nlc3MoKSBuZWVkcyB0byB1c2UgdGhlIHJlYWwgdWlkL2dpZCwgbm90IHRoZSBlZmZlY3RpdmUgdWlkL2dpZC4KKyAqIFdlIGRvIHRoaXMgYnkgdGVtcG9yYXJpbHkgY2xlYXJpbmcgYWxsIEZTLXJlbGF0ZWQgY2FwYWJpbGl0aWVzIGFuZAorICogc3dpdGNoaW5nIHRoZSBmc3VpZC9mc2dpZCBhcm91bmQgdG8gdGhlIHJlYWwgb25lcy4KKyAqLworYXNtbGlua2FnZSBsb25nIHN5c19hY2Nlc3MoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgaW50IG1vZGUpCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgb2xkX2ZzdWlkLCBvbGRfZnNnaWQ7CisJa2VybmVsX2NhcF90IG9sZF9jYXA7CisJaW50IHJlczsKKworCWlmIChtb2RlICYgflNfSVJXWE8pCS8qIHdoZXJlJ3MgRl9PSywgWF9PSywgV19PSywgUl9PSz8gKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvbGRfZnN1aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlvbGRfZnNnaWQgPSBjdXJyZW50LT5mc2dpZDsKKwlvbGRfY2FwID0gY3VycmVudC0+Y2FwX2VmZmVjdGl2ZTsKKworCWN1cnJlbnQtPmZzdWlkID0gY3VycmVudC0+dWlkOworCWN1cnJlbnQtPmZzZ2lkID0gY3VycmVudC0+Z2lkOworCisJLyoKKwkgKiBDbGVhciB0aGUgY2FwYWJpbGl0aWVzIGlmIHdlIHN3aXRjaCB0byBhIG5vbi1yb290IHVzZXIKKwkgKgorCSAqIEZJWE1FOiBUaGVyZSBpcyBhIHJhY2UgaGVyZSBhZ2FpbnN0IHN5c19jYXBzZXQuICBUaGUKKwkgKiBjYXBhYmlsaXRpZXMgY2FuIGNoYW5nZSB5ZXQgd2Ugd2lsbCByZXN0b3JlIHRoZSBvbGQKKwkgKiB2YWx1ZSBiZWxvdy4gIFdlIHNob3VsZCBob2xkIHRhc2tfY2FwYWJpbGl0aWVzX2xvY2ssCisJICogYnV0IHdlIGNhbm5vdCBiZWNhdXNlIHVzZXJfcGF0aF93YWxrIGNhbiBzbGVlcC4KKwkgKi8KKwlpZiAoY3VycmVudC0+dWlkKQorCQljYXBfY2xlYXIoY3VycmVudC0+Y2FwX2VmZmVjdGl2ZSk7CisJZWxzZQorCQljdXJyZW50LT5jYXBfZWZmZWN0aXZlID0gY3VycmVudC0+Y2FwX3Blcm1pdHRlZDsKKworCXJlcyA9IF9fdXNlcl93YWxrKGZpbGVuYW1lLCBMT09LVVBfRk9MTE9XfExPT0tVUF9BQ0NFU1MsICZuZCk7CisJaWYgKCFyZXMpIHsKKwkJcmVzID0gcGVybWlzc2lvbihuZC5kZW50cnktPmRfaW5vZGUsIG1vZGUsICZuZCk7CisJCS8qIFN1UyB2MiByZXF1aXJlcyB3ZSByZXBvcnQgYSByZWFkIG9ubHkgZnMgdG9vICovCisJCWlmKCFyZXMgJiYgKG1vZGUgJiBTX0lXT1RIKSAmJiBJU19SRE9OTFkobmQuZGVudHJ5LT5kX2lub2RlKQorCQkgICAmJiAhc3BlY2lhbF9maWxlKG5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJCXJlcyA9IC1FUk9GUzsKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJfQorCisJY3VycmVudC0+ZnN1aWQgPSBvbGRfZnN1aWQ7CisJY3VycmVudC0+ZnNnaWQgPSBvbGRfZnNnaWQ7CisJY3VycmVudC0+Y2FwX2VmZmVjdGl2ZSA9IG9sZF9jYXA7CisKKwlyZXR1cm4gcmVzOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2NoZGlyKGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUpCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IF9fdXNlcl93YWxrKGZpbGVuYW1lLCBMT09LVVBfRk9MTE9XfExPT0tVUF9ESVJFQ1RPUlksICZuZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gcGVybWlzc2lvbihuZC5kZW50cnktPmRfaW5vZGUsTUFZX0VYRUMsJm5kKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZHB1dF9hbmRfb3V0OworCisJc2V0X2ZzX3B3ZChjdXJyZW50LT5mcywgbmQubW50LCBuZC5kZW50cnkpOworCitkcHV0X2FuZF9vdXQ6CisJcGF0aF9yZWxlYXNlKCZuZCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2ZjaGRpcih1bnNpZ25lZCBpbnQgZmQpCit7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHZmc21vdW50ICptbnQ7CisJaW50IGVycm9yOworCisJZXJyb3IgPSAtRUJBREY7CisJZmlsZSA9IGZnZXQoZmQpOworCWlmICghZmlsZSkKKwkJZ290byBvdXQ7CisKKwlkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwltbnQgPSBmaWxlLT5mX3Zmc21udDsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWVycm9yID0gLUVOT1RESVI7CisJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlnb3RvIG91dF9wdXRmOworCisJZXJyb3IgPSBwZXJtaXNzaW9uKGlub2RlLCBNQVlfRVhFQywgTlVMTCk7CisJaWYgKCFlcnJvcikKKwkJc2V0X2ZzX3B3ZChjdXJyZW50LT5mcywgbW50LCBkZW50cnkpOworb3V0X3B1dGY6CisJZnB1dChmaWxlKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfY2hyb290KGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUpCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IF9fdXNlcl93YWxrKGZpbGVuYW1lLCBMT09LVVBfRk9MTE9XIHwgTE9PS1VQX0RJUkVDVE9SWSB8IExPT0tVUF9OT0FMVCwgJm5kKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSBwZXJtaXNzaW9uKG5kLmRlbnRyeS0+ZF9pbm9kZSxNQVlfRVhFQywmbmQpOworCWlmIChlcnJvcikKKwkJZ290byBkcHV0X2FuZF9vdXQ7CisKKwllcnJvciA9IC1FUEVSTTsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19DSFJPT1QpKQorCQlnb3RvIGRwdXRfYW5kX291dDsKKworCXNldF9mc19yb290KGN1cnJlbnQtPmZzLCBuZC5tbnQsIG5kLmRlbnRyeSk7CisJc2V0X2ZzX2FsdHJvb3QoKTsKKwllcnJvciA9IDA7CitkcHV0X2FuZF9vdXQ6CisJcGF0aF9yZWxlYXNlKCZuZCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2ZjaG1vZCh1bnNpZ25lZCBpbnQgZmQsIG1vZGVfdCBtb2RlKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCXN0cnVjdCBkZW50cnkgKiBkZW50cnk7CisJc3RydWN0IGZpbGUgKiBmaWxlOworCWludCBlcnIgPSAtRUJBREY7CisJc3RydWN0IGlhdHRyIG5ld2F0dHJzOworCisJZmlsZSA9IGZnZXQoZmQpOworCWlmICghZmlsZSkKKwkJZ290byBvdXQ7CisKKwlkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWVyciA9IC1FUk9GUzsKKwlpZiAoSVNfUkRPTkxZKGlub2RlKSkKKwkJZ290byBvdXRfcHV0ZjsKKwllcnIgPSAtRVBFUk07CisJaWYgKElTX0lNTVVUQUJMRShpbm9kZSkgfHwgSVNfQVBQRU5EKGlub2RlKSkKKwkJZ290byBvdXRfcHV0ZjsKKwlkb3duKCZpbm9kZS0+aV9zZW0pOworCWlmIChtb2RlID09IChtb2RlX3QpIC0xKQorCQltb2RlID0gaW5vZGUtPmlfbW9kZTsKKwluZXdhdHRycy5pYV9tb2RlID0gKG1vZGUgJiBTX0lBTExVR08pIHwgKGlub2RlLT5pX21vZGUgJiB+U19JQUxMVUdPKTsKKwluZXdhdHRycy5pYV92YWxpZCA9IEFUVFJfTU9ERSB8IEFUVFJfQ1RJTUU7CisJZXJyID0gbm90aWZ5X2NoYW5nZShkZW50cnksICZuZXdhdHRycyk7CisJdXAoJmlub2RlLT5pX3NlbSk7CisKK291dF9wdXRmOgorCWZwdXQoZmlsZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19jaG1vZChjb25zdCBjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBtb2RlX3QgbW9kZSkKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCWludCBlcnJvcjsKKwlzdHJ1Y3QgaWF0dHIgbmV3YXR0cnM7CisKKwllcnJvciA9IHVzZXJfcGF0aF93YWxrKGZpbGVuYW1lLCAmbmQpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisJaW5vZGUgPSBuZC5kZW50cnktPmRfaW5vZGU7CisKKwllcnJvciA9IC1FUk9GUzsKKwlpZiAoSVNfUkRPTkxZKGlub2RlKSkKKwkJZ290byBkcHV0X2FuZF9vdXQ7CisKKwllcnJvciA9IC1FUEVSTTsKKwlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpKQorCQlnb3RvIGRwdXRfYW5kX291dDsKKworCWRvd24oJmlub2RlLT5pX3NlbSk7CisJaWYgKG1vZGUgPT0gKG1vZGVfdCkgLTEpCisJCW1vZGUgPSBpbm9kZS0+aV9tb2RlOworCW5ld2F0dHJzLmlhX21vZGUgPSAobW9kZSAmIFNfSUFMTFVHTykgfCAoaW5vZGUtPmlfbW9kZSAmIH5TX0lBTExVR08pOworCW5ld2F0dHJzLmlhX3ZhbGlkID0gQVRUUl9NT0RFIHwgQVRUUl9DVElNRTsKKwllcnJvciA9IG5vdGlmeV9jaGFuZ2UobmQuZGVudHJ5LCAmbmV3YXR0cnMpOworCXVwKCZpbm9kZS0+aV9zZW0pOworCitkcHV0X2FuZF9vdXQ6CisJcGF0aF9yZWxlYXNlKCZuZCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IGNob3duX2NvbW1vbihzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCB1aWRfdCB1c2VyLCBnaWRfdCBncm91cCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlpbnQgZXJyb3I7CisJc3RydWN0IGlhdHRyIG5ld2F0dHJzOworCisJZXJyb3IgPSAtRU5PRU5UOworCWlmICghKGlub2RlID0gZGVudHJ5LT5kX2lub2RlKSkgeworCQlwcmludGsoS0VSTl9FUlIgImNob3duX2NvbW1vbjogTlVMTCBpbm9kZVxuIik7CisJCWdvdG8gb3V0OworCX0KKwllcnJvciA9IC1FUk9GUzsKKwlpZiAoSVNfUkRPTkxZKGlub2RlKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSAtRVBFUk07CisJaWYgKElTX0lNTVVUQUJMRShpbm9kZSkgfHwgSVNfQVBQRU5EKGlub2RlKSkKKwkJZ290byBvdXQ7CisJbmV3YXR0cnMuaWFfdmFsaWQgPSAgQVRUUl9DVElNRTsKKwlpZiAodXNlciAhPSAodWlkX3QpIC0xKSB7CisJCW5ld2F0dHJzLmlhX3ZhbGlkIHw9IEFUVFJfVUlEOworCQluZXdhdHRycy5pYV91aWQgPSB1c2VyOworCX0KKwlpZiAoZ3JvdXAgIT0gKGdpZF90KSAtMSkgeworCQluZXdhdHRycy5pYV92YWxpZCB8PSBBVFRSX0dJRDsKKwkJbmV3YXR0cnMuaWFfZ2lkID0gZ3JvdXA7CisJfQorCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJbmV3YXR0cnMuaWFfdmFsaWQgfD0gQVRUUl9LSUxMX1NVSUR8QVRUUl9LSUxMX1NHSUQ7CisJZG93bigmaW5vZGUtPmlfc2VtKTsKKwllcnJvciA9IG5vdGlmeV9jaGFuZ2UoZGVudHJ5LCAmbmV3YXR0cnMpOworCXVwKCZpbm9kZS0+aV9zZW0pOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19jaG93bihjb25zdCBjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCB1aWRfdCB1c2VyLCBnaWRfdCBncm91cCkKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCBlcnJvcjsKKworCWVycm9yID0gdXNlcl9wYXRoX3dhbGsoZmlsZW5hbWUsICZuZCk7CisJaWYgKCFlcnJvcikgeworCQllcnJvciA9IGNob3duX2NvbW1vbihuZC5kZW50cnksIHVzZXIsIGdyb3VwKTsKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19sY2hvd24oY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgdWlkX3QgdXNlciwgZ2lkX3QgZ3JvdXApCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHVzZXJfcGF0aF93YWxrX2xpbmsoZmlsZW5hbWUsICZuZCk7CisJaWYgKCFlcnJvcikgeworCQllcnJvciA9IGNob3duX2NvbW1vbihuZC5kZW50cnksIHVzZXIsIGdyb3VwKTsKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworCithc21saW5rYWdlIGxvbmcgc3lzX2ZjaG93bih1bnNpZ25lZCBpbnQgZmQsIHVpZF90IHVzZXIsIGdpZF90IGdyb3VwKQoreworCXN0cnVjdCBmaWxlICogZmlsZTsKKwlpbnQgZXJyb3IgPSAtRUJBREY7CisKKwlmaWxlID0gZmdldChmZCk7CisJaWYgKGZpbGUpIHsKKwkJZXJyb3IgPSBjaG93bl9jb21tb24oZmlsZS0+Zl9kZW50cnksIHVzZXIsIGdyb3VwKTsKKwkJZnB1dChmaWxlKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogTm90ZSB0aGF0IHdoaWxlIHRoZSBmbGFnIHZhbHVlIChsb3cgdHdvIGJpdHMpIGZvciBzeXNfb3BlbiBtZWFuczoKKyAqCTAwIC0gcmVhZC1vbmx5CisgKgkwMSAtIHdyaXRlLW9ubHkKKyAqCTEwIC0gcmVhZC13cml0ZQorICoJMTEgLSBzcGVjaWFsCisgKiBpdCBpcyBjaGFuZ2VkIGludG8KKyAqCTAwIC0gbm8gcGVybWlzc2lvbnMgbmVlZGVkCisgKgkwMSAtIHJlYWQtcGVybWlzc2lvbgorICoJMTAgLSB3cml0ZS1wZXJtaXNzaW9uCisgKgkxMSAtIHJlYWQtd3JpdGUKKyAqIGZvciB0aGUgaW50ZXJuYWwgcm91dGluZXMgKGllIG9wZW5fbmFtZWkoKS9mb2xsb3dfbGluaygpIGV0YykuIDAwIGlzCisgKiB1c2VkIGJ5IHN5bWxpbmtzLgorICovCitzdHJ1Y3QgZmlsZSAqZmlscF9vcGVuKGNvbnN0IGNoYXIgKiBmaWxlbmFtZSwgaW50IGZsYWdzLCBpbnQgbW9kZSkKK3sKKwlpbnQgbmFtZWlfZmxhZ3MsIGVycm9yOworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisKKwluYW1laV9mbGFncyA9IGZsYWdzOworCWlmICgobmFtZWlfZmxhZ3MrMSkgJiBPX0FDQ01PREUpCisJCW5hbWVpX2ZsYWdzKys7CisJaWYgKG5hbWVpX2ZsYWdzICYgT19UUlVOQykKKwkJbmFtZWlfZmxhZ3MgfD0gMjsKKworCWVycm9yID0gb3Blbl9uYW1laShmaWxlbmFtZSwgbmFtZWlfZmxhZ3MsIG1vZGUsICZuZCk7CisJaWYgKCFlcnJvcikKKwkJcmV0dXJuIGRlbnRyeV9vcGVuKG5kLmRlbnRyeSwgbmQubW50LCBmbGFncyk7CisKKwlyZXR1cm4gRVJSX1BUUihlcnJvcik7Cit9CisKK0VYUE9SVF9TWU1CT0woZmlscF9vcGVuKTsKKworc3RydWN0IGZpbGUgKmRlbnRyeV9vcGVuKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHZmc21vdW50ICptbnQsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgZmlsZSAqIGY7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IC1FTkZJTEU7CisJZiA9IGdldF9lbXB0eV9maWxwKCk7CisJaWYgKCFmKQorCQlnb3RvIGNsZWFudXBfZGVudHJ5OworCWYtPmZfZmxhZ3MgPSBmbGFnczsKKwlmLT5mX21vZGUgPSAoKGZsYWdzKzEpICYgT19BQ0NNT0RFKSB8IEZNT0RFX0xTRUVLIHwgRk1PREVfUFJFQUQgfCBGTU9ERV9QV1JJVEU7CisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaWYgKGYtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWVycm9yID0gZ2V0X3dyaXRlX2FjY2Vzcyhpbm9kZSk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gY2xlYW51cF9maWxlOworCX0KKworCWYtPmZfbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJZi0+Zl9kZW50cnkgPSBkZW50cnk7CisJZi0+Zl92ZnNtbnQgPSBtbnQ7CisJZi0+Zl9wb3MgPSAwOworCWYtPmZfb3AgPSBmb3BzX2dldChpbm9kZS0+aV9mb3ApOworCWZpbGVfbW92ZShmLCAmaW5vZGUtPmlfc2ItPnNfZmlsZXMpOworCisJaWYgKGYtPmZfb3AgJiYgZi0+Zl9vcC0+b3BlbikgeworCQllcnJvciA9IGYtPmZfb3AtPm9wZW4oaW5vZGUsZik7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gY2xlYW51cF9hbGw7CisJfQorCWYtPmZfZmxhZ3MgJj0gfihPX0NSRUFUIHwgT19FWENMIHwgT19OT0NUVFkgfCBPX1RSVU5DKTsKKworCWZpbGVfcmFfc3RhdGVfaW5pdCgmZi0+Zl9yYSwgZi0+Zl9tYXBwaW5nLT5ob3N0LT5pX21hcHBpbmcpOworCisJLyogTkI6IHdlJ3JlIHN1cmUgdG8gaGF2ZSBjb3JyZWN0IGFfb3BzIG9ubHkgYWZ0ZXIgZl9vcC0+b3BlbiAqLworCWlmIChmLT5mX2ZsYWdzICYgT19ESVJFQ1QpIHsKKwkJaWYgKCFmLT5mX21hcHBpbmctPmFfb3BzIHx8ICFmLT5mX21hcHBpbmctPmFfb3BzLT5kaXJlY3RfSU8pIHsKKwkJCWZwdXQoZik7CisJCQlmID0gRVJSX1BUUigtRUlOVkFMKTsKKwkJfQorCX0KKworCXJldHVybiBmOworCitjbGVhbnVwX2FsbDoKKwlmb3BzX3B1dChmLT5mX29wKTsKKwlpZiAoZi0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCXB1dF93cml0ZV9hY2Nlc3MoaW5vZGUpOworCWZpbGVfa2lsbChmKTsKKwlmLT5mX2RlbnRyeSA9IE5VTEw7CisJZi0+Zl92ZnNtbnQgPSBOVUxMOworY2xlYW51cF9maWxlOgorCXB1dF9maWxwKGYpOworY2xlYW51cF9kZW50cnk6CisJZHB1dChkZW50cnkpOworCW1udHB1dChtbnQpOworCXJldHVybiBFUlJfUFRSKGVycm9yKTsKK30KKworRVhQT1JUX1NZTUJPTChkZW50cnlfb3Blbik7CisKKy8qCisgKiBGaW5kIGFuIGVtcHR5IGZpbGUgZGVzY3JpcHRvciBlbnRyeSwgYW5kIG1hcmsgaXQgYnVzeS4KKyAqLworaW50IGdldF91bnVzZWRfZmQodm9pZCkKK3sKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICogZmlsZXMgPSBjdXJyZW50LT5maWxlczsKKwlpbnQgZmQsIGVycm9yOworCisgIAllcnJvciA9IC1FTUZJTEU7CisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKworcmVwZWF0OgorIAlmZCA9IGZpbmRfbmV4dF96ZXJvX2JpdChmaWxlcy0+b3Blbl9mZHMtPmZkc19iaXRzLCAKKwkJCQlmaWxlcy0+bWF4X2Zkc2V0LCAKKwkJCQlmaWxlcy0+bmV4dF9mZCk7CisKKwkvKgorCSAqIE4uQi4gRm9yIGNsb25lIHRhc2tzIHNoYXJpbmcgYSBmaWxlcyBzdHJ1Y3R1cmUsIHRoaXMgdGVzdAorCSAqIHdpbGwgbGltaXQgdGhlIHRvdGFsIG51bWJlciBvZiBmaWxlcyB0aGF0IGNhbiBiZSBvcGVuZWQuCisJICovCisJaWYgKGZkID49IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfTk9GSUxFXS5ybGltX2N1cikKKwkJZ290byBvdXQ7CisKKwkvKiBEbyB3ZSBuZWVkIHRvIGV4cGFuZCB0aGUgZmQgYXJyYXkgb3IgZmQgc2V0PyAgKi8KKwllcnJvciA9IGV4cGFuZF9maWxlcyhmaWxlcywgZmQpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKGVycm9yKSB7CisJCS8qCisJIAkgKiBJZiB3ZSBuZWVkZWQgdG8gZXhwYW5kIHRoZSBmcyBhcnJheSB3ZQorCQkgKiBtaWdodCBoYXZlIGJsb2NrZWQgLSB0cnkgYWdhaW4uCisJCSAqLworCQllcnJvciA9IC1FTUZJTEU7CisJCWdvdG8gcmVwZWF0OworCX0KKworCUZEX1NFVChmZCwgZmlsZXMtPm9wZW5fZmRzKTsKKwlGRF9DTFIoZmQsIGZpbGVzLT5jbG9zZV9vbl9leGVjKTsKKwlmaWxlcy0+bmV4dF9mZCA9IGZkICsgMTsKKyNpZiAxCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKGZpbGVzLT5mZFtmZF0gIT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJnZXRfdW51c2VkX2ZkOiBzbG90ICVkIG5vdCBOVUxMIVxuIiwgZmQpOworCQlmaWxlcy0+ZmRbZmRdID0gTlVMTDsKKwl9CisjZW5kaWYKKwllcnJvciA9IGZkOworCitvdXQ6CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCXJldHVybiBlcnJvcjsKK30KKworRVhQT1JUX1NZTUJPTChnZXRfdW51c2VkX2ZkKTsKKworc3RhdGljIGlubGluZSB2b2lkIF9fcHV0X3VudXNlZF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcywgdW5zaWduZWQgaW50IGZkKQoreworCV9fRkRfQ0xSKGZkLCBmaWxlcy0+b3Blbl9mZHMpOworCWlmIChmZCA8IGZpbGVzLT5uZXh0X2ZkKQorCQlmaWxlcy0+bmV4dF9mZCA9IGZkOworfQorCit2b2lkIGZhc3RjYWxsIHB1dF91bnVzZWRfZmQodW5zaWduZWQgaW50IGZkKQoreworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzID0gY3VycmVudC0+ZmlsZXM7CisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlfX3B1dF91bnVzZWRfZmQoZmlsZXMsIGZkKTsKKwlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Cit9CisKK0VYUE9SVF9TWU1CT0wocHV0X3VudXNlZF9mZCk7CisKKy8qCisgKiBJbnN0YWxsIGEgZmlsZSBwb2ludGVyIGluIHRoZSBmZCBhcnJheS4gIAorICoKKyAqIFRoZSBWRlMgaXMgZnVsbCBvZiBwbGFjZXMgd2hlcmUgd2UgZHJvcCB0aGUgZmlsZXMgbG9jayBiZXR3ZWVuCisgKiBzZXR0aW5nIHRoZSBvcGVuX2ZkcyBiaXRtYXAgYW5kIGluc3RhbGxpbmcgdGhlIGZpbGUgaW4gdGhlIGZpbGUKKyAqIGFycmF5LiAgQXQgYW55IHN1Y2ggcG9pbnQsIHdlIGFyZSB2dWxuZXJhYmxlIHRvIGEgZHVwMigpIHJhY2UKKyAqIGluc3RhbGxpbmcgYSBmaWxlIGluIHRoZSBhcnJheSBiZWZvcmUgdXMuICBXZSBuZWVkIHRvIGRldGVjdCB0aGlzIGFuZAorICogZnB1dCgpIHRoZSBzdHJ1Y3QgZmlsZSB3ZSBhcmUgYWJvdXQgdG8gb3ZlcndyaXRlIGluIHRoaXMgY2FzZS4KKyAqCisgKiBJdCBzaG91bGQgbmV2ZXIgaGFwcGVuIC0gaWYgd2UgYWxsb3cgZHVwMigpIGRvIGl0LCBfcmVhbGx5XyBiYWQgdGhpbmdzCisgKiB3aWxsIGZvbGxvdy4KKyAqLworCit2b2lkIGZhc3RjYWxsIGZkX2luc3RhbGwodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCit7CisJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBjdXJyZW50LT5maWxlczsKKwlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCWlmICh1bmxpa2VseShmaWxlcy0+ZmRbZmRdICE9IE5VTEwpKQorCQlCVUcoKTsKKwlmaWxlcy0+ZmRbZmRdID0gZmlsZTsKKwlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Cit9CisKK0VYUE9SVF9TWU1CT0woZmRfaW5zdGFsbCk7CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfb3Blbihjb25zdCBjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlKQoreworCWNoYXIgKiB0bXA7CisJaW50IGZkLCBlcnJvcjsKKworI2lmIEJJVFNfUEVSX0xPTkcgIT0gMzIKKwlmbGFncyB8PSBPX0xBUkdFRklMRTsKKyNlbmRpZgorCXRtcCA9IGdldG5hbWUoZmlsZW5hbWUpOworCWZkID0gUFRSX0VSUih0bXApOworCWlmICghSVNfRVJSKHRtcCkpIHsKKwkJZmQgPSBnZXRfdW51c2VkX2ZkKCk7CisJCWlmIChmZCA+PSAwKSB7CisJCQlzdHJ1Y3QgZmlsZSAqZiA9IGZpbHBfb3Blbih0bXAsIGZsYWdzLCBtb2RlKTsKKwkJCWVycm9yID0gUFRSX0VSUihmKTsKKwkJCWlmIChJU19FUlIoZikpCisJCQkJZ290byBvdXRfZXJyb3I7CisJCQlmZF9pbnN0YWxsKGZkLCBmKTsKKwkJfQorb3V0OgorCQlwdXRuYW1lKHRtcCk7CisJfQorCXJldHVybiBmZDsKKworb3V0X2Vycm9yOgorCXB1dF91bnVzZWRfZmQoZmQpOworCWZkID0gZXJyb3I7CisJZ290byBvdXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzeXNfb3Blbik7CisKKyNpZm5kZWYgX19hbHBoYV9fCisKKy8qCisgKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eT8gIE1heWJlIHRoaXMgc2hvdWxkIGJlIG1vdmVkCisgKiBpbnRvIGFyY2gvaTM4NiBpbnN0ZWFkPworICovCithc21saW5rYWdlIGxvbmcgc3lzX2NyZWF0KGNvbnN0IGNoYXIgX191c2VyICogcGF0aG5hbWUsIGludCBtb2RlKQoreworCXJldHVybiBzeXNfb3BlbihwYXRobmFtZSwgT19DUkVBVCB8IE9fV1JPTkxZIHwgT19UUlVOQywgbW9kZSk7Cit9CisKKyNlbmRpZgorCisvKgorICogImlkIiBpcyB0aGUgUE9TSVggdGhyZWFkIElELiBXZSB1c2UgdGhlCisgKiBmaWxlcyBwb2ludGVyIGZvciB0aGlzLi4KKyAqLworaW50IGZpbHBfY2xvc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCit7CisJaW50IHJldHZhbDsKKworCS8qIFJlcG9ydCBhbmQgY2xlYXIgb3V0c3RhbmRpbmcgZXJyb3JzICovCisJcmV0dmFsID0gZmlscC0+Zl9lcnJvcjsKKwlpZiAocmV0dmFsKQorCQlmaWxwLT5mX2Vycm9yID0gMDsKKworCWlmICghZmlsZV9jb3VudChmaWxwKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2xvc2U6IGZpbGUgY291bnQgaXMgMFxuIik7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJaWYgKGZpbHAtPmZfb3AgJiYgZmlscC0+Zl9vcC0+Zmx1c2gpIHsKKwkJaW50IGVyciA9IGZpbHAtPmZfb3AtPmZsdXNoKGZpbHApOworCQlpZiAoIXJldHZhbCkKKwkJCXJldHZhbCA9IGVycjsKKwl9CisKKwlkbm90aWZ5X2ZsdXNoKGZpbHAsIGlkKTsKKwlsb2Nrc19yZW1vdmVfcG9zaXgoZmlscCwgaWQpOworCWZwdXQoZmlscCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworRVhQT1JUX1NZTUJPTChmaWxwX2Nsb3NlKTsKKworLyoKKyAqIENhcmVmdWwgaGVyZSEgV2UgdGVzdCB3aGV0aGVyIHRoZSBmaWxlIHBvaW50ZXIgaXMgTlVMTCBiZWZvcmUKKyAqIHJlbGVhc2luZyB0aGUgZmQuIFRoaXMgZW5zdXJlcyB0aGF0IG9uZSBjbG9uZSB0YXNrIGNhbid0IHJlbGVhc2UKKyAqIGFuIGZkIHdoaWxlIGFub3RoZXIgY2xvbmUgaXMgb3BlbmluZyBpdC4KKyAqLworYXNtbGlua2FnZSBsb25nIHN5c19jbG9zZSh1bnNpZ25lZCBpbnQgZmQpCit7CisJc3RydWN0IGZpbGUgKiBmaWxwOworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzID0gY3VycmVudC0+ZmlsZXM7CisKKwlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCWlmIChmZCA+PSBmaWxlcy0+bWF4X2ZkcykKKwkJZ290byBvdXRfdW5sb2NrOworCWZpbHAgPSBmaWxlcy0+ZmRbZmRdOworCWlmICghZmlscCkKKwkJZ290byBvdXRfdW5sb2NrOworCWZpbGVzLT5mZFtmZF0gPSBOVUxMOworCUZEX0NMUihmZCwgZmlsZXMtPmNsb3NlX29uX2V4ZWMpOworCV9fcHV0X3VudXNlZF9mZChmaWxlcywgZmQpOworCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlyZXR1cm4gZmlscF9jbG9zZShmaWxwLCBmaWxlcyk7CisKK291dF91bmxvY2s6CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCXJldHVybiAtRUJBREY7Cit9CisKK0VYUE9SVF9TWU1CT0woc3lzX2Nsb3NlKTsKKworLyoKKyAqIFRoaXMgcm91dGluZSBzaW11bGF0ZXMgYSBoYW5ndXAgb24gdGhlIHR0eSwgdG8gYXJyYW5nZSB0aGF0IHVzZXJzCisgKiBhcmUgZ2l2ZW4gY2xlYW4gdGVybWluYWxzIGF0IGxvZ2luIHRpbWUuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfdmhhbmd1cCh2b2lkKQoreworCWlmIChjYXBhYmxlKENBUF9TWVNfVFRZX0NPTkZJRykpIHsKKwkJdHR5X3ZoYW5ndXAoY3VycmVudC0+c2lnbmFsLT50dHkpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FUEVSTTsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIGFuIGlub2RlIGlzIGFib3V0IHRvIGJlIG9wZW4uCisgKiBXZSB1c2UgdGhpcyB0byBkaXNhbGxvdyBvcGVuaW5nIGxhcmdlIGZpbGVzIG9uIDMyYml0IHN5c3RlbXMgaWYKKyAqIHRoZSBjYWxsZXIgZGlkbid0IHNwZWNpZnkgT19MQVJHRUZJTEUuICBPbiA2NGJpdCBzeXN0ZW1zIHdlIGZvcmNlCisgKiBvbiB0aGlzIGZsYWcgaW4gc3lzX29wZW4uCisgKi8KK2ludCBnZW5lcmljX2ZpbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCWlmICghKGZpbHAtPmZfZmxhZ3MgJiBPX0xBUkdFRklMRSkgJiYgaV9zaXplX3JlYWQoaW5vZGUpID4gTUFYX05PTl9MRlMpCisJCXJldHVybiAtRUZCSUc7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19maWxlX29wZW4pOworCisvKgorICogVGhpcyBpcyB1c2VkIGJ5IHN1YnN5c3RlbXMgdGhhdCBkb24ndCB3YW50IHNlZWthYmxlCisgKiBmaWxlIGRlc2NyaXB0b3JzCisgKi8KK2ludCBub25zZWVrYWJsZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWZpbHAtPmZfbW9kZSAmPSB+KEZNT0RFX0xTRUVLIHwgRk1PREVfUFJFQUQgfCBGTU9ERV9QV1JJVEUpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKG5vbnNlZWthYmxlX29wZW4pOwpkaWZmIC0tZ2l0IGEvZnMvb3BlbnByb21mcy9NYWtlZmlsZSBiL2ZzL29wZW5wcm9tZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU2MzE5OQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL29wZW5wcm9tZnMvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggU3VuIE9wZW5wcm9tIGZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19TVU5fT1BFTlBST01GUykgKz0gb3BlbnByb21mcy5vCisKK29wZW5wcm9tZnMtb2JqcyA6PSBpbm9kZS5vCmRpZmYgLS1naXQgYS9mcy9vcGVucHJvbWZzL2lub2RlLmMgYi9mcy9vcGVucHJvbWZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlMTFjZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL29wZW5wcm9tZnMvaW5vZGUuYwpAQCAtMCwwICsxLDEwOTggQEAKKy8qICRJZDogaW5vZGUuYyx2IDEuMTUgMjAwMS8xMS8xMiAwOTo0MzozOSBkYXZlbSBFeHAgJAorICogb3BlbnByb21mcy5jOiAvcHJvYy9vcGVucHJvbSBoYW5kbGluZyByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IEpha3ViIEplbGluZWsgIChqYWt1YkByZWRoYXQuY29tKQorICogQ29weXJpZ2h0IChDKSAxOTk4ICAgICAgRWRkaWUgQy4gRG9zdCAgKGVjZEBza3luZXQuYmUpCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9vcGVucHJvbV9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgorI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgQUxJQVNFU19OTk9ERVMgNjQKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNglwYXJlbnQ7CisJdTE2CW5leHQ7CisJdTE2CWNoaWxkOworCXUxNglmaXJzdF9wcm9wOworCXUzMglub2RlOworfSBvcGVucHJvbWZzX25vZGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNkZWZpbmUgT1BQX1NUUklORwkweDEwCisjZGVmaW5lIE9QUF9TVFJJTkdMSVNUCTB4MjAKKyNkZWZpbmUgT1BQX0JJTkFSWQkweDQwCisjZGVmaW5lIE9QUF9IRVhTVFJJTkcJMHg4MAorI2RlZmluZSBPUFBfRElSVFkJMHgwMQorI2RlZmluZSBPUFBfUVVPVEVECTB4MDIKKyNkZWZpbmUgT1BQX05PVFFVT1RFRAkweDA0CisjZGVmaW5lIE9QUF9BU0NJSVoJMHgwOAorCXUzMglmbGFnOworCXUzMglhbGxvY2xlbjsKKwl1MzIJbGVuOworCWNoYXIJKnZhbHVlOworCWNoYXIJbmFtZVs4XTsKK30gb3BlbnByb21fcHJvcGVydHk7CisKK3N0YXRpYyBvcGVucHJvbWZzX25vZGUgKm5vZGVzOworc3RhdGljIGludCBhbGxvY2VkOworc3RhdGljIHUxNiBsYXN0X25vZGU7CitzdGF0aWMgdTE2IGZpcnN0X3Byb3A7CitzdGF0aWMgdTE2IG9wdGlvbnMgPSAweGZmZmY7CitzdGF0aWMgdTE2IGFsaWFzZXMgPSAweGZmZmY7CitzdGF0aWMgaW50IGFsaWFzZXNfbm9kZXM7CitzdGF0aWMgY2hhciAqYWxpYXNfbmFtZXMgW0FMSUFTRVNfTk5PREVTXTsKKworI2RlZmluZSBPUEVOUFJPTV9ST09UX0lOTwkxNgorI2RlZmluZSBPUEVOUFJPTV9GSVJTVF9JTk8JT1BFTlBST01fUk9PVF9JTk8KKyNkZWZpbmUgTk9ERShpbm8pIG5vZGVzW2lubyAtIE9QRU5QUk9NX0ZJUlNUX0lOT10KKyNkZWZpbmUgTk9ERTJJTk8obm9kZSkgKG5vZGUgKyBPUEVOUFJPTV9GSVJTVF9JTk8pCisjZGVmaW5lIE5PREVQMklOTyhubykgKG5vICsgT1BFTlBST01fRklSU1RfSU5PICsgbGFzdF9ub2RlKQorCitzdGF0aWMgaW50IG9wZW5wcm9tZnNfY3JlYXRlIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQsIHN0cnVjdCBuYW1laWRhdGEgKik7CitzdGF0aWMgaW50IG9wZW5wcm9tZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCB2b2lkICosIGZpbGxkaXJfdCk7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqb3BlbnByb21mc19sb29rdXAoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpOworc3RhdGljIGludCBvcGVucHJvbWZzX3VubGluayAoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CisKK3N0YXRpYyBzc2l6ZV90IG5vZGVudW1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJY2hhciBidWZmZXJbMTBdOworCQorCWlmIChjb3VudCA8IDAgfHwgIWlub2RlLT51LmdlbmVyaWNfaXApCisJCXJldHVybiAtRUlOVkFMOworCXNwcmludGYgKGJ1ZmZlciwgIiU4Ljh4XG4iLCAodTMyKShsb25nKShpbm9kZS0+dS5nZW5lcmljX2lwKSk7CisJaWYgKGZpbGUtPmZfcG9zID49IDkpCisJCXJldHVybiAwOworCWlmIChjb3VudCA+IDkgLSBmaWxlLT5mX3BvcykKKwkJY291bnQgPSA5IC0gZmlsZS0+Zl9wb3M7CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIGJ1ZmZlciArIGZpbGUtPmZfcG9zLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCSpwcG9zICs9IGNvdW50OworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgcHJvcGVydHlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCWludCBpLCBqLCBrOworCXUzMiBub2RlOworCWNoYXIgKnAsICpzOworCXUzMiAqcTsKKwlvcGVucHJvbV9wcm9wZXJ0eSAqb3A7CisJY2hhciBidWZmZXJbNjRdOworCQorCWlmICghZmlscC0+cHJpdmF0ZV9kYXRhKSB7CisJCW5vZGUgPSBub2Rlc1sodTE2KSgobG9uZylpbm9kZS0+dS5nZW5lcmljX2lwKV0ubm9kZTsKKwkJaSA9ICgodTMyKShsb25nKWlub2RlLT51LmdlbmVyaWNfaXApID4+IDE2OworCQlpZiAoKHUxNikoKGxvbmcpaW5vZGUtPnUuZ2VuZXJpY19pcCkgPT0gYWxpYXNlcykgeworCQkJaWYgKGkgPj0gYWxpYXNlc19ub2RlcykKKwkJCQlwID0gTlVMTDsKKwkJCWVsc2UKKwkJCQlwID0gYWxpYXNfbmFtZXMgW2ldOworCQl9IGVsc2UKKwkJCWZvciAocCA9IHByb21fZmlyc3Rwcm9wIChub2RlLCBidWZmZXIpOworCQkJICAgICBpICYmIHAgJiYgKnA7CisJCQkgICAgIHAgPSBwcm9tX25leHRwcm9wIChub2RlLCBwLCBidWZmZXIpLCBpLS0pCisJCQkJLyogbm90aGluZyAqLyA7CisJCWlmICghcCB8fCAhKnApCisJCQlyZXR1cm4gLUVJTzsKKwkJaSA9IHByb21fZ2V0cHJvcGxlbiAobm9kZSwgcCk7CisJCWlmIChpIDwgMCkgeworCQkJaWYgKCh1MTYpKChsb25nKWlub2RlLT51LmdlbmVyaWNfaXApID09IGFsaWFzZXMpCisJCQkJaSA9IDA7CisJCQllbHNlCisJCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJayA9IGk7CisJCWlmIChpIDwgNjQpIGkgPSA2NDsKKwkJZmlscC0+cHJpdmF0ZV9kYXRhID0ga21hbGxvYyAoc2l6ZW9mIChvcGVucHJvbV9wcm9wZXJ0eSkKKwkJCQkJICAgICAgKyAoaiA9IHN0cmxlbiAocCkpICsgMiAqIGksCisJCQkJCSAgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIWZpbHAtPnByaXZhdGVfZGF0YSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlvcCA9IChvcGVucHJvbV9wcm9wZXJ0eSAqKWZpbHAtPnByaXZhdGVfZGF0YTsKKwkJb3AtPmZsYWcgPSAwOworCQlvcC0+YWxsb2NsZW4gPSAyICogaTsKKwkJc3RyY3B5IChvcC0+bmFtZSwgcCk7CisJCW9wLT52YWx1ZSA9IChjaGFyICopKCgodW5zaWduZWQgbG9uZykob3AtPm5hbWUgKyBqICsgNCkpICYgfjMpOworCQlvcC0+bGVuID0gazsKKwkJaWYgKGsgJiYgcHJvbV9nZXRwcm9wZXJ0eSAobm9kZSwgcCwgb3AtPnZhbHVlLCBpKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJb3AtPnZhbHVlIFtrXSA9IDA7CisJCWlmIChrKSB7CisJCQlmb3IgKHMgPSBOVUxMLCBwID0gb3AtPnZhbHVlOyBwIDwgb3AtPnZhbHVlICsgazsgcCsrKSB7CisJCQkJaWYgKCgqcCA+PSAnICcgJiYgKnAgPD0gJ34nKSB8fCAqcCA9PSAnXG4nKSB7CisJCQkJCW9wLT5mbGFnIHw9IE9QUF9TVFJJTkc7CisJCQkJCXMgPSBwOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKHAgPiBvcC0+dmFsdWUgJiYgISpwICYmIHMgPT0gcCAtIDEpIHsKKwkJCQkJaWYgKHAgPCBvcC0+dmFsdWUgKyBrIC0gMSkKKwkJCQkJCW9wLT5mbGFnIHw9IE9QUF9TVFJJTkdMSVNUOworCQkJCQllbHNlCisJCQkJCQlvcC0+ZmxhZyB8PSBPUFBfQVNDSUlaOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKGsgPT0gMSAmJiAhKnApIHsKKwkJCQkJb3AtPmZsYWcgfD0gKE9QUF9TVFJJTkd8T1BQX0FTQ0lJWik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlvcC0+ZmxhZyAmPSB+KE9QUF9TVFJJTkd8T1BQX1NUUklOR0xJU1QpOworCQkJCWlmIChrICYgMykKKwkJCQkJb3AtPmZsYWcgfD0gT1BQX0hFWFNUUklORzsKKwkJCQllbHNlCisJCQkJCW9wLT5mbGFnIHw9IE9QUF9CSU5BUlk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAob3AtPmZsYWcgJiBPUFBfU1RSSU5HTElTVCkKKwkJCQlvcC0+ZmxhZyAmPSB+KE9QUF9TVFJJTkcpOworCQkJaWYgKG9wLT5mbGFnICYgT1BQX0FTQ0lJWikKKwkJCQlvcC0+bGVuLS07CisJCX0KKwl9IGVsc2UKKwkJb3AgPSAob3BlbnByb21fcHJvcGVydHkgKilmaWxwLT5wcml2YXRlX2RhdGE7CisJaWYgKCFjb3VudCB8fCAhKG9wLT5sZW4gfHwgKG9wLT5mbGFnICYgT1BQX0FTQ0lJWikpKQorCQlyZXR1cm4gMDsKKwlpZiAoKnBwb3MgPj0gMHhmZmZmZmYgfHwgY291bnQgPj0gMHhmZmZmZmYpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChvcC0+ZmxhZyAmIE9QUF9TVFJJTkdMSVNUKSB7CisJCWZvciAoayA9IDAsIHAgPSBvcC0+dmFsdWU7IHAgPCBvcC0+dmFsdWUgKyBvcC0+bGVuOyBwKyspCisJCQlpZiAoISpwKQorCQkJCWsrKzsKKwkJaSA9IG9wLT5sZW4gKyA0ICogayArIDM7CisJfSBlbHNlIGlmIChvcC0+ZmxhZyAmIE9QUF9TVFJJTkcpIHsKKwkJaSA9IG9wLT5sZW4gKyAzOworCX0gZWxzZSBpZiAob3AtPmZsYWcgJiBPUFBfQklOQVJZKSB7CisJCWkgPSAob3AtPmxlbiAqIDkpID4+IDI7CisJfSBlbHNlIHsKKwkJaSA9IChvcC0+bGVuIDw8IDEpICsgMTsKKwl9CisJayA9ICpwcG9zOworCWlmIChrID49IGkpIHJldHVybiAwOworCWlmIChjb3VudCA+IGkgLSBrKSBjb3VudCA9IGkgLSBrOworCWlmIChvcC0+ZmxhZyAmIE9QUF9TVFJJTkcpIHsKKwkJaWYgKCFrKSB7CisJCQlpZiAocHV0X3VzZXIoJ1wnJywgYnVmKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWsrKzsKKwkJCWNvdW50LS07CisJCX0KKworCQlpZiAoayArIGNvdW50ID49IGkgLSAyKQorCQkJaiA9IGkgLSAyIC0gazsKKwkJZWxzZQorCQkJaiA9IGNvdW50OworCisJCWlmIChqID49IDApIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmICsgayAtICpwcG9zLAorCQkJCQkgb3AtPnZhbHVlICsgayAtIDEsIGopKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJY291bnQgLT0gajsKKwkJCWsgKz0gajsKKwkJfQorCisJCWlmIChjb3VudCkgeworCQkJaWYgKHB1dF91c2VyKCdcJycsICZidWYgW2srKyAtICpwcG9zXSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJaWYgKGNvdW50ID4gMSkgeworCQkJaWYgKHB1dF91c2VyKCdcbicsICZidWYgW2srKyAtICpwcG9zXSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9IGVsc2UgaWYgKG9wLT5mbGFnICYgT1BQX1NUUklOR0xJU1QpIHsKKwkJY2hhciAqdG1wOworCisJCXRtcCA9IGttYWxsb2MgKGksIEdGUF9LRVJORUwpOworCQlpZiAoIXRtcCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXMgPSB0bXA7CisJCSpzKysgPSAnXCcnOworCQlmb3IgKHAgPSBvcC0+dmFsdWU7IHAgPCBvcC0+dmFsdWUgKyBvcC0+bGVuOyBwKyspIHsKKwkJCWlmICghKnApIHsKKwkJCQlzdHJjcHkocywgIicgKyAnIik7CisJCQkJcyArPSA1OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJKnMrKyA9ICpwOworCQl9CisJCXN0cmNweShzLCAiJ1xuIik7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsIHRtcCArIGssIGNvdW50KSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWtmcmVlKHRtcCk7CisJCWsgKz0gY291bnQ7CisKKwl9IGVsc2UgaWYgKG9wLT5mbGFnICYgT1BQX0JJTkFSWSkgeworCQljaGFyIGJ1ZmZlclsxMF07CisJCXUzMiAqZmlyc3QsICpsYXN0OworCQlpbnQgZmlyc3Rfb2ZmLCBsYXN0X2NudDsKKworCQlmaXJzdCA9ICgodTMyICopb3AtPnZhbHVlKSArIGsgLyA5OworCQlmaXJzdF9vZmYgPSBrICUgOTsKKwkJbGFzdCA9ICgodTMyICopb3AtPnZhbHVlKSArIChrICsgY291bnQgLSAxKSAvIDk7CisJCWxhc3RfY250ID0gKGsgKyBjb3VudCkgJSA5OworCQlpZiAoIWxhc3RfY250KSBsYXN0X2NudCA9IDk7CisKKwkJaWYgKGZpcnN0ID09IGxhc3QpIHsKKwkJCXNwcmludGYgKGJ1ZmZlciwgIiUwOHguIiwgKmZpcnN0KTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBidWZmZXIgKyBmaXJzdF9vZmYsCisJCQkJCSBsYXN0X2NudCAtIGZpcnN0X29mZikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlidWYgKz0gbGFzdF9jbnQgLSBmaXJzdF9vZmY7CisJCX0gZWxzZSB7CQkKKwkJCWZvciAocSA9IGZpcnN0OyBxIDw9IGxhc3Q7IHErKykgeworCQkJCXNwcmludGYgKGJ1ZmZlciwgIiUwOHguIiwgKnEpOworCQkJCWlmIChxID09IGZpcnN0KSB7CisJCQkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBidWZmZXIgKyBmaXJzdF9vZmYsCisJCQkJCQkJIDkgLSBmaXJzdF9vZmYpKQorCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCWJ1ZiArPSA5IC0gZmlyc3Rfb2ZmOworCQkJCX0gZWxzZSBpZiAocSA9PSBsYXN0KSB7CisJCQkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBidWZmZXIsIGxhc3RfY250KSkKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQlidWYgKz0gbGFzdF9jbnQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGJ1ZmZlciwgOSkpCisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJYnVmICs9IDk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGxhc3QgPT0gKHUzMiAqKShvcC0+dmFsdWUgKyBvcC0+bGVuIC0gNCkgJiYgbGFzdF9jbnQgPT0gOSkgeworCQkJaWYgKHB1dF91c2VyKCdcbicsIChidWYgLSAxKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlrICs9IGNvdW50OworCisJfSBlbHNlIGlmIChvcC0+ZmxhZyAmIE9QUF9IRVhTVFJJTkcpIHsKKwkJY2hhciBidWZmZXJbM107CisKKwkJaWYgKChrIDwgaSAtIDEpICYmIChrICYgMSkpIHsKKwkJCXNwcmludGYgKGJ1ZmZlciwgIiUwMngiLAorCQkJCSAodW5zaWduZWQgY2hhcikgKihvcC0+dmFsdWUgKyAoayA+PiAxKSkgJiAweGZmKTsKKwkJCWlmIChwdXRfdXNlcihidWZmZXJbMV0sICZidWZbaysrIC0gKnBwb3NdKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWNvdW50LS07CisJCX0KKworCQlmb3IgKDsgKGNvdW50ID4gMSkgJiYgKGsgPCBpIC0gMSk7IGsgKz0gMikgeworCQkJc3ByaW50ZiAoYnVmZmVyLCAiJTAyeCIsCisJCQkJICh1bnNpZ25lZCBjaGFyKSAqKG9wLT52YWx1ZSArIChrID4+IDEpKSAmIDB4ZmYpOworCQkJaWYgKGNvcHlfdG9fdXNlcihidWYgKyBrIC0gKnBwb3MsIGJ1ZmZlciwgMikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQljb3VudCAtPSAyOworCQl9CisKKwkJaWYgKGNvdW50ICYmIChrIDwgaSAtIDEpKSB7CisJCQlzcHJpbnRmIChidWZmZXIsICIlMDJ4IiwKKwkJCQkgKHVuc2lnbmVkIGNoYXIpICoob3AtPnZhbHVlICsgKGsgPj4gMSkpICYgMHhmZik7CisJCQlpZiAocHV0X3VzZXIoYnVmZmVyWzBdLCAmYnVmW2srKyAtICpwcG9zXSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQljb3VudC0tOworCQl9CisKKwkJaWYgKGNvdW50KSB7CisJCQlpZiAocHV0X3VzZXIoJ1xuJywgJmJ1ZiBbaysrIC0gKnBwb3NdKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKwljb3VudCA9IGsgLSAqcHBvczsKKwkqcHBvcyA9IGs7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBwcm9wZXJ0eV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCBpLCBqLCBrOworCWNoYXIgKnA7CisJdTMyICpxOworCXZvaWQgKmI7CisJb3BlbnByb21fcHJvcGVydHkgKm9wOworCQorCWlmICgqcHBvcyA+PSAweGZmZmZmZiB8fCBjb3VudCA+PSAweGZmZmZmZikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFmaWxwLT5wcml2YXRlX2RhdGEpIHsKKwkJaSA9IHByb3BlcnR5X3JlYWQgKGZpbHAsIE5VTEwsIDAsIE5VTEwpOworCQlpZiAoaSkKKwkJCXJldHVybiBpOworCX0KKwlrID0gKnBwb3M7CisJb3AgPSAob3BlbnByb21fcHJvcGVydHkgKilmaWxwLT5wcml2YXRlX2RhdGE7CisJaWYgKCEob3AtPmZsYWcgJiBPUFBfU1RSSU5HKSkgeworCQl1MzIgKmZpcnN0LCAqbGFzdDsKKwkJaW50IGZpcnN0X29mZiwgbGFzdF9jbnQ7CisJCXUzMiBtYXNrLCBtYXNrMjsKKwkJY2hhciB0bXAgWzldOworCQlpbnQgZm9yY2VsZW4gPSAwOworCQkKKwkJaiA9IGsgJSA5OworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgaisrKSB7CisJCQlpZiAoaiA9PSA5KSBqID0gMDsKKwkJCWlmICghaikgeworCQkJCWNoYXIgY3RtcDsKKwkJCQlpZiAoZ2V0X3VzZXIoY3RtcCwgJmJ1ZltpXSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjdG1wICE9ICcuJykgeworCQkJCQlpZiAoY3RtcCAhPSAnXG4nKSB7CisJCQkJCQlpZiAob3AtPmZsYWcgJiBPUFBfQklOQVJZKQorCQkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQkJZWxzZQorCQkJCQkJCWdvdG8gd3JpdGVfdHJ5X3N0cmluZzsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNvdW50ID0gaSArIDE7CisJCQkJCQlmb3JjZWxlbiA9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY2hhciBjdG1wOworCQkJCWlmIChnZXRfdXNlcihjdG1wLCAmYnVmW2ldKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGN0bXAgPCAnMCcgfHwgCisJCQkJICAgIChjdG1wID4gJzknICYmIGN0bXAgPCAnQScpIHx8CisJCQkJICAgIChjdG1wID4gJ0YnICYmIGN0bXAgPCAnYScpIHx8CisJCQkJICAgIGN0bXAgPiAnZicpIHsKKwkJCQkJaWYgKG9wLT5mbGFnICYgT1BQX0JJTkFSWSkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQllbHNlCisJCQkJCQlnb3RvIHdyaXRlX3RyeV9zdHJpbmc7CisJCQkJfQorCQkJfQorCQl9CisJCW9wLT5mbGFnIHw9IE9QUF9CSU5BUlk7CisJCXRtcCBbOF0gPSAwOworCQlpID0gKChjb3VudCArIGsgKyA4KSAvIDkpIDw8IDI7CisJCWlmIChvcC0+YWxsb2NsZW4gPD0gaSkgeworCQkJYiA9IGttYWxsb2MgKHNpemVvZiAob3BlbnByb21fcHJvcGVydHkpICsgMiAqIGksCisJCQkJICAgICBHRlBfS0VSTkVMKTsKKwkJCWlmICghYikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCW1lbWNweSAoYiwgZmlscC0+cHJpdmF0ZV9kYXRhLAorCQkJCXNpemVvZiAob3BlbnByb21fcHJvcGVydHkpCisJCQkJKyBzdHJsZW4gKG9wLT5uYW1lKSArIG9wLT5hbGxvY2xlbik7CisJCQltZW1zZXQgKCgoY2hhciAqKWIpICsgc2l6ZW9mIChvcGVucHJvbV9wcm9wZXJ0eSkKKwkJCQkrIHN0cmxlbiAob3AtPm5hbWUpICsgb3AtPmFsbG9jbGVuLCAKKwkJCQkwLCAyICogaSAtIG9wLT5hbGxvY2xlbik7CisJCQlvcCA9IChvcGVucHJvbV9wcm9wZXJ0eSAqKWI7CisJCQlvcC0+YWxsb2NsZW4gPSAyKmk7CisJCQliID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCQkJZmlscC0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKilvcDsKKwkJCWtmcmVlIChiKTsKKwkJfQorCQlmaXJzdCA9ICgodTMyICopb3AtPnZhbHVlKSArIChrIC8gOSk7CisJCWZpcnN0X29mZiA9IGsgJSA5OworCQlsYXN0ID0gKHUzMiAqKShvcC0+dmFsdWUgKyBpKTsKKwkJbGFzdF9jbnQgPSAoayArIGNvdW50KSAlIDk7CisJCWlmIChmaXJzdCArIDEgPT0gbGFzdCkgeworCQkJbWVtc2V0ICh0bXAsICcwJywgOCk7CisJCQlpZiAoY29weV9mcm9tX3VzZXIodG1wICsgZmlyc3Rfb2ZmLCBidWYsCisJCQkJCSAgIChjb3VudCArIGZpcnN0X29mZiA+IDgpID8KKwkJCQkJICAgOCAtIGZpcnN0X29mZiA6IGNvdW50KSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCW1hc2sgPSAweGZmZmZmZmZmOworCQkJbWFzazIgPSAweGZmZmZmZmZmOworCQkJZm9yIChqID0gMDsgaiA8IGZpcnN0X29mZjsgaisrKQorCQkJCW1hc2sgPj49IDE7CisJCQlmb3IgKGogPSA4IC0gY291bnQgLSBmaXJzdF9vZmY7IGogPiAwOyBqLS0pCisJCQkJbWFzazIgPDw9IDE7CisJCQltYXNrICY9IG1hc2syOworCQkJaWYgKG1hc2spIHsKKwkJCQkqZmlyc3QgJj0gfm1hc2s7CisJCQkJKmZpcnN0IHw9IHNpbXBsZV9zdHJ0b3VsICh0bXAsIE5VTEwsIDE2KTsKKwkJCQlvcC0+ZmxhZyB8PSBPUFBfRElSVFk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlvcC0+ZmxhZyB8PSBPUFBfRElSVFk7CisJCQlmb3IgKHEgPSBmaXJzdDsgcSA8IGxhc3Q7IHErKykgeworCQkJCWlmIChxID09IGZpcnN0KSB7CisJCQkJCWlmIChmaXJzdF9vZmYgPCA4KSB7CisJCQkJCQltZW1zZXQgKHRtcCwgJzAnLCA4KTsKKwkJCQkJCWlmIChjb3B5X2Zyb21fdXNlcih0bXAgKyBmaXJzdF9vZmYsCisJCQkJCQkJCSAgIGJ1ZiwKKwkJCQkJCQkJICAgOCAtIGZpcnN0X29mZikpCisJCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCQltYXNrID0gMHhmZmZmZmZmZjsKKwkJCQkJCWZvciAoaiA9IDA7IGogPCBmaXJzdF9vZmY7IGorKykKKwkJCQkJCQltYXNrID4+PSAxOworCQkJCQkJKnEgJj0gfm1hc2s7CisJCQkJCQkqcSB8PSBzaW1wbGVfc3RydG91bCAodG1wLE5VTEwsMTYpOworCQkJCQl9CisJCQkJCWJ1ZiArPSA5OworCQkJCX0gZWxzZSBpZiAoKHEgPT0gbGFzdCAtIDEpICYmIGxhc3RfY250CisJCQkJCSAgICYmIChsYXN0X2NudCA8IDgpKSB7CisJCQkJCW1lbXNldCAodG1wLCAnMCcsIDgpOworCQkJCQlpZiAoY29weV9mcm9tX3VzZXIodG1wLCBidWYsIGxhc3RfY250KSkKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQltYXNrID0gMHhmZmZmZmZmZjsKKwkJCQkJZm9yIChqID0gMDsgaiA8IDggLSBsYXN0X2NudDsgaisrKQorCQkJCQkJbWFzayA8PD0gMTsKKwkJCQkJKnEgJj0gfm1hc2s7CisJCQkJCSpxIHw9IHNpbXBsZV9zdHJ0b3VsICh0bXAsIE5VTEwsIDE2KTsKKwkJCQkJYnVmICs9IGxhc3RfY250OworCQkJCX0gZWxzZSB7CisJCQkJCWNoYXIgdGNoYXJzWzE3XTsgLyogWFhYIHl1Y2suLi4gKi8KKworCQkJCQlpZiAoY29weV9mcm9tX3VzZXIodGNoYXJzLCBidWYsIDE2KSkKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQkqcSA9IHNpbXBsZV9zdHJ0b3VsICh0Y2hhcnMsIE5VTEwsIDE2KTsKKwkJCQkJYnVmICs9IDk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmICghZm9yY2VsZW4pIHsKKwkJCWlmIChvcC0+bGVuIDwgaSkKKwkJCQlvcC0+bGVuID0gaTsKKwkJfSBlbHNlCisJCQlvcC0+bGVuID0gaTsKKwkJKnBwb3MgKz0gY291bnQ7CisJfQord3JpdGVfdHJ5X3N0cmluZzoKKwlpZiAoIShvcC0+ZmxhZyAmIE9QUF9CSU5BUlkpKSB7CisJCWlmICghKG9wLT5mbGFnICYgKE9QUF9RVU9URUQgfCBPUFBfTk9UUVVPVEVEKSkpIHsKKwkJCWNoYXIgY3RtcDsKKworCQkJLyogTm8gd2F5LCBpZiBzb21lYm9keSBzdGFydHMgd3JpdGluZyBmcm9tIHRoZSBtaWRkbGUsIAorCQkJICogd2UgZG9uJ3Qga25vdyB3aGV0aGVyIGhlIHVzZXMgcXVvdGVzIGFyb3VuZCBvciBub3QgCisJCQkgKi8KKwkJCWlmIChrID4gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChnZXRfdXNlcihjdG1wLCBidWYpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKGN0bXAgPT0gJ1wnJykgeworCQkJCW9wLT5mbGFnIHw9IE9QUF9RVU9URUQ7CisJCQkJYnVmKys7CisJCQkJY291bnQtLTsKKwkJCQkoKnBwb3MpKys7CisJCQkJaWYgKCFjb3VudCkgeworCQkJCQlvcC0+ZmxhZyB8PSBPUFBfU1RSSU5HOworCQkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlvcC0+ZmxhZyB8PSBPUFBfTk9UUVVPVEVEOworCQl9CisJCW9wLT5mbGFnIHw9IE9QUF9TVFJJTkc7CisJCWlmIChvcC0+YWxsb2NsZW4gPD0gY291bnQgKyAqcHBvcykgeworCQkJYiA9IGttYWxsb2MgKHNpemVvZiAob3BlbnByb21fcHJvcGVydHkpCisJCQkJICAgICArIDIgKiAoY291bnQgKyAqcHBvcyksIEdGUF9LRVJORUwpOworCQkJaWYgKCFiKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJbWVtY3B5IChiLCBmaWxwLT5wcml2YXRlX2RhdGEsCisJCQkJc2l6ZW9mIChvcGVucHJvbV9wcm9wZXJ0eSkKKwkJCQkrIHN0cmxlbiAob3AtPm5hbWUpICsgb3AtPmFsbG9jbGVuKTsKKwkJCW1lbXNldCAoKChjaGFyICopYikgKyBzaXplb2YgKG9wZW5wcm9tX3Byb3BlcnR5KQorCQkJCSsgc3RybGVuIChvcC0+bmFtZSkgKyBvcC0+YWxsb2NsZW4sIAorCQkJCTAsIDIqKGNvdW50IC0gKnBwb3MpIC0gb3AtPmFsbG9jbGVuKTsKKwkJCW9wID0gKG9wZW5wcm9tX3Byb3BlcnR5ICopYjsKKwkJCW9wLT5hbGxvY2xlbiA9IDIqKGNvdW50ICsgKnBwb3MpOworCQkJYiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwkJCWZpbHAtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopb3A7CisJCQlrZnJlZSAoYik7CisJCX0KKwkJcCA9IG9wLT52YWx1ZSArICpwcG9zIC0gKChvcC0+ZmxhZyAmIE9QUF9RVU9URUQpID8gMSA6IDApOworCQlpZiAoY29weV9mcm9tX3VzZXIocCwgYnVmLCBjb3VudCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJb3AtPmZsYWcgfD0gT1BQX0RJUlRZOworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgcCsrKQorCQkJaWYgKCpwID09ICdcbicpIHsKKwkJCQkqcCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCWlmIChpIDwgY291bnQpIHsKKwkJCW9wLT5sZW4gPSBwIC0gb3AtPnZhbHVlOworCQkJKnBwb3MgKz0gaSArIDE7CisJCQlpZiAoKHAgPiBvcC0+dmFsdWUpICYmIChvcC0+ZmxhZyAmIE9QUF9RVU9URUQpCisJCQkgICAgJiYgKCoocCAtIDEpID09ICdcJycpKQorCQkJCW9wLT5sZW4tLTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwIC0gb3AtPnZhbHVlID4gb3AtPmxlbikKKwkJCQlvcC0+bGVuID0gcCAtIG9wLT52YWx1ZTsKKwkJCSpwcG9zICs9IGNvdW50OworCQl9CisJfQorCXJldHVybiAqcHBvcyAtIGs7Cit9CisKK2ludCBwcm9wZXJ0eV9yZWxlYXNlIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlvcGVucHJvbV9wcm9wZXJ0eSAqb3AgPSAob3BlbnByb21fcHJvcGVydHkgKilmaWxwLT5wcml2YXRlX2RhdGE7CisJaW50IGVycm9yOworCXUzMiBub2RlOworCQorCWlmICghb3ApCisJCXJldHVybiAwOworCWxvY2tfa2VybmVsKCk7CisJbm9kZSA9IG5vZGVzWyh1MTYpKChsb25nKWlub2RlLT51LmdlbmVyaWNfaXApXS5ub2RlOworCWlmICgodTE2KSgobG9uZylpbm9kZS0+dS5nZW5lcmljX2lwKSA9PSBhbGlhc2VzKSB7CisJCWlmICgob3AtPmZsYWcgJiBPUFBfRElSVFkpICYmIChvcC0+ZmxhZyAmIE9QUF9TVFJJTkcpKSB7CisJCQljaGFyICpwID0gb3AtPm5hbWU7CisJCQlpbnQgaSA9IChvcC0+dmFsdWUgLSBvcC0+bmFtZSkgLSBzdHJsZW4gKG9wLT5uYW1lKSAtIDE7CisJCQlvcC0+dmFsdWUgW29wLT5sZW5dID0gMDsKKwkJCSoob3AtPnZhbHVlIC0gMSkgPSAnICc7CisJCQlpZiAoaSkgeworCQkJCWZvciAocCA9IG9wLT52YWx1ZSAtIGkgLSAyOyBwID49IG9wLT5uYW1lOyBwLS0pCisJCQkJCXBbaV0gPSAqcDsKKwkJCQlwID0gb3AtPm5hbWUgKyBpOworCQkJfQorCQkJbWVtY3B5IChwIC0gOCwgIm52YWxpYXMgIiwgOCk7CisJCQlwcm9tX2ZldmFsIChwIC0gOCk7CisJCX0KKwl9IGVsc2UgaWYgKG9wLT5mbGFnICYgT1BQX0RJUlRZKSB7CisJCWlmIChvcC0+ZmxhZyAmIE9QUF9TVFJJTkcpIHsKKwkJCW9wLT52YWx1ZSBbb3AtPmxlbl0gPSAwOworCQkJZXJyb3IgPSBwcm9tX3NldHByb3AgKG5vZGUsIG9wLT5uYW1lLAorCQkJCQkgICAgICBvcC0+dmFsdWUsIG9wLT5sZW4gKyAxKTsKKwkJCWlmIChlcnJvciA8PSAwKQorCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJvcGVucHJvbWZzOiAiCisJCQkJCSJDb3VsZG4ndCB3cml0ZSBwcm9wZXJ0eSAlc1xuIiwKKwkJCQkJb3AtPm5hbWUpOworCQl9IGVsc2UgaWYgKChvcC0+ZmxhZyAmIE9QUF9CSU5BUlkpIHx8ICFvcC0+bGVuKSB7CisJCQllcnJvciA9IHByb21fc2V0cHJvcCAobm9kZSwgb3AtPm5hbWUsCisJCQkJCSAgICAgIG9wLT52YWx1ZSwgb3AtPmxlbik7CisJCQlpZiAoZXJyb3IgPD0gMCkKKwkJCQlwcmludGsgKEtFUk5fV0FSTklORyAib3BlbnByb21mczogIgorCQkJCQkiQ291bGRuJ3Qgd3JpdGUgcHJvcGVydHkgJXNcbiIsCisJCQkJCW9wLT5uYW1lKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJvcGVucHJvbWZzOiAiCisJCQkJIlVua25vd24gcHJvcGVydHkgdHlwZSBvZiAlc1xuIiwKKwkJCQlvcC0+bmFtZSk7CisJCX0KKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCWtmcmVlIChmaWxwLT5wcml2YXRlX2RhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvcGVucHJvbWZzX3Byb3Bfb3BzID0geworCS5yZWFkCQk9IHByb3BlcnR5X3JlYWQsCisJLndyaXRlCQk9IHByb3BlcnR5X3dyaXRlLAorCS5yZWxlYXNlCT0gcHJvcGVydHlfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG9wZW5wcm9tZnNfbm9kZW51bV9vcHMgPSB7CisJLnJlYWQJCT0gbm9kZW51bV9yZWFkLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb3BlbnByb21fb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gb3BlbnByb21mc19yZWFkZGlyLAorfTsKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG9wZW5wcm9tX2FsaWFzX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmNyZWF0ZQkJPSBvcGVucHJvbWZzX2NyZWF0ZSwKKwkubG9va3VwCQk9IG9wZW5wcm9tZnNfbG9va3VwLAorCS51bmxpbmsJCT0gb3BlbnByb21mc191bmxpbmssCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgb3BlbnByb21faW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IG9wZW5wcm9tZnNfbG9va3VwLAorfTsKKworc3RhdGljIGludCBsb29rdXBfY2hpbGRyZW4odTE2IG4sIGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbGVuKQoreworCWludCByZXQ7CisJdTE2IG5vZGU7CisJZm9yICg7IG4gIT0gMHhmZmZmOyBuID0gbm9kZXNbbl0ubmV4dCkgeworCQlub2RlID0gbm9kZXNbbl0uY2hpbGQ7CisJCWlmIChub2RlICE9IDB4ZmZmZikgeworCQkJY2hhciBidWZmZXJbMTI4XTsKKwkJCWludCBpOworCQkJY2hhciAqcDsKKwkJCQorCQkJd2hpbGUgKG5vZGUgIT0gMHhmZmZmKSB7CisJCQkJaWYgKHByb21fZ2V0bmFtZSAobm9kZXNbbm9kZV0ubm9kZSwKKwkJCQkJCSAgYnVmZmVyLCAxMjgpID49IDApIHsKKwkJCQkJaSA9IHN0cmxlbiAoYnVmZmVyKTsKKwkJCQkJaWYgKChsZW4gPT0gaSkKKwkJCQkJICAgICYmICFzdHJuY21wIChidWZmZXIsIG5hbWUsIGxlbikpCisJCQkJCQlyZXR1cm4gTk9ERTJJTk8obm9kZSk7CisJCQkJCXAgPSBzdHJjaHIgKGJ1ZmZlciwgJ0AnKTsKKwkJCQkJaWYgKHAgJiYgKGxlbiA9PSBwIC0gYnVmZmVyKQorCQkJCQkgICAgJiYgIXN0cm5jbXAgKGJ1ZmZlciwgbmFtZSwgbGVuKSkKKwkJCQkJCXJldHVybiBOT0RFMklOTyhub2RlKTsKKwkJCQl9CisJCQkJbm9kZSA9IG5vZGVzW25vZGVdLm5leHQ7CisJCQl9CisJCX0gZWxzZQorCQkJY29udGludWU7CisJCXJldCA9IGxvb2t1cF9jaGlsZHJlbiAobm9kZXNbbl0uY2hpbGQsIG5hbWUsIGxlbik7CisJCWlmIChyZXQpIHJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqb3BlbnByb21mc19sb29rdXAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWludCBpbm8gPSAwOworI2RlZmluZSBPUEZTTF9ESVIJMAorI2RlZmluZSBPUEZTTF9QUk9QRVJUWQkxCisjZGVmaW5lIE9QRlNMX05PREVOVU0JMgorCWludCB0eXBlID0gMDsKKwljaGFyIGJ1ZmZlclsxMjhdOworCWNoYXIgKnA7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1MzIgbjsKKwl1MTYgZGlybm9kZTsKKwl1bnNpZ25lZCBpbnQgbGVuOworCWludCBpOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJY2hhciBidWZmZXIyWzY0XTsKKwkKKwlpbm9kZSA9IE5VTEw7CisJbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCWxvY2tfa2VybmVsKCk7CisJaWYgKG5hbWUgWzBdID09ICcuJyAmJiBsZW4gPT0gNSAmJiAhc3RybmNtcCAobmFtZSArIDEsICJub2RlIiwgNCkpIHsKKwkJaW5vID0gTk9ERVAySU5PKE5PREUoZGlyLT5pX2lubykuZmlyc3RfcHJvcCk7CisJCXR5cGUgPSBPUEZTTF9OT0RFTlVNOworCX0KKwlpZiAoIWlubykgeworCQl1MTYgbm9kZSA9IE5PREUoZGlyLT5pX2lubykuY2hpbGQ7CisJCXdoaWxlIChub2RlICE9IDB4ZmZmZikgeworCQkJaWYgKHByb21fZ2V0bmFtZSAobm9kZXNbbm9kZV0ubm9kZSwgYnVmZmVyLCAxMjgpID49IDApIHsKKwkJCQlpID0gc3RybGVuIChidWZmZXIpOworCQkJCWlmIChsZW4gPT0gaSAmJiAhc3RybmNtcCAoYnVmZmVyLCBuYW1lLCBsZW4pKSB7CisJCQkJCWlubyA9IE5PREUySU5PKG5vZGUpOworCQkJCQl0eXBlID0gT1BGU0xfRElSOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcCA9IHN0cmNociAoYnVmZmVyLCAnQCcpOworCQkJCWlmIChwICYmIChsZW4gPT0gcCAtIGJ1ZmZlcikKKwkJCQkgICAgJiYgIXN0cm5jbXAgKGJ1ZmZlciwgbmFtZSwgbGVuKSkgeworCQkJCQlpbm8gPSBOT0RFMklOTyhub2RlKTsKKwkJCQkJdHlwZSA9IE9QRlNMX0RJUjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJbm9kZSA9IG5vZGVzW25vZGVdLm5leHQ7CisJCX0KKwl9CisJbiA9IE5PREUoZGlyLT5pX2lubykubm9kZTsKKwlkaXJub2RlID0gZGlyLT5pX2lubyAtIE9QRU5QUk9NX0ZJUlNUX0lOTzsKKwlpZiAoIWlubykgeworCQlpbnQgaiA9IE5PREVQMklOTyhOT0RFKGRpci0+aV9pbm8pLmZpcnN0X3Byb3ApOworCQlpZiAoZGlybm9kZSAhPSBhbGlhc2VzKSB7CisJCQlmb3IgKHAgPSBwcm9tX2ZpcnN0cHJvcCAobiwgYnVmZmVyMik7CisJCQkgICAgIHAgJiYgKnA7CisJCQkgICAgIHAgPSBwcm9tX25leHRwcm9wIChuLCBwLCBidWZmZXIyKSkgeworCQkJCWorKzsKKwkJCQlpZiAoKGxlbiA9PSBzdHJsZW4gKHApKQorCQkJCSAgICAmJiAhc3RybmNtcCAocCwgbmFtZSwgbGVuKSkgeworCQkJCQlpbm8gPSBqOworCQkJCQl0eXBlID0gT1BGU0xfUFJPUEVSVFk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWludCBrOworCQkJZm9yIChrID0gMDsgayA8IGFsaWFzZXNfbm9kZXM7IGsrKykgeworCQkJCWorKzsKKwkJCQlpZiAoYWxpYXNfbmFtZXMgW2tdCisJCQkJICAgICYmIChsZW4gPT0gc3RybGVuIChhbGlhc19uYW1lcyBba10pKQorCQkJCSAgICAmJiAhc3RybmNtcCAoYWxpYXNfbmFtZXMgW2tdLCBuYW1lLCBsZW4pKSB7CisJCQkJCWlubyA9IGo7CisJCQkJCXR5cGUgPSBPUEZTTF9QUk9QRVJUWTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmICghaW5vKSB7CisJCWlubyA9IGxvb2t1cF9jaGlsZHJlbiAoTk9ERShkaXItPmlfaW5vKS5jaGlsZCwgbmFtZSwgbGVuKTsKKwkJaWYgKGlubykKKwkJCXR5cGUgPSBPUEZTTF9ESVI7CisJCWVsc2UgeworCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisJCX0KKwl9CisJaW5vZGUgPSBpZ2V0IChkaXItPmlfc2IsIGlubyk7CisJdW5sb2NrX2tlcm5lbCgpOworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgT1BGU0xfRElSOgorCQlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPOworCQlpZiAoaW5vID09IE9QRU5QUk9NX0ZJUlNUX0lOTyArIGFsaWFzZXMpIHsKKwkJCWlub2RlLT5pX21vZGUgfD0gU19JV1VTUjsKKwkJCWlub2RlLT5pX29wID0gJm9wZW5wcm9tX2FsaWFzX2lub2RlX29wZXJhdGlvbnM7CisJCX0gZWxzZQorCQkJaW5vZGUtPmlfb3AgPSAmb3BlbnByb21faW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJm9wZW5wcm9tX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX25saW5rID0gMjsKKwkJYnJlYWs7CisJY2FzZSBPUEZTTF9OT0RFTlVNOgorCQlpbm9kZS0+aV9tb2RlID0gU19JRlJFRyB8IFNfSVJVR087CisJCWlub2RlLT5pX2ZvcCA9ICZvcGVucHJvbWZzX25vZGVudW1fb3BzOworCQlpbm9kZS0+aV9ubGluayA9IDE7CisJCWlub2RlLT51LmdlbmVyaWNfaXAgPSAodm9pZCAqKShsb25nKShuKTsKKwkJYnJlYWs7CisJY2FzZSBPUEZTTF9QUk9QRVJUWToKKwkJaWYgKChkaXJub2RlID09IG9wdGlvbnMpICYmIChsZW4gPT0gMTcpCisJCSAgICAmJiAhc3RybmNtcCAobmFtZSwgInNlY3VyaXR5LXBhc3N3b3JkIiwgMTcpKQorCQkJaW5vZGUtPmlfbW9kZSA9IFNfSUZSRUcgfCBTX0lSVVNSIHwgU19JV1VTUjsKKwkJZWxzZSB7CisJCQlpbm9kZS0+aV9tb2RlID0gU19JRlJFRyB8IFNfSVJVR087CisJCQlpZiAoZGlybm9kZSA9PSBvcHRpb25zIHx8IGRpcm5vZGUgPT0gYWxpYXNlcykgeworCQkJCWlmIChsZW4gIT0gNCB8fCBzdHJuY21wIChuYW1lLCAibmFtZSIsIDQpKQorCQkJCQlpbm9kZS0+aV9tb2RlIHw9IFNfSVdVU1I7CisJCQl9CisJCX0KKwkJaW5vZGUtPmlfZm9wID0gJm9wZW5wcm9tZnNfcHJvcF9vcHM7CisJCWlub2RlLT5pX25saW5rID0gMTsKKwkJaWYgKGlub2RlLT5pX3NpemUgPCAwKQorCQkJaW5vZGUtPmlfc2l6ZSA9IDA7CisJCWlub2RlLT51LmdlbmVyaWNfaXAgPSAodm9pZCAqKShsb25nKSgoKHUxNilkaXJub2RlKSB8IAorCQkJKCgodTE2KShpbm8gLSBOT0RFUDJJTk8oTk9ERShkaXItPmlfaW5vKS5maXJzdF9wcm9wKSAtIDEpKSA8PCAxNikpOworCQlicmVhazsKKwl9CisKKwlpbm9kZS0+aV9naWQgPSAwOworCWlub2RlLT5pX3VpZCA9IDA7CisKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBvcGVucHJvbWZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJdW5zaWduZWQgaW50IGlubzsKKwl1MzIgbjsKKwlpbnQgaSwgajsKKwljaGFyIGJ1ZmZlclsxMjhdOworCXUxNiBub2RlOworCWNoYXIgKnA7CisJY2hhciBidWZmZXIyWzY0XTsKKworCWxvY2tfa2VybmVsKCk7CisJCisJaW5vID0gaW5vZGUtPmlfaW5vOworCWkgPSBmaWxwLT5mX3BvczsKKwlzd2l0Y2ggKGkpIHsKKwljYXNlIDA6CisJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4iLCAxLCBpLCBpbm8sIERUX0RJUikgPCAwKSBnb3RvIG91dDsKKwkJaSsrOworCQlmaWxwLT5mX3BvcysrOworCQkvKiBmYWxsIHRocnUgKi8KKwljYXNlIDE6CisJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgaSwgCisJCQkoTk9ERShpbm8pLnBhcmVudCA9PSAweGZmZmYpID8gCisJCQlPUEVOUFJPTV9ST09UX0lOTyA6IE5PREUySU5PKE5PREUoaW5vKS5wYXJlbnQpLCBEVF9ESVIpIDwgMCkgCisJCQlnb3RvIG91dDsKKwkJaSsrOworCQlmaWxwLT5mX3BvcysrOworCQkvKiBmYWxsIHRocnUgKi8KKwlkZWZhdWx0OgorCQlpIC09IDI7CisJCW5vZGUgPSBOT0RFKGlubykuY2hpbGQ7CisJCXdoaWxlIChpICYmIG5vZGUgIT0gMHhmZmZmKSB7CisJCQlub2RlID0gbm9kZXNbbm9kZV0ubmV4dDsKKwkJCWktLTsKKwkJfQorCQl3aGlsZSAobm9kZSAhPSAweGZmZmYpIHsKKwkJCWlmIChwcm9tX2dldG5hbWUgKG5vZGVzW25vZGVdLm5vZGUsIGJ1ZmZlciwgMTI4KSA8IDApCisJCQkJZ290byBvdXQ7CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksCisJCQkJICAgIGZpbHAtPmZfcG9zLCBOT0RFMklOTyhub2RlKSwgRFRfRElSKSA8IDApCisJCQkJZ290byBvdXQ7CisJCQlmaWxwLT5mX3BvcysrOworCQkJbm9kZSA9IG5vZGVzW25vZGVdLm5leHQ7CisJCX0KKwkJaiA9IE5PREVQMklOTyhOT0RFKGlubykuZmlyc3RfcHJvcCk7CisJCWlmICghaSkgeworCQkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLm5vZGUiLCA1LCBmaWxwLT5mX3BvcywgaiwgRFRfUkVHKSA8IDApCisJCQkJZ290byBvdXQ7CisJCQlmaWxwLT5mX3BvcysrOworCQl9IGVsc2UKKwkJCWktLTsKKwkJbiA9IE5PREUoaW5vKS5ub2RlOworCQlpZiAoaW5vID09IE9QRU5QUk9NX0ZJUlNUX0lOTyArIGFsaWFzZXMpIHsKKwkJCWZvciAoaisrOyBpIDwgYWxpYXNlc19ub2RlczsgaSsrLCBqKyspIHsKKwkJCQlpZiAoYWxpYXNfbmFtZXMgW2ldKSB7CisJCQkJCWlmIChmaWxsZGlyIChkaXJlbnQsIGFsaWFzX25hbWVzIFtpXSwgCisJCQkJCQlzdHJsZW4gKGFsaWFzX25hbWVzIFtpXSksIAorCQkJCQkJZmlscC0+Zl9wb3MsIGosIERUX1JFRykgPCAwKSBnb3RvIG91dDsgCisJCQkJCWZpbHAtPmZfcG9zKys7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJZm9yIChwID0gcHJvbV9maXJzdHByb3AgKG4sIGJ1ZmZlcjIpOworCQkJICAgICBwICYmICpwOworCQkJICAgICBwID0gcHJvbV9uZXh0cHJvcCAobiwgcCwgYnVmZmVyMikpIHsKKwkJCQlqKys7CisJCQkJaWYgKGkpIGktLTsKKwkJCQllbHNlIHsKKwkJCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBwLCBzdHJsZW4ocCksCisJCQkJCQkgICAgZmlscC0+Zl9wb3MsIGosIERUX1JFRykgPCAwKQorCQkJCQkJZ290byBvdXQ7CisJCQkJCWZpbHAtPmZfcG9zKys7CisJCQkJfQorCQkJfQorCQl9CisJfQorb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcGVucHJvbWZzX2NyZWF0ZSAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWNoYXIgKnA7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwkKKwlpZiAoIWRpcikKKwkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IDI1NikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcCA9IGttYWxsb2MgKGRlbnRyeS0+ZF9uYW1lLmxlbiArIDEsIEdGUF9LRVJORUwpOworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJc3RybmNweSAocCwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuKTsKKwlwIFtkZW50cnktPmRfbmFtZS5sZW5dID0gMDsKKwlsb2NrX2tlcm5lbCgpOworCWlmIChhbGlhc2VzX25vZGVzID09IEFMSUFTRVNfTk5PREVTKSB7CisJCWtmcmVlKHApOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlPOworCX0KKwlhbGlhc19uYW1lcyBbYWxpYXNlc19ub2RlcysrXSA9IHA7CisJaW5vZGUgPSBpZ2V0IChkaXItPmlfc2IsCisJCQlOT0RFUDJJTk8oTk9ERShkaXItPmlfaW5vKS5maXJzdF9wcm9wKSArIGFsaWFzZXNfbm9kZXMpOworCWlmICghaW5vZGUpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaW5vZGUtPmlfbW9kZSA9IFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUjsKKwlpbm9kZS0+aV9mb3AgPSAmb3BlbnByb21mc19wcm9wX29wczsKKwlpbm9kZS0+aV9ubGluayA9IDE7CisJaWYgKGlub2RlLT5pX3NpemUgPCAwKSBpbm9kZS0+aV9zaXplID0gMDsKKwlpbm9kZS0+dS5nZW5lcmljX2lwID0gKHZvaWQgKikobG9uZykoKCh1MTYpYWxpYXNlcykgfCAKKwkJCSgoKHUxNikoYWxpYXNlc19ub2RlcyAtIDEpKSA8PCAxNikpOworCXVubG9ja19rZXJuZWwoKTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wZW5wcm9tZnNfdW5saW5rIChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXVuc2lnbmVkIGludCBsZW47CisJY2hhciAqcDsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBpOworCQorCW5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwlsb2NrX2tlcm5lbCgpOworCWZvciAoaSA9IDA7IGkgPCBhbGlhc2VzX25vZGVzOyBpKyspCisJCWlmICgoc3RybGVuIChhbGlhc19uYW1lcyBbaV0pID09IGxlbikKKwkJICAgICYmICFzdHJuY21wIChuYW1lLCBhbGlhc19uYW1lc1tpXSwgbGVuKSkgeworCQkJY2hhciBidWZmZXJbNTEyXTsKKwkJCQorCQkJcCA9IGFsaWFzX25hbWVzIFtpXTsKKwkJCWFsaWFzX25hbWVzIFtpXSA9IE5VTEw7CisJCQlrZnJlZSAocCk7CisJCQlzdHJjcHkgKGJ1ZmZlciwgIm52dW5hbGlhcyAiKTsKKwkJCW1lbWNweSAoYnVmZmVyICsgMTAsIG5hbWUsIGxlbik7CisJCQlidWZmZXIgWzEwICsgbGVuXSA9IDA7CisJCQlwcm9tX2ZldmFsIChidWZmZXIpOworCQl9CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCisvKiB7e3sgaW5pdCBzZWN0aW9uICovCitzdGF0aWMgaW50IF9faW5pdCBjaGVja19zcGFjZSAodTE2IG4pCit7CisJdW5zaWduZWQgbG9uZyBwYWdlczsKKworCWlmICgoMSA8PCBhbGxvY2VkKSAqIFBBR0VfU0laRSA8IChuICsgMikgKiBzaXplb2Yob3BlbnByb21mc19ub2RlKSkgeworCQlwYWdlcyA9IF9fZ2V0X2ZyZWVfcGFnZXMgKEdGUF9LRVJORUwsIGFsbG9jZWQgKyAxKTsKKwkJaWYgKCFwYWdlcykKKwkJCXJldHVybiAtMTsKKworCQlpZiAobm9kZXMpIHsKKwkJCW1lbWNweSAoKGNoYXIgKilwYWdlcywgKGNoYXIgKilub2RlcywKKwkJCQkoMSA8PCBhbGxvY2VkKSAqIFBBR0VfU0laRSk7CisJCQlmcmVlX3BhZ2VzICgodW5zaWduZWQgbG9uZylub2RlcywgYWxsb2NlZCk7CisJCX0KKwkJYWxsb2NlZCsrOworCQlub2RlcyA9IChvcGVucHJvbWZzX25vZGUgKilwYWdlczsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MTYgX19pbml0IGdldF9ub2RlcyAodTE2IHBhcmVudCwgdTMyIG5vZGUpCit7CisJY2hhciAqcDsKKwl1MTYgbiA9IGxhc3Rfbm9kZSsrLCBpOworCWNoYXIgYnVmZmVyWzY0XTsKKworCWlmIChjaGVja19zcGFjZSAobikgPCAwKQorCQlyZXR1cm4gMHhmZmZmOworCW5vZGVzW25dLnBhcmVudCA9IHBhcmVudDsKKwlub2Rlc1tuXS5ub2RlID0gbm9kZTsKKwlub2Rlc1tuXS5uZXh0ID0gMHhmZmZmOworCW5vZGVzW25dLmNoaWxkID0gMHhmZmZmOworCW5vZGVzW25dLmZpcnN0X3Byb3AgPSBmaXJzdF9wcm9wKys7CisJaWYgKCFwYXJlbnQpIHsKKwkJY2hhciBidWZmZXJbOF07CisJCWludCBqOworCQkKKwkJaWYgKChqID0gcHJvbV9nZXRwcm9wZXJ0eSAobm9kZSwgIm5hbWUiLCBidWZmZXIsIDgpKSA+PSAwKSB7CisJCSAgICBidWZmZXJbal0gPSAwOworCQkgICAgaWYgKCFzdHJjbXAgKGJ1ZmZlciwgIm9wdGlvbnMiKSkKKwkJCW9wdGlvbnMgPSBuOworCQkgICAgZWxzZSBpZiAoIXN0cmNtcCAoYnVmZmVyLCAiYWxpYXNlcyIpKQorCQkgICAgICAgIGFsaWFzZXMgPSBuOworCQl9CisJfQorCWlmIChuICE9IGFsaWFzZXMpCisJCWZvciAocCA9IHByb21fZmlyc3Rwcm9wIChub2RlLCBidWZmZXIpOworCQkgICAgIHAgJiYgcCAhPSAoY2hhciAqKS0xICYmICpwOworCQkgICAgIHAgPSBwcm9tX25leHRwcm9wIChub2RlLCBwLCBidWZmZXIpKQorCQkJZmlyc3RfcHJvcCsrOworCWVsc2UgeworCQljaGFyICpxOworCQlmb3IgKHAgPSBwcm9tX2ZpcnN0cHJvcCAobm9kZSwgYnVmZmVyKTsKKwkJICAgICBwICYmIHAgIT0gKGNoYXIgKiktMSAmJiAqcDsKKwkJICAgICBwID0gcHJvbV9uZXh0cHJvcCAobm9kZSwgcCwgYnVmZmVyKSkgeworCQkJaWYgKGFsaWFzZXNfbm9kZXMgPT0gQUxJQVNFU19OTk9ERVMpCisJCQkJYnJlYWs7CisJCQlmb3IgKGkgPSAwOyBpIDwgYWxpYXNlc19ub2RlczsgaSsrKQorCQkJCWlmICghc3RyY21wIChwLCBhbGlhc19uYW1lcyBbaV0pKQorCQkJCQlicmVhazsKKwkJCWlmIChpIDwgYWxpYXNlc19ub2RlcykKKwkJCQljb250aW51ZTsKKwkJCXEgPSBrbWFsbG9jIChzdHJsZW4gKHApICsgMSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXEpCisJCQkJcmV0dXJuIDB4ZmZmZjsKKwkJCXN0cmNweSAocSwgcCk7CisJCQlhbGlhc19uYW1lcyBbYWxpYXNlc19ub2RlcysrXSA9IHE7CisJCX0KKwkJZmlyc3RfcHJvcCArPSBBTElBU0VTX05OT0RFUzsKKwl9CisJbm9kZSA9IHByb21fZ2V0Y2hpbGQgKG5vZGUpOworCWlmIChub2RlKSB7CisJCXBhcmVudCA9IGdldF9ub2RlcyAobiwgbm9kZSk7CisJCWlmIChwYXJlbnQgPT0gMHhmZmZmKQorCQkJcmV0dXJuIDB4ZmZmZjsKKwkJbm9kZXNbbl0uY2hpbGQgPSBwYXJlbnQ7CisJCXdoaWxlICgobm9kZSA9IHByb21fZ2V0c2libGluZyAobm9kZSkpICE9IDApIHsKKwkJCWkgPSBnZXRfbm9kZXMgKG4sIG5vZGUpOworCQkJaWYgKGkgPT0gMHhmZmZmKQorCQkJCXJldHVybiAweGZmZmY7CisJCQlub2Rlc1twYXJlbnRdLm5leHQgPSBpOworCQkJcGFyZW50ID0gaTsKKwkJfQorCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHZvaWQgb3BlbnByb21fcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJaWYgKGlub2RlLT5pX2lubyA9PSBPUEVOUFJPTV9ST09UX0lOTykgeworCQlpbm9kZS0+aV9vcCA9ICZvcGVucHJvbV9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmb3BlbnByb21fb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfbW9kZSA9IFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgb3BlbnByb21fcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCSpmbGFncyB8PSBNU19OT0FUSU1FOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgb3BlbnByb21fc29wcyA9IHsgCisJLnJlYWRfaW5vZGUJPSBvcGVucHJvbV9yZWFkX2lub2RlLAorCS5zdGF0ZnMJCT0gc2ltcGxlX3N0YXRmcywKKwkucmVtb3VudF9mcwk9IG9wZW5wcm9tX3JlbW91bnQsCit9OworCitzdGF0aWMgaW50IG9wZW5wcm9tX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBpbm9kZSAqIHJvb3RfaW5vZGU7CisKKwlzLT5zX2ZsYWdzIHw9IE1TX05PQVRJTUU7CisJcy0+c19ibG9ja3NpemUgPSAxMDI0OworCXMtPnNfYmxvY2tzaXplX2JpdHMgPSAxMDsKKwlzLT5zX21hZ2ljID0gT1BFTlBST01fU1VQRVJfTUFHSUM7CisJcy0+c19vcCA9ICZvcGVucHJvbV9zb3BzOworCXMtPnNfdGltZV9ncmFuID0gMTsKKwlyb290X2lub2RlID0gaWdldChzLCBPUEVOUFJPTV9ST09UX0lOTyk7CisJaWYgKCFyb290X2lub2RlKQorCQlnb3RvIG91dF9ub19yb290OworCXMtPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKKwlpZiAoIXMtPnNfcm9vdCkKKwkJZ290byBvdXRfbm9fcm9vdDsKKwlyZXR1cm4gMDsKKworb3V0X25vX3Jvb3Q6CisJcHJpbnRrKCJvcGVucHJvbV9maWxsX3N1cGVyOiBnZXQgcm9vdCBpbm9kZSBmYWlsZWRcbiIpOworCWlwdXQocm9vdF9pbm9kZSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKm9wZW5wcm9tX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBvcGVucHJvbV9maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIG9wZW5wcm9tX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJvcGVucHJvbWZzIiwKKwkuZ2V0X3NiCQk9IG9wZW5wcm9tX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYW5vbl9zdXBlciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfb3BlbnByb21fZnModm9pZCkKK3sKKwlub2RlcyA9IChvcGVucHJvbWZzX25vZGUgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIDApOworCWlmICghbm9kZXMpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIm9wZW5wcm9tZnM6IGNhbid0IGdldCBmcmVlIHBhZ2VcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKGdldF9ub2RlcyAoMHhmZmZmLCBwcm9tX3Jvb3Rfbm9kZSkgPT0gMHhmZmZmKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJvcGVucHJvbWZzOiBjb3VsZG4ndCBzZXR1cCB0cmVlXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCW5vZGVzW2xhc3Rfbm9kZV0uZmlyc3RfcHJvcCA9IGZpcnN0X3Byb3A7CisJcmV0dXJuIHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJm9wZW5wcm9tX2ZzX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9vcGVucHJvbV9mcyh2b2lkKQoreworCWludCBpOworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmb3BlbnByb21fZnNfdHlwZSk7CisJZnJlZV9wYWdlcyAoKHVuc2lnbmVkIGxvbmcpbm9kZXMsIGFsbG9jZWQpOworCWZvciAoaSA9IDA7IGkgPCBhbGlhc2VzX25vZGVzOyBpKyspCisJCWlmIChhbGlhc19uYW1lcyBbaV0pCisJCQlrZnJlZSAoYWxpYXNfbmFtZXMgW2ldKTsKKwlub2RlcyA9IE5VTEw7Cit9CisKK21vZHVsZV9pbml0KGluaXRfb3BlbnByb21fZnMpCittb2R1bGVfZXhpdChleGl0X29wZW5wcm9tX2ZzKQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9LY29uZmlnIGIvZnMvcGFydGl0aW9ucy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYjI1YjYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL0tjb25maWcKQEAgLTAsMCArMSwyMjggQEAKKyMKKyMgUGFydGl0aW9uIGNvbmZpZ3VyYXRpb24KKyMKK2NvbmZpZyBQQVJUSVRJT05fQURWQU5DRUQKKwlib29sICJBZHZhbmNlZCBwYXJ0aXRpb24gc2VsZWN0aW9uIgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIGhhcmQgZGlza3MgdW5kZXIgTGludXggd2hpY2gKKwkgIHdlcmUgcGFydGl0aW9uZWQgdW5kZXIgYW4gb3BlcmF0aW5nIHN5c3RlbSBydW5uaW5nIG9uIGEgZGlmZmVyZW50CisJICBhcmNoaXRlY3R1cmUgdGhhbiB5b3VyIExpbnV4IHN5c3RlbS4KKworCSAgTm90ZSB0aGF0IHRoZSBhbnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiB3b24ndCBkaXJlY3RseSBhZmZlY3QgdGhlCisJICBrZXJuZWw6IHNheWluZyBOIHdpbGwganVzdCBjYXVzZSB0aGUgY29uZmlndXJhdG9yIHRvIHNraXAgYWxsCisJICB0aGUgcXVlc3Rpb25zIGFib3V0IGZvcmVpZ24gcGFydGl0aW9uaW5nIHNjaGVtZXMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBBQ09STl9QQVJUSVRJT04KKwlib29sICJBY29ybiBwYXJ0aXRpb24gc3VwcG9ydCIgaWYgUEFSVElUSU9OX0FEVkFOQ0VECisJZGVmYXVsdCB5IGlmIEFSQ0hfQUNPUk4KKwloZWxwCisJICBTdXBwb3J0IGhhcmQgZGlza3MgcGFydGl0aW9uZWQgdW5kZXIgQWNvcm4gb3BlcmF0aW5nIHN5c3RlbXMuCisKK2NvbmZpZyBBQ09STl9QQVJUSVRJT05fQ1VNQU5BCisJYm9vbCAiQ3VtYW5hIHBhcnRpdGlvbiBzdXBwb3J0IiBpZiBQQVJUSVRJT05fQURWQU5DRUQgJiYgQUNPUk5fUEFSVElUSU9OCisJZGVmYXVsdCB5IGlmIEFSQ0hfQUNPUk4KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBoYXJkIGRpc2tzIHVuZGVyIExpbnV4IHdoaWNoCisJICB3ZXJlIHBhcnRpdGlvbmVkIHVzaW5nIHRoZSBDdW1hbmEgaW50ZXJmYWNlIG9uIEFjb3JuIG1hY2hpbmVzLgorCitjb25maWcgQUNPUk5fUEFSVElUSU9OX0VFU09YCisJYm9vbCAiRUVTT1ggcGFydGl0aW9uIHN1cHBvcnQiIGlmIFBBUlRJVElPTl9BRFZBTkNFRCAmJiBBQ09STl9QQVJUSVRJT04KKwlkZWZhdWx0IHkgaWYgQVJDSF9BQ09STgorCitjb25maWcgQUNPUk5fUEFSVElUSU9OX0lDUworCWJvb2wgIklDUyBwYXJ0aXRpb24gc3VwcG9ydCIgaWYgUEFSVElUSU9OX0FEVkFOQ0VEICYmIEFDT1JOX1BBUlRJVElPTgorCWRlZmF1bHQgeSBpZiBBUkNIX0FDT1JOCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgaGFyZCBkaXNrcyB1bmRlciBMaW51eCB3aGljaAorCSAgd2VyZSBwYXJ0aXRpb25lZCB1c2luZyB0aGUgSUNTIGludGVyZmFjZSBvbiBBY29ybiBtYWNoaW5lcy4KKworY29uZmlnIEFDT1JOX1BBUlRJVElPTl9BREZTCisJYm9vbCAiTmF0aXZlIGZpbGVjb3JlIHBhcnRpdGlvbiBzdXBwb3J0IiBpZiBQQVJUSVRJT05fQURWQU5DRUQgJiYgQUNPUk5fUEFSVElUSU9OCisJZGVmYXVsdCB5IGlmIEFSQ0hfQUNPUk4KKwloZWxwCisJICBUaGUgQWNvcm4gRGlzYyBGaWxpbmcgU3lzdGVtIGlzIHRoZSBzdGFuZGFyZCBmaWxlIHN5c3RlbSBvZiB0aGUKKwkgIFJpc2NPUyBvcGVyYXRpbmcgc3lzdGVtIHdoaWNoIHJ1bnMgb24gQWNvcm4ncyBBUk0tYmFzZWQgUmlzYyBQQworCSAgc3lzdGVtcyBhbmQgdGhlIEFjb3JuIEFyY2hpbWVkZXMgcmFuZ2Ugb2YgbWFjaGluZXMuICBJZiB5b3Ugc2F5CisJICBgWScgaGVyZSwgTGludXggd2lsbCBzdXBwb3J0IGRpc2sgcGFydGl0aW9ucyBjcmVhdGVkIHVuZGVyIEFERlMuCisKK2NvbmZpZyBBQ09STl9QQVJUSVRJT05fUE9XRVJURUMKKwlib29sICJQb3dlclRlYyBwYXJ0aXRpb24gc3VwcG9ydCIgaWYgUEFSVElUSU9OX0FEVkFOQ0VEICYmIEFDT1JOX1BBUlRJVElPTgorCWRlZmF1bHQgeSBpZiBBUkNIX0FDT1JOCisJaGVscAorCSAgU3VwcG9ydCByZWFkaW5nIHBhcnRpdGlvbiB0YWJsZXMgY3JlYXRlZCBvbiBBY29ybiBtYWNoaW5lcyB1c2luZworCSAgdGhlIFBvd2VyVGVjIFNDU0kgZHJpdmUuCisKK2NvbmZpZyBBQ09STl9QQVJUSVRJT05fUklTQ0lYCisJYm9vbCAiUklTQ2lYIHBhcnRpdGlvbiBzdXBwb3J0IiBpZiBQQVJUSVRJT05fQURWQU5DRUQgJiYgQUNPUk5fUEFSVElUSU9OCisJZGVmYXVsdCB5IGlmIEFSQ0hfQUNPUk4KKwloZWxwCisJICBPbmNlIHVwb24gYSB0aW1lLCB0aGVyZSB3YXMgYSBuYXRpdmUgVW5peCBwb3J0IGZvciB0aGUgQWNvcm4gc2VyaWVzCisJICBvZiBtYWNoaW5lcyBjYWxsZWQgUklTQ2lYLiAgSWYgeW91IHNheSAnWScgaGVyZSwgTGludXggd2lsbCBiZSBhYmxlCisJICB0byByZWFkIGRpc2tzIHBhcnRpdGlvbmVkIHVuZGVyIFJJU0NpWC4KKworY29uZmlnIE9TRl9QQVJUSVRJT04KKwlib29sICJBbHBoYSBPU0YgcGFydGl0aW9uIHN1cHBvcnQiIGlmIFBBUlRJVElPTl9BRFZBTkNFRAorCWRlZmF1bHQgeSBpZiBBTFBIQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIGhhcmQgZGlza3MgdW5kZXIgTGludXggd2hpY2gKKwkgIHdlcmUgcGFydGl0aW9uZWQgb24gYW4gQWxwaGEgbWFjaGluZS4KKworY29uZmlnIEFNSUdBX1BBUlRJVElPTgorCWJvb2wgIkFtaWdhIHBhcnRpdGlvbiB0YWJsZSBzdXBwb3J0IiBpZiBQQVJUSVRJT05fQURWQU5DRUQKKwlkZWZhdWx0IHkgaWYgKEFNSUdBIHx8IEFGRlNfRlM9eSkKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBoYXJkIGRpc2tzIHVuZGVyIExpbnV4IHdoaWNoCisJICB3ZXJlIHBhcnRpdGlvbmVkIHVuZGVyIEFtaWdhT1MuCisKK2NvbmZpZyBBVEFSSV9QQVJUSVRJT04KKwlib29sICJBdGFyaSBwYXJ0aXRpb24gdGFibGUgc3VwcG9ydCIgaWYgUEFSVElUSU9OX0FEVkFOQ0VECisJZGVmYXVsdCB5IGlmIEFUQVJJCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgaGFyZCBkaXNrcyB1bmRlciBMaW51eCB3aGljaAorCSAgd2VyZSBwYXJ0aXRpb25lZCB1bmRlciB0aGUgQXRhcmkgT1MuCisKK2NvbmZpZyBJQk1fUEFSVElUSU9OCisJYm9vbCAiSUJNIGRpc2sgbGFiZWwgYW5kIHBhcnRpdGlvbiBzdXBwb3J0IgorCWRlcGVuZHMgb24gUEFSVElUSU9OX0FEVkFOQ0VEICYmIEFSQ0hfUzM5MAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdvdWxkIGxpa2UgdG8gYmUgYWJsZSB0byByZWFkIHRoZSBoYXJkIGRpc2sKKwkgIHBhcnRpdGlvbiB0YWJsZSBmb3JtYXQgdXNlZCBieSBJQk0gREFTRCBkaXNrcyBvcGVyYXRpbmcgdW5kZXIgQ01TLgorCSAgT3RoZXJ3aXNlLCBzYXkgTi4KKworY29uZmlnIE1BQ19QQVJUSVRJT04KKwlib29sICJNYWNpbnRvc2ggcGFydGl0aW9uIG1hcCBzdXBwb3J0IiBpZiBQQVJUSVRJT05fQURWQU5DRUQKKwlkZWZhdWx0IHkgaWYgTUFDCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgaGFyZCBkaXNrcyB1bmRlciBMaW51eCB3aGljaAorCSAgd2VyZSBwYXJ0aXRpb25lZCBvbiBhIE1hY2ludG9zaC4KKworY29uZmlnIE1TRE9TX1BBUlRJVElPTgorCWJvb2wgIlBDIEJJT1MgKE1TRE9TIHBhcnRpdGlvbiB0YWJsZXMpIHN1cHBvcnQiIGlmIFBBUlRJVElPTl9BRFZBTkNFRAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNheSBZIGhlcmUuCisKK2NvbmZpZyBCU0RfRElTS0xBQkVMCisJYm9vbCAiQlNEIGRpc2tsYWJlbCAoRnJlZUJTRCBwYXJ0aXRpb24gdGFibGVzKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUEFSVElUSU9OX0FEVkFOQ0VEICYmIE1TRE9TX1BBUlRJVElPTgorCWhlbHAKKwkgIEZyZWVCU0QgdXNlcyBpdHMgb3duIGhhcmQgZGlzayBwYXJ0aXRpb24gc2NoZW1lIG9uIHlvdXIgUEMuIEl0CisJICByZXF1aXJlcyBvbmx5IG9uZSBlbnRyeSBpbiB0aGUgcHJpbWFyeSBwYXJ0aXRpb24gdGFibGUgb2YgeW91ciBkaXNrCisJICBhbmQgbWFuYWdlcyBpdCBzaW1pbGFybHkgdG8gRE9TIGV4dGVuZGVkIHBhcnRpdGlvbnMsIHB1dHRpbmcgaW4gaXRzCisJICBmaXJzdCBzZWN0b3IgYSBuZXcgcGFydGl0aW9uIHRhYmxlIGluIEJTRCBkaXNrbGFiZWwgZm9ybWF0LiBTYXlpbmcgWQorCSAgaGVyZSBhbGxvd3MgeW91IHRvIHJlYWQgdGhlc2UgZGlza2xhYmVscyBhbmQgZnVydGhlciBtb3VudCBGcmVlQlNECisJICBwYXJ0aXRpb25zIGZyb20gd2l0aGluIExpbnV4IGlmIHlvdSBoYXZlIGFsc28gc2FpZCBZIHRvICJVRlMKKwkgIGZpbGUgc3lzdGVtIHN1cHBvcnQiLCBhYm92ZS4gSWYgeW91IGRvbid0IGtub3cgd2hhdCBhbGwgdGhpcyBpcworCSAgYWJvdXQsIHNheSBOLgorCitjb25maWcgTUlOSVhfU1VCUEFSVElUSU9OCisJYm9vbCAiTWluaXggc3VicGFydGl0aW9uIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQVJUSVRJT05fQURWQU5DRUQgJiYgTVNET1NfUEFSVElUSU9OCisJaGVscAorCSAgTWluaXggMi4wLjAvMi4wLjIgc3VicGFydGl0aW9uIHRhYmxlIHN1cHBvcnQgZm9yIExpbnV4LgorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBtb3VudCBhbmQgdXNlIE1pbml4IDIuMC4wLzIuMC4yCisJICBzdWJwYXJ0aXRpb25zLgorCitjb25maWcgU09MQVJJU19YODZfUEFSVElUSU9OCisJYm9vbCAiU29sYXJpcyAoeDg2KSBwYXJ0aXRpb24gdGFibGUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBBUlRJVElPTl9BRFZBTkNFRCAmJiBNU0RPU19QQVJUSVRJT04KKwloZWxwCisJICBMaWtlIG1vc3Qgc3lzdGVtcywgU29sYXJpcyB4ODYgdXNlcyBpdHMgb3duIGhhcmQgZGlzayBwYXJ0aXRpb24KKwkgIHRhYmxlIGZvcm1hdCwgaW5jb21wYXRpYmxlIHdpdGggYWxsIG90aGVycy4gU2F5aW5nIFkgaGVyZSBhbGxvd3MgeW91CisJICB0byByZWFkIHRoZXNlIHBhcnRpdGlvbiB0YWJsZXMgYW5kIGZ1cnRoZXIgbW91bnQgU29sYXJpcyB4ODYKKwkgIHBhcnRpdGlvbnMgZnJvbSB3aXRoaW4gTGludXggaWYgeW91IGhhdmUgYWxzbyBzYWlkIFkgdG8gIlVGUworCSAgZmlsZSBzeXN0ZW0gc3VwcG9ydCIsIGFib3ZlLgorCitjb25maWcgVU5JWFdBUkVfRElTS0xBQkVMCisJYm9vbCAiVW5peHdhcmUgc2xpY2VzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQVJUSVRJT05fQURWQU5DRUQgJiYgTVNET1NfUEFSVElUSU9OCisJLS0taGVscC0tLQorCSAgTGlrZSBzb21lIHN5c3RlbXMsIFVuaXhXYXJlIHVzZXMgaXRzIG93biBzbGljZSB0YWJsZSBpbnNpZGUgYQorCSAgcGFydGl0aW9uIChWVE9DIC0gVmlydHVhbCBUYWJsZSBvZiBDb250ZW50cykuIEl0cyBmb3JtYXQgaXMKKwkgIGluY29tcGF0aWJsZSB3aXRoIGFsbCBvdGhlciBPU2VzLiBTYXlpbmcgWSBoZXJlIGFsbG93cyB5b3UgdG8gcmVhZAorCSAgVlRPQyBhbmQgZnVydGhlciBtb3VudCBVbml4V2FyZSBwYXJ0aXRpb25zIHJlYWQtb25seSBmcm9tIHdpdGhpbgorCSAgTGludXggaWYgeW91IGhhdmUgYWxzbyBzYWlkIFkgdG8gIlVGUyBmaWxlIHN5c3RlbSBzdXBwb3J0IiBvcgorCSAgIlN5c3RlbSBWIGFuZCBDb2hlcmVudCBmaWxlIHN5c3RlbSBzdXBwb3J0IiwgYWJvdmUuCisKKwkgIFRoaXMgaXMgbWFpbmx5IHVzZWQgdG8gY2FycnkgZGF0YSBmcm9tIGEgVW5peFdhcmUgYm94IHRvIHlvdXIKKwkgIExpbnV4IGJveCB2aWEgYSByZW1vdmFibGUgbWVkaXVtIGxpa2UgbWFnbmV0by1vcHRpY2FsLCBaSVAgb3IKKwkgIHJlbW92YWJsZSBJREUgZHJpdmVzLiBOb3RlLCBob3dldmVyLCB0aGF0IGEgZ29vZCBwb3J0YWJsZSB3YXkgdG8KKwkgIHRyYW5zcG9ydCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYmV0d2VlbiB1bml4ZXMgKGFuZCBldmVuIG90aGVyCisJICBvcGVyYXRpbmcgc3lzdGVtcykgaXMgZ2l2ZW4gYnkgdGhlIHRhciBwcm9ncmFtICgibWFuIHRhciIgb3IKKwkgIHByZWZlcmFibHkgImluZm8gdGFyIikuCisKKwkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgYWxsIHRoaXMgaXMgYWJvdXQsIHNheSBOLgorCitjb25maWcgTERNX1BBUlRJVElPTgorCWJvb2wgIldpbmRvd3MgTG9naWNhbCBEaXNrIE1hbmFnZXIgKER5bmFtaWMgRGlzaykgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBBUlRJVElPTl9BRFZBTkNFRAorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIGhhcmQgZGlza3MgdW5kZXIgTGludXggd2hpY2gKKwkgIHdlcmUgcGFydGl0aW9uZWQgdXNpbmcgV2luZG93cyAyMDAwJ3Mgb3IgWFAncyBMb2dpY2FsIERpc2sgTWFuYWdlci4KKwkgIFRoZXkgYXJlIGFsc28ga25vd24gYXMgIkR5bmFtaWMgRGlza3MiLgorCisJICBXaW5kb3dzIDIwMDAgaW50cm9kdWNlZCB0aGUgY29uY2VwdCBvZiBEeW5hbWljIERpc2tzIHRvIGdldCBhcm91bmQKKwkgIHRoZSBsaW1pdGF0aW9ucyBvZiB0aGUgUEMncyBwYXJ0aXRpb25pbmcgc2NoZW1lLiAgVGhlIExvZ2ljYWwgRGlzaworCSAgTWFuYWdlciBhbGxvd3MgdGhlIHVzZXIgdG8gcmVwYXJ0aXRpb24gYSBkaXNrIGFuZCBjcmVhdGUgc3Bhbm5lZCwKKwkgIG1pcnJvcmVkLCBzdHJpcGVkIG9yIFJBSUQgdm9sdW1lcywgYWxsIHdpdGhvdXQgdGhlIG5lZWQgZm9yCisJICByZWJvb3RpbmcuCisKKwkgIE5vcm1hbCBwYXJ0aXRpb25zIGFyZSBub3cgY2FsbGVkIEJhc2ljIERpc2tzIHVuZGVyIFdpbmRvd3MgMjAwMCBhbmQKKwkgIFhQLgorCisJICBGb3IgYSBmdWxsZXIgZGVzY3JpcHRpb24gcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL2xkbS50eHQ+LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTERNX0RFQlVHCisJYm9vbCAiV2luZG93cyBMRE0gZXh0cmEgbG9nZ2luZyIKKwlkZXBlbmRzIG9uIExETV9QQVJUSVRJT04KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3b3VsZCBsaWtlIExETSB0byBsb2cgdmVyYm9zZWx5LiAgVGhpcyBjb3VsZCBiZQorCSAgaGVscGZ1bCBpZiB0aGUgZHJpdmVyIGRvZXNuJ3Qgd29yayBhcyBleHBlY3RlZCBhbmQgeW91J2QgbGlrZSB0bworCSAgcmVwb3J0IGEgYnVnLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU0dJX1BBUlRJVElPTgorCWJvb2wgIlNHSSBwYXJ0aXRpb24gc3VwcG9ydCIgaWYgUEFSVElUSU9OX0FEVkFOQ0VECisJZGVmYXVsdCB5IGlmIChTR0lfSVAyMiB8fCBTR0lfSVAyNyB8fCAoKE1BQ0hfSkFaWiB8fCBTTklfUk0yMDBfUENJKSAmJiAhQ1BVX0xJVFRMRV9FTkRJQU4pKQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdvdWxkIGxpa2UgdG8gYmUgYWJsZSB0byByZWFkIHRoZSBoYXJkIGRpc2sKKwkgIHBhcnRpdGlvbiB0YWJsZSBmb3JtYXQgdXNlZCBieSBTR0kgbWFjaGluZXMuCisKK2NvbmZpZyBVTFRSSVhfUEFSVElUSU9OCisJYm9vbCAiVWx0cml4IHBhcnRpdGlvbiB0YWJsZSBzdXBwb3J0IiBpZiBQQVJUSVRJT05fQURWQU5DRUQKKwlkZWZhdWx0IHkgaWYgTUFDSF9ERUNTVEFUSU9OCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd291bGQgbGlrZSB0byBiZSBhYmxlIHRvIHJlYWQgdGhlIGhhcmQgZGlzaworCSAgcGFydGl0aW9uIHRhYmxlIGZvcm1hdCB1c2VkIGJ5IERFQyAobm93IENvbXBhcSkgVWx0cml4IG1hY2hpbmVzLgorCSAgT3RoZXJ3aXNlLCBzYXkgTi4KKworY29uZmlnIFNVTl9QQVJUSVRJT04KKwlib29sICJTdW4gcGFydGl0aW9uIHRhYmxlcyBzdXBwb3J0IiBpZiBQQVJUSVRJT05fQURWQU5DRUQKKwlkZWZhdWx0IHkgaWYgKFNQQVJDMzIgfHwgU1BBUkM2NCB8fCBTVU4zIHx8IFNVTjNYKQorCS0tLWhlbHAtLS0KKwkgIExpa2UgbW9zdCBzeXN0ZW1zLCBTdW5PUyB1c2VzIGl0cyBvd24gaGFyZCBkaXNrIHBhcnRpdGlvbiB0YWJsZQorCSAgZm9ybWF0LCBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb3RoZXJzLiBTYXlpbmcgWSBoZXJlIGFsbG93cyB5b3UgdG8KKwkgIHJlYWQgdGhlc2UgcGFydGl0aW9uIHRhYmxlcyBhbmQgZnVydGhlciBtb3VudCBTdW5PUyBwYXJ0aXRpb25zIGZyb20KKwkgIHdpdGhpbiBMaW51eCBpZiB5b3UgaGF2ZSBhbHNvIHNhaWQgWSB0byAiVUZTIGZpbGUgc3lzdGVtIHN1cHBvcnQiLAorCSAgYWJvdmUuIFRoaXMgaXMgbWFpbmx5IHVzZWQgdG8gY2FycnkgZGF0YSBmcm9tIGEgU1BBUkMgdW5kZXIgU3VuT1MgdG8KKwkgIHlvdXIgTGludXggYm94IHZpYSBhIHJlbW92YWJsZSBtZWRpdW0gbGlrZSBtYWduZXRvLW9wdGljYWwgb3IgWklQCisJICBkcml2ZXM7IG5vdGUgaG93ZXZlciB0aGF0IGEgZ29vZCBwb3J0YWJsZSB3YXkgdG8gdHJhbnNwb3J0IGZpbGVzIGFuZAorCSAgZGlyZWN0b3JpZXMgYmV0d2VlbiB1bml4ZXMgKGFuZCBldmVuIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zKSBpcworCSAgZ2l2ZW4gYnkgdGhlIHRhciBwcm9ncmFtICgibWFuIHRhciIgb3IgcHJlZmVyYWJseSAiaW5mbyB0YXIiKS4gSWYKKwkgIHlvdSBkb24ndCBrbm93IHdoYXQgYWxsIHRoaXMgaXMgYWJvdXQsIHNheSBOLgorCitjb25maWcgRUZJX1BBUlRJVElPTgorCWJvb2wgIkVGSSBHVUlEIFBhcnRpdGlvbiBzdXBwb3J0IgorCWRlcGVuZHMgb24gUEFSVElUSU9OX0FEVkFOQ0VECisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgaGFyZCBkaXNrcyB1bmRlciBMaW51eCB3aGljaAorCSAgd2VyZSBwYXJ0aXRpb25lZCB1c2luZyBFRkkgR1BULiAgUHJlc2VudGx5IG9ubHkgdXNlZnVsIG9uIHRoZQorCSAgSUEtNjQgcGxhdGZvcm0uCisKKyMgICAgICBkZWZpbmVfYm9vbCBDT05GSUdfQUNPUk5fUEFSVElUSU9OX0NVTUFOQSB5CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL01ha2VmaWxlIGIvZnMvcGFydGl0aW9ucy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzgzYzE3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcGFydGl0aW9ucy9NYWtlZmlsZQpAQCAtMCwwICsxLDIwIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgorIworCitvYmoteSA6PSBjaGVjay5vCisKK29iai0kKENPTkZJR19ERVZGU19GUykgKz0gZGV2ZnMubworb2JqLSQoQ09ORklHX0FDT1JOX1BBUlRJVElPTikgKz0gYWNvcm4ubworb2JqLSQoQ09ORklHX0FNSUdBX1BBUlRJVElPTikgKz0gYW1pZ2Eubworb2JqLSQoQ09ORklHX0FUQVJJX1BBUlRJVElPTikgKz0gYXRhcmkubworb2JqLSQoQ09ORklHX01BQ19QQVJUSVRJT04pICs9IG1hYy5vCitvYmotJChDT05GSUdfTERNX1BBUlRJVElPTikgKz0gbGRtLm8KK29iai0kKENPTkZJR19NU0RPU19QQVJUSVRJT04pICs9IG1zZG9zLm8KK29iai0kKENPTkZJR19PU0ZfUEFSVElUSU9OKSArPSBvc2Yubworb2JqLSQoQ09ORklHX1NHSV9QQVJUSVRJT04pICs9IHNnaS5vCitvYmotJChDT05GSUdfU1VOX1BBUlRJVElPTikgKz0gc3VuLm8KK29iai0kKENPTkZJR19VTFRSSVhfUEFSVElUSU9OKSArPSB1bHRyaXgubworb2JqLSQoQ09ORklHX0lCTV9QQVJUSVRJT04pICs9IGlibS5vCitvYmotJChDT05GSUdfRUZJX1BBUlRJVElPTikgKz0gZWZpLm8KK29iai0kKENPTkZJR19ORUM5OF9QQVJUSVRJT04pICs9IG5lYzk4Lm8gbXNkb3MubwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9hY29ybi5jIGIvZnMvcGFydGl0aW9ucy9hY29ybi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNTA4NTcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL2Fjb3JuLmMKQEAgLTAsMCArMSw1NTcgQEAKKy8qCisgKiAgbGludXgvZnMvcGFydGl0aW9ucy9hY29ybi5jCisgKgorICogIENvcHlyaWdodCAoYykgMTk5Ni0yMDAwIFJ1c3NlbGwgS2luZy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBTY2FuIEFERlMgcGFydGl0aW9ucyBvbiBoYXJkIGRpc2sgZHJpdmVzLiAgVW5mb3J0dW5hdGVseSwgdGhlcmUKKyAqICBpc24ndCBhIHN0YW5kYXJkIGZvciBwYXJ0aXRpb25pbmcgZHJpdmVzIG9uIEFjb3JuIG1hY2hpbmVzLCBzbworICogIGV2ZXJ5IHNpbmdsZSBtYW51ZmFjdHVyZXIgb2YgU0NTSSBhbmQgSURFIGNhcmRzIGNyZWF0ZWQgdGhlaXIgb3duCisgKiAgbWV0aG9kLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9hZGZzX2ZzLmg+CisKKyNpbmNsdWRlICJjaGVjay5oIgorI2luY2x1ZGUgImFjb3JuLmgiCisKKy8qCisgKiBQYXJ0aXRpb24gdHlwZXMuIChPaCBmb3IgcmV1c2FiaWxpdHkpCisgKi8KKyNkZWZpbmUgUEFSVElUSU9OX1JJU0NJWF9NRk0JMQorI2RlZmluZSBQQVJUSVRJT05fUklTQ0lYX1NDU0kJMgorI2RlZmluZSBQQVJUSVRJT05fTElOVVgJCTkKKworc3RhdGljIHN0cnVjdCBhZGZzX2Rpc2NyZWNvcmQgKgorYWRmc19wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgY2hhciAqbmFtZSwgY2hhciAqZGF0YSwKKwkgICAgICAgdW5zaWduZWQgbG9uZyBmaXJzdF9zZWN0b3IsIGludCBzbG90KQoreworCXN0cnVjdCBhZGZzX2Rpc2NyZWNvcmQgKmRyOworCXVuc2lnbmVkIGludCBucl9zZWN0czsKKworCWlmIChhZGZzX2NoZWNrYmJsayhkYXRhKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkciA9IChzdHJ1Y3QgYWRmc19kaXNjcmVjb3JkICopKGRhdGEgKyAweDFjMCk7CisKKwlpZiAoZHItPmRpc2Nfc2l6ZSA9PSAwICYmIGRyLT5kaXNjX3NpemVfaGlnaCA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCW5yX3NlY3RzID0gKGxlMzJfdG9fY3B1KGRyLT5kaXNjX3NpemVfaGlnaCkgPDwgMjMpIHwKKwkJICAgKGxlMzJfdG9fY3B1KGRyLT5kaXNjX3NpemUpID4+IDkpOworCisJaWYgKG5hbWUpCisJCXByaW50aygiIFslc10iLCBuYW1lKTsKKwlwdXRfcGFydGl0aW9uKHN0YXRlLCBzbG90LCBmaXJzdF9zZWN0b3IsIG5yX3NlY3RzKTsKKwlyZXR1cm4gZHI7Cit9CisKKyNpZmRlZiBDT05GSUdfQUNPUk5fUEFSVElUSU9OX1JJU0NJWAorCitzdHJ1Y3QgcmlzY2l4X3BhcnQgeworCV9fbGUzMglzdGFydDsKKwlfX2xlMzIJbGVuZ3RoOworCV9fbGUzMglvbmU7CisJY2hhcgluYW1lWzE2XTsKK307CisKK3N0cnVjdCByaXNjaXhfcmVjb3JkIHsKKwlfX2xlMzIJbWFnaWM7CisjZGVmaW5lIFJJU0NJWF9NQUdJQwljcHVfdG9fbGUzMigweDRhNjU3MzIwKQorCV9fbGUzMglkYXRlOworCXN0cnVjdCByaXNjaXhfcGFydCBwYXJ0WzhdOworfTsKKworc3RhdGljIGludAorcmlzY2l4X3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQl1bnNpZ25lZCBsb25nIGZpcnN0X3NlY3QsIGludCBzbG90LCB1bnNpZ25lZCBsb25nIG5yX3NlY3RzKQoreworCVNlY3RvciBzZWN0OworCXN0cnVjdCByaXNjaXhfcmVjb3JkICpycjsKKwkKKwlyciA9IChzdHJ1Y3QgcmlzY2l4X3JlY29yZCAqKXJlYWRfZGV2X3NlY3RvcihiZGV2LCBmaXJzdF9zZWN0LCAmc2VjdCk7CisJaWYgKCFycikKKwkJcmV0dXJuIC0xOworCisJcHJpbnRrKCIgW1JJU0NpWF0iKTsKKworCisJaWYgKHJyLT5tYWdpYyA9PSBSSVNDSVhfTUFHSUMpIHsKKwkJdW5zaWduZWQgbG9uZyBzaXplID0gbnJfc2VjdHMgPiAyID8gMiA6IG5yX3NlY3RzOworCQlpbnQgcGFydDsKKworCQlwcmludGsoIiA8Iik7CisKKwkJcHV0X3BhcnRpdGlvbihzdGF0ZSwgc2xvdCsrLCBmaXJzdF9zZWN0LCBzaXplKTsKKwkJZm9yIChwYXJ0ID0gMDsgcGFydCA8IDg7IHBhcnQrKykgeworCQkJaWYgKHJyLT5wYXJ0W3BhcnRdLm9uZSAmJgorCQkJICAgIG1lbWNtcChyci0+cGFydFtwYXJ0XS5uYW1lLCAiQWxsXDAiLCA0KSkgeworCQkJCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHNsb3QrKywKKwkJCQkJbGUzMl90b19jcHUocnItPnBhcnRbcGFydF0uc3RhcnQpLAorCQkJCQlsZTMyX3RvX2NwdShyci0+cGFydFtwYXJ0XS5sZW5ndGgpKTsKKwkJCQlwcmludGsoIiglcykiLCByci0+cGFydFtwYXJ0XS5uYW1lKTsKKwkJCX0KKwkJfQorCisJCXByaW50aygiID5cbiIpOworCX0gZWxzZSB7CisJCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHNsb3QrKywgZmlyc3Rfc2VjdCwgbnJfc2VjdHMpOworCX0KKworCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCXJldHVybiBzbG90OworfQorI2VuZGlmCisKKyNkZWZpbmUgTElOVVhfTkFUSVZFX01BR0lDIDB4ZGVhZmExZGUKKyNkZWZpbmUgTElOVVhfU1dBUF9NQUdJQyAgIDB4ZGVhZmFiMWUKKworc3RydWN0IGxpbnV4X3BhcnQgeworCV9fbGUzMiBtYWdpYzsKKwlfX2xlMzIgc3RhcnRfc2VjdDsKKwlfX2xlMzIgbnJfc2VjdHM7Cit9OworCitzdGF0aWMgaW50CitsaW51eF9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJdW5zaWduZWQgbG9uZyBmaXJzdF9zZWN0LCBpbnQgc2xvdCwgdW5zaWduZWQgbG9uZyBucl9zZWN0cykKK3sKKwlTZWN0b3Igc2VjdDsKKwlzdHJ1Y3QgbGludXhfcGFydCAqbGludXhwOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IG5yX3NlY3RzID4gMiA/IDIgOiBucl9zZWN0czsKKworCXByaW50aygiIFtMaW51eF0iKTsKKworCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHNsb3QrKywgZmlyc3Rfc2VjdCwgc2l6ZSk7CisKKwlsaW51eHAgPSAoc3RydWN0IGxpbnV4X3BhcnQgKilyZWFkX2Rldl9zZWN0b3IoYmRldiwgZmlyc3Rfc2VjdCwgJnNlY3QpOworCWlmICghbGludXhwKQorCQlyZXR1cm4gLTE7CisKKwlwcmludGsoIiA8Iik7CisJd2hpbGUgKGxpbnV4cC0+bWFnaWMgPT0gY3B1X3RvX2xlMzIoTElOVVhfTkFUSVZFX01BR0lDKSB8fAorCSAgICAgICBsaW51eHAtPm1hZ2ljID09IGNwdV90b19sZTMyKExJTlVYX1NXQVBfTUFHSUMpKSB7CisJCWlmIChzbG90ID09IHN0YXRlLT5saW1pdCkKKwkJCWJyZWFrOworCQlwdXRfcGFydGl0aW9uKHN0YXRlLCBzbG90KyssIGZpcnN0X3NlY3QgKworCQkJCSBsZTMyX3RvX2NwdShsaW51eHAtPnN0YXJ0X3NlY3QpLAorCQkJCSBsZTMyX3RvX2NwdShsaW51eHAtPm5yX3NlY3RzKSk7CisJCWxpbnV4cCArKzsKKwl9CisJcHJpbnRrKCIgPiIpOworCisJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJcmV0dXJuIHNsb3Q7Cit9CisKKyNpZmRlZiBDT05GSUdfQUNPUk5fUEFSVElUSU9OX0NVTUFOQQoraW50CithZGZzcGFydF9jaGVja19DVU1BTkEoc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZpcnN0X3NlY3RvciA9IDA7CisJdW5zaWduZWQgaW50IHN0YXJ0X2JsayA9IDA7CisJU2VjdG9yIHNlY3Q7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwljaGFyICpuYW1lID0gIkNVTUFOQS9BREZTIjsKKwlpbnQgZmlyc3QgPSAxOworCWludCBzbG90ID0gMTsKKworCS8qCisJICogVHJ5IEN1bWFuYSBzdHlsZSBwYXJ0aXRpb25zIC0gc2VjdG9yIDYgY29udGFpbnMgQURGUyBib290IGJsb2NrCisJICogd2l0aCBwb2ludGVyIHRvIG5leHQgJ2RyaXZlJy4KKwkgKgorCSAqIFRoZXJlIGFyZSB1bmtub3ducyBpbiB0aGlzIGNvZGUgLSBpcyB0aGUgJ2N5bGluZGVyIG51bWJlcicgb2YgdGhlCisJICogbmV4dCBwYXJ0aXRpb24gcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgb25lIC0gSSdtIGFzc3VtaW5nCisJICogaXQgaXMuCisJICoKKwkgKiBBbHNvLCB3aGljaCBJRCBkaWQgQ3VtYW5hIHVzZT8KKwkgKgorCSAqIFRoaXMgaXMgdG90YWxseSB1bmZpbmlzaGVkLCBhbmQgd2lsbCByZXF1aXJlIG1vcmUgd29yayB0byBnZXQgaXQKKwkgKiBnb2luZy4gSGVuY2UgaXQgaXMgdG90YWxseSB1bnRlc3RlZC4KKwkgKi8KKwlkbyB7CisJCXN0cnVjdCBhZGZzX2Rpc2NyZWNvcmQgKmRyOworCQl1bnNpZ25lZCBpbnQgbnJfc2VjdHM7CisKKwkJZGF0YSA9IHJlYWRfZGV2X3NlY3RvcihiZGV2LCBzdGFydF9ibGsgKiAyICsgNiwgJnNlY3QpOworCQlpZiAoIWRhdGEpCisJCQlyZXR1cm4gLTE7CisKKwkJaWYgKHNsb3QgPT0gc3RhdGUtPmxpbWl0KQorCQkJYnJlYWs7CisKKwkJZHIgPSBhZGZzX3BhcnRpdGlvbihzdGF0ZSwgbmFtZSwgZGF0YSwgZmlyc3Rfc2VjdG9yLCBzbG90KyspOworCQlpZiAoIWRyKQorCQkJYnJlYWs7CisKKwkJbmFtZSA9IE5VTEw7CisKKwkJbnJfc2VjdHMgPSAoZGF0YVsweDFmZF0gKyAoZGF0YVsweDFmZV0gPDwgOCkpICoKKwkJCSAgIChkci0+aGVhZHMgKyAoZHItPmxvd3NlY3RvciAmIDB4NDAgPyAxIDogMCkpICoKKwkJCSAgIGRyLT5zZWNzcGVydHJhY2s7CisKKwkJaWYgKCFucl9zZWN0cykKKwkJCWJyZWFrOworCisJCWZpcnN0ID0gMDsKKwkJZmlyc3Rfc2VjdG9yICs9IG5yX3NlY3RzOworCQlzdGFydF9ibGsgKz0gbnJfc2VjdHMgPj4gKEJMT0NLX1NJWkVfQklUUyAtIDkpOworCQlucl9zZWN0cyA9IDA7IC8qIGhtbSAtIHNob3VsZCBiZSBwYXJ0aXRpb24gc2l6ZSAqLworCisJCXN3aXRjaCAoZGF0YVsweDFmY10gJiAxNSkgeworCQljYXNlIDA6IC8qIE5vIHBhcnRpdGlvbiAvIEFERlM/ICovCisJCQlicmVhazsKKworI2lmZGVmIENPTkZJR19BQ09STl9QQVJUSVRJT05fUklTQ0lYCisJCWNhc2UgUEFSVElUSU9OX1JJU0NJWF9TQ1NJOgorCQkJLyogUklTQ2lYIC0gd2UgZG9uJ3Qga25vdyBob3cgdG8gZmluZCB0aGUgbmV4dCBvbmUuICovCisJCQlzbG90ID0gcmlzY2l4X3BhcnRpdGlvbihzdGF0ZSwgYmRldiwgZmlyc3Rfc2VjdG9yLAorCQkJCQkJIHNsb3QsIG5yX3NlY3RzKTsKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJY2FzZSBQQVJUSVRJT05fTElOVVg6CisJCQlzbG90ID0gbGludXhfcGFydGl0aW9uKHN0YXRlLCBiZGV2LCBmaXJzdF9zZWN0b3IsCisJCQkJCQlzbG90LCBucl9zZWN0cyk7CisJCQlicmVhazsKKwkJfQorCQlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwkJaWYgKHNsb3QgPT0gLTEpCisJCQlyZXR1cm4gLTE7CisJfSB3aGlsZSAoMSk7CisJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJcmV0dXJuIGZpcnN0ID8gMCA6IDE7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BQ09STl9QQVJUSVRJT05fQURGUworLyoKKyAqIFB1cnBvc2U6IGFsbG9jYXRlIEFERlMgcGFydGl0aW9ucy4KKyAqCisgKiBQYXJhbXMgOiBoZAkJLSBwb2ludGVyIHRvIGdlbmRpc2sgc3RydWN0dXJlIHRvIHN0b3JlIHBhcnRpdGlvbiBpbmZvLgorICoJICAgIGRldgkJLSBkZXZpY2UgbnVtYmVyIHRvIGFjY2Vzcy4KKyAqCisgKiBSZXR1cm5zOiAtMSBvbiBlcnJvciwgMCBmb3Igbm8gQURGUyBib290IHNlY3RvciwgMSBmb3Igb2suCisgKgorICogQWxsb2MgIDogaGRhICA9IHdob2xlIGRyaXZlCisgKgkgICAgaGRhMSA9IEFERlMgcGFydGl0aW9uIG9uIGZpcnN0IGRyaXZlLgorICoJICAgIGhkYTIgPSBub24tQURGUyBwYXJ0aXRpb24uCisgKi8KK2ludAorYWRmc3BhcnRfY2hlY2tfQURGUyhzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnRfc2VjdCwgbnJfc2VjdHMsIHNlY3RzY3lsLCBoZWFkczsKKwlTZWN0b3Igc2VjdDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCXN0cnVjdCBhZGZzX2Rpc2NyZWNvcmQgKmRyOworCXVuc2lnbmVkIGNoYXIgaWQ7CisJaW50IHNsb3QgPSAxOworCisJZGF0YSA9IHJlYWRfZGV2X3NlY3RvcihiZGV2LCA2LCAmc2VjdCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLTE7CisKKwlkciA9IGFkZnNfcGFydGl0aW9uKHN0YXRlLCAiQURGUyIsIGRhdGEsIDAsIHNsb3QrKyk7CisJaWYgKCFkcikgeworCQlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKyAgICAJCXJldHVybiAwOworCX0KKworCWhlYWRzID0gZHItPmhlYWRzICsgKChkci0+bG93c2VjdG9yID4+IDYpICYgMSk7CisJc2VjdHNjeWwgPSBkci0+c2Vjc3BlcnRyYWNrICogaGVhZHM7CisJc3RhcnRfc2VjdCA9ICgoZGF0YVsweDFmZV0gPDwgOCkgKyBkYXRhWzB4MWZkXSkgKiBzZWN0c2N5bDsKKwlpZCA9IGRhdGFbMHgxZmNdICYgMTU7CisJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9NRk0KKwlpZiAoTUFKT1IoYmRldi0+YmRfZGV2KSA9PSBNRk1fQUNPUk5fTUFKT1IpIHsKKwkJZXh0ZXJuIHZvaWQgeGRfc2V0X2dlb21ldHJ5KHN0cnVjdCBibG9ja19kZXZpY2UgKiwKKwkJCXVuc2lnbmVkIGNoYXIsIHVuc2lnbmVkIGNoYXIsIHVuc2lnbmVkIGludCk7CisJCXhkX3NldF9nZW9tZXRyeShiZGV2LCBkci0+c2Vjc3BlcnRyYWNrLCBoZWFkcywgMSk7CisJCWludmFsaWRhdGVfYmRldihiZGV2LCAxKTsKKwkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZywgMCk7CisJfQorI2VuZGlmCisKKwkvKgorCSAqIFdvcmsgb3V0IHN0YXJ0IG9mIG5vbi1hZGZzIHBhcnRpdGlvbi4KKwkgKi8KKwlucl9zZWN0cyA9IChiZGV2LT5iZF9pbm9kZS0+aV9zaXplID4+IDkpIC0gc3RhcnRfc2VjdDsKKworCWlmIChzdGFydF9zZWN0KSB7CisJCXN3aXRjaCAoaWQpIHsKKyNpZmRlZiBDT05GSUdfQUNPUk5fUEFSVElUSU9OX1JJU0NJWAorCQljYXNlIFBBUlRJVElPTl9SSVNDSVhfU0NTSToKKwkJY2FzZSBQQVJUSVRJT05fUklTQ0lYX01GTToKKwkJCXNsb3QgPSByaXNjaXhfcGFydGl0aW9uKHN0YXRlLCBiZGV2LCBzdGFydF9zZWN0LAorCQkJCQkJIHNsb3QsIG5yX3NlY3RzKTsKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJY2FzZSBQQVJUSVRJT05fTElOVVg6CisJCQlzbG90ID0gbGludXhfcGFydGl0aW9uKHN0YXRlLCBiZGV2LCBzdGFydF9zZWN0LAorCQkJCQkJc2xvdCwgbnJfc2VjdHMpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcHJpbnRrKCJcbiIpOworCXJldHVybiAxOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQUNPUk5fUEFSVElUSU9OX0lDUworCitzdHJ1Y3QgaWNzX3BhcnQgeworCV9fbGUzMiBzdGFydDsKKwlfX2xlMzIgc2l6ZTsKK307CisKK3N0YXRpYyBpbnQgYWRmc3BhcnRfY2hlY2tfSUNTTGludXgoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdW5zaWduZWQgbG9uZyBibG9jaykKK3sKKwlTZWN0b3Igc2VjdDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhID0gcmVhZF9kZXZfc2VjdG9yKGJkZXYsIGJsb2NrLCAmc2VjdCk7CisJaW50IHJlc3VsdCA9IDA7CisKKwlpZiAoZGF0YSkgeworCQlpZiAobWVtY21wKGRhdGEsICJMaW51eFBhcnQiLCA5KSA9PSAwKQorCQkJcmVzdWx0ID0gMTsKKwkJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIENoZWNrIGZvciBhIHZhbGlkIElDUyBwYXJ0aXRpb24gdXNpbmcgdGhlIGNoZWNrc3VtLgorICovCitzdGF0aWMgaW5saW5lIGludCB2YWxpZF9pY3Nfc2VjdG9yKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBzdW07CisJaW50IGk7CisKKwlmb3IgKGkgPSAwLCBzdW0gPSAweDUwNjE3Mjc0OyBpIDwgNTA4OyBpKyspCisJCXN1bSArPSBkYXRhW2ldOworCisJc3VtIC09IGxlMzJfdG9fY3B1KCooX19sZTMyICopKCZkYXRhWzUwOF0pKTsKKworCXJldHVybiBzdW0gPT0gMDsKK30KKworLyoKKyAqIFB1cnBvc2U6IGFsbG9jYXRlIElDUyBwYXJ0aXRpb25zLgorICogUGFyYW1zIDogaGQJCS0gcG9pbnRlciB0byBnZW5kaXNrIHN0cnVjdHVyZSB0byBzdG9yZSBwYXJ0aXRpb24gaW5mby4KKyAqCSAgICBkZXYJCS0gZGV2aWNlIG51bWJlciB0byBhY2Nlc3MuCisgKiBSZXR1cm5zOiAtMSBvbiBlcnJvciwgMCBmb3Igbm8gSUNTIHRhYmxlLCAxIGZvciBwYXJ0aXRpb25zIG9rLgorICogQWxsb2MgIDogaGRhICA9IHdob2xlIGRyaXZlCisgKgkgICAgaGRhMSA9IEFERlMgcGFydGl0aW9uIDAgb24gZmlyc3QgZHJpdmUuCisgKgkgICAgaGRhMiA9IEFERlMgcGFydGl0aW9uIDEgb24gZmlyc3QgZHJpdmUuCisgKgkJLi5ldGMuLgorICovCitpbnQKK2FkZnNwYXJ0X2NoZWNrX0lDUyhzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7CisJY29uc3Qgc3RydWN0IGljc19wYXJ0ICpwOworCWludCBzbG90OworCVNlY3RvciBzZWN0OworCisJLyoKKwkgKiBUcnkgSUNTIHN0eWxlIHBhcnRpdGlvbnMgLSBzZWN0b3IgMCBjb250YWlucyBwYXJ0aXRpb24gaW5mby4KKwkgKi8KKwlkYXRhID0gcmVhZF9kZXZfc2VjdG9yKGJkZXYsIDAsICZzZWN0KTsKKwlpZiAoIWRhdGEpCisJICAgIAlyZXR1cm4gLTE7CisKKwlpZiAoIXZhbGlkX2ljc19zZWN0b3IoZGF0YSkpIHsKKwkgICAgCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwcmludGsoIiBbSUNTXSIpOworCisJZm9yIChzbG90ID0gMSwgcCA9IChjb25zdCBzdHJ1Y3QgaWNzX3BhcnQgKilkYXRhOyBwLT5zaXplOyBwKyspIHsKKwkJdTMyIHN0YXJ0ID0gbGUzMl90b19jcHUocC0+c3RhcnQpOworCQlzMzIgc2l6ZSA9IGxlMzJfdG9fY3B1KHAtPnNpemUpOyAvKiB5ZXMsIGl0J3Mgc2lnbmVkLiAqLworCisJCWlmIChzbG90ID09IHN0YXRlLT5saW1pdCkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIE5lZ2F0aXZlIHNpemVzIHRlbGwgdGhlIFJJU0MgT1MgSUNTIGRyaXZlciB0byBpZ25vcmUKKwkJICogdGhpcyBwYXJ0aXRpb24gLSBpbiBlZmZlY3QgaXQgc2F5cyB0aGF0IHRoaXMgZG9lcyBub3QKKwkJICogY29udGFpbiBhbiBBREZTIGZpbGVzeXN0ZW0uCisJCSAqLworCQlpZiAoc2l6ZSA8IDApIHsKKwkJCXNpemUgPSAtc2l6ZTsKKworCQkJLyoKKwkJCSAqIE91ciBvd24gZXh0ZW5zaW9uIC0gV2UgdXNlIHRoZSBmaXJzdCBzZWN0b3IKKwkJCSAqIG9mIHRoZSBwYXJ0aXRpb24gdG8gaWRlbnRpZnkgd2hhdCB0eXBlIHRoaXMKKwkJCSAqIHBhcnRpdGlvbiBpcy4gIFdlIG11c3Qgbm90IG1ha2UgdGhpcyB2aXNpYmxlCisJCQkgKiB0byB0aGUgZmlsZXN5c3RlbS4KKwkJCSAqLworCQkJaWYgKHNpemUgPiAxICYmIGFkZnNwYXJ0X2NoZWNrX0lDU0xpbnV4KGJkZXYsIHN0YXJ0KSkgeworCQkJCXN0YXJ0ICs9IDE7CisJCQkJc2l6ZSAtPSAxOworCQkJfQorCQl9CisKKwkJaWYgKHNpemUpCisJCQlwdXRfcGFydGl0aW9uKHN0YXRlLCBzbG90KyssIHN0YXJ0LCBzaXplKTsKKwl9CisKKwlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwlwcmludGsoIlxuIik7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BQ09STl9QQVJUSVRJT05fUE9XRVJURUMKK3N0cnVjdCBwdGVjX3BhcnQgeworCV9fbGUzMiB1bnVzZWQxOworCV9fbGUzMiB1bnVzZWQyOworCV9fbGUzMiBzdGFydDsKKwlfX2xlMzIgc2l6ZTsKKwlfX2xlMzIgdW51c2VkNTsKKwljaGFyIHR5cGVbOF07Cit9OworCitzdGF0aWMgaW5saW5lIGludCB2YWxpZF9wdGVjX3NlY3Rvcihjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKQoreworCXVuc2lnbmVkIGNoYXIgY2hlY2tzdW0gPSAweDJhOworCWludCBpOworCisJLyoKKwkgKiBJZiBpdCBsb29rcyBsaWtlIGEgUEMvQklPUyBwYXJ0aXRpb24sIHRoZW4gaXQKKwkgKiBwcm9iYWJseSBpc24ndCBQb3dlclRlYy4KKwkgKi8KKwlpZiAoZGF0YVs1MTBdID09IDB4NTUgJiYgZGF0YVs1MTFdID09IDB4YWEpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IDUxMTsgaSsrKQorCQljaGVja3N1bSArPSBkYXRhW2ldOworCisJcmV0dXJuIGNoZWNrc3VtID09IGRhdGFbNTExXTsKK30KKworLyoKKyAqIFB1cnBvc2U6IGFsbG9jYXRlIElDUyBwYXJ0aXRpb25zLgorICogUGFyYW1zIDogaGQJCS0gcG9pbnRlciB0byBnZW5kaXNrIHN0cnVjdHVyZSB0byBzdG9yZSBwYXJ0aXRpb24gaW5mby4KKyAqCSAgICBkZXYJCS0gZGV2aWNlIG51bWJlciB0byBhY2Nlc3MuCisgKiBSZXR1cm5zOiAtMSBvbiBlcnJvciwgMCBmb3Igbm8gSUNTIHRhYmxlLCAxIGZvciBwYXJ0aXRpb25zIG9rLgorICogQWxsb2MgIDogaGRhICA9IHdob2xlIGRyaXZlCisgKgkgICAgaGRhMSA9IEFERlMgcGFydGl0aW9uIDAgb24gZmlyc3QgZHJpdmUuCisgKgkgICAgaGRhMiA9IEFERlMgcGFydGl0aW9uIDEgb24gZmlyc3QgZHJpdmUuCisgKgkJLi5ldGMuLgorICovCitpbnQKK2FkZnNwYXJ0X2NoZWNrX1BPV0VSVEVDKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJU2VjdG9yIHNlY3Q7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKKwljb25zdCBzdHJ1Y3QgcHRlY19wYXJ0ICpwOworCWludCBzbG90ID0gMTsKKwlpbnQgaTsKKworCWRhdGEgPSByZWFkX2Rldl9zZWN0b3IoYmRldiwgMCwgJnNlY3QpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC0xOworCisJaWYgKCF2YWxpZF9wdGVjX3NlY3RvcihkYXRhKSkgeworCQlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJpbnRrKCIgW1BPV0VSVEVDXSIpOworCisJZm9yIChpID0gMCwgcCA9IChjb25zdCBzdHJ1Y3QgcHRlY19wYXJ0ICopZGF0YTsgaSA8IDEyOyBpKyssIHArKykgeworCQl1MzIgc3RhcnQgPSBsZTMyX3RvX2NwdShwLT5zdGFydCk7CisJCXUzMiBzaXplID0gbGUzMl90b19jcHUocC0+c2l6ZSk7CisKKwkJaWYgKHNpemUpCisJCQlwdXRfcGFydGl0aW9uKHN0YXRlLCBzbG90KyssIHN0YXJ0LCBzaXplKTsKKwl9CisKKwlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwlwcmludGsoIlxuIik7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BQ09STl9QQVJUSVRJT05fRUVTT1gKK3N0cnVjdCBlZXNveF9wYXJ0IHsKKwljaGFyCW1hZ2ljWzZdOworCWNoYXIJbmFtZVsxMF07CisJX19sZTMyCXN0YXJ0OworCV9fbGUzMgl1bnVzZWQ2OworCV9fbGUzMgl1bnVzZWQ3OworCV9fbGUzMgl1bnVzZWQ4OworfTsKKworLyoKKyAqIEd1ZXNzIHdobyBjcmVhdGVkIHRoaXMgZm9ybWF0PworICovCitzdGF0aWMgY29uc3QgY2hhciBlZXNveF9uYW1lW10gPSB7CisJJ04nLCAnZScsICdpJywgJ2wnLCAnICcsCisJJ0MnLCAncicsICdpJywgJ3QnLCAnYycsICdoJywgJ2UnLCAnbCcsICdsJywgJyAnLCAnICcKK307CisKKy8qCisgKiBFRVNPWCBTQ1NJIHBhcnRpdGlvbiBmb3JtYXQuCisgKgorICogVGhpcyBpcyBhIGdvZGRhbW5lZCBhd2Z1bCBwYXJ0aXRpb24gZm9ybWF0LiAgV2UgZG9uJ3Qgc2VlbSB0byBzdG9yZQorICogdGhlIHNpemUgb2YgdGhlIHBhcnRpdGlvbiBpbiB0aGlzIHRhYmxlLCBvbmx5IHRoZSBzdGFydCBhZGRyZXNzZXMuCisgKgorICogVGhlcmUgYXJlIHR3byBwb3NzaWJpbGl0aWVzIHdoZXJlIHRoZSBzaXplIGNvbWVzIGZyb206CisgKiAgMS4gVGhlIGluZGl2aWR1YWwgQURGUyBib290IGJsb2NrIGVudHJpZXMgdGhhdCBhcmUgcGxhY2VkIG9uIHRoZSBkaXNrLgorICogIDIuIFRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBuZXh0IGVudHJ5LgorICovCitpbnQKK2FkZnNwYXJ0X2NoZWNrX0VFU09YKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJU2VjdG9yIHNlY3Q7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZlclsyNTZdOworCXN0cnVjdCBlZXNveF9wYXJ0ICpwOworCXNlY3Rvcl90IHN0YXJ0ID0gMDsKKwlpbnQgaSwgc2xvdCA9IDE7CisKKwlkYXRhID0gcmVhZF9kZXZfc2VjdG9yKGJkZXYsIDcsICZzZWN0KTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtMTsKKworCS8qCisJICogIkRlY3J5cHQiIHRoZSBwYXJ0aXRpb24gdGFibGUuICBHb2Qga25vd3Mgd2h5Li4uCisJICovCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlidWZmZXJbaV0gPSBkYXRhW2ldIF4gZWVzb3hfbmFtZVtpICYgMTVdOworCisJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisKKwlmb3IgKGkgPSAwLCBwID0gKHN0cnVjdCBlZXNveF9wYXJ0ICopYnVmZmVyOyBpIDwgODsgaSsrLCBwKyspIHsKKwkJc2VjdG9yX3QgbmV4dDsKKworCQlpZiAobWVtY21wKHAtPm1hZ2ljLCAiRWVzb3giLCA2KSkKKwkJCWJyZWFrOworCisJCW5leHQgPSBsZTMyX3RvX2NwdShwLT5zdGFydCk7CisJCWlmIChpKQorCQkJcHV0X3BhcnRpdGlvbihzdGF0ZSwgc2xvdCsrLCBzdGFydCwgbmV4dCAtIHN0YXJ0KTsKKwkJc3RhcnQgPSBuZXh0OworCX0KKworCWlmIChpICE9IDApIHsKKwkJc2VjdG9yX3Qgc2l6ZTsKKworCQlzaXplID0gZ2V0X2NhcGFjaXR5KGJkZXYtPmJkX2Rpc2spOworCQlwdXRfcGFydGl0aW9uKHN0YXRlLCBzbG90KyssIHN0YXJ0LCBzaXplIC0gc3RhcnQpOworCQlwcmludGsoIlxuIik7CisJfQorCisJcmV0dXJuIGkgPyAxIDogMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9hY29ybi5oIGIvZnMvcGFydGl0aW9ucy9hY29ybi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZmQ1MGUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL2Fjb3JuLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGxpbnV4L2ZzL3BhcnRpdGlvbnMvYWNvcm4uaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDAxIFJ1c3NlbGwgS2luZy4KKyAqCisgKiAgSSBfaGF0ZV8gdGhpcyBwYXJ0aXRpb25pbmcgbWVzcyAtIHdoeSBjYW4ndCB3ZSBoYXZlIG9uZSBkZWZpbmVkCisgKiAgZm9ybWF0LCBhbmQgZXZlcnlvbmUgc3RpY2sgdG8gaXQ/CisgKi8KKworaW50IGFkZnNwYXJ0X2NoZWNrX0NVTUFOQShzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KTsKK2ludCBhZGZzcGFydF9jaGVja19BREZTKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpOworaW50IGFkZnNwYXJ0X2NoZWNrX0lDUyhzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KTsKK2ludCBhZGZzcGFydF9jaGVja19QT1dFUlRFQyhzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KTsKK2ludCBhZGZzcGFydF9jaGVja19FRVNPWChzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KTsKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvYW1pZ2EuYyBiL2ZzL3BhcnRpdGlvbnMvYW1pZ2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDY4NTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcGFydGl0aW9ucy9hbWlnYS5jCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogIGZzL3BhcnRpdGlvbnMvYW1pZ2EuYworICoKKyAqICBDb2RlIGV4dHJhY3RlZCBmcm9tIGRyaXZlcnMvYmxvY2svZ2VuaGQuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCAgTGludXMgVG9ydmFsZHMKKyAqICBSZS1vcmdhbmlzZWQgRmViIDE5OTggUnVzc2VsbCBLaW5nCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYWZmc19oYXJkYmxvY2tzLmg+CisKKyNpbmNsdWRlICJjaGVjay5oIgorI2luY2x1ZGUgImFtaWdhLmgiCisKK3N0YXRpYyBfX2lubGluZV9fIHUzMgorY2hlY2tzdW1fYmxvY2soX19iZTMyICptLCBpbnQgc2l6ZSkKK3sKKwl1MzIgc3VtID0gMDsKKworCXdoaWxlIChzaXplLS0pCisJCXN1bSArPSBiZTMyX3RvX2NwdSgqbSsrKTsKKwlyZXR1cm4gc3VtOworfQorCitpbnQKK2FtaWdhX3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCVNlY3RvciBzZWN0OworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJc3RydWN0IFJpZ2lkRGlza0Jsb2NrICpyZGI7CisJc3RydWN0IFBhcnRpdGlvbkJsb2NrICpwYjsKKwlpbnQgc3RhcnRfc2VjdCwgbnJfc2VjdHMsIGJsaywgcGFydCwgcmVzID0gMDsKKwlpbnQgYmxrc2l6ZSA9IDE7CS8qIE11bHRpcGxpZXIgZm9yIGRpc2sgYmxvY2sgc2l6ZSAqLworCWludCBzbG90ID0gMTsKKwljaGFyIGJbQkRFVk5BTUVfU0laRV07CisKKwlmb3IgKGJsayA9IDA7IDsgYmxrKyssIHB1dF9kZXZfc2VjdG9yKHNlY3QpKSB7CisJCWlmIChibGsgPT0gUkRCX0FMTE9DQVRJT05fTElNSVQpCisJCQlnb3RvIHJkYl9kb25lOworCQlkYXRhID0gcmVhZF9kZXZfc2VjdG9yKGJkZXYsIGJsaywgJnNlY3QpOworCQlpZiAoIWRhdGEpIHsKKwkJCWlmICh3YXJuX25vX3BhcnQpCisJCQkJcHJpbnRrKCJEZXYgJXM6IHVuYWJsZSB0byByZWFkIFJEQiBibG9jayAlZFxuIiwKKwkJCQkgICAgICAgYmRldm5hbWUoYmRldiwgYiksIGJsayk7CisJCQlnb3RvIHJkYl9kb25lOworCQl9CisJCWlmICgqKF9fYmUzMiAqKWRhdGEgIT0gY3B1X3RvX2JlMzIoSUROQU1FX1JJR0lERElTSykpCisJCQljb250aW51ZTsKKworCQlyZGIgPSAoc3RydWN0IFJpZ2lkRGlza0Jsb2NrICopZGF0YTsKKwkJaWYgKGNoZWNrc3VtX2Jsb2NrKChfX2JlMzIgKilkYXRhLCBiZTMyX3RvX2NwdShyZGItPnJkYl9TdW1tZWRMb25ncykgJiAweDdGKSA9PSAwKQorCQkJYnJlYWs7CisJCS8qIFRyeSBhZ2FpbiB3aXRoIDB4ZGMuLjB4ZGYgemVyb2VkLCBXaW5kb3dzIG1pZ2h0IGhhdmUKKwkJICogdHJhc2hlZCBpdC4KKwkJICovCisJCSooX19iZTMyICopKGRhdGErMHhkYykgPSAwOworCQlpZiAoY2hlY2tzdW1fYmxvY2soKF9fYmUzMiAqKWRhdGEsCisJCQkJYmUzMl90b19jcHUocmRiLT5yZGJfU3VtbWVkTG9uZ3MpICYgMHg3Rik9PTApIHsKKwkJCXByaW50aygiV2FybmluZzogVHJhc2hlZCB3b3JkIGF0IDB4ZDAgaW4gYmxvY2sgJWQgIgorCQkJCSJpZ25vcmVkIGluIGNoZWNrc3VtIGNhbGN1bGF0aW9uXG4iLGJsayk7CisJCQlicmVhazsKKwkJfQorCisJCXByaW50aygiRGV2ICVzOiBSREIgaW4gYmxvY2sgJWQgaGFzIGJhZCBjaGVja3N1bVxuIiwKKwkJCSAgICAgICBiZGV2bmFtZShiZGV2LCBiKSwgYmxrKTsKKwl9CisKKwkvKiBibGtzaXplIGlzIGJsb2NrcyBwZXIgNTEyIGJ5dGUgc3RhbmRhcmQgYmxvY2sgKi8KKwlibGtzaXplID0gYmUzMl90b19jcHUoIHJkYi0+cmRiX0Jsb2NrQnl0ZXMgKSAvIDUxMjsKKworCXByaW50aygiIFJEU0sgKCVkKSIsIGJsa3NpemUgKiA1MTIpOwkvKiBCZSBtb3JlIGluZm9ybWF0aXZlICovCisJYmxrID0gYmUzMl90b19jcHUocmRiLT5yZGJfUGFydGl0aW9uTGlzdCk7CisJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJZm9yIChwYXJ0ID0gMTsgYmxrPjAgJiYgcGFydDw9MTY7IHBhcnQrKywgcHV0X2Rldl9zZWN0b3Ioc2VjdCkpIHsKKwkJYmxrICo9IGJsa3NpemU7CS8qIFJlYWQgaW4gdGVybXMgcGFydGl0aW9uIHRhYmxlIHVuZGVyc3RhbmRzICovCisJCWRhdGEgPSByZWFkX2Rldl9zZWN0b3IoYmRldiwgYmxrLCAmc2VjdCk7CisJCWlmICghZGF0YSkgeworCQkJaWYgKHdhcm5fbm9fcGFydCkKKwkJCQlwcmludGsoIkRldiAlczogdW5hYmxlIHRvIHJlYWQgcGFydGl0aW9uIGJsb2NrICVkXG4iLAorCQkJCSAgICAgICBiZGV2bmFtZShiZGV2LCBiKSwgYmxrKTsKKwkJCWdvdG8gcmRiX2RvbmU7CisJCX0KKwkJcGIgID0gKHN0cnVjdCBQYXJ0aXRpb25CbG9jayAqKWRhdGE7CisJCWJsayA9IGJlMzJfdG9fY3B1KHBiLT5wYl9OZXh0KTsKKwkJaWYgKHBiLT5wYl9JRCAhPSBjcHVfdG9fYmUzMihJRE5BTUVfUEFSVElUSU9OKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoY2hlY2tzdW1fYmxvY2soKF9fYmUzMiAqKXBiLCBiZTMyX3RvX2NwdShwYi0+cGJfU3VtbWVkTG9uZ3MpICYgMHg3RikgIT0gMCApCisJCQljb250aW51ZTsKKworCQkvKiBUZWxsIEtlcm5lbCBhYm91dCBpdCAqLworCisJCW5yX3NlY3RzID0gKGJlMzJfdG9fY3B1KHBiLT5wYl9FbnZpcm9ubWVudFsxMF0pICsgMSAtCisJCQkgICAgYmUzMl90b19jcHUocGItPnBiX0Vudmlyb25tZW50WzldKSkgKgorCQkJICAgYmUzMl90b19jcHUocGItPnBiX0Vudmlyb25tZW50WzNdKSAqCisJCQkgICBiZTMyX3RvX2NwdShwYi0+cGJfRW52aXJvbm1lbnRbNV0pICoKKwkJCSAgIGJsa3NpemU7CisJCWlmICghbnJfc2VjdHMpCisJCQljb250aW51ZTsKKwkJc3RhcnRfc2VjdCA9IGJlMzJfdG9fY3B1KHBiLT5wYl9FbnZpcm9ubWVudFs5XSkgKgorCQkJICAgICBiZTMyX3RvX2NwdShwYi0+cGJfRW52aXJvbm1lbnRbM10pICoKKwkJCSAgICAgYmUzMl90b19jcHUocGItPnBiX0Vudmlyb25tZW50WzVdKSAqCisJCQkgICAgIGJsa3NpemU7CisJCXB1dF9wYXJ0aXRpb24oc3RhdGUsc2xvdCsrLHN0YXJ0X3NlY3QsbnJfc2VjdHMpOworCQl7CisJCQkvKiBCZSBldmVuIG1vcmUgaW5mb3JtYXRpdmUgdG8gYWlkIG1vdW50aW5nICovCisJCQljaGFyIGRvc3R5cGVbNF07CisJCQlfX2JlMzIgKmR0ID0gKF9fYmUzMiAqKWRvc3R5cGU7CisJCQkqZHQgPSBwYi0+cGJfRW52aXJvbm1lbnRbMTZdOworCQkJaWYgKGRvc3R5cGVbM10gPCAnICcpCisJCQkJcHJpbnRrKCIgKCVjJWMlY14lYykiLAorCQkJCQlkb3N0eXBlWzBdLCBkb3N0eXBlWzFdLAorCQkJCQlkb3N0eXBlWzJdLCBkb3N0eXBlWzNdICsgJ0AnICk7CisJCQllbHNlCisJCQkJcHJpbnRrKCIgKCVjJWMlYyVjKSIsCisJCQkJCWRvc3R5cGVbMF0sIGRvc3R5cGVbMV0sCisJCQkJCWRvc3R5cGVbMl0sIGRvc3R5cGVbM10pOworCQkJcHJpbnRrKCIocmVzICVkIHNwYiAlZCkiLAorCQkJCWJlMzJfdG9fY3B1KHBiLT5wYl9FbnZpcm9ubWVudFs2XSksCisJCQkJYmUzMl90b19jcHUocGItPnBiX0Vudmlyb25tZW50WzRdKSk7CisJCX0KKwkJcmVzID0gMTsKKwl9CisJcHJpbnRrKCJcbiIpOworCityZGJfZG9uZToKKwlyZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9hbWlnYS5oIGIvZnMvcGFydGl0aW9ucy9hbWlnYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmM2U5Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL2FtaWdhLmgKQEAgLTAsMCArMSw2IEBACisvKgorICogIGZzL3BhcnRpdGlvbnMvYW1pZ2EuaAorICovCisKK2ludCBhbWlnYV9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldik7CisKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvYXRhcmkuYyBiL2ZzL3BhcnRpdGlvbnMvYXRhcmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTJhNmFkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcGFydGl0aW9ucy9hdGFyaS5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogIGZzL3BhcnRpdGlvbnMvYXRhcmkuYworICoKKyAqICBDb2RlIGV4dHJhY3RlZCBmcm9tIGRyaXZlcnMvYmxvY2svZ2VuaGQuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCAgTGludXMgVG9ydmFsZHMKKyAqICBSZS1vcmdhbmlzZWQgRmViIDE5OTggUnVzc2VsbCBLaW5nCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSAiY2hlY2suaCIKKyNpbmNsdWRlICJhdGFyaS5oIgorCisvKiArK2d1ZW50aGVyOiB0aGlzIHNob3VsZCBiZSBzZXR0YWJsZSBieSB0aGUgdXNlciAoIm1ha2UgY29uZmlnIik/LgorICovCisjZGVmaW5lIElDRF9QQVJUUworCisvKiBjaGVjayBpZiBhIHBhcnRpdGlvbiBlbnRyeSBsb29rcyB2YWxpZCAtLSBBdGFyaSBmb3JtYXQgaXMgYXNzdW1lZCBpZiBhdAorICAgbGVhc3Qgb25lIG9mIHRoZSBwcmltYXJ5IGVudHJpZXMgaXMgb2sgdGhpcyB3YXkgKi8KKyNkZWZpbmUJVkFMSURfUEFSVElUSU9OKHBpLGhkc2l6KQkJCQkJICAgICBcCisgICAgKCgocGkpLT5mbGcgJiAxKSAmJgkJCQkJCQkgICAgIFwKKyAgICAgaXNhbG51bSgocGkpLT5pZFswXSkgJiYgaXNhbG51bSgocGkpLT5pZFsxXSkgJiYgaXNhbG51bSgocGkpLT5pZFsyXSkgJiYgXAorICAgICBiZTMyX3RvX2NwdSgocGkpLT5zdCkgPD0gKGhkc2l6KSAmJgkJCQkgICAgIFwKKyAgICAgYmUzMl90b19jcHUoKHBpKS0+c3QpICsgYmUzMl90b19jcHUoKHBpKS0+c2l6KSA8PSAoaGRzaXopKQorCitzdGF0aWMgaW5saW5lIGludCBPS19pZChjaGFyICpzKQoreworCXJldHVybiAgbWVtY21wIChzLCAiR0VNIiwgMykgPT0gMCB8fCBtZW1jbXAgKHMsICJCR00iLCAzKSA9PSAwIHx8CisJCW1lbWNtcCAocywgIkxOWCIsIDMpID09IDAgfHwgbWVtY21wIChzLCAiU1dQIiwgMykgPT0gMCB8fAorCQltZW1jbXAgKHMsICJSQVciLCAzKSA9PSAwIDsKK30KKworaW50IGF0YXJpX3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCVNlY3RvciBzZWN0OworCXN0cnVjdCByb290c2VjdG9yICpyczsKKwlzdHJ1Y3QgcGFydGl0aW9uX2luZm8gKnBpOworCXUzMiBleHRlbnNlY3Q7CisJdTMyIGhkX3NpemU7CisJaW50IHNsb3Q7CisjaWZkZWYgSUNEX1BBUlRTCisJaW50IHBhcnRfZm10ID0gMDsgLyogMDp1bmtub3duLCAxOkFIREksIDI6SUNEL1N1cHJhICovCisjZW5kaWYKKworCXJzID0gKHN0cnVjdCByb290c2VjdG9yICopIHJlYWRfZGV2X3NlY3RvcihiZGV2LCAwLCAmc2VjdCk7CisJaWYgKCFycykKKwkJcmV0dXJuIC0xOworCisJLyogVmVyaWZ5IHRoaXMgaXMgYW4gQXRhcmkgcm9vdHNlY3RvcjogKi8KKwloZF9zaXplID0gYmRldi0+YmRfaW5vZGUtPmlfc2l6ZSA+PiA5OworCWlmICghVkFMSURfUEFSVElUSU9OKCZycy0+cGFydFswXSwgaGRfc2l6ZSkgJiYKKwkgICAgIVZBTElEX1BBUlRJVElPTigmcnMtPnBhcnRbMV0sIGhkX3NpemUpICYmCisJICAgICFWQUxJRF9QQVJUSVRJT04oJnJzLT5wYXJ0WzJdLCBoZF9zaXplKSAmJgorCSAgICAhVkFMSURfUEFSVElUSU9OKCZycy0+cGFydFszXSwgaGRfc2l6ZSkpIHsKKwkJLyoKKwkJICogaWYgdGhlcmUncyBubyB2YWxpZCBwcmltYXJ5IHBhcnRpdGlvbiwgYXNzdW1lIHRoYXQgbm8gQXRhcmkKKwkJICogZm9ybWF0IHBhcnRpdGlvbiB0YWJsZSAodGhlcmUncyBubyByZWxpYWJsZSBtYWdpYyBvciB0aGUgbGlrZQorCSAgICAgICAgICogOi0oKQorCQkgKi8KKwkJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJCXJldHVybiAwOworCX0KKworCXBpID0gJnJzLT5wYXJ0WzBdOworCXByaW50ayAoIiBBSERJIik7CisJZm9yIChzbG90ID0gMTsgcGkgPCAmcnMtPnBhcnRbNF0gJiYgc2xvdCA8IHN0YXRlLT5saW1pdDsgc2xvdCsrLCBwaSsrKSB7CisJCXN0cnVjdCByb290c2VjdG9yICp4cnM7CisJCVNlY3RvciBzZWN0MjsKKwkJdWxvbmcgcGFydHNlY3Q7CisKKwkJaWYgKCAhKHBpLT5mbGcgJiAxKSApCisJCQljb250aW51ZTsKKwkJLyogYWN0aXZlIHBhcnRpdGlvbiAqLworCQlpZiAobWVtY21wIChwaS0+aWQsICJYR00iLCAzKSAhPSAwKSB7CisJCQkvKiB3ZSBkb24ndCBjYXJlIGFib3V0IG90aGVyIGlkJ3MgKi8KKwkJCXB1dF9wYXJ0aXRpb24gKHN0YXRlLCBzbG90LCBiZTMyX3RvX2NwdShwaS0+c3QpLAorCQkJCQliZTMyX3RvX2NwdShwaS0+c2l6KSk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBleHRlbnNpb24gcGFydGl0aW9uICovCisjaWZkZWYgSUNEX1BBUlRTCisJCXBhcnRfZm10ID0gMTsKKyNlbmRpZgorCQlwcmludGsoIiBYR008Iik7CisJCXBhcnRzZWN0ID0gZXh0ZW5zZWN0ID0gYmUzMl90b19jcHUocGktPnN0KTsKKwkJd2hpbGUgKDEpIHsKKwkJCXhycyA9IChzdHJ1Y3Qgcm9vdHNlY3RvciAqKXJlYWRfZGV2X3NlY3RvcihiZGV2LCBwYXJ0c2VjdCwgJnNlY3QyKTsKKwkJCWlmICgheHJzKSB7CisJCQkJcHJpbnRrICgiIGJsb2NrICVsZCByZWFkIGZhaWxlZFxuIiwgcGFydHNlY3QpOworCQkJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQkvKiArK3JvbWFuOiBzYW5pdHkgY2hlY2s6IGJpdCAwIG9mIGZsZyBmaWVsZCBtdXN0IGJlIHNldCAqLworCQkJaWYgKCEoeHJzLT5wYXJ0WzBdLmZsZyAmIDEpKSB7CisJCQkJcHJpbnRrKCAiXG5GaXJzdCBzdWItcGFydGl0aW9uIGluIGV4dGVuZGVkIHBhcnRpdGlvbiBpcyBub3QgdmFsaWQhXG4iICk7CisJCQkJcHV0X2Rldl9zZWN0b3Ioc2VjdDIpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlwdXRfcGFydGl0aW9uKHN0YXRlLCBzbG90LAorCQkJCSAgIHBhcnRzZWN0ICsgYmUzMl90b19jcHUoeHJzLT5wYXJ0WzBdLnN0KSwKKwkJCQkgICBiZTMyX3RvX2NwdSh4cnMtPnBhcnRbMF0uc2l6KSk7CisKKwkJCWlmICghKHhycy0+cGFydFsxXS5mbGcgJiAxKSkgeworCQkJCS8qIGVuZCBvZiBsaW5rZWQgcGFydGl0aW9uIGxpc3QgKi8KKwkJCQlwdXRfZGV2X3NlY3RvcihzZWN0Mik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAobWVtY21wKCB4cnMtPnBhcnRbMV0uaWQsICJYR00iLCAzICkgIT0gMCkgeworCQkJCXByaW50aygiXG5JRCBvZiBleHRlbmRlZCBwYXJ0aXRpb24gaXMgbm90IFhHTSFcbiIpOworCQkJCXB1dF9kZXZfc2VjdG9yKHNlY3QyKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcGFydHNlY3QgPSBiZTMyX3RvX2NwdSh4cnMtPnBhcnRbMV0uc3QpICsgZXh0ZW5zZWN0OworCQkJcHV0X2Rldl9zZWN0b3Ioc2VjdDIpOworCQkJaWYgKCsrc2xvdCA9PSBzdGF0ZS0+bGltaXQpIHsKKwkJCQlwcmludGsoICJcbk1heGltdW0gbnVtYmVyIG9mIHBhcnRpdGlvbnMgcmVhY2hlZCFcbiIgKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlwcmludGsoIiA+Iik7CisJfQorI2lmZGVmIElDRF9QQVJUUworCWlmICggcGFydF9mbXQhPTEgKSB7IC8qIG5vIGV4dGVuZGVkIHBhcnRpdGlvbnMgLT4gdGVzdCBJQ0QtZm9ybWF0ICovCisJCXBpID0gJnJzLT5pY2RwYXJ0WzBdOworCQkvKiBzYW5pdHkgY2hlY2s6IG5vIElDRCBmb3JtYXQgaWYgZmlyc3QgcGFydGl0aW9uIGludmFsaWQgKi8KKwkJaWYgKE9LX2lkKHBpLT5pZCkpIHsKKwkJCXByaW50aygiIElDRDwiKTsKKwkJCWZvciAoOyBwaSA8ICZycy0+aWNkcGFydFs4XSAmJiBzbG90IDwgc3RhdGUtPmxpbWl0OyBzbG90KyssIHBpKyspIHsKKwkJCQkvKiBhY2NlcHQgb25seSBHRU0sQkdNLFJBVyxMTlgsU1dQIHBhcnRpdGlvbnMgKi8KKwkJCQlpZiAoISgocGktPmZsZyAmIDEpICYmIE9LX2lkKHBpLT5pZCkpKQorCQkJCQljb250aW51ZTsKKwkJCQlwYXJ0X2ZtdCA9IDI7CisJCQkJcHV0X3BhcnRpdGlvbiAoc3RhdGUsIHNsb3QsCisJCQkJCQliZTMyX3RvX2NwdShwaS0+c3QpLAorCQkJCQkJYmUzMl90b19jcHUocGktPnNpeikpOworCQkJfQorCQkJcHJpbnRrKCIgPiIpOworCQl9CisJfQorI2VuZGlmCisJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisKKwlwcmludGsgKCJcbiIpOworCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2F0YXJpLmggYi9mcy9wYXJ0aXRpb25zL2F0YXJpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMxODZiMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvYXRhcmkuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogIGZzL3BhcnRpdGlvbnMvYXRhcmkuaAorICogIE1vdmVkIGJ5IFJ1c3NlbGwgS2luZyBmcm9tOgorICoKKyAqIGxpbnV4L2luY2x1ZGUvbGludXgvYXRhcmlfcm9vdHNlYy5oCisgKiBkZWZpbml0aW9ucyBmb3IgQXRhcmkgUm9vdHNlY3RvciBsYXlvdXQKKyAqIGJ5IEFuZHJlYXMgU2Nod2FiIChzY2h3YWJAbHM1LmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlKQorICoKKyAqIG1vZGlmaWVkIGZvciBJQ0QvU3VwcmEgcGFydGl0aW9uaW5nIHNjaGVtZSByZXN0cmljdGVkIHRvIGF0IG1vc3QgMTIKKyAqIHBhcnRpdGlvbnMKKyAqIGJ5IEd1ZW50aGVyIEtlbGxldGVyIChndWVudGhlckBwb29sLmluZm9ybWF0aWsucnd0aC1hYWNoZW4uZGUpCisgKi8KKworc3RydWN0IHBhcnRpdGlvbl9pbmZvCit7CisgIHU4IGZsZzsJCQkvKiBiaXQgMDogYWN0aXZlOyBiaXQgNzogYm9vdGFibGUgKi8KKyAgY2hhciBpZFszXTsJCQkvKiAiR0VNIiwgIkJHTSIsICJYR00iLCBvciBvdGhlciAqLworICBfX2JlMzIgc3Q7CQkJLyogc3RhcnQgb2YgcGFydGl0aW9uICovCisgIF9fYmUzMiBzaXo7CQkJLyogbGVuZ3RoIG9mIHBhcnRpdGlvbiAqLworfTsKKworc3RydWN0IHJvb3RzZWN0b3IKK3sKKyAgY2hhciB1bnVzZWRbMHgxNTZdOwkJLyogcm9vbSBmb3IgYm9vdCBjb2RlICovCisgIHN0cnVjdCBwYXJ0aXRpb25faW5mbyBpY2RwYXJ0WzhdOwkvKiBpbmZvIGZvciBJQ0QtcGFydGl0aW9ucyA1Li4xMiAqLworICBjaGFyIHVudXNlZDJbMHhjXTsKKyAgdTMyIGhkX3NpejsJCQkvKiBzaXplIG9mIGRpc2sgaW4gYmxvY2tzICovCisgIHN0cnVjdCBwYXJ0aXRpb25faW5mbyBwYXJ0WzRdOworICB1MzIgYnNsX3N0OwkJCS8qIHN0YXJ0IG9mIGJhZCBzZWN0b3IgbGlzdCAqLworICB1MzIgYnNsX2NudDsJCQkvKiBsZW5ndGggb2YgYmFkIHNlY3RvciBsaXN0ICovCisgIHUxNiBjaGVja3N1bTsJCQkvKiBjaGVja3N1bSBmb3IgYm9vdGFibGUgZGlza3MgKi8KK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCitpbnQgYXRhcmlfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpOwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9jaGVjay5jIGIvZnMvcGFydGl0aW9ucy9jaGVjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxY2ZmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiAgZnMvcGFydGl0aW9ucy9jaGVjay5jCisgKgorICogIENvZGUgZXh0cmFjdGVkIGZyb20gZHJpdmVycy9ibG9jay9nZW5oZC5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggIExpbnVzIFRvcnZhbGRzCisgKiAgUmUtb3JnYW5pc2VkIEZlYiAxOTk4IFJ1c3NlbGwgS2luZworICoKKyAqICBXZSBub3cgaGF2ZSBpbmRlcGVuZGVudCBwYXJ0aXRpb24gc3VwcG9ydCBmcm9tIHRoZQorICogIGJsb2NrIGRyaXZlcnMsIHdoaWNoIGFsbG93cyBhbGwgdGhlIHBhcnRpdGlvbiBjb2RlIHRvCisgKiAgYmUgZ3JvdXBlZCBpbiBvbmUgbG9jYXRpb24sIGFuZCBpdCB0byBiZSBtb3N0bHkgc2VsZgorICogIGNvbnRhaW5lZC4KKyAqCisgKiAgQWRkZWQgbmVlZGVkIE1BSk9SUyBmb3IgbmV3IHBhaXJzLCB7aGRpLGhkan0sIHtoZGssaGRsfQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKworI2luY2x1ZGUgImNoZWNrLmgiCisjaW5jbHVkZSAiZGV2ZnMuaCIKKworI2luY2x1ZGUgImFjb3JuLmgiCisjaW5jbHVkZSAiYW1pZ2EuaCIKKyNpbmNsdWRlICJhdGFyaS5oIgorI2luY2x1ZGUgImxkbS5oIgorI2luY2x1ZGUgIm1hYy5oIgorI2luY2x1ZGUgIm1zZG9zLmgiCisjaW5jbHVkZSAib3NmLmgiCisjaW5jbHVkZSAic2dpLmgiCisjaW5jbHVkZSAic3VuLmgiCisjaW5jbHVkZSAiaWJtLmgiCisjaW5jbHVkZSAidWx0cml4LmgiCisjaW5jbHVkZSAiZWZpLmgiCisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9NRAorZXh0ZXJuIHZvaWQgbWRfYXV0b2RldGVjdF9kZXYoZGV2X3QgZGV2KTsKKyNlbmRpZgorCitpbnQgd2Fybl9ub19wYXJ0ID0gMTsgLypUaGlzIGlzIHVnbHk6IHNob3VsZCBtYWtlIGdlbmhkIHJlbW92YWJsZSBtZWRpYSBhd2FyZSovCisKK3N0YXRpYyBpbnQgKCpjaGVja19wYXJ0W10pKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICopID0geworCS8qCisJICogUHJvYmUgcGFydGl0aW9uIGZvcm1hdHMgd2l0aCB0YWJsZXMgYXQgZGlzayBhZGRyZXNzIDAKKwkgKiB0aGF0IGFsc28gaGF2ZSBhbiBBREZTIGJvb3QgYmxvY2sgYXQgMHhkYzAuCisJICovCisjaWZkZWYgQ09ORklHX0FDT1JOX1BBUlRJVElPTl9JQ1MKKwlhZGZzcGFydF9jaGVja19JQ1MsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQUNPUk5fUEFSVElUSU9OX1BPV0VSVEVDCisJYWRmc3BhcnRfY2hlY2tfUE9XRVJURUMsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQUNPUk5fUEFSVElUSU9OX0VFU09YCisJYWRmc3BhcnRfY2hlY2tfRUVTT1gsCisjZW5kaWYKKworCS8qCisJICogTm93IG1vdmUgb24gdG8gZm9ybWF0cyB0aGF0IG9ubHkgaGF2ZSBwYXJ0aXRpb24gaW5mbyBhdAorCSAqIGRpc2sgYWRkcmVzcyAweGRjMC4gIFNpbmNlIHRoZXNlIG1heSBhbHNvIGhhdmUgc3RhbGUKKwkgKiBQQy9CSU9TIHBhcnRpdGlvbiB0YWJsZXMsIHRoZXkgbmVlZCB0byBjb21lIGJlZm9yZQorCSAqIHRoZSBtc2RvcyBlbnRyeS4KKwkgKi8KKyNpZmRlZiBDT05GSUdfQUNPUk5fUEFSVElUSU9OX0NVTUFOQQorCWFkZnNwYXJ0X2NoZWNrX0NVTUFOQSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BQ09STl9QQVJUSVRJT05fQURGUworCWFkZnNwYXJ0X2NoZWNrX0FERlMsCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19FRklfUEFSVElUSU9OCisJZWZpX3BhcnRpdGlvbiwJCS8qIHRoaXMgbXVzdCBjb21lIGJlZm9yZSBtc2RvcyAqLworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NHSV9QQVJUSVRJT04KKwlzZ2lfcGFydGl0aW9uLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0xETV9QQVJUSVRJT04KKwlsZG1fcGFydGl0aW9uLAkJLyogdGhpcyBtdXN0IGNvbWUgYmVmb3JlIG1zZG9zICovCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTkVDOThfUEFSVElUSU9OCisJbmVjOThfcGFydGl0aW9uLAkvKiBtdXN0IGJlIGNvbWUgYmVmb3JlIGBtc2Rvc19wYXJ0aXRpb24nICovCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTVNET1NfUEFSVElUSU9OCisJbXNkb3NfcGFydGl0aW9uLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX09TRl9QQVJUSVRJT04KKwlvc2ZfcGFydGl0aW9uLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NVTl9QQVJUSVRJT04KKwlzdW5fcGFydGl0aW9uLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FNSUdBX1BBUlRJVElPTgorCWFtaWdhX3BhcnRpdGlvbiwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BVEFSSV9QQVJUSVRJT04KKwlhdGFyaV9wYXJ0aXRpb24sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUFDX1BBUlRJVElPTgorCW1hY19wYXJ0aXRpb24sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVUxUUklYX1BBUlRJVElPTgorCXVsdHJpeF9wYXJ0aXRpb24sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSUJNX1BBUlRJVElPTgorCWlibV9wYXJ0aXRpb24sCisjZW5kaWYKKwlOVUxMCit9OworIAorLyoKKyAqIGRpc2tfbmFtZSgpIGlzIHVzZWQgYnkgcGFydGl0aW9uIGNoZWNrIGNvZGUgYW5kIHRoZSBnZW5oZCBkcml2ZXIuCisgKiBJdCBmb3JtYXRzIHRoZSBkZXZpY2VuYW1lIG9mIHRoZSBpbmRpY2F0ZWQgZGlzayBpbnRvCisgKiB0aGUgc3VwcGxpZWQgYnVmZmVyIChvZiBzaXplIGF0IGxlYXN0IDMyKSwgYW5kIHJldHVybnMKKyAqIGEgcG9pbnRlciB0byB0aGF0IHNhbWUgYnVmZmVyIChmb3IgY29udmVuaWVuY2UpLgorICovCisKK2NoYXIgKmRpc2tfbmFtZShzdHJ1Y3QgZ2VuZGlzayAqaGQsIGludCBwYXJ0LCBjaGFyICpidWYpCit7CisJaWYgKCFwYXJ0KQorCQlzbnByaW50ZihidWYsIEJERVZOQU1FX1NJWkUsICIlcyIsIGhkLT5kaXNrX25hbWUpOworCWVsc2UgaWYgKGlzZGlnaXQoaGQtPmRpc2tfbmFtZVtzdHJsZW4oaGQtPmRpc2tfbmFtZSktMV0pKQorCQlzbnByaW50ZihidWYsIEJERVZOQU1FX1NJWkUsICIlc3AlZCIsIGhkLT5kaXNrX25hbWUsIHBhcnQpOworCWVsc2UKKwkJc25wcmludGYoYnVmLCBCREVWTkFNRV9TSVpFLCAiJXMlZCIsIGhkLT5kaXNrX25hbWUsIHBhcnQpOworCisJcmV0dXJuIGJ1ZjsKK30KKworY29uc3QgY2hhciAqYmRldm5hbWUoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgY2hhciAqYnVmKQoreworCWludCBwYXJ0ID0gTUlOT1IoYmRldi0+YmRfZGV2KSAtIGJkZXYtPmJkX2Rpc2stPmZpcnN0X21pbm9yOworCXJldHVybiBkaXNrX25hbWUoYmRldi0+YmRfZGlzaywgcGFydCwgYnVmKTsKK30KKworRVhQT1JUX1NZTUJPTChiZGV2bmFtZSk7CisKKy8qCisgKiBUaGVyZSdzIHZlcnkgbGl0dGxlIHJlYXNvbiB0byB1c2UgdGhpcywgeW91IHNob3VsZCByZWFsbHkKKyAqIGhhdmUgYSBzdHJ1Y3QgYmxvY2tfZGV2aWNlIGp1c3QgYWJvdXQgZXZlcnl3aGVyZSBhbmQgdXNlCisgKiBiZGV2bmFtZSgpIGluc3RlYWQuCisgKi8KK2NvbnN0IGNoYXIgKl9fYmRldm5hbWUoZGV2X3QgZGV2LCBjaGFyICpidWZmZXIpCit7CisJc2NucHJpbnRmKGJ1ZmZlciwgQkRFVk5BTUVfU0laRSwgInVua25vd24tYmxvY2soJXUsJXUpIiwKKwkJCQlNQUpPUihkZXYpLCBNSU5PUihkZXYpKTsKKwlyZXR1cm4gYnVmZmVyOworfQorCitFWFBPUlRfU1lNQk9MKF9fYmRldm5hbWUpOworCitzdGF0aWMgc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICoKK2NoZWNrX3BhcnRpdGlvbihzdHJ1Y3QgZ2VuZGlzayAqaGQsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZTsKKwlpbnQgaSwgcmVzOworCisJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0YXRlKQorCQlyZXR1cm4gTlVMTDsKKworI2lmZGVmIENPTkZJR19ERVZGU19GUworCWlmIChoZC0+ZGV2ZnNfbmFtZVswXSAhPSAnXDAnKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiAvZGV2LyVzOiIsIGhkLT5kZXZmc19uYW1lKTsKKwkJc3ByaW50ZihzdGF0ZS0+bmFtZSwgInAiKTsKKwl9CisjZW5kaWYKKwllbHNlIHsKKwkJZGlza19uYW1lKGhkLCAwLCBzdGF0ZS0+bmFtZSk7CisJCXByaW50ayhLRVJOX0lORk8gIiAlczoiLCBzdGF0ZS0+bmFtZSk7CisJCWlmIChpc2RpZ2l0KHN0YXRlLT5uYW1lW3N0cmxlbihzdGF0ZS0+bmFtZSktMV0pKQorCQkJc3ByaW50ZihzdGF0ZS0+bmFtZSwgInAiKTsKKwl9CisJc3RhdGUtPmxpbWl0ID0gaGQtPm1pbm9yczsKKwlpID0gcmVzID0gMDsKKwl3aGlsZSAoIXJlcyAmJiBjaGVja19wYXJ0W2ldKSB7CisJCW1lbXNldCgmc3RhdGUtPnBhcnRzLCAwLCBzaXplb2Yoc3RhdGUtPnBhcnRzKSk7CisJCXJlcyA9IGNoZWNrX3BhcnRbaSsrXShzdGF0ZSwgYmRldik7CisJfQorCWlmIChyZXMgPiAwKQorCQlyZXR1cm4gc3RhdGU7CisJaWYgKCFyZXMpCisJCXByaW50aygiIHVua25vd24gcGFydGl0aW9uIHRhYmxlXG4iKTsKKwllbHNlIGlmICh3YXJuX25vX3BhcnQpCisJCXByaW50aygiIHVuYWJsZSB0byByZWFkIHBhcnRpdGlvbiB0YWJsZVxuIik7CisJa2ZyZWUoc3RhdGUpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogc3lzZnMgYmluZGluZ3MgZm9yIHBhcnRpdGlvbnMKKyAqLworCitzdHJ1Y3QgcGFydF9hdHRyaWJ1dGUgeworCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKKwlzc2l6ZV90ICgqc2hvdykoc3RydWN0IGhkX3N0cnVjdCAqLGNoYXIgKik7Cit9OworCitzdGF0aWMgc3NpemVfdCAKK3BhcnRfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICoga29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqIGF0dHIsIGNoYXIgKiBwYWdlKQoreworCXN0cnVjdCBoZF9zdHJ1Y3QgKiBwID0gY29udGFpbmVyX29mKGtvYmosc3RydWN0IGhkX3N0cnVjdCxrb2JqKTsKKwlzdHJ1Y3QgcGFydF9hdHRyaWJ1dGUgKiBwYXJ0X2F0dHIgPSBjb250YWluZXJfb2YoYXR0cixzdHJ1Y3QgcGFydF9hdHRyaWJ1dGUsYXR0cik7CisJc3NpemVfdCByZXQgPSAwOworCWlmIChwYXJ0X2F0dHItPnNob3cpCisJCXJldCA9IHBhcnRfYXR0ci0+c2hvdyhwLHBhZ2UpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIHBhcnRfc3lzZnNfb3BzID0geworCS5zaG93CT0JcGFydF9hdHRyX3Nob3csCit9OworCitzdGF0aWMgc3NpemVfdCBwYXJ0X2Rldl9yZWFkKHN0cnVjdCBoZF9zdHJ1Y3QgKiBwLCBjaGFyICpwYWdlKQoreworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gY29udGFpbmVyX29mKHAtPmtvYmoucGFyZW50LHN0cnVjdCBnZW5kaXNrLGtvYmopOworCWRldl90IGRldiA9IE1LREVWKGRpc2stPm1ham9yLCBkaXNrLT5maXJzdF9taW5vciArIHAtPnBhcnRubyk7IAorCXJldHVybiBwcmludF9kZXZfdChwYWdlLCBkZXYpOworfQorc3RhdGljIHNzaXplX3QgcGFydF9zdGFydF9yZWFkKHN0cnVjdCBoZF9zdHJ1Y3QgKiBwLCBjaGFyICpwYWdlKQoreworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlbGx1XG4iLCh1bnNpZ25lZCBsb25nIGxvbmcpcC0+c3RhcnRfc2VjdCk7Cit9CitzdGF0aWMgc3NpemVfdCBwYXJ0X3NpemVfcmVhZChzdHJ1Y3QgaGRfc3RydWN0ICogcCwgY2hhciAqcGFnZSkKK3sKKwlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJWxsdVxuIiwodW5zaWduZWQgbG9uZyBsb25nKXAtPm5yX3NlY3RzKTsKK30KK3N0YXRpYyBzc2l6ZV90IHBhcnRfc3RhdF9yZWFkKHN0cnVjdCBoZF9zdHJ1Y3QgKiBwLCBjaGFyICpwYWdlKQoreworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlOHUgJThsbHUgJTh1ICU4bGx1XG4iLAorCQkgICAgICAgcC0+cmVhZHMsICh1bnNpZ25lZCBsb25nIGxvbmcpcC0+cmVhZF9zZWN0b3JzLAorCQkgICAgICAgcC0+d3JpdGVzLCAodW5zaWduZWQgbG9uZyBsb25nKXAtPndyaXRlX3NlY3RvcnMpOworfQorc3RhdGljIHN0cnVjdCBwYXJ0X2F0dHJpYnV0ZSBwYXJ0X2F0dHJfZGV2ID0geworCS5hdHRyID0gey5uYW1lID0gImRldiIsIC5tb2RlID0gU19JUlVHTyB9LAorCS5zaG93CT0gcGFydF9kZXZfcmVhZAorfTsKK3N0YXRpYyBzdHJ1Y3QgcGFydF9hdHRyaWJ1dGUgcGFydF9hdHRyX3N0YXJ0ID0geworCS5hdHRyID0gey5uYW1lID0gInN0YXJ0IiwgLm1vZGUgPSBTX0lSVUdPIH0sCisJLnNob3cJPSBwYXJ0X3N0YXJ0X3JlYWQKK307CitzdGF0aWMgc3RydWN0IHBhcnRfYXR0cmlidXRlIHBhcnRfYXR0cl9zaXplID0geworCS5hdHRyID0gey5uYW1lID0gInNpemUiLCAubW9kZSA9IFNfSVJVR08gfSwKKwkuc2hvdwk9IHBhcnRfc2l6ZV9yZWFkCit9Oworc3RhdGljIHN0cnVjdCBwYXJ0X2F0dHJpYnV0ZSBwYXJ0X2F0dHJfc3RhdCA9IHsKKwkuYXR0ciA9IHsubmFtZSA9ICJzdGF0IiwgLm1vZGUgPSBTX0lSVUdPIH0sCisJLnNob3cJPSBwYXJ0X3N0YXRfcmVhZAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKiBkZWZhdWx0X2F0dHJzW10gPSB7CisJJnBhcnRfYXR0cl9kZXYuYXR0ciwKKwkmcGFydF9hdHRyX3N0YXJ0LmF0dHIsCisJJnBhcnRfYXR0cl9zaXplLmF0dHIsCisJJnBhcnRfYXR0cl9zdGF0LmF0dHIsCisJTlVMTCwKK307CisKK2V4dGVybiBzdHJ1Y3Qgc3Vic3lzdGVtIGJsb2NrX3N1YnN5czsKKworc3RhdGljIHZvaWQgcGFydF9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCXN0cnVjdCBoZF9zdHJ1Y3QgKiBwID0gY29udGFpbmVyX29mKGtvYmosc3RydWN0IGhkX3N0cnVjdCxrb2JqKTsKKwlrZnJlZShwKTsKK30KKworc3RydWN0IGtvYmpfdHlwZSBrdHlwZV9wYXJ0ID0geworCS5yZWxlYXNlCT0gcGFydF9yZWxlYXNlLAorCS5kZWZhdWx0X2F0dHJzCT0gZGVmYXVsdF9hdHRycywKKwkuc3lzZnNfb3BzCT0gJnBhcnRfc3lzZnNfb3BzLAorfTsKKwordm9pZCBkZWxldGVfcGFydGl0aW9uKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBpbnQgcGFydCkKK3sKKwlzdHJ1Y3QgaGRfc3RydWN0ICpwID0gZGlzay0+cGFydFtwYXJ0LTFdOworCWlmICghcCkKKwkJcmV0dXJuOworCWlmICghcC0+bnJfc2VjdHMpCisJCXJldHVybjsKKwlkaXNrLT5wYXJ0W3BhcnQtMV0gPSBOVUxMOworCXAtPnN0YXJ0X3NlY3QgPSAwOworCXAtPm5yX3NlY3RzID0gMDsKKwlwLT5yZWFkcyA9IHAtPndyaXRlcyA9IHAtPnJlYWRfc2VjdG9ycyA9IHAtPndyaXRlX3NlY3RvcnMgPSAwOworCWRldmZzX3JlbW92ZSgiJXMvcGFydCVkIiwgZGlzay0+ZGV2ZnNfbmFtZSwgcGFydCk7CisJa29iamVjdF91bnJlZ2lzdGVyKCZwLT5rb2JqKTsKK30KKwordm9pZCBhZGRfcGFydGl0aW9uKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBpbnQgcGFydCwgc2VjdG9yX3Qgc3RhcnQsIHNlY3Rvcl90IGxlbikKK3sKKwlzdHJ1Y3QgaGRfc3RydWN0ICpwOworCisJcCA9IGttYWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwKQorCQlyZXR1cm47CisJCisJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCXAtPnN0YXJ0X3NlY3QgPSBzdGFydDsKKwlwLT5ucl9zZWN0cyA9IGxlbjsKKwlwLT5wYXJ0bm8gPSBwYXJ0OworCisJZGV2ZnNfbWtfYmRldihNS0RFVihkaXNrLT5tYWpvciwgZGlzay0+Zmlyc3RfbWlub3IgKyBwYXJ0KSwKKwkJCVNfSUZCTEt8U19JUlVTUnxTX0lXVVNSLAorCQkJIiVzL3BhcnQlZCIsIGRpc2stPmRldmZzX25hbWUsIHBhcnQpOworCisJaWYgKGlzZGlnaXQoZGlzay0+a29iai5uYW1lW3N0cmxlbihkaXNrLT5rb2JqLm5hbWUpLTFdKSkKKwkJc25wcmludGYocC0+a29iai5uYW1lLEtPQkpfTkFNRV9MRU4sIiVzcCVkIixkaXNrLT5rb2JqLm5hbWUscGFydCk7CisJZWxzZQorCQlzbnByaW50ZihwLT5rb2JqLm5hbWUsS09CSl9OQU1FX0xFTiwiJXMlZCIsZGlzay0+a29iai5uYW1lLHBhcnQpOworCXAtPmtvYmoucGFyZW50ID0gJmRpc2stPmtvYmo7CisJcC0+a29iai5rdHlwZSA9ICZrdHlwZV9wYXJ0OworCWtvYmplY3RfcmVnaXN0ZXIoJnAtPmtvYmopOworCWRpc2stPnBhcnRbcGFydC0xXSA9IHA7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2tfc3lzZnNfc3ltbGlua3Moc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJc3RydWN0IGRldmljZSAqdGFyZ2V0ID0gZ2V0X2RldmljZShkaXNrLT5kcml2ZXJmc19kZXYpOworCWlmICh0YXJnZXQpIHsKKwkJc3lzZnNfY3JlYXRlX2xpbmsoJmRpc2stPmtvYmosJnRhcmdldC0+a29iaiwiZGV2aWNlIik7CisJCXN5c2ZzX2NyZWF0ZV9saW5rKCZ0YXJnZXQtPmtvYmosJmRpc2stPmtvYmosImJsb2NrIik7CisJfQorfQorCisvKiBOb3QgZXhwb3J0ZWQsIGhlbHBlciB0byBhZGRfZGlzaygpLiAqLwordm9pZCByZWdpc3Rlcl9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisJY2hhciAqczsKKwlpbnQgZXJyOworCisJc3RybGNweShkaXNrLT5rb2JqLm5hbWUsZGlzay0+ZGlza19uYW1lLEtPQkpfTkFNRV9MRU4pOworCS8qIGV3d3cuLi4gc29tZSBvZiB0aGVzZSBidWdnZXJzIGhhdmUgLyBpbiBuYW1lLi4uICovCisJcyA9IHN0cmNocihkaXNrLT5rb2JqLm5hbWUsICcvJyk7CisJaWYgKHMpCisJCSpzID0gJyEnOworCWlmICgoZXJyID0ga29iamVjdF9hZGQoJmRpc2stPmtvYmopKSkKKwkJcmV0dXJuOworCWRpc2tfc3lzZnNfc3ltbGlua3MoZGlzayk7CisKKwkvKiBObyBtaW5vcnMgdG8gdXNlIGZvciBwYXJ0aXRpb25zICovCisJaWYgKGRpc2stPm1pbm9ycyA9PSAxKSB7CisJCWlmIChkaXNrLT5kZXZmc19uYW1lWzBdICE9ICdcMCcpCisJCQlkZXZmc19hZGRfZGlzayhkaXNrKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGFsd2F5cyBhZGQgaGFuZGxlIGZvciB0aGUgd2hvbGUgZGlzayAqLworCWRldmZzX2FkZF9wYXJ0aXRpb25lZChkaXNrKTsKKworCS8qIE5vIHN1Y2ggZGV2aWNlIChlLmcuLCBtZWRpYSB3ZXJlIGp1c3QgcmVtb3ZlZCkgKi8KKwlpZiAoIWdldF9jYXBhY2l0eShkaXNrKSkKKwkJcmV0dXJuOworCisJYmRldiA9IGJkZ2V0X2Rpc2soZGlzaywgMCk7CisJaWYgKCFiZGV2KQorCQlyZXR1cm47CisKKwliZGV2LT5iZF9pbnZhbGlkYXRlZCA9IDE7CisJaWYgKGJsa2Rldl9nZXQoYmRldiwgRk1PREVfUkVBRCwgMCkgPCAwKQorCQlyZXR1cm47CisJYmxrZGV2X3B1dChiZGV2KTsKK30KKworaW50IHJlc2Nhbl9wYXJ0aXRpb25zKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCXN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGU7CisJaW50IHAsIHJlczsKKworCWlmIChiZGV2LT5iZF9wYXJ0X2NvdW50KQorCQlyZXR1cm4gLUVCVVNZOworCXJlcyA9IGludmFsaWRhdGVfcGFydGl0aW9uKGRpc2ssIDApOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisJYmRldi0+YmRfaW52YWxpZGF0ZWQgPSAwOworCWZvciAocCA9IDE7IHAgPCBkaXNrLT5taW5vcnM7IHArKykKKwkJZGVsZXRlX3BhcnRpdGlvbihkaXNrLCBwKTsKKwlpZiAoZGlzay0+Zm9wcy0+cmV2YWxpZGF0ZV9kaXNrKQorCQlkaXNrLT5mb3BzLT5yZXZhbGlkYXRlX2Rpc2soZGlzayk7CisJaWYgKCFnZXRfY2FwYWNpdHkoZGlzaykgfHwgIShzdGF0ZSA9IGNoZWNrX3BhcnRpdGlvbihkaXNrLCBiZGV2KSkpCisJCXJldHVybiAwOworCWZvciAocCA9IDE7IHAgPCBzdGF0ZS0+bGltaXQ7IHArKykgeworCQlzZWN0b3JfdCBzaXplID0gc3RhdGUtPnBhcnRzW3BdLnNpemU7CisJCXNlY3Rvcl90IGZyb20gPSBzdGF0ZS0+cGFydHNbcF0uZnJvbTsKKwkJaWYgKCFzaXplKQorCQkJY29udGludWU7CisJCWFkZF9wYXJ0aXRpb24oZGlzaywgcCwgZnJvbSwgc2l6ZSk7CisjaWZkZWYgQ09ORklHX0JMS19ERVZfTUQKKwkJaWYgKHN0YXRlLT5wYXJ0c1twXS5mbGFncykKKwkJCW1kX2F1dG9kZXRlY3RfZGV2KGJkZXYtPmJkX2RlditwKTsKKyNlbmRpZgorCX0KKwlrZnJlZShzdGF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGNoYXIgKnJlYWRfZGV2X3NlY3RvcihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBuLCBTZWN0b3IgKnApCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBiZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCAocGdvZmZfdCkobiA+PiAoUEFHRV9DQUNIRV9TSElGVC05KSksCisJCQkoZmlsbGVyX3QgKiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOworCWlmICghSVNfRVJSKHBhZ2UpKSB7CisJCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7CisJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKQorCQkJZ290byBmYWlsOworCQlpZiAoUGFnZUVycm9yKHBhZ2UpKQorCQkJZ290byBmYWlsOworCQlwLT52ID0gcGFnZTsKKwkJcmV0dXJuICh1bnNpZ25lZCBjaGFyICopcGFnZV9hZGRyZXNzKHBhZ2UpICsgICgobiAmICgoMSA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIDkpKSAtIDEpKSA8PCA5KTsKK2ZhaWw6CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CisJcC0+diA9IE5VTEw7CisJcmV0dXJuIE5VTEw7Cit9CisKK0VYUE9SVF9TWU1CT0wocmVhZF9kZXZfc2VjdG9yKTsKKwordm9pZCBkZWxfZ2VuZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlpbnQgcDsKKworCS8qIGludmFsaWRhdGUgc3R1ZmYgKi8KKwlmb3IgKHAgPSBkaXNrLT5taW5vcnMgLSAxOyBwID4gMDsgcC0tKSB7CisJCWludmFsaWRhdGVfcGFydGl0aW9uKGRpc2ssIHApOworCQlkZWxldGVfcGFydGl0aW9uKGRpc2ssIHApOworCX0KKwlpbnZhbGlkYXRlX3BhcnRpdGlvbihkaXNrLCAwKTsKKwlkaXNrLT5jYXBhY2l0eSA9IDA7CisJZGlzay0+ZmxhZ3MgJj0gfkdFTkhEX0ZMX1VQOworCXVubGlua19nZW5kaXNrKGRpc2spOworCWRpc2tfc3RhdF9zZXRfYWxsKGRpc2ssIDApOworCWRpc2stPnN0YW1wID0gZGlzay0+c3RhbXBfaWRsZSA9IDA7CisKKwlkZXZmc19yZW1vdmVfZGlzayhkaXNrKTsKKworCWlmIChkaXNrLT5kcml2ZXJmc19kZXYpIHsKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRpc2stPmtvYmosICJkZXZpY2UiKTsKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRpc2stPmRyaXZlcmZzX2Rldi0+a29iaiwgImJsb2NrIik7CisJCXB1dF9kZXZpY2UoZGlzay0+ZHJpdmVyZnNfZGV2KTsKKwl9CisJa29iamVjdF9kZWwoJmRpc2stPmtvYmopOworfQpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9jaGVjay5oIGIvZnMvcGFydGl0aW9ucy9jaGVjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYWRjYzYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL2NoZWNrLmgKQEAgLTAsMCArMSwzNiBAQAorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKworLyoKKyAqIGFkZF9nZF9wYXJ0aXRpb24gYWRkcyBhIHBhcnRpdGlvbnMgZGV0YWlscyB0byB0aGUgZGV2aWNlcyBwYXJ0aXRpb24KKyAqIGRlc2NyaXB0aW9uLgorICovCitlbnVtIHsgTUFYX1BBUlQgPSAyNTYgfTsKKworc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zIHsKKwljaGFyIG5hbWVbQkRFVk5BTUVfU0laRV07CisJc3RydWN0IHsKKwkJc2VjdG9yX3QgZnJvbTsKKwkJc2VjdG9yX3Qgc2l6ZTsKKwkJaW50IGZsYWdzOworCX0gcGFydHNbTUFYX1BBUlRdOworCWludCBuZXh0OworCWludCBsaW1pdDsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcHV0X3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnAsIGludCBuLCBzZWN0b3JfdCBmcm9tLCBzZWN0b3JfdCBzaXplKQoreworCWlmIChuIDwgcC0+bGltaXQpIHsKKwkJcC0+cGFydHNbbl0uZnJvbSA9IGZyb207CisJCXAtPnBhcnRzW25dLnNpemUgPSBzaXplOworCQlwcmludGsoIiAlcyVkIiwgcC0+bmFtZSwgbik7CisJfQorfQorCitleHRlcm4gaW50IHdhcm5fbm9fcGFydDsKKworZXh0ZXJuIHZvaWQgcGFyc2VfYnNkKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsCisJCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB1MzIgb2Zmc2V0LCB1MzIgc2l6ZSwKKwkJCWludCBvcmlnaW4sIGNoYXIgKmZsYXZvdXIsIGludCBtYXhfcGFydGl0aW9ucyk7CisKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvZGV2ZnMuYyBiL2ZzL3BhcnRpdGlvbnMvZGV2ZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2Y1MDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcGFydGl0aW9ucy9kZXZmcy5jCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogVGhpcyB0cmllcyB0byBrZWVwIGJsb2NrIGRldmljZXMgYXdheSBmcm9tIGRldmZzIGFzIG11Y2ggYXMgcG9zc2libGUuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworCitzdHJ1Y3QgdW5pcXVlX251bXNwYWNlIHsKKwl1MzIJCSAgbnVtX2ZyZWU7ICAgICAgICAgIC8qICBOdW0gZnJlZSBpbiBiaXRzICAgICAgICovCisJdTMyCQkgIGxlbmd0aDsgICAgICAgICAgICAvKiAgQXJyYXkgbGVuZ3RoIGluIGJ5dGVzICAqLworCXVuc2lnbmVkIGxvbmcJICAqYml0czsKKwlzdHJ1Y3Qgc2VtYXBob3JlICBtdXRleDsKK307CisKK3N0YXRpYyBERUNMQVJFX01VVEVYKG51bXNwYWNlX211dGV4KTsKKworc3RhdGljIGludCBleHBhbmRfbnVtc3BhY2Uoc3RydWN0IHVuaXF1ZV9udW1zcGFjZSAqcykKK3sKKwl1MzIgbGVuZ3RoOworCXZvaWQgKmJpdHM7CisKKwlpZiAocy0+bGVuZ3RoIDwgMTYpCisJCWxlbmd0aCA9IDE2OworCWVsc2UKKwkJbGVuZ3RoID0gcy0+bGVuZ3RoIDw8IDE7CisKKwliaXRzID0gdm1hbGxvYyhsZW5ndGgpOworCWlmICghYml0cykKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKHMtPmJpdHMpIHsKKwkJbWVtY3B5KGJpdHMsIHMtPmJpdHMsIHMtPmxlbmd0aCk7CisJCXZmcmVlKHMtPmJpdHMpOworCX0KKwkJCisJcy0+bnVtX2ZyZWUgPSAobGVuZ3RoIC0gcy0+bGVuZ3RoKSA8PCAzOworCXMtPmJpdHMgPSBiaXRzOworCW1lbXNldChiaXRzICsgcy0+bGVuZ3RoLCAwLCBsZW5ndGggLSBzLT5sZW5ndGgpOworCXMtPmxlbmd0aCA9IGxlbmd0aDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFsbG9jX3VuaXF1ZV9udW1iZXIoc3RydWN0IHVuaXF1ZV9udW1zcGFjZSAqcykKK3sKKwlpbnQgcnZhbCA9IDA7CisKKwlkb3duKCZudW1zcGFjZV9tdXRleCk7CisJaWYgKHMtPm51bV9mcmVlIDwgMSkKKwkJcnZhbCA9IGV4cGFuZF9udW1zcGFjZShzKTsKKwlpZiAoIXJ2YWwpIHsKKwkJcnZhbCA9IGZpbmRfZmlyc3RfemVyb19iaXQocy0+Yml0cywgcy0+bGVuZ3RoIDw8IDMpOworCQktLXMtPm51bV9mcmVlOworCQlfX3NldF9iaXQocnZhbCwgcy0+Yml0cyk7CisJfQorCXVwKCZudW1zcGFjZV9tdXRleCk7CisKKwlyZXR1cm4gcnZhbDsKK30KKworc3RhdGljIHZvaWQgZGVhbGxvY191bmlxdWVfbnVtYmVyKHN0cnVjdCB1bmlxdWVfbnVtc3BhY2UgKnMsIGludCBudW1iZXIpCit7CisJaW50IG9sZF92YWw7CisKKwlpZiAobnVtYmVyID49IDApIHsKKwkJZG93bigmbnVtc3BhY2VfbXV0ZXgpOworCQlvbGRfdmFsID0gX190ZXN0X2FuZF9jbGVhcl9iaXQobnVtYmVyLCBzLT5iaXRzKTsKKwkJaWYgKG9sZF92YWwpCisJCQkrK3MtPm51bV9mcmVlOworCQl1cCgmbnVtc3BhY2VfbXV0ZXgpOworCX0KK30KKworc3RhdGljIHN0cnVjdCB1bmlxdWVfbnVtc3BhY2UgZGlzY19udW1zcGFjZTsKK3N0YXRpYyBzdHJ1Y3QgdW5pcXVlX251bXNwYWNlIGNkcm9tX251bXNwYWNlOworCit2b2lkIGRldmZzX2FkZF9wYXJ0aXRpb25lZChzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwljaGFyIGRpcm5hbWVbNjRdLCBzeW1saW5rWzE2XTsKKworCWRldmZzX21rX2RpcihkaXNrLT5kZXZmc19uYW1lKTsKKwlkZXZmc19ta19iZGV2KE1LREVWKGRpc2stPm1ham9yLCBkaXNrLT5maXJzdF9taW5vciksCisJCQlTX0lGQkxLfFNfSVJVU1J8U19JV1VTUiwKKwkJCSIlcy9kaXNjIiwgZGlzay0+ZGV2ZnNfbmFtZSk7CisKKwlkaXNrLT5udW1iZXIgPSBhbGxvY191bmlxdWVfbnVtYmVyKCZkaXNjX251bXNwYWNlKTsKKworCXNwcmludGYoc3ltbGluaywgImRpc2NzL2Rpc2MlZCIsIGRpc2stPm51bWJlcik7CisJc3ByaW50ZihkaXJuYW1lLCAiLi4vJXMiLCBkaXNrLT5kZXZmc19uYW1lKTsKKwlkZXZmc19ta19zeW1saW5rKHN5bWxpbmssIGRpcm5hbWUpOworCit9CisKK3ZvaWQgZGV2ZnNfYWRkX2Rpc2soc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJZGV2ZnNfbWtfYmRldihNS0RFVihkaXNrLT5tYWpvciwgZGlzay0+Zmlyc3RfbWlub3IpLAorCQkJKGRpc2stPmZsYWdzICYgR0VOSERfRkxfQ0QpID8KKwkJCQlTX0lGQkxLfFNfSVJVR098U19JV1VHTyA6CisJCQkJU19JRkJMS3xTX0lSVVNSfFNfSVdVU1IsCisJCQkiJXMiLCBkaXNrLT5kZXZmc19uYW1lKTsKKworCWlmIChkaXNrLT5mbGFncyAmIEdFTkhEX0ZMX0NEKSB7CisJCWNoYXIgZGlybmFtZVs2NF0sIHN5bWxpbmtbMTZdOworCisJCWRpc2stPm51bWJlciA9IGFsbG9jX3VuaXF1ZV9udW1iZXIoJmNkcm9tX251bXNwYWNlKTsKKworCQlzcHJpbnRmKHN5bWxpbmssICJjZHJvbXMvY2Ryb20lZCIsIGRpc2stPm51bWJlcik7CisJCXNwcmludGYoZGlybmFtZSwgIi4uLyVzIiwgZGlzay0+ZGV2ZnNfbmFtZSk7CisJCWRldmZzX21rX3N5bWxpbmsoc3ltbGluaywgZGlybmFtZSk7CisJfQorfQorCit2b2lkIGRldmZzX3JlbW92ZV9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCWlmIChkaXNrLT5taW5vcnMgIT0gMSkgeworCQlkZXZmc19yZW1vdmUoImRpc2NzL2Rpc2MlZCIsIGRpc2stPm51bWJlcik7CisJCWRlYWxsb2NfdW5pcXVlX251bWJlcigmZGlzY19udW1zcGFjZSwgZGlzay0+bnVtYmVyKTsKKwkJZGV2ZnNfcmVtb3ZlKCIlcy9kaXNjIiwgZGlzay0+ZGV2ZnNfbmFtZSk7CisJfQorCWlmIChkaXNrLT5mbGFncyAmIEdFTkhEX0ZMX0NEKSB7CisJCWRldmZzX3JlbW92ZSgiY2Ryb21zL2Nkcm9tJWQiLCBkaXNrLT5udW1iZXIpOworCQlkZWFsbG9jX3VuaXF1ZV9udW1iZXIoJmNkcm9tX251bXNwYWNlLCBkaXNrLT5udW1iZXIpOworCX0KKwlkZXZmc19yZW1vdmUoZGlzay0+ZGV2ZnNfbmFtZSk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9kZXZmcy5oIGIvZnMvcGFydGl0aW9ucy9kZXZmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NjExOGIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL2RldmZzLmgKQEAgLTAsMCArMSwxMCBAQAorCisjaWZkZWYgQ09ORklHX0RFVkZTX0ZTCit2b2lkIGRldmZzX2FkZF9kaXNrKHN0cnVjdCBnZW5kaXNrICpkZXYpOwordm9pZCBkZXZmc19hZGRfcGFydGl0aW9uZWQoc3RydWN0IGdlbmRpc2sgKmRldik7Cit2b2lkIGRldmZzX3JlbW92ZV9kaXNrKHN0cnVjdCBnZW5kaXNrICpkZXYpOworI2Vsc2UKKyMgZGVmaW5lIGRldmZzX2FkZF9kaXNrKGRpc2spCQkJZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgZGV2ZnNfYWRkX3BhcnRpdGlvbmVkKGRpc2spCQlkbyB7IH0gd2hpbGUgKDApCisjIGRlZmluZSBkZXZmc19yZW1vdmVfZGlzayhkaXNrKQkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2VmaS5jIGIvZnMvcGFydGl0aW9ucy9lZmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjViMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcGFydGl0aW9ucy9lZmkuYwpAQCAtMCwwICsxLDY0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRUZJIEdVSUQgUGFydGl0aW9uIFRhYmxlIGhhbmRsaW5nCisgKiBQZXIgSW50ZWwgRUZJIFNwZWNpZmljYXRpb24gdjEuMDIKKyAqIGh0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29tL3RlY2hub2xvZ3kvZWZpL2VmaS5odG0KKyAqIGVmaS5bY2hdIGJ5IE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAqICAgQ29weXJpZ2h0IDIwMDAsMjAwMSwyMDAyLDIwMDQgRGVsbCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICoKKyAqIFRPRE86CisgKgorICogQ2hhbmdlbG9nOgorICogTW9uIE5vdiAwOSAyMDA0IE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAqIC0gdGVzdCBmb3IgdmFsaWQgUE1CUiBhbmQgdmFsaWQgUEdQVCBiZWZvcmUgZXZlciByZWFkaW5nCisgKiAgIEFHUFQsIGFsbG93IG92ZXJyaWRlIHdpdGggJ2dwdCcga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24uCisgKiAtIGNoZWNrIGZvciBmaXJzdC9sYXN0X3VzYWJsZV9sYmEgb3V0c2lkZSBvZiBzaXplIG9mIGRpc2sKKyAqCisgKiBUdWUgIE1hciAyNiAyMDAyIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAqIC0gUG9ydGVkIHRvIDIuNS43LXByZTEgYW5kIDIuNS43LWRqMgorICogLSBBcHBsaWVkIHBhdGNoIHRvIGF2b2lkIGZhdWx0IGluIGFsdGVybmF0ZSBoZWFkZXIgaGFuZGxpbmcKKyAqIC0gY2xlYW5lZCB1cCBmaW5kX3ZhbGlkX2dwdAorICogLSBPbi1kaXNrIHN0cnVjdHVyZSBhbmQgY29weSBpbiBtZW1vcnkgaXMgKmFsd2F5cyogTEUgbm93IC0gCisgKiAgIHN3YWIgZmllbGRzIGFzIG5lZWRlZAorICogLSByZW1vdmUgcHJpbnRfZ3B0X2hlYWRlcigpCisgKiAtIG9ubHkgdXNlIGZpcnN0IG1heF9wIHBhcnRpdGlvbiBlbnRyaWVzLCB0byBrZWVwIHRoZSBrZXJuZWwgbWlub3IgbnVtYmVyCisgKiAgIGFuZCBwYXJ0aXRpb24gbnVtYmVycyB0aWVkLgorICoKKyAqIE1vbiAgRmViIDA0IDIwMDIgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPgorICogLSBSZW1vdmVkIF9fUFJJUFRSX1BSRUZJWCAtIG5vdCBiZWluZyB1c2VkCisgKgorICogTW9uICBKYW4gMTQgMjAwMiBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKiAtIFBvcnRlZCB0byAyLjUuMi1wcmUxMSArIGxpYnJhcnkgY3JjMzIgcGF0Y2ggTGludXMgYXBwbGllZAorICoKKyAqIFRodSBEZWMgNiAyMDAxIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAqIC0gQWRkZWQgY29tcGFyZV9ncHRzKCkuCisgKiAtIG1vdmVkIGxlX2VmaV9ndWlkX3RvX2NwdXMoKSBiYWNrIGludG8gdGhpcyBmaWxlLiAgR1BUIGlzIHRoZSBvbmx5CisgKiAgIHRoaW5nIHRoYXQga2VlcHMgRUZJIEdVSURzIG9uIGRpc2suCisgKiAtIENoYW5nZWQgZ3B0IHN0cnVjdHVyZSBuYW1lcyBhbmQgbWVtYmVycyB0byBiZSBzaW1wbGVyIGFuZCBtb3JlIExpbnV4LWxpa2UuCisgKiAKKyAqIFdlZCBPY3QgMTcgMjAwMSBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKiAtIFJlbW92ZWQgQ09ORklHX0RFVkZTX1ZPTFVNRVNfVVVJRCBjb2RlIGVudGlyZWx5IHBlciBNYXJ0aW4gV2lsY2sKKyAqCisgKiBXZWQgT2N0IDEwIDIwMDEgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPgorICogLSBDaGFuZ2VkIGZ1bmN0aW9uIGNvbW1lbnRzIHRvIERvY0Jvb2sgc3R5bGUgcGVyIEFuZHJlYXMgRGlsZ2VyIHN1Z2dlc3Rpb24uCisgKgorICogTW9uIE9jdCAwOCAyMDAxIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAqIC0gQ2hhbmdlIHJlYWRfbGJhKCkgdG8gdXNlIHRoZSBwYWdlIGNhY2hlIHBlciBBbCBWaXJvJ3Mgd29yay4KKyAqIC0gcHJpbnQgdTY0cyBwcm9wZXJseSBvbiBhbGwgYXJjaGl0ZWN0dXJlcworICogLSBmaXhlZCBkZWJ1Z19wcmludGsoKSwgbm93IERwcmludGsoKQorICoKKyAqIE1vbiBPY3QgMDEgMjAwMSBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKiAtIFN0eWxlIGNsZWFudXBzCisgKiAtIG1hZGUgbW9zdCBmdW5jdGlvbnMgc3RhdGljCisgKiAtIEVuZGlhbm5lc3MgYWRkaXRpb24KKyAqIC0gcmVtb3ZlIHRlc3QgZm9yIHNlY29uZCBhbHRlcm5hdGUgaGVhZGVyLCBhcyBpdCdzIG5vdCBwZXIgc3BlYywKKyAqICAgYW5kIGlzIHVubmVjZXNzYXJ5LiAgVGhlcmUncyBub3cgYSBtZXRob2QgdG8gcmVhZC93cml0ZSB0aGUgbGFzdAorICogICBzZWN0b3Igb2YgYW4gb2RkLXNpemVkIGRpc2sgZnJvbSB1c2VyIHNwYWNlLiAgTm8gdG9vbHMgaGF2ZSBldmVyCisgKiAgIGJlZW4gcmVsZWFzZWQgd2hpY2ggdXNlZCB0aGlzIGNvZGUsIHNvIGl0J3MgZWZmZWN0aXZlbHkgZGVhZC4KKyAqIC0gUGVyIEFzaXQgTWFsbGljayBvZiBJbnRlbCwgYWRkZWQgYSB0ZXN0IGZvciBhIHZhbGlkIFBNQlIuCisgKiAtIEFkZGVkIGtlcm5lbCBjb21tYW5kIGxpbmUgb3B0aW9uICdncHQnIHRvIG92ZXJyaWRlIHZhbGlkIFBNQlIgdGVzdC4KKyAqCisgKiBXZWQgSnVuICA2IDIwMDEgTWFydGluIFdpbGNrIDxNYXJ0aW4uV2lsY2tARnVqaXRzdS1TaWVtZW5zLmNvbT4KKyAqIC0gYWRkZWQgZGV2ZnMgdm9sdW1lIFVVSUQgc3VwcG9ydCAoL2Rldi92b2x1bWVzL3V1aWRzKSBmb3IKKyAqICAgbW91bnRpbmcgZmlsZSBzeXN0ZW1zIGJ5IHRoZSBwYXJ0aXRpb24gR1VJRC4gCisgKgorICogVHVlIERlYyAgNSAyMDAwIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAqIC0gTW92ZWQgY3JjMzIoKSB0byBsaW51eC9saWIsIGFkZGVkIGVmaV9jcmMzMigpLgorICoKKyAqIFRodSBOb3YgMzAgMjAwMCBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKiAtIFJlcGxhY2VkIEludGVsJ3MgQ1JDMzIgZnVuY3Rpb24gd2l0aCBhbiBlcXVpdmFsZW50CisgKiAgIG5vbi1saWNlbnNlLXJlc3RyaWN0ZWQgdmVyc2lvbi4KKyAqCisgKiBXZWQgT2N0IDI1IDIwMDAgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPgorICogLSBGaXhlZCB0aGUgbGFzdF9sYmEoKSBjYWxsIHRvIHJldHVybiB0aGUgcHJvcGVyIGxhc3QgYmxvY2sKKyAqCisgKiBUaHUgT2N0IDEyIDIwMDAgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPgorICogLSBUaGFua3MgdG8gQW5kcmllcyBCcm91d2VyIGZvciBoaXMgZGVidWdnaW5nIGFzc2lzdGFuY2UuCisgKiAtIENvZGUgd29ya3MsIGRldGVjdHMgYWxsIHRoZSBwYXJ0aXRpb25zLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlICJjaGVjay5oIgorI2luY2x1ZGUgImVmaS5oIgorCisjdW5kZWYgRUZJX0RFQlVHCisjaWZkZWYgRUZJX0RFQlVHCisjZGVmaW5lIERwcmludGsoeC4uLikgcHJpbnRrKEtFUk5fREVCVUcgeCkKKyNlbHNlCisjZGVmaW5lIERwcmludGsoeC4uLikKKyNlbmRpZgorCisvKiBUaGlzIGFsbG93cyBhIGtlcm5lbCBjb21tYW5kIGxpbmUgb3B0aW9uICdncHQnIHRvIG92ZXJyaWRlCisgKiB0aGUgdGVzdCBmb3IgaW52YWxpZCBQTUJSLiAgTm90IF9faW5pdGRhdGEgYmVjYXVzZSByZWxvYWRpbmcKKyAqIHRoZSBwYXJ0aXRpb24gdGFibGVzIGhhcHBlbnMgYWZ0ZXIgaW5pdCB0b28uCisgKi8KK3N0YXRpYyBpbnQgZm9yY2VfZ3B0Oworc3RhdGljIGludCBfX2luaXQKK2ZvcmNlX2dwdF9mbihjaGFyICpzdHIpCit7CisJZm9yY2VfZ3B0ID0gMTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImdwdCIsIGZvcmNlX2dwdF9mbik7CisKKworLyoqCisgKiBlZmlfY3JjMzIoKSAtIEVGSSB2ZXJzaW9uIG9mIGNyYzMyIGZ1bmN0aW9uCisgKiBAYnVmOiBidWZmZXIgdG8gY2FsY3VsYXRlIGNyYzMyIG9mCisgKiBAbGVuIC0gbGVuZ3RoIG9mIGJ1ZgorICoKKyAqIERlc2NyaXB0aW9uOiBSZXR1cm5zIEVGSS1zdHlsZSBDUkMzMiB2YWx1ZSBmb3IgQGJ1ZgorICogCisgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGxpdHRsZSBlbmRpYW4gRXRoZXJuZXQgcG9seW5vbWlhbAorICogYnV0IHNlZWRzIHRoZSBmdW5jdGlvbiB3aXRoIH4wLCBhbmQgeG9yJ3Mgd2l0aCB+MCBhdCB0aGUgZW5kLgorICogTm90ZSwgdGhlIEVGSSBTcGVjaWZpY2F0aW9uLCB2MS4wMiwgaGFzIGEgcmVmZXJlbmNlIHRvCisgKiBEci4gRG9iYnMgSm91cm5hbCwgTWF5IDE5OTQgKGFjdHVhbGx5IGl0J3MgaW4gTWF5IDE5OTIpLgorICovCitzdGF0aWMgaW5saW5lIHUzMgorZWZpX2NyYzMyKGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJcmV0dXJuIChjcmMzMih+MEwsIGJ1ZiwgbGVuKSBeIH4wTCk7Cit9CisKKy8qKgorICogbGFzdF9sYmEoKTogcmV0dXJuIG51bWJlciBvZiBsYXN0IGxvZ2ljYWwgYmxvY2sgb2YgZGV2aWNlCisgKiBAYmRldjogYmxvY2sgZGV2aWNlCisgKiAKKyAqIERlc2NyaXB0aW9uOiBSZXR1cm5zIGxhc3QgTEJBIHZhbHVlIG9uIHN1Y2Nlc3MsIDAgb24gZXJyb3IuCisgKiBUaGlzIGlzIHN0b3JlZCAoYnkgc2QgYW5kIGlkZS1nZW9tZXRyeSkgaW4KKyAqICB0aGUgcGFydFswXSBlbnRyeSBmb3IgdGhpcyBkaXNrLCBhbmQgaXMgdGhlIG51bWJlciBvZgorICogIHBoeXNpY2FsIHNlY3RvcnMgYXZhaWxhYmxlIG9uIHRoZSBkaXNrLgorICovCitzdGF0aWMgdTY0CitsYXN0X2xiYShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCWlmICghYmRldiB8fCAhYmRldi0+YmRfaW5vZGUpCisJCXJldHVybiAwOworCXJldHVybiAoYmRldi0+YmRfaW5vZGUtPmlfc2l6ZSA+PiA5KSAtIDFVTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitwbWJyX3BhcnRfdmFsaWQoc3RydWN0IHBhcnRpdGlvbiAqcGFydCwgdTY0IGxhc3RsYmEpCit7CisgICAgICAgIGlmIChwYXJ0LT5zeXNfaW5kID09IEVGSV9QTUJSX09TVFlQRV9FRklfR1BUICYmCisgICAgICAgICAgICBsZTMyX3RvX2NwdShwYXJ0LT5zdGFydF9zZWN0KSA9PSAxVUwpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAwOworfQorCisvKioKKyAqIGlzX3BtYnJfdmFsaWQoKTogdGVzdCBQcm90ZWN0aXZlIE1CUiBmb3IgdmFsaWRpdHkKKyAqIEBtYnI6IHBvaW50ZXIgdG8gYSBsZWdhY3kgbWJyIHN0cnVjdHVyZQorICogQGxhc3RsYmE6IGxhc3RfbGJhIGZvciB0aGUgd2hvbGUgZGV2aWNlCisgKgorICogRGVzY3JpcHRpb246IFJldHVybnMgMSBpZiBQTUJSIGlzIHZhbGlkLCAwIG90aGVyd2lzZS4KKyAqIFZhbGlkaXR5IGRlcGVuZHMgb24gdHdvIHRoaW5nczoKKyAqICAxKSBNU0RPUyBzaWduYXR1cmUgaXMgaW4gdGhlIGxhc3QgdHdvIGJ5dGVzIG9mIHRoZSBNQlIKKyAqICAyKSBPbmUgcGFydGl0aW9uIG9mIHR5cGUgMHhFRSBpcyBmb3VuZAorICovCitzdGF0aWMgaW50Citpc19wbWJyX3ZhbGlkKGxlZ2FjeV9tYnIgKm1iciwgdTY0IGxhc3RsYmEpCit7CisJaW50IGk7CisJaWYgKCFtYnIgfHwgbGUxNl90b19jcHUobWJyLT5zaWduYXR1cmUpICE9IE1TRE9TX01CUl9TSUdOQVRVUkUpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJaWYgKHBtYnJfcGFydF92YWxpZCgmbWJyLT5wYXJ0aXRpb25fcmVjb3JkW2ldLCBsYXN0bGJhKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworCXJldHVybiAwOworfQorCisvKioKKyAqIHJlYWRfbGJhKCk6IFJlYWQgYnl0ZXMgZnJvbSBkaXNrLCBzdGFydGluZyBhdCBnaXZlbiBMQkEKKyAqIEBiZGV2CisgKiBAbGJhCisgKiBAYnVmZmVyCisgKiBAc2l6ZV90CisgKgorICogRGVzY3JpcHRpb246ICBSZWFkcyBAY291bnQgYnl0ZXMgZnJvbSBAYmRldiBpbnRvIEBidWZmZXIuCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIG9uIHN1Y2Nlc3MsIDAgb24gZXJyb3IuCisgKi8KK3N0YXRpYyBzaXplX3QKK3JlYWRfbGJhKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHU2NCBsYmEsIHU4ICogYnVmZmVyLCBzaXplX3QgY291bnQpCit7CisJc2l6ZV90IHRvdGFscmVhZGNvdW50ID0gMDsKKworCWlmICghYmRldiB8fCAhYnVmZmVyIHx8IGxiYSA+IGxhc3RfbGJhKGJkZXYpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisJd2hpbGUgKGNvdW50KSB7CisJCWludCBjb3BpZWQgPSA1MTI7CisJCVNlY3RvciBzZWN0OworCQl1bnNpZ25lZCBjaGFyICpkYXRhID0gcmVhZF9kZXZfc2VjdG9yKGJkZXYsIGxiYSsrLCAmc2VjdCk7CisJCWlmICghZGF0YSkKKwkJCWJyZWFrOworCQlpZiAoY29waWVkID4gY291bnQpCisJCQljb3BpZWQgPSBjb3VudDsKKwkJbWVtY3B5KGJ1ZmZlciwgZGF0YSwgY29waWVkKTsKKwkJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJCWJ1ZmZlciArPSBjb3BpZWQ7CisJCXRvdGFscmVhZGNvdW50ICs9Y29waWVkOworCQljb3VudCAtPSBjb3BpZWQ7CisJfQorCXJldHVybiB0b3RhbHJlYWRjb3VudDsKK30KKworLyoqCisgKiBhbGxvY19yZWFkX2dwdF9lbnRyaWVzKCk6IHJlYWRzIHBhcnRpdGlvbiBlbnRyaWVzIGZyb20gZGlzaworICogQGJkZXYKKyAqIEBncHQgLSBHUFQgaGVhZGVyCisgKiAKKyAqIERlc2NyaXB0aW9uOiBSZXR1cm5zIHB0ZXMgb24gc3VjY2VzcywgIE5VTEwgb24gZXJyb3IuCisgKiBBbGxvY2F0ZXMgc3BhY2UgZm9yIFBURXMgYmFzZWQgb24gaW5mb3JtYXRpb24gZm91bmQgaW4gQGdwdC4KKyAqIE5vdGVzOiByZW1lbWJlciB0byBmcmVlIHB0ZSB3aGVuIHlvdSdyZSBkb25lIQorICovCitzdGF0aWMgZ3B0X2VudHJ5ICoKK2FsbG9jX3JlYWRfZ3B0X2VudHJpZXMoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgZ3B0X2hlYWRlciAqZ3B0KQoreworCXNpemVfdCBjb3VudDsKKwlncHRfZW50cnkgKnB0ZTsKKwlpZiAoIWJkZXYgfHwgIWdwdCkKKwkJcmV0dXJuIE5VTEw7CisKKwljb3VudCA9IGxlMzJfdG9fY3B1KGdwdC0+bnVtX3BhcnRpdGlvbl9lbnRyaWVzKSAqCisgICAgICAgICAgICAgICAgbGUzMl90b19jcHUoZ3B0LT5zaXplb2ZfcGFydGl0aW9uX2VudHJ5KTsKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gTlVMTDsKKwlwdGUgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB0ZSkKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KHB0ZSwgMCwgY291bnQpOworCisJaWYgKHJlYWRfbGJhKGJkZXYsIGxlNjRfdG9fY3B1KGdwdC0+cGFydGl0aW9uX2VudHJ5X2xiYSksCisgICAgICAgICAgICAgICAgICAgICAodTggKikgcHRlLAorCQkgICAgIGNvdW50KSA8IGNvdW50KSB7CisJCWtmcmVlKHB0ZSk7CisgICAgICAgICAgICAgICAgcHRlPU5VTEw7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gcHRlOworfQorCisvKioKKyAqIGFsbG9jX3JlYWRfZ3B0X2hlYWRlcigpOiBBbGxvY2F0ZXMgR1BUIGhlYWRlciwgcmVhZHMgaW50byBpdCBmcm9tIGRpc2sKKyAqIEBiZGV2CisgKiBAbGJhIGlzIHRoZSBMb2dpY2FsIEJsb2NrIEFkZHJlc3Mgb2YgdGhlIHBhcnRpdGlvbiB0YWJsZQorICogCisgKiBEZXNjcmlwdGlvbjogcmV0dXJucyBHUFQgaGVhZGVyIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZXJyb3IuICAgQWxsb2NhdGVzCisgKiBhbmQgZmlsbHMgYSBHUFQgaGVhZGVyIHN0YXJ0aW5nIGF0IEAgZnJvbSBAYmRldi4KKyAqIE5vdGU6IHJlbWVtYmVyIHRvIGZyZWUgZ3B0IHdoZW4gZmluaXNoZWQgd2l0aCBpdC4KKyAqLworc3RhdGljIGdwdF9oZWFkZXIgKgorYWxsb2NfcmVhZF9ncHRfaGVhZGVyKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHU2NCBsYmEpCit7CisJZ3B0X2hlYWRlciAqZ3B0OworCWlmICghYmRldikKKwkJcmV0dXJuIE5VTEw7CisKKwlncHQgPSBrbWFsbG9jKHNpemVvZiAoZ3B0X2hlYWRlciksIEdGUF9LRVJORUwpOworCWlmICghZ3B0KQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoZ3B0LCAwLCBzaXplb2YgKGdwdF9oZWFkZXIpKTsKKworCWlmIChyZWFkX2xiYShiZGV2LCBsYmEsICh1OCAqKSBncHQsCisJCSAgICAgc2l6ZW9mIChncHRfaGVhZGVyKSkgPCBzaXplb2YgKGdwdF9oZWFkZXIpKSB7CisJCWtmcmVlKGdwdCk7CisgICAgICAgICAgICAgICAgZ3B0PU5VTEw7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBncHQ7Cit9CisKKy8qKgorICogaXNfZ3B0X3ZhbGlkKCkgLSB0ZXN0cyBvbmUgR1BUIGhlYWRlciBhbmQgUFRFcyBmb3IgdmFsaWRpdHkKKyAqIEBiZGV2CisgKiBAbGJhIGlzIHRoZSBsb2dpY2FsIGJsb2NrIGFkZHJlc3Mgb2YgdGhlIEdQVCBoZWFkZXIgdG8gdGVzdAorICogQGdwdCBpcyBhIEdQVCBoZWFkZXIgcHRyLCBmaWxsZWQgb24gcmV0dXJuLgorICogQHB0ZXMgaXMgYSBQVEVzIHB0ciwgZmlsbGVkIG9uIHJldHVybi4KKyAqCisgKiBEZXNjcmlwdGlvbjogcmV0dXJucyAxIGlmIHZhbGlkLCAgMCBvbiBlcnJvci4KKyAqIElmIHZhbGlkLCByZXR1cm5zIHBvaW50ZXJzIHRvIG5ld2x5IGFsbG9jYXRlZCBHUFQgaGVhZGVyIGFuZCBQVEVzLgorICovCitzdGF0aWMgaW50Citpc19ncHRfdmFsaWQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdTY0IGxiYSwKKwkgICAgIGdwdF9oZWFkZXIgKipncHQsIGdwdF9lbnRyeSAqKnB0ZXMpCit7CisJdTMyIGNyYywgb3JpZ2NyYzsKKwl1NjQgbGFzdGxiYTsKKworCWlmICghYmRldiB8fCAhZ3B0IHx8ICFwdGVzKQorCQlyZXR1cm4gMDsKKwlpZiAoISgqZ3B0ID0gYWxsb2NfcmVhZF9ncHRfaGVhZGVyKGJkZXYsIGxiYSkpKQorCQlyZXR1cm4gMDsKKworCS8qIENoZWNrIHRoZSBHVUlEIFBhcnRpdGlvbiBUYWJsZSBzaWduYXR1cmUgKi8KKwlpZiAobGU2NF90b19jcHUoKCpncHQpLT5zaWduYXR1cmUpICE9IEdQVF9IRUFERVJfU0lHTkFUVVJFKSB7CisJCURwcmludGsoIkdVSUQgUGFydGl0aW9uIFRhYmxlIEhlYWRlciBzaWduYXR1cmUgaXMgd3Jvbmc6IgorCQkJIiVsbGQgIT0gJWxsZFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoKCpncHQpLT5zaWduYXR1cmUpLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylHUFRfSEVBREVSX1NJR05BVFVSRSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBDaGVjayB0aGUgR1VJRCBQYXJ0aXRpb24gVGFibGUgQ1JDICovCisJb3JpZ2NyYyA9IGxlMzJfdG9fY3B1KCgqZ3B0KS0+aGVhZGVyX2NyYzMyKTsKKwkoKmdwdCktPmhlYWRlcl9jcmMzMiA9IDA7CisJY3JjID0gZWZpX2NyYzMyKChjb25zdCB1bnNpZ25lZCBjaGFyICopICgqZ3B0KSwgbGUzMl90b19jcHUoKCpncHQpLT5oZWFkZXJfc2l6ZSkpOworCisJaWYgKGNyYyAhPSBvcmlnY3JjKSB7CisJCURwcmludGsKKwkJICAgICgiR1VJRCBQYXJ0aXRpb24gVGFibGUgSGVhZGVyIENSQyBpcyB3cm9uZzogJXggIT0gJXhcbiIsCisJCSAgICAgY3JjLCBvcmlnY3JjKTsKKwkJZ290byBmYWlsOworCX0KKwkoKmdwdCktPmhlYWRlcl9jcmMzMiA9IGNwdV90b19sZTMyKG9yaWdjcmMpOworCisJLyogQ2hlY2sgdGhhdCB0aGUgbXlfbGJhIGVudHJ5IHBvaW50cyB0byB0aGUgTEJBIHRoYXQgY29udGFpbnMKKwkgKiB0aGUgR1VJRCBQYXJ0aXRpb24gVGFibGUgKi8KKwlpZiAobGU2NF90b19jcHUoKCpncHQpLT5teV9sYmEpICE9IGxiYSkgeworCQlEcHJpbnRrKCJHUFQgbXlfbGJhIGluY29ycmVjdDogJWxsZCAhPSAlbGxkXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSgoKmdwdCktPm15X2xiYSksCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWxiYSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBDaGVjayB0aGUgZmlyc3RfdXNhYmxlX2xiYSBhbmQgbGFzdF91c2FibGVfbGJhIGFyZQorCSAqIHdpdGhpbiB0aGUgZGlzay4KKwkgKi8KKwlsYXN0bGJhID0gbGFzdF9sYmEoYmRldik7CisJaWYgKGxlNjRfdG9fY3B1KCgqZ3B0KS0+Zmlyc3RfdXNhYmxlX2xiYSkgPiBsYXN0bGJhKSB7CisJCURwcmludGsoIkdQVDogZmlyc3RfdXNhYmxlX2xiYSBpbmNvcnJlY3Q6ICVsbGQgPiAlbGxkXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSgoKmdwdCktPmZpcnN0X3VzYWJsZV9sYmEpLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0bGJhKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAobGU2NF90b19jcHUoKCpncHQpLT5sYXN0X3VzYWJsZV9sYmEpID4gbGFzdGxiYSkgeworCQlEcHJpbnRrKCJHUFQ6IGxhc3RfdXNhYmxlX2xiYSBpbmNvcnJlY3Q6ICVsbGQgPiAlbGxkXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSgoKmdwdCktPmxhc3RfdXNhYmxlX2xiYSksCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWxhc3RsYmEpOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKCEoKnB0ZXMgPSBhbGxvY19yZWFkX2dwdF9lbnRyaWVzKGJkZXYsICpncHQpKSkKKwkJZ290byBmYWlsOworCisJLyogQ2hlY2sgdGhlIEdVSUQgUGFydGl0aW9uIEVudHJ5IEFycmF5IENSQyAqLworCWNyYyA9IGVmaV9jcmMzMigoY29uc3QgdW5zaWduZWQgY2hhciAqKSAoKnB0ZXMpLAorCQkJbGUzMl90b19jcHUoKCpncHQpLT5udW1fcGFydGl0aW9uX2VudHJpZXMpICoKKwkJCWxlMzJfdG9fY3B1KCgqZ3B0KS0+c2l6ZW9mX3BhcnRpdGlvbl9lbnRyeSkpOworCisJaWYgKGNyYyAhPSBsZTMyX3RvX2NwdSgoKmdwdCktPnBhcnRpdGlvbl9lbnRyeV9hcnJheV9jcmMzMikpIHsKKwkJRHByaW50aygiR1VJRCBQYXJ0aXRpdGlvbiBFbnRyeSBBcnJheSBDUkMgY2hlY2sgZmFpbGVkLlxuIik7CisJCWdvdG8gZmFpbF9wdGVzOworCX0KKworCS8qIFdlJ3JlIGRvbmUsIGFsbCdzIHdlbGwgKi8KKwlyZXR1cm4gMTsKKworIGZhaWxfcHRlczoKKwlrZnJlZSgqcHRlcyk7CisJKnB0ZXMgPSBOVUxMOworIGZhaWw6CisJa2ZyZWUoKmdwdCk7CisJKmdwdCA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXNfcHRlX3ZhbGlkKCkgLSB0ZXN0cyBvbmUgUFRFIGZvciB2YWxpZGl0eQorICogQHB0ZSBpcyB0aGUgcHRlIHRvIGNoZWNrCisgKiBAbGFzdGxiYSBpcyBsYXN0IGxiYSBvZiB0aGUgZGlzaworICoKKyAqIERlc2NyaXB0aW9uOiByZXR1cm5zIDEgaWYgdmFsaWQsICAwIG9uIGVycm9yLgorICovCitzdGF0aWMgaW5saW5lIGludAoraXNfcHRlX3ZhbGlkKGNvbnN0IGdwdF9lbnRyeSAqcHRlLCBjb25zdCB1NjQgbGFzdGxiYSkKK3sKKwlpZiAoKCFlZmlfZ3VpZGNtcChwdGUtPnBhcnRpdGlvbl90eXBlX2d1aWQsIE5VTExfR1VJRCkpIHx8CisJICAgIGxlNjRfdG9fY3B1KHB0ZS0+c3RhcnRpbmdfbGJhKSA+IGxhc3RsYmEgICAgICAgICB8fAorCSAgICBsZTY0X3RvX2NwdShwdGUtPmVuZGluZ19sYmEpICAgPiBsYXN0bGJhKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBjb21wYXJlX2dwdHMoKSAtIFNlYXJjaCBkaXNrIGZvciB2YWxpZCBHUFQgaGVhZGVycyBhbmQgUFRFcworICogQHBncHQgaXMgdGhlIHByaW1hcnkgR1BUIGhlYWRlcgorICogQGFncHQgaXMgdGhlIGFsdGVybmF0ZSBHUFQgaGVhZGVyCisgKiBAbGFzdGxiYSBpcyB0aGUgbGFzdCBMQkEgbnVtYmVyCisgKiBEZXNjcmlwdGlvbjogUmV0dXJucyBub3RoaW5nLiAgU2FuaXR5IGNoZWNrcyBwZ3B0IGFuZCBhZ3B0IGZpZWxkcworICogYW5kIHByaW50cyB3YXJuaW5ncyBvbiBkaXNjcmVwYW5jaWVzLgorICogCisgKi8KK3N0YXRpYyB2b2lkCitjb21wYXJlX2dwdHMoZ3B0X2hlYWRlciAqcGdwdCwgZ3B0X2hlYWRlciAqYWdwdCwgdTY0IGxhc3RsYmEpCit7CisJaW50IGVycm9yX2ZvdW5kID0gMDsKKwlpZiAoIXBncHQgfHwgIWFncHQpCisJCXJldHVybjsKKwlpZiAobGU2NF90b19jcHUocGdwdC0+bXlfbGJhKSAhPSBsZTY0X3RvX2NwdShhZ3B0LT5hbHRlcm5hdGVfbGJhKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiR1BUOlByaW1hcnkgaGVhZGVyIExCQSAhPSBBbHQuIGhlYWRlciBhbHRlcm5hdGVfbGJhXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiR1BUOiVsbGQgIT0gJWxsZFxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUocGdwdC0+bXlfbGJhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShhZ3B0LT5hbHRlcm5hdGVfbGJhKSk7CisJCWVycm9yX2ZvdW5kKys7CisJfQorCWlmIChsZTY0X3RvX2NwdShwZ3B0LT5hbHRlcm5hdGVfbGJhKSAhPSBsZTY0X3RvX2NwdShhZ3B0LT5teV9sYmEpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJHUFQ6UHJpbWFyeSBoZWFkZXIgYWx0ZXJuYXRlX2xiYSAhPSBBbHQuIGhlYWRlciBteV9sYmFcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJHUFQ6JWxsZCAhPSAlbGxkXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShwZ3B0LT5hbHRlcm5hdGVfbGJhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShhZ3B0LT5teV9sYmEpKTsKKwkJZXJyb3JfZm91bmQrKzsKKwl9CisJaWYgKGxlNjRfdG9fY3B1KHBncHQtPmZpcnN0X3VzYWJsZV9sYmEpICE9CisgICAgICAgICAgICBsZTY0X3RvX2NwdShhZ3B0LT5maXJzdF91c2FibGVfbGJhKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJHUFQ6Zmlyc3RfdXNhYmxlX2xiYXMgZG9uJ3QgbWF0Y2guXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiR1BUOiVsbGQgIT0gJWxsZFxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUocGdwdC0+Zmlyc3RfdXNhYmxlX2xiYSksCisgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoYWdwdC0+Zmlyc3RfdXNhYmxlX2xiYSkpOworCQllcnJvcl9mb3VuZCsrOworCX0KKwlpZiAobGU2NF90b19jcHUocGdwdC0+bGFzdF91c2FibGVfbGJhKSAhPQorICAgICAgICAgICAgbGU2NF90b19jcHUoYWdwdC0+bGFzdF91c2FibGVfbGJhKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJHUFQ6bGFzdF91c2FibGVfbGJhcyBkb24ndCBtYXRjaC5cbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJHUFQ6JWxsZCAhPSAlbGxkXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShwZ3B0LT5sYXN0X3VzYWJsZV9sYmEpLAorICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGFncHQtPmxhc3RfdXNhYmxlX2xiYSkpOworCQllcnJvcl9mb3VuZCsrOworCX0KKwlpZiAoZWZpX2d1aWRjbXAocGdwdC0+ZGlza19ndWlkLCBhZ3B0LT5kaXNrX2d1aWQpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkdQVDpkaXNrX2d1aWRzIGRvbid0IG1hdGNoLlxuIik7CisJCWVycm9yX2ZvdW5kKys7CisJfQorCWlmIChsZTMyX3RvX2NwdShwZ3B0LT5udW1fcGFydGl0aW9uX2VudHJpZXMpICE9CisgICAgICAgICAgICBsZTMyX3RvX2NwdShhZ3B0LT5udW1fcGFydGl0aW9uX2VudHJpZXMpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkdQVDpudW1fcGFydGl0aW9uX2VudHJpZXMgZG9uJ3QgbWF0Y2g6ICIKKwkJICAgICAgICIweCV4ICE9IDB4JXhcbiIsCisJCSAgICAgICBsZTMyX3RvX2NwdShwZ3B0LT5udW1fcGFydGl0aW9uX2VudHJpZXMpLAorCQkgICAgICAgbGUzMl90b19jcHUoYWdwdC0+bnVtX3BhcnRpdGlvbl9lbnRyaWVzKSk7CisJCWVycm9yX2ZvdW5kKys7CisJfQorCWlmIChsZTMyX3RvX2NwdShwZ3B0LT5zaXplb2ZfcGFydGl0aW9uX2VudHJ5KSAhPQorICAgICAgICAgICAgbGUzMl90b19jcHUoYWdwdC0+c2l6ZW9mX3BhcnRpdGlvbl9lbnRyeSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkdQVDpzaXplb2ZfcGFydGl0aW9uX2VudHJ5IHZhbHVlcyBkb24ndCBtYXRjaDogIgorCQkgICAgICAgIjB4JXggIT0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbGUzMl90b19jcHUocGdwdC0+c2l6ZW9mX3BhcnRpdGlvbl9lbnRyeSksCisJCSAgICAgICBsZTMyX3RvX2NwdShhZ3B0LT5zaXplb2ZfcGFydGl0aW9uX2VudHJ5KSk7CisJCWVycm9yX2ZvdW5kKys7CisJfQorCWlmIChsZTMyX3RvX2NwdShwZ3B0LT5wYXJ0aXRpb25fZW50cnlfYXJyYXlfY3JjMzIpICE9CisgICAgICAgICAgICBsZTMyX3RvX2NwdShhZ3B0LT5wYXJ0aXRpb25fZW50cnlfYXJyYXlfY3JjMzIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJHUFQ6cGFydGl0aW9uX2VudHJ5X2FycmF5X2NyYzMyIHZhbHVlcyBkb24ndCBtYXRjaDogIgorCQkgICAgICAgIjB4JXggIT0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbGUzMl90b19jcHUocGdwdC0+cGFydGl0aW9uX2VudHJ5X2FycmF5X2NyYzMyKSwKKwkJICAgICAgIGxlMzJfdG9fY3B1KGFncHQtPnBhcnRpdGlvbl9lbnRyeV9hcnJheV9jcmMzMikpOworCQllcnJvcl9mb3VuZCsrOworCX0KKwlpZiAobGU2NF90b19jcHUocGdwdC0+YWx0ZXJuYXRlX2xiYSkgIT0gbGFzdGxiYSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiR1BUOlByaW1hcnkgaGVhZGVyIHRoaW5rcyBBbHQuIGhlYWRlciBpcyBub3QgYXQgdGhlIGVuZCBvZiB0aGUgZGlzay5cbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJHUFQ6JWxsZCAhPSAlbGxkXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShwZ3B0LT5hbHRlcm5hdGVfbGJhKSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdGxiYSk7CisJCWVycm9yX2ZvdW5kKys7CisJfQorCisJaWYgKGxlNjRfdG9fY3B1KGFncHQtPm15X2xiYSkgIT0gbGFzdGxiYSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiR1BUOkFsdGVybmF0ZSBHUFQgaGVhZGVyIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBkaXNrLlxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkdQVDolbGxkICE9ICVsbGRcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGFncHQtPm15X2xiYSksCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWxhc3RsYmEpOworCQllcnJvcl9mb3VuZCsrOworCX0KKworCWlmIChlcnJvcl9mb3VuZCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkdQVDogVXNlIEdOVSBQYXJ0ZWQgdG8gY29ycmVjdCBHUFQgZXJyb3JzLlxuIik7CisJcmV0dXJuOworfQorCisvKioKKyAqIGZpbmRfdmFsaWRfZ3B0KCkgLSBTZWFyY2ggZGlzayBmb3IgdmFsaWQgR1BUIGhlYWRlcnMgYW5kIFBURXMKKyAqIEBiZGV2CisgKiBAZ3B0IGlzIGEgR1BUIGhlYWRlciBwdHIsIGZpbGxlZCBvbiByZXR1cm4uCisgKiBAcHRlcyBpcyBhIFBURXMgcHRyLCBmaWxsZWQgb24gcmV0dXJuLgorICogRGVzY3JpcHRpb246IFJldHVybnMgMSBpZiB2YWxpZCwgMCBvbiBlcnJvci4KKyAqIElmIHZhbGlkLCByZXR1cm5zIHBvaW50ZXJzIHRvIG5ld2x5IGFsbG9jYXRlZCBHUFQgaGVhZGVyIGFuZCBQVEVzLgorICogVmFsaWRpdHkgZGVwZW5kcyBvbiBQTUJSIGJlaW5nIHZhbGlkIChvciBiZWluZyBvdmVycmlkZGVuIGJ5IHRoZQorICogJ2dwdCcga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24pIGFuZCBmaW5kaW5nIGVpdGhlciB0aGUgUHJpbWFyeQorICogR1BUIGhlYWRlciBhbmQgUFRFcyB2YWxpZCwgb3IgdGhlIEFsdGVybmF0ZSBHUFQgaGVhZGVyIGFuZCBQVEVzCisgKiB2YWxpZC4gIElmIHRoZSBQcmltYXJ5IEdQVCBoZWFkZXIgaXMgbm90IHZhbGlkLCB0aGUgQWx0ZXJuYXRlIEdQVCBoZWFkZXIKKyAqIGlzIG5vdCBjaGVja2VkIHVubGVzcyB0aGUgJ2dwdCcga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24gaXMgcGFzc2VkLgorICogVGhpcyBwcm90ZWN0cyBhZ2FpbnN0IGRldmljZXMgd2hpY2ggbWlzcmVwb3J0IHRoZWlyIHNpemUsIGFuZCBmb3JjZXMKKyAqIHRoZSB1c2VyIHRvIGRlY2lkZSB0byB1c2UgdGhlIEFsdGVybmF0ZSBHUFQuCisgKi8KK3N0YXRpYyBpbnQKK2ZpbmRfdmFsaWRfZ3B0KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGdwdF9oZWFkZXIgKipncHQsIGdwdF9lbnRyeSAqKnB0ZXMpCit7CisJaW50IGdvb2RfcGdwdCA9IDAsIGdvb2RfYWdwdCA9IDAsIGdvb2RfcG1iciA9IDA7CisJZ3B0X2hlYWRlciAqcGdwdCA9IE5VTEwsICphZ3B0ID0gTlVMTDsKKwlncHRfZW50cnkgKnBwdGVzID0gTlVMTCwgKmFwdGVzID0gTlVMTDsKKwlsZWdhY3lfbWJyICpsZWdhY3ltYnIgPSBOVUxMOworCXU2NCBsYXN0bGJhOworCWlmICghYmRldiB8fCAhZ3B0IHx8ICFwdGVzKQorCQlyZXR1cm4gMDsKKworCWxhc3RsYmEgPSBsYXN0X2xiYShiZGV2KTsKKyAgICAgICAgaWYgKCFmb3JjZV9ncHQpIHsKKyAgICAgICAgICAgICAgICAvKiBUaGlzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIEVGSSBTcGVjLiBwZXIgSW50ZWwgYWZ0ZXIgdjEuMDIuICovCisgICAgICAgICAgICAgICAgbGVnYWN5bWJyID0ga21hbGxvYyhzaXplb2YgKCpsZWdhY3ltYnIpLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgICAgICAgICBpZiAobGVnYWN5bWJyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQobGVnYWN5bWJyLCAwLCBzaXplb2YgKCpsZWdhY3ltYnIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfbGJhKGJkZXYsIDAsICh1OCAqKSBsZWdhY3ltYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCpsZWdhY3ltYnIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvb2RfcG1iciA9IGlzX3BtYnJfdmFsaWQobGVnYWN5bWJyLCBsYXN0bGJhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKGxlZ2FjeW1icik7CisgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3ltYnI9TlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFnb29kX3BtYnIpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworCWdvb2RfcGdwdCA9IGlzX2dwdF92YWxpZChiZGV2LCBHUFRfUFJJTUFSWV9QQVJUSVRJT05fVEFCTEVfTEJBLAorCQkJCSAmcGdwdCwgJnBwdGVzKTsKKyAgICAgICAgaWYgKGdvb2RfcGdwdCkKKwkJZ29vZF9hZ3B0ID0gaXNfZ3B0X3ZhbGlkKGJkZXYsCisJCQkJCSBsZTY0X3RvX2NwdShwZ3B0LT5hbHRlcm5hdGVfbGJhKSwKKwkJCQkJICZhZ3B0LCAmYXB0ZXMpOworICAgICAgICBpZiAoIWdvb2RfYWdwdCAmJiBmb3JjZV9ncHQpCisgICAgICAgICAgICAgICAgZ29vZF9hZ3B0ID0gaXNfZ3B0X3ZhbGlkKGJkZXYsIGxhc3RsYmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZ3B0LCAmYXB0ZXMpOworCisgICAgICAgIC8qIFRoZSBvYnZpb3VzbHkgdW5zdWNjZXNzZnVsIGNhc2UgKi8KKyAgICAgICAgaWYgKCFnb29kX3BncHQgJiYgIWdvb2RfYWdwdCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgY29tcGFyZV9ncHRzKHBncHQsIGFncHQsIGxhc3RsYmEpOworCisgICAgICAgIC8qIFRoZSBnb29kIGNhc2VzICovCisgICAgICAgIGlmIChnb29kX3BncHQpIHsKKyAgICAgICAgICAgICAgICAqZ3B0ICA9IHBncHQ7CisgICAgICAgICAgICAgICAgKnB0ZXMgPSBwcHRlczsKKyAgICAgICAgICAgICAgICBrZnJlZShhZ3B0KTsKKyAgICAgICAgICAgICAgICBrZnJlZShhcHRlcyk7CisgICAgICAgICAgICAgICAgaWYgKCFnb29kX2FncHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgCisJCQkgICAgICAgIkFsdGVybmF0ZSBHUFQgaXMgaW52YWxpZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBwcmltYXJ5IEdQVC5cbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChnb29kX2FncHQpIHsKKyAgICAgICAgICAgICAgICAqZ3B0ICA9IGFncHQ7CisgICAgICAgICAgICAgICAgKnB0ZXMgPSBhcHRlczsKKyAgICAgICAgICAgICAgICBrZnJlZShwZ3B0KTsKKyAgICAgICAgICAgICAgICBrZnJlZShwcHRlcyk7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAKKyAgICAgICAgICAgICAgICAgICAgICAgIlByaW1hcnkgR1BUIGlzIGludmFsaWQsIHVzaW5nIGFsdGVybmF0ZSBHUFQuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgZmFpbDoKKyAgICAgICAga2ZyZWUocGdwdCk7CisgICAgICAgIGtmcmVlKGFncHQpOworICAgICAgICBrZnJlZShwcHRlcyk7CisgICAgICAgIGtmcmVlKGFwdGVzKTsKKyAgICAgICAgKmdwdCA9IE5VTEw7CisgICAgICAgICpwdGVzID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogZWZpX3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQorICogQHN0YXRlCisgKiBAYmRldgorICoKKyAqIERlc2NyaXB0aW9uOiBjYWxsZWQgZnJvbSBjaGVjay5jLCBpZiB0aGUgZGlzayBjb250YWlucyBHUFQKKyAqIHBhcnRpdGlvbnMsIHNldHMgdXAgcGFydGl0aW9uIGVudHJpZXMgaW4gdGhlIGtlcm5lbC4KKyAqCisgKiBJZiB0aGUgZmlyc3QgYmxvY2sgb24gdGhlIGRpc2sgaXMgYSBsZWdhY3kgTUJSLAorICogaXQgd2lsbCBnZXQgaGFuZGxlZCBieSBtc2Rvc19wYXJ0aXRpb24oKS4KKyAqIElmIGl0J3MgYSBQcm90ZWN0aXZlIE1CUiwgd2UnbGwgaGFuZGxlIGl0IGhlcmUuCisgKgorICogV2UgZG8gbm90IGNyZWF0ZSBhIExpbnV4IHBhcnRpdGlvbiBmb3IgR1BULCBidXQKKyAqIG9ubHkgZm9yIHRoZSBhY3R1YWwgZGF0YSBwYXJ0aXRpb25zLgorICogUmV0dXJuczoKKyAqIC0xIGlmIHVuYWJsZSB0byByZWFkIHRoZSBwYXJ0aXRpb24gdGFibGUKKyAqICAwIGlmIHRoaXMgaXNuJ3Qgb3VyIHBhcnRpdGlvbiB0YWJsZQorICogIDEgaWYgc3VjY2Vzc2Z1bAorICoKKyAqLworaW50CitlZmlfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJZ3B0X2hlYWRlciAqZ3B0ID0gTlVMTDsKKwlncHRfZW50cnkgKnB0ZXMgPSBOVUxMOworCXUzMiBpOworCisJaWYgKCFmaW5kX3ZhbGlkX2dwdChiZGV2LCAmZ3B0LCAmcHRlcykgfHwgIWdwdCB8fCAhcHRlcykgeworCQlrZnJlZShncHQpOworCQlrZnJlZShwdGVzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJRHByaW50aygiR1VJRCBQYXJ0aXRpb24gVGFibGUgaXMgdmFsaWQhICBZZWEhXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZTMyX3RvX2NwdShncHQtPm51bV9wYXJ0aXRpb25fZW50cmllcykgJiYgaSA8IHN0YXRlLT5saW1pdC0xOyBpKyspIHsKKwkJaWYgKCFpc19wdGVfdmFsaWQoJnB0ZXNbaV0sIGxhc3RfbGJhKGJkZXYpKSkKKwkJCWNvbnRpbnVlOworCisJCXB1dF9wYXJ0aXRpb24oc3RhdGUsIGkrMSwgbGU2NF90b19jcHUocHRlc1tpXS5zdGFydGluZ19sYmEpLAorCQkJCSAobGU2NF90b19jcHUocHRlc1tpXS5lbmRpbmdfbGJhKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGU2NF90b19jcHUocHRlc1tpXS5zdGFydGluZ19sYmEpICsKKwkJCQkgIDFVTEwpKTsKKworCQkvKiBJZiB0aGlzIGlzIGEgUkFJRCB2b2x1bWUsIHRlbGwgbWQgKi8KKwkJaWYgKCFlZmlfZ3VpZGNtcChwdGVzW2ldLnBhcnRpdGlvbl90eXBlX2d1aWQsCisJCQkJIFBBUlRJVElPTl9MSU5VWF9SQUlEX0dVSUQpKQorCQkJc3RhdGUtPnBhcnRzW2krMV0uZmxhZ3MgPSAxOworCX0KKwlrZnJlZShwdGVzKTsKKwlrZnJlZShncHQpOworCXByaW50aygiXG4iKTsKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvZWZpLmggYi9mcy9wYXJ0aXRpb25zL2VmaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NGZiMDUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL2VmaS5oCkBAIC0wLDAgKzEsMTMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFRkkgR1VJRCBQYXJ0aXRpb24gVGFibGUKKyAqIFBlciBJbnRlbCBFRkkgU3BlY2lmaWNhdGlvbiB2MS4wMgorICogaHR0cDovL2RldmVsb3Blci5pbnRlbC5jb20vdGVjaG5vbG9neS9lZmkvZWZpLmh0bQorICoKKyAqIEJ5IE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4gIEZyaSBTZXAgMjIgMjI6MTU6NTYgQ0RUIDIwMDAgIAorICogICBDb3B5cmlnaHQgMjAwMCwyMDAxIERlbGwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGU19QQVJUX0VGSV9IX0lOQ0xVREVECisjZGVmaW5lIEZTX1BBUlRfRUZJX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisKKyNkZWZpbmUgTVNET1NfTUJSX1NJR05BVFVSRSAweGFhNTUKKyNkZWZpbmUgRUZJX1BNQlJfT1NUWVBFX0VGSSAweEVGCisjZGVmaW5lIEVGSV9QTUJSX09TVFlQRV9FRklfR1BUIDB4RUUKKworI2RlZmluZSBHUFRfQkxPQ0tfU0laRSA1MTIKKyNkZWZpbmUgR1BUX0hFQURFUl9TSUdOQVRVUkUgMHg1NDUyNDE1MDIwNDk0NjQ1VUxMCisjZGVmaW5lIEdQVF9IRUFERVJfUkVWSVNJT05fVjEgMHgwMDAxMDAwMAorI2RlZmluZSBHUFRfUFJJTUFSWV9QQVJUSVRJT05fVEFCTEVfTEJBIDEKKworI2RlZmluZSBQQVJUSVRJT05fU1lTVEVNX0dVSUQgXAorICAgIEVGSV9HVUlEKCAweEMxMkE3MzI4LCAweEY4MUYsIDB4MTFkMiwgXAorICAgICAgICAgICAgICAweEJBLCAweDRCLCAweDAwLCAweEEwLCAweEM5LCAweDNFLCAweEM5LCAweDNCKSAKKyNkZWZpbmUgTEVHQUNZX01CUl9QQVJUSVRJT05fR1VJRCBcCisgICAgRUZJX0dVSUQoIDB4MDI0REVFNDEsIDB4MzNFNywgMHgxMWQzLCBcCisgICAgICAgICAgICAgIDB4OUQsIDB4NjksIDB4MDAsIDB4MDgsIDB4QzcsIDB4ODEsIDB4RjMsIDB4OUYpCisjZGVmaW5lIFBBUlRJVElPTl9NU0ZUX1JFU0VSVkVEX0dVSUQgXAorICAgIEVGSV9HVUlEKCAweEUzQzlFMzE2LCAweDBCNUMsIDB4NERCOCwgXAorICAgICAgICAgICAgICAweDgxLCAweDdELCAweEY5LCAweDJELCAweEYwLCAweDAyLCAweDE1LCAweEFFKQorI2RlZmluZSBQQVJUSVRJT05fQkFTSUNfREFUQV9HVUlEIFwKKyAgICBFRklfR1VJRCggMHhFQkQwQTBBMiwgMHhCOUU1LCAweDQ0MzMsIFwKKyAgICAgICAgICAgICAgMHg4NywgMHhDMCwgMHg2OCwgMHhCNiwgMHhCNywgMHgyNiwgMHg5OSwgMHhDNykKKyNkZWZpbmUgUEFSVElUSU9OX0xJTlVYX1JBSURfR1VJRCBcCisgICAgRUZJX0dVSUQoIDB4YTE5ZDg4MGYsIDB4MDVmYywgMHg0ZDNiLCBcCisgICAgICAgICAgICAgIDB4YTAsIDB4MDYsIDB4NzQsIDB4M2YsIDB4MGYsIDB4ODQsIDB4OTEsIDB4MWUpCisjZGVmaW5lIFBBUlRJVElPTl9MSU5VWF9TV0FQX0dVSUQgXAorICAgIEVGSV9HVUlEKCAweDA2NTdmZDZkLCAweGE0YWIsIDB4NDNjNCwgXAorICAgICAgICAgICAgICAweDg0LCAweGU1LCAweDA5LCAweDMzLCAweGM4LCAweDRiLCAweDRmLCAweDRmKQorI2RlZmluZSBQQVJUSVRJT05fTElOVVhfTFZNX0dVSUQgXAorICAgIEVGSV9HVUlEKCAweGU2ZDZkMzc5LCAweGY1MDcsIDB4NDRjMiwgXAorICAgICAgICAgICAgICAweGEyLCAweDNjLCAweDIzLCAweDhmLCAweDJhLCAweDNkLCAweGY5LCAweDI4KQorCit0eXBlZGVmIHN0cnVjdCBfZ3B0X2hlYWRlciB7CisJX19sZTY0IHNpZ25hdHVyZTsKKwlfX2xlMzIgcmV2aXNpb247CisJX19sZTMyIGhlYWRlcl9zaXplOworCV9fbGUzMiBoZWFkZXJfY3JjMzI7CisJX19sZTMyIHJlc2VydmVkMTsKKwlfX2xlNjQgbXlfbGJhOworCV9fbGU2NCBhbHRlcm5hdGVfbGJhOworCV9fbGU2NCBmaXJzdF91c2FibGVfbGJhOworCV9fbGU2NCBsYXN0X3VzYWJsZV9sYmE7CisJZWZpX2d1aWRfdCBkaXNrX2d1aWQ7CisJX19sZTY0IHBhcnRpdGlvbl9lbnRyeV9sYmE7CisJX19sZTMyIG51bV9wYXJ0aXRpb25fZW50cmllczsKKwlfX2xlMzIgc2l6ZW9mX3BhcnRpdGlvbl9lbnRyeTsKKwlfX2xlMzIgcGFydGl0aW9uX2VudHJ5X2FycmF5X2NyYzMyOworCXU4IHJlc2VydmVkMltHUFRfQkxPQ0tfU0laRSAtIDkyXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGdwdF9oZWFkZXI7CisKK3R5cGVkZWYgc3RydWN0IF9ncHRfZW50cnlfYXR0cmlidXRlcyB7CisJdTY0IHJlcXVpcmVkX3RvX2Z1bmN0aW9uOjE7CisJdTY0IHJlc2VydmVkOjQ3OworICAgICAgICB1NjQgdHlwZV9ndWlkX3NwZWNpZmljOjE2OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZ3B0X2VudHJ5X2F0dHJpYnV0ZXM7CisKK3R5cGVkZWYgc3RydWN0IF9ncHRfZW50cnkgeworCWVmaV9ndWlkX3QgcGFydGl0aW9uX3R5cGVfZ3VpZDsKKwllZmlfZ3VpZF90IHVuaXF1ZV9wYXJ0aXRpb25fZ3VpZDsKKwlfX2xlNjQgc3RhcnRpbmdfbGJhOworCV9fbGU2NCBlbmRpbmdfbGJhOworCWdwdF9lbnRyeV9hdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7CisJZWZpX2NoYXIxNl90IHBhcnRpdGlvbl9uYW1lWzcyIC8gc2l6ZW9mIChlZmlfY2hhcjE2X3QpXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGdwdF9lbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QgX2xlZ2FjeV9tYnIgeworCXU4IGJvb3RfY29kZVs0NDBdOworCV9fbGUzMiB1bmlxdWVfbWJyX3NpZ25hdHVyZTsKKwlfX2xlMTYgdW5rbm93bjsKKwlzdHJ1Y3QgcGFydGl0aW9uIHBhcnRpdGlvbl9yZWNvcmRbNF07CisJX19sZTE2IHNpZ25hdHVyZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGxlZ2FjeV9tYnI7CisKKy8qIEZ1bmN0aW9ucyAqLworZXh0ZXJuIGludCBlZmlfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpOworCisjZW5kaWYKKworLyoKKyAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgorICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5CisgKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCisgKiBvZiB0aGUgZmlsZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWluZGVudC1sZXZlbDogNCAKKyAqIGMtYnJhY2UtaW1hZ2luYXJ5LW9mZnNldDogMAorICogYy1icmFjZS1vZmZzZXQ6IC00CisgKiBjLWFyZ2RlY2wtaW5kZW50OiA0CisgKiBjLWxhYmVsLW9mZnNldDogLTQKKyAqIGMtY29udGludWVkLXN0YXRlbWVudC1vZmZzZXQ6IDQKKyAqIGMtY29udGludWVkLWJyYWNlLW9mZnNldDogMAorICogaW5kZW50LXRhYnMtbW9kZTogbmlsCisgKiB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9pYm0uYyBiL2ZzL3BhcnRpdGlvbnMvaWJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU5ZGNiZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvaWJtLmMKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBGaWxlLi4uLi4uLi4uLi46IGxpbnV4L2ZzL3BhcnRpdGlvbnMvaWJtLmMgICAgICAKKyAqIEF1dGhvcihzKS4uLi4uLjogSG9sZ2VyIFNtb2xpbnNraSA8SG9sZ2VyLlNtb2xpbnNraUBkZS5pYm0uY29tPgorICogICAgICAgICAgICAgICAgICBWb2xrZXIgU2FtZXNrZSA8c2FtZXNrZUBkZS5pYm0uY29tPgorICogQnVncmVwb3J0cy50by4uOiA8TGludXgzOTBAZGUuaWJtLmNvbT4KKyAqIChDKSBJQk0gQ29ycG9yYXRpb24sIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCAxOTk5LDIwMDAKKworICogSGlzdG9yeSBvZiBjaGFuZ2VzIChzdGFydHMgSnVseSAyMDAwKQorICogMDcvMTAvMDAgRml4ZWQgZGV0ZWN0aW9uIG9mIENNUyBmb3JtYXR0ZWQgZGlza3MgICAgIAorICogMDIvMTMvMDAgVlRPQyBwYXJ0aXRpb24gc3VwcG9ydCBhZGRlZAorICogMTIvMjcvMDEgZml4ZWQgUEwwMzA1OTMgKENNUyByZXNlcnZlZCBtaW5pZGlzayBub3QgZGV0ZWN0ZWQgb24gNjQgYml0KQorICogMDcvMjQvMDMgbm8gbG9uZ2VyIHVzaW5nIGNvbnRlbnRzIG9mIGZyZWVkIHBhZ2UgZm9yIENNUyBsYWJlbCByZWNvZ25pdGlvbiAoQlozNjExKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9kYXNkLmg+CisjaW5jbHVkZSA8YXNtL2ViY2RpYy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3Z0b2MuaD4KKworI2luY2x1ZGUgImNoZWNrLmgiCisjaW5jbHVkZSAiaWJtLmgiCisKKy8qCisgKiBjb21wdXRlIHRoZSBibG9jayBudW1iZXIgZnJvbSBhIAorICogY3lsLWN5bC1oZWFkLWhlYWQgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitjY2hoMmJsayAoY2NoaF90ICpwdHIsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKSB7CisgICAgICAgIHJldHVybiBwdHItPmNjICogZ2VvLT5oZWFkcyAqIGdlby0+c2VjdG9ycyArCisJICAgICAgIHB0ci0+aGggKiBnZW8tPnNlY3RvcnM7Cit9CisKKworLyoKKyAqIGNvbXB1dGUgdGhlIGJsb2NrIG51bWJlciBmcm9tIGEgCisgKiBjeWwtY3lsLWhlYWQtaGVhZC1ibG9jayBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIGlubGluZSBpbnQKK2NjaGhiMmJsayAoY2NoaGJfdCAqcHRyLCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbykgeworICAgICAgICByZXR1cm4gcHRyLT5jYyAqIGdlby0+aGVhZHMgKiBnZW8tPnNlY3RvcnMgKworCQlwdHItPmhoICogZ2VvLT5zZWN0b3JzICsKKwkJcHRyLT5iOworfQorCisvKgorICovCitpbnQgCitpYm1fcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJaW50IGJsb2Nrc2l6ZSwgb2Zmc2V0LCBzaXplOworCWRhc2RfaW5mb3JtYXRpb25fdCAqaW5mbzsKKwlzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbzsKKwljaGFyIHR5cGVbNV0gPSB7MCx9OworCWNoYXIgbmFtZVs3XSA9IHswLH07CisJdm9sdW1lX2xhYmVsX3QgKnZsYWJlbDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCVNlY3RvciBzZWN0OworCisJaWYgKChpbmZvID0ga21hbGxvYyhzaXplb2YoZGFzZF9pbmZvcm1hdGlvbl90KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCWdvdG8gb3V0X25vaW5mbzsKKwlpZiAoKGdlbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBoZF9nZW9tZXRyeSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlnb3RvIG91dF9ub2dlbzsKKwlpZiAoKHZsYWJlbCA9IGttYWxsb2Moc2l6ZW9mKHZvbHVtZV9sYWJlbF90KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCWdvdG8gb3V0X25vdmxhYjsKKwkKKwlpZiAoaW9jdGxfYnlfYmRldihiZGV2LCBCSU9EQVNESU5GTywgKHVuc2lnbmVkIGxvbmcpaW5mbykgIT0gMCB8fAorCSAgICBpb2N0bF9ieV9iZGV2KGJkZXYsIEhESU9fR0VUR0VPLCAodW5zaWduZWQgbG9uZylnZW8pICE9IDApCisJCWdvdG8gb3V0X25vaW9jdGw7CisJCisJaWYgKChibG9ja3NpemUgPSBiZGV2X2hhcmRzZWN0X3NpemUoYmRldikpIDw9IDApCisJCWdvdG8gb3V0X2JhZHNlY3Q7CisKKwkvKgorCSAqIEdldCB2b2x1bWUgbGFiZWwsIGV4dHJhY3QgbmFtZSBhbmQgdHlwZS4KKwkgKi8KKwlkYXRhID0gcmVhZF9kZXZfc2VjdG9yKGJkZXYsIGluZm8tPmxhYmVsX2Jsb2NrKihibG9ja3NpemUvNTEyKSwgJnNlY3QpOworCWlmIChkYXRhID09IE5VTEwpCisJCWdvdG8gb3V0X3JlYWRlcnI7CisKKwlzdHJuY3B5ICh0eXBlLCBkYXRhLCA0KTsKKwlpZiAoKCFpbmZvLT5GQkFfbGF5b3V0KSAmJiAoIXN0cmNtcChpbmZvLT50eXBlLCAiRUNLRCIpKSkKKwkJc3RybmNweShuYW1lLCBkYXRhICsgOCwgNik7CisJZWxzZQorCQlzdHJuY3B5KG5hbWUsIGRhdGEgKyA0LCA2KTsKKwltZW1jcHkgKHZsYWJlbCwgZGF0YSwgc2l6ZW9mKHZvbHVtZV9sYWJlbF90KSk7CisJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisKKwlFQkNBU0ModHlwZSwgNCk7CisJRUJDQVNDKG5hbWUsIDYpOworCisJLyoKKwkgKiBUaHJlZSBkaWZmZXJlbnQgdHlwZXM6IENNUzEsIFZPTDEgYW5kIExOWDEvdW5sYWJlbGVkCisJICovCisJaWYgKHN0cm5jbXAodHlwZSwgIkNNUzEiLCA0KSA9PSAwKSB7CisJCS8qCisJCSAqIFZNIHN0eWxlIENNUzEgbGFiZWxlZCBkaXNrCisJCSAqLworCQlpbnQgKmxhYmVsID0gKGludCAqKSB2bGFiZWw7CisKKwkJaWYgKGxhYmVsWzEzXSAhPSAwKSB7CisJCQlwcmludGsoIkNNUzEvJThzKE1EU0spOiIsIG5hbWUpOworCQkJLyogZGlzayBpcyByZXNlcnZlZCBtaW5pZGlzayAqLworCQkJYmxvY2tzaXplID0gbGFiZWxbM107CisJCQlvZmZzZXQgPSBsYWJlbFsxM107CisJCQlzaXplID0gKGxhYmVsWzddIC0gMSkqKGJsb2Nrc2l6ZSA+PiA5KTsKKwkJfSBlbHNlIHsKKwkJCXByaW50aygiQ01TMS8lOHM6IiwgbmFtZSk7CisJCQlvZmZzZXQgPSAoaW5mby0+bGFiZWxfYmxvY2sgKyAxKTsKKwkJCXNpemUgPSBiZGV2LT5iZF9pbm9kZS0+aV9zaXplID4+IDk7CisJCX0KKwkJcHV0X3BhcnRpdGlvbihzdGF0ZSwgMSwgb2Zmc2V0KihibG9ja3NpemUgPj4gOSksCisJCQkJIHNpemUtb2Zmc2V0KihibG9ja3NpemUgPj4gOSkpOworCX0gZWxzZSBpZiAoKHN0cm5jbXAodHlwZSwgIlZPTDEiLCA0KSA9PSAwKSAmJgorCQkoIWluZm8tPkZCQV9sYXlvdXQpICYmICghc3RyY21wKGluZm8tPnR5cGUsICJFQ0tEIikpKSB7CisJCS8qCisJCSAqIE5ldyBzdHlsZSBWT0wxIGxhYmVsZWQgZGlzaworCQkgKi8KKwkJdW5zaWduZWQgaW50IGJsazsKKwkJaW50IGNvdW50ZXI7CisKKwkJcHJpbnRrKCJWT0wxLyU4czoiLCBuYW1lKTsKKworCQkvKiBnZXQgYmxvY2sgbnVtYmVyIGFuZCByZWFkIHRoZW4gZ28gdGhyb3VnaCBmb3JtYXQxIGxhYmVscyAqLworCQlibGsgPSBjY2hoYjJibGsoJnZsYWJlbC0+dnRvYywgZ2VvKSArIDE7CisJCWNvdW50ZXIgPSAwOworCQl3aGlsZSAoKGRhdGEgPSByZWFkX2Rldl9zZWN0b3IoYmRldiwgYmxrKihibG9ja3NpemUvNTEyKSwKKwkJCQkJICAgICAgICZzZWN0KSkgIT0gTlVMTCkgeworCQkJZm9ybWF0MV9sYWJlbF90IGYxOworCisJCQltZW1jcHkoJmYxLCBkYXRhLCBzaXplb2YoZm9ybWF0MV9sYWJlbF90KSk7CisJCQlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKworCQkJLyogc2tpcCBGTVQ0IC8gRk1UNSAvIEZNVDcgbGFiZWxzICovCisJCQlpZiAoZjEuRFMxRk1USUQgPT0gX2FzY2ViY1snNCddCisJCQkgICAgfHwgZjEuRFMxRk1USUQgPT0gX2FzY2ViY1snNSddCisJCQkgICAgfHwgZjEuRFMxRk1USUQgPT0gX2FzY2ViY1snNyddKSB7CisJCQkgICAgICAgIGJsaysrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBvbmx5IEZNVDEgdmFsaWQgYXQgdGhpcyBwb2ludCAqLworCQkJaWYgKGYxLkRTMUZNVElEICE9IF9hc2NlYmNbJzEnXSkKKwkJCQlicmVhazsKKworCQkJLyogT0ssIHdlIGdvdCB2YWxpZCBwYXJ0aXRpb24gZGF0YSAqLworCQkgICAgICAgIG9mZnNldCA9IGNjaGgyYmxrKCZmMS5EUzFFWFQxLmxsaW1pdCwgZ2VvKTsKKwkJCXNpemUgID0gY2NoaDJibGsoJmYxLkRTMUVYVDEudWxpbWl0LCBnZW8pIC0gCisJCQkJb2Zmc2V0ICsgZ2VvLT5zZWN0b3JzOworCQkJaWYgKGNvdW50ZXIgPj0gc3RhdGUtPmxpbWl0KQorCQkJCWJyZWFrOworCQkJcHV0X3BhcnRpdGlvbihzdGF0ZSwgY291bnRlciArIDEsIAorCQkJCQkgb2Zmc2V0ICogKGJsb2Nrc2l6ZSA+PiA5KSwKKwkJCQkJIHNpemUgKiAoYmxvY2tzaXplID4+IDkpKTsKKwkJCWNvdW50ZXIrKzsKKwkJCWJsaysrOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogT2xkIHN0eWxlIExOWDEgb3IgdW5sYWJlbGVkIGRpc2sKKwkJICovCisJCWlmIChzdHJuY21wKHR5cGUsICJMTlgxIiwgNCkgPT0gMCkKKwkJCXByaW50ayAoIkxOWDEvJThzOiIsIG5hbWUpOworCQllbHNlCisJCQlwcmludGsoIihub25sKS8lOHM6IiwgbmFtZSk7CisJCW9mZnNldCA9IChpbmZvLT5sYWJlbF9ibG9jayArIDEpOworCQlzaXplID0gKGJkZXYtPmJkX2lub2RlLT5pX3NpemUgPj4gOSk7CisJCXB1dF9wYXJ0aXRpb24oc3RhdGUsIDEsIG9mZnNldCooYmxvY2tzaXplID4+IDkpLAorCQkJCSBzaXplLW9mZnNldCooYmxvY2tzaXplID4+IDkpKTsKKwl9CisKKwlwcmludGsoIlxuIik7CisJa2ZyZWUodmxhYmVsKTsKKwlrZnJlZShnZW8pOworCWtmcmVlKGluZm8pOworCXJldHVybiAxOworCQorb3V0X3JlYWRlcnI6CitvdXRfYmFkc2VjdDoKK291dF9ub2lvY3RsOgorCWtmcmVlKHZsYWJlbCk7CitvdXRfbm92bGFiOgorCWtmcmVlKGdlbyk7CitvdXRfbm9nZW86CisJa2ZyZWUoaW5mbyk7CitvdXRfbm9pbmZvOgorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9pYm0uaCBiL2ZzL3BhcnRpdGlvbnMvaWJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFmODVhNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvaWJtLmgKQEAgLTAsMCArMSBAQAoraW50IGlibV9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICosIHN0cnVjdCBibG9ja19kZXZpY2UgKik7CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2xkbS5jIGIvZnMvcGFydGl0aW9ucy9sZG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWIxYzExCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcGFydGl0aW9ucy9sZG0uYwpAQCAtMCwwICsxLDE0ODMgQEAKKy8qKgorICogbGRtIC0gU3VwcG9ydCBmb3IgV2luZG93cyBMb2dpY2FsIERpc2sgTWFuYWdlciAoRHluYW1pYyBEaXNrcykKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiBSaWNoYXJkIFJ1c3NvbiA8bGRtQGZsYXRjYXAub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiBKYWtvYiBLZW1pIDxqYWtvYi5rZW1pQHRlbGlhLmNvbT4KKyAqCisgKiBEb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vbGludXgtbnRmcy5zZi5uZXQvbGRtCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorICogdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBzb3VyY2UgaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmCisgKiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisjaW5jbHVkZSAibGRtLmgiCisjaW5jbHVkZSAiY2hlY2suaCIKKyNpbmNsdWRlICJtc2Rvcy5oIgorCit0eXBlZGVmIGVudW0geworCUZBTFNFID0gMCwKKwlUUlVFICA9IDEKK30gQk9PTDsKKworLyoqCisgKiBsZG1fZGVidWcvaW5mby9lcnJvci9jcml0IC0gT3V0cHV0IGFuIGVycm9yIG1lc3NhZ2UKKyAqIEBmOiAgICBBIHByaW50ZiBmb3JtYXQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UKKyAqIEAuLi46ICBWYXJpYWJsZXMgdG8gc3Vic3RpdHV0ZSBpbnRvIEBmCisgKgorICogbGRtX2RlYnVnKCkgd3JpdGVzIGEgREVCVUcgbGV2ZWwgbWVzc2FnZSB0byB0aGUgc3lzbG9nIGJ1dCBvbmx5IGlmIHRoZQorICogZHJpdmVyIHdhcyBjb21waWxlZCB3aXRoIGRlYnVnIGVuYWJsZWQuIE90aGVyd2lzZSwgdGhlIGNhbGwgdHVybnMgaW50byBhIE5PUC4KKyAqLworI2lmbmRlZiBDT05GSUdfTERNX0RFQlVHCisjZGVmaW5lIGxkbV9kZWJ1ZyguLi4pCWRvIHt9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgbGRtX2RlYnVnKGYsIGEuLi4pIF9sZG1fcHJpbnRrIChLRVJOX0RFQlVHLCBfX0ZVTkNUSU9OX18sIGYsICMjYSkKKyNlbmRpZgorCisjZGVmaW5lIGxkbV9jcml0KGYsIGEuLi4pICBfbGRtX3ByaW50ayAoS0VSTl9DUklULCAgX19GVU5DVElPTl9fLCBmLCAjI2EpCisjZGVmaW5lIGxkbV9lcnJvcihmLCBhLi4uKSBfbGRtX3ByaW50ayAoS0VSTl9FUlIsICAgX19GVU5DVElPTl9fLCBmLCAjI2EpCisjZGVmaW5lIGxkbV9pbmZvKGYsIGEuLi4pICBfbGRtX3ByaW50ayAoS0VSTl9JTkZPLCAgX19GVU5DVElPTl9fLCBmLCAjI2EpCisKK19fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKQorc3RhdGljIHZvaWQgX2xkbV9wcmludGsgKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKKwkJCSBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlzdGF0aWMgY2hhciBidWZbMTI4XTsKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydCAoYXJncywgZm10KTsKKwl2c25wcmludGYgKGJ1Ziwgc2l6ZW9mIChidWYpLCBmbXQsIGFyZ3MpOworCXZhX2VuZCAoYXJncyk7CisKKwlwcmludGsgKCIlcyVzKCk6ICVzXG4iLCBsZXZlbCwgZnVuY3Rpb24sIGJ1Zik7Cit9CisKKworLyoqCisgKiBsZG1fcGFyc2VfaGV4Ynl0ZSAtIENvbnZlcnQgYSBBU0NJSSBoZXggbnVtYmVyIHRvIGEgYnl0ZQorICogQHNyYzogIFBvaW50ZXIgdG8gYXQgbGVhc3QgMiBjaGFyYWN0ZXJzIHRvIGNvbnZlcnQuCisgKgorICogQ29udmVydCBhIHR3byBjaGFyYWN0ZXIgQVNDSUkgaGV4IHN0cmluZyB0byBhIG51bWJlci4KKyAqCisgKiBSZXR1cm46ICAwLTI1NSAgU3VjY2VzcywgdGhlIGJ5dGUgd2FzIHBhcnNlZCBjb3JyZWN0bHkKKyAqICAgICAgICAgIC0xICAgICBFcnJvciwgYW4gaW52YWxpZCBjaGFyYWN0ZXIgd2FzIHN1cHBsaWVkCisgKi8KK3N0YXRpYyBpbnQgbGRtX3BhcnNlX2hleGJ5dGUgKGNvbnN0IHU4ICpzcmMpCit7CisJdW5zaWduZWQgaW50IHg7CQkvKiBGb3IgY29ycmVjdCB3cmFwcGluZyAqLworCWludCBoOworCisJLyogaGlnaCBwYXJ0ICovCisJaWYgICAgICAoKHggPSBzcmNbMF0gLSAnMCcpIDw9ICc5Jy0nMCcpIGggPSB4OworCWVsc2UgaWYgKCh4ID0gc3JjWzBdIC0gJ2EnKSA8PSAnZictJ2EnKSBoID0geCsxMDsKKwllbHNlIGlmICgoeCA9IHNyY1swXSAtICdBJykgPD0gJ0YnLSdBJykgaCA9IHgrMTA7CisJZWxzZSByZXR1cm4gLTE7CisJaCA8PD0gNDsKKworCS8qIGxvdyBwYXJ0ICovCisJaWYgKCh4ID0gc3JjWzFdIC0gJzAnKSA8PSAnOSctJzAnKSByZXR1cm4gaCB8IHg7CisJaWYgKCh4ID0gc3JjWzFdIC0gJ2EnKSA8PSAnZictJ2EnKSByZXR1cm4gaCB8ICh4KzEwKTsKKwlpZiAoKHggPSBzcmNbMV0gLSAnQScpIDw9ICdGJy0nQScpIHJldHVybiBoIHwgKHgrMTApOworCXJldHVybiAtMTsKK30KKworLyoqCisgKiBsZG1fcGFyc2VfZ3VpZCAtIENvbnZlcnQgR1VJRCBmcm9tIEFTQ0lJIHRvIGJpbmFyeQorICogQHNyYzogICAzNiBjaGFyIHN0cmluZyBvZiB0aGUgZm9ybSBmYTUwZmYyYi1mMmU4LTQ1ZGUtODNmYS02NTQxN2YyZjQ5YmEKKyAqIEBkZXN0OiAgTWVtb3J5IGJsb2NrIHRvIGhvbGQgYmluYXJ5IEdVSUQgKDE2IGJ5dGVzKQorICoKKyAqIE4uQi4gVGhlIEdVSUQgbmVlZCBub3QgYmUgTlVMTCB0ZXJtaW5hdGVkLgorICoKKyAqIFJldHVybjogIFRSVUUgICBAZGVzdCBjb250YWlucyBiaW5hcnkgR1VJRAorICogICAgICAgICAgRkFMU0UgIEBkZXN0IGNvbnRlbnRzIGFyZSB1bmRlZmluZWQKKyAqLworc3RhdGljIEJPT0wgbGRtX3BhcnNlX2d1aWQgKGNvbnN0IHU4ICpzcmMsIHU4ICpkZXN0KQoreworCXN0YXRpYyBjb25zdCBpbnQgc2l6ZVtdID0geyA0LCAyLCAyLCAyLCA2IH07CisJaW50IGksIGosIHY7CisKKwlpZiAoc3JjWzhdICAhPSAnLScgfHwgc3JjWzEzXSAhPSAnLScgfHwKKwkgICAgc3JjWzE4XSAhPSAnLScgfHwgc3JjWzIzXSAhPSAnLScpCisJCXJldHVybiBGQUxTRTsKKworCWZvciAoaiA9IDA7IGogPCA1OyBqKyssIHNyYysrKQorCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZVtqXTsgaSsrLCBzcmMrPTIsICpkZXN0KysgPSB2KQorCQkJaWYgKCh2ID0gbGRtX3BhcnNlX2hleGJ5dGUgKHNyYykpIDwgMCkKKwkJCQlyZXR1cm4gRkFMU0U7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisvKioKKyAqIGxkbV9wYXJzZV9wcml2aGVhZCAtIFJlYWQgdGhlIExETSBEYXRhYmFzZSBQUklWSEVBRCBzdHJ1Y3R1cmUKKyAqIEBkYXRhOiAgUmF3IGRhdGFiYXNlIFBSSVZIRUFEIHN0cnVjdHVyZSBsb2FkZWQgZnJvbSB0aGUgZGV2aWNlCisgKiBAcGg6ICAgIEluLW1lbW9yeSBwcml2aGVhZCBzdHJ1Y3R1cmUgaW4gd2hpY2ggdG8gcmV0dXJuIHBhcnNlZCBpbmZvcm1hdGlvbgorICoKKyAqIFRoaXMgcGFyc2VzIHRoZSBMRE0gZGF0YWJhc2UgUFJJVkhFQUQgc3RydWN0dXJlIHN1cHBsaWVkIGluIEBkYXRhIGFuZAorICogc2V0cyB1cCB0aGUgaW4tbWVtb3J5IHByaXZoZWFkIHN0cnVjdHVyZSBAcGggd2l0aCB0aGUgb2J0YWluZWQgaW5mb3JtYXRpb24uCisgKgorICogUmV0dXJuOiAgVFJVRSAgIEBwaCBjb250YWlucyB0aGUgUFJJVkhFQUQgZGF0YQorICogICAgICAgICAgRkFMU0UgIEBwaCBjb250ZW50cyBhcmUgdW5kZWZpbmVkCisgKi8KK3N0YXRpYyBCT09MIGxkbV9wYXJzZV9wcml2aGVhZCAoY29uc3QgdTggKmRhdGEsIHN0cnVjdCBwcml2aGVhZCAqcGgpCit7CisJQlVHX09OICghZGF0YSB8fCAhcGgpOworCisJaWYgKE1BR0lDX1BSSVZIRUFEICE9IEJFNjQgKGRhdGEpKSB7CisJCWxkbV9lcnJvciAoIkNhbm5vdCBmaW5kIFBSSVZIRUFEIHN0cnVjdHVyZS4gTERNIGRhdGFiYXNlIGlzIgorCQkJIiBjb3JydXB0LiBBYm9ydGluZy4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXBoLT52ZXJfbWFqb3IgICAgICAgICAgPSBCRTE2IChkYXRhICsgMHgwMDBDKTsKKwlwaC0+dmVyX21pbm9yICAgICAgICAgID0gQkUxNiAoZGF0YSArIDB4MDAwRSk7CisJcGgtPmxvZ2ljYWxfZGlza19zdGFydCA9IEJFNjQgKGRhdGEgKyAweDAxMUIpOworCXBoLT5sb2dpY2FsX2Rpc2tfc2l6ZSAgPSBCRTY0IChkYXRhICsgMHgwMTIzKTsKKwlwaC0+Y29uZmlnX3N0YXJ0ICAgICAgID0gQkU2NCAoZGF0YSArIDB4MDEyQik7CisJcGgtPmNvbmZpZ19zaXplICAgICAgICA9IEJFNjQgKGRhdGEgKyAweDAxMzMpOworCisJaWYgKChwaC0+dmVyX21ham9yICE9IDIpIHx8IChwaC0+dmVyX21pbm9yICE9IDExKSkgeworCQlsZG1fZXJyb3IgKCJFeHBlY3RlZCBQUklWSEVBRCB2ZXJzaW9uICVkLiVkLCBnb3QgJWQuJWQuIgorCQkJIiBBYm9ydGluZy4iLCAyLCAxMSwgcGgtPnZlcl9tYWpvciwgcGgtPnZlcl9taW5vcik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJaWYgKHBoLT5jb25maWdfc2l6ZSAhPSBMRE1fREJfU0laRSkgewkvKiAxIE1pQiBpbiBzZWN0b3JzLiAqLworCQkvKiBXYXJuIHRoZSB1c2VyIGFuZCBjb250aW51ZSwgY2FyZWZ1bGx5ICovCisJCWxkbV9pbmZvICgiRGF0YWJhc2UgaXMgbm9ybWFsbHkgJXUgYnl0ZXMsIGl0IGNsYWltcyB0byAiCisJCQkiYmUgJWxsdSBieXRlcy4iLCBMRE1fREJfU0laRSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGgtPmNvbmZpZ19zaXplICk7CisJfQorCWlmICgocGgtPmxvZ2ljYWxfZGlza19zaXplID09IDApIHx8CisJICAgIChwaC0+bG9naWNhbF9kaXNrX3N0YXJ0ICsgcGgtPmxvZ2ljYWxfZGlza19zaXplID4gcGgtPmNvbmZpZ19zdGFydCkpIHsKKwkJbGRtX2Vycm9yICgiUFJJVkhFQUQgZGlzayBzaXplIGRvZXNuJ3QgbWF0Y2ggcmVhbCBkaXNrIHNpemUiKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmICghbGRtX3BhcnNlX2d1aWQgKGRhdGEgKyAweDAwMzAsIHBoLT5kaXNrX2lkKSkgeworCQlsZG1fZXJyb3IgKCJQUklWSEVBRCBjb250YWlucyBhbiBpbnZhbGlkIEdVSUQuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlsZG1fZGVidWcgKCJQYXJzZWQgUFJJVkhFQUQgc3VjY2Vzc2Z1bGx5LiIpOworCXJldHVybiBUUlVFOworfQorCisvKioKKyAqIGxkbV9wYXJzZV90b2NibG9jayAtIFJlYWQgdGhlIExETSBEYXRhYmFzZSBUT0NCTE9DSyBzdHJ1Y3R1cmUKKyAqIEBkYXRhOiAgUmF3IGRhdGFiYXNlIFRPQ0JMT0NLIHN0cnVjdHVyZSBsb2FkZWQgZnJvbSB0aGUgZGV2aWNlCisgKiBAdG9jOiAgIEluLW1lbW9yeSB0b2Mgc3RydWN0dXJlIGluIHdoaWNoIHRvIHJldHVybiBwYXJzZWQgaW5mb3JtYXRpb24KKyAqCisgKiBUaGlzIHBhcnNlcyB0aGUgTERNIERhdGFiYXNlIFRPQ0JMT0NLICh0YWJsZSBvZiBjb250ZW50cykgc3RydWN0dXJlIHN1cHBsaWVkCisgKiBpbiBAZGF0YSBhbmQgc2V0cyB1cCB0aGUgaW4tbWVtb3J5IHRvY2Jsb2NrIHN0cnVjdHVyZSBAdG9jIHdpdGggdGhlIG9idGFpbmVkCisgKiBpbmZvcm1hdGlvbi4KKyAqCisgKiBOLkIuICBUaGUgKl9zdGFydCBhbmQgKl9zaXplIHZhbHVlcyByZXR1cm5lZCBpbiBAdG9jIGFyZSBub3QgcmFuZ2UtY2hlY2tlZC4KKyAqCisgKiBSZXR1cm46ICBUUlVFICAgQHRvYyBjb250YWlucyB0aGUgVE9DQkxPQ0sgZGF0YQorICogICAgICAgICAgRkFMU0UgIEB0b2MgY29udGVudHMgYXJlIHVuZGVmaW5lZAorICovCitzdGF0aWMgQk9PTCBsZG1fcGFyc2VfdG9jYmxvY2sgKGNvbnN0IHU4ICpkYXRhLCBzdHJ1Y3QgdG9jYmxvY2sgKnRvYykKK3sKKwlCVUdfT04gKCFkYXRhIHx8ICF0b2MpOworCisJaWYgKE1BR0lDX1RPQ0JMT0NLICE9IEJFNjQgKGRhdGEpKSB7CisJCWxkbV9jcml0ICgiQ2Fubm90IGZpbmQgVE9DQkxPQ0ssIGRhdGFiYXNlIG1heSBiZSBjb3JydXB0LiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXN0cm5jcHkgKHRvYy0+Yml0bWFwMV9uYW1lLCBkYXRhICsgMHgyNCwgc2l6ZW9mICh0b2MtPmJpdG1hcDFfbmFtZSkpOworCXRvYy0+Yml0bWFwMV9uYW1lW3NpemVvZiAodG9jLT5iaXRtYXAxX25hbWUpIC0gMV0gPSAwOworCXRvYy0+Yml0bWFwMV9zdGFydCA9IEJFNjQgKGRhdGEgKyAweDJFKTsKKwl0b2MtPmJpdG1hcDFfc2l6ZSAgPSBCRTY0IChkYXRhICsgMHgzNik7CisKKwlpZiAoc3RybmNtcCAodG9jLT5iaXRtYXAxX25hbWUsIFRPQ19CSVRNQVAxLAorCQkJc2l6ZW9mICh0b2MtPmJpdG1hcDFfbmFtZSkpICE9IDApIHsKKwkJbGRtX2NyaXQgKCJUT0NCTE9DSydzIGZpcnN0IGJpdG1hcCBpcyAnJXMnLCBzaG91bGQgYmUgJyVzJy4iLAorCQkJCVRPQ19CSVRNQVAxLCB0b2MtPmJpdG1hcDFfbmFtZSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJc3RybmNweSAodG9jLT5iaXRtYXAyX25hbWUsIGRhdGEgKyAweDQ2LCBzaXplb2YgKHRvYy0+Yml0bWFwMl9uYW1lKSk7CisJdG9jLT5iaXRtYXAyX25hbWVbc2l6ZW9mICh0b2MtPmJpdG1hcDJfbmFtZSkgLSAxXSA9IDA7CisJdG9jLT5iaXRtYXAyX3N0YXJ0ID0gQkU2NCAoZGF0YSArIDB4NTApOworCXRvYy0+Yml0bWFwMl9zaXplICA9IEJFNjQgKGRhdGEgKyAweDU4KTsKKwlpZiAoc3RybmNtcCAodG9jLT5iaXRtYXAyX25hbWUsIFRPQ19CSVRNQVAyLAorCQkJc2l6ZW9mICh0b2MtPmJpdG1hcDJfbmFtZSkpICE9IDApIHsKKwkJbGRtX2NyaXQgKCJUT0NCTE9DSydzIHNlY29uZCBiaXRtYXAgaXMgJyVzJywgc2hvdWxkIGJlICclcycuIiwKKwkJCQlUT0NfQklUTUFQMiwgdG9jLT5iaXRtYXAyX25hbWUpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWxkbV9kZWJ1ZyAoIlBhcnNlZCBUT0NCTE9DSyBzdWNjZXNzZnVsbHkuIik7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogbGRtX3BhcnNlX3ZtZGIgLSBSZWFkIHRoZSBMRE0gRGF0YWJhc2UgVk1EQiBzdHJ1Y3R1cmUKKyAqIEBkYXRhOiAgUmF3IGRhdGFiYXNlIFZNREIgc3RydWN0dXJlIGxvYWRlZCBmcm9tIHRoZSBkZXZpY2UKKyAqIEB2bTogICAgSW4tbWVtb3J5IHZtZGIgc3RydWN0dXJlIGluIHdoaWNoIHRvIHJldHVybiBwYXJzZWQgaW5mb3JtYXRpb24KKyAqCisgKiBUaGlzIHBhcnNlcyB0aGUgTERNIERhdGFiYXNlIFZNREIgc3RydWN0dXJlIHN1cHBsaWVkIGluIEBkYXRhIGFuZCBzZXRzIHVwCisgKiB0aGUgaW4tbWVtb3J5IHZtZGIgc3RydWN0dXJlIEB2bSB3aXRoIHRoZSBvYnRhaW5lZCBpbmZvcm1hdGlvbi4KKyAqCisgKiBOLkIuICBUaGUgKl9zdGFydCwgKl9zaXplIGFuZCAqX3NlcSB2YWx1ZXMgd2lsbCBiZSByYW5nZS1jaGVja2VkIGxhdGVyLgorICoKKyAqIFJldHVybjogIFRSVUUgICBAdm0gY29udGFpbnMgVk1EQiBpbmZvCisgKiAgICAgICAgICBGQUxTRSAgQHZtIGNvbnRlbnRzIGFyZSB1bmRlZmluZWQKKyAqLworc3RhdGljIEJPT0wgbGRtX3BhcnNlX3ZtZGIgKGNvbnN0IHU4ICpkYXRhLCBzdHJ1Y3Qgdm1kYiAqdm0pCit7CisJQlVHX09OICghZGF0YSB8fCAhdm0pOworCisJaWYgKE1BR0lDX1ZNREIgIT0gQkUzMiAoZGF0YSkpIHsKKwkJbGRtX2NyaXQgKCJDYW5ub3QgZmluZCB0aGUgVk1EQiwgZGF0YWJhc2UgbWF5IGJlIGNvcnJ1cHQuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwl2bS0+dmVyX21ham9yID0gQkUxNiAoZGF0YSArIDB4MTIpOworCXZtLT52ZXJfbWlub3IgPSBCRTE2IChkYXRhICsgMHgxNCk7CisJaWYgKCh2bS0+dmVyX21ham9yICE9IDQpIHx8ICh2bS0+dmVyX21pbm9yICE9IDEwKSkgeworCQlsZG1fZXJyb3IgKCJFeHBlY3RlZCBWTURCIHZlcnNpb24gJWQuJWQsIGdvdCAlZC4lZC4gIgorCQkJIkFib3J0aW5nLiIsIDQsIDEwLCB2bS0+dmVyX21ham9yLCB2bS0+dmVyX21pbm9yKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXZtLT52YmxrX3NpemUgICAgID0gQkUzMiAoZGF0YSArIDB4MDgpOworCXZtLT52YmxrX29mZnNldCAgID0gQkUzMiAoZGF0YSArIDB4MEMpOworCXZtLT5sYXN0X3ZibGtfc2VxID0gQkUzMiAoZGF0YSArIDB4MDQpOworCisJbGRtX2RlYnVnICgiUGFyc2VkIFZNREIgc3VjY2Vzc2Z1bGx5LiIpOworCXJldHVybiBUUlVFOworfQorCisvKioKKyAqIGxkbV9jb21wYXJlX3ByaXZoZWFkcyAtIENvbXBhcmUgdHdvIHByaXZoZWFkIG9iamVjdHMKKyAqIEBwaDE6ICBGaXJzdCBwcml2aGVhZAorICogQHBoMjogIFNlY29uZCBwcml2aGVhZAorICoKKyAqIFRoaXMgY29tcGFyZXMgdGhlIHR3byBwcml2aGVhZCBzdHJ1Y3R1cmVzIEBwaDEgYW5kIEBwaDIuCisgKgorICogUmV0dXJuOiAgVFJVRSAgIElkZW50aWNhbAorICogICAgICAgICAgRkFMU0UgIERpZmZlcmVudAorICovCitzdGF0aWMgQk9PTCBsZG1fY29tcGFyZV9wcml2aGVhZHMgKGNvbnN0IHN0cnVjdCBwcml2aGVhZCAqcGgxLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBwcml2aGVhZCAqcGgyKQoreworCUJVR19PTiAoIXBoMSB8fCAhcGgyKTsKKworCXJldHVybiAoKHBoMS0+dmVyX21ham9yICAgICAgICAgID09IHBoMi0+dmVyX21ham9yKQkJJiYKKwkJKHBoMS0+dmVyX21pbm9yICAgICAgICAgID09IHBoMi0+dmVyX21pbm9yKQkJJiYKKwkJKHBoMS0+bG9naWNhbF9kaXNrX3N0YXJ0ID09IHBoMi0+bG9naWNhbF9kaXNrX3N0YXJ0KQkmJgorCQkocGgxLT5sb2dpY2FsX2Rpc2tfc2l6ZSAgPT0gcGgyLT5sb2dpY2FsX2Rpc2tfc2l6ZSkJJiYKKwkJKHBoMS0+Y29uZmlnX3N0YXJ0ICAgICAgID09IHBoMi0+Y29uZmlnX3N0YXJ0KQkJJiYKKwkJKHBoMS0+Y29uZmlnX3NpemUgICAgICAgID09IHBoMi0+Y29uZmlnX3NpemUpCQkmJgorCQkhbWVtY21wIChwaDEtPmRpc2tfaWQsIHBoMi0+ZGlza19pZCwgR1VJRF9TSVpFKSk7Cit9CisKKy8qKgorICogbGRtX2NvbXBhcmVfdG9jYmxvY2tzIC0gQ29tcGFyZSB0d28gdG9jYmxvY2sgb2JqZWN0cworICogQHRvYzE6ICBGaXJzdCB0b2MKKyAqIEB0b2MyOiAgU2Vjb25kIHRvYworICoKKyAqIFRoaXMgY29tcGFyZXMgdGhlIHR3byB0b2NibG9jayBzdHJ1Y3R1cmVzIEB0b2MxIGFuZCBAdG9jMi4KKyAqCisgKiBSZXR1cm46ICBUUlVFICAgSWRlbnRpY2FsCisgKiAgICAgICAgICBGQUxTRSAgRGlmZmVyZW50CisgKi8KK3N0YXRpYyBCT09MIGxkbV9jb21wYXJlX3RvY2Jsb2NrcyAoY29uc3Qgc3RydWN0IHRvY2Jsb2NrICp0b2MxLAorCQkJCSAgIGNvbnN0IHN0cnVjdCB0b2NibG9jayAqdG9jMikKK3sKKwlCVUdfT04gKCF0b2MxIHx8ICF0b2MyKTsKKworCXJldHVybiAoKHRvYzEtPmJpdG1hcDFfc3RhcnQgPT0gdG9jMi0+Yml0bWFwMV9zdGFydCkJJiYKKwkJKHRvYzEtPmJpdG1hcDFfc2l6ZSAgPT0gdG9jMi0+Yml0bWFwMV9zaXplKQkmJgorCQkodG9jMS0+Yml0bWFwMl9zdGFydCA9PSB0b2MyLT5iaXRtYXAyX3N0YXJ0KQkmJgorCQkodG9jMS0+Yml0bWFwMl9zaXplICA9PSB0b2MyLT5iaXRtYXAyX3NpemUpCSYmCisJCSFzdHJuY21wICh0b2MxLT5iaXRtYXAxX25hbWUsIHRvYzItPmJpdG1hcDFfbmFtZSwKKwkJCXNpemVvZiAodG9jMS0+Yml0bWFwMV9uYW1lKSkJCSYmCisJCSFzdHJuY21wICh0b2MxLT5iaXRtYXAyX25hbWUsIHRvYzItPmJpdG1hcDJfbmFtZSwKKwkJCXNpemVvZiAodG9jMS0+Yml0bWFwMl9uYW1lKSkpOworfQorCisvKioKKyAqIGxkbV92YWxpZGF0ZV9wcml2aGVhZHMgLSBDb21wYXJlIHRoZSBwcmltYXJ5IHByaXZoZWFkIHdpdGggaXRzIGJhY2t1cHMKKyAqIEBiZGV2OiAgRGV2aWNlIGhvbGRpbmcgdGhlIExETSBEYXRhYmFzZQorICogQHBoMTogICBNZW1vcnkgc3RydWN0IHRvIGZpbGwgd2l0aCBwaCBjb250ZW50cworICoKKyAqIFJlYWQgYW5kIGNvbXBhcmUgYWxsIHRocmVlIHByaXZoZWFkcyBmcm9tIGRpc2suCisgKgorICogVGhlIHByaXZoZWFkcyBvbiBkaXNrIHNob3cgdGhlIHNpemUgYW5kIGxvY2F0aW9uIG9mIHRoZSBtYWluIGRpc2sgYXJlYSBhbmQKKyAqIHRoZSBjb25maWd1cmF0aW9uIGFyZWEgKHRoZSBkYXRhYmFzZSkuICBUaGUgdmFsdWVzIGFyZSByYW5nZS1jaGVja2VkIGFnYWluc3QKKyAqIEBoZCwgd2hpY2ggY29udGFpbnMgdGhlIHJlYWwgc2l6ZSBvZiB0aGUgZGlzay4KKyAqCisgKiBSZXR1cm46ICBUUlVFICAgU3VjY2VzcworICogICAgICAgICAgRkFMU0UgIEVycm9yCisgKi8KK3N0YXRpYyBCT09MIGxkbV92YWxpZGF0ZV9wcml2aGVhZHMgKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCQkJICAgIHN0cnVjdCBwcml2aGVhZCAqcGgxKQoreworCXN0YXRpYyBjb25zdCBpbnQgb2ZmWzNdID0geyBPRkZfUFJJVjEsIE9GRl9QUklWMiwgT0ZGX1BSSVYzIH07CisJc3RydWN0IHByaXZoZWFkICpwaFszXSA9IHsgcGgxIH07CisJU2VjdG9yIHNlY3Q7CisJdTggKmRhdGE7CisJQk9PTCByZXN1bHQgPSBGQUxTRTsKKwlsb25nIG51bV9zZWN0czsKKwlpbnQgaTsKKworCUJVR19PTiAoIWJkZXYgfHwgIXBoMSk7CisKKwlwaFsxXSA9IGttYWxsb2MgKHNpemVvZiAoKnBoWzFdKSwgR0ZQX0tFUk5FTCk7CisJcGhbMl0gPSBrbWFsbG9jIChzaXplb2YgKCpwaFsyXSksIEdGUF9LRVJORUwpOworCWlmICghcGhbMV0gfHwgIXBoWzJdKSB7CisJCWxkbV9jcml0ICgiT3V0IG9mIG1lbW9yeS4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogb2ZmWzEgJiAyXSBhcmUgcmVsYXRpdmUgdG8gcGhbMF0tPmNvbmZpZ19zdGFydCAqLworCXBoWzBdLT5jb25maWdfc3RhcnQgPSAwOworCisJLyogUmVhZCBhbmQgcGFyc2UgcHJpdmhlYWRzICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlkYXRhID0gcmVhZF9kZXZfc2VjdG9yIChiZGV2LAorCQkJcGhbMF0tPmNvbmZpZ19zdGFydCArIG9mZltpXSwgJnNlY3QpOworCQlpZiAoIWRhdGEpIHsKKwkJCWxkbV9jcml0ICgiRGlzayByZWFkIGZhaWxlZC4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJlc3VsdCA9IGxkbV9wYXJzZV9wcml2aGVhZCAoZGF0YSwgcGhbaV0pOworCQlwdXRfZGV2X3NlY3RvciAoc2VjdCk7CisJCWlmICghcmVzdWx0KSB7CisJCQlsZG1fZXJyb3IgKCJDYW5ub3QgZmluZCBQUklWSEVBRCAlZC4iLCBpKzEpOyAvKiBMb2cgYWdhaW4gKi8KKwkJCWlmIChpIDwgMikKKwkJCQlnb3RvIG91dDsJLyogQWxyZWFkeSBsb2dnZWQgKi8KKwkJCWVsc2UKKwkJCQlicmVhazsJLyogRklYTUUgaWdub3JlIGZvciBub3csIDNyZCBQSCBjYW4gZmFpbCBvbiBvZGQtc2l6ZWQgZGlza3MgKi8KKwkJfQorCX0KKworCW51bV9zZWN0cyA9IGJkZXYtPmJkX2lub2RlLT5pX3NpemUgPj4gOTsKKworCWlmICgocGhbMF0tPmNvbmZpZ19zdGFydCA+IG51bV9zZWN0cykgfHwKKwkgICAoKHBoWzBdLT5jb25maWdfc3RhcnQgKyBwaFswXS0+Y29uZmlnX3NpemUpID4gbnVtX3NlY3RzKSkgeworCQlsZG1fY3JpdCAoIkRhdGFiYXNlIGV4dGVuZHMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGRpc2suIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgocGhbMF0tPmxvZ2ljYWxfZGlza19zdGFydCA+IHBoWzBdLT5jb25maWdfc3RhcnQpIHx8CisJICAgKChwaFswXS0+bG9naWNhbF9kaXNrX3N0YXJ0ICsgcGhbMF0tPmxvZ2ljYWxfZGlza19zaXplKQorCQkgICAgPiBwaFswXS0+Y29uZmlnX3N0YXJ0KSkgeworCQlsZG1fY3JpdCAoIkRpc2sgYW5kIGRhdGFiYXNlIG92ZXJsYXAuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghbGRtX2NvbXBhcmVfcHJpdmhlYWRzIChwaFswXSwgcGhbMV0pKSB7CisJCWxkbV9jcml0ICgiUHJpbWFyeSBhbmQgYmFja3VwIFBSSVZIRUFEcyBkb24ndCBtYXRjaC4iKTsKKwkJZ290byBvdXQ7CisJfQorCS8qIEZJWE1FIGlnbm9yZSB0aGlzIGZvciBub3cKKwlpZiAoIWxkbV9jb21wYXJlX3ByaXZoZWFkcyAocGhbMF0sIHBoWzJdKSkgeworCQlsZG1fY3JpdCAoIlByaW1hcnkgYW5kIGJhY2t1cCBQUklWSEVBRHMgZG9uJ3QgbWF0Y2guIik7CisJCWdvdG8gb3V0OworCX0qLworCWxkbV9kZWJ1ZyAoIlZhbGlkYXRlZCBQUklWSEVBRHMgc3VjY2Vzc2Z1bGx5LiIpOworCXJlc3VsdCA9IFRSVUU7CitvdXQ6CisJa2ZyZWUgKHBoWzFdKTsKKwlrZnJlZSAocGhbMl0pOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogbGRtX3ZhbGlkYXRlX3RvY2Jsb2NrcyAtIFZhbGlkYXRlIHRoZSB0YWJsZSBvZiBjb250ZW50cyBhbmQgaXRzIGJhY2t1cHMKKyAqIEBiZGV2OiAgRGV2aWNlIGhvbGRpbmcgdGhlIExETSBEYXRhYmFzZQorICogQGJhc2U6ICBPZmZzZXQsIGludG8gQGJkZXYsIG9mIHRoZSBkYXRhYmFzZQorICogQGxkYjogICBDYWNoZSBvZiB0aGUgZGF0YWJhc2Ugc3RydWN0dXJlcworICoKKyAqIEZpbmQgYW5kIGNvbXBhcmUgdGhlIGZvdXIgdGFibGVzIG9mIGNvbnRlbnRzIG9mIHRoZSBMRE0gRGF0YWJhc2Ugc3RvcmVkIG9uCisgKiBAYmRldiBhbmQgcmV0dXJuIHRoZSBwYXJzZWQgaW5mb3JtYXRpb24gaW50byBAdG9jMS4KKyAqCisgKiBUaGUgb2Zmc2V0cyBhbmQgc2l6ZXMgb2YgdGhlIGNvbmZpZ3MgYXJlIHJhbmdlLWNoZWNrZWQgYWdhaW5zdCBhIHByaXZoZWFkLgorICoKKyAqIFJldHVybjogIFRSVUUgICBAdG9jMSBjb250YWlucyB2YWxpZGF0ZWQgVE9DQkxPQ0sgaW5mbworICogICAgICAgICAgRkFMU0UgIEB0b2MxIGNvbnRlbnRzIGFyZSB1bmRlZmluZWQKKyAqLworc3RhdGljIEJPT0wgbGRtX3ZhbGlkYXRlX3RvY2Jsb2NrcyAoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwl1bnNpZ25lZCBsb25nIGJhc2UsIHN0cnVjdCBsZG1kYiAqbGRiKQoreworCXN0YXRpYyBjb25zdCBpbnQgb2ZmWzRdID0geyBPRkZfVE9DQjEsIE9GRl9UT0NCMiwgT0ZGX1RPQ0IzLCBPRkZfVE9DQjR9OworCXN0cnVjdCB0b2NibG9jayAqdGJbNF07CisJc3RydWN0IHByaXZoZWFkICpwaDsKKwlTZWN0b3Igc2VjdDsKKwl1OCAqZGF0YTsKKwlCT09MIHJlc3VsdCA9IEZBTFNFOworCWludCBpOworCisJQlVHX09OICghYmRldiB8fCAhbGRiKTsKKworCXBoICAgID0gJmxkYi0+cGg7CisJdGJbMF0gPSAmbGRiLT50b2M7CisJdGJbMV0gPSBrbWFsbG9jIChzaXplb2YgKCp0YlsxXSksIEdGUF9LRVJORUwpOworCXRiWzJdID0ga21hbGxvYyAoc2l6ZW9mICgqdGJbMl0pLCBHRlBfS0VSTkVMKTsKKwl0YlszXSA9IGttYWxsb2MgKHNpemVvZiAoKnRiWzNdKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0YlsxXSB8fCAhdGJbMl0gfHwgIXRiWzNdKSB7CisJCWxkbV9jcml0ICgiT3V0IG9mIG1lbW9yeS4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykJCS8qIFJlYWQgYW5kIHBhcnNlIGFsbCBmb3VyIHRvYydzLiAqLworCXsKKwkJZGF0YSA9IHJlYWRfZGV2X3NlY3RvciAoYmRldiwgYmFzZSArIG9mZltpXSwgJnNlY3QpOworCQlpZiAoIWRhdGEpIHsKKwkJCWxkbV9jcml0ICgiRGlzayByZWFkIGZhaWxlZC4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJlc3VsdCA9IGxkbV9wYXJzZV90b2NibG9jayAoZGF0YSwgdGJbaV0pOworCQlwdXRfZGV2X3NlY3RvciAoc2VjdCk7CisJCWlmICghcmVzdWx0KQorCQkJZ290byBvdXQ7CS8qIEFscmVhZHkgbG9nZ2VkICovCisJfQorCisJLyogUmFuZ2UgY2hlY2sgdGhlIHRvYyBhZ2FpbnN0IGEgcHJpdmhlYWQuICovCisJaWYgKCgodGJbMF0tPmJpdG1hcDFfc3RhcnQgKyB0YlswXS0+Yml0bWFwMV9zaXplKSA+IHBoLT5jb25maWdfc2l6ZSkgfHwKKwkgICAgKCh0YlswXS0+Yml0bWFwMl9zdGFydCArIHRiWzBdLT5iaXRtYXAyX3NpemUpID4gcGgtPmNvbmZpZ19zaXplKSkgeworCQlsZG1fY3JpdCAoIlRoZSBiaXRtYXBzIGFyZSBvdXQgb2YgcmFuZ2UuICBHaXZpbmcgdXAuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghbGRtX2NvbXBhcmVfdG9jYmxvY2tzICh0YlswXSwgdGJbMV0pIHx8CS8qIENvbXBhcmUgYWxsIHRvY3MuICovCisJICAgICFsZG1fY29tcGFyZV90b2NibG9ja3MgKHRiWzBdLCB0YlsyXSkgfHwKKwkgICAgIWxkbV9jb21wYXJlX3RvY2Jsb2NrcyAodGJbMF0sIHRiWzNdKSkgeworCQlsZG1fY3JpdCAoIlRoZSBUT0NCTE9DS3MgZG9uJ3QgbWF0Y2guIik7CisJCWdvdG8gb3V0OworCX0KKworCWxkbV9kZWJ1ZyAoIlZhbGlkYXRlZCBUT0NCTE9DS3Mgc3VjY2Vzc2Z1bGx5LiIpOworCXJlc3VsdCA9IFRSVUU7CitvdXQ6CisJa2ZyZWUgKHRiWzFdKTsKKwlrZnJlZSAodGJbMl0pOworCWtmcmVlICh0YlszXSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBsZG1fdmFsaWRhdGVfdm1kYiAtIFJlYWQgdGhlIFZNREIgYW5kIHZhbGlkYXRlIGl0CisgKiBAYmRldjogIERldmljZSBob2xkaW5nIHRoZSBMRE0gRGF0YWJhc2UKKyAqIEBiYXNlOiAgT2Zmc2V0LCBpbnRvIEBiZGV2LCBvZiB0aGUgZGF0YWJhc2UKKyAqIEBsZGI6ICAgQ2FjaGUgb2YgdGhlIGRhdGFiYXNlIHN0cnVjdHVyZXMKKyAqCisgKiBGaW5kIHRoZSB2bWRiIG9mIHRoZSBMRE0gRGF0YWJhc2Ugc3RvcmVkIG9uIEBiZGV2IGFuZCByZXR1cm4gdGhlIHBhcnNlZAorICogaW5mb3JtYXRpb24gaW4gQGxkYi4KKyAqCisgKiBSZXR1cm46ICBUUlVFICAgQGxkYiBjb250YWlucyB2YWxpZGF0ZWQgVkJEQiBpbmZvCisgKiAgICAgICAgICBGQUxTRSAgQGxkYiBjb250ZW50cyBhcmUgdW5kZWZpbmVkCisgKi8KK3N0YXRpYyBCT09MIGxkbV92YWxpZGF0ZV92bWRiIChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB1bnNpZ25lZCBsb25nIGJhc2UsCisJCQkgICAgICAgc3RydWN0IGxkbWRiICpsZGIpCit7CisJU2VjdG9yIHNlY3Q7CisJdTggKmRhdGE7CisJQk9PTCByZXN1bHQgPSBGQUxTRTsKKwlzdHJ1Y3Qgdm1kYiAqdm07CisJc3RydWN0IHRvY2Jsb2NrICp0b2M7CisKKwlCVUdfT04gKCFiZGV2IHx8ICFsZGIpOworCisJdm0gID0gJmxkYi0+dm07CisJdG9jID0gJmxkYi0+dG9jOworCisJZGF0YSA9IHJlYWRfZGV2X3NlY3RvciAoYmRldiwgYmFzZSArIE9GRl9WTURCLCAmc2VjdCk7CisJaWYgKCFkYXRhKSB7CisJCWxkbV9jcml0ICgiRGlzayByZWFkIGZhaWxlZC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmICghbGRtX3BhcnNlX3ZtZGIgKGRhdGEsIHZtKSkKKwkJZ290byBvdXQ7CQkJCS8qIEFscmVhZHkgbG9nZ2VkICovCisKKwkvKiBBcmUgdGhlcmUgdW5jb21taXR0ZWQgdHJhbnNhY3Rpb25zPyAqLworCWlmIChCRTE2KGRhdGEgKyAweDEwKSAhPSAweDAxKSB7CisJCWxkbV9jcml0ICgiRGF0YWJhc2UgaXMgbm90IGluIGEgY29uc2lzdGVudCBzdGF0ZS4gIEFib3J0aW5nLiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodm0tPnZibGtfb2Zmc2V0ICE9IDUxMikKKwkJbGRtX2luZm8gKCJWQkxLcyBzdGFydCBhdCBvZmZzZXQgMHglMDR4LiIsIHZtLT52YmxrX29mZnNldCk7CisKKwkvKgorCSAqIFRoZSBsYXN0X3ZibGtkX3NlcSBjYW4gYmUgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIHZtZGIsIGp1c3QgbWFrZSBzdXJlCisJICogaXQgaXMgbm90IG91dCBvZiBib3VuZHMuCisJICovCisJaWYgKCh2bS0+dmJsa19zaXplICogdm0tPmxhc3RfdmJsa19zZXEpID4gKHRvYy0+Yml0bWFwMV9zaXplIDw8IDkpKSB7CisJCWxkbV9jcml0ICgiVk1EQiBleGNlZWRzIGFsbG93ZWQgc2l6ZSBzcGVjaWZpZWQgYnkgVE9DQkxPQ0suICAiCisJCQkJIkRhdGFiYXNlIGlzIGNvcnJ1cHQuICBBYm9ydGluZy4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmVzdWx0ID0gVFJVRTsKK291dDoKKwlwdXRfZGV2X3NlY3RvciAoc2VjdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIGxkbV92YWxpZGF0ZV9wYXJ0aXRpb25fdGFibGUgLSBEZXRlcm1pbmUgd2hldGhlciBiZGV2IG1pZ2h0IGJlIGEgZHluYW1pYyBkaXNrCisgKiBAYmRldjogIERldmljZSBob2xkaW5nIHRoZSBMRE0gRGF0YWJhc2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgd2VhayB0ZXN0IHRvIGRlY2lkZSB3aGV0aGVyIHRoZSBkZXZpY2UgaXMgYSBkeW5hbWljCisgKiBkaXNrIG9yIG5vdC4gIEl0IGxvb2tzIGZvciBhbiBNUy1ET1Mtc3R5bGUgcGFydGl0aW9uIHRhYmxlIGNvbnRhaW5pbmcgYXQKKyAqIGxlYXN0IG9uZSBwYXJ0aXRpb24gb2YgdHlwZSAweDQyIChmb3JtZXJseSBTRlMsIG5vdyB1c2VkIGJ5IFdpbmRvd3MgZm9yCisgKiBkeW5hbWljIGRpc2tzKS4KKyAqCisgKiBOLkIuICBUaGUgb25seSBwb3NzaWJsZSBlcnJvciBjYW4gY29tZSBmcm9tIHRoZSByZWFkX2Rldl9zZWN0b3IgYW5kIHRoYXQgaXMKKyAqICAgICAgIG9ubHkgbGlrZWx5IHRvIGhhcHBlbiBpZiB0aGUgdW5kZXJseWluZyBkZXZpY2UgaXMgc3RyYW5nZS4gIElmIHRoYXQgSVMKKyAqICAgICAgIHRoZSBjYXNlIHdlIHNob3VsZCByZXR1cm4gemVybyB0byBsZXQgc29tZW9uZSBlbHNlIHRyeS4KKyAqCisgKiBSZXR1cm46ICBUUlVFICAgQGJkZXYgaXMgYSBkeW5hbWljIGRpc2sKKyAqICAgICAgICAgIEZBTFNFICBAYmRldiBpcyBub3QgYSBkeW5hbWljIGRpc2ssIG9yIGFuIGVycm9yIG9jY3VycmVkCisgKi8KK3N0YXRpYyBCT09MIGxkbV92YWxpZGF0ZV9wYXJ0aXRpb25fdGFibGUgKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJU2VjdG9yIHNlY3Q7CisJdTggKmRhdGE7CisJc3RydWN0IHBhcnRpdGlvbiAqcDsKKwlpbnQgaTsKKwlCT09MIHJlc3VsdCA9IEZBTFNFOworCisJQlVHX09OICghYmRldik7CisKKwlkYXRhID0gcmVhZF9kZXZfc2VjdG9yIChiZGV2LCAwLCAmc2VjdCk7CisJaWYgKCFkYXRhKSB7CisJCWxkbV9jcml0ICgiRGlzayByZWFkIGZhaWxlZC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmICgqKF9fbGUxNiopIChkYXRhICsgMHgwMUZFKSAhPSBjcHVfdG9fbGUxNiAoTVNET1NfTEFCRUxfTUFHSUMpKQorCQlnb3RvIG91dDsKKworCXAgPSAoc3RydWN0IHBhcnRpdGlvbiopKGRhdGEgKyAweDAxQkUpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIHArKykKKwkJaWYgKFNZU19JTkQgKHApID09IFdJTjJLX0RZTkFNSUNfUEFSVElUSU9OKSB7CisJCQlyZXN1bHQgPSBUUlVFOworCQkJYnJlYWs7CisJCX0KKworCWlmIChyZXN1bHQpCisJCWxkbV9kZWJ1ZyAoIkZvdW5kIFcySyBkeW5hbWljIGRpc2sgcGFydGl0aW9uIHR5cGUuIik7CisKK291dDoKKwlwdXRfZGV2X3NlY3RvciAoc2VjdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBsZG1fZ2V0X2Rpc2tfb2JqaWQgLSBTZWFyY2ggYSBsaW5rZWQgbGlzdCBvZiB2YmxrJ3MgZm9yIGEgZ2l2ZW4gRGlzayBJZAorICogQGxkYjogIENhY2hlIG9mIHRoZSBkYXRhYmFzZSBzdHJ1Y3R1cmVzCisgKgorICogVGhlIExETSBEYXRhYmFzZSBjb250YWlucyBhIGxpc3Qgb2YgYWxsIHBhcnRpdGlvbnMgb24gYWxsIGR5bmFtaWMgZGlza3MuCisgKiBUaGUgcHJpbWFyeSBQUklWSEVBRCwgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGh5c2ljYWwgZGlzaywgdGVsbHMgdXMKKyAqIHRoZSBHVUlEIG9mIHRoaXMgZGlzay4gIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIHRoZSBHVUlEIGluIGEgbGlua2VkCisgKiBsaXN0IG9mIHZibGsncy4KKyAqCisgKiBSZXR1cm46ICBQb2ludGVyLCBBIG1hdGNoaW5nIHZibGsgd2FzIGZvdW5kCisgKiAgICAgICAgICBOVUxMLCAgICBObyBtYXRjaCwgb3IgYW4gZXJyb3IKKyAqLworc3RhdGljIHN0cnVjdCB2YmxrICogbGRtX2dldF9kaXNrX29iamlkIChjb25zdCBzdHJ1Y3QgbGRtZGIgKmxkYikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtOworCisJQlVHX09OICghbGRiKTsKKworCWxpc3RfZm9yX2VhY2ggKGl0ZW0sICZsZGItPnZfZGlzaykgeworCQlzdHJ1Y3QgdmJsayAqdiA9IGxpc3RfZW50cnkgKGl0ZW0sIHN0cnVjdCB2YmxrLCBsaXN0KTsKKwkJaWYgKCFtZW1jbXAgKHYtPnZibGsuZGlzay5kaXNrX2lkLCBsZGItPnBoLmRpc2tfaWQsIEdVSURfU0laRSkpCisJCQlyZXR1cm4gdjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBsZG1fY3JlYXRlX2RhdGFfcGFydGl0aW9ucyAtIENyZWF0ZSBkYXRhIHBhcnRpdGlvbnMgZm9yIHRoaXMgZGV2aWNlCisgKiBAcHA6ICAgTGlzdCBvZiB0aGUgcGFydGl0aW9ucyBwYXJzZWQgc28gZmFyCisgKiBAbGRiOiAgQ2FjaGUgb2YgdGhlIGRhdGFiYXNlIHN0cnVjdHVyZXMKKyAqCisgKiBUaGUgZGF0YWJhc2UgY29udGFpbnMgQUxMIHRoZSBwYXJ0aXRpb25zIGZvciBBTEwgZGlzayBncm91cHMsIHNvIHdlIG5lZWQgdG8KKyAqIGZpbHRlciBvdXQgdGhpcyBzcGVjaWZpYyBkaXNrLiBVc2luZyB0aGUgZGlzaydzIG9iamVjdCBpZCwgd2UgY2FuIGZpbmQgYWxsCisgKiB0aGUgcGFydGl0aW9ucyBpbiB0aGUgZGF0YWJhc2UgdGhhdCBiZWxvbmcgdG8gdGhpcyBkaXNrLgorICoKKyAqIEFkZCBlYWNoIHBhcnRpdGlvbiBpbiBvdXIgZGF0YWJhc2UsIHRvIHRoZSBwYXJzZWRfcGFydGl0aW9ucyBzdHJ1Y3R1cmUuCisgKgorICogTi5CLiAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIHRoZSBwYXJ0aXRpb25zIGluIHRoZSBvcmRlciBpdCBmaW5kcyBwYXJ0aXRpb24KKyAqICAgICAgIG9iamVjdHMgaW4gdGhlIGxpbmtlZCBsaXN0LgorICoKKyAqIFJldHVybjogIFRSVUUgICBQYXJ0aXRpb24gY3JlYXRlZAorICogICAgICAgICAgRkFMU0UgIEVycm9yLCBwcm9iYWJseSBhIHJhbmdlIGNoZWNraW5nIHByb2JsZW0KKyAqLworc3RhdGljIEJPT0wgbGRtX2NyZWF0ZV9kYXRhX3BhcnRpdGlvbnMgKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqcHAsCisJCQkJCWNvbnN0IHN0cnVjdCBsZG1kYiAqbGRiKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisJc3RydWN0IHZibGsgKnZiOworCXN0cnVjdCB2YmxrICpkaXNrOworCXN0cnVjdCB2YmxrX3BhcnQgKnBhcnQ7CisJaW50IHBhcnRfbnVtID0gMTsKKworCUJVR19PTiAoIXBwIHx8ICFsZGIpOworCisJZGlzayA9IGxkbV9nZXRfZGlza19vYmppZCAobGRiKTsKKwlpZiAoIWRpc2spIHsKKwkJbGRtX2NyaXQgKCJDYW4ndCBmaW5kIHRoZSBJRCBvZiB0aGlzIGRpc2sgaW4gdGhlIGRhdGFiYXNlLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcHJpbnRrICgiIFtMRE1dIik7CisKKwkvKiBDcmVhdGUgdGhlIGRhdGEgcGFydGl0aW9ucyAqLworCWxpc3RfZm9yX2VhY2ggKGl0ZW0sICZsZGItPnZfcGFydCkgeworCQl2YiA9IGxpc3RfZW50cnkgKGl0ZW0sIHN0cnVjdCB2YmxrLCBsaXN0KTsKKwkJcGFydCA9ICZ2Yi0+dmJsay5wYXJ0OworCisJCWlmIChwYXJ0LT5kaXNrX2lkICE9IGRpc2stPm9ial9pZCkKKwkJCWNvbnRpbnVlOworCisJCXB1dF9wYXJ0aXRpb24gKHBwLCBwYXJ0X251bSwgbGRiLT5waC5sb2dpY2FsX2Rpc2tfc3RhcnQgKworCQkJCXBhcnQtPnN0YXJ0LCBwYXJ0LT5zaXplKTsKKwkJcGFydF9udW0rKzsKKwl9CisKKwlwcmludGsgKCJcbiIpOworCXJldHVybiBUUlVFOworfQorCisKKy8qKgorICogbGRtX3JlbGF0aXZlIC0gQ2FsY3VsYXRlIHRoZSBuZXh0IHJlbGF0aXZlIG9mZnNldAorICogQGJ1ZmZlcjogIEJsb2NrIG9mIGRhdGEgYmVpbmcgd29ya2VkIG9uCisgKiBAYnVmbGVuOiAgU2l6ZSBvZiB0aGUgYmxvY2sgb2YgZGF0YQorICogQGJhc2U6ICAgIFNpemUgb2YgdGhlIHByZXZpb3VzIGZpeGVkIHdpZHRoIGZpZWxkcworICogQG9mZnNldDogIEN1bXVsYXRpdmUgc2l6ZSBvZiB0aGUgcHJldmlvdXMgdmFyaWFibGUtd2lkdGggZmllbGRzCisgKgorICogQmVjYXVzZSBtYW55IG9mIHRoZSBWQkxLIGZpZWxkcyBhcmUgdmFyaWFibGUtd2lkdGgsIGl0J3MgbmVjZXNzYXJ5CisgKiB0byBjYWxjdWxhdGUgZWFjaCBvZmZzZXQgYmFzZWQgb24gdGhlIHByZXZpb3VzIG9uZSBhbmQgdGhlIGxlbmd0aAorICogb2YgdGhlIGZpZWxkIGl0IHBvaW50ZWQgdG8uCisgKgorICogUmV0dXJuOiAgLTEgRXJyb3IsIHRoZSBjYWxjdWxhdGVkIG9mZnNldCBleGNlZWRlZCB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyCisgKiAgICAgICAgICAgbiBPSywgYSByYW5nZS1jaGVja2VkIG9mZnNldCBpbnRvIGJ1ZmZlcgorICovCitzdGF0aWMgaW50IGxkbV9yZWxhdGl2ZSAoY29uc3QgdTggKmJ1ZmZlciwgaW50IGJ1ZmxlbiwgaW50IGJhc2UsIGludCBvZmZzZXQpCit7CisKKwliYXNlICs9IG9mZnNldDsKKwlpZiAoKCFidWZmZXIpIHx8IChvZmZzZXQgPCAwKSB8fCAoYmFzZSA+IGJ1ZmxlbikpCisJCXJldHVybiAtMTsKKwlpZiAoKGJhc2UgKyBidWZmZXJbYmFzZV0pID49IGJ1ZmxlbikKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIGJ1ZmZlcltiYXNlXSArIG9mZnNldCArIDE7Cit9CisKKy8qKgorICogbGRtX2dldF92bnVtIC0gQ29udmVydCBhIHZhcmlhYmxlLXdpZHRoLCBiaWcgZW5kaWFuIG51bWJlciwgaW50byBjcHUgb3JkZXIKKyAqIEBibG9jazogIFBvaW50ZXIgdG8gdGhlIHZhcmlhYmxlLXdpZHRoIG51bWJlciB0byBjb252ZXJ0CisgKgorICogTGFyZ2UgbnVtYmVycyBpbiB0aGUgTERNIERhdGFiYXNlIGFyZSBvZnRlbiBzdG9yZWQgaW4gYSBwYWNrZWQgZm9ybWF0LiAgRWFjaAorICogbnVtYmVyIGlzIHByZWZpeGVkIGJ5IGEgb25lIGJ5dGUgd2lkdGggbWFya2VyLiAgQWxsIG51bWJlcnMgaW4gdGhlIGRhdGFiYXNlCisgKiBhcmUgc3RvcmVkIGluIGJpZy1lbmRpYW4gYnl0ZSBvcmRlci4gIFRoaXMgZnVuY3Rpb24gcmVhZHMgb25lIG9mIHRoZXNlCisgKiBudW1iZXJzIGFuZCByZXR1cm5zIHRoZSByZXN1bHQKKyAqCisgKiBOLkIuICBUaGlzIGZ1bmN0aW9uIERPRVMgTk9UIHBlcmZvcm0gYW55IHJhbmdlIGNoZWNraW5nLCB0aG91Z2ggdGhlIG1vc3QKKyAqICAgICAgIGl0IHdpbGwgcmVhZCBpcyBlaWdodCBieXRlcy4KKyAqCisgKiBSZXR1cm46ICBuIEEgbnVtYmVyCisgKiAgICAgICAgICAwIFplcm8sIG9yIGFuIGVycm9yIG9jY3VycmVkCisgKi8KK3N0YXRpYyB1NjQgbGRtX2dldF92bnVtIChjb25zdCB1OCAqYmxvY2spCit7CisJdTY0IHRtcCA9IDA7CisJdTggbGVuZ3RoOworCisJQlVHX09OICghYmxvY2spOworCisJbGVuZ3RoID0gKmJsb2NrKys7CisKKwlpZiAobGVuZ3RoICYmIGxlbmd0aCA8PSA4KQorCQl3aGlsZSAobGVuZ3RoLS0pCisJCQl0bXAgPSAodG1wIDw8IDgpIHwgKmJsb2NrKys7CisJZWxzZQorCQlsZG1fZXJyb3IgKCJJbGxlZ2FsIGxlbmd0aCAlZC4iLCBsZW5ndGgpOworCisJcmV0dXJuIHRtcDsKK30KKworLyoqCisgKiBsZG1fZ2V0X3ZzdHIgLSBSZWFkIGEgbGVuZ3RoLXByZWZpeGVkIHN0cmluZyBpbnRvIGEgYnVmZmVyCisgKiBAYmxvY2s6ICAgUG9pbnRlciB0byB0aGUgbGVuZ3RoIG1hcmtlcgorICogQGJ1ZmZlcjogIExvY2F0aW9uIHRvIGNvcHkgc3RyaW5nIHRvCisgKiBAYnVmbGVuOiAgU2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlcgorICoKKyAqIE1hbnkgb2YgdGhlIHN0cmluZ3MgaW4gdGhlIExETSBEYXRhYmFzZSBhcmUgbm90IE5VTEwgdGVybWluYXRlZC4gIEluc3RlYWQKKyAqIHRoZXkgYXJlIHByZWZpeGVkIGJ5IGEgb25lIGJ5dGUgbGVuZ3RoIG1hcmtlci4gIFRoaXMgZnVuY3Rpb24gY29waWVzIG9uZSBvZgorICogdGhlc2Ugc3RyaW5ncyBpbnRvIGEgYnVmZmVyLgorICoKKyAqIE4uQi4gIFRoaXMgZnVuY3Rpb24gRE9FUyBOT1QgcGVyZm9ybSBhbnkgcmFuZ2UgY2hlY2tpbmcgb24gdGhlIGlucHV0LgorICogICAgICAgSWYgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwsIHRoZSBvdXRwdXQgd2lsbCBiZSB0cnVuY2F0ZWQuCisgKgorICogUmV0dXJuOiAgMCwgRXJyb3IgYW5kIEBidWZmZXIgY29udGVudHMgYXJlIHVuZGVmaW5lZAorICogICAgICAgICAgbiwgU3RyaW5nIGxlbmd0aCBpbiBjaGFyYWN0ZXJzIChleGNsdWRpbmcgTlVMTCkKKyAqICAgICAgICAgIGJ1Zmxlbi0xLCBTdHJpbmcgd2FzIHRydW5jYXRlZC4KKyAqLworc3RhdGljIGludCBsZG1fZ2V0X3ZzdHIgKGNvbnN0IHU4ICpibG9jaywgdTggKmJ1ZmZlciwgaW50IGJ1ZmxlbikKK3sKKwlpbnQgbGVuZ3RoOworCisJQlVHX09OICghYmxvY2sgfHwgIWJ1ZmZlcik7CisKKwlsZW5ndGggPSBibG9ja1swXTsKKwlpZiAobGVuZ3RoID49IGJ1ZmxlbikgeworCQlsZG1fZXJyb3IgKCJUcnVuY2F0aW5nIHN0cmluZyAlZCAtPiAlZC4iLCBsZW5ndGgsIGJ1Zmxlbik7CisJCWxlbmd0aCA9IGJ1ZmxlbiAtIDE7CisJfQorCW1lbWNweSAoYnVmZmVyLCBibG9jayArIDEsIGxlbmd0aCk7CisJYnVmZmVyW2xlbmd0aF0gPSAwOworCXJldHVybiBsZW5ndGg7Cit9CisKKworLyoqCisgKiBsZG1fcGFyc2VfY21wMyAtIFJlYWQgYSByYXcgVkJMSyBDb21wb25lbnQgb2JqZWN0IGludG8gYSB2YmxrIHN0cnVjdHVyZQorICogQGJ1ZmZlcjogIEJsb2NrIG9mIGRhdGEgYmVpbmcgd29ya2VkIG9uCisgKiBAYnVmbGVuOiAgU2l6ZSBvZiB0aGUgYmxvY2sgb2YgZGF0YQorICogQHZiOiAgICAgIEluLW1lbW9yeSB2YmxrIGluIHdoaWNoIHRvIHJldHVybiBpbmZvcm1hdGlvbgorICoKKyAqIFJlYWQgYSByYXcgVkJMSyBDb21wb25lbnQgb2JqZWN0ICh2ZXJzaW9uIDMpIGludG8gYSB2YmxrIHN0cnVjdHVyZS4KKyAqCisgKiBSZXR1cm46ICBUUlVFICAgQHZiIGNvbnRhaW5zIGEgQ29tcG9uZW50IFZCTEsKKyAqICAgICAgICAgIEZBTFNFICBAdmIgY29udGVudHMgYXJlIG5vdCBkZWZpbmVkCisgKi8KK3N0YXRpYyBCT09MIGxkbV9wYXJzZV9jbXAzIChjb25zdCB1OCAqYnVmZmVyLCBpbnQgYnVmbGVuLCBzdHJ1Y3QgdmJsayAqdmIpCit7CisJaW50IHJfb2JqaWQsIHJfbmFtZSwgcl92c3RhdGUsIHJfY2hpbGQsIHJfcGFyZW50LCByX3N0cmlwZSwgcl9jb2xzLCBsZW47CisJc3RydWN0IHZibGtfY29tcCAqY29tcDsKKworCUJVR19PTiAoIWJ1ZmZlciB8fCAhdmIpOworCisJcl9vYmppZCAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCAwKTsKKwlyX25hbWUgICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MTgsIHJfb2JqaWQpOworCXJfdnN0YXRlID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgcl9uYW1lKTsKKwlyX2NoaWxkICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MUQsIHJfdnN0YXRlKTsKKwlyX3BhcmVudCA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MkQsIHJfY2hpbGQpOworCisJaWYgKGJ1ZmZlclsweDEyXSAmIFZCTEtfRkxBR19DT01QX1NUUklQRSkgeworCQlyX3N0cmlwZSA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MkUsIHJfcGFyZW50KTsKKwkJcl9jb2xzICAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDJFLCByX3N0cmlwZSk7CisJCWxlbiA9IHJfY29sczsKKwl9IGVsc2UgeworCQlyX3N0cmlwZSA9IDA7CisJCXJfY29scyAgID0gMDsKKwkJbGVuID0gcl9wYXJlbnQ7CisJfQorCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gRkFMU0U7CisKKwlsZW4gKz0gVkJMS19TSVpFX0NNUDM7CisJaWYgKGxlbiAhPSBCRTMyIChidWZmZXIgKyAweDE0KSkKKwkJcmV0dXJuIEZBTFNFOworCisJY29tcCA9ICZ2Yi0+dmJsay5jb21wOworCWxkbV9nZXRfdnN0ciAoYnVmZmVyICsgMHgxOCArIHJfbmFtZSwgY29tcC0+c3RhdGUsCisJCXNpemVvZiAoY29tcC0+c3RhdGUpKTsKKwljb21wLT50eXBlICAgICAgPSBidWZmZXJbMHgxOCArIHJfdnN0YXRlXTsKKwljb21wLT5jaGlsZHJlbiAgPSBsZG1fZ2V0X3ZudW0gKGJ1ZmZlciArIDB4MUQgKyByX3ZzdGF0ZSk7CisJY29tcC0+cGFyZW50X2lkID0gbGRtX2dldF92bnVtIChidWZmZXIgKyAweDJEICsgcl9jaGlsZCk7CisJY29tcC0+Y2h1bmtzaXplID0gcl9zdHJpcGUgPyBsZG1fZ2V0X3ZudW0gKGJ1ZmZlcityX3BhcmVudCsweDJFKSA6IDA7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBsZG1fcGFyc2VfZGdyMyAtIFJlYWQgYSByYXcgVkJMSyBEaXNrIEdyb3VwIG9iamVjdCBpbnRvIGEgdmJsayBzdHJ1Y3R1cmUKKyAqIEBidWZmZXI6ICBCbG9jayBvZiBkYXRhIGJlaW5nIHdvcmtlZCBvbgorICogQGJ1ZmxlbjogIFNpemUgb2YgdGhlIGJsb2NrIG9mIGRhdGEKKyAqIEB2YjogICAgICBJbi1tZW1vcnkgdmJsayBpbiB3aGljaCB0byByZXR1cm4gaW5mb3JtYXRpb24KKyAqCisgKiBSZWFkIGEgcmF3IFZCTEsgRGlzayBHcm91cCBvYmplY3QgKHZlcnNpb24gMykgaW50byBhIHZibGsgc3RydWN0dXJlLgorICoKKyAqIFJldHVybjogIFRSVUUgICBAdmIgY29udGFpbnMgYSBEaXNrIEdyb3VwIFZCTEsKKyAqICAgICAgICAgIEZBTFNFICBAdmIgY29udGVudHMgYXJlIG5vdCBkZWZpbmVkCisgKi8KK3N0YXRpYyBpbnQgbGRtX3BhcnNlX2RncjMgKGNvbnN0IHU4ICpidWZmZXIsIGludCBidWZsZW4sIHN0cnVjdCB2YmxrICp2YikKK3sKKwlpbnQgcl9vYmppZCwgcl9uYW1lLCByX2Rpc2tpZCwgcl9pZDEsIHJfaWQyLCBsZW47CisJc3RydWN0IHZibGtfZGdycCAqZGdycDsKKworCUJVR19PTiAoIWJ1ZmZlciB8fCAhdmIpOworCisJcl9vYmppZCAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCAwKTsKKwlyX25hbWUgICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MTgsIHJfb2JqaWQpOworCXJfZGlza2lkID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgcl9uYW1lKTsKKworCWlmIChidWZmZXJbMHgxMl0gJiBWQkxLX0ZMQUdfREdSM19JRFMpIHsKKwkJcl9pZDEgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDI0LCByX2Rpc2tpZCk7CisJCXJfaWQyID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgyNCwgcl9pZDEpOworCQlsZW4gPSByX2lkMjsKKwl9IGVsc2UgeworCQlyX2lkMSA9IDA7CisJCXJfaWQyID0gMDsKKwkJbGVuID0gcl9kaXNraWQ7CisJfQorCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gRkFMU0U7CisKKwlsZW4gKz0gVkJMS19TSVpFX0RHUjM7CisJaWYgKGxlbiAhPSBCRTMyIChidWZmZXIgKyAweDE0KSkKKwkJcmV0dXJuIEZBTFNFOworCisJZGdycCA9ICZ2Yi0+dmJsay5kZ3JwOworCWxkbV9nZXRfdnN0ciAoYnVmZmVyICsgMHgxOCArIHJfbmFtZSwgZGdycC0+ZGlza19pZCwKKwkJc2l6ZW9mIChkZ3JwLT5kaXNrX2lkKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogbGRtX3BhcnNlX2RncjQgLSBSZWFkIGEgcmF3IFZCTEsgRGlzayBHcm91cCBvYmplY3QgaW50byBhIHZibGsgc3RydWN0dXJlCisgKiBAYnVmZmVyOiAgQmxvY2sgb2YgZGF0YSBiZWluZyB3b3JrZWQgb24KKyAqIEBidWZsZW46ICBTaXplIG9mIHRoZSBibG9jayBvZiBkYXRhCisgKiBAdmI6ICAgICAgSW4tbWVtb3J5IHZibGsgaW4gd2hpY2ggdG8gcmV0dXJuIGluZm9ybWF0aW9uCisgKgorICogUmVhZCBhIHJhdyBWQkxLIERpc2sgR3JvdXAgb2JqZWN0ICh2ZXJzaW9uIDQpIGludG8gYSB2YmxrIHN0cnVjdHVyZS4KKyAqCisgKiBSZXR1cm46ICBUUlVFICAgQHZiIGNvbnRhaW5zIGEgRGlzayBHcm91cCBWQkxLCisgKiAgICAgICAgICBGQUxTRSAgQHZiIGNvbnRlbnRzIGFyZSBub3QgZGVmaW5lZAorICovCitzdGF0aWMgQk9PTCBsZG1fcGFyc2VfZGdyNCAoY29uc3QgdTggKmJ1ZmZlciwgaW50IGJ1Zmxlbiwgc3RydWN0IHZibGsgKnZiKQoreworCWNoYXIgYnVmWzY0XTsKKwlpbnQgcl9vYmppZCwgcl9uYW1lLCByX2lkMSwgcl9pZDIsIGxlbjsKKwlzdHJ1Y3QgdmJsa19kZ3JwICpkZ3JwOworCisJQlVHX09OICghYnVmZmVyIHx8ICF2Yik7CisKKwlyX29iamlkICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MTgsIDApOworCXJfbmFtZSAgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgcl9vYmppZCk7CisKKwlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX0RHUjRfSURTKSB7CisJCXJfaWQxID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHg0NCwgcl9uYW1lKTsKKwkJcl9pZDIgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDQ0LCByX2lkMSk7CisJCWxlbiA9IHJfaWQyOworCX0gZWxzZSB7CisJCXJfaWQxID0gMDsKKwkJcl9pZDIgPSAwOworCQlsZW4gPSByX25hbWU7CisJfQorCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gRkFMU0U7CisKKwlsZW4gKz0gVkJMS19TSVpFX0RHUjQ7CisJaWYgKGxlbiAhPSBCRTMyIChidWZmZXIgKyAweDE0KSkKKwkJcmV0dXJuIEZBTFNFOworCisJZGdycCA9ICZ2Yi0+dmJsay5kZ3JwOworCisJbGRtX2dldF92c3RyIChidWZmZXIgKyAweDE4ICsgcl9vYmppZCwgYnVmLCBzaXplb2YgKGJ1ZikpOworCXJldHVybiBUUlVFOworfQorCisvKioKKyAqIGxkbV9wYXJzZV9kc2szIC0gUmVhZCBhIHJhdyBWQkxLIERpc2sgb2JqZWN0IGludG8gYSB2YmxrIHN0cnVjdHVyZQorICogQGJ1ZmZlcjogIEJsb2NrIG9mIGRhdGEgYmVpbmcgd29ya2VkIG9uCisgKiBAYnVmbGVuOiAgU2l6ZSBvZiB0aGUgYmxvY2sgb2YgZGF0YQorICogQHZiOiAgICAgIEluLW1lbW9yeSB2YmxrIGluIHdoaWNoIHRvIHJldHVybiBpbmZvcm1hdGlvbgorICoKKyAqIFJlYWQgYSByYXcgVkJMSyBEaXNrIG9iamVjdCAodmVyc2lvbiAzKSBpbnRvIGEgdmJsayBzdHJ1Y3R1cmUuCisgKgorICogUmV0dXJuOiAgVFJVRSAgIEB2YiBjb250YWlucyBhIERpc2sgVkJMSworICogICAgICAgICAgRkFMU0UgIEB2YiBjb250ZW50cyBhcmUgbm90IGRlZmluZWQKKyAqLworc3RhdGljIEJPT0wgbGRtX3BhcnNlX2RzazMgKGNvbnN0IHU4ICpidWZmZXIsIGludCBidWZsZW4sIHN0cnVjdCB2YmxrICp2YikKK3sKKwlpbnQgcl9vYmppZCwgcl9uYW1lLCByX2Rpc2tpZCwgcl9hbHRuYW1lLCBsZW47CisJc3RydWN0IHZibGtfZGlzayAqZGlzazsKKworCUJVR19PTiAoIWJ1ZmZlciB8fCAhdmIpOworCisJcl9vYmppZCAgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgMCk7CisJcl9uYW1lICAgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgcl9vYmppZCk7CisJcl9kaXNraWQgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgcl9uYW1lKTsKKwlyX2FsdG5hbWUgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCByX2Rpc2tpZCk7CisJbGVuID0gcl9hbHRuYW1lOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gRkFMU0U7CisKKwlsZW4gKz0gVkJMS19TSVpFX0RTSzM7CisJaWYgKGxlbiAhPSBCRTMyIChidWZmZXIgKyAweDE0KSkKKwkJcmV0dXJuIEZBTFNFOworCisJZGlzayA9ICZ2Yi0+dmJsay5kaXNrOworCWxkbV9nZXRfdnN0ciAoYnVmZmVyICsgMHgxOCArIHJfZGlza2lkLCBkaXNrLT5hbHRfbmFtZSwKKwkJc2l6ZW9mIChkaXNrLT5hbHRfbmFtZSkpOworCWlmICghbGRtX3BhcnNlX2d1aWQgKGJ1ZmZlciArIDB4MTkgKyByX25hbWUsIGRpc2stPmRpc2tfaWQpKQorCQlyZXR1cm4gRkFMU0U7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBsZG1fcGFyc2VfZHNrNCAtIFJlYWQgYSByYXcgVkJMSyBEaXNrIG9iamVjdCBpbnRvIGEgdmJsayBzdHJ1Y3R1cmUKKyAqIEBidWZmZXI6ICBCbG9jayBvZiBkYXRhIGJlaW5nIHdvcmtlZCBvbgorICogQGJ1ZmxlbjogIFNpemUgb2YgdGhlIGJsb2NrIG9mIGRhdGEKKyAqIEB2YjogICAgICBJbi1tZW1vcnkgdmJsayBpbiB3aGljaCB0byByZXR1cm4gaW5mb3JtYXRpb24KKyAqCisgKiBSZWFkIGEgcmF3IFZCTEsgRGlzayBvYmplY3QgKHZlcnNpb24gNCkgaW50byBhIHZibGsgc3RydWN0dXJlLgorICoKKyAqIFJldHVybjogIFRSVUUgICBAdmIgY29udGFpbnMgYSBEaXNrIFZCTEsKKyAqICAgICAgICAgIEZBTFNFICBAdmIgY29udGVudHMgYXJlIG5vdCBkZWZpbmVkCisgKi8KK3N0YXRpYyBCT09MIGxkbV9wYXJzZV9kc2s0IChjb25zdCB1OCAqYnVmZmVyLCBpbnQgYnVmbGVuLCBzdHJ1Y3QgdmJsayAqdmIpCit7CisJaW50IHJfb2JqaWQsIHJfbmFtZSwgbGVuOworCXN0cnVjdCB2YmxrX2Rpc2sgKmRpc2s7CisKKwlCVUdfT04gKCFidWZmZXIgfHwgIXZiKTsKKworCXJfb2JqaWQgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCAwKTsKKwlyX25hbWUgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgcl9vYmppZCk7CisJbGVuICAgICA9IHJfbmFtZTsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIEZBTFNFOworCisJbGVuICs9IFZCTEtfU0laRV9EU0s0OworCWlmIChsZW4gIT0gQkUzMiAoYnVmZmVyICsgMHgxNCkpCisJCXJldHVybiBGQUxTRTsKKworCWRpc2sgPSAmdmItPnZibGsuZGlzazsKKwltZW1jcHkgKGRpc2stPmRpc2tfaWQsIGJ1ZmZlciArIDB4MTggKyByX25hbWUsIEdVSURfU0laRSk7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogbGRtX3BhcnNlX3BydDMgLSBSZWFkIGEgcmF3IFZCTEsgUGFydGl0aW9uIG9iamVjdCBpbnRvIGEgdmJsayBzdHJ1Y3R1cmUKKyAqIEBidWZmZXI6ICBCbG9jayBvZiBkYXRhIGJlaW5nIHdvcmtlZCBvbgorICogQGJ1ZmxlbjogIFNpemUgb2YgdGhlIGJsb2NrIG9mIGRhdGEKKyAqIEB2YjogICAgICBJbi1tZW1vcnkgdmJsayBpbiB3aGljaCB0byByZXR1cm4gaW5mb3JtYXRpb24KKyAqCisgKiBSZWFkIGEgcmF3IFZCTEsgUGFydGl0aW9uIG9iamVjdCAodmVyc2lvbiAzKSBpbnRvIGEgdmJsayBzdHJ1Y3R1cmUuCisgKgorICogUmV0dXJuOiAgVFJVRSAgIEB2YiBjb250YWlucyBhIFBhcnRpdGlvbiBWQkxLCisgKiAgICAgICAgICBGQUxTRSAgQHZiIGNvbnRlbnRzIGFyZSBub3QgZGVmaW5lZAorICovCitzdGF0aWMgQk9PTCBsZG1fcGFyc2VfcHJ0MyAoY29uc3QgdTggKmJ1ZmZlciwgaW50IGJ1Zmxlbiwgc3RydWN0IHZibGsgKnZiKQoreworCWludCByX29iamlkLCByX25hbWUsIHJfc2l6ZSwgcl9wYXJlbnQsIHJfZGlza2lkLCByX2luZGV4LCBsZW47CisJc3RydWN0IHZibGtfcGFydCAqcGFydDsKKworCUJVR19PTiAoIWJ1ZmZlciB8fCAhdmIpOworCisJcl9vYmppZCAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCAwKTsKKwlyX25hbWUgICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MTgsIHJfb2JqaWQpOworCXJfc2l6ZSAgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgzNCwgcl9uYW1lKTsKKwlyX3BhcmVudCA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MzQsIHJfc2l6ZSk7CisJcl9kaXNraWQgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDM0LCByX3BhcmVudCk7CisKKwlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1BBUlRfSU5ERVgpIHsKKwkJcl9pbmRleCA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MzQsIHJfZGlza2lkKTsKKwkJbGVuID0gcl9pbmRleDsKKwl9IGVsc2UgeworCQlyX2luZGV4ID0gMDsKKwkJbGVuID0gcl9kaXNraWQ7CisJfQorCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gRkFMU0U7CisKKwlsZW4gKz0gVkJMS19TSVpFX1BSVDM7CisJaWYgKGxlbiAhPSBCRTMyIChidWZmZXIgKyAweDE0KSkKKwkJcmV0dXJuIEZBTFNFOworCisJcGFydCA9ICZ2Yi0+dmJsay5wYXJ0OworCXBhcnQtPnN0YXJ0ICAgICAgICAgPSBCRTY0ICAgICAgICAgKGJ1ZmZlciArIDB4MjQgKyByX25hbWUpOworCXBhcnQtPnZvbHVtZV9vZmZzZXQgPSBCRTY0ICAgICAgICAgKGJ1ZmZlciArIDB4MkMgKyByX25hbWUpOworCXBhcnQtPnNpemUgICAgICAgICAgPSBsZG1fZ2V0X3ZudW0gKGJ1ZmZlciArIDB4MzQgKyByX25hbWUpOworCXBhcnQtPnBhcmVudF9pZCAgICAgPSBsZG1fZ2V0X3ZudW0gKGJ1ZmZlciArIDB4MzQgKyByX3NpemUpOworCXBhcnQtPmRpc2tfaWQgICAgICAgPSBsZG1fZ2V0X3ZudW0gKGJ1ZmZlciArIDB4MzQgKyByX3BhcmVudCk7CisJaWYgKHZiLT5mbGFncyAmIFZCTEtfRkxBR19QQVJUX0lOREVYKQorCQlwYXJ0LT5wYXJ0bnVtID0gYnVmZmVyWzB4MzUgKyByX2Rpc2tpZF07CisJZWxzZQorCQlwYXJ0LT5wYXJ0bnVtID0gMDsKKworCXJldHVybiBUUlVFOworfQorCisvKioKKyAqIGxkbV9wYXJzZV92b2w1IC0gUmVhZCBhIHJhdyBWQkxLIFZvbHVtZSBvYmplY3QgaW50byBhIHZibGsgc3RydWN0dXJlCisgKiBAYnVmZmVyOiAgQmxvY2sgb2YgZGF0YSBiZWluZyB3b3JrZWQgb24KKyAqIEBidWZsZW46ICBTaXplIG9mIHRoZSBibG9jayBvZiBkYXRhCisgKiBAdmI6ICAgICAgSW4tbWVtb3J5IHZibGsgaW4gd2hpY2ggdG8gcmV0dXJuIGluZm9ybWF0aW9uCisgKgorICogUmVhZCBhIHJhdyBWQkxLIFZvbHVtZSBvYmplY3QgKHZlcnNpb24gNSkgaW50byBhIHZibGsgc3RydWN0dXJlLgorICoKKyAqIFJldHVybjogIFRSVUUgICBAdmIgY29udGFpbnMgYSBWb2x1bWUgVkJMSworICogICAgICAgICAgRkFMU0UgIEB2YiBjb250ZW50cyBhcmUgbm90IGRlZmluZWQKKyAqLworc3RhdGljIEJPT0wgbGRtX3BhcnNlX3ZvbDUgKGNvbnN0IHU4ICpidWZmZXIsIGludCBidWZsZW4sIHN0cnVjdCB2YmxrICp2YikKK3sKKwlpbnQgcl9vYmppZCwgcl9uYW1lLCByX3Z0eXBlLCByX2NoaWxkLCByX3NpemUsIHJfaWQxLCByX2lkMiwgcl9zaXplMjsKKwlpbnQgcl9kcml2ZSwgbGVuOworCXN0cnVjdCB2YmxrX3ZvbHUgKnZvbHU7CisKKwlCVUdfT04gKCFidWZmZXIgfHwgIXZiKTsKKworCXJfb2JqaWQgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgMCk7CisJcl9uYW1lICAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCByX29iamlkKTsKKwlyX3Z0eXBlICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MTgsIHJfbmFtZSk7CisJcl9jaGlsZCAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDJFLCByX3Z0eXBlKTsKKwlyX3NpemUgICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4M0UsIHJfY2hpbGQpOworCisJaWYgKGJ1ZmZlclsweDEyXSAmIFZCTEtfRkxBR19WT0xVX0lEMSkKKwkJcl9pZDEgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDUzLCByX3NpemUpOworCWVsc2UKKwkJcl9pZDEgPSByX3NpemU7CisKKwlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfSUQyKQorCQlyX2lkMiA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4NTMsIHJfaWQxKTsKKwllbHNlCisJCXJfaWQyID0gcl9pZDE7CisKKwlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfU0laRSkKKwkJcl9zaXplMiA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4NTMsIHJfaWQyKTsKKwllbHNlCisJCXJfc2l6ZTIgPSByX2lkMjsKKworCWlmIChidWZmZXJbMHgxMl0gJiBWQkxLX0ZMQUdfVk9MVV9EUklWRSkKKwkJcl9kcml2ZSA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4NTMsIHJfc2l6ZTIpOworCWVsc2UKKwkJcl9kcml2ZSA9IHJfc2l6ZTI7CisKKwlsZW4gPSByX2RyaXZlOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gRkFMU0U7CisKKwlsZW4gKz0gVkJMS19TSVpFX1ZPTDU7CisJaWYgKGxlbiAhPSBCRTMyIChidWZmZXIgKyAweDE0KSkKKwkJcmV0dXJuIEZBTFNFOworCisJdm9sdSA9ICZ2Yi0+dmJsay52b2x1OworCisJbGRtX2dldF92c3RyIChidWZmZXIgKyAweDE4ICsgcl9uYW1lLCAgdm9sdS0+dm9sdW1lX3R5cGUsCisJCXNpemVvZiAodm9sdS0+dm9sdW1lX3R5cGUpKTsKKwltZW1jcHkgKHZvbHUtPnZvbHVtZV9zdGF0ZSwgYnVmZmVyICsgMHgxOSArIHJfdnR5cGUsCisJCQlzaXplb2YgKHZvbHUtPnZvbHVtZV9zdGF0ZSkpOworCXZvbHUtPnNpemUgPSBsZG1fZ2V0X3ZudW0gKGJ1ZmZlciArIDB4M0UgKyByX2NoaWxkKTsKKwl2b2x1LT5wYXJ0aXRpb25fdHlwZSA9IGJ1ZmZlclsweDQyICsgcl9zaXplXTsKKwltZW1jcHkgKHZvbHUtPmd1aWQsIGJ1ZmZlciArIDB4NDMgKyByX3NpemUsICBzaXplb2YgKHZvbHUtPmd1aWQpKTsKKwlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfRFJJVkUpIHsKKwkJbGRtX2dldF92c3RyIChidWZmZXIgKyAweDUzICsgcl9zaXplLCAgdm9sdS0+ZHJpdmVfaGludCwKKwkJCXNpemVvZiAodm9sdS0+ZHJpdmVfaGludCkpOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBsZG1fcGFyc2VfdmJsayAtIFJlYWQgYSByYXcgVkJMSyBvYmplY3QgaW50byBhIHZibGsgc3RydWN0dXJlCisgKiBAYnVmOiAgQmxvY2sgb2YgZGF0YSBiZWluZyB3b3JrZWQgb24KKyAqIEBsZW46ICBTaXplIG9mIHRoZSBibG9jayBvZiBkYXRhCisgKiBAdmI6ICAgSW4tbWVtb3J5IHZibGsgaW4gd2hpY2ggdG8gcmV0dXJuIGluZm9ybWF0aW9uCisgKgorICogUmVhZCBhIHJhdyBWQkxLIG9iamVjdCBpbnRvIGEgdmJsayBzdHJ1Y3R1cmUuICBUaGlzIGZ1bmN0aW9uIGp1c3QgcmVhZHMgdGhlCisgKiBpbmZvcm1hdGlvbiBjb21tb24gdG8gYWxsIFZCTEsgdHlwZXMsIHRoZW4gZGVsZWdhdGVzIHRoZSByZXN0IG9mIHRoZSB3b3JrIHRvCisgKiBoZWxwZXIgZnVuY3Rpb25zOiBsZG1fcGFyc2VfKi4KKyAqCisgKiBSZXR1cm46ICBUUlVFICAgQHZiIGNvbnRhaW5zIGEgVkJMSworICogICAgICAgICAgRkFMU0UgIEB2YiBjb250ZW50cyBhcmUgbm90IGRlZmluZWQKKyAqLworc3RhdGljIEJPT0wgbGRtX3BhcnNlX3ZibGsgKGNvbnN0IHU4ICpidWYsIGludCBsZW4sIHN0cnVjdCB2YmxrICp2YikKK3sKKwlCT09MIHJlc3VsdCA9IEZBTFNFOworCWludCByX29iamlkOworCisJQlVHX09OICghYnVmIHx8ICF2Yik7CisKKwlyX29iamlkID0gbGRtX3JlbGF0aXZlIChidWYsIGxlbiwgMHgxOCwgMCk7CisJaWYgKHJfb2JqaWQgPCAwKSB7CisJCWxkbV9lcnJvciAoIlZCTEsgaGVhZGVyIGlzIGNvcnJ1cHQuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwl2Yi0+ZmxhZ3MgID0gYnVmWzB4MTJdOworCXZiLT50eXBlICAgPSBidWZbMHgxM107CisJdmItPm9ial9pZCA9IGxkbV9nZXRfdm51bSAoYnVmICsgMHgxOCk7CisJbGRtX2dldF92c3RyIChidWYrMHgxOCtyX29iamlkLCB2Yi0+bmFtZSwgc2l6ZW9mICh2Yi0+bmFtZSkpOworCisJc3dpdGNoICh2Yi0+dHlwZSkgeworCQljYXNlIFZCTEtfQ01QMzogIHJlc3VsdCA9IGxkbV9wYXJzZV9jbXAzIChidWYsIGxlbiwgdmIpOyBicmVhazsKKwkJY2FzZSBWQkxLX0RTSzM6ICByZXN1bHQgPSBsZG1fcGFyc2VfZHNrMyAoYnVmLCBsZW4sIHZiKTsgYnJlYWs7CisJCWNhc2UgVkJMS19EU0s0OiAgcmVzdWx0ID0gbGRtX3BhcnNlX2RzazQgKGJ1ZiwgbGVuLCB2Yik7IGJyZWFrOworCQljYXNlIFZCTEtfREdSMzogIHJlc3VsdCA9IGxkbV9wYXJzZV9kZ3IzIChidWYsIGxlbiwgdmIpOyBicmVhazsKKwkJY2FzZSBWQkxLX0RHUjQ6ICByZXN1bHQgPSBsZG1fcGFyc2VfZGdyNCAoYnVmLCBsZW4sIHZiKTsgYnJlYWs7CisJCWNhc2UgVkJMS19QUlQzOiAgcmVzdWx0ID0gbGRtX3BhcnNlX3BydDMgKGJ1ZiwgbGVuLCB2Yik7IGJyZWFrOworCQljYXNlIFZCTEtfVk9MNTogIHJlc3VsdCA9IGxkbV9wYXJzZV92b2w1IChidWYsIGxlbiwgdmIpOyBicmVhazsKKwl9CisKKwlpZiAocmVzdWx0KQorCQlsZG1fZGVidWcgKCJQYXJzZWQgVkJMSyAweCVsbHggKHR5cGU6IDB4JTAyeCkgb2suIiwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKSB2Yi0+b2JqX2lkLCB2Yi0+dHlwZSk7CisJZWxzZQorCQlsZG1fZXJyb3IgKCJGYWlsZWQgdG8gcGFyc2UgVkJMSyAweCVsbHggKHR5cGU6IDB4JTAyeCkuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHZiLT5vYmpfaWQsIHZiLT50eXBlKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoqCisgKiBsZG1fbGRtZGJfYWRkIC0gQWRkcyBhIHJhdyBWQkxLIGVudHJ5IHRvIHRoZSBsZG1kYiBkYXRhYmFzZQorICogQGRhdGE6ICBSYXcgVkJMSyB0byBhZGQgdG8gdGhlIGRhdGFiYXNlCisgKiBAbGVuOiAgIFNpemUgb2YgdGhlIHJhdyBWQkxLCisgKiBAbGRiOiAgIENhY2hlIG9mIHRoZSBkYXRhYmFzZSBzdHJ1Y3R1cmVzCisgKgorICogVGhlIFZCTEtzIGFyZSBzb3J0ZWQgaW50byBjYXRlZ29yaWVzLiAgUGFydGl0aW9ucyBhcmUgYWxzbyBzb3J0ZWQgYnkgb2Zmc2V0LgorICoKKyAqIE4uQi4gIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBWQkxLcy4KKyAqCisgKiBSZXR1cm46ICBUUlVFICAgVGhlIFZCTEsgd2FzIGFkZGVkCisgKiAgICAgICAgICBGQUxTRSAgQW4gZXJyb3Igb2NjdXJyZWQKKyAqLworc3RhdGljIEJPT0wgbGRtX2xkbWRiX2FkZCAodTggKmRhdGEsIGludCBsZW4sIHN0cnVjdCBsZG1kYiAqbGRiKQoreworCXN0cnVjdCB2YmxrICp2YjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtOworCisJQlVHX09OICghZGF0YSB8fCAhbGRiKTsKKworCXZiID0ga21hbGxvYyAoc2l6ZW9mICgqdmIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZiKSB7CisJCWxkbV9jcml0ICgiT3V0IG9mIG1lbW9yeS4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmICghbGRtX3BhcnNlX3ZibGsgKGRhdGEsIGxlbiwgdmIpKSB7CisJCWtmcmVlKHZiKTsKKwkJcmV0dXJuIEZBTFNFOwkJCS8qIEFscmVhZHkgbG9nZ2VkICovCisJfQorCisJLyogUHV0IHZibGsgaW50byB0aGUgY29ycmVjdCBsaXN0LiAqLworCXN3aXRjaCAodmItPnR5cGUpIHsKKwljYXNlIFZCTEtfREdSMzoKKwljYXNlIFZCTEtfREdSNDoKKwkJbGlzdF9hZGQgKCZ2Yi0+bGlzdCwgJmxkYi0+dl9kZ3JwKTsKKwkJYnJlYWs7CisJY2FzZSBWQkxLX0RTSzM6CisJY2FzZSBWQkxLX0RTSzQ6CisJCWxpc3RfYWRkICgmdmItPmxpc3QsICZsZGItPnZfZGlzayk7CisJCWJyZWFrOworCWNhc2UgVkJMS19WT0w1OgorCQlsaXN0X2FkZCAoJnZiLT5saXN0LCAmbGRiLT52X3ZvbHUpOworCQlicmVhazsKKwljYXNlIFZCTEtfQ01QMzoKKwkJbGlzdF9hZGQgKCZ2Yi0+bGlzdCwgJmxkYi0+dl9jb21wKTsKKwkJYnJlYWs7CisJY2FzZSBWQkxLX1BSVDM6CisJCS8qIFNvcnQgYnkgdGhlIHBhcnRpdGlvbidzIHN0YXJ0IHNlY3Rvci4gKi8KKwkJbGlzdF9mb3JfZWFjaCAoaXRlbSwgJmxkYi0+dl9wYXJ0KSB7CisJCQlzdHJ1Y3QgdmJsayAqdiA9IGxpc3RfZW50cnkgKGl0ZW0sIHN0cnVjdCB2YmxrLCBsaXN0KTsKKwkJCWlmICgodi0+dmJsay5wYXJ0LmRpc2tfaWQgPT0gdmItPnZibGsucGFydC5kaXNrX2lkKSAmJgorCQkJICAgICh2LT52YmxrLnBhcnQuc3RhcnQgPiB2Yi0+dmJsay5wYXJ0LnN0YXJ0KSkgeworCQkJCWxpc3RfYWRkX3RhaWwgKCZ2Yi0+bGlzdCwgJnYtPmxpc3QpOworCQkJCXJldHVybiBUUlVFOworCQkJfQorCQl9CisJCWxpc3RfYWRkX3RhaWwgKCZ2Yi0+bGlzdCwgJmxkYi0+dl9wYXJ0KTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBUUlVFOworfQorCisvKioKKyAqIGxkbV9mcmFnX2FkZCAtIEFkZCBhIFZCTEsgZnJhZ21lbnQgdG8gYSBsaXN0CisgKiBAZGF0YTogICBSYXcgZnJhZ21lbnQgdG8gYmUgYWRkZWQgdG8gdGhlIGxpc3QKKyAqIEBzaXplOiAgIFNpemUgb2YgdGhlIHJhdyBmcmFnbWVudAorICogQGZyYWdzOiAgTGlua2VkIGxpc3Qgb2YgVkJMSyBmcmFnbWVudHMKKyAqCisgKiBGcmFnbWVudGVkIFZCTEtzIG1heSBub3QgYmUgY29uc2VjdXRpdmUgaW4gdGhlIGRhdGFiYXNlLCBzbyB0aGV5IGFyZSBwbGFjZWQKKyAqIGluIGEgbGlzdCBzbyB0aGV5IGNhbiBiZSBwaWVjZWQgdG9nZXRoZXIgbGF0ZXIuCisgKgorICogUmV0dXJuOiAgVFJVRSAgIFN1Y2Nlc3MsIHRoZSBWQkxLIHdhcyBhZGRlZCB0byB0aGUgbGlzdAorICogICAgICAgICAgRkFMU0UgIEVycm9yLCBhIHByb2JsZW0gb2NjdXJyZWQKKyAqLworc3RhdGljIEJPT0wgbGRtX2ZyYWdfYWRkIChjb25zdCB1OCAqZGF0YSwgaW50IHNpemUsIHN0cnVjdCBsaXN0X2hlYWQgKmZyYWdzKQoreworCXN0cnVjdCBmcmFnICpmOworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisJaW50IHJlYywgbnVtLCBncm91cDsKKworCUJVR19PTiAoIWRhdGEgfHwgIWZyYWdzKTsKKworCWdyb3VwID0gQkUzMiAoZGF0YSArIDB4MDgpOworCXJlYyAgID0gQkUxNiAoZGF0YSArIDB4MEMpOworCW51bSAgID0gQkUxNiAoZGF0YSArIDB4MEUpOworCWlmICgobnVtIDwgMSkgfHwgKG51bSA+IDQpKSB7CisJCWxkbV9lcnJvciAoIkEgVkJMSyBjbGFpbXMgdG8gaGF2ZSAlZCBwYXJ0cy4iLCBudW0pOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJbGlzdF9mb3JfZWFjaCAoaXRlbSwgZnJhZ3MpIHsKKwkJZiA9IGxpc3RfZW50cnkgKGl0ZW0sIHN0cnVjdCBmcmFnLCBsaXN0KTsKKwkJaWYgKGYtPmdyb3VwID09IGdyb3VwKQorCQkJZ290byBmb3VuZDsKKwl9CisKKwlmID0ga21hbGxvYyAoc2l6ZW9mICgqZikgKyBzaXplKm51bSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmKSB7CisJCWxkbV9jcml0ICgiT3V0IG9mIG1lbW9yeS4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWYtPmdyb3VwID0gZ3JvdXA7CisJZi0+bnVtICAgPSBudW07CisJZi0+cmVjICAgPSByZWM7CisJZi0+bWFwICAgPSAweEZGIDw8IG51bTsKKworCWxpc3RfYWRkX3RhaWwgKCZmLT5saXN0LCBmcmFncyk7Citmb3VuZDoKKwlpZiAoZi0+bWFwICYgKDEgPDwgcmVjKSkgeworCQlsZG1fZXJyb3IgKCJEdXBsaWNhdGUgVkJMSywgcGFydCAlZC4iLCByZWMpOworCQlmLT5tYXAgJj0gMHg3RjsJCQkvKiBNYXJrIHRoZSBncm91cCBhcyBicm9rZW4gKi8KKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWYtPm1hcCB8PSAoMSA8PCByZWMpOworCisJaWYgKG51bSA+IDApIHsKKwkJZGF0YSArPSBWQkxLX1NJWkVfSEVBRDsKKwkJc2l6ZSAtPSBWQkxLX1NJWkVfSEVBRDsKKwl9CisJbWVtY3B5IChmLT5kYXRhK3JlYyooc2l6ZS1WQkxLX1NJWkVfSEVBRCkrVkJMS19TSVpFX0hFQUQsIGRhdGEsIHNpemUpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogbGRtX2ZyYWdfZnJlZSAtIEZyZWUgYSBsaW5rZWQgbGlzdCBvZiBWQkxLIGZyYWdtZW50cworICogQGxpc3Q6ICBMaW5rZWQgbGlzdCBvZiBmcmFnbWVudHMKKyAqCisgKiBGcmVlIGEgbGlua2VkIGxpc3Qgb2YgVkJMSyBmcmFnbWVudHMKKyAqCisgKiBSZXR1cm46ICBub25lCisgKi8KK3N0YXRpYyB2b2lkIGxkbV9mcmFnX2ZyZWUgKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaXRlbSwgKnRtcDsKKworCUJVR19PTiAoIWxpc3QpOworCisJbGlzdF9mb3JfZWFjaF9zYWZlIChpdGVtLCB0bXAsIGxpc3QpCisJCWtmcmVlIChsaXN0X2VudHJ5IChpdGVtLCBzdHJ1Y3QgZnJhZywgbGlzdCkpOworfQorCisvKioKKyAqIGxkbV9mcmFnX2NvbW1pdCAtIFZhbGlkYXRlIGZyYWdtZW50ZWQgVkJMS3MgYW5kIGFkZCB0aGVtIHRvIHRoZSBkYXRhYmFzZQorICogQGZyYWdzOiAgTGlua2VkIGxpc3Qgb2YgVkJMSyBmcmFnbWVudHMKKyAqIEBsZGI6ICAgIENhY2hlIG9mIHRoZSBkYXRhYmFzZSBzdHJ1Y3R1cmVzCisgKgorICogTm93IHRoYXQgYWxsIHRoZSBmcmFnbWVudGVkIFZCTEtzIGhhdmUgYmVlbiBjb2xsZWN0ZWQsIHRoZXkgbXVzdCBiZSBhZGRlZCB0bworICogdGhlIGRhdGFiYXNlIGZvciBsYXRlciB1c2UuCisgKgorICogUmV0dXJuOiAgVFJVRSAgIEFsbCB0aGUgZnJhZ21lbnRzIHdlIGFkZGVkIHN1Y2Nlc3NmdWxseQorICogICAgICAgICAgRkFMU0UgIE9uZSBvciBtb3JlIG9mIHRoZSBmcmFnbWVudHMgd2UgaW52YWxpZAorICovCitzdGF0aWMgQk9PTCBsZG1fZnJhZ19jb21taXQgKHN0cnVjdCBsaXN0X2hlYWQgKmZyYWdzLCBzdHJ1Y3QgbGRtZGIgKmxkYikKK3sKKwlzdHJ1Y3QgZnJhZyAqZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtOworCisJQlVHX09OICghZnJhZ3MgfHwgIWxkYik7CisKKwlsaXN0X2Zvcl9lYWNoIChpdGVtLCBmcmFncykgeworCQlmID0gbGlzdF9lbnRyeSAoaXRlbSwgc3RydWN0IGZyYWcsIGxpc3QpOworCisJCWlmIChmLT5tYXAgIT0gMHhGRikgeworCQkJbGRtX2Vycm9yICgiVkJMSyBncm91cCAlZCBpcyBpbmNvbXBsZXRlICgweCUwMngpLiIsCisJCQkJZi0+Z3JvdXAsIGYtPm1hcCk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKworCQlpZiAoIWxkbV9sZG1kYl9hZGQgKGYtPmRhdGEsIGYtPm51bSpsZGItPnZtLnZibGtfc2l6ZSwgbGRiKSkKKwkJCXJldHVybiBGQUxTRTsJCS8qIEFscmVhZHkgbG9nZ2VkICovCisJfQorCXJldHVybiBUUlVFOworfQorCisvKioKKyAqIGxkbV9nZXRfdmJsa3MgLSBSZWFkIHRoZSBvbi1kaXNrIGRhdGFiYXNlIG9mIFZCTEtzIGludG8gbWVtb3J5CisgKiBAYmRldjogIERldmljZSBob2xkaW5nIHRoZSBMRE0gRGF0YWJhc2UKKyAqIEBiYXNlOiAgT2Zmc2V0LCBpbnRvIEBiZGV2LCBvZiB0aGUgZGF0YWJhc2UKKyAqIEBsZGI6ICAgQ2FjaGUgb2YgdGhlIGRhdGFiYXNlIHN0cnVjdHVyZXMKKyAqCisgKiBUbyB1c2UgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIFZCTEtzLCB0aGV5IG5lZWQgdG8gYmUgcmVhZCBmcm9tIHRoZSBkaXNrLAorICogdW5wYWNrZWQgYW5kIHZhbGlkYXRlZC4gIFdlIGNhY2hlIHRoZW0gaW4gQGxkYiBhY2NvcmRpbmcgdG8gdGhlaXIgdHlwZS4KKyAqCisgKiBSZXR1cm46ICBUUlVFICAgQWxsIHRoZSBWQkxLcyB3ZXJlIHJlYWQgc3VjY2Vzc2Z1bGx5CisgKiAgICAgICAgICBGQUxTRSAgQW4gZXJyb3Igb2NjdXJyZWQKKyAqLworc3RhdGljIEJPT0wgbGRtX2dldF92YmxrcyAoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdW5zaWduZWQgbG9uZyBiYXNlLAorCQkJICAgc3RydWN0IGxkbWRiICpsZGIpCit7CisJaW50IHNpemUsIHBlcmJ1Ziwgc2tpcCwgZmluaXNoLCBzLCB2LCByZWNzOworCXU4ICpkYXRhID0gTlVMTDsKKwlTZWN0b3Igc2VjdDsKKwlCT09MIHJlc3VsdCA9IEZBTFNFOworCUxJU1RfSEVBRCAoZnJhZ3MpOworCisJQlVHX09OICghYmRldiB8fCAhbGRiKTsKKworCXNpemUgICA9IGxkYi0+dm0udmJsa19zaXplOworCXBlcmJ1ZiA9IDUxMiAvIHNpemU7CisJc2tpcCAgID0gbGRiLT52bS52YmxrX29mZnNldCA+PiA5OwkJLyogQnl0ZXMgdG8gc2VjdG9ycyAqLworCWZpbmlzaCA9IChzaXplICogbGRiLT52bS5sYXN0X3ZibGtfc2VxKSA+PiA5OworCisJZm9yIChzID0gc2tpcDsgcyA8IGZpbmlzaDsgcysrKSB7CQkvKiBGb3IgZWFjaCBzZWN0b3IgKi8KKwkJZGF0YSA9IHJlYWRfZGV2X3NlY3RvciAoYmRldiwgYmFzZSArIE9GRl9WTURCICsgcywgJnNlY3QpOworCQlpZiAoIWRhdGEpIHsKKwkJCWxkbV9jcml0ICgiRGlzayByZWFkIGZhaWxlZC4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZm9yICh2ID0gMDsgdiA8IHBlcmJ1ZjsgdisrLCBkYXRhKz1zaXplKSB7ICAvKiBGb3IgZWFjaCB2YmxrICovCisJCQlpZiAoTUFHSUNfVkJMSyAhPSBCRTMyIChkYXRhKSkgeworCQkJCWxkbV9lcnJvciAoIkV4cGVjdGVkIHRvIGZpbmQgYSBWQkxLLiIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlyZWNzID0gQkUxNiAoZGF0YSArIDB4MEUpOwkvKiBOdW1iZXIgb2YgcmVjb3JkcyAqLworCQkJaWYgKHJlY3MgPT0gMSkgeworCQkJCWlmICghbGRtX2xkbWRiX2FkZCAoZGF0YSwgc2l6ZSwgbGRiKSkKKwkJCQkJZ290byBvdXQ7CS8qIEFscmVhZHkgbG9nZ2VkICovCisJCQl9IGVsc2UgaWYgKHJlY3MgPiAxKSB7CisJCQkJaWYgKCFsZG1fZnJhZ19hZGQgKGRhdGEsIHNpemUsICZmcmFncykpCisJCQkJCWdvdG8gb3V0OwkvKiBBbHJlYWR5IGxvZ2dlZCAqLworCQkJfQorCQkJLyogZWxzZSBSZWNvcmQgaXMgbm90IGluIHVzZSwgaWdub3JlIGl0LiAqLworCQl9CisJCXB1dF9kZXZfc2VjdG9yIChzZWN0KTsKKwkJZGF0YSA9IE5VTEw7CisJfQorCisJcmVzdWx0ID0gbGRtX2ZyYWdfY29tbWl0ICgmZnJhZ3MsIGxkYik7CS8qIEZhaWx1cmVzLCBhbHJlYWR5IGxvZ2dlZCAqLworb3V0OgorCWlmIChkYXRhKQorCQlwdXRfZGV2X3NlY3RvciAoc2VjdCk7CisJbGRtX2ZyYWdfZnJlZSAoJmZyYWdzKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogbGRtX2ZyZWVfdmJsa3MgLSBGcmVlIGEgbGlua2VkIGxpc3Qgb2YgdmJsaydzCisgKiBAbGg6ICBIZWFkIG9mIGEgbGlua2VkIGxpc3Qgb2Ygc3RydWN0IHZibGsKKyAqCisgKiBGcmVlIGEgbGlzdCBvZiB2YmxrJ3MgYW5kIGZyZWUgdGhlIG1lbW9yeSB1c2VkIHRvIG1haW50YWluIHRoZSBsaXN0LgorICoKKyAqIFJldHVybjogIG5vbmUKKyAqLworc3RhdGljIHZvaWQgbGRtX2ZyZWVfdmJsa3MgKHN0cnVjdCBsaXN0X2hlYWQgKmxoKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW0sICp0bXA7CisKKwlCVUdfT04gKCFsaCk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUgKGl0ZW0sIHRtcCwgbGgpCisJCWtmcmVlIChsaXN0X2VudHJ5IChpdGVtLCBzdHJ1Y3QgdmJsaywgbGlzdCkpOworfQorCisKKy8qKgorICogbGRtX3BhcnRpdGlvbiAtIEZpbmQgb3V0IHdoZXRoZXIgYSBkZXZpY2UgaXMgYSBkeW5hbWljIGRpc2sgYW5kIGhhbmRsZSBpdAorICogQHBwOiAgICBMaXN0IG9mIHRoZSBwYXJ0aXRpb25zIHBhcnNlZCBzbyBmYXIKKyAqIEBiZGV2OiAgRGV2aWNlIGhvbGRpbmcgdGhlIExETSBEYXRhYmFzZQorICoKKyAqIFRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkZXZpY2UgQGJkZXYgaXMgYSBkeW5hbWljIGRpc2sgYW5kIGlmIHNvIGNyZWF0ZXMKKyAqIHRoZSBwYXJ0aXRpb25zIG5lY2Vzc2FyeSBpbiB0aGUgZ2VuZGlzayBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSBAaGQuCisgKgorICogV2UgY3JlYXRlIGEgZHVtbXkgZGV2aWNlIDEsIHdoaWNoIGNvbnRhaW5zIHRoZSBMRE0gZGF0YWJhc2UsIGFuZCB0aGVuIGNyZWF0ZQorICogZWFjaCBwYXJ0aXRpb24gZGVzY3JpYmVkIGJ5IHRoZSBMRE0gZGF0YWJhc2UgaW4gc2VxdWVuY2UgYXMgZGV2aWNlcyAyKy4gRm9yCisgKiBleGFtcGxlLCBpZiB0aGUgZGV2aWNlIGlzIGhkYSwgd2Ugd291bGQgaGF2ZTogaGRhMTogTERNIGRhdGFiYXNlLCBoZGEyLCBoZGEzLAorICogYW5kIHNvIG9uOiB0aGUgYWN0dWFsIGRhdGEgY29udGFpbmluZyBwYXJ0aXRpb25zLgorICoKKyAqIFJldHVybjogIDEgU3VjY2VzcywgQGJkZXYgaXMgYSBkeW5hbWljIGRpc2sgYW5kIHdlIGhhbmRsZWQgaXQKKyAqICAgICAgICAgIDAgU3VjY2VzcywgQGJkZXYgaXMgbm90IGEgZHluYW1pYyBkaXNrCisgKiAgICAgICAgIC0xIEFuIGVycm9yIG9jY3VycmVkIGJlZm9yZSBlbm91Z2ggaW5mb3JtYXRpb24gaGFkIGJlZW4gcmVhZAorICogICAgICAgICAgICBPciBAYmRldiBpcyBhIGR5bmFtaWMgZGlzaywgYnV0IGl0IG1heSBiZSBjb3JydXB0ZWQKKyAqLworaW50IGxkbV9wYXJ0aXRpb24gKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqcHAsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJc3RydWN0IGxkbWRiICAqbGRiOworCXVuc2lnbmVkIGxvbmcgYmFzZTsKKwlpbnQgcmVzdWx0ID0gLTE7CisKKwlCVUdfT04gKCFwcCB8fCAhYmRldik7CisKKwkvKiBMb29rIGZvciBzaWducyBvZiBhIER5bmFtaWMgRGlzayAqLworCWlmICghbGRtX3ZhbGlkYXRlX3BhcnRpdGlvbl90YWJsZSAoYmRldikpCisJCXJldHVybiAwOworCisJbGRiID0ga21hbGxvYyAoc2l6ZW9mICgqbGRiKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsZGIpIHsKKwkJbGRtX2NyaXQgKCJPdXQgb2YgbWVtb3J5LiIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBQYXJzZSBhbmQgY2hlY2sgcHJpdmhlYWRzLiAqLworCWlmICghbGRtX3ZhbGlkYXRlX3ByaXZoZWFkcyAoYmRldiwgJmxkYi0+cGgpKQorCQlnb3RvIG91dDsJCS8qIEFscmVhZHkgbG9nZ2VkICovCisKKwkvKiBBbGwgZnVydGhlciByZWZlcmVuY2VzIGFyZSByZWxhdGl2ZSB0byBiYXNlIChkYXRhYmFzZSBzdGFydCkuICovCisJYmFzZSA9IGxkYi0+cGguY29uZmlnX3N0YXJ0OworCisJLyogUGFyc2UgYW5kIGNoZWNrIHRvY3MgYW5kIHZtZGIuICovCisJaWYgKCFsZG1fdmFsaWRhdGVfdG9jYmxvY2tzIChiZGV2LCBiYXNlLCBsZGIpIHx8CisJICAgICFsZG1fdmFsaWRhdGVfdm1kYiAgICAgIChiZGV2LCBiYXNlLCBsZGIpKQorCSAgICAJZ290byBvdXQ7CQkvKiBBbHJlYWR5IGxvZ2dlZCAqLworCisJLyogSW5pdGlhbGl6ZSB2YmxrIGxpc3RzIGluIGxkbWRiIHN0cnVjdCAqLworCUlOSVRfTElTVF9IRUFEICgmbGRiLT52X2RncnApOworCUlOSVRfTElTVF9IRUFEICgmbGRiLT52X2Rpc2spOworCUlOSVRfTElTVF9IRUFEICgmbGRiLT52X3ZvbHUpOworCUlOSVRfTElTVF9IRUFEICgmbGRiLT52X2NvbXApOworCUlOSVRfTElTVF9IRUFEICgmbGRiLT52X3BhcnQpOworCisJaWYgKCFsZG1fZ2V0X3ZibGtzIChiZGV2LCBiYXNlLCBsZGIpKSB7CisJCWxkbV9jcml0ICgiRmFpbGVkIHRvIHJlYWQgdGhlIFZCTEtzIGZyb20gdGhlIGRhdGFiYXNlLiIpOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogRmluYWxseSwgY3JlYXRlIHRoZSBkYXRhIHBhcnRpdGlvbiBkZXZpY2VzLiAqLworCWlmIChsZG1fY3JlYXRlX2RhdGFfcGFydGl0aW9ucyAocHAsIGxkYikpIHsKKwkJbGRtX2RlYnVnICgiUGFyc2VkIExETSBkYXRhYmFzZSBzdWNjZXNzZnVsbHkuIik7CisJCXJlc3VsdCA9IDE7CisJfQorCS8qIGVsc2UgQWxyZWFkeSBsb2dnZWQgKi8KKworY2xlYW51cDoKKwlsZG1fZnJlZV92YmxrcyAoJmxkYi0+dl9kZ3JwKTsKKwlsZG1fZnJlZV92YmxrcyAoJmxkYi0+dl9kaXNrKTsKKwlsZG1fZnJlZV92YmxrcyAoJmxkYi0+dl92b2x1KTsKKwlsZG1fZnJlZV92YmxrcyAoJmxkYi0+dl9jb21wKTsKKwlsZG1fZnJlZV92YmxrcyAoJmxkYi0+dl9wYXJ0KTsKK291dDoKKwlrZnJlZSAobGRiKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2xkbS5oIGIvZnMvcGFydGl0aW9ucy9sZG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZThkNzk1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcGFydGl0aW9ucy9sZG0uaApAQCAtMCwwICsxLDIyMCBAQAorLyoqCisgKiBsZG0gLSBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLDIwMDIgUmljaGFyZCBSdXNzb24gPGxkbUBmbGF0Y2FwLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMSAgICAgIEFudG9uIEFsdGFwYXJtYWtvdiA8YWlhMjFAY2FudGFiLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIEpha29iIEtlbWkgPGpha29iLmtlbWlAdGVsaWEuY29tPgorICoKKyAqIERvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly9saW51eC1udGZzLnNmLm5ldC9sZG0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMgc291cmNlCisgKiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0ZTX1BUX0xETV9IXworI2RlZmluZSBfRlNfUFRfTERNX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zOworCisvKiBNYWdpYyBudW1iZXJzIGluIENQVSBmb3JtYXQuICovCisjZGVmaW5lIE1BR0lDX1ZNREIJMHg1NjRENDQ0MgkJLyogVk1EQiAqLworI2RlZmluZSBNQUdJQ19WQkxLCTB4NTY0MjRDNEIJCS8qIFZCTEsgKi8KKyNkZWZpbmUgTUFHSUNfUFJJVkhFQUQJMHg1MDUyNDk1NjQ4NDU0MTQ0VUxMCS8qIFBSSVZIRUFEICovCisjZGVmaW5lIE1BR0lDX1RPQ0JMT0NLCTB4NTQ0RjQzNDI0QzRGNDM0QlVMTAkvKiBUT0NCTE9DSyAqLworCisvKiBUaGUgZGVmaW5lZCB2YmxrIHR5cGVzLiAqLworI2RlZmluZSBWQkxLX1ZPTDUJCTB4NTEJCS8qIFZvbHVtZSwgICAgIHZlcnNpb24gNSAqLworI2RlZmluZSBWQkxLX0NNUDMJCTB4MzIJCS8qIENvbXBvbmVudCwgIHZlcnNpb24gMyAqLworI2RlZmluZSBWQkxLX1BSVDMJCTB4MzMJCS8qIFBhcnRpdGlvbiwgIHZlcnNpb24gMyAqLworI2RlZmluZSBWQkxLX0RTSzMJCTB4MzQJCS8qIERpc2ssICAgICAgIHZlcnNpb24gMyAqLworI2RlZmluZSBWQkxLX0RTSzQJCTB4NDQJCS8qIERpc2ssICAgICAgIHZlcnNpb24gNCAqLworI2RlZmluZSBWQkxLX0RHUjMJCTB4MzUJCS8qIERpc2sgR3JvdXAsIHZlcnNpb24gMyAqLworI2RlZmluZSBWQkxLX0RHUjQJCTB4NDUJCS8qIERpc2sgR3JvdXAsIHZlcnNpb24gNCAqLworCisvKiB2YmxrIGZsYWdzIGluZGljYXRpbmcgZXh0cmEgaW5mb3JtYXRpb24gd2lsbCBiZSBwcmVzZW50ICovCisjZGVmaW5lCVZCTEtfRkxBR19DT01QX1NUUklQRQkweDEwCisjZGVmaW5lCVZCTEtfRkxBR19QQVJUX0lOREVYCTB4MDgKKyNkZWZpbmUJVkJMS19GTEFHX0RHUjNfSURTCTB4MDgKKyNkZWZpbmUJVkJMS19GTEFHX0RHUjRfSURTCTB4MDgKKyNkZWZpbmUJVkJMS19GTEFHX1ZPTFVfSUQxCTB4MDgKKyNkZWZpbmUJVkJMS19GTEFHX1ZPTFVfSUQyCTB4MjAKKyNkZWZpbmUJVkJMS19GTEFHX1ZPTFVfU0laRQkweDgwCisjZGVmaW5lCVZCTEtfRkxBR19WT0xVX0RSSVZFCTB4MDIKKworLyogc2l6ZSBvZiBhIHZibGsncyBzdGF0aWMgcGFydHMgKi8KKyNkZWZpbmUgVkJMS19TSVpFX0hFQUQJCTE2CisjZGVmaW5lIFZCTEtfU0laRV9DTVAzCQkyMgkJLyogTmFtZSBhbmQgdmVyc2lvbiAqLworI2RlZmluZSBWQkxLX1NJWkVfREdSMwkJMTIKKyNkZWZpbmUgVkJMS19TSVpFX0RHUjQJCTQ0CisjZGVmaW5lIFZCTEtfU0laRV9EU0szCQkxMgorI2RlZmluZSBWQkxLX1NJWkVfRFNLNAkJNDUKKyNkZWZpbmUgVkJMS19TSVpFX1BSVDMJCTI4CisjZGVmaW5lIFZCTEtfU0laRV9WT0w1CQk1OQorCisvKiBjb21wb25lbnQgdHlwZXMgKi8KKyNkZWZpbmUgQ09NUF9TVFJJUEUJCTB4MDEJCS8qIFN0cmlwZS1zZXQgKi8KKyNkZWZpbmUgQ09NUF9CQVNJQwkJMHgwMgkJLyogQmFzaWMgZGlzayAqLworI2RlZmluZSBDT01QX1JBSUQJCTB4MDMJCS8qIFJhaWQtc2V0ICovCisKKy8qIE90aGVyIGNvbnN0YW50cy4gKi8KKyNkZWZpbmUgTERNX0RCX1NJWkUJCTIwNDgJCS8qIFNpemUgaW4gc2VjdG9ycyAoPSAxTWlCKS4gKi8KKworI2RlZmluZSBPRkZfUFJJVjEJCTYJCS8qIE9mZnNldCBvZiB0aGUgZmlyc3QgcHJpdmhlYWQKKwkJCQkJCSAgIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKKwkJCQkJCSAgIGRldmljZSBpbiBzZWN0b3JzICovCisKKy8qIE9mZnNldHMgdG8gc3RydWN0dXJlcyB3aXRoaW4gdGhlIExETSBEYXRhYmFzZSBpbiBzZWN0b3JzLiAqLworI2RlZmluZSBPRkZfUFJJVjIJCTE4NTYJCS8qIEJhY2t1cCBwcml2YXRlIGhlYWRlcnMuICovCisjZGVmaW5lIE9GRl9QUklWMwkJMjA0NworCisjZGVmaW5lIE9GRl9UT0NCMQkJMQkJLyogVGFibGVzIG9mIGNvbnRlbnRzLiAqLworI2RlZmluZSBPRkZfVE9DQjIJCTIKKyNkZWZpbmUgT0ZGX1RPQ0IzCQkyMDQ1CisjZGVmaW5lIE9GRl9UT0NCNAkJMjA0NgorCisjZGVmaW5lIE9GRl9WTURCCQkxNwkJLyogTGlzdCBvZiBwYXJ0aXRpb25zLiAqLworCisjZGVmaW5lIFdJTjJLX0RZTkFNSUNfUEFSVElUSU9OCTB4NDIJCS8qIEZvcm1lcmx5IFNGUyAoTGFuZGlzKS4gKi8KKworI2RlZmluZSBUT0NfQklUTUFQMQkJImNvbmZpZyIJLyogTmFtZXMgb2YgdGhlIHR3byBkZWZpbmVkICovCisjZGVmaW5lIFRPQ19CSVRNQVAyCQkibG9nIgkJLyogYml0bWFwcyBpbiB0aGUgVE9DQkxPQ0suICovCisKKy8qIE1vc3QgbnVtYmVycyB3ZSBkZWFsIHdpdGggYXJlIGJpZy1lbmRpYW4gYW5kIHdvbid0IGJlIGFsaWduZWQuICovCisjZGVmaW5lIEJFMTYoeCkJCQkoKHUxNiliZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX2JlMTYqKSh4KSkpKQorI2RlZmluZSBCRTMyKHgpCQkJKCh1MzIpYmUzMl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoX19iZTMyKikoeCkpKSkKKyNkZWZpbmUgQkU2NCh4KQkJCSgodTY0KWJlNjRfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fYmU2NCopKHgpKSkpCisKKy8qIEJvcnJvd2VkIGZyb20gbXNkb3MuYyAqLworI2RlZmluZSBTWVNfSU5EKHApCQkoZ2V0X3VuYWxpZ25lZCgmKHApLT5zeXNfaW5kKSkKKworc3RydWN0IGZyYWcgewkJCQkvKiBWQkxLIEZyYWdtZW50IGhhbmRsaW5nICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXUzMgkJZ3JvdXA7CisJdTgJCW51bTsJCS8qIFRvdGFsIG51bWJlciBvZiByZWNvcmRzICovCisJdTgJCXJlYzsJCS8qIFRoaXMgaXMgcmVjb3JkIG51bWJlciBuICovCisJdTgJCW1hcDsJCS8qIFdoaWNoIHBvcnRpb25zIGFyZSBpbiB1c2UgKi8KKwl1OAkJZGF0YVswXTsKK307CisKKy8qIEluIG1lbW9yeSBMRE0gZGF0YWJhc2Ugc3RydWN0dXJlcy4gKi8KKworI2RlZmluZSBHVUlEX1NJWkUJCTE2CisKK3N0cnVjdCBwcml2aGVhZCB7CQkJLyogT2Zmc2V0cyBhbmQgc2l6ZXMgYXJlIGluIHNlY3RvcnMuICovCisJdTE2CXZlcl9tYWpvcjsKKwl1MTYJdmVyX21pbm9yOworCXU2NAlsb2dpY2FsX2Rpc2tfc3RhcnQ7CisJdTY0CWxvZ2ljYWxfZGlza19zaXplOworCXU2NAljb25maWdfc3RhcnQ7CisJdTY0CWNvbmZpZ19zaXplOworCXU4CWRpc2tfaWRbR1VJRF9TSVpFXTsKK307CisKK3N0cnVjdCB0b2NibG9jayB7CQkJLyogV2UgaGF2ZSBleGFjdGx5IHR3byBiaXRtYXBzLiAqLworCXU4CWJpdG1hcDFfbmFtZVsxNl07CisJdTY0CWJpdG1hcDFfc3RhcnQ7CisJdTY0CWJpdG1hcDFfc2l6ZTsKKwl1OAliaXRtYXAyX25hbWVbMTZdOworCXU2NAliaXRtYXAyX3N0YXJ0OworCXU2NAliaXRtYXAyX3NpemU7Cit9OworCitzdHJ1Y3Qgdm1kYiB7CQkJCS8qIFZNREI6IFRoZSBkYXRhYmFzZSBoZWFkZXIgKi8KKwl1MTYJdmVyX21ham9yOworCXUxNgl2ZXJfbWlub3I7CisJdTMyCXZibGtfc2l6ZTsKKwl1MzIJdmJsa19vZmZzZXQ7CisJdTMyCWxhc3RfdmJsa19zZXE7Cit9OworCitzdHJ1Y3QgdmJsa19jb21wIHsJCQkvKiBWQkxLIENvbXBvbmVudCAqLworCXU4CXN0YXRlWzE2XTsKKwl1NjQJcGFyZW50X2lkOworCXU4CXR5cGU7CisJdTgJY2hpbGRyZW47CisJdTE2CWNodW5rc2l6ZTsKK307CisKK3N0cnVjdCB2YmxrX2RncnAgewkJCS8qIFZCTEsgRGlzayBHcm91cCAqLworCXU4CWRpc2tfaWRbNjRdOworfTsKKworc3RydWN0IHZibGtfZGlzayB7CQkJLyogVkJMSyBEaXNrICovCisJdTgJZGlza19pZFtHVUlEX1NJWkVdOworCXU4CWFsdF9uYW1lWzEyOF07Cit9OworCitzdHJ1Y3QgdmJsa19wYXJ0IHsJCQkvKiBWQkxLIFBhcnRpdGlvbiAqLworCXU2NAlzdGFydDsKKwl1NjQJc2l6ZTsJCQkvKiBzdGFydCwgc2l6ZSBhbmQgdm9sX29mZiBpbiBzZWN0b3JzICovCisJdTY0CXZvbHVtZV9vZmZzZXQ7CisJdTY0CXBhcmVudF9pZDsKKwl1NjQJZGlza19pZDsKKwl1OAlwYXJ0bnVtOworfTsKKworc3RydWN0IHZibGtfdm9sdSB7CQkJLyogVkJMSyBWb2x1bWUgKi8KKwl1OAl2b2x1bWVfdHlwZVsxNl07CisJdTgJdm9sdW1lX3N0YXRlWzE2XTsKKwl1OAlndWlkWzE2XTsKKwl1OAlkcml2ZV9oaW50WzRdOworCXU2NAlzaXplOworCXU4CXBhcnRpdGlvbl90eXBlOworfTsKKworc3RydWN0IHZibGtfaGVhZCB7CQkJLyogVkJMSyBzdGFuZGFyZCBoZWFkZXIgKi8KKwl1MzIgZ3JvdXA7CisJdTE2IHJlYzsKKwl1MTYgbnJlYzsKK307CisKK3N0cnVjdCB2YmxrIHsJCQkJLyogR2VuZXJhbGlzZWQgVkJMSyAqLworCXU4CW5hbWVbNjRdOworCXU2NAlvYmpfaWQ7CisJdTMyCXNlcXVlbmNlOworCXU4CWZsYWdzOworCXU4CXR5cGU7CisJdW5pb24geworCQlzdHJ1Y3QgdmJsa19jb21wIGNvbXA7CisJCXN0cnVjdCB2YmxrX2RncnAgZGdycDsKKwkJc3RydWN0IHZibGtfZGlzayBkaXNrOworCQlzdHJ1Y3QgdmJsa19wYXJ0IHBhcnQ7CisJCXN0cnVjdCB2YmxrX3ZvbHUgdm9sdTsKKwl9IHZibGs7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworc3RydWN0IGxkbWRiIHsJCQkJLyogQ2FjaGUgb2YgdGhlIGRhdGFiYXNlICovCisJc3RydWN0IHByaXZoZWFkIHBoOworCXN0cnVjdCB0b2NibG9jayB0b2M7CisJc3RydWN0IHZtZGIgICAgIHZtOworCXN0cnVjdCBsaXN0X2hlYWQgdl9kZ3JwOworCXN0cnVjdCBsaXN0X2hlYWQgdl9kaXNrOworCXN0cnVjdCBsaXN0X2hlYWQgdl92b2x1OworCXN0cnVjdCBsaXN0X2hlYWQgdl9jb21wOworCXN0cnVjdCBsaXN0X2hlYWQgdl9wYXJ0OworfTsKKworaW50IGxkbV9wYXJ0aXRpb24gKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpOworCisjZW5kaWYgLyogX0ZTX1BUX0xETV9IXyAqLworCmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL21hYy5jIGIvZnMvcGFydGl0aW9ucy9tYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjIyY2RkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcGFydGl0aW9ucy9tYWMuYwpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqICBmcy9wYXJ0aXRpb25zL21hYy5jCisgKgorICogIENvZGUgZXh0cmFjdGVkIGZyb20gZHJpdmVycy9ibG9jay9nZW5oZC5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggIExpbnVzIFRvcnZhbGRzCisgKiAgUmUtb3JnYW5pc2VkIEZlYiAxOTk4IFJ1c3NlbGwgS2luZworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgImNoZWNrLmgiCisjaW5jbHVkZSAibWFjLmgiCisKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKK2V4dGVybiB2b2lkIG5vdGVfYm9vdGFibGVfcGFydChkZXZfdCBkZXYsIGludCBwYXJ0LCBpbnQgZ29vZG5lc3MpOworI2VuZGlmCisKKy8qCisgKiBDb2RlIHRvIHVuZGVyc3RhbmQgTWFjT1MgcGFydGl0aW9uIHRhYmxlcy4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbWFjX2ZpeF9zdHJpbmcoY2hhciAqc3RnLCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwICYmIHN0Z1tpXSA9PSAnICc7IGktLSkKKwkJc3RnW2ldID0gMDsKK30KKworaW50IG1hY19wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlpbnQgc2xvdCA9IDE7CisJU2VjdG9yIHNlY3Q7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlpbnQgYmxrLCBibG9ja3NfaW5fbWFwOworCXVuc2lnbmVkIHNlY3NpemU7CisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisJaW50IGZvdW5kX3Jvb3QgPSAwOworCWludCBmb3VuZF9yb290X2dvb2RuZXNzID0gMDsKKyNlbmRpZgorCXN0cnVjdCBtYWNfcGFydGl0aW9uICpwYXJ0OworCXN0cnVjdCBtYWNfZHJpdmVyX2Rlc2MgKm1kOworCisJLyogR2V0IDB0aCBibG9jayBhbmQgbG9vayBhdCB0aGUgZmlyc3QgcGFydGl0aW9uIG1hcCBlbnRyeS4gKi8KKwltZCA9IChzdHJ1Y3QgbWFjX2RyaXZlcl9kZXNjICopIHJlYWRfZGV2X3NlY3RvcihiZGV2LCAwLCAmc2VjdCk7CisJaWYgKCFtZCkKKwkJcmV0dXJuIC0xOworCWlmIChiZTE2X3RvX2NwdShtZC0+c2lnbmF0dXJlKSAhPSBNQUNfRFJJVkVSX01BR0lDKSB7CisJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCQlyZXR1cm4gMDsKKwl9CisJc2Vjc2l6ZSA9IGJlMTZfdG9fY3B1KG1kLT5ibG9ja19zaXplKTsKKwlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwlkYXRhID0gcmVhZF9kZXZfc2VjdG9yKGJkZXYsIHNlY3NpemUvNTEyLCAmc2VjdCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLTE7CisJcGFydCA9IChzdHJ1Y3QgbWFjX3BhcnRpdGlvbiAqKSAoZGF0YSArIHNlY3NpemUlNTEyKTsKKwlpZiAoYmUxNl90b19jcHUocGFydC0+c2lnbmF0dXJlKSAhPSBNQUNfUEFSVElUSU9OX01BR0lDKSB7CisJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCQlyZXR1cm4gMDsJCS8qIG5vdCBhIE1hY09TIGRpc2sgKi8KKwl9CisJcHJpbnRrKCIgW21hY10iKTsKKwlibG9ja3NfaW5fbWFwID0gYmUzMl90b19jcHUocGFydC0+bWFwX2NvdW50KTsKKwlmb3IgKGJsayA9IDE7IGJsayA8PSBibG9ja3NfaW5fbWFwOyArK2JsaykgeworCQlpbnQgcG9zID0gYmxrICogc2Vjc2l6ZTsKKwkJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJCWRhdGEgPSByZWFkX2Rldl9zZWN0b3IoYmRldiwgcG9zLzUxMiwgJnNlY3QpOworCQlpZiAoIWRhdGEpCisJCQlyZXR1cm4gLTE7CisJCXBhcnQgPSAoc3RydWN0IG1hY19wYXJ0aXRpb24gKikgKGRhdGEgKyBwb3MlNTEyKTsKKwkJaWYgKGJlMTZfdG9fY3B1KHBhcnQtPnNpZ25hdHVyZSkgIT0gTUFDX1BBUlRJVElPTl9NQUdJQykKKwkJCWJyZWFrOworCQlwdXRfcGFydGl0aW9uKHN0YXRlLCBzbG90LAorCQkJYmUzMl90b19jcHUocGFydC0+c3RhcnRfYmxvY2spICogKHNlY3NpemUvNTEyKSwKKwkJCWJlMzJfdG9fY3B1KHBhcnQtPmJsb2NrX2NvdW50KSAqIChzZWNzaXplLzUxMikpOworCisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisJCS8qCisJCSAqIElmIHRoaXMgaXMgdGhlIGZpcnN0IGJvb3RhYmxlIHBhcnRpdGlvbiwgdGVsbCB0aGUKKwkJICogc2V0dXAgY29kZSwgaW4gY2FzZSBpdCB3YW50cyB0byBtYWtlIHRoaXMgdGhlIHJvb3QuCisJCSAqLworCQlpZiAoX21hY2hpbmUgPT0gX01BQ0hfUG1hYykgeworCQkJaW50IGdvb2RuZXNzID0gMDsKKworCQkJbWFjX2ZpeF9zdHJpbmcocGFydC0+cHJvY2Vzc29yLCAxNik7CisJCQltYWNfZml4X3N0cmluZyhwYXJ0LT5uYW1lLCAzMik7CisJCQltYWNfZml4X3N0cmluZyhwYXJ0LT50eXBlLCAzMik7CQkJCQkKKwkJICAgIAorCQkJaWYgKChiZTMyX3RvX2NwdShwYXJ0LT5zdGF0dXMpICYgTUFDX1NUQVRVU19CT09UQUJMRSkKKwkJCSAgICAmJiBzdHJjYXNlY21wKHBhcnQtPnByb2Nlc3NvciwgInBvd2VycGMiKSA9PSAwKQorCQkJCWdvb2RuZXNzKys7CisKKwkJCWlmIChzdHJjYXNlY21wKHBhcnQtPnR5cGUsICJBcHBsZV9VTklYX1NWUjIiKSA9PSAwCisJCQkgICAgfHwgKHN0cm5pY21wKHBhcnQtPnR5cGUsICJMaW51eCIsIDUpID09IDAKKwkJCSAgICAgICAgJiYgc3RyY2FzZWNtcChwYXJ0LT50eXBlLCAiTGludXhfc3dhcCIpICE9IDApKSB7CisJCQkJaW50IGksIGw7CisKKwkJCQlnb29kbmVzcysrOworCQkJCWwgPSBzdHJsZW4ocGFydC0+bmFtZSk7CisJCQkJaWYgKHN0cmNtcChwYXJ0LT5uYW1lLCAiLyIpID09IDApCisJCQkJCWdvb2RuZXNzKys7CisJCQkJZm9yIChpID0gMDsgaSA8PSBsIC0gNDsgKytpKSB7CisJCQkJCWlmIChzdHJuaWNtcChwYXJ0LT5uYW1lICsgaSwgInJvb3QiLAorCQkJCQkJICAgICA0KSA9PSAwKSB7CisJCQkJCQlnb29kbmVzcyArPSAyOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHN0cm5pY21wKHBhcnQtPm5hbWUsICJzd2FwIiwgNCkgPT0gMCkKKwkJCQkJZ29vZG5lc3MtLTsKKwkJCX0KKworCQkJaWYgKGdvb2RuZXNzID4gZm91bmRfcm9vdF9nb29kbmVzcykgeworCQkJCWZvdW5kX3Jvb3QgPSBibGs7CisJCQkJZm91bmRfcm9vdF9nb29kbmVzcyA9IGdvb2RuZXNzOworCQkJfQorCQl9CisjZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCisKKwkJKytzbG90OworCX0KKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKwlpZiAoZm91bmRfcm9vdF9nb29kbmVzcykKKwkJbm90ZV9ib290YWJsZV9wYXJ0KGJkZXYtPmJkX2RldiwgZm91bmRfcm9vdCwgZm91bmRfcm9vdF9nb29kbmVzcyk7CisjZW5kaWYKKworCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCXByaW50aygiXG4iKTsKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvbWFjLmggYi9mcy9wYXJ0aXRpb25zL21hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZjI2ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL21hYy5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiAgZnMvcGFydGl0aW9ucy9tYWMuaAorICovCisKKyNkZWZpbmUgTUFDX1BBUlRJVElPTl9NQUdJQwkweDUwNGQKKworLyogdHlwZSBmaWVsZCB2YWx1ZSBmb3IgQS9VWCBvciBvdGhlciBVbml4IHBhcnRpdGlvbnMgKi8KKyNkZWZpbmUgQVBQTEVfQVVYX1RZUEUJIkFwcGxlX1VOSVhfU1ZSMiIKKworc3RydWN0IG1hY19wYXJ0aXRpb24geworCV9fYmUxNglzaWduYXR1cmU7CS8qIGV4cGVjdGVkIHRvIGJlIE1BQ19QQVJUSVRJT05fTUFHSUMgKi8KKwlfX2JlMTYJcmVzMTsKKwlfX2JlMzIJbWFwX2NvdW50OwkvKiAjIGJsb2NrcyBpbiBwYXJ0aXRpb24gbWFwICovCisJX19iZTMyCXN0YXJ0X2Jsb2NrOwkvKiBhYnNvbHV0ZSBzdGFydGluZyBibG9jayAjIG9mIHBhcnRpdGlvbiAqLworCV9fYmUzMglibG9ja19jb3VudDsJLyogbnVtYmVyIG9mIGJsb2NrcyBpbiBwYXJ0aXRpb24gKi8KKwljaGFyCW5hbWVbMzJdOwkvKiBwYXJ0aXRpb24gbmFtZSAqLworCWNoYXIJdHlwZVszMl07CS8qIHN0cmluZyB0eXBlIGRlc2NyaXB0aW9uICovCisJX19iZTMyCWRhdGFfc3RhcnQ7CS8qIHJlbCBibG9jayAjIG9mIGZpcnN0IGRhdGEgYmxvY2sgKi8KKwlfX2JlMzIJZGF0YV9jb3VudDsJLyogbnVtYmVyIG9mIGRhdGEgYmxvY2tzICovCisJX19iZTMyCXN0YXR1czsJCS8qIHBhcnRpdGlvbiBzdGF0dXMgYml0cyAqLworCV9fYmUzMglib290X3N0YXJ0OworCV9fYmUzMglib290X3NpemU7CisJX19iZTMyCWJvb3RfbG9hZDsKKwlfX2JlMzIJYm9vdF9sb2FkMjsKKwlfX2JlMzIJYm9vdF9lbnRyeTsKKwlfX2JlMzIJYm9vdF9lbnRyeTI7CisJX19iZTMyCWJvb3RfY2tzdW07CisJY2hhcglwcm9jZXNzb3JbMTZdOwkvKiBpZGVudGlmaWVzIElTQSBvZiBib290ICovCisJLyogdGhlcmUgaXMgbW9yZSBzdHVmZiBhZnRlciB0aGlzIHRoYXQgd2UgZG9uJ3QgbmVlZCAqLworfTsKKworI2RlZmluZSBNQUNfU1RBVFVTX0JPT1RBQkxFCTgJLyogcGFydGl0aW9uIGlzIGJvb3RhYmxlICovCisKKyNkZWZpbmUgTUFDX0RSSVZFUl9NQUdJQwkweDQ1NTIKKworLyogRHJpdmVyIGRlc2NyaXB0b3Igc3RydWN0dXJlLCBpbiBibG9jayAwICovCitzdHJ1Y3QgbWFjX2RyaXZlcl9kZXNjIHsKKwlfX2JlMTYJc2lnbmF0dXJlOwkvKiBleHBlY3RlZCB0byBiZSBNQUNfRFJJVkVSX01BR0lDICovCisJX19iZTE2CWJsb2NrX3NpemU7CisJX19iZTMyCWJsb2NrX2NvdW50OworICAgIC8qIC4uLiBtb3JlIHN0dWZmICovCit9OworCitpbnQgbWFjX3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KTsKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvbXNkb3MuYyBiL2ZzL3BhcnRpdGlvbnMvbXNkb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2VlMWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcGFydGl0aW9ucy9tc2Rvcy5jCkBAIC0wLDAgKzEsNDc5IEBACisvKgorICogIGZzL3BhcnRpdGlvbnMvbXNkb3MuYworICoKKyAqICBDb2RlIGV4dHJhY3RlZCBmcm9tIGRyaXZlcnMvYmxvY2svZ2VuaGQuYworICogIENvcHlyaWdodCAoQykgMTk5MS0xOTk4ICBMaW51cyBUb3J2YWxkcworICoKKyAqICBUaGFua3MgdG8gQnJhbmtvIExhbmtlc3RlciwgbGFua2VzdGVAZndpLnV2YS5ubCwgd2hvIGZvdW5kIGEgYnVnCisgKiAgaW4gdGhlIGVhcmx5IGV4dGVuZGVkLXBhcnRpdGlvbiBjaGVja3MgYW5kIGFkZGVkIERNIHBhcnRpdGlvbnMKKyAqCisgKiAgU3VwcG9ydCBmb3IgRGlza01hbmFnZXIgdjYuMHggYWRkZWQgYnkgTWFyayBMb3JkLAorICogIHdpdGggaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgT25UcmFjay4gIFRoaXMgbm93IHdvcmtzIGZvciBsaW51eCBmZGlzaworICogIGFuZCBMSUxPLCBhcyB3ZWxsIGFzIGxvYWRsaW4gYW5kIGJvb3Rsbi4gIE5vdGUgdGhhdCBkaXNrcyBvdGhlciB0aGFuCisgKiAgL2Rldi9oZGEgKm11c3QqIGhhdmUgYSAiRE9TIiB0eXBlIDB4NTEgcGFydGl0aW9uIGluIHRoZSBmaXJzdCBzbG90IChoZGExKS4KKyAqCisgKiAgTW9yZSBmbGV4aWJsZSBoYW5kbGluZyBvZiBleHRlbmRlZCBwYXJ0aXRpb25zIC0gYWViLCA5NTA4MzEKKyAqCisgKiAgQ2hlY2sgcGFydGl0aW9uIHRhYmxlIG9uIElERSBkaXNrcyBmb3IgY29tbW9uIENIUyB0cmFuc2xhdGlvbnMKKyAqCisgKiAgUmUtb3JnYW5pc2VkIEZlYiAxOTk4IFJ1c3NlbGwgS2luZworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgImNoZWNrLmgiCisjaW5jbHVkZSAibXNkb3MuaCIKKyNpbmNsdWRlICJlZmkuaCIKKworLyoKKyAqIE1hbnkgYXJjaGl0ZWN0dXJlcyBkb24ndCBsaWtlIHVuYWxpZ25lZCBhY2Nlc3Nlcywgd2hpbGUKKyAqIHRoZSBucl9zZWN0cyBhbmQgc3RhcnRfc2VjdCBwYXJ0aXRpb24gdGFibGUgZW50cmllcyBhcmUKKyAqIGF0IGEgMiAobW9kIDQpIGFkZHJlc3MuCisgKi8KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNkZWZpbmUgU1lTX0lORChwKQkoZ2V0X3VuYWxpZ25lZCgmcC0+c3lzX2luZCkpCisjZGVmaW5lIE5SX1NFQ1RTKHApCSh7IF9fdHlwZW9mX18ocC0+bnJfc2VjdHMpIF9fYSA9CVwKKwkJCQlnZXRfdW5hbGlnbmVkKCZwLT5ucl9zZWN0cyk7CVwKKwkJCQlsZTMyX3RvX2NwdShfX2EpOyBcCisJCQl9KQorCisjZGVmaW5lIFNUQVJUX1NFQ1QocCkJKHsgX190eXBlb2ZfXyhwLT5zdGFydF9zZWN0KSBfX2EgPQlcCisJCQkJZ2V0X3VuYWxpZ25lZCgmcC0+c3RhcnRfc2VjdCk7CVwKKwkJCQlsZTMyX3RvX2NwdShfX2EpOyBcCisJCQl9KQorCitzdGF0aWMgaW5saW5lIGludCBpc19leHRlbmRlZF9wYXJ0aXRpb24oc3RydWN0IHBhcnRpdGlvbiAqcCkKK3sKKwlyZXR1cm4gKFNZU19JTkQocCkgPT0gRE9TX0VYVEVOREVEX1BBUlRJVElPTiB8fAorCQlTWVNfSU5EKHApID09IFdJTjk4X0VYVEVOREVEX1BBUlRJVElPTiB8fAorCQlTWVNfSU5EKHApID09IExJTlVYX0VYVEVOREVEX1BBUlRJVElPTik7Cit9CisKKyNkZWZpbmUgTVNET1NfTEFCRUxfTUFHSUMxCTB4NTUKKyNkZWZpbmUgTVNET1NfTEFCRUxfTUFHSUMyCTB4QUEKKworc3RhdGljIGlubGluZSBpbnQKK21zZG9zX21hZ2ljX3ByZXNlbnQodW5zaWduZWQgY2hhciAqcCkKK3sKKwlyZXR1cm4gKHBbMF0gPT0gTVNET1NfTEFCRUxfTUFHSUMxICYmIHBbMV0gPT0gTVNET1NfTEFCRUxfTUFHSUMyKTsKK30KKworLyoKKyAqIENyZWF0ZSBkZXZpY2VzIGZvciBlYWNoIGxvZ2ljYWwgcGFydGl0aW9uIGluIGFuIGV4dGVuZGVkIHBhcnRpdGlvbi4KKyAqIFRoZSBsb2dpY2FsIHBhcnRpdGlvbnMgZm9ybSBhIGxpbmtlZCBsaXN0LCB3aXRoIGVhY2ggZW50cnkgYmVpbmcKKyAqIGEgcGFydGl0aW9uIHRhYmxlIHdpdGggdHdvIGVudHJpZXMuICBUaGUgZmlyc3QgZW50cnkKKyAqIGlzIHRoZSByZWFsIGRhdGEgcGFydGl0aW9uICh3aXRoIGEgc3RhcnQgcmVsYXRpdmUgdG8gdGhlIHBhcnRpdGlvbgorICogdGFibGUgc3RhcnQpLiAgVGhlIHNlY29uZCBpcyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgbG9naWNhbCBwYXJ0aXRpb24KKyAqICh3aXRoIGEgc3RhcnQgcmVsYXRpdmUgdG8gdGhlIGVudGlyZSBleHRlbmRlZCBwYXJ0aXRpb24pLgorICogV2UgZG8gbm90IGNyZWF0ZSBhIExpbnV4IHBhcnRpdGlvbiBmb3IgdGhlIHBhcnRpdGlvbiB0YWJsZXMsIGJ1dAorICogb25seSBmb3IgdGhlIGFjdHVhbCBkYXRhIHBhcnRpdGlvbnMuCisgKi8KKworc3RhdGljIHZvaWQKK3BhcnNlX2V4dGVuZGVkKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCQl1MzIgZmlyc3Rfc2VjdG9yLCB1MzIgZmlyc3Rfc2l6ZSkKK3sKKwlzdHJ1Y3QgcGFydGl0aW9uICpwOworCVNlY3RvciBzZWN0OworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJdTMyIHRoaXNfc2VjdG9yLCB0aGlzX3NpemU7CisJaW50IHNlY3Rvcl9zaXplID0gYmRldl9oYXJkc2VjdF9zaXplKGJkZXYpIC8gNTEyOworCWludCBsb29wY3QgPSAwOwkJLyogbnVtYmVyIG9mIGxpbmtzIGZvbGxvd2VkCisJCQkJICAgd2l0aG91dCBmaW5kaW5nIGEgZGF0YSBwYXJ0aXRpb24gKi8KKwlpbnQgaTsKKworCXRoaXNfc2VjdG9yID0gZmlyc3Rfc2VjdG9yOworCXRoaXNfc2l6ZSA9IGZpcnN0X3NpemU7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoKytsb29wY3QgPiAxMDApCisJCQlyZXR1cm47CisJCWlmIChzdGF0ZS0+bmV4dCA9PSBzdGF0ZS0+bGltaXQpCisJCQlyZXR1cm47CisJCWRhdGEgPSByZWFkX2Rldl9zZWN0b3IoYmRldiwgdGhpc19zZWN0b3IsICZzZWN0KTsKKwkJaWYgKCFkYXRhKQorCQkJcmV0dXJuOworCisJCWlmICghbXNkb3NfbWFnaWNfcHJlc2VudChkYXRhICsgNTEwKSkKKwkJCWdvdG8gZG9uZTsgCisKKwkJcCA9IChzdHJ1Y3QgcGFydGl0aW9uICopIChkYXRhICsgMHgxYmUpOworCisJCS8qCisJCSAqIFVzdWFsbHksIHRoZSBmaXJzdCBlbnRyeSBpcyB0aGUgcmVhbCBkYXRhIHBhcnRpdGlvbiwKKwkJICogdGhlIDJuZCBlbnRyeSBpcyB0aGUgbmV4dCBleHRlbmRlZCBwYXJ0aXRpb24sIG9yIGVtcHR5LAorCQkgKiBhbmQgdGhlIDNyZCBhbmQgNHRoIGVudHJpZXMgYXJlIHVudXNlZC4KKwkJICogSG93ZXZlciwgRFJET1Mgc29tZXRpbWVzIGhhcyB0aGUgZXh0ZW5kZWQgcGFydGl0aW9uIGFzCisJCSAqIHRoZSBmaXJzdCBlbnRyeSAod2hlbiB0aGUgZGF0YSBwYXJ0aXRpb24gaXMgZW1wdHkpLAorCQkgKiBhbmQgT1MvMiBzZWVtcyB0byB1c2UgYWxsIGZvdXIgZW50cmllcy4KKwkJICovCisKKwkJLyogCisJCSAqIEZpcnN0IHByb2Nlc3MgdGhlIGRhdGEgcGFydGl0aW9uKHMpCisJCSAqLworCQlmb3IgKGk9MDsgaTw0OyBpKyssIHArKykgeworCQkJdTMyIG9mZnMsIHNpemUsIG5leHQ7CisKKwkJCWlmIChTWVNfSU5EKHApID09IDApCisJCQkJY29udGludWU7CisJCQlpZiAoIU5SX1NFQ1RTKHApIHx8IGlzX2V4dGVuZGVkX3BhcnRpdGlvbihwKSkKKwkJCQljb250aW51ZTsKKworCQkJLyogQ2hlY2sgdGhlIDNyZCBhbmQgNHRoIGVudHJpZXMgLQorCQkJICAgdGhlc2Ugc29tZXRpbWVzIGNvbnRhaW4gcmFuZG9tIGdhcmJhZ2UgKi8KKwkJCW9mZnMgPSBTVEFSVF9TRUNUKHApKnNlY3Rvcl9zaXplOworCQkJc2l6ZSA9IE5SX1NFQ1RTKHApKnNlY3Rvcl9zaXplOworCQkJbmV4dCA9IHRoaXNfc2VjdG9yICsgb2ZmczsKKwkJCWlmIChpID49IDIpIHsKKwkJCQlpZiAob2ZmcyArIHNpemUgPiB0aGlzX3NpemUpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChuZXh0IDwgZmlyc3Rfc2VjdG9yKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAobmV4dCArIHNpemUgPiBmaXJzdF9zZWN0b3IgKyBmaXJzdF9zaXplKQorCQkJCQljb250aW51ZTsKKwkJCX0KKworCQkJcHV0X3BhcnRpdGlvbihzdGF0ZSwgc3RhdGUtPm5leHQsIG5leHQsIHNpemUpOworCQkJaWYgKFNZU19JTkQocCkgPT0gTElOVVhfUkFJRF9QQVJUSVRJT04pCisJCQkJc3RhdGUtPnBhcnRzW3N0YXRlLT5uZXh0XS5mbGFncyA9IDE7CisJCQlsb29wY3QgPSAwOworCQkJaWYgKCsrc3RhdGUtPm5leHQgPT0gc3RhdGUtPmxpbWl0KQorCQkJCWdvdG8gZG9uZTsKKwkJfQorCQkvKgorCQkgKiBOZXh0LCBwcm9jZXNzIHRoZSAoZmlyc3QpIGV4dGVuZGVkIHBhcnRpdGlvbiwgaWYgcHJlc2VudC4KKwkJICogKFNvIGZhciwgdGhlcmUgc2VlbXMgdG8gYmUgbm8gcmVhc29uIHRvIG1ha2UKKwkJICogIHBhcnNlX2V4dGVuZGVkKCkgIHJlY3Vyc2l2ZSBhbmQgYWxsb3cgYSB0cmVlCisJCSAqICBvZiBleHRlbmRlZCBwYXJ0aXRpb25zLikKKwkJICogSXQgc2hvdWxkIGJlIGEgbGluayB0byB0aGUgbmV4dCBsb2dpY2FsIHBhcnRpdGlvbi4KKwkJICovCisJCXAgLT0gNDsKKwkJZm9yIChpPTA7IGk8NDsgaSsrLCBwKyspCisJCQlpZiAoTlJfU0VDVFMocCkgJiYgaXNfZXh0ZW5kZWRfcGFydGl0aW9uKHApKQorCQkJCWJyZWFrOworCQlpZiAoaSA9PSA0KQorCQkJZ290byBkb25lOwkgLyogbm90aGluZyBsZWZ0IHRvIGRvICovCisKKwkJdGhpc19zZWN0b3IgPSBmaXJzdF9zZWN0b3IgKyBTVEFSVF9TRUNUKHApICogc2VjdG9yX3NpemU7CisJCXRoaXNfc2l6ZSA9IE5SX1NFQ1RTKHApICogc2VjdG9yX3NpemU7CisJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCX0KK2RvbmU6CisJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7Cit9CisKKy8qIGphbWVzQGJwZ2MuY29tOiBTb2xhcmlzIGhhcyBhIG5hc3R5IGluZGljYXRvcjogMHg4MiB3aGljaCBhbHNvCisgICBpbmRpY2F0ZXMgbGludXggc3dhcC4gIEJlIGNhcmVmdWwgYmVmb3JlIGJlbGlldmluZyB0aGlzIGlzIFNvbGFyaXMuICovCisKK3N0YXRpYyB2b2lkCitwYXJzZV9zb2xhcmlzX3g4NihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJdTMyIG9mZnNldCwgdTMyIHNpemUsIGludCBvcmlnaW4pCit7CisjaWZkZWYgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTgorCVNlY3RvciBzZWN0OworCXN0cnVjdCBzb2xhcmlzX3g4Nl92dG9jICp2OworCWludCBpOworCisJdiA9IChzdHJ1Y3Qgc29sYXJpc194ODZfdnRvYyAqKXJlYWRfZGV2X3NlY3RvcihiZGV2LCBvZmZzZXQrMSwgJnNlY3QpOworCWlmICghdikKKwkJcmV0dXJuOworCWlmIChsZTMyX3RvX2NwdSh2LT52X3Nhbml0eSkgIT0gU09MQVJJU19YODZfVlRPQ19TQU5FKSB7CisJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCQlyZXR1cm47CisJfQorCXByaW50aygiICVzJWQ6IDxzb2xhcmlzOiIsIHN0YXRlLT5uYW1lLCBvcmlnaW4pOworCWlmIChsZTMyX3RvX2NwdSh2LT52X3ZlcnNpb24pICE9IDEpIHsKKwkJcHJpbnRrKCIgIGNhbm5vdCBoYW5kbGUgdmVyc2lvbiAlZCB2dG9jPlxuIiwKKwkJCWxlMzJfdG9fY3B1KHYtPnZfdmVyc2lvbikpOworCQlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGk9MDsgaTxTT0xBUklTX1g4Nl9OVU1TTElDRSAmJiBzdGF0ZS0+bmV4dDxzdGF0ZS0+bGltaXQ7IGkrKykgeworCQlzdHJ1Y3Qgc29sYXJpc194ODZfc2xpY2UgKnMgPSAmdi0+dl9zbGljZVtpXTsKKwkJaWYgKHMtPnNfc2l6ZSA9PSAwKQorCQkJY29udGludWU7CisJCXByaW50aygiIFtzJWRdIiwgaSk7CisJCS8qIHNvbGFyaXMgcGFydGl0aW9ucyBhcmUgcmVsYXRpdmUgdG8gY3VycmVudCBNUy1ET1MKKwkJICogb25lOyBtdXN0IGFkZCB0aGUgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IHBhcnRpdGlvbiAqLworCQlwdXRfcGFydGl0aW9uKHN0YXRlLCBzdGF0ZS0+bmV4dCsrLAorCQkJCSBsZTMyX3RvX2NwdShzLT5zX3N0YXJ0KStvZmZzZXQsCisJCQkJIGxlMzJfdG9fY3B1KHMtPnNfc2l6ZSkpOworCX0KKwlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwlwcmludGsoIiA+XG4iKTsKKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZChDT05GSUdfQlNEX0RJU0tMQUJFTCkgfHwgZGVmaW5lZChDT05GSUdfTkVDOThfUEFSVElUSU9OKQorLyogCisgKiBDcmVhdGUgZGV2aWNlcyBmb3IgQlNEIHBhcnRpdGlvbnMgbGlzdGVkIGluIGEgZGlza2xhYmVsLCB1bmRlciBhCisgKiBkb3MtbGlrZSBwYXJ0aXRpb24uIFNlZSBwYXJzZV9leHRlbmRlZCgpIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCit2b2lkCitwYXJzZV9ic2Qoc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJdTMyIG9mZnNldCwgdTMyIHNpemUsIGludCBvcmlnaW4sIGNoYXIgKmZsYXZvdXIsCisJCWludCBtYXhfcGFydGl0aW9ucykKK3sKKwlTZWN0b3Igc2VjdDsKKwlzdHJ1Y3QgYnNkX2Rpc2tsYWJlbCAqbDsKKwlzdHJ1Y3QgYnNkX3BhcnRpdGlvbiAqcDsKKworCWwgPSAoc3RydWN0IGJzZF9kaXNrbGFiZWwgKilyZWFkX2Rldl9zZWN0b3IoYmRldiwgb2Zmc2V0KzEsICZzZWN0KTsKKwlpZiAoIWwpCisJCXJldHVybjsKKwlpZiAobGUzMl90b19jcHUobC0+ZF9tYWdpYykgIT0gQlNEX0RJU0tNQUdJQykgeworCQlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwkJcmV0dXJuOworCX0KKwlwcmludGsoIiAlcyVkOiA8JXM6Iiwgc3RhdGUtPm5hbWUsIG9yaWdpbiwgZmxhdm91cik7CisKKwlpZiAobGUxNl90b19jcHUobC0+ZF9ucGFydGl0aW9ucykgPCBtYXhfcGFydGl0aW9ucykKKwkJbWF4X3BhcnRpdGlvbnMgPSBsZTE2X3RvX2NwdShsLT5kX25wYXJ0aXRpb25zKTsKKwlmb3IgKHAgPSBsLT5kX3BhcnRpdGlvbnM7IHAgLSBsLT5kX3BhcnRpdGlvbnMgPCBtYXhfcGFydGl0aW9uczsgcCsrKSB7CisJCXUzMiBic2Rfc3RhcnQsIGJzZF9zaXplOworCisJCWlmIChzdGF0ZS0+bmV4dCA9PSBzdGF0ZS0+bGltaXQpCisJCQlicmVhazsKKwkJaWYgKHAtPnBfZnN0eXBlID09IEJTRF9GU19VTlVTRUQpIAorCQkJY29udGludWU7CisJCWJzZF9zdGFydCA9IGxlMzJfdG9fY3B1KHAtPnBfb2Zmc2V0KTsKKwkJYnNkX3NpemUgPSBsZTMyX3RvX2NwdShwLT5wX3NpemUpOworCQlpZiAob2Zmc2V0ID09IGJzZF9zdGFydCAmJiBzaXplID09IGJzZF9zaXplKQorCQkJLyogZnVsbCBwYXJlbnQgcGFydGl0aW9uLCB3ZSBoYXZlIGl0IGFscmVhZHkgKi8KKwkJCWNvbnRpbnVlOworCQlpZiAob2Zmc2V0ID4gYnNkX3N0YXJ0IHx8IG9mZnNldCtzaXplIDwgYnNkX3N0YXJ0K2JzZF9zaXplKSB7CisJCQlwcmludGsoImJhZCBzdWJwYXJ0aXRpb24gLSBpZ25vcmVkXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHN0YXRlLT5uZXh0KyssIGJzZF9zdGFydCwgYnNkX3NpemUpOworCX0KKwlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwlpZiAobGUxNl90b19jcHUobC0+ZF9ucGFydGl0aW9ucykgPiBtYXhfcGFydGl0aW9ucykKKwkJcHJpbnRrKCIgKGlnbm9yZWQgJWQgbW9yZSkiLAorCQkgICAgICAgbGUxNl90b19jcHUobC0+ZF9ucGFydGl0aW9ucykgLSBtYXhfcGFydGl0aW9ucyk7CisJcHJpbnRrKCIgPlxuIik7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK3BhcnNlX2ZyZWVic2Qoc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJdTMyIG9mZnNldCwgdTMyIHNpemUsIGludCBvcmlnaW4pCit7CisjaWZkZWYgQ09ORklHX0JTRF9ESVNLTEFCRUwKKwlwYXJzZV9ic2Qoc3RhdGUsIGJkZXYsIG9mZnNldCwgc2l6ZSwgb3JpZ2luLAorCQkJImJzZCIsIEJTRF9NQVhQQVJUSVRJT05TKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorcGFyc2VfbmV0YnNkKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCXUzMiBvZmZzZXQsIHUzMiBzaXplLCBpbnQgb3JpZ2luKQoreworI2lmZGVmIENPTkZJR19CU0RfRElTS0xBQkVMCisJcGFyc2VfYnNkKHN0YXRlLCBiZGV2LCBvZmZzZXQsIHNpemUsIG9yaWdpbiwKKwkJCSJuZXRic2QiLCBCU0RfTUFYUEFSVElUSU9OUyk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK3BhcnNlX29wZW5ic2Qoc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJdTMyIG9mZnNldCwgdTMyIHNpemUsIGludCBvcmlnaW4pCit7CisjaWZkZWYgQ09ORklHX0JTRF9ESVNLTEFCRUwKKwlwYXJzZV9ic2Qoc3RhdGUsIGJkZXYsIG9mZnNldCwgc2l6ZSwgb3JpZ2luLAorCQkJIm9wZW5ic2QiLCBPUEVOQlNEX01BWFBBUlRJVElPTlMpOworI2VuZGlmCit9CisKKy8qCisgKiBDcmVhdGUgZGV2aWNlcyBmb3IgVW5peHdhcmUgcGFydGl0aW9ucyBsaXN0ZWQgaW4gYSBkaXNrbGFiZWwsIHVuZGVyIGEKKyAqIGRvcy1saWtlIHBhcnRpdGlvbi4gU2VlIHBhcnNlX2V4dGVuZGVkKCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitwYXJzZV91bml4d2FyZShzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQl1MzIgb2Zmc2V0LCB1MzIgc2l6ZSwgaW50IG9yaWdpbikKK3sKKyNpZmRlZiBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMCisJU2VjdG9yIHNlY3Q7CisJc3RydWN0IHVuaXh3YXJlX2Rpc2tsYWJlbCAqbDsKKwlzdHJ1Y3QgdW5peHdhcmVfc2xpY2UgKnA7CisKKwlsID0gKHN0cnVjdCB1bml4d2FyZV9kaXNrbGFiZWwgKilyZWFkX2Rldl9zZWN0b3IoYmRldiwgb2Zmc2V0KzI5LCAmc2VjdCk7CisJaWYgKCFsKQorCQlyZXR1cm47CisJaWYgKGxlMzJfdG9fY3B1KGwtPmRfbWFnaWMpICE9IFVOSVhXQVJFX0RJU0tNQUdJQyB8fAorCSAgICBsZTMyX3RvX2NwdShsLT52dG9jLnZfbWFnaWMpICE9IFVOSVhXQVJFX0RJU0tNQUdJQzIpIHsKKwkJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJCXJldHVybjsKKwl9CisJcHJpbnRrKCIgJXMlZDogPHVuaXh3YXJlOiIsIHN0YXRlLT5uYW1lLCBvcmlnaW4pOworCXAgPSAmbC0+dnRvYy52X3NsaWNlWzFdOworCS8qIEkgb21pdCB0aGUgMHRoIHNsaWNlIGFzIGl0IGlzIHRoZSBzYW1lIGFzIHdob2xlIGRpc2suICovCisJd2hpbGUgKHAgLSAmbC0+dnRvYy52X3NsaWNlWzBdIDwgVU5JWFdBUkVfTlVNU0xJQ0UpIHsKKwkJaWYgKHN0YXRlLT5uZXh0ID09IHN0YXRlLT5saW1pdCkKKwkJCWJyZWFrOworCisJCWlmIChwLT5zX2xhYmVsICE9IFVOSVhXQVJFX0ZTX1VOVVNFRCkKKwkJCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHN0YXRlLT5uZXh0KyssCisJCQkJCQlTVEFSVF9TRUNUKHApLCBOUl9TRUNUUyhwKSk7CisJCXArKzsKKwl9CisJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJcHJpbnRrKCIgPlxuIik7CisjZW5kaWYKK30KKworLyoKKyAqIE1pbml4IDIuMC4wLzIuMC4yIHN1YnBhcnRpdGlvbiBzdXBwb3J0LgorICogQW5hbmQgS3Jpc2huYW11cnRoeSA8YW5hbmRrQHdpcHJvZ2UubWVkLmdlLmNvbT4KKyAqIFJhamVldiBWLiBQaWxsYWkgICAgPHJhamVldnZwQHlhaG9vLmNvbT4KKyAqLworc3RhdGljIHZvaWQKK3BhcnNlX21pbml4KHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCXUzMiBvZmZzZXQsIHUzMiBzaXplLCBpbnQgb3JpZ2luKQoreworI2lmZGVmIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04KKwlTZWN0b3Igc2VjdDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCXN0cnVjdCBwYXJ0aXRpb24gKnA7CisJaW50IGk7CisKKwlkYXRhID0gcmVhZF9kZXZfc2VjdG9yKGJkZXYsIG9mZnNldCwgJnNlY3QpOworCWlmICghZGF0YSkKKwkJcmV0dXJuOworCisJcCA9IChzdHJ1Y3QgcGFydGl0aW9uICopKGRhdGEgKyAweDFiZSk7CisKKwkvKiBUaGUgZmlyc3Qgc2VjdG9yIG9mIGEgTWluaXggcGFydGl0aW9uIGNhbiBoYXZlIGVpdGhlcgorCSAqIGEgc2Vjb25kYXJ5IE1CUiBkZXNjcmliaW5nIGl0cyBzdWJwYXJ0aXRpb25zLCBvcgorCSAqIHRoZSBub3JtYWwgYm9vdCBzZWN0b3IuICovCisJaWYgKG1zZG9zX21hZ2ljX3ByZXNlbnQgKGRhdGEgKyA1MTApICYmCisJICAgIFNZU19JTkQocCkgPT0gTUlOSVhfUEFSVElUSU9OKSB7IC8qIHN1YnBhcnRpdGlvbiB0YWJsZSBwcmVzZW50ICovCisKKwkJcHJpbnRrKCIgJXMlZDogPG1pbml4OiIsIHN0YXRlLT5uYW1lLCBvcmlnaW4pOworCQlmb3IgKGkgPSAwOyBpIDwgTUlOSVhfTlJfU1VCUEFSVElUSU9OUzsgaSsrLCBwKyspIHsKKwkJCWlmIChzdGF0ZS0+bmV4dCA9PSBzdGF0ZS0+bGltaXQpCisJCQkJYnJlYWs7CisJCQkvKiBhZGQgZWFjaCBwYXJ0aXRpb24gaW4gdXNlICovCisJCQlpZiAoU1lTX0lORChwKSA9PSBNSU5JWF9QQVJUSVRJT04pCisJCQkJcHV0X3BhcnRpdGlvbihzdGF0ZSwgc3RhdGUtPm5leHQrKywKKwkJCQkJICAgICAgU1RBUlRfU0VDVChwKSwgTlJfU0VDVFMocCkpOworCQl9CisJCXByaW50aygiID5cbiIpOworCX0KKwlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKyNlbmRpZiAvKiBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgaWQ7CisJdm9pZCAoKnBhcnNlKShzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKiwgc3RydWN0IGJsb2NrX2RldmljZSAqLAorCQkJdTMyLCB1MzIsIGludCk7Cit9IHN1YnR5cGVzW10gPSB7CisJe0ZSRUVCU0RfUEFSVElUSU9OLCBwYXJzZV9mcmVlYnNkfSwKKwl7TkVUQlNEX1BBUlRJVElPTiwgcGFyc2VfbmV0YnNkfSwKKwl7T1BFTkJTRF9QQVJUSVRJT04sIHBhcnNlX29wZW5ic2R9LAorCXtNSU5JWF9QQVJUSVRJT04sIHBhcnNlX21pbml4fSwKKwl7VU5JWFdBUkVfUEFSVElUSU9OLCBwYXJzZV91bml4d2FyZX0sCisJe1NPTEFSSVNfWDg2X1BBUlRJVElPTiwgcGFyc2Vfc29sYXJpc194ODZ9LAorCXtORVdfU09MQVJJU19YODZfUEFSVElUSU9OLCBwYXJzZV9zb2xhcmlzX3g4Nn0sCisJezAsIE5VTEx9LAorfTsKKyAKK2ludCBtc2Rvc19wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlpbnQgc2VjdG9yX3NpemUgPSBiZGV2X2hhcmRzZWN0X3NpemUoYmRldikgLyA1MTI7CisJU2VjdG9yIHNlY3Q7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlzdHJ1Y3QgcGFydGl0aW9uICpwOworCWludCBzbG90OworCisJZGF0YSA9IHJlYWRfZGV2X3NlY3RvcihiZGV2LCAwLCAmc2VjdCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLTE7CisJaWYgKCFtc2Rvc19tYWdpY19wcmVzZW50KGRhdGEgKyA1MTApKSB7CisJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIE5vdyB0aGF0IHRoZSA1NWFhIHNpZ25hdHVyZSBpcyBwcmVzZW50LCB0aGlzIGlzIHByb2JhYmx5CisJICogZWl0aGVyIHRoZSBib290IHNlY3RvciBvZiBhIEZBVCBmaWxlc3lzdGVtIG9yIGEgRE9TLXR5cGUKKwkgKiBwYXJ0aXRpb24gdGFibGUuIFJlamVjdCB0aGlzIGluIGNhc2UgdGhlIGJvb3QgaW5kaWNhdG9yCisJICogaXMgbm90IDAgb3IgMHg4MC4KKwkgKi8KKwlwID0gKHN0cnVjdCBwYXJ0aXRpb24gKikgKGRhdGEgKyAweDFiZSk7CisJZm9yIChzbG90ID0gMTsgc2xvdCA8PSA0OyBzbG90KyssIHArKykgeworCQlpZiAocC0+Ym9vdF9pbmQgIT0gMCAmJiBwLT5ib290X2luZCAhPSAweDgwKSB7CisJCQlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisjaWZkZWYgQ09ORklHX0VGSV9QQVJUSVRJT04KKwlwID0gKHN0cnVjdCBwYXJ0aXRpb24gKikgKGRhdGEgKyAweDFiZSk7CisJZm9yIChzbG90ID0gMSA7IHNsb3QgPD0gNCA7IHNsb3QrKywgcCsrKSB7CisJCS8qIElmIHRoaXMgaXMgYW4gRUZJIEdQVCBkaXNrLCBtc2RvcyBzaG91bGQgaWdub3JlIGl0LiAqLworCQlpZiAoU1lTX0lORChwKSA9PSBFRklfUE1CUl9PU1RZUEVfRUZJX0dQVCkgeworCQkJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKyNlbmRpZgorCXAgPSAoc3RydWN0IHBhcnRpdGlvbiAqKSAoZGF0YSArIDB4MWJlKTsKKworCS8qCisJICogTG9vayBmb3IgcGFydGl0aW9ucyBpbiB0d28gcGFzc2VzOgorCSAqIEZpcnN0IGZpbmQgdGhlIHByaW1hcnkgYW5kIERPUy10eXBlIGV4dGVuZGVkIHBhcnRpdGlvbnMuCisJICogT24gdGhlIHNlY29uZCBwYXNzIGxvb2sgaW5zaWRlICpCU0QsIFVuaXh3YXJlIGFuZCBTb2xhcmlzIHBhcnRpdGlvbnMuCisJICovCisKKwlzdGF0ZS0+bmV4dCA9IDU7CisJZm9yIChzbG90ID0gMSA7IHNsb3QgPD0gNCA7IHNsb3QrKywgcCsrKSB7CisJCXUzMiBzdGFydCA9IFNUQVJUX1NFQ1QocCkqc2VjdG9yX3NpemU7CisJCXUzMiBzaXplID0gTlJfU0VDVFMocCkqc2VjdG9yX3NpemU7CisJCWlmIChTWVNfSU5EKHApID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKCFzaXplKQorCQkJY29udGludWU7CisJCWlmIChpc19leHRlbmRlZF9wYXJ0aXRpb24ocCkpIHsKKwkJCS8qIHByZXZlbnQgc29tZW9uZSBkb2luZyBta2ZzIG9yIG1rc3dhcCBvbiBhbgorCQkJICAgZXh0ZW5kZWQgcGFydGl0aW9uLCBidXQgbGVhdmUgcm9vbSBmb3IgTElMTyAqLworCQkJcHV0X3BhcnRpdGlvbihzdGF0ZSwgc2xvdCwgc3RhcnQsIHNpemUgPT0gMSA/IDEgOiAyKTsKKwkJCXByaW50aygiIDwiKTsKKwkJCXBhcnNlX2V4dGVuZGVkKHN0YXRlLCBiZGV2LCBzdGFydCwgc2l6ZSk7CisJCQlwcmludGsoIiA+Iik7CisJCQljb250aW51ZTsKKwkJfQorCQlwdXRfcGFydGl0aW9uKHN0YXRlLCBzbG90LCBzdGFydCwgc2l6ZSk7CisJCWlmIChTWVNfSU5EKHApID09IExJTlVYX1JBSURfUEFSVElUSU9OKQorCQkJc3RhdGUtPnBhcnRzW3Nsb3RdLmZsYWdzID0gMTsKKwkJaWYgKFNZU19JTkQocCkgPT0gRE02X1BBUlRJVElPTikKKwkJCXByaW50aygiW0RNXSIpOworCQlpZiAoU1lTX0lORChwKSA9PSBFWkRfUEFSVElUSU9OKQorCQkJcHJpbnRrKCJbRVpEXSIpOworCX0KKworCXByaW50aygiXG4iKTsKKworCS8qIHNlY29uZCBwYXNzIC0gb3V0cHV0IGZvciBlYWNoIG9uIGEgc2VwYXJhdGUgbGluZSAqLworCXAgPSAoc3RydWN0IHBhcnRpdGlvbiAqKSAoMHgxYmUgKyBkYXRhKTsKKwlmb3IgKHNsb3QgPSAxIDsgc2xvdCA8PSA0IDsgc2xvdCsrLCBwKyspIHsKKwkJdW5zaWduZWQgY2hhciBpZCA9IFNZU19JTkQocCk7CisJCWludCBuOworCisJCWlmICghTlJfU0VDVFMocCkpCisJCQljb250aW51ZTsKKworCQlmb3IgKG4gPSAwOyBzdWJ0eXBlc1tuXS5wYXJzZSAmJiBpZCAhPSBzdWJ0eXBlc1tuXS5pZDsgbisrKQorCQkJOworCisJCWlmICghc3VidHlwZXNbbl0ucGFyc2UpCisJCQljb250aW51ZTsKKwkJc3VidHlwZXNbbl0ucGFyc2Uoc3RhdGUsIGJkZXYsIFNUQVJUX1NFQ1QocCkqc2VjdG9yX3NpemUsCisJCQkJCQlOUl9TRUNUUyhwKSpzZWN0b3Jfc2l6ZSwgc2xvdCk7CisJfQorCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9tc2Rvcy5oIGIvZnMvcGFydGl0aW9ucy9tc2Rvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZTVlMGIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL21zZG9zLmgKQEAgLTAsMCArMSw4IEBACisvKgorICogIGZzL3BhcnRpdGlvbnMvbXNkb3MuaAorICovCisKKyNkZWZpbmUgTVNET1NfTEFCRUxfTUFHSUMJCTB4QUE1NQorCitpbnQgbXNkb3NfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpOworCmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL29zZi5jIGIvZnMvcGFydGl0aW9ucy9vc2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDVjMTdiYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvb3NmLmMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqICBmcy9wYXJ0aXRpb25zL29zZi5jCisgKgorICogIENvZGUgZXh0cmFjdGVkIGZyb20gZHJpdmVycy9ibG9jay9nZW5oZC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MS0xOTk4ICBMaW51cyBUb3J2YWxkcworICogIFJlLW9yZ2FuaXNlZCBGZWIgMTk5OCBSdXNzZWxsIEtpbmcKKyAqLworCisjaW5jbHVkZSAiY2hlY2suaCIKKyNpbmNsdWRlICJvc2YuaCIKKworaW50IG9zZl9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlpbnQgaTsKKwlpbnQgc2xvdCA9IDE7CisJU2VjdG9yIHNlY3Q7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlzdHJ1Y3QgZGlza2xhYmVsIHsKKwkJX19sZTMyIGRfbWFnaWM7CisJCV9fbGUxNiBkX3R5cGUsZF9zdWJ0eXBlOworCQl1OCBkX3R5cGVuYW1lWzE2XTsKKwkJdTggZF9wYWNrbmFtZVsxNl07CisJCV9fbGUzMiBkX3NlY3NpemU7CisJCV9fbGUzMiBkX25zZWN0b3JzOworCQlfX2xlMzIgZF9udHJhY2tzOworCQlfX2xlMzIgZF9uY3lsaW5kZXJzOworCQlfX2xlMzIgZF9zZWNwZXJjeWw7CisJCV9fbGUzMiBkX3NlY3BydHVuaXQ7CisJCV9fbGUxNiBkX3NwYXJlc3BlcnRyYWNrOworCQlfX2xlMTYgZF9zcGFyZXNwZXJjeWw7CisJCV9fbGUzMiBkX2FjeWxpbmRlcnM7CisJCV9fbGUxNiBkX3JwbSwgZF9pbnRlcmxlYXZlLCBkX3RyYWNrc2tldywgZF9jeWxza2V3OworCQlfX2xlMzIgZF9oZWFkc3dpdGNoLCBkX3Rya3NlZWssIGRfZmxhZ3M7CisJCV9fbGUzMiBkX2RyaXZlZGF0YVs1XTsKKwkJX19sZTMyIGRfc3BhcmVbNV07CisJCV9fbGUzMiBkX21hZ2ljMjsKKwkJX19sZTE2IGRfY2hlY2tzdW07CisJCV9fbGUxNiBkX25wYXJ0aXRpb25zOworCQlfX2xlMzIgZF9iYnNpemUsIGRfc2JzaXplOworCQlzdHJ1Y3QgZF9wYXJ0aXRpb24geworCQkJX19sZTMyIHBfc2l6ZTsKKwkJCV9fbGUzMiBwX29mZnNldDsKKwkJCV9fbGUzMiBwX2ZzaXplOworCQkJdTggIHBfZnN0eXBlOworCQkJdTggIHBfZnJhZzsKKwkJCV9fbGUxNiBwX2NwZzsKKwkJfSBkX3BhcnRpdGlvbnNbOF07CisJfSAqIGxhYmVsOworCXN0cnVjdCBkX3BhcnRpdGlvbiAqIHBhcnRpdGlvbjsKKworCWRhdGEgPSByZWFkX2Rldl9zZWN0b3IoYmRldiwgMCwgJnNlY3QpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC0xOworCisJbGFiZWwgPSAoc3RydWN0IGRpc2tsYWJlbCAqKSAoZGF0YSs2NCk7CisJcGFydGl0aW9uID0gbGFiZWwtPmRfcGFydGl0aW9uczsKKwlpZiAobGUzMl90b19jcHUobGFiZWwtPmRfbWFnaWMpICE9IERJU0tMQUJFTE1BR0lDKSB7CisJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGxlMzJfdG9fY3B1KGxhYmVsLT5kX21hZ2ljMikgIT0gRElTS0xBQkVMTUFHSUMpIHsKKwkJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJCXJldHVybiAwOworCX0KKwlmb3IgKGkgPSAwIDsgaSA8IGxlMTZfdG9fY3B1KGxhYmVsLT5kX25wYXJ0aXRpb25zKTsgaSsrLCBwYXJ0aXRpb24rKykgeworCQlpZiAoc2xvdCA9PSBzdGF0ZS0+bGltaXQpCisJCSAgICAgICAgYnJlYWs7CisJCWlmIChsZTMyX3RvX2NwdShwYXJ0aXRpb24tPnBfc2l6ZSkpCisJCQlwdXRfcGFydGl0aW9uKHN0YXRlLCBzbG90LAorCQkJCWxlMzJfdG9fY3B1KHBhcnRpdGlvbi0+cF9vZmZzZXQpLAorCQkJCWxlMzJfdG9fY3B1KHBhcnRpdGlvbi0+cF9zaXplKSk7CisJCXNsb3QrKzsKKwl9CisJcHJpbnRrKCJcbiIpOworCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9vc2YuaCBiL2ZzL3BhcnRpdGlvbnMvb3NmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3YjhlYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvb3NmLmgKQEAgLTAsMCArMSw3IEBACisvKgorICogIGZzL3BhcnRpdGlvbnMvb3NmLmgKKyAqLworCisjZGVmaW5lIERJU0tMQUJFTE1BR0lDICgweDgyNTY0NTU3VUwpCisKK2ludCBvc2ZfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpOwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9zZ2kuYyBiL2ZzL3BhcnRpdGlvbnMvc2dpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhNGZmOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvc2dpLmMKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqICBmcy9wYXJ0aXRpb25zL3NnaS5jCisgKgorICogIENvZGUgZXh0cmFjdGVkIGZyb20gZHJpdmVycy9ibG9jay9nZW5oZC5jCisgKi8KKworI2luY2x1ZGUgImNoZWNrLmgiCisjaW5jbHVkZSAic2dpLmgiCisKK3N0cnVjdCBzZ2lfZGlza2xhYmVsIHsKKwlfX2JlMzIgbWFnaWNfbXVzaHJvb207CQkvKiBCaWcgZmF0IHNwbGlmZi4uLiAqLworCV9fYmUxNiByb290X3BhcnRfbnVtOwkJLyogUm9vdCBwYXJ0aXRpb24gbnVtYmVyICovCisJX19iZTE2IHN3YXBfcGFydF9udW07CQkvKiBTd2FwIHBhcnRpdGlvbiBudW1iZXIgKi8KKwlzOCBib290X2ZpbGVbMTZdOwkJLyogTmFtZSBvZiBib290IGZpbGUgZm9yIEFSQ1MgKi8KKwl1OCBfdW51c2VkMFs0OF07CQkvKiBEZXZpY2UgcGFyYW1ldGVyIHVzZWxlc3MgY3JhcG9sYS4uICovCisJc3RydWN0IHNnaV92b2x1bWUgeworCQlzOCBuYW1lWzhdOwkJLyogTmFtZSBvZiB2b2x1bWUgKi8KKwkJX19iZTMyIGJsb2NrX251bTsJCS8qIExvZ2ljYWwgYmxvY2sgbnVtYmVyICovCisJCV9fYmUzMiBudW1fYnl0ZXM7CQkvKiBIb3cgYmlnLCBpbiBieXRlcyAqLworCX0gdm9sdW1lWzE1XTsKKwlzdHJ1Y3Qgc2dpX3BhcnRpdGlvbiB7CisJCV9fYmUzMiBudW1fYmxvY2tzOwkJLyogU2l6ZSBpbiBsb2dpY2FsIGJsb2NrcyAqLworCQlfX2JlMzIgZmlyc3RfYmxvY2s7CS8qIEZpcnN0IGxvZ2ljYWwgYmxvY2sgKi8KKwkJX19iZTMyIHR5cGU7CQkvKiBUeXBlIG9mIHRoaXMgcGFydGl0aW9uICovCisJfSBwYXJ0aXRpb25zWzE2XTsKKwlfX2JlMzIgY3N1bTsJCQkvKiBEaXNrIGxhYmVsIGNoZWNrc3VtICovCisJX19iZTMyIF91bnVzZWQxOwkJCS8qIFBhZGRpbmcgKi8KK307CisKK2ludCBzZ2lfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJaW50IGksIGNzdW07CisJX19iZTMyIG1hZ2ljOworCWludCBzbG90ID0gMTsKKwl1bnNpZ25lZCBpbnQgc3RhcnQsIGJsb2NrczsKKwlfX2JlMzIgKnVpLCBjczsKKwlTZWN0b3Igc2VjdDsKKwlzdHJ1Y3Qgc2dpX2Rpc2tsYWJlbCAqbGFiZWw7CisJc3RydWN0IHNnaV9wYXJ0aXRpb24gKnA7CisJY2hhciBiW0JERVZOQU1FX1NJWkVdOworCisJbGFiZWwgPSAoc3RydWN0IHNnaV9kaXNrbGFiZWwgKikgcmVhZF9kZXZfc2VjdG9yKGJkZXYsIDAsICZzZWN0KTsKKwlpZiAoIWxhYmVsKQorCQlyZXR1cm4gLTE7CisJcCA9ICZsYWJlbC0+cGFydGl0aW9uc1swXTsKKwltYWdpYyA9IGxhYmVsLT5tYWdpY19tdXNocm9vbTsKKwlpZihiZTMyX3RvX2NwdShtYWdpYykgIT0gU0dJX0xBQkVMX01BR0lDKSB7CisJCS8qcHJpbnRrKCJEZXYgJXMgU0dJIGRpc2tsYWJlbDogYmFkIG1hZ2ljICUwOHhcbiIsCisJCSAgICAgICBiZGV2bmFtZShiZGV2LCBiKSwgYmUzMl90b19jcHUobWFnaWMpKTsqLworCQlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwkJcmV0dXJuIDA7CisJfQorCXVpID0gKChfX2JlMzIgKikgKGxhYmVsICsgMSkpIC0gMTsKKwlmb3IoY3N1bSA9IDA7IHVpID49ICgoX19iZTMyICopIGxhYmVsKTspIHsKKwkJY3MgPSAqdWktLTsKKwkJY3N1bSArPSBiZTMyX3RvX2NwdShjcyk7CisJfQorCWlmKGNzdW0pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGV2ICVzIFNHSSBkaXNrbGFiZWw6IGNzdW0gYmFkLCBsYWJlbCBjb3JydXB0ZWRcbiIsCisJCSAgICAgICBiZGV2bmFtZShiZGV2LCBiKSk7CisJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCQlyZXR1cm4gMDsKKwl9CisJLyogQWxsIFNHSSBkaXNrIGxhYmVscyBoYXZlIDE2IHBhcnRpdGlvbnMsIGRpc2tzIHVuZGVyIExpbnV4IG9ubHkKKwkgKiBoYXZlIDE1IG1pbm9yJ3MuICBMdWNraWx5IHRoZXJlIGFyZSBhbHdheXMgYSBmZXcgemVybyBsZW5ndGgKKwkgKiBwYXJ0aXRpb25zIHdoaWNoIHdlIGRvbid0IGNhcmUgYWJvdXQgc28gd2UgbmV2ZXIgb3ZlcmZsb3cgdGhlCisJICogY3VycmVudF9taW5vci4KKwkgKi8KKwlmb3IoaSA9IDA7IGkgPCAxNjsgaSsrLCBwKyspIHsKKwkJYmxvY2tzID0gYmUzMl90b19jcHUocC0+bnVtX2Jsb2Nrcyk7CisJCXN0YXJ0ICA9IGJlMzJfdG9fY3B1KHAtPmZpcnN0X2Jsb2NrKTsKKwkJaWYgKGJsb2NrcykgeworCQkJcHV0X3BhcnRpdGlvbihzdGF0ZSwgc2xvdCwgc3RhcnQsIGJsb2Nrcyk7CisJCQlpZiAoYmUzMl90b19jcHUocC0+dHlwZSkgPT0gTElOVVhfUkFJRF9QQVJUSVRJT04pCisJCQkJc3RhdGUtPnBhcnRzW3Nsb3RdLmZsYWdzID0gMTsKKwkJfQorCQlzbG90Kys7CisJfQorCXByaW50aygiXG4iKTsKKwlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvc2dpLmggYi9mcy9wYXJ0aXRpb25zL3NnaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNTU5NWMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL3NnaS5oCkBAIC0wLDAgKzEsOCBAQAorLyoKKyAqICBmcy9wYXJ0aXRpb25zL3NnaS5oCisgKi8KKworZXh0ZXJuIGludCBzZ2lfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpOworCisjZGVmaW5lIFNHSV9MQUJFTF9NQUdJQyAweDBiZTVhOTQxCisKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvc3VuLmMgYi9mcy9wYXJ0aXRpb25zL3N1bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZTkxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL3N1bi5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiAgZnMvcGFydGl0aW9ucy9zdW4uYworICoKKyAqICBDb2RlIGV4dHJhY3RlZCBmcm9tIGRyaXZlcnMvYmxvY2svZ2VuaGQuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCAgTGludXMgVG9ydmFsZHMKKyAqICBSZS1vcmdhbmlzZWQgRmViIDE5OTggUnVzc2VsbCBLaW5nCisgKi8KKworI2luY2x1ZGUgImNoZWNrLmgiCisjaW5jbHVkZSAic3VuLmgiCisKK2ludCBzdW5fcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJaW50IGk7CisJX19iZTE2IGNzdW07CisJaW50IHNsb3QgPSAxOworCV9fYmUxNiAqdXNoOworCVNlY3RvciBzZWN0OworCXN0cnVjdCBzdW5fZGlza2xhYmVsIHsKKwkJdW5zaWduZWQgY2hhciBpbmZvWzEyOF07ICAgLyogSW5mb3JtYXRpdmUgdGV4dCBzdHJpbmcgKi8KKwkJdW5zaWduZWQgY2hhciBzcGFyZTBbMTRdOworCQlzdHJ1Y3Qgc3VuX2luZm8geworCQkJdW5zaWduZWQgY2hhciBzcGFyZTE7CisJCQl1bnNpZ25lZCBjaGFyIGlkOworCQkJdW5zaWduZWQgY2hhciBzcGFyZTI7CisJCQl1bnNpZ25lZCBjaGFyIGZsYWdzOworCQl9IGluZm9zWzhdOworCQl1bnNpZ25lZCBjaGFyIHNwYXJlWzI0Nl07ICAvKiBCb290IGluZm9ybWF0aW9uIGV0Yy4gKi8KKwkJX19iZTE2IHJzcGVlZDsgICAgIC8qIERpc2sgcm90YXRpb25hbCBzcGVlZCAqLworCQlfX2JlMTYgcGN5bGNvdW50OyAgLyogUGh5c2ljYWwgY3lsaW5kZXIgY291bnQgKi8KKwkJX19iZTE2IHNwYXJlY3lsOyAgIC8qIGV4dHJhIHNlY3RzIHBlciBjeWxpbmRlciAqLworCQl1bnNpZ25lZCBjaGFyIHNwYXJlMls0XTsgICAvKiBNb3JlIG1hZ2ljLi4uICovCisJCV9fYmUxNiBpbGZhY3Q7ICAgICAvKiBJbnRlcmxlYXZlIGZhY3RvciAqLworCQlfX2JlMTYgbmN5bDsgICAgICAgLyogRGF0YSBjeWxpbmRlciBjb3VudCAqLworCQlfX2JlMTYgbmFjeWw7ICAgICAgLyogQWx0LiBjeWxpbmRlciBjb3VudCAqLworCQlfX2JlMTYgbnRya3M7ICAgICAgLyogVHJhY2tzIHBlciBjeWxpbmRlciAqLworCQlfX2JlMTYgbnNlY3Q7ICAgICAgLyogU2VjdG9ycyBwZXIgdHJhY2sgKi8KKwkJdW5zaWduZWQgY2hhciBzcGFyZTNbNF07ICAgLyogRXZlbiBtb3JlIG1hZ2ljLi4uICovCisJCXN0cnVjdCBzdW5fcGFydGl0aW9uIHsKKwkJCV9fYmUzMiBzdGFydF9jeWxpbmRlcjsKKwkJCV9fYmUzMiBudW1fc2VjdG9yczsKKwkJfSBwYXJ0aXRpb25zWzhdOworCQlfX2JlMTYgbWFnaWM7ICAgICAgLyogTWFnaWMgbnVtYmVyICovCisJCV9fYmUxNiBjc3VtOyAgICAgICAvKiBMYWJlbCB4b3InZCBjaGVja3N1bSAqLworCX0gKiBsYWJlbDsJCQorCXN0cnVjdCBzdW5fcGFydGl0aW9uICpwOworCXVuc2lnbmVkIGxvbmcgc3BjOworCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKKworCWxhYmVsID0gKHN0cnVjdCBzdW5fZGlza2xhYmVsICopcmVhZF9kZXZfc2VjdG9yKGJkZXYsIDAsICZzZWN0KTsKKwlpZiAoIWxhYmVsKQorCQlyZXR1cm4gLTE7CisKKwlwID0gbGFiZWwtPnBhcnRpdGlvbnM7CisJaWYgKGJlMTZfdG9fY3B1KGxhYmVsLT5tYWdpYykgIT0gU1VOX0xBQkVMX01BR0lDKSB7CisvKgkJcHJpbnRrKEtFUk5fSU5GTyAiRGV2ICVzIFN1biBkaXNrbGFiZWw6IGJhZCBtYWdpYyAlMDR4XG4iLAorCQkgICAgICAgYmRldm5hbWUoYmRldiwgYiksIGJlMTZfdG9fY3B1KGxhYmVsLT5tYWdpYykpOyAqLworCQlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIExvb2sgYXQgdGhlIGNoZWNrc3VtICovCisJdXNoID0gKChfX2JlMTYgKikgKGxhYmVsKzEpKSAtIDE7CisJZm9yIChjc3VtID0gMDsgdXNoID49ICgoX19iZTE2ICopIGxhYmVsKTspCisJCWNzdW0gXj0gKnVzaC0tOworCWlmIChjc3VtKSB7CisJCXByaW50aygiRGV2ICVzIFN1biBkaXNrbGFiZWw6IENzdW0gYmFkLCBsYWJlbCBjb3JydXB0ZWRcbiIsCisJCSAgICAgICBiZGV2bmFtZShiZGV2LCBiKSk7CisJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBBbGwgU3VuIGRpc2tzIGhhdmUgOCBwYXJ0aXRpb24gZW50cmllcyAqLworCXNwYyA9IGJlMTZfdG9fY3B1KGxhYmVsLT5udHJrcykgKiBiZTE2X3RvX2NwdShsYWJlbC0+bnNlY3QpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyssIHArKykgeworCQl1bnNpZ25lZCBsb25nIHN0X3NlY3RvcjsKKwkJaW50IG51bV9zZWN0b3JzOworCisJCXN0X3NlY3RvciA9IGJlMzJfdG9fY3B1KHAtPnN0YXJ0X2N5bGluZGVyKSAqIHNwYzsKKwkJbnVtX3NlY3RvcnMgPSBiZTMyX3RvX2NwdShwLT5udW1fc2VjdG9ycyk7CisJCWlmIChudW1fc2VjdG9ycykgeworCQkJcHV0X3BhcnRpdGlvbihzdGF0ZSwgc2xvdCwgc3Rfc2VjdG9yLCBudW1fc2VjdG9ycyk7CisJCQlpZiAobGFiZWwtPmluZm9zW2ldLmlkID09IExJTlVYX1JBSURfUEFSVElUSU9OKQorCQkJCXN0YXRlLT5wYXJ0c1tzbG90XS5mbGFncyA9IDE7CisJCX0KKwkJc2xvdCsrOworCX0KKwlwcmludGsoIlxuIik7CisJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL3N1bi5oIGIvZnMvcGFydGl0aW9ucy9zdW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWIxOWZkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcGFydGl0aW9ucy9zdW4uaApAQCAtMCwwICsxLDcgQEAKKy8qCisgKiAgZnMvcGFydGl0aW9ucy9zdW4uaAorICovCisKKyNkZWZpbmUgU1VOX0xBQkVMX01BR0lDICAgICAgICAgIDB4REFCRQorCitpbnQgc3VuX3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KTsKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvdWx0cml4LmMgYi9mcy9wYXJ0aXRpb25zL3VsdHJpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOGQ0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL3VsdHJpeC5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiAgZnMvcGFydGl0aW9ucy91bHRyaXguYworICoKKyAqICBDb2RlIGV4dHJhY3RlZCBmcm9tIGRyaXZlcnMvYmxvY2svZ2VuaGQuYworICoKKyAqICBSZS1vcmdhbmlzZWQgSnVsIDE5OTkgUnVzc2VsbCBLaW5nCisgKi8KKworI2luY2x1ZGUgImNoZWNrLmgiCisKK2ludCB1bHRyaXhfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJaW50IGk7CisJU2VjdG9yIHNlY3Q7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlzdHJ1Y3QgdWx0cml4X2Rpc2tsYWJlbCB7CisJCXMzMglwdF9tYWdpYzsJLyogbWFnaWMgbm8uIGluZGljYXRpbmcgcGFydC4gaW5mbyBleGl0cyAqLworCQlzMzIJcHRfdmFsaWQ7CS8qIHNldCBieSBkcml2ZXIgaWYgcHQgaXMgY3VycmVudCAqLworCQlzdHJ1Y3QgIHB0X2luZm8geworCQkJczMyCQlwaV9uYmxvY2tzOyAvKiBuby4gb2Ygc2VjdG9ycyAqLworCQkJdTMyCQlwaV9ibGtvZmY7ICAvKiBibG9jayBvZmZzZXQgZm9yIHN0YXJ0ICovCisJCX0gcHRfcGFydFs4XTsKKwl9ICpsYWJlbDsKKworI2RlZmluZSBQVF9NQUdJQwkweDAzMjk1NwkvKiBQYXJ0aXRpb24gbWFnaWMgbnVtYmVyICovCisjZGVmaW5lIFBUX1ZBTElECTEJCS8qIEluZGljYXRlcyBpZiBzdHJ1Y3QgaXMgdmFsaWQgKi8KKworCWRhdGEgPSByZWFkX2Rldl9zZWN0b3IoYmRldiwgKDE2Mzg0IC0gc2l6ZW9mKCpsYWJlbCkpLzUxMiwgJnNlY3QpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC0xOworCQorCWxhYmVsID0gKHN0cnVjdCB1bHRyaXhfZGlza2xhYmVsICopKGRhdGEgKyA1MTIgLSBzaXplb2YoKmxhYmVsKSk7CisKKwlpZiAobGFiZWwtPnB0X21hZ2ljID09IFBUX01BR0lDICYmIGxhYmVsLT5wdF92YWxpZCA9PSBQVF9WQUxJRCkgeworCQlmb3IgKGk9MDsgaTw4OyBpKyspCisJCQlpZiAobGFiZWwtPnB0X3BhcnRbaV0ucGlfbmJsb2NrcykKKwkJCQlwdXRfcGFydGl0aW9uKHN0YXRlLCBpKzEsIAorCQkJCQkgICAgICBsYWJlbC0+cHRfcGFydFtpXS5waV9ibGtvZmYsCisJCQkJCSAgICAgIGxhYmVsLT5wdF9wYXJ0W2ldLnBpX25ibG9ja3MpOworCQlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwkJcHJpbnRrICgiXG4iKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJCXJldHVybiAwOworCX0KK30KZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvdWx0cml4LmggYi9mcy9wYXJ0aXRpb25zL3VsdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NGJmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL3VsdHJpeC5oCkBAIC0wLDAgKzEsNSBAQAorLyoKKyAqICBmcy9wYXJ0aXRpb25zL3VsdHJpeC5oCisgKi8KKworaW50IHVsdHJpeF9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldik7CmRpZmYgLS1naXQgYS9mcy9waXBlLmMgYi9mcy9waXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhYTA5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BpcGUuYwpAQCAtMCwwICsxLDgzNSBAQAorLyoKKyAqICBsaW51eC9mcy9waXBlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk5ICBMaW51cyBUb3J2YWxkcworICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvcGlwZV9mc19pLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisKKy8qCisgKiBXZSB1c2UgYSBzdGFydCtsZW4gY29uc3RydWN0aW9uLCB3aGljaCBwcm92aWRlcyBmdWxsIHVzZSBvZiB0aGUgCisgKiBhbGxvY2F0ZWQgbWVtb3J5LgorICogLS0gRmxvcmlhbiBDb29zbWFubiAoRkdDKQorICogCisgKiBSZWFkcyB3aXRoIGNvdW50ID0gMCBzaG91bGQgYWx3YXlzIHJldHVybiAwLgorICogLS0gSnVsaWFuIEJyYWRmaWVsZCAxOTk5LTA2LTA3LgorICoKKyAqIEZJRk9zIGFuZCBQaXBlcyBub3cgZ2VuZXJhdGUgU0lHSU8gZm9yIGJvdGggcmVhZGVycyBhbmQgd3JpdGVycy4KKyAqIC0tIEplcmVteSBFbHNvbiA8amVsc29uQGNpcmNsZW11ZC5vcmc+IDIwMDEtMDgtMTYKKyAqCisgKiBwaXBlX3JlYWQgJiB3cml0ZSBjbGVhbnVwCisgKiAtLSBNYW5mcmVkIFNwcmF1bCA8bWFuZnJlZEBjb2xvcmZ1bGxpZmUuY29tPiAyMDAyLTA1LTA5CisgKi8KKworLyogRHJvcCB0aGUgaW5vZGUgc2VtYXBob3JlIGFuZCB3YWl0IGZvciBhIHBpcGUgZXZlbnQsIGF0b21pY2FsbHkgKi8KK3ZvaWQgcGlwZV93YWl0KHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCURFRklORV9XQUlUKHdhaXQpOworCisJcHJlcGFyZV90b193YWl0KFBJUEVfV0FJVCgqaW5vZGUpLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwl1cChQSVBFX1NFTSgqaW5vZGUpKTsKKwlzY2hlZHVsZSgpOworCWZpbmlzaF93YWl0KFBJUEVfV0FJVCgqaW5vZGUpLCAmd2FpdCk7CisJZG93bihQSVBFX1NFTSgqaW5vZGUpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3BpcGVfaW92X2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBzdHJ1Y3QgaW92ZWMgKmlvdiwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBjb3B5OworCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJd2hpbGUgKCFpb3YtPmlvdl9sZW4pCisJCQlpb3YrKzsKKwkJY29weSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGxlbiwgaW92LT5pb3ZfbGVuKTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIodG8sIGlvdi0+aW92X2Jhc2UsIGNvcHkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXRvICs9IGNvcHk7CisJCWxlbiAtPSBjb3B5OworCQlpb3YtPmlvdl9iYXNlICs9IGNvcHk7CisJCWlvdi0+aW92X2xlbiAtPSBjb3B5OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3BpcGVfaW92X2NvcHlfdG9fdXNlcihzdHJ1Y3QgaW92ZWMgKmlvdiwgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBjb3B5OworCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJd2hpbGUgKCFpb3YtPmlvdl9sZW4pCisJCQlpb3YrKzsKKwkJY29weSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGxlbiwgaW92LT5pb3ZfbGVuKTsKKworCQlpZiAoY29weV90b191c2VyKGlvdi0+aW92X2Jhc2UsIGZyb20sIGNvcHkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWZyb20gKz0gY29weTsKKwkJbGVuIC09IGNvcHk7CisJCWlvdi0+aW92X2Jhc2UgKz0gY29weTsKKwkJaW92LT5pb3ZfbGVuIC09IGNvcHk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbm9uX3BpcGVfYnVmX3JlbGVhc2Uoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqaW5mbywgc3RydWN0IHBpcGVfYnVmZmVyICpidWYpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBidWYtPnBhZ2U7CisKKwlpZiAoaW5mby0+dG1wX3BhZ2UpIHsKKwkJX19mcmVlX3BhZ2UocGFnZSk7CisJCXJldHVybjsKKwl9CisJaW5mby0+dG1wX3BhZ2UgPSBwYWdlOworfQorCitzdGF0aWMgdm9pZCAqYW5vbl9waXBlX2J1Zl9tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKmluZm8sIHN0cnVjdCBwaXBlX2J1ZmZlciAqYnVmKQoreworCXJldHVybiBrbWFwKGJ1Zi0+cGFnZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFub25fcGlwZV9idWZfdW5tYXAoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqaW5mbywgc3RydWN0IHBpcGVfYnVmZmVyICpidWYpCit7CisJa3VubWFwKGJ1Zi0+cGFnZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGlwZV9idWZfb3BlcmF0aW9ucyBhbm9uX3BpcGVfYnVmX29wcyA9IHsKKwkuY2FuX21lcmdlID0gMSwKKwkubWFwID0gYW5vbl9waXBlX2J1Zl9tYXAsCisJLnVubWFwID0gYW5vbl9waXBlX2J1Zl91bm1hcCwKKwkucmVsZWFzZSA9IGFub25fcGlwZV9idWZfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzc2l6ZV90CitwaXBlX3JlYWR2KHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKl9pb3YsCisJICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKmluZm87CisJaW50IGRvX3dha2V1cDsKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3QgaW92ZWMgKmlvdiA9IChzdHJ1Y3QgaW92ZWMgKilfaW92OworCXNpemVfdCB0b3RhbF9sZW47CisKKwl0b3RhbF9sZW4gPSBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2Vncyk7CisJLyogTnVsbCByZWFkIHN1Y2NlZWRzLiAqLworCWlmICh1bmxpa2VseSh0b3RhbF9sZW4gPT0gMCkpCisJCXJldHVybiAwOworCisJZG9fd2FrZXVwID0gMDsKKwlyZXQgPSAwOworCWRvd24oUElQRV9TRU0oKmlub2RlKSk7CisJaW5mbyA9IGlub2RlLT5pX3BpcGU7CisJZm9yICg7OykgeworCQlpbnQgYnVmcyA9IGluZm8tPm5yYnVmczsKKwkJaWYgKGJ1ZnMpIHsKKwkJCWludCBjdXJidWYgPSBpbmZvLT5jdXJidWY7CisJCQlzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZiA9IGluZm8tPmJ1ZnMgKyBjdXJidWY7CisJCQlzdHJ1Y3QgcGlwZV9idWZfb3BlcmF0aW9ucyAqb3BzID0gYnVmLT5vcHM7CisJCQl2b2lkICphZGRyOworCQkJc2l6ZV90IGNoYXJzID0gYnVmLT5sZW47CisJCQlpbnQgZXJyb3I7CisKKwkJCWlmIChjaGFycyA+IHRvdGFsX2xlbikKKwkJCQljaGFycyA9IHRvdGFsX2xlbjsKKworCQkJYWRkciA9IG9wcy0+bWFwKGZpbHAsIGluZm8sIGJ1Zik7CisJCQllcnJvciA9IHBpcGVfaW92X2NvcHlfdG9fdXNlcihpb3YsIGFkZHIgKyBidWYtPm9mZnNldCwgY2hhcnMpOworCQkJb3BzLT51bm1hcChpbmZvLCBidWYpOworCQkJaWYgKHVubGlrZWx5KGVycm9yKSkgeworCQkJCWlmICghcmV0KSByZXQgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJcmV0ICs9IGNoYXJzOworCQkJYnVmLT5vZmZzZXQgKz0gY2hhcnM7CisJCQlidWYtPmxlbiAtPSBjaGFyczsKKwkJCWlmICghYnVmLT5sZW4pIHsKKwkJCQlidWYtPm9wcyA9IE5VTEw7CisJCQkJb3BzLT5yZWxlYXNlKGluZm8sIGJ1Zik7CisJCQkJY3VyYnVmID0gKGN1cmJ1ZiArIDEpICYgKFBJUEVfQlVGRkVSUy0xKTsKKwkJCQlpbmZvLT5jdXJidWYgPSBjdXJidWY7CisJCQkJaW5mby0+bnJidWZzID0gLS1idWZzOworCQkJCWRvX3dha2V1cCA9IDE7CisJCQl9CisJCQl0b3RhbF9sZW4gLT0gY2hhcnM7CisJCQlpZiAoIXRvdGFsX2xlbikKKwkJCQlicmVhazsJLyogY29tbW9uIHBhdGg6IHJlYWQgc3VjY2VlZGVkICovCisJCX0KKwkJaWYgKGJ1ZnMpCS8qIE1vcmUgdG8gZG8/ICovCisJCQljb250aW51ZTsKKwkJaWYgKCFQSVBFX1dSSVRFUlMoKmlub2RlKSkKKwkJCWJyZWFrOworCQlpZiAoIVBJUEVfV0FJVElOR19XUklURVJTKCppbm9kZSkpIHsKKwkJCS8qIHN5c2NhbGwgbWVyZ2luZzogVXN1YWxseSB3ZSBtdXN0IG5vdCBzbGVlcAorCQkJICogaWYgT19OT05CTE9DSyBpcyBzZXQsIG9yIGlmIHdlIGdvdCBzb21lIGRhdGEuCisJCQkgKiBCdXQgaWYgYSB3cml0ZXIgc2xlZXBzIGluIGtlcm5lbCBzcGFjZSwgdGhlbgorCQkJICogd2UgY2FuIHdhaXQgZm9yIHRoYXQgZGF0YSB3aXRob3V0IHZpb2xhdGluZyBQT1NJWC4KKwkJCSAqLworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCXJldCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlpZiAoIXJldCkgcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGRvX3dha2V1cCkgeworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3N5bmMoUElQRV9XQUlUKCppbm9kZSkpOworIAkJCWtpbGxfZmFzeW5jKFBJUEVfRkFTWU5DX1dSSVRFUlMoKmlub2RlKSwgU0lHSU8sIFBPTExfT1VUKTsKKwkJfQorCQlwaXBlX3dhaXQoaW5vZGUpOworCX0KKwl1cChQSVBFX1NFTSgqaW5vZGUpKTsKKwkvKiBTaWduYWwgd3JpdGVycyBhc3luY2hyb25vdXNseSB0aGF0IHRoZXJlIGlzIG1vcmUgcm9vbS4gICovCisJaWYgKGRvX3dha2V1cCkgeworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoUElQRV9XQUlUKCppbm9kZSkpOworCQlraWxsX2Zhc3luYyhQSVBFX0ZBU1lOQ19XUklURVJTKCppbm9kZSksIFNJR0lPLCBQT0xMX09VVCk7CisJfQorCWlmIChyZXQgPiAwKQorCQlmaWxlX2FjY2Vzc2VkKGZpbHApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitwaXBlX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpb3ZlYyBpb3YgPSB7IC5pb3ZfYmFzZSA9IGJ1ZiwgLmlvdl9sZW4gPSBjb3VudCB9OworCXJldHVybiBwaXBlX3JlYWR2KGZpbHAsICZpb3YsIDEsIHBwb3MpOworfQorCitzdGF0aWMgc3NpemVfdAorcGlwZV93cml0ZXYoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqX2lvdiwKKwkgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKmluZm87CisJc3NpemVfdCByZXQ7CisJaW50IGRvX3dha2V1cDsKKwlzdHJ1Y3QgaW92ZWMgKmlvdiA9IChzdHJ1Y3QgaW92ZWMgKilfaW92OworCXNpemVfdCB0b3RhbF9sZW47CisJc3NpemVfdCBjaGFyczsKKworCXRvdGFsX2xlbiA9IGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKKwkvKiBOdWxsIHdyaXRlIHN1Y2NlZWRzLiAqLworCWlmICh1bmxpa2VseSh0b3RhbF9sZW4gPT0gMCkpCisJCXJldHVybiAwOworCisJZG9fd2FrZXVwID0gMDsKKwlyZXQgPSAwOworCWRvd24oUElQRV9TRU0oKmlub2RlKSk7CisJaW5mbyA9IGlub2RlLT5pX3BpcGU7CisKKwlpZiAoIVBJUEVfUkVBREVSUygqaW5vZGUpKSB7CisJCXNlbmRfc2lnKFNJR1BJUEUsIGN1cnJlbnQsIDApOworCQlyZXQgPSAtRVBJUEU7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFdlIHRyeSB0byBtZXJnZSBzbWFsbCB3cml0ZXMgKi8KKwljaGFycyA9IHRvdGFsX2xlbiAmIChQQUdFX1NJWkUtMSk7IC8qIHNpemUgb2YgdGhlIGxhc3QgYnVmZmVyICovCisJaWYgKGluZm8tPm5yYnVmcyAmJiBjaGFycyAhPSAwKSB7CisJCWludCBsYXN0YnVmID0gKGluZm8tPmN1cmJ1ZiArIGluZm8tPm5yYnVmcyAtIDEpICYgKFBJUEVfQlVGRkVSUy0xKTsKKwkJc3RydWN0IHBpcGVfYnVmZmVyICpidWYgPSBpbmZvLT5idWZzICsgbGFzdGJ1ZjsKKwkJc3RydWN0IHBpcGVfYnVmX29wZXJhdGlvbnMgKm9wcyA9IGJ1Zi0+b3BzOworCQlpbnQgb2Zmc2V0ID0gYnVmLT5vZmZzZXQgKyBidWYtPmxlbjsKKwkJaWYgKG9wcy0+Y2FuX21lcmdlICYmIG9mZnNldCArIGNoYXJzIDw9IFBBR0VfU0laRSkgeworCQkJdm9pZCAqYWRkciA9IG9wcy0+bWFwKGZpbHAsIGluZm8sIGJ1Zik7CisJCQlpbnQgZXJyb3IgPSBwaXBlX2lvdl9jb3B5X2Zyb21fdXNlcihvZmZzZXQgKyBhZGRyLCBpb3YsIGNoYXJzKTsKKwkJCW9wcy0+dW5tYXAoaW5mbywgYnVmKTsKKwkJCXJldCA9IGVycm9yOworCQkJZG9fd2FrZXVwID0gMTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIG91dDsKKwkJCWJ1Zi0+bGVuICs9IGNoYXJzOworCQkJdG90YWxfbGVuIC09IGNoYXJzOworCQkJcmV0ID0gY2hhcnM7CisJCQlpZiAoIXRvdGFsX2xlbikKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWZvciAoOzspIHsKKwkJaW50IGJ1ZnM7CisJCWlmICghUElQRV9SRUFERVJTKCppbm9kZSkpIHsKKwkJCXNlbmRfc2lnKFNJR1BJUEUsIGN1cnJlbnQsIDApOworCQkJaWYgKCFyZXQpIHJldCA9IC1FUElQRTsKKwkJCWJyZWFrOworCQl9CisJCWJ1ZnMgPSBpbmZvLT5ucmJ1ZnM7CisJCWlmIChidWZzIDwgUElQRV9CVUZGRVJTKSB7CisJCQlpbnQgbmV3YnVmID0gKGluZm8tPmN1cmJ1ZiArIGJ1ZnMpICYgKFBJUEVfQlVGRkVSUy0xKTsKKwkJCXN0cnVjdCBwaXBlX2J1ZmZlciAqYnVmID0gaW5mby0+YnVmcyArIG5ld2J1ZjsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gaW5mby0+dG1wX3BhZ2U7CisJCQlpbnQgZXJyb3I7CisKKwkJCWlmICghcGFnZSkgeworCQkJCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9ISUdIVVNFUik7CisJCQkJaWYgKHVubGlrZWx5KCFwYWdlKSkgeworCQkJCQlyZXQgPSByZXQgPyA6IC1FTk9NRU07CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpbmZvLT50bXBfcGFnZSA9IHBhZ2U7CisJCQl9CisJCQkvKiBBbHdheXMgd2FrZXVwLCBldmVuIGlmIHRoZSBjb3B5IGZhaWxzLiBPdGhlcndpc2UKKwkJCSAqIHdlIGxvY2sgdXAgKE9fTk9OQkxPQ0stKXJlYWRlcnMgdGhhdCBzbGVlcCBkdWUgdG8KKwkJCSAqIHN5c2NhbGwgbWVyZ2luZy4KKwkJCSAqIEZJWE1FISBJcyB0aGlzIHJlYWxseSB0cnVlPworCQkJICovCisJCQlkb193YWtldXAgPSAxOworCQkJY2hhcnMgPSBQQUdFX1NJWkU7CisJCQlpZiAoY2hhcnMgPiB0b3RhbF9sZW4pCisJCQkJY2hhcnMgPSB0b3RhbF9sZW47CisKKwkJCWVycm9yID0gcGlwZV9pb3ZfY29weV9mcm9tX3VzZXIoa21hcChwYWdlKSwgaW92LCBjaGFycyk7CisJCQlrdW5tYXAocGFnZSk7CisJCQlpZiAodW5saWtlbHkoZXJyb3IpKSB7CisJCQkJaWYgKCFyZXQpIHJldCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlyZXQgKz0gY2hhcnM7CisKKwkJCS8qIEluc2VydCBpdCBpbnRvIHRoZSBidWZmZXIgYXJyYXkgKi8KKwkJCWJ1Zi0+cGFnZSA9IHBhZ2U7CisJCQlidWYtPm9wcyA9ICZhbm9uX3BpcGVfYnVmX29wczsKKwkJCWJ1Zi0+b2Zmc2V0ID0gMDsKKwkJCWJ1Zi0+bGVuID0gY2hhcnM7CisJCQlpbmZvLT5ucmJ1ZnMgPSArK2J1ZnM7CisJCQlpbmZvLT50bXBfcGFnZSA9IE5VTEw7CisKKwkJCXRvdGFsX2xlbiAtPSBjaGFyczsKKwkJCWlmICghdG90YWxfbGVuKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChidWZzIDwgUElQRV9CVUZGRVJTKQorCQkJY29udGludWU7CisJCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJaWYgKCFyZXQpIHJldCA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCWlmICghcmV0KSByZXQgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZG9fd2FrZXVwKSB7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGVfc3luYyhQSVBFX1dBSVQoKmlub2RlKSk7CisJCQlraWxsX2Zhc3luYyhQSVBFX0ZBU1lOQ19SRUFERVJTKCppbm9kZSksIFNJR0lPLCBQT0xMX0lOKTsKKwkJCWRvX3dha2V1cCA9IDA7CisJCX0KKwkJUElQRV9XQUlUSU5HX1dSSVRFUlMoKmlub2RlKSsrOworCQlwaXBlX3dhaXQoaW5vZGUpOworCQlQSVBFX1dBSVRJTkdfV1JJVEVSUygqaW5vZGUpLS07CisJfQorb3V0OgorCXVwKFBJUEVfU0VNKCppbm9kZSkpOworCWlmIChkb193YWtldXApIHsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKFBJUEVfV0FJVCgqaW5vZGUpKTsKKwkJa2lsbF9mYXN5bmMoUElQRV9GQVNZTkNfUkVBREVSUygqaW5vZGUpLCBTSUdJTywgUE9MTF9JTik7CisJfQorCWlmIChyZXQgPiAwKQorCQlpbm9kZV91cGRhdGVfdGltZShpbm9kZSwgMSk7CS8qIG10aW1lIGFuZCBjdGltZSAqLworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitwaXBlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpb3ZlYyBpb3YgPSB7IC5pb3ZfYmFzZSA9ICh2b2lkIF9fdXNlciAqKWJ1ZiwgLmlvdl9sZW4gPSBjb3VudCB9OworCXJldHVybiBwaXBlX3dyaXRldihmaWxwLCAmaW92LCAxLCBwcG9zKTsKK30KKworc3RhdGljIHNzaXplX3QKK2JhZF9waXBlX3Ioc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiAtRUJBREY7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitiYWRfcGlwZV93KHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gLUVCQURGOworfQorCitzdGF0aWMgaW50CitwaXBlX2lvY3RsKHN0cnVjdCBpbm9kZSAqcGlubywgc3RydWN0IGZpbGUgKmZpbHAsCisJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKmluZm87CisJaW50IGNvdW50LCBidWYsIG5yYnVmczsKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgRklPTlJFQUQ6CisJCQlkb3duKFBJUEVfU0VNKCppbm9kZSkpOworCQkJaW5mbyA9ICBpbm9kZS0+aV9waXBlOworCQkJY291bnQgPSAwOworCQkJYnVmID0gaW5mby0+Y3VyYnVmOworCQkJbnJidWZzID0gaW5mby0+bnJidWZzOworCQkJd2hpbGUgKC0tbnJidWZzID49IDApIHsKKwkJCQljb3VudCArPSBpbmZvLT5idWZzW2J1Zl0ubGVuOworCQkJCWJ1ZiA9IChidWYrMSkgJiAoUElQRV9CVUZGRVJTLTEpOworCQkJfQorCQkJdXAoUElQRV9TRU0oKmlub2RlKSk7CisJCQlyZXR1cm4gcHV0X3VzZXIoY291bnQsIChpbnQgX191c2VyICopYXJnKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworLyogTm8ga2VybmVsIGxvY2sgaGVsZCAtIGZpbmUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3BpcGVfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzazsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqaW5mbyA9IGlub2RlLT5pX3BpcGU7CisJaW50IG5yYnVmczsKKworCXBvbGxfd2FpdChmaWxwLCBQSVBFX1dBSVQoKmlub2RlKSwgd2FpdCk7CisKKwkvKiBSZWFkaW5nIG9ubHkgLS0gbm8gbmVlZCBmb3IgYWNxdWlyaW5nIHRoZSBzZW1hcGhvcmUuICAqLworCW5yYnVmcyA9IGluZm8tPm5yYnVmczsKKwltYXNrID0gMDsKKwlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQltYXNrID0gKG5yYnVmcyA+IDApID8gUE9MTElOIHwgUE9MTFJETk9STSA6IDA7CisJCWlmICghUElQRV9XUklURVJTKCppbm9kZSkgJiYgZmlscC0+Zl92ZXJzaW9uICE9IFBJUEVfV0NPVU5URVIoKmlub2RlKSkKKwkJCW1hc2sgfD0gUE9MTEhVUDsKKwl9CisKKwlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJbWFzayB8PSAobnJidWZzIDwgUElQRV9CVUZGRVJTKSA/IFBPTExPVVQgfCBQT0xMV1JOT1JNIDogMDsKKwkJaWYgKCFQSVBFX1JFQURFUlMoKmlub2RlKSkKKwkJCW1hc2sgfD0gUE9MTEVSUjsKKwl9CisKKwlyZXR1cm4gbWFzazsKK30KKworLyogRklYTUU6IG1vc3QgVW5pY2VzIGRvIG5vdCBzZXQgUE9MTEVSUiBmb3IgZmlmb3MgKi8KKyNkZWZpbmUgZmlmb19wb2xsIHBpcGVfcG9sbAorCitzdGF0aWMgaW50CitwaXBlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGRlY3IsIGludCBkZWN3KQoreworCWRvd24oUElQRV9TRU0oKmlub2RlKSk7CisJUElQRV9SRUFERVJTKCppbm9kZSkgLT0gZGVjcjsKKwlQSVBFX1dSSVRFUlMoKmlub2RlKSAtPSBkZWN3OworCWlmICghUElQRV9SRUFERVJTKCppbm9kZSkgJiYgIVBJUEVfV1JJVEVSUygqaW5vZGUpKSB7CisJCWZyZWVfcGlwZV9pbmZvKGlub2RlKTsKKwl9IGVsc2UgeworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoUElQRV9XQUlUKCppbm9kZSkpOworCQlraWxsX2Zhc3luYyhQSVBFX0ZBU1lOQ19SRUFERVJTKCppbm9kZSksIFNJR0lPLCBQT0xMX0lOKTsKKwkJa2lsbF9mYXN5bmMoUElQRV9GQVNZTkNfV1JJVEVSUygqaW5vZGUpLCBTSUdJTywgUE9MTF9PVVQpOworCX0KKwl1cChQSVBFX1NFTSgqaW5vZGUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwaXBlX3JlYWRfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBvbikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW50IHJldHZhbDsKKworCWRvd24oUElQRV9TRU0oKmlub2RlKSk7CisJcmV0dmFsID0gZmFzeW5jX2hlbHBlcihmZCwgZmlscCwgb24sIFBJUEVfRkFTWU5DX1JFQURFUlMoKmlub2RlKSk7CisJdXAoUElQRV9TRU0oKmlub2RlKSk7CisKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK3BpcGVfd3JpdGVfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBvbikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW50IHJldHZhbDsKKworCWRvd24oUElQRV9TRU0oKmlub2RlKSk7CisJcmV0dmFsID0gZmFzeW5jX2hlbHBlcihmZCwgZmlscCwgb24sIFBJUEVfRkFTWU5DX1dSSVRFUlMoKmlub2RlKSk7CisJdXAoUElQRV9TRU0oKmlub2RlKSk7CisKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK3BpcGVfcmR3cl9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgcmV0dmFsOworCisJZG93bihQSVBFX1NFTSgqaW5vZGUpKTsKKworCXJldHZhbCA9IGZhc3luY19oZWxwZXIoZmQsIGZpbHAsIG9uLCBQSVBFX0ZBU1lOQ19SRUFERVJTKCppbm9kZSkpOworCisJaWYgKHJldHZhbCA+PSAwKQorCQlyZXR2YWwgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxwLCBvbiwgUElQRV9GQVNZTkNfV1JJVEVSUygqaW5vZGUpKTsKKworCXVwKFBJUEVfU0VNKCppbm9kZSkpOworCisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitwaXBlX3JlYWRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlwaXBlX3JlYWRfZmFzeW5jKC0xLCBmaWxwLCAwKTsKKwlyZXR1cm4gcGlwZV9yZWxlYXNlKGlub2RlLCAxLCAwKTsKK30KKworc3RhdGljIGludAorcGlwZV93cml0ZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXBpcGVfd3JpdGVfZmFzeW5jKC0xLCBmaWxwLCAwKTsKKwlyZXR1cm4gcGlwZV9yZWxlYXNlKGlub2RlLCAwLCAxKTsKK30KKworc3RhdGljIGludAorcGlwZV9yZHdyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJaW50IGRlY3IsIGRlY3c7CisKKwlwaXBlX3Jkd3JfZmFzeW5jKC0xLCBmaWxwLCAwKTsKKwlkZWNyID0gKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICE9IDA7CisJZGVjdyA9IChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkgIT0gMDsKKwlyZXR1cm4gcGlwZV9yZWxlYXNlKGlub2RlLCBkZWNyLCBkZWN3KTsKK30KKworc3RhdGljIGludAorcGlwZV9yZWFkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJLyogV2UgY291bGQgaGF2ZSBwZXJoYXBzIHVzZWQgYXRvbWljX3QsIGJ1dCB0aGlzIGFuZCBmcmllbmRzCisJICAgYmVsb3cgYXJlIHRoZSBvbmx5IHBsYWNlcy4gIFNvIGl0IGRvZXNuJ3Qgc2VlbSB3b3J0aHdoaWxlLiAgKi8KKwlkb3duKFBJUEVfU0VNKCppbm9kZSkpOworCVBJUEVfUkVBREVSUygqaW5vZGUpKys7CisJdXAoUElQRV9TRU0oKmlub2RlKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcGlwZV93cml0ZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWRvd24oUElQRV9TRU0oKmlub2RlKSk7CisJUElQRV9XUklURVJTKCppbm9kZSkrKzsKKwl1cChQSVBFX1NFTSgqaW5vZGUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwaXBlX3Jkd3Jfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlkb3duKFBJUEVfU0VNKCppbm9kZSkpOworCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQlQSVBFX1JFQURFUlMoKmlub2RlKSsrOworCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJUElQRV9XUklURVJTKCppbm9kZSkrKzsKKwl1cChQSVBFX1NFTSgqaW5vZGUpKTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhlIGZpbGVfb3BlcmF0aW9ucyBzdHJ1Y3RzIGFyZSBub3Qgc3RhdGljIGJlY2F1c2UgdGhleQorICogYXJlIGFsc28gdXNlZCBpbiBsaW51eC9mcy9maWZvLmMgdG8gZG8gb3BlcmF0aW9ucyBvbiBGSUZPcy4KKyAqLworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZWFkX2ZpZm9fZm9wcyA9IHsKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBwaXBlX3JlYWQsCisJLnJlYWR2CQk9IHBpcGVfcmVhZHYsCisJLndyaXRlCQk9IGJhZF9waXBlX3csCisJLnBvbGwJCT0gZmlmb19wb2xsLAorCS5pb2N0bAkJPSBwaXBlX2lvY3RsLAorCS5vcGVuCQk9IHBpcGVfcmVhZF9vcGVuLAorCS5yZWxlYXNlCT0gcGlwZV9yZWFkX3JlbGVhc2UsCisJLmZhc3luYwkJPSBwaXBlX3JlYWRfZmFzeW5jLAorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3cml0ZV9maWZvX2ZvcHMgPSB7CisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gYmFkX3BpcGVfciwKKwkud3JpdGUJCT0gcGlwZV93cml0ZSwKKwkud3JpdGV2CQk9IHBpcGVfd3JpdGV2LAorCS5wb2xsCQk9IGZpZm9fcG9sbCwKKwkuaW9jdGwJCT0gcGlwZV9pb2N0bCwKKwkub3BlbgkJPSBwaXBlX3dyaXRlX29wZW4sCisJLnJlbGVhc2UJPSBwaXBlX3dyaXRlX3JlbGVhc2UsCisJLmZhc3luYwkJPSBwaXBlX3dyaXRlX2Zhc3luYywKK307CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmR3cl9maWZvX2ZvcHMgPSB7CisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gcGlwZV9yZWFkLAorCS5yZWFkdgkJPSBwaXBlX3JlYWR2LAorCS53cml0ZQkJPSBwaXBlX3dyaXRlLAorCS53cml0ZXYJCT0gcGlwZV93cml0ZXYsCisJLnBvbGwJCT0gZmlmb19wb2xsLAorCS5pb2N0bAkJPSBwaXBlX2lvY3RsLAorCS5vcGVuCQk9IHBpcGVfcmR3cl9vcGVuLAorCS5yZWxlYXNlCT0gcGlwZV9yZHdyX3JlbGVhc2UsCisJLmZhc3luYwkJPSBwaXBlX3Jkd3JfZmFzeW5jLAorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZWFkX3BpcGVfZm9wcyA9IHsKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBwaXBlX3JlYWQsCisJLnJlYWR2CQk9IHBpcGVfcmVhZHYsCisJLndyaXRlCQk9IGJhZF9waXBlX3csCisJLnBvbGwJCT0gcGlwZV9wb2xsLAorCS5pb2N0bAkJPSBwaXBlX2lvY3RsLAorCS5vcGVuCQk9IHBpcGVfcmVhZF9vcGVuLAorCS5yZWxlYXNlCT0gcGlwZV9yZWFkX3JlbGVhc2UsCisJLmZhc3luYwkJPSBwaXBlX3JlYWRfZmFzeW5jLAorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3cml0ZV9waXBlX2ZvcHMgPSB7CisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gYmFkX3BpcGVfciwKKwkud3JpdGUJCT0gcGlwZV93cml0ZSwKKwkud3JpdGV2CQk9IHBpcGVfd3JpdGV2LAorCS5wb2xsCQk9IHBpcGVfcG9sbCwKKwkuaW9jdGwJCT0gcGlwZV9pb2N0bCwKKwkub3BlbgkJPSBwaXBlX3dyaXRlX29wZW4sCisJLnJlbGVhc2UJPSBwaXBlX3dyaXRlX3JlbGVhc2UsCisJLmZhc3luYwkJPSBwaXBlX3dyaXRlX2Zhc3luYywKK307CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmR3cl9waXBlX2ZvcHMgPSB7CisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gcGlwZV9yZWFkLAorCS5yZWFkdgkJPSBwaXBlX3JlYWR2LAorCS53cml0ZQkJPSBwaXBlX3dyaXRlLAorCS53cml0ZXYJCT0gcGlwZV93cml0ZXYsCisJLnBvbGwJCT0gcGlwZV9wb2xsLAorCS5pb2N0bAkJPSBwaXBlX2lvY3RsLAorCS5vcGVuCQk9IHBpcGVfcmR3cl9vcGVuLAorCS5yZWxlYXNlCT0gcGlwZV9yZHdyX3JlbGVhc2UsCisJLmZhc3luYwkJPSBwaXBlX3Jkd3JfZmFzeW5jLAorfTsKKwordm9pZCBmcmVlX3BpcGVfaW5mbyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWludCBpOworCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKmluZm8gPSBpbm9kZS0+aV9waXBlOworCisJaW5vZGUtPmlfcGlwZSA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IFBJUEVfQlVGRkVSUzsgaSsrKSB7CisJCXN0cnVjdCBwaXBlX2J1ZmZlciAqYnVmID0gaW5mby0+YnVmcyArIGk7CisJCWlmIChidWYtPm9wcykKKwkJCWJ1Zi0+b3BzLT5yZWxlYXNlKGluZm8sIGJ1Zik7CisJfQorCWlmIChpbmZvLT50bXBfcGFnZSkKKwkJX19mcmVlX3BhZ2UoaW5mby0+dG1wX3BhZ2UpOworCWtmcmVlKGluZm8pOworfQorCitzdHJ1Y3QgaW5vZGUqIHBpcGVfbmV3KHN0cnVjdCBpbm9kZSogaW5vZGUpCit7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqaW5mbzsKKworCWluZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKQorCQlnb3RvIGZhaWxfcGFnZTsKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisJaW5vZGUtPmlfcGlwZSA9IGluZm87CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKFBJUEVfV0FJVCgqaW5vZGUpKTsKKwlQSVBFX1JDT1VOVEVSKCppbm9kZSkgPSBQSVBFX1dDT1VOVEVSKCppbm9kZSkgPSAxOworCisJcmV0dXJuIGlub2RlOworZmFpbF9wYWdlOgorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHZmc21vdW50ICpwaXBlX21udDsKK3N0YXRpYyBpbnQgcGlwZWZzX2RlbGV0ZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXJldHVybiAxOworfQorc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBwaXBlZnNfZGVudHJ5X29wZXJhdGlvbnMgPSB7CisJLmRfZGVsZXRlCT0gcGlwZWZzX2RlbGV0ZV9kZW50cnksCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlICogZ2V0X3BpcGVfaW5vZGUodm9pZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmV3X2lub2RlKHBpcGVfbW50LT5tbnRfc2IpOworCisJaWYgKCFpbm9kZSkKKwkJZ290byBmYWlsX2lub2RlOworCisJaWYoIXBpcGVfbmV3KGlub2RlKSkKKwkJZ290byBmYWlsX2lwdXQ7CisJUElQRV9SRUFERVJTKCppbm9kZSkgPSBQSVBFX1dSSVRFUlMoKmlub2RlKSA9IDE7CisJaW5vZGUtPmlfZm9wID0gJnJkd3JfcGlwZV9mb3BzOworCisJLyoKKwkgKiBNYXJrIHRoZSBpbm9kZSBkaXJ0eSBmcm9tIHRoZSB2ZXJ5IGJlZ2lubmluZywKKwkgKiB0aGF0IHdheSBpdCB3aWxsIG5ldmVyIGJlIG1vdmVkIHRvIHRoZSBkaXJ0eQorCSAqIGxpc3QgYmVjYXVzZSAibWFya19pbm9kZV9kaXJ0eSgpIiB3aWxsIHRoaW5rCisJICogdGhhdCBpdCBhbHJlYWR5IF9pc18gb24gdGhlIGRpcnR5IGxpc3QuCisJICovCisJaW5vZGUtPmlfc3RhdGUgPSBJX0RJUlRZOworCWlub2RlLT5pX21vZGUgPSBTX0lGSUZPIHwgU19JUlVTUiB8IFNfSVdVU1I7CisJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX1NJWkU7CisJcmV0dXJuIGlub2RlOworCitmYWlsX2lwdXQ6CisJaXB1dChpbm9kZSk7CitmYWlsX2lub2RlOgorCXJldHVybiBOVUxMOworfQorCitpbnQgZG9fcGlwZShpbnQgKmZkKQoreworCXN0cnVjdCBxc3RyIHRoaXM7CisJY2hhciBuYW1lWzMyXTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGZpbGUgKmYxLCAqZjI7CisJaW50IGVycm9yOworCWludCBpLGo7CisKKwllcnJvciA9IC1FTkZJTEU7CisJZjEgPSBnZXRfZW1wdHlfZmlscCgpOworCWlmICghZjEpCisJCWdvdG8gbm9fZmlsZXM7CisKKwlmMiA9IGdldF9lbXB0eV9maWxwKCk7CisJaWYgKCFmMikKKwkJZ290byBjbG9zZV9mMTsKKworCWlub2RlID0gZ2V0X3BpcGVfaW5vZGUoKTsKKwlpZiAoIWlub2RlKQorCQlnb3RvIGNsb3NlX2YxMjsKKworCWVycm9yID0gZ2V0X3VudXNlZF9mZCgpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gY2xvc2VfZjEyX2lub2RlOworCWkgPSBlcnJvcjsKKworCWVycm9yID0gZ2V0X3VudXNlZF9mZCgpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gY2xvc2VfZjEyX2lub2RlX2k7CisJaiA9IGVycm9yOworCisJZXJyb3IgPSAtRU5PTUVNOworCXNwcmludGYobmFtZSwgIlslbHVdIiwgaW5vZGUtPmlfaW5vKTsKKwl0aGlzLm5hbWUgPSBuYW1lOworCXRoaXMubGVuID0gc3RybGVuKG5hbWUpOworCXRoaXMuaGFzaCA9IGlub2RlLT5pX2lubzsgLyogd2lsbCBnbyAqLworCWRlbnRyeSA9IGRfYWxsb2MocGlwZV9tbnQtPm1udF9zYi0+c19yb290LCAmdGhpcyk7CisJaWYgKCFkZW50cnkpCisJCWdvdG8gY2xvc2VfZjEyX2lub2RlX2lfajsKKwlkZW50cnktPmRfb3AgPSAmcGlwZWZzX2RlbnRyeV9vcGVyYXRpb25zOworCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCWYxLT5mX3Zmc21udCA9IGYyLT5mX3Zmc21udCA9IG1udGdldChtbnRnZXQocGlwZV9tbnQpKTsKKwlmMS0+Zl9kZW50cnkgPSBmMi0+Zl9kZW50cnkgPSBkZ2V0KGRlbnRyeSk7CisJZjEtPmZfbWFwcGluZyA9IGYyLT5mX21hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCisJLyogcmVhZCBmaWxlICovCisJZjEtPmZfcG9zID0gZjItPmZfcG9zID0gMDsKKwlmMS0+Zl9mbGFncyA9IE9fUkRPTkxZOworCWYxLT5mX29wID0gJnJlYWRfcGlwZV9mb3BzOworCWYxLT5mX21vZGUgPSBGTU9ERV9SRUFEOworCWYxLT5mX3ZlcnNpb24gPSAwOworCisJLyogd3JpdGUgZmlsZSAqLworCWYyLT5mX2ZsYWdzID0gT19XUk9OTFk7CisJZjItPmZfb3AgPSAmd3JpdGVfcGlwZV9mb3BzOworCWYyLT5mX21vZGUgPSBGTU9ERV9XUklURTsKKwlmMi0+Zl92ZXJzaW9uID0gMDsKKworCWZkX2luc3RhbGwoaSwgZjEpOworCWZkX2luc3RhbGwoaiwgZjIpOworCWZkWzBdID0gaTsKKwlmZFsxXSA9IGo7CisJcmV0dXJuIDA7CisKK2Nsb3NlX2YxMl9pbm9kZV9pX2o6CisJcHV0X3VudXNlZF9mZChqKTsKK2Nsb3NlX2YxMl9pbm9kZV9pOgorCXB1dF91bnVzZWRfZmQoaSk7CitjbG9zZV9mMTJfaW5vZGU6CisJZnJlZV9waXBlX2luZm8oaW5vZGUpOworCWlwdXQoaW5vZGUpOworY2xvc2VfZjEyOgorCXB1dF9maWxwKGYyKTsKK2Nsb3NlX2YxOgorCXB1dF9maWxwKGYxKTsKK25vX2ZpbGVzOgorCXJldHVybiBlcnJvcjsJCit9CisKKy8qCisgKiBwaXBlZnMgc2hvdWxkIF9uZXZlcl8gYmUgbW91bnRlZCBieSB1c2VybGFuZCAtIHRvbyBtdWNoIG9mIHNlY3VyaXR5IGhhc3NsZSwKKyAqIG5vIHJlYWwgZ2FpbiBmcm9tIGhhdmluZyB0aGUgd2hvbGUgd2hvcmVob3VzZSBtb3VudGVkLiBTbyB3ZSBkb24ndCBuZWVkCisgKiBhbnkgb3BlcmF0aW9ucyBvbiB0aGUgcm9vdCBkaXJlY3RvcnkuIEhvd2V2ZXIsIHdlIG5lZWQgYSBub24tdHJpdmlhbAorICogZF9uYW1lIC0gcGlwZTogd2lsbCBnbyBuaWNlbHkgYW5kIGtpbGwgdGhlIHNwZWNpYWwtY2FzaW5nIGluIHByb2Nmcy4KKyAqLworCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpwaXBlZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9wc2V1ZG8oZnNfdHlwZSwgInBpcGU6IiwgTlVMTCwgUElQRUZTX01BR0lDKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHBpcGVfZnNfdHlwZSA9IHsKKwkubmFtZQkJPSAicGlwZWZzIiwKKwkuZ2V0X3NiCQk9IHBpcGVmc19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2Fub25fc3VwZXIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3BpcGVfZnModm9pZCkKK3sKKwlpbnQgZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmcGlwZV9mc190eXBlKTsKKwlpZiAoIWVycikgeworCQlwaXBlX21udCA9IGtlcm5fbW91bnQoJnBpcGVfZnNfdHlwZSk7CisJCWlmIChJU19FUlIocGlwZV9tbnQpKSB7CisJCQllcnIgPSBQVFJfRVJSKHBpcGVfbW50KTsKKwkJCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmcGlwZV9mc190eXBlKTsKKwkJfQorCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9waXBlX2ZzKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZwaXBlX2ZzX3R5cGUpOworCW1udHB1dChwaXBlX21udCk7Cit9CisKK2ZzX2luaXRjYWxsKGluaXRfcGlwZV9mcyk7Cittb2R1bGVfZXhpdChleGl0X3BpcGVfZnMpOwpkaWZmIC0tZ2l0IGEvZnMvcG9zaXhfYWNsLmMgYi9mcy9wb3NpeF9hY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTY0ODBlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcG9zaXhfYWNsLmMKQEAgLTAsMCArMSwzODEgQEAKKy8qCisgKiBsaW51eC9mcy9wb3NpeF9hY2wuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgQW5kcmVhcyBHcnVlbmJhY2hlciA8YS5ncnVlbmJhY2hlckBjb21wdXRlci5vcmc+CisgKgorICogIEZpeGVzIGZyb20gV2lsbGlhbSBTY2h1bWFjaGVyIGluY29ycG9yYXRlZCBvbiAxNSBNYXJjaCAyMDAxLgorICogICAgIChSZXBvcnRlZCBieSBDaGFybGVzIEJlcnRzY2gsIDxDQmVydHNjaEBtaWNyb3Rlc3QuY29tPikuCisgKi8KKworLyoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgZ2VuZXJpYyBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZworICogIFBPU0lYIDEwMDMuMWUgZHJhZnQgc3RhbmRhcmQgMTcgQUNMcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitFWFBPUlRfU1lNQk9MKHBvc2l4X2FjbF9hbGxvYyk7CitFWFBPUlRfU1lNQk9MKHBvc2l4X2FjbF9jbG9uZSk7CitFWFBPUlRfU1lNQk9MKHBvc2l4X2FjbF92YWxpZCk7CitFWFBPUlRfU1lNQk9MKHBvc2l4X2FjbF9lcXVpdl9tb2RlKTsKK0VYUE9SVF9TWU1CT0wocG9zaXhfYWNsX2Zyb21fbW9kZSk7CitFWFBPUlRfU1lNQk9MKHBvc2l4X2FjbF9jcmVhdGVfbWFzcSk7CitFWFBPUlRfU1lNQk9MKHBvc2l4X2FjbF9jaG1vZF9tYXNxKTsKK0VYUE9SVF9TWU1CT0wocG9zaXhfYWNsX3Blcm1pc3Npb24pOworCisvKgorICogQWxsb2NhdGUgYSBuZXcgQUNMIHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZW50cmllcy4KKyAqLworc3RydWN0IHBvc2l4X2FjbCAqCitwb3NpeF9hY2xfYWxsb2MoaW50IGNvdW50LCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZmxhZ3MpCit7CisJY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2Yoc3RydWN0IHBvc2l4X2FjbCkgKworCSAgICAgICAgICAgICAgICAgICAgY291bnQgKiBzaXplb2Yoc3RydWN0IHBvc2l4X2FjbF9lbnRyeSk7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0ga21hbGxvYyhzaXplLCBmbGFncyk7CisJaWYgKGFjbCkgeworCQlhdG9taWNfc2V0KCZhY2wtPmFfcmVmY291bnQsIDEpOworCQlhY2wtPmFfY291bnQgPSBjb3VudDsKKwl9CisJcmV0dXJuIGFjbDsKK30KKworLyoKKyAqIENsb25lIGFuIEFDTC4KKyAqLworc3RydWN0IHBvc2l4X2FjbCAqCitwb3NpeF9hY2xfY2xvbmUoY29uc3Qgc3RydWN0IHBvc2l4X2FjbCAqYWNsLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZmxhZ3MpCit7CisJc3RydWN0IHBvc2l4X2FjbCAqY2xvbmUgPSBOVUxMOworCisJaWYgKGFjbCkgeworCQlpbnQgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcG9zaXhfYWNsKSArIGFjbC0+YV9jb3VudCAqCisJCSAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBwb3NpeF9hY2xfZW50cnkpOworCQljbG9uZSA9IGttYWxsb2Moc2l6ZSwgZmxhZ3MpOworCQlpZiAoY2xvbmUpIHsKKwkJCW1lbWNweShjbG9uZSwgYWNsLCBzaXplKTsKKwkJCWF0b21pY19zZXQoJmNsb25lLT5hX3JlZmNvdW50LCAxKTsKKwkJfQorCX0KKwlyZXR1cm4gY2xvbmU7Cit9CisKKy8qCisgKiBDaGVjayBpZiBhbiBhY2wgaXMgdmFsaWQuIFJldHVybnMgMCBpZiBpdCBpcywgb3IgLUUuLi4gb3RoZXJ3aXNlLgorICovCitpbnQKK3Bvc2l4X2FjbF92YWxpZChjb25zdCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wpCit7CisJY29uc3Qgc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqcGEsICpwZTsKKwlpbnQgc3RhdGUgPSBBQ0xfVVNFUl9PQko7CisJdW5zaWduZWQgaW50IGlkID0gMDsgIC8qIGtlZXAgZ2NjIGhhcHB5ICovCisJaW50IG5lZWRzX21hc2sgPSAwOworCisJRk9SRUFDSF9BQ0xfRU5UUlkocGEsIGFjbCwgcGUpIHsKKwkJaWYgKHBhLT5lX3Blcm0gJiB+KEFDTF9SRUFEfEFDTF9XUklURXxBQ0xfRVhFQ1VURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3dpdGNoIChwYS0+ZV90YWcpIHsKKwkJCWNhc2UgQUNMX1VTRVJfT0JKOgorCQkJCWlmIChzdGF0ZSA9PSBBQ0xfVVNFUl9PQkopIHsKKwkJCQkJaWQgPSAwOworCQkJCQlzdGF0ZSA9IEFDTF9VU0VSOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWNhc2UgQUNMX1VTRVI6CisJCQkJaWYgKHN0YXRlICE9IEFDTF9VU0VSKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlpZiAocGEtPmVfaWQgPT0gQUNMX1VOREVGSU5FRF9JRCB8fAorCQkJCSAgICBwYS0+ZV9pZCA8IGlkKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlpZCA9IHBhLT5lX2lkICsgMTsKKwkJCQluZWVkc19tYXNrID0gMTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBQ0xfR1JPVVBfT0JKOgorCQkJCWlmIChzdGF0ZSA9PSBBQ0xfVVNFUikgeworCQkJCQlpZCA9IDA7CisJCQkJCXN0YXRlID0gQUNMX0dST1VQOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWNhc2UgQUNMX0dST1VQOgorCQkJCWlmIChzdGF0ZSAhPSBBQ0xfR1JPVVApCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWlmIChwYS0+ZV9pZCA9PSBBQ0xfVU5ERUZJTkVEX0lEIHx8CisJCQkJICAgIHBhLT5lX2lkIDwgaWQpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWlkID0gcGEtPmVfaWQgKyAxOworCQkJCW5lZWRzX21hc2sgPSAxOworCQkJCWJyZWFrOworCisJCQljYXNlIEFDTF9NQVNLOgorCQkJCWlmIChzdGF0ZSAhPSBBQ0xfR1JPVVApCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCXN0YXRlID0gQUNMX09USEVSOworCQkJCWJyZWFrOworCisJCQljYXNlIEFDTF9PVEhFUjoKKwkJCQlpZiAoc3RhdGUgPT0gQUNMX09USEVSIHx8CisJCQkJICAgIChzdGF0ZSA9PSBBQ0xfR1JPVVAgJiYgIW5lZWRzX21hc2spKSB7CisJCQkJCXN0YXRlID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCWlmIChzdGF0ZSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqIFJldHVybnMgMCBpZiB0aGUgYWNsIGNhbiBiZSBleGFjdGx5IHJlcHJlc2VudGVkIGluIHRoZSB0cmFkaXRpb25hbAorICogZmlsZSBtb2RlIHBlcm1pc3Npb24gYml0cywgb3IgZWxzZSAxLiBSZXR1cm5zIC1FLi4uIG9uIGVycm9yLgorICovCitpbnQKK3Bvc2l4X2FjbF9lcXVpdl9tb2RlKGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgbW9kZV90ICptb2RlX3ApCit7CisJY29uc3Qgc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqcGEsICpwZTsKKwltb2RlX3QgbW9kZSA9IDA7CisJaW50IG5vdF9lcXVpdiA9IDA7CisKKwlGT1JFQUNIX0FDTF9FTlRSWShwYSwgYWNsLCBwZSkgeworCQlzd2l0Y2ggKHBhLT5lX3RhZykgeworCQkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCQkJbW9kZSB8PSAocGEtPmVfcGVybSAmIFNfSVJXWE8pIDw8IDY7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDTF9HUk9VUF9PQko6CisJCQkJbW9kZSB8PSAocGEtPmVfcGVybSAmIFNfSVJXWE8pIDw8IDM7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDTF9PVEhFUjoKKwkJCQltb2RlIHw9IHBhLT5lX3Blcm0gJiBTX0lSV1hPOworCQkJCWJyZWFrOworCQkJY2FzZSBBQ0xfTUFTSzoKKwkJCQltb2RlID0gKG1vZGUgJiB+U19JUldYRykgfAorCQkJCSAgICAgICAoKHBhLT5lX3Blcm0gJiBTX0lSV1hPKSA8PCAzKTsKKwkJCQlub3RfZXF1aXYgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBBQ0xfVVNFUjoKKwkJCWNhc2UgQUNMX0dST1VQOgorCQkJCW5vdF9lcXVpdiA9IDE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorICAgICAgICBpZiAobW9kZV9wKQorICAgICAgICAgICAgICAgICptb2RlX3AgPSAoKm1vZGVfcCAmIH5TX0lSV1hVR08pIHwgbW9kZTsKKyAgICAgICAgcmV0dXJuIG5vdF9lcXVpdjsKK30KKworLyoKKyAqIENyZWF0ZSBhbiBBQ0wgcmVwcmVzZW50aW5nIHRoZSBmaWxlIG1vZGUgcGVybWlzc2lvbiBiaXRzIG9mIGFuIGlub2RlLgorICovCitzdHJ1Y3QgcG9zaXhfYWNsICoKK3Bvc2l4X2FjbF9mcm9tX21vZGUobW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncykKK3sKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2wgPSBwb3NpeF9hY2xfYWxsb2MoMywgZmxhZ3MpOworCWlmICghYWNsKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWFjbC0+YV9lbnRyaWVzWzBdLmVfdGFnICA9IEFDTF9VU0VSX09CSjsKKwlhY2wtPmFfZW50cmllc1swXS5lX2lkICAgPSBBQ0xfVU5ERUZJTkVEX0lEOworCWFjbC0+YV9lbnRyaWVzWzBdLmVfcGVybSA9IChtb2RlICYgU19JUldYVSkgPj4gNjsKKworCWFjbC0+YV9lbnRyaWVzWzFdLmVfdGFnICA9IEFDTF9HUk9VUF9PQko7CisJYWNsLT5hX2VudHJpZXNbMV0uZV9pZCAgID0gQUNMX1VOREVGSU5FRF9JRDsKKwlhY2wtPmFfZW50cmllc1sxXS5lX3Blcm0gPSAobW9kZSAmIFNfSVJXWEcpID4+IDM7CisKKwlhY2wtPmFfZW50cmllc1syXS5lX3RhZyAgPSBBQ0xfT1RIRVI7CisJYWNsLT5hX2VudHJpZXNbMl0uZV9pZCAgID0gQUNMX1VOREVGSU5FRF9JRDsKKwlhY2wtPmFfZW50cmllc1syXS5lX3Blcm0gPSAobW9kZSAmIFNfSVJXWE8pOworCXJldHVybiBhY2w7Cit9CisKKy8qCisgKiBSZXR1cm4gMCBpZiBjdXJyZW50IGlzIGdyYW50ZWQgd2FudCBhY2Nlc3MgdG8gdGhlIGlub2RlCisgKiBieSB0aGUgYWNsLiBSZXR1cm5zIC1FLi4uIG90aGVyd2lzZS4KKyAqLworaW50Citwb3NpeF9hY2xfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIGludCB3YW50KQoreworCWNvbnN0IHN0cnVjdCBwb3NpeF9hY2xfZW50cnkgKnBhLCAqcGUsICptYXNrX29iajsKKwlpbnQgZm91bmQgPSAwOworCisJRk9SRUFDSF9BQ0xfRU5UUlkocGEsIGFjbCwgcGUpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gocGEtPmVfdGFnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFDTF9VU0VSX09CSjoKKwkJCQkvKiAoTWF5IGhhdmUgYmVlbiBjaGVja2VkIGFscmVhZHkpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbm9kZS0+aV91aWQgPT0gY3VycmVudC0+ZnN1aWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjaGVja19wZXJtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQUNMX1VTRVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYS0+ZV9pZCA9PSBjdXJyZW50LT5mc3VpZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG1hc2s7CisJCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFDTF9HUk9VUF9PQko6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbl9ncm91cF9wKGlub2RlLT5pX2dpZCkpIHsKKwkJCQkJZm91bmQgPSAxOworCQkJCQlpZiAoKHBhLT5lX3Blcm0gJiB3YW50KSA9PSB3YW50KQorCQkJCQkJZ290byBtYXNrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFDTF9HUk9VUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluX2dyb3VwX3AocGEtPmVfaWQpKSB7CisJCQkJCWZvdW5kID0gMTsKKwkJCQkJaWYgKChwYS0+ZV9wZXJtICYgd2FudCkgPT0gd2FudCkKKwkJCQkJCWdvdG8gbWFzazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQUNMX01BU0s6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBQ0xfT1RIRVI6CisJCQkJaWYgKGZvdW5kKQorCQkJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJCQllbHNlCisJCQkJCWdvdG8gY2hlY2tfcGVybTsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC1FSU87CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisJcmV0dXJuIC1FSU87CisKK21hc2s6CisJZm9yIChtYXNrX29iaiA9IHBhKzE7IG1hc2tfb2JqICE9IHBlOyBtYXNrX29iaisrKSB7CisJCWlmIChtYXNrX29iai0+ZV90YWcgPT0gQUNMX01BU0spIHsKKwkJCWlmICgocGEtPmVfcGVybSAmIG1hc2tfb2JqLT5lX3Blcm0gJiB3YW50KSA9PSB3YW50KQorCQkJCXJldHVybiAwOworCQkJcmV0dXJuIC1FQUNDRVM7CisJCX0KKwl9CisKK2NoZWNrX3Blcm06CisJaWYgKChwYS0+ZV9wZXJtICYgd2FudCkgPT0gd2FudCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQUNDRVM7Cit9CisKKy8qCisgKiBNb2RpZnkgYWNsIHdoZW4gY3JlYXRpbmcgYSBuZXcgaW5vZGUuIFRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhlIGFjbCBpcworICogb25seSByZWZlcmVuY2VkIG9uY2UuCisgKgorICogbW9kZV9wIGluaXRpYWxseSBtdXN0IGNvbnRhaW4gdGhlIG1vZGUgcGFyYW1ldGVyIHRvIHRoZSBvcGVuKCkgLyBjcmVhdCgpCisgKiBzeXN0ZW0gY2FsbHMuIEFsbCBwZXJtaXNzaW9ucyB0aGF0IGFyZSBub3QgZ3JhbnRlZCBieSB0aGUgYWNsIGFyZSByZW1vdmVkLgorICogVGhlIHBlcm1pc3Npb25zIGluIHRoZSBhY2wgYXJlIGNoYW5nZWQgdG8gcmVmbGVjdCB0aGUgbW9kZV9wIHBhcmFtZXRlci4KKyAqLworaW50Citwb3NpeF9hY2xfY3JlYXRlX21hc3Eoc3RydWN0IHBvc2l4X2FjbCAqYWNsLCBtb2RlX3QgKm1vZGVfcCkKK3sKKwlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICpwYSwgKnBlOworCXN0cnVjdCBwb3NpeF9hY2xfZW50cnkgKmdyb3VwX29iaiA9IE5VTEwsICptYXNrX29iaiA9IE5VTEw7CisJbW9kZV90IG1vZGUgPSAqbW9kZV9wOworCWludCBub3RfZXF1aXYgPSAwOworCisJLyogYXNzZXJ0KGF0b21pY19yZWFkKGFjbC0+YV9yZWZjb3VudCkgPT0gMSk7ICovCisKKwlGT1JFQUNIX0FDTF9FTlRSWShwYSwgYWNsLCBwZSkgeworICAgICAgICAgICAgICAgIHN3aXRjaChwYS0+ZV90YWcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQUNMX1VTRVJfT0JKOgorCQkJCXBhLT5lX3Blcm0gJj0gKG1vZGUgPj4gNikgfCB+U19JUldYTzsKKwkJCQltb2RlICY9IChwYS0+ZV9wZXJtIDw8IDYpIHwgflNfSVJXWFU7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNMX1VTRVI6CisJCQljYXNlIEFDTF9HUk9VUDoKKwkJCQlub3RfZXF1aXYgPSAxOworCQkJCWJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFDTF9HUk9VUF9PQko6CisJCQkJZ3JvdXBfb2JqID0gcGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFDTF9PVEhFUjoKKwkJCQlwYS0+ZV9wZXJtICY9IG1vZGUgfCB+U19JUldYTzsKKwkJCQltb2RlICY9IHBhLT5lX3Blcm0gfCB+U19JUldYTzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQUNMX01BU0s6CisJCQkJbWFza19vYmogPSBwYTsKKwkJCQlub3RfZXF1aXYgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVJTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworCWlmIChtYXNrX29iaikgeworCQltYXNrX29iai0+ZV9wZXJtICY9IChtb2RlID4+IDMpIHwgflNfSVJXWE87CisJCW1vZGUgJj0gKG1hc2tfb2JqLT5lX3Blcm0gPDwgMykgfCB+U19JUldYRzsKKwl9IGVsc2UgeworCQlpZiAoIWdyb3VwX29iaikKKwkJCXJldHVybiAtRUlPOworCQlncm91cF9vYmotPmVfcGVybSAmPSAobW9kZSA+PiAzKSB8IH5TX0lSV1hPOworCQltb2RlICY9IChncm91cF9vYmotPmVfcGVybSA8PCAzKSB8IH5TX0lSV1hHOworCX0KKworCSptb2RlX3AgPSAoKm1vZGVfcCAmIH5TX0lSV1hVR08pIHwgbW9kZTsKKyAgICAgICAgcmV0dXJuIG5vdF9lcXVpdjsKK30KKworLyoKKyAqIE1vZGlmeSB0aGUgQUNMIGZvciB0aGUgY2htb2Qgc3lzY2FsbC4KKyAqLworaW50Citwb3NpeF9hY2xfY2htb2RfbWFzcShzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIG1vZGVfdCBtb2RlKQoreworCXN0cnVjdCBwb3NpeF9hY2xfZW50cnkgKmdyb3VwX29iaiA9IE5VTEwsICptYXNrX29iaiA9IE5VTEw7CisJc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqcGEsICpwZTsKKworCS8qIGFzc2VydChhdG9taWNfcmVhZChhY2wtPmFfcmVmY291bnQpID09IDEpOyAqLworCisJRk9SRUFDSF9BQ0xfRU5UUlkocGEsIGFjbCwgcGUpIHsKKwkJc3dpdGNoKHBhLT5lX3RhZykgeworCQkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCQkJcGEtPmVfcGVybSA9IChtb2RlICYgU19JUldYVSkgPj4gNjsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBQ0xfVVNFUjoKKwkJCWNhc2UgQUNMX0dST1VQOgorCQkJCWJyZWFrOworCisJCQljYXNlIEFDTF9HUk9VUF9PQko6CisJCQkJZ3JvdXBfb2JqID0gcGE7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNMX01BU0s6CisJCQkJbWFza19vYmogPSBwYTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBQ0xfT1RIRVI6CisJCQkJcGEtPmVfcGVybSA9IChtb2RlICYgU19JUldYTyk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwlpZiAobWFza19vYmopIHsKKwkJbWFza19vYmotPmVfcGVybSA9IChtb2RlICYgU19JUldYRykgPj4gMzsKKwl9IGVsc2UgeworCQlpZiAoIWdyb3VwX29iaikKKwkJCXJldHVybiAtRUlPOworCQlncm91cF9vYmotPmVfcGVybSA9IChtb2RlICYgU19JUldYRykgPj4gMzsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL3Byb2MvTWFrZWZpbGUgYi9mcy9wcm9jL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOGI5YjYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wcm9jL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBwcm9jIGZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19QUk9DX0ZTKSArPSBwcm9jLm8KKworcHJvYy15CQkJOj0gbm9tbXUubyB0YXNrX25vbW11Lm8KK3Byb2MtJChDT05GSUdfTU1VKQk6PSBtbXUubyB0YXNrX21tdS5vCisKK3Byb2MteSAgICAgICArPSBpbm9kZS5vIHJvb3QubyBiYXNlLm8gZ2VuZXJpYy5vIGFycmF5Lm8gXAorCQlrbXNnLm8gcHJvY190dHkubyBwcm9jX21pc2MubworCitwcm9jLSQoQ09ORklHX1BST0NfS0NPUkUpCSs9IGtjb3JlLm8KK3Byb2MtJChDT05GSUdfUFJPQ19ERVZJQ0VUUkVFKQkrPSBwcm9jX2RldnRyZWUubwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9hcnJheS5jIGIvZnMvcHJvYy9hcnJheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NjY4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wcm9jL2FycmF5LmMKQEAgLTAsMCArMSw0ODQgQEAKKy8qCisgKiAgbGludXgvZnMvcHJvYy9hcnJheS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MiAgYnkgTGludXMgVG9ydmFsZHMKKyAqICBiYXNlZCBvbiBpZGVhcyBieSBEYXJyZW4gU2VubgorICoKKyAqIEZpeGVzOgorICogTWljaGFlbC4gSy4gSm9obnNvbjogc3RhdCxzdGF0bSBleHRlbnNpb25zLgorICogICAgICAgICAgICAgICAgICAgICAgPGpvaG5zb25tQHN0b2xhZi5lZHU+CisgKgorICogUGF1bGluZSBNaWRkZWxpbmsgOiAgTWFkZSBjbWRsaW5lLGVudmxpbmUgb25seSBicmVhayBhdCAnXDAncywgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgIG1ha2Ugc3VyZSBTRVRfUFJPQ1RJVExFIHdvcmtzLiBBbHNvIHJlbW92ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIGJhZCAnIScgd2hpY2ggZm9yY2VkIGFkZHJlc3MgcmVjYWxjdWxhdGlvbiBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgIEVWRVJZIGNoYXJhY3RlciBvbiB0aGUgY3VycmVudCBwYWdlLgorICogICAgICAgICAgICAgICAgICAgICAgPG1pZGRlbGluQHBvbHl3YXJlLmlhZi5ubD4KKyAqCisgKiBEYW5ueSB0ZXIgSGFhciAgICA6CWFkZGVkIGNwdWluZm8KKyAqCQkJPGR0aEBjaXN0cm9uLm5sPgorICoKKyAqIEFsZXNzYW5kcm8gUnViaW5pIDogIHByb2ZpbGUgZXh0ZW5zaW9uLgorICogICAgICAgICAgICAgICAgICAgICAgPHJ1YmluaUBpcHZ2aXMudW5pcHYuaXQ+CisgKgorICogSmVmZiBUcmFudGVyICAgICAgOiAgYWRkZWQgQm9nb01pcHMgZmllbGQgdG8gY3B1aW5mbworICogICAgICAgICAgICAgICAgICAgICAgPEplZmZfVHJhbnRlckBNaXRlbC5DT00+CisgKgorICogQnJ1bm8gSGFpYmxlICAgICAgOiAgcmVtb3ZlIDRLIGxpbWl0IGZvciB0aGUgbWFwcyBmaWxlCisgKgkJCTxoYWlibGVAbWEyczIubWF0aGVtYXRpay51bmkta2FybHNydWhlLmRlPgorICoKKyAqIFl2ZXMgQXJyb3V5ZSAgICAgIDogIHJlbW92ZSByZW1vdmFsIG9mIHRyYWlsaW5nIHNwYWNlcyBpbiBnZXRfYXJyYXkuCisgKgkJCTxZdmVzLkFycm91eWVAbWFyaW4uZmRuLmZyPgorICoKKyAqIEplcm9tZSBGb3Jpc3NpZXIgIDogIGFkZGVkIHBlci1DUFUgdGltZSBpbmZvcm1hdGlvbiB0byAvcHJvYy9zdGF0CisgKiAgICAgICAgICAgICAgICAgICAgICBhbmQgL3Byb2MvPHBpZD4vY3B1IGV4dGVuc2lvbgorICogICAgICAgICAgICAgICAgICAgICAgPGZvcmlzc2llckBpc2lhLmNtYS5mcj4KKyAqCQkJLSBJbmNvcnBvcmF0aW9uIGFuZCBub24tU01QIHNhZmUgb3BlcmF0aW9uCisgKgkJCW9mIGZvcmlzc2llciBwYXRjaCBpbiAyLjEuNzggYnkKKyAqCQkJSGFucyBNYXJjdXMgPGNyb3diYXJAY29uY2VwdHMubmw+CisgKgorICogYWViQGN3aS5ubCAgICAgICAgOiAgL3Byb2MvcGFydGl0aW9ucworICoKKyAqCisgKiBBbGFuIENveAkgICAgIDogIHNlY3VyaXR5IGZpeGVzLgorICoJCQk8QWxhbi5Db3hAbGludXgub3JnPgorICoKKyAqIEFsIFZpcm8gICAgICAgICAgIDogIHNhZmUgaGFuZGxpbmcgb2YgbW1fc3RydWN0CisgKgorICogR2VyaGFyZCBXaWNoZXJ0ICAgOiAgYWRkZWQgQklHTUVNIHN1cHBvcnQKKyAqIFNpZW1lbnMgQUcgICAgICAgICAgIDxHZXJoYXJkLldpY2hlcnRAcGRiLnNpZW1lbnMuZGU+CisgKgorICogQWwgVmlybyAmIEplZmYgR2FyemlrIDogIG1vdmVkIG1vc3Qgb2YgdGhlIHRoaW5nIGludG8gYmFzZS5jIGFuZAorICoJCQkgOiAgcHJvY19taXNjLmMuIFRoZSByZXN0IG1heSBldmVudHVhbGx5IGdvIGludG8KKyAqCQkJIDogIGJhc2UuYyB0b28uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVzZXQuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworLyogR2NjIG9wdGltaXplcyBhd2F5ICJzdHJsZW4oeCkiIGZvciBjb25zdGFudCB4ICovCisjZGVmaW5lIEFEREJVRihidWZmZXIsIHN0cmluZykgXAorZG8geyBtZW1jcHkoYnVmZmVyLCBzdHJpbmcsIHN0cmxlbihzdHJpbmcpKTsgXAorICAgICBidWZmZXIgKz0gc3RybGVuKHN0cmluZyk7IH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgY2hhciAqIHRhc2tfbmFtZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNoYXIgKiBidWYpCit7CisJaW50IGk7CisJY2hhciAqIG5hbWU7CisJY2hhciB0Y29tbVtzaXplb2YocC0+Y29tbSldOworCisJZ2V0X3Rhc2tfY29tbSh0Y29tbSwgcCk7CisKKwlBRERCVUYoYnVmLCAiTmFtZTpcdCIpOworCW5hbWUgPSB0Y29tbTsKKwlpID0gc2l6ZW9mKHRjb21tKTsKKwlkbyB7CisJCXVuc2lnbmVkIGNoYXIgYyA9ICpuYW1lOworCQluYW1lKys7CisJCWktLTsKKwkJKmJ1ZiA9IGM7CisJCWlmICghYykKKwkJCWJyZWFrOworCQlpZiAoYyA9PSAnXFwnKSB7CisJCQlidWZbMV0gPSBjOworCQkJYnVmICs9IDI7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA9PSAnXG4nKSB7CisJCQlidWZbMF0gPSAnXFwnOworCQkJYnVmWzFdID0gJ24nOworCQkJYnVmICs9IDI7CisJCQljb250aW51ZTsKKwkJfQorCQlidWYrKzsKKwl9IHdoaWxlIChpKTsKKwkqYnVmID0gJ1xuJzsKKwlyZXR1cm4gYnVmKzE7Cit9CisKKy8qCisgKiBUaGUgdGFzayBzdGF0ZSBhcnJheSBpcyBhIHN0cmFuZ2UgImJpdG1hcCIgb2YKKyAqIHJlYXNvbnMgdG8gc2xlZXAuIFRodXMgInJ1bm5pbmciIGlzIHplcm8sIGFuZAorICogeW91IGNhbiB0ZXN0IGZvciBjb21iaW5hdGlvbnMgb2Ygb3RoZXJzIHdpdGgKKyAqIHNpbXBsZSBiaXQgdGVzdHMuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICp0YXNrX3N0YXRlX2FycmF5W10gPSB7CisJIlIgKHJ1bm5pbmcpIiwJCS8qICAwICovCisJIlMgKHNsZWVwaW5nKSIsCQkvKiAgMSAqLworCSJEIChkaXNrIHNsZWVwKSIsCS8qICAyICovCisJIlQgKHN0b3BwZWQpIiwJCS8qICA0ICovCisJIlQgKHRyYWNpbmcgc3RvcCkiLAkvKiAgOCAqLworCSJaICh6b21iaWUpIiwJCS8qIDE2ICovCisJIlggKGRlYWQpIgkJLyogMzIgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqIGdldF90YXNrX3N0YXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXVuc2lnbmVkIGludCBzdGF0ZSA9ICh0c2stPnN0YXRlICYgKFRBU0tfUlVOTklORyB8CisJCQkJCSAgICBUQVNLX0lOVEVSUlVQVElCTEUgfAorCQkJCQkgICAgVEFTS19VTklOVEVSUlVQVElCTEUgfAorCQkJCQkgICAgVEFTS19TVE9QUEVEIHwKKwkJCQkJICAgIFRBU0tfVFJBQ0VEKSkgfAorCQkJKHRzay0+ZXhpdF9zdGF0ZSAmIChFWElUX1pPTUJJRSB8CisJCQkJCSAgICBFWElUX0RFQUQpKTsKKwljb25zdCBjaGFyICoqcCA9ICZ0YXNrX3N0YXRlX2FycmF5WzBdOworCisJd2hpbGUgKHN0YXRlKSB7CisJCXArKzsKKwkJc3RhdGUgPj49IDE7CisJfQorCXJldHVybiAqcDsKK30KKworc3RhdGljIGlubGluZSBjaGFyICogdGFza19zdGF0ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNoYXIgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3QgZ3JvdXBfaW5mbyAqZ3JvdXBfaW5mbzsKKwlpbnQgZzsKKworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLAorCQkiU3RhdGU6XHQlc1xuIgorCQkiU2xlZXBBVkc6XHQlbHUlJVxuIgorCQkiVGdpZDpcdCVkXG4iCisJCSJQaWQ6XHQlZFxuIgorCQkiUFBpZDpcdCVkXG4iCisJCSJUcmFjZXJQaWQ6XHQlZFxuIgorCQkiVWlkOlx0JWRcdCVkXHQlZFx0JWRcbiIKKwkJIkdpZDpcdCVkXHQlZFx0JWRcdCVkXG4iLAorCQlnZXRfdGFza19zdGF0ZShwKSwKKwkJKHAtPnNsZWVwX2F2Zy8xMDI0KSoxMDAvKDEwMjAwMDAwMDAvMTAyNCksCisJICAgICAgIAlwLT50Z2lkLAorCQlwLT5waWQsIHBpZF9hbGl2ZShwKSA/IHAtPmdyb3VwX2xlYWRlci0+cmVhbF9wYXJlbnQtPnRnaWQgOiAwLAorCQlwaWRfYWxpdmUocCkgJiYgcC0+cHRyYWNlID8gcC0+cGFyZW50LT5waWQgOiAwLAorCQlwLT51aWQsIHAtPmV1aWQsIHAtPnN1aWQsIHAtPmZzdWlkLAorCQlwLT5naWQsIHAtPmVnaWQsIHAtPnNnaWQsIHAtPmZzZ2lkKTsKKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJdGFza19sb2NrKHApOworCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwKKwkJIkZEU2l6ZTpcdCVkXG4iCisJCSJHcm91cHM6XHQiLAorCQlwLT5maWxlcyA/IHAtPmZpbGVzLT5tYXhfZmRzIDogMCk7CisKKwlncm91cF9pbmZvID0gcC0+Z3JvdXBfaW5mbzsKKwlnZXRfZ3JvdXBfaW5mbyhncm91cF9pbmZvKTsKKwl0YXNrX3VubG9jayhwKTsKKworCWZvciAoZyA9IDA7IGcgPCBtaW4oZ3JvdXBfaW5mby0+bmdyb3VwcyxOR1JPVVBTX1NNQUxMKTsgZysrKQorCQlidWZmZXIgKz0gc3ByaW50ZihidWZmZXIsICIlZCAiLCBHUk9VUF9BVChncm91cF9pbmZvLGcpKTsKKwlwdXRfZ3JvdXBfaW5mbyhncm91cF9pbmZvKTsKKworCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIlxuIik7CisJcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIGNoYXIgKiByZW5kZXJfc2lnc2V0X3QoY29uc3QgY2hhciAqaGVhZGVyLCBzaWdzZXRfdCAqc2V0LCBjaGFyICpidWZmZXIpCit7CisJaW50IGksIGxlbjsKKworCWxlbiA9IHN0cmxlbihoZWFkZXIpOworCW1lbWNweShidWZmZXIsIGhlYWRlciwgbGVuKTsKKwlidWZmZXIgKz0gbGVuOworCisJaSA9IF9OU0lHOworCWRvIHsKKwkJaW50IHggPSAwOworCisJCWkgLT0gNDsKKwkJaWYgKHNpZ2lzbWVtYmVyKHNldCwgaSsxKSkgeCB8PSAxOworCQlpZiAoc2lnaXNtZW1iZXIoc2V0LCBpKzIpKSB4IHw9IDI7CisJCWlmIChzaWdpc21lbWJlcihzZXQsIGkrMykpIHggfD0gNDsKKwkJaWYgKHNpZ2lzbWVtYmVyKHNldCwgaSs0KSkgeCB8PSA4OworCQkqYnVmZmVyKysgPSAoeCA8IDEwID8gJzAnIDogJ2EnIC0gMTApICsgeDsKKwl9IHdoaWxlIChpID49IDQpOworCisJKmJ1ZmZlcisrID0gJ1xuJzsKKwkqYnVmZmVyID0gMDsKKwlyZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgdm9pZCBjb2xsZWN0X3NpZ2lnbl9zaWdjYXRjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHNpZ3NldF90ICppZ24sCisJCQkJICAgIHNpZ3NldF90ICpjYXRjaCkKK3sKKwlzdHJ1Y3Qga19zaWdhY3Rpb24gKms7CisJaW50IGk7CisKKwlrID0gcC0+c2lnaGFuZC0+YWN0aW9uOworCWZvciAoaSA9IDE7IGkgPD0gX05TSUc7ICsraSwgKytrKSB7CisJCWlmIChrLT5zYS5zYV9oYW5kbGVyID09IFNJR19JR04pCisJCQlzaWdhZGRzZXQoaWduLCBpKTsKKwkJZWxzZSBpZiAoay0+c2Euc2FfaGFuZGxlciAhPSBTSUdfREZMKQorCQkJc2lnYWRkc2V0KGNhdGNoLCBpKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqIHRhc2tfc2lnKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqYnVmZmVyKQoreworCXNpZ3NldF90IHBlbmRpbmcsIHNocGVuZGluZywgYmxvY2tlZCwgaWdub3JlZCwgY2F1Z2h0OworCWludCBudW1fdGhyZWFkcyA9IDA7CisJdW5zaWduZWQgbG9uZyBxc2l6ZSA9IDA7CisJdW5zaWduZWQgbG9uZyBxbGltID0gMDsKKworCXNpZ2VtcHR5c2V0KCZwZW5kaW5nKTsKKwlzaWdlbXB0eXNldCgmc2hwZW5kaW5nKTsKKwlzaWdlbXB0eXNldCgmYmxvY2tlZCk7CisJc2lnZW1wdHlzZXQoJmlnbm9yZWQpOworCXNpZ2VtcHR5c2V0KCZjYXVnaHQpOworCisJLyogR2F0aGVyIGFsbCB0aGUgZGF0YSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBsb2NrcyBoZWxkICovCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlpZiAocC0+c2lnaGFuZCkgeworCQlzcGluX2xvY2tfaXJxKCZwLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJcGVuZGluZyA9IHAtPnBlbmRpbmcuc2lnbmFsOworCQlzaHBlbmRpbmcgPSBwLT5zaWduYWwtPnNoYXJlZF9wZW5kaW5nLnNpZ25hbDsKKwkJYmxvY2tlZCA9IHAtPmJsb2NrZWQ7CisJCWNvbGxlY3Rfc2lnaWduX3NpZ2NhdGNoKHAsICZpZ25vcmVkLCAmY2F1Z2h0KTsKKwkJbnVtX3RocmVhZHMgPSBhdG9taWNfcmVhZCgmcC0+c2lnbmFsLT5jb3VudCk7CisJCXFzaXplID0gYXRvbWljX3JlYWQoJnAtPnVzZXItPnNpZ3BlbmRpbmcpOworCQlxbGltID0gcC0+c2lnbmFsLT5ybGltW1JMSU1JVF9TSUdQRU5ESU5HXS5ybGltX2N1cjsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwl9CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCisJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiVGhyZWFkczpcdCVkXG4iLCBudW1fdGhyZWFkcyk7CisJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiU2lnUTpcdCVsdS8lbHVcbiIsIHFzaXplLCBxbGltKTsKKworCS8qIHJlbmRlciB0aGVtIGFsbCAqLworCWJ1ZmZlciA9IHJlbmRlcl9zaWdzZXRfdCgiU2lnUG5kOlx0IiwgJnBlbmRpbmcsIGJ1ZmZlcik7CisJYnVmZmVyID0gcmVuZGVyX3NpZ3NldF90KCJTaGRQbmQ6XHQiLCAmc2hwZW5kaW5nLCBidWZmZXIpOworCWJ1ZmZlciA9IHJlbmRlcl9zaWdzZXRfdCgiU2lnQmxrOlx0IiwgJmJsb2NrZWQsIGJ1ZmZlcik7CisJYnVmZmVyID0gcmVuZGVyX3NpZ3NldF90KCJTaWdJZ246XHQiLCAmaWdub3JlZCwgYnVmZmVyKTsKKwlidWZmZXIgPSByZW5kZXJfc2lnc2V0X3QoIlNpZ0NndDpcdCIsICZjYXVnaHQsIGJ1ZmZlcik7CisKKwlyZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKnRhc2tfY2FwKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqYnVmZmVyKQoreworICAgIHJldHVybiBidWZmZXIgKyBzcHJpbnRmKGJ1ZmZlciwgIkNhcEluaDpcdCUwMTZ4XG4iCisJCQkgICAgIkNhcFBybTpcdCUwMTZ4XG4iCisJCQkgICAgIkNhcEVmZjpcdCUwMTZ4XG4iLAorCQkJICAgIGNhcF90KHAtPmNhcF9pbmhlcml0YWJsZSksCisJCQkgICAgY2FwX3QocC0+Y2FwX3Blcm1pdHRlZCksCisJCQkgICAgY2FwX3QocC0+Y2FwX2VmZmVjdGl2ZSkpOworfQorCitpbnQgcHJvY19waWRfc3RhdHVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqIGJ1ZmZlcikKK3sKKwljaGFyICogb3JpZyA9IGJ1ZmZlcjsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGdldF90YXNrX21tKHRhc2spOworCisJYnVmZmVyID0gdGFza19uYW1lKHRhc2ssIGJ1ZmZlcik7CisJYnVmZmVyID0gdGFza19zdGF0ZSh0YXNrLCBidWZmZXIpOworIAorCWlmIChtbSkgeworCQlidWZmZXIgPSB0YXNrX21lbShtbSwgYnVmZmVyKTsKKwkJbW1wdXQobW0pOworCX0KKwlidWZmZXIgPSB0YXNrX3NpZyh0YXNrLCBidWZmZXIpOworCWJ1ZmZlciA9IHRhc2tfY2FwKHRhc2ssIGJ1ZmZlcik7CisJYnVmZmVyID0gY3B1c2V0X3Rhc2tfc3RhdHVzX2FsbG93ZWQodGFzaywgYnVmZmVyKTsKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX1MzOTApCisJYnVmZmVyID0gdGFza19zaG93X3JlZ3ModGFzaywgYnVmZmVyKTsKKyNlbmRpZgorCXJldHVybiBidWZmZXIgLSBvcmlnOworfQorCitzdGF0aWMgaW50IGRvX3Rhc2tfc3RhdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKiBidWZmZXIsIGludCB3aG9sZSkKK3sKKwl1bnNpZ25lZCBsb25nIHZzaXplLCBlaXAsIGVzcCwgd2NoYW4gPSB+MFVMOworCWxvbmcgcHJpb3JpdHksIG5pY2U7CisJaW50IHR0eV9wZ3JwID0gLTEsIHR0eV9uciA9IDA7CisJc2lnc2V0X3Qgc2lnaWduLCBzaWdjYXRjaDsKKwljaGFyIHN0YXRlOworCWludCByZXM7CisgCXBpZF90IHBwaWQsIHBnaWQgPSAtMSwgc2lkID0gLTE7CisJaW50IG51bV90aHJlYWRzID0gMDsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnRfdGltZTsKKwl1bnNpZ25lZCBsb25nIGNtaW5fZmx0ID0gMCwgY21hal9mbHQgPSAwOworCXVuc2lnbmVkIGxvbmcgIG1pbl9mbHQgPSAwLCAgbWFqX2ZsdCA9IDA7CisJY3B1dGltZV90IGN1dGltZSwgY3N0aW1lLCB1dGltZSwgc3RpbWU7CisJdW5zaWduZWQgbG9uZyByc3NsaW0gPSAwOworCXVuc2lnbmVkIGxvbmcgaXRfcmVhbF92YWx1ZSA9IDA7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0OworCWNoYXIgdGNvbW1bc2l6ZW9mKHRhc2stPmNvbW0pXTsKKworCXN0YXRlID0gKmdldF90YXNrX3N0YXRlKHRhc2spOworCXZzaXplID0gZWlwID0gZXNwID0gMDsKKwltbSA9IGdldF90YXNrX21tKHRhc2spOworCWlmIChtbSkgeworCQl2c2l6ZSA9IHRhc2tfdnNpemUobW0pOworCQllaXAgPSBLU1RLX0VJUCh0YXNrKTsKKwkJZXNwID0gS1NUS19FU1AodGFzayk7CisJfQorCisJZ2V0X3Rhc2tfY29tbSh0Y29tbSwgdGFzayk7CisKKwlzaWdlbXB0eXNldCgmc2lnaWduKTsKKwlzaWdlbXB0eXNldCgmc2lnY2F0Y2gpOworCWN1dGltZSA9IGNzdGltZSA9IHV0aW1lID0gc3RpbWUgPSBjcHV0aW1lX3plcm87CisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlpZiAodGFzay0+c2lnaGFuZCkgeworCQlzcGluX2xvY2tfaXJxKCZ0YXNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJbnVtX3RocmVhZHMgPSBhdG9taWNfcmVhZCgmdGFzay0+c2lnbmFsLT5jb3VudCk7CisJCWNvbGxlY3Rfc2lnaWduX3NpZ2NhdGNoKHRhc2ssICZzaWdpZ24sICZzaWdjYXRjaCk7CisKKwkJLyogYWRkIHVwIGxpdmUgdGhyZWFkIHN0YXRzIGF0IHRoZSBncm91cCBsZXZlbCAqLworCQlpZiAod2hvbGUpIHsKKwkJCXQgPSB0YXNrOworCQkJZG8geworCQkJCW1pbl9mbHQgKz0gdC0+bWluX2ZsdDsKKwkJCQltYWpfZmx0ICs9IHQtPm1hal9mbHQ7CisJCQkJdXRpbWUgPSBjcHV0aW1lX2FkZCh1dGltZSwgdC0+dXRpbWUpOworCQkJCXN0aW1lID0gY3B1dGltZV9hZGQoc3RpbWUsIHQtPnN0aW1lKTsKKwkJCQl0ID0gbmV4dF90aHJlYWQodCk7CisJCQl9IHdoaWxlICh0ICE9IHRhc2spOworCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxKCZ0YXNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwl9CisJaWYgKHRhc2stPnNpZ25hbCkgeworCQlpZiAodGFzay0+c2lnbmFsLT50dHkpIHsKKwkJCXR0eV9wZ3JwID0gdGFzay0+c2lnbmFsLT50dHktPnBncnA7CisJCQl0dHlfbnIgPSBuZXdfZW5jb2RlX2Rldih0dHlfZGV2bnVtKHRhc2stPnNpZ25hbC0+dHR5KSk7CisJCX0KKwkJcGdpZCA9IHByb2Nlc3NfZ3JvdXAodGFzayk7CisJCXNpZCA9IHRhc2stPnNpZ25hbC0+c2Vzc2lvbjsKKwkJY21pbl9mbHQgPSB0YXNrLT5zaWduYWwtPmNtaW5fZmx0OworCQljbWFqX2ZsdCA9IHRhc2stPnNpZ25hbC0+Y21hal9mbHQ7CisJCWN1dGltZSA9IHRhc2stPnNpZ25hbC0+Y3V0aW1lOworCQljc3RpbWUgPSB0YXNrLT5zaWduYWwtPmNzdGltZTsKKwkJcnNzbGltID0gdGFzay0+c2lnbmFsLT5ybGltW1JMSU1JVF9SU1NdLnJsaW1fY3VyOworCQlpZiAod2hvbGUpIHsKKwkJCW1pbl9mbHQgKz0gdGFzay0+c2lnbmFsLT5taW5fZmx0OworCQkJbWFqX2ZsdCArPSB0YXNrLT5zaWduYWwtPm1hal9mbHQ7CisJCQl1dGltZSA9IGNwdXRpbWVfYWRkKHV0aW1lLCB0YXNrLT5zaWduYWwtPnV0aW1lKTsKKwkJCXN0aW1lID0gY3B1dGltZV9hZGQoc3RpbWUsIHRhc2stPnNpZ25hbC0+c3RpbWUpOworCQl9CisJCWl0X3JlYWxfdmFsdWUgPSB0YXNrLT5zaWduYWwtPml0X3JlYWxfdmFsdWU7CisJfQorCXBwaWQgPSBwaWRfYWxpdmUodGFzaykgPyB0YXNrLT5ncm91cF9sZWFkZXItPnJlYWxfcGFyZW50LT50Z2lkIDogMDsKKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisKKwlpZiAoIXdob2xlIHx8IG51bV90aHJlYWRzPDIpCisJCXdjaGFuID0gZ2V0X3djaGFuKHRhc2spOworCWlmICghd2hvbGUpIHsKKwkJbWluX2ZsdCA9IHRhc2stPm1pbl9mbHQ7CisJCW1hal9mbHQgPSB0YXNrLT5tYWpfZmx0OworCQl1dGltZSA9IHRhc2stPnV0aW1lOworCQlzdGltZSA9IHRhc2stPnN0aW1lOworCX0KKworCS8qIHNjYWxlIHByaW9yaXR5IGFuZCBuaWNlIHZhbHVlcyBmcm9tIHRpbWVzbGljZXMgdG8gLTIwLi4yMCAqLworCS8qIHRvIG1ha2UgaXQgbG9vayBsaWtlIGEgIm5vcm1hbCIgVW5peCBwcmlvcml0eS9uaWNlIHZhbHVlICAqLworCXByaW9yaXR5ID0gdGFza19wcmlvKHRhc2spOworCW5pY2UgPSB0YXNrX25pY2UodGFzayk7CisKKwkvKiBUZW1wb3JhcnkgdmFyaWFibGUgbmVlZGVkIGZvciBnY2MtMi45NiAqLworCS8qIGNvbnZlcnQgdGltZXNwZWMgLT4gbnNlYyovCisJc3RhcnRfdGltZSA9ICh1bnNpZ25lZCBsb25nIGxvbmcpdGFzay0+c3RhcnRfdGltZS50dl9zZWMgKiBOU0VDX1BFUl9TRUMKKwkJCQkrIHRhc2stPnN0YXJ0X3RpbWUudHZfbnNlYzsKKwkvKiBjb252ZXJ0IG5zZWMgLT4gdGlja3MgKi8KKwlzdGFydF90aW1lID0gbnNlY190b19jbG9ja190KHN0YXJ0X3RpbWUpOworCisJcmVzID0gc3ByaW50ZihidWZmZXIsIiVkICglcykgJWMgJWQgJWQgJWQgJWQgJWQgJWx1ICVsdSBcCislbHUgJWx1ICVsdSAlbHUgJWx1ICVsZCAlbGQgJWxkICVsZCAlZCAlbGQgJWxsdSAlbHUgJWxkICVsdSAlbHUgJWx1ICVsdSAlbHUgXAorJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlZCAlZCAlbHUgJWx1XG4iLAorCQl0YXNrLT5waWQsCisJCXRjb21tLAorCQlzdGF0ZSwKKwkJcHBpZCwKKwkJcGdpZCwKKwkJc2lkLAorCQl0dHlfbnIsCisJCXR0eV9wZ3JwLAorCQl0YXNrLT5mbGFncywKKwkJbWluX2ZsdCwKKwkJY21pbl9mbHQsCisJCW1hal9mbHQsCisJCWNtYWpfZmx0LAorCQljcHV0aW1lX3RvX2Nsb2NrX3QodXRpbWUpLAorCQljcHV0aW1lX3RvX2Nsb2NrX3Qoc3RpbWUpLAorCQljcHV0aW1lX3RvX2Nsb2NrX3QoY3V0aW1lKSwKKwkJY3B1dGltZV90b19jbG9ja190KGNzdGltZSksCisJCXByaW9yaXR5LAorCQluaWNlLAorCQludW1fdGhyZWFkcywKKwkJamlmZmllc190b19jbG9ja190KGl0X3JlYWxfdmFsdWUpLAorCQlzdGFydF90aW1lLAorCQl2c2l6ZSwKKwkJbW0gPyBnZXRfbW1fY291bnRlcihtbSwgcnNzKSA6IDAsIC8qIHlvdSBtaWdodCB3YW50IHRvIHNoaWZ0IHRoaXMgbGVmdCAzICovCisJICAgICAgICByc3NsaW0sCisJCW1tID8gbW0tPnN0YXJ0X2NvZGUgOiAwLAorCQltbSA/IG1tLT5lbmRfY29kZSA6IDAsCisJCW1tID8gbW0tPnN0YXJ0X3N0YWNrIDogMCwKKwkJZXNwLAorCQllaXAsCisJCS8qIFRoZSBzaWduYWwgaW5mb3JtYXRpb24gaGVyZSBpcyBvYnNvbGV0ZS4KKwkJICogSXQgbXVzdCBiZSBkZWNpbWFsIGZvciBMaW51eCAyLjAgY29tcGF0aWJpbGl0eS4KKwkJICogVXNlIC9wcm9jLyMvc3RhdHVzIGZvciByZWFsLXRpbWUgc2lnbmFscy4KKwkJICovCisJCXRhc2stPnBlbmRpbmcuc2lnbmFsLnNpZ1swXSAmIDB4N2ZmZmZmZmZVTCwKKwkJdGFzay0+YmxvY2tlZC5zaWdbMF0gJiAweDdmZmZmZmZmVUwsCisJCXNpZ2lnbiAgICAgIC5zaWdbMF0gJiAweDdmZmZmZmZmVUwsCisJCXNpZ2NhdGNoICAgIC5zaWdbMF0gJiAweDdmZmZmZmZmVUwsCisJCXdjaGFuLAorCQkwVUwsCisJCTBVTCwKKwkJdGFzay0+ZXhpdF9zaWduYWwsCisJCXRhc2tfY3B1KHRhc2spLAorCQl0YXNrLT5ydF9wcmlvcml0eSwKKwkJdGFzay0+cG9saWN5KTsKKwlpZihtbSkKKwkJbW1wdXQobW0pOworCXJldHVybiByZXM7Cit9CisKK2ludCBwcm9jX3RpZF9zdGF0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqIGJ1ZmZlcikKK3sKKwlyZXR1cm4gZG9fdGFza19zdGF0KHRhc2ssIGJ1ZmZlciwgMCk7Cit9CisKK2ludCBwcm9jX3RnaWRfc3RhdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKiBidWZmZXIpCit7CisJcmV0dXJuIGRvX3Rhc2tfc3RhdCh0YXNrLCBidWZmZXIsIDEpOworfQorCitpbnQgcHJvY19waWRfc3RhdG0oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIpCit7CisJaW50IHNpemUgPSAwLCByZXNpZGVudCA9IDAsIHNoYXJlZCA9IDAsIHRleHQgPSAwLCBsaWIgPSAwLCBkYXRhID0gMDsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGdldF90YXNrX21tKHRhc2spOworCQorCWlmIChtbSkgeworCQlzaXplID0gdGFza19zdGF0bShtbSwgJnNoYXJlZCwgJnRleHQsICZkYXRhLCAmcmVzaWRlbnQpOworCQltbXB1dChtbSk7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmZmVyLCIlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKKwkJICAgICAgIHNpemUsIHJlc2lkZW50LCBzaGFyZWQsIHRleHQsIGxpYiwgZGF0YSwgMCk7Cit9CmRpZmYgLS1naXQgYS9mcy9wcm9jL2Jhc2UuYyBiL2ZzL3Byb2MvYmFzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZDhlYTQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wcm9jL2Jhc2UuYwpAQCAtMCwwICsxLDIwNTYgQEAKKy8qCisgKiAgbGludXgvZnMvcHJvYy9iYXNlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzCisgKgorICogIHByb2MgYmFzZSBkaXJlY3RvcnkgaGFuZGxpbmcgZnVuY3Rpb25zCisgKgorICogIDE5OTksIEFsIFZpcm8uIFJld3JpdHRlbi4gTm93IGl0IGNvdmVycyB0aGUgd2hvbGUgcGVyLXByb2Nlc3MgcGFydC4KKyAqICBJbnN0ZWFkIG9mIHVzaW5nIG1hZ2ljYWwgaW51bWJlcnMgdG8gZGV0ZXJtaW5lIHRoZSBraW5kIG9mIG9iamVjdAorICogIHdlIGFsbG9jYXRlIGFuZCBmaWxsIGluLWNvcmUgaW5vZGVzIHVwb24gbG9va3VwLiBUaGV5IGRvbid0IGV2ZW4KKyAqICBnbyBpbnRvIGljYWNoZS4gV2UgY2FjaGUgdGhlIHJlZmVyZW5jZSB0byB0YXNrX3N0cnVjdCB1cG9uIGxvb2t1cCB0b28uCisgKiAgRXZlbnR1YWxseSBpdCBzaG91bGQgYmVjb21lIGEgZmlsZXN5c3RlbSBpbiBpdHMgb3duLiBXZSBkb24ndCB1c2UgdGhlCisgKiAgcmVzdCBvZiBwcm9jZnMgYW55bW9yZS4KKyAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY2NvbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVzZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKy8qCisgKiBGb3IgaHlzdGVyaWNhbCByYWlzaW5zIHdlIGtlZXAgdGhlIHNhbWUgaW51bWJlcnMgYXMgaW4gdGhlIG9sZCBwcm9jZnMuCisgKiBGZWVsIGZyZWUgdG8gY2hhbmdlIHRoZSBtYWNybyBiZWxvdyAtIGp1c3Qga2VlcCB0aGUgcmFuZ2UgZGlzdGluY3QgZnJvbQorICogaW51bWJlcnMgb2YgdGhlIHJlc3Qgb2YgcHJvY2ZzIChjdXJyZW50bHkgdGhvc2UgYXJlIGluIDB4MDAwMC0tMHhmZmZmKS4KKyAqIEFzIHNvb24gYXMgd2UnbGwgZ2V0IGEgc2VwYXJhdGUgc3VwZXJibG9jayB3ZSB3aWxsIGJlIGFibGUgdG8gZm9yZ2V0CisgKiBhYm91dCBtYWdpY2FsIHJhbmdlcyB0b28uCisgKi8KKworI2RlZmluZSBmYWtlX2lubyhwaWQsaW5vKSAoKChwaWQpPDwxNil8KGlubykpCisKK2VudW0gcGlkX2RpcmVjdG9yeV9pbm9zIHsKKwlQUk9DX1RHSURfSU5PID0gMiwKKwlQUk9DX1RHSURfVEFTSywKKwlQUk9DX1RHSURfU1RBVFVTLAorCVBST0NfVEdJRF9NRU0sCisjaWZkZWYgQ09ORklHX1NFQ0NPTVAKKwlQUk9DX1RHSURfU0VDQ09NUCwKKyNlbmRpZgorCVBST0NfVEdJRF9DV0QsCisJUFJPQ19UR0lEX1JPT1QsCisJUFJPQ19UR0lEX0VYRSwKKwlQUk9DX1RHSURfRkQsCisJUFJPQ19UR0lEX0VOVklST04sCisJUFJPQ19UR0lEX0FVWFYsCisJUFJPQ19UR0lEX0NNRExJTkUsCisJUFJPQ19UR0lEX1NUQVQsCisJUFJPQ19UR0lEX1NUQVRNLAorCVBST0NfVEdJRF9NQVBTLAorCVBST0NfVEdJRF9NT1VOVFMsCisJUFJPQ19UR0lEX1dDSEFOLAorI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCisJUFJPQ19UR0lEX1NDSEVEU1RBVCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DUFVTRVRTCisJUFJPQ19UR0lEX0NQVVNFVCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TRUNVUklUWQorCVBST0NfVEdJRF9BVFRSLAorCVBST0NfVEdJRF9BVFRSX0NVUlJFTlQsCisJUFJPQ19UR0lEX0FUVFJfUFJFViwKKwlQUk9DX1RHSURfQVRUUl9FWEVDLAorCVBST0NfVEdJRF9BVFRSX0ZTQ1JFQVRFLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAorCVBST0NfVEdJRF9MT0dJTlVJRCwKKyNlbmRpZgorCVBST0NfVEdJRF9GRF9ESVIsCisJUFJPQ19UR0lEX09PTV9TQ09SRSwKKwlQUk9DX1RHSURfT09NX0FESlVTVCwKKwlQUk9DX1RJRF9JTk8sCisJUFJPQ19USURfU1RBVFVTLAorCVBST0NfVElEX01FTSwKKyNpZmRlZiBDT05GSUdfU0VDQ09NUAorCVBST0NfVElEX1NFQ0NPTVAsCisjZW5kaWYKKwlQUk9DX1RJRF9DV0QsCisJUFJPQ19USURfUk9PVCwKKwlQUk9DX1RJRF9FWEUsCisJUFJPQ19USURfRkQsCisJUFJPQ19USURfRU5WSVJPTiwKKwlQUk9DX1RJRF9BVVhWLAorCVBST0NfVElEX0NNRExJTkUsCisJUFJPQ19USURfU1RBVCwKKwlQUk9DX1RJRF9TVEFUTSwKKwlQUk9DX1RJRF9NQVBTLAorCVBST0NfVElEX01PVU5UUywKKwlQUk9DX1RJRF9XQ0hBTiwKKyNpZmRlZiBDT05GSUdfU0NIRURTVEFUUworCVBST0NfVElEX1NDSEVEU1RBVCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DUFVTRVRTCisJUFJPQ19USURfQ1BVU0VULAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NFQ1VSSVRZCisJUFJPQ19USURfQVRUUiwKKwlQUk9DX1RJRF9BVFRSX0NVUlJFTlQsCisJUFJPQ19USURfQVRUUl9QUkVWLAorCVBST0NfVElEX0FUVFJfRVhFQywKKwlQUk9DX1RJRF9BVFRSX0ZTQ1JFQVRFLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAorCVBST0NfVElEX0xPR0lOVUlELAorI2VuZGlmCisJUFJPQ19USURfRkRfRElSID0gMHg4MDAwLAkvKiAweDgwMDAtMHhmZmZmICovCisJUFJPQ19USURfT09NX1NDT1JFLAorCVBST0NfVElEX09PTV9BREpVU1QsCit9OworCitzdHJ1Y3QgcGlkX2VudHJ5IHsKKwlpbnQgdHlwZTsKKwlpbnQgbGVuOworCWNoYXIgKm5hbWU7CisJbW9kZV90IG1vZGU7Cit9OworCisjZGVmaW5lIEUodHlwZSxuYW1lLG1vZGUpIHsodHlwZSksc2l6ZW9mKG5hbWUpLTEsKG5hbWUpLChtb2RlKX0KKworc3RhdGljIHN0cnVjdCBwaWRfZW50cnkgdGdpZF9iYXNlX3N0dWZmW10gPSB7CisJRShQUk9DX1RHSURfVEFTSywgICAgICAidGFzayIsICAgIFNfSUZESVJ8U19JUlVHT3xTX0lYVUdPKSwKKwlFKFBST0NfVEdJRF9GRCwgICAgICAgICJmZCIsICAgICAgU19JRkRJUnxTX0lSVVNSfFNfSVhVU1IpLAorCUUoUFJPQ19UR0lEX0VOVklST04sICAgImVudmlyb24iLCBTX0lGUkVHfFNfSVJVU1IpLAorCUUoUFJPQ19UR0lEX0FVWFYsICAgICAgImF1eHYiLAkgIFNfSUZSRUd8U19JUlVTUiksCisJRShQUk9DX1RHSURfU1RBVFVTLCAgICAic3RhdHVzIiwgIFNfSUZSRUd8U19JUlVHTyksCisJRShQUk9DX1RHSURfQ01ETElORSwgICAiY21kbGluZSIsIFNfSUZSRUd8U19JUlVHTyksCisJRShQUk9DX1RHSURfU1RBVCwgICAgICAic3RhdCIsICAgIFNfSUZSRUd8U19JUlVHTyksCisJRShQUk9DX1RHSURfU1RBVE0sICAgICAic3RhdG0iLCAgIFNfSUZSRUd8U19JUlVHTyksCisJRShQUk9DX1RHSURfTUFQUywgICAgICAibWFwcyIsICAgIFNfSUZSRUd8U19JUlVHTyksCisJRShQUk9DX1RHSURfTUVNLCAgICAgICAibWVtIiwgICAgIFNfSUZSRUd8U19JUlVTUnxTX0lXVVNSKSwKKyNpZmRlZiBDT05GSUdfU0VDQ09NUAorCUUoUFJPQ19UR0lEX1NFQ0NPTVAsICAgInNlY2NvbXAiLCBTX0lGUkVHfFNfSVJVU1J8U19JV1VTUiksCisjZW5kaWYKKwlFKFBST0NfVEdJRF9DV0QsICAgICAgICJjd2QiLCAgICAgU19JRkxOS3xTX0lSV1hVR08pLAorCUUoUFJPQ19UR0lEX1JPT1QsICAgICAgInJvb3QiLCAgICBTX0lGTE5LfFNfSVJXWFVHTyksCisJRShQUk9DX1RHSURfRVhFLCAgICAgICAiZXhlIiwgICAgIFNfSUZMTkt8U19JUldYVUdPKSwKKwlFKFBST0NfVEdJRF9NT1VOVFMsICAgICJtb3VudHMiLCAgU19JRlJFR3xTX0lSVUdPKSwKKyNpZmRlZiBDT05GSUdfU0VDVVJJVFkKKwlFKFBST0NfVEdJRF9BVFRSLCAgICAgICJhdHRyIiwgICAgU19JRkRJUnxTX0lSVUdPfFNfSVhVR08pLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0tBTExTWU1TCisJRShQUk9DX1RHSURfV0NIQU4sICAgICAid2NoYW4iLCAgIFNfSUZSRUd8U19JUlVHTyksCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0NIRURTVEFUUworCUUoUFJPQ19UR0lEX1NDSEVEU1RBVCwgInNjaGVkc3RhdCIsIFNfSUZSRUd8U19JUlVHTyksCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ1BVU0VUUworCUUoUFJPQ19UR0lEX0NQVVNFVCwgICAgImNwdXNldCIsICBTX0lGUkVHfFNfSVJVR08pLAorI2VuZGlmCisJRShQUk9DX1RHSURfT09NX1NDT1JFLCAib29tX3Njb3JlIixTX0lGUkVHfFNfSVJVR08pLAorCUUoUFJPQ19UR0lEX09PTV9BREpVU1QsIm9vbV9hZGoiLCBTX0lGUkVHfFNfSVJVR098U19JV1VTUiksCisjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAorCUUoUFJPQ19UR0lEX0xPR0lOVUlELCAibG9naW51aWQiLCBTX0lGUkVHfFNfSVdVU1J8U19JUlVHTyksCisjZW5kaWYKKwl7MCwwLE5VTEwsMH0KK307CitzdGF0aWMgc3RydWN0IHBpZF9lbnRyeSB0aWRfYmFzZV9zdHVmZltdID0geworCUUoUFJPQ19USURfRkQsICAgICAgICAgImZkIiwgICAgICBTX0lGRElSfFNfSVJVU1J8U19JWFVTUiksCisJRShQUk9DX1RJRF9FTlZJUk9OLCAgICAiZW52aXJvbiIsIFNfSUZSRUd8U19JUlVTUiksCisJRShQUk9DX1RJRF9BVVhWLCAgICAgICAiYXV4diIsCSAgU19JRlJFR3xTX0lSVVNSKSwKKwlFKFBST0NfVElEX1NUQVRVUywgICAgICJzdGF0dXMiLCAgU19JRlJFR3xTX0lSVUdPKSwKKwlFKFBST0NfVElEX0NNRExJTkUsICAgICJjbWRsaW5lIiwgU19JRlJFR3xTX0lSVUdPKSwKKwlFKFBST0NfVElEX1NUQVQsICAgICAgICJzdGF0IiwgICAgU19JRlJFR3xTX0lSVUdPKSwKKwlFKFBST0NfVElEX1NUQVRNLCAgICAgICJzdGF0bSIsICAgU19JRlJFR3xTX0lSVUdPKSwKKwlFKFBST0NfVElEX01BUFMsICAgICAgICJtYXBzIiwgICAgU19JRlJFR3xTX0lSVUdPKSwKKwlFKFBST0NfVElEX01FTSwgICAgICAgICJtZW0iLCAgICAgU19JRlJFR3xTX0lSVVNSfFNfSVdVU1IpLAorI2lmZGVmIENPTkZJR19TRUNDT01QCisJRShQUk9DX1RJRF9TRUNDT01QLCAgICAic2VjY29tcCIsIFNfSUZSRUd8U19JUlVTUnxTX0lXVVNSKSwKKyNlbmRpZgorCUUoUFJPQ19USURfQ1dELCAgICAgICAgImN3ZCIsICAgICBTX0lGTE5LfFNfSVJXWFVHTyksCisJRShQUk9DX1RJRF9ST09ULCAgICAgICAicm9vdCIsICAgIFNfSUZMTkt8U19JUldYVUdPKSwKKwlFKFBST0NfVElEX0VYRSwgICAgICAgICJleGUiLCAgICAgU19JRkxOS3xTX0lSV1hVR08pLAorCUUoUFJPQ19USURfTU9VTlRTLCAgICAgIm1vdW50cyIsICBTX0lGUkVHfFNfSVJVR08pLAorI2lmZGVmIENPTkZJR19TRUNVUklUWQorCUUoUFJPQ19USURfQVRUUiwgICAgICAgImF0dHIiLCAgICBTX0lGRElSfFNfSVJVR098U19JWFVHTyksCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfS0FMTFNZTVMKKwlFKFBST0NfVElEX1dDSEFOLCAgICAgICJ3Y2hhbiIsICAgU19JRlJFR3xTX0lSVUdPKSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCisJRShQUk9DX1RJRF9TQ0hFRFNUQVQsICJzY2hlZHN0YXQiLFNfSUZSRUd8U19JUlVHTyksCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ1BVU0VUUworCUUoUFJPQ19USURfQ1BVU0VULCAgICAgImNwdXNldCIsICBTX0lGUkVHfFNfSVJVR08pLAorI2VuZGlmCisJRShQUk9DX1RJRF9PT01fU0NPUkUsICAib29tX3Njb3JlIixTX0lGUkVHfFNfSVJVR08pLAorCUUoUFJPQ19USURfT09NX0FESlVTVCwgIm9vbV9hZGoiLCBTX0lGUkVHfFNfSVJVR098U19JV1VTUiksCisjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAorCUUoUFJPQ19USURfTE9HSU5VSUQsICJsb2dpbnVpZCIsIFNfSUZSRUd8U19JV1VTUnxTX0lSVUdPKSwKKyNlbmRpZgorCXswLDAsTlVMTCwwfQorfTsKKworI2lmZGVmIENPTkZJR19TRUNVUklUWQorc3RhdGljIHN0cnVjdCBwaWRfZW50cnkgdGdpZF9hdHRyX3N0dWZmW10gPSB7CisJRShQUk9DX1RHSURfQVRUUl9DVVJSRU5ULCAgImN1cnJlbnQiLCAgU19JRlJFR3xTX0lSVUdPfFNfSVdVR08pLAorCUUoUFJPQ19UR0lEX0FUVFJfUFJFViwgICAgICJwcmV2IiwgICAgIFNfSUZSRUd8U19JUlVHTyksCisJRShQUk9DX1RHSURfQVRUUl9FWEVDLCAgICAgImV4ZWMiLCAgICAgU19JRlJFR3xTX0lSVUdPfFNfSVdVR08pLAorCUUoUFJPQ19UR0lEX0FUVFJfRlNDUkVBVEUsICJmc2NyZWF0ZSIsIFNfSUZSRUd8U19JUlVHT3xTX0lXVUdPKSwKKwl7MCwwLE5VTEwsMH0KK307CitzdGF0aWMgc3RydWN0IHBpZF9lbnRyeSB0aWRfYXR0cl9zdHVmZltdID0geworCUUoUFJPQ19USURfQVRUUl9DVVJSRU5ULCAgICJjdXJyZW50IiwgIFNfSUZSRUd8U19JUlVHT3xTX0lXVUdPKSwKKwlFKFBST0NfVElEX0FUVFJfUFJFViwgICAgICAicHJldiIsICAgICBTX0lGUkVHfFNfSVJVR08pLAorCUUoUFJPQ19USURfQVRUUl9FWEVDLCAgICAgICJleGVjIiwgICAgIFNfSUZSRUd8U19JUlVHT3xTX0lXVUdPKSwKKwlFKFBST0NfVElEX0FUVFJfRlNDUkVBVEUsICAiZnNjcmVhdGUiLCBTX0lGUkVHfFNfSVJVR098U19JV1VHTyksCisJezAsMCxOVUxMLDB9Cit9OworI2VuZGlmCisKKyN1bmRlZiBFCisKK3N0YXRpYyBpbnQgcHJvY19mZF9saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKipkZW50cnksIHN0cnVjdCB2ZnNtb3VudCAqKm1udCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzOworCXN0cnVjdCBmaWxlICpmaWxlOworCWludCBmZCA9IHByb2NfdHlwZShpbm9kZSkgLSBQUk9DX1RJRF9GRF9ESVI7CisKKwlmaWxlcyA9IGdldF9maWxlc19zdHJ1Y3QodGFzayk7CisJaWYgKGZpbGVzKSB7CisJCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCWZpbGUgPSBmY2hlY2tfZmlsZXMoZmlsZXMsIGZkKTsKKwkJaWYgKGZpbGUpIHsKKwkJCSptbnQgPSBtbnRnZXQoZmlsZS0+Zl92ZnNtbnQpOworCQkJKmRlbnRyeSA9IGRnZXQoZmlsZS0+Zl9kZW50cnkpOworCQkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQkJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOworCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KKworc3RhdGljIGludCBwcm9jX2N3ZF9saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKipkZW50cnksIHN0cnVjdCB2ZnNtb3VudCAqKm1udCkKK3sKKwlzdHJ1Y3QgZnNfc3RydWN0ICpmczsKKwlpbnQgcmVzdWx0ID0gLUVOT0VOVDsKKwl0YXNrX2xvY2socHJvY190YXNrKGlub2RlKSk7CisJZnMgPSBwcm9jX3Rhc2soaW5vZGUpLT5mczsKKwlpZihmcykKKwkJYXRvbWljX2luYygmZnMtPmNvdW50KTsKKwl0YXNrX3VubG9jayhwcm9jX3Rhc2soaW5vZGUpKTsKKwlpZiAoZnMpIHsKKwkJcmVhZF9sb2NrKCZmcy0+bG9jayk7CisJCSptbnQgPSBtbnRnZXQoZnMtPnB3ZG1udCk7CisJCSpkZW50cnkgPSBkZ2V0KGZzLT5wd2QpOworCQlyZWFkX3VubG9jaygmZnMtPmxvY2spOworCQlyZXN1bHQgPSAwOworCQlwdXRfZnNfc3RydWN0KGZzKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBwcm9jX3Jvb3RfbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICoqZGVudHJ5LCBzdHJ1Y3QgdmZzbW91bnQgKiptbnQpCit7CisJc3RydWN0IGZzX3N0cnVjdCAqZnM7CisJaW50IHJlc3VsdCA9IC1FTk9FTlQ7CisJdGFza19sb2NrKHByb2NfdGFzayhpbm9kZSkpOworCWZzID0gcHJvY190YXNrKGlub2RlKS0+ZnM7CisJaWYoZnMpCisJCWF0b21pY19pbmMoJmZzLT5jb3VudCk7CisJdGFza191bmxvY2socHJvY190YXNrKGlub2RlKSk7CisJaWYgKGZzKSB7CisJCXJlYWRfbG9jaygmZnMtPmxvY2spOworCQkqbW50ID0gbW50Z2V0KGZzLT5yb290bW50KTsKKwkJKmRlbnRyeSA9IGRnZXQoZnMtPnJvb3QpOworCQlyZWFkX3VubG9jaygmZnMtPmxvY2spOworCQlyZXN1bHQgPSAwOworCQlwdXRfZnNfc3RydWN0KGZzKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworI2RlZmluZSBNQVlfUFRSQUNFKHRhc2spIFwKKwkodGFzayA9PSBjdXJyZW50IHx8IFwKKwkodGFzay0+cGFyZW50ID09IGN1cnJlbnQgJiYgXAorCSh0YXNrLT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSAmJiBcCisJICh0YXNrLT5zdGF0ZSA9PSBUQVNLX1NUT1BQRUQgfHwgdGFzay0+c3RhdGUgPT0gVEFTS19UUkFDRUQpICYmIFwKKwkgc2VjdXJpdHlfcHRyYWNlKGN1cnJlbnQsdGFzaykgPT0gMCkpCisKK3N0YXRpYyBpbnQgbWF5X3B0cmFjZV9hdHRhY2goc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCWludCByZXR2YWwgPSAwOworCisJdGFza19sb2NrKHRhc2spOworCisJaWYgKCF0YXNrLT5tbSkKKwkJZ290byBvdXQ7CisJaWYgKCgoY3VycmVudC0+dWlkICE9IHRhc2stPmV1aWQpIHx8CisJICAgICAoY3VycmVudC0+dWlkICE9IHRhc2stPnN1aWQpIHx8CisJICAgICAoY3VycmVudC0+dWlkICE9IHRhc2stPnVpZCkgfHwKKwkgICAgIChjdXJyZW50LT5naWQgIT0gdGFzay0+ZWdpZCkgfHwKKwkgICAgIChjdXJyZW50LT5naWQgIT0gdGFzay0+c2dpZCkgfHwKKwkgICAgIChjdXJyZW50LT5naWQgIT0gdGFzay0+Z2lkKSkgJiYgIWNhcGFibGUoQ0FQX1NZU19QVFJBQ0UpKQorCQlnb3RvIG91dDsKKwlybWIoKTsKKwlpZiAoIXRhc2stPm1tLT5kdW1wYWJsZSAmJiAhY2FwYWJsZShDQVBfU1lTX1BUUkFDRSkpCisJCWdvdG8gb3V0OworCWlmIChzZWN1cml0eV9wdHJhY2UoY3VycmVudCwgdGFzaykpCisJCWdvdG8gb3V0OworCisJcmV0dmFsID0gMTsKK291dDoKKwl0YXNrX3VubG9jayh0YXNrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHByb2NfcGlkX2Vudmlyb24oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICogYnVmZmVyKQoreworCWludCByZXMgPSAwOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gZ2V0X3Rhc2tfbW0odGFzayk7CisJaWYgKG1tKSB7CisJCXVuc2lnbmVkIGludCBsZW4gPSBtbS0+ZW52X2VuZCAtIG1tLT5lbnZfc3RhcnQ7CisJCWlmIChsZW4gPiBQQUdFX1NJWkUpCisJCQlsZW4gPSBQQUdFX1NJWkU7CisJCXJlcyA9IGFjY2Vzc19wcm9jZXNzX3ZtKHRhc2ssIG1tLT5lbnZfc3RhcnQsIGJ1ZmZlciwgbGVuLCAwKTsKKwkJaWYgKCFtYXlfcHRyYWNlX2F0dGFjaCh0YXNrKSkKKwkJCXJlcyA9IC1FU1JDSDsKKwkJbW1wdXQobW0pOworCX0KKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHByb2NfcGlkX2NtZGxpbmUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICogYnVmZmVyKQoreworCWludCByZXMgPSAwOworCXVuc2lnbmVkIGludCBsZW47CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBnZXRfdGFza19tbSh0YXNrKTsKKwlpZiAoIW1tKQorCQlnb3RvIG91dDsKKwlpZiAoIW1tLT5hcmdfZW5kKQorCQlnb3RvIG91dF9tbTsJLyogU2hoISBObyBsb29raW5nIGJlZm9yZSB3ZSdyZSBkb25lICovCisKKyAJbGVuID0gbW0tPmFyZ19lbmQgLSBtbS0+YXJnX3N0YXJ0OworIAorCWlmIChsZW4gPiBQQUdFX1NJWkUpCisJCWxlbiA9IFBBR0VfU0laRTsKKyAKKwlyZXMgPSBhY2Nlc3NfcHJvY2Vzc192bSh0YXNrLCBtbS0+YXJnX3N0YXJ0LCBidWZmZXIsIGxlbiwgMCk7CisKKwkvLyBJZiB0aGUgbnVsIGF0IHRoZSBlbmQgb2YgYXJncyBoYXMgYmVlbiBvdmVyd3JpdHRlbiwgdGhlbgorCS8vIGFzc3VtZSBhcHBsaWNhdGlvbiBpcyB1c2luZyBzZXRwcm9jdGl0bGUoMykuCisJaWYgKHJlcyA+IDAgJiYgYnVmZmVyW3Jlcy0xXSAhPSAnXDAnICYmIGxlbiA8IFBBR0VfU0laRSkgeworCQlsZW4gPSBzdHJubGVuKGJ1ZmZlciwgcmVzKTsKKwkJaWYgKGxlbiA8IHJlcykgeworCQkgICAgcmVzID0gbGVuOworCQl9IGVsc2UgeworCQkJbGVuID0gbW0tPmVudl9lbmQgLSBtbS0+ZW52X3N0YXJ0OworCQkJaWYgKGxlbiA+IFBBR0VfU0laRSAtIHJlcykKKwkJCQlsZW4gPSBQQUdFX1NJWkUgLSByZXM7CisJCQlyZXMgKz0gYWNjZXNzX3Byb2Nlc3Nfdm0odGFzaywgbW0tPmVudl9zdGFydCwgYnVmZmVyK3JlcywgbGVuLCAwKTsKKwkJCXJlcyA9IHN0cm5sZW4oYnVmZmVyLCByZXMpOworCQl9CisJfQorb3V0X21tOgorCW1tcHV0KG1tKTsKK291dDoKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHByb2NfcGlkX2F1eHYoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIpCit7CisJaW50IHJlcyA9IDA7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBnZXRfdGFza19tbSh0YXNrKTsKKwlpZiAobW0pIHsKKwkJdW5zaWduZWQgaW50IG53b3JkcyA9IDA7CisJCWRvCisJCQlud29yZHMgKz0gMjsKKwkJd2hpbGUgKG1tLT5zYXZlZF9hdXh2W253b3JkcyAtIDJdICE9IDApOyAvKiBBVF9OVUxMICovCisJCXJlcyA9IG53b3JkcyAqIHNpemVvZihtbS0+c2F2ZWRfYXV4dlswXSk7CisJCWlmIChyZXMgPiBQQUdFX1NJWkUpCisJCQlyZXMgPSBQQUdFX1NJWkU7CisJCW1lbWNweShidWZmZXIsIG1tLT5zYXZlZF9hdXh2LCByZXMpOworCQltbXB1dChtbSk7CisJfQorCXJldHVybiByZXM7Cit9CisKKworI2lmZGVmIENPTkZJR19LQUxMU1lNUworLyoKKyAqIFByb3ZpZGVzIGEgd2NoYW4gZmlsZSB2aWEga2FsbHN5bXMgaW4gYSBwcm9wZXIgb25lLXZhbHVlLXBlci1maWxlIGZvcm1hdC4KKyAqIFJldHVybnMgdGhlIHJlc29sdmVkIHN5bWJvbC4gIElmIHRoYXQgZmFpbHMsIHNpbXBseSByZXR1cm4gdGhlIGFkZHJlc3MuCisgKi8KK3N0YXRpYyBpbnQgcHJvY19waWRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIpCit7CisJY2hhciAqbW9kbmFtZTsKKwljb25zdCBjaGFyICpzeW1fbmFtZTsKKwl1bnNpZ25lZCBsb25nIHdjaGFuLCBzaXplLCBvZmZzZXQ7CisJY2hhciBuYW1lYnVmW0tTWU1fTkFNRV9MRU4rMV07CisKKwl3Y2hhbiA9IGdldF93Y2hhbih0YXNrKTsKKworCXN5bV9uYW1lID0ga2FsbHN5bXNfbG9va3VwKHdjaGFuLCAmc2l6ZSwgJm9mZnNldCwgJm1vZG5hbWUsIG5hbWVidWYpOworCWlmIChzeW1fbmFtZSkKKwkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJXMiLCBzeW1fbmFtZSk7CisJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJWx1Iiwgd2NoYW4pOworfQorI2VuZGlmIC8qIENPTkZJR19LQUxMU1lNUyAqLworCisjaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKKy8qCisgKiBQcm92aWRlcyAvcHJvYy9QSUQvc2NoZWRzdGF0CisgKi8KK3N0YXRpYyBpbnQgcHJvY19waWRfc2NoZWRzdGF0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqYnVmZmVyKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIiVsdSAlbHUgJWx1XG4iLAorCQkJdGFzay0+c2NoZWRfaW5mby5jcHVfdGltZSwKKwkJCXRhc2stPnNjaGVkX2luZm8ucnVuX2RlbGF5LAorCQkJdGFzay0+c2NoZWRfaW5mby5wY250KTsKK30KKyNlbmRpZgorCisvKiBUaGUgYmFkbmVzcyBmcm9tIHRoZSBPT00ga2lsbGVyICovCit1bnNpZ25lZCBsb25nIGJhZG5lc3Moc3RydWN0IHRhc2tfc3RydWN0ICpwLCB1bnNpZ25lZCBsb25nIHVwdGltZSk7CitzdGF0aWMgaW50IHByb2Nfb29tX3Njb3JlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqYnVmZmVyKQoreworCXVuc2lnbmVkIGxvbmcgcG9pbnRzOworCXN0cnVjdCB0aW1lc3BlYyB1cHRpbWU7CisKKwlkb19wb3NpeF9jbG9ja19tb25vdG9uaWNfZ2V0dGltZSgmdXB0aW1lKTsKKwlwb2ludHMgPSBiYWRuZXNzKHRhc2ssIHVwdGltZS50dl9zZWMpOworCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIiVsdVxuIiwgcG9pbnRzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICBIZXJlIHRoZSBmcyBwYXJ0IGJlZ2lucyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBwZXJtaXNzaW9uIGNoZWNrcyAqLworCitzdGF0aWMgaW50IHByb2NfY2hlY2tfcm9vdChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBkZW50cnkgKmRlLCAqYmFzZSwgKnJvb3Q7CisJc3RydWN0IHZmc21vdW50ICpvdXJfdmZzbW50LCAqdmZzbW50LCAqbW50OworCWludCByZXMgPSAwOworCisJaWYgKHByb2Nfcm9vdF9saW5rKGlub2RlLCAmcm9vdCwgJnZmc21udCkpIC8qIEV3d3cuLi4gKi8KKwkJcmV0dXJuIC1FTk9FTlQ7CisJcmVhZF9sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJb3VyX3Zmc21udCA9IG1udGdldChjdXJyZW50LT5mcy0+cm9vdG1udCk7CisJYmFzZSA9IGRnZXQoY3VycmVudC0+ZnMtPnJvb3QpOworCXJlYWRfdW5sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisKKwlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOworCWRlID0gcm9vdDsKKwltbnQgPSB2ZnNtbnQ7CisKKwl3aGlsZSAodmZzbW50ICE9IG91cl92ZnNtbnQpIHsKKwkJaWYgKHZmc21udCA9PSB2ZnNtbnQtPm1udF9wYXJlbnQpCisJCQlnb3RvIG91dDsKKwkJZGUgPSB2ZnNtbnQtPm1udF9tb3VudHBvaW50OworCQl2ZnNtbnQgPSB2ZnNtbnQtPm1udF9wYXJlbnQ7CisJfQorCisJaWYgKCFpc19zdWJkaXIoZGUsIGJhc2UpKQorCQlnb3RvIG91dDsKKwlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CisKK2V4aXQ6CisJZHB1dChiYXNlKTsKKwltbnRwdXQob3VyX3Zmc21udCk7CisJZHB1dChyb290KTsKKwltbnRwdXQobW50KTsKKwlyZXR1cm4gcmVzOworb3V0OgorCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwlyZXMgPSAtRUFDQ0VTOworCWdvdG8gZXhpdDsKK30KKworc3RhdGljIGludCBwcm9jX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWlmIChnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIE5VTEwpICE9IDApCisJCXJldHVybiAtRUFDQ0VTOworCXJldHVybiBwcm9jX2NoZWNrX3Jvb3QoaW5vZGUpOworfQorCitleHRlcm4gc3RydWN0IHNlcV9vcGVyYXRpb25zIHByb2NfcGlkX21hcHNfb3A7CitzdGF0aWMgaW50IG1hcHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOworCWludCByZXQgPSBzZXFfb3BlbihmaWxlLCAmcHJvY19waWRfbWFwc19vcCk7CisJaWYgKCFyZXQpIHsKKwkJc3RydWN0IHNlcV9maWxlICptID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQltLT5wcml2YXRlID0gdGFzazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19tYXBzX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gbWFwc19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCitleHRlcm4gc3RydWN0IHNlcV9vcGVyYXRpb25zIG1vdW50c19vcDsKK3N0YXRpYyBpbnQgbW91bnRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gcHJvY190YXNrKGlub2RlKTsKKwlpbnQgcmV0ID0gc2VxX29wZW4oZmlsZSwgJm1vdW50c19vcCk7CisKKwlpZiAoIXJldCkgeworCQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCXN0cnVjdCBuYW1lc3BhY2UgKm5hbWVzcGFjZTsKKwkJdGFza19sb2NrKHRhc2spOworCQluYW1lc3BhY2UgPSB0YXNrLT5uYW1lc3BhY2U7CisJCWlmIChuYW1lc3BhY2UpCisJCQlnZXRfbmFtZXNwYWNlKG5hbWVzcGFjZSk7CisJCXRhc2tfdW5sb2NrKHRhc2spOworCisJCWlmIChuYW1lc3BhY2UpCisJCQltLT5wcml2YXRlID0gbmFtZXNwYWNlOworCQllbHNlIHsKKwkJCXNlcV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtb3VudHNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG5hbWVzcGFjZSAqbmFtZXNwYWNlID0gbS0+cHJpdmF0ZTsKKwlwdXRfbmFtZXNwYWNlKG5hbWVzcGFjZSk7CisJcmV0dXJuIHNlcV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19tb3VudHNfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBtb3VudHNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IG1vdW50c19yZWxlYXNlLAorfTsKKworI2RlZmluZSBQUk9DX0JMT0NLX1NJWkUJKDMqMTAyNCkJCS8qIDRLIHBhZ2Ugc2l6ZSBidXQgb3VyIG91dHB1dCByb3V0aW5lcyB1c2Ugc29tZSBzbGFjayBmb3Igb3ZlcnJ1bnMgKi8KKworc3RhdGljIHNzaXplX3QgcHJvY19pbmZvX3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CisJc3NpemVfdCBsZW5ndGg7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gcHJvY190YXNrKGlub2RlKTsKKworCWlmIChjb3VudCA+IFBST0NfQkxPQ0tfU0laRSkKKwkJY291bnQgPSBQUk9DX0JMT0NLX1NJWkU7CisJaWYgKCEocGFnZSA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKSkpCisJCXJldHVybiAtRU5PTUVNOworCisJbGVuZ3RoID0gUFJPQ19JKGlub2RlKS0+b3AucHJvY19yZWFkKHRhc2ssIChjaGFyKilwYWdlKTsKKworCWlmIChsZW5ndGggPj0gMCkKKwkJbGVuZ3RoID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgKGNoYXIgKilwYWdlLCBsZW5ndGgpOworCWZyZWVfcGFnZShwYWdlKTsKKwlyZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2luZm9fZmlsZV9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IHByb2NfaW5mb19yZWFkLAorfTsKKworc3RhdGljIGludCBtZW1fb3BlbihzdHJ1Y3QgaW5vZGUqIGlub2RlLCBzdHJ1Y3QgZmlsZSogZmlsZSkKK3sKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSAodm9pZCopKChsb25nKWN1cnJlbnQtPnNlbGZfZXhlY19pZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1lbV9yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWNoYXIgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyBzcmMgPSAqcHBvczsKKwlpbnQgcmV0ID0gLUVTUkNIOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCisJaWYgKCFNQVlfUFRSQUNFKHRhc2spIHx8ICFtYXlfcHRyYWNlX2F0dGFjaCh0YXNrKSkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSAtRU5PTUVNOworCXBhZ2UgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfVVNFUik7CisJaWYgKCFwYWdlKQorCQlnb3RvIG91dDsKKworCXJldCA9IDA7CisgCisJbW0gPSBnZXRfdGFza19tbSh0YXNrKTsKKwlpZiAoIW1tKQorCQlnb3RvIG91dF9mcmVlOworCisJcmV0ID0gLUVJTzsKKyAKKwlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhICE9ICh2b2lkKikoKGxvbmcpY3VycmVudC0+c2VsZl9leGVjX2lkKSkKKwkJZ290byBvdXRfcHV0OworCisJcmV0ID0gMDsKKyAKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCWludCB0aGlzX2xlbiwgcmV0dmFsOworCisJCXRoaXNfbGVuID0gKGNvdW50ID4gUEFHRV9TSVpFKSA/IFBBR0VfU0laRSA6IGNvdW50OworCQlyZXR2YWwgPSBhY2Nlc3NfcHJvY2Vzc192bSh0YXNrLCBzcmMsIHBhZ2UsIHRoaXNfbGVuLCAwKTsKKwkJaWYgKCFyZXR2YWwgfHwgIU1BWV9QVFJBQ0UodGFzaykgfHwgIW1heV9wdHJhY2VfYXR0YWNoKHRhc2spKSB7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgcGFnZSwgcmV0dmFsKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisgCisJCXJldCArPSByZXR2YWw7CisJCXNyYyArPSByZXR2YWw7CisJCWJ1ZiArPSByZXR2YWw7CisJCWNvdW50IC09IHJldHZhbDsKKwl9CisJKnBwb3MgPSBzcmM7CisKK291dF9wdXQ6CisJbW1wdXQobW0pOworb3V0X2ZyZWU6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIG1lbV93cml0ZSBOVUxMCisKKyNpZm5kZWYgbWVtX3dyaXRlCisvKiBUaGlzIGlzIGEgc2VjdXJpdHkgaGF6YXJkICovCitzdGF0aWMgc3NpemVfdCBtZW1fd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyICogYnVmLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCBjb3BpZWQgPSAwOworCWNoYXIgKnBhZ2U7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gcHJvY190YXNrKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwl1bnNpZ25lZCBsb25nIGRzdCA9ICpwcG9zOworCisJaWYgKCFNQVlfUFRSQUNFKHRhc2spIHx8ICFtYXlfcHRyYWNlX2F0dGFjaCh0YXNrKSkKKwkJcmV0dXJuIC1FU1JDSDsKKworCXBhZ2UgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfVVNFUik7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJaW50IHRoaXNfbGVuLCByZXR2YWw7CisKKwkJdGhpc19sZW4gPSAoY291bnQgPiBQQUdFX1NJWkUpID8gUEFHRV9TSVpFIDogY291bnQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcihwYWdlLCBidWYsIHRoaXNfbGVuKSkgeworCQkJY29waWVkID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXJldHZhbCA9IGFjY2Vzc19wcm9jZXNzX3ZtKHRhc2ssIGRzdCwgcGFnZSwgdGhpc19sZW4sIDEpOworCQlpZiAoIXJldHZhbCkgeworCQkJaWYgKCFjb3BpZWQpCisJCQkJY29waWVkID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCWNvcGllZCArPSByZXR2YWw7CisJCWJ1ZiArPSByZXR2YWw7CisJCWRzdCArPSByZXR2YWw7CisJCWNvdW50IC09IHJldHZhbDsJCQkKKwl9CisJKnBwb3MgPSBkc3Q7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlKTsKKwlyZXR1cm4gY29waWVkOworfQorI2VuZGlmCisKK3N0YXRpYyBsb2ZmX3QgbWVtX2xzZWVrKHN0cnVjdCBmaWxlICogZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWcpCit7CisJc3dpdGNoIChvcmlnKSB7CisJY2FzZSAwOgorCQlmaWxlLT5mX3BvcyA9IG9mZnNldDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlmaWxlLT5mX3BvcyArPSBvZmZzZXQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlmb3JjZV9zdWNjZXNzZnVsX3N5c2NhbGxfcmV0dXJuKCk7CisJcmV0dXJuIGZpbGUtPmZfcG9zOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX21lbV9vcGVyYXRpb25zID0geworCS5sbHNlZWsJCT0gbWVtX2xzZWVrLAorCS5yZWFkCQk9IG1lbV9yZWFkLAorCS53cml0ZQkJPSBtZW1fd3JpdGUsCisJLm9wZW4JCT0gbWVtX29wZW4sCit9OworCitzdGF0aWMgc3NpemVfdCBvb21fYWRqdXN0X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gcHJvY190YXNrKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwljaGFyIGJ1ZmZlcls4XTsKKwlzaXplX3QgbGVuOworCWludCBvb21fYWRqdXN0ID0gdGFzay0+b29ta2lsbGFkajsKKwlsb2ZmX3QgX19wcG9zID0gKnBwb3M7CisKKwlsZW4gPSBzcHJpbnRmKGJ1ZmZlciwgIiVpXG4iLCBvb21fYWRqdXN0KTsKKwlpZiAoX19wcG9zID49IGxlbikKKwkJcmV0dXJuIDA7CisJaWYgKGNvdW50ID4gbGVuLV9fcHBvcykKKwkJY291bnQgPSBsZW4tX19wcG9zOworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBidWZmZXIgKyBfX3Bwb3MsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJKnBwb3MgPSBfX3Bwb3MgKyBjb3VudDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG9vbV9hZGp1c3Rfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gcHJvY190YXNrKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwljaGFyIGJ1ZmZlcls4XSwgKmVuZDsKKwlpbnQgb29tX2FkanVzdDsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwltZW1zZXQoYnVmZmVyLCAwLCA4KTsKKwlpZiAoY291bnQgPiA2KQorCQljb3VudCA9IDY7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZmZlciwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCW9vbV9hZGp1c3QgPSBzaW1wbGVfc3RydG9sKGJ1ZmZlciwgJmVuZCwgMCk7CisJaWYgKG9vbV9hZGp1c3QgPCAtMTYgfHwgb29tX2FkanVzdCA+IDE1KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKmVuZCA9PSAnXG4nKQorCQllbmQrKzsKKwl0YXNrLT5vb21raWxsYWRqID0gb29tX2FkanVzdDsKKwlpZiAoZW5kIC0gYnVmZmVyID09IDApCisJCXJldHVybiAtRUlPOworCXJldHVybiBlbmQgLSBidWZmZXI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfb29tX2FkanVzdF9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IG9vbV9hZGp1c3RfcmVhZCwKKwkud3JpdGUJCT0gb29tX2FkanVzdF93cml0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBwcm9jX21lbV9pbm9kZV9vcGVyYXRpb25zID0geworCS5wZXJtaXNzaW9uCT0gcHJvY19wZXJtaXNzaW9uLAorfTsKKworI2lmZGVmIENPTkZJR19BVURJVFNZU0NBTEwKKyNkZWZpbmUgVE1QQlVGTEVOIDIxCitzdGF0aWMgc3NpemVfdCBwcm9jX2xvZ2ludWlkX3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gcHJvY190YXNrKGlub2RlKTsKKwlzc2l6ZV90IGxlbmd0aDsKKwljaGFyIHRtcGJ1ZltUTVBCVUZMRU5dOworCisJbGVuZ3RoID0gc2NucHJpbnRmKHRtcGJ1ZiwgVE1QQlVGTEVOLCAiJXUiLAorCQkJCWF1ZGl0X2dldF9sb2dpbnVpZCh0YXNrLT5hdWRpdF9jb250ZXh0KSk7CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIHRtcGJ1ZiwgbGVuZ3RoKTsKK30KKworc3RhdGljIHNzaXplX3QgcHJvY19sb2dpbnVpZF93cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLAorCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJY2hhciAqcGFnZSwgKnRtcDsKKwlzc2l6ZV90IGxlbmd0aDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOworCXVpZF90IGxvZ2ludWlkOworCisJaWYgKCFjYXBhYmxlKENBUF9BVURJVF9DT05UUk9MKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChjdXJyZW50ICE9IHRhc2spCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoY291bnQgPiBQQUdFX1NJWkUpCisJCWNvdW50ID0gUEFHRV9TSVpFOworCisJaWYgKCpwcG9zICE9IDApIHsKKwkJLyogTm8gcGFydGlhbCB3cml0ZXMuICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwYWdlID0gKGNoYXIqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfVVNFUik7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlsZW5ndGggPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcihwYWdlLCBidWYsIGNvdW50KSkKKwkJZ290byBvdXRfZnJlZV9wYWdlOworCisJbG9naW51aWQgPSBzaW1wbGVfc3RydG91bChwYWdlLCAmdG1wLCAxMCk7CisJaWYgKHRtcCA9PSBwYWdlKSB7CisJCWxlbmd0aCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2ZyZWVfcGFnZTsKKworCX0KKwlsZW5ndGggPSBhdWRpdF9zZXRfbG9naW51aWQodGFzay0+YXVkaXRfY29udGV4dCwgbG9naW51aWQpOworCWlmIChsaWtlbHkobGVuZ3RoID09IDApKQorCQlsZW5ndGggPSBjb3VudDsKKworb3V0X2ZyZWVfcGFnZToKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBhZ2UpOworCXJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfbG9naW51aWRfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBwcm9jX2xvZ2ludWlkX3JlYWQsCisJLndyaXRlCQk9IHByb2NfbG9naW51aWRfd3JpdGUsCit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU0VDQ09NUAorc3RhdGljIHNzaXplX3Qgc2VjY29tcF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gcHJvY190YXNrKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwljaGFyIF9fYnVmWzIwXTsKKwlsb2ZmX3QgX19wcG9zID0gKnBwb3M7CisJc2l6ZV90IGxlbjsKKworCS8qIG5vIG5lZWQgdG8gcHJpbnQgdGhlIHRyYWlsaW5nIHplcm8sIHNvIHVzZSBvbmx5IGxlbiAqLworCWxlbiA9IHNwcmludGYoX19idWYsICIldVxuIiwgdHNrLT5zZWNjb21wLm1vZGUpOworCWlmIChfX3Bwb3MgPj0gbGVuKQorCQlyZXR1cm4gMDsKKwlpZiAoY291bnQgPiBsZW4gLSBfX3Bwb3MpCisJCWNvdW50ID0gbGVuIC0gX19wcG9zOworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBfX2J1ZiArIF9fcHBvcywgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkqcHBvcyA9IF9fcHBvcyArIGNvdW50OworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2VjY29tcF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBwcm9jX3Rhc2soZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWNoYXIgX19idWZbMjBdLCAqZW5kOworCXVuc2lnbmVkIGludCBzZWNjb21wX21vZGU7CisKKwkvKiBjYW4gc2V0IGl0IG9ubHkgb25jZSB0byBiZSBldmVuIG1vcmUgc2VjdXJlICovCisJaWYgKHVubGlrZWx5KHRzay0+c2VjY29tcC5tb2RlKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCW1lbXNldChfX2J1ZiwgMCwgc2l6ZW9mKF9fYnVmKSk7CisJY291bnQgPSBtaW4oY291bnQsIHNpemVvZihfX2J1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoX19idWYsIGJ1ZiwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlzZWNjb21wX21vZGUgPSBzaW1wbGVfc3RydG91bChfX2J1ZiwgJmVuZCwgMCk7CisJaWYgKCplbmQgPT0gJ1xuJykKKwkJZW5kKys7CisJaWYgKHNlY2NvbXBfbW9kZSAmJiBzZWNjb21wX21vZGUgPD0gTlJfU0VDQ09NUF9NT0RFUykgeworCQl0c2stPnNlY2NvbXAubW9kZSA9IHNlY2NvbXBfbW9kZTsKKwkJc2V0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9TRUNDT01QKTsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHVubGlrZWx5KCEoZW5kIC0gX19idWYpKSkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIGVuZCAtIF9fYnVmOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3NlY2NvbXBfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBzZWNjb21wX3JlYWQsCisJLndyaXRlCQk9IHNlY2NvbXBfd3JpdGUsCit9OworI2VuZGlmIC8qIENPTkZJR19TRUNDT01QICovCisKK3N0YXRpYyBpbnQgcHJvY19waWRfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvciA9IC1FQUNDRVM7CisKKwkvKiBXZSBkb24ndCBuZWVkIGEgYmFzZSBwb2ludGVyIGluIHRoZSAvcHJvYyBmaWxlc3lzdGVtICovCisJcGF0aF9yZWxlYXNlKG5kKTsKKworCWlmIChjdXJyZW50LT5mc3VpZCAhPSBpbm9kZS0+aV91aWQgJiYgIWNhcGFibGUoQ0FQX0RBQ19PVkVSUklERSkpCisJCWdvdG8gb3V0OworCWVycm9yID0gcHJvY19jaGVja19yb290KGlub2RlKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSBQUk9DX0koaW5vZGUpLT5vcC5wcm9jX2dldF9saW5rKGlub2RlLCAmbmQtPmRlbnRyeSwgJm5kLT5tbnQpOworCW5kLT5sYXN0X3R5cGUgPSBMQVNUX0JJTkQ7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IGRvX3Byb2NfcmVhZGxpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgdmZzbW91bnQgKm1udCwKKwkJCSAgICBjaGFyIF9fdXNlciAqYnVmZmVyLCBpbnQgYnVmbGVuKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCWNoYXIgKnRtcCA9IChjaGFyKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCksICpwYXRoOworCWludCBsZW47CisKKwlpZiAoIXRtcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJCQorCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXBhdGggPSBkX3BhdGgoZGVudHJ5LCBtbnQsIHRtcCwgUEFHRV9TSVpFKTsKKwlsZW4gPSBQVFJfRVJSKHBhdGgpOworCWlmIChJU19FUlIocGF0aCkpCisJCWdvdG8gb3V0OworCWxlbiA9IHRtcCArIFBBR0VfU0laRSAtIDEgLSBwYXRoOworCisJaWYgKGxlbiA+IGJ1ZmxlbikKKwkJbGVuID0gYnVmbGVuOworCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBwYXRoLCBsZW4pKQorCQlsZW4gPSAtRUZBVUxUOworIG91dDoKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdG1wKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHByb2NfcGlkX3JlYWRsaW5rKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGNoYXIgX191c2VyICogYnVmZmVyLCBpbnQgYnVmbGVuKQoreworCWludCBlcnJvciA9IC1FQUNDRVM7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZTsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IE5VTEw7CisKKwlsb2NrX2tlcm5lbCgpOworCisJaWYgKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCAmJiAhY2FwYWJsZShDQVBfREFDX09WRVJSSURFKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBwcm9jX2NoZWNrX3Jvb3QoaW5vZGUpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IFBST0NfSShpbm9kZSktPm9wLnByb2NfZ2V0X2xpbmsoaW5vZGUsICZkZSwgJm1udCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gZG9fcHJvY19yZWFkbGluayhkZSwgbW50LCBidWZmZXIsIGJ1Zmxlbik7CisJZHB1dChkZSk7CisJbW50cHV0KG1udCk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHByb2NfcGlkX2xpbmtfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZGxpbmsJPSBwcm9jX3BpZF9yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBwcm9jX3BpZF9mb2xsb3dfbGluaworfTsKKworI2RlZmluZSBOVU1CVUYgMTAKKworc3RhdGljIGludCBwcm9jX3JlYWRmZChzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAgPSBwcm9jX3Rhc2soaW5vZGUpOworCXVuc2lnbmVkIGludCBmZCwgdGlkLCBpbm87CisJaW50IHJldHZhbDsKKwljaGFyIGJ1ZltOVU1CVUZdOworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlczsKKworCXJldHZhbCA9IC1FTk9FTlQ7CisJaWYgKCFwaWRfYWxpdmUocCkpCisJCWdvdG8gb3V0OworCXJldHZhbCA9IDA7CisJdGlkID0gcC0+cGlkOworCisJZmQgPSBmaWxwLT5mX3BvczsKKwlzd2l0Y2ggKGZkKSB7CisJCWNhc2UgMDoKKwkJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4iLCAxLCAwLCBpbm9kZS0+aV9pbm8sIERUX0RJUikgPCAwKQorCQkJCWdvdG8gb3V0OworCQkJZmlscC0+Zl9wb3MrKzsKKwkJY2FzZSAxOgorCQkJaW5vID0gZmFrZV9pbm8odGlkLCBQUk9DX1RJRF9JTk8pOworCQkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLi4iLCAyLCAxLCBpbm8sIERUX0RJUikgPCAwKQorCQkJCWdvdG8gb3V0OworCQkJZmlscC0+Zl9wb3MrKzsKKwkJZGVmYXVsdDoKKwkJCWZpbGVzID0gZ2V0X2ZpbGVzX3N0cnVjdChwKTsKKwkJCWlmICghZmlsZXMpCisJCQkJZ290byBvdXQ7CisJCQlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQkJZm9yIChmZCA9IGZpbHAtPmZfcG9zLTI7CisJCQkgICAgIGZkIDwgZmlsZXMtPm1heF9mZHM7CisJCQkgICAgIGZkKyssIGZpbHAtPmZfcG9zKyspIHsKKwkJCQl1bnNpZ25lZCBpbnQgaSxqOworCisJCQkJaWYgKCFmY2hlY2tfZmlsZXMoZmlsZXMsIGZkKSkKKwkJCQkJY29udGludWU7CisJCQkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCisJCQkJaiA9IE5VTUJVRjsKKwkJCQlpID0gZmQ7CisJCQkJZG8geworCQkJCQlqLS07CisJCQkJCWJ1ZltqXSA9ICcwJyArIChpICUgMTApOworCQkJCQlpIC89IDEwOworCQkJCX0gd2hpbGUgKGkpOworCisJCQkJaW5vID0gZmFrZV9pbm8odGlkLCBQUk9DX1RJRF9GRF9ESVIgKyBmZCk7CisJCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBidWYraiwgTlVNQlVGLWosIGZkKzIsIGlubywgRFRfTE5LKSA8IDApIHsKKwkJCQkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCQl9CisJCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCQlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBwcm9jX3BpZGVudF9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLAorCQl2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyLAorCQlzdHJ1Y3QgcGlkX2VudHJ5ICplbnRzLCB1bnNpZ25lZCBpbnQgbmVudHMpCit7CisJaW50IGk7CisJaW50IHBpZDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBwaWRfZW50cnkgKnA7CisJaW5vX3QgaW5vOworCWludCByZXQ7CisKKwlyZXQgPSAtRU5PRU5UOworCWlmICghcGlkX2FsaXZlKHByb2NfdGFzayhpbm9kZSkpKQorCQlnb3RvIG91dDsKKworCXJldCA9IDA7CisJcGlkID0gcHJvY190YXNrKGlub2RlKS0+cGlkOworCWkgPSBmaWxwLT5mX3BvczsKKwlzd2l0Y2ggKGkpIHsKKwljYXNlIDA6CisJCWlubyA9IGlub2RlLT5pX2lubzsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIGksIGlubywgRFRfRElSKSA8IDApCisJCQlnb3RvIG91dDsKKwkJaSsrOworCQlmaWxwLT5mX3BvcysrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIDE6CisJCWlubyA9IHBhcmVudF9pbm8oZGVudHJ5KTsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLi4iLCAyLCBpLCBpbm8sIERUX0RJUikgPCAwKQorCQkJZ290byBvdXQ7CisJCWkrKzsKKwkJZmlscC0+Zl9wb3MrKzsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJaSAtPSAyOworCQlpZiAoaSA+PSBuZW50cykgeworCQkJcmV0ID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXAgPSBlbnRzICsgaTsKKwkJd2hpbGUgKHAtPm5hbWUpIHsKKwkJCWlmIChmaWxsZGlyKGRpcmVudCwgcC0+bmFtZSwgcC0+bGVuLCBmaWxwLT5mX3BvcywKKwkJCQkgICAgZmFrZV9pbm8ocGlkLCBwLT50eXBlKSwgcC0+bW9kZSA+PiAxMikgPCAwKQorCQkJCWdvdG8gb3V0OworCQkJZmlscC0+Zl9wb3MrKzsKKwkJCXArKzsKKwkJfQorCX0KKworCXJldCA9IDE7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwcm9jX3RnaWRfYmFzZV9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwKKwkJCSAgICAgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJcmV0dXJuIHByb2NfcGlkZW50X3JlYWRkaXIoZmlscCxkaXJlbnQsZmlsbGRpciwKKwkJCQkgICB0Z2lkX2Jhc2Vfc3R1ZmYsQVJSQVlfU0laRSh0Z2lkX2Jhc2Vfc3R1ZmYpKTsKK30KKworc3RhdGljIGludCBwcm9jX3RpZF9iYXNlX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLAorCQkJICAgICB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlyZXR1cm4gcHJvY19waWRlbnRfcmVhZGRpcihmaWxwLGRpcmVudCxmaWxsZGlyLAorCQkJCSAgIHRpZF9iYXNlX3N0dWZmLEFSUkFZX1NJWkUodGlkX2Jhc2Vfc3R1ZmYpKTsKK30KKworLyogYnVpbGRpbmcgYW4gaW5vZGUgKi8KKworc3RhdGljIGludCB0YXNrX2R1bXBhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlpbnQgZHVtcGFibGUgPSAwOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCisJdGFza19sb2NrKHRhc2spOworCW1tID0gdGFzay0+bW07CisJaWYgKG1tKQorCQlkdW1wYWJsZSA9IG1tLT5kdW1wYWJsZTsKKwl0YXNrX3VubG9jayh0YXNrKTsKKwlyZXR1cm4gZHVtcGFibGU7Cit9CisKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqcHJvY19waWRfbWFrZV9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgaW5vKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCXN0cnVjdCBwcm9jX2lub2RlICplaTsKKworCS8qIFdlIG5lZWQgYSBuZXcgaW5vZGUgKi8KKwkKKwlpbm9kZSA9IG5ld19pbm9kZShzYik7CisJaWYgKCFpbm9kZSkKKwkJZ290byBvdXQ7CisKKwkvKiBDb21tb24gc3R1ZmYgKi8KKwllaSA9IFBST0NfSShpbm9kZSk7CisJZWktPnRhc2sgPSBOVUxMOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwlpbm9kZS0+aV9pbm8gPSBmYWtlX2lubyh0YXNrLT5waWQsIGlubyk7CisKKwlpZiAoIXBpZF9hbGl2ZSh0YXNrKSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJLyoKKwkgKiBncmFiIHRoZSByZWZlcmVuY2UgdG8gdGFzay4KKwkgKi8KKwlnZXRfdGFza19zdHJ1Y3QodGFzayk7CisJZWktPnRhc2sgPSB0YXNrOworCWVpLT50eXBlID0gaW5vOworCWlub2RlLT5pX3VpZCA9IDA7CisJaW5vZGUtPmlfZ2lkID0gMDsKKwlpZiAoaW5vID09IFBST0NfVEdJRF9JTk8gfHwgaW5vID09IFBST0NfVElEX0lOTyB8fCB0YXNrX2R1bXBhYmxlKHRhc2spKSB7CisJCWlub2RlLT5pX3VpZCA9IHRhc2stPmV1aWQ7CisJCWlub2RlLT5pX2dpZCA9IHRhc2stPmVnaWQ7CisJfQorCXNlY3VyaXR5X3Rhc2tfdG9faW5vZGUodGFzaywgaW5vZGUpOworCitvdXQ6CisJcmV0dXJuIGlub2RlOworCitvdXRfdW5sb2NrOgorCWVpLT5wZGUgPSBOVUxMOworCWlwdXQoaW5vZGUpOworCXJldHVybiBOVUxMOworfQorCisvKiBkZW50cnkgc3R1ZmYgKi8KKworLyoKKyAqCUV4Y2VwdGlvbmFsIGNhc2U6IG5vcm1hbGx5IHdlIGFyZSBub3QgYWxsb3dlZCB0byB1bmhhc2ggYSBidXN5CisgKiBkaXJlY3RvcnkuIEluIHRoaXMgY2FzZSwgaG93ZXZlciwgd2UgY2FuIGRvIGl0IC0gbm8gYWxpYXNpbmcgcHJvYmxlbXMKKyAqIGR1ZSB0byB0aGUgd2F5IHdlIHRyZWF0IGlub2Rlcy4KKyAqCisgKiBSZXdyaXRlIHRoZSBpbm9kZSdzIG93bmVyc2hpcHMgaGVyZSBiZWNhdXNlIHRoZSBvd25pbmcgdGFzayBtYXkgaGF2ZQorICogcGVyZm9ybWVkIGEgc2V0dWlkKCksIGV0Yy4KKyAqLworc3RhdGljIGludCBwaWRfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gcHJvY190YXNrKGlub2RlKTsKKwlpZiAocGlkX2FsaXZlKHRhc2spKSB7CisJCWlmIChwcm9jX3R5cGUoaW5vZGUpID09IFBST0NfVEdJRF9JTk8gfHwgcHJvY190eXBlKGlub2RlKSA9PSBQUk9DX1RJRF9JTk8gfHwgdGFza19kdW1wYWJsZSh0YXNrKSkgeworCQkJaW5vZGUtPmlfdWlkID0gdGFzay0+ZXVpZDsKKwkJCWlub2RlLT5pX2dpZCA9IHRhc2stPmVnaWQ7CisJCX0gZWxzZSB7CisJCQlpbm9kZS0+aV91aWQgPSAwOworCQkJaW5vZGUtPmlfZ2lkID0gMDsKKwkJfQorCQlzZWN1cml0eV90YXNrX3RvX2lub2RlKHRhc2ssIGlub2RlKTsKKwkJcmV0dXJuIDE7CisJfQorCWRfZHJvcChkZW50cnkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpZF9mZF9yZXZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOworCWludCBmZCA9IHByb2NfdHlwZShpbm9kZSkgLSBQUk9DX1RJRF9GRF9ESVI7CisJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXM7CisKKwlmaWxlcyA9IGdldF9maWxlc19zdHJ1Y3QodGFzayk7CisJaWYgKGZpbGVzKSB7CisJCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCWlmIChmY2hlY2tfZmlsZXMoZmlsZXMsIGZkKSkgeworCQkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQkJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CisJCQlpZiAodGFza19kdW1wYWJsZSh0YXNrKSkgeworCQkJCWlub2RlLT5pX3VpZCA9IHRhc2stPmV1aWQ7CisJCQkJaW5vZGUtPmlfZ2lkID0gdGFzay0+ZWdpZDsKKwkJCX0gZWxzZSB7CisJCQkJaW5vZGUtPmlfdWlkID0gMDsKKwkJCQlpbm9kZS0+aV9naWQgPSAwOworCQkJfQorCQkJc2VjdXJpdHlfdGFza190b19pbm9kZSh0YXNrLCBpbm9kZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOworCX0KKwlkX2Ryb3AoZGVudHJ5KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGlkX2Jhc2VfaXB1dChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gcHJvY190YXNrKGlub2RlKTsKKwlzcGluX2xvY2soJnRhc2stPnByb2NfbG9jayk7CisJaWYgKHRhc2stPnByb2NfZGVudHJ5ID09IGRlbnRyeSkKKwkJdGFzay0+cHJvY19kZW50cnkgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZ0YXNrLT5wcm9jX2xvY2spOworCWlwdXQoaW5vZGUpOworfQorCitzdGF0aWMgaW50IHBpZF9kZWxldGVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCit7CisJLyogSXMgdGhlIHRhc2sgd2UgcmVwcmVzZW50IGRlYWQ/CisJICogSWYgc28sIHRoZW4gZG9uJ3QgcHV0IHRoZSBkZW50cnkgb24gdGhlIGxydSBsaXN0LAorCSAqIGtpbGwgaXQgaW1tZWRpYXRlbHkuCisJICovCisJcmV0dXJuICFwaWRfYWxpdmUocHJvY190YXNrKGRlbnRyeS0+ZF9pbm9kZSkpOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIHRpZF9mZF9kZW50cnlfb3BlcmF0aW9ucyA9Cit7CisJLmRfcmV2YWxpZGF0ZQk9IHRpZF9mZF9yZXZhbGlkYXRlLAorCS5kX2RlbGV0ZQk9IHBpZF9kZWxldGVfZGVudHJ5LAorfTsKKworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBwaWRfZGVudHJ5X29wZXJhdGlvbnMgPQoreworCS5kX3JldmFsaWRhdGUJPSBwaWRfcmV2YWxpZGF0ZSwKKwkuZF9kZWxldGUJPSBwaWRfZGVsZXRlX2RlbnRyeSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgcGlkX2Jhc2VfZGVudHJ5X29wZXJhdGlvbnMgPQoreworCS5kX3JldmFsaWRhdGUJPSBwaWRfcmV2YWxpZGF0ZSwKKwkuZF9pcHV0CQk9IHBpZF9iYXNlX2lwdXQsCisJLmRfZGVsZXRlCT0gcGlkX2RlbGV0ZV9kZW50cnksCit9OworCisvKiBMb29rdXBzICovCisKK3N0YXRpYyB1bnNpZ25lZCBuYW1lX3RvX2ludChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJaW50IGxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwl1bnNpZ25lZCBuID0gMDsKKworCWlmIChsZW4gPiAxICYmICpuYW1lID09ICcwJykKKwkJZ290byBvdXQ7CisJd2hpbGUgKGxlbi0tID4gMCkgeworCQl1bnNpZ25lZCBjID0gKm5hbWUrKyAtICcwJzsKKwkJaWYgKGMgPiA5KQorCQkJZ290byBvdXQ7CisJCWlmIChuID49ICh+MFUtOSkvMTApCisJCQlnb3RvIG91dDsKKwkJbiAqPSAxMDsKKwkJbiArPSBjOworCX0KKwlyZXR1cm4gbjsKK291dDoKKwlyZXR1cm4gfjBVOworfQorCisvKiBTTVAtc2FmZSAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKnByb2NfbG9va3VwZmQoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soZGlyKTsKKwl1bnNpZ25lZCBmZCA9IG5hbWVfdG9faW50KGRlbnRyeSk7CisJc3RydWN0IGZpbGUgKiBmaWxlOworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlczsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBwcm9jX2lub2RlICplaTsKKworCWlmIChmZCA9PSB+MFUpCisJCWdvdG8gb3V0OworCWlmICghcGlkX2FsaXZlKHRhc2spKQorCQlnb3RvIG91dDsKKworCWlub2RlID0gcHJvY19waWRfbWFrZV9pbm9kZShkaXItPmlfc2IsIHRhc2ssIFBST0NfVElEX0ZEX0RJUitmZCk7CisJaWYgKCFpbm9kZSkKKwkJZ290byBvdXQ7CisJZWkgPSBQUk9DX0koaW5vZGUpOworCWZpbGVzID0gZ2V0X2ZpbGVzX3N0cnVjdCh0YXNrKTsKKwlpZiAoIWZpbGVzKQorCQlnb3RvIG91dF91bmxvY2s7CisJaW5vZGUtPmlfbW9kZSA9IFNfSUZMTks7CisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlmaWxlID0gZmNoZWNrX2ZpbGVzKGZpbGVzLCBmZCk7CisJaWYgKCFmaWxlKQorCQlnb3RvIG91dF91bmxvY2syOworCWlmIChmaWxlLT5mX21vZGUgJiAxKQorCQlpbm9kZS0+aV9tb2RlIHw9IFNfSVJVU1IgfCBTX0lYVVNSOworCWlmIChmaWxlLT5mX21vZGUgJiAyKQorCQlpbm9kZS0+aV9tb2RlIHw9IFNfSVdVU1IgfCBTX0lYVVNSOworCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKKwlpbm9kZS0+aV9vcCA9ICZwcm9jX3BpZF9saW5rX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfc2l6ZSA9IDY0OworCWVpLT5vcC5wcm9jX2dldF9saW5rID0gcHJvY19mZF9saW5rOworCWRlbnRyeS0+ZF9vcCA9ICZ0aWRfZmRfZGVudHJ5X29wZXJhdGlvbnM7CisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIE5VTEw7CisKK291dF91bmxvY2syOgorCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKK291dF91bmxvY2s6CisJaXB1dChpbm9kZSk7CitvdXQ6CisJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY190YXNrX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcik7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqcHJvY190YXNrX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2ZkX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IHByb2NfcmVhZGZkLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY190YXNrX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IHByb2NfdGFza19yZWFkZGlyLAorfTsKKworLyoKKyAqIHByb2MgZGlyZWN0b3JpZXMgY2FuIGRvIGFsbW9zdCBub3RoaW5nLi4KKyAqLworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHByb2NfZmRfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IHByb2NfbG9va3VwZmQsCisJLnBlcm1pc3Npb24JPSBwcm9jX3Blcm1pc3Npb24sCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcHJvY190YXNrX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmxvb2t1cAkJPSBwcm9jX3Rhc2tfbG9va3VwLAorCS5wZXJtaXNzaW9uCT0gcHJvY19wZXJtaXNzaW9uLAorfTsKKworI2lmZGVmIENPTkZJR19TRUNVUklUWQorc3RhdGljIHNzaXplX3QgcHJvY19waWRfYXR0cl9yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCisJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXVuc2lnbmVkIGxvbmcgcGFnZTsKKwlzc2l6ZV90IGxlbmd0aDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOworCisJaWYgKGNvdW50ID4gUEFHRV9TSVpFKQorCQljb3VudCA9IFBBR0VfU0laRTsKKwlpZiAoIShwYWdlID0gX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsZW5ndGggPSBzZWN1cml0eV9nZXRwcm9jYXR0cih0YXNrLCAKKwkJCQkgICAgICAoY2hhciopZmlsZS0+Zl9kZW50cnktPmRfbmFtZS5uYW1lLCAKKwkJCQkgICAgICAodm9pZCopcGFnZSwgY291bnQpOworCWlmIChsZW5ndGggPj0gMCkKKwkJbGVuZ3RoID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgKGNoYXIgKilwYWdlLCBsZW5ndGgpOworCWZyZWVfcGFnZShwYWdlKTsKKwlyZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgc3NpemVfdCBwcm9jX3BpZF9hdHRyX3dyaXRlKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsCisJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7IAorCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJY2hhciAqcGFnZTsgCisJc3NpemVfdCBsZW5ndGg7IAorCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHByb2NfdGFzayhpbm9kZSk7IAorCisJaWYgKGNvdW50ID4gUEFHRV9TSVpFKSAKKwkJY291bnQgPSBQQUdFX1NJWkU7IAorCWlmICgqcHBvcyAhPSAwKSB7CisJCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcGFnZSA9IChjaGFyKilfX2dldF9mcmVlX3BhZ2UoR0ZQX1VTRVIpOyAKKwlpZiAoIXBhZ2UpIAorCQlyZXR1cm4gLUVOT01FTTsKKwlsZW5ndGggPSAtRUZBVUxUOyAKKwlpZiAoY29weV9mcm9tX3VzZXIocGFnZSwgYnVmLCBjb3VudCkpIAorCQlnb3RvIG91dDsKKworCWxlbmd0aCA9IHNlY3VyaXR5X3NldHByb2NhdHRyKHRhc2ssIAorCQkJCSAgICAgIChjaGFyKilmaWxlLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUsIAorCQkJCSAgICAgICh2b2lkKilwYWdlLCBjb3VudCk7CitvdXQ6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlKTsKKwlyZXR1cm4gbGVuZ3RoOworfSAKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19waWRfYXR0cl9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IHByb2NfcGlkX2F0dHJfcmVhZCwKKwkud3JpdGUJCT0gcHJvY19waWRfYXR0cl93cml0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfdGlkX2F0dHJfb3BlcmF0aW9uczsKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBwcm9jX3RpZF9hdHRyX2lub2RlX29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3RnaWRfYXR0cl9vcGVyYXRpb25zOworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHByb2NfdGdpZF9hdHRyX2lub2RlX29wZXJhdGlvbnM7CisjZW5kaWYKKworLyogU01QLXNhZmUgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpwcm9jX3BpZGVudF9sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIAorCQkJCQkgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCQkgc3RydWN0IHBpZF9lbnRyeSAqZW50cykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnJvcjsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soZGlyKTsKKwlzdHJ1Y3QgcGlkX2VudHJ5ICpwOworCXN0cnVjdCBwcm9jX2lub2RlICplaTsKKworCWVycm9yID0gLUVOT0VOVDsKKwlpbm9kZSA9IE5VTEw7CisKKwlpZiAoIXBpZF9hbGl2ZSh0YXNrKSkKKwkJZ290byBvdXQ7CisKKwlmb3IgKHAgPSBlbnRzOyBwLT5uYW1lOyBwKyspIHsKKwkJaWYgKHAtPmxlbiAhPSBkZW50cnktPmRfbmFtZS5sZW4pCisJCQljb250aW51ZTsKKwkJaWYgKCFtZW1jbXAoZGVudHJ5LT5kX25hbWUubmFtZSwgcC0+bmFtZSwgcC0+bGVuKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoIXAtPm5hbWUpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSAtRUlOVkFMOworCWlub2RlID0gcHJvY19waWRfbWFrZV9pbm9kZShkaXItPmlfc2IsIHRhc2ssIHAtPnR5cGUpOworCWlmICghaW5vZGUpCisJCWdvdG8gb3V0OworCisJZWkgPSBQUk9DX0koaW5vZGUpOworCWlub2RlLT5pX21vZGUgPSBwLT5tb2RlOworCS8qCisJICogWWVzLCBpdCBkb2VzIG5vdCBzY2FsZS4gQW5kIGl0IHNob3VsZCBub3QuIERvbid0IGFkZAorCSAqIG5ldyBlbnRyaWVzIGludG8gL3Byb2MvPHRnaWQ+LyB3aXRob3V0IHZlcnkgZ29vZCByZWFzb25zLgorCSAqLworCXN3aXRjaChwLT50eXBlKSB7CisJCWNhc2UgUFJPQ19UR0lEX1RBU0s6CisJCQlpbm9kZS0+aV9ubGluayA9IDM7CisJCQlpbm9kZS0+aV9vcCA9ICZwcm9jX3Rhc2tfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX3Rhc2tfb3BlcmF0aW9uczsKKwkJCWJyZWFrOworCQljYXNlIFBST0NfVElEX0ZEOgorCQljYXNlIFBST0NfVEdJRF9GRDoKKwkJCWlub2RlLT5pX25saW5rID0gMjsKKwkJCWlub2RlLT5pX29wID0gJnByb2NfZmRfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX2ZkX29wZXJhdGlvbnM7CisJCQlicmVhazsKKwkJY2FzZSBQUk9DX1RJRF9FWEU6CisJCWNhc2UgUFJPQ19UR0lEX0VYRToKKwkJCWlub2RlLT5pX29wID0gJnByb2NfcGlkX2xpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWVpLT5vcC5wcm9jX2dldF9saW5rID0gcHJvY19leGVfbGluazsKKwkJCWJyZWFrOworCQljYXNlIFBST0NfVElEX0NXRDoKKwkJY2FzZSBQUk9DX1RHSURfQ1dEOgorCQkJaW5vZGUtPmlfb3AgPSAmcHJvY19waWRfbGlua19pbm9kZV9vcGVyYXRpb25zOworCQkJZWktPm9wLnByb2NfZ2V0X2xpbmsgPSBwcm9jX2N3ZF9saW5rOworCQkJYnJlYWs7CisJCWNhc2UgUFJPQ19USURfUk9PVDoKKwkJY2FzZSBQUk9DX1RHSURfUk9PVDoKKwkJCWlub2RlLT5pX29wID0gJnByb2NfcGlkX2xpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWVpLT5vcC5wcm9jX2dldF9saW5rID0gcHJvY19yb290X2xpbms7CisJCQlicmVhazsKKwkJY2FzZSBQUk9DX1RJRF9FTlZJUk9OOgorCQljYXNlIFBST0NfVEdJRF9FTlZJUk9OOgorCQkJaW5vZGUtPmlfZm9wID0gJnByb2NfaW5mb19maWxlX29wZXJhdGlvbnM7CisJCQllaS0+b3AucHJvY19yZWFkID0gcHJvY19waWRfZW52aXJvbjsKKwkJCWJyZWFrOworCQljYXNlIFBST0NfVElEX0FVWFY6CisJCWNhc2UgUFJPQ19UR0lEX0FVWFY6CisJCQlpbm9kZS0+aV9mb3AgPSAmcHJvY19pbmZvX2ZpbGVfb3BlcmF0aW9uczsKKwkJCWVpLT5vcC5wcm9jX3JlYWQgPSBwcm9jX3BpZF9hdXh2OworCQkJYnJlYWs7CisJCWNhc2UgUFJPQ19USURfU1RBVFVTOgorCQljYXNlIFBST0NfVEdJRF9TVEFUVVM6CisJCQlpbm9kZS0+aV9mb3AgPSAmcHJvY19pbmZvX2ZpbGVfb3BlcmF0aW9uczsKKwkJCWVpLT5vcC5wcm9jX3JlYWQgPSBwcm9jX3BpZF9zdGF0dXM7CisJCQlicmVhazsKKwkJY2FzZSBQUk9DX1RJRF9TVEFUOgorCQkJaW5vZGUtPmlfZm9wID0gJnByb2NfaW5mb19maWxlX29wZXJhdGlvbnM7CisJCQllaS0+b3AucHJvY19yZWFkID0gcHJvY190aWRfc3RhdDsKKwkJCWJyZWFrOworCQljYXNlIFBST0NfVEdJRF9TVEFUOgorCQkJaW5vZGUtPmlfZm9wID0gJnByb2NfaW5mb19maWxlX29wZXJhdGlvbnM7CisJCQllaS0+b3AucHJvY19yZWFkID0gcHJvY190Z2lkX3N0YXQ7CisJCQlicmVhazsKKwkJY2FzZSBQUk9DX1RJRF9DTURMSU5FOgorCQljYXNlIFBST0NfVEdJRF9DTURMSU5FOgorCQkJaW5vZGUtPmlfZm9wID0gJnByb2NfaW5mb19maWxlX29wZXJhdGlvbnM7CisJCQllaS0+b3AucHJvY19yZWFkID0gcHJvY19waWRfY21kbGluZTsKKwkJCWJyZWFrOworCQljYXNlIFBST0NfVElEX1NUQVRNOgorCQljYXNlIFBST0NfVEdJRF9TVEFUTToKKwkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX2luZm9fZmlsZV9vcGVyYXRpb25zOworCQkJZWktPm9wLnByb2NfcmVhZCA9IHByb2NfcGlkX3N0YXRtOworCQkJYnJlYWs7CisJCWNhc2UgUFJPQ19USURfTUFQUzoKKwkJY2FzZSBQUk9DX1RHSURfTUFQUzoKKwkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX21hcHNfb3BlcmF0aW9uczsKKwkJCWJyZWFrOworCQljYXNlIFBST0NfVElEX01FTToKKwkJY2FzZSBQUk9DX1RHSURfTUVNOgorCQkJaW5vZGUtPmlfb3AgPSAmcHJvY19tZW1faW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX21lbV9vcGVyYXRpb25zOworCQkJYnJlYWs7CisjaWZkZWYgQ09ORklHX1NFQ0NPTVAKKwkJY2FzZSBQUk9DX1RJRF9TRUNDT01QOgorCQljYXNlIFBST0NfVEdJRF9TRUNDT01QOgorCQkJaW5vZGUtPmlfZm9wID0gJnByb2Nfc2VjY29tcF9vcGVyYXRpb25zOworCQkJYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX1NFQ0NPTVAgKi8KKwkJY2FzZSBQUk9DX1RJRF9NT1VOVFM6CisJCWNhc2UgUFJPQ19UR0lEX01PVU5UUzoKKwkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX21vdW50c19vcGVyYXRpb25zOworCQkJYnJlYWs7CisjaWZkZWYgQ09ORklHX1NFQ1VSSVRZCisJCWNhc2UgUFJPQ19USURfQVRUUjoKKwkJCWlub2RlLT5pX25saW5rID0gMjsKKwkJCWlub2RlLT5pX29wID0gJnByb2NfdGlkX2F0dHJfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX3RpZF9hdHRyX29wZXJhdGlvbnM7CisJCQlicmVhazsKKwkJY2FzZSBQUk9DX1RHSURfQVRUUjoKKwkJCWlub2RlLT5pX25saW5rID0gMjsKKwkJCWlub2RlLT5pX29wID0gJnByb2NfdGdpZF9hdHRyX2lub2RlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9mb3AgPSAmcHJvY190Z2lkX2F0dHJfb3BlcmF0aW9uczsKKwkJCWJyZWFrOworCQljYXNlIFBST0NfVElEX0FUVFJfQ1VSUkVOVDoKKwkJY2FzZSBQUk9DX1RHSURfQVRUUl9DVVJSRU5UOgorCQljYXNlIFBST0NfVElEX0FUVFJfUFJFVjoKKwkJY2FzZSBQUk9DX1RHSURfQVRUUl9QUkVWOgorCQljYXNlIFBST0NfVElEX0FUVFJfRVhFQzoKKwkJY2FzZSBQUk9DX1RHSURfQVRUUl9FWEVDOgorCQljYXNlIFBST0NfVElEX0FUVFJfRlNDUkVBVEU6CisJCWNhc2UgUFJPQ19UR0lEX0FUVFJfRlNDUkVBVEU6CisJCQlpbm9kZS0+aV9mb3AgPSAmcHJvY19waWRfYXR0cl9vcGVyYXRpb25zOworCQkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfS0FMTFNZTVMKKwkJY2FzZSBQUk9DX1RJRF9XQ0hBTjoKKwkJY2FzZSBQUk9DX1RHSURfV0NIQU46CisJCQlpbm9kZS0+aV9mb3AgPSAmcHJvY19pbmZvX2ZpbGVfb3BlcmF0aW9uczsKKwkJCWVpLT5vcC5wcm9jX3JlYWQgPSBwcm9jX3BpZF93Y2hhbjsKKwkJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKKwkJY2FzZSBQUk9DX1RJRF9TQ0hFRFNUQVQ6CisJCWNhc2UgUFJPQ19UR0lEX1NDSEVEU1RBVDoKKwkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX2luZm9fZmlsZV9vcGVyYXRpb25zOworCQkJZWktPm9wLnByb2NfcmVhZCA9IHByb2NfcGlkX3NjaGVkc3RhdDsKKwkJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NQVVNFVFMKKwkJY2FzZSBQUk9DX1RJRF9DUFVTRVQ6CisJCWNhc2UgUFJPQ19UR0lEX0NQVVNFVDoKKwkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX2NwdXNldF9vcGVyYXRpb25zOworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSBQUk9DX1RJRF9PT01fU0NPUkU6CisJCWNhc2UgUFJPQ19UR0lEX09PTV9TQ09SRToKKwkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX2luZm9fZmlsZV9vcGVyYXRpb25zOworCQkJZWktPm9wLnByb2NfcmVhZCA9IHByb2Nfb29tX3Njb3JlOworCQkJYnJlYWs7CisJCWNhc2UgUFJPQ19USURfT09NX0FESlVTVDoKKwkJY2FzZSBQUk9DX1RHSURfT09NX0FESlVTVDoKKwkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX29vbV9hZGp1c3Rfb3BlcmF0aW9uczsKKwkJCWJyZWFrOworI2lmZGVmIENPTkZJR19BVURJVFNZU0NBTEwKKwkJY2FzZSBQUk9DX1RJRF9MT0dJTlVJRDoKKwkJY2FzZSBQUk9DX1RHSURfTE9HSU5VSUQ6CisJCQlpbm9kZS0+aV9mb3AgPSAmcHJvY19sb2dpbnVpZF9vcGVyYXRpb25zOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCXByaW50aygicHJvY2ZzOiBpbXBvc3NpYmxlIHR5cGUgKCVkKSIscC0+dHlwZSk7CisJCQlpcHV0KGlub2RlKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKwlkZW50cnktPmRfb3AgPSAmcGlkX2RlbnRyeV9vcGVyYXRpb25zOworCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiBOVUxMOworCitvdXQ6CisJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqcHJvY190Z2lkX2Jhc2VfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKXsKKwlyZXR1cm4gcHJvY19waWRlbnRfbG9va3VwKGRpciwgZGVudHJ5LCB0Z2lkX2Jhc2Vfc3R1ZmYpOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqcHJvY190aWRfYmFzZV9sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpeworCXJldHVybiBwcm9jX3BpZGVudF9sb29rdXAoZGlyLCBkZW50cnksIHRpZF9iYXNlX3N0dWZmKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY190Z2lkX2Jhc2Vfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gcHJvY190Z2lkX2Jhc2VfcmVhZGRpciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfdGlkX2Jhc2Vfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gcHJvY190aWRfYmFzZV9yZWFkZGlyLAorfTsKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHByb2NfdGdpZF9iYXNlX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmxvb2t1cAkJPSBwcm9jX3RnaWRfYmFzZV9sb29rdXAsCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcHJvY190aWRfYmFzZV9pbm9kZV9vcGVyYXRpb25zID0geworCS5sb29rdXAJCT0gcHJvY190aWRfYmFzZV9sb29rdXAsCit9OworCisjaWZkZWYgQ09ORklHX1NFQ1VSSVRZCitzdGF0aWMgaW50IHByb2NfdGdpZF9hdHRyX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLAorCQkJICAgICB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlyZXR1cm4gcHJvY19waWRlbnRfcmVhZGRpcihmaWxwLGRpcmVudCxmaWxsZGlyLAorCQkJCSAgIHRnaWRfYXR0cl9zdHVmZixBUlJBWV9TSVpFKHRnaWRfYXR0cl9zdHVmZikpOworfQorCitzdGF0aWMgaW50IHByb2NfdGlkX2F0dHJfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsCisJCQkgICAgIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXJldHVybiBwcm9jX3BpZGVudF9yZWFkZGlyKGZpbHAsZGlyZW50LGZpbGxkaXIsCisJCQkJICAgdGlkX2F0dHJfc3R1ZmYsQVJSQVlfU0laRSh0aWRfYXR0cl9zdHVmZikpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3RnaWRfYXR0cl9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBwcm9jX3RnaWRfYXR0cl9yZWFkZGlyLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY190aWRfYXR0cl9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBwcm9jX3RpZF9hdHRyX3JlYWRkaXIsCit9OworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqcHJvY190Z2lkX2F0dHJfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJcmV0dXJuIHByb2NfcGlkZW50X2xvb2t1cChkaXIsIGRlbnRyeSwgdGdpZF9hdHRyX3N0dWZmKTsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKnByb2NfdGlkX2F0dHJfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJcmV0dXJuIHByb2NfcGlkZW50X2xvb2t1cChkaXIsIGRlbnRyeSwgdGlkX2F0dHJfc3R1ZmYpOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcHJvY190Z2lkX2F0dHJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IHByb2NfdGdpZF9hdHRyX2xvb2t1cCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBwcm9jX3RpZF9hdHRyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmxvb2t1cAkJPSBwcm9jX3RpZF9hdHRyX2xvb2t1cCwKK307CisjZW5kaWYKKworLyoKKyAqIC9wcm9jL3NlbGY6CisgKi8KK3N0YXRpYyBpbnQgcHJvY19zZWxmX3JlYWRsaW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgIGludCBidWZsZW4pCit7CisJY2hhciB0bXBbMzBdOworCXNwcmludGYodG1wLCAiJWQiLCBjdXJyZW50LT50Z2lkKTsKKwlyZXR1cm4gdmZzX3JlYWRsaW5rKGRlbnRyeSxidWZmZXIsYnVmbGVuLHRtcCk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19zZWxmX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJY2hhciB0bXBbMzBdOworCXNwcmludGYodG1wLCAiJWQiLCBjdXJyZW50LT50Z2lkKTsKKwlyZXR1cm4gdmZzX2ZvbGxvd19saW5rKG5kLHRtcCk7Cit9CQorCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcHJvY19zZWxmX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gcHJvY19zZWxmX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawk9IHByb2Nfc2VsZl9mb2xsb3dfbGluaywKK307CisKKy8qKgorICogcHJvY19waWRfdW5oYXNoIC0gIFVuaGFzaCAvcHJvYy88cGlkPiBlbnRyeSBmcm9tIHRoZSBkY2FjaGUuCisgKiBAcDogdGFzayB0aGF0IHNob3VsZCBiZSBmbHVzaGVkLgorICoKKyAqIERyb3BzIHRoZSAvcHJvYy88cGlkPiBkY2FjaGUgZW50cnkgZnJvbSB0aGUgaGFzaCBjaGFpbnMuCisgKgorICogRHJvcHBpbmcgL3Byb2MvPHBpZD4gZW50cmllcyBhbmQgZGV0YWNoX3BpZCBtdXN0IGJlIHN5bmNocm9uZW91cywKKyAqIG90aGVyd2lzZSBlLmcuIC9wcm9jLzxwaWQ+L2V4ZSBtaWdodCBwb2ludCB0byB0aGUgd3JvbmcgZXhlY3V0YWJsZSwKKyAqIGlmIHRoZSBwaWQgdmFsdWUgaXMgaW1tZWRpYXRlbHkgcmV1c2VkLiBUaGlzIGlzIGVuZm9yY2VkIGJ5CisgKiAtIGNhbGxlciBtdXN0IGFjcXVpcmUgc3Bpbl9sb2NrKHAtPnByb2NfbG9jaykKKyAqIC0gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGRldGFjaF9waWQoKQorICogLSBwcm9jX3BpZF9sb29rdXAgYWNxdWlyZXMgcHJvY19sb2NrLCBhbmQgY2hlY2tzIHRoYXQKKyAqICAgdGhlIHRhcmdldCBpcyBub3QgZGVhZCBieSBsb29raW5nIGF0IHRoZSBhdHRhY2ggY291bnQKKyAqICAgb2YgUElEVFlQRV9QSUQuCisgKi8KKworc3RydWN0IGRlbnRyeSAqcHJvY19waWRfdW5oYXNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpwcm9jX2RlbnRyeTsKKworCXByb2NfZGVudHJ5ID0gcC0+cHJvY19kZW50cnk7CisJaWYgKHByb2NfZGVudHJ5ICE9IE5VTEwpIHsKKworCQlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwkJc3Bpbl9sb2NrKCZwcm9jX2RlbnRyeS0+ZF9sb2NrKTsKKwkJaWYgKCFkX3VuaGFzaGVkKHByb2NfZGVudHJ5KSkgeworCQkJZGdldF9sb2NrZWQocHJvY19kZW50cnkpOworCQkJX19kX2Ryb3AocHJvY19kZW50cnkpOworCQkJc3Bpbl91bmxvY2soJnByb2NfZGVudHJ5LT5kX2xvY2spOworCQl9IGVsc2UgeworCQkJc3Bpbl91bmxvY2soJnByb2NfZGVudHJ5LT5kX2xvY2spOworCQkJcHJvY19kZW50cnkgPSBOVUxMOworCQl9CisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJfQorCXJldHVybiBwcm9jX2RlbnRyeTsKK30KKworLyoqCisgKiBwcm9jX3BpZF9mbHVzaCAtIHJlY292ZXIgbWVtb3J5IHVzZWQgYnkgc3RhbGUgL3Byb2MvPHBpZD4veCBlbnRyaWVzCisgKiBAcHJvY19lbnRyeTogZGlyZWN0b3kgdG8gcHJ1bmUuCisgKgorICogU2hyaW5rIHRoZSAvcHJvYyBkaXJlY3RvcnkgdGhhdCB3YXMgdXNlZCBieSB0aGUganVzdCBraWxsZWQgdGhyZWFkLgorICovCisJCit2b2lkIHByb2NfcGlkX2ZsdXNoKHN0cnVjdCBkZW50cnkgKnByb2NfZGVudHJ5KQoreworCW1pZ2h0X3NsZWVwKCk7CisJaWYocHJvY19kZW50cnkgIT0gTlVMTCkgeworCQlzaHJpbmtfZGNhY2hlX3BhcmVudChwcm9jX2RlbnRyeSk7CisJCWRwdXQocHJvY19kZW50cnkpOworCX0KK30KKworLyogU01QLXNhZmUgKi8KK3N0cnVjdCBkZW50cnkgKnByb2NfcGlkX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHByb2NfaW5vZGUgKmVpOworCXVuc2lnbmVkIHRnaWQ7CisJaW50IGRpZWQ7CisKKwlpZiAoZGVudHJ5LT5kX25hbWUubGVuID09IDQgJiYgIW1lbWNtcChkZW50cnktPmRfbmFtZS5uYW1lLCJzZWxmIiw0KSkgeworCQlpbm9kZSA9IG5ld19pbm9kZShkaXItPmlfc2IpOworCQlpZiAoIWlub2RlKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCWVpID0gUFJPQ19JKGlub2RlKTsKKwkJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCQlpbm9kZS0+aV9pbm8gPSBmYWtlX2lubygwLCBQUk9DX1RHSURfSU5PKTsKKwkJZWktPnBkZSA9IE5VTEw7CisJCWlub2RlLT5pX21vZGUgPSBTX0lGTE5LfFNfSVJXWFVHTzsKKwkJaW5vZGUtPmlfdWlkID0gaW5vZGUtPmlfZ2lkID0gMDsKKwkJaW5vZGUtPmlfc2l6ZSA9IDY0OworCQlpbm9kZS0+aV9vcCA9ICZwcm9jX3NlbGZfaW5vZGVfb3BlcmF0aW9uczsKKwkJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJCXJldHVybiBOVUxMOworCX0KKwl0Z2lkID0gbmFtZV90b19pbnQoZGVudHJ5KTsKKwlpZiAodGdpZCA9PSB+MFUpCisJCWdvdG8gb3V0OworCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwl0YXNrID0gZmluZF90YXNrX2J5X3BpZCh0Z2lkKTsKKwlpZiAodGFzaykKKwkJZ2V0X3Rhc2tfc3RydWN0KHRhc2spOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlpZiAoIXRhc2spCisJCWdvdG8gb3V0OworCisJaW5vZGUgPSBwcm9jX3BpZF9tYWtlX2lub2RlKGRpci0+aV9zYiwgdGFzaywgUFJPQ19UR0lEX0lOTyk7CisKKworCWlmICghaW5vZGUpIHsKKwkJcHV0X3Rhc2tfc3RydWN0KHRhc2spOworCQlnb3RvIG91dDsKKwl9CisJaW5vZGUtPmlfbW9kZSA9IFNfSUZESVJ8U19JUlVHT3xTX0lYVUdPOworCWlub2RlLT5pX29wID0gJnByb2NfdGdpZF9iYXNlX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJnByb2NfdGdpZF9iYXNlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfbmxpbmsgPSAzOworCWlub2RlLT5pX2ZsYWdzfD1TX0lNTVVUQUJMRTsKKworCWRlbnRyeS0+ZF9vcCA9ICZwaWRfYmFzZV9kZW50cnlfb3BlcmF0aW9uczsKKworCWRpZWQgPSAwOworCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCXNwaW5fbG9jaygmdGFzay0+cHJvY19sb2NrKTsKKwl0YXNrLT5wcm9jX2RlbnRyeSA9IGRlbnRyeTsKKwlpZiAoIXBpZF9hbGl2ZSh0YXNrKSkgeworCQlkZW50cnkgPSBwcm9jX3BpZF91bmhhc2godGFzayk7CisJCWRpZWQgPSAxOworCX0KKwlzcGluX3VubG9jaygmdGFzay0+cHJvY19sb2NrKTsKKworCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKKwlpZiAoZGllZCkgeworCQlwcm9jX3BpZF9mbHVzaChkZW50cnkpOworCQlnb3RvIG91dDsKKwl9CisJcmV0dXJuIE5VTEw7CitvdXQ6CisJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7Cit9CisKKy8qIFNNUC1zYWZlICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqcHJvY190YXNrX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqbGVhZGVyID0gcHJvY190YXNrKGRpcik7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwl1bnNpZ25lZCB0aWQ7CisKKwl0aWQgPSBuYW1lX3RvX2ludChkZW50cnkpOworCWlmICh0aWQgPT0gfjBVKQorCQlnb3RvIG91dDsKKworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJdGFzayA9IGZpbmRfdGFza19ieV9waWQodGlkKTsKKwlpZiAodGFzaykKKwkJZ2V0X3Rhc2tfc3RydWN0KHRhc2spOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlpZiAoIXRhc2spCisJCWdvdG8gb3V0OworCWlmIChsZWFkZXItPnRnaWQgIT0gdGFzay0+dGdpZCkKKwkJZ290byBvdXRfZHJvcF90YXNrOworCisJaW5vZGUgPSBwcm9jX3BpZF9tYWtlX2lub2RlKGRpci0+aV9zYiwgdGFzaywgUFJPQ19USURfSU5PKTsKKworCisJaWYgKCFpbm9kZSkKKwkJZ290byBvdXRfZHJvcF90YXNrOworCWlub2RlLT5pX21vZGUgPSBTX0lGRElSfFNfSVJVR098U19JWFVHTzsKKwlpbm9kZS0+aV9vcCA9ICZwcm9jX3RpZF9iYXNlX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJnByb2NfdGlkX2Jhc2Vfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9ubGluayA9IDM7CisJaW5vZGUtPmlfZmxhZ3N8PVNfSU1NVVRBQkxFOworCisJZGVudHJ5LT5kX29wID0gJnBpZF9iYXNlX2RlbnRyeV9vcGVyYXRpb25zOworCisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisKKwlwdXRfdGFza19zdHJ1Y3QodGFzayk7CisJcmV0dXJuIE5VTEw7CitvdXRfZHJvcF90YXNrOgorCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKK291dDoKKwlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKK30KKworI2RlZmluZSBQUk9DX05VTUJVRiAxMAorI2RlZmluZSBQUk9DX01BWFBJRFMgMjAKKworLyoKKyAqIEdldCBhIGZldyB0Z2lkJ3MgdG8gcmV0dXJuIGZvciBmaWxsZGlyIC0gd2UgbmVlZCB0byBob2xkIHRoZQorICogdGFza2xpc3QgbG9jayB3aGlsZSBkb2luZyB0aGlzLCBhbmQgd2UgbXVzdCByZWxlYXNlIGl0IGJlZm9yZQorICogd2UgYWN0dWFsbHkgZG8gdGhlIGZpbGxkaXIgaXRzZWxmLCBzbyB3ZSB1c2UgYSB0ZW1wIGJ1ZmZlci4uCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3RnaWRfbGlzdChpbnQgaW5kZXgsIHVuc2lnbmVkIGxvbmcgdmVyc2lvbiwgdW5zaWduZWQgaW50ICp0Z2lkcykKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CisJaW50IG5yX3RnaWRzID0gMDsKKworCWluZGV4LS07CisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlwID0gTlVMTDsKKwlpZiAodmVyc2lvbikgeworCQlwID0gZmluZF90YXNrX2J5X3BpZCh2ZXJzaW9uKTsKKwkJaWYgKHAgJiYgIXRocmVhZF9ncm91cF9sZWFkZXIocCkpCisJCQlwID0gTlVMTDsKKwl9CisKKwlpZiAocCkKKwkJaW5kZXggPSAwOworCWVsc2UKKwkJcCA9IG5leHRfdGFzaygmaW5pdF90YXNrKTsKKworCWZvciAoIDsgcCAhPSAmaW5pdF90YXNrOyBwID0gbmV4dF90YXNrKHApKSB7CisJCWludCB0Z2lkID0gcC0+cGlkOworCQlpZiAoIXBpZF9hbGl2ZShwKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoLS1pbmRleCA+PSAwKQorCQkJY29udGludWU7CisJCXRnaWRzW25yX3RnaWRzXSA9IHRnaWQ7CisJCW5yX3RnaWRzKys7CisJCWlmIChucl90Z2lkcyA+PSBQUk9DX01BWFBJRFMpCisJCQlicmVhazsKKwl9CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCXJldHVybiBucl90Z2lkczsKK30KKworLyoKKyAqIEdldCBhIGZldyB0aWQncyB0byByZXR1cm4gZm9yIGZpbGxkaXIgLSB3ZSBuZWVkIHRvIGhvbGQgdGhlCisgKiB0YXNrbGlzdCBsb2NrIHdoaWxlIGRvaW5nIHRoaXMsIGFuZCB3ZSBtdXN0IHJlbGVhc2UgaXQgYmVmb3JlCisgKiB3ZSBhY3R1YWxseSBkbyB0aGUgZmlsbGRpciBpdHNlbGYsIHNvIHdlIHVzZSBhIHRlbXAgYnVmZmVyLi4KKyAqLworc3RhdGljIGludCBnZXRfdGlkX2xpc3QoaW50IGluZGV4LCB1bnNpZ25lZCBpbnQgKnRpZHMsIHN0cnVjdCBpbm9kZSAqZGlyKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqbGVhZGVyX3Rhc2sgPSBwcm9jX3Rhc2soZGlyKTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBsZWFkZXJfdGFzazsKKwlpbnQgbnJfdGlkcyA9IDA7CisKKwlpbmRleCAtPSAyOworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJLyoKKwkgKiBUaGUgc3RhcnRpbmcgcG9pbnQgdGFzayAobGVhZGVyX3Rhc2spIG1pZ2h0IGJlIGFuIGFscmVhZHkKKwkgKiB1bmxpbmtlZCB0YXNrLCB3aGljaCBjYW5ub3QgYmUgdXNlZCB0byBhY2Nlc3MgdGhlIHRhc2stbGlzdAorCSAqIHZpYSBuZXh0X3RocmVhZCgpLgorCSAqLworCWlmIChwaWRfYWxpdmUodGFzaykpIGRvIHsKKwkJaW50IHRpZCA9IHRhc2stPnBpZDsKKworCQlpZiAoLS1pbmRleCA+PSAwKQorCQkJY29udGludWU7CisJCXRpZHNbbnJfdGlkc10gPSB0aWQ7CisJCW5yX3RpZHMrKzsKKwkJaWYgKG5yX3RpZHMgPj0gUFJPQ19NQVhQSURTKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoKHRhc2sgPSBuZXh0X3RocmVhZCh0YXNrKSkgIT0gbGVhZGVyX3Rhc2spOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlyZXR1cm4gbnJfdGlkczsKK30KKworLyogZm9yIHRoZSAvcHJvYy8gZGlyZWN0b3J5IGl0c2VsZiwgYWZ0ZXIgbm9uLXByb2Nlc3Mgc3R1ZmYgaGFzIGJlZW4gZG9uZSAqLworaW50IHByb2NfcGlkX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwl1bnNpZ25lZCBpbnQgdGdpZF9hcnJheVtQUk9DX01BWFBJRFNdOworCWNoYXIgYnVmW1BST0NfTlVNQlVGXTsKKwl1bnNpZ25lZCBpbnQgbnIgPSBmaWxwLT5mX3BvcyAtIEZJUlNUX1BST0NFU1NfRU5UUlk7CisJdW5zaWduZWQgaW50IG5yX3RnaWRzLCBpOworCWludCBuZXh0X3RnaWQ7CisKKwlpZiAoIW5yKSB7CisJCWlub190IGlubyA9IGZha2VfaW5vKDAsUFJPQ19UR0lEX0lOTyk7CisJCWlmIChmaWxsZGlyKGRpcmVudCwgInNlbGYiLCA0LCBmaWxwLT5mX3BvcywgaW5vLCBEVF9MTkspIDwgMCkKKwkJCXJldHVybiAwOworCQlmaWxwLT5mX3BvcysrOworCQlucisrOworCX0KKworCS8qIGZfdmVyc2lvbiBjYWNoZXMgdGhlIHRnaWQgdmFsdWUgdGhhdCB0aGUgbGFzdCByZWFkZGlyIGNhbGwgY291bGRuJ3QKKwkgKiByZXR1cm4uIGxzZWVrIGFrYSB0ZWxsZGlyIGF1dG9tYWdpY2FsbHkgcmVzZXRzIGZfdmVyc2lvbiB0byAwLgorCSAqLworCW5leHRfdGdpZCA9IGZpbHAtPmZfdmVyc2lvbjsKKwlmaWxwLT5mX3ZlcnNpb24gPSAwOworCWZvciAoOzspIHsKKwkJbnJfdGdpZHMgPSBnZXRfdGdpZF9saXN0KG5yLCBuZXh0X3RnaWQsIHRnaWRfYXJyYXkpOworCQlpZiAoIW5yX3RnaWRzKSB7CisJCQkvKiBubyBtb3JlIGVudHJpZXMgISAqLworCQkJYnJlYWs7CisJCX0KKwkJbmV4dF90Z2lkID0gMDsKKworCQkvKiBkbyBub3QgdXNlIHRoZSBsYXN0IGZvdW5kIHBpZCwgcmVzZXJ2ZSBpdCBmb3IgbmV4dF90Z2lkICovCisJCWlmIChucl90Z2lkcyA9PSBQUk9DX01BWFBJRFMpIHsKKwkJCW5yX3RnaWRzLS07CisJCQluZXh0X3RnaWQgPSB0Z2lkX2FycmF5W25yX3RnaWRzXTsKKwkJfQorCisJCWZvciAoaT0wO2k8bnJfdGdpZHM7aSsrKSB7CisJCQlpbnQgdGdpZCA9IHRnaWRfYXJyYXlbaV07CisJCQlpbm9fdCBpbm8gPSBmYWtlX2lubyh0Z2lkLFBST0NfVEdJRF9JTk8pOworCQkJdW5zaWduZWQgbG9uZyBqID0gUFJPQ19OVU1CVUY7CisKKwkJCWRvCisJCQkJYnVmWy0tal0gPSAnMCcgKyAodGdpZCAlIDEwKTsKKwkJCXdoaWxlICgodGdpZCAvPSAxMCkgIT0gMCk7CisKKwkJCWlmIChmaWxsZGlyKGRpcmVudCwgYnVmK2osIFBST0NfTlVNQlVGLWosIGZpbHAtPmZfcG9zLCBpbm8sIERUX0RJUikgPCAwKSB7CisJCQkJLyogcmV0dXJuaW5nIHRoaXMgdGdpZCBmYWlsZWQsIHNhdmUgaXQgYXMgdGhlIGZpcnN0CisJCQkJICogcGlkIGZvciB0aGUgbmV4dCByZWFkaXIgY2FsbCAqLworCQkJCWZpbHAtPmZfdmVyc2lvbiA9IHRnaWRfYXJyYXlbaV07CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlmaWxwLT5mX3BvcysrOworCQkJbnIrKzsKKwkJfQorCX0KK291dDoKKwlyZXR1cm4gMDsKK30KKworLyogZm9yIHRoZSAvcHJvYy9UR0lEL3Rhc2svIGRpcmVjdG9yaWVzICovCitzdGF0aWMgaW50IHByb2NfdGFza19yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJdW5zaWduZWQgaW50IHRpZF9hcnJheVtQUk9DX01BWFBJRFNdOworCWNoYXIgYnVmW1BST0NfTlVNQlVGXTsKKwl1bnNpZ25lZCBpbnQgbnJfdGlkcywgaTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCByZXR2YWwgPSAtRU5PRU5UOworCWlub190IGlubzsKKwl1bnNpZ25lZCBsb25nIHBvcyA9IGZpbHAtPmZfcG9zOyAgLyogYXZvaWRpbmcgImxvbmcgbG9uZyIgZmlscC0+Zl9wb3MgKi8KKworCWlmICghcGlkX2FsaXZlKHByb2NfdGFzayhpbm9kZSkpKQorCQlnb3RvIG91dDsKKwlyZXR2YWwgPSAwOworCisJc3dpdGNoIChwb3MpIHsKKwljYXNlIDA6CisJCWlubyA9IGlub2RlLT5pX2lubzsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIHBvcywgaW5vLCBEVF9ESVIpIDwgMCkKKwkJCWdvdG8gb3V0OworCQlwb3MrKzsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAxOgorCQlpbm8gPSBwYXJlbnRfaW5vKGRlbnRyeSk7CisJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgcG9zLCBpbm8sIERUX0RJUikgPCAwKQorCQkJZ290byBvdXQ7CisJCXBvcysrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwl9CisKKwlucl90aWRzID0gZ2V0X3RpZF9saXN0KHBvcywgdGlkX2FycmF5LCBpbm9kZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfdGlkczsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgaiA9IFBST0NfTlVNQlVGOworCQlpbnQgdGlkID0gdGlkX2FycmF5W2ldOworCisJCWlubyA9IGZha2VfaW5vKHRpZCxQUk9DX1RJRF9JTk8pOworCisJCWRvCisJCQlidWZbLS1qXSA9ICcwJyArICh0aWQgJSAxMCk7CisJCXdoaWxlICgodGlkIC89IDEwKSAhPSAwKTsKKworCQlpZiAoZmlsbGRpcihkaXJlbnQsIGJ1ZitqLCBQUk9DX05VTUJVRi1qLCBwb3MsIGlubywgRFRfRElSKSA8IDApCisJCQlicmVhazsKKwkJcG9zKys7CisJfQorb3V0OgorCWZpbHAtPmZfcG9zID0gcG9zOworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9mcy9wcm9jL2dlbmVyaWMuYyBiL2ZzL3Byb2MvZ2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNjMxNWQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wcm9jL2dlbmVyaWMuYwpAQCAtMCwwICsxLDcwNSBAQAorLyoKKyAqIHByb2MvZnMvZ2VuZXJpYy5jIC0tLSBnZW5lcmljIHJvdXRpbmVzIGZvciB0aGUgcHJvYy1mcworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBnZW5lcmljIHByb2MtZnMgcm91dGluZXMgZm9yIGhhbmRsaW5nCisgKiBkaXJlY3RvcmllcyBhbmQgZmlsZXMuCisgKiAKKyAqIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcy4KKyAqIENvcHlyaWdodCAoQykgMTk5NyBUaGVvZG9yZSBUcydvCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBzc2l6ZV90IHByb2NfZmlsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICAgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBzc2l6ZV90IHByb2NfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgbG9mZl90IHByb2NfZmlsZV9sc2VlayhzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGludCk7CisKK2ludCBwcm9jX21hdGNoKGludCBsZW4sIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGUpCit7CisJaWYgKGRlLT5uYW1lbGVuICE9IGxlbikKKwkJcmV0dXJuIDA7CisJcmV0dXJuICFtZW1jbXAobmFtZSwgZGUtPm5hbWUsIGxlbik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfZmlsZV9vcGVyYXRpb25zID0geworCS5sbHNlZWsJCT0gcHJvY19maWxlX2xzZWVrLAorCS5yZWFkCQk9IHByb2NfZmlsZV9yZWFkLAorCS53cml0ZQkJPSBwcm9jX2ZpbGVfd3JpdGUsCit9OworCisvKiBidWZmZXIgc2l6ZSBpcyBvbmUgcGFnZSBidXQgb3VyIG91dHB1dCByb3V0aW5lcyB1c2Ugc29tZSBzbGFjayBmb3Igb3ZlcnJ1bnMgKi8KKyNkZWZpbmUgUFJPQ19CTE9DS19TSVpFCShQQUdFX1NJWkUgLSAxMDI0KQorCitzdGF0aWMgc3NpemVfdAorcHJvY19maWxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsCisJICAgICAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWNoYXIgCSpwYWdlOworCXNzaXplX3QJcmV0dmFsPTA7CisJaW50CWVvZj0wOworCXNzaXplX3QJbiwgY291bnQ7CisJY2hhcgkqc3RhcnQ7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICogZHA7CisKKwlkcCA9IFBERShpbm9kZSk7CisJaWYgKCEocGFnZSA9IChjaGFyKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3aGlsZSAoKG5ieXRlcyA+IDApICYmICFlb2YpIHsKKwkJY291bnQgPSBtaW5fdChzaXplX3QsIFBST0NfQkxPQ0tfU0laRSwgbmJ5dGVzKTsKKworCQlzdGFydCA9IE5VTEw7CisJCWlmIChkcC0+Z2V0X2luZm8pIHsKKwkJCS8qIEhhbmRsZSBvbGQgbmV0IHJvdXRpbmVzICovCisJCQluID0gZHAtPmdldF9pbmZvKHBhZ2UsICZzdGFydCwgKnBwb3MsIGNvdW50KTsKKwkJCWlmIChuIDwgY291bnQpCisJCQkJZW9mID0gMTsKKwkJfSBlbHNlIGlmIChkcC0+cmVhZF9wcm9jKSB7CisJCQkvKgorCQkJICogSG93IHRvIGJlIGEgcHJvYyByZWFkIGZ1bmN0aW9uCisJCQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCSAqIFByb3RvdHlwZToKKwkJCSAqICAgIGludCBmKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkgKiAgICAgICAgICBpbnQgY291bnQsIGludCAqcGVvZiwgdm9pZCAqZGF0KQorCQkJICoKKwkJCSAqIEFzc3VtZSB0aGF0IHRoZSBidWZmZXIgaXMgImNvdW50IiBieXRlcyBpbiBzaXplLgorCQkJICoKKwkJCSAqIElmIHlvdSBrbm93IHlvdSBoYXZlIHN1cHBsaWVkIGFsbCB0aGUgZGF0YSB5b3UKKwkJCSAqIGhhdmUsIHNldCAqcGVvZi4KKwkJCSAqCisJCQkgKiBZb3UgaGF2ZSB0aHJlZSB3YXlzIHRvIHJldHVybiBkYXRhOgorCQkJICogMCkgTGVhdmUgKnN0YXJ0ID0gTlVMTC4gIChUaGlzIGlzIHRoZSBkZWZhdWx0LikKKwkJCSAqICAgIFB1dCB0aGUgZGF0YSBvZiB0aGUgcmVxdWVzdGVkIG9mZnNldCBhdCB0aGF0CisJCQkgKiAgICBvZmZzZXQgd2l0aGluIHRoZSBidWZmZXIuICBSZXR1cm4gdGhlIG51bWJlciAobikKKwkJCSAqICAgIG9mIGJ5dGVzIHRoZXJlIGFyZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisJCQkgKiAgICBidWZmZXIgdXAgdG8gdGhlIGxhc3QgYnl0ZSBvZiBkYXRhLiAgSWYgdGhlCisJCQkgKiAgICBudW1iZXIgb2Ygc3VwcGxpZWQgYnl0ZXMgKD0gbiAtIG9mZnNldCkgaXMgCisJCQkgKiAgICBncmVhdGVyIHRoYW4gemVybyBhbmQgeW91IGRpZG4ndCBzaWduYWwgZW9mCisJCQkgKiAgICBhbmQgdGhlIHJlYWRlciBpcyBwcmVwYXJlZCB0byB0YWtlIG1vcmUgZGF0YQorCQkJICogICAgeW91IHdpbGwgYmUgY2FsbGVkIGFnYWluIHdpdGggdGhlIHJlcXVlc3RlZAorCQkJICogICAgb2Zmc2V0IGFkdmFuY2VkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgCisJCQkgKiAgICBhYnNvcmJlZC4gIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWZ1bCBmb3IgZmlsZXMKKwkJCSAqICAgIG5vIGxhcmdlciB0aGFuIHRoZSBidWZmZXIuCisJCQkgKiAxKSBTZXQgKnN0YXJ0ID0gYW4gdW5zaWduZWQgbG9uZyB2YWx1ZSBsZXNzIHRoYW4KKwkJCSAqICAgIHRoZSBidWZmZXIgYWRkcmVzcyBidXQgZ3JlYXRlciB0aGFuIHplcm8uCisJCQkgKiAgICBQdXQgdGhlIGRhdGEgb2YgdGhlIHJlcXVlc3RlZCBvZmZzZXQgYXQgdGhlCisJCQkgKiAgICBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4gIFJldHVybiB0aGUgbnVtYmVyIG9mCisJCQkgKiAgICBieXRlcyBvZiBkYXRhIHBsYWNlZCB0aGVyZS4gIElmIHRoaXMgbnVtYmVyIGlzCisJCQkgKiAgICBncmVhdGVyIHRoYW4gemVybyBhbmQgeW91IGRpZG4ndCBzaWduYWwgZW9mCisJCQkgKiAgICBhbmQgdGhlIHJlYWRlciBpcyBwcmVwYXJlZCB0byB0YWtlIG1vcmUgZGF0YQorCQkJICogICAgeW91IHdpbGwgYmUgY2FsbGVkIGFnYWluIHdpdGggdGhlIHJlcXVlc3RlZAorCQkJICogICAgb2Zmc2V0IGFkdmFuY2VkIGJ5ICpzdGFydC4gIFRoaXMgaW50ZXJmYWNlIGlzCisJCQkgKiAgICB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhIGxhcmdlIGZpbGUgY29uc2lzdGluZworCQkJICogICAgb2YgYSBzZXJpZXMgb2YgYmxvY2tzIHdoaWNoIHlvdSB3YW50IHRvIGNvdW50CisJCQkgKiAgICBhbmQgcmV0dXJuIGFzIHdob2xlcy4KKwkJCSAqICAgIChIYWNrIGJ5IFBhdWwuUnVzc2VsbEBydXN0Y29ycC5jb20uYXUpCisJCQkgKiAyKSBTZXQgKnN0YXJ0ID0gYW4gYWRkcmVzcyB3aXRoaW4gdGhlIGJ1ZmZlci4KKwkJCSAqICAgIFB1dCB0aGUgZGF0YSBvZiB0aGUgcmVxdWVzdGVkIG9mZnNldCBhdCAqc3RhcnQuCisJCQkgKiAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHBsYWNlZCB0aGVyZS4KKwkJCSAqICAgIElmIHRoaXMgbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCB5b3UKKwkJCSAqICAgIGRpZG4ndCBzaWduYWwgZW9mIGFuZCB0aGUgcmVhZGVyIGlzIHByZXBhcmVkIHRvCisJCQkgKiAgICB0YWtlIG1vcmUgZGF0YSB5b3Ugd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aCB0aGUKKwkJCSAqICAgIHJlcXVlc3RlZCBvZmZzZXQgYWR2YW5jZWQgYnkgdGhlIG51bWJlciBvZiBieXRlcworCQkJICogICAgYWJzb3JiZWQuCisJCQkgKi8KKwkJCW4gPSBkcC0+cmVhZF9wcm9jKHBhZ2UsICZzdGFydCwgKnBwb3MsCisJCQkJCSAgY291bnQsICZlb2YsIGRwLT5kYXRhKTsKKwkJfSBlbHNlCisJCQlicmVhazsKKworCQlpZiAobiA9PSAwKSAgIC8qIGVuZCBvZiBmaWxlICovCisJCQlicmVhazsKKwkJaWYgKG4gPCAwKSB7ICAvKiBlcnJvciAqLworCQkJaWYgKHJldHZhbCA9PSAwKQorCQkJCXJldHZhbCA9IG47CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzdGFydCA9PSBOVUxMKSB7CisJCQlpZiAobiA+IFBBR0VfU0laRSkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAicHJvY19maWxlX3JlYWQ6IEFwcGFyZW50IGJ1ZmZlciBvdmVyZmxvdyFcbiIpOworCQkJCW4gPSBQQUdFX1NJWkU7CisJCQl9CisJCQluIC09ICpwcG9zOworCQkJaWYgKG4gPD0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChuID4gY291bnQpCisJCQkJbiA9IGNvdW50OworCQkJc3RhcnQgPSBwYWdlICsgKnBwb3M7CisJCX0gZWxzZSBpZiAoc3RhcnQgPCBwYWdlKSB7CisJCQlpZiAobiA+IFBBR0VfU0laRSkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAicHJvY19maWxlX3JlYWQ6IEFwcGFyZW50IGJ1ZmZlciBvdmVyZmxvdyFcbiIpOworCQkJCW4gPSBQQUdFX1NJWkU7CisJCQl9CisJCQlpZiAobiA+IGNvdW50KSB7CisJCQkJLyoKKwkJCQkgKiBEb24ndCByZWR1Y2UgbiBiZWNhdXNlIGRvaW5nIHNvIG1pZ2h0CisJCQkJICogY3V0IG9mZiBwYXJ0IG9mIGEgZGF0YSBibG9jay4KKwkJCQkgKi8KKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJwcm9jX2ZpbGVfcmVhZDogUmVhZCBjb3VudCBleGNlZWRlZFxuIik7CisJCQl9CisJCX0gZWxzZSAvKiBzdGFydCA+PSBwYWdlICovIHsKKwkJCXVuc2lnbmVkIGxvbmcgc3RhcnRvZmYgPSAodW5zaWduZWQgbG9uZykoc3RhcnQgLSBwYWdlKTsKKwkJCWlmIChuID4gKFBBR0VfU0laRSAtIHN0YXJ0b2ZmKSkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAicHJvY19maWxlX3JlYWQ6IEFwcGFyZW50IGJ1ZmZlciBvdmVyZmxvdyFcbiIpOworCQkJCW4gPSBQQUdFX1NJWkUgLSBzdGFydG9mZjsKKwkJCX0KKwkJCWlmIChuID4gY291bnQpCisJCQkJbiA9IGNvdW50OworCQl9CisJCQorIAkJbiAtPSBjb3B5X3RvX3VzZXIoYnVmLCBzdGFydCA8IHBhZ2UgPyBwYWdlIDogc3RhcnQsIG4pOworCQlpZiAobiA9PSAwKSB7CisJCQlpZiAocmV0dmFsID09IDApCisJCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJKnBwb3MgKz0gc3RhcnQgPCBwYWdlID8gKHVuc2lnbmVkIGxvbmcpc3RhcnQgOiBuOworCQluYnl0ZXMgLT0gbjsKKwkJYnVmICs9IG47CisJCXJldHZhbCArPSBuOworCX0KKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBhZ2UpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBzc2l6ZV90Citwcm9jX2ZpbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiBkcDsKKwkKKwlkcCA9IFBERShpbm9kZSk7CisKKwlpZiAoIWRwLT53cml0ZV9wcm9jKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIEZJWE1FOiBkb2VzIHRoaXMgcm91dGluZSBuZWVkIHBwb3M/ICBwcm9iYWJseS4uLiAqLworCXJldHVybiBkcC0+d3JpdGVfcHJvYyhmaWxlLCBidWZmZXIsIGNvdW50LCBkcC0+ZGF0YSk7Cit9CisKKworc3RhdGljIGxvZmZfdAorcHJvY19maWxlX2xzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZykKK3sKKyAgICBsb2NrX2tlcm5lbCgpOworCisgICAgc3dpdGNoIChvcmlnKSB7CisgICAgY2FzZSAwOgorCWlmIChvZmZzZXQgPCAwKQorCSAgICBnb3RvIG91dDsKKwlmaWxlLT5mX3BvcyA9IG9mZnNldDsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuKGZpbGUtPmZfcG9zKTsKKyAgICBjYXNlIDE6CisJaWYgKG9mZnNldCArIGZpbGUtPmZfcG9zIDwgMCkKKwkgICAgZ290byBvdXQ7CisJZmlsZS0+Zl9wb3MgKz0gb2Zmc2V0OworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4oZmlsZS0+Zl9wb3MpOworICAgIGNhc2UgMjoKKwlnb3RvIG91dDsKKyAgICBkZWZhdWx0OgorCWdvdG8gb3V0OworICAgIH0KKworb3V0OgorICAgIHVubG9ja19rZXJuZWwoKTsKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBwcm9jX25vdGlmeV9jaGFuZ2Uoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmlhdHRyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSA9IFBERShpbm9kZSk7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGlhdHRyKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSBpbm9kZV9zZXRhdHRyKGlub2RlLCBpYXR0cik7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKwkKKwlkZS0+dWlkID0gaW5vZGUtPmlfdWlkOworCWRlLT5naWQgPSBpbm9kZS0+aV9naWQ7CisJZGUtPm1vZGUgPSBpbm9kZS0+aV9tb2RlOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHByb2NfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0geworCS5zZXRhdHRyCT0gcHJvY19ub3RpZnlfY2hhbmdlLAorfTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGEgbmFtZSBzdWNoIGFzICJ0dHkvZHJpdmVyL3NlcmlhbCIsIGFuZAorICogcmV0dXJucyB0aGUgc3RydWN0IHByb2NfZGlyX2VudHJ5IGZvciAiL3Byb2MvdHR5L2RyaXZlciIsIGFuZAorICogcmV0dXJucyAic2VyaWFsIiBpbiByZXNpZHVhbC4KKyAqLworc3RhdGljIGludCB4bGF0ZV9wcm9jX25hbWUoY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKnJldCwgY29uc3QgY2hhciAqKnJlc2lkdWFsKQoreworCWNvbnN0IGNoYXIgICAgIAkJKmNwID0gbmFtZSwgKm5leHQ7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5CSpkZTsKKwlpbnQJCQlsZW47CisKKwlkZSA9ICZwcm9jX3Jvb3Q7CisJd2hpbGUgKDEpIHsKKwkJbmV4dCA9IHN0cmNocihjcCwgJy8nKTsKKwkJaWYgKCFuZXh0KQorCQkJYnJlYWs7CisKKwkJbGVuID0gbmV4dCAtIGNwOworCQlmb3IgKGRlID0gZGUtPnN1YmRpcjsgZGUgOyBkZSA9IGRlLT5uZXh0KSB7CisJCQlpZiAocHJvY19tYXRjaChsZW4sIGNwLCBkZSkpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFkZSkKKwkJCXJldHVybiAtRU5PRU5UOworCQljcCArPSBsZW4gKyAxOworCX0KKwkqcmVzaWR1YWwgPSBjcDsKKwkqcmV0ID0gZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBERUZJTkVfSURSKHByb2NfaW51bV9pZHIpOworc3RhdGljIERFRklORV9TUElOTE9DSyhwcm9jX2ludW1fbG9jayk7IC8qIHByb3RlY3RzIHRoZSBhYm92ZSAqLworCisjZGVmaW5lIFBST0NfRFlOQU1JQ19GSVJTVCAweEYwMDAwMDAwVUwKKworLyoKKyAqIFJldHVybiBhbiBpbm9kZSBudW1iZXIgYmV0d2VlbiBQUk9DX0RZTkFNSUNfRklSU1QgYW5kCisgKiAweGZmZmZmZmZmLCBvciB6ZXJvIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2lub2RlX251bWJlcih2b2lkKQoreworCWludCBpLCBpbnVtID0gMDsKKwlpbnQgZXJyb3I7CisKK3JldHJ5OgorCWlmIChpZHJfcHJlX2dldCgmcHJvY19pbnVtX2lkciwgR0ZQX0tFUk5FTCkgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2soJnByb2NfaW51bV9sb2NrKTsKKwllcnJvciA9IGlkcl9nZXRfbmV3KCZwcm9jX2ludW1faWRyLCBOVUxMLCAmaSk7CisJc3Bpbl91bmxvY2soJnByb2NfaW51bV9sb2NrKTsKKwlpZiAoZXJyb3IgPT0gLUVBR0FJTikKKwkJZ290byByZXRyeTsKKwllbHNlIGlmIChlcnJvcikKKwkJcmV0dXJuIDA7CisKKwlpbnVtID0gKGkgJiBNQVhfSURfTUFTSykgKyBQUk9DX0RZTkFNSUNfRklSU1Q7CisKKwkvKiBpbnVtIHdpbGwgbmV2ZXIgYmUgbW9yZSB0aGFuIDB4ZjBmZmZmZmYsIHNvIG5vIGNoZWNrCisJICogZm9yIG92ZXJmbG93LgorCSAqLworCisJcmV0dXJuIGludW07Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfaW5vZGVfbnVtYmVyKHVuc2lnbmVkIGludCBpbnVtKQoreworCWludCBpZCA9IChpbnVtIC0gUFJPQ19EWU5BTUlDX0ZJUlNUKSB8IH5NQVhfSURfTUFTSzsKKworCXNwaW5fbG9jaygmcHJvY19pbnVtX2xvY2spOworCWlkcl9yZW1vdmUoJnByb2NfaW51bV9pZHIsIGlkKTsKKwlzcGluX3VubG9jaygmcHJvY19pbnVtX2xvY2spOworfQorCitzdGF0aWMgaW50IHByb2NfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwluZF9zZXRfbGluayhuZCwgUERFKGRlbnRyeS0+ZF9pbm9kZSktPmRhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcHJvY19saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBwcm9jX2ZvbGxvd19saW5rLAorfTsKKworLyoKKyAqIEFzIHNvbWUgZW50cmllcyBpbiAvcHJvYyBhcmUgdm9sYXRpbGUsIHdlIHdhbnQgdG8gCisgKiBnZXQgcmlkIG9mIHVudXNlZCBkZW50cmllcy4gIFRoaXMgY291bGQgYmUgbWFkZSAKKyAqIHNtYXJ0ZXI6IHdlIGNvdWxkIGtlZXAgYSAidm9sYXRpbGUiIGZsYWcgaW4gdGhlIAorICogaW5vZGUgdG8gaW5kaWNhdGUgd2hpY2ggb25lcyB0byBrZWVwLgorICovCitzdGF0aWMgaW50IHByb2NfZGVsZXRlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5KQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIHByb2NfZGVudHJ5X29wZXJhdGlvbnMgPQoreworCS5kX2RlbGV0ZQk9IHByb2NfZGVsZXRlX2RlbnRyeSwKK307CisKKy8qCisgKiBEb24ndCBjcmVhdGUgbmVnYXRpdmUgZGVudHJpZXMgaGVyZSwgcmV0dXJuIC1FTk9FTlQgYnkgaGFuZAorICogaW5zdGVhZC4KKyAqLworc3RydWN0IGRlbnRyeSAqcHJvY19sb29rdXAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqIGRlOworCWludCBlcnJvciA9IC1FTk9FTlQ7CisKKwlsb2NrX2tlcm5lbCgpOworCWRlID0gUERFKGRpcik7CisJaWYgKGRlKSB7CisJCWZvciAoZGUgPSBkZS0+c3ViZGlyOyBkZSA7IGRlID0gZGUtPm5leHQpIHsKKwkJCWlmIChkZS0+bmFtZWxlbiAhPSBkZW50cnktPmRfbmFtZS5sZW4pCisJCQkJY29udGludWU7CisJCQlpZiAoIW1lbWNtcChkZW50cnktPmRfbmFtZS5uYW1lLCBkZS0+bmFtZSwgZGUtPm5hbWVsZW4pKSB7CisJCQkJdW5zaWduZWQgaW50IGlubyA9IGRlLT5sb3dfaW5vOworCisJCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJCWlub2RlID0gcHJvY19nZXRfaW5vZGUoZGlyLT5pX3NiLCBpbm8sIGRlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwl1bmxvY2tfa2VybmVsKCk7CisKKwlpZiAoaW5vZGUpIHsKKwkJZGVudHJ5LT5kX29wID0gJnByb2NfZGVudHJ5X29wZXJhdGlvbnM7CisJCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworfQorCisvKgorICogVGhpcyByZXR1cm5zIG5vbi16ZXJvIGlmIGF0IEVPRiwgc28gdGhhdCB0aGUgL3Byb2MKKyAqIHJvb3QgZGlyZWN0b3J5IGNhbiB1c2UgdGhpcyBhbmQgY2hlY2sgaWYgaXQgc2hvdWxkCisgKiBjb250aW51ZSB3aXRoIHRoZSA8cGlkPiBlbnRyaWVzLi4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIFZGUy1sYXllciBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIHJldHVybgorICogdmFsdWUgb2YgdGhlIHJlYWRkaXIoKSBjYWxsLCBhcyBsb25nIGFzIGl0J3Mgbm9uLW5lZ2F0aXZlCisgKiBmb3Igc3VjY2Vzcy4uCisgKi8KK2ludCBwcm9jX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLAorCXZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqIGRlOworCXVuc2lnbmVkIGludCBpbm87CisJaW50IGk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCWludCByZXQgPSAwOworCisJbG9ja19rZXJuZWwoKTsKKworCWlubyA9IGlub2RlLT5pX2lubzsKKwlkZSA9IFBERShpbm9kZSk7CisJaWYgKCFkZSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaSA9IGZpbHAtPmZfcG9zOworCXN3aXRjaCAoaSkgeworCQljYXNlIDA6CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgaSwgaW5vLCBEVF9ESVIpIDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWkrKzsKKwkJCWZpbHAtPmZfcG9zKys7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSAxOgorCQkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLi4iLCAyLCBpLAorCQkJCSAgICBwYXJlbnRfaW5vKGZpbHAtPmZfZGVudHJ5KSwKKwkJCQkgICAgRFRfRElSKSA8IDApCisJCQkJZ290byBvdXQ7CisJCQlpKys7CisJCQlmaWxwLT5mX3BvcysrOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWRlZmF1bHQ6CisJCQlkZSA9IGRlLT5zdWJkaXI7CisJCQlpIC09IDI7CisJCQlmb3IgKDs7KSB7CisJCQkJaWYgKCFkZSkgeworCQkJCQlyZXQgPSAxOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJaWYgKCFpKQorCQkJCQlicmVhazsKKwkJCQlkZSA9IGRlLT5uZXh0OworCQkJCWktLTsKKwkJCX0KKworCQkJZG8geworCQkJCWlmIChmaWxsZGlyKGRpcmVudCwgZGUtPm5hbWUsIGRlLT5uYW1lbGVuLCBmaWxwLT5mX3BvcywKKwkJCQkJICAgIGRlLT5sb3dfaW5vLCBkZS0+bW9kZSA+PiAxMikgPCAwKQorCQkJCQlnb3RvIG91dDsKKwkJCQlmaWxwLT5mX3BvcysrOworCQkJCWRlID0gZGUtPm5leHQ7CisJCQl9IHdoaWxlIChkZSk7CisJfQorCXJldCA9IDE7CitvdXQ6CXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OwkKK30KKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZ2VuZXJpYyAvcHJvYyBkaXJlY3Rvcnkgb3BlcmF0aW9ucy4gVGhleQorICogdXNlIHRoZSBpbi1tZW1vcnkgInN0cnVjdCBwcm9jX2Rpcl9lbnRyeSIgdHJlZSB0byBwYXJzZQorICogdGhlIC9wcm9jIGRpcmVjdG9yeS4KKyAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19kaXJfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgkJPSBwcm9jX3JlYWRkaXIsCit9OworCisvKgorICogcHJvYyBkaXJlY3RvcmllcyBjYW4gZG8gYWxtb3N0IG5vdGhpbmcuLgorICovCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcHJvY19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IHByb2NfbG9va3VwLAorCS5zZXRhdHRyCT0gcHJvY19ub3RpZnlfY2hhbmdlLAorfTsKKworc3RhdGljIGludCBwcm9jX3JlZ2lzdGVyKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqIGRpciwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICogZHApCit7CisJdW5zaWduZWQgaW50IGk7CisJCisJaSA9IGdldF9pbm9kZV9udW1iZXIoKTsKKwlpZiAoaSA9PSAwKQorCQlyZXR1cm4gLUVBR0FJTjsKKwlkcC0+bG93X2lubyA9IGk7CisJZHAtPm5leHQgPSBkaXItPnN1YmRpcjsKKwlkcC0+cGFyZW50ID0gZGlyOworCWRpci0+c3ViZGlyID0gZHA7CisJaWYgKFNfSVNESVIoZHAtPm1vZGUpKSB7CisJCWlmIChkcC0+cHJvY19pb3BzID09IE5VTEwpIHsKKwkJCWRwLT5wcm9jX2ZvcHMgPSAmcHJvY19kaXJfb3BlcmF0aW9uczsKKwkJCWRwLT5wcm9jX2lvcHMgPSAmcHJvY19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJfQorCQlkaXItPm5saW5rKys7CisJfSBlbHNlIGlmIChTX0lTTE5LKGRwLT5tb2RlKSkgeworCQlpZiAoZHAtPnByb2NfaW9wcyA9PSBOVUxMKQorCQkJZHAtPnByb2NfaW9wcyA9ICZwcm9jX2xpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwl9IGVsc2UgaWYgKFNfSVNSRUcoZHAtPm1vZGUpKSB7CisJCWlmIChkcC0+cHJvY19mb3BzID09IE5VTEwpCisJCQlkcC0+cHJvY19mb3BzID0gJnByb2NfZmlsZV9vcGVyYXRpb25zOworCQlpZiAoZHAtPnByb2NfaW9wcyA9PSBOVUxMKQorCQkJZHAtPnByb2NfaW9wcyA9ICZwcm9jX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBLaWxsIGFuIGlub2RlIHRoYXQgZ290IHVucmVnaXN0ZXJlZC4uCisgKi8KK3N0YXRpYyB2b2lkIHByb2Nfa2lsbF9pbm9kZXMoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBwcm9jX21udC0+bW50X3NiOworCisJLyoKKwkgKiBBY3R1YWxseSBpdCdzIGEgcGFydGlhbCByZXZva2UoKS4KKwkgKi8KKwlmaWxlX2xpc3RfbG9jaygpOworCWxpc3RfZm9yX2VhY2gocCwgJnNiLT5zX2ZpbGVzKSB7CisJCXN0cnVjdCBmaWxlICogZmlscCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGZpbGUsIGZfbGlzdCk7CisJCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwkJc3RydWN0IGlub2RlICogaW5vZGU7CisJCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHM7CisKKwkJaWYgKGRlbnRyeS0+ZF9vcCAhPSAmcHJvY19kZW50cnlfb3BlcmF0aW9ucykKKwkJCWNvbnRpbnVlOworCQlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwkJaWYgKFBERShpbm9kZSkgIT0gZGUpCisJCQljb250aW51ZTsKKwkJZm9wcyA9IGZpbHAtPmZfb3A7CisJCWZpbHAtPmZfb3AgPSBOVUxMOworCQlmb3BzX3B1dChmb3BzKTsKKwl9CisJZmlsZV9saXN0X3VubG9jaygpOworfQorCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2NyZWF0ZShzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKipwYXJlbnQsCisJCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICBtb2RlX3QgbW9kZSwKKwkJCQkJICBubGlua190IG5saW5rKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50ID0gTlVMTDsKKwljb25zdCBjaGFyICpmbiA9IG5hbWU7CisJaW50IGxlbjsKKworCS8qIG1ha2Ugc3VyZSBuYW1lIGlzIHZhbGlkICovCisJaWYgKCFuYW1lIHx8ICFzdHJsZW4obmFtZSkpIGdvdG8gb3V0OworCisJaWYgKCEoKnBhcmVudCkgJiYgeGxhdGVfcHJvY19uYW1lKG5hbWUsIHBhcmVudCwgJmZuKSAhPSAwKQorCQlnb3RvIG91dDsKKworCS8qIEF0IHRoaXMgcG9pbnQgdGhlcmUgbXVzdCBub3QgYmUgYW55ICcvJyBjaGFyYWN0ZXJzIGJleW9uZCAqZm4gKi8KKwlpZiAoc3RyY2hyKGZuLCAnLycpKQorCQlnb3RvIG91dDsKKworCWxlbiA9IHN0cmxlbihmbik7CisKKwllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvY19kaXJfZW50cnkpICsgbGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbnQpIGdvdG8gb3V0OworCisJbWVtc2V0KGVudCwgMCwgc2l6ZW9mKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSkpOworCW1lbWNweSgoKGNoYXIgKikgZW50KSArIHNpemVvZihzdHJ1Y3QgcHJvY19kaXJfZW50cnkpLCBmbiwgbGVuICsgMSk7CisJZW50LT5uYW1lID0gKChjaGFyICopIGVudCkgKyBzaXplb2YoKmVudCk7CisJZW50LT5uYW1lbGVuID0gbGVuOworCWVudC0+bW9kZSA9IG1vZGU7CisJZW50LT5ubGluayA9IG5saW5rOworIG91dDoKKwlyZXR1cm4gZW50OworfQorCitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2Nfc3ltbGluayhjb25zdCBjaGFyICpuYW1lLAorCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcmVudCwgY29uc3QgY2hhciAqZGVzdCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKKworCWVudCA9IHByb2NfY3JlYXRlKCZwYXJlbnQsbmFtZSwKKwkJCSAgKFNfSUZMTksgfCBTX0lSVUdPIHwgU19JV1VHTyB8IFNfSVhVR08pLDEpOworCisJaWYgKGVudCkgeworCQllbnQtPmRhdGEgPSBrbWFsbG9jKChlbnQtPnNpemU9c3RybGVuKGRlc3QpKSsxLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGVudC0+ZGF0YSkgeworCQkJc3RyY3B5KChjaGFyKillbnQtPmRhdGEsZGVzdCk7CisJCQlpZiAocHJvY19yZWdpc3RlcihwYXJlbnQsIGVudCkgPCAwKSB7CisJCQkJa2ZyZWUoZW50LT5kYXRhKTsKKwkJCQlrZnJlZShlbnQpOworCQkJCWVudCA9IE5VTEw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlrZnJlZShlbnQpOworCQkJZW50ID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gZW50OworfQorCitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfbWtkaXJfbW9kZShjb25zdCBjaGFyICpuYW1lLCBtb2RlX3QgbW9kZSwKKwkJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CisKKwllbnQgPSBwcm9jX2NyZWF0ZSgmcGFyZW50LCBuYW1lLCBTX0lGRElSIHwgbW9kZSwgMik7CisJaWYgKGVudCkgeworCQllbnQtPnByb2NfZm9wcyA9ICZwcm9jX2Rpcl9vcGVyYXRpb25zOworCQllbnQtPnByb2NfaW9wcyA9ICZwcm9jX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCisJCWlmIChwcm9jX3JlZ2lzdGVyKHBhcmVudCwgZW50KSA8IDApIHsKKwkJCWtmcmVlKGVudCk7CisJCQllbnQgPSBOVUxMOworCQl9CisJfQorCXJldHVybiBlbnQ7Cit9CisKK3N0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19ta2Rpcihjb25zdCBjaGFyICpuYW1lLAorCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcmVudCkKK3sKKwlyZXR1cm4gcHJvY19ta2Rpcl9tb2RlKG5hbWUsIFNfSVJVR08gfCBTX0lYVUdPLCBwYXJlbnQpOworfQorCitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmNyZWF0ZV9wcm9jX2VudHJ5KGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAorCQkJCQkgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CisJbmxpbmtfdCBubGluazsKKworCWlmIChTX0lTRElSKG1vZGUpKSB7CisJCWlmICgobW9kZSAmIFNfSUFMTFVHTykgPT0gMCkKKwkJCW1vZGUgfD0gU19JUlVHTyB8IFNfSVhVR087CisJCW5saW5rID0gMjsKKwl9IGVsc2UgeworCQlpZiAoKG1vZGUgJiBTX0lGTVQpID09IDApCisJCQltb2RlIHw9IFNfSUZSRUc7CisJCWlmICgobW9kZSAmIFNfSUFMTFVHTykgPT0gMCkKKwkJCW1vZGUgfD0gU19JUlVHTzsKKwkJbmxpbmsgPSAxOworCX0KKworCWVudCA9IHByb2NfY3JlYXRlKCZwYXJlbnQsbmFtZSxtb2RlLG5saW5rKTsKKwlpZiAoZW50KSB7CisJCWlmIChTX0lTRElSKG1vZGUpKSB7CisJCQllbnQtPnByb2NfZm9wcyA9ICZwcm9jX2Rpcl9vcGVyYXRpb25zOworCQkJZW50LT5wcm9jX2lvcHMgPSAmcHJvY19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJfQorCQlpZiAocHJvY19yZWdpc3RlcihwYXJlbnQsIGVudCkgPCAwKSB7CisJCQlrZnJlZShlbnQpOworCQkJZW50ID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gZW50OworfQorCit2b2lkIGZyZWVfcHJvY19lbnRyeShzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlKQoreworCXVuc2lnbmVkIGludCBpbm8gPSBkZS0+bG93X2lubzsKKworCWlmIChpbm8gPCBQUk9DX0RZTkFNSUNfRklSU1QpCisJCXJldHVybjsKKworCXJlbGVhc2VfaW5vZGVfbnVtYmVyKGlubyk7CisKKwlpZiAoU19JU0xOSyhkZS0+bW9kZSkgJiYgZGUtPmRhdGEpCisJCWtmcmVlKGRlLT5kYXRhKTsKKwlrZnJlZShkZSk7Cit9CisKKy8qCisgKiBSZW1vdmUgYSAvcHJvYyBlbnRyeSBhbmQgZnJlZSBpdCBpZiBpdCdzIG5vdCBjdXJyZW50bHkgaW4gdXNlLgorICogSWYgaXQgaXMgaW4gdXNlLCB3ZSBzZXQgdGhlICdkZWxldGVkJyBmbGFnLgorICovCit2b2lkIHJlbW92ZV9wcm9jX2VudHJ5KGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFyZW50KQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKnA7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZTsKKwljb25zdCBjaGFyICpmbiA9IG5hbWU7CisJaW50IGxlbjsKKworCWlmICghcGFyZW50ICYmIHhsYXRlX3Byb2NfbmFtZShuYW1lLCAmcGFyZW50LCAmZm4pICE9IDApCisJCWdvdG8gb3V0OworCWxlbiA9IHN0cmxlbihmbik7CisJZm9yIChwID0gJnBhcmVudC0+c3ViZGlyOyAqcDsgcD0mKCpwKS0+bmV4dCApIHsKKwkJaWYgKCFwcm9jX21hdGNoKGxlbiwgZm4sICpwKSkKKwkJCWNvbnRpbnVlOworCQlkZSA9ICpwOworCQkqcCA9IGRlLT5uZXh0OworCQlkZS0+bmV4dCA9IE5VTEw7CisJCWlmIChTX0lTRElSKGRlLT5tb2RlKSkKKwkJCXBhcmVudC0+bmxpbmstLTsKKwkJcHJvY19raWxsX2lub2RlcyhkZSk7CisJCWRlLT5ubGluayA9IDA7CisJCVdBUk5fT04oZGUtPnN1YmRpcik7CisJCWlmICghYXRvbWljX3JlYWQoJmRlLT5jb3VudCkpCisJCQlmcmVlX3Byb2NfZW50cnkoZGUpOworCQllbHNlIHsKKwkJCWRlLT5kZWxldGVkID0gMTsKKwkJCXByaW50aygicmVtb3ZlX3Byb2NfZW50cnk6ICVzLyVzIGJ1c3ksIGNvdW50PSVkXG4iLAorCQkJCXBhcmVudC0+bmFtZSwgZGUtPm5hbWUsIGF0b21pY19yZWFkKCZkZS0+Y291bnQpKTsKKwkJfQorCQlicmVhazsKKwl9CitvdXQ6CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9pbm9kZS1hbGxvYy50eHQgYi9mcy9wcm9jL2lub2RlLWFsbG9jLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzIxMmY5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcHJvYy9pbm9kZS1hbGxvYy50eHQKQEAgLTAsMCArMSwxNCBAQAorQ3VycmVudCBpbm9kZSBhbGxvY2F0aW9ucyBpbiB0aGUgcHJvYy1mcyAoaGV4LW51bWJlcnMpOgorCisgIDAwMDAwMDAwCQlyZXNlcnZlZAorICAwMDAwMDAwMS0wMDAwMGZmZglzdGF0aWMgZW50cmllcwkoZ29uZXJzKQorICAgICAgIDAwMQkJcm9vdC1pbm8KKworICAwMDAwMTAwMC0wMDAwMWZmZgl1bnVzZWQKKyAgMDAwMXh4eHgtN2ZmZnh4eHgJcGlkLWRpciBlbnRyaWVzIGZvciBwaWQgMS03ZmZmCisgIDgwMDAwMDAwLWVmZmZmZmZmCXVudXNlZAorICBmMDAwMDAwMC1mZmZmZmZmZglkeW5hbWljIGVudHJpZXMKKworR29hbDoKKwlhKSBvbmNlIHdlJ2xsIHNwbGl0IHRoZSB0aGluZyBpbnRvIHNldmVyYWwgdmlydHVhbCBmaWxlc3lzdGVtcyB3ZQorCXdpbGwgZ2V0IHJpZCBvZiBtYWdpY2FsIHJhbmdlcyAoYW5kIHRoaXMgZmlsZSwgQlRXKS4KZGlmZiAtLWdpdCBhL2ZzL3Byb2MvaW5vZGUuYyBiL2ZzL3Byb2MvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzNjMjg2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcHJvYy9pbm9kZS5jCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogIGxpbnV4L2ZzL3Byb2MvaW5vZGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK2V4dGVybiB2b2lkIGZyZWVfcHJvY19lbnRyeShzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKik7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHByb2NfZGlyX2VudHJ5ICogZGVfZ2V0KHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGUpCit7CisJaWYgKGRlKQorCQlhdG9taWNfaW5jKCZkZS0+Y291bnQpOworCXJldHVybiBkZTsKK30KKworLyoKKyAqIERlY3JlbWVudHMgdGhlIHVzZSBjb3VudCBhbmQgY2hlY2tzIGZvciBkZWZlcnJlZCBkZWxldGlvbi4KKyAqLworc3RhdGljIHZvaWQgZGVfcHV0KHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGUpCit7CisJaWYgKGRlKSB7CQorCQlsb2NrX2tlcm5lbCgpOwkJCisJCWlmICghYXRvbWljX3JlYWQoJmRlLT5jb3VudCkpIHsKKwkJCXByaW50aygiZGVfcHV0OiBlbnRyeSAlcyBhbHJlYWR5IGZyZWUhXG4iLCBkZS0+bmFtZSk7CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZGUtPmNvdW50KSkgeworCQkJaWYgKGRlLT5kZWxldGVkKSB7CisJCQkJcHJpbnRrKCJkZV9wdXQ6IGRlZmVycmVkIGRlbGV0ZSBvZiAlc1xuIiwKKwkJCQkJZGUtPm5hbWUpOworCQkJCWZyZWVfcHJvY19lbnRyeShkZSk7CisJCQl9CisJCX0JCQorCQl1bmxvY2tfa2VybmVsKCk7CisJfQorfQorCisvKgorICogRGVjcmVtZW50IHRoZSB1c2UgY291bnQgb2YgdGhlIHByb2NfZGlyX2VudHJ5LgorICovCitzdGF0aWMgdm9pZCBwcm9jX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGU7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisKKwkvKiBMZXQgZ28gb2YgYW55IGFzc29jaWF0ZWQgcHJvY2VzcyAqLworCXRzayA9IFBST0NfSShpbm9kZSktPnRhc2s7CisJaWYgKHRzaykKKwkJcHV0X3Rhc2tfc3RydWN0KHRzayk7CisKKwkvKiBMZXQgZ28gb2YgYW55IGFzc29jaWF0ZWQgcHJvYyBkaXJlY3RvcnkgZW50cnkgKi8KKwlkZSA9IFBST0NfSShpbm9kZSktPnBkZTsKKwlpZiAoZGUpIHsKKwkJaWYgKGRlLT5vd25lcikKKwkJCW1vZHVsZV9wdXQoZGUtPm93bmVyKTsKKwkJZGVfcHV0KGRlKTsKKwl9CisJY2xlYXJfaW5vZGUoaW5vZGUpOworfQorCitzdHJ1Y3QgdmZzbW91bnQgKnByb2NfbW50OworCitzdGF0aWMgdm9pZCBwcm9jX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworfQorCitzdGF0aWMga21lbV9jYWNoZV90ICogcHJvY19pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKnByb2NfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgcHJvY19pbm9kZSAqZWk7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCWVpID0gKHN0cnVjdCBwcm9jX2lub2RlICopa21lbV9jYWNoZV9hbGxvYyhwcm9jX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghZWkpCisJCXJldHVybiBOVUxMOworCWVpLT50YXNrID0gTlVMTDsKKwllaS0+dHlwZSA9IDA7CisJZWktPm9wLnByb2NfZ2V0X2xpbmsgPSBOVUxMOworCWVpLT5wZGUgPSBOVUxMOworCWlub2RlID0gJmVpLT52ZnNfaW5vZGU7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCXJldHVybiBpbm9kZTsKK30KKworc3RhdGljIHZvaWQgcHJvY19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJa21lbV9jYWNoZV9mcmVlKHByb2NfaW5vZGVfY2FjaGVwLCBQUk9DX0koaW5vZGUpKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgcHJvY19pbm9kZSAqZWkgPSAoc3RydWN0IHByb2NfaW5vZGUgKikgZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikKKwkJaW5vZGVfaW5pdF9vbmNlKCZlaS0+dmZzX2lub2RlKTsKK30KKyAKK2ludCBfX2luaXQgcHJvY19pbml0X2lub2RlY2FjaGUodm9pZCkKK3sKKwlwcm9jX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJwcm9jX2lub2RlX2NhY2hlIiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IHByb2NfaW5vZGUpLAorCQkJCQkgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKHByb2NfaW5vZGVfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2NfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCSpmbGFncyB8PSBNU19OT0RJUkFUSU1FOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgcHJvY19zb3BzID0geyAKKwkuYWxsb2NfaW5vZGUJPSBwcm9jX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gcHJvY19kZXN0cm95X2lub2RlLAorCS5yZWFkX2lub2RlCT0gcHJvY19yZWFkX2lub2RlLAorCS5kcm9wX2lub2RlCT0gZ2VuZXJpY19kZWxldGVfaW5vZGUsCisJLmRlbGV0ZV9pbm9kZQk9IHByb2NfZGVsZXRlX2lub2RlLAorCS5zdGF0ZnMJCT0gc2ltcGxlX3N0YXRmcywKKwkucmVtb3VudF9mcwk9IHByb2NfcmVtb3VudCwKK307CisKK3N0cnVjdCBpbm9kZSAqcHJvY19nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGlubywKKwkJCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCisJLyoKKwkgKiBJbmNyZW1lbnQgdGhlIHVzZSBjb3VudCBzbyB0aGUgZGlyIGVudHJ5IGNhbid0IGRpc2FwcGVhci4KKwkgKi8KKwlkZV9nZXQoZGUpOworCisJV0FSTl9PTihkZSAmJiBkZS0+ZGVsZXRlZCk7CisKKwlpbm9kZSA9IGlnZXQoc2IsIGlubyk7CisJaWYgKCFpbm9kZSkKKwkJZ290byBvdXRfZmFpbDsKKwkKKwlQUk9DX0koaW5vZGUpLT5wZGUgPSBkZTsKKwlpZiAoZGUpIHsKKwkJaWYgKGRlLT5tb2RlKSB7CisJCQlpbm9kZS0+aV9tb2RlID0gZGUtPm1vZGU7CisJCQlpbm9kZS0+aV91aWQgPSBkZS0+dWlkOworCQkJaW5vZGUtPmlfZ2lkID0gZGUtPmdpZDsKKwkJfQorCQlpZiAoZGUtPnNpemUpCisJCQlpbm9kZS0+aV9zaXplID0gZGUtPnNpemU7CisJCWlmIChkZS0+bmxpbmspCisJCQlpbm9kZS0+aV9ubGluayA9IGRlLT5ubGluazsKKwkJaWYgKCF0cnlfbW9kdWxlX2dldChkZS0+b3duZXIpKQorCQkJZ290byBvdXRfZmFpbDsKKwkJaWYgKGRlLT5wcm9jX2lvcHMpCisJCQlpbm9kZS0+aV9vcCA9IGRlLT5wcm9jX2lvcHM7CisJCWlmIChkZS0+cHJvY19mb3BzKQorCQkJaW5vZGUtPmlfZm9wID0gZGUtPnByb2NfZm9wczsKKwl9CisKK291dDoKKwlyZXR1cm4gaW5vZGU7CisKK291dF9mYWlsOgorCWRlX3B1dChkZSk7CisJZ290byBvdXQ7Cit9CQkJCisKK2ludCBwcm9jX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBpbm9kZSAqIHJvb3RfaW5vZGU7CisKKwlzLT5zX2ZsYWdzIHw9IE1TX05PRElSQVRJTUU7CisJcy0+c19ibG9ja3NpemUgPSAxMDI0OworCXMtPnNfYmxvY2tzaXplX2JpdHMgPSAxMDsKKwlzLT5zX21hZ2ljID0gUFJPQ19TVVBFUl9NQUdJQzsKKwlzLT5zX29wID0gJnByb2Nfc29wczsKKwlzLT5zX3RpbWVfZ3JhbiA9IDE7CisJCisJcm9vdF9pbm9kZSA9IHByb2NfZ2V0X2lub2RlKHMsIFBST0NfUk9PVF9JTk8sICZwcm9jX3Jvb3QpOworCWlmICghcm9vdF9pbm9kZSkKKwkJZ290byBvdXRfbm9fcm9vdDsKKwkvKgorCSAqIEZpeHVwIHRoZSByb290IGlub2RlJ3MgbmxpbmsgdmFsdWUKKwkgKi8KKwlyb290X2lub2RlLT5pX25saW5rICs9IG5yX3Byb2Nlc3NlcygpOworCXJvb3RfaW5vZGUtPmlfdWlkID0gMDsKKwlyb290X2lub2RlLT5pX2dpZCA9IDA7CisJcy0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOworCWlmICghcy0+c19yb290KQorCQlnb3RvIG91dF9ub19yb290OworCXJldHVybiAwOworCitvdXRfbm9fcm9vdDoKKwlwcmludGsoInByb2NfcmVhZF9zdXBlcjogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKKwlpcHV0KHJvb3RfaW5vZGUpOworCXJldHVybiAtRU5PTUVNOworfQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9pbnRlcm5hbC5oIGIvZnMvcHJvYy9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNTUxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wcm9jL2ludGVybmFsLmgKQEAgLTAsMCArMSw0OCBAQAorLyogaW50ZXJuYWwuaDogaW50ZXJuYWwgcHJvY2ZzIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKK3N0cnVjdCB2bWFsbG9jX2luZm8geworCXVuc2lnbmVkIGxvbmcJdXNlZDsKKwl1bnNpZ25lZCBsb25nCWxhcmdlc3RfY2h1bms7Cit9OworCisjaWZkZWYgQ09ORklHX01NVQorI2RlZmluZSBWTUFMTE9DX1RPVEFMIChWTUFMTE9DX0VORCAtIFZNQUxMT0NfU1RBUlQpCitleHRlcm4gdm9pZCBnZXRfdm1hbGxvY19pbmZvKHN0cnVjdCB2bWFsbG9jX2luZm8gKnZtaSk7CisjZWxzZQorCisjZGVmaW5lIFZNQUxMT0NfVE9UQUwgMFVMCisjZGVmaW5lIGdldF92bWFsbG9jX2luZm8odm1pKQkJCVwKK2RvIHsJCQkJCQlcCisJKHZtaSktPnVzZWQgPSAwOwkJCVwKKwkodm1pKS0+bGFyZ2VzdF9jaHVuayA9IDA7CQlcCit9IHdoaWxlKDApCisKKyNlbmRpZgorCitleHRlcm4gdm9pZCBjcmVhdGVfc2VxX2VudHJ5KGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmKTsKK2V4dGVybiBpbnQgcHJvY19leGVfbGluayhzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqKiwgc3RydWN0IHZmc21vdW50ICoqKTsKK2V4dGVybiBpbnQgcHJvY190aWRfc3RhdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgIGNoYXIgKik7CitleHRlcm4gaW50IHByb2NfdGdpZF9zdGF0KHN0cnVjdCB0YXNrX3N0cnVjdCAqLCBjaGFyICopOworZXh0ZXJuIGludCBwcm9jX3BpZF9zdGF0dXMoc3RydWN0IHRhc2tfc3RydWN0ICosIGNoYXIgKik7CitleHRlcm4gaW50IHByb2NfcGlkX3N0YXRtKHN0cnVjdCB0YXNrX3N0cnVjdCAqLCBjaGFyICopOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJvY190YXNrKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIFBST0NfSShpbm9kZSktPnRhc2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByb2NfdHlwZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBQUk9DX0koaW5vZGUpLT50eXBlOworfQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9rY29yZS5jIGIvZnMvcHJvYy9rY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjN2RhOTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wcm9jL2tjb3JlLmMKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgKglmcy9wcm9jL2tjb3JlLmMga2VybmVsIEVMRiBjb3JlIGR1bXBlcgorICoKKyAqCU1vZGVsbGVkIG9uIGZzL2V4ZWMuYzphb3V0X2NvcmVfZHVtcCgpCisgKglKZXJlbXkgRml0emhhcmRpbmdlIDxqZXJlbXlAc3cub3ouYXU+CisgKglFTEYgdmVyc2lvbiB3cml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgPERhdmlkLkhvd2VsbHNAbmV4b3IuY28udWs+CisgKglNb2RpZmllZCBhbmQgaW5jb3Jwb3JhdGVkIGludG8gMi4zLnggYnkgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKglTdXBwb3J0IHRvIGR1bXAgdm1hbGxvYydkIGFyZWFzIChFTEYgb25seSksIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHZlcml0YXMuY29tPgorICoJU2FmZSBhY2Nlc3NlcyB0byB2bWFsbG9jL2RpcmVjdC1tYXBwZWQgZGlzY29udGlndW91cyBhcmVhcywgS2Fub2ogU2FyY2FyIDxrYW5vakBzZ2kuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91c2VyLmg+CisjaW5jbHVkZSA8bGludXgvYS5vdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGZjb3JlLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworCitzdGF0aWMgaW50IG9wZW5fa2NvcmUoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlyZXR1cm4gY2FwYWJsZShDQVBfU1lTX1JBV0lPKSA/IDAgOiAtRVBFUk07Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlYWRfa2NvcmUoc3RydWN0IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19rY29yZV9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IHJlYWRfa2NvcmUsCisJLm9wZW4JCT0gb3Blbl9rY29yZSwKK307CisKKyNpZm5kZWYga2NfdmFkZHJfdG9fb2Zmc2V0CisjZGVmaW5lCWtjX3ZhZGRyX3RvX29mZnNldCh2KSAoKHYpIC0gUEFHRV9PRkZTRVQpCisjZW5kaWYKKyNpZm5kZWYJa2Nfb2Zmc2V0X3RvX3ZhZGRyCisjZGVmaW5lCWtjX29mZnNldF90b192YWRkcihvKSAoKG8pICsgUEFHRV9PRkZTRVQpCisjZW5kaWYKKworI2RlZmluZSByb3VuZHVwKHgsIHkpICAoKCgoeCkrKCh5KS0xKSkvKHkpKSooeSkpCisKKy8qIEFuIEVMRiBub3RlIGluIG1lbW9yeSAqLworc3RydWN0IG1lbWVsZm5vdGUKK3sKKwljb25zdCBjaGFyICpuYW1lOworCWludCB0eXBlOworCXVuc2lnbmVkIGludCBkYXRhc3o7CisJdm9pZCAqZGF0YTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qga2NvcmVfbGlzdCAqa2NsaXN0Oworc3RhdGljIERFRklORV9SV0xPQ0soa2NsaXN0X2xvY2spOworCit2b2lkCitrY2xpc3RfYWRkKHN0cnVjdCBrY29yZV9saXN0ICpuZXcsIHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKQoreworCW5ldy0+YWRkciA9ICh1bnNpZ25lZCBsb25nKWFkZHI7CisJbmV3LT5zaXplID0gc2l6ZTsKKworCXdyaXRlX2xvY2soJmtjbGlzdF9sb2NrKTsKKwluZXctPm5leHQgPSBrY2xpc3Q7CisJa2NsaXN0ID0gbmV3OworCXdyaXRlX3VubG9jaygma2NsaXN0X2xvY2spOworfQorCitzdGF0aWMgc2l6ZV90IGdldF9rY29yZV9zaXplKGludCAqbnBoZHIsIHNpemVfdCAqZWxmX2J1ZmxlbikKK3sKKwlzaXplX3QgdHJ5LCBzaXplOworCXN0cnVjdCBrY29yZV9saXN0ICptOworCisJKm5waGRyID0gMTsgLyogUFRfTk9URSAqLworCXNpemUgPSAwOworCisJZm9yIChtPWtjbGlzdDsgbTsgbT1tLT5uZXh0KSB7CisJCXRyeSA9IGtjX3ZhZGRyX3RvX29mZnNldCgoc2l6ZV90KW0tPmFkZHIgKyBtLT5zaXplKTsKKwkJaWYgKHRyeSA+IHNpemUpCisJCQlzaXplID0gdHJ5OworCQkqbnBoZHIgPSAqbnBoZHIgKyAxOworCX0KKwkqZWxmX2J1ZmxlbiA9CXNpemVvZihzdHJ1Y3QgZWxmaGRyKSArIAorCQkJKCpucGhkciArIDIpKnNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpICsgCisJCQkzICogKHNpemVvZihzdHJ1Y3QgZWxmX25vdGUpICsgNCkgKworCQkJc2l6ZW9mKHN0cnVjdCBlbGZfcHJzdGF0dXMpICsKKwkJCXNpemVvZihzdHJ1Y3QgZWxmX3BycHNpbmZvKSArCisJCQlzaXplb2Yoc3RydWN0IHRhc2tfc3RydWN0KTsKKwkqZWxmX2J1ZmxlbiA9IFBBR0VfQUxJR04oKmVsZl9idWZsZW4pOworCXJldHVybiBzaXplICsgKmVsZl9idWZsZW47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGRldGVybWluZSBzaXplIG9mIEVMRiBub3RlCisgKi8KK3N0YXRpYyBpbnQgbm90ZXNpemUoc3RydWN0IG1lbWVsZm5vdGUgKmVuKQoreworCWludCBzejsKKworCXN6ID0gc2l6ZW9mKHN0cnVjdCBlbGZfbm90ZSk7CisJc3ogKz0gcm91bmR1cChzdHJsZW4oZW4tPm5hbWUpLCA0KTsKKwlzeiArPSByb3VuZHVwKGVuLT5kYXRhc3osIDQpOworCisJcmV0dXJuIHN6OworfSAvKiBlbmQgbm90ZXNpemUoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogc3RvcmUgYSBub3RlIGluIHRoZSBoZWFkZXIgYnVmZmVyCisgKi8KK3N0YXRpYyBjaGFyICpzdG9yZW5vdGUoc3RydWN0IG1lbWVsZm5vdGUgKm1lbiwgY2hhciAqYnVmcCkKK3sKKwlzdHJ1Y3QgZWxmX25vdGUgZW47CisKKyNkZWZpbmUgRFVNUF9XUklURShhZGRyLG5yKSBkbyB7IG1lbWNweShidWZwLGFkZHIsbnIpOyBidWZwICs9IG5yOyB9IHdoaWxlKDApCisKKwllbi5uX25hbWVzeiA9IHN0cmxlbihtZW4tPm5hbWUpOworCWVuLm5fZGVzY3N6ID0gbWVuLT5kYXRhc3o7CisJZW4ubl90eXBlID0gbWVuLT50eXBlOworCisJRFVNUF9XUklURSgmZW4sIHNpemVvZihlbikpOworCURVTVBfV1JJVEUobWVuLT5uYW1lLCBlbi5uX25hbWVzeik7CisKKwkvKiBYWFggLSBjYXN0IGZyb20gbG9uZyBsb25nIHRvIGxvbmcgdG8gYXZvaWQgbmVlZCBmb3IgbGliZ2NjLmEgKi8KKwlidWZwID0gKGNoYXIqKSByb3VuZHVwKCh1bnNpZ25lZCBsb25nKWJ1ZnAsNCk7CisJRFVNUF9XUklURShtZW4tPmRhdGEsIG1lbi0+ZGF0YXN6KTsKKwlidWZwID0gKGNoYXIqKSByb3VuZHVwKCh1bnNpZ25lZCBsb25nKWJ1ZnAsNCk7CisKKyN1bmRlZiBEVU1QX1dSSVRFCisKKwlyZXR1cm4gYnVmcDsKK30gLyogZW5kIHN0b3Jlbm90ZSgpICovCisKKy8qCisgKiBzdG9yZSBhbiBFTEYgY29yZWR1bXAgaGVhZGVyIGluIHRoZSBzdXBwbGllZCBidWZmZXIKKyAqIG5waGRyIGlzIHRoZSBudW1iZXIgb2YgZWxmX3BoZHIgdG8gaW5zZXJ0CisgKi8KK3N0YXRpYyB2b2lkIGVsZl9rY29yZV9zdG9yZV9oZHIoY2hhciAqYnVmcCwgaW50IG5waGRyLCBpbnQgZGF0YW9mZikKK3sKKwlzdHJ1Y3QgZWxmX3Byc3RhdHVzIHByc3RhdHVzOwkvKiBOVF9QUlNUQVRVUyAqLworCXN0cnVjdCBlbGZfcHJwc2luZm8gcHJwc2luZm87CS8qIE5UX1BSUFNJTkZPICovCisJc3RydWN0IGVsZl9waGRyICpuaGRyLCAqcGhkcjsKKwlzdHJ1Y3QgZWxmaGRyICplbGY7CisJc3RydWN0IG1lbWVsZm5vdGUgbm90ZXNbM107CisJb2ZmX3Qgb2Zmc2V0ID0gMDsKKwlzdHJ1Y3Qga2NvcmVfbGlzdCAqbTsKKworCS8qIHNldHVwIEVMRiBoZWFkZXIgKi8KKwllbGYgPSAoc3RydWN0IGVsZmhkciAqKSBidWZwOworCWJ1ZnAgKz0gc2l6ZW9mKHN0cnVjdCBlbGZoZHIpOworCW9mZnNldCArPSBzaXplb2Yoc3RydWN0IGVsZmhkcik7CisJbWVtY3B5KGVsZi0+ZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKTsKKwllbGYtPmVfaWRlbnRbRUlfQ0xBU1NdCT0gRUxGX0NMQVNTOworCWVsZi0+ZV9pZGVudFtFSV9EQVRBXQk9IEVMRl9EQVRBOworCWVsZi0+ZV9pZGVudFtFSV9WRVJTSU9OXT0gRVZfQ1VSUkVOVDsKKwllbGYtPmVfaWRlbnRbRUlfT1NBQkldID0gRUxGX09TQUJJOworCW1lbXNldChlbGYtPmVfaWRlbnQrRUlfUEFELCAwLCBFSV9OSURFTlQtRUlfUEFEKTsKKwllbGYtPmVfdHlwZQk9IEVUX0NPUkU7CisJZWxmLT5lX21hY2hpbmUJPSBFTEZfQVJDSDsKKwllbGYtPmVfdmVyc2lvbgk9IEVWX0NVUlJFTlQ7CisJZWxmLT5lX2VudHJ5CT0gMDsKKwllbGYtPmVfcGhvZmYJPSBzaXplb2Yoc3RydWN0IGVsZmhkcik7CisJZWxmLT5lX3Nob2ZmCT0gMDsKKyNpZiBkZWZpbmVkKENPTkZJR19IODMwMCkKKwllbGYtPmVfZmxhZ3MJPSBFTEZfRkxBR1M7CisjZWxzZQorCWVsZi0+ZV9mbGFncwk9IDA7CisjZW5kaWYKKwllbGYtPmVfZWhzaXplCT0gc2l6ZW9mKHN0cnVjdCBlbGZoZHIpOworCWVsZi0+ZV9waGVudHNpemU9IHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpOworCWVsZi0+ZV9waG51bQk9IG5waGRyOworCWVsZi0+ZV9zaGVudHNpemU9IDA7CisJZWxmLT5lX3NobnVtCT0gMDsKKwllbGYtPmVfc2hzdHJuZHgJPSAwOworCisJLyogc2V0dXAgRUxGIFBUX05PVEUgcHJvZ3JhbSBoZWFkZXIgKi8KKwluaGRyID0gKHN0cnVjdCBlbGZfcGhkciAqKSBidWZwOworCWJ1ZnAgKz0gc2l6ZW9mKHN0cnVjdCBlbGZfcGhkcik7CisJb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpOworCW5oZHItPnBfdHlwZQk9IFBUX05PVEU7CisJbmhkci0+cF9vZmZzZXQJPSAwOworCW5oZHItPnBfdmFkZHIJPSAwOworCW5oZHItPnBfcGFkZHIJPSAwOworCW5oZHItPnBfZmlsZXN6CT0gMDsKKwluaGRyLT5wX21lbXN6CT0gMDsKKwluaGRyLT5wX2ZsYWdzCT0gMDsKKwluaGRyLT5wX2FsaWduCT0gMDsKKworCS8qIHNldHVwIEVMRiBQVF9MT0FEIHByb2dyYW0gaGVhZGVyIGZvciBldmVyeSBhcmVhICovCisJZm9yIChtPWtjbGlzdDsgbTsgbT1tLT5uZXh0KSB7CisJCXBoZHIgPSAoc3RydWN0IGVsZl9waGRyICopIGJ1ZnA7CisJCWJ1ZnAgKz0gc2l6ZW9mKHN0cnVjdCBlbGZfcGhkcik7CisJCW9mZnNldCArPSBzaXplb2Yoc3RydWN0IGVsZl9waGRyKTsKKworCQlwaGRyLT5wX3R5cGUJPSBQVF9MT0FEOworCQlwaGRyLT5wX2ZsYWdzCT0gUEZfUnxQRl9XfFBGX1g7CisJCXBoZHItPnBfb2Zmc2V0CT0ga2NfdmFkZHJfdG9fb2Zmc2V0KG0tPmFkZHIpICsgZGF0YW9mZjsKKwkJcGhkci0+cF92YWRkcgk9IChzaXplX3QpbS0+YWRkcjsKKwkJcGhkci0+cF9wYWRkcgk9IDA7CisJCXBoZHItPnBfZmlsZXN6CT0gcGhkci0+cF9tZW1zegk9IG0tPnNpemU7CisJCXBoZHItPnBfYWxpZ24JPSBQQUdFX1NJWkU7CisJfQorCisJLyoKKwkgKiBTZXQgdXAgdGhlIG5vdGVzIGluIHNpbWlsYXIgZm9ybSB0byBTVlI0IGNvcmUgZHVtcHMgbWFkZQorCSAqIHdpdGggaW5mbyBmcm9tIHRoZWlyIC9wcm9jLgorCSAqLworCW5oZHItPnBfb2Zmc2V0CT0gb2Zmc2V0OworCisJLyogc2V0IHVwIHRoZSBwcm9jZXNzIHN0YXR1cyAqLworCW5vdGVzWzBdLm5hbWUgPSAiQ09SRSI7CisJbm90ZXNbMF0udHlwZSA9IE5UX1BSU1RBVFVTOworCW5vdGVzWzBdLmRhdGFzeiA9IHNpemVvZihzdHJ1Y3QgZWxmX3Byc3RhdHVzKTsKKwlub3Rlc1swXS5kYXRhID0gJnByc3RhdHVzOworCisJbWVtc2V0KCZwcnN0YXR1cywgMCwgc2l6ZW9mKHN0cnVjdCBlbGZfcHJzdGF0dXMpKTsKKworCW5oZHItPnBfZmlsZXN6CT0gbm90ZXNpemUoJm5vdGVzWzBdKTsKKwlidWZwID0gc3RvcmVub3RlKCZub3Rlc1swXSwgYnVmcCk7CisKKwkvKiBzZXQgdXAgdGhlIHByb2Nlc3MgaW5mbyAqLworCW5vdGVzWzFdLm5hbWUJPSAiQ09SRSI7CisJbm90ZXNbMV0udHlwZQk9IE5UX1BSUFNJTkZPOworCW5vdGVzWzFdLmRhdGFzegk9IHNpemVvZihzdHJ1Y3QgZWxmX3BycHNpbmZvKTsKKwlub3Rlc1sxXS5kYXRhCT0gJnBycHNpbmZvOworCisJbWVtc2V0KCZwcnBzaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBlbGZfcHJwc2luZm8pKTsKKwlwcnBzaW5mby5wcl9zdGF0ZQk9IDA7CisJcHJwc2luZm8ucHJfc25hbWUJPSAnUic7CisJcHJwc2luZm8ucHJfem9tYgk9IDA7CisKKwlzdHJjcHkocHJwc2luZm8ucHJfZm5hbWUsICJ2bWxpbnV4Iik7CisJc3RybmNweShwcnBzaW5mby5wcl9wc2FyZ3MsIHNhdmVkX2NvbW1hbmRfbGluZSwgRUxGX1BSQVJHU1opOworCisJbmhkci0+cF9maWxlc3oJKz0gbm90ZXNpemUoJm5vdGVzWzFdKTsKKwlidWZwID0gc3RvcmVub3RlKCZub3Rlc1sxXSwgYnVmcCk7CisKKwkvKiBzZXQgdXAgdGhlIHRhc2sgc3RydWN0dXJlICovCisJbm90ZXNbMl0ubmFtZQk9ICJDT1JFIjsKKwlub3Rlc1syXS50eXBlCT0gTlRfVEFTS1NUUlVDVDsKKwlub3Rlc1syXS5kYXRhc3oJPSBzaXplb2Yoc3RydWN0IHRhc2tfc3RydWN0KTsKKwlub3Rlc1syXS5kYXRhCT0gY3VycmVudDsKKworCW5oZHItPnBfZmlsZXN6CSs9IG5vdGVzaXplKCZub3Rlc1syXSk7CisJYnVmcCA9IHN0b3Jlbm90ZSgmbm90ZXNbMl0sIGJ1ZnApOworCit9IC8qIGVuZCBlbGZfa2NvcmVfc3RvcmVfaGRyKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHJlYWQgZnJvbSB0aGUgRUxGIGhlYWRlciBhbmQgdGhlbiBrZXJuZWwgbWVtb3J5CisgKi8KK3N0YXRpYyBzc2l6ZV90CityZWFkX2tjb3JlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgYnVmbGVuLCBsb2ZmX3QgKmZwb3MpCit7CisJc3NpemVfdCBhY2MgPSAwOworCXNpemVfdCBzaXplLCB0c3o7CisJc2l6ZV90IGVsZl9idWZsZW47CisJaW50IG5waGRyOworCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisKKwlyZWFkX2xvY2soJmtjbGlzdF9sb2NrKTsKKwlwcm9jX3Jvb3Rfa2NvcmUtPnNpemUgPSBzaXplID0gZ2V0X2tjb3JlX3NpemUoJm5waGRyLCAmZWxmX2J1Zmxlbik7CisJaWYgKGJ1ZmxlbiA9PSAwIHx8ICpmcG9zID49IHNpemUpIHsKKwkJcmVhZF91bmxvY2soJmtjbGlzdF9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogdHJpbSBidWZsZW4gdG8gbm90IGdvIGJleW9uZCBFT0YgKi8KKwlpZiAoYnVmbGVuID4gc2l6ZSAtICpmcG9zKQorCQlidWZsZW4gPSBzaXplIC0gKmZwb3M7CisKKwkvKiBjb25zdHJ1Y3QgYW4gRUxGIGNvcmUgaGVhZGVyIGlmIHdlJ2xsIG5lZWQgc29tZSBvZiBpdCAqLworCWlmICgqZnBvcyA8IGVsZl9idWZsZW4pIHsKKwkJY2hhciAqIGVsZl9idWY7CisKKwkJdHN6ID0gZWxmX2J1ZmxlbiAtICpmcG9zOworCQlpZiAoYnVmbGVuIDwgdHN6KQorCQkJdHN6ID0gYnVmbGVuOworCQllbGZfYnVmID0ga21hbGxvYyhlbGZfYnVmbGVuLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFlbGZfYnVmKSB7CisJCQlyZWFkX3VubG9jaygma2NsaXN0X2xvY2spOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbWVtc2V0KGVsZl9idWYsIDAsIGVsZl9idWZsZW4pOworCQllbGZfa2NvcmVfc3RvcmVfaGRyKGVsZl9idWYsIG5waGRyLCBlbGZfYnVmbGVuKTsKKwkJcmVhZF91bmxvY2soJmtjbGlzdF9sb2NrKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGVsZl9idWYgKyAqZnBvcywgdHN6KSkgeworCQkJa2ZyZWUoZWxmX2J1Zik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlrZnJlZShlbGZfYnVmKTsKKwkJYnVmbGVuIC09IHRzejsKKwkJKmZwb3MgKz0gdHN6OworCQlidWZmZXIgKz0gdHN6OworCQlhY2MgKz0gdHN6OworCisJCS8qIGxlYXZlIG5vdyBpZiBmaWxsZWQgYnVmZmVyIGFscmVhZHkgKi8KKwkJaWYgKGJ1ZmxlbiA9PSAwKQorCQkJcmV0dXJuIGFjYzsKKwl9IGVsc2UKKwkJcmVhZF91bmxvY2soJmtjbGlzdF9sb2NrKTsKKworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIG91ciBmaWxlIG9mZnNldCBtYXRjaGVzIHdpdGggYW55IG9mCisJICogdGhlIGFkZHJlc3NlcyBpbiB0aGUgZWxmX3BoZHIgb24gb3VyIGxpc3QuCisJICovCisJc3RhcnQgPSBrY19vZmZzZXRfdG9fdmFkZHIoKmZwb3MgLSBlbGZfYnVmbGVuKTsKKwlpZiAoKHRzeiA9IChQQUdFX1NJWkUgLSAoc3RhcnQgJiB+UEFHRV9NQVNLKSkpID4gYnVmbGVuKQorCQl0c3ogPSBidWZsZW47CisJCQorCXdoaWxlIChidWZsZW4pIHsKKwkJc3RydWN0IGtjb3JlX2xpc3QgKm07CisKKwkJcmVhZF9sb2NrKCZrY2xpc3RfbG9jayk7CisJCWZvciAobT1rY2xpc3Q7IG07IG09bS0+bmV4dCkgeworCQkJaWYgKHN0YXJ0ID49IG0tPmFkZHIgJiYgc3RhcnQgPCAobS0+YWRkcittLT5zaXplKSkKKwkJCQlicmVhazsKKwkJfQorCQlyZWFkX3VubG9jaygma2NsaXN0X2xvY2spOworCisJCWlmIChtID09IE5VTEwpIHsKKwkJCWlmIChjbGVhcl91c2VyKGJ1ZmZlciwgdHN6KSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfSBlbHNlIGlmICgoc3RhcnQgPj0gVk1BTExPQ19TVEFSVCkgJiYgKHN0YXJ0IDwgVk1BTExPQ19FTkQpKSB7CisJCQljaGFyICogZWxmX2J1ZjsKKwkJCXN0cnVjdCB2bV9zdHJ1Y3QgKm07CisJCQl1bnNpZ25lZCBsb25nIGN1cnN0YXJ0ID0gc3RhcnQ7CisJCQl1bnNpZ25lZCBsb25nIGN1cnNpemUgPSB0c3o7CisKKwkJCWVsZl9idWYgPSBrbWFsbG9jKHRzeiwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWVsZl9idWYpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQltZW1zZXQoZWxmX2J1ZiwgMCwgdHN6KTsKKworCQkJcmVhZF9sb2NrKCZ2bWxpc3RfbG9jayk7CisJCQlmb3IgKG09dm1saXN0OyBtICYmIGN1cnNpemU7IG09bS0+bmV4dCkgeworCQkJCXVuc2lnbmVkIGxvbmcgdm1zdGFydDsKKwkJCQl1bnNpZ25lZCBsb25nIHZtc2l6ZTsKKwkJCQl1bnNpZ25lZCBsb25nIG1zaXplID0gbS0+c2l6ZSAtIFBBR0VfU0laRTsKKworCQkJCWlmICgoKHVuc2lnbmVkIGxvbmcpbS0+YWRkciArIG1zaXplKSA8IAorCQkJCQkJCQljdXJzdGFydCkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKCh1bnNpZ25lZCBsb25nKW0tPmFkZHIgPiAoY3Vyc3RhcnQgKyAKKwkJCQkJCQkJY3Vyc2l6ZSkpCisJCQkJCWJyZWFrOworCQkJCXZtc3RhcnQgPSAoY3Vyc3RhcnQgPCAodW5zaWduZWQgbG9uZyltLT5hZGRyID8gCisJCQkJCSh1bnNpZ25lZCBsb25nKW0tPmFkZHIgOiBjdXJzdGFydCk7CisJCQkJaWYgKCgodW5zaWduZWQgbG9uZyltLT5hZGRyICsgbXNpemUpID4gCisJCQkJCQkJKGN1cnN0YXJ0ICsgY3Vyc2l6ZSkpCisJCQkJCXZtc2l6ZSA9IGN1cnN0YXJ0ICsgY3Vyc2l6ZSAtIHZtc3RhcnQ7CisJCQkJZWxzZQorCQkJCQl2bXNpemUgPSAodW5zaWduZWQgbG9uZyltLT5hZGRyICsgCisJCQkJCQkJbXNpemUgLSB2bXN0YXJ0OworCQkJCWN1cnN0YXJ0ID0gdm1zdGFydCArIHZtc2l6ZTsKKwkJCQljdXJzaXplIC09IHZtc2l6ZTsKKwkJCQkvKiBkb24ndCBkdW1wIGlvcmVtYXAnZCBzdHVmZiEgKFRBKSAqLworCQkJCWlmIChtLT5mbGFncyAmIFZNX0lPUkVNQVApCisJCQkJCWNvbnRpbnVlOworCQkJCW1lbWNweShlbGZfYnVmICsgKHZtc3RhcnQgLSBzdGFydCksCisJCQkJCShjaGFyICopdm1zdGFydCwgdm1zaXplKTsKKwkJCX0KKwkJCXJlYWRfdW5sb2NrKCZ2bWxpc3RfbG9jayk7CisJCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgZWxmX2J1ZiwgdHN6KSkgeworCQkJCWtmcmVlKGVsZl9idWYpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJa2ZyZWUoZWxmX2J1Zik7CisJCX0gZWxzZSB7CisJCQlpZiAoa2Vybl9hZGRyX3ZhbGlkKHN0YXJ0KSkgeworCQkJCXVuc2lnbmVkIGxvbmcgbjsKKworCQkJCW4gPSBjb3B5X3RvX3VzZXIoYnVmZmVyLCAoY2hhciAqKXN0YXJ0LCB0c3opOworCQkJCS8qCisJCQkJICogV2UgY2Fubm90IGRpc3Rpbmd1c2ggYmV0d2VlbiBmYXVsdCBvbiBzb3VyY2UKKwkJCQkgKiBhbmQgZmF1bHQgb24gZGVzdGluYXRpb24uIFdoZW4gdGhpcyBoYXBwZW5zCisJCQkJICogd2UgY2xlYXIgdG9vIGFuZCBob3BlIGl0IHdpbGwgdHJpZ2dlciB0aGUKKwkJCQkgKiBFRkFVTFQgYWdhaW4uCisJCQkJICovCisJCQkJaWYgKG4pIHsgCisJCQkJCWlmIChjbGVhcl91c2VyKGJ1ZmZlciArIHRzeiAtIG4sCisJCQkJCQkJCXRzeiAtIG4pKQorCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoY2xlYXJfdXNlcihidWZmZXIsIHRzeikpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQl9CisJCWJ1ZmxlbiAtPSB0c3o7CisJCSpmcG9zICs9IHRzejsKKwkJYnVmZmVyICs9IHRzejsKKwkJYWNjICs9IHRzejsKKwkJc3RhcnQgKz0gdHN6OworCQl0c3ogPSAoYnVmbGVuID4gUEFHRV9TSVpFID8gUEFHRV9TSVpFIDogYnVmbGVuKTsKKwl9CisKKwlyZXR1cm4gYWNjOworfQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9rbXNnLmMgYi9mcy9wcm9jL2ttc2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGQzN2JmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcHJvYy9rbXNnLmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqICBsaW51eC9mcy9wcm9jL2ttc2cuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTIgIGJ5IExpbnVzIFRvcnZhbGRzCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworZXh0ZXJuIHdhaXRfcXVldWVfaGVhZF90IGxvZ193YWl0OworCitleHRlcm4gaW50IGRvX3N5c2xvZyhpbnQgdHlwZSwgY2hhciBfX3VzZXIgKmJ1ZywgaW50IGNvdW50KTsKKworc3RhdGljIGludCBrbXNnX29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwlyZXR1cm4gZG9fc3lzbG9nKDEsTlVMTCwwKTsKK30KKworc3RhdGljIGludCBrbXNnX3JlbGVhc2Uoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwkodm9pZCkgZG9fc3lzbG9nKDAsTlVMTCwwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qga21zZ19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spICYmICFkb19zeXNsb2coOSwgTlVMTCwgMCkpCisJCXJldHVybiAtRUFHQUlOOworCXJldHVybiBkb19zeXNsb2coMiwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQga21zZ19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXBvbGxfd2FpdChmaWxlLCAmbG9nX3dhaXQsIHdhaXQpOworCWlmIChkb19zeXNsb2coOSwgTlVMTCwgMCkpCisJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworCXJldHVybiAwOworfQorCisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19rbXNnX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0ga21zZ19yZWFkLAorCS5wb2xsCQk9IGttc2dfcG9sbCwKKwkub3BlbgkJPSBrbXNnX29wZW4sCisJLnJlbGVhc2UJPSBrbXNnX3JlbGVhc2UsCit9OwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9tbXUuYyBiL2ZzL3Byb2MvbW11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwNDEwMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Byb2MvbW11LmMKQEAgLTAsMCArMSw2NyBAQAorLyogbW11LmM6IG1tdSBtZW1vcnkgaW5mbyBmaWxlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vdGxiLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordm9pZCBnZXRfdm1hbGxvY19pbmZvKHN0cnVjdCB2bWFsbG9jX2luZm8gKnZtaSkKK3sKKwlzdHJ1Y3Qgdm1fc3RydWN0ICp2bWE7CisJdW5zaWduZWQgbG9uZyBmcmVlX2FyZWFfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHByZXZfZW5kOworCisJdm1pLT51c2VkID0gMDsKKworCWlmICghdm1saXN0KSB7CisJCXZtaS0+bGFyZ2VzdF9jaHVuayA9IFZNQUxMT0NfVE9UQUw7CisJfQorCWVsc2UgeworCQl2bWktPmxhcmdlc3RfY2h1bmsgPSAwOworCisJCXByZXZfZW5kID0gVk1BTExPQ19TVEFSVDsKKworCQlyZWFkX2xvY2soJnZtbGlzdF9sb2NrKTsKKworCQlmb3IgKHZtYSA9IHZtbGlzdDsgdm1hOyB2bWEgPSB2bWEtPm5leHQpIHsKKwkJCXZtaS0+dXNlZCArPSB2bWEtPnNpemU7CisKKwkJCWZyZWVfYXJlYV9zaXplID0gKHVuc2lnbmVkIGxvbmcpIHZtYS0+YWRkciAtIHByZXZfZW5kOworCQkJaWYgKHZtaS0+bGFyZ2VzdF9jaHVuayA8IGZyZWVfYXJlYV9zaXplKQorCQkJCXZtaS0+bGFyZ2VzdF9jaHVuayA9IGZyZWVfYXJlYV9zaXplOworCisJCQlwcmV2X2VuZCA9IHZtYS0+c2l6ZSArICh1bnNpZ25lZCBsb25nKSB2bWEtPmFkZHI7CisJCX0KKworCQlpZiAoVk1BTExPQ19FTkQgLSBwcmV2X2VuZCA+IHZtaS0+bGFyZ2VzdF9jaHVuaykKKwkJCXZtaS0+bGFyZ2VzdF9jaHVuayA9IFZNQUxMT0NfRU5EIC0gcHJldl9lbmQ7CisKKwkJcmVhZF91bmxvY2soJnZtbGlzdF9sb2NrKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9mcy9wcm9jL25vbW11LmMgYi9mcy9wcm9jL25vbW11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiZjAxNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Byb2Mvbm9tbXUuYwpAQCAtMCwwICsxLDEzNSBAQAorLyogbm9tbXUuYzogbW11LWxlc3MgbWVtb3J5IGluZm8gZmlsZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vdGxiLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworLyoKKyAqIGRpc3BsYXkgYSBsaXN0IG9mIGFsbCB0aGUgVk1BcyB0aGUga2VybmVsIGtub3dzIGFib3V0CisgKiAtIG5vbW11IGtlcm5hbHMgaGF2ZSBhIHNpbmdsZSBmbGF0IGxpc3QKKyAqLworc3RhdGljIGludCBub21tdV92bWFfbGlzdF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwl1bnNpZ25lZCBsb25nIGlubyA9IDA7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJZGV2X3QgZGV2ID0gMDsKKwlpbnQgZmxhZ3MsIGxlbjsKKworCXZtYSA9IHJiX2VudHJ5KChzdHJ1Y3QgcmJfbm9kZSAqKSB2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QsIHZtX3JiKTsKKworCWZsYWdzID0gdm1hLT52bV9mbGFnczsKKwlmaWxlID0gdm1hLT52bV9maWxlOworCisJaWYgKGZpbGUpIHsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IHZtYS0+dm1fZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJCWRldiA9IGlub2RlLT5pX3NiLT5zX2RldjsKKwkJaW5vID0gaW5vZGUtPmlfaW5vOworCX0KKworCXNlcV9wcmludGYobSwKKwkJICAgIiUwOGx4LSUwOGx4ICVjJWMlYyVjICUwOGx4ICUwMng6JTAyeCAlbHUgJW4iLAorCQkgICB2bWEtPnZtX3N0YXJ0LAorCQkgICB2bWEtPnZtX2VuZCwKKwkJICAgZmxhZ3MgJiBWTV9SRUFEID8gJ3InIDogJy0nLAorCQkgICBmbGFncyAmIFZNX1dSSVRFID8gJ3cnIDogJy0nLAorCQkgICBmbGFncyAmIFZNX0VYRUMgPyAneCcgOiAnLScsCisJCSAgIGZsYWdzICYgVk1fTUFZU0hBUkUgPyBmbGFncyAmIFZNX1NIQVJFRCA/ICdTJyA6ICdzJyA6ICdwJywKKwkJICAgdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZULAorCQkgICBNQUpPUihkZXYpLCBNSU5PUihkZXYpLCBpbm8sICZsZW4pOworCisJaWYgKGZpbGUpIHsKKwkJbGVuID0gMjUgKyBzaXplb2Yodm9pZCAqKSAqIDYgLSBsZW47CisJCWlmIChsZW4gPCAxKQorCQkJbGVuID0gMTsKKwkJc2VxX3ByaW50ZihtLCAiJSpjIiwgbGVuLCAnICcpOworCQlzZXFfcGF0aChtLCBmaWxlLT5mX3Zmc21udCwgZmlsZS0+Zl9kZW50cnksICIiKTsKKwl9CisKKwlzZXFfcHV0YyhtLCAnXG4nKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgKm5vbW11X3ZtYV9saXN0X3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpfcG9zKQoreworCXN0cnVjdCByYl9ub2RlICpfcmI7CisJbG9mZl90IHBvcyA9ICpfcG9zOworCXZvaWQgKm5leHQgPSBOVUxMOworCisJZG93bl9yZWFkKCZub21tdV92bWFfc2VtKTsKKworCWZvciAoX3JiID0gcmJfZmlyc3QoJm5vbW11X3ZtYV90cmVlKTsgX3JiOyBfcmIgPSByYl9uZXh0KF9yYikpIHsKKwkJaWYgKHBvcyA9PSAwKSB7CisJCQluZXh0ID0gX3JiOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gbmV4dDsKK30KKworc3RhdGljIHZvaWQgbm9tbXVfdm1hX2xpc3Rfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJdXBfcmVhZCgmbm9tbXVfdm1hX3NlbSk7Cit9CisKK3N0YXRpYyB2b2lkICpub21tdV92bWFfbGlzdF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKCpwb3MpKys7CisJcmV0dXJuIHJiX25leHQoKHN0cnVjdCByYl9ub2RlICopIHYpOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHByb2Nfbm9tbXVfdm1hX2xpc3Rfc2Vxb3AgPSB7CisJLnN0YXJ0CT0gbm9tbXVfdm1hX2xpc3Rfc3RhcnQsCisJLm5leHQJPSBub21tdV92bWFfbGlzdF9uZXh0LAorCS5zdG9wCT0gbm9tbXVfdm1hX2xpc3Rfc3RvcCwKKwkuc2hvdwk9IG5vbW11X3ZtYV9saXN0X3Nob3cKK307CisKK3N0YXRpYyBpbnQgcHJvY19ub21tdV92bWFfbGlzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmcHJvY19ub21tdV92bWFfbGlzdF9zZXFvcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfbm9tbXVfdm1hX2xpc3Rfb3BlcmF0aW9ucyA9IHsKKwkub3BlbiAgICA9IHByb2Nfbm9tbXVfdm1hX2xpc3Rfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcm9jX25vbW11X2luaXQodm9pZCkKK3sKKwljcmVhdGVfc2VxX2VudHJ5KCJtYXBzIiwgU19JUlVHTywgJnByb2Nfbm9tbXVfdm1hX2xpc3Rfb3BlcmF0aW9ucyk7CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KHByb2Nfbm9tbXVfaW5pdCk7CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Byb2NfZGV2dHJlZS5jIGIvZnMvcHJvYy9wcm9jX2RldnRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzQyM2M2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcHJvYy9wcm9jX2RldnRyZWUuYwpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIHByb2NfZGV2dHJlZS5jIC0gaGFuZGxlcyAvcHJvYy9kZXZpY2UtdHJlZQorICoKKyAqIENvcHlyaWdodCAxOTk3IFBhdWwgTWFja2VycmFzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmbmRlZiBIQVZFX0FSQ0hfREVWVFJFRV9GSVhVUFMKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbm9kZV9wcm9jX2VudHJ5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGUpCit7Cit9CisKK3N0YXRpYyB2b2lkIGlubGluZSBzZXRfbm9kZV9uYW1lX2xpbmsoc3RydWN0IGRldmljZV9ub2RlICpucCwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSkKK3sKK30KKworc3RhdGljIHZvaWQgaW5saW5lIHNldF9ub2RlX2FkZHJfbGluayhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlKQoreworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfZGV2aWNlX3RyZWU7CisKKy8qCisgKiBTdXBwbHkgZGF0YSBvbiBhIHJlYWQgZnJvbSAvcHJvYy9kZXZpY2UtdHJlZS9ub2RlL3Byb3BlcnR5LgorICovCitzdGF0aWMgaW50IHByb3BlcnR5X3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCSAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHByb3BlcnR5ICpwcCA9IGRhdGE7CisJaW50IG47CisKKwlpZiAob2ZmID49IHBwLT5sZW5ndGgpIHsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKwluID0gcHAtPmxlbmd0aCAtIG9mZjsKKwlpZiAobiA+IGNvdW50KQorCQluID0gY291bnQ7CisJZWxzZQorCQkqZW9mID0gMTsKKwltZW1jcHkocGFnZSwgcHAtPnZhbHVlICsgb2ZmLCBuKTsKKwkqc3RhcnQgPSBwYWdlOworCXJldHVybiBuOworfQorCisvKgorICogRm9yIGEgbm9kZSB3aXRoIGEgbmFtZSBsaWtlICJnY0AxMCIsIHdlIG1ha2Ugc3ltbGlua3MgY2FsbGVkICJnYyIKKyAqIGFuZCAiQDEwIiB0byBpdC4KKyAqLworCisvKgorICogUHJvY2VzcyBhIG5vZGUsIGFkZGluZyBlbnRyaWVzIGZvciBpdHMgY2hpbGRyZW4gYW5kIGl0cyBwcm9wZXJ0aWVzLgorICovCit2b2lkIHByb2NfZGV2aWNlX3RyZWVfYWRkX25vZGUoc3RydWN0IGRldmljZV9ub2RlICpucCwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnBwOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQsICpzaWI7CisJY29uc3QgY2hhciAqcCwgKmF0OworCWludCBsOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqbGlzdCwgKipsYXN0cCwgKmFsOworCisJc2V0X25vZGVfcHJvY19lbnRyeShucCwgZGUpOworCWxhc3RwID0gJmxpc3Q7CisJZm9yIChwcCA9IG5wLT5wcm9wZXJ0aWVzOyBwcCAhPSAwOyBwcCA9IHBwLT5uZXh0KSB7CisJCS8qCisJCSAqIFVuZm9ydHVuYXRlbHkgcHJvY19yZWdpc3RlciBwdXRzIGVhY2ggbmV3IGVudHJ5CisJCSAqIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuICBTbyB3ZSByZWFycmFuZ2UgdGhlbS4KKwkJICovCisJCWVudCA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkocHAtPm5hbWUsIHN0cm5jbXAocHAtPm5hbWUsICJzZWN1cml0eS0iLCA5KSA/CisJCQkJCSAgICAgU19JUlVHTyA6IFNfSVJVU1IsIGRlLCBwcm9wZXJ0eV9yZWFkX3Byb2MsIHBwKTsKKwkJaWYgKGVudCA9PSAwKQorCQkJYnJlYWs7CisJCWlmICghc3RybmNtcChwcC0+bmFtZSwgInNlY3VyaXR5LSIsIDkpKQorCQkgICAgIGVudC0+c2l6ZSA9IDA7IC8qIGRvbid0IGxlYWsgbnVtYmVyIG9mIHBhc3N3b3JkIGNoYXJzICovCisJCWVsc2UKKwkJICAgICBlbnQtPnNpemUgPSBwcC0+bGVuZ3RoOworCQkqbGFzdHAgPSBlbnQ7CisJCWxhc3RwID0gJmVudC0+bmV4dDsKKwl9CisJY2hpbGQgPSBOVUxMOworCXdoaWxlICgoY2hpbGQgPSBvZl9nZXRfbmV4dF9jaGlsZChucCwgY2hpbGQpKSkgeworCQlwID0gc3RycmNocihjaGlsZC0+ZnVsbF9uYW1lLCAnLycpOworCQlpZiAoIXApCisJCQlwID0gY2hpbGQtPmZ1bGxfbmFtZTsKKwkJZWxzZQorCQkJKytwOworCQkvKiBjaG9wIG9mZiAnQDAnIGlmIHRoZSBuYW1lIGVuZHMgd2l0aCB0aGF0ICovCisJCWwgPSBzdHJsZW4ocCk7CisJCWlmIChsID4gMiAmJiBwW2wtMl0gPT0gJ0AnICYmIHBbbC0xXSA9PSAnMCcpCisJCQlsIC09IDI7CisJCWVudCA9IHByb2NfbWtkaXIocCwgZGUpOworCQlpZiAoZW50ID09IDApCisJCQlicmVhazsKKwkJKmxhc3RwID0gZW50OworCQlsYXN0cCA9ICZlbnQtPm5leHQ7CisJCXByb2NfZGV2aWNlX3RyZWVfYWRkX25vZGUoY2hpbGQsIGVudCk7CisKKwkJLyoKKwkJICogSWYgd2UgbGVmdCB0aGUgYWRkcmVzcyBwYXJ0IG9uIHRoZSBuYW1lLCBjb25zaWRlcgorCQkgKiBhZGRpbmcgc3ltbGlua3MgZnJvbSB0aGUgbmFtZSBhbmQgYWRkcmVzcyBwYXJ0cy4KKwkJICovCisJCWlmIChwW2xdICE9IDAgfHwgKGF0ID0gc3RyY2hyKHAsICdAJykpID09IDApCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBub2RlIHdpdGggYSBnaXZlbiBuYW1lIHByb3BlcnR5LAorCQkgKiBhZGQgYSBzeW1saW5rIHdpdGggdGhlIG5hbWUgcHJvcGVydHkgYXMgaXRzIG5hbWUuCisJCSAqLworCQlzaWIgPSBOVUxMOworCQl3aGlsZSAoKHNpYiA9IG9mX2dldF9uZXh0X2NoaWxkKG5wLCBzaWIpKSAmJiBzaWIgIT0gY2hpbGQpCisJCQlpZiAoc2liLT5uYW1lICYmIHN0cmNtcChzaWItPm5hbWUsIGNoaWxkLT5uYW1lKSA9PSAwKQorCQkJCWJyZWFrOworCQlpZiAoc2liID09IGNoaWxkICYmIHN0cm5jbXAocCwgY2hpbGQtPm5hbWUsIGwpICE9IDApIHsKKwkJCWFsID0gcHJvY19zeW1saW5rKGNoaWxkLT5uYW1lLCBkZSwgZW50LT5uYW1lKTsKKwkJCWlmIChhbCA9PSAwKSB7CisJCQkJb2Zfbm9kZV9wdXQoc2liKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNldF9ub2RlX25hbWVfbGluayhjaGlsZCwgYWwpOworCQkJKmxhc3RwID0gYWw7CisJCQlsYXN0cCA9ICZhbC0+bmV4dDsKKwkJfQorCQlvZl9ub2RlX3B1dChzaWIpOworCQkvKgorCQkgKiBBZGQgYW5vdGhlciBkaXJlY3Rvcnkgd2l0aCB0aGUgQGFkZHJlc3MgcGFydCBhcyBpdHMgbmFtZS4KKwkJICovCisJCWFsID0gcHJvY19zeW1saW5rKGF0LCBkZSwgZW50LT5uYW1lKTsKKwkJaWYgKGFsID09IDApCisJCQlicmVhazsKKwkJc2V0X25vZGVfYWRkcl9saW5rKGNoaWxkLCBhbCk7CisJCSpsYXN0cCA9IGFsOworCQlsYXN0cCA9ICZhbC0+bmV4dDsKKwl9CisJb2Zfbm9kZV9wdXQoY2hpbGQpOworCSpsYXN0cCA9IE5VTEw7CisJZGUtPnN1YmRpciA9IGxpc3Q7Cit9CisKKy8qCisgKiBDYWxsZWQgb24gaW5pdGlhbGl6YXRpb24gdG8gc2V0IHVwIHRoZSAvcHJvYy9kZXZpY2UtdHJlZSBzdWJ0cmVlCisgKi8KK3ZvaWQgcHJvY19kZXZpY2VfdHJlZV9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpyb290OworCWlmICggIWhhdmVfb2YgKQorCQlyZXR1cm47CisJcHJvY19kZXZpY2VfdHJlZSA9IHByb2NfbWtkaXIoImRldmljZS10cmVlIiwgTlVMTCk7CisJaWYgKHByb2NfZGV2aWNlX3RyZWUgPT0gMCkKKwkJcmV0dXJuOworCXJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOworCWlmIChyb290ID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIvcHJvYy9kZXZpY2UtdHJlZTogY2FuJ3QgZmluZCByb290XG4iKTsKKwkJcmV0dXJuOworCX0KKwlwcm9jX2RldmljZV90cmVlX2FkZF9ub2RlKHJvb3QsIHByb2NfZGV2aWNlX3RyZWUpOworCW9mX25vZGVfcHV0KHJvb3QpOworfQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9wcm9jX21pc2MuYyBiL2ZzL3Byb2MvcHJvY19taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3NWQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Byb2MvcHJvY19taXNjLmMKQEAgLTAsMCArMSw2MTUgQEAKKy8qCisgKiAgbGludXgvZnMvcHJvYy9wcm9jX21pc2MuYworICoKKyAqICBsaW51eC9mcy9wcm9jL2FycmF5LmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTIgIGJ5IExpbnVzIFRvcnZhbGRzCisgKiAgYmFzZWQgb24gaWRlYXMgYnkgRGFycmVuIFNlbm4KKyAqCisgKiAgVGhpcyB1c2VkIHRvIGJlIHRoZSBwYXJ0IG9mIGFycmF5LmMuIFNlZSB0aGUgcmVzdCBvZiBoaXN0b3J5IGFuZCBjcmVkaXRzCisgKiAgdGhlcmUuIEkgdG9vayB0aGlzIGludG8gYSBzZXBhcmF0ZSBmaWxlIGFuZCBzd2l0Y2hlZCB0aGUgdGhpbmcgdG8gZ2VuZXJpYworICogIHByb2NfZmlsZV9pbm9kZV9vcGVyYXRpb25zLCBsZWF2aW5nIGluIGFycmF5LmMgb25seSBwZXItcHJvY2VzcyBzdHVmZi4KKyAqICBJbnVtYmVycyBhbGxvY2F0aW9uIG1hZGUgZHluYW1pYyAodmlhIGNyZWF0ZV9wcm9jX2VudHJ5KCkpLiAgQVYsIE1heSAxOTk5LgorICoKKyAqIENoYW5nZXM6CisgKiBGdWx0b24gR3JlZW4gICAgICA6ICBFbmNhcHN1bGF0ZWQgcG9zaXRpb24gbWV0cmljIGNhbGN1bGF0aW9ucy4KKyAqCQkJPGtlcm5lbEBGdWx0b25HcmVlbi5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdGxiLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBMT0FEX0lOVCh4KSAoKHgpID4+IEZTSElGVCkKKyNkZWZpbmUgTE9BRF9GUkFDKHgpIExPQURfSU5UKCgoeCkgJiAoRklYRURfMS0xKSkgKiAxMDApCisvKgorICogV2FybmluZzogc3R1ZmYgYmVsb3cgKGltcG9ydGVkIGZ1bmN0aW9ucykgYXNzdW1lcyB0aGF0IGl0cyBvdXRwdXQgd2lsbCBmaXQKKyAqIGludG8gb25lIHBhZ2UuIEZvciBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBpdCBtYXkgYmUgd3JvbmcuIE1vcmVvdmVyLCB3ZQorICogaGF2ZSBhIHdheSB0byBkZWFsIHdpdGggdGhhdCBncmFjZWZ1bGx5LiBSaWdodCBub3cgSSB1c2VkIHN0cmFpZ2h0Zm9yd2FyZAorICogd3JhcHBlcnMsIGJ1dCB0aGlzIG5lZWRzIGZ1cnRoZXIgYW5hbHlzaXMgd3J0IHBvdGVudGlhbCBvdmVyZmxvd3MuCisgKi8KK2V4dGVybiBpbnQgZ2V0X2hhcmR3YXJlX2xpc3QoY2hhciAqKTsKK2V4dGVybiBpbnQgZ2V0X3N0cmFtX2xpc3QoY2hhciAqKTsKK2V4dGVybiBpbnQgZ2V0X2NocmRldl9saXN0KGNoYXIgKik7CitleHRlcm4gaW50IGdldF9maWxlc3lzdGVtX2xpc3QoY2hhciAqKTsKK2V4dGVybiBpbnQgZ2V0X2V4ZWNfZG9tYWluX2xpc3QoY2hhciAqKTsKK2V4dGVybiBpbnQgZ2V0X2RtYV9saXN0KGNoYXIgKik7CitleHRlcm4gaW50IGdldF9sb2Nrc19zdGF0dXMgKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QsIGludCk7CisKK3N0YXRpYyBpbnQgcHJvY19jYWxjX21ldHJpY3MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJIGludCBjb3VudCwgaW50ICplb2YsIGludCBsZW4pCit7CisJaWYgKGxlbiA8PSBvZmYrY291bnQpICplb2YgPSAxOworCSpzdGFydCA9IHBhZ2UgKyBvZmY7CisJbGVuIC09IG9mZjsKKwlpZiAobGVuPmNvdW50KSBsZW4gPSBjb3VudDsKKwlpZiAobGVuPDApIGxlbiA9IDA7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBsb2FkYXZnX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCQkgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgYSwgYiwgYzsKKwlpbnQgbGVuOworCisJYSA9IGF2ZW5ydW5bMF0gKyAoRklYRURfMS8yMDApOworCWIgPSBhdmVucnVuWzFdICsgKEZJWEVEXzEvMjAwKTsKKwljID0gYXZlbnJ1blsyXSArIChGSVhFRF8xLzIwMCk7CisJbGVuID0gc3ByaW50ZihwYWdlLCIlZC4lMDJkICVkLiUwMmQgJWQuJTAyZCAlbGQvJWQgJWRcbiIsCisJCUxPQURfSU5UKGEpLCBMT0FEX0ZSQUMoYSksCisJCUxPQURfSU5UKGIpLCBMT0FEX0ZSQUMoYiksCisJCUxPQURfSU5UKGMpLCBMT0FEX0ZSQUMoYyksCisJCW5yX3J1bm5pbmcoKSwgbnJfdGhyZWFkcywgbGFzdF9waWQpOworCXJldHVybiBwcm9jX2NhbGNfbWV0cmljcyhwYWdlLCBzdGFydCwgb2ZmLCBjb3VudCwgZW9mLCBsZW4pOworfQorCitzdGF0aWMgaW50IHVwdGltZV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHRpbWVzcGVjIHVwdGltZTsKKwlzdHJ1Y3QgdGltZXNwZWMgaWRsZTsKKwlpbnQgbGVuOworCWNwdXRpbWVfdCBpZGxldGltZSA9IGNwdXRpbWVfYWRkKGluaXRfdGFzay51dGltZSwgaW5pdF90YXNrLnN0aW1lKTsKKworCWRvX3Bvc2l4X2Nsb2NrX21vbm90b25pY19nZXR0aW1lKCZ1cHRpbWUpOworCWNwdXRpbWVfdG9fdGltZXNwZWMoaWRsZXRpbWUsICZpZGxlKTsKKwlsZW4gPSBzcHJpbnRmKHBhZ2UsIiVsdS4lMDJsdSAlbHUuJTAybHVcbiIsCisJCQkodW5zaWduZWQgbG9uZykgdXB0aW1lLnR2X3NlYywKKwkJCSh1cHRpbWUudHZfbnNlYyAvIChOU0VDX1BFUl9TRUMgLyAxMDApKSwKKwkJCSh1bnNpZ25lZCBsb25nKSBpZGxlLnR2X3NlYywKKwkJCShpZGxlLnR2X25zZWMgLyAoTlNFQ19QRVJfU0VDIC8gMTAwKSkpOworCisJcmV0dXJuIHByb2NfY2FsY19tZXRyaWNzKHBhZ2UsIHN0YXJ0LCBvZmYsIGNvdW50LCBlb2YsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgbWVtaW5mb19yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHN5c2luZm8gaTsKKwlpbnQgbGVuOworCXN0cnVjdCBwYWdlX3N0YXRlIHBzOworCXVuc2lnbmVkIGxvbmcgaW5hY3RpdmU7CisJdW5zaWduZWQgbG9uZyBhY3RpdmU7CisJdW5zaWduZWQgbG9uZyBmcmVlOworCXVuc2lnbmVkIGxvbmcgY29tbWl0dGVkOworCXVuc2lnbmVkIGxvbmcgYWxsb3dlZDsKKwlzdHJ1Y3Qgdm1hbGxvY19pbmZvIHZtaTsKKworCWdldF9wYWdlX3N0YXRlKCZwcyk7CisJZ2V0X3pvbmVfY291bnRzKCZhY3RpdmUsICZpbmFjdGl2ZSwgJmZyZWUpOworCisvKgorICogZGlzcGxheSBpbiBraWxvYnl0ZXMuCisgKi8KKyNkZWZpbmUgSyh4KSAoKHgpIDw8IChQQUdFX1NISUZUIC0gMTApKQorCXNpX21lbWluZm8oJmkpOworCXNpX3N3YXBpbmZvKCZpKTsKKwljb21taXR0ZWQgPSBhdG9taWNfcmVhZCgmdm1fY29tbWl0dGVkX3NwYWNlKTsKKwlhbGxvd2VkID0gKCh0b3RhbHJhbV9wYWdlcyAtIGh1Z2V0bGJfdG90YWxfcGFnZXMoKSkKKwkJKiBzeXNjdGxfb3ZlcmNvbW1pdF9yYXRpbyAvIDEwMCkgKyB0b3RhbF9zd2FwX3BhZ2VzOworCisJZ2V0X3ZtYWxsb2NfaW5mbygmdm1pKTsKKworCS8qCisJICogVGFnZ2VkIGZvcm1hdCwgZm9yIGVhc3kgZ3JlcHBpbmcgYW5kIGV4cGFuc2lvbi4KKwkgKi8KKwlsZW4gPSBzcHJpbnRmKHBhZ2UsCisJCSJNZW1Ub3RhbDogICAgICU4bHUga0JcbiIKKwkJIk1lbUZyZWU6ICAgICAgJThsdSBrQlxuIgorCQkiQnVmZmVyczogICAgICAlOGx1IGtCXG4iCisJCSJDYWNoZWQ6ICAgICAgICU4bHUga0JcbiIKKwkJIlN3YXBDYWNoZWQ6ICAgJThsdSBrQlxuIgorCQkiQWN0aXZlOiAgICAgICAlOGx1IGtCXG4iCisJCSJJbmFjdGl2ZTogICAgICU4bHUga0JcbiIKKwkJIkhpZ2hUb3RhbDogICAgJThsdSBrQlxuIgorCQkiSGlnaEZyZWU6ICAgICAlOGx1IGtCXG4iCisJCSJMb3dUb3RhbDogICAgICU4bHUga0JcbiIKKwkJIkxvd0ZyZWU6ICAgICAgJThsdSBrQlxuIgorCQkiU3dhcFRvdGFsOiAgICAlOGx1IGtCXG4iCisJCSJTd2FwRnJlZTogICAgICU4bHUga0JcbiIKKwkJIkRpcnR5OiAgICAgICAgJThsdSBrQlxuIgorCQkiV3JpdGViYWNrOiAgICAlOGx1IGtCXG4iCisJCSJNYXBwZWQ6ICAgICAgICU4bHUga0JcbiIKKwkJIlNsYWI6ICAgICAgICAgJThsdSBrQlxuIgorCQkiQ29tbWl0TGltaXQ6ICAlOGx1IGtCXG4iCisJCSJDb21taXR0ZWRfQVM6ICU4bHUga0JcbiIKKwkJIlBhZ2VUYWJsZXM6ICAgJThsdSBrQlxuIgorCQkiVm1hbGxvY1RvdGFsOiAlOGx1IGtCXG4iCisJCSJWbWFsbG9jVXNlZDogICU4bHUga0JcbiIKKwkJIlZtYWxsb2NDaHVuazogJThsdSBrQlxuIiwKKwkJSyhpLnRvdGFscmFtKSwKKwkJSyhpLmZyZWVyYW0pLAorCQlLKGkuYnVmZmVycmFtKSwKKwkJSyhnZXRfcGFnZV9jYWNoZV9zaXplKCktdG90YWxfc3dhcGNhY2hlX3BhZ2VzLWkuYnVmZmVycmFtKSwKKwkJSyh0b3RhbF9zd2FwY2FjaGVfcGFnZXMpLAorCQlLKGFjdGl2ZSksCisJCUsoaW5hY3RpdmUpLAorCQlLKGkudG90YWxoaWdoKSwKKwkJSyhpLmZyZWVoaWdoKSwKKwkJSyhpLnRvdGFscmFtLWkudG90YWxoaWdoKSwKKwkJSyhpLmZyZWVyYW0taS5mcmVlaGlnaCksCisJCUsoaS50b3RhbHN3YXApLAorCQlLKGkuZnJlZXN3YXApLAorCQlLKHBzLm5yX2RpcnR5KSwKKwkJSyhwcy5ucl93cml0ZWJhY2spLAorCQlLKHBzLm5yX21hcHBlZCksCisJCUsocHMubnJfc2xhYiksCisJCUsoYWxsb3dlZCksCisJCUsoY29tbWl0dGVkKSwKKwkJSyhwcy5ucl9wYWdlX3RhYmxlX3BhZ2VzKSwKKwkJKHVuc2lnbmVkIGxvbmcpVk1BTExPQ19UT1RBTCA+PiAxMCwKKwkJdm1pLnVzZWQgPj4gMTAsCisJCXZtaS5sYXJnZXN0X2NodW5rID4+IDEwCisJCSk7CisKKwkJbGVuICs9IGh1Z2V0bGJfcmVwb3J0X21lbWluZm8ocGFnZSArIGxlbik7CisKKwlyZXR1cm4gcHJvY19jYWxjX21ldHJpY3MocGFnZSwgc3RhcnQsIG9mZiwgY291bnQsIGVvZiwgbGVuKTsKKyN1bmRlZiBLCit9CisKK2V4dGVybiBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZnJhZ21lbnRhdGlvbl9vcDsKK3N0YXRpYyBpbnQgZnJhZ21lbnRhdGlvbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCSh2b2lkKWlub2RlOworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmZnJhZ21lbnRhdGlvbl9vcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZyYWdtZW50YXRpb25fZmlsZV9vcGVyYXRpb25zID0geworCS5vcGVuCQk9IGZyYWdtZW50YXRpb25fb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCB2ZXJzaW9uX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCQkgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuOworCisJc3RyY3B5KHBhZ2UsIGxpbnV4X2Jhbm5lcik7CisJbGVuID0gc3RybGVuKHBhZ2UpOworCXJldHVybiBwcm9jX2NhbGNfbWV0cmljcyhwYWdlLCBzdGFydCwgb2ZmLCBjb3VudCwgZW9mLCBsZW4pOworfQorCitleHRlcm4gc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3A7CitzdGF0aWMgaW50IGNwdWluZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmNwdWluZm9fb3ApOworfQorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19jcHVpbmZvX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gY3B1aW5mb19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCitleHRlcm4gc3RydWN0IHNlcV9vcGVyYXRpb25zIHZtc3RhdF9vcDsKK3N0YXRpYyBpbnQgdm1zdGF0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZ2bXN0YXRfb3ApOworfQorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY192bXN0YXRfZmlsZV9vcGVyYXRpb25zID0geworCS5vcGVuCQk9IHZtc3RhdF9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCisjaWZkZWYgQ09ORklHX1BST0NfSEFSRFdBUkUKK3N0YXRpYyBpbnQgaGFyZHdhcmVfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCSBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW4gPSBnZXRfaGFyZHdhcmVfbGlzdChwYWdlKTsKKwlyZXR1cm4gcHJvY19jYWxjX21ldHJpY3MocGFnZSwgc3RhcnQsIG9mZiwgY291bnQsIGVvZiwgbGVuKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NUUkFNX1BST0MKK3N0YXRpYyBpbnQgc3RyYW1fcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCSBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW4gPSBnZXRfc3RyYW1fbGlzdChwYWdlKTsKKwlyZXR1cm4gcHJvY19jYWxjX21ldHJpY3MocGFnZSwgc3RhcnQsIG9mZiwgY291bnQsIGVvZiwgbGVuKTsKK30KKyNlbmRpZgorCitleHRlcm4gc3RydWN0IHNlcV9vcGVyYXRpb25zIHBhcnRpdGlvbnNfb3A7CitzdGF0aWMgaW50IHBhcnRpdGlvbnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJnBhcnRpdGlvbnNfb3ApOworfQorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19wYXJ0aXRpb25zX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gcGFydGl0aW9uc19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCitleHRlcm4gc3RydWN0IHNlcV9vcGVyYXRpb25zIGRpc2tzdGF0c19vcDsKK3N0YXRpYyBpbnQgZGlza3N0YXRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZkaXNrc3RhdHNfb3ApOworfQorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19kaXNrc3RhdHNfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBkaXNrc3RhdHNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworI2lmZGVmIENPTkZJR19NT0RVTEVTCitleHRlcm4gc3RydWN0IHNlcV9vcGVyYXRpb25zIG1vZHVsZXNfb3A7CitzdGF0aWMgaW50IG1vZHVsZXNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJm1vZHVsZXNfb3ApOworfQorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19tb2R1bGVzX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gbW9kdWxlc19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworI2VuZGlmCisKK2V4dGVybiBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgc2xhYmluZm9fb3A7CitleHRlcm4gc3NpemVfdCBzbGFiaW5mb193cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKK3N0YXRpYyBpbnQgc2xhYmluZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJnNsYWJpbmZvX29wKTsKK30KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfc2xhYmluZm9fb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBzbGFiaW5mb19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS53cml0ZQkJPSBzbGFiaW5mb193cml0ZSwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBzaG93X3N0YXQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgamlmOworCWNwdXRpbWU2NF90IHVzZXIsIG5pY2UsIHN5c3RlbSwgaWRsZSwgaW93YWl0LCBpcnEsIHNvZnRpcnEsIHN0ZWFsOworCXU2NCBzdW0gPSAwOworCisJdXNlciA9IG5pY2UgPSBzeXN0ZW0gPSBpZGxlID0gaW93YWl0ID0KKwkJaXJxID0gc29mdGlycSA9IHN0ZWFsID0gY3B1dGltZTY0X3plcm87CisJamlmID0gLSB3YWxsX3RvX21vbm90b25pYy50dl9zZWM7CisJaWYgKHdhbGxfdG9fbW9ub3RvbmljLnR2X25zZWMpCisJCS0tamlmOworCisJZm9yX2VhY2hfY3B1KGkpIHsKKwkJaW50IGo7CisKKwkJdXNlciA9IGNwdXRpbWU2NF9hZGQodXNlciwga3N0YXRfY3B1KGkpLmNwdXN0YXQudXNlcik7CisJCW5pY2UgPSBjcHV0aW1lNjRfYWRkKG5pY2UsIGtzdGF0X2NwdShpKS5jcHVzdGF0Lm5pY2UpOworCQlzeXN0ZW0gPSBjcHV0aW1lNjRfYWRkKHN5c3RlbSwga3N0YXRfY3B1KGkpLmNwdXN0YXQuc3lzdGVtKTsKKwkJaWRsZSA9IGNwdXRpbWU2NF9hZGQoaWRsZSwga3N0YXRfY3B1KGkpLmNwdXN0YXQuaWRsZSk7CisJCWlvd2FpdCA9IGNwdXRpbWU2NF9hZGQoaW93YWl0LCBrc3RhdF9jcHUoaSkuY3B1c3RhdC5pb3dhaXQpOworCQlpcnEgPSBjcHV0aW1lNjRfYWRkKGlycSwga3N0YXRfY3B1KGkpLmNwdXN0YXQuaXJxKTsKKwkJc29mdGlycSA9IGNwdXRpbWU2NF9hZGQoc29mdGlycSwga3N0YXRfY3B1KGkpLmNwdXN0YXQuc29mdGlycSk7CisJCXN0ZWFsID0gY3B1dGltZTY0X2FkZChzdGVhbCwga3N0YXRfY3B1KGkpLmNwdXN0YXQuc3RlYWwpOworCQlmb3IgKGogPSAwIDsgaiA8IE5SX0lSUVMgOyBqKyspCisJCQlzdW0gKz0ga3N0YXRfY3B1KGkpLmlycXNbal07CisJfQorCisJc2VxX3ByaW50ZihwLCAiY3B1ICAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHVcbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpY3B1dGltZTY0X3RvX2Nsb2NrX3QodXNlciksCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpY3B1dGltZTY0X3RvX2Nsb2NrX3QobmljZSksCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpY3B1dGltZTY0X3RvX2Nsb2NrX3Qoc3lzdGVtKSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyljcHV0aW1lNjRfdG9fY2xvY2tfdChpZGxlKSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyljcHV0aW1lNjRfdG9fY2xvY2tfdChpb3dhaXQpLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWNwdXRpbWU2NF90b19jbG9ja190KGlycSksCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpY3B1dGltZTY0X3RvX2Nsb2NrX3Qoc29mdGlycSksCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpY3B1dGltZTY0X3RvX2Nsb2NrX3Qoc3RlYWwpKTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKKworCQkvKiBDb3B5IHZhbHVlcyBoZXJlIHRvIHdvcmsgYXJvdW5kIGdjYy0yLjk1LjMsIGdjYy0yLjk2ICovCisJCXVzZXIgPSBrc3RhdF9jcHUoaSkuY3B1c3RhdC51c2VyOworCQluaWNlID0ga3N0YXRfY3B1KGkpLmNwdXN0YXQubmljZTsKKwkJc3lzdGVtID0ga3N0YXRfY3B1KGkpLmNwdXN0YXQuc3lzdGVtOworCQlpZGxlID0ga3N0YXRfY3B1KGkpLmNwdXN0YXQuaWRsZTsKKwkJaW93YWl0ID0ga3N0YXRfY3B1KGkpLmNwdXN0YXQuaW93YWl0OworCQlpcnEgPSBrc3RhdF9jcHUoaSkuY3B1c3RhdC5pcnE7CisJCXNvZnRpcnEgPSBrc3RhdF9jcHUoaSkuY3B1c3RhdC5zb2Z0aXJxOworCQlzdGVhbCA9IGtzdGF0X2NwdShpKS5jcHVzdGF0LnN0ZWFsOworCQlzZXFfcHJpbnRmKHAsICJjcHUlZCAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHVcbiIsCisJCQlpLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljcHV0aW1lNjRfdG9fY2xvY2tfdCh1c2VyKSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpY3B1dGltZTY0X3RvX2Nsb2NrX3QobmljZSksCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWNwdXRpbWU2NF90b19jbG9ja190KHN5c3RlbSksCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWNwdXRpbWU2NF90b19jbG9ja190KGlkbGUpLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljcHV0aW1lNjRfdG9fY2xvY2tfdChpb3dhaXQpLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljcHV0aW1lNjRfdG9fY2xvY2tfdChpcnEpLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljcHV0aW1lNjRfdG9fY2xvY2tfdChzb2Z0aXJxKSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpY3B1dGltZTY0X3RvX2Nsb2NrX3Qoc3RlYWwpKTsKKwl9CisJc2VxX3ByaW50ZihwLCAiaW50ciAlbGx1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZylzdW0pOworCisjaWYgIWRlZmluZWQoQ09ORklHX1BQQzY0KSAmJiAhZGVmaW5lZChDT05GSUdfQUxQSEEpCisJZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykKKwkJc2VxX3ByaW50ZihwLCAiICV1Iiwga3N0YXRfaXJxcyhpKSk7CisjZW5kaWYKKworCXNlcV9wcmludGYocCwKKwkJIlxuY3R4dCAlbGx1XG4iCisJCSJidGltZSAlbHVcbiIKKwkJInByb2Nlc3NlcyAlbHVcbiIKKwkJInByb2NzX3J1bm5pbmcgJWx1XG4iCisJCSJwcm9jc19ibG9ja2VkICVsdVxuIiwKKwkJbnJfY29udGV4dF9zd2l0Y2hlcygpLAorCQkodW5zaWduZWQgbG9uZylqaWYsCisJCXRvdGFsX2ZvcmtzLAorCQlucl9ydW5uaW5nKCksCisJCW5yX2lvd2FpdCgpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBzaXplID0gNDA5NiAqICgxICsgbnVtX3Bvc3NpYmxlX2NwdXMoKSAvIDMyKTsKKwljaGFyICpidWY7CisJc3RydWN0IHNlcV9maWxlICptOworCWludCByZXM7CisKKwkvKiBkb24ndCBhc2sgZm9yIG1vcmUgdGhhbiB0aGUga21hbGxvYygpIG1heCBzaXplLCBjdXJyZW50bHkgMTI4IEtCICovCisJaWYgKHNpemUgPiAxMjggKiAxMDI0KQorCQlzaXplID0gMTI4ICogMTAyNDsKKwlidWYgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcyA9IHNpbmdsZV9vcGVuKGZpbGUsIHNob3dfc3RhdCwgTlVMTCk7CisJaWYgKCFyZXMpIHsKKwkJbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkJbS0+YnVmID0gYnVmOworCQltLT5zaXplID0gc2l6ZTsKKwl9IGVsc2UKKwkJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmVzOworfQorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19zdGF0X29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gc3RhdF9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IGRldmljZXNfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCSBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW4gPSBnZXRfY2hyZGV2X2xpc3QocGFnZSk7CisJbGVuICs9IGdldF9ibGtkZXZfbGlzdChwYWdlK2xlbik7CisJcmV0dXJuIHByb2NfY2FsY19tZXRyaWNzKHBhZ2UsIHN0YXJ0LCBvZmYsIGNvdW50LCBlb2YsIGxlbik7Cit9CisKKy8qCisgKiAvcHJvYy9pbnRlcnJ1cHRzCisgKi8KK3N0YXRpYyB2b2lkICppbnRfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqZiwgbG9mZl90ICpwb3MpCit7CisJcmV0dXJuICgqcG9zIDw9IE5SX0lSUVMpID8gcG9zIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgKmludF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCSgqcG9zKSsrOworCWlmICgqcG9zID4gTlJfSVJRUykKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHBvczsKK30KKworc3RhdGljIHZvaWQgaW50X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqdikKK3sKKwkvKiBOb3RoaW5nIHRvIGRvICovCit9CisKKworZXh0ZXJuIGludCBzaG93X2ludGVycnVwdHMoc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KTsgLyogSW4gYXJjaCBjb2RlICovCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGludF9zZXFfb3BzID0geworCS5zdGFydCA9IGludF9zZXFfc3RhcnQsCisJLm5leHQgID0gaW50X3NlcV9uZXh0LAorCS5zdG9wICA9IGludF9zZXFfc3RvcCwKKwkuc2hvdyAgPSBzaG93X2ludGVycnVwdHMKK307CisKK3N0YXRpYyBpbnQgaW50ZXJydXB0c19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXJldHVybiBzZXFfb3BlbihmaWxwLCAmaW50X3NlcV9vcHMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2ludGVycnVwdHNfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBpbnRlcnJ1cHRzX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgZmlsZXN5c3RlbXNfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCSBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW4gPSBnZXRfZmlsZXN5c3RlbV9saXN0KHBhZ2UpOworCXJldHVybiBwcm9jX2NhbGNfbWV0cmljcyhwYWdlLCBzdGFydCwgb2ZmLCBjb3VudCwgZW9mLCBsZW4pOworfQorCitzdGF0aWMgaW50IGNtZGxpbmVfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCSBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW47CisKKwlsZW4gPSBzcHJpbnRmKHBhZ2UsICIlc1xuIiwgc2F2ZWRfY29tbWFuZF9saW5lKTsKKwlyZXR1cm4gcHJvY19jYWxjX21ldHJpY3MocGFnZSwgc3RhcnQsIG9mZiwgY291bnQsIGVvZiwgbGVuKTsKK30KKworc3RhdGljIGludCBsb2Nrc19yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbiA9IGdldF9sb2Nrc19zdGF0dXMocGFnZSwgc3RhcnQsIG9mZiwgY291bnQpOworCisJaWYgKGxlbiA8IGNvdW50KQorCQkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGV4ZWNkb21haW5zX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCQkgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gZ2V0X2V4ZWNfZG9tYWluX2xpc3QocGFnZSk7CisJcmV0dXJuIHByb2NfY2FsY19tZXRyaWNzKHBhZ2UsIHN0YXJ0LCBvZmYsIGNvdW50LCBlb2YsIGxlbik7Cit9CisKKyNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKKy8qCisgKiB3cml0aW5nICdDJyB0byAvcHJvYy9zeXNycS10cmlnZ2VyIGlzIGxpa2Ugc3lzcnEtQworICovCitzdGF0aWMgc3NpemVfdCB3cml0ZV9zeXNycV90cmlnZ2VyKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWlmIChjb3VudCkgeworCQljaGFyIGM7CisKKwkJaWYgKGdldF91c2VyKGMsIGJ1ZikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJX19oYW5kbGVfc3lzcnEoYywgTlVMTCwgTlVMTCwgMCk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19zeXNycV90cmlnZ2VyX29wZXJhdGlvbnMgPSB7CisJLndyaXRlCQk9IHdyaXRlX3N5c3JxX3RyaWdnZXIsCit9OworI2VuZGlmCisKK3N0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19yb290X2tjb3JlOworCit2b2lkIGNyZWF0ZV9zZXFfZW50cnkoY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmYpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKKwllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KG5hbWUsIG1vZGUsIE5VTEwpOworCWlmIChlbnRyeSkKKwkJZW50cnktPnByb2NfZm9wcyA9IGY7Cit9CisKK3ZvaWQgX19pbml0IHByb2NfbWlzY19pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKKwlzdGF0aWMgc3RydWN0IHsKKwkJY2hhciAqbmFtZTsKKwkJaW50ICgqcmVhZF9wcm9jKShjaGFyKixjaGFyKiosb2ZmX3QsaW50LGludCosdm9pZCopOworCX0gKnAsIHNpbXBsZV9vbmVzW10gPSB7CisJCXsibG9hZGF2ZyIsICAgICBsb2FkYXZnX3JlYWRfcHJvY30sCisJCXsidXB0aW1lIiwJdXB0aW1lX3JlYWRfcHJvY30sCisJCXsibWVtaW5mbyIsCW1lbWluZm9fcmVhZF9wcm9jfSwKKwkJeyJ2ZXJzaW9uIiwJdmVyc2lvbl9yZWFkX3Byb2N9LAorI2lmZGVmIENPTkZJR19QUk9DX0hBUkRXQVJFCisJCXsiaGFyZHdhcmUiLAloYXJkd2FyZV9yZWFkX3Byb2N9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NUUkFNX1BST0MKKwkJeyJzdHJhbSIsCXN0cmFtX3JlYWRfcHJvY30sCisjZW5kaWYKKwkJeyJkZXZpY2VzIiwJZGV2aWNlc19yZWFkX3Byb2N9LAorCQl7ImZpbGVzeXN0ZW1zIiwJZmlsZXN5c3RlbXNfcmVhZF9wcm9jfSwKKwkJeyJjbWRsaW5lIiwJY21kbGluZV9yZWFkX3Byb2N9LAorCQl7ImxvY2tzIiwJbG9ja3NfcmVhZF9wcm9jfSwKKwkJeyJleGVjZG9tYWlucyIsCWV4ZWNkb21haW5zX3JlYWRfcHJvY30sCisJCXtOVUxMLH0KKwl9OworCWZvciAocCA9IHNpbXBsZV9vbmVzOyBwLT5uYW1lOyBwKyspCisJCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkocC0+bmFtZSwgMCwgTlVMTCwgcC0+cmVhZF9wcm9jLCBOVUxMKTsKKworCXByb2Nfc3ltbGluaygibW91bnRzIiwgTlVMTCwgInNlbGYvbW91bnRzIik7CisKKwkvKiBBbmQgbm93IGZvciB0cmlja2llciBvbmVzICovCisJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgia21zZyIsIFNfSVJVU1IsICZwcm9jX3Jvb3QpOworCWlmIChlbnRyeSkKKwkJZW50cnktPnByb2NfZm9wcyA9ICZwcm9jX2ttc2dfb3BlcmF0aW9uczsKKwljcmVhdGVfc2VxX2VudHJ5KCJjcHVpbmZvIiwgMCwgJnByb2NfY3B1aW5mb19vcGVyYXRpb25zKTsKKwljcmVhdGVfc2VxX2VudHJ5KCJwYXJ0aXRpb25zIiwgMCwgJnByb2NfcGFydGl0aW9uc19vcGVyYXRpb25zKTsKKwljcmVhdGVfc2VxX2VudHJ5KCJzdGF0IiwgMCwgJnByb2Nfc3RhdF9vcGVyYXRpb25zKTsKKwljcmVhdGVfc2VxX2VudHJ5KCJpbnRlcnJ1cHRzIiwgMCwgJnByb2NfaW50ZXJydXB0c19vcGVyYXRpb25zKTsKKwljcmVhdGVfc2VxX2VudHJ5KCJzbGFiaW5mbyIsU19JV1VTUnxTX0lSVUdPLCZwcm9jX3NsYWJpbmZvX29wZXJhdGlvbnMpOworCWNyZWF0ZV9zZXFfZW50cnkoImJ1ZGR5aW5mbyIsU19JUlVHTywgJmZyYWdtZW50YXRpb25fZmlsZV9vcGVyYXRpb25zKTsKKwljcmVhdGVfc2VxX2VudHJ5KCJ2bXN0YXQiLFNfSVJVR08sICZwcm9jX3Ztc3RhdF9maWxlX29wZXJhdGlvbnMpOworCWNyZWF0ZV9zZXFfZW50cnkoImRpc2tzdGF0cyIsIDAsICZwcm9jX2Rpc2tzdGF0c19vcGVyYXRpb25zKTsKKyNpZmRlZiBDT05GSUdfTU9EVUxFUworCWNyZWF0ZV9zZXFfZW50cnkoIm1vZHVsZXMiLCAwLCAmcHJvY19tb2R1bGVzX29wZXJhdGlvbnMpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKKwljcmVhdGVfc2VxX2VudHJ5KCJzY2hlZHN0YXQiLCAwLCAmcHJvY19zY2hlZHN0YXRfb3BlcmF0aW9ucyk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUFJPQ19LQ09SRQorCXByb2Nfcm9vdF9rY29yZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJrY29yZSIsIFNfSVJVU1IsIE5VTEwpOworCWlmIChwcm9jX3Jvb3Rfa2NvcmUpIHsKKwkJcHJvY19yb290X2tjb3JlLT5wcm9jX2ZvcHMgPSAmcHJvY19rY29yZV9vcGVyYXRpb25zOworCQlwcm9jX3Jvb3Rfa2NvcmUtPnNpemUgPQorCQkJCShzaXplX3QpaGlnaF9tZW1vcnkgLSBQQUdFX09GRlNFVCArIFBBR0VfU0laRTsKKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKKwllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJzeXNycS10cmlnZ2VyIiwgU19JV1VTUiwgTlVMTCk7CisJaWYgKGVudHJ5KQorCQllbnRyeS0+cHJvY19mb3BzID0gJnByb2Nfc3lzcnFfdHJpZ2dlcl9vcGVyYXRpb25zOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1BQQzMyCisJeworCQlleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcGNfaHRhYl9vcGVyYXRpb25zOworCQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJwcGNfaHRhYiIsIFNfSVJVR098U19JV1VTUiwgTlVMTCk7CisJCWlmIChlbnRyeSkKKwkJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmcHBjX2h0YWJfb3BlcmF0aW9uczsKKwl9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2ZzL3Byb2MvcHJvY190dHkuYyBiL2ZzL3Byb2MvcHJvY190dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWM0NDU1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcHJvYy9wcm9jX3R0eS5jCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogcHJvY190dHkuYyAtLSBoYW5kbGVzIC9wcm9jL3R0eQorICoKKyAqIENvcHlyaWdodCAxOTk3LCBUaGVvZG9yZSBUcydvCisgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCitzdGF0aWMgaW50IHR0eV9sZGlzY3NfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworCisvKgorICogVGhlIC9wcm9jL3R0eSBkaXJlY3RvcnkgaW5vZGVzLi4uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfdHR5X2xkaXNjLCAqcHJvY190dHlfZHJpdmVyOworCisvKgorICogVGhpcyBpcyB0aGUgaGFuZGxlciBmb3IgL3Byb2MvdHR5L2RyaXZlcnMKKyAqLworc3RhdGljIHZvaWQgc2hvd190dHlfcmFuZ2Uoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdHR5X2RyaXZlciAqcCwKKwlkZXZfdCBmcm9tLCBpbnQgbnVtKQoreworCXNlcV9wcmludGYobSwgIiUtMjBzICIsIHAtPmRyaXZlcl9uYW1lID8gcC0+ZHJpdmVyX25hbWUgOiAidW5rbm93biIpOworCXNlcV9wcmludGYobSwgIi9kZXYvJS04cyAiLCBwLT5uYW1lKTsKKwlpZiAocC0+bnVtID4gMSkgeworCQlzZXFfcHJpbnRmKG0sICIlM2QgJWQtJWQgIiwgTUFKT1IoZnJvbSksIE1JTk9SKGZyb20pLAorCQkJTUlOT1IoZnJvbSkgKyBudW0gLSAxKTsKKwl9IGVsc2UgeworCQlzZXFfcHJpbnRmKG0sICIlM2QgJTdkICIsIE1BSk9SKGZyb20pLCBNSU5PUihmcm9tKSk7CisJfQorCXN3aXRjaCAocC0+dHlwZSkgeworCWNhc2UgVFRZX0RSSVZFUl9UWVBFX1NZU1RFTToKKwkJc2VxX3ByaW50ZihtLCAic3lzdGVtIik7CisJCWlmIChwLT5zdWJ0eXBlID09IFNZU1RFTV9UWVBFX1RUWSkKKwkJCXNlcV9wcmludGYobSwgIjovZGV2L3R0eSIpOworCQllbHNlIGlmIChwLT5zdWJ0eXBlID09IFNZU1RFTV9UWVBFX1NZU0NPTlMpCisJCQlzZXFfcHJpbnRmKG0sICI6Y29uc29sZSIpOworCQllbHNlIGlmIChwLT5zdWJ0eXBlID09IFNZU1RFTV9UWVBFX0NPTlNPTEUpCisJCQlzZXFfcHJpbnRmKG0sICI6dnRtYXN0ZXIiKTsKKwkJYnJlYWs7CisJY2FzZSBUVFlfRFJJVkVSX1RZUEVfQ09OU09MRToKKwkJc2VxX3ByaW50ZihtLCAiY29uc29sZSIpOworCQlicmVhazsKKwljYXNlIFRUWV9EUklWRVJfVFlQRV9TRVJJQUw6CisJCXNlcV9wcmludGYobSwgInNlcmlhbCIpOworCQlicmVhazsKKwljYXNlIFRUWV9EUklWRVJfVFlQRV9QVFk6CisJCWlmIChwLT5zdWJ0eXBlID09IFBUWV9UWVBFX01BU1RFUikKKwkJCXNlcV9wcmludGYobSwgInB0eTptYXN0ZXIiKTsKKwkJZWxzZSBpZiAocC0+c3VidHlwZSA9PSBQVFlfVFlQRV9TTEFWRSkKKwkJCXNlcV9wcmludGYobSwgInB0eTpzbGF2ZSIpOworCQllbHNlCisJCQlzZXFfcHJpbnRmKG0sICJwdHkiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2VxX3ByaW50ZihtLCAidHlwZTolZC4lZCIsIHAtPnR5cGUsIHAtPnN1YnR5cGUpOworCX0KKwlzZXFfcHV0YyhtLCAnXG4nKTsKK30KKworc3RhdGljIGludCBzaG93X3R0eV9kcml2ZXIoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCB0dHlfZHJpdmVyICpwID0gdjsKKwlkZXZfdCBmcm9tID0gTUtERVYocC0+bWFqb3IsIHAtPm1pbm9yX3N0YXJ0KTsKKwlkZXZfdCB0byA9IGZyb20gKyBwLT5udW07CisKKwlpZiAoJnAtPnR0eV9kcml2ZXJzID09IHR0eV9kcml2ZXJzLm5leHQpIHsKKwkJLyogcHNldWRvLWRyaXZlcnMgZmlyc3QgKi8KKwkJc2VxX3ByaW50ZihtLCAiJS0yMHMgL2Rldi8lLThzICIsICIvZGV2L3R0eSIsICJ0dHkiKTsKKwkJc2VxX3ByaW50ZihtLCAiJTNkICU3ZCAiLCBUVFlBVVhfTUFKT1IsIDApOworCQlzZXFfcHJpbnRmKG0sICJzeXN0ZW06L2Rldi90dHlcbiIpOworCQlzZXFfcHJpbnRmKG0sICIlLTIwcyAvZGV2LyUtOHMgIiwgIi9kZXYvY29uc29sZSIsICJjb25zb2xlIik7CisJCXNlcV9wcmludGYobSwgIiUzZCAlN2QgIiwgVFRZQVVYX01BSk9SLCAxKTsKKwkJc2VxX3ByaW50ZihtLCAic3lzdGVtOmNvbnNvbGVcbiIpOworI2lmZGVmIENPTkZJR19VTklYOThfUFRZUworCQlzZXFfcHJpbnRmKG0sICIlLTIwcyAvZGV2LyUtOHMgIiwgIi9kZXYvcHRteCIsICJwdG14Iik7CisJCXNlcV9wcmludGYobSwgIiUzZCAlN2QgIiwgVFRZQVVYX01BSk9SLCAyKTsKKwkJc2VxX3ByaW50ZihtLCAic3lzdGVtXG4iKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19WVAorCQlzZXFfcHJpbnRmKG0sICIlLTIwcyAvZGV2LyUtOHMgIiwgIi9kZXYvdmMvMCIsICJ2Yy8wIik7CisJCXNlcV9wcmludGYobSwgIiUzZCAlN2QgIiwgVFRZX01BSk9SLCAwKTsKKwkJc2VxX3ByaW50ZihtLCAic3lzdGVtOnZ0bWFzdGVyXG4iKTsKKyNlbmRpZgorCX0KKworCXdoaWxlIChNQUpPUihmcm9tKSA8IE1BSk9SKHRvKSkgeworCQlkZXZfdCBuZXh0ID0gTUtERVYoTUFKT1IoZnJvbSkrMSwgMCk7CisJCXNob3dfdHR5X3JhbmdlKG0sIHAsIGZyb20sIG5leHQgLSBmcm9tKTsKKwkJZnJvbSA9IG5leHQ7CisJfQorCWlmIChmcm9tICE9IHRvKQorCQlzaG93X3R0eV9yYW5nZShtLCBwLCBmcm9tLCB0byAtIGZyb20pOworCXJldHVybiAwOworfQorCisvKiBpdGVyYXRvciAqLworc3RhdGljIHZvaWQgKnRfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCWxvZmZfdCBsID0gKnBvczsKKwlsaXN0X2Zvcl9lYWNoKHAsICZ0dHlfZHJpdmVycykKKwkJaWYgKCFsLS0pCisJCQlyZXR1cm4gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgdHR5X2RyaXZlciwgdHR5X2RyaXZlcnMpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqdF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcCA9ICgoc3RydWN0IHR0eV9kcml2ZXIgKil2KS0+dHR5X2RyaXZlcnMubmV4dDsKKwkoKnBvcykrKzsKKwlyZXR1cm4gcD09JnR0eV9kcml2ZXJzID8gTlVMTCA6CisJCQlsaXN0X2VudHJ5KHAsIHN0cnVjdCB0dHlfZHJpdmVyLCB0dHlfZHJpdmVycyk7Cit9CisKK3N0YXRpYyB2b2lkIHRfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgdHR5X2RyaXZlcnNfb3AgPSB7CisJLnN0YXJ0CT0gdF9zdGFydCwKKwkubmV4dAk9IHRfbmV4dCwKKwkuc3RvcAk9IHRfc3RvcCwKKwkuc2hvdwk9IHNob3dfdHR5X2RyaXZlcgorfTsKKworc3RhdGljIGludCB0dHlfZHJpdmVyc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmdHR5X2RyaXZlcnNfb3ApOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3R0eV9kcml2ZXJzX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gdHR5X2RyaXZlcnNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIGhhbmRsZXIgZm9yIC9wcm9jL3R0eS9sZGlzY3MKKyAqLworc3RhdGljIGludCB0dHlfbGRpc2NzX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCQlpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludAlpOworCWludAlsZW4gPSAwOworCW9mZl90CWJlZ2luID0gMDsKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKwkKKwlmb3IgKGk9MDsgaSA8IE5SX0xESVNDUzsgaSsrKSB7CisJCWxkID0gdHR5X2xkaXNjX2dldChpKTsKKwkJaWYgKGxkID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIlLTEwcyAlMmRcbiIsCisJCQkgICAgICAgbGQtPm5hbWUgPyBsZC0+bmFtZSA6ICI/Pz8iLCBpKTsKKwkJdHR5X2xkaXNjX3B1dChpKTsKKwkJaWYgKGxlbitiZWdpbiA+IG9mZitjb3VudCkKKwkJCWJyZWFrOworCQlpZiAobGVuK2JlZ2luIDwgb2ZmKSB7CisJCQliZWdpbiArPSBsZW47CisJCQlsZW4gPSAwOworCQl9CisJfQorCWlmIChpID49IE5SX0xESVNDUykKKwkJKmVvZiA9IDE7CisJaWYgKG9mZiA+PSBsZW4rYmVnaW4pCisJCXJldHVybiAwOworCSpzdGFydCA9IHBhZ2UgKyAob2ZmLWJlZ2luKTsKKwlyZXR1cm4gKChjb3VudCA8IGJlZ2luK2xlbi1vZmYpID8gY291bnQgOiBiZWdpbitsZW4tb2ZmKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHR0eV9yZWdpc3Rlcl9kcml2ZXIoKSB0byBoYW5kbGUKKyAqIHJlZ2lzdGVyaW5nIHRoZSBkcml2ZXIncyAvcHJvYyBoYW5kbGVyIGludG8gL3Byb2MvdHR5L2RyaXZlci88Zm9vPgorICovCit2b2lkIHByb2NfdHR5X3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50OworCQkKKwlpZiAoKCFkcml2ZXItPnJlYWRfcHJvYyAmJiAhZHJpdmVyLT53cml0ZV9wcm9jKSB8fAorCSAgICAhZHJpdmVyLT5kcml2ZXJfbmFtZSB8fAorCSAgICBkcml2ZXItPnByb2NfZW50cnkpCisJCXJldHVybjsKKworCWVudCA9IGNyZWF0ZV9wcm9jX2VudHJ5KGRyaXZlci0+ZHJpdmVyX25hbWUsIDAsIHByb2NfdHR5X2RyaXZlcik7CisJaWYgKCFlbnQpCisJCXJldHVybjsKKwllbnQtPnJlYWRfcHJvYyA9IGRyaXZlci0+cmVhZF9wcm9jOworCWVudC0+d3JpdGVfcHJvYyA9IGRyaXZlci0+d3JpdGVfcHJvYzsKKwllbnQtPm93bmVyID0gZHJpdmVyLT5vd25lcjsKKwllbnQtPmRhdGEgPSBkcml2ZXI7CisKKwlkcml2ZXItPnByb2NfZW50cnkgPSBlbnQ7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoKQorICovCit2b2lkIHByb2NfdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CisKKwllbnQgPSBkcml2ZXItPnByb2NfZW50cnk7CisJaWYgKCFlbnQpCisJCXJldHVybjsKKwkJCisJcmVtb3ZlX3Byb2NfZW50cnkoZHJpdmVyLT5kcml2ZXJfbmFtZSwgcHJvY190dHlfZHJpdmVyKTsKKwkKKwlkcml2ZXItPnByb2NfZW50cnkgPSBOVUxMOworfQorCisvKgorICogQ2FsbGVkIGJ5IHByb2Nfcm9vdF9pbml0KCkgdG8gaW5pdGlhbGl6ZSB0aGUgL3Byb2MvdHR5IHN1YnRyZWUKKyAqLwordm9pZCBfX2luaXQgcHJvY190dHlfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnk7CisJaWYgKCFwcm9jX21rZGlyKCJ0dHkiLCBOVUxMKSkKKwkJcmV0dXJuOworCXByb2NfdHR5X2xkaXNjID0gcHJvY19ta2RpcigidHR5L2xkaXNjIiwgTlVMTCk7CisJLyoKKwkgKiAvcHJvYy90dHkvZHJpdmVyL3NlcmlhbCByZXZlYWxzIHRoZSBleGFjdCBjaGFyYWN0ZXIgY291bnRzIGZvcgorCSAqIHNlcmlhbCBsaW5rcyB3aGljaCBpcyBqdXN0IHRvbyBlYXN5IHRvIGFidXNlIGZvciBpbmZlcnJpbmcKKwkgKiBwYXNzd29yZCBsZW5ndGhzIGFuZCBpbnRlci1rZXlzdHJva2UgdGltaW5ncyBkdXJpbmcgcGFzc3dvcmQKKwkgKiBlbnRyeS4KKwkgKi8KKwlwcm9jX3R0eV9kcml2ZXIgPSBwcm9jX21rZGlyX21vZGUoInR0eS9kcml2ZXIiLCBTX0lSVVNSIHwgU19JWFVTUiwgTlVMTCk7CisKKwljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJ0dHkvbGRpc2NzIiwgMCwgTlVMTCwgdHR5X2xkaXNjc19yZWFkX3Byb2MsIE5VTEwpOworCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoInR0eS9kcml2ZXJzIiwgMCwgTlVMTCk7CisJaWYgKGVudHJ5KQorCQllbnRyeS0+cHJvY19mb3BzID0gJnByb2NfdHR5X2RyaXZlcnNfb3BlcmF0aW9uczsKK30KZGlmZiAtLWdpdCBhL2ZzL3Byb2Mvcm9vdC5jIGIvZnMvcHJvYy9yb290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmMTQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Byb2Mvcm9vdC5jCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogIGxpbnV4L2ZzL3Byb2Mvcm9vdC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcworICoKKyAqICBwcm9jIHJvb3QgZGlyZWN0b3J5IGhhbmRsaW5nIGZ1bmN0aW9ucworICovCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX25ldCwgKnByb2NfbmV0X3N0YXQsICpwcm9jX2J1cywgKnByb2Nfcm9vdF9mcywgKnByb2Nfcm9vdF9kcml2ZXI7CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2Nfc3lzX3Jvb3Q7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqcHJvY19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwgcHJvY19maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHByb2NfZnNfdHlwZSA9IHsKKwkubmFtZQkJPSAicHJvYyIsCisJLmdldF9zYgkJPSBwcm9jX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYW5vbl9zdXBlciwKK307CisKK2V4dGVybiBpbnQgX19pbml0IHByb2NfaW5pdF9pbm9kZWNhY2hlKHZvaWQpOwordm9pZCBfX2luaXQgcHJvY19yb290X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyID0gcHJvY19pbml0X2lub2RlY2FjaGUoKTsKKwlpZiAoZXJyKQorCQlyZXR1cm47CisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmcHJvY19mc190eXBlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm47CisJcHJvY19tbnQgPSBrZXJuX21vdW50KCZwcm9jX2ZzX3R5cGUpOworCWVyciA9IFBUUl9FUlIocHJvY19tbnQpOworCWlmIChJU19FUlIocHJvY19tbnQpKSB7CisJCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmcHJvY19mc190eXBlKTsKKwkJcmV0dXJuOworCX0KKwlwcm9jX21pc2NfaW5pdCgpOworCXByb2NfbmV0ID0gcHJvY19ta2RpcigibmV0IiwgTlVMTCk7CisJcHJvY19uZXRfc3RhdCA9IHByb2NfbWtkaXIoIm5ldC9zdGF0IiwgTlVMTCk7CisKKyNpZmRlZiBDT05GSUdfU1lTVklQQworCXByb2NfbWtkaXIoInN5c3ZpcGMiLCBOVUxMKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNDVEwKKwlwcm9jX3N5c19yb290ID0gcHJvY19ta2Rpcigic3lzIiwgTlVMTCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19CSU5GTVRfTUlTQykgfHwgZGVmaW5lZChDT05GSUdfQklORk1UX01JU0NfTU9EVUxFKQorCXByb2NfbWtkaXIoInN5cy9mcyIsIE5VTEwpOworCXByb2NfbWtkaXIoInN5cy9mcy9iaW5mbXRfbWlzYyIsIE5VTEwpOworI2VuZGlmCisJcHJvY19yb290X2ZzID0gcHJvY19ta2RpcigiZnMiLCBOVUxMKTsKKwlwcm9jX3Jvb3RfZHJpdmVyID0gcHJvY19ta2RpcigiZHJpdmVyIiwgTlVMTCk7CisJcHJvY19ta2RpcigiZnMvbmZzZCIsIE5VTEwpOyAvKiBzb21ld2hlcmUgZm9yIHRoZSBuZnNkIGZpbGVzeXN0ZW0gdG8gYmUgbW91bnRlZCAqLworI2lmIGRlZmluZWQoQ09ORklHX1NVTl9PUEVOUFJPTUZTKSB8fCBkZWZpbmVkKENPTkZJR19TVU5fT1BFTlBST01GU19NT0RVTEUpCisJLyoganVzdCBnaXZlIGl0IGEgbW91bnRwb2ludCAqLworCXByb2NfbWtkaXIoIm9wZW5wcm9tIiwgTlVMTCk7CisjZW5kaWYKKwlwcm9jX3R0eV9pbml0KCk7CisjaWZkZWYgQ09ORklHX1BST0NfREVWSUNFVFJFRQorCXByb2NfZGV2aWNlX3RyZWVfaW5pdCgpOworI2VuZGlmCisJcHJvY19idXMgPSBwcm9jX21rZGlyKCJidXMiLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKnByb2Nfcm9vdF9sb29rdXAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwkvKgorCSAqIG5yX3RocmVhZHMgaXMgYWN0dWFsbHkgcHJvdGVjdGVkIGJ5IHRoZSB0YXNrbGlzdF9sb2NrOworCSAqIGhvd2V2ZXIsIGl0J3MgY29udmVudGlvbmFsIHRvIGRvIHJlYWRzLCBlc3BlY2lhbGx5IGZvcgorCSAqIHJlcG9ydGluZywgd2l0aG91dCBhbnkgbG9ja2luZyB3aGF0c29ldmVyLgorCSAqLworCWlmIChkaXItPmlfaW5vID09IFBST0NfUk9PVF9JTk8pIC8qIGNoZWNrIGZvciBzYWZldHkuLi4gKi8KKwkJZGlyLT5pX25saW5rID0gcHJvY19yb290Lm5saW5rICsgbnJfdGhyZWFkczsKKworCWlmICghcHJvY19sb29rdXAoZGlyLCBkZW50cnksIG5kKSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJcmV0dXJuIHByb2NfcGlkX2xvb2t1cChkaXIsIGRlbnRyeSwgbmQpOworfQorCitzdGF0aWMgaW50IHByb2Nfcm9vdF9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwKKwl2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwl1bnNpZ25lZCBpbnQgbnIgPSBmaWxwLT5mX3BvczsKKwlpbnQgcmV0OworCisJbG9ja19rZXJuZWwoKTsKKworCWlmIChuciA8IEZJUlNUX1BST0NFU1NfRU5UUlkpIHsKKwkJaW50IGVycm9yID0gcHJvY19yZWFkZGlyKGZpbHAsIGRpcmVudCwgZmlsbGRpcik7CisJCWlmIChlcnJvciA8PSAwKSB7CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJZmlscC0+Zl9wb3MgPSBGSVJTVF9QUk9DRVNTX0VOVFJZOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXQgPSBwcm9jX3BpZF9yZWFkZGlyKGZpbHAsIGRpcmVudCwgZmlsbGRpcik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoZSByb290IC9wcm9jIGRpcmVjdG9yeSBpcyBzcGVjaWFsLCBhcyBpdCBoYXMgdGhlCisgKiA8cGlkPiBkaXJlY3Rvcmllcy4gVGh1cyB3ZSBkb24ndCB1c2UgdGhlIGdlbmVyaWMKKyAqIGRpcmVjdG9yeSBoYW5kbGluZyBmdW5jdGlvbnMgZm9yIHRoYXQuLgorICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3Jvb3Rfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJID0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgkgPSBwcm9jX3Jvb3RfcmVhZGRpciwKK307CisKKy8qCisgKiBwcm9jIHJvb3QgY2FuIGRvIGFsbW9zdCBub3RoaW5nLi4KKyAqLworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHByb2Nfcm9vdF9pbm9kZV9vcGVyYXRpb25zID0geworCS5sb29rdXAJCT0gcHJvY19yb290X2xvb2t1cCwKK307CisKKy8qCisgKiBUaGlzIGlzIHRoZSByb290ICJpbm9kZSIgaW4gdGhlIC9wcm9jIHRyZWUuLgorICovCitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgcHJvY19yb290ID0geworCS5sb3dfaW5vCT0gUFJPQ19ST09UX0lOTywgCisJLm5hbWVsZW4JPSA1LCAKKwkubmFtZQkJPSAiL3Byb2MiLAorCS5tb2RlCQk9IFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTywgCisJLm5saW5rCQk9IDIsIAorCS5wcm9jX2lvcHMJPSAmcHJvY19yb290X2lub2RlX29wZXJhdGlvbnMsIAorCS5wcm9jX2ZvcHMJPSAmcHJvY19yb290X29wZXJhdGlvbnMsCisJLnBhcmVudAkJPSAmcHJvY19yb290LAorfTsKKworRVhQT1JUX1NZTUJPTChwcm9jX3N5bWxpbmspOworRVhQT1JUX1NZTUJPTChwcm9jX21rZGlyKTsKK0VYUE9SVF9TWU1CT0woY3JlYXRlX3Byb2NfZW50cnkpOworRVhQT1JUX1NZTUJPTChyZW1vdmVfcHJvY19lbnRyeSk7CitFWFBPUlRfU1lNQk9MKHByb2Nfcm9vdCk7CitFWFBPUlRfU1lNQk9MKHByb2Nfcm9vdF9mcyk7CitFWFBPUlRfU1lNQk9MKHByb2NfbmV0KTsKK0VYUE9SVF9TWU1CT0wocHJvY19uZXRfc3RhdCk7CitFWFBPUlRfU1lNQk9MKHByb2NfYnVzKTsKK0VYUE9SVF9TWU1CT0wocHJvY19yb290X2RyaXZlcik7CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Rhc2tfbW11LmMgYi9mcy9wcm9jL3Rhc2tfbW11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiNGEwMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Byb2MvdGFza19tbXUuYwpAQCAtMCwwICsxLDIzNSBAQAorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxhc20vZWxmLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitjaGFyICp0YXNrX21lbShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgY2hhciAqYnVmZmVyKQoreworCXVuc2lnbmVkIGxvbmcgZGF0YSwgdGV4dCwgbGliOworCisJZGF0YSA9IG1tLT50b3RhbF92bSAtIG1tLT5zaGFyZWRfdm0gLSBtbS0+c3RhY2tfdm07CisJdGV4dCA9IChQQUdFX0FMSUdOKG1tLT5lbmRfY29kZSkgLSAobW0tPnN0YXJ0X2NvZGUgJiBQQUdFX01BU0spKSA+PiAxMDsKKwlsaWIgPSAobW0tPmV4ZWNfdm0gPDwgKFBBR0VfU0hJRlQtMTApKSAtIHRleHQ7CisJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLAorCQkiVm1TaXplOlx0JThsdSBrQlxuIgorCQkiVm1MY2s6XHQlOGx1IGtCXG4iCisJCSJWbVJTUzpcdCU4bHUga0JcbiIKKwkJIlZtRGF0YTpcdCU4bHUga0JcbiIKKwkJIlZtU3RrOlx0JThsdSBrQlxuIgorCQkiVm1FeGU6XHQlOGx1IGtCXG4iCisJCSJWbUxpYjpcdCU4bHUga0JcbiIKKwkJIlZtUFRFOlx0JThsdSBrQlxuIiwKKwkJKG1tLT50b3RhbF92bSAtIG1tLT5yZXNlcnZlZF92bSkgPDwgKFBBR0VfU0hJRlQtMTApLAorCQltbS0+bG9ja2VkX3ZtIDw8IChQQUdFX1NISUZULTEwKSwKKwkJZ2V0X21tX2NvdW50ZXIobW0sIHJzcykgPDwgKFBBR0VfU0hJRlQtMTApLAorCQlkYXRhIDw8IChQQUdFX1NISUZULTEwKSwKKwkJbW0tPnN0YWNrX3ZtIDw8IChQQUdFX1NISUZULTEwKSwgdGV4dCwgbGliLAorCQkoUFRSU19QRVJfUFRFKnNpemVvZihwdGVfdCkqbW0tPm5yX3B0ZXMpID4+IDEwKTsKKwlyZXR1cm4gYnVmZmVyOworfQorCit1bnNpZ25lZCBsb25nIHRhc2tfdnNpemUoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJcmV0dXJuIFBBR0VfU0laRSAqIG1tLT50b3RhbF92bTsKK30KKworaW50IHRhc2tfc3RhdG0oc3RydWN0IG1tX3N0cnVjdCAqbW0sIGludCAqc2hhcmVkLCBpbnQgKnRleHQsCisJICAgICAgIGludCAqZGF0YSwgaW50ICpyZXNpZGVudCkKK3sKKwlpbnQgcnNzID0gZ2V0X21tX2NvdW50ZXIobW0sIHJzcyk7CisKKwkqc2hhcmVkID0gcnNzIC0gZ2V0X21tX2NvdW50ZXIobW0sIGFub25fcnNzKTsKKwkqdGV4dCA9IChQQUdFX0FMSUdOKG1tLT5lbmRfY29kZSkgLSAobW0tPnN0YXJ0X2NvZGUgJiBQQUdFX01BU0spKQorCQkJCQkJCQk+PiBQQUdFX1NISUZUOworCSpkYXRhID0gbW0tPnRvdGFsX3ZtIC0gbW0tPnNoYXJlZF92bTsKKwkqcmVzaWRlbnQgPSByc3M7CisJcmV0dXJuIG1tLT50b3RhbF92bTsKK30KKworaW50IHByb2NfZXhlX2xpbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSwgc3RydWN0IHZmc21vdW50ICoqbW50KQoreworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYTsKKwlpbnQgcmVzdWx0ID0gLUVOT0VOVDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOworCXN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSA9IGdldF90YXNrX21tKHRhc2spOworCisJaWYgKCFtbSkKKwkJZ290byBvdXQ7CisJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOworCisJdm1hID0gbW0tPm1tYXA7CisJd2hpbGUgKHZtYSkgeworCQlpZiAoKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDVVRBQkxFKSAmJiB2bWEtPnZtX2ZpbGUpCisJCQlicmVhazsKKwkJdm1hID0gdm1hLT52bV9uZXh0OworCX0KKworCWlmICh2bWEpIHsKKwkJKm1udCA9IG1udGdldCh2bWEtPnZtX2ZpbGUtPmZfdmZzbW50KTsKKwkJKmRlbnRyeSA9IGRnZXQodm1hLT52bV9maWxlLT5mX2RlbnRyeSk7CisJCXJlc3VsdCA9IDA7CisJfQorCisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwltbXB1dChtbSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgcGFkX2xlbl9zcGFjZXMoc3RydWN0IHNlcV9maWxlICptLCBpbnQgbGVuKQoreworCWxlbiA9IDI1ICsgc2l6ZW9mKHZvaWQqKSAqIDYgLSBsZW47CisJaWYgKGxlbiA8IDEpCisJCWxlbiA9IDE7CisJc2VxX3ByaW50ZihtLCAiJSpjIiwgbGVuLCAnICcpOworfQorCitzdGF0aWMgaW50IHNob3dfbWFwKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBtLT5wcml2YXRlOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqbWFwID0gdjsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IG1hcC0+dm1fbW07CisJc3RydWN0IGZpbGUgKmZpbGUgPSBtYXAtPnZtX2ZpbGU7CisJaW50IGZsYWdzID0gbWFwLT52bV9mbGFnczsKKwl1bnNpZ25lZCBsb25nIGlubyA9IDA7CisJZGV2X3QgZGV2ID0gMDsKKwlpbnQgbGVuOworCisJaWYgKGZpbGUpIHsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcC0+dm1fZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJCWRldiA9IGlub2RlLT5pX3NiLT5zX2RldjsKKwkJaW5vID0gaW5vZGUtPmlfaW5vOworCX0KKworCXNlcV9wcmludGYobSwgIiUwOGx4LSUwOGx4ICVjJWMlYyVjICUwOGx4ICUwMng6JTAyeCAlbHUgJW4iLAorCQkJbWFwLT52bV9zdGFydCwKKwkJCW1hcC0+dm1fZW5kLAorCQkJZmxhZ3MgJiBWTV9SRUFEID8gJ3InIDogJy0nLAorCQkJZmxhZ3MgJiBWTV9XUklURSA/ICd3JyA6ICctJywKKwkJCWZsYWdzICYgVk1fRVhFQyA/ICd4JyA6ICctJywKKwkJCWZsYWdzICYgVk1fTUFZU0hBUkUgPyAncycgOiAncCcsCisJCQltYXAtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQsCisJCQlNQUpPUihkZXYpLCBNSU5PUihkZXYpLCBpbm8sICZsZW4pOworCisJLyoKKwkgKiBQcmludCB0aGUgZGVudHJ5IG5hbWUgZm9yIG5hbWVkIG1hcHBpbmdzLCBhbmQgYQorCSAqIHNwZWNpYWwgW2hlYXBdIG1hcmtlciBmb3IgdGhlIGhlYXA6CisJICovCisJaWYgKG1hcC0+dm1fZmlsZSkgeworCQlwYWRfbGVuX3NwYWNlcyhtLCBsZW4pOworCQlzZXFfcGF0aChtLCBmaWxlLT5mX3Zmc21udCwgZmlsZS0+Zl9kZW50cnksICIiKTsKKwl9IGVsc2UgeworCQlpZiAobW0pIHsKKwkJCWlmIChtYXAtPnZtX3N0YXJ0IDw9IG1tLT5zdGFydF9icmsgJiYKKwkJCQkJCW1hcC0+dm1fZW5kID49IG1tLT5icmspIHsKKwkJCQlwYWRfbGVuX3NwYWNlcyhtLCBsZW4pOworCQkJCXNlcV9wdXRzKG0sICJbaGVhcF0iKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG1hcC0+dm1fc3RhcnQgPD0gbW0tPnN0YXJ0X3N0YWNrICYmCisJCQkJCW1hcC0+dm1fZW5kID49IG1tLT5zdGFydF9zdGFjaykgeworCisJCQkJCXBhZF9sZW5fc3BhY2VzKG0sIGxlbik7CisJCQkJCXNlcV9wdXRzKG0sICJbc3RhY2tdIik7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJcGFkX2xlbl9zcGFjZXMobSwgbGVuKTsKKwkJCXNlcV9wdXRzKG0sICJbdmRzb10iKTsKKwkJfQorCX0KKwlzZXFfcHV0YyhtLCAnXG4nKTsKKwlpZiAobS0+Y291bnQgPCBtLT5zaXplKSAgLyogbWFwIGlzIGNvcGllZCBzdWNjZXNzZnVsbHkgKi8KKwkJbS0+dmVyc2lvbiA9IChtYXAgIT0gZ2V0X2dhdGVfdm1hKHRhc2spKT8gbWFwLT52bV9zdGFydDogMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgKm1fc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBtLT5wcml2YXRlOworCXVuc2lnbmVkIGxvbmcgbGFzdF9hZGRyID0gbS0+dmVyc2lvbjsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKm1hcCwgKnRhaWxfbWFwOworCWxvZmZfdCBsID0gKnBvczsKKworCS8qCisJICogV2UgcmVtZW1iZXIgbGFzdF9hZGRyIHJhdGhlciB0aGFuIG5leHRfYWRkciB0byBoaXQgd2l0aAorCSAqIG1tYXBfY2FjaGUgbW9zdCBvZiB0aGUgdGltZS4gV2UgaGF2ZSB6ZXJvIGxhc3RfYWRkciBhdAorCSAqIHRoZSBiZWdpbmluZyBhbmQgYWxzbyBhZnRlciBsc2Vlay4gV2Ugd2lsbCBoYXZlIC0xIGxhc3RfYWRkcgorCSAqIGFmdGVyIHRoZSBlbmQgb2YgdGhlIG1hcHMuCisJICovCisKKwlpZiAobGFzdF9hZGRyID09IC0xVUwpCisJCXJldHVybiBOVUxMOworCisJbW0gPSBnZXRfdGFza19tbSh0YXNrKTsKKwlpZiAoIW1tKQorCQlyZXR1cm4gTlVMTDsKKworCXRhaWxfbWFwID0gZ2V0X2dhdGVfdm1hKHRhc2spOworCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKworCS8qIFN0YXJ0IHdpdGggbGFzdCBhZGRyIGhpbnQgKi8KKwlpZiAobGFzdF9hZGRyICYmIChtYXAgPSBmaW5kX3ZtYShtbSwgbGFzdF9hZGRyKSkpIHsKKwkJbWFwID0gbWFwLT52bV9uZXh0OworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoZSBtYXAgaW5kZXggaXMgd2l0aGluIHRoZSByYW5nZSBhbmQgZG8KKwkgKiBzZXF1ZW50aWFsIHNjYW4gdW50aWwgbV9pbmRleC4KKwkgKi8KKwltYXAgPSBOVUxMOworCWlmICgodW5zaWduZWQgbG9uZylsIDwgbW0tPm1hcF9jb3VudCkgeworCQltYXAgPSBtbS0+bW1hcDsKKwkJd2hpbGUgKGwtLSAmJiBtYXApCisJCQltYXAgPSBtYXAtPnZtX25leHQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChsICE9IG1tLT5tYXBfY291bnQpCisJCXRhaWxfbWFwID0gTlVMTDsgLyogQWZ0ZXIgZ2F0ZSBtYXAgKi8KKworb3V0OgorCWlmIChtYXApCisJCXJldHVybiBtYXA7CisKKwkvKiBFbmQgb2YgbWFwcyBoYXMgcmVhY2hlZCAqLworCW0tPnZlcnNpb24gPSAodGFpbF9tYXAgIT0gTlVMTCk/IDA6IC0xVUw7CisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwltbXB1dChtbSk7CisJcmV0dXJuIHRhaWxfbWFwOworfQorCitzdGF0aWMgdm9pZCBtX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IG0tPnByaXZhdGU7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICptYXAgPSB2OworCWlmIChtYXAgJiYgbWFwICE9IGdldF9nYXRlX3ZtYSh0YXNrKSkgeworCQlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IG1hcC0+dm1fbW07CisJCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJCW1tcHV0KG1tKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkICptX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBtLT5wcml2YXRlOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqbWFwID0gdjsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnRhaWxfbWFwID0gZ2V0X2dhdGVfdm1hKHRhc2spOworCisJKCpwb3MpKys7CisJaWYgKG1hcCAmJiAobWFwICE9IHRhaWxfbWFwKSAmJiBtYXAtPnZtX25leHQpCisJCXJldHVybiBtYXAtPnZtX25leHQ7CisJbV9zdG9wKG0sIHYpOworCXJldHVybiAobWFwICE9IHRhaWxfbWFwKT8gdGFpbF9tYXA6IE5VTEw7Cit9CisKK3N0cnVjdCBzZXFfb3BlcmF0aW9ucyBwcm9jX3BpZF9tYXBzX29wID0geworCS5zdGFydAk9IG1fc3RhcnQsCisJLm5leHQJPSBtX25leHQsCisJLnN0b3AJPSBtX3N0b3AsCisJLnNob3cJPSBzaG93X21hcAorfTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvdGFza19ub21tdS5jIGIvZnMvcHJvYy90YXNrX25vbW11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY2ODgyNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Byb2MvdGFza19ub21tdS5jCkBAIC0wLDAgKzEsMTY0IEBACisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworLyoKKyAqIExvZ2ljOiB3ZSd2ZSBnb3QgdHdvIG1lbW9yeSBzdW1zIGZvciBlYWNoIHByb2Nlc3MsICJzaGFyZWQiLCBhbmQKKyAqICJub24tc2hhcmVkIi4gU2hhcmVkIG1lbW9yeSBtYXkgZ2V0IGNvdW50ZWQgbW9yZSB0aGVuIG9uY2UsIGZvcgorICogZWFjaCBwcm9jZXNzIHRoYXQgb3ducyBpdC4gTm9uLXNoYXJlZCBtZW1vcnkgaXMgY291bnRlZAorICogYWNjdXJhdGVseS4KKyAqLworY2hhciAqdGFza19tZW0oc3RydWN0IG1tX3N0cnVjdCAqbW0sIGNoYXIgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QgKnZtbDsKKwl1bnNpZ25lZCBsb25nIGJ5dGVzID0gMCwgc2J5dGVzID0gMCwgc2xhY2sgPSAwOworICAgICAgICAKKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJZm9yICh2bWwgPSBtbS0+Y29udGV4dC52bWxpc3Q7IHZtbDsgdm1sID0gdm1sLT5uZXh0KSB7CisJCWlmICghdm1sLT52bWEpCisJCQljb250aW51ZTsKKworCQlieXRlcyArPSBrb2Jqc2l6ZSh2bWwpOworCQlpZiAoYXRvbWljX3JlYWQoJm1tLT5tbV9jb3VudCkgPiAxIHx8CisJCSAgICBhdG9taWNfcmVhZCgmdm1sLT52bWEtPnZtX3VzYWdlKSA+IDEKKwkJICAgICkgeworCQkJc2J5dGVzICs9IGtvYmpzaXplKCh2b2lkICopIHZtbC0+dm1hLT52bV9zdGFydCk7CisJCQlzYnl0ZXMgKz0ga29ianNpemUodm1sLT52bWEpOworCQl9IGVsc2UgeworCQkJYnl0ZXMgKz0ga29ianNpemUoKHZvaWQgKikgdm1sLT52bWEtPnZtX3N0YXJ0KTsKKwkJCWJ5dGVzICs9IGtvYmpzaXplKHZtbC0+dm1hKTsKKwkJCXNsYWNrICs9IGtvYmpzaXplKCh2b2lkICopIHZtbC0+dm1hLT52bV9zdGFydCkgLQorCQkJCSh2bWwtPnZtYS0+dm1fZW5kIC0gdm1sLT52bWEtPnZtX3N0YXJ0KTsKKwkJfQorCX0KKworCWlmIChhdG9taWNfcmVhZCgmbW0tPm1tX2NvdW50KSA+IDEpCisJCXNieXRlcyArPSBrb2Jqc2l6ZShtbSk7CisJZWxzZQorCQlieXRlcyArPSBrb2Jqc2l6ZShtbSk7CisJCisJaWYgKGN1cnJlbnQtPmZzICYmIGF0b21pY19yZWFkKCZjdXJyZW50LT5mcy0+Y291bnQpID4gMSkKKwkJc2J5dGVzICs9IGtvYmpzaXplKGN1cnJlbnQtPmZzKTsKKwllbHNlCisJCWJ5dGVzICs9IGtvYmpzaXplKGN1cnJlbnQtPmZzKTsKKworCWlmIChjdXJyZW50LT5maWxlcyAmJiBhdG9taWNfcmVhZCgmY3VycmVudC0+ZmlsZXMtPmNvdW50KSA+IDEpCisJCXNieXRlcyArPSBrb2Jqc2l6ZShjdXJyZW50LT5maWxlcyk7CisJZWxzZQorCQlieXRlcyArPSBrb2Jqc2l6ZShjdXJyZW50LT5maWxlcyk7CisKKwlpZiAoY3VycmVudC0+c2lnaGFuZCAmJiBhdG9taWNfcmVhZCgmY3VycmVudC0+c2lnaGFuZC0+Y291bnQpID4gMSkKKwkJc2J5dGVzICs9IGtvYmpzaXplKGN1cnJlbnQtPnNpZ2hhbmQpOworCWVsc2UKKwkJYnl0ZXMgKz0ga29ianNpemUoY3VycmVudC0+c2lnaGFuZCk7CisKKwlieXRlcyArPSBrb2Jqc2l6ZShjdXJyZW50KTsgLyogaW5jbHVkZXMga2VybmVsIHN0YWNrICovCisKKwlidWZmZXIgKz0gc3ByaW50ZihidWZmZXIsCisJCSJNZW06XHQlOGx1IGJ5dGVzXG4iCisJCSJTbGFjazpcdCU4bHUgYnl0ZXNcbiIKKwkJIlNoYXJlZDpcdCU4bHUgYnl0ZXNcbiIsCisJCWJ5dGVzLCBzbGFjaywgc2J5dGVzKTsKKworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJcmV0dXJuIGJ1ZmZlcjsKK30KKwordW5zaWduZWQgbG9uZyB0YXNrX3ZzaXplKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXN0cnVjdCB2bV9saXN0X3N0cnVjdCAqdGJwOworCXVuc2lnbmVkIGxvbmcgdnNpemUgPSAwOworCisJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOworCWZvciAodGJwID0gbW0tPmNvbnRleHQudm1saXN0OyB0YnA7IHRicCA9IHRicC0+bmV4dCkgeworCQlpZiAodGJwLT52bWEpCisJCQl2c2l6ZSArPSBrb2Jqc2l6ZSgodm9pZCAqKSB0YnAtPnZtYS0+dm1fc3RhcnQpOworCX0KKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCXJldHVybiB2c2l6ZTsKK30KKworaW50IHRhc2tfc3RhdG0oc3RydWN0IG1tX3N0cnVjdCAqbW0sIGludCAqc2hhcmVkLCBpbnQgKnRleHQsCisJICAgICAgIGludCAqZGF0YSwgaW50ICpyZXNpZGVudCkKK3sKKwlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QgKnRicDsKKwlpbnQgc2l6ZSA9IGtvYmpzaXplKG1tKTsKKworCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlmb3IgKHRicCA9IG1tLT5jb250ZXh0LnZtbGlzdDsgdGJwOyB0YnAgPSB0YnAtPm5leHQpIHsKKwkJc2l6ZSArPSBrb2Jqc2l6ZSh0YnApOworCQlpZiAodGJwLT52bWEpIHsKKwkJCXNpemUgKz0ga29ianNpemUodGJwLT52bWEpOworCQkJc2l6ZSArPSBrb2Jqc2l6ZSgodm9pZCAqKSB0YnAtPnZtYS0+dm1fc3RhcnQpOworCQl9CisJfQorCisJc2l6ZSArPSAoKnRleHQgPSBtbS0+ZW5kX2NvZGUgLSBtbS0+c3RhcnRfY29kZSk7CisJc2l6ZSArPSAoKmRhdGEgPSBtbS0+c3RhcnRfc3RhY2sgLSBtbS0+c3RhcnRfZGF0YSk7CisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwkqcmVzaWRlbnQgPSBzaXplOworCXJldHVybiBzaXplOworfQorCitpbnQgcHJvY19leGVfbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICoqZGVudHJ5LCBzdHJ1Y3QgdmZzbW91bnQgKiptbnQpCit7CisJc3RydWN0IHZtX2xpc3Rfc3RydWN0ICp2bWw7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gcHJvY190YXNrKGlub2RlKTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGdldF90YXNrX21tKHRhc2spOworCWludCByZXN1bHQgPSAtRU5PRU5UOworCisJaWYgKCFtbSkKKwkJZ290byBvdXQ7CisJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOworCisJdm1sID0gbW0tPmNvbnRleHQudm1saXN0OworCXZtYSA9IE5VTEw7CisJd2hpbGUgKHZtbCkgeworCQlpZiAoKHZtbC0+dm1hLT52bV9mbGFncyAmIFZNX0VYRUNVVEFCTEUpICYmIHZtbC0+dm1hLT52bV9maWxlKSB7CisJCQl2bWEgPSB2bWwtPnZtYTsKKwkJCWJyZWFrOworCQl9CisJCXZtbCA9IHZtbC0+bmV4dDsKKwl9CisKKwlpZiAodm1hKSB7CisJCSptbnQgPSBtbnRnZXQodm1hLT52bV9maWxlLT5mX3Zmc21udCk7CisJCSpkZW50cnkgPSBkZ2V0KHZtYS0+dm1fZmlsZS0+Zl9kZW50cnkpOworCQlyZXN1bHQgPSAwOworCX0KKworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJbW1wdXQobW0pOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBBbGJlcnQgRC4gQ2FoYWxhbiBzdWdnZXN0ZWQgdG8gZmFrZSBlbnRyaWVzIGZvciB0aGUgdHJhZGl0aW9uYWwKKyAqIHNlY3Rpb25zIGhlcmUuICBUaGlzIG1pZ2h0IGJlIHdvcnRoIGludmVzdGlnYXRpbmcuCisgKi8KK3N0YXRpYyBpbnQgc2hvd19tYXAoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXJldHVybiAwOworfQorc3RhdGljIHZvaWQgKm1fc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKK3sKKwlyZXR1cm4gTlVMTDsKK30KK3N0YXRpYyB2b2lkIG1fc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7Cit9CitzdGF0aWMgdm9pZCAqbV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJcmV0dXJuIE5VTEw7Cit9CitzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvY19waWRfbWFwc19vcCA9IHsKKwkuc3RhcnQJPSBtX3N0YXJ0LAorCS5uZXh0CT0gbV9uZXh0LAorCS5zdG9wCT0gbV9zdG9wLAorCS5zaG93CT0gc2hvd19tYXAKK307CmRpZmYgLS1naXQgYS9mcy9xbng0L01ha2VmaWxlIGIvZnMvcW54NC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDJkN2ZlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcW54NC9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBxbng0LWZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19RTlg0RlNfRlMpICs9IHFueDQubworCitxbng0LW9ianMgOj0gaW5vZGUubyBkaXIubyBuYW1laS5vIGZpbGUubyBiaXRtYXAubyB0cnVuY2F0ZS5vIGZzeW5jLm8KZGlmZiAtLWdpdCBhL2ZzL3FueDQvUkVBRE1FIGIvZnMvcW54NC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYxZTMyMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3FueDQvUkVBRE1FCkBAIC0wLDAgKzEsOSBAQAorCisgIFRoaXMgaXMgYSBzbmFwc2hvdCBvZiB0aGUgUU5YNCBmaWxlc3lzdGVtIGZvciBMaW51eC4KKyAgUGxlYXNlIHNlbmQgZGlmZnMgYW5kIHJlbWFya3MgdG8gPGFsQGFsYXJzZW4ubmV0PiAuCisgIAorQ3JlZGl0cyA6CisKK1JpY2hhcmQgIlNjdWJhIiBBLiBGcm93aWpuICAgICA8c2N1YmFAd3hzLm5sPgorRnJhbmsgIkplZGkvU2VjdG9yIE9uZSIgRGVuaXMgIDxqQHB1cmVmdHBkLm9yZz4KK0FuZGVycyBMYXJzZW4gICAgICAgICAgICAgICAgICA8YWxAYWxhcnNlbi5uZXQ+IChNYWludGFpbmVyKQpkaWZmIC0tZ2l0IGEvZnMvcW54NC9iaXRtYXAuYyBiL2ZzL3FueDQvYml0bWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkxMjUzOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3FueDQvYml0bWFwLmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBRTlg0IGZpbGUgc3lzdGVtLCBMaW51eCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBWZXJzaW9uIDogMC4yLjEKKyAqCisgKiBVc2luZyBwYXJ0cyBvZiB0aGUgeGlhZnMgZmlsZXN5c3RlbS4KKyAqCisgKiBIaXN0b3J5IDoKKyAqCisgKiAyOC0wNS0xOTk4IGJ5IFJpY2hhcmQgRnJvd2lqbiA6IGZpcnN0IHJlbGVhc2UuCisgKiAyMC0wNi0xOTk4IGJ5IEZyYW5rIERlbmlzIDogYmFzaWMgb3B0aW1pc2F0aW9ucy4KKyAqIDI1LTA2LTE5OTggYnkgRnJhbmsgRGVuaXMgOiBxbng0X2lzX2ZyZWUsIHFueDRfc2V0X2JpdG1hcCwgcW54NF9ibWFwIC4KKyAqIDI4LTA2LTE5OTggYnkgRnJhbmsgRGVuaXMgOiBxbng0X2ZyZWVfaW5vZGUgKHRvIGJlIGZpeGVkKSAuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3FueDRfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworaW50IHFueDRfbmV3X2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvdW50X2JpdHMocmVnaXN0ZXIgY29uc3QgY2hhciAqYm1QYXJ0LCByZWdpc3RlciBpbnQgc2l6ZSwKKwkJICAgICAgIGludCAqY29uc3QgdGYpCit7CisJY2hhciBiOworCWludCB0b3QgPSAqdGY7CisKKwlpZiAoc2l6ZSA+IFFOWDRfQkxPQ0tfU0laRSkgeworCQlzaXplID0gUU5YNF9CTE9DS19TSVpFOworCX0KKwlkbyB7CisJCWIgPSAqYm1QYXJ0Kys7CisJCWlmICgoYiAmIDEpID09IDApCisJCQl0b3QrKzsKKwkJaWYgKChiICYgMikgPT0gMCkKKwkJCXRvdCsrOworCQlpZiAoKGIgJiA0KSA9PSAwKQorCQkJdG90Kys7CisJCWlmICgoYiAmIDgpID09IDApCisJCQl0b3QrKzsKKwkJaWYgKChiICYgMTYpID09IDApCisJCQl0b3QrKzsKKwkJaWYgKChiICYgMzIpID09IDApCisJCQl0b3QrKzsKKwkJaWYgKChiICYgNjQpID09IDApCisJCQl0b3QrKzsKKwkJaWYgKChiICYgMTI4KSA9PSAwKQorCQkJdG90Kys7CisJCXNpemUtLTsKKwl9IHdoaWxlIChzaXplICE9IDApOworCSp0ZiA9IHRvdDsKK30KKwordW5zaWduZWQgbG9uZyBxbng0X2NvdW50X2ZyZWVfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaW50IHN0YXJ0ID0gbGUzMl90b19jcHUocW54NF9zYihzYiktPkJpdE1hcC0+ZGlfZmlyc3RfeHRudC54dG50X2JsaykgLSAxOworCWludCB0b3RhbCA9IDA7CisJaW50IHRvdGFsX2ZyZWUgPSAwOworCWludCBvZmZzZXQgPSAwOworCWludCBzaXplID0gbGUzMl90b19jcHUocW54NF9zYihzYiktPkJpdE1hcC0+ZGlfc2l6ZSk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCXdoaWxlICh0b3RhbCA8IHNpemUpIHsKKwkJaWYgKChiaCA9IHNiX2JyZWFkKHNiLCBzdGFydCArIG9mZnNldCkpID09IE5VTEwpIHsKKwkJCXByaW50aygicW54NDogSS9PIGVycm9yIGluIGNvdW50aW5nIGZyZWUgYmxvY2tzXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWNvdW50X2JpdHMoYmgtPmJfZGF0YSwgc2l6ZSAtIHRvdGFsLCAmdG90YWxfZnJlZSk7CisJCWJyZWxzZShiaCk7CisJCXRvdGFsICs9IFFOWDRfQkxPQ0tfU0laRTsKKwkJb2Zmc2V0Kys7CisJfQorCisJcmV0dXJuIHRvdGFsX2ZyZWU7Cit9CisKKyNpZmRlZiBDT05GSUdfUU5YNEZTX1JXCisKK2ludCBxbng0X2lzX2ZyZWUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgbG9uZyBibG9jaykKK3sKKwlpbnQgc3RhcnQgPSBsZTMyX3RvX2NwdShxbng0X3NiKHNiKS0+Qml0TWFwLT5kaV9maXJzdF94dG50Lnh0bnRfYmxrKSAtIDE7CisJaW50IHNpemUgPSBsZTMyX3RvX2NwdShxbng0X3NiKHNiKS0+Qml0TWFwLT5kaV9zaXplKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWNvbnN0IGNoYXIgKmc7CisJaW50IHJldCA9IC1FSU87CisKKwlzdGFydCArPSBibG9jayAvIChRTlg0X0JMT0NLX1NJWkUgKiA4KTsKKwlRTlg0REVCVUcoKCJxbng0OiBpc19mcmVlIHJlcXVlc3RpbmcgYmxvY2sgWyVsdV0sIGJpdG1hcCBpbiBibG9jayBbJWx1XVxuIiwKKwkJICAgKHVuc2lnbmVkIGxvbmcpIGJsb2NrLCAodW5zaWduZWQgbG9uZykgc3RhcnQpKTsKKwkodm9pZCkgc2l6ZTsJCS8qIENIRUNLTUUgKi8KKwliaCA9IHNiX2JyZWFkKHNiLCBzdGFydCk7CisJaWYgKGJoID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FSU87CisJfQorCWcgPSBiaC0+Yl9kYXRhICsgKGJsb2NrICUgUU5YNF9CTE9DS19TSVpFKTsKKwlpZiAoKCgqZykgJiAoMSA8PCAoYmxvY2sgJSA4KSkpID09IDApIHsKKwkJUU5YNERFQlVHKCgicW54NDogaXNfZnJlZSAtPiBibG9jayBpcyBmcmVlXG4iKSk7CisJCXJldCA9IDE7CisJfSBlbHNlIHsKKwkJUU5YNERFQlVHKCgicW54NDogaXNfZnJlZSAtPiBibG9jayBpcyBidXN5XG4iKSk7CisJCXJldCA9IDA7CisJfQorCWJyZWxzZShiaCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgcW54NF9zZXRfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGxvbmcgYmxvY2ssIGludCBidXN5KQoreworCWludCBzdGFydCA9IGxlMzJfdG9fY3B1KHFueDRfc2Ioc2IpLT5CaXRNYXAtPmRpX2ZpcnN0X3h0bnQueHRudF9ibGspIC0gMTsKKwlpbnQgc2l6ZSA9IGxlMzJfdG9fY3B1KHFueDRfc2Ioc2IpLT5CaXRNYXAtPmRpX3NpemUpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJY2hhciAqZzsKKworCXN0YXJ0ICs9IGJsb2NrIC8gKFFOWDRfQkxPQ0tfU0laRSAqIDgpOworCVFOWDRERUJVRygoInFueDQ6IHNldF9iaXRtYXAgcmVxdWVzdGluZyBibG9jayBbJWx1XSwgYml0bWFwIGluIGJsb2NrIFslbHVdXG4iLAorCQkgICAodW5zaWduZWQgbG9uZykgYmxvY2ssICh1bnNpZ25lZCBsb25nKSBzdGFydCkpOworCSh2b2lkKSBzaXplOwkJLyogQ0hFQ0tNRSAqLworCWJoID0gc2JfYnJlYWQoc2IsIHN0YXJ0KTsKKwlpZiAoYmggPT0gTlVMTCkgeworCQlyZXR1cm4gLUVJTzsKKwl9CisJZyA9IGJoLT5iX2RhdGEgKyAoYmxvY2sgJSBRTlg0X0JMT0NLX1NJWkUpOworCWlmIChidXN5ID09IDApIHsKKwkJKCpnKSAmPSB+KDEgPDwgKGJsb2NrICUgOCkpOworCX0gZWxzZSB7CisJCSgqZykgfD0gKDEgPDwgKGJsb2NrICUgOCkpOworCX0KKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJYnJlbHNlKGJoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBxbng0X2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHFueDRfaW5vZGVfZW50cnkgKnFueDRfaW5vID0gcW54NF9yYXdfaW5vZGUoaW5vZGUpOworCS8qIFdoYXQgZm9yPyAqLworCW1lbXNldChxbng0X2luby0+ZGlfZm5hbWUsIDAsIHNpemVvZiBxbng0X2luby0+ZGlfZm5hbWUpOworCXFueDRfaW5vLT5kaV9zaXplID0gMDsKKwlxbng0X2luby0+ZGlfbnVtX3h0bnRzID0gMDsKKwlxbng0X2luby0+ZGlfbW9kZSA9IDA7CisJcW54NF9pbm8tPmRpX3N0YXR1cyA9IDA7Cit9CisKK3ZvaWQgcW54NF9mcmVlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKGlub2RlLT5pX2lubyA8IDEpIHsKKwkJcHJpbnRrKCJmcmVlX2lub2RlOiBpbm9kZSAwIG9yIG5vbmV4aXN0ZW50IGlub2RlXG4iKTsKKwkJcmV0dXJuOworCX0KKwlxbng0X2NsZWFyX2lub2RlKGlub2RlKTsKKwljbGVhcl9pbm9kZShpbm9kZSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvcW54NC9kaXIuYyBiL2ZzL3FueDQvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2NjE0NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3FueDQvZGlyLmMKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIFFOWDQgZmlsZSBzeXN0ZW0sIExpbnV4IGltcGxlbWVudGF0aW9uLgorICoKKyAqIFZlcnNpb24gOiAwLjIuMQorICoKKyAqIFVzaW5nIHBhcnRzIG9mIHRoZSB4aWFmcyBmaWxlc3lzdGVtLgorICoKKyAqIEhpc3RvcnkgOgorICoKKyAqIDI4LTA1LTE5OTggYnkgUmljaGFyZCBGcm93aWpuIDogZmlyc3QgcmVsZWFzZS4KKyAqIDIwLTA2LTE5OTggYnkgRnJhbmsgRGVuaXMgOiBMaW51eCAyLjEuOTkrICYgZGNhY2hlIHN1cHBvcnQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9xbng0X2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworCitzdGF0aWMgaW50IHFueDRfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBxbng0X2lub2RlX2VudHJ5ICpkZTsKKwlzdHJ1Y3QgcW54NF9saW5rX2luZm8gKmxlOworCXVuc2lnbmVkIGxvbmcgYmxrbnVtOworCWludCBpeCwgaW5vOworCWludCBzaXplOworCisJUU5YNERFQlVHKCgicW54NF9yZWFkZGlyOmlfc2l6ZSA9ICVsZFxuIiwgKGxvbmcpIGlub2RlLT5pX3NpemUpKTsKKwlRTlg0REVCVUcoKCJmaWxwLT5mX3BvcyAgICAgICAgID0gJWxkXG4iLCAobG9uZykgZmlscC0+Zl9wb3MpKTsKKworCWxvY2tfa2VybmVsKCk7CisKKwl3aGlsZSAoZmlscC0+Zl9wb3MgPCBpbm9kZS0+aV9zaXplKSB7CisJCWJsa251bSA9IHFueDRfYmxvY2tfbWFwKCBpbm9kZSwgZmlscC0+Zl9wb3MgPj4gUU5YNF9CTE9DS19TSVpFX0JJVFMgKTsKKwkJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgYmxrbnVtKTsKKwkJaWYoYmg9PU5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAicW54NF9yZWFkZGlyOiBicmVhZCBmYWlsZWQgKCVsZClcbiIsIGJsa251bSk7CisJCQlicmVhazsKKwkJfQorCQlpeCA9IChpbnQpKGZpbHAtPmZfcG9zID4+IFFOWDRfRElSX0VOVFJZX1NJWkVfQklUUykgJSBRTlg0X0lOT0RFU19QRVJfQkxPQ0s7CisJCXdoaWxlIChpeCA8IFFOWDRfSU5PREVTX1BFUl9CTE9DSykgeworCQkJb2Zmc2V0ID0gaXggKiBRTlg0X0RJUl9FTlRSWV9TSVpFOworCQkJZGUgPSAoc3RydWN0IHFueDRfaW5vZGVfZW50cnkgKikgKGJoLT5iX2RhdGEgKyBvZmZzZXQpOworCQkJc2l6ZSA9IHN0cmxlbihkZS0+ZGlfZm5hbWUpOworCQkJaWYgKHNpemUpIHsKKwkJCQlpZiAoICEoIGRlLT5kaV9zdGF0dXMgJiBRTlg0X0ZJTEVfTElOSyApICYmIHNpemUgPiBRTlg0X1NIT1JUX05BTUVfTUFYICkKKwkJCQkJc2l6ZSA9IFFOWDRfU0hPUlRfTkFNRV9NQVg7CisJCQkJZWxzZSBpZiAoIHNpemUgPiBRTlg0X05BTUVfTUFYICkKKwkJCQkJc2l6ZSA9IFFOWDRfTkFNRV9NQVg7CisKKwkJCQlpZiAoICggZGUtPmRpX3N0YXR1cyAmIChRTlg0X0ZJTEVfVVNFRHxRTlg0X0ZJTEVfTElOSykgKSAhPSAwICkgeworCQkJCQlRTlg0REVCVUcoKCJxbng0X3JlYWRkaXI6JS4qc1xuIiwgc2l6ZSwgZGUtPmRpX2ZuYW1lKSk7CisJCQkJCWlmICggKCBkZS0+ZGlfc3RhdHVzICYgUU5YNF9GSUxFX0xJTksgKSA9PSAwICkKKwkJCQkJCWlubyA9IGJsa251bSAqIFFOWDRfSU5PREVTX1BFUl9CTE9DSyArIGl4IC0gMTsKKwkJCQkJZWxzZSB7CisJCQkJCQlsZSAgPSAoc3RydWN0IHFueDRfbGlua19pbmZvKilkZTsKKwkJCQkJCWlubyA9ICggbGUtPmRsX2lub2RlX2JsayAtIDEgKSAqCisJCQkJCQkJUU5YNF9JTk9ERVNfUEVSX0JMT0NLICsKKwkJCQkJCQlsZS0+ZGxfaW5vZGVfbmR4OworCQkJCQl9CisJCQkJCWlmIChmaWxsZGlyKGRpcmVudCwgZGUtPmRpX2ZuYW1lLCBzaXplLCBmaWxwLT5mX3BvcywgaW5vLCBEVF9VTktOT1dOKSA8IDApIHsKKwkJCQkJCWJyZWxzZShiaCk7CisJCQkJCQlnb3RvIG91dDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWl4Kys7CisJCQlmaWxwLT5mX3BvcyArPSBRTlg0X0RJUl9FTlRSWV9TSVpFOworCQl9CisJCWJyZWxzZShiaCk7CisJfQorb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBxbng0X2Rpcl9vcGVyYXRpb25zID0KK3sKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gcW54NF9yZWFkZGlyLAorCS5mc3luYwkJPSBmaWxlX2ZzeW5jLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcW54NF9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9Cit7CisJLmxvb2t1cAkJPSBxbng0X2xvb2t1cCwKKyNpZmRlZiBDT05GSUdfUU5YNEZTX1JXCisJLmNyZWF0ZQkJPSBxbng0X2NyZWF0ZSwKKwkudW5saW5rCQk9IHFueDRfdW5saW5rLAorCS5ybWRpcgkJPSBxbng0X3JtZGlyLAorI2VuZGlmCit9OwpkaWZmIC0tZ2l0IGEvZnMvcW54NC9maWxlLmMgYi9mcy9xbng0L2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDcxMzE1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcW54NC9maWxlLmMKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIFFOWDQgZmlsZSBzeXN0ZW0sIExpbnV4IGltcGxlbWVudGF0aW9uLgorICoKKyAqIFZlcnNpb24gOiAwLjIuMQorICoKKyAqIFVzaW5nIHBhcnRzIG9mIHRoZSB4aWFmcyBmaWxlc3lzdGVtLgorICoKKyAqIEhpc3RvcnkgOgorICoKKyAqIDI1LTA1LTE5OTggYnkgUmljaGFyZCBGcm93aWpuIDogZmlyc3QgcmVsZWFzZS4KKyAqIDIxLTA2LTE5OTggYnkgRnJhbmsgRGVuaXMgOiB3cm90ZSBxbng0X3JlYWRwYWdlIHRvIHVzZSBnZW5lcmljX2ZpbGVfcmVhZC4KKyAqIDI3LTA2LTE5OTggYnkgRnJhbmsgRGVuaXMgOiBmaWxlIG92ZXJ3cml0aW5nLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3FueDRfZnMuaD4KKworLyoKKyAqIFdlIGhhdmUgbW9zdGx5IE5VTEwncyBoZXJlOiB0aGUgY3VycmVudCBkZWZhdWx0cyBhcmUgb2sgZm9yCisgKiB0aGUgcW54NCBmaWxlc3lzdGVtLgorICovCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHFueDRfZmlsZV9vcGVyYXRpb25zID0KK3sKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19maWxlX3JlYWQsCisJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCisJLnNlbmRmaWxlCT0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorI2lmZGVmIENPTkZJR19RTlg0RlNfUlcKKwkud3JpdGUJCT0gZ2VuZXJpY19maWxlX3dyaXRlLAorCS5mc3luYwkJPSBxbng0X3N5bmNfZmlsZSwKKyNlbmRpZgorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcW54NF9maWxlX2lub2RlX29wZXJhdGlvbnMgPQoreworI2lmZGVmIENPTkZJR19RTlg0RlNfUlcKKwkudHJ1bmNhdGUJPSBxbng0X3RydW5jYXRlLAorI2VuZGlmCit9OwpkaWZmIC0tZ2l0IGEvZnMvcW54NC9mc3luYy5jIGIvZnMvcW54NC9mc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNWJjNzUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9xbng0L2ZzeW5jLmMKQEAgLTAsMCArMSwxNzAgQEAKKy8qIAorICogUU5YNCBmaWxlIHN5c3RlbSwgTGludXggaW1wbGVtZW50YXRpb24uCisgKiAKKyAqIFZlcnNpb24gOiAwLjEKKyAqIAorICogVXNpbmcgcGFydHMgb2YgdGhlIHhpYWZzIGZpbGVzeXN0ZW0uCisgKiAKKyAqIEhpc3RvcnkgOgorICogCisgKiAyNC0wMy0xOTk4IGJ5IFJpY2hhcmQgRnJvd2lqbiA6IGZpcnN0IHJlbGVhc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcW54NF9mcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKgorICogVGhlIGZ1bmN0aW9ucyBmb3IgcW54NCBmcyBmaWxlIHN5bmNocm9uaXphdGlvbi4KKyAqLworCisjaWZkZWYgQ09ORklHX1FOWDRGU19SVworCitzdGF0aWMgaW50IHN5bmNfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgc2hvcnQgKmJsb2NrLCBpbnQgd2FpdCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXVuc2lnbmVkIHNob3J0IHRtcDsKKworCWlmICghKmJsb2NrKQorCQlyZXR1cm4gMDsKKwl0bXAgPSAqYmxvY2s7CisJYmggPSBzYl9maW5kX2dldF9ibG9jayhpbm9kZS0+aV9zYiwgKmJsb2NrKTsKKwlpZiAoIWJoKQorCQlyZXR1cm4gMDsKKwlpZiAoKmJsb2NrICE9IHRtcCkgeworCQlicmVsc2UoYmgpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKHdhaXQgJiYgYnVmZmVyX3JlcShiaCkgJiYgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJYnJlbHNlKGJoKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAod2FpdCB8fCAhYnVmZmVyX3VwdG9kYXRlKGJoKSB8fCAhYnVmZmVyX2RpcnR5KGJoKSkgeworCQlicmVsc2UoYmgpOworCQlyZXR1cm4gMDsKKwl9CisJbGxfcndfYmxvY2soV1JJVEUsIDEsICZiaCk7CisJYXRvbWljX2RlYygmYmgtPmJfY291bnQpOworCXJldHVybiAwOworfQorCisjaWZkZWYgV1RGCitzdGF0aWMgaW50IHN5bmNfaWJsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIHNob3J0ICppYmxvY2ssCisJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCwgaW50IHdhaXQpCit7CisJaW50IHJjOworCXVuc2lnbmVkIHNob3J0IHRtcDsKKworCSpiaCA9IE5VTEw7CisJdG1wID0gKmlibG9jazsKKwlpZiAoIXRtcCkKKwkJcmV0dXJuIDA7CisJcmMgPSBzeW5jX2Jsb2NrKGlub2RlLCBpYmxvY2ssIHdhaXQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCSpiaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCB0bXApOworCWlmICh0bXAgIT0gKmlibG9jaykgeworCQlicmVsc2UoKmJoKTsKKwkJKmJoID0gTlVMTDsKKwkJcmV0dXJuIDE7CisJfQorCWlmICghKmJoKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBzeW5jX2RpcmVjdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgd2FpdCkKK3sKKwlpbnQgaTsKKwlpbnQgcmMsIGVyciA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCXJjID0gc3luY19ibG9jayhpbm9kZSwKKwkJCQkodW5zaWduZWQgc2hvcnQgKikgcW54NF9yYXdfaW5vZGUoaW5vZGUpLT5kaV9maXJzdF94dG50Lnh0bnRfYmxrICsgaSwgd2FpdCk7CisJCWlmIChyYyA+IDApCisJCQlicmVhazsKKwkJaWYgKHJjKQorCQkJZXJyID0gcmM7CisJfQorCXJldHVybiBlcnI7Cit9CisKKyNpZmRlZiBXVEYKK3N0YXRpYyBpbnQgc3luY19pbmRpcmVjdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBzaG9ydCAqaWJsb2NrLCBpbnQgd2FpdCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmluZF9iaDsKKwlpbnQgcmMsIGVyciA9IDA7CisKKwlyYyA9IHN5bmNfaWJsb2NrKGlub2RlLCBpYmxvY2ssICZpbmRfYmgsIHdhaXQpOworCWlmIChyYyB8fCAhaW5kX2JoKQorCQlyZXR1cm4gcmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspIHsKKwkJcmMgPSBzeW5jX2Jsb2NrKGlub2RlLAorCQkJCSgodW5zaWduZWQgc2hvcnQgKikgaW5kX2JoLT5iX2RhdGEpICsgaSwKKwkJCQl3YWl0KTsKKwkJaWYgKHJjID4gMCkKKwkJCWJyZWFrOworCQlpZiAocmMpCisJCQllcnIgPSByYzsKKwl9CisJYnJlbHNlKGluZF9iaCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzeW5jX2RpbmRpcmVjdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBzaG9ydCAqZGlibG9jaywKKwkJCSAgaW50IHdhaXQpCit7CisJaW50IGk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaW5kX2JoOworCWludCByYywgZXJyID0gMDsKKworCXJjID0gc3luY19pYmxvY2soaW5vZGUsIGRpYmxvY2ssICZkaW5kX2JoLCB3YWl0KTsKKwlpZiAocmMgfHwgIWRpbmRfYmgpCisJCXJldHVybiByYzsKKworCWZvciAoaSA9IDA7IGkgPCA1MTI7IGkrKykgeworCQlyYyA9IHN5bmNfaW5kaXJlY3QoaW5vZGUsCisJCQkJKCh1bnNpZ25lZCBzaG9ydCAqKSBkaW5kX2JoLT5iX2RhdGEpICsgaSwKKwkJCQkgICB3YWl0KTsKKwkJaWYgKHJjID4gMCkKKwkJCWJyZWFrOworCQlpZiAocmMpCisJCQllcnIgPSByYzsKKwl9CisJYnJlbHNlKGRpbmRfYmgpOworCXJldHVybiBlcnI7Cit9CisjZW5kaWYKKworaW50IHFueDRfc3luY19maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCB1bnVzZWQpCit7CisgICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IHdhaXQsIGVyciA9IDA7CisgICAgICAgIAorICAgICAgICAodm9pZCkgZmlsZTsKKwlpZiAoIShTX0lTUkVHKGlub2RlLT5pX21vZGUpIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwKKwkgICAgICBTX0lTTE5LKGlub2RlLT5pX21vZGUpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NrX2tlcm5lbCgpOworCWZvciAod2FpdCA9IDA7IHdhaXQgPD0gMTsgd2FpdCsrKSB7CisJCWVyciB8PSBzeW5jX2RpcmVjdChpbm9kZSwgd2FpdCk7CisJfQorCWVyciB8PSBxbng0X3N5bmNfaW5vZGUoaW5vZGUpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gKGVyciA8IDApID8gLUVJTyA6IDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvcW54NC9pbm9kZS5jIGIvZnMvcW54NC9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOTJkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9xbng0L2lub2RlLmMKQEAgLTAsMCArMSw2MDMgQEAKKy8qCisgKiBRTlg0IGZpbGUgc3lzdGVtLCBMaW51eCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBWZXJzaW9uIDogMC4yLjEKKyAqCisgKiBVc2luZyBwYXJ0cyBvZiB0aGUgeGlhZnMgZmlsZXN5c3RlbS4KKyAqCisgKiBIaXN0b3J5IDoKKyAqCisgKiAwMS0wNi0xOTk4IGJ5IFJpY2hhcmQgRnJvd2lqbiA6IGZpcnN0IHJlbGVhc2UuCisgKiAyMC0wNi0xOTk4IGJ5IEZyYW5rIERlbmlzIDogTGludXggMi4xLjk5KyBzdXBwb3J0LCBib290IHNpZ25hdHVyZSwgbWlzYy4KKyAqIDMwLTA2LTE5OTggYnkgRnJhbmsgRGVuaXMgOiBmaXJzdCBzdGVwIHRvIHdyaXRlIGlub2Rlcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3FueDRfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaGlnaHVpZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBRTlg0X1ZFUlNJT04gIDQKKyNkZWZpbmUgUU5YNF9CTU5BTUUgICAiLmJpdG1hcCIKKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHFueDRfc29wczsKKworI2lmZGVmIENPTkZJR19RTlg0RlNfUlcKKworaW50IHFueDRfc3luY19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWludCBlcnIgPSAwOworIyBpZiAwCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworICAgCWJoID0gcW54NF91cGRhdGVfaW5vZGUoaW5vZGUpOworCWlmIChiaCAmJiBidWZmZXJfZGlydHkoYmgpKQorCXsKKwkJc3luY19kaXJ0eV9idWZmZXIoYmgpOworCQlpZiAoYnVmZmVyX3JlcShiaCkgJiYgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCXsKKwkJCXByaW50ayAoIklPIGVycm9yIHN5bmNpbmcgcW54NCBpbm9kZSBbJXM6JTA4bHhdXG4iLAorCQkJCWlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8pOworCQkJZXJyID0gLTE7CisJCX0KKwkgICAgICAgIGJyZWxzZSAoYmgpOworCX0gZWxzZSBpZiAoIWJoKSB7CisJCWVyciA9IC0xOworCX0KKyMgZW5kaWYKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHFueDRfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJUU5YNERFQlVHKCgicW54NDogZGVsZXRpbmcgaW5vZGUgWyVsdV1cbiIsICh1bnNpZ25lZCBsb25nKSBpbm9kZS0+aV9pbm8pKTsKKwlpbm9kZS0+aV9zaXplID0gMDsKKwlxbng0X3RydW5jYXRlKGlub2RlKTsKKwlsb2NrX2tlcm5lbCgpOworCXFueDRfZnJlZV9pbm9kZShpbm9kZSk7CisJdW5sb2NrX2tlcm5lbCgpOworfQorCitzdGF0aWMgdm9pZCBxbng0X3dyaXRlX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJbG9ja19rZXJuZWwoKTsKKwlRTlg0REVCVUcoKCJxbng0OiB3cml0ZV9zdXBlclxuIikpOworCXNiLT5zX2RpcnQgPSAwOworCXVubG9ja19rZXJuZWwoKTsKK30KKworc3RhdGljIGludCBxbng0X3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB1bnVzZWQpCit7CisJc3RydWN0IHFueDRfaW5vZGVfZW50cnkgKnJhd19pbm9kZTsKKwlpbnQgYmxvY2ssIGlubzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWlubyA9IGlub2RlLT5pX2lubzsKKworCVFOWDRERUJVRygoInFueDQ6IHdyaXRlIGlub2RlIDEuXG4iKSk7CisJaWYgKGlub2RlLT5pX25saW5rID09IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghaW5vKSB7CisJCXByaW50aygicW54NDogYmFkIGlub2RlIG51bWJlciBvbiBkZXYgJXM6ICVkIGlzIG91dCBvZiByYW5nZVxuIiwKKwkJICAgICAgIGlub2RlLT5pX3NiLT5zX2lkLCBpbm8pOworCQlyZXR1cm4gLUVJTzsKKwl9CisJUU5YNERFQlVHKCgicW54NDogd3JpdGUgaW5vZGUgMi5cbiIpKTsKKwlibG9jayA9IGlubyAvIFFOWDRfSU5PREVTX1BFUl9CTE9DSzsKKwlsb2NrX2tlcm5lbCgpOworCWlmICghKGJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIGJsb2NrKSkpIHsKKwkJcHJpbnRrKCJxbng0OiBtYWpvciBwcm9ibGVtOiB1bmFibGUgdG8gcmVhZCBpbm9kZSBmcm9tIGRldiAiCisJCSAgICAgICAiJXNcbiIsIGlub2RlLT5pX3NiLT5zX2lkKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmF3X2lub2RlID0gKChzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSAqKSBiaC0+Yl9kYXRhKSArCisJICAgIChpbm8gJSBRTlg0X0lOT0RFU19QRVJfQkxPQ0spOworCXJhd19pbm9kZS0+ZGlfbW9kZSAgPSBjcHVfdG9fbGUxNihpbm9kZS0+aV9tb2RlKTsKKwlyYXdfaW5vZGUtPmRpX3VpZCAgID0gY3B1X3RvX2xlMTYoZnNfaGlnaDJsb3d1aWQoaW5vZGUtPmlfdWlkKSk7CisJcmF3X2lub2RlLT5kaV9naWQgICA9IGNwdV90b19sZTE2KGZzX2hpZ2gybG93Z2lkKGlub2RlLT5pX2dpZCkpOworCXJhd19pbm9kZS0+ZGlfbmxpbmsgPSBjcHVfdG9fbGUxNihpbm9kZS0+aV9ubGluayk7CisJcmF3X2lub2RlLT5kaV9zaXplICA9IGNwdV90b19sZTMyKGlub2RlLT5pX3NpemUpOworCXJhd19pbm9kZS0+ZGlfbXRpbWUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9tdGltZS50dl9zZWMpOworCXJhd19pbm9kZS0+ZGlfYXRpbWUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9hdGltZS50dl9zZWMpOworCXJhd19pbm9kZS0+ZGlfY3RpbWUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9jdGltZS50dl9zZWMpOworCXJhd19pbm9kZS0+ZGlfZmlyc3RfeHRudC54dG50X3NpemUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9ibG9ja3MpOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlicmVsc2UoYmgpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHFueDRfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworc3RhdGljIHN0cnVjdCBpbm9kZSAqcW54NF9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK3N0YXRpYyB2b2lkIHFueDRfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK3N0YXRpYyB2b2lkIHFueDRfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitzdGF0aWMgaW50IHFueDRfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKTsKK3N0YXRpYyBpbnQgcW54NF9zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBrc3RhdGZzICopOworCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgcW54NF9zb3BzID0KK3sKKwkuYWxsb2NfaW5vZGUJPSBxbng0X2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gcW54NF9kZXN0cm95X2lub2RlLAorCS5yZWFkX2lub2RlCT0gcW54NF9yZWFkX2lub2RlLAorCS5wdXRfc3VwZXIJPSBxbng0X3B1dF9zdXBlciwKKwkuc3RhdGZzCQk9IHFueDRfc3RhdGZzLAorCS5yZW1vdW50X2ZzCT0gcW54NF9yZW1vdW50LAorI2lmZGVmIENPTkZJR19RTlg0RlNfUlcKKwkud3JpdGVfaW5vZGUJPSBxbng0X3dyaXRlX2lub2RlLAorCS5kZWxldGVfaW5vZGUJPSBxbng0X2RlbGV0ZV9pbm9kZSwKKwkud3JpdGVfc3VwZXIJPSBxbng0X3dyaXRlX3N1cGVyLAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IHFueDRfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBxbng0X3NiX2luZm8gKnFzOworCisJcXMgPSBxbng0X3NiKHNiKTsKKwlxcy0+VmVyc2lvbiA9IFFOWDRfVkVSU0lPTjsKKyNpZm5kZWYgQ09ORklHX1FOWDRGU19SVworCSpmbGFncyB8PSBNU19SRE9OTFk7CisjZW5kaWYKKwlpZiAoKmZsYWdzICYgTVNfUkRPTkxZKSB7CisJCXJldHVybiAwOworCX0KKworCW1hcmtfYnVmZmVyX2RpcnR5KHFzLT5zYl9idWYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnFueDRfZ2V0YmxrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBuciwKKwkJCQkgICAgICAgaW50IGNyZWF0ZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJlc3VsdCA9IE5VTEw7CisKKwlpZiAoIG5yID49IDAgKQorCQluciA9IHFueDRfYmxvY2tfbWFwKCBpbm9kZSwgbnIgKTsKKwlpZiAobnIpIHsKKwkJcmVzdWx0ID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBucik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCWlmICghY3JlYXRlKSB7CisJCXJldHVybiBOVUxMOworCX0KKyNpZiAwCisJdG1wID0gcW54NF9uZXdfYmxvY2soaW5vZGUtPmlfc2IpOworCWlmICghdG1wKSB7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXN1bHQgPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsIHRtcCk7CisJaWYgKHRzdCkgeworCQlxbng0X2ZyZWVfYmxvY2soaW5vZGUtPmlfc2IsIHRtcCk7CisJCWJyZWxzZShyZXN1bHQpOworCQlnb3RvIHJlcGVhdDsKKwl9CisJdHN0ID0gdG1wOworI2VuZGlmCisJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0cnVjdCBidWZmZXJfaGVhZCAqcW54NF9icmVhZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgYmxvY2ssIGludCBjcmVhdGUpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCWJoID0gcW54NF9nZXRibGsoaW5vZGUsIGJsb2NrLCBjcmVhdGUpOworCWlmICghYmggfHwgYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQlyZXR1cm4gYmg7CisJfQorCWxsX3J3X2Jsb2NrKFJFQUQsIDEsICZiaCk7CisJd2FpdF9vbl9idWZmZXIoYmgpOworCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCXJldHVybiBiaDsKKwl9CisJYnJlbHNlKGJoKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHFueDRfZ2V0X2Jsb2NrKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBjcmVhdGUgKQoreworCXVuc2lnbmVkIGxvbmcgcGh5czsKKworCVFOWDRERUJVRygoInFueDQ6IHFueDRfZ2V0X2Jsb2NrIGlub2RlPVslbGRdIGlibG9jaz1bJWxkXVxuIixpbm9kZS0+aV9pbm8saWJsb2NrKSk7CisKKwlwaHlzID0gcW54NF9ibG9ja19tYXAoIGlub2RlLCBpYmxvY2sgKTsKKwlpZiAoIHBoeXMgKSB7CisJCS8vIGxvZ2ljYWwgYmxvY2sgaXMgYmVmb3JlIEVPRgorCQltYXBfYmgoYmgsIGlub2RlLT5pX3NiLCBwaHlzKTsKKwl9IGVsc2UgaWYgKCBjcmVhdGUgKSB7CisJCS8vIHRvIGJlIGRvbmUuCisJfQorCXJldHVybiAwOworfQorCit1bnNpZ25lZCBsb25nIHFueDRfYmxvY2tfbWFwKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb25nIGlibG9jayApCit7CisJaW50IGl4OworCWxvbmcgb2Zmc2V0LCBpX3hibGs7CisJdW5zaWduZWQgbG9uZyBibG9jayA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IHFueDRfeGJsayAqeGJsayA9IE5VTEw7CisJc3RydWN0IHFueDRfaW5vZGVfZW50cnkgKnFueDRfaW5vZGUgPSBxbng0X3Jhd19pbm9kZShpbm9kZSk7CisJcW54NF9ueHRudF90IG54dG50ID0gbGUxNl90b19jcHUocW54NF9pbm9kZS0+ZGlfbnVtX3h0bnRzKTsKKworCWlmICggaWJsb2NrIDwgbGUzMl90b19jcHUocW54NF9pbm9kZS0+ZGlfZmlyc3RfeHRudC54dG50X3NpemUpICkgeworCQkvLyBpYmxvY2sgaXMgaW4gdGhlIGZpcnN0IGV4dGVudC4gVGhpcyBpcyBlYXN5LgorCQlibG9jayA9IGxlMzJfdG9fY3B1KHFueDRfaW5vZGUtPmRpX2ZpcnN0X3h0bnQueHRudF9ibGspICsgaWJsb2NrIC0gMTsKKwl9IGVsc2UgeworCQkvLyBpYmxvY2sgaXMgYmV5b25kIGZpcnN0IGV4dGVudC4gV2UgaGF2ZSB0byBmb2xsb3cgdGhlIGV4dGVudCBjaGFpbi4KKwkJaV94YmxrID0gbGUzMl90b19jcHUocW54NF9pbm9kZS0+ZGlfeGJsayk7CisJCW9mZnNldCA9IGlibG9jayAtIGxlMzJfdG9fY3B1KHFueDRfaW5vZGUtPmRpX2ZpcnN0X3h0bnQueHRudF9zaXplKTsKKwkJaXggPSAwOworCQl3aGlsZSAoIC0tbnh0bnQgPiAwICkgeworCQkJaWYgKCBpeCA9PSAwICkgeworCQkJCS8vIHJlYWQgbmV4dCB4dG50IGJsb2NrLgorCQkJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIGlfeGJsayAtIDEpOworCQkJCWlmICggIWJoICkgeworCQkJCQlRTlg0REVCVUcoKCJxbng0OiBJL08gZXJyb3IgcmVhZGluZyB4dG50IGJsb2NrIFslbGRdKVxuIiwgaV94YmxrIC0gMSkpOworCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQl9CisJCQkJeGJsayA9IChzdHJ1Y3QgcW54NF94YmxrKiliaC0+Yl9kYXRhOworCQkJCWlmICggbWVtY21wKCB4YmxrLT54YmxrX3NpZ25hdHVyZSwgIklhbVhibGsiLCA3ICkgKSB7CisJCQkJCVFOWDRERUJVRygoInFueDQ6IGJsb2NrIGF0ICVsZCBpcyBub3QgYSB2YWxpZCB4dG50XG4iLCBxbng0X2lub2RlLT5pX3hibGspKTsKKwkJCQkJcmV0dXJuIC1FSU87CisJCQkJfQorCQkJfQorCQkJaWYgKCBvZmZzZXQgPCBsZTMyX3RvX2NwdSh4YmxrLT54YmxrX3h0bnRzW2l4XS54dG50X3NpemUpICkgeworCQkJCS8vIGdvdCBpdCEKKwkJCQlibG9jayA9IGxlMzJfdG9fY3B1KHhibGstPnhibGtfeHRudHNbaXhdLnh0bnRfYmxrKSArIG9mZnNldCAtIDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlvZmZzZXQgLT0gbGUzMl90b19jcHUoeGJsay0+eGJsa194dG50c1tpeF0ueHRudF9zaXplKTsKKwkJCWlmICggKytpeCA+PSB4YmxrLT54YmxrX251bV94dG50cyApIHsKKwkJCQlpX3hibGsgPSBsZTMyX3RvX2NwdSh4YmxrLT54YmxrX25leHRfeGJsayk7CisJCQkJaXggPSAwOworCQkJCWJyZWxzZSggYmggKTsKKwkJCQliaCA9IE5VTEw7CisJCQl9CisJCX0KKwkJaWYgKCBiaCApCisJCQlicmVsc2UoIGJoICk7CisJfQorCisJUU5YNERFQlVHKCgicW54NDogbWFwcGluZyBibG9jayAlbGQgb2YgaW5vZGUgJWxkID0gJWxkXG4iLGlibG9jayxpbm9kZS0+aV9pbm8sYmxvY2spKTsKKwlyZXR1cm4gYmxvY2s7Cit9CisKK3N0YXRpYyBpbnQgcW54NF9zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlsb2NrX2tlcm5lbCgpOworCisJYnVmLT5mX3R5cGUgICAgPSBzYi0+c19tYWdpYzsKKwlidWYtPmZfYnNpemUgICA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwlidWYtPmZfYmxvY2tzICA9IGxlMzJfdG9fY3B1KHFueDRfc2Ioc2IpLT5CaXRNYXAtPmRpX3NpemUpICogODsKKwlidWYtPmZfYmZyZWUgICA9IHFueDRfY291bnRfZnJlZV9ibG9ja3Moc2IpOworCWJ1Zi0+Zl9iYXZhaWwgID0gYnVmLT5mX2JmcmVlOworCWJ1Zi0+Zl9uYW1lbGVuID0gUU5YNF9OQU1FX01BWDsKKworCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2sgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBmaWxlc3lzdGVtIHRvIG1ha2Ugc3VyZQorICogaXQgcmVhbGx5IF9pc18gYSBxbng0IGZpbGVzeXN0ZW0sIGFuZCB0byBjaGVjayB0aGUgc2l6ZQorICogb2YgdGhlIGRpcmVjdG9yeSBlbnRyeS4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKnFueDRfY2hlY2tyb290KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSAqcm9vdGRpcjsKKwlpbnQgcmQsIHJsOworCWludCBpLCBqOworCWludCBmb3VuZCA9IDA7CisKKwlpZiAoKihxbng0X3NiKHNiKS0+c2ItPlJvb3REaXIuZGlfZm5hbWUpICE9ICcvJykgeworCQlyZXR1cm4gIm5vIHFueDQgZmlsZXN5c3RlbSAobm8gcm9vdCBkaXIpLiI7CisJfSBlbHNlIHsKKwkJUU5YNERFQlVHKCgiUU5YNCBmaWxlc3lzdGVtIGZvdW5kIG9uIGRldiAlcy5cbiIsIHNiLT5zX2lkKSk7CisJCXJkID0gbGUzMl90b19jcHUocW54NF9zYihzYiktPnNiLT5Sb290RGlyLmRpX2ZpcnN0X3h0bnQueHRudF9ibGspIC0gMTsKKwkJcmwgPSBsZTMyX3RvX2NwdShxbng0X3NiKHNiKS0+c2ItPlJvb3REaXIuZGlfZmlyc3RfeHRudC54dG50X3NpemUpOworCQlmb3IgKGogPSAwOyBqIDwgcmw7IGorKykgeworCQkJYmggPSBzYl9icmVhZChzYiwgcmQgKyBqKTsJLyogcm9vdCBkaXIsIGZpcnN0IGJsb2NrICovCisJCQlpZiAoYmggPT0gTlVMTCkgeworCQkJCXJldHVybiAidW5hYmxlIHRvIHJlYWQgcm9vdCBlbnRyeS4iOworCQkJfQorCQkJZm9yIChpID0gMDsgaSA8IFFOWDRfSU5PREVTX1BFUl9CTE9DSzsgaSsrKSB7CisJCQkJcm9vdGRpciA9IChzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSAqKSAoYmgtPmJfZGF0YSArIGkgKiBRTlg0X0RJUl9FTlRSWV9TSVpFKTsKKwkJCQlpZiAocm9vdGRpci0+ZGlfZm5hbWUgIT0gTlVMTCkgeworCQkJCQlRTlg0REVCVUcoKCJSb290ZGlyIGVudHJ5IGZvdW5kIDogWyVzXVxuIiwgcm9vdGRpci0+ZGlfZm5hbWUpKTsKKwkJCQkJaWYgKCFzdHJuY21wKHJvb3RkaXItPmRpX2ZuYW1lLCBRTlg0X0JNTkFNRSwgc2l6ZW9mIFFOWDRfQk1OQU1FKSkgeworCQkJCQkJZm91bmQgPSAxOworCQkJCQkJcW54NF9zYihzYiktPkJpdE1hcCA9IGttYWxsb2MoIHNpemVvZiggc3RydWN0IHFueDRfaW5vZGVfZW50cnkgKSwgR0ZQX0tFUk5FTCApOworCQkJCQkJaWYgKCFxbng0X3NiKHNiKS0+Qml0TWFwKSB7CisJCQkJCQkJYnJlbHNlIChiaCk7CisJCQkJCQkJcmV0dXJuICJub3QgZW5vdWdoIG1lbW9yeSBmb3IgYml0bWFwIGlub2RlIjsKKwkJCQkJCX0KKwkJCQkJCW1lbWNweSggcW54NF9zYihzYiktPkJpdE1hcCwgcm9vdGRpciwgc2l6ZW9mKCBzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSApICk7CS8qIGtlZXAgYml0bWFwIGlub2RlIGtub3duICovCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWxzZShiaCk7CisJCQlpZiAoZm91bmQgIT0gMCkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChmb3VuZCA9PSAwKSB7CisJCQlyZXR1cm4gImJpdG1hcCBmaWxlIG5vdCBmb3VuZC4iOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHFueDRfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgaW5vZGUgKnJvb3Q7CisJY29uc3QgY2hhciAqZXJybXNnOworCXN0cnVjdCBxbng0X3NiX2luZm8gKnFzOworCisJcXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcW54NF9zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFxcykKKwkJcmV0dXJuIC1FTk9NRU07CisJcy0+c19mc19pbmZvID0gcXM7CisJbWVtc2V0KHFzLCAwLCBzaXplb2Yoc3RydWN0IHFueDRfc2JfaW5mbykpOworCisJc2Jfc2V0X2Jsb2Nrc2l6ZShzLCBRTlg0X0JMT0NLX1NJWkUpOworCisJLyogQ2hlY2sgdGhlIHN1cGVyYmxvY2sgc2lnbmF0dXJlLiBTaW5jZSB0aGUgcW54NCBjb2RlIGlzCisJICAgZGFuZ2Vyb3VzLCB3ZSBzaG91bGQgbGVhdmUgYXMgcXVpY2tseSBhcyBwb3NzaWJsZQorCSAgIGlmIHdlIGRvbid0IGJlbG9uZyBoZXJlLi4uICovCisJYmggPSBzYl9icmVhZChzLCAxKTsKKwlpZiAoIWJoKSB7CisJCXByaW50aygicW54NDogdW5hYmxlIHRvIHJlYWQgdGhlIHN1cGVyYmxvY2tcbiIpOworCQlnb3RvIG91dG5vYmg7CisJfQorCWlmICggbGUzMl90b19jcHUoICooX191MzIqKWJoLT5iX2RhdGEgKSAhPSBRTlg0X1NVUEVSX01BR0lDICkgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50aygicW54NDogd3JvbmcgZnNpZCBpbiBzdXBlcmJsb2NrLlxuIik7CisJCWdvdG8gb3V0OworCX0KKwlzLT5zX29wID0gJnFueDRfc29wczsKKwlzLT5zX21hZ2ljID0gUU5YNF9TVVBFUl9NQUdJQzsKKyNpZm5kZWYgQ09ORklHX1FOWDRGU19SVworCXMtPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOwkvKiBZdXAsIHJlYWQtb25seSB5ZXQgKi8KKyNlbmRpZgorCXFueDRfc2IocyktPnNiX2J1ZiA9IGJoOworCXFueDRfc2IocyktPnNiID0gKHN0cnVjdCBxbng0X3N1cGVyX2Jsb2NrICopIGJoLT5iX2RhdGE7CisKKworIAkvKiBjaGVjayBiZWZvcmUgYWxsb2NhdGluZyBkZW50cmllcywgaW5vZGVzLCAuLiAqLworCWVycm1zZyA9IHFueDRfY2hlY2tyb290KHMpOworCWlmIChlcnJtc2cgIT0gTlVMTCkgeworIAkJaWYgKCFzaWxlbnQpCisgCQkJcHJpbnRrKCJxbng0OiAlc1xuIiwgZXJybXNnKTsKKwkJZ290byBvdXQ7CisJfQorCisgCS8qIGRvZXMgcm9vdCBub3QgaGF2ZSBpbm9kZSBudW1iZXIgUU5YNF9ST09UX0lOTyA/PyAqLworIAlyb290ID0gaWdldChzLCBRTlg0X1JPT1RfSU5PICogUU5YNF9JTk9ERVNfUEVSX0JMT0NLKTsKKyAJaWYgKCFyb290KSB7CisgCQlwcmludGsoInFueDQ6IGdldCBpbm9kZSBmYWlsZWRcbiIpOworIAkJZ290byBvdXQ7CisgCX0KKworIAlzLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CisgCWlmIChzLT5zX3Jvb3QgPT0gTlVMTCkKKyAJCWdvdG8gb3V0aTsKKworCWJyZWxzZShiaCk7CisKKwlyZXR1cm4gMDsKKworICAgICAgb3V0aToKKwlpcHV0KHJvb3QpOworICAgICAgb3V0OgorCWJyZWxzZShiaCk7CisgICAgICBvdXRub2JoOgorCWtmcmVlKHFzKTsKKwlzLT5zX2ZzX2luZm8gPSBOVUxMOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdm9pZCBxbng0X3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBxbng0X3NiX2luZm8gKnFzID0gcW54NF9zYihzYik7CisJa2ZyZWUoIHFzLT5CaXRNYXAgKTsKKwlrZnJlZSggcXMgKTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgcW54NF93cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXJldHVybiBibG9ja193cml0ZV9mdWxsX3BhZ2UocGFnZSxxbng0X2dldF9ibG9jaywgd2JjKTsKK30KK3N0YXRpYyBpbnQgcW54NF9yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlKHBhZ2UscW54NF9nZXRfYmxvY2spOworfQorc3RhdGljIGludCBxbng0X3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgICAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJc3RydWN0IHFueDRfaW5vZGVfaW5mbyAqcW54NF9pbm9kZSA9IHFueDRfaShwYWdlLT5tYXBwaW5nLT5ob3N0KTsKKwlyZXR1cm4gY29udF9wcmVwYXJlX3dyaXRlKHBhZ2UsIGZyb20sIHRvLCBxbng0X2dldF9ibG9jaywKKwkJCQkgICZxbng0X2lub2RlLT5tbXVfcHJpdmF0ZSk7Cit9CitzdGF0aWMgc2VjdG9yX3QgcW54NF9ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jaykKK3sKKwlyZXR1cm4gZ2VuZXJpY19ibG9ja19ibWFwKG1hcHBpbmcsYmxvY2sscW54NF9nZXRfYmxvY2spOworfQorc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgcW54NF9hb3BzID0geworCS5yZWFkcGFnZQk9IHFueDRfcmVhZHBhZ2UsCisJLndyaXRlcGFnZQk9IHFueDRfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UJPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUJPSBxbng0X3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZQk9IGdlbmVyaWNfY29tbWl0X3dyaXRlLAorCS5ibWFwCQk9IHFueDRfYm1hcAorfTsKKworc3RhdGljIHZvaWQgcW54NF9yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSAqcmF3X2lub2RlOworCWludCBibG9jaywgaW5vOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSAqcW54NF9pbm9kZSA9IHFueDRfcmF3X2lub2RlKGlub2RlKTsKKworCWlubyA9IGlub2RlLT5pX2lubzsKKwlpbm9kZS0+aV9tb2RlID0gMDsKKworCVFOWDRERUJVRygoIlJlYWRpbmcgaW5vZGUgOiBbJWRdXG4iLCBpbm8pKTsKKwlpZiAoIWlubykgeworCQlwcmludGsoInFueDQ6IGJhZCBpbm9kZSBudW1iZXIgb24gZGV2ICVzOiAlZCBpcyBvdXQgb2YgcmFuZ2VcbiIsCisJCSAgICAgICBzYi0+c19pZCwgaW5vKTsKKwkJcmV0dXJuOworCX0KKwlibG9jayA9IGlubyAvIFFOWDRfSU5PREVTX1BFUl9CTE9DSzsKKworCWlmICghKGJoID0gc2JfYnJlYWQoc2IsIGJsb2NrKSkpIHsKKwkJcHJpbnRrKCJxbng0OiBtYWpvciBwcm9ibGVtOiB1bmFibGUgdG8gcmVhZCBpbm9kZSBmcm9tIGRldiAiCisJCSAgICAgICAiJXNcbiIsIHNiLT5zX2lkKTsKKwkJcmV0dXJuOworCX0KKwlyYXdfaW5vZGUgPSAoKHN0cnVjdCBxbng0X2lub2RlX2VudHJ5ICopIGJoLT5iX2RhdGEpICsKKwkgICAgKGlubyAlIFFOWDRfSU5PREVTX1BFUl9CTE9DSyk7CisKKwlpbm9kZS0+aV9tb2RlICAgID0gbGUxNl90b19jcHUocmF3X2lub2RlLT5kaV9tb2RlKTsKKwlpbm9kZS0+aV91aWQgICAgID0gKHVpZF90KWxlMTZfdG9fY3B1KHJhd19pbm9kZS0+ZGlfdWlkKTsKKwlpbm9kZS0+aV9naWQgICAgID0gKGdpZF90KWxlMTZfdG9fY3B1KHJhd19pbm9kZS0+ZGlfZ2lkKTsKKwlpbm9kZS0+aV9ubGluayAgID0gbGUxNl90b19jcHUocmF3X2lub2RlLT5kaV9ubGluayk7CisJaW5vZGUtPmlfc2l6ZSAgICA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+ZGlfc2l6ZSk7CisJaW5vZGUtPmlfbXRpbWUudHZfc2VjICAgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmRpX210aW1lKTsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9hdGltZS50dl9zZWMgICA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+ZGlfYXRpbWUpOworCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAwOworCWlub2RlLT5pX2N0aW1lLnR2X3NlYyAgID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5kaV9jdGltZSk7CisJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7CisJaW5vZGUtPmlfYmxvY2tzICA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+ZGlfZmlyc3RfeHRudC54dG50X3NpemUpOworCWlub2RlLT5pX2Jsa3NpemUgPSBRTlg0X0RJUl9FTlRSWV9TSVpFOworCisJbWVtY3B5KHFueDRfaW5vZGUsIHJhd19pbm9kZSwgUU5YNF9ESVJfRU5UUllfU0laRSk7CisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmcW54NF9maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZxbng0X2ZpbGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcW54NF9hb3BzOworCQlxbng0X2koaW5vZGUpLT5tbXVfcHJpdmF0ZSA9IGlub2RlLT5pX3NpemU7CisJfSBlbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJnFueDRfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZxbng0X2Rpcl9vcGVyYXRpb25zOworCX0gZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcW54NF9hb3BzOworCQlxbng0X2koaW5vZGUpLT5tbXVfcHJpdmF0ZSA9IGlub2RlLT5pX3NpemU7CisJfSBlbHNlCisJCXByaW50aygicW54NDogYmFkIGlub2RlICVkIG9uIGRldiAlc1xuIixpbm8sc2ItPnNfaWQpOworCWJyZWxzZShiaCk7Cit9CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKnFueDRfaW5vZGVfY2FjaGVwOworCitzdGF0aWMgc3RydWN0IGlub2RlICpxbng0X2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHFueDRfaW5vZGVfaW5mbyAqZWk7CisJZWkgPSBrbWVtX2NhY2hlX2FsbG9jKHFueDRfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBxbng0X2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUocW54NF9pbm9kZV9jYWNoZXAsIHFueDRfaShpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IHFueDRfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IHFueDRfaW5vZGVfaW5mbyAqKSBmb287CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRlkgfCBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQorCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpCisJCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpCit7CisJcW54NF9pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgicW54NF9pbm9kZV9jYWNoZSIsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBxbng0X2lub2RlX2luZm8pLAorCQkJCQkgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKHFueDRfaW5vZGVfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKK3sKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KHFueDRfaW5vZGVfY2FjaGVwKSkKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgInFueDRfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqcW54NF9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBxbng0X2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgcW54NF9mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAicW54NCIsCisJLmdldF9zYgkJPSBxbng0X2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9xbng0X2ZzKHZvaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IGluaXRfaW5vZGVjYWNoZSgpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZxbng0X2ZzX3R5cGUpOworCWlmIChlcnIpIHsKKwkJZGVzdHJveV9pbm9kZWNhY2hlKCk7CisJCXJldHVybiBlcnI7CisJfQorCisJcHJpbnRrKCJRTlg0IGZpbGVzeXN0ZW0gMC4yLjMgcmVnaXN0ZXJlZC5cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9xbng0X2ZzKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZxbng0X2ZzX3R5cGUpOworCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworfQorCittb2R1bGVfaW5pdChpbml0X3FueDRfZnMpCittb2R1bGVfZXhpdChleGl0X3FueDRfZnMpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2ZzL3FueDQvbmFtZWkuYyBiL2ZzL3FueDQvbmFtZWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWY0OTUxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcW54NC9uYW1laS5jCkBAIC0wLDAgKzEsMjQ5IEBACisvKiAKKyAqIFFOWDQgZmlsZSBzeXN0ZW0sIExpbnV4IGltcGxlbWVudGF0aW9uLgorICogCisgKiBWZXJzaW9uIDogMC4yLjEKKyAqIAorICogVXNpbmcgcGFydHMgb2YgdGhlIHhpYWZzIGZpbGVzeXN0ZW0uCisgKiAKKyAqIEhpc3RvcnkgOgorICogCisgKiAwMS0wNi0xOTk4IGJ5IFJpY2hhcmQgRnJvd2lqbiA6IGZpcnN0IHJlbGVhc2UuCisgKiAyMS0wNi0xOTk4IGJ5IEZyYW5rIERlbmlzIDogZGNhY2hlIHN1cHBvcnQsIGZpeGVkIGVycm9yIGNvZGVzLgorICogMDQtMDctMTk5OCBieSBGcmFuayBEZW5pcyA6IGZpcnN0IHN0ZXAgZm9yIHJtZGlyL3VubGluay4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcW54NF9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisKKy8qCisgKiBjaGVjayBpZiB0aGUgZmlsZW5hbWUgaXMgY29ycmVjdC4gRm9yIHNvbWUgb2JzY3VyZSByZWFzb24sIHFueCB3cml0ZXMgYQorICogbmV3IGZpbGUgdHdpY2UgaW4gdGhlIGRpcmVjdG9yeSBlbnRyeSwgZmlyc3Qgd2l0aCBhbGwgcG9zc2libGUgb3B0aW9ucyBhdCAwCisgKiBhbmQgZm9yIGEgc2Vjb25kIHRpbWUgdGhlIHdheSBpdCBpcywgdGhleSB3YW50IHVzIG5vdCB0byBhY2Nlc3MgdGhlIHFueAorICogZmlsZXN5c3RlbSB3aGVuIHdoZSBhcmUgdXNpbmcgbGludXguCisgKi8KK3N0YXRpYyBpbnQgcW54NF9tYXRjaChpbnQgbGVuLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB1bnNpZ25lZCBsb25nICpvZmZzZXQpCit7CisJc3RydWN0IHFueDRfaW5vZGVfZW50cnkgKmRlOworCWludCBuYW1lbGVuLCB0aGlzbGVuOworCisJaWYgKGJoID09IE5VTEwpIHsKKwkJcHJpbnRrKCJxbng0OiBtYXRjaGluZyB1bmFzc2lnbmVkIGJ1ZmZlciAhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWRlID0gKHN0cnVjdCBxbng0X2lub2RlX2VudHJ5ICopIChiaC0+Yl9kYXRhICsgKm9mZnNldCk7CisJKm9mZnNldCArPSBRTlg0X0RJUl9FTlRSWV9TSVpFOworCWlmICgoZGUtPmRpX3N0YXR1cyAmIFFOWDRfRklMRV9MSU5LKSAhPSAwKSB7CisJCW5hbWVsZW4gPSBRTlg0X05BTUVfTUFYOworCX0gZWxzZSB7CisJCW5hbWVsZW4gPSBRTlg0X1NIT1JUX05BTUVfTUFYOworCX0KKwkvKiAiIiBtZWFucyAiLiIgLS0tPiBzbyBwYXRocyBsaWtlICIvdXNyL2xpYi8vbGliYy5hIiB3b3JrICovCisJaWYgKCFsZW4gJiYgKGRlLT5kaV9mbmFtZVswXSA9PSAnLicpICYmIChkZS0+ZGlfZm5hbWVbMV0gPT0gJ1wwJykpIHsKKwkJcmV0dXJuIDE7CisJfQorCXRoaXNsZW4gPSBzdHJsZW4oIGRlLT5kaV9mbmFtZSApOworCWlmICggdGhpc2xlbiA+IG5hbWVsZW4gKQorCQl0aGlzbGVuID0gbmFtZWxlbjsKKwlpZiAobGVuICE9IHRoaXNsZW4pIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzdHJuY21wKG5hbWUsIGRlLT5kaV9mbmFtZSwgbGVuKSA9PSAwKSB7CisJCWlmICgoZGUtPmRpX3N0YXR1cyAmIChRTlg0X0ZJTEVfVVNFRHxRTlg0X0ZJTEVfTElOSykpICE9IDApIHsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICpxbng0X2ZpbmRfZW50cnkoaW50IGxlbiwgc3RydWN0IGlub2RlICpkaXIsCisJICAgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHFueDRfaW5vZGVfZW50cnkgKipyZXNfZGlyLCBpbnQgKmlubykKK3sKKwl1bnNpZ25lZCBsb25nIGJsb2NrLCBvZmZzZXQsIGJsa29mczsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJKnJlc19kaXIgPSBOVUxMOworCWlmICghZGlyLT5pX3NiKSB7CisJCXByaW50aygicW54NDogbm8gc3VwZXJibG9jayBvbiBkaXIuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWJoID0gTlVMTDsKKwlibG9jayA9IG9mZnNldCA9IGJsa29mcyA9IDA7CisJd2hpbGUgKGJsa29mcyAqIFFOWDRfQkxPQ0tfU0laRSArIG9mZnNldCA8IGRpci0+aV9zaXplKSB7CisJCWlmICghYmgpIHsKKwkJCWJoID0gcW54NF9icmVhZChkaXIsIGJsa29mcywgMCk7CisJCQlpZiAoIWJoKSB7CisJCQkJYmxrb2ZzKys7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJKnJlc19kaXIgPSAoc3RydWN0IHFueDRfaW5vZGVfZW50cnkgKikgKGJoLT5iX2RhdGEgKyBvZmZzZXQpOworCQlpZiAocW54NF9tYXRjaChsZW4sIG5hbWUsIGJoLCAmb2Zmc2V0KSkgeworCQkJYmxvY2sgPSBxbng0X2Jsb2NrX21hcCggZGlyLCBibGtvZnMgKTsKKwkJCSppbm8gPSBibG9jayAqIFFOWDRfSU5PREVTX1BFUl9CTE9DSyArCisJCQkgICAgKG9mZnNldCAvIFFOWDRfRElSX0VOVFJZX1NJWkUpIC0gMTsKKwkJCXJldHVybiBiaDsKKwkJfQorCQlpZiAob2Zmc2V0IDwgYmgtPmJfc2l6ZSkgeworCQkJY29udGludWU7CisJCX0KKwkJYnJlbHNlKGJoKTsKKwkJYmggPSBOVUxMOworCQlvZmZzZXQgPSAwOworCQlibGtvZnMrKzsKKwl9CisJYnJlbHNlKGJoKTsKKwkqcmVzX2RpciA9IE5VTEw7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBkZW50cnkgKiBxbng0X2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlpbnQgaW5vOworCXN0cnVjdCBxbng0X2lub2RlX2VudHJ5ICpkZTsKKwlzdHJ1Y3QgcW54NF9saW5rX2luZm8gKmxuazsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWNvbnN0IGNoYXIgKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludCBsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJc3RydWN0IGlub2RlICpmb3VuZGlub2RlID0gTlVMTDsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKCEoYmggPSBxbng0X2ZpbmRfZW50cnkobGVuLCBkaXIsIG5hbWUsICZkZSwgJmlubykpKQorCQlnb3RvIG91dDsKKwkvKiBUaGUgZW50cnkgaXMgbGlua2VkLCBsZXQncyBnZXQgdGhlIHJlYWwgaW5mbyAqLworCWlmICgoZGUtPmRpX3N0YXR1cyAmIFFOWDRfRklMRV9MSU5LKSA9PSBRTlg0X0ZJTEVfTElOSykgeworCQlsbmsgPSAoc3RydWN0IHFueDRfbGlua19pbmZvICopIGRlOworCQlpbm8gPSAobGUzMl90b19jcHUobG5rLT5kbF9pbm9kZV9ibGspIC0gMSkgKgorICAgICAgICAgICAgICAgICAgICBRTlg0X0lOT0RFU19QRVJfQkxPQ0sgKworCQkgICAgbG5rLT5kbF9pbm9kZV9uZHg7CisJfQorCWJyZWxzZShiaCk7CisKKwlpZiAoKGZvdW5kaW5vZGUgPSBpZ2V0KGRpci0+aV9zYiwgaW5vKSkgPT0gTlVMTCkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCVFOWDRERUJVRygoInFueDQ6IGxvb2t1cC0+aWdldCAtPiBOVUxMXG4iKSk7CisJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCX0KK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJZF9hZGQoZGVudHJ5LCBmb3VuZGlub2RlKTsKKworCXJldHVybiBOVUxMOworfQorCisjaWZkZWYgQ09ORklHX1FOWDRGU19SVworaW50IHFueDRfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlRTlg0REVCVUcoKCJxbng0OiBxbng0X2NyZWF0ZVxuIikpOworCWlmIChkaXIgPT0gTlVMTCkgeworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJcmV0dXJuIC1FTk9TUEM7Cit9CisKK2ludCBxbng0X3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSAqZGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgcmV0dmFsOworCWludCBpbm87CisKKwlRTlg0REVCVUcoKCJxbng0OiBxbng0X3JtZGlyIFslc11cbiIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpKTsKKwlsb2NrX2tlcm5lbCgpOworCWJoID0gcW54NF9maW5kX2VudHJ5KGRlbnRyeS0+ZF9uYW1lLmxlbiwgZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJICAgICAmZGUsICZpbm8pOworCWlmIChiaCA9PSBOVUxMKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWlmIChpbm9kZS0+aV9pbm8gIT0gaW5vKSB7CisJCXJldHZhbCA9IC1FSU87CisJCWdvdG8gZW5kX3JtZGlyOworCX0KKyNpZiAwCisJaWYgKCFlbXB0eV9kaXIoaW5vZGUpKSB7CisJCXJldHZhbCA9IC1FTk9URU1QVFk7CisJCWdvdG8gZW5kX3JtZGlyOworCX0KKyNlbmRpZgorCWlmIChpbm9kZS0+aV9ubGluayAhPSAyKSB7CisJCVFOWDRERUJVRygoImVtcHR5IGRpcmVjdG9yeSBoYXMgbmxpbmshPTIgKCVkKVxuIiwgaW5vZGUtPmlfbmxpbmspKTsKKwl9CisJUU5YNERFQlVHKCgicW54NDogZGVsZXRpbmcgZGlyZWN0b3J5XG4iKSk7CisJZGUtPmRpX3N0YXR1cyA9IDA7CisJbWVtc2V0KGRlLT5kaV9mbmFtZSwgMCwgc2l6ZW9mIGRlLT5kaV9mbmFtZSk7CisJZGUtPmRpX21vZGUgPSAwOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlpbm9kZS0+aV9ubGluayA9IDA7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWUgPSBkaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWRpci0+aV9ubGluay0tOworCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKKwlyZXR2YWwgPSAwOworCisgICAgICBlbmRfcm1kaXI6CisJYnJlbHNlKGJoKTsKKworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgcW54NF91bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBxbng0X2lub2RlX2VudHJ5ICpkZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCByZXR2YWw7CisJaW50IGlubzsKKworCVFOWDRERUJVRygoInFueDQ6IHFueDRfdW5saW5rIFslc11cbiIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpKTsKKwlsb2NrX2tlcm5lbCgpOworCWJoID0gcW54NF9maW5kX2VudHJ5KGRlbnRyeS0+ZF9uYW1lLmxlbiwgZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJICAgICAmZGUsICZpbm8pOworCWlmIChiaCA9PSBOVUxMKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWlmIChpbm9kZS0+aV9pbm8gIT0gaW5vKSB7CisJCXJldHZhbCA9IC1FSU87CisJCWdvdG8gZW5kX3VubGluazsKKwl9CisJcmV0dmFsID0gLUVQRVJNOworCWlmICghaW5vZGUtPmlfbmxpbmspIHsKKwkJUU5YNERFQlVHKCgiRGVsZXRpbmcgbm9uZXhpc3RlbnQgZmlsZSAoJXM6JWx1KSwgJWRcbiIsCisJCQkgICBpbm9kZS0+aV9zYi0+c19pZCwKKwkJCSAgIGlub2RlLT5pX2lubywgaW5vZGUtPmlfbmxpbmspKTsKKwkJaW5vZGUtPmlfbmxpbmsgPSAxOworCX0KKwlkZS0+ZGlfc3RhdHVzID0gMDsKKwltZW1zZXQoZGUtPmRpX2ZuYW1lLCAwLCBzaXplb2YgZGUtPmRpX2ZuYW1lKTsKKwlkZS0+ZGlfbW9kZSA9IDA7CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWRpci0+aV9jdGltZSA9IGRpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCWlub2RlLT5pX25saW5rLS07CisJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWU7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJcmV0dmFsID0gMDsKKworZW5kX3VubGluazoKKwl1bmxvY2tfa2VybmVsKCk7CisJYnJlbHNlKGJoKTsKKworCXJldHVybiByZXR2YWw7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL3FueDQvdHJ1bmNhdGUuYyBiL2ZzL3FueDQvdHJ1bmNhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjU2M2VjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcW54NC90cnVuY2F0ZS5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qIAorICogUU5YNCBmaWxlIHN5c3RlbSwgTGludXggaW1wbGVtZW50YXRpb24uCisgKiAKKyAqIFZlcnNpb24gOiAwLjEKKyAqIAorICogVXNpbmcgcGFydHMgb2YgdGhlIHhpYWZzIGZpbGVzeXN0ZW0uCisgKiAKKyAqIEhpc3RvcnkgOgorICogCisgKiAzMC0wNi0xOTk4IGJ5IEZyYW5rIERFTklTIDogdWdseSBmaWxsZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3FueDRfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpZmRlZiBDT05GSUdfUU5YNEZTX1JXCisKK3ZvaWQgcW54NF90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmICghKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fAorCSAgICAgIFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpKSB7CisJCXJldHVybjsKKwl9CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoIShTX0lTRElSKGlub2RlLT5pX21vZGUpKSkgeworCQkvKiBUT0RPICovCisJfQorCVFOWDRERUJVRygoInFueDQ6IHFueDRfdHJ1bmNhdGUgY2FsbGVkXG4iKSk7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJdW5sb2NrX2tlcm5lbCgpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL3F1b3RhLmMgYi9mcy9xdW90YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMDMzM2EKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9xdW90YS5jCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogUXVvdGEgY29kZSBuZWNlc3NhcnkgZXZlbiB3aGVuIFZGUyBxdW90YSBzdXBwb3J0IGlzIG5vdCBjb21waWxlZAorICogaW50byB0aGUga2VybmVsLiAgVGhlIGludGVyZXN0aW5nIHN0dWZmIGlzIG92ZXIgaW4gZHF1b3QuYywgaGVyZQorICogd2UgaGF2ZSBzeW1ib2xzIGZvciBpbml0aWFsIHF1b3RhY3RsKDIpIGhhbmRsaW5nLCB0aGUgc3lzY3RsKDIpCisgKiB2YXJpYWJsZXMsIGV0YyAtIHRoaW5ncyBuZWVkZWQgZXZlbiB3aGVuIHF1b3RhIHN1cHBvcnQgZGlzYWJsZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKy8qIENoZWNrIHZhbGlkaXR5IG9mIGdlbmVyaWMgcXVvdGFjdGwgY29tbWFuZHMgKi8KK3N0YXRpYyBpbnQgZ2VuZXJpY19xdW90YWN0bF92YWxpZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgaW50IGNtZCwgcWlkX3QgaWQpCit7CisJaWYgKHR5cGUgPj0gTUFYUVVPVEFTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXNiICYmIGNtZCAhPSBRX1NZTkMpCisJCXJldHVybiAtRU5PREVWOworCS8qIElzIG9wZXJhdGlvbiBzdXBwb3J0ZWQ/ICovCisJaWYgKHNiICYmICFzYi0+c19xY29wKQorCQlyZXR1cm4gLUVOT1NZUzsKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgUV9HRVRGTVQ6CisJCQlicmVhazsKKwkJY2FzZSBRX1FVT1RBT046CisJCQlpZiAoIXNiLT5zX3Fjb3AtPnF1b3RhX29uKQorCQkJCXJldHVybiAtRU5PU1lTOworCQkJYnJlYWs7CisJCWNhc2UgUV9RVU9UQU9GRjoKKwkJCWlmICghc2ItPnNfcWNvcC0+cXVvdGFfb2ZmKQorCQkJCXJldHVybiAtRU5PU1lTOworCQkJYnJlYWs7CisJCWNhc2UgUV9TRVRJTkZPOgorCQkJaWYgKCFzYi0+c19xY29wLT5zZXRfaW5mbykKKwkJCQlyZXR1cm4gLUVOT1NZUzsKKwkJCWJyZWFrOworCQljYXNlIFFfR0VUSU5GTzoKKwkJCWlmICghc2ItPnNfcWNvcC0+Z2V0X2luZm8pCisJCQkJcmV0dXJuIC1FTk9TWVM7CisJCQlicmVhazsKKwkJY2FzZSBRX1NFVFFVT1RBOgorCQkJaWYgKCFzYi0+c19xY29wLT5zZXRfZHFibGspCisJCQkJcmV0dXJuIC1FTk9TWVM7CisJCQlicmVhazsKKwkJY2FzZSBRX0dFVFFVT1RBOgorCQkJaWYgKCFzYi0+c19xY29wLT5nZXRfZHFibGspCisJCQkJcmV0dXJuIC1FTk9TWVM7CisJCQlicmVhazsKKwkJY2FzZSBRX1NZTkM6CisJCQlpZiAoc2IgJiYgIXNiLT5zX3Fjb3AtPnF1b3RhX3N5bmMpCisJCQkJcmV0dXJuIC1FTk9TWVM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIElzIHF1b3RhIHR1cm5lZCBvbiBmb3IgY29tbWFuZHMgd2hpY2ggbmVlZCBpdD8gKi8KKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFFfR0VURk1UOgorCQljYXNlIFFfR0VUSU5GTzoKKwkJY2FzZSBRX1FVT1RBT0ZGOgorCQljYXNlIFFfU0VUSU5GTzoKKwkJY2FzZSBRX1NFVFFVT1RBOgorCQljYXNlIFFfR0VUUVVPVEE6CisJCQkvKiBUaGlzIGlzIGp1c3QgaW5mb3JtYXRpdmUgdGVzdCBzbyB3ZSBhcmUgc2F0aXNmaWVkIHdpdGhvdXQgYSBsb2NrICovCisJCQlpZiAoIXNiX2hhc19xdW90YV9lbmFibGVkKHNiLCB0eXBlKSkKKwkJCQlyZXR1cm4gLUVTUkNIOworCX0KKworCS8qIENoZWNrIHByaXZpbGVnZXMgKi8KKwlpZiAoY21kID09IFFfR0VUUVVPVEEpIHsKKwkJaWYgKCgodHlwZSA9PSBVU1JRVU9UQSAmJiBjdXJyZW50LT5ldWlkICE9IGlkKSB8fAorCQkgICAgICh0eXBlID09IEdSUFFVT1RBICYmICFpbl9lZ3JvdXBfcChpZCkpKSAmJgorCQkgICAgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCX0KKwllbHNlIGlmIChjbWQgIT0gUV9HRVRGTVQgJiYgY21kICE9IFFfU1lOQyAmJiBjbWQgIT0gUV9HRVRJTkZPKQorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENoZWNrIHZhbGlkaXR5IG9mIFhGUyBRdW90YSBNYW5hZ2VyIGNvbW1hbmRzICovCitzdGF0aWMgaW50IHhxbV9xdW90YWN0bF92YWxpZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgaW50IGNtZCwgcWlkX3QgaWQpCit7CisJaWYgKHR5cGUgPj0gWFFNX01BWFFVT1RBUykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFzYikKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFzYi0+c19xY29wKQorCQlyZXR1cm4gLUVOT1NZUzsKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgUV9YUVVPVEFPTjoKKwkJY2FzZSBRX1hRVU9UQU9GRjoKKwkJY2FzZSBRX1hRVU9UQVJNOgorCQkJaWYgKCFzYi0+c19xY29wLT5zZXRfeHN0YXRlKQorCQkJCXJldHVybiAtRU5PU1lTOworCQkJYnJlYWs7CisJCWNhc2UgUV9YR0VUUVNUQVQ6CisJCQlpZiAoIXNiLT5zX3Fjb3AtPmdldF94c3RhdGUpCisJCQkJcmV0dXJuIC1FTk9TWVM7CisJCQlicmVhazsKKwkJY2FzZSBRX1hTRVRRTElNOgorCQkJaWYgKCFzYi0+c19xY29wLT5zZXRfeHF1b3RhKQorCQkJCXJldHVybiAtRU5PU1lTOworCQkJYnJlYWs7CisJCWNhc2UgUV9YR0VUUVVPVEE6CisJCQlpZiAoIXNiLT5zX3Fjb3AtPmdldF94cXVvdGEpCisJCQkJcmV0dXJuIC1FTk9TWVM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENoZWNrIHByaXZpbGVnZXMgKi8KKwlpZiAoY21kID09IFFfWEdFVFFVT1RBKSB7CisJCWlmICgoKHR5cGUgPT0gWFFNX1VTUlFVT1RBICYmIGN1cnJlbnQtPmV1aWQgIT0gaWQpIHx8CisJCSAgICAgKHR5cGUgPT0gWFFNX0dSUFFVT1RBICYmICFpbl9lZ3JvdXBfcChpZCkpKSAmJgorCQkgICAgICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwl9IGVsc2UgaWYgKGNtZCAhPSBRX1hHRVRRU1RBVCkgeworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX3F1b3RhY3RsX3ZhbGlkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBpbnQgY21kLCBxaWRfdCBpZCkKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoWFFNX0NPTU1BTkQoY21kKSkKKwkJZXJyb3IgPSB4cW1fcXVvdGFjdGxfdmFsaWQoc2IsIHR5cGUsIGNtZCwgaWQpOworCWVsc2UKKwkJZXJyb3IgPSBnZW5lcmljX3F1b3RhY3RsX3ZhbGlkKHNiLCB0eXBlLCBjbWQsIGlkKTsKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IHNlY3VyaXR5X3F1b3RhY3RsKGNtZCwgdHlwZSwgaWQsIHNiKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmdldF9zdXBlcl90b19zeW5jKGludCB0eXBlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CisJaW50IGNudCwgZGlydHk7CisKK3Jlc3RhcnQ6CisJc3Bpbl9sb2NrKCZzYl9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKGhlYWQsICZzdXBlcl9ibG9ja3MpIHsKKwkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGxpc3RfZW50cnkoaGVhZCwgc3RydWN0IHN1cGVyX2Jsb2NrLCBzX2xpc3QpOworCisJCS8qIFRoaXMgdGVzdCBqdXN0IGltcHJvdmVzIHBlcmZvcm1hbmNlIHNvIGl0IG5lZWRuJ3QgYmUgcmVsaWFibGUuLi4gKi8KKwkJZm9yIChjbnQgPSAwLCBkaXJ0eSA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspCisJCQlpZiAoKHR5cGUgPT0gY250IHx8IHR5cGUgPT0gLTEpICYmIHNiX2hhc19xdW90YV9lbmFibGVkKHNiLCBjbnQpCisJCQkgICAgJiYgaW5mb19hbnlfZGlydHkoJnNiX2Rxb3B0KHNiKS0+aW5mb1tjbnRdKSkKKwkJCQlkaXJ0eSA9IDE7CisJCWlmICghZGlydHkpCisJCQljb250aW51ZTsKKwkJc2ItPnNfY291bnQrKzsKKwkJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCQlkb3duX3JlYWQoJnNiLT5zX3Vtb3VudCk7CisJCWlmICghc2ItPnNfcm9vdCkgeworCQkJZHJvcF9zdXBlcihzYik7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKwkJcmV0dXJuIHNiOworCX0KKwlzcGluX3VubG9jaygmc2JfbG9jayk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHF1b3RhX3N5bmNfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJaW50IGNudDsKKwlzdHJ1Y3QgaW5vZGUgKmRpc2NhcmRbTUFYUVVPVEFTXTsKKworCXNiLT5zX3Fjb3AtPnF1b3RhX3N5bmMoc2IsIHR5cGUpOworCS8qIFRoaXMgaXMgbm90IHZlcnkgY2xldmVyIChhbmQgZmFzdCkgYnV0IGN1cnJlbnRseSBJIGRvbid0IGtub3cgYWJvdXQKKwkgKiBhbnkgb3RoZXIgc2ltcGxlIHdheSBvZiBnZXR0aW5nIHF1b3RhIGRhdGEgdG8gZGlzayBhbmQgd2UgbXVzdCBnZXQKKwkgKiB0aGVtIHRoZXJlIGZvciB1c2Vyc3BhY2UgdG8gYmUgdmlzaWJsZS4uLiAqLworCWlmIChzYi0+c19vcC0+c3luY19mcykKKwkJc2ItPnNfb3AtPnN5bmNfZnMoc2IsIDEpOworCXN5bmNfYmxvY2tkZXYoc2ItPnNfYmRldik7CisKKwkvKiBOb3cgd2hlbiBldmVyeXRoaW5nIGlzIHdyaXR0ZW4gd2UgY2FuIGRpc2NhcmQgdGhlIHBhZ2VjYWNoZSBzbworCSAqIHRoYXQgdXNlcnNwYWNlIHNlZXMgdGhlIGNoYW5nZXMuIFdlIG5lZWQgaV9zZW0gYW5kIHNvIHdlIGNvdWxkCisJICogbm90IGRvIGl0IGluc2lkZSBkcW9ub2ZmX3NlbS4gTW9yZW92ZXIgd2UgbmVlZCB0byBiZSBjYXJlZnVsbAorCSAqIGFib3V0IHJhY2VzIHdpdGggcXVvdGFvZmYoKSAodGhhdCBpcyB0aGUgcmVhc29uIHdoeSB3ZSBoYXZlIG93bgorCSAqIHJlZmVyZW5jZSB0byBpbm9kZSkuICovCisJZG93bigmc2JfZHFvcHQoc2IpLT5kcW9ub2ZmX3NlbSk7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKSB7CisJCWRpc2NhcmRbY250XSA9IE5VTEw7CisJCWlmICh0eXBlICE9IC0xICYmIGNudCAhPSB0eXBlKQorCQkJY29udGludWU7CisJCWlmICghc2JfaGFzX3F1b3RhX2VuYWJsZWQoc2IsIGNudCkpCisJCQljb250aW51ZTsKKwkJZGlzY2FyZFtjbnRdID0gaWdyYWIoc2JfZHFvcHQoc2IpLT5maWxlc1tjbnRdKTsKKwl9CisJdXAoJnNiX2Rxb3B0KHNiKS0+ZHFvbm9mZl9zZW0pOworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgeworCQlpZiAoZGlzY2FyZFtjbnRdKSB7CisJCQlkb3duKCZkaXNjYXJkW2NudF0tPmlfc2VtKTsKKwkJCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZkaXNjYXJkW2NudF0tPmlfZGF0YSwgMCk7CisJCQl1cCgmZGlzY2FyZFtjbnRdLT5pX3NlbSk7CisJCQlpcHV0KGRpc2NhcmRbY250XSk7CisJCX0KKwl9Cit9CisKK3ZvaWQgc3luY19kcXVvdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJaWYgKHNiKSB7CisJCWlmIChzYi0+c19xY29wLT5xdW90YV9zeW5jKQorCQkJcXVvdGFfc3luY19zYihzYiwgdHlwZSk7CisJfQorCWVsc2UgeworCQl3aGlsZSAoKHNiID0gZ2V0X3N1cGVyX3RvX3N5bmModHlwZSkpICE9IE5VTEwpIHsKKwkJCWlmIChzYi0+c19xY29wLT5xdW90YV9zeW5jKQorCQkJCXF1b3RhX3N5bmNfc2Ioc2IsIHR5cGUpOworCQkJZHJvcF9zdXBlcihzYik7CisJCX0KKwl9Cit9CisKKy8qIENvcHkgcGFyYW1ldGVycyBhbmQgY2FsbCBwcm9wZXIgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgZG9fcXVvdGFjdGwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCBjbWQsIHFpZF90IGlkLCB2b2lkIF9fdXNlciAqYWRkcikKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBRX1FVT1RBT046IHsKKwkJCWNoYXIgKnBhdGhuYW1lOworCisJCQlpZiAoSVNfRVJSKHBhdGhuYW1lID0gZ2V0bmFtZShhZGRyKSkpCisJCQkJcmV0dXJuIFBUUl9FUlIocGF0aG5hbWUpOworCQkJcmV0ID0gc2ItPnNfcWNvcC0+cXVvdGFfb24oc2IsIHR5cGUsIGlkLCBwYXRobmFtZSk7CisJCQlwdXRuYW1lKHBhdGhuYW1lKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJY2FzZSBRX1FVT1RBT0ZGOgorCQkJcmV0dXJuIHNiLT5zX3Fjb3AtPnF1b3RhX29mZihzYiwgdHlwZSk7CisKKwkJY2FzZSBRX0dFVEZNVDogeworCQkJX191MzIgZm10OworCisJCQlkb3duX3JlYWQoJnNiX2Rxb3B0KHNiKS0+ZHFwdHJfc2VtKTsKKwkJCWlmICghc2JfaGFzX3F1b3RhX2VuYWJsZWQoc2IsIHR5cGUpKSB7CisJCQkJdXBfcmVhZCgmc2JfZHFvcHQoc2IpLT5kcXB0cl9zZW0pOworCQkJCXJldHVybiAtRVNSQ0g7CisJCQl9CisJCQlmbXQgPSBzYl9kcW9wdChzYiktPmluZm9bdHlwZV0uZHFpX2Zvcm1hdC0+cWZfZm10X2lkOworCQkJdXBfcmVhZCgmc2JfZHFvcHQoc2IpLT5kcXB0cl9zZW0pOworCQkJaWYgKGNvcHlfdG9fdXNlcihhZGRyLCAmZm10LCBzaXplb2YoZm10KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFFfR0VUSU5GTzogeworCQkJc3RydWN0IGlmX2RxaW5mbyBpbmZvOworCisJCQlpZiAoKHJldCA9IHNiLT5zX3Fjb3AtPmdldF9pbmZvKHNiLCB0eXBlLCAmaW5mbykpKQorCQkJCXJldHVybiByZXQ7CisJCQlpZiAoY29weV90b191c2VyKGFkZHIsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBRX1NFVElORk86IHsKKwkJCXN0cnVjdCBpZl9kcWluZm8gaW5mbzsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhZGRyLCBzaXplb2YoaW5mbykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIHNiLT5zX3Fjb3AtPnNldF9pbmZvKHNiLCB0eXBlLCAmaW5mbyk7CisJCX0KKwkJY2FzZSBRX0dFVFFVT1RBOiB7CisJCQlzdHJ1Y3QgaWZfZHFibGsgaWRxOworCisJCQlpZiAoKHJldCA9IHNiLT5zX3Fjb3AtPmdldF9kcWJsayhzYiwgdHlwZSwgaWQsICZpZHEpKSkKKwkJCQlyZXR1cm4gcmV0OworCQkJaWYgKGNvcHlfdG9fdXNlcihhZGRyLCAmaWRxLCBzaXplb2YoaWRxKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFFfU0VUUVVPVEE6IHsKKwkJCXN0cnVjdCBpZl9kcWJsayBpZHE7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmaWRxLCBhZGRyLCBzaXplb2YoaWRxKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gc2ItPnNfcWNvcC0+c2V0X2RxYmxrKHNiLCB0eXBlLCBpZCwgJmlkcSk7CisJCX0KKwkJY2FzZSBRX1NZTkM6CisJCQlzeW5jX2RxdW90cyhzYiwgdHlwZSk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFFfWFFVT1RBT046CisJCWNhc2UgUV9YUVVPVEFPRkY6CisJCWNhc2UgUV9YUVVPVEFSTTogeworCQkJX191MzIgZmxhZ3M7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmZmxhZ3MsIGFkZHIsIHNpemVvZihmbGFncykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIHNiLT5zX3Fjb3AtPnNldF94c3RhdGUoc2IsIGZsYWdzLCBjbWQpOworCQl9CisJCWNhc2UgUV9YR0VUUVNUQVQ6IHsKKwkJCXN0cnVjdCBmc19xdW90YV9zdGF0IGZxczsKKwkJCisJCQlpZiAoKHJldCA9IHNiLT5zX3Fjb3AtPmdldF94c3RhdGUoc2IsICZmcXMpKSkKKwkJCQlyZXR1cm4gcmV0OworCQkJaWYgKGNvcHlfdG9fdXNlcihhZGRyLCAmZnFzLCBzaXplb2YoZnFzKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFFfWFNFVFFMSU06IHsKKwkJCXN0cnVjdCBmc19kaXNrX3F1b3RhIGZkcTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZmZHEsIGFkZHIsIHNpemVvZihmZHEpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJICAgICAgIHJldHVybiBzYi0+c19xY29wLT5zZXRfeHF1b3RhKHNiLCB0eXBlLCBpZCwgJmZkcSk7CisJCX0KKwkJY2FzZSBRX1hHRVRRVU9UQTogeworCQkJc3RydWN0IGZzX2Rpc2tfcXVvdGEgZmRxOworCisJCQlpZiAoKHJldCA9IHNiLT5zX3Fjb3AtPmdldF94cXVvdGEoc2IsIHR5cGUsIGlkLCAmZmRxKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYWRkciwgJmZkcSwgc2l6ZW9mKGZkcSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyogV2UgbmV2ZXIgcmVhY2ggaGVyZSB1bmxlc3MgdmFsaWRpdHkgY2hlY2sgaXMgYnJva2VuICovCisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBzeXN0ZW0gY2FsbCBpbnRlcmZhY2UuIFRoaXMgY29tbXVuaWNhdGVzIHdpdGgKKyAqIHRoZSB1c2VyLWxldmVsIHByb2dyYW1zLiBDdXJyZW50bHkgdGhpcyBvbmx5IHN1cHBvcnRzIGRpc2txdW90YQorICogY2FsbHMuIE1heWJlIHdlIG5lZWQgdG8gYWRkIHRoZSBwcm9jZXNzIHF1b3RhcyBldGMuIGluIHRoZSBmdXR1cmUsCisgKiBidXQgd2UgcHJvYmFibHkgc2hvdWxkIHVzZSBybGltaXRzIGZvciB0aGF0LgorICovCithc21saW5rYWdlIGxvbmcgc3lzX3F1b3RhY3RsKHVuc2lnbmVkIGludCBjbWQsIGNvbnN0IGNoYXIgX191c2VyICpzcGVjaWFsLCBxaWRfdCBpZCwgdm9pZCBfX3VzZXIgKmFkZHIpCit7CisJdWludCBjbWRzLCB0eXBlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBOVUxMOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisJY2hhciAqdG1wOworCWludCByZXQ7CisKKwljbWRzID0gY21kID4+IFNVQkNNRFNISUZUOworCXR5cGUgPSBjbWQgJiBTVUJDTURNQVNLOworCisJaWYgKGNtZHMgIT0gUV9TWU5DIHx8IHNwZWNpYWwpIHsKKwkJdG1wID0gZ2V0bmFtZShzcGVjaWFsKTsKKwkJaWYgKElTX0VSUih0bXApKQorCQkJcmV0dXJuIFBUUl9FUlIodG1wKTsKKwkJYmRldiA9IGxvb2t1cF9iZGV2KHRtcCk7CisJCXB1dG5hbWUodG1wKTsKKwkJaWYgKElTX0VSUihiZGV2KSkKKwkJCXJldHVybiBQVFJfRVJSKGJkZXYpOworCQlzYiA9IGdldF9zdXBlcihiZGV2KTsKKwkJYmRwdXQoYmRldik7CisJCWlmICghc2IpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXQgPSBjaGVja19xdW90YWN0bF92YWxpZChzYiwgdHlwZSwgY21kcywgaWQpOworCWlmIChyZXQgPj0gMCkKKwkJcmV0ID0gZG9fcXVvdGFjdGwoc2IsIHR5cGUsIGNtZHMsIGlkLCBhZGRyKTsKKwlpZiAoc2IpCisJCWRyb3Bfc3VwZXIoc2IpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2ZzL3F1b3RhX3YxLmMgYi9mcy9xdW90YV92MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzODQxZjIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9xdW90YV92MS5jCkBAIC0wLDAgKzEsMjAwIEBACisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3RhLmg+CisjaW5jbHVkZSA8bGludXgvZHFibGtfdjEuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YWlvX3YxLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCitNT0RVTEVfQVVUSE9SKCJKYW4gS2FyYSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJPbGQgcXVvdGEgZm9ybWF0IHN1cHBvcnQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHZvaWQgdjFfZGlzazJtZW1fZHFibGsoc3RydWN0IG1lbV9kcWJsayAqbSwgc3RydWN0IHYxX2Rpc2tfZHFibGsgKmQpCit7CisJbS0+ZHFiX2loYXJkbGltaXQgPSBkLT5kcWJfaWhhcmRsaW1pdDsKKwltLT5kcWJfaXNvZnRsaW1pdCA9IGQtPmRxYl9pc29mdGxpbWl0OworCW0tPmRxYl9jdXJpbm9kZXMgPSBkLT5kcWJfY3VyaW5vZGVzOworCW0tPmRxYl9iaGFyZGxpbWl0ID0gZC0+ZHFiX2JoYXJkbGltaXQ7CisJbS0+ZHFiX2Jzb2Z0bGltaXQgPSBkLT5kcWJfYnNvZnRsaW1pdDsKKwltLT5kcWJfY3Vyc3BhY2UgPSAoKHFzaXplX3QpZC0+ZHFiX2N1cmJsb2NrcykgPDwgUVVPVEFCTE9DS19CSVRTOworCW0tPmRxYl9pdGltZSA9IGQtPmRxYl9pdGltZTsKKwltLT5kcWJfYnRpbWUgPSBkLT5kcWJfYnRpbWU7Cit9CisKK3N0YXRpYyB2b2lkIHYxX21lbTJkaXNrX2RxYmxrKHN0cnVjdCB2MV9kaXNrX2RxYmxrICpkLCBzdHJ1Y3QgbWVtX2RxYmxrICptKQoreworCWQtPmRxYl9paGFyZGxpbWl0ID0gbS0+ZHFiX2loYXJkbGltaXQ7CisJZC0+ZHFiX2lzb2Z0bGltaXQgPSBtLT5kcWJfaXNvZnRsaW1pdDsKKwlkLT5kcWJfY3VyaW5vZGVzID0gbS0+ZHFiX2N1cmlub2RlczsKKwlkLT5kcWJfYmhhcmRsaW1pdCA9IG0tPmRxYl9iaGFyZGxpbWl0OworCWQtPmRxYl9ic29mdGxpbWl0ID0gbS0+ZHFiX2Jzb2Z0bGltaXQ7CisJZC0+ZHFiX2N1cmJsb2NrcyA9IHRvcWIobS0+ZHFiX2N1cnNwYWNlKTsKKwlkLT5kcWJfaXRpbWUgPSBtLT5kcWJfaXRpbWU7CisJZC0+ZHFiX2J0aW1lID0gbS0+ZHFiX2J0aW1lOworfQorCitzdGF0aWMgaW50IHYxX3JlYWRfZHFibGsoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpbnQgdHlwZSA9IGRxdW90LT5kcV90eXBlOworCXN0cnVjdCB2MV9kaXNrX2RxYmxrIGRxYmxrOworCisJaWYgKCFzYl9kcW9wdChkcXVvdC0+ZHFfc2IpLT5maWxlc1t0eXBlXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBTZXQgc3RydWN0dXJlIHRvIDBzIGluIGNhc2UgcmVhZCBmYWlscy9pcyBhZnRlciBlbmQgb2YgZmlsZSAqLworCW1lbXNldCgmZHFibGssIDAsIHNpemVvZihzdHJ1Y3QgdjFfZGlza19kcWJsaykpOworCWRxdW90LT5kcV9zYi0+c19vcC0+cXVvdGFfcmVhZChkcXVvdC0+ZHFfc2IsIHR5cGUsIChjaGFyICopJmRxYmxrLCBzaXplb2Yoc3RydWN0IHYxX2Rpc2tfZHFibGspLCB2MV9kcW9mZihkcXVvdC0+ZHFfaWQpKTsKKworCXYxX2Rpc2sybWVtX2RxYmxrKCZkcXVvdC0+ZHFfZHFiLCAmZHFibGspOworCWlmIChkcXVvdC0+ZHFfZHFiLmRxYl9iaGFyZGxpbWl0ID09IDAgJiYgZHF1b3QtPmRxX2RxYi5kcWJfYnNvZnRsaW1pdCA9PSAwICYmCisJICAgIGRxdW90LT5kcV9kcWIuZHFiX2loYXJkbGltaXQgPT0gMCAmJiBkcXVvdC0+ZHFfZHFiLmRxYl9pc29mdGxpbWl0ID09IDApCisJCXNldF9iaXQoRFFfRkFLRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwlkcXN0YXRzLnJlYWRzKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2MV9jb21taXRfZHFibGsoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlzaG9ydCB0eXBlID0gZHF1b3QtPmRxX3R5cGU7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IHYxX2Rpc2tfZHFibGsgZHFibGs7CisKKwl2MV9tZW0yZGlza19kcWJsaygmZHFibGssICZkcXVvdC0+ZHFfZHFiKTsKKwlpZiAoZHF1b3QtPmRxX2lkID09IDApIHsKKwkJZHFibGsuZHFiX2J0aW1lID0gc2JfZHFvcHQoZHF1b3QtPmRxX3NiKS0+aW5mb1t0eXBlXS5kcWlfYmdyYWNlOworCQlkcWJsay5kcWJfaXRpbWUgPSBzYl9kcW9wdChkcXVvdC0+ZHFfc2IpLT5pbmZvW3R5cGVdLmRxaV9pZ3JhY2U7CisJfQorCXJldCA9IDA7CisJaWYgKHNiX2Rxb3B0KGRxdW90LT5kcV9zYiktPmZpbGVzW3R5cGVdKQorCQlyZXQgPSBkcXVvdC0+ZHFfc2ItPnNfb3AtPnF1b3RhX3dyaXRlKGRxdW90LT5kcV9zYiwgdHlwZSwgKGNoYXIgKikmZHFibGssCisJCQkJCXNpemVvZihzdHJ1Y3QgdjFfZGlza19kcWJsayksIHYxX2Rxb2ZmKGRxdW90LT5kcV9pZCkpOworCWlmIChyZXQgIT0gc2l6ZW9mKHN0cnVjdCB2MV9kaXNrX2RxYmxrKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJWRlM6IGRxdW90YSB3cml0ZSBmYWlsZWQgb24gZGV2ICVzXG4iLAorCQkJZHF1b3QtPmRxX3NiLT5zX2lkKTsKKwkJaWYgKHJldCA+PSAwKQorCQkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCXJldCA9IDA7CisKK291dDoKKwlkcXN0YXRzLndyaXRlcysrOworCisJcmV0dXJuIHJldDsKK30KKworLyogTWFnaWNzIG9mIG5ldyBxdW90YSBmb3JtYXQgKi8KKyNkZWZpbmUgVjJfSU5JVFFNQUdJQ1Mge1wKKwkweGQ5YzAxZjExLCAgICAgLyogVVNSUVVPVEEgKi9cCisJMHhkOWMwMTkyNyAgICAgIC8qIEdSUFFVT1RBICovXAorfQorCisvKiBIZWFkZXIgb2YgbmV3IHF1b3RhIGZvcm1hdCAqLworc3RydWN0IHYyX2Rpc2tfZHFoZWFkZXIgeworCV9fbGUzMiBkcWhfbWFnaWM7ICAgICAgICAvKiBNYWdpYyBudW1iZXIgaWRlbnRpZnlpbmcgZmlsZSAqLworCV9fbGUzMiBkcWhfdmVyc2lvbjsgICAgICAvKiBGaWxlIHZlcnNpb24gKi8KK307CisKK3N0YXRpYyBpbnQgdjFfY2hlY2tfcXVvdGFfZmlsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXTsKKwl1bG9uZyBibG9ja3M7CisJc2l6ZV90IG9mZjsgCisJc3RydWN0IHYyX2Rpc2tfZHFoZWFkZXIgZHFoZWFkOworCXNzaXplX3Qgc2l6ZTsKKwlsb2ZmX3QgaXNpemU7CisJc3RhdGljIGNvbnN0IHVpbnQgcXVvdGFfbWFnaWNzW10gPSBWMl9JTklUUU1BR0lDUzsKKworCWlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCWlmICghaXNpemUpCisJCXJldHVybiAwOworCWJsb2NrcyA9IGlzaXplID4+IEJMT0NLX1NJWkVfQklUUzsKKwlvZmYgPSBpc2l6ZSAmIChCTE9DS19TSVpFIC0gMSk7CisJaWYgKChibG9ja3MgJSBzaXplb2Yoc3RydWN0IHYxX2Rpc2tfZHFibGspICogQkxPQ0tfU0laRSArIG9mZikgJSBzaXplb2Yoc3RydWN0IHYxX2Rpc2tfZHFibGspKQorCQlyZXR1cm4gMDsKKwkvKiBEb3VibGVjaGVjayB3aGV0aGVyIHdlIGRpZG4ndCBnZXQgZmlsZSB3aXRoIG5ldyBmb3JtYXQgLSB3aXRoIG9sZCBxdW90YWN0bCgpIHRoaXMgY291bGQgaGFwcGVuICovCisJc2l6ZSA9IHNiLT5zX29wLT5xdW90YV9yZWFkKHNiLCB0eXBlLCAoY2hhciAqKSZkcWhlYWQsIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWhlYWRlciksIDApOworCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWhlYWRlcikpCisJCXJldHVybiAxOwkvKiBQcm9iYWJseSBub3QgbmV3IGZvcm1hdCAqLworCWlmIChsZTMyX3RvX2NwdShkcWhlYWQuZHFoX21hZ2ljKSAhPSBxdW90YV9tYWdpY3NbdHlwZV0pCisJCXJldHVybiAxOwkvKiBEZWZpbml0ZWx5IG5vdCBuZXcgZm9ybWF0ICovCisJcHJpbnRrKEtFUk5fSU5GTyAiVkZTOiAlczogUmVmdXNpbmcgdG8gdHVybiBvbiBvbGQgcXVvdGEgZm9ybWF0IG9uIGdpdmVuIGZpbGUuIEl0IHByb2JhYmx5IGNvbnRhaW5zIG5ld2VyIHF1b3RhIGZvcm1hdC5cbiIsIHNiLT5zX2lkKTsKKyAgICAgICAgcmV0dXJuIDA7CQkvKiBTZWVtcyBsaWtlIGEgbmV3IGZvcm1hdCBmaWxlIC0+IHJlZnVzZSBpdCAqLworfQorCitzdGF0aWMgaW50IHYxX3JlYWRfZmlsZV9pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCXN0cnVjdCBxdW90YV9pbmZvICpkcW9wdCA9IHNiX2Rxb3B0KHNiKTsKKwlzdHJ1Y3QgdjFfZGlza19kcWJsayBkcWJsazsKKwlpbnQgcmV0OworCisJaWYgKChyZXQgPSBzYi0+c19vcC0+cXVvdGFfcmVhZChzYiwgdHlwZSwgKGNoYXIgKikmZHFibGssIHNpemVvZihzdHJ1Y3QgdjFfZGlza19kcWJsayksIHYxX2Rxb2ZmKDApKSkgIT0gc2l6ZW9mKHN0cnVjdCB2MV9kaXNrX2RxYmxrKSkgeworCQlpZiAocmV0ID49IDApCisJCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gMDsKKwlkcW9wdC0+aW5mb1t0eXBlXS5kcWlfaWdyYWNlID0gZHFibGsuZHFiX2l0aW1lID8gZHFibGsuZHFiX2l0aW1lIDogTUFYX0lRX1RJTUU7CisJZHFvcHQtPmluZm9bdHlwZV0uZHFpX2JncmFjZSA9IGRxYmxrLmRxYl9idGltZSA/IGRxYmxrLmRxYl9idGltZSA6IE1BWF9EUV9USU1FOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdjFfd3JpdGVfZmlsZV9pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCXN0cnVjdCBxdW90YV9pbmZvICpkcW9wdCA9IHNiX2Rxb3B0KHNiKTsKKwlzdHJ1Y3QgdjFfZGlza19kcWJsayBkcWJsazsKKwlpbnQgcmV0OworCisJZHFvcHQtPmluZm9bdHlwZV0uZHFpX2ZsYWdzICY9IH5EUUZfSU5GT19ESVJUWTsKKwlpZiAoKHJldCA9IHNiLT5zX29wLT5xdW90YV9yZWFkKHNiLCB0eXBlLCAoY2hhciAqKSZkcWJsaywKKwkgICAgc2l6ZW9mKHN0cnVjdCB2MV9kaXNrX2RxYmxrKSwgdjFfZHFvZmYoMCkpKSAhPSBzaXplb2Yoc3RydWN0IHYxX2Rpc2tfZHFibGspKSB7CisJCWlmIChyZXQgPj0gMCkKKwkJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKwlkcWJsay5kcWJfaXRpbWUgPSBkcW9wdC0+aW5mb1t0eXBlXS5kcWlfaWdyYWNlOworCWRxYmxrLmRxYl9idGltZSA9IGRxb3B0LT5pbmZvW3R5cGVdLmRxaV9iZ3JhY2U7CisJcmV0ID0gc2ItPnNfb3AtPnF1b3RhX3dyaXRlKHNiLCB0eXBlLCAoY2hhciAqKSZkcWJsaywKKwkgICAgICBzaXplb2Yoc3RydWN0IHYxX2Rpc2tfZHFibGspLCB2MV9kcW9mZigwKSk7CisJaWYgKHJldCA9PSBzaXplb2Yoc3RydWN0IHYxX2Rpc2tfZHFibGspKQorCQlyZXQgPSAwOworCWVsc2UgaWYgKHJldCA+IDApCisJCXJldCA9IC1FSU87CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBxdW90YV9mb3JtYXRfb3BzIHYxX2Zvcm1hdF9vcHMgPSB7CisJLmNoZWNrX3F1b3RhX2ZpbGUJPSB2MV9jaGVja19xdW90YV9maWxlLAorCS5yZWFkX2ZpbGVfaW5mbwkJPSB2MV9yZWFkX2ZpbGVfaW5mbywKKwkud3JpdGVfZmlsZV9pbmZvCT0gdjFfd3JpdGVfZmlsZV9pbmZvLAorCS5mcmVlX2ZpbGVfaW5mbwkJPSBOVUxMLAorCS5yZWFkX2RxYmxrCQk9IHYxX3JlYWRfZHFibGssCisJLmNvbW1pdF9kcWJsawkJPSB2MV9jb21taXRfZHFibGssCit9OworCitzdGF0aWMgc3RydWN0IHF1b3RhX2Zvcm1hdF90eXBlIHYxX3F1b3RhX2Zvcm1hdCA9IHsKKwkucWZfZm10X2lkCT0gUUZNVF9WRlNfT0xELAorCS5xZl9vcHMJCT0gJnYxX2Zvcm1hdF9vcHMsCisJLnFmX293bmVyCT0gVEhJU19NT0RVTEUKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdjFfcXVvdGFfZm9ybWF0KHZvaWQpCit7CisgICAgICAgIHJldHVybiByZWdpc3Rlcl9xdW90YV9mb3JtYXQoJnYxX3F1b3RhX2Zvcm1hdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3YxX3F1b3RhX2Zvcm1hdCh2b2lkKQoreworICAgICAgICB1bnJlZ2lzdGVyX3F1b3RhX2Zvcm1hdCgmdjFfcXVvdGFfZm9ybWF0KTsKK30KKworbW9kdWxlX2luaXQoaW5pdF92MV9xdW90YV9mb3JtYXQpOworbW9kdWxlX2V4aXQoZXhpdF92MV9xdW90YV9mb3JtYXQpOworCmRpZmYgLS1naXQgYS9mcy9xdW90YV92Mi5jIGIvZnMvcXVvdGFfdjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWJkYjdiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcXVvdGFfdjIuYwpAQCAtMCwwICsxLDY5MyBAQAorLyoKKyAqCXZmc3YwIHF1b3RhIElPIG9wZXJhdGlvbnMgb24gZmlsZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kcWJsa192Mi5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3RhaW9fdjIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCitNT0RVTEVfQVVUSE9SKCJKYW4gS2FyYSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJRdW90YSBmb3JtYXQgdjIgc3VwcG9ydCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIF9fUVVPVEFfVjJfUEFSQU5PSUEKKwordHlwZWRlZiBjaGFyICpkcWJ1Zl90OworCisjZGVmaW5lIEdFVElESU5ERVgoaWQsIGRlcHRoKSAoKChpZCkgPj4gKChWMl9EUVRSRUVERVBUSC0oZGVwdGgpLTEpKjgpKSAmIDB4ZmYpCisjZGVmaW5lIEdFVEVOVFJJRVMoYnVmKSAoKHN0cnVjdCB2Ml9kaXNrX2RxYmxrICopKCgoY2hhciAqKWJ1Zikrc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIpKSkKKworLyogQ2hlY2sgd2hldGhlciBnaXZlbiBmaWxlIGlzIHJlYWxseSB2ZnN2MCBxdW90YWZpbGUgKi8KK3N0YXRpYyBpbnQgdjJfY2hlY2tfcXVvdGFfZmlsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgdjJfZGlza19kcWhlYWRlciBkcWhlYWQ7CisJc3NpemVfdCBzaXplOworCXN0YXRpYyBjb25zdCB1aW50IHF1b3RhX21hZ2ljc1tdID0gVjJfSU5JVFFNQUdJQ1M7CisJc3RhdGljIGNvbnN0IHVpbnQgcXVvdGFfdmVyc2lvbnNbXSA9IFYyX0lOSVRRVkVSU0lPTlM7CisgCisJc2l6ZSA9IHNiLT5zX29wLT5xdW90YV9yZWFkKHNiLCB0eXBlLCAoY2hhciAqKSZkcWhlYWQsIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWhlYWRlciksIDApOworCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWhlYWRlcikpIHsKKwkJcHJpbnRrKCJmYWlsZWQgcmVhZFxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAobGUzMl90b19jcHUoZHFoZWFkLmRxaF9tYWdpYykgIT0gcXVvdGFfbWFnaWNzW3R5cGVdIHx8CisJICAgIGxlMzJfdG9fY3B1KGRxaGVhZC5kcWhfdmVyc2lvbikgIT0gcXVvdGFfdmVyc2lvbnNbdHlwZV0pCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKiBSZWFkIGluZm9ybWF0aW9uIGhlYWRlciBmcm9tIHF1b3RhIGZpbGUgKi8KK3N0YXRpYyBpbnQgdjJfcmVhZF9maWxlX2luZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJc3RydWN0IHYyX2Rpc2tfZHFpbmZvIGRpbmZvOworCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gc2JfZHFvcHQoc2IpLT5pbmZvK3R5cGU7CisJc3NpemVfdCBzaXplOworCisJc2l6ZSA9IHNiLT5zX29wLT5xdW90YV9yZWFkKHNiLCB0eXBlLCAoY2hhciAqKSZkaW5mbywKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxaW5mbyksIFYyX0RRSU5GT09GRik7CisJaWYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxaW5mbykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgcmVhZCBpbmZvIHN0cnVjdHVyZSBvbiBkZXZpY2UgJXMuXG4iLAorCQkJc2ItPnNfaWQpOworCQlyZXR1cm4gLTE7CisJfQorCWluZm8tPmRxaV9iZ3JhY2UgPSBsZTMyX3RvX2NwdShkaW5mby5kcWlfYmdyYWNlKTsKKwlpbmZvLT5kcWlfaWdyYWNlID0gbGUzMl90b19jcHUoZGluZm8uZHFpX2lncmFjZSk7CisJaW5mby0+ZHFpX2ZsYWdzID0gbGUzMl90b19jcHUoZGluZm8uZHFpX2ZsYWdzKTsKKwlpbmZvLT51LnYyX2kuZHFpX2Jsb2NrcyA9IGxlMzJfdG9fY3B1KGRpbmZvLmRxaV9ibG9ja3MpOworCWluZm8tPnUudjJfaS5kcWlfZnJlZV9ibGsgPSBsZTMyX3RvX2NwdShkaW5mby5kcWlfZnJlZV9ibGspOworCWluZm8tPnUudjJfaS5kcWlfZnJlZV9lbnRyeSA9IGxlMzJfdG9fY3B1KGRpbmZvLmRxaV9mcmVlX2VudHJ5KTsKKwlyZXR1cm4gMDsKK30KKworLyogV3JpdGUgaW5mb3JtYXRpb24gaGVhZGVyIHRvIHF1b3RhIGZpbGUgKi8KK3N0YXRpYyBpbnQgdjJfd3JpdGVfZmlsZV9pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCXN0cnVjdCB2Ml9kaXNrX2RxaW5mbyBkaW5mbzsKKwlzdHJ1Y3QgbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2Rxb3B0KHNiKS0+aW5mbyt0eXBlOworCXNzaXplX3Qgc2l6ZTsKKworCXNwaW5fbG9jaygmZHFfZGF0YV9sb2NrKTsKKwlpbmZvLT5kcWlfZmxhZ3MgJj0gfkRRRl9JTkZPX0RJUlRZOworCWRpbmZvLmRxaV9iZ3JhY2UgPSBjcHVfdG9fbGUzMihpbmZvLT5kcWlfYmdyYWNlKTsKKwlkaW5mby5kcWlfaWdyYWNlID0gY3B1X3RvX2xlMzIoaW5mby0+ZHFpX2lncmFjZSk7CisJZGluZm8uZHFpX2ZsYWdzID0gY3B1X3RvX2xlMzIoaW5mby0+ZHFpX2ZsYWdzICYgRFFGX01BU0spOworCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOworCWRpbmZvLmRxaV9ibG9ja3MgPSBjcHVfdG9fbGUzMihpbmZvLT51LnYyX2kuZHFpX2Jsb2Nrcyk7CisJZGluZm8uZHFpX2ZyZWVfYmxrID0gY3B1X3RvX2xlMzIoaW5mby0+dS52Ml9pLmRxaV9mcmVlX2Jsayk7CisJZGluZm8uZHFpX2ZyZWVfZW50cnkgPSBjcHVfdG9fbGUzMihpbmZvLT51LnYyX2kuZHFpX2ZyZWVfZW50cnkpOworCXNpemUgPSBzYi0+c19vcC0+cXVvdGFfd3JpdGUoc2IsIHR5cGUsIChjaGFyICopJmRpbmZvLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFpbmZvKSwgVjJfRFFJTkZPT0ZGKTsKKwlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFpbmZvKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCB3cml0ZSBpbmZvIHN0cnVjdHVyZSBvbiBkZXZpY2UgJXMuXG4iLAorCQkJc2ItPnNfaWQpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkaXNrMm1lbWRxYihzdHJ1Y3QgbWVtX2RxYmxrICptLCBzdHJ1Y3QgdjJfZGlza19kcWJsayAqZCkKK3sKKwltLT5kcWJfaWhhcmRsaW1pdCA9IGxlMzJfdG9fY3B1KGQtPmRxYl9paGFyZGxpbWl0KTsKKwltLT5kcWJfaXNvZnRsaW1pdCA9IGxlMzJfdG9fY3B1KGQtPmRxYl9pc29mdGxpbWl0KTsKKwltLT5kcWJfY3VyaW5vZGVzID0gbGUzMl90b19jcHUoZC0+ZHFiX2N1cmlub2Rlcyk7CisJbS0+ZHFiX2l0aW1lID0gbGU2NF90b19jcHUoZC0+ZHFiX2l0aW1lKTsKKwltLT5kcWJfYmhhcmRsaW1pdCA9IGxlMzJfdG9fY3B1KGQtPmRxYl9iaGFyZGxpbWl0KTsKKwltLT5kcWJfYnNvZnRsaW1pdCA9IGxlMzJfdG9fY3B1KGQtPmRxYl9ic29mdGxpbWl0KTsKKwltLT5kcWJfY3Vyc3BhY2UgPSBsZTY0X3RvX2NwdShkLT5kcWJfY3Vyc3BhY2UpOworCW0tPmRxYl9idGltZSA9IGxlNjRfdG9fY3B1KGQtPmRxYl9idGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIG1lbTJkaXNrZHFiKHN0cnVjdCB2Ml9kaXNrX2RxYmxrICpkLCBzdHJ1Y3QgbWVtX2RxYmxrICptLCBxaWRfdCBpZCkKK3sKKwlkLT5kcWJfaWhhcmRsaW1pdCA9IGNwdV90b19sZTMyKG0tPmRxYl9paGFyZGxpbWl0KTsKKwlkLT5kcWJfaXNvZnRsaW1pdCA9IGNwdV90b19sZTMyKG0tPmRxYl9pc29mdGxpbWl0KTsKKwlkLT5kcWJfY3VyaW5vZGVzID0gY3B1X3RvX2xlMzIobS0+ZHFiX2N1cmlub2Rlcyk7CisJZC0+ZHFiX2l0aW1lID0gY3B1X3RvX2xlNjQobS0+ZHFiX2l0aW1lKTsKKwlkLT5kcWJfYmhhcmRsaW1pdCA9IGNwdV90b19sZTMyKG0tPmRxYl9iaGFyZGxpbWl0KTsKKwlkLT5kcWJfYnNvZnRsaW1pdCA9IGNwdV90b19sZTMyKG0tPmRxYl9ic29mdGxpbWl0KTsKKwlkLT5kcWJfY3Vyc3BhY2UgPSBjcHVfdG9fbGU2NChtLT5kcWJfY3Vyc3BhY2UpOworCWQtPmRxYl9idGltZSA9IGNwdV90b19sZTY0KG0tPmRxYl9idGltZSk7CisJZC0+ZHFiX2lkID0gY3B1X3RvX2xlMzIoaWQpOworfQorCitzdGF0aWMgZHFidWZfdCBnZXRkcWJ1Zih2b2lkKQoreworCWRxYnVmX3QgYnVmID0ga21hbGxvYyhWMl9EUUJMS1NJWkUsIEdGUF9OT0ZTKTsKKwlpZiAoIWJ1ZikKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVkZTOiBOb3QgZW5vdWdoIG1lbW9yeSBmb3IgcXVvdGEgYnVmZmVycy5cbiIpOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlZHFidWYoZHFidWZfdCBidWYpCit7CisJa2ZyZWUoYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IHJlYWRfYmxrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCB1aW50IGJsaywgZHFidWZfdCBidWYpCit7CisJbWVtc2V0KGJ1ZiwgMCwgVjJfRFFCTEtTSVpFKTsKKwlyZXR1cm4gc2ItPnNfb3AtPnF1b3RhX3JlYWQoc2IsIHR5cGUsIChjaGFyICopYnVmLAorCSAgICAgICBWMl9EUUJMS1NJWkUsIGJsayA8PCBWMl9EUUJMS1NJWkVfQklUUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCB3cml0ZV9ibGsoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIHVpbnQgYmxrLCBkcWJ1Zl90IGJ1ZikKK3sKKwlyZXR1cm4gc2ItPnNfb3AtPnF1b3RhX3dyaXRlKHNiLCB0eXBlLCAoY2hhciAqKWJ1ZiwKKwkgICAgICAgVjJfRFFCTEtTSVpFLCBibGsgPDwgVjJfRFFCTEtTSVpFX0JJVFMpOworfQorCisvKiBSZW1vdmUgZW1wdHkgYmxvY2sgZnJvbSBsaXN0IGFuZCByZXR1cm4gaXQgKi8KK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfZHFibGsoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJZHFidWZfdCBidWYgPSBnZXRkcWJ1ZigpOworCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gc2JfZHFpbmZvKHNiLCB0eXBlKTsKKwlzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICpkaCA9IChzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICopYnVmOworCWludCByZXQsIGJsazsKKworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoaW5mby0+dS52Ml9pLmRxaV9mcmVlX2JsaykgeworCQlibGsgPSBpbmZvLT51LnYyX2kuZHFpX2ZyZWVfYmxrOworCQlpZiAoKHJldCA9IHJlYWRfYmxrKHNiLCB0eXBlLCBibGssIGJ1ZikpIDwgMCkKKwkJCWdvdG8gb3V0X2J1ZjsKKwkJaW5mby0+dS52Ml9pLmRxaV9mcmVlX2JsayA9IGxlMzJfdG9fY3B1KGRoLT5kcWRoX25leHRfZnJlZSk7CisJfQorCWVsc2UgeworCQltZW1zZXQoYnVmLCAwLCBWMl9EUUJMS1NJWkUpOworCQkvKiBBc3N1cmUgYmxvY2sgYWxsb2NhdGlvbi4uLiAqLworCQlpZiAoKHJldCA9IHdyaXRlX2JsayhzYiwgdHlwZSwgaW5mby0+dS52Ml9pLmRxaV9ibG9ja3MsIGJ1ZikpIDwgMCkKKwkJCWdvdG8gb3V0X2J1ZjsKKwkJYmxrID0gaW5mby0+dS52Ml9pLmRxaV9ibG9ja3MrKzsKKwl9CisJbWFya19pbmZvX2RpcnR5KHNiLCB0eXBlKTsKKwlyZXQgPSBibGs7CitvdXRfYnVmOgorCWZyZWVkcWJ1ZihidWYpOworCXJldHVybiByZXQ7Cit9CisKKy8qIEluc2VydCBlbXB0eSBibG9jayB0byB0aGUgbGlzdCAqLworc3RhdGljIGludCBwdXRfZnJlZV9kcWJsayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgZHFidWZfdCBidWYsIHVpbnQgYmxrKQoreworCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gc2JfZHFpbmZvKHNiLCB0eXBlKTsKKwlzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICpkaCA9IChzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICopYnVmOworCWludCBlcnI7CisKKwlkaC0+ZHFkaF9uZXh0X2ZyZWUgPSBjcHVfdG9fbGUzMihpbmZvLT51LnYyX2kuZHFpX2ZyZWVfYmxrKTsKKwlkaC0+ZHFkaF9wcmV2X2ZyZWUgPSBjcHVfdG9fbGUzMigwKTsKKwlkaC0+ZHFkaF9lbnRyaWVzID0gY3B1X3RvX2xlMTYoMCk7CisJaW5mby0+dS52Ml9pLmRxaV9mcmVlX2JsayA9IGJsazsKKwltYXJrX2luZm9fZGlydHkoc2IsIHR5cGUpOworCS8qIFNvbWUgc3RyYW5nZSBibG9jay4gV2UgaGFkIGJldHRlciBsZWF2ZSBpdC4uLiAqLworCWlmICgoZXJyID0gd3JpdGVfYmxrKHNiLCB0eXBlLCBibGssIGJ1ZikpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKK30KKworLyogUmVtb3ZlIGdpdmVuIGJsb2NrIGZyb20gdGhlIGxpc3Qgb2YgYmxvY2tzIHdpdGggZnJlZSBlbnRyaWVzICovCitzdGF0aWMgaW50IHJlbW92ZV9mcmVlX2RxZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGRxYnVmX3QgYnVmLCB1aW50IGJsaykKK3sKKwlkcWJ1Zl90IHRtcGJ1ZiA9IGdldGRxYnVmKCk7CisJc3RydWN0IG1lbV9kcWluZm8gKmluZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpOworCXN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIgKmRoID0gKHN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIgKilidWY7CisJdWludCBuZXh0YmxrID0gbGUzMl90b19jcHUoZGgtPmRxZGhfbmV4dF9mcmVlKSwgcHJldmJsayA9IGxlMzJfdG9fY3B1KGRoLT5kcWRoX3ByZXZfZnJlZSk7CisJaW50IGVycjsKKworCWlmICghdG1wYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAobmV4dGJsaykgeworCQlpZiAoKGVyciA9IHJlYWRfYmxrKHNiLCB0eXBlLCBuZXh0YmxrLCB0bXBidWYpKSA8IDApCisJCQlnb3RvIG91dF9idWY7CisJCSgoc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqKXRtcGJ1ZiktPmRxZGhfcHJldl9mcmVlID0gZGgtPmRxZGhfcHJldl9mcmVlOworCQlpZiAoKGVyciA9IHdyaXRlX2JsayhzYiwgdHlwZSwgbmV4dGJsaywgdG1wYnVmKSkgPCAwKQorCQkJZ290byBvdXRfYnVmOworCX0KKwlpZiAocHJldmJsaykgeworCQlpZiAoKGVyciA9IHJlYWRfYmxrKHNiLCB0eXBlLCBwcmV2YmxrLCB0bXBidWYpKSA8IDApCisJCQlnb3RvIG91dF9idWY7CisJCSgoc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqKXRtcGJ1ZiktPmRxZGhfbmV4dF9mcmVlID0gZGgtPmRxZGhfbmV4dF9mcmVlOworCQlpZiAoKGVyciA9IHdyaXRlX2JsayhzYiwgdHlwZSwgcHJldmJsaywgdG1wYnVmKSkgPCAwKQorCQkJZ290byBvdXRfYnVmOworCX0KKwllbHNlIHsKKwkJaW5mby0+dS52Ml9pLmRxaV9mcmVlX2VudHJ5ID0gbmV4dGJsazsKKwkJbWFya19pbmZvX2RpcnR5KHNiLCB0eXBlKTsKKwl9CisJZnJlZWRxYnVmKHRtcGJ1Zik7CisJZGgtPmRxZGhfbmV4dF9mcmVlID0gZGgtPmRxZGhfcHJldl9mcmVlID0gY3B1X3RvX2xlMzIoMCk7CisJLyogTm8gbWF0dGVyIHdoZXRoZXIgd3JpdGUgc3VjY2VlZHMgYmxvY2sgaXMgb3V0IG9mIGxpc3QgKi8KKwlpZiAod3JpdGVfYmxrKHNiLCB0eXBlLCBibGssIGJ1ZikgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2FuJ3Qgd3JpdGUgYmxvY2sgKCV1KSB3aXRoIGZyZWUgZW50cmllcy5cbiIsIGJsayk7CisJcmV0dXJuIDA7CitvdXRfYnVmOgorCWZyZWVkcWJ1Zih0bXBidWYpOworCXJldHVybiBlcnI7Cit9CisKKy8qIEluc2VydCBnaXZlbiBibG9jayB0byB0aGUgYmVnaW5uaW5nIG9mIGxpc3Qgd2l0aCBmcmVlIGVudHJpZXMgKi8KK3N0YXRpYyBpbnQgaW5zZXJ0X2ZyZWVfZHFlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgZHFidWZfdCBidWYsIHVpbnQgYmxrKQoreworCWRxYnVmX3QgdG1wYnVmID0gZ2V0ZHFidWYoKTsKKwlzdHJ1Y3QgbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSk7CisJc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqZGggPSAoc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqKWJ1ZjsKKwlpbnQgZXJyOworCisJaWYgKCF0bXBidWYpCisJCXJldHVybiAtRU5PTUVNOworCWRoLT5kcWRoX25leHRfZnJlZSA9IGNwdV90b19sZTMyKGluZm8tPnUudjJfaS5kcWlfZnJlZV9lbnRyeSk7CisJZGgtPmRxZGhfcHJldl9mcmVlID0gY3B1X3RvX2xlMzIoMCk7CisJaWYgKChlcnIgPSB3cml0ZV9ibGsoc2IsIHR5cGUsIGJsaywgYnVmKSkgPCAwKQorCQlnb3RvIG91dF9idWY7CisJaWYgKGluZm8tPnUudjJfaS5kcWlfZnJlZV9lbnRyeSkgeworCQlpZiAoKGVyciA9IHJlYWRfYmxrKHNiLCB0eXBlLCBpbmZvLT51LnYyX2kuZHFpX2ZyZWVfZW50cnksIHRtcGJ1ZikpIDwgMCkKKwkJCWdvdG8gb3V0X2J1ZjsKKwkJKChzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICopdG1wYnVmKS0+ZHFkaF9wcmV2X2ZyZWUgPSBjcHVfdG9fbGUzMihibGspOworCQlpZiAoKGVyciA9IHdyaXRlX2JsayhzYiwgdHlwZSwgaW5mby0+dS52Ml9pLmRxaV9mcmVlX2VudHJ5LCB0bXBidWYpKSA8IDApCisJCQlnb3RvIG91dF9idWY7CisJfQorCWZyZWVkcWJ1Zih0bXBidWYpOworCWluZm8tPnUudjJfaS5kcWlfZnJlZV9lbnRyeSA9IGJsazsKKwltYXJrX2luZm9fZGlydHkoc2IsIHR5cGUpOworCXJldHVybiAwOworb3V0X2J1ZjoKKwlmcmVlZHFidWYodG1wYnVmKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBGaW5kIHNwYWNlIGZvciBkcXVvdCAqLworc3RhdGljIHVpbnQgZmluZF9mcmVlX2RxZW50cnkoc3RydWN0IGRxdW90ICpkcXVvdCwgaW50ICplcnIpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRxdW90LT5kcV9zYjsKKwlzdHJ1Y3QgbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2Rxb3B0KHNiKS0+aW5mbytkcXVvdC0+ZHFfdHlwZTsKKwl1aW50IGJsaywgaTsKKwlzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICpkaDsKKwlzdHJ1Y3QgdjJfZGlza19kcWJsayAqZGRxdW90OworCXN0cnVjdCB2Ml9kaXNrX2RxYmxrIGZha2VkcXVvdDsKKwlkcWJ1Zl90IGJ1ZjsKKworCSplcnIgPSAwOworCWlmICghKGJ1ZiA9IGdldGRxYnVmKCkpKSB7CisJCSplcnIgPSAtRU5PTUVNOworCQlyZXR1cm4gMDsKKwl9CisJZGggPSAoc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqKWJ1ZjsKKwlkZHF1b3QgPSBHRVRFTlRSSUVTKGJ1Zik7CisJaWYgKGluZm8tPnUudjJfaS5kcWlfZnJlZV9lbnRyeSkgeworCQlibGsgPSBpbmZvLT51LnYyX2kuZHFpX2ZyZWVfZW50cnk7CisJCWlmICgoKmVyciA9IHJlYWRfYmxrKHNiLCBkcXVvdC0+ZHFfdHlwZSwgYmxrLCBidWYpKSA8IDApCisJCQlnb3RvIG91dF9idWY7CisJfQorCWVsc2UgeworCQlibGsgPSBnZXRfZnJlZV9kcWJsayhzYiwgZHF1b3QtPmRxX3R5cGUpOworCQlpZiAoKGludClibGsgPCAwKSB7CisJCQkqZXJyID0gYmxrOworCQkJZnJlZWRxYnVmKGJ1Zik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQltZW1zZXQoYnVmLCAwLCBWMl9EUUJMS1NJWkUpOworCQkvKiBUaGlzIGlzIGVub3VnaCBhcyBibG9jayBpcyBhbHJlYWR5IHplcm9lZCBhbmQgZW50cnkgbGlzdCBpcyBlbXB0eS4uLiAqLworCQlpbmZvLT51LnYyX2kuZHFpX2ZyZWVfZW50cnkgPSBibGs7CisJCW1hcmtfaW5mb19kaXJ0eShzYiwgZHF1b3QtPmRxX3R5cGUpOworCX0KKwlpZiAobGUxNl90b19jcHUoZGgtPmRxZGhfZW50cmllcykrMSA+PSBWMl9EUVNUUklOQkxLKQkvKiBCbG9jayB3aWxsIGJlIGZ1bGw/ICovCisJCWlmICgoKmVyciA9IHJlbW92ZV9mcmVlX2RxZW50cnkoc2IsIGRxdW90LT5kcV90eXBlLCBidWYsIGJsaykpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IGZpbmRfZnJlZV9kcWVudHJ5KCk6IENhbid0IHJlbW92ZSBibG9jayAoJXUpIGZyb20gZW50cnkgZnJlZSBsaXN0LlxuIiwgYmxrKTsKKwkJCWdvdG8gb3V0X2J1ZjsKKwkJfQorCWRoLT5kcWRoX2VudHJpZXMgPSBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShkaC0+ZHFkaF9lbnRyaWVzKSsxKTsKKwltZW1zZXQoJmZha2VkcXVvdCwgMCwgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSk7CisJLyogRmluZCBmcmVlIHN0cnVjdHVyZSBpbiBibG9jayAqLworCWZvciAoaSA9IDA7IGkgPCBWMl9EUVNUUklOQkxLICYmIG1lbWNtcCgmZmFrZWRxdW90LCBkZHF1b3QraSwgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSk7IGkrKyk7CisjaWZkZWYgX19RVU9UQV9WMl9QQVJBTk9JQQorCWlmIChpID09IFYyX0RRU1RSSU5CTEspIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IGZpbmRfZnJlZV9kcWVudHJ5KCk6IERhdGEgYmxvY2sgZnVsbCBidXQgaXQgc2hvdWxkbid0LlxuIik7CisJCSplcnIgPSAtRUlPOworCQlnb3RvIG91dF9idWY7CisJfQorI2VuZGlmCisJaWYgKCgqZXJyID0gd3JpdGVfYmxrKHNiLCBkcXVvdC0+ZHFfdHlwZSwgYmxrLCBidWYpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IGZpbmRfZnJlZV9kcWVudHJ5KCk6IENhbid0IHdyaXRlIHF1b3RhIGRhdGEgYmxvY2sgJXUuXG4iLCBibGspOworCQlnb3RvIG91dF9idWY7CisJfQorCWRxdW90LT5kcV9vZmYgPSAoYmxrPDxWMl9EUUJMS1NJWkVfQklUUykrc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIpK2kqc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKTsKKwlmcmVlZHFidWYoYnVmKTsKKwlyZXR1cm4gYmxrOworb3V0X2J1ZjoKKwlmcmVlZHFidWYoYnVmKTsKKwlyZXR1cm4gMDsKK30KKworLyogSW5zZXJ0IHJlZmVyZW5jZSB0byBzdHJ1Y3R1cmUgaW50byB0aGUgdHJpZSAqLworc3RhdGljIGludCBkb19pbnNlcnRfdHJlZShzdHJ1Y3QgZHF1b3QgKmRxdW90LCB1aW50ICp0cmVlYmxrLCBpbnQgZGVwdGgpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRxdW90LT5kcV9zYjsKKwlkcWJ1Zl90IGJ1ZjsKKwlpbnQgcmV0ID0gMCwgbmV3c29uID0gMCwgbmV3YWN0ID0gMDsKKwlfX2xlMzIgKnJlZjsKKwl1aW50IG5ld2JsazsKKworCWlmICghKGJ1ZiA9IGdldGRxYnVmKCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoISp0cmVlYmxrKSB7CisJCXJldCA9IGdldF9mcmVlX2RxYmxrKHNiLCBkcXVvdC0+ZHFfdHlwZSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXRfYnVmOworCQkqdHJlZWJsayA9IHJldDsKKwkJbWVtc2V0KGJ1ZiwgMCwgVjJfRFFCTEtTSVpFKTsKKwkJbmV3YWN0ID0gMTsKKwl9CisJZWxzZSB7CisJCWlmICgocmV0ID0gcmVhZF9ibGsoc2IsIGRxdW90LT5kcV90eXBlLCAqdHJlZWJsaywgYnVmKSkgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2FuJ3QgcmVhZCB0cmVlIHF1b3RhIGJsb2NrICV1LlxuIiwgKnRyZWVibGspOworCQkJZ290byBvdXRfYnVmOworCQl9CisJfQorCXJlZiA9IChfX2xlMzIgKilidWY7CisJbmV3YmxrID0gbGUzMl90b19jcHUocmVmW0dFVElESU5ERVgoZHF1b3QtPmRxX2lkLCBkZXB0aCldKTsKKwlpZiAoIW5ld2JsaykKKwkJbmV3c29uID0gMTsKKwlpZiAoZGVwdGggPT0gVjJfRFFUUkVFREVQVEgtMSkgeworI2lmZGVmIF9fUVVPVEFfVjJfUEFSQU5PSUEKKwkJaWYgKG5ld2JsaykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IEluc2VydGluZyBhbHJlYWR5IHByZXNlbnQgcXVvdGEgZW50cnkgKGJsb2NrICV1KS5cbiIsIGxlMzJfdG9fY3B1KHJlZltHRVRJRElOREVYKGRxdW90LT5kcV9pZCwgZGVwdGgpXSkpOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0X2J1ZjsKKwkJfQorI2VuZGlmCisJCW5ld2JsayA9IGZpbmRfZnJlZV9kcWVudHJ5KGRxdW90LCAmcmV0KTsKKwl9CisJZWxzZQorCQlyZXQgPSBkb19pbnNlcnRfdHJlZShkcXVvdCwgJm5ld2JsaywgZGVwdGgrMSk7CisJaWYgKG5ld3NvbiAmJiByZXQgPj0gMCkgeworCQlyZWZbR0VUSURJTkRFWChkcXVvdC0+ZHFfaWQsIGRlcHRoKV0gPSBjcHVfdG9fbGUzMihuZXdibGspOworCQlyZXQgPSB3cml0ZV9ibGsoc2IsIGRxdW90LT5kcV90eXBlLCAqdHJlZWJsaywgYnVmKTsKKwl9CisJZWxzZSBpZiAobmV3YWN0ICYmIHJldCA8IDApCisJCXB1dF9mcmVlX2RxYmxrKHNiLCBkcXVvdC0+ZHFfdHlwZSwgYnVmLCAqdHJlZWJsayk7CitvdXRfYnVmOgorCWZyZWVkcWJ1ZihidWYpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFdyYXBwZXIgZm9yIGluc2VydGluZyBxdW90YSBzdHJ1Y3R1cmUgaW50byB0cmVlICovCitzdGF0aWMgaW5saW5lIGludCBkcV9pbnNlcnRfdHJlZShzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWludCB0bXAgPSBWMl9EUVRSRUVPRkY7CisJcmV0dXJuIGRvX2luc2VydF90cmVlKGRxdW90LCAmdG1wLCAwKTsKK30KKworLyoKKyAqCVdlIGRvbid0IGhhdmUgdG8gYmUgYWZyYWlkIG9mIGRlYWRsb2NrcyBhcyB3ZSBuZXZlciBoYXZlIHF1b3RhcyBvbiBxdW90YSBmaWxlcy4uLgorICovCitzdGF0aWMgaW50IHYyX3dyaXRlX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJaW50IHR5cGUgPSBkcXVvdC0+ZHFfdHlwZTsKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3QgdjJfZGlza19kcWJsayBkZHF1b3QsIGVtcHR5OworCisJLyogZHFfb2ZmIGlzIGd1YXJkZWQgYnkgZHFpb19zZW0gKi8KKwlpZiAoIWRxdW90LT5kcV9vZmYpCisJCWlmICgocmV0ID0gZHFfaW5zZXJ0X3RyZWUoZHF1b3QpKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBFcnJvciAlemQgb2NjdXJyZWQgd2hpbGUgY3JlYXRpbmcgcXVvdGEuXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCXNwaW5fbG9jaygmZHFfZGF0YV9sb2NrKTsKKwltZW0yZGlza2RxYigmZGRxdW90LCAmZHF1b3QtPmRxX2RxYiwgZHF1b3QtPmRxX2lkKTsKKwkvKiBBcmdoLi4uIFdlIG1heSBuZWVkIHRvIHdyaXRlIHN0cnVjdHVyZSBmdWxsIG9mIHplcm9lcyBidXQgdGhhdCB3b3VsZCBiZQorCSAqIHRyZWF0ZWQgYXMgYW4gZW1wdHkgcGxhY2UgYnkgdGhlIHJlc3Qgb2YgdGhlIGNvZGUuIEZvcm1hdCBjaGFuZ2Ugd291bGQKKwkgKiBiZSBkZWZpbml0ZWx5IGNsZWFuZXIgYnV0IHRoZSBwcm9ibGVtcyBwcm9iYWJseSBhcmUgbm90IHdvcnRoIGl0ICovCisJbWVtc2V0KCZlbXB0eSwgMCwgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSk7CisJaWYgKCFtZW1jbXAoJmVtcHR5LCAmZGRxdW90LCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKSkKKwkJZGRxdW90LmRxYl9pdGltZSA9IGNwdV90b19sZTY0KDEpOworCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOworCXJldCA9IGRxdW90LT5kcV9zYi0+c19vcC0+cXVvdGFfd3JpdGUoZHF1b3QtPmRxX3NiLCB0eXBlLAorCSAgICAgIChjaGFyICopJmRkcXVvdCwgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSwgZHF1b3QtPmRxX29mZik7CisJaWYgKHJldCAhPSBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlZGUzogZHF1b3RhIHdyaXRlIGZhaWxlZCBvbiBkZXYgJXNcbiIsIGRxdW90LT5kcV9zYi0+c19pZCk7CisJCWlmIChyZXQgPj0gMCkKKwkJCXJldCA9IC1FTk9TUEM7CisJfQorCWVsc2UKKwkJcmV0ID0gMDsKKwlkcXN0YXRzLndyaXRlcysrOworCisJcmV0dXJuIHJldDsKK30KKworLyogRnJlZSBkcXVvdCBlbnRyeSBpbiBkYXRhIGJsb2NrICovCitzdGF0aWMgaW50IGZyZWVfZHFlbnRyeShzdHJ1Y3QgZHF1b3QgKmRxdW90LCB1aW50IGJsaykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZHF1b3QtPmRxX3NiOworCWludCB0eXBlID0gZHF1b3QtPmRxX3R5cGU7CisJc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqZGg7CisJZHFidWZfdCBidWYgPSBnZXRkcWJ1ZigpOworCWludCByZXQgPSAwOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChkcXVvdC0+ZHFfb2ZmID4+IFYyX0RRQkxLU0laRV9CSVRTICE9IGJsaykgeworCQlwcmludGsoS0VSTl9FUlIgIlZGUzogUXVvdGEgc3RydWN0dXJlIGhhcyBvZmZzZXQgdG8gb3RoZXIgIgorCQkgICJibG9jayAoJXUpIHRoYW4gaXQgc2hvdWxkICgldSkuXG4iLCBibGssCisJCSAgKHVpbnQpKGRxdW90LT5kcV9vZmYgPj4gVjJfRFFCTEtTSVpFX0JJVFMpKTsKKwkJZ290byBvdXRfYnVmOworCX0KKwlpZiAoKHJldCA9IHJlYWRfYmxrKHNiLCB0eXBlLCBibGssIGJ1ZikpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2FuJ3QgcmVhZCBxdW90YSBkYXRhIGJsb2NrICV1XG4iLCBibGspOworCQlnb3RvIG91dF9idWY7CisJfQorCWRoID0gKHN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIgKilidWY7CisJZGgtPmRxZGhfZW50cmllcyA9IGNwdV90b19sZTE2KGxlMTZfdG9fY3B1KGRoLT5kcWRoX2VudHJpZXMpLTEpOworCWlmICghbGUxNl90b19jcHUoZGgtPmRxZGhfZW50cmllcykpIHsJLyogQmxvY2sgZ290IGZyZWU/ICovCisJCWlmICgocmV0ID0gcmVtb3ZlX2ZyZWVfZHFlbnRyeShzYiwgdHlwZSwgYnVmLCBibGspKSA8IDAgfHwKKwkJICAgIChyZXQgPSBwdXRfZnJlZV9kcWJsayhzYiwgdHlwZSwgYnVmLCBibGspKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCBtb3ZlIHF1b3RhIGRhdGEgYmxvY2sgKCV1KSAiCisJCQkgICJ0byBmcmVlIGxpc3QuXG4iLCBibGspOworCQkJZ290byBvdXRfYnVmOworCQl9CisJfQorCWVsc2UgeworCQltZW1zZXQoYnVmKyhkcXVvdC0+ZHFfb2ZmICYgKCgxIDw8IFYyX0RRQkxLU0laRV9CSVRTKS0xKSksIDAsCisJCSAgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSk7CisJCWlmIChsZTE2X3RvX2NwdShkaC0+ZHFkaF9lbnRyaWVzKSA9PSBWMl9EUVNUUklOQkxLLTEpIHsKKwkJCS8qIEluc2VydCB3aWxsIHdyaXRlIGJsb2NrIGl0c2VsZiAqLworCQkJaWYgKChyZXQgPSBpbnNlcnRfZnJlZV9kcWVudHJ5KHNiLCB0eXBlLCBidWYsIGJsaykpIDwgMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCBpbnNlcnQgcXVvdGEgZGF0YSBibG9jayAoJXUpIHRvIGZyZWUgZW50cnkgbGlzdC5cbiIsIGJsayk7CisJCQkJZ290byBvdXRfYnVmOworCQkJfQorCQl9CisJCWVsc2UKKwkJCWlmICgocmV0ID0gd3JpdGVfYmxrKHNiLCB0eXBlLCBibGssIGJ1ZikpIDwgMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCB3cml0ZSBxdW90YSBkYXRhICIKKwkJCQkgICJibG9jayAldVxuIiwgYmxrKTsKKwkJCQlnb3RvIG91dF9idWY7CisJCQl9CisJfQorCWRxdW90LT5kcV9vZmYgPSAwOwkvKiBRdW90YSBpcyBub3cgdW5hdHRhY2hlZCAqLworb3V0X2J1ZjoKKwlmcmVlZHFidWYoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZW1vdmUgcmVmZXJlbmNlIHRvIGRxdW90IGZyb20gdHJlZSAqLworc3RhdGljIGludCByZW1vdmVfdHJlZShzdHJ1Y3QgZHF1b3QgKmRxdW90LCB1aW50ICpibGssIGludCBkZXB0aCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZHF1b3QtPmRxX3NiOworCWludCB0eXBlID0gZHF1b3QtPmRxX3R5cGU7CisJZHFidWZfdCBidWYgPSBnZXRkcWJ1ZigpOworCWludCByZXQgPSAwOworCXVpbnQgbmV3YmxrOworCV9fbGUzMiAqcmVmID0gKF9fbGUzMiAqKWJ1ZjsKKwkKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKChyZXQgPSByZWFkX2JsayhzYiwgdHlwZSwgKmJsaywgYnVmKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCByZWFkIHF1b3RhIGRhdGEgYmxvY2sgJXVcbiIsICpibGspOworCQlnb3RvIG91dF9idWY7CisJfQorCW5ld2JsayA9IGxlMzJfdG9fY3B1KHJlZltHRVRJRElOREVYKGRxdW90LT5kcV9pZCwgZGVwdGgpXSk7CisJaWYgKGRlcHRoID09IFYyX0RRVFJFRURFUFRILTEpIHsKKwkJcmV0ID0gZnJlZV9kcWVudHJ5KGRxdW90LCBuZXdibGspOworCQluZXdibGsgPSAwOworCX0KKwllbHNlCisJCXJldCA9IHJlbW92ZV90cmVlKGRxdW90LCAmbmV3YmxrLCBkZXB0aCsxKTsKKwlpZiAocmV0ID49IDAgJiYgIW5ld2JsaykgeworCQlpbnQgaTsKKwkJcmVmW0dFVElESU5ERVgoZHF1b3QtPmRxX2lkLCBkZXB0aCldID0gY3B1X3RvX2xlMzIoMCk7CisJCWZvciAoaSA9IDA7IGkgPCBWMl9EUUJMS1NJWkUgJiYgIWJ1ZltpXTsgaSsrKTsJLyogQmxvY2sgZ290IGVtcHR5PyAqLworCQlpZiAoaSA9PSBWMl9EUUJMS1NJWkUpIHsKKwkJCXB1dF9mcmVlX2RxYmxrKHNiLCB0eXBlLCBidWYsICpibGspOworCQkJKmJsayA9IDA7CisJCX0KKwkJZWxzZQorCQkJaWYgKChyZXQgPSB3cml0ZV9ibGsoc2IsIHR5cGUsICpibGssIGJ1ZikpIDwgMCkKKwkJCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2FuJ3Qgd3JpdGUgcXVvdGEgdHJlZSAiCisJCQkJICAiYmxvY2sgJXUuXG4iLCAqYmxrKTsKKwl9CitvdXRfYnVmOgorCWZyZWVkcWJ1ZihidWYpOworCXJldHVybiByZXQ7CQorfQorCisvKiBEZWxldGUgZHF1b3QgZnJvbSB0cmVlICovCitzdGF0aWMgaW50IHYyX2RlbGV0ZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCXVpbnQgdG1wID0gVjJfRFFUUkVFT0ZGOworCisJaWYgKCFkcXVvdC0+ZHFfb2ZmKQkvKiBFdmVuIG5vdCBhbGxvY2F0ZWQ/ICovCisJCXJldHVybiAwOworCXJldHVybiByZW1vdmVfdHJlZShkcXVvdCwgJnRtcCwgMCk7Cit9CisKKy8qIEZpbmQgZW50cnkgaW4gYmxvY2sgKi8KK3N0YXRpYyBsb2ZmX3QgZmluZF9ibG9ja19kcWVudHJ5KHN0cnVjdCBkcXVvdCAqZHF1b3QsIHVpbnQgYmxrKQoreworCWRxYnVmX3QgYnVmID0gZ2V0ZHFidWYoKTsKKwlsb2ZmX3QgcmV0ID0gMDsKKwlpbnQgaTsKKwlzdHJ1Y3QgdjJfZGlza19kcWJsayAqZGRxdW90ID0gR0VURU5UUklFUyhidWYpOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCWlmICgocmV0ID0gcmVhZF9ibGsoZHF1b3QtPmRxX3NiLCBkcXVvdC0+ZHFfdHlwZSwgYmxrLCBidWYpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IHJlYWQgcXVvdGEgdHJlZSBibG9jayAldS5cbiIsIGJsayk7CisJCWdvdG8gb3V0X2J1ZjsKKwl9CisJaWYgKGRxdW90LT5kcV9pZCkKKwkJZm9yIChpID0gMDsgaSA8IFYyX0RRU1RSSU5CTEsgJiYKKwkJICAgICBsZTMyX3RvX2NwdShkZHF1b3RbaV0uZHFiX2lkKSAhPSBkcXVvdC0+ZHFfaWQ7IGkrKyk7CisJZWxzZSB7CS8qIElEIDAgYXMgYSBiaXQgbW9yZSBjb21wbGljYXRlZCBzZWFyY2hpbmcuLi4gKi8KKwkJc3RydWN0IHYyX2Rpc2tfZHFibGsgZmFrZWRxdW90OworCisJCW1lbXNldCgmZmFrZWRxdW90LCAwLCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKTsKKwkJZm9yIChpID0gMDsgaSA8IFYyX0RRU1RSSU5CTEs7IGkrKykKKwkJCWlmICghbGUzMl90b19jcHUoZGRxdW90W2ldLmRxYl9pZCkgJiYKKwkJCSAgICBtZW1jbXAoJmZha2VkcXVvdCwgZGRxdW90K2ksIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWJsaykpKQorCQkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBWMl9EUVNUUklOQkxLKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBRdW90YSBmb3IgaWQgJXUgcmVmZXJlbmNlZCAiCisJCSAgImJ1dCBub3QgcHJlc2VudC5cbiIsIGRxdW90LT5kcV9pZCk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0X2J1ZjsKKwl9CisJZWxzZQorCQlyZXQgPSAoYmxrIDw8IFYyX0RRQkxLU0laRV9CSVRTKSArIHNpemVvZihzdHJ1Y3QKKwkJICB2Ml9kaXNrX2RxZGJoZWFkZXIpICsgaSAqIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWJsayk7CitvdXRfYnVmOgorCWZyZWVkcWJ1ZihidWYpOworCXJldHVybiByZXQ7Cit9CisKKy8qIEZpbmQgZW50cnkgZm9yIGdpdmVuIGlkIGluIHRoZSB0cmVlICovCitzdGF0aWMgbG9mZl90IGZpbmRfdHJlZV9kcWVudHJ5KHN0cnVjdCBkcXVvdCAqZHF1b3QsIHVpbnQgYmxrLCBpbnQgZGVwdGgpCit7CisJZHFidWZfdCBidWYgPSBnZXRkcWJ1ZigpOworCWxvZmZfdCByZXQgPSAwOworCV9fbGUzMiAqcmVmID0gKF9fbGUzMiAqKWJ1ZjsKKworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoKHJldCA9IHJlYWRfYmxrKGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUsIGJsaywgYnVmKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCByZWFkIHF1b3RhIHRyZWUgYmxvY2sgJXUuXG4iLCBibGspOworCQlnb3RvIG91dF9idWY7CisJfQorCXJldCA9IDA7CisJYmxrID0gbGUzMl90b19jcHUocmVmW0dFVElESU5ERVgoZHF1b3QtPmRxX2lkLCBkZXB0aCldKTsKKwlpZiAoIWJsaykJLyogTm8gcmVmZXJlbmNlPyAqLworCQlnb3RvIG91dF9idWY7CisJaWYgKGRlcHRoIDwgVjJfRFFUUkVFREVQVEgtMSkKKwkJcmV0ID0gZmluZF90cmVlX2RxZW50cnkoZHF1b3QsIGJsaywgZGVwdGgrMSk7CisJZWxzZQorCQlyZXQgPSBmaW5kX2Jsb2NrX2RxZW50cnkoZHF1b3QsIGJsayk7CitvdXRfYnVmOgorCWZyZWVkcWJ1ZihidWYpOworCXJldHVybiByZXQ7Cit9CisKKy8qIEZpbmQgZW50cnkgZm9yIGdpdmVuIGlkIGluIHRoZSB0cmVlIC0gd3JhcHBlciBmdW5jdGlvbiAqLworc3RhdGljIGlubGluZSBsb2ZmX3QgZmluZF9kcWVudHJ5KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJcmV0dXJuIGZpbmRfdHJlZV9kcWVudHJ5KGRxdW90LCBWMl9EUVRSRUVPRkYsIDApOworfQorCitzdGF0aWMgaW50IHYyX3JlYWRfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpbnQgdHlwZSA9IGRxdW90LT5kcV90eXBlOworCWxvZmZfdCBvZmZzZXQ7CisJc3RydWN0IHYyX2Rpc2tfZHFibGsgZGRxdW90LCBlbXB0eTsKKwlpbnQgcmV0ID0gMDsKKworI2lmZGVmIF9fUVVPVEFfVjJfUEFSQU5PSUEKKwkvKiBJbnZhbGlkYXRlZCBxdW90YT8gKi8KKwlpZiAoIWRxdW90LT5kcV9zYiB8fCAhc2JfZHFvcHQoZHF1b3QtPmRxX3NiKS0+ZmlsZXNbdHlwZV0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IFF1b3RhIGludmFsaWRhdGVkIHdoaWxlIHJlYWRpbmchXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorI2VuZGlmCisJb2Zmc2V0ID0gZmluZF9kcWVudHJ5KGRxdW90KTsKKwlpZiAob2Zmc2V0IDw9IDApIHsJLyogRW50cnkgbm90IHByZXNlbnQ/ICovCisJCWlmIChvZmZzZXQgPCAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IHJlYWQgcXVvdGEgIgorCQkJICAic3RydWN0dXJlIGZvciBpZCAldS5cbiIsIGRxdW90LT5kcV9pZCk7CisJCWRxdW90LT5kcV9vZmYgPSAwOworCQlzZXRfYml0KERRX0ZBS0VfQiwgJmRxdW90LT5kcV9mbGFncyk7CisJCW1lbXNldCgmZHF1b3QtPmRxX2RxYiwgMCwgc2l6ZW9mKHN0cnVjdCBtZW1fZHFibGspKTsKKwkJcmV0ID0gb2Zmc2V0OworCX0KKwllbHNlIHsKKwkJZHF1b3QtPmRxX29mZiA9IG9mZnNldDsKKwkJaWYgKChyZXQgPSBkcXVvdC0+ZHFfc2ItPnNfb3AtPnF1b3RhX3JlYWQoZHF1b3QtPmRxX3NiLCB0eXBlLAorCQkgICAgKGNoYXIgKikmZGRxdW90LCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspLCBvZmZzZXQpKQorCQkgICAgIT0gc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSkgeworCQkJaWYgKHJldCA+PSAwKQorCQkJCXJldCA9IC1FSU87CisJCQlwcmludGsoS0VSTl9FUlIgIlZGUzogRXJyb3Igd2hpbGUgcmVhZGluZyBxdW90YSAiCisJCQkgICJzdHJ1Y3R1cmUgZm9yIGlkICV1LlxuIiwgZHF1b3QtPmRxX2lkKTsKKwkJCW1lbXNldCgmZGRxdW90LCAwLCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKTsKKwkJfQorCQllbHNlIHsKKwkJCXJldCA9IDA7CisJCQkvKiBXZSBuZWVkIHRvIGVzY2FwZSBiYWNrIGFsbC16ZXJvIHN0cnVjdHVyZSAqLworCQkJbWVtc2V0KCZlbXB0eSwgMCwgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSk7CisJCQllbXB0eS5kcWJfaXRpbWUgPSBjcHVfdG9fbGU2NCgxKTsKKwkJCWlmICghbWVtY21wKCZlbXB0eSwgJmRkcXVvdCwgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSkpCisJCQkJZGRxdW90LmRxYl9pdGltZSA9IDA7CisJCX0KKwkJZGlzazJtZW1kcWIoJmRxdW90LT5kcV9kcWIsICZkZHF1b3QpOworCQlpZiAoIWRxdW90LT5kcV9kcWIuZHFiX2JoYXJkbGltaXQgJiYKKwkJCSFkcXVvdC0+ZHFfZHFiLmRxYl9ic29mdGxpbWl0ICYmCisJCQkhZHF1b3QtPmRxX2RxYi5kcWJfaWhhcmRsaW1pdCAmJgorCQkJIWRxdW90LT5kcV9kcWIuZHFiX2lzb2Z0bGltaXQpCisJCQlzZXRfYml0KERRX0ZBS0VfQiwgJmRxdW90LT5kcV9mbGFncyk7CisJfQorCWRxc3RhdHMucmVhZHMrKzsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIENoZWNrIHdoZXRoZXIgZHF1b3Qgc2hvdWxkIG5vdCBiZSBkZWxldGVkLiBXZSBrbm93IHdlIGFyZQorICogdGhlIG9ubHkgb25lIG9wZXJhdGluZyBvbiBkcXVvdCAodGhhbmtzIHRvIGRxX2xvY2spICovCitzdGF0aWMgaW50IHYyX3JlbGVhc2VfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpZiAodGVzdF9iaXQoRFFfRkFLRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKSAmJiAhKGRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlcyB8IGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlKSkKKwkJcmV0dXJuIHYyX2RlbGV0ZV9kcXVvdChkcXVvdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcXVvdGFfZm9ybWF0X29wcyB2Ml9mb3JtYXRfb3BzID0geworCS5jaGVja19xdW90YV9maWxlCT0gdjJfY2hlY2tfcXVvdGFfZmlsZSwKKwkucmVhZF9maWxlX2luZm8JCT0gdjJfcmVhZF9maWxlX2luZm8sCisJLndyaXRlX2ZpbGVfaW5mbwk9IHYyX3dyaXRlX2ZpbGVfaW5mbywKKwkuZnJlZV9maWxlX2luZm8JCT0gTlVMTCwKKwkucmVhZF9kcWJsawkJPSB2Ml9yZWFkX2RxdW90LAorCS5jb21taXRfZHFibGsJCT0gdjJfd3JpdGVfZHF1b3QsCisJLnJlbGVhc2VfZHFibGsJCT0gdjJfcmVsZWFzZV9kcXVvdCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcXVvdGFfZm9ybWF0X3R5cGUgdjJfcXVvdGFfZm9ybWF0ID0geworCS5xZl9mbXRfaWQJPSBRRk1UX1ZGU19WMCwKKwkucWZfb3BzCQk9ICZ2Ml9mb3JtYXRfb3BzLAorCS5xZl9vd25lcgk9IFRISVNfTU9EVUxFCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3YyX3F1b3RhX2Zvcm1hdCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9xdW90YV9mb3JtYXQoJnYyX3F1b3RhX2Zvcm1hdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3YyX3F1b3RhX2Zvcm1hdCh2b2lkKQoreworCXVucmVnaXN0ZXJfcXVvdGFfZm9ybWF0KCZ2Ml9xdW90YV9mb3JtYXQpOworfQorCittb2R1bGVfaW5pdChpbml0X3YyX3F1b3RhX2Zvcm1hdCk7Cittb2R1bGVfZXhpdChleGl0X3YyX3F1b3RhX2Zvcm1hdCk7CmRpZmYgLS1naXQgYS9mcy9yYW1mcy9NYWtlZmlsZSBiL2ZzL3JhbWZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwOTZmMzAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yYW1mcy9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCByYW1mcyByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX1JBTUZTKSArPSByYW1mcy5vCisKK3JhbWZzLW9ianMgOj0gaW5vZGUubwpkaWZmIC0tZ2l0IGEvZnMvcmFtZnMvaW5vZGUuYyBiL2ZzL3JhbWZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4ODkxNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JhbWZzL2lub2RlLmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBSZXNpemFibGUgc2ltcGxlIHJhbSBmaWxlc3lzdGVtIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTGludXMgVG9ydmFsZHMuCisgKiAgICAgICAgICAgICAgIDIwMDAgVHJhbnNtZXRhIENvcnAuCisgKgorICogVXNhZ2UgbGltaXRzIGFkZGVkIGJ5IERhdmlkIEdpYnNvbiwgTGludXhjYXJlIEF1c3RyYWxpYS4KKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKy8qCisgKiBOT1RFISBUaGlzIGZpbGVzeXN0ZW0gaXMgcHJvYmFibHkgbW9zdCB1c2VmdWwKKyAqIG5vdCBhcyBhIHJlYWwgZmlsZXN5c3RlbSwgYnV0IGFzIGFuIGV4YW1wbGUgb2YKKyAqIGhvdyB2aXJ0dWFsIGZpbGVzeXN0ZW1zIGNhbiBiZSB3cml0dGVuLgorICoKKyAqIEl0IGRvZXNuJ3QgZ2V0IG11Y2ggc2ltcGxlciB0aGFuIHRoaXMuIENvbnNpZGVyCisgKiB0aGF0IHRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBmdWxsIHNlbWFudGljcyBvZgorICogYSBQT1NJWC1jb21wbGlhbnQgcmVhZC13cml0ZSBmaWxlc3lzdGVtLgorICoKKyAqIE5vdGUgaW4gcGFydGljdWxhciBob3cgdGhlIGZpbGVzeXN0ZW0gZG9lcyBub3QKKyAqIG5lZWQgdG8gaW1wbGVtZW50IGFueSBkYXRhIHN0cnVjdHVyZXMgb2YgaXRzIG93bgorICogdG8ga2VlcCB0cmFjayBvZiB0aGUgdmlydHVhbCBkYXRhOiB1c2luZyB0aGUgVkZTCisgKiBjYWNoZXMgaXMgc3VmZmljaWVudC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcmFtZnMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qIHNvbWUgcmFuZG9tIG51bWJlciAqLworI2RlZmluZSBSQU1GU19NQUdJQwkweDg1ODQ1OGY2CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyByYW1mc19vcHM7CitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyByYW1mc19hb3BzOworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHJhbWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyByYW1mc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKworc3RhdGljIHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvIHJhbWZzX2JhY2tpbmdfZGV2X2luZm8gPSB7CisJLnJhX3BhZ2VzCT0gMCwJLyogTm8gcmVhZGFoZWFkICovCisJLmNhcGFiaWxpdGllcwk9IEJESV9DQVBfTk9fQUNDVF9ESVJUWSB8IEJESV9DQVBfTk9fV1JJVEVCQUNLIHwKKwkJCSAgQkRJX0NBUF9NQVBfRElSRUNUIHwgQkRJX0NBUF9NQVBfQ09QWSB8CisJCQkgIEJESV9DQVBfUkVBRF9NQVAgfCBCRElfQ0FQX1dSSVRFX01BUCB8IEJESV9DQVBfRVhFQ19NQVAsCit9OworCitzdHJ1Y3QgaW5vZGUgKnJhbWZzX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW9kZSwgZGV2X3QgZGV2KQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gbmV3X2lub2RlKHNiKTsKKworCWlmIChpbm9kZSkgeworCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwkJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJCWlub2RlLT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCQlpbm9kZS0+aV9ibG9ja3MgPSAwOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZyYW1mc19hb3BzOworCQlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJnJhbWZzX2JhY2tpbmdfZGV2X2luZm87CisJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwkJc3dpdGNoIChtb2RlICYgU19JRk1UKSB7CisJCWRlZmF1bHQ6CisJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIG1vZGUsIGRldik7CisJCQlicmVhazsKKwkJY2FzZSBTX0lGUkVHOgorCQkJaW5vZGUtPmlfb3AgPSAmcmFtZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfZm9wID0gJnJhbWZzX2ZpbGVfb3BlcmF0aW9uczsKKwkJCWJyZWFrOworCQljYXNlIFNfSUZESVI6CisJCQlpbm9kZS0+aV9vcCA9ICZyYW1mc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2ZvcCA9ICZzaW1wbGVfZGlyX29wZXJhdGlvbnM7CisKKwkJCS8qIGRpcmVjdG9yeSBpbm9kZXMgc3RhcnQgb2ZmIHdpdGggaV9ubGluayA9PSAyIChmb3IgIi4iIGVudHJ5KSAqLworCQkJaW5vZGUtPmlfbmxpbmsrKzsKKwkJCWJyZWFrOworCQljYXNlIFNfSUZMTks6CisJCQlpbm9kZS0+aV9vcCA9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBpbm9kZTsKK30KKworLyoKKyAqIEZpbGUgY3JlYXRpb24uIEFsbG9jYXRlIGFuIGlub2RlLCBhbmQgd2UncmUgZG9uZS4uCisgKi8KKy8qIFNNUC1zYWZlICovCitzdGF0aWMgaW50CityYW1mc19ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwgZGV2X3QgZGV2KQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gcmFtZnNfZ2V0X2lub2RlKGRpci0+aV9zYiwgbW9kZSwgZGV2KTsKKwlpbnQgZXJyb3IgPSAtRU5PU1BDOworCisJaWYgKGlub2RlKSB7CisJCWlmIChkaXItPmlfbW9kZSAmIFNfSVNHSUQpIHsKKwkJCWlub2RlLT5pX2dpZCA9IGRpci0+aV9naWQ7CisJCQlpZiAoU19JU0RJUihtb2RlKSkKKwkJCQlpbm9kZS0+aV9tb2RlIHw9IFNfSVNHSUQ7CisJCX0KKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwkJZGdldChkZW50cnkpOwkvKiBFeHRyYSBjb3VudCAtIHBpbiB0aGUgZGVudHJ5IGluIGNvcmUgKi8KKwkJZXJyb3IgPSAwOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgcmFtZnNfbWtkaXIoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBpbnQgbW9kZSkKK3sKKwlpbnQgcmV0dmFsID0gcmFtZnNfbWtub2QoZGlyLCBkZW50cnksIG1vZGUgfCBTX0lGRElSLCAwKTsKKwlpZiAoIXJldHZhbCkKKwkJZGlyLT5pX25saW5rKys7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCByYW1mc19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXJldHVybiByYW1mc19ta25vZChkaXIsIGRlbnRyeSwgbW9kZSB8IFNfSUZSRUcsIDApOworfQorCitzdGF0aWMgaW50IHJhbWZzX3N5bWxpbmsoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKiBzeW1uYW1lKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGVycm9yID0gLUVOT1NQQzsKKworCWlub2RlID0gcmFtZnNfZ2V0X2lub2RlKGRpci0+aV9zYiwgU19JRkxOS3xTX0lSV1hVR08sIDApOworCWlmIChpbm9kZSkgeworCQlpbnQgbCA9IHN0cmxlbihzeW1uYW1lKSsxOworCQllcnJvciA9IHBhZ2Vfc3ltbGluayhpbm9kZSwgc3ltbmFtZSwgbCk7CisJCWlmICghZXJyb3IpIHsKKwkJCWlmIChkaXItPmlfbW9kZSAmIFNfSVNHSUQpCisJCQkJaW5vZGUtPmlfZ2lkID0gZGlyLT5pX2dpZDsKKwkJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJCQlkZ2V0KGRlbnRyeSk7CisJCX0gZWxzZQorCQkJaXB1dChpbm9kZSk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgcmFtZnNfYW9wcyA9IHsKKwkucmVhZHBhZ2UJPSBzaW1wbGVfcmVhZHBhZ2UsCisJLnByZXBhcmVfd3JpdGUJPSBzaW1wbGVfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gc2ltcGxlX2NvbW1pdF93cml0ZQorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByYW1mc19maWxlX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gZ2VuZXJpY19maWxlX3JlYWQsCisJLndyaXRlCQk9IGdlbmVyaWNfZmlsZV93cml0ZSwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkuZnN5bmMJCT0gc2ltcGxlX3N5bmNfZmlsZSwKKwkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorfTsKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHJhbWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkuZ2V0YXR0cgk9IHNpbXBsZV9nZXRhdHRyLAorfTsKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHJhbWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0geworCS5jcmVhdGUJCT0gcmFtZnNfY3JlYXRlLAorCS5sb29rdXAJCT0gc2ltcGxlX2xvb2t1cCwKKwkubGluawkJPSBzaW1wbGVfbGluaywKKwkudW5saW5rCQk9IHNpbXBsZV91bmxpbmssCisJLnN5bWxpbmsJPSByYW1mc19zeW1saW5rLAorCS5ta2RpcgkJPSByYW1mc19ta2RpciwKKwkucm1kaXIJCT0gc2ltcGxlX3JtZGlyLAorCS5ta25vZAkJPSByYW1mc19ta25vZCwKKwkucmVuYW1lCQk9IHNpbXBsZV9yZW5hbWUsCit9OworCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgcmFtZnNfb3BzID0geworCS5zdGF0ZnMJCT0gc2ltcGxlX3N0YXRmcywKKwkuZHJvcF9pbm9kZQk9IGdlbmVyaWNfZGVsZXRlX2lub2RlLAorfTsKKworc3RhdGljIGludCByYW1mc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCB2b2lkICogZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5ICogcm9vdDsKKworCXNiLT5zX21heGJ5dGVzID0gTUFYX0xGU19GSUxFU0laRTsKKwlzYi0+c19ibG9ja3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBQQUdFX0NBQ0hFX1NISUZUOworCXNiLT5zX21hZ2ljID0gUkFNRlNfTUFHSUM7CisJc2ItPnNfb3AgPSAmcmFtZnNfb3BzOworCXNiLT5zX3RpbWVfZ3JhbiA9IDE7CisJaW5vZGUgPSByYW1mc19nZXRfaW5vZGUoc2IsIFNfSUZESVIgfCAwNzU1LCAwKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJvb3QgPSBkX2FsbG9jX3Jvb3QoaW5vZGUpOworCWlmICghcm9vdCkgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNiLT5zX3Jvb3QgPSByb290OworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnJhbWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2Jfbm9kZXYoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIHJhbWZzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpyb290ZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFnc3xNU19OT1VTRVIsIGRhdGEsIHJhbWZzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgcmFtZnNfZnNfdHlwZSA9IHsKKwkubmFtZQkJPSAicmFtZnMiLAorCS5nZXRfc2IJCT0gcmFtZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9saXR0ZXJfc3VwZXIsCit9Oworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHJvb3Rmc19mc190eXBlID0geworCS5uYW1lCQk9ICJyb290ZnMiLAorCS5nZXRfc2IJCT0gcm9vdGZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfbGl0dGVyX3N1cGVyLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9yYW1mc19mcyh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9maWxlc3lzdGVtKCZyYW1mc19mc190eXBlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfcmFtZnNfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnJhbWZzX2ZzX3R5cGUpOworfQorCittb2R1bGVfaW5pdChpbml0X3JhbWZzX2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9yYW1mc19mcykKKworaW50IF9faW5pdCBpbml0X3Jvb3Rmcyh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9maWxlc3lzdGVtKCZyb290ZnNfZnNfdHlwZSk7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL3JlYWRfd3JpdGUuYyBiL2ZzL3JlYWRfd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmU0YjFhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcmVhZF93cml0ZS5jCkBAIC0wLDAgKzEsNzMwIEBACisvKgorICogIGxpbnV4L2ZzL3JlYWRfd3JpdGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4gCisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZG5vdGlmeS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdlbmVyaWNfcm9fZm9wcyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19maWxlX3JlYWQsCisJLm1tYXAJCT0gZ2VuZXJpY19maWxlX3JlYWRvbmx5X21tYXAsCisJLnNlbmRmaWxlCT0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorfTsKKworRVhQT1JUX1NZTUJPTChnZW5lcmljX3JvX2ZvcHMpOworCitsb2ZmX3QgZ2VuZXJpY19maWxlX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKK3sKKwlsb25nIGxvbmcgcmV0dmFsOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CisKKwlkb3duKCZpbm9kZS0+aV9zZW0pOworCXN3aXRjaCAob3JpZ2luKSB7CisJCWNhc2UgMjoKKwkJCW9mZnNldCArPSBpbm9kZS0+aV9zaXplOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCW9mZnNldCArPSBmaWxlLT5mX3BvczsKKwl9CisJcmV0dmFsID0gLUVJTlZBTDsKKwlpZiAob2Zmc2V0Pj0wICYmIG9mZnNldDw9aW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpIHsKKwkJaWYgKG9mZnNldCAhPSBmaWxlLT5mX3BvcykgeworCQkJZmlsZS0+Zl9wb3MgPSBvZmZzZXQ7CisJCQlmaWxlLT5mX3ZlcnNpb24gPSAwOworCQl9CisJCXJldHZhbCA9IG9mZnNldDsKKwl9CisJdXAoJmlub2RlLT5pX3NlbSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworRVhQT1JUX1NZTUJPTChnZW5lcmljX2ZpbGVfbGxzZWVrKTsKKworbG9mZl90IHJlbW90ZV9sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pCit7CisJbG9uZyBsb25nIHJldHZhbDsKKworCWxvY2tfa2VybmVsKCk7CisJc3dpdGNoIChvcmlnaW4pIHsKKwkJY2FzZSAyOgorCQkJb2Zmc2V0ICs9IGlfc2l6ZV9yZWFkKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7CisJfQorCXJldHZhbCA9IC1FSU5WQUw7CisJaWYgKG9mZnNldD49MCAmJiBvZmZzZXQ8PWZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX21heGJ5dGVzKSB7CisJCWlmIChvZmZzZXQgIT0gZmlsZS0+Zl9wb3MpIHsKKwkJCWZpbGUtPmZfcG9zID0gb2Zmc2V0OworCQkJZmlsZS0+Zl92ZXJzaW9uID0gMDsKKwkJfQorCQlyZXR2YWwgPSBvZmZzZXQ7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0dmFsOworfQorRVhQT1JUX1NZTUJPTChyZW1vdGVfbGxzZWVrKTsKKworbG9mZl90IG5vX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKK3sKKwlyZXR1cm4gLUVTUElQRTsKK30KK0VYUE9SVF9TWU1CT0wobm9fbGxzZWVrKTsKKworbG9mZl90IGRlZmF1bHRfbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luKQoreworCWxvbmcgbG9uZyByZXR2YWw7CisKKwlsb2NrX2tlcm5lbCgpOworCXN3aXRjaCAob3JpZ2luKSB7CisJCWNhc2UgMjoKKwkJCW9mZnNldCArPSBpX3NpemVfcmVhZChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJb2Zmc2V0ICs9IGZpbGUtPmZfcG9zOworCX0KKwlyZXR2YWwgPSAtRUlOVkFMOworCWlmIChvZmZzZXQgPj0gMCkgeworCQlpZiAob2Zmc2V0ICE9IGZpbGUtPmZfcG9zKSB7CisJCQlmaWxlLT5mX3BvcyA9IG9mZnNldDsKKwkJCWZpbGUtPmZfdmVyc2lvbiA9IDA7CisJCX0KKwkJcmV0dmFsID0gb2Zmc2V0OworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0woZGVmYXVsdF9sbHNlZWspOworCitsb2ZmX3QgdmZzX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKK3sKKwlsb2ZmX3QgKCpmbikoc3RydWN0IGZpbGUgKiwgbG9mZl90LCBpbnQpOworCisJZm4gPSBub19sbHNlZWs7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX0xTRUVLKSB7CisJCWZuID0gZGVmYXVsdF9sbHNlZWs7CisJCWlmIChmaWxlLT5mX29wICYmIGZpbGUtPmZfb3AtPmxsc2VlaykKKwkJCWZuID0gZmlsZS0+Zl9vcC0+bGxzZWVrOworCX0KKwlyZXR1cm4gZm4oZmlsZSwgb2Zmc2V0LCBvcmlnaW4pOworfQorRVhQT1JUX1NZTUJPTCh2ZnNfbGxzZWVrKTsKKworYXNtbGlua2FnZSBvZmZfdCBzeXNfbHNlZWsodW5zaWduZWQgaW50IGZkLCBvZmZfdCBvZmZzZXQsIHVuc2lnbmVkIGludCBvcmlnaW4pCit7CisJb2ZmX3QgcmV0dmFsOworCXN0cnVjdCBmaWxlICogZmlsZTsKKwlpbnQgZnB1dF9uZWVkZWQ7CisKKwlyZXR2YWwgPSAtRUJBREY7CisJZmlsZSA9IGZnZXRfbGlnaHQoZmQsICZmcHV0X25lZWRlZCk7CisJaWYgKCFmaWxlKQorCQlnb3RvIGJhZDsKKworCXJldHZhbCA9IC1FSU5WQUw7CisJaWYgKG9yaWdpbiA8PSAyKSB7CisJCWxvZmZfdCByZXMgPSB2ZnNfbGxzZWVrKGZpbGUsIG9mZnNldCwgb3JpZ2luKTsKKwkJcmV0dmFsID0gcmVzOworCQlpZiAocmVzICE9IChsb2ZmX3QpcmV0dmFsKQorCQkJcmV0dmFsID0gLUVPVkVSRkxPVzsJLyogTEZTOiBzaG91bGQgb25seSBoYXBwZW4gb24gMzIgYml0IHBsYXRmb3JtcyAqLworCX0KKwlmcHV0X2xpZ2h0KGZpbGUsIGZwdXRfbmVlZGVkKTsKK2JhZDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisjaWZkZWYgX19BUkNIX1dBTlRfU1lTX0xMU0VFSworYXNtbGlua2FnZSBsb25nIHN5c19sbHNlZWsodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBsb25nIG9mZnNldF9oaWdoLAorCQkJICAgdW5zaWduZWQgbG9uZyBvZmZzZXRfbG93LCBsb2ZmX3QgX191c2VyICogcmVzdWx0LAorCQkJICAgdW5zaWduZWQgaW50IG9yaWdpbikKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBmaWxlICogZmlsZTsKKwlsb2ZmX3Qgb2Zmc2V0OworCWludCBmcHV0X25lZWRlZDsKKworCXJldHZhbCA9IC1FQkFERjsKKwlmaWxlID0gZmdldF9saWdodChmZCwgJmZwdXRfbmVlZGVkKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gYmFkOworCisJcmV0dmFsID0gLUVJTlZBTDsKKwlpZiAob3JpZ2luID4gMikKKwkJZ290byBvdXRfcHV0ZjsKKworCW9mZnNldCA9IHZmc19sbHNlZWsoZmlsZSwgKChsb2ZmX3QpIG9mZnNldF9oaWdoIDw8IDMyKSB8IG9mZnNldF9sb3csCisJCQlvcmlnaW4pOworCisJcmV0dmFsID0gKGludClvZmZzZXQ7CisJaWYgKG9mZnNldCA+PSAwKSB7CisJCXJldHZhbCA9IC1FRkFVTFQ7CisJCWlmICghY29weV90b191c2VyKHJlc3VsdCwgJm9mZnNldCwgc2l6ZW9mKG9mZnNldCkpKQorCQkJcmV0dmFsID0gMDsKKwl9CitvdXRfcHV0ZjoKKwlmcHV0X2xpZ2h0KGZpbGUsIGZwdXRfbmVlZGVkKTsKK2JhZDoKKwlyZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKKworaW50IHJ3X3ZlcmlmeV9hcmVhKGludCByZWFkX3dyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90ICpwcG9zLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlsb2ZmX3QgcG9zOworCisJaWYgKHVubGlrZWx5KGNvdW50ID4gZmlsZS0+Zl9tYXhjb3VudCkpCisJCWdvdG8gRWludmFsOworCXBvcyA9ICpwcG9zOworCWlmICh1bmxpa2VseSgocG9zIDwgMCkgfHwgKGxvZmZfdCkgKHBvcyArIGNvdW50KSA8IDApKQorCQlnb3RvIEVpbnZhbDsKKworCWlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJaWYgKGlub2RlLT5pX2Zsb2NrICYmIE1BTkRBVE9SWV9MT0NLKGlub2RlKSkKKwkJcmV0dXJuIGxvY2tzX21hbmRhdG9yeV9hcmVhKHJlYWRfd3JpdGUgPT0gUkVBRCA/IEZMT0NLX1ZFUklGWV9SRUFEIDogRkxPQ0tfVkVSSUZZX1dSSVRFLCBpbm9kZSwgZmlsZSwgcG9zLCBjb3VudCk7CisJcmV0dXJuIDA7CisKK0VpbnZhbDoKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3NpemVfdCBkb19zeW5jX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qga2lvY2Iga2lvY2I7CisJc3NpemVfdCByZXQ7CisKKwlpbml0X3N5bmNfa2lvY2IoJmtpb2NiLCBmaWxwKTsKKwlraW9jYi5raV9wb3MgPSAqcHBvczsKKwlyZXQgPSBmaWxwLT5mX29wLT5haW9fcmVhZCgma2lvY2IsIGJ1ZiwgbGVuLCBraW9jYi5raV9wb3MpOworCWlmICgtRUlPQ0JRVUVVRUQgPT0gcmV0KQorCQlyZXQgPSB3YWl0X29uX3N5bmNfa2lvY2IoJmtpb2NiKTsKKwkqcHBvcyA9IGtpb2NiLmtpX3BvczsKKwlyZXR1cm4gcmV0OworfQorCitFWFBPUlRfU1lNQk9MKGRvX3N5bmNfcmVhZCk7CisKK3NzaXplX3QgdmZzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisJc3NpemVfdCByZXQ7CisKKwlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJcmV0dXJuIC1FQkFERjsKKwlpZiAoIWZpbGUtPmZfb3AgfHwgKCFmaWxlLT5mX29wLT5yZWFkICYmICFmaWxlLT5mX29wLT5haW9fcmVhZCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh1bmxpa2VseSghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBjb3VudCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldCA9IHJ3X3ZlcmlmeV9hcmVhKFJFQUQsIGZpbGUsIHBvcywgY291bnQpOworCWlmICghcmV0KSB7CisJCXJldCA9IHNlY3VyaXR5X2ZpbGVfcGVybWlzc2lvbiAoZmlsZSwgTUFZX1JFQUQpOworCQlpZiAoIXJldCkgeworCQkJaWYgKGZpbGUtPmZfb3AtPnJlYWQpCisJCQkJcmV0ID0gZmlsZS0+Zl9vcC0+cmVhZChmaWxlLCBidWYsIGNvdW50LCBwb3MpOworCQkJZWxzZQorCQkJCXJldCA9IGRvX3N5bmNfcmVhZChmaWxlLCBidWYsIGNvdW50LCBwb3MpOworCQkJaWYgKHJldCA+IDApIHsKKwkJCQlkbm90aWZ5X3BhcmVudChmaWxlLT5mX2RlbnRyeSwgRE5fQUNDRVNTKTsKKwkJCQljdXJyZW50LT5yY2hhciArPSByZXQ7CisJCQl9CisJCQljdXJyZW50LT5zeXNjcisrOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTCh2ZnNfcmVhZCk7CisKK3NzaXplX3QgZG9fc3luY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBraW9jYiBraW9jYjsKKwlzc2l6ZV90IHJldDsKKworCWluaXRfc3luY19raW9jYigma2lvY2IsIGZpbHApOworCWtpb2NiLmtpX3BvcyA9ICpwcG9zOworCXJldCA9IGZpbHAtPmZfb3AtPmFpb193cml0ZSgma2lvY2IsIGJ1ZiwgbGVuLCBraW9jYi5raV9wb3MpOworCWlmICgtRUlPQ0JRVUVVRUQgPT0gcmV0KQorCQlyZXQgPSB3YWl0X29uX3N5bmNfa2lvY2IoJmtpb2NiKTsKKwkqcHBvcyA9IGtpb2NiLmtpX3BvczsKKwlyZXR1cm4gcmV0OworfQorCitFWFBPUlRfU1lNQk9MKGRvX3N5bmNfd3JpdGUpOworCitzc2l6ZV90IHZmc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwlzc2l6ZV90IHJldDsKKworCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJcmV0dXJuIC1FQkFERjsKKwlpZiAoIWZpbGUtPmZfb3AgfHwgKCFmaWxlLT5mX29wLT53cml0ZSAmJiAhZmlsZS0+Zl9vcC0+YWlvX3dyaXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHVubGlrZWx5KCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZiwgY291bnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXQgPSByd192ZXJpZnlfYXJlYShXUklURSwgZmlsZSwgcG9zLCBjb3VudCk7CisJaWYgKCFyZXQpIHsKKwkJcmV0ID0gc2VjdXJpdHlfZmlsZV9wZXJtaXNzaW9uIChmaWxlLCBNQVlfV1JJVEUpOworCQlpZiAoIXJldCkgeworCQkJaWYgKGZpbGUtPmZfb3AtPndyaXRlKQorCQkJCXJldCA9IGZpbGUtPmZfb3AtPndyaXRlKGZpbGUsIGJ1ZiwgY291bnQsIHBvcyk7CisJCQllbHNlCisJCQkJcmV0ID0gZG9fc3luY193cml0ZShmaWxlLCBidWYsIGNvdW50LCBwb3MpOworCQkJaWYgKHJldCA+IDApIHsKKwkJCQlkbm90aWZ5X3BhcmVudChmaWxlLT5mX2RlbnRyeSwgRE5fTU9ESUZZKTsKKwkJCQljdXJyZW50LT53Y2hhciArPSByZXQ7CisJCQl9CisJCQljdXJyZW50LT5zeXNjdysrOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTCh2ZnNfd3JpdGUpOworCitzdGF0aWMgaW5saW5lIGxvZmZfdCBmaWxlX3Bvc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBmaWxlLT5mX3BvczsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZpbGVfcG9zX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgcG9zKQoreworCWZpbGUtPmZfcG9zID0gcG9zOworfQorCithc21saW5rYWdlIHNzaXplX3Qgc3lzX3JlYWQodW5zaWduZWQgaW50IGZkLCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmaWxlICpmaWxlOworCXNzaXplX3QgcmV0ID0gLUVCQURGOworCWludCBmcHV0X25lZWRlZDsKKworCWZpbGUgPSBmZ2V0X2xpZ2h0KGZkLCAmZnB1dF9uZWVkZWQpOworCWlmIChmaWxlKSB7CisJCWxvZmZfdCBwb3MgPSBmaWxlX3Bvc19yZWFkKGZpbGUpOworCQlyZXQgPSB2ZnNfcmVhZChmaWxlLCBidWYsIGNvdW50LCAmcG9zKTsKKwkJZmlsZV9wb3Nfd3JpdGUoZmlsZSwgcG9zKTsKKwkJZnB1dF9saWdodChmaWxlLCBmcHV0X25lZWRlZCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHN5c19yZWFkKTsKKworYXNtbGlua2FnZSBzc2l6ZV90IHN5c193cml0ZSh1bnNpZ25lZCBpbnQgZmQsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJc3NpemVfdCByZXQgPSAtRUJBREY7CisJaW50IGZwdXRfbmVlZGVkOworCisJZmlsZSA9IGZnZXRfbGlnaHQoZmQsICZmcHV0X25lZWRlZCk7CisJaWYgKGZpbGUpIHsKKwkJbG9mZl90IHBvcyA9IGZpbGVfcG9zX3JlYWQoZmlsZSk7CisJCXJldCA9IHZmc193cml0ZShmaWxlLCBidWYsIGNvdW50LCAmcG9zKTsKKwkJZmlsZV9wb3Nfd3JpdGUoZmlsZSwgcG9zKTsKKwkJZnB1dF9saWdodChmaWxlLCBmcHV0X25lZWRlZCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworYXNtbGlua2FnZSBzc2l6ZV90IHN5c19wcmVhZDY0KHVuc2lnbmVkIGludCBmZCwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBmaWxlICpmaWxlOworCXNzaXplX3QgcmV0ID0gLUVCQURGOworCWludCBmcHV0X25lZWRlZDsKKworCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZpbGUgPSBmZ2V0X2xpZ2h0KGZkLCAmZnB1dF9uZWVkZWQpOworCWlmIChmaWxlKSB7CisJCXJldCA9IC1FU1BJUEU7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9QUkVBRCkKKwkJCXJldCA9IHZmc19yZWFkKGZpbGUsIGJ1ZiwgY291bnQsICZwb3MpOworCQlmcHV0X2xpZ2h0KGZpbGUsIGZwdXRfbmVlZGVkKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCithc21saW5rYWdlIHNzaXplX3Qgc3lzX3B3cml0ZTY0KHVuc2lnbmVkIGludCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzc2l6ZV90IHJldCA9IC1FQkFERjsKKwlpbnQgZnB1dF9uZWVkZWQ7CisKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmaWxlID0gZmdldF9saWdodChmZCwgJmZwdXRfbmVlZGVkKTsKKwlpZiAoZmlsZSkgeworCQlyZXQgPSAtRVNQSVBFOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUFdSSVRFKSAgCisJCQlyZXQgPSB2ZnNfd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgJnBvcyk7CisJCWZwdXRfbGlnaHQoZmlsZSwgZnB1dF9uZWVkZWQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWR1Y2UgYW4gaW92ZWMncyBsZW5ndGggaW4tcGxhY2UuICBSZXR1cm4gdGhlIHJlc3VsdGluZyBudW1iZXIgb2Ygc2VnbWVudHMKKyAqLwordW5zaWduZWQgbG9uZyBpb3Zfc2hvcnRlbihzdHJ1Y3QgaW92ZWMgKmlvdiwgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBzaXplX3QgdG8pCit7CisJdW5zaWduZWQgbG9uZyBzZWcgPSAwOworCXNpemVfdCBsZW4gPSAwOworCisJd2hpbGUgKHNlZyA8IG5yX3NlZ3MpIHsKKwkJc2VnKys7CisJCWlmIChsZW4gKyBpb3YtPmlvdl9sZW4gPj0gdG8pIHsKKwkJCWlvdi0+aW92X2xlbiA9IHRvIC0gbGVuOworCQkJYnJlYWs7CisJCX0KKwkJbGVuICs9IGlvdi0+aW92X2xlbjsKKwkJaW92Kys7CisJfQorCXJldHVybiBzZWc7Cit9CisKK0VYUE9SVF9TWU1CT0woaW92X3Nob3J0ZW4pOworCisvKiBBIHdyaXRlIG9wZXJhdGlvbiBkb2VzIGEgcmVhZCBmcm9tIHVzZXIgc3BhY2UgYW5kIHZpY2UgdmVyc2EgKi8KKyNkZWZpbmUgdnJmeV9kaXIodHlwZSkgKCh0eXBlKSA9PSBSRUFEID8gVkVSSUZZX1dSSVRFIDogVkVSSUZZX1JFQUQpCisKK3N0YXRpYyBzc2l6ZV90IGRvX3JlYWR2X3dyaXRldihpbnQgdHlwZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGlvdmVjIF9fdXNlciAqIHV2ZWN0b3IsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgKnBvcykKK3sKKwl0eXBlZGVmIHNzaXplX3QgKCppb19mbl90KShzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKKwl0eXBlZGVmIHNzaXplX3QgKCppb3ZfZm5fdCkoc3RydWN0IGZpbGUgKiwgY29uc3Qgc3RydWN0IGlvdmVjICosIHVuc2lnbmVkIGxvbmcsIGxvZmZfdCAqKTsKKworCXNpemVfdCB0b3RfbGVuOworCXN0cnVjdCBpb3ZlYyBpb3ZzdGFja1tVSU9fRkFTVElPVl07CisJc3RydWN0IGlvdmVjICppb3Y9aW92c3RhY2ssICp2ZWN0b3I7CisJc3NpemVfdCByZXQ7CisJaW50IHNlZzsKKwlpb19mbl90IGZuOworCWlvdl9mbl90IGZudjsKKworCS8qCisJICogU3VTIHNheXMgIlRoZSByZWFkdigpIGZ1bmN0aW9uICptYXkqIGZhaWwgaWYgdGhlIGlvdmNudCBhcmd1bWVudAorCSAqIHdhcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMCwgb3IgZ3JlYXRlciB0aGFuIHtJT1ZfTUFYfS4gIExpbnV4IGhhcworCSAqIHRyYWRpdGlvbmFsbHkgcmV0dXJuZWQgemVybyBmb3IgemVybyBzZWdtZW50cywgc28uLi4KKwkgKi8KKwlyZXQgPSAwOworCWlmIChucl9zZWdzID09IDApCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBGaXJzdCBnZXQgdGhlICJzdHJ1Y3QgaW92ZWMiIGZyb20gdXNlciBtZW1vcnkgYW5kCisJICogdmVyaWZ5IGFsbCB0aGUgcG9pbnRlcnMKKwkgKi8KKwlyZXQgPSAtRUlOVkFMOworCWlmICgobnJfc2VncyA+IFVJT19NQVhJT1YpIHx8IChucl9zZWdzIDw9IDApKQorCQlnb3RvIG91dDsKKwlpZiAoIWZpbGUtPmZfb3ApCisJCWdvdG8gb3V0OworCWlmIChucl9zZWdzID4gVUlPX0ZBU1RJT1YpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJaW92ID0ga21hbGxvYyhucl9zZWdzKnNpemVvZihzdHJ1Y3QgaW92ZWMpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFpb3YpCisJCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gLUVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIoaW92LCB1dmVjdG9yLCBucl9zZWdzKnNpemVvZigqdXZlY3RvcikpKQorCQlnb3RvIG91dDsKKworCS8qCisJICogU2luZ2xlIHVuaXggc3BlY2lmaWNhdGlvbjoKKwkgKiBXZSBzaG91bGQgLUVJTlZBTCBpZiBhbiBlbGVtZW50IGxlbmd0aCBpcyBub3QgPj0gMCBhbmQgZml0dGluZyBhbgorCSAqIHNzaXplX3QuICBUaGUgdG90YWwgbGVuZ3RoIGlzIGZpdHRpbmcgYW4gc3NpemVfdAorCSAqCisJICogQmUgY2FyZWZ1bCBoZXJlIGJlY2F1c2UgaW92X2xlbiBpcyBhIHNpemVfdCBub3QgYW4gc3NpemVfdAorCSAqLworCXRvdF9sZW4gPSAwOworCXJldCA9IC1FSU5WQUw7CisJZm9yIChzZWcgPSAwOyBzZWcgPCBucl9zZWdzOyBzZWcrKykgeworCQl2b2lkIF9fdXNlciAqYnVmID0gaW92W3NlZ10uaW92X2Jhc2U7CisJCXNzaXplX3QgbGVuID0gKHNzaXplX3QpaW92W3NlZ10uaW92X2xlbjsKKworCQlpZiAodW5saWtlbHkoIWFjY2Vzc19vayh2cmZ5X2Rpcih0eXBlKSwgYnVmLCBsZW4pKSkKKwkJCWdvdG8gRWZhdWx0OworCQlpZiAobGVuIDwgMCkJLyogc2l6ZV90IG5vdCBmaXR0aW5nIGFuIHNzaXplX3QgLi4gKi8KKwkJCWdvdG8gb3V0OworCQl0b3RfbGVuICs9IGxlbjsKKwkJaWYgKChzc2l6ZV90KXRvdF9sZW4gPCAwKSAvKiBtYXRocyBvdmVyZmxvdyBvbiB0aGUgc3NpemVfdCAqLworCQkJZ290byBvdXQ7CisJfQorCWlmICh0b3RfbGVuID09IDApIHsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gcndfdmVyaWZ5X2FyZWEodHlwZSwgZmlsZSwgcG9zLCB0b3RfbGVuKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWZudiA9IE5VTEw7CisJaWYgKHR5cGUgPT0gUkVBRCkgeworCQlmbiA9IGZpbGUtPmZfb3AtPnJlYWQ7CisJCWZudiA9IGZpbGUtPmZfb3AtPnJlYWR2OworCX0gZWxzZSB7CisJCWZuID0gKGlvX2ZuX3QpZmlsZS0+Zl9vcC0+d3JpdGU7CisJCWZudiA9IGZpbGUtPmZfb3AtPndyaXRldjsKKwl9CisJaWYgKGZudikgeworCQlyZXQgPSBmbnYoZmlsZSwgaW92LCBucl9zZWdzLCBwb3MpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBEbyBpdCBieSBoYW5kLCB3aXRoIGZpbGUtb3BzICovCisJcmV0ID0gMDsKKwl2ZWN0b3IgPSBpb3Y7CisJd2hpbGUgKG5yX3NlZ3MgPiAwKSB7CisJCXZvaWQgX191c2VyICogYmFzZTsKKwkJc2l6ZV90IGxlbjsKKwkJc3NpemVfdCBucjsKKworCQliYXNlID0gdmVjdG9yLT5pb3ZfYmFzZTsKKwkJbGVuID0gdmVjdG9yLT5pb3ZfbGVuOworCQl2ZWN0b3IrKzsKKwkJbnJfc2Vncy0tOworCisJCW5yID0gZm4oZmlsZSwgYmFzZSwgbGVuLCBwb3MpOworCisJCWlmIChuciA8IDApIHsKKwkJCWlmICghcmV0KSByZXQgPSBucjsKKwkJCWJyZWFrOworCQl9CisJCXJldCArPSBucjsKKwkJaWYgKG5yICE9IGxlbikKKwkJCWJyZWFrOworCX0KK291dDoKKwlpZiAoaW92ICE9IGlvdnN0YWNrKQorCQlrZnJlZShpb3YpOworCWlmICgocmV0ICsgKHR5cGUgPT0gUkVBRCkpID4gMCkKKwkJZG5vdGlmeV9wYXJlbnQoZmlsZS0+Zl9kZW50cnksCisJCQkJKHR5cGUgPT0gUkVBRCkgPyBETl9BQ0NFU1MgOiBETl9NT0RJRlkpOworCXJldHVybiByZXQ7CitFZmF1bHQ6CisJcmV0ID0gLUVGQVVMVDsKKwlnb3RvIG91dDsKK30KKworc3NpemVfdCB2ZnNfcmVhZHYoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IHN0cnVjdCBpb3ZlYyBfX3VzZXIgKnZlYywKKwkJICB1bnNpZ25lZCBsb25nIHZsZW4sIGxvZmZfdCAqcG9zKQoreworCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQlyZXR1cm4gLUVCQURGOworCWlmICghZmlsZS0+Zl9vcCB8fCAoIWZpbGUtPmZfb3AtPnJlYWR2ICYmICFmaWxlLT5mX29wLT5yZWFkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gZG9fcmVhZHZfd3JpdGV2KFJFQUQsIGZpbGUsIHZlYywgdmxlbiwgcG9zKTsKK30KKworRVhQT1JUX1NZTUJPTCh2ZnNfcmVhZHYpOworCitzc2l6ZV90IHZmc193cml0ZXYoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IHN0cnVjdCBpb3ZlYyBfX3VzZXIgKnZlYywKKwkJICAgdW5zaWduZWQgbG9uZyB2bGVuLCBsb2ZmX3QgKnBvcykKK3sKKwlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCXJldHVybiAtRUJBREY7CisJaWYgKCFmaWxlLT5mX29wIHx8ICghZmlsZS0+Zl9vcC0+d3JpdGV2ICYmICFmaWxlLT5mX29wLT53cml0ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGRvX3JlYWR2X3dyaXRldihXUklURSwgZmlsZSwgdmVjLCB2bGVuLCBwb3MpOworfQorCitFWFBPUlRfU1lNQk9MKHZmc193cml0ZXYpOworCithc21saW5rYWdlIHNzaXplX3QKK3N5c19yZWFkdih1bnNpZ25lZCBsb25nIGZkLCBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICp2ZWMsIHVuc2lnbmVkIGxvbmcgdmxlbikKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzc2l6ZV90IHJldCA9IC1FQkFERjsKKwlpbnQgZnB1dF9uZWVkZWQ7CisKKwlmaWxlID0gZmdldF9saWdodChmZCwgJmZwdXRfbmVlZGVkKTsKKwlpZiAoZmlsZSkgeworCQlsb2ZmX3QgcG9zID0gZmlsZV9wb3NfcmVhZChmaWxlKTsKKwkJcmV0ID0gdmZzX3JlYWR2KGZpbGUsIHZlYywgdmxlbiwgJnBvcyk7CisJCWZpbGVfcG9zX3dyaXRlKGZpbGUsIHBvcyk7CisJCWZwdXRfbGlnaHQoZmlsZSwgZnB1dF9uZWVkZWQpOworCX0KKworCWlmIChyZXQgPiAwKQorCQljdXJyZW50LT5yY2hhciArPSByZXQ7CisJY3VycmVudC0+c3lzY3IrKzsKKwlyZXR1cm4gcmV0OworfQorCithc21saW5rYWdlIHNzaXplX3QKK3N5c193cml0ZXYodW5zaWduZWQgbG9uZyBmZCwgY29uc3Qgc3RydWN0IGlvdmVjIF9fdXNlciAqdmVjLCB1bnNpZ25lZCBsb25nIHZsZW4pCit7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJc3NpemVfdCByZXQgPSAtRUJBREY7CisJaW50IGZwdXRfbmVlZGVkOworCisJZmlsZSA9IGZnZXRfbGlnaHQoZmQsICZmcHV0X25lZWRlZCk7CisJaWYgKGZpbGUpIHsKKwkJbG9mZl90IHBvcyA9IGZpbGVfcG9zX3JlYWQoZmlsZSk7CisJCXJldCA9IHZmc193cml0ZXYoZmlsZSwgdmVjLCB2bGVuLCAmcG9zKTsKKwkJZmlsZV9wb3Nfd3JpdGUoZmlsZSwgcG9zKTsKKwkJZnB1dF9saWdodChmaWxlLCBmcHV0X25lZWRlZCk7CisJfQorCisJaWYgKHJldCA+IDApCisJCWN1cnJlbnQtPndjaGFyICs9IHJldDsKKwljdXJyZW50LT5zeXNjdysrOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRvX3NlbmRmaWxlKGludCBvdXRfZmQsIGludCBpbl9mZCwgbG9mZl90ICpwcG9zLAorCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgbWF4KQoreworCXN0cnVjdCBmaWxlICogaW5fZmlsZSwgKiBvdXRfZmlsZTsKKwlzdHJ1Y3QgaW5vZGUgKiBpbl9pbm9kZSwgKiBvdXRfaW5vZGU7CisJbG9mZl90IHBvczsKKwlzc2l6ZV90IHJldHZhbDsKKwlpbnQgZnB1dF9uZWVkZWRfaW4sIGZwdXRfbmVlZGVkX291dDsKKworCS8qCisJICogR2V0IGlucHV0IGZpbGUsIGFuZCB2ZXJpZnkgdGhhdCBpdCBpcyBvay4uCisJICovCisJcmV0dmFsID0gLUVCQURGOworCWluX2ZpbGUgPSBmZ2V0X2xpZ2h0KGluX2ZkLCAmZnB1dF9uZWVkZWRfaW4pOworCWlmICghaW5fZmlsZSkKKwkJZ290byBvdXQ7CisJaWYgKCEoaW5fZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCWdvdG8gZnB1dF9pbjsKKwlyZXR2YWwgPSAtRUlOVkFMOworCWluX2lub2RlID0gaW5fZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJaWYgKCFpbl9pbm9kZSkKKwkJZ290byBmcHV0X2luOworCWlmICghaW5fZmlsZS0+Zl9vcCB8fCAhaW5fZmlsZS0+Zl9vcC0+c2VuZGZpbGUpCisJCWdvdG8gZnB1dF9pbjsKKwlyZXR2YWwgPSAtRVNQSVBFOworCWlmICghcHBvcykKKwkJcHBvcyA9ICZpbl9maWxlLT5mX3BvczsKKwllbHNlCisJCWlmICghKGluX2ZpbGUtPmZfbW9kZSAmIEZNT0RFX1BSRUFEKSkKKwkJCWdvdG8gZnB1dF9pbjsKKwlyZXR2YWwgPSByd192ZXJpZnlfYXJlYShSRUFELCBpbl9maWxlLCBwcG9zLCBjb3VudCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBmcHV0X2luOworCisJcmV0dmFsID0gc2VjdXJpdHlfZmlsZV9wZXJtaXNzaW9uIChpbl9maWxlLCBNQVlfUkVBRCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBmcHV0X2luOworCisJLyoKKwkgKiBHZXQgb3V0cHV0IGZpbGUsIGFuZCB2ZXJpZnkgdGhhdCBpdCBpcyBvay4uCisJICovCisJcmV0dmFsID0gLUVCQURGOworCW91dF9maWxlID0gZmdldF9saWdodChvdXRfZmQsICZmcHV0X25lZWRlZF9vdXQpOworCWlmICghb3V0X2ZpbGUpCisJCWdvdG8gZnB1dF9pbjsKKwlpZiAoIShvdXRfZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQlnb3RvIGZwdXRfb3V0OworCXJldHZhbCA9IC1FSU5WQUw7CisJaWYgKCFvdXRfZmlsZS0+Zl9vcCB8fCAhb3V0X2ZpbGUtPmZfb3AtPnNlbmRwYWdlKQorCQlnb3RvIGZwdXRfb3V0OworCW91dF9pbm9kZSA9IG91dF9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlyZXR2YWwgPSByd192ZXJpZnlfYXJlYShXUklURSwgb3V0X2ZpbGUsICZvdXRfZmlsZS0+Zl9wb3MsIGNvdW50KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGZwdXRfb3V0OworCisJcmV0dmFsID0gc2VjdXJpdHlfZmlsZV9wZXJtaXNzaW9uIChvdXRfZmlsZSwgTUFZX1dSSVRFKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGZwdXRfb3V0OworCisJaWYgKCFtYXgpCisJCW1heCA9IG1pbihpbl9pbm9kZS0+aV9zYi0+c19tYXhieXRlcywgb3V0X2lub2RlLT5pX3NiLT5zX21heGJ5dGVzKTsKKworCXBvcyA9ICpwcG9zOworCXJldHZhbCA9IC1FSU5WQUw7CisJaWYgKHVubGlrZWx5KHBvcyA8IDApKQorCQlnb3RvIGZwdXRfb3V0OworCWlmICh1bmxpa2VseShwb3MgKyBjb3VudCA+IG1heCkpIHsKKwkJcmV0dmFsID0gLUVPVkVSRkxPVzsKKwkJaWYgKHBvcyA+PSBtYXgpCisJCQlnb3RvIGZwdXRfb3V0OworCQljb3VudCA9IG1heCAtIHBvczsKKwl9CisKKwlyZXR2YWwgPSBpbl9maWxlLT5mX29wLT5zZW5kZmlsZShpbl9maWxlLCBwcG9zLCBjb3VudCwgZmlsZV9zZW5kX2FjdG9yLCBvdXRfZmlsZSk7CisKKwlpZiAocmV0dmFsID4gMCkgeworCQljdXJyZW50LT5yY2hhciArPSByZXR2YWw7CisJCWN1cnJlbnQtPndjaGFyICs9IHJldHZhbDsKKwl9CisJY3VycmVudC0+c3lzY3IrKzsKKwljdXJyZW50LT5zeXNjdysrOworCisJaWYgKCpwcG9zID4gbWF4KQorCQlyZXR2YWwgPSAtRU9WRVJGTE9XOworCitmcHV0X291dDoKKwlmcHV0X2xpZ2h0KG91dF9maWxlLCBmcHV0X25lZWRlZF9vdXQpOworZnB1dF9pbjoKKwlmcHV0X2xpZ2h0KGluX2ZpbGUsIGZwdXRfbmVlZGVkX2luKTsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCithc21saW5rYWdlIHNzaXplX3Qgc3lzX3NlbmRmaWxlKGludCBvdXRfZmQsIGludCBpbl9mZCwgb2ZmX3QgX191c2VyICpvZmZzZXQsIHNpemVfdCBjb3VudCkKK3sKKwlsb2ZmX3QgcG9zOworCW9mZl90IG9mZjsKKwlzc2l6ZV90IHJldDsKKworCWlmIChvZmZzZXQpIHsKKwkJaWYgKHVubGlrZWx5KGdldF91c2VyKG9mZiwgb2Zmc2V0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcG9zID0gb2ZmOworCQlyZXQgPSBkb19zZW5kZmlsZShvdXRfZmQsIGluX2ZkLCAmcG9zLCBjb3VudCwgTUFYX05PTl9MRlMpOworCQlpZiAodW5saWtlbHkocHV0X3VzZXIocG9zLCBvZmZzZXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBkb19zZW5kZmlsZShvdXRfZmQsIGluX2ZkLCBOVUxMLCBjb3VudCwgMCk7Cit9CisKK2FzbWxpbmthZ2Ugc3NpemVfdCBzeXNfc2VuZGZpbGU2NChpbnQgb3V0X2ZkLCBpbnQgaW5fZmQsIGxvZmZfdCBfX3VzZXIgKm9mZnNldCwgc2l6ZV90IGNvdW50KQoreworCWxvZmZfdCBwb3M7CisJc3NpemVfdCByZXQ7CisKKwlpZiAob2Zmc2V0KSB7CisJCWlmICh1bmxpa2VseShjb3B5X2Zyb21fdXNlcigmcG9zLCBvZmZzZXQsIHNpemVvZihsb2ZmX3QpKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0ID0gZG9fc2VuZGZpbGUob3V0X2ZkLCBpbl9mZCwgJnBvcywgY291bnQsIDApOworCQlpZiAodW5saWtlbHkocHV0X3VzZXIocG9zLCBvZmZzZXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBkb19zZW5kZmlsZShvdXRfZmQsIGluX2ZkLCBOVUxMLCBjb3VudCwgMCk7Cit9CmRpZmYgLS1naXQgYS9mcy9yZWFkZGlyLmMgYi9mcy9yZWFkZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzNTc5YgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlYWRkaXIuYwpAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqICBsaW51eC9mcy9yZWFkZGlyLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1ICBMaW51cyBUb3J2YWxkcworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RpcmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK2ludCB2ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgZmlsbGRpcl90IGZpbGxlciwgdm9pZCAqYnVmKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgcmVzID0gLUVOT1RESVI7CisJaWYgKCFmaWxlLT5mX29wIHx8ICFmaWxlLT5mX29wLT5yZWFkZGlyKQorCQlnb3RvIG91dDsKKworCXJlcyA9IHNlY3VyaXR5X2ZpbGVfcGVybWlzc2lvbihmaWxlLCBNQVlfUkVBRCk7CisJaWYgKHJlcykKKwkJZ290byBvdXQ7CisKKwlkb3duKCZpbm9kZS0+aV9zZW0pOworCXJlcyA9IC1FTk9FTlQ7CisJaWYgKCFJU19ERUFERElSKGlub2RlKSkgeworCQlyZXMgPSBmaWxlLT5mX29wLT5yZWFkZGlyKGZpbGUsIGJ1ZiwgZmlsbGVyKTsKKwkJZmlsZV9hY2Nlc3NlZChmaWxlKTsKKwl9CisJdXAoJmlub2RlLT5pX3NlbSk7CitvdXQ6CisJcmV0dXJuIHJlczsKK30KKworRVhQT1JUX1NZTUJPTCh2ZnNfcmVhZGRpcik7CisKKy8qCisgKiBUcmFkaXRpb25hbCBsaW51eCByZWFkZGlyKCkgaGFuZGxpbmcuLgorICoKKyAqICJjb3VudD0xIiBpcyBhIHNwZWNpYWwgY2FzZSwgbWVhbmluZyB0aGF0IHRoZSBidWZmZXIgaXMgb25lCisgKiBkaXJlbnQtc3RydWN0dXJlIGluIHNpemUgYW5kIHRoYXQgdGhlIGNvZGUgY2FuJ3QgaGFuZGxlIG1vcmUKKyAqIGFueXdheS4gVGh1cyB0aGUgc3BlY2lhbCAiZmlsbG9uZWRpcigpIiBmdW5jdGlvbiBmb3IgdGhhdAorICogY2FzZSAodGhlIGxvdy1sZXZlbCBoYW5kbGVycyBkb24ndCBuZWVkIHRvIGNhcmUgYWJvdXQgdGhpcykuCisgKi8KKyNkZWZpbmUgTkFNRV9PRkZTRVQoZGUpICgoaW50KSAoKGRlKS0+ZF9uYW1lIC0gKGNoYXIgX191c2VyICopIChkZSkpKQorI2RlZmluZSBST1VORF9VUCh4KSAoKCh4KStzaXplb2YobG9uZyktMSkgJiB+KHNpemVvZihsb25nKS0xKSkKKworI2lmZGVmIF9fQVJDSF9XQU5UX09MRF9SRUFERElSCisKK3N0cnVjdCBvbGRfbGludXhfZGlyZW50IHsKKwl1bnNpZ25lZCBsb25nCWRfaW5vOworCXVuc2lnbmVkIGxvbmcJZF9vZmZzZXQ7CisJdW5zaWduZWQgc2hvcnQJZF9uYW1sZW47CisJY2hhcgkJZF9uYW1lWzFdOworfTsKKworc3RydWN0IHJlYWRkaXJfY2FsbGJhY2sgeworCXN0cnVjdCBvbGRfbGludXhfZGlyZW50IF9fdXNlciAqIGRpcmVudDsKKwlpbnQgcmVzdWx0OworfTsKKworc3RhdGljIGludCBmaWxsb25lZGlyKHZvaWQgKiBfX2J1ZiwgY29uc3QgY2hhciAqIG5hbWUsIGludCBuYW1sZW4sIGxvZmZfdCBvZmZzZXQsCisJCSAgICAgIGlub190IGlubywgdW5zaWduZWQgaW50IGRfdHlwZSkKK3sKKwlzdHJ1Y3QgcmVhZGRpcl9jYWxsYmFjayAqIGJ1ZiA9IChzdHJ1Y3QgcmVhZGRpcl9jYWxsYmFjayAqKSBfX2J1ZjsKKwlzdHJ1Y3Qgb2xkX2xpbnV4X2RpcmVudCBfX3VzZXIgKiBkaXJlbnQ7CisKKwlpZiAoYnVmLT5yZXN1bHQpCisJCXJldHVybiAtRUlOVkFMOworCWJ1Zi0+cmVzdWx0Kys7CisJZGlyZW50ID0gYnVmLT5kaXJlbnQ7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkaXJlbnQsCisJCQkodW5zaWduZWQgbG9uZykoZGlyZW50LT5kX25hbWUgKyBuYW1sZW4gKyAxKSAtCisJCQkJKHVuc2lnbmVkIGxvbmcpZGlyZW50KSkKKwkJZ290byBlZmF1bHQ7CisJaWYgKAlfX3B1dF91c2VyKGlubywgJmRpcmVudC0+ZF9pbm8pIHx8CisJCV9fcHV0X3VzZXIob2Zmc2V0LCAmZGlyZW50LT5kX29mZnNldCkgfHwKKwkJX19wdXRfdXNlcihuYW1sZW4sICZkaXJlbnQtPmRfbmFtbGVuKSB8fAorCQlfX2NvcHlfdG9fdXNlcihkaXJlbnQtPmRfbmFtZSwgbmFtZSwgbmFtbGVuKSB8fAorCQlfX3B1dF91c2VyKDAsIGRpcmVudC0+ZF9uYW1lICsgbmFtbGVuKSkKKwkJZ290byBlZmF1bHQ7CisJcmV0dXJuIDA7CitlZmF1bHQ6CisJYnVmLT5yZXN1bHQgPSAtRUZBVUxUOworCXJldHVybiAtRUZBVUxUOworfQorCithc21saW5rYWdlIGxvbmcgb2xkX3JlYWRkaXIodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3Qgb2xkX2xpbnV4X2RpcmVudCBfX3VzZXIgKiBkaXJlbnQsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IGZpbGUgKiBmaWxlOworCXN0cnVjdCByZWFkZGlyX2NhbGxiYWNrIGJ1ZjsKKworCWVycm9yID0gLUVCQURGOworCWZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gb3V0OworCisJYnVmLnJlc3VsdCA9IDA7CisJYnVmLmRpcmVudCA9IGRpcmVudDsKKworCWVycm9yID0gdmZzX3JlYWRkaXIoZmlsZSwgZmlsbG9uZWRpciwgJmJ1Zik7CisJaWYgKGVycm9yID49IDApCisJCWVycm9yID0gYnVmLnJlc3VsdDsKKworCWZwdXQoZmlsZSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisjZW5kaWYgLyogX19BUkNIX1dBTlRfT0xEX1JFQURESVIgKi8KKworLyoKKyAqIE5ldywgYWxsLWltcHJvdmVkLCBzaW5naW5nLCBkYW5jaW5nLCBpQkNTMi1jb21wbGlhbnQgZ2V0ZGVudHMoKQorICogaW50ZXJmYWNlLiAKKyAqLworc3RydWN0IGxpbnV4X2RpcmVudCB7CisJdW5zaWduZWQgbG9uZwlkX2lubzsKKwl1bnNpZ25lZCBsb25nCWRfb2ZmOworCXVuc2lnbmVkIHNob3J0CWRfcmVjbGVuOworCWNoYXIJCWRfbmFtZVsxXTsKK307CisKK3N0cnVjdCBnZXRkZW50c19jYWxsYmFjayB7CisJc3RydWN0IGxpbnV4X2RpcmVudCBfX3VzZXIgKiBjdXJyZW50X2RpcjsKKwlzdHJ1Y3QgbGludXhfZGlyZW50IF9fdXNlciAqIHByZXZpb3VzOworCWludCBjb3VudDsKKwlpbnQgZXJyb3I7Cit9OworCitzdGF0aWMgaW50IGZpbGxkaXIodm9pZCAqIF9fYnVmLCBjb25zdCBjaGFyICogbmFtZSwgaW50IG5hbWxlbiwgbG9mZl90IG9mZnNldCwKKwkJICAgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQoreworCXN0cnVjdCBsaW51eF9kaXJlbnQgX191c2VyICogZGlyZW50OworCXN0cnVjdCBnZXRkZW50c19jYWxsYmFjayAqIGJ1ZiA9IChzdHJ1Y3QgZ2V0ZGVudHNfY2FsbGJhY2sgKikgX19idWY7CisJaW50IHJlY2xlbiA9IFJPVU5EX1VQKE5BTUVfT0ZGU0VUKGRpcmVudCkgKyBuYW1sZW4gKyAyKTsKKworCWJ1Zi0+ZXJyb3IgPSAtRUlOVkFMOwkvKiBvbmx5IHVzZWQgaWYgd2UgZmFpbC4uICovCisJaWYgKHJlY2xlbiA+IGJ1Zi0+Y291bnQpCisJCXJldHVybiAtRUlOVkFMOworCWRpcmVudCA9IGJ1Zi0+cHJldmlvdXM7CisJaWYgKGRpcmVudCkgeworCQlpZiAoX19wdXRfdXNlcihvZmZzZXQsICZkaXJlbnQtPmRfb2ZmKSkKKwkJCWdvdG8gZWZhdWx0OworCX0KKwlkaXJlbnQgPSBidWYtPmN1cnJlbnRfZGlyOworCWlmIChfX3B1dF91c2VyKGlubywgJmRpcmVudC0+ZF9pbm8pKQorCQlnb3RvIGVmYXVsdDsKKwlpZiAoX19wdXRfdXNlcihyZWNsZW4sICZkaXJlbnQtPmRfcmVjbGVuKSkKKwkJZ290byBlZmF1bHQ7CisJaWYgKGNvcHlfdG9fdXNlcihkaXJlbnQtPmRfbmFtZSwgbmFtZSwgbmFtbGVuKSkKKwkJZ290byBlZmF1bHQ7CisJaWYgKF9fcHV0X3VzZXIoMCwgZGlyZW50LT5kX25hbWUgKyBuYW1sZW4pKQorCQlnb3RvIGVmYXVsdDsKKwlpZiAoX19wdXRfdXNlcihkX3R5cGUsIChjaGFyIF9fdXNlciAqKSBkaXJlbnQgKyByZWNsZW4gLSAxKSkKKwkJZ290byBlZmF1bHQ7CisJYnVmLT5wcmV2aW91cyA9IGRpcmVudDsKKwlkaXJlbnQgPSAodm9pZCBfX3VzZXIgKilkaXJlbnQgKyByZWNsZW47CisJYnVmLT5jdXJyZW50X2RpciA9IGRpcmVudDsKKwlidWYtPmNvdW50IC09IHJlY2xlbjsKKwlyZXR1cm4gMDsKK2VmYXVsdDoKKwlidWYtPmVycm9yID0gLUVGQVVMVDsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19nZXRkZW50cyh1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBsaW51eF9kaXJlbnQgX191c2VyICogZGlyZW50LCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IGZpbGUgKiBmaWxlOworCXN0cnVjdCBsaW51eF9kaXJlbnQgX191c2VyICogbGFzdGRpcmVudDsKKwlzdHJ1Y3QgZ2V0ZGVudHNfY2FsbGJhY2sgYnVmOworCWludCBlcnJvcjsKKworCWVycm9yID0gLUVGQVVMVDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRpcmVudCwgY291bnQpKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gLUVCQURGOworCWZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gb3V0OworCisJYnVmLmN1cnJlbnRfZGlyID0gZGlyZW50OworCWJ1Zi5wcmV2aW91cyA9IE5VTEw7CisJYnVmLmNvdW50ID0gY291bnQ7CisJYnVmLmVycm9yID0gMDsKKworCWVycm9yID0gdmZzX3JlYWRkaXIoZmlsZSwgZmlsbGRpciwgJmJ1Zik7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXRfcHV0ZjsKKwllcnJvciA9IGJ1Zi5lcnJvcjsKKwlsYXN0ZGlyZW50ID0gYnVmLnByZXZpb3VzOworCWlmIChsYXN0ZGlyZW50KSB7CisJCWlmIChwdXRfdXNlcihmaWxlLT5mX3BvcywgJmxhc3RkaXJlbnQtPmRfb2ZmKSkKKwkJCWVycm9yID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJZXJyb3IgPSBjb3VudCAtIGJ1Zi5jb3VudDsKKwl9CisKK291dF9wdXRmOgorCWZwdXQoZmlsZSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisjZGVmaW5lIFJPVU5EX1VQNjQoeCkgKCgoeCkrc2l6ZW9mKHU2NCktMSkgJiB+KHNpemVvZih1NjQpLTEpKQorCitzdHJ1Y3QgZ2V0ZGVudHNfY2FsbGJhY2s2NCB7CisJc3RydWN0IGxpbnV4X2RpcmVudDY0IF9fdXNlciAqIGN1cnJlbnRfZGlyOworCXN0cnVjdCBsaW51eF9kaXJlbnQ2NCBfX3VzZXIgKiBwcmV2aW91czsKKwlpbnQgY291bnQ7CisJaW50IGVycm9yOworfTsKKworc3RhdGljIGludCBmaWxsZGlyNjQodm9pZCAqIF9fYnVmLCBjb25zdCBjaGFyICogbmFtZSwgaW50IG5hbWxlbiwgbG9mZl90IG9mZnNldCwKKwkJICAgICBpbm9fdCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCit7CisJc3RydWN0IGxpbnV4X2RpcmVudDY0IF9fdXNlciAqZGlyZW50OworCXN0cnVjdCBnZXRkZW50c19jYWxsYmFjazY0ICogYnVmID0gKHN0cnVjdCBnZXRkZW50c19jYWxsYmFjazY0ICopIF9fYnVmOworCWludCByZWNsZW4gPSBST1VORF9VUDY0KE5BTUVfT0ZGU0VUKGRpcmVudCkgKyBuYW1sZW4gKyAxKTsKKworCWJ1Zi0+ZXJyb3IgPSAtRUlOVkFMOwkvKiBvbmx5IHVzZWQgaWYgd2UgZmFpbC4uICovCisJaWYgKHJlY2xlbiA+IGJ1Zi0+Y291bnQpCisJCXJldHVybiAtRUlOVkFMOworCWRpcmVudCA9IGJ1Zi0+cHJldmlvdXM7CisJaWYgKGRpcmVudCkgeworCQlpZiAoX19wdXRfdXNlcihvZmZzZXQsICZkaXJlbnQtPmRfb2ZmKSkKKwkJCWdvdG8gZWZhdWx0OworCX0KKwlkaXJlbnQgPSBidWYtPmN1cnJlbnRfZGlyOworCWlmIChfX3B1dF91c2VyKGlubywgJmRpcmVudC0+ZF9pbm8pKQorCQlnb3RvIGVmYXVsdDsKKwlpZiAoX19wdXRfdXNlcigwLCAmZGlyZW50LT5kX29mZikpCisJCWdvdG8gZWZhdWx0OworCWlmIChfX3B1dF91c2VyKHJlY2xlbiwgJmRpcmVudC0+ZF9yZWNsZW4pKQorCQlnb3RvIGVmYXVsdDsKKwlpZiAoX19wdXRfdXNlcihkX3R5cGUsICZkaXJlbnQtPmRfdHlwZSkpCisJCWdvdG8gZWZhdWx0OworCWlmIChjb3B5X3RvX3VzZXIoZGlyZW50LT5kX25hbWUsIG5hbWUsIG5hbWxlbikpCisJCWdvdG8gZWZhdWx0OworCWlmIChfX3B1dF91c2VyKDAsIGRpcmVudC0+ZF9uYW1lICsgbmFtbGVuKSkKKwkJZ290byBlZmF1bHQ7CisJYnVmLT5wcmV2aW91cyA9IGRpcmVudDsKKwlkaXJlbnQgPSAodm9pZCBfX3VzZXIgKilkaXJlbnQgKyByZWNsZW47CisJYnVmLT5jdXJyZW50X2RpciA9IGRpcmVudDsKKwlidWYtPmNvdW50IC09IHJlY2xlbjsKKwlyZXR1cm4gMDsKK2VmYXVsdDoKKwlidWYtPmVycm9yID0gLUVGQVVMVDsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19nZXRkZW50czY0KHVuc2lnbmVkIGludCBmZCwgc3RydWN0IGxpbnV4X2RpcmVudDY0IF9fdXNlciAqIGRpcmVudCwgdW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCBmaWxlICogZmlsZTsKKwlzdHJ1Y3QgbGludXhfZGlyZW50NjQgX191c2VyICogbGFzdGRpcmVudDsKKwlzdHJ1Y3QgZ2V0ZGVudHNfY2FsbGJhY2s2NCBidWY7CisJaW50IGVycm9yOworCisJZXJyb3IgPSAtRUZBVUxUOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZGlyZW50LCBjb3VudCkpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSAtRUJBREY7CisJZmlsZSA9IGZnZXQoZmQpOworCWlmICghZmlsZSkKKwkJZ290byBvdXQ7CisKKwlidWYuY3VycmVudF9kaXIgPSBkaXJlbnQ7CisJYnVmLnByZXZpb3VzID0gTlVMTDsKKwlidWYuY291bnQgPSBjb3VudDsKKwlidWYuZXJyb3IgPSAwOworCisJZXJyb3IgPSB2ZnNfcmVhZGRpcihmaWxlLCBmaWxsZGlyNjQsICZidWYpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0X3B1dGY7CisJZXJyb3IgPSBidWYuZXJyb3I7CisJbGFzdGRpcmVudCA9IGJ1Zi5wcmV2aW91czsKKwlpZiAobGFzdGRpcmVudCkgeworCQl0eXBlb2YobGFzdGRpcmVudC0+ZF9vZmYpIGRfb2ZmID0gZmlsZS0+Zl9wb3M7CisJCWVycm9yID0gLUVGQVVMVDsKKwkJaWYgKF9fcHV0X3VzZXIoZF9vZmYsICZsYXN0ZGlyZW50LT5kX29mZikpCisJCQlnb3RvIG91dF9wdXRmOworCQllcnJvciA9IGNvdW50IC0gYnVmLmNvdW50OworCX0KKworb3V0X3B1dGY6CisJZnB1dChmaWxlKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9NYWtlZmlsZSBiL2ZzL3JlaXNlcmZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNTkzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDM2IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggcmVpc2VyLWZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19SRUlTRVJGU19GUykgKz0gcmVpc2VyZnMubworCityZWlzZXJmcy1vYmpzIDo9IGJpdG1hcC5vIGRvX2JhbGFuLm8gbmFtZWkubyBpbm9kZS5vIGZpbGUubyBkaXIubyBmaXhfbm9kZS5vIFwKKwkJIHN1cGVyLm8gcHJpbnRzLm8gb2JqZWN0aWQubyBsYmFsYW5jZS5vIGliYWxhbmNlLm8gc3RyZWUubyBcCisJCSBoYXNoZXMubyB0YWlsX2NvbnZlcnNpb24ubyBqb3VybmFsLm8gcmVzaXplLm8gXAorCQkgaXRlbV9vcHMubyBpb2N0bC5vIHByb2Nmcy5vCisKK2lmZXEgKCQoQ09ORklHX1JFSVNFUkZTX0ZTX1hBVFRSKSx5KQorcmVpc2VyZnMtb2JqcyArPSB4YXR0ci5vIHhhdHRyX3VzZXIubyB4YXR0cl90cnVzdGVkLm8KK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX1JFSVNFUkZTX0ZTX1NFQ1VSSVRZKSx5KQorcmVpc2VyZnMtb2JqcyArPSB4YXR0cl9zZWN1cml0eS5vCitlbmRpZgorCitpZmVxICgkKENPTkZJR19SRUlTRVJGU19GU19QT1NJWF9BQ0wpLHkpCityZWlzZXJmcy1vYmpzICs9IHhhdHRyX2FjbC5vCitlbmRpZgorCisjIGdjYyAtTzIgKHRoZSBrZXJuZWwgZGVmYXVsdCkgIGlzIG92ZXJhZ2dyZXNzaXZlIG9uIHBwYzMyIHdoZW4gbWFueSBpbmxpbmUKKyMgZnVuY3Rpb25zIGFyZSB1c2VkLiAgVGhpcyBjYXVzZXMgdGhlIGNvbXBpbGVyIHRvIGFkdmFuY2UgdGhlIHN0YWNrCisjIHBvaW50ZXIgb3V0IG9mIHRoZSBhdmFpbGFibGUgc3RhY2sgc3BhY2UsIGNvcnJ1cHRpbmcga2VybmVsIHNwYWNlLAorIyBhbmQgY2F1c2luZyBhIHBhbmljLiBTaW5jZSB0aGlzIGJlaGF2aW9yIG9ubHkgYWZmZWN0cyBwcGMzMiwgdGhpcyBpZmVxCisjIHdpbGwgd29yayBhcm91bmQgaXQuIElmIGFueSBvdGhlciBhcmNoaXRlY3R1cmUgZGlzcGxheXMgdGhpcyBiZWhhdmlvciwKKyMgYWRkIGl0IGhlcmUuCitpZmVxICgkKENPTkZJR19QUEMzMikseSkKK0VYVFJBX0NGTEFHUyA6PSAtTzEKK2VuZGlmCisKK1RBR1M6CisJZXRhZ3MgKi5jCisKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL1JFQURNRSBiL2ZzL3JlaXNlcmZzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGUxNjcwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcmVpc2VyZnMvUkVBRE1FCkBAIC0wLDAgKzEsMTYxIEBACitbTElDRU5TSU5HXSAKKworUmVpc2VyRlMgaXMgaGVyZWJ5IGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgorCitTb3VyY2UgY29kZSBmaWxlcyB0aGF0IGNvbnRhaW4gdGhlIHBocmFzZSAibGljZW5zaW5nIGdvdmVybmVkIGJ5CityZWlzZXJmcy9SRUFETUUiIGFyZSAiZ292ZXJuZWQgZmlsZXMiIHRocm91Z2hvdXQgdGhpcyBmaWxlLiAgR292ZXJuZWQKK2ZpbGVzIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLiAgVGhlIHBvcnRpb25zIG9mIHRoZW0gb3duZWQgYnkgSGFucworUmVpc2VyLCBvciBhdXRob3JpemVkIHRvIGJlIGxpY2Vuc2VkIGJ5IGhpbSwgaGF2ZSBiZWVuIGluIHRoZSBwYXN0LAorYW5kIGxpa2VseSB3aWxsIGJlIGluIHRoZSBmdXR1cmUsIGxpY2Vuc2VkIHRvIG90aGVyIHBhcnRpZXMgdW5kZXIKK290aGVyIGxpY2Vuc2VzLiAgSWYgeW91IGFkZCB5b3VyIGNvZGUgdG8gZ292ZXJuZWQgZmlsZXMsIGFuZCBkb24ndAord2FudCBpdCB0byBiZSBvd25lZCBieSBIYW5zIFJlaXNlciwgcHV0IHlvdXIgY29weXJpZ2h0IGxhYmVsIG9uIHRoYXQKK2NvZGUgc28gdGhlIHBvb3IgYmxpZ2h0IGFuZCBoaXMgY3VzdG9tZXJzIGNhbiBrZWVwIHRoaW5ncyBzdHJhaWdodC4KK0FsbCBwb3J0aW9ucyBvZiBnb3Zlcm5lZCBmaWxlcyBub3QgbGFiZWxlZCBvdGhlcndpc2UgYXJlIG93bmVkIGJ5IEhhbnMKK1JlaXNlciwgYW5kIGJ5IGFkZGluZyB5b3VyIGNvZGUgdG8gaXQsIHdpZGVseSBkaXN0cmlidXRpbmcgaXQgdG8KK290aGVycyBvciBzZW5kaW5nIHVzIGEgcGF0Y2gsIGFuZCBsZWF2aW5nIHRoZSBzZW50ZW5jZSBpbiBzdGF0aW5nIHRoYXQKK2xpY2Vuc2luZyBpcyBnb3Zlcm5lZCBieSB0aGUgc3RhdGVtZW50IGluIHRoaXMgZmlsZSwgeW91IGFjY2VwdCB0aGlzLgorSXQgd2lsbCBiZSBhIGtpbmRuZXNzIGlmIHlvdSBpZGVudGlmeSB3aGV0aGVyIEhhbnMgUmVpc2VyIGlzIGFsbG93ZWQKK3RvIGxpY2Vuc2UgY29kZSBsYWJlbGVkIGFzIG93bmVkIGJ5IHlvdSBvbiB5b3VyIGJlaGFsZiBvdGhlciB0aGFuCit1bmRlciB0aGUgR1BMLCBiZWNhdXNlIGhlIHdhbnRzIHRvIGtub3cgaWYgaXQgaXMgb2theSB0byBkbyBzbyBhbmQgcHV0CithIGNoZWNrIGluIHRoZSBtYWlsIHRvIHlvdSAoZm9yIG5vbi10cml2aWFsIGltcHJvdmVtZW50cykgd2hlbiBoZQorbWFrZXMgaGlzIG5leHQgc2FsZS4gIEhlIG1ha2VzIG5vIGd1YXJhbnRlZXMgYXMgdG8gdGhlIGFtb3VudCBpZiBhbnksCit0aG91Z2ggaGUgZmVlbHMgbW90aXZhdGVkIHRvIG1vdGl2YXRlIGNvbnRyaWJ1dG9ycywgYW5kIHlvdSBjYW4gc3VyZWx5CitkaXNjdXNzIHRoaXMgd2l0aCBoaW0gYmVmb3JlIG9yIGFmdGVyIGNvbnRyaWJ1dGluZy4gIFlvdSBoYXZlIHRoZQorcmlnaHQgdG8gZGVjbGluZSB0byBhbGxvdyBoaW0gdG8gbGljZW5zZSB5b3VyIGNvZGUgY29udHJpYnV0aW9uIG90aGVyCit0aGFuIHVuZGVyIHRoZSBHUEwuCisKK0Z1cnRoZXIgbGljZW5zaW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgY29tbWVyY2lhbCBhbmQvb3Igb3RoZXIKK2ludGVyZXN0cyBkaXJlY3RseSBmcm9tIEhhbnMgUmVpc2VyOiBoYW5zQHJlaXNlci50by4gIElmIHlvdSBpbnRlcnByZXQKK3RoZSBHUEwgYXMgbm90IGFsbG93aW5nIHRob3NlIGFkZGl0aW9uYWwgbGljZW5zaW5nIG9wdGlvbnMsIHlvdSByZWFkCitpdCB3cm9uZ2x5LCBhbmQgUmljaGFyZCBTdGFsbG1hbiBhZ3JlZXMgd2l0aCBtZSwgd2hlbiBjYXJlZnVsbHkgcmVhZAoreW91IGNhbiBzZWUgdGhhdCB0aG9zZSByZXN0cmljdGlvbnMgb24gYWRkaXRpb25hbCB0ZXJtcyBkbyBub3QgYXBwbHkKK3RvIHRoZSBvd25lciBvZiB0aGUgY29weXJpZ2h0LCBhbmQgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhpcyBzaGFsbAorZ292ZXJuIGZvciB0aGlzIGxpY2Vuc2UuICAKKworRmluYWxseSwgbm90aGluZyBpbiB0aGlzIGxpY2Vuc2Ugc2hhbGwgYmUgaW50ZXJwcmV0ZWQgdG8gYWxsb3cgeW91IHRvCitmYWlsIHRvIGZhaXJseSBjcmVkaXQgbWUsIG9yIHRvIHJlbW92ZSBteSBjcmVkaXRzLCB3aXRob3V0IG15CitwZXJtaXNzaW9uLCB1bmxlc3MgeW91IGFyZSBhbiBlbmQgdXNlciBub3QgcmVkaXN0cmlidXRpbmcgdG8gb3RoZXJzLgorSWYgeW91IGhhdmUgZG91YnRzIGFib3V0IGhvdyB0byBwcm9wZXJseSBkbyB0aGF0LCBvciBhYm91dCB3aGF0IGlzCitmYWlyLCBhc2suICAoTGFzdCBJIHNwb2tlIHdpdGggaGltIFJpY2hhcmQgd2FzIGNvbnRlbXBsYXRpbmcgaG93IGJlc3QKK3RvIGFkZHJlc3MgdGhlIGZhaXIgY3JlZGl0aW5nIGlzc3VlIGluIHRoZSBuZXh0IEdQTCB2ZXJzaW9uLikKKworW0VORCBMSUNFTlNJTkddCisKK1JlaXNlcmZzIGlzIGEgZmlsZSBzeXN0ZW0gYmFzZWQgb24gYmFsYW5jZWQgdHJlZSBhbGdvcml0aG1zLCB3aGljaCBpcworZGVzY3JpYmVkIGF0IGh0dHA6Ly9kZXZsaW51eC5jb20vbmFtZXN5cy4KKworU3RvcCByZWFkaW5nIGhlcmUuICBHbyB0aGVyZSwgdGhlbiByZXR1cm4uCisKK1NlbmQgYnVnIHJlcG9ydHMgdG8geXVyYUBuYW1lc3lzLmJvdGlrLnJ1LgorCitta3JlaXNlcmZzIGFuZCBvdGhlciB1dGlsaXRpZXMgYXJlIGluIHJlaXNlcmZzL3V0aWxzLCBvciB3aGVyZXZlciB5b3VyCitMaW51eCBwcm92aWRlciBwdXQgdGhlbS4gIFRoZXJlIGlzIHNvbWUgZGlzYWdyZWVtZW50IGFib3V0IGhvdyB1c2VmdWwKK2l0IGlzIGZvciB1c2VycyB0byBnZXQgdGhlaXIgZnNjayBhbmQgbWtyZWlzZXJmcyBvdXQgb2Ygc3luYyB3aXRoIHRoZQordmVyc2lvbiBvZiByZWlzZXJmcyB0aGF0IGlzIGluIHRoZWlyIGtlcm5lbCwgd2l0aCBtYW55IGltcG9ydGFudAorZGlzdHJpYnV0b3JzIHdhbnRpbmcgdGhlbSBvdXQgb2Ygc3luYy46LSkgUGxlYXNlIHRyeSB0byByZW1lbWJlciB0bworcmVjb21waWxlIGFuZCByZWluc3RhbGwgZnNjayBhbmQgbWtyZWlzZXJmcyB3aXRoIGV2ZXJ5IHVwZGF0ZSBvZgorcmVpc2VyZnMsIHRoaXMgaXMgYSBjb21tb24gc291cmNlIG9mIGNvbmZ1c2lvbi4gIE5vdGUgdGhhdCBzb21lIG9mIHRoZQordXRpbGl0aWVzIGNhbm5vdCBiZSBjb21waWxlZCB3aXRob3V0IGFjY2Vzc2luZyB0aGUgYmFsYW5jaW5nIGNvZGUKK3doaWNoIGlzIGluIHRoZSBrZXJuZWwgY29kZSwgYW5kIHJlbG9jYXRpbmcgdGhlIHV0aWxpdGllcyBtYXkgcmVxdWlyZQoreW91IHRvIHNwZWNpZnkgd2hlcmUgdGhhdCBjb2RlIGNhbiBiZSBmb3VuZC4KKworWWVzLCBpZiB5b3UgdXBkYXRlIHlvdXIgcmVpc2VyZnMga2VybmVsIG1vZHVsZSB5b3UgZG8gaGF2ZSB0bworcmVjb21waWxlIHlvdXIga2VybmVsLCBtb3N0IG9mIHRoZSB0aW1lLiAgVGhlIGVycm9ycyB5b3UgZ2V0IHdpbGwgYmUKK3F1aXRlIGNyeXB0aWMgaWYgeW91ciBmb3JnZXQgdG8gZG8gc28uCisKK1JlYWwgdXNlcnMsIGFzIG9wcG9zZWQgdG8gZm9sa3Mgd2hvIHdhbnQgdG8gaGFjayBhbmQgdGhlbiB1bmRlcnN0YW5kCit3aGF0IHdlbnQgd3JvbmcsIHdpbGwgd2FudCBSRUlTRVJGU19DSEVDSyBvZmYuCisKK0hpZGVvdXMgQ29tbWVyY2lhbCBQaXRjaDogU3ByZWFkIHlvdXIgZGV2ZWxvcG1lbnQgY29zdHMgYWNyb3NzIG90aGVyIE9TCit2ZW5kb3JzLiAgU2VsZWN0IGZyb20gdGhlIGJlc3QgaW4gdGhlIHdvcmxkLCBub3QgdGhlIGJlc3QgaW4geW91cgorYnVpbGRpbmcsIGJ5IGJ1eWluZyBmcm9tIHRoaXJkIHBhcnR5IE9TIGNvbXBvbmVudCBzdXBwbGllcnMuICBMZXZlcmFnZQordGhlIHNvZnR3YXJlIGNvbXBvbmVudCBkZXZlbG9wbWVudCBwb3dlciBvZiB0aGUgaW50ZXJuZXQuICBCZSB0aGUgbW9zdAorYWdncmVzc2l2ZSBpbiB0YWtpbmcgYWR2YW50YWdlIG9mIHRoZSBjb21tZXJjaWFsIHBvc3NpYmlsaXRpZXMgb2YKK2RlY2VudHJhbGl6ZWQgaW50ZXJuZXQgZGV2ZWxvcG1lbnQsIGFuZCBhZGQgdmFsdWUgdGhyb3VnaCB5b3VyIGJyYW5kZWQKK2ludGVncmF0aW9uIHRoYXQgeW91IHNlbGwgYXMgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIExldCB5b3VyIGNvbXBldGl0b3JzCitiZSB0aGUgb25lcyB0byBjb21wZXRlIGFnYWluc3QgdGhlIGVudGlyZSBpbnRlcm5ldCBieSB0aGVtc2VsdmVzLiAgQmUKK2hpcCwgZ2V0IHdpdGggdGhlIG5ldyBlY29ub21pYyB0cmVuZCwgYmVmb3JlIHlvdXIgY29tcGV0aXRvcnMgZG8uICBTZW5kCitlbWFpbCB0byBoYW5zQHJlaXNlci50by4KKworVG8gdW5kZXJzdGFuZCB0aGUgY29kZSwgYWZ0ZXIgcmVhZGluZyB0aGUgd2Vic2l0ZSwgc3RhcnQgcmVhZGluZyB0aGUKK2NvZGUgYnkgcmVhZGluZyByZWlzZXJmc19mcy5oIGZpcnN0LgorCitIYW5zIFJlaXNlciB3YXMgdGhlIHByb2plY3QgaW5pdGlhdG9yLCBwcmltYXJ5IGFyY2hpdGVjdCwgc291cmNlIG9mIGFsbAorZnVuZGluZyBmb3IgdGhlIGZpcnN0IDUuNSB5ZWFycywgYW5kIG9uZSBvZiB0aGUgcHJvZ3JhbW1lcnMuICBIZSBvd25zCit0aGUgY29weXJpZ2h0LgorCitWbGFkaW1pciBTYXZlbGpldiB3YXMgb25lIG9mIHRoZSBwcm9ncmFtbWVycywgYW5kIGhlIHdvcmtlZCBsb25nIGhvdXJzCit3cml0aW5nIHRoZSBjbGVhbmVzdCBjb2RlLiAgSGUgYWx3YXlzIG1hZGUgdGhlIGVmZm9ydCB0byBiZSB0aGUgYmVzdCBoZQorY291bGQgYmUsIGFuZCB0byBtYWtlIGhpcyBjb2RlIHRoZSBiZXN0IHRoYXQgaXQgY291bGQgYmUuICBXaGF0IHJlc3VsdGVkCit3YXMgcXVpdGUgcmVtYXJrYWJsZS4gSSBkb24ndCB0aGluayB0aGF0IG1vbmV5IGNhbiBldmVyIG1vdGl2YXRlIHNvbWVvbmUKK3RvIHdvcmsgdGhlIHdheSBoZSBkaWQsIGhlIGlzIG9uZSBvZiB0aGUgbW9zdCBzZWxmbGVzcyBtZW4gSSBrbm93LgorCitZdXJhIGhlbHBzIHdpdGggYmVuY2htYXJraW5nLCBjb2RpbmcgaGFzaGVzLCBhbmQgYmxvY2sgcHJlLWFsbG9jYXRpb24KK2NvZGUuCisKK0FuYXRvbHkgUGluY2h1ayBpcyBhIGZvcm1lciBtZW1iZXIgb2Ygb3VyIHRlYW0gd2hvIHdvcmtlZCBjbG9zZWx5IHdpdGgKK1ZsYWRpbWlyIHRocm91Z2hvdXQgdGhlIHByb2plY3QncyBkZXZlbG9wbWVudC4gIEhlIHdyb3RlIGEgcXVpdGUKK3N1YnN0YW50aWFsIHBvcnRpb24gb2YgdGhlIHRvdGFsIGNvZGUuICBIZSByZWFsaXplZCB0aGF0IHRoZXJlIHdhcyBhCitzcGFjZSBwcm9ibGVtIHdpdGggcGFja2luZyB0YWlscyBvZiBmaWxlcyBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gYSBub2RlCit0aGF0IHN0YXJ0IG9uIGEgbm9kZSBhbGlnbmVkIGJvdW5kYXJ5ICh0aGVyZSBhcmUgcmVhc29ucyB0byB3YW50IHRvIG5vZGUKK2FsaWduIGZpbGVzKSwgYW5kIGhlIGludmVudGVkIGFuZCBpbXBsZW1lbnRlZCBpbmRpcmVjdCBpdGVtcyBhbmQKK3VuZm9ybWF0dGVkIG5vZGVzIGFzIHRoZSBzb2x1dGlvbi4KKworS29uc3RhbnRpbiBTaHZhY2hrbywgd2l0aCB0aGUgaGVscCBvZiB0aGUgUnVzc2lhbiB2ZXJzaW9uIG9mIGEgVkMsCit0cmllZCB0byBwdXQgbWUgaW4gYSBwb3NpdGlvbiB3aGVyZSBJIHdhcyBmb3JjZWQgaW50byBnaXZpbmcgY29udHJvbAorb2YgdGhlIHByb2plY3QgdG8gaGltLiAgKEZvcnR1bmF0ZWx5LCBhcyB0aGUgcGVyc29uIHBheWluZyB0aGUgbW9uZXkKK2ZvciBhbGwgc2FsYXJpZXMgZnJvbSBteSBkYXlqb2IgSSBvd25lZCBhbGwgY29weXJpZ2h0cywgYW5kIHlvdSBjYW4ndAorcmVhbGx5IGZvcmNlIHRha2VvdmVycyBvZiBzb2xlIHByb3ByaWV0b3JzaGlwcy4pICBUaGlzIHdhcyBzb21ldGhpbmcKK2N1cmlvdXMsIGJlY2F1c2UgaGUgbmV2ZXIgcmVhbGx5IHVuZGVyc3Rvb2QgdGhlIHZhbHVlIG9mIG91ciBwcm9qZWN0LAord2h5IHdlIHNob3VsZCBkbyB3aGF0IHdlIGRvLCBvciB3aHkgaW5ub3ZhdGlvbiB3YXMgcG9zc2libGUgaW4KK2dlbmVyYWwsIGJ1dCBoZSB3YXMgc3VyZSB0aGF0IGhlIG91Z2h0IHRvIGJlIGNvbnRyb2xsaW5nIGl0LiAgRXZlcnkKK2lubm92YXRpb24gaGFkIHRvIGJlIGZvcmNlZCBwYXN0IGhpbSB3aGlsZSBoZSB3YXMgd2l0aCB1cy4gIEhlIGFkZGVkCit0d28geWVhcnMgdG8gdGhlIHRpbWUgcmVxdWlyZWQgdG8gY29tcGxldGUgcmVpc2VyZnMsIGFuZCB3YXMgYSBuZXQKK2xvc3MgZm9yIG1lLiAgTWlraGFpbCBHaWx1bGEgd2FzIGEgYnJpbGxpYW50IGlubm92YXRvciB3aG8gYWxzbyBsZWZ0CitpbiBhIGRlc3RydWN0aXZlIHdheSB0aGF0IGVyYXNlZCB0aGUgdmFsdWUgb2YgaGlzIGNvbnRyaWJ1dGlvbnMsIGFuZAordGhhdCBoZSB3YXMgc2hvd24gbXVjaCBnZW5lcm9zaXR5IGp1c3QgbWFrZXMgaXQgbW9yZSBwYWluZnVsLgorCitHcmlnb3J5IFphaWdyYWxpbiB3YXMgYW4gZXh0cmVtZWx5IGVmZmVjdGl2ZSBzeXN0ZW0gYWRtaW5pc3RyYXRvciBmb3IKK291ciBncm91cC4KKworSWdvciBLcmFzaGVuaW5uaWtvdiB3YXMgd29uZGVyZnVsIGF0IGhhcmR3YXJlIHByb2N1cmVtZW50LCByZXBhaXIsIGFuZAorbmV0d29yayBpbnN0YWxsYXRpb24uCisKK0plcmVteSBGaXR6aGFyZGluZ2Ugd3JvdGUgdGhlIHRlYWhhc2guYyBjb2RlLCBhbmQgaGUgZ2l2ZXMgY3JlZGl0IHRvIGEKK3RleHRib29rIGhlIGdvdCB0aGUgYWxnb3JpdGhtIGZyb20gaW4gdGhlIGNvZGUuICBOb3RlIHRoYXQgaGlzIGFuYWx5c2lzCitvZiBob3cgd2UgY291bGQgdXNlIHRoZSBoYXNoaW5nIGNvZGUgaW4gbWFraW5nIDMyIGJpdCBORlMgY29va2llcyB3b3JrCit3YXMgcHJvYmFibHkgbW9yZSBpbXBvcnRhbnQgdGhhbiB0aGUgYWN0dWFsIGFsZ29yaXRobS4gIENvbGluIFBsdW1iIGFsc28KK2NvbnRyaWJ1dGVkIHRvIGl0LgorCitDaHJpcyBNYXNvbiBkaXZlZCByaWdodCBpbnRvIG91ciBjb2RlLCBhbmQgaW4ganVzdCBhIGZldyBtb250aHMgcHJvZHVjZWQKK3RoZSBqb3VybmFsaW5nIGNvZGUgdGhhdCBkcmFtYXRpY2FsbHkgaW5jcmVhc2VkIHRoZSB2YWx1ZSBvZiBSZWlzZXJGUy4KK0hlIGlzIGp1c3QgYW4gYW1hemluZyBwcm9ncmFtbWVyLgorCitJZ29yIFphZ29yb3Zza3kgaXMgd3JpdGluZyBtdWNoIG9mIHRoZSBuZXcgaXRlbSBoYW5kbGVyIGFuZCBleHRlbnQgY29kZQorZm9yIG91ciBuZXh0IG1ham9yIHJlbGVhc2UuCisKK0FsZXhhbmRlciBaYXJvY2hlbnRjZXYgKHNvbWV0aW1lcyBrbm93biBhcyB6YW0sIG9yIHNhc2hhKSwgd3JvdGUgdGhlCityZXNpemVyLCBhbmQgaXMgaGFyZCBhdCB3b3JrIG9uIGltcGxlbWVudGluZyBhbGxvY2F0ZSBvbiBmbHVzaC4gIFNHSQoraW1wbGVtZW50ZWQgYWxsb2NhdGUgb24gZmx1c2ggYmVmb3JlIHVzIGZvciBYRlMsIGFuZCBnZW5lcm91c2x5IHRvb2sKK3RoZSB0aW1lIHRvIGNvbnZpbmNlIG1lIHdlIHNob3VsZCBkbyBpdCBhbHNvLiAgVGhleSBhcmUgZ3JlYXQgcGVvcGxlLAorYW5kIGEgZ3JlYXQgY29tcGFueS4KKworWXVyaSBTaGV2Y2h1ayBhbmQgTmlraXRhIERhbmlsb3YgYXJlIGRvaW5nIHNxdWlkIGNhY2hlIG9wdGltaXphdGlvbi4KKworVml0YWx5IEZlcnRtYW4gaXMgZG9pbmcgZnNjay4KKworSmVmZiBNYWhvbmV5LCBvZiBTdVNFLCBjb250cmlidXRlZCBhIGZldyBjbGVhbnVwIGZpeGVzLCBtb3N0IG5vdGFibHkKK3RoZSBlbmRpYW4gc2FmZSBwYXRjaGVzIHdoaWNoIGFsbG93IFJlaXNlckZTIHRvIHJ1biBvbiBhbnkgcGxhdGZvcm0KK3N1cHBvcnRlZCBieSB0aGUgTGludXgga2VybmVsLgorCitTdVNFLCBJbnRlZ3JhdGVkTGludXguY29tLCBFY2lsYSwgTVAzLmNvbSwgYmlnc3RvcmFnZS5jb20sIGFuZCB0aGUKK0FscGhhIFBDIENvbXBhbnkgbWFkZSBpdCBwb3NzaWJsZSBmb3IgbWUgdG8gbm90IGhhdmUgYSBkYXkgam9iCithbnltb3JlLCBhbmQgdG8gZHJhbWF0aWNhbGx5IGluY3JlYXNlIG91ciBzdGFmZmluZy4gIEVjaWxhIGZ1bmRlZAoraHlwZXJ0ZXh0IGZlYXR1cmUgZGV2ZWxvcG1lbnQsIE1QMy5jb20gZnVuZGVkIGpvdXJuYWxpbmcsIFN1U0UgZnVuZGVkCitjb3JlIGRldmVsb3BtZW50LCBJbnRlZ3JhdGVkTGludXguY29tIGZ1bmRlZCBzcXVpZCB3ZWIgY2FjaGUKK2FwcGxpYW5jZXMsIGJpZ3N0b3JhZ2UuY29tIGZ1bmRlZCBIU00sIGFuZCB0aGUgYWxwaGEgUEMgY29tcGFueSBmdW5kZWQKK3RoZSBhbHBoYSBwb3J0LiAgTWFueSBvZiB0aGVzZSB0YXNrcyB3ZXJlIGhlbHBlZCBieSBzcG9uc29ycyBvdGhlcgordGhhbiB0aGUgb25lcyBqdXN0IG5hbWVkLiAgU3VTRSBoYXMgaGVscGVkIGluIG11Y2ggbW9yZSB0aGFuIGp1c3QKK2Z1bmRpbmcuLi4uCisKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2JpdG1hcC5jIGIvZnMvcmVpc2VyZnMvYml0bWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRlMmVkNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL2JpdG1hcC5jCkBAIC0wLDAgKzEsMTE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwIGJ5IEhhbnMgUmVpc2VyLCBsaWNlbnNpbmcgZ292ZXJuZWQgYnkgcmVpc2VyZnMvUkVBRE1FCisgKi8KKy8qIFJlaXNlcmZzIGJsb2NrIChkZSlhbGxvY2F0b3IsIGJpdG1hcC1iYXNlZC4gKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnNfc2IuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mc19pLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKworI2RlZmluZSBQUkVBTExPQ0FUSU9OX1NJWkUgOQorCisvKiBkaWZmZXJlbnQgcmVpc2VyZnMgYmxvY2sgYWxsb2NhdG9yIG9wdGlvbnMgKi8KKworI2RlZmluZSBTQl9BTExPQ19PUFRTKHMpIChSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLmJpdHMpCisKKyNkZWZpbmUgIF9BTExPQ19jb25jZW50cmF0aW5nX2Zvcm1hdHRlZF9ub2RlcyAwCisjZGVmaW5lICBfQUxMT0NfZGlzcGxhY2luZ19sYXJnZV9maWxlcyAxCisjZGVmaW5lICBfQUxMT0NfZGlzcGxhY2luZ19uZXdfcGFja2luZ19sb2NhbGl0aWVzIDIKKyNkZWZpbmUgIF9BTExPQ19vbGRfaGFzaGVkX3JlbG9jYXRpb24gMworI2RlZmluZSAgX0FMTE9DX25ld19oYXNoZWRfcmVsb2NhdGlvbiA0CisjZGVmaW5lICBfQUxMT0Nfc2tpcF9idXN5IDUKKyNkZWZpbmUgIF9BTExPQ19kaXNwbGFjZV9iYXNlZF9vbl9kaXJpZCA2CisjZGVmaW5lICBfQUxMT0NfaGFzaGVkX2Zvcm1hdHRlZF9ub2RlcyA3CisjZGVmaW5lICBfQUxMT0Nfb2xkX3dheSA4CisjZGVmaW5lICBfQUxMT0NfaHVuZHJlZHRoX3NsaWNlcyA5CisjZGVmaW5lICBfQUxMT0NfZGlyaWRfZ3JvdXBzIDEwCisjZGVmaW5lICBfQUxMT0Nfb2lkX2dyb3VwcyAxMQorI2RlZmluZSAgX0FMTE9DX3BhY2tpbmdfZ3JvdXBzIDEyCisKKyNkZWZpbmUgIGNvbmNlbnRyYXRpbmdfZm9ybWF0dGVkX25vZGVzKHMpCXRlc3RfYml0KF9BTExPQ19jb25jZW50cmF0aW5nX2Zvcm1hdHRlZF9ub2RlcywgJlNCX0FMTE9DX09QVFMocykpCisjZGVmaW5lICBkaXNwbGFjaW5nX2xhcmdlX2ZpbGVzKHMpCQl0ZXN0X2JpdChfQUxMT0NfZGlzcGxhY2luZ19sYXJnZV9maWxlcywgJlNCX0FMTE9DX09QVFMocykpCisjZGVmaW5lICBkaXNwbGFjaW5nX25ld19wYWNraW5nX2xvY2FsaXRpZXMocykJdGVzdF9iaXQoX0FMTE9DX2Rpc3BsYWNpbmdfbmV3X3BhY2tpbmdfbG9jYWxpdGllcywgJlNCX0FMTE9DX09QVFMocykpCisKKyNkZWZpbmUgU0VUX09QVElPTihvcHRuYW1lKSBcCisgICBkbyB7IFwKKyAgICAgICAgcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnM6IG9wdGlvbiBcIiVzXCIgaXMgc2V0IiwgI29wdG5hbWUpOyBcCisgICAgICAgIHNldF9iaXQoX0FMTE9DXyAjIyBvcHRuYW1lICwgJlNCX0FMTE9DX09QVFMocykpOyBcCisgICAgfSB3aGlsZSgwKQorI2RlZmluZSBURVNUX09QVElPTihvcHRuYW1lLCBzKSBcCisgICAgdGVzdF9iaXQoX0FMTE9DXyAjIyBvcHRuYW1lICwgJlNCX0FMTE9DX09QVFMocykpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfYml0X2FkZHJlc3MgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsCisJCQkJICAgIGJfYmxvY2tucl90IGJsb2NrLCBpbnQgKiBibWFwX25yLCBpbnQgKiBvZmZzZXQpCit7CisgICAgLyogSXQgaXMgaW4gdGhlIGJpdG1hcCBibG9jayBudW1iZXIgZXF1YWwgdG8gdGhlIGJsb2NrCisgICAgICogbnVtYmVyIGRpdmlkZWQgYnkgdGhlIG51bWJlciBvZiBiaXRzIGluIGEgYmxvY2suICovCisgICAgKmJtYXBfbnIgPSBibG9jayAvIChzLT5zX2Jsb2Nrc2l6ZSA8PCAzKTsKKyAgICAvKiBXaXRoaW4gdGhhdCBiaXRtYXAgYmxvY2sgaXQgaXMgbG9jYXRlZCBhdCBiaXQgb2Zmc2V0ICpvZmZzZXQuICovCisgICAgKm9mZnNldCA9IGJsb2NrICYgKChzLT5zX2Jsb2Nrc2l6ZSA8PCAzKSAtIDEgKTsKKyAgICByZXR1cm47Cit9CisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKK2ludCBpc19yZXVzYWJsZSAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgYl9ibG9ja25yX3QgYmxvY2ssIGludCBiaXRfdmFsdWUpCit7CisgICAgaW50IGksIGo7CisKKyAgICBpZiAoYmxvY2sgPT0gMCB8fCBibG9jayA+PSBTQl9CTE9DS19DT1VOVCAocykpIHsKKwlyZWlzZXJmc193YXJuaW5nIChzLCAidnMtNDAxMDogaXNfcmV1c2FibGU6IGJsb2NrIG51bWJlciBpcyBvdXQgb2YgcmFuZ2UgJWx1ICgldSkiLAorCQkJICBibG9jaywgU0JfQkxPQ0tfQ09VTlQgKHMpKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBpdCBjYW4ndCBiZSBvbmUgb2YgdGhlIGJpdG1hcCBibG9ja3MgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgU0JfQk1BUF9OUiAocyk7IGkgKyspCisJaWYgKGJsb2NrID09IFNCX0FQX0JJVE1BUCAocylbaV0uYmgtPmJfYmxvY2tucikgeworCSAgICByZWlzZXJmc193YXJuaW5nIChzLCAidnM6IDQwMjA6IGlzX3JldXNhYmxlOiAiCisJCQkgICAgICAiYml0bWFwIGJsb2NrICVsdSgldSkgY2FuJ3QgYmUgZnJlZWQgb3IgcmV1c2VkIiwKKwkJCSAgICAgIGJsb2NrLCBTQl9CTUFQX05SIChzKSk7CisJICAgIHJldHVybiAwOworCX0KKyAgCisgICAgZ2V0X2JpdF9hZGRyZXNzIChzLCBibG9jaywgJmksICZqKTsKKworICAgIGlmIChpID49IFNCX0JNQVBfTlIgKHMpKSB7CisJcmVpc2VyZnNfd2FybmluZyAocywgInZzLTQwMzA6IGlzX3JldXNhYmxlOiB0aGVyZSBpcyBubyBzbyBtYW55IGJpdG1hcCBibG9ja3M6ICIKKwkJCSAgImJsb2NrPSVsdSwgYml0bWFwX25yPSVkIiwgYmxvY2ssIGkpOworCXJldHVybiAwOworICAgIH0KKworICAgIGlmICgoYml0X3ZhbHVlID09IDAgJiYgCisgICAgICAgICByZWlzZXJmc190ZXN0X2xlX2JpdChqLCBTQl9BUF9CSVRNQVAocylbaV0uYmgtPmJfZGF0YSkpIHx8CisJKGJpdF92YWx1ZSA9PSAxICYmIAorCSByZWlzZXJmc190ZXN0X2xlX2JpdChqLCBTQl9BUF9CSVRNQVAgKHMpW2ldLmJoLT5iX2RhdGEpID09IDApKSB7CisJcmVpc2VyZnNfd2FybmluZyAocywgInZzLTQwNDA6IGlzX3JldXNhYmxlOiBjb3JyZXNwb25kaW5nIGJpdCBvZiBibG9jayAlbHUgZG9lcyBub3QgIgorCQkJICAibWF0Y2ggcmVxdWlyZWQgdmFsdWUgKGk9PSVkLCBqPT0lZCkgdGVzdF9iaXQ9PSVkIiwKKwkJYmxvY2ssIGksIGosIHJlaXNlcmZzX3Rlc3RfbGVfYml0IChqLCBTQl9BUF9CSVRNQVAgKHMpW2ldLmJoLT5iX2RhdGEpKTsKKworCXJldHVybiAwOworICAgIH0KKworICAgIGlmIChiaXRfdmFsdWUgPT0gMCAmJiBibG9jayA9PSBTQl9ST09UX0JMT0NLIChzKSkgeworCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy00MDUwOiBpc19yZXVzYWJsZTogdGhpcyBpcyByb290IGJsb2NrICgldSksICIKKwkJCSAgIml0IG11c3QgYmUgYnVzeSIsIFNCX1JPT1RfQkxPQ0sgKHMpKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KKworLyogc2VhcmNoZXMgaW4gam91cm5hbCBzdHJ1Y3R1cmVzIGZvciBhIGdpdmVuIGJsb2NrIG51bWJlciAoYm1hcCwgb2ZmKS4gSWYgYmxvY2sKKyAgIGlzIGZvdW5kIGluIHJlaXNlcmZzIGpvdXJuYWwgaXQgc3VnZ2VzdHMgbmV4dCBmcmVlIGJsb2NrIGNhbmRpZGF0ZSB0byB0ZXN0LiAqLworc3RhdGljIGlubGluZSAgaW50IGlzX2Jsb2NrX2luX2pvdXJuYWwgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIGludCBibWFwLCBpbnQKK29mZiwgaW50ICpuZXh0KQoreworICAgIGJfYmxvY2tucl90IHRtcDsKKworICAgIGlmIChyZWlzZXJmc19pbl9qb3VybmFsIChzLCBibWFwLCBvZmYsIDEsICZ0bXApKSB7CisJaWYgKHRtcCkgeyAgICAgICAgICAgICAgLyogaGludCBzdXBwbGllZCAqLworCSAgICAqbmV4dCA9IHRtcDsKKwkgICAgUFJPQ19JTkZPX0lOQyggcywgc2Nhbl9iaXRtYXAuaW5fam91cm5hbF9oaW50ICk7CisJfSBlbHNlIHsKKwkgICAgKCpuZXh0KSA9IG9mZiArIDE7ICAgICAgICAgIC8qIGluYyBvZmZzZXQgdG8gYXZvaWQgbG9vcGluZy4gKi8KKwkgICAgUFJPQ19JTkZPX0lOQyggcywgc2Nhbl9iaXRtYXAuaW5fam91cm5hbF9ub2hpbnQgKTsKKwl9CisJUFJPQ19JTkZPX0lOQyggcywgc2Nhbl9iaXRtYXAucmV0cnkgKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIGl0IHNlYXJjaGVzIGZvciBhIHdpbmRvdyBvZiB6ZXJvIGJpdHMgd2l0aCBnaXZlbiBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aHMgaW4gb25lIGJpdG1hcAorICogYmxvY2s7ICovCitzdGF0aWMgaW50IHNjYW5fYml0bWFwX2Jsb2NrIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgIGludCBibWFwX24sIGludCAqYmVnLCBpbnQgYm91bmRhcnksIGludCBtaW4sIGludCBtYXgsIGludCB1bmZtKQoreworICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IHRoLT50X3N1cGVyOworICAgIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbyAqYmk9JlNCX0FQX0JJVE1BUChzKVtibWFwX25dOworICAgIGludCBlbmQsIG5leHQ7CisgICAgaW50IG9yZyA9ICpiZWc7CisKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisKKyAgICBSRkFMU0UoYm1hcF9uID49IFNCX0JNQVBfTlIgKHMpLCAiQml0bWFwICVkIGlzIG91dCBvZiByYW5nZSAoMC4uJWQpIixibWFwX24sIFNCX0JNQVBfTlIgKHMpIC0gMSk7CisgICAgUFJPQ19JTkZPX0lOQyggcywgc2Nhbl9iaXRtYXAuYm1hcCApOworLyogdGhpcyBpcyB1bmNsZWFyIGFuZCBsYWNrcyBjb21tZW50cywgZXhwbGFpbiBob3cgam91cm5hbCBiaXRtYXBzCisgICB3b3JrIGhlcmUgZm9yIHRoZSByZWFkZXIuICBDb252ZXkgYSBzZW5zZSBvZiB0aGUgZGVzaWduIGhlcmUuIFdoYXQKKyAgIGlzIGEgd2luZG93PyAqLworLyogLSBJIG1lYW4gYGEgd2luZG93IG9mIHplcm8gYml0cycgYXMgaW4gZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbiAtIFphbS4gKi8KKyAgCisgICAgaWYgKCAhYmkgKSB7CisJcmVpc2VyZnNfd2FybmluZyAocywgIk5VTEwgYml0bWFwIGluZm8gcG9pbnRlciBmb3IgYml0bWFwICVkIiwgYm1hcF9uKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGJ1ZmZlcl9sb2NrZWQgKGJpLT5iaCkpIHsKKyAgICAgICBQUk9DX0lORk9fSU5DKCBzLCBzY2FuX2JpdG1hcC53YWl0ICk7CisgICAgICAgX193YWl0X29uX2J1ZmZlciAoYmktPmJoKTsKKyAgICB9CisKKyAgICB3aGlsZSAoMSkgeworCWNvbnQ6CisJaWYgKGJpLT5mcmVlX2NvdW50IDwgbWluKQorCQlyZXR1cm4gMDsgLy8gTm8gZnJlZSBibG9ja3MgaW4gdGhpcyBiaXRtYXAKKworCS8qIHNlYXJjaCBmb3IgYSBmaXJzdCB6ZXJvIGJpdCAtLSBiZWdnaW5pbmcgb2YgYSB3aW5kb3cgKi8KKwkqYmVnID0gcmVpc2VyZnNfZmluZF9uZXh0X3plcm9fbGVfYml0CisJICAgICAgICAoKHVuc2lnbmVkIGxvbmcqKShiaS0+YmgtPmJfZGF0YSksIGJvdW5kYXJ5LCAqYmVnKTsKKyAgCisJaWYgKCpiZWcgKyBtaW4gPiBib3VuZGFyeSkgeyAvKiBzZWFyY2ggZm9yIGEgemVybyBiaXQgZmFpbHMgb3IgdGhlIHJlc3Qgb2YgYml0bWFwIGJsb2NrCisJCQkJICAgICAgKiBjYW5ub3QgY29udGFpbiBhIHplcm8gd2luZG93IG9mIG1pbmltdW0gc2l6ZSAqLworCSAgICByZXR1cm4gMDsKKwl9CisKKwlpZiAodW5mbSAmJiBpc19ibG9ja19pbl9qb3VybmFsKHMsYm1hcF9uLCAqYmVnLCBiZWcpKQorCSAgICBjb250aW51ZTsKKwkvKiBmaXJzdCB6ZXJvIGJpdCBmb3VuZDsgd2UgY2hlY2sgbmV4dCBiaXRzICovCisJZm9yIChlbmQgPSAqYmVnICsgMTs7IGVuZCArKykgeworCSAgICBpZiAoZW5kID49ICpiZWcgKyBtYXggfHwgZW5kID49IGJvdW5kYXJ5IHx8IHJlaXNlcmZzX3Rlc3RfbGVfYml0IChlbmQsIGJpLT5iaC0+Yl9kYXRhKSkgeworCQluZXh0ID0gZW5kOworCQlicmVhazsKKwkgICAgfQorCSAgICAvKiBmaW5kaW5nIHRoZSBvdGhlciBlbmQgb2YgemVybyBiaXQgd2luZG93IHJlcXVpcmVzIGxvb2tpbmcgaW50byBqb3VybmFsIHN0cnVjdHVyZXMgKGluCisJICAgICAqIGNhc2Ugb2Ygc2VhcmNoaW5nIGZvciBmcmVlIGJsb2NrcyBmb3IgdW5mb3JtYXR0ZWQgbm9kZXMpICovCisJICAgIGlmICh1bmZtICYmIGlzX2Jsb2NrX2luX2pvdXJuYWwocywgYm1hcF9uLCBlbmQsICZuZXh0KSkKKwkJYnJlYWs7CisJfQorCisJLyogbm93ICgqYmVnKSBwb2ludHMgdG8gYmVnaW5uaW5nIG9mIHplcm8gYml0cyB3aW5kb3csCisJICogKGVuZCkgcG9pbnRzIHRvIG9uZSBiaXQgYWZ0ZXIgdGhlIHdpbmRvdyBlbmQgKi8KKwlpZiAoZW5kIC0gKmJlZyA+PSBtaW4pIHsgLyogaXQgc2VlbXMgd2UgaGF2ZSBmb3VuZCB3aW5kb3cgb2YgcHJvcGVyIHNpemUgKi8KKwkgICAgaW50IGk7CisJICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwgKHMsIGJpLT5iaCwgMSk7CisJICAgIC8qIHRyeSB0byBzZXQgYWxsIGJsb2NrcyB1c2VkIGNoZWNraW5nIGFyZSB0aGV5IHN0aWxsIGZyZWUgKi8KKwkgICAgZm9yIChpID0gKmJlZzsgaSA8IGVuZDsgaSsrKSB7CisJCS8qIEl0IHNlZW1zIHRoYXQgd2Ugc2hvdWxkIG5vdCBjaGVjayBpbiBqb3VybmFsIGFnYWluLiAqLworCQlpZiAocmVpc2VyZnNfdGVzdF9hbmRfc2V0X2xlX2JpdCAoaSwgYmktPmJoLT5iX2RhdGEpKSB7CisJCSAgICAvKiBiaXQgd2FzIHNldCBieSBhbm90aGVyIHByb2Nlc3MKKwkJICAgICAqIHdoaWxlIHdlIHNsZXB0IGluIHByZXBhcmVfZm9yX2pvdXJuYWwoKSAqLworCQkgICAgUFJPQ19JTkZPX0lOQyggcywgc2Nhbl9iaXRtYXAuc3RvbGVuICk7CisJCSAgICBpZiAoaSA+PSAqYmVnICsgbWluKQl7IC8qIHdlIGNhbiBjb250aW51ZSB3aXRoIHNtYWxsZXIgc2V0IG9mIGFsbG9jYXRlZCBibG9ja3MsCisJCQkJCSAgICogaWYgbGVuZ3RoIG9mIHRoaXMgc2V0IGlzIG1vcmUgb3IgZXF1YWwgdG8gYG1pbicgKi8KKwkJCWVuZCA9IGk7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIC8qIG90aGVyd2lzZSB3ZSBjbGVhciBhbGwgYml0IHdlcmUgc2V0IC4uLiAqLworCQkgICAgd2hpbGUgKC0taSA+PSAqYmVnKQorCQkJcmVpc2VyZnNfdGVzdF9hbmRfY2xlYXJfbGVfYml0IChpLCBiaS0+YmgtPmJfZGF0YSk7CisJCSAgICByZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAocywgYmktPmJoKTsKKwkJICAgICpiZWcgPSBvcmc7CisJCSAgICAvKiAuLi4gYW5kIHNlYXJjaCBhZ2FpbiBpbiBjdXJyZW50IGJsb2NrIGZyb20gYmVnaW5uaW5nICovCisJCSAgICBnb3RvIGNvbnQ7CQorCQl9CisJICAgIH0KKwkgICAgYmktPmZyZWVfY291bnQgLT0gKGVuZCAtICpiZWcpOworCSAgICBqb3VybmFsX21hcmtfZGlydHkgKHRoLCBzLCBiaS0+YmgpOworCisJICAgIC8qIGZyZWUgYmxvY2sgY291bnQgY2FsY3VsYXRpb24gKi8KKwkgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbCAocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpOworCSAgICBQVVRfU0JfRlJFRV9CTE9DS1MocywgU0JfRlJFRV9CTE9DS1MocykgLSAoZW5kIC0gKmJlZykpOworCSAgICBqb3VybmFsX21hcmtfZGlydHkgKHRoLCBzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSk7CisKKwkgICAgcmV0dXJuIGVuZCAtICgqYmVnKTsKKwl9IGVsc2UgeworCSAgICAqYmVnID0gbmV4dDsKKwl9CisgICAgfQorfQorCitzdGF0aWMgaW50IGJtYXBfaGFzaF9pZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHUzMiBpZCkgeworICAgIGNoYXIgKiBoYXNoX2luID0gTlVMTDsKKyAgICB1bnNpZ25lZCBsb25nIGhhc2g7CisgICAgdW5zaWduZWQgYm07CisKKyAgICBpZiAoaWQgPD0gMikgeworCWJtID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBoYXNoX2luID0gKGNoYXIgKikoJmlkKTsKKyAgICAgICAgaGFzaCA9IGtleWVkX2hhc2goaGFzaF9pbiwgNCk7CisJYm0gPSBoYXNoICUgU0JfQk1BUF9OUihzKTsKKwlpZiAoIWJtKQorCSAgICBibSA9IDE7CisgICAgfQorICAgIC8qIHRoaXMgY2FuIG9ubHkgYmUgdHJ1ZSB3aGVuIFNCX0JNQVBfTlIgPSAxICovCisgICAgaWYgKGJtID49IFNCX0JNQVBfTlIocykpCisgICAgCWJtID0gMDsKKyAgICByZXR1cm4gYm07Cit9CisKKy8qCisgKiBoYXNoZXMgdGhlIGlkIGFuZCB0aGVuIHJldHVybnMgPiAwIGlmIHRoZSBibG9jayBncm91cCBmb3IgdGhlCisgKiBjb3JyZXNwb25kaW5nIGhhc2ggaXMgZnVsbAorICovCitzdGF0aWMgaW5saW5lIGludCBibG9ja19ncm91cF91c2VkKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdTMyIGlkKSB7CisgICAgaW50IGJtOworICAgIGJtID0gYm1hcF9oYXNoX2lkKHMsIGlkKTsKKyAgICBpZiAoU0JfQVBfQklUTUFQKHMpW2JtXS5mcmVlX2NvdW50ID4gKChzLT5zX2Jsb2Nrc2l6ZSA8PCAzKSAqIDYwIC8gMTAwKSApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorCisvKgorICogdGhlIHBhY2tpbmcgaXMgcmV0dXJuZWQgaW4gZGlzayBieXRlIG9yZGVyCisgKi8KK3UzMiByZWlzZXJmc19jaG9vc2VfcGFja2luZyhzdHJ1Y3QgaW5vZGUgKmRpcikgeworICAgIHUzMiBwYWNraW5nOworICAgIGlmIChURVNUX09QVElPTihwYWNraW5nX2dyb3VwcywgZGlyLT5pX3NiKSkgeworCXUzMiBwYXJlbnRfZGlyID0gbGUzMl90b19jcHUoSU5PREVfUEtFWShkaXIpLT5rX2Rpcl9pZCk7CisJLyoKKwkgKiBzb21lIHZlcnNpb25zIG9mIHJlaXNlcmZzY2sgZXhwZWN0IHBhY2tpbmcgbG9jYWxpdHkgMSB0byBiZQorCSAqIHNwZWNpYWwKKwkgKi8KKwlpZiAocGFyZW50X2RpciA9PSAxIHx8IGJsb2NrX2dyb3VwX3VzZWQoZGlyLT5pX3NiLHBhcmVudF9kaXIpKQorICAgICAgICAgICAgcGFja2luZyA9IElOT0RFX1BLRVkoZGlyKS0+a19vYmplY3RpZDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGFja2luZyA9IElOT0RFX1BLRVkoZGlyKS0+a19kaXJfaWQ7CisgICAgfSBlbHNlCisgICAgICAgIHBhY2tpbmcgPSBJTk9ERV9QS0VZKGRpciktPmtfb2JqZWN0aWQ7CisgICAgcmV0dXJuIHBhY2tpbmc7Cit9CisgIAorLyogVHJpZXMgdG8gZmluZCBjb250aWd1b3VzIHplcm8gYml0IHdpbmRvdyAoZ2l2ZW4gc2l6ZSkgaW4gZ2l2ZW4gcmVnaW9uIG9mCisgKiBiaXRtYXAgYW5kIHBsYWNlIG5ldyBibG9ja3MgdGhlcmUuIFJldHVybnMgbnVtYmVyIG9mIGFsbG9jYXRlZCBibG9ja3MuICovCitzdGF0aWMgaW50IHNjYW5fYml0bWFwIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCWJfYmxvY2tucl90ICpzdGFydCwgYl9ibG9ja25yX3QgZmluaXNoLAorCQkJaW50IG1pbiwgaW50IG1heCwgaW50IHVuZm0sIHVuc2lnbmVkIGxvbmcgZmlsZV9ibG9jaykKK3sKKyAgICBpbnQgbnJfYWxsb2NhdGVkPTA7CisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICogcyA9IHRoLT50X3N1cGVyOworICAgIC8qIGZpbmQgZXZlcnkgYm0gYW5kIGJtYXAgYW5kIGJtYXBfbnIgaW4gdGhpcyBmaWxlLCBhbmQgY2hhbmdlIHRoZW0gYWxsIHRvIGJpdG1hcF9ibG9ja25yCisgICAgICogLSBIYW5zLCBpdCBpcyBub3QgYSBibG9jayBudW1iZXIgLSBaYW0uICovCisKKyAgICBpbnQgYm0sIG9mZjsKKyAgICBpbnQgZW5kX2JtLCBlbmRfb2ZmOworICAgIGludCBvZmZfbWF4ID0gcy0+c19ibG9ja3NpemUgPDwgMzsKKworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKworICAgIFBST0NfSU5GT19JTkMoIHMsIHNjYW5fYml0bWFwLmNhbGwgKTsgCisgICAgaWYgKCBTQl9GUkVFX0JMT0NLUyhzKSA8PSAwKQorCXJldHVybiAwOyAvLyBObyBwb2ludCBpbiBsb29raW5nIGZvciBtb3JlIGZyZWUgYmxvY2tzCisKKyAgICBnZXRfYml0X2FkZHJlc3MgKHMsICpzdGFydCwgJmJtLCAmb2ZmKTsKKyAgICBnZXRfYml0X2FkZHJlc3MgKHMsIGZpbmlzaCwgJmVuZF9ibSwgJmVuZF9vZmYpOworICAgIGlmIChibSA+IFNCX0JNQVBfTlIocykpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChlbmRfYm0gPiBTQl9CTUFQX05SKHMpKQorICAgICAgICBlbmRfYm0gPSBTQl9CTUFQX05SKHMpOworCisgICAgLyogV2hlbiB0aGUgYml0bWFwIGlzIG1vcmUgdGhhbiAxMCUgZnJlZSwgYW55b25lIGNhbiBhbGxvY2F0ZS4KKyAgICAgKiBXaGVuIGl0J3MgbGVzcyB0aGFuIDEwJSBmcmVlLCBvbmx5IGZpbGVzIHRoYXQgYWxyZWFkeSB1c2UgdGhlCisgICAgICogYml0bWFwIGFyZSBhbGxvd2VkLiBPbmNlIHdlIHBhc3MgODAlIGZ1bGwsIHRoaXMgcmVzdHJpY3Rpb24KKyAgICAgKiBpcyBsaWZ0ZWQuCisgICAgICoKKyAgICAgKiBXZSBkbyB0aGlzIHNvIHRoYXQgZmlsZXMgdGhhdCBncm93IGxhdGVyIHN0aWxsIGhhdmUgc3BhY2UgY2xvc2UgdG8KKyAgICAgKiB0aGVpciBvcmlnaW5hbCBhbGxvY2F0aW9uLiBUaGlzIGltcHJvdmVzIGxvY2FsaXR5LCBhbmQgcHJlc3VtYWJseQorICAgICAqIHBlcmZvcm1hbmNlIGFzIGEgcmVzdWx0LgorICAgICAqCisgICAgICogVGhpcyBpcyBvbmx5IGFuIGFsbG9jYXRpb24gcG9saWN5IGFuZCBkb2VzIG5vdCBtYWtlIHVwIGZvciBnZXR0aW5nIGEKKyAgICAgKiBiYWQgaGludC4gRGVjZW50IGhpbnRpbmcgbXVzdCBiZSBpbXBsZW1lbnRlZCBmb3IgdGhpcyB0byB3b3JrIHdlbGwuCisgICAgICovCisgICAgaWYgKCBURVNUX09QVElPTihza2lwX2J1c3ksIHMpICYmIFNCX0ZSRUVfQkxPQ0tTKHMpID4gU0JfQkxPQ0tfQ09VTlQocykvMjAgKSB7CisJZm9yICg7Ym0gPCBlbmRfYm07IGJtKyssIG9mZiA9IDApIHsKKwkgICAgaWYgKCAoIG9mZiAmJiAoIXVuZm0gfHwgKGZpbGVfYmxvY2sgIT0gMCkpKSB8fCBTQl9BUF9CSVRNQVAocylbYm1dLmZyZWVfY291bnQgPiAocy0+c19ibG9ja3NpemUgPDwgMykgLyAxMCApCisJCW5yX2FsbG9jYXRlZCA9IHNjYW5fYml0bWFwX2Jsb2NrKHRoLCBibSwgJm9mZiwgb2ZmX21heCwgbWluLCBtYXgsIHVuZm0pOworCSAgICBpZiAobnJfYWxsb2NhdGVkKQorCQlnb3RvIHJldDsKKyAgICAgICAgfQorCS8qIHdlIGtub3cgZnJvbSBhYm92ZSB0aGF0IHN0YXJ0IGlzIGEgcmVhc29uYWJsZSBudW1iZXIgKi8KKwlnZXRfYml0X2FkZHJlc3MgKHMsICpzdGFydCwgJmJtLCAmb2ZmKTsKKyAgICB9CisKKyAgICBmb3IgKDtibSA8IGVuZF9ibTsgYm0rKywgb2ZmID0gMCkgeworCW5yX2FsbG9jYXRlZCA9IHNjYW5fYml0bWFwX2Jsb2NrKHRoLCBibSwgJm9mZiwgb2ZmX21heCwgbWluLCBtYXgsIHVuZm0pOworCWlmIChucl9hbGxvY2F0ZWQpCisJICAgIGdvdG8gcmV0OworICAgIH0KKworICAgIG5yX2FsbG9jYXRlZCA9IHNjYW5fYml0bWFwX2Jsb2NrKHRoLCBibSwgJm9mZiwgZW5kX29mZiArIDEsIG1pbiwgbWF4LCB1bmZtKTsKKyAgCisgcmV0OgorICAgICpzdGFydCA9IGJtICogb2ZmX21heCArIG9mZjsKKyAgICByZXR1cm4gbnJfYWxsb2NhdGVkOworCit9CisKK3N0YXRpYyB2b2lkIF9yZWlzZXJmc19mcmVlX2Jsb2NrIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGJfYmxvY2tucl90IGJsb2NrLAorCQkJCSAgaW50IGZvcl91bmZvcm1hdHRlZCkKK3sKKyAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzID0gdGgtPnRfc3VwZXI7CisgICAgc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnM7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogc2JoOworICAgIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbyAqYXBiaTsKKyAgICBpbnQgbnIsIG9mZnNldDsKKworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKworICAgIFBST0NfSU5GT19JTkMoIHMsIGZyZWVfYmxvY2sgKTsKKworICAgIHJzID0gU0JfRElTS19TVVBFUl9CTE9DSyAocyk7CisgICAgc2JoID0gU0JfQlVGRkVSX1dJVEhfU0IgKHMpOworICAgIGFwYmkgPSBTQl9BUF9CSVRNQVAocyk7CisKKyAgICBnZXRfYml0X2FkZHJlc3MgKHMsIGJsb2NrLCAmbnIsICZvZmZzZXQpOworCisgICAgaWYgKG5yID49IHNiX2JtYXBfbnIgKHJzKSkgeworCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy00MDc1OiByZWlzZXJmc19mcmVlX2Jsb2NrOiAiCisJCQkgICJibG9jayAlbHUgaXMgb3V0IG9mIHJhbmdlIG9uICVzIiwKKwkJCSAgYmxvY2ssIHJlaXNlcmZzX2JkZXZuYW1lIChzKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgYXBiaVtucl0uYmgsIDEgKSA7CisKKyAgICAvKiBjbGVhciBiaXQgZm9yIHRoZSBnaXZlbiBibG9jayBpbiBiaXQgbWFwICovCisgICAgaWYgKCFyZWlzZXJmc190ZXN0X2FuZF9jbGVhcl9sZV9iaXQgKG9mZnNldCwgYXBiaVtucl0uYmgtPmJfZGF0YSkpIHsKKwlyZWlzZXJmc193YXJuaW5nIChzLCAidnMtNDA4MDogcmVpc2VyZnNfZnJlZV9ibG9jazogIgorCQkJICAiZnJlZV9ibG9jayAoJXM6JWx1KVtkZXY6YmxvY2tucl06IGJpdCBhbHJlYWR5IGNsZWFyZWQiLAorCQkJICByZWlzZXJmc19iZGV2bmFtZSAocyksIGJsb2NrKTsKKyAgICB9CisgICAgYXBiaVtucl0uZnJlZV9jb3VudCArKzsKKyAgICBqb3VybmFsX21hcmtfZGlydHkgKHRoLCBzLCBhcGJpW25yXS5iaCk7CisKKyAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIHNiaCwgMSkgOworICAgIC8qIHVwZGF0ZSBzdXBlciBibG9jayAqLworICAgIHNldF9zYl9mcmVlX2Jsb2NrcyggcnMsIHNiX2ZyZWVfYmxvY2tzKHJzKSArIDEgKTsKKworICAgIGpvdXJuYWxfbWFya19kaXJ0eSAodGgsIHMsIHNiaCk7CisgICAgaWYgKGZvcl91bmZvcm1hdHRlZCkKKyAgICAgICAgRFFVT1RfRlJFRV9CTE9DS19OT0RJUlRZKGlub2RlLCAxKTsKK30KKwordm9pZCByZWlzZXJmc19mcmVlX2Jsb2NrIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCisJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGJfYmxvY2tucl90IGJsb2NrLAorCQkJICBpbnQgZm9yX3VuZm9ybWF0dGVkKQoreworICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMgPSB0aC0+dF9zdXBlcjsKKworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKworICAgIFJGQUxTRSghcywgInZzLTQwNjE6IHRyeWluZyB0byBmcmVlIGJsb2NrIG9uIG5vbmV4aXN0ZW50IGRldmljZSIpOworICAgIFJGQUxTRShpc19yZXVzYWJsZSAocywgYmxvY2ssIDEpID09IDAsICJ2cy00MDcxOiBjYW4gbm90IGZyZWUgc3VjaCBibG9jayIpOworICAgIC8qIG1hcmsgaXQgYmVmb3JlIHdlIGNsZWFyIGl0LCBqdXN0IGluIGNhc2UgKi8KKyAgICBqb3VybmFsX21hcmtfZnJlZWQodGgsIHMsIGJsb2NrKSA7CisgICAgX3JlaXNlcmZzX2ZyZWVfYmxvY2sodGgsIGlub2RlLCBibG9jaywgZm9yX3VuZm9ybWF0dGVkKSA7Cit9CisKKy8qIHByZWFsbG9jYXRlZCBibG9ja3MgZG9uJ3QgbmVlZCB0byBiZSBydW4gdGhyb3VnaCBqb3VybmFsX21hcmtfZnJlZWQgKi8KK3N0YXRpYyB2b2lkIHJlaXNlcmZzX2ZyZWVfcHJlYWxsb2NfYmxvY2sgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBiX2Jsb2NrbnJfdCBibG9jaykgeworICAgIFJGQUxTRSghdGgtPnRfc3VwZXIsICJ2cy00MDYwOiB0cnlpbmcgdG8gZnJlZSBibG9jayBvbiBub25leGlzdGVudCBkZXZpY2UiKTsKKyAgICBSRkFMU0UoaXNfcmV1c2FibGUgKHRoLT50X3N1cGVyLCBibG9jaywgMSkgPT0gMCwgInZzLTQwNzA6IGNhbiBub3QgZnJlZSBzdWNoIGJsb2NrIik7CisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworICAgIF9yZWlzZXJmc19mcmVlX2Jsb2NrKHRoLCBpbm9kZSwgYmxvY2ssIDEpIDsKK30KKworc3RhdGljIHZvaWQgX19kaXNjYXJkX3ByZWFsbG9jIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICogdGgsCisJCQkJc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKmVpKQoreworICAgIHVuc2lnbmVkIGxvbmcgc2F2ZSA9IGVpLT5pX3ByZWFsbG9jX2Jsb2NrIDsKKyAgICBpbnQgZGlydHkgPSAwOworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSAmZWktPnZmc19pbm9kZTsKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisgICAgaWYgKGVpLT5pX3ByZWFsbG9jX2NvdW50IDwgMCkKKwlyZWlzZXJmc193YXJuaW5nICh0aC0+dF9zdXBlciwgInphbS00MDAxOiVzOiBpbm9kZSBoYXMgbmVnYXRpdmUgcHJlYWxsb2MgYmxvY2tzIGNvdW50LiIsIF9fRlVOQ1RJT05fXyApOworI2VuZGlmCisgICAgd2hpbGUgKGVpLT5pX3ByZWFsbG9jX2NvdW50ID4gMCkgeworCXJlaXNlcmZzX2ZyZWVfcHJlYWxsb2NfYmxvY2sodGgsIGlub2RlLCBlaS0+aV9wcmVhbGxvY19ibG9jayk7CisJZWktPmlfcHJlYWxsb2NfYmxvY2srKzsKKwllaS0+aV9wcmVhbGxvY19jb3VudCAtLTsKKwlkaXJ0eSA9IDE7CisgICAgfQorICAgIGlmIChkaXJ0eSkKKyAgICAJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7CisgICAgZWktPmlfcHJlYWxsb2NfYmxvY2sgPSBzYXZlOworICAgIGxpc3RfZGVsX2luaXQoJihlaS0+aV9wcmVhbGxvY19saXN0KSk7Cit9CisKKy8qIEZJWE1FOiBJdCBzaG91bGQgYmUgaW5saW5lIGZ1bmN0aW9uICovCit2b2lkIHJlaXNlcmZzX2Rpc2NhcmRfcHJlYWxsb2MgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCAKKwkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworICAgIHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICplaSA9IFJFSVNFUkZTX0koaW5vZGUpOworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKyAgICBpZiAoZWktPmlfcHJlYWxsb2NfY291bnQpCisJX19kaXNjYXJkX3ByZWFsbG9jKHRoLCBlaSk7Cit9CisKK3ZvaWQgcmVpc2VyZnNfZGlzY2FyZF9hbGxfcHJlYWxsb2MgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoKQoreworICAgIHN0cnVjdCBsaXN0X2hlYWQgKiBwbGlzdCA9ICZTQl9KT1VSTkFMKHRoLT50X3N1cGVyKS0+al9wcmVhbGxvY19saXN0OworCisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCisgICAgd2hpbGUgKCFsaXN0X2VtcHR5KHBsaXN0KSkgeworCXN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICplaTsKKwllaSA9IGxpc3RfZW50cnkocGxpc3QtPm5leHQsIHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvLCBpX3ByZWFsbG9jX2xpc3QpOworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworCWlmICghZWktPmlfcHJlYWxsb2NfY291bnQpIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAodGgtPnRfc3VwZXIsICJ6YW0tNDAwMTolczogaW5vZGUgaXMgaW4gcHJlYWxsb2MgbGlzdCBidXQgaGFzIG5vIHByZWFsbG9jYXRlZCBibG9ja3MuIiwgX19GVU5DVElPTl9fKTsKKwl9CisjZW5kaWYKKwlfX2Rpc2NhcmRfcHJlYWxsb2ModGgsIGVpKTsKKyAgICB9Cit9CisKK3ZvaWQgcmVpc2VyZnNfaW5pdF9hbGxvY19vcHRpb25zIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisgICAgc2V0X2JpdCAoX0FMTE9DX3NraXBfYnVzeSwgJlNCX0FMTE9DX09QVFMocykpOworICAgIHNldF9iaXQgKF9BTExPQ19kaXJpZF9ncm91cHMsICZTQl9BTExPQ19PUFRTKHMpKTsKKyAgICBzZXRfYml0IChfQUxMT0NfcGFja2luZ19ncm91cHMsICZTQl9BTExPQ19PUFRTKHMpKTsKK30KKworLyogYmxvY2sgYWxsb2NhdG9yIHJlbGF0ZWQgb3B0aW9ucyBhcmUgcGFyc2VkIGhlcmUgKi8KK2ludCByZWlzZXJmc19wYXJzZV9hbGxvY19vcHRpb25zKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIGNoYXIgKiBvcHRpb25zKQoreworICAgIGNoYXIgKiB0aGlzX2NoYXIsICogdmFsdWU7CisKKyAgICBSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLmJpdHMgPSAwOyAvKiBjbGVhciBkZWZhdWx0IHNldHRpbmdzICovCisKKyAgICB3aGlsZSAoICh0aGlzX2NoYXIgPSBzdHJzZXAgKCZvcHRpb25zLCAiOiIpKSAhPSBOVUxMICkgeworCWlmICgodmFsdWUgPSBzdHJjaHIgKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkgICAgKnZhbHVlKysgPSAwOworCisJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiY29uY2VudHJhdGluZ19mb3JtYXR0ZWRfbm9kZXMiKSkgeworCSAgICBpbnQgdGVtcDsKKwkgICAgU0VUX09QVElPTihjb25jZW50cmF0aW5nX2Zvcm1hdHRlZF9ub2Rlcyk7CisJICAgIHRlbXAgPSAodmFsdWUgJiYgKnZhbHVlKSA/IHNpbXBsZV9zdHJ0b3VsICh2YWx1ZSwgJnZhbHVlLCAwKSA6IDEwOworCSAgICBpZiAodGVtcCA8PSAwIHx8IHRlbXAgPiAxMDApIHsKKwkJUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5ib3JkZXIgPSAxMDsKKwkgICAgfSBlbHNlIHsKKwkJUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5ib3JkZXIgPSAxMDAgLyB0ZW1wOworCSAgIH0KKwkgICAgY29udGludWU7CisJfQorCWlmICghc3RyY21wKHRoaXNfY2hhciwgImRpc3BsYWNpbmdfbGFyZ2VfZmlsZXMiKSkgeworCSAgICBTRVRfT1BUSU9OKGRpc3BsYWNpbmdfbGFyZ2VfZmlsZXMpOworCSAgICBSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLmxhcmdlX2ZpbGVfc2l6ZSA9CisJCSh2YWx1ZSAmJiAqdmFsdWUpID8gc2ltcGxlX3N0cnRvdWwgKHZhbHVlLCAmdmFsdWUsIDApIDogMTY7CisJICAgIGNvbnRpbnVlOworCX0KKwlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJkaXNwbGFjaW5nX25ld19wYWNraW5nX2xvY2FsaXRpZXMiKSkgeworCSAgICBTRVRfT1BUSU9OKGRpc3BsYWNpbmdfbmV3X3BhY2tpbmdfbG9jYWxpdGllcyk7CisJICAgIGNvbnRpbnVlOworCX07CisKKwlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJvbGRfaGFzaGVkX3JlbG9jYXRpb24iKSkgeworCSAgICBTRVRfT1BUSU9OKG9sZF9oYXNoZWRfcmVsb2NhdGlvbik7CisJICAgIGNvbnRpbnVlOworCX0KKworCWlmICghc3RyY21wKHRoaXNfY2hhciwgIm5ld19oYXNoZWRfcmVsb2NhdGlvbiIpKSB7CisJICAgIFNFVF9PUFRJT04obmV3X2hhc2hlZF9yZWxvY2F0aW9uKTsKKwkgICAgY29udGludWU7CisJfQorCisgICAgICAgIGlmICghc3RyY21wKHRoaXNfY2hhciwgImRpcmlkX2dyb3VwcyIpKSB7CisJICAgIFNFVF9PUFRJT04oZGlyaWRfZ3JvdXBzKTsKKwkgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdHJjbXAodGhpc19jaGFyLCAib2lkX2dyb3VwcyIpKSB7CisJICAgIFNFVF9PUFRJT04ob2lkX2dyb3Vwcyk7CisJICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICghc3RyY21wKHRoaXNfY2hhciwgInBhY2tpbmdfZ3JvdXBzIikpIHsKKwkgICAgU0VUX09QVElPTihwYWNraW5nX2dyb3Vwcyk7CisJICAgIGNvbnRpbnVlOworICAgICAgICB9CisJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiaGFzaGVkX2Zvcm1hdHRlZF9ub2RlcyIpKSB7CisJICAgIFNFVF9PUFRJT04oaGFzaGVkX2Zvcm1hdHRlZF9ub2Rlcyk7CisJICAgIGNvbnRpbnVlOworCX0KKworCWlmICghc3RyY21wKHRoaXNfY2hhciwgInNraXBfYnVzeSIpKSB7CisJICAgIFNFVF9PUFRJT04oc2tpcF9idXN5KTsKKwkgICAgY29udGludWU7CisJfQorCisJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiaHVuZHJlZHRoX3NsaWNlcyIpKSB7CisJICAgIFNFVF9PUFRJT04oaHVuZHJlZHRoX3NsaWNlcyk7CisJICAgIGNvbnRpbnVlOworCX0KKworCWlmICghc3RyY21wKHRoaXNfY2hhciwgIm9sZF93YXkiKSkgeworCSAgICBTRVRfT1BUSU9OKG9sZF93YXkpOworCSAgICBjb250aW51ZTsKKwl9CisKKwlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJkaXNwbGFjZV9iYXNlZF9vbl9kaXJpZCIpKSB7CisJICAgIFNFVF9PUFRJT04oZGlzcGxhY2VfYmFzZWRfb25fZGlyaWQpOworCSAgICBjb250aW51ZTsKKwl9CisKKwlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJwcmVhbGxvY21pbiIpKSB7CisJICAgIFJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NtaW4gPQorCQkodmFsdWUgJiYgKnZhbHVlKSA/IHNpbXBsZV9zdHJ0b3VsICh2YWx1ZSwgJnZhbHVlLCAwKSA6IDQ7CisJICAgIGNvbnRpbnVlOworCX0KKworCWlmICghc3RyY21wKHRoaXNfY2hhciwgInByZWFsbG9jc2l6ZSIpKSB7CisJICAgIFJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NzaXplID0KKwkJKHZhbHVlICYmICp2YWx1ZSkgPyBzaW1wbGVfc3RydG91bCAodmFsdWUsICZ2YWx1ZSwgMCkgOiBQUkVBTExPQ0FUSU9OX1NJWkU7CisJICAgIGNvbnRpbnVlOworCX0KKworCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJ6YW0tNDAwMTogJXMgOiB1bmtub3duIG9wdGlvbiAtICVzIiwKKwkJCSAgX19GVU5DVElPTl9fICwgdGhpc19jaGFyKTsKKwlyZXR1cm4gMTsKKyAgICAgIH0KKyAgCisgICAgcmVpc2VyZnNfd2FybmluZyAocywgImFsbG9jYXRvciBvcHRpb25zID0gWyUwOHhdXG4iLCBTQl9BTExPQ19PUFRTKHMpKTsKKyAgICByZXR1cm4gMDsKK30KKyAgCitzdGF0aWMgaW5saW5lIHZvaWQgbmV3X2hhc2hlZF9yZWxvY2F0aW9uIChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCit7CisgICAgY2hhciAqIGhhc2hfaW47CisgICAgaWYgKGhpbnQtPmZvcm1hdHRlZF9ub2RlKSB7CisJICAgIGhhc2hfaW4gPSAoY2hhciopJmhpbnQtPmtleS5rX2Rpcl9pZDsKKyAgICB9IGVsc2UgeworCWlmICghaGludC0+aW5vZGUpIHsKKwkgICAgLy9oaW50LT5zZWFyY2hfc3RhcnQgPSBoaW50LT5iZWc7CisJICAgIGhhc2hfaW4gPSAoY2hhciopJmhpbnQtPmtleS5rX2Rpcl9pZDsKKwl9IGVsc2UgCisJICAgIGlmICggVEVTVF9PUFRJT04oZGlzcGxhY2VfYmFzZWRfb25fZGlyaWQsIGhpbnQtPnRoLT50X3N1cGVyKSkKKwkJaGFzaF9pbiA9IChjaGFyICopKCZJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19kaXJfaWQpOworCSAgICBlbHNlCisJCWhhc2hfaW4gPSAoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfb2JqZWN0aWQpOworICAgICAgfQorCisgICAgaGludC0+c2VhcmNoX3N0YXJ0ID0gaGludC0+YmVnICsga2V5ZWRfaGFzaChoYXNoX2luLCA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcpOworfQorCisvKgorICogUmVsb2NhdGlvbiBiYXNlZCBvbiBkaXJpZCwgaGFzaGluZyB0aGVtIGludG8gYSBnaXZlbiBiaXRtYXAgYmxvY2sKKyAqIGZpbGVzLiBGb3JtYXR0ZWQgbm9kZXMgYXJlIHVuYWZmZWN0ZWQsIGEgc2VwZXJhdGUgcG9saWN5IGNvdmVycyB0aGVtCisgKi8KK3N0YXRpYyB2b2lkCitkaXJpZF9ncm91cHMgKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50KQoreworICAgIHVuc2lnbmVkIGxvbmcgaGFzaDsKKyAgICBfX3UzMiBkaXJpZCA9IDA7CisgICAgaW50IGJtID0gMDsKKyAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaGludC0+dGgtPnRfc3VwZXI7CisgICAgaWYgKGhpbnQtPmlub2RlKQorCWRpcmlkID0gbGUzMl90b19jcHUoSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfZGlyX2lkKTsKKyAgICBlbHNlIGlmIChoaW50LT5mb3JtYXR0ZWRfbm9kZSkKKyAgICAgICAgZGlyaWQgPSBoaW50LT5rZXkua19kaXJfaWQ7CisKKyAgICBpZiAoZGlyaWQpIHsKKwlibSA9IGJtYXBfaGFzaF9pZChzYiwgZGlyaWQpOworCWhhc2ggPSBibSAqIChzYi0+c19ibG9ja3NpemUgPDwgMyk7CisJLyogZ2l2ZSBhIHBvcnRpb24gb2YgdGhlIGJsb2NrIGdyb3VwIHRvIG1ldGFkYXRhICovCisJaWYgKGhpbnQtPmlub2RlKQorCSAgICBoYXNoICs9IHNiLT5zX2Jsb2Nrc2l6ZS8yOworCWhpbnQtPnNlYXJjaF9zdGFydCA9IGhhc2g7CisgICAgfQorfQorCisvKgorICogUmVsb2NhdGlvbiBiYXNlZCBvbiBvaWQsIGhhc2hpbmcgdGhlbSBpbnRvIGEgZ2l2ZW4gYml0bWFwIGJsb2NrCisgKiBmaWxlcy4gRm9ybWF0dGVkIG5vZGVzIGFyZSB1bmFmZmVjdGVkLCBhIHNlcGVyYXRlIHBvbGljeSBjb3ZlcnMgdGhlbQorICovCitzdGF0aWMgdm9pZAorb2lkX2dyb3VwcyAocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKmhpbnQpCit7CisgICAgaWYgKGhpbnQtPmlub2RlKSB7CisJdW5zaWduZWQgbG9uZyBoYXNoOworCV9fdTMyIG9pZDsKKwlfX3UzMiBkaXJpZDsKKwlpbnQgYm07CisKKwlkaXJpZCA9IGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX2Rpcl9pZCk7CisKKwkvKiBrZWVwIHRoZSByb290IGRpciBhbmQgaXQncyBmaXJzdCBzZXQgb2Ygc3ViZGlycyBjbG9zZSB0bworCSAqIHRoZSBzdGFydCBvZiB0aGUgZGlzaworCSAqLworCWlmIChkaXJpZCA8PSAyKQorCSAgICBoYXNoID0gKGhpbnQtPmlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA8PCAzKTsKKwllbHNlIHsKKwkgICAgb2lkID0gbGUzMl90b19jcHUoSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfb2JqZWN0aWQpOworCSAgICBibSA9IGJtYXBfaGFzaF9pZChoaW50LT5pbm9kZS0+aV9zYiwgb2lkKTsKKwkgICAgaGFzaCA9IGJtICogKGhpbnQtPmlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA8PCAzKTsKKwl9CisJaGludC0+c2VhcmNoX3N0YXJ0ID0gaGFzaDsKKyAgICB9Cit9CisKKy8qIHJldHVybnMgMSBpZiBpdCBmaW5kcyBhbiBpbmRpcmVjdCBpdGVtIGFuZCBnZXRzIHZhbGlkIGhpbnQgaW5mbworICogZnJvbSBpdCwgb3RoZXJ3aXNlIDAKKyAqLworc3RhdGljIGludCBnZXRfbGVmdF9uZWlnaGJvcihyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCkKK3sKKyAgICBzdHJ1Y3QgcGF0aCAqIHBhdGg7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOworICAgIGludCBwb3NfaW5faXRlbTsKKyAgICBfX3UzMiAqIGl0ZW07CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoIWhpbnQtPnBhdGgpCQkvKiByZWlzZXJmcyBjb2RlIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gdy9vIHBvaW50ZXIgdG8gcGF0aAorCQkJCSAqIHN0cnVjdHVyZSBzdXBwbGllZDsgdGhlbiB3ZSByZWx5IG9uIHN1cHBsaWVkIHNlYXJjaF9zdGFydCAqLworCXJldHVybiAwOworCisgICAgcGF0aCA9IGhpbnQtPnBhdGg7CisgICAgYmggPSBnZXRfbGFzdF9iaChwYXRoKTsKKyAgICBSRkFMU0UoICFiaCwgImdyZWVuLTQwMDI6IElsbGVnYWwgcGF0aCBzcGVjaWZpZWQgdG8gZ2V0X2xlZnRfbmVpZ2hib3IiKTsKKyAgICBpaCA9IGdldF9paChwYXRoKTsKKyAgICBwb3NfaW5faXRlbSA9IHBhdGgtPnBvc19pbl9pdGVtOworICAgIGl0ZW0gPSBnZXRfaXRlbSAocGF0aCk7CisKKyAgICBoaW50LT5zZWFyY2hfc3RhcnQgPSBiaC0+Yl9ibG9ja25yOworCisgICAgaWYgKCFoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBpc19pbmRpcmVjdF9sZV9paCAoaWgpKSB7CisJLyogZm9yIGluZGlyZWN0IGl0ZW06IGdvIHRvIGxlZnQgYW5kIGxvb2sgZm9yIHRoZSBmaXJzdCBub24taG9sZSBlbnRyeQorCSAgIGluIHRoZSBpbmRpcmVjdCBpdGVtICovCisJaWYgKHBvc19pbl9pdGVtID09IElfVU5GTV9OVU0gKGloKSkKKwkgICAgcG9zX2luX2l0ZW0tLTsKKy8vCSAgICBwb3NfaW5faXRlbSA9IElfVU5GTV9OVU0gKGloKSAtIDE7CisJd2hpbGUgKHBvc19pbl9pdGVtID49IDApIHsKKwkgICAgaW50IHQ9Z2V0X2Jsb2NrX251bShpdGVtLHBvc19pbl9pdGVtKTsKKwkgICAgaWYgKHQpIHsKKwkJaGludC0+c2VhcmNoX3N0YXJ0ID0gdDsKKwkJcmV0ID0gMTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgcG9zX2luX2l0ZW0gLS07CisJfQorICAgIH0KKworICAgIC8qIGRvZXMgcmVzdWx0IHZhbHVlIGZpdCBpbnRvIHNwZWNpZmllZCByZWdpb24/ICovCisgICAgcmV0dXJuIHJldDsKK30KKworLyogc2hvdWxkIGJlLCBpZiBmb3JtYXR0ZWQgbm9kZSwgdGhlbiB0cnkgdG8gcHV0IG9uIGZpcnN0IHBhcnQgb2YgdGhlIGRldmljZQorICAgc3BlY2lmaWVkIGFzIG51bWJlciBvZiBwZXJjZW50IHdpdGggbW91bnQgb3B0aW9uIGRldmljZSwgZWxzZSB0cnkgdG8gcHV0CisgICBvbiBsYXN0IG9mIGRldmljZS4gIFRoaXMgaXMgbm90IHRvIHNheSBpdCBpcyBnb29kIGNvZGUgdG8gZG8gc28sCisgICBidXQgdGhlIGVmZmVjdCBzaG91bGQgYmUgbWVhc3VyZWQuICAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF9ib3JkZXJfaW5faGludChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50KQoreworICAgIGJfYmxvY2tucl90IGJvcmRlciA9IFNCX0JMT0NLX0NPVU5UKHMpIC8gUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5ib3JkZXI7CisKKyAgICBpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUpCisJaGludC0+ZW5kID0gYm9yZGVyIC0gMTsKKyAgICBlbHNlCisJaGludC0+YmVnID0gYm9yZGVyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzcGxhY2VfbGFyZ2VfZmlsZShyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCkKK3sKKyAgICBpZiAoIFRFU1RfT1BUSU9OKGRpc3BsYWNlX2Jhc2VkX29uX2RpcmlkLCBoaW50LT50aC0+dF9zdXBlcikpCisJaGludC0+c2VhcmNoX3N0YXJ0ID0gaGludC0+YmVnICsga2V5ZWRfaGFzaCgoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfZGlyX2lkKSwgNCkgJSAoaGludC0+ZW5kIC0gaGludC0+YmVnKTsKKyAgICBlbHNlCisJaGludC0+c2VhcmNoX3N0YXJ0ID0gaGludC0+YmVnICsga2V5ZWRfaGFzaCgoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfb2JqZWN0aWQpLCA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGFzaF9mb3JtYXR0ZWRfbm9kZShyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCkKK3sKKyAgIGNoYXIgKiBoYXNoX2luOworCisgICBpZiAoIWhpbnQtPmlub2RlKQorCWhhc2hfaW4gPSAoY2hhciopJmhpbnQtPmtleS5rX2Rpcl9pZDsKKyAgICBlbHNlIGlmICggVEVTVF9PUFRJT04oZGlzcGxhY2VfYmFzZWRfb25fZGlyaWQsIGhpbnQtPnRoLT50X3N1cGVyKSkKKwloYXNoX2luID0gKGNoYXIgKikoJklOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX2Rpcl9pZCk7CisgICAgZWxzZQorCWhhc2hfaW4gPSAoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfb2JqZWN0aWQpOworCisJaGludC0+c2VhcmNoX3N0YXJ0ID0gaGludC0+YmVnICsga2V5ZWRfaGFzaChoYXNoX2luLCA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcpOworfQorCitzdGF0aWMgaW5saW5lIGludCB0aGlzX2Jsb2NrbnJfYWxsb2NhdGlvbl93b3VsZF9tYWtlX2l0X2FfbGFyZ2VfZmlsZShyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCkKK3sKKyAgICByZXR1cm4gaGludC0+YmxvY2sgPT0gUkVJU0VSRlNfU0IoaGludC0+dGgtPnRfc3VwZXIpLT5zX2FsbG9jX29wdGlvbnMubGFyZ2VfZmlsZV9zaXplOworfQorCisjaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUworc3RhdGljIGlubGluZSB2b2lkIGRpc3BsYWNlX25ld19wYWNraW5nX2xvY2FsaXR5IChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5ID0gJmhpbnQtPmtleTsKKworICAgIGhpbnQtPnRoLT5kaXNwbGFjZV9uZXdfYmxvY2tzID0gMDsKKyAgICBoaW50LT5zZWFyY2hfc3RhcnQgPSBoaW50LT5iZWcgKyBrZXllZF9oYXNoKChjaGFyKikoJmtleS0+a19vYmplY3RpZCksNCkgJSAoaGludC0+ZW5kIC0gaGludC0+YmVnKTsKK30KKyAgI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50IG9sZF9oYXNoZWRfcmVsb2NhdGlvbiAocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50KQoreworICAgIGJfYmxvY2tucl90IGJvcmRlcjsKKyAgICB1MzIgaGFzaF9pbjsKKyAgICAKKyAgICBpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUgfHwgaGludC0+aW5vZGUgPT0gTlVMTCkgeworCXJldHVybiAwOworICAgICAgfQorCisgICAgaGFzaF9pbiA9IGxlMzJfdG9fY3B1KChJTk9ERV9QS0VZKGhpbnQtPmlub2RlKSktPmtfZGlyX2lkKTsKKyAgICBib3JkZXIgPSBoaW50LT5iZWcgKyAodTMyKSBrZXllZF9oYXNoKCgoY2hhciAqKSAoJmhhc2hfaW4pKSwgNCkgJSAoaGludC0+ZW5kIC0gaGludC0+YmVnIC0gMSk7CisgICAgaWYgKGJvcmRlciA+IGhpbnQtPnNlYXJjaF9zdGFydCkKKwloaW50LT5zZWFyY2hfc3RhcnQgPSBib3JkZXI7CisKKyAgICByZXR1cm4gMTsKKyAgfQorICAKK3N0YXRpYyBpbmxpbmUgaW50IG9sZF93YXkgKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCkKK3sKKyAgICBiX2Jsb2NrbnJfdCBib3JkZXI7CisgICAgCisgICAgaWYgKGhpbnQtPmZvcm1hdHRlZF9ub2RlIHx8IGhpbnQtPmlub2RlID09IE5VTEwpIHsKKwlyZXR1cm4gMDsKKyAgICB9CisgIAorICAgICAgYm9yZGVyID0gaGludC0+YmVnICsgbGUzMl90b19jcHUoSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfZGlyX2lkKSAlIChoaW50LT5lbmQgIC0gaGludC0+YmVnKTsKKyAgICBpZiAoYm9yZGVyID4gaGludC0+c2VhcmNoX3N0YXJ0KQorCWhpbnQtPnNlYXJjaF9zdGFydCA9IGJvcmRlcjsKKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaHVuZHJlZHRoX3NsaWNlcyAocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50KQoreworICAgIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkgPSAmaGludC0+a2V5OworICAgIGJfYmxvY2tucl90IHNsaWNlX3N0YXJ0OworCisgICAgc2xpY2Vfc3RhcnQgPSAoa2V5ZWRfaGFzaCgoY2hhciopKCZrZXktPmtfZGlyX2lkKSw0KSAlIDEwMCkgKiAoaGludC0+ZW5kIC8gMTAwKTsKKyAgICBpZiAoIHNsaWNlX3N0YXJ0ID4gaGludC0+c2VhcmNoX3N0YXJ0IHx8IHNsaWNlX3N0YXJ0ICsgKGhpbnQtPmVuZCAvIDEwMCkgPD0gaGludC0+c2VhcmNoX3N0YXJ0KSB7CisJaGludC0+c2VhcmNoX3N0YXJ0ID0gc2xpY2Vfc3RhcnQ7CisgICAgfQorfQorICAKK3N0YXRpYyB2b2lkIGRldGVybWluZV9zZWFyY2hfc3RhcnQocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKmhpbnQsCisJCQkJCSAgaW50IGFtb3VudF9uZWVkZWQpCit7CisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gaGludC0+dGgtPnRfc3VwZXI7CisgICAgaW50IHVuZm1faGludDsKKworICAgIGhpbnQtPmJlZyA9IDA7CisgICAgaGludC0+ZW5kID0gU0JfQkxPQ0tfQ09VTlQocykgLSAxOworCisgICAgLyogVGhpcyBpcyBmb3JtZXIgYm9yZGVyIGFsZ29yaXRobS4gTm93IHdpdGggdHVuYWJsZSBib3JkZXIgb2Zmc2V0ICovCisgICAgaWYgKGNvbmNlbnRyYXRpbmdfZm9ybWF0dGVkX25vZGVzKHMpKQorCXNldF9ib3JkZXJfaW5faGludChzLCBoaW50KTsKKworI2lmZGVmIERJU1BMQUNFX05FV19QQUNLSU5HX0xPQ0FMSVRJRVMKKyAgICAvKiB3aGVuZXZlciB3ZSBjcmVhdGUgYSBuZXcgZGlyZWN0b3J5LCB3ZSBkaXNwbGFjZSBpdC4gIEF0IGZpcnN0IHdlIHdpbGwKKyAgICAgICBoYXNoIGZvciBsb2NhdGlvbiwgbGF0ZXIgd2UgbWlnaHQgbG9vayBmb3IgYSBtb2RlcmF0ZWx5IGVtcHR5IHBsYWNlIGZvcgorICAgICAgIGl0ICovCisgICAgaWYgKGRpc3BsYWNpbmdfbmV3X3BhY2tpbmdfbG9jYWxpdGllcyhzKQorCSYmIGhpbnQtPnRoLT5kaXNwbGFjZV9uZXdfYmxvY2tzKSB7CisJZGlzcGxhY2VfbmV3X3BhY2tpbmdfbG9jYWxpdHkoaGludCk7CisKKwkvKiB3ZSBkbyBub3QgY29udGludWUgZGV0ZXJtaW5lX3NlYXJjaF9zdGFydCwKKwkgKiBpZiBuZXcgcGFja2luZyBsb2NhbGl0eSBpcyBiZWluZyBkaXNwbGFjZWQgKi8KKwlyZXR1cm47CisgICAgfQkJCQkgICAgICAKKyNlbmRpZgorICAKKyAgICAvKiBhbGwgcGVyc29ucyBzaG91bGQgZmVlbCBlbmNvdXJhZ2VkIHRvIGFkZCBtb3JlIHNwZWNpYWwgY2FzZXMgaGVyZSBhbmQKKyAgICAgKiB0ZXN0IHRoZW0gKi8KKworICAgIGlmIChkaXNwbGFjaW5nX2xhcmdlX2ZpbGVzKHMpICYmICFoaW50LT5mb3JtYXR0ZWRfbm9kZQorCSYmIHRoaXNfYmxvY2tucl9hbGxvY2F0aW9uX3dvdWxkX21ha2VfaXRfYV9sYXJnZV9maWxlKGhpbnQpKSB7CisJZGlzcGxhY2VfbGFyZ2VfZmlsZShoaW50KTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogaWYgbm9uZSBvZiBvdXIgc3BlY2lhbCBjYXNlcyBpcyByZWxldmFudCwgdXNlIHRoZSBsZWZ0IG5laWdoYm9yIGluIHRoZQorICAgICAgIHRyZWUgb3JkZXIgb2YgdGhlIG5ldyBub2RlIHdlIGFyZSBhbGxvY2F0aW5nIGZvciAqLworICAgIGlmIChoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBURVNUX09QVElPTihoYXNoZWRfZm9ybWF0dGVkX25vZGVzLHMpKSB7CisgICAgICAgIGhhc2hfZm9ybWF0dGVkX25vZGUoaGludCk7CisJcmV0dXJuOworICAgIH0KKworICAgIHVuZm1faGludCA9IGdldF9sZWZ0X25laWdoYm9yKGhpbnQpOworCisgICAgLyogTWltaWMgb2xkIGJsb2NrIGFsbG9jYXRvciBiZWhhdmlvdXIsIHRoYXQgaXMgaWYgVkZTIGFsbG93ZWQgZm9yIHByZWFsbG9jYXRpb24sCisgICAgICAgbmV3IGJsb2NrcyBhcmUgZGlzcGxhY2VkIGJhc2VkIG9uIGRpcmVjdG9yeSBJRC4gQWxzbywgaWYgc3VnZ2VzdGVkIHNlYXJjaF9zdGFydAorICAgICAgIGlzIGxlc3MgdGhhbiBsYXN0IHByZWFsbG9jYXRlZCBibG9jaywgd2Ugc3RhcnQgc2VhcmNoaW5nIGZyb20gaXQsIGFzc3VtaW5nIHRoYXQKKyAgICAgICBIREQgZGF0YWZsb3cgaXMgZmFzdGVyIGluIGZvcndhcmQgZGlyZWN0aW9uICovCisgICAgaWYgKCBURVNUX09QVElPTihvbGRfd2F5LCBzKSkgeworCWlmICghaGludC0+Zm9ybWF0dGVkX25vZGUpIHsKKwkgICAgaWYgKCAhcmVpc2VyZnNfaGFzaGVkX3JlbG9jYXRpb24ocykpCisJCW9sZF93YXkoaGludCk7CisJICAgIGVsc2UgaWYgKCFyZWlzZXJmc19ub191bmhhc2hlZF9yZWxvY2F0aW9uKHMpKQorCQlvbGRfaGFzaGVkX3JlbG9jYXRpb24oaGludCk7CisKKwkgICAgaWYgKCBoaW50LT5pbm9kZSAmJiBoaW50LT5zZWFyY2hfc3RhcnQgPCBSRUlTRVJGU19JKGhpbnQtPmlub2RlKS0+aV9wcmVhbGxvY19ibG9jaykKKwkJaGludC0+c2VhcmNoX3N0YXJ0ID0gUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfYmxvY2s7CisJfQorCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBUaGlzIGlzIGFuIGFwcHJvYWNoIHByb3Bvc2VkIGJ5IEhhbnMgKi8KKyAgICBpZiAoIFRFU1RfT1BUSU9OKGh1bmRyZWR0aF9zbGljZXMsIHMpICYmICEgKGRpc3BsYWNpbmdfbGFyZ2VfZmlsZXMocykgJiYgIWhpbnQtPmZvcm1hdHRlZF9ub2RlKSkgeworCWh1bmRyZWR0aF9zbGljZXMoaGludCk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIG9sZF9oYXNoZWRfcmVsb2NhdGlvbiBvbmx5IHdvcmtzIG9uIHVuZm9ybWF0dGVkICovCisgICAgaWYgKCF1bmZtX2hpbnQgJiYgIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmCisgICAgICAgIFRFU1RfT1BUSU9OKG9sZF9oYXNoZWRfcmVsb2NhdGlvbiwgcykpCisgICAgeworCW9sZF9oYXNoZWRfcmVsb2NhdGlvbihoaW50KTsKKyAgICB9CisgICAgLyogbmV3X2hhc2hlZF9yZWxvY2F0aW9uIHdvcmtzIHdpdGggYm90aCBmb3JtYXR0ZWQvdW5mb3JtYXR0ZWQgbm9kZXMgKi8KKyAgICBpZiAoKCF1bmZtX2hpbnQgfHwgaGludC0+Zm9ybWF0dGVkX25vZGUpICYmCisgICAgICAgIFRFU1RfT1BUSU9OKG5ld19oYXNoZWRfcmVsb2NhdGlvbiwgcykpCisgICAgeworCW5ld19oYXNoZWRfcmVsb2NhdGlvbihoaW50KTsKKyAgICB9CisgICAgLyogZGlyaWQgZ3JvdXBpbmcgd29ya3Mgb25seSBvbiB1bmZvcm1hdHRlZCBub2RlcyAqLworICAgIGlmICghdW5mbV9oaW50ICYmICFoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBURVNUX09QVElPTihkaXJpZF9ncm91cHMscykpCisgICAgeworICAgICAgICBkaXJpZF9ncm91cHMoaGludCk7CisgICAgfQorCisjaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUworICAgIGlmIChoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBURVNUX09QVElPTihkaXJpZF9ncm91cHMscykpCisgICAgeworICAgICAgICBkaXJpZF9ncm91cHMoaGludCk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBvaWQgZ3JvdXBpbmcgd29ya3Mgb25seSBvbiB1bmZvcm1hdHRlZCBub2RlcyAqLworICAgIGlmICghdW5mbV9oaW50ICYmICFoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBURVNUX09QVElPTihvaWRfZ3JvdXBzLHMpKQorICAgIHsKKyAgICAgICAgb2lkX2dyb3VwcyhoaW50KTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgaW50IGRldGVybWluZV9wcmVhbGxvY19zaXplKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCkKK3sKKyAgICAvKiBtYWtlIG1pbmltdW0gc2l6ZSBhIG1vdW50IG9wdGlvbiBhbmQgYmVuY2htYXJrIGJvdGggd2F5cyAqLworICAgIC8qIHdlIHByZWFsbG9jYXRlIGJsb2NrcyBvbmx5IGZvciByZWd1bGFyIGZpbGVzLCBzcGVjaWZpYyBzaXplICovCisgICAgLyogYmVuY2htYXJrIHByZWFsbG9jYXRpbmcgYWx3YXlzIGFuZCBzZWUgd2hhdCBoYXBwZW5zICovCisKKyAgICBoaW50LT5wcmVhbGxvY19zaXplID0gMDsKKworICAgIGlmICghaGludC0+Zm9ybWF0dGVkX25vZGUgJiYgaGludC0+cHJlYWxsb2NhdGUpIHsKKwlpZiAoU19JU1JFRyhoaW50LT5pbm9kZS0+aV9tb2RlKQorCSAgICAmJiBoaW50LT5pbm9kZS0+aV9zaXplID49IFJFSVNFUkZTX1NCKGhpbnQtPnRoLT50X3N1cGVyKS0+c19hbGxvY19vcHRpb25zLnByZWFsbG9jbWluICogaGludC0+aW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKQorCSAgICBoaW50LT5wcmVhbGxvY19zaXplID0gUkVJU0VSRlNfU0IoaGludC0+dGgtPnRfc3VwZXIpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NzaXplIC0gMTsKKyAgICB9CisgICAgcmV0dXJuIENBUlJZX09OOworfQorCisvKiBYWFggSSBrbm93IGl0IGNvdWxkIGJlIG1lcmdlZCB3aXRoIHVwcGVyLWxldmVsIGZ1bmN0aW9uOworICAgYnV0IG1heSBiZSByZXN1bHQgZnVuY3Rpb24gd291bGQgYmUgdG9vIGNvbXBsZXguICovCitzdGF0aWMgaW5saW5lIGludCBhbGxvY2F0ZV93aXRob3V0X3dyYXBwaW5nX2Rpc2sgKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCwKKwkJCQkJIGJfYmxvY2tucl90ICogbmV3X2Jsb2NrbnJzLAorCQkJCQkgYl9ibG9ja25yX3Qgc3RhcnQsIGJfYmxvY2tucl90IGZpbmlzaCwKKwkJCQkJIGludCBtaW4sCisJCQkJCSBpbnQgYW1vdW50X25lZWRlZCwgaW50IHByZWFsbG9jX3NpemUpCit7CisgICAgaW50IHJlc3QgPSBhbW91bnRfbmVlZGVkOworICAgIGludCBucl9hbGxvY2F0ZWQ7CisgIAorICAgIHdoaWxlIChyZXN0ID4gMCAmJiBzdGFydCA8PSBmaW5pc2gpIHsKKwlucl9hbGxvY2F0ZWQgPSBzY2FuX2JpdG1hcCAoaGludC0+dGgsICZzdGFydCwgZmluaXNoLCBtaW4sCisJCQkJICAgIHJlc3QgKyBwcmVhbGxvY19zaXplLCAhaGludC0+Zm9ybWF0dGVkX25vZGUsCisJCQkJICAgIGhpbnQtPmJsb2NrKTsKKworCWlmIChucl9hbGxvY2F0ZWQgPT0gMCkJLyogbm8gbmV3IGJsb2NrcyBhbGxvY2F0ZWQsIHJldHVybiAqLworCSAgICBicmVhazsKKwkKKwkvKiBmaWxsIGZyZWVfYmxvY2tucnMgYXJyYXkgZmlyc3QgKi8KKwl3aGlsZSAocmVzdCA+IDAgJiYgbnJfYWxsb2NhdGVkID4gMCkgeworCSAgICAqIG5ld19ibG9ja25ycyArKyA9IHN0YXJ0ICsrOworCSAgICByZXN0IC0tOyBucl9hbGxvY2F0ZWQgLS07CisJfQorCisJLyogZG8gd2UgaGF2ZSBzb21ldGhpbmcgdG8gZmlsbCBwcmVhbGxvYy4gYXJyYXkgYWxzbyA/ICovCisJaWYgKG5yX2FsbG9jYXRlZCA+IDApIHsKKwkgICAgLyogaXQgbWVhbnMgcHJlYWxsb2Nfc2l6ZSB3YXMgZ3JlYXRlciB0aGF0IDAgYW5kIHdlIGRvIHByZWFsbG9jYXRpb24gKi8KKwkgICAgbGlzdF9hZGQoJlJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2xpc3QsCisJCSAgICAgJlNCX0pPVVJOQUwoaGludC0+dGgtPnRfc3VwZXIpLT5qX3ByZWFsbG9jX2xpc3QpOworCSAgICBSRUlTRVJGU19JKGhpbnQtPmlub2RlKS0+aV9wcmVhbGxvY19ibG9jayA9IHN0YXJ0OworCSAgICBSRUlTRVJGU19JKGhpbnQtPmlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA9IG5yX2FsbG9jYXRlZDsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIHJldHVybiAoYW1vdW50X25lZWRlZCAtIHJlc3QpOworfQorCitzdGF0aWMgaW5saW5lIGludCBibG9ja25yc19hbmRfcHJlYWxsb2NfYXJyYXlzX2Zyb21fc2VhcmNoX3N0YXJ0CisgICAgKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50LCBiX2Jsb2NrbnJfdCAqbmV3X2Jsb2NrbnJzLCBpbnQgYW1vdW50X25lZWRlZCkKK3sKKyAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBoaW50LT50aC0+dF9zdXBlcjsKKyAgICBiX2Jsb2NrbnJfdCBzdGFydCA9IGhpbnQtPnNlYXJjaF9zdGFydDsKKyAgICBiX2Jsb2NrbnJfdCBmaW5pc2ggPSBTQl9CTE9DS19DT1VOVChzKSAtIDE7CisgICAgaW50IHBhc3NubyA9IDA7CisgICAgaW50IG5yX2FsbG9jYXRlZCA9IDA7CisgICAgaW50IGJpZ2FsbG9jID0gMDsKKworICAgIGRldGVybWluZV9wcmVhbGxvY19zaXplKGhpbnQpOworICAgIGlmICghaGludC0+Zm9ybWF0dGVkX25vZGUpIHsKKyAgICAgICAgaW50IHF1b3RhX3JldDsKKyNpZmRlZiBSRUlTRVJRVU9UQV9ERUJVRworCXJlaXNlcmZzX2RlYnVnIChzLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGE6IGFsbG9jYXRpbmcgJWQgYmxvY2tzIGlkPSV1IiwgYW1vdW50X25lZWRlZCwgaGludC0+aW5vZGUtPmlfdWlkKTsKKyNlbmRpZgorCXF1b3RhX3JldCA9IERRVU9UX0FMTE9DX0JMT0NLX05PRElSVFkoaGludC0+aW5vZGUsIGFtb3VudF9uZWVkZWQpOworCWlmIChxdW90YV9yZXQpICAgIC8qIFF1b3RhIGV4Y2VlZGVkPyAqLworCSAgICByZXR1cm4gUVVPVEFfRVhDRUVERUQ7CisJaWYgKGhpbnQtPnByZWFsbG9jYXRlICYmIGhpbnQtPnByZWFsbG9jX3NpemUgKSB7CisjaWZkZWYgUkVJU0VSUVVPVEFfREVCVUcKKwkgICAgcmVpc2VyZnNfZGVidWcgKHMsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJyZWlzZXJxdW90YTogYWxsb2NhdGluZyAocHJlYWxsb2MpICVkIGJsb2NrcyBpZD0ldSIsIGhpbnQtPnByZWFsbG9jX3NpemUsIGhpbnQtPmlub2RlLT5pX3VpZCk7CisjZW5kaWYKKwkgICAgcXVvdGFfcmV0ID0gRFFVT1RfUFJFQUxMT0NfQkxPQ0tfTk9ESVJUWShoaW50LT5pbm9kZSwgaGludC0+cHJlYWxsb2Nfc2l6ZSk7CisJICAgIGlmIChxdW90YV9yZXQpCisJCWhpbnQtPnByZWFsbG9jYXRlPWhpbnQtPnByZWFsbG9jX3NpemU9MDsKKwl9CisJLyogZm9yIHVuZm9ybWF0dGVkIG5vZGVzLCBmb3JjZSBsYXJnZSBhbGxvY2F0aW9ucyAqLworCWJpZ2FsbG9jID0gYW1vdW50X25lZWRlZDsKKyAgICB9CisKKyAgICBkbyB7CisJLyogaW4gYmlnYWxsb2MgbW9kZSwgbnJfYWxsb2NhdGVkIHNob3VsZCBzdGF5IHplcm8gdW50aWwKKwkgKiB0aGUgZW50aXJlIGFsbG9jYXRpb24gaXMgZmlsbGVkCisJICovCisJaWYgKHVubGlrZWx5KGJpZ2FsbG9jICYmIG5yX2FsbG9jYXRlZCkpIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyhzLCAiYmlnYWxsb2MgaXMgJWQsIG5yX2FsbG9jYXRlZCAlZFxuIiwKKwkgICAgYmlnYWxsb2MsIG5yX2FsbG9jYXRlZCk7CisJICAgIC8qIHJlc2V0IHRoaW5ncyB0byBhIHNhbmUgdmFsdWUgKi8KKwkgICAgYmlnYWxsb2MgPSBhbW91bnRfbmVlZGVkIC0gbnJfYWxsb2NhdGVkOworCX0KKwkvKgorCSAqIHRyeSBwYXNzIDAgYW5kIHBhc3MgMSBsb29raW5nIGZvciBhIG5pY2UgYmlnCisJICogY29udGlndW91cyBhbGxvY2F0aW9uLiAgVGhlbiByZXNldCBhbmQgbG9vaworCSAqIGZvciBhbnl0aGluZyB5b3UgY2FuIGZpbmQuCisJICovCisJaWYgKHBhc3NubyA9PSAyICYmIGJpZ2FsbG9jKSB7CisJICAgIHBhc3NubyA9IDA7CisJICAgIGJpZ2FsbG9jID0gMDsKKwl9CisJc3dpdGNoIChwYXNzbm8rKykgeworICAgICAgICBjYXNlIDA6IC8qIFNlYXJjaCBmcm9tIGhpbnQtPnNlYXJjaF9zdGFydCB0byBlbmQgb2YgZGlzayAqLworCSAgICBzdGFydCA9IGhpbnQtPnNlYXJjaF9zdGFydDsKKwkgICAgZmluaXNoID0gU0JfQkxPQ0tfQ09VTlQocykgLSAxOworCSAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOiAvKiBTZWFyY2ggZnJvbSBoaW50LT5iZWcgdG8gaGludC0+c2VhcmNoX3N0YXJ0ICovCisJICAgIHN0YXJ0ID0gaGludC0+YmVnOworCSAgICBmaW5pc2ggPSBoaW50LT5zZWFyY2hfc3RhcnQ7CisJICAgIGJyZWFrOworCWNhc2UgMjogLyogTGFzdCBjaGFuY2U6IFNlYXJjaCBmcm9tIDAgdG8gaGludC0+YmVnICovCisJICAgIHN0YXJ0ID0gMDsKKwkgICAgZmluaXNoID0gaGludC0+YmVnOworCSAgICBicmVhazsKKwlkZWZhdWx0OiAvKiBXZSd2ZSB0cmllZCBzZWFyY2hpbmcgZXZlcnl3aGVyZSwgbm90IGVub3VnaCBzcGFjZSAqLworCSAgICAvKiBGcmVlIHRoZSBibG9ja3MgKi8KKwkgICAgaWYgKCFoaW50LT5mb3JtYXR0ZWRfbm9kZSkgeworI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCisJCXJlaXNlcmZzX2RlYnVnIChzLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGE6IGZyZWVpbmcgKG5vc3BhY2UpICVkIGJsb2NrcyBpZD0ldSIsIGFtb3VudF9uZWVkZWQgKyBoaW50LT5wcmVhbGxvY19zaXplIC0gbnJfYWxsb2NhdGVkLCBoaW50LT5pbm9kZS0+aV91aWQpOworI2VuZGlmCisJCURRVU9UX0ZSRUVfQkxPQ0tfTk9ESVJUWShoaW50LT5pbm9kZSwgYW1vdW50X25lZWRlZCArIGhpbnQtPnByZWFsbG9jX3NpemUgLSBucl9hbGxvY2F0ZWQpOyAgICAgLyogRnJlZSBub3QgYWxsb2NhdGVkIGJsb2NrcyAqLworCSAgICB9CisgIAkgICAgd2hpbGUgKG5yX2FsbG9jYXRlZCAtLSkKKwkJcmVpc2VyZnNfZnJlZV9ibG9jayhoaW50LT50aCwgaGludC0+aW5vZGUsIG5ld19ibG9ja25yc1tucl9hbGxvY2F0ZWRdLCAhaGludC0+Zm9ybWF0dGVkX25vZGUpOworCisJICAgIHJldHVybiBOT19ESVNLX1NQQUNFOworCX0KKyAgICB9IHdoaWxlICgobnJfYWxsb2NhdGVkICs9IGFsbG9jYXRlX3dpdGhvdXRfd3JhcHBpbmdfZGlzayAoaGludCwKKwkJCSAgICBuZXdfYmxvY2tucnMgKyBucl9hbGxvY2F0ZWQsIHN0YXJ0LCBmaW5pc2gsCisJCQkgICAgYmlnYWxsb2MgPyBiaWdhbGxvYyA6IDEsCisJCQkgICAgYW1vdW50X25lZWRlZCAtIG5yX2FsbG9jYXRlZCwKKwkJCSAgICBoaW50LT5wcmVhbGxvY19zaXplKSkKKwkJCTwgYW1vdW50X25lZWRlZCk7CisgICAgaWYgKCAhaGludC0+Zm9ybWF0dGVkX25vZGUgJiYKKyAgICAgICAgIGFtb3VudF9uZWVkZWQgKyBoaW50LT5wcmVhbGxvY19zaXplID4KKwkgbnJfYWxsb2NhdGVkICsgUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfY291bnQpIHsKKyAgICAvKiBTb21lIG9mIHByZWFsbG9jYXRpb24gYmxvY2tzIHdlcmUgbm90IGFsbG9jYXRlZCAqLworI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCisJcmVpc2VyZnNfZGVidWcgKHMsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJyZWlzZXJxdW90YTogZnJlZWluZyAoZmFpbGVkIHByZWFsbG9jKSAlZCBibG9ja3MgaWQ9JXUiLCBhbW91bnRfbmVlZGVkICsgaGludC0+cHJlYWxsb2Nfc2l6ZSAtIG5yX2FsbG9jYXRlZCAtIFJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50LCBoaW50LT5pbm9kZS0+aV91aWQpOworI2VuZGlmCisJRFFVT1RfRlJFRV9CTE9DS19OT0RJUlRZKGhpbnQtPmlub2RlLCBhbW91bnRfbmVlZGVkICsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgaGludC0+cHJlYWxsb2Nfc2l6ZSAtIG5yX2FsbG9jYXRlZCAtCisJCQkJIFJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gQ0FSUllfT047Cit9CisKKy8qIGdyYWIgbmV3IGJsb2NrbnJzIGZyb20gcHJlYWxsb2NhdGVkIGxpc3QgKi8KKy8qIHJldHVybiBhbW91bnQgc3RpbGwgbmVlZGVkIGFmdGVyIHVzaW5nIHRoZW0gKi8KK3N0YXRpYyBpbnQgdXNlX3ByZWFsbG9jYXRlZF9saXN0X2lmX2F2YWlsYWJsZSAocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKmhpbnQsCisJCQkJCSAgICAgICBiX2Jsb2NrbnJfdCAqbmV3X2Jsb2NrbnJzLCBpbnQgYW1vdW50X25lZWRlZCkKK3sKKyAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGhpbnQtPmlub2RlOworCisgICAgaWYgKFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50ID4gMCkgeworCXdoaWxlIChhbW91bnRfbmVlZGVkKSB7CisKKwkgICAgKm5ld19ibG9ja25ycyArKyA9IFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2Jsb2NrICsrOworCSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCAtLTsKKworCSAgICBhbW91bnRfbmVlZGVkIC0tOworCisJICAgIGlmIChSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA8PSAwKSB7CisJCWxpc3RfZGVsKCZSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19saXN0KTsgIAorCQlicmVhazsKKwkgICAgfQorCX0KKyAgICAgIH0KKyAgICAvKiByZXR1cm4gYW1vdW50IHN0aWxsIG5lZWRlZCBhZnRlciB1c2luZyBwcmVhbGxvY2F0ZWQgYmxvY2tzICovCisgICAgcmV0dXJuIGFtb3VudF9uZWVkZWQ7Cit9CisKK2ludCByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja25ycyhyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCwKKwkJCSAgICAgICBiX2Jsb2NrbnJfdCAqIG5ld19ibG9ja25ycywgaW50IGFtb3VudF9uZWVkZWQsCisJCQkgICAgICAgaW50IHJlc2VydmVkX2J5X3VzIC8qIEFtb3VudCBvZiBibG9ja3Mgd2UgaGF2ZQorCQkJCQkJICAgICAgYWxyZWFkeSByZXNlcnZlZCAqLykKK3sKKyAgICBpbnQgaW5pdGlhbF9hbW91bnRfbmVlZGVkID0gYW1vdW50X25lZWRlZDsKKyAgICBpbnQgcmV0OworICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IGhpbnQtPnRoLT50X3N1cGVyOworCisgICAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoIHNwYWNlLCB0YWtpbmcgaW50byBhY2NvdW50IHJlc2VydmVkIHNwYWNlICovCisgICAgaWYgKCBTQl9GUkVFX0JMT0NLUyhzKSAtIFJFSVNFUkZTX1NCKHMpLT5yZXNlcnZlZF9ibG9ja3MgPAorCSBhbW91bnRfbmVlZGVkIC0gcmVzZXJ2ZWRfYnlfdXMpCisgICAgICAgIHJldHVybiBOT19ESVNLX1NQQUNFOworICAgIC8qIHNob3VsZCB0aGlzIGJlIGlmICFoaW50LT5pbm9kZSAmJiAgaGludC0+cHJlYWxsb2NhdGU/ICovCisgICAgLyogZG8geW91IG1lYW4gaGludC0+Zm9ybWF0dGVkX25vZGUgY2FuIGJlIHJlbW92ZWQgPyAtIFphbSAqLworICAgIC8qIGhpbnQtPmZvcm1hdHRlZF9ub2RlIGNhbm5vdCBiZSByZW1vdmVkIGJlY2F1c2Ugd2UgdHJ5IHRvIGFjY2VzcworICAgICAgIGlub2RlIGluZm9ybWF0aW9uIGhlcmUsIGFuZCB0aGVyZSBpcyBvZnRlbiBubyBpbm9kZSBhc3NvdGlhdGVkIHdpdGgKKyAgICAgICBtZXRhZGF0YSBhbGxvY2F0aW9ucyAtIGdyZWVuICovCisKKyAgICBpZiAoIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIGhpbnQtPnByZWFsbG9jYXRlKSB7CisJYW1vdW50X25lZWRlZCA9IHVzZV9wcmVhbGxvY2F0ZWRfbGlzdF9pZl9hdmFpbGFibGUKKwkgICAgKGhpbnQsIG5ld19ibG9ja25ycywgYW1vdW50X25lZWRlZCk7CisJaWYgKGFtb3VudF9uZWVkZWQgPT0gMCkJLyogYWxsIGJsb2NrbnJzIHdlIG5lZWQgd2UgZ290IGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYWxsb2MuIGxpc3QgKi8KKwkgICAgcmV0dXJuIENBUlJZX09OOworCW5ld19ibG9ja25ycyArPSAoaW5pdGlhbF9hbW91bnRfbmVlZGVkIC0gYW1vdW50X25lZWRlZCk7CisgICAgfQorCisgICAgLyogZmluZCBzZWFyY2ggc3RhcnQgYW5kIHNhdmUgaXQgaW4gaGludCBzdHJ1Y3R1cmUgKi8KKyAgICBkZXRlcm1pbmVfc2VhcmNoX3N0YXJ0KGhpbnQsIGFtb3VudF9uZWVkZWQpOworICAgIGlmIChoaW50LT5zZWFyY2hfc3RhcnQgPj0gU0JfQkxPQ0tfQ09VTlQocykpCisgICAgICAgIGhpbnQtPnNlYXJjaF9zdGFydCA9IFNCX0JMT0NLX0NPVU5UKHMpIC0gMTsKKworICAgIC8qIGFsbG9jYXRpb24gaXRzZWxmOyBmaWxsIG5ld19ibG9ja25ycyBhbmQgcHJlYWxsb2NhdGlvbiBhcnJheXMgKi8KKyAgICByZXQgPSBibG9ja25yc19hbmRfcHJlYWxsb2NfYXJyYXlzX2Zyb21fc2VhcmNoX3N0YXJ0CisJKGhpbnQsIG5ld19ibG9ja25ycywgYW1vdW50X25lZWRlZCk7CisKKyAgICAvKiB3ZSB1c2VkIHByZWFsbG9jLiBsaXN0IHRvIGZpbGwgKHBhcnRpYWxseSkgbmV3X2Jsb2NrbnJzIGFycmF5LiBJZiBmaW5hbCBhbGxvY2F0aW9uIGZhaWxzIHdlCisgICAgICogbmVlZCB0byByZXR1cm4gYmxvY2tzIGJhY2sgdG8gcHJlYWxsb2MuIGxpc3Qgb3IganVzdCBmcmVlIHRoZW0uIC0tIFphbSAoSSBjaG9zZSBzZWNvbmQKKyAgICAgKiB2YXJpYW50KSAqLworCisgICAgaWYgKHJldCAhPSBDQVJSWV9PTikgeworCXdoaWxlIChhbW91bnRfbmVlZGVkICsrIDwgaW5pdGlhbF9hbW91bnRfbmVlZGVkKSB7CisJICAgIHJlaXNlcmZzX2ZyZWVfYmxvY2soaGludC0+dGgsIGhpbnQtPmlub2RlLCAqKC0tbmV3X2Jsb2NrbnJzKSwgMSk7CisJfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisvKiBUaGVzZSAyIGZ1bmN0aW9ucyBhcmUgaGVyZSB0byBwcm92aWRlIGJsb2NrcyByZXNlcnZhdGlvbiB0byB0aGUgcmVzdCBvZiBrZXJuZWwgKi8KKy8qIFJlc2VydmUgQGJsb2NrcyBhbW91bnQgb2YgYmxvY2tzIGluIGZzIHBvaW50ZWQgYnkgQHNiLiBDYWxsZXIgbXVzdCBtYWtlIHN1cmUKKyAgIHRoZXJlIGFyZSBhY3R1YWxseSB0aGlzIG11Y2ggYmxvY2tzIG9uIHRoZSBGUyBhdmFpbGFibGUgKi8KK3ZvaWQgcmVpc2VyZnNfY2xhaW1fYmxvY2tzX3RvX2JlX2FsbG9jYXRlZCggCisJCQkJICAgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgLyogc3VwZXIgYmxvY2sgb2YKKwkJCQkJCQkgICAgICAgIGZpbGVzeXN0ZW0gd2hlcmUKKwkJCQkJCQkJYmxvY2tzIHNob3VsZCBiZQorCQkJCQkJCQlyZXNlcnZlZCAqLworCQkJCSAgICAgIGludCBibG9ja3MgLyogSG93IG11Y2ggdG8gcmVzZXJ2ZSAqLworCQkJCQkgICkKK3sKKworICAgIC8qIEZhc3QgY2FzZSwgaWYgcmVzZXJ2YXRpb24gaXMgemVybyAtIGV4aXQgaW1tZWRpYXRlbHkuICovCisgICAgaWYgKCAhYmxvY2tzICkKKwlyZXR1cm47CisKKyAgICBzcGluX2xvY2soJlJFSVNFUkZTX1NCKHNiKS0+Yml0bWFwX2xvY2spOworICAgIFJFSVNFUkZTX1NCKHNiKS0+cmVzZXJ2ZWRfYmxvY2tzICs9IGJsb2NrczsKKyAgICBzcGluX3VubG9jaygmUkVJU0VSRlNfU0Ioc2IpLT5iaXRtYXBfbG9jayk7Cit9CisKKy8qIFVucmVzZXJ2ZSBAYmxvY2tzIGFtb3VudCBvZiBibG9ja3MgaW4gZnMgcG9pbnRlZCBieSBAc2IgKi8KK3ZvaWQgcmVpc2VyZnNfcmVsZWFzZV9jbGFpbWVkX2Jsb2NrcyggCisJCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgLyogc3VwZXIgYmxvY2sgb2YKKwkJCQkJCQkgIGZpbGVzeXN0ZW0gd2hlcmUKKwkJCQkJCQkgIGJsb2NrcyBzaG91bGQgYmUKKwkJCQkJCQkgIHJlc2VydmVkICovCisJCQkJaW50IGJsb2NrcyAvKiBIb3cgbXVjaCB0byB1bnJlc2VydmUgKi8KKwkJCQkJICApCit7CisKKyAgICAvKiBGYXN0IGNhc2UsIGlmIHVucmVzZXJ2YXRpb24gaXMgemVybyAtIGV4aXQgaW1tZWRpYXRlbHkuICovCisgICAgaWYgKCAhYmxvY2tzICkKKwlyZXR1cm47CisKKyAgICBzcGluX2xvY2soJlJFSVNFUkZTX1NCKHNiKS0+Yml0bWFwX2xvY2spOworICAgIFJFSVNFUkZTX1NCKHNiKS0+cmVzZXJ2ZWRfYmxvY2tzIC09IGJsb2NrczsKKyAgICBzcGluX3VubG9jaygmUkVJU0VSRlNfU0Ioc2IpLT5iaXRtYXBfbG9jayk7CisgICAgUkZBTFNFKCBSRUlTRVJGU19TQihzYiktPnJlc2VydmVkX2Jsb2NrcyA8IDAsICJhbW91bnQgb2YgYmxvY2tzIHJlc2VydmVkIGJlY2FtZSB6ZXJvPyIpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyBob3cgbXVjaCBwYWdlcyB3ZSB3aWxsIGJlIGFibGUgdG8gd3JpdGUgdG8gRlMKKyAgIHVzZWQgZm9yIHJlaXNlcmZzX2ZpbGVfd3JpdGUoKSBwdXJwb3NlcyBmb3Igbm93LiAqLworaW50IHJlaXNlcmZzX2Nhbl9maXRfcGFnZXMgKCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiIC8qIHN1cGVyYmxvY2sgb2YgZmlsZXN5c3RlbQorCQkJCQkJICAgICAgIHRvIGVzdGltYXRlIHNwYWNlICovICkKK3sKKwlpbnQgc3BhY2U7CisKKwlzcGluX2xvY2soJlJFSVNFUkZTX1NCKHNiKS0+Yml0bWFwX2xvY2spOworCXNwYWNlID0gKFNCX0ZSRUVfQkxPQ0tTKHNiKSAtIFJFSVNFUkZTX1NCKHNiKS0+cmVzZXJ2ZWRfYmxvY2tzKSA+PiAoIFBBR0VfQ0FDSEVfU0hJRlQgLSBzYi0+c19ibG9ja3NpemVfYml0cyk7CisJc3Bpbl91bmxvY2soJlJFSVNFUkZTX1NCKHNiKS0+Yml0bWFwX2xvY2spOworCisJcmV0dXJuIHNwYWNlPjA/c3BhY2U6MDsKK30KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2Rpci5jIGIvZnMvcmVpc2VyZnMvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1MTRhOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL2Rpci5jCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAgYnkgSGFucyBSZWlzZXIsIGxpY2Vuc2luZyBnb3Zlcm5lZCBieSByZWlzZXJmcy9SRUFETUUKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitleHRlcm4gc3RydWN0IHJlaXNlcmZzX2tleSAgTUlOX0tFWTsKKworc3RhdGljIGludCByZWlzZXJmc19yZWFkZGlyIChzdHJ1Y3QgZmlsZSAqLCB2b2lkICosIGZpbGxkaXJfdCk7CitzdGF0aWMgaW50IHJlaXNlcmZzX2Rpcl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpIDsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZWlzZXJmc19kaXJfb3BlcmF0aW9ucyA9IHsKKyAgICAucmVhZAk9IGdlbmVyaWNfcmVhZF9kaXIsCisgICAgLnJlYWRkaXIJPSByZWlzZXJmc19yZWFkZGlyLAorICAgIC5mc3luYwk9IHJlaXNlcmZzX2Rpcl9mc3luYywKKyAgICAuaW9jdGwJPSByZWlzZXJmc19pb2N0bCwKK307CisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfZGlyX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBkYXRhc3luYykgeworICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworICBpbnQgZXJyOworICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKyAgZXJyID0gcmVpc2VyZnNfY29tbWl0X2Zvcl9pbm9kZShpbm9kZSkgOworICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpIDsKKyAgaWYgKGVyciA8IDApCisgICAgICByZXR1cm4gZXJyOworICByZXR1cm4gMDsKK30KKworCisjZGVmaW5lIHN0b3JlX2loKHdoZXJlLHdoYXQpIGNvcHlfaXRlbV9oZWFkICh3aGVyZSwgd2hhdCkKKworLy8KK3N0YXRpYyBpbnQgcmVpc2VyZnNfcmVhZGRpciAoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKyAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisgICAgc3RydWN0IGNwdV9rZXkgcG9zX2tleTsJLyoga2V5IG9mIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGRpcmVjdG9yeSAoa2V5IG9mIGRpcmVjdG9yeSBlbnRyeSkgKi8KKyAgICBJTklUSUFMSVpFX1BBVEggKHBhdGhfdG9fZW50cnkpOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworICAgIGludCBpdGVtX251bSwgZW50cnlfbnVtOworICAgIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBya2V5OworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgdG1wX2loOworICAgIGludCBzZWFyY2hfcmVzOworICAgIGNoYXIgKiBsb2NhbF9idWY7CisgICAgbG9mZl90IG5leHRfcG9zOworICAgIGNoYXIgc21hbGxfYnVmWzMyXSA7IC8qIGF2b2lkIGttYWxsb2MgaWYgd2UgY2FuICovCisgICAgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBkZTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCisgICAgcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChpbm9kZS0+aV9zYiwgInJlYWRkaXIiKSA7CisKKyAgICAvKiBmb3JtIGtleSBmb3Igc2VhcmNoIHRoZSBuZXh0IGRpcmVjdG9yeSBlbnRyeSB1c2luZyBmX3BvcyBmaWVsZCBvZgorICAgICAgIGZpbGUgc3RydWN0dXJlICovCisgICAgbWFrZV9jcHVfa2V5ICgmcG9zX2tleSwgaW5vZGUsIChmaWxwLT5mX3BvcykgPyAoZmlscC0+Zl9wb3MpIDogRE9UX09GRlNFVCwKKwkJICBUWVBFX0RJUkVOVFJZLCAzKTsKKyAgICBuZXh0X3BvcyA9IGNwdV9rZXlfa19vZmZzZXQgKCZwb3Nfa2V5KTsKKworICAgIC8qICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgInJlaXNlcmZzX3JlYWRkaXIgMTogZl9wb3MgPSAlTGQiLCBmaWxwLT5mX3Bvcyk7Ki8KKworICAgIHBhdGhfdG9fZW50cnkucmVhZGEgPSBQQVRIX1JFQURBOworICAgIHdoaWxlICgxKSB7CisgICAgcmVzZWFyY2g6CisJLyogc2VhcmNoIHRoZSBkaXJlY3RvcnkgaXRlbSwgY29udGFpbmluZyBlbnRyeSB3aXRoIHNwZWNpZmllZCBrZXkgKi8KKwlzZWFyY2hfcmVzID0gc2VhcmNoX2J5X2VudHJ5X2tleSAoaW5vZGUtPmlfc2IsICZwb3Nfa2V5LCAmcGF0aF90b19lbnRyeSwgJmRlKTsKKwlpZiAoc2VhcmNoX3JlcyA9PSBJT19FUlJPUikgeworCSAgICAvLyBGSVhNRTogd2UgY291bGQganVzdCBza2lwIHBhcnQgb2YgZGlyZWN0b3J5IHdoaWNoIGNvdWxkCisJICAgIC8vIG5vdCBiZSByZWFkCisJICAgIHJldCA9IC1FSU87CisJICAgIGdvdG8gb3V0OworCX0KKwllbnRyeV9udW0gPSBkZS5kZV9lbnRyeV9udW07CisJYmggPSBkZS5kZV9iaDsKKwlpdGVtX251bSA9IGRlLmRlX2l0ZW1fbnVtOworCWloID0gZGUuZGVfaWg7CisJc3RvcmVfaWggKCZ0bXBfaWgsIGloKTsKKwkJCisJLyogd2UgbXVzdCBoYXZlIGZvdW5kIGl0ZW0sIHRoYXQgaXMgaXRlbSBvZiB0aGlzIGRpcmVjdG9yeSwgKi8KKwlSRkFMU0UoIENPTVBfU0hPUlRfS0VZUyAoJihpaC0+aWhfa2V5KSwgJnBvc19rZXkpLAorCQkidnMtOTAwMDogZm91bmQgaXRlbSAlaCBkb2VzIG5vdCBtYXRjaCB0byBkaXIgd2UgcmVhZGRpciAlSyIsCisJCWloLCAmcG9zX2tleSk7CisJUkZBTFNFKCBpdGVtX251bSA+IEJfTlJfSVRFTVMgKGJoKSAtIDEsCisJCSJ2cy05MDA1IGl0ZW1fbnVtID09ICVkLCBpdGVtIGFtb3VudCA9PSAlZCIsIAorCQlpdGVtX251bSwgQl9OUl9JVEVNUyAoYmgpKTsKKyAgICAgIAorCS8qIGFuZCBlbnRyeSBtdXN0IGJlIG5vdCBtb3JlIHRoYW4gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGl0ZW0gKi8KKwlSRkFMU0UoIElfRU5UUllfQ09VTlQgKGloKSA8IGVudHJ5X251bSwKKwkJInZzLTkwMTA6IGVudHJ5IG51bWJlciBpcyB0b28gYmlnICVkICglZCkiLCAKKwkJZW50cnlfbnVtLCBJX0VOVFJZX0NPVU5UIChpaCkpOworCisJaWYgKHNlYXJjaF9yZXMgPT0gUE9TSVRJT05fRk9VTkQgfHwgZW50cnlfbnVtIDwgSV9FTlRSWV9DT1VOVCAoaWgpKSB7CisJICAgIC8qIGdvIHRocm91Z2ggYWxsIGVudHJpZXMgaW4gdGhlIGRpcmVjdG9yeSBpdGVtIGJlZ2lubmluZyBmcm9tIHRoZSBlbnRyeSwgdGhhdCBoYXMgYmVlbiBmb3VuZCAqLworCSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaCA9IEJfSV9ERUggKGJoLCBpaCkgKyBlbnRyeV9udW07CisKKwkgICAgZm9yICg7IGVudHJ5X251bSA8IElfRU5UUllfQ09VTlQgKGloKTsgZW50cnlfbnVtICsrLCBkZWggKyspIHsKKwkJaW50IGRfcmVjbGVuOworCQljaGFyICogZF9uYW1lOworCQlvZmZfdCBkX29mZjsKKwkJaW5vX3QgZF9pbm87CisKKwkJaWYgKCFkZV92aXNpYmxlIChkZWgpKQorCQkgICAgLyogaXQgaXMgaGlkZGVuIGVudHJ5ICovCisJCSAgICBjb250aW51ZTsKKwkJZF9yZWNsZW4gPSBlbnRyeV9sZW5ndGggKGJoLCBpaCwgZW50cnlfbnVtKTsKKwkJZF9uYW1lID0gQl9JX0RFSF9FTlRSWV9GSUxFX05BTUUgKGJoLCBpaCwgZGVoKTsKKwkJaWYgKCFkX25hbWVbZF9yZWNsZW4gLSAxXSkKKwkJICAgIGRfcmVjbGVuID0gc3RybGVuIChkX25hbWUpOworCQorCQlpZiAoZF9yZWNsZW4gPiBSRUlTRVJGU19NQVhfTkFNRShpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpKXsKKwkJICAgIC8qIHRvbyBiaWcgdG8gc2VuZCBiYWNrIHRvIFZGUyAqLworCQkgICAgY29udGludWUgOworCQl9CisKKyAgICAgICAgICAgICAgICAvKiBJZ25vcmUgdGhlIC5yZWlzZXJmc19wcml2IGVudHJ5ICovCisgICAgICAgICAgICAgICAgaWYgKHJlaXNlcmZzX3hhdHRycyAoaW5vZGUtPmlfc2IpICYmCisgICAgICAgICAgICAgICAgICAgICFvbGRfZm9ybWF0X29ubHkoaW5vZGUtPmlfc2IpICYmCisgICAgICAgICAgICAgICAgICAgIGZpbHAtPmZfZGVudHJ5ID09IGlub2RlLT5pX3NiLT5zX3Jvb3QgJiYKKyAgICAgICAgICAgICAgICAgICAgUkVJU0VSRlNfU0IoaW5vZGUtPmlfc2IpLT5wcml2X3Jvb3QgJiYKKyAgICAgICAgICAgICAgICAgICAgUkVJU0VSRlNfU0IoaW5vZGUtPmlfc2IpLT5wcml2X3Jvb3QtPmRfaW5vZGUgJiYKKyAgICAgICAgICAgICAgICAgICAgZGVoX29iamVjdGlkKGRlaCkgPT0gbGUzMl90b19jcHUgKElOT0RFX1BLRVkoUkVJU0VSRlNfU0IoaW5vZGUtPmlfc2IpLT5wcml2X3Jvb3QtPmRfaW5vZGUpLT5rX29iamVjdGlkKSkgeworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisJCWRfb2ZmID0gZGVoX29mZnNldCAoZGVoKTsKKwkJZmlscC0+Zl9wb3MgPSBkX29mZiA7CisJCWRfaW5vID0gZGVoX29iamVjdGlkIChkZWgpOworCQlpZiAoZF9yZWNsZW4gPD0gMzIpIHsKKwkJICBsb2NhbF9idWYgPSBzbWFsbF9idWYgOworCQl9IGVsc2UgeworCQkgICAgbG9jYWxfYnVmID0gcmVpc2VyZnNfa21hbGxvYyhkX3JlY2xlbiwgR0ZQX05PRlMsIGlub2RlLT5pX3NiKSA7CisJCSAgICBpZiAoIWxvY2FsX2J1ZikgeworCQkJcGF0aHJlbHNlICgmcGF0aF90b19lbnRyeSk7CisJCQlyZXQgPSAtRU5PTUVNIDsKKwkJCWdvdG8gb3V0OworCQkgICAgfQorCQkgICAgaWYgKGl0ZW1fbW92ZWQgKCZ0bXBfaWgsICZwYXRoX3RvX2VudHJ5KSkgeworCQkJcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLCBkX3JlY2xlbiwgaW5vZGUtPmlfc2IpIDsKKwkJCWdvdG8gcmVzZWFyY2g7CisJCSAgICB9CisJCX0KKwkJLy8gTm90ZSwgdGhhdCB3ZSBjb3B5IG5hbWUgdG8gdXNlciBzcGFjZSB2aWEgdGVtcG9yYXJ5CisJCS8vIGJ1ZmZlciAobG9jYWxfYnVmKSBiZWNhdXNlIGZpbGxkaXIgd2lsbCBibG9jayBpZgorCQkvLyB1c2VyIHNwYWNlIGJ1ZmZlciBpcyBzd2FwcGVkIG91dC4gQXQgdGhhdCB0aW1lCisJCS8vIGVudHJ5IGNhbiBtb3ZlIHRvIHNvbWV3aGVyZSBlbHNlCisJCW1lbWNweSAobG9jYWxfYnVmLCBkX25hbWUsIGRfcmVjbGVuKTsKKwkJaWYgKGZpbGxkaXIgKGRpcmVudCwgbG9jYWxfYnVmLCBkX3JlY2xlbiwgZF9vZmYsIGRfaW5vLCAKKwkJICAgICAgICAgICAgIERUX1VOS05PV04pIDwgMCkgeworCQkgICAgaWYgKGxvY2FsX2J1ZiAhPSBzbWFsbF9idWYpIHsKKwkJCXJlaXNlcmZzX2tmcmVlKGxvY2FsX2J1ZiwgZF9yZWNsZW4sIGlub2RlLT5pX3NiKSA7CisJCSAgICB9CisJCSAgICBnb3RvIGVuZDsKKwkJfQorCQlpZiAobG9jYWxfYnVmICE9IHNtYWxsX2J1ZikgeworCQkgICAgcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLCBkX3JlY2xlbiwgaW5vZGUtPmlfc2IpIDsKKwkJfQorCisJCS8vIG5leHQgZW50cnkgc2hvdWxkIGJlIGxvb2tlZCBmb3Igd2l0aCBzdWNoIG9mZnNldAorCQluZXh0X3BvcyA9IGRlaF9vZmZzZXQgKGRlaCkgKyAxOworCisJCWlmIChpdGVtX21vdmVkICgmdG1wX2loLCAmcGF0aF90b19lbnRyeSkpIHsKKwkJICAgIGdvdG8gcmVzZWFyY2g7CisJCX0KKwkgICAgfSAvKiBmb3IgKi8KKwl9CisKKwlpZiAoaXRlbV9udW0gIT0gQl9OUl9JVEVNUyAoYmgpIC0gMSkKKwkgICAgLy8gZW5kIG9mIGRpcmVjdG9yeSBoYXMgYmVlbiByZWFjaGVkCisJICAgIGdvdG8gZW5kOworCisJLyogaXRlbSB3ZSB3ZW50IHRocm91Z2ggaXMgbGFzdCBpdGVtIG9mIG5vZGUuIFVzaW5nIHJpZ2h0CisJICAgZGVsaW1pdGluZyBrZXkgY2hlY2sgaXMgaXQgZGlyZWN0b3J5IGVuZCAqLworCXJrZXkgPSBnZXRfcmtleSAoJnBhdGhfdG9fZW50cnksIGlub2RlLT5pX3NiKTsKKwlpZiAoISBjb21wX2xlX2tleXMgKHJrZXksICZNSU5fS0VZKSkgeworCSAgICAvKiBzZXQgcG9zX2tleSB0byBrZXksIHRoYXQgaXMgdGhlIHNtYWxsZXN0IGFuZCBncmVhdGVyCisJICAgICAgIHRoYXQga2V5IG9mIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBpdGVtICovCisJICAgIHNldF9jcHVfa2V5X2tfb2Zmc2V0ICgmcG9zX2tleSwgbmV4dF9wb3MpOworCSAgICBjb250aW51ZTsKKwl9CisKKwlpZiAoIENPTVBfU0hPUlRfS0VZUyAocmtleSwgJnBvc19rZXkpKSB7CisJICAgIC8vIGVuZCBvZiBkaXJlY3RvcnkgaGFzIGJlZW4gcmVhY2hlZAorCSAgICBnb3RvIGVuZDsKKwl9CisJCisJLyogZGlyZWN0b3J5IGNvbnRpbnVlcyBpbiB0aGUgcmlnaHQgbmVpZ2hib3JpbmcgYmxvY2sgKi8KKwlzZXRfY3B1X2tleV9rX29mZnNldCAoJnBvc19rZXksIGxlX2tleV9rX29mZnNldCAoS0VZX0ZPUk1BVF8zXzUsIHJrZXkpKTsKKworICAgIH0gLyogd2hpbGUgKi8KKworCisgZW5kOgorICAgIGZpbHAtPmZfcG9zID0gbmV4dF9wb3M7CisgICAgcGF0aHJlbHNlICgmcGF0aF90b19lbnRyeSk7CisgICAgcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aF90b19lbnRyeSkgOworIG91dDoKKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIGNvbXBvc2UgZGlyZWN0b3J5IGl0ZW0gY29udGFpbmluZyAiLiIgYW5kICIuLiIgZW50cmllcyAoZW50cmllcyBhcmUKKyAgIG5vdCBhbGlnbmVkIHRvIDQgYnl0ZSBib3VuZGFyeSkgKi8KKy8qIHRoZSBsYXN0IGZvdXIgcGFyYW1zIGFyZSBMRSAqLwordm9pZCBtYWtlX2VtcHR5X2Rpcl9pdGVtX3YxIChjaGFyICogYm9keSwgX191MzIgZGlyaWQsIF9fdTMyIG9iamlkLAorCQkJICAgICBfX3UzMiBwYXJfZGlyaWQsIF9fdTMyIHBhcl9vYmppZCkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaDsKKworICAgIG1lbXNldCAoYm9keSwgMCwgRU1QVFlfRElSX1NJWkVfVjEpOworICAgIGRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJvZHk7CisgICAgCisgICAgLyogZGlyZW50cnkgaGVhZGVyIG9mICIuIiAqLworICAgIHB1dF9kZWhfb2Zmc2V0KCAmKGRlaFswXSksIERPVF9PRkZTRVQgKTsKKyAgICAvKiB0aGVzZSB0d28gYXJlIGZyb20gbWFrZV9sZV9pdGVtX2hlYWQsIGFuZCBhcmUgYXJlIExFICovCisgICAgZGVoWzBdLmRlaF9kaXJfaWQgPSBkaXJpZDsKKyAgICBkZWhbMF0uZGVoX29iamVjdGlkID0gb2JqaWQ7CisgICAgZGVoWzBdLmRlaF9zdGF0ZSA9IDA7IC8qIEVuZGlhbiBzYWZlIGlmIDAgKi8KKyAgICBwdXRfZGVoX2xvY2F0aW9uKCAmKGRlaFswXSksIEVNUFRZX0RJUl9TSVpFX1YxIC0gc3RybGVuKCAiLiIgKSk7CisgICAgbWFya19kZV92aXNpYmxlKCYoZGVoWzBdKSk7CisgIAorICAgIC8qIGRpcmVudHJ5IGhlYWRlciBvZiAiLi4iICovCisgICAgcHV0X2RlaF9vZmZzZXQoICYoZGVoWzFdKSwgRE9UX0RPVF9PRkZTRVQpOworICAgIC8qIGtleSBvZiAiLi4iIGZvciB0aGUgcm9vdCBkaXJlY3RvcnkgKi8KKyAgICAvKiB0aGVzZSB0d28gYXJlIGZyb20gdGhlIGlub2RlLCBhbmQgYXJlIGFyZSBMRSAqLworICAgIGRlaFsxXS5kZWhfZGlyX2lkID0gcGFyX2RpcmlkOworICAgIGRlaFsxXS5kZWhfb2JqZWN0aWQgPSBwYXJfb2JqaWQ7CisgICAgZGVoWzFdLmRlaF9zdGF0ZSA9IDA7IC8qIEVuZGlhbiBzYWZlIGlmIDAgKi8KKyAgICBwdXRfZGVoX2xvY2F0aW9uKCAmKGRlaFsxXSksIGRlaF9sb2NhdGlvbiggJihkZWhbMF0pICkgLSBzdHJsZW4oICIuLiIgKSApOworICAgIG1hcmtfZGVfdmlzaWJsZSgmKGRlaFsxXSkpOworCisgICAgLyogY29weSAiLi4iIGFuZCAiLiIgKi8KKyAgICBtZW1jcHkgKGJvZHkgKyBkZWhfbG9jYXRpb24oICYoZGVoWzBdKSApLCAiLiIsIDEpOworICAgIG1lbWNweSAoYm9keSArIGRlaF9sb2NhdGlvbiggJihkZWhbMV0pICksICIuLiIsIDIpOworfQorCisvKiBjb21wb3NlIGRpcmVjdG9yeSBpdGVtIGNvbnRhaW5pbmcgIi4iIGFuZCAiLi4iIGVudHJpZXMgKi8KK3ZvaWQgbWFrZV9lbXB0eV9kaXJfaXRlbSAoY2hhciAqIGJvZHksIF9fdTMyIGRpcmlkLCBfX3UzMiBvYmppZCwKKwkJCSAgX191MzIgcGFyX2RpcmlkLCBfX3UzMiBwYXJfb2JqaWQpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBkZWg7CisKKyAgICBtZW1zZXQgKGJvZHksIDAsIEVNUFRZX0RJUl9TSVpFKTsKKyAgICBkZWggPSAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilib2R5OworICAgIAorICAgIC8qIGRpcmVudHJ5IGhlYWRlciBvZiAiLiIgKi8KKyAgICBwdXRfZGVoX29mZnNldCggJihkZWhbMF0pLCBET1RfT0ZGU0VUICk7CisgICAgLyogdGhlc2UgdHdvIGFyZSBmcm9tIG1ha2VfbGVfaXRlbV9oZWFkLCBhbmQgYXJlIGFyZSBMRSAqLworICAgIGRlaFswXS5kZWhfZGlyX2lkID0gZGlyaWQ7CisgICAgZGVoWzBdLmRlaF9vYmplY3RpZCA9IG9iamlkOworICAgIGRlaFswXS5kZWhfc3RhdGUgPSAwOyAvKiBFbmRpYW4gc2FmZSBpZiAwICovCisgICAgcHV0X2RlaF9sb2NhdGlvbiggJihkZWhbMF0pLCBFTVBUWV9ESVJfU0laRSAtIFJPVU5EX1VQKCBzdHJsZW4oICIuIiApICkgKTsKKyAgICBtYXJrX2RlX3Zpc2libGUoJihkZWhbMF0pKTsKKyAgCisgICAgLyogZGlyZW50cnkgaGVhZGVyIG9mICIuLiIgKi8KKyAgICBwdXRfZGVoX29mZnNldCggJihkZWhbMV0pLCBET1RfRE9UX09GRlNFVCApOworICAgIC8qIGtleSBvZiAiLi4iIGZvciB0aGUgcm9vdCBkaXJlY3RvcnkgKi8KKyAgICAvKiB0aGVzZSB0d28gYXJlIGZyb20gdGhlIGlub2RlLCBhbmQgYXJlIGFyZSBMRSAqLworICAgIGRlaFsxXS5kZWhfZGlyX2lkID0gcGFyX2RpcmlkOworICAgIGRlaFsxXS5kZWhfb2JqZWN0aWQgPSBwYXJfb2JqaWQ7CisgICAgZGVoWzFdLmRlaF9zdGF0ZSA9IDA7IC8qIEVuZGlhbiBzYWZlIGlmIDAgKi8KKyAgICBwdXRfZGVoX2xvY2F0aW9uKCAmKGRlaFsxXSksIGRlaF9sb2NhdGlvbiggJihkZWhbMF0pKSAtIFJPVU5EX1VQKCBzdHJsZW4oICIuLiIgKSApICk7CisgICAgbWFya19kZV92aXNpYmxlKCYoZGVoWzFdKSk7CisKKyAgICAvKiBjb3B5ICIuLiIgYW5kICIuIiAqLworICAgIG1lbWNweSAoYm9keSArIGRlaF9sb2NhdGlvbiggJihkZWhbMF0pICksICIuIiwgMSk7CisgICAgbWVtY3B5IChib2R5ICsgZGVoX2xvY2F0aW9uKCAmKGRlaFsxXSkgKSwgIi4uIiwgMik7Cit9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9kb19iYWxhbi5jIGIvZnMvcmVpc2VyZnMvZG9fYmFsYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTE4ZGIyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcmVpc2VyZnMvZG9fYmFsYW4uYwpAQCAtMCwwICsxLDE1OTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMCBieSBIYW5zIFJlaXNlciwgbGljZW5zaW5nIGdvdmVybmVkIGJ5IHJlaXNlcmZzL1JFQURNRQorICovCisKKy8qIE5vdyB3ZSBoYXZlIGFsbCBidWZmZXJzIHRoYXQgbXVzdCBiZSB1c2VkIGluIGJhbGFuY2luZyBvZiB0aGUgdHJlZSAJKi8KKy8qIEZ1cnRoZXIgY2FsY3VsYXRpb25zIGNhbiBub3QgY2F1c2Ugc2NoZWR1bGUoKSwgYW5kIHRodXMgdGhlIGJ1ZmZlciAJKi8KKy8qIHRyZWUgd2lsbCBiZSBzdGFibGUgdW50aWwgdGhlIGJhbGFuY2luZyB3aWxsIGJlIGZpbmlzaGVkIAkJKi8KKy8qIGJhbGFuY2UgdGhlIHRyZWUgYWNjb3JkaW5nIHRvIHRoZSBhbmFseXNpcyBtYWRlIGJlZm9yZSwJCSovCisvKiBhbmQgdXNpbmcgYnVmZmVycyBvYnRhaW5lZCBhZnRlciBhbGwgYWJvdmUuCQkJCSovCisKKworLyoqCisgKiogYmFsYW5jZV9sZWFmX3doZW5fZGVsZXRlCisgKiogYmFsYW5jZV9sZWFmCisgKiogZG9fYmFsYW5jZQorICoqCisgKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKworc3RydWN0IHRyZWVfYmFsYW5jZSAqIGN1cl90YiA9IE5VTEw7IC8qIGRldGVjdHMgd2hldGhlciBtb3JlIHRoYW4gb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weSBvZiB0YiBleGlzdHMgYXMgYSBtZWFucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGNoZWNraW5nIHdoZXRoZXIgc2NoZWR1bGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBpbnRlcnJ1cHRpbmcgZG9fYmFsYW5jZSAqLworI2VuZGlmCisKK2lubGluZSB2b2lkIGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5IChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIAorCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgaW50IGZsYWcpCit7CisgICAgam91cm5hbF9tYXJrX2RpcnR5KHRiLT50cmFuc2FjdGlvbl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgIHRiLT50cmFuc2FjdGlvbl9oYW5kbGUtPnRfc3VwZXIsIGJoKSA7Cit9CisKKyNkZWZpbmUgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5CisjZGVmaW5lIGRvX2JhbGFuY2VfbWFya19zYl9kaXJ0eSBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eQorCisKKy8qIHN1bW1hcnk6IAorIGlmIGRlbGV0aW5nIHNvbWV0aGluZyAoIHRiLT5pbnNlcnRfc2l6ZVswXSA8IDAgKQorICAgcmV0dXJuKGJhbGFuY2VfbGVhZl93aGVuX2RlbGV0ZSgpKTsgKGZsYWcgZCBoYW5kbGVkIGhlcmUpCisgZWxzZQorICAgaWYgbG51bSBpcyBsYXJnZXIgdGhhbiAwIHdlIHB1dCBpdGVtcyBpbnRvIHRoZSBsZWZ0IG5vZGUKKyAgIGlmIHJudW0gaXMgbGFyZ2VyIHRoYW4gMCB3ZSBwdXQgaXRlbXMgaW50byB0aGUgcmlnaHQgbm9kZQorICAgaWYgc251bTEgaXMgbGFyZ2VyIHRoYW4gMCB3ZSBwdXQgaXRlbXMgaW50byB0aGUgbmV3IG5vZGUgczEKKyAgIGlmIHNudW0yIGlzIGxhcmdlciB0aGFuIDAgd2UgcHV0IGl0ZW1zIGludG8gdGhlIG5ldyBub2RlIHMyIAorTm90ZSB0aGF0IGFsbCAqbnVtKiBjb3VudCBuZXcgaXRlbXMgYmVpbmcgY3JlYXRlZC4KKworSXQgd291bGQgYmUgZWFzaWVyIHRvIHJlYWQgYmFsYW5jZV9sZWFmKCkgaWYgZWFjaCBvZiB0aGVzZSBzdW1tYXJ5CitsaW5lcyB3YXMgYSBzZXBhcmF0ZSBwcm9jZWR1cmUgcmF0aGVyIHRoYW4gYmVpbmcgaW5saW5lZC4gIEkgdGhpbmsKK3RoYXQgdGhlcmUgYXJlIG1hbnkgcGFzc2FnZXMgaGVyZSBhbmQgaW4gYmFsYW5jZV9sZWFmX3doZW5fZGVsZXRlKCkgaW4KK3doaWNoIHR3byBjYWxscyB0byBvbmUgcHJvY2VkdXJlIGNhbiByZXBsYWNlIHR3byBwYXNzYWdlcywgYW5kIGl0CittaWdodCBzYXZlIGNhY2hlIHNwYWNlIGFuZCBpbXByb3ZlIHNvZnR3YXJlIG1haW50ZW5hbmNlIGNvc3RzIHRvIGRvIHNvLiAgCisKK1ZsYWRpbWlyIG1hZGUgdGhlIHBlcmNlcHRpdmUgY29tbWVudCB0aGF0IHdlIHNob3VsZCBvZmZsb2FkIG1vc3Qgb2YKK3RoZSBkZWNpc2lvbiBtYWtpbmcgaW4gdGhpcyBmdW5jdGlvbiBpbnRvIGZpeF9ub2Rlcy9jaGVja19iYWxhbmNlLCBhbmQKK3RoZW4gY3JlYXRlIHNvbWUgc29ydCBvZiBzdHJ1Y3R1cmUgaW4gdGIgdGhhdCBzYXlzIHdoYXQgYWN0aW9ucyBzaG91bGQKK2JlIHBlcmZvcm1lZCBieSBkb19iYWxhbmNlLgorCistSGFucyAqLworCisKKworLyogQmFsYW5jZSBsZWFmIG5vZGUgaW4gY2FzZSBvZiBkZWxldGUgb3IgY3V0OiBpbnNlcnRfc2l6ZVswXSA8IDAKKyAqCisgKiBsbnVtLCBybnVtIGNhbiBoYXZlIHZhbHVlcyA+PSAtMQorICoJLTEgbWVhbnMgdGhhdCB0aGUgbmVpZ2hib3IgbXVzdCBiZSBqb2luZWQgd2l0aCBTCisgKgkgMCBtZWFucyB0aGF0IG5vdGhpbmcgc2hvdWxkIGJlIGRvbmUgd2l0aCB0aGUgbmVpZ2hib3IKKyAqCT4wIG1lYW5zIHRvIHNoaWZ0IGVudGlyZWx5IG9yIHBhcnRseSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBpdGVtcyB0byB0aGUgbmVpZ2hib3IKKyAqLworc3RhdGljIGludCBiYWxhbmNlX2xlYWZfd2hlbl9kZWxldGUgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGZsYWcpCit7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogdGJTMCA9IFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCk7CisgICAgaW50IGl0ZW1fcG9zID0gUEFUSF9MQVNUX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCk7CisgICAgaW50IHBvc19pbl9pdGVtID0gdGItPnRiX3BhdGgtPnBvc19pbl9pdGVtOworICAgIHN0cnVjdCBidWZmZXJfaW5mbyBiaTsKKyAgICBpbnQgbjsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7CisKKyAgICBSRkFMU0UoIHRiLT5GUlswXSAmJiBCX0xFVkVMICh0Yi0+RlJbMF0pICE9IERJU0tfTEVBRl9OT0RFX0xFVkVMICsgMSwKKwkgICAgInZzLSAxMjAwMDogbGV2ZWw6IHdyb25nIEZSICV6IiwgdGItPkZSWzBdKTsKKyAgICBSRkFMU0UoIHRiLT5ibGtudW1bMF0gPiAxLAorCSAgICAiUEFQLTEyMDA1OiB0Yi0+YmxrbnVtID09ICVkLCBjYW4gbm90IGJlID4gMSIsIHRiLT5ibGtudW1bMF0pOworICAgIFJGQUxTRSggISB0Yi0+YmxrbnVtWzBdICYmICEgUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIDApLAorCSAgICAiUEFQLTEyMDEwOiB0cmVlIGNhbiBub3QgYmUgZW1wdHkiKTsKKworICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKHRiUzAsIGl0ZW1fcG9zKTsKKworICAgIC8qIERlbGV0ZSBvciB0cnVuY2F0ZSB0aGUgaXRlbSAqLworCisgICAgc3dpdGNoIChmbGFnKSB7CisgICAgY2FzZSBNX0RFTEVURTogICAvKiBkZWxldGUgaXRlbSBpbiBTWzBdICovCisKKwlSRkFMU0UoIGloX2l0ZW1fbGVuKGloKSArIElIX1NJWkUgIT0gLXRiLT5pbnNlcnRfc2l6ZVswXSwKKwkgICAgICAgICJ2cy0xMjAxMzogbW9kZSBEZWxldGUsIGluc2VydCBzaXplICVkLCBpaCB0byBiZSBkZWxldGVkICVoIiwKKyAJCSAtdGItPmluc2VydF9zaXplIFswXSwgaWgpOworCisJYmkudGIgPSB0YjsKKwliaS5iaV9iaCA9IHRiUzA7CisJYmkuYmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKTsKKwliaS5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIDEpOworCWxlYWZfZGVsZXRlX2l0ZW1zICgmYmksIDAsIGl0ZW1fcG9zLCAxLCAtMSk7CisKKwlpZiAoICEgaXRlbV9wb3MgJiYgdGItPkNGTFswXSApIHsKKwkgICAgaWYgKCBCX05SX0lURU1TKHRiUzApICkgeworCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGTFswXSx0Yi0+bGtleVswXSx0YlMwLDApOworCSAgICB9CisJICAgIGVsc2UgeworCQlpZiAoICEgUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSkgKQorCQkgICAgcmVwbGFjZV9rZXkodGIsIHRiLT5DRkxbMF0sdGItPmxrZXlbMF0sUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIDApLDApOworCSAgICB9CisJfSAKKworCVJGQUxTRSggISBpdGVtX3BvcyAmJiAhdGItPkNGTFswXSwKKwkJIlBBUC0xMjAyMDogdGItPkNGTFswXT09JXAsIHRiLT5MWzBdPT0lcCIsIHRiLT5DRkxbMF0sIHRiLT5MWzBdKTsKKyAgICAKKwlicmVhazsKKworICAgIGNhc2UgTV9DVVQ6IHsgIC8qIGN1dCBpdGVtIGluIFNbMF0gKi8KKwliaS50YiA9IHRiOworCWJpLmJpX2JoID0gdGJTMDsKKwliaS5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApOworCWJpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSk7CisJaWYgKGlzX2RpcmVudHJ5X2xlX2loIChpaCkpIHsKKworCSAgICAvKiBVRlMgdW5saW5rIHNlbWFudGljcyBhcmUgc3VjaCB0aGF0IHlvdSBjYW4gb25seSBkZWxldGUgb25lIGRpcmVjdG9yeSBlbnRyeSBhdCBhIHRpbWUuICovCisJICAgIC8qIHdoZW4gd2UgY3V0IGEgZGlyZWN0b3J5IHRiLT5pbnNlcnRfc2l6ZVswXSBtZWFucyBudW1iZXIgb2YgZW50cmllcyB0byBiZSBjdXQgKGFsd2F5cyAxKSAqLworCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAtMTsKKwkgICAgbGVhZl9jdXRfZnJvbV9idWZmZXIgKCZiaSwgaXRlbV9wb3MsIHBvc19pbl9pdGVtLCAtdGItPmluc2VydF9zaXplWzBdKTsKKworCSAgICBSRkFMU0UoICEgaXRlbV9wb3MgJiYgISBwb3NfaW5faXRlbSAmJiAhIHRiLT5DRkxbMF0sCisJCSAgICAiUEFQLTEyMDMwOiBjYW4gbm90IGNoYW5nZSBkZWxpbWl0aW5nIGtleS4gQ0ZMWzBdPSVwIiwgCisJCSAgICB0Yi0+Q0ZMWzBdKTsKKworCSAgICBpZiAoICEgaXRlbV9wb3MgJiYgISBwb3NfaW5faXRlbSAmJiB0Yi0+Q0ZMWzBdICkgeworCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGTFswXSx0Yi0+bGtleVswXSx0YlMwLDApOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgbGVhZl9jdXRfZnJvbV9idWZmZXIgKCZiaSwgaXRlbV9wb3MsIHBvc19pbl9pdGVtLCAtdGItPmluc2VydF9zaXplWzBdKTsKKworCSAgICBSRkFMU0UoICEgaWhfaXRlbV9sZW4oaWgpLAorCQkiUEFQLTEyMDM1OiBjdXQgbXVzdCBsZWF2ZSBub24temVybyBkeW5hbWljIGxlbmd0aCBvZiBpdGVtIik7CisJfQorCWJyZWFrOworICAgIH0KKworICAgIGRlZmF1bHQ6CisJcHJpbnRfY3VyX3RiICgiMTIwNDAiKTsKKwlyZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiUEFQLTEyMDQwOiBiYWxhbmNlX2xlYWZfd2hlbl9kZWxldGU6IHVuZXhwZWN0YWJsZSBtb2RlOiAlcyglZCkiLAorCQkJKGZsYWcgPT0gTV9QQVNURSkgPyAiUEFTVEUiIDogKChmbGFnID09IE1fSU5TRVJUKSA/ICJJTlNFUlQiIDogIlVOS05PV04iKSwgZmxhZyk7CisgICAgfQorCisgICAgLyogdGhlIHJ1bGUgaXMgdGhhdCBubyBzaGlmdGluZyBvY2N1cnMgdW5sZXNzIGJ5IHNoaWZ0aW5nIGEgbm9kZSBjYW4gYmUgZnJlZWQgKi8KKyAgICBuID0gQl9OUl9JVEVNUyh0YlMwKTsKKyAgICBpZiAoIHRiLT5sbnVtWzBdICkgICAgIC8qIExbMF0gdGFrZXMgcGFydCBpbiBiYWxhbmNpbmcgKi8KKyAgICB7CisJaWYgKCB0Yi0+bG51bVswXSA9PSAtMSApICAgIC8qIExbMF0gbXVzdCBiZSBqb2luZWQgd2l0aCBTWzBdICovCisJeworCSAgICBpZiAoIHRiLT5ybnVtWzBdID09IC0xICkgICAgLyogUlswXSBtdXN0IGJlIGFsc28gam9pbmVkIHdpdGggU1swXSAqLworCSAgICB7CQkJCisJCWlmICggdGItPkZSWzBdID09IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKSApCisJCXsKKwkJICAgIC8qIGFsbCBjb250ZW50cyBvZiBhbGwgdGhlIDMgYnVmZmVycyB3aWxsIGJlIGluIExbMF0gKi8KKwkJICAgIGlmICggUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSkgPT0gMCAmJiAxIDwgQl9OUl9JVEVNUyh0Yi0+RlJbMF0pICkKKwkJCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZMWzBdLHRiLT5sa2V5WzBdLHRiLT5GUlswXSwxKTsKKworCQkgICAgbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19MLCB0YiwgbiwgLTEsIE5VTEwpOworCQkgICAgbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fUl9UT19MLCB0YiwgQl9OUl9JVEVNUyh0Yi0+UlswXSksIC0xLCBOVUxMKTsKKworCQkgICAgcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIgKHRiLCB0YlMwKTsKKwkJICAgIHJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyICh0YiwgdGItPlJbMF0pOworCisJCSAgICByZXR1cm4gMDsKKwkJfQorCQkvKiBhbGwgY29udGVudHMgb2YgYWxsIHRoZSAzIGJ1ZmZlcnMgd2lsbCBiZSBpbiBSWzBdICovCisJCWxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX1NfVE9fUiwgdGIsIG4sIC0xLCBOVUxMKTsKKwkJbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fTF9UT19SLCB0YiwgQl9OUl9JVEVNUyh0Yi0+TFswXSksIC0xLCBOVUxMKTsKKworCQkvKiByaWdodF9kZWxpbWl0aW5nX2tleSBpcyBjb3JyZWN0IGluIFJbMF0gKi8KKwkJcmVwbGFjZV9rZXkodGIsIHRiLT5DRlJbMF0sdGItPnJrZXlbMF0sdGItPlJbMF0sMCk7CisKKwkJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIgKHRiLCB0YlMwKTsKKwkJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIgKHRiLCB0Yi0+TFswXSk7CisKKwkJcmV0dXJuIC0xOworCSAgICB9CisKKwkgICAgUkZBTFNFKCB0Yi0+cm51bVswXSAhPSAwLCAKKwkJICAgICJQQVAtMTIwNDU6IHJudW0gbXVzdCBiZSAwICglZCkiLCB0Yi0+cm51bVswXSk7CisJICAgIC8qIGFsbCBjb250ZW50cyBvZiBMWzBdIGFuZCBTWzBdIHdpbGwgYmUgaW4gTFswXSAqLworCSAgICBsZWFmX3NoaWZ0X2xlZnQodGIsIG4sIC0xKTsKKworCSAgICByZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlciAodGIsIHRiUzApOworCisJICAgIHJldHVybiAwOworCX0KKwkvKiBhIHBhcnQgb2YgY29udGVudHMgb2YgU1swXSB3aWxsIGJlIGluIExbMF0gYW5kIHRoZSByZXN0IHBhcnQgb2YgU1swXSB3aWxsIGJlIGluIFJbMF0gKi8KKworCVJGQUxTRSggKCB0Yi0+bG51bVswXSArIHRiLT5ybnVtWzBdIDwgbiApIHx8IAorCQkoIHRiLT5sbnVtWzBdICsgdGItPnJudW1bMF0gPiBuKzEgKSwKKwkJIlBBUC0xMjA1MDogcm51bSglZCkgYW5kIGxudW0oJWQpIGFuZCBpdGVtIG51bWJlciglZCkgaW4gU1swXSBhcmUgbm90IGNvbnNpc3RlbnQiLAorCQl0Yi0+cm51bVswXSwgdGItPmxudW1bMF0sIG4pOworCVJGQUxTRSggKCB0Yi0+bG51bVswXSArIHRiLT5ybnVtWzBdID09IG4gKSAmJiAKKwkJKHRiLT5sYnl0ZXMgIT0gLTEgfHwgdGItPnJieXRlcyAhPSAtMSksCisJCSJQQVAtMTIwNTU6IGJhZCByYnl0ZXMgKCVkKS9sYnl0ZXMgKCVkKSBwYXJhbWV0ZXJzIHdoZW4gaXRlbXMgYXJlIG5vdCBzcGxpdCIsIAorCQl0Yi0+cmJ5dGVzLCB0Yi0+bGJ5dGVzKTsKKwlSRkFMU0UoICggdGItPmxudW1bMF0gKyB0Yi0+cm51bVswXSA9PSBuICsgMSApICYmIAorCQkodGItPmxieXRlcyA8IDEgfHwgdGItPnJieXRlcyAhPSAtMSksCisJCSJQQVAtMTIwNjA6IGJhZCByYnl0ZXMgKCVkKS9sYnl0ZXMgKCVkKSBwYXJhbWV0ZXJzIHdoZW4gaXRlbXMgYXJlIHNwbGl0IiwgCisJCXRiLT5yYnl0ZXMsIHRiLT5sYnl0ZXMpOworCisJbGVhZl9zaGlmdF9sZWZ0ICh0YiwgdGItPmxudW1bMF0sIHRiLT5sYnl0ZXMpOworCWxlYWZfc2hpZnRfcmlnaHQodGIsIHRiLT5ybnVtWzBdLCB0Yi0+cmJ5dGVzKTsKKworCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyICh0YiwgdGJTMCk7CisKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIHRiLT5ybnVtWzBdID09IC0xICkgeworCS8qIGFsbCBjb250ZW50cyBvZiBSWzBdIGFuZCBTWzBdIHdpbGwgYmUgaW4gUlswXSAqLworCWxlYWZfc2hpZnRfcmlnaHQodGIsIG4sIC0xKTsKKwlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlciAodGIsIHRiUzApOworCXJldHVybiAwOworICAgIH0KKworICAgIFJGQUxTRSggdGItPnJudW1bMF0sIAorCSAgICAiUEFQLTEyMDY1OiBiYWQgcm51bSBwYXJhbWV0ZXIgbXVzdCBiZSAwICglZCkiLCB0Yi0+cm51bVswXSk7CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBiYWxhbmNlX2xlYWYgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwKKwkJCSBzdHJ1Y3QgaXRlbV9oZWFkICogaWgsCQkvKiBpdGVtIGhlYWRlciBvZiBpbnNlcnRlZCBpdGVtICh0aGlzIGlzIG9uIGxpdHRsZSBlbmRpYW4pICovCisJCQkgY29uc3QgY2hhciAqIGJvZHksCQkvKiBib2R5ICBvZiBpbnNlcnRlZCBpdGVtIG9yIGJ5dGVzIHRvIHBhc3RlICovCisJCQkgaW50IGZsYWcsCQkJLyogaSAtIGluc2VydCwgZCAtIGRlbGV0ZSwgYyAtIGN1dCwgcCAtIHBhc3RlCisJCQkJCQkJICAgKHNlZSBjb21tZW50IHRvIGRvX2JhbGFuY2UpICovCisJCQkgc3RydWN0IGl0ZW1faGVhZCAqIGluc2VydF9rZXksICAvKiBpbiBvdXIgcHJvY2Vzc2luZyBvZiBvbmUgbGV2ZWwgd2Ugc29tZXRpbWVzIGRldGVybWluZSB3aGF0CisJCQkJCQkJICAgIG11c3QgYmUgaW5zZXJ0ZWQgaW50byB0aGUgbmV4dCBoaWdoZXIgbGV2ZWwuICBUaGlzIGluc2VydGlvbgorCQkJCQkJCSAgICBjb25zaXN0cyBvZiBhIGtleSBvciB0d28ga2V5cyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZworCQkJCQkJCSAgICBwb2ludGVycyAqLworCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqKiBpbnNlcnRfcHRyIC8qIGluc2VydGVkIG5vZGUtcHRycyBmb3IgdGhlIG5leHQgbGV2ZWwgKi8KKyAgICApCit7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogdGJTMCA9IFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCk7CisgICAgaW50IGl0ZW1fcG9zID0gUEFUSF9MQVNUX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCk7CS8qICBpbmRleCBpbnRvIHRoZSBhcnJheSBvZiBpdGVtIGhlYWRlcnMgaW4gU1swXSAKKwkJCQkJCQkgICAgb2YgdGhlIGFmZmVjdGVkIGl0ZW0gKi8KKyAgICBzdHJ1Y3QgYnVmZmVyX2luZm8gYmk7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpTX25ld1syXTsgIC8qIG5ldyBub2RlcyBhbGxvY2F0ZWQgdG8gaG9sZCB3aGF0IGNvdWxkIG5vdCBmaXQgaW50byBTICovCisgICAgaW50IHNudW1bMl07CSAgICAvKiBudW1iZXIgb2YgaXRlbXMgdGhhdCB3aWxsIGJlIHBsYWNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG8gU19uZXcgKGluY2x1ZGVzIHBhcnRpYWxseSBzaGlmdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMpICovCisgICAgaW50IHNieXRlc1syXTsgICAgICAgICAgLyogaWYgYW4gaXRlbSBpcyBwYXJ0aWFsbHkgc2hpZnRlZCBpbnRvIFNfbmV3IHRoZW4gCisJCQkgICAgICAgaWYgaXQgaXMgYSBkaXJlY3RvcnkgaXRlbSAKKwkJCSAgICAgICBpdCBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgZnJvbSB0aGUgaXRlbSB0aGF0IGFyZSBzaGlmdGVkIGludG8gU19uZXcKKwkJCSAgICAgICBlbHNlCisJCQkgICAgICAgaXQgaXMgdGhlIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBpdGVtIHRoYXQgYXJlIHNoaWZ0ZWQgaW50byBTX25ldworCQkJICAgICovCisgICAgaW50IG4sIGk7CisgICAgaW50IHJldF92YWw7CisgICAgaW50IHBvc19pbl9pdGVtOworICAgIGludCB6ZXJvc19udW07CisKKyAgICBQUk9DX0lORk9fSU5DKCB0YiAtPiB0Yl9zYiwgYmFsYW5jZV9hdFsgMCBdICk7CisKKyAgICAvKiBNYWtlIGJhbGFuY2UgaW4gY2FzZSBpbnNlcnRfc2l6ZVswXSA8IDAgKi8KKyAgICBpZiAoIHRiLT5pbnNlcnRfc2l6ZVswXSA8IDAgKQorCXJldHVybiBiYWxhbmNlX2xlYWZfd2hlbl9kZWxldGUgKHRiLCBmbGFnKTsKKyAgCisgICAgemVyb3NfbnVtID0gMDsKKyAgICBpZiAoZmxhZyA9PSBNX0lOU0VSVCAmJiBib2R5ID09IDApCisJemVyb3NfbnVtID0gaWhfaXRlbV9sZW4oIGloICk7CisKKyAgICBwb3NfaW5faXRlbSA9IHRiLT50Yl9wYXRoLT5wb3NfaW5faXRlbTsKKyAgICAvKiBmb3IgaW5kaXJlY3QgaXRlbSBwb3NfaW5faXRlbSBpcyBtZWFzdXJlZCBpbiB1bmZvcm1hdHRlZCBub2RlCisgICAgICAgcG9pbnRlcnMuIFJlY2FsY3VsYXRlIHRvIGJ5dGVzICovCisgICAgaWYgKGZsYWcgIT0gTV9JTlNFUlQgJiYgaXNfaW5kaXJlY3RfbGVfaWggKEJfTl9QSVRFTV9IRUFEICh0YlMwLCBpdGVtX3BvcykpKQorCXBvc19pbl9pdGVtICo9IFVORk1fUF9TSVpFOworCisgICAgaWYgKCB0Yi0+bG51bVswXSA+IDAgKSB7CisJLyogU2hpZnQgbG51bVswXSBpdGVtcyBmcm9tIFNbMF0gdG8gdGhlIGxlZnQgbmVpZ2hib3IgTFswXSAqLworCWlmICggaXRlbV9wb3MgPCB0Yi0+bG51bVswXSApIHsKKwkgICAgLyogbmV3IGl0ZW0gb3IgaXQgcGFydCBmYWxscyB0byBMWzBdLCBzaGlmdCBpdCB0b28gKi8KKwkgICAgbiA9IEJfTlJfSVRFTVModGItPkxbMF0pOworCisJICAgIHN3aXRjaCAoZmxhZykgeworCSAgICBjYXNlIE1fSU5TRVJUOiAgIC8qIGluc2VydCBpdGVtIGludG8gTFswXSAqLworCisJCWlmICggaXRlbV9wb3MgPT0gdGItPmxudW1bMF0gLSAxICYmIHRiLT5sYnl0ZXMgIT0gLTEgKSB7CisJCSAgICAvKiBwYXJ0IG9mIG5ldyBpdGVtIGZhbGxzIGludG8gTFswXSAqLworCQkgICAgaW50IG5ld19pdGVtX2xlbjsKKwkJICAgIGludCB2ZXJzaW9uOworCisJCSAgICByZXRfdmFsID0gbGVhZl9zaGlmdF9sZWZ0ICh0YiwgdGItPmxudW1bMF0tMSwgLTEpOworCisJCSAgICAvKiBDYWxjdWxhdGUgaXRlbSBsZW5ndGggdG8gaW5zZXJ0IHRvIFNbMF0gKi8KKwkJICAgIG5ld19pdGVtX2xlbiA9IGloX2l0ZW1fbGVuKGloKSAtIHRiLT5sYnl0ZXM7CisJCSAgICAvKiBDYWxjdWxhdGUgYW5kIGNoZWNrIGl0ZW0gbGVuZ3RoIHRvIGluc2VydCB0byBMWzBdICovCisJCSAgICBwdXRfaWhfaXRlbV9sZW4oaWgsIGloX2l0ZW1fbGVuKGloKSAtIG5ld19pdGVtX2xlbiApOworCisJCSAgICBSRkFMU0UoIGloX2l0ZW1fbGVuKGloKSA8PSAwLAorCQkJICAgICJQQVAtMTIwODA6IHRoZXJlIGlzIG5vdGhpbmcgdG8gaW5zZXJ0IGludG8gTFswXTogaWhfaXRlbV9sZW49JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGloX2l0ZW1fbGVuKGloKSk7CisKKwkJICAgIC8qIEluc2VydCBuZXcgaXRlbSBpbnRvIExbMF0gKi8KKwkJICAgIGJpLnRiID0gdGI7CisJCSAgICBiaS5iaV9iaCA9IHRiLT5MWzBdOworCQkgICAgYmkuYmlfcGFyZW50ID0gdGItPkZMWzBdOworCQkgICAgYmkuYmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOworCQkgICAgbGVhZl9pbnNlcnRfaW50b19idWYgKCZiaSwgbiArIGl0ZW1fcG9zIC0gcmV0X3ZhbCwgaWgsIGJvZHksCisJCQkJCSAgemVyb3NfbnVtID4gaWhfaXRlbV9sZW4oaWgpID8gaWhfaXRlbV9sZW4oaWgpIDogemVyb3NfbnVtKTsKKworCQkgICAgdmVyc2lvbiA9IGloX3ZlcnNpb24gKGloKTsKKworCQkgICAgLyogQ2FsY3VsYXRlIGtleSBjb21wb25lbnQsIGl0ZW0gbGVuZ3RoIGFuZCBib2R5IHRvIGluc2VydCBpbnRvIFNbMF0gKi8KKyAgICAgICAgICAgICAgICAgICAgc2V0X2xlX2loX2tfb2Zmc2V0KCBpaCwgbGVfaWhfa19vZmZzZXQoIGloICkgKyAodGItPmxieXRlcyA8PCAoaXNfaW5kaXJlY3RfbGVfaWgoaWgpP3RiLT50Yl9zYi0+c19ibG9ja3NpemVfYml0cyAtIFVORk1fUF9TSElGVDowKSkgKTsKKworCQkgICAgcHV0X2loX2l0ZW1fbGVuKCBpaCwgbmV3X2l0ZW1fbGVuICk7CisJCSAgICBpZiAoIHRiLT5sYnl0ZXMgPiAgemVyb3NfbnVtICkgeworCQkJYm9keSArPSAodGItPmxieXRlcyAtIHplcm9zX251bSk7CisJCQl6ZXJvc19udW0gPSAwOworCQkgICAgfQorCQkgICAgZWxzZQorCQkJemVyb3NfbnVtIC09IHRiLT5sYnl0ZXM7CisKKwkJICAgIFJGQUxTRSggaWhfaXRlbV9sZW4oaWgpIDw9IDAsCisJCQkiUEFQLTEyMDg1OiB0aGVyZSBpcyBub3RoaW5nIHRvIGluc2VydCBpbnRvIFNbMF06IGloX2l0ZW1fbGVuPSVkIiwKKwkJCWloX2l0ZW1fbGVuKGloKSk7CisJCX0gZWxzZSB7CisJCSAgICAvKiBuZXcgaXRlbSBpbiB3aG9sZSBmYWxscyBpbnRvIExbMF0gKi8KKwkJICAgIC8qIFNoaWZ0IGxudW1bMF0tMSBpdGVtcyB0byBMWzBdICovCisJCSAgICByZXRfdmFsID0gbGVhZl9zaGlmdF9sZWZ0KHRiLCB0Yi0+bG51bVswXS0xLCB0Yi0+bGJ5dGVzKTsKKwkJICAgIC8qIEluc2VydCBuZXcgaXRlbSBpbnRvIExbMF0gKi8KKwkJICAgIGJpLnRiID0gdGI7CisJCSAgICBiaS5iaV9iaCA9IHRiLT5MWzBdOworCQkgICAgYmkuYmlfcGFyZW50ID0gdGItPkZMWzBdOworCQkgICAgYmkuYmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOworCQkgICAgbGVhZl9pbnNlcnRfaW50b19idWYgKCZiaSwgbiArIGl0ZW1fcG9zIC0gcmV0X3ZhbCwgaWgsIGJvZHksIHplcm9zX251bSk7CisJCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQkgICAgemVyb3NfbnVtID0gMDsKKwkJfQorCQlicmVhazsKKworCSAgICBjYXNlIE1fUEFTVEU6ICAgLyogYXBwZW5kIGl0ZW0gaW4gTFswXSAqLworCisJCWlmICggaXRlbV9wb3MgPT0gdGItPmxudW1bMF0gLSAxICYmIHRiLT5sYnl0ZXMgIT0gLTEgKSB7CisJCSAgICAvKiB3ZSBtdXN0IHNoaWZ0IHRoZSBwYXJ0IG9mIHRoZSBhcHBlbmRlZCBpdGVtICovCisJCSAgICBpZiAoIGlzX2RpcmVudHJ5X2xlX2loIChCX05fUElURU1fSEVBRCAodGJTMCwgaXRlbV9wb3MpKSkgeworCisJCQlSRkFMU0UoIHplcm9zX251bSwKKwkJCQkiUEFQLTEyMDkwOiBpbnZhbGlkIHBhcmFtZXRlciBpbiBjYXNlIG9mIGEgZGlyZWN0b3J5Iik7CisJCQkvKiBkaXJlY3RvcnkgaXRlbSAqLworCQkJaWYgKCB0Yi0+bGJ5dGVzID4gcG9zX2luX2l0ZW0gKSB7CisJCQkgICAgLyogbmV3IGRpcmVjdG9yeSBlbnRyeSBmYWxscyBpbnRvIExbMF0gKi8KKwkJCSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogcGFzdGVkOworCQkJICAgIGludCBsX3Bvc19pbl9pdGVtID0gcG9zX2luX2l0ZW07CisJCQkJCQkJICAKKwkJCSAgICAvKiBTaGlmdCBsbnVtWzBdIC0gMSBpdGVtcyBpbiB3aG9sZS4gU2hpZnQgbGJ5dGVzIC0gMSBlbnRyaWVzIGZyb20gZ2l2ZW4gZGlyZWN0b3J5IGl0ZW0gKi8KKwkJCSAgICByZXRfdmFsID0gbGVhZl9zaGlmdF9sZWZ0KHRiLCB0Yi0+bG51bVswXSwgdGItPmxieXRlcyAtIDEpOworCQkJICAgIGlmICggcmV0X3ZhbCAmJiAhIGl0ZW1fcG9zICkgeworCQkJCXBhc3RlZCA9ICBCX05fUElURU1fSEVBRCh0Yi0+TFswXSxCX05SX0lURU1TKHRiLT5MWzBdKS0xKTsKKwkJCQlsX3Bvc19pbl9pdGVtICs9IElfRU5UUllfQ09VTlQocGFzdGVkKSAtICh0Yi0+bGJ5dGVzLTEpOworCQkJICAgIH0KKworCQkJICAgIC8qIEFwcGVuZCBnaXZlbiBkaXJlY3RvcnkgZW50cnkgdG8gZGlyZWN0b3J5IGl0ZW0gKi8KKwkJCSAgICBiaS50YiA9IHRiOworCQkJICAgIGJpLmJpX2JoID0gdGItPkxbMF07CisJCQkgICAgYmkuYmlfcGFyZW50ID0gdGItPkZMWzBdOworCQkJICAgIGJpLmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKKwkJCSAgICBsZWFmX3Bhc3RlX2luX2J1ZmZlciAoJmJpLCBuICsgaXRlbV9wb3MgLSByZXRfdmFsLCBsX3Bvc19pbl9pdGVtLAorCQkJCQkJICB0Yi0+aW5zZXJ0X3NpemVbMF0sIGJvZHksIHplcm9zX251bSk7CisKKwkJCSAgICAvKiBwcmV2aW91cyBzdHJpbmcgcHJlcGFyZWQgc3BhY2UgZm9yIHBhc3RpbmcgbmV3IGVudHJ5LCBmb2xsb3dpbmcgc3RyaW5nIHBhc3RlcyB0aGlzIGVudHJ5ICovCisKKwkJCSAgICAvKiB3aGVuIHdlIGhhdmUgbWVyZ2UgZGlyZWN0b3J5IGl0ZW0sIHBvc19pbl9pdGVtIGhhcyBiZWVuIGNoYW5nZWQgdG9vICovCisKKwkJCSAgICAvKiBwYXN0ZSBuZXcgZGlyZWN0b3J5IGVudHJ5LiAxIGlzIGVudHJ5IG51bWJlciAqLworCQkJICAgIGxlYWZfcGFzdGVfZW50cmllcyAoYmkuYmlfYmgsIG4gKyBpdGVtX3BvcyAtIHJldF92YWwsIGxfcG9zX2luX2l0ZW0sIDEsCisJCQkJCQkoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilib2R5LCAKKwkJCQkJCWJvZHkgKyBERUhfU0laRSwgdGItPmluc2VydF9zaXplWzBdCisJCQkJKTsKKwkJCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQkJfSBlbHNlIHsKKwkJCSAgICAvKiBuZXcgZGlyZWN0b3J5IGl0ZW0gZG9lc24ndCBmYWxsIGludG8gTFswXSAqLworCQkJICAgIC8qIFNoaWZ0IGxudW1bMF0tMSBpdGVtcyBpbiB3aG9sZS4gU2hpZnQgbGJ5dGVzIGRpcmVjdG9yeSBlbnRyaWVzIGZyb20gZGlyZWN0b3J5IGl0ZW0gbnVtYmVyIGxudW1bMF0gKi8KKwkJCSAgICBsZWFmX3NoaWZ0X2xlZnQgKHRiLCB0Yi0+bG51bVswXSwgdGItPmxieXRlcyk7CisJCQl9CisJCQkvKiBDYWxjdWxhdGUgbmV3IHBvc2l0aW9uIHRvIGFwcGVuZCBpbiBpdGVtIGJvZHkgKi8KKwkJCXBvc19pbl9pdGVtIC09IHRiLT5sYnl0ZXM7CisJCSAgICB9CisJCSAgICBlbHNlIHsKKwkJCS8qIHJlZ3VsYXIgb2JqZWN0ICovCisJCQlSRkFMU0UoIHRiLT5sYnl0ZXMgPD0gMCwKKwkJCSAgICAgICAgIlBBUC0xMjA5NTogdGhlcmUgaXMgbm90aGluZyB0byBzaGlmdCB0byBMWzBdLiBsYnl0ZXM9JWQiLAorCQkJCXRiLT5sYnl0ZXMpOworCQkJUkZBTFNFKCBwb3NfaW5faXRlbSAhPSBpaF9pdGVtX2xlbihCX05fUElURU1fSEVBRCh0YlMwLCBpdGVtX3BvcykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUEFQLTEyMTAwOiBpbmNvcnJlY3QgcG9zaXRpb24gdG8gcGFzdGU6IGl0ZW1fbGVuPSVkLCBwb3NfaW5faXRlbT0lZCIsCisJCQkJaWhfaXRlbV9sZW4oQl9OX1BJVEVNX0hFQUQodGJTMCxpdGVtX3BvcykpLCBwb3NfaW5faXRlbSk7CisKKwkJCWlmICggdGItPmxieXRlcyA+PSBwb3NfaW5faXRlbSApIHsKKwkJCSAgICAvKiBhcHBlbmRlZCBpdGVtIHdpbGwgYmUgaW4gTFswXSBpbiB3aG9sZSAqLworCQkJICAgIGludCBsX247CisKKwkJCSAgICAvKiB0aGlzIGJ5dGVzIG51bWJlciBtdXN0IGJlIGFwcGVuZGVkIHRvIHRoZSBsYXN0IGl0ZW0gb2YgTFtoXSAqLworCQkJICAgIGxfbiA9IHRiLT5sYnl0ZXMgLSBwb3NfaW5faXRlbTsKKworCQkJICAgIC8qIENhbGN1bGF0ZSBuZXcgaW5zZXJ0X3NpemVbMF0gKi8KKwkJCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gLT0gbF9uOworCisJCQkgICAgUkZBTFNFKCB0Yi0+aW5zZXJ0X3NpemVbMF0gPD0gMCwKKwkJCQkgICAgIlBBUC0xMjEwNTogdGhlcmUgaXMgbm90aGluZyB0byBwYXN0ZSBpbnRvIExbMF0uIGluc2VydF9zaXplPSVkIiwKKwkJCQkgICAgdGItPmluc2VydF9zaXplWzBdKTsKKwkJCSAgICByZXRfdmFsID0gIGxlYWZfc2hpZnRfbGVmdCh0Yix0Yi0+bG51bVswXSwgCisJCQkJCQkgICAgICAgaWhfaXRlbV9sZW4oQl9OX1BJVEVNX0hFQUQodGJTMCxpdGVtX3BvcykpKTsKKwkJCSAgICAvKiBBcHBlbmQgdG8gYm9keSBvZiBpdGVtIGluIExbMF0gKi8KKwkJCSAgICBiaS50YiA9IHRiOworCQkJICAgIGJpLmJpX2JoID0gdGItPkxbMF07CisJCQkgICAgYmkuYmlfcGFyZW50ID0gdGItPkZMWzBdOworCQkJICAgIGJpLmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKKwkJCSAgICBsZWFmX3Bhc3RlX2luX2J1ZmZlcigKKwkJCQkmYmksbiArIGl0ZW1fcG9zIC0gcmV0X3ZhbCwKKwkJCQlpaF9pdGVtX2xlbiggQl9OX1BJVEVNX0hFQUQodGItPkxbMF0sbitpdGVtX3Bvcy1yZXRfdmFsKSksCisJCQkJbF9uLGJvZHksIHplcm9zX251bSA+IGxfbiA/IGxfbiA6IHplcm9zX251bQorCQkJCSk7CisJCQkgICAgLyogMC10aCBpdGVtIGluIFMwIGNhbiBiZSBvbmx5IG9mIERJUkVDVCB0eXBlIHdoZW4gbF9uICE9IDAqLworCQkJICAgIHsKKwkJCQlpbnQgdmVyc2lvbjsKKwkJCQlpbnQgdGVtcF9sID0gbF9uOworCQkJCQorCQkJCVJGQUxTRSAoaWhfaXRlbV9sZW4gKEJfTl9QSVRFTV9IRUFEICh0YlMwLCAwKSksCisJCQkJCSJQQVAtMTIxMDY6IGl0ZW0gbGVuZ3RoIG11c3QgYmUgMCIpOworCQkJCVJGQUxTRSAoY29tcF9zaG9ydF9sZV9rZXlzIChCX05fUEtFWSAodGJTMCwgMCksCisJCQkJCQkJICAgIEJfTl9QS0VZICh0Yi0+TFswXSwKKwkJCQkJCQkJCSAgICBuICsgaXRlbV9wb3MgLSByZXRfdmFsKSksCisJCQkJCSJQQVAtMTIxMDc6IGl0ZW1zIG11c3QgYmUgb2YgdGhlIHNhbWUgZmlsZSIpOworCQkJCWlmIChpc19pbmRpcmVjdF9sZV9paChCX05fUElURU1fSEVBRCAodGItPkxbMF0sCisJCQkJCQkJCSAgICAgIG4gKyBpdGVtX3BvcyAtIHJldF92YWwpKSkJeworCQkJCSAgICB0ZW1wX2wgPSBsX24gPDwgKHRiLT50Yl9zYi0+c19ibG9ja3NpemVfYml0cyAtIFVORk1fUF9TSElGVCk7CisJCQkJfQorCQkJCS8qIHVwZGF0ZSBrZXkgb2YgZmlyc3QgaXRlbSBpbiBTMCAqLworCQkJCXZlcnNpb24gPSBpaF92ZXJzaW9uIChCX05fUElURU1fSEVBRCAodGJTMCwgMCkpOworCQkJCXNldF9sZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sIEJfTl9QS0VZICh0YlMwLCAwKSwgCisJCQkJCQkgICAgIGxlX2tleV9rX29mZnNldCAodmVyc2lvbiwgQl9OX1BLRVkgKHRiUzAsIDApKSArIHRlbXBfbCk7CisJCQkJLyogdXBkYXRlIGxlZnQgZGVsaW1pdGluZyBrZXkgKi8KKwkJCQlzZXRfbGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBCX05fUERFTElNX0tFWSh0Yi0+Q0ZMWzBdLHRiLT5sa2V5WzBdKSwKKwkJCQkJCSAgICAgbGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBCX05fUERFTElNX0tFWSh0Yi0+Q0ZMWzBdLHRiLT5sa2V5WzBdKSkgKyB0ZW1wX2wpOworCQkJICAgIH0KKworCQkJICAgIC8qIENhbGN1bGF0ZSBuZXcgYm9keSwgcG9zaXRpb24gaW4gaXRlbSBhbmQgaW5zZXJ0X3NpemVbMF0gKi8KKwkJCSAgICBpZiAoIGxfbiA+IHplcm9zX251bSApIHsKKwkJCQlib2R5ICs9IChsX24gLSB6ZXJvc19udW0pOworCQkJCXplcm9zX251bSA9IDA7CisJCQkgICAgfQorCQkJICAgIGVsc2UKKwkJCQl6ZXJvc19udW0gLT0gbF9uOworCQkJICAgIHBvc19pbl9pdGVtID0gMDsJCisKKwkJCSAgICBSRkFMU0UoIGNvbXBfc2hvcnRfbGVfa2V5cyAKKwkJCQkgICAgKEJfTl9QS0VZKHRiUzAsMCksCisJCQkJICAgICBCX05fUEtFWSh0Yi0+TFswXSxCX05SX0lURU1TKHRiLT5MWzBdKS0xKSkgfHwKKwkJCQkKKwkJCQkgICAgIW9wX2lzX2xlZnRfbWVyZ2VhYmxlIAorCQkJCSAgICAoQl9OX1BLRVkgKHRiUzAsIDApLCB0YlMwLT5iX3NpemUpIHx8CisJCQkJICAgICFvcF9pc19sZWZ0X21lcmdlYWJsZQorCQkJCSAgICAoQl9OX1BERUxJTV9LRVkodGItPkNGTFswXSx0Yi0+bGtleVswXSksIAorCQkJCSAgICAgdGJTMC0+Yl9zaXplKSwKKwkJCQkgICAgIlBBUC0xMjEyMDogaXRlbSBtdXN0IGJlIG1lcmdlLWFibGUgd2l0aCBsZWZ0IG5laWdoYm9yaW5nIGl0ZW0iKTsKKwkJCX0KKwkJCWVsc2UgLyogb25seSBwYXJ0IG9mIHRoZSBhcHBlbmRlZCBpdGVtIHdpbGwgYmUgaW4gTFswXSAqLworCQkJeworCQkJICAgIC8qIENhbGN1bGF0ZSBwb3NpdGlvbiBpbiBpdGVtIGZvciBhcHBlbmQgaW4gU1swXSAqLworCQkJICAgIHBvc19pbl9pdGVtIC09IHRiLT5sYnl0ZXM7CisKKwkJCSAgICBSRkFMU0UoIHBvc19pbl9pdGVtIDw9IDAsCisJCQkJICAgICJQQVAtMTIxMjU6IG5vIHBsYWNlIGZvciBwYXN0ZS4gcG9zX2luX2l0ZW09JWQiLCBwb3NfaW5faXRlbSk7CisKKwkJCSAgICAvKiBTaGlmdCBsbnVtWzBdIC0gMSBpdGVtcyBpbiB3aG9sZS4gU2hpZnQgbGJ5dGVzIC0gMSBieXRlIGZyb20gaXRlbSBudW1iZXIgbG51bVswXSAqLworCQkJICAgIGxlYWZfc2hpZnRfbGVmdCh0Yix0Yi0+bG51bVswXSx0Yi0+bGJ5dGVzKTsKKwkJCX0KKwkJICAgIH0KKwkJfQorCQllbHNlIC8qIGFwcGVuZGVkIGl0ZW0gd2lsbCBiZSBpbiBMWzBdIGluIHdob2xlICovCisJCXsKKwkJICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBwYXN0ZWQ7CisKKwkJCWlmICggISBpdGVtX3BvcyAgJiYgb3BfaXNfbGVmdF9tZXJnZWFibGUgKEJfTl9QS0VZICh0YlMwLCAwKSwgdGJTMC0+Yl9zaXplKSApCisJCQl7IC8qIGlmIHdlIHBhc3RlIGludG8gZmlyc3QgaXRlbSBvZiBTWzBdIGFuZCBpdCBpcyBsZWZ0IG1lcmdhYmxlICovCisJCQkgICAgLyogdGhlbiBpbmNyZW1lbnQgcG9zX2luX2l0ZW0gYnkgdGhlIHNpemUgb2YgdGhlIGxhc3QgaXRlbSBpbiBMWzBdICovCisJCQkgICAgcGFzdGVkID0gQl9OX1BJVEVNX0hFQUQodGItPkxbMF0sbi0xKTsKKwkJCSAgICBpZiAoIGlzX2RpcmVudHJ5X2xlX2loIChwYXN0ZWQpICkKKwkJCQlwb3NfaW5faXRlbSArPSBpaF9lbnRyeV9jb3VudChwYXN0ZWQpOworCQkJICAgIGVsc2UKKwkJCQlwb3NfaW5faXRlbSArPSBpaF9pdGVtX2xlbihwYXN0ZWQpOworCQkJfQorCisJCSAgICAvKiBTaGlmdCBsbnVtWzBdIC0gMSBpdGVtcyBpbiB3aG9sZS4gU2hpZnQgbGJ5dGVzIC0gMSBieXRlIGZyb20gaXRlbSBudW1iZXIgbG51bVswXSAqLworCQkgICAgcmV0X3ZhbCA9IGxlYWZfc2hpZnRfbGVmdCh0Yix0Yi0+bG51bVswXSx0Yi0+bGJ5dGVzKTsKKwkJICAgIC8qIEFwcGVuZCB0byBib2R5IG9mIGl0ZW0gaW4gTFswXSAqLworCQkgICAgYmkudGIgPSB0YjsKKwkJICAgIGJpLmJpX2JoID0gdGItPkxbMF07CisJCSAgICBiaS5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07CisJCSAgICBiaS5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7CisJCSAgICBsZWFmX3Bhc3RlX2luX2J1ZmZlciAoJmJpLCBuICsgaXRlbV9wb3MgLSByZXRfdmFsLCBwb3NfaW5faXRlbSwgdGItPmluc2VydF9zaXplWzBdLAorCQkJCQkgIGJvZHksIHplcm9zX251bSk7CisKKwkJICAgIC8qIGlmIGFwcGVuZGVkIGl0ZW0gaXMgZGlyZWN0b3J5LCBwYXN0ZSBlbnRyeSAqLworCQkgICAgcGFzdGVkID0gQl9OX1BJVEVNX0hFQUQgKHRiLT5MWzBdLCBuICsgaXRlbV9wb3MgLSByZXRfdmFsKTsKKwkJICAgIGlmIChpc19kaXJlbnRyeV9sZV9paCAocGFzdGVkKSkKKwkJCWxlYWZfcGFzdGVfZW50cmllcyAoCisJCQkgICAgYmkuYmlfYmgsIG4gKyBpdGVtX3BvcyAtIHJldF92YWwsIHBvc19pbl9pdGVtLCAxLCAKKwkJCSAgICAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilib2R5LCBib2R5ICsgREVIX1NJWkUsIHRiLT5pbnNlcnRfc2l6ZVswXQorCQkJICAgICk7CisJCSAgICAvKiBpZiBhcHBlbmRlZCBpdGVtIGlzIGluZGlyZWN0IGl0ZW0sIHB1dCB1bmZvcm1hdHRlZCBub2RlIGludG8gdW4gbGlzdCAqLworCQkgICAgaWYgKGlzX2luZGlyZWN0X2xlX2loIChwYXN0ZWQpKQorCQkJc2V0X2loX2ZyZWVfc3BhY2UgKHBhc3RlZCwgMCk7CisJCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQkgICAgemVyb3NfbnVtID0gMDsKKwkJfQorCQlicmVhazsKKwkgICAgZGVmYXVsdDogICAgLyogY2FzZXMgZCBhbmQgdCAqLworCQlyZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiUEFQLTEyMTMwOiBiYWxhbmNlX2xlYWY6IGxudW0gPiAwOiB1bmV4cGVjdGFibGUgbW9kZTogJXMoJWQpIiwKKwkJCQkoZmxhZyA9PSBNX0RFTEVURSkgPyAiREVMRVRFIiA6ICgoZmxhZyA9PSBNX0NVVCkgPyAiQ1VUIiA6ICJVTktOT1dOIiksIGZsYWcpOworCSAgICB9CisJfSBlbHNlIHsgCisJICAgIC8qIG5ldyBpdGVtIGRvZXNuJ3QgZmFsbCBpbnRvIExbMF0gKi8KKwkgICAgbGVhZl9zaGlmdF9sZWZ0KHRiLHRiLT5sbnVtWzBdLHRiLT5sYnl0ZXMpOworCX0KKyAgICB9CS8qIHRiLT5sbnVtWzBdID4gMCAqLworCisgICAgLyogQ2FsY3VsYXRlIG5ldyBpdGVtIHBvc2l0aW9uICovCisgICAgaXRlbV9wb3MgLT0gKCB0Yi0+bG51bVswXSAtICgoIHRiLT5sYnl0ZXMgIT0gLTEgKSA/IDEgOiAwKSk7CisKKyAgICBpZiAoIHRiLT5ybnVtWzBdID4gMCApIHsKKwkvKiBzaGlmdCBybnVtWzBdIGl0ZW1zIGZyb20gU1swXSB0byB0aGUgcmlnaHQgbmVpZ2hib3IgUlswXSAqLworCW4gPSBCX05SX0lURU1TKHRiUzApOworCXN3aXRjaCAoIGZsYWcgKSB7CisKKwljYXNlIE1fSU5TRVJUOiAgIC8qIGluc2VydCBpdGVtICovCisJICAgIGlmICggbiAtIHRiLT5ybnVtWzBdIDwgaXRlbV9wb3MgKQorCSAgICB7IC8qIG5ldyBpdGVtIG9yIGl0cyBwYXJ0IGZhbGxzIHRvIFJbMF0gKi8KKwkJaWYgKCBpdGVtX3BvcyA9PSBuIC0gdGItPnJudW1bMF0gKyAxICYmIHRiLT5yYnl0ZXMgIT0gLTEgKQorCQl7IC8qIHBhcnQgb2YgbmV3IGl0ZW0gZmFsbHMgaW50byBSWzBdICovCisJCSAgICBsb2ZmX3Qgb2xkX2tleV9jb21wLCBvbGRfbGVuLCByX3plcm9zX251bWJlcjsKKwkJICAgIGNvbnN0IGNoYXIgKiByX2JvZHk7CisJCSAgICBpbnQgdmVyc2lvbjsKKwkJICAgIGxvZmZfdCBvZmZzZXQ7CisKKwkJICAgIGxlYWZfc2hpZnRfcmlnaHQodGIsdGItPnJudW1bMF0tMSwtMSk7CisKKwkJICAgIHZlcnNpb24gPSBpaF92ZXJzaW9uKGloKTsKKwkJICAgIC8qIFJlbWVtYmVyIGtleSBjb21wb25lbnQgYW5kIGl0ZW0gbGVuZ3RoICovCisgICAgICAgICAgICAgICAgICAgIG9sZF9rZXlfY29tcCA9IGxlX2loX2tfb2Zmc2V0KCBpaCApOworCQkgICAgb2xkX2xlbiA9IGloX2l0ZW1fbGVuKGloKTsKKworCQkgICAgLyogQ2FsY3VsYXRlIGtleSBjb21wb25lbnQgYW5kIGl0ZW0gbGVuZ3RoIHRvIGluc2VydCBpbnRvIFJbMF0gKi8KKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbGVfaWhfa19vZmZzZXQoIGloICkgKyAoKG9sZF9sZW4gLSB0Yi0+cmJ5dGVzICk8PChpc19pbmRpcmVjdF9sZV9paChpaCk/dGItPnRiX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gVU5GTV9QX1NISUZUOjApKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0X2xlX2loX2tfb2Zmc2V0KCBpaCwgb2Zmc2V0ICk7CisJCSAgICBwdXRfaWhfaXRlbV9sZW4oIGloLCB0Yi0+cmJ5dGVzKTsKKwkJICAgIC8qIEluc2VydCBwYXJ0IG9mIHRoZSBpdGVtIGludG8gUlswXSAqLworCQkgICAgYmkudGIgPSB0YjsKKwkJICAgIGJpLmJpX2JoID0gdGItPlJbMF07CisJCSAgICBiaS5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07CisJCSAgICBiaS5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOworCQkgICAgaWYgKCAob2xkX2xlbiAtIHRiLT5yYnl0ZXMpID4gemVyb3NfbnVtICkgeworCQkJcl96ZXJvc19udW1iZXIgPSAwOworCQkJcl9ib2R5ID0gYm9keSArIChvbGRfbGVuIC0gdGItPnJieXRlcykgLSB6ZXJvc19udW07CisJCSAgICB9CisJCSAgICBlbHNlIHsKKwkJCXJfYm9keSA9IGJvZHk7CisJCQlyX3plcm9zX251bWJlciA9IHplcm9zX251bSAtIChvbGRfbGVuIC0gdGItPnJieXRlcyk7CisJCQl6ZXJvc19udW0gLT0gcl96ZXJvc19udW1iZXI7CisJCSAgICB9CisKKwkJICAgIGxlYWZfaW5zZXJ0X2ludG9fYnVmICgmYmksIDAsIGloLCByX2JvZHksIHJfemVyb3NfbnVtYmVyKTsKKworCQkgICAgLyogUmVwbGFjZSByaWdodCBkZWxpbWl0aW5nIGtleSBieSBmaXJzdCBrZXkgaW4gUlswXSAqLworCQkgICAgcmVwbGFjZV9rZXkodGIsIHRiLT5DRlJbMF0sdGItPnJrZXlbMF0sdGItPlJbMF0sMCk7CisKKwkJICAgIC8qIENhbGN1bGF0ZSBrZXkgY29tcG9uZW50IGFuZCBpdGVtIGxlbmd0aCB0byBpbnNlcnQgaW50byBTWzBdICovCisgICAgICAgICAgICAgICAgICAgIHNldF9sZV9paF9rX29mZnNldCggaWgsIG9sZF9rZXlfY29tcCApOworCQkgICAgcHV0X2loX2l0ZW1fbGVuKCBpaCwgb2xkX2xlbiAtIHRiLT5yYnl0ZXMgKTsKKworCQkgICAgdGItPmluc2VydF9zaXplWzBdIC09IHRiLT5yYnl0ZXM7CisKKwkJfQorCQllbHNlIC8qIHdob2xlIG5ldyBpdGVtIGZhbGxzIGludG8gUlswXSAqLworCQl7CQkJCQkgIAorCQkgICAgLyogU2hpZnQgcm51bVswXS0xIGl0ZW1zIHRvIFJbMF0gKi8KKwkJICAgIHJldF92YWwgPSBsZWFmX3NoaWZ0X3JpZ2h0KHRiLHRiLT5ybnVtWzBdLTEsdGItPnJieXRlcyk7CisJCSAgICAvKiBJbnNlcnQgbmV3IGl0ZW0gaW50byBSWzBdICovCisJCSAgICBiaS50YiA9IHRiOworCQkgICAgYmkuYmlfYmggPSB0Yi0+UlswXTsKKwkJICAgIGJpLmJpX3BhcmVudCA9IHRiLT5GUlswXTsKKwkJICAgIGJpLmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7CisJCSAgICBsZWFmX2luc2VydF9pbnRvX2J1ZiAoJmJpLCBpdGVtX3BvcyAtIG4gKyB0Yi0+cm51bVswXSAtIDEsIGloLCBib2R5LCB6ZXJvc19udW0pOworCisJCSAgICBpZiAoIGl0ZW1fcG9zIC0gbiArIHRiLT5ybnVtWzBdIC0gMSA9PSAwICkgeworCQkJcmVwbGFjZV9rZXkodGIsIHRiLT5DRlJbMF0sdGItPnJrZXlbMF0sdGItPlJbMF0sMCk7CisKKwkJICAgIH0KKwkJICAgIHplcm9zX251bSA9IHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7CisJCX0KKwkgICAgfQorCSAgICBlbHNlIC8qIG5ldyBpdGVtIG9yIHBhcnQgb2YgaXQgZG9lc24ndCBmYWxsIGludG8gUlswXSAqLworCSAgICB7CisJCWxlYWZfc2hpZnRfcmlnaHQodGIsdGItPnJudW1bMF0sdGItPnJieXRlcyk7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIE1fUEFTVEU6ICAgLyogYXBwZW5kIGl0ZW0gKi8KKworCSAgICBpZiAoIG4gLSB0Yi0+cm51bVswXSA8PSBpdGVtX3BvcyApICAvKiBwYXN0ZWQgaXRlbSBvciBwYXJ0IG9mIGl0IGZhbGxzIHRvIFJbMF0gKi8KKwkgICAgeworCQlpZiAoIGl0ZW1fcG9zID09IG4gLSB0Yi0+cm51bVswXSAmJiB0Yi0+cmJ5dGVzICE9IC0xICkKKwkJeyAvKiB3ZSBtdXN0IHNoaWZ0IHRoZSBwYXJ0IG9mIHRoZSBhcHBlbmRlZCBpdGVtICovCisJCSAgICBpZiAoIGlzX2RpcmVudHJ5X2xlX2loIChCX05fUElURU1fSEVBRCh0YlMwLCBpdGVtX3BvcykpKQorCQkgICAgeyAvKiB3ZSBhcHBlbmQgdG8gZGlyZWN0b3J5IGl0ZW0gKi8KKwkJCWludCBlbnRyeV9jb3VudDsKKworCQkJUkZBTFNFKCB6ZXJvc19udW0sCisJCQkJIlBBUC0xMjE0NTogaW52YWxpZCBwYXJhbWV0ZXIgaW4gY2FzZSBvZiBhIGRpcmVjdG9yeSIpOworCQkJZW50cnlfY291bnQgPSBJX0VOVFJZX0NPVU5UKEJfTl9QSVRFTV9IRUFEKHRiUzAsIGl0ZW1fcG9zKSk7CisJCQlpZiAoIGVudHJ5X2NvdW50IC0gdGItPnJieXRlcyA8IHBvc19pbl9pdGVtICkKKwkJCSAgICAvKiBuZXcgZGlyZWN0b3J5IGVudHJ5IGZhbGxzIGludG8gUlswXSAqLworCQkJeworCQkJICAgIGludCBwYXN0ZV9lbnRyeV9wb3NpdGlvbjsKKworCQkJICAgIFJGQUxTRSggdGItPnJieXRlcyAtIDEgPj0gZW50cnlfY291bnQgfHwgCisJCQkJICAgICEgdGItPmluc2VydF9zaXplWzBdLAorCQkJCSAgICAiUEFQLTEyMTUwOiBubyBlbm91Z2ggb2YgZW50cmllcyB0byBzaGlmdCB0byBSWzBdOiByYnl0ZXM9JWQsIGVudHJ5X2NvdW50PSVkIiwKKwkJCQkgICAgdGItPnJieXRlcywgZW50cnlfY291bnQpOworCQkJICAgIC8qIFNoaWZ0IHJudW1bMF0tMSBpdGVtcyBpbiB3aG9sZS4gU2hpZnQgcmJ5dGVzLTEgZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBkaXJlY3RvcnkgaXRlbSBudW1iZXIgcm51bVswXSAqLworCQkJICAgIGxlYWZfc2hpZnRfcmlnaHQodGIsdGItPnJudW1bMF0sdGItPnJieXRlcyAtIDEpOworCQkJICAgIC8qIFBhc3RlIGdpdmVuIGRpcmVjdG9yeSBlbnRyeSB0byBkaXJlY3RvcnkgaXRlbSAqLworCQkJICAgIHBhc3RlX2VudHJ5X3Bvc2l0aW9uID0gcG9zX2luX2l0ZW0gLSBlbnRyeV9jb3VudCArIHRiLT5yYnl0ZXMgLSAxOworCQkJICAgIGJpLnRiID0gdGI7CisJCQkgICAgYmkuYmlfYmggPSB0Yi0+UlswXTsKKwkJCSAgICBiaS5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07CisJCQkgICAgYmkuYmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKKwkJCSAgICBsZWFmX3Bhc3RlX2luX2J1ZmZlciAoJmJpLCAwLCBwYXN0ZV9lbnRyeV9wb3NpdGlvbiwKKwkJCQkJCSAgdGItPmluc2VydF9zaXplWzBdLGJvZHksemVyb3NfbnVtKTsKKwkJCSAgICAvKiBwYXN0ZSBlbnRyeSAqLworCQkJICAgIGxlYWZfcGFzdGVfZW50cmllcyAoCisJCQkJYmkuYmlfYmgsIDAsIHBhc3RlX2VudHJ5X3Bvc2l0aW9uLCAxLCAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilib2R5LCAKKwkJCQlib2R5ICsgREVIX1NJWkUsIHRiLT5pbnNlcnRfc2l6ZVswXQorCQkJCSk7CQkJCQkJCQkKKwkJCQkJCQorCQkJICAgIGlmICggcGFzdGVfZW50cnlfcG9zaXRpb24gPT0gMCApIHsKKwkJCQkvKiBjaGFuZ2UgZGVsaW1pdGluZyBrZXlzICovCisJCQkJcmVwbGFjZV9rZXkodGIsIHRiLT5DRlJbMF0sdGItPnJrZXlbMF0sdGItPlJbMF0sMCk7CisJCQkgICAgfQorCisJCQkgICAgdGItPmluc2VydF9zaXplWzBdID0gMDsKKwkJCSAgICBwb3NfaW5faXRlbSsrOworCQkJfQorCQkJZWxzZSAvKiBuZXcgZGlyZWN0b3J5IGVudHJ5IGRvZXNuJ3QgZmFsbCBpbnRvIFJbMF0gKi8KKwkJCXsKKwkJCSAgICBsZWFmX3NoaWZ0X3JpZ2h0KHRiLHRiLT5ybnVtWzBdLHRiLT5yYnl0ZXMpOworCQkJfQorCQkgICAgfQorCQkgICAgZWxzZSAvKiByZWd1bGFyIG9iamVjdCAqLworCQkgICAgeworCQkJaW50IG5fc2hpZnQsIG5fcmVtLCByX3plcm9zX251bWJlcjsKKwkJCWNvbnN0IGNoYXIgKiByX2JvZHk7CisKKwkJCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggbXVzdCBiZSBzaGlmdGVkIGZyb20gYXBwZW5kZWQgaXRlbSAqLworCQkJaWYgKCAobl9zaGlmdCA9IHRiLT5yYnl0ZXMgLSB0Yi0+aW5zZXJ0X3NpemVbMF0pIDwgMCApCisJCQkgICAgbl9zaGlmdCA9IDA7CisKKwkJCVJGQUxTRShwb3NfaW5faXRlbSAhPSBpaF9pdGVtX2xlbihCX05fUElURU1fSEVBRCAodGJTMCwgaXRlbV9wb3MpKSwKKwkJCSAgICAgICAiUEFQLTEyMTU1OiBpbnZhbGlkIHBvc2l0aW9uIHRvIHBhc3RlLiBpaF9pdGVtX2xlbj0lZCwgcG9zX2luX2l0ZW09JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc19pbl9pdGVtLCBpaF9pdGVtX2xlbiggQl9OX1BJVEVNX0hFQUQodGJTMCxpdGVtX3BvcykpKTsKKworCQkJbGVhZl9zaGlmdF9yaWdodCh0Yix0Yi0+cm51bVswXSxuX3NoaWZ0KTsKKwkJCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggbXVzdCByZW1haW4gaW4gYm9keSBhZnRlciBhcHBlbmRpbmcgdG8gUlswXSAqLworCQkJaWYgKCAobl9yZW0gPSB0Yi0+aW5zZXJ0X3NpemVbMF0gLSB0Yi0+cmJ5dGVzKSA8IDAgKQorCQkJICAgIG5fcmVtID0gMDsKKwkJCQorCQkJeworCQkJICBpbnQgdmVyc2lvbjsKKwkJCSAgdW5zaWduZWQgbG9uZyB0ZW1wX3JlbSA9IG5fcmVtOworCQkJICAKKwkJCSAgdmVyc2lvbiA9IGloX3ZlcnNpb24gKEJfTl9QSVRFTV9IRUFEICh0Yi0+UlswXSwwKSk7CisJCQkgIGlmIChpc19pbmRpcmVjdF9sZV9rZXkodmVyc2lvbixCX05fUEtFWSh0Yi0+UlswXSwwKSkpeworCQkJICAgICAgdGVtcF9yZW0gPSBuX3JlbSA8PCAodGItPnRiX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0KKwkJCQkJIFVORk1fUF9TSElGVCk7CisJCQkgIH0KKwkJCSAgc2V0X2xlX2tleV9rX29mZnNldCAodmVyc2lvbiwgQl9OX1BLRVkodGItPlJbMF0sMCksIAorCQkJCQkgICAgICAgbGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBCX05fUEtFWSh0Yi0+UlswXSwwKSkgKyB0ZW1wX3JlbSk7CisJCQkgIHNldF9sZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sIEJfTl9QREVMSU1fS0VZKHRiLT5DRlJbMF0sdGItPnJrZXlbMF0pLCAKKwkJCQkJICAgICAgIGxlX2tleV9rX29mZnNldCAodmVyc2lvbiwgQl9OX1BERUxJTV9LRVkodGItPkNGUlswXSx0Yi0+cmtleVswXSkpICsgdGVtcF9yZW0pOworCQkJfQorLyoJCSAga19vZmZzZXQgKEJfTl9QS0VZKHRiLT5SWzBdLDApKSArPSBuX3JlbTsKKwkJICBrX29mZnNldCAoQl9OX1BERUxJTV9LRVkodGItPkNGUlswXSx0Yi0+cmtleVswXSkpICs9IG5fcmVtOyovCisJCQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKHRiLCB0Yi0+Q0ZSWzBdLCAwKTsKKworCQkJLyogQXBwZW5kIHBhcnQgb2YgYm9keSBpbnRvIFJbMF0gKi8KKwkJCWJpLnRiID0gdGI7CisJCQliaS5iaV9iaCA9IHRiLT5SWzBdOworCQkJYmkuYmlfcGFyZW50ID0gdGItPkZSWzBdOworCQkJYmkuYmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKKwkJCWlmICggbl9yZW0gPiB6ZXJvc19udW0gKSB7CisJCQkgICAgcl96ZXJvc19udW1iZXIgPSAwOworCQkJICAgIHJfYm9keSA9IGJvZHkgKyBuX3JlbSAtIHplcm9zX251bTsKKwkJCX0KKwkJCWVsc2UgeworCQkJICAgIHJfYm9keSA9IGJvZHk7CisJCQkgICAgcl96ZXJvc19udW1iZXIgPSB6ZXJvc19udW0gLSBuX3JlbTsKKwkJCSAgICB6ZXJvc19udW0gLT0gcl96ZXJvc19udW1iZXI7CisJCQl9CisKKwkJCWxlYWZfcGFzdGVfaW5fYnVmZmVyKCZiaSwgMCwgbl9zaGlmdCwgdGItPmluc2VydF9zaXplWzBdIC0gbl9yZW0sIHJfYm9keSwgcl96ZXJvc19udW1iZXIpOworCisJCQlpZiAoaXNfaW5kaXJlY3RfbGVfaWggKEJfTl9QSVRFTV9IRUFEKHRiLT5SWzBdLDApKSkgeworI2lmIDAKKwkJCSAgICBSRkFMU0UoIG5fcmVtLAorCQkJCSAgICAiUEFQLTEyMTYwOiBwYXN0ZSBtb3JlIHRoYW4gb25lIHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlciIpOworI2VuZGlmCisJCQkgICAgc2V0X2loX2ZyZWVfc3BhY2UgKEJfTl9QSVRFTV9IRUFEKHRiLT5SWzBdLDApLCAwKTsKKwkJCX0KKwkJCXRiLT5pbnNlcnRfc2l6ZVswXSA9IG5fcmVtOworCQkJaWYgKCAhIG5fcmVtICkKKwkJCSAgICBwb3NfaW5faXRlbSArKzsKKwkJICAgIH0KKwkJfQorCQllbHNlIC8qIHBhc3RlZCBpdGVtIGluIHdob2xlIGZhbGxzIGludG8gUlswXSAqLworCQl7CisJCSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogcGFzdGVkOworCisJCSAgICByZXRfdmFsID0gbGVhZl9zaGlmdF9yaWdodCh0Yix0Yi0+cm51bVswXSx0Yi0+cmJ5dGVzKTsKKwkJICAgIC8qIGFwcGVuZCBpdGVtIGluIFJbMF0gKi8KKwkJICAgIGlmICggcG9zX2luX2l0ZW0gPj0gMCApIHsKKwkJCWJpLnRiID0gdGI7CisJCQliaS5iaV9iaCA9IHRiLT5SWzBdOworCQkJYmkuYmlfcGFyZW50ID0gdGItPkZSWzBdOworCQkJYmkuYmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKKwkJCWxlYWZfcGFzdGVfaW5fYnVmZmVyKCZiaSxpdGVtX3BvcyAtIG4gKyB0Yi0+cm51bVswXSwgcG9zX2luX2l0ZW0sCisJCQkJCSAgICAgdGItPmluc2VydF9zaXplWzBdLGJvZHksIHplcm9zX251bSk7CisJCSAgICB9CisKKwkJICAgIC8qIHBhc3RlIG5ldyBlbnRyeSwgaWYgaXRlbSBpcyBkaXJlY3RvcnkgaXRlbSAqLworCQkgICAgcGFzdGVkID0gQl9OX1BJVEVNX0hFQUQodGItPlJbMF0sIGl0ZW1fcG9zIC0gbiArIHRiLT5ybnVtWzBdKTsKKwkJICAgIGlmIChpc19kaXJlbnRyeV9sZV9paCAocGFzdGVkKSAmJiBwb3NfaW5faXRlbSA+PSAwICkgeworCQkJbGVhZl9wYXN0ZV9lbnRyaWVzICgKKwkJCSAgICBiaS5iaV9iaCwgaXRlbV9wb3MgLSBuICsgdGItPnJudW1bMF0sIHBvc19pbl9pdGVtLCAxLCAKKwkJCSAgICAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilib2R5LCBib2R5ICsgREVIX1NJWkUsIHRiLT5pbnNlcnRfc2l6ZVswXQorCQkJICAgICk7CisJCQlpZiAoICEgcG9zX2luX2l0ZW0gKSB7CisKKwkJCSAgICBSRkFMU0UoIGl0ZW1fcG9zIC0gbiArIHRiLT5ybnVtWzBdLAorCQkJCSAgICAiUEFQLTEyMTY1OiBkaXJlY3RvcnkgaXRlbSBtdXN0IGJlIGZpcnN0IGl0ZW0gb2Ygbm9kZSB3aGVuIHBhc3RpbmcgaXMgaW4gMHRoIHBvc2l0aW9uIik7CisKKwkJCSAgICAvKiB1cGRhdGUgZGVsaW1pdGluZyBrZXlzICovCisJCQkgICAgcmVwbGFjZV9rZXkodGIsIHRiLT5DRlJbMF0sdGItPnJrZXlbMF0sdGItPlJbMF0sMCk7CisJCQl9CisJCSAgICB9CisKKwkJICAgIGlmIChpc19pbmRpcmVjdF9sZV9paCAocGFzdGVkKSkKKwkJCXNldF9paF9mcmVlX3NwYWNlIChwYXN0ZWQsIDApOworCQkgICAgemVyb3NfbnVtID0gdGItPmluc2VydF9zaXplWzBdID0gMDsKKwkJfQorCSAgICB9CisJICAgIGVsc2UgLyogbmV3IGl0ZW0gZG9lc24ndCBmYWxsIGludG8gUlswXSAqLworCSAgICB7CisJCWxlYWZfc2hpZnRfcmlnaHQodGIsdGItPnJudW1bMF0sdGItPnJieXRlcyk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJZGVmYXVsdDogICAgLyogY2FzZXMgZCBhbmQgdCAqLworCSAgICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiUEFQLTEyMTc1OiBiYWxhbmNlX2xlYWY6IHJudW0gPiAwOiB1bmV4cGVjdGFibGUgbW9kZTogJXMoJWQpIiwKKwkJCSAgICAoZmxhZyA9PSBNX0RFTEVURSkgPyAiREVMRVRFIiA6ICgoZmxhZyA9PSBNX0NVVCkgPyAiQ1VUIiA6ICJVTktOT1dOIiksIGZsYWcpOworCX0KKyAgICAKKyAgICB9CS8qIHRiLT5ybnVtWzBdID4gMCAqLworCisKKyAgICBSRkFMU0UoIHRiLT5ibGtudW1bMF0gPiAzLAorCSAgICAiUEFQLTEyMTgwOiBibGtudW0gY2FuIG5vdCBiZSAlZC4gSXQgbXVzdCBiZSA8PSAzIiwgIHRiLT5ibGtudW1bMF0pOworICAgIFJGQUxTRSggdGItPmJsa251bVswXSA8IDAsCisJICAgICJQQVAtMTIxODU6IGJsa251bSBjYW4gbm90IGJlICVkLiBJdCBtdXN0IGJlID49IDAiLCAgdGItPmJsa251bVswXSk7CisKKyAgICAvKiBpZiB3aGlsZSBhZGRpbmcgdG8gYSBub2RlIHdlIGRpc2NvdmVyIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gc3BsaXQKKyAgICAgICBpdCBpbiB0d28sIGFuZCBtZXJnZSB0aGUgbGVmdCBwYXJ0IGludG8gdGhlIGxlZnQgbmVpZ2hib3IgYW5kIHRoZQorICAgICAgIHJpZ2h0IHBhcnQgaW50byB0aGUgcmlnaHQgbmVpZ2hib3IsIGVsaW1pbmF0aW5nIHRoZSBub2RlICovCisgICAgaWYgKCB0Yi0+YmxrbnVtWzBdID09IDAgKSB7IC8qIG5vZGUgU1swXSBpcyBlbXB0eSBub3cgKi8KKworCVJGQUxTRSggISB0Yi0+bG51bVswXSB8fCAhIHRiLT5ybnVtWzBdLAorCSAgICAgICAgIlBBUC0xMjE5MDogbG51bSBhbmQgcm51bSBtdXN0IG5vdCBiZSB6ZXJvIik7CisJLyogaWYgaW5zZXJ0aW9uIHdhcyBkb25lIGJlZm9yZSAwLXRoIHBvc2l0aW9uIGluIFJbMF0sIHJpZ2h0CisJICAgZGVsaW1pdGluZyBrZXkgb2YgdGhlIHRiLT5MWzBdJ3MgYW5kIGxlZnQgZGVsaW1pdGluZyBrZXkgYXJlCisJICAgbm90IHNldCBjb3JyZWN0bHkgKi8KKwlpZiAodGItPkNGTFswXSkgeworCSAgICBpZiAoIXRiLT5DRlJbMF0pCisJCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJ2cy0xMjE5NTogYmFsYW5jZV9sZWFmOiBDRlIgbm90IGluaXRpYWxpemVkIik7CisJICAgIGNvcHlfa2V5IChCX05fUERFTElNX0tFWSAodGItPkNGTFswXSwgdGItPmxrZXlbMF0pLCBCX05fUERFTElNX0tFWSAodGItPkNGUlswXSwgdGItPnJrZXlbMF0pKTsKKwkgICAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5ICh0YiwgdGItPkNGTFswXSwgMCk7CisJfQorCisJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsdGJTMCk7CQkJCQkJCQkJCisJcmV0dXJuIDA7CisgICAgfQorCisKKyAgICAvKiBGaWxsIG5ldyBub2RlcyB0aGF0IGFwcGVhciBpbiBwbGFjZSBvZiBTWzBdICovCisKKyAgICAvKiBJIGFtIHRvbGQgdGhhdCB0aGlzIGNvcHlpbmcgaXMgYmVjYXVzZSB3ZSBuZWVkIGFuIGFycmF5IHRvIGVuYWJsZQorICAgICAgIHRoZSBsb29waW5nIGNvZGUuIC1IYW5zICovCisgICAgc251bVswXSA9IHRiLT5zMW51bSwKKwlzbnVtWzFdID0gdGItPnMybnVtOworICAgIHNieXRlc1swXSA9IHRiLT5zMWJ5dGVzOworICAgIHNieXRlc1sxXSA9IHRiLT5zMmJ5dGVzOworICAgIGZvciggaSA9IHRiLT5ibGtudW1bMF0gLSAyOyBpID49IDA7IGktLSApIHsKKworCVJGQUxTRSggIXNudW1baV0sICJQQVAtMTIyMDA6IHNudW1bJWRdID09ICVkLiBNdXN0IGJlID4gMCIsIGksIHNudW1baV0pOworCisJLyogaGVyZSB3ZSBzaGlmdCBmcm9tIFMgdG8gU19uZXcgbm9kZXMgKi8KKworCVNfbmV3W2ldID0gZ2V0X0ZFQih0Yik7CisKKwkvKiBpbml0aWFsaXplZCBibG9jayB0eXBlIGFuZCB0cmVlIGxldmVsICovCisgICAgICAgIHNldF9ibGtoX2xldmVsKCBCX0JMS19IRUFEKFNfbmV3W2ldKSwgRElTS19MRUFGX05PREVfTEVWRUwgKTsKKworCisJbiA9IEJfTlJfSVRFTVModGJTMCk7CisJCisJc3dpdGNoIChmbGFnKSB7CisJY2FzZSBNX0lOU0VSVDogICAvKiBpbnNlcnQgaXRlbSAqLworCisJICAgIGlmICggbiAtIHNudW1baV0gPCBpdGVtX3BvcyApCisJICAgIHsgLyogbmV3IGl0ZW0gb3IgaXQncyBwYXJ0IGZhbGxzIHRvIGZpcnN0IG5ldyBub2RlIFNfbmV3W2ldKi8KKwkJaWYgKCBpdGVtX3BvcyA9PSBuIC0gc251bVtpXSArIDEgJiYgc2J5dGVzW2ldICE9IC0xICkKKwkJeyAvKiBwYXJ0IG9mIG5ldyBpdGVtIGZhbGxzIGludG8gU19uZXdbaV0gKi8KKwkJICAgIGludCBvbGRfa2V5X2NvbXAsIG9sZF9sZW4sIHJfemVyb3NfbnVtYmVyOworCQkgICAgY29uc3QgY2hhciAqIHJfYm9keTsKKwkJICAgIGludCB2ZXJzaW9uOworCisJCSAgICAvKiBNb3ZlIHNudW1baV0tMSBpdGVtcyBmcm9tIFNbMF0gdG8gU19uZXdbaV0gKi8KKwkJICAgIGxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX1NfVE9fU05FVywgdGIsIHNudW1baV0gLSAxLCAtMSwgU19uZXdbaV0pOworCQkgICAgLyogUmVtZW1iZXIga2V5IGNvbXBvbmVudCBhbmQgaXRlbSBsZW5ndGggKi8KKwkJICAgIHZlcnNpb24gPSBpaF92ZXJzaW9uIChpaCk7CisgICAgICAgICAgICAgICAgICAgIG9sZF9rZXlfY29tcCA9IGxlX2loX2tfb2Zmc2V0KCBpaCApOworCQkgICAgb2xkX2xlbiA9IGloX2l0ZW1fbGVuKGloKTsKKworCQkgICAgLyogQ2FsY3VsYXRlIGtleSBjb21wb25lbnQgYW5kIGl0ZW0gbGVuZ3RoIHRvIGluc2VydCBpbnRvIFNfbmV3W2ldICovCisgICAgICAgICAgICAgICAgICAgIHNldF9sZV9paF9rX29mZnNldCggaWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlX2loX2tfb2Zmc2V0KGloKSArICgob2xkX2xlbiAtIHNieXRlc1tpXSApPDwoaXNfaW5kaXJlY3RfbGVfaWgoaWgpP3RiLT50Yl9zYi0+c19ibG9ja3NpemVfYml0cyAtIFVORk1fUF9TSElGVDowKSkgKTsKKworCQkgICAgcHV0X2loX2l0ZW1fbGVuKCBpaCwgc2J5dGVzW2ldICk7CisKKwkJICAgIC8qIEluc2VydCBwYXJ0IG9mIHRoZSBpdGVtIGludG8gU19uZXdbaV0gYmVmb3JlIDAtdGggaXRlbSAqLworCQkgICAgYmkudGIgPSB0YjsKKwkJICAgIGJpLmJpX2JoID0gU19uZXdbaV07CisJCSAgICBiaS5iaV9wYXJlbnQgPSBOVUxMOworCQkgICAgYmkuYmlfcG9zaXRpb24gPSAwOworCisJCSAgICBpZiAoIChvbGRfbGVuIC0gc2J5dGVzW2ldKSA+IHplcm9zX251bSApIHsKKwkJCXJfemVyb3NfbnVtYmVyID0gMDsKKwkJCXJfYm9keSA9IGJvZHkgKyAob2xkX2xlbiAtIHNieXRlc1tpXSkgLSB6ZXJvc19udW07CisJCSAgICB9CisJCSAgICBlbHNlIHsKKwkJCXJfYm9keSA9IGJvZHk7CisJCQlyX3plcm9zX251bWJlciA9IHplcm9zX251bSAtIChvbGRfbGVuIC0gc2J5dGVzW2ldKTsKKwkJCXplcm9zX251bSAtPSByX3plcm9zX251bWJlcjsKKwkJICAgIH0KKworCQkgICAgbGVhZl9pbnNlcnRfaW50b19idWYgKCZiaSwgMCwgaWgsIHJfYm9keSwgcl96ZXJvc19udW1iZXIpOworCisJCSAgICAvKiBDYWxjdWxhdGUga2V5IGNvbXBvbmVudCBhbmQgaXRlbSBsZW5ndGggdG8gaW5zZXJ0IGludG8gU1tpXSAqLworICAgICAgICAgICAgICAgICAgICBzZXRfbGVfaWhfa19vZmZzZXQoIGloLCBvbGRfa2V5X2NvbXAgKTsKKwkJICAgIHB1dF9paF9pdGVtX2xlbiggaWgsIG9sZF9sZW4gLSBzYnl0ZXNbaV0gKTsKKwkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSAtPSBzYnl0ZXNbaV07CisJCX0KKwkJZWxzZSAvKiB3aG9sZSBuZXcgaXRlbSBmYWxscyBpbnRvIFNfbmV3W2ldICovCisJCXsKKwkJICAgIC8qIFNoaWZ0IHNudW1bMF0gLSAxIGl0ZW1zIHRvIFNfbmV3W2ldIChzYnl0ZXNbaV0gb2Ygc3BsaXQgaXRlbSkgKi8KKwkJICAgIGxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX1NfVE9fU05FVywgdGIsIHNudW1baV0gLSAxLCBzYnl0ZXNbaV0sIFNfbmV3W2ldKTsKKworCQkgICAgLyogSW5zZXJ0IG5ldyBpdGVtIGludG8gU19uZXdbaV0gKi8KKwkJICAgIGJpLnRiID0gdGI7CisJCSAgICBiaS5iaV9iaCA9IFNfbmV3W2ldOworCQkgICAgYmkuYmlfcGFyZW50ID0gTlVMTDsKKwkJICAgIGJpLmJpX3Bvc2l0aW9uID0gMDsKKwkJICAgIGxlYWZfaW5zZXJ0X2ludG9fYnVmICgmYmksIGl0ZW1fcG9zIC0gbiArIHNudW1baV0gLSAxLCBpaCwgYm9keSwgemVyb3NfbnVtKTsKKworCQkgICAgemVyb3NfbnVtID0gdGItPmluc2VydF9zaXplWzBdID0gMDsKKwkJfQorCSAgICB9CisKKwkgICAgZWxzZSAvKiBuZXcgaXRlbSBvciBpdCBwYXJ0IGRvbid0IGZhbGxzIGludG8gU19uZXdbaV0gKi8KKwkgICAgeworCQlsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9TX1RPX1NORVcsIHRiLCBzbnVtW2ldLCBzYnl0ZXNbaV0sIFNfbmV3W2ldKTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgTV9QQVNURTogICAvKiBhcHBlbmQgaXRlbSAqLworCisJICAgIGlmICggbiAtIHNudW1baV0gPD0gaXRlbV9wb3MgKSAgLyogcGFzdGVkIGl0ZW0gb3IgcGFydCBpZiBpdCBmYWxscyB0byBTX25ld1tpXSAqLworCSAgICB7CisJCWlmICggaXRlbV9wb3MgPT0gbiAtIHNudW1baV0gJiYgc2J5dGVzW2ldICE9IC0xICkKKwkJeyAvKiB3ZSBtdXN0IHNoaWZ0IHBhcnQgb2YgdGhlIGFwcGVuZGVkIGl0ZW0gKi8KKwkJICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBhdXhfaWg7CisKKwkJICAgIFJGQUxTRSggaWgsICJQQVAtMTIyMTA6IGloIG11c3QgYmUgMCIpOworCisJCSAgICBpZiAoIGlzX2RpcmVudHJ5X2xlX2loIChhdXhfaWggPSBCX05fUElURU1fSEVBRCh0YlMwLGl0ZW1fcG9zKSkpIHsKKwkJCS8qIHdlIGFwcGVuZCB0byBkaXJlY3RvcnkgaXRlbSAqLworCisJCQlpbnQgZW50cnlfY291bnQ7CisJCQorCQkJZW50cnlfY291bnQgPSBpaF9lbnRyeV9jb3VudChhdXhfaWgpOworCisJCQlpZiAoIGVudHJ5X2NvdW50IC0gc2J5dGVzW2ldIDwgcG9zX2luX2l0ZW0gICYmIHBvc19pbl9pdGVtIDw9IGVudHJ5X2NvdW50ICkgeworCQkJICAgIC8qIG5ldyBkaXJlY3RvcnkgZW50cnkgZmFsbHMgaW50byBTX25ld1tpXSAqLworCQkgIAorCQkJICAgIFJGQUxTRSggISB0Yi0+aW5zZXJ0X3NpemVbMF0sCisJCQkJICAgICJQQVAtMTIyMTU6IGluc2VydF9zaXplIGlzIGFscmVhZHkgMCIpOworCQkJICAgIFJGQUxTRSggc2J5dGVzW2ldIC0gMSA+PSBlbnRyeV9jb3VudCwKKwkJCQkgICAgIlBBUC0xMjIyMDogdGhlcmUgYXJlIG5vIHNvIG11Y2ggZW50cmllcyAoJWQpLCBvbmx5ICVkIiwKKwkJCQkgICAgc2J5dGVzW2ldIC0gMSwgZW50cnlfY291bnQpOworCisJCQkgICAgLyogU2hpZnQgc251bVtpXS0xIGl0ZW1zIGluIHdob2xlLiBTaGlmdCBzYnl0ZXNbaV0gZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBkaXJlY3RvcnkgaXRlbSBudW1iZXIgc251bVtpXSAqLworCQkJICAgIGxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX1NfVE9fU05FVywgdGIsIHNudW1baV0sIHNieXRlc1tpXS0xLCBTX25ld1tpXSk7CisJCQkgICAgLyogUGFzdGUgZ2l2ZW4gZGlyZWN0b3J5IGVudHJ5IHRvIGRpcmVjdG9yeSBpdGVtICovCisJCQkgICAgYmkudGIgPSB0YjsKKwkJCSAgICBiaS5iaV9iaCA9IFNfbmV3W2ldOworCQkJICAgIGJpLmJpX3BhcmVudCA9IE5VTEw7CisJCQkgICAgYmkuYmlfcG9zaXRpb24gPSAwOworCQkJICAgIGxlYWZfcGFzdGVfaW5fYnVmZmVyICgmYmksIDAsIHBvc19pbl9pdGVtIC0gZW50cnlfY291bnQgKyBzYnl0ZXNbaV0gLSAxLAorCQkJCQkJICB0Yi0+aW5zZXJ0X3NpemVbMF0sIGJvZHksemVyb3NfbnVtKTsKKwkJCSAgICAvKiBwYXN0ZSBuZXcgZGlyZWN0b3J5IGVudHJ5ICovCisJCQkgICAgbGVhZl9wYXN0ZV9lbnRyaWVzICgKKwkJCQliaS5iaV9iaCwgMCwgcG9zX2luX2l0ZW0gLSBlbnRyeV9jb3VudCArIHNieXRlc1tpXSAtIDEsCisJCQkJMSwgKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopYm9keSwgYm9keSArIERFSF9TSVpFLAorCQkJCXRiLT5pbnNlcnRfc2l6ZVswXQorCQkJCSk7CisJCQkgICAgdGItPmluc2VydF9zaXplWzBdID0gMDsKKwkJCSAgICBwb3NfaW5faXRlbSsrOworCQkJfSBlbHNlIHsgLyogbmV3IGRpcmVjdG9yeSBlbnRyeSBkb2Vzbid0IGZhbGwgaW50byBTX25ld1tpXSAqLworCQkJICAgIGxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX1NfVE9fU05FVywgdGIsIHNudW1baV0sIHNieXRlc1tpXSwgU19uZXdbaV0pOworCQkJfQorCQkgICAgfQorCQkgICAgZWxzZSAvKiByZWd1bGFyIG9iamVjdCAqLworCQkgICAgeworCQkJaW50IG5fc2hpZnQsIG5fcmVtLCByX3plcm9zX251bWJlcjsKKwkJCWNvbnN0IGNoYXIgKiByX2JvZHk7CisKKwkJCVJGQUxTRSggcG9zX2luX2l0ZW0gIT0gaWhfaXRlbV9sZW4oQl9OX1BJVEVNX0hFQUQodGJTMCxpdGVtX3BvcykpIHx8CisJCQkgICAgICAgIHRiLT5pbnNlcnRfc2l6ZVswXSA8PSAwLAorCQkJICAgICAgICAiUEFQLTEyMjI1OiBpdGVtIHRvbyBzaG9ydCBvciBpbnNlcnRfc2l6ZSA8PSAwIik7CisKKwkJCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggbXVzdCBiZSBzaGlmdGVkIGZyb20gYXBwZW5kZWQgaXRlbSAqLworCQkJbl9zaGlmdCA9IHNieXRlc1tpXSAtIHRiLT5pbnNlcnRfc2l6ZVswXTsKKwkJCWlmICggbl9zaGlmdCA8IDAgKQorCQkJICAgIG5fc2hpZnQgPSAwOworCQkJbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19TTkVXLCB0Yiwgc251bVtpXSwgbl9zaGlmdCwgU19uZXdbaV0pOworCisJCQkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIG11c3QgcmVtYWluIGluIGJvZHkgYWZ0ZXIgYXBwZW5kIHRvIFNfbmV3W2ldICovCisJCQluX3JlbSA9IHRiLT5pbnNlcnRfc2l6ZVswXSAtIHNieXRlc1tpXTsKKwkJCWlmICggbl9yZW0gPCAwICkKKwkJCSAgICBuX3JlbSA9IDA7CisJCQkvKiBBcHBlbmQgcGFydCBvZiBib2R5IGludG8gU19uZXdbMF0gKi8KKwkJCWJpLnRiID0gdGI7CisJCQliaS5iaV9iaCA9IFNfbmV3W2ldOworCQkJYmkuYmlfcGFyZW50ID0gTlVMTDsKKwkJCWJpLmJpX3Bvc2l0aW9uID0gMDsKKworCQkJaWYgKCBuX3JlbSA+IHplcm9zX251bSApIHsKKwkJCSAgICByX3plcm9zX251bWJlciA9IDA7CisJCQkgICAgcl9ib2R5ID0gYm9keSArIG5fcmVtIC0gemVyb3NfbnVtOworCQkJfQorCQkJZWxzZSB7CisJCQkgICAgcl9ib2R5ID0gYm9keTsKKwkJCSAgICByX3plcm9zX251bWJlciA9IHplcm9zX251bSAtIG5fcmVtOworCQkJICAgIHplcm9zX251bSAtPSByX3plcm9zX251bWJlcjsKKwkJCX0KKworCQkJbGVhZl9wYXN0ZV9pbl9idWZmZXIoJmJpLCAwLCBuX3NoaWZ0LCB0Yi0+aW5zZXJ0X3NpemVbMF0tbl9yZW0sIHJfYm9keSxyX3plcm9zX251bWJlcik7CisJCQl7CisJCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqIHRtcDsKKworCQkJICAgIHRtcCA9IEJfTl9QSVRFTV9IRUFEKFNfbmV3W2ldLDApOworCQkJICAgIGlmIChpc19pbmRpcmVjdF9sZV9paCAodG1wKSkgeworCQkJCXNldF9paF9mcmVlX3NwYWNlICh0bXAsIDApOworCQkJCXNldF9sZV9paF9rX29mZnNldCggdG1wLCBsZV9paF9rX29mZnNldCh0bXApICsgCisJCQkJCSAgICAgICAgICAgIChuX3JlbSA8PCAodGItPnRiX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gVU5GTV9QX1NISUZUKSkpOworCQkJICAgIH0gZWxzZSB7CisJCQkJc2V0X2xlX2loX2tfb2Zmc2V0KCB0bXAsIGxlX2loX2tfb2Zmc2V0KHRtcCkgKyAKKwkJCQkgICAgICAgICAgICAgICAgICAgIG5fcmVtICk7CisJCQkgICAgfQorCQkJfQorCisJCQl0Yi0+aW5zZXJ0X3NpemVbMF0gPSBuX3JlbTsKKwkJCWlmICggISBuX3JlbSApCisJCQkgICAgcG9zX2luX2l0ZW0rKzsKKwkJICAgIH0KKwkJfQorCQllbHNlCisJCSAgICAvKiBpdGVtIGZhbGxzIHdob2xseSBpbnRvIFNfbmV3W2ldICovCisJCXsKKwkJICAgIGludCByZXRfdmFsOworCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqIHBhc3RlZDsKKworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloID0gQl9OX1BJVEVNX0hFQUQodGJTMCxpdGVtX3Bvcyk7CisKKwkJICAgIGlmICggISBpc19kaXJlbnRyeV9sZV9paChpaCkgJiYgKHBvc19pbl9pdGVtICE9IGloX2l0ZW1fbGVuKGloKSB8fAorCQkJCQkJICAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gPD0gMCkgKQorCQkJcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgIlBBUC0xMjIzNTogYmFsYW5jZV9sZWFmOiBwb3NfaW5faXRlbSBtdXN0IGJlIGVxdWFsIHRvIGloX2l0ZW1fbGVuIik7CisjZW5kaWYgLyogQ09ORklHX1JFSVNFUkZTX0NIRUNLICovCisKKwkJICAgIHJldF92YWwgPSBsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9TX1RPX1NORVcsIHRiLCBzbnVtW2ldLCBzYnl0ZXNbaV0sIFNfbmV3W2ldKTsKKworCQkgICAgUkZBTFNFKCByZXRfdmFsLAorCQkJICAgICJQQVAtMTIyNDA6IHVuZXhwZWN0ZWQgdmFsdWUgcmV0dXJuZWQgYnkgbGVhZl9tb3ZlX2l0ZW1zICglZCkiLAorCQkJICAgIHJldF92YWwpOworCisJCSAgICAvKiBwYXN0ZSBpbnRvIGl0ZW0gKi8KKwkJICAgIGJpLnRiID0gdGI7CisJCSAgICBiaS5iaV9iaCA9IFNfbmV3W2ldOworCQkgICAgYmkuYmlfcGFyZW50ID0gTlVMTDsKKwkJICAgIGJpLmJpX3Bvc2l0aW9uID0gMDsKKwkJICAgIGxlYWZfcGFzdGVfaW5fYnVmZmVyKCZiaSwgaXRlbV9wb3MgLSBuICsgc251bVtpXSwgcG9zX2luX2l0ZW0sIHRiLT5pbnNlcnRfc2l6ZVswXSwgYm9keSwgemVyb3NfbnVtKTsKKworCQkgICAgcGFzdGVkID0gQl9OX1BJVEVNX0hFQUQoU19uZXdbaV0sIGl0ZW1fcG9zIC0gbiArIHNudW1baV0pOworCQkgICAgaWYgKGlzX2RpcmVudHJ5X2xlX2loIChwYXN0ZWQpKQorCQkgICAgeworCQkJbGVhZl9wYXN0ZV9lbnRyaWVzICgKKwkJCSAgICBiaS5iaV9iaCwgaXRlbV9wb3MgLSBuICsgc251bVtpXSwgcG9zX2luX2l0ZW0sIDEsIAorCQkJICAgIChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJvZHksIGJvZHkgKyBERUhfU0laRSwgdGItPmluc2VydF9zaXplWzBdCisJCQkgICAgKTsKKwkJICAgIH0KKworCQkgICAgLyogaWYgd2UgcGFzdGUgdG8gaW5kaXJlY3QgaXRlbSB1cGRhdGUgaWhfZnJlZV9zcGFjZSAqLworCQkgICAgaWYgKGlzX2luZGlyZWN0X2xlX2loIChwYXN0ZWQpKQorCQkJc2V0X2loX2ZyZWVfc3BhY2UgKHBhc3RlZCwgMCk7CisJCSAgICB6ZXJvc19udW0gPSB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQl9CisJICAgIH0KKworCSAgICBlbHNlIC8qIHBhc3RlZCBpdGVtIGRvZXNuJ3QgZmFsbCBpbnRvIFNfbmV3W2ldICovCisJICAgIHsKKwkJbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19TTkVXLCB0Yiwgc251bVtpXSwgc2J5dGVzW2ldLCBTX25ld1tpXSk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJZGVmYXVsdDogICAgLyogY2FzZXMgZCBhbmQgdCAqLworCSAgICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiUEFQLTEyMjQ1OiBiYWxhbmNlX2xlYWY6IGJsa251bSA+IDI6IHVuZXhwZWN0YWJsZSBtb2RlOiAlcyglZCkiLAorCQkJICAgIChmbGFnID09IE1fREVMRVRFKSA/ICJERUxFVEUiIDogKChmbGFnID09IE1fQ1VUKSA/ICJDVVQiIDogIlVOS05PV04iKSwgZmxhZyk7CisJfQorCisJbWVtY3B5IChpbnNlcnRfa2V5ICsgaSxCX05fUEtFWShTX25ld1tpXSwwKSxLRVlfU0laRSk7CisJaW5zZXJ0X3B0cltpXSA9IFNfbmV3W2ldOworCisJUkZBTFNFICghYnVmZmVyX2pvdXJuYWxlZCAoU19uZXcgW2ldKSB8fCBidWZmZXJfam91cm5hbF9kaXJ0eSAoU19uZXcgW2ldKSB8fAorCQlidWZmZXJfZGlydHkgKFNfbmV3IFtpXSksCisJCSJQQVAtMTIyNDc6IFNfbmV3WyVkXSA6ICglYikiLCBpLCBTX25ld1tpXSk7CisgICAgfQorCisgICAgLyogaWYgdGhlIGFmZmVjdGVkIGl0ZW0gd2FzIG5vdCB3aG9sbHkgc2hpZnRlZCB0aGVuIHdlIHBlcmZvcm0gYWxsIG5lY2Vzc2FyeSBvcGVyYXRpb25zIG9uIHRoYXQgcGFydCBvciB3aG9sZSBvZiB0aGUKKyAgICAgICBhZmZlY3RlZCBpdGVtIHdoaWNoIHJlbWFpbnMgaW4gUyAqLworICAgIGlmICggMCA8PSBpdGVtX3BvcyAmJiBpdGVtX3BvcyA8IHRiLT5zMG51bSApCisgICAgeyAvKiBpZiB3ZSBtdXN0IGluc2VydCBvciBhcHBlbmQgaW50byBidWZmZXIgU1swXSAqLworCisJc3dpdGNoIChmbGFnKQorCXsKKwljYXNlIE1fSU5TRVJUOiAgIC8qIGluc2VydCBpdGVtIGludG8gU1swXSAqLworCSAgICBiaS50YiA9IHRiOworCSAgICBiaS5iaV9iaCA9IHRiUzA7CisJICAgIGJpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgMCk7CisJICAgIGJpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSk7CisJICAgIGxlYWZfaW5zZXJ0X2ludG9fYnVmICgmYmksIGl0ZW1fcG9zLCBpaCwgYm9keSwgemVyb3NfbnVtKTsKKworCSAgICAvKiBJZiB3ZSBpbnNlcnQgdGhlIGZpcnN0IGtleSBjaGFuZ2UgdGhlIGRlbGltaXRpbmcga2V5ICovCisJICAgIGlmKCBpdGVtX3BvcyA9PSAwICkgeworCQlpZiAodGItPkNGTFswXSkgLyogY2FuIGJlIDAgaW4gcmVpc2VyZnNjayAqLworCQkgICAgcmVwbGFjZV9rZXkodGIsIHRiLT5DRkxbMF0sIHRiLT5sa2V5WzBdLHRiUzAsMCk7CisKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgTV9QQVNURTogeyAgLyogYXBwZW5kIGl0ZW0gaW4gU1swXSAqLworCSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogcGFzdGVkOworCisJICAgIHBhc3RlZCA9IEJfTl9QSVRFTV9IRUFEICh0YlMwLCBpdGVtX3Bvcyk7CisJICAgIC8qIHdoZW4gZGlyZWN0b3J5LCBtYXkgYmUgbmV3IGVudHJ5IGFscmVhZHkgcGFzdGVkICovCisJICAgIGlmIChpc19kaXJlbnRyeV9sZV9paCAocGFzdGVkKSkgeworCQlpZiAoIHBvc19pbl9pdGVtID49IDAgJiYKKwkJICAgIHBvc19pbl9pdGVtIDw9IGloX2VudHJ5X2NvdW50KHBhc3RlZCkgKSB7CisKKwkJICAgIFJGQUxTRSggISB0Yi0+aW5zZXJ0X3NpemVbMF0sIAorCQkJICAgICJQQVAtMTIyNjA6IGluc2VydF9zaXplIGlzIDAgYWxyZWFkeSIpOworCisJCSAgICAvKiBwcmVwYXJlIHNwYWNlICovCisJCSAgICBiaS50YiA9IHRiOworCQkgICAgYmkuYmlfYmggPSB0YlMwOworCQkgICAgYmkuYmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKTsKKwkJICAgIGJpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSk7CisJCSAgICBsZWFmX3Bhc3RlX2luX2J1ZmZlcigmYmksIGl0ZW1fcG9zLCBwb3NfaW5faXRlbSwgdGItPmluc2VydF9zaXplWzBdLCBib2R5LCB6ZXJvc19udW0pOworCisJCSAgICAvKiBwYXN0ZSBlbnRyeSAqLworCQkgICAgbGVhZl9wYXN0ZV9lbnRyaWVzICgKKwkJCWJpLmJpX2JoLCBpdGVtX3BvcywgcG9zX2luX2l0ZW0sIDEsIChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJvZHksCisJCQlib2R5ICsgREVIX1NJWkUsIHRiLT5pbnNlcnRfc2l6ZVswXQorCQkJKTsKKwkJICAgIGlmICggISBpdGVtX3BvcyAmJiAhIHBvc19pbl9pdGVtICkgeworCQkJUkZBTFNFKCAhdGItPkNGTFswXSB8fCAhdGItPkxbMF0sIAorCQkJCSJQQVAtMTIyNzA6IENGTFswXS9MWzBdIG11c3QgYmUgc3BlY2lmaWVkIik7CisJCQlpZiAodGItPkNGTFswXSkgeworCQkJICAgIHJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZMWzBdLCB0Yi0+bGtleVswXSx0YlMwLDApOworCisJCQl9CisJCSAgICB9CisJCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQl9CisJICAgIH0gZWxzZSB7IC8qIHJlZ3VsYXIgb2JqZWN0ICovCisJCWlmICggcG9zX2luX2l0ZW0gPT0gaWhfaXRlbV9sZW4ocGFzdGVkKSApIHsKKworCQkgICAgUkZBTFNFKCB0Yi0+aW5zZXJ0X3NpemVbMF0gPD0gMCwKKwkJCSAgICAiUEFQLTEyMjc1OiBpbnNlcnQgc2l6ZSBtdXN0IG5vdCBiZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGItPmluc2VydF9zaXplWzBdKTsKKwkJICAgIGJpLnRiID0gdGI7CisJCSAgICBiaS5iaV9iaCA9IHRiUzA7CisJCSAgICBiaS5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApOworCQkgICAgYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxKTsKKwkJICAgIGxlYWZfcGFzdGVfaW5fYnVmZmVyICgmYmksIGl0ZW1fcG9zLCBwb3NfaW5faXRlbSwgdGItPmluc2VydF9zaXplWzBdLCBib2R5LCB6ZXJvc19udW0pOworCisJCSAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKHBhc3RlZCkpIHsKKyNpZiAwCisJCQlSRkFMU0UoIHRiLT5pbnNlcnRfc2l6ZVswXSAhPSBVTkZNX1BfU0laRSwKKwkJCQkiUEFQLTEyMjgwOiBpbnNlcnRfc2l6ZSBmb3IgaW5kaXJlY3QgaXRlbSBtdXN0IGJlICVkLCBub3QgJWQiLAorCQkJCVVORk1fUF9TSVpFLCB0Yi0+aW5zZXJ0X3NpemVbMF0pOworI2VuZGlmCisJCQlzZXRfaWhfZnJlZV9zcGFjZSAocGFzdGVkLCAwKTsKKwkJICAgIH0KKwkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7CisJCX0KKworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworCQllbHNlIHsKKwkJICAgIGlmICggdGItPmluc2VydF9zaXplWzBdICkgeworCQkJcHJpbnRfY3VyX3RiICgiMTIyODUiKTsKKwkJCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJQQVAtMTIyODU6IGJhbGFuY2VfbGVhZjogaW5zZXJ0X3NpemUgbXVzdCBiZSAwICglZCkiLCB0Yi0+aW5zZXJ0X3NpemVbMF0pOworCQkgICAgfQorCQl9CisjZW5kaWYgLyogQ09ORklHX1JFSVNFUkZTX0NIRUNLICovCisJICAgIAorCSAgICB9CisJfSAvKiBjYXNlIE1fUEFTVEU6ICovCisJfQorICAgIH0KKworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworICAgIGlmICggZmxhZyA9PSBNX1BBU1RFICYmIHRiLT5pbnNlcnRfc2l6ZVswXSApIHsKKwlwcmludF9jdXJfdGIgKCIxMjI5MCIpOworCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJQQVAtMTIyOTA6IGJhbGFuY2VfbGVhZjogaW5zZXJ0X3NpemUgaXMgc3RpbGwgbm90IDAgKCVkKSIsIHRiLT5pbnNlcnRfc2l6ZVswXSk7CisgICAgfQorI2VuZGlmIC8qIENPTkZJR19SRUlTRVJGU19DSEVDSyAqLworCisgICAgcmV0dXJuIDA7Cit9IC8qIExlYWYgbGV2ZWwgb2YgdGhlIHRyZWUgaXMgYmFsYW5jZWQgKGVuZCBvZiBiYWxhbmNlX2xlYWYpICovCisKKworCisvKiBNYWtlIGVtcHR5IG5vZGUgKi8KK3ZvaWQgbWFrZV9lbXB0eV9ub2RlIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBiaSkKK3sKKyAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7CisKKyAgICBSRkFMU0UoIGJpLT5iaV9iaCA9PSBOVUxMLCAiUEFQLTEyMjk1OiBwb2ludGVyIHRvIHRoZSBidWZmZXIgaXMgTlVMTCIpOworCisgICAgYmxraCA9IEJfQkxLX0hFQUQoYmktPmJpX2JoKTsKKyAgICBzZXRfYmxraF9ucl9pdGVtKCBibGtoLCAwICk7CisgICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwgTUFYX0NISUxEX1NJWkUoYmktPmJpX2JoKSApOworCisgICAgaWYgKGJpLT5iaV9wYXJlbnQpCisJQl9OX0NISUxEIChiaS0+YmlfcGFyZW50LCBiaS0+YmlfcG9zaXRpb24pLT5kY19zaXplID0gMDsgLyogRW5kaWFuIHNhZmUgaWYgMCAqLworfQorCisKKy8qIEdldCBmaXJzdCBlbXB0eSBidWZmZXIgKi8KK3N0cnVjdCBidWZmZXJfaGVhZCAqIGdldF9GRUIgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YikKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBmaXJzdF9iOworICAgIHN0cnVjdCBidWZmZXJfaW5mbyBiaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfRkVCX1NJWkU7IGkgKyspCisJaWYgKHRiLT5GRUJbaV0gIT0gMCkKKwkgICAgYnJlYWs7CisKKyAgICBpZiAoaSA9PSBNQVhfRkVCX1NJWkUpCisJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLCAidnMtMTIzMDA6IGdldF9GRUI6IEZFQiBsaXN0IGlzIGVtcHR5Iik7CisKKyAgICBiaS50YiA9IHRiOworICAgIGJpLmJpX2JoID0gZmlyc3RfYiA9IHRiLT5GRUJbaV07CisgICAgYmkuYmlfcGFyZW50ID0gTlVMTDsKKyAgICBiaS5iaV9wb3NpdGlvbiA9IDA7CisgICAgbWFrZV9lbXB0eV9ub2RlICgmYmkpOworICAgIHNldF9idWZmZXJfdXB0b2RhdGUoZmlyc3RfYik7CisgICAgdGItPkZFQltpXSA9IE5VTEw7CisgICAgdGItPnVzZWRbaV0gPSBmaXJzdF9iOworCisgICAgcmV0dXJuKGZpcnN0X2IpOworfQorCisKKy8qIFRoaXMgaXMgbm93IHVzZWQgYmVjYXVzZSByZWlzZXJmc19mcmVlX2Jsb2NrIGhhcyB0byBiZSBhYmxlIHRvCisqKiBzY2hlZHVsZS4KKyovCitzdGF0aWMgdm9pZCBzdG9yZV90aHJvd24gKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0Yiwgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoYnVmZmVyX2RpcnR5IChiaCkpCisgICAgICByZWlzZXJmc193YXJuaW5nICh0Yi0+dGJfc2IsICJzdG9yZV90aHJvd24gZGVhbHMgd2l0aCBkaXJ0eSBidWZmZXIiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mICh0Yi0+dGhyb3duKS9zaXplb2YgKHRiLT50aHJvd25bMF0pOyBpICsrKQorCWlmICghdGItPnRocm93bltpXSkgeworCSAgICB0Yi0+dGhyb3duW2ldID0gYmg7CisJICAgIGdldF9iaChiaCkgOyAvKiBmcmVlX3Rocm93biBwdXRzIHRoaXMgKi8KKwkgICAgcmV0dXJuOworCX0KKyAgICByZWlzZXJmc193YXJuaW5nICh0Yi0+dGJfc2IsICJzdG9yZV90aHJvd246IHRvbyBtYW55IHRocm93biBidWZmZXJzIik7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfdGhyb3duKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiKSB7CisgICAgaW50IGkgOworICAgIGJfYmxvY2tucl90IGJsb2NrbnIgOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHRiLT50aHJvd24pL3NpemVvZiAodGItPnRocm93blswXSk7IGkrKykgeworCWlmICh0Yi0+dGhyb3duW2ldKSB7CisJICAgIGJsb2NrbnIgPSB0Yi0+dGhyb3duW2ldLT5iX2Jsb2NrbnIgOworCSAgICBpZiAoYnVmZmVyX2RpcnR5ICh0Yi0+dGhyb3duW2ldKSkKKwkgICAgICByZWlzZXJmc193YXJuaW5nICh0Yi0+dGJfc2IsCisJCQkJImZyZWVfdGhyb3duIGRlYWxzIHdpdGggZGlydHkgYnVmZmVyICVkIiwKKwkJCQlibG9ja25yKTsKKwkgICAgYnJlbHNlKHRiLT50aHJvd25baV0pIDsgLyogaW5jcmVtZW50ZWQgaW4gc3RvcmVfdGhyb3duICovCisJICAgIHJlaXNlcmZzX2ZyZWVfYmxvY2sgKHRiLT50cmFuc2FjdGlvbl9oYW5kbGUsIE5VTEwsIGJsb2NrbnIsIDApOworCX0KKyAgICB9Cit9CisKK3ZvaWQgcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0Yiwgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCit7CisgICAgc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisgICAgYmxraCA9IEJfQkxLX0hFQUQoYmgpOworICAgIHNldF9ibGtoX2xldmVsKCBibGtoLCBGUkVFX0xFVkVMICk7CisgICAgc2V0X2Jsa2hfbnJfaXRlbSggYmxraCwgMCApOworICAgIAorICAgIGNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisgICAgc3RvcmVfdGhyb3duICh0YiwgYmgpOworfQorCisvKiBSZXBsYWNlIG5fZGVzdCd0aCBrZXkgaW4gYnVmZmVyIGRlc3QgYnkgbl9zcmMndGgga2V5IG9mIGJ1ZmZlciBzcmMuKi8KK3ZvaWQgcmVwbGFjZV9rZXkgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0Yiwgc3RydWN0IGJ1ZmZlcl9oZWFkICogZGVzdCwgaW50IG5fZGVzdCwKKwkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzcmMsIGludCBuX3NyYykKK3sKKworICAgIFJGQUxTRSggZGVzdCA9PSBOVUxMIHx8IHNyYyA9PSBOVUxMLAorCSAgICAidnMtMTIzMDU6IHNvdXJjZSBvciBkZXN0aW5hdGlvbiBidWZmZXIgaXMgMCAoc3JjPSVwLCBkZXN0PSVwKSIsCisJICAgIHNyYywgZGVzdCk7CisgICAgUkZBTFNFKCAhIEJfSVNfS0VZU19MRVZFTCAoZGVzdCksCisJICAgICJ2cy0xMjMxMDogaW52YWxpZCBsZXZlbCAoJXopIGZvciBkZXN0aW5hdGlvbiBidWZmZXIuIGRlc3QgbXVzdCBiZSBsZWFmIiwKKwkgICAgZGVzdCk7CisgICAgUkZBTFNFKCBuX2Rlc3QgPCAwIHx8IG5fc3JjIDwgMCwKKwkgICAgInZzLTEyMzE1OiBzcmMoJWQpIG9yIGRlc3QoJWQpIGtleSBudW1iZXIgPCAwIiwgbl9zcmMsIG5fZGVzdCk7CisgICAgUkZBTFNFKCBuX2Rlc3QgPj0gQl9OUl9JVEVNUyhkZXN0KSB8fCBuX3NyYyA+PSBCX05SX0lURU1TKHNyYyksCisJICAgICJ2cy0xMjMyMDogc3JjKCVkKCVkKSkgb3IgZGVzdCglZCglZCkpIGtleSBudW1iZXIgaXMgdG9vIGJpZyIsCisJICAgIG5fc3JjLCBCX05SX0lURU1TKHNyYyksIG5fZGVzdCwgQl9OUl9JVEVNUyhkZXN0KSk7CisgICAKKyAgICBpZiAoQl9JU19JVEVNU19MRVZFTCAoc3JjKSkKKwkvKiBzb3VyY2UgYnVmZmVyIGNvbnRhaW5zIGxlYWYgbm9kZSAqLworCW1lbWNweSAoQl9OX1BERUxJTV9LRVkoZGVzdCxuX2Rlc3QpLCBCX05fUElURU1fSEVBRChzcmMsbl9zcmMpLCBLRVlfU0laRSk7CisgICAgZWxzZQorCW1lbWNweSAoQl9OX1BERUxJTV9LRVkoZGVzdCxuX2Rlc3QpLCBCX05fUERFTElNX0tFWShzcmMsbl9zcmMpLCBLRVlfU0laRSk7CisKKyAgICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKHRiLCBkZXN0LCAwKTsKK30KKworCitpbnQgZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKAorCQkJCXN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgCisJCQkJaW50IGgKKwkJCQkpCit7CisgIGludCBTaF9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIGggKyAxKTsKKworICBSRkFMU0UoIFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCkgPT0gMCB8fCB0Yi0+RkxbaF0gPT0gMCwKKwkgICJ2cy0xMjMyNTogRkxbJWRdKCVwKSBvciBGWyVkXSglcCkgZG9lcyBub3QgZXhpc3QiLCAKKwkgIGgsIHRiLT5GTFtoXSwgaCwgUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKSk7CisKKyAgaWYgKFNoX3Bvc2l0aW9uID09IDApCisgICAgcmV0dXJuIEJfTlJfSVRFTVMgKHRiLT5GTFtoXSk7CisgIGVsc2UKKyAgICByZXR1cm4gU2hfcG9zaXRpb24gLSAxOworfQorCisKK2ludCBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCit7CisgIGludCBTaF9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIGggKyAxKTsKKworICBSRkFMU0UoIFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCkgPT0gMCB8fCB0Yi0+RlJbaF0gPT0gMCwKKwkgICJ2cy0xMjMzMDogRlslZF0oJXApIG9yIEZSWyVkXSglcCkgZG9lcyBub3QgZXhpc3QiLCAKKwkgIGgsIFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCksIGgsIHRiLT5GUltoXSk7CisKKyAgaWYgKFNoX3Bvc2l0aW9uID09IEJfTlJfSVRFTVMgKFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCkpKQorICAgIHJldHVybiAwOworICBlbHNlCisgICAgcmV0dXJuIFNoX3Bvc2l0aW9uICsgMTsKK30KKworCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisKK2ludCBpc19yZXVzYWJsZSAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgYl9ibG9ja25yX3QgYmxvY2ssIGludCBiaXRfdmFsdWUpOworc3RhdGljIHZvaWQgY2hlY2tfaW50ZXJuYWxfbm9kZSAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIGNoYXIgKiBtZXMpCit7CisgIHN0cnVjdCBkaXNrX2NoaWxkICogZGM7CisgIGludCBpOworCisgIFJGQUxTRSggIWJoLCAiUEFQLTEyMzM2OiBiaCA9PSAwIik7CisKKyAgaWYgKCFiaCB8fCAhQl9JU19JTl9UUkVFIChiaCkpCisgICAgcmV0dXJuOworIAorICBSRkFMU0UoICFidWZmZXJfZGlydHkgKGJoKSAmJiAKKwkgICEoYnVmZmVyX2pvdXJuYWxlZChiaCkgfHwgYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpKSwKKwkgICJQQVAtMTIzMzc6IGJ1ZmZlciAoJWIpIG11c3QgYmUgZGlydHkiLCBiaCk7CisgIGRjID0gQl9OX0NISUxEIChiaCwgMCk7CisKKyAgZm9yIChpID0gMDsgaSA8PSBCX05SX0lURU1TIChiaCk7IGkgKyssIGRjICsrKSB7CisgICAgaWYgKCFpc19yZXVzYWJsZSAocywgZGNfYmxvY2tfbnVtYmVyKGRjKSwgMSkgKSB7CisgICAgICBwcmludF9jdXJfdGIgKG1lcyk7CisgICAgICByZWlzZXJmc19wYW5pYyAocywgIlBBUC0xMjMzODogY2hlY2tfaW50ZXJuYWxfbm9kZTogaW52YWxpZCBjaGlsZCBwb2ludGVyICV5IGluICViIiwgZGMsIGJoKTsKKyAgICB9CisgIH0KK30KKworCitzdGF0aWMgaW50IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIGNoYXIgKiB3aGljaCkKK3sKKyAgaWYgKCAoIWJ1ZmZlcl9qb3VybmFsX3ByZXBhcmVkIChiaCkgJiYgYnVmZmVyX2xvY2tlZCAoYmgpKSB8fAorICAgICAgICAhQl9JU19JTl9UUkVFIChiaCkgKSB7CisgICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgInZzLTEyMzM5OiBsb2NrZWRfb3Jfbm90X2luX3RyZWU6ICVzICglYikiLAorICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLCBiaCk7CisgICAgcmV0dXJuIDE7CisgIH0gCisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY2hlY2tfYmVmb3JlX2JhbGFuY2luZyAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiKQoreworICBpbnQgcmV0dmFsID0gMDsJCisKKyAgaWYgKCBjdXJfdGIgKSB7CisgICAgcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgInZzLTEyMzM1OiBjaGVja19iZWZvcmVfYmFsYW5jaW5nOiAiCisJCSAgICAic3VzcGVjdCB0aGF0IHNjaGVkdWxlIG9jY3VycmVkIGJhc2VkIG9uIGN1cl90YiBub3QgYmVpbmcgbnVsbCBhdCB0aGlzIHBvaW50IGluIGNvZGUuICIKKwkJICAgICJkb19iYWxhbmNlIGNhbm5vdCBwcm9wZXJseSBoYW5kbGUgc2NoZWR1bGUgb2NjdXJyaW5nIHdoaWxlIGl0IHJ1bnMuIik7CisgIH0KKyAgCisgIC8qIGRvdWJsZSBjaGVjayB0aGF0IGJ1ZmZlcnMgdGhhdCB3ZSB3aWxsIG1vZGlmeSBhcmUgdW5sb2NrZWQuIChmaXhfbm9kZXMgc2hvdWxkIGFscmVhZHkgaGF2ZQorICAgICBwcmVwcGVkIGFsbCBvZiB0aGVzZSBmb3IgdXMpLiAqLworICBpZiAoIHRiLT5sbnVtWzBdICkgeworICAgIHJldHZhbCB8PSBsb2NrZWRfb3Jfbm90X2luX3RyZWUgKHRiLT5MWzBdLCAiTFswXSIpOworICAgIHJldHZhbCB8PSBsb2NrZWRfb3Jfbm90X2luX3RyZWUgKHRiLT5GTFswXSwgIkZMWzBdIik7CisgICAgcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSAodGItPkNGTFswXSwgIkNGTFswXSIpOworICAgIGNoZWNrX2xlYWYgKHRiLT5MWzBdKTsKKyAgfQorICBpZiAoIHRiLT5ybnVtWzBdICkgeworICAgIHJldHZhbCB8PSBsb2NrZWRfb3Jfbm90X2luX3RyZWUgKHRiLT5SWzBdLCAiUlswXSIpOworICAgIHJldHZhbCB8PSBsb2NrZWRfb3Jfbm90X2luX3RyZWUgKHRiLT5GUlswXSwgIkZSWzBdIik7CisgICAgcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSAodGItPkNGUlswXSwgIkNGUlswXSIpOworICAgIGNoZWNrX2xlYWYgKHRiLT5SWzBdKTsKKyAgfQorICByZXR2YWwgfD0gbG9ja2VkX29yX25vdF9pbl90cmVlIChQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpLCAiU1swXSIpOworICBjaGVja19sZWFmIChQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisKK3N0YXRpYyB2b2lkIGNoZWNrX2FmdGVyX2JhbGFuY2VfbGVhZiAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiKQoreworICAgIGlmICh0Yi0+bG51bVswXSkgeworCWlmIChCX0ZSRUVfU1BBQ0UgKHRiLT5MWzBdKSAhPSAKKwkgICAgTUFYX0NISUxEX1NJWkUgKHRiLT5MWzBdKSAtIGRjX3NpemUoQl9OX0NISUxEICh0Yi0+RkxbMF0sIGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCkpKSkgeworCSAgICBwcmludF9jdXJfdGIgKCIxMjIyMSIpOworCSAgICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiUEFQLTEyMzU1OiBjaGVja19hZnRlcl9iYWxhbmNlX2xlYWY6IHNoaWZ0IHRvIGxlZnQgd2FzIGluY29ycmVjdCIpOworCX0KKyAgICB9CisgICAgaWYgKHRiLT5ybnVtWzBdKSB7CisJaWYgKEJfRlJFRV9TUEFDRSAodGItPlJbMF0pICE9IAorCSAgICBNQVhfQ0hJTERfU0laRSAodGItPlJbMF0pIC0gZGNfc2l6ZShCX05fQ0hJTEQgKHRiLT5GUlswXSwgZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCkpKSkgeworCSAgICBwcmludF9jdXJfdGIgKCIxMjIyMiIpOworCSAgICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiUEFQLTEyMzYwOiBjaGVja19hZnRlcl9iYWxhbmNlX2xlYWY6IHNoaWZ0IHRvIHJpZ2h0IHdhcyBpbmNvcnJlY3QiKTsKKwl9CisgICAgfQorICAgIGlmIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwxKSAmJgorCShCX0ZSRUVfU1BBQ0UgKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLDApKSAhPSAKKwkJICAgIChNQVhfQ0hJTERfU0laRSAoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsMCkpIC0KKwkJICAgIGRjX3NpemUoQl9OX0NISUxEIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwxKSwKKwkJICAgIFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIDEpKSkpICkpIHsKKwlpbnQgbGVmdCA9IEJfRlJFRV9TUEFDRSAoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsMCkpOworCWludCByaWdodCA9IChNQVhfQ0hJTERfU0laRSAoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsMCkpIC0KKwkJICAgIGRjX3NpemUoQl9OX0NISUxEIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwxKSwKKwkJCVBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIDEpKSkpOworCXByaW50X2N1cl90YiAoIjEyMjIzIik7CisJcmVpc2VyZnNfd2FybmluZyAodGItPnRiX3NiLAorCSAgICAiQl9GUkVFX1NQQUNFIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwwKSkgPSAlZDsgIgorICAgIAkgICAgIk1BWF9DSElMRF9TSVpFICglZCkgLSBkY19zaXplKCAleSwgJWQgKSBbJWRdID0gJWQiLAorCSAgICBsZWZ0LAorCSAgICBNQVhfQ0hJTERfU0laRSAoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsMCkpLAorCSAgICBQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwxKSwKKwkgICAgUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSksCisJICAgIGRjX3NpemUoQl9OX0NISUxEIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwxKSwgUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSApKSApLAorCSAgICByaWdodCApOworCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJQQVAtMTIzNjU6IGNoZWNrX2FmdGVyX2JhbGFuY2VfbGVhZjogUyBpcyBpbmNvcnJlY3QiKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgY2hlY2tfbGVhZl9sZXZlbCAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiKQoreworICBjaGVja19sZWFmICh0Yi0+TFswXSk7CisgIGNoZWNrX2xlYWYgKHRiLT5SWzBdKTsKKyAgY2hlY2tfbGVhZiAoUEFUSF9QTEFTVF9CVUZGRVIgKHRiLT50Yl9wYXRoKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2ludGVybmFsX2xldmVscyAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiKQoreworICBpbnQgaDsKKworICAvKiBjaGVjayBhbGwgaW50ZXJuYWwgbm9kZXMgKi8KKyAgZm9yIChoID0gMTsgdGItPmluc2VydF9zaXplW2hdOyBoICsrKSB7CisgICAgY2hlY2tfaW50ZXJuYWxfbm9kZSAodGItPnRiX3NiLCBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpLCAiQkFEIEJVRkZFUiBPTiBQQVRIIik7CisgICAgaWYgKHRiLT5sbnVtW2hdKQorICAgICAgY2hlY2tfaW50ZXJuYWxfbm9kZSAodGItPnRiX3NiLCB0Yi0+TFtoXSwgIkJBRCBMIik7CisgICAgaWYgKHRiLT5ybnVtW2hdKQorICAgICAgY2hlY2tfaW50ZXJuYWxfbm9kZSAodGItPnRiX3NiLCB0Yi0+UltoXSwgIkJBRCBSIik7CisgIH0KKworfQorCisjZW5kaWYKKworCisKKworCisKKy8qIE5vdyB3ZSBoYXZlIGFsbCBvZiB0aGUgYnVmZmVycyB0aGF0IG11c3QgYmUgdXNlZCBpbiBiYWxhbmNpbmcgb2YKKyAgIHRoZSB0cmVlLiAgV2UgcmVseSBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHNjaGVkdWxlKCkgd2lsbCBub3Qgb2NjdXIKKyAgIHdoaWxlIGRvX2JhbGFuY2Ugd29ya3MuICggT25seSBpbnRlcnJ1cHQgaGFuZGxlcnMgYXJlIGFjY2VwdGFibGUuKQorICAgV2UgYmFsYW5jZSB0aGUgdHJlZSBhY2NvcmRpbmcgdG8gdGhlIGFuYWx5c2lzIG1hZGUgYmVmb3JlIHRoaXMsCisgICB1c2luZyBidWZmZXJzIGFscmVhZHkgb2J0YWluZWQuICBGb3IgU01QIHN1cHBvcnQgaXQgd2lsbCBzb21lZGF5IGJlCisgICBuZWNlc3NhcnkgdG8gYWRkIG9yZGVyZWQgbG9ja2luZyBvZiB0Yi4gKi8KKworLyogU29tZSBpbnRlcmVzdGluZyBydWxlcyBvZiBiYWxhbmNpbmc6CisKKyAgIHdlIGRlbGV0ZSBhIG1heGltdW0gb2YgdHdvIG5vZGVzIHBlciBsZXZlbCBwZXIgYmFsYW5jaW5nOiB3ZSBuZXZlcgorICAgZGVsZXRlIFIsIHdoZW4gd2UgZGVsZXRlIHR3byBvZiB0aHJlZSBub2RlcyBMLCBTLCBSIHRoZW4gd2UgbW92ZQorICAgdGhlbSBpbnRvIFIuCisKKyAgIHdlIG9ubHkgZGVsZXRlIEwgaWYgd2UgYXJlIGRlbGV0aW5nIHR3byBub2RlcywgaWYgd2UgZGVsZXRlIG9ubHkKKyAgIG9uZSBub2RlIHdlIGRlbGV0ZSBTCisKKyAgIGlmIHdlIHNoaWZ0IGxlYXZlcyB0aGVuIHdlIHNoaWZ0IGFzIG11Y2ggYXMgd2UgY2FuOiB0aGlzIGlzIGEKKyAgIGRlbGliZXJhdGUgcG9saWN5IG9mIGV4dHJlbWlzbSBpbiBub2RlIHBhY2tpbmcgd2hpY2ggcmVzdWx0cyBpbgorICAgaGlnaGVyIGF2ZXJhZ2UgdXRpbGl6YXRpb24gYWZ0ZXIgcmVwZWF0ZWQgcmFuZG9tIGJhbGFuY2Ugb3BlcmF0aW9ucworICAgYXQgdGhlIGNvc3Qgb2YgbW9yZSBtZW1vcnkgY29waWVzIGFuZCBtb3JlIGJhbGFuY2luZyBhcyBhIHJlc3VsdCBvZgorICAgc21hbGwgaW5zZXJ0aW9ucyB0byBmdWxsIG5vZGVzLgorCisgICBpZiB3ZSBzaGlmdCBpbnRlcm5hbCBub2RlcyB3ZSB0cnkgdG8gZXZlbmx5IGJhbGFuY2UgdGhlIG5vZGUKKyAgIHV0aWxpemF0aW9uLCB3aXRoIGNvbnNlcXVlbnQgbGVzcyBiYWxhbmNpbmcgYXQgdGhlIGNvc3Qgb2YgbG93ZXIKKyAgIHV0aWxpemF0aW9uLgorCisgICBvbmUgY291bGQgYXJndWUgdGhhdCB0aGUgcG9saWN5IGZvciBkaXJlY3RvcmllcyBpbiBsZWF2ZXMgc2hvdWxkIGJlCisgICB0aGF0IG9mIGludGVybmFsIG5vZGVzLCBidXQgd2Ugd2lsbCB3YWl0IHVudGlsIGFub3RoZXIgZGF5IHRvCisgICBldmFsdWF0ZSB0aGlzLi4uLiAgSXQgd291bGQgYmUgbmljZSB0byBzb21lZGF5IG1lYXN1cmUgYW5kIHByb3ZlCisgICB0aGVzZSBhc3N1bXB0aW9ucyBhcyB0byB3aGF0IGlzIG9wdGltYWwuLi4uCisKKyovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19iYWxhbmNlX3N0YXJ0cyAoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIpCit7CisgICAgLyogdXNlIHByaW50X2N1cl90YigpIHRvIHNlZSBpbml0aWFsIHN0YXRlIG9mIHN0cnVjdAorICAgICAgIHRyZWVfYmFsYW5jZSAqLworCisgICAgLyogc3RvcmVfcHJpbnRfdGIgKHRiKTsgKi8KKworICAgIC8qIGRvIG5vdCBkZWxldGUsIGp1c3QgY29tbWVudCBpdCBvdXQgKi8KKy8qICAgIHByaW50X3RiKGZsYWcsIFBBVEhfTEFTVF9QT1NJVElPTih0Yi0+dGJfcGF0aCksIHRiLT50Yl9wYXRoLT5wb3NfaW5faXRlbSwgdGIsIAorCSAgICAgImNoZWNrIik7Ki8KKyAgICBSRkFMU0UoIGNoZWNrX2JlZm9yZV9iYWxhbmNpbmcgKHRiKSwgIlBBUC0xMjM0MDogbG9ja2VkIGJ1ZmZlcnMgaW4gVEIiKTsKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKyAgICBjdXJfdGIgPSB0YjsKKyNlbmRpZgorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19iYWxhbmNlX2NvbXBsZXRlZCAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiKQoreworICAgIAorI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworICAgIGNoZWNrX2xlYWZfbGV2ZWwgKHRiKTsKKyAgICBjaGVja19pbnRlcm5hbF9sZXZlbHMgKHRiKTsKKyAgICBjdXJfdGIgPSBOVUxMOworI2VuZGlmCisKKyAgICAvKiByZWlzZXJmc19mcmVlX2Jsb2NrIGlzIG5vIGxvbmdlciBzY2hlZHVsZSBzYWZlLiAgU28sIHdlIG5lZWQgdG8KKyAgICAqKiBwdXQgdGhlIGJ1ZmZlcnMgd2Ugd2FudCBmcmVlZCBvbiB0aGUgdGhyb3duIGxpc3QgZHVyaW5nIGRvX2JhbGFuY2UsCisgICAgKiogYW5kIHRoZW4gZnJlZSB0aGVtIG5vdworICAgICovCisKKyAgICBSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX2RvX2JhbGFuY2UgKys7CisKKworICAgIC8qIHJlbGVhc2UgYWxsIG5vZGVzIGhvbGQgdG8gcGVyZm9ybSB0aGUgYmFsYW5jaW5nICovCisgICAgdW5maXhfbm9kZXModGIpOworCisgICAgZnJlZV90aHJvd24odGIpIDsKK30KKworCisKKworCit2b2lkIGRvX2JhbGFuY2UgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgLyogdHJlZV9iYWxhbmNlIHN0cnVjdHVyZSAqLworCQkgc3RydWN0IGl0ZW1faGVhZCAqIGloLAkgICAvKiBpdGVtIGhlYWRlciBvZiBpbnNlcnRlZCBpdGVtICovCisJCSBjb25zdCBjaGFyICogYm9keSwgIC8qIGJvZHkgIG9mIGluc2VydGVkIGl0ZW0gb3IgYnl0ZXMgdG8gcGFzdGUgKi8KKwkJIGludCBmbGFnKSAgLyogaSAtIGluc2VydCwgZCAtIGRlbGV0ZQorCQkJICAgICAgIGMgLSBjdXQsIHAgLSBwYXN0ZQorCQkJCQkJICAgICAgCisJCQkgICAgICAgQ3V0IG1lYW5zIGRlbGV0ZSBwYXJ0IG9mIGFuIGl0ZW0KKwkJCSAgICAgICAoaW5jbHVkZXMgcmVtb3ZpbmcgYW4gZW50cnkgZnJvbSBhCisJCQkgICAgICAgZGlyZWN0b3J5KS4KKwkJCQkJCSAgICAgIAorCQkJICAgICAgIERlbGV0ZSBtZWFucyBkZWxldGUgd2hvbGUgaXRlbS4KKwkJCQkJCSAgICAgIAorCQkJICAgICAgIEluc2VydCBtZWFucyBhZGQgYSBuZXcgaXRlbSBpbnRvIHRoZQorCQkJICAgICAgIHRyZWUuCisJCQkJCQkgICAgICAJCQkJCQkgICAgICAKKwkJCSAgICAgICBQYXN0ZSBtZWFucyB0byBhcHBlbmQgdG8gdGhlIGVuZCBvZiBhbgorCQkJICAgICAgIGV4aXN0aW5nIGZpbGUgb3IgdG8gaW5zZXJ0IGEgZGlyZWN0b3J5CisJCQkgICAgICAgZW50cnkuICAqLworeworICAgIGludCBjaGlsZF9wb3MsIC8qIHBvc2l0aW9uIG9mIGEgY2hpbGQgbm9kZSBpbiBpdHMgcGFyZW50ICovCisJaDsJICAgLyogbGV2ZWwgb2YgdGhlIHRyZWUgYmVpbmcgcHJvY2Vzc2VkICovCisgICAgc3RydWN0IGl0ZW1faGVhZCBpbnNlcnRfa2V5WzJdOyAvKiBpbiBvdXIgcHJvY2Vzc2luZyBvZiBvbmUgbGV2ZWwKKwkJCQkgICAgICAgd2Ugc29tZXRpbWVzIGRldGVybWluZSB3aGF0CisJCQkJICAgICAgIG11c3QgYmUgaW5zZXJ0ZWQgaW50byB0aGUgbmV4dAorCQkJCSAgICAgICBoaWdoZXIgbGV2ZWwuICBUaGlzIGluc2VydGlvbgorCQkJCSAgICAgICBjb25zaXN0cyBvZiBhIGtleSBvciB0d28ga2V5cworCQkJCSAgICAgICBhbmQgdGhlaXIgY29ycmVzcG9uZGluZworCQkJCSAgICAgICBwb2ludGVycyAqLworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqaW5zZXJ0X3B0clsyXTsgLyogaW5zZXJ0ZWQgbm9kZS1wdHJzIGZvciB0aGUgbmV4dAorCQkJCQkgIGxldmVsICovCisKKyAgICB0Yi0+dGJfbW9kZSA9IGZsYWc7CisgICAgdGItPm5lZWRfYmFsYW5jZV9kaXJ0eSA9IDA7CisKKyAgICBpZiAoRklMRVNZU1RFTV9DSEFOR0VEX1RCKHRiKSkgeworICAgICAgICByZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsICJjbG0tNjAwMDogZG9fYmFsYW5jZSwgZnMgZ2VuZXJhdGlvbiBoYXMgY2hhbmdlZFxuIikgOworICAgIH0KKyAgICAvKiBpZiB3ZSBoYXZlIG5vIHJlYWwgd29yayB0byBkbyAgKi8KKyAgICBpZiAoICEgdGItPmluc2VydF9zaXplWzBdICkgeworCXJlaXNlcmZzX3dhcm5pbmcgKHRiLT50Yl9zYiwKKwkJCSAgIlBBUC0xMjM1MDogZG9fYmFsYW5jZTogaW5zZXJ0X3NpemUgPT0gMCwgbW9kZSA9PSAlYyIsCisJCQkgIGZsYWcpOworCXVuZml4X25vZGVzKHRiKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgYXRvbWljX2luYyAoJihmc19nZW5lcmF0aW9uICh0Yi0+dGJfc2IpKSk7CisgICAgZG9fYmFsYW5jZV9zdGFydHMgKHRiKTsKKyAgICAKKwkvKiBiYWxhbmNlIGxlYWYgcmV0dXJucyAwIGV4Y2VwdCBpZiBjb21iaW5pbmcgTCBSIGFuZCBTIGludG8KKwkgICBvbmUgbm9kZS4gIHNlZSBiYWxhbmNlX2ludGVybmFsKCkgZm9yIGV4cGxhbmF0aW9uIG9mIHRoaXMKKwkgICBsaW5lIG9mIGNvZGUuKi8KKwljaGlsZF9wb3MgPSBQQVRIX0hfQl9JVEVNX09SREVSICh0Yi0+dGJfcGF0aCwgMCkgKworCSAgYmFsYW5jZV9sZWFmICh0YiwgaWgsIGJvZHksIGZsYWcsIGluc2VydF9rZXksIGluc2VydF9wdHIpOworCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisgICAgY2hlY2tfYWZ0ZXJfYmFsYW5jZV9sZWFmICh0Yik7CisjZW5kaWYKKworICAgIC8qIEJhbGFuY2UgaW50ZXJuYWwgbGV2ZWwgb2YgdGhlIHRyZWUuICovCisgICAgZm9yICggaCA9IDE7IGggPCBNQVhfSEVJR0hUICYmIHRiLT5pbnNlcnRfc2l6ZVtoXTsgaCsrICkKKwljaGlsZF9wb3MgPSBiYWxhbmNlX2ludGVybmFsICh0YiwgaCwgY2hpbGRfcG9zLCBpbnNlcnRfa2V5LCBpbnNlcnRfcHRyKTsKKworCisgICAgZG9fYmFsYW5jZV9jb21wbGV0ZWQgKHRiKTsKKworfQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvZmlsZS5jIGIvZnMvcmVpc2VyZnMvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OTUwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy9maWxlLmMKQEAgLTAsMCArMSwxNDA4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAgYnkgSGFucyBSZWlzZXIsIGxpY2Vuc2luZyBnb3Zlcm5lZCBieSByZWlzZXJmcy9SRUFETUUKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19hY2wuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc194YXR0ci5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKworLyoKKyoqIFdlIHBhY2sgdGhlIHRhaWxzIG9mIGZpbGVzIG9uIGZpbGUgY2xvc2UsIG5vdCBhdCB0aGUgdGltZSB0aGV5IGFyZSB3cml0dGVuLgorKiogVGhpcyBpbXBsaWVzIGFuIHVubmVjZXNzYXJ5IGNvcHkgb2YgdGhlIHRhaWwgYW5kIGFuIHVubmVjZXNzYXJ5IGluZGlyZWN0IGl0ZW0KKyoqIGluc2VydGlvbi9iYWxhbmNpbmcsIGZvciBmaWxlcyB0aGF0IGFyZSB3cml0dGVuIGluIG9uZSB3cml0ZS4KKyoqIEl0IGF2b2lkcyB1bm5lY2Vzc2FyeSB0YWlsIHBhY2tpbmdzIChiYWxhbmNlcykgZm9yIGZpbGVzIHRoYXQgYXJlIHdyaXR0ZW4gaW4KKyoqIG11bHRpcGxlIHdyaXRlcyBhbmQgYXJlIHNtYWxsIGVub3VnaCB0byBoYXZlIHRhaWxzLgorKiogCisqKiBmaWxlX3JlbGVhc2UgaXMgY2FsbGVkIGJ5IHRoZSBWRlMgbGF5ZXIgd2hlbiB0aGUgZmlsZSBpcyBjbG9zZWQuICBJZgorKiogdGhpcyBpcyB0aGUgbGFzdCBvcGVuIGZpbGUgZGVzY3JpcHRvciwgYW5kIHRoZSBmaWxlCisqKiBzbWFsbCBlbm91Z2ggdG8gaGF2ZSBhIHRhaWwsIGFuZCB0aGUgdGFpbCBpcyBjdXJyZW50bHkgaW4gYW4KKyoqIHVuZm9ybWF0dGVkIG5vZGUsIHRoZSB0YWlsIGlzIGNvbnZlcnRlZCBiYWNrIGludG8gYSBkaXJlY3QgaXRlbS4KKyoqIAorKiogV2UgdXNlIHJlaXNlcmZzX3RydW5jYXRlX2ZpbGUgdG8gcGFjayB0aGUgdGFpbCwgc2luY2UgaXQgYWxyZWFkeSBoYXMKKyoqIGFsbCB0aGUgY29uZGl0aW9ucyBjb2RlZC4gIAorKi8KK3N0YXRpYyBpbnQgcmVpc2VyZnNfZmlsZV9yZWxlYXNlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7CisgICAgaW50IGVycjsKKyAgICBpbnQgamJlZ2luX2ZhaWx1cmUgPSAwOworCisgICAgaWYgKCFTX0lTUkVHIChpbm9kZS0+aV9tb2RlKSkKKwlCVUcgKCk7CisKKyAgICAvKiBmYXN0IG91dCBmb3Igd2hlbiBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUgKi8KKyAgICBpZiAoKGF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkgPiAxIHx8CisJIShSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfcGFja19vbl9jbG9zZV9tYXNrKSB8fCAKKyAgICAgICAgICF0YWlsX2hhc190b19iZV9wYWNrZWQoaW5vZGUpKSAgICAgICAmJiAKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA8PSAwKSB7CisJcmV0dXJuIDA7CisgICAgfSAgICAKKyAgICAKKyAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKyAgICBkb3duICgmaW5vZGUtPmlfc2VtKTsgCisgICAgLyogZnJlZWluZyBwcmVhbGxvY2F0aW9uIG9ubHkgaW52b2x2ZXMgcmVsb2dnaW5nIGJsb2NrcyB0aGF0CisgICAgICogYXJlIGFscmVhZHkgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uICBwcmVhbGxvY2F0aW9uIGdldHMKKyAgICAgKiBmcmVlZCBhdCB0aGUgZW5kIG9mIGVhY2ggdHJhbnNhY3Rpb24sIHNvIGl0IGlzIGltcG9zc2libGUgZm9yCisgICAgICogdXMgdG8gbG9nIGFueSBhZGRpdGlvbmFsIGJsb2NrcyAoaW5jbHVkaW5nIHF1b3RhIGJsb2NrcykKKyAgICAgKi8KKyAgICBlcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIDEpOworICAgIGlmIChlcnIpIHsKKwkvKiB1aCBvaCwgd2UgY2FuJ3QgYWxsb3cgdGhlIGlub2RlIHRvIGdvIGF3YXkgd2hpbGUgdGhlcmUKKwkgKiBpcyBzdGlsbCBwcmVhbGxvY2F0aW9uIGJsb2NrcyBwZW5kaW5nLiAgVHJ5IHRvIGpvaW4gdGhlCisJICogYWJvcnRlZCB0cmFuc2FjdGlvbgorCSAqLworCWpiZWdpbl9mYWlsdXJlID0gZXJyOworCWVyciA9IGpvdXJuYWxfam9pbl9hYm9ydCgmdGgsIGlub2RlLT5pX3NiLCAxKTsKKworCWlmIChlcnIpIHsKKwkgICAgLyogaG1wZiwgb3VyIGNob2ljZXMgaGVyZSBhcmVuJ3QgZ29vZC4gIFdlIGNhbiBwaW4gdGhlIGlub2RlCisJICAgICAqIHdoaWNoIHdpbGwgZGlzYWxsb3cgdW5tb3VudCBmcm9tIGV2ZXJ5IGhhcHBlbmluZywgd2UgY2FuCisJICAgICAqIGRvIG5vdGhpbmcsIHdoaWNoIHdpbGwgY29ycnVwdCByYW5kb20gbWVtb3J5IG9uIHVubW91bnQsCisJICAgICAqIG9yIHdlIGNhbiBmb3JjaWJseSByZW1vdmUgdGhlIGZpbGUgZnJvbSB0aGUgcHJlYWxsb2NhdGlvbgorCSAgICAgKiBsaXN0LCB3aGljaCB3aWxsIGxlYWsgYmxvY2tzIG9uIGRpc2suICBMZXRzIHBpbiB0aGUgaW5vZGUKKwkgICAgICogYW5kIGxldCB0aGUgYWRtaW4ga25vdyB3aGF0IGlzIGdvaW5nIG9uLgorCSAgICAgKi8KKwkgICAgaWdyYWIoaW5vZGUpOworCSAgICByZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLCAicGlubmluZyBpbm9kZSAlbHUgYmVjYXVzZSB0aGUgIgorCSAgICAgICAgICAgICAgICAgICAgICJwcmVhbGxvY2F0aW9uIGNhbid0IGJlIGZyZWVkIik7CisJICAgIGdvdG8gb3V0OworCX0KKyAgICB9CisgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7CisKKyNpZmRlZiBSRUlTRVJGU19QUkVBTExPQ0FURQorICAgIHJlaXNlcmZzX2Rpc2NhcmRfcHJlYWxsb2MgKCZ0aCwgaW5vZGUpOworI2VuZGlmCisgICAgZXJyID0gam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgMSk7CisKKyAgICAvKiBjb3B5IGJhY2sgdGhlIGVycm9yIGNvZGUgZnJvbSBqb3VybmFsX2JlZ2luICovCisgICAgaWYgKCFlcnIpCisgICAgICAgIGVyciA9IGpiZWdpbl9mYWlsdXJlOworCisgICAgaWYgKCFlcnIgJiYgYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSA8PSAxICYmCisJKFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9wYWNrX29uX2Nsb3NlX21hc2spICYmCisgICAgICAgIHRhaWxfaGFzX3RvX2JlX3BhY2tlZCAoaW5vZGUpKSB7CisJLyogaWYgcmVndWxhciBmaWxlIGlzIHJlbGVhc2VkIGJ5IGxhc3QgaG9sZGVyIGFuZCBpdCBoYXMgYmVlbgorCSAgIGFwcGVuZGVkICh3ZSBhcHBlbmQgYnkgdW5mb3JtYXR0ZWQgbm9kZSBvbmx5KSBvciBpdHMgZGlyZWN0CisJICAgaXRlbShzKSBoYWQgdG8gYmUgY29udmVydGVkLCB0aGVuIGl0IG1heSBoYXZlIHRvIGJlCisJICAgaW5kaXJlY3QyZGlyZWN0IGNvbnZlcnRlZCAqLworCWVyciA9IHJlaXNlcmZzX3RydW5jYXRlX2ZpbGUoaW5vZGUsIDApIDsKKyAgICB9CitvdXQ6CisgICAgdXAgKCZpbm9kZS0+aV9zZW0pOyAKKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX3Zmc190cnVuY2F0ZV9maWxlKHN0cnVjdCBpbm9kZSAqaW5vZGUpIHsKKyAgICByZWlzZXJmc190cnVuY2F0ZV9maWxlKGlub2RlLCAxKSA7Cit9CisKKy8qIFN5bmMgYSByZWlzZXJmcyBmaWxlLiAqLworCisvKgorICogRklYTUU6IHN5bmNfbWFwcGluZ19idWZmZXJzKCkgbmV2ZXIgaGFzIGFueXRoaW5nIHRvIHN5bmMuICBDYW4KKyAqIGJlIHJlbW92ZWQuLi4KKyAqLworCitzdGF0aWMgaW50IHJlaXNlcmZzX3N5bmNfZmlsZSgKKwkJCSAgICAgIHN0cnVjdCBmaWxlICAgKiBwX3NfZmlscCwKKwkJCSAgICAgIHN0cnVjdCBkZW50cnkgKiBwX3NfZGVudHJ5LAorCQkJICAgICAgaW50IGRhdGFzeW5jCisJCQkgICAgICApIHsKKyAgc3RydWN0IGlub2RlICogcF9zX2lub2RlID0gcF9zX2RlbnRyeS0+ZF9pbm9kZTsKKyAgaW50IG5fZXJyOworICBpbnQgYmFycmllcl9kb25lOworCisgIGlmICghU19JU1JFRyhwX3NfaW5vZGUtPmlfbW9kZSkpCisgICAgICBCVUcgKCk7CisgIG5fZXJyID0gc3luY19tYXBwaW5nX2J1ZmZlcnMocF9zX2lub2RlLT5pX21hcHBpbmcpIDsKKyAgcmVpc2VyZnNfd3JpdGVfbG9jayhwX3NfaW5vZGUtPmlfc2IpOworICBiYXJyaWVyX2RvbmUgPSByZWlzZXJmc19jb21taXRfZm9yX2lub2RlKHBfc19pbm9kZSk7CisgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhwX3NfaW5vZGUtPmlfc2IpOworICBpZiAoYmFycmllcl9kb25lICE9IDEpCisgICAgICBibGtkZXZfaXNzdWVfZmx1c2gocF9zX2lub2RlLT5pX3NiLT5zX2JkZXYsIE5VTEwpOworICBpZiAoYmFycmllcl9kb25lIDwgMCkKKyAgICByZXR1cm4gYmFycmllcl9kb25lOworICByZXR1cm4gKCBuX2VyciA8IDAgKSA/IC1FSU8gOiAwOworfQorCisvKiBJIHJlYWxseSBkbyBub3Qgd2FudCB0byBwbGF5IHdpdGggbWVtb3J5IHNob3J0YWdlIHJpZ2h0IG5vdywgc28KKyAgIHRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBhcmUgbm90IGdvaW5nIHRvIHdyaXRlIG1vcmUgdGhhbiB0aGlzIG11Y2ggcGFnZXMgYXQKKyAgIGEgdGltZS4gVGhpcyBzdGlsbCBzaG91bGQgY29uc2lkZXJhYmx5IGltcHJvdmUgcGVyZm9ybWFuY2UgY29tcGFyZWQgdG8gNGsKKyAgIGF0IGEgdGltZSBjYXNlLiBUaGlzIGlzIDMyIHBhZ2VzIG9mIDRrIHNpemUuICovCisjZGVmaW5lIFJFSVNFUkZTX1dSSVRFX1BBR0VTX0FUX0FfVElNRSAoMTI4ICogMTAyNCkgLyBQQUdFX0NBQ0hFX1NJWkUKKworLyogQWxsb2NhdGVzIGJsb2NrcyBmb3IgYSBmaWxlIHRvIGZ1bGZpbCB3cml0ZSByZXF1ZXN0LgorICAgTWFwcyBhbGwgdW5tYXBwZWQgYnV0IHByZXBhcmVkIHBhZ2VzIGZyb20gdGhlIGxpc3QuCisgICBVcGRhdGVzIG1ldGFkYXRhIHdpdGggbmV3bHkgYWxsb2NhdGVkIGJsb2NrbnVtYmVycyBhcyBuZWVkZWQgKi8KK3N0YXRpYyBpbnQgcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tzX2Zvcl9yZWdpb24oCisJCQkJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkJc3RydWN0IGlub2RlICppbm9kZSwgLyogSW5vZGUgd2Ugd29yayB3aXRoICovCisJCQkJbG9mZl90IHBvcywgLyogV3JpdGluZyBwb3NpdGlvbiAqLworCQkJCWludCBudW1fcGFnZXMsIC8qIG51bWJlciBvZiBwYWdlcyB3cml0ZSBnb2luZworCQkJCQkJICB0byB0b3VjaCAqLworCQkJCWludCB3cml0ZV9ieXRlcywgLyogYW1vdW50IG9mIGJ5dGVzIHRvIHdyaXRlICovCisJCQkJc3RydWN0IHBhZ2UgKipwcmVwYXJlZF9wYWdlcywgLyogYXJyYXkgb2YKKwkJCQkJCQkgICAgICAgICBwcmVwYXJlZCBwYWdlcworCQkJCQkJCSAgICAgICAqLworCQkJCWludCBibG9ja3NfdG9fYWxsb2NhdGUgLyogQW1vdW50IG9mIGJsb2NrcyB3ZQorCQkJCQkJCSAgbmVlZCB0byBhbGxvY2F0ZSB0bworCQkJCQkJCSAgZml0IHRoZSBkYXRhIGludG8gZmlsZQorCQkJCQkJCSAqLworCQkJCSkKK3sKKyAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7IC8vIGNwdSBrZXkgb2YgaXRlbSB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICppaDsgLy8gcG9pbnRlciB0byBpdGVtIGhlYWQgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsgLy8gQnVmZmVyIGhlYWQgdGhhdCBjb250YWlucyBpdGVtcyB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKKyAgICBfX3UzMiAqIGl0ZW07IC8vIHBvaW50ZXIgdG8gaXRlbSB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCisgICAgSU5JVElBTElaRV9QQVRIKHBhdGgpOyAvLyBwYXRoIHRvIGl0ZW0sIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aC4KKyAgICBiX2Jsb2NrbnJfdCAqYWxsb2NhdGVkX2Jsb2NrczsgLy8gUG9pbnRlciB0byBhIHBsYWNlIHdoZXJlIGFsbG9jYXRlZCBibG9ja251bWJlcnMgd291bGQgYmUgc3RvcmVkLgorICAgIHJlaXNlcmZzX2Jsb2NrbnJfaGludF90IGhpbnQ7IC8vIGhpbnQgc3RydWN0dXJlIGZvciBibG9jayBhbGxvY2F0b3IuCisgICAgc2l6ZV90IHJlczsgLy8gcmV0dXJuIHZhbHVlIG9mIHZhcmlvdXMgZnVuY3Rpb25zIHRoYXQgd2UgY2FsbC4KKyAgICBpbnQgY3Vycl9ibG9jazsgLy8gY3VycmVudCBibG9jayB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdW5tYXBwZWQgYmxvY2tzLgorICAgIGludCBpOyAvLyBsb29wIGNvdW50ZXIKKyAgICBpbnQgaXRlbXBvczsgLy8gcG9zaXRpb24gaW4gaXRlbQorICAgIHVuc2lnbmVkIGludCBmcm9tID0gKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7IC8vIHdyaXRpbmcgcG9zaXRpb24gaW4KKwkJCQkJCSAgICAgICAvLyBmaXJzdCBwYWdlCisgICAgdW5zaWduZWQgaW50IHRvID0gKChwb3MgKyB3cml0ZV9ieXRlcyAtIDEpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSArIDE7IC8qIGxhc3QgbW9kaWZpZWQgYnl0ZSBvZmZzZXQgaW4gbGFzdCBwYWdlICovCisgICAgX191NjQgaG9sZV9zaXplIDsgLy8gYW1vdW50IG9mIGJsb2NrcyBmb3IgYSBmaWxlIGhvbGUsIGlmIGl0IG5lZWRlZCB0byBiZSBjcmVhdGVkLgorICAgIGludCBtb2RpZnlpbmdfdGhpc19pdGVtID0gMDsgLy8gRmxhZyBmb3IgaXRlbXMgdHJhdmVyc2FsIGNvZGUgdG8ga2VlcCB0cmFjaworCQkJCSAvLyBvZiB0aGUgZmFjdCB0aGF0IHdlIGFscmVhZHkgcHJlcGFyZWQKKwkJCQkgLy8gY3VycmVudCBibG9jayBmb3Igam91cm5hbAorICAgIGludCB3aWxsX3ByZWFsbG9jID0gMDsKKyAgICBSRkFMU0UoIWJsb2Nrc190b19hbGxvY2F0ZSwgImdyZWVuLTkwMDQ6IHRyaWVkIHRvIGFsbG9jYXRlIHplcm8gYmxvY2tzPyIpOworCisgICAgLyogb25seSBwcmVhbGxvY2F0ZSBpZiB0aGlzIGlzIGEgc21hbGwgd3JpdGUgKi8KKyAgICBpZiAoUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfY291bnQgfHwKKyAgICAgICAoISh3cml0ZV9ieXRlcyAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLTEpKSAmJgorICAgICAgICBibG9ja3NfdG9fYWxsb2NhdGUgPAorICAgICAgICBSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY3NpemUpKQorICAgICAgICB3aWxsX3ByZWFsbG9jID0gUkVJU0VSRlNfU0IoaW5vZGUtPmlfc2IpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NzaXplOworCisgICAgYWxsb2NhdGVkX2Jsb2NrcyA9IGttYWxsb2MoKGJsb2Nrc190b19hbGxvY2F0ZSArIHdpbGxfcHJlYWxsb2MpICoKKyAgICAJCQkJCXNpemVvZihiX2Jsb2NrbnJfdCksIEdGUF9OT0ZTKTsKKworICAgIC8qIEZpcnN0IHdlIGNvbXBvc2UgYSBrZXkgdG8gcG9pbnQgYXQgdGhlIHdyaXRpbmcgcG9zaXRpb24sIHdlIHdhbnQgdG8gZG8KKyAgICAgICB0aGF0IG91dHNpZGUgb2YgYW55IGxvY2tpbmcgcmVnaW9uLiAqLworICAgIG1ha2VfY3B1X2tleSAoJmtleSwgaW5vZGUsIHBvcysxLCBUWVBFX0FOWSwgMy8qa2V5IGxlbmd0aCovKTsKKworICAgIC8qIElmIHdlIGNhbWUgaGVyZSwgaXQgbWVhbnMgd2UgYWJzb2x1dGVseSBuZWVkIHRvIG9wZW4gYSB0cmFuc2FjdGlvbiwKKyAgICAgICBzaW5jZSB3ZSBuZWVkIHRvIGFsbG9jYXRlIHNvbWUgYmxvY2tzICovCisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7IC8vIEpvdXJuYWxpbmcgc3R1ZmYgYW5kIHdlIG5lZWQgdGhhdC4KKyAgICByZXMgPSBqb3VybmFsX2JlZ2luKHRoLCBpbm9kZS0+aV9zYiwgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAzICsgMSArIDIgKiBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MpOyAvLyBXaXNoIEkga25vdyBpZiB0aGlzIG51bWJlciBlbm91Z2gKKyAgICBpZiAocmVzKQorICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CisgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7CisKKyAgICAvKiBMb29rIGZvciB0aGUgaW4tdHJlZSBwb3NpdGlvbiBvZiBvdXIgd3JpdGUsIG5lZWQgcGF0aCBmb3IgYmxvY2sgYWxsb2NhdG9yICovCisgICAgcmVzID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKyAgICBpZiAoIHJlcyA9PSBJT19FUlJPUiApIHsKKwlyZXMgPSAtRUlPOworCWdvdG8gZXJyb3JfZXhpdDsKKyAgICB9CisgICAKKyAgICAvKiBBbGxvY2F0ZSBibG9ja3MgKi8KKyAgICAvKiBGaXJzdCBmaWxsIGluICJoaW50IiBzdHJ1Y3R1cmUgZm9yIGJsb2NrIGFsbG9jYXRvciAqLworICAgIGhpbnQudGggPSB0aDsgLy8gdHJhbnNhY3Rpb24gaGFuZGxlLgorICAgIGhpbnQucGF0aCA9ICZwYXRoOyAvLyBQYXRoLCBzbyB0aGF0IGJsb2NrIGFsbG9jYXRvciBjYW4gZGV0ZXJtaW5lIHBhY2tpbmcgbG9jYWxpdHkgb3Igd2hhdGV2ZXIgaXQgbmVlZHMgdG8gZGV0ZXJtaW5lLgorICAgIGhpbnQuaW5vZGUgPSBpbm9kZTsgLy8gSW5vZGUgaXMgbmVlZGVkIGJ5IGJsb2NrIGFsbG9jYXRvciB0b28uCisgICAgaGludC5zZWFyY2hfc3RhcnQgPSAwOyAvLyBXZSBoYXZlIG5vIGhpbnQgb24gd2hlcmUgdG8gc2VhcmNoIGZyZWUgYmxvY2tzIGZvciBibG9jayBhbGxvY2F0b3IuCisgICAgaGludC5rZXkgPSBrZXkub25fZGlza19rZXk7IC8vIG9uIGRpc2sga2V5IG9mIGZpbGUuCisgICAgaGludC5ibG9jayA9IGlub2RlLT5pX2Jsb2Nrcz4+KGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzLTkpOyAvLyBOdW1iZXIgb2YgZGlzayBibG9ja3MgdGhpcyBmaWxlIG9jY3VwaWVzIGFscmVhZHkuCisgICAgaGludC5mb3JtYXR0ZWRfbm9kZSA9IDA7IC8vIFdlIGFyZSBhbGxvY2F0aW5nIGJsb2NrcyBmb3IgdW5mb3JtYXR0ZWQgbm9kZS4KKyAgICBoaW50LnByZWFsbG9jYXRlID0gd2lsbF9wcmVhbGxvYzsKKworICAgIC8qIENhbGwgYmxvY2sgYWxsb2NhdG9yIHRvIGFsbG9jYXRlIGJsb2NrcyAqLworICAgIHJlcyA9IHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2NrbnJzKCZoaW50LCBhbGxvY2F0ZWRfYmxvY2tzLCBibG9ja3NfdG9fYWxsb2NhdGUsIGJsb2Nrc190b19hbGxvY2F0ZSk7CisgICAgaWYgKCByZXMgIT0gQ0FSUllfT04gKSB7CisJaWYgKCByZXMgPT0gTk9fRElTS19TUEFDRSApIHsKKwkgICAgLyogV2UgZmx1c2ggdGhlIHRyYW5zYWN0aW9uIGluIGNhc2Ugb2Ygbm8gc3BhY2UuIFRoaXMgd2F5IHNvbWUKKwkgICAgICAgYmxvY2tzIG1pZ2h0IGJlY29tZSBmcmVlICovCisJICAgIFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpLT5qX211c3Rfd2FpdCA9IDE7CisJICAgIHJlcyA9IHJlc3RhcnRfdHJhbnNhY3Rpb24odGgsIGlub2RlLCAmcGF0aCk7CisgICAgICAgICAgICBpZiAocmVzKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKKworCSAgICAvKiBXZSBtaWdodCBoYXZlIHNjaGVkdWxlZCwgc28gc2VhcmNoIGFnYWluICovCisJICAgIHJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisJICAgIGlmICggcmVzID09IElPX0VSUk9SICkgeworCQlyZXMgPSAtRUlPOworCQlnb3RvIGVycm9yX2V4aXQ7CisJICAgIH0KKworCSAgICAvKiB1cGRhdGUgY2hhbmdlZCBpbmZvIGZvciBoaW50IHN0cnVjdHVyZS4gKi8KKwkgICAgcmVzID0gcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tucnMoJmhpbnQsIGFsbG9jYXRlZF9ibG9ja3MsIGJsb2Nrc190b19hbGxvY2F0ZSwgYmxvY2tzX3RvX2FsbG9jYXRlKTsKKwkgICAgaWYgKCByZXMgIT0gQ0FSUllfT04gKSB7CisJCXJlcyA9IC1FTk9TUEM7IAorCQlwYXRocmVsc2UoJnBhdGgpOworCQlnb3RvIGVycm9yX2V4aXQ7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICByZXMgPSAtRU5PU1BDOworCSAgICBwYXRocmVsc2UoJnBhdGgpOworCSAgICBnb3RvIGVycm9yX2V4aXQ7CisJfQorICAgIH0KKworI2lmZGVmIF9fQklHX0VORElBTgorICAgICAgICAvLyBUb28gYmFkLCBJIGhhdmUgbm90IGZvdW5kIGFueSB3YXkgdG8gY29udmVydCBhIGdpdmVuIHJlZ2lvbiBmcm9tCisgICAgICAgIC8vIGNwdSBmb3JtYXQgdG8gbGl0dGxlIGVuZGlhbiBmb3JtYXQKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGJsb2Nrc190b19hbGxvY2F0ZSA7IGkrKykKKyAgICAgICAgICAgIGFsbG9jYXRlZF9ibG9ja3NbaV09Y3B1X3RvX2xlMzIoYWxsb2NhdGVkX2Jsb2Nrc1tpXSk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBCbG9ja3MgYWxsb2NhdGluZyB3ZWxsIG1pZ2h0IGhhdmUgc2NoZWR1bGVkIGFuZCB0cmVlIG1pZ2h0IGhhdmUgY2hhbmdlZCwKKyAgICAgICBsZXQncyBzZWFyY2ggdGhlIHRyZWUgYWdhaW4gKi8KKyAgICAvKiBmaW5kIHdoZXJlIGluIHRoZSB0cmVlIG91ciB3cml0ZSBzaG91bGQgZ28gKi8KKyAgICByZXMgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOworICAgIGlmICggcmVzID09IElPX0VSUk9SICkgeworCXJlcyA9IC1FSU87CisJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOworICAgIH0KKworICAgIGJoID0gZ2V0X2xhc3RfYmgoICZwYXRoICk7IC8vIEdldCBhIGJ1ZmZlcmhlYWQgZm9yIGxhc3QgZWxlbWVudCBpbiBwYXRoLgorICAgIGloID0gZ2V0X2loKCAmcGF0aCApOyAgICAgIC8vIEdldCBhIHBvaW50ZXIgdG8gbGFzdCBpdGVtIGhlYWQgaW4gcGF0aC4KKyAgICBpdGVtID0gZ2V0X2l0ZW0oICZwYXRoICk7ICAvLyBHZXQgYSBwb2ludGVyIHRvIGxhc3QgaXRlbSBpbiBwYXRoCisKKyAgICAvKiBMZXQncyBzZWUgd2hhdCB3ZSBoYXZlIGZvdW5kICovCisgICAgaWYgKCByZXMgIT0gUE9TSVRJT05fRk9VTkQgKSB7IC8qIHBvc2l0aW9uIG5vdCBmb3VuZCwgdGhpcyBtZWFucyB0aGF0IHdlCisJCQkJICAgICAgbWlnaHQgbmVlZCB0byBhcHBlbmQgZmlsZSB3aXRoIGhvbGVzCisJCQkJICAgICAgZmlyc3QgKi8KKwkvLyBTaW5jZSB3ZSBhcmUgd3JpdGluZyBwYXN0IHRoZSBmaWxlJ3MgZW5kLCB3ZSBuZWVkIHRvIGZpbmQgb3V0IGlmCisJLy8gdGhlcmUgaXMgYSBob2xlIHRoYXQgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgYmVmb3JlIG91ciB3cml0aW5nCisJLy8gcG9zaXRpb24sIGFuZCBob3cgbWFueSBibG9ja3MgaXQgaXMgZ29pbmcgdG8gY292ZXIgKHdlIG5lZWQgdG8KKwkvLyAgcG9wdWxhdGUgcG9pbnRlcnMgdG8gZmlsZSBibG9ja3MgcmVwcmVzZW50aW5nIHRoZSBob2xlIHdpdGggemVyb3MpCisKKwl7CisJICAgIGludCBpdGVtX29mZnNldCA9IDE7CisJICAgIC8qCisJICAgICAqIGlmIGloIGlzIHN0YXQgZGF0YSwgaXRzIG9mZnNldCBpcyAwIGFuZCB3ZSBkb24ndCB3YW50IHRvCisJICAgICAqIGFkZCAxIHRvIHBvcyBpbiB0aGUgaG9sZV9zaXplIGNhbGN1bGF0aW9uCisJICAgICAqLworCSAgICBpZiAoaXNfc3RhdGRhdGFfbGVfaWgoaWgpKQorCSAgICAgICAgaXRlbV9vZmZzZXQgPSAwOworCSAgICBob2xlX3NpemUgPSAocG9zICsgaXRlbV9vZmZzZXQgLQorCSAgICAgICAgICAgIChsZV9rZXlfa19vZmZzZXQoIGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlKSwKKwkJICAgICYoaWgtPmloX2tleSkpICsKKwkJICAgIG9wX2J5dGVzX251bWJlcihpaCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKSkpID4+CisJCSAgICBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwl9CisKKwlpZiAoIGhvbGVfc2l6ZSA+IDAgKSB7CisJICAgIGludCB0b19wYXN0ZSA9IG1pbl90KF9fdTY0LCBob2xlX3NpemUsIE1BWF9JVEVNX0xFTihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpL1VORk1fUF9TSVpFICk7IC8vIEhvdyBtdWNoIGRhdGEgdG8gaW5zZXJ0IGZpcnN0IHRpbWUuCisJICAgIC8qIGFyZWEgZmlsbGVkIHdpdGggemVyb2VzLCB0byBzdXBwbHkgYXMgbGlzdCBvZiB6ZXJvIGJsb2NrbnVtYmVycworCSAgICAgICBXZSBhbGxvY2F0ZSBpdCBvdXRzaWRlIG9mIGxvb3AganVzdCBpbiBjYXNlIGxvb3Agd291bGQgc3BpbiBmb3IKKwkgICAgICAgc2V2ZXJhbCBpdGVyYXRpb25zLiAqLworCSAgICBjaGFyICp6ZXJvcyA9IGttYWxsb2ModG9fcGFzdGUqVU5GTV9QX1NJWkUsIEdGUF9BVE9NSUMpOyAvLyBXZSBjYW5ub3QgaW5zZXJ0IG1vcmUgdGhhbiBNQVhfSVRFTV9MRU4gYnl0ZXMgYW55d2F5LgorCSAgICBpZiAoICF6ZXJvcyApIHsKKwkJcmVzID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOworCSAgICB9CisJICAgIG1lbXNldCAoIHplcm9zLCAwLCB0b19wYXN0ZSpVTkZNX1BfU0laRSk7CisJICAgIGRvIHsKKwkJdG9fcGFzdGUgPSBtaW5fdChfX3U2NCwgaG9sZV9zaXplLCBNQVhfSVRFTV9MRU4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKS9VTkZNX1BfU0laRSApOworCQlpZiAoIGlzX2luZGlyZWN0X2xlX2loKGloKSApIHsKKwkJICAgIC8qIE9rLCB0aGVyZSBpcyBleGlzdGluZyBpbmRpcmVjdCBpdGVtIGFscmVhZHkuIE5lZWQgdG8gYXBwZW5kIGl0ICovCisJCSAgICAvKiBDYWxjdWxhdGUgcG9zaXRpb24gcGFzdCBpbnNlcnRlZCBpdGVtICovCisJCSAgICBtYWtlX2NwdV9rZXkoICZrZXksIGlub2RlLCBsZV9rZXlfa19vZmZzZXQoIGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlKSwgJihpaC0+aWhfa2V5KSkgKyBvcF9ieXRlc19udW1iZXIoaWgsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSksIFRZUEVfSU5ESVJFQ1QsIDMpOworCQkgICAgcmVzID0gcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtKCB0aCwgJnBhdGgsICZrZXksIGlub2RlLCAoY2hhciAqKXplcm9zLCBVTkZNX1BfU0laRSp0b19wYXN0ZSk7CisJCSAgICBpZiAoIHJlcyApIHsKKwkJCWtmcmVlKHplcm9zKTsKKwkJCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKKwkJICAgIH0KKwkJfSBlbHNlIGlmICggaXNfc3RhdGRhdGFfbGVfaWgoaWgpICkgeworCQkgICAgLyogTm8gZXhpc3RpbmcgaXRlbSwgY3JlYXRlIGl0ICovCisJCSAgICAvKiBpdGVtIGhlYWQgZm9yIG5ldyBpdGVtICovCisJCSAgICBzdHJ1Y3QgaXRlbV9oZWFkIGluc19paDsKKworCQkgICAgLyogY3JlYXRlIGEga2V5IGZvciBvdXIgbmV3IGl0ZW0gKi8KKwkJICAgIG1ha2VfY3B1X2tleSggJmtleSwgaW5vZGUsIDEsIFRZUEVfSU5ESVJFQ1QsIDMpOworCisJCSAgICAvKiBDcmVhdGUgbmV3IGl0ZW0gaGVhZCBmb3Igb3VyIG5ldyBpdGVtICovCisJCSAgICBtYWtlX2xlX2l0ZW1faGVhZCAoJmluc19paCwgJmtleSwga2V5LnZlcnNpb24sIDEsCisJCQkJICAgICAgIFRZUEVfSU5ESVJFQ1QsIHRvX3Bhc3RlKlVORk1fUF9TSVpFLAorCQkJCSAgICAgICAwIC8qIGZyZWUgc3BhY2UgKi8pOworCisJCSAgICAvKiBGaW5kIHdoZXJlIHN1Y2ggaXRlbSBzaG91bGQgbGl2ZSBpbiB0aGUgdHJlZSAqLworCQkgICAgcmVzID0gc2VhcmNoX2l0ZW0gKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisJCSAgICBpZiAoIHJlcyAhPSBJVEVNX05PVF9GT1VORCApIHsKKwkJCS8qIGl0ZW0gc2hvdWxkIG5vdCBleGlzdCwgb3RoZXJ3aXNlIHdlIGhhdmUgZXJyb3IgKi8KKwkJCWlmICggcmVzICE9IC1FTk9TUEMgKSB7CisJCQkgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsCisJCQkJImdyZWVuLTkwMDg6IHNlYXJjaF9ieV9rZXkgKCVLKSByZXR1cm5lZCAlZCIsCisJCQkJCSAgICAgICZrZXksIHJlcyk7CisJCQl9CisJCQlyZXMgPSAtRUlPOworCQkgICAgICAgIGtmcmVlKHplcm9zKTsKKwkJCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKKwkJICAgIH0KKwkJICAgIHJlcyA9IHJlaXNlcmZzX2luc2VydF9pdGVtKCB0aCwgJnBhdGgsICZrZXksICZpbnNfaWgsIGlub2RlLCAoY2hhciAqKXplcm9zKTsKKwkJfSBlbHNlIHsKKwkJICAgIHJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLCAiZ3JlZW4tOTAxMTogVW5leHBlY3RlZCBrZXkgdHlwZSAlS1xuIiwgJmtleSk7CisJCX0KKwkJaWYgKCByZXMgKSB7CisJCSAgICBrZnJlZSh6ZXJvcyk7CisJCSAgICBnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CisJCX0KKwkJLyogTm93IHdlIHdhbnQgdG8gY2hlY2sgaWYgdHJhbnNhY3Rpb24gaXMgdG9vIGZ1bGwsIGFuZCBpZiBpdCBpcworCQkgICB3ZSByZXN0YXJ0IGl0LiBUaGlzIHdpbGwgYWxzbyBmcmVlIHRoZSBwYXRoLiAqLworCQlpZiAoam91cm5hbF90cmFuc2FjdGlvbl9zaG91bGRfZW5kKHRoLCB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKSkgeworCQkgICAgcmVzID0gcmVzdGFydF90cmFuc2FjdGlvbih0aCwgaW5vZGUsICZwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHJlbHNlICgmcGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZSh6ZXJvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKwkJLyogV2VsbCwgbmVlZCB0byByZWNhbGN1bGF0ZSBwYXRoIGFuZCBzdHVmZiAqLworCQlzZXRfY3B1X2tleV9rX29mZnNldCggJmtleSwgY3B1X2tleV9rX29mZnNldCgma2V5KSArICh0b19wYXN0ZSA8PCBpbm9kZS0+aV9ibGtiaXRzKSk7CisJCXJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisJCWlmICggcmVzID09IElPX0VSUk9SICkgeworCQkgICAgcmVzID0gLUVJTzsKKwkJICAgIGtmcmVlKHplcm9zKTsKKwkJICAgIGdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKKwkJfQorCQliaD1nZXRfbGFzdF9iaCgmcGF0aCk7CisJCWloPWdldF9paCgmcGF0aCk7CisJCWl0ZW0gPSBnZXRfaXRlbSgmcGF0aCk7CisJCWhvbGVfc2l6ZSAtPSB0b19wYXN0ZTsKKwkgICAgfSB3aGlsZSAoIGhvbGVfc2l6ZSApOworCSAgICBrZnJlZSh6ZXJvcyk7CisJfQorICAgIH0KKworICAgIC8vIEdvIHRocm91Z2ggZXhpc3RpbmcgaW5kaXJlY3QgaXRlbXMgZmlyc3QKKyAgICAvLyByZXBsYWNlIGFsbCB6ZXJvZXMgd2l0aCBibG9ja251bWJlcnMgZnJvbSBsaXN0CisgICAgLy8gTm90ZSB0aGF0IGlmIG5vIGNvcnJlc3BvbmRpbmcgaXRlbSB3YXMgZm91bmQsIGJ5IHByZXZpb3VzIHNlYXJjaCwKKyAgICAvLyBpdCBtZWFucyB0aGVyZSBhcmUgbm8gZXhpc3RpbmcgaW4tdHJlZSByZXByZXNlbnRhdGlvbiBmb3IgZmlsZSBhcmVhCisgICAgLy8gd2UgYXJlIGdvaW5nIHRvIG92ZXJ3cml0ZSwgc28gdGhlcmUgaXMgbm90aGluZyB0byBzY2FuIHRocm91Z2ggZm9yIGhvbGVzLgorICAgIGZvciAoIGN1cnJfYmxvY2sgPSAwLCBpdGVtcG9zID0gcGF0aC5wb3NfaW5faXRlbSA7IGN1cnJfYmxvY2sgPCBibG9ja3NfdG9fYWxsb2NhdGUgJiYgcmVzID09IFBPU0lUSU9OX0ZPVU5EIDsgKSB7CityZXRyeToKKworCWlmICggaXRlbXBvcyA+PSBpaF9pdGVtX2xlbihpaCkvVU5GTV9QX1NJWkUgKSB7CisJICAgIC8qIFdlIHJ1biBvdXQgb2YgZGF0YSBpbiB0aGlzIGluZGlyZWN0IGl0ZW0sIGxldCdzIGxvb2sgZm9yIGFub3RoZXIKKwkgICAgICAgb25lLiAqLworCSAgICAvKiBGaXJzdCBpZiB3ZSBhcmUgYWxyZWFkeSBtb2RpZnlpbmcgY3VycmVudCBpdGVtLCBsb2cgaXQgKi8KKwkgICAgaWYgKCBtb2RpZnlpbmdfdGhpc19pdGVtICkgeworCQlqb3VybmFsX21hcmtfZGlydHkgKHRoLCBpbm9kZS0+aV9zYiwgYmgpOworCQltb2RpZnlpbmdfdGhpc19pdGVtID0gMDsKKwkgICAgfQorCSAgICAvKiBUaGVuIHNldCB0aGUga2V5IHRvIGxvb2sgZm9yIGEgbmV3IGluZGlyZWN0IGl0ZW0gKG9mZnNldCBvZiBvbGQKKwkgICAgICAgaXRlbSBpcyBhZGRlZCB0byBvbGQgaXRlbSBsZW5ndGggKi8KKwkgICAgc2V0X2NwdV9rZXlfa19vZmZzZXQoICZrZXksIGxlX2tleV9rX29mZnNldCggZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpLCAmKGloLT5paF9rZXkpKSArIG9wX2J5dGVzX251bWJlcihpaCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKSk7CisJICAgIC8qIFNlYXJjaCBvZm9yIHBvc2l0aW9uIG9mIG5ldyBrZXkgaW4gdGhlIHRyZWUuICovCisJICAgIHJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisJICAgIGlmICggcmVzID09IElPX0VSUk9SKSB7CisJCXJlcyA9IC1FSU87CisJCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKKwkgICAgfQorCSAgICBiaD1nZXRfbGFzdF9iaCgmcGF0aCk7CisJICAgIGloPWdldF9paCgmcGF0aCk7CisJICAgIGl0ZW0gPSBnZXRfaXRlbSgmcGF0aCk7CisJICAgIGl0ZW1wb3MgPSBwYXRoLnBvc19pbl9pdGVtOworCSAgICBjb250aW51ZTsgLy8gbG9vcCB0byBjaGVjayBhbGwga2luZHMgb2YgY29uZGl0aW9ucyBhbmQgc28gb24uCisJfQorCS8qIE9rLCB3ZSBoYXZlIGNvcnJlY3QgcG9zaXRpb24gaW4gaXRlbSBub3csIHNvIGxldCdzIHNlZSBpZiBpdCBpcworCSAgIHJlcHJlc2VudGluZyBmaWxlIGhvbGUgKGJsb2NrbnVtYmVyIGlzIHplcm8pIGFuZCBmaWxsIGl0IGlmIG5lZWRlZCAqLworCWlmICggIWl0ZW1baXRlbXBvc10gKSB7CisJICAgIC8qIE9rLCBhIGhvbGUuIE5vdyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHdlIGFscmVhZHkgcHJlcGFyZWQgdGhpcworCSAgICAgICBibG9jayB0byBiZSBqb3VybmFsZWQgKi8KKwkgICAgd2hpbGUgKCAhbW9kaWZ5aW5nX3RoaXNfaXRlbSApIHsgLy8gbG9vcCB1bnRpbCBzdWNjZWVkCisJCS8qIFdlbGwsIHRoaXMgaXRlbSBpcyBub3Qgam91cm5hbGVkIHlldCwgc28gd2UgbXVzdCBwcmVwYXJlCisJCSAgIGl0IGZvciBqb3VybmFsIGZpcnN0LCBiZWZvcmUgd2UgY2FuIGNoYW5nZSBpdCAqLworCQlzdHJ1Y3QgaXRlbV9oZWFkIHRtcF9paDsgLy8gV2UgY29weSBpdGVtIGhlYWQgb2YgZm91bmQgaXRlbSwKKwkJCQkJIC8vIGhlcmUgdG8gZGV0ZWN0IGlmIGZzIGNoYW5nZWQgdW5kZXIKKwkJCQkJIC8vIHVzIHdoaWxlIHdlIHdlcmUgcHJlcGFyaW5nIGZvcgorCQkJCQkgLy8gam91cm5hbC4KKwkJaW50IGZzX2dlbjsgLy8gV2Ugc3RvcmUgZnMgZ2VuZXJhdGlvbiBoZXJlIHRvIGZpbmQgaWYgc29tZW9uZQorCQkJICAgIC8vIGNoYW5nZXMgZnMgdW5kZXIgb3VyIGZlZXQKKworCQljb3B5X2l0ZW1faGVhZCAoJnRtcF9paCwgaWgpOyAvLyBSZW1lbWJlciBpdGVtaGVhZAorCQlmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbiAoaW5vZGUtPmlfc2IpOyAvLyByZW1lbWJlciBmcyBnZW5lcmF0aW9uCisJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoaW5vZGUtPmlfc2IsIGJoLCAxKTsgLy8gUHJlcGFyZSBhIGJ1ZmZlciB3aXRoaW4gd2hpY2ggaW5kaXJlY3QgaXRlbSBpcyBzdG9yZWQgZm9yIGNoYW5naW5nLgorCQlpZiAoZnNfY2hhbmdlZCAoZnNfZ2VuLCBpbm9kZS0+aV9zYikgJiYgaXRlbV9tb3ZlZCAoJnRtcF9paCwgJnBhdGgpKSB7CisJCSAgICAvLyBTaWdoLCBmcyB3YXMgY2hhbmdlZCB1bmRlciB1cywgd2UgbmVlZCB0byBsb29rIGZvciBuZXcKKwkJICAgIC8vIGxvY2F0aW9uIG9mIGl0ZW0gd2UgYXJlIHdvcmtpbmcgd2l0aAorCisJCSAgICAvKiB1bm1hcmsgcHJlcGFlcmQgYXJlYSBhcyBqb3VybmFsZWQgYW5kIHNlYXJjaCBmb3IgaXQncworCQkgICAgICAgbmV3IHBvc2l0aW9uICovCisJCSAgICByZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihpbm9kZS0+aV9zYiwgYmgpOworCQkgICAgcmVzID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKwkJICAgIGlmICggcmVzID09IElPX0VSUk9SKSB7CisJCQlyZXMgPSAtRUlPOworCQkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOworCQkgICAgfQorCQkgICAgYmg9Z2V0X2xhc3RfYmgoJnBhdGgpOworCQkgICAgaWg9Z2V0X2loKCZwYXRoKTsKKwkJICAgIGl0ZW0gPSBnZXRfaXRlbSgmcGF0aCk7CisJCSAgICBpdGVtcG9zID0gcGF0aC5wb3NfaW5faXRlbTsKKwkJICAgIGdvdG8gcmV0cnk7CisJCX0KKwkJbW9kaWZ5aW5nX3RoaXNfaXRlbSA9IDE7CisJICAgIH0KKwkgICAgaXRlbVtpdGVtcG9zXSA9IGFsbG9jYXRlZF9ibG9ja3NbY3Vycl9ibG9ja107IC8vIEFzc2lnbiBuZXcgYmxvY2sKKwkgICAgY3Vycl9ibG9jaysrOworCX0KKwlpdGVtcG9zKys7CisgICAgfQorCisgICAgaWYgKCBtb2RpZnlpbmdfdGhpc19pdGVtICkgeyAvLyBXZSBuZWVkIHRvIGxvZyBsYXN0LWFjY2Vzc2VkIGJsb2NrLCBpZiBpdAorCQkJCSAvLyB3YXMgbW9kaWZpZWQsIGJ1dCBub3QgbG9nZ2VkIHlldC4KKwlqb3VybmFsX21hcmtfZGlydHkgKHRoLCBpbm9kZS0+aV9zYiwgYmgpOworICAgIH0KKworICAgIGlmICggY3Vycl9ibG9jayA8IGJsb2Nrc190b19hbGxvY2F0ZSApIHsKKwkvLyBPaCwgd2VsbCBuZWVkIHRvIGFwcGVuZCB0byBpbmRpcmVjdCBpdGVtLCBvciB0byBjcmVhdGUgaW5kaXJlY3QgaXRlbQorCS8vIGlmIHRoZXJlIHdlcmVuJ3QgYW55CisJaWYgKCBpc19pbmRpcmVjdF9sZV9paChpaCkgKSB7CisJICAgIC8vIEV4aXN0aW5nIGluZGlyZWN0IGl0ZW0gLSBhcHBlbmQuIEZpcnN0IGNhbGN1bGF0ZSBrZXkgZm9yIGFwcGVuZAorCSAgICAvLyBwb3NpdGlvbi4gV2UgZG8gbm90IG5lZWQgdG8gcmVjYWxjdWxhdGUgcGF0aCBhcyBpdCBzaG91bGQKKwkgICAgLy8gYWxyZWFkeSBwb2ludCB0byBjb3JyZWN0IHBsYWNlLgorCSAgICBtYWtlX2NwdV9rZXkoICZrZXksIGlub2RlLCBsZV9rZXlfa19vZmZzZXQoIGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlKSwgJihpaC0+aWhfa2V5KSkgKyBvcF9ieXRlc19udW1iZXIoaWgsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSksIFRZUEVfSU5ESVJFQ1QsIDMpOworCSAgICByZXMgPSByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW0oIHRoLCAmcGF0aCwgJmtleSwgaW5vZGUsIChjaGFyICopKGFsbG9jYXRlZF9ibG9ja3MrY3Vycl9ibG9jayksIFVORk1fUF9TSVpFKihibG9ja3NfdG9fYWxsb2NhdGUtY3Vycl9ibG9jaykpOworCSAgICBpZiAoIHJlcyApIHsKKwkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOworCSAgICB9CisJfSBlbHNlIGlmIChpc19zdGF0ZGF0YV9sZV9paChpaCkgKSB7CisJICAgIC8vIExhc3QgZm91bmQgaXRlbSB3YXMgc3RhdGRhdGEuIFRoYXQgbWVhbnMgd2UgbmVlZCB0byBjcmVhdGUgaW5kaXJlY3QgaXRlbS4KKwkgICAgc3RydWN0IGl0ZW1faGVhZCBpbnNfaWg7IC8qIGl0ZW1oZWFkIGZvciBuZXcgaXRlbSAqLworCisJICAgIC8qIGNyZWF0ZSBhIGtleSBmb3Igb3VyIG5ldyBpdGVtICovCisJICAgIG1ha2VfY3B1X2tleSggJmtleSwgaW5vZGUsIDEsIFRZUEVfSU5ESVJFQ1QsIDMpOyAvLyBQb3NpdGlvbiBvbmUsCisJCQkJCQkJICAgIC8vIGJlY2F1c2UgdGhhdCdzCisJCQkJCQkJICAgIC8vIHdoZXJlIGZpcnN0CisJCQkJCQkJICAgIC8vIGluZGlyZWN0IGl0ZW0KKwkJCQkJCQkgICAgLy8gYmVnaW5zCisJICAgIC8qIENyZWF0ZSBuZXcgaXRlbSBoZWFkIGZvciBvdXIgbmV3IGl0ZW0gKi8KKwkgICAgbWFrZV9sZV9pdGVtX2hlYWQgKCZpbnNfaWgsICZrZXksIGtleS52ZXJzaW9uLCAxLCBUWVBFX0lORElSRUNULAorCQkJICAgICAgIChibG9ja3NfdG9fYWxsb2NhdGUtY3Vycl9ibG9jaykqVU5GTV9QX1NJWkUsCisJCQkgICAgICAgMCAvKiBmcmVlIHNwYWNlICovKTsKKwkgICAgLyogRmluZCB3aGVyZSBzdWNoIGl0ZW0gc2hvdWxkIGxpdmUgaW4gdGhlIHRyZWUgKi8KKwkgICAgcmVzID0gc2VhcmNoX2l0ZW0gKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisJICAgIGlmICggcmVzICE9IElURU1fTk9UX0ZPVU5EICkgeworCQkvKiBXZWxsLCBpZiB3ZSBoYXZlIGZvdW5kIHN1Y2ggaXRlbSBhbHJlYWR5LCBvciBzb21lIGVycm9yCisJCSAgIG9jY3VyZWQsIHdlIG5lZWQgdG8gd2FybiB1c2VyIGFuZCByZXR1cm4gZXJyb3IgKi8KKwkJaWYgKCByZXMgIT0gLUVOT1NQQyApIHsKKwkJICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLAorCQkJCSAgICAgICJncmVlbi05MDA5OiBzZWFyY2hfYnlfa2V5ICglSykgIgorCQkJCSAgICAgICJyZXR1cm5lZCAlZCIsICZrZXksIHJlcyk7CisJCX0KKwkJcmVzID0gLUVJTzsKKwkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOworCSAgICB9CisJICAgIC8qIEluc2VydCBpdGVtIGludG8gdGhlIHRyZWUgd2l0aCB0aGUgZGF0YSBhcyBpdHMgYm9keSAqLworCSAgICByZXMgPSByZWlzZXJmc19pbnNlcnRfaXRlbSggdGgsICZwYXRoLCAma2V5LCAmaW5zX2loLCBpbm9kZSwgKGNoYXIgKikoYWxsb2NhdGVkX2Jsb2NrcytjdXJyX2Jsb2NrKSk7CisJfSBlbHNlIHsKKwkgICAgcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsICJncmVlbi05MDEwOiB1bmV4cGVjdGVkIGl0ZW0gdHlwZSBmb3Iga2V5ICVLXG4iLCZrZXkpOworCX0KKyAgICB9CisKKyAgICAvLyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIHRoZSB0cmFuc2FjdGlvbgorICAgIC8vIHVubGVzcyB3ZSByZXR1cm4gYW4gZXJyb3IsIHRoZXkgYXJlIGFsc28gcmVzcG9uc2libGUgZm9yIGxvZ2dpbmcKKyAgICAvLyB0aGUgaW5vZGUuCisgICAgLy8KKyAgICBwYXRocmVsc2UoJnBhdGgpOworICAgIC8qCisgICAgICogY2xlYW51cCBwcmVsbG9jYXRpb24gZnJvbSBwcmV2aW91cyB3cml0ZXMKKyAgICAgKiBpZiB0aGlzIGlzIGEgcGFydGlhbCBibG9jayB3cml0ZQorICAgICAqLworICAgIGlmICh3cml0ZV9ieXRlcyAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLTEpKQorICAgICAgICByZWlzZXJmc19kaXNjYXJkX3ByZWFsbG9jKHRoLCBpbm9kZSk7CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKworICAgIC8vIGdvIHRocm91Z2ggYWxsIHRoZSBwYWdlcy9idWZmZXJzIGFuZCBtYXAgdGhlIGJ1ZmZlcnMgdG8gbmV3bHkgYWxsb2NhdGVkCisgICAgLy8gYmxvY2tzIChzbyB0aGF0IHN5c3RlbSBrbm93cyB3aGVyZSB0byB3cml0ZSB0aGVzZSBwYWdlcyBsYXRlcikuCisgICAgY3Vycl9ibG9jayA9IDA7CisgICAgZm9yICggaSA9IDA7IGkgPCBudW1fcGFnZXMgOyBpKysgKSB7CisJc3RydWN0IHBhZ2UgKnBhZ2U9cHJlcGFyZWRfcGFnZXNbaV07IC8vY3VycmVudCBwYWdlCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOy8vIGZpcnN0IGJ1ZmZlciBmb3IgYSBwYWdlCisJaW50IGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7IC8vIGluLXBhZ2Ugb2Zmc2V0cyBmb3IgYnVmZmVycy4KKworCWlmICghcGFnZV9idWZmZXJzKHBhZ2UpKQorCSAgICByZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwgImdyZWVuLTkwMDU6IE5vIGJ1ZmZlcnMgZm9yIHByZXBhcmVkIHBhZ2U/Pz8iKTsKKworCS8qIEZvciBlYWNoIGJ1ZmZlciBpbiBwYWdlICovCisJZm9yKGJoID0gaGVhZCwgYmxvY2tfc3RhcnQgPSAwOyBiaCAhPSBoZWFkIHx8ICFibG9ja19zdGFydDsKKwkgICAgYmxvY2tfc3RhcnQ9YmxvY2tfZW5kLCBiaCA9IGJoLT5iX3RoaXNfcGFnZSkgeworCSAgICBpZiAoIWJoKQorCQlyZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwgImdyZWVuLTkwMDY6IEFsbG9jYXRlZCBidXQgYWJzZW50IGJ1ZmZlciBmb3IgYSBwYWdlPyIpOworCSAgICBibG9ja19lbmQgPSBibG9ja19zdGFydCtpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJICAgIGlmIChpID09IDAgJiYgYmxvY2tfZW5kIDw9IGZyb20gKQorCQkvKiBpZiB0aGlzIGJ1ZmZlciBpcyBiZWZvcmUgcmVxdWVzdGVkIGRhdGEgdG8gbWFwLCBza2lwIGl0ICovCisJCWNvbnRpbnVlOworCSAgICBpZiAoaSA9PSBudW1fcGFnZXMgLSAxICYmIGJsb2NrX3N0YXJ0ID49IHRvKQorCQkvKiBJZiB0aGlzIGJ1ZmZlciBpcyBhZnRlciByZXF1ZXN0ZWQgZGF0YSB0byBtYXAsIGFib3J0CisJCSAgIHByb2Nlc3Npbmcgb2YgY3VycmVudCBwYWdlICovCisJCWJyZWFrOworCisJICAgIGlmICggIWJ1ZmZlcl9tYXBwZWQoYmgpICkgeyAvLyBPaywgdW5tYXBwZWQgYnVmZmVyLCBuZWVkIHRvIG1hcCBpdAorCQltYXBfYmgoIGJoLCBpbm9kZS0+aV9zYiwgbGUzMl90b19jcHUoYWxsb2NhdGVkX2Jsb2Nrc1tjdXJyX2Jsb2NrXSkpOworCQljdXJyX2Jsb2NrKys7CisJCXNldF9idWZmZXJfbmV3KGJoKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBSRkFMU0UoIGN1cnJfYmxvY2sgPiBibG9ja3NfdG9fYWxsb2NhdGUsICJncmVlbi05MDA3OiBVc2VkIHRvbyBtYW55IGJsb2Nrcz8gd2VpcmQiKTsKKworICAgIGtmcmVlKGFsbG9jYXRlZF9ibG9ja3MpOworICAgIHJldHVybiAwOworCisvLyBOZWVkIHRvIGRlYWwgd2l0aCB0cmFuc2FjdGlvbiBoZXJlLgorZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczoKKyAgICBwYXRocmVsc2UoJnBhdGgpOworICAgIC8vIGZyZWUgYmxvY2tzCisgICAgZm9yKCBpID0gMDsgaSA8IGJsb2Nrc190b19hbGxvY2F0ZTsgaSsrICkKKwlyZWlzZXJmc19mcmVlX2Jsb2NrKHRoLCBpbm9kZSwgbGUzMl90b19jcHUoYWxsb2NhdGVkX2Jsb2Nrc1tpXSksIDEpOworCitlcnJvcl9leGl0OgorICAgIGlmICh0aC0+dF90cmFuc19pZCkgeworICAgICAgICBpbnQgZXJyOworICAgICAgICAvLyB1cGRhdGUgYW55IGNoYW5nZXMgd2UgbWFkZSB0byBibGsgY291bnQKKyAgICAgICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7CisgICAgICAgIGVyciA9IGpvdXJuYWxfZW5kKHRoLCBpbm9kZS0+aV9zYiwgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAzICsgMSArIDIgKiBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MpOworICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgcmVzID0gZXJyOworICAgIH0KKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworICAgIGtmcmVlKGFsbG9jYXRlZF9ibG9ja3MpOworCisgICAgcmV0dXJuIHJlczsKK30KKworLyogVW5sb2NrIHBhZ2VzIHByZXBhcmVkIGJ5IHJlaXNlcmZzX3ByZXBhcmVfZmlsZV9yZWdpb25fZm9yX3dyaXRlICovCitzdGF0aWMgdm9pZCByZWlzZXJmc191bnByZXBhcmVfcGFnZXMoc3RydWN0IHBhZ2UgKipwcmVwYXJlZF9wYWdlcywgLyogbGlzdCBvZiBsb2NrZWQgcGFnZXMgKi8KKwkJCSAgICAgIHNpemVfdCBudW1fcGFnZXMgLyogYW1vdW50IG9mIHBhZ2VzICovKSB7CisgICAgaW50IGk7IC8vIGxvb3AgY291bnRlcgorCisgICAgZm9yIChpPTA7IGkgPCBudW1fcGFnZXMgOyBpKyspIHsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHByZXBhcmVkX3BhZ2VzW2ldOworCisJdHJ5X3RvX2ZyZWVfYnVmZmVycyhwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisgICAgfQorfQorCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY29weSBkYXRhIGZyb20gdXNlcnNwYWNlIHRvIHNwZWNpZmllZCBwYWdlcyB3aXRoaW4KKyAgIHN1cHBsaWVkIGJ5dGUgcmFuZ2UgKi8KK3N0YXRpYyBpbnQgcmVpc2VyZnNfY29weV9mcm9tX3VzZXJfdG9fZmlsZV9yZWdpb24oCisJCQkJbG9mZl90IHBvcywgLyogSW4tZmlsZSBwb3NpdGlvbiAqLworCQkJCWludCBudW1fcGFnZXMsIC8qIE51bWJlciBvZiBwYWdlcyBhZmZlY3RlZCAqLworCQkJCWludCB3cml0ZV9ieXRlcywgLyogQW1vdW50IG9mIGJ5dGVzIHRvIHdyaXRlICovCisJCQkJc3RydWN0IHBhZ2UgKipwcmVwYXJlZF9wYWdlcywgLyogcG9pbnRlciB0byAKKwkJCQkJCQkJIGFycmF5IHRvCisJCQkJCQkJCSBwcmVwYXJlZCBwYWdlcworCQkJCQkJCQkqLworCQkJCWNvbnN0IGNoYXIgX191c2VyICpidWYgLyogUG9pbnRlciB0byB1c2VyLXN1cHBsaWVkCisJCQkJCQkgICBkYXRhKi8KKwkJCQkpCit7CisgICAgbG9uZyBwYWdlX2ZhdWx0PTA7IC8vIHN0YXR1cyBvZiBjb3B5X2Zyb21fdXNlci4KKyAgICBpbnQgaTsgLy8gbG9vcCBjb3VudGVyLgorICAgIGludCBvZmZzZXQ7IC8vIG9mZnNldCBpbiBwYWdlCisKKyAgICBmb3IgKCBpID0gMCwgb2Zmc2V0ID0gKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUtMSkpOyBpIDwgbnVtX3BhZ2VzIDsgaSsrLG9mZnNldD0wKSB7CisJc2l6ZV90IGNvdW50ID0gbWluX3Qoc2l6ZV90LFBBR0VfQ0FDSEVfU0laRS1vZmZzZXQsd3JpdGVfYnl0ZXMpOyAvLyBIb3cgbXVjaCBvZiBieXRlcyB0byB3cml0ZSB0byB0aGlzIHBhZ2UKKwlzdHJ1Y3QgcGFnZSAqcGFnZT1wcmVwYXJlZF9wYWdlc1tpXTsgLy8gQ3VycmVudCBwYWdlIHdlIHByb2Nlc3MuCisKKwlmYXVsdF9pbl9wYWdlc19yZWFkYWJsZSggYnVmLCBjb3VudCk7CisKKwkvKiBDb3B5IGRhdGEgZnJvbSB1c2Vyc3BhY2UgdG8gdGhlIGN1cnJlbnQgcGFnZSAqLworCWttYXAocGFnZSk7CisJcGFnZV9mYXVsdCA9IF9fY29weV9mcm9tX3VzZXIocGFnZV9hZGRyZXNzKHBhZ2UpK29mZnNldCwgYnVmLCBjb3VudCk7IC8vIENvcHkgdGhlIGRhdGEuCisJLyogRmx1c2ggcHJvY2Vzc29yJ3MgZGNhY2hlIGZvciB0aGlzIHBhZ2UgKi8KKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlrdW5tYXAocGFnZSk7CisJYnVmKz1jb3VudDsKKwl3cml0ZV9ieXRlcy09Y291bnQ7CisKKwlpZiAocGFnZV9mYXVsdCkKKwkgICAgYnJlYWs7IC8vIFdhcyB0aGVyZSBhIGZhdWx0PyBhYm9ydC4KKyAgICB9CisKKyAgICByZXR1cm4gcGFnZV9mYXVsdD8tRUZBVUxUOjA7Cit9CisKKy8qIHRha2VuIGZzL2J1ZmZlci5jOl9fYmxvY2tfY29tbWl0X3dyaXRlICovCitpbnQgcmVpc2VyZnNfY29tbWl0X3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCXVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworICAgIHVuc2lnbmVkIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7CisgICAgaW50IHBhcnRpYWwgPSAwOworICAgIHVuc2lnbmVkIGJsb2Nrc2l6ZTsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZDsKKyAgICB1bnNpZ25lZCBsb25nIGlfc2l6ZV9pbmRleCA9IGlub2RlLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKyAgICBpbnQgbmV3OworICAgIGludCBsb2dpdCA9IHJlaXNlcmZzX2ZpbGVfZGF0YV9sb2coaW5vZGUpOworICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IGlub2RlLT5pX3NiOworICAgIGludCBiaF9wZXJfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSAvIHMtPnNfYmxvY2tzaXplOworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisgICAgaW50IHJldCA9IDA7CisKKyAgICB0aC50X3RyYW5zX2lkID0gMDsKKyAgICBibG9ja3NpemUgPSAxIDw8IGlub2RlLT5pX2Jsa2JpdHM7CisKKyAgICBpZiAobG9naXQpIHsKKwlyZWlzZXJmc193cml0ZV9sb2NrKHMpOworCXJldCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBzLCBiaF9wZXJfcGFnZSArIDEpOworCWlmIChyZXQpCisJICAgIGdvdG8gZHJvcF93cml0ZV9sb2NrOworCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7CisgICAgfQorICAgIGZvcihiaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSksIGJsb2NrX3N0YXJ0ID0gMDsKKyAgICAgICAgYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQ7CisJYmxvY2tfc3RhcnQ9YmxvY2tfZW5kLCBiaCA9IGJoLT5iX3RoaXNfcGFnZSkKKyAgICB7CisKKwluZXcgPSBidWZmZXJfbmV3KGJoKTsKKwljbGVhcl9idWZmZXJfbmV3KGJoKTsKKwlibG9ja19lbmQgPSBibG9ja19zdGFydCArIGJsb2Nrc2l6ZTsKKwlpZiAoYmxvY2tfZW5kIDw9IGZyb20gfHwgYmxvY2tfc3RhcnQgPj0gdG8pIHsKKwkgICAgaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQkgICAgcGFydGlhbCA9IDE7CisJfSBlbHNlIHsKKwkgICAgc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJICAgIGlmIChsb2dpdCkgeworCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIGJoLCAxKTsKKwkJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgYmgpOworCSAgICB9IGVsc2UgaWYgKCFidWZmZXJfZGlydHkoYmgpKSB7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJLyogZG8gZGF0YT1vcmRlcmVkIG9uIGFueSBwYWdlIHBhc3QgdGhlIGVuZAorCQkgKiBvZiBmaWxlIGFuZCBhbnkgYnVmZmVyIG1hcmtlZCBCSF9OZXcuCisJCSAqLworCQlpZiAocmVpc2VyZnNfZGF0YV9vcmRlcmVkKGlub2RlLT5pX3NiKSAmJgorCQkgICAgKG5ldyB8fCBwYWdlLT5pbmRleCA+PSBpX3NpemVfaW5kZXgpKSB7CisJCSAgICByZWlzZXJmc19hZGRfb3JkZXJlZF9saXN0KGlub2RlLCBiaCk7CisJICAgICAgICB9CisJICAgIH0KKwl9CisgICAgfQorICAgIGlmIChsb2dpdCkgeworCXJldCA9IGpvdXJuYWxfZW5kKCZ0aCwgcywgYmhfcGVyX3BhZ2UgKyAxKTsKK2Ryb3Bfd3JpdGVfbG9jazoKKwlyZWlzZXJmc193cml0ZV91bmxvY2socyk7CisgICAgfQorICAgIC8qCisgICAgICogSWYgdGhpcyBpcyBhIHBhcnRpYWwgd3JpdGUgd2hpY2ggaGFwcGVuZWQgdG8gbWFrZSBhbGwgYnVmZmVycworICAgICAqIHVwdG9kYXRlIHRoZW4gd2UgY2FuIG9wdGltaXplIGF3YXkgYSBib2d1cyByZWFkcGFnZSgpIGZvcgorICAgICAqIHRoZSBuZXh0IHJlYWQoKS4gSGVyZSB3ZSAnZGlzY292ZXInIHdoZXRoZXIgdGhlIHBhZ2Ugd2VudAorICAgICAqIHVwdG9kYXRlIGFzIGEgcmVzdWx0IG9mIHRoaXMgKHBvdGVudGlhbGx5IHBhcnRpYWwpIHdyaXRlLgorICAgICAqLworICAgIGlmICghcGFydGlhbCkKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKiBTdWJtaXQgcGFnZXMgZm9yIHdyaXRlLiBUaGlzIHdhcyBzZXBhcmF0ZWQgZnJvbSBhY3R1YWwgZmlsZSBjb3B5aW5nCisgICBiZWNhdXNlIHdlIG1pZ2h0IHdhbnQgdG8gYWxsb2NhdGUgYmxvY2sgbnVtYmVycyBpbi1iZXR3ZWVuLgorICAgVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgY2FsbGVyIHdpbGwgYWRqdXN0IGZpbGUgc2l6ZSB0byBjb3JyZWN0IHZhbHVlLiAqLworc3RhdGljIGludCByZWlzZXJmc19zdWJtaXRfZmlsZV9yZWdpb25fZm9yX3dyaXRlKAorCQkJCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJbG9mZl90IHBvcywgLyogV3JpdGluZyBwb3NpdGlvbiBvZmZzZXQgKi8KKwkJCQlzaXplX3QgbnVtX3BhZ2VzLCAvKiBOdW1iZXIgb2YgcGFnZXMgdG8gd3JpdGUgKi8KKwkJCQlzaXplX3Qgd3JpdGVfYnl0ZXMsIC8qIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSAqLworCQkJCXN0cnVjdCBwYWdlICoqcHJlcGFyZWRfcGFnZXMgLyogbGlzdCBvZiBwYWdlcyAqLworCQkJCSkKK3sKKyAgICBpbnQgc3RhdHVzOyAvLyByZXR1cm4gc3RhdHVzIG9mIGJsb2NrX2NvbW1pdF93cml0ZS4KKyAgICBpbnQgcmV0dmFsID0gMDsgLy8gUmV0dXJuIHZhbHVlIHdlIGFyZSBnb2luZyB0byByZXR1cm4uCisgICAgaW50IGk7IC8vIGxvb3AgY291bnRlcgorICAgIGludCBvZmZzZXQ7IC8vIFdyaXRpbmcgb2Zmc2V0IGluIHBhZ2UuCisgICAgaW50IG9yaWdfd3JpdGVfYnl0ZXMgPSB3cml0ZV9ieXRlczsKKyAgICBpbnQgc2RfdXBkYXRlID0gMDsKKworICAgIGZvciAoIGkgPSAwLCBvZmZzZXQgPSAocG9zICYgKFBBR0VfQ0FDSEVfU0laRS0xKSk7IGkgPCBudW1fcGFnZXMgOyBpKyssb2Zmc2V0PTApIHsKKwlpbnQgY291bnQgPSBtaW5fdChpbnQsUEFHRV9DQUNIRV9TSVpFLW9mZnNldCx3cml0ZV9ieXRlcyk7IC8vIEhvdyBtdWNoIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIHRoaXMgcGFnZQorCXN0cnVjdCBwYWdlICpwYWdlPXByZXBhcmVkX3BhZ2VzW2ldOyAvLyBDdXJyZW50IHBhZ2Ugd2UgcHJvY2Vzcy4KKworCXN0YXR1cyA9IHJlaXNlcmZzX2NvbW1pdF9wYWdlKGlub2RlLCBwYWdlLCBvZmZzZXQsIG9mZnNldCtjb3VudCk7CisJaWYgKCBzdGF0dXMgKQorCSAgICByZXR2YWwgPSBzdGF0dXM7IC8vIFRvIG5vdCBvdmVyY29tcGxpY2F0ZSBtYXR0ZXJzIFdlIGFyZSBnb2luZyB0bworCQkJICAgICAvLyBzdWJtaXQgYWxsIHRoZSBwYWdlcyBldmVuIGlmIHRoZXJlIHdhcyBlcnJvci4KKwkJCSAgICAgLy8gd2Ugb25seSByZW1lbWJlciBlcnJvciBzdGF0dXMgdG8gcmVwb3J0IGl0IG9uCisJCQkgICAgIC8vIGV4aXQuCisJd3JpdGVfYnl0ZXMtPWNvdW50OworICAgIH0KKyAgICAvKiBub3cgdGhhdCB3ZSd2ZSBnb3R0ZW4gYWxsIHRoZSBvcmRlcmVkIGJ1ZmZlcnMgbWFya2VkIGRpcnR5LAorICAgICAqIHdlIGNhbiBzYWZlbHkgdXBkYXRlIGlfc2l6ZSBhbmQgY2xvc2UgYW55IHJ1bm5pbmcgdHJhbnNhY3Rpb24KKyAgICAgKi8KKyAgICBpZiAoIHBvcyArIG9yaWdfd3JpdGVfYnl0ZXMgPiBpbm9kZS0+aV9zaXplKSB7CisJaW5vZGUtPmlfc2l6ZSA9IHBvcyArIG9yaWdfd3JpdGVfYnl0ZXM7IC8vIFNldCBuZXcgc2l6ZQorCS8qIElmIHRoZSBmaWxlIGhhdmUgZ3Jvd24gc28gbXVjaCB0aGF0IHRhaWwgcGFja2luZyBpcyBubworCSAqIGxvbmdlciBwb3NzaWJsZSwgcmVzZXQgIm5lZWQgdG8gcGFjayIgZmxhZyAqLworCWlmICggKGhhdmVfbGFyZ2VfdGFpbHMgKGlub2RlLT5pX3NiKSAmJgorCSAgICAgIGlub2RlLT5pX3NpemUgPiBpX2Jsb2NrX3NpemUgKGlub2RlKSo0KSB8fAorCSAgICAgKGhhdmVfc21hbGxfdGFpbHMgKGlub2RlLT5pX3NiKSAmJgorCSAgICAgaW5vZGUtPmlfc2l6ZSA+IGlfYmxvY2tfc2l6ZShpbm9kZSkpICkKKwkgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfmlfcGFja19vbl9jbG9zZV9tYXNrIDsKKyAgICAgICAgZWxzZSBpZiAoIChoYXZlX2xhcmdlX3RhaWxzIChpbm9kZS0+aV9zYikgJiYKKwkgICAgICAgICAgaW5vZGUtPmlfc2l6ZSA8IGlfYmxvY2tfc2l6ZSAoaW5vZGUpKjQpIHx8CisJICAgICAgICAgIChoYXZlX3NtYWxsX3RhaWxzIChpbm9kZS0+aV9zYikgJiYKKwkJICBpbm9kZS0+aV9zaXplIDwgaV9ibG9ja19zaXplKGlub2RlKSkgKQorCSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX3BhY2tfb25fY2xvc2VfbWFzayA7CisKKwlpZiAodGgtPnRfdHJhbnNfaWQpIHsKKwkgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpOyAvLyBBbmQgdXBkYXRlIG9uLWRpc2sgbWV0YWRhdGEKKwkgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwl9IGVsc2UKKwkgICAgaW5vZGUtPmlfc2ItPnNfb3AtPmRpcnR5X2lub2RlKGlub2RlKTsKKworICAgICAgICBzZF91cGRhdGUgPSAxOworICAgIH0KKyAgICBpZiAodGgtPnRfdHJhbnNfaWQpIHsKKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwlpZiAoIXNkX3VwZGF0ZSkKKwkgICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7CisJc3RhdHVzID0gam91cm5hbF9lbmQodGgsIHRoLT50X3N1cGVyLCB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKTsKKyAgICAgICAgaWYgKHN0YXR1cykKKyAgICAgICAgICAgIHJldHZhbCA9IHN0YXR1czsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworICAgIH0KKyAgICB0aC0+dF90cmFuc19pZCA9IDA7CisKKyAgICAvKiAKKyAgICAgKiB3ZSBoYXZlIHRvIHVubG9jayB0aGUgcGFnZXMgYWZ0ZXIgdXBkYXRpbmcgaV9zaXplLCBvdGhlcndpc2UKKyAgICAgKiB3ZSByYWNlIHdpdGggd3JpdGVwYWdlCisgICAgICovCisgICAgZm9yICggaSA9IDA7IGkgPCBudW1fcGFnZXMgOyBpKyspIHsKKwlzdHJ1Y3QgcGFnZSAqcGFnZT1wcmVwYXJlZF9wYWdlc1tpXTsKKwl1bmxvY2tfcGFnZShwYWdlKTsgCisJbWFya19wYWdlX2FjY2Vzc2VkKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyogTG9vayBpZiBwYXNzZWQgd3JpdGluZyByZWdpb24gaXMgZ29pbmcgdG8gdG91Y2ggZmlsZSdzIHRhaWwKKyAgIChpZiBpdCBpcyBwcmVzZW50KS4gQW5kIGlmIGl0IGlzLCBjb252ZXJ0IHRoZSB0YWlsIHRvIHVuZm9ybWF0dGVkIG5vZGUgKi8KK3N0YXRpYyBpbnQgcmVpc2VyZnNfY2hlY2tfZm9yX3RhaWxfYW5kX2NvbnZlcnQoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIC8qIGlub2RlIHRvIGRlYWwgd2l0aCAqLworCQkJCQkgbG9mZl90IHBvcywgLyogV3JpdGluZyBwb3NpdGlvbiAqLworCQkJCQkgaW50IHdyaXRlX2J5dGVzIC8qIGFtb3VudCBvZiBieXRlcyB0byB3cml0ZSAqLworCQkJCSAgICAgICAgKQoreworICAgIElOSVRJQUxJWkVfUEFUSChwYXRoKTsgLy8gbmVlZGVkIGZvciBzZWFyY2hfZm9yX3Bvc2l0aW9uCisgICAgc3RydWN0IGNwdV9rZXkga2V5OyAvLyBLZXkgdGhhdCB3b3VsZCByZXByZXNlbnQgbGFzdCB0b3VjaGVkIHdyaXRpbmcgYnl0ZS4KKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICppaDsgLy8gaXRlbSBoZWFkZXIgb2YgZm91bmQgYmxvY2s7CisgICAgaW50IHJlczsgLy8gUmV0dXJuIHZhbHVlIG9mIHZhcmlvdXMgZnVuY3Rpb25zIHdlIGNhbGwuCisgICAgaW50IGNvbnRfZXhwYW5kX29mZnNldDsgLy8gV2Ugd2lsbCBwdXQgb2Zmc2V0IGZvciBnZW5lcmljX2NvbnRfZXhwYW5kIGhlcmUKKwkJCSAgICAvLyBUaGlzIGNhbiBiZSBpbnQganVzdCBiZWNhdXNlIHRhaWxzIGFyZSBjcmVhdGVkCisJCQkgICAgLy8gb25seSBmb3Igc21hbGwgZmlsZXMuCisgCisvKiB0aGlzIGVtYm9kaWVzIGEgZGVwZW5kZW5jeSBvbiBhIHBhcnRpY3VsYXIgdGFpbCBwb2xpY3kgKi8KKyAgICBpZiAoIGlub2RlLT5pX3NpemUgPj0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKjQgKSB7CisJLyogc3VjaCBhIGJpZyBmaWxlcyBkbyBub3QgaGF2ZSB0YWlscywgc28gd2Ugd29uJ3QgYm90aGVyIG91cnNlbHZlcworCSAgIHRvIGxvb2sgZm9yIHRhaWxzLCBzaW1wbHkgcmV0dXJuICovCisJcmV0dXJuIDA7CisgICAgfQorCisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisgICAgLyogZmluZCB0aGUgaXRlbSBjb250YWluaW5nIHRoZSBsYXN0IGJ5dGUgdG8gYmUgd3JpdHRlbiwgb3IgaWYKKyAgICAgKiB3cml0aW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZSB0aGVuIHRoZSBsYXN0IGl0ZW0gb2YgdGhlCisgICAgICogZmlsZSAoYW5kIHRoZW4gd2UgY2hlY2sgaXRzIHR5cGUpLiAqLworICAgIG1ha2VfY3B1X2tleSAoJmtleSwgaW5vZGUsIHBvcyt3cml0ZV9ieXRlcysxLCBUWVBFX0FOWSwgMy8qa2V5IGxlbmd0aCovKTsKKyAgICByZXMgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOworICAgIGlmICggcmVzID09IElPX0VSUk9SICkgeworICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCXJldHVybiAtRUlPOworICAgIH0KKyAgICBpaCA9IGdldF9paCgmcGF0aCk7CisgICAgcmVzID0gMDsKKyAgICBpZiAoIGlzX2RpcmVjdF9sZV9paChpaCkgKSB7CisJLyogT2ssIGNsb3Nlc3QgaXRlbSBpcyBmaWxlIHRhaWwgKHRhaWxzIGFyZSBzdG9yZWQgaW4gImRpcmVjdCIKKwkgKiBpdGVtcyksIHNvIHdlIG5lZWQgdG8gdW5wYWNrIGl0LiAqLworCS8qIFRvIG5vdCBvdmVyY29tcGxpY2F0ZSBtYXR0ZXJzLCB3ZSBqdXN0IGNhbGwgZ2VuZXJpY19jb250X2V4cGFuZAorCSAgIHdoaWNoIHdpbGwgaW4gdHVybiBjYWxsIG90aGVyIHN0dWZmIGFuZCBmaW5hbGx5IHdpbGwgYm9pbCBkb3duIHRvCisJICAgIHJlaXNlcmZzX2dldF9ibG9jaygpIHRoYXQgd291bGQgZG8gbmVjZXNzYXJ5IGNvbnZlcnNpb24uICovCisJY29udF9leHBhbmRfb2Zmc2V0ID0gbGVfa2V5X2tfb2Zmc2V0KGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlKSwgJihpaC0+aWhfa2V5KSk7CisJcGF0aHJlbHNlKCZwYXRoKTsKKwlyZXMgPSBnZW5lcmljX2NvbnRfZXhwYW5kKCBpbm9kZSwgY29udF9leHBhbmRfb2Zmc2V0KTsKKyAgICB9IGVsc2UKKwlwYXRocmVsc2UoJnBhdGgpOworCisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGxvY2tzIHBhZ2VzIHN0YXJ0aW5nIGZyb20gQHBvcyBmb3IgQGlub2RlLgorICAgQG51bV9wYWdlcyBwYWdlcyBhcmUgbG9ja2VkIGFuZCBzdG9yZWQgaW4KKyAgIEBwcmVwYXJlZF9wYWdlcyBhcnJheS4gQWxzbyBidWZmZXJzIGFyZSBhbGxvY2F0ZWQgZm9yIHRoZXNlIHBhZ2VzLgorICAgRmlyc3QgYW5kIGxhc3QgcGFnZSBvZiB0aGUgcmVnaW9uIGlzIHJlYWQgaWYgaXQgaXMgb3ZlcndyaXR0ZW4gb25seQorICAgcGFydGlhbGx5LiBJZiBsYXN0IHBhZ2UgZGlkIG5vdCBleGlzdCBiZWZvcmUgd3JpdGUgKGZpbGUgaG9sZSBvciBmaWxlCisgICBhcHBlbmQpLCBpdCBpcyB6ZXJvZWQsIHRoZW4uIAorICAgUmV0dXJucyBudW1iZXIgb2YgdW5hbGxvY2F0ZWQgYmxvY2tzIHRoYXQgc2hvdWxkIGJlIGFsbG9jYXRlZCB0byBjb3ZlcgorICAgbmV3IGZpbGUgZGF0YS4qLworc3RhdGljIGludCByZWlzZXJmc19wcmVwYXJlX2ZpbGVfcmVnaW9uX2Zvcl93cml0ZSgKKwkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlIC8qIElub2RlIG9mIHRoZSBmaWxlICovLAorCQkJCWxvZmZfdCBwb3MsIC8qIHBvc2l0aW9uIGluIHRoZSBmaWxlICovCisJCQkJc2l6ZV90IG51bV9wYWdlcywgLyogbnVtYmVyIG9mIHBhZ2VzIHRvCisJCQkJCSAgICAgICAgICBwcmVwYXJlICovCisJCQkJc2l6ZV90IHdyaXRlX2J5dGVzLCAvKiBBbW91bnQgb2YgYnl0ZXMgdG8gYmUKKwkJCQkJCSAgICBvdmVyd3JpdHRlbiBmcm9tCisJCQkJCQkgICAgQHBvcyAqLworCQkJCXN0cnVjdCBwYWdlICoqcHJlcGFyZWRfcGFnZXMgLyogcG9pbnRlciB0byBhcnJheQorCQkJCQkJCSAgICAgICB3aGVyZSB0byBzdG9yZQorCQkJCQkJCSAgICAgICBwcmVwYXJlZCBwYWdlcyAqLworCQkJCQkgICApCit7CisgICAgaW50IHJlcz0wOyAvLyBSZXR1cm4gdmFsdWVzIG9mIGRpZmZlcmVudCBmdW5jdGlvbnMgd2UgY2FsbC4KKyAgICB1bnNpZ25lZCBsb25nIGluZGV4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7IC8vIE9mZnNldCBpbiBmaWxlIGluIHBhZ2VzLgorICAgIGludCBmcm9tID0gKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7IC8vIFdyaXRpbmcgb2Zmc2V0IGluIGZpcnN0IHBhZ2UKKyAgICBpbnQgdG8gPSAoKHBvcyArIHdyaXRlX2J5dGVzIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpICsgMTsKKwkJCQkJIC8qIG9mZnNldCBvZiBsYXN0IG1vZGlmaWVkIGJ5dGUgaW4gbGFzdAorCQkJCSAgICAgICAgICAgIHBhZ2UgKi8KKyAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7IC8vIFBhZ2VzIGFyZSBtYXBwZWQgaGVyZS4KKyAgICBpbnQgaTsgLy8gU2ltcGxlIGNvdW50ZXIKKyAgICBpbnQgYmxvY2tzID0gMDsgLyogUmV0dXJuIHZhbHVlIChibG9ja3MgdGhhdCBzaG91bGQgYmUgYWxsb2NhdGVkKSAqLworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkOyAvLyBDdXJyZW50IGJ1ZmZlcmhlYWQgYW5kIGZpcnN0IGJ1ZmZlcmhlYWQKKwkJCQkgICAvLyBvZiBhIHBhZ2UuCisgICAgdW5zaWduZWQgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZDsgLy8gU3RhcnRpbmcgYW5kIGVuZGluZyBvZmZzZXRzIG9mIGN1cnJlbnQKKwkJCQkgICAgIC8vIGJ1ZmZlciBpbiB0aGUgcGFnZS4KKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKndhaXRbMl0sICoqd2FpdF9iaD13YWl0OyAvLyBCdWZmZXJzIGZvciBwYWdlLCBpZgorCQkJCQkJIC8vIFBhZ2UgYXBwZWFyZWQgdG8gYmUgbm90IHVwCisJCQkJCQkgLy8gdG8gZGF0ZS4gTm90ZSBob3cgd2UgaGF2ZQorCQkJCQkJIC8vIGF0IG1vc3QgMiBidWZmZXJzLCB0aGlzIGlzCisJCQkJCQkgLy8gYmVjYXVzZSB3ZSBhdCBtb3N0IG1heQorCQkJCQkJIC8vIHBhcnRpYWxseSBvdmVyd3JpdGUgdHdvCisJCQkJCQkgLy8gYnVmZmVycyBmb3Igb25lIHBhZ2UuIE9uZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYmVnaW5uaW5nIG9mIHdyaXRlIGFyZWEKKwkJCQkJCSAvLyBhbmQgb25lIGF0IHRoZSBlbmQuCisJCQkJCQkgLy8gRXZlcnl0aGluZyBpbnRoZSBtaWRkbGUgZ2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVyd3JpdHRlbiB0b3RhbGx5LgorCisgICAgc3RydWN0IGNwdV9rZXkga2V5OyAvLyBjcHUga2V5IG9mIGl0ZW0gdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCisgICAgc3RydWN0IGl0ZW1faGVhZCAqaWggPSBOVUxMOyAvLyBwb2ludGVyIHRvIGl0ZW0gaGVhZCB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKml0ZW1idWY9TlVMTDsgLy8gQnVmZmVyIGhlYWQgdGhhdCBjb250YWlucyBpdGVtcyB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKKyAgICBJTklUSUFMSVpFX1BBVEgocGF0aCk7IC8vIHBhdGggdG8gaXRlbSwgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoLgorICAgIF9fdTMyICogaXRlbT1OVUxMOyAvLyBwb2ludGVyIHRvIGl0ZW0gd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAorICAgIGludCBpdGVtX3Bvcz0tMTsgLyogUG9zaXRpb24gaW4gaW5kaXJlY3QgaXRlbSAqLworCisKKyAgICBpZiAoIG51bV9wYWdlcyA8IDEgKSB7CisJcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsCisJCQkgICJncmVlbi05MDAxOiByZWlzZXJmc19wcmVwYXJlX2ZpbGVfcmVnaW9uX2Zvcl93cml0ZSAiCisJCQkgICJjYWxsZWQgd2l0aCB6ZXJvIG51bWJlciBvZiBwYWdlcyB0byBwcm9jZXNzIik7CisJcmV0dXJuIC1FRkFVTFQ7CisgICAgfQorCisgICAgLyogV2UgaGF2ZSAyIGxvb3BzIGZvciBwYWdlcy4gSW4gZmlyc3QgbG9vcCB3ZSBncmFiIGFuZCBsb2NrIHRoZSBwYWdlcywgc28KKyAgICAgICB0aGF0IG5vYm9keSB3b3VsZCB0b3VjaCB0aGVzZSB1bnRpbCB3ZSByZWxlYXNlIHRoZSBwYWdlcy4gVGhlbgorICAgICAgIHdlJ2Qgc3RhcnQgdG8gZGVhbCB3aXRoIG1hcHBpbmcgYnVmZmVycyB0byBibG9ja3MuICovCisgICAgZm9yICggaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykgeworCXByZXBhcmVkX3BhZ2VzW2ldID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4ICsgaSk7IC8vIGxvY2tzIHRoZSBwYWdlCisJaWYgKCAhcHJlcGFyZWRfcGFnZXNbaV0pIHsKKwkgICAgcmVzID0gLUVOT01FTTsKKwkgICAgZ290byBmYWlsZWRfcGFnZV9ncmFiYmluZzsKKwl9CisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHByZXBhcmVkX3BhZ2VzW2ldKSkKKwkgICAgY3JlYXRlX2VtcHR5X2J1ZmZlcnMocHJlcGFyZWRfcGFnZXNbaV0sIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwgMCk7CisgICAgfQorCisgICAgLyogTGV0J3MgY291bnQgYW1vdW50IG9mIGJsb2NrcyBmb3IgYSBjYXNlIHdoZXJlIGFsbCB0aGUgYmxvY2tzCisgICAgICAgb3ZlcndyaXR0ZW4gYXJlIG5ldyAod2Ugd2lsbCBzdWJzdHJhY3QgYWxyZWFkeSBhbGxvY2F0ZWQgYmxvY2tzIGxhdGVyKSovCisgICAgaWYgKCBudW1fcGFnZXMgPiAyICkKKwkvKiBUaGVzZSBhcmUgZnVsbC1vdmVyd3JpdHRlbiBwYWdlcyBzbyB3ZSBjb3VudCBhbGwgdGhlIGJsb2NrcyBpbgorCSAgIHRoZXNlIHBhZ2VzIGFyZSBjb3VudGVkIGFzIG5lZWRlZCB0byBiZSBhbGxvY2F0ZWQgKi8KKwlibG9ja3MgPSAobnVtX3BhZ2VzIC0gMikgPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKKworICAgIC8qIGNvdW50IGJsb2NrcyBuZWVkZWQgZm9yIGZpcnN0IHBhZ2UgKHBvc3NpYmx5IHBhcnRpYWxseSB3cml0dGVuKSAqLworICAgIGJsb2NrcyArPSAoKFBBR0VfQ0FDSEVfU0laRSAtIGZyb20pID4+IGlub2RlLT5pX2Jsa2JpdHMpICsKKwkgICAhIShmcm9tICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZS0xKSk7IC8qIHJvdW5kdXAgKi8KKworICAgIC8qIE5vdyB3ZSBhY2NvdW50IGZvciBsYXN0IHBhZ2UuIElmIGxhc3QgcGFnZSA9PSBmaXJzdCBwYWdlICh3ZQorICAgICAgIG92ZXJ3cml0ZSBvbmx5IG9uZSBwYWdlKSwgd2Ugc3Vic3RyYWN0IGFsbCB0aGUgYmxvY2tzIHBhc3QgdGhlCisgICAgICAgbGFzdCB3cml0aW5nIHBvc2l0aW9uIGluIGEgcGFnZSBvdXQgb2YgYWxyZWFkeSBjYWxjdWxhdGVkIG51bWJlcgorICAgICAgIG9mIGJsb2NrcyAqLworICAgIGJsb2NrcyArPSAoKG51bV9wYWdlcyA+IDEpIDw8IChQQUdFX0NBQ0hFX1NISUZULWlub2RlLT5pX2Jsa2JpdHMpKSAtCisJICAgKChQQUdFX0NBQ0hFX1NJWkUgLSB0bykgPj4gaW5vZGUtPmlfYmxrYml0cyk7CisJICAgLyogTm90ZSBob3cgd2UgZG8gbm90IHJvdW5kdXAgaGVyZSBzaW5jZSBwYXJ0aWFsIGJsb2NrcyBzdGlsbAorCQkgICBzaG91bGQgYmUgYWxsb2NhdGVkICovCisKKyAgICAvKiBOb3cgaWYgYWxsIHRoZSB3cml0ZSBhcmVhIGxpZXMgcGFzdCB0aGUgZmlsZSBlbmQsIG5vIHBvaW50IGluCisgICAgICAgbWFwaW5nIGJsb2Nrcywgc2luY2UgdGhlcmUgaXMgbm9uZSwgc28gd2UganVzdCB6ZXJvIG91dCByZW1haW5pbmcKKyAgICAgICBwYXJ0cyBvZiBmaXJzdCBhbmQgbGFzdCBwYWdlcyBpbiB3cml0ZSBhcmVhIChpZiBuZWVkZWQpICovCisgICAgaWYgKCAocG9zICYgfigobG9mZl90KVBBR0VfQ0FDSEVfU0laRSAtIDEpKSA+IGlub2RlLT5pX3NpemUgKSB7CisJaWYgKCBmcm9tICE9IDAgKSB7LyogRmlyc3QgcGFnZSBuZWVkcyB0byBiZSBwYXJ0aWFsbHkgemVyb2VkICovCisJICAgIGNoYXIgKmthZGRyID0ga21hcF9hdG9taWMocHJlcGFyZWRfcGFnZXNbMF0sIEtNX1VTRVIwKTsKKwkgICAgbWVtc2V0KGthZGRyLCAwLCBmcm9tKTsKKwkgICAga3VubWFwX2F0b21pYygga2FkZHIsIEtNX1VTRVIwKTsKKwl9CisJaWYgKCB0byAhPSBQQUdFX0NBQ0hFX1NJWkUgKSB7IC8qIExhc3QgcGFnZSBuZWVkcyB0byBiZSBwYXJ0aWFsbHkgemVyb2VkICovCisJICAgIGNoYXIgKmthZGRyID0ga21hcF9hdG9taWMocHJlcGFyZWRfcGFnZXNbbnVtX3BhZ2VzLTFdLCBLTV9VU0VSMCk7CisJICAgIG1lbXNldChrYWRkcit0bywgMCwgUEFHRV9DQUNIRV9TSVpFIC0gdG8pOworCSAgICBrdW5tYXBfYXRvbWljKCBrYWRkciwgS01fVVNFUjApOworCX0KKworCS8qIFNpbmNlIGFsbCBibG9ja3MgYXJlIG5ldyAtIHVzZSBhbHJlYWR5IGNhbGN1bGF0ZWQgdmFsdWUgKi8KKwlyZXR1cm4gYmxvY2tzOworICAgIH0KKworICAgIC8qIFdlbGwsIHNpbmNlIHdlIHdyaXRlIHNvbWV3aGVyZSBpbnRvIHRoZSBtaWRkbGUgb2YgYSBmaWxlLCB0aGVyZSBpcworICAgICAgIHBvc3NpYmlsaXR5IHdlIGFyZSB3cml0aW5nIG92ZXIgc29tZSBhbHJlYWR5IGFsbG9jYXRlZCBibG9ja3MsIHNvCisgICAgICAgbGV0J3MgbWFwIHRoZXNlIGJsb2NrcyBhbmQgc3Vic3RyYWN0IG51bWJlciBvZiBzdWNoIGJsb2NrcyBvdXQgb2YgYmxvY2tzCisgICAgICAgd2UgbmVlZCB0byBhbGxvY2F0ZSAoY2FsY3VsYXRlZCBhYm92ZSkgKi8KKyAgICAvKiBNYXNrIHdyaXRlIHBvc2l0aW9uIHRvIHN0YXJ0IG9uIGJsb2Nrc2l6ZSwgd2UgZG8gaXQgb3V0IG9mIHRoZQorICAgICAgIGxvb3AgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKi8KKyAgICBwb3MgJj0gfigobG9mZl90KSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKTsKKyAgICAvKiBTZXQgY3B1IGtleSB0byB0aGUgc3RhcnRpbmcgcG9zaXRpb24gaW4gYSBmaWxlIChvbiBsZWZ0IGJsb2NrIGJvdW5kYXJ5KSovCisgICAgbWFrZV9jcHVfa2V5ICgma2V5LCBpbm9kZSwgMSArICgocG9zKSAmIH4oKGxvZmZfdCkgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpLCBUWVBFX0FOWSwgMy8qa2V5IGxlbmd0aCovKTsKKworICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOyAvLyBXZSBuZWVkIHRoYXQgZm9yIGF0IGxlYXN0IHNlYXJjaF9ieV9rZXkoKQorICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX3BhZ2VzIDsgaSsrICkgeyAKKworCWhlYWQgPSBwYWdlX2J1ZmZlcnMocHJlcGFyZWRfcGFnZXNbaV0pOworCS8qIEZvciBlYWNoIGJ1ZmZlciBpbiB0aGUgcGFnZSAqLworCWZvcihiaCA9IGhlYWQsIGJsb2NrX3N0YXJ0ID0gMDsgYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQ7CisJICAgIGJsb2NrX3N0YXJ0PWJsb2NrX2VuZCwgYmggPSBiaC0+Yl90aGlzX3BhZ2UpIHsKKwkJaWYgKCFiaCkKKwkJICAgIHJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLCAiZ3JlZW4tOTAwMjogQWxsb2NhdGVkIGJ1dCBhYnNlbnQgYnVmZmVyIGZvciBhIHBhZ2U/Iik7CisJCS8qIEZpbmQgd2hlcmUgdGhpcyBidWZmZXIgZW5kcyAqLworCQlibG9ja19lbmQgPSBibG9ja19zdGFydCtpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJCWlmIChpID09IDAgJiYgYmxvY2tfZW5kIDw9IGZyb20gKQorCQkgICAgLyogaWYgdGhpcyBidWZmZXIgaXMgYmVmb3JlIHJlcXVlc3RlZCBkYXRhIHRvIG1hcCwgc2tpcCBpdCovCisJCSAgICBjb250aW51ZTsKKworCQlpZiAoaSA9PSBudW1fcGFnZXMgLSAxICYmIGJsb2NrX3N0YXJ0ID49IHRvKSB7CisJCSAgICAvKiBJZiB0aGlzIGJ1ZmZlciBpcyBhZnRlciByZXF1ZXN0ZWQgZGF0YSB0byBtYXAsIGFib3J0CisJCSAgICAgICBwcm9jZXNzaW5nIG9mIGN1cnJlbnQgcGFnZSAqLworCQkgICAgYnJlYWs7CisJCX0KKworCQlpZiAoIGJ1ZmZlcl9tYXBwZWQoYmgpICYmIGJoLT5iX2Jsb2NrbnIgIT0wICkgeworCQkgICAgLyogVGhpcyBpcyBvcHRpbWlzYXRpb24gZm9yIGEgY2FzZSB3aGVyZSBidWZmZXIgaXMgbWFwcGVkCisJCSAgICAgICBhbmQgaGF2ZSBibG9ja251bWJlciBhc3NpZ25lZC4gSW4gY2FzZSBzaWduaWZpY2FudCBhbW91bnQKKwkJICAgICAgIG9mIHN1Y2ggYnVmZmVycyBhcmUgcHJlc2VudCwgd2UgbWF5IGF2b2lkIHNvbWUgYW1vdW50CisJCSAgICAgICBvZiBzZWFyY2hfYnlfa2V5IGNhbGxzLgorCQkgICAgICAgUHJvYmFibHkgaXQgd291bGQgYmUgcG9zc2libGUgdG8gbW92ZSBwYXJ0cyBvZiB0aGlzIGNvZGUKKwkJICAgICAgIG91dCBvZiBCS0wsIGJ1dCBJIGFmcmFpZCB0aGF0IHdvdWxkIG92ZXJjb21wbGljYXRlIGNvZGUKKwkJICAgICAgIHdpdGhvdXQgYW55IG5vdGljZWFibGUgYmVuZWZpdC4KKwkJICAgICovCisJCSAgICBpdGVtX3BvcysrOworCQkgICAgLyogVXBkYXRlIHRoZSBrZXkgKi8KKwkJICAgIHNldF9jcHVfa2V5X2tfb2Zmc2V0KCAma2V5LCBjcHVfa2V5X2tfb2Zmc2V0KCZrZXkpICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwkJICAgIGJsb2Nrcy0tOyAvLyBEZWNyZWFzZSB0aGUgYW1vdW50IG9mIGJsb2NrcyB0aGF0IG5lZWQgdG8gYmUKKwkJCSAgICAgIC8vIGFsbG9jYXRlZAorCQkgICAgY29udGludWU7IC8vIEdvIHRvIHRoZSBuZXh0IGJ1ZmZlcgorCQl9CisKKwkJaWYgKCAhaXRlbWJ1ZiB8fCAvKiBpZiBmaXJzdCBpdGVyYXRpb24gKi8KKwkJICAgICBpdGVtX3BvcyA+PSBpaF9pdGVtX2xlbihpaCkvVU5GTV9QX1NJWkUpCisJCQkJCSAgICAgeyAvKiBvciBpZiB3ZSBwcm9ncmVzc2VkIHBhc3QgdGhlCisJCQkJCQkgIGN1cnJlbnQgdW5mb3JtYXR0ZWRfaXRlbSAqLworCQkJLyogVHJ5IHRvIGZpbmQgbmV4dCBpdGVtICovCisJCQlyZXMgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOworCQkJLyogQWJvcnQgaWYgbm8gbW9yZSBpdGVtcyAqLworCQkJaWYgKCByZXMgIT0gUE9TSVRJT05fRk9VTkQgKSB7CisJCQkgICAgLyogbWFrZSBzdXJlIGxhdGVyIGxvb3BzIGRvbid0IHVzZSB0aGlzIGl0ZW0gKi8KKwkJCSAgICBpdGVtYnVmID0gTlVMTDsKKwkJCSAgICBpdGVtID0gTlVMTDsKKwkJCSAgICBicmVhazsKKwkJCX0KKworCQkJLyogVXBkYXRlIGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQgaW5kaXJlY3QgaXRlbSAqLworCQkJaXRlbWJ1ZiA9IGdldF9sYXN0X2JoKCAmcGF0aCApOworCQkJaWggPSBnZXRfaWgoICZwYXRoICk7CisJCQlpdGVtID0gZ2V0X2l0ZW0oICZwYXRoICk7CisJCQlpdGVtX3BvcyA9IHBhdGgucG9zX2luX2l0ZW07CisKKwkJCVJGQUxTRSggIWlzX2luZGlyZWN0X2xlX2loIChpaCksICJncmVlbi05MDAzOiBpbmRpcmVjdCBpdGVtIGV4cGVjdGVkIik7CisJCX0KKworCQkvKiBTZWUgaWYgdGhlcmUgaXMgc29tZSBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUKKwkJICAgYXQgdGhhdCBwb3NpdGlvbiwgbWFwIHRoZSBidWZmZXIgdG8gdGhpcyBibG9jayAqLworCQlpZiAoIGdldF9ibG9ja19udW0oaXRlbSxpdGVtX3BvcykgKSB7CisJCSAgICBtYXBfYmgoYmgsIGlub2RlLT5pX3NiLCBnZXRfYmxvY2tfbnVtKGl0ZW0saXRlbV9wb3MpKTsKKwkJICAgIGJsb2Nrcy0tOyAvLyBEZWNyZWFzZSB0aGUgYW1vdW50IG9mIGJsb2NrcyB0aGF0IG5lZWQgdG8gYmUKKwkJCSAgICAgIC8vIGFsbG9jYXRlZAorCQl9CisJCWl0ZW1fcG9zKys7CisJCS8qIFVwZGF0ZSB0aGUga2V5ICovCisJCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCAma2V5LCBjcHVfa2V5X2tfb2Zmc2V0KCZrZXkpICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwl9CisgICAgfQorICAgIHBhdGhyZWxzZSgmcGF0aCk7IC8vIEZyZWUgdGhlIHBhdGgKKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCisJLyogTm93IHplcm8gb3V0IHVubWFwcGVuZCBidWZmZXJzIGZvciB0aGUgZmlyc3QgYW5kIGxhc3QgcGFnZXMgb2YKKwkgICB3cml0ZSBhcmVhIG9yIGlzc3VlIHJlYWQgcmVxdWVzdHMgaWYgcGFnZSBpcyBtYXBwZWQuICovCisJLyogRmlyc3QgcGFnZSwgc2VlIGlmIGl0IGlzIG5vdCB1cHRvZGF0ZSAqLworCWlmICggIVBhZ2VVcHRvZGF0ZShwcmVwYXJlZF9wYWdlc1swXSkgKSB7CisJICAgIGhlYWQgPSBwYWdlX2J1ZmZlcnMocHJlcGFyZWRfcGFnZXNbMF0pOworCisJICAgIC8qIEZvciBlYWNoIGJ1ZmZlciBpbiBwYWdlICovCisJICAgIGZvcihiaCA9IGhlYWQsIGJsb2NrX3N0YXJ0ID0gMDsgYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQ7CisJCWJsb2NrX3N0YXJ0PWJsb2NrX2VuZCwgYmggPSBiaC0+Yl90aGlzX3BhZ2UpIHsKKworCQlpZiAoIWJoKQorCQkgICAgcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsICJncmVlbi05MDAyOiBBbGxvY2F0ZWQgYnV0IGFic2VudCBidWZmZXIgZm9yIGEgcGFnZT8iKTsKKwkJLyogRmluZCB3aGVyZSB0aGlzIGJ1ZmZlciBlbmRzICovCisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0K2lub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJaWYgKCBibG9ja19lbmQgPD0gZnJvbSApCisJCSAgICAvKiBpZiB0aGlzIGJ1ZmZlciBpcyBiZWZvcmUgcmVxdWVzdGVkIGRhdGEgdG8gbWFwLCBza2lwIGl0Ki8KKwkJICAgIGNvbnRpbnVlOworCQlpZiAoIGJsb2NrX3N0YXJ0IDwgZnJvbSApIHsgLyogQWhhLCBvdXIgcGFydGlhbCBidWZmZXIgKi8KKwkJICAgIGlmICggYnVmZmVyX21hcHBlZChiaCkgKSB7IC8qIElmIGl0IGlzIG1hcHBlZCwgd2UgbmVlZCB0bworCQkJCQkJICBpc3N1ZSBSRUFEIHJlcXVlc3QgZm9yIGl0IHRvCisJCQkJCQkgIG5vdCBsb29zZSBkYXRhICovCisJCQlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOworCQkJKndhaXRfYmgrKz1iaDsKKwkJICAgIH0gZWxzZSB7IC8qIE5vdCBtYXBwZWQsIHplcm8gaXQgKi8KKwkJCWNoYXIgKmthZGRyID0ga21hcF9hdG9taWMocHJlcGFyZWRfcGFnZXNbMF0sIEtNX1VTRVIwKTsKKwkJCW1lbXNldChrYWRkcitibG9ja19zdGFydCwgMCwgZnJvbS1ibG9ja19zdGFydCk7CisJCQlrdW5tYXBfYXRvbWljKCBrYWRkciwgS01fVVNFUjApOworCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKworCS8qIExhc3QgcGFnZSwgc2VlIGlmIGl0IGlzIG5vdCB1cHRvZGF0ZSwgb3IgaWYgdGhlIGxhc3QgcGFnZSBpcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUuICovCisJaWYgKCAhUGFnZVVwdG9kYXRlKHByZXBhcmVkX3BhZ2VzW251bV9wYWdlcy0xXSkgfHwgCisJICAgICgocG9zK3dyaXRlX2J5dGVzKT4+UEFHRV9DQUNIRV9TSElGVCkgPiAoaW5vZGUtPmlfc2l6ZT4+UEFHRV9DQUNIRV9TSElGVCkgKSB7CisJICAgIGhlYWQgPSBwYWdlX2J1ZmZlcnMocHJlcGFyZWRfcGFnZXNbbnVtX3BhZ2VzLTFdKTsKKworCSAgICAvKiBmb3IgZWFjaCBidWZmZXIgaW4gcGFnZSAqLworCSAgICBmb3IoYmggPSBoZWFkLCBibG9ja19zdGFydCA9IDA7IGJoICE9IGhlYWQgfHwgIWJsb2NrX3N0YXJ0OworCQlibG9ja19zdGFydD1ibG9ja19lbmQsIGJoID0gYmgtPmJfdGhpc19wYWdlKSB7CisKKwkJaWYgKCFiaCkKKwkJICAgIHJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLCAiZ3JlZW4tOTAwMjogQWxsb2NhdGVkIGJ1dCBhYnNlbnQgYnVmZmVyIGZvciBhIHBhZ2U/Iik7CisJCS8qIEZpbmQgd2hlcmUgdGhpcyBidWZmZXIgZW5kcyAqLworCQlibG9ja19lbmQgPSBibG9ja19zdGFydCtpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJCWlmICggYmxvY2tfc3RhcnQgPj0gdG8gKQorCQkgICAgLyogaWYgdGhpcyBidWZmZXIgaXMgYWZ0ZXIgcmVxdWVzdGVkIGRhdGEgdG8gbWFwLCBza2lwIGl0Ki8KKwkJICAgIGJyZWFrOworCQlpZiAoIGJsb2NrX2VuZCA+IHRvICkgeyAvKiBBaGEsIG91ciBwYXJ0aWFsIGJ1ZmZlciAqLworCQkgICAgaWYgKCBidWZmZXJfbWFwcGVkKGJoKSApIHsgLyogSWYgaXQgaXMgbWFwcGVkLCB3ZSBuZWVkIHRvCisJCQkJCQkgIGlzc3VlIFJFQUQgcmVxdWVzdCBmb3IgaXQgdG8KKwkJCQkJCSAgbm90IGxvb3NlIGRhdGEgKi8KKwkJCWxsX3J3X2Jsb2NrKFJFQUQsIDEsICZiaCk7CisJCQkqd2FpdF9iaCsrPWJoOworCQkgICAgfSBlbHNlIHsgLyogTm90IG1hcHBlZCwgemVybyBpdCAqLworCQkJY2hhciAqa2FkZHIgPSBrbWFwX2F0b21pYyhwcmVwYXJlZF9wYWdlc1tudW1fcGFnZXMtMV0sIEtNX1VTRVIwKTsKKwkJCW1lbXNldChrYWRkcit0bywgMCwgYmxvY2tfZW5kLXRvKTsKKwkJCWt1bm1hcF9hdG9taWMoIGthZGRyLCBLTV9VU0VSMCk7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorCisgICAgLyogV2FpdCBmb3IgcmVhZCByZXF1ZXN0cyB3ZSBtYWRlIHRvIGhhcHBlbiwgaWYgbmVjZXNzYXJ5ICovCisgICAgd2hpbGUod2FpdF9iaCA+IHdhaXQpIHsKKwl3YWl0X29uX2J1ZmZlcigqLS13YWl0X2JoKTsKKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZSgqd2FpdF9iaCkpIHsKKwkgICAgcmVzID0gLUVJTzsKKwkgICAgZ290byBmYWlsZWRfcmVhZDsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIGJsb2NrczsKK2ZhaWxlZF9wYWdlX2dyYWJiaW5nOgorICAgIG51bV9wYWdlcyA9IGk7CitmYWlsZWRfcmVhZDoKKyAgICByZWlzZXJmc191bnByZXBhcmVfcGFnZXMocHJlcGFyZWRfcGFnZXMsIG51bV9wYWdlcyk7CisgICAgcmV0dXJuIHJlczsKK30KKworLyogV3JpdGUgQGNvdW50IGJ5dGVzIGF0IHBvc2l0aW9uIEBwcG9zIGluIGEgZmlsZSBpbmRpY2F0ZWQgYnkgQGZpbGUKKyAgIGZyb20gdGhlIGJ1ZmZlciBAYnVmLiAgCisKKyAgIGdlbmVyaWNfZmlsZV93cml0ZSgpIGlzIG9ubHkgYXBwcm9wcmlhdGUgZm9yIGZpbGVzeXN0ZW1zIHRoYXQgYXJlIG5vdCBzZWVraW5nIHRvIG9wdGltaXplIHBlcmZvcm1hbmNlIGFuZCB3YW50CisgICBzb21ldGhpbmcgc2ltcGxlIHRoYXQgd29ya3MuICBJdCBpcyBub3QgZm9yIHNlcmlvdXMgdXNlIGJ5IGdlbmVyYWwgcHVycG9zZSBmaWxlc3lzdGVtcywgZXhjZXB0aW5nIHRoZSBvbmUgdGhhdCBpdCB3YXMKKyAgIHdyaXR0ZW4gZm9yIChleHQyLzMpLiAgVGhpcyBpcyBmb3Igc2V2ZXJhbCByZWFzb25zOgorCisgICAqIEl0IGhhcyBubyB1bmRlcnN0YW5kaW5nIG9mIGFueSBmaWxlc3lzdGVtIHNwZWNpZmljIG9wdGltaXphdGlvbnMuCisKKyAgICogSXQgZW50ZXJzIHRoZSBmaWxlc3lzdGVtIHJlcGVhdGVkbHkgZm9yIGVhY2ggcGFnZSB0aGF0IGlzIHdyaXR0ZW4uCisKKyAgICogSXQgZGVwZW5kcyBvbiByZWlzZXJmc19nZXRfYmxvY2soKSBmdW5jdGlvbiB3aGljaCBpZiBpbXBsZW1lbnRlZCBieSByZWlzZXJmcyBwZXJmb3JtcyBjb3N0bHkgc2VhcmNoX2J5X2tleQorICAgKiBvcGVyYXRpb24gZm9yIGVhY2ggcGFnZSBpdCBpcyBzdXBwbGllZCB3aXRoLiBCeSBjb250cmFzdCByZWlzZXJmc19maWxlX3dyaXRlKCkgZmVlZHMgYXMgbXVjaCBhcyBwb3NzaWJsZSBhdCBhIHRpbWUKKyAgICogdG8gcmVpc2VyZnMgd2hpY2ggYWxsb3dzIGZvciBmZXdlciB0cmVlIHRyYXZlcnNhbHMuCisKKyAgICogRWFjaCBpbmRpcmVjdCBwb2ludGVyIGluc2VydGlvbiB0YWtlcyBhIGxvdCBvZiBjcHUsIGJlY2F1c2UgaXQgaW52b2x2ZXMgbWVtb3J5IG1vdmVzIGluc2lkZSBvZiBibG9ja3MuCisKKyAgICogQXNraW5nIHRoZSBibG9jayBhbGxvY2F0aW9uIGNvZGUgZm9yIGJsb2NrcyBvbmUgYXQgYSB0aW1lIGlzIHNsaWdodGx5IGxlc3MgZWZmaWNpZW50LgorCisgICBBbGwgb2YgdGhlc2UgcmVhc29ucyBmb3Igbm90IHVzaW5nIG9ubHkgZ2VuZXJpYyBmaWxlIHdyaXRlIHdlcmUgdW5kZXJzdG9vZCBiYWNrIHdoZW4gcmVpc2VyZnMgd2FzIGZpcnN0IG1pc2NvZGVkIHRvCisgICB1c2UgaXQsIGJ1dCB3ZSB3ZXJlIGluIGEgaHVycnkgdG8gbWFrZSBjb2RlIGZyZWV6ZSwgYW5kIHNvIGl0IGNvdWxkbid0IGJlIHJldmlzZWQgdGhlbi4gIFRoaXMgbmV3IGNvZGUgc2hvdWxkIG1ha2UKKyAgIHRoaW5ncyByaWdodCBmaW5hbGx5LgorCisgICBGdXR1cmUgRmVhdHVyZXM6IHByb3ZpZGluZyBzZWFyY2hfYnlfa2V5IHdpdGggaGludHMuCisKKyovCitzdGF0aWMgc3NpemVfdCByZWlzZXJmc19maWxlX3dyaXRlKCBzdHJ1Y3QgZmlsZSAqZmlsZSwgLyogdGhlIGZpbGUgd2UgYXJlIGdvaW5nIHRvIHdyaXRlIGludG8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgLyogIHBvaW50ZXIgdG8gdXNlciBzdXBwbGllZCBkYXRhCisoaW4gdXNlcnNwYWNlKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsIC8qIGFtb3VudCBvZiBieXRlcyB0byB3cml0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2ZmX3QgKnBwb3MgLyogcG9pbnRlciB0byBwb3NpdGlvbiBpbiBmaWxlIHRoYXQgd2Ugc3RhcnQgd3JpdGluZyBhdC4gU2hvdWxkIGJlIHVwZGF0ZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG5ldyBjdXJyZW50IHBvc2l0aW9uIGJlZm9yZSByZXR1cm5pbmcuICovICkKK3sKKyAgICBzaXplX3QgYWxyZWFkeV93cml0dGVuID0gMDsgLy8gTnVtYmVyIG9mIGJ5dGVzIGFscmVhZHkgd3JpdHRlbiB0byB0aGUgZmlsZS4KKyAgICBsb2ZmX3QgcG9zOyAvLyBDdXJyZW50IHBvc2l0aW9uIGluIHRoZSBmaWxlLgorICAgIHNzaXplX3QgcmVzOyAvLyByZXR1cm4gdmFsdWUgb2YgdmFyaW91cyBmdW5jdGlvbnMgdGhhdCB3ZSBjYWxsLgorICAgIGludCBlcnIgPSAwOworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsgLy8gSW5vZGUgb2YgdGhlIGZpbGUgdGhhdCB3ZSBhcmUgd3JpdGluZyB0by4KKwkJCQkvKiBUbyBzaW1wbGlmeSBjb2RpbmcgYXQgdGhpcyB0aW1lLCB3ZSBzdG9yZQorCQkJCSAgIGxvY2tlZCBwYWdlcyBpbiBhcnJheSBmb3Igbm93ICovCisgICAgc3RydWN0IHBhZ2UgKiBwcmVwYXJlZF9wYWdlc1tSRUlTRVJGU19XUklURV9QQUdFU19BVF9BX1RJTUVdOworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisgICAgdGgudF90cmFuc19pZCA9IDA7CisKKyAgICBpZiAoIGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkgeyAvLyBEaXJlY3QgSU8gbmVlZHMgdHJlYXRtZW50CisJc3NpemVfdCByZXN1bHQsIGFmdGVyX2ZpbGVfZW5kID0gMDsKKwlpZiAoICgqcHBvcyArIGNvdW50ID49IGlub2RlLT5pX3NpemUpIHx8IChmaWxlLT5mX2ZsYWdzICYgT19BUFBFTkQpICkgeworCSAgICAvKiBJZiB3ZSBhcmUgYXBwZW5kaW5nIGEgZmlsZSwgd2UgbmVlZCB0byBwdXQgdGhpcyBzYXZlbGluayBpbiBoZXJlLgorCSAgICAgICBJZiB3ZSB3aWxsIGNyYXNoIHdoaWxlIGRvaW5nIGRpcmVjdCBpbywgZmluaXNoX3VuZmluaXNoZWQgd2lsbAorCSAgICAgICBjdXQgdGhlIGdhcmJhZ2UgZnJvbSB0aGUgZmlsZSBlbmQuICovCisJICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCSAgICBlcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsICBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCApOworICAgICAgICAgICAgaWYgKGVycikgeworCQlyZWlzZXJmc193cml0ZV91bmxvY2sgKGlub2RlLT5pX3NiKTsKKwkJcmV0dXJuIGVycjsKKwkgICAgfQorCSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworCSAgICBhZGRfc2F2ZV9saW5rICgmdGgsIGlub2RlLCAxIC8qIFRydW5jYXRlICovKTsKKwkgICAgYWZ0ZXJfZmlsZV9lbmQgPSAxOworCSAgICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCApOworICAgICAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkgICAgaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwl9CisJcmVzdWx0ID0gZ2VuZXJpY19maWxlX3dyaXRlKGZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOworCisJaWYgKCBhZnRlcl9maWxlX2VuZCApIHsgLyogTm93IHVwZGF0ZSBpX3NpemUgYW5kIHJlbW92ZSB0aGUgc2F2ZWxpbmsgKi8KKwkgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwkgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJICAgIGVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgMSk7CisgICAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrIChpbm9kZS0+aV9zYik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKwkgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKKwkgICAgcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgaW5vZGUpOworCSAgICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCAxKTsKKyAgICAgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2sgKGlub2RlLT5pX3NiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCSAgICBlcnIgPSByZW1vdmVfc2F2ZV9saW5rIChpbm9kZSwgMS8qIHRydW5jYXRlICovKTsKKwkgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKyAgICAgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGlmICggdW5saWtlbHkoKHNzaXplX3QpIGNvdW50IDwgMCApKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmICh1bmxpa2VseSghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWYsIGNvdW50KSkpCisgICAgICAgIHJldHVybiAtRUZBVUxUOworCisgICAgZG93bigmaW5vZGUtPmlfc2VtKTsgLy8gbG9ja3MgdGhlIGVudGlyZSBmaWxlIGZvciBqdXN0IHVzCisKKyAgICBwb3MgPSAqcHBvczsKKworICAgIC8qIENoZWNrIGlmIHdlIGNhbiB3cml0ZSB0byBzcGVjaWZpZWQgcmVnaW9uIG9mIGZpbGUsIGZpbGUKKyAgICAgICBpcyBub3Qgb3Zlcmx5IGJpZyBhbmQgdGhpcyBraW5kIG9mIHN0dWZmLiBBZGp1c3QgcG9zIGFuZAorICAgICAgIGNvdW50LCBpZiBuZWVkZWQgKi8KKyAgICByZXMgPSBnZW5lcmljX3dyaXRlX2NoZWNrcyhmaWxlLCAmcG9zLCAmY291bnQsIDApOworICAgIGlmIChyZXMpCisJZ290byBvdXQ7CisKKyAgICBpZiAoIGNvdW50ID09IDAgKQorCWdvdG8gb3V0OworCisgICAgcmVzID0gcmVtb3ZlX3N1aWQoZmlsZS0+Zl9kZW50cnkpOworICAgIGlmIChyZXMpCisJZ290byBvdXQ7CisKKyAgICBpbm9kZV91cGRhdGVfdGltZShpbm9kZSwgMSk7IC8qIEJvdGggbXRpbWUgYW5kIGN0aW1lICovCisKKyAgICAvLyBPaywgd2UgYXJlIGRvbmUgd2l0aCBhbGwgdGhlIGNoZWNrcy4KKworICAgIC8vIE5vdyB3ZSBzaG91bGQgc3RhcnQgcmVhbCB3b3JrCisKKyAgICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgcGFzdCB0aGUgZmlsZSdzIHBhY2tlZCB0YWlsIG9yIGlmIHdlIGFyZSBnb2luZworICAgICAgIHRvIG92ZXJ3cml0ZSBwYXJ0IG9mIHRoZSB0YWlsLCB3ZSBuZWVkIHRoYXQgdGFpbCB0byBiZSBjb252ZXJ0ZWQgaW50bworICAgICAgIHVuZm9ybWF0dGVkIG5vZGUgKi8KKyAgICByZXMgPSByZWlzZXJmc19jaGVja19mb3JfdGFpbF9hbmRfY29udmVydCggaW5vZGUsIHBvcywgY291bnQpOworICAgIGlmIChyZXMpCisJZ290byBvdXQ7CisKKyAgICB3aGlsZSAoIGNvdW50ID4gMCkgeworCS8qIFRoaXMgaXMgdGhlIG1haW4gbG9vcCBpbiB3aGljaCB3ZSBydW5uaW5nIHVudGlsIHNvbWUgZXJyb3Igb2NjdXJlcworCSAgIG9yIHVudGlsIHdlIHdyaXRlIGFsbCBvZiB0aGUgZGF0YS4gKi8KKwlzaXplX3QgbnVtX3BhZ2VzOy8qIGFtb3VudCBvZiBwYWdlcyB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgdGhpcyBpdGVyYXRpb24gKi8KKwlzaXplX3Qgd3JpdGVfYnl0ZXM7IC8qIGFtb3VudCBvZiBieXRlcyB0byB3cml0ZSBkdXJpbmcgdGhpcyBpdGVyYXRpb24gKi8KKwlzaXplX3QgYmxvY2tzX3RvX2FsbG9jYXRlOyAvKiBob3cgbXVjaCBibG9ja3Mgd2UgbmVlZCB0byBhbGxvY2F0ZSBmb3IgdGhpcyBpdGVyYXRpb24gKi8KKyAgICAgICAgCisgICAgICAgIC8qICAocG9zICYgKFBBR0VfQ0FDSEVfU0laRS0xKSkgaXMgYW4gaWRpb20gZm9yIG9mZnNldCBpbnRvIGEgcGFnZSBvZiBwb3MqLworCW51bV9wYWdlcyA9ICEhKChwb3MrY291bnQpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSArIC8qIHJvdW5kIHVwIHBhcnRpYWwKKwkJCQkJCQkgIHBhZ2VzICovCisJCSAgICAoKGNvdW50ICsgKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUtMSkpKSA+PiBQQUdFX0NBQ0hFX1NISUZUKTsgCisJCQkJCQkvKiBjb252ZXJ0IHNpemUgdG8gYW1vdW50IG9mCisJCQkJCQkgICBwYWdlcyAqLworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCWlmICggbnVtX3BhZ2VzID4gUkVJU0VSRlNfV1JJVEVfUEFHRVNfQVRfQV9USU1FIAorCQl8fCBudW1fcGFnZXMgPiByZWlzZXJmc19jYW5fZml0X3BhZ2VzKGlub2RlLT5pX3NiKSApIHsKKwkgICAgLyogSWYgd2Ugd2VyZSBhc2tlZCB0byB3cml0ZSBtb3JlIGRhdGEgdGhhbiB3ZSB3YW50IHRvIG9yIGlmIHRoZXJlCisJICAgICAgIGlzIG5vdCB0aGF0IG11Y2ggc3BhY2UsIHRoZW4gd2Ugc2hvcnRlbiBhbW91bnQgb2YgZGF0YSB0byB3cml0ZQorCSAgICAgICBmb3IgdGhpcyBpdGVyYXRpb24uICovCisJICAgIG51bV9wYWdlcyA9IG1pbl90KHNpemVfdCwgUkVJU0VSRlNfV1JJVEVfUEFHRVNfQVRfQV9USU1FLCByZWlzZXJmc19jYW5fZml0X3BhZ2VzKGlub2RlLT5pX3NiKSk7CisJICAgIC8qIEFsc28gd2Ugc2hvdWxkIG5vdCBmb3JnZXQgdG8gc2V0IHNpemUgaW4gYnl0ZXMgYWNjb3JkaW5nbHkgKi8KKwkgICAgd3JpdGVfYnl0ZXMgPSAobnVtX3BhZ2VzIDw8IFBBR0VfQ0FDSEVfU0hJRlQpIC0gCisJCQkgICAgKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUtMSkpOworCQkJCQkgLyogSWYgcG9zaXRpb24gaXMgbm90IG9uIHRoZQorCQkJCQkgICAgc3RhcnQgb2YgdGhlIHBhZ2UsIHdlIG5lZWQKKwkJCQkJICAgIHRvIHN1YnN0cmFjdCB0aGUgb2Zmc2V0CisJCQkJCSAgICB3aXRoaW4gcGFnZSAqLworCX0gZWxzZQorCSAgICB3cml0ZV9ieXRlcyA9IGNvdW50OworCisJLyogcmVzZXJ2ZSB0aGUgYmxvY2tzIHRvIGJlIGFsbG9jYXRlZCBsYXRlciwgc28gdGhhdCBsYXRlciBvbgorCSAgIHdlIHN0aWxsIGhhdmUgdGhlIHNwYWNlIHRvIHdyaXRlIHRoZSBibG9ja3MgdG8gKi8KKwlyZWlzZXJmc19jbGFpbV9ibG9ja3NfdG9fYmVfYWxsb2NhdGVkKGlub2RlLT5pX3NiLCBudW1fcGFnZXMgPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKSk7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKworCWlmICggIW51bV9wYWdlcyApIHsgLyogSWYgd2UgZG8gbm90IGhhdmUgZW5vdWdoIHNwYWNlIGV2ZW4gZm9yICovCisJICAgIHJlcyA9IC1FTk9TUEM7ICAvKiBzaW5nbGUgcGFnZSwgcmV0dXJuIC1FTk9TUEMgKi8KKwkgICAgaWYgKCBwb3MgPiAoaW5vZGUtPmlfc2l6ZSAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUtMSkpKQorCQlicmVhazsgLy8gSW4gY2FzZSB3ZSBhcmUgd3JpdGluZyBwYXN0IHRoZSBmaWxlIGVuZCwgYnJlYWsuCisJICAgIC8vIE90aGVyd2lzZSB3ZSBhcmUgcG9zc2libHkgb3ZlcndyaXRpbmcgdGhlIGZpbGUsIHNvCisJICAgIC8vIGxldCdzIHNldCB3cml0ZSBzaXplIHRvIGJlIGVxdWFsIG9yIGxlc3MgdGhhbiBibG9ja3NpemUuCisJICAgIC8vIFRoaXMgd2F5IHdlIGdldCBpdCBjb3JyZWN0bHkgZm9yIGZpbGUgaG9sZXMuCisJICAgIC8vIEJ1dCBvdmVyd3JpdGluZyBmaWxlcyBvbiBhYnNvbHV0ZWxseSBmdWxsIHZvbHVtZXMgd291bGQgbm90CisJICAgIC8vIGJlIHZlcnkgZWZmaWNpZW50LiBXZWxsLCBwZW9wbGUgYXJlIG5vdCBzdXBwb3NlZCB0byBmaWxsCisJICAgIC8vIDEwMCUgb2YgZGlzayBzcGFjZSBhbnl3YXkuCisJICAgIHdyaXRlX2J5dGVzID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gKHBvcyAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSkpOworCSAgICBudW1fcGFnZXMgPSAxOworCSAgICAvLyBObyBibG9ja3Mgd2VyZSBjbGFpbWVkIGJlZm9yZSwgc28gZG8gaXQgbm93LgorCSAgICByZWlzZXJmc19jbGFpbV9ibG9ja3NfdG9fYmVfYWxsb2NhdGVkKGlub2RlLT5pX3NiLCAxIDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cykpOworCX0KKworCS8qIFByZXBhcmUgZm9yIHdyaXRpbmcgaW50byB0aGUgcmVnaW9uLCByZWFkIGluIGFsbCB0aGUKKwkgICBwYXJ0aWFsbHkgb3ZlcndyaXR0ZW4gcGFnZXMsIGlmIG5lZWRlZC4gQW5kIGxvY2sgdGhlIHBhZ2VzLAorCSAgIHNvIHRoYXQgbm9ib2R5IGVsc2UgY2FuIGFjY2VzcyB0aGVzZSB1bnRpbCB3ZSBhcmUgZG9uZS4KKwkgICBXZSBnZXQgbnVtYmVyIG9mIGFjdHVhbCBibG9ja3MgbmVlZGVkIGFzIGEgcmVzdWx0LiovCisJYmxvY2tzX3RvX2FsbG9jYXRlID0gcmVpc2VyZnNfcHJlcGFyZV9maWxlX3JlZ2lvbl9mb3Jfd3JpdGUoaW5vZGUsIHBvcywgbnVtX3BhZ2VzLCB3cml0ZV9ieXRlcywgcHJlcGFyZWRfcGFnZXMpOworCWlmICggYmxvY2tzX3RvX2FsbG9jYXRlIDwgMCApIHsKKwkgICAgcmVzID0gYmxvY2tzX3RvX2FsbG9jYXRlOworCSAgICByZWlzZXJmc19yZWxlYXNlX2NsYWltZWRfYmxvY2tzKGlub2RlLT5pX3NiLCBudW1fcGFnZXMgPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKSk7CisJICAgIGJyZWFrOworCX0KKworCS8qIEZpcnN0IHdlIGNvcnJlY3Qgb3VyIGVzdGltYXRlIG9mIGhvdyBtYW55IGJsb2NrcyB3ZSBuZWVkICovCisJcmVpc2VyZnNfcmVsZWFzZV9jbGFpbWVkX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgKG51bV9wYWdlcyA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSkgLSBibG9ja3NfdG9fYWxsb2NhdGUgKTsKKworCWlmICggYmxvY2tzX3RvX2FsbG9jYXRlID4gMCkgey8qV2Ugb25seSBhbGxvY2F0ZSBibG9ja3MgaWYgd2UgbmVlZCB0byovCisJICAgIC8qIEZpbGwgaW4gYWxsIHRoZSBwb3NzaWJsZSBob2xlcyBhbmQgYXBwZW5kIHRoZSBmaWxlIGlmIG5lZWRlZCAqLworCSAgICByZXMgPSByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja3NfZm9yX3JlZ2lvbigmdGgsIGlub2RlLCBwb3MsIG51bV9wYWdlcywgd3JpdGVfYnl0ZXMsIHByZXBhcmVkX3BhZ2VzLCBibG9ja3NfdG9fYWxsb2NhdGUpOworCX0KKworCS8qIHdlbGwsIHdlIGhhdmUgYWxsb2NhdGVkIHRoZSBibG9ja3MsIHNvIGl0IGlzIHRpbWUgdG8gZnJlZQorCSAgIHRoZSByZXNlcnZhdGlvbiB3ZSBtYWRlIGVhcmxpZXIuICovCisJcmVpc2VyZnNfcmVsZWFzZV9jbGFpbWVkX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgYmxvY2tzX3RvX2FsbG9jYXRlKTsKKwlpZiAoIHJlcyApIHsKKwkgICAgcmVpc2VyZnNfdW5wcmVwYXJlX3BhZ2VzKHByZXBhcmVkX3BhZ2VzLCBudW1fcGFnZXMpOworCSAgICBicmVhazsKKwl9CisKKy8qIE5PVEUgdGhhdCBhbGxvY2F0aW5nIGJsb2NrcyBhbmQgZmlsbGluZyBibG9ja3MgY2FuIGJlIGRvbmUgaW4gcmV2ZXJzZSBvcmRlcgorICAgYW5kIHByb2JhYmx5IHdlIHdvdWxkIGRvIHRoYXQganVzdCB0byBnZXQgcmlkIG9mIGdhcmJhZ2UgaW4gZmlsZXMgYWZ0ZXIgYQorICAgY3Jhc2ggKi8KKworCS8qIENvcHkgZGF0YSBmcm9tIHVzZXItc3VwcGxpZWQgYnVmZmVyIHRvIGZpbGUncyBwYWdlcyAqLworCXJlcyA9IHJlaXNlcmZzX2NvcHlfZnJvbV91c2VyX3RvX2ZpbGVfcmVnaW9uKHBvcywgbnVtX3BhZ2VzLCB3cml0ZV9ieXRlcywgcHJlcGFyZWRfcGFnZXMsIGJ1Zik7CisJaWYgKCByZXMgKSB7CisJICAgIHJlaXNlcmZzX3VucHJlcGFyZV9wYWdlcyhwcmVwYXJlZF9wYWdlcywgbnVtX3BhZ2VzKTsKKwkgICAgYnJlYWs7CisJfQorCisJLyogU2VuZCB0aGUgcGFnZXMgdG8gZGlzayBhbmQgdW5sb2NrIHRoZW0uICovCisJcmVzID0gcmVpc2VyZnNfc3VibWl0X2ZpbGVfcmVnaW9uX2Zvcl93cml0ZSgmdGgsIGlub2RlLCBwb3MsIG51bV9wYWdlcywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2J5dGVzLHByZXBhcmVkX3BhZ2VzKTsKKwlpZiAoIHJlcyApCisJICAgIGJyZWFrOworCisJYWxyZWFkeV93cml0dGVuICs9IHdyaXRlX2J5dGVzOworCWJ1ZiArPSB3cml0ZV9ieXRlczsKKwkqcHBvcyA9IHBvcyArPSB3cml0ZV9ieXRlczsKKwljb3VudCAtPSB3cml0ZV9ieXRlczsKKwliYWxhbmNlX2RpcnR5X3BhZ2VzX3JhdGVsaW1pdGVkKGlub2RlLT5pX21hcHBpbmcpOworICAgIH0KKworICAgIC8qIHRoaXMgaXMgb25seSB0cnVlIG9uIGVycm9yICovCisgICAgaWYgKHRoLnRfdHJhbnNfaWQpIHsKKyAgICAgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisgICAgICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgdGgudF9zdXBlciwgdGgudF9ibG9ja3NfYWxsb2NhdGVkKTsKKyAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgcmVzID0gZXJyOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX1NZTkMpIHx8IElTX1NZTkMoaW5vZGUpKQorCXJlcyA9IGdlbmVyaWNfb3N5bmNfaW5vZGUoaW5vZGUsIGZpbGUtPmZfbWFwcGluZywgT1NZTkNfTUVUQURBVEF8T1NZTkNfREFUQSk7CisKKyAgICB1cCgmaW5vZGUtPmlfc2VtKTsKKyAgICByZWlzZXJmc19hc3luY19wcm9ncmVzc193YWl0KGlub2RlLT5pX3NiKTsKKyAgICByZXR1cm4gKGFscmVhZHlfd3JpdHRlbiAhPSAwKT9hbHJlYWR5X3dyaXR0ZW46cmVzOworCitvdXQ6CisgICAgdXAoJmlub2RlLT5pX3NlbSk7IC8vIHVubG9jayB0aGUgZmlsZSBvbiBleGl0LgorICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlaXNlcmZzX2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKQoreworICAgIHJldHVybiBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlKGlvY2IsIGJ1ZiwgY291bnQsIHBvcyk7Cit9CisKKworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlaXNlcmZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKyAgICAucmVhZAk9IGdlbmVyaWNfZmlsZV9yZWFkLAorICAgIC53cml0ZQk9IHJlaXNlcmZzX2ZpbGVfd3JpdGUsCisgICAgLmlvY3RsCT0gcmVpc2VyZnNfaW9jdGwsCisgICAgLm1tYXAJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKyAgICAucmVsZWFzZQk9IHJlaXNlcmZzX2ZpbGVfcmVsZWFzZSwKKyAgICAuZnN5bmMJPSByZWlzZXJmc19zeW5jX2ZpbGUsCisgICAgLnNlbmRmaWxlCT0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorICAgIC5haW9fcmVhZCAgID0gZ2VuZXJpY19maWxlX2Fpb19yZWFkLAorICAgIC5haW9fd3JpdGUgID0gcmVpc2VyZnNfYWlvX3dyaXRlLAorfTsKKworCitzdHJ1Y3QgIGlub2RlX29wZXJhdGlvbnMgcmVpc2VyZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0geworICAgIC50cnVuY2F0ZQk9IHJlaXNlcmZzX3Zmc190cnVuY2F0ZV9maWxlLAorICAgIC5zZXRhdHRyICAgID0gcmVpc2VyZnNfc2V0YXR0ciwKKyAgICAuc2V0eGF0dHIgICA9IHJlaXNlcmZzX3NldHhhdHRyLAorICAgIC5nZXR4YXR0ciAgID0gcmVpc2VyZnNfZ2V0eGF0dHIsCisgICAgLmxpc3R4YXR0ciAgPSByZWlzZXJmc19saXN0eGF0dHIsCisgICAgLnJlbW92ZXhhdHRyID0gcmVpc2VyZnNfcmVtb3ZleGF0dHIsCisgICAgLnBlcm1pc3Npb24gPSByZWlzZXJmc19wZXJtaXNzaW9uLAorfTsKKworCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9maXhfbm9kZS5jIGIvZnMvcmVpc2VyZnMvZml4X25vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGY2NGJlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcmVpc2VyZnMvZml4X25vZGUuYwpAQCAtMCwwICsxLDI1MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMCBieSBIYW5zIFJlaXNlciwgbGljZW5zaW5nIGdvdmVybmVkIGJ5IHJlaXNlcmZzL1JFQURNRQorICovCisKKy8qKgorICoqIG9sZF9pdGVtX251bQorICoqIG9sZF9lbnRyeV9udW0KKyAqKiBzZXRfZW50cnlfc2l6ZXMKKyAqKiBjcmVhdGVfdmlydHVhbF9ub2RlCisgKiogY2hlY2tfbGVmdAorICoqIGNoZWNrX3JpZ2h0CisgKiogZGlyZWN0b3J5X3BhcnRfc2l6ZQorICoqIGdldF9udW1fdmVyCisgKiogc2V0X3BhcmFtZXRlcnMKKyAqKiBpc19sZWFmX3JlbW92YWJsZQorICoqIGFyZV9sZWF2ZXNfcmVtb3ZhYmxlCisgKiogZ2V0X2VtcHR5X25vZGVzCisgKiogZ2V0X2xmcmVlCisgKiogZ2V0X3JmcmVlCisgKiogaXNfbGVmdF9uZWlnaGJvcl9pbl9jYWNoZQorICoqIGRlY3JlbWVudF9rZXkKKyAqKiBnZXRfZmFyX3BhcmVudAorICoqIGdldF9wYXJlbnRzCisgKiogY2FuX25vZGVfYmVfcmVtb3ZlZAorICoqIGlwX2NoZWNrX2JhbGFuY2UKKyAqKiBkY19jaGVja19iYWxhbmNlX2ludGVybmFsCisgKiogZGNfY2hlY2tfYmFsYW5jZV9sZWFmCisgKiogZGNfY2hlY2tfYmFsYW5jZQorICoqIGNoZWNrX2JhbGFuY2UKKyAqKiBnZXRfZGlyZWN0X3BhcmVudAorICoqIGdldF9uZWlnaGJvcnMKKyAqKiBmaXhfbm9kZXMKKyAqKiAKKyAqKiAKKyAqKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworCisvKiBUbyBtYWtlIGFueSBjaGFuZ2VzIGluIHRoZSB0cmVlIHdlIGZpbmQgYSBub2RlLCB0aGF0IGNvbnRhaW5zIGl0ZW0KKyAgIHRvIGJlIGNoYW5nZWQvZGVsZXRlZCBvciBwb3NpdGlvbiBpbiB0aGUgbm9kZSB3ZSBpbnNlcnQgYSBuZXcgaXRlbQorICAgdG8uIFdlIGNhbGwgdGhpcyBub2RlIFMuIFRvIGRvIGJhbGFuY2luZyB3ZSBuZWVkIHRvIGRlY2lkZSB3aGF0IHdlCisgICB3aWxsIHNoaWZ0IHRvIGxlZnQvcmlnaHQgbmVpZ2hib3IsIG9yIHRvIGEgbmV3IG5vZGUsIHdoZXJlIG5ldyBpdGVtCisgICB3aWxsIGJlIGV0Yy4gVG8gbWFrZSB0aGlzIGFuYWx5c2lzIHNpbXBsZXIgd2UgYnVpbGQgdmlydHVhbAorICAgbm9kZS4gVmlydHVhbCBub2RlIGlzIGFuIGFycmF5IG9mIGl0ZW1zLCB0aGF0IHdpbGwgcmVwbGFjZSBpdGVtcyBvZgorICAgbm9kZSBTLiAoRm9yIGluc3RhbmNlIGlmIHdlIGFyZSBnb2luZyB0byBkZWxldGUgYW4gaXRlbSwgdmlydHVhbAorICAgbm9kZSBkb2VzIG5vdCBjb250YWluIGl0KS4gVmlydHVhbCBub2RlIGtlZXBzIGluZm9ybWF0aW9uIGFib3V0CisgICBpdGVtIHNpemVzIGFuZCB0eXBlcywgbWVyZ2VhYmlsaXR5IG9mIGZpcnN0IGFuZCBsYXN0IGl0ZW1zLCBzaXplcworICAgb2YgYWxsIGVudHJpZXMgaW4gZGlyZWN0b3J5IGl0ZW0uIFdlIHVzZSB0aGlzIGFycmF5IG9mIGl0ZW1zIHdoZW4KKyAgIGNhbGN1bGF0aW5nIHdoYXQgd2UgY2FuIHNoaWZ0IHRvIG5laWdoYm9ycyBhbmQgaG93IG1hbnkgbm9kZXMgd2UKKyAgIGhhdmUgdG8gaGF2ZSBpZiB3ZSBkbyBub3QgYW55IHNoaWZ0aW5ncywgaWYgd2Ugc2hpZnQgdG8gbGVmdC9yaWdodAorICAgbmVpZ2hib3Igb3IgdG8gYm90aC4gKi8KKworCisvKiB0YWtpbmcgaXRlbSBudW1iZXIgaW4gdmlydHVhbCBub2RlLCByZXR1cm5zIG51bWJlciBvZiBpdGVtLCB0aGF0IGl0IGhhcyBpbiBzb3VyY2UgYnVmZmVyICovCitzdGF0aWMgaW5saW5lIGludCBvbGRfaXRlbV9udW0gKGludCBuZXdfbnVtLCBpbnQgYWZmZWN0ZWRfaXRlbV9udW0sIGludCBtb2RlKQoreworICBpZiAobW9kZSA9PSBNX1BBU1RFIHx8IG1vZGUgPT0gTV9DVVQgfHwgbmV3X251bSA8IGFmZmVjdGVkX2l0ZW1fbnVtKQorICAgIHJldHVybiBuZXdfbnVtOworCisgIGlmIChtb2RlID09IE1fSU5TRVJUKSB7CisKKyAgICBSRkFMU0UoIG5ld19udW0gPT0gMCwgCisJICAgICJ2cy04MDA1OiBmb3IgSU5TRVJUIG1vZGUgYW5kIGl0ZW0gbnVtYmVyIG9mIGluc2VydGVkIGl0ZW0iKTsKKworICAgIHJldHVybiBuZXdfbnVtIC0gMTsKKyAgfQorCisgIFJGQUxTRSggbW9kZSAhPSBNX0RFTEVURSwKKwkgICJ2cy04MDEwOiBvbGRfaXRlbV9udW06IG1vZGUgbXVzdCBiZSBNX0RFTEVURSAobW9kZSA9IFwnJWNcJyIsIG1vZGUpOworICAvKiBkZWxldGUgbW9kZSAqLworICByZXR1cm4gbmV3X251bSArIDE7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV92aXJ0dWFsX25vZGUgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCit7CisgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOworICAgIHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biA9IHRiLT50Yl92bjsKKyAgICBpbnQgbmV3X251bTsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBTaDsJLyogdGhpcyBjb21lcyBmcm9tIHRiLT5TW2hdICovCisKKyAgICBTaCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCk7CisKKyAgICAvKiBzaXplIG9mIGNoYW5nZWQgbm9kZSAqLworICAgIHZuLT52bl9zaXplID0gTUFYX0NISUxEX1NJWkUgKFNoKSAtIEJfRlJFRV9TUEFDRSAoU2gpICsgdGItPmluc2VydF9zaXplW2hdOworCisgICAgLyogZm9yIGludGVybmFsIG5vZGVzIGFycmF5IGlmIHZpcnR1YWwgaXRlbXMgaXMgbm90IGNyZWF0ZWQgKi8KKyAgICBpZiAoaCkgeworCXZuLT52bl9ucl9pdGVtID0gKHZuLT52bl9zaXplIC0gRENfU0laRSkgLyAoRENfU0laRSArIEtFWV9TSVpFKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogbnVtYmVyIG9mIGl0ZW1zIGluIHZpcnR1YWwgbm9kZSAgKi8KKyAgICB2bi0+dm5fbnJfaXRlbSA9IEJfTlJfSVRFTVMgKFNoKSArICgodm4tPnZuX21vZGUgPT0gTV9JTlNFUlQpPyAxIDogMCkgLSAoKHZuLT52bl9tb2RlID09IE1fREVMRVRFKT8gMSA6IDApOworCisgICAgLyogZmlyc3QgdmlydHVhbCBpdGVtICovCisgICAgdm4tPnZuX3ZpID0gKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKikodGItPnRiX3ZuICsgMSk7CisgICAgbWVtc2V0ICh2bi0+dm5fdmksIDAsIHZuLT52bl9ucl9pdGVtICogc2l6ZW9mIChzdHJ1Y3QgdmlydHVhbF9pdGVtKSk7CisgICAgdm4tPnZuX2ZyZWVfcHRyICs9IHZuLT52bl9ucl9pdGVtICogc2l6ZW9mIChzdHJ1Y3QgdmlydHVhbF9pdGVtKTsKKworCisgICAgLyogZmlyc3QgaXRlbSBpbiB0aGUgbm9kZSAqLworICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKFNoLCAwKTsKKworICAgIC8qIGRlZmluZSB0aGUgbWVyZ2VhYmlsaXR5IGZvciAwLXRoIGl0ZW0gKGlmIGl0IGlzIG5vdCBiZWluZyBkZWxldGVkKSAqLworICAgIGlmIChvcF9pc19sZWZ0X21lcmdlYWJsZSAoJihpaC0+aWhfa2V5KSwgU2gtPmJfc2l6ZSkgJiYgKHZuLT52bl9tb2RlICE9IE1fREVMRVRFIHx8IHZuLT52bl9hZmZlY3RlZF9pdGVtX251bSkpCisJICAgIHZuLT52bl92aVswXS52aV90eXBlIHw9IFZJX1RZUEVfTEVGVF9NRVJHRUFCTEU7CisKKyAgICAvKiBnbyB0aHJvdWdoIGFsbCBpdGVtcyB0aG9zZSByZW1haW4gaW4gdGhlIHZpcnR1YWwgbm9kZSAoZXhjZXB0IGZvciB0aGUgbmV3IChpbnNlcnRlZCkgb25lKSAqLworICAgIGZvciAobmV3X251bSA9IDA7IG5ld19udW0gPCB2bi0+dm5fbnJfaXRlbTsgbmV3X251bSArKykgeworCWludCBqOworCXN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSA9IHZuLT52bl92aSArIG5ld19udW07CisJaW50IGlzX2FmZmVjdGVkID0gKChuZXdfbnVtICE9IHZuLT52bl9hZmZlY3RlZF9pdGVtX251bSkgPyAwIDogMSk7CisgICAgCisKKwlpZiAoaXNfYWZmZWN0ZWQgJiYgdm4tPnZuX21vZGUgPT0gTV9JTlNFUlQpCisJICAgIGNvbnRpbnVlOworICAgIAorCS8qIGdldCBpdGVtIG51bWJlciBpbiBzb3VyY2Ugbm9kZSAqLworCWogPSBvbGRfaXRlbV9udW0gKG5ld19udW0sIHZuLT52bl9hZmZlY3RlZF9pdGVtX251bSwgdm4tPnZuX21vZGUpOworICAgIAorCXZpLT52aV9pdGVtX2xlbiArPSBpaF9pdGVtX2xlbihpaCArIGopICsgSUhfU0laRTsKKwl2aS0+dmlfaWggPSBpaCArIGo7CisJdmktPnZpX2l0ZW0gPSBCX0lfUElURU0gKFNoLCBpaCArIGopOworCXZpLT52aV91YXJlYSA9IHZuLT52bl9mcmVlX3B0cjsKKworCS8vIEZJWE1FOiB0aGVyZSBpcyBubyBjaGVjaywgdGhhdCBpdGVtIG9wZXJhdGlvbiBkaWQgbm90CisJLy8gY29uc3VtZSB0b28gbXVjaCBtZW1vcnkKKwl2bi0+dm5fZnJlZV9wdHIgKz0gb3BfY3JlYXRlX3ZpICh2biwgdmksIGlzX2FmZmVjdGVkLCB0Yi0+aW5zZXJ0X3NpemUgWzBdKTsKKwlpZiAodGItPnZuX2J1ZiArIHRiLT52bl9idWZfc2l6ZSA8IHZuLT52bl9mcmVlX3B0cikKKwkgICAgcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgInZzLTgwMzA6IGNyZWF0ZV92aXJ0dWFsX25vZGU6ICIKKwkJCSAgICAidmlydHVhbCBub2RlIHNwYWNlIGNvbnN1bWVkIik7CisKKwlpZiAoIWlzX2FmZmVjdGVkKQorCSAgICAvKiB0aGlzIGlzIG5vdCBiZWluZyBjaGFuZ2VkICovCisJICAgIGNvbnRpbnVlOworICAgIAorCWlmICh2bi0+dm5fbW9kZSA9PSBNX1BBU1RFIHx8IHZuLT52bl9tb2RlID09IE1fQ1VUKSB7CisJICAgIHZuLT52bl92aVtuZXdfbnVtXS52aV9pdGVtX2xlbiArPSB0Yi0+aW5zZXJ0X3NpemVbMF07CisJICAgIHZpLT52aV9uZXdfZGF0YSA9IHZuLT52bl9kYXRhOyAvLyBwb2ludGVyIHRvIGRhdGEgd2hpY2ggaXMgZ29pbmcgdG8gYmUgcGFzdGVkCisJfQorICAgIH0KKworICAKKyAgICAvKiB2aXJ0dWFsIGluc2VydGVkIGl0ZW0gaXMgbm90IGRlZmluZWQgeWV0ICovCisgICAgaWYgKHZuLT52bl9tb2RlID09IE1fSU5TRVJUKSB7CisJc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpID0gdm4tPnZuX3ZpICsgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtOworICAgICAgCisJUkZBTFNFKCB2bi0+dm5faW5zX2loID09IDAsCisJCSJ2cy04MDQwOiBpdGVtIGhlYWRlciBvZiBpbnNlcnRlZCBpdGVtIGlzIG5vdCBzcGVjaWZpZWQiKTsKKwl2aS0+dmlfaXRlbV9sZW4gPSB0Yi0+aW5zZXJ0X3NpemVbMF07CisJdmktPnZpX2loID0gdm4tPnZuX2luc19paDsKKwl2aS0+dmlfaXRlbSA9IHZuLT52bl9kYXRhOworCXZpLT52aV91YXJlYSA9IHZuLT52bl9mcmVlX3B0cjsKKwkKKwlvcF9jcmVhdGVfdmkgKHZuLCB2aSwgMC8qbm90IHBhc3RlZCBvciBjdXQqLywgdGItPmluc2VydF9zaXplIFswXSk7CisgICAgfQorICAKKyAgICAvKiBzZXQgcmlnaHQgbWVyZ2UgZmxhZyB3ZSB0YWtlIHJpZ2h0IGRlbGltaXRpbmcga2V5IGFuZCBjaGVjayB3aGV0aGVyIGl0IGlzIGEgbWVyZ2VhYmxlIGl0ZW0gKi8KKyAgICBpZiAodGItPkNGUlswXSkgeworCXN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXk7CisKKwlrZXkgPSBCX05fUERFTElNX0tFWSAodGItPkNGUlswXSwgdGItPnJrZXlbMF0pOworCWlmIChvcF9pc19sZWZ0X21lcmdlYWJsZSAoa2V5LCBTaC0+Yl9zaXplKSAmJiAodm4tPnZuX21vZGUgIT0gTV9ERUxFVEUgfHwKKwkJCQkJCSAgICAgICB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0gIT0gQl9OUl9JVEVNUyAoU2gpIC0gMSkpCisJCXZuLT52bl92aVt2bi0+dm5fbnJfaXRlbS0xXS52aV90eXBlIHw9IFZJX1RZUEVfUklHSFRfTUVSR0VBQkxFOworCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJaWYgKG9wX2lzX2xlZnRfbWVyZ2VhYmxlIChrZXksIFNoLT5iX3NpemUpICYmCisJICAgICEodm4tPnZuX21vZGUgIT0gTV9ERUxFVEUgfHwgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtICE9IEJfTlJfSVRFTVMgKFNoKSAtIDEpICkgeworCSAgICAvKiB3ZSBkZWxldGUgbGFzdCBpdGVtIGFuZCBpdCBjb3VsZCBiZSBtZXJnZWQgd2l0aCByaWdodCBuZWlnaGJvcidzIGZpcnN0IGl0ZW0gKi8KKwkgICAgaWYgKCEoQl9OUl9JVEVNUyAoU2gpID09IDEgJiYgaXNfZGlyZW50cnlfbGVfaWggKEJfTl9QSVRFTV9IRUFEIChTaCwgMCkpICYmCisJCSAgSV9FTlRSWV9DT1VOVCAoQl9OX1BJVEVNX0hFQUQgKFNoLCAwKSkgPT0gMSkpIHsKKwkJLyogbm9kZSBjb250YWlucyBtb3JlIHRoYW4gMSBpdGVtLCBvciBpdGVtIGlzIG5vdCBkaXJlY3RvcnkgaXRlbSwgb3IgdGhpcyBpdGVtIGNvbnRhaW5zIG1vcmUgdGhhbiAxIGVudHJ5ICovCisJCXByaW50X2Jsb2NrIChTaCwgMCwgLTEsIC0xKTsKKwkJcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgInZzLTgwNDU6IGNyZWF0ZV92aXJ0dWFsX25vZGU6IHJka2V5ICVrLCBhZmZlY3RlZCBpdGVtPT0lZCAobW9kZT09JWMpIE11c3QgYmUgJWMiLCAKKwkJCQlrZXksIHZuLT52bl9hZmZlY3RlZF9pdGVtX251bSwgdm4tPnZuX21vZGUsIE1fREVMRVRFKTsKKwkgICAgfSBlbHNlCisJCS8qIHdlIGNhbiBkZWxldGUgZGlyZWN0b3J5IGl0ZW0sIHRoYXQgaGFzIG9ubHkgb25lIGRpcmVjdG9yeSBlbnRyeSBpbiBpdCAqLworCQk7CisJfQorI2VuZGlmCisgICAgCisgICAgfQorfQorCisKKy8qIHVzaW5nIHZpcnR1YWwgbm9kZSBjaGVjaywgaG93IG1hbnkgaXRlbXMgY2FuIGJlIHNoaWZ0ZWQgdG8gbGVmdAorICAgbmVpZ2hib3IgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX2xlZnQgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgsIGludCBjdXJfZnJlZSkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4gPSB0Yi0+dGJfdm47CisgICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpOworICAgIGludCBkX3NpemUsIGloX3NpemU7CisKKyAgICBSRkFMU0UoIGN1cl9mcmVlIDwgMCwgInZzLTgwNTA6IGN1cl9mcmVlICglZCkgPCAwIiwgY3VyX2ZyZWUpOworCisgICAgLyogaW50ZXJuYWwgbGV2ZWwgKi8KKyAgICBpZiAoaCA+IDApIHsJCisJdGItPmxudW1baF0gPSBjdXJfZnJlZSAvIChEQ19TSVpFICsgS0VZX1NJWkUpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBsZWFmIGxldmVsICovCisKKyAgICBpZiAoIWN1cl9mcmVlIHx8ICF2bi0+dm5fbnJfaXRlbSkgeworCS8qIG5vIGZyZWUgc3BhY2Ugb3Igbm90aGluZyB0byBtb3ZlICovCisJdGItPmxudW1baF0gPSAwOworCXRiLT5sYnl0ZXMgPSAtMTsKKwlyZXR1cm47CisgICAgfQorCisgICAgUkZBTFNFKCAhUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKSwKKwkgICAgInZzLTgwNTU6IHBhcmVudCBkb2VzIG5vdCBleGlzdCBvciBpbnZhbGlkIik7CisKKyAgICB2aSA9IHZuLT52bl92aTsKKyAgICBpZiAoKHVuc2lnbmVkIGludCljdXJfZnJlZSA+PSAodm4tPnZuX3NpemUgLSAoKHZpLT52aV90eXBlICYgVklfVFlQRV9MRUZUX01FUkdFQUJMRSkgPyBJSF9TSVpFIDogMCkpKSB7CisJLyogYWxsIGNvbnRlbnRzIG9mIFNbMF0gZml0cyBpbnRvIExbMF0gKi8KKworCVJGQUxTRSggdm4tPnZuX21vZGUgPT0gTV9JTlNFUlQgfHwgdm4tPnZuX21vZGUgPT0gTV9QQVNURSwKKwkJInZzLTgwNTU6IGludmFsaWQgbW9kZSBvciBiYWxhbmNlIGNvbmRpdGlvbiBmYWlsZWQiKTsKKworCXRiLT5sbnVtWzBdID0gdm4tPnZuX25yX2l0ZW07CisJdGItPmxieXRlcyA9IC0xOworCXJldHVybjsKKyAgICB9CisgIAorCisgICAgZF9zaXplID0gMCwgaWhfc2l6ZSA9IElIX1NJWkU7CisKKyAgICAvKiBmaXJzdCBpdGVtIG1heSBiZSBtZXJnZSB3aXRoIGxhc3QgaXRlbSBpbiBsZWZ0IG5laWdoYm9yICovCisgICAgaWYgKHZpLT52aV90eXBlICYgVklfVFlQRV9MRUZUX01FUkdFQUJMRSkKKwlkX3NpemUgPSAtKChpbnQpSUhfU0laRSksIGloX3NpemUgPSAwOworCisgICAgdGItPmxudW1bMF0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCB2bi0+dm5fbnJfaXRlbTsgaSArKywgaWhfc2l6ZSA9IElIX1NJWkUsIGRfc2l6ZSA9IDAsIHZpICsrKSB7CisJZF9zaXplICs9IHZpLT52aV9pdGVtX2xlbjsKKwlpZiAoY3VyX2ZyZWUgPj0gZF9zaXplKSB7CQorCSAgICAvKiB0aGUgaXRlbSBjYW4gYmUgc2hpZnRlZCBlbnRpcmVseSAqLworCSAgICBjdXJfZnJlZSAtPSBkX3NpemU7CisJICAgIHRiLT5sbnVtWzBdICsrOworCSAgICBjb250aW51ZTsKKwl9CisgICAgICAKKwkvKiB0aGUgaXRlbSBjYW5ub3QgYmUgc2hpZnRlZCBlbnRpcmVseSwgdHJ5IHRvIHNwbGl0IGl0ICovCisJLyogY2hlY2sgd2hldGhlciBMWzBdIGNhbiBob2xkIGloIGFuZCBhdCBsZWFzdCBvbmUgYnl0ZSBvZiB0aGUgaXRlbSBib2R5ICovCisJaWYgKGN1cl9mcmVlIDw9IGloX3NpemUpIHsKKwkgICAgLyogY2Fubm90IHNoaWZ0IGV2ZW4gYSBwYXJ0IG9mIHRoZSBjdXJyZW50IGl0ZW0gKi8KKwkgICAgdGItPmxieXRlcyA9IC0xOworCSAgICByZXR1cm47CisJfQorCWN1cl9mcmVlIC09IGloX3NpemU7CisgICAgCisJdGItPmxieXRlcyA9IG9wX2NoZWNrX2xlZnQgKHZpLCBjdXJfZnJlZSwgMCwgMCk7CisJaWYgKHRiLT5sYnl0ZXMgIT0gLTEpCisJICAgIC8qIGNvdW50IHBhcnRpYWxseSBzaGlmdGVkIGl0ZW0gKi8KKwkgICAgdGItPmxudW1bMF0gKys7CisgICAgCisJYnJlYWs7CisgICAgfQorICAKKyAgICByZXR1cm47Cit9CisKKworLyogdXNpbmcgdmlydHVhbCBub2RlIGNoZWNrLCBob3cgbWFueSBpdGVtcyBjYW4gYmUgc2hpZnRlZCB0byByaWdodAorICAgbmVpZ2hib3IgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX3JpZ2h0IChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBoLCBpbnQgY3VyX2ZyZWUpCit7CisgICAgaW50IGk7CisgICAgc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuID0gdGItPnRiX3ZuOworICAgIHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aTsKKyAgICBpbnQgZF9zaXplLCBpaF9zaXplOworCisgICAgUkZBTFNFKCBjdXJfZnJlZSA8IDAsICJ2cy04MDcwOiBjdXJfZnJlZSA8IDAiKTsKKyAgICAKKyAgICAvKiBpbnRlcm5hbCBsZXZlbCAqLworICAgIGlmIChoID4gMCkgeworCXRiLT5ybnVtW2hdID0gY3VyX2ZyZWUgLyAoRENfU0laRSArIEtFWV9TSVpFKTsKKwlyZXR1cm47CisgICAgfQorICAgIAorICAgIC8qIGxlYWYgbGV2ZWwgKi8KKyAgICAKKyAgICBpZiAoIWN1cl9mcmVlIHx8ICF2bi0+dm5fbnJfaXRlbSkgeworCS8qIG5vIGZyZWUgc3BhY2UgICovCisJdGItPnJudW1baF0gPSAwOworCXRiLT5yYnl0ZXMgPSAtMTsKKwlyZXR1cm47CisgICAgfQorICAKKyAgICBSRkFMU0UoICFQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApLAorCSAgICAidnMtODA3NTogcGFyZW50IGRvZXMgbm90IGV4aXN0IG9yIGludmFsaWQiKTsKKyAgCisgICAgdmkgPSB2bi0+dm5fdmkgKyB2bi0+dm5fbnJfaXRlbSAtIDE7CisgICAgaWYgKCh1bnNpZ25lZCBpbnQpY3VyX2ZyZWUgPj0gKHZuLT52bl9zaXplIC0gKCh2aS0+dmlfdHlwZSAmIFZJX1RZUEVfUklHSFRfTUVSR0VBQkxFKSA/IElIX1NJWkUgOiAwKSkpIHsKKwkvKiBhbGwgY29udGVudHMgb2YgU1swXSBmaXRzIGludG8gUlswXSAqLworCQorCVJGQUxTRSggdm4tPnZuX21vZGUgPT0gTV9JTlNFUlQgfHwgdm4tPnZuX21vZGUgPT0gTV9QQVNURSwKKwkJInZzLTgwODA6IGludmFsaWQgbW9kZSBvciBiYWxhbmNlIGNvbmRpdGlvbiBmYWlsZWQiKTsKKworCXRiLT5ybnVtW2hdID0gdm4tPnZuX25yX2l0ZW07CisJdGItPnJieXRlcyA9IC0xOworCXJldHVybjsKKyAgICB9CisgICAgCisgICAgZF9zaXplID0gMCwgaWhfc2l6ZSA9IElIX1NJWkU7CisgICAgCisgICAgLyogbGFzdCBpdGVtIG1heSBiZSBtZXJnZSB3aXRoIGZpcnN0IGl0ZW0gaW4gcmlnaHQgbmVpZ2hib3IgKi8KKyAgICBpZiAodmktPnZpX3R5cGUgJiBWSV9UWVBFX1JJR0hUX01FUkdFQUJMRSkKKwlkX3NpemUgPSAtKGludClJSF9TSVpFLCBpaF9zaXplID0gMDsKKworICAgIHRiLT5ybnVtWzBdID0gMDsKKyAgICBmb3IgKGkgPSB2bi0+dm5fbnJfaXRlbSAtIDE7IGkgPj0gMDsgaSAtLSwgZF9zaXplID0gMCwgaWhfc2l6ZSA9IElIX1NJWkUsIHZpIC0tKSB7CisJZF9zaXplICs9IHZpLT52aV9pdGVtX2xlbjsKKwlpZiAoY3VyX2ZyZWUgPj0gZF9zaXplKSB7CQorCSAgICAvKiB0aGUgaXRlbSBjYW4gYmUgc2hpZnRlZCBlbnRpcmVseSAqLworCSAgICBjdXJfZnJlZSAtPSBkX3NpemU7CisJICAgIHRiLT5ybnVtWzBdICsrOworCSAgICBjb250aW51ZTsKKwl9CisJCisJLyogY2hlY2sgd2hldGhlciBSWzBdIGNhbiBob2xkIGloIGFuZCBhdCBsZWFzdCBvbmUgYnl0ZSBvZiB0aGUgaXRlbSBib2R5ICovCisJaWYgKCBjdXJfZnJlZSA8PSBpaF9zaXplICkgeyAgICAvKiBjYW5ub3Qgc2hpZnQgZXZlbiBhIHBhcnQgb2YgdGhlIGN1cnJlbnQgaXRlbSAqLworCSAgICB0Yi0+cmJ5dGVzID0gLTE7CisJICAgIHJldHVybjsKKwl9CisJCisJLyogUlswXSBjYW4gaG9sZCB0aGUgaGVhZGVyIG9mIHRoZSBpdGVtIGFuZCBhdCBsZWFzdCBvbmUgYnl0ZSBvZiBpdHMgYm9keSAqLworCWN1cl9mcmVlIC09IGloX3NpemU7CS8qIGN1cl9mcmVlIGlzIHN0aWxsID4gMCAqLworCisJdGItPnJieXRlcyA9IG9wX2NoZWNrX3JpZ2h0ICh2aSwgY3VyX2ZyZWUpOworCWlmICh0Yi0+cmJ5dGVzICE9IC0xKQorCSAgICAvKiBjb3VudCBwYXJ0aWFsbHkgc2hpZnRlZCBpdGVtICovCisJICAgIHRiLT5ybnVtWzBdICsrOworICAgIAorCWJyZWFrOworICAgIH0KKwkKKyAgcmV0dXJuOworfQorCisKKy8qCisgKiBmcm9tIC0gbnVtYmVyIG9mIGl0ZW1zLCB3aGljaCBhcmUgc2hpZnRlZCB0byBsZWZ0IG5laWdoYm9yIGVudGlyZWx5CisgKiB0byAtIG51bWJlciBvZiBpdGVtLCB3aGljaCBhcmUgc2hpZnRlZCB0byByaWdodCBuZWlnaGJvciBlbnRpcmVseQorICogZnJvbV9ieXRlcyAtIG51bWJlciBvZiBieXRlcyBvZiBib3VuZGFyeSBpdGVtIChvciBkaXJlY3RvcnkgZW50cmllcykgd2hpY2ggYXJlIHNoaWZ0ZWQgdG8gbGVmdCBuZWlnaGJvcgorICogdG9fYnl0ZXMgLSBudW1iZXIgb2YgYnl0ZXMgb2YgYm91bmRhcnkgaXRlbSAob3IgZGlyZWN0b3J5IGVudHJpZXMpIHdoaWNoIGFyZSBzaGlmdGVkIHRvIHJpZ2h0IG5laWdoYm9yICovCitzdGF0aWMgaW50IGdldF9udW1fdmVyIChpbnQgbW9kZSwgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCwKKwkJCWludCBmcm9tLCBpbnQgZnJvbV9ieXRlcywKKwkJCWludCB0bywgICBpbnQgdG9fYnl0ZXMsCisJCQlzaG9ydCAqIHNudW0wMTIsIGludCBmbG93CisgICAgKQoreworICAgIGludCBpOworICAgIGludCBjdXJfZnJlZTsKKyAgICAvLyAgICBpbnQgYnl0ZXM7CisgICAgaW50IHVuaXRzOworICAgIHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biA9IHRiLT50Yl92bjsKKyAgICAvLyAgICBzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmk7CisKKyAgICBpbnQgdG90YWxfbm9kZV9zaXplLCBtYXhfbm9kZV9zaXplLCBjdXJyZW50X2l0ZW1fc2l6ZTsKKyAgICBpbnQgbmVlZGVkX25vZGVzOworICAgIGludCBzdGFydF9pdGVtLCAJLyogcG9zaXRpb24gb2YgaXRlbSB3ZSBzdGFydCBmaWxsaW5nIG5vZGUgZnJvbSAqLworCWVuZF9pdGVtLAkvKiBwb3NpdGlvbiBvZiBpdGVtIHdlIGZpbmlzaCBmaWxsaW5nIG5vZGUgYnkgKi8KKwlzdGFydF9ieXRlcywvKiBudW1iZXIgb2YgZmlyc3QgYnl0ZXMgKGVudHJpZXMgZm9yIGRpcmVjdG9yeSkgb2Ygc3RhcnRfaXRlbS10aCBpdGVtIAorCQkgICAgICAgd2UgZG8gbm90IGluY2x1ZGUgaW50byBub2RlIHRoYXQgaXMgYmVpbmcgZmlsbGVkICovCisJZW5kX2J5dGVzOwkvKiBudW1iZXIgb2YgbGFzdCBieXRlcyAoZW50cmllcyBmb3IgZGlyZWN0b3J5KSBvZiBlbmRfaXRlbS10aCBpdGVtIAorCQkJICAgd2UgZG8gbm9kZSBpbmNsdWRlIGludG8gbm9kZSB0aGF0IGlzIGJlaW5nIGZpbGxlZCAqLworICAgIGludCBzcGxpdF9pdGVtX3Bvc2l0aW9uc1syXTsgLyogdGhlc2UgYXJlIHBvc2l0aW9ucyBpbiB2aXJ0dWFsIGl0ZW0gb2YKKwkJCQkgICAgaXRlbXMsIHRoYXQgYXJlIHNwbGl0IGJldHdlZW4gU1swXSBhbmQKKwkJCQkgICAgUzFuZXcgYW5kIFMxbmV3IGFuZCBTMm5ldyAqLworCisgICAgc3BsaXRfaXRlbV9wb3NpdGlvbnNbMF0gPSAtMTsKKyAgICBzcGxpdF9pdGVtX3Bvc2l0aW9uc1sxXSA9IC0xOworCisgICAgLyogV2Ugb25seSBjcmVhdGUgYWRkaXRpb25hbCBub2RlcyBpZiB3ZSBhcmUgaW4gaW5zZXJ0IG9yIHBhc3RlIG1vZGUKKyAgICAgICBvciB3ZSBhcmUgaW4gcmVwbGFjZSBtb2RlIGF0IHRoZSBpbnRlcm5hbCBsZXZlbC4gSWYgaCBpcyAwIGFuZAorICAgICAgIHRoZSBtb2RlIGlzIE1fUkVQTEFDRSB0aGVuIGluIGZpeF9ub2RlcyB3ZSBjaGFuZ2UgdGhlIG1vZGUgdG8KKyAgICAgICBwYXN0ZSBvciBpbnNlcnQgYmVmb3JlIHdlIGdldCBoZXJlIGluIHRoZSBjb2RlLiAgKi8KKyAgICBSRkFMU0UoIHRiLT5pbnNlcnRfc2l6ZVtoXSA8IDAgIHx8IChtb2RlICE9IE1fSU5TRVJUICYmIG1vZGUgIT0gTV9QQVNURSksCisJICAgICJ2cy04MTAwOiBpbnNlcnRfc2l6ZSA8IDAgaW4gb3ZlcmZsb3ciKTsKKworICAgIG1heF9ub2RlX3NpemUgPSBNQVhfQ0hJTERfU0laRSAoUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKSk7CisKKyAgICAvKiBzbnVtMDEyIFswLTJdIC0gbnVtYmVyIG9mIGl0ZW1zLCB0aGF0IGxheQorICAgICAgIHRvIFNbMF0sIGZpcnN0IG5ldyBub2RlIGFuZCBzZWNvbmQgbmV3IG5vZGUgKi8KKyAgICBzbnVtMDEyWzNdID0gLTE7CS8qIHMxYnl0ZXMgKi8KKyAgICBzbnVtMDEyWzRdID0gLTE7CS8qIHMyYnl0ZXMgKi8KKworICAgIC8qIGludGVybmFsIGxldmVsICovCisgICAgaWYgKGggPiAwKSB7CisJaSA9ICgodG8gLSBmcm9tKSAqIChLRVlfU0laRSArIERDX1NJWkUpICsgRENfU0laRSk7CisJaWYgKGkgPT0gbWF4X25vZGVfc2l6ZSkKKwkgICAgcmV0dXJuIDE7CisJcmV0dXJuIChpIC8gbWF4X25vZGVfc2l6ZSArIDEpOworICAgIH0KKworICAgIC8qIGxlYWYgbGV2ZWwgKi8KKyAgICBuZWVkZWRfbm9kZXMgPSAxOworICAgIHRvdGFsX25vZGVfc2l6ZSA9IDA7CisgICAgY3VyX2ZyZWUgPSBtYXhfbm9kZV9zaXplOworCisgICAgLy8gc3RhcnQgZnJvbSAnZnJvbSctdGggaXRlbQorICAgIHN0YXJ0X2l0ZW0gPSBmcm9tOworICAgIC8vIHNraXAgaXRzIGZpcnN0ICdzdGFydF9ieXRlcycgdW5pdHMKKyAgICBzdGFydF9ieXRlcyA9ICgoZnJvbV9ieXRlcyAhPSAtMSkgPyBmcm9tX2J5dGVzIDogMCk7CisKKyAgICAvLyBsYXN0IGluY2x1ZGVkIGl0ZW0gaXMgdGhlICdlbmRfaXRlbSctdGggb25lCisgICAgZW5kX2l0ZW0gPSB2bi0+dm5fbnJfaXRlbSAtIHRvIC0gMTsKKyAgICAvLyBkbyBub3QgY291bnQgbGFzdCAnZW5kX2J5dGVzJyB1bml0cyBvZiAnZW5kX2l0ZW0nLXRoIGl0ZW0KKyAgICBlbmRfYnl0ZXMgPSAodG9fYnl0ZXMgIT0gLTEpID8gdG9fYnl0ZXMgOiAwOworCisgICAgLyogZ28gdGhyb3VnaCBhbGwgaXRlbSBiZWdpbm5pbmcgZnJvbSB0aGUgc3RhcnRfaXRlbS10aCBpdGVtIGFuZCBlbmRpbmcgYnkKKyAgICAgICB0aGUgZW5kX2l0ZW0tdGggaXRlbS4gRG8gbm90IGNvdW50IGZpcnN0ICdzdGFydF9ieXRlcycgdW5pdHMgb2YKKyAgICAgICAnc3RhcnRfaXRlbSctdGggaXRlbSBhbmQgbGFzdCAnZW5kX2J5dGVzJyBvZiAnZW5kX2l0ZW0nLXRoIGl0ZW0gKi8KKyAgICAKKyAgICBmb3IgKGkgPSBzdGFydF9pdGVtOyBpIDw9IGVuZF9pdGVtOyBpICsrKSB7CisJc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpID0gdm4tPnZuX3ZpICsgaTsKKwlpbnQgc2tpcF9mcm9tX2VuZCA9ICgoaSA9PSBlbmRfaXRlbSkgPyBlbmRfYnl0ZXMgOiAwKTsKKworCVJGQUxTRSggbmVlZGVkX25vZGVzID4gMywgInZzLTgxMDU6IHRvbyBtYW55IG5vZGVzIGFyZSBuZWVkZWQiKTsKKworCS8qIGdldCBzaXplIG9mIGN1cnJlbnQgaXRlbSAqLworCWN1cnJlbnRfaXRlbV9zaXplID0gdmktPnZpX2l0ZW1fbGVuOworCisJLyogZG8gbm90IHRha2UgaW4gY2FsY3VsYXRpb24gaGVhZCBwYXJ0IChmcm9tX2J5dGVzKSBvZiBmcm9tLXRoIGl0ZW0gKi8KKwljdXJyZW50X2l0ZW1fc2l6ZSAtPSBvcF9wYXJ0X3NpemUgKHZpLCAwLypmcm9tIHN0YXJ0Ki8sIHN0YXJ0X2J5dGVzKTsKKworCS8qIGRvIG5vdCB0YWtlIGluIGNhbGN1bGF0aW9uIHRhaWwgcGFydCBvZiBsYXN0IGl0ZW0gKi8KKwljdXJyZW50X2l0ZW1fc2l6ZSAtPSBvcF9wYXJ0X3NpemUgKHZpLCAxLypmcm9tIGVuZCovLCBza2lwX2Zyb21fZW5kKTsKKworCS8qIGlmIGl0ZW0gZml0cyBpbnRvIGN1cnJlbnQgbm9kZSBlbnRpZXJseSAqLworCWlmICh0b3RhbF9ub2RlX3NpemUgKyBjdXJyZW50X2l0ZW1fc2l6ZSA8PSBtYXhfbm9kZV9zaXplKSB7CisJICAgIHNudW0wMTJbbmVlZGVkX25vZGVzIC0gMV0gKys7CisJICAgIHRvdGFsX25vZGVfc2l6ZSArPSBjdXJyZW50X2l0ZW1fc2l6ZTsKKwkgICAgc3RhcnRfYnl0ZXMgPSAwOworCSAgICBjb250aW51ZTsKKwl9CisKKwlpZiAoY3VycmVudF9pdGVtX3NpemUgPiBtYXhfbm9kZV9zaXplKSB7CisJICAgIC8qIHZpcnR1YWwgaXRlbSBsZW5ndGggaXMgbG9uZ2VyLCB0aGFuIG1heCBzaXplIG9mIGl0ZW0gaW4KKyAgICAgICAgICAgICAgIGEgbm9kZS4gSXQgaXMgaW1wb3NzaWJsZSBmb3IgZGlyZWN0IGl0ZW0gKi8KKwkgICAgUkZBTFNFKCBpc19kaXJlY3RfbGVfaWggKHZpLT52aV9paCksCisJCSAgICAidnMtODExMDogIgorCQkgICAgImRpcmVjdCBpdGVtIGxlbmd0aCBpcyAlZC4gSXQgY2FuIG5vdCBiZSBsb25nZXIgdGhhbiAlZCIsCisJCSAgICBjdXJyZW50X2l0ZW1fc2l6ZSwgbWF4X25vZGVfc2l6ZSk7CisJICAgIC8qIHdlIHdpbGwgdHJ5IHRvIHNwbGl0IGl0ICovCisJICAgIGZsb3cgPSAxOworCX0KKworCWlmICghZmxvdykgeworCSAgICAvKiBhcyB3ZSBkbyBub3Qgc3BsaXQgaXRlbXMsIHRha2UgbmV3IG5vZGUgYW5kIGNvbnRpbnVlICovCisJICAgIG5lZWRlZF9ub2RlcyArKzsgaSAtLTsgdG90YWxfbm9kZV9zaXplID0gMDsKKwkgICAgY29udGludWU7CisJfQorCisJLy8gY2FsY3VsYXRlIG51bWJlciBvZiBpdGVtIHVuaXRzIHdoaWNoIGZpdCBpbnRvIG5vZGUgYmVpbmcKKwkvLyBmaWxsZWQKKwl7CisJICAgIGludCBmcmVlX3NwYWNlOworCisJICAgIGZyZWVfc3BhY2UgPSBtYXhfbm9kZV9zaXplIC0gdG90YWxfbm9kZV9zaXplIC0gSUhfU0laRTsKKwkgICAgdW5pdHMgPSBvcF9jaGVja19sZWZ0ICh2aSwgZnJlZV9zcGFjZSwgc3RhcnRfYnl0ZXMsIHNraXBfZnJvbV9lbmQpOworCSAgICBpZiAodW5pdHMgPT0gLTEpIHsKKwkJLyogbm90aGluZyBmaXRzIGludG8gY3VycmVudCBub2RlLCB0YWtlIG5ldyBub2RlIGFuZCBjb250aW51ZSAqLworCQluZWVkZWRfbm9kZXMgKyssIGktLSwgdG90YWxfbm9kZV9zaXplID0gMDsKKwkJY29udGludWU7CisJICAgIH0KKwl9CisKKwkvKiBzb21ldGhpbmcgZml0cyBpbnRvIHRoZSBjdXJyZW50IG5vZGUgKi8KKwkvL2lmIChzbnVtMDEyWzNdICE9IC0xIHx8IG5lZWRlZF9ub2RlcyAhPSAxKQorCS8vICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAidnMtODExNTogZ2V0X251bV92ZXI6IHRvbyBtYW55IG5vZGVzIHJlcXVpcmVkIik7CisJLy9zbnVtMDEyW25lZWRlZF9ub2RlcyAtIDEgKyAzXSA9IG9wX3VuaXRfbnVtICh2aSkgLSBzdGFydF9ieXRlcyAtIHVuaXRzOworCXN0YXJ0X2J5dGVzICs9IHVuaXRzOworCXNudW0wMTJbbmVlZGVkX25vZGVzIC0gMSArIDNdID0gdW5pdHM7CisKKwlpZiAobmVlZGVkX25vZGVzID4gMikKKwkgICAgcmVpc2VyZnNfd2FybmluZyAodGItPnRiX3NiLCAidnMtODExMTogZ2V0X251bV92ZXI6ICIKKwkJCSAgICAgICJzcGxpdF9pdGVtX3Bvc2l0aW9uIGlzIG91dCBvZiBib3VuZGFyeSIpOworCXNudW0wMTJbbmVlZGVkX25vZGVzIC0gMV0gKys7CisJc3BsaXRfaXRlbV9wb3NpdGlvbnNbbmVlZGVkX25vZGVzIC0gMV0gPSBpOworCW5lZWRlZF9ub2RlcyArKzsKKwkvKiBjb250aW51ZSBmcm9tIHRoZSBzYW1lIGl0ZW0gd2l0aCBzdGFydF9ieXRlcyAhPSAtMSAqLworCXN0YXJ0X2l0ZW0gPSBpOworCWkgLS07CisJdG90YWxfbm9kZV9zaXplID0gMDsKKyAgICB9CisKKyAgICAvLyBzdW0wMTJbNF0gKGlmIGl0IGlzIG5vdCAtMSkgY29udGFpbnMgbnVtYmVyIG9mIHVuaXRzIG9mIHdoaWNoCisgICAgLy8gYXJlIHRvIGJlIGluIFMxbmV3LCBzbnVtMDEyWzNdIC0gdG8gYmUgaW4gUzAuIFRoZXkgYXJlIHN1cHBvc2VkCisgICAgLy8gdG8gYmUgUzFieXRlcyBhbmQgUzJieXRlcyBjb3JyZXNwb25kaW5nbHksIHNvIHJlY2FsY3VsYXRlCisgICAgaWYgKHNudW0wMTJbNF0gPiAwKSB7CisJaW50IHNwbGl0X2l0ZW1fbnVtOworCWludCBieXRlc190b19yLCBieXRlc190b19sOworCWludCBieXRlc190b19TMW5ldzsKKyAgICAKKwlzcGxpdF9pdGVtX251bSA9IHNwbGl0X2l0ZW1fcG9zaXRpb25zWzFdOworCWJ5dGVzX3RvX2wgPSAoKGZyb20gPT0gc3BsaXRfaXRlbV9udW0gJiYgZnJvbV9ieXRlcyAhPSAtMSkgPyBmcm9tX2J5dGVzIDogMCk7CisJYnl0ZXNfdG9fciA9ICgoZW5kX2l0ZW0gPT0gc3BsaXRfaXRlbV9udW0gJiYgZW5kX2J5dGVzICE9IC0xKSA/IGVuZF9ieXRlcyA6IDApOworCWJ5dGVzX3RvX1MxbmV3ID0gKChzcGxpdF9pdGVtX3Bvc2l0aW9uc1swXSA9PSBzcGxpdF9pdGVtX3Bvc2l0aW9uc1sxXSkgPyBzbnVtMDEyWzNdIDogMCk7CisKKwkvLyBzMmJ5dGVzCisJc251bTAxMls0XSA9IG9wX3VuaXRfbnVtICgmdm4tPnZuX3ZpW3NwbGl0X2l0ZW1fbnVtXSkgLSBzbnVtMDEyWzRdIC0gYnl0ZXNfdG9fciAtIGJ5dGVzX3RvX2wgLSBieXRlc190b19TMW5ldzsKKworCWlmICh2bi0+dm5fdmlbc3BsaXRfaXRlbV9udW1dLnZpX2luZGV4ICE9IFRZUEVfRElSRU5UUlkgJiYKKwkgICAgdm4tPnZuX3ZpW3NwbGl0X2l0ZW1fbnVtXS52aV9pbmRleCAhPSBUWVBFX0lORElSRUNUKQorCSAgICByZWlzZXJmc193YXJuaW5nICh0Yi0+dGJfc2IsICJ2cy04MTE1OiBnZXRfbnVtX3Zlcjogbm90ICIKKwkJCSAgICAgICJkaXJlY3Rvcnkgb3IgaW5kaXJlY3QgaXRlbSIpOworICAgIH0KKworICAgIC8qIG5vdyB3ZSBrbm93IFMyYnl0ZXMsIGNhbGN1bGF0ZSBTMWJ5dGVzICovCisgICAgaWYgKHNudW0wMTJbM10gPiAwKSB7CisJaW50IHNwbGl0X2l0ZW1fbnVtOworCWludCBieXRlc190b19yLCBieXRlc190b19sOworCWludCBieXRlc190b19TMm5ldzsKKyAgICAKKwlzcGxpdF9pdGVtX251bSA9IHNwbGl0X2l0ZW1fcG9zaXRpb25zWzBdOworCWJ5dGVzX3RvX2wgPSAoKGZyb20gPT0gc3BsaXRfaXRlbV9udW0gJiYgZnJvbV9ieXRlcyAhPSAtMSkgPyBmcm9tX2J5dGVzIDogMCk7CisJYnl0ZXNfdG9fciA9ICgoZW5kX2l0ZW0gPT0gc3BsaXRfaXRlbV9udW0gJiYgZW5kX2J5dGVzICE9IC0xKSA/IGVuZF9ieXRlcyA6IDApOworCWJ5dGVzX3RvX1MybmV3ID0gKChzcGxpdF9pdGVtX3Bvc2l0aW9uc1swXSA9PSBzcGxpdF9pdGVtX3Bvc2l0aW9uc1sxXSAmJiBzbnVtMDEyWzRdICE9IC0xKSA/IHNudW0wMTJbNF0gOiAwKTsKKworCS8vIHMxYnl0ZXMKKwlzbnVtMDEyWzNdID0gb3BfdW5pdF9udW0gKCZ2bi0+dm5fdmlbc3BsaXRfaXRlbV9udW1dKSAtIHNudW0wMTJbM10gLSBieXRlc190b19yIC0gYnl0ZXNfdG9fbCAtIGJ5dGVzX3RvX1MybmV3OworICAgIH0KKyAgICAKKyAgICByZXR1cm4gbmVlZGVkX25vZGVzOworfQorCisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKK2V4dGVybiBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogY3VyX3RiOworI2VuZGlmCisKKworLyogU2V0IHBhcmFtZXRlcnMgZm9yIGJhbGFuY2luZy4KKyAqIFBlcmZvcm1zIHdyaXRlIG9mIHJlc3VsdHMgb2YgYW5hbHlzaXMgb2YgYmFsYW5jaW5nIGludG8gc3RydWN0dXJlIHRiLAorICogd2hlcmUgaXQgd2lsbCBsYXRlciBiZSB1c2VkIGJ5IHRoZSBmdW5jdGlvbnMgdGhhdCBhY3R1YWxseSBkbyB0aGUgYmFsYW5jaW5nLiAKKyAqIFBhcmFtZXRlcnM6CisgKgl0Ygl0cmVlX2JhbGFuY2Ugc3RydWN0dXJlOworICoJaAljdXJyZW50IGxldmVsIG9mIHRoZSBub2RlOworICoJbG51bQludW1iZXIgb2YgaXRlbXMgZnJvbSBTW2hdIHRoYXQgbXVzdCBiZSBzaGlmdGVkIHRvIExbaF07CisgKglybnVtCW51bWJlciBvZiBpdGVtcyBmcm9tIFNbaF0gdGhhdCBtdXN0IGJlIHNoaWZ0ZWQgdG8gUltoXTsKKyAqCWJsa19udW0JbnVtYmVyIG9mIGJsb2NrcyB0aGF0IFNbaF0gd2lsbCBiZSBzcGxpdHRlZCBpbnRvOworICoJczAxMgludW1iZXIgb2YgaXRlbXMgdGhhdCBmYWxsIGludG8gc3BsaXR0ZWQgbm9kZXMuCisgKglsYnl0ZXMJbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGZsb3cgdG8gdGhlIGxlZnQgbmVpZ2hib3IgZnJvbSB0aGUgaXRlbSB0aGF0IGlzIG5vdAorICoJCW5vdCBzaGlmdGVkIGVudGlyZWx5CisgKglyYnl0ZXMJbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGZsb3cgdG8gdGhlIHJpZ2h0IG5laWdoYm9yIGZyb20gdGhlIGl0ZW0gdGhhdCBpcyBub3QKKyAqCQlub3Qgc2hpZnRlZCBlbnRpcmVseQorICoJczFieXRlcwludW1iZXIgb2YgYnl0ZXMgd2hpY2ggZmxvdyB0byB0aGUgZmlyc3QgIG5ldyBub2RlIHdoZW4gU1swXSBzcGxpdHMgKHRoaXMgbnVtYmVyIGlzIGNvbnRhaW5lZCBpbiBzMDEyIGFycmF5KQorICovCisKK3N0YXRpYyB2b2lkIHNldF9wYXJhbWV0ZXJzIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBoLCBpbnQgbG51bSwKKwkJCSAgICBpbnQgcm51bSwgaW50IGJsa19udW0sIHNob3J0ICogczAxMiwgaW50IGxiLCBpbnQgcmIpCit7CisKKyAgdGItPmxudW1baF0gPSBsbnVtOworICB0Yi0+cm51bVtoXSA9IHJudW07CisgIHRiLT5ibGtudW1baF0gPSBibGtfbnVtOworCisgIGlmIChoID09IDApCisgICAgeyAgLyogb25seSBmb3IgbGVhZiBsZXZlbCAqLworICAgICAgaWYgKHMwMTIgIT0gTlVMTCkKKwl7CisJICB0Yi0+czBudW0gPSAqIHMwMTIgKyssCisJICB0Yi0+czFudW0gPSAqIHMwMTIgKyssCisJICB0Yi0+czJudW0gPSAqIHMwMTIgKys7CisJICB0Yi0+czFieXRlcyA9ICogczAxMiArKzsKKwkgIHRiLT5zMmJ5dGVzID0gKiBzMDEyOworCX0KKyAgICAgIHRiLT5sYnl0ZXMgPSBsYjsKKyAgICAgIHRiLT5yYnl0ZXMgPSByYjsKKyAgICB9CisgIFBST0NfSU5GT19BREQoIHRiIC0+IHRiX3NiLCBsbnVtWyBoIF0sIGxudW0gKTsKKyAgUFJPQ19JTkZPX0FERCggdGIgLT4gdGJfc2IsIHJudW1bIGggXSwgcm51bSApOworCisgIFBST0NfSU5GT19BREQoIHRiIC0+IHRiX3NiLCBsYnl0ZXNbIGggXSwgbGIgKTsKKyAgUFJPQ19JTkZPX0FERCggdGIgLT4gdGJfc2IsIHJieXRlc1sgaCBdLCByYiApOworfQorCisKKworLyogY2hlY2ssIGRvZXMgbm9kZSBkaXNhcHBlYXIgaWYgd2Ugc2hpZnQgdGItPmxudW1bMF0gaXRlbXMgdG8gbGVmdAorICAgbmVpZ2hib3IgYW5kIHRiLT5ybnVtWzBdIHRvIHRoZSByaWdodCBvbmUuICovCitzdGF0aWMgaW50IGlzX2xlYWZfcmVtb3ZhYmxlIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCit7CisgIHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biA9IHRiLT50Yl92bjsKKyAgaW50IHRvX2xlZnQsIHRvX3JpZ2h0OworICBpbnQgc2l6ZTsKKyAgaW50IHJlbWFpbl9pdGVtczsKKworICAvKiBudW1iZXIgb2YgaXRlbXMsIHRoYXQgd2lsbCBiZSBzaGlmdGVkIHRvIGxlZnQgKHJpZ2h0KSBuZWlnaGJvcgorICAgICBlbnRpcmVseSAqLworICB0b19sZWZ0ID0gdGItPmxudW1bMF0gLSAoKHRiLT5sYnl0ZXMgIT0gLTEpID8gMSA6IDApOworICB0b19yaWdodCA9IHRiLT5ybnVtWzBdIC0gKCh0Yi0+cmJ5dGVzICE9IC0xKSA/IDEgOiAwKTsKKyAgcmVtYWluX2l0ZW1zID0gdm4tPnZuX25yX2l0ZW07CisKKyAgLyogaG93IG1hbnkgaXRlbXMgcmVtYWluIGluIFNbMF0gYWZ0ZXIgc2hpZnRpbmdzIHRvIG5laWdoYm9ycyAqLworICByZW1haW5faXRlbXMgLT0gKHRvX2xlZnQgKyB0b19yaWdodCk7CisKKyAgaWYgKHJlbWFpbl9pdGVtcyA8IDEpIHsKKyAgICAvKiBhbGwgY29udGVudCBvZiBub2RlIGNhbiBiZSBzaGlmdGVkIHRvIG5laWdoYm9ycyAqLworICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgMCwgdG9fbGVmdCwgdm4tPnZuX25yX2l0ZW0gLSB0b19sZWZ0LCAwLCBOVUxMLCAtMSwgLTEpOyAgICAKKyAgICByZXR1cm4gMTsKKyAgfQorICAKKyAgaWYgKHJlbWFpbl9pdGVtcyA+IDEgfHwgdGItPmxieXRlcyA9PSAtMSB8fCB0Yi0+cmJ5dGVzID09IC0xKQorICAgIC8qIFNbMF0gaXMgbm90IHJlbW92YWJsZSAqLworICAgIHJldHVybiAwOworCisgIC8qIGNoZWNrLCB3aGV0aGVyIHdlIGNhbiBkaXZpZGUgMSByZW1haW5pbmcgaXRlbSBiZXR3ZWVuIG5laWdoYm9ycyAqLworCisgIC8qIGdldCBzaXplIG9mIHJlbWFpbmluZyBpdGVtIChpbiBpdGVtIHVuaXRzKSAqLworICBzaXplID0gb3BfdW5pdF9udW0gKCYodm4tPnZuX3ZpW3RvX2xlZnRdKSk7CisKKyAgaWYgKHRiLT5sYnl0ZXMgKyB0Yi0+cmJ5dGVzID49IHNpemUpIHsKKyAgICBzZXRfcGFyYW1ldGVycyAodGIsIDAsIHRvX2xlZnQgKyAxLCB0b19yaWdodCArIDEsIDAsIE5VTEwsIHRiLT5sYnl0ZXMsIC0xKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldHVybiAwOworfQorCisKKy8qIGNoZWNrIHdoZXRoZXIgTCwgUywgUiBjYW4gYmUgam9pbmVkIGluIG9uZSBub2RlICovCitzdGF0aWMgaW50IGFyZV9sZWF2ZXNfcmVtb3ZhYmxlIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBsZnJlZSwgaW50IHJmcmVlKQoreworICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4gPSB0Yi0+dGJfdm47CisgIGludCBpaF9zaXplOworICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKlMwOworCisgIFMwID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCAwKTsKKworICBpaF9zaXplID0gMDsKKyAgaWYgKHZuLT52bl9ucl9pdGVtKSB7CisgICAgaWYgKHZuLT52bl92aVswXS52aV90eXBlICYgVklfVFlQRV9MRUZUX01FUkdFQUJMRSkKKyAgICAgIGloX3NpemUgKz0gSUhfU0laRTsKKyAgICAKKwlpZiAodm4tPnZuX3ZpW3ZuLT52bl9ucl9pdGVtLTFdLnZpX3R5cGUgJiBWSV9UWVBFX1JJR0hUX01FUkdFQUJMRSkKKwkgICAgaWhfc2l6ZSArPSBJSF9TSVpFOworICAgIH0gZWxzZSB7CisJLyogdGhlcmUgd2FzIG9ubHkgb25lIGl0ZW0gYW5kIGl0IHdpbGwgYmUgZGVsZXRlZCAqLworCXN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKyAgICAKKyAgICBSRkFMU0UoIEJfTlJfSVRFTVMgKFMwKSAhPSAxLAorCSAgICAidnMtODEyNTogaXRlbSBudW1iZXIgbXVzdCBiZSAxOiBpdCBpcyAlZCIsIEJfTlJfSVRFTVMoUzApKTsKKworICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKFMwLCAwKTsKKyAgICBpZiAodGItPkNGUlswXSAmJiAhY29tcF9zaG9ydF9sZV9rZXlzICgmKGloLT5paF9rZXkpLCBCX05fUERFTElNX0tFWSAodGItPkNGUlswXSwgdGItPnJrZXlbMF0pKSkKKwlpZiAoaXNfZGlyZW50cnlfbGVfaWggKGloKSkgeworCSAgICAvKiBEaXJlY3RvcnkgbXVzdCBiZSBpbiBjb3JyZWN0IHN0YXRlIGhlcmU6IHRoYXQgaXMKKwkgICAgICAgc29tZXdoZXJlIGF0IHRoZSBsZWZ0IHNpZGUgc2hvdWxkIGV4aXN0IGZpcnN0IGRpcmVjdG9yeQorCSAgICAgICBpdGVtLiBCdXQgdGhlIGl0ZW0gYmVpbmcgZGVsZXRlZCBjYW4gbm90IGJlIHRoYXQgZmlyc3QKKwkgICAgICAgb25lIGJlY2F1c2UgaXRzIHJpZ2h0IG5laWdoYm9yIGlzIGl0ZW0gb2YgdGhlIHNhbWUKKwkgICAgICAgZGlyZWN0b3J5LiAoQnV0IGZpcnN0IGl0ZW0gYWx3YXlzIGdldHMgZGVsZXRlZCBpbiBsYXN0CisJICAgICAgIHR1cm4pLiBTbywgbmVpZ2hib3JzIG9mIGRlbGV0ZWQgaXRlbSBjYW4gYmUgbWVyZ2VkLCBzbworCSAgICAgICB3ZSBjYW4gc2F2ZSBpaF9zaXplICovCisJICAgIGloX3NpemUgPSBJSF9TSVpFOworCSAgICAKKwkgICAgLyogd2UgbWlnaHQgY2hlY2sgdGhhdCBsZWZ0IG5laWdoYm9yIGV4aXN0cyBhbmQgaXMgb2YgdGhlCisJICAgICAgIHNhbWUgZGlyZWN0b3J5ICovCisJICAgIFJGQUxTRShsZV9paF9rX29mZnNldCAoaWgpID09IERPVF9PRkZTRVQsCisJCSJ2cy04MTMwOiBmaXJzdCBkaXJlY3RvcnkgaXRlbSBjYW4gbm90IGJlIHJlbW92ZWQgdW50aWwgZGlyZWN0b3J5IGlzIG5vdCBlbXB0eSIpOworICAgICAgfQorICAgIAorICB9CisKKyAgaWYgKE1BWF9DSElMRF9TSVpFIChTMCkgKyB2bi0+dm5fc2l6ZSA8PSByZnJlZSArIGxmcmVlICsgaWhfc2l6ZSkgeworICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgMCwgLTEsIC0xLCAtMSwgTlVMTCwgLTEsIC0xKTsKKyAgICBQUk9DX0lORk9fSU5DKCB0YiAtPiB0Yl9zYiwgbGVhdmVzX3JlbW92YWJsZSApOworICAgIHJldHVybiAxOyAgCisgIH0KKyAgcmV0dXJuIDA7CisgIAorfQorCisKKworLyogd2hlbiB3ZSBkbyBub3Qgc3BsaXQgaXRlbSwgbG51bSBhbmQgcm51bSBhcmUgbnVtYmVycyBvZiBlbnRpcmUgaXRlbXMgKi8KKyNkZWZpbmUgU0VUX1BBUl9TSElGVF9MRUZUIFwKK2lmIChoKVwKK3tcCisgICBpbnQgdG9fbDtcCisgICBcCisgICB0b19sID0gKE1BWF9OUl9LRVkoU2gpKzEgLSBscGFyICsgdm4tPnZuX25yX2l0ZW0gKyAxKSAvIDIgLVwKKwkgICAgICAoTUFYX05SX0tFWShTaCkgKyAxIC0gbHBhcik7XAorCSAgICAgIFwKKwkgICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIHRvX2wsIDAsIGxudmVyLCBOVUxMLCAtMSwgLTEpO1wKK31cCitlbHNlIFwKK3tcCisgICBpZiAobHNldD09TEVGVF9TSElGVF9GTE9XKVwKKyAgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCBscGFyLCAwLCBsbnZlciwgc251bTAxMitsc2V0LFwKKwkJICAgICB0Yi0+bGJ5dGVzLCAtMSk7XAorICAgZWxzZVwKKyAgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCBscGFyIC0gKHRiLT5sYnl0ZXMhPS0xKSwgMCwgbG52ZXIsIHNudW0wMTIrbHNldCxcCisJCSAgICAgLTEsIC0xKTtcCit9CisKKworI2RlZmluZSBTRVRfUEFSX1NISUZUX1JJR0hUIFwKK2lmIChoKVwKK3tcCisgICBpbnQgdG9fcjtcCisgICBcCisgICB0b19yID0gKE1BWF9OUl9LRVkoU2gpKzEgLSBycGFyICsgdm4tPnZuX25yX2l0ZW0gKyAxKSAvIDIgLSAoTUFYX05SX0tFWShTaCkgKyAxIC0gcnBhcik7XAorICAgXAorICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCB0b19yLCBybnZlciwgTlVMTCwgLTEsIC0xKTtcCit9XAorZWxzZSBcCit7XAorICAgaWYgKHJzZXQ9PVJJR0hUX1NISUZUX0ZMT1cpXAorICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIHJwYXIsIHJudmVyLCBzbnVtMDEyK3JzZXQsXAorCQkgIC0xLCB0Yi0+cmJ5dGVzKTtcCisgICBlbHNlXAorICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIHJwYXIgLSAodGItPnJieXRlcyE9LTEpLCBybnZlciwgc251bTAxMityc2V0LFwKKwkJICAtMSwgLTEpO1wKK30KKworCitzdGF0aWMgdm9pZCBmcmVlX2J1ZmZlcnNfaW5fdGIgKAorCQkgICAgICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHBfc190YgorCQkgICAgICAgKSB7CisgIGludCBuX2NvdW50ZXI7CisKKyAgZGVjcmVtZW50X2NvdW50ZXJzX2luX3BhdGgocF9zX3RiLT50Yl9wYXRoKTsKKyAgCisgIGZvciAoIG5fY291bnRlciA9IDA7IG5fY291bnRlciA8IE1BWF9IRUlHSFQ7IG5fY291bnRlcisrICkgeworICAgIGRlY3JlbWVudF9iY291bnQocF9zX3RiLT5MW25fY291bnRlcl0pOworICAgIHBfc190Yi0+TFtuX2NvdW50ZXJdID0gTlVMTDsKKyAgICBkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+UltuX2NvdW50ZXJdKTsKKyAgICBwX3NfdGItPlJbbl9jb3VudGVyXSA9IE5VTEw7CisgICAgZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkZMW25fY291bnRlcl0pOworICAgIHBfc190Yi0+Rkxbbl9jb3VudGVyXSA9IE5VTEw7CisgICAgZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkZSW25fY291bnRlcl0pOworICAgIHBfc190Yi0+RlJbbl9jb3VudGVyXSA9IE5VTEw7CisgICAgZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkNGTFtuX2NvdW50ZXJdKTsKKyAgICBwX3NfdGItPkNGTFtuX2NvdW50ZXJdID0gTlVMTDsKKyAgICBkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Q0ZSW25fY291bnRlcl0pOworICAgIHBfc190Yi0+Q0ZSW25fY291bnRlcl0gPSBOVUxMOworICB9Cit9CisKKworLyogR2V0IG5ldyBidWZmZXJzIGZvciBzdG9yaW5nIG5ldyBub2RlcyB0aGF0IGFyZSBjcmVhdGVkIHdoaWxlIGJhbGFuY2luZy4KKyAqIFJldHVybnM6CVNDSEVEVUxFX09DQ1VSUkVEIC0gc2NoZWR1bGUgb2NjdXJyZWQgd2hpbGUgdGhlIGZ1bmN0aW9uIHdvcmtlZDsKKyAqCSAgICAgICAgQ0FSUllfT04gLSBzY2hlZHVsZSBkaWRuJ3Qgb2NjdXIgd2hpbGUgdGhlIGZ1bmN0aW9uIHdvcmtlZDsKKyAqCSAgICAgICAgTk9fRElTS19TUEFDRSAtIG5vIGRpc2sgc3BhY2UuCisgKi8KKy8qIFRoZSBmdW5jdGlvbiBpcyBOT1QgU0NIRURVTEUtU0FGRSEgKi8KK3N0YXRpYyBpbnQgIGdldF9lbXB0eV9ub2RlcygKKyAgICAgICAgICAgICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHBfc190YiwKKyAgICAgICAgICAgICAgaW50IG5faAorICAgICAgICAgICAgKSB7CisgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfbmV3X2JoLAorICAgIAkJICAgICAgKglwX3NfU2ggPSBQQVRIX0hfUEJVRkZFUiAocF9zX3RiLT50Yl9wYXRoLCBuX2gpOworICBiX2Jsb2NrbnJfdAkgICAgICAqCXBfbl9ibG9ja25yLAorICAgIAkJCWFfbl9ibG9ja25yc1tNQVhfQU1PVU5UX05FRURFRF0gPSB7MCwgfTsKKyAgaW50ICAgICAgIAkJbl9jb3VudGVyLAorICAgCQkJbl9udW1iZXJfb2ZfZnJlZWJsaywKKyAgICAgICAgICAgICAgICAJbl9hbW91bnRfbmVlZGVkLC8qIG51bWJlciBvZiBuZWVkZWQgZW1wdHkgYmxvY2tzICovCisJCQluX3JldHZhbCA9IENBUlJZX09OOworICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKglwX3Nfc2IgPSBwX3NfdGItPnRiX3NiOworCisKKyAgLyogbnVtYmVyX29mX2ZyZWVibGsgaXMgdGhlIG51bWJlciBvZiBlbXB0eSBibG9ja3Mgd2hpY2ggaGF2ZSBiZWVuCisgICAgIGFjcXVpcmVkIGZvciB1c2UgYnkgdGhlIGJhbGFuY2luZyBhbGdvcml0aG0gbWludXMgdGhlIG51bWJlciBvZgorICAgICBlbXB0eSBibG9ja3MgdXNlZCBpbiB0aGUgcHJldmlvdXMgbGV2ZWxzIG9mIHRoZSBhbmFseXNpcywKKyAgICAgbnVtYmVyX29mX2ZyZWVibGsgPSB0Yi0+Y3VyX2Jsa251bSBjYW4gYmUgbm9uLXplcm8gaWYgYSBzY2hlZHVsZSBvY2N1cnMKKyAgICAgYWZ0ZXIgZW1wdHkgYmxvY2tzIGFyZSBhY3F1aXJlZCwgYW5kIHRoZSBiYWxhbmNpbmcgYW5hbHlzaXMgaXMKKyAgICAgdGhlbiByZXN0YXJ0ZWQsIGFtb3VudF9uZWVkZWQgaXMgdGhlIG51bWJlciBuZWVkZWQgYnkgdGhpcyBsZXZlbAorICAgICAobl9oKSBvZiB0aGUgYmFsYW5jaW5nIGFuYWx5c2lzLgorCQkJICAgIAorICAgICBOb3RlIHRoYXQgZm9yIHN5c3RlbXMgd2l0aCBtYW55IHByb2Nlc3NlcyB3cml0aW5nLCBpdCB3b3VsZCBiZQorICAgICBtb3JlIGxheW91dCBvcHRpbWFsIHRvIGNhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG5lZWRlZCBieSBhbGwKKyAgICAgbGV2ZWxzIGFuZCB0aGVuIHRvIHJ1biByZWlzZXJmc19uZXdfYmxvY2tzIHRvIGdldCBhbGwgb2YgdGhlbSBhdCBvbmNlLiAgKi8KKworICAvKiBJbml0aWF0ZSBudW1iZXJfb2ZfZnJlZWJsayB0byB0aGUgYW1vdW50IGFjcXVpcmVkIHByaW9yIHRvIHRoZSByZXN0YXJ0IG9mCisgICAgIHRoZSBhbmFseXNpcyBvciAwIGlmIG5vdCByZXN0YXJ0ZWQsIHRoZW4gc3VidHJhY3QgdGhlIGFtb3VudCBuZWVkZWQKKyAgICAgYnkgYWxsIG9mIHRoZSBsZXZlbHMgb2YgdGhlIHRyZWUgYmVsb3cgbl9oLiAqLworICAvKiBibGtudW0gaW5jbHVkZXMgU1tuX2hdLCBzbyB3ZSBzdWJ0cmFjdCAxIGluIHRoaXMgY2FsY3VsYXRpb24gKi8KKyAgZm9yICggbl9jb3VudGVyID0gMCwgbl9udW1iZXJfb2ZfZnJlZWJsayA9IHBfc190Yi0+Y3VyX2Jsa251bTsgbl9jb3VudGVyIDwgbl9oOyBuX2NvdW50ZXIrKyApCisgICAgbl9udW1iZXJfb2ZfZnJlZWJsayAtPSAoIHBfc190Yi0+YmxrbnVtW25fY291bnRlcl0gKSA/IChwX3NfdGItPmJsa251bVtuX2NvdW50ZXJdIC0gMSkgOiAwOworCisgIC8qIEFsbG9jYXRlIG1pc3NpbmcgZW1wdHkgYmxvY2tzLiAqLworICAvKiBpZiBwX3NfU2ggPT0gMCAgdGhlbiB3ZSBhcmUgZ2V0dGluZyBhIG5ldyByb290ICovCisgIG5fYW1vdW50X25lZWRlZCA9ICggcF9zX1NoICkgPyAocF9zX3RiLT5ibGtudW1bbl9oXSAtIDEpIDogMTsKKyAgLyogIEFtb3VudF9uZWVkZWQgPSB0aGUgYW1vdW50IHRoYXQgd2UgbmVlZCBtb3JlIHRoYW4gdGhlIGFtb3VudCB0aGF0IHdlIGhhdmUuICovCisgIGlmICggbl9hbW91bnRfbmVlZGVkID4gbl9udW1iZXJfb2ZfZnJlZWJsayApCisgICAgbl9hbW91bnRfbmVlZGVkIC09IG5fbnVtYmVyX29mX2ZyZWVibGs7CisgIGVsc2UgLyogSWYgd2UgaGF2ZSBlbm91Z2ggYWxyZWFkeSB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uICovCisgICAgcmV0dXJuIENBUlJZX09OOworCisgIC8qIE5vIG5lZWQgdG8gY2hlY2sgcXVvdGEgLSBpcyBub3QgYWxsb2NhdGVkIGZvciBibG9ja3MgdXNlZCBmb3IgZm9ybWF0dGVkIG5vZGVzICovCisgIGlmIChyZWlzZXJmc19uZXdfZm9ybV9ibG9ja25ycyAocF9zX3RiLCBhX25fYmxvY2tucnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fYW1vdW50X25lZWRlZCkgPT0gTk9fRElTS19TUEFDRSkKKyAgICByZXR1cm4gTk9fRElTS19TUEFDRTsKKworICAvKiBmb3IgZWFjaCBibG9ja251bWJlciB3ZSBqdXN0IGdvdCwgZ2V0IGEgYnVmZmVyIGFuZCBzdGljayBpdCBvbiBGRUIgKi8KKyAgZm9yICggcF9uX2Jsb2NrbnIgPSBhX25fYmxvY2tucnMsIG5fY291bnRlciA9IDA7IG5fY291bnRlciA8IG5fYW1vdW50X25lZWRlZDsKKwlwX25fYmxvY2tucisrLCBuX2NvdW50ZXIrKyApIHsgCisKKyAgICBSRkFMU0UoICEgKnBfbl9ibG9ja25yLAorCSAgICAiUEFQLTgxMzU6IHJlaXNlcmZzX25ld19ibG9ja25ycyBmYWlsZWQgd2hlbiBnb3QgbmV3IGJsb2NrcyIpOworCisgICAgcF9zX25ld19iaCA9IHNiX2dldGJsayhwX3Nfc2IsICpwX25fYmxvY2tucik7CisgICAgUkZBTFNFIChidWZmZXJfZGlydHkgKHBfc19uZXdfYmgpIHx8CisJICAgIGJ1ZmZlcl9qb3VybmFsZWQgKHBfc19uZXdfYmgpIHx8CisJICAgIGJ1ZmZlcl9qb3VybmFsX2RpcnR5IChwX3NfbmV3X2JoKSwKKwkgICAgIlBBUC04MTQwOiBqb3VybmxhbGVkIG9yIGRpcnR5IGJ1ZmZlciAlYiBmb3IgdGhlIG5ldyBibG9jayIsIAorCSAgICBwX3NfbmV3X2JoKTsKKyAgICAKKyAgICAvKiBQdXQgZW1wdHkgYnVmZmVycyBpbnRvIHRoZSBhcnJheS4gKi8KKyAgICBSRkFMU0UgKHBfc190Yi0+RkVCW3Bfc190Yi0+Y3VyX2Jsa251bV0sCisJICAgICJQQVAtODE0MTogYnVzeSBzbG90IGZvciBuZXcgYnVmZmVyIik7CisKKyAgICBzZXRfYnVmZmVyX2pvdXJuYWxfbmV3IChwX3NfbmV3X2JoKTsKKyAgICBwX3NfdGItPkZFQltwX3NfdGItPmN1cl9ibGtudW0rK10gPSBwX3NfbmV3X2JoOworICB9CisKKyAgaWYgKCBuX3JldHZhbCA9PSBDQVJSWV9PTiAmJiBGSUxFU1lTVEVNX0NIQU5HRURfVEIgKHBfc190YikgKQorICAgIG5fcmV0dmFsID0gUkVQRUFUX1NFQVJDSCA7CisKKyAgcmV0dXJuIG5fcmV0dmFsOworfQorCisKKy8qIEdldCBmcmVlIHNwYWNlIG9mIHRoZSBsZWZ0IG5laWdoYm9yLCB3aGljaCBpcyBzdG9yZWQgaW4gdGhlIHBhcmVudAorICogbm9kZSBvZiB0aGUgbGVmdCBuZWlnaGJvci4gICovCitzdGF0aWMgaW50IGdldF9sZnJlZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCkKK3sKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBsLCAqIGY7CisgICAgaW50IG9yZGVyOworCisgICAgaWYgKChmID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKSkgPT0gMCB8fCAobCA9IHRiLT5GTFtoXSkgPT0gMCkKKwlyZXR1cm4gMDsKKworICAgIGlmIChmID09IGwpCisJb3JkZXIgPSBQQVRIX0hfQl9JVEVNX09SREVSICh0Yi0+dGJfcGF0aCwgaCkgLSAxOworICAgIGVsc2UgeworCW9yZGVyID0gQl9OUl9JVEVNUyAobCk7CisJZiA9IGw7CisgICAgfQorCisgICAgcmV0dXJuIChNQVhfQ0hJTERfU0laRShmKSAtIGRjX3NpemUoQl9OX0NISUxEKGYsb3JkZXIpKSk7Cit9CisKKworLyogR2V0IGZyZWUgc3BhY2Ugb2YgdGhlIHJpZ2h0IG5laWdoYm9yLAorICogd2hpY2ggaXMgc3RvcmVkIGluIHRoZSBwYXJlbnQgbm9kZSBvZiB0aGUgcmlnaHQgbmVpZ2hib3IuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3JmcmVlIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBoKQoreworICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiByLCAqIGY7CisgIGludCBvcmRlcjsKKworICBpZiAoKGYgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpKSA9PSAwIHx8IChyID0gdGItPkZSW2hdKSA9PSAwKQorICAgIHJldHVybiAwOworCisgIGlmIChmID09IHIpCisgICAgICBvcmRlciA9IFBBVEhfSF9CX0lURU1fT1JERVIgKHRiLT50Yl9wYXRoLCBoKSArIDE7CisgIGVsc2UgeworICAgICAgb3JkZXIgPSAwOworICAgICAgZiA9IHI7CisgIH0KKworICByZXR1cm4gKE1BWF9DSElMRF9TSVpFKGYpIC0gZGNfc2l6ZSggQl9OX0NISUxEKGYsb3JkZXIpKSk7CisKK30KKworCisvKiBDaGVjayB3aGV0aGVyIGxlZnQgbmVpZ2hib3IgaXMgaW4gbWVtb3J5LiAqLworc3RhdGljIGludCAgaXNfbGVmdF9uZWlnaGJvcl9pbl9jYWNoZSgKKyAgICAgICAgICAgICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHBfc190YiwKKyAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIG5faAorICAgICAgICAgICAgKSB7CisgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfZmF0aGVyLCAqIGxlZnQ7CisgIHN0cnVjdCBzdXBlcl9ibG9jayAgKiBwX3Nfc2IgPSBwX3NfdGItPnRiX3NiOworICBiX2Jsb2NrbnJfdAkJbl9sZWZ0X25laWdoYm9yX2Jsb2NrbnI7CisgIGludCAgICAgICAgICAgICAgICAgICBuX2xlZnRfbmVpZ2hib3JfcG9zaXRpb247CisKKyAgaWYgKCAhIHBfc190Yi0+Rkxbbl9oXSApIC8qIEZhdGhlciBvZiB0aGUgbGVmdCBuZWlnaGJvciBkb2VzIG5vdCBleGlzdC4gKi8KKyAgICByZXR1cm4gMDsKKworICAvKiBDYWxjdWxhdGUgZmF0aGVyIG9mIHRoZSBub2RlIHRvIGJlIGJhbGFuY2VkLiAqLworICBwX3NfZmF0aGVyID0gUEFUSF9IX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBuX2ggKyAxKTsKKworICBSRkFMU0UoICEgcF9zX2ZhdGhlciB8fCAKKwkgICEgQl9JU19JTl9UUkVFIChwX3NfZmF0aGVyKSB8fCAKKwkgICEgQl9JU19JTl9UUkVFIChwX3NfdGItPkZMW25faF0pIHx8CisJICAhIGJ1ZmZlcl91cHRvZGF0ZSAocF9zX2ZhdGhlcikgfHwgCisJICAhIGJ1ZmZlcl91cHRvZGF0ZSAocF9zX3RiLT5GTFtuX2hdKSwKKwkgICJ2cy04MTY1OiBGW2hdICglYikgb3IgRkxbaF0gKCViKSBpcyBpbnZhbGlkIiwgCisJICBwX3NfZmF0aGVyLCBwX3NfdGItPkZMW25faF0pOworCisKKyAgLyogR2V0IHBvc2l0aW9uIG9mIHRoZSBwb2ludGVyIHRvIHRoZSBsZWZ0IG5laWdoYm9yIGludG8gdGhlIGxlZnQgZmF0aGVyLiAqLworICBuX2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gPSAoIHBfc19mYXRoZXIgPT0gcF9zX3RiLT5GTFtuX2hdICkgPworICAgICAgICAgICAgICAgICAgICAgIHBfc190Yi0+bGtleVtuX2hdIDogQl9OUl9JVEVNUyAocF9zX3RiLT5GTFtuX2hdKTsKKyAgLyogR2V0IGxlZnQgbmVpZ2hib3IgYmxvY2sgbnVtYmVyLiAqLworICBuX2xlZnRfbmVpZ2hib3JfYmxvY2tuciA9IEJfTl9DSElMRF9OVU0ocF9zX3RiLT5GTFtuX2hdLCBuX2xlZnRfbmVpZ2hib3JfcG9zaXRpb24pOworICAvKiBMb29rIGZvciB0aGUgbGVmdCBuZWlnaGJvciBpbiB0aGUgY2FjaGUuICovCisgIGlmICggKGxlZnQgPSBzYl9maW5kX2dldF9ibG9jayhwX3Nfc2IsIG5fbGVmdF9uZWlnaGJvcl9ibG9ja25yKSkgKSB7CisKKyAgICBSRkFMU0UoIGJ1ZmZlcl91cHRvZGF0ZSAobGVmdCkgJiYgISBCX0lTX0lOX1RSRUUobGVmdCksCisJICAgICJ2cy04MTcwOiBsZWZ0IG5laWdoYm9yICglYiAleikgaXMgbm90IGluIHRoZSB0cmVlIiwgbGVmdCwgbGVmdCk7CisgICAgcHV0X2JoKGxlZnQpIDsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldHVybiAwOworfQorCisKKyNkZWZpbmUgTEVGVF9QQVJFTlRTICAnbCcKKyNkZWZpbmUgUklHSFRfUEFSRU5UUyAncicKKworCitzdGF0aWMgdm9pZCBkZWNyZW1lbnRfa2V5IChzdHJ1Y3QgY3B1X2tleSAqIHBfc19rZXkpCit7CisgICAgLy8gY2FsbCBpdGVtIHNwZWNpZmljIGZ1bmN0aW9uIGZvciB0aGlzIGtleQorICAgIGl0ZW1fb3BzW2NwdV9rZXlfa190eXBlIChwX3Nfa2V5KV0tPmRlY3JlbWVudF9rZXkgKHBfc19rZXkpOworfQorCisKKworCisvKiBDYWxjdWxhdGUgZmFyIGxlZnQvcmlnaHQgcGFyZW50IG9mIHRoZSBsZWZ0L3JpZ2h0IG5laWdoYm9yIG9mIHRoZSBjdXJyZW50IG5vZGUsIHRoYXQKKyAqIGlzIGNhbGN1bGF0ZSB0aGUgbGVmdC9yaWdodCAoRkxbaF0vRlJbaF0pIG5laWdoYm9yIG9mIHRoZSBwYXJlbnQgRltoXS4KKyAqIENhbGN1bGF0ZSBsZWZ0L3JpZ2h0IGNvbW1vbiBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZSBhbmQgTFtoXS9SW2hdLgorICogQ2FsY3VsYXRlIGxlZnQvcmlnaHQgZGVsaW1pdGluZyBrZXkgcG9zaXRpb24uCisgKiBSZXR1cm5zOglQQVRIX0lOQ09SUkVDVCAgIC0gcGF0aCBpbiB0aGUgdHJlZSBpcyBub3QgY29ycmVjdDsKKyAJCVNDSEVEVUxFX09DQ1VSUkVEIC0gc2NoZWR1bGUgb2NjdXJyZWQgd2hpbGUgdGhlIGZ1bmN0aW9uIHdvcmtlZDsKKyAqCSAgICAgICAgQ0FSUllfT04gICAgICAgICAtIHNjaGVkdWxlIGRpZG4ndCBvY2N1ciB3aGlsZSB0aGUgZnVuY3Rpb24gd29ya2VkOworICovCitzdGF0aWMgaW50ICBnZXRfZmFyX3BhcmVudCAoc3RydWN0IHRyZWVfYmFsYW5jZSAqICAgcF9zX3RiLAorCQkJICAgIGludCAgICAgICAgICAgICAgICAgICAgIG5faCwKKwkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICoqICBwcF9zX2ZhdGhlciwKKwkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICoqICBwcF9zX2NvbV9mYXRoZXIsCisJCQkgICAgY2hhciAgICAgICAgICAgICAgICAgICAgY19scl9wYXIpIAoreworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfcGFyZW50OworICAgIElOSVRJQUxJWkVfUEFUSCAoc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlcik7CisgICAgc3RydWN0IHBhdGggKiBwX3NfcGF0aCA9IHBfc190Yi0+dGJfcGF0aDsKKyAgICBzdHJ1Y3QgY3B1X2tleQlzX2xyX2ZhdGhlcl9rZXk7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIG5fY291bnRlciwKKwluX3Bvc2l0aW9uID0gSU5UX01BWCwKKwluX2ZpcnN0X2xhc3RfcG9zaXRpb24gPSAwLAorCW5fcGF0aF9vZmZzZXQgPSBQQVRIX0hfUEFUSF9PRkZTRVQocF9zX3BhdGgsIG5faCk7CisKKyAgICAvKiBTdGFydGluZyBmcm9tIEZbbl9oXSBnbyB1cHdhcmRzIGluIHRoZSB0cmVlLCBhbmQgbG9vayBmb3IgdGhlIGNvbW1vbgorICAgICAgYW5jZXN0b3Igb2YgRltuX2hdLCBhbmQgaXRzIG5laWdoYm9yIGwvciwgdGhhdCBzaG91bGQgYmUgb2J0YWluZWQuICovCisKKyAgICBuX2NvdW50ZXIgPSBuX3BhdGhfb2Zmc2V0OworCisgICAgUkZBTFNFKCBuX2NvdW50ZXIgPCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VULAorCSAgICAiUEFQLTgxODA6IGludmFsaWQgcGF0aCBsZW5ndGgiKTsKKworICAKKyAgICBmb3IgKCA7IG5fY291bnRlciA+IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQ7IG5fY291bnRlci0tICApICB7CisJLyogQ2hlY2sgd2hldGhlciBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgYnVmZmVyIGluIHRoZSBwYXRoIGlzIHJlYWxseSBwYXJlbnQgaW4gdGhlIHRyZWUuICovCisJaWYgKCAhIEJfSVNfSU5fVFJFRShwX3NfcGFyZW50ID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9jb3VudGVyIC0gMSkpICkKKwkgICAgcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJLyogQ2hlY2sgd2hldGhlciBwb3NpdGlvbiBpbiB0aGUgcGFyZW50IGlzIGNvcnJlY3QuICovCisJaWYgKCAobl9wb3NpdGlvbiA9IFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19wYXRoLCBuX2NvdW50ZXIgLSAxKSkgPiBCX05SX0lURU1TKHBfc19wYXJlbnQpICkKKwkgICAgcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJLyogQ2hlY2sgd2hldGhlciBwYXJlbnQgYXQgdGhlIHBhdGggcmVhbGx5IHBvaW50cyB0byB0aGUgY2hpbGQuICovCisJaWYgKCBCX05fQ0hJTERfTlVNKHBfc19wYXJlbnQsIG5fcG9zaXRpb24pICE9CisJICAgICBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX2NvdW50ZXIpLT5iX2Jsb2NrbnIgKQorCSAgICByZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwkvKiBSZXR1cm4gZGVsaW1pdGluZyBrZXkgaWYgcG9zaXRpb24gaW4gdGhlIHBhcmVudCBpcyBub3QgZXF1YWwgdG8gZmlyc3QvbGFzdCBvbmUuICovCisJaWYgKCBjX2xyX3BhciA9PSBSSUdIVF9QQVJFTlRTICkKKwkgICAgbl9maXJzdF9sYXN0X3Bvc2l0aW9uID0gQl9OUl9JVEVNUyAocF9zX3BhcmVudCk7CisJaWYgKCBuX3Bvc2l0aW9uICE9IG5fZmlyc3RfbGFzdF9wb3NpdGlvbiApIHsKKwkgICAgKnBwX3NfY29tX2ZhdGhlciA9IHBfc19wYXJlbnQ7CisJICAgIGdldF9iaCgqcHBfc19jb21fZmF0aGVyKSA7CisJICAgIC8qKCpwcF9zX2NvbV9mYXRoZXIgPSBwX3NfcGFyZW50KS0+Yl9jb3VudCsrOyovCisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICAvKiBpZiB3ZSBhcmUgaW4gdGhlIHJvb3Qgb2YgdGhlIHRyZWUsIHRoZW4gdGhlcmUgaXMgbm8gY29tbW9uIGZhdGhlciAqLworICAgIGlmICggbl9jb3VudGVyID09IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgKSB7CisJLyogQ2hlY2sgd2hldGhlciBmaXJzdCBidWZmZXIgaW4gdGhlIHBhdGggaXMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUuICovCisJaWYgKCBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc190Yi0+dGJfcGF0aCwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCktPmJfYmxvY2tuciA9PQorCSAgICAgU0JfUk9PVF9CTE9DSyAocF9zX3RiLT50Yl9zYikgKSB7CisJICAgICpwcF9zX2ZhdGhlciA9ICpwcF9zX2NvbV9mYXRoZXIgPSBOVUxMOworCSAgICByZXR1cm4gQ0FSUllfT047CisJfQorCXJldHVybiBSRVBFQVRfU0VBUkNIOworICAgIH0KKworICAgIFJGQUxTRSggQl9MRVZFTCAoKnBwX3NfY29tX2ZhdGhlcikgPD0gRElTS19MRUFGX05PREVfTEVWRUwsCisJICAgICJQQVAtODE4NTogKCViICV6KSBsZXZlbCB0b28gc21hbGwiLCAKKwkgICAgKnBwX3NfY29tX2ZhdGhlciwgKnBwX3NfY29tX2ZhdGhlcik7CisKKyAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBjb21tb24gcGFyZW50IGlzIGxvY2tlZC4gKi8KKworICAgIGlmICggYnVmZmVyX2xvY2tlZCAoKnBwX3NfY29tX2ZhdGhlcikgKSB7CisJX193YWl0X29uX2J1ZmZlcigqcHBfc19jb21fZmF0aGVyKTsKKwlpZiAoIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAocF9zX3RiKSApIHsKKwkgICAgZGVjcmVtZW50X2Jjb3VudCgqcHBfc19jb21fZmF0aGVyKTsKKwkgICAgcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJfQorICAgIH0KKworICAgIC8qIFNvLCB3ZSBnb3QgY29tbW9uIHBhcmVudCBvZiB0aGUgY3VycmVudCBub2RlIGFuZCBpdHMgbGVmdC9yaWdodCBuZWlnaGJvci4KKyAgICAgTm93IHdlIGFyZSBnZXRpbmcgdGhlIHBhcmVudCBvZiB0aGUgbGVmdC9yaWdodCBuZWlnaGJvci4gKi8KKworICAgIC8qIEZvcm0ga2V5IHRvIGdldCBwYXJlbnQgb2YgdGhlIGxlZnQvcmlnaHQgbmVpZ2hib3IuICovCisgICAgbGVfa2V5MmNwdV9rZXkgKCZzX2xyX2ZhdGhlcl9rZXksIEJfTl9QREVMSU1fS0VZKCpwcF9zX2NvbV9mYXRoZXIsICggY19scl9wYXIgPT0gTEVGVF9QQVJFTlRTICkgPworCQkJCQkJICAgICAocF9zX3RiLT5sa2V5W25faCAtIDFdID0gbl9wb3NpdGlvbiAtIDEpIDogKHBfc190Yi0+cmtleVtuX2ggLSAxXSA9IG5fcG9zaXRpb24pKSk7CisKKworICAgIGlmICggY19scl9wYXIgPT0gTEVGVF9QQVJFTlRTICkKKwlkZWNyZW1lbnRfa2V5KCZzX2xyX2ZhdGhlcl9rZXkpOworCisgICAgaWYgKHNlYXJjaF9ieV9rZXkocF9zX3RiLT50Yl9zYiwgJnNfbHJfZmF0aGVyX2tleSwgJnNfcGF0aF90b19uZWlnaGJvcl9mYXRoZXIsIG5faCArIDEpID09IElPX0VSUk9SKQorCS8vIHBhdGggaXMgcmVsZWFzZWQKKwlyZXR1cm4gSU9fRVJST1I7CisKKyAgICBpZiAoIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAocF9zX3RiKSApIHsKKwlkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aCgmc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlcik7CisJZGVjcmVtZW50X2Jjb3VudCgqcHBfc19jb21fZmF0aGVyKTsKKwlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKyAgICB9CisKKyAgICAqcHBfc19mYXRoZXIgPSBQQVRIX1BMQVNUX0JVRkZFUigmc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlcik7CisKKyAgICBSRkFMU0UoIEJfTEVWRUwgKCpwcF9zX2ZhdGhlcikgIT0gbl9oICsgMSwKKwkgICAgIlBBUC04MTkwOiAoJWIgJXopIGxldmVsIHRvbyBzbWFsbCIsICpwcF9zX2ZhdGhlciwgKnBwX3NfZmF0aGVyKTsKKyAgICBSRkFMU0UoIHNfcGF0aF90b19uZWlnaGJvcl9mYXRoZXIucGF0aF9sZW5ndGggPCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VULAorCSAgICAiUEFQLTgxOTI6IHBhdGggbGVuZ3RoIGlzIHRvbyBzbWFsbCIpOworCisgICAgc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlci5wYXRoX2xlbmd0aC0tOworICAgIGRlY3JlbWVudF9jb3VudGVyc19pbl9wYXRoKCZzX3BhdGhfdG9fbmVpZ2hib3JfZmF0aGVyKTsKKyAgICByZXR1cm4gQ0FSUllfT047Cit9CisKKworLyogR2V0IHBhcmVudHMgb2YgbmVpZ2hib3JzIG9mIG5vZGUgaW4gdGhlIHBhdGgoU1tuX3BhdGhfb2Zmc2V0XSkgYW5kIGNvbW1vbiBwYXJlbnRzIG9mCisgKiBTW25fcGF0aF9vZmZzZXRdIGFuZCBMW25fcGF0aF9vZmZzZXRdL1Jbbl9wYXRoX29mZnNldF06IEZbbl9wYXRoX29mZnNldF0sIEZMW25fcGF0aF9vZmZzZXRdLAorICogRlJbbl9wYXRoX29mZnNldF0sIENGTFtuX3BhdGhfb2Zmc2V0XSwgQ0ZSW25fcGF0aF9vZmZzZXRdLgorICogQ2FsY3VsYXRlIG51bWJlcnMgb2YgbGVmdCBhbmQgcmlnaHQgZGVsaW1pdGluZyBrZXlzIHBvc2l0aW9uOiBsa2V5W25fcGF0aF9vZmZzZXRdLCBya2V5W25fcGF0aF9vZmZzZXRdLgorICogUmV0dXJuczoJU0NIRURVTEVfT0NDVVJSRUQgLSBzY2hlZHVsZSBvY2N1cnJlZCB3aGlsZSB0aGUgZnVuY3Rpb24gd29ya2VkOworICoJICAgICAgICBDQVJSWV9PTiAtIHNjaGVkdWxlIGRpZG4ndCBvY2N1ciB3aGlsZSB0aGUgZnVuY3Rpb24gd29ya2VkOworICovCitzdGF0aWMgaW50ICBnZXRfcGFyZW50cyAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHBfc190YiwgaW50IG5faCkKK3sKKyAgICBzdHJ1Y3QgcGF0aCAgICAgICAgICogcF9zX3BhdGggPSBwX3NfdGItPnRiX3BhdGg7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIG5fcG9zaXRpb24sCisJbl9yZXRfdmFsdWUsCisJbl9wYXRoX29mZnNldCA9IFBBVEhfSF9QQVRIX09GRlNFVChwX3NfdGItPnRiX3BhdGgsIG5faCk7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19jdXJmLAorCSogcF9zX2N1cmNmOworCisgICAgLyogQ3VycmVudCBub2RlIGlzIHRoZSByb290IG9mIHRoZSB0cmVlIG9yIHdpbGwgYmUgcm9vdCBvZiB0aGUgdHJlZSAqLworICAgIGlmICggbl9wYXRoX29mZnNldCA8PSBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUICkgeworCS8qIFRoZSByb290IGNhbiBub3QgaGF2ZSBwYXJlbnRzLgorCSAgIFJlbGVhc2Ugbm9kZXMgd2hpY2ggcHJldmlvdXNseSB3ZXJlIG9idGFpbmVkIGFzIHBhcmVudHMgb2YgdGhlIGN1cnJlbnQgbm9kZSBuZWlnaGJvcnMuICovCisJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkZMW25faF0pOworCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5DRkxbbl9oXSk7CisJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkZSW25faF0pOworCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5DRlJbbl9oXSk7CisJcF9zX3RiLT5GTFtuX2hdID0gcF9zX3RiLT5DRkxbbl9oXSA9IHBfc190Yi0+RlJbbl9oXSA9IHBfc190Yi0+Q0ZSW25faF0gPSBOVUxMOworCXJldHVybiBDQVJSWV9PTjsKKyAgICB9CisgIAorICAgIC8qIEdldCBwYXJlbnQgRkxbbl9wYXRoX29mZnNldF0gb2YgTFtuX3BhdGhfb2Zmc2V0XS4gKi8KKyAgICBpZiAoIChuX3Bvc2l0aW9uID0gUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKSkgKSAgeworCS8qIEN1cnJlbnQgbm9kZSBpcyBub3QgdGhlIGZpcnN0IGNoaWxkIG9mIGl0cyBwYXJlbnQuICovCisJLyoocF9zX2N1cmYgPSBwX3NfY3VyY2YgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSkpLT5iX2NvdW50ICs9IDI7Ki8KKwlwX3NfY3VyZiA9IHBfc19jdXJjZiA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKTsKKwlnZXRfYmgocF9zX2N1cmYpIDsKKwlnZXRfYmgocF9zX2N1cmYpIDsKKwlwX3NfdGItPmxrZXlbbl9oXSA9IG5fcG9zaXRpb24gLSAxOworICAgIH0KKyAgICBlbHNlICB7CisJLyogQ2FsY3VsYXRlIGN1cnJlbnQgcGFyZW50IG9mIExbbl9wYXRoX29mZnNldF0sIHdoaWNoIGlzIHRoZSBsZWZ0IG5laWdoYm9yIG9mIHRoZSBjdXJyZW50IG5vZGUuCisJICAgQ2FsY3VsYXRlIGN1cnJlbnQgY29tbW9uIHBhcmVudCBvZiBMW25fcGF0aF9vZmZzZXRdIGFuZCB0aGUgY3VycmVudCBub2RlLiBOb3RlIHRoYXQKKwkgICBDRkxbbl9wYXRoX29mZnNldF0gbm90IGVxdWFsIEZMW25fcGF0aF9vZmZzZXRdIGFuZCBDRkxbbl9wYXRoX29mZnNldF0gbm90IGVxdWFsIEZbbl9wYXRoX29mZnNldF0uCisJICAgQ2FsY3VsYXRlIGxrZXlbbl9wYXRoX29mZnNldF0uICovCisJaWYgKCAobl9yZXRfdmFsdWUgPSBnZXRfZmFyX3BhcmVudChwX3NfdGIsIG5faCArIDEsICZwX3NfY3VyZiwKKwkJCQkJICAgJnBfc19jdXJjZiwgTEVGVF9QQVJFTlRTKSkgIT0gQ0FSUllfT04gKQorCSAgICByZXR1cm4gbl9yZXRfdmFsdWU7CisgICAgfQorCisgICAgZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkZMW25faF0pOworICAgIHBfc190Yi0+Rkxbbl9oXSA9IHBfc19jdXJmOyAvKiBOZXcgaW5pdGlhbGl6YXRpb24gb2YgRkxbbl9oXS4gKi8KKyAgICBkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Q0ZMW25faF0pOworICAgIHBfc190Yi0+Q0ZMW25faF0gPSBwX3NfY3VyY2Y7IC8qIE5ldyBpbml0aWFsaXphdGlvbiBvZiBDRkxbbl9oXS4gKi8KKworICAgIFJGQUxTRSggKHBfc19jdXJmICYmICFCX0lTX0lOX1RSRUUgKHBfc19jdXJmKSkgfHwgCisJICAgIChwX3NfY3VyY2YgJiYgIUJfSVNfSU5fVFJFRSAocF9zX2N1cmNmKSksCisJICAgICJQQVAtODE5NTogRkwgKCViKSBvciBDRkwgKCViKSBpcyBpbnZhbGlkIiwgcF9zX2N1cmYsIHBfc19jdXJjZik7CisKKy8qIEdldCBwYXJlbnQgRlJbbl9oXSBvZiBSW25faF0uICovCisKKy8qIEN1cnJlbnQgbm9kZSBpcyB0aGUgbGFzdCBjaGlsZCBvZiBGW25faF0uIEZSW25faF0gIT0gRltuX2hdLiAqLworICAgIGlmICggbl9wb3NpdGlvbiA9PSBCX05SX0lURU1TIChQQVRIX0hfUEJVRkZFUihwX3NfcGF0aCwgbl9oICsgMSkpICkgeworLyogQ2FsY3VsYXRlIGN1cnJlbnQgcGFyZW50IG9mIFJbbl9oXSwgd2hpY2ggaXMgdGhlIHJpZ2h0IG5laWdoYm9yIG9mIEZbbl9oXS4KKyAgIENhbGN1bGF0ZSBjdXJyZW50IGNvbW1vbiBwYXJlbnQgb2YgUltuX2hdIGFuZCBjdXJyZW50IG5vZGUuIE5vdGUgdGhhdCBDRlJbbl9oXQorICAgbm90IGVxdWFsIEZSW25fcGF0aF9vZmZzZXRdIGFuZCBDRlJbbl9oXSBub3QgZXF1YWwgRltuX2hdLiAqLworCWlmICggKG5fcmV0X3ZhbHVlID0gZ2V0X2Zhcl9wYXJlbnQocF9zX3RiLCBuX2ggKyAxLCAmcF9zX2N1cmYsICAmcF9zX2N1cmNmLCBSSUdIVF9QQVJFTlRTKSkgIT0gQ0FSUllfT04gKQorCSAgICByZXR1cm4gbl9yZXRfdmFsdWU7CisgICAgfQorICAgIGVsc2UgeworLyogQ3VycmVudCBub2RlIGlzIG5vdCB0aGUgbGFzdCBjaGlsZCBvZiBpdHMgcGFyZW50IEZbbl9oXS4gKi8KKwkvKihwX3NfY3VyZiA9IHBfc19jdXJjZiA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKSktPmJfY291bnQgKz0gMjsqLworCXBfc19jdXJmID0gcF9zX2N1cmNmID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCAtIDEpOworCWdldF9iaChwX3NfY3VyZikgOworCWdldF9iaChwX3NfY3VyZikgOworCXBfc190Yi0+cmtleVtuX2hdID0gbl9wb3NpdGlvbjsKKyAgICB9CQorCisgICAgZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkZSW25faF0pOworICAgIHBfc190Yi0+RlJbbl9oXSA9IHBfc19jdXJmOyAvKiBOZXcgaW5pdGlhbGl6YXRpb24gb2YgRlJbbl9wYXRoX29mZnNldF0uICovCisgICAgCisgICAgZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkNGUltuX2hdKTsKKyAgICBwX3NfdGItPkNGUltuX2hdID0gcF9zX2N1cmNmOyAvKiBOZXcgaW5pdGlhbGl6YXRpb24gb2YgQ0ZSW25fcGF0aF9vZmZzZXRdLiAqLworCisgICAgUkZBTFNFKCAocF9zX2N1cmYgJiYgIUJfSVNfSU5fVFJFRSAocF9zX2N1cmYpKSB8fAorICAgICAgICAgICAgKHBfc19jdXJjZiAmJiAhQl9JU19JTl9UUkVFIChwX3NfY3VyY2YpKSwKKwkgICAgIlBBUC04MjA1OiBGUiAoJWIpIG9yIENGUiAoJWIpIGlzIGludmFsaWQiLCBwX3NfY3VyZiwgcF9zX2N1cmNmKTsKKworICAgIHJldHVybiBDQVJSWV9PTjsKK30KKworCisvKiBpdCBpcyBwb3NzaWJsZSB0byByZW1vdmUgbm9kZSBhcyByZXN1bHQgb2Ygc2hpZnRpbmdzIHRvCisgICBuZWlnaGJvcnMgZXZlbiB3aGVuIHdlIGluc2VydCBvciBwYXN0ZSBpdGVtLiAqLworc3RhdGljIGlubGluZSBpbnQgY2FuX25vZGVfYmVfcmVtb3ZlZCAoaW50IG1vZGUsIGludCBsZnJlZSwgaW50IHNmcmVlLCBpbnQgcmZyZWUsIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCit7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogU2ggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOworICAgIGludCBsZXZieXRlcyA9IHRiLT5pbnNlcnRfc2l6ZVtoXTsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7CisgICAgc3RydWN0IHJlaXNlcmZzX2tleSAqIHJfa2V5ID0gTlVMTDsKKworICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKFNoLCAwKTsKKyAgICBpZiAoIHRiLT5DRlJbaF0gKQorCXJfa2V5ID0gQl9OX1BERUxJTV9LRVkodGItPkNGUltoXSx0Yi0+cmtleVtoXSk7CisgIAorICAgIGlmICgKKwlsZnJlZSArIHJmcmVlICsgc2ZyZWUgPCBNQVhfQ0hJTERfU0laRShTaCkgKyBsZXZieXRlcworCS8qIHNoaWZ0aW5nIG1heSBtZXJnZSBpdGVtcyB3aGljaCBtaWdodCBzYXZlIHNwYWNlICovCisJLSAoKCAhIGggJiYgb3BfaXNfbGVmdF9tZXJnZWFibGUgKCYoaWgtPmloX2tleSksIFNoLT5iX3NpemUpICkgPyBJSF9TSVpFIDogMCkKKwktICgoICEgaCAmJiByX2tleSAmJiBvcF9pc19sZWZ0X21lcmdlYWJsZSAocl9rZXksIFNoLT5iX3NpemUpICkgPyBJSF9TSVpFIDogMCkKKwkrICgoIGggKSA/IEtFWV9TSVpFIDogMCkpCisgICAgeworCS8qIG5vZGUgY2FuIG5vdCBiZSByZW1vdmVkICovCisJaWYgKHNmcmVlID49IGxldmJ5dGVzICkgeyAvKiBuZXcgaXRlbSBmaXRzIGludG8gbm9kZSBTW2hdIHdpdGhvdXQgYW55IHNoaWZ0aW5nICovCisJICAgIGlmICggISBoICkKKwkJdGItPnMwbnVtID0gQl9OUl9JVEVNUyhTaCkgKyAoKG1vZGUgPT0gTV9JTlNFUlQgKSA/IDEgOiAwKTsKKwkgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOworCSAgICByZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsKKwl9CisgICAgfQorICAgIFBST0NfSU5GT19JTkMoIHRiIC0+IHRiX3NiLCBjYW5fbm9kZV9iZV9yZW1vdmVkWyBoIF0gKTsKKyAgICByZXR1cm4gIU5PX0JBTEFOQ0lOR19ORUVERUQ7Cit9CisKKworCisvKiBDaGVjayB3aGV0aGVyIGN1cnJlbnQgbm9kZSBTW2hdIGlzIGJhbGFuY2VkIHdoZW4gaW5jcmVhc2luZyBpdHMgc2l6ZSBieQorICogSW5zZXJ0aW5nIG9yIFBhc3RpbmcuCisgKiBDYWxjdWxhdGUgcGFyYW1ldGVycyBmb3IgYmFsYW5jaW5nIGZvciBjdXJyZW50IGxldmVsIGguCisgKiBQYXJhbWV0ZXJzOgorICoJdGIJdHJlZV9iYWxhbmNlIHN0cnVjdHVyZTsKKyAqCWgJY3VycmVudCBsZXZlbCBvZiB0aGUgbm9kZTsKKyAqCWludW0JaXRlbSBudW1iZXIgaW4gU1toXTsKKyAqCW1vZGUJaSAtIGluc2VydCwgcCAtIHBhc3RlOworICogUmV0dXJuczoJMSAtIHNjaGVkdWxlIG9jY3VycmVkOyAKKyAqCSAgICAgICAgMCAtIGJhbGFuY2luZyBmb3IgaGlnaGVyIGxldmVscyBuZWVkZWQ7CisgKgkgICAgICAgLTEgLSBubyBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkOworICoJICAgICAgIC0yIC0gbm8gZGlzayBzcGFjZS4KKyAqLworLyogaXAgbWVhbnMgSW5zZXJ0aW5nIG9yIFBhc3RpbmcgKi8KK3N0YXRpYyBpbnQgaXBfY2hlY2tfYmFsYW5jZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCkKK3sKKyAgICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4gPSB0Yi0+dGJfdm47CisgICAgaW50IGxldmJ5dGVzLCAgLyogTnVtYmVyIG9mIGJ5dGVzIHRoYXQgbXVzdCBiZSBpbnNlcnRlZCBpbnRvICh2YWx1ZQorCQkgICAgICBpcyBuZWdhdGl2ZSBpZiBieXRlcyBhcmUgZGVsZXRlZCkgYnVmZmVyIHdoaWNoCisJCSAgICAgIGNvbnRhaW5zIG5vZGUgYmVpbmcgYmFsYW5jZWQuICBUaGUgbW5lbW9uaWMgaXMKKwkJICAgICAgdGhhdCB0aGUgYXR0ZW1wdGVkIGNoYW5nZSBpbiBub2RlIHNwYWNlIHVzZWQgbGV2ZWwKKwkJICAgICAgaXMgbGV2Ynl0ZXMgYnl0ZXMuICovCisJbl9yZXRfdmFsdWU7CisKKyAgICBpbnQgbGZyZWUsIHNmcmVlLCByZnJlZSAvKiBmcmVlIHNwYWNlIGluIEwsIFMgYW5kIFIgKi87CisKKyAgICAvKiBudmVyIGlzIHNob3J0IGZvciBudW1iZXIgb2YgdmVydGl4ZXMsIGFuZCBsbnZlciBpcyB0aGUgbnVtYmVyIGlmCisgICAgICAgd2Ugc2hpZnQgdG8gdGhlIGxlZnQsIHJudmVyIGlzIHRoZSBudW1iZXIgaWYgd2Ugc2hpZnQgdG8gdGhlCisgICAgICAgcmlnaHQsIGFuZCBscm52ZXIgaXMgdGhlIG51bWJlciBpZiB3ZSBzaGlmdCBpbiBib3RoIGRpcmVjdGlvbnMuCisgICAgICAgVGhlIGdvYWwgaXMgdG8gbWluaW1pemUgZmlyc3QgdGhlIG51bWJlciBvZiB2ZXJ0aXhlcywgYW5kIHNlY29uZCwKKyAgICAgICB0aGUgbnVtYmVyIG9mIHZlcnRpeGVzIHdob3NlIGNvbnRlbnRzIGFyZSBjaGFuZ2VkIGJ5IHNoaWZ0aW5nLAorICAgICAgIGFuZCB0aGlyZCB0aGUgbnVtYmVyIG9mIHVuY2FjaGVkIHZlcnRpeGVzIHdob3NlIGNvbnRlbnRzIGFyZQorICAgICAgIGNoYW5nZWQgYnkgc2hpZnRpbmcgYW5kIG11c3QgYmUgcmVhZCBmcm9tIGRpc2suICAqLworICAgIGludCBudmVyLCBsbnZlciwgcm52ZXIsIGxybnZlcjsKKworICAgIC8qIHVzZWQgYXQgbGVhZiBsZXZlbCBvbmx5LCBTMCA9IFNbMF0gaXMgdGhlIG5vZGUgYmVpbmcgYmFsYW5jZWQsCisgICAgICAgc0ludW0gWyBJID0gMCwxLDIgXSBpcyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgd2lsbAorICAgICAgIHJlbWFpbiBpbiBub2RlIFNJIGFmdGVyIGJhbGFuY2luZy4gIFMxIGFuZCBTMiBhcmUgbmV3CisgICAgICAgbm9kZXMgdGhhdCBtaWdodCBiZSBjcmVhdGVkLiAqLworICAKKyAgICAvKiB3ZSBwZXJmb3JtIDggY2FsbHMgdG8gZ2V0X251bV92ZXIoKS4gIEZvciBlYWNoIGNhbGwgd2UgY2FsY3VsYXRlIGZpdmUgcGFyYW1ldGVycy4KKyAgICAgICB3aGVyZSA0dGggcGFyYW1ldGVyIGlzIHMxYnl0ZXMgYW5kIDV0aCAtIHMyYnl0ZXMKKyAgICAqLworICAgIHNob3J0IHNudW0wMTJbNDBdID0gezAsfTsJLyogczBudW0sIHMxbnVtLCBzMm51bSBmb3IgOCBjYXNlcyAKKwkJCQkgICAwLDEgLSBkbyBub3Qgc2hpZnQgYW5kIGRvIG5vdCBzaGlmdCBidXQgYm90dGxlCisJCQkJICAgMiAtIHNoaWZ0IG9ubHkgd2hvbGUgaXRlbSB0byBsZWZ0CisJCQkJICAgMyAtIHNoaWZ0IHRvIGxlZnQgYW5kIGJvdHRsZSBhcyBtdWNoIGFzIHBvc3NpYmxlCisJCQkJICAgNCw1IC0gc2hpZnQgdG8gcmlnaHQJKHdob2xlIGl0ZW1zIGFuZCBhcyBtdWNoIGFzIHBvc3NpYmxlCisJCQkJICAgNiw3IC0gc2hpZnQgdG8gYm90aCBkaXJlY3Rpb25zICh3aG9sZSBpdGVtcyBhbmQgYXMgbXVjaCBhcyBwb3NzaWJsZSkKKwkJCQkqLworCisgICAgLyogU2ggaXMgdGhlIG5vZGUgd2hvc2UgYmFsYW5jZSBpcyBjdXJyZW50bHkgYmVpbmcgY2hlY2tlZCAqLworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIFNoOworICAKKyAgICBTaCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCk7CisgICAgbGV2Ynl0ZXMgPSB0Yi0+aW5zZXJ0X3NpemVbaF07CisgIAorICAgIC8qIENhbGN1bGF0ZSBiYWxhbmNlIHBhcmFtZXRlcnMgZm9yIGNyZWF0aW5nIG5ldyByb290LiAqLworICAgIGlmICggISBTaCApICB7CisJaWYgKCAhIGggKQorCSAgICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAidnMtODIxMDogaXBfY2hlY2tfYmFsYW5jZTogU1swXSBjYW4gbm90IGJlIDAiKTsKKwlzd2l0Y2ggKCBuX3JldF92YWx1ZSA9IGdldF9lbXB0eV9ub2RlcyAodGIsIGgpICkgIHsKKwljYXNlIENBUlJZX09OOgorCSAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIDAsIDEsIE5VTEwsIC0xLCAtMSk7CisJICAgIHJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOyAvKiBubyBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkICovCisKKwljYXNlIE5PX0RJU0tfU1BBQ0U6CisJY2FzZSBSRVBFQVRfU0VBUkNIOgorCSAgICByZXR1cm4gbl9yZXRfdmFsdWU7CisJZGVmYXVsdDogICAKKwkgICAgcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLCAidnMtODIxNTogaXBfY2hlY2tfYmFsYW5jZTogaW5jb3JyZWN0IHJldHVybiB2YWx1ZSBvZiBnZXRfZW1wdHlfbm9kZXMiKTsKKwl9CisgICAgfQorICAKKyAgICBpZiAoIChuX3JldF92YWx1ZSA9IGdldF9wYXJlbnRzICh0YiwgaCkpICE9IENBUlJZX09OICkgLyogZ2V0IHBhcmVudHMgb2YgU1toXSBuZWlnaGJvcnMuICovCisJcmV0dXJuIG5fcmV0X3ZhbHVlOworICAKKyAgICBzZnJlZSA9IEJfRlJFRV9TUEFDRSAoU2gpOworCisgICAgLyogZ2V0IGZyZWUgc3BhY2Ugb2YgbmVpZ2hib3JzICovCisgICAgcmZyZWUgPSBnZXRfcmZyZWUgKHRiLCBoKTsKKyAgICBsZnJlZSA9IGdldF9sZnJlZSAodGIsIGgpOworCisgICAgaWYgKGNhbl9ub2RlX2JlX3JlbW92ZWQgKHZuLT52bl9tb2RlLCBsZnJlZSwgc2ZyZWUsIHJmcmVlLCB0YiwgaCkgPT0gTk9fQkFMQU5DSU5HX05FRURFRCkKKwkvKiBhbmQgbmV3IGl0ZW0gZml0cyBpbnRvIG5vZGUgU1toXSB3aXRob3V0IGFueSBzaGlmdGluZyAqLworCXJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOworICAgICAKKyAgICBjcmVhdGVfdmlydHVhbF9ub2RlICh0YiwgaCk7CisKKyAgICAvKgkKKwlkZXRlcm1pbmUgbWF4aW1hbCBudW1iZXIgb2YgaXRlbXMgd2UgY2FuIHNoaWZ0IHRvIHRoZSBsZWZ0IG5laWdoYm9yIChpbiB0YiBzdHJ1Y3R1cmUpCisJYW5kIHRoZSBtYXhpbWFsIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBmbG93IHRvIHRoZSBsZWZ0IG5laWdoYm9yCisJZnJvbSB0aGUgbGVmdCBtb3N0IGxpcXVpZCBpdGVtIHRoYXQgY2Fubm90IGJlIHNoaWZ0ZWQgZnJvbSBTWzBdIGVudGlyZWx5IChyZXR1cm5lZCB2YWx1ZSkKKyAgICAqLworICAgIGNoZWNrX2xlZnQgKHRiLCBoLCBsZnJlZSk7CisKKyAgICAvKgorICAgICAgZGV0ZXJtaW5lIG1heGltYWwgbnVtYmVyIG9mIGl0ZW1zIHdlIGNhbiBzaGlmdCB0byB0aGUgcmlnaHQgbmVpZ2hib3IgKGluIHRiIHN0cnVjdHVyZSkKKyAgICAgIGFuZCB0aGUgbWF4aW1hbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gZmxvdyB0byB0aGUgcmlnaHQgbmVpZ2hib3IKKyAgICAgIGZyb20gdGhlIHJpZ2h0IG1vc3QgbGlxdWlkIGl0ZW0gdGhhdCBjYW5ub3QgYmUgc2hpZnRlZCBmcm9tIFNbMF0gZW50aXJlbHkgKHJldHVybmVkIHZhbHVlKQorICAgICovCisgICAgY2hlY2tfcmlnaHQgKHRiLCBoLCByZnJlZSk7CisKKworICAgIC8qIGFsbCBjb250ZW50cyBvZiBpbnRlcm5hbCBub2RlIFNbaF0gY2FuIGJlIG1vdmVkIGludG8gaXRzCisgICAgICAgbmVpZ2hib3JzLCBTW2hdIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciBiYWxhbmNpbmcgKi8KKyAgICBpZiAoaCAmJiAodGItPnJudW1baF0gKyB0Yi0+bG51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpKSB7CisJaW50IHRvX3I7IAorICAgICAgIAorCS8qIFNpbmNlIHdlIGFyZSB3b3JraW5nIG9uIGludGVybmFsIG5vZGVzLCBhbmQgb3VyIGludGVybmFsCisJICAgbm9kZXMgaGF2ZSBmaXhlZCBzaXplIGVudHJpZXMsIHRoZW4gd2UgY2FuIGJhbGFuY2UgYnkgdGhlCisJICAgbnVtYmVyIG9mIGl0ZW1zIHJhdGhlciB0aGFuIHRoZSBzcGFjZSB0aGV5IGNvbnN1bWUuICBJbiB0aGlzCisJICAgcm91dGluZSB3ZSBzZXQgdGhlIGxlZnQgbm9kZSBlcXVhbCB0byB0aGUgcmlnaHQgbm9kZSwKKwkgICBhbGxvd2luZyBhIGRpZmZlcmVuY2Ugb2YgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEgY2hpbGQKKwkgICBwb2ludGVyLiAqLworCXRvX3IgPSAoKE1BWF9OUl9LRVkoU2gpPDwxKSsyLXRiLT5sbnVtW2hdLXRiLT5ybnVtW2hdK3ZuLT52bl9ucl9pdGVtKzEpLzIgLSAKKwkgICAgKE1BWF9OUl9LRVkoU2gpICsgMSAtIHRiLT5ybnVtW2hdKTsKKwlzZXRfcGFyYW1ldGVycyAodGIsIGgsIHZuLT52bl9ucl9pdGVtICsgMSAtIHRvX3IsIHRvX3IsIDAsIE5VTEwsIC0xLCAtMSk7CisJcmV0dXJuIENBUlJZX09OOworICAgIH0KKworICAgIC8qIHRoaXMgY2hlY2tzIGJhbGFuY2UgY29uZGl0aW9uLCB0aGF0IGFueSB0d28gbmVpZ2hib3Jpbmcgbm9kZXMgY2FuIG5vdCBmaXQgaW4gb25lIG5vZGUgKi8KKyAgICBSRkFMU0UoIGggJiYgCisJICAgICggdGItPmxudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gKyAxIHx8IAorCSAgICAgIHRiLT5ybnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSksCisJICAgICJ2cy04MjIwOiB0cmVlIGlzIG5vdCBiYWxhbmNlZCBvbiBpbnRlcm5hbCBsZXZlbCIpOworICAgIFJGQUxTRSggISBoICYmICgodGItPmxudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gJiYgKHRiLT5sYnl0ZXMgPT0gLTEpKSB8fAorCQkgICAgKHRiLT5ybnVtW2hdID49IHZuLT52bl9ucl9pdGVtICYmICh0Yi0+cmJ5dGVzID09IC0xKSkgKSwKKwkgICAgInZzLTgyMjU6IHRyZWUgaXMgbm90IGJhbGFuY2VkIG9uIGxlYWYgbGV2ZWwiKTsKKworICAgIC8qIGFsbCBjb250ZW50cyBvZiBTWzBdIGNhbiBiZSBtb3ZlZCBpbnRvIGl0cyBuZWlnaGJvcnMKKyAgICAgICBTWzBdIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciBiYWxhbmNpbmcuICovCisgICAgaWYgKCFoICYmIGlzX2xlYWZfcmVtb3ZhYmxlICh0YikpCisJcmV0dXJuIENBUlJZX09OOworCisKKyAgICAvKiB3aHkgZG8gd2UgcGVyZm9ybSB0aGlzIGNoZWNrIGhlcmUgcmF0aGVyIHRoYW4gZWFybGllcj8/CisgICAgICAgQW5zd2VyOiB3ZSBjYW4gd2luIDEgbm9kZSBpbiBzb21lIGNhc2VzIGFib3ZlLiBNb3Jlb3ZlciB3ZQorICAgICAgIGNoZWNrZWQgaXQgYWJvdmUsIHdoZW4gd2UgY2hlY2tlZCwgdGhhdCBTWzBdIGlzIG5vdCByZW1vdmFibGUKKyAgICAgICBpbiBwcmluY2lwbGUgKi8KKyAgICBpZiAoc2ZyZWUgPj0gbGV2Ynl0ZXMpIHsgLyogbmV3IGl0ZW0gZml0cyBpbnRvIG5vZGUgU1toXSB3aXRob3V0IGFueSBzaGlmdGluZyAqLworCWlmICggISBoICkKKwkgICAgdGItPnMwbnVtID0gdm4tPnZuX25yX2l0ZW07CisJc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOworCXJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOworICAgIH0KKworCisgICAgeworCWludCBscGFyLCBycGFyLCBuc2V0LCBsc2V0LCByc2V0LCBscnNldDsKKwkvKiAKKwkgKiByZWd1bGFyIG92ZXJmbG93aW5nIG9mIHRoZSBub2RlCisJICovCisKKwkvKiBnZXRfbnVtX3ZlciB3b3JrcyBpbiAyIG1vZGVzIChGTE9XICYgTk9fRkxPVykgCisJICAgbHBhciwgcnBhciAtIG51bWJlciBvZiBpdGVtcyB3ZSBjYW4gc2hpZnQgdG8gbGVmdC9yaWdodCBuZWlnaGJvciAoaW5jbHVkaW5nIHNwbGl0dGluZyBpdGVtKQorCSAgIG5zZXQsIGxzZXQsIHJzZXQsIGxyc2V0IC0gc2hvd3MsIHdoZXRoZXIgZmxvd2luZyBpdGVtcyBnaXZlIGJldHRlciBwYWNraW5nIAorCSovCisjZGVmaW5lIEZMT1cgMQorI2RlZmluZSBOT19GTE9XIDAJLyogZG8gbm90IGFueSBzcGxpdHRpbmcgKi8KKworCS8qIHdlIGNob29zZSBvbmUgdGhlIGZvbGxvd2luZyAqLworI2RlZmluZSBOT1RISU5HX1NISUZUX05PX0ZMT1cJMAorI2RlZmluZSBOT1RISU5HX1NISUZUX0ZMT1cJNQorI2RlZmluZSBMRUZUX1NISUZUX05PX0ZMT1cJMTAKKyNkZWZpbmUgTEVGVF9TSElGVF9GTE9XCQkxNQorI2RlZmluZSBSSUdIVF9TSElGVF9OT19GTE9XCTIwCisjZGVmaW5lIFJJR0hUX1NISUZUX0ZMT1cJMjUKKyNkZWZpbmUgTFJfU0hJRlRfTk9fRkxPVwkzMAorI2RlZmluZSBMUl9TSElGVF9GTE9XCQkzNQorCisKKwlscGFyID0gdGItPmxudW1baF07CisJcnBhciA9IHRiLT5ybnVtW2hdOworCisKKwkvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGJsb2NrcyBTW2hdIG11c3QgYmUgc3BsaXQgaW50byB3aGVuCisJICAgbm90aGluZyBpcyBzaGlmdGVkIHRvIHRoZSBuZWlnaGJvcnMsCisJICAgYXMgd2VsbCBhcyBudW1iZXIgb2YgaXRlbXMgaW4gZWFjaCBwYXJ0IG9mIHRoZSBzcGxpdCBub2RlIChzMDEyIG51bWJlcnMpLAorCSAgIGFuZCBudW1iZXIgb2YgYnl0ZXMgKHMxYnl0ZXMpIG9mIHRoZSBzaGFyZWQgZHJvcCB3aGljaCBmbG93IHRvIFMxIGlmIGFueSAqLworCW5zZXQgPSBOT1RISU5HX1NISUZUX05PX0ZMT1c7CisJbnZlciA9IGdldF9udW1fdmVyICh2bi0+dm5fbW9kZSwgdGIsIGgsCisJCQkgICAgMCwgLTEsIGg/dm4tPnZuX25yX2l0ZW06MCwgLTEsIAorCQkJICAgIHNudW0wMTIsIE5PX0ZMT1cpOworCisJaWYgKCFoKQorCXsKKwkgICAgaW50IG52ZXIxOworCisJICAgIC8qIG5vdGUsIHRoYXQgaW4gdGhpcyBjYXNlIHdlIHRyeSB0byBib3R0bGUgYmV0d2VlbiBTWzBdIGFuZCBTMSAoUzEgLSB0aGUgZmlyc3QgbmV3IG5vZGUpICovCisJICAgIG52ZXIxID0gZ2V0X251bV92ZXIgKHZuLT52bl9tb2RlLCB0YiwgaCwgCisJCQkJIDAsIC0xLCAwLCAtMSwgCisJCQkJIHNudW0wMTIgKyBOT1RISU5HX1NISUZUX0ZMT1csIEZMT1cpOworCSAgICBpZiAobnZlciA+IG52ZXIxKQorCQluc2V0ID0gTk9USElOR19TSElGVF9GTE9XLCBudmVyID0gbnZlcjE7CisJfQorICAgICAgIAorIAorCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgYmxvY2tzIFNbaF0gbXVzdCBiZSBzcGxpdCBpbnRvIHdoZW4KKwkgICBsX3NoaWZ0X251bSBmaXJzdCBpdGVtcyBhbmQgbF9zaGlmdF9ieXRlcyBvZiB0aGUgcmlnaHQgbW9zdAorCSAgIGxpcXVpZCBpdGVtIHRvIGJlIHNoaWZ0ZWQgYXJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgbmVpZ2hib3IsCisJICAgYXMgd2VsbCBhcyBudW1iZXIgb2YgaXRlbXMgaW4gZWFjaCBwYXJ0IG9mIHRoZSBzcGxpdHRlZCBub2RlIChzMDEyIG51bWJlcnMpLAorCSAgIGFuZCBudW1iZXIgb2YgYnl0ZXMgKHMxYnl0ZXMpIG9mIHRoZSBzaGFyZWQgZHJvcCB3aGljaCBmbG93IHRvIFMxIGlmIGFueQorCSovCisJbHNldCA9IExFRlRfU0hJRlRfTk9fRkxPVzsKKwlsbnZlciA9IGdldF9udW1fdmVyICh2bi0+dm5fbW9kZSwgdGIsIGgsIAorCQkJICAgICBscGFyIC0gKCggaCB8fCB0Yi0+bGJ5dGVzID09IC0xICkgPyAwIDogMSksIC0xLCBoID8gdm4tPnZuX25yX2l0ZW06MCwgLTEsCisJCQkgICAgIHNudW0wMTIgKyBMRUZUX1NISUZUX05PX0ZMT1csIE5PX0ZMT1cpOworCWlmICghaCkKKwl7CisJICAgIGludCBsbnZlcjE7CisKKwkgICAgbG52ZXIxID0gZ2V0X251bV92ZXIgKHZuLT52bl9tb2RlLCB0YiwgaCwgCisJCQkJICBscGFyIC0gKCh0Yi0+bGJ5dGVzICE9IC0xKSA/IDEgOiAwKSwgdGItPmxieXRlcywgMCwgLTEsCisJCQkJICBzbnVtMDEyICsgTEVGVF9TSElGVF9GTE9XLCBGTE9XKTsKKwkgICAgaWYgKGxudmVyID4gbG52ZXIxKQorCQlsc2V0ID0gTEVGVF9TSElGVF9GTE9XLCBsbnZlciA9IGxudmVyMTsKKwl9CisKKworCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgYmxvY2tzIFNbaF0gbXVzdCBiZSBzcGxpdCBpbnRvIHdoZW4KKwkgICByX3NoaWZ0X251bSBmaXJzdCBpdGVtcyBhbmQgcl9zaGlmdF9ieXRlcyBvZiB0aGUgbGVmdCBtb3N0CisJICAgbGlxdWlkIGl0ZW0gdG8gYmUgc2hpZnRlZCBhcmUgc2hpZnRlZCB0byB0aGUgcmlnaHQgbmVpZ2hib3IsCisJICAgYXMgd2VsbCBhcyBudW1iZXIgb2YgaXRlbXMgaW4gZWFjaCBwYXJ0IG9mIHRoZSBzcGxpdHRlZCBub2RlIChzMDEyIG51bWJlcnMpLAorCSAgIGFuZCBudW1iZXIgb2YgYnl0ZXMgKHMxYnl0ZXMpIG9mIHRoZSBzaGFyZWQgZHJvcCB3aGljaCBmbG93IHRvIFMxIGlmIGFueQorCSovCisJcnNldCA9IFJJR0hUX1NISUZUX05PX0ZMT1c7CisJcm52ZXIgPSBnZXRfbnVtX3ZlciAodm4tPnZuX21vZGUsIHRiLCBoLCAKKwkJCSAgICAgMCwgLTEsIGggPyAodm4tPnZuX25yX2l0ZW0tcnBhcikgOiAocnBhciAtICgoIHRiLT5yYnl0ZXMgIT0gLTEgKSA/IDEgOiAwKSksIC0xLCAKKwkJCSAgICAgc251bTAxMiArIFJJR0hUX1NISUZUX05PX0ZMT1csIE5PX0ZMT1cpOworCWlmICghaCkKKwl7CisJICAgIGludCBybnZlcjE7CisKKwkgICAgcm52ZXIxID0gZ2V0X251bV92ZXIgKHZuLT52bl9tb2RlLCB0YiwgaCwgCisJCQkJICAwLCAtMSwgKHJwYXIgLSAoKHRiLT5yYnl0ZXMgIT0gLTEpID8gMSA6IDApKSwgdGItPnJieXRlcywgCisJCQkJICBzbnVtMDEyICsgUklHSFRfU0hJRlRfRkxPVywgRkxPVyk7CisKKwkgICAgaWYgKHJudmVyID4gcm52ZXIxKQorCQlyc2V0ID0gUklHSFRfU0hJRlRfRkxPVywgcm52ZXIgPSBybnZlcjE7CisJfQorCisKKwkvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGJsb2NrcyBTW2hdIG11c3QgYmUgc3BsaXQgaW50byB3aGVuCisJICAgaXRlbXMgYXJlIHNoaWZ0ZWQgaW4gYm90aCBkaXJlY3Rpb25zLAorCSAgIGFzIHdlbGwgYXMgbnVtYmVyIG9mIGl0ZW1zIGluIGVhY2ggcGFydCBvZiB0aGUgc3BsaXR0ZWQgbm9kZSAoczAxMiBudW1iZXJzKSwKKwkgICBhbmQgbnVtYmVyIG9mIGJ5dGVzIChzMWJ5dGVzKSBvZiB0aGUgc2hhcmVkIGRyb3Agd2hpY2ggZmxvdyB0byBTMSBpZiBhbnkKKwkqLworCWxyc2V0ID0gTFJfU0hJRlRfTk9fRkxPVzsKKwlscm52ZXIgPSBnZXRfbnVtX3ZlciAodm4tPnZuX21vZGUsIHRiLCBoLCAKKwkJCSAgICAgIGxwYXIgLSAoKGggfHwgdGItPmxieXRlcyA9PSAtMSkgPyAwIDogMSksIC0xLCBoID8gKHZuLT52bl9ucl9pdGVtLXJwYXIpOihycGFyIC0gKCh0Yi0+cmJ5dGVzICE9IC0xKSA/IDEgOiAwKSksIC0xLAorCQkJICAgICAgc251bTAxMiArIExSX1NISUZUX05PX0ZMT1csIE5PX0ZMT1cpOworCWlmICghaCkKKwl7CisJICAgIGludCBscm52ZXIxOworCisJICAgIGxybnZlcjEgPSBnZXRfbnVtX3ZlciAodm4tPnZuX21vZGUsIHRiLCBoLCAKKwkJCQkgICBscGFyIC0gKCh0Yi0+bGJ5dGVzICE9IC0xKSA/IDEgOiAwKSwgdGItPmxieXRlcywgKHJwYXIgLSAoKHRiLT5yYnl0ZXMgIT0gLTEpID8gMSA6IDApKSwgdGItPnJieXRlcywKKwkJCQkgICBzbnVtMDEyICsgTFJfU0hJRlRfRkxPVywgRkxPVyk7CisJICAgIGlmIChscm52ZXIgPiBscm52ZXIxKQorCQlscnNldCA9IExSX1NISUZUX0ZMT1csIGxybnZlciA9IGxybnZlcjE7CisJfQorCisKKworCS8qIE91ciBnZW5lcmFsIHNoaWZ0aW5nIHN0cmF0ZWd5IGlzOgorCSAgIDEpIHRvIG1pbmltaXplZCBudW1iZXIgb2YgbmV3IG5vZGVzOworCSAgIDIpIHRvIG1pbmltaXplZCBudW1iZXIgb2YgbmVpZ2hib3JzIGludm9sdmVkIGluIHNoaWZ0aW5nOworCSAgIDMpIHRvIG1pbmltaXplZCBudW1iZXIgb2YgZGlzayByZWFkczsgKi8KKworCS8qIHdlIGNhbiB3aW4gVFdPIG9yIE9ORSBub2RlcyBieSBzaGlmdGluZyBpbiBib3RoIGRpcmVjdGlvbnMgKi8KKwlpZiAobHJudmVyIDwgbG52ZXIgJiYgbHJudmVyIDwgcm52ZXIpCisJeworCSAgICBSRkFMU0UoIGggJiYgCisJCSAgICAodGItPmxudW1baF0gIT0gMSB8fCAKKwkJICAgICB0Yi0+cm51bVtoXSAhPSAxIHx8IAorCQkgICAgIGxybnZlciAhPSAxIHx8IHJudmVyICE9IDIgfHwgbG52ZXIgIT0gMiB8fCBoICE9IDEpLAorCQkgICAgInZzLTgyMzA6IGJhZCBoIik7CisJICAgIGlmIChscnNldCA9PSBMUl9TSElGVF9GTE9XKQorCQlzZXRfcGFyYW1ldGVycyAodGIsIGgsIHRiLT5sbnVtW2hdLCB0Yi0+cm51bVtoXSwgbHJudmVyLCBzbnVtMDEyICsgbHJzZXQsCisJCQkJdGItPmxieXRlcywgdGItPnJieXRlcyk7CisJICAgIGVsc2UKKwkJc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCB0Yi0+bG51bVtoXSAtICgodGItPmxieXRlcyA9PSAtMSkgPyAwIDogMSksIAorCQkJCXRiLT5ybnVtW2hdIC0gKCh0Yi0+cmJ5dGVzID09IC0xKSA/IDAgOiAxKSwgbHJudmVyLCBzbnVtMDEyICsgbHJzZXQsIC0xLCAtMSk7CisKKwkgICAgcmV0dXJuIENBUlJZX09OOworCX0KKworCS8qIGlmIHNoaWZ0aW5nIGRvZXNuJ3QgbGVhZCB0byBiZXR0ZXIgcGFja2luZyB0aGVuIGRvbid0IHNoaWZ0ICovCisJaWYgKG52ZXIgPT0gbHJudmVyKQorCXsKKwkgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCBudmVyLCBzbnVtMDEyICsgbnNldCwgLTEsIC0xKTsKKwkgICAgcmV0dXJuIENBUlJZX09OOworCX0KKworCisJLyogbm93IHdlIGtub3cgdGhhdCBmb3IgYmV0dGVyIHBhY2tpbmcgc2hpZnRpbmcgaW4gb25seSBvbmUKKwkgICBkaXJlY3Rpb24gZWl0aGVyIHRvIHRoZSBsZWZ0IG9yIHRvIHRoZSByaWdodCBpcyByZXF1aXJlZCAqLworCisJLyogIGlmIHNoaWZ0aW5nIHRvIHRoZSBsZWZ0IGlzIGJldHRlciB0aGFuIHNoaWZ0aW5nIHRvIHRoZSByaWdodCAqLworCWlmIChsbnZlciA8IHJudmVyKQorCXsKKwkgICAgU0VUX1BBUl9TSElGVF9MRUZUOworCSAgICByZXR1cm4gQ0FSUllfT047CisJfQorCisJLyogaWYgc2hpZnRpbmcgdG8gdGhlIHJpZ2h0IGlzIGJldHRlciB0aGFuIHNoaWZ0aW5nIHRvIHRoZSBsZWZ0ICovCisJaWYgKGxudmVyID4gcm52ZXIpCisJeworCSAgICBTRVRfUEFSX1NISUZUX1JJR0hUOworCSAgICByZXR1cm4gQ0FSUllfT047CisJfQorCisKKwkvKiBub3cgc2hpZnRpbmcgaW4gZWl0aGVyIGRpcmVjdGlvbiBnaXZlcyB0aGUgc2FtZSBudW1iZXIKKwkgICBvZiBub2RlcyBhbmQgd2UgY2FuIG1ha2UgdXNlIG9mIHRoZSBjYWNoZWQgbmVpZ2hib3JzICovCisJaWYgKGlzX2xlZnRfbmVpZ2hib3JfaW5fY2FjaGUgKHRiLGgpKQorCXsKKwkgICAgU0VUX1BBUl9TSElGVF9MRUZUOworCSAgICByZXR1cm4gQ0FSUllfT047CisJfQorCisJLyogc2hpZnQgdG8gdGhlIHJpZ2h0IGluZGVwZW5kZW50bHkgb24gd2hldGhlciB0aGUgcmlnaHQgbmVpZ2hib3IgaW4gY2FjaGUgb3Igbm90ICovCisJU0VUX1BBUl9TSElGVF9SSUdIVDsKKwlyZXR1cm4gQ0FSUllfT047CisgICAgfQorfQorCisKKy8qIENoZWNrIHdoZXRoZXIgY3VycmVudCBub2RlIFNbaF0gaXMgYmFsYW5jZWQgd2hlbiBEZWNyZWFzaW5nIGl0cyBzaXplIGJ5CisgKiBEZWxldGluZyBvciBDdXR0aW5nIGZvciBJTlRFUk5BTCBub2RlIG9mIFMrdHJlZS4KKyAqIENhbGN1bGF0ZSBwYXJhbWV0ZXJzIGZvciBiYWxhbmNpbmcgZm9yIGN1cnJlbnQgbGV2ZWwgaC4KKyAqIFBhcmFtZXRlcnM6CisgKgl0Ygl0cmVlX2JhbGFuY2Ugc3RydWN0dXJlOworICoJaAljdXJyZW50IGxldmVsIG9mIHRoZSBub2RlOworICoJaW51bQlpdGVtIG51bWJlciBpbiBTW2hdOworICoJbW9kZQlpIC0gaW5zZXJ0LCBwIC0gcGFzdGU7CisgKiBSZXR1cm5zOgkxIC0gc2NoZWR1bGUgb2NjdXJyZWQ7IAorICoJICAgICAgICAwIC0gYmFsYW5jaW5nIGZvciBoaWdoZXIgbGV2ZWxzIG5lZWRlZDsKKyAqCSAgICAgICAtMSAtIG5vIGJhbGFuY2luZyBmb3IgaGlnaGVyIGxldmVscyBuZWVkZWQ7CisgKgkgICAgICAgLTIgLSBubyBkaXNrIHNwYWNlLgorICoKKyAqIE5vdGU6IEl0ZW1zIG9mIGludGVybmFsIG5vZGVzIGhhdmUgZml4ZWQgc2l6ZSwgc28gdGhlIGJhbGFuY2UgY29uZGl0aW9uIGZvcgorICogdGhlIGludGVybmFsIHBhcnQgb2YgUyt0cmVlIGlzIGFzIGZvciB0aGUgQi10cmVlcy4KKyAqLworc3RhdGljIGludCBkY19jaGVja19iYWxhbmNlX2ludGVybmFsIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBoKQoreworICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4gPSB0Yi0+dGJfdm47CisKKyAgLyogU2ggaXMgdGhlIG5vZGUgd2hvc2UgYmFsYW5jZSBpcyBjdXJyZW50bHkgYmVpbmcgY2hlY2tlZCwKKyAgICAgYW5kIEZoIGlzIGl0cyBmYXRoZXIuICAqLworICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBTaCwgKiBGaDsKKyAgaW50IG1heHNpemUsCisgICAgICBuX3JldF92YWx1ZTsKKyAgaW50IGxmcmVlLCByZnJlZSAvKiBmcmVlIHNwYWNlIGluIEwgYW5kIFIgKi87CisKKyAgU2ggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOyAKKyAgRmggPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpOyAKKworICBtYXhzaXplID0gTUFYX0NISUxEX1NJWkUoU2gpOyAKKworLyogICB1c2luZyB0Yi0+aW5zZXJ0X3NpemVbaF0sIHdoaWNoIGlzIG5lZ2F0aXZlIGluIHRoaXMgY2FzZSwgY3JlYXRlX3ZpcnR1YWxfbm9kZSBjYWxjdWxhdGVzOiAqLworLyogICBuZXdfbnJfaXRlbSA9IG51bWJlciBvZiBpdGVtcyBub2RlIHdvdWxkIGhhdmUgaWYgb3BlcmF0aW9uIGlzICovCisvKiAJcGVyZm9ybWVkIHdpdGhvdXQgYmFsYW5jaW5nIChuZXdfbnJfaXRlbSk7ICovCisgIGNyZWF0ZV92aXJ0dWFsX25vZGUgKHRiLCBoKTsKKworICBpZiAoICEgRmggKQorICAgIHsgICAvKiBTW2hdIGlzIHRoZSByb290LiAqLworICAgICAgaWYgKCB2bi0+dm5fbnJfaXRlbSA+IDAgKQorCXsKKwkgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgMCwgMSwgTlVMTCwgLTEsIC0xKTsKKwkgIHJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOyAvKiBubyBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkICovCisJfQorICAgICAgLyogbmV3X25yX2l0ZW0gPT0gMC4KKyAgICAgICAqIEN1cnJlbnQgcm9vdCB3aWxsIGJlIGRlbGV0ZWQgcmVzdWx0aW5nIGluCisgICAgICAgKiBkZWNyZW1lbnRpbmcgdGhlIHRyZWUgaGVpZ2h0LiAqLworICAgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCAwLCBOVUxMLCAtMSwgLTEpOworICAgICAgcmV0dXJuIENBUlJZX09OOworICAgIH0KKworICBpZiAoIChuX3JldF92YWx1ZSA9IGdldF9wYXJlbnRzKHRiLGgpKSAhPSBDQVJSWV9PTiApCisgICAgcmV0dXJuIG5fcmV0X3ZhbHVlOworCisKKyAgLyogZ2V0IGZyZWUgc3BhY2Ugb2YgbmVpZ2hib3JzICovCisgIHJmcmVlID0gZ2V0X3JmcmVlICh0YiwgaCk7CisgIGxmcmVlID0gZ2V0X2xmcmVlICh0YiwgaCk7CisJCQorICAvKiBkZXRlcm1pbmUgbWF4aW1hbCBudW1iZXIgb2YgaXRlbXMgd2UgY2FuIGZpdCBpbnRvIG5laWdoYm9ycyAqLworICBjaGVja19sZWZ0ICh0YiwgaCwgbGZyZWUpOworICBjaGVja19yaWdodCAodGIsIGgsIHJmcmVlKTsKKworCisgIGlmICggdm4tPnZuX25yX2l0ZW0gPj0gTUlOX05SX0tFWShTaCkgKQorICAgIHsgLyogQmFsYW5jZSBjb25kaXRpb24gZm9yIHRoZSBpbnRlcm5hbCBub2RlIGlzIHZhbGlkLgorICAgICAgICogSW4gdGhpcyBjYXNlIHdlIGJhbGFuY2Ugb25seSBpZiBpdCBsZWFkcyB0byBiZXR0ZXIgcGFja2luZy4gKi8gCisgICAgICBpZiAoIHZuLT52bl9ucl9pdGVtID09IE1JTl9OUl9LRVkoU2gpICkKKwl7IC8qIEhlcmUgd2Ugam9pbiBTW2hdIHdpdGggb25lIG9mIGl0cyBuZWlnaGJvcnMsCisJICAgKiB3aGljaCBpcyBpbXBvc3NpYmxlIHdpdGggZ3JlYXRlciB2YWx1ZXMgb2YgbmV3X25yX2l0ZW0uICovCisJICBpZiAoIHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSApCisJICAgIHsKKwkgICAgICAvKiBBbGwgY29udGVudHMgb2YgU1toXSBjYW4gYmUgbW92ZWQgdG8gTFtoXS4gKi8KKwkgICAgICBpbnQgbjsKKwkgICAgICBpbnQgb3JkZXJfTDsKKwkgICAgICAKKwkgICAgICBvcmRlcl9MID0gKChuPVBBVEhfSF9CX0lURU1fT1JERVIodGItPnRiX3BhdGgsIGgpKT09MCkgPyBCX05SX0lURU1TKHRiLT5GTFtoXSkgOiBuIC0gMTsKKwkgICAgICBuID0gZGNfc2l6ZShCX05fQ0hJTEQodGItPkZMW2hdLG9yZGVyX0wpKSAvIChEQ19TSVpFICsgS0VZX1NJWkUpOworCSAgICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgLW4tMSwgMCwgMCwgTlVMTCwgLTEsIC0xKTsKKwkgICAgICByZXR1cm4gQ0FSUllfT047CisJICAgIH0KKworCSAgaWYgKCB0Yi0+cm51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEgKQorCSAgICB7CisJICAgICAgLyogQWxsIGNvbnRlbnRzIG9mIFNbaF0gY2FuIGJlIG1vdmVkIHRvIFJbaF0uICovCisJICAgICAgaW50IG47CisJICAgICAgaW50IG9yZGVyX1I7CisJICAgIAorCSAgICAgIG9yZGVyX1IgPSAoKG49UEFUSF9IX0JfSVRFTV9PUkRFUih0Yi0+dGJfcGF0aCwgaCkpPT1CX05SX0lURU1TKEZoKSkgPyAwIDogbiArIDE7CisJICAgICAgbiA9IGRjX3NpemUoQl9OX0NISUxEKHRiLT5GUltoXSxvcmRlcl9SKSkgLyAoRENfU0laRSArIEtFWV9TSVpFKTsKKwkgICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIC1uLTEsIDAsIE5VTEwsIC0xLCAtMSk7CisJICAgICAgcmV0dXJuIENBUlJZX09OOyAgIAorCSAgICB9CisJfQorCisgICAgICBpZiAodGItPnJudW1baF0gKyB0Yi0+bG51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpCisJeworCSAgLyogQWxsIGNvbnRlbnRzIG9mIFNbaF0gY2FuIGJlIG1vdmVkIHRvIHRoZSBuZWlnaGJvcnMgKExbaF0gJiBSW2hdKS4gKi8KKwkgIGludCB0b19yOworCisJICB0b19yID0gKChNQVhfTlJfS0VZKFNoKTw8MSkrMi10Yi0+bG51bVtoXS10Yi0+cm51bVtoXSt2bi0+dm5fbnJfaXRlbSsxKS8yIC0gCisJICAgIChNQVhfTlJfS0VZKFNoKSArIDEgLSB0Yi0+cm51bVtoXSk7CisJICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIHZuLT52bl9ucl9pdGVtICsgMSAtIHRvX3IsIHRvX3IsIDAsIE5VTEwsIC0xLCAtMSk7CisJICByZXR1cm4gQ0FSUllfT047CisJfQorCisgICAgICAvKiBCYWxhbmNpbmcgZG9lcyBub3QgbGVhZCB0byBiZXR0ZXIgcGFja2luZy4gKi8KKyAgICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgMCwgMSwgTlVMTCwgLTEsIC0xKTsKKyAgICAgIHJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOworICAgIH0KKworICAvKiBDdXJyZW50IG5vZGUgY29udGFpbiBpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGl0ZW1zLiBCYWxhbmNpbmcgaXMgcmVxdWlyZWQuICovCQorICAvKiBDaGVjayB3aGV0aGVyIHdlIGNhbiBtZXJnZSBTW2hdIHdpdGggbGVmdCBuZWlnaGJvci4gKi8KKyAgaWYgKHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSkKKyAgICBpZiAoaXNfbGVmdF9uZWlnaGJvcl9pbl9jYWNoZSAodGIsaCkgfHwgdGItPnJudW1baF0gPCB2bi0+dm5fbnJfaXRlbSArIDEgfHwgIXRiLT5GUltoXSkKKyAgICAgIHsKKwlpbnQgbjsKKwlpbnQgb3JkZXJfTDsKKwkgICAgICAKKwlvcmRlcl9MID0gKChuPVBBVEhfSF9CX0lURU1fT1JERVIodGItPnRiX3BhdGgsIGgpKT09MCkgPyBCX05SX0lURU1TKHRiLT5GTFtoXSkgOiBuIC0gMTsKKwluID0gZGNfc2l6ZShCX05fQ0hJTEQodGItPkZMW2hdLG9yZGVyX0wpKSAvIChEQ19TSVpFICsgS0VZX1NJWkUpOworCXNldF9wYXJhbWV0ZXJzICh0YiwgaCwgLW4tMSwgMCwgMCwgTlVMTCwgLTEsIC0xKTsKKwlyZXR1cm4gQ0FSUllfT047CisgICAgICB9CisKKyAgLyogQ2hlY2sgd2hldGhlciB3ZSBjYW4gbWVyZ2UgU1toXSB3aXRoIHJpZ2h0IG5laWdoYm9yLiAqLworICBpZiAodGItPnJudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gKyAxKQorICAgIHsKKyAgICAgIGludCBuOworICAgICAgaW50IG9yZGVyX1I7CisJICAgIAorICAgICAgb3JkZXJfUiA9ICgobj1QQVRIX0hfQl9JVEVNX09SREVSKHRiLT50Yl9wYXRoLCBoKSk9PUJfTlJfSVRFTVMoRmgpKSA/IDAgOiAobiArIDEpOworICAgICAgbiA9IGRjX3NpemUoQl9OX0NISUxEKHRiLT5GUltoXSxvcmRlcl9SKSkgLyAoRENfU0laRSArIEtFWV9TSVpFKTsKKyAgICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgLW4tMSwgMCwgTlVMTCwgLTEsIC0xKTsKKyAgICAgIHJldHVybiBDQVJSWV9PTjsgICAKKyAgICB9CisKKyAgLyogQWxsIGNvbnRlbnRzIG9mIFNbaF0gY2FuIGJlIG1vdmVkIHRvIHRoZSBuZWlnaGJvcnMgKExbaF0gJiBSW2hdKS4gKi8KKyAgaWYgKHRiLT5ybnVtW2hdICsgdGItPmxudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gKyAxKQorICAgIHsKKyAgICAgIGludCB0b19yOworCSAgICAKKyAgICAgIHRvX3IgPSAoKE1BWF9OUl9LRVkoU2gpPDwxKSsyLXRiLT5sbnVtW2hdLXRiLT5ybnVtW2hdK3ZuLT52bl9ucl9pdGVtKzEpLzIgLSAKKwkoTUFYX05SX0tFWShTaCkgKyAxIC0gdGItPnJudW1baF0pOworICAgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCB2bi0+dm5fbnJfaXRlbSArIDEgLSB0b19yLCB0b19yLCAwLCBOVUxMLCAtMSwgLTEpOworICAgICAgcmV0dXJuIENBUlJZX09OOworICAgIH0KKworICAvKiBGb3IgaW50ZXJuYWwgbm9kZXMgdHJ5IHRvIGJvcnJvdyBpdGVtIGZyb20gYSBuZWlnaGJvciAqLworICBSRkFMU0UoICF0Yi0+RkxbaF0gJiYgIXRiLT5GUltoXSwgInZzLTgyMzU6IHRyeWluZyB0byBib3Jyb3cgZm9yIHJvb3QiKTsKKworICAvKiBCb3Jyb3cgb25lIG9yIHR3byBpdGVtcyBmcm9tIGNhY2hpbmcgbmVpZ2hib3IgKi8KKyAgaWYgKGlzX2xlZnRfbmVpZ2hib3JfaW5fY2FjaGUgKHRiLGgpIHx8ICF0Yi0+RlJbaF0pCisgICAgeworICAgICAgaW50IGZyb21fbDsKKwkJCisgICAgICBmcm9tX2wgPSAoTUFYX05SX0tFWShTaCkgKyAxIC0gdGItPmxudW1baF0gKyB2bi0+dm5fbnJfaXRlbSArIDEpIC8gMiAtICAodm4tPnZuX25yX2l0ZW0gKyAxKTsKKyAgICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgLWZyb21fbCwgMCwgMSwgTlVMTCwgLTEsIC0xKTsKKyAgICAgIHJldHVybiBDQVJSWV9PTjsKKyAgICB9CisKKyAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAtKChNQVhfTlJfS0VZKFNoKSsxLXRiLT5ybnVtW2hdK3ZuLT52bl9ucl9pdGVtKzEpLzItKHZuLT52bl9ucl9pdGVtKzEpKSwgMSwgCisJCSAgTlVMTCwgLTEsIC0xKTsKKyAgcmV0dXJuIENBUlJZX09OOworfQorCisKKy8qIENoZWNrIHdoZXRoZXIgY3VycmVudCBub2RlIFNbaF0gaXMgYmFsYW5jZWQgd2hlbiBEZWNyZWFzaW5nIGl0cyBzaXplIGJ5CisgKiBEZWxldGluZyBvciBUcnVuY2F0aW5nIGZvciBMRUFGIG5vZGUgb2YgUyt0cmVlLgorICogQ2FsY3VsYXRlIHBhcmFtZXRlcnMgZm9yIGJhbGFuY2luZyBmb3IgY3VycmVudCBsZXZlbCBoLgorICogUGFyYW1ldGVyczoKKyAqCXRiCXRyZWVfYmFsYW5jZSBzdHJ1Y3R1cmU7CisgKgloCWN1cnJlbnQgbGV2ZWwgb2YgdGhlIG5vZGU7CisgKglpbnVtCWl0ZW0gbnVtYmVyIGluIFNbaF07CisgKgltb2RlCWkgLSBpbnNlcnQsIHAgLSBwYXN0ZTsKKyAqIFJldHVybnM6CTEgLSBzY2hlZHVsZSBvY2N1cnJlZDsgCisgKgkgICAgICAgIDAgLSBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkOworICoJICAgICAgIC0xIC0gbm8gYmFsYW5jaW5nIGZvciBoaWdoZXIgbGV2ZWxzIG5lZWRlZDsKKyAqCSAgICAgICAtMiAtIG5vIGRpc2sgc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgZGNfY2hlY2tfYmFsYW5jZV9sZWFmIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBoKQoreworICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4gPSB0Yi0+dGJfdm47CisKKyAgLyogTnVtYmVyIG9mIGJ5dGVzIHRoYXQgbXVzdCBiZSBkZWxldGVkIGZyb20KKyAgICAgKHZhbHVlIGlzIG5lZ2F0aXZlIGlmIGJ5dGVzIGFyZSBkZWxldGVkKSBidWZmZXIgd2hpY2gKKyAgICAgY29udGFpbnMgbm9kZSBiZWluZyBiYWxhbmNlZC4gIFRoZSBtbmVtb25pYyBpcyB0aGF0IHRoZQorICAgICBhdHRlbXB0ZWQgY2hhbmdlIGluIG5vZGUgc3BhY2UgdXNlZCBsZXZlbCBpcyBsZXZieXRlcyBieXRlcy4gKi8KKyAgaW50IGxldmJ5dGVzOworICAvKiB0aGUgbWF4aW1hbCBpdGVtIHNpemUgKi8KKyAgaW50IG1heHNpemUsCisgICAgICBuX3JldF92YWx1ZTsKKyAgLyogUzAgaXMgdGhlIG5vZGUgd2hvc2UgYmFsYW5jZSBpcyBjdXJyZW50bHkgYmVpbmcgY2hlY2tlZCwKKyAgICAgYW5kIEYwIGlzIGl0cyBmYXRoZXIuICAqLworICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBTMCwgKiBGMDsKKyAgaW50IGxmcmVlLCByZnJlZSAvKiBmcmVlIHNwYWNlIGluIEwgYW5kIFIgKi87CisKKyAgUzAgPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIDApOworICBGMCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgMCk7CisKKyAgbGV2Ynl0ZXMgPSB0Yi0+aW5zZXJ0X3NpemVbaF07CisKKyAgbWF4c2l6ZSA9IE1BWF9DSElMRF9TSVpFKFMwKTsgCS8qIG1heGltYWwgcG9zc2libGUgc2l6ZSBvZiBhbiBpdGVtICovCisKKyAgaWYgKCAhIEYwICkKKyAgICB7ICAvKiBTWzBdIGlzIHRoZSByb290IG5vdy4gKi8KKworICAgICAgUkZBTFNFKCAtbGV2Ynl0ZXMgPj0gbWF4c2l6ZSAtIEJfRlJFRV9TUEFDRSAoUzApLAorCSAgICAgICJ2cy04MjQwOiBhdHRlbXB0IHRvIGNyZWF0ZSBlbXB0eSBidWZmZXIgdHJlZSIpOworCisgICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIDAsIDEsIE5VTEwsIC0xLCAtMSk7CisgICAgICByZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsKKyAgICB9CisKKyAgaWYgKCAobl9yZXRfdmFsdWUgPSBnZXRfcGFyZW50cyh0YixoKSkgIT0gQ0FSUllfT04gKQorICAgIHJldHVybiBuX3JldF92YWx1ZTsKKworICAvKiBnZXQgZnJlZSBzcGFjZSBvZiBuZWlnaGJvcnMgKi8KKyAgcmZyZWUgPSBnZXRfcmZyZWUgKHRiLCBoKTsKKyAgbGZyZWUgPSBnZXRfbGZyZWUgKHRiLCBoKTsJCQorCisgIGNyZWF0ZV92aXJ0dWFsX25vZGUgKHRiLCBoKTsKKworICAvKiBpZiAzIGxlYXZlcyBjYW4gYmUgbWVyZ2UgdG8gb25lLCBzZXQgcGFyYW1ldGVycyBhbmQgcmV0dXJuICovCisgIGlmIChhcmVfbGVhdmVzX3JlbW92YWJsZSAodGIsIGxmcmVlLCByZnJlZSkpCisgICAgcmV0dXJuIENBUlJZX09OOworCisgIC8qIGRldGVybWluZSBtYXhpbWFsIG51bWJlciBvZiBpdGVtcyB3ZSBjYW4gc2hpZnQgdG8gdGhlIGxlZnQvcmlnaHQgIG5laWdoYm9yCisgICAgIGFuZCB0aGUgbWF4aW1hbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gZmxvdyB0byB0aGUgbGVmdC9yaWdodCBuZWlnaGJvcgorICAgICBmcm9tIHRoZSBsZWZ0L3JpZ2h0IG1vc3QgbGlxdWlkIGl0ZW0gdGhhdCBjYW5ub3QgYmUgc2hpZnRlZCBmcm9tIFNbMF0gZW50aXJlbHkKKyAgICAgKi8KKyAgY2hlY2tfbGVmdCAodGIsIGgsIGxmcmVlKTsKKyAgY2hlY2tfcmlnaHQgKHRiLCBoLCByZnJlZSk7ICAgCisKKyAgLyogY2hlY2sgd2hldGhlciB3ZSBjYW4gbWVyZ2UgUyB3aXRoIGxlZnQgbmVpZ2hib3IuICovCisgIGlmICh0Yi0+bG51bVswXSA+PSB2bi0+dm5fbnJfaXRlbSAmJiB0Yi0+bGJ5dGVzID09IC0xKQorICAgIGlmIChpc19sZWZ0X25laWdoYm9yX2luX2NhY2hlICh0YixoKSB8fAorCSgodGItPnJudW1bMF0gLSAoKHRiLT5yYnl0ZXMgPT0gLTEpID8gMCA6IDEpKSA8IHZuLT52bl9ucl9pdGVtKSB8fCAvKiBTIGNhbiBub3QgYmUgbWVyZ2VkIHdpdGggUiAqLworCSF0Yi0+RlJbaF0pIHsKKyAgICAgIAorICAgICAgUkZBTFNFKCAhdGItPkZMW2hdLCAidnMtODI0NTogZGNfY2hlY2tfYmFsYW5jZV9sZWFmOiBGTFtoXSBtdXN0IGV4aXN0Iik7CisKKyAgICAgIC8qIHNldCBwYXJhbWV0ZXIgdG8gbWVyZ2UgU1swXSB3aXRoIGl0cyBsZWZ0IG5laWdoYm9yICovCisgICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIC0xLCAwLCAwLCBOVUxMLCAtMSwgLTEpOworICAgICAgcmV0dXJuIENBUlJZX09OOworICAgIH0KKworICAvKiBjaGVjayB3aGV0aGVyIHdlIGNhbiBtZXJnZSBTWzBdIHdpdGggcmlnaHQgbmVpZ2hib3IuICovCisgIGlmICh0Yi0+cm51bVswXSA+PSB2bi0+dm5fbnJfaXRlbSAmJiB0Yi0+cmJ5dGVzID09IC0xKSB7CisgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAtMSwgMCwgTlVMTCwgLTEsIC0xKTsKKyAgICByZXR1cm4gQ0FSUllfT047CisgIH0KKyAgCisgIC8qIEFsbCBjb250ZW50cyBvZiBTWzBdIGNhbiBiZSBtb3ZlZCB0byB0aGUgbmVpZ2hib3JzIChMWzBdICYgUlswXSkuIFNldCBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gKi8KKyAgaWYgKGlzX2xlYWZfcmVtb3ZhYmxlICh0YikpCisgICAgcmV0dXJuIENBUlJZX09OOworICAKKyAgLyogQmFsYW5jaW5nIGlzIG5vdCByZXF1aXJlZC4gKi8KKyAgdGItPnMwbnVtID0gdm4tPnZuX25yX2l0ZW07CisgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgMCwgMSwgTlVMTCwgLTEsIC0xKTsKKyAgcmV0dXJuIE5PX0JBTEFOQ0lOR19ORUVERUQ7Cit9CisKKworCisvKiBDaGVjayB3aGV0aGVyIGN1cnJlbnQgbm9kZSBTW2hdIGlzIGJhbGFuY2VkIHdoZW4gRGVjcmVhc2luZyBpdHMgc2l6ZSBieQorICogRGVsZXRpbmcgb3IgQ3V0dGluZy4KKyAqIENhbGN1bGF0ZSBwYXJhbWV0ZXJzIGZvciBiYWxhbmNpbmcgZm9yIGN1cnJlbnQgbGV2ZWwgaC4KKyAqIFBhcmFtZXRlcnM6CisgKgl0Ygl0cmVlX2JhbGFuY2Ugc3RydWN0dXJlOworICoJaAljdXJyZW50IGxldmVsIG9mIHRoZSBub2RlOworICoJaW51bQlpdGVtIG51bWJlciBpbiBTW2hdOworICoJbW9kZQlkIC0gZGVsZXRlLCBjIC0gY3V0LgorICogUmV0dXJuczoJMSAtIHNjaGVkdWxlIG9jY3VycmVkOyAKKyAqCSAgICAgICAgMCAtIGJhbGFuY2luZyBmb3IgaGlnaGVyIGxldmVscyBuZWVkZWQ7CisgKgkgICAgICAgLTEgLSBubyBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkOworICoJICAgICAgIC0yIC0gbm8gZGlzayBzcGFjZS4KKyAqLworc3RhdGljIGludCBkY19jaGVja19iYWxhbmNlIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBoKQoreworIFJGQUxTRSggISAoUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKSksICJ2cy04MjUwOiBTIGlzIG5vdCBpbml0aWFsaXplZCIpOworCisgaWYgKCBoICkKKyAgIHJldHVybiBkY19jaGVja19iYWxhbmNlX2ludGVybmFsICh0YiwgaCk7CisgZWxzZQorICAgcmV0dXJuIGRjX2NoZWNrX2JhbGFuY2VfbGVhZiAodGIsIGgpOworfQorCisKKworLyogQ2hlY2sgd2hldGhlciBjdXJyZW50IG5vZGUgU1toXSBpcyBiYWxhbmNlZC4KKyAqIENhbGN1bGF0ZSBwYXJhbWV0ZXJzIGZvciBiYWxhbmNpbmcgZm9yIGN1cnJlbnQgbGV2ZWwgaC4KKyAqIFBhcmFtZXRlcnM6CisgKgorICoJdGIJdHJlZV9iYWxhbmNlIHN0cnVjdHVyZToKKyAqCisgKiAgICAgICAgICAgICAgdGIgaXMgYSBsYXJnZSBzdHJ1Y3R1cmUgdGhhdCBtdXN0IGJlIHJlYWQgYWJvdXQgaW4gdGhlIGhlYWRlciBmaWxlCisgKiAgICAgICAgICAgICAgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGlzIHByb2NlZHVyZSBpZiB0aGUgcmVhZGVyIGlzIHRvIHN1Y2Nlc3NmdWxseQorICogICAgICAgICAgICAgIHVuZGVyc3RhbmQgdGhpcyBwcm9jZWR1cmUKKyAqCisgKgloCWN1cnJlbnQgbGV2ZWwgb2YgdGhlIG5vZGU7CisgKglpbnVtCWl0ZW0gbnVtYmVyIGluIFNbaF07CisgKgltb2RlCWkgLSBpbnNlcnQsIHAgLSBwYXN0ZSwgZCAtIGRlbGV0ZSwgYyAtIGN1dC4KKyAqIFJldHVybnM6CTEgLSBzY2hlZHVsZSBvY2N1cnJlZDsgCisgKgkgICAgICAgIDAgLSBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkOworICoJICAgICAgIC0xIC0gbm8gYmFsYW5jaW5nIGZvciBoaWdoZXIgbGV2ZWxzIG5lZWRlZDsKKyAqCSAgICAgICAtMiAtIG5vIGRpc2sgc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfYmFsYW5jZSAoaW50IG1vZGUsIAorCQkJICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsCisJCQkgIGludCBoLCAKKwkJCSAgaW50IGludW0sCisJCQkgIGludCBwb3NfaW5faXRlbSwKKwkJCSAgc3RydWN0IGl0ZW1faGVhZCAqIGluc19paCwKKwkJCSAgY29uc3Qgdm9pZCAqIGRhdGEKKwkJCSAgKQoreworICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm47CisKKyAgdm4gPSB0Yi0+dGJfdm4gPSAoc3RydWN0IHZpcnR1YWxfbm9kZSAqKSh0Yi0+dm5fYnVmKTsKKyAgdm4tPnZuX2ZyZWVfcHRyID0gKGNoYXIgKikodGItPnRiX3ZuICsgMSk7CisgIHZuLT52bl9tb2RlID0gbW9kZTsKKyAgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtID0gaW51bTsKKyAgdm4tPnZuX3Bvc19pbl9pdGVtID0gcG9zX2luX2l0ZW07CisgIHZuLT52bl9pbnNfaWggPSBpbnNfaWg7CisgIHZuLT52bl9kYXRhID0gZGF0YTsKKworICBSRkFMU0UoIG1vZGUgPT0gTV9JTlNFUlQgJiYgIXZuLT52bl9pbnNfaWgsCisJICAidnMtODI1NTogaW5zX2loIGNhbiBub3QgYmUgMCBpbiBpbnNlcnQgbW9kZSIpOworCisgaWYgKCB0Yi0+aW5zZXJ0X3NpemVbaF0gPiAwICkKKyAgIC8qIENhbGN1bGF0ZSBiYWxhbmNlIHBhcmFtZXRlcnMgd2hlbiBzaXplIG9mIG5vZGUgaXMgaW5jcmVhc2luZy4gKi8KKyAgIHJldHVybiBpcF9jaGVja19iYWxhbmNlICh0YiwgaCk7CisKKyAvKiBDYWxjdWxhdGUgYmFsYW5jZSBwYXJhbWV0ZXJzIHdoZW4gIHNpemUgb2Ygbm9kZSBpcyBkZWNyZWFzaW5nLiAqLworIHJldHVybiBkY19jaGVja19iYWxhbmNlICh0YiwgaCk7Cit9CisKKworCisvKiBDaGVjayB3aGV0aGVyIHBhcmVudCBhdCB0aGUgcGF0aCBpcyB0aGUgcmVhbGx5IHBhcmVudCBvZiB0aGUgY3VycmVudCBub2RlLiovCitzdGF0aWMgaW50ICBnZXRfZGlyZWN0X3BhcmVudCgKKyAgICAgICAgICAgICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHBfc190YiwKKyAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIG5faAorICAgICAgICAgICAgKSB7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19iaDsKKyAgICBzdHJ1Y3QgcGF0aCAgICAgICAgICogcF9zX3BhdGggICAgICA9IHBfc190Yi0+dGJfcGF0aDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9wb3NpdGlvbiwKKwluX3BhdGhfb2Zmc2V0ID0gUEFUSF9IX1BBVEhfT0ZGU0VUKHBfc190Yi0+dGJfcGF0aCwgbl9oKTsKKyAgICAKKyAgICAvKiBXZSBhcmUgaW4gdGhlIHJvb3Qgb3IgaW4gdGhlIG5ldyByb290LiAqLworICAgIGlmICggbl9wYXRoX29mZnNldCA8PSBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUICkgeworCQorCVJGQUxTRSggbl9wYXRoX29mZnNldCA8IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgLSAxLAorCQkiUEFQLTgyNjA6IGludmFsaWQgb2Zmc2V0IGluIHRoZSBwYXRoIik7CisKKwlpZiAoIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQpLT5iX2Jsb2NrbnIgPT0KKwkgICAgIFNCX1JPT1RfQkxPQ0sgKHBfc190Yi0+dGJfc2IpICkgeworCSAgICAvKiBSb290IGlzIG5vdCBjaGFuZ2VkLiAqLworCSAgICBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSkgPSBOVUxMOworCSAgICBQQVRIX09GRlNFVF9QT1NJVElPTihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCAtIDEpID0gMDsKKwkgICAgcmV0dXJuIENBUlJZX09OOworCX0KKwlyZXR1cm4gUkVQRUFUX1NFQVJDSDsgLyogUm9vdCBpcyBjaGFuZ2VkIGFuZCB3ZSBtdXN0IHJlY2FsY3VsYXRlIHRoZSBwYXRoLiAqLworICAgIH0KKworICAgIGlmICggISBCX0lTX0lOX1RSRUUocF9zX2JoID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCAtIDEpKSApCisJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7IC8qIFBhcmVudCBpbiB0aGUgcGF0aCBpcyBub3QgaW4gdGhlIHRyZWUuICovCisKKyAgICBpZiAoIChuX3Bvc2l0aW9uID0gUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKSkgPiBCX05SX0lURU1TKHBfc19iaCkgKQorCXJldHVybiBSRVBFQVRfU0VBUkNIOworICAgIAorICAgIGlmICggQl9OX0NISUxEX05VTShwX3NfYmgsIG5fcG9zaXRpb24pICE9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQpLT5iX2Jsb2NrbnIgKQorCS8qIFBhcmVudCBpbiB0aGUgcGF0aCBpcyBub3QgcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUgaW4gdGhlIHRyZWUuICovCisJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisKKyAgICBpZiAoIGJ1ZmZlcl9sb2NrZWQocF9zX2JoKSApIHsKKwlfX3dhaXRfb25fYnVmZmVyKHBfc19iaCk7CisJaWYgKCBGSUxFU1lTVEVNX0NIQU5HRURfVEIgKHBfc190YikgKQorCSAgICByZXR1cm4gUkVQRUFUX1NFQVJDSDsKKyAgICB9CisKKyAgICByZXR1cm4gQ0FSUllfT047IC8qIFBhcmVudCBpbiB0aGUgcGF0aCBpcyB1bmxvY2tlZCBhbmQgcmVhbGx5IHBhcmVudCBvZiB0aGUgY3VycmVudCBub2RlLiAgKi8KK30KKworCisvKiBVc2luZyBsbnVtW25faF0gYW5kIHJudW1bbl9oXSB3ZSBzaG91bGQgZGV0ZXJtaW5lIHdoYXQgbmVpZ2hib3JzCisgKiBvZiBTW25faF0gd2UKKyAqIG5lZWQgaW4gb3JkZXIgdG8gYmFsYW5jZSBTW25faF0sIGFuZCBnZXQgdGhlbSBpZiBuZWNlc3NhcnkuCisgKiBSZXR1cm5zOglTQ0hFRFVMRV9PQ0NVUlJFRCAtIHNjaGVkdWxlIG9jY3VycmVkIHdoaWxlIHRoZSBmdW5jdGlvbiB3b3JrZWQ7CisgKgkgICAgICAgIENBUlJZX09OIC0gc2NoZWR1bGUgZGlkbid0IG9jY3VyIHdoaWxlIHRoZSBmdW5jdGlvbiB3b3JrZWQ7CisgKi8KK3N0YXRpYyBpbnQgIGdldF9uZWlnaGJvcnMoCisJICAgICAgICAgICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHBfc190YiwKKwkgICAgICAgICAgICBpbnQgCQkgIG5faAorCSAgICAgICAgICApIHsKKyAgICBpbnQJCSAJbl9jaGlsZF9wb3NpdGlvbiwKKwluX3BhdGhfb2Zmc2V0ID0gUEFUSF9IX1BBVEhfT0ZGU0VUKHBfc190Yi0+dGJfcGF0aCwgbl9oICsgMSk7CisgICAgdW5zaWduZWQgbG9uZwkJbl9zb25fbnVtYmVyOworICAgIHN0cnVjdCBzdXBlcl9ibG9jayAgKglwX3Nfc2IgPSBwX3NfdGItPnRiX3NiOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfYmg7CisKKworICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgZ2V0X25laWdoYm9yc1sgbl9oIF0gKTsKKworICAgIGlmICggcF9zX3RiLT5sbnVtW25faF0gKSB7CisJLyogV2UgbmVlZCBsZWZ0IG5laWdoYm9yIHRvIGJhbGFuY2UgU1tuX2hdLiAqLworCVBST0NfSU5GT19JTkMoIHBfc19zYiwgbmVlZF9sX25laWdoYm9yWyBuX2ggXSApOworCXBfc19iaCA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBuX3BhdGhfb2Zmc2V0KTsKKwkKKwlSRkFMU0UoIHBfc19iaCA9PSBwX3NfdGItPkZMW25faF0gJiYgCisJCSEgUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3RiLT50Yl9wYXRoLCBuX3BhdGhfb2Zmc2V0KSwKKwkJIlBBUC04MjcwOiBpbnZhbGlkIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQiKTsKKworCW5fY2hpbGRfcG9zaXRpb24gPSAoIHBfc19iaCA9PSBwX3NfdGItPkZMW25faF0gKSA/IHBfc190Yi0+bGtleVtuX2hdIDogQl9OUl9JVEVNUyAocF9zX3RiLT5GTFtuX2hdKTsKKwluX3Nvbl9udW1iZXIgPSBCX05fQ0hJTERfTlVNKHBfc190Yi0+Rkxbbl9oXSwgbl9jaGlsZF9wb3NpdGlvbik7CisJcF9zX2JoID0gc2JfYnJlYWQocF9zX3NiLCBuX3Nvbl9udW1iZXIpOworCWlmICghcF9zX2JoKQorCSAgICByZXR1cm4gSU9fRVJST1I7CisJaWYgKCBGSUxFU1lTVEVNX0NIQU5HRURfVEIgKHBfc190YikgKSB7CisJICAgIGRlY3JlbWVudF9iY291bnQocF9zX2JoKTsKKwkgICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBnZXRfbmVpZ2hib3JzX3Jlc3RhcnRbIG5faCBdICk7CisJICAgIHJldHVybiBSRVBFQVRfU0VBUkNIOworCX0KKwkKKwlSRkFMU0UoICEgQl9JU19JTl9UUkVFKHBfc190Yi0+Rkxbbl9oXSkgfHwKKyAgICAgICAgICAgICAgICBuX2NoaWxkX3Bvc2l0aW9uID4gQl9OUl9JVEVNUyhwX3NfdGItPkZMW25faF0pIHx8CisJICAgICAgICBCX05fQ0hJTERfTlVNKHBfc190Yi0+Rkxbbl9oXSwgbl9jaGlsZF9wb3NpdGlvbikgIT0KKyAgICAgICAgICAgICAgICBwX3NfYmgtPmJfYmxvY2tuciwgIlBBUC04Mjc1OiBpbnZhbGlkIHBhcmVudCIpOworCVJGQUxTRSggISBCX0lTX0lOX1RSRUUocF9zX2JoKSwgIlBBUC04MjgwOiBpbnZhbGlkIGNoaWxkIik7CisJUkZBTFNFKCAhIG5faCAmJgorICAgICAgICAgICAgICAgIEJfRlJFRV9TUEFDRSAocF9zX2JoKSAhPSBNQVhfQ0hJTERfU0laRSAocF9zX2JoKSAtIGRjX3NpemUoQl9OX0NISUxEIChwX3NfdGItPkZMWzBdLG5fY2hpbGRfcG9zaXRpb24pKSwKKyAgICAgICAgICAgICAgICAiUEFQLTgyOTA6IGludmFsaWQgY2hpbGQgc2l6ZSBvZiBsZWZ0IG5laWdoYm9yIik7CisKKwlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+TFtuX2hdKTsKKwlwX3NfdGItPkxbbl9oXSA9IHBfc19iaDsKKyAgICB9CisKKworICAgIGlmICggcF9zX3RiLT5ybnVtW25faF0gKSB7IC8qIFdlIG5lZWQgcmlnaHQgbmVpZ2hib3IgdG8gYmFsYW5jZSBTW25fcGF0aF9vZmZzZXRdLiAqLworCVBST0NfSU5GT19JTkMoIHBfc19zYiwgbmVlZF9yX25laWdoYm9yWyBuX2ggXSApOworCXBfc19iaCA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBuX3BhdGhfb2Zmc2V0KTsKKwkKKwlSRkFMU0UoIHBfc19iaCA9PSBwX3NfdGItPkZSW25faF0gJiYgCisJCVBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc190Yi0+dGJfcGF0aCwgbl9wYXRoX29mZnNldCkgPj0gQl9OUl9JVEVNUyhwX3NfYmgpLAorCQkiUEFQLTgyOTU6IGludmFsaWQgcG9zaXRpb24gaW4gdGhlIHBhcmVudCIpOworCisJbl9jaGlsZF9wb3NpdGlvbiA9ICggcF9zX2JoID09IHBfc190Yi0+RlJbbl9oXSApID8gcF9zX3RiLT5ya2V5W25faF0gKyAxIDogMDsKKwluX3Nvbl9udW1iZXIgPSBCX05fQ0hJTERfTlVNKHBfc190Yi0+RlJbbl9oXSwgbl9jaGlsZF9wb3NpdGlvbik7CisJcF9zX2JoID0gc2JfYnJlYWQocF9zX3NiLCBuX3Nvbl9udW1iZXIpOworCWlmICghcF9zX2JoKQorCSAgICByZXR1cm4gSU9fRVJST1I7CisJaWYgKCBGSUxFU1lTVEVNX0NIQU5HRURfVEIgKHBfc190YikgKSB7CisJICAgIGRlY3JlbWVudF9iY291bnQocF9zX2JoKTsKKwkgICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBnZXRfbmVpZ2hib3JzX3Jlc3RhcnRbIG5faCBdICk7CisJICAgIHJldHVybiBSRVBFQVRfU0VBUkNIOworCX0KKwlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+UltuX2hdKTsKKwlwX3NfdGItPlJbbl9oXSA9IHBfc19iaDsKKworCVJGQUxTRSggISBuX2ggJiYgQl9GUkVFX1NQQUNFIChwX3NfYmgpICE9IE1BWF9DSElMRF9TSVpFIChwX3NfYmgpIC0gZGNfc2l6ZShCX05fQ0hJTEQgKHBfc190Yi0+RlJbMF0sbl9jaGlsZF9wb3NpdGlvbikpLAorICAgICAgICAgICAgICAgICJQQVAtODMwMDogaW52YWxpZCBjaGlsZCBzaXplIG9mIHJpZ2h0IG5laWdoYm9yICglZCAhPSAlZCAtICVkKSIsCisgICAgICAgICAgICAgICAgQl9GUkVFX1NQQUNFIChwX3NfYmgpLCBNQVhfQ0hJTERfU0laRSAocF9zX2JoKSwKKyAgICAgICAgICAgICAgICBkY19zaXplKEJfTl9DSElMRCAocF9zX3RiLT5GUlswXSxuX2NoaWxkX3Bvc2l0aW9uKSkpOworCQorICAgIH0KKyAgICByZXR1cm4gQ0FSUllfT047Cit9CisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKK3ZvaWQgKiByZWlzZXJmc19rbWFsbG9jIChzaXplX3Qgc2l6ZSwgaW50IGZsYWdzLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQoreworICAgIHZvaWQgKiB2cDsKKyAgICBzdGF0aWMgc2l6ZV90IG1hbGxvY2VkOworCisKKyAgICB2cCA9IGttYWxsb2MgKHNpemUsIGZsYWdzKTsKKyAgICBpZiAodnApIHsKKwlSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyArPSBzaXplOworCWlmIChSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyA+IG1hbGxvY2VkICsgMjAwMDAwKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsCisJCQkgICAgICAidnMtODMwMTogcmVpc2VyZnNfa21hbGxvYzogYWxsb2NhdGVkIG1lbW9yeSAlZCIsCisJCQkgICAgICBSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyk7CisJICAgIG1hbGxvY2VkID0gUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3M7CisJfQorICAgIH0KKyAgICByZXR1cm4gdnA7Cit9CisKK3ZvaWQgcmVpc2VyZnNfa2ZyZWUgKGNvbnN0IHZvaWQgKiB2cCwgc2l6ZV90IHNpemUsIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCit7CisgICAga2ZyZWUgKHZwKTsKKyAgCisgICAgUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MgLT0gc2l6ZTsKKyAgICBpZiAoUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MgPCAwKQorCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy04MzAyOiByZWlzZXJmc19rZnJlZTogYWxsb2NhdGVkIG1lbW9yeSAlZCIsCisJCQkgIFJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzKTsKKworfQorI2VuZGlmCisKKworc3RhdGljIGludCBnZXRfdmlydHVhbF9ub2RlX3NpemUgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3sKKyAgICBpbnQgbWF4X251bV9vZl9pdGVtczsKKyAgICBpbnQgbWF4X251bV9vZl9lbnRyaWVzOworICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tzaXplID0gc2ItPnNfYmxvY2tzaXplOworCisjZGVmaW5lIE1JTl9OQU1FX0xFTiAxCisKKyAgICBtYXhfbnVtX29mX2l0ZW1zID0gKGJsb2Nrc2l6ZSAtIEJMS0hfU0laRSkgLyAoSUhfU0laRSArIE1JTl9JVEVNX0xFTik7CisgICAgbWF4X251bV9vZl9lbnRyaWVzID0gKGJsb2Nrc2l6ZSAtIEJMS0hfU0laRSAtIElIX1NJWkUpIC8gCisgICAgICAgICAgICAgICAgICAgICAgICAgKERFSF9TSVpFICsgTUlOX05BTUVfTEVOKTsKKworICAgIHJldHVybiBzaXplb2Yoc3RydWN0IHZpcnR1YWxfbm9kZSkgKyAKKyAgICAgICAgICAgbWF4KG1heF9udW1fb2ZfaXRlbXMgKiBzaXplb2YgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0pLAorCSAgICAgICBzaXplb2YgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0pICsgc2l6ZW9mKHN0cnVjdCBkaXJlbnRyeV91YXJlYSkgKyAKKyAgICAgICAgICAgICAgIChtYXhfbnVtX29mX2VudHJpZXMgLSAxKSAqIHNpemVvZiAoX191MTYpKTsKK30KKworCisKKy8qIG1heWJlIHdlIHNob3VsZCBmYWlsIGJhbGFuY2luZyB3ZSBhcmUgZ29pbmcgdG8gcGVyZm9ybSB3aGVuIGttYWxsb2MKKyAgIGZhaWxzIHNldmVyYWwgdGltZXMuIEJ1dCBub3cgaXQgd2lsbCBsb29wIHVudGlsIGttYWxsb2MgZ2V0cworICAgcmVxdWlyZWQgbWVtb3J5ICovCitzdGF0aWMgaW50IGdldF9tZW1fZm9yX3ZpcnR1YWxfbm9kZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiKQoreworICAgIGludCBjaGVja19mcyA9IDA7CisgICAgaW50IHNpemU7CisgICAgY2hhciAqIGJ1ZjsKKworICAgIHNpemUgPSBnZXRfdmlydHVhbF9ub2RlX3NpemUgKHRiLT50Yl9zYiwgUEFUSF9QTEFTVF9CVUZGRVIgKHRiLT50Yl9wYXRoKSk7CisKKyAgICBpZiAoc2l6ZSA+IHRiLT52bl9idWZfc2l6ZSkgeworCS8qIHdlIGhhdmUgdG8gYWxsb2NhdGUgbW9yZSBtZW1vcnkgZm9yIHZpcnR1YWwgbm9kZSAqLworCWlmICh0Yi0+dm5fYnVmKSB7CisJICAgIC8qIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBiZWZvcmUgKi8KKwkgICAgcmVpc2VyZnNfa2ZyZWUgKHRiLT52bl9idWYsIHRiLT52bl9idWZfc2l6ZSwgdGItPnRiX3NiKTsKKwkgICAgLyogdGhpcyBpcyBub3QgbmVlZGVkIGlmIGtmcmVlIGlzIGF0b21pYyAqLworICAgICAgICAgICAgY2hlY2tfZnMgPSAxOworCX0KKworCS8qIHZpcnR1YWwgbm9kZSByZXF1aXJlcyBub3cgbW9yZSBtZW1vcnkgKi8KKwl0Yi0+dm5fYnVmX3NpemUgPSBzaXplOworCisJLyogZ2V0IG1lbW9yeSBmb3IgdmlydHVhbCBpdGVtICovCisJYnVmID0gcmVpc2VyZnNfa21hbGxvYyhzaXplLCBHRlBfQVRPTUlDIHwgX19HRlBfTk9XQVJOLCB0Yi0+dGJfc2IpOworCWlmICggISBidWYgKSB7CisJICAgIC8qIGdldHRpbmcgbWVtb3J5IHdpdGggR0ZQX0tFUk5FTCBwcmlvcml0eSBtYXkgaW52b2x2ZQorICAgICAgICAgICAgICAgYmFsYW5jaW5nIG5vdyAoZHVlIHRvIGluZGlyZWN0X3RvX2RpcmVjdCBjb252ZXJzaW9uIG9uCisgICAgICAgICAgICAgICBkY2FjaGUgc2hyaW5raW5nKS4gU28sIHJlbGVhc2UgcGF0aCBhbmQgY29sbGVjdGVkCisgICAgICAgICAgICAgICByZXNvdXJjZXMgaGVyZSAqLworCSAgICBmcmVlX2J1ZmZlcnNfaW5fdGIgKHRiKTsKKwkgICAgYnVmID0gcmVpc2VyZnNfa21hbGxvYyhzaXplLCBHRlBfTk9GUywgdGItPnRiX3NiKTsKKwkgICAgaWYgKCAhYnVmICkgeworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworCQlyZWlzZXJmc193YXJuaW5nICh0Yi0+dGJfc2IsCisJCQkJICAidnMtODM0NTogZ2V0X21lbV9mb3JfdmlydHVhbF9ub2RlOiAiCisJCQkJICAia21hbGxvYyBmYWlsZWQuIHJlaXNlcmZzIGttYWxsb2NlZCAlZCBieXRlcyIsCisJCQkJICBSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX2ttYWxsb2NzKTsKKyNlbmRpZgorCQl0Yi0+dm5fYnVmX3NpemUgPSAwOworCSAgICB9CisJICAgIHRiLT52bl9idWYgPSBidWY7CisJICAgIHNjaGVkdWxlKCkgOworCSAgICByZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwl9CisKKwl0Yi0+dm5fYnVmID0gYnVmOworICAgIH0KKworICAgIGlmICggY2hlY2tfZnMgJiYgRklMRVNZU1RFTV9DSEFOR0VEX1RCICh0YikgKQorICAgICAgICByZXR1cm4gUkVQRUFUX1NFQVJDSDsKKworICAgIHJldHVybiBDQVJSWV9PTjsKK30KKworCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCitzdGF0aWMgdm9pZCB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IsCisJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIHBfc19iaCwgCisJCQkJICAgIGNvbnN0IGNoYXIgKmRlc2NyLCBpbnQgbGV2ZWwpIHsKKyAgaWYgKHBfc19iaCkgeworICAgIGlmIChhdG9taWNfcmVhZCAoJihwX3NfYmgtPmJfY291bnQpKSA8PSAwKSB7CisKKyAgICAgIHJlaXNlcmZzX3BhbmljIChwX3Nfc2IsICJqbWFjZC0xOiB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKCk6IG5lZ2F0aXZlIG9yIHplcm8gcmVmZXJlbmNlIGNvdW50ZXIgZm9yIGJ1ZmZlciAlc1slZF0gKCViKVxuIiwgZGVzY3IsIGxldmVsLCBwX3NfYmgpOworICAgIH0KKworICAgIGlmICggISBidWZmZXJfdXB0b2RhdGUgKHBfc19iaCkgKSB7CisgICAgICByZWlzZXJmc19wYW5pYyAocF9zX3NiLCAiam1hY2QtMjogdGJfYnVmZmVyX3Nhbml0eV9jaGVjaygpOiBidWZmZXIgaXMgbm90IHVwIHRvIGRhdGUgJXNbJWRdICglYilcbiIsIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKKyAgICB9CisKKyAgICBpZiAoICEgQl9JU19JTl9UUkVFIChwX3NfYmgpICkgeworICAgICAgcmVpc2VyZnNfcGFuaWMgKHBfc19zYiwgImptYWNkLTM6IHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soKTogYnVmZmVyIGlzIG5vdCBpbiB0cmVlICVzWyVkXSAoJWIpXG4iLCBkZXNjciwgbGV2ZWwsIHBfc19iaCk7CisgICAgfQorCisgICAgaWYgKHBfc19iaC0+Yl9iZGV2ICE9IHBfc19zYi0+c19iZGV2KSB7CisJcmVpc2VyZnNfcGFuaWMgKHBfc19zYiwgImptYWNkLTQ6IHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soKTogYnVmZmVyIGhhcyB3cm9uZyBkZXZpY2UgJXNbJWRdICglYilcbiIsIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKKyAgICB9CisKKyAgICBpZiAocF9zX2JoLT5iX3NpemUgIT0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSkgeworCXJlaXNlcmZzX3BhbmljIChwX3Nfc2IsICJqbWFjZC01OiB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKCk6IGJ1ZmZlciBoYXMgd3JvbmcgYmxvY2tzaXplICVzWyVkXSAoJWIpXG4iLCBkZXNjciwgbGV2ZWwsIHBfc19iaCk7CisgICAgfQorCisgICAgaWYgKHBfc19iaC0+Yl9ibG9ja25yID4gU0JfQkxPQ0tfQ09VTlQocF9zX3NiKSkgeworCXJlaXNlcmZzX3BhbmljIChwX3Nfc2IsICJqbWFjZC02OiB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKCk6IGJ1ZmZlciBibG9jayBudW1iZXIgdG9vIGhpZ2ggJXNbJWRdICglYilcbiIsIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKKyAgICB9CisgIH0KK30KKyNlbHNlCitzdGF0aWMgdm9pZCB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IsCisJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIHBfc19iaCwgCisJCQkJICAgIGNvbnN0IGNoYXIgKmRlc2NyLCBpbnQgbGV2ZWwpCit7O30KKyNlbmRpZgorCitzdGF0aWMgaW50IGNsZWFyX2FsbF9kaXJ0eV9iaXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIHsKKyAgcmV0dXJuIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgYmgsIDApIDsKK30KKworc3RhdGljIGludCB3YWl0X3RiX2J1ZmZlcnNfdW50aWxfdW5sb2NrZWQgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiBwX3NfdGIpCit7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogbG9ja2VkOworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworICAgIGludCByZXBlYXRfY291bnRlciA9IDA7CisjZW5kaWYKKyAgICBpbnQgaTsKKworICAgIGRvIHsKKworCWxvY2tlZCA9IE5VTEw7CisKKwlmb3IgKCBpID0gcF9zX3RiLT50Yl9wYXRoLT5wYXRoX2xlbmd0aDsgIWxvY2tlZCAmJiBpID4gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUOyBpLS0gKSB7CisJICAgIGlmICggUEFUSF9PRkZTRVRfUEJVRkZFUiAocF9zX3RiLT50Yl9wYXRoLCBpKSApIHsKKwkJLyogaWYgSSB1bmRlcnN0YW5kIGNvcnJlY3RseSwgd2UgY2FuIG9ubHkgYmUgc3VyZSB0aGUgbGFzdCBidWZmZXIKKwkJKiogaW4gdGhlIHBhdGggaXMgaW4gdGhlIHRyZWUgLS1jbG0KKwkJKi8KKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKwkJaWYgKFBBVEhfUExBU1RfQlVGRkVSKHBfc190Yi0+dGJfcGF0aCkgPT0KKwkJICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBpKSkgeworCQkgICAgdGJfYnVmZmVyX3Nhbml0eV9jaGVjayAocF9zX3RiLT50Yl9zYiwgCisJCQkJCSAgICBQQVRIX09GRlNFVF9QQlVGRkVSIChwX3NfdGItPnRiX3BhdGgsIGkpLCAKKwkJCQkJICAgICJTIiwgCisJCQkJCSAgICBwX3NfdGItPnRiX3BhdGgtPnBhdGhfbGVuZ3RoIC0gaSk7CisJCX0KKyNlbmRpZgorCQlpZiAoIWNsZWFyX2FsbF9kaXJ0eV9iaXRzKHBfc190Yi0+dGJfc2IsCisJCQkJICAgICBQQVRIX09GRlNFVF9QQlVGRkVSIChwX3NfdGItPnRiX3BhdGgsIGkpKSkKKwkJeworCQkgICAgbG9ja2VkID0gUEFUSF9PRkZTRVRfUEJVRkZFUiAocF9zX3RiLT50Yl9wYXRoLCBpKTsKKwkJfQorCSAgICB9CisJfQorCisJZm9yICggaSA9IDA7ICFsb2NrZWQgJiYgaSA8IE1BWF9IRUlHSFQgJiYgcF9zX3RiLT5pbnNlcnRfc2l6ZVtpXTsgaSsrICkgeyAKKworCSAgICBpZiAocF9zX3RiLT5sbnVtW2ldICkgeworCisJCWlmICggcF9zX3RiLT5MW2ldICkgeworCQkgICAgdGJfYnVmZmVyX3Nhbml0eV9jaGVjayAocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5MW2ldLCAiTCIsIGkpOworCQkgICAgaWYgKCFjbGVhcl9hbGxfZGlydHlfYml0cyhwX3NfdGItPnRiX3NiLCBwX3NfdGItPkxbaV0pKQorCQkJbG9ja2VkID0gcF9zX3RiLT5MW2ldOworCQl9CisKKwkJaWYgKCAhbG9ja2VkICYmIHBfc190Yi0+RkxbaV0gKSB7CisJCSAgICB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPkZMW2ldLCAiRkwiLCBpKTsKKwkJICAgIGlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5GTFtpXSkpCisJCQlsb2NrZWQgPSBwX3NfdGItPkZMW2ldOworCQl9CisKKwkJaWYgKCAhbG9ja2VkICYmIHBfc190Yi0+Q0ZMW2ldICkgeworCQkgICAgdGJfYnVmZmVyX3Nhbml0eV9jaGVjayAocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5DRkxbaV0sICJDRkwiLCBpKTsKKwkJICAgIGlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5DRkxbaV0pKQorCQkJbG9ja2VkID0gcF9zX3RiLT5DRkxbaV07CisJCX0KKworCSAgICB9CisKKwkgICAgaWYgKCAhbG9ja2VkICYmIChwX3NfdGItPnJudW1baV0pICkgeworCisJCWlmICggcF9zX3RiLT5SW2ldICkgeworCQkgICAgdGJfYnVmZmVyX3Nhbml0eV9jaGVjayAocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5SW2ldLCAiUiIsIGkpOworCQkgICAgaWYgKCFjbGVhcl9hbGxfZGlydHlfYml0cyhwX3NfdGItPnRiX3NiLCBwX3NfdGItPlJbaV0pKQorCQkJbG9ja2VkID0gcF9zX3RiLT5SW2ldOworCQl9CisKKyAgICAgICAKKwkJaWYgKCAhbG9ja2VkICYmIHBfc190Yi0+RlJbaV0gKSB7CisJCSAgICB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPkZSW2ldLCAiRlIiLCBpKTsKKwkJICAgIGlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5GUltpXSkpCisJCQlsb2NrZWQgPSBwX3NfdGItPkZSW2ldOworCQl9CisKKwkJaWYgKCAhbG9ja2VkICYmIHBfc190Yi0+Q0ZSW2ldICkgeworCQkgICAgdGJfYnVmZmVyX3Nhbml0eV9jaGVjayAocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5DRlJbaV0sICJDRlIiLCBpKTsKKwkJICAgIGlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5DRlJbaV0pKQorCQkJbG9ja2VkID0gcF9zX3RiLT5DRlJbaV07CisJCX0KKwkgICAgfQorCX0KKwkvKiBhcyBmYXIgYXMgSSBjYW4gdGVsbCwgdGhpcyBpcyBub3QgcmVxdWlyZWQuICBUaGUgRkVCIGxpc3Qgc2VlbXMKKwkqKiB0byBiZSBmdWxsIG9mIG5ld2x5IGFsbG9jYXRlZCBub2Rlcywgd2hpY2ggd2lsbCBuZXZlciBiZSBsb2NrZWQsCisJKiogZGlydHksIG9yIGFueXRoaW5nIGVsc2UuCisJKiogVG8gYmUgc2FmZSwgSSdtIHB1dHRpbmcgaW4gdGhlIGNoZWNrcyBhbmQgd2FpdHMgaW4uICBGb3IgdGhlIG1vbWVudCwKKwkqKiB0aGV5IGFyZSBuZWVkZWQgdG8ga2VlcCB0aGUgY29kZSBpbiBqb3VybmFsLmMgZnJvbSBjb21wbGFpbmluZworCSoqIGFib3V0IHRoZSBidWZmZXIuICBUaGF0IGNvZGUgaXMgaW5zaWRlIENPTkZJR19SRUlTRVJGU19DSEVDSyBhcyB3ZWxsLgorCSoqIC0tY2xtCisJKi8KKwlmb3IgKCBpID0gMDsgIWxvY2tlZCAmJiBpIDwgTUFYX0ZFQl9TSVpFOyBpKysgKSB7IAorCSAgICBpZiAoIHBfc190Yi0+RkVCW2ldICkgeworCQlpZiAoIWNsZWFyX2FsbF9kaXJ0eV9iaXRzKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+RkVCW2ldKSkKKwkJICAgIGxvY2tlZCA9IHBfc190Yi0+RkVCW2ldIDsKKwkgICAgfQorCX0KKworCWlmIChsb2NrZWQpIHsKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKwkgICAgcmVwZWF0X2NvdW50ZXIrKzsKKwkgICAgaWYgKCAocmVwZWF0X2NvdW50ZXIgJSAxMDAwMCkgPT0gMCkgeworCQlyZWlzZXJmc193YXJuaW5nIChwX3NfdGItPnRiX3NiLAorCQkJCSAgIndhaXRfdGJfYnVmZmVyc191bnRpbF9yZWxlYXNlZCgpOiB0b28gbWFueSAiCisJCQkJICAiaXRlcmF0aW9ucyB3YWl0aW5nIGZvciBidWZmZXIgdG8gdW5sb2NrICIKKwkJCQkgICIoJWIpIiwgbG9ja2VkKTsKKworCQkvKiBEb24ndCBsb29wIGZvcmV2ZXIuICBUcnkgdG8gcmVjb3ZlciBmcm9tIHBvc3NpYmxlIGVycm9yLiAqLworCisJCXJldHVybiAoIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAocF9zX3RiKSApID8gUkVQRUFUX1NFQVJDSCA6IENBUlJZX09OOworCSAgICB9CisjZW5kaWYKKwkgICAgX193YWl0X29uX2J1ZmZlciAobG9ja2VkKTsKKwkgICAgaWYgKCBGSUxFU1lTVEVNX0NIQU5HRURfVEIgKHBfc190YikgKSB7CisJCXJldHVybiBSRVBFQVRfU0VBUkNIOworCSAgICB9CisJfQorCisgICAgfSB3aGlsZSAobG9ja2VkKTsKKworICAgIHJldHVybiBDQVJSWV9PTjsKK30KKworCisvKiBQcmVwYXJlIGZvciBiYWxhbmNpbmcsIHRoYXQgaXMKKyAqCWdldCBhbGwgbmVjZXNzYXJ5IHBhcmVudHMsIGFuZCBuZWlnaGJvcnM7CisgKglhbmFseXplIHdoYXQgYW5kIHdoZXJlIHNob3VsZCBiZSBtb3ZlZDsKKyAqCWdldCBzdWZmaWNpZW50IG51bWJlciBvZiBuZXcgbm9kZXM7CisgKiBCYWxhbmNpbmcgd2lsbCBzdGFydCBvbmx5IGFmdGVyIGFsbCByZXNvdXJjZXMgd2lsbCBiZSBjb2xsZWN0ZWQgYXQgYSB0aW1lLgorICogCisgKiBXaGVuIHBvcnRlZCB0byBTTVAga2VybmVscywgb25seSBhdCB0aGUgbGFzdCBtb21lbnQgYWZ0ZXIgYWxsIG5lZWRlZCBub2RlcworICogYXJlIGNvbGxlY3RlZCBpbiBjYWNoZSwgd2lsbCB0aGUgcmVzb3VyY2VzIGJlIGxvY2tlZCB1c2luZyB0aGUgdXN1YWwKKyAqIHRleHRib29rIG9yZGVyZWQgbG9jayBhY3F1aXNpdGlvbiBhbGdvcml0aG1zLiAgTm90ZSB0aGF0IGVuc3VyaW5nIHRoYXQKKyAqIHRoaXMgY29kZSBuZWl0aGVyIHdyaXRlIGxvY2tzIHdoYXQgaXQgZG9lcyBub3QgbmVlZCB0byB3cml0ZSBsb2NrIG5vciBsb2NrcyBvdXQgb2Ygb3JkZXIKKyAqIHdpbGwgYmUgYSBwYWluIGluIHRoZSBidXR0IHRoYXQgY291bGQgaGF2ZSBiZWVuIGF2b2lkZWQuICBHcnVtYmxlIGdydW1ibGUuIC1IYW5zCisgKiAKKyAqIGZpeCBpcyBtZWFudCBpbiB0aGUgc2Vuc2Ugb2YgcmVuZGVyIHVuY2hhbmdpbmcKKyAqIAorICogTGF0ZW5jeSBtaWdodCBiZSBpbXByb3ZlZCBieSBmaXJzdCBnYXRoZXJpbmcgYSBsaXN0IG9mIHdoYXQgYnVmZmVycyBhcmUgbmVlZGVkCisgKiBhbmQgdGhlbiBnZXR0aW5nIGFzIG1hbnkgb2YgdGhlbSBpbiBwYXJhbGxlbCBhcyBwb3NzaWJsZT8gLUhhbnMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICoJb3BfbW9kZQlpIC0gaW5zZXJ0LCBkIC0gZGVsZXRlLCBjIC0gY3V0ICh0cnVuY2F0ZSksIHAgLSBwYXN0ZSAoYXBwZW5kKQorICoJdGIJdHJlZV9iYWxhbmNlIHN0cnVjdHVyZTsKKyAqCWludW0JaXRlbSBudW1iZXIgaW4gU1toXTsKKyAqICAgICAgcG9zX2luX2l0ZW0gLSBjb21tZW50IHRoaXMgaWYgeW91IGNhbgorICogICAgICBpbnNfaWggJiBpbnNfc2QgYXJlIHVzZWQgd2hlbiBpbnNlcnRpbmcKKyAqIFJldHVybnM6CTEgLSBzY2hlZHVsZSBvY2N1cnJlZCB3aGlsZSB0aGUgZnVuY3Rpb24gd29ya2VkOworICoJICAgICAgICAwIC0gc2NoZWR1bGUgZGlkbid0IG9jY3VyIHdoaWxlIHRoZSBmdW5jdGlvbiB3b3JrZWQ7CisgKiAgICAgICAgICAgICAtMSAtIGlmIG5vX2Rpc2tfc3BhY2UgCisgKi8KKworCitpbnQgZml4X25vZGVzIChpbnQgbl9vcF9tb2RlLAorCSAgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogCXBfc190YiwKKwkgICAgICAgc3RydWN0IGl0ZW1faGVhZCAqIHBfc19pbnNfaWgsIC8vIGl0ZW0gaGVhZCBvZiBpdGVtIGJlaW5nIGluc2VydGVkCisJICAgICAgIGNvbnN0IHZvaWQgKiBkYXRhIC8vIGluc2VydGVkIGl0ZW0gb3IgZGF0YSB0byBiZSBwYXN0ZWQKKyAgICApIHsKKyAgICBpbnQJbl9yZXRfdmFsdWUsCisgICAgCW5faCwKKyAgICAJbl9pdGVtX251bSA9IFBBVEhfTEFTVF9QT1NJVElPTihwX3NfdGItPnRiX3BhdGgpOworICAgIGludCBuX3Bvc19pbl9pdGVtOworCisgICAgLyogd2Ugc2V0IHdhaXRfdGJfYnVmZmVyc19ydW4gd2hlbiB3ZSBoYXZlIHRvIHJlc3RvcmUgYW55IGRpcnR5IGJpdHMgY2xlYXJlZAorICAgICoqIGR1cmluZyB3YWl0X3RiX2J1ZmZlcnNfcnVuCisgICAgKi8KKyAgICBpbnQgd2FpdF90Yl9idWZmZXJzX3J1biA9IDAgOyAKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICogcF9zX3RiUzAgPSBQQVRIX1BMQVNUX0JVRkZFUihwX3NfdGItPnRiX3BhdGgpOworCisgICAgKysgUkVJU0VSRlNfU0IocF9zX3RiIC0+IHRiX3NiKSAtPiBzX2ZpeF9ub2RlczsKKworICAgIG5fcG9zX2luX2l0ZW0gPSBwX3NfdGItPnRiX3BhdGgtPnBvc19pbl9pdGVtOworCisKKyAgICBwX3NfdGItPmZzX2dlbiA9IGdldF9nZW5lcmF0aW9uIChwX3NfdGItPnRiX3NiKTsKKworICAgIC8qIHdlIHByZXBhcmUgYW5kIGxvZyB0aGUgc3VwZXIgaGVyZSBzbyBpdCB3aWxsIGFscmVhZHkgYmUgaW4gdGhlCisgICAgKiogdHJhbnNhY3Rpb24gd2hlbiBkb19iYWxhbmNlIG5lZWRzIHRvIGNoYW5nZSBpdC4KKyAgICAqKiBUaGlzIHdheSBkb19iYWxhbmNlIHdvbid0IGhhdmUgdG8gc2NoZWR1bGUgd2hlbiB0cnlpbmcgdG8gcHJlcGFyZQorICAgICoqIHRoZSBzdXBlciBmb3IgbG9nZ2luZworICAgICovCisgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChwX3NfdGItPnRiX3NiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCX0JVRkZFUl9XSVRIX1NCKHBfc190Yi0+dGJfc2IpLCAxKSA7CisgICAgam91cm5hbF9tYXJrX2RpcnR5KHBfc190Yi0+dHJhbnNhY3Rpb25faGFuZGxlLCBwX3NfdGItPnRiX3NiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3RiLT50Yl9zYikpIDsKKyAgICBpZiAoIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAocF9zX3RiKSApCisJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisKKyAgICAvKiBpZiBpdCBwb3NzaWJsZSBpbiBpbmRpcmVjdF90b19kaXJlY3QgY29udmVyc2lvbiAqLworICAgIGlmIChidWZmZXJfbG9ja2VkIChwX3NfdGJTMCkpIHsKKyAgICAgICAgX193YWl0X29uX2J1ZmZlciAocF9zX3RiUzApOworICAgICAgICBpZiAoIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAocF9zX3RiKSApCisgICAgICAgICAgICByZXR1cm4gUkVQRUFUX1NFQVJDSDsKKyAgICB9CisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKyAgICBpZiAoIGN1cl90YiApIHsKKwlwcmludF9jdXJfdGIgKCJmaXhfbm9kZXMiKTsKKwlyZWlzZXJmc19wYW5pYyhwX3NfdGItPnRiX3NiLCJQQVAtODMwNTogZml4X25vZGVzOiAgdGhlcmUgaXMgcGVuZGluZyBkb19iYWxhbmNlIik7CisgICAgfQorCisgICAgaWYgKCFidWZmZXJfdXB0b2RhdGUgKHBfc190YlMwKSB8fCAhQl9JU19JTl9UUkVFIChwX3NfdGJTMCkpIHsKKwlyZWlzZXJmc19wYW5pYyAocF9zX3RiLT50Yl9zYiwgIlBBUC04MzIwOiBmaXhfbm9kZXM6IFNbMF0gKCViICV6KSBpcyBub3QgdXB0b2RhdGUgIgorCQkJImF0IHRoZSBiZWdpbm5pbmcgb2YgZml4X25vZGVzIG9yIG5vdCBpbiB0cmVlIChtb2RlICVjKSIsIHBfc190YlMwLCBwX3NfdGJTMCwgbl9vcF9tb2RlKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBwYXJhbWV0ZXJzLiAqLworICAgIHN3aXRjaCAobl9vcF9tb2RlKSB7CisgICAgY2FzZSBNX0lOU0VSVDoKKwlpZiAoIG5faXRlbV9udW0gPD0gMCB8fCBuX2l0ZW1fbnVtID4gQl9OUl9JVEVNUyhwX3NfdGJTMCkgKQorCSAgICByZWlzZXJmc19wYW5pYyhwX3NfdGItPnRiX3NiLCJQQVAtODMzMDogZml4X25vZGVzOiBJbmNvcnJlY3QgaXRlbSBudW1iZXIgJWQgKGluIFMwIC0gJWQpIGluIGNhc2Ugb2YgaW5zZXJ0IiwKKwkJCSAgIG5faXRlbV9udW0sIEJfTlJfSVRFTVMocF9zX3RiUzApKTsKKwlicmVhazsKKyAgICBjYXNlIE1fUEFTVEU6CisgICAgY2FzZSBNX0RFTEVURToKKyAgICBjYXNlIE1fQ1VUOgorCWlmICggbl9pdGVtX251bSA8IDAgfHwgbl9pdGVtX251bSA+PSBCX05SX0lURU1TKHBfc190YlMwKSApIHsKKwkgICAgcHJpbnRfYmxvY2sgKHBfc190YlMwLCAwLCAtMSwgLTEpOworCSAgICByZWlzZXJmc19wYW5pYyhwX3NfdGItPnRiX3NiLCJQQVAtODMzNTogZml4X25vZGVzOiBJbmNvcnJlY3QgaXRlbSBudW1iZXIoJWQpOyBtb2RlID0gJWMgaW5zZXJ0X3NpemUgPSAlZFxuIiwgbl9pdGVtX251bSwgbl9vcF9tb2RlLCBwX3NfdGItPmluc2VydF9zaXplWzBdKTsKKwl9CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlyZWlzZXJmc19wYW5pYyhwX3NfdGItPnRiX3NiLCJQQVAtODM0MDogZml4X25vZGVzOiBJbmNvcnJlY3QgbW9kZSBvZiBvcGVyYXRpb24iKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChnZXRfbWVtX2Zvcl92aXJ0dWFsX25vZGUgKHBfc190YikgPT0gUkVQRUFUX1NFQVJDSCkKKwkvLyBGSVhNRTogbWF5YmUgLUVOT01FTSB3aGVuIHRiLT52bl9idWYgPT0gMD8gTm93IGp1c3QgcmVwZWF0CisJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisKKworICAgIC8qIFN0YXJ0aW5nIGZyb20gdGhlIGxlYWYgbGV2ZWw7IGZvciBhbGwgbGV2ZWxzIG5faCBvZiB0aGUgdHJlZS4gKi8KKyAgICBmb3IgKCBuX2ggPSAwOyBuX2ggPCBNQVhfSEVJR0hUICYmIHBfc190Yi0+aW5zZXJ0X3NpemVbbl9oXTsgbl9oKysgKSB7IAorCWlmICggKG5fcmV0X3ZhbHVlID0gZ2V0X2RpcmVjdF9wYXJlbnQocF9zX3RiLCBuX2gpKSAhPSBDQVJSWV9PTiApIHsKKwkgICAgZ290byByZXBlYXQ7CisJfQorCisJaWYgKCAobl9yZXRfdmFsdWUgPSBjaGVja19iYWxhbmNlIChuX29wX21vZGUsIHBfc190Yiwgbl9oLCBuX2l0ZW1fbnVtLAorCQkJCQkgICBuX3Bvc19pbl9pdGVtLCBwX3NfaW5zX2loLCBkYXRhKSkgIT0gQ0FSUllfT04gKSB7CisJICAgIGlmICggbl9yZXRfdmFsdWUgPT0gTk9fQkFMQU5DSU5HX05FRURFRCApIHsKKwkJLyogTm8gYmFsYW5jaW5nIGZvciBoaWdoZXIgbGV2ZWxzIG5lZWRlZC4gKi8KKwkJaWYgKCAobl9yZXRfdmFsdWUgPSBnZXRfbmVpZ2hib3JzKHBfc190Yiwgbl9oKSkgIT0gQ0FSUllfT04gKSB7CisJCSAgICBnb3RvIHJlcGVhdDsKKwkJfQorCQlpZiAoIG5faCAhPSBNQVhfSEVJR0hUIC0gMSApICAKKwkJICAgIHBfc190Yi0+aW5zZXJ0X3NpemVbbl9oICsgMV0gPSAwOworCQkvKiBvaywgYW5hbHlzaXMgYW5kIHJlc291cmNlIGdhdGhlcmluZyBhcmUgY29tcGxldGUgKi8KKwkJYnJlYWs7CisJICAgIH0KKwkgICAgZ290byByZXBlYXQ7CisJfQorCisJaWYgKCAobl9yZXRfdmFsdWUgPSBnZXRfbmVpZ2hib3JzKHBfc190Yiwgbl9oKSkgIT0gQ0FSUllfT04gKSB7CisJICAgIGdvdG8gcmVwZWF0OworCX0KKworCWlmICggKG5fcmV0X3ZhbHVlID0gZ2V0X2VtcHR5X25vZGVzKHBfc190Yiwgbl9oKSkgIT0gQ0FSUllfT04gKSB7CisJICAgIGdvdG8gcmVwZWF0OyAgICAgICAgLyogTm8gZGlzayBzcGFjZSwgb3Igc2NoZWR1bGUgb2NjdXJyZWQgYW5kCisJCQkJICAgYW5hbHlzaXMgbWF5IGJlIGludmFsaWQgYW5kIG5lZWRzIHRvIGJlIHJlZG9uZS4gKi8KKwl9CisgICAgCisJaWYgKCAhIFBBVEhfSF9QQlVGRkVSKHBfc190Yi0+dGJfcGF0aCwgbl9oKSApIHsKKwkgICAgLyogV2UgaGF2ZSBhIHBvc2l0aXZlIGluc2VydCBzaXplIGJ1dCBubyBub2RlcyBleGlzdCBvbiB0aGlzCisJICAgICAgIGxldmVsLCB0aGlzIG1lYW5zIHRoYXQgd2UgYXJlIGNyZWF0aW5nIGEgbmV3IHJvb3QuICovCisKKwkgICAgUkZBTFNFKCBwX3NfdGItPmJsa251bVtuX2hdICE9IDEsCisJCSAgICAiUEFQLTgzNTA6IGNyZWF0aW5nIG5ldyBlbXB0eSByb290Iik7CisKKwkgICAgaWYgKCBuX2ggPCBNQVhfSEVJR0hUIC0gMSApCisJCXBfc190Yi0+aW5zZXJ0X3NpemVbbl9oICsgMV0gPSAwOworCX0KKwllbHNlCisJICAgIGlmICggISBQQVRIX0hfUEJVRkZFUihwX3NfdGItPnRiX3BhdGgsIG5faCArIDEpICkgeworCQlpZiAoIHBfc190Yi0+YmxrbnVtW25faF0gPiAxICkgeworCQkgICAgLyogVGhlIHRyZWUgbmVlZHMgdG8gYmUgZ3Jvd24sIHNvIHRoaXMgbm9kZSBTW25faF0KKwkJICAgICAgIHdoaWNoIGlzIHRoZSByb290IG5vZGUgaXMgc3BsaXQgaW50byB0d28gbm9kZXMsCisJCSAgICAgICBhbmQgYSBuZXcgbm9kZSAoU1tuX2grMV0pIHdpbGwgYmUgY3JlYXRlZCB0bworCQkgICAgICAgYmVjb21lIHRoZSByb290IG5vZGUuICAqLworCSAgCisJCSAgICBSRkFMU0UoIG5faCA9PSBNQVhfSEVJR0hUIC0gMSwKKwkJCSAgICAiUEFQLTgzNTU6IGF0dGVtcHQgdG8gY3JlYXRlIHRvbyBoaWdoIG9mIGEgdHJlZSIpOworCisJCSAgICBwX3NfdGItPmluc2VydF9zaXplW25faCArIDFdID0gKERDX1NJWkUgKyBLRVlfU0laRSkgKiAocF9zX3RiLT5ibGtudW1bbl9oXSAtIDEpICsgRENfU0laRTsKKwkJfQorCQllbHNlCisJCSAgICBpZiAoIG5faCA8IE1BWF9IRUlHSFQgLSAxICkKKwkJCXBfc190Yi0+aW5zZXJ0X3NpemVbbl9oICsgMV0gPSAwOworCSAgICB9CisJICAgIGVsc2UKKwkJcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2ggKyAxXSA9IChEQ19TSVpFICsgS0VZX1NJWkUpICogKHBfc190Yi0+YmxrbnVtW25faF0gLSAxKTsKKyAgICB9CisKKyAgICBpZiAoKG5fcmV0X3ZhbHVlID0gd2FpdF90Yl9idWZmZXJzX3VudGlsX3VubG9ja2VkIChwX3NfdGIpKSA9PSBDQVJSWV9PTikgeworCWlmIChGSUxFU1lTVEVNX0NIQU5HRURfVEIocF9zX3RiKSkgeworCSAgICB3YWl0X3RiX2J1ZmZlcnNfcnVuID0gMSA7CisJICAgIG5fcmV0X3ZhbHVlID0gUkVQRUFUX1NFQVJDSCA7CisJICAgIGdvdG8gcmVwZWF0OyAKKwl9IGVsc2UgeworCSAgICByZXR1cm4gQ0FSUllfT047CisJfQorICAgIH0gZWxzZSB7CisJd2FpdF90Yl9idWZmZXJzX3J1biA9IDEgOworCWdvdG8gcmVwZWF0OyAKKyAgICB9CisKKyByZXBlYXQ6CisgICAgLy8gZml4X25vZGVzIHdhcyB1bmFibGUgdG8gcGVyZm9ybSBpdHMgY2FsY3VsYXRpb24gZHVlIHRvCisgICAgLy8gZmlsZXN5c3RlbSBnb3QgY2hhbmdlZCB1bmRlciB1cywgbGFjayBvZiBmcmVlIGRpc2sgc3BhY2Ugb3IgaS9vCisgICAgLy8gZmFpbHVyZS4gSWYgdGhlIGZpcnN0IGlzIHRoZSBjYXNlIC0gdGhlIHNlYXJjaCB3aWxsIGJlCisgICAgLy8gcmVwZWF0ZWQuIEZvciBub3cgLSBmcmVlIGFsbCByZXNvdXJjZXMgYWNxdWlyZWQgc28gZmFyIGV4Y2VwdAorICAgIC8vIGZvciB0aGUgbmV3IGFsbG9jYXRlZCBub2RlcworICAgIHsKKwlpbnQgaTsKKworCS8qIFJlbGVhc2UgcGF0aCBidWZmZXJzLiAqLworCWlmICh3YWl0X3RiX2J1ZmZlcnNfcnVuKSB7CisJICAgIHBhdGhyZWxzZV9hbmRfcmVzdG9yZShwX3NfdGItPnRiX3NiLCBwX3NfdGItPnRiX3BhdGgpIDsKKwl9IGVsc2UgeworCSAgICBwYXRocmVsc2UgKHBfc190Yi0+dGJfcGF0aCk7CisgICAgICAgIH0JCisJLyogYnJlbHNlIGFsbCByZXNvdXJjZXMgY29sbGVjdGVkIGZvciBiYWxhbmNpbmcgKi8KKwlmb3IgKCBpID0gMDsgaSA8IE1BWF9IRUlHSFQ7IGkrKyApIHsKKwkgICAgaWYgKHdhaXRfdGJfYnVmZmVyc19ydW4pIHsKKwkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5MW2ldKTsKKwkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5SW2ldKTsKKwkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5GTFtpXSk7CisJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+RlJbaV0pOworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLCBwX3NfdGItPkNGTFtpXSk7CisJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+Q0ZSW2ldKTsKKwkgICAgfQorCisJICAgIGJyZWxzZSAocF9zX3RiLT5MW2ldKTtwX3NfdGItPkxbaV0gPSBOVUxMOworCSAgICBicmVsc2UgKHBfc190Yi0+UltpXSk7cF9zX3RiLT5SW2ldID0gTlVMTDsKKwkgICAgYnJlbHNlIChwX3NfdGItPkZMW2ldKTtwX3NfdGItPkZMW2ldID0gTlVMTDsKKwkgICAgYnJlbHNlIChwX3NfdGItPkZSW2ldKTtwX3NfdGItPkZSW2ldID0gTlVMTDsKKwkgICAgYnJlbHNlIChwX3NfdGItPkNGTFtpXSk7cF9zX3RiLT5DRkxbaV0gPSBOVUxMOworCSAgICBicmVsc2UgKHBfc190Yi0+Q0ZSW2ldKTtwX3NfdGItPkNGUltpXSA9IE5VTEw7CisJfQorCisJaWYgKHdhaXRfdGJfYnVmZmVyc19ydW4pIHsKKwkgICAgZm9yICggaSA9IDA7IGkgPCBNQVhfRkVCX1NJWkU7IGkrKyApIHsgCisJCWlmICggcF9zX3RiLT5GRUJbaV0gKSB7CisJCSAgICByZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLCAKKwkJCQkJCSAgICAgcF9zX3RiLT5GRUJbaV0pIDsKKwkJfQorCSAgICB9CisJfQorCXJldHVybiBuX3JldF92YWx1ZTsKKyAgICB9CisKK30KKworCisvKiBBbmF0b2x5IHdpbGwgcHJvYmFibHkgZm9yZ2l2ZSBtZSByZW5hbWluZyBwX3NfdGIgdG8gdGIuIEkganVzdAorICAgd2FudGVkIHRvIG1ha2UgbGluZXMgc2hvcnRlciAqLwordm9pZCB1bmZpeF9ub2RlcyAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiKQoreworICAgIGludAlpOworCisgICAgLyogUmVsZWFzZSBwYXRoIGJ1ZmZlcnMuICovCisgICAgcGF0aHJlbHNlX2FuZF9yZXN0b3JlICh0Yi0+dGJfc2IsIHRiLT50Yl9wYXRoKTsKKworICAgIC8qIGJyZWxzZSBhbGwgcmVzb3VyY2VzIGNvbGxlY3RlZCBmb3IgYmFsYW5jaW5nICovCisgICAgZm9yICggaSA9IDA7IGkgPCBNQVhfSEVJR0hUOyBpKysgKSB7CisJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKHRiLT50Yl9zYiwgdGItPkxbaV0pOworCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyICh0Yi0+dGJfc2IsIHRiLT5SW2ldKTsKKwlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAodGItPnRiX3NiLCB0Yi0+RkxbaV0pOworCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyICh0Yi0+dGJfc2IsIHRiLT5GUltpXSk7CisJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKHRiLT50Yl9zYiwgdGItPkNGTFtpXSk7CisJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKHRiLT50Yl9zYiwgdGItPkNGUltpXSk7CisKKwlicmVsc2UgKHRiLT5MW2ldKTsKKwlicmVsc2UgKHRiLT5SW2ldKTsKKwlicmVsc2UgKHRiLT5GTFtpXSk7CisJYnJlbHNlICh0Yi0+RlJbaV0pOworCWJyZWxzZSAodGItPkNGTFtpXSk7CisJYnJlbHNlICh0Yi0+Q0ZSW2ldKTsKKyAgICB9CisKKyAgICAvKiBkZWFsIHdpdGggbGlzdCBvZiBhbGxvY2F0ZWQgKHVzZWQgYW5kIHVudXNlZCkgbm9kZXMgKi8KKyAgICBmb3IgKCBpID0gMDsgaSA8IE1BWF9GRUJfU0laRTsgaSsrICkgeworCWlmICggdGItPkZFQltpXSApIHsKKwkgICAgYl9ibG9ja25yX3QgYmxvY2tuciAgPSB0Yi0+RkVCW2ldLT5iX2Jsb2NrbnIgOworCSAgICAvKiBkZS1hbGxvY2F0ZWQgYmxvY2sgd2hpY2ggd2FzIG5vdCB1c2VkIGJ5IGJhbGFuY2luZyBhbmQKKyAgICAgICAgICAgICAgIGJmb3JnZXQgYWJvdXQgYnVmZmVyIGZvciBpdCAqLworCSAgICBicmVsc2UgKHRiLT5GRUJbaV0pOworCSAgICByZWlzZXJmc19mcmVlX2Jsb2NrICh0Yi0+dHJhbnNhY3Rpb25faGFuZGxlLCBOVUxMLCBibG9ja25yLCAwKTsKKwl9CisJaWYgKHRiLT51c2VkW2ldKSB7CisJICAgIC8qIHJlbGVhc2UgdXNlZCBhcyBuZXcgbm9kZXMgaW5jbHVkaW5nIGEgbmV3IHJvb3QgKi8KKwkgICAgYnJlbHNlICh0Yi0+dXNlZFtpXSk7CisJfQorICAgIH0KKworICAgIGlmICh0Yi0+dm5fYnVmKSAKKyAgICByZWlzZXJmc19rZnJlZSAodGItPnZuX2J1ZiwgdGItPnZuX2J1Zl9zaXplLCB0Yi0+dGJfc2IpOworCit9IAorCisKKwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvaGFzaGVzLmMgYi9mcy9yZWlzZXJmcy9oYXNoZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGQwNTA4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcmVpc2VyZnMvaGFzaGVzLmMKQEAgLTAsMCArMSwyMDkgQEAKKworLyoKKyAqIEtleWVkIDMyLWJpdCBoYXNoIGZ1bmN0aW9uIHVzaW5nIFRFQSBpbiBhIERhdmlzLU1leWVyIGZ1bmN0aW9uCisgKiAgIEgwID0gS2V5CisgKiAgIEhpID0gRSBNaShIaS0xKSArIEhpLTEKKyAqCisgKiAoc2VlIEFwcGxpZWQgQ3J5cHRvZ3JhcGh5LCAybmQgZWRpdGlvbiwgcDQ0OCkuCisgKgorICogSmVyZW15IEZpdHpoYXJkaW5nZSA8amVyZW15QHppcC5jb20uYXU+IDE5OTgKKyAqIAorICogSmVyZW15IGhhcyBhZ3JlZWQgdG8gdGhlIGNvbnRlbnRzIG9mIHJlaXNlcmZzL1JFQURNRS4gLUhhbnMKKyAqIFl1cmEncyBmdW5jdGlvbiBpcyBhZGRlZCAoMDQvMDcvMjAwMCkKKyAqLworCisvLworLy8ga2V5ZWRfaGFzaAorLy8geXVyYV9oYXNoCisvLyByNV9oYXNoCisvLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J1Zy5oPgorCisKKyNkZWZpbmUgREVMVEEgMHg5RTM3NzlCOQorI2RlZmluZSBGVUxMUk9VTkRTIDEwCQkvKiAzMiBpcyBvdmVya2lsbCwgMTYgaXMgc3Ryb25nIGNyeXB0byAqLworI2RlZmluZSBQQVJUUk9VTkRTIDYJCS8qIDYgZ2V0cyBjb21wbGV0ZSBtaXhpbmcgKi8KKworLyogYSwgYiwgYywgZCAtIGRhdGE7IGgwLCBoMSAtIGFjY3VtdWxhdGVkIGhhc2ggKi8KKyNkZWZpbmUgVEVBQ09SRShyb3VuZHMpCQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCXUzMiBzdW0gPSAwOwkJCQkJCVwKKwkJaW50IG4gPSByb3VuZHM7CQkJCQkJXAorCQl1MzIgYjAsIGIxOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwkJYjAgPSBoMDsJCQkJCQlcCisJCWIxID0gaDE7CQkJCQkJXAorCQkJCQkJCQkJXAorCQlkbwkJCQkJCQlcCisJCXsJCQkJCQkJXAorCQkJc3VtICs9IERFTFRBOwkJCQkJXAorCQkJYjAgKz0gKChiMSA8PCA0KSthKSBeIChiMStzdW0pIF4gKChiMSA+PiA1KStiKTsJXAorCQkJYjEgKz0gKChiMCA8PCA0KStjKSBeIChiMCtzdW0pIF4gKChiMCA+PiA1KStkKTsJXAorCQl9IHdoaWxlKC0tbik7CQkJCQkJXAorCQkJCQkJCQkJXAorCQloMCArPSBiMDsJCQkJCQlcCisJCWgxICs9IGIxOwkJCQkJCVwKKwl9IHdoaWxlKDApCisKKwordTMyIGtleWVkX2hhc2goY29uc3Qgc2lnbmVkIGNoYXIgKm1zZywgaW50IGxlbikKK3sKKwl1MzIga1tdID0geyAweDk0NjRhNDg1LCAweDU0MmUxYTk0LCAweDNlODQ2YmZmLCAweGI3NWJjZmMzfTsgCisKKwl1MzIgaDAgPSBrWzBdLCBoMSA9IGtbMV07CisJdTMyIGEsIGIsIGMsIGQ7CisJdTMyIHBhZDsKKwlpbnQgaTsKKyAKKwkvLwlhc3NlcnQobGVuID49IDAgJiYgbGVuIDwgMjU2KTsKKworCXBhZCA9ICh1MzIpbGVuIHwgKCh1MzIpbGVuIDw8IDgpOworCXBhZCB8PSBwYWQgPDwgMTY7CisKKwl3aGlsZShsZW4gPj0gMTYpCisJeworCQlhID0gKHUzMiltc2dbIDBdICAgICAgfAorCQkgICAgKHUzMiltc2dbIDFdIDw8IDggfAorCQkgICAgKHUzMiltc2dbIDJdIDw8IDE2fAorCQkgICAgKHUzMiltc2dbIDNdIDw8IDI0OworCQliID0gKHUzMiltc2dbIDRdICAgICAgfAorCQkgICAgKHUzMiltc2dbIDVdIDw8IDggfAorCQkgICAgKHUzMiltc2dbIDZdIDw8IDE2fAorCQkgICAgKHUzMiltc2dbIDddIDw8IDI0OworCQljID0gKHUzMiltc2dbIDhdICAgICAgfAorCQkgICAgKHUzMiltc2dbIDldIDw8IDggfAorCQkgICAgKHUzMiltc2dbMTBdIDw8IDE2fAorCQkgICAgKHUzMiltc2dbMTFdIDw8IDI0OworCQlkID0gKHUzMiltc2dbMTJdICAgICAgfAorCQkgICAgKHUzMiltc2dbMTNdIDw8IDggfAorCQkgICAgKHUzMiltc2dbMTRdIDw8IDE2fAorCQkgICAgKHUzMiltc2dbMTVdIDw8IDI0OworCQkKKwkJVEVBQ09SRShQQVJUUk9VTkRTKTsKKworCQlsZW4gLT0gMTY7CisJCW1zZyArPSAxNjsKKwl9CisKKwlpZiAobGVuID49IDEyKQorCXsKKwkJYSA9ICh1MzIpbXNnWyAwXSAgICAgIHwKKwkJICAgICh1MzIpbXNnWyAxXSA8PCA4IHwKKwkJICAgICh1MzIpbXNnWyAyXSA8PCAxNnwKKwkJICAgICh1MzIpbXNnWyAzXSA8PCAyNDsKKwkJYiA9ICh1MzIpbXNnWyA0XSAgICAgIHwKKwkJICAgICh1MzIpbXNnWyA1XSA8PCA4IHwKKwkJICAgICh1MzIpbXNnWyA2XSA8PCAxNnwKKwkJICAgICh1MzIpbXNnWyA3XSA8PCAyNDsKKwkJYyA9ICh1MzIpbXNnWyA4XSAgICAgIHwKKwkJICAgICh1MzIpbXNnWyA5XSA8PCA4IHwKKwkJICAgICh1MzIpbXNnWzEwXSA8PCAxNnwKKwkJICAgICh1MzIpbXNnWzExXSA8PCAyNDsKKworCQlkID0gcGFkOworCQlmb3IoaSA9IDEyOyBpIDwgbGVuOyBpKyspCisJCXsKKwkJCWQgPDw9IDg7CisJCQlkIHw9IG1zZ1tpXTsKKwkJfQorCX0KKwllbHNlIGlmIChsZW4gPj0gOCkKKwl7CisJCWEgPSAodTMyKW1zZ1sgMF0gICAgICB8CisJCSAgICAodTMyKW1zZ1sgMV0gPDwgOCB8CisJCSAgICAodTMyKW1zZ1sgMl0gPDwgMTZ8CisJCSAgICAodTMyKW1zZ1sgM10gPDwgMjQ7CisJCWIgPSAodTMyKW1zZ1sgNF0gICAgICB8CisJCSAgICAodTMyKW1zZ1sgNV0gPDwgOCB8CisJCSAgICAodTMyKW1zZ1sgNl0gPDwgMTZ8CisJCSAgICAodTMyKW1zZ1sgN10gPDwgMjQ7CisKKwkJYyA9IGQgPSBwYWQ7CisJCWZvcihpID0gODsgaSA8IGxlbjsgaSsrKQorCQl7CisJCQljIDw8PSA4OworCQkJYyB8PSBtc2dbaV07CisJCX0KKwl9CisJZWxzZSBpZiAobGVuID49IDQpCisJeworCQlhID0gKHUzMiltc2dbIDBdICAgICAgfAorCQkgICAgKHUzMiltc2dbIDFdIDw8IDggfAorCQkgICAgKHUzMiltc2dbIDJdIDw8IDE2fAorCQkgICAgKHUzMiltc2dbIDNdIDw8IDI0OworCisJCWIgPSBjID0gZCA9IHBhZDsKKwkJZm9yKGkgPSA0OyBpIDwgbGVuOyBpKyspCisJCXsKKwkJCWIgPDw9IDg7CisJCQliIHw9IG1zZ1tpXTsKKwkJfQorCX0KKwllbHNlCisJeworCQlhID0gYiA9IGMgPSBkID0gcGFkOworCQlmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJeworCQkJYSA8PD0gODsKKwkJCWEgfD0gbXNnW2ldOworCQl9CisJfQorCisJVEVBQ09SRShGVUxMUk9VTkRTKTsKKworLyoJcmV0dXJuIDA7Ki8KKwlyZXR1cm4gaDBeaDE7Cit9CisKKy8qIFdoYXQgZm9sbG93cyBpbiB0aGlzIGZpbGUgaXMgY29weXJpZ2h0IDIwMDAgYnkgSGFucyBSZWlzZXIsIGFuZCB0aGUKKyAqIGxpY2Vuc2luZyBvZiB3aGF0IGZvbGxvd3MgaXMgZ292ZXJuZWQgYnkgcmVpc2VyZnMvUkVBRE1FICovCisKK3UzMiB5dXJhX2hhc2ggKGNvbnN0IHNpZ25lZCBjaGFyICptc2csIGludCBsZW4pCit7CisgICAgaW50IGosIHBvdzsKKyAgICB1MzIgYSwgYzsKKyAgICBpbnQgaTsKKyAgICAKKyAgICBmb3IgKHBvdz0xLGk9MTsgaSA8IGxlbjsgaSsrKSBwb3cgPSBwb3cgKiAxMDsgCisgICAgCisgICAgaWYgKGxlbiA9PSAxKSAKKwlhID0gbXNnWzBdLTQ4OworICAgIGVsc2UKKwlhID0gKG1zZ1swXSAtIDQ4KSAqIHBvdzsKKyAgICAKKyAgICBmb3IgKGk9MTsgaSA8IGxlbjsgaSsrKSB7CisJYyA9IG1zZ1tpXSAtIDQ4OyAKKwlmb3IgKHBvdz0xLGo9aTsgaiA8IGxlbi0xOyBqKyspIHBvdyA9IHBvdyAqIDEwOyAKKwlhID0gYSArIGMgKiBwb3c7CisgICAgfQorICAgIAorICAgIGZvciAoOyBpIDwgNDA7IGkrKykgeworCWMgPSAnMCcgLSA0ODsgCisJZm9yIChwb3c9MSxqPWk7IGogPCBsZW4tMTsgaisrKSBwb3cgPSBwb3cgKiAxMDsgCisJYSA9IGEgKyBjICogcG93OworICAgIH0KKyAgICAKKyAgICBmb3IgKDsgaSA8IDI1NjsgaSsrKSB7CisJYyA9IGk7IAorCWZvciAocG93PTEsaj1pOyBqIDwgbGVuLTE7IGorKykgcG93ID0gcG93ICogMTA7IAorCWEgPSBhICsgYyAqIHBvdzsKKyAgICB9CisgICAgCisgICAgYSA9IGEgPDwgNzsKKyAgICByZXR1cm4gYTsKK30KKwordTMyIHI1X2hhc2ggKGNvbnN0IHNpZ25lZCBjaGFyICptc2csIGludCBsZW4pCit7CisgIHUzMiBhPTA7CisgIHdoaWxlKCptc2cpIHsgCisgICAgYSArPSAqbXNnIDw8IDQ7CisgICAgYSArPSAqbXNnID4+IDQ7CisgICAgYSAqPSAxMTsKKyAgICBtc2crKzsKKyAgIH0gCisgIHJldHVybiBhOworfQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvaWJhbGFuY2UuYyBiL2ZzL3JlaXNlcmZzL2liYWxhbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM2MjEyNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL2liYWxhbmNlLmMKQEAgLTAsMCArMSwxMDU4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAgYnkgSGFucyBSZWlzZXIsIGxpY2Vuc2luZyBnb3Zlcm5lZCBieSByZWlzZXJmcy9SRUFETUUKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisvKiB0aGlzIGlzIG9uZSBhbmQgb25seSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgb3V0c2lkZSAoZG9fYmFsYW5jZS5jKSAqLworaW50CWJhbGFuY2VfaW50ZXJuYWwgKAorCQkJICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogLAorCQkJICBpbnQsCisJCQkgIGludCwKKwkJCSAgc3RydWN0IGl0ZW1faGVhZCAqICwKKwkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqIAorCQkJICApOworCisvKiBtb2RlcyBvZiBpbnRlcm5hbF9zaGlmdF9sZWZ0LCBpbnRlcm5hbF9zaGlmdF9yaWdodCBhbmQgaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcyAqLworI2RlZmluZSBJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fTCAwCisjZGVmaW5lIElOVEVSTkFMX1NISUZUX0ZST01fUl9UT19TIDEKKyNkZWZpbmUgSU5URVJOQUxfU0hJRlRfRlJPTV9MX1RPX1MgMgorI2RlZmluZSBJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fUiAzCisjZGVmaW5lIElOVEVSTkFMX0lOU0VSVF9UT19TIDQKKyNkZWZpbmUgSU5URVJOQUxfSU5TRVJUX1RPX0wgNQorI2RlZmluZSBJTlRFUk5BTF9JTlNFUlRfVE9fUiA2CisKK3N0YXRpYyB2b2lkCWludGVybmFsX2RlZmluZV9kZXN0X3NyY19pbmZvcyAoCisJCQkJCQlpbnQgc2hpZnRfbW9kZSwKKwkJCQkJCXN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwKKwkJCQkJCWludCBoLAorCQkJCQkJc3RydWN0IGJ1ZmZlcl9pbmZvICogZGVzdF9iaSwKKwkJCQkJCXN0cnVjdCBidWZmZXJfaW5mbyAqIHNyY19iaSwKKwkJCQkJCWludCAqIGRfa2V5LAorCQkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqIGNmCisJCQkJCQkpCit7CisgICAgbWVtc2V0IChkZXN0X2JpLCAwLCBzaXplb2YgKHN0cnVjdCBidWZmZXJfaW5mbykpOworICAgIG1lbXNldCAoc3JjX2JpLCAwLCBzaXplb2YgKHN0cnVjdCBidWZmZXJfaW5mbykpOworICAgIC8qIGRlZmluZSBkZXN0LCBzcmMsIGRlc3QgcGFyZW50LCBkZXN0IHBvc2l0aW9uICovCisgICAgc3dpdGNoIChzaGlmdF9tb2RlKSB7CisgICAgY2FzZSBJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fTDoJLyogdXNlZCBpbiBpbnRlcm5hbF9zaGlmdF9sZWZ0ICovCisJc3JjX2JpLT50YiA9IHRiOworCXNyY19iaS0+YmlfYmggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOworCXNyY19iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKTsKKwlzcmNfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpOworCWRlc3RfYmktPnRiID0gdGI7CisJZGVzdF9iaS0+YmlfYmggPSB0Yi0+TFtoXTsKKwlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RkxbaF07CisJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIGgpOworCSpkX2tleSA9IHRiLT5sa2V5W2hdOworCSpjZiA9IHRiLT5DRkxbaF07CisJYnJlYWs7CisgICAgY2FzZSBJTlRFUk5BTF9TSElGVF9GUk9NX0xfVE9fUzoKKwlzcmNfYmktPnRiID0gdGI7CisJc3JjX2JpLT5iaV9iaCA9IHRiLT5MW2hdOworCXNyY19iaS0+YmlfcGFyZW50ID0gdGItPkZMW2hdOworCXNyY19iaS0+YmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIGgpOworCWRlc3RfYmktPnRiID0gdGI7CisJZGVzdF9iaS0+YmlfYmggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOworCWRlc3RfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7CisJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSk7IC8qIGRlc3QgcG9zaXRpb24gaXMgYW5hbG9nIG9mIGRlc3QtPmJfaXRlbV9vcmRlciAqLworCSpkX2tleSA9IHRiLT5sa2V5W2hdOworCSpjZiA9IHRiLT5DRkxbaF07CisJYnJlYWs7CisgICAgICAKKyAgICBjYXNlIElOVEVSTkFMX1NISUZUX0ZST01fUl9UT19TOgkvKiB1c2VkIGluIGludGVybmFsX3NoaWZ0X2xlZnQgKi8KKwlzcmNfYmktPnRiID0gdGI7CisJc3JjX2JpLT5iaV9iaCA9IHRiLT5SW2hdOworCXNyY19iaS0+YmlfcGFyZW50ID0gdGItPkZSW2hdOworCXNyY19iaS0+YmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCBoKTsKKwlkZXN0X2JpLT50YiA9IHRiOworCWRlc3RfYmktPmJpX2JoID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKTsKKwlkZXN0X2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpOworCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpOworCSpkX2tleSA9IHRiLT5ya2V5W2hdOworCSpjZiA9IHRiLT5DRlJbaF07CisJYnJlYWs7CisKKyAgICBjYXNlIElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SOgorCXNyY19iaS0+dGIgPSB0YjsKKwlzcmNfYmktPmJpX2JoID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKTsKKwlzcmNfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7CisJc3JjX2JpLT5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIGggKyAxKTsKKwlkZXN0X2JpLT50YiA9IHRiOworCWRlc3RfYmktPmJpX2JoID0gdGItPlJbaF07CisJZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZSW2hdOworCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7CisJKmRfa2V5ID0gdGItPnJrZXlbaF07CisJKmNmID0gdGItPkNGUltoXTsKKwlicmVhazsKKworICAgIGNhc2UgSU5URVJOQUxfSU5TRVJUX1RPX0w6CisJZGVzdF9iaS0+dGIgPSB0YjsKKwlkZXN0X2JpLT5iaV9iaCA9IHRiLT5MW2hdOworCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GTFtoXTsKKwlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7CisJYnJlYWs7CisJCisgICAgY2FzZSBJTlRFUk5BTF9JTlNFUlRfVE9fUzoKKwlkZXN0X2JpLT50YiA9IHRiOworCWRlc3RfYmktPmJpX2JoID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKTsKKwlkZXN0X2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpOworCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpOworCWJyZWFrOworCisgICAgY2FzZSBJTlRFUk5BTF9JTlNFUlRfVE9fUjoKKwlkZXN0X2JpLT50YiA9IHRiOworCWRlc3RfYmktPmJpX2JoID0gdGItPlJbaF07CisJZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZSW2hdOworCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7CisJYnJlYWs7CisKKyAgICBkZWZhdWx0OgorCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJpbnRlcm5hbF9kZWZpbmVfZGVzdF9zcmNfaW5mb3M6IHNoaWZ0IHR5cGUgaXMgdW5rbm93biAoJWQpIiwgc2hpZnRfbW9kZSk7CisgICAgfQorfQorCisKKworLyogSW5zZXJ0IGNvdW50IG5vZGUgcG9pbnRlcnMgaW50byBidWZmZXIgY3VyIGJlZm9yZSBwb3NpdGlvbiB0byArIDEuCisgKiBJbnNlcnQgY291bnQgaXRlbXMgaW50byBidWZmZXIgY3VyIGJlZm9yZSBwb3NpdGlvbiB0by4KKyAqIEl0ZW1zIGFuZCBub2RlIHBvaW50ZXJzIGFyZSBzcGVjaWZpZWQgYnkgaW5zZXJ0ZWQgYW5kIGJoIHJlc3BlY3RpdmVseS4KKyAqLyAKK3N0YXRpYyB2b2lkIGludGVybmFsX2luc2VydF9jaGlsZHMgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGN1cl9iaSwKKwkJCQkgICAgaW50IHRvLCBpbnQgY291bnQsCisJCQkJICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpbnNlcnRlZCwKKwkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqIGJoCisgICAgKQoreworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGN1ciA9IGN1cl9iaS0+YmlfYmg7CisgICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOworICAgIGludCBucjsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICogaWg7CisgICAgc3RydWN0IGRpc2tfY2hpbGQgbmV3X2RjWzJdOworICAgIHN0cnVjdCBkaXNrX2NoaWxkICogZGM7CisgICAgaW50IGk7CisKKyAgICBpZiAoY291bnQgPD0gMCkKKwlyZXR1cm47CisKKyAgICBibGtoID0gQl9CTEtfSEVBRChjdXIpOworICAgIG5yID0gYmxraF9ucl9pdGVtKGJsa2gpOworCisgICAgUkZBTFNFKCBjb3VudCA+IDIsCisJICAgICJ0b28gbWFueSBjaGlsZHJlbiAoJWQpIGFyZSB0byBiZSBpbnNlcnRlZCIsIGNvdW50KTsKKyAgICBSRkFMU0UoIEJfRlJFRV9TUEFDRSAoY3VyKSA8IGNvdW50ICogKEtFWV9TSVpFICsgRENfU0laRSksCisJICAgICJubyBlbm91Z2ggZnJlZSBzcGFjZSAoJWQpLCBuZWVkZWQgJWQgYnl0ZXMiLCAKKwkgICAgQl9GUkVFX1NQQUNFIChjdXIpLCBjb3VudCAqIChLRVlfU0laRSArIERDX1NJWkUpKTsKKworICAgIC8qIHByZXBhcmUgc3BhY2UgZm9yIGNvdW50IGRpc2tfY2hpbGQgKi8KKyAgICBkYyA9IEJfTl9DSElMRChjdXIsdG8rMSk7CisKKyAgICBtZW1tb3ZlIChkYyArIGNvdW50LCBkYywgKG5yKzEtKHRvKzEpKSAqIERDX1NJWkUpOworCisgICAgLyogY29weSB0b19iZV9pbnNlcnQgZGlzayBjaGlsZHJlbiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSArKykgeworCXB1dF9kY19zaXplKCAmKG5ld19kY1tpXSksIE1BWF9DSElMRF9TSVpFKGJoW2ldKSAtIEJfRlJFRV9TUEFDRShiaFtpXSkpOworCXB1dF9kY19ibG9ja19udW1iZXIoICYobmV3X2RjW2ldKSwgYmhbaV0tPmJfYmxvY2tuciApOworICAgIH0KKyAgICBtZW1jcHkgKGRjLCBuZXdfZGMsIERDX1NJWkUgKiBjb3VudCk7CisKKyAgCisgICAgLyogcHJlcGFyZSBzcGFjZSBmb3IgY291bnQgaXRlbXMgICovCisgICAgaWggPSBCX05fUERFTElNX0tFWSAoY3VyLCAoKHRvID09IC0xKSA/IDAgOiB0bykpOworCisgICAgbWVtbW92ZSAoaWggKyBjb3VudCwgaWgsIChuciAtIHRvKSAqIEtFWV9TSVpFICsgKG5yICsgMSArIGNvdW50KSAqIERDX1NJWkUpOworCisgICAgLyogY29weSBpdGVtIGhlYWRlcnMgKGtleXMpICovCisgICAgbWVtY3B5IChpaCwgaW5zZXJ0ZWQsIEtFWV9TSVpFKTsKKyAgICBpZiAoIGNvdW50ID4gMSApCisJbWVtY3B5IChpaCArIDEsIGluc2VydGVkICsgMSwgS0VZX1NJWkUpOworCisgICAgLyogc2l6ZXMsIGl0ZW0gbnVtYmVyICovCisgICAgc2V0X2Jsa2hfbnJfaXRlbSggYmxraCwgYmxraF9ucl9pdGVtKGJsa2gpICsgY291bnQgKTsKKyAgICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLAorICAgICAgICAgICAgICAgICAgICAgICAgYmxraF9mcmVlX3NwYWNlKGJsa2gpIC0gY291bnQgKiAoRENfU0laRSArIEtFWV9TSVpFICkgKTsKKworICAgIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoY3VyX2JpLT50YiwgY3VyLDApOworCisgICAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworICAgIGNoZWNrX2ludGVybmFsIChjdXIpOworICAgIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KKworICAgIGlmIChjdXJfYmktPmJpX3BhcmVudCkgeworCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjID0gQl9OX0NISUxEIChjdXJfYmktPmJpX3BhcmVudCxjdXJfYmktPmJpX3Bvc2l0aW9uKTsKKwlwdXRfZGNfc2l6ZSggdF9kYywgZGNfc2l6ZSh0X2RjKSArIChjb3VudCAqIChEQ19TSVpFICsgS0VZX1NJWkUpKSk7CisJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5KGN1cl9iaS0+dGIsIGN1cl9iaS0+YmlfcGFyZW50LCAwKTsKKworCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KKwljaGVja19pbnRlcm5hbCAoY3VyX2JpLT5iaV9wYXJlbnQpOworCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8gICAKKyAgICB9CisKK30KKworCisvKiBEZWxldGUgZGVsX251bSBpdGVtcyBhbmQgbm9kZSBwb2ludGVycyBmcm9tIGJ1ZmZlciBjdXIgc3RhcnRpbmcgZnJvbSAqCisgKiB0aGUgZmlyc3RfaSd0aCBpdGVtIGFuZCBmaXJzdF9wJ3RoIHBvaW50ZXJzIHJlc3BlY3RpdmVseS4JCSovCitzdGF0aWMgdm9pZAlpbnRlcm5hbF9kZWxldGVfcG9pbnRlcnNfaXRlbXMgKAorCQkJCQkJc3RydWN0IGJ1ZmZlcl9pbmZvICogY3VyX2JpLAorCQkJCQkJaW50IGZpcnN0X3AsIAorCQkJCQkJaW50IGZpcnN0X2ksIAorCQkJCQkJaW50IGRlbF9udW0KKwkJCQkJCSkKK3sKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICogY3VyID0gY3VyX2JpLT5iaV9iaDsKKyAgaW50IG5yOworICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7CisgIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXk7CisgIHN0cnVjdCBkaXNrX2NoaWxkICogZGM7CisKKyAgUkZBTFNFKCBjdXIgPT0gTlVMTCwgImJ1ZmZlciBpcyAwIik7CisgIFJGQUxTRSggZGVsX251bSA8IDAsCisgICAgICAgICAgIm5lZ2F0aXZlIG51bWJlciBvZiBpdGVtcyAoJWQpIGNhbiBub3QgYmUgZGVsZXRlZCIsIGRlbF9udW0pOworICBSRkFMU0UoIGZpcnN0X3AgPCAwIHx8IGZpcnN0X3AgKyBkZWxfbnVtID4gQl9OUl9JVEVNUyAoY3VyKSArIDEgfHwgZmlyc3RfaSA8IDAsCisgICAgICAgICAgImZpcnN0IHBvaW50ZXIgb3JkZXIgKCVkKSA8IDAgb3IgIgorICAgICAgICAgICJubyBzbyBtYW55IHBvaW50ZXJzICglZCksIG9ubHkgKCVkKSBvciAiCisgICAgICAgICAgImZpcnN0IGtleSBvcmRlciAlZCA8IDAiLCBmaXJzdF9wLCAKKyAgICAgICAgICBmaXJzdF9wICsgZGVsX251bSwgQl9OUl9JVEVNUyAoY3VyKSArIDEsIGZpcnN0X2kpOworICBpZiAoIGRlbF9udW0gPT0gMCApCisgICAgcmV0dXJuOworCisgIGJsa2ggPSBCX0JMS19IRUFEKGN1cik7CisgIG5yID0gYmxraF9ucl9pdGVtKGJsa2gpOworCisgIGlmICggZmlyc3RfcCA9PSAwICYmIGRlbF9udW0gPT0gbnIgKyAxICkgeworICAgIFJGQUxTRSggZmlyc3RfaSAhPSAwLCAiMXN0IGRlbGV0ZWQga2V5IG11c3QgaGF2ZSBvcmRlciAwLCBub3QgJWQiLCBmaXJzdF9pKTsKKyAgICBtYWtlX2VtcHR5X25vZGUgKGN1cl9iaSk7CisgICAgcmV0dXJuOworICB9CisKKyAgUkZBTFNFKCBmaXJzdF9pICsgZGVsX251bSA+IEJfTlJfSVRFTVMgKGN1ciksCisgICAgICAgICAgImZpcnN0X2kgPSAlZCBkZWxfbnVtID0gJWQgIgorICAgICAgICAgICJubyBzbyBtYW55IGtleXMgKCVkKSBpbiB0aGUgbm9kZSAoJWIpKCV6KSIsCisgICAgICAgICAgZmlyc3RfaSwgZGVsX251bSwgZmlyc3RfaSArIGRlbF9udW0sIGN1ciwgY3VyKTsKKworCisgIC8qIGRlbGV0aW5nICovCisgIGRjID0gQl9OX0NISUxEIChjdXIsIGZpcnN0X3ApOworCisgIG1lbW1vdmUgKGRjLCBkYyArIGRlbF9udW0sIChuciArIDEgLSBmaXJzdF9wIC0gZGVsX251bSkgKiBEQ19TSVpFKTsKKyAga2V5ID0gQl9OX1BERUxJTV9LRVkgKGN1ciwgZmlyc3RfaSk7CisgIG1lbW1vdmUgKGtleSwga2V5ICsgZGVsX251bSwgKG5yIC0gZmlyc3RfaSAtIGRlbF9udW0pICogS0VZX1NJWkUgKyAobnIgKyAxIC0gZGVsX251bSkgKiBEQ19TSVpFKTsKKworCisgIC8qIHNpemVzLCBpdGVtIG51bWJlciAqLworICBzZXRfYmxraF9ucl9pdGVtKCBibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgLSBkZWxfbnVtICk7CisgIHNldF9ibGtoX2ZyZWVfc3BhY2UoIGJsa2gsCisgICAgICAgICAgICAgICAgICAgIGJsa2hfZnJlZV9zcGFjZShibGtoKSArIChkZWxfbnVtICogKEtFWV9TSVpFICsgRENfU0laRSkgKSApOworCisgIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoY3VyX2JpLT50YiwgY3VyLCAwKTsKKyAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCisgIGNoZWNrX2ludGVybmFsIChjdXIpOworICAvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KKyAKKyAgaWYgKGN1cl9iaS0+YmlfcGFyZW50KSB7CisgICAgc3RydWN0IGRpc2tfY2hpbGQgKnRfZGM7CisgICAgdF9kYyA9IEJfTl9DSElMRCAoY3VyX2JpLT5iaV9wYXJlbnQsIGN1cl9iaS0+YmlfcG9zaXRpb24pOworICAgIHB1dF9kY19zaXplKCB0X2RjLCBkY19zaXplKHRfZGMpIC0gKGRlbF9udW0gKiAoS0VZX1NJWkUgKyBEQ19TSVpFKSApICk7CisKKyAgICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKGN1cl9iaS0+dGIsIGN1cl9iaS0+YmlfcGFyZW50LDApOworICAgIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KKyAgICBjaGVja19pbnRlcm5hbCAoY3VyX2JpLT5iaV9wYXJlbnQpOworICAgIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8gICAKKyAgfQorfQorCisKKy8qIGRlbGV0ZSBuIG5vZGUgcG9pbnRlcnMgYW5kIGl0ZW1zIHN0YXJ0aW5nIGZyb20gZ2l2ZW4gcG9zaXRpb24gKi8KK3N0YXRpYyB2b2lkICBpbnRlcm5hbF9kZWxldGVfY2hpbGRzIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBjdXJfYmksIAorCQkJCSAgICAgaW50IGZyb20sIGludCBuKQoreworICBpbnQgaV9mcm9tOworCisgIGlfZnJvbSA9IChmcm9tID09IDApID8gZnJvbSA6IGZyb20gLSAxOworCisgIC8qIGRlbGV0ZSBuIHBvaW50ZXJzIHN0YXJ0aW5nIGZyb20gYGZyb20nIHBvc2l0aW9uIGluIENVUjsKKyAgICAgZGVsZXRlIG4ga2V5cyBzdGFydGluZyBmcm9tICdpX2Zyb20nIHBvc2l0aW9uIGluIENVUjsKKyAgICAgKi8KKyAgaW50ZXJuYWxfZGVsZXRlX3BvaW50ZXJzX2l0ZW1zIChjdXJfYmksIGZyb20sIGlfZnJvbSwgbik7Cit9CisKKworLyogY29weSBjcHlfbnVtIG5vZGUgcG9pbnRlcnMgYW5kIGNweV9udW0gLSAxIGl0ZW1zIGZyb20gYnVmZmVyIHNyYyB0byBidWZmZXIgZGVzdAorKiBsYXN0X2ZpcnN0ID09IEZJUlNUX1RPX0xBU1QgbWVhbnMsIHRoYXQgd2UgY29weSBmaXJzdCBpdGVtcyBmcm9tIHNyYyB0byB0YWlsIG9mIGRlc3QKKyAqIGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCBtZWFucywgdGhhdCB3ZSBjb3B5IGxhc3QgaXRlbXMgZnJvbSBzcmMgdG8gaGVhZCBvZiBkZXN0IAorICovCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9jb3B5X3BvaW50ZXJzX2l0ZW1zICgKKwkJCQkJICBzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLAorCQkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqIHNyYywKKwkJCQkJICBpbnQgbGFzdF9maXJzdCwgaW50IGNweV9udW0KKwkJCQkJICApCit7CisgIC8qIEFUVEVOVElPTiEgTnVtYmVyIG9mIG5vZGUgcG9pbnRlcnMgaW4gREVTVCBpcyBlcXVhbCB0byBudW1iZXIgb2YgaXRlbXMgaW4gREVTVCAqCisgICAqIGFzIGRlbGltaXRpbmcga2V5IGhhdmUgYWxyZWFkeSBpbnNlcnRlZCB0byBidWZmZXIgZGVzdC4qLworICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBkZXN0ID0gZGVzdF9iaS0+YmlfYmg7CisgIGludCBucl9kZXN0LCBucl9zcmM7CisgIGludCBkZXN0X29yZGVyLCBzcmNfb3JkZXI7CisgIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKKyAgc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleTsKKyAgc3RydWN0IGRpc2tfY2hpbGQgKiBkYzsKKworICBucl9zcmMgPSBCX05SX0lURU1TIChzcmMpOworCisgIFJGQUxTRSggZGVzdCA9PSBOVUxMIHx8IHNyYyA9PSBOVUxMLCAKKwkgICJzcmMgKCVwKSBvciBkZXN0ICglcCkgYnVmZmVyIGlzIDAiLCBzcmMsIGRlc3QpOworICBSRkFMU0UoIGxhc3RfZmlyc3QgIT0gRklSU1RfVE9fTEFTVCAmJiBsYXN0X2ZpcnN0ICE9IExBU1RfVE9fRklSU1QsCisJICAiaW52YWxpZCBsYXN0X2ZpcnN0IHBhcmFtZXRlciAoJWQpIiwgbGFzdF9maXJzdCk7CisgIFJGQUxTRSggbnJfc3JjIDwgY3B5X251bSAtIDEsIAorCSAgIm5vIHNvIG1hbnkgaXRlbXMgKCVkKSBpbiBzcmMgKCVkKSIsIGNweV9udW0sIG5yX3NyYyk7CisgIFJGQUxTRSggY3B5X251bSA8IDAsICJjcHlfbnVtIGxlc3MgdGhhbiAwICglZCkiLCBjcHlfbnVtKTsKKyAgUkZBTFNFKCBjcHlfbnVtIC0gMSArIEJfTlJfSVRFTVMoZGVzdCkgPiAoaW50KU1BWF9OUl9LRVkoZGVzdCksCisJICAiY3B5X251bSAoJWQpICsgaXRlbSBudW1iZXIgaW4gZGVzdCAoJWQpIGNhbiBub3QgYmUgPiBNQVhfTlJfS0VZKCVkKSIsCisJICBjcHlfbnVtLCBCX05SX0lURU1TKGRlc3QpLCBNQVhfTlJfS0VZKGRlc3QpKTsKKworICBpZiAoIGNweV9udW0gPT0gMCApCisgICAgcmV0dXJuOworCisJLyogY29waW5nICovCisgIGJsa2ggPSBCX0JMS19IRUFEKGRlc3QpOworICBucl9kZXN0ID0gYmxraF9ucl9pdGVtKGJsa2gpOworCisgIC8qZGVzdF9vcmRlciA9IChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8gMCA6IG5yX2Rlc3Q7Ki8KKyAgLypzcmNfb3JkZXIgPSAobGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUKSA/IChucl9zcmMgLSBjcHlfbnVtICsgMSkgOiAwOyovCisgIChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8JKGRlc3Rfb3JkZXIgPSAwLCBzcmNfb3JkZXIgPSBucl9zcmMgLSBjcHlfbnVtICsgMSkgOgorICAgIChkZXN0X29yZGVyID0gbnJfZGVzdCwgc3JjX29yZGVyID0gMCk7CisKKyAgLyogcHJlcGFyZSBzcGFjZSBmb3IgY3B5X251bSBwb2ludGVycyAqLworICBkYyA9IEJfTl9DSElMRCAoZGVzdCwgZGVzdF9vcmRlcik7CisKKyAgbWVtbW92ZSAoZGMgKyBjcHlfbnVtLCBkYywgKG5yX2Rlc3QgLSBkZXN0X29yZGVyKSAqIERDX1NJWkUpOworCisJLyogaW5zZXJ0IHBvaW50ZXJzICovCisgIG1lbWNweSAoZGMsIEJfTl9DSElMRCAoc3JjLCBzcmNfb3JkZXIpLCBEQ19TSVpFICogY3B5X251bSk7CisKKworICAvKiBwcmVwYXJlIHNwYWNlIGZvciBjcHlfbnVtIC0gMSBpdGVtIGhlYWRlcnMgKi8KKyAga2V5ID0gQl9OX1BERUxJTV9LRVkoZGVzdCwgZGVzdF9vcmRlcik7CisgIG1lbW1vdmUgKGtleSArIGNweV9udW0gLSAxLCBrZXksCisJICAgS0VZX1NJWkUgKiAobnJfZGVzdCAtIGRlc3Rfb3JkZXIpICsgRENfU0laRSAqIChucl9kZXN0ICsgY3B5X251bSkpOworCisKKyAgLyogaW5zZXJ0IGhlYWRlcnMgKi8KKyAgbWVtY3B5IChrZXksIEJfTl9QREVMSU1fS0VZIChzcmMsIHNyY19vcmRlciksIEtFWV9TSVpFICogKGNweV9udW0gLSAxKSk7CisKKyAgLyogc2l6ZXMsIGl0ZW0gbnVtYmVyICovCisgIHNldF9ibGtoX25yX2l0ZW0oIGJsa2gsIGJsa2hfbnJfaXRlbShibGtoKSArIChjcHlfbnVtIC0gMSApICk7CisgIHNldF9ibGtoX2ZyZWVfc3BhY2UoIGJsa2gsCisgICAgICBibGtoX2ZyZWVfc3BhY2UoYmxraCkgLSAoS0VZX1NJWkUgKiAoY3B5X251bSAtIDEpICsgRENfU0laRSAqIGNweV9udW0gKSApOworCisgIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoZGVzdF9iaS0+dGIsIGRlc3QsIDApOworCisgIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KKyAgY2hlY2tfaW50ZXJuYWwgKGRlc3QpOworICAvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCisKKyAgaWYgKGRlc3RfYmktPmJpX3BhcmVudCkgeworICAgIHN0cnVjdCBkaXNrX2NoaWxkICp0X2RjOworICAgIHRfZGMgPSBCX05fQ0hJTEQoZGVzdF9iaS0+YmlfcGFyZW50LGRlc3RfYmktPmJpX3Bvc2l0aW9uKTsKKyAgICBwdXRfZGNfc2l6ZSggdF9kYywgZGNfc2l6ZSh0X2RjKSArIChLRVlfU0laRSAqIChjcHlfbnVtIC0gMSkgKyBEQ19TSVpFICogY3B5X251bSkgKTsKKworICAgIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoZGVzdF9iaS0+dGIsIGRlc3RfYmktPmJpX3BhcmVudCwwKTsKKyAgICAvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCisgICAgY2hlY2tfaW50ZXJuYWwgKGRlc3RfYmktPmJpX3BhcmVudCk7CisgICAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLyAgIAorICB9CisKK30KKworCisvKiBDb3B5IGNweV9udW0gbm9kZSBwb2ludGVycyBhbmQgY3B5X251bSAtIDEgaXRlbXMgZnJvbSBidWZmZXIgc3JjIHRvIGJ1ZmZlciBkZXN0LgorICogRGVsZXRlIGNweV9udW0gLSBkZWxfcGFyIGl0ZW1zIGFuZCBub2RlIHBvaW50ZXJzIGZyb20gYnVmZmVyIHNyYy4KKyAqIGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCBtZWFucywgdGhhdCB3ZSBjb3B5L2RlbGV0ZSBmaXJzdCBpdGVtcyBmcm9tIHNyYy4KKyAqIGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCBtZWFucywgdGhhdCB3ZSBjb3B5L2RlbGV0ZSBsYXN0IGl0ZW1zIGZyb20gc3JjLgorICovCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLCAKKwkJCQkJICBzdHJ1Y3QgYnVmZmVyX2luZm8gKiBzcmNfYmksIAorCQkJCQkgIGludCBsYXN0X2ZpcnN0LCBpbnQgY3B5X251bSwgaW50IGRlbF9wYXIpCit7CisgICAgaW50IGZpcnN0X3BvaW50ZXI7CisgICAgaW50IGZpcnN0X2l0ZW07CisgICAgCisgICAgaW50ZXJuYWxfY29weV9wb2ludGVyc19pdGVtcyAoZGVzdF9iaSwgc3JjX2JpLT5iaV9iaCwgbGFzdF9maXJzdCwgY3B5X251bSk7CisKKyAgICBpZiAobGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUKSB7CS8qIHNoaWZ0X2xlZnQgb2NjdXJzICovCisJZmlyc3RfcG9pbnRlciA9IDA7CisJZmlyc3RfaXRlbSA9IDA7CisJLyogZGVsZXRlIGNweV9udW0gLSBkZWxfcGFyIHBvaW50ZXJzIGFuZCBrZXlzIHN0YXJ0aW5nIGZvciBwb2ludGVycyB3aXRoIGZpcnN0X3BvaW50ZXIsIAorCSAgIGZvciBrZXkgLSB3aXRoIGZpcnN0X2l0ZW0gKi8KKwlpbnRlcm5hbF9kZWxldGVfcG9pbnRlcnNfaXRlbXMgKHNyY19iaSwgZmlyc3RfcG9pbnRlciwgZmlyc3RfaXRlbSwgY3B5X251bSAtIGRlbF9wYXIpOworICAgIH0gZWxzZSB7CQkJLyogc2hpZnRfcmlnaHQgb2NjdXJzICovCisJaW50IGksIGo7CisKKwlpID0gKCBjcHlfbnVtIC0gZGVsX3BhciA9PSAoIGogPSBCX05SX0lURU1TKHNyY19iaS0+YmlfYmgpKSArIDEgKSA/IDAgOiBqIC0gY3B5X251bSArIGRlbF9wYXI7CisKKwlpbnRlcm5hbF9kZWxldGVfcG9pbnRlcnNfaXRlbXMgKHNyY19iaSwgaiArIDEgLSBjcHlfbnVtICsgZGVsX3BhciwgaSwgY3B5X251bSAtIGRlbF9wYXIpOworICAgIH0KK30KKworLyogSW5zZXJ0IG5fc3JjJ3RoIGtleSBvZiBidWZmZXIgc3JjIGJlZm9yZSBuX2Rlc3QndGgga2V5IG9mIGJ1ZmZlciBkZXN0LiAqLworc3RhdGljIHZvaWQgaW50ZXJuYWxfaW5zZXJ0X2tleSAoc3RydWN0IGJ1ZmZlcl9pbmZvICogZGVzdF9iaSwgCisJCQkJIGludCBkZXN0X3Bvc2l0aW9uX2JlZm9yZSwgICAgICAgICAgICAgICAgIC8qIGluc2VydCBrZXkgYmVmb3JlIGtleSB3aXRoIG5fZGVzdCBudW1iZXIgKi8KKwkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICogc3JjLCAKKwkJCQkgaW50IHNyY19wb3NpdGlvbikKK3sKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBkZXN0ID0gZGVzdF9iaS0+YmlfYmg7CisgICAgaW50IG5yOworICAgIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5OworCisgICAgUkZBTFNFKCBkZXN0ID09IE5VTEwgfHwgc3JjID09IE5VTEwsCisJICAgICJzb3VyY2UoJXApIG9yIGRlc3QoJXApIGJ1ZmZlciBpcyAwIiwgc3JjLCBkZXN0KTsKKyAgICBSRkFMU0UoIGRlc3RfcG9zaXRpb25fYmVmb3JlIDwgMCB8fCBzcmNfcG9zaXRpb24gPCAwLAorCSAgICAic291cmNlKCVkKSBvciBkZXN0KCVkKSBrZXkgbnVtYmVyIGxlc3MgdGhhbiAwIiwgCisJICAgIHNyY19wb3NpdGlvbiwgZGVzdF9wb3NpdGlvbl9iZWZvcmUpOworICAgIFJGQUxTRSggZGVzdF9wb3NpdGlvbl9iZWZvcmUgPiBCX05SX0lURU1TIChkZXN0KSB8fCAKKwkgICAgc3JjX3Bvc2l0aW9uID49IEJfTlJfSVRFTVMoc3JjKSwKKwkgICAgImludmFsaWQgcG9zaXRpb24gaW4gZGVzdCAoJWQgKGtleSBudW1iZXIgJWQpKSBvciBpbiBzcmMgKCVkIChrZXkgbnVtYmVyICVkKSkiLAorCSAgICBkZXN0X3Bvc2l0aW9uX2JlZm9yZSwgQl9OUl9JVEVNUyAoZGVzdCksIAorCSAgICBzcmNfcG9zaXRpb24sIEJfTlJfSVRFTVMoc3JjKSk7CisgICAgUkZBTFNFKCBCX0ZSRUVfU1BBQ0UgKGRlc3QpIDwgS0VZX1NJWkUsCisJICAgICJubyBlbm91Z2ggZnJlZSBzcGFjZSAoJWQpIGluIGRlc3QgYnVmZmVyIiwgQl9GUkVFX1NQQUNFIChkZXN0KSk7CisKKyAgICBibGtoID0gQl9CTEtfSEVBRChkZXN0KTsKKyAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKKworICAgIC8qIHByZXBhcmUgc3BhY2UgZm9yIGluc2VydGluZyBrZXkgKi8KKyAgICBrZXkgPSBCX05fUERFTElNX0tFWSAoZGVzdCwgZGVzdF9wb3NpdGlvbl9iZWZvcmUpOworICAgIG1lbW1vdmUgKGtleSArIDEsIGtleSwgKG5yIC0gZGVzdF9wb3NpdGlvbl9iZWZvcmUpICogS0VZX1NJWkUgKyAobnIgKyAxKSAqIERDX1NJWkUpOworCisgICAgLyogaW5zZXJ0IGtleSAqLworICAgIG1lbWNweSAoa2V5LCBCX05fUERFTElNX0tFWShzcmMsIHNyY19wb3NpdGlvbiksIEtFWV9TSVpFKTsKKworICAgIC8qIENoYW5nZSBkaXJ0LCBmcmVlIHNwYWNlLCBpdGVtIG51bWJlciBmaWVsZHMuICovCisKKyAgICBzZXRfYmxraF9ucl9pdGVtKCBibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgKyAxICk7CisgICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwgYmxraF9mcmVlX3NwYWNlKGJsa2gpIC0gS0VZX1NJWkUgKTsKKworICAgIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoZGVzdF9iaS0+dGIsIGRlc3QsIDApOworCisgICAgaWYgKGRlc3RfYmktPmJpX3BhcmVudCkgeworCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjOworCXRfZGMgPSBCX05fQ0hJTEQoZGVzdF9iaS0+YmlfcGFyZW50LGRlc3RfYmktPmJpX3Bvc2l0aW9uKTsKKwlwdXRfZGNfc2l6ZSggdF9kYywgZGNfc2l6ZSh0X2RjKSArIEtFWV9TSVpFICk7CisKKwlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKGRlc3RfYmktPnRiLCBkZXN0X2JpLT5iaV9wYXJlbnQsMCk7CisgICAgfQorfQorCisKKworLyogSW5zZXJ0IGRfa2V5J3RoIChkZWxpbWl0aW5nKSBrZXkgZnJvbSBidWZmZXIgY2ZsIHRvIHRhaWwgb2YgZGVzdC4gCisgKiBDb3B5IHBvaW50ZXJfYW1vdW50IG5vZGUgcG9pbnRlcnMgYW5kIHBvaW50ZXJfYW1vdW50IC0gMSBpdGVtcyBmcm9tIGJ1ZmZlciBzcmMgdG8gYnVmZmVyIGRlc3QuCisgKiBSZXBsYWNlICBkX2tleSd0aCBrZXkgaW4gYnVmZmVyIGNmbC4KKyAqIERlbGV0ZSBwb2ludGVyX2Ftb3VudCBpdGVtcyBhbmQgbm9kZSBwb2ludGVycyBmcm9tIGJ1ZmZlciBzcmMuCisgKi8KKy8qIHRoaXMgY2FuIGJlIGludm9rZWQgYm90aCB0byBzaGlmdCBmcm9tIFMgdG8gTCBhbmQgZnJvbSBSIHRvIFMgKi8KK3N0YXRpYyB2b2lkCWludGVybmFsX3NoaWZ0X2xlZnQgKAorCQkJCSAgICAgaW50IG1vZGUsCS8qIElOVEVSTkFMX0ZST01fU19UT19MIHwgSU5URVJOQUxfRlJPTV9SX1RPX1MgKi8KKwkJCQkgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwKKwkJCQkgICAgIGludCBoLAorCQkJCSAgICAgaW50IHBvaW50ZXJfYW1vdW50CisJCQkJICAgICApCit7CisgIHN0cnVjdCBidWZmZXJfaW5mbyBkZXN0X2JpLCBzcmNfYmk7CisgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGNmOworICBpbnQgZF9rZXlfcG9zaXRpb247CisKKyAgaW50ZXJuYWxfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zIChtb2RlLCB0YiwgaCwgJmRlc3RfYmksICZzcmNfYmksICZkX2tleV9wb3NpdGlvbiwgJmNmKTsKKworICAvKnByaW50aygicG9pbnRlcl9hbW91bnQgPSAlZFxuIixwb2ludGVyX2Ftb3VudCk7Ki8KKworICBpZiAocG9pbnRlcl9hbW91bnQpIHsKKyAgICAvKiBpbnNlcnQgZGVsaW1pdGluZyBrZXkgZnJvbSBjb21tb24gZmF0aGVyIG9mIGRlc3QgYW5kIHNyYyB0byBub2RlIGRlc3QgaW50byBwb3NpdGlvbiBCX05SX0lURU0oZGVzdCkgKi8KKyAgICBpbnRlcm5hbF9pbnNlcnRfa2V5ICgmZGVzdF9iaSwgQl9OUl9JVEVNUyhkZXN0X2JpLmJpX2JoKSwgY2YsIGRfa2V5X3Bvc2l0aW9uKTsKKworICAgIGlmIChCX05SX0lURU1TKHNyY19iaS5iaV9iaCkgPT0gcG9pbnRlcl9hbW91bnQgLSAxKSB7CisgICAgICBpZiAoc3JjX2JpLmJpX3Bvc2l0aW9uLypzcmMtPmJfaXRlbV9vcmRlciovID09IDApCisJcmVwbGFjZV9rZXkgKHRiLCBjZiwgZF9rZXlfcG9zaXRpb24sIHNyY19iaS5iaV9wYXJlbnQvKnNyYy0+Yl9wYXJlbnQqLywgMCk7CisgICAgfSBlbHNlCisgICAgICByZXBsYWNlX2tleSAodGIsIGNmLCBkX2tleV9wb3NpdGlvbiwgc3JjX2JpLmJpX2JoLCBwb2ludGVyX2Ftb3VudCAtIDEpOworICB9CisgIC8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXJhbWV0ZXIgKi8KKyAgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyAoJmRlc3RfYmksICZzcmNfYmksIEZJUlNUX1RPX0xBU1QsIHBvaW50ZXJfYW1vdW50LCAwKTsKKworfQorCisvKiBJbnNlcnQgZGVsaW1pdGluZyBrZXkgdG8gTFtoXS4KKyAqIENvcHkgbiBub2RlIHBvaW50ZXJzIGFuZCBuIC0gMSBpdGVtcyBmcm9tIGJ1ZmZlciBTW2hdIHRvIExbaF0uCisgKiBEZWxldGUgbiAtIDEgaXRlbXMgYW5kIG5vZGUgcG9pbnRlcnMgZnJvbSBidWZmZXIgU1toXS4KKyAqLworLyogaXQgYWx3YXlzIHNoaWZ0cyBmcm9tIFNbaF0gdG8gTFtoXSAqLworc3RhdGljIHZvaWQJaW50ZXJuYWxfc2hpZnQxX2xlZnQgKAorCQkJCSAgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgCisJCQkJICAgICAgaW50IGgsIAorCQkJCSAgICAgIGludCBwb2ludGVyX2Ftb3VudAorCQkJCSAgICAgICkKK3sKKyAgc3RydWN0IGJ1ZmZlcl9pbmZvIGRlc3RfYmksIHNyY19iaTsKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICogY2Y7CisgIGludCBkX2tleV9wb3NpdGlvbjsKKworICBpbnRlcm5hbF9kZWZpbmVfZGVzdF9zcmNfaW5mb3MgKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19MLCB0YiwgaCwgJmRlc3RfYmksICZzcmNfYmksICZkX2tleV9wb3NpdGlvbiwgJmNmKTsKKworICBpZiAoIHBvaW50ZXJfYW1vdW50ID4gMCApIC8qIGluc2VydCBsa2V5W2hdLXRoIGtleSAgZnJvbSBDRkxbaF0gdG8gbGVmdCBuZWlnaGJvciBMW2hdICovCisgICAgaW50ZXJuYWxfaW5zZXJ0X2tleSAoJmRlc3RfYmksIEJfTlJfSVRFTVMoZGVzdF9iaS5iaV9iaCksIGNmLCBkX2tleV9wb3NpdGlvbik7CisgIC8qCQlpbnRlcm5hbF9pbnNlcnRfa2V5ICh0Yi0+TFtoXSwgQl9OUl9JVEVNKHRiLT5MW2hdKSwgdGItPkNGTFtoXSwgdGItPmxrZXlbaF0pOyovCisKKyAgLyogbGFzdCBwYXJhbWV0ZXIgaXMgZGVsX3BhcmFtZXRlciAqLworICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICgmZGVzdF9iaSwgJnNyY19iaSwgRklSU1RfVE9fTEFTVCwgcG9pbnRlcl9hbW91bnQsIDEpOworICAvKglpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICh0Yi0+TFtoXSwgdGItPlNbaF0sIEZJUlNUX1RPX0xBU1QsIHBvaW50ZXJfYW1vdW50LCAxKTsqLworfQorCisKKy8qIEluc2VydCBkX2tleSd0aCAoZGVsaW1pdGluZykga2V5IGZyb20gYnVmZmVyIGNmciB0byBoZWFkIG9mIGRlc3QuIAorICogQ29weSBuIG5vZGUgcG9pbnRlcnMgYW5kIG4gLSAxIGl0ZW1zIGZyb20gYnVmZmVyIHNyYyB0byBidWZmZXIgZGVzdC4KKyAqIFJlcGxhY2UgIGRfa2V5J3RoIGtleSBpbiBidWZmZXIgY2ZyLgorICogRGVsZXRlIG4gaXRlbXMgYW5kIG5vZGUgcG9pbnRlcnMgZnJvbSBidWZmZXIgc3JjLgorICovCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9zaGlmdF9yaWdodCAoCisJCQkJICBpbnQgbW9kZSwJLyogSU5URVJOQUxfRlJPTV9TX1RPX1IgfCBJTlRFUk5BTF9GUk9NX0xfVE9fUyAqLworCQkJCSAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLAorCQkJCSAgaW50IGgsCisJCQkJICBpbnQgcG9pbnRlcl9hbW91bnQKKwkJCQkgICkKK3sKKyAgc3RydWN0IGJ1ZmZlcl9pbmZvIGRlc3RfYmksIHNyY19iaTsKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICogY2Y7CisgIGludCBkX2tleV9wb3NpdGlvbjsKKyAgaW50IG5yOworCisKKyAgaW50ZXJuYWxfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zIChtb2RlLCB0YiwgaCwgJmRlc3RfYmksICZzcmNfYmksICZkX2tleV9wb3NpdGlvbiwgJmNmKTsKKworICBuciA9IEJfTlJfSVRFTVMgKHNyY19iaS5iaV9iaCk7CisKKyAgaWYgKHBvaW50ZXJfYW1vdW50ID4gMCkgeworICAgIC8qIGluc2VydCBkZWxpbWl0aW5nIGtleSBmcm9tIGNvbW1vbiBmYXRoZXIgb2YgZGVzdCBhbmQgc3JjIHRvIGRlc3Qgbm9kZSBpbnRvIHBvc2l0aW9uIDAgKi8KKyAgICBpbnRlcm5hbF9pbnNlcnRfa2V5ICgmZGVzdF9iaSwgMCwgY2YsIGRfa2V5X3Bvc2l0aW9uKTsKKyAgICBpZiAobnIgPT0gcG9pbnRlcl9hbW91bnQgLSAxKSB7CisJIFJGQUxTRSggc3JjX2JpLmJpX2JoICE9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCkvKnRiLT5TW2hdKi8gfHwgCisJCSBkZXN0X2JpLmJpX2JoICE9IHRiLT5SW2hdLAorCQkgInNyYyAoJXApIG11c3QgYmUgPT0gdGItPlNbaF0oJXApIHdoZW4gaXQgZGlzYXBwZWFycyIsCisJCSBzcmNfYmkuYmlfYmgsIFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCkpOworICAgICAgLyogd2hlbiBTW2hdIGRpc2FwcGVycyByZXBsYWNlIGxlZnQgZGVsZW1pdGluZyBrZXkgYXMgd2VsbCAqLworICAgICAgaWYgKHRiLT5DRkxbaF0pCisJcmVwbGFjZV9rZXkgKHRiLCBjZiwgZF9rZXlfcG9zaXRpb24sIHRiLT5DRkxbaF0sIHRiLT5sa2V5W2hdKTsKKyAgICB9IGVsc2UKKyAgICAgIHJlcGxhY2Vfa2V5ICh0YiwgY2YsIGRfa2V5X3Bvc2l0aW9uLCBzcmNfYmkuYmlfYmgsIG5yIC0gcG9pbnRlcl9hbW91bnQpOworICB9ICAgICAgCisKKyAgLyogbGFzdCBwYXJhbWV0ZXIgaXMgZGVsX3BhcmFtZXRlciAqLworICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICgmZGVzdF9iaSwgJnNyY19iaSwgTEFTVF9UT19GSVJTVCwgcG9pbnRlcl9hbW91bnQsIDApOworfQorCisvKiBJbnNlcnQgZGVsaW1pdGluZyBrZXkgdG8gUltoXS4KKyAqIENvcHkgbiBub2RlIHBvaW50ZXJzIGFuZCBuIC0gMSBpdGVtcyBmcm9tIGJ1ZmZlciBTW2hdIHRvIFJbaF0uCisgKiBEZWxldGUgbiAtIDEgaXRlbXMgYW5kIG5vZGUgcG9pbnRlcnMgZnJvbSBidWZmZXIgU1toXS4KKyAqLworLyogaXQgYWx3YXlzIHNoaWZ0IGZyb20gU1toXSB0byBSW2hdICovCitzdGF0aWMgdm9pZAlpbnRlcm5hbF9zaGlmdDFfcmlnaHQgKAorCQkJCSAgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIAorCQkJCSAgICAgICBpbnQgaCwgCisJCQkJICAgICAgIGludCBwb2ludGVyX2Ftb3VudAorCQkJCSAgICAgICApCit7CisgIHN0cnVjdCBidWZmZXJfaW5mbyBkZXN0X2JpLCBzcmNfYmk7CisgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGNmOworICBpbnQgZF9rZXlfcG9zaXRpb247CisKKyAgaW50ZXJuYWxfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zIChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fUiwgdGIsIGgsICZkZXN0X2JpLCAmc3JjX2JpLCAmZF9rZXlfcG9zaXRpb24sICZjZik7CisKKyAgaWYgKHBvaW50ZXJfYW1vdW50ID4gMCkgLyogaW5zZXJ0IHJrZXkgZnJvbSBDRlJbaF0gdG8gcmlnaHQgbmVpZ2hib3IgUltoXSAqLworICAgIGludGVybmFsX2luc2VydF9rZXkgKCZkZXN0X2JpLCAwLCBjZiwgZF9rZXlfcG9zaXRpb24pOworICAvKgkJaW50ZXJuYWxfaW5zZXJ0X2tleSAodGItPlJbaF0sIDAsIHRiLT5DRlJbaF0sIHRiLT5ya2V5W2hdKTsqLworCQorICAvKiBsYXN0IHBhcmFtZXRlciBpcyBkZWxfcGFyYW1ldGVyICovCisgIGludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMgKCZkZXN0X2JpLCAmc3JjX2JpLCBMQVNUX1RPX0ZJUlNULCBwb2ludGVyX2Ftb3VudCwgMSk7CisgIC8qCWludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMgKHRiLT5SW2hdLCB0Yi0+U1toXSwgTEFTVF9UT19GSVJTVCwgcG9pbnRlcl9hbW91bnQsIDEpOyovCit9CisKKworLyogRGVsZXRlIGluc2VydF9udW0gbm9kZSBwb2ludGVycyB0b2dldGhlciB3aXRoIHRoZWlyIGxlZnQgaXRlbXMKKyAqIGFuZCBiYWxhbmNlIGN1cnJlbnQgbm9kZS4qLworc3RhdGljIHZvaWQgYmFsYW5jZV9pbnRlcm5hbF93aGVuX2RlbGV0ZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCAKKwkJCQkJICBpbnQgaCwgaW50IGNoaWxkX3BvcykKK3sKKyAgICBpbnQgaW5zZXJ0X251bTsKKyAgICBpbnQgbjsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB0YlNoID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKTsKKyAgICBzdHJ1Y3QgYnVmZmVyX2luZm8gYmk7CisKKyAgICBpbnNlcnRfbnVtID0gdGItPmluc2VydF9zaXplW2hdIC8gKChpbnQpKERDX1NJWkUgKyBLRVlfU0laRSkpOworICAKKyAgICAvKiBkZWxldGUgY2hpbGQtbm9kZS1wb2ludGVyKHMpIHRvZ2V0aGVyIHdpdGggdGhlaXIgbGVmdCBpdGVtKHMpICovCisgICAgYmkudGIgPSB0YjsKKyAgICBiaS5iaV9iaCA9IHRiU2g7CisgICAgYmkuYmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKTsKKyAgICBiaS5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIGggKyAxKTsKKworICAgIGludGVybmFsX2RlbGV0ZV9jaGlsZHMgKCZiaSwgY2hpbGRfcG9zLCAtaW5zZXJ0X251bSk7CisKKyAgICBSRkFMU0UoIHRiLT5ibGtudW1baF0gPiAxLAorCSAgICAidGItPmJsa251bVslZF09JWQgd2hlbiBpbnNlcnRfc2l6ZSA8IDAiLCBoLCB0Yi0+YmxrbnVtW2hdKTsKKworICAgIG4gPSBCX05SX0lURU1TKHRiU2gpOworCisgICAgaWYgKCB0Yi0+bG51bVtoXSA9PSAwICYmIHRiLT5ybnVtW2hdID09IDAgKSB7CisJaWYgKCB0Yi0+YmxrbnVtW2hdID09IDAgKSB7CisJICAgIC8qIG5vZGUgU1toXSAocm9vdCBvZiB0aGUgdHJlZSkgaXMgZW1wdHkgbm93ICovCisJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqbmV3X3Jvb3Q7CisKKwkgICAgUkZBTFNFKCBuIHx8IEJfRlJFRV9TUEFDRSAodGJTaCkgIT0gTUFYX0NISUxEX1NJWkUodGJTaCkgLSBEQ19TSVpFLAorCQkgICAgImJ1ZmZlciBtdXN0IGhhdmUgb25seSAwIGtleXMgKCVkKSIsIG4pOworCSAgICBSRkFMU0UoIGJpLmJpX3BhcmVudCwgInJvb3QgaGFzIHBhcmVudCAoJXApIiwgYmkuYmlfcGFyZW50KTsKKwkJCisJICAgIC8qIGNob29zZSBhIG5ldyByb290ICovCisJICAgIGlmICggISB0Yi0+TFtoLTFdIHx8ICEgQl9OUl9JVEVNUyh0Yi0+TFtoLTFdKSApCisJCW5ld19yb290ID0gdGItPlJbaC0xXTsKKwkgICAgZWxzZQorCQluZXdfcm9vdCA9IHRiLT5MW2gtMV07CisJICAgIC8qIHN3aXRjaCBzdXBlciBibG9jaydzIHRyZWUgcm9vdCBibG9jayBudW1iZXIgdG8gdGhlIG5ldyB2YWx1ZSAqLworICAgICAgICAgICAgUFVUX1NCX1JPT1RfQkxPQ0soIHRiLT50Yl9zYiwgbmV3X3Jvb3QtPmJfYmxvY2tuciApOworCSAgICAvL1JFSVNFUkZTX1NCKHRiLT50Yl9zYiktPnNfcnMtPnNfdHJlZV9oZWlnaHQgLS07CisgICAgICAgICAgICBQVVRfU0JfVFJFRV9IRUlHSFQoIHRiLT50Yl9zYiwgU0JfVFJFRV9IRUlHSFQodGItPnRiX3NiKSAtIDEgKTsKKworCSAgICBkb19iYWxhbmNlX21hcmtfc2JfZGlydHkgKHRiLCBSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX3NiaCwgMSk7CisJICAgIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCisJICAgIGlmIChoID4gMSkKKwkJLyogdXNlIGNoZWNrX2ludGVybmFsIGlmIG5ldyByb290IGlzIGFuIGludGVybmFsIG5vZGUgKi8KKwkJY2hlY2tfaW50ZXJuYWwgKG5ld19yb290KTsKKwkgICAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KKworCSAgICAvKiBkbyB3aGF0IGlzIG5lZWRlZCBmb3IgYnVmZmVyIHRocm93biBmcm9tIHRyZWUgKi8KKwkgICAgcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsIHRiU2gpOworCSAgICByZXR1cm47CisJfQorCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIHRiLT5MW2hdICYmIHRiLT5sbnVtW2hdID09IC1CX05SX0lURU1TKHRiLT5MW2hdKSAtIDEgKSB7IC8qIGpvaW4gU1toXSB3aXRoIExbaF0gKi8KKworCVJGQUxTRSggdGItPnJudW1baF0gIT0gMCwKKwkJImludmFsaWQgdGItPnJudW1bJWRdPT0lZCB3aGVuIGpvaW5pbmcgU1toXSB3aXRoIExbaF0iLAorCQloLCB0Yi0+cm51bVtoXSk7CisKKwlpbnRlcm5hbF9zaGlmdF9sZWZ0IChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fTCwgdGIsIGgsIG4gKyAxKTsKKwlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0YiwgdGJTaCk7CisKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKCB0Yi0+UltoXSAmJiAgdGItPnJudW1baF0gPT0gLUJfTlJfSVRFTVModGItPlJbaF0pIC0gMSApIHsgLyogam9pbiBTW2hdIHdpdGggUltoXSAqLworCVJGQUxTRSggdGItPmxudW1baF0gIT0gMCwKKwkJImludmFsaWQgdGItPmxudW1bJWRdPT0lZCB3aGVuIGpvaW5pbmcgU1toXSB3aXRoIFJbaF0iLAorCQloLCB0Yi0+bG51bVtoXSk7CisKKwlpbnRlcm5hbF9zaGlmdF9yaWdodCAoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX1IsIHRiLCBoLCBuICsgMSk7CisKKwlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0Yix0YlNoKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKCB0Yi0+bG51bVtoXSA8IDAgKSB7IC8qIGJvcnJvdyBmcm9tIGxlZnQgbmVpZ2hib3IgTFtoXSAqLworCVJGQUxTRSggdGItPnJudW1baF0gIT0gMCwKKwkJIndyb25nIHRiLT5ybnVtWyVkXT09JWQgd2hlbiBib3Jyb3cgZnJvbSBMW2hdIiwgaCwgdGItPnJudW1baF0pOworCS8qaW50ZXJuYWxfc2hpZnRfcmlnaHQgKHRiLCBoLCB0Yi0+TFtoXSwgdGItPkNGTFtoXSwgdGItPmxrZXlbaF0sIHRiLT5TW2hdLCAtdGItPmxudW1baF0pOyovCisJaW50ZXJuYWxfc2hpZnRfcmlnaHQgKElOVEVSTkFMX1NISUZUX0ZST01fTF9UT19TLCB0YiwgaCwgLXRiLT5sbnVtW2hdKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKCB0Yi0+cm51bVtoXSA8IDAgKSB7IC8qIGJvcnJvdyBmcm9tIHJpZ2h0IG5laWdoYm9yIFJbaF0gKi8KKwkgUkZBTFNFKCB0Yi0+bG51bVtoXSAhPSAwLAorCQkgImludmFsaWQgdGItPmxudW1bJWRdPT0lZCB3aGVuIGJvcnJvdyBmcm9tIFJbaF0iLCAKKwkJIGgsIHRiLT5sbnVtW2hdKTsKKwlpbnRlcm5hbF9zaGlmdF9sZWZ0IChJTlRFUk5BTF9TSElGVF9GUk9NX1JfVE9fUywgdGIsIGgsIC10Yi0+cm51bVtoXSk7Lyp0Yi0+U1toXSwgdGItPkNGUltoXSwgdGItPnJrZXlbaF0sIHRiLT5SW2hdLCAtdGItPnJudW1baF0pOyovCisJcmV0dXJuOworICAgIH0KKworICAgIGlmICggdGItPmxudW1baF0gPiAwICkgeyAvKiBzcGxpdCBTW2hdIGludG8gdHdvIHBhcnRzIGFuZCBwdXQgdGhlbSBpbnRvIG5laWdoYm9ycyAqLworCVJGQUxTRSggdGItPnJudW1baF0gPT0gMCB8fCB0Yi0+bG51bVtoXSArIHRiLT5ybnVtW2hdICE9IG4gKyAxLAorCQkiaW52YWxpZCB0Yi0+bG51bVslZF09PSVkIG9yIHRiLT5ybnVtWyVkXT09JWQgd2hlbiBTW2hdKGl0ZW0gbnVtYmVyID09ICVkKSBpcyBzcGxpdCBiZXR3ZWVuIHRoZW0iLAorCQloLCB0Yi0+bG51bVtoXSwgaCwgdGItPnJudW1baF0sIG4pOworCisJaW50ZXJuYWxfc2hpZnRfbGVmdCAoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX0wsIHRiLCBoLCB0Yi0+bG51bVtoXSk7Lyp0Yi0+TFtoXSwgdGItPkNGTFtoXSwgdGItPmxrZXlbaF0sIHRiLT5TW2hdLCB0Yi0+bG51bVtoXSk7Ki8KKwlpbnRlcm5hbF9zaGlmdF9yaWdodCAoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX1IsIHRiLCBoLCB0Yi0+cm51bVtoXSk7CisKKwlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlciAodGIsIHRiU2gpOworCisJcmV0dXJuOworICAgIH0KKyAgICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiYmFsYW5jZV9pbnRlcm5hbF93aGVuX2RlbGV0ZTogdW5leHBlY3RlZCB0Yi0+bG51bVslZF09PSVkIG9yIHRiLT5ybnVtWyVkXT09JWQiLAorCQkgICAgaCwgdGItPmxudW1baF0sIGgsIHRiLT5ybnVtW2hdKTsKK30KKworCisvKiBSZXBsYWNlIGRlbGltaXRpbmcga2V5IG9mIGJ1ZmZlcnMgTFtoXSBhbmQgU1toXSBieSB0aGUgZ2l2ZW4ga2V5LiovCitzdGF0aWMgdm9pZCByZXBsYWNlX2xrZXkgKAorCQkgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsCisJCSAgICAgIGludCBoLAorCQkgICAgICBzdHJ1Y3QgaXRlbV9oZWFkICoga2V5CisJCSAgICAgICkKK3sKKyAgIFJGQUxTRSggdGItPkxbaF0gPT0gTlVMTCB8fCB0Yi0+Q0ZMW2hdID09IE5VTEwsCisJICAgIkxbaF0oJXApIGFuZCBDRkxbaF0oJXApIG11c3QgZXhpc3QgaW4gcmVwbGFjZV9sa2V5IiwgCisJICAgdGItPkxbaF0sIHRiLT5DRkxbaF0pOworCisgIGlmIChCX05SX0lURU1TKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoKSkgPT0gMCkKKyAgICByZXR1cm47CisKKyAgbWVtY3B5IChCX05fUERFTElNX0tFWSh0Yi0+Q0ZMW2hdLHRiLT5sa2V5W2hdKSwga2V5LCBLRVlfU0laRSk7CisKKyAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5ICh0YiwgdGItPkNGTFtoXSwwKTsKK30KKworCisvKiBSZXBsYWNlIGRlbGltaXRpbmcga2V5IG9mIGJ1ZmZlcnMgU1toXSBhbmQgUltoXSBieSB0aGUgZ2l2ZW4ga2V5LiovCitzdGF0aWMgdm9pZCByZXBsYWNlX3JrZXkgKAorCQkgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsCisJCSAgICAgIGludCBoLAorCQkgICAgICBzdHJ1Y3QgaXRlbV9oZWFkICoga2V5CisJCSAgICAgICkKK3sKKyAgUkZBTFNFKCB0Yi0+UltoXSA9PSBOVUxMIHx8IHRiLT5DRlJbaF0gPT0gTlVMTCwKKwkgICJSW2hdKCVwKSBhbmQgQ0ZSW2hdKCVwKSBtdXN0IGV4aXN0IGluIHJlcGxhY2VfcmtleSIsIAorCSAgdGItPlJbaF0sIHRiLT5DRlJbaF0pOworICBSRkFMU0UoIEJfTlJfSVRFTVModGItPlJbaF0pID09IDAsCisJICAiUltoXSBjYW4gbm90IGJlIGVtcHR5IGlmIGl0IGV4aXN0cyAoaXRlbSBudW1iZXI9JWQpIiwgCisJICBCX05SX0lURU1TKHRiLT5SW2hdKSk7CisKKyAgbWVtY3B5IChCX05fUERFTElNX0tFWSh0Yi0+Q0ZSW2hdLHRiLT5ya2V5W2hdKSwga2V5LCBLRVlfU0laRSk7CisKKyAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5ICh0YiwgdGItPkNGUltoXSwgMCk7Cit9CisKKworaW50IGJhbGFuY2VfaW50ZXJuYWwgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwJCQkvKiB0cmVlX2JhbGFuY2Ugc3RydWN0dXJlIAkJKi8KKwkJICAgICAgaW50IGgsCQkJCQkvKiBsZXZlbCBvZiB0aGUgdHJlZSAJCQkqLworCQkgICAgICBpbnQgY2hpbGRfcG9zLAorCQkgICAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaW5zZXJ0X2tleSwJCS8qIGtleSBmb3IgaW5zZXJ0aW9uIG9uIGhpZ2hlciBsZXZlbCAgIAkqLworCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogaW5zZXJ0X3B0cgkvKiBub2RlIGZvciBpbnNlcnRpb24gb24gaGlnaGVyIGxldmVsKi8KKyAgICApCisgICAgLyogaWYgaW5zZXJ0aW5nL3Bhc3RpbmcKKyAgICAgICB7CisgICAgICAgY2hpbGRfcG9zIGlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbm9kZS1wb2ludGVyIGluIFNbaF0gdGhhdAkgKgorICAgICAgIHBvaW50ZWQgdG8gU1toLTFdIGJlZm9yZSBiYWxhbmNpbmcgb2YgdGhlIGgtMSBsZXZlbDsJCSAqCisgICAgICAgdGhpcyBtZWFucyB0aGF0IG5ldyBwb2ludGVycyBhbmQgaXRlbXMgbXVzdCBiZSBpbnNlcnRlZCBBRlRFUiAqCisgICAgICAgY2hpbGRfcG9zCisgICAgICAgfQorICAgICAgIGVsc2UgCisgICAgICAgeworICAgaXQgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsZWZ0bW9zdCBwb2ludGVyIHRoYXQgbXVzdCBiZSBkZWxldGVkICh0b2dldGhlciB3aXRoCisgICBpdHMgY29ycmVzcG9uZGluZyBrZXkgdG8gdGhlIGxlZnQgb2YgdGhlIHBvaW50ZXIpCisgICBhcyBhIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgbGV2ZWwncyBiYWxhbmNpbmcuCisgICB9CisqLworeworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIHRiU2ggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOworICAgIHN0cnVjdCBidWZmZXJfaW5mbyBiaTsKKyAgICBpbnQgb3JkZXI7CQkvKiB3ZSByZXR1cm4gdGhpczogaXQgaXMgMCBpZiB0aGVyZSBpcyBubyBTW2hdLCBlbHNlIGl0IGlzIHRiLT5TW2hdLT5iX2l0ZW1fb3JkZXIgKi8KKyAgICBpbnQgaW5zZXJ0X251bSwgbiwgazsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBTX25ldzsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkIG5ld19pbnNlcnRfa2V5OworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIG5ld19pbnNlcnRfcHRyID0gTlVMTDsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICogbmV3X2luc2VydF9rZXlfYWRkciA9IGluc2VydF9rZXk7CisKKyAgICBSRkFMU0UoIGggPCAxLCAiaCAoJWQpIGNhbiBub3QgYmUgPCAxIG9uIGludGVybmFsIGxldmVsIiwgaCk7CisKKyAgICBQUk9DX0lORk9fSU5DKCB0YiAtPiB0Yl9zYiwgYmFsYW5jZV9hdFsgaCBdICk7CisKKyAgICBvcmRlciA9ICggdGJTaCApID8gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpLyp0Yi0+U1toXS0+Yl9pdGVtX29yZGVyKi8gOiAwOworCisgIC8qIFVzaW5nIGluc2VydF9zaXplW2hdIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIGluc2VydF9udW0gb2YgaXRlbXMKKyAgICAgdGhhdCBtdXN0IGJlIGluc2VydGVkIHRvIG9yIGRlbGV0ZWQgZnJvbSBTW2hdLiAqLworICAgIGluc2VydF9udW0gPSB0Yi0+aW5zZXJ0X3NpemVbaF0vKChpbnQpKEtFWV9TSVpFICsgRENfU0laRSkpOworCisgICAgLyogQ2hlY2sgd2hldGhlciBpbnNlcnRfbnVtIGlzIHByb3BlciAqKi8KKyAgICBSRkFMU0UoIGluc2VydF9udW0gPCAtMiAgfHwgIGluc2VydF9udW0gPiAyLAorCSAgICAiaW5jb3JyZWN0IG51bWJlciBvZiBpdGVtcyBpbnNlcnRlZCB0byB0aGUgaW50ZXJuYWwgbm9kZSAoJWQpIiwgCisJICAgIGluc2VydF9udW0pOworICAgIFJGQUxTRSggaCA+IDEgICYmIChpbnNlcnRfbnVtID4gMSB8fCBpbnNlcnRfbnVtIDwgLTEpLAorCSAgICAiaW5jb3JyZWN0IG51bWJlciBvZiBpdGVtcyAoJWQpIGluc2VydGVkIHRvIHRoZSBpbnRlcm5hbCBub2RlIG9uIGEgbGV2ZWwgKGg9JWQpIGhpZ2hlciB0aGFuIGxhc3QgaW50ZXJuYWwgbGV2ZWwiLCAKKwkgICAgaW5zZXJ0X251bSwgaCk7CisKKyAgICAvKiBNYWtlIGJhbGFuY2UgaW4gY2FzZSBpbnNlcnRfbnVtIDwgMCAqLworICAgIGlmICggaW5zZXJ0X251bSA8IDAgKSB7CisJYmFsYW5jZV9pbnRlcm5hbF93aGVuX2RlbGV0ZSAodGIsIGgsIGNoaWxkX3Bvcyk7CisJcmV0dXJuIG9yZGVyOworICAgIH0KKyAKKyAgICBrID0gMDsKKyAgICBpZiAoIHRiLT5sbnVtW2hdID4gMCApIHsKKwkvKiBzaGlmdCBsbnVtW2hdIGl0ZW1zIGZyb20gU1toXSB0byB0aGUgbGVmdCBuZWlnaGJvciBMW2hdLgorCSAgIGNoZWNrIGhvdyBtYW55IG9mIG5ldyBpdGVtcyBmYWxsIGludG8gTFtoXSBvciBDRkxbaF0gYWZ0ZXIKKwkgICBzaGlmdGluZyAqLworCW4gPSBCX05SX0lURU1TICh0Yi0+TFtoXSk7IC8qIG51bWJlciBvZiBpdGVtcyBpbiBMW2hdICovCisJaWYgKCB0Yi0+bG51bVtoXSA8PSBjaGlsZF9wb3MgKSB7CisJICAgIC8qIG5ldyBpdGVtcyBkb24ndCBmYWxsIGludG8gTFtoXSBvciBDRkxbaF0gKi8KKwkgICAgaW50ZXJuYWxfc2hpZnRfbGVmdCAoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX0wsIHRiLCBoLCB0Yi0+bG51bVtoXSk7CisJICAgIC8qaW50ZXJuYWxfc2hpZnRfbGVmdCAodGItPkxbaF0sdGItPkNGTFtoXSx0Yi0+bGtleVtoXSx0YlNoLHRiLT5sbnVtW2hdKTsqLworCSAgICBjaGlsZF9wb3MgLT0gdGItPmxudW1baF07CisJfSBlbHNlIGlmICggdGItPmxudW1baF0gPiBjaGlsZF9wb3MgKyBpbnNlcnRfbnVtICkgeworCSAgICAvKiBhbGwgbmV3IGl0ZW1zIGZhbGwgaW50byBMW2hdICovCisJICAgIGludGVybmFsX3NoaWZ0X2xlZnQgKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19MLCB0YiwgaCwgdGItPmxudW1baF0gLSBpbnNlcnRfbnVtKTsKKwkgICAgLyoJCQlpbnRlcm5hbF9zaGlmdF9sZWZ0KHRiLT5MW2hdLHRiLT5DRkxbaF0sdGItPmxrZXlbaF0sdGJTaCwKKwkJCQl0Yi0+bG51bVtoXS1pbnNlcnRfbnVtKTsKKwkgICAgKi8KKwkgICAgLyogaW5zZXJ0IGluc2VydF9udW0ga2V5cyBhbmQgbm9kZS1wb2ludGVycyBpbnRvIExbaF0gKi8KKwkgICAgYmkudGIgPSB0YjsKKwkgICAgYmkuYmlfYmggPSB0Yi0+TFtoXTsKKwkgICAgYmkuYmlfcGFyZW50ID0gdGItPkZMW2hdOworCSAgICBiaS5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7CisJICAgIGludGVybmFsX2luc2VydF9jaGlsZHMgKCZiaSwvKnRiLT5MW2hdLCB0Yi0+U1toLTFdLT5iX25leHQqLyBuICsgY2hpbGRfcG9zICsgMSwKKwkJCQkgICAgaW5zZXJ0X251bSxpbnNlcnRfa2V5LGluc2VydF9wdHIpOworCisJICAgIGluc2VydF9udW0gPSAwOyAKKwl9IGVsc2UgeworCSAgICBzdHJ1Y3QgZGlza19jaGlsZCAqIGRjOworCisJICAgIC8qIHNvbWUgaXRlbXMgZmFsbCBpbnRvIExbaF0gb3IgQ0ZMW2hdLCBidXQgc29tZSBkb24ndCBmYWxsICovCisJICAgIGludGVybmFsX3NoaWZ0MV9sZWZ0KHRiLGgsY2hpbGRfcG9zKzEpOworCSAgICAvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIG5ldyBpdGVtcyB0aGF0IGZhbGwgaW50byBMW2hdICovCisJICAgIGsgPSB0Yi0+bG51bVtoXSAtIGNoaWxkX3BvcyAtIDE7CisJICAgIGJpLnRiID0gdGI7CisJICAgIGJpLmJpX2JoID0gdGItPkxbaF07CisJICAgIGJpLmJpX3BhcmVudCA9IHRiLT5GTFtoXTsKKwkgICAgYmkuYmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIGgpOworCSAgICBpbnRlcm5hbF9pbnNlcnRfY2hpbGRzICgmYmksLyp0Yi0+TFtoXSwgdGItPlNbaC0xXS0+Yl9uZXh0LCovIG4gKyBjaGlsZF9wb3MgKyAxLGssCisJCQkJICAgIGluc2VydF9rZXksaW5zZXJ0X3B0cik7CisKKwkgICAgcmVwbGFjZV9sa2V5KHRiLGgsaW5zZXJ0X2tleSArIGspOworCisJICAgIC8qIHJlcGxhY2UgdGhlIGZpcnN0IG5vZGUtcHRyIGluIFNbaF0gYnkgbm9kZS1wdHIgdG8gaW5zZXJ0X3B0cltrXSAqLworCSAgICBkYyA9IEJfTl9DSElMRCh0YlNoLCAwKTsKKwkgICAgcHV0X2RjX3NpemUoIGRjLCBNQVhfQ0hJTERfU0laRShpbnNlcnRfcHRyW2tdKSAtIEJfRlJFRV9TUEFDRSAoaW5zZXJ0X3B0cltrXSkpOworCSAgICBwdXRfZGNfYmxvY2tfbnVtYmVyKCBkYywgaW5zZXJ0X3B0cltrXS0+Yl9ibG9ja25yICk7CisKKwkgICAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5ICh0YiwgdGJTaCwgMCk7CisKKwkgICAgaysrOworCSAgICBpbnNlcnRfa2V5ICs9IGs7CisJICAgIGluc2VydF9wdHIgKz0gazsKKwkgICAgaW5zZXJ0X251bSAtPSBrOworCSAgICBjaGlsZF9wb3MgPSAwOworCX0KKyAgICB9CS8qIHRiLT5sbnVtW2hdID4gMCAqLworCisgICAgaWYgKCB0Yi0+cm51bVtoXSA+IDAgKSB7CisJLypzaGlmdCBybnVtW2hdIGl0ZW1zIGZyb20gU1toXSB0byB0aGUgcmlnaHQgbmVpZ2hib3IgUltoXSovCisJLyogY2hlY2sgaG93IG1hbnkgb2YgbmV3IGl0ZW1zIGZhbGwgaW50byBSIG9yIENGUiBhZnRlciBzaGlmdGluZyAqLworCW4gPSBCX05SX0lURU1TICh0YlNoKTsgLyogbnVtYmVyIG9mIGl0ZW1zIGluIFNbaF0gKi8KKwlpZiAoIG4gLSB0Yi0+cm51bVtoXSA+PSBjaGlsZF9wb3MgKQorCSAgICAvKiBuZXcgaXRlbXMgZmFsbCBpbnRvIFNbaF0gKi8KKwkgICAgLyppbnRlcm5hbF9zaGlmdF9yaWdodCh0YixoLHRiU2gsdGItPkNGUltoXSx0Yi0+cmtleVtoXSx0Yi0+UltoXSx0Yi0+cm51bVtoXSk7Ki8KKwkgICAgaW50ZXJuYWxfc2hpZnRfcmlnaHQgKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SLCB0YiwgaCwgdGItPnJudW1baF0pOworCWVsc2UKKwkgICAgaWYgKCBuICsgaW5zZXJ0X251bSAtIHRiLT5ybnVtW2hdIDwgY2hpbGRfcG9zICkKKwkgICAgeworCQkvKiBhbGwgbmV3IGl0ZW1zIGZhbGwgaW50byBSW2hdICovCisJCS8qaW50ZXJuYWxfc2hpZnRfcmlnaHQodGIsaCx0YlNoLHRiLT5DRlJbaF0sdGItPnJrZXlbaF0sdGItPlJbaF0sCisJICAgIHRiLT5ybnVtW2hdIC0gaW5zZXJ0X251bSk7Ki8KKwkJaW50ZXJuYWxfc2hpZnRfcmlnaHQgKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SLCB0YiwgaCwgdGItPnJudW1baF0gLSBpbnNlcnRfbnVtKTsKKworCQkvKiBpbnNlcnQgaW5zZXJ0X251bSBrZXlzIGFuZCBub2RlLXBvaW50ZXJzIGludG8gUltoXSAqLworCQliaS50YiA9IHRiOworCQliaS5iaV9iaCA9IHRiLT5SW2hdOworCQliaS5iaV9wYXJlbnQgPSB0Yi0+RlJbaF07CisJCWJpLmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7CisJCWludGVybmFsX2luc2VydF9jaGlsZHMgKCZiaSwgLyp0Yi0+UltoXSx0Yi0+U1toLTFdLT5iX25leHQqLyBjaGlsZF9wb3MgLSBuIC0gaW5zZXJ0X251bSArIHRiLT5ybnVtW2hdIC0gMSwKKwkJCQkJaW5zZXJ0X251bSxpbnNlcnRfa2V5LGluc2VydF9wdHIpOworCQlpbnNlcnRfbnVtID0gMDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJc3RydWN0IGRpc2tfY2hpbGQgKiBkYzsKKworCQkvKiBvbmUgb2YgdGhlIGl0ZW1zIGZhbGxzIGludG8gQ0ZSW2hdICovCisJCWludGVybmFsX3NoaWZ0MV9yaWdodCh0YixoLG4gLSBjaGlsZF9wb3MgKyAxKTsKKwkJLyogY2FsY3VsYXRlIG51bWJlciBvZiBuZXcgaXRlbXMgdGhhdCBmYWxsIGludG8gUltoXSAqLworCQlrID0gdGItPnJudW1baF0gLSBuICsgY2hpbGRfcG9zIC0gMTsKKwkJYmkudGIgPSB0YjsKKwkJYmkuYmlfYmggPSB0Yi0+UltoXTsKKwkJYmkuYmlfcGFyZW50ID0gdGItPkZSW2hdOworCQliaS5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIGgpOworCQlpbnRlcm5hbF9pbnNlcnRfY2hpbGRzICgmYmksIC8qdGItPlJbaF0sIHRiLT5SW2hdLT5iX2NoaWxkLCovIDAsIGssIGluc2VydF9rZXkgKyAxLCBpbnNlcnRfcHRyICsgMSk7CisKKwkJcmVwbGFjZV9ya2V5KHRiLGgsaW5zZXJ0X2tleSArIGluc2VydF9udW0gLSBrIC0gMSk7CisKKwkJLyogcmVwbGFjZSB0aGUgZmlyc3Qgbm9kZS1wdHIgaW4gUltoXSBieSBub2RlLXB0ciBpbnNlcnRfcHRyW2luc2VydF9udW0tay0xXSovCisJCWRjID0gQl9OX0NISUxEKHRiLT5SW2hdLCAwKTsKKwkJcHV0X2RjX3NpemUoIGRjLCBNQVhfQ0hJTERfU0laRShpbnNlcnRfcHRyW2luc2VydF9udW0tay0xXSkgLQorICAgIAkJCQkgICAgQl9GUkVFX1NQQUNFIChpbnNlcnRfcHRyW2luc2VydF9udW0tay0xXSkpOworCQlwdXRfZGNfYmxvY2tfbnVtYmVyKCBkYywgaW5zZXJ0X3B0cltpbnNlcnRfbnVtLWstMV0tPmJfYmxvY2tuciApOworCisJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAodGIsIHRiLT5SW2hdLDApOworCisJCWluc2VydF9udW0gLT0gKGsgKyAxKTsKKwkgICAgfQorICAgIH0KKworICAgIC8qKiBGaWxsIG5ldyBub2RlIHRoYXQgYXBwZWFycyBpbnN0ZWFkIG9mIFNbaF0gKiovCisgICAgUkZBTFNFKCB0Yi0+YmxrbnVtW2hdID4gMiwgImJsa251bSBjYW4gbm90IGJlID4gMiBmb3IgaW50ZXJuYWwgbGV2ZWwiKTsKKyAgICBSRkFMU0UoIHRiLT5ibGtudW1baF0gPCAwLCAiYmxrbnVtIGNhbiBub3QgYmUgPCAwIik7CisKKyAgICBpZiAoICEgdGItPmJsa251bVtoXSApCisgICAgeyAvKiBub2RlIFNbaF0gaXMgZW1wdHkgbm93ICovCisJUkZBTFNFKCAhIHRiU2gsICJTW2hdIGlzIGVxdWFsIE5VTEwiKTsKKworCS8qIGRvIHdoYXQgaXMgbmVlZGVkIGZvciBidWZmZXIgdGhyb3duIGZyb20gdHJlZSAqLworCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLHRiU2gpOworCXJldHVybiBvcmRlcjsKKyAgICB9CisKKyAgICBpZiAoICEgdGJTaCApIHsKKwkvKiBjcmVhdGUgbmV3IHJvb3QgKi8KKwlzdHJ1Y3QgZGlza19jaGlsZCAgKiBkYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB0YlNoXzEgPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGggLSAxKTsKKyAgICAgICAgc3RydWN0IGJsb2NrX2hlYWQgKiAgYmxraDsKKworCisJaWYgKCB0Yi0+YmxrbnVtW2hdICE9IDEgKQorCSAgICByZWlzZXJmc19wYW5pYyhOVUxMLCAiYmFsYW5jZV9pbnRlcm5hbDogT25lIG5ldyBub2RlIHJlcXVpcmVkIGZvciBjcmVhdGluZyB0aGUgbmV3IHJvb3QiKTsKKwkvKiBTW2hdID0gZW1wdHkgYnVmZmVyIGZyb20gdGhlIGxpc3QgRkVCLiAqLworCXRiU2ggPSBnZXRfRkVCICh0Yik7CisgICAgICAgIGJsa2ggPSBCX0JMS19IRUFEKHRiU2gpOworICAgICAgICBzZXRfYmxraF9sZXZlbCggYmxraCwgaCArIDEgKTsKKworCS8qIFB1dCB0aGUgdW5pcXVlIG5vZGUtcG9pbnRlciB0byBTW2hdIHRoYXQgcG9pbnRzIHRvIFNbaC0xXS4gKi8KKworCWRjID0gQl9OX0NISUxEKHRiU2gsIDApOworCXB1dF9kY19ibG9ja19udW1iZXIoIGRjLCB0YlNoXzEtPmJfYmxvY2tuciApOworCXB1dF9kY19zaXplKCBkYywgKE1BWF9DSElMRF9TSVpFICh0YlNoXzEpIC0gQl9GUkVFX1NQQUNFICh0YlNoXzEpKSk7CisKKwl0Yi0+aW5zZXJ0X3NpemVbaF0gLT0gRENfU0laRTsKKyAgICAgICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwgYmxraF9mcmVlX3NwYWNlKGJsa2gpIC0gRENfU0laRSApOworCisJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5ICh0YiwgdGJTaCwgMCk7CisKKwkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCisJY2hlY2tfaW50ZXJuYWwgKHRiU2gpOworCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KKyAgICAKKyAgICAvKiBwdXQgbmV3IHJvb3QgaW50byBwYXRoIHN0cnVjdHVyZSAqLworCVBBVEhfT0ZGU0VUX1BCVUZGRVIodGItPnRiX3BhdGgsIElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCkgPSB0YlNoOworCisJLyogQ2hhbmdlIHJvb3QgaW4gc3RydWN0dXJlIHN1cGVyIGJsb2NrLiAqLworICAgICAgICBQVVRfU0JfUk9PVF9CTE9DSyggdGItPnRiX3NiLCB0YlNoLT5iX2Jsb2NrbnIgKTsKKyAgICAgICAgUFVUX1NCX1RSRUVfSEVJR0hUKCB0Yi0+dGJfc2IsIFNCX1RSRUVfSEVJR0hUKHRiLT50Yl9zYikgKyAxICk7CisJZG9fYmFsYW5jZV9tYXJrX3NiX2RpcnR5ICh0YiwgUkVJU0VSRlNfU0IodGItPnRiX3NiKS0+c19zYmgsIDEpOworICAgIH0KKwkKKyAgICBpZiAoIHRiLT5ibGtudW1baF0gPT0gMiApIHsKKwlpbnQgc251bTsKKwlzdHJ1Y3QgYnVmZmVyX2luZm8gZGVzdF9iaSwgc3JjX2JpOworCisKKwkvKiBTX25ldyA9IGZyZWUgYnVmZmVyIGZyb20gbGlzdCBGRUIgKi8KKwlTX25ldyA9IGdldF9GRUIodGIpOworCisgICAgICAgIHNldF9ibGtoX2xldmVsKCBCX0JMS19IRUFEKFNfbmV3KSwgaCArIDEgKTsKKworCWRlc3RfYmkudGIgPSB0YjsKKwlkZXN0X2JpLmJpX2JoID0gU19uZXc7CisJZGVzdF9iaS5iaV9wYXJlbnQgPSBOVUxMOworCWRlc3RfYmkuYmlfcG9zaXRpb24gPSAwOworCXNyY19iaS50YiA9IHRiOworCXNyY19iaS5iaV9iaCA9IHRiU2g7CisJc3JjX2JpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7CisJc3JjX2JpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpOworCQkKKwluID0gQl9OUl9JVEVNUyAodGJTaCk7IC8qIG51bWJlciBvZiBpdGVtcyBpbiBTW2hdICovCisJc251bSA9IChpbnNlcnRfbnVtICsgbiArIDEpLzI7CisJaWYgKCBuIC0gc251bSA+PSBjaGlsZF9wb3MgKSB7CisJICAgIC8qIG5ldyBpdGVtcyBkb24ndCBmYWxsIGludG8gU19uZXcgKi8KKwkgICAgLyoJc3RvcmUgdGhlIGRlbGltaXRpbmcga2V5IGZvciB0aGUgbmV4dCBsZXZlbCAqLworCSAgICAvKiBuZXdfaW5zZXJ0X2tleSA9IChuIC0gc251bSkndGgga2V5IGluIFNbaF0gKi8KKwkgICAgbWVtY3B5ICgmbmV3X2luc2VydF9rZXksQl9OX1BERUxJTV9LRVkodGJTaCxuIC0gc251bSksCisJCSAgICBLRVlfU0laRSk7CisJICAgIC8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXIgKi8KKwkgICAgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyAoJmRlc3RfYmksICZzcmNfYmksIExBU1RfVE9fRklSU1QsIHNudW0sIDApOworCSAgICAvKiAgICAgICAgICAgIGludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMoU19uZXcsIHRiU2gsIExBU1RfVE9fRklSU1QsIHNudW0sIDApOyovCisJfSBlbHNlIGlmICggbiArIGluc2VydF9udW0gLSBzbnVtIDwgY2hpbGRfcG9zICkgeworCSAgICAvKiBhbGwgbmV3IGl0ZW1zIGZhbGwgaW50byBTX25ldyAqLworCSAgICAvKglzdG9yZSB0aGUgZGVsaW1pdGluZyBrZXkgZm9yIHRoZSBuZXh0IGxldmVsICovCisJICAgIC8qIG5ld19pbnNlcnRfa2V5ID0gKG4gKyBpbnNlcnRfaXRlbSAtIHNudW0pJ3RoIGtleSBpbiBTW2hdICovCisJICAgIG1lbWNweSgmbmV3X2luc2VydF9rZXksQl9OX1BERUxJTV9LRVkodGJTaCxuICsgaW5zZXJ0X251bSAtIHNudW0pLAorCQkgICBLRVlfU0laRSk7CisJICAgIC8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXIgKi8KKwkgICAgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyAoJmRlc3RfYmksICZzcmNfYmksIExBU1RfVE9fRklSU1QsIHNudW0gLSBpbnNlcnRfbnVtLCAwKTsKKwkgICAgLyoJCQlpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zKFNfbmV3LHRiU2gsMSxzbnVtIC0gaW5zZXJ0X251bSwwKTsqLworCisJICAgIC8qIGluc2VydCBpbnNlcnRfbnVtIGtleXMgYW5kIG5vZGUtcG9pbnRlcnMgaW50byBTX25ldyAqLworCSAgICBpbnRlcm5hbF9pbnNlcnRfY2hpbGRzICgmZGVzdF9iaSwgLypTX25ldyx0Yi0+U1toLTFdLT5iX25leHQsKi9jaGlsZF9wb3MgLSBuIC0gaW5zZXJ0X251bSArIHNudW0gLSAxLAorCQkJCSAgICBpbnNlcnRfbnVtLGluc2VydF9rZXksaW5zZXJ0X3B0cik7CisKKwkgICAgaW5zZXJ0X251bSA9IDA7CisJfSBlbHNlIHsKKwkgICAgc3RydWN0IGRpc2tfY2hpbGQgKiBkYzsKKworCSAgICAvKiBzb21lIGl0ZW1zIGZhbGwgaW50byBTX25ldywgYnV0IHNvbWUgZG9uJ3QgZmFsbCAqLworCSAgICAvKiBsYXN0IHBhcmFtZXRlciBpcyBkZWxfcGFyICovCisJICAgIGludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMgKCZkZXN0X2JpLCAmc3JjX2JpLCBMQVNUX1RPX0ZJUlNULCBuIC0gY2hpbGRfcG9zICsgMSwgMSk7CisJICAgIC8qCQkJaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyhTX25ldyx0YlNoLDEsbiAtIGNoaWxkX3BvcyArIDEsMSk7Ki8KKwkgICAgLyogY2FsY3VsYXRlIG51bWJlciBvZiBuZXcgaXRlbXMgdGhhdCBmYWxsIGludG8gU19uZXcgKi8KKwkgICAgayA9IHNudW0gLSBuICsgY2hpbGRfcG9zIC0gMTsKKworCSAgICBpbnRlcm5hbF9pbnNlcnRfY2hpbGRzICgmZGVzdF9iaSwgLypTX25ldywqLyAwLCBrLCBpbnNlcnRfa2V5ICsgMSwgaW5zZXJ0X3B0cisxKTsKKworCSAgICAvKiBuZXdfaW5zZXJ0X2tleSA9IGluc2VydF9rZXlbaW5zZXJ0X251bSAtIGsgLSAxXSAqLworCSAgICBtZW1jcHkoJm5ld19pbnNlcnRfa2V5LGluc2VydF9rZXkgKyBpbnNlcnRfbnVtIC0gayAtIDEsCisJCSAgIEtFWV9TSVpFKTsKKwkgICAgLyogcmVwbGFjZSBmaXJzdCBub2RlLXB0ciBpbiBTX25ldyBieSBub2RlLXB0ciB0byBpbnNlcnRfcHRyW2luc2VydF9udW0tay0xXSAqLworCisJICAgIGRjID0gQl9OX0NISUxEKFNfbmV3LDApOworCSAgICBwdXRfZGNfc2l6ZSggZGMsIChNQVhfQ0hJTERfU0laRShpbnNlcnRfcHRyW2luc2VydF9udW0tay0xXSkgLQorCQkJCUJfRlJFRV9TUEFDRShpbnNlcnRfcHRyW2luc2VydF9udW0tay0xXSkpICk7CisJICAgIHB1dF9kY19ibG9ja19udW1iZXIoIGRjLCBpbnNlcnRfcHRyW2luc2VydF9udW0tay0xXS0+Yl9ibG9ja25yICk7CisKKwkgICAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5ICh0YiwgU19uZXcsMCk7CisJCQkKKwkgICAgaW5zZXJ0X251bSAtPSAoayArIDEpOworCX0KKwkvKiBuZXdfaW5zZXJ0X3B0ciA9IG5vZGVfcG9pbnRlciB0byBTX25ldyAqLworCW5ld19pbnNlcnRfcHRyID0gU19uZXc7CisKKwlSRkFMU0UgKCFidWZmZXJfam91cm5hbGVkKFNfbmV3KSB8fCBidWZmZXJfam91cm5hbF9kaXJ0eShTX25ldykgfHwKKwkJYnVmZmVyX2RpcnR5IChTX25ldyksCisJCSJjbS0wMDAwMTogYmFkIFNfbmV3ICglYikiLCBTX25ldyk7CisKKwkvLyBTX25ldyBpcyByZWxlYXNlZCBpbiB1bmZpeF9ub2RlcworICAgIH0KKworICAgIG4gPSBCX05SX0lURU1TICh0YlNoKTsgLypudW1iZXIgb2YgaXRlbXMgaW4gU1toXSAqLworCisJaWYgKCAwIDw9IGNoaWxkX3BvcyAmJiBjaGlsZF9wb3MgPD0gbiAmJiBpbnNlcnRfbnVtID4gMCApIHsKKwkgICAgYmkudGIgPSB0YjsKKwkgICAgYmkuYmlfYmggPSB0YlNoOworCSAgICBiaS5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpOworCSAgICBiaS5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIGggKyAxKTsKKwkJaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcyAoCisJCSAgICAmYmksLyp0YlNoLCovCisJCSAgICAvKgkJKCB0Yi0+U1toLTFdLT5iX3BhcmVudCA9PSB0Yi0+U1toXSApID8gdGItPlNbaC0xXS0+Yl9uZXh0IDogIHRiLT5TW2hdLT5iX2NoaWxkLT5iX25leHQsKi8KKwkJICAgIGNoaWxkX3BvcyxpbnNlcnRfbnVtLGluc2VydF9rZXksaW5zZXJ0X3B0cgorCQkgICAgKTsKKwl9CisKKworCW1lbWNweSAobmV3X2luc2VydF9rZXlfYWRkciwmbmV3X2luc2VydF9rZXksS0VZX1NJWkUpOworCWluc2VydF9wdHJbMF0gPSBuZXdfaW5zZXJ0X3B0cjsKKworCXJldHVybiBvcmRlcjsKKyAgICB9CisKKyAgCisgICAgCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9pbm9kZS5jIGIvZnMvcmVpc2VyZnMvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTQzMDMxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcmVpc2VyZnMvaW5vZGUuYwpAQCAtMCwwICsxLDI4NDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMCBieSBIYW5zIFJlaXNlciwgbGljZW5zaW5nIGdvdmVybmVkIGJ5IHJlaXNlcmZzL1JFQURNRQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2FjbC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX3hhdHRyLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorCitleHRlcm4gaW50IHJlaXNlcmZzX2RlZmF1bHRfaW9fc2l6ZTsgLyogZGVmYXVsdCBpbyBzaXplIGRldnVuZWQgaW4gc3VwZXIuYyAqLworCitzdGF0aWMgaW50IHJlaXNlcmZzX2NvbW1pdF93cml0ZShzdHJ1Y3QgZmlsZSAqZiwgc3RydWN0IHBhZ2UgKnBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0byk7CitzdGF0aWMgaW50IHJlaXNlcmZzX3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmYsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCSAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pOworCit2b2lkIHJlaXNlcmZzX2RlbGV0ZV9pbm9kZSAoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisgICAgLyogV2UgbmVlZCBibG9ja3MgZm9yIHRyYW5zYWN0aW9uICsgKHVzZXIrZ3JvdXApIHF1b3RhIHVwZGF0ZSAocG9zc2libHkgZGVsZXRlKSAqLworICAgIGludCBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDIgKyAyICogUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1M7CisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7CisgIAorICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCisgICAgLyogVGhlID0gMCBoYXBwZW5zIHdoZW4gd2UgYWJvcnQgY3JlYXRpbmcgYSBuZXcgaW5vZGUgZm9yIHNvbWUgcmVhc29uIGxpa2UgbGFjayBvZiBzcGFjZS4uICovCisgICAgaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgJiYgSU5PREVfUEtFWShpbm9kZSktPmtfb2JqZWN0aWQgIT0gMCkgeyAvKiBhbHNvIGhhbmRsZXMgYmFkX2lub2RlIGNhc2UgKi8KKwlkb3duICgmaW5vZGUtPmlfc2VtKTsgCisKKwlyZWlzZXJmc19kZWxldGVfeGF0dHJzIChpbm9kZSk7CisKKwlpZiAoam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpKSB7CisJICAgIHVwICgmaW5vZGUtPmlfc2VtKTsKKwkgICAgZ290byBvdXQ7CisJfQorCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOworCisJaWYgKHJlaXNlcmZzX2RlbGV0ZV9vYmplY3QgKCZ0aCwgaW5vZGUpKSB7CisJICAgIHVwICgmaW5vZGUtPmlfc2VtKTsKKwkgICAgZ290byBvdXQ7CisJfQorCisJLyogRG8gcXVvdGEgdXBkYXRlIGluc2lkZSBhIHRyYW5zYWN0aW9uIGZvciBqb3VybmFsZWQgcXVvdGFzLiBXZSBtdXN0IGRvIHRoYXQKKwkgKiBhZnRlciBkZWxldGVfb2JqZWN0IHNvIHRoYXQgcXVvdGEgdXBkYXRlcyBnbyBpbnRvIHRoZSBzYW1lIHRyYW5zYWN0aW9uIGFzCisJICogc3RhdCBkYXRhIGRlbGV0aW9uICovCisJRFFVT1RfRlJFRV9JTk9ERShpbm9kZSk7CisKKwlpZiAoam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KSkgeworCSAgICB1cCAoJmlub2RlLT5pX3NlbSk7CisJICAgIGdvdG8gb3V0OworCX0KKworICAgICAgICB1cCAoJmlub2RlLT5pX3NlbSk7CisKKyAgICAgICAgLyogYWxsIGl0ZW1zIG9mIGZpbGUgYXJlIGRlbGV0ZWQsIHNvIHdlIGNhbiByZW1vdmUgInNhdmUiIGxpbmsgKi8KKwlyZW1vdmVfc2F2ZV9saW5rIChpbm9kZSwgMC8qIG5vdCB0cnVuY2F0ZSAqLyk7IC8qIHdlIGNhbid0IGRvIGFueXRoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWJvdXQgYW4gZXJyb3IgaGVyZSAqLworICAgIH0gZWxzZSB7CisJLyogbm8gb2JqZWN0IGl0ZW1zIGFyZSBpbiB0aGUgdHJlZSAqLworCTsKKyAgICB9CitvdXQ6CisgICAgY2xlYXJfaW5vZGUgKGlub2RlKTsgLyogbm90ZSB0aGlzIG11c3QgZ28gYWZ0ZXIgdGhlIGpvdXJuYWxfZW5kIHRvIHByZXZlbnQgZGVhZGxvY2sgKi8KKyAgICBpbm9kZS0+aV9ibG9ja3MgPSAwOworICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Cit9CisKK3N0YXRpYyB2b2lkIF9tYWtlX2NwdV9rZXkgKHN0cnVjdCBjcHVfa2V5ICoga2V5LCBpbnQgdmVyc2lvbiwgX191MzIgZGlyaWQsIF9fdTMyIG9iamVjdGlkLCAKKwkgICAgICAgbG9mZl90IG9mZnNldCwgaW50IHR5cGUsIGludCBsZW5ndGggKQoreworICAgIGtleS0+dmVyc2lvbiA9IHZlcnNpb247CisKKyAgICBrZXktPm9uX2Rpc2tfa2V5LmtfZGlyX2lkID0gZGlyaWQ7CisgICAga2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkID0gb2JqZWN0aWQ7CisgICAgc2V0X2NwdV9rZXlfa19vZmZzZXQgKGtleSwgb2Zmc2V0KTsKKyAgICBzZXRfY3B1X2tleV9rX3R5cGUgKGtleSwgdHlwZSk7ICAKKyAgICBrZXktPmtleV9sZW5ndGggPSBsZW5ndGg7Cit9CisKKworLyogdGFrZSBiYXNlIG9mIGlub2RlX2tleSAoaXQgY29tZXMgZnJvbSBpbm9kZSBhbHdheXMpIChkaXJpZCwgb2JqZWN0aWQpIGFuZCB2ZXJzaW9uIGZyb20gYW4gaW5vZGUsIHNldAorICAgb2Zmc2V0IGFuZCB0eXBlIG9mIGtleSAqLwordm9pZCBtYWtlX2NwdV9rZXkgKHN0cnVjdCBjcHVfa2V5ICoga2V5LCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgbG9mZl90IG9mZnNldCwKKwkgICAgICBpbnQgdHlwZSwgaW50IGxlbmd0aCApCit7CisgIF9tYWtlX2NwdV9rZXkgKGtleSwgZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24gKGlub2RlKSwgbGUzMl90b19jcHUgKElOT0RFX1BLRVkgKGlub2RlKS0+a19kaXJfaWQpLAorCQkgbGUzMl90b19jcHUgKElOT0RFX1BLRVkgKGlub2RlKS0+a19vYmplY3RpZCksIAorCQkgb2Zmc2V0LCB0eXBlLCBsZW5ndGgpOworfQorCisKKy8vCisvLyB3aGVuIGtleSBpcyAwLCBkbyBub3Qgc2V0IHZlcnNpb24gYW5kIHNob3J0IGtleQorLy8KK2lubGluZSB2b2lkIG1ha2VfbGVfaXRlbV9oZWFkIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICoga2V5LAorCQkJICAgICAgIGludCB2ZXJzaW9uLAorCQkJICAgICAgIGxvZmZfdCBvZmZzZXQsIGludCB0eXBlLCBpbnQgbGVuZ3RoLCAKKwkJCSAgICAgICBpbnQgZW50cnlfY291bnQvKm9yIGloX2ZyZWVfc3BhY2UqLykKK3sKKyAgICBpZiAoa2V5KSB7CisJaWgtPmloX2tleS5rX2Rpcl9pZCA9IGNwdV90b19sZTMyIChrZXktPm9uX2Rpc2tfa2V5LmtfZGlyX2lkKTsKKwlpaC0+aWhfa2V5Lmtfb2JqZWN0aWQgPSBjcHVfdG9fbGUzMiAoa2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkKTsKKyAgICB9CisgICAgcHV0X2loX3ZlcnNpb24oIGloLCB2ZXJzaW9uICk7CisgICAgc2V0X2xlX2loX2tfb2Zmc2V0IChpaCwgb2Zmc2V0KTsKKyAgICBzZXRfbGVfaWhfa190eXBlIChpaCwgdHlwZSk7CisgICAgcHV0X2loX2l0ZW1fbGVuKCBpaCwgbGVuZ3RoICk7CisgICAgLyogICAgc2V0X2loX2ZyZWVfc3BhY2UgKGloLCAwKTsqLworICAgIC8vIGZvciBkaXJlY3RvcnkgaXRlbXMgaXQgaXMgZW50cnkgY291bnQsIGZvciBkaXJlY3RzIGFuZCBzdGF0CisgICAgLy8gZGF0YXMgLSAweGZmZmYsIGZvciBpbmRpcmVjdHMgLSAwCisgICAgcHV0X2loX2VudHJ5X2NvdW50KCBpaCwgZW50cnlfY291bnQgKTsKK30KKworLy8KKy8vIEZJWE1FOiB3ZSBtaWdodCBjYWNoZSByZWNlbnRseSBhY2Nlc3NlZCBpbmRpcmVjdCBpdGVtCisKKy8vIFVnaC4gIE5vdCB0b28gZWFnZXIgZm9yIHRoYXQuLi4uCisvLyAgSSBjdXQgdGhlIGNvZGUgdW50aWwgc3VjaCB0aW1lIGFzIEkgc2VlIGEgY29udmluY2luZyBhcmd1bWVudCAoYmVuY2htYXJrKS4KKy8vIEkgZG9uJ3Qgd2FudCBhIGJsb2F0ZWQgaW5vZGUgc3RydWN0Li4uLCBhbmQgSSBkb24ndCBsaWtlIGNvZGUgY29tcGxleGl0eS4uLi4KKworLyogY3V0dGluZyB0aGUgY29kZSBpcyBmaW5lLCBzaW5jZSBpdCByZWFsbHkgaXNuJ3QgaW4gdXNlIHlldCBhbmQgaXMgZWFzeQorKiogdG8gYWRkIGJhY2sgaW4uICBCdXQsIFZsYWRpbWlyIGhhcyBhIHJlYWxseSBnb29kIGlkZWEgaGVyZS4gIFRoaW5rCisqKiBhYm91dCB3aGF0IGhhcHBlbnMgZm9yIHJlYWRpbmcgYSBmaWxlLiAgRm9yIGVhY2ggcGFnZSwKKyoqIFRoZSBWRlMgbGF5ZXIgY2FsbHMgcmVpc2VyZnNfcmVhZHBhZ2UsIHdobyBzZWFyY2hlcyB0aGUgdHJlZSB0byBmaW5kCisqKiBhbiBpbmRpcmVjdCBpdGVtLiAgVGhpcyBpbmRpcmVjdCBpdGVtIGhhcyBYIG51bWJlciBvZiBwb2ludGVycywgd2hlcmUKKyoqIFggaXMgYSBiaWcgbnVtYmVyIGlmIHdlJ3ZlIGRvbmUgdGhlIGJsb2NrIGFsbG9jYXRpb24gcmlnaHQuICBCdXQsCisqKiB3ZSBvbmx5IHVzZSBvbmUgb3IgdHdvIG9mIHRoZXNlIHBvaW50ZXJzIGR1cmluZyBlYWNoIGNhbGwgdG8gcmVhZHBhZ2UsCisqKiBuZWVkbGVzc2x5IHJlc2VhcmNoaW5nIGFnYWluIGxhdGVyIG9uLgorKioKKyoqIFRoZSBzaXplIG9mIHRoZSBjYWNoZSBjb3VsZCBiZSBkeW5hbWljIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBmaWxlLgorKioKKyoqIEknZCBhbHNvIGxpa2UgdG8gc2VlIHVzIGNhY2hlIHRoZSBsb2NhdGlvbiB0aGUgc3RhdCBkYXRhIGl0ZW0sIHNpbmNlCisqKiB3ZSBhcmUgbmVlZGxlc3NseSByZXNlYXJjaGluZyBmb3IgdGhhdCBmcmVxdWVudGx5LgorKioKKyoqIC0tY2hyaXMKKyovCisKKy8qIElmIHRoaXMgcGFnZSBoYXMgYSBmaWxlIHRhaWwgaW4gaXQsIGFuZAorKiogaXQgd2FzIHJlYWQgaW4gYnkgZ2V0X2Jsb2NrX2NyZWF0ZV8wLCB0aGUgcGFnZSBkYXRhIGlzIHZhbGlkLAorKiogYnV0IHRhaWwgaXMgc3RpbGwgc2l0dGluZyBpbiBhIGRpcmVjdCBpdGVtLCBhbmQgd2UgY2FuJ3Qgd3JpdGUgdG8KKyoqIGl0LiAgU28sIGxvb2sgdGhyb3VnaCB0aGlzIHBhZ2UsIGFuZCBjaGVjayBhbGwgdGhlIG1hcHBlZCBidWZmZXJzCisqKiB0byBtYWtlIHN1cmUgdGhleSBoYXZlIHZhbGlkIGJsb2NrIG51bWJlcnMuICBBbnkgdGhhdCBkb24ndCBuZWVkCisqKiB0byBiZSB1bm1hcHBlZCwgc28gdGhhdCBibG9ja19wcmVwYXJlX3dyaXRlIHdpbGwgY29ycmVjdGx5IGNhbGwKKyoqIHJlaXNlcmZzX2dldF9ibG9jayB0byBjb252ZXJ0IHRoZSB0YWlsIGludG8gYW4gdW5mb3JtYXR0ZWQgbm9kZQorKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmaXhfdGFpbF9wYWdlX2Zvcl93cml0aW5nKHN0cnVjdCBwYWdlICpwYWdlKSB7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkLCAqbmV4dCwgKmJoIDsKKworICAgIGlmIChwYWdlICYmIHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKKwloZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpIDsKKwliaCA9IGhlYWQgOworCWRvIHsKKwkgICAgbmV4dCA9IGJoLT5iX3RoaXNfcGFnZSA7CisJICAgIGlmIChidWZmZXJfbWFwcGVkKGJoKSAmJiBiaC0+Yl9ibG9ja25yID09IDApIHsKKwkgICAgICAgIHJlaXNlcmZzX3VubWFwX2J1ZmZlcihiaCkgOworCSAgICB9CisJICAgIGJoID0gbmV4dCA7CisJfSB3aGlsZSAoYmggIT0gaGVhZCkgOworICAgIH0KK30KKworLyogcmVpc2VyZnNfZ2V0X2Jsb2NrIGRvZXMgbm90IG5lZWQgdG8gYWxsb2NhdGUgYSBibG9jayBvbmx5IGlmIGl0IGhhcyBiZWVuCisgICBkb25lIGFscmVhZHkgb3Igbm9uLWhvbGUgcG9zaXRpb24gaGFzIGJlZW4gZm91bmQgaW4gdGhlIGluZGlyZWN0IGl0ZW0gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGFsbG9jYXRpb25fbmVlZGVkIChpbnQgcmV0dmFsLCBiX2Jsb2NrbnJfdCBhbGxvY2F0ZWQsIAorCQkJCSAgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloLAorCQkJCSAgICAgX191MzIgKiBpdGVtLCBpbnQgcG9zX2luX2l0ZW0pCit7CisgIGlmIChhbGxvY2F0ZWQpCisJIHJldHVybiAwOworICBpZiAocmV0dmFsID09IFBPU0lUSU9OX0ZPVU5EICYmIGlzX2luZGlyZWN0X2xlX2loIChpaCkgJiYgCisgICAgICBnZXRfYmxvY2tfbnVtKGl0ZW0sIHBvc19pbl9pdGVtKSkKKwkgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBpbmRpcmVjdF9pdGVtX2ZvdW5kIChpbnQgcmV0dmFsLCBzdHJ1Y3QgaXRlbV9oZWFkICogaWgpCit7CisgIHJldHVybiAocmV0dmFsID09IFBPU0lUSU9OX0ZPVU5EKSAmJiBpc19pbmRpcmVjdF9sZV9paCAoaWgpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYmxvY2tfZGV2X21hcHBlZCAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIAorCQkJCQkgYl9ibG9ja25yX3QgYmxvY2ssIHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCW1hcF9iaChiaCwgaW5vZGUtPmlfc2IsIGJsb2NrKTsKK30KKworCisvLworLy8gZmlsZXMgd2hpY2ggd2VyZSBjcmVhdGVkIGluIHRoZSBlYXJsaWVyIHZlcnNpb24gY2FuIG5vdCBiZSBsb25nZXIsCisvLyB0aGFuIDIgZ2IKKy8vCitzdGF0aWMgaW50IGZpbGVfY2FwYWJsZSAoc3RydWN0IGlub2RlICogaW5vZGUsIGxvbmcgYmxvY2spCit7CisgICAgaWYgKGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSkgIT0gS0VZX0ZPUk1BVF8zXzUgfHwgLy8gaXQgaXMgbmV3IGZpbGUuCisJYmxvY2sgPCAoMSA8PCAoMzEgLSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cykpKSAvLyBvbGQgZmlsZSwgYnV0ICdibG9jaycgaXMgaW5zaWRlIG9mIDJnYgorCXJldHVybiAxOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qc3RhdGljKi8gaW50IHJlc3RhcnRfdHJhbnNhY3Rpb24oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkJc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhdGggKnBhdGgpIHsKKyAgc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gdGgtPnRfc3VwZXIgOworICBpbnQgbGVuID0gdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCA7CisgIGludCBlcnI7CisKKyAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworICBCVUdfT04gKCF0aC0+dF9yZWZjb3VudCk7CisKKyAgLyogd2UgY2Fubm90IHJlc3RhcnQgd2hpbGUgbmVzdGVkICovCisgIGlmICh0aC0+dF9yZWZjb3VudCA+IDEpIHsKKyAgICAgIHJldHVybiAwICA7CisgIH0KKyAgcGF0aHJlbHNlKHBhdGgpIDsKKyAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSkgOworICBlcnIgPSBqb3VybmFsX2VuZCh0aCwgcywgbGVuKSA7CisgIGlmICghZXJyKSB7CisgICAgICBlcnIgPSBqb3VybmFsX2JlZ2luKHRoLCBzLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDYpIDsKKyAgICAgIGlmICghZXJyKQorICAgICAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKKyAgfQorICByZXR1cm4gZXJyOworfQorCisvLyBpdCBpcyBjYWxsZWQgYnkgZ2V0X2Jsb2NrIHdoZW4gY3JlYXRlID09IDAuIFJldHVybnMgYmxvY2sgbnVtYmVyCisvLyBmb3IgJ2Jsb2NrJy10aCBsb2dpY2FsIGJsb2NrIG9mIGZpbGUuIFdoZW4gaXQgaGl0cyBkaXJlY3QgaXRlbSBpdAorLy8gcmV0dXJucyAwIChiZWluZyBjYWxsZWQgZnJvbSBibWFwKSBvciByZWFkIGRpcmVjdCBpdGVtIGludG8gcGllY2UKKy8vIG9mIHBhZ2UgKGJoX3Jlc3VsdCkKKworLy8gUGxlYXNlIGltcHJvdmUgdGhlIGVuZ2xpc2gvY2xhcml0eSBpbiB0aGUgY29tbWVudCBhYm92ZSwgYXMgaXQgaXMKKy8vIGhhcmQgdG8gdW5kZXJzdGFuZC4KKworc3RhdGljIGludCBfZ2V0X2Jsb2NrX2NyZWF0ZV8wIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgbG9uZyBibG9jaywKKwkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmhfcmVzdWx0LAorCQkJCSBpbnQgYXJncykKK3sKKyAgICBJTklUSUFMSVpFX1BBVEggKHBhdGgpOworICAgIHN0cnVjdCBjcHVfa2V5IGtleTsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIHRtcF9paDsKKyAgICBpbnQgZnNfZ2VuIDsKKyAgICBpbnQgYmxvY2tucjsKKyAgICBjaGFyICogcCA9IE5VTEw7CisgICAgaW50IGNoYXJzOworICAgIGludCByZXQgOworICAgIGludCBkb25lID0gMCA7CisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQgOworCisgICAgLy8gcHJlcGFyZSB0aGUga2V5IHRvIGxvb2sgZm9yIHRoZSAnYmxvY2snLXRoIGJsb2NrIG9mIGZpbGUKKyAgICBtYWtlX2NwdV9rZXkgKCZrZXksIGlub2RlLAorCQkgIChsb2ZmX3QpYmxvY2sgKiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgKyAxLCBUWVBFX0FOWSwgMyk7CisKK3Jlc2VhcmNoOgorICAgIGlmIChzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleSAoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKSAhPSBQT1NJVElPTl9GT1VORCkgeworCXBhdGhyZWxzZSAoJnBhdGgpOworICAgICAgICBpZiAocCkKKyAgICAgICAgICAgIGt1bm1hcChiaF9yZXN1bHQtPmJfcGFnZSkgOworCS8vIFdlIGRvIG5vdCByZXR1cm4gLUVOT0VOVCBpZiB0aGVyZSBpcyBhIGhvbGUgYnV0IHBhZ2UgaXMgdXB0b2RhdGUsIGJlY2F1c2UgaXQgbWVhbnMKKwkvLyBUaGF0IHRoZXJlIGlzIHNvbWUgTU1BUEVEIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGl0IHRoYXQgaXMgeWV0IHRvIGJlIHdyaXR0ZW4gdG8gZGlzay4KKwlpZiAoKGFyZ3MgJiBHRVRfQkxPQ0tfTk9fSE9MRSkgJiYgIVBhZ2VVcHRvZGF0ZShiaF9yZXN1bHQtPmJfcGFnZSkgKSB7CisJICAgIHJldHVybiAtRU5PRU5UIDsKKwl9CisgICAgICAgIHJldHVybiAwIDsKKyAgICB9CisgICAgCisgICAgLy8KKyAgICBiaCA9IGdldF9sYXN0X2JoICgmcGF0aCk7CisgICAgaWggPSBnZXRfaWggKCZwYXRoKTsKKyAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKGloKSkgeworCV9fdTMyICogaW5kX2l0ZW0gPSAoX191MzIgKilCX0lfUElURU0gKGJoLCBpaCk7CisJCisJLyogRklYTUU6IGhlcmUgd2UgY291bGQgY2FjaGUgaW5kaXJlY3QgaXRlbSBvciBwYXJ0IG9mIGl0IGluCisJICAgdGhlIGlub2RlIHRvIGF2b2lkIHNlYXJjaF9ieV9rZXkgaW4gY2FzZSBvZiBzdWJzZXF1ZW50CisJICAgYWNjZXNzIHRvIGZpbGUgKi8KKwlibG9ja25yID0gZ2V0X2Jsb2NrX251bShpbmRfaXRlbSwgcGF0aC5wb3NfaW5faXRlbSkgOworCXJldCA9IDAgOworCWlmIChibG9ja25yKSB7CisJICAgIG1hcF9iaChiaF9yZXN1bHQsIGlub2RlLT5pX3NiLCBibG9ja25yKTsKKwkgICAgaWYgKHBhdGgucG9zX2luX2l0ZW0gPT0gKChpaF9pdGVtX2xlbihpaCkgLyBVTkZNX1BfU0laRSkgLSAxKSkgeworCQlzZXRfYnVmZmVyX2JvdW5kYXJ5KGJoX3Jlc3VsdCk7CisJICAgIH0KKwl9IGVsc2UgCisJICAgIC8vIFdlIGRvIG5vdCByZXR1cm4gLUVOT0VOVCBpZiB0aGVyZSBpcyBhIGhvbGUgYnV0IHBhZ2UgaXMgdXB0b2RhdGUsIGJlY2F1c2UgaXQgbWVhbnMKKwkgICAgLy8gVGhhdCB0aGVyZSBpcyBzb21lIE1NQVBFRCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBpdCB0aGF0IGlzIHlldCB0byAgYmUgd3JpdHRlbiB0byBkaXNrLgorCSAgICBpZiAoKGFyZ3MgJiBHRVRfQkxPQ0tfTk9fSE9MRSkgJiYgIVBhZ2VVcHRvZGF0ZShiaF9yZXN1bHQtPmJfcGFnZSkgKSB7CisJICAgIHJldCA9IC1FTk9FTlQgOworCSAgICB9CisKKwlwYXRocmVsc2UgKCZwYXRoKTsKKyAgICAgICAgaWYgKHApCisgICAgICAgICAgICBrdW5tYXAoYmhfcmVzdWx0LT5iX3BhZ2UpIDsKKwlyZXR1cm4gcmV0IDsKKyAgICB9CisKKyAgICAvLyByZXF1ZXN0ZWQgZGF0YSBhcmUgaW4gZGlyZWN0IGl0ZW0ocykKKyAgICBpZiAoIShhcmdzICYgR0VUX0JMT0NLX1JFQURfRElSRUNUKSkgeworCS8vIHdlIGFyZSBjYWxsZWQgYnkgYm1hcC4gRklYTUU6IHdlIGNhbiBub3QgbWFwIGJsb2NrIG9mIGZpbGUKKwkvLyB3aGVuIGl0IGlzIHN0b3JlZCBpbiBkaXJlY3QgaXRlbShzKQorCXBhdGhyZWxzZSAoJnBhdGgpOwkKKyAgICAgICAgaWYgKHApCisgICAgICAgICAgICBrdW5tYXAoYmhfcmVzdWx0LT5iX3BhZ2UpIDsKKwlyZXR1cm4gLUVOT0VOVDsKKyAgICB9CisKKyAgICAvKiBpZiB3ZSd2ZSBnb3QgYSBkaXJlY3QgaXRlbSwgYW5kIHRoZSBidWZmZXIgb3IgcGFnZSB3YXMgdXB0b2RhdGUsCisgICAgKiogd2UgZG9uJ3Qgd2FudCB0byBwdWxsIGRhdGEgb2ZmIGRpc2sgYWdhaW4uICBza2lwIHRvIHRoZQorICAgICoqIGVuZCwgd2hlcmUgd2UgbWFwIHRoZSBidWZmZXIgYW5kIHJldHVybgorICAgICovCisgICAgaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaF9yZXN1bHQpKSB7CisgICAgICAgIGdvdG8gZmluaXNoZWQgOworICAgIH0gZWxzZSAKKwkvKgorCSoqIGdyYWJfdGFpbF9wYWdlIGNhbiB0cmlnZ2VyIGNhbGxzIHRvIHJlaXNlcmZzX2dldF9ibG9jayBvbiB1cCB0byBkYXRlCisJKiogcGFnZXMgd2l0aG91dCBhbnkgYnVmZmVycy4gIElmIHRoZSBwYWdlIGlzIHVwIHRvIGRhdGUsIHdlIGRvbid0IHdhbnQKKwkqKiByZWFkIG9sZCBkYXRhIG9mZiBkaXNrLiAgU2V0IHRoZSB1cCB0byBkYXRlIGJpdCBvbiB0aGUgYnVmZmVyIGluc3RlYWQKKwkqKiBhbmQganVtcCB0byB0aGUgZW5kCisJKi8KKwkgICAgaWYgKCFiaF9yZXN1bHQtPmJfcGFnZSB8fCBQYWdlVXB0b2RhdGUoYmhfcmVzdWx0LT5iX3BhZ2UpKSB7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmhfcmVzdWx0KTsKKwkJZ290byBmaW5pc2hlZCA7CisgICAgfQorCisgICAgLy8gcmVhZCBmaWxlIHRhaWwgaW50byBwYXJ0IG9mIHBhZ2UKKyAgICBvZmZzZXQgPSAoY3B1X2tleV9rX29mZnNldCgma2V5KSAtIDEpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpIDsKKyAgICBmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbihpbm9kZS0+aV9zYikgOworICAgIGNvcHlfaXRlbV9oZWFkICgmdG1wX2loLCBpaCk7CisKKyAgICAvKiB3ZSBvbmx5IHdhbnQgdG8ga21hcCBpZiB3ZSBhcmUgcmVhZGluZyB0aGUgdGFpbCBpbnRvIHRoZSBwYWdlLgorICAgICoqIHRoaXMgaXMgbm90IHRoZSBjb21tb24gY2FzZSwgc28gd2UgZG9uJ3Qga21hcCB1bnRpbCB3ZSBhcmUKKyAgICAqKiBzdXJlIHdlIG5lZWQgdG8uICBCdXQsIHRoaXMgbWVhbnMgdGhlIGl0ZW0gbWlnaHQgbW92ZSBpZgorICAgICoqIGttYXAgc2NoZWR1bGVzCisgICAgKi8KKyAgICBpZiAoIXApIHsKKwlwID0gKGNoYXIgKilrbWFwKGJoX3Jlc3VsdC0+Yl9wYWdlKSA7CisJaWYgKGZzX2NoYW5nZWQgKGZzX2dlbiwgaW5vZGUtPmlfc2IpICYmIGl0ZW1fbW92ZWQgKCZ0bXBfaWgsICZwYXRoKSkgeworCSAgICBnb3RvIHJlc2VhcmNoOworCX0KKyAgICB9CisgICAgcCArPSBvZmZzZXQgOworICAgIG1lbXNldCAocCwgMCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKyAgICBkbyB7CisJaWYgKCFpc19kaXJlY3RfbGVfaWggKGloKSkgeworCSAgICBCVUcgKCk7CisgICAgICAgIH0KKwkvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgcmVhZCBtb3JlIGJ5dGVzIHRoYW4gYWN0dWFsbHkgZXhpc3QgaW4KKwkqKiB0aGUgZmlsZS4gIFRoaXMgY2FuIGhhcHBlbiBpbiBvZGQgY2FzZXMgd2hlcmUgaV9zaXplIGlzbid0CisJKiogY29ycmVjdCwgYW5kIHdoZW4gZGlyZWN0IGl0ZW0gcGFkZGluZyByZXN1bHRzIGluIGEgZmV3IAorCSoqIGV4dHJhIGJ5dGVzIGF0IHRoZSBlbmQgb2YgdGhlIGRpcmVjdCBpdGVtCisJKi8KKyAgICAgICAgaWYgKChsZV9paF9rX29mZnNldChpaCkgKyBwYXRoLnBvc19pbl9pdGVtKSA+IGlub2RlLT5pX3NpemUpCisJICAgIGJyZWFrIDsKKwlpZiAoKGxlX2loX2tfb2Zmc2V0KGloKSAtIDEgKyBpaF9pdGVtX2xlbihpaCkpID4gaW5vZGUtPmlfc2l6ZSkgeworCSAgICBjaGFycyA9IGlub2RlLT5pX3NpemUgLSAobGVfaWhfa19vZmZzZXQoaWgpIC0gMSkgLSBwYXRoLnBvc19pbl9pdGVtOworCSAgICBkb25lID0gMSA7CisJfSBlbHNlIHsKKwkgICAgY2hhcnMgPSBpaF9pdGVtX2xlbihpaCkgLSBwYXRoLnBvc19pbl9pdGVtOworCX0KKwltZW1jcHkgKHAsIEJfSV9QSVRFTSAoYmgsIGloKSArIHBhdGgucG9zX2luX2l0ZW0sIGNoYXJzKTsKKworCWlmIChkb25lKSAKKwkgICAgYnJlYWsgOworCisJcCArPSBjaGFyczsKKworCWlmIChQQVRIX0xBU1RfUE9TSVRJT04gKCZwYXRoKSAhPSAoQl9OUl9JVEVNUyAoYmgpIC0gMSkpCisJICAgIC8vIHdlIGRvbmUsIGlmIHJlYWQgZGlyZWN0IGl0ZW0gaXMgbm90IHRoZSBsYXN0IGl0ZW0gb2YKKwkgICAgLy8gbm9kZSBGSVhNRTogd2UgY291bGQgdHJ5IHRvIGNoZWNrIHJpZ2h0IGRlbGltaXRpbmcga2V5CisJICAgIC8vIHRvIHNlZSB3aGV0aGVyIGRpcmVjdCBpdGVtIGNvbnRpbnVlcyBpbiB0aGUgcmlnaHQKKwkgICAgLy8gbmVpZ2hib3Igb3IgcmVseSBvbiBpX3NpemUKKwkgICAgYnJlYWs7CisKKwkvLyB1cGRhdGUga2V5IHRvIGxvb2sgZm9yIHRoZSBuZXh0IHBpZWNlCisJc2V0X2NwdV9rZXlfa19vZmZzZXQgKCZrZXksIGNwdV9rZXlfa19vZmZzZXQgKCZrZXkpICsgY2hhcnMpOworCWlmIChzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleSAoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKSAhPSBQT1NJVElPTl9GT1VORCkKKwkgICAgLy8gd2UgcmVhZCBzb21ldGhpbmcgZnJvbSB0YWlsLCBldmVuIGlmIG5vdyB3ZSBnb3QgSU9fRVJST1IKKwkgICAgYnJlYWs7CisJYmggPSBnZXRfbGFzdF9iaCAoJnBhdGgpOworCWloID0gZ2V0X2loICgmcGF0aCk7CisgICAgfSB3aGlsZSAoMSk7CisKKyAgICBmbHVzaF9kY2FjaGVfcGFnZShiaF9yZXN1bHQtPmJfcGFnZSkgOworICAgIGt1bm1hcChiaF9yZXN1bHQtPmJfcGFnZSkgOworCitmaW5pc2hlZDoKKyAgICBwYXRocmVsc2UgKCZwYXRoKTsKKyAgICAvKiB0aGlzIGJ1ZmZlciBoYXMgdmFsaWQgZGF0YSwgYnV0IGlzbid0IHZhbGlkIGZvciBpby4gIG1hcHBpbmcgaXQgdG8KKyAgICAgKiBibG9jayAjMCB0ZWxscyB0aGUgcmVzdCBvZiByZWlzZXJmcyBpdCBqdXN0IGhhcyBhIHRhaWwgaW4gaXQKKyAgICAgKi8KKyAgICBtYXBfYmgoYmhfcmVzdWx0LCBpbm9kZS0+aV9zYiwgMCk7CisgICAgc2V0X2J1ZmZlcl91cHRvZGF0ZSAoYmhfcmVzdWx0KTsKKyAgICByZXR1cm4gMDsKK30KKworCisvLyB0aGlzIGlzIGNhbGxlZCB0byBjcmVhdGUgZmlsZSBtYXAuIFNvLCBfZ2V0X2Jsb2NrX2NyZWF0ZV8wIHdpbGwgbm90CisvLyByZWFkIGRpcmVjdCBpdGVtCitzdGF0aWMgaW50IHJlaXNlcmZzX2JtYXAgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzZWN0b3JfdCBibG9jaywKKwkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQoreworICAgIGlmICghZmlsZV9jYXBhYmxlIChpbm9kZSwgYmxvY2spKQorCXJldHVybiAtRUZCSUc7CisKKyAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKyAgICAvKiBkbyBub3QgcmVhZCB0aGUgZGlyZWN0IGl0ZW0gKi8KKyAgICBfZ2V0X2Jsb2NrX2NyZWF0ZV8wIChpbm9kZSwgYmxvY2ssIGJoX3Jlc3VsdCwgMCkgOworICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHNwZWNpYWwgdmVyc2lvbiBvZiBnZXRfYmxvY2sgdGhhdCBpcyBvbmx5IHVzZWQgYnkgZ3JhYl90YWlsX3BhZ2UgcmlnaHQKKyoqIG5vdy4gIEl0IGlzIHNlbnQgdG8gYmxvY2tfcHJlcGFyZV93cml0ZSwgYW5kIHdoZW4geW91IHRyeSB0byBnZXQgYQorKiogYmxvY2sgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlIChvciBhIGJsb2NrIGZyb20gYSBob2xlKSBpdCByZXR1cm5zCisqKiAtRU5PRU5UIGluc3RlYWQgb2YgYSB2YWxpZCBidWZmZXIuICBibG9ja19wcmVwYXJlX3dyaXRlIGV4cGVjdHMgdG8KKyoqIGJlIGFibGUgdG8gZG8gaS9vIG9uIHRoZSBidWZmZXJzIHJldHVybmVkLCB1bmxlc3MgYW4gZXJyb3IgdmFsdWUKKyoqIGlzIGFsc28gcmV0dXJuZWQuCisqKiAKKyoqIFNvLCB0aGlzIGFsbG93cyBibG9ja19wcmVwYXJlX3dyaXRlIHRvIGJlIHVzZWQgZm9yIHJlYWRpbmcgYSBzaW5nbGUgYmxvY2sKKyoqIGluIGEgcGFnZS4gIFdoZXJlIGl0IGRvZXMgbm90IHByb2R1Y2UgYSB2YWxpZCBwYWdlIGZvciBob2xlcywgb3IgcGFzdCB0aGUKKyoqIGVuZCBvZiB0aGUgZmlsZS4gIFRoaXMgdHVybnMgb3V0IHRvIGJlIGV4YWN0bHkgd2hhdCB3ZSBuZWVkIGZvciByZWFkaW5nCisqKiB0YWlscyBmb3IgY29udmVyc2lvbi4KKyoqCisqKiBUaGUgcG9pbnQgb2YgdGhlIHdyYXBwZXIgaXMgZm9yY2luZyBhIGNlcnRhaW4gdmFsdWUgZm9yIGNyZWF0ZSwgZXZlbgorKiogdGhvdWdoIHRoZSBWRlMgbGF5ZXIgaXMgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpdGggY3JlYXRlPT0xLiAgSWYgeW91IAorKiogZG9uJ3Qgd2FudCB0byBzZW5kIGNyZWF0ZSA9PSBHRVRfQkxPQ0tfTk9fSE9MRSB0byByZWlzZXJmc19nZXRfYmxvY2ssIAorKiogZG9uJ3QgdXNlIHRoaXMgZnVuY3Rpb24uCisqLworc3RhdGljIGludCByZWlzZXJmc19nZXRfYmxvY2tfY3JlYXRlXzAgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzZWN0b3JfdCBibG9jaywKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkgeworICAgIHJldHVybiByZWlzZXJmc19nZXRfYmxvY2soaW5vZGUsIGJsb2NrLCBiaF9yZXN1bHQsIEdFVF9CTE9DS19OT19IT0xFKSA7Cit9CisKKy8qIFRoaXMgaXMgc3BlY2lhbCBoZWxwZXIgZm9yIHJlaXNlcmZzX2dldF9ibG9jayBpbiBjYXNlIHdlIGFyZSBleGVjdXRpbmcKKyAgIGRpcmVjdF9JTyByZXF1ZXN0LiAqLworc3RhdGljIGludCByZWlzZXJmc19nZXRfYmxvY2tzX2RpcmVjdF9pbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgc2VjdG9yX3QgaWJsb2NrLAorCQkJCQkgdW5zaWduZWQgbG9uZyBtYXhfYmxvY2tzLAorCQkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsCisJCQkJCSBpbnQgY3JlYXRlKQoreworICAgIGludCByZXQgOworCisgICAgYmhfcmVzdWx0LT5iX3BhZ2UgPSBOVUxMOworCisgICAgLyogV2Ugc2V0IHRoZSBiX3NpemUgYmVmb3JlIHJlaXNlcmZzX2dldF9ibG9jayBjYWxsIHNpbmNlIGl0IGlzCisgICAgICAgcmVmZXJlbmNlZCBpbiBjb252ZXJ0X3RhaWxfZm9yX2hvbGUoKSB0aGF0IG1heSBiZSBjYWxsZWQgZnJvbQorICAgICAgIHJlaXNlcmZzX2dldF9ibG9jaygpICovCisgICAgYmhfcmVzdWx0LT5iX3NpemUgPSAoMSA8PCBpbm9kZS0+aV9ibGtiaXRzKTsKKworICAgIHJldCA9IHJlaXNlcmZzX2dldF9ibG9jayhpbm9kZSwgaWJsb2NrLCBiaF9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZSB8IEdFVF9CTE9DS19OT19EQU5HTEUpIDsKKyAgICBpZiAocmV0KQorICAgICAgICBnb3RvIG91dDsKKworICAgIC8qIGRvbid0IGFsbG93IGRpcmVjdCBpbyBvbnRvIHRhaWwgcGFnZXMgKi8KKyAgICBpZiAoYnVmZmVyX21hcHBlZChiaF9yZXN1bHQpICYmIGJoX3Jlc3VsdC0+Yl9ibG9ja25yID09IDApIHsKKyAgICAgICAgLyogbWFrZSBzdXJlIGZ1dHVyZSBjYWxscyB0byB0aGUgZGlyZWN0IGlvIGZ1bmNzIGZvciB0aGlzIG9mZnNldAorICAgICAgICAqKiBpbiB0aGUgZmlsZSBmYWlsIGJ5IHVubWFwcGluZyB0aGUgYnVmZmVyCisgICAgICAgICovCisgICAgICAgIGNsZWFyX2J1ZmZlcl9tYXBwZWQoYmhfcmVzdWx0KTsKKyAgICAgICAgcmV0ID0gLUVJTlZBTCA7CisgICAgfQorICAgIC8qIFBvc3NpYmxlIHVucGFja2VkIHRhaWwuIEZsdXNoIHRoZSBkYXRhIGJlZm9yZSBwYWdlcyBoYXZlCisgICAgICAgZGlzYXBwZWFyZWQgKi8KKyAgICBpZiAoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX3BhY2tfb25fY2xvc2VfbWFzaykgeworICAgICAgICBpbnQgZXJyOworICAgICAgICBsb2NrX2tlcm5lbCgpOworICAgICAgICBlcnIgPSByZWlzZXJmc19jb21taXRfZm9yX2lub2RlKGlub2RlKTsKKyAgICAgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfmlfcGFja19vbl9jbG9zZV9tYXNrOworICAgICAgICB1bmxvY2tfa2VybmVsKCk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgcmV0ID0gZXJyOworICAgIH0KK291dDoKKyAgICByZXR1cm4gcmV0IDsKK30KKworCisvKgorKiogaGVscGVyIGZ1bmN0aW9uIGZvciB3aGVuIHJlaXNlcmZzX2dldF9ibG9jayBpcyBjYWxsZWQgZm9yIGEgaG9sZQorKiogYnV0IHRoZSBmaWxlIHRhaWwgaXMgc3RpbGwgaW4gYSBkaXJlY3QgaXRlbQorKiogYmhfcmVzdWx0IGlzIHRoZSBidWZmZXIgaGVhZCBmb3IgdGhlIGhvbGUKKyoqIHRhaWxfb2Zmc2V0IGlzIHRoZSBvZmZzZXQgb2YgdGhlIHN0YXJ0IG9mIHRoZSB0YWlsIGluIHRoZSBmaWxlCisqKgorKiogVGhpcyBjYWxscyBwcmVwYXJlX3dyaXRlLCB3aGljaCB3aWxsIHN0YXJ0IGEgbmV3IHRyYW5zYWN0aW9uCisqKiB5b3Ugc2hvdWxkIG5vdCBiZSBpbiBhIHRyYW5zYWN0aW9uLCBvciBoYXZlIGFueSBwYXRocyBoZWxkIHdoZW4geW91CisqKiBjYWxsIHRoaXMuCisqLworc3RhdGljIGludCBjb252ZXJ0X3RhaWxfZm9yX2hvbGUoc3RydWN0IGlub2RlICppbm9kZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKKwkJCQkgbG9mZl90IHRhaWxfb2Zmc2V0KSB7CisgICAgdW5zaWduZWQgbG9uZyBpbmRleCA7CisgICAgdW5zaWduZWQgbG9uZyB0YWlsX2VuZCA7IAorICAgIHVuc2lnbmVkIGxvbmcgdGFpbF9zdGFydCA7CisgICAgc3RydWN0IHBhZ2UgKiB0YWlsX3BhZ2UgOworICAgIHN0cnVjdCBwYWdlICogaG9sZV9wYWdlID0gYmhfcmVzdWx0LT5iX3BhZ2UgOworICAgIGludCByZXR2YWwgPSAwIDsKKworICAgIGlmICgodGFpbF9vZmZzZXQgJiAoYmhfcmVzdWx0LT5iX3NpemUgLSAxKSkgIT0gMSkgCisgICAgICAgIHJldHVybiAtRUlPIDsKKworICAgIC8qIGFsd2F5cyB0cnkgdG8gcmVhZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBibG9jayAqLworICAgIHRhaWxfc3RhcnQgPSB0YWlsX29mZnNldCAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSA7CisgICAgdGFpbF9lbmQgPSAodGFpbF9zdGFydCB8IChiaF9yZXN1bHQtPmJfc2l6ZSAtIDEpKSArIDEgOworCisgICAgaW5kZXggPSB0YWlsX29mZnNldCA+PiBQQUdFX0NBQ0hFX1NISUZUIDsKKyAgICAvKiBob2xlX3BhZ2UgY2FuIGJlIHplcm8gaW4gY2FzZSBvZiBkaXJlY3RfaW8sIHdlIGFyZSBzdXJlCisgICAgICAgdGhhdCB3ZSBjYW5ub3QgZ2V0IGhlcmUgaWYgd2Ugd3JpdGUgd2l0aCBPX0RJUkVDVCBpbnRvCisgICAgICAgdGFpbCBwYWdlICovCisgICAgaWYgKCFob2xlX3BhZ2UgfHwgaW5kZXggIT0gaG9sZV9wYWdlLT5pbmRleCkgeworCXRhaWxfcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbmRleCkgOworCXJldHZhbCA9IC1FTk9NRU07CisJaWYgKCF0YWlsX3BhZ2UpIHsKKwkgICAgZ290byBvdXQgOworCX0KKyAgICB9IGVsc2UgeworICAgICAgICB0YWlsX3BhZ2UgPSBob2xlX3BhZ2UgOworICAgIH0KKworICAgIC8qIHdlIGRvbid0IGhhdmUgdG8gbWFrZSBzdXJlIHRoZSBjb252ZXJzaW9uIGRpZCBub3QgaGFwcGVuIHdoaWxlCisgICAgKiogd2Ugd2VyZSBsb2NraW5nIHRoZSBwYWdlIGJlY2F1c2UgYW55b25lIHRoYXQgY291bGQgY29udmVydAorICAgICoqIG11c3QgZmlyc3QgdGFrZSBpX3NlbS4KKyAgICAqKgorICAgICoqIFdlIG11c3QgZml4IHRoZSB0YWlsIHBhZ2UgZm9yIHdyaXRpbmcgYmVjYXVzZSBpdCBtaWdodCBoYXZlIGJ1ZmZlcnMKKyAgICAqKiB0aGF0IGFyZSBtYXBwZWQsIGJ1dCBoYXZlIGEgYmxvY2sgbnVtYmVyIG9mIDAuICBUaGlzIGluZGljYXRlcyB0YWlsCisgICAgKiogZGF0YSB0aGF0IGhhcyBiZWVuIHJlYWQgZGlyZWN0bHkgaW50byB0aGUgcGFnZSwgYW5kIGJsb2NrX3ByZXBhcmVfd3JpdGUKKyAgICAqKiB3b24ndCB0cmlnZ2VyIGEgZ2V0X2Jsb2NrIGluIHRoaXMgY2FzZS4KKyAgICAqLworICAgIGZpeF90YWlsX3BhZ2VfZm9yX3dyaXRpbmcodGFpbF9wYWdlKSA7CisgICAgcmV0dmFsID0gcmVpc2VyZnNfcHJlcGFyZV93cml0ZShOVUxMLCB0YWlsX3BhZ2UsIHRhaWxfc3RhcnQsIHRhaWxfZW5kKTsKKyAgICBpZiAocmV0dmFsKQorICAgICAgICBnb3RvIHVubG9jayA7CisKKyAgICAvKiB0YWlsIGNvbnZlcnNpb24gbWlnaHQgY2hhbmdlIHRoZSBkYXRhIGluIHRoZSBwYWdlICovCisgICAgZmx1c2hfZGNhY2hlX3BhZ2UodGFpbF9wYWdlKSA7CisKKyAgICByZXR2YWwgPSByZWlzZXJmc19jb21taXRfd3JpdGUoTlVMTCwgdGFpbF9wYWdlLCB0YWlsX3N0YXJ0LCB0YWlsX2VuZCkgOworCit1bmxvY2s6CisgICAgaWYgKHRhaWxfcGFnZSAhPSBob2xlX3BhZ2UpIHsKKyAgICAgICAgdW5sb2NrX3BhZ2UodGFpbF9wYWdlKSA7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHRhaWxfcGFnZSkgOworICAgIH0KK291dDoKKyAgICByZXR1cm4gcmV0dmFsIDsKK30KKworc3RhdGljIGlubGluZSBpbnQgX2FsbG9jYXRlX2Jsb2NrKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgbG9uZyBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIAorCQkJICAgYl9ibG9ja25yX3QgKmFsbG9jYXRlZF9ibG9ja19uciwgCisJCQkgICBzdHJ1Y3QgcGF0aCAqIHBhdGgsCisJCQkgICBpbnQgZmxhZ3MpIHsKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisgIAorI2lmZGVmIFJFSVNFUkZTX1BSRUFMTE9DQVRFCisgICAgaWYgKCEoZmxhZ3MgJiBHRVRfQkxPQ0tfTk9fSVNFTSkpIHsKKwlyZXR1cm4gcmVpc2VyZnNfbmV3X3VuZl9ibG9ja25yczIodGgsIGlub2RlLCBhbGxvY2F0ZWRfYmxvY2tfbnIsIHBhdGgsIGJsb2NrKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gcmVpc2VyZnNfbmV3X3VuZl9ibG9ja25ycyAodGgsIGlub2RlLCBhbGxvY2F0ZWRfYmxvY2tfbnIsIHBhdGgsIGJsb2NrKTsKK30KKworaW50IHJlaXNlcmZzX2dldF9ibG9jayAoc3RydWN0IGlub2RlICogaW5vZGUsIHNlY3Rvcl90IGJsb2NrLAorCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQoreworICAgIGludCByZXBlYXQsIHJldHZhbCA9IDA7CisgICAgYl9ibG9ja25yX3QgYWxsb2NhdGVkX2Jsb2NrX25yID0gMDsvLyBiX2Jsb2NrbnJfdCBpcyAodW5zaWduZWQpIDMyIGJpdCBpbnQKKyAgICBJTklUSUFMSVpFX1BBVEgocGF0aCk7CisgICAgaW50IHBvc19pbl9pdGVtOworICAgIHN0cnVjdCBjcHVfa2V5IGtleTsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgKiB1bmJoID0gTlVMTDsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIHRtcF9paDsKKyAgICBfX3UzMiAqIGl0ZW07CisgICAgaW50IGRvbmU7CisgICAgaW50IGZzX2dlbjsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCA9IE5VTEw7CisgICAgLyogc3BhY2UgcmVzZXJ2ZWQgaW4gdHJhbnNhY3Rpb24gYmF0Y2g6IAorICAgICAgICAuIDMgYmFsYW5jaW5ncyBpbiBkaXJlY3QtPmluZGlyZWN0IGNvbnZlcnNpb24KKyAgICAgICAgLiAxIGJsb2NrIGludm9sdmVkIGludG8gcmVpc2VyZnNfdXBkYXRlX3NkKCkKKyAgICAgICBYWFggaW4gcHJhY3RpY2FsbHkgaW1wb3NzaWJsZSB3b3JzdCBjYXNlIGRpcmVjdDJpbmRpcmVjdCgpCisgICAgICAgY2FuIGluY3VyIChtdWNoKSBtb3JlIHRoYW4gMyBiYWxhbmNpbmdzLgorICAgICAgIHF1b3RhIHVwZGF0ZSBmb3IgdXNlciwgZ3JvdXAgKi8KKyAgICBpbnQgamJlZ2luX2NvdW50ID0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAzICsgMSArIDIgKiBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1M7CisgICAgaW50IHZlcnNpb247CisgICAgaW50IGRhbmdsZSA9IDE7CisgICAgbG9mZl90IG5ld19vZmZzZXQgPSAoKChsb2ZmX3QpYmxvY2spIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSArIDEgOworCisJCQkJLyogYmFkLi4uLiAqLworICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworICAgIHZlcnNpb24gPSBnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbiAoaW5vZGUpOworCisgICAgaWYgKGJsb2NrIDwgMCkgeworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJcmV0dXJuIC1FSU87CisgICAgfQorCisgICAgaWYgKCFmaWxlX2NhcGFibGUgKGlub2RlLCBibG9jaykpIHsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCXJldHVybiAtRUZCSUc7CisgICAgfQorCisgICAgLyogaWYgIWNyZWF0ZSwgd2UgYXJlbid0IGNoYW5naW5nIHRoZSBGUywgc28gd2UgZG9uJ3QgbmVlZCB0bworICAgICoqIGxvZyBhbnl0aGluZywgc28gd2UgZG9uJ3QgbmVlZCB0byBzdGFydCBhIHRyYW5zYWN0aW9uCisgICAgKi8KKyAgICBpZiAoIShjcmVhdGUgJiBHRVRfQkxPQ0tfQ1JFQVRFKSkgeworCWludCByZXQgOworCS8qIGZpbmQgbnVtYmVyIG9mIGJsb2NrLXRoIGxvZ2ljYWwgYmxvY2sgb2YgdGhlIGZpbGUgKi8KKwlyZXQgPSBfZ2V0X2Jsb2NrX2NyZWF0ZV8wIChpbm9kZSwgYmxvY2ssIGJoX3Jlc3VsdCwgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlIHwgR0VUX0JMT0NLX1JFQURfRElSRUNUKSA7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwlyZXR1cm4gcmV0OworICAgIH0KKyAgICAvKgorICAgICAqIGlmIHdlJ3JlIGFscmVhZHkgaW4gYSB0cmFuc2FjdGlvbiwgbWFrZSBzdXJlIHRvIGNsb3NlCisgICAgICogYW55IG5ldyB0cmFuc2FjdGlvbnMgd2Ugc3RhcnQgaW4gdGhpcyBmdW5jCisgICAgICovCisgICAgaWYgKChjcmVhdGUgJiBHRVRfQkxPQ0tfTk9fREFOR0xFKSB8fAorICAgICAgICByZWlzZXJmc190cmFuc2FjdGlvbl9ydW5uaW5nKGlub2RlLT5pX3NiKSkKKyAgICAgICAgZGFuZ2xlID0gMDsKKworICAgIC8qIElmIGZpbGUgaXMgb2Ygc3VjaCBhIHNpemUsIHRoYXQgaXQgbWlnaHQgaGF2ZSBhIHRhaWwgYW5kIHRhaWxzIGFyZSBlbmFibGVkCisgICAgKiogd2Ugc2hvdWxkIG1hcmsgaXQgYXMgcG9zc2libHkgbmVlZGluZyB0YWlsIHBhY2tpbmcgb24gY2xvc2UKKyAgICAqLworICAgIGlmICggKGhhdmVfbGFyZ2VfdGFpbHMgKGlub2RlLT5pX3NiKSAmJiBpbm9kZS0+aV9zaXplIDwgaV9ibG9ja19zaXplIChpbm9kZSkqNCkgfHwKKwkgKGhhdmVfc21hbGxfdGFpbHMgKGlub2RlLT5pX3NiKSAmJiBpbm9kZS0+aV9zaXplIDwgaV9ibG9ja19zaXplKGlub2RlKSkgKQorCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfcGFja19vbl9jbG9zZV9tYXNrIDsKKworICAgIC8qIHNldCB0aGUga2V5IG9mIHRoZSBmaXJzdCBieXRlIGluIHRoZSAnYmxvY2snLXRoIGJsb2NrIG9mIGZpbGUgKi8KKyAgICBtYWtlX2NwdV9rZXkgKCZrZXksIGlub2RlLCBuZXdfb2Zmc2V0LAorCQkgIFRZUEVfQU5ZLCAzLyprZXkgbGVuZ3RoKi8pOworICAgIGlmICgobmV3X29mZnNldCArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4gaW5vZGUtPmlfc2l6ZSkgeworc3RhcnRfdHJhbnM6CisJdGggPSByZWlzZXJmc19wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpOworCWlmICghdGgpIHsKKwkgICAgcmV0dmFsID0gLUVOT01FTTsKKwkgICAgZ290byBmYWlsdXJlOworCX0KKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKKyAgICB9CisgcmVzZWFyY2g6CisKKyAgICByZXR2YWwgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleSAoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKyAgICBpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJcmV0dmFsID0gLUVJTzsKKwlnb3RvIGZhaWx1cmU7CisgICAgfQorCQorICAgIGJoID0gZ2V0X2xhc3RfYmggKCZwYXRoKTsKKyAgICBpaCA9IGdldF9paCAoJnBhdGgpOworICAgIGl0ZW0gPSBnZXRfaXRlbSAoJnBhdGgpOworICAgIHBvc19pbl9pdGVtID0gcGF0aC5wb3NfaW5faXRlbTsKKworICAgIGZzX2dlbiA9IGdldF9nZW5lcmF0aW9uIChpbm9kZS0+aV9zYik7CisgICAgY29weV9pdGVtX2hlYWQgKCZ0bXBfaWgsIGloKTsKKworICAgIGlmIChhbGxvY2F0aW9uX25lZWRlZCAocmV0dmFsLCBhbGxvY2F0ZWRfYmxvY2tfbnIsIGloLCBpdGVtLCBwb3NfaW5faXRlbSkpIHsKKwkvKiB3ZSBoYXZlIHRvIGFsbG9jYXRlIGJsb2NrIGZvciB0aGUgdW5mb3JtYXR0ZWQgbm9kZSAqLworCWlmICghdGgpIHsKKwkgICAgcGF0aHJlbHNlKCZwYXRoKSA7CisJICAgIGdvdG8gc3RhcnRfdHJhbnM7CisJfQorCisJcmVwZWF0ID0gX2FsbG9jYXRlX2Jsb2NrKHRoLCBibG9jaywgaW5vZGUsICZhbGxvY2F0ZWRfYmxvY2tfbnIsICZwYXRoLCBjcmVhdGUpOworCisJaWYgKHJlcGVhdCA9PSBOT19ESVNLX1NQQUNFIHx8IHJlcGVhdCA9PSBRVU9UQV9FWENFRURFRCkgeworCSAgICAvKiByZXN0YXJ0IHRoZSB0cmFuc2FjdGlvbiB0byBnaXZlIHRoZSBqb3VybmFsIGEgY2hhbmNlIHRvIGZyZWUKKwkgICAgKiogc29tZSBibG9ja3MuICByZWxlYXNlcyB0aGUgcGF0aCwgc28gd2UgaGF2ZSB0byBnbyBiYWNrIHRvCisJICAgICoqIHJlc2VhcmNoIGlmIHdlIHN1Y2NlZWQgb24gdGhlIHNlY29uZCB0cnkKKwkgICAgKi8KKwkgICAgU0JfSk9VUk5BTChpbm9kZS0+aV9zYiktPmpfbmV4dF9hc3luY19mbHVzaCA9IDE7CisJICAgIHJldHZhbCA9IHJlc3RhcnRfdHJhbnNhY3Rpb24odGgsIGlub2RlLCAmcGF0aCkgOworICAgICAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWx1cmU7CisJICAgIHJlcGVhdCA9IF9hbGxvY2F0ZV9ibG9jayh0aCwgYmxvY2ssIGlub2RlLCAmYWxsb2NhdGVkX2Jsb2NrX25yLCBOVUxMLCBjcmVhdGUpOworCisJICAgIGlmIChyZXBlYXQgIT0gTk9fRElTS19TUEFDRSAmJiByZXBlYXQgIT0gUVVPVEFfRVhDRUVERUQpIHsKKwkJZ290byByZXNlYXJjaCA7CisJICAgIH0KKwkgICAgaWYgKHJlcGVhdCA9PSBRVU9UQV9FWENFRURFRCkKKwkJcmV0dmFsID0gLUVEUVVPVDsKKwkgICAgZWxzZQorCQlyZXR2YWwgPSAtRU5PU1BDOworCSAgICBnb3RvIGZhaWx1cmU7CisJfQorCisJaWYgKGZzX2NoYW5nZWQgKGZzX2dlbiwgaW5vZGUtPmlfc2IpICYmIGl0ZW1fbW92ZWQgKCZ0bXBfaWgsICZwYXRoKSkgeworCSAgICBnb3RvIHJlc2VhcmNoOworCX0KKyAgICB9CisKKyAgICBpZiAoaW5kaXJlY3RfaXRlbV9mb3VuZCAocmV0dmFsLCBpaCkpIHsKKyAgICAgICAgYl9ibG9ja25yX3QgdW5mbV9wdHI7CisJLyogJ2Jsb2NrJy10aCBibG9jayBpcyBpbiB0aGUgZmlsZSBhbHJlYWR5ICh0aGVyZSBpcworCSAgIGNvcnJlc3BvbmRpbmcgY2VsbCBpbiBzb21lIGluZGlyZWN0IGl0ZW0pLiBCdXQgaXQgbWF5IGJlCisJICAgemVybyB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIgKGhvbGUpICovCisgICAgICAgIHVuZm1fcHRyID0gZ2V0X2Jsb2NrX251bSAoaXRlbSwgcG9zX2luX2l0ZW0pOworCWlmICh1bmZtX3B0ciA9PSAwKSB7CisJICAgIC8qIHVzZSBhbGxvY2F0ZWQgYmxvY2sgdG8gcGx1ZyB0aGUgaG9sZSAqLworCSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKGlub2RlLT5pX3NiLCBiaCwgMSkgOworCSAgICBpZiAoZnNfY2hhbmdlZCAoZnNfZ2VuLCBpbm9kZS0+aV9zYikgJiYgaXRlbV9tb3ZlZCAoJnRtcF9paCwgJnBhdGgpKSB7CisJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKGlub2RlLT5pX3NiLCBiaCkgOworCQlnb3RvIHJlc2VhcmNoOworCSAgICB9CisJICAgIHNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJICAgIGlmIChidWZmZXJfZGlydHkoYmhfcmVzdWx0KSAmJiByZWlzZXJmc19kYXRhX29yZGVyZWQoaW5vZGUtPmlfc2IpKQorCSAgICAJcmVpc2VyZnNfYWRkX29yZGVyZWRfbGlzdChpbm9kZSwgYmhfcmVzdWx0KTsKKwkgICAgcHV0X2Jsb2NrX251bShpdGVtLCBwb3NfaW5faXRlbSwgYWxsb2NhdGVkX2Jsb2NrX25yKSA7CisgICAgICAgICAgICB1bmZtX3B0ciA9IGFsbG9jYXRlZF9ibG9ja19ucjsKKwkgICAgam91cm5hbF9tYXJrX2RpcnR5ICh0aCwgaW5vZGUtPmlfc2IsIGJoKTsKKwkgICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSkgOworCX0KKwlzZXRfYmxvY2tfZGV2X21hcHBlZChiaF9yZXN1bHQsIHVuZm1fcHRyLCBpbm9kZSk7CisJcGF0aHJlbHNlICgmcGF0aCk7CisgICAgICAgIHJldHZhbCA9IDA7CisJaWYgKCFkYW5nbGUgJiYgdGgpCisJICAgIHJldHZhbCA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKKworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJIAorCS8qIHRoZSBpdGVtIHdhcyBmb3VuZCwgc28gbmV3IGJsb2NrcyB3ZXJlIG5vdCBhZGRlZCB0byB0aGUgZmlsZQorCSoqIHRoZXJlIGlzIG5vIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBpbm9kZSBpcyB1cGRhdGVkIHdpdGggdGhpcyAKKwkqKiB0cmFuc2FjdGlvbgorCSovCisJcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKyAgICBpZiAoIXRoKSB7CisJcGF0aHJlbHNlKCZwYXRoKSA7CisJZ290byBzdGFydF90cmFuczsKKyAgICB9CisKKyAgICAvKiBkZXNpcmVkIHBvc2l0aW9uIGlzIG5vdCBmb3VuZCBvciBpcyBpbiB0aGUgZGlyZWN0IGl0ZW0uIFdlIGhhdmUKKyAgICAgICB0byBhcHBlbmQgZmlsZSB3aXRoIGhvbGVzIHVwIHRvICdibG9jayctdGggYmxvY2sgY29udmVydGluZworICAgICAgIGRpcmVjdCBpdGVtcyB0byBpbmRpcmVjdCBvbmUgaWYgbmVjZXNzYXJ5ICovCisgICAgZG9uZSA9IDA7CisgICAgZG8geworCWlmIChpc19zdGF0ZGF0YV9sZV9paCAoaWgpKSB7CisJICAgIF9fdTMyIHVucCA9IDA7CisJICAgIHN0cnVjdCBjcHVfa2V5IHRtcF9rZXk7CisKKwkgICAgLyogaW5kaXJlY3QgaXRlbSBoYXMgdG8gYmUgaW5zZXJ0ZWQgKi8KKwkgICAgbWFrZV9sZV9pdGVtX2hlYWQgKCZ0bXBfaWgsICZrZXksIHZlcnNpb24sIDEsIFRZUEVfSU5ESVJFQ1QsIAorCQkJICAgICAgIFVORk1fUF9TSVpFLCAwLyogZnJlZV9zcGFjZSAqLyk7CisKKwkgICAgaWYgKGNwdV9rZXlfa19vZmZzZXQgKCZrZXkpID09IDEpIHsKKwkJLyogd2UgYXJlIGdvaW5nIHRvIGFkZCAnYmxvY2snLXRoIGJsb2NrIHRvIHRoZSBmaWxlLiBVc2UKKwkJICAgYWxsb2NhdGVkIGJsb2NrIGZvciB0aGF0ICovCisJCXVucCA9IGNwdV90b19sZTMyIChhbGxvY2F0ZWRfYmxvY2tfbnIpOworCQlzZXRfYmxvY2tfZGV2X21hcHBlZCAoYmhfcmVzdWx0LCBhbGxvY2F0ZWRfYmxvY2tfbnIsIGlub2RlKTsKKwkJc2V0X2J1ZmZlcl9uZXcoYmhfcmVzdWx0KTsKKwkJZG9uZSA9IDE7CisJICAgIH0KKwkgICAgdG1wX2tleSA9IGtleTsgLy8gOykKKwkgICAgc2V0X2NwdV9rZXlfa19vZmZzZXQgKCZ0bXBfa2V5LCAxKTsKKwkgICAgUEFUSF9MQVNUX1BPU0lUSU9OKCZwYXRoKSArKzsKKworCSAgICByZXR2YWwgPSByZWlzZXJmc19pbnNlcnRfaXRlbSAodGgsICZwYXRoLCAmdG1wX2tleSwgJnRtcF9paCwgaW5vZGUsIChjaGFyICopJnVucCk7CisJICAgIGlmIChyZXR2YWwpIHsKKwkJcmVpc2VyZnNfZnJlZV9ibG9jayAodGgsIGlub2RlLCBhbGxvY2F0ZWRfYmxvY2tfbnIsIDEpOworCQlnb3RvIGZhaWx1cmU7IC8vIHJldHZhbCA9PSAtRU5PU1BDLCAtRURRVU9UIG9yIC1FSU8gb3IgLUVFWElTVAorCSAgICB9CisJICAgIC8vbWFya190YWlsX2NvbnZlcnRlZCAoaW5vZGUpOworCX0gZWxzZSBpZiAoaXNfZGlyZWN0X2xlX2loIChpaCkpIHsKKwkgICAgLyogZGlyZWN0IGl0ZW0gaGFzIHRvIGJlIGNvbnZlcnRlZCAqLworCSAgICBsb2ZmX3QgdGFpbF9vZmZzZXQ7CisKKwkgICAgdGFpbF9vZmZzZXQgPSAoKGxlX2loX2tfb2Zmc2V0IChpaCkgLSAxKSAmIH4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpICsgMTsKKwkgICAgaWYgKHRhaWxfb2Zmc2V0ID09IGNwdV9rZXlfa19vZmZzZXQgKCZrZXkpKSB7CisJCS8qIGRpcmVjdCBpdGVtIHdlIGp1c3QgZm91bmQgZml0cyBpbnRvIGJsb2NrIHdlIGhhdmUKKyAgICAgICAgICAgICAgICAgICB0byBtYXAuIENvbnZlcnQgaXQgaW50byB1bmZvcm1hdHRlZCBub2RlOiB1c2UKKyAgICAgICAgICAgICAgICAgICBiaF9yZXN1bHQgZm9yIHRoZSBjb252ZXJzaW9uICovCisJCXNldF9ibG9ja19kZXZfbWFwcGVkIChiaF9yZXN1bHQsIGFsbG9jYXRlZF9ibG9ja19uciwgaW5vZGUpOworCQl1bmJoID0gYmhfcmVzdWx0OworCQlkb25lID0gMTsKKwkgICAgfSBlbHNlIHsKKwkJLyogd2UgaGF2ZSB0byBwYWRkIGZpbGUgdGFpbCBzdG9yZWQgaW4gZGlyZWN0IGl0ZW0ocykKKwkJICAgdXAgdG8gYmxvY2sgc2l6ZSBhbmQgY29udmVydCBpdCB0byB1bmZvcm1hdHRlZAorCQkgICBub2RlLiBGSVhNRTogdGhpcyBzaG91bGQgYWxzbyBnZXQgaW50byBwYWdlIGNhY2hlICovCisKKwkJcGF0aHJlbHNlKCZwYXRoKSA7CisJCS8qCisJCSAqIHVnbHksIGJ1dCB3ZSBjYW4gb25seSBlbmQgdGhlIHRyYW5zYWN0aW9uIGlmCisJCSAqIHdlIGFyZW4ndCBuZXN0ZWQKKwkJICovCisJCUJVR19PTiAoIXRoLT50X3JlZmNvdW50KTsKKwkJaWYgKHRoLT50X3JlZmNvdW50ID09IDEpIHsKKwkJICAgIHJldHZhbCA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKKwkJICAgIHRoID0gTlVMTDsKKwkJICAgIGlmIChyZXR2YWwpCisJCQlnb3RvIGZhaWx1cmU7CisJCX0KKworCQlyZXR2YWwgPSBjb252ZXJ0X3RhaWxfZm9yX2hvbGUoaW5vZGUsIGJoX3Jlc3VsdCwgdGFpbF9vZmZzZXQpIDsKKwkJaWYgKHJldHZhbCkgeworCQkgICAgaWYgKCByZXR2YWwgIT0gLUVOT1NQQyApCisJCQlyZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgImNsbS02MDA0OiBjb252ZXJ0IHRhaWwgZmFpbGVkIGlub2RlICVsdSwgZXJyb3IgJWQiLCBpbm9kZS0+aV9pbm8sIHJldHZhbCkgOworCQkgICAgaWYgKGFsbG9jYXRlZF9ibG9ja19ucikgeworCQkJLyogdGhlIGJpdG1hcCwgdGhlIHN1cGVyLCBhbmQgdGhlIHN0YXQgZGF0YSA9PSAzICovCisJCQlpZiAoIXRoKQorCQkJICAgIHRoID0gcmVpc2VyZnNfcGVyc2lzdGVudF90cmFuc2FjdGlvbihpbm9kZS0+aV9zYiwzKTsKKwkJCWlmICh0aCkKKwkJCSAgICByZWlzZXJmc19mcmVlX2Jsb2NrICh0aCxpbm9kZSxhbGxvY2F0ZWRfYmxvY2tfbnIsMSk7CisJCSAgICB9CisJCSAgICBnb3RvIGZhaWx1cmUgOworCQl9CisJCWdvdG8gcmVzZWFyY2ggOworCSAgICB9CisJICAgIHJldHZhbCA9IGRpcmVjdDJpbmRpcmVjdCAodGgsIGlub2RlLCAmcGF0aCwgdW5iaCwgdGFpbF9vZmZzZXQpOworCSAgICBpZiAocmV0dmFsKSB7CisJCXJlaXNlcmZzX3VubWFwX2J1ZmZlcih1bmJoKTsKKwkJcmVpc2VyZnNfZnJlZV9ibG9jayAodGgsIGlub2RlLCBhbGxvY2F0ZWRfYmxvY2tfbnIsIDEpOworCQlnb3RvIGZhaWx1cmU7CisJICAgIH0KKwkgICAgLyogaXQgaXMgaW1wb3J0YW50IHRoZSBzZXRfYnVmZmVyX3VwdG9kYXRlIGlzIGRvbmUgYWZ0ZXIKKwkgICAgKiogdGhlIGRpcmVjdDJpbmRpcmVjdC4gIFRoZSBidWZmZXIgbWlnaHQgY29udGFpbiB2YWxpZAorCSAgICAqKiBkYXRhIG5ld2VyIHRoYW4gdGhlIGRhdGEgb24gZGlzayAocmVhZCBieSByZWFkcGFnZSwgY2hhbmdlZCwKKwkgICAgKiogYW5kIHRoZW4gc2VudCBoZXJlIGJ5IHdyaXRlcGFnZSkuICBkaXJlY3QyaW5kaXJlY3QgbmVlZHMKKwkgICAgKiogdG8ga25vdyBpZiB1bmJoIHdhcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHNvIGl0IGNhbiBkZWNpZGUKKwkgICAgKiogaWYgdGhlIGRhdGEgaW4gdW5iaCBuZWVkcyB0byBiZSByZXBsYWNlZCB3aXRoIGRhdGEgZnJvbQorCSAgICAqKiB0aGUgZGlzaworCSAgICAqLworCSAgICBzZXRfYnVmZmVyX3VwdG9kYXRlICh1bmJoKTsKKworCSAgICAvKiB1bmJoLT5iX3BhZ2UgPT0gTlVMTCBpbiBjYXNlIG9mIERJUkVDVF9JTyByZXF1ZXN0LCB0aGlzIG1lYW5zCisJICAgICAgIGJ1ZmZlciB3aWxsIGRpc2FwcGVhciBzaG9ydGx5LCBzbyBpdCBzaG91bGQgbm90IGJlIGFkZGVkIHRvCisJICAgICAqLworCSAgICBpZiAoIHVuYmgtPmJfcGFnZSApIHsKKwkJLyogd2UndmUgY29udmVydGVkIHRoZSB0YWlsLCBzbyB3ZSBtdXN0CisJCSoqIGZsdXNoIHVuYmggYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBjb21taXRzCisJCSovCisJCXJlaXNlcmZzX2FkZF90YWlsX2xpc3QoaW5vZGUsIHVuYmgpIDsKKworCQkvKiBtYXJrIGl0IGRpcnR5IG5vdyB0byBwcmV2ZW50IGNvbW1pdF93cml0ZSBmcm9tIGFkZGluZworCQkqKiB0aGlzIGJ1ZmZlciB0byB0aGUgaW5vZGUncyBkaXJ0eSBidWZmZXIgbGlzdAorCQkqLworCQkvKgorCQkgKiBBS1BNOiBjaGFuZ2VkIF9fbWFya19idWZmZXJfZGlydHkgdG8gbWFya19idWZmZXJfZGlydHkoKS4KKwkJICogSXQncyBzdGlsbCBhdG9taWMsIGJ1dCBpdCBzZXRzIHRoZSBwYWdlIGRpcnR5IHRvbywKKwkJICogd2hpY2ggbWFrZXMgaXQgZWxpZ2libGUgZm9yIHdyaXRlYmFjayBhdCBhbnkgdGltZSBieSB0aGUKKwkJICogVk0gKHdoaWNoIHdhcyBhbHNvIHRoZSBjYXNlIHdpdGggX19tYXJrX2J1ZmZlcl9kaXJ0eSgpKQorCQkgKi8KKwkJbWFya19idWZmZXJfZGlydHkodW5iaCkgOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgLyogYXBwZW5kIGluZGlyZWN0IGl0ZW0gd2l0aCBob2xlcyBpZiBuZWVkZWQsIHdoZW4gYXBwZW5kaW5nCisJICAgICAgIHBvaW50ZXIgdG8gJ2Jsb2NrJy10aCBibG9jayB1c2UgYmxvY2ssIHdoaWNoIGlzIGFscmVhZHkKKwkgICAgICAgYWxsb2NhdGVkICovCisJICAgIHN0cnVjdCBjcHVfa2V5IHRtcF9rZXk7CisJICAgIHVucF90IHVuZl9zaW5nbGU9MDsgLy8gV2UgdXNlIHRoaXMgaW4gY2FzZSB3ZSBuZWVkIHRvIGFsbG9jYXRlIG9ubHkKKwkJCQkvLyBvbmUgYmxvY2sgd2hpY2ggaXMgYSBmYXN0cGF0aAorCSAgICB1bnBfdCAqdW47CisJICAgIF9fdTY0IG1heF90b19pbnNlcnQ9TUFYX0lURU1fTEVOKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkvVU5GTV9QX1NJWkU7CisJICAgIF9fdTY0IGJsb2Nrc19uZWVkZWQ7CisKKwkgICAgUkZBTFNFKCBwb3NfaW5faXRlbSAhPSBpaF9pdGVtX2xlbihpaCkgLyBVTkZNX1BfU0laRSwKKwkJICAgICJ2cy04MDQ6IGludmFsaWQgcG9zaXRpb24gZm9yIGFwcGVuZCIpOworCSAgICAvKiBpbmRpcmVjdCBpdGVtIGhhcyB0byBiZSBhcHBlbmRlZCwgc2V0IHVwIGtleSBvZiB0aGF0IHBvc2l0aW9uICovCisJICAgIG1ha2VfY3B1X2tleSAoJnRtcF9rZXksIGlub2RlLAorCQkJICBsZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sICYoaWgtPmloX2tleSkpICsgb3BfYnl0ZXNfbnVtYmVyIChpaCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKSwKKwkJCSAgLy9wb3NfaW5faXRlbSAqIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwKKwkJCSAgVFlQRV9JTkRJUkVDVCwgMyk7Ly8ga2V5IHR5cGUgaXMgdW5pbXBvcnRhbnQKKworCSAgICBibG9ja3NfbmVlZGVkID0gMSArICgoY3B1X2tleV9rX29mZnNldCAoJmtleSkgLSBjcHVfa2V5X2tfb2Zmc2V0ICgmdG1wX2tleSkpID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkgICAgUkZBTFNFKCBibG9ja3NfbmVlZGVkIDwgMCwgImdyZWVuLTgwNTogaW52YWxpZCBvZmZzZXQiKTsKKworCSAgICBpZiAoIGJsb2Nrc19uZWVkZWQgPT0gMSApIHsKKwkJdW4gPSAmdW5mX3NpbmdsZTsKKwkgICAgfSBlbHNlIHsKKwkJdW49a21hbGxvYyggbWluKGJsb2Nrc19uZWVkZWQsbWF4X3RvX2luc2VydCkqVU5GTV9QX1NJWkUsCisJCQkgICAgR0ZQX0FUT01JQyk7IC8vIFdlIG5lZWQgdG8gYXZvaWQgc2NoZWR1bGluZy4KKwkJaWYgKCAhdW4pIHsKKwkJICAgIHVuID0gJnVuZl9zaW5nbGU7CisJCSAgICBibG9ja3NfbmVlZGVkID0gMTsKKwkJICAgIG1heF90b19pbnNlcnQgPSAwOworCQl9IGVsc2UKKwkJICAgIG1lbXNldCh1biwgMCwgVU5GTV9QX1NJWkUgKiBtaW4oYmxvY2tzX25lZWRlZCxtYXhfdG9faW5zZXJ0KSk7CisJICAgIH0KKwkgICAgaWYgKCBibG9ja3NfbmVlZGVkIDw9IG1heF90b19pbnNlcnQpIHsKKwkJLyogd2UgYXJlIGdvaW5nIHRvIGFkZCB0YXJnZXQgYmxvY2sgdG8gdGhlIGZpbGUuIFVzZSBhbGxvY2F0ZWQKKwkJICAgYmxvY2sgZm9yIHRoYXQgKi8KKwkJdW5bYmxvY2tzX25lZWRlZC0xXSA9IGNwdV90b19sZTMyIChhbGxvY2F0ZWRfYmxvY2tfbnIpOworCQlzZXRfYmxvY2tfZGV2X21hcHBlZCAoYmhfcmVzdWx0LCBhbGxvY2F0ZWRfYmxvY2tfbnIsIGlub2RlKTsKKwkJc2V0X2J1ZmZlcl9uZXcoYmhfcmVzdWx0KTsKKwkJZG9uZSA9IDE7CisJICAgIH0gZWxzZSB7CisJCS8qIHBhc3RlIGhvbGUgdG8gdGhlIGluZGlyZWN0IGl0ZW0gKi8KKwkJLyogSWYga21hbGxvYyBmYWlsZWQsIG1heF90b19pbnNlcnQgYmVjb21lcyB6ZXJvIGFuZCBpdCBtZWFucyB3ZQorCQkgICBvbmx5IGhhdmUgc3BhY2UgZm9yIG9uZSBibG9jayAqLworCQlibG9ja3NfbmVlZGVkPW1heF90b19pbnNlcnQ/bWF4X3RvX2luc2VydDoxOworCSAgICB9CisJICAgIHJldHZhbCA9IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbSAodGgsICZwYXRoLCAmdG1wX2tleSwgaW5vZGUsIChjaGFyICopdW4sIFVORk1fUF9TSVpFICogYmxvY2tzX25lZWRlZCk7CisKKwkgICAgaWYgKGJsb2Nrc19uZWVkZWQgIT0gMSkKKwkJa2ZyZWUodW4pOworCisJICAgIGlmIChyZXR2YWwpIHsKKwkJcmVpc2VyZnNfZnJlZV9ibG9jayAodGgsIGlub2RlLCBhbGxvY2F0ZWRfYmxvY2tfbnIsIDEpOworCQlnb3RvIGZhaWx1cmU7CisJICAgIH0KKwkgICAgaWYgKCFkb25lKSB7CisJCS8qIFdlIG5lZWQgdG8gbWFyayBuZXcgZmlsZSBzaXplIGluIGNhc2UgdGhpcyBmdW5jdGlvbiB3aWxsIGJlCisJCSAgIGludGVycnVwdGVkL2Fib3J0ZWQgbGF0ZXIgb24uIEFuZCB3ZSBtYXkgZG8gdGhpcyBvbmx5IGZvcgorCQkgICBob2xlcy4gKi8KKwkJaW5vZGUtPmlfc2l6ZSArPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgKiBibG9ja3NfbmVlZGVkOworCSAgICB9CisJfQorCisJaWYgKGRvbmUgPT0gMSkKKwkgICAgYnJlYWs7CisKKwkvKiB0aGlzIGxvb3AgY291bGQgbG9nIG1vcmUgYmxvY2tzIHRoYW4gd2UgaGFkIG9yaWdpbmFsbHkgYXNrZWQKKwkqKiBmb3IuICBTbywgd2UgaGF2ZSB0byBhbGxvdyB0aGUgdHJhbnNhY3Rpb24gdG8gZW5kIGlmIGl0IGlzCisJKiogdG9vIGJpZyBvciB0b28gZnVsbC4gIFVwZGF0ZSB0aGUgaW5vZGUgc28gdGhpbmdzIGFyZSAKKwkqKiBjb25zaXN0ZW50IGlmIHdlIGNyYXNoIGJlZm9yZSB0aGUgZnVuY3Rpb24gcmV0dXJucworCSoqCisJKiogcmVsZWFzZSB0aGUgcGF0aCBzbyB0aGF0IGFueWJvZHkgd2FpdGluZyBvbiB0aGUgcGF0aCBiZWZvcmUKKwkqKiBlbmRpbmcgdGhlaXIgdHJhbnNhY3Rpb24gd2lsbCBiZSBhYmxlIHRvIGNvbnRpbnVlLgorCSovCisJaWYgKGpvdXJuYWxfdHJhbnNhY3Rpb25fc2hvdWxkX2VuZCh0aCwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCkpIHsKKwkgIHJldHZhbCA9IHJlc3RhcnRfdHJhbnNhY3Rpb24odGgsIGlub2RlLCAmcGF0aCkgOworCSAgaWYgKHJldHZhbCkKKwkgICAgZ290byBmYWlsdXJlOworCX0KKwkvKiBpbnNlcnRpbmcgaW5kaXJlY3QgcG9pbnRlcnMgZm9yIGEgaG9sZSBjYW4gdGFrZSBhIAorCSoqIGxvbmcgdGltZS4gIHJlc2NoZWR1bGUgaWYgbmVlZGVkCisJKi8KKwljb25kX3Jlc2NoZWQoKTsKKworCXJldHZhbCA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOworCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkgICAgcmV0dmFsID0gLUVJTzsKKwkgICAgZ290byBmYWlsdXJlOworCX0KKwlpZiAocmV0dmFsID09IFBPU0lUSU9OX0ZPVU5EKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAidnMtODI1OiByZWlzZXJmc19nZXRfYmxvY2s6ICIKKwkJCSAgICAgICIlSyBzaG91bGQgbm90IGJlIGZvdW5kIiwgJmtleSk7CisJICAgIHJldHZhbCA9IC1FRVhJU1Q7CisJICAgIGlmIChhbGxvY2F0ZWRfYmxvY2tfbnIpCisJICAgICAgICByZWlzZXJmc19mcmVlX2Jsb2NrICh0aCwgaW5vZGUsIGFsbG9jYXRlZF9ibG9ja19uciwgMSk7CisJICAgIHBhdGhyZWxzZSgmcGF0aCkgOworCSAgICBnb3RvIGZhaWx1cmU7CisJfQorCWJoID0gZ2V0X2xhc3RfYmggKCZwYXRoKTsKKwlpaCA9IGdldF9paCAoJnBhdGgpOworCWl0ZW0gPSBnZXRfaXRlbSAoJnBhdGgpOworCXBvc19pbl9pdGVtID0gcGF0aC5wb3NfaW5faXRlbTsKKyAgICB9IHdoaWxlICgxKTsKKworCisgICAgcmV0dmFsID0gMDsKKworIGZhaWx1cmU6CisgICAgaWYgKHRoICYmICghZGFuZ2xlIHx8IChyZXR2YWwgJiYgIXRoLT50X3RyYW5zX2lkKSkpIHsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgaWYgKHRoLT50X3RyYW5zX2lkKQorICAgICAgICAgICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7CisgICAgICAgIGVyciA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIHJldHZhbCA9IGVycjsKKyAgICB9CisKKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworICAgIHJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGgpIDsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CityZWlzZXJmc19yZWFkcGFnZXMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQlzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlcywgdW5zaWduZWQgbnJfcGFnZXMpCit7CisgICAgcmV0dXJuIG1wYWdlX3JlYWRwYWdlcyhtYXBwaW5nLCBwYWdlcywgbnJfcGFnZXMsIHJlaXNlcmZzX2dldF9ibG9jayk7Cit9CisKKy8qIENvbXB1dGUgcmVhbCBudW1iZXIgb2YgdXNlZCBieXRlcyBieSBmaWxlCisgKiBGb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGNhbiBnbyBhd2F5IHdoZW4gd2UnbGwgaGF2ZSBlbm91Z2ggc3BhY2UgaW4gc3RhdCBpdGVtCisgKi8KK3N0YXRpYyBpbnQgcmVhbF9zcGFjZV9kaWZmKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBzZF9zaXplKQoreworICAgIGludCBieXRlczsKKyAgICBsb2ZmX3QgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDsKKworICAgIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisgICAgICAgIHJldHVybiBzZF9zaXplIDsKKworICAgIC8qIEVuZCBvZiBmaWxlIGlzIGFsc28gaW4gZnVsbCBibG9jayB3aXRoIGluZGlyZWN0IHJlZmVyZW5jZSwgc28gcm91bmQKKyAgICAqKiB1cCB0byB0aGUgbmV4dCBibG9jay4KKyAgICAqKgorICAgICoqIHRoZXJlIGlzIGp1c3Qgbm8gd2F5IHRvIGtub3cgaWYgdGhlIHRhaWwgaXMgYWN0dWFsbHkgcGFja2VkCisgICAgKiogb24gdGhlIGZpbGUsIHNvIHdlIGhhdmUgdG8gYXNzdW1lIGl0IGlzbid0LiAgV2hlbiB3ZSBwYWNrIHRoZQorICAgICoqIHRhaWwsIHdlIGFkZCA0IGJ5dGVzIHRvIHByZXRlbmQgdGhlcmUgcmVhbGx5IGlzIGFuIHVuZm9ybWF0dGVkCisgICAgKiogbm9kZSBwb2ludGVyCisgICAgKi8KKyAgICBieXRlcyA9ICgoaW5vZGUtPmlfc2l6ZSArIChibG9ja3NpemUtMSkpID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSAqIFVORk1fUF9TSVpFICsgc2Rfc2l6ZTsKKyAgICByZXR1cm4gYnl0ZXMgOworfQorCitzdGF0aWMgaW5saW5lIGxvZmZfdCB0b19yZWFsX3VzZWRfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgdWxvbmcgYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZF9zaXplKQoreworICAgIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKyAgICAgICAgcmV0dXJuIGlub2RlLT5pX3NpemUgKyAobG9mZl90KShyZWFsX3NwYWNlX2RpZmYoaW5vZGUsIHNkX3NpemUpKSA7CisgICAgfQorICAgIHJldHVybiAoKGxvZmZfdClyZWFsX3NwYWNlX2RpZmYoaW5vZGUsIHNkX3NpemUpKSArICgoKGxvZmZfdClibG9ja3MpIDw8IDkpOworfQorCisvKiBDb21wdXRlIG51bWJlciBvZiBibG9ja3MgdXNlZCBieSBmaWxlIGluIFJlaXNlckZTIGNvdW50aW5nICovCitzdGF0aWMgaW5saW5lIHVsb25nIHRvX2Zha2VfdXNlZF9ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgaW50IHNkX3NpemUpCit7CisgICAgbG9mZl90IGJ5dGVzID0gaW5vZGVfZ2V0X2J5dGVzKGlub2RlKSA7CisgICAgbG9mZl90IHJlYWxfc3BhY2UgPSByZWFsX3NwYWNlX2RpZmYoaW5vZGUsIHNkX3NpemUpIDsKKworICAgIC8qIGtlZXBzIGZzY2sgYW5kIG5vbi1xdW90YSB2ZXJzaW9ucyBvZiByZWlzZXJmcyBoYXBweSAqLworICAgIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKyAgICAgICAgYnl0ZXMgKz0gKGxvZmZfdCk1MTEgOworICAgIH0KKworICAgIC8qIGZpbGVzIGZyb20gYmVmb3JlIHRoZSBxdW90YSBwYXRjaCBtaWdodCBpX2Jsb2NrcyBzdWNoIHRoYXQKKyAgICAqKiBieXRlcyA8IHJlYWxfc3BhY2UuICBEZWFsIHdpdGggdGhhdCBoZXJlIHRvIHByZXZlbnQgaXQgZnJvbQorICAgICoqIGdvaW5nIG5lZ2F0aXZlLgorICAgICovCisgICAgaWYgKGJ5dGVzIDwgcmVhbF9zcGFjZSkKKyAgICAgICAgcmV0dXJuIDAgOworICAgIHJldHVybiAoYnl0ZXMgLSByZWFsX3NwYWNlKSA+PiA5OworfQorCisvLworLy8gQkFEOiBuZXcgZGlyZWN0b3JpZXMgaGF2ZSBzdGF0IGRhdGEgb2YgbmV3IHR5cGUgYW5kIGFsbCBvdGhlciBpdGVtcworLy8gb2Ygb2xkIHR5cGUuIFZlcnNpb24gc3RvcmVkIGluIHRoZSBpbm9kZSBzYXlzIGFib3V0IGJvZHkgaXRlbXMsIHNvCisvLyBpbiB1cGRhdGVfc3RhdF9kYXRhIHdlIGNhbiBub3QgcmVseSBvbiBpbm9kZSwgYnV0IGhhdmUgdG8gY2hlY2sKKy8vIGl0ZW0gdmVyc2lvbiBkaXJlY3RseQorLy8KKworLy8gY2FsbGVkIGJ5IHJlYWRfbG9ja2VkX2lub2RlCitzdGF0aWMgdm9pZCBpbml0X2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IHBhdGggKiBwYXRoKQoreworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKyAgICBfX3UzMiByZGV2OworICAgIC8vaW50IHZlcnNpb24gPSBJVEVNX1ZFUlNJT05fMTsKKworICAgIGJoID0gUEFUSF9QTEFTVF9CVUZGRVIgKHBhdGgpOworICAgIGloID0gUEFUSF9QSVRFTV9IRUFEIChwYXRoKTsKKworCisgICAgY29weV9rZXkgKElOT0RFX1BLRVkgKGlub2RlKSwgJihpaC0+aWhfa2V5KSk7CisgICAgaW5vZGUtPmlfYmxrc2l6ZSA9IHJlaXNlcmZzX2RlZmF1bHRfaW9fc2l6ZTsKKworICAgIElOSVRfTElTVF9IRUFEKCYoUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfbGlzdCApKTsKKyAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyA9IDA7CisgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfYmxvY2sgPSAwOworICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50ID0gMDsKKyAgICBSRUlTRVJGU19JKGlub2RlKS0+aV90cmFuc19pZCA9IDA7CisgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfamwgPSBOVUxMOworICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9hY2Nlc3MgPSBOVUxMOworICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9kZWZhdWx0ID0gTlVMTDsKKyAgICBpbml0X3J3c2VtICgmUkVJU0VSRlNfSShpbm9kZSktPnhhdHRyX3NlbSk7CisKKyAgICBpZiAoc3RhdF9kYXRhX3YxIChpaCkpIHsKKwlzdHJ1Y3Qgc3RhdF9kYXRhX3YxICogc2QgPSAoc3RydWN0IHN0YXRfZGF0YV92MSAqKUJfSV9QSVRFTSAoYmgsIGloKTsKKwl1bnNpZ25lZCBsb25nIGJsb2NrczsKKworCXNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSwgS0VZX0ZPUk1BVF8zXzUpOworICAgICAgICBzZXRfaW5vZGVfc2RfdmVyc2lvbiAoaW5vZGUsIFNUQVRfREFUQV9WMSk7CisJaW5vZGUtPmlfbW9kZSAgPSBzZF92MV9tb2RlKHNkKTsKKwlpbm9kZS0+aV9ubGluayA9IHNkX3YxX25saW5rKHNkKTsKKwlpbm9kZS0+aV91aWQgICA9IHNkX3YxX3VpZChzZCk7CisJaW5vZGUtPmlfZ2lkICAgPSBzZF92MV9naWQoc2QpOworCWlub2RlLT5pX3NpemUgID0gc2RfdjFfc2l6ZShzZCk7CisJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gc2RfdjFfYXRpbWUoc2QpOworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IHNkX3YxX210aW1lKHNkKTsKKwlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBzZF92MV9jdGltZShzZCk7CisJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7CisJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7CisJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IDA7CisKKwlpbm9kZS0+aV9ibG9ja3MgPSBzZF92MV9ibG9ja3Moc2QpOworCWlub2RlLT5pX2dlbmVyYXRpb24gPSBsZTMyX3RvX2NwdSAoSU5PREVfUEtFWSAoaW5vZGUpLT5rX2Rpcl9pZCk7CisJYmxvY2tzID0gKGlub2RlLT5pX3NpemUgKyA1MTEpID4+IDk7CisJYmxvY2tzID0gX1JPVU5EX1VQIChibG9ja3MsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA+PiA5KTsKKwlpZiAoaW5vZGUtPmlfYmxvY2tzID4gYmxvY2tzKSB7CisJICAgIC8vIHRoZXJlIHdhcyBhIGJ1ZyBpbiA8PTMuNS4yMyB3aGVuIGlfYmxvY2tzIGNvdWxkIHRha2UgbmVnYXRpdmUKKwkgICAgLy8gdmFsdWVzLiBTdGFydGluZyBmcm9tIDMuNS4xNyB0aGlzIHZhbHVlIGNvdWxkIGV2ZW4gYmUgc3RvcmVkIGluCisJICAgIC8vIHN0YXQgZGF0YS4gRm9yIHN1Y2ggZmlsZXMgd2Ugc2V0IGlfYmxvY2tzIGJhc2VkIG9uIGZpbGUKKwkgICAgLy8gc2l6ZS4gSnVzdCAyIG5vdGVzOiB0aGlzIGNhbiBiZSB3cm9uZyBmb3Igc3BhcmNlIGZpbGVzLiBPbi1kaXNrIHZhbHVlIHdpbGwgYmUKKwkgICAgLy8gb25seSB1cGRhdGVkIGlmIGZpbGUncyBpbm9kZSB3aWxsIGV2ZXIgY2hhbmdlCisJICAgIGlub2RlLT5pX2Jsb2NrcyA9IGJsb2NrczsKKwl9CisKKyAgICAgICAgcmRldiA9IHNkX3YxX3JkZXYoc2QpOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZpcnN0X2RpcmVjdF9ieXRlID0gc2RfdjFfZmlyc3RfZGlyZWN0X2J5dGUoc2QpOworCS8qIGFuIGVhcmx5IGJ1ZyBpbiB0aGUgcXVvdGEgY29kZSBjYW4gZ2l2ZSB1cyBhbiBvZGQgbnVtYmVyIGZvciB0aGUKKwkqKiBibG9jayBjb3VudC4gIFRoaXMgaXMgaW5jb3JyZWN0LCBmaXggaXQgaGVyZS4KKwkqLworCWlmIChpbm9kZS0+aV9ibG9ja3MgJiAxKSB7CisJICAgIGlub2RlLT5pX2Jsb2NrcysrIDsKKwl9CisJaW5vZGVfc2V0X2J5dGVzKGlub2RlLCB0b19yZWFsX3VzZWRfc3BhY2UoaW5vZGUsIGlub2RlLT5pX2Jsb2NrcywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRF9WMV9TSVpFKSk7CisJLyogbm9wYWNrIGlzIGluaXRpYWxseSB6ZXJvIGZvciB2MSBvYmplY3RzLiBGb3IgdjIgb2JqZWN0cywKKwkgICBub3BhY2sgaXMgaW5pdGlhbGlzZWQgZnJvbSBzZF9hdHRycyAqLworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICY9IH5pX25vcGFja19tYXNrOworICAgIH0gZWxzZSB7CisJLy8gbmV3IHN0YXQgZGF0YSBmb3VuZCwgYnV0IG9iamVjdCBtYXkgaGF2ZSBvbGQgaXRlbXMKKwkvLyAoZGlyZWN0b3JpZXMgYW5kIHN5bWxpbmtzKQorCXN0cnVjdCBzdGF0X2RhdGEgKiBzZCA9IChzdHJ1Y3Qgc3RhdF9kYXRhICopQl9JX1BJVEVNIChiaCwgaWgpOworCisJaW5vZGUtPmlfbW9kZSAgID0gc2RfdjJfbW9kZShzZCk7CisJaW5vZGUtPmlfbmxpbmsgID0gc2RfdjJfbmxpbmsoc2QpOworCWlub2RlLT5pX3VpZCAgICA9IHNkX3YyX3VpZChzZCk7CisJaW5vZGUtPmlfc2l6ZSAgID0gc2RfdjJfc2l6ZShzZCk7CisJaW5vZGUtPmlfZ2lkICAgID0gc2RfdjJfZ2lkKHNkKTsKKwlpbm9kZS0+aV9tdGltZS50dl9zZWMgID0gc2RfdjJfbXRpbWUoc2QpOworCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IHNkX3YyX2F0aW1lKHNkKTsKKwlpbm9kZS0+aV9jdGltZS50dl9zZWMgID0gc2RfdjJfY3RpbWUoc2QpOworCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOworCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSAwOworCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAwOworCWlub2RlLT5pX2Jsb2NrcyA9IHNkX3YyX2Jsb2NrcyhzZCk7CisgICAgICAgIHJkZXYgICAgICAgICAgICA9IHNkX3YyX3JkZXYoc2QpOworCWlmKCBTX0lTQ0hSKCBpbm9kZSAtPiBpX21vZGUgKSB8fCBTX0lTQkxLKCBpbm9kZSAtPiBpX21vZGUgKSApCisJICAgIGlub2RlLT5pX2dlbmVyYXRpb24gPSBsZTMyX3RvX2NwdSAoSU5PREVfUEtFWSAoaW5vZGUpLT5rX2Rpcl9pZCk7CisJZWxzZQorICAgICAgICAgICAgaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IHNkX3YyX2dlbmVyYXRpb24oc2QpOworCisJaWYgKFNfSVNESVIgKGlub2RlLT5pX21vZGUpIHx8IFNfSVNMTksgKGlub2RlLT5pX21vZGUpKQorCSAgICBzZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbiAoaW5vZGUsIEtFWV9GT1JNQVRfM181KTsKKwllbHNlCisJICAgIHNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSwgS0VZX0ZPUk1BVF8zXzYpOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZpcnN0X2RpcmVjdF9ieXRlID0gMDsKKwlzZXRfaW5vZGVfc2RfdmVyc2lvbiAoaW5vZGUsIFNUQVRfREFUQV9WMik7CisJaW5vZGVfc2V0X2J5dGVzKGlub2RlLCB0b19yZWFsX3VzZWRfc3BhY2UoaW5vZGUsIGlub2RlLT5pX2Jsb2NrcywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRF9WMl9TSVpFKSk7CisJLyogcmVhZCBwZXJzaXN0ZW50IGlub2RlIGF0dHJpYnV0ZXMgZnJvbSBzZCBhbmQgaW5pdGFsaXNlCisJICAgZ2VuZXJpYyBpbm9kZSBmbGFncyBmcm9tIHRoZW0gKi8KKwlSRUlTRVJGU19JKGlub2RlKS0+aV9hdHRycyA9IHNkX3YyX2F0dHJzKCBzZCApOworCXNkX2F0dHJzX3RvX2lfYXR0cnMoIHNkX3YyX2F0dHJzKCBzZCApLCBpbm9kZSApOworICAgIH0KKworICAgIHBhdGhyZWxzZSAocGF0aCk7CisgICAgaWYgKFNfSVNSRUcgKGlub2RlLT5pX21vZGUpKSB7CisJaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT5pX2ZvcCA9ICZyZWlzZXJmc19maWxlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIDsKKyAgICB9IGVsc2UgaWYgKFNfSVNESVIgKGlub2RlLT5pX21vZGUpKSB7CisJaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJnJlaXNlcmZzX2Rpcl9vcGVyYXRpb25zOworICAgIH0gZWxzZSBpZiAoU19JU0xOSyAoaW5vZGUtPmlfbW9kZSkpIHsKKwlpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zOworICAgIH0gZWxzZSB7CisJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwlpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19zcGVjaWFsX2lub2RlX29wZXJhdGlvbnM7CisJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCBuZXdfZGVjb2RlX2RldihyZGV2KSk7CisgICAgfQorfQorCisKKy8vIHVwZGF0ZSBuZXcgc3RhdCBkYXRhIHdpdGggaW5vZGUgZmllbGRzCitzdGF0aWMgdm9pZCBpbm9kZTJzZCAodm9pZCAqIHNkLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgbG9mZl90IHNpemUpCit7CisgICAgc3RydWN0IHN0YXRfZGF0YSAqIHNkX3YyID0gKHN0cnVjdCBzdGF0X2RhdGEgKilzZDsKKyAgICBfX3UxNiBmbGFnczsKKworICAgIHNldF9zZF92Ml9tb2RlKHNkX3YyLCBpbm9kZS0+aV9tb2RlICk7CisgICAgc2V0X3NkX3YyX25saW5rKHNkX3YyLCBpbm9kZS0+aV9ubGluayApOworICAgIHNldF9zZF92Ml91aWQoc2RfdjIsIGlub2RlLT5pX3VpZCApOworICAgIHNldF9zZF92Ml9zaXplKHNkX3YyLCBzaXplICk7CisgICAgc2V0X3NkX3YyX2dpZChzZF92MiwgaW5vZGUtPmlfZ2lkICk7CisgICAgc2V0X3NkX3YyX210aW1lKHNkX3YyLCBpbm9kZS0+aV9tdGltZS50dl9zZWMgKTsKKyAgICBzZXRfc2RfdjJfYXRpbWUoc2RfdjIsIGlub2RlLT5pX2F0aW1lLnR2X3NlYyApOworICAgIHNldF9zZF92Ml9jdGltZShzZF92MiwgaW5vZGUtPmlfY3RpbWUudHZfc2VjICk7CisgICAgc2V0X3NkX3YyX2Jsb2NrcyhzZF92MiwgdG9fZmFrZV91c2VkX2Jsb2Nrcyhpbm9kZSwgU0RfVjJfU0laRSkpOworICAgIGlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCisJc2V0X3NkX3YyX3JkZXYoc2RfdjIsIG5ld19lbmNvZGVfZGV2KGlub2RlLT5pX3JkZXYpKTsKKyAgICBlbHNlCisJc2V0X3NkX3YyX2dlbmVyYXRpb24oc2RfdjIsIGlub2RlLT5pX2dlbmVyYXRpb24pOworICAgIGZsYWdzID0gUkVJU0VSRlNfSShpbm9kZSktPmlfYXR0cnM7CisgICAgaV9hdHRyc190b19zZF9hdHRycyggaW5vZGUsICZmbGFncyApOworICAgIHNldF9zZF92Ml9hdHRycyggc2RfdjIsIGZsYWdzICk7Cit9CisKKworLy8gdXNlZCB0byBjb3B5IGlub2RlJ3MgZmllbGRzIHRvIG9sZCBzdGF0IGRhdGEKK3N0YXRpYyB2b2lkIGlub2RlMnNkX3YxICh2b2lkICogc2QsIHN0cnVjdCBpbm9kZSAqIGlub2RlLCBsb2ZmX3Qgc2l6ZSkKK3sKKyAgICBzdHJ1Y3Qgc3RhdF9kYXRhX3YxICogc2RfdjEgPSAoc3RydWN0IHN0YXRfZGF0YV92MSAqKXNkOworCisgICAgc2V0X3NkX3YxX21vZGUoc2RfdjEsIGlub2RlLT5pX21vZGUgKTsKKyAgICBzZXRfc2RfdjFfdWlkKHNkX3YxLCBpbm9kZS0+aV91aWQgKTsKKyAgICBzZXRfc2RfdjFfZ2lkKHNkX3YxLCBpbm9kZS0+aV9naWQgKTsKKyAgICBzZXRfc2RfdjFfbmxpbmsoc2RfdjEsIGlub2RlLT5pX25saW5rICk7CisgICAgc2V0X3NkX3YxX3NpemUoc2RfdjEsIHNpemUgKTsKKyAgICBzZXRfc2RfdjFfYXRpbWUoc2RfdjEsIGlub2RlLT5pX2F0aW1lLnR2X3NlYyApOworICAgIHNldF9zZF92MV9jdGltZShzZF92MSwgaW5vZGUtPmlfY3RpbWUudHZfc2VjICk7CisgICAgc2V0X3NkX3YxX210aW1lKHNkX3YxLCBpbm9kZS0+aV9tdGltZS50dl9zZWMgKTsKKworICAgIGlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCisgICAgICAgIHNldF9zZF92MV9yZGV2KHNkX3YxLCBuZXdfZW5jb2RlX2Rldihpbm9kZS0+aV9yZGV2KSk7CisgICAgZWxzZQorICAgICAgICBzZXRfc2RfdjFfYmxvY2tzKHNkX3YxLCB0b19mYWtlX3VzZWRfYmxvY2tzKGlub2RlLCBTRF9WMV9TSVpFKSk7CisKKyAgICAvLyBTaWdoLiBpX2ZpcnN0X2RpcmVjdF9ieXRlIGlzIGJhY2sKKyAgICBzZXRfc2RfdjFfZmlyc3RfZGlyZWN0X2J5dGUoc2RfdjEsIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZpcnN0X2RpcmVjdF9ieXRlKTsKK30KKworCisvKiBOT1RFLCB5b3UgbXVzdCBwcmVwYXJlIHRoZSBidWZmZXIgaGVhZCBiZWZvcmUgc2VuZGluZyBpdCBoZXJlLAorKiogYW5kIHRoZW4gbG9nIGl0IGFmdGVyIHRoZSBjYWxsCisqLworc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRfZGF0YSAoc3RydWN0IHBhdGggKiBwYXRoLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCBzaXplKQoreworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKyAgCisgICAgYmggPSBQQVRIX1BMQVNUX0JVRkZFUiAocGF0aCk7CisgICAgaWggPSBQQVRIX1BJVEVNX0hFQUQgKHBhdGgpOworCisgICAgaWYgKCFpc19zdGF0ZGF0YV9sZV9paCAoaWgpKQorCXJlaXNlcmZzX3BhbmljIChpbm9kZS0+aV9zYiwgInZzLTEzMDY1OiB1cGRhdGVfc3RhdF9kYXRhOiBrZXkgJWssIGZvdW5kIGl0ZW0gJWgiLAorCQkJSU5PREVfUEtFWSAoaW5vZGUpLCBpaCk7CisgIAorICAgIGlmIChzdGF0X2RhdGFfdjEgKGloKSkgeworCS8vIHBhdGggcG9pbnRzIHRvIG9sZCBzdGF0IGRhdGEKKwlpbm9kZTJzZF92MSAoQl9JX1BJVEVNIChiaCwgaWgpLCBpbm9kZSwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKwlpbm9kZTJzZCAoQl9JX1BJVEVNIChiaCwgaWgpLCBpbm9kZSwgc2l6ZSk7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisKK3ZvaWQgcmVpc2VyZnNfdXBkYXRlX3NkX3NpemUgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgICAgc3RydWN0IGlub2RlICogaW5vZGUsIGxvZmZfdCBzaXplKQoreworICAgIHN0cnVjdCBjcHVfa2V5IGtleTsKKyAgICBJTklUSUFMSVpFX1BBVEgocGF0aCk7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA7CisgICAgaW50IGZzX2dlbiA7CisgICAgc3RydWN0IGl0ZW1faGVhZCAqaWgsIHRtcF9paCA7CisgICAgaW50IHJldHZhbDsKKworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKworICAgIG1ha2VfY3B1X2tleSAoJmtleSwgaW5vZGUsIFNEX09GRlNFVCwgVFlQRV9TVEFUX0RBVEEsIDMpOy8va2V5IHR5cGUgaXMgdW5pbXBvcnRhbnQKKyAgICAKKyAgICBmb3IoOzspIHsKKwlpbnQgcG9zOworCS8qIGxvb2sgZm9yIHRoZSBvYmplY3QncyBzdGF0IGRhdGEgKi8KKwlyZXR2YWwgPSBzZWFyY2hfaXRlbSAoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKwlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAidnMtMTMwNTA6IHJlaXNlcmZzX3VwZGF0ZV9zZDogIgorCQkJICAgICAgImkvbyBmYWlsdXJlIG9jY3VycmVkIHRyeWluZyB0byB1cGRhdGUgJUsgc3RhdCBkYXRhIiwKKwkJCSAgICAgICZrZXkpOworCSAgICByZXR1cm47CisJfQorCWlmIChyZXR2YWwgPT0gSVRFTV9OT1RfRk9VTkQpIHsKKwkgICAgcG9zID0gUEFUSF9MQVNUX1BPU0lUSU9OICgmcGF0aCk7CisJICAgIHBhdGhyZWxzZSgmcGF0aCkgOworCSAgICBpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCkgeworCQkvKnJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAidnMtMTMwNTA6IHJlaXNlcmZzX3VwZGF0ZV9zZDogaV9ubGluayA9PSAwLCBzdGF0IGRhdGEgbm90IGZvdW5kIik7Ki8KKwkJcmV0dXJuOworCSAgICB9CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAidnMtMTMwNjA6IHJlaXNlcmZzX3VwZGF0ZV9zZDogIgorCQkJICAgICAgInN0YXQgZGF0YSBvZiBvYmplY3QgJWsgKG5saW5rID09ICVkKSBub3QgZm91bmQgKHBvcyAlZCkiLAorCQkJICAgICAgSU5PREVfUEtFWSAoaW5vZGUpLCBpbm9kZS0+aV9ubGluaywgcG9zKTsKKwkgICAgcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCkgOworCSAgICByZXR1cm47CisJfQorCQorCS8qIHNpZ2gsIHByZXBhcmVfZm9yX2pvdXJuYWwgbWlnaHQgc2NoZWR1bGUuICBXaGVuIGl0IHNjaGVkdWxlcyB0aGUKKwkqKiBGUyBtaWdodCBjaGFuZ2UuICBXZSBoYXZlIHRvIGRldGVjdCB0aGF0LCBhbmQgbG9vcCBiYWNrIHRvIHRoZQorCSoqIHNlYXJjaCBpZiB0aGUgc3RhdCBkYXRhIGl0ZW0gaGFzIG1vdmVkCisJKi8KKwliaCA9IGdldF9sYXN0X2JoKCZwYXRoKSA7CisJaWggPSBnZXRfaWgoJnBhdGgpIDsKKwljb3B5X2l0ZW1faGVhZCAoJnRtcF9paCwgaWgpOworCWZzX2dlbiA9IGdldF9nZW5lcmF0aW9uIChpbm9kZS0+aV9zYik7CisJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChpbm9kZS0+aV9zYiwgYmgsIDEpIDsKKwlpZiAoZnNfY2hhbmdlZCAoZnNfZ2VuLCBpbm9kZS0+aV9zYikgJiYgaXRlbV9tb3ZlZCgmdG1wX2loLCAmcGF0aCkpIHsKKwkgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoaW5vZGUtPmlfc2IsIGJoKSA7CisJICAgIGNvbnRpbnVlIDsJLyogU3RhdF9kYXRhIGl0ZW0gaGFzIGJlZW4gbW92ZWQgYWZ0ZXIgc2NoZWR1bGluZy4gKi8KKwl9CisJYnJlYWs7CisgICAgfQorICAgIHVwZGF0ZV9zdGF0X2RhdGEgKCZwYXRoLCBpbm9kZSwgc2l6ZSk7CisgICAgam91cm5hbF9tYXJrX2RpcnR5KHRoLCB0aC0+dF9zdXBlciwgYmgpIDsgCisgICAgcGF0aHJlbHNlICgmcGF0aCk7CisgICAgcmV0dXJuOworfQorCisvKiByZWlzZXJmc19yZWFkX2xvY2tlZF9pbm9kZSBpcyBjYWxsZWQgdG8gcmVhZCB0aGUgaW5vZGUgb2ZmIGRpc2ssIGFuZCBpdAorKiogZG9lcyBhIG1ha2VfYmFkX2lub2RlIHdoZW4gdGhpbmdzIGdvIHdyb25nLiAgQnV0LCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorKiogYW5kIGNsZWFyIHRoZSBrZXkgaW4gdGhlIHByaXZhdGUgcG9ydGlvbiBvZiB0aGUgaW5vZGUsIG90aGVyd2lzZSBhCisqKiBjb3JyZXNwb25kaW5nIGlwdXQgbWlnaHQgdHJ5IHRvIGRlbGV0ZSB3aGF0ZXZlciBvYmplY3QgdGhlIGlub2RlIGxhc3QKKyoqIHJlcHJlc2VudGVkLgorKi8KK3N0YXRpYyB2b2lkIHJlaXNlcmZzX21ha2VfYmFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpIHsKKyAgICBtZW1zZXQoSU5PREVfUEtFWShpbm9kZSksIDAsIEtFWV9TSVpFKTsKKyAgICBtYWtlX2JhZF9pbm9kZShpbm9kZSk7Cit9CisKKy8vCisvLyBpbml0aWFsbHkgdGhpcyBmdW5jdGlvbiB3YXMgZGVyaXZlZCBmcm9tIG1pbml4IG9yIGV4dDIncyBhbmFsb2cgYW5kCisvLyBldm9sdmVkIGFzIHRoZSBwcm90b3R5cGUgZGlkCisvLworCitpbnQgcmVpc2VyZnNfaW5pdF9sb2NrZWRfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCB2b2lkICpwKQoreworICAgIHN0cnVjdCByZWlzZXJmc19pZ2V0X2FyZ3MgKmFyZ3MgPSAoc3RydWN0IHJlaXNlcmZzX2lnZXRfYXJncyAqKXAgOworICAgIGlub2RlLT5pX2lubyA9IGFyZ3MtPm9iamVjdGlkOworICAgIElOT0RFX1BLRVkoaW5vZGUpLT5rX2Rpcl9pZCA9IGNwdV90b19sZTMyKGFyZ3MtPmRpcmlkKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogbG9va3MgZm9yIHN0YXQgZGF0YSBpbiB0aGUgdHJlZSwgYW5kIGZpbGxzIHVwIHRoZSBmaWVsZHMgb2YgaW4tY29yZQorICAgaW5vZGUgc3RhdCBkYXRhIGZpZWxkcyAqLwordm9pZCByZWlzZXJmc19yZWFkX2xvY2tlZF9pbm9kZSAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCByZWlzZXJmc19pZ2V0X2FyZ3MgKmFyZ3MpCit7CisgICAgSU5JVElBTElaRV9QQVRIIChwYXRoX3RvX3NkKTsKKyAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7CisgICAgdW5zaWduZWQgbG9uZyBkaXJpbm87CisgICAgaW50IHJldHZhbDsKKworICAgIGRpcmlubyA9IGFyZ3MtPmRpcmlkIDsKKworICAgIC8qIHNldCB2ZXJzaW9uIDEsIHZlcnNpb24gMiBjb3VsZCBiZSB1c2VkIHRvbywgYmVjYXVzZSBzdGF0IGRhdGEKKyAgICAgICBrZXkgaXMgdGhlIHNhbWUgaW4gYm90aCB2ZXJzaW9ucyAqLworICAgIGtleS52ZXJzaW9uID0gS0VZX0ZPUk1BVF8zXzU7CisgICAga2V5Lm9uX2Rpc2tfa2V5LmtfZGlyX2lkID0gZGlyaW5vOworICAgIGtleS5vbl9kaXNrX2tleS5rX29iamVjdGlkID0gaW5vZGUtPmlfaW5vOworICAgIGtleS5vbl9kaXNrX2tleS51Lmtfb2Zmc2V0X3YxLmtfb2Zmc2V0ID0gU0RfT0ZGU0VUOworICAgIGtleS5vbl9kaXNrX2tleS51Lmtfb2Zmc2V0X3YxLmtfdW5pcXVlbmVzcyA9IFNEX1VOSVFVRU5FU1M7CisKKyAgICAvKiBsb29rIGZvciB0aGUgb2JqZWN0J3Mgc3RhdCBkYXRhICovCisgICAgcmV0dmFsID0gc2VhcmNoX2l0ZW0gKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aF90b19zZCk7CisgICAgaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCXJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAidnMtMTMwNzA6IHJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlOiAiCisJCQkgICJpL28gZmFpbHVyZSBvY2N1cnJlZCB0cnlpbmcgdG8gZmluZCBzdGF0IGRhdGEgb2YgJUsiLAorCQkJICAma2V5KTsKKwlyZWlzZXJmc19tYWtlX2JhZF9pbm9kZShpbm9kZSkgOworCXJldHVybjsKKyAgICB9CisgICAgaWYgKHJldHZhbCAhPSBJVEVNX0ZPVU5EKSB7CisJLyogYSBzdGFsZSBORlMgaGFuZGxlIGNhbiB0cmlnZ2VyIHRoaXMgd2l0aG91dCBpdCBiZWluZyBhbiBlcnJvciAqLworCXBhdGhyZWxzZSAoJnBhdGhfdG9fc2QpOworCXJlaXNlcmZzX21ha2VfYmFkX2lub2RlKGlub2RlKSA7CisJaW5vZGUtPmlfbmxpbmsgPSAwOworCXJldHVybjsKKyAgICB9CisKKyAgICBpbml0X2lub2RlIChpbm9kZSwgJnBhdGhfdG9fc2QpOworICAgCisgICAgLyogSXQgaXMgcG9zc2libGUgdGhhdCBrbmZzZCBpcyB0cnlpbmcgdG8gYWNjZXNzIGlub2RlIG9mIGEgZmlsZQorICAgICAgIHRoYXQgaXMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBkaXNrIGJ5IHNvbWUgb3RoZXIgdGhyZWFkLiBBcyB3ZQorICAgICAgIHVwZGF0ZSBzZCBvbiB1bmxpbmsgYWxsIHRoYXQgaXMgcmVxdWlyZWQgaXMgdG8gY2hlY2sgZm9yIG5saW5rCisgICAgICAgaGVyZS4gVGhpcyBidWcgd2FzIGZpcnN0IGZvdW5kIGJ5IFNpemlmIHdoZW4gZGVidWdnaW5nCisgICAgICAgU3F1aWRORy9CdXR0ZXJmbHksIGZvcmdvdHRlbiwgYW5kIGZvdW5kIGFnYWluIGFmdGVyIFBoaWxpcHBlCisgICAgICAgR3JhbW91bGxlIDxwaGlsaXBwZS5ncmFtb3VsbGVAbW1hbmlhLmNvbT4gcmVwcm9kdWNlZCBpdC4gCisKKyAgICAgICBNb3JlIGxvZ2ljYWwgZml4IHdvdWxkIHJlcXVpcmUgY2hhbmdlcyBpbiBmcy9pbm9kZS5jOmlwdXQoKSB0bworICAgICAgIHJlbW92ZSBpbm9kZSBmcm9tIGhhc2gtdGFibGUgX2FmdGVyXyBmcyBjbGVhbmVkIGRpc2sgc3R1ZmYgdXAgYW5kCisgICAgICAgaW4gaWdldCgpIHRvIHJldHVybiBOVUxMIGlmIElfRlJFRUlORyBpbm9kZSBpcyBmb3VuZCBpbgorICAgICAgIGhhc2gtdGFibGUuICovCisgICAgLyogQ3VycmVudGx5IHRoZXJlIGlzIG9uZSBwbGFjZSB3aGVyZSBpdCdzIG9rIHRvIG1lZXQgaW5vZGUgd2l0aAorICAgICAgIG5saW5rPT0wOiBwcm9jZXNzaW5nIG9mIG9wZW4tdW5saW5rZWQgYW5kIGhhbGYtdHJ1bmNhdGVkIGZpbGVzCisgICAgICAgZHVyaW5nIG1vdW50IChmcy9yZWlzZXJmcy9zdXBlci5jOmZpbmlzaF91bmZpbmlzaGVkKCkpLiAqLworICAgIGlmKCAoIGlub2RlIC0+IGlfbmxpbmsgPT0gMCApICYmIAorCSEgUkVJU0VSRlNfU0IoaW5vZGUgLT4gaV9zYikgLT4gc19pc191bmxpbmtlZF9vayApIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsCisJCQkgICAgICAidnMtMTMwNzU6IHJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlOiAiCisJCQkgICAgICAiZGVhZCBpbm9kZSByZWFkIGZyb20gZGlzayAlSy4gIgorCQkJICAgICAgIlRoaXMgaXMgbGlrZWx5IHRvIGJlIHJhY2Ugd2l0aCBrbmZzZC4gSWdub3JlIiwKKwkJCSAgICAgICZrZXkgKTsKKwkgICAgcmVpc2VyZnNfbWFrZV9iYWRfaW5vZGUoIGlub2RlICk7CisgICAgfQorCisgICAgcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aF90b19zZCkgOyAvKiBpbml0IGlub2RlIHNob3VsZCBiZSByZWxzaW5nICovCisKK30KKworLyoqCisgKiByZWlzZXJmc19maW5kX2FjdG9yKCkgLSAiZmluZCBhY3RvciIgcmVpc2VyZnMgc3VwcGxpZXMgdG8gaWdldDVfbG9ja2VkKCkuCisgKgorICogQGlub2RlOiAgICBpbm9kZSBmcm9tIGhhc2ggdGFibGUgdG8gY2hlY2sKKyAqIEBvcGFxdWU6ICAgImNvb2tpZSIgcGFzc2VkIHRvIGlnZXQ1X2xvY2tlZCgpLiBUaGlzIGlzICZyZWlzZXJmc19pZ2V0X2FyZ3MuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaWdldDVfbG9ja2VkKCkgdG8gZGlzdGluZ3Vpc2ggcmVpc2VyZnMgaW5vZGVzCisgKiBoYXZpbmcgdGhlIHNhbWUgaW5vZGUgbnVtYmVycy4gU3VjaCBpbm9kZXMgY2FuIG9ubHkgZXhpc3QgZHVlIHRvIHNvbWUKKyAqIGVycm9yIGNvbmRpdGlvbi4gT25lIG9mIHRoZW0gc2hvdWxkIGJlIGJhZC4gSW5vZGVzIHdpdGggaWRlbnRpY2FsCisgKiBpbm9kZSBudW1iZXJzIChvYmplY3RpZHMpIGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHBhcmVudCBkaXJlY3RvcnkgaWRzLgorICoKKyAqLworaW50IHJlaXNlcmZzX2ZpbmRfYWN0b3IoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKm9wYXF1ZSApCit7CisgICAgc3RydWN0IHJlaXNlcmZzX2lnZXRfYXJncyAqYXJnczsKKworICAgIGFyZ3MgPSBvcGFxdWU7CisgICAgLyogYXJncyBpcyBhbHJlYWR5IGluIENQVSBvcmRlciAqLworICAgIHJldHVybiAoaW5vZGUtPmlfaW5vID09IGFyZ3MtPm9iamVjdGlkKSAmJgorCShsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQpID09IGFyZ3MtPmRpcmlkKTsKK30KKworc3RydWN0IGlub2RlICogcmVpc2VyZnNfaWdldCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBrZXkpCit7CisgICAgc3RydWN0IGlub2RlICogaW5vZGU7CisgICAgc3RydWN0IHJlaXNlcmZzX2lnZXRfYXJncyBhcmdzIDsKKworICAgIGFyZ3Mub2JqZWN0aWQgPSBrZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgOworICAgIGFyZ3MuZGlyaWQgPSBrZXktPm9uX2Rpc2tfa2V5LmtfZGlyX2lkIDsKKyAgICBpbm9kZSA9IGlnZXQ1X2xvY2tlZCAocywga2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkLCAKKwkJICAgcmVpc2VyZnNfZmluZF9hY3RvciwgcmVpc2VyZnNfaW5pdF9sb2NrZWRfaW5vZGUsICh2b2lkICopKCZhcmdzKSk7CisgICAgaWYgKCFpbm9kZSkgCisJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSkgOworCisgICAgaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKKwlyZWlzZXJmc19yZWFkX2xvY2tlZF9pbm9kZShpbm9kZSwgJmFyZ3MpOworCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworICAgIH0KKworICAgIGlmIChjb21wX3Nob3J0X2tleXMgKElOT0RFX1BLRVkgKGlub2RlKSwga2V5KSB8fCBpc19iYWRfaW5vZGUgKGlub2RlKSkgeworCS8qIGVpdGhlciBkdWUgdG8gaS9vIGVycm9yIG9yIGEgc3RhbGUgTkZTIGhhbmRsZSAqLworCWlwdXQgKGlub2RlKTsKKwlpbm9kZSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBpbm9kZTsKK30KKworc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfZ2V0X2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICp2b2JqcCkKK3sKKyAgICBfX3UzMiAqZGF0YSA9IHZvYmpwOworICAgIHN0cnVjdCBjcHVfa2V5IGtleSA7CisgICAgc3RydWN0IGRlbnRyeSAqcmVzdWx0OworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGU7CisgICAgCisgICAga2V5Lm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSBkYXRhWzBdIDsKKyAgICBrZXkub25fZGlza19rZXkua19kaXJfaWQgPSBkYXRhWzFdIDsKKyAgICByZWlzZXJmc193cml0ZV9sb2NrKHNiKTsKKyAgICBpbm9kZSA9IHJlaXNlcmZzX2lnZXQoc2IsICZrZXkpIDsKKyAgICBpZiAoaW5vZGUgJiYgIUlTX0VSUihpbm9kZSkgJiYgZGF0YVsyXSAhPSAwICYmCisJZGF0YVsyXSAhPSBpbm9kZS0+aV9nZW5lcmF0aW9uKSB7CisJICAgIGlwdXQoaW5vZGUpIDsKKwkgICAgaW5vZGUgPSBOVUxMIDsKKyAgICB9CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHNiKTsKKyAgICBpZiAoIWlub2RlKQorCSAgICBpbm9kZSA9IEVSUl9QVFIoLUVTVEFMRSk7CisgICAgaWYgKElTX0VSUihpbm9kZSkpCisJICAgIHJldHVybiBFUlJfUFRSKFBUUl9FUlIoaW5vZGUpKTsKKyAgICByZXN1bHQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOworICAgIGlmICghcmVzdWx0KSB7CisJICAgIGlwdXQoaW5vZGUpOworCSAgICByZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfZGVjb2RlX2ZoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIF9fdTMyICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBmaHR5cGUsCisJCQkJICBpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZWN0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCisJCQkJICB2b2lkICpjb250ZXh0KSB7CisgICAgX191MzIgb2JqWzNdLCBwYXJlbnRbM107CisKKyAgICAvKiBmaHR5cGUgaGFwcGVucyB0byByZWZsZWN0IHRoZSBudW1iZXIgb2YgdTMycyBlbmNvZGVkLgorICAgICAqIGR1ZSB0byBhIGJ1ZyBpbiBlYXJsaWVyIGNvZGUsIGZodHlwZSBtaWdodCBpbmRpY2F0ZSB0aGVyZQorICAgICAqIGFyZSBtb3JlIHUzMnMgdGhlbiBhY3R1YWxseSBmaXR0ZWQuCisgICAgICogc28gaWYgZmh0eXBlIHNlZW1zIHRvIGJlIG1vcmUgdGhhbiBsZW4sIHJlZHVjZSBmaHR5cGUuCisgICAgICogVmFsaWQgdHlwZXMgYXJlOgorICAgICAqICAgMiAtIG9iamVjdGlkICsgZGlyX2lkIC0gbGVnYWN5IHN1cHBvcnQKKyAgICAgKiAgIDMgLSBvYmplY3RpZCArIGRpcl9pZCArIGdlbmVyYXRpb24KKyAgICAgKiAgIDQgLSBvYmplY3RpZCArIGRpcl9pZCArIG9iamVjdGlkIGFuZCBkaXJpZCBvZiBwYXJlbnQgLSBsZWdhY3kKKyAgICAgKiAgIDUgLSBvYmplY3RpZCArIGRpcl9pZCArIGdlbmVyYXRpb24gKyBvYmplY3RpZCBhbmQgZGlyaWQgb2YgcGFyZW50CisgICAgICogICA2IC0gYXMgYWJvdmUgcGx1cyBnZW5lcmF0aW9uIG9mIGRpcmVjdG9yeQorICAgICAqIDYgZG9lcyBub3QgZml0IGluIE5GU3YyIGhhbmRsZXMKKyAgICAgKi8KKyAgICBpZiAoZmh0eXBlID4gbGVuKSB7CisJICAgIGlmIChmaHR5cGUgIT0gNiB8fCBsZW4gIT0gNSkKKwkJICAgIHJlaXNlcmZzX3dhcm5pbmcgKHNiLCAibmZzZC9yZWlzZXJmcywgZmh0eXBlPSVkLCBsZW49JWQgLSBvZGQiLAorCQkJICAgZmh0eXBlLCBsZW4pOworCSAgICBmaHR5cGUgPSA1OworICAgIH0KKworICAgIG9ialswXSA9IGRhdGFbMF07CisgICAgb2JqWzFdID0gZGF0YVsxXTsKKyAgICBpZiAoZmh0eXBlID09IDMgfHwgZmh0eXBlID49IDUpCisJICAgIG9ialsyXSA9IGRhdGFbMl07CisgICAgZWxzZSAgICBvYmpbMl0gPSAwOyAvKiBnZW5lcmF0aW9uIG51bWJlciAqLworCisgICAgaWYgKGZodHlwZSA+PSA0KSB7CisJICAgIHBhcmVudFswXSA9IGRhdGFbZmh0eXBlPj01PzM6Ml0gOworCSAgICBwYXJlbnRbMV0gPSBkYXRhW2ZodHlwZT49NT80OjNdIDsKKwkgICAgaWYgKGZodHlwZSA9PSA2KQorCQkgICAgcGFyZW50WzJdID0gZGF0YVs1XTsKKwkgICAgZWxzZSAgICBwYXJlbnRbMl0gPSAwOworICAgIH0KKyAgICByZXR1cm4gc2ItPnNfZXhwb3J0X29wLT5maW5kX2V4cG9ydGVkX2RlbnRyeShzYiwgb2JqLCBmaHR5cGUgPCA0ID8gTlVMTCA6IHBhcmVudCwKKwkJCSAgICAgICBhY2NlcHRhYmxlLCBjb250ZXh0KTsKK30KKworaW50IHJlaXNlcmZzX2VuY29kZV9maChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fdTMyICpkYXRhLCBpbnQgKmxlbnAsIGludCBuZWVkX3BhcmVudCkgeworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGUgOworICAgIGludCBtYXhsZW4gPSAqbGVucDsKKyAgICAKKyAgICBpZiAobWF4bGVuIDwgMykKKyAgICAgICAgcmV0dXJuIDI1NSA7CisKKyAgICBkYXRhWzBdID0gaW5vZGUtPmlfaW5vIDsKKyAgICBkYXRhWzFdID0gbGUzMl90b19jcHUoSU5PREVfUEtFWSAoaW5vZGUpLT5rX2Rpcl9pZCkgOworICAgIGRhdGFbMl0gPSBpbm9kZS0+aV9nZW5lcmF0aW9uIDsKKyAgICAqbGVucCA9IDMgOworICAgIC8qIG5vIHJvb20gZm9yIGRpcmVjdG9yeSBpbmZvPyByZXR1cm4gd2hhdCB3ZSd2ZSBzdG9yZWQgc28gZmFyICovCisgICAgaWYgKG1heGxlbiA8IDUgfHwgISBuZWVkX3BhcmVudCkKKyAgICAgICAgcmV0dXJuIDMgOworCisgICAgc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisgICAgaW5vZGUgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlIDsKKyAgICBkYXRhWzNdID0gaW5vZGUtPmlfaW5vIDsKKyAgICBkYXRhWzRdID0gbGUzMl90b19jcHUoSU5PREVfUEtFWSAoaW5vZGUpLT5rX2Rpcl9pZCkgOworICAgICpsZW5wID0gNSA7CisgICAgaWYgKG1heGxlbiA+PSA2KSB7CisJICAgIGRhdGFbNV0gPSBpbm9kZS0+aV9nZW5lcmF0aW9uIDsKKwkgICAgKmxlbnAgPSA2IDsKKyAgICB9CisgICAgc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKyAgICByZXR1cm4gKmxlbnAgOworfQorCisKKy8qIGxvb2tzIGZvciBzdGF0IGRhdGEsIHRoZW4gY29waWVzIGZpZWxkcyB0byBpdCwgbWFya3MgdGhlIGJ1ZmZlcgorICAgY29udGFpbmluZyBzdGF0IGRhdGEgYXMgZGlydHkgKi8KKy8qIHJlaXNlcmZzIGlub2RlcyBhcmUgbmV2ZXIgcmVhbGx5IGRpcnR5LCBzaW5jZSB0aGUgZGlydHkgaW5vZGUgY2FsbAorKiogYWx3YXlzIGxvZ3MgdGhlbS4gIFRoaXMgY2FsbCBhbGxvd3MgdGhlIFZGUyBpbm9kZSBtYXJraW5nIHJvdXRpbmVzCisqKiB0byBwcm9wZXJseSBtYXJrIGlub2RlcyBmb3IgZGF0YXN5bmMgYW5kIHN1Y2gsIGJ1dCBvbmx5IGFjdHVhbGx5CisqKiBkb2VzIHNvbWV0aGluZyB3aGVuIGNhbGxlZCBmb3IgYSBzeW5jaHJvbm91cyB1cGRhdGUuCisqLworaW50IHJlaXNlcmZzX3dyaXRlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IGRvX3N5bmMpIHsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKKyAgICBpbnQgamJlZ2luX2NvdW50ID0gMSA7CisKKyAgICBpZiAoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisgICAgICAgIHJldHVybiAtRVJPRlM7CisgICAgLyogbWVtb3J5IHByZXNzdXJlIGNhbiBzb21ldGltZXMgaW5pdGlhdGUgd3JpdGVfaW5vZGUgY2FsbHMgd2l0aCBzeW5jID09IDEsCisgICAgKiogdGhlc2UgY2FzZXMgYXJlIGp1c3Qgd2hlbiB0aGUgc3lzdGVtIG5lZWRzIHJhbSwgbm90IHdoZW4gdGhlIAorICAgICoqIGlub2RlIG5lZWRzIHRvIHJlYWNoIGRpc2sgZm9yIHNhZmV0eSwgYW5kIHRoZXkgY2FuIHNhZmVseSBiZQorICAgICoqIGlnbm9yZWQgYmVjYXVzZSB0aGUgYWx0ZXJlZCBpbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGxvZ2dlZC4KKyAgICAqLworICAgIGlmIChkb19zeW5jICYmICEoY3VycmVudC0+ZmxhZ3MgJiBQRl9NRU1BTExPQykpIHsKKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwlpZiAoIWpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KSkgeworICAgICAgICAgICAgcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlKTsKKyAgICAgICAgICAgIGpvdXJuYWxfZW5kX3N5bmMoJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisgICAgICAgIH0KKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogc3RhdCBkYXRhIG9mIG5ldyBvYmplY3QgaXMgaW5zZXJ0ZWQgYWxyZWFkeSwgdGhpcyBpbnNlcnRzIHRoZSBpdGVtCisgICBjb250YWluaW5nICIuIiBhbmQgIi4uIiBlbnRyaWVzICovCitzdGF0aWMgaW50IHJlaXNlcmZzX25ld19kaXJlY3RvcnkgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCAKKwkJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgc3RydWN0IHBhdGggKiBwYXRoLAorCQkJCSAgIHN0cnVjdCBpbm9kZSAqIGRpcikKK3sKKyAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiA9IHRoLT50X3N1cGVyOworICAgIGNoYXIgZW1wdHlfZGlyIFtFTVBUWV9ESVJfU0laRV07CisgICAgY2hhciAqIGJvZHkgPSBlbXB0eV9kaXI7CisgICAgc3RydWN0IGNwdV9rZXkga2V5OworICAgIGludCByZXR2YWw7CisKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisgICAgCisgICAgX21ha2VfY3B1X2tleSAoJmtleSwgS0VZX0ZPUk1BVF8zXzUsIGxlMzJfdG9fY3B1IChpaC0+aWhfa2V5LmtfZGlyX2lkKSwKKwkJICAgbGUzMl90b19jcHUgKGloLT5paF9rZXkua19vYmplY3RpZCksIERPVF9PRkZTRVQsIFRZUEVfRElSRU5UUlksIDMvKmtleSBsZW5ndGgqLyk7CisgICAgCisgICAgLyogY29tcG9zZSBpdGVtIGhlYWQgZm9yIG5ldyBpdGVtLiBEaXJlY3RvcmllcyBjb25zaXN0IG9mIGl0ZW1zIG9mCisgICAgICAgb2xkIHR5cGUgKElURU1fVkVSU0lPTl8xKS4gRG8gbm90IHNldCBrZXkgKHNlY29uZCBhcmcgaXMgMCksIGl0CisgICAgICAgaXMgZG9uZSBieSByZWlzZXJmc19uZXdfaW5vZGUgKi8KKyAgICBpZiAob2xkX2Zvcm1hdF9vbmx5IChzYikpIHsKKwltYWtlX2xlX2l0ZW1faGVhZCAoaWgsIE5VTEwsIEtFWV9GT1JNQVRfM181LCBET1RfT0ZGU0VULCBUWVBFX0RJUkVOVFJZLCBFTVBUWV9ESVJfU0laRV9WMSwgMik7CisJCisJbWFrZV9lbXB0eV9kaXJfaXRlbV92MSAoYm9keSwgaWgtPmloX2tleS5rX2Rpcl9pZCwgaWgtPmloX2tleS5rX29iamVjdGlkLAorCQkJCUlOT0RFX1BLRVkgKGRpciktPmtfZGlyX2lkLCAKKwkJCQlJTk9ERV9QS0VZIChkaXIpLT5rX29iamVjdGlkICk7CisgICAgfSBlbHNlIHsKKwltYWtlX2xlX2l0ZW1faGVhZCAoaWgsIE5VTEwsIEtFWV9GT1JNQVRfM181LCBET1RfT0ZGU0VULCBUWVBFX0RJUkVOVFJZLCBFTVBUWV9ESVJfU0laRSwgMik7CisJCisJbWFrZV9lbXB0eV9kaXJfaXRlbSAoYm9keSwgaWgtPmloX2tleS5rX2Rpcl9pZCwgaWgtPmloX2tleS5rX29iamVjdGlkLAorCQkgICAJCUlOT0RFX1BLRVkgKGRpciktPmtfZGlyX2lkLCAKKwkJICAgCQlJTk9ERV9QS0VZIChkaXIpLT5rX29iamVjdGlkICk7CisgICAgfQorICAgIAorICAgIC8qIGxvb2sgZm9yIHBsYWNlIGluIHRoZSB0cmVlIGZvciBuZXcgaXRlbSAqLworICAgIHJldHZhbCA9IHNlYXJjaF9pdGVtIChzYiwgJmtleSwgcGF0aCk7CisgICAgaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCXJlaXNlcmZzX3dhcm5pbmcgKHNiLCAidnMtMTMwODA6IHJlaXNlcmZzX25ld19kaXJlY3Rvcnk6ICIKKwkJCSAgImkvbyBmYWlsdXJlIG9jY3VycmVkIGNyZWF0aW5nIG5ldyBkaXJlY3RvcnkiKTsKKwlyZXR1cm4gLUVJTzsKKyAgICB9CisgICAgaWYgKHJldHZhbCA9PSBJVEVNX0ZPVU5EKSB7CisJcGF0aHJlbHNlIChwYXRoKTsKKwlyZWlzZXJmc193YXJuaW5nIChzYiwgInZzLTEzMDcwOiByZWlzZXJmc19uZXdfZGlyZWN0b3J5OiAiCisJCQkgICJvYmplY3Qgd2l0aCB0aGlzIGtleSBleGlzdHMgKCVrKSIsICYoaWgtPmloX2tleSkpOworCXJldHVybiAtRUVYSVNUOworICAgIH0KKworICAgIC8qIGluc2VydCBpdGVtLCB0aGF0IGlzIGVtcHR5IGRpcmVjdG9yeSBpdGVtICovCisgICAgcmV0dXJuIHJlaXNlcmZzX2luc2VydF9pdGVtICh0aCwgcGF0aCwgJmtleSwgaWgsIGlub2RlLCBib2R5KTsKK30KKworCisvKiBzdGF0IGRhdGEgb2Ygb2JqZWN0IGhhcyBiZWVuIGluc2VydGVkLCB0aGlzIGluc2VydHMgdGhlIGl0ZW0KKyAgIGNvbnRhaW5pbmcgdGhlIGJvZHkgb2Ygc3ltbGluayAqLworc3RhdGljIGludCByZWlzZXJmc19uZXdfc3ltbGluayAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAorCQkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLAkvKiBJbm9kZSBvZiBzeW1saW5rICovCisJCQkJIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwKKwkJCQkgc3RydWN0IHBhdGggKiBwYXRoLCBjb25zdCBjaGFyICogc3ltbmFtZSwgaW50IGl0ZW1fbGVuKQoreworICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gdGgtPnRfc3VwZXI7CisgICAgc3RydWN0IGNwdV9rZXkga2V5OworICAgIGludCByZXR2YWw7CisKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisKKyAgICBfbWFrZV9jcHVfa2V5ICgma2V5LCBLRVlfRk9STUFUXzNfNSwgCisJCSAgIGxlMzJfdG9fY3B1IChpaC0+aWhfa2V5LmtfZGlyX2lkKSwgCisJCSAgIGxlMzJfdG9fY3B1IChpaC0+aWhfa2V5Lmtfb2JqZWN0aWQpLAorCQkgICAxLCBUWVBFX0RJUkVDVCwgMy8qa2V5IGxlbmd0aCovKTsKKworICAgIG1ha2VfbGVfaXRlbV9oZWFkIChpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzUsIDEsIFRZUEVfRElSRUNULCBpdGVtX2xlbiwgMC8qZnJlZV9zcGFjZSovKTsKKworICAgIC8qIGxvb2sgZm9yIHBsYWNlIGluIHRoZSB0cmVlIGZvciBuZXcgaXRlbSAqLworICAgIHJldHZhbCA9IHNlYXJjaF9pdGVtIChzYiwgJmtleSwgcGF0aCk7CisgICAgaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCXJlaXNlcmZzX3dhcm5pbmcgKHNiLCAidnMtMTMwODA6IHJlaXNlcmZzX25ld19zeW1saW5pazogIgorCQkJICAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgY3JlYXRpbmcgbmV3IHN5bWxpbmsiKTsKKwlyZXR1cm4gLUVJTzsKKyAgICB9CisgICAgaWYgKHJldHZhbCA9PSBJVEVNX0ZPVU5EKSB7CisJcGF0aHJlbHNlIChwYXRoKTsKKwlyZWlzZXJmc193YXJuaW5nIChzYiwgInZzLTEzMDgwOiByZWlzZXJmc19uZXdfc3ltbGluazogIgorCQkJICAib2JqZWN0IHdpdGggdGhpcyBrZXkgZXhpc3RzICglaykiLCAmKGloLT5paF9rZXkpKTsKKwlyZXR1cm4gLUVFWElTVDsKKyAgICB9CisKKyAgICAvKiBpbnNlcnQgaXRlbSwgdGhhdCBpcyBib2R5IG9mIHN5bWxpbmsgKi8KKyAgICByZXR1cm4gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0gKHRoLCBwYXRoLCAma2V5LCBpaCwgaW5vZGUsIHN5bW5hbWUpOworfQorCisKKy8qIGluc2VydHMgdGhlIHN0YXQgZGF0YSBpbnRvIHRoZSB0cmVlLCBhbmQgdGhlbiBjYWxscworICAgcmVpc2VyZnNfbmV3X2RpcmVjdG9yeSAodG8gaW5zZXJ0ICIuIiwgIi4uIiBpdGVtIGlmIG5ldyBvYmplY3QgaXMKKyAgIGRpcmVjdG9yeSkgb3IgcmVpc2VyZnNfbmV3X3N5bWxpbmsgKHRvIGluc2VydCBzeW1saW5rIGJvZHkgaWYgbmV3CisgICBvYmplY3QgaXMgc3ltbGluaykgb3Igbm90aGluZyAoaWYgbmV3IG9iamVjdCBpcyByZWd1bGFyIGZpbGUpIAorCisgICBOT1RFISB1aWQgYW5kIGdpZCBtdXN0IGFscmVhZHkgYmUgc2V0IGluIHRoZSBpbm9kZS4gIElmIHdlIHJldHVybgorICAgbm9uLXplcm8gZHVlIHRvIGFuIGVycm9yLCB3ZSBoYXZlIHRvIGRyb3AgdGhlIHF1b3RhIHByZXZpb3VzbHkgYWxsb2NhdGVkCisgICBmb3IgdGhlIGZyZXNoIGlub2RlLiAgVGhpcyBjYW4gb25seSBiZSBkb25lIG91dHNpZGUgYSB0cmFuc2FjdGlvbiwgc28KKyAgIGlmIHdlIHJldHVybiBub24temVybywgd2UgYWxzbyBlbmQgdGhlIHRyYW5zYWN0aW9uLiAgKi8KK2ludCByZWlzZXJmc19uZXdfaW5vZGUgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJc3RydWN0IGlub2RlICogZGlyLCBpbnQgbW9kZSwgCisJCQljb25zdCBjaGFyICogc3ltbmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAvKiAwIGZvciByZWd1bGFyLCBFTVRSWV9ESVJfU0laRSBmb3IgZGlycywgCisJCQkgICBzdHJsZW4gKHN5bW5hbWUpIGZvciBzeW1saW5rcykqLworCQkgICAgICAgICBsb2ZmX3QgaV9zaXplLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIAorCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisgICAgSU5JVElBTElaRV9QQVRIIChwYXRoX3RvX2tleSk7CisgICAgc3RydWN0IGNwdV9rZXkga2V5OworICAgIHN0cnVjdCBpdGVtX2hlYWQgaWg7CisgICAgc3RydWN0IHN0YXRfZGF0YSBzZDsKKyAgICBpbnQgcmV0dmFsOworICAgIGludCBlcnI7CisKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisgIAorICAgIGlmIChEUVVPVF9BTExPQ19JTk9ERShpbm9kZSkpIHsKKwllcnIgPSAtRURRVU9UOworCWdvdG8gb3V0X2VuZF90cmFuczsKKyAgICB9CisgICAgaWYgKCFkaXIgfHwgIWRpci0+aV9ubGluaykgeworCWVyciA9IC1FUEVSTTsKKwlnb3RvIG91dF9iYWRfaW5vZGU7CisgICAgfQorCisgICAgc2IgPSBkaXItPmlfc2I7CisKKyAgICAvKiBpdGVtIGhlYWQgb2YgbmV3IGl0ZW0gKi8KKyAgICBpaC5paF9rZXkua19kaXJfaWQgPSByZWlzZXJmc19jaG9vc2VfcGFja2luZyhkaXIpOworICAgIGloLmloX2tleS5rX29iamVjdGlkID0gY3B1X3RvX2xlMzIgKHJlaXNlcmZzX2dldF91bnVzZWRfb2JqZWN0aWQgKHRoKSk7CisgICAgaWYgKCFpaC5paF9rZXkua19vYmplY3RpZCkgeworCWVyciA9IC1FTk9NRU07CisJZ290byBvdXRfYmFkX2lub2RlIDsKKyAgICB9CisgICAgaWYgKG9sZF9mb3JtYXRfb25seSAoc2IpKQorCS8qIG5vdCBhIHBlcmZlY3QgZ2VuZXJhdGlvbiBjb3VudCwgYXMgb2JqZWN0IGlkcyBjYW4gYmUgcmV1c2VkLCBidXQgCisJKiogdGhpcyBpcyBhcyBnb29kIGFzIHJlaXNlcmZzIGNhbiBkbyByaWdodCBub3cuCisJKiogbm90ZSB0aGF0IHRoZSBwcml2YXRlIHBhcnQgb2YgaW5vZGUgaXNuJ3QgZmlsbGVkIGluIHlldCwgd2UgaGF2ZQorCSoqIHRvIHVzZSB0aGUgZGlyZWN0b3J5LgorCSovCisJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGxlMzJfdG9fY3B1IChJTk9ERV9QS0VZIChkaXIpLT5rX29iamVjdGlkKTsKKyAgICBlbHNlCisjaWYgZGVmaW5lZCggVVNFX0lOT0RFX0dFTkVSQVRJT05fQ09VTlRFUiApCisJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGxlMzJfdG9fY3B1KFJFSVNFUkZTX1NCKHNiKS0+c19ycy0+c19pbm9kZV9nZW5lcmF0aW9uKTsKKyNlbHNlCisJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9ICsrZXZlbnQ7CisjZW5kaWYKKworICAgIC8qIGZpbGwgc3RhdCBkYXRhICovCisgICAgaW5vZGUtPmlfbmxpbmsgPSAoU19JU0RJUiAobW9kZSkgPyAyIDogMSk7CisKKyAgICAvKiB1aWQgYW5kIGdpZCBtdXN0IGFscmVhZHkgYmUgc2V0IGJ5IHRoZSBjYWxsZXIgZm9yIHF1b3RhIGluaXQgKi8KKworICAgIC8qIHN5bWxpbmsgY2Fubm90IGJlIGltbXV0YWJsZSBvciBhcHBlbmQgb25seSwgcmlnaHQ/ICovCisgICAgaWYoIFNfSVNMTksoIGlub2RlIC0+IGlfbW9kZSApICkKKwkgICAgaW5vZGUgLT4gaV9mbGFncyAmPSB+ICggU19JTU1VVEFCTEUgfCBTX0FQUEVORCApOworCisgICAgaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0KKwkgICAgQ1VSUkVOVF9USU1FX1NFQzsKKyAgICBpbm9kZS0+aV9zaXplID0gaV9zaXplOworICAgIGlub2RlLT5pX2Jsb2NrcyA9IDA7CisgICAgaW5vZGUtPmlfYnl0ZXMgPSAwOworICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZpcnN0X2RpcmVjdF9ieXRlID0gU19JU0xOSyhtb2RlKSA/IDEgOiAKKyAgICAgIFUzMl9NQVgvKk5PX0JZVEVTX0lOX0RJUkVDVF9JVEVNKi87CisKKyAgICBJTklUX0xJU1RfSEVBRCgmKFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2xpc3QgKSk7CisgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgPSAwOworICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2Jsb2NrID0gMDsKKyAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA9IDA7CisgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfdHJhbnNfaWQgPSAwOworICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2psID0gTlVMTDsKKyAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9hdHRycyA9CisJUkVJU0VSRlNfSShkaXIpLT5pX2F0dHJzICYgUkVJU0VSRlNfSU5IRVJJVF9NQVNLOworICAgIHNkX2F0dHJzX3RvX2lfYXR0cnMoIFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfYXR0cnMsIGlub2RlICk7CisgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfYWNsX2FjY2VzcyA9IE5VTEw7CisgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfYWNsX2RlZmF1bHQgPSBOVUxMOworICAgIGluaXRfcndzZW0gKCZSRUlTRVJGU19JKGlub2RlKS0+eGF0dHJfc2VtKTsKKworICAgIGlmIChvbGRfZm9ybWF0X29ubHkgKHNiKSkKKwltYWtlX2xlX2l0ZW1faGVhZCAoJmloLCBOVUxMLCBLRVlfRk9STUFUXzNfNSwgU0RfT0ZGU0VULCBUWVBFX1NUQVRfREFUQSwgU0RfVjFfU0laRSwgTUFYX1VTX0lOVCk7CisgICAgZWxzZQorCW1ha2VfbGVfaXRlbV9oZWFkICgmaWgsIE5VTEwsIEtFWV9GT1JNQVRfM182LCBTRF9PRkZTRVQsIFRZUEVfU1RBVF9EQVRBLCBTRF9TSVpFLCBNQVhfVVNfSU5UKTsKKworICAgIC8qIGtleSB0byBzZWFyY2ggZm9yIGNvcnJlY3QgcGxhY2UgZm9yIG5ldyBzdGF0IGRhdGEgKi8KKyAgICBfbWFrZV9jcHVfa2V5ICgma2V5LCBLRVlfRk9STUFUXzNfNiwgbGUzMl90b19jcHUgKGloLmloX2tleS5rX2Rpcl9pZCksCisJCSAgIGxlMzJfdG9fY3B1IChpaC5paF9rZXkua19vYmplY3RpZCksIFNEX09GRlNFVCwgVFlQRV9TVEFUX0RBVEEsIDMvKmtleSBsZW5ndGgqLyk7CisKKyAgICAvKiBmaW5kIHByb3BlciBwbGFjZSBmb3IgaW5zZXJ0aW5nIG9mIHN0YXQgZGF0YSAqLworICAgIHJldHZhbCA9IHNlYXJjaF9pdGVtIChzYiwgJmtleSwgJnBhdGhfdG9fa2V5KTsKKyAgICBpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJZXJyID0gLUVJTzsKKwlnb3RvIG91dF9iYWRfaW5vZGU7CisgICAgfQorICAgIGlmIChyZXR2YWwgPT0gSVRFTV9GT1VORCkgeworCXBhdGhyZWxzZSAoJnBhdGhfdG9fa2V5KTsKKwllcnIgPSAtRUVYSVNUOworCWdvdG8gb3V0X2JhZF9pbm9kZTsKKyAgICB9CisgICAgaWYgKG9sZF9mb3JtYXRfb25seSAoc2IpKSB7CisJaWYgKGlub2RlLT5pX3VpZCAmIH4weGZmZmYgfHwgaW5vZGUtPmlfZ2lkICYgfjB4ZmZmZikgeworCSAgICBwYXRocmVsc2UgKCZwYXRoX3RvX2tleSk7CisJICAgIC8qIGlfdWlkIG9yIGlfZ2lkIGlzIHRvbyBiaWcgdG8gYmUgc3RvcmVkIGluIHN0YXQgZGF0YSB2My41ICovCisJICAgIGVyciA9IC1FSU5WQUw7CisJICAgIGdvdG8gb3V0X2JhZF9pbm9kZTsKKwl9CisJaW5vZGUyc2RfdjEgKCZzZCwgaW5vZGUsIGlub2RlLT5pX3NpemUpOworICAgIH0gZWxzZSB7CisJaW5vZGUyc2QgKCZzZCwgaW5vZGUsIGlub2RlLT5pX3NpemUpOworICAgIH0KKyAgICAvLyB0aGVzZSBkbyBub3QgZ28gdG8gb24tZGlzayBzdGF0IGRhdGEKKyAgICBpbm9kZS0+aV9pbm8gPSBsZTMyX3RvX2NwdSAoaWguaWhfa2V5Lmtfb2JqZWN0aWQpOworICAgIGlub2RlLT5pX2Jsa3NpemUgPSByZWlzZXJmc19kZWZhdWx0X2lvX3NpemU7CisgIAorICAgIC8vIHN0b3JlIGluIGluLWNvcmUgaW5vZGUgdGhlIGtleSBvZiBzdGF0IGRhdGEgYW5kIHZlcnNpb24gYWxsCisgICAgLy8gb2JqZWN0IGl0ZW1zIHdpbGwgaGF2ZSAoZGlyZWN0b3J5IGl0ZW1zIHdpbGwgaGF2ZSBvbGQgb2Zmc2V0CisgICAgLy8gZm9ybWF0LCBvdGhlciBuZXcgb2JqZWN0cyB3aWxsIGNvbnNpc3Qgb2YgbmV3IGl0ZW1zKQorICAgIG1lbWNweSAoSU5PREVfUEtFWSAoaW5vZGUpLCAmKGloLmloX2tleSksIEtFWV9TSVpFKTsKKyAgICBpZiAob2xkX2Zvcm1hdF9vbmx5IChzYikgfHwgU19JU0RJUihtb2RlKSB8fCBTX0lTTE5LKG1vZGUpKQorICAgICAgICBzZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbiAoaW5vZGUsIEtFWV9GT1JNQVRfM181KTsKKyAgICBlbHNlCisgICAgICAgIHNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSwgS0VZX0ZPUk1BVF8zXzYpOworICAgIGlmIChvbGRfZm9ybWF0X29ubHkgKHNiKSkKKwlzZXRfaW5vZGVfc2RfdmVyc2lvbiAoaW5vZGUsIFNUQVRfREFUQV9WMSk7CisgICAgZWxzZQorCXNldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSwgU1RBVF9EQVRBX1YyKTsKKyAgICAKKyAgICAvKiBpbnNlcnQgdGhlIHN0YXQgZGF0YSBpbnRvIHRoZSB0cmVlICovCisjaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUworICAgIGlmIChSRUlTRVJGU19JKGRpciktPm5ld19wYWNraW5nX2xvY2FsaXR5KQorCXRoLT5kaXNwbGFjZV9uZXdfYmxvY2tzID0gMTsKKyNlbmRpZgorICAgIHJldHZhbCA9IHJlaXNlcmZzX2luc2VydF9pdGVtICh0aCwgJnBhdGhfdG9fa2V5LCAma2V5LCAmaWgsIGlub2RlLCAoY2hhciAqKSgmc2QpKTsKKyAgICBpZiAocmV0dmFsKSB7CisJZXJyID0gcmV0dmFsOworCXJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGhfdG9fa2V5KSA7CisJZ290byBvdXRfYmFkX2lub2RlOworICAgIH0KKworI2lmZGVmIERJU1BMQUNFX05FV19QQUNLSU5HX0xPQ0FMSVRJRVMKKyAgICBpZiAoIXRoLT5kaXNwbGFjZV9uZXdfYmxvY2tzKQorCVJFSVNFUkZTX0koZGlyKS0+bmV3X3BhY2tpbmdfbG9jYWxpdHkgPSAwOworI2VuZGlmCisgICAgaWYgKFNfSVNESVIobW9kZSkpIHsKKwkvKiBpbnNlcnQgaXRlbSB3aXRoICIuIiBhbmQgIi4uIiAqLworCXJldHZhbCA9IHJlaXNlcmZzX25ld19kaXJlY3RvcnkgKHRoLCBpbm9kZSwgJmloLCAmcGF0aF90b19rZXksIGRpcik7CisgICAgfQorCisgICAgaWYgKFNfSVNMTksobW9kZSkpIHsKKwkvKiBpbnNlcnQgYm9keSBvZiBzeW1saW5rICovCisJaWYgKCFvbGRfZm9ybWF0X29ubHkgKHNiKSkKKwkgICAgaV9zaXplID0gUk9VTkRfVVAoaV9zaXplKTsKKwlyZXR2YWwgPSByZWlzZXJmc19uZXdfc3ltbGluayAodGgsIGlub2RlLCAmaWgsICZwYXRoX3RvX2tleSwgc3ltbmFtZSwgaV9zaXplKTsKKyAgICB9CisgICAgaWYgKHJldHZhbCkgeworCWVyciA9IHJldHZhbDsKKwlyZWlzZXJmc19jaGVja19wYXRoKCZwYXRoX3RvX2tleSkgOworCWpvdXJuYWxfZW5kKHRoLCB0aC0+dF9zdXBlciwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCk7CisJZ290byBvdXRfaW5zZXJ0ZWRfc2Q7CisgICAgfQorCisgICAgLyogWFhYIENIRUNLIFRISVMgKi8KKyAgICBpZiAocmVpc2VyZnNfcG9zaXhhY2wgKGlub2RlLT5pX3NiKSkgeworICAgICAgICByZXR2YWwgPSByZWlzZXJmc19pbmhlcml0X2RlZmF1bHRfYWNsIChkaXIsIGRlbnRyeSwgaW5vZGUpOworICAgICAgICBpZiAocmV0dmFsKSB7CisgICAgICAgICAgICBlcnIgPSByZXR2YWw7CisgICAgICAgICAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoX3RvX2tleSkgOworICAgICAgICAgICAgam91cm5hbF9lbmQodGgsIHRoLT50X3N1cGVyLCB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKTsKKyAgICAgICAgICAgIGdvdG8gb3V0X2luc2VydGVkX3NkOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX1BPU0lYQUNMKSB7CisJcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJBQ0xzIGFyZW4ndCBlbmFibGVkIGluIHRoZSBmcywgIgorCQkJICAiYnV0IHZmcyB0aGlua3MgdGhleSBhcmUhIik7CisgICAgfSBlbHNlIGlmIChpc19yZWlzZXJmc19wcml2X29iamVjdCAoZGlyKSkgeworCXJlaXNlcmZzX21hcmtfaW5vZGVfcHJpdmF0ZSAoaW5vZGUpOworICAgIH0KKworICAgIGluc2VydF9pbm9kZV9oYXNoIChpbm9kZSk7CisgICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7CisgICAgcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aF90b19rZXkpIDsKKworICAgIHJldHVybiAwOworCisvKiBpdCBsb29rcyBsaWtlIHlvdSBjYW4gZWFzaWx5IGNvbXByZXNzIHRoZXNlIHR3byBnb3RvIHRhcmdldHMgaW50bworICogb25lLiAgS2VlcGluZyBpdCBsaWtlIHRoaXMgZG9lc24ndCBhY3R1YWxseSBodXJ0IGFueXRoaW5nLCBhbmQgdGhleQorICogYXJlIHBsYWNlIGhvbGRlcnMgZm9yIHdoYXQgdGhlIHF1b3RhIGNvZGUgYWN0dWFsbHkgbmVlZHMuCisgKi8KK291dF9iYWRfaW5vZGU6CisgICAgLyogSW52YWxpZGF0ZSB0aGUgb2JqZWN0LCBub3RoaW5nIHdhcyBpbnNlcnRlZCB5ZXQgKi8KKyAgICBJTk9ERV9QS0VZKGlub2RlKS0+a19vYmplY3RpZCA9IDA7CisKKyAgICAvKiBRdW90YSBjaGFuZ2UgbXVzdCBiZSBpbnNpZGUgYSB0cmFuc2FjdGlvbiBmb3Igam91cm5hbGluZyAqLworICAgIERRVU9UX0ZSRUVfSU5PREUoaW5vZGUpOworCitvdXRfZW5kX3RyYW5zOgorICAgIGpvdXJuYWxfZW5kKHRoLCB0aC0+dF9zdXBlciwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCkgOworICAgIC8qIERyb3AgY2FuIGJlIG91dHNpZGUgYW5kIGl0IG5lZWRzIG1vcmUgY3JlZGl0cyBzbyBpdCdzIGJldHRlciB0byBoYXZlIGl0IG91dHNpZGUgKi8KKyAgICBEUVVPVF9EUk9QKGlub2RlKTsKKyAgICBpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7CisgICAgbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCitvdXRfaW5zZXJ0ZWRfc2Q6CisgICAgaW5vZGUtPmlfbmxpbmsgPSAwOworICAgIHRoLT50X3RyYW5zX2lkID0gMDsgLyogc28gdGhlIGNhbGxlciBjYW4ndCB1c2UgdGhpcyBoYW5kbGUgbGF0ZXIgKi8KKyAgICBpcHV0KGlub2RlKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKgorKiogZmluZHMgdGhlIHRhaWwgcGFnZSBpbiB0aGUgcGFnZSBjYWNoZSwKKyoqIHJlYWRzIHRoZSBsYXN0IGJsb2NrIGluLgorKioKKyoqIE9uIHN1Y2Nlc3MsIHBhZ2VfcmVzdWx0IGlzIHNldCB0byBhIGxvY2tlZCwgcGlubmVkIHBhZ2UsIGFuZCBiaF9yZXN1bHQKKyoqIGlzIHNldCB0byBhbiB1cCB0byBkYXRlIGJ1ZmZlciBmb3IgdGhlIGxhc3QgYmxvY2sgaW4gdGhlIGZpbGUuICByZXR1cm5zIDAuCisqKgorKiogdGFpbCBjb252ZXJzaW9uIGlzIG5vdCBkb25lLCBzbyBiaF9yZXN1bHQgbWlnaHQgbm90IGJlIHZhbGlkIGZvciB3cml0aW5nCisqKiBjaGVjayBidWZmZXJfbWFwcGVkKGJoX3Jlc3VsdCkgYW5kIGJoX3Jlc3VsdC0+Yl9ibG9ja25yICE9IDAgYmVmb3JlCisqKiB0cnlpbmcgdG8gd3JpdGUgdGhlIGJsb2NrLgorKioKKyoqIG9uIGZhaWx1cmUsIG5vbnplcm8gaXMgcmV0dXJuZWQsIHBhZ2VfcmVzdWx0IGFuZCBiaF9yZXN1bHQgYXJlIHVudG91Y2hlZC4KKyovCitzdGF0aWMgaW50IGdyYWJfdGFpbF9wYWdlKHN0cnVjdCBpbm9kZSAqcF9zX2lub2RlLCAKKwkJCSAgc3RydWN0IHBhZ2UgKipwYWdlX3Jlc3VsdCwgCisJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoX3Jlc3VsdCkgeworCisgICAgLyogd2Ugd2FudCB0aGUgcGFnZSB3aXRoIHRoZSBsYXN0IGJ5dGUgaW4gdGhlIGZpbGUsCisgICAgKiogbm90IHRoZSBwYWdlIHRoYXQgd2lsbCBob2xkIHRoZSBuZXh0IGJ5dGUgZm9yIGFwcGVuZGluZworICAgICovCisgICAgdW5zaWduZWQgbG9uZyBpbmRleCA9IChwX3NfaW5vZGUtPmlfc2l6ZS0xKSA+PiBQQUdFX0NBQ0hFX1NISUZUIDsKKyAgICB1bnNpZ25lZCBsb25nIHBvcyA9IDAgOworICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQgPSAwIDsKKyAgICB1bnNpZ25lZCBsb25nIGJsb2Nrc2l6ZSA9IHBfc19pbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgOworICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gKHBfc19pbm9kZS0+aV9zaXplKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSA7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkIDsKKyAgICBzdHJ1Y3QgcGFnZSAqIHBhZ2UgOworICAgIGludCBlcnJvciA7CisgICAgCisgICAgLyogd2Uga25vdyB0aGF0IHdlIGFyZSBvbmx5IGNhbGxlZCB3aXRoIGlub2RlLT5pX3NpemUgPiAwLgorICAgICoqIHdlIGFsc28ga25vdyB0aGF0IGEgZmlsZSB0YWlsIGNhbiBuZXZlciBiZSBhcyBiaWcgYXMgYSBibG9jaworICAgICoqIElmIGlfc2l6ZSAlIGJsb2Nrc2l6ZSA9PSAwLCBvdXIgZmlsZSBpcyBjdXJyZW50bHkgYmxvY2sgYWxpZ25lZAorICAgICoqIGFuZCBpdCB3b24ndCBuZWVkIGNvbnZlcnRpbmcgb3IgemVyb2luZyBhZnRlciBhIHRydW5jYXRlLgorICAgICovCisgICAgaWYgKChvZmZzZXQgJiAoYmxvY2tzaXplIC0gMSkpID09IDApIHsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQgOworICAgIH0KKyAgICBwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKHBfc19pbm9kZS0+aV9tYXBwaW5nLCBpbmRleCkgOworICAgIGVycm9yID0gLUVOT01FTSA7CisgICAgaWYgKCFwYWdlKSB7CisgICAgICAgIGdvdG8gb3V0IDsKKyAgICB9CisgICAgLyogc3RhcnQgd2l0aGluIHRoZSBwYWdlIG9mIHRoZSBsYXN0IGJsb2NrIGluIHRoZSBmaWxlICovCisgICAgc3RhcnQgPSAob2Zmc2V0IC8gYmxvY2tzaXplKSAqIGJsb2Nrc2l6ZSA7CisKKyAgICBlcnJvciA9IGJsb2NrX3ByZXBhcmVfd3JpdGUocGFnZSwgc3RhcnQsIG9mZnNldCwgCisJCQkJcmVpc2VyZnNfZ2V0X2Jsb2NrX2NyZWF0ZV8wKSA7CisgICAgaWYgKGVycm9yKQorCWdvdG8gdW5sb2NrIDsKKworICAgIGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSkgOyAgICAgIAorICAgIGJoID0gaGVhZDsKKyAgICBkbyB7CisJaWYgKHBvcyA+PSBzdGFydCkgeworCSAgICBicmVhayA7CisJfQorCWJoID0gYmgtPmJfdGhpc19wYWdlIDsKKwlwb3MgKz0gYmxvY2tzaXplIDsKKyAgICB9IHdoaWxlKGJoICE9IGhlYWQpIDsKKworICAgIGlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCS8qIG5vdGUsIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgcHJlcGFyZV93cml0ZSBzaG91bGQKKwkqKiBiZSB0YWtpbmcgY2FyZSBvZiB0aGlzIGZvciB1cy4gIElmIHRoZSBidWZmZXIgaXNuJ3QgdXAgdG8gZGF0ZSwKKwkqKiBJJ3ZlIHNjcmV3ZWQgdXAgdGhlIGNvZGUgdG8gZmluZCB0aGUgYnVmZmVyLCBvciB0aGUgY29kZSB0bworCSoqIGNhbGwgcHJlcGFyZV93cml0ZQorCSovCisJcmVpc2VyZnNfd2FybmluZyAocF9zX2lub2RlLT5pX3NiLAorCQkJICAiY2xtLTYwMDA6IGVycm9yIHJlYWRpbmcgYmxvY2sgJWx1IG9uIGRldiAlcyIsCisJCQkgIGJoLT5iX2Jsb2NrbnIsCisJCQkgIHJlaXNlcmZzX2JkZXZuYW1lIChwX3NfaW5vZGUtPmlfc2IpKSA7CisJZXJyb3IgPSAtRUlPIDsKKwlnb3RvIHVubG9jayA7CisgICAgfQorICAgICpiaF9yZXN1bHQgPSBiaCA7CisgICAgKnBhZ2VfcmVzdWx0ID0gcGFnZSA7CisKK291dDoKKyAgICByZXR1cm4gZXJyb3IgOworCit1bmxvY2s6CisgICAgdW5sb2NrX3BhZ2UocGFnZSkgOworICAgIHBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKSA7CisgICAgcmV0dXJuIGVycm9yIDsKK30KKworLyoKKyoqIHZmcyB2ZXJzaW9uIG9mIHRydW5jYXRlIGZpbGUuICBNdXN0IE5PVCBiZSBjYWxsZWQgd2l0aAorKiogYSB0cmFuc2FjdGlvbiBhbHJlYWR5IHN0YXJ0ZWQuCisqKgorKiogc29tZSBjb2RlIHRha2VuIGZyb20gYmxvY2tfdHJ1bmNhdGVfcGFnZQorKi8KK2ludCByZWlzZXJmc190cnVuY2F0ZV9maWxlKHN0cnVjdCBpbm9kZSAqcF9zX2lub2RlLCBpbnQgdXBkYXRlX3RpbWVzdGFtcHMpIHsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKKyAgICAvKiB3ZSB3YW50IHRoZSBvZmZzZXQgZm9yIHRoZSBmaXJzdCBieXRlIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGZpbGUgKi8KKyAgICB1bnNpZ25lZCBsb25nIG9mZnNldCA9IHBfc19pbm9kZS0+aV9zaXplICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpIDsKKyAgICB1bnNpZ25lZCBibG9ja3NpemUgPSBwX3NfaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDsKKyAgICB1bnNpZ25lZCBsZW5ndGggOworICAgIHN0cnVjdCBwYWdlICpwYWdlID0gTlVMTCA7CisgICAgaW50IGVycm9yIDsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTCA7CisKKyAgICByZWlzZXJmc193cml0ZV9sb2NrKHBfc19pbm9kZS0+aV9zYik7CisKKyAgICBpZiAocF9zX2lub2RlLT5pX3NpemUgPiAwKSB7CisgICAgICAgIGlmICgoZXJyb3IgPSBncmFiX3RhaWxfcGFnZShwX3NfaW5vZGUsICZwYWdlLCAmYmgpKSkgeworCSAgICAvLyAtRU5PRU5UIG1lYW5zIHdlIHRydW5jYXRlZCBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIAorCSAgICAvLyBhbmQgZ2V0X2Jsb2NrX2NyZWF0ZV8wIGNvdWxkIG5vdCBmaW5kIGEgYmxvY2sgdG8gcmVhZCBpbiwKKwkgICAgLy8gd2hpY2ggaXMgb2suCisJICAgIGlmIChlcnJvciAhPSAtRU5PRU5UKQorCSAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX2lub2RlLT5pX3NiLAorCQkJCSAgImNsbS02MDAxOiBncmFiX3RhaWxfcGFnZSBmYWlsZWQgJWQiLAorCQkJCSAgZXJyb3IpOworCSAgICBwYWdlID0gTlVMTCA7CisJICAgIGJoID0gTlVMTCA7CisJfQorICAgIH0KKworICAgIC8qIHNvLCBpZiBwYWdlICE9IE5VTEwsIHdlIGhhdmUgYSBidWZmZXIgaGVhZCBmb3IgdGhlIG9mZnNldCBhdCAKKyAgICAqKiB0aGUgZW5kIG9mIHRoZSBmaWxlLiBpZiB0aGUgYmggaXMgbWFwcGVkLCBhbmQgYmgtPmJfYmxvY2tuciAhPSAwLCAKKyAgICAqKiB0aGVuIHdlIGhhdmUgYW4gdW5mb3JtYXR0ZWQgbm9kZS4gIE90aGVyd2lzZSwgd2UgaGF2ZSBhIGRpcmVjdCBpdGVtLCAKKyAgICAqKiBhbmQgbm8gemVyb2luZyBpcyByZXF1aXJlZCBvbiBkaXNrLiAgV2UgemVybyBhZnRlciB0aGUgdHJ1bmNhdGUsIAorICAgICoqIGJlY2F1c2UgdGhlIHRydW5jYXRlIG1pZ2h0IHBhY2sgdGhlIGl0ZW0gYW55d2F5IAorICAgICoqIChpdCB3aWxsIHVubWFwIGJoIGlmIGl0IHBhY2tzKS4KKyAgICAqLworICAgIC8qIGl0IGlzIGVub3VnaCB0byByZXNlcnZlIHNwYWNlIGluIHRyYW5zYWN0aW9uIGZvciAyIGJhbGFuY2luZ3M6CisgICAgICAgb25lIGZvciAic2F2ZSIgbGluayBhZGRpbmcgYW5kIGFub3RoZXIgZm9yIHRoZSBmaXJzdAorICAgICAgIGN1dF9mcm9tX2l0ZW0uIDEgaXMgZm9yIHVwZGF0ZV9zZCAqLworICAgIGVycm9yID0gam91cm5hbF9iZWdpbiAoJnRoLCBwX3NfaW5vZGUtPmlfc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDIgKyAxKTsKKyAgICBpZiAoZXJyb3IpCisgICAgICAgIGdvdG8gb3V0OworICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihwX3NfaW5vZGUpIDsKKyAgICBpZiAodXBkYXRlX3RpbWVzdGFtcHMpCisJICAgIC8qIHdlIGFyZSBkb2luZyByZWFsIHRydW5jYXRlOiBpZiB0aGUgc3lzdGVtIGNyYXNoZXMgYmVmb3JlIHRoZSBsYXN0CisJICAgICAgIHRyYW5zYWN0aW9uIG9mIHRydW5jYXRpbmcgZ2V0cyBjb21taXR0ZWQgLSBvbiByZWJvb3QgdGhlIGZpbGUKKwkgICAgICAgZWl0aGVyIGFwcGVhcnMgdHJ1bmNhdGVkIHByb3Blcmx5IG9yIG5vdCB0cnVuY2F0ZWQgYXQgYWxsICovCisJYWRkX3NhdmVfbGluayAoJnRoLCBwX3NfaW5vZGUsIDEpOworICAgIGVycm9yID0gcmVpc2VyZnNfZG9fdHJ1bmNhdGUgKCZ0aCwgcF9zX2lub2RlLCBwYWdlLCB1cGRhdGVfdGltZXN0YW1wcykgOworICAgIGlmIChlcnJvcikKKyAgICAgICAgZ290byBvdXQ7CisgICAgZXJyb3IgPSBqb3VybmFsX2VuZCAoJnRoLCBwX3NfaW5vZGUtPmlfc2IsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMiArIDEpOworICAgIGlmIChlcnJvcikKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICBpZiAodXBkYXRlX3RpbWVzdGFtcHMpIHsKKwllcnJvciA9IHJlbW92ZV9zYXZlX2xpbmsgKHBfc19pbm9kZSwgMS8qIHRydW5jYXRlICovKTsKKyAgICAgICAgaWYgKGVycm9yKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgaWYgKHBhZ2UpIHsKKyAgICAgICAgbGVuZ3RoID0gb2Zmc2V0ICYgKGJsb2Nrc2l6ZSAtIDEpIDsKKwkvKiBpZiB3ZSBhcmUgbm90IG9uIGEgYmxvY2sgYm91bmRhcnkgKi8KKwlpZiAobGVuZ3RoKSB7CisJICAgIGNoYXIgKmthZGRyOworCisJICAgIGxlbmd0aCA9IGJsb2Nrc2l6ZSAtIGxlbmd0aCA7CisJICAgIGthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApIDsKKwkgICAgbWVtc2V0KGthZGRyICsgb2Zmc2V0LCAwLCBsZW5ndGgpIDsgICAKKwkgICAgZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSkgOworCSAgICBrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCkgOworCSAgICBpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYmgtPmJfYmxvY2tuciAhPSAwKSB7CisJICAgICAgICBtYXJrX2J1ZmZlcl9kaXJ0eShiaCkgOworCSAgICB9CisJfQorCXVubG9ja19wYWdlKHBhZ2UpIDsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSkgOworICAgIH0KKworICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhwX3NfaW5vZGUtPmlfc2IpOworICAgIHJldHVybiAwOworb3V0OgorICAgIGlmIChwYWdlKSB7CisgICAgICAgIHVubG9ja19wYWdlIChwYWdlKTsKKyAgICAgICAgcGFnZV9jYWNoZV9yZWxlYXNlIChwYWdlKTsKKyAgICB9CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHBfc19pbm9kZS0+aV9zYik7CisgICAgcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IG1hcF9ibG9ja19mb3Jfd3JpdGVwYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIAorCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJsb2NrKSB7CisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7CisgICAgaW50IGZzX2dlbiA7CisgICAgc3RydWN0IGl0ZW1faGVhZCB0bXBfaWggOworICAgIHN0cnVjdCBpdGVtX2hlYWQgKmloIDsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoIDsKKyAgICBfX3UzMiAqaXRlbSA7CisgICAgc3RydWN0IGNwdV9rZXkga2V5IDsKKyAgICBJTklUSUFMSVpFX1BBVEgocGF0aCkgOworICAgIGludCBwb3NfaW5faXRlbSA7CisgICAgaW50IGpiZWdpbl9jb3VudCA9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UIDsKKyAgICBsb2ZmX3QgYnl0ZV9vZmZzZXQgPSAoYmxvY2sgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpICsgMSA7CisgICAgaW50IHJldHZhbCA7CisgICAgaW50IHVzZV9nZXRfYmxvY2sgPSAwIDsKKyAgICBpbnQgYnl0ZXNfY29waWVkID0gMCA7CisgICAgaW50IGNvcHlfc2l6ZSA7CisgICAgaW50IHRyYW5zX3J1bm5pbmcgPSAwOworCisgICAgLyogY2F0Y2ggcGxhY2VzIGJlbG93IHRoYXQgdHJ5IHRvIGxvZyBzb21ldGhpbmcgd2l0aG91dCBzdGFydGluZyBhIHRyYW5zICovCisgICAgdGgudF90cmFuc19pZCA9IDA7CisKKyAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaF9yZXN1bHQpKSB7CisJcmV0dXJuIC1FSU87CisgICAgfQorCisgICAga21hcChiaF9yZXN1bHQtPmJfcGFnZSkgOworc3RhcnRfb3ZlcjoKKyAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKyAgICBtYWtlX2NwdV9rZXkoJmtleSwgaW5vZGUsIGJ5dGVfb2Zmc2V0LCBUWVBFX0FOWSwgMykgOworCityZXNlYXJjaDoKKyAgICByZXR2YWwgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpIDsKKyAgICBpZiAocmV0dmFsICE9IFBPU0lUSU9OX0ZPVU5EKSB7CisgICAgICAgIHVzZV9nZXRfYmxvY2sgPSAxOworCWdvdG8gb3V0IDsKKyAgICB9IAorCisgICAgYmggPSBnZXRfbGFzdF9iaCgmcGF0aCkgOworICAgIGloID0gZ2V0X2loKCZwYXRoKSA7CisgICAgaXRlbSA9IGdldF9pdGVtKCZwYXRoKSA7CisgICAgcG9zX2luX2l0ZW0gPSBwYXRoLnBvc19pbl9pdGVtIDsKKworICAgIC8qIHdlJ3ZlIGZvdW5kIGFuIHVuZm9ybWF0dGVkIG5vZGUgKi8KKyAgICBpZiAoaW5kaXJlY3RfaXRlbV9mb3VuZChyZXR2YWwsIGloKSkgeworCWlmIChieXRlc19jb3BpZWQgPiAwKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiY2xtLTYwMDI6IGJ5dGVzX2NvcGllZCAlZCIsCisJCQkgICAgICBieXRlc19jb3BpZWQpIDsKKwl9CisgICAgICAgIGlmICghZ2V0X2Jsb2NrX251bShpdGVtLCBwb3NfaW5faXRlbSkpIHsKKwkgICAgLyogY3JhcCwgd2UgYXJlIHdyaXRpbmcgdG8gYSBob2xlICovCisJICAgIHVzZV9nZXRfYmxvY2sgPSAxOworCSAgICBnb3RvIG91dCA7CisJfQorCXNldF9ibG9ja19kZXZfbWFwcGVkKGJoX3Jlc3VsdCwgZ2V0X2Jsb2NrX251bShpdGVtLHBvc19pbl9pdGVtKSxpbm9kZSk7CisgICAgfSBlbHNlIGlmIChpc19kaXJlY3RfbGVfaWgoaWgpKSB7CisgICAgICAgIGNoYXIgKnAgOyAKKyAgICAgICAgcCA9IHBhZ2VfYWRkcmVzcyhiaF9yZXN1bHQtPmJfcGFnZSkgOworICAgICAgICBwICs9IChieXRlX29mZnNldCAtMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkgOworICAgICAgICBjb3B5X3NpemUgPSBpaF9pdGVtX2xlbihpaCkgLSBwb3NfaW5faXRlbTsKKworCWZzX2dlbiA9IGdldF9nZW5lcmF0aW9uKGlub2RlLT5pX3NiKSA7CisJY29weV9pdGVtX2hlYWQoJnRtcF9paCwgaWgpIDsKKworCWlmICghdHJhbnNfcnVubmluZykgeworCSAgICAvKiB2cy0zMDUwIGlzIGdvbmUsIG5vIG5lZWQgdG8gZHJvcCB0aGUgcGF0aCAqLworCSAgICByZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCkgOworICAgICAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKwkgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7CisJICAgIHRyYW5zX3J1bm5pbmcgPSAxOworCSAgICBpZiAoZnNfY2hhbmdlZChmc19nZW4sIGlub2RlLT5pX3NiKSAmJiBpdGVtX21vdmVkKCZ0bXBfaWgsICZwYXRoKSkgeworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihpbm9kZS0+aV9zYiwgYmgpIDsKKwkJZ290byByZXNlYXJjaDsKKwkgICAgfQorCX0KKworCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoaW5vZGUtPmlfc2IsIGJoLCAxKSA7CisKKwlpZiAoZnNfY2hhbmdlZCAoZnNfZ2VuLCBpbm9kZS0+aV9zYikgJiYgaXRlbV9tb3ZlZCAoJnRtcF9paCwgJnBhdGgpKSB7CisJICAgIHJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKGlub2RlLT5pX3NiLCBiaCkgOworCSAgICBnb3RvIHJlc2VhcmNoOworCX0KKworCW1lbWNweSggQl9JX1BJVEVNKGJoLCBpaCkgKyBwb3NfaW5faXRlbSwgcCArIGJ5dGVzX2NvcGllZCwgY29weV9zaXplKSA7CisKKwlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBpbm9kZS0+aV9zYiwgYmgpIDsKKwlieXRlc19jb3BpZWQgKz0gY29weV9zaXplIDsKKwlzZXRfYmxvY2tfZGV2X21hcHBlZChiaF9yZXN1bHQsIDAsIGlub2RlKTsKKworCS8qIGFyZSB0aGVyZSBzdGlsbCBieXRlcyBsZWZ0PyAqLworICAgICAgICBpZiAoYnl0ZXNfY29waWVkIDwgYmhfcmVzdWx0LT5iX3NpemUgJiYgCisJICAgIChieXRlX29mZnNldCArIGJ5dGVzX2NvcGllZCkgPCBpbm9kZS0+aV9zaXplKSB7CisJICAgIHNldF9jcHVfa2V5X2tfb2Zmc2V0KCZrZXksIGNwdV9rZXlfa19vZmZzZXQoJmtleSkgKyBjb3B5X3NpemUpIDsKKwkgICAgZ290byByZXNlYXJjaCA7CisJfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLAorCQkJICAiY2xtLTYwMDM6IGJhZCBpdGVtIGlub2RlICVsdSwgZGV2aWNlICVzIiwKKwkJCSAgaW5vZGUtPmlfaW5vLCByZWlzZXJmc19iZGV2bmFtZSAoaW5vZGUtPmlfc2IpKSA7CisgICAgICAgIHJldHZhbCA9IC1FSU8gOworCWdvdG8gb3V0IDsKKyAgICB9CisgICAgcmV0dmFsID0gMCA7CisgICAgCitvdXQ6CisgICAgcGF0aHJlbHNlKCZwYXRoKSA7CisgICAgaWYgKHRyYW5zX3J1bm5pbmcpIHsKKyAgICAgICAgaW50IGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCkgOworICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgcmV0dmFsID0gZXJyOworCXRyYW5zX3J1bm5pbmcgPSAwOworICAgIH0KKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCisgICAgLyogdGhpcyBpcyB3aGVyZSB3ZSBmaWxsIGluIGhvbGVzIGluIHRoZSBmaWxlLiAqLworICAgIGlmICh1c2VfZ2V0X2Jsb2NrKSB7CisJcmV0dmFsID0gcmVpc2VyZnNfZ2V0X2Jsb2NrKGlub2RlLCBibG9jaywgYmhfcmVzdWx0LCAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0JMT0NLX0NSRUFURSB8IEdFVF9CTE9DS19OT19JU0VNIHwKKwkJCQkgICAgR0VUX0JMT0NLX05PX0RBTkdMRSk7CisJaWYgKCFyZXR2YWwpIHsKKwkgICAgaWYgKCFidWZmZXJfbWFwcGVkKGJoX3Jlc3VsdCkgfHwgYmhfcmVzdWx0LT5iX2Jsb2NrbnIgPT0gMCkgeworCSAgICAgICAgLyogZ2V0X2Jsb2NrIGZhaWxlZCB0byBmaW5kIGEgbWFwcGVkIHVuZm9ybWF0dGVkIG5vZGUuICovCisJCXVzZV9nZXRfYmxvY2sgPSAwIDsKKwkJZ290byBzdGFydF9vdmVyIDsKKwkgICAgfQorCX0KKyAgICB9CisgICAga3VubWFwKGJoX3Jlc3VsdC0+Yl9wYWdlKSA7CisKKyAgICBpZiAoIXJldHZhbCAmJiBidWZmZXJfbWFwcGVkKGJoX3Jlc3VsdCkgJiYgYmhfcmVzdWx0LT5iX2Jsb2NrbnIgPT0gMCkgeworCS8qIHdlJ3ZlIGNvcGllZCBkYXRhIGZyb20gdGhlIHBhZ2UgaW50byB0aGUgZGlyZWN0IGl0ZW0sIHNvIHRoZQorCSAqIGJ1ZmZlciBpbiB0aGUgcGFnZSBpcyBub3cgY2xlYW4sIG1hcmsgaXQgdG8gcmVmbGVjdCB0aGF0LgorCSAqLworICAgICAgICBsb2NrX2J1ZmZlcihiaF9yZXN1bHQpOworCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaF9yZXN1bHQpOworCXVubG9ja19idWZmZXIoYmhfcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbCA7Cit9CisKKy8qIAorICogbWFzb25Ac3VzZS5jb206IHVwZGF0ZWQgaW4gMi41LjU0IHRvIGZvbGxvdyB0aGUgc2FtZSBnZW5lcmFsIGlvIAorICogc3RhcnQvcmVjb3ZlcnkgcGF0aCBhcyBfX2Jsb2NrX3dyaXRlX2Z1bGxfcGFnZSwgYWxvbmcgd2l0aCBzcGVjaWFsCisgKiBjb2RlIHRvIGhhbmRsZSByZWlzZXJmcyB0YWlscy4KKyAqLworc3RhdGljIGludCByZWlzZXJmc193cml0ZV9mdWxsX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKSB7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3QgOworICAgIHVuc2lnbmVkIGxvbmcgZW5kX2luZGV4ID0gaW5vZGUtPmlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUIDsKKyAgICBpbnQgZXJyb3IgPSAwOworICAgIHVuc2lnbmVkIGxvbmcgYmxvY2sgOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCwgKmJoOworICAgIGludCBwYXJ0aWFsID0gMCA7CisgICAgaW50IG5yID0gMDsKKyAgICBpbnQgY2hlY2tlZCA9IFBhZ2VDaGVja2VkKHBhZ2UpOworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gaW5vZGUtPmlfc2I7CisgICAgaW50IGJoX3Blcl9wYWdlID0gUEFHRV9DQUNIRV9TSVpFIC8gcy0+c19ibG9ja3NpemU7CisgICAgdGgudF90cmFuc19pZCA9IDA7CisKKyAgICAvKiBUaGUgcGFnZSBkaXJ0eSBiaXQgaXMgY2xlYXJlZCBiZWZvcmUgd3JpdGVwYWdlIGlzIGNhbGxlZCwgd2hpY2gKKyAgICAgKiBtZWFucyB3ZSBoYXZlIHRvIHRlbGwgY3JlYXRlX2VtcHR5X2J1ZmZlcnMgdG8gbWFrZSBkaXJ0eSBidWZmZXJzCisgICAgICogVGhlIHBhZ2UgcmVhbGx5IHNob3VsZCBiZSB1cCB0byBkYXRlIGF0IHRoaXMgcG9pbnQsIHNvIHRvc3NpbmcKKyAgICAgKiBpbiB0aGUgQkhfVXB0b2RhdGUgaXMganVzdCBhIHNhbml0eSBjaGVjay4KKyAgICAgKi8KKyAgICBpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKKwljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBzLT5zX2Jsb2Nrc2l6ZSwKKwkgICAgICAgICAgICAgICAgICAgICgxIDw8IEJIX0RpcnR5KSB8ICgxIDw8IEJIX1VwdG9kYXRlKSk7CisgICAgfQorICAgIGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSkgOworCisgICAgLyogbGFzdCBwYWdlIGluIHRoZSBmaWxlLCB6ZXJvIG91dCBhbnkgY29udGVudHMgcGFzdCB0aGUKKyAgICAqKiBsYXN0IGJ5dGUgaW4gdGhlIGZpbGUKKyAgICAqLworICAgIGlmIChwYWdlLT5pbmRleCA+PSBlbmRfaW5kZXgpIHsKKwljaGFyICprYWRkcjsKKwl1bnNpZ25lZCBsYXN0X29mZnNldDsKKworICAgICAgICBsYXN0X29mZnNldCA9IGlub2RlLT5pX3NpemUgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkgOworCS8qIG5vIGZpbGUgY29udGVudHMgaW4gdGhpcyBwYWdlICovCisJaWYgKHBhZ2UtPmluZGV4ID49IGVuZF9pbmRleCArIDEgfHwgIWxhc3Rfb2Zmc2V0KSB7CisgICAgCSAgICB1bmxvY2tfcGFnZShwYWdlKTsKKwkgICAgcmV0dXJuIDA7CisJfQorCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCW1lbXNldChrYWRkciArIGxhc3Rfb2Zmc2V0LCAwLCBQQUdFX0NBQ0hFX1NJWkUtbGFzdF9vZmZzZXQpIDsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKSA7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApIDsKKyAgICB9CisgICAgYmggPSBoZWFkIDsKKyAgICBibG9jayA9IHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gcy0+c19ibG9ja3NpemVfYml0cykgOworICAgIC8qIGZpcnN0IG1hcCBhbGwgdGhlIGJ1ZmZlcnMsIGxvZ2dpbmcgYW55IGRpcmVjdCBpdGVtcyB3ZSBmaW5kICovCisgICAgZG8geworCWlmICgoY2hlY2tlZCB8fCBidWZmZXJfZGlydHkoYmgpKSAmJiAoIWJ1ZmZlcl9tYXBwZWQoYmgpIHx8CisJICAgKGJ1ZmZlcl9tYXBwZWQoYmgpICYmIGJoLT5iX2Jsb2NrbnIgPT0gMCkpKSB7CisJICAgIC8qIG5vdCBtYXBwZWQgeWV0LCBvciBpdCBwb2ludHMgdG8gYSBkaXJlY3QgaXRlbSwgc2VhcmNoCisJICAgICAqIHRoZSBidHJlZSBmb3IgdGhlIG1hcHBpbmcgaW5mbywgYW5kIGxvZyBhbnkgZGlyZWN0CisJICAgICAqIGl0ZW1zIGZvdW5kCisJICAgICAqLworCSAgICBpZiAoKGVycm9yID0gbWFwX2Jsb2NrX2Zvcl93cml0ZXBhZ2UoaW5vZGUsIGJoLCBibG9jaykpKSB7CisJCWdvdG8gZmFpbCA7CisJICAgIH0KKwl9CisgICAgICAgIGJoID0gYmgtPmJfdGhpc19wYWdlOworCWJsb2NrKys7CisgICAgfSB3aGlsZShiaCAhPSBoZWFkKSA7CisKKyAgICAvKgorICAgICAqIHdlIHN0YXJ0IHRoZSB0cmFuc2FjdGlvbiBhZnRlciBtYXBfYmxvY2tfZm9yX3dyaXRlcGFnZSwKKyAgICAgKiBiZWNhdXNlIGl0IGNhbiBjcmVhdGUgaG9sZXMgaW4gdGhlIGZpbGUgKGFuIHVuYm91bmRlZCBvcGVyYXRpb24pLgorICAgICAqIHN0YXJ0aW5nIGl0IGhlcmUsIHdlIGNhbiBtYWtlIGEgcmVsaWFibGUgZXN0aW1hdGUgZm9yIGhvdyBtYW55CisgICAgICogYmxvY2tzIHdlJ3JlIGdvaW5nIHRvIGxvZworICAgICAqLworICAgIGlmIChjaGVja2VkKSB7CisJQ2xlYXJQYWdlQ2hlY2tlZChwYWdlKTsKKwlyZWlzZXJmc193cml0ZV9sb2NrKHMpOworCWVycm9yID0gam91cm5hbF9iZWdpbigmdGgsIHMsIGJoX3Blcl9wYWdlICsgMSk7CisJaWYgKGVycm9yKSB7CisJICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKKwkgICAgZ290byBmYWlsOworCX0KKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworICAgIH0KKyAgICAvKiBub3cgZ28gdGhyb3VnaCBhbmQgbG9jayBhbnkgZGlydHkgYnVmZmVycyBvbiB0aGUgcGFnZSAqLworICAgIGRvIHsKKwlnZXRfYmgoYmgpOworCWlmICghYnVmZmVyX21hcHBlZChiaCkpCisJICAgIGNvbnRpbnVlOworCWlmIChidWZmZXJfbWFwcGVkKGJoKSAmJiBiaC0+Yl9ibG9ja25yID09IDApCisJICAgIGNvbnRpbnVlOworCisJaWYgKGNoZWNrZWQpIHsKKwkgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBiaCwgMSk7CisJICAgIGpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIGJoKTsKKwkgICAgY29udGludWU7CisJfQorCS8qIGZyb20gdGhpcyBwb2ludCBvbiwgd2Uga25vdyB0aGUgYnVmZmVyIGlzIG1hcHBlZCB0byBhCisJICogcmVhbCBibG9jayBhbmQgbm90IGEgZGlyZWN0IGl0ZW0KKwkgKi8KKwlpZiAod2JjLT5zeW5jX21vZGUgIT0gV0JfU1lOQ19OT05FIHx8ICF3YmMtPm5vbmJsb2NraW5nKSB7CisJICAgIGxvY2tfYnVmZmVyKGJoKTsKKwl9IGVsc2UgeworCSAgICBpZiAodGVzdF9zZXRfYnVmZmVyX2xvY2tlZChiaCkpIHsKKwkJcmVkaXJ0eV9wYWdlX2Zvcl93cml0ZXBhZ2Uod2JjLCBwYWdlKTsKKwkJY29udGludWU7CisJICAgIH0KKwl9CisJaWYgKHRlc3RfY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSkgeworCSAgICBtYXJrX2J1ZmZlcl9hc3luY193cml0ZShiaCk7CisJfSBlbHNlIHsKKwkgICAgdW5sb2NrX2J1ZmZlcihiaCk7CisJfQorICAgIH0gd2hpbGUoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKworICAgIGlmIChjaGVja2VkKSB7CisJZXJyb3IgPSBqb3VybmFsX2VuZCgmdGgsIHMsIGJoX3Blcl9wYWdlICsgMSk7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOworCWlmIChlcnJvcikKKwkgICAgZ290byBmYWlsOworICAgIH0KKyAgICBCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CisgICAgc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworICAgIHVubG9ja19wYWdlKHBhZ2UpOworCisgICAgLyoKKyAgICAgKiBzaW5jZSBhbnkgYnVmZmVyIG1pZ2h0IGJlIHRoZSBvbmx5IGRpcnR5IGJ1ZmZlciBvbiB0aGUgcGFnZSwgCisgICAgICogdGhlIGZpcnN0IHN1Ym1pdF9iaCBjYW4gYnJpbmcgdGhlIHBhZ2Ugb3V0IG9mIHdyaXRlYmFjay4KKyAgICAgKiBiZSBjYXJlZnVsIHdpdGggdGhlIGJ1ZmZlcnMuCisgICAgICovCisgICAgZG8geworICAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7CisJaWYgKGJ1ZmZlcl9hc3luY193cml0ZShiaCkpIHsKKwkgICAgc3VibWl0X2JoKFdSSVRFLCBiaCk7CisJICAgIG5yKys7CisJfQorCXB1dF9iaChiaCk7CisJYmggPSBuZXh0OworICAgIH0gd2hpbGUoYmggIT0gaGVhZCk7CisKKyAgICBlcnJvciA9IDA7Citkb25lOgorICAgIGlmIChuciA9PSAwKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIGlmIHRoaXMgcGFnZSBvbmx5IGhhZCBhIGRpcmVjdCBpdGVtLCBpdCBpcyB2ZXJ5IHBvc3NpYmxlIGZvcgorICAgICAgICAgKiBubyBpbyB0byBiZSByZXF1aXJlZCB3aXRob3V0IHRoZXJlIGJlaW5nIGFuIGVycm9yLiAgT3IsIAorCSAqIHNvbWVvbmUgZWxzZSBjb3VsZCBoYXZlIGxvY2tlZCB0aGVtIGFuZCBzZW50IHRoZW0gZG93biB0aGUgCisJICogcGlwZSB3aXRob3V0IGxvY2tpbmcgdGhlIHBhZ2UKKwkgKi8KKwliaCA9IGhlYWQgOworCWRvIHsKKwkgICAgaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJICAgICAgICBwYXJ0aWFsID0gMTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJfSB3aGlsZShiaCAhPSBoZWFkKTsKKwlpZiAoIXBhcnRpYWwpCisJICAgIFNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwllbmRfcGFnZV93cml0ZWJhY2socGFnZSk7CisgICAgfQorICAgIHJldHVybiBlcnJvcjsKKworZmFpbDoKKyAgICAvKiBjYXRjaGVzIHZhcmlvdXMgZXJyb3JzLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBhbnkgdmFsaWQgZGlydHkgYmxvY2tzCisgICAgICogZ2V0IHRvIHRoZSBtZWRpYS4gIFRoZSBwYWdlIGlzIGN1cnJlbnRseSBsb2NrZWQgYW5kIG5vdCBtYXJrZWQgZm9yIAorICAgICAqIHdyaXRlYmFjaworICAgICAqLworICAgIENsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOworICAgIGJoID0gaGVhZDsKKyAgICBkbyB7CisJZ2V0X2JoKGJoKTsKKwlpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYnVmZmVyX2RpcnR5KGJoKSAmJiBiaC0+Yl9ibG9ja25yKSB7CisJICAgIGxvY2tfYnVmZmVyKGJoKTsKKwkgICAgbWFya19idWZmZXJfYXN5bmNfd3JpdGUoYmgpOworCX0gZWxzZSB7CisJICAgIC8qCisJICAgICAqIGNsZWFyIGFueSBkaXJ0eSBiaXRzIHRoYXQgbWlnaHQgaGF2ZSBjb21lIGZyb20gZ2V0dGluZworCSAgICAgKiBhdHRhY2hlZCB0byBhIGRpcnR5IHBhZ2UKKwkgICAgICovCisJICAgICBjbGVhcl9idWZmZXJfZGlydHkoYmgpOworCX0KKyAgICAgICAgYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisgICAgfSB3aGlsZShiaCAhPSBoZWFkKTsKKyAgICBTZXRQYWdlRXJyb3IocGFnZSk7CisgICAgQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOworICAgIHNldF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKyAgICB1bmxvY2tfcGFnZShwYWdlKTsKKyAgICBkbyB7CisgICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqbmV4dCA9IGJoLT5iX3RoaXNfcGFnZTsKKwlpZiAoYnVmZmVyX2FzeW5jX3dyaXRlKGJoKSkgeworCSAgICBjbGVhcl9idWZmZXJfZGlydHkoYmgpOworCSAgICBzdWJtaXRfYmgoV1JJVEUsIGJoKTsKKwkgICAgbnIrKzsKKwl9CisJcHV0X2JoKGJoKTsKKwliaCA9IG5leHQ7CisgICAgfSB3aGlsZShiaCAhPSBoZWFkKTsKKyAgICBnb3RvIGRvbmU7Cit9CisKKworc3RhdGljIGludCByZWlzZXJmc19yZWFkcGFnZSAoc3RydWN0IGZpbGUgKmYsIHN0cnVjdCBwYWdlICogcGFnZSkKK3sKKyAgICByZXR1cm4gYmxvY2tfcmVhZF9mdWxsX3BhZ2UgKHBhZ2UsIHJlaXNlcmZzX2dldF9ibG9jayk7Cit9CisKKworc3RhdGljIGludCByZWlzZXJmc193cml0ZXBhZ2UgKHN0cnVjdCBwYWdlICogcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3QgOworICAgIHJlaXNlcmZzX3dhaXRfb25fd3JpdGVfYmxvY2soaW5vZGUtPmlfc2IpIDsKKyAgICByZXR1cm4gcmVpc2VyZnNfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIHdiYykgOworfQorCitzdGF0aWMgaW50IHJlaXNlcmZzX3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmYsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pIHsKKyAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdCA7CisgICAgaW50IHJldDsKKyAgICBpbnQgb2xkX3JlZiA9IDA7CisKKyAgICByZWlzZXJmc193YWl0X29uX3dyaXRlX2Jsb2NrKGlub2RlLT5pX3NiKSA7CisgICAgZml4X3RhaWxfcGFnZV9mb3Jfd3JpdGluZyhwYWdlKSA7CisgICAgaWYgKHJlaXNlcmZzX3RyYW5zYWN0aW9uX3J1bm5pbmcoaW5vZGUtPmlfc2IpKSB7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGg7CisJdGggPSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqKWN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKyAgICAgICAgQlVHX09OICghdGgtPnRfcmVmY291bnQpOworICAgICAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJb2xkX3JlZiA9IHRoLT50X3JlZmNvdW50OworCXRoLT50X3JlZmNvdW50Kys7CisgICAgfQorCisgICAgcmV0ID0gYmxvY2tfcHJlcGFyZV93cml0ZShwYWdlLCBmcm9tLCB0bywgcmVpc2VyZnNfZ2V0X2Jsb2NrKSA7CisgICAgaWYgKHJldCAmJiByZWlzZXJmc190cmFuc2FjdGlvbl9ydW5uaW5nKGlub2RlLT5pX3NiKSkgeworICAgIAlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKwkvKiB0aGlzIGdldHMgYSBsaXR0bGUgdWdseS4gIElmIHJlaXNlcmZzX2dldF9ibG9jayByZXR1cm5lZCBhbgorCSAqIGVycm9yIGFuZCBsZWZ0IGEgdHJhbnNhY3N0aW9uIHJ1bm5pbmcsIHdlJ3ZlIGdvdCB0byBjbG9zZSBpdCwKKwkgKiBhbmQgd2UndmUgZ290IHRvIGZyZWUgaGFuZGxlIGlmIGl0IHdhcyBhIHBlcnNpc3RlbnQgdHJhbnNhY3Rpb24uCisJICoKKwkgKiBCdXQsIGlmIHdlIGhhZCBuZXN0ZWQgaW50byBhbiBleGlzdGluZyB0cmFuc2FjdGlvbiwgd2UgbmVlZAorCSAqIHRvIGp1c3QgZHJvcCB0aGUgcmVmIGNvdW50IG9uIHRoZSBoYW5kbGUuCisJICoKKwkgKiBJZiBvbGRfcmVmID09IDAsIHRoZSB0cmFuc2FjdGlvbiBpcyBmcm9tIHJlaXNlcmZzX2dldF9ibG9jaywKKwkgKiBhbmQgaXQgd2FzIGEgcGVyc2lzdGVudCB0cmFucy4gIE90aGVyd2lzZSwgaXQgd2FzIG5lc3RlZCBhYm92ZS4KKwkgKi8KKwlpZiAodGgtPnRfcmVmY291bnQgPiBvbGRfcmVmKSB7CisJICAgIGlmIChvbGRfcmVmKQorCSAgICAJdGgtPnRfcmVmY291bnQtLTsKKwkgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGVycjsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJCWVyciA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgICAgICAgICByZXQgPSBlcnI7CisJICAgIH0KKwl9CisgICAgfQorICAgIHJldHVybiByZXQ7CisKK30KKworCitzdGF0aWMgc2VjdG9yX3QgcmVpc2VyZnNfYW9wX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmFzLCBzZWN0b3JfdCBibG9jaykgeworICByZXR1cm4gZ2VuZXJpY19ibG9ja19ibWFwKGFzLCBibG9jaywgcmVpc2VyZnNfYm1hcCkgOworfQorCitzdGF0aWMgaW50IHJlaXNlcmZzX2NvbW1pdF93cml0ZShzdHJ1Y3QgZmlsZSAqZiwgc3RydWN0IHBhZ2UgKnBhZ2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pIHsKKyAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdCA7CisgICAgbG9mZl90IHBvcyA9ICgobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgdG87CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IHVwZGF0ZV9zZCA9IDA7CisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGggPSBOVUxMOworICAgIAorICAgIHJlaXNlcmZzX3dhaXRfb25fd3JpdGVfYmxvY2soaW5vZGUtPmlfc2IpIDsKKyAgICBpZiAocmVpc2VyZnNfdHJhbnNhY3Rpb25fcnVubmluZyhpbm9kZS0+aV9zYikpIHsKKyAgICAgICAgdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm87CisgICAgfQorICAgIHJlaXNlcmZzX2NvbW1pdF9wYWdlKGlub2RlLCBwYWdlLCBmcm9tLCB0byk7CisgCisgICAgLyogZ2VuZXJpY19jb21taXRfd3JpdGUgZG9lcyB0aGlzIGZvciB1cywgYnV0IGRvZXMgbm90IHVwZGF0ZSB0aGUKKyAgICAqKiB0cmFuc2FjdGlvbiB0cmFja2luZyBzdHVmZiB3aGVuIHRoZSBzaXplIGNoYW5nZXMuICBTbywgd2UgaGF2ZQorICAgICoqIHRvIGRvIHRoZSBpX3NpemUgdXBkYXRlcyBoZXJlLgorICAgICovCisgICAgaWYgKHBvcyA+IGlub2RlLT5pX3NpemUpIHsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIG15dGggOworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCS8qIElmIHRoZSBmaWxlIGhhdmUgZ3Jvd24gYmV5b25kIHRoZSBib3JkZXIgd2hlcmUgaXQKKwkgICBjYW4gaGF2ZSBhIHRhaWwsIHVubWFyayBpdCBhcyBuZWVkaW5nIGEgdGFpbAorCSAgIHBhY2tpbmcgKi8KKwlpZiAoIChoYXZlX2xhcmdlX3RhaWxzIChpbm9kZS0+aV9zYikgJiYgaW5vZGUtPmlfc2l6ZSA+IGlfYmxvY2tfc2l6ZSAoaW5vZGUpKjQpIHx8CisJICAgICAoaGF2ZV9zbWFsbF90YWlscyAoaW5vZGUtPmlfc2IpICYmIGlub2RlLT5pX3NpemUgPiBpX2Jsb2NrX3NpemUoaW5vZGUpKSApCisJICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICY9IH5pX3BhY2tfb25fY2xvc2VfbWFzayA7CisKKwlyZXQgPSBqb3VybmFsX2JlZ2luKCZteXRoLCBpbm9kZS0+aV9zYiwgMSkgOworCWlmIChyZXQpIHsKKwkgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkgICAgZ290byBqb3VybmFsX2Vycm9yOworCX0KKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKKwlpbm9kZS0+aV9zaXplID0gcG9zIDsKKwlyZWlzZXJmc191cGRhdGVfc2QoJm15dGgsIGlub2RlKSA7CisJdXBkYXRlX3NkID0gMTsKKwlyZXQgPSBqb3VybmFsX2VuZCgmbXl0aCwgaW5vZGUtPmlfc2IsIDEpIDsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCWlmIChyZXQpCisJICAgIGdvdG8gam91cm5hbF9lcnJvcjsKKyAgICB9CisgICAgaWYgKHRoKSB7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJaWYgKCF1cGRhdGVfc2QpCisJICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpIDsKKwlyZXQgPSByZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbih0aCk7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwlpZiAocmV0KQorCSAgICBnb3RvIG91dDsKKyAgICB9CisgCisgICAgLyogd2UgdGVzdCBmb3IgT19TWU5DIGhlcmUgc28gd2UgY2FuIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24KKyAgICAqKiBmb3IgYW55IHBhY2tlZCB0YWlscyB0aGUgZmlsZSBtaWdodCBoYXZlIGhhZAorICAgICovCisgICAgaWYgKGYgJiYgKGYtPmZfZmxhZ3MgJiBPX1NZTkMpKSB7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisgCXJldCA9IHJlaXNlcmZzX2NvbW1pdF9mb3JfaW5vZGUoaW5vZGUpIDsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworICAgIH0KK291dDoKKyAgICByZXR1cm4gcmV0IDsKKworam91cm5hbF9lcnJvcjoKKyAgICBpZiAodGgpIHsKKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwlpZiAoIXVwZGF0ZV9zZCkKKwkgICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSkgOworICAgICAgICByZXQgPSByZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbih0aCk7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIHNkX2F0dHJzX3RvX2lfYXR0cnMoIF9fdTE2IHNkX2F0dHJzLCBzdHJ1Y3QgaW5vZGUgKmlub2RlICkKK3sKKwlpZiggcmVpc2VyZnNfYXR0cnMoIGlub2RlIC0+IGlfc2IgKSApIHsKKwkJaWYoIHNkX2F0dHJzICYgUkVJU0VSRlNfU1lOQ19GTCApCisJCQlpbm9kZSAtPiBpX2ZsYWdzIHw9IFNfU1lOQzsKKwkJZWxzZQorCQkJaW5vZGUgLT4gaV9mbGFncyAmPSB+U19TWU5DOworCQlpZiggc2RfYXR0cnMgJiBSRUlTRVJGU19JTU1VVEFCTEVfRkwgKQorCQkJaW5vZGUgLT4gaV9mbGFncyB8PSBTX0lNTVVUQUJMRTsKKwkJZWxzZQorCQkJaW5vZGUgLT4gaV9mbGFncyAmPSB+U19JTU1VVEFCTEU7CisJCWlmKCBzZF9hdHRycyAmIFJFSVNFUkZTX0FQUEVORF9GTCApCisJCQlpbm9kZSAtPiBpX2ZsYWdzIHw9IFNfQVBQRU5EOworCQllbHNlCisJCQlpbm9kZSAtPiBpX2ZsYWdzICY9IH5TX0FQUEVORDsKKwkJaWYoIHNkX2F0dHJzICYgUkVJU0VSRlNfTk9BVElNRV9GTCApCisJCQlpbm9kZSAtPiBpX2ZsYWdzIHw9IFNfTk9BVElNRTsKKwkJZWxzZQorCQkJaW5vZGUgLT4gaV9mbGFncyAmPSB+U19OT0FUSU1FOworCQlpZiggc2RfYXR0cnMgJiBSRUlTRVJGU19OT1RBSUxfRkwgKQorCQkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgfD0gaV9ub3BhY2tfbWFzazsKKwkJZWxzZQorCQkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfmlfbm9wYWNrX21hc2s7CisJfQorfQorCit2b2lkIGlfYXR0cnNfdG9fc2RfYXR0cnMoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIF9fdTE2ICpzZF9hdHRycyApCit7CisJaWYoIHJlaXNlcmZzX2F0dHJzKCBpbm9kZSAtPiBpX3NiICkgKSB7CisJCWlmKCBpbm9kZSAtPiBpX2ZsYWdzICYgU19JTU1VVEFCTEUgKQorCQkJKnNkX2F0dHJzIHw9IFJFSVNFUkZTX0lNTVVUQUJMRV9GTDsKKwkJZWxzZQorCQkJKnNkX2F0dHJzICY9IH5SRUlTRVJGU19JTU1VVEFCTEVfRkw7CisJCWlmKCBpbm9kZSAtPiBpX2ZsYWdzICYgU19TWU5DICkKKwkJCSpzZF9hdHRycyB8PSBSRUlTRVJGU19TWU5DX0ZMOworCQllbHNlCisJCQkqc2RfYXR0cnMgJj0gflJFSVNFUkZTX1NZTkNfRkw7CisJCWlmKCBpbm9kZSAtPiBpX2ZsYWdzICYgU19OT0FUSU1FICkKKwkJCSpzZF9hdHRycyB8PSBSRUlTRVJGU19OT0FUSU1FX0ZMOworCQllbHNlCisJCQkqc2RfYXR0cnMgJj0gflJFSVNFUkZTX05PQVRJTUVfRkw7CisJCWlmKCBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfbm9wYWNrX21hc2sgKQorCQkJKnNkX2F0dHJzIHw9IFJFSVNFUkZTX05PVEFJTF9GTDsKKwkJZWxzZQorCQkJKnNkX2F0dHJzICY9IH5SRUlTRVJGU19OT1RBSUxfRkw7CisJfQorfQorCisvKiBkZWNpZGUgaWYgdGhpcyBidWZmZXIgbmVlZHMgdG8gc3RheSBhcm91bmQgZm9yIGRhdGEgbG9nZ2luZyBvciBvcmRlcmVkCisqKiB3cml0ZSBwdXJwb3NlcworKi8KK3N0YXRpYyBpbnQgaW52YWxpZGF0ZXBhZ2VfY2FuX2Ryb3Aoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKyAgICBpbnQgcmV0ID0gMSA7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmogPSBTQl9KT1VSTkFMKGlub2RlLT5pX3NiKSA7CisKKyAgICBzcGluX2xvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKSA7CisgICAgaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkgeworICAgICAgICBnb3RvIGZyZWVfamg7CisgICAgfQorICAgIC8qIHRoZSBwYWdlIGlzIGxvY2tlZCwgYW5kIHRoZSBvbmx5IHBsYWNlcyB0aGF0IGxvZyBhIGRhdGEgYnVmZmVyCisgICAgICogYWxzbyBsb2NrIHRoZSBwYWdlLgorICAgICAqLworICAgIGlmIChyZWlzZXJmc19maWxlX2RhdGFfbG9nKGlub2RlKSkgeworCS8qCisJICogdmVyeSBjb25zZXJ2YXRpdmUsIGxlYXZlIHRoZSBidWZmZXIgcGlubmVkIGlmCisJICogYW55b25lIG1pZ2h0IG5lZWQgaXQuCisJICovCisgICAgICAgIGlmIChidWZmZXJfam91cm5hbGVkKGJoKSB8fCBidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpIHsKKwkgICAgcmV0ID0gMCA7CisJfQorICAgIH0gZWxzZQorICAgIGlmIChidWZmZXJfZGlydHkoYmgpIHx8IGJ1ZmZlcl9sb2NrZWQoYmgpKSB7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7CisJc3RydWN0IHJlaXNlcmZzX2poICpqaCA9IGJoLT5iX3ByaXZhdGU7CisKKwkvKiB3aHkgaXMgdGhpcyBzYWZlPworCSAqIHJlaXNlcmZzX3NldGF0dHIgdXBkYXRlcyBpX3NpemUgaW4gdGhlIG9uIGRpc2sKKwkgKiBzdGF0IGRhdGEgYmVmb3JlIGFsbG93aW5nIHZtdHJ1bmNhdGUgdG8gYmUgY2FsbGVkLgorCSAqCisJICogSWYgYnVmZmVyIHdhcyBwdXQgb250byB0aGUgb3JkZXJlZCBsaXN0IGZvciB0aGlzCisJICogdHJhbnNhY3Rpb24sIHdlIGtub3cgZm9yIHN1cmUgZWl0aGVyIHRoaXMgdHJhbnNhY3Rpb24KKwkgKiBvciBhbiBvbGRlciBvbmUgYWxyZWFkeSBoYXMgdXBkYXRlZCBpX3NpemUgb24gZGlzaywKKwkgKiBhbmQgdGhpcyBvcmRlcmVkIGRhdGEgd29uJ3QgYmUgcmVmZXJlbmNlZCBpbiB0aGUgZmlsZQorCSAqIGlmIHdlIGNyYXNoLgorCSAqCisJICogaWYgdGhlIGJ1ZmZlciB3YXMgcHV0IG9udG8gdGhlIG9yZGVyZWQgbGlzdCBmb3IgYW4gb2xkZXIKKwkgKiB0cmFuc2FjdGlvbiwgd2UgbmVlZCB0byBsZWF2ZSBpdCBhcm91bmQKKwkgKi8KKwlpZiAoamggJiYgKGpsID0gamgtPmpsKSAmJiBqbCAhPSBTQl9KT1VSTkFMKGlub2RlLT5pX3NiKS0+al9jdXJyZW50X2psKQorCSAgICByZXQgPSAwOworICAgIH0KK2ZyZWVfamg6CisgICAgaWYgKHJldCAmJiBiaC0+Yl9wcml2YXRlKSB7CisgICAgICAgIHJlaXNlcmZzX2ZyZWVfamgoYmgpOworICAgIH0KKyAgICBzcGluX3VubG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spIDsKKyAgICByZXR1cm4gcmV0IDsKK30KKworLyogY2xtIC0tIHRha2VuIGZyb20gZnMvYnVmZmVyLmM6YmxvY2tfaW52YWxpZGF0ZV9wYWdlICovCitzdGF0aWMgaW50IHJlaXNlcmZzX2ludmFsaWRhdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsICpiaCwgKm5leHQ7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisgICAgdW5zaWduZWQgaW50IGN1cnJfb2ZmID0gMDsKKyAgICBpbnQgcmV0ID0gMTsKKworICAgIEJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisKKyAgICBpZiAob2Zmc2V0ID09IDApCisJQ2xlYXJQYWdlQ2hlY2tlZChwYWdlKTsKKworICAgIGlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwlnb3RvIG91dDsKKworICAgIGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisgICAgYmggPSBoZWFkOworICAgIGRvIHsKKwl1bnNpZ25lZCBpbnQgbmV4dF9vZmYgPSBjdXJyX29mZiArIGJoLT5iX3NpemU7CisJbmV4dCA9IGJoLT5iX3RoaXNfcGFnZTsKKworCS8qCisJICogaXMgdGhpcyBibG9jayBmdWxseSBpbnZhbGlkYXRlZD8KKwkgKi8KKwlpZiAob2Zmc2V0IDw9IGN1cnJfb2ZmKSB7CisJICAgIGlmIChpbnZhbGlkYXRlcGFnZV9jYW5fZHJvcChpbm9kZSwgYmgpKQorCQlyZWlzZXJmc191bm1hcF9idWZmZXIoYmgpOworCSAgICBlbHNlCisJICAgICAgICByZXQgPSAwOworCX0KKwljdXJyX29mZiA9IG5leHRfb2ZmOworCWJoID0gbmV4dDsKKyAgICB9IHdoaWxlIChiaCAhPSBoZWFkKTsKKworICAgIC8qCisgICAgICogV2UgcmVsZWFzZSBidWZmZXJzIG9ubHkgaWYgdGhlIGVudGlyZSBwYWdlIGlzIGJlaW5nIGludmFsaWRhdGVkLgorICAgICAqIFRoZSBnZXRfYmxvY2sgY2FjaGVkIHZhbHVlIGhhcyBiZWVuIHVuY29uZGl0aW9uYWxseSBpbnZhbGlkYXRlZCwKKyAgICAgKiBzbyByZWFsIElPIGlzIG5vdCBwb3NzaWJsZSBhbnltb3JlLgorICAgICAqLworICAgIGlmICghb2Zmc2V0ICYmIHJldCkKKwlyZXQgPSB0cnlfdG9fcmVsZWFzZV9wYWdlKHBhZ2UsIDApOworb3V0OgorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfc2V0X3BhZ2VfZGlydHkoc3RydWN0IHBhZ2UgKnBhZ2UpIHsKKyAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKyAgICBpZiAocmVpc2VyZnNfZmlsZV9kYXRhX2xvZyhpbm9kZSkpIHsKKwlTZXRQYWdlQ2hlY2tlZChwYWdlKTsKKwlyZXR1cm4gX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMocGFnZSk7CisgICAgfQorICAgIHJldHVybiBfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnMocGFnZSk7Cit9CisKKy8qCisgKiBSZXR1cm5zIDEgaWYgdGhlIHBhZ2UncyBidWZmZXJzIHdlcmUgZHJvcHBlZC4gIFRoZSBwYWdlIGlzIGxvY2tlZC4KKyAqCisgKiBUYWtlcyBqX2RpcnR5X2J1ZmZlcnNfbG9jayB0byBwcm90ZWN0IHRoZSBiX2Fzc29jX2J1ZmZlcnMgbGlzdF9oZWFkcworICogaW4gdGhlIGJ1ZmZlcnMgYXQgcGFnZV9idWZmZXJzKHBhZ2UpLgorICoKKyAqIGV2ZW4gaW4gLW8gbm90YWlsIG1vZGUsIHdlIGNhbid0IGJlIHN1cmUgYW4gb2xkIG1vdW50IHdpdGhvdXQgLW8gbm90YWlsCisgKiBkaWRuJ3QgY3JlYXRlIGZpbGVzIHdpdGggdGFpbHMuCisgKi8KK3N0YXRpYyBpbnQgcmVpc2VyZnNfcmVsZWFzZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCB1bnVzZWRfZ2ZwX2ZsYWdzKQoreworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0IDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiA9IFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpIDsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQgOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmggOworICAgIGludCByZXQgPSAxIDsKKworICAgIFdBUk5fT04oUGFnZUNoZWNrZWQocGFnZSkpOworICAgIHNwaW5fbG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spIDsKKyAgICBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpIDsKKyAgICBiaCA9IGhlYWQgOworICAgIGRvIHsKKwlpZiAoYmgtPmJfcHJpdmF0ZSkgeworCSAgICBpZiAoIWJ1ZmZlcl9kaXJ0eShiaCkgJiYgIWJ1ZmZlcl9sb2NrZWQoYmgpKSB7CisJCXJlaXNlcmZzX2ZyZWVfamgoYmgpOworCSAgICB9IGVsc2UgeworCQlyZXQgPSAwIDsKKwkJYnJlYWsgOworCSAgICB9CisJfQorCWJoID0gYmgtPmJfdGhpc19wYWdlIDsKKyAgICB9IHdoaWxlIChiaCAhPSBoZWFkKSA7CisgICAgaWYgKHJldCkKKwlyZXQgPSB0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpIDsKKyAgICBzcGluX3VubG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spIDsKKyAgICByZXR1cm4gcmV0IDsKK30KKworLyogV2UgdGhhbmsgTWluZ21pbmcgQ2FvIGZvciBoZWxwaW5nIHVzIHVuZGVyc3RhbmQgaW4gZ3JlYXQgZGV0YWlsIHdoYXQKKyAgIHRvIGRvIGluIHRoaXMgc2VjdGlvbiBvZiB0aGUgY29kZS4gKi8KK3N0YXRpYyBzc2l6ZV90IHJlaXNlcmZzX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwKKwkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKK3sKKyAgICBzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKworICAgIHJldHVybiBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpbm9kZS0+aV9zYi0+c19iZGV2LCBpb3YsCisJCQlvZmZzZXQsIG5yX3NlZ3MsIHJlaXNlcmZzX2dldF9ibG9ja3NfZGlyZWN0X2lvLCBOVUxMKTsKK30KKworaW50IHJlaXNlcmZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpIHsKKyAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlIDsKKyAgICBpbnQgZXJyb3IgOworICAgIHVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHItPmlhX3ZhbGlkOworICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworICAgIGlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkgeworCS8qIHZlcnNpb24gMiBpdGVtcyB3aWxsIGJlIGNhdWdodCBieSB0aGUgc19tYXhieXRlcyBjaGVjaworCSoqIGRvbmUgZm9yIHVzIGluIHZtdHJ1bmNhdGUKKwkqLworCWlmIChnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSkgPT0gS0VZX0ZPUk1BVF8zXzUgJiYKKwkgICAgYXR0ci0+aWFfc2l6ZSA+IE1BWF9OT05fTEZTKSB7CisJICAgIGVycm9yID0gLUVGQklHIDsKKwkgICAgZ290byBvdXQ7CisJfQorCS8qIGZpbGwgaW4gaG9sZSBwb2ludGVycyBpbiB0aGUgZXhwYW5kaW5nIHRydW5jYXRlIGNhc2UuICovCisgICAgICAgIGlmIChhdHRyLT5pYV9zaXplID4gaW5vZGUtPmlfc2l6ZSkgeworCSAgICBlcnJvciA9IGdlbmVyaWNfY29udF9leHBhbmQoaW5vZGUsIGF0dHItPmlhX3NpemUpIDsKKwkgICAgaWYgKFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50ID4gMCkgeworCQlpbnQgZXJyOworCQlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKKwkJLyogd2UncmUgY2hhbmdpbmcgYXQgbW9zdCAyIGJpdG1hcHMsIGlub2RlICsgc3VwZXIgKi8KKwkJZXJyID0gam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCA0KSA7CisJCWlmICghZXJyKSB7CisJCSAgICByZWlzZXJmc19kaXNjYXJkX3ByZWFsbG9jICgmdGgsIGlub2RlKTsKKwkJICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIDQpIDsKKwkJfQorCQlpZiAoZXJyKQorCQkgICAgZXJyb3IgPSBlcnI7CisJICAgIH0KKwkgICAgaWYgKGVycm9yKQorCSAgICAgICAgZ290byBvdXQ7CisJfQorICAgIH0KKworICAgIGlmICgoKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKSAmJiAoYXR0ci0+aWFfdWlkICYgfjB4ZmZmZikpIHx8CisJICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCkgJiYgKGF0dHItPmlhX2dpZCAmIH4weGZmZmYpKSkgJiYKKwkoZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGlub2RlKSA9PSBTVEFUX0RBVEFfVjEpKSB7CisJCS8qIHN0YXQgZGF0YSBvZiBmb3JtYXQgdjMuNSBoYXMgMTYgYml0IHVpZCBhbmQgZ2lkICovCisJICAgIGVycm9yID0gLUVJTlZBTDsKKwkgICAgZ290byBvdXQ7CisJfQorCisgICAgZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGF0dHIpIDsKKyAgICBpZiAoIWVycm9yKSB7CisJaWYgKChpYV92YWxpZCAmIEFUVFJfVUlEICYmIGF0dHItPmlhX3VpZCAhPSBpbm9kZS0+aV91aWQpIHx8CisJICAgIChpYV92YWxpZCAmIEFUVFJfR0lEICYmIGF0dHItPmlhX2dpZCAhPSBpbm9kZS0+aV9naWQpKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSByZWlzZXJmc19jaG93bl94YXR0cnMgKGlub2RlLCBhdHRyKTsKKworICAgICAgICAgICAgICAgIGlmICghZXJyb3IpIHsKKwkJICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisKKwkJICAgIC8qICh1c2VyK2dyb3VwKSoob2xkK25ldykgc3RydWN0dXJlIC0gd2UgY291bnQgcXVvdGEgaW5mbyBhbmQgLCBpbm9kZSB3cml0ZSAoc2IsIGlub2RlKSAqLworCQkgICAgam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCA0KlJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKzIpOworICAgICAgICAgICAgICAgICAgICBlcnJvciA9IERRVU9UX1RSQU5TRkVSKGlub2RlLCBhdHRyKSA/IC1FRFFVT1QgOiAwOworCQkgICAgaWYgKGVycm9yKSB7CisJCQlqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCA0KlJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKzIpOworCQkJZ290byBvdXQ7CisJCSAgICB9CisJCSAgICAvKiBVcGRhdGUgY29ycmVzcG9uZGluZyBpbmZvIGluIGlub2RlIHNvIHRoYXQgZXZlcnl0aGluZyBpcyBpbgorCQkgICAgICogb25lIHRyYW5zYWN0aW9uICovCisJCSAgICBpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCkKKwkJCWlub2RlLT5pX3VpZCA9IGF0dHItPmlhX3VpZDsKKwkJICAgIGlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfR0lEKQorCQkJaW5vZGUtPmlfZ2lkID0gYXR0ci0+aWFfZ2lkOworCQkgICAgbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCSAgICBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCA0KlJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKzIpOworCQl9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFlcnJvcikKKyAgICAgICAgICAgIGVycm9yID0gaW5vZGVfc2V0YXR0cihpbm9kZSwgYXR0cikgOworICAgIH0KKworCisgICAgaWYgKCFlcnJvciAmJiByZWlzZXJmc19wb3NpeGFjbCAoaW5vZGUtPmlfc2IpKSB7CisgICAgICAgIGlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkKKyAgICAgICAgICAgIGVycm9yID0gcmVpc2VyZnNfYWNsX2NobW9kIChpbm9kZSk7CisgICAgfQorCitvdXQ6CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKyAgICByZXR1cm4gZXJyb3IgOworfQorCisKKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyByZWlzZXJmc19hZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgPSB7CisgICAgLndyaXRlcGFnZSA9IHJlaXNlcmZzX3dyaXRlcGFnZSwKKyAgICAucmVhZHBhZ2UgPSByZWlzZXJmc19yZWFkcGFnZSwgCisgICAgLnJlYWRwYWdlcyA9IHJlaXNlcmZzX3JlYWRwYWdlcywgCisgICAgLnJlbGVhc2VwYWdlID0gcmVpc2VyZnNfcmVsZWFzZXBhZ2UsCisgICAgLmludmFsaWRhdGVwYWdlID0gcmVpc2VyZnNfaW52YWxpZGF0ZXBhZ2UsCisgICAgLnN5bmNfcGFnZSA9IGJsb2NrX3N5bmNfcGFnZSwKKyAgICAucHJlcGFyZV93cml0ZSA9IHJlaXNlcmZzX3ByZXBhcmVfd3JpdGUsCisgICAgLmNvbW1pdF93cml0ZSA9IHJlaXNlcmZzX2NvbW1pdF93cml0ZSwKKyAgICAuYm1hcCA9IHJlaXNlcmZzX2FvcF9ibWFwLAorICAgIC5kaXJlY3RfSU8gPSByZWlzZXJmc19kaXJlY3RfSU8sCisgICAgLnNldF9wYWdlX2RpcnR5ID0gcmVpc2VyZnNfc2V0X3BhZ2VfZGlydHksCit9IDsKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2lvY3RsLmMgYi9mcy9yZWlzZXJmcy9pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZGM0MjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy9pb2N0bC5jCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDAgYnkgSGFucyBSZWlzZXIsIGxpY2Vuc2luZyBnb3Zlcm5lZCBieSByZWlzZXJmcy9SRUFETUUKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCitzdGF0aWMgaW50IHJlaXNlcmZzX3VucGFjayAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCk7CisKKy8qCisqKiByZWlzZXJmc19pb2N0bCAtIGhhbmRsZXIgZm9yIGlvY3RsIGZvciBpbm9kZQorKiogc3VwcG9ydGVkIGNvbW1hbmRzOgorKiogIDEpIFJFSVNFUkZTX0lPQ19VTlBBQ0sgLSB0cnkgdG8gdW5wYWNrIHRhaWwgZnJvbSBkaXJlY3QgaXRlbSBpbnRvIGluZGlyZWN0CisqKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBwcmV2ZW50IHBhY2tpbmcgZmlsZSAoYXJndW1lbnQgYXJnIGhhcyB0byBiZSBub24temVybykKKyoqICAyKSBSRUlTRVJGU19JT0NfW0dTXUVURkxBR1MsIFJFSVNFUkZTX0lPQ19bR1NdRVRWRVJTSU9OCisqKiAgMykgVGhhdCdzIGFsbCBmb3IgYSB3aGlsZSAuLi4KKyovCitpbnQgcmVpc2VyZnNfaW9jdGwgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGludCBmbGFnczsKKworCXN3aXRjaCAoY21kKSB7CisJICAgIGNhc2UgUkVJU0VSRlNfSU9DX1VOUEFDSzoKKwkJaWYoIFNfSVNSRUcoIGlub2RlIC0+IGlfbW9kZSApICkgeworCQlpZiAoYXJnKQorCQkgICAgcmV0dXJuIHJlaXNlcmZzX3VucGFjayAoaW5vZGUsIGZpbHApOworCQkJZWxzZQorCQkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCXJldHVybiAtRU5PVFRZOworCS8qIGZvbGxvd2luZyB0d28gY2FzZXMgYXJlIHRha2VuIGZyb20gZnMvZXh0Mi9pb2N0bC5jIGJ5IFJlbXkKKwkgICBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKSAqLworCWNhc2UgUkVJU0VSRlNfSU9DX0dFVEZMQUdTOgorCQlmbGFncyA9IFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfYXR0cnM7CisJCWlfYXR0cnNfdG9fc2RfYXR0cnMoIGlub2RlLCAoIF9fdTE2ICogKSAmZmxhZ3MgKTsKKwkJcmV0dXJuIHB1dF91c2VyKGZsYWdzLCAoaW50IF9fdXNlciAqKSBhcmcpOworCWNhc2UgUkVJU0VSRlNfSU9DX1NFVEZMQUdTOiB7CisJCWlmIChJU19SRE9OTFkoaW5vZGUpKQorCQkJcmV0dXJuIC1FUk9GUzsKKworCQlpZiAoKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCkgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChnZXRfdXNlcihmbGFncywgKGludCBfX3VzZXIgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmICggKCAoIGZsYWdzIF4gUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9hdHRycykgJiAoIFJFSVNFUkZTX0lNTVVUQUJMRV9GTCB8IFJFSVNFUkZTX0FQUEVORF9GTCkpICYmCisJCSAgICAgIWNhcGFibGUoIENBUF9MSU5VWF9JTU1VVEFCTEUgKSApCisJCQlyZXR1cm4gLUVQRVJNOworCQkJCisJCWlmKCAoIGZsYWdzICYgUkVJU0VSRlNfTk9UQUlMX0ZMICkgJiYKKwkJICAgIFNfSVNSRUcoIGlub2RlIC0+IGlfbW9kZSApICkgeworCQkJCWludCByZXN1bHQ7CisKKwkJCQlyZXN1bHQgPSByZWlzZXJmc191bnBhY2soIGlub2RlLCBmaWxwICk7CisJCQkJaWYoIHJlc3VsdCApCisJCQkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJc2RfYXR0cnNfdG9faV9hdHRycyggZmxhZ3MsIGlub2RlICk7CisJCVJFSVNFUkZTX0koaW5vZGUpIC0+IGlfYXR0cnMgPSBmbGFnczsKKwkJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgUkVJU0VSRlNfSU9DX0dFVFZFUlNJT046CisJCXJldHVybiBwdXRfdXNlcihpbm9kZS0+aV9nZW5lcmF0aW9uLCAoaW50IF9fdXNlciAqKSBhcmcpOworCWNhc2UgUkVJU0VSRlNfSU9DX1NFVFZFUlNJT046CisJCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChJU19SRE9OTFkoaW5vZGUpKQorCQkJcmV0dXJuIC1FUk9GUzsKKwkJaWYgKGdldF91c2VyKGlub2RlLT5pX2dlbmVyYXRpb24sIChpbnQgX191c2VyICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsJCisJCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KK30KKworLyoKKyoqIHJlaXNlcmZzX3VucGFjaworKiogRnVuY3Rpb24gdHJ5IHRvIGNvbnZlcnQgdGFpbCBmcm9tIGRpcmVjdCBpdGVtIGludG8gaW5kaXJlY3QuCisqKiBJdCBzZXQgdXAgbm9wYWNrIGF0dHJpYnV0ZSBpbiB0aGUgUkVJU0VSRlNfSShpbm9kZSktPm5vcGFjaworKi8KK3N0YXRpYyBpbnQgcmVpc2VyZnNfdW5wYWNrIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworICAgIGludCByZXR2YWwgPSAwOworICAgIGludCBpbmRleCA7CisgICAgc3RydWN0IHBhZ2UgKnBhZ2UgOworICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nIDsKKyAgICB1bnNpZ25lZCBsb25nIHdyaXRlX2Zyb20gOworICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDsKKyAgICAJCisgICAgaWYgKGlub2RlLT5pX3NpemUgPT0gMCkgeworICAgICAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX25vcGFja19tYXNrOworICAgICAgICByZXR1cm4gMCA7CisgICAgfQorICAgIC8qIGlvY3RsIGFscmVhZHkgZG9uZSAqLworICAgIGlmIChSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfbm9wYWNrX21hc2spIHsKKyAgICAgICAgcmV0dXJuIDAgOworICAgIH0KKyAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKworICAgIC8qIHdlIG5lZWQgdG8gbWFrZSBzdXJlIG5vYm9keSBpcyBjaGFuZ2luZyB0aGUgZmlsZSBzaXplIGJlbmVhdGgKKyAgICAqKiB1cworICAgICovCisgICAgZG93bigmaW5vZGUtPmlfc2VtKSA7CisKKyAgICB3cml0ZV9mcm9tID0gaW5vZGUtPmlfc2l6ZSAmIChibG9ja3NpemUgLSAxKSA7CisgICAgLyogaWYgd2UgYXJlIG9uIGEgYmxvY2sgYm91bmRhcnksIHdlIGFyZSBhbHJlYWR5IHVucGFja2VkLiAgKi8KKyAgICBpZiAoIHdyaXRlX2Zyb20gPT0gMCkgeworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfbm9wYWNrX21hc2s7CisJZ290byBvdXQgOworICAgIH0KKworICAgIC8qIHdlIHVucGFjayBieSBmaW5kaW5nIHRoZSBwYWdlIHdpdGggdGhlIHRhaWwsIGFuZCBjYWxsaW5nCisgICAgKiogcmVpc2VyZnNfcHJlcGFyZV93cml0ZSBvbiB0aGF0IHBhZ2UuICBUaGlzIHdpbGwgZm9yY2UgYSAKKyAgICAqKiByZWlzZXJmc19nZXRfYmxvY2sgdG8gdW5wYWNrIHRoZSB0YWlsIGZvciB1cy4KKyAgICAqLworICAgIGluZGV4ID0gaW5vZGUtPmlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUIDsKKyAgICBtYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZyA7CisgICAgcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCkgOworICAgIHJldHZhbCA9IC1FTk9NRU07CisgICAgaWYgKCFwYWdlKSB7CisgICAgICAgIGdvdG8gb3V0IDsKKyAgICB9CisgICAgcmV0dmFsID0gbWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgcGFnZSwgd3JpdGVfZnJvbSwgd3JpdGVfZnJvbSkgOworICAgIGlmIChyZXR2YWwpCisgICAgICAgIGdvdG8gb3V0X3VubG9jayA7CisKKyAgICAvKiBjb252ZXJzaW9uIGNhbiBjaGFuZ2UgcGFnZSBjb250ZW50cywgbXVzdCBmbHVzaCAqLworICAgIGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpIDsKKyAgICByZXR2YWwgPSBtYXBwaW5nLT5hX29wcy0+Y29tbWl0X3dyaXRlKE5VTEwsIHBhZ2UsIHdyaXRlX2Zyb20sIHdyaXRlX2Zyb20pIDsKKyAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX25vcGFja19tYXNrOworCitvdXRfdW5sb2NrOgorICAgIHVubG9ja19wYWdlKHBhZ2UpIDsKKyAgICBwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSkgOworCitvdXQ6CisgICAgdXAoJmlub2RlLT5pX3NlbSkgOworICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisgICAgcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2l0ZW1fb3BzLmMgYi9mcy9yZWlzZXJmcy9pdGVtX29wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZjdjMTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy9pdGVtX29wcy5jCkBAIC0wLDAgKzEsNzg4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAgYnkgSGFucyBSZWlzZXIsIGxpY2Vuc2luZyBnb3Zlcm5lZCBieSByZWlzZXJmcy9SRUFETUUKKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisKKy8vIHRoaXMgY29udGFpbnMgaXRlbSBoYW5kbGVycyBmb3Igb2xkIGl0ZW0gdHlwZXM6IHNkLCBkaXJlY3QsCisvLyBpbmRpcmVjdCwgZGlyZWN0b3J5CisKKy8qIGFuZCB3aGVyZSBhcmUgdGhlIGNvbW1lbnRzPyBob3cgYWJvdXQgc2F5aW5nIHdoZXJlIHdlIGNhbiBmaW5kIGFuCisgICBleHBsYW5hdGlvbiBvZiBlYWNoIGl0ZW0gaGFuZGxlciBtZXRob2Q/IC1IYW5zICovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gc3RhdCBkYXRhIGZ1bmN0aW9ucworLy8KK3N0YXRpYyBpbnQgc2RfYnl0ZXNfbnVtYmVyIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGludCBibG9ja19zaXplKQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2RfZGVjcmVtZW50X2tleSAoc3RydWN0IGNwdV9rZXkgKiBrZXkpCit7CisgICAga2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkIC0tOworICAgIHNldF9jcHVfa2V5X2tfdHlwZSAoa2V5LCBUWVBFX0FOWSk7CisgICAgc2V0X2NwdV9rZXlfa19vZmZzZXQoa2V5LCAobG9mZl90KSgtMSkpOworfQorCitzdGF0aWMgaW50IHNkX2lzX2xlZnRfbWVyZ2VhYmxlIChzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5LCB1bnNpZ25lZCBsb25nIGJzaXplKQoreworICAgIHJldHVybiAwOworfQorCisKKworc3RhdGljIGNoYXIgKiBwcmludF90aW1lICh0aW1lX3QgdCkKK3sKKyAgICBzdGF0aWMgY2hhciB0aW1lYnVmWzI1Nl07CisKKyAgICBzcHJpbnRmICh0aW1lYnVmLCAiJWxkIiwgdCk7CisgICAgcmV0dXJuIHRpbWVidWY7Cit9CisKKworc3RhdGljIHZvaWQgc2RfcHJpbnRfaXRlbSAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBjaGFyICogaXRlbSkKK3sKKyAgICBwcmludGsgKCJcdG1vZGUgfCBzaXplIHwgbmxpbmtzIHwgZmlyc3QgZGlyZWN0IHwgbXRpbWVcbiIpOworICAgIGlmIChzdGF0X2RhdGFfdjEgKGloKSkgeworICAgICAgCXN0cnVjdCBzdGF0X2RhdGFfdjEgKiBzZCA9IChzdHJ1Y3Qgc3RhdF9kYXRhX3YxICopaXRlbTsKKworCXByaW50ayAoIlx0MCUtNm8gfCAlNnUgfCAlMnUgfCAlZCB8ICVzXG4iLCBzZF92MV9tb2RlKHNkKSwKKyAgICAgICAgICAgICAgICBzZF92MV9zaXplKHNkKSwgc2RfdjFfbmxpbmsoc2QpLCBzZF92MV9maXJzdF9kaXJlY3RfYnl0ZShzZCksCisgICAgICAgICAgICAgICAgcHJpbnRfdGltZSggc2RfdjFfbXRpbWUoc2QpICkgKTsKKyAgICB9IGVsc2UgeworCXN0cnVjdCBzdGF0X2RhdGEgKiBzZCA9IChzdHJ1Y3Qgc3RhdF9kYXRhICopaXRlbTsKKworCXByaW50ayAoIlx0MCUtNm8gfCAlNkx1IHwgJTJ1IHwgJWQgfCAlc1xuIiwgc2RfdjJfbW9kZShzZCksCisgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNkX3YyX3NpemUoc2QpLCBzZF92Ml9ubGluayhzZCksCisgICAgICAgICAgICBzZF92Ml9yZGV2KHNkKSwgcHJpbnRfdGltZShzZF92Ml9tdGltZShzZCkpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNkX2NoZWNrX2l0ZW0gKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgY2hhciAqIGl0ZW0pCit7CisgICAgLy8gRklYTUU6IHR5cGUgc29tZXRoaW5nIGhlcmUhCit9CisKKworc3RhdGljIGludCBzZF9jcmVhdGVfdmkgKHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biwKKwkJCSBzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIAorCQkJIGludCBpc19hZmZlY3RlZCwgCisJCQkgaW50IGluc2VydF9zaXplKQoreworICAgIHZpLT52aV9pbmRleCA9IFRZUEVfU1RBVF9EQVRBOworICAgIC8vdmktPnZpX3R5cGUgfD0gVklfVFlQRV9TVEFUX0RBVEE7Ly8gbm90IG5lZWRlZD8KKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNkX2NoZWNrX2xlZnQgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyZWUsIAorCQkJICBpbnQgc3RhcnRfc2tpcCwgaW50IGVuZF9za2lwKQoreworICAgIGlmIChzdGFydF9za2lwIHx8IGVuZF9za2lwKQorCUJVRyAoKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKworc3RhdGljIGludCBzZF9jaGVja19yaWdodCAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSkKK3sKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgc2RfcGFydF9zaXplIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmaXJzdCwgaW50IGNvdW50KQoreworICAgIGlmIChjb3VudCkKKwlCVUcgKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RfdW5pdF9udW0gKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSkKK3sKKyAgICByZXR1cm4gdmktPnZpX2l0ZW1fbGVuIC0gSUhfU0laRTsKK30KKworCitzdGF0aWMgdm9pZCBzZF9wcmludF92aSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpKQoreworICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJTVEFUREFUQSwgaW5kZXggJWQsIHR5cGUgMHgleCwgJWgiLAorCQkgICAgICB2aS0+dmlfaW5kZXgsIHZpLT52aV90eXBlLCB2aS0+dmlfaWgpOworfQorCitzdGF0aWMgc3RydWN0IGl0ZW1fb3BlcmF0aW9ucyBzdGF0X2RhdGFfb3BzID0geworCS5ieXRlc19udW1iZXIJCT0gc2RfYnl0ZXNfbnVtYmVyLAorCS5kZWNyZW1lbnRfa2V5CQk9IHNkX2RlY3JlbWVudF9rZXksCisJLmlzX2xlZnRfbWVyZ2VhYmxlCT0gc2RfaXNfbGVmdF9tZXJnZWFibGUsCisJLnByaW50X2l0ZW0JCT0gc2RfcHJpbnRfaXRlbSwKKwkuY2hlY2tfaXRlbQkJPSBzZF9jaGVja19pdGVtLAorCisJLmNyZWF0ZV92aQkJPSBzZF9jcmVhdGVfdmksCisJLmNoZWNrX2xlZnQJCT0gc2RfY2hlY2tfbGVmdCwKKwkuY2hlY2tfcmlnaHQJCT0gc2RfY2hlY2tfcmlnaHQsCisJLnBhcnRfc2l6ZQkJPSBzZF9wYXJ0X3NpemUsCisJLnVuaXRfbnVtCQk9IHNkX3VuaXRfbnVtLAorCS5wcmludF92aQkJPSBzZF9wcmludF92aQorfTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gZGlyZWN0IGl0ZW0gZnVuY3Rpb25zCisvLworc3RhdGljIGludCBkaXJlY3RfYnl0ZXNfbnVtYmVyIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGludCBibG9ja19zaXplKQoreworICByZXR1cm4gaWhfaXRlbV9sZW4oaWgpOworfQorCisKKy8vIEZJWE1FOiB0aGlzIHNob3VsZCBwcm9iYWJseSBzd2l0Y2ggdG8gaW5kaXJlY3QgYXMgd2VsbAorc3RhdGljIHZvaWQgZGlyZWN0X2RlY3JlbWVudF9rZXkgKHN0cnVjdCBjcHVfa2V5ICoga2V5KQoreworICAgIGNwdV9rZXlfa19vZmZzZXRfZGVjIChrZXkpOworICAgIGlmIChjcHVfa2V5X2tfb2Zmc2V0IChrZXkpID09IDApCisJc2V0X2NwdV9rZXlfa190eXBlIChrZXksIFRZUEVfU1RBVF9EQVRBKTsJCit9CisKKworc3RhdGljIGludCBkaXJlY3RfaXNfbGVmdF9tZXJnZWFibGUgKHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXksIHVuc2lnbmVkIGxvbmcgYnNpemUpCit7CisgICAgaW50IHZlcnNpb24gPSBsZV9rZXlfdmVyc2lvbiAoa2V5KTsKKyAgICByZXR1cm4gKChsZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sIGtleSkgJiAoYnNpemUgLSAxKSkgIT0gMSk7Cit9CisKKworc3RhdGljIHZvaWQgZGlyZWN0X3ByaW50X2l0ZW0gKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgY2hhciAqIGl0ZW0pCit7CisgICAgaW50IGogPSAwOworCisvLyAgICByZXR1cm47CisgICAgcHJpbnRrICgiXCIiKTsKKyAgICB3aGlsZSAoaiA8IGloX2l0ZW1fbGVuKGloKSkKKwlwcmludGsgKCIlYyIsIGl0ZW1baisrXSk7CisgICAgcHJpbnRrICgiXCJcbiIpOworfQorCisKK3N0YXRpYyB2b2lkIGRpcmVjdF9jaGVja19pdGVtIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNoYXIgKiBpdGVtKQoreworICAgIC8vIEZJWE1FOiB0eXBlIHNvbWV0aGluZyBoZXJlIQorfQorCisKK3N0YXRpYyBpbnQgZGlyZWN0X2NyZWF0ZV92aSAoc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuLAorCQkJICAgICBzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIAorCQkJICAgICBpbnQgaXNfYWZmZWN0ZWQsIAorCQkJICAgICBpbnQgaW5zZXJ0X3NpemUpCit7CisgICAgdmktPnZpX2luZGV4ID0gVFlQRV9ESVJFQ1Q7CisgICAgLy92aS0+dmlfdHlwZSB8PSBWSV9UWVBFX0RJUkVDVDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaXJlY3RfY2hlY2tfbGVmdCAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSwKKwkJCSAgICAgIGludCBzdGFydF9za2lwLCBpbnQgZW5kX3NraXApCit7CisgICAgaW50IGJ5dGVzOworCisgICAgYnl0ZXMgPSBmcmVlIC0gZnJlZSAlIDg7CisgICAgcmV0dXJuIGJ5dGVzID86IC0xOyAgICAKK30KKworCitzdGF0aWMgaW50IGRpcmVjdF9jaGVja19yaWdodCAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSkKK3sKKyAgICByZXR1cm4gZGlyZWN0X2NoZWNrX2xlZnQgKHZpLCBmcmVlLCAwLCAwKTsKK30KKworc3RhdGljIGludCBkaXJlY3RfcGFydF9zaXplIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmaXJzdCwgaW50IGNvdW50KQoreworICAgIHJldHVybiBjb3VudDsKK30KKworCitzdGF0aWMgaW50IGRpcmVjdF91bml0X251bSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpKQoreworICAgIHJldHVybiB2aS0+dmlfaXRlbV9sZW4gLSBJSF9TSVpFOworfQorCisKK3N0YXRpYyB2b2lkIGRpcmVjdF9wcmludF92aSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpKQoreworICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJESVJFQ1QsIGluZGV4ICVkLCB0eXBlIDB4JXgsICVoIiwKKwkJICAgICAgdmktPnZpX2luZGV4LCB2aS0+dmlfdHlwZSwgdmktPnZpX2loKTsKK30KKworc3RhdGljIHN0cnVjdCBpdGVtX29wZXJhdGlvbnMgZGlyZWN0X29wcyA9IHsKKwkuYnl0ZXNfbnVtYmVyCQk9IGRpcmVjdF9ieXRlc19udW1iZXIsCisJLmRlY3JlbWVudF9rZXkJCT0gZGlyZWN0X2RlY3JlbWVudF9rZXksCisJLmlzX2xlZnRfbWVyZ2VhYmxlCT0gZGlyZWN0X2lzX2xlZnRfbWVyZ2VhYmxlLAorCS5wcmludF9pdGVtCQk9IGRpcmVjdF9wcmludF9pdGVtLAorCS5jaGVja19pdGVtCQk9IGRpcmVjdF9jaGVja19pdGVtLAorCisJLmNyZWF0ZV92aQkJPSBkaXJlY3RfY3JlYXRlX3ZpLAorCS5jaGVja19sZWZ0CQk9IGRpcmVjdF9jaGVja19sZWZ0LAorCS5jaGVja19yaWdodAkJPSBkaXJlY3RfY2hlY2tfcmlnaHQsCisJLnBhcnRfc2l6ZQkJPSBkaXJlY3RfcGFydF9zaXplLAorCS51bml0X251bQkJPSBkaXJlY3RfdW5pdF9udW0sCisJLnByaW50X3ZpCQk9IGRpcmVjdF9wcmludF92aQorfTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gaW5kaXJlY3QgaXRlbSBmdW5jdGlvbnMKKy8vCisKK3N0YXRpYyBpbnQgaW5kaXJlY3RfYnl0ZXNfbnVtYmVyIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGludCBibG9ja19zaXplKQoreworICByZXR1cm4gaWhfaXRlbV9sZW4oaWgpIC8gVU5GTV9QX1NJWkUgKiBibG9ja19zaXplOyAvLy0gZ2V0X2loX2ZyZWVfc3BhY2UgKGloKTsKK30KKworCisvLyBkZWNyZWFzZSBvZmZzZXQsIGlmIGl0IGJlY29tZXMgMCwgY2hhbmdlIHR5cGUgdG8gc3RhdCBkYXRhCitzdGF0aWMgdm9pZCBpbmRpcmVjdF9kZWNyZW1lbnRfa2V5IChzdHJ1Y3QgY3B1X2tleSAqIGtleSkKK3sKKyAgICBjcHVfa2V5X2tfb2Zmc2V0X2RlYyAoa2V5KTsKKyAgICBpZiAoY3B1X2tleV9rX29mZnNldCAoa2V5KSA9PSAwKQorCXNldF9jcHVfa2V5X2tfdHlwZSAoa2V5LCBUWVBFX1NUQVRfREFUQSk7Cit9CisKKworLy8gaWYgaXQgaXMgbm90IGZpcnN0IGl0ZW0gb2YgdGhlIGJvZHksIHRoZW4gaXQgaXMgbWVyZ2VhYmxlCitzdGF0aWMgaW50IGluZGlyZWN0X2lzX2xlZnRfbWVyZ2VhYmxlIChzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5LCB1bnNpZ25lZCBsb25nIGJzaXplKQoreworICAgIGludCB2ZXJzaW9uID0gbGVfa2V5X3ZlcnNpb24gKGtleSk7CisgICAgcmV0dXJuIChsZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sIGtleSkgIT0gMSk7Cit9CisKKworLy8gcHJpbnRpbmcgb2YgaW5kaXJlY3QgaXRlbQorc3RhdGljIHZvaWQgc3RhcnRfbmV3X3NlcXVlbmNlIChfX3UzMiAqIHN0YXJ0LCBpbnQgKiBsZW4sIF9fdTMyIG5ldykKK3sKKyAgICAqc3RhcnQgPSBuZXc7CisgICAgKmxlbiA9IDE7Cit9CisKKworc3RhdGljIGludCBzZXF1ZW5jZV9maW5pc2hlZCAoX191MzIgc3RhcnQsIGludCAqIGxlbiwgX191MzIgbmV3KQoreworICAgIGlmIChzdGFydCA9PSBJTlRfTUFYKQorCXJldHVybiAxOworCisgICAgaWYgKHN0YXJ0ID09IDAgJiYgbmV3ID09IDApIHsKKwkoKmxlbikgKys7CisJcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChzdGFydCAhPSAwICYmIChzdGFydCArICpsZW4pID09IG5ldykgeworCSgqbGVuKSArKzsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3NlcXVlbmNlIChfX3UzMiBzdGFydCwgaW50IGxlbikKK3sKKyAgICBpZiAoc3RhcnQgPT0gSU5UX01BWCkKKwlyZXR1cm47CisKKyAgICBpZiAobGVuID09IDEpCisJcHJpbnRrICgiICVkIiwgc3RhcnQpOworICAgIGVsc2UKKwlwcmludGsgKCIgJWQoJWQpIiwgc3RhcnQsIGxlbik7Cit9CisKKworc3RhdGljIHZvaWQgaW5kaXJlY3RfcHJpbnRfaXRlbSAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBjaGFyICogaXRlbSkKK3sKKyAgICBpbnQgajsKKyAgICBfX3UzMiAqIHVucCwgcHJldiA9IElOVF9NQVg7CisgICAgaW50IG51bTsKKworICAgIHVucCA9IChfX3UzMiAqKWl0ZW07CisKKyAgICBpZiAoaWhfaXRlbV9sZW4oaWgpICUgVU5GTV9QX1NJWkUpCisJcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImluZGlyZWN0X3ByaW50X2l0ZW06IGludmFsaWQgaXRlbSBsZW4iKTsKKworICAgIHByaW50ayAoIiVkIHBvaW50ZXJzXG5bICIsIChpbnQpSV9VTkZNX05VTSAoaWgpKTsKKyAgICBmb3IgKGogPSAwOyBqIDwgSV9VTkZNX05VTSAoaWgpOyBqICsrKSB7CisJaWYgKHNlcXVlbmNlX2ZpbmlzaGVkIChwcmV2LCAmbnVtLCBnZXRfYmxvY2tfbnVtKHVucCwgaikpKSB7CisJICAgIHByaW50X3NlcXVlbmNlIChwcmV2LCBudW0pOworCSAgICBzdGFydF9uZXdfc2VxdWVuY2UgKCZwcmV2LCAmbnVtLCBnZXRfYmxvY2tfbnVtKHVucCwgaikpOworCX0KKyAgICB9CisgICAgcHJpbnRfc2VxdWVuY2UgKHByZXYsIG51bSk7CisgICAgcHJpbnRrICgiXVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGluZGlyZWN0X2NoZWNrX2l0ZW0gKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgY2hhciAqIGl0ZW0pCit7CisgICAgLy8gRklYTUU6IHR5cGUgc29tZXRoaW5nIGhlcmUhCit9CisKKworc3RhdGljIGludCBpbmRpcmVjdF9jcmVhdGVfdmkgKHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biwKKwkJCSAgICAgICBzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIAorCQkJICAgICAgIGludCBpc19hZmZlY3RlZCwgCisJCQkgICAgICAgaW50IGluc2VydF9zaXplKQoreworICAgIHZpLT52aV9pbmRleCA9IFRZUEVfSU5ESVJFQ1Q7CisgICAgLy92aS0+dmlfdHlwZSB8PSBWSV9UWVBFX0lORElSRUNUOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluZGlyZWN0X2NoZWNrX2xlZnQgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyZWUsCisJCQkJaW50IHN0YXJ0X3NraXAsIGludCBlbmRfc2tpcCkKK3sKKyAgICBpbnQgYnl0ZXM7CisKKyAgICBieXRlcyA9IGZyZWUgLSBmcmVlICUgVU5GTV9QX1NJWkU7CisgICAgcmV0dXJuIGJ5dGVzID86IC0xOyAgICAKK30KKworCitzdGF0aWMgaW50IGluZGlyZWN0X2NoZWNrX3JpZ2h0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlKQoreworICAgIHJldHVybiBpbmRpcmVjdF9jaGVja19sZWZ0ICh2aSwgZnJlZSwgMCwgMCk7Cit9CisKKworCisvLyByZXR1cm4gc2l6ZSBpbiBieXRlcyBvZiAndW5pdHMnIHVuaXRzLiBJZiBmaXJzdCA9PSAwIC0gY2FsY3VsYXRlIGZyb20gdGhlIGhlYWQgKGxlZnQpLCBvdGhlcndpc2UgLSBmcm9tIHRhaWwgKHJpZ2h0KQorc3RhdGljIGludCBpbmRpcmVjdF9wYXJ0X3NpemUgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZpcnN0LCBpbnQgdW5pdHMpCit7CisgICAgLy8gdW5pdCBvZiBpbmRpcmVjdCBpdGVtIGlzIGJ5dGUgKHlldCkKKyAgICByZXR1cm4gdW5pdHM7Cit9CisKK3N0YXRpYyBpbnQgaW5kaXJlY3RfdW5pdF9udW0gKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSkKK3sKKyAgICAvLyB1bml0IG9mIGluZGlyZWN0IGl0ZW0gaXMgYnl0ZSAoeWV0KQorICAgIHJldHVybiB2aS0+dmlfaXRlbV9sZW4gLSBJSF9TSVpFOworfQorCitzdGF0aWMgdm9pZCBpbmRpcmVjdF9wcmludF92aSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpKQoreworICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJJTkRJUkVDVCwgaW5kZXggJWQsIHR5cGUgMHgleCwgJWgiLAorCQkgICAgICB2aS0+dmlfaW5kZXgsIHZpLT52aV90eXBlLCB2aS0+dmlfaWgpOworfQorCitzdGF0aWMgc3RydWN0IGl0ZW1fb3BlcmF0aW9ucyBpbmRpcmVjdF9vcHMgPSB7CisJLmJ5dGVzX251bWJlcgkJPSBpbmRpcmVjdF9ieXRlc19udW1iZXIsCisJLmRlY3JlbWVudF9rZXkJCT0gaW5kaXJlY3RfZGVjcmVtZW50X2tleSwKKwkuaXNfbGVmdF9tZXJnZWFibGUJPSBpbmRpcmVjdF9pc19sZWZ0X21lcmdlYWJsZSwKKwkucHJpbnRfaXRlbQkJPSBpbmRpcmVjdF9wcmludF9pdGVtLAorCS5jaGVja19pdGVtCQk9IGluZGlyZWN0X2NoZWNrX2l0ZW0sCisKKwkuY3JlYXRlX3ZpCQk9IGluZGlyZWN0X2NyZWF0ZV92aSwKKwkuY2hlY2tfbGVmdAkJPSBpbmRpcmVjdF9jaGVja19sZWZ0LAorCS5jaGVja19yaWdodAkJPSBpbmRpcmVjdF9jaGVja19yaWdodCwKKwkucGFydF9zaXplCQk9IGluZGlyZWN0X3BhcnRfc2l6ZSwKKwkudW5pdF9udW0JCT0gaW5kaXJlY3RfdW5pdF9udW0sCisJLnByaW50X3ZpCQk9IGluZGlyZWN0X3ByaW50X3ZpCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gZGlyZW50cnkgZnVuY3Rpb25zCisvLworCisKK3N0YXRpYyBpbnQgZGlyZW50cnlfYnl0ZXNfbnVtYmVyIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGludCBibG9ja19zaXplKQoreworICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJ2cy0xNjA5MDogZGlyZW50cnlfYnl0ZXNfbnVtYmVyOiAiCisJCSAgICAgICJieXRlcyBudW1iZXIgaXMgYXNrZWQgZm9yIGRpcmVudHJ5Iik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRpcmVudHJ5X2RlY3JlbWVudF9rZXkgKHN0cnVjdCBjcHVfa2V5ICoga2V5KQoreworICAgIGNwdV9rZXlfa19vZmZzZXRfZGVjIChrZXkpOworICAgIGlmIChjcHVfa2V5X2tfb2Zmc2V0IChrZXkpID09IDApCisJc2V0X2NwdV9rZXlfa190eXBlIChrZXksIFRZUEVfU1RBVF9EQVRBKTsJCit9CisKKworc3RhdGljIGludCBkaXJlbnRyeV9pc19sZWZ0X21lcmdlYWJsZSAoc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSwgdW5zaWduZWQgbG9uZyBic2l6ZSkKK3sKKyAgICBpZiAobGUzMl90b19jcHUgKGtleS0+dS5rX29mZnNldF92MS5rX29mZnNldCkgPT0gRE9UX09GRlNFVCkKKwlyZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKKwkKK30KKworCitzdGF0aWMgdm9pZCBkaXJlbnRyeV9wcmludF9pdGVtIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNoYXIgKiBpdGVtKQoreworICAgIGludCBpOworICAgIGludCBuYW1lbGVuOworICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoOworICAgIGNoYXIgKiBuYW1lOworICAgIHN0YXRpYyBjaGFyIG5hbWVidWYgWzgwXTsKKworCisgICAgcHJpbnRrICgiXG4gIyAlLTE1cyUtMzBzJS0xNXMlLTE1cyUtMTVzXG4iLCAiTmFtZSIsICJLZXkgb2YgcG9pbnRlZCBvYmplY3QiLCAiSGFzaCIsICJHZW4gbnVtYmVyIiwgIlN0YXR1cyIpOworCisgICAgZGVoID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopaXRlbTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBJX0VOVFJZX0NPVU5UIChpaCk7IGkgKyssIGRlaCArKykgeworCW5hbWVsZW4gPSAoaSA/IChkZWhfbG9jYXRpb24oZGVoIC0gMSkpIDogaWhfaXRlbV9sZW4oaWgpKSAtIGRlaF9sb2NhdGlvbihkZWgpOworCW5hbWUgPSBpdGVtICsgZGVoX2xvY2F0aW9uKGRlaCk7CisJaWYgKG5hbWVbbmFtZWxlbi0xXSA9PSAwKQorCSAgbmFtZWxlbiA9IHN0cmxlbiAobmFtZSk7CisJbmFtZWJ1ZlswXSA9ICciJzsKKwlpZiAobmFtZWxlbiA+IHNpemVvZiAobmFtZWJ1ZikgLSAzKSB7CisJICAgIHN0cm5jcHkgKG5hbWVidWYgKyAxLCBuYW1lLCBzaXplb2YgKG5hbWVidWYpIC0gMyk7CisJICAgIG5hbWVidWZbc2l6ZW9mIChuYW1lYnVmKSAtIDJdID0gJyInOworCSAgICBuYW1lYnVmW3NpemVvZiAobmFtZWJ1ZikgLSAxXSA9IDA7CisJfSBlbHNlIHsKKwkgICAgbWVtY3B5IChuYW1lYnVmICsgMSwgbmFtZSwgbmFtZWxlbik7CisJICAgIG5hbWVidWZbbmFtZWxlbiArIDFdID0gJyInOworCSAgICBuYW1lYnVmW25hbWVsZW4gKyAyXSA9IDA7CisJfQorCisJcHJpbnRrICgiJWQ6ICAlLTE1cyUtMTVkJS0xNWQlLTE1TGQlLTE1TGQoJXMpXG4iLCAKKwkJaSwgbmFtZWJ1ZiwKKwkJZGVoX2Rpcl9pZChkZWgpLCBkZWhfb2JqZWN0aWQoZGVoKSwKKwkJR0VUX0hBU0hfVkFMVUUgKGRlaF9vZmZzZXQgKGRlaCkpLCBHRVRfR0VORVJBVElPTl9OVU1CRVIgKChkZWhfb2Zmc2V0IChkZWgpKSksCisJCShkZV9oaWRkZW4gKGRlaCkpID8gIkhJRERFTiIgOiAiVklTSUJMRSIpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBkaXJlbnRyeV9jaGVja19pdGVtIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNoYXIgKiBpdGVtKQoreworICAgIGludCBpOworICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoOworCisgICAgLy8gRklYTUU6IHR5cGUgc29tZXRoaW5nIGhlcmUhCisgICAgZGVoID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopaXRlbTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgSV9FTlRSWV9DT1VOVCAoaWgpOyBpICsrLCBkZWggKyspIHsKKwk7CisgICAgfQorfQorCisKKworI2RlZmluZSBESVJFTlRSWV9WSV9GSVJTVF9ESVJFTlRSWV9JVEVNIDEKKworLyoKKyAqIGZ1bmN0aW9uIHJldHVybnMgb2xkIGVudHJ5IG51bWJlciBpbiBkaXJlY3RvcnkgaXRlbSBpbiByZWFsIG5vZGUKKyAqIHVzaW5nIG5ldyBlbnRyeSBudW1iZXIgaW4gdmlydHVhbCBpdGVtIGluIHZpcnR1YWwgbm9kZSAqLworc3RhdGljIGlubGluZSBpbnQgb2xkX2VudHJ5X251bSAoaW50IGlzX2FmZmVjdGVkLCBpbnQgdmlydHVhbF9lbnRyeV9udW0sIGludCBwb3NfaW5faXRlbSwgaW50IG1vZGUpCit7CisgICAgaWYgKCBtb2RlID09IE1fSU5TRVJUIHx8IG1vZGUgPT0gTV9ERUxFVEUpCisJcmV0dXJuIHZpcnR1YWxfZW50cnlfbnVtOworICAgIAorICAgIGlmICghaXNfYWZmZWN0ZWQpCisJLyogY3V0IG9yIHBhc3RlIGlzIGFwcGxpZWQgdG8gYW5vdGhlciBpdGVtICovCisJcmV0dXJuIHZpcnR1YWxfZW50cnlfbnVtOworCisgICAgaWYgKHZpcnR1YWxfZW50cnlfbnVtIDwgcG9zX2luX2l0ZW0pCisJcmV0dXJuIHZpcnR1YWxfZW50cnlfbnVtOworCisgICAgaWYgKG1vZGUgPT0gTV9DVVQpCisJcmV0dXJuIHZpcnR1YWxfZW50cnlfbnVtICsgMTsKKworICAgIFJGQUxTRSggbW9kZSAhPSBNX1BBU1RFIHx8IHZpcnR1YWxfZW50cnlfbnVtID09IDAsCisJICAgICJ2cy04MDE1OiBvbGRfZW50cnlfbnVtOiBtb2RlIG11c3QgYmUgTV9QQVNURSAobW9kZSA9IFwnJWNcJyIsIG1vZGUpOworICAgIAorICAgIHJldHVybiB2aXJ0dWFsX2VudHJ5X251bSAtIDE7Cit9CisKKworCisKKy8qIENyZWF0ZSBhbiBhcnJheSBvZiBzaXplcyBvZiBkaXJlY3RvcnkgZW50cmllcyBmb3IgdmlydHVhbAorICAgaXRlbS4gUmV0dXJuIHNwYWNlIHVzZWQgYnkgYW4gaXRlbS4gRklYTUU6IG5vIGNvbnRyb2wgb3ZlcgorICAgY29uc3VtaW5nIG9mIHNwYWNlIHVzZWQgYnkgdGhpcyBpdGVtIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgZGlyZW50cnlfY3JlYXRlX3ZpIChzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4sCisJCQkgICAgICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCAKKwkJCSAgICAgICBpbnQgaXNfYWZmZWN0ZWQsIAorCQkJICAgICAgIGludCBpbnNlcnRfc2l6ZSkKK3sKKyAgICBzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKiBkaXJfdSA9IHZpLT52aV91YXJlYTsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgc2l6ZSA9IHNpemVvZiAoc3RydWN0IGRpcmVudHJ5X3VhcmVhKTsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaDsKKyAgCisgICAgdmktPnZpX2luZGV4ID0gVFlQRV9ESVJFTlRSWTsKKworICAgIGlmICghKHZpLT52aV9paCkgfHwgIXZpLT52aV9pdGVtKQorCUJVRyAoKTsKKworCisgICAgZGlyX3UtPmZsYWdzID0gMDsKKyAgICBpZiAobGVfaWhfa19vZmZzZXQgKHZpLT52aV9paCkgPT0gRE9UX09GRlNFVCkKKwlkaXJfdS0+ZmxhZ3MgfD0gRElSRU5UUllfVklfRklSU1RfRElSRU5UUllfSVRFTTsKKworICAgIGRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKSh2aS0+dmlfaXRlbSk7CisgICAgCisgICAgCisgICAgLyogdmlydHVhbCBkaXJlY3RvcnkgaXRlbSBoYXZlIHRoaXMgYW1vdW50IG9mIGVudHJ5IGFmdGVyICovCisgICAgZGlyX3UtPmVudHJ5X2NvdW50ID0gaWhfZW50cnlfY291bnQgKHZpLT52aV9paCkgKyAKKwkoKGlzX2FmZmVjdGVkKSA/ICgodm4tPnZuX21vZGUgPT0gTV9DVVQpID8gLTEgOgorCQkJICAodm4tPnZuX21vZGUgPT0gTV9QQVNURSA/IDEgOiAwKSkgOiAwKTsKKyAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGlyX3UtPmVudHJ5X2NvdW50OyBpICsrKSB7CisJaiA9IG9sZF9lbnRyeV9udW0gKGlzX2FmZmVjdGVkLCBpLCB2bi0+dm5fcG9zX2luX2l0ZW0sIHZuLT52bl9tb2RlKTsKKyAgICAgICAgZGlyX3UtPmVudHJ5X3NpemVzW2ldID0gKGogPyBkZWhfbG9jYXRpb24oICYoZGVoW2ogLSAxXSkgKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGloX2l0ZW1fbGVuICh2aS0+dmlfaWgpKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlaF9sb2NhdGlvbiggJihkZWhbal0pKSArIERFSF9TSVpFOworICAgIH0KKworICAgIHNpemUgKz0gKGRpcl91LT5lbnRyeV9jb3VudCAqIHNpemVvZiAoc2hvcnQpKTsKKyAgICAKKyAgICAvKiBzZXQgc2l6ZSBvZiBwYXN0ZWQgZW50cnkgKi8KKyAgICBpZiAoaXNfYWZmZWN0ZWQgJiYgdm4tPnZuX21vZGUgPT0gTV9QQVNURSkKKwlkaXJfdS0+ZW50cnlfc2l6ZXNbdm4tPnZuX3Bvc19pbl9pdGVtXSA9IGluc2VydF9zaXplOworCisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKyAgICAvKiBjb21wYXJlIHRvdGFsIHNpemUgb2YgZW50cmllcyB3aXRoIGl0ZW0gbGVuZ3RoICovCisgICAgeworCWludCBrLCBsOworICAgIAorCWwgPSAwOworCWZvciAoayA9IDA7IGsgPCBkaXJfdS0+ZW50cnlfY291bnQ7IGsgKyspCisJICAgIGwgKz0gZGlyX3UtPmVudHJ5X3NpemVzW2tdOworICAgIAorCWlmIChsICsgSUhfU0laRSAhPSB2aS0+dmlfaXRlbV9sZW4gKyAKKwkgICAgKChpc19hZmZlY3RlZCAmJiAodm4tPnZuX21vZGUgPT0gTV9QQVNURSB8fCB2bi0+dm5fbW9kZSA9PSBNX0NVVCkpID8gaW5zZXJ0X3NpemUgOiAwKSApIHsKKwkgICAgcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJ2cy04MDI1OiBzZXRfZW50cnlfc2l6ZXM6IChtb2RlPT0lYywgaW5zZXJ0X3NpemU9PSVkKSwgaW52YWxpZCBsZW5ndGggb2YgZGlyZWN0b3J5IGl0ZW0iLAorCQkJICAgIHZuLT52bl9tb2RlLCBpbnNlcnRfc2l6ZSk7CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHNpemU7CisKKworfQorCisKKy8vCisvLyByZXR1cm4gbnVtYmVyIG9mIGVudHJpZXMgd2hpY2ggbWF5IGZpdCBpbnRvIHNwZWNpZmllZCBhbW91bnQgb2YKKy8vIGZyZWUgc3BhY2UsIG9yIC0xIGlmIGZyZWUgc3BhY2UgaXMgbm90IGVub3VnaCBldmVuIGZvciAxIGVudHJ5CisvLworc3RhdGljIGludCBkaXJlbnRyeV9jaGVja19sZWZ0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlLAorCQkJCWludCBzdGFydF9za2lwLCBpbnQgZW5kX3NraXApCit7CisgICAgaW50IGk7CisgICAgaW50IGVudHJpZXMgPSAwOworICAgIHN0cnVjdCBkaXJlbnRyeV91YXJlYSAqIGRpcl91ID0gdmktPnZpX3VhcmVhOworCisgICAgZm9yIChpID0gc3RhcnRfc2tpcDsgaSA8IGRpcl91LT5lbnRyeV9jb3VudCAtIGVuZF9za2lwOyBpICsrKSB7CisJaWYgKGRpcl91LT5lbnRyeV9zaXplc1tpXSA+IGZyZWUpCisJICAgIC8qIGktdGggZW50cnkgZG9lc24ndCBmaXQgaW50byB0aGUgcmVtYWluaW5nIGZyZWUgc3BhY2UgKi8KKwkgICAgYnJlYWs7CisJCSAgCisJZnJlZSAtPSBkaXJfdS0+ZW50cnlfc2l6ZXNbaV07CisJZW50cmllcyArKzsKKyAgICB9CisKKyAgICBpZiAoZW50cmllcyA9PSBkaXJfdS0+ZW50cnlfY291bnQpIHsKKwlyZWlzZXJmc19wYW5pYyAoTlVMTCwgImZyZWUgc3BhY2UgJWQsIGVudHJ5X2NvdW50ICVkXG4iLCBmcmVlLCBkaXJfdS0+ZW50cnlfY291bnQpOworICAgIH0KKworICAgIC8qICIuIiBhbmQgIi4uIiBjYW4gbm90IGJlIHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIgKi8KKyAgICBpZiAoc3RhcnRfc2tpcCA9PSAwICYmIChkaXJfdS0+ZmxhZ3MgJiBESVJFTlRSWV9WSV9GSVJTVF9ESVJFTlRSWV9JVEVNKSAmJiBlbnRyaWVzIDwgMikKKwllbnRyaWVzID0gMDsKKyAgICAKKyAgICByZXR1cm4gZW50cmllcyA/OiAtMTsKK30KKworCitzdGF0aWMgaW50IGRpcmVudHJ5X2NoZWNrX3JpZ2h0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlKQoreworICAgIGludCBpOworICAgIGludCBlbnRyaWVzID0gMDsKKyAgICBzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKiBkaXJfdSA9IHZpLT52aV91YXJlYTsKKyAgICAKKyAgICBmb3IgKGkgPSBkaXJfdS0+ZW50cnlfY291bnQgLSAxOyBpID49IDA7IGkgLS0pIHsKKwlpZiAoZGlyX3UtPmVudHJ5X3NpemVzW2ldID4gZnJlZSkKKwkgICAgLyogaS10aCBlbnRyeSBkb2Vzbid0IGZpdCBpbnRvIHRoZSByZW1haW5pbmcgZnJlZSBzcGFjZSAqLworCSAgICBicmVhazsKKwkKKwlmcmVlIC09IGRpcl91LT5lbnRyeV9zaXplc1tpXTsKKwllbnRyaWVzICsrOworICAgIH0KKyAgICBpZiAoZW50cmllcyA9PSBkaXJfdS0+ZW50cnlfY291bnQpCisJQlVHICgpOworCisgICAgLyogIi4iIGFuZCAiLi4iIGNhbiBub3QgYmUgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciAqLworICAgIGlmICgoZGlyX3UtPmZsYWdzICYgRElSRU5UUllfVklfRklSU1RfRElSRU5UUllfSVRFTSkgJiYgZW50cmllcyA+IGRpcl91LT5lbnRyeV9jb3VudCAtIDIpCisJZW50cmllcyA9IGRpcl91LT5lbnRyeV9jb3VudCAtIDI7CisKKyAgICByZXR1cm4gZW50cmllcyA/OiAtMTsKK30KKworCisvKiBzdW0gb2YgZW50cnkgc2l6ZXMgYmV0d2VlbiBmcm9tLXRoIGFuZCB0by10aCBlbnRyaWVzIGluY2x1ZGluZyBib3RoIGVkZ2VzICovCitzdGF0aWMgaW50IGRpcmVudHJ5X3BhcnRfc2l6ZSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZmlyc3QsIGludCBjb3VudCkKK3sKKyAgICBpbnQgaSwgcmV0dmFsOworICAgIGludCBmcm9tLCB0bzsKKyAgICBzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKiBkaXJfdSA9IHZpLT52aV91YXJlYTsKKyAgICAKKyAgICByZXR2YWwgPSAwOworICAgIGlmIChmaXJzdCA9PSAwKQorCWZyb20gPSAwOworICAgIGVsc2UKKwlmcm9tID0gZGlyX3UtPmVudHJ5X2NvdW50IC0gY291bnQ7CisgICAgdG8gPSBmcm9tICsgY291bnQgLSAxOworCisgICAgZm9yIChpID0gZnJvbTsgaSA8PSB0bzsgaSArKykKKwlyZXR2YWwgKz0gZGlyX3UtPmVudHJ5X3NpemVzW2ldOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBkaXJlbnRyeV91bml0X251bSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpKQoreworICAgIHN0cnVjdCBkaXJlbnRyeV91YXJlYSAqIGRpcl91ID0gdmktPnZpX3VhcmVhOworICAgIAorICAgIHJldHVybiBkaXJfdS0+ZW50cnlfY291bnQ7Cit9CisKKworCitzdGF0aWMgdm9pZCBkaXJlbnRyeV9wcmludF92aSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpKQoreworICAgIGludCBpOworICAgIHN0cnVjdCBkaXJlbnRyeV91YXJlYSAqIGRpcl91ID0gdmktPnZpX3VhcmVhOworCisgICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgIkRJUkVOVFJZLCBpbmRleCAlZCwgdHlwZSAweCV4LCAlaCwgZmxhZ3MgMHgleCIsCisJCSAgICAgIHZpLT52aV9pbmRleCwgdmktPnZpX3R5cGUsIHZpLT52aV9paCwgZGlyX3UtPmZsYWdzKTsKKyAgICBwcmludGsgKCIlZCBlbnRyaWVzOiAiLCBkaXJfdS0+ZW50cnlfY291bnQpOworICAgIGZvciAoaSA9IDA7IGkgPCBkaXJfdS0+ZW50cnlfY291bnQ7IGkgKyspCisJcHJpbnRrICgiJWQgIiwgZGlyX3UtPmVudHJ5X3NpemVzW2ldKTsKKyAgICBwcmludGsgKCJcbiIpOworfQorCitzdGF0aWMgc3RydWN0IGl0ZW1fb3BlcmF0aW9ucyBkaXJlbnRyeV9vcHMgPSB7CisJLmJ5dGVzX251bWJlcgkJPSBkaXJlbnRyeV9ieXRlc19udW1iZXIsCisJLmRlY3JlbWVudF9rZXkJCT0gZGlyZW50cnlfZGVjcmVtZW50X2tleSwKKwkuaXNfbGVmdF9tZXJnZWFibGUJPSBkaXJlbnRyeV9pc19sZWZ0X21lcmdlYWJsZSwKKwkucHJpbnRfaXRlbQkJPSBkaXJlbnRyeV9wcmludF9pdGVtLAorCS5jaGVja19pdGVtCQk9IGRpcmVudHJ5X2NoZWNrX2l0ZW0sCisKKwkuY3JlYXRlX3ZpCQk9IGRpcmVudHJ5X2NyZWF0ZV92aSwKKwkuY2hlY2tfbGVmdAkJPSBkaXJlbnRyeV9jaGVja19sZWZ0LAorCS5jaGVja19yaWdodAkJPSBkaXJlbnRyeV9jaGVja19yaWdodCwKKwkucGFydF9zaXplCQk9IGRpcmVudHJ5X3BhcnRfc2l6ZSwKKwkudW5pdF9udW0JCT0gZGlyZW50cnlfdW5pdF9udW0sCisJLnByaW50X3ZpCQk9IGRpcmVudHJ5X3ByaW50X3ZpCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRXJyb3IgY2F0Y2hpbmcgZnVuY3Rpb25zIHRvIGNhdGNoIGVycm9ycyBjYXVzZWQgYnkgaW5jb3JyZWN0IGl0ZW0gdHlwZXMuCisvLworc3RhdGljIGludCBlcnJjYXRjaF9ieXRlc19udW1iZXIgKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgaW50IGJsb2NrX3NpemUpCit7CisgICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImdyZWVuLTE2MDAxOiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlcnJjYXRjaF9kZWNyZW1lbnRfa2V5IChzdHJ1Y3QgY3B1X2tleSAqIGtleSkKK3sKKyAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMDI6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7Cit9CisKKworc3RhdGljIGludCBlcnJjYXRjaF9pc19sZWZ0X21lcmdlYWJsZSAoc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSwgdW5zaWduZWQgbG9uZyBic2l6ZSkKK3sKKyAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMDM6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgZXJyY2F0Y2hfcHJpbnRfaXRlbSAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBjaGFyICogaXRlbSkKK3sKKyAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMDQ6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7Cit9CisKKworc3RhdGljIHZvaWQgZXJyY2F0Y2hfY2hlY2tfaXRlbSAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBjaGFyICogaXRlbSkKK3sKKyAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMDU6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7Cit9CisKK3N0YXRpYyBpbnQgZXJyY2F0Y2hfY3JlYXRlX3ZpIChzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4sCisJCQkgICAgICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCAKKwkJCSAgICAgICBpbnQgaXNfYWZmZWN0ZWQsIAorCQkJICAgICAgIGludCBpbnNlcnRfc2l6ZSkKK3sKKyAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMDY6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CisgICAgcmV0dXJuIDA7CS8vIFdlIG1pZ2h0IHJldHVybiAtMSBoZXJlIGFzIHdlbGwsIGJ1dCBpdCB3b24ndCBoZWxwIGFzIGNyZWF0ZV92aXJ0dWFsX25vZGUoKSBmcm9tIHdoZXJlCisJCS8vIHRoaXMgb3BlcmF0aW9uIGlzIGNhbGxlZCBmcm9tIGlzIG9mIHJldHVybiB0eXBlIHZvaWQuCit9CisKK3N0YXRpYyBpbnQgZXJyY2F0Y2hfY2hlY2tfbGVmdCAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSwKKwkJCQlpbnQgc3RhcnRfc2tpcCwgaW50IGVuZF9za2lwKQoreworICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJncmVlbi0xNjAwNzogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKworc3RhdGljIGludCBlcnJjYXRjaF9jaGVja19yaWdodCAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSkKK3sKKyAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMDg6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGVycmNhdGNoX3BhcnRfc2l6ZSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZmlyc3QsIGludCBjb3VudCkKK3sKKyAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMDk6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXJyY2F0Y2hfdW5pdF9udW0gKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSkKK3sKKyAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMTA6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVycmNhdGNoX3ByaW50X3ZpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCit7CisgICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImdyZWVuLTE2MDExOiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOworfQorCitzdGF0aWMgc3RydWN0IGl0ZW1fb3BlcmF0aW9ucyBlcnJjYXRjaF9vcHMgPSB7CisgICAgZXJyY2F0Y2hfYnl0ZXNfbnVtYmVyLAorICAgIGVycmNhdGNoX2RlY3JlbWVudF9rZXksCisgICAgZXJyY2F0Y2hfaXNfbGVmdF9tZXJnZWFibGUsCisgICAgZXJyY2F0Y2hfcHJpbnRfaXRlbSwKKyAgICBlcnJjYXRjaF9jaGVja19pdGVtLAorCisgICAgZXJyY2F0Y2hfY3JlYXRlX3ZpLAorICAgIGVycmNhdGNoX2NoZWNrX2xlZnQsCisgICAgZXJyY2F0Y2hfY2hlY2tfcmlnaHQsCisgICAgZXJyY2F0Y2hfcGFydF9zaXplLAorICAgIGVycmNhdGNoX3VuaXRfbnVtLAorICAgIGVycmNhdGNoX3ByaW50X3ZpCit9OworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8KKyNpZiAhIChUWVBFX1NUQVRfREFUQSA9PSAwICYmIFRZUEVfSU5ESVJFQ1QgPT0gMSAmJiBUWVBFX0RJUkVDVCA9PSAyICYmIFRZUEVfRElSRU5UUlkgPT0gMykKKyAgZG8gbm90IGNvbXBpbGUKKyNlbmRpZgorCitzdHJ1Y3QgaXRlbV9vcGVyYXRpb25zICogaXRlbV9vcHMgW1RZUEVfQU5ZICsgMV0gPSB7CisgICZzdGF0X2RhdGFfb3BzLAorICAmaW5kaXJlY3Rfb3BzLAorICAmZGlyZWN0X29wcywKKyAgJmRpcmVudHJ5X29wcywKKyAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgJmVycmNhdGNoX29wcwkJLyogVGhpcyBpcyB0byBjYXRjaCBlcnJvcnMgd2l0aCBpbnZhbGlkIHR5cGUgKDE1dGggZW50cnkgZm9yIFRZUEVfQU5ZKSAqLworfTsKKworCisKKwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvam91cm5hbC5jIGIvZnMvcmVpc2VyZnMvam91cm5hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YWQzYTcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy9qb3VybmFsLmMKQEAgLTAsMCArMSwzODc2IEBACisvKgorKiogV3JpdGUgYWhlYWQgbG9nZ2luZyBpbXBsZW1lbnRhdGlvbiBjb3B5cmlnaHQgQ2hyaXMgTWFzb24gMjAwMAorKioKKyoqIFRoZSBiYWNrZ3JvdW5kIGNvbW1pdHMgbWFrZSB0aGlzIGNvZGUgdmVyeSBpbnRlcmVsYXRlZCwgYW5kIAorKiogb3Zlcmx5IGNvbXBsZXguICBJIG5lZWQgdG8gcmV0aGluayB0aGluZ3MgYSBiaXQuLi4uVGhlIG1ham9yIHBsYXllcnM6CisqKgorKiogam91cm5hbF9iZWdpbiAtLSBjYWxsIHdpdGggdGhlIG51bWJlciBvZiBibG9ja3MgeW91IGV4cGVjdCB0byBsb2cuICAKKyoqICAgICAgICAgICAgICAgICAgSWYgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaXMgdG9vCisqKiAJCSAgICBvbGQsIGl0IHdpbGwgYmxvY2sgdW50aWwgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaXMgCisqKiAJCSAgICBmaW5pc2hlZCwgYW5kIHRoZW4gc3RhcnQgYSBuZXcgb25lLgorKioJCSAgICBVc3VhbGx5LCB5b3VyIHRyYW5zYWN0aW9uIHdpbGwgZ2V0IGpvaW5lZCBpbiB3aXRoIAorKiogICAgICAgICAgICAgICAgICBwcmV2aW91cyBvbmVzIGZvciBzcGVlZC4KKyoqCisqKiBqb3VybmFsX2pvaW4gIC0tIHNhbWUgYXMgam91cm5hbF9iZWdpbiwgYnV0IHdvbid0IGJsb2NrIG9uIHRoZSBjdXJyZW50IAorKiogICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbiByZWdhcmRsZXNzIG9mIGFnZS4gIERvbid0IGV2ZXIgY2FsbAorKiogICAgICAgICAgICAgICAgICB0aGlzLiAgRXZlci4gIFRoZXJlIGFyZSBvbmx5IHR3byBwbGFjZXMgaXQgc2hvdWxkIGJlIAorKiogICAgICAgICAgICAgICAgICBjYWxsZWQgZnJvbSwgYW5kIHRoZXkgYXJlIGJvdGggaW5zaWRlIHRoaXMgZmlsZS4KKyoqCisqKiBqb3VybmFsX21hcmtfZGlydHkgLS0gYWRkcyBibG9ja3MgaW50byB0aGlzIHRyYW5zYWN0aW9uLiAgY2xlYXJzIGFueSBmbGFncyAKKyoqICAgICAgICAgICAgICAgICAgICAgICB0aGF0IG1pZ2h0IG1ha2UgdGhlbSBnZXQgc2VudCB0byBkaXNrCisqKiAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gbWFya3MgdGhlbSBCSF9KRGlydHkuICBQdXRzIHRoZSBidWZmZXIgaGVhZCAKKyoqICAgICAgICAgICAgICAgICAgICAgICBpbnRvIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGhhc2guICAKKyoqCisqKiBqb3VybmFsX2VuZCAtLSBpZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyBiYXRjaGFibGUsIGl0IGRvZXMgbm90aGluZworKiogICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLCBpdCBjb3VsZCBkbyBhbiBhc3luYy9zeW5jaHJvbm91cyBjb21taXQsIG9yCisqKiAgICAgICAgICAgICAgICAgICBhIGZ1bGwgZmx1c2ggb2YgYWxsIGxvZyBhbmQgcmVhbCBibG9ja3MgaW4gdGhlIAorKiogICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24uCisqKgorKiogZmx1c2hfb2xkX2NvbW1pdHMgLS0gaWYgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaXMgdG9vIG9sZCwgaXQgaXMgZW5kZWQgYW5kIAorKiogICAgICAgICAgICAgICAgICAgICAgY29tbWl0IGJsb2NrcyBhcmUgc2VudCB0byBkaXNrLiAgRm9yY2VzIGNvbW1pdCBibG9ja3MgCisqKiAgICAgICAgICAgICAgICAgICAgICB0byBkaXNrIGZvciBhbGwgYmFja2dyb3VuZGVkIGNvbW1pdHMgdGhhdCBoYXZlIGJlZW4gCisqKiAgICAgICAgICAgICAgICAgICAgICBhcm91bmQgdG9vIGxvbmcuCisqKgkJICAgICAtLSBOb3RlLCBpZiB5b3UgY2FsbCB0aGlzIGFzIGFuIGltbWVkaWF0ZSBmbHVzaCBmcm9tIAorKioJCSAgICAgICAgZnJvbSB3aXRoaW4ga3VwZGF0ZSwgaXQgd2lsbCBpZ25vcmUgdGhlIGltbWVkaWF0ZSBmbGFnCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKworCisvKiBnZXRzIGEgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqIGZyb20gYSBsaXN0IGhlYWQgKi8KKyNkZWZpbmUgSk9VUk5BTF9MSVNUX0VOVFJZKGgpIChsaXN0X2VudHJ5KChoKSwgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpfbGlzdCkpCisjZGVmaW5lIEpPVVJOQUxfV09SS19FTlRSWShoKSAobGlzdF9lbnRyeSgoaCksIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqX3dvcmtpbmdfbGlzdCkpCisKKy8qIHRoZSBudW1iZXIgb2YgbW91bnRlZCBmaWxlc3lzdGVtcy4gIFRoaXMgaXMgdXNlZCB0byBkZWNpZGUgd2hlbiB0bworKiogc3RhcnQgYW5kIGtpbGwgdGhlIGNvbW1pdCB3b3JrcXVldWUKKyovCitzdGF0aWMgaW50IHJlaXNlcmZzX21vdW50ZWRfZnNfY291bnQ7CisKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqY29tbWl0X3dxOworCisjZGVmaW5lIEpPVVJOQUxfVFJBTlNfSEFMRiAxMDE4ICAgLyogbXVzdCBiZSBjb3JyZWN0IHRvIGtlZXAgdGhlIGRlc2MgYW5kIGNvbW1pdAorCQkJCSAgICAgc3RydWN0cyBhdCA0ayAqLworI2RlZmluZSBCVUZOUiA2NCAvKnJlYWQgYWhlYWQgKi8KKworLyogY25vZGUgc3RhdCBiaXRzLiAgTW92ZSB0aGVzZSBpbnRvIHJlaXNlcmZzX2ZzLmggKi8KKworI2RlZmluZSBCTE9DS19GUkVFRCAyCQkvKiB0aGlzIGJsb2NrIHdhcyBmcmVlZCwgYW5kIGNhbid0IGJlIHdyaXR0ZW4uICAqLworI2RlZmluZSBCTE9DS19GUkVFRF9IT0xERVIgMyAgICAvKiB0aGlzIGJsb2NrIHdhcyBmcmVlZCBkdXJpbmcgdGhpcyB0cmFuc2FjdGlvbiwgYW5kIGNhbid0IGJlIHdyaXR0ZW4gKi8KKworI2RlZmluZSBCTE9DS19ORUVEU19GTFVTSCA0CS8qIHVzZWQgaW4gZmx1c2hfam91cm5hbF9saXN0ICovCisjZGVmaW5lIEJMT0NLX0RJUlRJRUQgNQorCisKKy8qIGpvdXJuYWwgbGlzdCBzdGF0ZSBiaXRzICovCisjZGVmaW5lIExJU1RfVE9VQ0hFRCAxCisjZGVmaW5lIExJU1RfRElSVFkgICAyCisjZGVmaW5lIExJU1RfQ09NTUlUX1BFTkRJTkcgIDQJCS8qIHNvbWVvbmUgd2lsbCBjb21taXQgdGhpcyBsaXN0ICovCisKKy8qIGZsYWdzIGZvciBkb19qb3VybmFsX2VuZCAqLworI2RlZmluZSBGTFVTSF9BTEwgICAxCQkvKiBmbHVzaCBjb21taXQgYW5kIHJlYWwgYmxvY2tzICovCisjZGVmaW5lIENPTU1JVF9OT1cgIDIJCS8qIGVuZCBhbmQgY29tbWl0IHRoaXMgdHJhbnNhY3Rpb24gKi8KKyNkZWZpbmUgV0FJVCAgICAgICAgNAkJLyogd2FpdCBmb3IgdGhlIGxvZyBibG9ja3MgdG8gaGl0IHRoZSBkaXNrKi8KKworc3RhdGljIGludCBkb19qb3VybmFsX2VuZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosc3RydWN0IHN1cGVyX2Jsb2NrICosdW5zaWduZWQgbG9uZyBuYmxvY2tzLGludCBmbGFncykgOworc3RhdGljIGludCBmbHVzaF9qb3VybmFsX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwgaW50IGZsdXNoYWxsKSA7CitzdGF0aWMgaW50IGZsdXNoX2NvbW1pdF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsIGludCBmbHVzaGFsbCkgIDsKK3N0YXRpYyBpbnQgY2FuX2RpcnR5KHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbikgOworc3RhdGljIGludCBqb3VybmFsX2pvaW4oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpOworc3RhdGljIGludCByZWxlYXNlX2pvdXJuYWxfZGV2KCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnN1cGVyLAorCQkJCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsICk7CitzdGF0aWMgaW50IGRpcnR5X29uZV90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCk7CitzdGF0aWMgdm9pZCBmbHVzaF9hc3luY19jb21taXRzKHZvaWQgKnApOworc3RhdGljIHZvaWQgcXVldWVfbG9nX3dyaXRlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpOworCisvKiB2YWx1ZXMgZm9yIGpvaW4gaW4gZG9fam91cm5hbF9iZWdpbl9yICovCitlbnVtIHsKKyAgICBKQkVHSU5fUkVHID0gMCwgLyogcmVndWxhciBqb3VybmFsIGJlZ2luICovCisgICAgSkJFR0lOX0pPSU4gPSAxLCAvKiBqb2luIHRoZSBydW5uaW5nIHRyYW5zYWN0aW9uIGlmIGF0IGFsbCBwb3NzaWJsZSAqLworICAgIEpCRUdJTl9BQk9SVCA9IDIsIC8qIGNhbGxlZCBmcm9tIGNsZWFudXAgY29kZSwgaWdub3JlcyBhYm9ydGVkIGZsYWcgKi8KK307CisKK3N0YXRpYyBpbnQgZG9fam91cm5hbF9iZWdpbl9yKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgbmJsb2NrcyxpbnQgam9pbik7CisKK3N0YXRpYyB2b2lkIGluaXRfam91cm5hbF9oYXNoKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKKyAgbWVtc2V0KGpvdXJuYWwtPmpfaGFzaF90YWJsZSwgMCwgSk9VUk5BTF9IQVNIX1NJWkUgKiBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKikpIDsKK30KKworLyoKKyoqIGNsZWFycyBCSF9EaXJ0eSBhbmQgc3RpY2tzIHRoZSBidWZmZXIgb24gdGhlIGNsZWFuIGxpc3QuICBDYWxsZWQgYmVjYXVzZSBJIGNhbid0IGFsbG93IHJlZmlsZV9idWZmZXIgdG8KKyoqIG1ha2Ugc2NoZWR1bGUgaGFwcGVuIGFmdGVyIEkndmUgZnJlZWQgYSBibG9jay4gIExvb2sgYXQgcmVtb3ZlX2Zyb21fdHJhbnNhY3Rpb24gYW5kIGpvdXJuYWxfbWFya19mcmVlZCBmb3IKKyoqIG1vcmUgZGV0YWlscy4KKyovCitzdGF0aWMgaW50IHJlaXNlcmZzX2NsZWFuX2FuZF9maWxlX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7CisgIGlmIChiaCkgeworICAgIGNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisgICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfdGVzdChiaCk7CisgIH0KKyAgcmV0dXJuIDAgOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX2JhcnJpZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmPSB+KDEgPDwgUkVJU0VSRlNfQkFSUklFUl9GTFVTSCk7CisgICAgcHJpbnRrKCJyZWlzZXJmczogZGlzYWJsaW5nIGZsdXNoIGJhcnJpZXJzIG9uICVzXG4iLCByZWlzZXJmc19iZGV2bmFtZShzKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKgorYWxsb2NhdGVfYml0bWFwX25vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKKyAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICpibiA7CisgIHN0YXRpYyBpbnQgaWQ7CisKKyAgYm4gPSByZWlzZXJmc19rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUpLCBHRlBfTk9GUywgcF9zX3NiKSA7CisgIGlmICghYm4pIHsKKyAgICByZXR1cm4gTlVMTCA7CisgIH0KKyAgYm4tPmRhdGEgPSByZWlzZXJmc19rbWFsbG9jKHBfc19zYi0+c19ibG9ja3NpemUsIEdGUF9OT0ZTLCBwX3Nfc2IpIDsKKyAgaWYgKCFibi0+ZGF0YSkgeworICAgIHJlaXNlcmZzX2tmcmVlKGJuLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlKSwgcF9zX3NiKSA7CisgICAgcmV0dXJuIE5VTEwgOworICB9CisgIGJuLT5pZCA9IGlkKysgOworICBtZW1zZXQoYm4tPmRhdGEsIDAsIHBfc19zYi0+c19ibG9ja3NpemUpIDsKKyAgSU5JVF9MSVNUX0hFQUQoJmJuLT5saXN0KSA7CisgIHJldHVybiBibiA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKgorZ2V0X2JpdG1hcF9ub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKKyAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICpibiA9IE5VTEw7CisgIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5ID0gam91cm5hbC0+al9iaXRtYXBfbm9kZXMubmV4dCA7CisKKyAgam91cm5hbC0+al91c2VkX2JpdG1hcF9ub2RlcysrIDsKK3JlcGVhdDoKKworICBpZihlbnRyeSAhPSAmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpIHsKKyAgICBibiA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSwgbGlzdCkgOworICAgIGxpc3RfZGVsKGVudHJ5KSA7CisgICAgbWVtc2V0KGJuLT5kYXRhLCAwLCBwX3Nfc2ItPnNfYmxvY2tzaXplKSA7CisgICAgam91cm5hbC0+al9mcmVlX2JpdG1hcF9ub2Rlcy0tIDsKKyAgICByZXR1cm4gYm4gOworICB9CisgIGJuID0gYWxsb2NhdGVfYml0bWFwX25vZGUocF9zX3NiKSA7CisgIGlmICghYm4pIHsKKyAgICB5aWVsZCgpOworICAgIGdvdG8gcmVwZWF0IDsKKyAgfQorICByZXR1cm4gYm4gOworfQorc3RhdGljIGlubGluZSB2b2lkIGZyZWVfYml0bWFwX25vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKmJuKSB7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKKyAgam91cm5hbC0+al91c2VkX2JpdG1hcF9ub2Rlcy0tIDsKKyAgaWYgKGpvdXJuYWwtPmpfZnJlZV9iaXRtYXBfbm9kZXMgPiBSRUlTRVJGU19NQVhfQklUTUFQX05PREVTKSB7CisgICAgcmVpc2VyZnNfa2ZyZWUoYm4tPmRhdGEsIHBfc19zYi0+c19ibG9ja3NpemUsIHBfc19zYikgOworICAgIHJlaXNlcmZzX2tmcmVlKGJuLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlKSwgcF9zX3NiKSA7CisgIH0gZWxzZSB7CisgICAgbGlzdF9hZGQoJmJuLT5saXN0LCAmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpIDsKKyAgICBqb3VybmFsLT5qX2ZyZWVfYml0bWFwX25vZGVzKysgOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGFsbG9jYXRlX2JpdG1hcF9ub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgeworICBpbnQgaSA7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKKyAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICpibiA9IE5VTEwgOworICBmb3IgKGkgPSAwIDsgaSA8IFJFSVNFUkZTX01JTl9CSVRNQVBfTk9ERVMgOyBpKyspIHsKKyAgICBibiA9IGFsbG9jYXRlX2JpdG1hcF9ub2RlKHBfc19zYikgOworICAgIGlmIChibikgeworICAgICAgbGlzdF9hZGQoJmJuLT5saXN0LCAmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpIDsKKyAgICAgIGpvdXJuYWwtPmpfZnJlZV9iaXRtYXBfbm9kZXMrKyA7CisgICAgfSBlbHNlIHsKKyAgICAgIGJyZWFrIDsgLy8gdGhpcyBpcyBvaywgd2UnbGwgdHJ5IGFnYWluIHdoZW4gbW9yZSBhcmUgbmVlZGVkIAorICAgIH0KKyAgfQorfQorCitzdGF0aWMgaW50IHNldF9iaXRfaW5fbGlzdF9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIGludCBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiKSB7CisgIGludCBibWFwX25yID0gYmxvY2sgLyAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSA8PCAzKSA7CisgIGludCBiaXRfbnIgPSBibG9jayAlIChwX3Nfc2ItPnNfYmxvY2tzaXplIDw8IDMpIDsKKworICBpZiAoIWpiLT5iaXRtYXBzW2JtYXBfbnJdKSB7CisgICAgamItPmJpdG1hcHNbYm1hcF9ucl0gPSBnZXRfYml0bWFwX25vZGUocF9zX3NiKSA7CisgIH0KKyAgc2V0X2JpdChiaXRfbnIsICh1bnNpZ25lZCBsb25nICopamItPmJpdG1hcHNbYm1hcF9ucl0tPmRhdGEpIDsKKyAgcmV0dXJuIDAgOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2JpdG1hcF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiKSB7CisgIGludCBpOworICBpZiAoamItPmJpdG1hcHMgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgZm9yIChpID0gMCA7IGkgPCBTQl9CTUFQX05SKHBfc19zYikgOyBpKyspIHsKKyAgICBpZiAoamItPmJpdG1hcHNbaV0pIHsKKyAgICAgIGZyZWVfYml0bWFwX25vZGUocF9zX3NiLCBqYi0+Yml0bWFwc1tpXSkgOworICAgICAgamItPmJpdG1hcHNbaV0gPSBOVUxMIDsKKyAgICB9CisgIH0KK30KKworLyoKKyoqIG9ubHkgY2FsbCB0aGlzIG9uIEZTIHVubW91bnQuCisqLworc3RhdGljIGludCBmcmVlX2xpc3RfYml0bWFwcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYl9hcnJheSkgeworICBpbnQgaSA7CisgIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamIgOworICBmb3IgKGkgPSAwIDsgaSA8IEpPVVJOQUxfTlVNX0JJVE1BUFMgOyBpKyspIHsKKyAgICBqYiA9IGpiX2FycmF5ICsgaSA7CisgICAgamItPmpvdXJuYWxfbGlzdCA9IE5VTEwgOworICAgIGNsZWFudXBfYml0bWFwX2xpc3QocF9zX3NiLCBqYikgOworICAgIHZmcmVlKGpiLT5iaXRtYXBzKSA7CisgICAgamItPmJpdG1hcHMgPSBOVUxMIDsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmcmVlX2JpdG1hcF9ub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgeworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7CisgIHN0cnVjdCBsaXN0X2hlYWQgKm5leHQgPSBqb3VybmFsLT5qX2JpdG1hcF9ub2Rlcy5uZXh0IDsKKyAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICpibiA7CisKKyAgd2hpbGUobmV4dCAhPSAmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpIHsKKyAgICBibiA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlLCBsaXN0KSA7CisgICAgbGlzdF9kZWwobmV4dCkgOworICAgIHJlaXNlcmZzX2tmcmVlKGJuLT5kYXRhLCBwX3Nfc2ItPnNfYmxvY2tzaXplLCBwX3Nfc2IpIDsKKyAgICByZWlzZXJmc19rZnJlZShibiwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSksIHBfc19zYikgOworICAgIG5leHQgPSBqb3VybmFsLT5qX2JpdG1hcF9ub2Rlcy5uZXh0IDsKKyAgICBqb3VybmFsLT5qX2ZyZWVfYml0bWFwX25vZGVzLS0gOworICB9CisKKyAgcmV0dXJuIDAgOworfQorCisvKgorKiogZ2V0IG1lbW9yeSBmb3IgSk9VUk5BTF9OVU1fQklUTUFQUyB3b3J0aCBvZiBiaXRtYXBzLiAKKyoqIGpiX2FycmF5IGlzIHRoZSBhcnJheSB0byBiZSBmaWxsZWQgaW4uCisqLworaW50IHJlaXNlcmZzX2FsbG9jYXRlX2xpc3RfYml0bWFwcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYl9hcnJheSwKKwkJCQkgICBpbnQgYm1hcF9ucikgeworICBpbnQgaSA7CisgIGludCBmYWlsZWQgPSAwIDsKKyAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYiA7CisgIGludCBtZW0gPSBibWFwX25yICogc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqKSA7CisKKyAgZm9yIChpID0gMCA7IGkgPCBKT1VSTkFMX05VTV9CSVRNQVBTIDsgaSsrKSB7CisgICAgamIgPSBqYl9hcnJheSArIGkgOworICAgIGpiLT5qb3VybmFsX2xpc3QgPSBOVUxMIDsKKyAgICBqYi0+Yml0bWFwcyA9IHZtYWxsb2MoIG1lbSApIDsKKyAgICBpZiAoIWpiLT5iaXRtYXBzKSB7CisgICAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImNsbS0yMDAwLCB1bmFibGUgdG8gYWxsb2NhdGUgYml0bWFwcyBmb3Igam91cm5hbCBsaXN0cyIpIDsKKyAgICAgIGZhaWxlZCA9IDE7ICAgCisgICAgICBicmVhayA7CisgICAgfQorICAgIG1lbXNldChqYi0+Yml0bWFwcywgMCwgbWVtKSA7CisgIH0KKyAgaWYgKGZhaWxlZCkgeworICAgIGZyZWVfbGlzdF9iaXRtYXBzKHBfc19zYiwgamJfYXJyYXkpIDsKKyAgICByZXR1cm4gLTEgOworICB9CisgIHJldHVybiAwIDsKK30KKworLyoKKyoqIGZpbmQgYW4gYXZhaWxhYmxlIGxpc3QgYml0bWFwLiAgSWYgeW91IGNhbid0IGZpbmQgb25lLCBmbHVzaCBhIGNvbW1pdCBsaXN0IAorKiogYW5kIHRyeSBhZ2FpbgorKi8KK3N0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKgorZ2V0X2xpc3RfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkgeworICBpbnQgaSxqIDsgCisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKKyAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYiA9IE5VTEwgOworCisgIGZvciAoaiA9IDAgOyBqIDwgKEpPVVJOQUxfTlVNX0JJVE1BUFMgKiAzKSA7IGorKykgeworICAgIGkgPSBqb3VybmFsLT5qX2xpc3RfYml0bWFwX2luZGV4IDsKKyAgICBqb3VybmFsLT5qX2xpc3RfYml0bWFwX2luZGV4ID0gKGkgKyAxKSAlIEpPVVJOQUxfTlVNX0JJVE1BUFMgOworICAgIGpiID0gam91cm5hbC0+al9saXN0X2JpdG1hcCArIGkgOworICAgIGlmIChqb3VybmFsLT5qX2xpc3RfYml0bWFwW2ldLmpvdXJuYWxfbGlzdCkgeworICAgICAgZmx1c2hfY29tbWl0X2xpc3QocF9zX3NiLCBqb3VybmFsLT5qX2xpc3RfYml0bWFwW2ldLmpvdXJuYWxfbGlzdCwgMSkgOworICAgICAgaWYgKCFqb3VybmFsLT5qX2xpc3RfYml0bWFwW2ldLmpvdXJuYWxfbGlzdCkgeworCWJyZWFrIDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgYnJlYWsgOworICAgIH0KKyAgfQorICBpZiAoamItPmpvdXJuYWxfbGlzdCkgeyAvKiBkb3VibGUgY2hlY2sgdG8gbWFrZSBzdXJlIGlmIGZsdXNoZWQgY29ycmVjdGx5ICovCisgICAgcmV0dXJuIE5VTEwgOworICB9CisgIGpiLT5qb3VybmFsX2xpc3QgPSBqbCA7CisgIHJldHVybiBqYiA7Cit9CisKKy8qIAorKiogYWxsb2NhdGVzIGEgbmV3IGNodW5rIG9mIFggbm9kZXMsIGFuZCBsaW5rcyB0aGVtIGFsbCB0b2dldGhlciBhcyBhIGxpc3QuCisqKiBVc2VzIHRoZSBjbm9kZS0+bmV4dCBhbmQgY25vZGUtPnByZXYgcG9pbnRlcnMKKyoqIHJldHVybnMgTlVMTCBvbiBmYWlsdXJlCisqLworc3RhdGljIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICphbGxvY2F0ZV9jbm9kZXMoaW50IG51bV9jbm9kZXMpIHsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmhlYWQgOworICBpbnQgaSA7CisgIGlmIChudW1fY25vZGVzIDw9IDApIHsKKyAgICByZXR1cm4gTlVMTCA7CisgIH0KKyAgaGVhZCA9IHZtYWxsb2MobnVtX2Nub2RlcyAqIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSkpIDsKKyAgaWYgKCFoZWFkKSB7CisgICAgcmV0dXJuIE5VTEwgOworICB9CisgIG1lbXNldChoZWFkLCAwLCBudW1fY25vZGVzICogc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlKSkgOworICBoZWFkWzBdLnByZXYgPSBOVUxMIDsKKyAgaGVhZFswXS5uZXh0ID0gaGVhZCArIDEgOworICBmb3IgKGkgPSAxIDsgaSA8IG51bV9jbm9kZXM7IGkrKykgeworICAgIGhlYWRbaV0ucHJldiA9IGhlYWQgKyAoaSAtIDEpIDsKKyAgICBoZWFkW2ldLm5leHQgPSBoZWFkICsgKGkgKyAxKSA7IC8qIGlmIGxhc3Qgb25lLCBvdmVyd3JpdGUgaXQgYWZ0ZXIgdGhlIGlmICovCisgIH0KKyAgaGVhZFtudW1fY25vZGVzIC0xXS5uZXh0ID0gTlVMTCA7CisgIHJldHVybiBoZWFkIDsKK30KKworLyoKKyoqIHB1bGxzIGEgY25vZGUgb2ZmIHRoZSBmcmVlIGxpc3QsIG9yIHJldHVybnMgTlVMTCBvbiBmYWlsdXJlIAorKi8KK3N0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqZ2V0X2Nub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbiA7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKKworICByZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHBfc19zYiwgImdldF9jbm9kZSIpIDsKKworICBpZiAoam91cm5hbC0+al9jbm9kZV9mcmVlIDw9IDApIHsKKyAgICByZXR1cm4gTlVMTCA7CisgIH0KKyAgam91cm5hbC0+al9jbm9kZV91c2VkKysgOworICBqb3VybmFsLT5qX2Nub2RlX2ZyZWUtLSA7CisgIGNuID0gam91cm5hbC0+al9jbm9kZV9mcmVlX2xpc3QgOworICBpZiAoIWNuKSB7CisgICAgcmV0dXJuIGNuIDsKKyAgfQorICBpZiAoY24tPm5leHQpIHsKKyAgICBjbi0+bmV4dC0+cHJldiA9IE5VTEwgOworICB9CisgIGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0ID0gY24tPm5leHQgOworICBtZW1zZXQoY24sIDAsIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSkpIDsKKyAgcmV0dXJuIGNuIDsKK30KKworLyoKKyoqIHJldHVybnMgYSBjbm9kZSB0byB0aGUgZnJlZSBsaXN0IAorKi8KK3N0YXRpYyB2b2lkIGZyZWVfY25vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbikgeworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7CisKKyAgcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChwX3Nfc2IsICJmcmVlX2Nub2RlIikgOworCisgIGpvdXJuYWwtPmpfY25vZGVfdXNlZC0tIDsKKyAgam91cm5hbC0+al9jbm9kZV9mcmVlKysgOworICAvKiBtZW1zZXQoY24sIDAsIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSkpIDsgKi8KKyAgY24tPm5leHQgPSBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCA7CisgIGlmIChqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCkgeworICAgIGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0LT5wcmV2ID0gY24gOworICB9CisgIGNuLT5wcmV2ID0gTlVMTCA7IC8qIG5vdCBuZWVkZWQgd2l0aCB0aGUgbWVtc2V0LCBidXQgSSBtaWdodCBraWxsIHRoZSBtZW1zZXQsIGFuZCBmb3JnZXQgdG8gZG8gdGhpcyAqLworICBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCA9IGNuIDsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfcHJlcGFyZWRfYml0cyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7CisgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX3ByZXBhcmVkIChiaCk7CisgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX3Jlc3RvcmVfZGlydHkgKGJoKTsKK30KKworLyogdXRpbGl0eSBmdW5jdGlvbiB0byBmb3JjZSBhIEJVRyBpZiBpdCBpcyBjYWxsZWQgd2l0aG91dCB0aGUgYmlnCisqKiBrZXJuZWwgbG9jayBoZWxkLiAgY2FsbGVyIGlzIHRoZSBzdHJpbmcgcHJpbnRlZCBqdXN0IGJlZm9yZSBjYWxsaW5nIEJVRygpCisqLwordm9pZCByZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNoYXIgKmNhbGxlcikgeworI2lmZGVmIENPTkZJR19TTVAKKyAgaWYgKGN1cnJlbnQtPmxvY2tfZGVwdGggPCAwKSB7CisgICAgcmVpc2VyZnNfcGFuaWMgKHNiLCAiJXMgY2FsbGVkIHdpdGhvdXQga2VybmVsIGxvY2sgaGVsZCIsIGNhbGxlcikgOworICB9CisjZWxzZQorICA7CisjZW5kaWYKK30KKworLyogcmV0dXJuIGEgY25vZGUgd2l0aCBzYW1lIGRldiwgYmxvY2sgbnVtYmVyIGFuZCBzaXplIGluIHRhYmxlLCBvciBudWxsIGlmIG5vdCBmb3VuZCAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqCitnZXRfam91cm5hbF9oYXNoX2RldihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICoqdGFibGUsCisJCSAgICAgbG9uZyBibCkKK3sKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuIDsKKyAgY24gPSBqb3VybmFsX2hhc2godGFibGUsIHNiLCBibCkgOworICB3aGlsZShjbikgeworICAgIGlmIChjbi0+YmxvY2tuciA9PSBibCAmJiBjbi0+c2IgPT0gc2IpCisgICAgICByZXR1cm4gY24gOworICAgIGNuID0gY24tPmhuZXh0IDsKKyAgfQorICByZXR1cm4gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICopMCA7Cit9CisKKy8qCisqKiB0aGlzIGFjdHVhbGx5IG1lYW5zICdjYW4gdGhpcyBibG9jayBiZSByZWFsbG9jYXRlZCB5ZXQ/Jy4gIElmIHlvdSBzZXQgc2VhcmNoX2FsbCwgYSBibG9jayBjYW4gb25seSBiZSBhbGxvY2F0ZWQKKyoqIGlmIGl0IGlzIG5vdCBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgd2FzIG5vdCBmcmVlZCBieSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgYW5kIGhhcyBubyBjaGFuY2Ugb2YgZXZlcgorKiogYmVpbmcgb3ZlcndyaXR0ZW4gYnkgYSByZXBsYXkgYWZ0ZXIgY3Jhc2hpbmcuCisqKgorKiogSWYgeW91IGRvbid0IHNldCBzZWFyY2hfYWxsLCBhIGJsb2NrIGNhbiBvbmx5IGJlIGFsbG9jYXRlZCBpZiBpdCBpcyBub3QgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uICBTaW5jZSBkZWxldGluZworKiogYSBibG9jayByZW1vdmVzIGl0IGZyb20gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24sIHRoaXMgY2FzZSBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgSWYgeW91IGRvbid0IHNldCBzZWFyY2hfYWxsLCBtYWtlCisqKiBzdXJlIHlvdSBuZXZlciB3cml0ZSB0aGUgYmxvY2sgd2l0aG91dCBsb2dnaW5nIGl0LgorKioKKyoqIG5leHRfemVyb19iaXQgaXMgYSBzdWdnZXN0aW9uIGFib3V0IHRoZSBuZXh0IGJsb2NrIHRvIHRyeSBmb3IgZmluZF9mb3J3YXJkLgorKiogd2hlbiBibCBpcyByZWplY3RlZCBiZWNhdXNlIGl0IGlzIHNldCBpbiBhIGpvdXJuYWwgbGlzdCBiaXRtYXAsIHdlIHNlYXJjaAorKiogZm9yIHRoZSBuZXh0IHplcm8gYml0IGluIHRoZSBiaXRtYXAgdGhhdCByZWplY3RlZCBibC4gIFRoZW4sIHdlIHJldHVybiB0aGF0CisqKiB0aHJvdWdoIG5leHRfemVyb19iaXQgZm9yIGZpbmRfZm9yd2FyZCB0byB0cnkuCisqKgorKiogSnVzdCBiZWNhdXNlIHdlIHJldHVybiBzb21ldGhpbmcgaW4gbmV4dF96ZXJvX2JpdCBkb2VzIG5vdCBtZWFuIHdlIHdvbid0CisqKiByZWplY3QgaXQgb24gdGhlIG5leHQgY2FsbCB0byByZWlzZXJmc19pbl9qb3VybmFsCisqKgorKi8KK2ludCByZWlzZXJmc19pbl9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJtYXBfbnIsIGludCBiaXRfbnIsIGludCBzZWFyY2hfYWxsLCAKKwkJCWJfYmxvY2tucl90ICpuZXh0X3plcm9fYml0KSB7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuIDsKKyAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYiA7CisgIGludCBpIDsKKyAgdW5zaWduZWQgbG9uZyBibDsKKworICAqbmV4dF96ZXJvX2JpdCA9IDAgOyAvKiBhbHdheXMgc3RhcnQgdGhpcyBhdCB6ZXJvLiAqLworCisgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgam91cm5hbC5pbl9qb3VybmFsICk7CisgIC8qIElmIHdlIGFyZW4ndCBkb2luZyBhIHNlYXJjaF9hbGwsIHRoaXMgaXMgYSBtZXRhYmxvY2ssIGFuZCBpdCB3aWxsIGJlIGxvZ2dlZCBiZWZvcmUgdXNlLgorICAqKiBpZiB3ZSBjcmFzaCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIHRoYXQgZnJlZWQgaXQgY29tbWl0cywgIHRoaXMgdHJhbnNhY3Rpb24gd29uJ3QKKyAgKiogaGF2ZSBjb21taXR0ZWQgZWl0aGVyLCBhbmQgdGhlIGJsb2NrIHdpbGwgbmV2ZXIgYmUgd3JpdHRlbgorICAqLworICBpZiAoc2VhcmNoX2FsbCkgeworICAgIGZvciAoaSA9IDAgOyBpIDwgSk9VUk5BTF9OVU1fQklUTUFQUyA7IGkrKykgeworICAgICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBqb3VybmFsLmluX2pvdXJuYWxfYml0bWFwICk7CisgICAgICBqYiA9IGpvdXJuYWwtPmpfbGlzdF9iaXRtYXAgKyBpIDsKKyAgICAgIGlmIChqYi0+am91cm5hbF9saXN0ICYmIGpiLT5iaXRtYXBzW2JtYXBfbnJdICYmCisgICAgICAgICAgdGVzdF9iaXQoYml0X25yLCAodW5zaWduZWQgbG9uZyAqKWpiLT5iaXRtYXBzW2JtYXBfbnJdLT5kYXRhKSkgeworCSpuZXh0X3plcm9fYml0ID0gZmluZF9uZXh0X3plcm9fYml0KCh1bnNpZ25lZCBsb25nICopCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamItPmJpdG1hcHNbYm1hcF9ucl0tPmRhdGEpLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSA8PCAzLCBiaXRfbnIrMSkgOyAKKwlyZXR1cm4gMSA7CisgICAgICB9CisgICAgfQorICB9CisKKyAgYmwgPSBibWFwX25yICogKHBfc19zYi0+c19ibG9ja3NpemUgPDwgMykgKyBiaXRfbnI7CisgIC8qIGlzIGl0IGluIGFueSBvbGQgdHJhbnNhY3Rpb25zPyAqLworICBpZiAoc2VhcmNoX2FsbCAmJiAoY24gPSBnZXRfam91cm5hbF9oYXNoX2RldihwX3Nfc2IsIGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLCBibCkpKSB7CisgICAgcmV0dXJuIDE7IAorICB9CisKKyAgLyogaXMgaXQgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uICBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKyAgaWYgKChjbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwgam91cm5hbC0+al9oYXNoX3RhYmxlLCBibCkpKSB7CisgICAgQlVHKCk7CisgICAgcmV0dXJuIDE7IAorICB9CisKKyAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBqb3VybmFsLmluX2pvdXJuYWxfcmV1c2FibGUgKTsKKyAgLyogc2FmZSBmb3IgcmV1c2UgKi8KKyAgcmV0dXJuIDAgOworfQorCisvKiBpbnNlcnQgY24gaW50byB0YWJsZQorKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnNlcnRfam91cm5hbF9oYXNoKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICoqdGFibGUsIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbikgeworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY25fb3JpZyA7CisKKyAgY25fb3JpZyA9IGpvdXJuYWxfaGFzaCh0YWJsZSwgY24tPnNiLCBjbi0+YmxvY2tucikgOworICBjbi0+aG5leHQgPSBjbl9vcmlnIDsKKyAgY24tPmhwcmV2ID0gTlVMTCA7CisgIGlmIChjbl9vcmlnKSB7CisgICAgY25fb3JpZy0+aHByZXYgPSBjbiA7CisgIH0KKyAgam91cm5hbF9oYXNoKHRhYmxlLCBjbi0+c2IsIGNuLT5ibG9ja25yKSA9ICBjbiA7Cit9CisKKy8qIGxvY2sgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gKi8KK2lubGluZSBzdGF0aWMgdm9pZCBsb2NrX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKKyAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwubG9ja19qb3VybmFsICk7CisgICAgZG93bigmU0JfSk9VUk5BTChwX3Nfc2IpLT5qX2xvY2spOworfQorCisvKiB1bmxvY2sgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gKi8KK2lubGluZSBzdGF0aWMgdm9pZCB1bmxvY2tfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgeworICAgIHVwKCZTQl9KT1VSTkFMKHBfc19zYiktPmpfbG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfam91cm5hbF9saXN0KHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKQoreworICAgIGpsLT5qX3JlZmNvdW50Kys7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfam91cm5hbF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCit7CisgICAgaWYgKGpsLT5qX3JlZmNvdW50IDwgMSkgeworICAgICAgICByZWlzZXJmc19wYW5pYyAocywgInRyYW5zIGlkICVsdSwgcmVmY291bnQgYXQgJWQiLCBqbC0+al90cmFuc19pZCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpsLT5qX3JlZmNvdW50KTsKKyAgICB9CisgICAgaWYgKC0tamwtPmpfcmVmY291bnQgPT0gMCkKKyAgICAgICAgcmVpc2VyZnNfa2ZyZWUoamwsIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0KSwgcyk7Cit9CisKKy8qCisqKiB0aGlzIHVzZWQgdG8gYmUgbXVjaCBtb3JlIGludm9sdmVkLCBhbmQgSSdtIGtlZXBpbmcgaXQganVzdCBpbiBjYXNlIHRoaW5ncyBnZXQgdWdseSBhZ2Fpbi4KKyoqIGl0IGdldHMgY2FsbGVkIGJ5IGZsdXNoX2NvbW1pdF9saXN0LCBhbmQgY2xlYW5zIHVwIGFueSBkYXRhIHN0b3JlZCBhYm91dCBibG9ja3MgZnJlZWQgZHVyaW5nIGEKKyoqIHRyYW5zYWN0aW9uLgorKi8KK3N0YXRpYyB2b2lkIGNsZWFudXBfZnJlZWRfZm9yX2pvdXJuYWxfbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpIHsKKworICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiID0gamwtPmpfbGlzdF9iaXRtYXAgOworICBpZiAoamIpIHsKKyAgICBjbGVhbnVwX2JpdG1hcF9saXN0KHBfc19zYiwgamIpIDsKKyAgfQorICBqbC0+al9saXN0X2JpdG1hcC0+am91cm5hbF9saXN0ID0gTlVMTCA7CisgIGpsLT5qX2xpc3RfYml0bWFwID0gTlVMTCA7Cit9CisKK3N0YXRpYyBpbnQgam91cm5hbF9saXN0X3N0aWxsX2FsaXZlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKKyAgICBzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSA9ICZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKworICAgIGlmICghbGlzdF9lbXB0eShlbnRyeSkpIHsKKyAgICAgICAgamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnktPm5leHQpOworCWlmIChqbC0+al90cmFuc19pZCA8PSB0cmFuc19pZCkgeworCSAgICByZXR1cm4gMTsKKwl9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZWlzZXJmc19lbmRfYnVmZmVyX2lvX3N5bmMoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKSB7CisgICAgY2hhciBiW0JERVZOQU1FX1NJWkVdOworCisgICAgaWYgKGJ1ZmZlcl9qb3VybmFsZWQoYmgpKSB7CisgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcoTlVMTCwgImNsbS0yMDg0OiBwaW5uZWQgYnVmZmVyICVsdTolcyBzZW50IHRvIGRpc2siLAorCSAgICAgICAgICAgICAgICAgYmgtPmJfYmxvY2tuciwgYmRldm5hbWUoYmgtPmJfYmRldiwgYikpIDsKKyAgICB9CisgICAgaWYgKHVwdG9kYXRlKQorICAgIAlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKSA7CisgICAgZWxzZQorICAgIAljbGVhcl9idWZmZXJfdXB0b2RhdGUoYmgpIDsKKyAgICB1bmxvY2tfYnVmZmVyKGJoKSA7CisgICAgcHV0X2JoKGJoKSA7Cit9CisKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX2VuZF9vcmRlcmVkX2lvKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB1cHRvZGF0ZSkgeworICAgIGlmICh1cHRvZGF0ZSkKKyAgICAJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCkgOworICAgIGVsc2UKKyAgICAJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKSA7CisgICAgdW5sb2NrX2J1ZmZlcihiaCkgOworICAgIHB1dF9iaChiaCkgOworfQorCitzdGF0aWMgdm9pZCBzdWJtaXRfbG9nZ2VkX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7CisgICAgZ2V0X2JoKGJoKSA7CisgICAgYmgtPmJfZW5kX2lvID0gcmVpc2VyZnNfZW5kX2J1ZmZlcl9pb19zeW5jIDsKKyAgICBjbGVhcl9idWZmZXJfam91cm5hbF9uZXcgKGJoKTsKKyAgICBjbGVhcl9idWZmZXJfZGlydHkoYmgpIDsKKyAgICBpZiAoIXRlc3RfY2xlYXJfYnVmZmVyX2pvdXJuYWxfdGVzdCAoYmgpKQorICAgICAgICBCVUcoKTsKKyAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisgICAgICAgIEJVRygpOworICAgIHN1Ym1pdF9iaChXUklURSwgYmgpIDsKK30KKworc3RhdGljIHZvaWQgc3VibWl0X29yZGVyZWRfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIHsKKyAgICBnZXRfYmgoYmgpIDsKKyAgICBiaC0+Yl9lbmRfaW8gPSByZWlzZXJmc19lbmRfb3JkZXJlZF9pbzsKKyAgICBjbGVhcl9idWZmZXJfZGlydHkoYmgpIDsKKyAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisgICAgICAgIEJVRygpOworICAgIHN1Ym1pdF9iaChXUklURSwgYmgpIDsKK30KKworc3RhdGljIGludCBzdWJtaXRfYmFycmllcl9idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgeworICAgIGdldF9iaChiaCkgOworICAgIGJoLT5iX2VuZF9pbyA9IHJlaXNlcmZzX2VuZF9vcmRlcmVkX2lvOworICAgIGNsZWFyX2J1ZmZlcl9kaXJ0eShiaCkgOworICAgIGlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKKyAgICAgICAgQlVHKCk7CisgICAgcmV0dXJuIHN1Ym1pdF9iaChXUklURV9CQVJSSUVSLCBiaCkgOworfQorCitzdGF0aWMgdm9pZCBjaGVja19iYXJyaWVyX2NvbXBsZXRpb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIHsKKyAgICBpZiAoYnVmZmVyX2VvcG5vdHN1cHAoYmgpKSB7CisJY2xlYXJfYnVmZmVyX2VvcG5vdHN1cHAoYmgpOworCWRpc2FibGVfYmFycmllcihzKTsKKwlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwlzZXRfYnVmZmVyX2RpcnR5KGJoKTsKKwlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CisgICAgfQorfQorCisjZGVmaW5lIENIVU5LX1NJWkUgMzIKK3N0cnVjdCBidWZmZXJfY2h1bmsgeworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhbQ0hVTktfU0laRV07CisgICAgaW50IG5yOworfTsKKworc3RhdGljIHZvaWQgd3JpdGVfY2h1bmsoc3RydWN0IGJ1ZmZlcl9jaHVuayAqY2h1bmspIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2h1bmstPm5yIDsgaSsrKSB7CisJc3VibWl0X2xvZ2dlZF9idWZmZXIoY2h1bmstPmJoW2ldKSA7CisgICAgfQorICAgIGNodW5rLT5uciA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX29yZGVyZWRfY2h1bmsoc3RydWN0IGJ1ZmZlcl9jaHVuayAqY2h1bmspIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2h1bmstPm5yIDsgaSsrKSB7CisJc3VibWl0X29yZGVyZWRfYnVmZmVyKGNodW5rLT5iaFtpXSkgOworICAgIH0KKyAgICBjaHVuay0+bnIgPSAwOworfQorCitzdGF0aWMgaW50IGFkZF90b19jaHVuayhzdHJ1Y3QgYnVmZmVyX2NodW5rICpjaHVuaywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCSBzcGlubG9ja190ICpsb2NrLAorCQkJIHZvaWQgKGZuKShzdHJ1Y3QgYnVmZmVyX2NodW5rICopKQoreworICAgIGludCByZXQgPSAwOworICAgIGlmIChjaHVuay0+bnIgPj0gQ0hVTktfU0laRSkKKyAgICAgICAgQlVHKCk7CisgICAgY2h1bmstPmJoW2NodW5rLT5ucisrXSA9IGJoOworICAgIGlmIChjaHVuay0+bnIgPj0gQ0hVTktfU0laRSkgeworCXJldCA9IDE7CisgICAgICAgIGlmIChsb2NrKQorCSAgICBzcGluX3VubG9jayhsb2NrKTsKKyAgICAgICAgZm4oY2h1bmspOworICAgICAgICBpZiAobG9jaykKKwkgICAgc3Bpbl9sb2NrKGxvY2spOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBhdG9taWNfdCBucl9yZWlzZXJmc19qaCA9IEFUT01JQ19JTklUKDApOworc3RhdGljIHN0cnVjdCByZWlzZXJmc19qaCAqYWxsb2Nfamgodm9pZCkgeworICAgIHN0cnVjdCByZWlzZXJmc19qaCAqamg7CisgICAgd2hpbGUoMSkgeworCWpoID0ga21hbGxvYyhzaXplb2YoKmpoKSwgR0ZQX05PRlMpOworCWlmIChqaCkgeworCSAgICBhdG9taWNfaW5jKCZucl9yZWlzZXJmc19qaCk7CisJICAgIHJldHVybiBqaDsKKwl9CisgICAgICAgIHlpZWxkKCk7CisgICAgfQorfQorCisvKgorICogd2Ugd2FudCB0byBmcmVlIHRoZSBqaCB3aGVuIHRoZSBidWZmZXIgaGFzIGJlZW4gd3JpdHRlbgorICogYW5kIHdhaXRlZCBvbgorICovCit2b2lkIHJlaXNlcmZzX2ZyZWVfamgoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgeworICAgIHN0cnVjdCByZWlzZXJmc19qaCAqamg7CisKKyAgICBqaCA9IGJoLT5iX3ByaXZhdGU7CisgICAgaWYgKGpoKSB7CisJYmgtPmJfcHJpdmF0ZSA9IE5VTEw7CisJamgtPmJoID0gTlVMTDsKKwlsaXN0X2RlbF9pbml0KCZqaC0+bGlzdCk7CisJa2ZyZWUoamgpOworCWlmIChhdG9taWNfcmVhZCgmbnJfcmVpc2VyZnNfamgpIDw9IDApCisJICAgIEJVRygpOworCWF0b21pY19kZWMoJm5yX3JlaXNlcmZzX2poKTsKKwlwdXRfYmgoYmgpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQgX19hZGRfamgoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmosIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFpbCkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfamggKmpoOworCisgICAgaWYgKGJoLT5iX3ByaXZhdGUpIHsKKwlzcGluX2xvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKTsKKwlpZiAoIWJoLT5iX3ByaXZhdGUpIHsKKwkgICAgc3Bpbl91bmxvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKTsKKwkgICAgZ290byBub19qaDsKKwl9CisgICAgICAgIGpoID0gYmgtPmJfcHJpdmF0ZTsKKwlsaXN0X2RlbF9pbml0KCZqaC0+bGlzdCk7CisgICAgfSBlbHNlIHsKK25vX2poOgorCWdldF9iaChiaCk7CisJamggPSBhbGxvY19qaCgpOworCXNwaW5fbG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOworCS8qIGJ1ZmZlciBtdXN0IGJlIGxvY2tlZCBmb3IgX19hZGRfamgsIHNob3VsZCBiZSBhYmxlIHRvIGhhdmUKKwkgKiB0d28gYWRkcyBhdCB0aGUgc2FtZSB0aW1lCisJICovCisJaWYgKGJoLT5iX3ByaXZhdGUpCisJICAgIEJVRygpOworCWpoLT5iaCA9IGJoOworCWJoLT5iX3ByaXZhdGUgPSBqaDsKKyAgICB9CisgICAgamgtPmpsID0gai0+al9jdXJyZW50X2psOworICAgIGlmICh0YWlsKQorCWxpc3RfYWRkX3RhaWwoJmpoLT5saXN0LCAmamgtPmpsLT5qX3RhaWxfYmhfbGlzdCk7CisgICAgZWxzZSB7CisJbGlzdF9hZGRfdGFpbCgmamgtPmxpc3QsICZqaC0+amwtPmpfYmhfbGlzdCk7CisgICAgfQorICAgIHNwaW5fdW5sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jayk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCByZWlzZXJmc19hZGRfdGFpbF9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIHsKKyAgICByZXR1cm4gX19hZGRfamgoU0JfSk9VUk5BTChpbm9kZS0+aV9zYiksIGJoLCAxKTsKK30KK2ludCByZWlzZXJmc19hZGRfb3JkZXJlZF9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIHsKKyAgICByZXR1cm4gX19hZGRfamgoU0JfSk9VUk5BTChpbm9kZS0+aV9zYiksIGJoLCAwKTsKK30KKworI2RlZmluZSBKSF9FTlRSWShsKSBsaXN0X2VudHJ5KChsKSwgc3RydWN0IHJlaXNlcmZzX2poLCBsaXN0KQorc3RhdGljIGludCB3cml0ZV9vcmRlcmVkX2J1ZmZlcnMoc3BpbmxvY2tfdCAqbG9jaywKKwkJCQkgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwKKwkJCQkgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworICAgIHN0cnVjdCByZWlzZXJmc19qaCAqamg7CisgICAgaW50IHJldCA9IGotPmpfZXJybm87CisgICAgc3RydWN0IGJ1ZmZlcl9jaHVuayBjaHVuazsKKyAgICBzdHJ1Y3QgbGlzdF9oZWFkIHRtcDsKKyAgICBJTklUX0xJU1RfSEVBRCgmdG1wKTsKKworICAgIGNodW5rLm5yID0gMDsKKyAgICBzcGluX2xvY2sobG9jayk7CisgICAgd2hpbGUoIWxpc3RfZW1wdHkobGlzdCkpIHsKKyAgICAgICAgamggPSBKSF9FTlRSWShsaXN0LT5uZXh0KTsKKwliaCA9IGpoLT5iaDsKKwlnZXRfYmgoYmgpOworCWlmICh0ZXN0X3NldF9idWZmZXJfbG9ja2VkKGJoKSkgeworCSAgICBpZiAoIWJ1ZmZlcl9kaXJ0eShiaCkpIHsKKwkJbGlzdF9kZWxfaW5pdCgmamgtPmxpc3QpOworCQlsaXN0X2FkZCgmamgtPmxpc3QsICZ0bXApOworCQlnb3RvIGxvb3BfbmV4dDsKKwkgICAgfQorCSAgICBzcGluX3VubG9jayhsb2NrKTsKKwkgICAgaWYgKGNodW5rLm5yKQorCQl3cml0ZV9vcmRlcmVkX2NodW5rKCZjaHVuayk7CisJICAgIHdhaXRfb25fYnVmZmVyKGJoKTsKKwkgICAgY29uZF9yZXNjaGVkKCk7CisJICAgIHNwaW5fbG9jayhsb2NrKTsKKwkgICAgZ290byBsb29wX25leHQ7CisgICAgICAgIH0KKwlpZiAoYnVmZmVyX2RpcnR5KGJoKSkgeworCSAgICBsaXN0X2RlbF9pbml0KCZqaC0+bGlzdCk7CisJICAgIGxpc3RfYWRkKCZqaC0+bGlzdCwgJnRtcCk7CisgICAgICAgICAgICBhZGRfdG9fY2h1bmsoJmNodW5rLCBiaCwgbG9jaywgd3JpdGVfb3JkZXJlZF9jaHVuayk7CisJfSBlbHNlIHsKKwkgICAgcmVpc2VyZnNfZnJlZV9qaChiaCk7CisJICAgIHVubG9ja19idWZmZXIoYmgpOworCX0KK2xvb3BfbmV4dDoKKwlwdXRfYmgoYmgpOworCWNvbmRfcmVzY2hlZF9sb2NrKGxvY2spOworICAgIH0KKyAgICBpZiAoY2h1bmsubnIpIHsKKwlzcGluX3VubG9jayhsb2NrKTsKKyAgICAgICAgd3JpdGVfb3JkZXJlZF9jaHVuaygmY2h1bmspOworCXNwaW5fbG9jayhsb2NrKTsKKyAgICB9CisgICAgd2hpbGUoIWxpc3RfZW1wdHkoJnRtcCkpIHsKKyAgICAgICAgamggPSBKSF9FTlRSWSh0bXAucHJldik7CisJYmggPSBqaC0+Ymg7CisJZ2V0X2JoKGJoKTsKKwlyZWlzZXJmc19mcmVlX2poKGJoKTsKKworCWlmIChidWZmZXJfbG9ja2VkKGJoKSkgeworCSAgICBzcGluX3VubG9jayhsb2NrKTsKKwkgICAgd2FpdF9vbl9idWZmZXIoYmgpOworCSAgICBzcGluX2xvY2sobG9jayk7CisJfQorCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCSAgICByZXQgPSAtRUlPOworICAgICAgICB9CisJcHV0X2JoKGJoKTsKKwljb25kX3Jlc2NoZWRfbG9jayhsb2NrKTsKKyAgICB9CisgICAgc3Bpbl91bmxvY2sobG9jayk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmbHVzaF9vbGRlcl9jb21taXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpIHsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKm90aGVyX2psOworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmZpcnN0X2psOworICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKKyAgICB1bnNpZ25lZCBsb25nIG90aGVyX3RyYW5zX2lkOworICAgIHVuc2lnbmVkIGxvbmcgZmlyc3RfdHJhbnNfaWQ7CisKK2ZpbmRfZmlyc3Q6CisgICAgLyoKKyAgICAgKiBmaXJzdCB3ZSB3YWxrIGJhY2t3YXJkcyB0byBmaW5kIHRoZSBvbGRlc3QgdW5jb21taXR0ZWQgdHJhbnNhdGlvbgorICAgICAqLworICAgIGZpcnN0X2psID0gamw7CisgICAgZW50cnkgPSBqbC0+al9saXN0LnByZXY7CisgICAgd2hpbGUoMSkgeworCW90aGVyX2psID0gSk9VUk5BTF9MSVNUX0VOVFJZKGVudHJ5KTsKKwlpZiAoZW50cnkgPT0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0IHx8CisJICAgIGF0b21pY19yZWFkKCZvdGhlcl9qbC0+al9vbGRlcl9jb21taXRzX2RvbmUpKQorCSAgICBicmVhazsKKworICAgICAgICBmaXJzdF9qbCA9IG90aGVyX2psOworCWVudHJ5ID0gb3RoZXJfamwtPmpfbGlzdC5wcmV2OworICAgIH0KKworICAgIC8qIGlmIHdlIGRpZG4ndCBmaW5kIGFueSBvbGRlciB1bmNvbW1pdHRlZCB0cmFuc2FjdGlvbnMsIHJldHVybiBub3cgKi8KKyAgICBpZiAoZmlyc3RfamwgPT0gamwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZmlyc3RfdHJhbnNfaWQgPSBmaXJzdF9qbC0+al90cmFuc19pZDsKKworICAgIGVudHJ5ID0gJmZpcnN0X2psLT5qX2xpc3Q7CisgICAgd2hpbGUoMSkgeworCW90aGVyX2psID0gSk9VUk5BTF9MSVNUX0VOVFJZKGVudHJ5KTsKKwlvdGhlcl90cmFuc19pZCA9IG90aGVyX2psLT5qX3RyYW5zX2lkOworCisJaWYgKG90aGVyX3RyYW5zX2lkIDwgdHJhbnNfaWQpIHsKKwkgICAgaWYgKGF0b21pY19yZWFkKCZvdGhlcl9qbC0+al9jb21taXRfbGVmdCkgIT0gMCkgeworCQlmbHVzaF9jb21taXRfbGlzdChzLCBvdGhlcl9qbCwgMCk7CisKKwkJLyogbGlzdCB3ZSB3ZXJlIGNhbGxlZCB3aXRoIGlzIGdvbmUsIHJldHVybiAqLworCQlpZiAoIWpvdXJuYWxfbGlzdF9zdGlsbF9hbGl2ZShzLCB0cmFuc19pZCkpCisJCSAgICByZXR1cm4gMTsKKworCQkvKiB0aGUgb25lIHdlIGp1c3QgZmx1c2hlZCBpcyBnb25lLCB0aGlzIG1lYW5zIGFsbAorCQkgKiBvbGRlciBsaXN0cyBhcmUgYWxzbyBnb25lLCBzbyBmaXJzdF9qbCBpcyBubyBsb25nZXIKKwkJICogdmFsaWQgZWl0aGVyLiAgR28gYmFjayB0byB0aGUgYmVnaW5uaW5nLgorCQkgKi8KKwkJaWYgKCFqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUocywgb3RoZXJfdHJhbnNfaWQpKSB7CisJCSAgICBnb3RvIGZpbmRfZmlyc3Q7CisJCX0KKwkgICAgfQorCSAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OworCSAgICBpZiAoZW50cnkgPT0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KQorCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gMDsKKwl9CisgICAgfQorICAgIHJldHVybiAwOworfQoraW50IHJlaXNlcmZzX2FzeW5jX3Byb2dyZXNzX3dhaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzKSB7CisgICAgREVGSU5FX1dBSVQod2FpdCk7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmogPSBTQl9KT1VSTkFMKHMpOworICAgIGlmIChhdG9taWNfcmVhZCgmai0+al9hc3luY190aHJvdHRsZSkpCisgICAgCWJsa19jb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzEwKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyoqIGlmIHRoaXMgam91cm5hbCBsaXN0IHN0aWxsIGhhcyBjb21taXQgYmxvY2tzIHVuZmx1c2hlZCwgc2VuZCB0aGVtIHRvIGRpc2suCisqKgorKiogbG9nIGFyZWFzIG11c3QgYmUgZmx1c2hlZCBpbiBvcmRlciAodHJhbnNhY3Rpb24gMiBjYW4ndCBjb21taXQgYmVmb3JlIHRyYW5zYWN0aW9uIDEpCisqKiBCZWZvcmUgdGhlIGNvbW1pdCBibG9jayBjYW4gYnkgd3JpdHRlbiwgZXZlcnkgb3RoZXIgbG9nIGJsb2NrIG11c3QgYmUgc2FmZWx5IG9uIGRpc2sKKyoqCisqLworc3RhdGljIGludCBmbHVzaF9jb21taXRfbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLCBpbnQgZmx1c2hhbGwpIHsKKyAgaW50IGk7CisgIGludCBibiA7CisgIHN0cnVjdCBidWZmZXJfaGVhZCAqdGJoID0gTlVMTCA7CisgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKKyAgaW50IGJhcnJpZXIgPSAwOworICBpbnQgcmV0dmFsID0gMDsKKworICByZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHMsICJmbHVzaF9jb21taXRfbGlzdCIpIDsKKworICBpZiAoYXRvbWljX3JlYWQoJmpsLT5qX29sZGVyX2NvbW1pdHNfZG9uZSkpIHsKKyAgICByZXR1cm4gMCA7CisgIH0KKworICAvKiBiZWZvcmUgd2UgY2FuIHB1dCBvdXIgY29tbWl0IGJsb2NrcyBvbiBkaXNrLCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSBldmVyeW9uZSBvbGRlciB0aGFuCisgICoqIHVzIGlzIG9uIGRpc2sgdG9vCisgICovCisgIEJVR19PTiAoamwtPmpfbGVuIDw9IDApOworICBCVUdfT04gKHRyYW5zX2lkID09IGpvdXJuYWwtPmpfdHJhbnNfaWQpOworCisgIGdldF9qb3VybmFsX2xpc3QoamwpOworICBpZiAoZmx1c2hhbGwpIHsKKyAgICBpZiAoZmx1c2hfb2xkZXJfY29tbWl0cyhzLCBqbCkgPT0gMSkgeworICAgICAgLyogbGlzdCBkaXNhcHBlYXJlZCBkdXJpbmcgZmx1c2hfb2xkZXJfY29tbWl0cy4gIHJldHVybiAqLworICAgICAgZ290byBwdXRfamw7CisgICAgfQorICB9CisKKyAgLyogbWFrZSBzdXJlIG5vYm9keSBpcyB0cnlpbmcgdG8gZmx1c2ggdGhpcyBvbmUgYXQgdGhlIHNhbWUgdGltZSAqLworICBkb3duKCZqbC0+al9jb21taXRfbG9jayk7CisgIGlmICgham91cm5hbF9saXN0X3N0aWxsX2FsaXZlKHMsIHRyYW5zX2lkKSkgeworICAgIHVwKCZqbC0+al9jb21taXRfbG9jayk7CisgICAgZ290byBwdXRfamw7CisgIH0KKyAgQlVHX09OIChqbC0+al90cmFuc19pZCA9PSAwKTsKKworICAvKiB0aGlzIGNvbW1pdCBpcyBkb25lLCBleGl0ICovCisgIGlmIChhdG9taWNfcmVhZCgmKGpsLT5qX2NvbW1pdF9sZWZ0KSkgPD0gMCkgeworICAgIGlmIChmbHVzaGFsbCkgeworICAgICAgYXRvbWljX3NldCgmKGpsLT5qX29sZGVyX2NvbW1pdHNfZG9uZSksIDEpIDsKKyAgICB9CisgICAgdXAoJmpsLT5qX2NvbW1pdF9sb2NrKTsKKyAgICBnb3RvIHB1dF9qbDsKKyAgfQorCisgIGlmICghbGlzdF9lbXB0eSgmamwtPmpfYmhfbGlzdCkpIHsKKyAgICAgIHVubG9ja19rZXJuZWwoKTsKKyAgICAgIHdyaXRlX29yZGVyZWRfYnVmZmVycygmam91cm5hbC0+al9kaXJ0eV9idWZmZXJzX2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgam91cm5hbCwgamwsICZqbC0+al9iaF9saXN0KTsKKyAgICAgIGxvY2tfa2VybmVsKCk7CisgIH0KKyAgQlVHX09OICghbGlzdF9lbXB0eSgmamwtPmpfYmhfbGlzdCkpOworICAvKgorICAgKiBmb3IgdGhlIGRlc2NyaXB0aW9uIGJsb2NrIGFuZCBhbGwgdGhlIGxvZyBibG9ja3MsIHN1Ym1pdCBhbnkgYnVmZmVycworICAgKiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSByZWFjaGVkIHRoZSBkaXNrCisgICAqLworICBhdG9taWNfaW5jKCZqb3VybmFsLT5qX2FzeW5jX3Rocm90dGxlKTsKKyAgZm9yIChpID0gMCA7IGkgPCAoamwtPmpfbGVuICsgMSkgOyBpKyspIHsKKyAgICBibiA9IFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhzKSArIChqbC0+al9zdGFydCtpKSAlCisgICAgICAgICBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHMpOworICAgIHRiaCA9IGpvdXJuYWxfZmluZF9nZXRfYmxvY2socywgYm4pIDsKKyAgICBpZiAoYnVmZmVyX2RpcnR5KHRiaCkpIC8qIHJlZHVuZGFudCwgbGxfcndfYmxvY2soKSBjaGVja3MgKi8KKwlsbF9yd19ibG9jayhXUklURSwgMSwgJnRiaCkgOworICAgIHB1dF9iaCh0YmgpIDsKKyAgfQorICBhdG9taWNfZGVjKCZqb3VybmFsLT5qX2FzeW5jX3Rocm90dGxlKTsKKworICAvKiB3YWl0IG9uIGV2ZXJ5dGhpbmcgd3JpdHRlbiBzbyBmYXIgYmVmb3JlIHdyaXRpbmcgdGhlIGNvbW1pdAorICAgKiBpZiB3ZSBhcmUgaW4gYmFycmllciBtb2RlLCBzZW5kIHRoZSBjb21taXQgZG93biBub3cKKyAgICovCisgIGJhcnJpZXIgPSByZWlzZXJmc19iYXJyaWVyX2ZsdXNoKHMpOworICBpZiAoYmFycmllcikgeworICAgICAgaW50IHJldDsKKyAgICAgIGxvY2tfYnVmZmVyKGpsLT5qX2NvbW1pdF9iaCk7CisgICAgICByZXQgPSBzdWJtaXRfYmFycmllcl9idWZmZXIoamwtPmpfY29tbWl0X2JoKTsKKyAgICAgIGlmIChyZXQgPT0gLUVPUE5PVFNVUFApIHsKKwkgIHNldF9idWZmZXJfdXB0b2RhdGUoamwtPmpfY29tbWl0X2JoKTsKKyAgICAgICAgICBkaXNhYmxlX2JhcnJpZXIocyk7CisJICBiYXJyaWVyID0gMDsKKyAgICAgIH0KKyAgfQorICBmb3IgKGkgPSAwIDsgIGkgPCAoamwtPmpfbGVuICsgMSkgOyBpKyspIHsKKyAgICBibiA9IFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhzKSArCisJIChqbC0+al9zdGFydCArIGkpICUgU0JfT05ESVNLX0pPVVJOQUxfU0laRShzKSA7CisgICAgdGJoID0gam91cm5hbF9maW5kX2dldF9ibG9jayhzLCBibikgOworICAgIHdhaXRfb25fYnVmZmVyKHRiaCkgOworICAgIC8vIHNpbmNlIHdlJ3JlIHVzaW5nIGxsX3J3X2JsayBhYm92ZSwgaXQgbWlnaHQgaGF2ZSBza2lwcGVkIG92ZXIKKyAgICAvLyBhIGxvY2tlZCBidWZmZXIuICBEb3VibGUgY2hlY2sgaGVyZQorICAgIC8vCisgICAgaWYgKGJ1ZmZlcl9kaXJ0eSh0YmgpKSAvKiByZWR1bmRhbnQsIHN5bmNfZGlydHlfYnVmZmVyKCkgY2hlY2tzICovCisgICAgICBzeW5jX2RpcnR5X2J1ZmZlcih0YmgpOworICAgIGlmICh1bmxpa2VseSAoIWJ1ZmZlcl91cHRvZGF0ZSh0YmgpKSkgeworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworICAgICAgcmVpc2VyZnNfd2FybmluZyhzLCAiam91cm5hbC02MDEsIGJ1ZmZlciB3cml0ZSBmYWlsZWQiKSA7CisjZW5kaWYKKyAgICAgIHJldHZhbCA9IC1FSU87CisgICAgfQorICAgIHB1dF9iaCh0YmgpIDsgLyogb25jZSBmb3Igam91cm5hbF9maW5kX2dldF9ibG9jayAqLworICAgIHB1dF9iaCh0YmgpIDsgICAgLyogb25jZSBkdWUgdG8gb3JpZ2luYWwgZ2V0YmxrIGluIGRvX2pvdXJuYWxfZW5kICovCisgICAgYXRvbWljX2RlYygmKGpsLT5qX2NvbW1pdF9sZWZ0KSkgOworICB9CisKKyAgQlVHX09OIChhdG9taWNfcmVhZCgmKGpsLT5qX2NvbW1pdF9sZWZ0KSkgIT0gMSk7CisKKyAgaWYgKCFiYXJyaWVyKSB7CisgICAgICBpZiAoYnVmZmVyX2RpcnR5KGpsLT5qX2NvbW1pdF9iaCkpCisJQlVHKCk7CisgICAgICBtYXJrX2J1ZmZlcl9kaXJ0eShqbC0+al9jb21taXRfYmgpIDsKKyAgICAgIHN5bmNfZGlydHlfYnVmZmVyKGpsLT5qX2NvbW1pdF9iaCkgOworICB9IGVsc2UKKyAgICAgIHdhaXRfb25fYnVmZmVyKGpsLT5qX2NvbW1pdF9iaCk7CisKKyAgY2hlY2tfYmFycmllcl9jb21wbGV0aW9uKHMsIGpsLT5qX2NvbW1pdF9iaCk7CisKKyAgLyogSWYgdGhlcmUgd2FzIGEgd3JpdGUgZXJyb3IgaW4gdGhlIGpvdXJuYWwgLSB3ZSBjYW4ndCBjb21taXQgdGhpcworICAgKiB0cmFuc2FjdGlvbiAtIGl0IHdpbGwgYmUgaW52YWxpZCBhbmQsIGlmIHN1Y2Nlc3NmdWwsIHdpbGwganVzdCBlbmQKKyAgICogdXAgcHJvcG9nYXRpbmcgdGhlIHdyaXRlIGVycm9yIG91dCB0byB0aGUgZmlsZXN5c3RlbS4gKi8KKyAgaWYgKHVubGlrZWx5ICghYnVmZmVyX3VwdG9kYXRlKGpsLT5qX2NvbW1pdF9iaCkpKSB7CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisgICAgcmVpc2VyZnNfd2FybmluZyhzLCAiam91cm5hbC02MTU6IGJ1ZmZlciB3cml0ZSBmYWlsZWQiKSA7CisjZW5kaWYKKyAgICByZXR2YWwgPSAtRUlPOworICB9CisgIGJmb3JnZXQoamwtPmpfY29tbWl0X2JoKSA7CisgIGlmIChqb3VybmFsLT5qX2xhc3RfY29tbWl0X2lkICE9IDAgJiYKKyAgICAgKGpsLT5qX3RyYW5zX2lkIC0gam91cm5hbC0+al9sYXN0X2NvbW1pdF9pZCkgIT0gMSkgeworICAgICAgcmVpc2VyZnNfd2FybmluZyhzLCAiY2xtLTIyMDA6IGxhc3QgY29tbWl0ICVsdSwgY3VycmVudCAlbHUiLAorICAgICAgICAgICAgICAgICAgICAgICBqb3VybmFsLT5qX2xhc3RfY29tbWl0X2lkLAorCQkgICAgICAgamwtPmpfdHJhbnNfaWQpOworICB9CisgIGpvdXJuYWwtPmpfbGFzdF9jb21taXRfaWQgPSBqbC0+al90cmFuc19pZDsKKworICAvKiBub3csIGV2ZXJ5IGNvbW1pdCBibG9jayBpcyBvbiB0aGUgZGlzay4gIEl0IGlzIHNhZmUgdG8gYWxsb3cgYmxvY2tzIGZyZWVkIGR1cmluZyB0aGlzIHRyYW5zYWN0aW9uIHRvIGJlIHJlYWxsb2NhdGVkICovCisgIGNsZWFudXBfZnJlZWRfZm9yX2pvdXJuYWxfbGlzdChzLCBqbCkgOworCisgIHJldHZhbCA9IHJldHZhbCA/IHJldHZhbCA6IGpvdXJuYWwtPmpfZXJybm87CisKKyAgLyogbWFyayB0aGUgbWV0YWRhdGEgZGlydHkgKi8KKyAgaWYgKCFyZXR2YWwpCisgICAgZGlydHlfb25lX3RyYW5zYWN0aW9uKHMsIGpsKTsKKyAgYXRvbWljX2RlYygmKGpsLT5qX2NvbW1pdF9sZWZ0KSkgOworCisgIGlmIChmbHVzaGFsbCkgeworICAgIGF0b21pY19zZXQoJihqbC0+al9vbGRlcl9jb21taXRzX2RvbmUpLCAxKSA7CisgIH0KKyAgdXAoJmpsLT5qX2NvbW1pdF9sb2NrKTsKK3B1dF9qbDoKKyAgcHV0X2pvdXJuYWxfbGlzdChzLCBqbCk7CisKKyAgaWYgKHJldHZhbCkKKyAgICByZWlzZXJmc19hYm9ydCAocywgcmV0dmFsLCAiSm91cm5hbCB3cml0ZSBlcnJvciBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisqKiBmbHVzaF9qb3VybmFsX2xpc3QgZnJlcXVlbnRseSBuZWVkcyB0byBmaW5kIGEgbmV3ZXIgdHJhbnNhY3Rpb24gZm9yIGEgZ2l2ZW4gYmxvY2suICBUaGlzIGRvZXMgdGhhdCwgb3IgCisqKiByZXR1cm5zIE5VTEwgaWYgaXQgY2FuJ3QgZmluZCBhbnl0aGluZyAKKyovCitzdGF0aWMgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqZmluZF9uZXdlcl9qbF9mb3JfY24oc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuKSB7CisgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBjbi0+c2I7CisgIGJfYmxvY2tucl90IGJsb2NrbnIgPSBjbi0+YmxvY2tuciA7CisKKyAgY24gPSBjbi0+aHByZXYgOworICB3aGlsZShjbikgeworICAgIGlmIChjbi0+c2IgPT0gc2IgJiYgY24tPmJsb2NrbnIgPT0gYmxvY2tuciAmJiBjbi0+amxpc3QpIHsKKyAgICAgIHJldHVybiBjbi0+amxpc3QgOworICAgIH0KKyAgICBjbiA9IGNuLT5ocHJldiA7CisgIH0KKyAgcmV0dXJuIE5VTEwgOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfam91cm5hbF9oYXNoKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqKiwKK3N0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKiwgdW5zaWduZWQgbG9uZywgaW50KTsKKworLyoKKyoqIG9uY2UgYWxsIHRoZSByZWFsIGJsb2NrcyBoYXZlIGJlZW4gZmx1c2hlZCwgaXQgaXMgc2FmZSB0byByZW1vdmUgdGhlbSBmcm9tIHRoZQorKiogam91cm5hbCBsaXN0IGZvciB0aGlzIHRyYW5zYWN0aW9uLiAgQXNpZGUgZnJvbSBmcmVlaW5nIHRoZSBjbm9kZSwgdGhpcyBhbHNvIGFsbG93cyB0aGUKKyoqIGJsb2NrIHRvIGJlIHJlYWxsb2NhdGVkIGZvciBkYXRhIGJsb2NrcyBpZiBpdCBoYWQgYmVlbiBkZWxldGVkLgorKi8KK3N0YXRpYyB2b2lkIHJlbW92ZV9hbGxfZnJvbV9qb3VybmFsX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLCBpbnQgZGVidWcpIHsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24sICpsYXN0IDsKKyAgY24gPSBqbC0+al9yZWFsYmxvY2sgOworCisgIC8qIHdoaWNoIGlzIGJldHRlciwgdG8gbG9jayBvbmNlIGFyb3VuZCB0aGUgd2hvbGUgbG9vcCwgb3IKKyAgKiogdG8gbG9jayBmb3IgZWFjaCBjYWxsIHRvIHJlbW92ZV9qb3VybmFsX2hhc2g/CisgICovCisgIHdoaWxlKGNuKSB7CisgICAgaWYgKGNuLT5ibG9ja25yICE9IDApIHsKKyAgICAgIGlmIChkZWJ1ZykgeworICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImJsb2NrICV1LCBiaCBpcyAlZCwgc3RhdGUgJWxkIiwgY24tPmJsb2NrbnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY24tPmJoID8gMTogMCwgY24tPnN0YXRlKSA7CisgICAgICB9CisgICAgICBjbi0+c3RhdGUgPSAwIDsKKyAgICAgIHJlbW92ZV9qb3VybmFsX2hhc2gocF9zX3NiLCBqb3VybmFsLT5qX2xpc3RfaGFzaF90YWJsZSwgamwsIGNuLT5ibG9ja25yLCAxKSA7CisgICAgfQorICAgIGxhc3QgPSBjbiA7CisgICAgY24gPSBjbi0+bmV4dCA7CisgICAgZnJlZV9jbm9kZShwX3Nfc2IsIGxhc3QpIDsKKyAgfQorICBqbC0+al9yZWFsYmxvY2sgPSBOVUxMIDsKK30KKworLyoKKyoqIGlmIHRoaXMgdGltZXN0YW1wIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdGltZXN0YW1wIHdlIHdyb3RlIGxhc3QgdG8gdGhlIGhlYWRlciBibG9jaywgd3JpdGUgaXQgdG8gdGhlIGhlYWRlciBibG9jay4KKyoqIG9uY2UgdGhpcyBpcyBkb25lLCBJIGNhbiBzYWZlbHkgc2F5IHRoZSBsb2cgYXJlYSBmb3IgdGhpcyB0cmFuc2FjdGlvbiB3b24ndCBldmVyIGJlIHJlcGxheWVkLCBhbmQgSSBjYW4gc3RhcnQKKyoqIHJlbGVhc2luZyBibG9ja3MgaW4gdGhpcyB0cmFuc2FjdGlvbiBmb3IgcmV1c2UgYXMgZGF0YSBibG9ja3MuCisqKiBjYWxsZWQgYnkgZmx1c2hfam91cm5hbF9saXN0LCBiZWZvcmUgaXQgY2FsbHMgcmVtb3ZlX2FsbF9mcm9tX2pvdXJuYWxfbGlzdAorKioKKyovCitzdGF0aWMgaW50IF91cGRhdGVfam91cm5hbF9oZWFkZXJfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHRyYW5zX2lkKSB7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2hlYWRlciAqamggOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7CisKKyAgaWYgKHJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZCAoam91cm5hbCkpCisgICAgcmV0dXJuIC1FSU87CisKKyAgaWYgKHRyYW5zX2lkID49IGpvdXJuYWwtPmpfbGFzdF9mbHVzaF90cmFuc19pZCkgeworICAgIGlmIChidWZmZXJfbG9ja2VkKChqb3VybmFsLT5qX2hlYWRlcl9iaCkpKSAgeworICAgICAgd2FpdF9vbl9idWZmZXIoKGpvdXJuYWwtPmpfaGVhZGVyX2JoKSkgOworICAgICAgaWYgKHVubGlrZWx5ICghYnVmZmVyX3VwdG9kYXRlKGpvdXJuYWwtPmpfaGVhZGVyX2JoKSkpIHsKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKyAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiam91cm5hbC02OTk6IGJ1ZmZlciB3cml0ZSBmYWlsZWQiKSA7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICB9CisgICAgfQorICAgIGpvdXJuYWwtPmpfbGFzdF9mbHVzaF90cmFuc19pZCA9IHRyYW5zX2lkIDsKKyAgICBqb3VybmFsLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQgPSBvZmZzZXQgOworICAgIGpoID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2hlYWRlciAqKShqb3VybmFsLT5qX2hlYWRlcl9iaC0+Yl9kYXRhKSA7CisgICAgamgtPmpfbGFzdF9mbHVzaF90cmFuc19pZCA9IGNwdV90b19sZTMyKHRyYW5zX2lkKSA7CisgICAgamgtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCA9IGNwdV90b19sZTMyKG9mZnNldCkgOworICAgIGpoLT5qX21vdW50X2lkID0gY3B1X3RvX2xlMzIoam91cm5hbC0+al9tb3VudF9pZCkgOworCisgICAgaWYgKHJlaXNlcmZzX2JhcnJpZXJfZmx1c2gocF9zX3NiKSkgeworCWludCByZXQ7CisJbG9ja19idWZmZXIoam91cm5hbC0+al9oZWFkZXJfYmgpOworCXJldCA9IHN1Ym1pdF9iYXJyaWVyX2J1ZmZlcihqb3VybmFsLT5qX2hlYWRlcl9iaCk7CisJaWYgKHJldCA9PSAtRU9QTk9UU1VQUCkgeworCSAgICBzZXRfYnVmZmVyX3VwdG9kYXRlKGpvdXJuYWwtPmpfaGVhZGVyX2JoKTsKKwkgICAgZGlzYWJsZV9iYXJyaWVyKHBfc19zYik7CisJICAgIGdvdG8gc3luYzsKKwl9CisJd2FpdF9vbl9idWZmZXIoam91cm5hbC0+al9oZWFkZXJfYmgpOworCWNoZWNrX2JhcnJpZXJfY29tcGxldGlvbihwX3Nfc2IsIGpvdXJuYWwtPmpfaGVhZGVyX2JoKTsKKyAgICB9IGVsc2Ugeworc3luYzoKKwlzZXRfYnVmZmVyX2RpcnR5KGpvdXJuYWwtPmpfaGVhZGVyX2JoKSA7CisJc3luY19kaXJ0eV9idWZmZXIoam91cm5hbC0+al9oZWFkZXJfYmgpIDsKKyAgICB9CisgICAgaWYgKCFidWZmZXJfdXB0b2RhdGUoam91cm5hbC0+al9oZWFkZXJfYmgpKSB7CisgICAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJqb3VybmFsLTgzNzogSU8gZXJyb3IgZHVyaW5nIGpvdXJuYWwgcmVwbGF5Iik7CisgICAgICByZXR1cm4gLUVJTyA7CisgICAgfQorICB9CisgIHJldHVybiAwIDsKK30KKworc3RhdGljIGludCB1cGRhdGVfam91cm5hbF9oZWFkZXJfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHRyYW5zX2lkKSB7CisgICAgcmV0dXJuIF91cGRhdGVfam91cm5hbF9oZWFkZXJfYmxvY2socF9zX3NiLCBvZmZzZXQsIHRyYW5zX2lkKTsKK30KKy8qIAorKiogZmx1c2ggYW55IGFuZCBhbGwgam91cm5hbCBsaXN0cyBvbGRlciB0aGFuIHlvdSBhcmUgCisqKiBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBmbHVzaF9qb3VybmFsX2xpc3QKKyovCitzdGF0aWMgaW50IGZsdXNoX29sZGVyX2pvdXJuYWxfbGlzdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCit7CisgICAgc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqb3RoZXJfamwgOworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKKyAgICB1bnNpZ25lZCBsb25nIHRyYW5zX2lkID0gamwtPmpfdHJhbnNfaWQ7CisKKyAgICAvKiB3ZSBrbm93IHdlIGFyZSB0aGUgb25seSBvbmVzIGZsdXNoaW5nIHRoaW5ncywgbm8gZXh0cmEgcmFjZQorICAgICAqIHByb3RlY3Rpb24gaXMgcmVxdWlyZWQuCisgICAgICovCityZXN0YXJ0OgorICAgIGVudHJ5ID0gam91cm5hbC0+al9qb3VybmFsX2xpc3QubmV4dDsKKyAgICAvKiBEaWQgd2Ugd3JhcD8gKi8KKyAgICBpZiAoZW50cnkgPT0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KQorICAgICAgICByZXR1cm4gMDsKKyAgICBvdGhlcl9qbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7CisgICAgaWYgKG90aGVyX2psLT5qX3RyYW5zX2lkIDwgdHJhbnNfaWQpIHsKKyAgICAgICAgQlVHX09OIChvdGhlcl9qbC0+al9yZWZjb3VudCA8PSAwKTsKKwkvKiBkbyBub3QgZmx1c2ggYWxsICovCisJZmx1c2hfam91cm5hbF9saXN0KHBfc19zYiwgb3RoZXJfamwsIDApIDsKKworCS8qIG90aGVyX2psIGlzIG5vdyBkZWxldGVkIGZyb20gdGhlIGxpc3QgKi8KKwlnb3RvIHJlc3RhcnQ7CisgICAgfQorICAgIHJldHVybiAwIDsKK30KKworc3RhdGljIHZvaWQgZGVsX2Zyb21fd29ya19saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkgeworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocyk7CisgICAgaWYgKCFsaXN0X2VtcHR5KCZqbC0+al93b3JraW5nX2xpc3QpKSB7CisJbGlzdF9kZWxfaW5pdCgmamwtPmpfd29ya2luZ19saXN0KTsKKwlqb3VybmFsLT5qX251bV93b3JrX2xpc3RzLS07CisgICAgfQorfQorCisvKiBmbHVzaCBhIGpvdXJuYWwgbGlzdCwgYm90aCBjb21taXQgYW5kIHJlYWwgYmxvY2tzCisqKgorKiogYWx3YXlzIHNldCBmbHVzaGFsbCB0byAxLCB1bmxlc3MgeW91IGFyZSBjYWxsaW5nIGZyb20gaW5zaWRlCisqKiBmbHVzaF9qb3VybmFsX2xpc3QKKyoqCisqKiBJTVBPUlRBTlQuICBUaGlzIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGlsZSB0aGVyZSBhcmUgbm8gam91cm5hbCB3cml0ZXJzLCAKKyoqIGFuZCB0aGUgam91cm5hbCBpcyBsb2NrZWQuICBUaGF0IG1lYW5zIGl0IGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIAorKiogZG9fam91cm5hbF9lbmQsIG9yIGJ5IGpvdXJuYWxfcmVsZWFzZQorKi8KK3N0YXRpYyBpbnQgZmx1c2hfam91cm5hbF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwgaW50IGZsdXNoYWxsKSB7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKnBqbCA7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbiwgKmxhc3QgOworICBpbnQgY291bnQgOworICBpbnQgd2FzX2p3YWl0ID0gMCA7CisgIGludCB3YXNfZGlydHkgPSAwIDsKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICpzYXZlZF9iaCA7IAorICB1bnNpZ25lZCBsb25nIGpfbGVuX3NhdmVkID0gamwtPmpfbGVuIDsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKKyAgaW50IGVyciA9IDA7CisKKyAgQlVHX09OIChqX2xlbl9zYXZlZCA8PSAwKTsKKworICBpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfd2NvdW50KSAhPSAwKSB7CisgICAgcmVpc2VyZnNfd2FybmluZyhzLCAiY2xtLTIwNDg6IGZsdXNoX2pvdXJuYWxfbGlzdCBjYWxsZWQgd2l0aCB3Y291bnQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIGF0b21pY19yZWFkKCZqb3VybmFsLT5qX3djb3VudCkpIDsKKyAgfQorICBCVUdfT04gKGpsLT5qX3RyYW5zX2lkID09IDApOworCisgIC8qIGlmIGZsdXNoYWxsID09IDAsIHRoZSBsb2NrIGlzIGFscmVhZHkgaGVsZCAqLworICBpZiAoZmx1c2hhbGwpIHsKKyAgICAgIGRvd24oJmpvdXJuYWwtPmpfZmx1c2hfc2VtKTsKKyAgfSBlbHNlIGlmICghZG93bl90cnlsb2NrKCZqb3VybmFsLT5qX2ZsdXNoX3NlbSkpIHsKKyAgICAgIEJVRygpOworICB9CisKKyAgY291bnQgPSAwIDsKKyAgaWYgKGpfbGVuX3NhdmVkID4gam91cm5hbC0+al90cmFuc19tYXgpIHsKKyAgICByZWlzZXJmc19wYW5pYyhzLCAiam91cm5hbC03MTU6IGZsdXNoX2pvdXJuYWxfbGlzdCwgbGVuZ3RoIGlzICVsdSwgdHJhbnMgaWQgJWx1XG4iLCBqX2xlbl9zYXZlZCwgamwtPmpfdHJhbnNfaWQpOworICAgIHJldHVybiAwIDsKKyAgfQorCisgIC8qIGlmIGFsbCB0aGUgd29yayBpcyBhbHJlYWR5IGRvbmUsIGdldCBvdXQgb2YgaGVyZSAqLworICBpZiAoYXRvbWljX3JlYWQoJihqbC0+al9ub256ZXJvbGVuKSkgPD0gMCAmJiAKKyAgICAgIGF0b21pY19yZWFkKCYoamwtPmpfY29tbWl0X2xlZnQpKSA8PSAwKSB7CisgICAgZ290byBmbHVzaF9vbGRlcl9hbmRfcmV0dXJuIDsKKyAgfSAKKworICAvKiBzdGFydCBieSBwdXR0aW5nIHRoZSBjb21taXQgbGlzdCBvbiBkaXNrLiAgVGhpcyB3aWxsIGFsc28gZmx1c2ggCisgICoqIHRoZSBjb21taXQgbGlzdHMgb2YgYW55IG9sZGVycyB0cmFuc2FjdGlvbnMKKyAgKi8KKyAgZmx1c2hfY29tbWl0X2xpc3QocywgamwsIDEpIDsKKworICBpZiAoIShqbC0+al9zdGF0ZSAmIExJU1RfRElSVFkpICYmICFyZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQgKGpvdXJuYWwpKQorICAgICAgQlVHKCk7CisKKyAgLyogYXJlIHdlIGRvbmUgbm93PyAqLworICBpZiAoYXRvbWljX3JlYWQoJihqbC0+al9ub256ZXJvbGVuKSkgPD0gMCAmJiAKKyAgICAgIGF0b21pY19yZWFkKCYoamwtPmpfY29tbWl0X2xlZnQpKSA8PSAwKSB7CisgICAgZ290byBmbHVzaF9vbGRlcl9hbmRfcmV0dXJuIDsKKyAgfQorCisgIC8qIGxvb3AgdGhyb3VnaCBlYWNoIGNub2RlLCBzZWUgaWYgd2UgbmVlZCB0byB3cml0ZSBpdCwgCisgICoqIG9yIHdhaXQgb24gYSBtb3JlIHJlY2VudCB0cmFuc2FjdGlvbiwgb3IganVzdCBpZ25vcmUgaXQgCisgICovCisgIGlmIChhdG9taWNfcmVhZCgmKGpvdXJuYWwtPmpfd2NvdW50KSkgIT0gMCkgeworICAgIHJlaXNlcmZzX3BhbmljKHMsICJqb3VybmFsLTg0NDogcGFuaWMgam91cm5hbCBsaXN0IGlzIGZsdXNoaW5nLCB3Y291bnQgaXMgbm90IDBcbiIpIDsKKyAgfQorICBjbiA9IGpsLT5qX3JlYWxibG9jayA7CisgIHdoaWxlKGNuKSB7CisgICAgd2FzX2p3YWl0ID0gMCA7CisgICAgd2FzX2RpcnR5ID0gMCA7CisgICAgc2F2ZWRfYmggPSBOVUxMIDsKKyAgICAvKiBibG9ja25yIG9mIDAgaXMgbm8gbG9uZ2VyIGluIHRoZSBoYXNoLCBpZ25vcmUgaXQgKi8KKyAgICBpZiAoY24tPmJsb2NrbnIgPT0gMCkgeworICAgICAgZ290byBmcmVlX2Nub2RlIDsKKyAgICB9CisKKyAgICAvKiBUaGlzIHRyYW5zYWN0aW9uIGZhaWxlZCBjb21taXQuIERvbid0IHdyaXRlIG91dCB0byB0aGUgZGlzayAqLworICAgIGlmICghKGpsLT5qX3N0YXRlICYgTElTVF9ESVJUWSkpCisgICAgICAgIGdvdG8gZnJlZV9jbm9kZTsKKworICAgIHBqbCA9IGZpbmRfbmV3ZXJfamxfZm9yX2NuKGNuKSA7CisgICAgLyogdGhlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLiAgV2UgY2hlY2sgcGpsIHRvIG1ha2Ugc3VyZSB3ZQorICAgICoqIGRvbid0IGNsZWFyIEJIX0pEaXJ0eV93YWl0IGlmIHdlIGFyZW4ndCB0aGUgb25lIHdyaXRpbmcgdGhpcworICAgICoqIGJsb2NrIHRvIGRpc2sKKyAgICAqLworICAgIGlmICghcGpsICYmIGNuLT5iaCkgeworICAgICAgc2F2ZWRfYmggPSBjbi0+YmggOworCisgICAgICAvKiB3ZSBkbyB0aGlzIHRvIG1ha2Ugc3VyZSBub2JvZHkgcmVsZWFzZXMgdGhlIGJ1ZmZlciB3aGlsZSAKKyAgICAgICoqIHdlIGFyZSB3b3JraW5nIHdpdGggaXQgCisgICAgICAqLworICAgICAgZ2V0X2JoKHNhdmVkX2JoKSA7CisKKyAgICAgIGlmIChidWZmZXJfam91cm5hbF9kaXJ0eShzYXZlZF9iaCkpIHsKKyAgICAgICAgQlVHX09OICghY2FuX2RpcnR5IChjbikpOworICAgICAgICB3YXNfandhaXQgPSAxIDsKKyAgICAgICAgd2FzX2RpcnR5ID0gMSA7CisgICAgICB9IGVsc2UgaWYgKGNhbl9kaXJ0eShjbikpIHsKKyAgICAgICAgLyogZXZlcnl0aGluZyB3aXRoICFwamwgJiYgandhaXQgc2hvdWxkIGJlIHdyaXRhYmxlICovCisJQlVHKCk7CisgICAgICB9CisgICAgfQorCisgICAgLyogaWYgc29tZW9uZSBoYXMgdGhpcyBibG9jayBpbiBhIG5ld2VyIHRyYW5zYWN0aW9uLCBqdXN0IG1ha2UKKyAgICAqKiBzdXJlIHRoZXkgYXJlIGNvbW1pdGVkLCBhbmQgZG9uJ3QgdHJ5IHdyaXRpbmcgaXQgdG8gZGlzaworICAgICovCisgICAgaWYgKHBqbCkgeworICAgICAgaWYgKGF0b21pY19yZWFkKCZwamwtPmpfY29tbWl0X2xlZnQpKQorICAgICAgICBmbHVzaF9jb21taXRfbGlzdChzLCBwamwsIDEpIDsKKyAgICAgIGdvdG8gZnJlZV9jbm9kZSA7CisgICAgfQorCisgICAgLyogYmggPT0gTlVMTCB3aGVuIHRoZSBibG9jayBnb3QgdG8gZGlzayBvbiBpdHMgb3duLCBPUiwgCisgICAgKiogdGhlIGJsb2NrIGdvdCBmcmVlZCBpbiBhIGZ1dHVyZSB0cmFuc2FjdGlvbiAKKyAgICAqLworICAgIGlmIChzYXZlZF9iaCA9PSBOVUxMKSB7CisgICAgICBnb3RvIGZyZWVfY25vZGUgOworICAgIH0KKworICAgIC8qIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIGt1cGRhdGVfb25lX3RyYW5zYWN0aW9uIGhhcyB0aGlzIGxpc3QKKyAgICAqKiBsb2NrZWQgd2hpbGUgaXQgd29ya3MsIHNvIHdlIHNob3VsZCBuZXZlciBzZWUgYSBidWZmZXIgaGVyZSB0aGF0CisgICAgKiogaXMgbm90IG1hcmtlZCBKRGlydHlfd2FpdAorICAgICovCisgICAgaWYgKCghd2FzX2p3YWl0KSAmJiAhYnVmZmVyX2xvY2tlZChzYXZlZF9iaCkpIHsKKwlyZWlzZXJmc193YXJuaW5nIChzLCAiam91cm5hbC04MTM6IEJBRCEgYnVmZmVyICVsbHUgJWNkaXJ0eSAlY2p3YWl0LCAiCisJCQkgICJub3QgaW4gYSBuZXdlciB0cmFuYXNjdGlvbiIsCisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpc2F2ZWRfYmgtPmJfYmxvY2tuciwKKwkJCSAgd2FzX2RpcnR5ID8gJyAnIDogJyEnLCB3YXNfandhaXQgPyAnICcgOiAnIScpIDsKKyAgICB9CisgICAgaWYgKHdhc19kaXJ0eSkgeyAKKyAgICAgIC8qIHdlIGluYyBhZ2FpbiBiZWNhdXNlIHNhdmVkX2JoIGdldHMgZGVjcmVtZW50ZWQgYXQgZnJlZV9jbm9kZSAqLworICAgICAgZ2V0X2JoKHNhdmVkX2JoKSA7CisgICAgICBzZXRfYml0KEJMT0NLX05FRURTX0ZMVVNILCAmY24tPnN0YXRlKSA7CisgICAgICBsb2NrX2J1ZmZlcihzYXZlZF9iaCk7CisgICAgICBCVUdfT04gKGNuLT5ibG9ja25yICE9IHNhdmVkX2JoLT5iX2Jsb2NrbnIpOworICAgICAgaWYgKGJ1ZmZlcl9kaXJ0eShzYXZlZF9iaCkpCisgICAgICAgIHN1Ym1pdF9sb2dnZWRfYnVmZmVyKHNhdmVkX2JoKSA7CisgICAgICBlbHNlCisgICAgICAgIHVubG9ja19idWZmZXIoc2F2ZWRfYmgpOworICAgICAgY291bnQrKyA7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJjbG0tMjA4MjogVW5hYmxlIHRvIGZsdXNoIGJ1ZmZlciAlbGx1IGluICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2F2ZWRfYmgtPmJfYmxvY2tuciwgX19GVU5DVElPTl9fKTsKKyAgICB9CitmcmVlX2Nub2RlOgorICAgIGxhc3QgPSBjbiA7CisgICAgY24gPSBjbi0+bmV4dCA7CisgICAgaWYgKHNhdmVkX2JoKSB7CisgICAgICAvKiB3ZSBpbmNyZW1lbnRlZCB0aGlzIHRvIGtlZXAgb3RoZXJzIGZyb20gdGFraW5nIHRoZSBidWZmZXIgaGVhZCBhd2F5ICovCisgICAgICBwdXRfYmgoc2F2ZWRfYmgpIDsKKyAgICAgIGlmIChhdG9taWNfcmVhZCgmKHNhdmVkX2JoLT5iX2NvdW50KSkgPCAwKSB7CisgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJqb3VybmFsLTk0NTogc2F2ZWRfYmgtPmJfY291bnQgPCAwIik7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChjb3VudCA+IDApIHsKKyAgICBjbiA9IGpsLT5qX3JlYWxibG9jayA7CisgICAgd2hpbGUoY24pIHsKKyAgICAgIGlmICh0ZXN0X2JpdChCTE9DS19ORUVEU19GTFVTSCwgJmNuLT5zdGF0ZSkpIHsKKwlpZiAoIWNuLT5iaCkgeworCSAgcmVpc2VyZnNfcGFuaWMocywgImpvdXJuYWwtMTAxMTogY24tPmJoIGlzIE5VTExcbiIpIDsKKwl9CisJd2FpdF9vbl9idWZmZXIoY24tPmJoKSA7CisJaWYgKCFjbi0+YmgpIHsKKwkgIHJlaXNlcmZzX3BhbmljKHMsICJqb3VybmFsLTEwMTI6IGNuLT5iaCBpcyBOVUxMXG4iKSA7CisJfQorCWlmICh1bmxpa2VseSAoIWJ1ZmZlcl91cHRvZGF0ZShjbi0+YmgpKSkgeworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworCSAgcmVpc2VyZnNfd2FybmluZyhzLCAiam91cm5hbC05NDk6IGJ1ZmZlciB3cml0ZSBmYWlsZWRcbiIpIDsKKyNlbmRpZgorICAgICAgICAgIGVyciA9IC1FSU87CisgIAl9CisJLyogbm90ZSwgd2UgbXVzdCBjbGVhciB0aGUgSkRpcnR5X3dhaXQgYml0IGFmdGVyIHRoZSB1cCB0byBkYXRlCisJKiogY2hlY2ssIG90aGVyd2lzZSB3ZSByYWNlIGFnYWluc3Qgb3VyIGZsdXNocGFnZSByb3V0aW5lCisJKi8KKyAgICAgICAgQlVHX09OICghdGVzdF9jbGVhcl9idWZmZXJfam91cm5hbF9kaXJ0eSAoY24tPmJoKSk7CisKKyAgICAgICAgLyogdW5kbyB0aGUgaW5jIGZyb20gam91cm5hbF9tYXJrX2RpcnR5ICovCisJcHV0X2JoKGNuLT5iaCkgOworICAgICAgICBicmVsc2UoY24tPmJoKSA7CisgICAgICB9CisgICAgICBjbiA9IGNuLT5uZXh0IDsKKyAgICB9CisgIH0KKworICBpZiAoZXJyKQorICAgIHJlaXNlcmZzX2Fib3J0IChzLCAtRUlPLCAiV3JpdGUgZXJyb3Igd2hpbGUgcHVzaGluZyB0cmFuc2FjdGlvbiB0byBkaXNrIGluICVzIiwgX19GVU5DVElPTl9fKTsKK2ZsdXNoX29sZGVyX2FuZF9yZXR1cm46CisKKworICAvKiBiZWZvcmUgd2UgY2FuIHVwZGF0ZSB0aGUgam91cm5hbCBoZWFkZXIgYmxvY2ssIHdlIF9tdXN0XyBmbHVzaCBhbGwgCisgICoqIHJlYWwgYmxvY2tzIGZyb20gYWxsIG9sZGVyIHRyYW5zYWN0aW9ucyB0byBkaXNrLiAgVGhpcyBpcyBiZWNhdXNlCisgICoqIG9uY2UgdGhlIGhlYWRlciBibG9jayBpcyB1cGRhdGVkLCB0aGlzIHRyYW5zYWN0aW9uIHdpbGwgbm90IGJlCisgICoqIHJlcGxheWVkIGFmdGVyIGEgY3Jhc2gKKyAgKi8KKyAgaWYgKGZsdXNoYWxsKSB7CisgICAgZmx1c2hfb2xkZXJfam91cm5hbF9saXN0cyhzLCBqbCk7CisgIH0gCisgIAorICBlcnIgPSBqb3VybmFsLT5qX2Vycm5vOworICAvKiBiZWZvcmUgd2UgY2FuIHJlbW92ZSBldmVyeXRoaW5nIGZyb20gdGhlIGhhc2ggdGFibGVzIGZvciB0aGlzIAorICAqKiB0cmFuc2FjdGlvbiwgd2UgbXVzdCBtYWtlIHN1cmUgaXQgY2FuIG5ldmVyIGJlIHJlcGxheWVkCisgICoqCisgICoqIHNpbmNlIHdlIGFyZSBvbmx5IGNhbGxlZCBmcm9tIGRvX2pvdXJuYWxfZW5kLCB3ZSBrbm93IGZvciBzdXJlIHRoZXJlCisgICoqIGFyZSBubyBhbGxvY2F0aW9ucyBnb2luZyBvbiB3aGlsZSB3ZSBhcmUgZmx1c2hpbmcgam91cm5hbCBsaXN0cy4gIFNvLAorICAqKiB3ZSBvbmx5IG5lZWQgdG8gdXBkYXRlIHRoZSBqb3VybmFsIGhlYWRlciBibG9jayBmb3IgdGhlIGxhc3QgbGlzdAorICAqKiBiZWluZyBmbHVzaGVkCisgICovCisgIGlmICghZXJyICYmIGZsdXNoYWxsKSB7CisgICAgZXJyID0gdXBkYXRlX2pvdXJuYWxfaGVhZGVyX2Jsb2NrKHMsIChqbC0+al9zdGFydCArIGpsLT5qX2xlbiArIDIpICUgU0JfT05ESVNLX0pPVVJOQUxfU0laRShzKSwgamwtPmpfdHJhbnNfaWQpIDsKKyAgICBpZiAoZXJyKQorICAgICAgICByZWlzZXJmc19hYm9ydCAocywgLUVJTywgIldyaXRlIGVycm9yIHdoaWxlIHVwZGF0aW5nIGpvdXJuYWwgaGVhZGVyIGluICVzIiwgX19GVU5DVElPTl9fKTsKKyAgfQorICByZW1vdmVfYWxsX2Zyb21fam91cm5hbF9saXN0KHMsIGpsLCAwKSA7CisgIGxpc3RfZGVsX2luaXQoJmpsLT5qX2xpc3QpOworICBqb3VybmFsLT5qX251bV9saXN0cy0tOworICBkZWxfZnJvbV93b3JrX2xpc3QocywgamwpOworCisgIGlmIChqb3VybmFsLT5qX2xhc3RfZmx1c2hfaWQgIT0gMCAmJgorICAgICAoamwtPmpfdHJhbnNfaWQgLSBqb3VybmFsLT5qX2xhc3RfZmx1c2hfaWQpICE9IDEpIHsKKyAgICAgIHJlaXNlcmZzX3dhcm5pbmcocywgImNsbS0yMjAxOiBsYXN0IGZsdXNoICVsdSwgY3VycmVudCAlbHUiLAorICAgICAgICAgICAgICAgICAgICAgICBqb3VybmFsLT5qX2xhc3RfZmx1c2hfaWQsCisJCSAgICAgICBqbC0+al90cmFuc19pZCk7CisgIH0KKyAgam91cm5hbC0+al9sYXN0X2ZsdXNoX2lkID0gamwtPmpfdHJhbnNfaWQ7CisKKyAgLyogbm90IHN0cmljdGx5IHJlcXVpcmVkIHNpbmNlIHdlIGFyZSBmcmVlaW5nIHRoZSBsaXN0LCBidXQgaXQgc2hvdWxkCisgICAqIGhlbHAgZmluZCBjb2RlIHVzaW5nIGRlYWQgbGlzdHMgbGF0ZXIgb24KKyAgICovCisgIGpsLT5qX2xlbiA9IDAgOworICBhdG9taWNfc2V0KCYoamwtPmpfbm9uemVyb2xlbiksIDApIDsKKyAgamwtPmpfc3RhcnQgPSAwIDsKKyAgamwtPmpfcmVhbGJsb2NrID0gTlVMTCA7CisgIGpsLT5qX2NvbW1pdF9iaCA9IE5VTEwgOworICBqbC0+al90cmFuc19pZCA9IDAgOworICBqbC0+al9zdGF0ZSA9IDA7CisgIHB1dF9qb3VybmFsX2xpc3QocywgamwpOworICBpZiAoZmx1c2hhbGwpCisgICAgdXAoJmpvdXJuYWwtPmpfZmx1c2hfc2VtKTsKKyAgcmV0dXJuIGVyciA7Cit9IAorCitzdGF0aWMgaW50IHdyaXRlX29uZV90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwKKwkJCQkgc3RydWN0IGJ1ZmZlcl9jaHVuayAqY2h1bmspCit7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOworICAgIGludCByZXQgPSAwIDsKKworICAgIGpsLT5qX3N0YXRlIHw9IExJU1RfVE9VQ0hFRDsKKyAgICBkZWxfZnJvbV93b3JrX2xpc3QocywgamwpOworICAgIGlmIChqbC0+al9sZW4gPT0gMCB8fCBhdG9taWNfcmVhZCgmamwtPmpfbm9uemVyb2xlbikgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjbiA9IGpsLT5qX3JlYWxibG9jayA7CisgICAgd2hpbGUoY24pIHsKKyAgICAgICAgLyogaWYgdGhlIGJsb2NrbnIgPT0gMCwgdGhpcyBoYXMgYmVlbiBjbGVhcmVkIGZyb20gdGhlIGhhc2gsCisgICAgICAgICoqIHNraXAgaXQKKyAgICAgICAgKi8KKyAgICAgICAgaWYgKGNuLT5ibG9ja25yID09IDApIHsKKyAgICAgICAgICAgIGdvdG8gbmV4dCA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNuLT5iaCAmJiBjYW5fZGlydHkoY24pICYmIGJ1ZmZlcl9kaXJ0eShjbi0+YmgpKSB7CisJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqdG1wX2JoOworCSAgICAvKiB3ZSBjYW4gcmFjZSBhZ2FpbnN0IGpvdXJuYWxfbWFya19mcmVlZCB3aGVuIHdlIHRyeQorCSAgICAgKiB0byBsb2NrX2J1ZmZlcihjbi0+YmgpLCBzbyB3ZSBoYXZlIHRvIGluYyB0aGUgYnVmZmVyCisJICAgICAqIGNvdW50LCBhbmQgcmVjaGVjayB0aGluZ3MgYWZ0ZXIgbG9ja2luZworCSAgICAgKi8KKwkgICAgdG1wX2JoID0gY24tPmJoOworCSAgICBnZXRfYmgodG1wX2JoKTsKKwkgICAgbG9ja19idWZmZXIodG1wX2JoKTsKKwkgICAgaWYgKGNuLT5iaCAmJiBjYW5fZGlydHkoY24pICYmIGJ1ZmZlcl9kaXJ0eSh0bXBfYmgpKSB7CisJCWlmICghYnVmZmVyX2pvdXJuYWxfZGlydHkodG1wX2JoKSB8fAorCQkgICAgYnVmZmVyX2pvdXJuYWxfcHJlcGFyZWQodG1wX2JoKSkKKwkJICAgIEJVRygpOworCQlhZGRfdG9fY2h1bmsoY2h1bmssIHRtcF9iaCwgTlVMTCwgd3JpdGVfY2h1bmspOworCQlyZXQrKzsKKwkgICAgfSBlbHNlIHsKKwkJLyogbm90ZSwgY24tPmJoIG1pZ2h0IGJlIG51bGwgbm93ICovCisJCXVubG9ja19idWZmZXIodG1wX2JoKTsKKwkgICAgfQorCSAgICBwdXRfYmgodG1wX2JoKTsKKyAgICAgICAgfQorbmV4dDoKKyAgICAgICAgY24gPSBjbi0+bmV4dCA7CisJY29uZF9yZXNjaGVkKCk7CisgICAgfQorICAgIHJldHVybiByZXQgOworfQorCisvKiB1c2VkIGJ5IGZsdXNoX2NvbW1pdF9saXN0ICovCitzdGF0aWMgaW50IGRpcnR5X29uZV90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY247CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqcGpsOworICAgIGludCByZXQgPSAwIDsKKworICAgIGpsLT5qX3N0YXRlIHw9IExJU1RfRElSVFk7CisgICAgY24gPSBqbC0+al9yZWFsYmxvY2sgOworICAgIHdoaWxlKGNuKSB7CisgICAgICAgIC8qIGxvb2sgZm9yIGEgbW9yZSByZWNlbnQgdHJhbnNhY3Rpb24gdGhhdCBsb2dnZWQgdGhpcworICAgICAgICAqKiBidWZmZXIuICBPbmx5IHRoZSBtb3N0IHJlY2VudCB0cmFuc2FjdGlvbiB3aXRoIGEgYnVmZmVyIGluCisgICAgICAgICoqIGl0IGlzIGFsbG93ZWQgdG8gc2VuZCB0aGF0IGJ1ZmZlciB0byBkaXNrCisgICAgICAgICovCisJcGpsID0gZmluZF9uZXdlcl9qbF9mb3JfY24oY24pIDsKKyAgICAgICAgaWYgKCFwamwgJiYgY24tPmJsb2NrbnIgJiYgY24tPmJoICYmIGJ1ZmZlcl9qb3VybmFsX2RpcnR5KGNuLT5iaCkpCisJeworCSAgICBCVUdfT04gKCFjYW5fZGlydHkoY24pKTsKKwkgICAgLyogaWYgdGhlIGJ1ZmZlciBpcyBwcmVwYXJlZCwgaXQgd2lsbCBlaXRoZXIgYmUgbG9nZ2VkCisJICAgICAqIG9yIHJlc3RvcmVkLiAgSWYgcmVzdG9yZWQsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisJICAgICAqIGl0IGFjdHVhbGx5IGdldHMgbWFya2VkIGRpcnR5CisJICAgICAqLworICAgICAgICAgICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfbmV3IChjbi0+YmgpOworICAgICAgICAgICAgaWYgKGJ1ZmZlcl9qb3VybmFsX3ByZXBhcmVkIChjbi0+YmgpKSB7CisgICAgICAgICAgICAgICAgc2V0X2J1ZmZlcl9qb3VybmFsX3Jlc3RvcmVfZGlydHkgKGNuLT5iaCk7CisJICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2V0X2J1ZmZlcl9qb3VybmFsX3Rlc3QgKGNuLT5iaCk7CisJICAgICAgICBtYXJrX2J1ZmZlcl9kaXJ0eShjbi0+YmgpOworCSAgICB9CisgICAgICAgIH0gCisgICAgICAgIGNuID0gY24tPm5leHQgOworICAgIH0KKyAgICByZXR1cm4gcmV0IDsKK30KKworc3RhdGljIGludCBrdXBkYXRlX3RyYW5zYWN0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLAorCQkJCSAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKipuZXh0X2psLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm5leHRfdHJhbnNfaWQsCisJCQkJICAgaW50IG51bV9ibG9ja3MsCisJCQkJICAgaW50IG51bV90cmFucykgeworICAgIGludCByZXQgPSAwOworICAgIGludCB3cml0dGVuID0gMCA7CisgICAgaW50IHRyYW5zYWN0aW9uc19mbHVzaGVkID0gMDsKKyAgICB1bnNpZ25lZCBsb25nIG9yaWdfdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKKyAgICBzdHJ1Y3QgYnVmZmVyX2NodW5rIGNodW5rOworICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocyk7CisgICAgY2h1bmsubnIgPSAwOworCisgICAgZG93bigmam91cm5hbC0+al9mbHVzaF9zZW0pOworICAgIGlmICgham91cm5hbF9saXN0X3N0aWxsX2FsaXZlKHMsIG9yaWdfdHJhbnNfaWQpKSB7CisJZ290byBkb25lOworICAgIH0KKworICAgIC8qIHdlJ3ZlIGdvdCBqX2ZsdXNoX3NlbSBoZWxkLCBub2JvZHkgaXMgZ29pbmcgdG8gZGVsZXRlIGFueQorICAgICAqIG9mIHRoZXNlIGxpc3RzIG91dCBmcm9tIHVuZGVybmVhdGggdXMKKyAgICAgKi8KKyAgICB3aGlsZSgobnVtX3RyYW5zICYmIHRyYW5zYWN0aW9uc19mbHVzaGVkIDwgbnVtX3RyYW5zKSB8fAorICAgICAgICAgICghbnVtX3RyYW5zICYmIHdyaXR0ZW4gPCBudW1fYmxvY2tzKSkgeworCisJaWYgKGpsLT5qX2xlbiA9PSAwIHx8IChqbC0+al9zdGF0ZSAmIExJU1RfVE9VQ0hFRCkgfHwKKwkgICAgYXRvbWljX3JlYWQoJmpsLT5qX2NvbW1pdF9sZWZ0KSB8fCAhKGpsLT5qX3N0YXRlICYgTElTVF9ESVJUWSkpCisJeworCSAgICBkZWxfZnJvbV93b3JrX2xpc3QocywgamwpOworCSAgICBicmVhazsKKwl9CisJcmV0ID0gd3JpdGVfb25lX3RyYW5zYWN0aW9uKHMsIGpsLCAmY2h1bmspOworCisJaWYgKHJldCA8IDApCisJICAgIGdvdG8gZG9uZTsKKwl0cmFuc2FjdGlvbnNfZmx1c2hlZCsrOworCXdyaXR0ZW4gKz0gcmV0OworCWVudHJ5ID0gamwtPmpfbGlzdC5uZXh0OworCisJLyogZGlkIHdlIHdyYXA/ICovCisJaWYgKGVudHJ5ID09ICZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkgeworCSAgICBicmVhazsKKyAgICAgICAgfQorCWpsID0gSk9VUk5BTF9MSVNUX0VOVFJZKGVudHJ5KTsKKworCS8qIGRvbid0IGJvdGhlciB3aXRoIG9sZGVyIHRyYW5zYWN0aW9ucyAqLworCWlmIChqbC0+al90cmFuc19pZCA8PSBvcmlnX3RyYW5zX2lkKQorCSAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGNodW5rLm5yKSB7CisgICAgICAgIHdyaXRlX2NodW5rKCZjaHVuayk7CisgICAgfQorCitkb25lOgorICAgIHVwKCZqb3VybmFsLT5qX2ZsdXNoX3NlbSk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyogZm9yIG9fc3luYyBhbmQgZnN5bmMgaGVhdnkgYXBwbGljYXRpb25zLCB0aGV5IHRlbmQgdG8gdXNlCisqKiBhbGwgdGhlIGpvdXJuYSBsaXN0IHNsb3RzIHdpdGggdGlueSB0cmFuc2FjdGlvbnMuICBUaGVzZQorKiogdHJpZ2dlciBsb3RzIGFuZCBsb3RzIG9mIGNhbGxzIHRvIHVwZGF0ZSB0aGUgaGVhZGVyIGJsb2NrLCB3aGljaAorKiogYWRkcyBzZWVrcyBhbmQgc2xvd3MgdGhpbmdzIGRvd24uCisqKgorKiogVGhpcyBmdW5jdGlvbiB0cmllcyB0byBjbGVhciBvdXQgYSBsYXJnZSBjaHVuayBvZiB0aGUgam91cm5hbCBsaXN0cworKiogYXQgb25jZSwgd2hpY2ggbWFrZXMgZXZlcnl0aGluZyBmYXN0ZXIgc2luY2Ugb25seSB0aGUgbmV3ZXN0IGpvdXJuYWwKKyoqIGxpc3QgdXBkYXRlcyB0aGUgaGVhZGVyIGJsb2NrCisqLworc3RhdGljIGludCBmbHVzaF91c2VkX2pvdXJuYWxfbGlzdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpIHsKKyAgICB1bnNpZ25lZCBsb25nIGxlbiA9IDA7CisgICAgdW5zaWduZWQgbG9uZyBjdXJfbGVuOworICAgIGludCByZXQ7CisgICAgaW50IGk7CisgICAgaW50IGxpbWl0ID0gMjU2OworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKnRqbDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpmbHVzaF9qbDsKKyAgICB1bnNpZ25lZCBsb25nIHRyYW5zX2lkOworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocyk7CisKKyAgICBmbHVzaF9qbCA9IHRqbCA9IGpsOworCisgICAgLyogaW4gZGF0YSBsb2dnaW5nIG1vZGUsIHRyeSBoYXJkZXIgdG8gZmx1c2ggYSBsb3Qgb2YgYmxvY2tzICovCisgICAgaWYgKHJlaXNlcmZzX2RhdGFfbG9nKHMpKQorCWxpbWl0ID0gMTAyNDsKKyAgICAvKiBmbHVzaCBmb3IgMjU2IHRyYW5zYWN0aW9ucyBvciBsaW1pdCBibG9ja3MsIHdoaWNoZXZlciBjb21lcyBmaXJzdCAqLworICAgIGZvcihpID0gMCA7IGkgPCAyNTYgJiYgbGVuIDwgbGltaXQgOyBpKyspIHsKKwlpZiAoYXRvbWljX3JlYWQoJnRqbC0+al9jb21taXRfbGVmdCkgfHwKKwkgICAgdGpsLT5qX3RyYW5zX2lkIDwgamwtPmpfdHJhbnNfaWQpIHsKKwkgICAgYnJlYWs7CisJfQorCWN1cl9sZW4gPSBhdG9taWNfcmVhZCgmdGpsLT5qX25vbnplcm9sZW4pOworCWlmIChjdXJfbGVuID4gMCkgeworCSAgICB0amwtPmpfc3RhdGUgJj0gfkxJU1RfVE9VQ0hFRDsKKwl9CisJbGVuICs9IGN1cl9sZW47CisJZmx1c2hfamwgPSB0amw7CisJaWYgKHRqbC0+al9saXN0Lm5leHQgPT0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KQorCSAgICBicmVhazsKKwl0amwgPSBKT1VSTkFMX0xJU1RfRU5UUlkodGpsLT5qX2xpc3QubmV4dCk7CisgICAgfQorICAgIC8qIHRyeSB0byBmaW5kIGEgZ3JvdXAgb2YgYmxvY2tzIHdlIGNhbiBmbHVzaCBhY3Jvc3MgYWxsIHRoZQorICAgICoqIHRyYW5zYWN0aW9ucywgYnV0IG9ubHkgYm90aGVyIGlmIHdlJ3ZlIGFjdHVhbGx5IHNwYW5uZWQKKyAgICAqKiBhY3Jvc3MgbXVsdGlwbGUgbGlzdHMKKyAgICAqLworICAgIGlmIChmbHVzaF9qbCAhPSBqbCkgeworICAgICAgICByZXQgPSBrdXBkYXRlX3RyYW5zYWN0aW9ucyhzLCBqbCwgJnRqbCwgJnRyYW5zX2lkLCBsZW4sIGkpOworICAgIH0KKyAgICBmbHVzaF9qb3VybmFsX2xpc3QocywgZmx1c2hfamwsIDEpOworICAgIHJldHVybiAwOworfQorCisvKgorKiogcmVtb3ZlcyBhbnkgbm9kZXMgaW4gdGFibGUgd2l0aCBuYW1lIGJsb2NrIGFuZCBkZXYgYXMgYmguCisqKiBvbmx5IHRvdWNocyB0aGUgaG5leHQgYW5kIGhwcmV2IHBvaW50ZXJzLgorKi8KK3ZvaWQgcmVtb3ZlX2pvdXJuYWxfaGFzaChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKip0YWJsZSwKKwkJCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLAorCQkJdW5zaWduZWQgbG9uZyBibG9jaywgaW50IHJlbW92ZV9mcmVlZCkKK3sKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmN1ciA7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICoqaGVhZCA7CisKKyAgaGVhZD0gJihqb3VybmFsX2hhc2godGFibGUsIHNiLCBibG9jaykpIDsKKyAgaWYgKCFoZWFkKSB7CisgICAgcmV0dXJuIDsKKyAgfQorICBjdXIgPSAqaGVhZCA7CisgIHdoaWxlKGN1cikgeworICAgIGlmIChjdXItPmJsb2NrbnIgPT0gYmxvY2sgJiYgY3VyLT5zYiA9PSBzYiAmJiAoamwgPT0gTlVMTCB8fCBqbCA9PSBjdXItPmpsaXN0KSAmJiAKKyAgICAgICAgKCF0ZXN0X2JpdChCTE9DS19GUkVFRCwgJmN1ci0+c3RhdGUpIHx8IHJlbW92ZV9mcmVlZCkpIHsKKyAgICAgIGlmIChjdXItPmhuZXh0KSB7CisgICAgICAgIGN1ci0+aG5leHQtPmhwcmV2ID0gY3VyLT5ocHJldiA7CisgICAgICB9CisgICAgICBpZiAoY3VyLT5ocHJldikgeworCWN1ci0+aHByZXYtPmhuZXh0ID0gY3VyLT5obmV4dCA7CisgICAgICB9IGVsc2UgeworCSpoZWFkID0gY3VyLT5obmV4dCA7CisgICAgICB9CisgICAgICBjdXItPmJsb2NrbnIgPSAwIDsKKyAgICAgIGN1ci0+c2IgPSBOVUxMIDsKKyAgICAgIGN1ci0+c3RhdGUgPSAwIDsKKyAgICAgIGlmIChjdXItPmJoICYmIGN1ci0+amxpc3QpIC8qIGFueWJvZHkgd2hvIGNsZWFycyB0aGUgY3VyLT5iaCB3aWxsIGFsc28gZGVjIHRoZSBub256ZXJvbGVuICovCisJYXRvbWljX2RlYygmKGN1ci0+amxpc3QtPmpfbm9uemVyb2xlbikpIDsKKyAgICAgIGN1ci0+YmggPSBOVUxMIDsKKyAgICAgIGN1ci0+amxpc3QgPSBOVUxMIDsKKyAgICB9IAorICAgIGN1ciA9IGN1ci0+aG5leHQgOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfam91cm5hbF9yYW0oc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisgIHJlaXNlcmZzX2tmcmVlKGpvdXJuYWwtPmpfY3VycmVudF9qbCwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QpLCBwX3Nfc2IpOworICBqb3VybmFsLT5qX251bV9saXN0cy0tOworCisgIHZmcmVlKGpvdXJuYWwtPmpfY25vZGVfZnJlZV9vcmlnKSA7CisgIGZyZWVfbGlzdF9iaXRtYXBzKHBfc19zYiwgam91cm5hbC0+al9saXN0X2JpdG1hcCkgOworICBmcmVlX2JpdG1hcF9ub2RlcyhwX3Nfc2IpIDsgLyogbXVzdCBiZSBhZnRlciBmcmVlX2xpc3RfYml0bWFwcyAqLworICBpZiAoam91cm5hbC0+al9oZWFkZXJfYmgpIHsKKyAgICBicmVsc2Uoam91cm5hbC0+al9oZWFkZXJfYmgpIDsKKyAgfQorICAvKiBqX2hlYWRlcl9iaCBpcyBvbiB0aGUgam91cm5hbCBkZXYsIG1ha2Ugc3VyZSBub3QgdG8gcmVsZWFzZSB0aGUgam91cm5hbAorICAgKiBkZXYgdW50aWwgd2UgYnJlbHNlIGpfaGVhZGVyX2JoCisgICAqLworICByZWxlYXNlX2pvdXJuYWxfZGV2KHBfc19zYiwgam91cm5hbCk7CisgIHZmcmVlKGpvdXJuYWwpIDsKK30KKworLyoKKyoqIGNhbGwgb24gdW5tb3VudC4gIE9ubHkgc2V0IGVycm9yIHRvIDEgaWYgeW91IGhhdmVuJ3QgbWFkZSB5b3VyIHdheSBvdXQKKyoqIG9mIHJlYWRfc3VwZXIoKSB5ZXQuICBBbnkgb3RoZXIgY2FsbGVyIG11c3Qga2VlcCBlcnJvciBhdCAwLgorKi8KK3N0YXRpYyBpbnQgZG9fam91cm5hbF9yZWxlYXNlKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgaW50IGVycm9yKSB7CisgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgbXl0aCA7CisgIGludCBmbHVzaGVkID0gMDsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisKKyAgLyogd2Ugb25seSB3YW50IHRvIGZsdXNoIG91dCB0cmFuc2FjdGlvbnMgaWYgd2Ugd2VyZSBjYWxsZWQgd2l0aCBlcnJvciA9PSAwCisgICovCisgIGlmICghZXJyb3IgJiYgIShwX3Nfc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisgICAgLyogZW5kIHRoZSBjdXJyZW50IHRyYW5zICovCisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworICAgIGRvX2pvdXJuYWxfZW5kKHRoLCBwX3Nfc2IsMTAsIEZMVVNIX0FMTCkgOworCisgICAgLyogbWFrZSBzdXJlIHNvbWV0aGluZyBnZXRzIGxvZ2dlZCB0byBmb3JjZSBvdXIgd2F5IGludG8gdGhlIGZsdXNoIGNvZGUgKi8KKyAgICBpZiAoIWpvdXJuYWxfam9pbigmbXl0aCwgcF9zX3NiLCAxKSkgeworICAgICAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSwgMSkgOworICAgICAgICBqb3VybmFsX21hcmtfZGlydHkoJm15dGgsIHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSkgOworICAgICAgICBkb19qb3VybmFsX2VuZCgmbXl0aCwgcF9zX3NiLDEsIEZMVVNIX0FMTCkgOworICAgICAgICBmbHVzaGVkID0gMTsKKyAgICB9CisgIH0KKworICAvKiB0aGlzIGFsc28gY2F0Y2hlcyBlcnJvcnMgZHVyaW5nIHRoZSBkb19qb3VybmFsX2VuZCBhYm92ZSAqLworICBpZiAoIWVycm9yICYmIHJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkgeworICAgICAgbWVtc2V0KCZteXRoLCAwLCBzaXplb2YobXl0aCkpOworICAgICAgaWYgKCFqb3VybmFsX2pvaW5fYWJvcnQoJm15dGgsIHBfc19zYiwgMSkpIHsKKwkgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocF9zX3NiLCBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpLCAxKSA7CisJICBqb3VybmFsX21hcmtfZGlydHkoJm15dGgsIHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSkgOworICAgICAgICAgIGRvX2pvdXJuYWxfZW5kKCZteXRoLCBwX3Nfc2IsIDEsIEZMVVNIX0FMTCkgOworICAgICAgfQorICB9CisKKyAgcmVpc2VyZnNfbW91bnRlZF9mc19jb3VudC0tIDsKKyAgLyogd2FpdCBmb3IgYWxsIGNvbW1pdHMgdG8gZmluaXNoICovCisgIGNhbmNlbF9kZWxheWVkX3dvcmsoJlNCX0pPVVJOQUwocF9zX3NiKS0+al93b3JrKTsKKyAgZmx1c2hfd29ya3F1ZXVlKGNvbW1pdF93cSk7CisgIGlmICghcmVpc2VyZnNfbW91bnRlZF9mc19jb3VudCkgeworICAgIGRlc3Ryb3lfd29ya3F1ZXVlKGNvbW1pdF93cSk7CisgICAgY29tbWl0X3dxID0gTlVMTDsKKyAgfQorCisgIGZyZWVfam91cm5hbF9yYW0ocF9zX3NiKSA7CisKKyAgcmV0dXJuIDAgOworfQorCisvKgorKiogY2FsbCBvbiB1bm1vdW50LiAgZmx1c2ggYWxsIGpvdXJuYWwgdHJhbnMsIHJlbGVhc2UgYWxsIGFsbG9jJ2QgcmFtCisqLworaW50IGpvdXJuYWxfcmVsZWFzZShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKKyAgcmV0dXJuIGRvX2pvdXJuYWxfcmVsZWFzZSh0aCwgcF9zX3NiLCAwKSA7Cit9CisvKgorKiogb25seSBjYWxsIGZyb20gYW4gZXJyb3IgY29uZGl0aW9uIGluc2lkZSByZWlzZXJmc19yZWFkX3N1cGVyIQorKi8KK2ludCBqb3VybmFsX3JlbGVhc2VfZXJyb3Ioc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7CisgIHJldHVybiBkb19qb3VybmFsX3JlbGVhc2UodGgsIHBfc19zYiwgMSkgOworfQorCisvKiBjb21wYXJlcyBkZXNjcmlwdGlvbiBibG9jayB3aXRoIGNvbW1pdCBibG9jay4gIHJldHVybnMgMSBpZiB0aGV5IGRpZmZlciwgMCBpZiB0aGV5IGFyZSB0aGUgc2FtZSAqLworc3RhdGljIGludCBqb3VybmFsX2NvbXBhcmVfZGVzY19jb21taXQoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKmRlc2MsIAorCQkJICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY29tbWl0ICpjb21taXQpIHsKKyAgaWYgKGdldF9jb21taXRfdHJhbnNfaWQgKGNvbW1pdCkgIT0gZ2V0X2Rlc2NfdHJhbnNfaWQgKGRlc2MpIHx8IAorICAgICAgZ2V0X2NvbW1pdF90cmFuc19sZW4gKGNvbW1pdCkgIT0gZ2V0X2Rlc2NfdHJhbnNfbGVuIChkZXNjKSB8fCAKKyAgICAgIGdldF9jb21taXRfdHJhbnNfbGVuIChjb21taXQpID4gU0JfSk9VUk5BTChwX3Nfc2IpLT5qX3RyYW5zX21heCB8fAorICAgICAgZ2V0X2NvbW1pdF90cmFuc19sZW4gKGNvbW1pdCkgPD0gMCAKKyAgKSB7CisgICAgcmV0dXJuIDEgOworICB9CisgIHJldHVybiAwIDsKK30KKy8qIHJldHVybnMgMCBpZiBpdCBkaWQgbm90IGZpbmQgYSBkZXNjcmlwdGlvbiBibG9jayAgCisqKiByZXR1cm5zIC0xIGlmIGl0IGZvdW5kIGEgY29ycnVwdCBjb21taXQgYmxvY2sKKyoqIHJldHVybnMgMSBpZiBib3RoIGRlc2MgYW5kIGNvbW1pdCB3ZXJlIHZhbGlkIAorKi8KK3N0YXRpYyBpbnQgam91cm5hbF90cmFuc2FjdGlvbl9pc192YWxpZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkX2JoLCB1bnNpZ25lZCBsb25nICpvbGRlc3RfaW52YWxpZF90cmFuc19pZCwgdW5zaWduZWQgbG9uZyAqbmV3ZXN0X21vdW50X2lkKSB7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKmRlc2MgOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKmNvbW1pdCA7CisgIHN0cnVjdCBidWZmZXJfaGVhZCAqY19iaCA7CisgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0IDsKKworICBpZiAoIWRfYmgpCisgICAgICByZXR1cm4gMCA7CisKKyAgZGVzYyA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICopZF9iaC0+Yl9kYXRhIDsKKyAgaWYgKGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSA+IDAgJiYgIW1lbWNtcChnZXRfam91cm5hbF9kZXNjX21hZ2ljIChkX2JoKSwgSk9VUk5BTF9ERVNDX01BR0lDLCA4KSkgeworICAgIGlmIChvbGRlc3RfaW52YWxpZF90cmFuc19pZCAmJiAqb2xkZXN0X2ludmFsaWRfdHJhbnNfaWQgJiYgZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykgPiAqb2xkZXN0X2ludmFsaWRfdHJhbnNfaWQpIHsKKyAgICAgIHJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtOTg2OiB0cmFuc2FjdGlvbiAiCisJICAgICAgICAgICAgICAiaXMgdmFsaWQgcmV0dXJuaW5nIGJlY2F1c2UgdHJhbnNfaWQgJWQgaXMgZ3JlYXRlciB0aGFuICIKKwkJICAgICAgIm9sZGVzdF9pbnZhbGlkICVsdSIsIGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpLAorCQkgICAgICAgKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkKTsKKyAgICAgIHJldHVybiAwIDsKKyAgICB9CisgICAgaWYgKG5ld2VzdF9tb3VudF9pZCAmJiAqbmV3ZXN0X21vdW50X2lkID4gZ2V0X2Rlc2NfbW91bnRfaWQgKGRlc2MpKSB7CisgICAgICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEwODc6IHRyYW5zYWN0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICJpcyB2YWxpZCByZXR1cm5pbmcgYmVjYXVzZSBtb3VudF9pZCAlZCBpcyBsZXNzIHRoYW4gIgorCQkgICAgICJuZXdlc3RfbW91bnRfaWQgJWx1IiwgZ2V0X2Rlc2NfbW91bnRfaWQgKGRlc2MpLAorCQkgICAgICpuZXdlc3RfbW91bnRfaWQpIDsKKyAgICAgIHJldHVybiAtMSA7CisgICAgfQorICAgIGlmICggZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpID4gU0JfSk9VUk5BTChwX3Nfc2IpLT5qX3RyYW5zX21heCApIHsKKyAgICAgIHJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiam91cm5hbC0yMDE4OiBCYWQgdHJhbnNhY3Rpb24gbGVuZ3RoICVkIGVuY291bnRlcmVkLCBpZ25vcmluZyB0cmFuc2FjdGlvbiIsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSk7CisgICAgICByZXR1cm4gLTEgOworICAgIH0KKyAgICBvZmZzZXQgPSBkX2JoLT5iX2Jsb2NrbnIgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSA7CisKKyAgICAvKiBvaywgd2UgaGF2ZSBhIGpvdXJuYWwgZGVzY3JpcHRpb24gYmxvY2ssIGxldHMgc2VlIGlmIHRoZSB0cmFuc2FjdGlvbiB3YXMgdmFsaWQgKi8KKyAgICBjX2JoID0gam91cm5hbF9icmVhZChwX3Nfc2IsIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpICsKKwkJICgob2Zmc2V0ICsgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICsgMSkgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpKSA7CisgICAgaWYgKCFjX2JoKQorICAgICAgcmV0dXJuIDAgOworICAgIGNvbW1pdCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKiljX2JoLT5iX2RhdGEgOworICAgIGlmIChqb3VybmFsX2NvbXBhcmVfZGVzY19jb21taXQocF9zX3NiLCBkZXNjLCBjb21taXQpKSB7CisgICAgICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsIAorICAgICAgICAgICAgICAgICAgICAgImpvdXJuYWxfdHJhbnNhY3Rpb25faXNfdmFsaWQsIGNvbW1pdCBvZmZzZXQgJWxkIGhhZCBiYWQgIgorCQkgICAgICJ0aW1lICVkIG9yIGxlbmd0aCAlZCIsCisJCSAgICAgY19iaC0+Yl9ibG9ja25yIC0gIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpLAorCQkgICAgIGdldF9jb21taXRfdHJhbnNfaWQgKGNvbW1pdCksIAorCQkgICAgIGdldF9jb21taXRfdHJhbnNfbGVuKGNvbW1pdCkpOworICAgICAgYnJlbHNlKGNfYmgpIDsKKyAgICAgIGlmIChvbGRlc3RfaW52YWxpZF90cmFuc19pZCkgeworCSpvbGRlc3RfaW52YWxpZF90cmFuc19pZCA9IGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpIDsKKwlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEwMDQ6ICIKKwkJICAgICAgICJ0cmFuc2FjdGlvbl9pc192YWxpZCBzZXR0aW5nIG9sZGVzdCBpbnZhbGlkIHRyYW5zX2lkICIKKwkJICAgICAgICJ0byAlZCIsIGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpKSA7CisgICAgICB9CisgICAgICByZXR1cm4gLTE7IAorICAgIH0KKyAgICBicmVsc2UoY19iaCkgOworICAgIHJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTAwNjogZm91bmQgdmFsaWQgIgorICAgICAgICAgICAgICAgICAgICJ0cmFuc2FjdGlvbiBzdGFydCBvZmZzZXQgJWxsdSwgbGVuICVkIGlkICVkIiwKKwkJICAgZF9iaC0+Yl9ibG9ja25yIC0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYiksIAorCQkgICBnZXRfZGVzY190cmFuc19sZW4oZGVzYyksIGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpKSA7CisgICAgcmV0dXJuIDEgOworICB9IGVsc2UgeworICAgIHJldHVybiAwIDsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBicmVsc2VfYXJyYXkoc3RydWN0IGJ1ZmZlcl9oZWFkICoqaGVhZHMsIGludCBudW0pIHsKKyAgaW50IGkgOworICBmb3IgKGkgPSAwIDsgaSA8IG51bSA7IGkrKykgeworICAgIGJyZWxzZShoZWFkc1tpXSkgOworICB9Cit9CisKKy8qCisqKiBnaXZlbiB0aGUgc3RhcnQsIGFuZCB2YWx1ZXMgZm9yIHRoZSBvbGRlc3QgYWNjZXB0YWJsZSB0cmFuc2FjdGlvbnMsCisqKiB0aGlzIGVpdGhlciByZWFkcyBpbiBhIHJlcGxheXMgYSB0cmFuc2FjdGlvbiwgb3IgcmV0dXJucyBiZWNhdXNlIHRoZSB0cmFuc2FjdGlvbgorKiogaXMgaW52YWxpZCwgb3IgdG9vIG9sZC4KKyovCitzdGF0aWMgaW50IGpvdXJuYWxfcmVhZF90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBjdXJfZGJsb2NrLCB1bnNpZ25lZCBsb25nIG9sZGVzdF9zdGFydCwgCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgb2xkZXN0X3RyYW5zX2lkLCB1bnNpZ25lZCBsb25nIG5ld2VzdF9tb3VudF9pZCkgeworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKmRlc2MgOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKmNvbW1pdCA7CisgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQgPSAwIDsKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICpjX2JoIDsKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkX2JoIDsKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbG9nX2Jsb2NrcyA9IE5VTEwgOworICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipyZWFsX2Jsb2NrcyA9IE5VTEwgOworICB1bnNpZ25lZCBsb25nIHRyYW5zX29mZnNldCA7CisgIGludCBpOworICBpbnQgdHJhbnNfaGFsZjsKKworICBkX2JoID0gam91cm5hbF9icmVhZChwX3Nfc2IsIGN1cl9kYmxvY2spIDsKKyAgaWYgKCFkX2JoKQorICAgIHJldHVybiAxIDsKKyAgZGVzYyA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICopZF9iaC0+Yl9kYXRhIDsKKyAgdHJhbnNfb2Zmc2V0ID0gZF9iaC0+Yl9ibG9ja25yIC0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgOworICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEwMzc6ICIKKyAgICAgICAgICAgICAgICAgImpvdXJuYWxfcmVhZF90cmFuc2FjdGlvbiwgb2Zmc2V0ICVsbHUsIGxlbiAlZCBtb3VudF9pZCAlZCIsCisJCSBkX2JoLT5iX2Jsb2NrbnIgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwgCisJCSBnZXRfZGVzY190cmFuc19sZW4oZGVzYyksIGdldF9kZXNjX21vdW50X2lkKGRlc2MpKSA7CisgIGlmIChnZXRfZGVzY190cmFuc19pZChkZXNjKSA8IG9sZGVzdF90cmFuc19pZCkgeworICAgIHJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTAzOTogIgorICAgICAgICAgICAgICAgICAgICJqb3VybmFsX3JlYWRfdHJhbnMgc2tpcHBpbmcgYmVjYXVzZSAlbHUgaXMgdG9vIG9sZCIsCisJCSAgIGN1cl9kYmxvY2sgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSkgOworICAgIGJyZWxzZShkX2JoKSA7CisgICAgcmV0dXJuIDEgOworICB9CisgIGlmIChnZXRfZGVzY19tb3VudF9pZChkZXNjKSAhPSBuZXdlc3RfbW91bnRfaWQpIHsKKyAgICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTExNDY6ICIKKyAgICAgICAgICAgICAgICAgICAiam91cm5hbF9yZWFkX3RyYW5zIHNraXBwaW5nIGJlY2F1c2UgJWQgaXMgIT0gIgorCQkgICAibmV3ZXN0X21vdW50X2lkICVsdSIsIGdldF9kZXNjX21vdW50X2lkKGRlc2MpLAorCQkgICAgbmV3ZXN0X21vdW50X2lkKSA7CisgICAgYnJlbHNlKGRfYmgpIDsKKyAgICByZXR1cm4gMSA7CisgIH0KKyAgY19iaCA9IGpvdXJuYWxfYnJlYWQocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArCisJCSgodHJhbnNfb2Zmc2V0ICsgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICsgMSkgJSAKKwkJIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkpIDsKKyAgaWYgKCFjX2JoKSB7CisgICAgYnJlbHNlKGRfYmgpIDsKKyAgICByZXR1cm4gMSA7CisgIH0KKyAgY29tbWl0ID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqKWNfYmgtPmJfZGF0YSA7CisgIGlmIChqb3VybmFsX2NvbXBhcmVfZGVzY19jb21taXQocF9zX3NiLCBkZXNjLCBjb21taXQpKSB7CisgICAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbF9yZWFkX3RyYW5zYWN0aW9uLCAiCisgICAgICAgICAgICAgICAgICAgImNvbW1pdCBvZmZzZXQgJWxsdSBoYWQgYmFkIHRpbWUgJWQgb3IgbGVuZ3RoICVkIiwKKwkJICAgY19iaC0+Yl9ibG9ja25yIC0gIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpLCAKKwkJICAgZ2V0X2NvbW1pdF90cmFuc19pZChjb21taXQpLCBnZXRfY29tbWl0X3RyYW5zX2xlbihjb21taXQpKTsKKyAgICBicmVsc2UoY19iaCkgOworICAgIGJyZWxzZShkX2JoKSA7CisgICAgcmV0dXJuIDE7IAorICB9CisgIHRyYW5zX2lkID0gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykgOworICAvKiBub3cgd2Uga25vdyB3ZSd2ZSBnb3QgYSBnb29kIHRyYW5zYWN0aW9uLCBhbmQgaXQgd2FzIGluc2lkZSB0aGUgdmFsaWQgdGltZSByYW5nZXMgKi8KKyAgbG9nX2Jsb2NrcyA9IHJlaXNlcmZzX2ttYWxsb2MoZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgR0ZQX05PRlMsIHBfc19zYikgOworICByZWFsX2Jsb2NrcyA9IHJlaXNlcmZzX2ttYWxsb2MoZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgR0ZQX05PRlMsIHBfc19zYikgOworICBpZiAoIWxvZ19ibG9ja3MgIHx8ICFyZWFsX2Jsb2NrcykgeworICAgIGJyZWxzZShjX2JoKSA7CisgICAgYnJlbHNlKGRfYmgpIDsKKyAgICByZWlzZXJmc19rZnJlZShsb2dfYmxvY2tzLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpIDsKKyAgICByZWlzZXJmc19rZnJlZShyZWFsX2Jsb2NrcywgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKSA7CisgICAgcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsICJqb3VybmFsLTExNjk6IGttYWxsb2MgZmFpbGVkLCB1bmFibGUgdG8gbW91bnQgRlMiKSA7CisgICAgcmV0dXJuIC0xIDsKKyAgfQorICAvKiBnZXQgYWxsIHRoZSBidWZmZXIgaGVhZHMgKi8KKyAgdHJhbnNfaGFsZiA9IGpvdXJuYWxfdHJhbnNfaGFsZiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSkgOworICBmb3IoaSA9IDAgOyBpIDwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpIDsgaSsrKSB7CisgICAgbG9nX2Jsb2Nrc1tpXSA9ICBqb3VybmFsX2dldGJsayhwX3Nfc2IsICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArICh0cmFuc19vZmZzZXQgKyAxICsgaSkgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpOworICAgIGlmIChpIDwgdHJhbnNfaGFsZikgeworICAgICAgcmVhbF9ibG9ja3NbaV0gPSBzYl9nZXRibGsocF9zX3NiLCBsZTMyX3RvX2NwdShkZXNjLT5qX3JlYWxibG9ja1tpXSkpIDsKKyAgICB9IGVsc2UgeworICAgICAgcmVhbF9ibG9ja3NbaV0gPSBzYl9nZXRibGsocF9zX3NiLCBsZTMyX3RvX2NwdShjb21taXQtPmpfcmVhbGJsb2NrW2kgLSB0cmFuc19oYWxmXSkpIDsKKyAgICB9CisgICAgaWYgKCByZWFsX2Jsb2Nrc1tpXS0+Yl9ibG9ja25yID4gU0JfQkxPQ0tfQ09VTlQocF9zX3NiKSApIHsKKyAgICAgIHJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiam91cm5hbC0xMjA3OiBSRVBMQVkgRkFJTFVSRSBmc2NrIHJlcXVpcmVkISBCbG9jayB0byByZXBsYXkgaXMgb3V0c2lkZSBvZiBmaWxlc3lzdGVtIik7CisgICAgICBnb3RvIGFib3J0X3JlcGxheTsKKyAgICB9CisgICAgLyogbWFrZSBzdXJlIHdlIGRvbid0IHRyeSB0byByZXBsYXkgb250byBsb2cgb3IgcmVzZXJ2ZWQgYXJlYSAqLworICAgIGlmIChpc19ibG9ja19pbl9sb2dfb3JfcmVzZXJ2ZWRfYXJlYShwX3Nfc2IsIHJlYWxfYmxvY2tzW2ldLT5iX2Jsb2NrbnIpKSB7CisgICAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImpvdXJuYWwtMTIwNDogUkVQTEFZIEZBSUxVUkUgZnNjayByZXF1aXJlZCEgVHJ5aW5nIHRvIHJlcGxheSBvbnRvIGEgbG9nIGJsb2NrIikgOworYWJvcnRfcmVwbGF5OgorICAgICAgYnJlbHNlX2FycmF5KGxvZ19ibG9ja3MsIGkpIDsKKyAgICAgIGJyZWxzZV9hcnJheShyZWFsX2Jsb2NrcywgaSkgOworICAgICAgYnJlbHNlKGNfYmgpIDsKKyAgICAgIGJyZWxzZShkX2JoKSA7CisgICAgICByZWlzZXJmc19rZnJlZShsb2dfYmxvY2tzLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpIDsKKyAgICAgIHJlaXNlcmZzX2tmcmVlKHJlYWxfYmxvY2tzLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpIDsKKyAgICAgIHJldHVybiAtMSA7CisgICAgfQorICB9CisgIC8qIHJlYWQgaW4gdGhlIGxvZyBibG9ja3MsIG1lbWNweSB0byB0aGUgY29ycmVzcG9uZGluZyByZWFsIGJsb2NrICovCisgIGxsX3J3X2Jsb2NrKFJFQUQsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSwgbG9nX2Jsb2NrcykgOworICBmb3IgKGkgPSAwIDsgaSA8IGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSA7IGkrKykgeworICAgIHdhaXRfb25fYnVmZmVyKGxvZ19ibG9ja3NbaV0pIDsKKyAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShsb2dfYmxvY2tzW2ldKSkgeworICAgICAgcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsICJqb3VybmFsLTEyMTI6IFJFUExBWSBGQUlMVVJFIGZzY2sgcmVxdWlyZWQhIGJ1ZmZlciB3cml0ZSBmYWlsZWQiKSA7CisgICAgICBicmVsc2VfYXJyYXkobG9nX2Jsb2NrcyArIGksIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAtIGkpIDsKKyAgICAgIGJyZWxzZV9hcnJheShyZWFsX2Jsb2NrcywgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpKSA7CisgICAgICBicmVsc2UoY19iaCkgOworICAgICAgYnJlbHNlKGRfYmgpIDsKKyAgICAgIHJlaXNlcmZzX2tmcmVlKGxvZ19ibG9ja3MsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOworICAgICAgcmVpc2VyZnNfa2ZyZWUocmVhbF9ibG9ja3MsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOworICAgICAgcmV0dXJuIC0xIDsKKyAgICB9CisgICAgbWVtY3B5KHJlYWxfYmxvY2tzW2ldLT5iX2RhdGEsIGxvZ19ibG9ja3NbaV0tPmJfZGF0YSwgcmVhbF9ibG9ja3NbaV0tPmJfc2l6ZSkgOworICAgIHNldF9idWZmZXJfdXB0b2RhdGUocmVhbF9ibG9ja3NbaV0pIDsKKyAgICBicmVsc2UobG9nX2Jsb2Nrc1tpXSkgOworICB9CisgIC8qIGZsdXNoIG91dCB0aGUgcmVhbCBibG9ja3MgKi8KKyAgZm9yIChpID0gMCA7IGkgPCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgOyBpKyspIHsKKyAgICBzZXRfYnVmZmVyX2RpcnR5KHJlYWxfYmxvY2tzW2ldKSA7CisgICAgbGxfcndfYmxvY2soV1JJVEUsIDEsIHJlYWxfYmxvY2tzICsgaSkgOworICB9CisgIGZvciAoaSA9IDAgOyBpIDwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpIDsgaSsrKSB7CisgICAgd2FpdF9vbl9idWZmZXIocmVhbF9ibG9ja3NbaV0pIDsgCisgICAgaWYgKCFidWZmZXJfdXB0b2RhdGUocmVhbF9ibG9ja3NbaV0pKSB7CisgICAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImpvdXJuYWwtMTIyNjogUkVQTEFZIEZBSUxVUkUsIGZzY2sgcmVxdWlyZWQhIGJ1ZmZlciB3cml0ZSBmYWlsZWQiKSA7CisgICAgICBicmVsc2VfYXJyYXkocmVhbF9ibG9ja3MgKyBpLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgLSBpKSA7CisgICAgICBicmVsc2UoY19iaCkgOworICAgICAgYnJlbHNlKGRfYmgpIDsKKyAgICAgIHJlaXNlcmZzX2tmcmVlKGxvZ19ibG9ja3MsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOworICAgICAgcmVpc2VyZnNfa2ZyZWUocmVhbF9ibG9ja3MsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOworICAgICAgcmV0dXJuIC0xIDsKKyAgICB9CisgICAgYnJlbHNlKHJlYWxfYmxvY2tzW2ldKSA7CisgIH0KKyAgY3VyX2RibG9jayA9ICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArICgodHJhbnNfb2Zmc2V0ICsgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICsgMikgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpIDsKKyAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbC0xMDk1OiBzZXR0aW5nIGpvdXJuYWwgIgorICAgICAgICAgICAgICAgICAic3RhcnQgdG8gb2Zmc2V0ICVsZCIsCisJCSBjdXJfZGJsb2NrIC0gIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpKSA7CisgIAorICAvKiBpbml0IHN0YXJ0aW5nIHZhbHVlcyBmb3IgdGhlIGZpcnN0IHRyYW5zYWN0aW9uLCBpbiBjYXNlIHRoaXMgaXMgdGhlIGxhc3QgdHJhbnNhY3Rpb24gdG8gYmUgcmVwbGF5ZWQuICovCisgIGpvdXJuYWwtPmpfc3RhcnQgPSBjdXJfZGJsb2NrIC0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgOworICBqb3VybmFsLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQgPSB0cmFuc19pZCA7CisgIGpvdXJuYWwtPmpfdHJhbnNfaWQgPSB0cmFuc19pZCArIDE7CisgIGJyZWxzZShjX2JoKSA7CisgIGJyZWxzZShkX2JoKSA7CisgIHJlaXNlcmZzX2tmcmVlKGxvZ19ibG9ja3MsIGxlMzJfdG9fY3B1KGRlc2MtPmpfbGVuKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOworICByZWlzZXJmc19rZnJlZShyZWFsX2Jsb2NrcywgbGUzMl90b19jcHUoZGVzYy0+al9sZW4pICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKSA7CisgIHJldHVybiAwIDsKK30KKworLyogVGhpcyBmdW5jdGlvbiByZWFkcyBibG9ja3Mgc3RhcnRpbmcgZnJvbSBibG9jayBhbmQgdG8gbWF4X2Jsb2NrIG9mIGJ1ZnNpemUKKyAgIHNpemUgKGJ1dCBubyBtb3JlIHRoYW4gQlVGTlIgYmxvY2tzIGF0IGEgdGltZSkuIFRoaXMgcHJvdmVkIHRvIGltcHJvdmUKKyAgIG1vdW50aW5nIHNwZWVkIG9uIHNlbGYtcmVidWlsZGluZyByYWlkNSBhcnJheXMgYXQgbGVhc3QuCisgICBSaWdodCBub3cgaXQgaXMgb25seSB1c2VkIGZyb20gam91cm5hbCBjb2RlLiBCdXQgbGF0ZXIgd2UgbWlnaHQgdXNlIGl0CisgICBmcm9tIG90aGVyIHBsYWNlcy4KKyAgIE5vdGU6IERvIG5vdCB1c2Ugam91cm5hbF9nZXRibGsvc2JfZ2V0YmxrIGZ1bmN0aW9ucyBoZXJlISAqLworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIHJlaXNlcmZzX2JyZWFkYSAoc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LCBpbnQgYmxvY2ssIGludCBidWZzaXplLAorCQkJICAgIHVuc2lnbmVkIGludCBtYXhfYmxvY2spCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmhsaXN0W0JVRk5SXTsKKwl1bnNpZ25lZCBpbnQgYmxvY2tzID0gQlVGTlI7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJaW50IGksIGo7CisJCisJYmggPSBfX2dldGJsayAoZGV2LCBibG9jaywgYnVmc2l6ZSApOworCWlmIChidWZmZXJfdXB0b2RhdGUgKGJoKSkKKwkJcmV0dXJuIChiaCk7ICAgCisJCQorCWlmIChibG9jayArIEJVRk5SID4gbWF4X2Jsb2NrKSB7CisJCWJsb2NrcyA9IG1heF9ibG9jayAtIGJsb2NrOworCX0KKwliaGxpc3RbMF0gPSBiaDsKKwlqID0gMTsKKwlmb3IgKGkgPSAxOyBpIDwgYmxvY2tzOyBpKyspIHsKKwkJYmggPSBfX2dldGJsayAoZGV2LCBibG9jayArIGksIGJ1ZnNpemUpOworCQlpZiAoYnVmZmVyX3VwdG9kYXRlIChiaCkpIHsKKwkJCWJyZWxzZSAoYmgpOworCQkJYnJlYWs7CisJCX0KKwkJZWxzZSBiaGxpc3RbaisrXSA9IGJoOworCX0KKwlsbF9yd19ibG9jayAoUkVBRCwgaiwgYmhsaXN0KTsKKwlmb3IoaSA9IDE7IGkgPCBqOyBpKyspIAorCQlicmVsc2UgKGJobGlzdFtpXSk7CisJYmggPSBiaGxpc3RbMF07CisJd2FpdF9vbl9idWZmZXIgKGJoKTsKKwlpZiAoYnVmZmVyX3VwdG9kYXRlIChiaCkpCisJCXJldHVybiBiaDsKKwlicmVsc2UgKGJoKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyoqIHJlYWQgYW5kIHJlcGxheSB0aGUgbG9nCisqKiBvbiBhIGNsZWFuIHVubW91bnQsIHRoZSBqb3VybmFsIGhlYWRlcidzIG5leHQgdW5mbHVzaGVkIHBvaW50ZXIgd2lsbCBiZSB0byBhbiBpbnZhbGlkCisqKiB0cmFuc2FjdGlvbi4gIFRoaXMgdGVzdHMgdGhhdCBiZWZvcmUgZmluZGluZyBhbGwgdGhlIHRyYW5zYWN0aW9ucyBpbiB0aGUgbG9nLCB3aGljaCBtYWtlcyBub3JtYWwgbW91bnQgdGltZXMgZmFzdC4KKyoqCisqKiBBZnRlciBhIGNyYXNoLCB0aGlzIHN0YXJ0cyB3aXRoIHRoZSBuZXh0IHVuZmx1c2hlZCB0cmFuc2FjdGlvbiwgYW5kIHJlcGxheXMgdW50aWwgaXQgZmluZHMgb25lIHRvbyBvbGQsIG9yIGludmFsaWQuCisqKgorKiogT24gZXhpdCwgaXQgc2V0cyB0aGluZ3MgdXAgc28gdGhlIGZpcnN0IHRyYW5zYWN0aW9uIHdpbGwgd29yayBjb3JyZWN0bHkuCisqLworc3RhdGljIGludCBqb3VybmFsX3JlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICpkZXNjIDsKKyAgdW5zaWduZWQgbG9uZyBvbGRlc3RfdHJhbnNfaWQgPSAwOworICB1bnNpZ25lZCBsb25nIG9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkID0gMCA7CisgIHRpbWVfdCBzdGFydCA7CisgIHVuc2lnbmVkIGxvbmcgb2xkZXN0X3N0YXJ0ID0gMDsKKyAgdW5zaWduZWQgbG9uZyBjdXJfZGJsb2NrID0gMCA7CisgIHVuc2lnbmVkIGxvbmcgbmV3ZXN0X21vdW50X2lkID0gOSA7CisgIHN0cnVjdCBidWZmZXJfaGVhZCAqZF9iaCA7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2hlYWRlciAqamggOworICBpbnQgdmFsaWRfam91cm5hbF9oZWFkZXIgPSAwIDsKKyAgaW50IHJlcGxheV9jb3VudCA9IDAgOworICBpbnQgY29udGludWVfcmVwbGF5ID0gMSA7CisgIGludCByZXQgOworICBjaGFyIGJbQkRFVk5BTUVfU0laRV07CisKKyAgY3VyX2RibG9jayA9IFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpIDsKKyAgcmVpc2VyZnNfaW5mbyAocF9zX3NiLCAiY2hlY2tpbmcgdHJhbnNhY3Rpb24gbG9nICglcylcbiIsCisJIGJkZXZuYW1lKGpvdXJuYWwtPmpfZGV2X2JkLCBiKSk7CisgIHN0YXJ0ID0gZ2V0X3NlY29uZHMoKTsKKworICAvKiBzdGVwIDEsIHJlYWQgaW4gdGhlIGpvdXJuYWwgaGVhZGVyIGJsb2NrLiAgQ2hlY2sgdGhlIHRyYW5zYWN0aW9uIGl0IHNheXMgCisgICoqIGlzIHRoZSBmaXJzdCB1bmZsdXNoZWQsIGFuZCBpZiB0aGF0IHRyYW5zYWN0aW9uIGlzIG5vdCB2YWxpZCwgCisgICoqIHJlcGxheSBpcyBkb25lCisgICovCisgIGpvdXJuYWwtPmpfaGVhZGVyX2JoID0gam91cm5hbF9icmVhZChwX3Nfc2IsCisJCQkJCSAgIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpICsgCisJCQkJCSAgIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSk7CisgIGlmICgham91cm5hbC0+al9oZWFkZXJfYmgpIHsKKyAgICByZXR1cm4gMSA7CisgIH0KKyAgamggPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICopKGpvdXJuYWwtPmpfaGVhZGVyX2JoLT5iX2RhdGEpIDsKKyAgaWYgKGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpID49IDAgJiYgCisgICAgICBsZTMyX3RvX2NwdShqaC0+al9maXJzdF91bmZsdXNoZWRfb2Zmc2V0KSA8IFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSAmJiAKKyAgICAgIGxlMzJfdG9fY3B1KGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpID4gMCkgeworICAgIG9sZGVzdF9zdGFydCA9IFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpICsgCisgICAgICAgICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpIDsKKyAgICBvbGRlc3RfdHJhbnNfaWQgPSBsZTMyX3RvX2NwdShqaC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkKSArIDE7CisgICAgbmV3ZXN0X21vdW50X2lkID0gbGUzMl90b19jcHUoamgtPmpfbW91bnRfaWQpOworICAgIHJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTE1MzogZm91bmQgaW4gIgorICAgICAgICAgICAgICAgICAgICJoZWFkZXI6IGZpcnN0X3VuZmx1c2hlZF9vZmZzZXQgJWQsIGxhc3RfZmx1c2hlZF90cmFuc19pZCAiCisJCSAgICIlbHUiLCBsZTMyX3RvX2NwdShqaC0+al9maXJzdF91bmZsdXNoZWRfb2Zmc2V0KSwKKwkJICAgbGUzMl90b19jcHUoamgtPmpfbGFzdF9mbHVzaF90cmFuc19pZCkpIDsKKyAgICB2YWxpZF9qb3VybmFsX2hlYWRlciA9IDEgOworCisgICAgLyogbm93LCB3ZSB0cnkgdG8gcmVhZCB0aGUgZmlyc3QgdW5mbHVzaGVkIG9mZnNldC4gIElmIGl0IGlzIG5vdCB2YWxpZCwgCisgICAgKiogdGhlcmUgaXMgbm90aGluZyBtb3JlIHdlIGNhbiBkbywgYW5kIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHJlYWQgCisgICAgKiogdGhyb3VnaCB0aGUgd2hvbGUgbG9nLgorICAgICovCisgICAgZF9iaCA9IGpvdXJuYWxfYnJlYWQocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpKSA7CisgICAgcmV0ID0gam91cm5hbF90cmFuc2FjdGlvbl9pc192YWxpZChwX3Nfc2IsIGRfYmgsIE5VTEwsIE5VTEwpIDsKKyAgICBpZiAoIXJldCkgeworICAgICAgY29udGludWVfcmVwbGF5ID0gMCA7CisgICAgfQorICAgIGJyZWxzZShkX2JoKSA7CisgICAgZ290byBzdGFydF9sb2dfcmVwbGF5OworICB9CisKKyAgaWYgKGNvbnRpbnVlX3JlcGxheSAmJiBiZGV2X3JlYWRfb25seShwX3Nfc2ItPnNfYmRldikpIHsKKyAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsCisJCSAgICAgICJjbG0tMjA3NjogZGV2aWNlIGlzIHJlYWRvbmx5LCB1bmFibGUgdG8gcmVwbGF5IGxvZyIpIDsKKyAgICByZXR1cm4gLTEgOworICB9CisKKyAgLyogb2ssIHRoZXJlIGFyZSB0cmFuc2FjdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHJlcGxheWVkLiAgc3RhcnQgd2l0aCB0aGUgZmlyc3QgbG9nIGJsb2NrLCBmaW5kCisgICoqIGFsbCB0aGUgdmFsaWQgdHJhbnNhY3Rpb25zLCBhbmQgcGljayBvdXQgdGhlIG9sZGVzdC4KKyAgKi8KKyAgd2hpbGUoY29udGludWVfcmVwbGF5ICYmIGN1cl9kYmxvY2sgPCAoU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpKSB7CisgICAgLyogTm90ZSB0aGF0IGl0IGlzIHJlcXVpcmVkIGZvciBibG9ja3NpemUgb2YgcHJpbWFyeSBmcyBkZXZpY2UgYW5kIGpvdXJuYWwKKyAgICAgICBkZXZpY2UgdG8gYmUgdGhlIHNhbWUgKi8KKyAgICBkX2JoID0gcmVpc2VyZnNfYnJlYWRhKGpvdXJuYWwtPmpfZGV2X2JkLCBjdXJfZGJsb2NrLCBwX3Nfc2ItPnNfYmxvY2tzaXplLAorCQkJICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpIDsKKyAgICByZXQgPSBqb3VybmFsX3RyYW5zYWN0aW9uX2lzX3ZhbGlkKHBfc19zYiwgZF9iaCwgJm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkLCAmbmV3ZXN0X21vdW50X2lkKSA7CisgICAgaWYgKHJldCA9PSAxKSB7CisgICAgICBkZXNjID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKilkX2JoLT5iX2RhdGEgOworICAgICAgaWYgKG9sZGVzdF9zdGFydCA9PSAwKSB7IC8qIGluaXQgYWxsIG9sZGVzdF8gdmFsdWVzICovCisgICAgICAgIG9sZGVzdF90cmFuc19pZCA9IGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpIDsKKwlvbGRlc3Rfc3RhcnQgPSBkX2JoLT5iX2Jsb2NrbnIgOworCW5ld2VzdF9tb3VudF9pZCA9IGdldF9kZXNjX21vdW50X2lkKGRlc2MpIDsKKwlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTExNzk6IFNldHRpbmcgIgorCSAgICAgICAgICAgICAgICJvbGRlc3Rfc3RhcnQgdG8gb2Zmc2V0ICVsbHUsIHRyYW5zX2lkICVsdSIsCisJCSAgICAgICBvbGRlc3Rfc3RhcnQgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwgCisJCSAgICAgICBvbGRlc3RfdHJhbnNfaWQpIDsKKyAgICAgIH0gZWxzZSBpZiAob2xkZXN0X3RyYW5zX2lkID4gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykpIHsgCisgICAgICAgIC8qIG9uZSB3ZSBqdXN0IHJlYWQgd2FzIG9sZGVyICovCisgICAgICAgIG9sZGVzdF90cmFuc19pZCA9IGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpIDsKKwlvbGRlc3Rfc3RhcnQgPSBkX2JoLT5iX2Jsb2NrbnIgOworCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTE4MDogUmVzZXR0aW5nICIKKwkgICAgICAgICAgICAgICAib2xkZXN0X3N0YXJ0IHRvIG9mZnNldCAlbHUsIHRyYW5zX2lkICVsdSIsCisJCQlvbGRlc3Rfc3RhcnQgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwgCisJCQlvbGRlc3RfdHJhbnNfaWQpIDsKKyAgICAgIH0KKyAgICAgIGlmIChuZXdlc3RfbW91bnRfaWQgPCBnZXRfZGVzY19tb3VudF9pZChkZXNjKSkgeworICAgICAgICBuZXdlc3RfbW91bnRfaWQgPSBnZXRfZGVzY19tb3VudF9pZChkZXNjKSA7CisJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbC0xMjk5OiBTZXR0aW5nICIKKwkgICAgICAgICAgICAgICJuZXdlc3RfbW91bnRfaWQgdG8gJWQiLCBnZXRfZGVzY19tb3VudF9pZChkZXNjKSk7CisgICAgICB9CisgICAgICBjdXJfZGJsb2NrICs9IGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSArIDIgOworICAgIH0gZWxzZSB7CisgICAgICBjdXJfZGJsb2NrKysgOworICAgIH0KKyAgICBicmVsc2UoZF9iaCkgOworICB9CisKK3N0YXJ0X2xvZ19yZXBsYXk6CisgIGN1cl9kYmxvY2sgPSBvbGRlc3Rfc3RhcnQgOworICBpZiAob2xkZXN0X3RyYW5zX2lkKSAgeworICAgIHJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTIwNjogU3RhcnRpbmcgcmVwbGF5ICIKKyAgICAgICAgICAgICAgICAgICAiZnJvbSBvZmZzZXQgJWxsdSwgdHJhbnNfaWQgJWx1IiwKKwkJICAgY3VyX2RibG9jayAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpLCAKKwkJICAgb2xkZXN0X3RyYW5zX2lkKSA7CisKKyAgfQorICByZXBsYXlfY291bnQgPSAwIDsKKyAgd2hpbGUoY29udGludWVfcmVwbGF5ICYmIG9sZGVzdF90cmFuc19pZCA+IDApIHsKKyAgICByZXQgPSBqb3VybmFsX3JlYWRfdHJhbnNhY3Rpb24ocF9zX3NiLCBjdXJfZGJsb2NrLCBvbGRlc3Rfc3RhcnQsIG9sZGVzdF90cmFuc19pZCwgbmV3ZXN0X21vdW50X2lkKSA7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgIHJldHVybiByZXQgOworICAgIH0gZWxzZSBpZiAocmV0ICE9IDApIHsKKyAgICAgIGJyZWFrIDsKKyAgICB9CisgICAgY3VyX2RibG9jayA9IFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpICsgam91cm5hbC0+al9zdGFydCA7CisgICAgcmVwbGF5X2NvdW50KysgOworICAgaWYgKGN1cl9kYmxvY2sgPT0gb2xkZXN0X3N0YXJ0KQorICAgICAgICBicmVhazsKKyAgfQorCisgIGlmIChvbGRlc3RfdHJhbnNfaWQgPT0gMCkgeworICAgIHJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTIyNTogTm8gdmFsaWQgIgorICAgICAgICAgICAgICAgICAgICJ0cmFuc2FjdGlvbnMgZm91bmQiKSA7CisgIH0KKyAgLyogal9zdGFydCBkb2VzIG5vdCBnZXQgc2V0IGNvcnJlY3RseSBpZiB3ZSBkb24ndCByZXBsYXkgYW55IHRyYW5zYWN0aW9ucy4KKyAgKiogaWYgd2UgaGFkIGEgdmFsaWQgam91cm5hbF9oZWFkZXIsIHNldCBqX3N0YXJ0IHRvIHRoZSBmaXJzdCB1bmZsdXNoZWQgdHJhbnNhY3Rpb24gdmFsdWUsCisgICoqIGNvcHkgdGhlIHRyYW5zX2lkIGZyb20gdGhlIGhlYWRlcgorICAqLworICBpZiAodmFsaWRfam91cm5hbF9oZWFkZXIgJiYgcmVwbGF5X2NvdW50ID09IDApIHsgCisgICAgam91cm5hbC0+al9zdGFydCA9IGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpIDsKKyAgICBqb3VybmFsLT5qX3RyYW5zX2lkID0gbGUzMl90b19jcHUoamgtPmpfbGFzdF9mbHVzaF90cmFuc19pZCkgKyAxOworICAgIGpvdXJuYWwtPmpfbGFzdF9mbHVzaF90cmFuc19pZCA9IGxlMzJfdG9fY3B1KGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpIDsKKyAgICBqb3VybmFsLT5qX21vdW50X2lkID0gbGUzMl90b19jcHUoamgtPmpfbW91bnRfaWQpICsgMTsKKyAgfSBlbHNlIHsKKyAgICBqb3VybmFsLT5qX21vdW50X2lkID0gbmV3ZXN0X21vdW50X2lkICsgMSA7CisgIH0KKyAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbC0xMjk5OiBTZXR0aW5nICIKKyAgICAgICAgICAgICAgICAgIm5ld2VzdF9tb3VudF9pZCB0byAlbHUiLCBqb3VybmFsLT5qX21vdW50X2lkKSA7CisgIGpvdXJuYWwtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCA9IGpvdXJuYWwtPmpfc3RhcnQgOworICBpZiAocmVwbGF5X2NvdW50ID4gMCkgeworICAgIHJlaXNlcmZzX2luZm8gKHBfc19zYiwgInJlcGxheWVkICVkIHRyYW5zYWN0aW9ucyBpbiAlbHUgc2Vjb25kc1xuIiwKKwkJICAgcmVwbGF5X2NvdW50LCBnZXRfc2Vjb25kcygpIC0gc3RhcnQpIDsKKyAgfQorICBpZiAoIWJkZXZfcmVhZF9vbmx5KHBfc19zYi0+c19iZGV2KSAmJiAKKyAgICAgICBfdXBkYXRlX2pvdXJuYWxfaGVhZGVyX2Jsb2NrKHBfc19zYiwgam91cm5hbC0+al9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam91cm5hbC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkKSkKKyAgeworICAgICAgLyogcmVwbGF5IGZhaWxlZCwgY2FsbGVyIG11c3QgY2FsbCBmcmVlX2pvdXJuYWxfcmFtIGFuZCBhYm9ydAorICAgICAgKiogdGhlIG1vdW50CisgICAgICAqLworICAgICAgcmV0dXJuIC0xIDsKKyAgfQorICByZXR1cm4gMCA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICphbGxvY19qb3VybmFsX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsOworcmV0cnk6CisgICAgamwgPSByZWlzZXJmc19rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0KSwgR0ZQX05PRlMsIHMpOworICAgIGlmICghamwpIHsKKwl5aWVsZCgpOworCWdvdG8gcmV0cnk7CisgICAgfQorICAgIG1lbXNldChqbCwgMCwgc2l6ZW9mKCpqbCkpOworICAgIElOSVRfTElTVF9IRUFEKCZqbC0+al9saXN0KTsKKyAgICBJTklUX0xJU1RfSEVBRCgmamwtPmpfd29ya2luZ19saXN0KTsKKyAgICBJTklUX0xJU1RfSEVBRCgmamwtPmpfdGFpbF9iaF9saXN0KTsKKyAgICBJTklUX0xJU1RfSEVBRCgmamwtPmpfYmhfbGlzdCk7CisgICAgc2VtYV9pbml0KCZqbC0+al9jb21taXRfbG9jaywgMSk7CisgICAgU0JfSk9VUk5BTChzKS0+al9udW1fbGlzdHMrKzsKKyAgICBnZXRfam91cm5hbF9saXN0KGpsKTsKKyAgICByZXR1cm4gamw7Cit9CisKK3N0YXRpYyB2b2lkIGpvdXJuYWxfbGlzdF9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7CisgICAgU0JfSk9VUk5BTChwX3Nfc2IpLT5qX2N1cnJlbnRfamwgPSBhbGxvY19qb3VybmFsX2xpc3QocF9zX3NiKTsKK30KKworc3RhdGljIGludCByZWxlYXNlX2pvdXJuYWxfZGV2KCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnN1cGVyLAorCQkJCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsICkKK3sKKyAgICBpbnQgcmVzdWx0OworICAgIAorICAgIHJlc3VsdCA9IDA7CisKKyAgICBpZiggam91cm5hbCAtPiBqX2Rldl9maWxlICE9IE5VTEwgKSB7CisJcmVzdWx0ID0gZmlscF9jbG9zZSggam91cm5hbCAtPiBqX2Rldl9maWxlLCBOVUxMICk7CisJam91cm5hbCAtPiBqX2Rldl9maWxlID0gTlVMTDsKKwlqb3VybmFsIC0+IGpfZGV2X2JkID0gTlVMTDsKKyAgICB9IGVsc2UgaWYoIGpvdXJuYWwgLT4gal9kZXZfYmQgIT0gTlVMTCApIHsKKwlyZXN1bHQgPSBibGtkZXZfcHV0KCBqb3VybmFsIC0+IGpfZGV2X2JkICk7CisJam91cm5hbCAtPiBqX2Rldl9iZCA9IE5VTEw7CisgICAgfQorCisgICAgaWYoIHJlc3VsdCAhPSAwICkgeworCXJlaXNlcmZzX3dhcm5pbmcoc3VwZXIsICJzaC00NTc6IHJlbGVhc2Vfam91cm5hbF9kZXY6IENhbm5vdCByZWxlYXNlIGpvdXJuYWwgZGV2aWNlOiAlaSIsIHJlc3VsdCApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGpvdXJuYWxfaW5pdF9kZXYoIHN0cnVjdCBzdXBlcl9ibG9jayAqc3VwZXIsIAorCQkJICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCwgCisJCQkgICAgIGNvbnN0IGNoYXIgKmpkZXZfbmFtZSApCit7CisJaW50IHJlc3VsdDsKKwlkZXZfdCBqZGV2OworCWludCBibGtkZXZfbW9kZSA9IEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURTsKKwljaGFyIGJbQkRFVk5BTUVfU0laRV07CisKKwlyZXN1bHQgPSAwOworCisJam91cm5hbCAtPiBqX2Rldl9iZCA9IE5VTEw7CisJam91cm5hbCAtPiBqX2Rldl9maWxlID0gTlVMTDsKKwlqZGV2ID0gU0JfT05ESVNLX0pPVVJOQUxfREVWSUNFKCBzdXBlciApID8KKwkJbmV3X2RlY29kZV9kZXYoU0JfT05ESVNLX0pPVVJOQUxfREVWSUNFKHN1cGVyKSkgOiBzdXBlci0+c19kZXY7CQorCisJaWYgKGJkZXZfcmVhZF9vbmx5KHN1cGVyLT5zX2JkZXYpKQorCSAgICBibGtkZXZfbW9kZSA9IEZNT0RFX1JFQUQ7CisKKwkvKiB0aGVyZSBpcyBubyAiamRldiIgb3B0aW9uIGFuZCBqb3VybmFsIGlzIG9uIHNlcGFyYXRlIGRldmljZSAqLworCWlmKCAoICFqZGV2X25hbWUgfHwgIWpkZXZfbmFtZVsgMCBdICkgKSB7CisJCWpvdXJuYWwtPmpfZGV2X2JkID0gb3Blbl9ieV9kZXZudW0oamRldiwgYmxrZGV2X21vZGUpOworCQlpZiAoSVNfRVJSKGpvdXJuYWwtPmpfZGV2X2JkKSkgeworCQkJcmVzdWx0ID0gUFRSX0VSUihqb3VybmFsLT5qX2Rldl9iZCk7CisJCQlqb3VybmFsLT5qX2Rldl9iZCA9IE5VTEw7CisJCQlyZWlzZXJmc193YXJuaW5nIChzdXBlciwgInNoLTQ1ODogam91cm5hbF9pbml0X2RldjogIgorCQkJCQkgICJjYW5ub3QgaW5pdCBqb3VybmFsIGRldmljZSAnJXMnOiAlaSIsCisJCQkJCSAgX19iZGV2bmFtZShqZGV2LCBiKSwgcmVzdWx0ICk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGVsc2UgaWYgKGpkZXYgIT0gc3VwZXItPnNfZGV2KQorCQkJc2V0X2Jsb2Nrc2l6ZShqb3VybmFsLT5qX2Rldl9iZCwgc3VwZXItPnNfYmxvY2tzaXplKTsKKwkJcmV0dXJuIDA7CisJfQorCisJam91cm5hbCAtPiBqX2Rldl9maWxlID0gZmlscF9vcGVuKCBqZGV2X25hbWUsIDAsIDAgKTsKKwlpZiggIUlTX0VSUiggam91cm5hbCAtPiBqX2Rldl9maWxlICkgKSB7CisJCXN0cnVjdCBpbm9kZSAqamRldl9pbm9kZSA9IGpvdXJuYWwtPmpfZGV2X2ZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKwkJaWYoICFTX0lTQkxLKCBqZGV2X2lub2RlIC0+IGlfbW9kZSApICkgeworCQkJcmVpc2VyZnNfd2FybmluZyAgKHN1cGVyLCAiam91cm5hbF9pbml0X2RldjogJyVzJyBpcyAiCisJCQkJCSAgICJub3QgYSBibG9jayBkZXZpY2UiLCBqZGV2X25hbWUgKTsKKwkJCXJlc3VsdCA9IC1FTk9UQkxLOworCQl9IGVsc2UgIHsKKwkJCS8qIG9rICovCisJCQlqb3VybmFsLT5qX2Rldl9iZCA9IElfQkRFVihqZGV2X2lub2RlKTsKKwkJCXNldF9ibG9ja3NpemUoam91cm5hbC0+al9kZXZfYmQsIHN1cGVyLT5zX2Jsb2Nrc2l6ZSk7CisJCX0KKwl9IGVsc2UgeworCQlyZXN1bHQgPSBQVFJfRVJSKCBqb3VybmFsIC0+IGpfZGV2X2ZpbGUgKTsKKwkJam91cm5hbCAtPiBqX2Rldl9maWxlID0gTlVMTDsKKwkJcmVpc2VyZnNfd2FybmluZyAoc3VwZXIsCisJCQkJICAiam91cm5hbF9pbml0X2RldjogQ2Fubm90IG9wZW4gJyVzJzogJWkiLAorCQkJCSAgamRldl9uYW1lLCByZXN1bHQgKTsKKwl9CisJaWYoIHJlc3VsdCAhPSAwICkgeworCQlyZWxlYXNlX2pvdXJuYWxfZGV2KCBzdXBlciwgam91cm5hbCApOworCX0KKwlyZWlzZXJmc19pbmZvKHN1cGVyLCAiam91cm5hbF9pbml0X2Rldjogam91cm5hbCBkZXZpY2U6ICVzXG4iLAorCQliZGV2bmFtZShqb3VybmFsLT5qX2Rldl9iZCwgYikpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisqKiBtdXN0IGJlIGNhbGxlZCBvbmNlIG9uIGZzIG1vdW50LiAgY2FsbHMgam91cm5hbF9yZWFkIGZvciB5b3UKKyovCitpbnQgam91cm5hbF9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBjb25zdCBjaGFyICogal9kZXZfbmFtZSwgaW50IG9sZF9mb3JtYXQsIHVuc2lnbmVkIGludCBjb21taXRfbWF4X2FnZSkgeworICAgIGludCBudW1fY25vZGVzID0gU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpICogMiA7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaGpoOworICAgIHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzOworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2hlYWRlciAqamg7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWw7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7CisgICAgY2hhciBiW0JERVZOQU1FX1NJWkVdOworCisgICAgam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKSA9IHZtYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCkpIDsKKyAgICBpZiAoIWpvdXJuYWwpIHsKKwlyZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJqb3VybmFsLTEyNTY6IHVuYWJsZSB0byBnZXQgbWVtb3J5IGZvciBqb3VybmFsIHN0cnVjdHVyZSIpIDsKKwlyZXR1cm4gMSA7CisgICAgfQorICAgIG1lbXNldChqb3VybmFsLCAwLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwpKSA7CisgICAgSU5JVF9MSVNUX0hFQUQoJmpvdXJuYWwtPmpfYml0bWFwX25vZGVzKSA7CisgICAgSU5JVF9MSVNUX0hFQUQgKCZqb3VybmFsLT5qX3ByZWFsbG9jX2xpc3QpOworICAgIElOSVRfTElTVF9IRUFEKCZqb3VybmFsLT5qX3dvcmtpbmdfbGlzdCk7CisgICAgSU5JVF9MSVNUX0hFQUQoJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KTsKKyAgICBqb3VybmFsLT5qX3BlcnNpc3RlbnRfdHJhbnMgPSAwOworICAgIGlmIChyZWlzZXJmc19hbGxvY2F0ZV9saXN0X2JpdG1hcHMocF9zX3NiLAorCQkJCSAgICAgICBqb3VybmFsLT5qX2xpc3RfYml0bWFwLAorIAkJCQkgICAgICAgU0JfQk1BUF9OUihwX3Nfc2IpKSkKKwlnb3RvIGZyZWVfYW5kX3JldHVybiA7CisgICAgYWxsb2NhdGVfYml0bWFwX25vZGVzKHBfc19zYikgOworCisgICAgLyogcmVzZXJ2ZWQgZm9yIGpvdXJuYWwgYXJlYSBzdXBwb3J0ICovCisgICAgU0JfSk9VUk5BTF8xc3RfUkVTRVJWRURfQkxPQ0socF9zX3NiKSA9IChvbGRfZm9ybWF0ID8KKwkJCQkJICAgICBSRUlTRVJGU19PTERfRElTS19PRkZTRVRfSU5fQllURVMgLyBwX3Nfc2ItPnNfYmxvY2tzaXplICsKKwkJCQkJICAgICBTQl9CTUFQX05SKHBfc19zYikgKyAxIDoKKwkJCQkJICAgICBSRUlTRVJGU19ESVNLX09GRlNFVF9JTl9CWVRFUyAvIHBfc19zYi0+c19ibG9ja3NpemUgKyAyKTsgCisgICAgCisgICAgLyogU2FuaXR5IGNoZWNrIHRvIHNlZSBpcyB0aGUgc3RhbmRhcmQgam91cm5hbCBmaXR0aW5nIHdpdGhpbmcgZmlyc3QgYml0bWFwCisgICAgICAgKGFjdHVhbCBmb3Igc21hbGwgYmxvY2tzaXplcykgKi8KKyAgICBpZiAoICFTQl9PTkRJU0tfSk9VUk5BTF9ERVZJQ0UoIHBfc19zYiApICYmCisgICAgICAgICAoU0JfSk9VUk5BTF8xc3RfUkVTRVJWRURfQkxPQ0socF9zX3NiKSArIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSA+IHBfc19zYi0+c19ibG9ja3NpemUgKiA4KSApIHsKKwlyZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJqb3VybmFsLTEzOTM6IGpvdXJuYWwgZG9lcyBub3QgZml0IGZvciBhcmVhICIKKwkJCSAgImFkZHJlc3NlZCBieSBmaXJzdCBvZiBiaXRtYXAgYmxvY2tzLiBJdCBzdGFydHMgYXQgIgorCQkJICAiJXUgYW5kIGl0cyBzaXplIGlzICV1LiBCbG9jayBzaXplICVsZCIsCisJCQkgIFNCX0pPVVJOQUxfMXN0X1JFU0VSVkVEX0JMT0NLKHBfc19zYiksCisJCQkgIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSwgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJZ290byBmcmVlX2FuZF9yZXR1cm47CisgICAgfQorCisgICAgaWYoIGpvdXJuYWxfaW5pdF9kZXYoIHBfc19zYiwgam91cm5hbCwgal9kZXZfbmFtZSApICE9IDAgKSB7CisgICAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJzaC00NjI6IHVuYWJsZSB0byBpbml0aWFsaXplIGpvcm5hbCBkZXZpY2UiKTsKKyAgICAgIGdvdG8gZnJlZV9hbmRfcmV0dXJuOworICAgIH0KKworICAgICBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socF9zX3NiKTsKKyAgICAgCisgICAgIC8qIHJlYWQgam91cm5hbCBoZWFkZXIgKi8KKyAgICAgYmhqaCA9IGpvdXJuYWxfYnJlYWQocF9zX3NiLAorCQkgICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSk7CisgICAgIGlmICghYmhqaCkgeworCSByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJzaC00NTk6IHVuYWJsZSB0byByZWFkIGpvdXJuYWwgaGVhZGVyIik7CisJIGdvdG8gZnJlZV9hbmRfcmV0dXJuOworICAgICB9CisgICAgIGpoID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2hlYWRlciAqKShiaGpoLT5iX2RhdGEpOworICAgICAKKyAgICAgLyogbWFrZSBzdXJlIHRoYXQgam91cm5hbCBtYXRjaGVzIHRvIHRoZSBzdXBlciBibG9jayAqLworICAgICBpZiAoaXNfcmVpc2VyZnNfanIocnMpICYmIChqaC0+amhfam91cm5hbC5qcF9qb3VybmFsX21hZ2ljICE9IHNiX2pwX2pvdXJuYWxfbWFnaWMocnMpKSkgeworCSByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJzaC00NjA6IGpvdXJuYWwgaGVhZGVyIG1hZ2ljICV4ICIKKwkJCSAgICIoZGV2aWNlICVzKSBkb2VzIG5vdCBtYXRjaCB0byBtYWdpYyBmb3VuZCBpbiBzdXBlciAiCisJCQkgICAiYmxvY2sgJXgiLAorCQkJICAgamgtPmpoX2pvdXJuYWwuanBfam91cm5hbF9tYWdpYywKKwkJCSAgIGJkZXZuYW1lKCBqb3VybmFsLT5qX2Rldl9iZCwgYiksCisJCQkgICBzYl9qcF9qb3VybmFsX21hZ2ljKHJzKSk7CisJIGJyZWxzZSAoYmhqaCk7CisJIGdvdG8gZnJlZV9hbmRfcmV0dXJuOworICB9CisgICAgIAorICBqb3VybmFsLT5qX3RyYW5zX21heCAgICAgID0gbGUzMl90b19jcHUgKGpoLT5qaF9qb3VybmFsLmpwX2pvdXJuYWxfdHJhbnNfbWF4KTsKKyAgam91cm5hbC0+al9tYXhfYmF0Y2ggICAgICA9IGxlMzJfdG9fY3B1IChqaC0+amhfam91cm5hbC5qcF9qb3VybmFsX21heF9iYXRjaCk7CisgIGpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UgPSBsZTMyX3RvX2NwdSAoamgtPmpoX2pvdXJuYWwuanBfam91cm5hbF9tYXhfY29tbWl0X2FnZSk7CisgIGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSA9IEpPVVJOQUxfTUFYX1RSQU5TX0FHRTsKKworICBpZiAoam91cm5hbC0+al90cmFuc19tYXgpIHsKKyAgICAvKiBtYWtlIHN1cmUgdGhlc2UgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlLCBhc3NpZ24gaXQgaWYgdGhleSBhcmUgbm90ICovCisgICAgX191MzIgaW5pdGlhbCA9IGpvdXJuYWwtPmpfdHJhbnNfbWF4OworICAgIF9fdTMyIHJhdGlvID0gMTsKKyAgICAKKyAgICBpZiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSA8IDQwOTYpCisgICAgICByYXRpbyA9IDQwOTYgLyBwX3Nfc2ItPnNfYmxvY2tzaXplOworICAgIAorICAgIGlmIChTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikvam91cm5hbC0+al90cmFuc19tYXggPCBKT1VSTkFMX01JTl9SQVRJTykKKyAgICAgIGpvdXJuYWwtPmpfdHJhbnNfbWF4ID0gU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpIC8gSk9VUk5BTF9NSU5fUkFUSU87CisgICAgaWYgKGpvdXJuYWwtPmpfdHJhbnNfbWF4ID4gSk9VUk5BTF9UUkFOU19NQVhfREVGQVVMVCAvIHJhdGlvKQorICAgICAgam91cm5hbC0+al90cmFuc19tYXggPSBKT1VSTkFMX1RSQU5TX01BWF9ERUZBVUxUIC8gcmF0aW87CisgICAgaWYgKGpvdXJuYWwtPmpfdHJhbnNfbWF4IDwgSk9VUk5BTF9UUkFOU19NSU5fREVGQVVMVCAvIHJhdGlvKQorICAgICAgam91cm5hbC0+al90cmFuc19tYXggPSBKT1VSTkFMX1RSQU5TX01JTl9ERUZBVUxUIC8gcmF0aW87CisgICAgCisgICAgaWYgKGpvdXJuYWwtPmpfdHJhbnNfbWF4ICE9IGluaXRpYWwpCisgICAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJzaC00NjE6IGpvdXJuYWxfaW5pdDogd3JvbmcgdHJhbnNhY3Rpb24gbWF4IHNpemUgKCV1KS4gQ2hhbmdlZCB0byAldSIsCisJICAgICAgaW5pdGlhbCwgam91cm5hbC0+al90cmFuc19tYXgpOworCisgICAgam91cm5hbC0+al9tYXhfYmF0Y2ggPSBqb3VybmFsLT5qX3RyYW5zX21heCoKKyAgICAgIEpPVVJOQUxfTUFYX0JBVENIX0RFRkFVTFQvSk9VUk5BTF9UUkFOU19NQVhfREVGQVVMVDsKKyAgfSAgCisgIAorICBpZiAoIWpvdXJuYWwtPmpfdHJhbnNfbWF4KSB7CisgICAgLyp3ZSBoYXZlIHRoZSBmaWxlIHN5c3RlbSB3YXMgY3JlYXRlZCBieSBvbGQgdmVyc2lvbiBvZiBta3JlaXNlcmZzIAorICAgICAgc28gdGhpcyBmaWVsZCBjb250YWlucyB6ZXJvIHZhbHVlICovCisgICAgam91cm5hbC0+al90cmFuc19tYXggICAgICA9IEpPVVJOQUxfVFJBTlNfTUFYX0RFRkFVTFQgOworICAgIGpvdXJuYWwtPmpfbWF4X2JhdGNoICAgICAgPSBKT1VSTkFMX01BWF9CQVRDSF9ERUZBVUxUIDsKKyAgICBqb3VybmFsLT5qX21heF9jb21taXRfYWdlID0gSk9VUk5BTF9NQVhfQ09NTUlUX0FHRSA7CisgICAgCisgICAgLyogZm9yIGJsb2Nrc2l6ZSA+PSA0MDk2IC0gbWF4IHRyYW5zYWN0aW9uIHNpemUgaXMgMTAyNC4gRm9yIGJsb2NrIHNpemUgPCA0MDk2CisgICAgICAgdHJhbnMgbWF4IHNpemUgaXMgZGVjcmVhc2VkIHByb3BvcnRpb25hbGx5ICovCisgICAgaWYgKHBfc19zYi0+c19ibG9ja3NpemUgPCA0MDk2KSB7CisgICAgICBqb3VybmFsLT5qX3RyYW5zX21heCAvPSAoNDA5NiAvIHBfc19zYi0+c19ibG9ja3NpemUpIDsKKyAgICAgIGpvdXJuYWwtPmpfbWF4X2JhdGNoID0gKGpvdXJuYWwtPmpfdHJhbnNfbWF4KSAqIDkgLyAxMCA7CisgICAgfQorICB9CisKKyAgam91cm5hbC0+al9kZWZhdWx0X21heF9jb21taXRfYWdlID0gam91cm5hbC0+al9tYXhfY29tbWl0X2FnZTsKKworICBpZiAoY29tbWl0X21heF9hZ2UgIT0gMCkgeworICAgICAgam91cm5hbC0+al9tYXhfY29tbWl0X2FnZSA9IGNvbW1pdF9tYXhfYWdlOworICAgICAgam91cm5hbC0+al9tYXhfdHJhbnNfYWdlID0gY29tbWl0X21heF9hZ2U7CisgIH0KKworICByZWlzZXJmc19pbmZvIChwX3Nfc2IsICJqb3VybmFsIHBhcmFtczogZGV2aWNlICVzLCBzaXplICV1LCAiCisJCSAiam91cm5hbCBmaXJzdCBibG9jayAldSwgbWF4IHRyYW5zIGxlbiAldSwgbWF4IGJhdGNoICV1LCAiCisJCSAibWF4IGNvbW1pdCBhZ2UgJXUsIG1heCB0cmFucyBhZ2UgJXVcbiIsCisJCSBiZGV2bmFtZSggam91cm5hbC0+al9kZXZfYmQsIGIpLAorCQkgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpLAorCQkgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYiksCisJCSBqb3VybmFsLT5qX3RyYW5zX21heCwKKwkJIGpvdXJuYWwtPmpfbWF4X2JhdGNoLAorCQkgam91cm5hbC0+al9tYXhfY29tbWl0X2FnZSwKKwkJIGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSk7CisKKyAgYnJlbHNlIChiaGpoKTsKKyAgICAgCisgIGpvdXJuYWwtPmpfbGlzdF9iaXRtYXBfaW5kZXggPSAwIDsKKyAgam91cm5hbF9saXN0X2luaXQocF9zX3NiKSA7CisKKyAgbWVtc2V0KGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLCAwLCBKT1VSTkFMX0hBU0hfU0laRSAqIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqKSkgOworCisgIElOSVRfTElTVF9IRUFEKCZqb3VybmFsLT5qX2RpcnR5X2J1ZmZlcnMpIDsKKyAgc3Bpbl9sb2NrX2luaXQoJmpvdXJuYWwtPmpfZGlydHlfYnVmZmVyc19sb2NrKSA7CisKKyAgam91cm5hbC0+al9zdGFydCA9IDAgOworICBqb3VybmFsLT5qX2xlbiA9IDAgOworICBqb3VybmFsLT5qX2xlbl9hbGxvYyA9IDAgOworICBhdG9taWNfc2V0KCYoam91cm5hbC0+al93Y291bnQpLCAwKSA7CisgIGF0b21pY19zZXQoJihqb3VybmFsLT5qX2FzeW5jX3Rocm90dGxlKSwgMCkgOworICBqb3VybmFsLT5qX2Jjb3VudCA9IDAgOworICBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPSAwIDsKKyAgam91cm5hbC0+al9sYXN0ID0gTlVMTCA7CisgIGpvdXJuYWwtPmpfZmlyc3QgPSBOVUxMIDsKKyAgaW5pdF93YWl0cXVldWVfaGVhZCgmKGpvdXJuYWwtPmpfam9pbl93YWl0KSkgOworICBzZW1hX2luaXQoJmpvdXJuYWwtPmpfbG9jaywgMSk7CisgIHNlbWFfaW5pdCgmam91cm5hbC0+al9mbHVzaF9zZW0sIDEpOworCisgIGpvdXJuYWwtPmpfdHJhbnNfaWQgPSAxMCA7CisgIGpvdXJuYWwtPmpfbW91bnRfaWQgPSAxMCA7CisgIGpvdXJuYWwtPmpfc3RhdGUgPSAwIDsKKyAgYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfamxvY2spLCAwKSA7CisgIGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0ID0gYWxsb2NhdGVfY25vZGVzKG51bV9jbm9kZXMpIDsKKyAgam91cm5hbC0+al9jbm9kZV9mcmVlX29yaWcgPSBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCA7CisgIGpvdXJuYWwtPmpfY25vZGVfZnJlZSA9IGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0ID8gbnVtX2Nub2RlcyA6IDAgOworICBqb3VybmFsLT5qX2Nub2RlX3VzZWQgPSAwIDsKKyAgam91cm5hbC0+al9tdXN0X3dhaXQgPSAwIDsKKworICBpbml0X2pvdXJuYWxfaGFzaChwX3Nfc2IpIDsKKyAgamwgPSBqb3VybmFsLT5qX2N1cnJlbnRfamw7CisgIGpsLT5qX2xpc3RfYml0bWFwID0gZ2V0X2xpc3RfYml0bWFwKHBfc19zYiwgamwpOworICBpZiAoIWpsLT5qX2xpc3RfYml0bWFwKSB7CisgICAgcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsICJqb3VybmFsLTIwMDUsIGdldF9saXN0X2JpdG1hcCBmYWlsZWQgZm9yIGpvdXJuYWwgbGlzdCAwIikgOworICAgIGdvdG8gZnJlZV9hbmRfcmV0dXJuOworICB9CisgIGlmIChqb3VybmFsX3JlYWQocF9zX3NiKSA8IDApIHsKKyAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgIlJlcGxheSBGYWlsdXJlLCB1bmFibGUgdG8gbW91bnQiKSA7CisgICAgZ290byBmcmVlX2FuZF9yZXR1cm47CisgIH0KKworICByZWlzZXJmc19tb3VudGVkX2ZzX2NvdW50KysgOworICBpZiAocmVpc2VyZnNfbW91bnRlZF9mc19jb3VudCA8PSAxKQorICAgIGNvbW1pdF93cSA9IGNyZWF0ZV93b3JrcXVldWUoInJlaXNlcmZzIik7CisKKyAgSU5JVF9XT1JLKCZqb3VybmFsLT5qX3dvcmssIGZsdXNoX2FzeW5jX2NvbW1pdHMsIHBfc19zYik7CisgIHJldHVybiAwIDsKK2ZyZWVfYW5kX3JldHVybjoKKyAgZnJlZV9qb3VybmFsX3JhbShwX3Nfc2IpOworICByZXR1cm4gMTsKK30KKworLyoKKyoqIHRlc3QgZm9yIGEgcG9saXRlIGVuZCBvZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIFVzZWQgYnkgZmlsZV93cml0ZSwgYW5kIHNob3VsZAorKiogYmUgdXNlZCBieSBkZWxldGUgdG8gbWFrZSBzdXJlIHRoZXkgZG9uJ3Qgd3JpdGUgbW9yZSB0aGFuIGNhbiBmaXQgaW5zaWRlIGEgc2luZ2xlCisqKiB0cmFuc2FjdGlvbgorKi8KK2ludCBqb3VybmFsX3RyYW5zYWN0aW9uX3Nob3VsZF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIGludCBuZXdfYWxsb2MpIHsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMICh0aC0+dF9zdXBlcik7CisgIHRpbWVfdCBub3cgPSBnZXRfc2Vjb25kcygpIDsKKyAgLyogY2Fubm90IHJlc3RhcnQgd2hpbGUgbmVzdGVkICovCisgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKyAgaWYgKHRoLT50X3JlZmNvdW50ID4gMSkKKyAgICByZXR1cm4gMCA7CisgIGlmICggam91cm5hbC0+al9tdXN0X3dhaXQgPiAwIHx8CisgICAgICAgKGpvdXJuYWwtPmpfbGVuX2FsbG9jICsgbmV3X2FsbG9jKSA+PSBqb3VybmFsLT5qX21heF9iYXRjaCB8fAorICAgICAgIGF0b21pY19yZWFkKCYoam91cm5hbC0+al9qbG9jaykpIHx8CisgICAgICAobm93IC0gam91cm5hbC0+al90cmFuc19zdGFydF90aW1lKSA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSB8fAorICAgICAgIGpvdXJuYWwtPmpfY25vZGVfZnJlZSA8IChqb3VybmFsLT5qX3RyYW5zX21heCAqIDMpKSB7CisgICAgcmV0dXJuIDEgOworICB9CisgIHJldHVybiAwIDsKK30KKworLyogdGhpcyBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgYSB0cmFuc2FjdGlvbiwgYW5kIHJlcXVpcmVzIHRoZSAKKyoqIGtlcm5lbF9sb2NrIHRvIGJlIGhlbGQKKyovCit2b2lkIHJlaXNlcmZzX2Jsb2NrX3dyaXRlcyhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCkgeworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAodGgtPnRfc3VwZXIpOworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKyAgICBqb3VybmFsLT5qX211c3Rfd2FpdCA9IDEgOworICAgIHNldF9iaXQoSl9XUklURVJTX0JMT0NLRUQsICZqb3VybmFsLT5qX3N0YXRlKSA7CisgICAgcmV0dXJuIDsKK30KKworLyogdGhpcyBtdXN0IGJlIGNhbGxlZCB3aXRob3V0IGEgdHJhbnNhY3Rpb24gc3RhcnRlZCwgYW5kIGRvZXMgbm90CisqKiByZXF1aXJlIEJLTAorKi8KK3ZvaWQgcmVpc2VyZnNfYWxsb3dfd3JpdGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykgeworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocyk7CisgICAgY2xlYXJfYml0KEpfV1JJVEVSU19CTE9DS0VELCAmam91cm5hbC0+al9zdGF0ZSkgOworICAgIHdha2VfdXAoJmpvdXJuYWwtPmpfam9pbl93YWl0KSA7Cit9CisKKy8qIHRoaXMgbXVzdCBiZSBjYWxsZWQgd2l0aG91dCBhIHRyYW5zYWN0aW9uIHN0YXJ0ZWQsIGFuZCBkb2VzIG5vdAorKiogcmVxdWlyZSBCS0wKKyovCit2b2lkIHJlaXNlcmZzX3dhaXRfb25fd3JpdGVfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzKSB7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKKyAgICB3YWl0X2V2ZW50KGpvdXJuYWwtPmpfam9pbl93YWl0LAorICAgICAgICAgICAgICAgIXRlc3RfYml0KEpfV1JJVEVSU19CTE9DS0VELCAmam91cm5hbC0+al9zdGF0ZSkpIDsKK30KKworc3RhdGljIHZvaWQgcXVldWVfbG9nX3dyaXRlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKKyAgICB3YWl0X3F1ZXVlX3Qgd2FpdDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOworICAgIHNldF9iaXQoSl9XUklURVJTX1FVRVVFRCwgJmpvdXJuYWwtPmpfc3RhdGUpOworCisgICAgLyoKKyAgICAgKiB3ZSBkb24ndCB3YW50IHRvIHVzZSB3YWl0X2V2ZW50IGhlcmUgYmVjYXVzZQorICAgICAqIHdlIG9ubHkgd2FudCB0byB3YWl0IG9uY2UuCisgICAgICovCisgICAgaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOworICAgIGFkZF93YWl0X3F1ZXVlKCZqb3VybmFsLT5qX2pvaW5fd2FpdCwgJndhaXQpOworICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKyAgICBpZiAodGVzdF9iaXQoSl9XUklURVJTX1FVRVVFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKQorICAgICAgICBzY2hlZHVsZSgpOworICAgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZqb3VybmFsLT5qX2pvaW5fd2FpdCwgJndhaXQpOworfQorCitzdGF0aWMgdm9pZCB3YWtlX3F1ZXVlZF93cml0ZXJzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykgeworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocyk7CisgICAgaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChKX1dSSVRFUlNfUVVFVUVELCAmam91cm5hbC0+al9zdGF0ZSkpCisgICAgICAgIHdha2VfdXAoJmpvdXJuYWwtPmpfam9pbl93YWl0KTsKK30KKworc3RhdGljIHZvaWQgbGV0X3RyYW5zYWN0aW9uX2dyb3coc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzYik7CisgICAgdW5zaWduZWQgbG9uZyBiY291bnQgPSBqb3VybmFsLT5qX2Jjb3VudDsKKyAgICB3aGlsZSgxKSB7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJam91cm5hbC0+al9jdXJyZW50X2psLT5qX3N0YXRlIHw9IExJU1RfQ09NTUlUX1BFTkRJTkc7CisgICAgICAgIHdoaWxlICgoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfd2NvdW50KSA+IDAgfHwKKwkgICAgICAgIGF0b21pY19yZWFkKCZqb3VybmFsLT5qX2psb2NrKSkgJiYKKwkgICAgICAgam91cm5hbC0+al90cmFuc19pZCA9PSB0cmFuc19pZCkgeworCSAgICBxdWV1ZV9sb2dfd3JpdGVyKHNiKTsKKwl9CisJaWYgKGpvdXJuYWwtPmpfdHJhbnNfaWQgIT0gdHJhbnNfaWQpCisJICAgIGJyZWFrOworCWlmIChiY291bnQgPT0gam91cm5hbC0+al9iY291bnQpCisJICAgIGJyZWFrOworCWJjb3VudCA9IGpvdXJuYWwtPmpfYmNvdW50OworICAgIH0KK30KKworLyogam9pbiA9PSB0cnVlIGlmIHlvdSBtdXN0IGpvaW4gYW4gZXhpc3RpbmcgdHJhbnNhY3Rpb24uCisqKiBqb2luID09IGZhbHNlIGlmIHlvdSBjYW4gZGVhbCB3aXRoIHdhaXRpbmcgZm9yIG90aGVycyB0byBmaW5pc2gKKyoqCisqKiB0aGlzIHdpbGwgYmxvY2sgdW50aWwgdGhlIHRyYW5zYWN0aW9uIGlzIGpvaW5hYmxlLiAgc2VuZCB0aGUgbnVtYmVyIG9mIGJsb2NrcyB5b3UKKyoqIGV4cGVjdCB0byB1c2UgaW4gbmJsb2Nrcy4KKyovCitzdGF0aWMgaW50IGRvX2pvdXJuYWxfYmVnaW5fcihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICogcF9zX3NiLHVuc2lnbmVkIGxvbmcgbmJsb2NrcyxpbnQgam9pbikgeworICB0aW1lX3Qgbm93ID0gZ2V0X3NlY29uZHMoKSA7CisgIGludCBvbGRfdHJhbnNfaWQgIDsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgbXl0aDsKKyAgaW50IHNjaGVkX2NvdW50ID0gMDsKKyAgaW50IHJldHZhbDsKKworICByZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHBfc19zYiwgImpvdXJuYWxfYmVnaW4iKSA7CisKKyAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBqb3VybmFsLmpvdXJuYWxfYmVpbmcgKTsKKyAgLyogc2V0IGhlcmUgZm9yIGpvdXJuYWxfam9pbiAqLworICB0aC0+dF9yZWZjb3VudCA9IDE7CisgIHRoLT50X3N1cGVyID0gcF9zX3NiIDsKKworcmVsb2NrOgorICBsb2NrX2pvdXJuYWwocF9zX3NiKSA7CisgIGlmIChqb2luICE9IEpCRUdJTl9BQk9SVCAmJiByZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQgKGpvdXJuYWwpKSB7CisgICAgdW5sb2NrX2pvdXJuYWwgKHBfc19zYik7CisgICAgcmV0dmFsID0gam91cm5hbC0+al9lcnJubzsKKyAgICBnb3RvIG91dF9mYWlsOworICB9CisgIGpvdXJuYWwtPmpfYmNvdW50Kys7CisKKyAgaWYgKHRlc3RfYml0KEpfV1JJVEVSU19CTE9DS0VELCAmam91cm5hbC0+al9zdGF0ZSkpIHsKKyAgICB1bmxvY2tfam91cm5hbChwX3Nfc2IpIDsKKyAgICByZWlzZXJmc193YWl0X29uX3dyaXRlX2Jsb2NrKHBfc19zYikgOworICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgam91cm5hbC5qb3VybmFsX3JlbG9ja193cml0ZXJzICk7CisgICAgZ290byByZWxvY2sgOworICB9CisgIG5vdyA9IGdldF9zZWNvbmRzKCk7CisKKyAgLyogaWYgdGhlcmUgaXMgbm8gcm9vbSBpbiB0aGUgam91cm5hbCBPUgorICAqKiBpZiB0aGlzIHRyYW5zYWN0aW9uIGlzIHRvbyBvbGQsIGFuZCB3ZSB3ZXJlbid0IGNhbGxlZCBqb2luYWJsZSwgd2FpdCBmb3IgaXQgdG8gZmluaXNoIGJlZm9yZSBiZWdpbm5pbmcgCisgICoqIHdlIGRvbid0IHNsZWVwIGlmIHRoZXJlIGFyZW4ndCBvdGhlciB3cml0ZXJzCisgICovCisKKyAgaWYgKCAoIWpvaW4gJiYgam91cm5hbC0+al9tdXN0X3dhaXQgPiAwKSB8fAorICAgICAoICFqb2luICYmIChqb3VybmFsLT5qX2xlbl9hbGxvYyArIG5ibG9ja3MgKyAyKSA+PSBqb3VybmFsLT5qX21heF9iYXRjaCkgfHwKKyAgICAgKCFqb2luICYmIGF0b21pY19yZWFkKCZqb3VybmFsLT5qX3djb3VudCkgPiAwICYmIGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA+IDAgJiYKKyAgICAgIChub3cgLSBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUpID4gam91cm5hbC0+al9tYXhfdHJhbnNfYWdlKSB8fAorICAgICAoIWpvaW4gJiYgYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfamxvY2spKSB8fAorICAgICAoIWpvaW4gJiYgam91cm5hbC0+al9jbm9kZV9mcmVlIDwgKGpvdXJuYWwtPmpfdHJhbnNfbWF4ICogMykpKSB7CisKKyAgICBvbGRfdHJhbnNfaWQgPSBqb3VybmFsLT5qX3RyYW5zX2lkOworICAgIHVubG9ja19qb3VybmFsKHBfc19zYikgOyAvKiBhbGxvdyBvdGhlcnMgdG8gZmluaXNoIHRoaXMgdHJhbnNhY3Rpb24gKi8KKworICAgIGlmICgham9pbiAmJiAoam91cm5hbC0+al9sZW5fYWxsb2MgKyBuYmxvY2tzICsgMikgPj0KKyAgICAgICAgam91cm5hbC0+al9tYXhfYmF0Y2ggJiYKKwkoKGpvdXJuYWwtPmpfbGVuICsgbmJsb2NrcyArIDIpICogMTAwKSA8IChqb3VybmFsLT5qX2xlbl9hbGxvYyAqIDc1KSkKKyAgICB7CisJaWYgKGF0b21pY19yZWFkKCZqb3VybmFsLT5qX3djb3VudCkgPiAxMCkgeworCSAgICBzY2hlZF9jb3VudCsrOworCSAgICBxdWV1ZV9sb2dfd3JpdGVyKHBfc19zYik7CisJICAgIGdvdG8gcmVsb2NrOworCX0KKyAgICB9CisgICAgLyogZG9uJ3QgbWVzcyB3aXRoIGpvaW5pbmcgdGhlIHRyYW5zYWN0aW9uIGlmIGFsbCB3ZSBoYXZlIHRvIGRvIGlzCisgICAgICogd2FpdCBmb3Igc29tZW9uZSBlbHNlIHRvIGRvIGEgY29tbWl0CisgICAgICovCisgICAgaWYgKGF0b21pY19yZWFkKCZqb3VybmFsLT5qX2psb2NrKSkgeworCXdoaWxlIChqb3VybmFsLT5qX3RyYW5zX2lkID09IG9sZF90cmFuc19pZCAmJgorCSAgICAgICBhdG9taWNfcmVhZCgmam91cm5hbC0+al9qbG9jaykpIHsKKwkgICAgcXVldWVfbG9nX3dyaXRlcihwX3Nfc2IpOworICAgICAgICB9CisJZ290byByZWxvY2s7CisgICAgfQorICAgIHJldHZhbCA9IGpvdXJuYWxfam9pbigmbXl0aCwgcF9zX3NiLCAxKSA7CisgICAgaWYgKHJldHZhbCkKKyAgICAgICAgZ290byBvdXRfZmFpbDsKKworICAgIC8qIHNvbWVvbmUgbWlnaHQgaGF2ZSBlbmRlZCB0aGUgdHJhbnNhY3Rpb24gd2hpbGUgd2Ugam9pbmVkICovCisgICAgaWYgKG9sZF90cmFuc19pZCAhPSBqb3VybmFsLT5qX3RyYW5zX2lkKSB7CisgICAgICAgIHJldHZhbCA9IGRvX2pvdXJuYWxfZW5kKCZteXRoLCBwX3Nfc2IsIDEsIDApIDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR2YWwgPSBkb19qb3VybmFsX2VuZCgmbXl0aCwgcF9zX3NiLCAxLCBDT01NSVRfTk9XKSA7CisgICAgfQorCisgICAgaWYgKHJldHZhbCkKKyAgICAgICAgZ290byBvdXRfZmFpbDsKKworICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgam91cm5hbC5qb3VybmFsX3JlbG9ja193Y291bnQgKTsKKyAgICBnb3RvIHJlbG9jayA7CisgIH0KKyAgLyogd2UgYXJlIHRoZSBmaXJzdCB3cml0ZXIsIHNldCB0cmFuc19pZCAqLworICBpZiAoam91cm5hbC0+al90cmFuc19zdGFydF90aW1lID09IDApIHsKKyAgICBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPSBnZXRfc2Vjb25kcygpOworICB9CisgIGF0b21pY19pbmMoJihqb3VybmFsLT5qX3djb3VudCkpIDsKKyAgam91cm5hbC0+al9sZW5fYWxsb2MgKz0gbmJsb2NrcyA7CisgIHRoLT50X2Jsb2Nrc19sb2dnZWQgPSAwIDsKKyAgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCA9IG5ibG9ja3MgOworICB0aC0+dF90cmFuc19pZCA9IGpvdXJuYWwtPmpfdHJhbnNfaWQgOworICB1bmxvY2tfam91cm5hbChwX3Nfc2IpIDsKKyAgSU5JVF9MSVNUX0hFQUQgKCZ0aC0+dF9saXN0KTsKKyAgcmV0dXJuIDAgOworCitvdXRfZmFpbDoKKyAgbWVtc2V0ICh0aCwgMCwgc2l6ZW9mICgqdGgpKTsKKyAgLyogUmUtc2V0IHRoLT50X3N1cGVyLCBzbyB3ZSBjYW4gcHJvcGVybHkga2VlcCB0cmFjayBvZiBob3cgbWFueQorICAgKiBwZXJzaXN0ZW50IHRyYW5zYWN0aW9ucyB0aGVyZSBhcmUuIFdlIG5lZWQgdG8gZG8gdGhpcyBzbyBpZiB0aGlzCisgICAqIGNhbGwgaXMgcGFydCBvZiBhIGZhaWxlZCByZXN0YXJ0X3RyYW5zYWN0aW9uLCB3ZSBjYW4gZnJlZSBpdCBsYXRlciAqLworICB0aC0+dF9zdXBlciA9IHBfc19zYjsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqCityZWlzZXJmc19wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgaW50IG5ibG9ja3MpIHsKKyAgICBpbnQgcmV0IDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCA7CisKKyAgICAvKiBpZiB3ZSdyZSBuZXN0aW5nIGludG8gYW4gZXhpc3RpbmcgdHJhbnNhY3Rpb24uICBJdCB3aWxsIGJlCisgICAgKiogcGVyc2lzdGVudCBvbiBpdHMgb3duCisgICAgKi8KKyAgICBpZiAocmVpc2VyZnNfdHJhbnNhY3Rpb25fcnVubmluZyhzKSkgeworICAgICAgICB0aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA7CisJdGgtPnRfcmVmY291bnQrKyA7CisJaWYgKHRoLT50X3JlZmNvdW50IDwgMikgeworCSAgICBCVUcoKSA7CisJfQorCXJldHVybiB0aCA7CisgICAgfQorICAgIHRoID0gcmVpc2VyZnNfa21hbGxvYyhzaXplb2Yoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSksIEdGUF9OT0ZTLCBzKSA7CisgICAgaWYgKCF0aCkKKyAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXQgPSBqb3VybmFsX2JlZ2luKHRoLCBzLCBuYmxvY2tzKSA7CisgICAgaWYgKHJldCkgeworCXJlaXNlcmZzX2tmcmVlKHRoLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSksIHMpIDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgU0JfSk9VUk5BTChzKS0+al9wZXJzaXN0ZW50X3RyYW5zKys7CisgICAgcmV0dXJuIHRoIDsKK30KKworaW50CityZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCkgeworICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IHRoLT50X3N1cGVyOworICAgIGludCByZXQgPSAwOworICAgIGlmICh0aC0+dF90cmFuc19pZCkKKyAgICAgICAgcmV0ID0gam91cm5hbF9lbmQodGgsIHRoLT50X3N1cGVyLCB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKTsKKyAgICBlbHNlCisgICAgICAgIHJldCA9IC1FSU87CisgICAgaWYgKHRoLT50X3JlZmNvdW50ID09IDApIHsKKyAgICAgICAgU0JfSk9VUk5BTChzKS0+al9wZXJzaXN0ZW50X3RyYW5zLS07CisJcmVpc2VyZnNfa2ZyZWUodGgsIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlKSwgcykgOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGpvdXJuYWxfam9pbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgbmJsb2NrcykgeworICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICpjdXJfdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm87CisKKyAgLyogdGhpcyBrZWVwcyBkb19qb3VybmFsX2VuZCBmcm9tIE5VTExpbmcgb3V0IHRoZSBjdXJyZW50LT5qb3VybmFsX2luZm8KKyAgKiogcG9pbnRlcgorICAqLworICB0aC0+dF9oYW5kbGVfc2F2ZSA9IGN1cl90aCA7CisgIGlmIChjdXJfdGggJiYgY3VyX3RoLT50X3JlZmNvdW50ID4gMSkgeworICAgICAgQlVHKCkgOworICB9CisgIHJldHVybiBkb19qb3VybmFsX2JlZ2luX3IodGgsIHBfc19zYiwgbmJsb2NrcywgSkJFR0lOX0pPSU4pIDsKK30KKworaW50IGpvdXJuYWxfam9pbl9hYm9ydChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgbmJsb2NrcykgeworICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICpjdXJfdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm87CisKKyAgLyogdGhpcyBrZWVwcyBkb19qb3VybmFsX2VuZCBmcm9tIE5VTExpbmcgb3V0IHRoZSBjdXJyZW50LT5qb3VybmFsX2luZm8KKyAgKiogcG9pbnRlcgorICAqLworICB0aC0+dF9oYW5kbGVfc2F2ZSA9IGN1cl90aCA7CisgIGlmIChjdXJfdGggJiYgY3VyX3RoLT50X3JlZmNvdW50ID4gMSkgeworICAgICAgQlVHKCkgOworICB9CisgIHJldHVybiBkb19qb3VybmFsX2JlZ2luX3IodGgsIHBfc19zYiwgbmJsb2NrcywgSkJFR0lOX0FCT1JUKSA7Cit9CisKK2ludCBqb3VybmFsX2JlZ2luKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpIHsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICpjdXJfdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm8gOworICAgIGludCByZXQgOworCisgICAgdGgtPnRfaGFuZGxlX3NhdmUgPSBOVUxMIDsKKyAgICBpZiAoY3VyX3RoKSB7CisJLyogd2UgYXJlIG5lc3RpbmcgaW50byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiAqLworCWlmIChjdXJfdGgtPnRfc3VwZXIgPT0gcF9zX3NiKSB7CisgICAgICAgICAgICAgIEJVR19PTiAoIWN1cl90aC0+dF9yZWZjb3VudCk7CisJICAgICAgY3VyX3RoLT50X3JlZmNvdW50KysgOworCSAgICAgIG1lbWNweSh0aCwgY3VyX3RoLCBzaXplb2YoKnRoKSk7CisJICAgICAgaWYgKHRoLT50X3JlZmNvdW50IDw9IDEpCisJCSAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgIkJBRDogcmVmY291bnQgPD0gMSwgYnV0IGpvdXJuYWxfaW5mbyAhPSAwIik7CisJICAgICAgcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkgICAgLyogd2UndmUgZW5kZWQgdXAgd2l0aCBhIGhhbmRsZSBmcm9tIGEgZGlmZmVyZW50IGZpbGVzeXN0ZW0uCisJICAgICoqIHNhdmUgaXQgYW5kIHJlc3RvcmUgb24gam91cm5hbF9lbmQuICBUaGlzIHNob3VsZCBuZXZlcgorCSAgICAqKiByZWFsbHkgaGFwcGVuLi4uCisJICAgICovCisJICAgIHJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiY2xtLTIxMDA6IG5lc3RpbmcgaW5mbyBhIGRpZmZlcmVudCBGUyIpIDsKKwkgICAgdGgtPnRfaGFuZGxlX3NhdmUgPSBjdXJyZW50LT5qb3VybmFsX2luZm8gOworCSAgICBjdXJyZW50LT5qb3VybmFsX2luZm8gPSB0aDsKKwl9CisgICAgfSBlbHNlIHsKKwljdXJyZW50LT5qb3VybmFsX2luZm8gPSB0aDsKKyAgICB9CisgICAgcmV0ID0gZG9fam91cm5hbF9iZWdpbl9yKHRoLCBwX3Nfc2IsIG5ibG9ja3MsIEpCRUdJTl9SRUcpIDsKKyAgICBpZiAoY3VycmVudC0+am91cm5hbF9pbmZvICE9IHRoKQorICAgICAgICBCVUcoKSA7CisKKyAgICAvKiBJIGd1ZXNzIHRoaXMgYm9pbHMgZG93biB0byBiZWluZyB0aGUgcmVjaXByb2NhbCBvZiBjbG0tMjEwMCBhYm92ZS4KKyAgICAgKiBJZiBkb19qb3VybmFsX2JlZ2luX3IgZmFpbHMsIHdlIG5lZWQgdG8gcHV0IGl0IGJhY2ssIHNpbmNlIGpvdXJuYWxfZW5kCisgICAgICogd29uJ3QgYmUgY2FsbGVkIHRvIGRvIGl0LiAqLworICAgIGlmIChyZXQpCisgICAgICAgIGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoLT50X2hhbmRsZV9zYXZlOworICAgIGVsc2UKKyAgICAgICAgQlVHX09OICghdGgtPnRfcmVmY291bnQpOworCisgICAgcmV0dXJuIHJldCA7Cit9CisKKy8qCisqKiBwdXRzIGJoIGludG8gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uICBJZiBpdCB3YXMgYWxyZWFkeSB0aGVyZSwgcmVvcmRlcnMgcmVtb3ZlcyB0aGUKKyoqIG9sZCBwb2ludGVycyBmcm9tIHRoZSBoYXNoLCBhbmQgcHV0cyBuZXcgb25lcyBpbiAodG8gbWFrZSBzdXJlIHJlcGxheSBoYXBwZW4gaW4gdGhlIHJpZ2h0IG9yZGVyKS4KKyoqCisqKiBpZiBpdCB3YXMgZGlydHksIGNsZWFucyBhbmQgZmlsZXMgb250byB0aGUgY2xlYW4gbGlzdC4gIEkgY2FuJ3QgbGV0IGl0IGJlIGRpcnR5IGFnYWluIHVudGlsIHRoZQorKiogdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkLgorKiogCisqKiBpZiBqX2xlbiwgaXMgYmlnZ2VyIHRoYW4gal9sZW5fYWxsb2MsIGl0IHB1c2hlcyBqX2xlbl9hbGxvYyB0byAxMCArIGpfbGVuLgorKi8KK2ludCBqb3VybmFsX21hcmtfZGlydHkoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuID0gTlVMTDsKKyAgaW50IGNvdW50X2FscmVhZHlfaW5jZCA9IDAgOworICBpbnQgcHJlcGFyZWQgPSAwIDsKKyAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCisgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgam91cm5hbC5tYXJrX2RpcnR5ICk7CisgIGlmICh0aC0+dF90cmFuc19pZCAhPSBqb3VybmFsLT5qX3RyYW5zX2lkKSB7CisgICAgcmVpc2VyZnNfcGFuaWModGgtPnRfc3VwZXIsICJqb3VybmFsLTE1Nzc6IGhhbmRsZSB0cmFucyBpZCAlbGQgIT0gY3VycmVudCB0cmFucyBpZCAlbGRcbiIsIAorICAgICAgICAgICAgICAgICAgIHRoLT50X3RyYW5zX2lkLCBqb3VybmFsLT5qX3RyYW5zX2lkKTsKKyAgfQorCisgIHBfc19zYi0+c19kaXJ0ID0gMTsKKworICBwcmVwYXJlZCA9IHRlc3RfY2xlYXJfYnVmZmVyX2pvdXJuYWxfcHJlcGFyZWQgKGJoKTsKKyAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfcmVzdG9yZV9kaXJ0eSAoYmgpOworICAvKiBhbHJlYWR5IGluIHRoaXMgdHJhbnNhY3Rpb24sIHdlIGFyZSBkb25lICovCisgIGlmIChidWZmZXJfam91cm5hbGVkKGJoKSkgeworICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgam91cm5hbC5tYXJrX2RpcnR5X2FscmVhZHkgKTsKKyAgICByZXR1cm4gMCA7CisgIH0KKworICAvKiB0aGlzIG11c3QgYmUgdHVybmVkIGludG8gYSBwYW5pYyBpbnN0ZWFkIG9mIGEgd2FybmluZy4gIFdlIGNhbid0IGFsbG93CisgICoqIGEgZGlydHkgb3Igam91cm5hbF9kaXJ0eSBvciBsb2NrZWQgYnVmZmVyIHRvIGJlIGxvZ2dlZCwgYXMgc29tZSBjaGFuZ2VzCisgICoqIGNvdWxkIGdldCB0byBkaXNrIHRvbyBlYXJseS4gIE5PVCBHT09ELgorICAqLworICBpZiAoIXByZXBhcmVkIHx8IGJ1ZmZlcl9kaXJ0eShiaCkpIHsKKyAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJqb3VybmFsLTE3Nzc6IGJ1ZmZlciAlbGx1IGJhZCBzdGF0ZSAiCisJCSAgICAgICIlY1BSRVBBUkVEICVjTE9DS0VEICVjRElSVFkgJWNKRElSVFlfV0FJVCIsCisJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwgcHJlcGFyZWQgPyAnICcgOiAnIScsCisJCQkgICAgYnVmZmVyX2xvY2tlZChiaCkgPyAnICcgOiAnIScsCisJCQkgICAgYnVmZmVyX2RpcnR5KGJoKSA/ICcgJyA6ICchJywKKwkJCSAgICBidWZmZXJfam91cm5hbF9kaXJ0eShiaCkgPyAnICcgOiAnIScpIDsKKyAgfQorCisgIGlmIChhdG9taWNfcmVhZCgmKGpvdXJuYWwtPmpfd2NvdW50KSkgPD0gMCkgeworICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtMTQwOTogam91cm5hbF9tYXJrX2RpcnR5IHJldHVybmluZyBiZWNhdXNlIGpfd2NvdW50IHdhcyAlZCIsIGF0b21pY19yZWFkKCYoam91cm5hbC0+al93Y291bnQpKSkgOworICAgIHJldHVybiAxIDsKKyAgfQorICAvKiB0aGlzIGVycm9yIG1lYW5zIEkndmUgc2NyZXdlZCB1cCwgYW5kIHdlJ3ZlIG92ZXJmbG93ZWQgdGhlIHRyYW5zYWN0aW9uLiAgCisgICoqIE5vdGhpbmcgY2FuIGJlIGRvbmUgaGVyZSwgZXhjZXB0IG1ha2UgdGhlIEZTIHJlYWRvbmx5IG9yIHBhbmljLgorICAqLyAKKyAgaWYgKGpvdXJuYWwtPmpfbGVuID49IGpvdXJuYWwtPmpfdHJhbnNfbWF4KSB7CisgICAgcmVpc2VyZnNfcGFuaWModGgtPnRfc3VwZXIsICJqb3VybmFsLTE0MTM6IGpvdXJuYWxfbWFya19kaXJ0eTogal9sZW4gKCVsdSkgaXMgdG9vIGJpZ1xuIiwgam91cm5hbC0+al9sZW4pIDsKKyAgfQorCisgIGlmIChidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpIHsKKyAgICBjb3VudF9hbHJlYWR5X2luY2QgPSAxIDsKKyAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwubWFya19kaXJ0eV9ub3Rqb3VybmFsICk7CisgICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkgKGJoKTsKKyAgfQorCisgIGlmIChqb3VybmFsLT5qX2xlbiA+IGpvdXJuYWwtPmpfbGVuX2FsbG9jKSB7CisgICAgam91cm5hbC0+al9sZW5fYWxsb2MgPSBqb3VybmFsLT5qX2xlbiArIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UIDsKKyAgfQorCisgIHNldF9idWZmZXJfam91cm5hbGVkIChiaCk7CisKKyAgLyogbm93IHB1dCB0aGlzIGd1eSBvbiB0aGUgZW5kICovCisgIGlmICghY24pIHsKKyAgICBjbiA9IGdldF9jbm9kZShwX3Nfc2IpIDsKKyAgICBpZiAoIWNuKSB7CisgICAgICByZWlzZXJmc19wYW5pYyhwX3Nfc2IsICJnZXRfY25vZGUgZmFpbGVkIVxuIik7IAorICAgIH0KKworICAgIGlmICh0aC0+dF9ibG9ja3NfbG9nZ2VkID09IHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpIHsKKyAgICAgIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQgKz0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgOworICAgICAgam91cm5hbC0+al9sZW5fYWxsb2MgKz0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgOworICAgIH0KKyAgICB0aC0+dF9ibG9ja3NfbG9nZ2VkKysgOworICAgIGpvdXJuYWwtPmpfbGVuKysgOworCisgICAgY24tPmJoID0gYmggOworICAgIGNuLT5ibG9ja25yID0gYmgtPmJfYmxvY2tuciA7CisgICAgY24tPnNiID0gcF9zX3NiOworICAgIGNuLT5qbGlzdCA9IE5VTEwgOworICAgIGluc2VydF9qb3VybmFsX2hhc2goam91cm5hbC0+al9oYXNoX3RhYmxlLCBjbikgOworICAgIGlmICghY291bnRfYWxyZWFkeV9pbmNkKSB7CisgICAgICBnZXRfYmgoYmgpIDsKKyAgICB9CisgIH0KKyAgY24tPm5leHQgPSBOVUxMIDsKKyAgY24tPnByZXYgPSBqb3VybmFsLT5qX2xhc3QgOworICBjbi0+YmggPSBiaCA7CisgIGlmIChqb3VybmFsLT5qX2xhc3QpIHsKKyAgICBqb3VybmFsLT5qX2xhc3QtPm5leHQgPSBjbiA7CisgICAgam91cm5hbC0+al9sYXN0ID0gY24gOworICB9IGVsc2UgeworICAgIGpvdXJuYWwtPmpfZmlyc3QgPSBjbiA7CisgICAgam91cm5hbC0+al9sYXN0ID0gY24gOworICB9CisgIHJldHVybiAwIDsKK30KKworaW50IGpvdXJuYWxfZW5kKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBuYmxvY2tzKSB7CisgIGlmICghY3VycmVudC0+am91cm5hbF9pbmZvICYmIHRoLT50X3JlZmNvdW50ID4gMSkKKyAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJSRUlTRVItTkVTVElORzogdGggTlVMTCwgcmVmY291bnQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIHRoLT50X3JlZmNvdW50KTsKKworICBpZiAoIXRoLT50X3RyYW5zX2lkKSB7CisgICAgV0FSTl9PTiAoMSk7CisgICAgcmV0dXJuIC1FSU87CisgIH0KKworICB0aC0+dF9yZWZjb3VudC0tOworICBpZiAodGgtPnRfcmVmY291bnQgPiAwKSB7CisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqY3VyX3RoID0gY3VycmVudC0+am91cm5hbF9pbmZvIDsKKworICAgIC8qIHdlIGFyZW4ndCBhbGxvd2VkIHRvIGNsb3NlIGEgbmVzdGVkIHRyYW5zYWN0aW9uIG9uIGEgZGlmZmVyZW50CisgICAgKiogZmlsZXN5c3RlbSBmcm9tIHRoZSBvbmUgaW4gdGhlIHRhc2sgc3RydWN0CisgICAgKi8KKyAgICBpZiAoY3VyX3RoLT50X3N1cGVyICE9IHRoLT50X3N1cGVyKQorICAgICAgQlVHKCkgOworCisgICAgaWYgKHRoICE9IGN1cl90aCkgeworICAgICAgbWVtY3B5KGN1cnJlbnQtPmpvdXJuYWxfaW5mbywgdGgsIHNpemVvZigqdGgpKTsKKyAgICAgIHRoLT50X3RyYW5zX2lkID0gMDsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGRvX2pvdXJuYWxfZW5kKHRoLCBwX3Nfc2IsIG5ibG9ja3MsIDApIDsKKyAgfQorfQorCisvKiByZW1vdmVzIGZyb20gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24sIHJlbHNpbmcgYW5kIGRlc2NyZW1lbnRpbmcgYW55IGNvdW50ZXJzLiAgCisqKiBhbHNvIGZpbGVzIHRoZSByZW1vdmVkIGJ1ZmZlciBkaXJlY3RseSBvbnRvIHRoZSBjbGVhbiBsaXN0CisqKgorKiogY2FsbGVkIGJ5IGpvdXJuYWxfbWFya19mcmVlZCB3aGVuIGEgYmxvY2sgaGFzIGJlZW4gZGVsZXRlZAorKioKKyoqIHJldHVybnMgMSBpZiBpdCBjbGVhbmVkIGFuZCByZWxzZWQgdGhlIGJ1ZmZlci4gMCBvdGhlcndpc2UKKyovCitzdGF0aWMgaW50IHJlbW92ZV9mcm9tX3RyYW5zYWN0aW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBiX2Jsb2NrbnJfdCBibG9ja25yLCBpbnQgYWxyZWFkeV9jbGVhbmVkKSB7CisgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmggOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7CisgIGludCByZXQgPSAwOworCisgIGNuID0gZ2V0X2pvdXJuYWxfaGFzaF9kZXYocF9zX3NiLCBqb3VybmFsLT5qX2hhc2hfdGFibGUsIGJsb2NrbnIpIDsKKyAgaWYgKCFjbiB8fCAhY24tPmJoKSB7CisgICAgcmV0dXJuIHJldCA7CisgIH0KKyAgYmggPSBjbi0+YmggOworICBpZiAoY24tPnByZXYpIHsKKyAgICBjbi0+cHJldi0+bmV4dCA9IGNuLT5uZXh0IDsKKyAgfQorICBpZiAoY24tPm5leHQpIHsKKyAgICBjbi0+bmV4dC0+cHJldiA9IGNuLT5wcmV2IDsKKyAgfQorICBpZiAoY24gPT0gam91cm5hbC0+al9maXJzdCkgeworICAgIGpvdXJuYWwtPmpfZmlyc3QgPSBjbi0+bmV4dCA7CisgIH0KKyAgaWYgKGNuID09IGpvdXJuYWwtPmpfbGFzdCkgeworICAgIGpvdXJuYWwtPmpfbGFzdCA9IGNuLT5wcmV2IDsKKyAgfQorICBpZiAoYmgpCisJcmVtb3ZlX2pvdXJuYWxfaGFzaChwX3Nfc2IsIGpvdXJuYWwtPmpfaGFzaF90YWJsZSwgTlVMTCwgYmgtPmJfYmxvY2tuciwgMCkgOworICBjbGVhcl9idWZmZXJfam91cm5hbGVkICAoYmgpOyAvKiBkb24ndCBsb2cgdGhpcyBvbmUgKi8KKworICBpZiAoIWFscmVhZHlfY2xlYW5lZCkgeworICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX2RpcnR5IChiaCk7CisgICAgY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKyAgICBjbGVhcl9idWZmZXJfam91cm5hbF90ZXN0IChiaCk7CisgICAgcHV0X2JoKGJoKSA7CisgICAgaWYgKGF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSA8IDApIHsKKyAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtMTc1MjogcmVtb3ZlIGZyb20gdHJhbnMsIGJfY291bnQgPCAwIik7CisgICAgfQorICAgIHJldCA9IDEgOworICB9CisgIGpvdXJuYWwtPmpfbGVuLS0gOworICBqb3VybmFsLT5qX2xlbl9hbGxvYy0tIDsKKyAgZnJlZV9jbm9kZShwX3Nfc2IsIGNuKSA7CisgIHJldHVybiByZXQgOworfQorCisvKgorKiogZm9yIGFueSBjbm9kZSBpbiBhIGpvdXJuYWwgbGlzdCwgaXQgY2FuIG9ubHkgYmUgZGlydGllZCBvZiBhbGwgdGhlCisqKiB0cmFuc2FjdGlvbnMgdGhhdCBpbmNsdWRlIGl0IGFyZSBjb21taXRlZCB0byBkaXNrLgorKiogdGhpcyBjaGVja3MgdGhyb3VnaCBlYWNoIHRyYW5zYWN0aW9uLCBhbmQgcmV0dXJucyAxIGlmIHlvdSBhcmUgYWxsb3dlZCB0byBkaXJ0eSwKKyoqIGFuZCAwIGlmIHlvdSBhcmVuJ3QKKyoqCisqKiBpdCBpcyBjYWxsZWQgYnkgZGlydHlfam91cm5hbF9saXN0LCB3aGljaCBpcyBjYWxsZWQgYWZ0ZXIgZmx1c2hfY29tbWl0X2xpc3QgaGFzIGdvdHRlbiBhbGwgdGhlIGxvZworKiogYmxvY2tzIGZvciBhIGdpdmVuIHRyYW5zYWN0aW9uIG9uIGRpc2sKKyoqCisqLworc3RhdGljIGludCBjYW5fZGlydHkoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuKSB7CisgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBjbi0+c2I7CisgIGJfYmxvY2tucl90IGJsb2NrbnIgPSBjbi0+YmxvY2tuciAgOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY3VyID0gY24tPmhwcmV2IDsKKyAgaW50IGNhbl9kaXJ0eSA9IDEgOworICAKKyAgLyogZmlyc3QgdGVzdCBocHJldi4gIFRoZXNlIGFyZSBhbGwgbmV3ZXIgdGhhbiBjbiwgc28gYW55IG5vZGUgaGVyZQorICAqKiB3aXRoIHRoZSBzYW1lIGJsb2NrIG51bWJlciBhbmQgZGV2IG1lYW5zIHRoaXMgbm9kZSBjYW4ndCBiZSBzZW50CisgICoqIHRvIGRpc2sgcmlnaHQgbm93LgorICAqLworICB3aGlsZShjdXIgJiYgY2FuX2RpcnR5KSB7CisgICAgaWYgKGN1ci0+amxpc3QgJiYgY3VyLT5iaCAmJiBjdXItPmJsb2NrbnIgJiYgY3VyLT5zYiA9PSBzYiAmJiAKKyAgICAgICAgY3VyLT5ibG9ja25yID09IGJsb2NrbnIpIHsKKyAgICAgIGNhbl9kaXJ0eSA9IDAgOworICAgIH0KKyAgICBjdXIgPSBjdXItPmhwcmV2IDsKKyAgfQorICAvKiB0aGVuIHRlc3QgaG5leHQuICBUaGVzZSBhcmUgYWxsIG9sZGVyIHRoYW4gY24uICBBcyBsb25nIGFzIHRoZXkKKyAgKiogYXJlIGNvbW1pdHRlZCB0byB0aGUgbG9nLCBpdCBpcyBzYWZlIHRvIHdyaXRlIGNuIHRvIGRpc2sKKyAgKi8KKyAgY3VyID0gY24tPmhuZXh0IDsKKyAgd2hpbGUoY3VyICYmIGNhbl9kaXJ0eSkgeworICAgIGlmIChjdXItPmpsaXN0ICYmIGN1ci0+amxpc3QtPmpfbGVuID4gMCAmJiAKKyAgICAgICAgYXRvbWljX3JlYWQoJihjdXItPmpsaXN0LT5qX2NvbW1pdF9sZWZ0KSkgPiAwICYmIGN1ci0+YmggJiYgCisgICAgICAgIGN1ci0+YmxvY2tuciAmJiBjdXItPnNiID09IHNiICYmIGN1ci0+YmxvY2tuciA9PSBibG9ja25yKSB7CisgICAgICBjYW5fZGlydHkgPSAwIDsKKyAgICB9CisgICAgY3VyID0gY3VyLT5obmV4dCA7CisgIH0KKyAgcmV0dXJuIGNhbl9kaXJ0eSA7Cit9CisKKy8qIHN5bmNzIHRoZSBjb21taXQgYmxvY2tzLCBidXQgZG9lcyBub3QgZm9yY2UgdGhlIHJlYWwgYnVmZmVycyB0byBkaXNrCisqKiB3aWxsIHdhaXQgdW50aWwgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaXMgZG9uZS9jb21taXRlZCBiZWZvcmUgcmV0dXJuaW5nIAorKi8KK2ludCBqb3VybmFsX2VuZF9zeW5jKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBuYmxvY2tzKSB7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKKworICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisgIC8qIHlvdSBjYW4gc3luYyB3aGlsZSBuZXN0ZWQsIHZlcnksIHZlcnkgYmFkICovCisgIGlmICh0aC0+dF9yZWZjb3VudCA+IDEpIHsKKyAgICBCVUcoKSA7CisgIH0KKyAgaWYgKGpvdXJuYWwtPmpfbGVuID09IDApIHsKKyAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSwgMSkgOworICAgIGpvdXJuYWxfbWFya19kaXJ0eSh0aCwgcF9zX3NiLCBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpKSA7CisgIH0KKyAgcmV0dXJuIGRvX2pvdXJuYWxfZW5kKHRoLCBwX3Nfc2IsIG5ibG9ja3MsIENPTU1JVF9OT1cgfCBXQUlUKSA7Cit9CisKKy8qCisqKiB3cml0ZWJhY2sgdGhlIHBlbmRpbmcgYXN5bmMgY29tbWl0cyB0byBkaXNrCisqLworc3RhdGljIHZvaWQgZmx1c2hfYXN5bmNfY29tbWl0cyh2b2lkICpwKSB7CisgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiID0gcDsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKyAgc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisKKyAgbG9ja19rZXJuZWwoKTsKKyAgaWYgKCFsaXN0X2VtcHR5KCZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkpIHsKKyAgICAgIC8qIGxhc3QgZW50cnkgaXMgdGhlIHlvdW5nZXN0LCBjb21taXQgaXQgYW5kIHlvdSBnZXQgZXZlcnl0aGluZyAqLworICAgICAgZW50cnkgPSBqb3VybmFsLT5qX2pvdXJuYWxfbGlzdC5wcmV2OworICAgICAgamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnkpOworICAgICAgZmx1c2hfY29tbWl0X2xpc3QocF9zX3NiLCBqbCwgMSk7CisgIH0KKyAgdW5sb2NrX2tlcm5lbCgpOworICAvKgorICAgKiB0aGlzIGlzIGEgbGl0dGxlIHJhY2V5LCBidXQgdGhlcmUncyBubyBoYXJtIGluIG1pc3NpbmcKKyAgICogdGhlIGZpbGVtYXBfZmRhdGFfd3JpdGUKKyAgICovCisgIGlmICghYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpICYmICFyZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQgKGpvdXJuYWwpKSB7CisgICAgICBhdG9taWNfaW5jKCZqb3VybmFsLT5qX2FzeW5jX3Rocm90dGxlKTsKKyAgICAgIGZpbGVtYXBfZmRhdGF3cml0ZShwX3Nfc2ItPnNfYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZyk7CisgICAgICBhdG9taWNfZGVjKCZqb3VybmFsLT5qX2FzeW5jX3Rocm90dGxlKTsKKyAgfQorfQorCisvKgorKiogZmx1c2hlcyBhbnkgb2xkIHRyYW5zYWN0aW9ucyB0byBkaXNrCisqKiBlbmRzIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGlmIGl0IGlzIHRvbyBvbGQKKyovCitpbnQgcmVpc2VyZnNfZmx1c2hfb2xkX2NvbW1pdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKKyAgICB0aW1lX3Qgbm93IDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7CisKKyAgICBub3cgPSBnZXRfc2Vjb25kcygpOworICAgIC8qIHNhZmV0eSBjaGVjayBzbyB3ZSBkb24ndCBmbHVzaCB3aGlsZSB3ZSBhcmUgcmVwbGF5aW5nIHRoZSBsb2cgZHVyaW5nCisgICAgICogbW91bnQKKyAgICAgKi8KKyAgICBpZiAobGlzdF9lbXB0eSgmam91cm5hbC0+al9qb3VybmFsX2xpc3QpKSB7CisJcmV0dXJuIDAgIDsKKyAgICB9CisKKyAgICAvKiBjaGVjayB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIElmIHRoZXJlIGFyZSBubyB3cml0ZXJzLCBhbmQgaXQgaXMKKyAgICAgKiB0b28gb2xkLCBmaW5pc2ggaXQsIGFuZCBmb3JjZSB0aGUgY29tbWl0IGJsb2NrcyB0byBkaXNrCisgICAgICovCisgICAgaWYgKGF0b21pY19yZWFkKCZqb3VybmFsLT5qX3djb3VudCkgPD0gMCAmJgorICAgICAgICBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPiAwICYmCisgICAgICAgIGpvdXJuYWwtPmpfbGVuID4gMCAmJgorICAgICAgICAobm93IC0gam91cm5hbC0+al90cmFuc19zdGFydF90aW1lKSA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSkKKyAgICB7CisJaWYgKCFqb3VybmFsX2pvaW4oJnRoLCBwX3Nfc2IsIDEpKSB7CisgICAgICAgICAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSwgMSkgOworICAgICAgICAgICAgam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcF9zX3NiLCBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpKSA7CisKKyAgICAgICAgICAgIC8qIHdlJ3JlIG9ubHkgYmVpbmcgY2FsbGVkIGZyb20ga3JlaXNlcmZzZCwgaXQgbWFrZXMgbm8gc2Vuc2UgdG8gZG8KKyAgICAgICAgICAgICoqIGFuIGFzeW5jIGNvbW1pdCBzbyB0aGF0IGtyZWlzZXJmc2QgY2FuIGRvIGl0IGxhdGVyCisgICAgICAgICAgICAqLworICAgICAgICAgICAgZG9fam91cm5hbF9lbmQoJnRoLCBwX3Nfc2IsMSwgQ09NTUlUX05PVyB8IFdBSVQpIDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcF9zX3NiLT5zX2RpcnQ7Cit9CisKKy8qCisqKiByZXR1cm5zIDAgaWYgZG9fam91cm5hbF9lbmQgc2hvdWxkIHJldHVybiByaWdodCBhd2F5LCByZXR1cm5zIDEgaWYgZG9fam91cm5hbF9lbmQgc2hvdWxkIGZpbmlzaCB0aGUgY29tbWl0CisqKiAKKyoqIGlmIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGlzIHRvbyBvbGQsIGJ1dCBzdGlsbCBoYXMgd3JpdGVycywgdGhpcyB3aWxsIHdhaXQgb24gal9qb2luX3dhaXQgdW50aWwgYWxsIAorKiogdGhlIHdyaXRlcnMgYXJlIGRvbmUuICBCeSB0aGUgdGltZSBpdCB3YWtlcyB1cCwgdGhlIHRyYW5zYWN0aW9uIGl0IHdhcyBjYWxsZWQgaGFzIGFscmVhZHkgZW5kZWQsIHNvIGl0IGp1c3QKKyoqIGZsdXNoZXMgdGhlIGNvbW1pdCBsaXN0IGFuZCByZXR1cm5zIDAuCisqKgorKiogV29uJ3QgYmF0Y2ggd2hlbiBmbHVzaCBvciBjb21taXRfbm93IGlzIHNldC4gIEFsc28gd29uJ3QgYmF0Y2ggd2hlbiBvdGhlcnMgYXJlIHdhaXRpbmcgb24gal9qb2luX3dhaXQuCisqKiAKKyoqIE5vdGUsIHdlIGNhbid0IGFsbG93IHRoZSBqb3VybmFsX2VuZCB0byBwcm9jZWVkIHdoaWxlIHRoZXJlIGFyZSBzdGlsbCB3cml0ZXJzIGluIHRoZSBsb2cuCisqLworc3RhdGljIGludCBjaGVja19qb3VybmFsX2VuZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICAqIHBfc19zYiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbmJsb2NrcywgaW50IGZsYWdzKSB7CisKKyAgdGltZV90IG5vdyA7CisgIGludCBmbHVzaCA9IGZsYWdzICYgRkxVU0hfQUxMIDsKKyAgaW50IGNvbW1pdF9ub3cgPSBmbGFncyAmIENPTU1JVF9OT1cgOworICBpbnQgd2FpdF9vbl9jb21taXQgPSBmbGFncyAmIFdBSVQgOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworCisgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKworICBpZiAodGgtPnRfdHJhbnNfaWQgIT0gam91cm5hbC0+al90cmFuc19pZCkgeworICAgIHJlaXNlcmZzX3BhbmljKHRoLT50X3N1cGVyLCAiam91cm5hbC0xNTc3OiBoYW5kbGUgdHJhbnMgaWQgJWxkICE9IGN1cnJlbnQgdHJhbnMgaWQgJWxkXG4iLCAKKyAgICAgICAgICAgICAgICAgICB0aC0+dF90cmFuc19pZCwgam91cm5hbC0+al90cmFuc19pZCk7CisgIH0KKworICBqb3VybmFsLT5qX2xlbl9hbGxvYyAtPSAodGgtPnRfYmxvY2tzX2FsbG9jYXRlZCAtIHRoLT50X2Jsb2Nrc19sb2dnZWQpIDsKKyAgaWYgKGF0b21pY19yZWFkKCYoam91cm5hbC0+al93Y291bnQpKSA+IDApIHsgLyogPD0gMCBpcyBhbGxvd2VkLiAgdW5tb3VudGluZyBtaWdodCBub3QgY2FsbCBiZWdpbiAqLworICAgIGF0b21pY19kZWMoJihqb3VybmFsLT5qX3djb3VudCkpIDsKKyAgfQorCisgIC8qIEJVRywgZGVhbCB3aXRoIGNhc2Ugd2hlcmUgal9sZW4gaXMgMCwgYnV0IHBlb3BsZSBwcmV2aW91c2x5IGZyZWVkIGJsb2NrcyBuZWVkIHRvIGJlIHJlbGVhc2VkIAorICAqKiB3aWxsIGJlIGRlYWx0IHdpdGggYnkgbmV4dCB0cmFuc2FjdGlvbiB0aGF0IGFjdHVhbGx5IHdyaXRlcyBzb21ldGhpbmcsIGJ1dCBzaG91bGQgYmUgdGFrZW4KKyAgKiogY2FyZSBvZiBpbiB0aGlzIHRyYW5zCisgICovCisgIGlmIChqb3VybmFsLT5qX2xlbiA9PSAwKSB7CisgICAgQlVHKCk7CisgIH0KKyAgLyogaWYgd2NvdW50ID4gMCwgYW5kIHdlIGFyZSBjYWxsZWQgdG8gd2l0aCBmbHVzaCBvciBjb21taXRfbm93LAorICAqKiB3ZSB3YWl0IG9uIGpfam9pbl93YWl0LiAgV2Ugd2lsbCB3YWtlIHVwIHdoZW4gdGhlIGxhc3Qgd3JpdGVyIGhhcworICAqKiBmaW5pc2hlZCB0aGUgdHJhbnNhY3Rpb24sIGFuZCBzdGFydGVkIGl0IG9uIGl0cyB3YXkgdG8gdGhlIGRpc2suCisgICoqIFRoZW4sIHdlIGZsdXNoIHRoZSBjb21taXQgb3Igam91cm5hbCBsaXN0LCBhbmQganVzdCByZXR1cm4gMCAKKyAgKiogYmVjYXVzZSB0aGUgcmVzdCBvZiBqb3VybmFsIGVuZCB3YXMgYWxyZWFkeSBkb25lIGZvciB0aGlzIHRyYW5zYWN0aW9uLgorICAqLworICBpZiAoYXRvbWljX3JlYWQoJihqb3VybmFsLT5qX3djb3VudCkpID4gMCkgeworICAgIGlmIChmbHVzaCB8fCBjb21taXRfbm93KSB7CisgICAgICB1bnNpZ25lZCB0cmFuc19pZCA7CisKKyAgICAgIGpsID0gam91cm5hbC0+al9jdXJyZW50X2psOworICAgICAgdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKKyAgICAgIGlmICh3YWl0X29uX2NvbW1pdCkKKyAgICAgICAgamwtPmpfc3RhdGUgfD0gTElTVF9DT01NSVRfUEVORElORzsKKyAgICAgIGF0b21pY19zZXQoJihqb3VybmFsLT5qX2psb2NrKSwgMSkgOworICAgICAgaWYgKGZsdXNoKSB7CisgICAgICAgIGpvdXJuYWwtPmpfbmV4dF9mdWxsX2ZsdXNoID0gMSA7CisgICAgICB9CisgICAgICB1bmxvY2tfam91cm5hbChwX3Nfc2IpIDsKKworICAgICAgLyogc2xlZXAgd2hpbGUgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaXMgc3RpbGwgal9qbG9ja2VkICovCisgICAgICB3aGlsZShqb3VybmFsLT5qX3RyYW5zX2lkID09IHRyYW5zX2lkKSB7CisJaWYgKGF0b21pY19yZWFkKCZqb3VybmFsLT5qX2psb2NrKSkgeworCSAgICBxdWV1ZV9sb2dfd3JpdGVyKHBfc19zYik7CisgICAgICAgIH0gZWxzZSB7CisJICAgIGxvY2tfam91cm5hbChwX3Nfc2IpOworCSAgICBpZiAoam91cm5hbC0+al90cmFuc19pZCA9PSB0cmFuc19pZCkgeworCSAgICAgICAgYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfamxvY2spLCAxKSA7CisJICAgIH0KKwkgICAgdW5sb2NrX2pvdXJuYWwocF9zX3NiKTsKKwl9CisgICAgICB9CisgICAgICBpZiAoam91cm5hbC0+al90cmFuc19pZCA9PSB0cmFuc19pZCkgeworICAgICAgICAgIEJVRygpOworICAgICAgfQorICAgICAgaWYgKGNvbW1pdF9ub3cgJiYgam91cm5hbF9saXN0X3N0aWxsX2FsaXZlKHBfc19zYiwgdHJhbnNfaWQpICYmCisgICAgICAgICAgd2FpdF9vbl9jb21taXQpCisgICAgICB7CisJICBmbHVzaF9jb21taXRfbGlzdChwX3Nfc2IsIGpsLCAxKSA7CisgICAgICB9CisgICAgICByZXR1cm4gMCA7CisgICAgfSAKKyAgICB1bmxvY2tfam91cm5hbChwX3Nfc2IpIDsKKyAgICByZXR1cm4gMCA7CisgIH0KKworICAvKiBkZWFsIHdpdGggb2xkIHRyYW5zYWN0aW9ucyB3aGVyZSB3ZSBhcmUgdGhlIGxhc3Qgd3JpdGVycyAqLworICBub3cgPSBnZXRfc2Vjb25kcygpOworICBpZiAoKG5vdyAtIGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSkgPiBqb3VybmFsLT5qX21heF90cmFuc19hZ2UpIHsKKyAgICBjb21taXRfbm93ID0gMSA7CisgICAgam91cm5hbC0+al9uZXh0X2FzeW5jX2ZsdXNoID0gMSA7CisgIH0KKyAgLyogZG9uJ3QgYmF0Y2ggd2hlbiBzb21lb25lIGlzIHdhaXRpbmcgb24gal9qb2luX3dhaXQgKi8KKyAgLyogZG9uJ3QgYmF0Y2ggd2hlbiBzeW5jaW5nIHRoZSBjb21taXQgb3IgZmx1c2hpbmcgdGhlIHdob2xlIHRyYW5zICovCisgIGlmICghKGpvdXJuYWwtPmpfbXVzdF93YWl0ID4gMCkgJiYgIShhdG9taWNfcmVhZCgmKGpvdXJuYWwtPmpfamxvY2spKSkgJiYgIWZsdXNoICYmICFjb21taXRfbm93ICYmCisgICAgICAoam91cm5hbC0+al9sZW4gPCBqb3VybmFsLT5qX21heF9iYXRjaCkgICYmCisgICAgICBqb3VybmFsLT5qX2xlbl9hbGxvYyA8IGpvdXJuYWwtPmpfbWF4X2JhdGNoICYmIGpvdXJuYWwtPmpfY25vZGVfZnJlZSA+IChqb3VybmFsLT5qX3RyYW5zX21heCAqIDMpKSB7CisgICAgam91cm5hbC0+al9iY291bnQrKyA7CisgICAgdW5sb2NrX2pvdXJuYWwocF9zX3NiKSA7CisgICAgcmV0dXJuIDAgOworICB9CisKKyAgaWYgKGpvdXJuYWwtPmpfc3RhcnQgPiBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpIHsKKyAgICByZWlzZXJmc19wYW5pYyhwX3Nfc2IsICJqb3VybmFsLTAwMzogam91cm5hbF9lbmQ6IGpfc3RhcnQgKCVsZCkgaXMgdG9vIGhpZ2hcbiIsIGpvdXJuYWwtPmpfc3RhcnQpIDsKKyAgfQorICByZXR1cm4gMSA7Cit9CisKKy8qCisqKiBEb2VzIGFsbCB0aGUgd29yayB0aGF0IG1ha2VzIGRlbGV0aW5nIGJsb2NrcyBzYWZlLgorKiogd2hlbiBkZWxldGluZyBhIGJsb2NrIG1hcmsgQkhfSk5ldywganVzdCByZW1vdmUgaXQgZnJvbSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgY2xlYW4gaXQncyBidWZmZXJfaGVhZCBhbmQgbW92ZSBvbi4KKyoqIAorKiogb3RoZXJ3aXNlOgorKiogc2V0IGEgYml0IGZvciB0aGUgYmxvY2sgaW4gdGhlIGpvdXJuYWwgYml0bWFwLiAgVGhhdCB3aWxsIHByZXZlbnQgaXQgZnJvbSBiZWluZyBhbGxvY2F0ZWQgZm9yIHVuZm9ybWF0dGVkIG5vZGVzCisqKiBiZWZvcmUgdGhpcyB0cmFuc2FjdGlvbiBoYXMgZmluaXNoZWQuCisqKgorKiogbWFyayBhbnkgY25vZGVzIGZvciB0aGlzIGJsb2NrIGFzIEJMT0NLX0ZSRUVELCBhbmQgY2xlYXIgdGhlaXIgYmggcG9pbnRlcnMuICBUaGF0IHdpbGwgcHJldmVudCBhbnkgb2xkIHRyYW5zYWN0aW9ucyB3aXRoCisqKiB0aGlzIGJsb2NrIGZyb20gdHJ5aW5nIHRvIGZsdXNoIHRvIHRoZSByZWFsIGxvY2F0aW9uLiAgU2luY2Ugd2UgYXJlbid0IHJlbW92aW5nIHRoZSBjbm9kZSBmcm9tIHRoZSBqb3VybmFsX2xpc3RfaGFzaCwKKyoqIHRoZSBibG9jayBjYW4ndCBiZSByZWFsbG9jYXRlZCB5ZXQuCisqKgorKiogVGhlbiByZW1vdmUgaXQgZnJvbSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgZGVjcmVtZW50aW5nIGFueSBjb3VudGVycyBhbmQgZmlsaW5nIGl0IG9uIHRoZSBjbGVhbiBsaXN0LgorKi8KK2ludCBqb3VybmFsX21hcmtfZnJlZWQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBiX2Jsb2NrbnJfdCBibG9ja25yKSB7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuID0gTlVMTCA7CisgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMIDsKKyAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYiA9IE5VTEwgOworICBpbnQgY2xlYW5lZCA9IDAgOworICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisKKyAgY24gPSBnZXRfam91cm5hbF9oYXNoX2RldihwX3Nfc2IsIGpvdXJuYWwtPmpfaGFzaF90YWJsZSwgYmxvY2tucik7CisgIGlmIChjbiAmJiBjbi0+YmgpIHsKKyAgICAgIGJoID0gY24tPmJoIDsKKyAgICAgIGdldF9iaChiaCkgOworICB9CisgIC8qIGlmIGl0IGlzIGpvdXJuYWwgbmV3LCB3ZSBqdXN0IHJlbW92ZSBpdCBmcm9tIHRoaXMgdHJhbnNhY3Rpb24gKi8KKyAgaWYgKGJoICYmIGJ1ZmZlcl9qb3VybmFsX25ldyhiaCkpIHsKKyAgICBjbGVhcl9idWZmZXJfam91cm5hbF9uZXcgKGJoKTsKKyAgICBjbGVhcl9wcmVwYXJlZF9iaXRzKGJoKSA7CisgICAgcmVpc2VyZnNfY2xlYW5fYW5kX2ZpbGVfYnVmZmVyKGJoKSA7CisgICAgY2xlYW5lZCA9IHJlbW92ZV9mcm9tX3RyYW5zYWN0aW9uKHBfc19zYiwgYmxvY2tuciwgY2xlYW5lZCkgOworICB9IGVsc2UgeworICAgIC8qIHNldCB0aGUgYml0IGZvciB0aGlzIGJsb2NrIGluIHRoZSBqb3VybmFsIGJpdG1hcCBmb3IgdGhpcyB0cmFuc2FjdGlvbiAqLworICAgIGpiID0gam91cm5hbC0+al9jdXJyZW50X2psLT5qX2xpc3RfYml0bWFwOworICAgIGlmICghamIpIHsKKyAgICAgIHJlaXNlcmZzX3BhbmljKHBfc19zYiwgImpvdXJuYWwtMTcwMjogam91cm5hbF9tYXJrX2ZyZWVkLCBqb3VybmFsX2xpc3RfYml0bWFwIGlzIE5VTExcbiIpIDsKKyAgICB9CisgICAgc2V0X2JpdF9pbl9saXN0X2JpdG1hcChwX3Nfc2IsIGJsb2NrbnIsIGpiKSA7CisKKyAgICAvKiBOb3RlLCB0aGUgZW50aXJlIHdoaWxlIGxvb3AgaXMgbm90IGFsbG93ZWQgdG8gc2NoZWR1bGUuICAqLworCisgICAgaWYgKGJoKSB7CisgICAgICBjbGVhcl9wcmVwYXJlZF9iaXRzKGJoKSA7CisgICAgICByZWlzZXJmc19jbGVhbl9hbmRfZmlsZV9idWZmZXIoYmgpIDsKKyAgICB9CisgICAgY2xlYW5lZCA9IHJlbW92ZV9mcm9tX3RyYW5zYWN0aW9uKHBfc19zYiwgYmxvY2tuciwgY2xlYW5lZCkgOworCisgICAgLyogZmluZCBhbGwgb2xkZXIgdHJhbnNhY3Rpb25zIHdpdGggdGhpcyBibG9jaywgbWFrZSBzdXJlIHRoZXkgZG9uJ3QgdHJ5IHRvIHdyaXRlIGl0IG91dCAqLworICAgIGNuID0gZ2V0X2pvdXJuYWxfaGFzaF9kZXYocF9zX3NiLGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLCAgYmxvY2tucikgOworICAgIHdoaWxlIChjbikgeworICAgICAgaWYgKHBfc19zYiA9PSBjbi0+c2IgJiYgYmxvY2tuciA9PSBjbi0+YmxvY2tucikgeworCXNldF9iaXQoQkxPQ0tfRlJFRUQsICZjbi0+c3RhdGUpIDsKKwlpZiAoY24tPmJoKSB7CisJICBpZiAoIWNsZWFuZWQpIHsKKwkgICAgLyogcmVtb3ZlX2Zyb21fdHJhbnNhY3Rpb24gd2lsbCBicmVsc2UgdGhlIGJ1ZmZlciBpZiBpdCB3YXMgCisJICAgICoqIGluIHRoZSBjdXJyZW50IHRyYW5zCisJICAgICovCisgICAgICAgICAgICBjbGVhcl9idWZmZXJfam91cm5hbF9kaXJ0eSAoY24tPmJoKTsKKwkgICAgY2xlYXJfYnVmZmVyX2RpcnR5KGNuLT5iaCk7CisJICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX3Rlc3QoY24tPmJoKTsKKwkgICAgY2xlYW5lZCA9IDEgOworCSAgICBwdXRfYmgoY24tPmJoKSA7CisJICAgIGlmIChhdG9taWNfcmVhZCgmKGNuLT5iaC0+Yl9jb3VudCkpIDwgMCkgeworCSAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtMjEzODogY24tPmJoLT5iX2NvdW50IDwgMCIpOworCSAgICB9CisJICB9CisJICBpZiAoY24tPmpsaXN0KSB7IC8qIHNpbmNlIHdlIGFyZSBjbGVhcmluZyB0aGUgYmgsIHdlIE1VU1QgZGVjIG5vbnplcm9sZW4gKi8KKwkgICAgYXRvbWljX2RlYygmKGNuLT5qbGlzdC0+al9ub256ZXJvbGVuKSkgOworCSAgfQorCSAgY24tPmJoID0gTlVMTCA7IAorCX0gCisgICAgICB9CisgICAgICBjbiA9IGNuLT5obmV4dCA7CisgICAgfQorICB9CisKKyAgaWYgKGJoKSB7CisgICAgcHV0X2JoKGJoKSA7IC8qIGdldF9oYXNoIGdyYWJzIHRoZSBidWZmZXIgKi8KKyAgICBpZiAoYXRvbWljX3JlYWQoJihiaC0+Yl9jb3VudCkpIDwgMCkgeworICAgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiam91cm5hbC0yMTY1OiBiaC0+Yl9jb3VudCA8IDAiKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDAgOworfQorCit2b2lkIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlKSB7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAoaW5vZGUtPmlfc2IpOworICBSRUlTRVJGU19JKGlub2RlKS0+aV9qbCA9IGpvdXJuYWwtPmpfY3VycmVudF9qbDsKKyAgUkVJU0VSRlNfSShpbm9kZSktPmlfdHJhbnNfaWQgPSBqb3VybmFsLT5qX3RyYW5zX2lkIDsKK30KKworLyoKKyAqIHJldHVybnMgLTEgb24gZXJyb3IsIDAgaWYgbm8gY29tbWl0cy9iYXJyaWVycyB3ZXJlIGRvbmUgYW5kIDEKKyAqIGlmIGEgdHJhbnNhY3Rpb24gd2FzIGFjdHVhbGx5IGNvbW1pdHRlZCBhbmQgdGhlIGJhcnJpZXIgd2FzIGRvbmUKKyAqLworc3RhdGljIGludCBfX2NvbW1pdF90cmFuc19qbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7CisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiIDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHNiKTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIC8qIGlzIGl0IGZyb20gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24sIG9yIGZyb20gYW4gdW5rbm93biB0cmFuc2FjdGlvbj8gKi8KKyAgICBpZiAoaWQgPT0gam91cm5hbC0+al90cmFuc19pZCkgeworCWpsID0gam91cm5hbC0+al9jdXJyZW50X2psOworCS8qIHRyeSB0byBsZXQgb3RoZXIgd3JpdGVycyBjb21lIGluIGFuZCBncm93IHRoaXMgdHJhbnNhY3Rpb24gKi8KKwlsZXRfdHJhbnNhY3Rpb25fZ3JvdyhzYiwgaWQpOworCWlmIChqb3VybmFsLT5qX3RyYW5zX2lkICE9IGlkKSB7CisJICAgIGdvdG8gZmx1c2hfY29tbWl0X29ubHk7CisJfQorCisJcmV0ID0gam91cm5hbF9iZWdpbigmdGgsIHNiLCAxKSA7CisJaWYgKHJldCkKKwkgICAgcmV0dXJuIHJldDsKKworCS8qIHNvbWVvbmUgbWlnaHQgaGF2ZSBlbmRlZCB0aGlzIHRyYW5zYWN0aW9uIHdoaWxlIHdlIGpvaW5lZCAqLworCWlmIChqb3VybmFsLT5qX3RyYW5zX2lkICE9IGlkKSB7CisJICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHNiKSwgMSkgOworCSAgICBqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzYiwgU0JfQlVGRkVSX1dJVEhfU0Ioc2IpKSA7CisJICAgIHJldCA9IGpvdXJuYWxfZW5kKCZ0aCwgc2IsIDEpIDsKKwkgICAgZ290byBmbHVzaF9jb21taXRfb25seTsKKwl9CisKKwlyZXQgPSBqb3VybmFsX2VuZF9zeW5jKCZ0aCwgc2IsIDEpIDsKKwlpZiAoIXJldCkKKwkgICAgcmV0ID0gMTsKKworICAgIH0gZWxzZSB7CisJLyogdGhpcyBnZXRzIHRyaWNreSwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIGpvdXJuYWwgbGlzdCBpbgorCSAqIHRoZSBpbm9kZSBzdGlsbCBleGlzdHMuICBXZSBrbm93IHRoZSBsaXN0IGlzIHN0aWxsIGFyb3VuZAorCSAqIGlmIHdlJ3ZlIGdvdCBhIGxhcmdlciB0cmFuc2FjdGlvbiBpZCB0aGFuIHRoZSBvbGRlc3QgbGlzdAorCSAqLworZmx1c2hfY29tbWl0X29ubHk6CisJaWYgKGpvdXJuYWxfbGlzdF9zdGlsbF9hbGl2ZShpbm9kZS0+aV9zYiwgaWQpKSB7CisJICAgIC8qCisJICAgICAqIHdlIG9ubHkgc2V0IHJldCB0byAxIHdoZW4gd2Uga25vdyBmb3Igc3VyZQorCSAgICAgKiB0aGUgYmFycmllciBoYXNuJ3QgYmVlbiBzdGFydGVkIHlldCBvbiB0aGUgY29tbWl0CisJICAgICAqIGJsb2NrLgorCSAgICAgKi8KKwkgICAgaWYgKGF0b21pY19yZWFkKCZqbC0+al9jb21taXRfbGVmdCkgPiAxKQorCSAgICAgICAgcmV0ID0gMTsKKwkgICAgZmx1c2hfY29tbWl0X2xpc3Qoc2IsIGpsLCAxKSA7CisJICAgIGlmIChqb3VybmFsLT5qX2Vycm5vKQorCQlyZXQgPSBqb3VybmFsLT5qX2Vycm5vOworCX0KKyAgICB9CisgICAgLyogb3RoZXJ3aXNlIHRoZSBsaXN0IGlzIGdvbmUsIGFuZCBsb25nIHNpbmNlIGNvbW1pdHRlZCAqLworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCByZWlzZXJmc19jb21taXRfZm9yX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpIHsKKyAgICB1bnNpZ25lZCBsb25nIGlkID0gUkVJU0VSRlNfSShpbm9kZSktPmlfdHJhbnNfaWQ7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwgPSBSRUlTRVJGU19JKGlub2RlKS0+aV9qbDsKKworICAgIC8qIGZvciB0aGUgd2hvbGUgaW5vZGUsIGFzc3VtZSB1bnNldCBpZCBtZWFucyBpdCB3YXMKKyAgICAgKiBjaGFuZ2VkIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgTW9yZSBjb25zZXJ2YXRpdmUKKyAgICAgKi8KKyAgICBpZiAoIWlkIHx8ICFqbCkgeworCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOworCWlkID0gUkVJU0VSRlNfSShpbm9kZSktPmlfdHJhbnNfaWQ7CisJLyogamwgd2lsbCBiZSB1cGRhdGVkIGluIF9fY29tbWl0X3RyYW5zX2psICovCisgICAgfQorCisgICByZXR1cm4gX19jb21taXRfdHJhbnNfamwoaW5vZGUsIGlkLCBqbCk7Cit9CisKK3ZvaWQgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgam91cm5hbC5yZXN0b3JlX3ByZXBhcmVkICk7CisgICAgaWYgKCFiaCkgeworCXJldHVybiA7CisgICAgfQorICAgIGlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9qb3VybmFsX3Jlc3RvcmVfZGlydHkgKGJoKSAmJgorCWJ1ZmZlcl9qb3VybmFsX2RpcnR5KGJoKSkgeworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbjsKKwljbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLAorCQkJCSAgYmgtPmJfYmxvY2tucik7CisJaWYgKGNuICYmIGNhbl9kaXJ0eShjbikpIHsKKyAgICAgICAgICAgIHNldF9idWZmZXJfam91cm5hbF90ZXN0IChiaCk7CisJICAgIG1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjbGVhcl9idWZmZXJfam91cm5hbF9wcmVwYXJlZCAoYmgpOworfQorCitleHRlcm4gc3RydWN0IHRyZWVfYmFsYW5jZSAqY3VyX3RiIDsKKy8qCisqKiBiZWZvcmUgd2UgY2FuIGNoYW5nZSBhIG1ldGFkYXRhIGJsb2NrLCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSBpdCB3b24ndAorKiogYmUgd3JpdHRlbiB0byBkaXNrIHdoaWxlIHdlIGFyZSBhbHRlcmluZyBpdC4gIFNvLCB3ZSBtdXN0OgorKiogY2xlYW4gaXQKKyoqIHdhaXQgb24gaXQuCisqKiAKKyovCitpbnQgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgd2FpdCkgeworICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwucHJlcGFyZSApOworCisgICAgaWYgKHRlc3Rfc2V0X2J1ZmZlcl9sb2NrZWQoYmgpKSB7CisJaWYgKCF3YWl0KQorCSAgICByZXR1cm4gMDsKKwlsb2NrX2J1ZmZlcihiaCk7CisgICAgfQorICAgIHNldF9idWZmZXJfam91cm5hbF9wcmVwYXJlZCAoYmgpOworICAgIGlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaCkgJiYgYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpKSAgeworICAgICAgICBjbGVhcl9idWZmZXJfam91cm5hbF90ZXN0IChiaCk7CisgICAgICAgIHNldF9idWZmZXJfam91cm5hbF9yZXN0b3JlX2RpcnR5IChiaCk7CisgICAgfQorICAgIHVubG9ja19idWZmZXIoYmgpOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBmbHVzaF9vbGRfam91cm5hbF9saXN0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsOworICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworICAgIHRpbWVfdCBub3cgPSBnZXRfc2Vjb25kcygpOworCisgICAgd2hpbGUoIWxpc3RfZW1wdHkoJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KSkgeworICAgICAgICBlbnRyeSA9IGpvdXJuYWwtPmpfam91cm5hbF9saXN0Lm5leHQ7CisJamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnkpOworCS8qIHRoaXMgY2hlY2sgc2hvdWxkIGFsd2F5cyBiZSBydW4sIHRvIHNlbmQgb2xkIGxpc3RzIHRvIGRpc2sgKi8KKwlpZiAoamwtPmpfdGltZXN0YW1wIDwgKG5vdyAtIChKT1VSTkFMX01BWF9UUkFOU19BR0UgKiA0KSkpIHsKKwkgICAgZmx1c2hfdXNlZF9qb3VybmFsX2xpc3RzKHMsIGpsKTsKKwl9IGVsc2UgeworCSAgICBicmVhazsKKwl9CisgICAgfQorfQorCisvKiAKKyoqIGxvbmcgYW5kIHVnbHkuICBJZiBmbHVzaCwgd2lsbCBub3QgcmV0dXJuIHVudGlsIGFsbCBjb21taXQKKyoqIGJsb2NrcyBhbmQgYWxsIHJlYWwgYnVmZmVycyBpbiB0aGUgdHJhbnMgYXJlIG9uIGRpc2suCisqKiBJZiBub19hc3luYywgd29uJ3QgcmV0dXJuIHVudGlsIGFsbCBjb21taXQgYmxvY2tzIGFyZSBvbiBkaXNrLgorKioKKyoqIGtlZXAgcmVhZGluZywgdGhlcmUgYXJlIGNvbW1lbnRzIGFzIHlvdSBnbyBhbG9uZworKioKKyoqIElmIHRoZSBqb3VybmFsIGlzIGFib3J0ZWQsIHdlIGp1c3QgY2xlYW4gdXAuIFRoaW5ncyBsaWtlIGZsdXNoaW5nCisqKiBqb3VybmFsIGxpc3RzLCBldGMganVzdCB3b24ndCBoYXBwZW4uCisqLworc3RhdGljIGludCBkb19qb3VybmFsX2VuZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICAqIHBfc19zYiwgdW5zaWduZWQgbG9uZyBuYmxvY2tzLCAKKwkJICAgICAgICAgIGludCBmbGFncykgeworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbiwgKm5leHQsICpqbF9jbjsgCisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpsYXN0X2NuID0gTlVMTDsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYyA7IAorICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKmNvbW1pdCA7IAorICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmNfYmggOyAvKiBjb21taXQgYmggKi8KKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkX2JoIDsgLyogZGVzYyBiaCAqLworICBpbnQgY3VyX3dyaXRlX3N0YXJ0ID0gMCA7IC8qIHN0YXJ0IGluZGV4IG9mIGN1cnJlbnQgbG9nIHdyaXRlICovCisgIGludCBvbGRfc3RhcnQgOworICBpbnQgaSA7CisgIGludCBmbHVzaCA9IGZsYWdzICYgRkxVU0hfQUxMIDsKKyAgaW50IHdhaXRfb25fY29tbWl0ID0gZmxhZ3MgJiBXQUlUIDsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsICp0ZW1wX2psOworICBzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSwgKnNhZmU7CisgIHVuc2lnbmVkIGxvbmcgamluZGV4OworICB1bnNpZ25lZCBsb25nIGNvbW1pdF90cmFuc19pZDsKKyAgaW50IHRyYW5zX2hhbGY7CisKKyAgQlVHX09OICh0aC0+dF9yZWZjb3VudCA+IDEpOworICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisKKyAgY3VycmVudC0+am91cm5hbF9pbmZvID0gdGgtPnRfaGFuZGxlX3NhdmU7CisgIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgocF9zX3NiLCAiam91cm5hbCBlbmQiKTsKKyAgaWYgKGpvdXJuYWwtPmpfbGVuID09IDApIHsKKyAgICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocF9zX3NiLCBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpLCAxKSA7CisgICAgICBqb3VybmFsX21hcmtfZGlydHkodGgsIHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSkgOworICB9CisKKyAgbG9ja19qb3VybmFsKHBfc19zYikgOworICBpZiAoam91cm5hbC0+al9uZXh0X2Z1bGxfZmx1c2gpIHsKKyAgICBmbGFncyB8PSBGTFVTSF9BTEwgOworICAgIGZsdXNoID0gMSA7CisgIH0KKyAgaWYgKGpvdXJuYWwtPmpfbmV4dF9hc3luY19mbHVzaCkgeworICAgIGZsYWdzIHw9IENPTU1JVF9OT1cgfCBXQUlUOworICAgIHdhaXRfb25fY29tbWl0ID0gMTsKKyAgfQorCisgIC8qIGNoZWNrX2pvdXJuYWxfZW5kIGxvY2tzIHRoZSBqb3VybmFsLCBhbmQgdW5sb2NrcyBpZiBpdCBkb2VzIG5vdCByZXR1cm4gMSAKKyAgKiogaXQgdGVsbHMgdXMgaWYgd2Ugc2hvdWxkIGNvbnRpbnVlIHdpdGggdGhlIGpvdXJuYWxfZW5kLCBvciBqdXN0IHJldHVybgorICAqLworICBpZiAoIWNoZWNrX2pvdXJuYWxfZW5kKHRoLCBwX3Nfc2IsIG5ibG9ja3MsIGZsYWdzKSkgeworICAgIHBfc19zYi0+c19kaXJ0ID0gMTsKKyAgICB3YWtlX3F1ZXVlZF93cml0ZXJzKHBfc19zYik7CisgICAgcmVpc2VyZnNfYXN5bmNfcHJvZ3Jlc3Nfd2FpdChwX3Nfc2IpOworICAgIGdvdG8gb3V0IDsKKyAgfQorCisgIC8qIGNoZWNrX2pvdXJuYWxfZW5kIG1pZ2h0IHNldCB0aGVzZSwgY2hlY2sgYWdhaW4gKi8KKyAgaWYgKGpvdXJuYWwtPmpfbmV4dF9mdWxsX2ZsdXNoKSB7CisgICAgZmx1c2ggPSAxIDsKKyAgfQorCisgIC8qCisgICoqIGogbXVzdCB3YWl0IG1lYW5zIHdlIGhhdmUgdG8gZmx1c2ggdGhlIGxvZyBibG9ja3MsIGFuZCB0aGUgcmVhbCBibG9ja3MgZm9yCisgICoqIHRoaXMgdHJhbnNhY3Rpb24KKyAgKi8KKyAgaWYgKGpvdXJuYWwtPmpfbXVzdF93YWl0ID4gMCkgeworICAgIGZsdXNoID0gMSA7CisgIH0KKworI2lmZGVmIFJFSVNFUkZTX1BSRUFMTE9DQVRFCisgIC8qIHF1b3RhIG9wcyBtaWdodCBuZWVkIHRvIG5lc3QsIHNldHVwIHRoZSBqb3VybmFsX2luZm8gcG9pbnRlciBmb3IgdGhlbSAqLworICBjdXJyZW50LT5qb3VybmFsX2luZm8gPSB0aCA7CisgIHJlaXNlcmZzX2Rpc2NhcmRfYWxsX3ByZWFsbG9jKHRoKTsgLyogaXQgc2hvdWxkIG5vdCBpbnZvbHZlIG5ldyBibG9ja3MgaW50bworCQkJCSAgICAgICogdGhlIHRyYW5zYWN0aW9uICovCisgIGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoLT50X2hhbmRsZV9zYXZlIDsKKyNlbmRpZgorICAKKyAgLyogc2V0dXAgZGVzY3JpcHRpb24gYmxvY2sgKi8KKyAgZF9iaCA9IGpvdXJuYWxfZ2V0YmxrKHBfc19zYiwgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyBqb3VybmFsLT5qX3N0YXJ0KSA7CisgIHNldF9idWZmZXJfdXB0b2RhdGUoZF9iaCk7CisgIGRlc2MgPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqKShkX2JoKS0+Yl9kYXRhIDsKKyAgbWVtc2V0KGRfYmgtPmJfZGF0YSwgMCwgZF9iaC0+Yl9zaXplKSA7CisgIG1lbWNweShnZXRfam91cm5hbF9kZXNjX21hZ2ljIChkX2JoKSwgSk9VUk5BTF9ERVNDX01BR0lDLCA4KSA7CisgIHNldF9kZXNjX3RyYW5zX2lkKGRlc2MsIGpvdXJuYWwtPmpfdHJhbnNfaWQpIDsKKworICAvKiBzZXR1cCBjb21taXQgYmxvY2suICBEb24ndCB3cml0ZSAoa2VlcCBpdCBjbGVhbiB0b28pIHRoaXMgb25lIHVudGlsIGFmdGVyIGV2ZXJ5b25lIGVsc2UgaXMgd3JpdHRlbiAqLworICBjX2JoID0gIGpvdXJuYWxfZ2V0YmxrKHBfc19zYiwgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyAKKwkJICgoam91cm5hbC0+al9zdGFydCArIGpvdXJuYWwtPmpfbGVuICsgMSkgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpKSA7CisgIGNvbW1pdCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKiljX2JoLT5iX2RhdGEgOworICBtZW1zZXQoY19iaC0+Yl9kYXRhLCAwLCBjX2JoLT5iX3NpemUpIDsKKyAgc2V0X2NvbW1pdF90cmFuc19pZChjb21taXQsIGpvdXJuYWwtPmpfdHJhbnNfaWQpIDsKKyAgc2V0X2J1ZmZlcl91cHRvZGF0ZShjX2JoKSA7CisKKyAgLyogaW5pdCB0aGlzIGpvdXJuYWwgbGlzdCAqLworICBqbCA9IGpvdXJuYWwtPmpfY3VycmVudF9qbDsKKworICAvKiB3ZSBsb2NrIHRoZSBjb21taXQgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGJlY2F1c2UKKyAgICogd2Ugd2FudCB0byBtYWtlIHN1cmUgbm9ib2R5IHRyaWVzIHRvIHJ1biBmbHVzaF9jb21taXRfbGlzdCB1bnRpbAorICAgKiB0aGUgbmV3IHRyYW5zYWN0aW9uIGlzIGZ1bGx5IHNldHVwLCBhbmQgd2UndmUgYWxyZWFkeSBmbHVzaGVkIHRoZQorICAgKiBvcmRlcmVkIGJoIGxpc3QKKyAgICovCisgIGRvd24oJmpsLT5qX2NvbW1pdF9sb2NrKTsKKworICAvKiBzYXZlIHRoZSB0cmFuc2FjdGlvbiBpZCBpbiBjYXNlIHdlIG5lZWQgdG8gY29tbWl0IGl0IGxhdGVyICovCisgIGNvbW1pdF90cmFuc19pZCA9IGpsLT5qX3RyYW5zX2lkOworCisgIGF0b21pY19zZXQoJmpsLT5qX29sZGVyX2NvbW1pdHNfZG9uZSwgMCkgOworICBqbC0+al90cmFuc19pZCA9IGpvdXJuYWwtPmpfdHJhbnNfaWQgOworICBqbC0+al90aW1lc3RhbXAgPSBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgOworICBqbC0+al9jb21taXRfYmggPSBjX2JoIDsKKyAgamwtPmpfc3RhcnQgPSBqb3VybmFsLT5qX3N0YXJ0IDsKKyAgamwtPmpfbGVuID0gam91cm5hbC0+al9sZW4gOworICBhdG9taWNfc2V0KCZqbC0+al9ub256ZXJvbGVuLCBqb3VybmFsLT5qX2xlbikgOworICBhdG9taWNfc2V0KCZqbC0+al9jb21taXRfbGVmdCwgam91cm5hbC0+al9sZW4gKyAyKTsKKyAgamwtPmpfcmVhbGJsb2NrID0gTlVMTCA7CisKKyAgLyogVGhlIEVOVElSRSBGT1IgTE9PUCBNVVNUIG5vdCBjYXVzZSBzY2hlZHVsZSB0byBvY2N1ci4KKyAgKiogIGZvciBlYWNoIHJlYWwgYmxvY2ssIGFkZCBpdCB0byB0aGUgam91cm5hbCBsaXN0IGhhc2gsCisgICoqIGNvcHkgaW50byByZWFsIGJsb2NrIGluZGV4IGFycmF5IGluIHRoZSBjb21taXQgb3IgZGVzYyBibG9jaworICAqLworICB0cmFuc19oYWxmID0gam91cm5hbF90cmFuc19oYWxmKHBfc19zYi0+c19ibG9ja3NpemUpOworICBmb3IgKGkgPSAwLCBjbiA9IGpvdXJuYWwtPmpfZmlyc3QgOyBjbiA7IGNuID0gY24tPm5leHQsIGkrKykgeworICAgIGlmIChidWZmZXJfam91cm5hbGVkIChjbi0+YmgpKSB7CisgICAgICBqbF9jbiA9IGdldF9jbm9kZShwX3Nfc2IpIDsKKyAgICAgIGlmICghamxfY24pIHsKKyAgICAgICAgcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiam91cm5hbC0xNjc2LCBnZXRfY25vZGUgcmV0dXJuZWQgTlVMTFxuIikgOworICAgICAgfQorICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICBqbC0+al9yZWFsYmxvY2sgPSBqbF9jbiA7CisgICAgICB9CisgICAgICBqbF9jbi0+cHJldiA9IGxhc3RfY24gOworICAgICAgamxfY24tPm5leHQgPSBOVUxMIDsKKyAgICAgIGlmIChsYXN0X2NuKSB7CisgICAgICAgIGxhc3RfY24tPm5leHQgPSBqbF9jbiA7CisgICAgICB9CisgICAgICBsYXN0X2NuID0gamxfY24gOworICAgICAgLyogbWFrZSBzdXJlIHRoZSBibG9jayB3ZSBhcmUgdHJ5aW5nIHRvIGxvZyBpcyBub3QgYSBibG9jayAKKyAgICAgICAgIG9mIGpvdXJuYWwgb3IgcmVzZXJ2ZWQgYXJlYSAqLworCisgICAgICBpZiAoaXNfYmxvY2tfaW5fbG9nX29yX3Jlc2VydmVkX2FyZWEocF9zX3NiLCBjbi0+YmgtPmJfYmxvY2tucikpIHsKKyAgICAgICAgcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiam91cm5hbC0yMzMyOiBUcnlpbmcgdG8gbG9nIGJsb2NrICVsdSwgd2hpY2ggaXMgYSBsb2cgYmxvY2tcbiIsIGNuLT5iaC0+Yl9ibG9ja25yKSA7CisgICAgICB9CisgICAgICBqbF9jbi0+YmxvY2tuciA9IGNuLT5iaC0+Yl9ibG9ja25yIDsgCisgICAgICBqbF9jbi0+c3RhdGUgPSAwIDsKKyAgICAgIGpsX2NuLT5zYiA9IHBfc19zYjsKKyAgICAgIGpsX2NuLT5iaCA9IGNuLT5iaCA7CisgICAgICBqbF9jbi0+amxpc3QgPSBqbDsKKyAgICAgIGluc2VydF9qb3VybmFsX2hhc2goam91cm5hbC0+al9saXN0X2hhc2hfdGFibGUsIGpsX2NuKSA7CisgICAgICBpZiAoaSA8IHRyYW5zX2hhbGYpIHsKKwlkZXNjLT5qX3JlYWxibG9ja1tpXSA9IGNwdV90b19sZTMyKGNuLT5iaC0+Yl9ibG9ja25yKSA7CisgICAgICB9IGVsc2UgeworCWNvbW1pdC0+al9yZWFsYmxvY2tbaSAtIHRyYW5zX2hhbGZdID0gY3B1X3RvX2xlMzIoY24tPmJoLT5iX2Jsb2NrbnIpIDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaS0tIDsKKyAgICB9CisgIH0KKyAgc2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MsIGpvdXJuYWwtPmpfbGVuKSA7CisgIHNldF9kZXNjX21vdW50X2lkKGRlc2MsIGpvdXJuYWwtPmpfbW91bnRfaWQpIDsKKyAgc2V0X2Rlc2NfdHJhbnNfaWQoZGVzYywgam91cm5hbC0+al90cmFuc19pZCkgOworICBzZXRfY29tbWl0X3RyYW5zX2xlbihjb21taXQsIGpvdXJuYWwtPmpfbGVuKTsKKworICAvKiBzcGVjaWFsIGNoZWNrIGluIGNhc2UgYWxsIGJ1ZmZlcnMgaW4gdGhlIGpvdXJuYWwgd2VyZSBtYXJrZWQgZm9yIG5vdCBsb2dnaW5nICovCisgIGlmIChqb3VybmFsLT5qX2xlbiA9PSAwKSB7CisgICAgQlVHKCk7CisgIH0KKworICAvKiB3ZSdyZSBhYm91dCB0byBkaXJ0eSBhbGwgdGhlIGxvZyBibG9ja3MsIG1hcmsgdGhlIGRlc2NyaXB0aW9uIGJsb2NrCisgICAqIGRpcnR5IG5vdyB0b28uICBEb24ndCBtYXJrIHRoZSBjb21taXQgYmxvY2sgZGlydHkgdW50aWwgYWxsIHRoZQorICAgKiBvdGhlcnMgYXJlIG9uIGRpc2sKKyAgICovCisgIG1hcmtfYnVmZmVyX2RpcnR5KGRfYmgpOworCisgIC8qIGZpcnN0IGRhdGEgYmxvY2sgaXMgal9zdGFydCArIDEsIHNvIGFkZCBvbmUgdG8gY3VyX3dyaXRlX3N0YXJ0IHdoZXJldmVyIHlvdSB1c2UgaXQgKi8KKyAgY3VyX3dyaXRlX3N0YXJ0ID0gam91cm5hbC0+al9zdGFydCA7CisgIGNuID0gam91cm5hbC0+al9maXJzdCA7CisgIGppbmRleCA9IDEgOyAvKiBzdGFydCBhdCBvbmUgc28gd2UgZG9uJ3QgZ2V0IHRoZSBkZXNjIGFnYWluICovCisgIHdoaWxlKGNuKSB7CisgICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfbmV3IChjbi0+YmgpOworICAgIC8qIGNvcHkgYWxsIHRoZSByZWFsIGJsb2NrcyBpbnRvIGxvZyBhcmVhLiAgZGlydHkgbG9nIGJsb2NrcyAqLworICAgIGlmIChidWZmZXJfam91cm5hbGVkIChjbi0+YmgpKSB7CisgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRtcF9iaCA7CisgICAgICBjaGFyICphZGRyOworICAgICAgc3RydWN0IHBhZ2UgKnBhZ2U7CisgICAgICB0bXBfYmggPSAgam91cm5hbF9nZXRibGsocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIAorCQkgICAgICAgKChjdXJfd3JpdGVfc3RhcnQgKyBqaW5kZXgpICUgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSkgOworICAgICAgc2V0X2J1ZmZlcl91cHRvZGF0ZSh0bXBfYmgpOworICAgICAgcGFnZSA9IGNuLT5iaC0+Yl9wYWdlOworICAgICAgYWRkciA9IGttYXAocGFnZSk7CisgICAgICBtZW1jcHkodG1wX2JoLT5iX2RhdGEsIGFkZHIgKyBvZmZzZXRfaW5fcGFnZShjbi0+YmgtPmJfZGF0YSksCisgICAgICAgICAgICAgY24tPmJoLT5iX3NpemUpOworICAgICAga3VubWFwKHBhZ2UpOworICAgICAgbWFya19idWZmZXJfZGlydHkodG1wX2JoKTsKKyAgICAgIGppbmRleCsrIDsKKyAgICAgIHNldF9idWZmZXJfam91cm5hbF9kaXJ0eSAoY24tPmJoKTsKKyAgICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsZWQgKGNuLT5iaCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEpEaXJ0eSBjbGVhcmVkIHNvbWV0aW1lIGR1cmluZyB0cmFuc2FjdGlvbi4gIGRvbid0IGxvZyB0aGlzIG9uZSAqLworICAgICAgcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsICJqb3VybmFsLTIwNDg6IGRvX2pvdXJuYWxfZW5kOiBCQUQsIGJ1ZmZlciBpbiBqb3VybmFsIGhhc2gsIGJ1dCBub3QgSkRpcnR5ISIpIDsKKyAgICAgIGJyZWxzZShjbi0+YmgpIDsKKyAgICB9CisgICAgbmV4dCA9IGNuLT5uZXh0IDsKKyAgICBmcmVlX2Nub2RlKHBfc19zYiwgY24pIDsKKyAgICBjbiA9IG5leHQgOworICAgIGNvbmRfcmVzY2hlZCgpOworICB9CisKKyAgLyogd2UgYXJlIGRvbmUgIHdpdGggYm90aCB0aGUgY19iaCBhbmQgZF9iaCwgYnV0CisgICoqIGNfYmggbXVzdCBiZSB3cml0dGVuIGFmdGVyIGFsbCBvdGhlciBjb21taXQgYmxvY2tzLAorICAqKiBzbyB3ZSBkaXJ0eS9yZWxzZSBjX2JoIGluIGZsdXNoX2NvbW1pdF9saXN0LCB3aXRoIGNvbW1pdF9sZWZ0IDw9IDEuCisgICovCisKKyAgam91cm5hbC0+al9jdXJyZW50X2psID0gYWxsb2Nfam91cm5hbF9saXN0KHBfc19zYik7CisKKyAgLyogbm93IGl0IGlzIHNhZmUgdG8gaW5zZXJ0IHRoaXMgdHJhbnNhY3Rpb24gb24gdGhlIG1haW4gbGlzdCAqLworICBsaXN0X2FkZF90YWlsKCZqbC0+al9saXN0LCAmam91cm5hbC0+al9qb3VybmFsX2xpc3QpOworICBsaXN0X2FkZF90YWlsKCZqbC0+al93b3JraW5nX2xpc3QsICZqb3VybmFsLT5qX3dvcmtpbmdfbGlzdCk7CisgIGpvdXJuYWwtPmpfbnVtX3dvcmtfbGlzdHMrKzsKKworICAvKiByZXNldCBqb3VybmFsIHZhbHVlcyBmb3IgdGhlIG5leHQgdHJhbnNhY3Rpb24gKi8KKyAgb2xkX3N0YXJ0ID0gam91cm5hbC0+al9zdGFydCA7CisgIGpvdXJuYWwtPmpfc3RhcnQgPSAoam91cm5hbC0+al9zdGFydCArIGpvdXJuYWwtPmpfbGVuICsgMikgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYik7CisgIGF0b21pY19zZXQoJihqb3VybmFsLT5qX3djb3VudCksIDApIDsKKyAgam91cm5hbC0+al9iY291bnQgPSAwIDsKKyAgam91cm5hbC0+al9sYXN0ID0gTlVMTCA7CisgIGpvdXJuYWwtPmpfZmlyc3QgPSBOVUxMIDsKKyAgam91cm5hbC0+al9sZW4gPSAwIDsKKyAgam91cm5hbC0+al90cmFuc19zdGFydF90aW1lID0gMCA7CisgIGpvdXJuYWwtPmpfdHJhbnNfaWQrKyA7CisgIGpvdXJuYWwtPmpfY3VycmVudF9qbC0+al90cmFuc19pZCA9IGpvdXJuYWwtPmpfdHJhbnNfaWQ7CisgIGpvdXJuYWwtPmpfbXVzdF93YWl0ID0gMCA7CisgIGpvdXJuYWwtPmpfbGVuX2FsbG9jID0gMCA7CisgIGpvdXJuYWwtPmpfbmV4dF9mdWxsX2ZsdXNoID0gMCA7CisgIGpvdXJuYWwtPmpfbmV4dF9hc3luY19mbHVzaCA9IDAgOworICBpbml0X2pvdXJuYWxfaGFzaChwX3Nfc2IpIDsgCisKKyAgLy8gbWFrZSBzdXJlIHJlaXNlcmZzX2FkZF9qaCBzZWVzIHRoZSBuZXcgY3VycmVudF9qbCBiZWZvcmUgd2UKKyAgLy8gd3JpdGUgb3V0IHRoZSB0YWlscworICBzbXBfbWIoKTsKKworICAvKiB0YWlsIGNvbnZlcnNpb24gdGFyZ2V0cyBoYXZlIHRvIGhpdCB0aGUgZGlzayBiZWZvcmUgd2UgZW5kIHRoZQorICAgKiB0cmFuc2FjdGlvbi4gIE90aGVyd2lzZSBhIGxhdGVyIHRyYW5zYWN0aW9uIG1pZ2h0IHJlcGFjayB0aGUgdGFpbAorICAgKiBiZWZvcmUgdGhpcyB0cmFuc2FjdGlvbiBjb21taXRzLCBsZWF2aW5nIHRoZSBkYXRhIGJsb2NrIHVuZmx1c2hlZCBhbmQKKyAgICogY2xlYW4sIGlmIHdlIGNyYXNoIGJlZm9yZSB0aGUgbGF0ZXIgdHJhbnNhY3Rpb24gY29tbWl0cywgdGhlIGRhdGEgYmxvY2sKKyAgICogaXMgbG9zdC4KKyAgICovCisgIGlmICghbGlzdF9lbXB0eSgmamwtPmpfdGFpbF9iaF9saXN0KSkgeworICAgICAgdW5sb2NrX2tlcm5lbCgpOworICAgICAgd3JpdGVfb3JkZXJlZF9idWZmZXJzKCZqb3VybmFsLT5qX2RpcnR5X2J1ZmZlcnNfbG9jaywKKwkJCSAgICBqb3VybmFsLCBqbCwgJmpsLT5qX3RhaWxfYmhfbGlzdCk7CisgICAgICBsb2NrX2tlcm5lbCgpOworICB9CisgIGlmICghbGlzdF9lbXB0eSgmamwtPmpfdGFpbF9iaF9saXN0KSkKKyAgICAgIEJVRygpOworICB1cCgmamwtPmpfY29tbWl0X2xvY2spOworCisgIC8qIGhvbm9yIHRoZSBmbHVzaCB3aXNoZXMgZnJvbSB0aGUgY2FsbGVyLCBzaW1wbGUgY29tbWl0cyBjYW4KKyAgKiogYmUgZG9uZSBvdXRzaWRlIHRoZSBqb3VybmFsIGxvY2ssIHRoZXkgYXJlIGRvbmUgYmVsb3cKKyAgKioKKyAgKiogaWYgd2UgZG9uJ3QgZmx1c2ggdGhlIGNvbW1pdCBsaXN0IHJpZ2h0IG5vdywgd2UgcHV0IGl0IGludG8KKyAgKiogdGhlIHdvcmsgcXVldWUgc28gdGhlIHBlb3BsZSB3YWl0aW5nIG9uIHRoZSBhc3luYyBwcm9ncmVzcyB3b3JrCisgICoqIHF1ZXVlIGRvbid0IHdhaXQgZm9yIHRoaXMgcHJvYyB0byBmbHVzaCBqb3VybmFsIGxpc3RzIGFuZCBzdWNoLgorICAqLworICBpZiAoZmx1c2gpIHsKKyAgICBmbHVzaF9jb21taXRfbGlzdChwX3Nfc2IsIGpsLCAxKSA7CisgICAgZmx1c2hfam91cm5hbF9saXN0KHBfc19zYiwgamwsIDEpIDsKKyAgfSBlbHNlIGlmICghKGpsLT5qX3N0YXRlICYgTElTVF9DT01NSVRfUEVORElORykpCisgICAgcXVldWVfZGVsYXllZF93b3JrKGNvbW1pdF93cSwgJmpvdXJuYWwtPmpfd29yaywgSFovMTApOworCisKKyAgLyogaWYgdGhlIG5leHQgdHJhbnNhY3Rpb24gaGFzIGFueSBjaGFuY2Ugb2Ygd3JhcHBpbmcsIGZsdXNoIAorICAqKiB0cmFuc2FjdGlvbnMgdGhhdCBtaWdodCBnZXQgb3ZlcndyaXR0ZW4uICBJZiBhbnkgam91cm5hbCBsaXN0cyBhcmUgdmVyeSAKKyAgKiogb2xkIGZsdXNoIHRoZW0gYXMgd2VsbC4gIAorICAqLworZmlyc3Rfamw6CisgIGxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgc2FmZSwgJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KSB7CisgICAgdGVtcF9qbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7CisgICAgaWYgKGpvdXJuYWwtPmpfc3RhcnQgPD0gdGVtcF9qbC0+al9zdGFydCkgeworICAgICAgaWYgKChqb3VybmFsLT5qX3N0YXJ0ICsgam91cm5hbC0+al90cmFuc19tYXggKyAxKSA+PQorICAgICAgICAgIHRlbXBfamwtPmpfc3RhcnQpCisgICAgICB7CisJZmx1c2hfdXNlZF9qb3VybmFsX2xpc3RzKHBfc19zYiwgdGVtcF9qbCk7CisJZ290byBmaXJzdF9qbDsKKyAgICAgIH0gZWxzZSBpZiAoKGpvdXJuYWwtPmpfc3RhcnQgKworICAgICAgICAgICAgICAgICAgam91cm5hbC0+al90cmFuc19tYXggKyAxKSA8CisJCSAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKQorICAgICAgeworICAgICAgICAgIC8qIGlmIHdlIGRvbid0IGNyb3NzIGludG8gdGhlIG5leHQgdHJhbnNhY3Rpb24gYW5kIHdlIGRvbid0CisJICAgKiB3cmFwLCB0aGVyZSBpcyBubyB3YXkgd2UgY2FuIG92ZXJsYXAgYW55IGxhdGVyIHRyYW5zYWN0aW9ucworCSAgICogYnJlYWsgbm93CisJICAgKi8KKwkgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoKGpvdXJuYWwtPmpfc3RhcnQgKworICAgICAgICAgICAgICAgIGpvdXJuYWwtPmpfdHJhbnNfbWF4ICsgMSkgPgorCQlTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpCisgICAgeworICAgICAgaWYgKCgoam91cm5hbC0+al9zdGFydCArIGpvdXJuYWwtPmpfdHJhbnNfbWF4ICsgMSkgJQorICAgICAgICAgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSA+PSB0ZW1wX2psLT5qX3N0YXJ0KQorICAgICAgeworCWZsdXNoX3VzZWRfam91cm5hbF9saXN0cyhwX3Nfc2IsIHRlbXBfamwpOworCWdvdG8gZmlyc3Rfamw7CisgICAgICB9IGVsc2UgeworCSAgLyogd2UgZG9uJ3Qgb3ZlcmxhcCBhbnl0aGluZyBmcm9tIG91dCBzdGFydCB0byB0aGUgZW5kIG9mIHRoZQorCSAgICogbG9nLCBhbmQgb3VyIHdyYXBwZWQgcG9ydGlvbiBkb2Vzbid0IG92ZXJsYXAgYW55dGhpbmcgYXQKKwkgICAqIHRoZSBzdGFydCBvZiB0aGUgbG9nLiAgV2UgY2FuIGJyZWFrCisJICAgKi8KKwkgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBmbHVzaF9vbGRfam91cm5hbF9saXN0cyhwX3Nfc2IpOworCisgIGpvdXJuYWwtPmpfY3VycmVudF9qbC0+al9saXN0X2JpdG1hcCA9IGdldF9saXN0X2JpdG1hcChwX3Nfc2IsIGpvdXJuYWwtPmpfY3VycmVudF9qbCkgOworCisgIGlmICghKGpvdXJuYWwtPmpfY3VycmVudF9qbC0+al9saXN0X2JpdG1hcCkpIHsKKyAgICByZWlzZXJmc19wYW5pYyhwX3Nfc2IsICJqb3VybmFsLTE5OTY6IGRvX2pvdXJuYWxfZW5kLCBjb3VsZCBub3QgZ2V0IGEgbGlzdCBiaXRtYXBcbiIpIDsKKyAgfQorCisgIGF0b21pY19zZXQoJihqb3VybmFsLT5qX2psb2NrKSwgMCkgOworICB1bmxvY2tfam91cm5hbChwX3Nfc2IpIDsKKyAgLyogd2FrZSB1cCBhbnkgYm9keSB3YWl0aW5nIHRvIGpvaW4uICovCisgIGNsZWFyX2JpdChKX1dSSVRFUlNfUVVFVUVELCAmam91cm5hbC0+al9zdGF0ZSk7CisgIHdha2VfdXAoJihqb3VybmFsLT5qX2pvaW5fd2FpdCkpIDsKKworICBpZiAoIWZsdXNoICYmIHdhaXRfb25fY29tbWl0ICYmCisgICAgICBqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUocF9zX3NiLCBjb21taXRfdHJhbnNfaWQpKSB7CisJICBmbHVzaF9jb21taXRfbGlzdChwX3Nfc2IsIGpsLCAxKSA7CisgIH0KK291dDoKKyAgcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChwX3Nfc2IsICJqb3VybmFsIGVuZDIiKTsKKworICBtZW1zZXQgKHRoLCAwLCBzaXplb2YgKCp0aCkpOworICAvKiBSZS1zZXQgdGgtPnRfc3VwZXIsIHNvIHdlIGNhbiBwcm9wZXJseSBrZWVwIHRyYWNrIG9mIGhvdyBtYW55CisgICAqIHBlcnNpc3RlbnQgdHJhbnNhY3Rpb25zIHRoZXJlIGFyZS4gV2UgbmVlZCB0byBkbyB0aGlzIHNvIGlmIHRoaXMKKyAgICogY2FsbCBpcyBwYXJ0IG9mIGEgZmFpbGVkIHJlc3RhcnRfdHJhbnNhY3Rpb24sIHdlIGNhbiBmcmVlIGl0IGxhdGVyICovCisgIHRoLT50X3N1cGVyID0gcF9zX3NiOworCisgIHJldHVybiBqb3VybmFsLT5qX2Vycm5vOworfQorCitzdGF0aWMgdm9pZAorX19yZWlzZXJmc19qb3VybmFsX2Fib3J0X2hhcmQgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzYik7CisgICAgaWYgKHRlc3RfYml0IChKX0FCT1JURUQsICZqb3VybmFsLT5qX3N0YXRlKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcHJpbnRrIChLRVJOX0NSSVQgIlJFSVNFUkZTOiBBYm9ydGluZyBqb3VybmFsIGZvciBmaWxlc3lzdGVtIG9uICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHJlaXNlcmZzX2JkZXZuYW1lIChzYikpOworCisgICAgc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworICAgIHNldF9iaXQgKEpfQUJPUlRFRCwgJmpvdXJuYWwtPmpfc3RhdGUpOworCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisgICAgZHVtcF9zdGFjaygpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitfX3JlaXNlcmZzX2pvdXJuYWxfYWJvcnRfc29mdCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGVycm5vKQoreworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAoc2IpOworICAgIGlmICh0ZXN0X2JpdCAoSl9BQk9SVEVELCAmam91cm5hbC0+al9zdGF0ZSkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICgham91cm5hbC0+al9lcnJubykKKyAgICAgICAgam91cm5hbC0+al9lcnJubyA9IGVycm5vOworCisgICAgX19yZWlzZXJmc19qb3VybmFsX2Fib3J0X2hhcmQgKHNiKTsKK30KKwordm9pZAorcmVpc2VyZnNfam91cm5hbF9hYm9ydCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGVycm5vKQoreworICAgIHJldHVybiBfX3JlaXNlcmZzX2pvdXJuYWxfYWJvcnRfc29mdCAoc2IsIGVycm5vKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2xiYWxhbmNlLmMgYi9mcy9yZWlzZXJmcy9sYmFsYW5jZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MDY2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy9sYmFsYW5jZS5jCkBAIC0wLDAgKzEsMTIyMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwIGJ5IEhhbnMgUmVpc2VyLCBsaWNlbnNpbmcgZ292ZXJuZWQgYnkgcmVpc2VyZnMvUkVBRE1FCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworLyogdGhlc2UgYXJlIHVzZWQgaW4gZG9fYmFsYW5jZS5jICovCisKKy8qIGxlYWZfbW92ZV9pdGVtcworICAgbGVhZl9zaGlmdF9sZWZ0CisgICBsZWFmX3NoaWZ0X3JpZ2h0CisgICBsZWFmX2RlbGV0ZV9pdGVtcworICAgbGVhZl9pbnNlcnRfaW50b19idWYKKyAgIGxlYWZfcGFzdGVfaW5fYnVmZmVyCisgICBsZWFmX2N1dF9mcm9tX2J1ZmZlcgorICAgbGVhZl9wYXN0ZV9lbnRyaWVzCisgICAqLworCisKKy8qIGNvcHkgY29weV9jb3VudCBlbnRyaWVzIGZyb20gc291cmNlIGRpcmVjdG9yeSBpdGVtIHRvIGRlc3QgYnVmZmVyIChjcmVhdGluZyBuZXcgaXRlbSBpZiBuZWVkZWQpICovCitzdGF0aWMgdm9pZCBsZWFmX2NvcHlfZGlyX2VudHJpZXMgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGRlc3RfYmksIHN0cnVjdCBidWZmZXJfaGVhZCAqIHNvdXJjZSwgCisJCQkJICAgaW50IGxhc3RfZmlyc3QsIGludCBpdGVtX251bSwgaW50IGZyb20sIGludCBjb3B5X2NvdW50KQoreworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGRlc3QgPSBkZXN0X2JpLT5iaV9iaDsKKyAgICBpbnQgaXRlbV9udW1faW5fZGVzdDsJCS8qIGVpdGhlciB0aGUgbnVtYmVyIG9mIHRhcmdldCBpdGVtLAorCQkJCQkgICBvciBpZiB3ZSBtdXN0IGNyZWF0ZSBhIG5ldyBpdGVtLAorCQkJCQkgICB0aGUgbnVtYmVyIG9mIHRoZSBpdGVtIHdlIHdpbGwKKwkJCQkJICAgY3JlYXRlIGl0IG5leHQgdG8gKi8KKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7CisgICAgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBkZWg7CisgICAgaW50IGNvcHlfcmVjb3Jkc19sZW47CQkJLyogbGVuZ3RoIG9mIGFsbCByZWNvcmRzIGluIGl0ZW0gdG8gYmUgY29waWVkICovCisgICAgY2hhciAqIHJlY29yZHM7CisKKyAgICBpaCA9IEJfTl9QSVRFTV9IRUFEIChzb3VyY2UsIGl0ZW1fbnVtKTsKKworICAgIFJGQUxTRSggIWlzX2RpcmVudHJ5X2xlX2loIChpaCksICJ2cy0xMDAwMDogaXRlbSBtdXN0IGJlIGRpcmVjdG9yeSBpdGVtIik7CisKKyAgICAvKiBsZW5ndGggb2YgYWxsIHJlY29yZCB0byBiZSBjb3BpZWQgYW5kIGZpcnN0IGJ5dGUgb2YgdGhlIGxhc3Qgb2YgdGhlbSAqLworICAgIGRlaCA9IEJfSV9ERUggKHNvdXJjZSwgaWgpOworICAgIGlmIChjb3B5X2NvdW50KSB7CisJY29weV9yZWNvcmRzX2xlbiA9IChmcm9tID8gZGVoX2xvY2F0aW9uKCAmKGRlaFtmcm9tIC0gMV0pICkgOgorICAgICAgICAgICAgaWhfaXRlbV9sZW4oaWgpKSAtIGRlaF9sb2NhdGlvbiggJihkZWhbZnJvbSArIGNvcHlfY291bnQgLSAxXSkpOworCXJlY29yZHMgPSBzb3VyY2UtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlaF9sb2NhdGlvbiggJihkZWhbZnJvbSArIGNvcHlfY291bnQgLSAxXSkpOworICAgIH0gZWxzZSB7CisJY29weV9yZWNvcmRzX2xlbiA9IDA7CisJcmVjb3JkcyA9IE5VTEw7CisgICAgfQorCisgICAgLyogd2hlbiBjb3B5IGxhc3QgdG8gZmlyc3QsIGRlc3QgYnVmZmVyIGNhbiBjb250YWluIDAgaXRlbXMgKi8KKyAgICBpdGVtX251bV9pbl9kZXN0ID0gKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCkgPyAoKCBCX05SX0lURU1TKGRlc3QpICkgPyAwIDogLTEpIDogKEJfTlJfSVRFTVMoZGVzdCkgLSAxKTsKKworICAgIC8qIGlmIHRoZXJlIGFyZSBubyBpdGVtcyBpbiBkZXN0IG9yIHRoZSBmaXJzdC9sYXN0IGl0ZW0gaW4gZGVzdCBpcyBub3QgaXRlbSBvZiB0aGUgc2FtZSBkaXJlY3RvcnkgKi8KKyAgICBpZiAoIChpdGVtX251bV9pbl9kZXN0ID09IC0gMSkgfHwKKwkobGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUICYmIGxlX2loX2tfb2Zmc2V0IChpaCkgPT0gRE9UX09GRlNFVCkgfHwKKwkgICAgKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCAmJiBjb21wX3Nob3J0X2xlX2tleXMvKkNPTVBfU0hPUlRfS0VZUyovICgmaWgtPmloX2tleSwgQl9OX1BLRVkgKGRlc3QsIGl0ZW1fbnVtX2luX2Rlc3QpKSkpIHsKKwkvKiBjcmVhdGUgbmV3IGl0ZW0gaW4gZGVzdCAqLworCXN0cnVjdCBpdGVtX2hlYWQgbmV3X2loOworCisJLyogZm9ybSBpdGVtIGhlYWRlciAqLworCW1lbWNweSAoJm5ld19paC5paF9rZXksICZpaC0+aWhfa2V5LCBLRVlfU0laRSk7CisJcHV0X2loX3ZlcnNpb24oICZuZXdfaWgsIEtFWV9GT1JNQVRfM181ICk7CisJLyogY2FsY3VsYXRlIGl0ZW0gbGVuICovCisJcHV0X2loX2l0ZW1fbGVuKCAmbmV3X2loLCBERUhfU0laRSAqIGNvcHlfY291bnQgKyBjb3B5X3JlY29yZHNfbGVuICk7CisJcHV0X2loX2VudHJ5X2NvdW50KCAmbmV3X2loLCAwICk7CisgICAgCisJaWYgKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCkgeworCSAgICAvKiBmb3JtIGtleSBieSB0aGUgZm9sbG93aW5nIHdheSAqLworCSAgICBpZiAoZnJvbSA8IElfRU5UUllfQ09VTlQoaWgpKSB7CisJCXNldF9sZV9paF9rX29mZnNldCggJm5ld19paCwgZGVoX29mZnNldCggJihkZWhbZnJvbV0pICkgKTsKKwkJLyptZW1jcHkgKCZuZXdfaWguaWhfa2V5Lmtfb2Zmc2V0LCAmZGVoW2Zyb21dLmRlaF9vZmZzZXQsIFNIT1JUX0tFWV9TSVpFKTsqLworCSAgICB9IGVsc2UgeworCQkvKiBubyBlbnRyaWVzIHdpbGwgYmUgY29waWVkIHRvIHRoaXMgaXRlbSBpbiB0aGlzIGZ1bmN0aW9uICovCisJCXNldF9sZV9paF9rX29mZnNldCAoJm5ld19paCwgVTMyX01BWCk7CisJCS8qIHRoaXMgaXRlbSBpcyBub3QgeWV0IHZhbGlkLCBidXQgd2Ugd2FudCBJX0lTX0RJUkVDVE9SWV9JVEVNIHRvIHJldHVybiAxIGZvciBpdCwgc28gd2UgLTEgKi8KKwkgICAgfQorCSAgICBzZXRfbGVfa2V5X2tfdHlwZSAoS0VZX0ZPUk1BVF8zXzUsICYobmV3X2loLmloX2tleSksIFRZUEVfRElSRU5UUlkpOworCX0KKyAgICAKKwkvKiBpbnNlcnQgaXRlbSBpbnRvIGRlc3QgYnVmZmVyICovCisJbGVhZl9pbnNlcnRfaW50b19idWYgKGRlc3RfYmksIChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8gMCA6IEJfTlJfSVRFTVMoZGVzdCksICZuZXdfaWgsIE5VTEwsIDApOworICAgIH0gZWxzZSB7CisJLyogcHJlcGFyZSBzcGFjZSBmb3IgZW50cmllcyAqLworCWxlYWZfcGFzdGVfaW5fYnVmZmVyIChkZXN0X2JpLCAobGFzdF9maXJzdD09RklSU1RfVE9fTEFTVCkgPyAoQl9OUl9JVEVNUyhkZXN0KSAtIDEpIDogMCwgTUFYX1VTX0lOVCwKKwkJCSAgICAgIERFSF9TSVpFICogY29weV9jb3VudCArIGNvcHlfcmVjb3Jkc19sZW4sIHJlY29yZHMsIDAKKwkgICAgKTsKKyAgICB9CisgIAorICAgIGl0ZW1fbnVtX2luX2Rlc3QgPSAobGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUKSA/IChCX05SX0lURU1TKGRlc3QpLTEpIDogMDsKKyAgICAKKyAgICBsZWFmX3Bhc3RlX2VudHJpZXMgKGRlc3RfYmktPmJpX2JoLCBpdGVtX251bV9pbl9kZXN0LAorCQkJKGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCkgPyBJX0VOVFJZX0NPVU5UKEJfTl9QSVRFTV9IRUFEIChkZXN0LCBpdGVtX251bV9pbl9kZXN0KSkgOiAwLAorCQkJY29weV9jb3VudCwgZGVoICsgZnJvbSwgcmVjb3JkcywKKwkJCURFSF9TSVpFICogY29weV9jb3VudCArIGNvcHlfcmVjb3Jkc19sZW4KKwkpOworfQorCisKKy8qIENvcHkgdGhlIGZpcnN0IChpZiBsYXN0X2ZpcnN0ID09IEZJUlNUX1RPX0xBU1QpIG9yIGxhc3QgKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCkgaXRlbSBvciAKKyAgIHBhcnQgb2YgaXQgb3Igbm90aGluZyAoc2VlIHRoZSByZXR1cm4gMCBiZWxvdykgZnJvbSBTT1VSQ0UgdG8gdGhlIGVuZCAKKyAgIChpZiBsYXN0X2ZpcnN0KSBvciBiZWdpbm5pbmcgKCFsYXN0X2ZpcnN0KSBvZiB0aGUgREVTVCAqLworLyogcmV0dXJucyAxIGlmIGFueXRoaW5nIHdhcyBjb3BpZWQsIGVsc2UgMCAqLworc3RhdGljIGludCBsZWFmX2NvcHlfYm91bmRhcnlfaXRlbSAoc3RydWN0IGJ1ZmZlcl9pbmZvICogZGVzdF9iaSwgc3RydWN0IGJ1ZmZlcl9oZWFkICogc3JjLCBpbnQgbGFzdF9maXJzdCwKKwkJCQkgICAgaW50IGJ5dGVzX29yX2VudHJpZXMpCit7CisgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGRlc3QgPSBkZXN0X2JpLT5iaV9iaDsKKyAgaW50IGRlc3RfbnJfaXRlbSwgc3JjX25yX2l0ZW07IC8qIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBidWZmZXJzICovCisgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKyAgc3RydWN0IGl0ZW1faGVhZCAqIGRpaDsKKyAgCisgIGRlc3RfbnJfaXRlbSA9IEJfTlJfSVRFTVMoZGVzdCk7CisgIAorICBpZiAoIGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCApIHsKKyAgICAvKiBpZiAoIERFU1QgaXMgZW1wdHkgb3IgZmlyc3QgaXRlbSBvZiBTT1VSQ0UgYW5kIGxhc3QgaXRlbSBvZiBERVNUIGFyZSB0aGUgaXRlbXMgb2YgZGlmZmVyZW50IG9iamVjdHMKKyAgICAgICBvciBvZiBkaWZmZXJlbnQgdHlwZXMgKSB0aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8gdHJlYXQgdGhpcyBpdGVtIGRpZmZlcmVudGx5IGZyb20gdGhlIG90aGVyIGl0ZW1zCisgICAgICAgdGhhdCB3ZSBjb3B5LCBzbyB3ZSByZXR1cm4gKi8KKyAgICBpaCA9IEJfTl9QSVRFTV9IRUFEIChzcmMsIDApOworICAgIGRpaCA9IEJfTl9QSVRFTV9IRUFEIChkZXN0LCBkZXN0X25yX2l0ZW0gLSAxKTsKKyAgICBpZiAoIWRlc3RfbnJfaXRlbSB8fCAoIW9wX2lzX2xlZnRfbWVyZ2VhYmxlICgmKGloLT5paF9rZXkpLCBzcmMtPmJfc2l6ZSkpKQorICAgICAgLyogdGhlcmUgaXMgbm90aGluZyB0byBtZXJnZSAqLworICAgICAgcmV0dXJuIDA7CisgICAgICAKKyAgICBSRkFMU0UoICEgaWhfaXRlbV9sZW4oaWgpLCAidnMtMTAwMTA6IGl0ZW0gY2FuIG5vdCBoYXZlIGVtcHR5IGxlbmd0aCIpOworICAgICAgCisgICAgaWYgKCBpc19kaXJlbnRyeV9sZV9paCAoaWgpICkgeworICAgICAgaWYgKCBieXRlc19vcl9lbnRyaWVzID09IC0xICkKKwkvKiBjb3B5IGFsbCBlbnRyaWVzIHRvIGRlc3QgKi8KKwlieXRlc19vcl9lbnRyaWVzID0gaWhfZW50cnlfY291bnQoaWgpOworICAgICAgbGVhZl9jb3B5X2Rpcl9lbnRyaWVzIChkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsIDAsIDAsIGJ5dGVzX29yX2VudHJpZXMpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgICAgCisgICAgLyogY29weSBwYXJ0IG9mIHRoZSBib2R5IG9mIHRoZSBmaXJzdCBpdGVtIG9mIFNPVVJDRSB0byB0aGUgZW5kIG9mIHRoZSBib2R5IG9mIHRoZSBsYXN0IGl0ZW0gb2YgdGhlIERFU1QKKyAgICAgICBwYXJ0IGRlZmluZWQgYnkgJ2J5dGVzX29yX2VudHJpZXMnOyBpZiBieXRlc19vcl9lbnRyaWVzID09IC0xIGNvcHkgd2hvbGUgYm9keTsgZG9uJ3QgY3JlYXRlIG5ldyBpdGVtIGhlYWRlcgorICAgICAgICovCisgICAgaWYgKCBieXRlc19vcl9lbnRyaWVzID09IC0xICkKKyAgICAgIGJ5dGVzX29yX2VudHJpZXMgPSBpaF9pdGVtX2xlbihpaCk7CisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKyAgICBlbHNlIHsKKyAgICAgIGlmIChieXRlc19vcl9lbnRyaWVzID09IGloX2l0ZW1fbGVuKGloKSAmJiBpc19pbmRpcmVjdF9sZV9paChpaCkpCisJaWYgKGdldF9paF9mcmVlX3NwYWNlIChpaCkpCisJICByZWlzZXJmc19wYW5pYyAoTlVMTCwgInZzLTEwMDIwOiBsZWFmX2NvcHlfYm91bmRhcnlfaXRlbTogIgorCQkJICAibGFzdCB1bmZvcm1hdHRlZCBub2RlIG11c3QgYmUgZmlsbGVkIGVudGlyZWx5ICglaCkiLAorCQkJICBpaCk7CisgICAgfQorI2VuZGlmCisgICAgICAKKyAgICAvKiBtZXJnZSBmaXJzdCBpdGVtIChvciBpdHMgcGFydCkgb2Ygc3JjIGJ1ZmZlciB3aXRoIHRoZSBsYXN0CisgICAgICAgaXRlbSBvZiBkZXN0IGJ1ZmZlci4gQm90aCBhcmUgb2YgdGhlIHNhbWUgZmlsZSAqLworICAgIGxlYWZfcGFzdGVfaW5fYnVmZmVyIChkZXN0X2JpLAorCQkJICBkZXN0X25yX2l0ZW0gLSAxLCBpaF9pdGVtX2xlbihkaWgpLCBieXRlc19vcl9lbnRyaWVzLCBCX0lfUElURU0oc3JjLGloKSwgMAorCQkJICApOworICAgICAgCisgICAgaWYgKGlzX2luZGlyZWN0X2xlX2loIChkaWgpKSB7CisgICAgICBSRkFMU0UoIGdldF9paF9mcmVlX3NwYWNlIChkaWgpLAorICAgICAgICAgICAgICAidnMtMTAwMzA6IG1lcmdlIHRvIGxlZnQ6IGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSBvZiBub24tbGFzdCBpbmRpcmVjdCBpdGVtICVoIG11c3QgaGF2ZSB6ZXJ0byBmcmVlIHNwYWNlIiwKKyAgICAgICAgICAgICAgaWgpOworICAgICAgaWYgKGJ5dGVzX29yX2VudHJpZXMgPT0gaWhfaXRlbV9sZW4oaWgpKQorCXNldF9paF9mcmVlX3NwYWNlIChkaWgsIGdldF9paF9mcmVlX3NwYWNlIChpaCkpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gMTsKKyAgfQorICAKKworICAvKiBjb3B5IGJvdW5kYXJ5IGl0ZW0gdG8gcmlnaHQgKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCkgKi8KKworICAvKiAoIERFU1QgaXMgZW1wdHkgb3IgbGFzdCBpdGVtIG9mIFNPVVJDRSBhbmQgZmlyc3QgaXRlbSBvZiBERVNUCisgICAgIGFyZSB0aGUgaXRlbXMgb2YgZGlmZmVyZW50IG9iamVjdCBvciBvZiBkaWZmZXJlbnQgdHlwZXMgKQorICAgICAqLworICBzcmNfbnJfaXRlbSA9IEJfTlJfSVRFTVMgKHNyYyk7CisgIGloID0gQl9OX1BJVEVNX0hFQUQgKHNyYywgc3JjX25yX2l0ZW0gLSAxKTsKKyAgZGloID0gQl9OX1BJVEVNX0hFQUQgKGRlc3QsIDApOworCisgIGlmICghZGVzdF9ucl9pdGVtIHx8ICFvcF9pc19sZWZ0X21lcmdlYWJsZSAoJihkaWgtPmloX2tleSksIHNyYy0+Yl9zaXplKSkKKyAgICByZXR1cm4gMDsKKyAgCisgIGlmICggaXNfZGlyZW50cnlfbGVfaWggKGloKSkgeworICAgIGlmICggYnl0ZXNfb3JfZW50cmllcyA9PSAtMSApCisgICAgICAvKiBieXRlc19vcl9lbnRyaWVzID0gZW50cmllcyBudW1iZXIgaW4gbGFzdCBpdGVtIGJvZHkgb2YgU09VUkNFICovCisgICAgICBieXRlc19vcl9lbnRyaWVzID0gaWhfZW50cnlfY291bnQoaWgpOworICAgIAorICAgIGxlYWZfY29weV9kaXJfZW50cmllcyAoZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULCBzcmNfbnJfaXRlbSAtIDEsIGloX2VudHJ5X2NvdW50KGloKSAtIGJ5dGVzX29yX2VudHJpZXMsIGJ5dGVzX29yX2VudHJpZXMpOworICAgIHJldHVybiAxOworICB9CisKKyAgLyogY29weSBwYXJ0IG9mIHRoZSBib2R5IG9mIHRoZSBsYXN0IGl0ZW0gb2YgU09VUkNFIHRvIHRoZSBiZWdpbiBvZiB0aGUgYm9keSBvZiB0aGUgZmlyc3QgaXRlbSBvZiB0aGUgREVTVDsKKyAgICAgcGFydCBkZWZpbmVkIGJ5ICdieXRlc19vcl9lbnRyaWVzJzsgaWYgYnl0ZV9vcl9lbnRyaWVzcyA9PSAtMSBjb3B5IHdob2xlIGJvZHk7IGNoYW5nZSBmaXJzdCBpdGVtIGtleSBvZiB0aGUgREVTVDsKKyAgICAgZG9uJ3QgY3JlYXRlIG5ldyBpdGVtIGhlYWRlcgorICAgICAqLworICAKKyAgUkZBTFNFKCBpc19pbmRpcmVjdF9sZV9paChpaCkgJiYgZ2V0X2loX2ZyZWVfc3BhY2UgKGloKSwKKyAgICAgICAgICAidnMtMTAwNDA6IG1lcmdlIHRvIHJpZ2h0OiBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgb2Ygbm9uLWxhc3QgaW5kaXJlY3QgaXRlbSBtdXN0IGJlIGZpbGxlZCBlbnRpcmVseSAoJWgpIiwKKwkJICAgIGloKTsKKworICBpZiAoIGJ5dGVzX29yX2VudHJpZXMgPT0gLTEgKSB7CisgICAgLyogYnl0ZXNfb3JfZW50cmllcyA9IGxlbmd0aCBvZiBsYXN0IGl0ZW0gYm9keSBvZiBTT1VSQ0UgKi8KKyAgICBieXRlc19vcl9lbnRyaWVzID0gaWhfaXRlbV9sZW4oaWgpOworCisgICAgUkZBTFNFKCBsZV9paF9rX29mZnNldCAoZGloKSAhPQorICAgICAgICAgICAgbGVfaWhfa19vZmZzZXQgKGloKSArIG9wX2J5dGVzX251bWJlciAoaWgsIHNyYy0+Yl9zaXplKSwKKyAgICAgICAgICAgICJ2cy0xMDA1MDogaXRlbXMgJWggYW5kICVoIGRvIG5vdCBtYXRjaCIsIGloLCBkaWgpOworCisgICAgLyogY2hhbmdlIGZpcnN0IGl0ZW0ga2V5IG9mIHRoZSBERVNUICovCisgICAgc2V0X2xlX2loX2tfb2Zmc2V0IChkaWgsIGxlX2loX2tfb2Zmc2V0IChpaCkpOworCisgICAgLyogaXRlbSBiZWNvbWVzIG5vbi1tZXJnZWFibGUgKi8KKyAgICAvKiBvciBtZXJnZWFibGUgaWYgbGVmdCBpdGVtIHdhcyAqLworICAgIHNldF9sZV9paF9rX3R5cGUgKGRpaCwgbGVfaWhfa190eXBlIChpaCkpOworICB9IGVsc2UgeworICAgIC8qIG1lcmdlIHRvIHJpZ2h0IG9ubHkgcGFydCBvZiBpdGVtICovCisgICAgUkZBTFNFKCBpaF9pdGVtX2xlbihpaCkgPD0gYnl0ZXNfb3JfZW50cmllcywKKyAgICAgICAgICAgICJ2cy0xMDA2MDogbm8gc28gbXVjaCBieXRlcyAlbHUgKG5lZWRlZCAlbHUpIiwKKyAgICAgICAgICAgICggdW5zaWduZWQgbG9uZyApaWhfaXRlbV9sZW4oaWgpLCAoIHVuc2lnbmVkIGxvbmcgKWJ5dGVzX29yX2VudHJpZXMpOworICAgIAorICAgIC8qIGNoYW5nZSBmaXJzdCBpdGVtIGtleSBvZiB0aGUgREVTVCAqLworICAgIGlmICggaXNfZGlyZWN0X2xlX2loIChkaWgpICkgeworICAgICAgUkZBTFNFKCBsZV9paF9rX29mZnNldCAoZGloKSA8PSAodW5zaWduZWQgbG9uZylieXRlc19vcl9lbnRyaWVzLAorCSAgICAgICJ2cy0xMDA3MDogZGloICVoLCBieXRlc19vcl9lbnRyaWVzKCVkKSIsIGRpaCwgYnl0ZXNfb3JfZW50cmllcyk7CisgICAgICBzZXRfbGVfaWhfa19vZmZzZXQgKGRpaCwgbGVfaWhfa19vZmZzZXQgKGRpaCkgLSBieXRlc19vcl9lbnRyaWVzKTsKKyAgICB9IGVsc2UgeworICAgICAgUkZBTFNFKCBsZV9paF9rX29mZnNldCAoZGloKSA8PQorICAgICAgICAgICAgICAoYnl0ZXNfb3JfZW50cmllcyAvIFVORk1fUF9TSVpFKSAqIGRlc3QtPmJfc2l6ZSwKKyAgICAgICAgICAgICAgInZzLTEwMDgwOiBkaWggJWgsIGJ5dGVzX29yX2VudHJpZXMoJWQpIiwKKyAgICAgICAgICAgICAgZGloLCAoYnl0ZXNfb3JfZW50cmllcy9VTkZNX1BfU0laRSkqZGVzdC0+Yl9zaXplKTsKKyAgICAgIHNldF9sZV9paF9rX29mZnNldCAoZGloLCBsZV9paF9rX29mZnNldCAoZGloKSAtICgoYnl0ZXNfb3JfZW50cmllcyAvIFVORk1fUF9TSVpFKSAqIGRlc3QtPmJfc2l6ZSkpOworICAgIH0KKyAgfQorICAKKyAgbGVhZl9wYXN0ZV9pbl9idWZmZXIgKGRlc3RfYmksIDAsIDAsIGJ5dGVzX29yX2VudHJpZXMsIEJfSV9QSVRFTShzcmMsaWgpICsgaWhfaXRlbV9sZW4oaWgpIC0gYnl0ZXNfb3JfZW50cmllcywgMCk7CisgIHJldHVybiAxOworfQorCisKKy8qIGNvcHkgY3B5X211biBpdGVtcyBmcm9tIGJ1ZmZlciBzcmMgdG8gYnVmZmVyIGRlc3QKKyAqIGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCBtZWFucywgdGhhdCB3ZSBjb3B5IGNweV9udW0gIGl0ZW1zIGJlZ2lubmluZyBmcm9tIGZpcnN0LXRoIGl0ZW0gaW4gc3JjIHRvIHRhaWwgb2YgZGVzdAorICogbGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUIG1lYW5zLCB0aGF0IHdlIGNvcHkgY3B5X251bSAgaXRlbXMgYmVnaW5uaW5nIGZyb20gZmlyc3QtdGggaXRlbSBpbiBzcmMgdG8gaGVhZCBvZiBkZXN0CisgKi8KK3N0YXRpYyB2b2lkIGxlYWZfY29weV9pdGVtc19lbnRpcmVseSAoc3RydWN0IGJ1ZmZlcl9pbmZvICogZGVzdF9iaSwgc3RydWN0IGJ1ZmZlcl9oZWFkICogc3JjLCBpbnQgbGFzdF9maXJzdCwKKwkJCQkgICAgICBpbnQgZmlyc3QsIGludCBjcHlfbnVtKQoreworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGRlc3Q7CisgICAgaW50IG5yLCBmcmVlX3NwYWNlOworICAgIGludCBkZXN0X2JlZm9yZTsKKyAgICBpbnQgbGFzdF9sb2MsIGxhc3RfaW5zZXJ0ZWRfbG9jLCBsb2NhdGlvbjsKKyAgICBpbnQgaSwgajsKKyAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7CisgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOworCisgICAgUkZBTFNFKCBsYXN0X2ZpcnN0ICE9IExBU1RfVE9fRklSU1QgICYmIGxhc3RfZmlyc3QgIT0gRklSU1RfVE9fTEFTVCwKKwkgICAgInZzLTEwMDkwOiBiYWQgbGFzdF9maXJzdCBwYXJhbWV0ZXIgJWQiLCBsYXN0X2ZpcnN0KTsKKyAgICBSRkFMU0UoIEJfTlJfSVRFTVMgKHNyYykgLSBmaXJzdCA8IGNweV9udW0sCisJICAgICJ2cy0xMDEwMDogdG9vIGZldyBpdGVtcyBpbiBzb3VyY2UgJWQsIHJlcXVpcmVkICVkIGZyb20gJWQiLAorCSAgICBCX05SX0lURU1TKHNyYyksIGNweV9udW0sIGZpcnN0KTsKKyAgICBSRkFMU0UoIGNweV9udW0gPCAwLCAidnMtMTAxMTA6IGNhbiBub3QgY29weSBuZWdhdGl2ZSBhbW91bnQgb2YgaXRlbXMiKTsKKyAgICBSRkFMU0UoICEgZGVzdF9iaSwgInZzLTEwMTIwOiBjYW4gbm90IGNvcHkgbmVnYXRpdmUgYW1vdW50IG9mIGl0ZW1zIik7CisKKyAgICBkZXN0ID0gZGVzdF9iaS0+YmlfYmg7CisKKyAgICBSRkFMU0UoICEgZGVzdCwgInZzLTEwMTMwOiBjYW4gbm90IGNvcHkgbmVnYXRpdmUgYW1vdW50IG9mIGl0ZW1zIik7CisKKyAgICBpZiAoY3B5X251bSA9PSAwKQorCXJldHVybjsKKworICAgIGJsa2ggPSBCX0JMS19IRUFEKGRlc3QpOworICAgIG5yID0gYmxraF9ucl9pdGVtKCBibGtoICk7CisgICAgZnJlZV9zcGFjZSA9IGJsa2hfZnJlZV9zcGFjZShibGtoKTsKKyAgCisgICAgLyogd2Ugd2lsbCBpbnNlcnQgaXRlbXMgYmVmb3JlIDAtdGggb3IgbnItdGggaXRlbSBpbiBkZXN0IGJ1ZmZlci4gSXQgZGVwZW5kcyBvZiBsYXN0X2ZpcnN0IHBhcmFtZXRlciAqLworICAgIGRlc3RfYmVmb3JlID0gKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCkgPyAwIDogbnI7CisKKyAgICAvKiBsb2NhdGlvbiBvZiBoZWFkIG9mIGZpcnN0IG5ldyBpdGVtICovCisgICAgaWggPSBCX05fUElURU1fSEVBRCAoZGVzdCwgZGVzdF9iZWZvcmUpOworCisgICAgUkZBTFNFKCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgPCBjcHlfbnVtICogSUhfU0laRSwKKyAgICAgICAgICAgICJ2cy0xMDE0MDogbm90IGVub3VnaCBmcmVlIHNwYWNlIGZvciBoZWFkZXJzICVkIChuZWVkZWQgJWQpIiwKKyAgICAgICAgICAgIEJfRlJFRV9TUEFDRSAoZGVzdCksIGNweV9udW0gKiBJSF9TSVpFKTsKKworICAgIC8qIHByZXBhcmUgc3BhY2UgZm9yIGhlYWRlcnMgKi8KKyAgICBtZW1tb3ZlIChpaCArIGNweV9udW0sIGloLCAobnItZGVzdF9iZWZvcmUpICogSUhfU0laRSk7CisKKyAgICAvKiBjb3B5IGl0ZW0gaGVhZGVycyAqLworICAgIG1lbWNweSAoaWgsIEJfTl9QSVRFTV9IRUFEIChzcmMsIGZpcnN0KSwgY3B5X251bSAqIElIX1NJWkUpOworCisgICAgZnJlZV9zcGFjZSAtPSAoSUhfU0laRSAqIGNweV9udW0pOworICAgIHNldF9ibGtoX2ZyZWVfc3BhY2UoIGJsa2gsIGZyZWVfc3BhY2UgKTsKKworICAgIC8qIGxvY2F0aW9uIG9mIHVubW92YWJsZSBpdGVtICovCisgICAgaiA9IGxvY2F0aW9uID0gKGRlc3RfYmVmb3JlID09IDApID8gZGVzdC0+Yl9zaXplIDogaWhfbG9jYXRpb24oaWgtMSk7CisgICAgZm9yIChpID0gZGVzdF9iZWZvcmU7IGkgPCBuciArIGNweV9udW07IGkgKyspIHsKKyAgICAgICAgbG9jYXRpb24gLT0gaWhfaXRlbV9sZW4oIGloICsgaSAtIGRlc3RfYmVmb3JlICk7CisgICAgICAgIHB1dF9paF9sb2NhdGlvbiggaWggKyBpIC0gZGVzdF9iZWZvcmUsIGxvY2F0aW9uICk7CisgICAgfQorCisgICAgLyogcHJlcGFyZSBzcGFjZSBmb3IgaXRlbXMgKi8KKyAgICBsYXN0X2xvYyA9IGloX2xvY2F0aW9uKCAmKGloW25yK2NweV9udW0tMS1kZXN0X2JlZm9yZV0pICk7CisgICAgbGFzdF9pbnNlcnRlZF9sb2MgPSBpaF9sb2NhdGlvbiggJihpaFtjcHlfbnVtLTFdKSApOworCisgICAgLyogY2hlY2sgZnJlZSBzcGFjZSAqLworICAgIFJGQUxTRSggZnJlZV9zcGFjZSA8IGogLSBsYXN0X2luc2VydGVkX2xvYywKKwkgICAgInZzLTEwMTUwOiBub3QgZW5vdWdoIGZyZWUgc3BhY2UgZm9yIGl0ZW1zICVkIChuZWVkZWQgJWQpIiwKKyAgICAgICAgICAgIGZyZWVfc3BhY2UsIGogLSBsYXN0X2luc2VydGVkX2xvYyk7CisKKyAgICBtZW1tb3ZlIChkZXN0LT5iX2RhdGEgKyBsYXN0X2xvYywKKwkgICAgIGRlc3QtPmJfZGF0YSArIGxhc3RfbG9jICsgaiAtIGxhc3RfaW5zZXJ0ZWRfbG9jLAorCSAgICAgbGFzdF9pbnNlcnRlZF9sb2MgLSBsYXN0X2xvYyk7CisKKyAgICAvKiBjb3B5IGl0ZW1zICovCisgICAgbWVtY3B5IChkZXN0LT5iX2RhdGEgKyBsYXN0X2luc2VydGVkX2xvYywgQl9OX1BJVEVNKHNyYywoZmlyc3QgKyBjcHlfbnVtIC0gMSkpLAorCSAgICBqIC0gbGFzdF9pbnNlcnRlZF9sb2MpOworCisgICAgLyogc2l6ZXMsIGl0ZW0gbnVtYmVyICovCisgICAgc2V0X2Jsa2hfbnJfaXRlbSggYmxraCwgbnIgKyBjcHlfbnVtICk7CisgICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwgZnJlZV9zcGFjZSAtIChqIC0gbGFzdF9pbnNlcnRlZF9sb2MpICk7CisKKyAgICBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoZGVzdF9iaS0+dGIsIGRlc3QsIDApOworCisgICAgaWYgKGRlc3RfYmktPmJpX3BhcmVudCkgeworCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjOworCXRfZGMgPSBCX05fQ0hJTEQgKGRlc3RfYmktPmJpX3BhcmVudCwgZGVzdF9iaS0+YmlfcG9zaXRpb24pOworCVJGQUxTRSggZGNfYmxvY2tfbnVtYmVyKHRfZGMpICE9IGRlc3QtPmJfYmxvY2tuciwKKwkgICAgICAgICJ2cy0xMDE2MDogYmxvY2sgbnVtYmVyIGluIGJoIGRvZXMgbm90IG1hdGNoIHRvIGZpZWxkIGluIGRpc2tfY2hpbGQgc3RydWN0dXJlICVsdSBhbmQgJWx1IiwKKyAgICAgICAgICAgICAgICAoIGxvbmcgdW5zaWduZWQgKSBkZXN0LT5iX2Jsb2NrbnIsIAorCQkoIGxvbmcgdW5zaWduZWQgKSBkY19ibG9ja19udW1iZXIodF9kYykpOworCXB1dF9kY19zaXplKCB0X2RjLCBkY19zaXplKHRfZGMpICsgKGogLSBsYXN0X2luc2VydGVkX2xvYyArIElIX1NJWkUgKiBjcHlfbnVtICkgKTsKKyAgICAKKwlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKGRlc3RfYmktPnRiLCBkZXN0X2JpLT5iaV9wYXJlbnQsIDApOworICAgIH0KK30KKworCisvKiBUaGlzIGZ1bmN0aW9uIHNwbGl0cyB0aGUgKGxpcXVpZCkgaXRlbSBpbnRvIHR3byBpdGVtcyAodXNlZnVsIHdoZW4KKyAgIHNoaWZ0aW5nIHBhcnQgb2YgYW4gaXRlbSBpbnRvIGFub3RoZXIgbm9kZS4pICovCitzdGF0aWMgdm9pZCBsZWFmX2l0ZW1fYm90dGxlIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzcmMsIGludCBsYXN0X2ZpcnN0LAorCQkJICAgICAgaW50IGl0ZW1fbnVtLCBpbnQgY3B5X2J5dGVzKQoreworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGRlc3QgPSBkZXN0X2JpLT5iaV9iaDsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7CisgIAorICAgIFJGQUxTRSggY3B5X2J5dGVzID09IC0xLCAidnMtMTAxNzA6IGJ5dGVzID09IC0gMSBtZWFuczogZG8gbm90IHNwbGl0IGl0ZW0iKTsKKworICAgIGlmICggbGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUICkgeworCS8qIGlmICggaWYgaXRlbSBpbiBwb3NpdGlvbiBpdGVtX251bSBpbiBidWZmZXIgU09VUkNFIGlzIGRpcmVjdG9yeSBpdGVtICkgKi8KKwlpZiAoaXNfZGlyZW50cnlfbGVfaWggKGloID0gQl9OX1BJVEVNX0hFQUQoc3JjLGl0ZW1fbnVtKSkpCisJICAgIGxlYWZfY29weV9kaXJfZW50cmllcyAoZGVzdF9iaSwgc3JjLCBGSVJTVF9UT19MQVNULCBpdGVtX251bSwgMCwgY3B5X2J5dGVzKTsKKwllbHNlIHsKKwkgICAgc3RydWN0IGl0ZW1faGVhZCBuX2loOworICAgICAgCisJICAgIC8qIGNvcHkgcGFydCBvZiB0aGUgYm9keSBvZiB0aGUgaXRlbSBudW1iZXIgJ2l0ZW1fbnVtJyBvZiBTT1VSQ0UgdG8gdGhlIGVuZCBvZiB0aGUgREVTVCAKKwkgICAgICAgcGFydCBkZWZpbmVkIGJ5ICdjcHlfYnl0ZXMnOyBjcmVhdGUgbmV3IGl0ZW0gaGVhZGVyOyBjaGFuZ2Ugb2xkIGl0ZW1faGVhZGVyICg/Pz8/KTsKKwkgICAgICAgbl9paCA9IG5ldyBpdGVtX2hlYWRlcjsKKwkgICAgKi8KKwkgICAgbWVtY3B5ICgmbl9paCwgaWgsIElIX1NJWkUpOworCSAgICBwdXRfaWhfaXRlbV9sZW4oICZuX2loLCBjcHlfYnl0ZXMgKTsKKwkgICAgaWYgKGlzX2luZGlyZWN0X2xlX2loIChpaCkpIHsKKwkJUkZBTFNFKCBjcHlfYnl0ZXMgPT0gaWhfaXRlbV9sZW4oaWgpICYmIGdldF9paF9mcmVlX3NwYWNlKGloKSwKKwkJICAgICAgICAidnMtMTAxODA6IHdoZW4gd2hvbGUgaW5kaXJlY3QgaXRlbSBpcyBib3R0bGUgdG8gbGVmdCBuZWlnaGJvciwgaXQgbXVzdCBoYXZlIGZyZWVfc3BhY2U9PTAgKG5vdCAlbHUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICggbG9uZyB1bnNpZ25lZCApIGdldF9paF9mcmVlX3NwYWNlIChpaCkpOworCQlzZXRfaWhfZnJlZV9zcGFjZSAoJm5faWgsIDApOworCSAgICB9CisKKwkgICAgUkZBTFNFKCBvcF9pc19sZWZ0X21lcmdlYWJsZSAoJihpaC0+aWhfa2V5KSwgc3JjLT5iX3NpemUpLAorCQkgICAgInZzLTEwMTkwOiBiYWQgbWVyZ2VhYmlsaXR5IG9mIGl0ZW0gJWgiLCBpaCk7CisJICAgIG5faWguaWhfdmVyc2lvbiA9IGloLT5paF92ZXJzaW9uOyAvKiBKRE0gRW5kaWFuIHNhZmUsIGJvdGggbGUgKi8KKwkgICAgbGVhZl9pbnNlcnRfaW50b19idWYgKGRlc3RfYmksIEJfTlJfSVRFTVMoZGVzdCksICZuX2loLCBCX05fUElURU0gKHNyYywgaXRlbV9udW0pLCAwKTsKKwl9CisgICAgfSBlbHNlIHsKKwkvKiAgaWYgKCBpZiBpdGVtIGluIHBvc2l0aW9uIGl0ZW1fbnVtIGluIGJ1ZmZlciBTT1VSQ0UgaXMgZGlyZWN0b3J5IGl0ZW0gKSAqLworCWlmIChpc19kaXJlbnRyeV9sZV9paChpaCA9IEJfTl9QSVRFTV9IRUFEIChzcmMsIGl0ZW1fbnVtKSkpCisJICAgIGxlYWZfY29weV9kaXJfZW50cmllcyAoZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULCBpdGVtX251bSwgSV9FTlRSWV9DT1VOVChpaCkgLSBjcHlfYnl0ZXMsIGNweV9ieXRlcyk7CisJZWxzZSB7CisJICAgIHN0cnVjdCBpdGVtX2hlYWQgbl9paDsKKyAgICAgIAorCSAgICAvKiBjb3B5IHBhcnQgb2YgdGhlIGJvZHkgb2YgdGhlIGl0ZW0gbnVtYmVyICdpdGVtX251bScgb2YgU09VUkNFIHRvIHRoZSBiZWdpbiBvZiB0aGUgREVTVCAKKwkgICAgICAgcGFydCBkZWZpbmVkIGJ5ICdjcHlfYnl0ZXMnOyBjcmVhdGUgbmV3IGl0ZW0gaGVhZGVyOworCSAgICAgICBuX2loID0gbmV3IGl0ZW1faGVhZGVyOworCSAgICAqLworCSAgICBtZW1jcHkgKCZuX2loLCBpaCwgU0hPUlRfS0VZX1NJWkUpOworCisJICAgIG5faWguaWhfdmVyc2lvbiA9IGloLT5paF92ZXJzaW9uOyAvKiBKRE0gRW5kaWFuIHNhZmUsIGJvdGggbGUgKi8KKworCSAgICBpZiAoaXNfZGlyZWN0X2xlX2loIChpaCkpIHsKKwkJc2V0X2xlX2loX2tfb2Zmc2V0ICgmbl9paCwgbGVfaWhfa19vZmZzZXQgKGloKSArIGloX2l0ZW1fbGVuKGloKSAtIGNweV9ieXRlcyk7CisJCXNldF9sZV9paF9rX3R5cGUgKCZuX2loLCBUWVBFX0RJUkVDVCk7CisJCXNldF9paF9mcmVlX3NwYWNlICgmbl9paCwgTUFYX1VTX0lOVCk7CisJICAgIH0gZWxzZSB7CisJCS8qIGluZGlyZWN0IGl0ZW0gKi8KKwkJUkZBTFNFKCAhY3B5X2J5dGVzICYmIGdldF9paF9mcmVlX3NwYWNlIChpaCksCisJCSAgICAgICAgInZzLTEwMjAwOiBpaC0+aWhfZnJlZV9zcGFjZSBtdXN0IGJlIDAgd2hlbiBpbmRpcmVjdCBpdGVtIHdpbGwgYmUgYXBwZW5kZWQiKTsKKwkJc2V0X2xlX2loX2tfb2Zmc2V0ICgmbl9paCwgbGVfaWhfa19vZmZzZXQgKGloKSArIChpaF9pdGVtX2xlbihpaCkgLSBjcHlfYnl0ZXMpIC8gVU5GTV9QX1NJWkUgKiBkZXN0LT5iX3NpemUpOworCQlzZXRfbGVfaWhfa190eXBlICgmbl9paCwgVFlQRV9JTkRJUkVDVCk7CisJCXNldF9paF9mcmVlX3NwYWNlICgmbl9paCwgZ2V0X2loX2ZyZWVfc3BhY2UgKGloKSk7CisJICAgIH0KKyAgICAgIAorCSAgICAvKiBzZXQgaXRlbSBsZW5ndGggKi8KKwkgICAgcHV0X2loX2l0ZW1fbGVuKCAmbl9paCwgY3B5X2J5dGVzICk7CisKKwkgICAgbl9paC5paF92ZXJzaW9uID0gaWgtPmloX3ZlcnNpb247IC8qIEpETSBFbmRpYW4gc2FmZSwgYm90aCBsZSAqLworCisJICAgIGxlYWZfaW5zZXJ0X2ludG9fYnVmIChkZXN0X2JpLCAwLCAmbl9paCwgQl9OX1BJVEVNKHNyYyxpdGVtX251bSkgKyBpaF9pdGVtX2xlbihpaCkgLSBjcHlfYnl0ZXMsIDApOworCX0KKyAgICB9Cit9CisKKworLyogSWYgY3B5X2J5dGVzIGVxdWFscyBtaW51cyBvbmUgdGhhbiBjb3B5IGNweV9udW0gd2hvbGUgaXRlbXMgZnJvbSBTT1VSQ0UgdG8gREVTVC4KKyAgIElmIGNweV9ieXRlcyBub3QgZXF1YWwgdG8gbWludXMgb25lIHRoYW4gY29weSBjcHlfbnVtLTEgd2hvbGUgaXRlbXMgZnJvbSBTT1VSQ0UgdG8gREVTVC4KKyAgIEZyb20gbGFzdCBpdGVtIGNvcHkgY3B5X251bSBieXRlcyBmb3IgcmVndWxhciBpdGVtIGFuZCBjcHlfbnVtIGRpcmVjdG9yeSBlbnRyaWVzIGZvcgorICAgZGlyZWN0b3J5IGl0ZW0uICovCitzdGF0aWMgaW50IGxlYWZfY29weV9pdGVtcyAoc3RydWN0IGJ1ZmZlcl9pbmZvICogZGVzdF9iaSwgc3RydWN0IGJ1ZmZlcl9oZWFkICogc3JjLCBpbnQgbGFzdF9maXJzdCwgaW50IGNweV9udW0sCisJCQkgICAgaW50IGNweV9ieXRlcykKK3sKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICogZGVzdDsKKyAgaW50IHBvcywgaSwgc3JjX25yX2l0ZW0sIGJ5dGVzOworCisgIGRlc3QgPSBkZXN0X2JpLT5iaV9iaDsKKyAgUkZBTFNFKCAhZGVzdCB8fCAhc3JjLCAidnMtMTAyMTA6ICFkZXN0IHx8ICFzcmMiKTsKKyAgUkZBTFNFKCBsYXN0X2ZpcnN0ICE9IEZJUlNUX1RPX0xBU1QgJiYgbGFzdF9maXJzdCAhPSBMQVNUX1RPX0ZJUlNULAorCSAgInZzLTEwMjIwOmxhc3RfZmlyc3QgIT0gRklSU1RfVE9fTEFTVCAmJiBsYXN0X2ZpcnN0ICE9IExBU1RfVE9fRklSU1QiKTsKKyAgUkZBTFNFKCBCX05SX0lURU1TKHNyYykgPCBjcHlfbnVtLAorCSAgInZzLTEwMjMwOiBObyBlbm91Z2ggaXRlbXM6ICVkLCByZXEuICVkIiwgQl9OUl9JVEVNUyhzcmMpLCBjcHlfbnVtKTsKKyAgUkZBTFNFKCBjcHlfbnVtIDwgMCwidnMtMTAyNDA6IGNweV9udW0gPCAwICglZCkiLCBjcHlfbnVtKTsKKworIGlmICggY3B5X251bSA9PSAwICkKKyAgIHJldHVybiAwOworIAorIGlmICggbGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUICkgeworICAgLyogY29weSBpdGVtcyB0byBsZWZ0ICovCisgICBwb3MgPSAwOworICAgaWYgKCBjcHlfbnVtID09IDEgKQorICAgICBieXRlcyA9IGNweV9ieXRlczsKKyAgIGVsc2UKKyAgICAgYnl0ZXMgPSAtMTsKKyAgIAorICAgLyogY29weSB0aGUgZmlyc3QgaXRlbSBvciBpdCBwYXJ0IG9yIG5vdGhpbmcgdG8gdGhlIGVuZCBvZiB0aGUgREVTVCAoaSA9IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtKERFU1QsU09VUkNFLDAsYnl0ZXMpKSAqLworICAgaSA9IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtIChkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsIGJ5dGVzKTsKKyAgIGNweV9udW0gLT0gaTsKKyAgIGlmICggY3B5X251bSA9PSAwICkKKyAgICAgcmV0dXJuIGk7CisgICBwb3MgKz0gaTsKKyAgIGlmICggY3B5X2J5dGVzID09IC0xICkKKyAgICAgLyogY29weSBmaXJzdCBjcHlfbnVtIGl0ZW1zIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gJ3Bvcycgb2YgU09VUkNFIHRvIGVuZCBvZiBERVNUICovCisgICAgIGxlYWZfY29weV9pdGVtc19lbnRpcmVseSAoZGVzdF9iaSwgc3JjLCBGSVJTVF9UT19MQVNULCBwb3MsIGNweV9udW0pOworICAgZWxzZSB7CisgICAgIC8qIGNvcHkgZmlyc3QgY3B5X251bS0xIGl0ZW1zIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gJ3Bvcy0xJyBvZiB0aGUgU09VUkNFIHRvIHRoZSBlbmQgb2YgdGhlIERFU1QgKi8KKyAgICAgbGVhZl9jb3B5X2l0ZW1zX2VudGlyZWx5IChkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsIHBvcywgY3B5X251bS0xKTsKKwkgICAgIAorICAgICAvKiBjb3B5IHBhcnQgb2YgdGhlIGl0ZW0gd2hpY2ggbnVtYmVyIGlzIGNweV9udW0rcG9zLTEgdG8gdGhlIGVuZCBvZiB0aGUgREVTVCAqLworICAgICBsZWFmX2l0ZW1fYm90dGxlIChkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsIGNweV9udW0rcG9zLTEsIGNweV9ieXRlcyk7CisgICB9IAorIH0gZWxzZSB7CisgICAvKiBjb3B5IGl0ZW1zIHRvIHJpZ2h0ICovCisgICBzcmNfbnJfaXRlbSA9IEJfTlJfSVRFTVMgKHNyYyk7CisgICBpZiAoIGNweV9udW0gPT0gMSApCisgICAgIGJ5dGVzID0gY3B5X2J5dGVzOworICAgZWxzZQorICAgICBieXRlcyA9IC0xOworICAgCisgICAvKiBjb3B5IHRoZSBsYXN0IGl0ZW0gb3IgaXQgcGFydCBvciBub3RoaW5nIHRvIHRoZSBiZWdpbiBvZiB0aGUgREVTVCAoaSA9IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtKERFU1QsU09VUkNFLDEsYnl0ZXMpKTsgKi8KKyAgIGkgPSBsZWFmX2NvcHlfYm91bmRhcnlfaXRlbSAoZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULCBieXRlcyk7CisgICAKKyAgIGNweV9udW0gLT0gaTsKKyAgIGlmICggY3B5X251bSA9PSAwICkKKyAgICAgcmV0dXJuIGk7CisgICAKKyAgIHBvcyA9IHNyY19ucl9pdGVtIC0gY3B5X251bSAtIGk7CisgICBpZiAoIGNweV9ieXRlcyA9PSAtMSApIHsKKyAgICAgLyogc3RhcnRpbmcgZnJvbSBwb3NpdGlvbiAncG9zJyBjb3B5IGxhc3QgY3B5X251bSBpdGVtcyBvZiBTT1VSQ0UgdG8gYmVnaW4gb2YgREVTVCAqLworICAgICBsZWFmX2NvcHlfaXRlbXNfZW50aXJlbHkgKGRlc3RfYmksIHNyYywgTEFTVF9UT19GSVJTVCwgcG9zLCBjcHlfbnVtKTsKKyAgIH0gZWxzZSB7CisgICAgIC8qIGNvcHkgbGFzdCBjcHlfbnVtLTEgaXRlbXMgc3RhcnRpbmcgZnJvbSBwb3NpdGlvbiAncG9zKzEnIG9mIHRoZSBTT1VSQ0UgdG8gdGhlIGJlZ2luIG9mIHRoZSBERVNUOyAqLworICAgICBsZWFmX2NvcHlfaXRlbXNfZW50aXJlbHkgKGRlc3RfYmksIHNyYywgTEFTVF9UT19GSVJTVCwgcG9zKzEsIGNweV9udW0tMSk7CisKKyAgICAgLyogY29weSBwYXJ0IG9mIHRoZSBpdGVtIHdoaWNoIG51bWJlciBpcyBwb3MgdG8gdGhlIGJlZ2luIG9mIHRoZSBERVNUICovCisgICAgIGxlYWZfaXRlbV9ib3R0bGUgKGRlc3RfYmksIHNyYywgTEFTVF9UT19GSVJTVCwgcG9zLCBjcHlfYnl0ZXMpOworICAgfQorIH0KKyByZXR1cm4gaTsKK30KKworCisvKiB0aGVyZSBhcmUgdHlwZXMgb2YgY29waW5nOiBmcm9tIFNbMF0gdG8gTFswXSwgZnJvbSBTWzBdIHRvIFJbMF0sCisgICBmcm9tIFJbMF0gdG8gTFswXS4gZm9yIGVhY2ggb2YgdGhlc2Ugd2UgaGF2ZSB0byBkZWZpbmUgcGFyZW50IGFuZAorICAgcG9zaXRpb25zIG9mIGRlc3RpbmF0aW9uIGFuZCBzb3VyY2UgYnVmZmVycyAqLworc3RhdGljIHZvaWQgbGVhZl9kZWZpbmVfZGVzdF9zcmNfaW5mb3MgKGludCBzaGlmdF9tb2RlLCBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIHN0cnVjdCBidWZmZXJfaW5mbyAqIGRlc3RfYmksCisJCQkJCXN0cnVjdCBidWZmZXJfaW5mbyAqIHNyY19iaSwgaW50ICogZmlyc3RfbGFzdCwKKwkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICogU25ldykKK3sKKyAgICBtZW1zZXQgKGRlc3RfYmksIDAsIHNpemVvZiAoc3RydWN0IGJ1ZmZlcl9pbmZvKSk7CisgICAgbWVtc2V0IChzcmNfYmksIDAsIHNpemVvZiAoc3RydWN0IGJ1ZmZlcl9pbmZvKSk7CisKKyAgICAvKiBkZWZpbmUgZGVzdCwgc3JjLCBkZXN0IHBhcmVudCwgZGVzdCBwb3NpdGlvbiAqLworICAgIHN3aXRjaCAoc2hpZnRfbW9kZSkgeworICAgIGNhc2UgTEVBRl9GUk9NX1NfVE9fTDogICAgLyogaXQgaXMgdXNlZCBpbiBsZWFmX3NoaWZ0X2xlZnQgKi8KKwlzcmNfYmktPnRiID0gdGI7CisJc3JjX2JpLT5iaV9iaCA9IFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCk7CisJc3JjX2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApOworCXNyY19iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfQl9JVEVNX09SREVSICh0Yi0+dGJfcGF0aCwgMCk7CS8qIHNyYy0+Yl9pdGVtX29yZGVyICovCisJZGVzdF9iaS0+dGIgPSB0YjsKKwlkZXN0X2JpLT5iaV9iaCA9IHRiLT5MWzBdOworCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GTFswXTsKKwlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7CisJKmZpcnN0X2xhc3QgPSBGSVJTVF9UT19MQVNUOworCWJyZWFrOworCisgICAgY2FzZSBMRUFGX0ZST01fU19UT19SOiAgLyogaXQgaXMgdXNlZCBpbiBsZWFmX3NoaWZ0X3JpZ2h0ICovCisJc3JjX2JpLT50YiA9IHRiOworCXNyY19iaS0+YmlfYmggPSBQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpOworCXNyY19iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKTsKKwlzcmNfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX0JfSVRFTV9PUkRFUiAodGItPnRiX3BhdGgsIDApOworCWRlc3RfYmktPnRiID0gdGI7CisJZGVzdF9iaS0+YmlfYmggPSB0Yi0+UlswXTsKKwlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07CisJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKKwkqZmlyc3RfbGFzdCA9IExBU1RfVE9fRklSU1Q7CisJYnJlYWs7CisKKyAgICBjYXNlIExFQUZfRlJPTV9SX1RPX0w6ICAvKiBpdCBpcyB1c2VkIGluIGJhbGFuY2VfbGVhZl93aGVuX2RlbGV0ZSAqLworCXNyY19iaS0+dGIgPSB0YjsKKwlzcmNfYmktPmJpX2JoID0gdGItPlJbMF07CisJc3JjX2JpLT5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07CisJc3JjX2JpLT5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOworCWRlc3RfYmktPnRiID0gdGI7CisJZGVzdF9iaS0+YmlfYmggPSB0Yi0+TFswXTsKKwlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07CisJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOworCSpmaXJzdF9sYXN0ID0gRklSU1RfVE9fTEFTVDsKKwlicmVhazsKKyAgICAKKyAgICBjYXNlIExFQUZfRlJPTV9MX1RPX1I6ICAvKiBpdCBpcyB1c2VkIGluIGJhbGFuY2VfbGVhZl93aGVuX2RlbGV0ZSAqLworCXNyY19iaS0+dGIgPSB0YjsKKwlzcmNfYmktPmJpX2JoID0gdGItPkxbMF07CisJc3JjX2JpLT5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07CisJc3JjX2JpLT5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7CisJZGVzdF9iaS0+dGIgPSB0YjsKKwlkZXN0X2JpLT5iaV9iaCA9IHRiLT5SWzBdOworCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GUlswXTsKKwlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOworCSpmaXJzdF9sYXN0ID0gTEFTVF9UT19GSVJTVDsKKwlicmVhazsKKworICAgIGNhc2UgTEVBRl9GUk9NX1NfVE9fU05FVzoKKwlzcmNfYmktPnRiID0gdGI7CisJc3JjX2JpLT5iaV9iaCA9IFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCk7CisJc3JjX2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApOworCXNyY19iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfQl9JVEVNX09SREVSICh0Yi0+dGJfcGF0aCwgMCk7CisJZGVzdF9iaS0+dGIgPSB0YjsKKwlkZXN0X2JpLT5iaV9iaCA9IFNuZXc7CisJZGVzdF9iaS0+YmlfcGFyZW50ID0gTlVMTDsKKwlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IDA7CisJKmZpcnN0X2xhc3QgPSBMQVNUX1RPX0ZJUlNUOworCWJyZWFrOworICAgIAorICAgIGRlZmF1bHQ6CisJcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJ2cy0xMDI1MDogbGVhZl9kZWZpbmVfZGVzdF9zcmNfaW5mb3M6IHNoaWZ0IHR5cGUgaXMgdW5rbm93biAoJWQpIiwgc2hpZnRfbW9kZSk7CisgICAgfQorICAgIFJGQUxTRSggc3JjX2JpLT5iaV9iaCA9PSAwIHx8IGRlc3RfYmktPmJpX2JoID09IDAsCisJICAgICJ2cy0xMDI2MDogbW9kZT09JWQsIHNvdXJjZSAoJXApIG9yIGRlc3QgKCVwKSBidWZmZXIgaXMgaW5pdGlhbGl6ZWQgaW5jb3JyZWN0bHkiLAorCSAgICBzaGlmdF9tb2RlLCBzcmNfYmktPmJpX2JoLCBkZXN0X2JpLT5iaV9iaCk7Cit9CisKKworCisKKy8qIGNvcHkgbW92X251bSBpdGVtcyBhbmQgbW92X2J5dGVzIG9mIHRoZSAobW92X251bS0xKXRoIGl0ZW0gdG8KKyAgIG5laWdoYm9yLiBEZWxldGUgdGhlbSBmcm9tIHNvdXJjZSAqLworaW50IGxlYWZfbW92ZV9pdGVtcyAoaW50IHNoaWZ0X21vZGUsIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IG1vdl9udW0sIGludCBtb3ZfYnl0ZXMsIHN0cnVjdCBidWZmZXJfaGVhZCAqIFNuZXcpCit7CisgIGludCByZXRfdmFsdWU7CisgIHN0cnVjdCBidWZmZXJfaW5mbyBkZXN0X2JpLCBzcmNfYmk7CisgIGludCBmaXJzdF9sYXN0OworCisgIGxlYWZfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zIChzaGlmdF9tb2RlLCB0YiwgJmRlc3RfYmksICZzcmNfYmksICZmaXJzdF9sYXN0LCBTbmV3KTsKKworICByZXRfdmFsdWUgPSBsZWFmX2NvcHlfaXRlbXMgKCZkZXN0X2JpLCBzcmNfYmkuYmlfYmgsIGZpcnN0X2xhc3QsIG1vdl9udW0sIG1vdl9ieXRlcyk7CisKKyAgbGVhZl9kZWxldGVfaXRlbXMgKCZzcmNfYmksIGZpcnN0X2xhc3QsIChmaXJzdF9sYXN0ID09IEZJUlNUX1RPX0xBU1QpID8gMCA6IChCX05SX0lURU1TKHNyY19iaS5iaV9iaCkgLSBtb3ZfbnVtKSwgbW92X251bSwgbW92X2J5dGVzKTsKKworICAKKyAgcmV0dXJuIHJldF92YWx1ZTsKK30KKworCisvKiBTaGlmdCBzaGlmdF9udW0gaXRlbXMgKGFuZCBzaGlmdF9ieXRlcyBvZiBsYXN0IHNoaWZ0ZWQgaXRlbSBpZiBzaGlmdF9ieXRlcyAhPSAtMSkKKyAgIGZyb20gU1swXSB0byBMWzBdIGFuZCByZXBsYWNlIHRoZSBkZWxpbWl0aW5nIGtleSAqLworaW50IGxlYWZfc2hpZnRfbGVmdCAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgc2hpZnRfbnVtLCBpbnQgc2hpZnRfYnl0ZXMpCit7CisgIHN0cnVjdCBidWZmZXJfaGVhZCAqIFMwID0gUEFUSF9QTEFTVF9CVUZGRVIgKHRiLT50Yl9wYXRoKTsKKyAgaW50IGk7CisKKyAgLyogbW92ZSBzaGlmdF9udW0gKGFuZCBzaGlmdF9ieXRlcyBieXRlcykgaXRlbXMgZnJvbSBTWzBdIHRvIGxlZnQgbmVpZ2hib3IgTFswXSAqLworICBpID0gbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19MLCB0Yiwgc2hpZnRfbnVtLCBzaGlmdF9ieXRlcywgTlVMTCk7CisKKyAgaWYgKCBzaGlmdF9udW0gKSB7CisgICAgaWYgKEJfTlJfSVRFTVMgKFMwKSA9PSAwKSB7IC8qIG51bWJlciBvZiBpdGVtcyBpbiBTWzBdID09IDAgKi8KKworICAgICAgUkZBTFNFKCBzaGlmdF9ieXRlcyAhPSAtMSwKKwkgICAgICAidnMtMTAyNzA6IFMwIGlzIGVtcHR5IG5vdywgYnV0IHNoaWZ0X2J5dGVzICE9IC0xICglZCkiLCAKKwkgICAgICBzaGlmdF9ieXRlcyk7CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisgICAgICBpZiAodGItPnRiX21vZGUgPT0gTV9QQVNURSB8fCB0Yi0+dGJfbW9kZSA9PSBNX0lOU0VSVCkgeworCXByaW50X2N1cl90YiAoInZzLTEwMjc1Iik7CisJcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgInZzLTEwMjc1OiBsZWFmX3NoaWZ0X2xlZnQ6IGJhbGFuY2UgY29uZGl0aW9uIGNvcnJ1cHRlZCAoJWMpIiwgdGItPnRiX21vZGUpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGlmIChQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxKSA9PSAwKQorCXJlcGxhY2Vfa2V5ICh0YiwgdGItPkNGTFswXSwgdGItPmxrZXlbMF0sIFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgMCksIDApOworCisgICAgfSBlbHNlIHsgICAgIAorICAgICAgLyogcmVwbGFjZSBsa2V5IGluIENGTFswXSBieSAwLXRoIGtleSBmcm9tIFNbMF07ICovCisgICAgICByZXBsYWNlX2tleSAodGIsIHRiLT5DRkxbMF0sIHRiLT5sa2V5WzBdLCBTMCwgMCk7CisgICAgICAKKyAgICAgIFJGQUxTRSggKHNoaWZ0X2J5dGVzICE9IC0xICYmCisgICAgICAgICAgICAgICEoaXNfZGlyZW50cnlfbGVfaWggKEJfTl9QSVRFTV9IRUFEIChTMCwgMCkpCisgICAgICAgICAgICAgICAgJiYgIUlfRU5UUllfQ09VTlQgKEJfTl9QSVRFTV9IRUFEIChTMCwgMCkpKSkgJiYKKwkgICAgICAoIW9wX2lzX2xlZnRfbWVyZ2VhYmxlIChCX05fUEtFWSAoUzAsIDApLCBTMC0+Yl9zaXplKSksCisJICAgICAgInZzLTEwMjgwOiBpdGVtIG11c3QgYmUgbWVyZ2VhYmxlIik7CisgICAgfQorICB9CisgIAorICByZXR1cm4gaTsKK30KKworCisKKworCisvKiBDTEVBTklORyBTVE9QUEVEIEhFUkUgKi8KKworCisKKworLyogU2hpZnQgc2hpZnRfbnVtIChzaGlmdF9ieXRlcykgaXRlbXMgZnJvbSBTWzBdIHRvIHRoZSByaWdodCBuZWlnaGJvciwgYW5kIHJlcGxhY2UgdGhlIGRlbGltaXRpbmcga2V5ICovCitpbnQJbGVhZl9zaGlmdF9yaWdodCgKKwkJc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCAKKwkJaW50IHNoaWZ0X251bSwKKwkJaW50IHNoaWZ0X2J5dGVzCisJKQoreworICAvLyAgc3RydWN0IGJ1ZmZlcl9oZWFkICogUzAgPSBQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpOworICBpbnQgcmV0X3ZhbHVlOworCisgIC8qIG1vdmUgc2hpZnRfbnVtIChhbmQgc2hpZnRfYnl0ZXMpIGl0ZW1zIGZyb20gU1swXSB0byByaWdodCBuZWlnaGJvciBSWzBdICovCisgIHJldF92YWx1ZSA9IGxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX1NfVE9fUiwgdGIsIHNoaWZ0X251bSwgc2hpZnRfYnl0ZXMsIE5VTEwpOworCisgIC8qIHJlcGxhY2UgcmtleSBpbiBDRlJbMF0gYnkgdGhlIDAtdGgga2V5IGZyb20gUlswXSAqLworICBpZiAoc2hpZnRfbnVtKSB7CisgICAgcmVwbGFjZV9rZXkgKHRiLCB0Yi0+Q0ZSWzBdLCB0Yi0+cmtleVswXSwgdGItPlJbMF0sIDApOworCisgIH0KKworICByZXR1cm4gcmV0X3ZhbHVlOworfQorCisKKworc3RhdGljIHZvaWQgbGVhZl9kZWxldGVfaXRlbXNfZW50aXJlbHkgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGJpLAorCQkJCQlpbnQgZmlyc3QsIGludCBkZWxfbnVtKTsKKy8qICBJZiBkZWxfYnl0ZXMgPT0gLTEsIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gJ2ZpcnN0JyBkZWxldGUgZGVsX251bSBpdGVtcyBpbiB3aG9sZSBpbiBidWZmZXIgQ1VSLgorICAgIElmIG5vdC4gCisgICAgSWYgbGFzdF9maXJzdCA9PSAwLiBTdGFydGluZyBmcm9tIHBvc2l0aW9uICdmaXJzdCcgZGVsZXRlIGRlbF9udW0tMSBpdGVtcyBpbiB3aG9sZS4gRGVsZXRlIHBhcnQgb2YgYm9keSBvZgorICAgIHRoZSBmaXJzdCBpdGVtLiBQYXJ0IGRlZmluZWQgYnkgZGVsX2J5dGVzLiBEb24ndCBkZWxldGUgZmlyc3QgaXRlbSBoZWFkZXIKKyAgICBJZiBsYXN0X2ZpcnN0ID09IDEuIFN0YXJ0aW5nIGZyb20gcG9zaXRpb24gJ2ZpcnN0KzEnIGRlbGV0ZSBkZWxfbnVtLTEgaXRlbXMgaW4gd2hvbGUuIERlbGV0ZSBwYXJ0IG9mIGJvZHkgb2YKKyAgICB0aGUgbGFzdCBpdGVtIC4gUGFydCBkZWZpbmVkIGJ5IGRlbF9ieXRlcy4gRG9uJ3QgZGVsZXRlIGxhc3QgaXRlbSBoZWFkZXIuCisqLwordm9pZCBsZWFmX2RlbGV0ZV9pdGVtcyAoc3RydWN0IGJ1ZmZlcl9pbmZvICogY3VyX2JpLCBpbnQgbGFzdF9maXJzdCwgCisJCQlpbnQgZmlyc3QsIGludCBkZWxfbnVtLCBpbnQgZGVsX2J5dGVzKQoreworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworICAgIGludCBpdGVtX2Ftb3VudCA9IEJfTlJfSVRFTVMgKGJoID0gY3VyX2JpLT5iaV9iaCk7CisKKyAgICBSRkFMU0UoICFiaCwgIjEwMTU1OiBiaCBpcyBub3QgZGVmaW5lZCIpOworICAgIFJGQUxTRSggZGVsX251bSA8IDAsICIxMDE2MDogZGVsX251bSBjYW4gbm90IGJlIDwgMC4gZGVsX251bT09JWQiLCBkZWxfbnVtKTsKKyAgICBSRkFMU0UoIGZpcnN0IDwgMCB8fCBmaXJzdCArIGRlbF9udW0gPiBpdGVtX2Ftb3VudCwKKwkgICAgIjEwMTY1OiBpbnZhbGlkIG51bWJlciBvZiBmaXJzdCBpdGVtIHRvIGJlIGRlbGV0ZWQgKCVkKSBvciAiCisJICAgICJubyBzbyBtdWNoIGl0ZW1zICglZCkgdG8gZGVsZXRlIChvbmx5ICVkKSIsIAorCSAgICBmaXJzdCwgZmlyc3QgKyBkZWxfbnVtLCBpdGVtX2Ftb3VudCk7CisKKyAgICBpZiAoIGRlbF9udW0gPT0gMCApCisJcmV0dXJuOworCisgICAgaWYgKCBmaXJzdCA9PSAwICYmIGRlbF9udW0gPT0gaXRlbV9hbW91bnQgJiYgZGVsX2J5dGVzID09IC0xICkgeworCW1ha2VfZW1wdHlfbm9kZSAoY3VyX2JpKTsKKwlkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoY3VyX2JpLT50YiwgYmgsIDApOworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIGRlbF9ieXRlcyA9PSAtMSApCisJLyogZGVsZXRlIGRlbF9udW0gaXRlbXMgYmVnaW5uaW5nIGZyb20gaXRlbSBpbiBwb3NpdGlvbiBmaXJzdCAqLworCWxlYWZfZGVsZXRlX2l0ZW1zX2VudGlyZWx5IChjdXJfYmksIGZpcnN0LCBkZWxfbnVtKTsKKyAgICBlbHNlIHsKKwlpZiAoIGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCApIHsKKwkgICAgLyogZGVsZXRlIGRlbF9udW0tMSBpdGVtcyBiZWdpbm5pbmcgZnJvbSBpdGVtIGluIHBvc2l0aW9uIGZpcnN0ICAqLworCSAgICBsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseSAoY3VyX2JpLCBmaXJzdCwgZGVsX251bS0xKTsKKworCSAgICAvKiBkZWxldGUgdGhlIHBhcnQgb2YgdGhlIGZpcnN0IGl0ZW0gb2YgdGhlIGJoCisJICAgICAgIGRvIG5vdCBkZWxldGUgaXRlbSBoZWFkZXIKKwkgICAgKi8KKwkgICAgbGVhZl9jdXRfZnJvbV9idWZmZXIgKGN1cl9iaSwgMCwgMCwgZGVsX2J5dGVzKTsKKwl9IGVsc2UgIHsKKwkgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOworCSAgICBpbnQgbGVuOworCisJICAgIC8qIGRlbGV0ZSBkZWxfbnVtLTEgaXRlbXMgYmVnaW5uaW5nIGZyb20gaXRlbSBpbiBwb3NpdGlvbiBmaXJzdCsxICAqLworCSAgICBsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseSAoY3VyX2JpLCBmaXJzdCsxLCBkZWxfbnVtLTEpOworCisJICAgIGlmIChpc19kaXJlbnRyeV9sZV9paCAoaWggPSBCX05fUElURU1fSEVBRChiaCwgQl9OUl9JVEVNUyhiaCktMSkpKSAJLyogdGhlIGxhc3QgaXRlbSBpcyBkaXJlY3RvcnkgICovCisJICAgICAgICAvKiBsZW4gPSBudW1iZXJzIG9mIGRpcmVjdG9yeSBlbnRyaWVzIGluIHRoaXMgaXRlbSAqLworCQlsZW4gPSBpaF9lbnRyeV9jb3VudChpaCk7CisJICAgIGVsc2UKKwkgICAgICAgIC8qIGxlbiA9IGJvZHkgbGVuIG9mIGl0ZW0gKi8KKwkJbGVuID0gaWhfaXRlbV9sZW4oaWgpOworCisJICAgIC8qIGRlbGV0ZSB0aGUgcGFydCBvZiB0aGUgbGFzdCBpdGVtIG9mIHRoZSBiaCAKKwkgICAgICAgZG8gbm90IGRlbGV0ZSBpdGVtIGhlYWRlcgorCSAgICAqLworCSAgICBsZWFmX2N1dF9mcm9tX2J1ZmZlciAoY3VyX2JpLCBCX05SX0lURU1TKGJoKS0xLCBsZW4gLSBkZWxfYnl0ZXMsIGRlbF9ieXRlcyk7CisJfQorICAgIH0KK30KKworCisvKiBpbnNlcnQgaXRlbSBpbnRvIHRoZSBsZWFmIG5vZGUgaW4gcG9zaXRpb24gYmVmb3JlICovCit2b2lkIGxlYWZfaW5zZXJ0X2ludG9fYnVmIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBiaSwgaW50IGJlZm9yZSwKKwkJCSAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpbnNlcnRlZF9pdGVtX2loLAorCQkJICAgY29uc3QgY2hhciAqIGluc2VydGVkX2l0ZW1fYm9keSwKKwkJCSAgIGludCB6ZXJvc19udW1iZXIpCit7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggPSBiaS0+YmlfYmg7CisgICAgaW50IG5yLCBmcmVlX3NwYWNlOworICAgIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7CisgICAgaW50IGk7CisgICAgaW50IGxhc3RfbG9jLCB1bm1vdmVkX2xvYzsKKyAgICBjaGFyICogdG87CisKKworICAgIGJsa2ggPSBCX0JMS19IRUFEKGJoKTsKKyAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKKyAgICBmcmVlX3NwYWNlID0gYmxraF9mcmVlX3NwYWNlKCBibGtoICk7CisKKyAgICAvKiBjaGVjayBmcmVlIHNwYWNlICovCisgICAgUkZBTFNFKCBmcmVlX3NwYWNlIDwgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCkgKyBJSF9TSVpFLAorICAgICAgICAgICAgInZzLTEwMTcwOiBub3QgZW5vdWdoIGZyZWUgc3BhY2UgaW4gYmxvY2sgJXosIG5ldyBpdGVtICVoIiwKKyAgICAgICAgICAgIGJoLCBpbnNlcnRlZF9pdGVtX2loKTsKKyAgICBSRkFMU0UoIHplcm9zX251bWJlciA+IGloX2l0ZW1fbGVuKGluc2VydGVkX2l0ZW1faWgpLAorCSAgICAidnMtMTAxNzI6IHplcm8gbnVtYmVyID09ICVkLCBpdGVtIGxlbmd0aCA9PSAlZCIsCisgICAgICAgICAgICB6ZXJvc19udW1iZXIsIGloX2l0ZW1fbGVuKGluc2VydGVkX2l0ZW1faWgpKTsKKworCisgICAgLyogZ2V0IGl0ZW0gbmV3IGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBiZWZvcmUgKi8KKyAgICBpaCA9IEJfTl9QSVRFTV9IRUFEIChiaCwgYmVmb3JlKTsKKworICAgIC8qIHByZXBhcmUgc3BhY2UgZm9yIHRoZSBib2R5IG9mIG5ldyBpdGVtICovCisgICAgbGFzdF9sb2MgPSBuciA/IGloX2xvY2F0aW9uKCAmKGloW25yIC0gYmVmb3JlIC0gMV0pICkgOiBiaC0+Yl9zaXplOworICAgIHVubW92ZWRfbG9jID0gYmVmb3JlID8gaWhfbG9jYXRpb24oIGloLTEgKSA6IGJoLT5iX3NpemU7CisKKworICAgIG1lbW1vdmUgKGJoLT5iX2RhdGEgKyBsYXN0X2xvYyAtIGloX2l0ZW1fbGVuKGluc2VydGVkX2l0ZW1faWgpLCAKKwkgICAgIGJoLT5iX2RhdGEgKyBsYXN0X2xvYywgdW5tb3ZlZF9sb2MgLSBsYXN0X2xvYyk7CisKKyAgICB0byA9IGJoLT5iX2RhdGEgKyB1bm1vdmVkX2xvYyAtIGloX2l0ZW1fbGVuKGluc2VydGVkX2l0ZW1faWgpOworICAgIG1lbXNldCAodG8sIDAsIHplcm9zX251bWJlcik7CisgICAgdG8gKz0gemVyb3NfbnVtYmVyOworCisgICAgLyogY29weSBib2R5IHRvIHByZXBhcmVkIHNwYWNlICovCisgICAgaWYgKGluc2VydGVkX2l0ZW1fYm9keSkKKwltZW1tb3ZlICh0bywgaW5zZXJ0ZWRfaXRlbV9ib2R5LCBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loKSAtIHplcm9zX251bWJlcik7CisgICAgZWxzZQorCW1lbXNldCh0bywgJ1wwJywgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCkgLSB6ZXJvc19udW1iZXIpOworICAKKyAgICAvKiBpbnNlcnQgaXRlbSBoZWFkZXIgKi8KKyAgICBtZW1tb3ZlIChpaCArIDEsIGloLCBJSF9TSVpFICogKG5yIC0gYmVmb3JlKSk7CisgICAgbWVtbW92ZSAoaWgsIGluc2VydGVkX2l0ZW1faWgsIElIX1NJWkUpOworICAKKyAgICAvKiBjaGFuZ2UgbG9jYXRpb25zICovCisgICAgZm9yIChpID0gYmVmb3JlOyBpIDwgbnIgKyAxOyBpICsrKQorICAgIHsKKyAgICAgICAgdW5tb3ZlZF9sb2MgLT0gaWhfaXRlbV9sZW4oICYoaWhbaS1iZWZvcmVdKSk7CisJcHV0X2loX2xvY2F0aW9uKCAmKGloW2ktYmVmb3JlXSksIHVubW92ZWRfbG9jICk7CisgICAgfQorICAKKyAgICAvKiBzaXplcywgZnJlZSBzcGFjZSwgaXRlbSBudW1iZXIgKi8KKyAgICBzZXRfYmxraF9ucl9pdGVtKCBibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgKyAxICk7CisgICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwKKyAgICAgICAgICAgICAgICAgICAgZnJlZV9zcGFjZSAtIChJSF9TSVpFICsgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCApICkgKTsKKyAgICBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoYmktPnRiLCBiaCwgMSk7CisKKyAgICBpZiAoYmktPmJpX3BhcmVudCkgeyAKKwlzdHJ1Y3QgZGlza19jaGlsZCAqdF9kYzsKKwl0X2RjID0gQl9OX0NISUxEIChiaS0+YmlfcGFyZW50LCBiaS0+YmlfcG9zaXRpb24pOworCXB1dF9kY19zaXplKCB0X2RjLCBkY19zaXplKHRfZGMpICsgKElIX1NJWkUgKyBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loKSkpOworCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoYmktPnRiLCBiaS0+YmlfcGFyZW50LCAwKTsKKyAgICB9Cit9CisKKworLyogcGFzdGUgcGFzdGVfc2l6ZSBieXRlcyB0byBhZmZlY3RlZF9pdGVtX251bS10aCBpdGVtLiAKKyAgIFdoZW4gaXRlbSBpcyBhIGRpcmVjdG9yeSwgdGhpcyBvbmx5IHByZXBhcmUgc3BhY2UgZm9yIG5ldyBlbnRyaWVzICovCit2b2lkIGxlYWZfcGFzdGVfaW5fYnVmZmVyIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBiaSwgaW50IGFmZmVjdGVkX2l0ZW1fbnVtLAorCQkJICAgaW50IHBvc19pbl9pdGVtLCBpbnQgcGFzdGVfc2l6ZSwKKwkJCSAgIGNvbnN0IGNoYXIgKiBib2R5LAorCQkJICAgaW50IHplcm9zX251bWJlcikKK3sKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCA9IGJpLT5iaV9iaDsKKyAgICBpbnQgbnIsIGZyZWVfc3BhY2U7CisgICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKyAgICBpbnQgaTsKKyAgICBpbnQgbGFzdF9sb2MsIHVubW92ZWRfbG9jOworCisgICAgYmxraCA9IEJfQkxLX0hFQUQoYmgpOworICAgIG5yID0gYmxraF9ucl9pdGVtKGJsa2gpOworICAgIGZyZWVfc3BhY2UgPSBibGtoX2ZyZWVfc3BhY2UoYmxraCk7CisKKworICAgIC8qIGNoZWNrIGZyZWUgc3BhY2UgKi8KKyAgICBSRkFMU0UoIGZyZWVfc3BhY2UgPCBwYXN0ZV9zaXplLAorICAgICAgICAgICAgInZzLTEwMTc1OiBub3QgZW5vdWdoIGZyZWUgc3BhY2U6IG5lZWRlZCAlZCwgYXZhaWxhYmxlICVkIiwKKyAgICAgICAgICAgIHBhc3RlX3NpemUsIGZyZWVfc3BhY2UpOworCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisgICAgaWYgKHplcm9zX251bWJlciA+IHBhc3RlX3NpemUpIHsKKwlwcmludF9jdXJfdGIgKCIxMDE3NyIpOworCXJlaXNlcmZzX3BhbmljICggTlVMTCwgInZzLTEwMTc3OiBsZWFmX3Bhc3RlX2luX2J1ZmZlcjogZXJvIG51bWJlciA9PSAlZCwgcGFzdGVfc2l6ZSA9PSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgemVyb3NfbnVtYmVyLCBwYXN0ZV9zaXplKTsKKyAgICB9CisjZW5kaWYgLyogQ09ORklHX1JFSVNFUkZTX0NIRUNLICovCisKKworICAgIC8qIGl0ZW0gdG8gYmUgYXBwZW5kZWQgKi8KKyAgICBpaCA9IEJfTl9QSVRFTV9IRUFEKGJoLCBhZmZlY3RlZF9pdGVtX251bSk7CisKKyAgICBsYXN0X2xvYyA9IGloX2xvY2F0aW9uKCAmKGloW25yIC0gYWZmZWN0ZWRfaXRlbV9udW0gLSAxXSkgKTsKKyAgICB1bm1vdmVkX2xvYyA9IGFmZmVjdGVkX2l0ZW1fbnVtID8gaWhfbG9jYXRpb24oIGloLTEgKSA6IGJoLT5iX3NpemU7CisKKyAgICAvKiBwcmVwYXJlIHNwYWNlICovCisgICAgbWVtbW92ZSAoYmgtPmJfZGF0YSArIGxhc3RfbG9jIC0gcGFzdGVfc2l6ZSwgYmgtPmJfZGF0YSArIGxhc3RfbG9jLAorCSAgICAgdW5tb3ZlZF9sb2MgLSBsYXN0X2xvYyk7CisKKworICAgIC8qIGNoYW5nZSBsb2NhdGlvbnMgKi8KKyAgICBmb3IgKGkgPSBhZmZlY3RlZF9pdGVtX251bTsgaSA8IG5yOyBpICsrKQorCXB1dF9paF9sb2NhdGlvbiggJihpaFtpLWFmZmVjdGVkX2l0ZW1fbnVtXSksCisgICAgICAgICAgICAgICAgICAgIGloX2xvY2F0aW9uKCAmKGloW2ktYWZmZWN0ZWRfaXRlbV9udW1dKSkgLSBwYXN0ZV9zaXplICk7CisKKyAgICBpZiAoIGJvZHkgKSB7CisJaWYgKCFpc19kaXJlbnRyeV9sZV9paCAoaWgpKSB7CisJICAgIGlmICghcG9zX2luX2l0ZW0pIHsKKwkJLyogc2hpZnQgZGF0YSB0byByaWdodCAqLworCQltZW1tb3ZlIChiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpICsgcGFzdGVfc2l6ZSwgCisJCQkgYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSwgaWhfaXRlbV9sZW4oaWgpKTsKKwkJLyogcGFzdGUgZGF0YSBpbiB0aGUgaGVhZCBvZiBpdGVtICovCisJCW1lbXNldCAoYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSwgMCwgemVyb3NfbnVtYmVyKTsKKwkJbWVtY3B5IChiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpICsgemVyb3NfbnVtYmVyLCBib2R5LCBwYXN0ZV9zaXplIC0gemVyb3NfbnVtYmVyKTsKKwkgICAgfSBlbHNlIHsKKwkJbWVtc2V0IChiaC0+Yl9kYXRhICsgdW5tb3ZlZF9sb2MgLSBwYXN0ZV9zaXplLCAwLCB6ZXJvc19udW1iZXIpOworCQltZW1jcHkgKGJoLT5iX2RhdGEgKyB1bm1vdmVkX2xvYyAtIHBhc3RlX3NpemUgKyB6ZXJvc19udW1iZXIsIGJvZHksIHBhc3RlX3NpemUgLSB6ZXJvc19udW1iZXIpOworCSAgICB9CisJfQorICAgIH0KKyAgICBlbHNlCisJbWVtc2V0KGJoLT5iX2RhdGEgKyB1bm1vdmVkX2xvYyAtIHBhc3RlX3NpemUsICdcMCcsIHBhc3RlX3NpemUpOworCisgICAgcHV0X2loX2l0ZW1fbGVuKCBpaCwgaWhfaXRlbV9sZW4oaWgpICsgcGFzdGVfc2l6ZSApOworCisgICAgLyogY2hhbmdlIGZyZWUgc3BhY2UgKi8KKyAgICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLCBmcmVlX3NwYWNlIC0gcGFzdGVfc2l6ZSApOworCisgICAgZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkgKGJpLT50YiwgYmgsIDApOworCisgICAgaWYgKGJpLT5iaV9wYXJlbnQpIHsgCisJc3RydWN0IGRpc2tfY2hpbGQgKnRfZGMgPSBCX05fQ0hJTEQgKGJpLT5iaV9wYXJlbnQsIGJpLT5iaV9wb3NpdGlvbik7CisJcHV0X2RjX3NpemUoIHRfZGMsIGRjX3NpemUodF9kYykgKyBwYXN0ZV9zaXplICk7CisJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChiaS0+dGIsIGJpLT5iaV9wYXJlbnQsIDApOworICAgIH0KK30KKworCisvKiBjdXRzIERFTF9DT1VOVCBlbnRyaWVzIGJlZ2lubmluZyBmcm9tIEZST00tdGggZW50cnkuIERpcmVjdG9yeSBpdGVtCisgICBkb2VzIG5vdCBoYXZlIGZyZWUgc3BhY2UsIHNvIGl0IG1vdmVzIERFSHMgYW5kIHJlbWFpbmluZyByZWNvcmRzIGFzCisgICBuZWNlc3NhcnkuIFJldHVybiB2YWx1ZSBpcyBzaXplIG9mIHJlbW92ZWQgcGFydCBvZiBkaXJlY3RvcnkgaXRlbQorICAgaW4gYnl0ZXMuICovCitzdGF0aWMgaW50CWxlYWZfY3V0X2VudHJpZXMgKAorCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLAorCQkJCXN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgCisJCQkJaW50IGZyb20sIAorCQkJCWludCBkZWxfY291bnQKKwkJCSkKK3sKKyAgY2hhciAqIGl0ZW07CisgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoOworICBpbnQgcHJldl9yZWNvcmRfb2Zmc2V0OwkvKiBvZmZzZXQgb2YgcmVjb3JkLCB0aGF0IGlzIChmcm9tLTEpdGggKi8KKyAgY2hhciAqIHByZXZfcmVjb3JkOwkJLyogKi8KKyAgaW50IGN1dF9yZWNvcmRzX2xlbjsJCS8qIGxlbmd0aCBvZiBhbGwgcmVtb3ZlZCByZWNvcmRzICovCisgIGludCBpOworCisKKyAgLyogbWFrZSBzdXJlLCB0aGF0IGl0ZW0gaXMgZGlyZWN0b3J5IGFuZCB0aGVyZSBhcmUgZW5vdWdoIGVudHJpZXMgdG8KKyAgICAgcmVtb3ZlICovCisgIFJGQUxTRSggIWlzX2RpcmVudHJ5X2xlX2loIChpaCksICIxMDE4MDogaXRlbSBpcyBub3QgZGlyZWN0b3J5IGl0ZW0iKTsKKyAgUkZBTFNFKCBJX0VOVFJZX0NPVU5UKGloKSA8IGZyb20gKyBkZWxfY291bnQsCisJICAiMTAxODU6IGl0ZW0gY29udGFpbnMgbm90IGVub3VnaCBlbnRyaWVzOiBlbnRyeV9jb3V0ID0gJWQsIGZyb20gPSAlZCwgdG8gZGVsZXRlID0gJWQiLAorCSAgSV9FTlRSWV9DT1VOVChpaCksIGZyb20sIGRlbF9jb3VudCk7CisKKyAgaWYgKGRlbF9jb3VudCA9PSAwKQorICAgIHJldHVybiAwOworCisgIC8qIGZpcnN0IGJ5dGUgb2YgaXRlbSAqLworICBpdGVtID0gYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKTsKKworICAvKiBlbnRyeSBoZWFkIGFycmF5ICovCisgIGRlaCA9IEJfSV9ERUggKGJoLCBpaCk7CisKKyAgLyogZmlyc3QgYnl0ZSBvZiByZW1haW5pbmcgZW50cmllcywgdGhvc2UgYXJlIEJFRk9SRSBjdXQgZW50cmllcworICAgICAocHJldl9yZWNvcmQpIGFuZCBsZW5ndGggb2YgYWxsIHJlbW92ZWQgcmVjb3JkcyAoY3V0X3JlY29yZHNfbGVuKSAqLworICBwcmV2X3JlY29yZF9vZmZzZXQgPSAoZnJvbSA/IGRlaF9sb2NhdGlvbiggJihkZWhbZnJvbSAtIDFdKSkgOiBpaF9pdGVtX2xlbihpaCkpOworICBjdXRfcmVjb3Jkc19sZW4gPSBwcmV2X3JlY29yZF9vZmZzZXQvKmZyb21fcmVjb3JkKi8gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWhfbG9jYXRpb24oICYoZGVoW2Zyb20gKyBkZWxfY291bnQgLSAxXSkpOworICBwcmV2X3JlY29yZCA9IGl0ZW0gKyBwcmV2X3JlY29yZF9vZmZzZXQ7CisKKworICAvKiBhZGp1c3QgbG9jYXRpb25zIG9mIHJlbWFpbmluZyBlbnRyaWVzICovCisgIGZvciAoaSA9IElfRU5UUllfQ09VTlQoaWgpIC0gMTsgaSA+IGZyb20gKyBkZWxfY291bnQgLSAxOyBpIC0tKQorICAgIHB1dF9kZWhfbG9jYXRpb24oICYoZGVoW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlaF9sb2NhdGlvbiggJmRlaFtpXSApIC0gKERFSF9TSVpFICogZGVsX2NvdW50ICkgKTsKKworICBmb3IgKGkgPSAwOyBpIDwgZnJvbTsgaSArKykKKyAgICBwdXRfZGVoX2xvY2F0aW9uKCAmKGRlaFtpXSksCisgICAgICAgIGRlaF9sb2NhdGlvbiggJmRlaFtpXSApIC0gKERFSF9TSVpFICogZGVsX2NvdW50ICsgY3V0X3JlY29yZHNfbGVuKSApOworCisgIHB1dF9paF9lbnRyeV9jb3VudCggaWgsIGloX2VudHJ5X2NvdW50KGloKSAtIGRlbF9jb3VudCApOworCisgIC8qIHNoaWZ0IGVudHJ5IGhlYWQgYXJyYXkgYW5kIGVudHJpZXMgdGhvc2UgYXJlIEFGVEVSIHJlbW92ZWQgZW50cmllcyAqLworICBtZW1tb3ZlICgoY2hhciAqKShkZWggKyBmcm9tKSwKKwkgICBkZWggKyBmcm9tICsgZGVsX2NvdW50LCAKKwkgICBwcmV2X3JlY29yZCAtIGN1dF9yZWNvcmRzX2xlbiAtIChjaGFyICopKGRlaCArIGZyb20gKyBkZWxfY291bnQpKTsKKyAgCisgIC8qIHNoaWZ0IHJlY29yZHMsIHRob3NlIGFyZSBCRUZPUkUgcmVtb3ZlZCBlbnRyaWVzICovCisgIG1lbW1vdmUgKHByZXZfcmVjb3JkIC0gY3V0X3JlY29yZHNfbGVuIC0gREVIX1NJWkUgKiBkZWxfY291bnQsCisJICAgcHJldl9yZWNvcmQsIGl0ZW0gKyBpaF9pdGVtX2xlbihpaCkgLSBwcmV2X3JlY29yZCk7CisKKyAgcmV0dXJuIERFSF9TSVpFICogZGVsX2NvdW50ICsgY3V0X3JlY29yZHNfbGVuOworfQorCisKKy8qICB3aGVuIGN1dCBpdGVtIGlzIHBhcnQgb2YgcmVndWxhciBmaWxlCisgICAgICAgIHBvc19pbl9pdGVtIC0gZmlyc3QgYnl0ZSB0aGF0IG11c3QgYmUgY3V0CisgICAgICAgIGN1dF9zaXplIC0gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGN1dCBiZWdpbm5pbmcgZnJvbSBwb3NfaW5faXRlbQorIAorICAgd2hlbiBjdXQgaXRlbSBpcyBwYXJ0IG9mIGRpcmVjdG9yeQorICAgICAgICBwb3NfaW5faXRlbSAtIG51bWJlciBvZiBmaXJzdCBkZWxldGVkIGVudHJ5CisgICAgICAgIGN1dF9zaXplIC0gY291bnQgb2YgZGVsZXRlZCBlbnRyaWVzCisgICAgKi8KK3ZvaWQgbGVhZl9jdXRfZnJvbV9idWZmZXIgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGJpLCBpbnQgY3V0X2l0ZW1fbnVtLAorCQkJICAgaW50IHBvc19pbl9pdGVtLCBpbnQgY3V0X3NpemUpCit7CisgICAgaW50IG5yOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoID0gYmktPmJpX2JoOworICAgIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7CisgICAgaW50IGxhc3RfbG9jLCB1bm1vdmVkX2xvYzsKKyAgICBpbnQgaTsKKworICAgIGJsa2ggPSBCX0JMS19IRUFEKGJoKTsKKyAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKKworICAgIC8qIGl0ZW0gaGVhZCBvZiB0cnVuY2F0ZWQgaXRlbSAqLworICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKGJoLCBjdXRfaXRlbV9udW0pOworCisgICAgaWYgKGlzX2RpcmVudHJ5X2xlX2loIChpaCkpIHsKKyAgICAgICAgLyogZmlyc3QgY3V0IGVudHJ5ICgpKi8KKyAgICAgICAgY3V0X3NpemUgPSBsZWFmX2N1dF9lbnRyaWVzIChiaCwgaWgsIHBvc19pbl9pdGVtLCBjdXRfc2l6ZSk7CisgICAgICAgIGlmIChwb3NfaW5faXRlbSA9PSAwKSB7CisJICAgICAgICAvKiBjaGFuZ2Uga2V5ICovCisgICAgICAgICAgICBSRkFMU0UoIGN1dF9pdGVtX251bSwKKyAgICAgICAgICAgICAgICAgICAgIndoZW4gMC10aCBlbnJ0eSBvZiBpdGVtIGlzIGN1dCwgdGhhdCBpdGVtIG11c3QgYmUgZmlyc3QgaW4gdGhlIG5vZGUsIG5vdCAlZC10aCIsIGN1dF9pdGVtX251bSk7CisgICAgICAgICAgICAvKiBjaGFuZ2UgaXRlbSBrZXkgYnkga2V5IG9mIGZpcnN0IGVudHJ5IGluIHRoZSBpdGVtICovCisJICAgIHNldF9sZV9paF9rX29mZnNldCAoaWgsIGRlaF9vZmZzZXQoQl9JX0RFSCAoYmgsIGloKSkpOworICAgICAgICAgICAgLyptZW1jcHkgKCZpaC0+aWhfa2V5Lmtfb2Zmc2V0LCAmKEJfSV9ERUggKGJoLCBpaCktPmRlaF9vZmZzZXQpLCBTSE9SVF9LRVlfU0laRSk7Ki8KKwkgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGl0ZW0gaXMgZGlyZWN0IG9yIGluZGlyZWN0ICovCisgICAgICAgIFJGQUxTRSggaXNfc3RhdGRhdGFfbGVfaWggKGloKSwgIjEwMTk1OiBpdGVtIGlzIHN0YXQgZGF0YSIpOworICAgICAgICBSRkFMU0UoIHBvc19pbl9pdGVtICYmIHBvc19pbl9pdGVtICsgY3V0X3NpemUgIT0gaWhfaXRlbV9sZW4oaWgpLAorICAgICAgICAgICAgICAgICIxMDIwMDogaW52YWxpZCBvZmZzZXQgKCVsdSkgb3IgdHJ1bmNfc2l6ZSAoJWx1KSBvciBpaF9pdGVtX2xlbiAoJWx1KSIsCisgICAgICAgICAgICAgICAgKCBsb25nIHVuc2lnbmVkICkgcG9zX2luX2l0ZW0sICggbG9uZyB1bnNpZ25lZCApIGN1dF9zaXplLCAKKwkJKCBsb25nIHVuc2lnbmVkICkgaWhfaXRlbV9sZW4gKGloKSk7CisKKyAgICAgICAgLyogc2hpZnQgaXRlbSBib2R5IHRvIGxlZnQgaWYgY3V0IGlzIGZyb20gdGhlIGhlYWQgb2YgaXRlbSAqLworICAgICAgICBpZiAocG9zX2luX2l0ZW0gPT0gMCkgeworICAgICAgICAgICAgbWVtbW92ZSggYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSwKKwkJICAgICBiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpICsgY3V0X3NpemUsCisJCSAgICAgaWhfaXRlbV9sZW4oaWgpIC0gY3V0X3NpemUpOworCSAgICAKKyAgICAgICAgICAgIC8qIGNoYW5nZSBrZXkgb2YgaXRlbSAqLworICAgICAgICAgICAgaWYgKGlzX2RpcmVjdF9sZV9paCAoaWgpKQorCQlzZXRfbGVfaWhfa19vZmZzZXQgKGloLCBsZV9paF9rX29mZnNldCAoaWgpICsgY3V0X3NpemUpOworICAgICAgICAgICAgZWxzZSB7CisJCXNldF9sZV9paF9rX29mZnNldCAoaWgsIGxlX2loX2tfb2Zmc2V0IChpaCkgKyAoY3V0X3NpemUgLyBVTkZNX1BfU0laRSkgKiBiaC0+Yl9zaXplKTsKKyAgICAgICAgICAgICAgICBSRkFMU0UoIGloX2l0ZW1fbGVuKGloKSA9PSBjdXRfc2l6ZSAmJiBnZXRfaWhfZnJlZV9zcGFjZSAoaWgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIjEwMjA1OiBpbnZhbGlkIGloX2ZyZWVfc3BhY2UgKCVoKSIsIGloKTsKKwkgICAgICAgIH0KKwkgICAgfQorICAgIH0KKyAgCisKKyAgICAvKiBsb2NhdGlvbiBvZiB0aGUgbGFzdCBpdGVtICovCisgICAgbGFzdF9sb2MgPSBpaF9sb2NhdGlvbiggJihpaFtuciAtIGN1dF9pdGVtX251bSAtIDFdKSApOworCisgICAgLyogbG9jYXRpb24gb2YgdGhlIGl0ZW0sIHdoaWNoIGlzIHJlbWFpbmluZyBhdCB0aGUgc2FtZSBwbGFjZSAqLworICAgIHVubW92ZWRfbG9jID0gY3V0X2l0ZW1fbnVtID8gaWhfbG9jYXRpb24oaWgtMSkgOiBiaC0+Yl9zaXplOworCisKKyAgICAvKiBzaGlmdCAqLworICAgIG1lbW1vdmUgKGJoLT5iX2RhdGEgKyBsYXN0X2xvYyArIGN1dF9zaXplLCBiaC0+Yl9kYXRhICsgbGFzdF9sb2MsCisJICAgICAgIHVubW92ZWRfbG9jIC0gbGFzdF9sb2MgLSBjdXRfc2l6ZSk7CisKKyAgICAvKiBjaGFuZ2UgaXRlbSBsZW5ndGggKi8KKyAgICBwdXRfaWhfaXRlbV9sZW4oIGloLCBpaF9pdGVtX2xlbihpaCkgLSBjdXRfc2l6ZSApOworICAKKyAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKGloKSkgeworICAgICAgICBpZiAocG9zX2luX2l0ZW0pCisgICAgICAgICAgICBzZXRfaWhfZnJlZV9zcGFjZSAoaWgsIDApOworICAgIH0KKworICAgIC8qIGNoYW5nZSBsb2NhdGlvbnMgKi8KKyAgICBmb3IgKGkgPSBjdXRfaXRlbV9udW07IGkgPCBucjsgaSArKykKKyAgICBwdXRfaWhfbG9jYXRpb24oICYoaWhbaS1jdXRfaXRlbV9udW1dKSwgaWhfbG9jYXRpb24oICZpaFtpLWN1dF9pdGVtX251bV0pICsgY3V0X3NpemUgKTsKKworICAgIC8qIHNpemUsIGZyZWUgc3BhY2UgKi8KKyAgICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgKyBjdXRfc2l6ZSApOworCisgICAgZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkgKGJpLT50YiwgYmgsIDApOworICAgIAorICAgIGlmIChiaS0+YmlfcGFyZW50KSB7IAorICAgICAgc3RydWN0IGRpc2tfY2hpbGQgKnRfZGM7CisgICAgICB0X2RjID0gQl9OX0NISUxEIChiaS0+YmlfcGFyZW50LCBiaS0+YmlfcG9zaXRpb24pOworICAgICAgcHV0X2RjX3NpemUoIHRfZGMsIGRjX3NpemUodF9kYykgLSBjdXRfc2l6ZSApOworICAgICAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChiaS0+dGIsIGJpLT5iaV9wYXJlbnQsIDApOworICAgIH0KK30KKworCisvKiBkZWxldGUgZGVsX251bSBpdGVtcyBmcm9tIGJ1ZmZlciBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCd0aCBpdGVtICovCitzdGF0aWMgdm9pZCBsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseSAoc3RydWN0IGJ1ZmZlcl9pbmZvICogYmksCisJCQkJCWludCBmaXJzdCwgaW50IGRlbF9udW0pCit7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggPSBiaS0+YmlfYmg7CisgICAgaW50IG5yOworICAgIGludCBpLCBqOworICAgIGludCBsYXN0X2xvYywgbGFzdF9yZW1vdmVkX2xvYzsKKyAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7CisgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOworCisgIFJGQUxTRSggYmggPT0gTlVMTCwgIjEwMjEwOiBidWZmZXIgaXMgMCIpOworICBSRkFMU0UoIGRlbF9udW0gPCAwLCAiMTAyMTU6IGRlbF9udW0gbGVzcyB0aGFuIDAgKCVkKSIsIGRlbF9udW0pOworCisgIGlmIChkZWxfbnVtID09IDApCisgICAgcmV0dXJuOworCisgIGJsa2ggPSBCX0JMS19IRUFEKGJoKTsKKyAgbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisKKyAgUkZBTFNFKCBmaXJzdCA8IDAgfHwgZmlyc3QgKyBkZWxfbnVtID4gbnIsCisgICAgICAgICAgIjEwMjIwOiBmaXJzdD0lZCwgbnVtYmVyPSVkLCB0aGVyZSBpcyAlZCBpdGVtcyIsIGZpcnN0LCBkZWxfbnVtLCBucik7CisKKyAgaWYgKGZpcnN0ID09IDAgJiYgZGVsX251bSA9PSBucikgeworICAgIC8qIHRoaXMgZG9lcyBub3Qgd29yayAqLworICAgIG1ha2VfZW1wdHlfbm9kZSAoYmkpOworICAgIAorICAgIGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5IChiaS0+dGIsIGJoLCAwKTsKKyAgICByZXR1cm47CisgIH0KKworICBpaCA9IEJfTl9QSVRFTV9IRUFEIChiaCwgZmlyc3QpOworICAKKyAgLyogbG9jYXRpb24gb2YgdW5tb3ZhYmxlIGl0ZW0gKi8KKyAgaiA9IChmaXJzdCA9PSAwKSA/IGJoLT5iX3NpemUgOiBpaF9sb2NhdGlvbihpaC0xKTsKKyAgICAgIAorICAvKiBkZWxldGUgaXRlbXMgKi8KKyAgbGFzdF9sb2MgPSBpaF9sb2NhdGlvbiggJihpaFtuci0xLWZpcnN0XSkgKTsKKyAgbGFzdF9yZW1vdmVkX2xvYyA9IGloX2xvY2F0aW9uKCAmKGloW2RlbF9udW0tMV0pICk7CisKKyAgbWVtbW92ZSAoYmgtPmJfZGF0YSArIGxhc3RfbG9jICsgaiAtIGxhc3RfcmVtb3ZlZF9sb2MsCisJICAgYmgtPmJfZGF0YSArIGxhc3RfbG9jLCBsYXN0X3JlbW92ZWRfbG9jIC0gbGFzdF9sb2MpOworICAKKyAgLyogZGVsZXRlIGl0ZW0gaGVhZGVycyAqLworICBtZW1tb3ZlIChpaCwgaWggKyBkZWxfbnVtLCAobnIgLSBmaXJzdCAtIGRlbF9udW0pICogSUhfU0laRSk7CisgIAorICAvKiBjaGFuZ2UgaXRlbSBsb2NhdGlvbiAqLworICBmb3IgKGkgPSBmaXJzdDsgaSA8IG5yIC0gZGVsX251bTsgaSArKykKKyAgICBwdXRfaWhfbG9jYXRpb24oICYoaWhbaS1maXJzdF0pLCBpaF9sb2NhdGlvbiggJihpaFtpLWZpcnN0XSkgKSArIChqIC0gbGFzdF9yZW1vdmVkX2xvYykgKTsKKworICAvKiBzaXplcywgaXRlbSBudW1iZXIgKi8KKyAgc2V0X2Jsa2hfbnJfaXRlbSggYmxraCwgYmxraF9ucl9pdGVtKGJsa2gpIC0gZGVsX251bSApOworICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgKyAoaiAtIGxhc3RfcmVtb3ZlZF9sb2MgKyBJSF9TSVpFICogZGVsX251bSkgKTsKKworICBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoYmktPnRiLCBiaCwgMCk7CisgIAorICBpZiAoYmktPmJpX3BhcmVudCkgeworICAgIHN0cnVjdCBkaXNrX2NoaWxkICp0X2RjID0gQl9OX0NISUxEIChiaS0+YmlfcGFyZW50LCBiaS0+YmlfcG9zaXRpb24pOworICAgIHB1dF9kY19zaXplKCB0X2RjLCBkY19zaXplKHRfZGMpIC0KKwkJCQkoaiAtIGxhc3RfcmVtb3ZlZF9sb2MgKyBJSF9TSVpFICogZGVsX251bSkpOworICAgIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoYmktPnRiLCBiaS0+YmlfcGFyZW50LCAwKTsKKyAgfQorfQorCisKKworCisKKy8qIHBhc3RlIG5ld19lbnRyeV9jb3VudCBlbnRyaWVzIChuZXdfZGVocywgcmVjb3JkcykgaW50byBwb3NpdGlvbiBiZWZvcmUgdG8gaXRlbV9udW0tdGggaXRlbSAqLwordm9pZCAgICBsZWFmX3Bhc3RlX2VudHJpZXMgKAorCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsCisJCQlpbnQgaXRlbV9udW0sCisJCQlpbnQgYmVmb3JlLAorCQkJaW50IG5ld19lbnRyeV9jb3VudCwKKwkJCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogbmV3X2RlaHMsCisJCQljb25zdCBjaGFyICogcmVjb3JkcywKKwkJCWludCBwYXN0ZV9zaXplCisJCSkKK3sKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7CisgICAgY2hhciAqIGl0ZW07CisgICAgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBkZWg7CisgICAgY2hhciAqIGluc2VydF9wb2ludDsKKyAgICBpbnQgaSwgb2xkX2VudHJ5X251bTsKKworICAgIGlmIChuZXdfZW50cnlfY291bnQgPT0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWggPSBCX05fUElURU1fSEVBRChiaCwgaXRlbV9udW0pOworCisgIC8qIG1ha2Ugc3VyZSwgdGhhdCBpdGVtIGlzIGRpcmVjdG9yeSwgYW5kIHRoZXJlIGFyZSBlbm91Z2ggcmVjb3JkcyBpbiBpdCAqLworICBSRkFMU0UoICFpc19kaXJlbnRyeV9sZV9paCAoaWgpLCAiMTAyMjU6IGl0ZW0gaXMgbm90IGRpcmVjdG9yeSBpdGVtIik7CisgIFJGQUxTRSggSV9FTlRSWV9DT1VOVCAoaWgpIDwgYmVmb3JlLAorCSAgIjEwMjMwOiB0aGVyZSBhcmUgbm8gZW50cnkgd2UgcGFzdGUgZW50cmllcyBiZWZvcmUuIGVudHJ5X2NvdW50ID0gJWQsIGJlZm9yZSA9ICVkIiwKKwkgIElfRU5UUllfQ09VTlQgKGloKSwgYmVmb3JlKTsKKworCisgIC8qIGZpcnN0IGJ5dGUgb2YgZGVzdCBpdGVtICovCisgIGl0ZW0gPSBiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpOworCisgIC8qIGVudHJ5IGhlYWQgYXJyYXkgKi8KKyAgZGVoID0gQl9JX0RFSCAoYmgsIGloKTsKKworICAvKiBuZXcgcmVjb3JkcyB3aWxsIGJlIHBhc3RlZCBhdCB0aGlzIHBvaW50ICovCisgIGluc2VydF9wb2ludCA9IGl0ZW0gKyAoYmVmb3JlID8gZGVoX2xvY2F0aW9uKCAmKGRlaFtiZWZvcmUgLSAxXSkpIDogKGloX2l0ZW1fbGVuKGloKSAtIHBhc3RlX3NpemUpKTsKKworICAvKiBhZGp1c3QgbG9jYXRpb25zIG9mIHJlY29yZHMgdGhhdCB3aWxsIGJlIEFGVEVSIG5ldyByZWNvcmRzICovCisgIGZvciAoaSA9IElfRU5UUllfQ09VTlQoaWgpIC0gMTsgaSA+PSBiZWZvcmU7IGkgLS0pCisgICAgcHV0X2RlaF9sb2NhdGlvbiggJihkZWhbaV0pLAorICAgICAgICAgICAgICAgIGRlaF9sb2NhdGlvbigmKGRlaFtpXSkpICsgKERFSF9TSVpFICogbmV3X2VudHJ5X2NvdW50ICkpOyAKKworICAvKiBhZGp1c3QgbG9jYXRpb25zIG9mIHJlY29yZHMgdGhhdCB3aWxsIGJlIEJFRk9SRSBuZXcgcmVjb3JkcyAqLworICBmb3IgKGkgPSAwOyBpIDwgYmVmb3JlOyBpICsrKQorICAgIHB1dF9kZWhfbG9jYXRpb24oICYoZGVoW2ldKSwgZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSkgKyBwYXN0ZV9zaXplICk7CisKKyAgb2xkX2VudHJ5X251bSA9IElfRU5UUllfQ09VTlQoaWgpOworICBwdXRfaWhfZW50cnlfY291bnQoIGloLCBpaF9lbnRyeV9jb3VudChpaCkgKyBuZXdfZW50cnlfY291bnQgKTsKKworICAvKiBwcmVwYXJlIHNwYWNlIGZvciBwYXN0ZWQgcmVjb3JkcyAqLworICBtZW1tb3ZlIChpbnNlcnRfcG9pbnQgKyBwYXN0ZV9zaXplLCBpbnNlcnRfcG9pbnQsIGl0ZW0gKyAoaWhfaXRlbV9sZW4oaWgpIC0gcGFzdGVfc2l6ZSkgLSBpbnNlcnRfcG9pbnQpOworCisgIC8qIGNvcHkgbmV3IHJlY29yZHMgKi8KKyAgbWVtY3B5IChpbnNlcnRfcG9pbnQgKyBERUhfU0laRSAqIG5ld19lbnRyeV9jb3VudCwgcmVjb3JkcywKKwkJICAgcGFzdGVfc2l6ZSAtIERFSF9TSVpFICogbmV3X2VudHJ5X2NvdW50KTsKKyAgCisgIC8qIHByZXBhcmUgc3BhY2UgZm9yIG5ldyBlbnRyeSBoZWFkcyAqLworICBkZWggKz0gYmVmb3JlOworICBtZW1tb3ZlICgoY2hhciAqKShkZWggKyBuZXdfZW50cnlfY291bnQpLCBkZWgsIGluc2VydF9wb2ludCAtIChjaGFyICopZGVoKTsKKworICAvKiBjb3B5IG5ldyBlbnRyeSBoZWFkcyAqLworICBkZWggPSAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKikoKGNoYXIgKilkZWgpOworICBtZW1jcHkgKGRlaCwgbmV3X2RlaHMsIERFSF9TSVpFICogbmV3X2VudHJ5X2NvdW50KTsKKworICAvKiBzZXQgbG9jYXRpb25zIG9mIG5ldyByZWNvcmRzICovCisgIGZvciAoaSA9IDA7IGkgPCBuZXdfZW50cnlfY291bnQ7IGkgKyspCisgIHsKKyAgICBwdXRfZGVoX2xvY2F0aW9uKCAmKGRlaFtpXSksCisgICAgICAgIGRlaF9sb2NhdGlvbiggJihkZWhbaV0gKSkgKworICAgICAgICAoLSBkZWhfbG9jYXRpb24oICYobmV3X2RlaHNbbmV3X2VudHJ5X2NvdW50IC0gMV0pKSArCisgICAgICAgIGluc2VydF9wb2ludCArIERFSF9TSVpFICogbmV3X2VudHJ5X2NvdW50IC0gaXRlbSkpOworICB9CisKKworICAvKiBjaGFuZ2UgaXRlbSBrZXkgaWYgbmVjZXNzYXJ5ICh3aGVuIHdlIHBhc3RlIGJlZm9yZSAwLXRoIGVudHJ5ICovCisgIGlmICghYmVmb3JlKQorICAgIHsKKwlzZXRfbGVfaWhfa19vZmZzZXQgKGloLCBkZWhfb2Zmc2V0KG5ld19kZWhzKSk7CisvKiAgICAgIG1lbWNweSAoJmloLT5paF9rZXkua19vZmZzZXQsIAorCQkgICAgICAgJm5ld19kZWhzLT5kZWhfb2Zmc2V0LCBTSE9SVF9LRVlfU0laRSk7Ki8KKyAgICB9CisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKyAgeworICAgIGludCBwcmV2LCBuZXh0OworICAgIC8qIGNoZWNrIHJlY29yZCBsb2NhdGlvbnMgKi8KKyAgICBkZWggPSBCX0lfREVIIChiaCwgaWgpOworICAgIGZvciAoaSA9IDA7IGkgPCBJX0VOVFJZX0NPVU5UKGloKTsgaSArKykgeworICAgICAgbmV4dCA9IChpIDwgSV9FTlRSWV9DT1VOVChpaCkgLSAxKSA/IGRlaF9sb2NhdGlvbiggJihkZWhbaSArIDFdKSkgOiAwOworICAgICAgcHJldiA9IChpICE9IDApID8gZGVoX2xvY2F0aW9uKCAmKGRlaFtpIC0gMV0pICkgOiAwOworICAgICAgCisgICAgICBpZiAocHJldiAmJiBwcmV2IDw9IGRlaF9sb2NhdGlvbiggJihkZWhbaV0pKSkKKwlyZWlzZXJmc193YXJuaW5nIChOVUxMLCAidnMtMTAyNDA6IGxlYWZfcGFzdGVfZW50cmllczogZGlyZWN0b3J5IGl0ZW0gKCVoKSBjb3JydXB0ZWQgKHByZXYgJWEsIGN1ciglZCkgJWEpIiwKKwkJCSAgaWgsIGRlaCArIGkgLSAxLCBpLCBkZWggKyBpKTsKKyAgICAgIGlmIChuZXh0ICYmIG5leHQgPj0gZGVoX2xvY2F0aW9uKCAmKGRlaFtpXSkpKQorCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJ2cy0xMDI1MDogbGVhZl9wYXN0ZV9lbnRyaWVzOiBkaXJlY3RvcnkgaXRlbSAoJWgpIGNvcnJ1cHRlZCAoY3VyKCVkKSAlYSwgbmV4dCAlYSkiLAorCQkJICBpaCwgaSwgZGVoICsgaSwgZGVoICsgaSArIDEpOworICAgIH0KKyAgfQorI2VuZGlmCisKK30KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL25hbWVpLmMgYi9mcy9yZWlzZXJmcy9uYW1laS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZTkyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy9uYW1laS5jCkBAIC0wLDAgKzEsMTQ5MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwIGJ5IEhhbnMgUmVpc2VyLCBsaWNlbnNpbmcgZ292ZXJuZWQgYnkgcmVpc2VyZnMvUkVBRE1FCisgKgorICogVHJpdmlhbCBjaGFuZ2VzIGJ5IEFsYW4gQ294IHRvIHJlbW92ZSBFSEFTSENPTExJU0lPTiBmb3IgY29tcGF0aWJpbGl0eQorICoKKyAqIFRyaXZpYWwgQ2hhbmdlczoKKyAqIFJpZ2h0cyBncmFudGVkIHRvIEhhbnMgUmVpc2VyIHRvIHJlZGlzdHJpYnV0ZSB1bmRlciBvdGhlciB0ZXJtcyBwcm92aWRpbmcKKyAqIGhlIGFjY2VwdHMgYWxsIGxpYWJpbGl0eSBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHBhdGVudCwgZml0bmVzcworICogZm9yIHB1cnBvc2UsIGFuZCBkaXJlY3Qgb3IgaW5kaXJlY3QgY2xhaW1zIGFyaXNpbmcgZnJvbSBmYWlsdXJlIHRvIHBlcmZvcm0uCisgKgorICogTk8gV0FSUkFOVFkKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfYWNsLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfeGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisKKyNkZWZpbmUgSU5DX0RJUl9JTk9ERV9OTElOSyhpKSBpZiAoaS0+aV9ubGluayAhPSAxKSB7IGktPmlfbmxpbmsrKzsgaWYgKGktPmlfbmxpbmsgPj0gUkVJU0VSRlNfTElOS19NQVgpIGktPmlfbmxpbms9MTsgfQorI2RlZmluZSBERUNfRElSX0lOT0RFX05MSU5LKGkpIGlmIChpLT5pX25saW5rICE9IDEpIGktPmlfbmxpbmstLTsKKworLy8gZGlyZWN0b3J5IGl0ZW0gY29udGFpbnMgYXJyYXkgb2YgZW50cnkgaGVhZGVycy4gVGhpcyBwZXJmb3JtcworLy8gYmluYXJ5IHNlYXJjaCB0aHJvdWdoIHRoYXQgYXJyYXkKK3N0YXRpYyBpbnQgYmluX3NlYXJjaF9pbl9kaXJfaXRlbSAoc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlLCBsb2ZmX3Qgb2ZmKQoreworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCA9IGRlLT5kZV9paDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaCA9IGRlLT5kZV9kZWg7CisgICAgaW50IHJib3VuZCwgbGJvdW5kLCBqOworCisgICAgbGJvdW5kID0gMDsKKyAgICByYm91bmQgPSBJX0VOVFJZX0NPVU5UIChpaCkgLSAxOworCisgICAgZm9yIChqID0gKHJib3VuZCArIGxib3VuZCkgLyAyOyBsYm91bmQgPD0gcmJvdW5kOyBqID0gKHJib3VuZCArIGxib3VuZCkgLyAyKSB7CisJaWYgKG9mZiA8IGRlaF9vZmZzZXQgKGRlaCArIGopKSB7CisJICAgIHJib3VuZCA9IGogLSAxOworCSAgICBjb250aW51ZTsKKwl9CisJaWYgKG9mZiA+IGRlaF9vZmZzZXQgKGRlaCArIGopKSB7CisJICAgIGxib3VuZCA9IGogKyAxOworCSAgICBjb250aW51ZTsKKwl9CisJLy8gdGhpcyBpcyBub3QgbmFtZSBmb3VuZCwgYnV0IG1hdGNoZWQgdGhpcmQga2V5IGNvbXBvbmVudAorCWRlLT5kZV9lbnRyeV9udW0gPSBqOworCXJldHVybiBOQU1FX0ZPVU5EOworICAgIH0KKworICAgIGRlLT5kZV9lbnRyeV9udW0gPSBsYm91bmQ7CisgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworfQorCisKKy8vIGNvbW1lbnQ/ICBtYXliZSBzb21ldGhpbmcgbGlrZSBzZXQgZGUgdG8gcG9pbnQgdG8gd2hhdCB0aGUgcGF0aCBwb2ludHMgdG8/CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RlX2l0ZW1fbG9jYXRpb24gKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSwgc3RydWN0IHBhdGggKiBwYXRoKQoreworICAgIGRlLT5kZV9iaCA9IGdldF9sYXN0X2JoIChwYXRoKTsKKyAgICBkZS0+ZGVfaWggPSBnZXRfaWggKHBhdGgpOworICAgIGRlLT5kZV9kZWggPSBCX0lfREVIIChkZS0+ZGVfYmgsIGRlLT5kZV9paCk7CisgICAgZGUtPmRlX2l0ZW1fbnVtID0gUEFUSF9MQVNUX1BPU0lUSU9OIChwYXRoKTsKK30gCisKKworLy8gZGVfYmgsIGRlX2loLCBkZV9kZWggKHBvaW50cyB0byBmaXJzdCBlbGVtZW50IG9mIGFycmF5KSwgZGVfaXRlbV9udW0gaXMgc2V0CitpbmxpbmUgdm9pZCBzZXRfZGVfbmFtZV9hbmRfbmFtZWxlbiAoc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlKQoreworICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoID0gZGUtPmRlX2RlaCArIGRlLT5kZV9lbnRyeV9udW07CisKKyAgICBpZiAoZGUtPmRlX2VudHJ5X251bSA+PSBpaF9lbnRyeV9jb3VudCAoZGUtPmRlX2loKSkKKwlCVUcgKCk7CisKKyAgICBkZS0+ZGVfZW50cnlsZW4gPSBlbnRyeV9sZW5ndGggKGRlLT5kZV9iaCwgZGUtPmRlX2loLCBkZS0+ZGVfZW50cnlfbnVtKTsKKyAgICBkZS0+ZGVfbmFtZWxlbiA9IGRlLT5kZV9lbnRyeWxlbiAtIChkZV93aXRoX3NkIChkZWgpID8gU0RfU0laRSA6IDApOworICAgIGRlLT5kZV9uYW1lID0gQl9JX1BJVEVNIChkZS0+ZGVfYmgsIGRlLT5kZV9paCkgKyBkZWhfbG9jYXRpb24oZGVoKTsKKyAgICBpZiAoZGUtPmRlX25hbWVbZGUtPmRlX25hbWVsZW4gLSAxXSA9PSAwKQorCWRlLT5kZV9uYW1lbGVuID0gc3RybGVuIChkZS0+ZGVfbmFtZSk7Cit9CisKKworLy8gd2hhdCBlbnRyeSBwb2ludHMgdG8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZGVfb2JqZWN0X2tleSAoc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlKQoreworICAgIGlmIChkZS0+ZGVfZW50cnlfbnVtID49IGloX2VudHJ5X2NvdW50IChkZS0+ZGVfaWgpKQorCUJVRyAoKTsKKyAgICBkZS0+ZGVfZGlyX2lkID0gZGVoX2Rpcl9pZCggJihkZS0+ZGVfZGVoW2RlLT5kZV9lbnRyeV9udW1dKSk7CisgICAgZGUtPmRlX29iamVjdGlkID0gZGVoX29iamVjdGlkKCAmKGRlLT5kZV9kZWhbZGUtPmRlX2VudHJ5X251bV0pKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcmVfZGVfZW50cnlfa2V5IChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBkZWggPSBkZS0+ZGVfZGVoICsgZGUtPmRlX2VudHJ5X251bTsKKworICAgIGlmIChkZS0+ZGVfZW50cnlfbnVtID49IGloX2VudHJ5X2NvdW50IChkZS0+ZGVfaWgpKQorCUJVRyAoKTsKKworICAgIC8qIHN0b3JlIGtleSBvZiB0aGUgZm91bmQgZW50cnkgKi8KKyAgICBkZS0+ZGVfZW50cnlfa2V5LnZlcnNpb24gPSBLRVlfRk9STUFUXzNfNTsKKyAgICBkZS0+ZGVfZW50cnlfa2V5Lm9uX2Rpc2tfa2V5LmtfZGlyX2lkID0gbGUzMl90b19jcHUgKGRlLT5kZV9paC0+aWhfa2V5LmtfZGlyX2lkKTsKKyAgICBkZS0+ZGVfZW50cnlfa2V5Lm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSBsZTMyX3RvX2NwdSAoZGUtPmRlX2loLT5paF9rZXkua19vYmplY3RpZCk7CisgICAgc2V0X2NwdV9rZXlfa19vZmZzZXQgKCYoZGUtPmRlX2VudHJ5X2tleSksIGRlaF9vZmZzZXQgKGRlaCkpOworICAgIHNldF9jcHVfa2V5X2tfdHlwZSAoJihkZS0+ZGVfZW50cnlfa2V5KSwgVFlQRV9ESVJFTlRSWSk7Cit9CisKKworLyogV2UgYXNzaWduIGEga2V5IHRvIGVhY2ggZGlyZWN0b3J5IGl0ZW0sIGFuZCBwbGFjZSBtdWx0aXBsZSBlbnRyaWVzCitpbiBhIHNpbmdsZSBkaXJlY3RvcnkgaXRlbS4gIEEgZGlyZWN0b3J5IGl0ZW0gaGFzIGEga2V5IGVxdWFsIHRvIHRoZQora2V5IG9mIHRoZSBmaXJzdCBkaXJlY3RvcnkgZW50cnkgaW4gaXQuCisKK1RoaXMgZnVuY3Rpb24gZmlyc3QgY2FsbHMgc2VhcmNoX2J5X2tleSwgdGhlbiwgaWYgaXRlbSB3aG9zZSBmaXJzdAorZW50cnkgbWF0Y2hlcyBpcyBub3QgZm91bmQgaXQgbG9va3MgZm9yIHRoZSBlbnRyeSBpbnNpZGUgZGlyZWN0b3J5CitpdGVtIGZvdW5kIGJ5IHNlYXJjaF9ieV9rZXkuIEZpbGxzIHRoZSBwYXRoIHRvIHRoZSBlbnRyeSwgYW5kIHRvIHRoZQorZW50cnkgcG9zaXRpb24gaW4gdGhlIGl0ZW0gCisKKyovCisKKy8qIFRoZSBmdW5jdGlvbiBpcyBOT1QgU0NIRURVTEUtU0FGRSEgKi8KK2ludCBzZWFyY2hfYnlfZW50cnlfa2V5IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBrZXksCisJCQkgc3RydWN0IHBhdGggKiBwYXRoLCBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUpCit7CisgICAgaW50IHJldHZhbDsKKworICAgIHJldHZhbCA9IHNlYXJjaF9pdGVtIChzYiwga2V5LCBwYXRoKTsKKyAgICBzd2l0Y2ggKHJldHZhbCkgeworICAgIGNhc2UgSVRFTV9OT1RfRk9VTkQ6CisJaWYgKCFQQVRIX0xBU1RfUE9TSVRJT04gKHBhdGgpKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKHNiLCAidnMtNzAwMDogc2VhcmNoX2J5X2VudHJ5X2tleTogc2VhcmNoX2J5X2tleSByZXR1cm5lZCBpdGVtIHBvc2l0aW9uID09IDAiKTsKKwkgICAgcGF0aHJlbHNlKHBhdGgpIDsKKwkgICAgcmV0dXJuIElPX0VSUk9SIDsKKwl9CisJUEFUSF9MQVNUX1BPU0lUSU9OIChwYXRoKSAtLTsKKworICAgIGNhc2UgSVRFTV9GT1VORDoKKwlicmVhazsKKworICAgIGNhc2UgSU9fRVJST1I6CisJcmV0dXJuIHJldHZhbDsKKworICAgIGRlZmF1bHQ6CisJcGF0aHJlbHNlIChwYXRoKTsKKwlyZWlzZXJmc193YXJuaW5nIChzYiwgInZzLTcwMDI6IHNlYXJjaF9ieV9lbnRyeV9rZXk6IG5vIHBhdGggdG8gaGVyZSIpOworCXJldHVybiBJT19FUlJPUjsKKyAgICB9CisKKyAgICBzZXRfZGVfaXRlbV9sb2NhdGlvbiAoZGUsIHBhdGgpOworCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisgICAgaWYgKCFpc19kaXJlbnRyeV9sZV9paCAoZGUtPmRlX2loKSB8fCAKKwlDT01QX1NIT1JUX0tFWVMgKCYoZGUtPmRlX2loLT5paF9rZXkpLCBrZXkpKSB7CisJcHJpbnRfYmxvY2sgKGRlLT5kZV9iaCwgMCwgLTEsIC0xKTsKKwlyZWlzZXJmc19wYW5pYyAoc2IsICJ2cy03MDA1OiBzZWFyY2hfYnlfZW50cnlfa2V5OiBmb3VuZCBpdGVtICVoIGlzIG5vdCBkaXJlY3RvcnkgaXRlbSBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZG9lcyBub3QgYmVsb25nIHRvIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBrZXkgJUsiLCBkZS0+ZGVfaWgsIGtleSk7CisgICAgfQorI2VuZGlmIC8qIENPTkZJR19SRUlTRVJGU19DSEVDSyAqLworCisgICAgLyogYmluYXJ5IHNlYXJjaCBpbiBkaXJlY3RvcnkgaXRlbSBieSB0aGlyZCBjb21wb25lbiB0IG9mIHRoZQorICAgICAgIGtleS4gc2V0cyBkZS0+ZGVfZW50cnlfbnVtIG9mIGRlICovCisgICAgcmV0dmFsID0gYmluX3NlYXJjaF9pbl9kaXJfaXRlbSAoZGUsIGNwdV9rZXlfa19vZmZzZXQgKGtleSkpOworICAgIHBhdGgtPnBvc19pbl9pdGVtID0gZGUtPmRlX2VudHJ5X251bTsKKyAgICBpZiAocmV0dmFsICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisJLy8gdWdseSwgYnV0IHJlbmFtZSBuZWVkcyBkZV9iaCwgZGVfZGVoLCBkZV9uYW1lLCBkZV9uYW1lbGVuLCBkZV9vYmplY3RpZCBzZXQKKwlzZXRfZGVfbmFtZV9hbmRfbmFtZWxlbiAoZGUpOworCXNldF9kZV9vYmplY3Rfa2V5IChkZSk7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKKworCisvKiBLZXllZCAzMi1iaXQgaGFzaCBmdW5jdGlvbiB1c2luZyBURUEgaW4gYSBEYXZpcy1NZXllciBmdW5jdGlvbiAqLworCisvKiBUaGUgdGhpcmQgY29tcG9uZW50IGlzIGhhc2hlZCwgYW5kIHlvdSBjYW4gY2hvb3NlIGZyb20gbW9yZSB0aGFuCisgICBvbmUgaGFzaCBmdW5jdGlvbi4gIFBlciBkaXJlY3RvcnkgaGFzaGVzIGFyZSBub3QgeWV0IGltcGxlbWVudGVkCisgICBidXQgYXJlIHRob3VnaHQgYWJvdXQuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG1vdmVkIHRvIGhhc2hlcy5jCisgICBKZWRpLCBwbGVhc2UgZG8gc28uICAtSGFucyAqLworCitzdGF0aWMgX191MzIgZ2V0X3RoaXJkX2NvbXBvbmVudCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgCisJCQkJICBjb25zdCBjaGFyICogbmFtZSwgaW50IGxlbikKK3sKKyAgICBfX3UzMiByZXM7CisKKyAgICBpZiAoIWxlbiB8fCAobGVuID09IDEgJiYgbmFtZVswXSA9PSAnLicpKQorCXJldHVybiBET1RfT0ZGU0VUOworICAgIGlmIChsZW4gPT0gMiAmJiBuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICcuJykKKwlyZXR1cm4gRE9UX0RPVF9PRkZTRVQ7CisKKyAgICByZXMgPSBSRUlTRVJGU19TQihzKS0+c19oYXNoX2Z1bmN0aW9uIChuYW1lLCBsZW4pOworCisgICAgLy8gdGFrZSBiaXRzIGZyb20gNy10aCB0byAzMC10aCBpbmNsdWRpbmcgYm90aCBib3VuZHMKKyAgICByZXMgPSBHRVRfSEFTSF9WQUxVRShyZXMpOworICAgIGlmIChyZXMgPT0gMCkKKwkvLyBuZWVkZWQgdG8gaGF2ZSBubyBuYW1lcyBiZWZvcmUgIi4iIGFuZCAiLi4iIHRob3NlIGhhdmUgaGFzaAorCS8vIHZhbHVlID09IDAgYW5kIGdlbmVyYXRpb24gY29udGVycyAxIGFuZCAyIGFjY29yZGluZ2x5CisJcmVzID0gMTI4OworICAgIHJldHVybiByZXMgKyBNQVhfR0VORVJBVElPTl9OVU1CRVI7Cit9CisKKworc3RhdGljIGludCByZWlzZXJmc19tYXRjaCAoc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlLCAKKwkJCSAgIGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbmFtZWxlbikKK3sKKyAgICBpbnQgcmV0dmFsID0gTkFNRV9OT1RfRk9VTkQ7CisKKyAgICBpZiAoKG5hbWVsZW4gPT0gZGUtPmRlX25hbWVsZW4pICYmCisJIW1lbWNtcChkZS0+ZGVfbmFtZSwgbmFtZSwgZGUtPmRlX25hbWVsZW4pKQorCXJldHZhbCA9IChkZV92aXNpYmxlIChkZS0+ZGVfZGVoICsgZGUtPmRlX2VudHJ5X251bSkgPyBOQU1FX0ZPVU5EIDogTkFNRV9GT1VORF9JTlZJU0lCTEUpOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworCisvKiBkZSdzIGRlX2JoLCBkZV9paCwgZGVfZGVoLCBkZV9pdGVtX251bSwgZGVfZW50cnlfbnVtIGFyZSBzZXQgYWxyZWFkeSAqLworCisJCQkJLyogdXNlZCB3aGVuIGhhc2ggY29sbGlzaW9ucyBleGlzdCAqLworCisKK3N0YXRpYyBpbnQgbGluZWFyX3NlYXJjaF9pbl9kaXJfaXRlbSAoc3RydWN0IGNwdV9rZXkgKiBrZXksIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSwKKwkJCQkgICAgICBjb25zdCBjaGFyICogbmFtZSwgaW50IG5hbWVsZW4pCit7CisgICAgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBkZWggPSBkZS0+ZGVfZGVoOworICAgIGludCByZXR2YWw7CisgICAgaW50IGk7CisKKyAgICBpID0gZGUtPmRlX2VudHJ5X251bTsKKworICAgIGlmIChpID09IElfRU5UUllfQ09VTlQgKGRlLT5kZV9paCkgfHwKKwlHRVRfSEFTSF9WQUxVRSAoZGVoX29mZnNldCAoZGVoICsgaSkpICE9IEdFVF9IQVNIX1ZBTFVFIChjcHVfa2V5X2tfb2Zmc2V0IChrZXkpKSkgeworCWkgLS07CisgICAgfQorCisgICAgUkZBTFNFKCBkZS0+ZGVfZGVoICE9IEJfSV9ERUggKGRlLT5kZV9iaCwgZGUtPmRlX2loKSwKKwkgICAgInZzLTcwMTA6IGFycmF5IG9mIGVudHJ5IGhlYWRlcnMgbm90IGZvdW5kIik7CisKKyAgICBkZWggKz0gaTsKKworICAgIGZvciAoOyBpID49IDA7IGkgLS0sIGRlaCAtLSkgeworCWlmIChHRVRfSEFTSF9WQUxVRSAoZGVoX29mZnNldCAoZGVoKSkgIT0KKwkgICAgR0VUX0hBU0hfVkFMVUUgKGNwdV9rZXlfa19vZmZzZXQgKGtleSkpKSB7CisJICAgIC8vIGhhc2ggdmFsdWUgZG9lcyBub3QgbWF0Y2gsIG5vIG5lZWQgdG8gY2hlY2sgd2hvbGUgbmFtZQorCSAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisJfQorICAgCisJLyogbWFyaywgdGhhdCB0aGlzIGdlbmVyYXRpb24gbnVtYmVyIGlzIHVzZWQgKi8KKwlpZiAoZGUtPmRlX2dlbl9udW1iZXJfYml0X3N0cmluZykKKwkgICAgc2V0X2JpdCAoR0VUX0dFTkVSQVRJT05fTlVNQkVSIChkZWhfb2Zmc2V0IChkZWgpKSwgKHVuc2lnbmVkIGxvbmcgKilkZS0+ZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nKTsKKworCS8vIGNhbGN1bGF0ZSBwb2ludGVyIHRvIG5hbWUgYW5kIG5hbWVsZW4KKwlkZS0+ZGVfZW50cnlfbnVtID0gaTsKKwlzZXRfZGVfbmFtZV9hbmRfbmFtZWxlbiAoZGUpOworCisJaWYgKChyZXR2YWwgPSByZWlzZXJmc19tYXRjaCAoZGUsIG5hbWUsIG5hbWVsZW4pKSAhPSBOQU1FX05PVF9GT1VORCkgeworCSAgICAvLyBkZSdzIGRlX25hbWUsIGRlX25hbWVsZW4sIGRlX3JlY29yZGxlbiBhcmUgc2V0LiBGaWxsIHRoZSByZXN0OgorCisJICAgIC8vIGtleSBvZiBwb2ludGVkIG9iamVjdAorCSAgICBzZXRfZGVfb2JqZWN0X2tleSAoZGUpOworCisJICAgIHN0b3JlX2RlX2VudHJ5X2tleSAoZGUpOworCisJICAgIC8vIHJldHZhbCBjYW4gYmUgTkFNRV9GT1VORCBvciBOQU1FX0ZPVU5EX0lOVklTSUJMRQorCSAgICByZXR1cm4gcmV0dmFsOworCX0KKyAgICB9CisKKyAgICBpZiAoR0VUX0dFTkVSQVRJT05fTlVNQkVSIChsZV9paF9rX29mZnNldCAoZGUtPmRlX2loKSkgPT0gMCkKKwkvKiB3ZSBoYXZlIHJlYWNoZWQgbGVmdCBtb3N0IGVudHJ5IGluIHRoZSBub2RlLiBJbiBjb21tb24gd2UKKyAgICAgICAgICAgaGF2ZSB0byBnbyB0byB0aGUgbGVmdCBuZWlnaGJvciwgYnV0IGlmIGdlbmVyYXRpb24gY291bnRlcgorICAgICAgICAgICBpcyAwIGFscmVhZHksIHdlIGtub3cgZm9yIHN1cmUsIHRoYXQgdGhlcmUgaXMgbm8gbmFtZSB3aXRoCisgICAgICAgICAgIHRoZSBzYW1lIGhhc2ggdmFsdWUgKi8KKwkvLyBGSVhNRTogdGhpcyB3b3JrIGNvcnJlY3RseSBvbmx5IGJlY2F1c2UgaGFzaCB2YWx1ZSBjYW4gbm90CisJLy8gYmUgMC4gQnR3LCBpbiBjYXNlIG9mIFl1cmEncyBoYXNoIGl0IGlzIHByb2JhYmx5IHBvc3NpYmxlLAorCS8vIHNvLCB0aGlzIGlzIGEgYnVnCisJcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCisgICAgUkZBTFNFKCBkZS0+ZGVfaXRlbV9udW0sCisJICAgICJ2cy03MDE1OiB0d28gZGlyaXRlbXMgb2YgdGhlIHNhbWUgZGlyZWN0b3J5IGluIG9uZSBub2RlPyIpOworCisgICAgcmV0dXJuIEdPVE9fUFJFVklPVVNfSVRFTTsKK30KKworCisvLyBtYXkgcmV0dXJuIE5BTUVfRk9VTkQsIE5BTUVfRk9VTkRfSU5WSVNJQkxFLCBOQU1FX05PVF9GT1VORAorLy8gRklYTUU6IHNob3VsZCBhZGQgc29tZXRoaW5nIGxpa2UgSU9FUlJPUgorc3RhdGljIGludCByZWlzZXJmc19maW5kX2VudHJ5IChzdHJ1Y3QgaW5vZGUgKiBkaXIsIGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbmFtZWxlbiwgCisJCQkJc3RydWN0IHBhdGggKiBwYXRoX3RvX2VudHJ5LCBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUpCit7CisgICAgc3RydWN0IGNwdV9rZXkga2V5X3RvX3NlYXJjaDsKKyAgICBpbnQgcmV0dmFsOworCisKKyAgICBpZiAobmFtZWxlbiA+IFJFSVNFUkZTX01BWF9OQU1FIChkaXItPmlfc2ItPnNfYmxvY2tzaXplKSkKKwlyZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisKKyAgICAvKiB3ZSB3aWxsIHNlYXJjaCBmb3IgdGhpcyBrZXkgaW4gdGhlIHRyZWUgKi8KKyAgICBtYWtlX2NwdV9rZXkgKCZrZXlfdG9fc2VhcmNoLCBkaXIsIAorCQkgIGdldF90aGlyZF9jb21wb25lbnQgKGRpci0+aV9zYiwgbmFtZSwgbmFtZWxlbiksIFRZUEVfRElSRU5UUlksIDMpOworCisgICAgd2hpbGUgKDEpIHsKKwlyZXR2YWwgPSBzZWFyY2hfYnlfZW50cnlfa2V5IChkaXItPmlfc2IsICZrZXlfdG9fc2VhcmNoLCBwYXRoX3RvX2VudHJ5LCBkZSk7CisJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCSAgICByZWlzZXJmc193YXJuaW5nIChkaXItPmlfc2IsICJ6YW0tNzAwMTogaW8gZXJyb3IgaW4gJXMiLAorCQkJICAgICAgX19GVU5DVElPTl9fKTsKKwkgICAgcmV0dXJuIElPX0VSUk9SOworCX0KKworCS8qIGNvbXBhcmUgbmFtZXMgZm9yIGFsbCBlbnRyaWVzIGhhdmluZyBnaXZlbiBoYXNoIHZhbHVlICovCisJcmV0dmFsID0gbGluZWFyX3NlYXJjaF9pbl9kaXJfaXRlbSAoJmtleV90b19zZWFyY2gsIGRlLCBuYW1lLCBuYW1lbGVuKTsKKwlpZiAocmV0dmFsICE9IEdPVE9fUFJFVklPVVNfSVRFTSkgeworCSAgICAvKiB0aGVyZSBpcyBubyBuZWVkIHRvIHNjYW4gZGlyZWN0b3J5IGFueW1vcmUuIEdpdmVuIGVudHJ5IGZvdW5kIG9yIGRvZXMgbm90IGV4aXN0ICovCisJICAgIHBhdGhfdG9fZW50cnktPnBvc19pbl9pdGVtID0gZGUtPmRlX2VudHJ5X251bTsKKwkgICAgcmV0dXJuIHJldHZhbDsKKwl9CisKKwkvKiB0aGVyZSBpcyBsZWZ0IG5laWdoYm9yaW5nIGl0ZW0gb2YgdGhpcyBkaXJlY3RvcnkgYW5kIGdpdmVuIGVudHJ5IGNhbiBiZSB0aGVyZSAqLworCXNldF9jcHVfa2V5X2tfb2Zmc2V0ICgma2V5X3RvX3NlYXJjaCwgbGVfaWhfa19vZmZzZXQgKGRlLT5kZV9paCkgLSAxKTsKKwlwYXRocmVsc2UgKHBhdGhfdG9fZW50cnkpOworCisgICAgfSAvKiB3aGlsZSAoMSkgKi8KK30KKworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqIHJlaXNlcmZzX2xvb2t1cCAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKyAgICBpbnQgcmV0dmFsOworICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlID0gTlVMTDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOworICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aF90b19lbnRyeSk7CisKKyAgICBpZiAoUkVJU0VSRlNfTUFYX05BTUUgKGRpci0+aV9zYi0+c19ibG9ja3NpemUpIDwgZGVudHJ5LT5kX25hbWUubGVuKQorCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhkaXItPmlfc2IpOworICAgIGRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7CisgICAgcmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sICZwYXRoX3RvX2VudHJ5LCAmZGUpOworICAgIHBhdGhyZWxzZSAoJnBhdGhfdG9fZW50cnkpOworICAgIGlmIChyZXR2YWwgPT0gTkFNRV9GT1VORCkgeworICAgICAgICAvKiBIaWRlIHRoZSAucmVpc2VyZnNfcHJpdiBkaXJlY3RvcnkgKi8KKwlpZiAocmVpc2VyZnNfeGF0dHJzIChkaXItPmlfc2IpICYmCisJICAgICFvbGRfZm9ybWF0X29ubHkoZGlyLT5pX3NiKSAmJgorICAgICAgICAgICAgUkVJU0VSRlNfU0IoZGlyLT5pX3NiKS0+cHJpdl9yb290ICYmCisgICAgICAgICAgICBSRUlTRVJGU19TQihkaXItPmlfc2IpLT5wcml2X3Jvb3QtPmRfaW5vZGUgJiYKKwkgICAgZGUuZGVfb2JqZWN0aWQgPT0gbGUzMl90b19jcHUgKElOT0RFX1BLRVkoUkVJU0VSRlNfU0IoZGlyLT5pX3NiKS0+cHJpdl9yb290LT5kX2lub2RlKS0+a19vYmplY3RpZCkpIHsKKwkgIHJlaXNlcmZzX3dyaXRlX3VubG9jayAoZGlyLT5pX3NiKTsKKwkgIHJldHVybiBFUlJfUFRSICgtRUFDQ0VTKTsKKwl9CisKKwlpbm9kZSA9IHJlaXNlcmZzX2lnZXQgKGRpci0+aV9zYiwgKHN0cnVjdCBjcHVfa2V5ICopJihkZS5kZV9kaXJfaWQpKTsKKwlpZiAoIWlub2RlIHx8IElTX0VSUihpbm9kZSkpIHsKKwkgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisJICAgIHJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworICAgICAgICB9CisKKwkvKiBQcm9wb2dhdGUgdGhlIHByaXZfb2JqZWN0IGZsYWcgc28gd2Uga25vdyB3ZSdyZSBpbiB0aGUgcHJpdiB0cmVlICovCisJaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0IChkaXIpKQorCSAgICByZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUgKGlub2RlKTsKKyAgICB9CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisgICAgaWYgKCByZXR2YWwgPT0gSU9fRVJST1IgKSB7CisJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisgICAgfQorCisgICAgaWYgKGlub2RlKQorCSAgICByZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CisgICAgCisgICAgZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLyogCisqKiBsb29rcyB1cCB0aGUgZGVudHJ5IG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGZvciBjaGlsZC4KKyoqIHRha2VuIGZyb20gZXh0Ml9nZXRfcGFyZW50CisqLworc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZCkKK3sKKyAgICBpbnQgcmV0dmFsOworICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlID0gTlVMTDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOworICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aF90b19lbnRyeSk7CisgICAgc3RydWN0IGRlbnRyeSAqcGFyZW50OworICAgIHN0cnVjdCBpbm9kZSAqZGlyID0gY2hpbGQtPmRfaW5vZGUgOworCisKKyAgICBpZiAoZGlyLT5pX25saW5rID09IDApIHsKKwlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKyAgICB9CisgICAgZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKKworICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKKyAgICByZXR2YWwgPSByZWlzZXJmc19maW5kX2VudHJ5IChkaXIsICIuLiIsIDIsICZwYXRoX3RvX2VudHJ5LCAmZGUpOworICAgIHBhdGhyZWxzZSAoJnBhdGhfdG9fZW50cnkpOworICAgIGlmIChyZXR2YWwgIT0gTkFNRV9GT1VORCkgeworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworICAgIH0KKyAgICBpbm9kZSA9IHJlaXNlcmZzX2lnZXQgKGRpci0+aV9zYiwgKHN0cnVjdCBjcHVfa2V5ICopJihkZS5kZV9kaXJfaWQpKTsKKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKworICAgIGlmICghaW5vZGUgfHwgSVNfRVJSKGlub2RlKSkgeworCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworICAgIH0KKyAgICBwYXJlbnQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOworICAgIGlmICghcGFyZW50KSB7CisJaXB1dChpbm9kZSk7CisJcGFyZW50ID0gRVJSX1BUUigtRU5PTUVNKTsKKyAgICB9CisgICAgcmV0dXJuIHBhcmVudDsKK30KKworCisvKiBhZGQgZW50cnkgdG8gdGhlIGRpcmVjdG9yeSAoZW50cnkgY2FuIGJlIGhpZGRlbikuIAorCitpbnNlcnQgZGVmaW5pdGlvbiBvZiB3aGVuIGhpZGRlbiBkaXJlY3RvcmllcyBhcmUgdXNlZCBoZXJlIC1IYW5zCisKKyBEb2VzIG5vdCBtYXJrIGRpciAgIGlub2RlIGRpcnR5LCBkbyBpdCBhZnRlciBzdWNjZXNzZXNmdWxsIGNhbGwgdG8gaXQgKi8KKworc3RhdGljIGludCByZWlzZXJmc19hZGRfZW50cnkgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKiBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIG5hbWUsIGludCBuYW1lbGVuLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKKwkJCSAgICAgICBpbnQgdmlzaWJsZSkKK3sKKyAgICBzdHJ1Y3QgY3B1X2tleSBlbnRyeV9rZXk7CisgICAgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBkZWg7CisgICAgSU5JVElBTElaRV9QQVRIIChwYXRoKTsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOworICAgIGludCBiaXRfc3RyaW5nIFtNQVhfR0VORVJBVElPTl9OVU1CRVIgLyAoc2l6ZW9mKGludCkgKiA4KSArIDFdOworICAgIGludCBnZW5fbnVtYmVyOworICAgIGNoYXIgc21hbGxfYnVmWzMyK0RFSF9TSVpFXSA7IC8qIDQ4IGJ5dGVzIG5vdyBhbmQgd2UgYXZvaWQga21hbGxvYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHdlIGNyZWF0ZSBmaWxlIHdpdGggc2hvcnQgbmFtZSAqLworICAgIGNoYXIgKiBidWZmZXI7CisgICAgaW50IGJ1ZmxlbiwgcGFzdGVfc2l6ZTsKKyAgICBpbnQgcmV0dmFsOworCisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCisgICAgLyogY2Fubm90IGFsbG93IGl0ZW1zIHRvIGJlIGFkZGVkIGludG8gYSBidXN5IGRlbGV0ZWQgZGlyZWN0b3J5ICovCisgICAgaWYgKCFuYW1lbGVuKQorCXJldHVybiAtRUlOVkFMOworCisgICAgaWYgKG5hbWVsZW4gPiBSRUlTRVJGU19NQVhfTkFNRSAoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpCisJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKyAgICAvKiBlYWNoIGVudHJ5IGhhcyB1bmlxdWUga2V5LiBjb21wb3NlIGl0ICovCisgICAgbWFrZV9jcHVfa2V5ICgmZW50cnlfa2V5LCBkaXIsIAorCQkgIGdldF90aGlyZF9jb21wb25lbnQgKGRpci0+aV9zYiwgbmFtZSwgbmFtZWxlbiksIFRZUEVfRElSRU5UUlksIDMpOworCisgICAgLyogZ2V0IG1lbW9yeSBmb3IgY29tcG9zaW5nIHRoZSBlbnRyeSAqLworICAgIGJ1ZmxlbiA9IERFSF9TSVpFICsgUk9VTkRfVVAgKG5hbWVsZW4pOworICAgIGlmIChidWZsZW4gPiBzaXplb2YgKHNtYWxsX2J1ZikpIHsKKwlidWZmZXIgPSByZWlzZXJmc19rbWFsbG9jIChidWZsZW4sIEdGUF9OT0ZTLCBkaXItPmlfc2IpOworCWlmIChidWZmZXIgPT0gMCkKKwkgICAgcmV0dXJuIC1FTk9NRU07CisgICAgfSBlbHNlCisJYnVmZmVyID0gc21hbGxfYnVmOworCisgICAgcGFzdGVfc2l6ZSA9IChnZXRfaW5vZGVfc2RfdmVyc2lvbiAoZGlyKSA9PSBTVEFUX0RBVEFfVjEpID8gKERFSF9TSVpFICsgbmFtZWxlbikgOiBidWZsZW47CisKKyAgICAvKiBmaWxsIGJ1ZmZlciA6IGRpcmVjdG9yeSBlbnRyeSBoZWFkLCBuYW1lWywgZGlyIG9iamVjdGlkIHwgLCBzdGF0IGRhdGEgfCAsc3RhdCBkYXRhLCBkaXIgb2JqZWN0aWQgXSAqLworICAgIGRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJ1ZmZlcjsKKyAgICBkZWgtPmRlaF9sb2NhdGlvbiA9IDA7IC8qIEpETSBFbmRpYW4gc2FmZSBpZiAwICovCisgICAgcHV0X2RlaF9vZmZzZXQoIGRlaCwgY3B1X2tleV9rX29mZnNldCggJmVudHJ5X2tleSApICk7CisgICAgZGVoLT5kZWhfc3RhdGUgPSAwOyAvKiBKRE0gRW5kaWFuIHNhZmUgaWYgMCAqLworICAgIC8qIHB1dCBrZXkgKGlubyBhbmFsb2cpIHRvIGRlICovCisgICAgZGVoLT5kZWhfZGlyX2lkID0gSU5PREVfUEtFWSAoaW5vZGUpLT5rX2Rpcl9pZDsgLyogc2FmZToga19kaXJfaWQgaXMgbGUgKi8KKyAgICBkZWgtPmRlaF9vYmplY3RpZCA9IElOT0RFX1BLRVkgKGlub2RlKS0+a19vYmplY3RpZDsgLyogc2FmZToga19vYmplY3RpZCBpcyBsZSAqLworCisgICAgLyogY29weSBuYW1lICovCisgICAgbWVtY3B5ICgoY2hhciAqKShkZWggKyAxKSwgbmFtZSwgbmFtZWxlbik7CisgICAgLyogcGFkZCBieSAwcyB0byB0aGUgNCBieXRlIGJvdW5kYXJ5ICovCisgICAgcGFkZF9pdGVtICgoY2hhciAqKShkZWggKyAxKSwgUk9VTkRfVVAgKG5hbWVsZW4pLCBuYW1lbGVuKTsKKworICAgIC8qIGVudHJ5IGlzIHJlYWR5IHRvIGJlIHBhc3RlZCBpbnRvIHRyZWUsIHNldCAndmlzaWJpbGl0eScgYW5kICdzdGF0IGRhdGEgaW4gZW50cnknIGF0dHJpYnV0ZXMgKi8KKyAgICBtYXJrX2RlX3dpdGhvdXRfc2QgKGRlaCk7CisgICAgdmlzaWJsZSA/IG1hcmtfZGVfdmlzaWJsZSAoZGVoKSA6IG1hcmtfZGVfaGlkZGVuIChkZWgpOworCisgICAgLyogZmluZCB0aGUgcHJvcGVyIHBsYWNlIGZvciB0aGUgbmV3IGVudHJ5ICovCisgICAgbWVtc2V0IChiaXRfc3RyaW5nLCAwLCBzaXplb2YgKGJpdF9zdHJpbmcpKTsKKyAgICBkZS5kZV9nZW5fbnVtYmVyX2JpdF9zdHJpbmcgPSAoY2hhciAqKWJpdF9zdHJpbmc7CisgICAgcmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAoZGlyLCBuYW1lLCBuYW1lbGVuLCAmcGF0aCwgJmRlKTsKKyAgICBpZiggcmV0dmFsICE9IE5BTUVfTk9UX0ZPVU5EICkgeworCWlmIChidWZmZXIgIT0gc21hbGxfYnVmKQorCSAgICByZWlzZXJmc19rZnJlZSAoYnVmZmVyLCBidWZsZW4sIGRpci0+aV9zYik7CisJcGF0aHJlbHNlICgmcGF0aCk7CisKKwlpZiAoIHJldHZhbCA9PSBJT19FUlJPUiApIHsKKwkgICAgcmV0dXJuIC1FSU87CisJfQorCisgICAgICAgIGlmIChyZXR2YWwgIT0gTkFNRV9GT1VORCkgeworCSAgICByZWlzZXJmc193YXJuaW5nIChkaXItPmlfc2IsICJ6YW0tNzAwMjolczogXCJyZWlzZXJmc19maW5kX2VudHJ5XCIgIgorCQkJICAgICAgImhhcyByZXR1cm5lZCB1bmV4cGVjdGVkIHZhbHVlICglZCkiLAorCQkJICAgICAgX19GVU5DVElPTl9fLCByZXR2YWwpOworICAgICAgIH0KKworCXJldHVybiAtRUVYSVNUOworICAgIH0KKworICAgIGdlbl9udW1iZXIgPSBmaW5kX2ZpcnN0X3plcm9fYml0ICgodW5zaWduZWQgbG9uZyAqKWJpdF9zdHJpbmcsIE1BWF9HRU5FUkFUSU9OX05VTUJFUiArIDEpOworICAgIGlmIChnZW5fbnVtYmVyID4gTUFYX0dFTkVSQVRJT05fTlVNQkVSKSB7CisgICAgICAvKiB0aGVyZSBpcyBubyBmcmVlIGdlbmVyYXRpb24gbnVtYmVyICovCisgICAgICByZWlzZXJmc193YXJuaW5nIChkaXItPmlfc2IsICJyZWlzZXJmc19hZGRfZW50cnk6IENvbmdyYXR1bGF0aW9ucyEgd2UgaGF2ZSBnb3QgaGFzaCBmdW5jdGlvbiBzY3Jld2VkIHVwIik7CisgICAgICBpZiAoYnVmZmVyICE9IHNtYWxsX2J1ZikKKyAgICAgICAgICByZWlzZXJmc19rZnJlZSAoYnVmZmVyLCBidWZsZW4sIGRpci0+aV9zYik7CisgICAgICBwYXRocmVsc2UgKCZwYXRoKTsKKyAgICAgIHJldHVybiAtRUJVU1k7CisgICAgfQorICAgIC8qIGFkanVzdCBvZmZzZXQgb2YgZGlyZWN0b3J5IGVucnR5ICovCisgICAgcHV0X2RlaF9vZmZzZXQoZGVoLCBTRVRfR0VORVJBVElPTl9OVU1CRVIoZGVoX29mZnNldChkZWgpLCBnZW5fbnVtYmVyKSk7CisgICAgc2V0X2NwdV9rZXlfa19vZmZzZXQgKCZlbnRyeV9rZXksIGRlaF9vZmZzZXQoZGVoKSk7CisgCisgICAgLyogdXBkYXRlIG1heC1oYXNoLWNvbGxpc2lvbnMgY291bnRlciBpbiByZWlzZXJmc19zYl9pbmZvICovCisgICAgUFJPQ19JTkZPX01BWCggdGggLT4gdF9zdXBlciwgbWF4X2hhc2hfY29sbGlzaW9ucywgZ2VuX251bWJlciApOworIAkJICAKKyAgICBpZiAoZ2VuX251bWJlciAhPSAwKSB7CS8qIHdlIG5lZWQgdG8gcmUtc2VhcmNoIGZvciB0aGUgaW5zZXJ0aW9uIHBvaW50ICovCisgICAgICBpZiAoc2VhcmNoX2J5X2VudHJ5X2tleSAoZGlyLT5pX3NiLCAmZW50cnlfa2V5LCAmcGF0aCwgJmRlKSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgcmVpc2VyZnNfd2FybmluZyAoZGlyLT5pX3NiLCAidnMtNzAzMjogcmVpc2VyZnNfYWRkX2VudHJ5OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW50cnkgd2l0aCB0aGlzIGtleSAoJUspIGFscmVhZHkgZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnRyeV9rZXkpOworCisJICAgIGlmIChidWZmZXIgIT0gc21hbGxfYnVmKQorCQlyZWlzZXJmc19rZnJlZSAoYnVmZmVyLCBidWZsZW4sIGRpci0+aV9zYik7CisJICAgIHBhdGhyZWxzZSAoJnBhdGgpOworCSAgICByZXR1cm4gLUVCVVNZOworCX0KKyAgICB9CisgIAorICAgIC8qIHBlcmZvcm0gdGhlIGluc2VydGlvbiBvZiB0aGUgZW50cnkgdGhhdCB3ZSBoYXZlIHByZXBhcmVkICovCisgICAgcmV0dmFsID0gcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtICh0aCwgJnBhdGgsICZlbnRyeV9rZXksIGRpciwgYnVmZmVyLCBwYXN0ZV9zaXplKTsKKyAgICBpZiAoYnVmZmVyICE9IHNtYWxsX2J1ZikKKwlyZWlzZXJmc19rZnJlZSAoYnVmZmVyLCBidWZsZW4sIGRpci0+aV9zYik7CisgICAgaWYgKHJldHZhbCkgeworCXJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGgpIDsKKwlyZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIGRpci0+aV9zaXplICs9IHBhc3RlX3NpemU7CisgICAgZGlyLT5pX210aW1lID0gZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKyAgICBpZiAoIVNfSVNESVIgKGlub2RlLT5pX21vZGUpICYmIHZpc2libGUpCisJLy8gcmVpc2VyZnNfbWtkaXIgb3IgcmVpc2VyZnNfcmVuYW1lIHdpbGwgZG8gdGhhdCBieSBpdHNlbGYKKwlyZWlzZXJmc191cGRhdGVfc2QgKHRoLCBkaXIpOworCisgICAgcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCkgOworICAgIHJldHVybiAwOworfQorCisvKiBxdW90YSB1dGlsaXR5IGZ1bmN0aW9uLCBjYWxsIGlmIHlvdSd2ZSBoYWQgdG8gYWJvcnQgYWZ0ZXIgY2FsbGluZworKiogbmV3X2lub2RlX2luaXQsIGFuZCBoYXZlIG5vdCBjYWxsZWQgcmVpc2VyZnNfbmV3X2lub2RlIHlldC4KKyoqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGlub2RlcyB0aGF0IGRvIG5vdCBoYXZlIHN0YXQgZGF0YQorKiogaW5zZXJ0ZWQgaW50byB0aGUgdHJlZSB5ZXQuCisqLworc3RhdGljIGludCBkcm9wX25ld19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKSB7CisgICAgRFFVT1RfRFJPUChpbm9kZSk7CisgICAgbWFrZV9iYWRfaW5vZGUoaW5vZGUpIDsKKyAgICBpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7CisgICAgaXB1dChpbm9kZSkgOworICAgIHJldHVybiAwIDsKK30KKworLyogdXRpbGl0eSBmdW5jdGlvbiB0aGF0IGRvZXMgc2V0dXAgZm9yIHJlaXNlcmZzX25ld19pbm9kZS4gIAorKiogRFFVT1RfSU5JVCBuZWVkcyBsb3RzIG9mIGNyZWRpdHMgc28gaXQncyBiZXR0ZXIgdG8gaGF2ZSBpdAorKiogb3V0c2lkZSBvZiBhIHRyYW5zYWN0aW9uLCBzbyB3ZSBoYWQgdG8gcHVsbCBzb21lIGJpdHMgb2YKKyoqIHJlaXNlcmZzX25ld19pbm9kZSBvdXQgaW50byB0aGlzIGZ1bmMuCisqLworc3RhdGljIGludCBuZXdfaW5vZGVfaW5pdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpciwgaW50IG1vZGUpIHsKKworICAgIC8qIHRoZSBxdW90YSBpbml0IGNhbGxzIGhhdmUgdG8ga25vdyB3aG8gdG8gY2hhcmdlIHRoZSBxdW90YSB0bywgc28KKyAgICAqKiB3ZSBoYXZlIHRvIHNldCB1aWQgYW5kIGdpZCBoZXJlCisgICAgKi8KKyAgICBpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKKyAgICBpbm9kZS0+aV9tb2RlID0gbW9kZTsKKworICAgIGlmIChkaXItPmlfbW9kZSAmIFNfSVNHSUQpIHsKKyAgICAgICAgaW5vZGUtPmlfZ2lkID0gZGlyLT5pX2dpZDsKKyAgICAgICAgaWYgKFNfSVNESVIobW9kZSkpCisgICAgICAgICAgICBpbm9kZS0+aV9tb2RlIHw9IFNfSVNHSUQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisgICAgfQorICAgIERRVU9UX0lOSVQoaW5vZGUpOworICAgIHJldHVybiAwIDsKK30KKworc3RhdGljIGludCByZWlzZXJmc19jcmVhdGUgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisgICAgaW50IHJldHZhbDsKKyAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKyAgICAvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyAodXNlcitncm91cCkqKHF1b3RhcyBmb3IgbmV3IGlub2RlICsgdXBkYXRlIG9mIHF1b3RhIGZvciBkaXJlY3Rvcnkgb3duZXIpICovCisgICAgaW50IGpiZWdpbl9jb3VudCA9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMiArIDIgKiAoUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MrUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKTsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKKyAgICBpbnQgbG9ja2VkOworCisgICAgaWYgKCEoaW5vZGUgPSBuZXdfaW5vZGUoZGlyLT5pX3NiKSkpIHsKKwlyZXR1cm4gLUVOT01FTSA7CisgICAgfQorICAgIG5ld19pbm9kZV9pbml0KGlub2RlLCBkaXIsIG1vZGUpOworCisgICAgbG9ja2VkID0gcmVpc2VyZnNfY2FjaGVfZGVmYXVsdF9hY2wgKGRpcik7CisKKyAgICByZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7CisKKyAgICBpZiAobG9ja2VkKQorICAgICAgICByZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyAoZGlyLT5pX3NiKTsKKworICAgIHJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisgICAgaWYgKHJldHZhbCkgeworICAgICAgICBkcm9wX25ld19pbm9kZSAoaW5vZGUpOworICAgICAgICBnb3RvIG91dF9mYWlsZWQ7CisgICAgfQorCisgICAgcmV0dmFsID0gcmVpc2VyZnNfbmV3X2lub2RlICgmdGgsIGRpciwgbW9kZSwgMCwgMC8qaV9zaXplKi8sIGRlbnRyeSwgaW5vZGUpOworICAgIGlmIChyZXR2YWwpCisgICAgICAgIGdvdG8gb3V0X2ZhaWxlZDsKKwkKKyAgICBpZiAobG9ja2VkKSB7CisgICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMgKGRpci0+aV9zYik7CisgICAgICAgIGxvY2tlZCA9IDA7CisgICAgfQorCisgICAgaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworICAgIGlub2RlLT5pX2ZvcCA9ICZyZWlzZXJmc19maWxlX29wZXJhdGlvbnM7CisgICAgaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIDsKKworICAgIHJldHZhbCA9IHJlaXNlcmZzX2FkZF9lbnRyeSAoJnRoLCBkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgCisJCQkJaW5vZGUsIDEvKnZpc2libGUqLyk7CisgICAgaWYgKHJldHZhbCkgeworICAgICAgICBpbnQgZXJyOworCWlub2RlLT5pX25saW5rLS07CisJcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlKTsKKwllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICByZXR2YWwgPSBlcnI7CisJaXB1dCAoaW5vZGUpOworCWdvdG8gb3V0X2ZhaWxlZDsKKyAgICB9CisgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7CisgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGRpcikgOworCisgICAgZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKyAgICByZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisKK291dF9mYWlsZWQ6CisgICAgaWYgKGxvY2tlZCkKKyAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyAoZGlyLT5pX3NiKTsKKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfbWtub2QgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwgZGV2X3QgcmRldikKK3sKKyAgICBpbnQgcmV0dmFsOworICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlOworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOworICAgIC8qIFdlIG5lZWQgYmxvY2tzIGZvciB0cmFuc2FjdGlvbiArICh1c2VyK2dyb3VwKSoocXVvdGFzIGZvciBuZXcgaW5vZGUgKyB1cGRhdGUgb2YgcXVvdGEgZm9yIGRpcmVjdG9yeSBvd25lcikgKi8KKyAgICBpbnQgamJlZ2luX2NvdW50ID0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAzICsgMiAqIChSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUytSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MpOworICAgIGludCBsb2NrZWQ7CisKKyAgICBpZiAoIW5ld192YWxpZF9kZXYocmRldikpCisJcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoIShpbm9kZSA9IG5ld19pbm9kZShkaXItPmlfc2IpKSkgeworCXJldHVybiAtRU5PTUVNIDsKKyAgICB9CisgICAgbmV3X2lub2RlX2luaXQoaW5vZGUsIGRpciwgbW9kZSk7CisKKyAgICBsb2NrZWQgPSByZWlzZXJmc19jYWNoZV9kZWZhdWx0X2FjbCAoZGlyKTsKKworICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKKworICAgIGlmIChsb2NrZWQpCisgICAgICAgIHJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJzIChkaXItPmlfc2IpOworCisgICAgcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisgICAgaWYgKHJldHZhbCkgeworICAgICAgICBkcm9wX25ld19pbm9kZSAoaW5vZGUpOworICAgICAgICBnb3RvIG91dF9mYWlsZWQ7CisgICAgfQorCisgICAgcmV0dmFsID0gcmVpc2VyZnNfbmV3X2lub2RlICgmdGgsIGRpciwgbW9kZSwgTlVMTCwgMC8qaV9zaXplKi8sIGRlbnRyeSwgaW5vZGUpOworICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgZ290byBvdXRfZmFpbGVkOworICAgIH0KKworICAgIGlmIChsb2NrZWQpIHsKKyAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyAoZGlyLT5pX3NiKTsKKyAgICAgICAgbG9ja2VkID0gMDsKKyAgICB9CisKKworICAgIGlub2RlLT5pX29wID0gJnJlaXNlcmZzX3NwZWNpYWxfaW5vZGVfb3BlcmF0aW9uczsKKyAgICBpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsIHJkZXYpIDsKKworICAgIC8vRklYTUU6IG5lZWRlZCBmb3IgYmxvY2sgYW5kIGNoYXIgZGV2aWNlcyBvbmx5CisgICAgcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlKTsKKworICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOworICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihkaXIpIDsKKworICAgIHJldHZhbCA9IHJlaXNlcmZzX2FkZF9lbnRyeSAoJnRoLCBkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgCisJCQkJIGlub2RlLCAxLyp2aXNpYmxlKi8pOworICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgaW50IGVycjsKKwlpbm9kZS0+aV9ubGluay0tOworCXJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBpbm9kZSk7CisJZXJyID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOworICAgICAgICBpZiAoZXJyKQorCSAgICByZXR2YWwgPSBlcnI7CisJaXB1dCAoaW5vZGUpOworCWdvdG8gb3V0X2ZhaWxlZDsKKyAgICB9CisKKyAgICBkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworICAgIHJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKKworb3V0X2ZhaWxlZDoKKyAgICBpZiAobG9ja2VkKQorICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzIChkaXItPmlfc2IpOworICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKworc3RhdGljIGludCByZWlzZXJmc19ta2RpciAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQoreworICAgIGludCByZXR2YWw7CisgICAgc3RydWN0IGlub2RlICogaW5vZGU7CisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7CisgICAgLyogV2UgbmVlZCBibG9ja3MgZm9yIHRyYW5zYWN0aW9uICsgKHVzZXIrZ3JvdXApKihxdW90YXMgZm9yIG5ldyBpbm9kZSArIHVwZGF0ZSBvZiBxdW90YSBmb3IgZGlyZWN0b3J5IG93bmVyKSAqLworICAgIGludCBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyAyICogKFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTK1JFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyk7CisgICAgaW50IGxvY2tlZDsKKworI2lmZGVmIERJU1BMQUNFX05FV19QQUNLSU5HX0xPQ0FMSVRJRVMKKyAgICAvKiBzZXQgZmxhZyB0aGF0IG5ldyBwYWNraW5nIGxvY2FsaXR5IGNyZWF0ZWQgYW5kIG5ldyBibG9ja3MgZm9yIHRoZSBjb250ZW50ICAgICAqIG9mIHRoYXQgZGlyZWN0b3J5IGFyZSBub3QgZGlzcGxhY2VkIHlldCAqLworICAgIFJFSVNFUkZTX0koZGlyKS0+bmV3X3BhY2tpbmdfbG9jYWxpdHkgPSAxOworI2VuZGlmCisgICAgbW9kZSA9IFNfSUZESVIgfCBtb2RlOworICAgIGlmICghKGlub2RlID0gbmV3X2lub2RlKGRpci0+aV9zYikpKSB7CisJcmV0dXJuIC1FTk9NRU0gOworICAgIH0KKyAgICBuZXdfaW5vZGVfaW5pdChpbm9kZSwgZGlyLCBtb2RlKTsKKworICAgIGxvY2tlZCA9IHJlaXNlcmZzX2NhY2hlX2RlZmF1bHRfYWNsIChkaXIpOworCisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhkaXItPmlfc2IpOworICAgIGlmIChsb2NrZWQpCisgICAgICAgIHJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJzIChkaXItPmlfc2IpOworCisgICAgcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisgICAgaWYgKHJldHZhbCkgeworICAgICAgICBkcm9wX25ld19pbm9kZSAoaW5vZGUpOworICAgICAgICBnb3RvIG91dF9mYWlsZWQ7CisgICAgfQorCisKKyAgICAvKiBpbmMgdGhlIGxpbmsgY291bnQgbm93LCBzbyBhbm90aGVyIHdyaXRlciBkb2Vzbid0IG92ZXJmbG93IGl0IHdoaWxlCisgICAgKiogd2Ugc2xlZXAgbGF0ZXIgb24uCisgICAgKi8KKyAgICBJTkNfRElSX0lOT0RFX05MSU5LKGRpcikKKworICAgIHJldHZhbCA9IHJlaXNlcmZzX25ld19pbm9kZSAoJnRoLCBkaXIsIG1vZGUsIE5VTEwvKnN5bWxpbmsqLywKKwkJCQlvbGRfZm9ybWF0X29ubHkgKGRpci0+aV9zYikgPyAKKwkJCQlFTVBUWV9ESVJfU0laRV9WMSA6IEVNUFRZX0RJUl9TSVpFLAorCQkJCWRlbnRyeSwgaW5vZGUpOworICAgIGlmIChyZXR2YWwpIHsKKwlkaXItPmlfbmxpbmstLSA7CisJZ290byBvdXRfZmFpbGVkOworICAgIH0KKworICAgIGlmIChsb2NrZWQpIHsKKwlyZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzIChkaXItPmlfc2IpOworCWxvY2tlZCA9IDA7CisgICAgfQorCisgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7CisgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGRpcikgOworCisgICAgaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisgICAgaW5vZGUtPmlfZm9wID0gJnJlaXNlcmZzX2Rpcl9vcGVyYXRpb25zOworCisgICAgLy8gbm90ZSwgX3RoaXNfIGFkZF9lbnRyeSB3aWxsIG5vdCB1cGRhdGUgZGlyJ3Mgc3RhdCBkYXRhCisgICAgcmV0dmFsID0gcmVpc2VyZnNfYWRkX2VudHJ5ICgmdGgsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCAKKwkJCQlpbm9kZSwgMS8qdmlzaWJsZSovKTsKKyAgICBpZiAocmV0dmFsKSB7CisJaW50IGVycjsKKwlpbm9kZS0+aV9ubGluayA9IDA7CisJREVDX0RJUl9JTk9ERV9OTElOSyhkaXIpOworCXJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBpbm9kZSk7CisJZXJyID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOworCWlmIChlcnIpCisJICAgIHJldHZhbCA9IGVycjsKKwlpcHV0IChpbm9kZSk7CisJZ290byBvdXRfZmFpbGVkOworICAgIH0KKworICAgIC8vIHRoZSBhYm92ZSBhZGRfZW50cnkgZGlkIG5vdCB1cGRhdGUgZGlyJ3Mgc3RhdCBkYXRhCisgICAgcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGRpcik7CisKKyAgICBkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworICAgIHJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKK291dF9mYWlsZWQ6CisgICAgaWYgKGxvY2tlZCkKKyAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyAoZGlyLT5pX3NiKTsKKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW5saW5lIGludCByZWlzZXJmc19lbXB0eV9kaXIoc3RydWN0IGlub2RlICppbm9kZSkgeworICAgIC8qIHdlIGNhbiBjaGVhdCBiZWNhdXNlIGFuIG9sZCBmb3JtYXQgZGlyIGNhbm5vdCBoYXZlCisgICAgKiogRU1QVFlfRElSX1NJWkUsIGFuZCBhIG5ldyBmb3JtYXQgZGlyIGNhbm5vdCBoYXZlCisgICAgKiogRU1QVFlfRElSX1NJWkVfVjEuICBTbywgaWYgdGhlIGlub2RlIGlzIGVpdGhlciBzaXplLCAKKyAgICAqKiByZWdhcmRsZXNzIG9mIGRpc2sgZm9ybWF0IHZlcnNpb24sIHRoZSBkaXJlY3RvcnkgaXMgZW1wdHkuCisgICAgKi8KKyAgICBpZiAoaW5vZGUtPmlfc2l6ZSAhPSBFTVBUWV9ESVJfU0laRSAmJgorICAgICAgICBpbm9kZS0+aV9zaXplICE9IEVNUFRZX0RJUl9TSVpFX1YxKSB7CisgICAgICAgIHJldHVybiAwIDsKKyAgICB9CisgICAgcmV0dXJuIDEgOworfQorCitzdGF0aWMgaW50IHJlaXNlcmZzX3JtZGlyIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKyAgICBpbnQgcmV0dmFsLCBlcnI7CisgICAgc3RydWN0IGlub2RlICogaW5vZGU7CisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7CisgICAgaW50IGpiZWdpbl9jb3VudDsgCisgICAgSU5JVElBTElaRV9QQVRIIChwYXRoKTsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOworCisKKyAgICAvKiB3ZSB3aWxsIGJlIGRvaW5nIDIgYmFsYW5jaW5ncyBhbmQgdXBkYXRlIDIgc3RhdCBkYXRhLCB3ZSBjaGFuZ2UgcXVvdGFzCisgICAgICogb2YgdGhlIG93bmVyIG9mIHRoZSBkaXJlY3RvcnkgYW5kIG9mIHRoZSBvd25lciBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeSAqLworICAgIGpiZWdpbl9jb3VudCA9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMiArIDIgKyAyICogKFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTK1JFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyk7CisKKyAgICByZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7CisgICAgcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisgICAgaWYgKHJldHZhbCkKKyAgICAgICAgZ290byBvdXRfcm1kaXI7CisKKyAgICBkZS5kZV9nZW5fbnVtYmVyX2JpdF9zdHJpbmcgPSBOVUxMOworICAgIGlmICggKHJldHZhbCA9IHJlaXNlcmZzX2ZpbmRfZW50cnkgKGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCAmcGF0aCwgJmRlKSkgPT0gTkFNRV9OT1RfRk9VTkQpIHsKKwlyZXR2YWwgPSAtRU5PRU5UOworCWdvdG8gZW5kX3JtZGlyOworICAgIH0gZWxzZSBpZiAoIHJldHZhbCA9PSBJT19FUlJPUikgeworCXJldHZhbCA9IC1FSU87CisJZ290byBlbmRfcm1kaXI7CisgICAgfQorCisgICAgaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisKKyAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKKyAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oZGlyKSA7CisKKyAgICBpZiAoZGUuZGVfb2JqZWN0aWQgIT0gaW5vZGUtPmlfaW5vKSB7CisJLy8gRklYTUU6IGNvbXBhcmUga2V5IG9mIGFuIG9iamVjdCBhbmQgYSBrZXkgZm91bmQgaW4gdGhlCisJLy8gZW50cnkKKwlyZXR2YWwgPSAtRUlPOworCWdvdG8gZW5kX3JtZGlyOworICAgIH0KKyAgICBpZiAoIXJlaXNlcmZzX2VtcHR5X2Rpcihpbm9kZSkpIHsKKwlyZXR2YWwgPSAtRU5PVEVNUFRZOworCWdvdG8gZW5kX3JtZGlyOworICAgIH0KKworICAgIC8qIGN1dCBlbnRyeSBmcm9tIGRpciBkaXJlY3RvcnkgKi8KKyAgICByZXR2YWwgPSByZWlzZXJmc19jdXRfZnJvbV9pdGVtICgmdGgsICZwYXRoLCAmKGRlLmRlX2VudHJ5X2tleSksIGRpciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgLyogcGFnZSAqLyAKKwkJCQkgICAgIDAvKm5ldyBmaWxlIHNpemUgLSBub3QgdXNlZCBoZXJlKi8pOworICAgIGlmIChyZXR2YWwgPCAwKQorCWdvdG8gZW5kX3JtZGlyOworCisgICAgaWYgKCBpbm9kZS0+aV9ubGluayAhPSAyICYmIGlub2RlLT5pX25saW5rICE9IDEgKQorCXJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiJXM6IGVtcHR5IGRpcmVjdG9yeSBoYXMgbmxpbmsgIgorCQkJICAiIT0gMiAoJWQpIiwgX19GVU5DVElPTl9fLCBpbm9kZS0+aV9ubGluayk7CisKKyAgICBpbm9kZS0+aV9ubGluayA9IDA7CisgICAgaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWUgPSBkaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBpbm9kZSk7CisKKyAgICBERUNfRElSX0lOT0RFX05MSU5LKGRpcikKKyAgICBkaXItPmlfc2l6ZSAtPSAoREVIX1NJWkUgKyBkZS5kZV9lbnRyeWxlbik7CisgICAgcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGRpcik7CisKKyAgICAvKiBwcmV2ZW50IGVtcHR5IGRpcmVjdG9yeSBmcm9tIGdldHRpbmcgbG9zdCAqLworICAgIGFkZF9zYXZlX2xpbmsgKCZ0aCwgaW5vZGUsIDAvKiBub3QgdHJ1bmNhdGUgKi8pOworCisgICAgcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOworICAgIHJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGgpIDsKK291dF9ybWRpcjoKKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKyAgICByZXR1cm4gcmV0dmFsOworCQorIGVuZF9ybWRpcjoKKyAgICAvKiB3ZSBtdXN0IHJlbGVhc2UgcGF0aCwgYmVjYXVzZSB3ZSBkaWQgbm90IGNhbGwKKyAgICAgICByZWlzZXJmc19jdXRfZnJvbV9pdGVtLCBvciByZWlzZXJmc19jdXRfZnJvbV9pdGVtIGRvZXMgbm90CisgICAgICAgcmVsZWFzZSBwYXRoIGlmIG9wZXJhdGlvbiB3YXMgbm90IGNvbXBsZXRlICovCisgICAgcGF0aHJlbHNlICgmcGF0aCk7CisgICAgZXJyID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOworICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworICAgIHJldHVybiBlcnIgPyBlcnIgOiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfdW5saW5rIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKyAgICBpbnQgcmV0dmFsLCBlcnI7CisgICAgc3RydWN0IGlub2RlICogaW5vZGU7CisgICAgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBkZTsKKyAgICBJTklUSUFMSVpFX1BBVEggKHBhdGgpOworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOworICAgIGludCBqYmVnaW5fY291bnQ7CisgICAgdW5zaWduZWQgbG9uZyBzYXZlbGluazsKKworICAgIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisgICAgLyogaW4gdGhpcyB0cmFuc2FjdGlvbiB3ZSBjYW4gYmUgZG9pbmcgYXQgbWF4IHR3byBiYWxhbmNpbmdzIGFuZCB1cGRhdGUKKyAgICAgICB0d28gc3RhdCBkYXRhcywgd2UgY2hhbmdlIHF1b3RhcyBvZiB0aGUgb3duZXIgb2YgdGhlIGRpcmVjdG9yeSBhbmQgb2YKKyAgICAgICB0aGUgb3duZXIgb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkgKi8KKyAgICBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDIgKyAyICsgMiAqIChSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUytSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MpOworCisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhkaXItPmlfc2IpOworICAgIHJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOworICAgIGlmIChyZXR2YWwpCisgICAgICAgIGdvdG8gb3V0X3VubGluazsKKwkKKyAgICBkZS5kZV9nZW5fbnVtYmVyX2JpdF9zdHJpbmcgPSBOVUxMOworICAgIGlmICggKHJldHZhbCA9IHJlaXNlcmZzX2ZpbmRfZW50cnkgKGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCAmcGF0aCwgJmRlKSkgPT0gTkFNRV9OT1RfRk9VTkQpIHsKKwlyZXR2YWwgPSAtRU5PRU5UOworCWdvdG8gZW5kX3VubGluazsKKyAgICB9IGVsc2UgaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCXJldHZhbCA9IC1FSU87CisJZ290byBlbmRfdW5saW5rOworICAgIH0KKworICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOworICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihkaXIpIDsKKworICAgIGlmIChkZS5kZV9vYmplY3RpZCAhPSBpbm9kZS0+aV9pbm8pIHsKKwkvLyBGSVhNRTogY29tcGFyZSBrZXkgb2YgYW4gb2JqZWN0IGFuZCBhIGtleSBmb3VuZCBpbiB0aGUKKwkvLyBlbnRyeQorCXJldHZhbCA9IC1FSU87CisJZ290byBlbmRfdW5saW5rOworICAgIH0KKyAgCisgICAgaWYgKCFpbm9kZS0+aV9ubGluaykgeworCXJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiJXM6IGRlbGV0aW5nIG5vbmV4aXN0ZW50IGZpbGUgIgorCQkJICAiKCVzOiVsdSksICVkIiwgX19GVU5DVElPTl9fLAorCQkJICByZWlzZXJmc19iZGV2bmFtZSAoaW5vZGUtPmlfc2IpLCBpbm9kZS0+aV9pbm8sCisJCQkgIGlub2RlLT5pX25saW5rKTsKKwlpbm9kZS0+aV9ubGluayA9IDE7CisgICAgfQorCisgICAgaW5vZGUtPmlfbmxpbmstLTsKKworICAgIC8qCisgICAgICogd2Ugc2NoZWR1bGUgYmVmb3JlIGRvaW5nIHRoZSBhZGRfc2F2ZV9saW5rIGNhbGwsIHNhdmUgdGhlIGxpbmsKKyAgICAgKiBjb3VudCBzbyB3ZSBkb24ndCByYWNlCisgICAgICovCisgICAgc2F2ZWxpbmsgPSBpbm9kZS0+aV9ubGluazsKKworCisgICAgcmV0dmFsID0gcmVpc2VyZnNfY3V0X2Zyb21faXRlbSAoJnRoLCAmcGF0aCwgJihkZS5kZV9lbnRyeV9rZXkpLCBkaXIsIE5VTEwsIDApOworICAgIGlmIChyZXR2YWwgPCAwKSB7CisJaW5vZGUtPmlfbmxpbmsrKzsKKwlnb3RvIGVuZF91bmxpbms7CisgICAgfQorICAgIGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKyAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgaW5vZGUpOworCisgICAgZGlyLT5pX3NpemUgLT0gKGRlLmRlX2VudHJ5bGVuICsgREVIX1NJWkUpOworICAgIGRpci0+aV9jdGltZSA9IGRpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisgICAgcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGRpcik7CisKKyAgICBpZiAoIXNhdmVsaW5rKQorICAgICAgIC8qIHByZXZlbnQgZmlsZSBmcm9tIGdldHRpbmcgbG9zdCAqLworICAgICAgIGFkZF9zYXZlX2xpbmsgKCZ0aCwgaW5vZGUsIDAvKiBub3QgdHJ1bmNhdGUgKi8pOworCisgICAgcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOworICAgIHJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGgpIDsKKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKyAgICByZXR1cm4gcmV0dmFsOworCisgZW5kX3VubGluazoKKyAgICBwYXRocmVsc2UgKCZwYXRoKTsKKyAgICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisgICAgcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCkgOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHZhbCA9IGVycjsKK291dF91bmxpbms6CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCByZWlzZXJmc19zeW1saW5rIChzdHJ1Y3QgaW5vZGUgKiBwYXJlbnRfZGlyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBjb25zdCBjaGFyICogc3ltbmFtZSkKK3sKKyAgICBpbnQgcmV0dmFsOworICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlOworICAgIGNoYXIgKiBuYW1lOworICAgIGludCBpdGVtX2xlbjsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKKyAgICBpbnQgbW9kZSA9IFNfSUZMTksgfCBTX0lSV1hVR087CisgICAgLyogV2UgbmVlZCBibG9ja3MgZm9yIHRyYW5zYWN0aW9uICsgKHVzZXIrZ3JvdXApKihxdW90YXMgZm9yIG5ldyBpbm9kZSArIHVwZGF0ZSBvZiBxdW90YSBmb3IgZGlyZWN0b3J5IG93bmVyKSAqLworICAgIGludCBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyAyICogKFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTK1JFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyk7CisKKyAgICBpZiAoIShpbm9kZSA9IG5ld19pbm9kZShwYXJlbnRfZGlyLT5pX3NiKSkpIHsKKwlyZXR1cm4gLUVOT01FTSA7CisgICAgfQorICAgIG5ld19pbm9kZV9pbml0KGlub2RlLCBwYXJlbnRfZGlyLCBtb2RlKTsKKworICAgIHJlaXNlcmZzX3dyaXRlX2xvY2socGFyZW50X2Rpci0+aV9zYik7CisgICAgaXRlbV9sZW4gPSBST1VORF9VUCAoc3RybGVuIChzeW1uYW1lKSk7CisgICAgaWYgKGl0ZW1fbGVuID4gTUFYX0RJUkVDVF9JVEVNX0xFTiAocGFyZW50X2Rpci0+aV9zYi0+c19ibG9ja3NpemUpKSB7CisJcmV0dmFsID0gIC1FTkFNRVRPT0xPTkc7CisJZHJvcF9uZXdfaW5vZGUoaW5vZGUpOworCWdvdG8gb3V0X2ZhaWxlZDsKKyAgICB9CisgIAorICAgIG5hbWUgPSByZWlzZXJmc19rbWFsbG9jIChpdGVtX2xlbiwgR0ZQX05PRlMsIHBhcmVudF9kaXItPmlfc2IpOworICAgIGlmICghbmFtZSkgeworCWRyb3BfbmV3X2lub2RlKGlub2RlKTsKKwlyZXR2YWwgPSAgLUVOT01FTTsKKwlnb3RvIG91dF9mYWlsZWQ7CisgICAgfQorICAgIG1lbWNweSAobmFtZSwgc3ltbmFtZSwgc3RybGVuIChzeW1uYW1lKSk7CisgICAgcGFkZF9pdGVtIChuYW1lLCBpdGVtX2xlbiwgc3RybGVuIChzeW1uYW1lKSk7CisKKyAgICAvKiBXZSB3b3VsZCBpbmhlcml0IHRoZSBkZWZhdWx0IEFDTCBoZXJlLCBidXQgc3ltbGlua3MgZG9uJ3QgZ2V0IEFDTHMgKi8KKworICAgIHJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBwYXJlbnRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKKyAgICBpZiAocmV0dmFsKSB7CisgICAgICAgIGRyb3BfbmV3X2lub2RlIChpbm9kZSk7CisgICAgICAgIHJlaXNlcmZzX2tmcmVlIChuYW1lLCBpdGVtX2xlbiwgcGFyZW50X2Rpci0+aV9zYik7CisgICAgICAgIGdvdG8gb3V0X2ZhaWxlZDsKKyAgICB9CisKKyAgICByZXR2YWwgPSByZWlzZXJmc19uZXdfaW5vZGUgKCZ0aCwgcGFyZW50X2RpciwgbW9kZSwgbmFtZSwgc3RybGVuIChzeW1uYW1lKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW50cnksIGlub2RlKTsKKyAgICByZWlzZXJmc19rZnJlZSAobmFtZSwgaXRlbV9sZW4sIHBhcmVudF9kaXItPmlfc2IpOworICAgIGlmIChyZXR2YWwpIHsgLyogcmVpc2VyZnNfbmV3X2lub2RlIGlwdXRzIGZvciB1cyAqLworCWdvdG8gb3V0X2ZhaWxlZDsKKyAgICB9CisKKyAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKKyAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24ocGFyZW50X2RpcikgOworCisgICAgaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworICAgIGlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnJlaXNlcmZzX2FkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9uczsKKworICAgIC8vIG11c3QgYmUgc3VyZSB0aGlzIGlub2RlIGlzIHdyaXR0ZW4gd2l0aCB0aGlzIHRyYW5zYWN0aW9uCisgICAgLy8KKyAgICAvL3JlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBpbm9kZSwgUkVBRF9CTE9DS1MpOworCisgICAgcmV0dmFsID0gcmVpc2VyZnNfYWRkX2VudHJ5ICgmdGgsIHBhcmVudF9kaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVudHJ5LT5kX25hbWUubGVuLCBpbm9kZSwgMS8qdmlzaWJsZSovKTsKKyAgICBpZiAocmV0dmFsKSB7CisJaW50IGVycjsKKwlpbm9kZS0+aV9ubGluay0tOworCXJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBpbm9kZSk7CisJZXJyID0gam91cm5hbF9lbmQoJnRoLCBwYXJlbnRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKKwlpZiAoZXJyKQorCSAgICByZXR2YWwgPSBlcnI7CisJaXB1dCAoaW5vZGUpOworCWdvdG8gb3V0X2ZhaWxlZDsKKyAgICB9CisKKyAgICBkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworICAgIHJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgcGFyZW50X2Rpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CitvdXRfZmFpbGVkOgorICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhwYXJlbnRfZGlyLT5pX3NiKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHJlaXNlcmZzX2xpbmsgKHN0cnVjdCBkZW50cnkgKiBvbGRfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCit7CisgICAgaW50IHJldHZhbDsKKyAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKKyAgICAvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyB1cGRhdGUgb2YgcXVvdGFzIGZvciB0aGUgb3duZXJzIG9mIHRoZSBkaXJlY3RvcnkgKi8KKyAgICBpbnQgamJlZ2luX2NvdW50ID0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAzICsgMiAqIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUzsKKworICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKKyAgICBpZiAoaW5vZGUtPmlfbmxpbmsgPj0gUkVJU0VSRlNfTElOS19NQVgpIHsKKwkvL0ZJWE1FOiBzZF9ubGluayBpcyAzMiBiaXQgZm9yIG5ldyBmaWxlcworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworCXJldHVybiAtRU1MSU5LOworICAgIH0KKyAgICBpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCkgeworICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorCisgICAgLyogaW5jIGJlZm9yZSBzY2hlZHVsaW5nIHNvIHJlaXNlcmZzX3VubGluayBrbm93cyB3ZSBhcmUgaGVyZSAqLworICAgIGlub2RlLT5pX25saW5rKys7CisKKyAgICByZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKKyAgICBpZiAocmV0dmFsKSB7CisgICAgICAgIGlub2RlLT5pX25saW5rLS07CisgICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayAoZGlyLT5pX3NiKTsKKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKyAgICAvKiBjcmVhdGUgbmV3IGVudHJ5ICovCisgICAgcmV0dmFsID0gcmVpc2VyZnNfYWRkX2VudHJ5ICgmdGgsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLAorCQkJCSBpbm9kZSwgMS8qdmlzaWJsZSovKTsKKworICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOworICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihkaXIpIDsKKworICAgIGlmIChyZXR2YWwpIHsKKwlpbnQgZXJyOworCWlub2RlLT5pX25saW5rLS07CisJZXJyID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworCXJldHVybiBlcnIgPyBlcnIgOiByZXR2YWw7CisgICAgfQorCisgICAgaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBpbm9kZSk7CisKKyAgICBhdG9taWNfaW5jKCZpbm9kZS0+aV9jb3VudCkgOworICAgIGRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisgICAgcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOworICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKworLy8gZGUgY29udGFpbnMgaW5mb3JtYXRpb24gcG9pbnRpbmcgdG8gYW4gZW50cnkgd2hpY2ggCitzdGF0aWMgaW50IGRlX3N0aWxsX3ZhbGlkIChjb25zdCBjaGFyICogbmFtZSwgaW50IGxlbiwgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlKQoreworICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgdG1wID0gKmRlOworICAgIAorICAgIC8vIHJlY2FsY3VsYXRlIHBvaW50ZXIgdG8gbmFtZSBhbmQgbmFtZSBsZW5ndGgKKyAgICBzZXRfZGVfbmFtZV9hbmRfbmFtZWxlbiAoJnRtcCk7CisgICAgLy8gRklYTUU6IGNvdWxkIGNoZWNrIG1vcmUKKyAgICBpZiAodG1wLmRlX25hbWVsZW4gIT0gbGVuIHx8IG1lbWNtcCAobmFtZSwgZGUtPmRlX25hbWUsIGxlbikpCisJcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBlbnRyeV9wb2ludHNfdG9fb2JqZWN0IChjb25zdCBjaGFyICogbmFtZSwgaW50IGxlbiwgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKyAgICBpZiAoIWRlX3N0aWxsX3ZhbGlkIChuYW1lLCBsZW4sIGRlKSkKKwlyZXR1cm4gMDsKKworICAgIGlmIChpbm9kZSkgeworCWlmICghZGVfdmlzaWJsZSAoZGUtPmRlX2RlaCArIGRlLT5kZV9lbnRyeV9udW0pKQorCSAgICByZWlzZXJmc19wYW5pYyAoTlVMTCwgInZzLTcwNDI6IGVudHJ5X3BvaW50c190b19vYmplY3Q6IGVudHJ5IG11c3QgYmUgdmlzaWJsZSIpOworCXJldHVybiAoZGUtPmRlX29iamVjdGlkID09IGlub2RlLT5pX2lubykgPyAxIDogMDsKKyAgICB9CisKKyAgICAvKiB0aGlzIG11c3QgYmUgYWRkZWQgaGlkZGVuIGVudHJ5ICovCisgICAgaWYgKGRlX3Zpc2libGUgKGRlLT5kZV9kZWggKyBkZS0+ZGVfZW50cnlfbnVtKSkKKwlyZWlzZXJmc19wYW5pYyAoTlVMTCwgInZzLTcwNDM6IGVudHJ5X3BvaW50c190b19vYmplY3Q6IGVudHJ5IG11c3QgYmUgdmlzaWJsZSIpOworCisgICAgcmV0dXJuIDE7Cit9CisKKworLyogc2V0cyBrZXkgb2Ygb2JqZWN0aWQgdGhlIGVudHJ5IGhhcyB0byBwb2ludCB0byAqLworc3RhdGljIHZvaWQgc2V0X2lub19pbl9kaXJfZW50cnkgKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSwgc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSkKK3sKKyAgICAvKiBKRE0gVGhlc2Ugb3BlcmF0aW9ucyBhcmUgZW5kaWFuIHNhZmUgLSBib3RoIGFyZSBsZSAqLworICAgIGRlLT5kZV9kZWhbZGUtPmRlX2VudHJ5X251bV0uZGVoX2Rpcl9pZCA9IGtleS0+a19kaXJfaWQ7CisgICAgZGUtPmRlX2RlaFtkZS0+ZGVfZW50cnlfbnVtXS5kZWhfb2JqZWN0aWQgPSBrZXktPmtfb2JqZWN0aWQ7Cit9CisKKworLyogCisgKiBwcm9jZXNzLCB0aGF0IGlzIGdvaW5nIHRvIGNhbGwgZml4X25vZGVzL2RvX2JhbGFuY2UgbXVzdCBob2xkIG9ubHkKKyAqIG9uZSBwYXRoLiBJZiBpdCBob2xkcyAyIG9yIG1vcmUsIGl0IGNhbiBnZXQgaW50byBlbmRsZXNzIHdhaXRpbmcgaW4KKyAqIGdldF9lbXB0eV9ub2RlcyBvciBpdHMgY2xvbmVzIAorICovCitzdGF0aWMgaW50IHJlaXNlcmZzX3JlbmFtZSAoc3RydWN0IGlub2RlICogb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKKwkJCSAgICBzdHJ1Y3QgaW5vZGUgKiBuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQoreworICAgIGludCByZXR2YWw7CisgICAgSU5JVElBTElaRV9QQVRIIChvbGRfZW50cnlfcGF0aCk7CisgICAgSU5JVElBTElaRV9QQVRIIChuZXdfZW50cnlfcGF0aCk7CisgICAgSU5JVElBTElaRV9QQVRIIChkb3RfZG90X2VudHJ5X3BhdGgpOworICAgIHN0cnVjdCBpdGVtX2hlYWQgbmV3X2VudHJ5X2loLCBvbGRfZW50cnlfaWgsIGRvdF9kb3RfaWggOworICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgb2xkX2RlLCBuZXdfZGUsIGRvdF9kb3RfZGU7CisgICAgc3RydWN0IGlub2RlICogb2xkX2lub2RlLCAqIG5ld19kZW50cnlfaW5vZGU7CisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7CisgICAgaW50IGpiZWdpbl9jb3VudCA7IAorICAgIHVtb2RlX3Qgb2xkX2lub2RlX21vZGU7CisgICAgdW5zaWduZWQgbG9uZyBzYXZlbGluayA9IDE7CisgICAgc3RydWN0IHRpbWVzcGVjIGN0aW1lOworCisgICAgLyogdGhyZWUgYmFsYW5jaW5nczogKDEpIG9sZCBuYW1lIHJlbW92YWwsICgyKSBuZXcgbmFtZSBpbnNlcnRpb24KKyAgICAgICBhbmQgKDMpIG1heWJlICJzYXZlIiBsaW5rIGluc2VydGlvbgorICAgICAgIHN0YXQgZGF0YSB1cGRhdGVzOiAoMSkgb2xkIGRpcmVjdG9yeSwKKyAgICAgICAoMikgbmV3IGRpcmVjdG9yeSBhbmQgKDMpIG1heWJlIG9sZCBvYmplY3Qgc3RhdCBkYXRhICh3aGVuIGl0IGlzCisgICAgICAgZGlyZWN0b3J5KSBhbmQgKDQpIG1heWJlIHN0YXQgZGF0YSBvZiBvYmplY3QgdG8gd2hpY2ggbmV3IGVudHJ5CisgICAgICAgcG9pbnRlZCBpbml0aWFsbHkgYW5kICg1KSBtYXliZSBibG9jayBjb250YWluaW5nICIuLiIgb2YKKyAgICAgICByZW5hbWVkIGRpcmVjdG9yeQorICAgICAgIHF1b3RhIHVwZGF0ZXM6IHR3byBwYXJlbnQgZGlyZWN0b3JpZXMgKi8KKyAgICBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyA1ICsgNCAqIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUzsKKworICAgIG9sZF9pbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisgICAgbmV3X2RlbnRyeV9pbm9kZSA9IG5ld19kZW50cnktPmRfaW5vZGU7CisKKyAgICAvLyBtYWtlIHN1cmUsIHRoYXQgb2xkbmFtZSBzdGlsbCBleGlzdHMgYW5kIHBvaW50cyB0byBhbiBvYmplY3Qgd2UKKyAgICAvLyBhcmUgZ29pbmcgdG8gcmVuYW1lCisgICAgb2xkX2RlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7CisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhvbGRfZGlyLT5pX3NiKTsKKyAgICByZXR2YWwgPSByZWlzZXJmc19maW5kX2VudHJ5IChvbGRfZGlyLCBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwgb2xkX2RlbnRyeS0+ZF9uYW1lLmxlbiwKKwkJCQkgICZvbGRfZW50cnlfcGF0aCwgJm9sZF9kZSk7CisgICAgcGF0aHJlbHNlICgmb2xkX2VudHJ5X3BhdGgpOworICAgIGlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJcmV0dXJuIC1FSU87CisgICAgfQorCisgICAgaWYgKHJldHZhbCAhPSBOQU1FX0ZPVU5EIHx8IG9sZF9kZS5kZV9vYmplY3RpZCAhPSBvbGRfaW5vZGUtPmlfaW5vKSB7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOworCXJldHVybiAtRU5PRU5UOworICAgIH0KKworICAgIG9sZF9pbm9kZV9tb2RlID0gb2xkX2lub2RlLT5pX21vZGU7CisgICAgaWYgKFNfSVNESVIob2xkX2lub2RlX21vZGUpKSB7CisJLy8gbWFrZSBzdXJlLCB0aGF0IGRpcmVjdG9yeSBiZWluZyByZW5hbWVkIGhhcyBjb3JyZWN0ICIuLiIgCisJLy8gYW5kIHRoYXQgaXRzIG5ldyBwYXJlbnQgZGlyZWN0b3J5IGhhcyBub3QgdG9vIG1hbnkgbGlua3MKKwkvLyBhbHJlYWR5CisKKwlpZiAobmV3X2RlbnRyeV9pbm9kZSkgeworCSAgICBpZiAoIXJlaXNlcmZzX2VtcHR5X2RpcihuZXdfZGVudHJ5X2lub2RlKSkgeworCQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJCXJldHVybiAtRU5PVEVNUFRZOworCSAgICB9CisJfQorCQorCS8qIGRpcmVjdG9yeSBpcyByZW5hbWVkLCBpdHMgcGFyZW50IGRpcmVjdG9yeSB3aWxsIGJlIGNoYW5nZWQsIAorCSoqIHNvIGZpbmQgIi4uIiBlbnRyeSAKKwkqLworCWRvdF9kb3RfZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKKwlyZXR2YWwgPSByZWlzZXJmc19maW5kX2VudHJ5IChvbGRfaW5vZGUsICIuLiIsIDIsICZkb3RfZG90X2VudHJ5X3BhdGgsICZkb3RfZG90X2RlKTsKKwlwYXRocmVsc2UgKCZkb3RfZG90X2VudHJ5X3BhdGgpOworCWlmIChyZXR2YWwgIT0gTkFNRV9GT1VORCkgeworCSAgICByZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJICAgIHJldHVybiAtRUlPOworCX0KKworCS8qIGlub2RlIG51bWJlciBvZiAuLiBtdXN0IGVxdWFsIG9sZF9kaXItPmlfaW5vICovCisJaWYgKGRvdF9kb3RfZGUuZGVfb2JqZWN0aWQgIT0gb2xkX2Rpci0+aV9pbm8pIHsKKwkgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOworCSAgICByZXR1cm4gLUVJTzsKKwl9CisgICAgfQorCisgICAgcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIG9sZF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOworICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrIChvbGRfZGlyLT5pX3NiKTsKKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKyAgICAvKiBhZGQgbmV3IGVudHJ5IChvciBmaW5kIHRoZSBleGlzdGluZyBvbmUpICovCisgICAgcmV0dmFsID0gcmVpc2VyZnNfYWRkX2VudHJ5ICgmdGgsIG5ld19kaXIsIG5ld19kZW50cnktPmRfbmFtZS5uYW1lLCBuZXdfZGVudHJ5LT5kX25hbWUubGVuLCAKKwkJCQkgb2xkX2lub2RlLCAwKTsKKyAgICBpZiAocmV0dmFsID09IC1FRVhJU1QpIHsKKwlpZiAoIW5ld19kZW50cnlfaW5vZGUpIHsKKwkgICAgcmVpc2VyZnNfcGFuaWMgKG9sZF9kaXItPmlfc2IsCisJCQkgICAgInZzLTcwNTA6IG5ldyBlbnRyeSBpcyBmb3VuZCwgbmV3IGlub2RlID09IDBcbiIpOworCX0KKyAgICB9IGVsc2UgaWYgKHJldHZhbCkgeworCWludCBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIG9sZF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKKwlyZXR1cm4gZXJyID8gZXJyIDogcmV0dmFsOworICAgIH0KKworICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihvbGRfZGlyKSA7CisgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKG5ld19kaXIpIDsKKworICAgIC8qIHRoaXMgbWFrZXMgaXQgc28gYW4gZnN5bmMgb24gYW4gb3BlbiBmZCBmb3IgdGhlIG9sZCBuYW1lIHdpbGwKKyAgICAqKiBjb21taXQgdGhlIHJlbmFtZSBvcGVyYXRpb24KKyAgICAqLworICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihvbGRfaW5vZGUpIDsKKworICAgIGlmIChuZXdfZGVudHJ5X2lub2RlKSAKKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24obmV3X2RlbnRyeV9pbm9kZSkgOworCisgICAgd2hpbGUgKDEpIHsKKwkvLyBsb29rIGZvciBvbGQgbmFtZSB1c2luZyBjb3JyZXNwb25kaW5nIGVudHJ5IGtleSAoZm91bmQgYnkgcmVpc2VyZnNfZmluZF9lbnRyeSkKKwlpZiAoKHJldHZhbCA9IHNlYXJjaF9ieV9lbnRyeV9rZXkgKG5ld19kaXItPmlfc2IsICZvbGRfZGUuZGVfZW50cnlfa2V5LAorCQkJCQkgICAmb2xkX2VudHJ5X3BhdGgsICZvbGRfZGUpKSAhPSBOQU1FX0ZPVU5EKSB7CisJICAgIHBhdGhyZWxzZSgmb2xkX2VudHJ5X3BhdGgpOworCSAgICBqb3VybmFsX2VuZCgmdGgsIG9sZF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKKwkgICAgcmV0dXJuIC1FSU87CisJfQorCisJY29weV9pdGVtX2hlYWQoJm9sZF9lbnRyeV9paCwgZ2V0X2loKCZvbGRfZW50cnlfcGF0aCkpIDsKKworCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwob2xkX2lub2RlLT5pX3NiLCBvbGRfZGUuZGVfYmgsIDEpIDsKKworCS8vIGxvb2sgZm9yIG5ldyBuYW1lIGJ5IHJlaXNlcmZzX2ZpbmRfZW50cnkKKwluZXdfZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKKwlyZXR2YWwgPSByZWlzZXJmc19maW5kX2VudHJ5IChuZXdfZGlyLCBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSwgbmV3X2RlbnRyeS0+ZF9uYW1lLmxlbiwgCisJCQkJICAgICAgJm5ld19lbnRyeV9wYXRoLCAmbmV3X2RlKTsKKwkvLyByZWlzZXJmc19hZGRfZW50cnkgc2hvdWxkIG5vdCByZXR1cm4gSU9fRVJST1IsIGJlY2F1c2UgaXQgaXMgY2FsbGVkIHdpdGggZXNzZW50aWFsbHkgc2FtZSBwYXJhbWV0ZXJzIGZyb20KKyAgICAgICAgLy8gcmVpc2VyZnNfYWRkX2VudHJ5IGFib3ZlLCBhbmQgd2UnbGwgY2F0Y2ggYW55IGkvbyBlcnJvcnMgYmVmb3JlIHdlIGdldCBoZXJlLgorCWlmIChyZXR2YWwgIT0gTkFNRV9GT1VORF9JTlZJU0lCTEUgJiYgcmV0dmFsICE9IE5BTUVfRk9VTkQpIHsKKwkgICAgcGF0aHJlbHNlKCZuZXdfZW50cnlfcGF0aCk7CisJICAgIHBhdGhyZWxzZSgmb2xkX2VudHJ5X3BhdGgpOworCSAgICBqb3VybmFsX2VuZCgmdGgsIG9sZF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKKwkgICAgcmV0dXJuIC1FSU87CisJfQorCisJY29weV9pdGVtX2hlYWQoJm5ld19lbnRyeV9paCwgZ2V0X2loKCZuZXdfZW50cnlfcGF0aCkpIDsKKworCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwob2xkX2lub2RlLT5pX3NiLCBuZXdfZGUuZGVfYmgsIDEpIDsKKworCWlmIChTX0lTRElSKG9sZF9pbm9kZS0+aV9tb2RlKSkgeworCSAgICBpZiAoKHJldHZhbCA9IHNlYXJjaF9ieV9lbnRyeV9rZXkgKG5ld19kaXItPmlfc2IsICZkb3RfZG90X2RlLmRlX2VudHJ5X2tleSwKKwkJCQkJICAgICAgICZkb3RfZG90X2VudHJ5X3BhdGgsICZkb3RfZG90X2RlKSkgIT0gTkFNRV9GT1VORCkgeworCQlwYXRocmVsc2UoJmRvdF9kb3RfZW50cnlfcGF0aCk7CisJCXBhdGhyZWxzZSgmbmV3X2VudHJ5X3BhdGgpOworCQlwYXRocmVsc2UoJm9sZF9lbnRyeV9wYXRoKTsKKwkJam91cm5hbF9lbmQoJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJCXJldHVybiAtRUlPOworCSAgICB9CisJICAgIGNvcHlfaXRlbV9oZWFkKCZkb3RfZG90X2loLCBnZXRfaWgoJmRvdF9kb3RfZW50cnlfcGF0aCkpIDsKKwkgICAgLy8gbm9kZSBjb250YWluaW5nICIuLiIgZ2V0cyBpbnRvIHRyYW5zYWN0aW9uCisJICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwob2xkX2lub2RlLT5pX3NiLCBkb3RfZG90X2RlLmRlX2JoLCAxKSA7CisJfQorCQkJCS8qIHdlIHNob3VsZCBjaGVjayBzZWFscyBoZXJlLCBub3QgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzdHVmZiwgeWVzPyBUaGVuLCBoYXZpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F0aGVyZWQgZXZlcnl0aGluZyBpbnRvIFJBTSB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgbG9jayB0aGUgYnVmZmVycywgeWVzPyAgLUhhbnMgKi8KKwkJCQkvKiBwcm9iYWJseS4gIG91ciByZW5hbWUgbmVlZHMgdG8gaG9sZCBtb3JlIAorCQkJCSoqIHRoYW4gb25lIHBhdGggYXQgb25jZS4gIFRoZSBzZWFscyB3b3VsZCAKKwkJCQkqKiBoYXZlIHRvIGJlIHdyaXR0ZW4gdG8gZGVhbCB3aXRoIG11bHRpLXBhdGggCisJCQkJKiogaXNzdWVzIC1jaHJpcworCQkJCSovCisJLyogc2FuaXR5IGNoZWNraW5nIGJlZm9yZSBkb2luZyB0aGUgcmVuYW1lIC0gYXZvaWQgcmFjZXMgbWFueQorCSoqIG9mIHRoZSBhYm92ZSBjaGVja3MgY291bGQgaGF2ZSBzY2hlZHVsZWQuICBXZSBoYXZlIHRvIGJlCisJKiogc3VyZSBvdXIgaXRlbXMgaGF2ZW4ndCBiZWVuIHNoaWZ0ZWQgYnkgYW5vdGhlciBwcm9jZXNzLgorCSovCisJaWYgKGl0ZW1fbW92ZWQoJm5ld19lbnRyeV9paCwgJm5ld19lbnRyeV9wYXRoKSB8fAorCSAgICAhZW50cnlfcG9pbnRzX3RvX29iamVjdChuZXdfZGVudHJ5LT5kX25hbWUubmFtZSwgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19kZW50cnktPmRfbmFtZS5sZW4sCisJCQkJICAgICZuZXdfZGUsIG5ld19kZW50cnlfaW5vZGUpIHx8CisJICAgIGl0ZW1fbW92ZWQoJm9sZF9lbnRyeV9paCwgJm9sZF9lbnRyeV9wYXRoKSB8fCAKKwkgICAgIWVudHJ5X3BvaW50c190b19vYmplY3QgKG9sZF9kZW50cnktPmRfbmFtZS5uYW1lLCAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9kZW50cnktPmRfbmFtZS5sZW4sCisJCQkJICAgICAmb2xkX2RlLCBvbGRfaW5vZGUpKSB7CisJICAgIHJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyIChvbGRfaW5vZGUtPmlfc2IsIG5ld19kZS5kZV9iaCk7CisJICAgIHJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyIChvbGRfaW5vZGUtPmlfc2IsIG9sZF9kZS5kZV9iaCk7CisJICAgIGlmIChTX0lTRElSKG9sZF9pbm9kZV9tb2RlKSkKKwkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKG9sZF9pbm9kZS0+aV9zYiwgZG90X2RvdF9kZS5kZV9iaCk7CisJICAgIGNvbnRpbnVlOworCX0KKwlpZiAoU19JU0RJUihvbGRfaW5vZGVfbW9kZSkpIHsKKwkgICAgaWYgKCBpdGVtX21vdmVkKCZkb3RfZG90X2loLCAmZG90X2RvdF9lbnRyeV9wYXRoKSB8fAorCQkhZW50cnlfcG9pbnRzX3RvX29iamVjdCAoICIuLiIsIDIsICZkb3RfZG90X2RlLCBvbGRfZGlyKSApIHsKKwkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKG9sZF9pbm9kZS0+aV9zYiwgb2xkX2RlLmRlX2JoKTsKKwkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKG9sZF9pbm9kZS0+aV9zYiwgbmV3X2RlLmRlX2JoKTsKKwkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKG9sZF9pbm9kZS0+aV9zYiwgZG90X2RvdF9kZS5kZV9iaCk7CisJCWNvbnRpbnVlOworCSAgICB9CisJfQorCisJUkZBTFNFKCBTX0lTRElSKG9sZF9pbm9kZV9tb2RlKSAmJiAKKwkJICFidWZmZXJfam91cm5hbF9wcmVwYXJlZChkb3RfZG90X2RlLmRlX2JoKSwgIiIgKTsKKworCWJyZWFrOworICAgIH0KKworICAgIC8qIG9rLCBhbGwgdGhlIGNoYW5nZXMgY2FuIGJlIGRvbmUgaW4gb25lIGZlbGwgc3dvb3Agd2hlbiB3ZQorICAgICAgIGhhdmUgY2xhaW1lZCBhbGwgdGhlIGJ1ZmZlcnMgbmVlZGVkLiovCisgICAgCisgICAgbWFya19kZV92aXNpYmxlIChuZXdfZGUuZGVfZGVoICsgbmV3X2RlLmRlX2VudHJ5X251bSk7CisgICAgc2V0X2lub19pbl9kaXJfZW50cnkgKCZuZXdfZGUsIElOT0RFX1BLRVkgKG9sZF9pbm9kZSkpOworICAgIGpvdXJuYWxfbWFya19kaXJ0eSAoJnRoLCBvbGRfZGlyLT5pX3NiLCBuZXdfZGUuZGVfYmgpOworCisgICAgbWFya19kZV9oaWRkZW4gKG9sZF9kZS5kZV9kZWggKyBvbGRfZGUuZGVfZW50cnlfbnVtKTsKKyAgICBqb3VybmFsX21hcmtfZGlydHkgKCZ0aCwgb2xkX2Rpci0+aV9zYiwgb2xkX2RlLmRlX2JoKTsKKyAgICBjdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisgICAgb2xkX2Rpci0+aV9jdGltZSA9IG9sZF9kaXItPmlfbXRpbWUgPSBjdGltZTsKKyAgICBuZXdfZGlyLT5pX2N0aW1lID0gbmV3X2Rpci0+aV9tdGltZSA9IGN0aW1lOworICAgIC8qIHRoYW5rcyB0byBBbGV4IEFkcmlhYW5zZSA8YWxleF9hQGNhbHRlY2guZWR1PiBmb3IgcGF0Y2ggd2hpY2ggYWRkcyBjdGltZSB1cGRhdGUgb2YKKyAgICAgICByZW5hbWVkIG9iamVjdCAqLworICAgIG9sZF9pbm9kZS0+aV9jdGltZSA9IGN0aW1lOworCisgICAgaWYgKG5ld19kZW50cnlfaW5vZGUpIHsKKwkvLyBhZGp1c3QgbGluayBudW1iZXIgb2YgdGhlIHZpY3RpbQorCWlmIChTX0lTRElSKG5ld19kZW50cnlfaW5vZGUtPmlfbW9kZSkpIHsKKwkgICAgbmV3X2RlbnRyeV9pbm9kZS0+aV9ubGluayAgPSAwOworCX0gZWxzZSB7CisJICAgIG5ld19kZW50cnlfaW5vZGUtPmlfbmxpbmstLTsKKwl9CisJbmV3X2RlbnRyeV9pbm9kZS0+aV9jdGltZSA9IGN0aW1lOworCXNhdmVsaW5rID0gbmV3X2RlbnRyeV9pbm9kZS0+aV9ubGluazsKKyAgICB9CisKKyAgICBpZiAoU19JU0RJUihvbGRfaW5vZGVfbW9kZSkpIHsKKwkvLyBhZGp1c3QgIi4uIiBvZiByZW5hbWVkIGRpcmVjdG9yeSAKKwlzZXRfaW5vX2luX2Rpcl9lbnRyeSAoJmRvdF9kb3RfZGUsIElOT0RFX1BLRVkgKG5ld19kaXIpKTsKKwlqb3VybmFsX21hcmtfZGlydHkgKCZ0aCwgbmV3X2Rpci0+aV9zYiwgZG90X2RvdF9kZS5kZV9iaCk7CisJCisgICAgICAgIGlmICghbmV3X2RlbnRyeV9pbm9kZSkKKwkgICAgLyogdGhlcmUgKGluIG5ld19kaXIpIHdhcyBubyBkaXJlY3RvcnksIHNvIGl0IGdvdCBuZXcgbGluaworCSAgICAgICAoIi4uIiAgb2YgcmVuYW1lZCBkaXJlY3RvcnkpICovCisJICAgIElOQ19ESVJfSU5PREVfTkxJTksobmV3X2Rpcik7CisJCQorCS8qIG9sZCBkaXJlY3RvcnkgbG9zdCBvbmUgbGluayAtICIuLiAiIG9mIHJlbmFtZWQgZGlyZWN0b3J5ICovCisJREVDX0RJUl9JTk9ERV9OTElOSyhvbGRfZGlyKTsKKyAgICB9CisKKyAgICAvLyBsb29rcyBsaWtlIGluIDIuMy45OXByZTMgYnJlbHNlIGlzIGF0b21pYy4gc28gd2UgY2FuIHVzZSBwYXRocmVsc2UKKyAgICBwYXRocmVsc2UgKCZuZXdfZW50cnlfcGF0aCk7CisgICAgcGF0aHJlbHNlICgmZG90X2RvdF9lbnRyeV9wYXRoKTsKKworICAgIC8vIEZJWE1FOiB0aGlzIHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0ncyByZXR1cm4gdmFsdWUgbWF5IHNjcmV3IHVwCisgICAgLy8gYW55Ym9keSwgYnV0IGl0IHdpbGwgcGFuaWMgaWYgd2lsbCBub3QgYmUgYWJsZSB0byBmaW5kIHRoZQorICAgIC8vIGVudHJ5LiBUaGlzIG5lZWRzIG9uZSBtb3JlIGNsZWFuIHVwCisgICAgaWYgKHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0gKCZ0aCwgJm9sZF9lbnRyeV9wYXRoLCAmKG9sZF9kZS5kZV9lbnRyeV9rZXkpLCBvbGRfZGlyLCBOVUxMLCAwKSA8IDApCisJcmVpc2VyZnNfd2FybmluZyAob2xkX2Rpci0+aV9zYiwgInZzLTcwNjA6IHJlaXNlcmZzX3JlbmFtZTogY291bGRuJ3Qgbm90IGN1dCBvbGQgbmFtZS4gRnNjayBsYXRlcj8iKTsKKworICAgIG9sZF9kaXItPmlfc2l6ZSAtPSBERUhfU0laRSArIG9sZF9kZS5kZV9lbnRyeWxlbjsKKworICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBvbGRfZGlyKTsKKyAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgbmV3X2Rpcik7CisgICAgcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIG9sZF9pbm9kZSk7CisKKyAgICBpZiAobmV3X2RlbnRyeV9pbm9kZSkgeworCWlmIChzYXZlbGluayA9PSAwKQorCSAgICBhZGRfc2F2ZV9saW5rICgmdGgsIG5ld19kZW50cnlfaW5vZGUsIDAvKiBub3QgdHJ1bmNhdGUgKi8pOworCXJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBuZXdfZGVudHJ5X2lub2RlKTsKKyAgICB9CisKKyAgICByZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIG9sZF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOworICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKgorICogZGlyZWN0b3JpZXMgY2FuIGhhbmRsZSBtb3N0IG9wZXJhdGlvbnMuLi4KKyAqLworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcmVpc2VyZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisgIC8vJnJlaXNlcmZzX2Rpcl9vcGVyYXRpb25zLAkvKiBkZWZhdWx0X2ZpbGVfb3BzICovCisgICAgLmNyZWF0ZQk9IHJlaXNlcmZzX2NyZWF0ZSwKKyAgICAubG9va3VwCT0gcmVpc2VyZnNfbG9va3VwLAorICAgIC5saW5rCT0gcmVpc2VyZnNfbGluaywKKyAgICAudW5saW5rCT0gcmVpc2VyZnNfdW5saW5rLAorICAgIC5zeW1saW5rCT0gcmVpc2VyZnNfc3ltbGluaywKKyAgICAubWtkaXIJPSByZWlzZXJmc19ta2RpciwKKyAgICAucm1kaXIJPSByZWlzZXJmc19ybWRpciwKKyAgICAubWtub2QJPSByZWlzZXJmc19ta25vZCwKKyAgICAucmVuYW1lCT0gcmVpc2VyZnNfcmVuYW1lLAorICAgIC5zZXRhdHRyICAgID0gcmVpc2VyZnNfc2V0YXR0ciwKKyAgICAuc2V0eGF0dHIgICA9IHJlaXNlcmZzX3NldHhhdHRyLAorICAgIC5nZXR4YXR0ciAgID0gcmVpc2VyZnNfZ2V0eGF0dHIsCisgICAgLmxpc3R4YXR0ciAgPSByZWlzZXJmc19saXN0eGF0dHIsCisgICAgLnJlbW92ZXhhdHRyID0gcmVpc2VyZnNfcmVtb3ZleGF0dHIsCisgICAgLnBlcm1pc3Npb24gICAgID0gcmVpc2VyZnNfcGVybWlzc2lvbiwKK307CisKKy8qCisgKiBzeW1saW5rIG9wZXJhdGlvbnMuLiBzYW1lIGFzIHBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zLCB3aXRoIHhhdHRyCisgKiBzdHVmZiBhZGRlZAorICovCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyByZWlzZXJmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisgICAgLnJlYWRsaW5rICAgICAgID0gZ2VuZXJpY19yZWFkbGluaywKKyAgICAuZm9sbG93X2xpbmsgICAgPSBwYWdlX2ZvbGxvd19saW5rX2xpZ2h0LAorICAgIC5wdXRfbGluayAgICAgICA9IHBhZ2VfcHV0X2xpbmssCisgICAgLnNldGF0dHIgICAgICAgID0gcmVpc2VyZnNfc2V0YXR0ciwKKyAgICAuc2V0eGF0dHIgICAgICAgPSByZWlzZXJmc19zZXR4YXR0ciwKKyAgICAuZ2V0eGF0dHIgICAgICAgPSByZWlzZXJmc19nZXR4YXR0ciwKKyAgICAubGlzdHhhdHRyICAgICAgPSByZWlzZXJmc19saXN0eGF0dHIsCisgICAgLnJlbW92ZXhhdHRyICAgID0gcmVpc2VyZnNfcmVtb3ZleGF0dHIsCisgICAgLnBlcm1pc3Npb24gICAgID0gcmVpc2VyZnNfcGVybWlzc2lvbiwKKworfTsKKworCisvKgorICogc3BlY2lhbCBmaWxlIG9wZXJhdGlvbnMuLiBqdXN0IHhhdHRyL2FjbCBzdHVmZgorICovCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyByZWlzZXJmc19zcGVjaWFsX2lub2RlX29wZXJhdGlvbnMgPSB7CisgICAgLnNldGF0dHIgICAgICAgID0gcmVpc2VyZnNfc2V0YXR0ciwKKyAgICAuc2V0eGF0dHIgICAgICAgPSByZWlzZXJmc19zZXR4YXR0ciwKKyAgICAuZ2V0eGF0dHIgICAgICAgPSByZWlzZXJmc19nZXR4YXR0ciwKKyAgICAubGlzdHhhdHRyICAgICAgPSByZWlzZXJmc19saXN0eGF0dHIsCisgICAgLnJlbW92ZXhhdHRyICAgID0gcmVpc2VyZnNfcmVtb3ZleGF0dHIsCisgICAgLnBlcm1pc3Npb24gICAgID0gcmVpc2VyZnNfcGVybWlzc2lvbiwKKworfTsKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL29iamVjdGlkLmMgYi9mcy9yZWlzZXJmcy9vYmplY3RpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ODVjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy9vYmplY3RpZC5jCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAgYnkgSGFucyBSZWlzZXIsIGxpY2Vuc2luZyBnb3Zlcm5lZCBieSByZWlzZXJmcy9SRUFETUUKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnNfc2IuaD4KKworLy8gZmluZCB3aGVyZSBvYmplY3RpZCBtYXAgc3RhcnRzCisjZGVmaW5lIG9iamVjdGlkX21hcChzLHJzKSAob2xkX2Zvcm1hdF9vbmx5IChzKSA/IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoX191MzIgKikoKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9ja192MSAqKShycykgKyAxKSA6XAorCQkJIChfX3UzMiAqKSgocnMpICsgMSkpCisKKworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworCitzdGF0aWMgdm9pZCBjaGVja19vYmplY3RpZF9tYXAgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIF9fdTMyICogbWFwKQoreworICAgIGlmIChsZTMyX3RvX2NwdSAobWFwWzBdKSAhPSAxKQorCXJlaXNlcmZzX3BhbmljIChzLCAidnMtMTUwMTA6IGNoZWNrX29iamVjdGlkX21hcDogbWFwIGNvcnJ1cHRlZDogJWx4IiwKKwkJCSggbG9uZyB1bnNpZ25lZCBpbnQgKSBsZTMyX3RvX2NwdSAobWFwWzBdKSk7CisKKyAgICAvLyBGSVhNRTogYWRkIHNvbWV0aGluZyBlbHNlIGhlcmUKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkIGNoZWNrX29iamVjdGlkX21hcCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgX191MzIgKiBtYXApCit7O30KKyNlbmRpZgorCisKKy8qIFdoZW4gd2UgYWxsb2NhdGUgb2JqZWN0aWRzIHdlIGFsbG9jYXRlIHRoZSBmaXJzdCB1bnVzZWQgb2JqZWN0aWQuCisgICBFYWNoIHNlcXVlbmNlIG9mIG9iamVjdGlkcyBpbiB1c2UgKHRoZSBvZGQgc2VxdWVuY2VzKSBpcyBmb2xsb3dlZAorICAgYnkgYSBzZXF1ZW5jZSBvZiBvYmplY3RpZHMgbm90IGluIHVzZSAodGhlIGV2ZW4gc2VxdWVuY2VzKS4gIFdlCisgICBvbmx5IG5lZWQgdG8gcmVjb3JkIHRoZSBsYXN0IG9iamVjdGlkIGluIGVhY2ggb2YgdGhlc2Ugc2VxdWVuY2VzCisgICAoYm90aCB0aGUgb2RkIGFuZCBldmVuIHNlcXVlbmNlcykgaW4gb3JkZXIgdG8gZnVsbHkgZGVmaW5lIHRoZQorICAgYm91bmRhcmllcyBvZiB0aGUgc2VxdWVuY2VzLiAgQSBjb25zZXF1ZW5jZSBvZiBhbGxvY2F0aW5nIHRoZSBmaXJzdAorICAgb2JqZWN0aWQgbm90IGluIHVzZSBpcyB0aGF0IHVuZGVyIG1vc3QgY29uZGl0aW9ucyB0aGlzIHNjaGVtZSBpcworICAgZXh0cmVtZWx5IGNvbXBhY3QuICBUaGUgZXhjZXB0aW9uIGlzIGltbWVkaWF0ZWx5IGFmdGVyIGEgc2VxdWVuY2UKKyAgIG9mIG9wZXJhdGlvbnMgd2hpY2ggZGVsZXRlcyBhIGxhcmdlIG51bWJlciBvZiBvYmplY3RzIG9mCisgICBub24tc2VxdWVudGlhbCBvYmplY3RpZHMsIGFuZCBldmVuIHRoZW4gaXQgd2lsbCBiZWNvbWUgY29tcGFjdAorICAgYWdhaW4gYXMgc29vbiBhcyBtb3JlIG9iamVjdHMgYXJlIGNyZWF0ZWQuICBOb3RlIHRoYXQgbWFueQorICAgaW50ZXJlc3Rpbmcgb3B0aW1pemF0aW9ucyBvZiBsYXlvdXQgY291bGQgcmVzdWx0IGZyb20gY29tcGxpY2F0aW5nCisgICBvYmplY3RpZCBhc3NpZ25tZW50LCBidXQgd2UgaGF2ZSBkZWZlcnJlZCBtYWtpbmcgdGhlbSBmb3Igbm93LiAqLworCisKKy8qIGdldCB1bmlxdWUgb2JqZWN0IGlkZW50aWZpZXIgKi8KK19fdTMyIHJlaXNlcmZzX2dldF91bnVzZWRfb2JqZWN0aWQgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoKQoreworICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMgPSB0aC0+dF9zdXBlcjsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpOworICAgIF9fdTMyICogbWFwID0gb2JqZWN0aWRfbWFwIChzLCBycyk7CisgICAgX191MzIgdW51c2VkX29iamVjdGlkOworCisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCisgICAgY2hlY2tfb2JqZWN0aWRfbWFwIChzLCBtYXApOworCisgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSkgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21tZW50IG5lZWRlZCAtSGFucyAqLworICAgIHVudXNlZF9vYmplY3RpZCA9IGxlMzJfdG9fY3B1IChtYXBbMV0pOworICAgIGlmICh1bnVzZWRfb2JqZWN0aWQgPT0gVTMyX01BWCkgeworCXJlaXNlcmZzX3dhcm5pbmcgKHMsICIlczogbm8gbW9yZSBvYmplY3QgaWRzIiwgX19GVU5DVElPTl9fKTsKKwlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSkgOworCXJldHVybiAwOworICAgIH0KKworICAgIC8qIFRoaXMgaW5jcmVtZW50YXRpb24gYWxsb2NhdGVzIHRoZSBmaXJzdCB1bnVzZWQgb2JqZWN0aWQuIFRoYXQKKyAgICAgICBpcyB0byBzYXksIHRoZSBmaXJzdCBlbnRyeSBvbiB0aGUgb2JqZWN0aWQgbWFwIGlzIHRoZSBmaXJzdAorICAgICAgIHVudXNlZCBvYmplY3RpZCwgYW5kIGJ5IGluY3JlbWVudGluZyBpdCB3ZSB1c2UgaXQuICBTZWUgYmVsb3cKKyAgICAgICB3aGVyZSB3ZSBjaGVjayB0byBzZWUgaWYgd2UgZWxpbWluYXRlZCBhIHNlcXVlbmNlIG9mIHVudXNlZAorICAgICAgIG9iamVjdGlkcy4uLi4gKi8KKyAgICBtYXBbMV0gPSBjcHVfdG9fbGUzMiAodW51c2VkX29iamVjdGlkICsgMSk7CisKKyAgICAvKiBOb3cgd2UgY2hlY2sgdG8gc2VlIGlmIHdlIGVsaW1pbmF0ZWQgdGhlIGxhc3QgcmVtYWluaW5nIG1lbWJlciBvZgorICAgICAgIHRoZSBmaXJzdCBldmVuIHNlcXVlbmNlIChhbmQgY2FuIGVsaW1pbmF0ZSB0aGUgc2VxdWVuY2UgYnkKKyAgICAgICBlbGltaW5hdGluZyBpdHMgbGFzdCBvYmplY3RpZCBmcm9tIG9pZHMpLCBhbmQgY2FuIGNvbGxhcHNlIHRoZQorICAgICAgIGZpcnN0IHR3byBvZGQgc2VxdWVuY2VzIGludG8gb25lIHNlcXVlbmNlLiAgSWYgc28sIHRoZW4gdGhlIG5ldAorICAgICAgIHJlc3VsdCBpcyB0byBlbGltaW5hdGUgYSBwYWlyIG9mIG9iamVjdGlkcyBmcm9tIG9pZHMuICBXZSBkbyB0aGlzCisgICAgICAgYnkgc2hpZnRpbmcgdGhlIGVudGlyZSBtYXAgdG8gdGhlIGxlZnQuICovCisgICAgaWYgKHNiX29pZF9jdXJzaXplKHJzKSA+IDIgJiYgbWFwWzFdID09IG1hcFsyXSkgeworCW1lbW1vdmUgKG1hcCArIDEsIG1hcCArIDMsIChzYl9vaWRfY3Vyc2l6ZShycykgLSAzKSAqIHNpemVvZihfX3UzMikpOworICAgICAgICBzZXRfc2Jfb2lkX2N1cnNpemUoIHJzLCBzYl9vaWRfY3Vyc2l6ZShycykgLSAyICk7CisgICAgfQorCisgICAgam91cm5hbF9tYXJrX2RpcnR5KHRoLCBzLCBTQl9CVUZGRVJfV0lUSF9TQiAocykpOworICAgIHJldHVybiB1bnVzZWRfb2JqZWN0aWQ7Cit9CisKKworLyogbWFrZXMgb2JqZWN0IGlkZW50aWZpZXIgdW51c2VkICovCit2b2lkIHJlaXNlcmZzX3JlbGVhc2Vfb2JqZWN0aWQgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCAKKwkJCQlfX3UzMiBvYmplY3RpZF90b19yZWxlYXNlKQoreworICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMgPSB0aC0+dF9zdXBlcjsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpOworICAgIF9fdTMyICogbWFwID0gb2JqZWN0aWRfbWFwIChzLCBycyk7CisgICAgaW50IGkgPSAwOworCisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworICAgIC8vcmV0dXJuOworICAgIGNoZWNrX29iamVjdGlkX21hcCAocywgbWFwKTsKKworICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpIDsKKyAgICBqb3VybmFsX21hcmtfZGlydHkodGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCIChzKSk7IAorCisgICAgLyogc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgb2JqZWN0aWQgbWFwIChpID0gMCkgYW5kIGdvIHRvCisgICAgICAgdGhlIGVuZCBvZiBpdCAoaSA9IGRpc2tfc2ItPnNfb2lkX2N1cnNpemUpLiAgTGluZWFyIHNlYXJjaCBpcworICAgICAgIHdoYXQgd2UgdXNlLCB0aG91Z2ggaXQgaXMgcG9zc2libGUgdGhhdCBiaW5hcnkgc2VhcmNoIHdvdWxkIGJlCisgICAgICAgbW9yZSBlZmZpY2llbnQgYWZ0ZXIgcGVyZm9ybWluZyBsb3RzIG9mIGRlbGV0aW9ucyAod2hpY2ggaXMKKyAgICAgICB3aGVuIG9pZHMgaXMgbGFyZ2UuKSAgV2Ugb25seSBjaGVjayBldmVuIGkncy4gKi8KKyAgICB3aGlsZSAoaSA8IHNiX29pZF9jdXJzaXplKHJzKSkgeworCWlmIChvYmplY3RpZF90b19yZWxlYXNlID09IGxlMzJfdG9fY3B1IChtYXBbaV0pKSB7CisJICAgIC8qIFRoaXMgaW5jcmVtZW50YXRpb24gdW5hbGxvY2F0ZXMgdGhlIG9iamVjdGlkLiAqLworCSAgICAvL21hcFtpXSsrOworCSAgICBtYXBbaV0gPSBjcHVfdG9fbGUzMiAobGUzMl90b19jcHUgKG1hcFtpXSkgKyAxKTsKKworCSAgICAvKiBEaWQgd2UgdW5hbGxvY2F0ZSB0aGUgbGFzdCBtZW1iZXIgb2YgYW4gb2RkIHNlcXVlbmNlLCBhbmQgY2FuIHNocmluayBvaWRzPyAqLworCSAgICBpZiAobWFwW2ldID09IG1hcFtpKzFdKSB7CisJCS8qIHNocmluayBvYmplY3RpZCBtYXAgKi8KKwkJbWVtbW92ZSAobWFwICsgaSwgbWFwICsgaSArIDIsIAorCQkJIChzYl9vaWRfY3Vyc2l6ZShycykgLSBpIC0gMikgKiBzaXplb2YgKF9fdTMyKSk7CisJCS8vZGlza19zYi0+c19vaWRfY3Vyc2l6ZSAtPSAyOworICAgICAgICAgICAgICAgIHNldF9zYl9vaWRfY3Vyc2l6ZSggcnMsIHNiX29pZF9jdXJzaXplKHJzKSAtIDIgKTsKKworCQlSRkFMU0UoIHNiX29pZF9jdXJzaXplKHJzKSA8IDIgfHwgCisJCSAgICAgICAgc2Jfb2lkX2N1cnNpemUocnMpID4gc2Jfb2lkX21heHNpemUocnMpLAorCQkgICAgICAgICJ2cy0xNTAwNTogb2JqZWN0aWQgbWFwIGNvcnJ1cHRlZCBjdXJfc2l6ZSA9PSAlZCAobWF4ID09ICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBzYl9vaWRfY3Vyc2l6ZShycyksIHNiX29pZF9tYXhzaXplKHJzKSk7CisJICAgIH0KKwkgICAgcmV0dXJuOworCX0KKworCWlmIChvYmplY3RpZF90b19yZWxlYXNlID4gbGUzMl90b19jcHUgKG1hcFtpXSkgJiYgCisJICAgIG9iamVjdGlkX3RvX3JlbGVhc2UgPCBsZTMyX3RvX2NwdSAobWFwW2kgKyAxXSkpIHsKKwkgICAgLyogc2l6ZSBvZiBvYmplY3RpZCBtYXAgaXMgbm90IGNoYW5nZWQgKi8KKwkgICAgaWYgKG9iamVjdGlkX3RvX3JlbGVhc2UgKyAxID09IGxlMzJfdG9fY3B1IChtYXBbaSArIDFdKSkgeworCQkvL29iamVjdGlkX21hcFtpKzFdLS07CisJCW1hcFtpICsgMV0gPSBjcHVfdG9fbGUzMiAobGUzMl90b19jcHUgKG1hcFtpICsgMV0pIC0gMSk7CisJCXJldHVybjsKKwkgICAgfQorCisgICAgICAgICAgICAvKiBKRE0gY29tcGFyaW5nIHR3byBsaXR0bGUtZW5kaWFuIHZhbHVlcyBmb3IgZXF1YWxpdHkgLS0gc2FmZSAqLworCWlmIChzYl9vaWRfY3Vyc2l6ZShycykgPT0gc2Jfb2lkX21heHNpemUocnMpKSB7CisJCS8qIG9iamVjdGlkIG1hcCBtdXN0IGJlIGV4cGFuZGVkLCBidXQgdGhlcmUgaXMgbm8gc3BhY2UgKi8KKwkJUFJPQ19JTkZPX0lOQyggcywgbGVha2VkX29pZCApOworCQlyZXR1cm47CisJfQorCisJICAgIC8qIGV4cGFuZCB0aGUgb2JqZWN0aWQgbWFwKi8KKwkgICAgbWVtbW92ZSAobWFwICsgaSArIDMsIG1hcCArIGkgKyAxLCAKKwkJICAgICAoc2Jfb2lkX2N1cnNpemUocnMpIC0gaSAtIDEpICogc2l6ZW9mKF9fdTMyKSk7CisJICAgIG1hcFtpICsgMV0gPSBjcHVfdG9fbGUzMiAob2JqZWN0aWRfdG9fcmVsZWFzZSk7CisJICAgIG1hcFtpICsgMl0gPSBjcHVfdG9fbGUzMiAob2JqZWN0aWRfdG9fcmVsZWFzZSArIDEpOworICAgICAgICAgICAgc2V0X3NiX29pZF9jdXJzaXplKCBycywgc2Jfb2lkX2N1cnNpemUocnMpICsgMiApOworCSAgICByZXR1cm47CisJfQorCWkgKz0gMjsKKyAgICB9CisKKyAgICByZWlzZXJmc193YXJuaW5nIChzLCAidnMtMTUwMTE6IHJlaXNlcmZzX3JlbGVhc2Vfb2JqZWN0aWQ6IHRyaWVkIHRvIGZyZWUgZnJlZSBvYmplY3QgaWQgKCVsdSkiLAorCQkgICAgICAoIGxvbmcgdW5zaWduZWQgKSBvYmplY3RpZF90b19yZWxlYXNlKTsKK30KKworCitpbnQgcmVpc2VyZnNfY29udmVydF9vYmplY3RpZF9tYXBfdjEoc3RydWN0IHN1cGVyX2Jsb2NrICpzKSB7CisgICAgc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpkaXNrX3NiID0gU0JfRElTS19TVVBFUl9CTE9DSyAocyk7CisgICAgaW50IGN1cl9zaXplID0gc2Jfb2lkX2N1cnNpemUoZGlza19zYik7CisgICAgaW50IG5ld19zaXplID0gKHMtPnNfYmxvY2tzaXplIC0gU0JfU0laRSkgLyBzaXplb2YoX191MzIpIC8gMiAqIDIgOworICAgIGludCBvbGRfbWF4ID0gc2Jfb2lkX21heHNpemUoZGlza19zYik7CisgICAgc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrX3YxICpkaXNrX3NiX3YxIDsKKyAgICBfX3UzMiAqb2JqZWN0aWRfbWFwLCAqbmV3X29iamVjdGlkX21hcCA7CisgICAgaW50IGkgOworCisgICAgZGlza19zYl92MT0oc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrX3YxICopKFNCX0JVRkZFUl9XSVRIX1NCKHMpLT5iX2RhdGEpOworICAgIG9iamVjdGlkX21hcCA9IChfX3UzMiAqKShkaXNrX3NiX3YxICsgMSkgOworICAgIG5ld19vYmplY3RpZF9tYXAgPSAoX191MzIgKikoZGlza19zYiArIDEpIDsKKworICAgIGlmIChjdXJfc2l6ZSA+IG5ld19zaXplKSB7CisJLyogbWFyayBldmVyeW9uZSB1c2VkIHRoYXQgd2FzIGxpc3RlZCBhcyBmcmVlIGF0IHRoZSBlbmQgb2YgdGhlIG9iamVjdGlkCisJKiogbWFwIAorCSovCisJb2JqZWN0aWRfbWFwW25ld19zaXplIC0gMV0gPSBvYmplY3RpZF9tYXBbY3VyX3NpemUgLSAxXSA7CisJc2V0X3NiX29pZF9jdXJzaXplKGRpc2tfc2IsbmV3X3NpemUpIDsKKyAgICB9CisgICAgLyogbW92ZSB0aGUgc21hbGxlciBvYmplY3RpZCBtYXAgcGFzdCB0aGUgZW5kIG9mIHRoZSBuZXcgc3VwZXIgKi8KKyAgICBmb3IgKGkgPSBuZXdfc2l6ZSAtIDEgOyBpID49IDAgOyBpLS0pIHsKKyAgICAgICAgb2JqZWN0aWRfbWFwW2kgKyAob2xkX21heCAtIG5ld19zaXplKV0gPSBvYmplY3RpZF9tYXBbaV0gOyAKKyAgICB9CisKKworICAgIC8qIHNldCB0aGUgbWF4IHNpemUgc28gd2UgZG9uJ3Qgb3ZlcmZsb3cgbGF0ZXIgKi8KKyAgICBzZXRfc2Jfb2lkX21heHNpemUoZGlza19zYixuZXdfc2l6ZSkgOworCisgICAgLyogWmVybyBvdXQgbGFiZWwgYW5kIGdlbmVyYXRlIHJhbmRvbSBVVUlEICovCisgICAgbWVtc2V0KGRpc2tfc2ItPnNfbGFiZWwsIDAsIHNpemVvZihkaXNrX3NiLT5zX2xhYmVsKSkgOworICAgIGdlbmVyYXRlX3JhbmRvbV91dWlkKGRpc2tfc2ItPnNfdXVpZCk7CisKKyAgICAvKiBmaW5hbGx5LCB6ZXJvIG91dCB0aGUgdW51c2VkIGNodW5rIG9mIHRoZSBuZXcgc3VwZXIgKi8KKyAgICBtZW1zZXQoZGlza19zYi0+c191bnVzZWQsIDAsIHNpemVvZihkaXNrX3NiLT5zX3VudXNlZCkpIDsKKyAgICByZXR1cm4gMCA7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3ByaW50cy5jIGIvZnMvcmVpc2VyZnMvcHJpbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmZGNhMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL3ByaW50cy5jCkBAIC0wLDAgKzEsNzI3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAgYnkgSGFucyBSZWlzZXIsIGxpY2Vuc2luZyBnb3Zlcm5lZCBieSByZWlzZXJmcy9SRUFETUUKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK3N0YXRpYyBjaGFyIGVycm9yX2J1ZlsxMDI0XTsKK3N0YXRpYyBjaGFyIGZtdF9idWZbMTAyNF07CitzdGF0aWMgY2hhciBvZmZfYnVmWzgwXTsKKworCitzdGF0aWMgY2hhciAqIHJlaXNlcmZzX2NwdV9vZmZzZXQgKHN0cnVjdCBjcHVfa2V5ICoga2V5KQoreworICBpZiAoY3B1X2tleV9rX3R5cGUoa2V5KSA9PSBUWVBFX0RJUkVOVFJZKQorICAgIHNwcmludGYgKG9mZl9idWYsICIlTHUoJUx1KSIsIAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylHRVRfSEFTSF9WQUxVRSAoY3B1X2tleV9rX29mZnNldCAoa2V5KSksCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKUdFVF9HRU5FUkFUSU9OX05VTUJFUiAoY3B1X2tleV9rX29mZnNldCAoa2V5KSkpOworICBlbHNlCisgICAgc3ByaW50ZiAob2ZmX2J1ZiwgIjB4JUx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZyljcHVfa2V5X2tfb2Zmc2V0IChrZXkpKTsKKyAgcmV0dXJuIG9mZl9idWY7Cit9CisKKworc3RhdGljIGNoYXIgKiBsZV9vZmZzZXQgKHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCit7CisgIGludCB2ZXJzaW9uOworCisgIHZlcnNpb24gPSBsZV9rZXlfdmVyc2lvbiAoa2V5KTsKKyAgaWYgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9ESVJFTlRSWSkKKyAgICBzcHJpbnRmIChvZmZfYnVmLCAiJUx1KCVMdSkiLCAKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpR0VUX0hBU0hfVkFMVUUgKGxlX2tleV9rX29mZnNldCAodmVyc2lvbiwga2V5KSksCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKUdFVF9HRU5FUkFUSU9OX05VTUJFUiAobGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBrZXkpKSk7CisgIGVsc2UKKyAgICBzcHJpbnRmIChvZmZfYnVmLCAiMHglTHgiLCAodW5zaWduZWQgbG9uZyBsb25nKWxlX2tleV9rX29mZnNldCAodmVyc2lvbiwga2V5KSk7CisgIHJldHVybiBvZmZfYnVmOworfQorCisKK3N0YXRpYyBjaGFyICogY3B1X3R5cGUgKHN0cnVjdCBjcHVfa2V5ICoga2V5KQoreworICAgIGlmIChjcHVfa2V5X2tfdHlwZSAoa2V5KSA9PSBUWVBFX1NUQVRfREFUQSkKKwlyZXR1cm4gIlNEIjsKKyAgICBpZiAoY3B1X2tleV9rX3R5cGUgKGtleSkgPT0gVFlQRV9ESVJFTlRSWSkKKwlyZXR1cm4gIkRJUiI7CisgICAgaWYgKGNwdV9rZXlfa190eXBlIChrZXkpID09IFRZUEVfRElSRUNUKQorCXJldHVybiAiRElSRUNUIjsKKyAgICBpZiAoY3B1X2tleV9rX3R5cGUgKGtleSkgPT0gVFlQRV9JTkRJUkVDVCkKKwlyZXR1cm4gIklORCI7CisgICAgcmV0dXJuICJVTktOT1dOIjsKK30KKworCitzdGF0aWMgY2hhciAqIGxlX3R5cGUgKHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCit7CisgICAgaW50IHZlcnNpb247CisgICAgCisgICAgdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uIChrZXkpOworCisgICAgaWYgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9TVEFUX0RBVEEpCisJcmV0dXJuICJTRCI7CisgICAgaWYgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9ESVJFTlRSWSkKKwlyZXR1cm4gIkRJUiI7CisgICAgaWYgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9ESVJFQ1QpCisJcmV0dXJuICJESVJFQ1QiOworICAgIGlmIChsZV9rZXlfa190eXBlICh2ZXJzaW9uLCBrZXkpID09IFRZUEVfSU5ESVJFQ1QpCisJcmV0dXJuICJJTkQiOworICAgIHJldHVybiAiVU5LTk9XTiI7Cit9CisKKworLyogJWsgKi8KK3N0YXRpYyB2b2lkIHNwcmludGZfbGVfa2V5IChjaGFyICogYnVmLCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5KQoreworICBpZiAoa2V5KQorICAgIHNwcmludGYgKGJ1ZiwgIlslZCAlZCAlcyAlc10iLCBsZTMyX3RvX2NwdSAoa2V5LT5rX2Rpcl9pZCksCisJICAgICBsZTMyX3RvX2NwdSAoa2V5LT5rX29iamVjdGlkKSwgbGVfb2Zmc2V0IChrZXkpLCBsZV90eXBlIChrZXkpKTsKKyAgZWxzZQorICAgIHNwcmludGYgKGJ1ZiwgIltOVUxMXSIpOworfQorCisKKy8qICVLICovCitzdGF0aWMgdm9pZCBzcHJpbnRmX2NwdV9rZXkgKGNoYXIgKiBidWYsIHN0cnVjdCBjcHVfa2V5ICoga2V5KQoreworICBpZiAoa2V5KQorICAgIHNwcmludGYgKGJ1ZiwgIlslZCAlZCAlcyAlc10iLCBrZXktPm9uX2Rpc2tfa2V5LmtfZGlyX2lkLAorCSAgICAga2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkLCByZWlzZXJmc19jcHVfb2Zmc2V0IChrZXkpLAorICAgICAgICAgICAgIGNwdV90eXBlIChrZXkpKTsKKyAgZWxzZQorICAgIHNwcmludGYgKGJ1ZiwgIltOVUxMXSIpOworfQorCitzdGF0aWMgdm9pZCBzcHJpbnRmX2RlX2hlYWQoIGNoYXIgKmJ1Ziwgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaCApCit7CisgICAgaWYoIGRlaCApCisgICAgICAgIHNwcmludGYoIGJ1ZiwgIltvZmZzZXQ9JWQgZGlyX2lkPSVkIG9iamVjdGlkPSVkIGxvY2F0aW9uPSVkIHN0YXRlPSUwNHhdIiwgZGVoX29mZnNldChkZWgpLCBkZWhfZGlyX2lkKGRlaCksCisgICAgICAgICAgICAgICAgIGRlaF9vYmplY3RpZChkZWgpLCBkZWhfbG9jYXRpb24oZGVoKSwgZGVoX3N0YXRlKGRlaCkgKTsKKyAgICBlbHNlCisgICAgICAgIHNwcmludGYoIGJ1ZiwgIltOVUxMXSIgKTsKKworfQorCitzdGF0aWMgdm9pZCBzcHJpbnRmX2l0ZW1faGVhZCAoY2hhciAqIGJ1Ziwgc3RydWN0IGl0ZW1faGVhZCAqIGloKQoreworICAgIGlmIChpaCkgeworCXN0cmNweSAoYnVmLCAoaWhfdmVyc2lvbiAoaWgpID09IEtFWV9GT1JNQVRfM182KSA/ICIqMy42KiAiIDogIiozLjUqIik7CisJc3ByaW50Zl9sZV9rZXkgKGJ1ZiArIHN0cmxlbiAoYnVmKSwgJihpaC0+aWhfa2V5KSk7CisJc3ByaW50ZiAoYnVmICsgc3RybGVuIChidWYpLCAiLCBpdGVtX2xlbiAlZCwgaXRlbV9sb2NhdGlvbiAlZCwgIgorCQkgImZyZWVfc3BhY2UoZW50cnlfY291bnQpICVkIiwKKwkJIGloX2l0ZW1fbGVuKGloKSwgaWhfbG9jYXRpb24oaWgpLCBpaF9mcmVlX3NwYWNlIChpaCkpOworICAgIH0gZWxzZQorCXNwcmludGYgKGJ1ZiwgIltOVUxMXSIpOworfQorCisKK3N0YXRpYyB2b2lkIHNwcmludGZfZGlyZW50cnkgKGNoYXIgKiBidWYsIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSkKK3sKKyAgY2hhciBuYW1lWzIwXTsKKworICBtZW1jcHkgKG5hbWUsIGRlLT5kZV9uYW1lLCBkZS0+ZGVfbmFtZWxlbiA+IDE5ID8gMTkgOiBkZS0+ZGVfbmFtZWxlbik7CisgIG5hbWUgW2RlLT5kZV9uYW1lbGVuID4gMTkgPyAxOSA6IGRlLT5kZV9uYW1lbGVuXSA9IDA7CisgIHNwcmludGYgKGJ1ZiwgIlwiJXNcIj09PlslZCAlZF0iLCBuYW1lLCBkZS0+ZGVfZGlyX2lkLCBkZS0+ZGVfb2JqZWN0aWQpOworfQorCisKK3N0YXRpYyB2b2lkIHNwcmludGZfYmxvY2tfaGVhZCAoY2hhciAqIGJ1Ziwgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCit7CisgIHNwcmludGYgKGJ1ZiwgImxldmVsPSVkLCBucl9pdGVtcz0lZCwgZnJlZV9zcGFjZT0lZCByZGtleSAiLAorCSAgIEJfTEVWRUwgKGJoKSwgQl9OUl9JVEVNUyAoYmgpLCBCX0ZSRUVfU1BBQ0UgKGJoKSk7Cit9CisKKworc3RhdGljIHZvaWQgc3ByaW50Zl9idWZmZXJfaGVhZCAoY2hhciAqIGJ1Ziwgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpIAoreworICBjaGFyIGJbQkRFVk5BTUVfU0laRV07CisKKyAgc3ByaW50ZiAoYnVmLCAiZGV2ICVzLCBzaXplICVkLCBibG9ja25yICVsbHUsIGNvdW50ICVkLCBzdGF0ZSAweCVseCwgcGFnZSAlcCwgKCVzLCAlcywgJXMpIiwKKwkgICBiZGV2bmFtZSAoYmgtPmJfYmRldiwgYiksIGJoLT5iX3NpemUsCisJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLAorCSAgIGF0b21pY19yZWFkICgmKGJoLT5iX2NvdW50KSksCisJICAgYmgtPmJfc3RhdGUsIGJoLT5iX3BhZ2UsCisJICAgYnVmZmVyX3VwdG9kYXRlIChiaCkgPyAiVVBUT0RBVEUiIDogIiFVUFRPREFURSIsCisJICAgYnVmZmVyX2RpcnR5IChiaCkgPyAiRElSVFkiIDogIkNMRUFOIiwKKwkgICBidWZmZXJfbG9ja2VkIChiaCkgPyAiTE9DS0VEIiA6ICJVTkxPQ0tFRCIpOworfQorCisKK3N0YXRpYyB2b2lkIHNwcmludGZfZGlza19jaGlsZCAoY2hhciAqIGJ1Ziwgc3RydWN0IGRpc2tfY2hpbGQgKiBkYykKK3sKKyAgc3ByaW50ZiAoYnVmLCAiW2RjX251bWJlcj0lZCwgZGNfc2l6ZT0ldV0iLCBkY19ibG9ja19udW1iZXIoZGMpLCBkY19zaXplKGRjKSk7Cit9CisKKworc3RhdGljIGNoYXIgKiBpc190aGVyZV9yZWlzZXJmc19zdHJ1Y3QgKGNoYXIgKiBmbXQsIGludCAqIHdoYXQsIGludCAqIHNraXApCit7CisgIGNoYXIgKiBrID0gZm10OworCisgICpza2lwID0gMDsKKyAgCisgIHdoaWxlICgoayA9IHN0cmNociAoaywgJyUnKSkgIT0gTlVMTCkKKyAgeworICAgIGlmIChrWzFdID09ICdrJyB8fCBrWzFdID09ICdLJyB8fCBrWzFdID09ICdoJyB8fCBrWzFdID09ICd0JyB8fAorCSAgICAgIGtbMV0gPT0gJ3onIHx8IGtbMV0gPT0gJ2InIHx8IGtbMV0gPT0gJ3knIHx8IGtbMV0gPT0gJ2EnICkgeworICAgICAgKndoYXQgPSBrWzFdOworICAgICAgYnJlYWs7CisgICAgfQorICAgICgqc2tpcCkgKys7CisgICAgayArKzsKKyAgfQorICByZXR1cm4gazsKK30KKworCisvKiBkZWJ1Z2dpbmcgcmVpc2VyZnMgd2UgdXNlZCB0byBwcmludCBvdXQgYSBsb3Qgb2YgZGlmZmVyZW50CisgICB2YXJpYWJsZXMsIGxpa2Uga2V5cywgaXRlbSBoZWFkZXJzLCBidWZmZXIgaGVhZHMgZXRjLiBWYWx1ZXMgb2YKKyAgIG1vc3QgZmllbGRzIG1hdHRlci4gU28gaXQgdG9vayBhIGxvbmcgdGltZSBqdXN0IHRvIHdyaXRlCisgICBhcHByb3ByaWF0aXZlIHByaW50ay4gV2l0aCB0aGlzIHJlaXNlcmZzX3dhcm5pbmcgeW91IGNhbiB1c2UgZm9ybWF0CisgICBzcGVjaWZpY2F0aW9uIGZvciBjb21wbGV4IHN0cnVjdHVyZXMgbGlrZSB5b3UgdXNlZCB0byBkbyB3aXRoCisgICBwcmludGZzIGZvciBpbnRlZ2VycywgZG91YmxlcyBhbmQgcG9pbnRlcnMuIEZvciBpbnN0YW5jZSwgdG8gcHJpbnQKKyAgIG91dCBrZXkgc3RydWN0dXJlIHlvdSBoYXZlIHRvIHdyaXRlIGp1c3Q6IAorICAgcmVpc2VyZnNfd2FybmluZyAoImJhZCBrZXkgJWsiLCBrZXkpOyAKKyAgIGluc3RlYWQgb2YgCisgICBwcmludGsgKCJiYWQga2V5ICVsdSAlbHUgJWx1ICVsdSIsIGtleS0+a19kaXJfaWQsIGtleS0+a19vYmplY3RpZCwgCisgICAgICAgICAgIGtleS0+a19vZmZzZXQsIGtleS0+a191bmlxdWVuZXNzKTsgCisqLworCisKK3N0YXRpYyB2b2lkCitwcmVwYXJlX2Vycm9yX2J1ZiggY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MgKQoreworICAgIGNoYXIgKiBmbXQxID0gZm10X2J1ZjsKKyAgICBjaGFyICogazsKKyAgICBjaGFyICogcCA9IGVycm9yX2J1ZjsKKyAgICBpbnQgaSwgaiwgd2hhdCwgc2tpcDsKKworICAgIHN0cmNweSAoZm10MSwgZm10KTsKKworICAgIHdoaWxlKCAoayA9IGlzX3RoZXJlX3JlaXNlcmZzX3N0cnVjdCggZm10MSwgJndoYXQsICZza2lwICkpICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgKmsgPSAwOworCisgICAgICAgIHAgKz0gdnNwcmludGYgKHAsIGZtdDEsIGFyZ3MpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBza2lwOyBpICsrKQorICAgICAgICAgICAgaiA9IHZhX2FyZyAoYXJncywgaW50KTsKKworICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKKyAgICAgICAgY2FzZSAnayc6CisgICAgICAgICAgICBzcHJpbnRmX2xlX2tleSAocCwgdmFfYXJnKGFyZ3MsIHN0cnVjdCByZWlzZXJmc19rZXkgKikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ0snOgorICAgICAgICAgICAgc3ByaW50Zl9jcHVfa2V5IChwLCB2YV9hcmcoYXJncywgc3RydWN0IGNwdV9rZXkgKikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgc3ByaW50Zl9pdGVtX2hlYWQgKHAsIHZhX2FyZyhhcmdzLCBzdHJ1Y3QgaXRlbV9oZWFkICopKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgIHNwcmludGZfZGlyZW50cnkgKHAsIHZhX2FyZyhhcmdzLCBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICopKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd5JzoKKyAgICAgICAgICAgIHNwcmludGZfZGlza19jaGlsZCAocCwgdmFfYXJnKGFyZ3MsIHN0cnVjdCBkaXNrX2NoaWxkICopKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd6JzoKKyAgICAgICAgICAgIHNwcmludGZfYmxvY2tfaGVhZCAocCwgdmFfYXJnKGFyZ3MsIHN0cnVjdCBidWZmZXJfaGVhZCAqKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnYic6CisgICAgICAgICAgICBzcHJpbnRmX2J1ZmZlcl9oZWFkIChwLCB2YV9hcmcoYXJncywgc3RydWN0IGJ1ZmZlcl9oZWFkICopKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdhJzoKKyAgICAgICAgICAgIHNwcmludGZfZGVfaGVhZCAocCwgdmFfYXJnKGFyZ3MsIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcCArPSBzdHJsZW4gKHApOworICAgICAgICBmbXQxID0gayArIDI7CisgICAgfQorICAgIHZzcHJpbnRmIChwLCBmbXQxLCBhcmdzKTsKKworfQorCisKKy8qIGluIGFkZGl0aW9uIHRvIHVzdWFsIGNvbnZlcnNpb24gc3BlY2lmaWVycyB0aGlzIGFjY2VwdHMgcmVpc2VyZnMKKyAgIHNwZWNpZmljIGNvbnZlcnNpb24gc3BlY2lmaWVyczogCisgICAlayB0byBwcmludCBsaXR0bGUgZW5kaWFuIGtleSwgCisgICAlSyB0byBwcmludCBjcHUga2V5LCAKKyAgICVoIHRvIHByaW50IGl0ZW1faGVhZCwKKyAgICV0IHRvIHByaW50IGRpcmVjdG9yeSBlbnRyeSAKKyAgICV6IHRvIHByaW50IGJsb2NrIGhlYWQgKGFyZyBtdXN0IGJlIHN0cnVjdCBidWZmZXJfaGVhZCAqCisgICAlYiB0byBwcmludCBidWZmZXJfaGVhZAorKi8KKworI2RlZmluZSBkb19yZWlzZXJmc193YXJuaW5nKGZtdClcCit7XAorICAgIHZhX2xpc3QgYXJncztcCisgICAgdmFfc3RhcnQoIGFyZ3MsIGZtdCApO1wKKyAgICBwcmVwYXJlX2Vycm9yX2J1ZiggZm10LCBhcmdzICk7XAorICAgIHZhX2VuZCggYXJncyApO1wKK30KKwordm9pZCByZWlzZXJmc193YXJuaW5nIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICogZm10LCAuLi4pCit7CisgIGRvX3JlaXNlcmZzX3dhcm5pbmcoZm10KTsKKyAgaWYgKHNiKQorICAgICAgcHJpbnRrIChLRVJOX1dBUk5JTkcgIlJlaXNlckZTOiAlczogd2FybmluZzogJXNcbiIsCisgICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHNiKSwgZXJyb3JfYnVmKTsKKyAgZWxzZQorICAgICAgcHJpbnRrIChLRVJOX1dBUk5JTkcgIlJlaXNlckZTOiB3YXJuaW5nOiAlc1xuIiwgZXJyb3JfYnVmKTsKK30KKworLyogTm8gbmV3bGluZS4uIHJlaXNlcmZzX2luZm8gY2FsbHMgY2FuIGJlIGZvbGxvd2VkIGJ5IHByaW50aydzICovCit2b2lkIHJlaXNlcmZzX2luZm8gKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKK3sKKyAgZG9fcmVpc2VyZnNfd2FybmluZyhmbXQpOworICBpZiAoc2IpCisgICAgICBwcmludGsgKEtFUk5fTk9USUNFICJSZWlzZXJGUzogJXM6ICVzIiwKKyAgICAgICAgICAgICByZWlzZXJmc19iZGV2bmFtZSAoc2IpLCBlcnJvcl9idWYpOworICBlbHNlCisgICAgICBwcmludGsgKEtFUk5fTk9USUNFICJSZWlzZXJGUzogJXMiLCBlcnJvcl9idWYpOworfQorCisvKiBObyBuZXdsaW5lLi4gcmVpc2VyZnNfcHJpbnRrIGNhbGxzIGNhbiBiZSBmb2xsb3dlZCBieSBwcmludGsncyAqLworc3RhdGljIHZvaWQgcmVpc2VyZnNfcHJpbnRrIChjb25zdCBjaGFyICogZm10LCAuLi4pCit7CisgIGRvX3JlaXNlcmZzX3dhcm5pbmcoZm10KTsKKyAgcHJpbnRrIChlcnJvcl9idWYpOworfQorCit2b2lkIHJlaXNlcmZzX2RlYnVnIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBsZXZlbCwgY29uc3QgY2hhciAqIGZtdCwgLi4uKQoreworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworICBkb19yZWlzZXJmc193YXJuaW5nKGZtdCk7CisgIGlmIChzKQorICAgICAgcHJpbnRrIChLRVJOX0RFQlVHICJSZWlzZXJGUzogJXM6ICVzXG4iLAorICAgICAgICAgICAgIHJlaXNlcmZzX2JkZXZuYW1lIChzKSwgZXJyb3JfYnVmKTsKKyAgZWxzZQorICAgICAgcHJpbnRrIChLRVJOX0RFQlVHICJSZWlzZXJGUzogJXNcbiIsIGVycm9yX2J1Zik7CisjZW5kaWYKK30KKworLyogVGhlIGZvcm1hdDoKKworICAgICAgICAgICBtYWludGFpbmVyLWVycm9yaWQ6IFtmdW5jdGlvbi1uYW1lOl0gbWVzc2FnZQorCisgICAgd2hlcmUgZXJyb3JpZCBpcyB1bmlxdWUgdG8gdGhlIG1haW50YWluZXIgYW5kIGZ1bmN0aW9uLW5hbWUgaXMKKyAgICBvcHRpb25hbCwgaXMgcmVjb21tZW5kZWQsIHNvIHRoYXQgYW55b25lIGNhbiBlYXNpbHkgZmluZCB0aGUgYnVnCisgICAgd2l0aCBhIHNpbXBsZSBncmVwIGZvciB0aGUgc2hvcnQgdG8gdHlwZSBzdHJpbmcKKyAgICBtYWludGFpbmVyLWVycm9yaWQuICBEb24ndCBib3RoZXIgd2l0aCByZXVzaW5nIGVycm9yaWRzLCB0aGVyZSBhcmUKKyAgICBsb3RzIG9mIG51bWJlcnMgb3V0IHRoZXJlLgorCisgICAgRXhhbXBsZTogCisgICAgCisgICAgcmVpc2VyZnNfcGFuaWMoCisJcF9zYiwgInJlaXNlci0yOTogcmVpc2VyZnNfbmV3X2Jsb2NrbnJzOiAiCisJIm9uZSBvZiBzZWFyY2hfc3RhcnQgb3Igcm4oJWQpIGlzIGVxdWFsIHRvIE1BWF9CX05VTSwiCisJIndoaWNoIG1lYW5zIHRoYXQgd2UgYXJlIG9wdGltaXppbmcgbG9jYXRpb24gYmFzZWQgb24gdGhlIGJvZ3VzIGxvY2F0aW9uIG9mIGEgdGVtcCBidWZmZXIgKCVwKS4iLCAKKwlybiwgYmgKKyAgICApOworCisgICAgUmVndWxhciBwYW5pYygpcyBzb21ldGltZXMgY2xlYXIgdGhlIHNjcmVlbiBiZWZvcmUgdGhlIG1lc3NhZ2UgY2FuCisgICAgYmUgcmVhZCwgdGh1cyB0aGUgbmVlZCBmb3IgdGhlIHdoaWxlIGxvb3AuICAKKworICAgIE51bWJlcmluZyBzY2hlbWUgZm9yIHBhbmljIHVzZWQgYnkgVmxhZGltaXIgYW5kIEFuYXRvbHkoIEhhbnMgY29tcGxldGVseSBpZ25vcmVzIHRoaXMgc2NoZW1lLCBhbmQgY29uc2lkZXJzIGl0CisgICAgcG9pbnRsZXNzIGNvbXBsZXhpdHkpOgorCisgICAgcGFuaWNzIGluIHJlaXNlcmZzX2ZzLmggaGF2ZSBudW1iZXJzIGZyb20gMTAwMCB0byAxOTk5CisgICAgc3VwZXIuYwkJCQkgICAgICAgIDIwMDAgdG8gMjk5OQorICAgIHByZXNlcnZlLmMgKHVudXNlZCkJCQkgICAgMzAwMCB0byAzOTk5CisgICAgYml0bWFwLmMJCQkJICAgIDQwMDAgdG8gNDk5OQorICAgIHN0cmVlLmMJCQkJICAgICAgICA1MDAwIHRvIDU5OTkKKyAgICBwcmludHMuYwkJCQkgICAgNjAwMCB0byA2OTk5CisgICAgbmFtZWkuYyAgICAgICAgICAgICAgICAgICAgIDcwMDAgdG8gNzk5OQorICAgIGZpeF9ub2Rlcy5jICAgICAgICAgICAgICAgICA4MDAwIHRvIDg5OTkKKyAgICBkaXIuYyAgICAgICAgICAgICAgICAgICAgICAgOTAwMCB0byA5OTk5CisJbGJhbGFuY2UuYwkJCQkJMTAwMDAgdG8gMTA5OTkKKwlpYmFsYW5jZS5jCQkxMTAwMCB0byAxMTk5OSBub3QgcmVhZHkKKwlkb19iYWxhbi5jCQkxMjAwMCB0byAxMjk5OQorCWlub2RlLmMJCQkxMzAwMCB0byAxMzk5OQorCWZpbGUuYwkJCTE0MDAwIHRvIDE0OTk5CisgICAgb2JqZWN0aWQuYyAgICAgICAgICAgICAgICAgICAgICAgMTUwMDAgLSAxNTk5OQorICAgIGJ1ZmZlci5jICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwIC0gMTY5OTkKKyAgICBzeW1saW5rLmMgICAgICAgICAgICAgICAgICAgICAgICAxNzAwMCAtIDE3OTk5CisKKyAgIC4gICovCisKKworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworZXh0ZXJuIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiBjdXJfdGI7CisjZW5kaWYKKwordm9pZCByZWlzZXJmc19wYW5pYyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKK3sKKyAgZG9fcmVpc2VyZnNfd2FybmluZyhmbXQpOworICBwcmludGsgKEtFUk5fRU1FUkcgIlJFSVNFUkZTOiBwYW5pYyAoZGV2aWNlICVzKTogJXNcbiIsCisgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHNiKSwgZXJyb3JfYnVmKTsKKyAgQlVHICgpOworCisgIC8qIHRoaXMgaXMgbm90IGFjdHVhbGx5IGNhbGxlZCwgYnV0IG1ha2VzIHJlaXNlcmZzX3BhbmljKCkgIm5vcmV0dXJuIiAqLworICBwYW5pYyAoIlJFSVNFUkZTOiBwYW5pYyAoZGV2aWNlICVzKTogJXNcbiIsCisJIHJlaXNlcmZzX2JkZXZuYW1lIChzYiksIGVycm9yX2J1Zik7Cit9CisKK3ZvaWQKK3JlaXNlcmZzX2Fib3J0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZXJybm8sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIGRvX3JlaXNlcmZzX3dhcm5pbmcgKGZtdCk7CisKKyAgICBpZiAocmVpc2VyZnNfZXJyb3JfcGFuaWMgKHNiKSkgeworICAgICAgICBwYW5pYyAoS0VSTl9DUklUICJSRUlTRVJGUzogcGFuaWMgKGRldmljZSAlcyk6ICVzXG4iLAorICAgICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHNiKSwgZXJyb3JfYnVmKTsKKyAgICB9CisKKyAgICBpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisgICAgICAgIHJldHVybjsKKworICAgIHByaW50ayAoS0VSTl9DUklUICJSRUlTRVJGUzogYWJvcnQgKGRldmljZSAlcyk6ICVzXG4iLAorICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHNiKSwgZXJyb3JfYnVmKTsKKworICAgIHNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKyAgICByZWlzZXJmc19qb3VybmFsX2Fib3J0IChzYiwgZXJybm8pOworfQorCisvKiB0aGlzIHByaW50cyBpbnRlcm5hbCBub2RlcyAoNCBrZXlzL2l0ZW1zIGluIGxpbmUpIChkY19udW1iZXIsCisgICBkY19zaXplKVtrX2RpcmlkLCBrX29iamVjdGlkLCBrX29mZnNldCwga191bmlxdWVuZXNzXShkY19udW1iZXIsCisgICBkY19zaXplKS4uLiovCitzdGF0aWMgaW50IHByaW50X2ludGVybmFsIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgaW50IGZpcnN0LCBpbnQgbGFzdCkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5OworICAgIHN0cnVjdCBkaXNrX2NoaWxkICogZGM7CisgICAgaW50IGk7CisgICAgaW50IGZyb20sIHRvOworICAgIAorICAgIGlmICghQl9JU19LRVlTX0xFVkVMIChiaCkpCisJcmV0dXJuIDE7CisKKyAgICBjaGVja19pbnRlcm5hbCAoYmgpOworICAgIAorICAgIGlmIChmaXJzdCA9PSAtMSkgeworCWZyb20gPSAwOworCXRvID0gQl9OUl9JVEVNUyAoYmgpOworICAgIH0gZWxzZSB7CisJZnJvbSA9IGZpcnN0OworCXRvID0gbGFzdCA8IEJfTlJfSVRFTVMgKGJoKSA/IGxhc3QgOiBCX05SX0lURU1TIChiaCk7CisgICAgfQorCisgICAgcmVpc2VyZnNfcHJpbnRrICgiSU5URVJOQUwgTk9ERSAoJWxkKSBjb250YWlucyAlelxuIiwgIGJoLT5iX2Jsb2NrbnIsIGJoKTsKKyAgICAKKyAgICBkYyA9IEJfTl9DSElMRCAoYmgsIGZyb20pOworICAgIHJlaXNlcmZzX3ByaW50ayAoIlBUUiAlZDogJXkgIiwgZnJvbSwgZGMpOworICAgIAorICAgIGZvciAoaSA9IGZyb20sIGtleSA9IEJfTl9QREVMSU1fS0VZIChiaCwgZnJvbSksIGRjICsrOyBpIDwgdG87IGkgKyssIGtleSArKywgZGMgKyspIHsKKwlyZWlzZXJmc19wcmludGsgKCJLRVkgJWQ6ICVrIFBUUiAlZDogJXkgIiwgaSwga2V5LCBpICsgMSwgZGMpOworCWlmIChpICYmIGkgJSA0ID09IDApCisJICAgIHByaW50ayAoIlxuIik7CisgICAgfQorICAgIHByaW50ayAoIlxuIik7CisgICAgcmV0dXJuIDA7Cit9CisKKworCisKKworc3RhdGljIGludCBwcmludF9sZWFmIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgaW50IHByaW50X21vZGUsIGludCBmaXJzdCwgaW50IGxhc3QpCit7CisgICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKyAgICBpbnQgaSwgbnI7CisgICAgaW50IGZyb20sIHRvOworCisgICAgaWYgKCFCX0lTX0lURU1TX0xFVkVMIChiaCkpCisJcmV0dXJuIDE7CisKKyAgICBjaGVja19sZWFmIChiaCk7CisKKyAgICBibGtoID0gQl9CTEtfSEVBRCAoYmgpOworICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKGJoLDApOworICAgIG5yID0gYmxraF9ucl9pdGVtKGJsa2gpOworCisgICAgcHJpbnRrICgiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgICByZWlzZXJmc19wcmludGsgKCJMRUFGIE5PREUgKCVsZCkgY29udGFpbnMgJXpcbiIsIGJoLT5iX2Jsb2NrbnIsIGJoKTsKKworICAgIGlmICghKHByaW50X21vZGUgJiBQUklOVF9MRUFGX0lURU1TKSkgeworCXJlaXNlcmZzX3ByaW50ayAoIkZJUlNUIElURU1fS0VZOiAlaywgTEFTVCBJVEVNIEtFWTogJWtcbiIsCisJCQkgICYoaWgtPmloX2tleSksICYoKGloICsgbnIgLSAxKS0+aWhfa2V5KSk7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGZpcnN0IDwgMCB8fCBmaXJzdCA+IG5yIC0gMSkgCisJZnJvbSA9IDA7CisgICAgZWxzZSAKKwlmcm9tID0gZmlyc3Q7CisKKyAgICBpZiAobGFzdCA8IDAgfHwgbGFzdCA+IG5yICkKKwl0byA9IG5yOworICAgIGVsc2UKKwl0byA9IGxhc3Q7CisKKyAgICBpaCArPSBmcm9tOworICAgIHByaW50ayAoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgIHByaW50ayAoInwjI3wgICB0eXBlICAgIHwgICAgICAgICAgIGtleSAgICAgICAgICAgfCBpbGVuIHwgZnJlZV9zcGFjZSB8IHZlcnNpb24gfCBsb2MgIHxcbiIpOworICAgIGZvciAoaSA9IGZyb207IGkgPCB0bzsgaSsrLCBpaCArKykgeworCXByaW50ayAoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCXJlaXNlcmZzX3ByaW50ayAoInwlMmR8ICVoIHxcbiIsIGksIGloKTsKKwlpZiAocHJpbnRfbW9kZSAmIFBSSU5UX0xFQUZfSVRFTVMpCisJICAgIG9wX3ByaW50X2l0ZW0gKGloLCBCX0lfUElURU0gKGJoLCBpaCkpOworICAgIH0KKworICAgIHByaW50ayAoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2NoYXIgKiByZWlzZXJmc19oYXNobmFtZShpbnQgY29kZSkKK3sKKyAgICBpZiAoIGNvZGUgPT0gWVVSQV9IQVNIKQorCXJldHVybiAicnVwYXNvdiI7CisgICAgaWYgKCBjb2RlID09IFRFQV9IQVNIKQorCXJldHVybiAidGVhIjsKKyAgICBpZiAoIGNvZGUgPT0gUjVfSEFTSCkKKwlyZXR1cm4gInI1IjsKKworICAgIHJldHVybiAidW5rbm93biI7Cit9CisKKy8qIHJldHVybiAxIGlmIHRoaXMgaXMgbm90IHN1cGVyIGJsb2NrICovCitzdGF0aWMgaW50IHByaW50X3N1cGVyX2Jsb2NrIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycyA9IChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKikoYmgtPmJfZGF0YSk7CisgICAgaW50IHNraXBwZWQsIGRhdGFfYmxvY2tzOworICAgIGNoYXIgKnZlcnNpb247CisgICAgY2hhciBiW0JERVZOQU1FX1NJWkVdOworCisgICAgaWYgKGlzX3JlaXNlcmZzXzNfNShycykpIHsKKyAgICAgICAgdmVyc2lvbiA9ICIzLjUiOworICAgIH0gZWxzZSBpZiAoaXNfcmVpc2VyZnNfM182KHJzKSkgeworICAgICAgICB2ZXJzaW9uID0gIjMuNiI7CisgICAgfSBlbHNlIGlmIChpc19yZWlzZXJmc19qcihycykpIHsKKyAgICAgIHZlcnNpb24gPSAoKHNiX3ZlcnNpb24ocnMpID09IFJFSVNFUkZTX1ZFUlNJT05fMikgPworIAkJICIzLjYiIDogIjMuNSIpOyAgCisgICAgfSBlbHNlIHsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBwcmludGsgKCIlc1wncyBzdXBlciBibG9jayBpcyBpbiBibG9jayAlbGx1XG4iLCBiZGV2bmFtZSAoYmgtPmJfYmRldiwgYiksCisgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOworICAgIHByaW50ayAoIlJlaXNlcmZzIHZlcnNpb24gJXNcbiIsIHZlcnNpb24gKTsKKyAgICBwcmludGsgKCJCbG9jayBjb3VudCAldVxuIiwgc2JfYmxvY2tfY291bnQocnMpKTsKKyAgICBwcmludGsgKCJCbG9ja3NpemUgJWRcbiIsIHNiX2Jsb2Nrc2l6ZShycykpOworICAgIHByaW50ayAoIkZyZWUgYmxvY2tzICV1XG4iLCBzYl9mcmVlX2Jsb2NrcyhycykpOworICAgIC8vIEZJWE1FOiB0aGlzIHdvdWxkIGJlIGNvbmZ1c2luZyBpZgorICAgIC8vIHNvbWVvbmUgc3RvcmVzIHJlaXNlcmZzIHN1cGVyIGJsb2NrIGluIHNvbWUgZGF0YSBibG9jayA7KQorLy8gICAgc2tpcHBlZCA9IChiaC0+Yl9ibG9ja25yICogYmgtPmJfc2l6ZSkgLyBzYl9ibG9ja3NpemUocnMpOworICAgIHNraXBwZWQgPSBiaC0+Yl9ibG9ja25yOworICAgIGRhdGFfYmxvY2tzID0gc2JfYmxvY2tfY291bnQocnMpIC0gc2tpcHBlZCAtIDEgLSBzYl9ibWFwX25yKHJzKSAtCisJICAgICghaXNfcmVpc2VyZnNfanIocnMpID8gc2JfanBfam91cm5hbF9zaXplKHJzKSArIDEgOiBzYl9yZXNlcnZlZF9mb3Jfam91cm5hbChycykpIC0JICAgIAorCSAgICBzYl9mcmVlX2Jsb2Nrcyhycyk7CisgICAgcHJpbnRrICgiQnVzeSBibG9ja3MgKHNraXBwZWQgJWQsIGJpdG1hcHMgLSAlZCwgam91cm5hbCAob3IgcmVzZXJ2ZWQpIGJsb2NrcyAtICVkXG4iCisJICAgICIxIHN1cGVyIGJsb2NrLCAlZCBkYXRhIGJsb2Nrc1xuIiwgCisJICAgIHNraXBwZWQsIHNiX2JtYXBfbnIocnMpLCAoIWlzX3JlaXNlcmZzX2pyKHJzKSA/IChzYl9qcF9qb3VybmFsX3NpemUocnMpICsgMSkgOgorCQkJCSAgICAgIHNiX3Jlc2VydmVkX2Zvcl9qb3VybmFsKHJzKSkgLCBkYXRhX2Jsb2Nrcyk7CisgICAgcHJpbnRrICgiUm9vdCBibG9jayAldVxuIiwgc2Jfcm9vdF9ibG9jayhycykpOworICAgIHByaW50ayAoIkpvdXJuYWwgYmxvY2sgKGZpcnN0KSAlZFxuIiwgc2JfanBfam91cm5hbF8xc3RfYmxvY2socnMpKTsKKyAgICBwcmludGsgKCJKb3VybmFsIGRldiAlZFxuIiwgc2JfanBfam91cm5hbF9kZXYocnMpKTsKKyAgICBwcmludGsgKCJKb3VybmFsIG9yaWcgc2l6ZSAlZFxuIiwgc2JfanBfam91cm5hbF9zaXplKHJzKSk7CisgICAgcHJpbnRrICgiRlMgc3RhdGUgJWRcbiIsIHNiX2ZzX3N0YXRlKHJzKSk7CisgICAgcHJpbnRrICgiSGFzaCBmdW5jdGlvbiBcIiVzXCJcbiIsCisJICAgIHJlaXNlcmZzX2hhc2huYW1lKHNiX2hhc2hfZnVuY3Rpb25fY29kZShycykpKTsKKyAgICAKKyAgICBwcmludGsgKCJUcmVlIGhlaWdodCAlZFxuIiwgc2JfdHJlZV9oZWlnaHQocnMpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmludF9kZXNjX2Jsb2NrIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICogZGVzYzsKKworICAgIGlmIChtZW1jbXAoZ2V0X2pvdXJuYWxfZGVzY19tYWdpYyAoYmgpLCBKT1VSTkFMX0RFU0NfTUFHSUMsIDgpKQorCXJldHVybiAxOworCisgICAgZGVzYyA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICopKGJoLT5iX2RhdGEpOworICAgIHByaW50ayAoIkRlc2MgYmxvY2sgJWxsdSAoal90cmFuc19pZCAlZCwgal9tb3VudF9pZCAlZCwgal9sZW4gJWQpIiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLCBnZXRfZGVzY190cmFuc19pZCAoZGVzYyksIGdldF9kZXNjX21vdW50X2lkIChkZXNjKSwKKwkgICAgZ2V0X2Rlc2NfdHJhbnNfbGVuIChkZXNjKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworCit2b2lkIHByaW50X2Jsb2NrIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgLi4uKS8vaW50IHByaW50X21vZGUsIGludCBmaXJzdCwgaW50IGxhc3QpCit7CisgICAgdmFfbGlzdCBhcmdzOworICAgIGludCBtb2RlLCBmaXJzdCwgbGFzdDsKKworICAgIHZhX3N0YXJ0IChhcmdzLCBiaCk7CisKKyAgICBpZiAoICEgYmggKSB7CisJcHJpbnRrKCJwcmludF9ibG9jazogYnVmZmVyIGlzIE5VTExcbiIpOworCXJldHVybjsKKyAgICB9CisKKyAgICBtb2RlID0gdmFfYXJnIChhcmdzLCBpbnQpOworICAgIGZpcnN0ID0gdmFfYXJnIChhcmdzLCBpbnQpOworICAgIGxhc3QgPSB2YV9hcmcgKGFyZ3MsIGludCk7CisgICAgaWYgKHByaW50X2xlYWYgKGJoLCBtb2RlLCBmaXJzdCwgbGFzdCkpCisJaWYgKHByaW50X2ludGVybmFsIChiaCwgZmlyc3QsIGxhc3QpKQorCSAgICBpZiAocHJpbnRfc3VwZXJfYmxvY2sgKGJoKSkKKwkJaWYgKHByaW50X2Rlc2NfYmxvY2sgKGJoKSkKKwkJICAgIHByaW50ayAoIkJsb2NrICVsbHUgY29udGFpbnMgdW5mb3JtYXR0ZWQgZGF0YVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKK30KKworCisKK3N0YXRpYyBjaGFyIHByaW50X3RiX2J1ZlsyMDQ4XTsKKworLyogdGhpcyBzdG9yZXMgaW5pdGlhbCBzdGF0ZSBvZiB0cmVlIGJhbGFuY2UgaW4gdGhlIHByaW50X3RiX2J1ZiAqLwordm9pZCBzdG9yZV9wcmludF90YiAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiKQoreworICAgIGludCBoID0gMDsKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB0YlNoLCAqIHRiRmg7CisKKyAgICBpZiAoIXRiKQorCXJldHVybjsKKworICAgIHNwcmludGYgKHByaW50X3RiX2J1ZiwgIlxuIgorCSAgICAgIkJBTEFOQ0lORyAlZFxuIgorCSAgICAgIk1PREU9JWMsIElURU1fUE9TPSVkIFBPU19JTl9JVEVNPSVkXG4iIAorCSAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgorCSAgICAgIiogaCAqICAgIFMgICAgKiAgICBMICAgICogICAgUiAgICAqICAgRiAgICogICBGTCAgKiAgIEZSICAqICBDRkwgICogIENGUiAgKlxuIiwKKwkgICAgIFJFSVNFUkZTX1NCKHRiLT50Yl9zYiktPnNfZG9fYmFsYW5jZSwKKwkgICAgIHRiLT50Yl9tb2RlLCBQQVRIX0xBU1RfUE9TSVRJT04gKHRiLT50Yl9wYXRoKSwgdGItPnRiX3BhdGgtPnBvc19pbl9pdGVtKTsKKyAgCisgICAgZm9yIChoID0gMDsgaCA8IHNpemVvZih0Yi0+aW5zZXJ0X3NpemUpIC8gc2l6ZW9mICh0Yi0+aW5zZXJ0X3NpemVbMF0pOyBoICsrKSB7CisJaWYgKFBBVEhfSF9QQVRIX09GRlNFVCAodGItPnRiX3BhdGgsIGgpIDw9IHRiLT50Yl9wYXRoLT5wYXRoX2xlbmd0aCAmJiAKKwkgICAgUEFUSF9IX1BBVEhfT0ZGU0VUICh0Yi0+dGJfcGF0aCwgaCkgPiBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQpIHsKKwkgICAgdGJTaCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCk7CisJICAgIHRiRmggPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpOworCX0gZWxzZSB7CisJICAgIHRiU2ggPSBOVUxMOworCSAgICB0YkZoID0gTlVMTDsKKwl9CisJc3ByaW50ZiAocHJpbnRfdGJfYnVmICsgc3RybGVuIChwcmludF90Yl9idWYpLAorCQkgIiogJWQgKiAlM2xsZCglMmQpICogJTNsbGQoJTJkKSAqICUzbGxkKCUyZCkgKiAlNWxsZCAqICU1bGxkICogJTVsbGQgKiAlNWxsZCAqICU1bGxkICpcbiIsCisJCSBoLCAKKwkJICh0YlNoKSA/IChsb25nIGxvbmcpKHRiU2gtPmJfYmxvY2tucik6KC0xTEwpLAorCQkgKHRiU2gpID8gYXRvbWljX3JlYWQgKCYodGJTaC0+Yl9jb3VudCkpIDogLTEsCisJCSAodGItPkxbaF0pID8gKGxvbmcgbG9uZykodGItPkxbaF0tPmJfYmxvY2tucik6KC0xTEwpLAorCQkgKHRiLT5MW2hdKSA/IGF0b21pY19yZWFkICgmKHRiLT5MW2hdLT5iX2NvdW50KSkgOiAtMSwKKwkJICh0Yi0+UltoXSkgPyAobG9uZyBsb25nKSh0Yi0+UltoXS0+Yl9ibG9ja25yKTooLTFMTCksCisJCSAodGItPlJbaF0pID8gYXRvbWljX3JlYWQgKCYodGItPlJbaF0tPmJfY291bnQpKSA6IC0xLAorCQkgKHRiRmgpID8gKGxvbmcgbG9uZykodGJGaC0+Yl9ibG9ja25yKTooLTFMTCksCisJCSAodGItPkZMW2hdKSA/IChsb25nIGxvbmcpKHRiLT5GTFtoXS0+Yl9ibG9ja25yKTooLTFMTCksCisJCSAodGItPkZSW2hdKSA/IChsb25nIGxvbmcpKHRiLT5GUltoXS0+Yl9ibG9ja25yKTooLTFMTCksCisJCSAodGItPkNGTFtoXSkgPyAobG9uZyBsb25nKSh0Yi0+Q0ZMW2hdLT5iX2Jsb2NrbnIpOigtMUxMKSwKKwkJICh0Yi0+Q0ZSW2hdKSA/IChsb25nIGxvbmcpKHRiLT5DRlJbaF0tPmJfYmxvY2tucik6KC0xTEwpKTsKKyAgICB9CisKKyAgICBzcHJpbnRmIChwcmludF90Yl9idWYgKyBzdHJsZW4gKHByaW50X3RiX2J1ZiksIAorCSAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgorCSAgICAgIiogaCAqIHNpemUgKiBsbiAqIGxiICogcm4gKiByYiAqIGJsa24gKiBzMCAqIHMxICogczFiICogczIgKiBzMmIgKiBjdXJiICogbGsgKiByayAqXG4iCisJICAgICAiKiAwICogJTRkICogJTJkICogJTJkICogJTJkICogJTJkICogJTRkICogJTJkICogJTJkICogJTNkICogJTJkICogJTNkICogJTRkICogJTJkICogJTJkICpcbiIsCisJICAgICB0Yi0+aW5zZXJ0X3NpemVbMF0sIHRiLT5sbnVtWzBdLCB0Yi0+bGJ5dGVzLCB0Yi0+cm51bVswXSx0Yi0+cmJ5dGVzLCB0Yi0+YmxrbnVtWzBdLCAKKwkgICAgIHRiLT5zMG51bSwgdGItPnMxbnVtLHRiLT5zMWJ5dGVzLCAgdGItPnMybnVtLCB0Yi0+czJieXRlcywgdGItPmN1cl9ibGtudW0sIHRiLT5sa2V5WzBdLCB0Yi0+cmtleVswXSk7CisKKyAgICAvKiB0aGlzIHByaW50cyBiYWxhbmNlIHBhcmFtZXRlcnMgZm9yIG5vbi1sZWFmIGxldmVscyAqLworICAgIGggPSAwOworICAgIGRvIHsKKwloKys7CisJc3ByaW50ZiAocHJpbnRfdGJfYnVmICsgc3RybGVuIChwcmludF90Yl9idWYpLAorCQkgIiogJWQgKiAlNGQgKiAlMmQgKiAgICAqICUyZCAqICAgICogJTJkICpcbiIsCisJCWgsIHRiLT5pbnNlcnRfc2l6ZVtoXSwgdGItPmxudW1baF0sIHRiLT5ybnVtW2hdLCB0Yi0+YmxrbnVtW2hdKTsKKyAgICB9IHdoaWxlICh0Yi0+aW5zZXJ0X3NpemVbaF0pOworCisgICAgc3ByaW50ZiAocHJpbnRfdGJfYnVmICsgc3RybGVuIChwcmludF90Yl9idWYpLCAKKwkgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKKwkgICAgICJGRUIgbGlzdDogIik7CisKKyAgICAvKiBwcmludCBGRUIgbGlzdCAobGlzdCBvZiBidWZmZXJzIGluIGZvcm0gKGJoIChiX2Jsb2NrbnIsIGJfY291bnQpLCB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgbmV3IG5vZGVzKSAqLworICAgIGggPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHRiLT5GRUIpIC8gc2l6ZW9mICh0Yi0+RkVCWzBdKTsgaSArKykKKwlzcHJpbnRmIChwcmludF90Yl9idWYgKyBzdHJsZW4gKHByaW50X3RiX2J1ZiksCisJCSAiJXAgKCVsbHUgJWQpJXMiLCB0Yi0+RkVCW2ldLCB0Yi0+RkVCW2ldID8gKHVuc2lnbmVkIGxvbmcgbG9uZyl0Yi0+RkVCW2ldLT5iX2Jsb2NrbnIgOiAwVUxMLAorCQkgdGItPkZFQltpXSA/IGF0b21pY19yZWFkICgmKHRiLT5GRUJbaV0tPmJfY291bnQpKSA6IDAsIAorCQkgKGkgPT0gc2l6ZW9mICh0Yi0+RkVCKSAvIHNpemVvZiAodGItPkZFQlswXSkgLSAxKSA/ICJcbiIgOiAiLCAiKTsKKworICAgIHNwcmludGYgKHByaW50X3RiX2J1ZiArIHN0cmxlbiAocHJpbnRfdGJfYnVmKSwgCisJICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09IHRoZSBlbmQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKK30KKwordm9pZCBwcmludF9jdXJfdGIgKGNoYXIgKiBtZXMpCit7CisgICAgcHJpbnRrICgiJXNcbiVzIiwgbWVzLCBwcmludF90Yl9idWYpOworfQorCitzdGF0aWMgdm9pZCBjaGVja19sZWFmX2Jsb2NrX2hlYWQgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQoreworICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7CisgIGludCBucjsKKworICBibGtoID0gQl9CTEtfSEVBRCAoYmgpOworICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKKyAgaWYgKCBuciA+IChiaC0+Yl9zaXplIC0gQkxLSF9TSVpFKSAvIElIX1NJWkUpCisgICAgcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJ2cy02MDEwOiBjaGVja19sZWFmX2Jsb2NrX2hlYWQ6IGludmFsaWQgaXRlbSBudW1iZXIgJXoiLCBiaCk7CisgIGlmICggYmxraF9mcmVlX3NwYWNlKGJsa2gpID4gCisgICAgICBiaC0+Yl9zaXplIC0gQkxLSF9TSVpFIC0gSUhfU0laRSAqIG5yICkKKyAgICByZWlzZXJmc19wYW5pYyAoTlVMTCwgInZzLTYwMjA6IGNoZWNrX2xlYWZfYmxvY2tfaGVhZDogaW52YWxpZCBmcmVlIHNwYWNlICV6IiwgYmgpOworICAgIAorfQorCitzdGF0aWMgdm9pZCBjaGVja19pbnRlcm5hbF9ibG9ja19oZWFkIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3sKKyAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7CisgICAgCisgICAgYmxraCA9IEJfQkxLX0hFQUQgKGJoKTsKKyAgICBpZiAoIShCX0xFVkVMIChiaCkgPiBESVNLX0xFQUZfTk9ERV9MRVZFTCAmJiBCX0xFVkVMIChiaCkgPD0gTUFYX0hFSUdIVCkpCisJcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJ2cy02MDI1OiBjaGVja19pbnRlcm5hbF9ibG9ja19oZWFkOiBpbnZhbGlkIGxldmVsICV6IiwgYmgpOworCisgICAgaWYgKEJfTlJfSVRFTVMgKGJoKSA+IChiaC0+Yl9zaXplIC0gQkxLSF9TSVpFKSAvIElIX1NJWkUpCisJcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJ2cy02MDMwOiBjaGVja19pbnRlcm5hbF9ibG9ja19oZWFkOiBpbnZhbGlkIGl0ZW0gbnVtYmVyICV6IiwgYmgpOworCisgICAgaWYgKEJfRlJFRV9TUEFDRSAoYmgpICE9IAorCWJoLT5iX3NpemUgLSBCTEtIX1NJWkUgLSBLRVlfU0laRSAqIEJfTlJfSVRFTVMgKGJoKSAtIERDX1NJWkUgKiAoQl9OUl9JVEVNUyAoYmgpICsgMSkpCisJcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJ2cy02MDQwOiBjaGVja19pbnRlcm5hbF9ibG9ja19oZWFkOiBpbnZhbGlkIGZyZWUgc3BhY2UgJXoiLCBiaCk7CisKK30KKworCit2b2lkIGNoZWNrX2xlYWYgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQoreworICAgIGludCBpOworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKworICAgIGlmICghYmgpCisJcmV0dXJuOworICAgIGNoZWNrX2xlYWZfYmxvY2tfaGVhZCAoYmgpOworICAgIGZvciAoaSA9IDAsIGloID0gQl9OX1BJVEVNX0hFQUQgKGJoLCAwKTsgaSA8IEJfTlJfSVRFTVMgKGJoKTsgaSArKywgaWggKyspCisJb3BfY2hlY2tfaXRlbSAoaWgsIEJfSV9QSVRFTSAoYmgsIGloKSk7Cit9CisKKwordm9pZCBjaGVja19pbnRlcm5hbCAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCit7CisgIGlmICghYmgpCisgICAgcmV0dXJuOworICBjaGVja19pbnRlcm5hbF9ibG9ja19oZWFkIChiaCk7Cit9CisKKwordm9pZCBwcmludF9zdGF0aXN0aWNzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQoreworCisgIC8qCisgIHByaW50ayAoInJlaXNlcmZzX3B1dF9zdXBlcjogc2Vzc2lvbiBzdGF0aXN0aWNzOiBiYWxhbmNlcyAlZCwgZml4X25vZGVzICVkLCBcCitibWFwIHdpdGggc2VhcmNoICVkLCB3aXRob3V0ICVkLCBkaXIyaW5kICVkLCBpbmQyZGlyICVkXG4iLAorCSAgUkVJU0VSRlNfU0IocyktPnNfZG9fYmFsYW5jZSwgUkVJU0VSRlNfU0IocyktPnNfZml4X25vZGVzLAorCSAgUkVJU0VSRlNfU0IocyktPnNfYm1hcHMsIFJFSVNFUkZTX1NCKHMpLT5zX2JtYXBzX3dpdGhvdXRfc2VhcmNoLAorCSAgUkVJU0VSRlNfU0IocyktPnNfZGlyZWN0MmluZGlyZWN0LCBSRUlTRVJGU19TQihzKS0+c19pbmRpcmVjdDJkaXJlY3QpOworICAqLworCit9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9wcm9jZnMuYyBiL2ZzL3JlaXNlcmZzL3Byb2Nmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZWE4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy9wcm9jZnMuYwpAQCAtMCwwICsxLDY2NCBAQAorLyogLSotIGxpbnV4LWMgLSotICovCisKKy8qIGZzL3JlaXNlcmZzL3Byb2Nmcy5jICovCisKKy8qCisgKiBDb3B5cmlnaHQgMjAwMCBieSBIYW5zIFJlaXNlciwgbGljZW5zaW5nIGdvdmVybmVkIGJ5IHJlaXNlcmZzL1JFQURNRQorICovCisKKy8qIHByb2MgaW5mbyBzdXBwb3J0IGEgbGEgb25lIGNyZWF0ZWQgYnkgU2l6aWZAQm90aWsuUlUgZm9yIFBHQyAqLworCisvKiAkSWQ6IHByb2Nmcy5jLHYgMS4xLjguMiAyMDAxLzA3LzE1IDE3OjA4OjQyIGdvZCBFeHAgJCAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzX3NiLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorCisjaWYgZGVmaW5lZCggUkVJU0VSRlNfUFJPQ19JTkZPICkKKworLyoKKyAqIExPQ0tJTkc6CisgKgorICogV2UgcmVseSBvbiBuZXcgQWxleGFuZGVyIFZpcm8ncyBzdXBlci1ibG9jayBsb2NraW5nLgorICoKKyAqLworCitzdGF0aWMgaW50IHNob3dfdmVyc2lvbihzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJY2hhciAqZm9ybWF0OworICAgIAorCWlmICggUkVJU0VSRlNfU0Ioc2IpLT5zX3Byb3BlcnRpZXMgJiAoMSA8PCBSRUlTRVJGU18zXzYpICkgeworCQlmb3JtYXQgPSAiMy42IjsKKwl9IGVsc2UgaWYgKCBSRUlTRVJGU19TQihzYiktPnNfcHJvcGVydGllcyAmICgxIDw8IFJFSVNFUkZTXzNfNSkgKSB7CisJCWZvcm1hdCA9ICIzLjUiOworCX0gZWxzZSB7CisJCWZvcm1hdCA9ICJ1bmtub3duIjsKKwl9CisKKwlzZXFfcHJpbnRmKG0sICIlcyBmb3JtYXRcdHdpdGggY2hlY2tzICVzXG4iLAorCQkJZm9ybWF0LAorI2lmIGRlZmluZWQoIENPTkZJR19SRUlTRVJGU19DSEVDSyApCisJCQkib24iCisjZWxzZQorCQkJIm9mZiIKKyNlbmRpZgorCQkpOworCXJldHVybiAwOworfQorCitpbnQgcmVpc2VyZnNfZ2xvYmFsX3ZlcnNpb25faW5fcHJvYyggY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCQkgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEgKQoreworCSpzdGFydCA9IGJ1ZmZlcjsKKwkqZW9mID0gMTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBTRiggeCApICggciAtPiB4ICkKKyNkZWZpbmUgU0ZQKCB4ICkgU0YoIHNfcHJvY19pbmZvX2RhdGEueCApCisjZGVmaW5lIFNGUEwoIHggKSBTRlAoIHhbIGxldmVsIF0gKQorI2RlZmluZSBTRlBGKCB4ICkgU0ZQKCBzY2FuX2JpdG1hcC54ICkKKyNkZWZpbmUgU0ZQSiggeCApIFNGUCggam91cm5hbC54ICkKKworI2RlZmluZSBEMkMoIHggKSBsZTE2X3RvX2NwdSggeCApCisjZGVmaW5lIEQ0QyggeCApIGxlMzJfdG9fY3B1KCB4ICkKKyNkZWZpbmUgREYoIHggKSBEMkMoIHJzIC0+IHNfdjEueCApCisjZGVmaW5lIERGTCggeCApIEQ0QyggcnMgLT4gc192MS54ICkKKworI2RlZmluZSBvYmplY3RpZF9tYXAoIHMsIHJzICkgKG9sZF9mb3JtYXRfb25seSAocykgPwkJCQlcCisgICAgICAgICAgICAgICAgICAgICAgICAgKF9fdTMyICopKChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2tfdjEgKilycyArIDEpIDoJXAorCQkJIChfX3UzMiAqKShycyArIDEpKQorI2RlZmluZSBNQVAoIGkgKSBENEMoIG9iamVjdGlkX21hcCggc2IsIHJzIClbIGkgXSApCisKKyNkZWZpbmUgREpGKCB4ICkgbGUzMl90b19jcHUoIHJzIC0+IHggKQorI2RlZmluZSBESlYoIHggKSBsZTMyX3RvX2NwdSggc192MSAtPiB4ICkKKyNkZWZpbmUgREpQKCB4ICkgbGUzMl90b19jcHUoIGpwIC0+IHggKSAKKyNkZWZpbmUgSkYoIHggKSAoIHIgLT4gc19qb3VybmFsIC0+IHggKQorCitzdGF0aWMgaW50IHNob3dfc3VwZXIoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCByZWlzZXJmc19zYl9pbmZvICpyID0gUkVJU0VSRlNfU0Ioc2IpOworICAgIAorCXNlcV9wcmludGYobSwJInN0YXRlOiBcdCVzXG4iCisJCQkibW91bnQgb3B0aW9uczogXHQlcyVzJXMlcyVzJXMlcyVzJXMlcyVzXG4iCisJCQkiZ2VuLiBjb3VudGVyOiBcdCVpXG4iCisJCQkic19rbWFsbG9jczogXHQlaVxuIgorCQkJInNfZGlza19yZWFkczogXHQlaVxuIgorCQkJInNfZGlza193cml0ZXM6IFx0JWlcbiIKKwkJCSJzX2ZpeF9ub2RlczogXHQlaVxuIgorCQkJInNfZG9fYmFsYW5jZTogXHQlaVxuIgorCQkJInNfdW5uZWVkZWRfbGVmdF9uZWlnaGJvcjogXHQlaVxuIgorCQkJInNfZ29vZF9zZWFyY2hfYnlfa2V5X3JlYWRhOiBcdCVpXG4iCisJCQkic19ibWFwczogXHQlaVxuIgorCQkJInNfYm1hcHNfd2l0aG91dF9zZWFyY2g6IFx0JWlcbiIKKwkJCSJzX2RpcmVjdDJpbmRpcmVjdDogXHQlaVxuIgorCQkJInNfaW5kaXJlY3QyZGlyZWN0OiBcdCVpXG4iCisJCQkiXG4iCisJCQkibWF4X2hhc2hfY29sbGlzaW9uczogXHQlaVxuIgorCisJCQkiYnJlYWRzOiBcdCVsdVxuIgorCQkJImJyZWFkX21pc3NlczogXHQlbHVcbiIKKworCQkJInNlYXJjaF9ieV9rZXk6IFx0JWx1XG4iCisJCQkic2VhcmNoX2J5X2tleV9mc19jaGFuZ2VkOiBcdCVsdVxuIgorCQkJInNlYXJjaF9ieV9rZXlfcmVzdGFydGVkOiBcdCVsdVxuIgorCQkJCisJCQkiaW5zZXJ0X2l0ZW1fcmVzdGFydGVkOiBcdCVsdVxuIgorCQkJInBhc3RlX2ludG9faXRlbV9yZXN0YXJ0ZWQ6IFx0JWx1XG4iCisJCQkiY3V0X2Zyb21faXRlbV9yZXN0YXJ0ZWQ6IFx0JWx1XG4iCisJCQkiZGVsZXRlX3NvbGlkX2l0ZW1fcmVzdGFydGVkOiBcdCVsdVxuIgorCQkJImRlbGV0ZV9pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKKworCQkJImxlYWtlZF9vaWQ6IFx0JWx1XG4iCisJCQkibGVhdmVzX3JlbW92YWJsZTogXHQlbHVcbiIsCisKKwkJCVNGKCBzX21vdW50X3N0YXRlICkgPT0gUkVJU0VSRlNfVkFMSURfRlMgPworCQkJIlJFSVNFUkZTX1ZBTElEX0ZTIiA6ICJSRUlTRVJGU19FUlJPUl9GUyIsCisJCQlyZWlzZXJmc19yNV9oYXNoKCBzYiApID8gIkZPUkNFX1I1ICIgOiAiIiwKKwkJCXJlaXNlcmZzX3J1cGFzb3ZfaGFzaCggc2IgKSA/ICJGT1JDRV9SVVBBU09WICIgOiAiIiwKKwkJCXJlaXNlcmZzX3RlYV9oYXNoKCBzYiApID8gIkZPUkNFX1RFQSAiIDogIiIsCisJCQlyZWlzZXJmc19oYXNoX2RldGVjdCggc2IgKSA/ICJERVRFQ1RfSEFTSCAiIDogIiIsCisJCQlyZWlzZXJmc19ub19ib3JkZXIoIHNiICkgPyAiTk9fQk9SREVSICIgOiAiQk9SREVSICIsCisJCQlyZWlzZXJmc19ub191bmhhc2hlZF9yZWxvY2F0aW9uKCBzYiApID8gIk5PX1VOSEFTSEVEX1JFTE9DQVRJT04gIiA6ICIiLAorCQkJcmVpc2VyZnNfaGFzaGVkX3JlbG9jYXRpb24oIHNiICkgPyAiVU5IQVNIRURfUkVMT0NBVElPTiAiIDogIiIsCisJCQlyZWlzZXJmc190ZXN0NCggc2IgKSA/ICJURVNUNCAiIDogIiIsCisJCQloYXZlX2xhcmdlX3RhaWxzKCBzYiApID8gIlRBSUxTICIgOiBoYXZlX3NtYWxsX3RhaWxzKHNiKT8iU01BTExfVEFJTFMgIjoiTk9fVEFJTFMgIiwKKwkJCXJlcGxheV9vbmx5KCBzYiApID8gIlJFUExBWV9PTkxZICIgOiAiIiwKKwkJCWNvbnZlcnRfcmVpc2VyZnMoIHNiICkgPyAiQ09OViAiIDogIiIsCisKKwkJCWF0b21pY19yZWFkKCAmciAtPiBzX2dlbmVyYXRpb25fY291bnRlciApLAorCQkJU0YoIHNfa21hbGxvY3MgKSwKKwkJCVNGKCBzX2Rpc2tfcmVhZHMgKSwKKwkJCVNGKCBzX2Rpc2tfd3JpdGVzICksCisJCQlTRiggc19maXhfbm9kZXMgKSwKKwkJCVNGKCBzX2RvX2JhbGFuY2UgKSwKKwkJCVNGKCBzX3VubmVlZGVkX2xlZnRfbmVpZ2hib3IgKSwKKwkJCVNGKCBzX2dvb2Rfc2VhcmNoX2J5X2tleV9yZWFkYSApLAorCQkJU0YoIHNfYm1hcHMgKSwKKwkJCVNGKCBzX2JtYXBzX3dpdGhvdXRfc2VhcmNoICksCisJCQlTRiggc19kaXJlY3QyaW5kaXJlY3QgKSwKKwkJCVNGKCBzX2luZGlyZWN0MmRpcmVjdCApLAorCQkJU0ZQKCBtYXhfaGFzaF9jb2xsaXNpb25zICksCisJCQlTRlAoIGJyZWFkcyApLAorCQkJU0ZQKCBicmVhZF9taXNzICksCisJCQlTRlAoIHNlYXJjaF9ieV9rZXkgKSwKKwkJCVNGUCggc2VhcmNoX2J5X2tleV9mc19jaGFuZ2VkICksCisJCQlTRlAoIHNlYXJjaF9ieV9rZXlfcmVzdGFydGVkICksCisKKwkJCVNGUCggaW5zZXJ0X2l0ZW1fcmVzdGFydGVkICksCisJCQlTRlAoIHBhc3RlX2ludG9faXRlbV9yZXN0YXJ0ZWQgKSwKKwkJCVNGUCggY3V0X2Zyb21faXRlbV9yZXN0YXJ0ZWQgKSwKKwkJCVNGUCggZGVsZXRlX3NvbGlkX2l0ZW1fcmVzdGFydGVkICksCisJCQlTRlAoIGRlbGV0ZV9pdGVtX3Jlc3RhcnRlZCApLAorCisJCQlTRlAoIGxlYWtlZF9vaWQgKSwKKwkJCVNGUCggbGVhdmVzX3JlbW92YWJsZSApICk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaG93X3Blcl9sZXZlbChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnIgPSBSRUlTRVJGU19TQihzYik7CisJaW50IGxldmVsOworCisJc2VxX3ByaW50ZihtLAkibGV2ZWxcdCIKKwkJCSIgICAgIGJhbGFuY2VzIgorCQkJIiBbc2JrOiAgcmVhZHMiCisJCQkiICAgZnNfY2hhbmdlZCIKKwkJCSIgICByZXN0YXJ0ZWRdIgorCQkJIiAgIGZyZWUgc3BhY2UiCisJCQkiICAgICAgICBpdGVtcyIKKwkJCSIgICBjYW5fcmVtb3ZlIgorCQkJIiAgICAgICAgIGxudW0iCisJCQkiICAgICAgICAgcm51bSIKKwkJCSIgICAgICAgbGJ5dGVzIgorCQkJIiAgICAgICByYnl0ZXMiCisJCQkiICAgICBnZXRfbmVpZyIKKwkJCSIgZ2V0X25laWdfcmVzIgorCQkJIiAgbmVlZF9sX25laWciCisJCQkiICBuZWVkX3JfbmVpZyIKKwkJCSJcbiIKKwkJCQorCQkpOworCisJZm9yKCBsZXZlbCA9IDAgOyBsZXZlbCA8IE1BWF9IRUlHSFQgOyArKyBsZXZlbCApIHsKKwkJc2VxX3ByaW50ZihtLAkiJWlcdCIKKwkJCQkiICUxMmx1IgorCQkJCSIgJTEybHUiCisJCQkJIiAlMTJsdSIKKwkJCQkiICUxMmx1IgorCQkJCSIgJTEybHUiCisJCQkJIiAlMTJsdSIKKwkJCQkiICUxMmx1IgorCQkJCSIgJTEybGkiCisJCQkJIiAlMTJsaSIKKwkJCQkiICUxMmxpIgorCQkJCSIgJTEybGkiCisJCQkJIiAlMTJsdSIKKwkJCQkiICUxMmx1IgorCQkJCSIgJTEybHUiCisJCQkJIiAlMTJsdSIKKwkJCQkiXG4iLAorCQkJCWxldmVsLCAKKwkJCQlTRlBMKCBiYWxhbmNlX2F0ICksCisJCQkJU0ZQTCggc2JrX3JlYWRfYXQgKSwKKwkJCQlTRlBMKCBzYmtfZnNfY2hhbmdlZCApLAorCQkJCVNGUEwoIHNia19yZXN0YXJ0ZWQgKSwKKwkJCQlTRlBMKCBmcmVlX2F0ICksCisJCQkJU0ZQTCggaXRlbXNfYXQgKSwKKwkJCQlTRlBMKCBjYW5fbm9kZV9iZV9yZW1vdmVkICksCisJCQkJU0ZQTCggbG51bSApLAorCQkJCVNGUEwoIHJudW0gKSwKKwkJCQlTRlBMKCBsYnl0ZXMgKSwKKwkJCQlTRlBMKCByYnl0ZXMgKSwKKwkJCQlTRlBMKCBnZXRfbmVpZ2hib3JzICksCisJCQkJU0ZQTCggZ2V0X25laWdoYm9yc19yZXN0YXJ0ICksCisJCQkJU0ZQTCggbmVlZF9sX25laWdoYm9yICksCisJCQkJU0ZQTCggbmVlZF9yX25laWdoYm9yICkKKwkJCSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNob3dfYml0bWFwKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyAqciA9IFJFSVNFUkZTX1NCKHNiKTsKKworCXNlcV9wcmludGYobSwJImZyZWVfYmxvY2s6ICVsdVxuIgorCQkJIiAgc2Nhbl9iaXRtYXA6IgorCQkJIiAgICAgICAgICB3YWl0IgorCQkJIiAgICAgICAgICBibWFwIgorCQkJIiAgICAgICAgIHJldHJ5IgorCQkJIiAgICAgICAgc3RvbGVuIgorCQkJIiAgam91cm5hbF9oaW50IgorCQkJImpvdXJuYWxfbm9oaW50IgorCQkJIlxuIgorCQkJIiAlMTRsdSIKKwkJCSIgJTE0bHUiCisJCQkiICUxNGx1IgorCQkJIiAlMTRsdSIKKwkJCSIgJTE0bHUiCisJCQkiICUxNGx1IgorCQkJIiAlMTRsdSIKKwkJCSJcbiIsCisJCQlTRlAoIGZyZWVfYmxvY2sgKSwKKwkJCVNGUEYoIGNhbGwgKSwgCisJCQlTRlBGKCB3YWl0ICksIAorCQkJU0ZQRiggYm1hcCApLAorCQkJU0ZQRiggcmV0cnkgKSwKKwkJCVNGUEYoIHN0b2xlbiApLAorCQkJU0ZQRiggaW5fam91cm5hbF9oaW50ICksCisJCQlTRlBGKCBpbl9qb3VybmFsX25vaGludCApICk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaG93X29uX2Rpc2tfc3VwZXIoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCByZWlzZXJmc19zYl9pbmZvICpzYl9pbmZvID0gUkVJU0VSRlNfU0Ioc2IpOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnMgPSBzYl9pbmZvIC0+IHNfcnM7CisJaW50IGhhc2hfY29kZSA9IERGTCggc19oYXNoX2Z1bmN0aW9uX2NvZGUgKTsKKwlfX3UzMiBmbGFncyA9IERKRiggc19mbGFncyApOworCisJc2VxX3ByaW50ZihtLAkiYmxvY2tfY291bnQ6IFx0JWlcbiIKKwkJCSJmcmVlX2Jsb2NrczogXHQlaVxuIgorCQkJInJvb3RfYmxvY2s6IFx0JWlcbiIKKwkJCSJibG9ja3NpemU6IFx0JWlcbiIKKwkJCSJvaWRfbWF4c2l6ZTogXHQlaVxuIgorCQkJIm9pZF9jdXJzaXplOiBcdCVpXG4iCisJCQkidW1vdW50X3N0YXRlOiBcdCVpXG4iCisJCQkibWFnaWM6IFx0JTEwLjEwc1xuIgorCQkJImZzX3N0YXRlOiBcdCVpXG4iCisJCQkiaGFzaDogXHQlc1xuIgorCQkJInRyZWVfaGVpZ2h0OiBcdCVpXG4iCisJCQkiYm1hcF9ucjogXHQlaVxuIgorCQkJInZlcnNpb246IFx0JWlcbiIKKwkJCSJmbGFnczogXHQleFslc11cbiIKKwkJCSJyZXNlcnZlZF9mb3Jfam91cm5hbDogXHQlaVxuIiwKKworCQkJREZMKCBzX2Jsb2NrX2NvdW50ICksCisJCQlERkwoIHNfZnJlZV9ibG9ja3MgKSwKKwkJCURGTCggc19yb290X2Jsb2NrICksCisJCQlERiggc19ibG9ja3NpemUgKSwKKwkJCURGKCBzX29pZF9tYXhzaXplICksCisJCQlERiggc19vaWRfY3Vyc2l6ZSApLAorCQkJREYoIHNfdW1vdW50X3N0YXRlICksCisJCQlycyAtPiBzX3YxLnNfbWFnaWMsCisJCQlERiggc19mc19zdGF0ZSApLAorCQkJaGFzaF9jb2RlID09IFRFQV9IQVNIID8gInRlYSIgOgorCQkJKCBoYXNoX2NvZGUgPT0gWVVSQV9IQVNIICkgPyAicnVwYXNvdiIgOgorCQkJKCBoYXNoX2NvZGUgPT0gUjVfSEFTSCApID8gInI1IiA6CisJCQkoIGhhc2hfY29kZSA9PSBVTlNFVF9IQVNIICkgPyAidW5zZXQiIDogInVua25vd24iLAorCQkJREYoIHNfdHJlZV9oZWlnaHQgKSwKKwkJCURGKCBzX2JtYXBfbnIgKSwKKwkJCURGKCBzX3ZlcnNpb24gKSwKKwkJCWZsYWdzLAorCQkJKCBmbGFncyAmIHJlaXNlcmZzX2F0dHJzX2NsZWFyZWQgKQorCQkJPyAiYXR0cnNfY2xlYXJlZCIgOiAiIiwKKwkJCURGIChzX3Jlc2VydmVkX2Zvcl9qb3VybmFsKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaG93X29pZG1hcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnNiX2luZm8gPSBSRUlTRVJGU19TQihzYik7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycyA9IHNiX2luZm8gLT4gc19yczsKKwl1bnNpZ25lZCBpbnQgbWFwc2l6ZSA9IGxlMTZfdG9fY3B1KCBycyAtPiBzX3YxLnNfb2lkX2N1cnNpemUgKTsKKwl1bnNpZ25lZCBsb25nIHRvdGFsX3VzZWQgPSAwOworCWludCBpOworCisJZm9yKCBpID0gMCA7IGkgPCBtYXBzaXplIDsgKytpICkgeworCQlfX3UzMiByaWdodDsKKworCQlyaWdodCA9ICggaSA9PSBtYXBzaXplIC0gMSApID8gTUFYX0tFWV9PQkpFQ1RJRCA6IE1BUCggaSArIDEgKTsKKwkJc2VxX3ByaW50ZihtLCAiJXM6IFsgJXggLi4gJXggKVxuIiwKKwkJCQkoIGkgJiAxICkgPyAiZnJlZSIgOiAidXNlZCIsIE1BUCggaSApLCByaWdodCApOworCQlpZiggISAoIGkgJiAxICkgKSB7CisJCQl0b3RhbF91c2VkICs9IHJpZ2h0IC0gTUFQKCBpICk7CisJCX0KKwl9CisjaWYgZGVmaW5lZCggUkVJU0VSRlNfVVNFX09JRE1BUEYgKQorCWlmKCBzYl9pbmZvIC0+IG9pZG1hcC51c2VfZmlsZSAmJiAoIHNiX2luZm8gLT4gb2lkbWFwLm1hcGYgIT0gTlVMTCApICkgeworCQlsb2ZmX3Qgc2l6ZSA9IHNiX2luZm8tPm9pZG1hcC5tYXBmLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zaXplOworCQl0b3RhbF91c2VkICs9IHNpemUgLyBzaXplb2YoIHJlaXNlcmZzX29pZGludGVydmFsX2RfdCApOworCX0KKyNlbmRpZgorCXNlcV9wcmludGYobSwgInRvdGFsOiBcdCVpIFslaS8laV0gdXNlZDogJWx1IFtleGFjdF1cbiIsIAorCQkJbWFwc2l6ZSwgCisJCQltYXBzaXplLCBsZTE2X3RvX2NwdSggcnMgLT4gc192MS5zX29pZF9tYXhzaXplICksCisJCQl0b3RhbF91c2VkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaG93X2pvdXJuYWwoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCByZWlzZXJmc19zYl9pbmZvICpyID0gUkVJU0VSRlNfU0Ioc2IpOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnMgPSByIC0+IHNfcnM7CisJc3RydWN0IGpvdXJuYWxfcGFyYW1zICpqcCA9ICZycy0+c192MS5zX2pvdXJuYWw7CisJY2hhciBiW0JERVZOQU1FX1NJWkVdOworICAgIAorCisJc2VxX3ByaW50ZihtLAkgLyogb24tZGlzayBmaWVsZHMgKi8KKyAJCQkianBfam91cm5hbF8xc3RfYmxvY2s6IFx0JWlcbiIKKyAJCQkianBfam91cm5hbF9kZXY6IFx0JXNbJXhdXG4iCisgCQkJImpwX2pvdXJuYWxfc2l6ZTogXHQlaVxuIgorIAkJCSJqcF9qb3VybmFsX3RyYW5zX21heDogXHQlaVxuIgorIAkJCSJqcF9qb3VybmFsX21hZ2ljOiBcdCVpXG4iCisgCQkJImpwX2pvdXJuYWxfbWF4X2JhdGNoOiBcdCVpXG4iCisgCQkJImpwX2pvdXJuYWxfbWF4X2NvbW1pdF9hZ2U6IFx0JWlcbiIKKyAJCQkianBfam91cm5hbF9tYXhfdHJhbnNfYWdlOiBcdCVpXG4iCisJCQkvKiBpbmNvcmUgZmllbGRzICovCisJCQkial8xc3RfcmVzZXJ2ZWRfYmxvY2s6IFx0JWlcbiIJICAKKwkJCSJqX3N0YXRlOiBcdCVsaVxuIgkJCQorCQkJImpfdHJhbnNfaWQ6IFx0JWx1XG4iCisJCQkial9tb3VudF9pZDogXHQlbHVcbiIKKwkJCSJqX3N0YXJ0OiBcdCVsdVxuIgorCQkJImpfbGVuOiBcdCVsdVxuIgorCQkJImpfbGVuX2FsbG9jOiBcdCVsdVxuIgorCQkJImpfd2NvdW50OiBcdCVpXG4iCisJCQkial9iY291bnQ6IFx0JWx1XG4iCisJCQkial9maXJzdF91bmZsdXNoZWRfb2Zmc2V0OiBcdCVsdVxuIgorCQkJImpfbGFzdF9mbHVzaF90cmFuc19pZDogXHQlbHVcbiIKKwkJCSJqX3RyYW5zX3N0YXJ0X3RpbWU6IFx0JWxpXG4iCisJCQkial9saXN0X2JpdG1hcF9pbmRleDogXHQlaVxuIgorCQkJImpfbXVzdF93YWl0OiBcdCVpXG4iCisJCQkial9uZXh0X2Z1bGxfZmx1c2g6IFx0JWlcbiIKKwkJCSJqX25leHRfYXN5bmNfZmx1c2g6IFx0JWlcbiIKKwkJCSJqX2Nub2RlX3VzZWQ6IFx0JWlcbiIKKwkJCSJqX2Nub2RlX2ZyZWU6IFx0JWlcbiIKKwkJCSJcbiIKKwkJCS8qIHJlaXNlcmZzX3Byb2NfaW5mb19kYXRhX3Quam91cm5hbCBmaWVsZHMgKi8KKwkJCSJpbl9qb3VybmFsOiBcdCUxMmx1XG4iCisJCQkiaW5fam91cm5hbF9iaXRtYXA6IFx0JTEybHVcbiIKKwkJCSJpbl9qb3VybmFsX3JldXNhYmxlOiBcdCUxMmx1XG4iCisJCQkibG9ja19qb3VybmFsOiBcdCUxMmx1XG4iCisJCQkibG9ja19qb3VybmFsX3dhaXQ6IFx0JTEybHVcbiIKKwkJCSJqb3VybmFsX2JlZ2luOiBcdCUxMmx1XG4iCisJCQkiam91cm5hbF9yZWxvY2tfd3JpdGVyczogXHQlMTJsdVxuIgorCQkJImpvdXJuYWxfcmVsb2NrX3djb3VudDogXHQlMTJsdVxuIgorCQkJIm1hcmtfZGlydHk6IFx0JTEybHVcbiIKKwkJCSJtYXJrX2RpcnR5X2FscmVhZHk6IFx0JTEybHVcbiIKKwkJCSJtYXJrX2RpcnR5X25vdGpvdXJuYWw6IFx0JTEybHVcbiIKKwkJCSJyZXN0b3JlX3ByZXBhcmVkOiBcdCUxMmx1XG4iCisJCQkicHJlcGFyZTogXHQlMTJsdVxuIgorCQkJInByZXBhcmVfcmV0cnk6IFx0JTEybHVcbiIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgIERKUCgganBfam91cm5hbF8xc3RfYmxvY2sgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJkZXZuYW1lKFNCX0pPVVJOQUwoc2IpLT5qX2Rldl9iZCwgYiksCisgICAgICAgICAgICAgICAgICAgICAgICBESlAoIGpwX2pvdXJuYWxfZGV2ICksCisgICAgICAgICAgICAgICAgICAgICAgICBESlAoIGpwX2pvdXJuYWxfc2l6ZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgREpQKCBqcF9qb3VybmFsX3RyYW5zX21heCApLAorICAgICAgICAgICAgICAgICAgICAgICAgREpQKCBqcF9qb3VybmFsX21hZ2ljICksCisgICAgICAgICAgICAgICAgICAgICAgICBESlAoIGpwX2pvdXJuYWxfbWF4X2JhdGNoICksCisJCQlTQl9KT1VSTkFMKHNiKS0+al9tYXhfY29tbWl0X2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERKUCgganBfam91cm5hbF9tYXhfdHJhbnNfYWdlICksCisKKwkJCUpGKCBqXzFzdF9yZXNlcnZlZF9ibG9jayApLAkJCQorCQkJSkYoIGpfc3RhdGUgKSwJCQkKKwkJCUpGKCBqX3RyYW5zX2lkICksCisJCQlKRiggal9tb3VudF9pZCApLAorCQkJSkYoIGpfc3RhcnQgKSwKKwkJCUpGKCBqX2xlbiApLAorCQkJSkYoIGpfbGVuX2FsbG9jICksCisJCQlhdG9taWNfcmVhZCggJiByIC0+IHNfam91cm5hbCAtPiBqX3djb3VudCApLAorCQkJSkYoIGpfYmNvdW50ICksCisJCQlKRiggal9maXJzdF91bmZsdXNoZWRfb2Zmc2V0ICksCisJCQlKRiggal9sYXN0X2ZsdXNoX3RyYW5zX2lkICksCisJCQlKRiggal90cmFuc19zdGFydF90aW1lICksCisJCQlKRiggal9saXN0X2JpdG1hcF9pbmRleCApLAorCQkJSkYoIGpfbXVzdF93YWl0ICksCisJCQlKRiggal9uZXh0X2Z1bGxfZmx1c2ggKSwKKwkJCUpGKCBqX25leHRfYXN5bmNfZmx1c2ggKSwKKwkJCUpGKCBqX2Nub2RlX3VzZWQgKSwKKwkJCUpGKCBqX2Nub2RlX2ZyZWUgKSwKKworCQkJU0ZQSiggaW5fam91cm5hbCApLAorCQkJU0ZQSiggaW5fam91cm5hbF9iaXRtYXAgKSwKKwkJCVNGUEooIGluX2pvdXJuYWxfcmV1c2FibGUgKSwKKwkJCVNGUEooIGxvY2tfam91cm5hbCApLAorCQkJU0ZQSiggbG9ja19qb3VybmFsX3dhaXQgKSwKKwkJCVNGUEooIGpvdXJuYWxfYmVpbmcgKSwKKwkJCVNGUEooIGpvdXJuYWxfcmVsb2NrX3dyaXRlcnMgKSwKKwkJCVNGUEooIGpvdXJuYWxfcmVsb2NrX3djb3VudCApLAorCQkJU0ZQSiggbWFya19kaXJ0eSApLAorCQkJU0ZQSiggbWFya19kaXJ0eV9hbHJlYWR5ICksCisJCQlTRlBKKCBtYXJrX2RpcnR5X25vdGpvdXJuYWwgKSwKKwkJCVNGUEooIHJlc3RvcmVfcHJlcGFyZWQgKSwKKwkJCVNGUEooIHByZXBhcmUgKSwKKwkJCVNGUEooIHByZXBhcmVfcmV0cnkgKQorCQkpOworCXJldHVybiAwOworfQorCisvKiBpdGVyYXRvciAqLworc3RhdGljIGludCB0ZXN0X3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGRhdGEgPT0gc2I7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKK3N0YXRpYyB2b2lkICpyX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSA9IG0tPnByaXZhdGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gZGUtPnBhcmVudC0+ZGF0YTsKKwlsb2ZmX3QgbCA9ICpwb3M7CisKKwlpZiAobCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoSVNfRVJSKHNnZXQoJnJlaXNlcmZzX2ZzX3R5cGUsIHRlc3Rfc2IsIHNldF9zYiwgcykpKQorCQlyZXR1cm4gTlVMTDsKKworCXVwX3dyaXRlKCZzLT5zX3Vtb3VudCk7CisKKwlpZiAoZGUtPmRlbGV0ZWQpIHsKKwkJZGVhY3RpdmF0ZV9zdXBlcihzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyB2b2lkICpyX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwkrKypwb3M7CisJaWYgKHYpCisJCWRlYWN0aXZhdGVfc3VwZXIodik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHJfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJaWYgKHYpCisJCWRlYWN0aXZhdGVfc3VwZXIodik7Cit9CisKK3N0YXRpYyBpbnQgcl9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlID0gbS0+cHJpdmF0ZTsKKwlpbnQgKCpzaG93KShzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICopID0gZGUtPmRhdGE7CisJcmV0dXJuIHNob3cobSwgdik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcl9vcHMgPSB7CisJLnN0YXJ0ID0gcl9zdGFydCwKKwkubmV4dCA9IHJfbmV4dCwKKwkuc3RvcCA9IHJfc3RvcCwKKwkuc2hvdyA9IHJfc2hvdywKK307CisKK3N0YXRpYyBpbnQgcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCByZXQgPSBzZXFfb3BlbihmaWxlLCAmcl9vcHMpOworCisJaWYgKCFyZXQpIHsKKwkJc3RydWN0IHNlcV9maWxlICptID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQltLT5wcml2YXRlID0gUERFKGlub2RlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcl9maWxlX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gcl9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2luZm9fcm9vdCA9IE5VTEw7CitzdGF0aWMgY29uc3QgY2hhciBwcm9jX2luZm9fcm9vdF9uYW1lW10gPSAiZnMvcmVpc2VyZnMiOworCitzdGF0aWMgdm9pZCBhZGRfZmlsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpuYW1lLAorCWludCAoKmZ1bmMpKHN0cnVjdCBzZXFfZmlsZSAqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKikpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZTsKKwlkZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KG5hbWUsIDAsIFJFSVNFUkZTX1NCKHNiKS0+cHJvY2Rpcik7CisJaWYgKGRlKSB7CisJCWRlLT5kYXRhID0gZnVuYzsKKwkJZGUtPnByb2NfZm9wcyA9ICZyX2ZpbGVfb3BlcmF0aW9uczsKKwl9Cit9CisKK2ludCByZWlzZXJmc19wcm9jX2luZm9faW5pdCggc3RydWN0IHN1cGVyX2Jsb2NrICpzYiApCit7CisJc3Bpbl9sb2NrX2luaXQoICYgX19QSU5GTyggc2IgKS5sb2NrICk7CisJUkVJU0VSRlNfU0Ioc2IpLT5wcm9jZGlyID0gcHJvY19ta2RpcihyZWlzZXJmc19iZGV2bmFtZSAoc2IpLCBwcm9jX2luZm9fcm9vdCk7CisJaWYoIFJFSVNFUkZTX1NCKHNiKS0+cHJvY2RpciApIHsKKwkJUkVJU0VSRlNfU0Ioc2IpLT5wcm9jZGlyLT5vd25lciA9IFRISVNfTU9EVUxFOworCQlSRUlTRVJGU19TQihzYiktPnByb2NkaXItPmRhdGEgPSBzYjsKKwkJYWRkX2ZpbGUoc2IsICJ2ZXJzaW9uIiwgc2hvd192ZXJzaW9uKTsKKwkJYWRkX2ZpbGUoc2IsICJzdXBlciIsIHNob3dfc3VwZXIpOworCQlhZGRfZmlsZShzYiwgInBlci1sZXZlbCIsIHNob3dfcGVyX2xldmVsKTsKKwkJYWRkX2ZpbGUoc2IsICJiaXRtYXAiLCBzaG93X2JpdG1hcCk7CisJCWFkZF9maWxlKHNiLCAib24tZGlzay1zdXBlciIsIHNob3dfb25fZGlza19zdXBlcik7CisJCWFkZF9maWxlKHNiLCAib2lkbWFwIiwgc2hvd19vaWRtYXApOworCQlhZGRfZmlsZShzYiwgImpvdXJuYWwiLCBzaG93X2pvdXJuYWwpOworCQlyZXR1cm4gMDsKKwl9CisJcmVpc2VyZnNfd2FybmluZyhzYiwgInJlaXNlcmZzOiBjYW5ub3QgY3JlYXRlIC9wcm9jLyVzLyVzIiwKKwkJCSBwcm9jX2luZm9fcm9vdF9uYW1lLCByZWlzZXJmc19iZGV2bmFtZSAoc2IpICk7CisJcmV0dXJuIDE7Cit9CisKK2ludCByZWlzZXJmc19wcm9jX2luZm9fZG9uZSggc3RydWN0IHN1cGVyX2Jsb2NrICpzYiApCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSA9IFJFSVNFUkZTX1NCKHNiKS0+cHJvY2RpcjsKKwlpZiAoZGUpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImpvdXJuYWwiLCBkZSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJvaWRtYXAiLCBkZSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJvbi1kaXNrLXN1cGVyIiwgZGUpOworCQlyZW1vdmVfcHJvY19lbnRyeSgiYml0bWFwIiwgZGUpOworCQlyZW1vdmVfcHJvY19lbnRyeSgicGVyLWxldmVsIiwgZGUpOworCQlyZW1vdmVfcHJvY19lbnRyeSgic3VwZXIiLCBkZSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJ2ZXJzaW9uIiwgZGUpOworCX0KKwlzcGluX2xvY2soICYgX19QSU5GTyggc2IgKS5sb2NrICk7CisJX19QSU5GTyggc2IgKS5leGl0aW5nID0gMTsKKwlzcGluX3VubG9jayggJiBfX1BJTkZPKCBzYiApLmxvY2sgKTsKKwlpZiAoIHByb2NfaW5mb19yb290ICkgeworCQlyZW1vdmVfcHJvY19lbnRyeSggcmVpc2VyZnNfYmRldm5hbWUgKHNiKSwgcHJvY19pbmZvX3Jvb3QgKTsKKwkJUkVJU0VSRlNfU0Ioc2IpLT5wcm9jZGlyID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcmVpc2VyZnNfcHJvY19yZWdpc3Rlcl9nbG9iYWwoIGNoYXIgKm5hbWUsIAorCQkJCQkJICAgICAgcmVhZF9wcm9jX3QgKmZ1bmMgKQoreworCXJldHVybiAoIHByb2NfaW5mb19yb290ICkgPyBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCBuYW1lLCAwLCAKKwkJCQkJCQkgICAgcHJvY19pbmZvX3Jvb3QsIAorCQkJCQkJCSAgICBmdW5jLCBOVUxMICkgOiBOVUxMOworfQorCit2b2lkIHJlaXNlcmZzX3Byb2NfdW5yZWdpc3Rlcl9nbG9iYWwoIGNvbnN0IGNoYXIgKm5hbWUgKQoreworCXJlbW92ZV9wcm9jX2VudHJ5KCBuYW1lLCBwcm9jX2luZm9fcm9vdCApOworfQorCitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9pbml0KCB2b2lkICkKK3sKKwlpZiggcHJvY19pbmZvX3Jvb3QgPT0gTlVMTCApIHsKKwkJcHJvY19pbmZvX3Jvb3QgPSBwcm9jX21rZGlyKHByb2NfaW5mb19yb290X25hbWUsIE5VTEwpOworCQlpZiggcHJvY19pbmZvX3Jvb3QgKSB7CisJCQlwcm9jX2luZm9fcm9vdCAtPiBvd25lciA9IFRISVNfTU9EVUxFOworCQl9IGVsc2UgeworCQkJcmVpc2VyZnNfd2FybmluZyAoTlVMTCwKKwkJCQkJICAicmVpc2VyZnM6IGNhbm5vdCBjcmVhdGUgL3Byb2MvJXMiLAorCQkJCQkgIHByb2NfaW5mb19yb290X25hbWUgKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9kb25lKCB2b2lkICkKK3sKKwlpZiAoIHByb2NfaW5mb19yb290ICE9IE5VTEwgKSB7CisJCXByb2NfaW5mb19yb290ID0gTlVMTDsKKwkJcmVtb3ZlX3Byb2NfZW50cnkocHJvY19pbmZvX3Jvb3RfbmFtZSwgTlVMTCk7CisJfQorCXJldHVybiAwOworfQorCisvKiBSRUlTRVJGU19QUk9DX0lORk8gKi8KKyNlbHNlCisKK2ludCByZWlzZXJmc19wcm9jX2luZm9faW5pdCggc3RydWN0IHN1cGVyX2Jsb2NrICpzYiApIHsgcmV0dXJuIDA7IH0KK2ludCByZWlzZXJmc19wcm9jX2luZm9fZG9uZSggc3RydWN0IHN1cGVyX2Jsb2NrICpzYiApIHsgcmV0dXJuIDA7IH0KKworc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyZWlzZXJmc19wcm9jX3JlZ2lzdGVyX2dsb2JhbCggY2hhciAqbmFtZSwgCisJCQkJCQkgICAgICByZWFkX3Byb2NfdCAqZnVuYyApCit7IHJldHVybiBOVUxMOyB9CisKK3ZvaWQgcmVpc2VyZnNfcHJvY191bnJlZ2lzdGVyX2dsb2JhbCggY29uc3QgY2hhciAqbmFtZSApIHs7fQorCitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9pbml0KCB2b2lkICkgeyByZXR1cm4gMDsgfQoraW50IHJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfZG9uZSggdm9pZCApIHsgcmV0dXJuIDA7IH0KKworaW50IHJlaXNlcmZzX2dsb2JhbF92ZXJzaW9uX2luX3Byb2MoIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCAKKwkJCQkgICAgIG9mZl90IG9mZnNldCwKKwkJCQkgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEgKQoreyByZXR1cm4gMDsgfQorCisvKiBSRUlTRVJGU19QUk9DX0lORk8gKi8KKyNlbmRpZgorCisvKgorICogJExvZzogcHJvY2ZzLmMsdiAkCisgKiBSZXZpc2lvbiAxLjEuOC4yICAyMDAxLzA3LzE1IDE3OjA4OjQyICBnb2QKKyAqICAuIHVzZSBnZXRfc3VwZXIoKSBpbiBwcm9jZnMuYworICogIC4gcmVtb3ZlIHJlbW92ZV9zYXZlX2xpbmsoKSBmcm9tIHJlaXNlcmZzX2RvX3RydW5jYXRlKCkKKyAqCisgKiBJIGFjY2VwdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhlIExlZ2FsIEFncmVlbWVudAorICogKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm5hbWVzeXMuY29tL2xlZ2FsZXNlLmh0bWwpCisgKgorICogUmV2aXNpb24gMS4xLjguMSAgMjAwMS8wNy8xMSAxNjo0ODo1MCAgZ29kCisgKiBwcm9jIGluZm8gc3VwcG9ydAorICoKKyAqIEkgYWNjZXB0IHRlcm1zIGFuZCBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGUgTGVnYWwgQWdyZWVtZW50CisgKiAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubmFtZXN5cy5jb20vbGVnYWxlc2UuaHRtbCkKKyAqCisgKi8KKworLyogCisgKiBNYWtlIExpbnVzIGhhcHB5LgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1pbmRlbnRhdGlvbi1zdHlsZTogIksmUiIKKyAqIG1vZGUtbmFtZTogIkxDIgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9yZXNpemUuYyBiL2ZzL3JlaXNlcmZzL3Jlc2l6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MDAxMjAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy9yZXNpemUuYwpAQCAtMCwwICsxLDE4MiBAQAorLyogCisgKiBDb3B5cmlnaHQgMjAwMCBieSBIYW5zIFJlaXNlciwgbGljZW5zaW5nIGdvdmVybmVkIGJ5IHJlaXNlcmZzL1JFQURNRQorICovCisgCisvKiAKKyAqIFdyaXR0ZW4gYnkgQWxleGFuZGVyIFphcm9jaGVudGNldi4KKyAqCisgKiBUaGUga2VybmVsIHBhcnQgb2YgdGhlIChvbi1saW5lKSByZWlzZXJmcyByZXNpemVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnNfc2IuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCitpbnQgcmVpc2VyZnNfcmVzaXplIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCB1bnNpZ25lZCBsb25nIGJsb2NrX2NvdW50X25ldykKK3sKKyAgICAgICAgaW50IGVyciA9IDA7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogc2I7CisgICAgICAgIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbyAqYml0bWFwOworCXN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbyAqb2xkX2JpdG1hcCA9IFNCX0FQX0JJVE1BUChzKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCXVuc2lnbmVkIGludCBibWFwX25yX25ldywgYm1hcF9ucjsKKwl1bnNpZ25lZCBpbnQgYmxvY2tfcl9uZXcsIGJsb2NrX3I7CisJCisJc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICogamI7CisJc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwIGpiaXRtYXBbSk9VUk5BTF9OVU1fQklUTUFQU107CisJCisJdW5zaWduZWQgbG9uZyBpbnQgYmxvY2tfY291bnQsIGZyZWVfYmxvY2tzOworCWludCBpOworCWludCBjb3B5X3NpemUgOworCisJc2IgPSBTQl9ESVNLX1NVUEVSX0JMT0NLKHMpOworCisJaWYgKFNCX0JMT0NLX0NPVU5UKHMpID49IGJsb2NrX2NvdW50X25ldykgeworCQlwcmludGsoImNhblwndCBzaHJpbmsgZmlsZXN5c3RlbSBvbi1saW5lXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogY2hlY2sgdGhlIGRldmljZSBzaXplICovCisJYmggPSBzYl9icmVhZChzLCBibG9ja19jb3VudF9uZXcgLSAxKTsKKwlpZiAoIWJoKSB7CisJCXByaW50aygicmVpc2VyZnNfcmVzaXplOiBjYW5cJ3QgcmVhZCBsYXN0IGJsb2NrXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQkKKwliZm9yZ2V0KGJoKTsKKworCS8qIG9sZCBkaXNrIGxheW91dCBkZXRlY3Rpb247IHRob3NlIHBhcnRpdGlvbnMgY2FuIGJlIG1vdW50ZWQsIGJ1dAorCSAqIGNhbm5vdCBiZSByZXNpemVkICovCisJaWYgKFNCX0JVRkZFUl9XSVRIX1NCKHMpLT5iX2Jsb2NrbnIgKglTQl9CVUZGRVJfV0lUSF9TQihzKS0+Yl9zaXplIAorCQkhPSBSRUlTRVJGU19ESVNLX09GRlNFVF9JTl9CWVRFUyApIHsKKwkJcHJpbnRrKCJyZWlzZXJmc19yZXNpemU6IHVuYWJsZSB0byByZXNpemUgYSByZWlzZXJmcyB3aXRob3V0IGRpc3RyaWJ1dGVkIGJpdG1hcCAoZnMgdmVyc2lvbiA8IDMuNS4xMilcbiIpOworCQlyZXR1cm4gLUVOT1RTVVBQOworCX0KKyAgICAgICAKKwkvKiBjb3VudCB1c2VkIGJpdHMgaW4gbGFzdCBiaXRtYXAgYmxvY2sgKi8KKwlibG9ja19yID0gU0JfQkxPQ0tfQ09VTlQocykgLQorCSAgICAgICAgKFNCX0JNQVBfTlIocykgLSAxKSAqIHMtPnNfYmxvY2tzaXplICogODsKKwkKKwkvKiBjb3VudCBiaXRtYXAgYmxvY2tzIGluIG5ldyBmcyAqLworCWJtYXBfbnJfbmV3ID0gYmxvY2tfY291bnRfbmV3IC8gKCBzLT5zX2Jsb2Nrc2l6ZSAqIDggKTsKKwlibG9ja19yX25ldyA9IGJsb2NrX2NvdW50X25ldyAtIGJtYXBfbnJfbmV3ICogcy0+c19ibG9ja3NpemUgKiA4OworCWlmIChibG9ja19yX25ldykgCisJCWJtYXBfbnJfbmV3Kys7CisJZWxzZQorCQlibG9ja19yX25ldyA9IHMtPnNfYmxvY2tzaXplICogODsKKworCS8qIHNhdmUgb2xkIHZhbHVlcyAqLworCWJsb2NrX2NvdW50ID0gU0JfQkxPQ0tfQ09VTlQocyk7CisJYm1hcF9uciAgICAgPSBTQl9CTUFQX05SKHMpOworCisJLyogcmVzaXppbmcgb2YgcmVpc2VyZnMgYml0bWFwcyAoam91cm5hbCBhbmQgcmVhbCksIGlmIG5lZWRlZCAqLworCWlmIChibWFwX25yX25ldyA+IGJtYXBfbnIpIHsJICAgIAorCSAgICAvKiByZWFsbG9jYXRlIGpvdXJuYWwgYml0bWFwcyAqLworCSAgICBpZiAocmVpc2VyZnNfYWxsb2NhdGVfbGlzdF9iaXRtYXBzKHMsIGpiaXRtYXAsIGJtYXBfbnJfbmV3KSA8IDApIHsKKwkJcHJpbnRrKCJyZWlzZXJmc19yZXNpemU6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGpvdXJuYWwgYml0bWFwc1xuIik7CisJCXVubG9ja19zdXBlcihzKSA7CisJCXJldHVybiAtRU5PTUVNIDsKKwkgICAgfQorCSAgICAvKiB0aGUgbmV3IGpvdXJuYWwgYml0bWFwcyBhcmUgemVybyBmaWxsZWQsIG5vdyB3ZSBjb3B5IGluIHRoZSBiaXRtYXAKKwkgICAgKiogbm9kZSBwb2ludGVycyBmcm9tIHRoZSBvbGQgam91cm5hbCBiaXRtYXAgc3RydWN0cywgYW5kIHRoZW4KKwkgICAgKiogdHJhbnNmZXIgdGhlIG5ldyBkYXRhIHN0cnVjdHVyZXMgaW50byB0aGUgam91cm5hbCBzdHJ1Y3QuCisJICAgICoqCisJICAgICoqIHVzaW5nIHRoZSBjb3B5X3NpemUgdmFyIGJlbG93IGFsbG93cyB0aGlzIGNvZGUgdG8gd29yayBmb3IKKwkgICAgKiogYm90aCBzaHJpbmtpbmcgYW5kIGV4cGFuZGluZyB0aGUgRlMuCisJICAgICovCisJICAgIGNvcHlfc2l6ZSA9IGJtYXBfbnJfbmV3IDwgYm1hcF9uciA/IGJtYXBfbnJfbmV3IDogYm1hcF9uciA7CisJICAgIGNvcHlfc2l6ZSA9IGNvcHlfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXBfbm9kZSAqKSA7CisJICAgIGZvciAoaSA9IDAgOyBpIDwgSk9VUk5BTF9OVU1fQklUTUFQUyA7IGkrKykgeworCQlzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKipub2RlX3RtcCA7CisJCWpiID0gU0JfSk9VUk5BTChzKS0+al9saXN0X2JpdG1hcCArIGkgOworCQltZW1jcHkoamJpdG1hcFtpXS5iaXRtYXBzLCBqYi0+Yml0bWFwcywgY29weV9zaXplKSA7CisKKwkJLyoganVzdCBpbiBjYXNlIHZmcmVlIHNjaGVkdWxlcyBvbiB1cywgY29weSB0aGUgbmV3CisJCSoqIHBvaW50ZXIgaW50byB0aGUgam91cm5hbCBzdHJ1Y3QgYmVmb3JlIGZyZWVpbmcgdGhlIAorCQkqKiBvbGQgb25lCisJCSovCisJCW5vZGVfdG1wID0gamItPmJpdG1hcHMgOworCQlqYi0+Yml0bWFwcyA9IGpiaXRtYXBbaV0uYml0bWFwcyA7CisJCXZmcmVlKG5vZGVfdG1wKSA7CisJICAgIH0JCisJCisJICAgIC8qIGFsbG9jYXRlIGFkZGl0aW9uYWwgYml0bWFwIGJsb2NrcywgcmVhbGxvY2F0ZSBhcnJheSBvZiBiaXRtYXAKKwkgICAgICogYmxvY2sgcG9pbnRlcnMgKi8KKwkgICAgYml0bWFwID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvKSAqIGJtYXBfbnJfbmV3KTsKKwkgICAgaWYgKCFiaXRtYXApIHsKKwkJLyogSm91cm5hbCBiaXRtYXBzIGFyZSBzdGlsbCBzdXBlcnNpemVkLCBidXQgdGhlIG1lbW9yeSBpc24ndAorCQkgKiBsZWFrZWQsIHNvIEkgZ3Vlc3MgaXQncyBvayAqLworCQlwcmludGsoInJlaXNlcmZzX3Jlc2l6ZTogdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeS5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwkgICAgfQorCSAgICBtZW1zZXQgKGJpdG1hcCwgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8pICogU0JfQk1BUF9OUihzKSk7CisJICAgIGZvciAoaSA9IDA7IGkgPCBibWFwX25yOyBpKyspCisJCWJpdG1hcFtpXSA9IG9sZF9iaXRtYXBbaV07CisKKwkgICAgLyogVGhpcyBkb2Vzbid0IGdvIHRocm91Z2ggdGhlIGpvdXJuYWwsIGJ1dCBpdCBkb2Vzbid0IGhhdmUgdG8uCisJICAgICAqIFRoZSBjaGFuZ2VzIGFyZSBzdGlsbCBhdG9taWM6IFdlJ3JlIHN5bmNlZCB1cCB3aGVuIHRoZSBqb3VybmFsCisJICAgICAqIHRyYW5zYWN0aW9uIGJlZ2lucywgYW5kIHRoZSBuZXcgYml0bWFwcyBkb24ndCBtYXR0ZXIgaWYgdGhlCisJICAgICAqIHRyYW5zYWN0aW9uIGZhaWxzLiAqLworCSAgICBmb3IgKGkgPSBibWFwX25yOyBpIDwgYm1hcF9ucl9uZXc7IGkrKykgeworCQliaXRtYXBbaV0uYmggPSBzYl9nZXRibGsocywgaSAqIHMtPnNfYmxvY2tzaXplICogOCk7CisJCW1lbXNldChiaXRtYXBbaV0uYmgtPmJfZGF0YSwgMCwgc2JfYmxvY2tzaXplKHNiKSk7CisJCXJlaXNlcmZzX3Rlc3RfYW5kX3NldF9sZV9iaXQoMCwgYml0bWFwW2ldLmJoLT5iX2RhdGEpOworCisJCXNldF9idWZmZXJfdXB0b2RhdGUoYml0bWFwW2ldLmJoKTsKKwkJbWFya19idWZmZXJfZGlydHkoYml0bWFwW2ldLmJoKSA7CisJCXN5bmNfZGlydHlfYnVmZmVyKGJpdG1hcFtpXS5iaCk7CisJCS8vIHVwZGF0ZSBiaXRtYXBfaW5mbyBzdHVmZgorCQliaXRtYXBbaV0uZmlyc3RfemVyb19oaW50PTE7CisJCWJpdG1hcFtpXS5mcmVlX2NvdW50ID0gc2JfYmxvY2tzaXplKHNiKSAqIDggLSAxOworCSAgICB9CQorCSAgICAvKiBmcmVlIG9sZCBiaXRtYXAgYmxvY2tzIGFycmF5ICovCisJICAgIFNCX0FQX0JJVE1BUChzKSA9IGJpdG1hcDsKKwkgICAgdmZyZWUgKG9sZF9iaXRtYXApOworCX0KKwkKKwkvKiBiZWdpbiB0cmFuc2FjdGlvbiwgaWYgdGhlcmUgd2FzIGFuIGVycm9yLCBpdCdzIGZpbmUuIFllcywgd2UgaGF2ZQorCSAqIGluY29ycmVjdCBiaXRtYXBzIG5vdywgYnV0IG5vbmUgb2YgaXQgaXMgZXZlciBnb2luZyB0byB0b3VjaCB0aGUKKwkgKiBkaXNrIGFueXdheS4gKi8KKwllcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgcywgMTApOworCWlmIChlcnIpCisJICAgIHJldHVybiBlcnI7CisKKwkvKiBjb3JyZWN0IGxhc3QgYml0bWFwIGJsb2NrcyBpbiBvbGQgYW5kIG5ldyBkaXNrIGxheW91dCAqLworCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQVBfQklUTUFQKHMpW2JtYXBfbnIgLSAxXS5iaCwgMSk7CisJZm9yIChpID0gYmxvY2tfcjsgaSA8IHMtPnNfYmxvY2tzaXplICogODsgaSsrKQorCSAgICByZWlzZXJmc190ZXN0X2FuZF9jbGVhcl9sZV9iaXQoaSwgCisJCQkJCSAgIFNCX0FQX0JJVE1BUChzKVtibWFwX25yIC0gMV0uYmgtPmJfZGF0YSk7CisJU0JfQVBfQklUTUFQKHMpW2JtYXBfbnIgLSAxXS5mcmVlX2NvdW50ICs9IHMtPnNfYmxvY2tzaXplICogOCAtIGJsb2NrX3I7CisJaWYgKCAhU0JfQVBfQklUTUFQKHMpW2JtYXBfbnIgLSAxXS5maXJzdF96ZXJvX2hpbnQpCisJICAgIFNCX0FQX0JJVE1BUChzKVtibWFwX25yIC0gMV0uZmlyc3RfemVyb19oaW50ID0gYmxvY2tfcjsKKworCWpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIFNCX0FQX0JJVE1BUChzKVtibWFwX25yIC0gMV0uYmgpOworCisJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9BUF9CSVRNQVAocylbYm1hcF9ucl9uZXcgLSAxXS5iaCwgMSk7CisJZm9yIChpID0gYmxvY2tfcl9uZXc7IGkgPCBzLT5zX2Jsb2Nrc2l6ZSAqIDg7IGkrKykKKwkgICAgcmVpc2VyZnNfdGVzdF9hbmRfc2V0X2xlX2JpdChpLAorCQkJCQkgU0JfQVBfQklUTUFQKHMpW2JtYXBfbnJfbmV3IC0gMV0uYmgtPmJfZGF0YSk7CisJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgU0JfQVBfQklUTUFQKHMpW2JtYXBfbnJfbmV3IC0gMV0uYmgpOworIAorCVNCX0FQX0JJVE1BUChzKVtibWFwX25yX25ldyAtIDFdLmZyZWVfY291bnQgLT0gcy0+c19ibG9ja3NpemUgKiA4IC0gYmxvY2tfcl9uZXc7CisJLyogRXh0cmVtZSBjYXNlIHdoZXJlIGxhc3QgYml0bWFwIGlzIHRoZSBvbmx5IHZhbGlkIGJsb2NrIGluIGl0c2VsZi4gKi8KKwlpZiAoICFTQl9BUF9CSVRNQVAocylbYm1hcF9ucl9uZXcgLSAxXS5mcmVlX2NvdW50ICkKKwkgICAgU0JfQVBfQklUTUFQKHMpW2JtYXBfbnJfbmV3IC0gMV0uZmlyc3RfemVyb19oaW50ID0gMDsKKyAJLyogdXBkYXRlIHN1cGVyICovCisJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSkgOworCWZyZWVfYmxvY2tzID0gU0JfRlJFRV9CTE9DS1Mocyk7CisJUFVUX1NCX0ZSRUVfQkxPQ0tTKHMsIGZyZWVfYmxvY2tzICsgKGJsb2NrX2NvdW50X25ldyAtIGJsb2NrX2NvdW50IC0gKGJtYXBfbnJfbmV3IC0gYm1hcF9ucikpKTsKKwlQVVRfU0JfQkxPQ0tfQ09VTlQocywgYmxvY2tfY291bnRfbmV3KTsKKwlQVVRfU0JfQk1BUF9OUihzLCBibWFwX25yX25ldyk7CisJcy0+c19kaXJ0ID0gMTsKKworCWpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpKTsKKwkKKwlTQl9KT1VSTkFMKHMpLT5qX211c3Rfd2FpdCA9IDE7CisJcmV0dXJuIGpvdXJuYWxfZW5kKCZ0aCwgcywgMTApOworfQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvc3RyZWUuYyBiL2ZzL3JlaXNlcmZzL3N0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNlYzUyMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL3N0cmVlLmMKQEAgLTAsMCArMSwyMDczIEBACisvKgorICogIENvcHlyaWdodCAyMDAwIGJ5IEhhbnMgUmVpc2VyLCBsaWNlbnNpbmcgZ292ZXJuZWQgYnkgcmVpc2VyZnMvUkVBRE1FCisgKi8KKworLyoKKyAqICBXcml0dGVuIGJ5IEFuYXRvbHkgUC4gUGluY2h1ayBwYXBAbmFtZXN5cy5ib3Rpay5ydQorICogIFByb2dyYW1tIFN5c3RlbSBJbnN0aXR1dGUKKyAqICBQZXJlc2xhdmwtWmFsZXNza3kgUnVzc2lhCisgKi8KKworLyoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIGRlYWxpbmcgd2l0aCBTK3RyZWUKKyAqCisgKiBCX0lTX0lOX1RSRUUKKyAqIGNvcHlfaXRlbV9oZWFkCisgKiBjb21wX3Nob3J0X2tleXMKKyAqIGNvbXBfa2V5cworICogY29tcF9zaG9ydF9sZV9rZXlzCisgKiBsZV9rZXkyY3B1X2tleQorICogY29tcF9sZV9rZXlzCisgKiBiaW5fc2VhcmNoCisgKiBnZXRfbGtleQorICogZ2V0X3JrZXkKKyAqIGtleV9pbl9idWZmZXIKKyAqIGRlY3JlbWVudF9iY291bnQKKyAqIGRlY3JlbWVudF9jb3VudGVyc19pbl9wYXRoCisgKiByZWlzZXJmc19jaGVja19wYXRoCisgKiBwYXRocmVsc2VfYW5kX3Jlc3RvcmUKKyAqIHBhdGhyZWxzZQorICogc2VhcmNoX2J5X2tleV9yZWFkYQorICogc2VhcmNoX2J5X2tleQorICogc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkKKyAqIGNvbXBfaXRlbXMKKyAqIHByZXBhcmVfZm9yX2RpcmVjdF9pdGVtCisgKiBwcmVwYXJlX2Zvcl9kaXJlbnRyeV9pdGVtCisgKiBwcmVwYXJlX2Zvcl9kZWxldGVfb3JfY3V0CisgKiBjYWxjX2RlbGV0ZWRfYnl0ZXNfbnVtYmVyCisgKiBpbml0X3RiX3N0cnVjdAorICogcGFkZF9pdGVtCisgKiByZWlzZXJmc19kZWxldGVfaXRlbQorICogcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW0KKyAqIHJlaXNlcmZzX2RlbGV0ZV9vYmplY3QKKyAqIG1heWJlX2luZGlyZWN0X3RvX2RpcmVjdAorICogaW5kaXJlY3RfdG9fZGlyZWN0X3JvbGxfYmFjaworICogcmVpc2VyZnNfY3V0X2Zyb21faXRlbQorICogdHJ1bmNhdGVfZGlyZWN0b3J5CisgKiByZWlzZXJmc19kb190cnVuY2F0ZQorICogcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtCisgKiByZWlzZXJmc19pbnNlcnRfaXRlbQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisKKy8qIERvZXMgdGhlIGJ1ZmZlciBjb250YWluIGEgZGlzayBibG9jayB3aGljaCBpcyBpbiB0aGUgdHJlZS4gKi8KK2lubGluZSBpbnQgQl9JU19JTl9UUkVFIChjb25zdCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBwX3NfYmgpCit7CisKKyAgUkZBTFNFKCBCX0xFVkVMIChwX3NfYmgpID4gTUFYX0hFSUdIVCwKKwkgICJQQVAtMTAxMDogYmxvY2sgKCViKSBoYXMgdG9vIGJpZyBsZXZlbCAoJXopIiwgcF9zX2JoLCBwX3NfYmgpOworCisgIHJldHVybiAoIEJfTEVWRUwgKHBfc19iaCkgIT0gRlJFRV9MRVZFTCApOworfQorCisvLworLy8gdG8gZ2V0cyBpdGVtIGhlYWQgaW4gbGUgZm9ybQorLy8KK2lubGluZSB2b2lkIGNvcHlfaXRlbV9oZWFkKHN0cnVjdCBpdGVtX2hlYWQgKiBwX3ZfdG8sIAorCQkJICAgY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqIHBfdl9mcm9tKQoreworICBtZW1jcHkgKHBfdl90bywgcF92X2Zyb20sIElIX1NJWkUpOworfQorCisKKy8qIGsxIGlzIHBvaW50ZXIgdG8gb24tZGlzayBzdHJ1Y3R1cmUgd2hpY2ggaXMgc3RvcmVkIGluIGxpdHRsZS1lbmRpYW4KKyAgIGZvcm0uIGsyIGlzIHBvaW50ZXIgdG8gY3B1IHZhcmlhYmxlLiBGb3Iga2V5IG9mIGl0ZW1zIG9mIHRoZSBzYW1lCisgICBvYmplY3QgdGhpcyByZXR1cm5zIDAuCisgICBSZXR1cm5zOiAtMSBpZiBrZXkxIDwga2V5MiAKKyAgIDAgaWYga2V5MSA9PSBrZXkyCisgICAxIGlmIGtleTEgPiBrZXkyICovCitpbmxpbmUgaW50ICBjb21wX3Nob3J0X2tleXMgKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBsZV9rZXksCisJCQkgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICogY3B1X2tleSkKK3sKKyAgX191MzIgKiBwX3NfbGVfdTMyLCAqIHBfc19jcHVfdTMyOworICBpbnQgbl9rZXlfbGVuZ3RoID0gUkVJU0VSRlNfU0hPUlRfS0VZX0xFTjsKKworICBwX3NfbGVfdTMyID0gKF9fdTMyICopbGVfa2V5OworICBwX3NfY3B1X3UzMiA9IChfX3UzMiAqKSZjcHVfa2V5LT5vbl9kaXNrX2tleTsKKyAgZm9yKCA7IG5fa2V5X2xlbmd0aC0tOyArK3Bfc19sZV91MzIsICsrcF9zX2NwdV91MzIgKSB7CisgICAgaWYgKCBsZTMyX3RvX2NwdSAoKnBfc19sZV91MzIpIDwgKnBfc19jcHVfdTMyICkKKyAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIGxlMzJfdG9fY3B1ICgqcF9zX2xlX3UzMikgPiAqcF9zX2NwdV91MzIgKQorICAgICAgcmV0dXJuIDE7CisgIH0KKworICByZXR1cm4gMDsKK30KKworCisvKiBrMSBpcyBwb2ludGVyIHRvIG9uLWRpc2sgc3RydWN0dXJlIHdoaWNoIGlzIHN0b3JlZCBpbiBsaXR0bGUtZW5kaWFuCisgICBmb3JtLiBrMiBpcyBwb2ludGVyIHRvIGNwdSB2YXJpYWJsZS4KKyAgIENvbXBhcmUga2V5cyB1c2luZyBhbGwgNCBrZXkgZmllbGRzLgorICAgUmV0dXJuczogLTEgaWYga2V5MSA8IGtleTIgMAorICAgaWYga2V5MSA9IGtleTIgMSBpZiBrZXkxID4ga2V5MiAqLworc3RhdGljIGlubGluZSBpbnQgIGNvbXBfa2V5cyAoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqIGxlX2tleSwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBjcHVfa2V5KQoreworICBpbnQgcmV0dmFsOworCisgIHJldHZhbCA9IGNvbXBfc2hvcnRfa2V5cyAobGVfa2V5LCBjcHVfa2V5KTsKKyAgaWYgKHJldHZhbCkKKyAgICAgIHJldHVybiByZXR2YWw7CisgIGlmIChsZV9rZXlfa19vZmZzZXQgKGxlX2tleV92ZXJzaW9uKGxlX2tleSksIGxlX2tleSkgPCBjcHVfa2V5X2tfb2Zmc2V0IChjcHVfa2V5KSkKKyAgICAgIHJldHVybiAtMTsKKyAgaWYgKGxlX2tleV9rX29mZnNldCAobGVfa2V5X3ZlcnNpb24obGVfa2V5KSwgbGVfa2V5KSA+IGNwdV9rZXlfa19vZmZzZXQgKGNwdV9rZXkpKQorICAgICAgcmV0dXJuIDE7CisKKyAgaWYgKGNwdV9rZXktPmtleV9sZW5ndGggPT0gMykKKyAgICAgIHJldHVybiAwOworCisgIC8qIHRoaXMgcGFydCBpcyBuZWVkZWQgb25seSB3aGVuIHRhaWwgY29udmVyc2lvbiBpcyBpbiBwcm9ncmVzcyAqLworICBpZiAobGVfa2V5X2tfdHlwZSAobGVfa2V5X3ZlcnNpb24obGVfa2V5KSwgbGVfa2V5KSA8IGNwdV9rZXlfa190eXBlIChjcHVfa2V5KSkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKGxlX2tleV9rX3R5cGUgKGxlX2tleV92ZXJzaW9uKGxlX2tleSksIGxlX2tleSkgPiBjcHVfa2V5X2tfdHlwZSAoY3B1X2tleSkpCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7Cit9CisKKworaW5saW5lIGludCBjb21wX3Nob3J0X2xlX2tleXMgKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkxLCBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5MikKK3sKKyAgX191MzIgKiBwX3NfMV91MzIsICogcF9zXzJfdTMyOworICBpbnQgbl9rZXlfbGVuZ3RoID0gUkVJU0VSRlNfU0hPUlRfS0VZX0xFTjsKKworICBwX3NfMV91MzIgPSAoX191MzIgKilrZXkxOworICBwX3NfMl91MzIgPSAoX191MzIgKilrZXkyOworICBmb3IoIDsgbl9rZXlfbGVuZ3RoLS07ICsrcF9zXzFfdTMyLCArK3Bfc18yX3UzMiApIHsKKyAgICBpZiAoIGxlMzJfdG9fY3B1ICgqcF9zXzFfdTMyKSA8IGxlMzJfdG9fY3B1ICgqcF9zXzJfdTMyKSApCisgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCBsZTMyX3RvX2NwdSAoKnBfc18xX3UzMikgPiBsZTMyX3RvX2NwdSAoKnBfc18yX3UzMikgKQorICAgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2lubGluZSB2b2lkIGxlX2tleTJjcHVfa2V5IChzdHJ1Y3QgY3B1X2tleSAqIHRvLCBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICogZnJvbSkKK3sKKyAgICB0by0+b25fZGlza19rZXkua19kaXJfaWQgPSBsZTMyX3RvX2NwdSAoZnJvbS0+a19kaXJfaWQpOworICAgIHRvLT5vbl9kaXNrX2tleS5rX29iamVjdGlkID0gbGUzMl90b19jcHUgKGZyb20tPmtfb2JqZWN0aWQpOworICAgIAorICAgIC8vIGZpbmQgb3V0IHZlcnNpb24gb2YgdGhlIGtleQorICAgIHRvLT52ZXJzaW9uID0gbGVfa2V5X3ZlcnNpb24gKGZyb20pOworICAgIGlmICh0by0+dmVyc2lvbiA9PSBLRVlfRk9STUFUXzNfNSkgeworCXRvLT5vbl9kaXNrX2tleS51Lmtfb2Zmc2V0X3YxLmtfb2Zmc2V0ID0gbGUzMl90b19jcHUgKGZyb20tPnUua19vZmZzZXRfdjEua19vZmZzZXQpOworCXRvLT5vbl9kaXNrX2tleS51Lmtfb2Zmc2V0X3YxLmtfdW5pcXVlbmVzcyA9IGxlMzJfdG9fY3B1IChmcm9tLT51Lmtfb2Zmc2V0X3YxLmtfdW5pcXVlbmVzcyk7CisgICAgfSBlbHNlIHsKKwl0by0+b25fZGlza19rZXkudS5rX29mZnNldF92Mi5rX29mZnNldCA9IG9mZnNldF92Ml9rX29mZnNldCgmZnJvbS0+dS5rX29mZnNldF92Mik7CisJdG8tPm9uX2Rpc2tfa2V5LnUua19vZmZzZXRfdjIua190eXBlID0gb2Zmc2V0X3YyX2tfdHlwZSgmZnJvbS0+dS5rX29mZnNldF92Mik7CisgICAgfSAKK30KKworCisKKy8vIHRoaXMgZG9lcyBub3Qgc2F5IHdoaWNoIG9uZSBpcyBiaWdnZXIsIGl0IG9ubHkgcmV0dXJucyAxIGlmIGtleXMKKy8vIGFyZSBub3QgZXF1YWwsIDAgb3RoZXJ3aXNlCitpbmxpbmUgaW50IGNvbXBfbGVfa2V5cyAoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqIGsxLCBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICogazIpCit7CisgICAgcmV0dXJuIG1lbWNtcCAoazEsIGsyLCBzaXplb2YgKHN0cnVjdCByZWlzZXJmc19rZXkpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQmluYXJ5IHNlYXJjaCB0b29sa2l0IGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBTZWFyY2ggZm9yIGFuIGl0ZW0gaW4gdGhlIGFycmF5IGJ5IHRoZSBpdGVtIGtleSAgICAgICAgICAgICAgICAgICAgICAgKgorICogIFJldHVybnM6ICAgIDEgaWYgZm91bmQsICAwIGlmIG5vdCBmb3VuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgKnBfbl9wb3MgPSBudW1iZXIgb2YgdGhlIHNlYXJjaGVkIGVsZW1lbnQgaWYgZm91bmQsIGVsc2UgdGhlICAgICoKKyAqICAgICAgICBudW1iZXIgb2YgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyBsYXJnZXIgdGhhbiBwX3Zfa2V5LiAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRm9yIHRob3NlIG5vdCBmYW1pbGlhciB3aXRoIGJpbmFyeSBzZWFyY2g6IG5fbGJvdW5kIGlzIHRoZSBsZWZ0bW9zdCBpdGVtIHRoYXQgaXQKKyBjb3VsZCBiZSwgbl9yYm91bmQgdGhlIHJpZ2h0bW9zdCBpdGVtIHRoYXQgaXQgY291bGQgYmUuICBXZSBleGFtaW5lIHRoZSBpdGVtCisgaGFsZndheSBiZXR3ZWVuIG5fbGJvdW5kIGFuZCBuX3Jib3VuZCwgYW5kIHRoYXQgdGVsbHMgdXMgZWl0aGVyIHRoYXQgd2UgY2FuIGluY3JlYXNlCisgbl9sYm91bmQsIG9yIGRlY3JlYXNlIG5fcmJvdW5kLCBvciB0aGF0IHdlIGhhdmUgZm91bmQgaXQsIG9yIGlmIG5fbGJvdW5kIDw9IG5fcmJvdW5kIHRoYXQKKyB0aGVyZSBhcmUgbm8gcG9zc2libGUgaXRlbXMsIGFuZCB3ZSBoYXZlIG5vdCBmb3VuZCBpdC4gV2l0aCBlYWNoIGV4YW1pbmF0aW9uIHdlCisgY3V0IHRoZSBudW1iZXIgb2YgcG9zc2libGUgaXRlbXMgaXQgY291bGQgYmUgYnkgb25lIG1vcmUgdGhhbiBoYWxmIHJvdW5kZWQgZG93biwKKyBvciB3ZSBmaW5kIGl0LiAqLworc3RhdGljIGlubGluZQlpbnQgYmluX3NlYXJjaCAoCisgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiBwX3Zfa2V5LCAvKiBLZXkgdG8gc2VhcmNoIGZvci4gICAgICAgICAgICAgICAgICAgKi8KKwkgICAgICBjb25zdCB2b2lkICogcF92X2Jhc2UsLyogRmlyc3QgaXRlbSBpbiB0aGUgYXJyYXkuICAgICAgICAgICAgICovCisJICAgICAgaW50ICAgICAgIHBfbl9udW0sICAgIC8qIE51bWJlciBvZiBpdGVtcyBpbiB0aGUgYXJyYXkuICAgICAgICAqLworCSAgICAgIGludCAgICAgICBwX25fd2lkdGgsICAvKiBJdGVtIHNpemUgaW4gdGhlIGFycmF5LgorCQkJCSAgICAgICBzZWFyY2hlZC4gTGVzdCB0aGUgcmVhZGVyIGJlCisJCQkJICAgICAgIGNvbmZ1c2VkLCBub3RlIHRoYXQgdGhpcyBpcyBjcmFmdGVkCisJCQkJICAgICAgIGFzIGEgZ2VuZXJhbCBmdW5jdGlvbiwgYW5kIHdoZW4gaXQKKwkJCQkgICAgICAgaXMgYXBwbGllZCBzcGVjaWZpY2FsbHkgdG8gdGhlIGFycmF5CisJCQkJICAgICAgIG9mIGl0ZW0gaGVhZGVycyBpbiBhIG5vZGUsIHBfbl93aWR0aAorCQkJCSAgICAgICBpcyBhY3R1YWxseSB0aGUgaXRlbSBoZWFkZXIgc2l6ZSBub3QKKwkJCQkgICAgICAgdGhlIGl0ZW0gc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgKi8KKwkgICAgICBpbnQgICAgICogcF9uX3BvcyAgICAgLyogTnVtYmVyIG9mIHRoZSBzZWFyY2hlZCBmb3IgZWxlbWVudC4gKi8KKyAgICAgICAgICAgICkgeworICAgIGludCAgIG5fcmJvdW5kLCBuX2xib3VuZCwgbl9qOworCisgICBmb3IgKCBuX2ogPSAoKG5fcmJvdW5kID0gcF9uX251bSAtIDEpICsgKG5fbGJvdW5kID0gMCkpLzI7IG5fbGJvdW5kIDw9IG5fcmJvdW5kOyBuX2ogPSAobl9yYm91bmQgKyBuX2xib3VuZCkvMiApCisgICAgIHN3aXRjaCggY29tcF9rZXlzKChzdHJ1Y3QgcmVpc2VyZnNfa2V5ICopKChjaGFyICogKXBfdl9iYXNlICsgbl9qICogcF9uX3dpZHRoKSwgKHN0cnVjdCBjcHVfa2V5ICopcF92X2tleSkgKSAgeworICAgICBjYXNlIC0xOiBuX2xib3VuZCA9IG5faiArIDE7IGNvbnRpbnVlOworICAgICBjYXNlICAxOiBuX3Jib3VuZCA9IG5faiAtIDE7IGNvbnRpbnVlOworICAgICBjYXNlICAwOiAqcF9uX3BvcyA9IG5fajsgICAgIHJldHVybiBJVEVNX0ZPVU5EOyAvKiBLZXkgZm91bmQgaW4gdGhlIGFycmF5LiAgKi8KKyAgICAgICAgfQorCisgICAgLyogYmluX3NlYXJjaCBkaWQgbm90IGZpbmQgZ2l2ZW4ga2V5LCBpdCByZXR1cm5zIHBvc2l0aW9uIG9mIGtleSwKKyAgICAgICAgdGhhdCBpcyBtaW5pbWFsIGFuZCBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIG9uZS4gKi8KKyAgICAqcF9uX3BvcyA9IG5fbGJvdW5kOworICAgIHJldHVybiBJVEVNX05PVF9GT1VORDsKK30KKworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworZXh0ZXJuIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiBjdXJfdGI7CisjZW5kaWYKKworCisKKy8qIE1pbmltYWwgcG9zc2libGUga2V5LiBJdCBpcyBuZXZlciBpbiB0aGUgdHJlZS4gKi8KK2NvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgIE1JTl9LRVkgPSB7MCwgMCwge3swLCAwfSx9fTsKKworLyogTWF4aW1hbCBwb3NzaWJsZSBrZXkuIEl0IGlzIG5ldmVyIGluIHRoZSB0cmVlLiAqLworY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAgTUFYX0tFWSA9IHsweGZmZmZmZmZmLCAweGZmZmZmZmZmLCB7ezB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmZ9LH19OworCisKKy8qIEdldCBkZWxpbWl0aW5nIGtleSBvZiB0aGUgYnVmZmVyIGJ5IGxvb2tpbmcgZm9yIGl0IGluIHRoZSBidWZmZXJzIGluIHRoZSBwYXRoLCBzdGFydGluZyBmcm9tIHRoZSBib3R0b20KKyAgIG9mIHRoZSBwYXRoLCBhbmQgZ29pbmcgdXB3YXJkcy4gIFdlIG11c3QgY2hlY2sgdGhlIHBhdGgncyB2YWxpZGl0eSBhdCBlYWNoIHN0ZXAuICBJZiB0aGUga2V5IGlzIG5vdCBpbgorICAgdGhlIHBhdGgsIHRoZXJlIGlzIG5vIGRlbGltaXRpbmcga2V5IGluIHRoZSB0cmVlIChidWZmZXIgaXMgZmlyc3Qgb3IgbGFzdCBidWZmZXIgaW4gdHJlZSksIGFuZCBpbiB0aGlzCisgICBjYXNlIHdlIHJldHVybiBhIHNwZWNpYWwga2V5LCBlaXRoZXIgTUlOX0tFWSBvciBNQVhfS0VZLiAqLworc3RhdGljIGlubGluZQljb25zdCBzdHJ1Y3QgIHJlaXNlcmZzX2tleSAqIGdldF9sa2V5ICAoCisJICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwYXRoICAgICAgICAgKiBwX3NfY2hrX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiCisgICAgICAgICAgICAgICAgICAgICAgKSB7CisgIGludCAgICAgICAgICAgICAgICAgICBuX3Bvc2l0aW9uLCBuX3BhdGhfb2Zmc2V0ID0gcF9zX2Noa19wYXRoLT5wYXRoX2xlbmd0aDsKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19wYXJlbnQ7CisgIAorICBSRkFMU0UoIG5fcGF0aF9vZmZzZXQgPCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VULCAKKwkgICJQQVAtNTAxMDogaW52YWxpZCBvZmZzZXQgaW4gdGhlIHBhdGgiKTsKKworICAvKiBXaGlsZSBub3QgaGlnaGVyIGluIHBhdGggdGhhbiBmaXJzdCBlbGVtZW50LiAqLworICB3aGlsZSAoIG5fcGF0aF9vZmZzZXQtLSA+IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgKSB7CisKKyAgICBSRkFMU0UoICEgYnVmZmVyX3VwdG9kYXRlKFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX2Noa19wYXRoLCBuX3BhdGhfb2Zmc2V0KSksCisJICAgICJQQVAtNTAyMDogcGFyZW50IGlzIG5vdCB1cHRvZGF0ZSIpOworCisgICAgLyogUGFyZW50IGF0IHRoZSBwYXRoIGlzIG5vdCBpbiB0aGUgdHJlZSBub3cuICovCisgICAgaWYgKCAhIEJfSVNfSU5fVFJFRShwX3NfcGFyZW50ID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsIG5fcGF0aF9vZmZzZXQpKSApCisgICAgICByZXR1cm4gJk1BWF9LRVk7CisgICAgLyogQ2hlY2sgd2hldGhlciBwb3NpdGlvbiBpbiB0aGUgcGFyZW50IGlzIGNvcnJlY3QuICovCisgICAgaWYgKCAobl9wb3NpdGlvbiA9IFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCkpID4gQl9OUl9JVEVNUyhwX3NfcGFyZW50KSApCisgICAgICAgcmV0dXJuICZNQVhfS0VZOworICAgIC8qIENoZWNrIHdoZXRoZXIgcGFyZW50IGF0IHRoZSBwYXRoIHJlYWxseSBwb2ludHMgdG8gdGhlIGNoaWxkLiAqLworICAgIGlmICggQl9OX0NISUxEX05VTShwX3NfcGFyZW50LCBuX3Bvc2l0aW9uKSAhPQorCSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCArIDEpLT5iX2Jsb2NrbnIgKQorICAgICAgcmV0dXJuICZNQVhfS0VZOworICAgIC8qIFJldHVybiBkZWxpbWl0aW5nIGtleSBpZiBwb3NpdGlvbiBpbiB0aGUgcGFyZW50IGlzIG5vdCBlcXVhbCB0byB6ZXJvLiAqLworICAgIGlmICggbl9wb3NpdGlvbiApCisgICAgICByZXR1cm4gQl9OX1BERUxJTV9LRVkocF9zX3BhcmVudCwgbl9wb3NpdGlvbiAtIDEpOworICB9CisgIC8qIFJldHVybiBNSU5fS0VZIGlmIHdlIGFyZSBpbiB0aGUgcm9vdCBvZiB0aGUgYnVmZmVyIHRyZWUuICovCisgIGlmICggUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsIEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQpLT5iX2Jsb2NrbnIgPT0KKyAgICAgICBTQl9ST09UX0JMT0NLIChwX3Nfc2IpICkKKyAgICByZXR1cm4gJk1JTl9LRVk7CisgIHJldHVybiAgJk1BWF9LRVk7Cit9CisKKworLyogR2V0IGRlbGltaXRpbmcga2V5IG9mIHRoZSBidWZmZXIgYXQgdGhlIHBhdGggYW5kIGl0cyByaWdodCBuZWlnaGJvci4gKi8KK2lubGluZQljb25zdCBzdHJ1Y3QgIHJlaXNlcmZzX2tleSAqIGdldF9ya2V5ICAoCisJICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwYXRoICAgICAgICAgKiBwX3NfY2hrX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiCisgICAgICAgICAgICAgICAgICAgICAgKSB7CisgIGludCAgICAgICAgICAgICAgICAgICBuX3Bvc2l0aW9uLAorICAgIAkJCW5fcGF0aF9vZmZzZXQgPSBwX3NfY2hrX3BhdGgtPnBhdGhfbGVuZ3RoOworICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICogcF9zX3BhcmVudDsKKworICBSRkFMU0UoIG5fcGF0aF9vZmZzZXQgPCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VULAorCSAgIlBBUC01MDMwOiBpbnZhbGlkIG9mZnNldCBpbiB0aGUgcGF0aCIpOworCisgIHdoaWxlICggbl9wYXRoX29mZnNldC0tID4gRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCApIHsKKworICAgIFJGQUxTRSggISBidWZmZXJfdXB0b2RhdGUoUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsIG5fcGF0aF9vZmZzZXQpKSwKKwkgICAgIlBBUC01MDQwOiBwYXJlbnQgaXMgbm90IHVwdG9kYXRlIik7CisKKyAgICAvKiBQYXJlbnQgYXQgdGhlIHBhdGggaXMgbm90IGluIHRoZSB0cmVlIG5vdy4gKi8KKyAgICBpZiAoICEgQl9JU19JTl9UUkVFKHBfc19wYXJlbnQgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCkpICkKKyAgICAgIHJldHVybiAmTUlOX0tFWTsKKyAgICAvKiBDaGVjayB3aGV0aGVyIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQgaXMgY29ycmVjdC4gKi8KKyAgICBpZiAoIChuX3Bvc2l0aW9uID0gUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX2Noa19wYXRoLCBuX3BhdGhfb2Zmc2V0KSkgPiBCX05SX0lURU1TKHBfc19wYXJlbnQpICkKKyAgICAgIHJldHVybiAmTUlOX0tFWTsKKyAgICAvKiBDaGVjayB3aGV0aGVyIHBhcmVudCBhdCB0aGUgcGF0aCByZWFsbHkgcG9pbnRzIHRvIHRoZSBjaGlsZC4gKi8KKyAgICBpZiAoIEJfTl9DSElMRF9OVU0ocF9zX3BhcmVudCwgbl9wb3NpdGlvbikgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCArIDEpLT5iX2Jsb2NrbnIgKQorICAgICAgcmV0dXJuICZNSU5fS0VZOworICAgIC8qIFJldHVybiBkZWxpbWl0aW5nIGtleSBpZiBwb3NpdGlvbiBpbiB0aGUgcGFyZW50IGlzIG5vdCB0aGUgbGFzdCBvbmUuICovCisgICAgaWYgKCBuX3Bvc2l0aW9uICE9IEJfTlJfSVRFTVMocF9zX3BhcmVudCkgKQorICAgICAgcmV0dXJuIEJfTl9QREVMSU1fS0VZKHBfc19wYXJlbnQsIG5fcG9zaXRpb24pOworICB9CisgIC8qIFJldHVybiBNQVhfS0VZIGlmIHdlIGFyZSBpbiB0aGUgcm9vdCBvZiB0aGUgYnVmZmVyIHRyZWUuICovCisgIGlmICggUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsIEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQpLT5iX2Jsb2NrbnIgPT0KKyAgICAgICBTQl9ST09UX0JMT0NLIChwX3Nfc2IpICkKKyAgICByZXR1cm4gJk1BWF9LRVk7CisgIHJldHVybiAgJk1JTl9LRVk7Cit9CisKKworLyogQ2hlY2sgd2hldGhlciBhIGtleSBpcyBjb250YWluZWQgaW4gdGhlIHRyZWUgcm9vdGVkIGZyb20gYSBidWZmZXIgYXQgYSBwYXRoLiAqLworLyogVGhpcyB3b3JrcyBieSBsb29raW5nIGF0IHRoZSBsZWZ0IGFuZCByaWdodCBkZWxpbWl0aW5nIGtleXMgZm9yIHRoZSBidWZmZXIgaW4gdGhlIGxhc3QgcGF0aF9lbGVtZW50IGluCisgICB0aGUgcGF0aC4gIFRoZXNlIGRlbGltaXRpbmcga2V5cyBhcmUgc3RvcmVkIGF0IGxlYXN0IG9uZSBsZXZlbCBhYm92ZSB0aGF0IGJ1ZmZlciBpbiB0aGUgdHJlZS4gSWYgdGhlCisgICBidWZmZXIgaXMgdGhlIGZpcnN0IG9yIGxhc3Qgbm9kZSBpbiB0aGUgdHJlZSBvcmRlciB0aGVuIG9uZSBvZiB0aGUgZGVsaW1pdGluZyBrZXlzIG1heSBiZSBhYnNlbnQsIGFuZCBpbgorICAgdGhpcyBjYXNlIGdldF9sa2V5IGFuZCBnZXRfcmtleSByZXR1cm4gYSBzcGVjaWFsIGtleSB3aGljaCBpcyBNSU5fS0VZIG9yIE1BWF9LRVkuICovCitzdGF0aWMgIGlubGluZSAgaW50IGtleV9pbl9idWZmZXIgKAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwYXRoICAgICAgICAgKiBwX3NfY2hrX3BhdGgsIC8qIFBhdGggd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQuICAqLworICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICAgICAgKiBwX3Nfa2V5LCAgICAgIC8qIEtleSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZC4gICAqLworICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAgKiBwX3Nfc2IgICAgICAgIC8qIFN1cGVyIGJsb2NrIHBvaW50ZXIuICAgICAgICAgICAqLworCQkgICAgICApIHsKKworICBSRkFMU0UoICEgcF9zX2tleSB8fCBwX3NfY2hrX3BhdGgtPnBhdGhfbGVuZ3RoIDwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCB8fAorCSAgcF9zX2Noa19wYXRoLT5wYXRoX2xlbmd0aCA+IE1BWF9IRUlHSFQsCisJICAiUEFQLTUwNTA6IHBvaW50ZXIgdG8gdGhlIGtleSglcCkgaXMgTlVMTCBvciBpbnZhbGlkIHBhdGggbGVuZ3RoKCVkKSIsCisJICBwX3Nfa2V5LCBwX3NfY2hrX3BhdGgtPnBhdGhfbGVuZ3RoKTsKKyAgUkZBTFNFKCAhUEFUSF9QTEFTVF9CVUZGRVIocF9zX2Noa19wYXRoKS0+Yl9iZGV2LAorCSAgIlBBUC01MDYwOiBkZXZpY2UgbXVzdCBub3QgYmUgTk9ERVYiKTsKKworICBpZiAoIGNvbXBfa2V5cyhnZXRfbGtleShwX3NfY2hrX3BhdGgsIHBfc19zYiksIHBfc19rZXkpID09IDEgKQorICAgIC8qIGxlZnQgZGVsaW1pdGluZyBrZXkgaXMgYmlnZ2VyLCB0aGF0IHRoZSBrZXkgd2UgbG9vayBmb3IgKi8KKyAgICByZXR1cm4gMDsKKyAgLy8gIGlmICggY29tcF9rZXlzKHBfc19rZXksIGdldF9ya2V5KHBfc19jaGtfcGF0aCwgcF9zX3NiKSkgIT0gLTEgKQorICBpZiAoIGNvbXBfa2V5cyhnZXRfcmtleShwX3NfY2hrX3BhdGgsIHBfc19zYiksIHBfc19rZXkpICE9IDEgKQorICAgIC8qIHBfc19rZXkgbXVzdCBiZSBsZXNzIHRoYW4gcmlnaHQgZGVsaW1pdGlpbmcga2V5ICovCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCisKK2lubGluZSB2b2lkIGRlY3JlbWVudF9iY291bnQoCisgICAgICAgICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfYmgKKyAgICAgICAgICAgICkgeyAKKyAgaWYgKCBwX3NfYmggKSB7CisgICAgaWYgKCBhdG9taWNfcmVhZCAoJihwX3NfYmgtPmJfY291bnQpKSApIHsKKyAgICAgIHB1dF9iaChwX3NfYmgpIDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmVpc2VyZnNfcGFuaWMoTlVMTCwgIlBBUC01MDcwOiBkZWNyZW1lbnRfYmNvdW50OiB0cnlpbmcgdG8gZnJlZSBmcmVlIGJ1ZmZlciAlYiIsIHBfc19iaCk7CisgIH0KK30KKworCisvKiBEZWNyZW1lbnQgYl9jb3VudCBmaWVsZCBvZiB0aGUgYWxsIGJ1ZmZlcnMgaW4gdGhlIHBhdGguICovCit2b2lkIGRlY3JlbWVudF9jb3VudGVyc19pbl9wYXRoICgKKyAgICAgICAgICAgICAgc3RydWN0IHBhdGggKiBwX3Nfc2VhcmNoX3BhdGgKKyAgICAgICAgICAgICkgeworICBpbnQgbl9wYXRoX29mZnNldCA9IHBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGg7CisKKyAgUkZBTFNFKCBuX3BhdGhfb2Zmc2V0IDwgSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUIHx8CisJICBuX3BhdGhfb2Zmc2V0ID4gRVhURU5ERURfTUFYX0hFSUdIVCAtIDEsCisJICAiUEFQLTUwODA6IGludmFsaWQgcGF0aCBvZmZzZXQgb2YgJWQiLCBuX3BhdGhfb2Zmc2V0KTsKKworICB3aGlsZSAoIG5fcGF0aF9vZmZzZXQgPiBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQgKSB7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisKKyAgICBiaCA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3NlYXJjaF9wYXRoLCBuX3BhdGhfb2Zmc2V0LS0pOworICAgIGRlY3JlbWVudF9iY291bnQgKGJoKTsKKyAgfQorICBwX3Nfc2VhcmNoX3BhdGgtPnBhdGhfbGVuZ3RoID0gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUOworfQorCisKK2ludCByZWlzZXJmc19jaGVja19wYXRoKHN0cnVjdCBwYXRoICpwKSB7CisgIFJGQUxTRSggcC0+cGF0aF9sZW5ndGggIT0gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VULAorCSAgInBhdGggbm90IHByb3Blcmx5IHJlbHNlZCIpIDsKKyAgcmV0dXJuIDAgOworfQorCisKKy8qIFJlbGVhc2UgYWxsIGJ1ZmZlcnMgaW4gdGhlIHBhdGguIFJlc3RvcmUgZGlydHkgYml0cyBjbGVhbgorKiogd2hlbiBwcmVwYXJpbmcgdGhlIGJ1ZmZlciBmb3IgdGhlIGxvZworKioKKyoqIG9ubHkgY2FsbGVkIGZyb20gZml4X25vZGVzKCkKKyovCit2b2lkICBwYXRocmVsc2VfYW5kX3Jlc3RvcmUgKAorCXN0cnVjdCBzdXBlcl9ibG9jayAqcywgCisgICAgICAgIHN0cnVjdCBwYXRoICogcF9zX3NlYXJjaF9wYXRoCisgICAgICApIHsKKyAgaW50IG5fcGF0aF9vZmZzZXQgPSBwX3Nfc2VhcmNoX3BhdGgtPnBhdGhfbGVuZ3RoOworCisgIFJGQUxTRSggbl9wYXRoX29mZnNldCA8IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCwgCisJICAiY2xtLTQwMDA6IGludmFsaWQgcGF0aCBvZmZzZXQiKTsKKyAgCisgIHdoaWxlICggbl9wYXRoX29mZnNldCA+IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCApICB7CisgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIocywgUEFUSF9PRkZTRVRfUEJVRkZFUihwX3Nfc2VhcmNoX3BhdGgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fcGF0aF9vZmZzZXQpKTsKKyAgICBicmVsc2UoUEFUSF9PRkZTRVRfUEJVRkZFUihwX3Nfc2VhcmNoX3BhdGgsIG5fcGF0aF9vZmZzZXQtLSkpOworICB9CisgIHBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGggPSBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQ7Cit9CisKKy8qIFJlbGVhc2UgYWxsIGJ1ZmZlcnMgaW4gdGhlIHBhdGguICovCit2b2lkICBwYXRocmVsc2UgKAorICAgICAgICBzdHJ1Y3QgcGF0aCAqIHBfc19zZWFyY2hfcGF0aAorICAgICAgKSB7CisgIGludCBuX3BhdGhfb2Zmc2V0ID0gcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aDsKKworICBSRkFMU0UoIG5fcGF0aF9vZmZzZXQgPCBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQsCisJICAiUEFQLTUwOTA6IGludmFsaWQgcGF0aCBvZmZzZXQiKTsKKyAgCisgIHdoaWxlICggbl9wYXRoX29mZnNldCA+IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCApICAKKyAgICBicmVsc2UoUEFUSF9PRkZTRVRfUEJVRkZFUihwX3Nfc2VhcmNoX3BhdGgsIG5fcGF0aF9vZmZzZXQtLSkpOworCisgIHBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGggPSBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQ7Cit9CisKKworCitzdGF0aWMgaW50IGlzX2xlYWYgKGNoYXIgKiBidWYsIGludCBibG9ja3NpemUsIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQoreworICAgIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7CisgICAgaW50IHVzZWRfc3BhY2U7CisgICAgaW50IHByZXZfbG9jYXRpb247CisgICAgaW50IGk7CisgICAgaW50IG5yOworCisgICAgYmxraCA9IChzdHJ1Y3QgYmxvY2tfaGVhZCAqKWJ1ZjsKKyAgICBpZiAoIGJsa2hfbGV2ZWwoYmxraCkgIT0gRElTS19MRUFGX05PREVfTEVWRUwpIHsKKwlyZWlzZXJmc193YXJuaW5nIChOVUxMLCAiaXNfbGVhZjogdGhpcyBzaG91bGQgYmUgY2F1Z2h0IGVhcmxpZXIiKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKKyAgICBpZiAobnIgPCAxIHx8IG5yID4gKChibG9ja3NpemUgLSBCTEtIX1NJWkUpIC8gKElIX1NJWkUgKyBNSU5fSVRFTV9MRU4pKSkgeworCS8qIGl0ZW0gbnVtYmVyIGlzIHRvbyBiaWcgb3IgdG9vIHNtYWxsICovCisJcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImlzX2xlYWY6IG5yX2l0ZW0gc2VlbXMgd3Jvbmc6ICV6IiwgYmgpOworCXJldHVybiAwOworICAgIH0KKyAgICBpaCA9IChzdHJ1Y3QgaXRlbV9oZWFkICopKGJ1ZiArIEJMS0hfU0laRSkgKyBuciAtIDE7CisgICAgdXNlZF9zcGFjZSA9IEJMS0hfU0laRSArIElIX1NJWkUgKiBuciArIChibG9ja3NpemUgLSBpaF9sb2NhdGlvbiAoaWgpKTsKKyAgICBpZiAodXNlZF9zcGFjZSAhPSBibG9ja3NpemUgLSBibGtoX2ZyZWVfc3BhY2UoYmxraCkpIHsKKwkvKiBmcmVlIHNwYWNlIGRvZXMgbm90IG1hdGNoIHRvIGNhbGN1bGF0ZWQgYW1vdW50IG9mIHVzZSBzcGFjZSAqLworCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19sZWFmOiBmcmVlIHNwYWNlIHNlZW1zIHdyb25nOiAleiIsIGJoKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogaXQgaXNfbGVhZiB3aWxsIGhpdCBwZXJmb3JtYW5jZSB0b28gbXVjaCAtIHdlIG1heSBoYXZlCisgICAgLy8gcmV0dXJuIDEgaGVyZQorCisgICAgLyogY2hlY2sgdGFibGVzIG9mIGl0ZW0gaGVhZHMgKi8KKyAgICBpaCA9IChzdHJ1Y3QgaXRlbV9oZWFkICopKGJ1ZiArIEJMS0hfU0laRSk7CisgICAgcHJldl9sb2NhdGlvbiA9IGJsb2Nrc2l6ZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnI7IGkgKyssIGloICsrKSB7CisJaWYgKCBsZV9paF9rX3R5cGUoaWgpID09IFRZUEVfQU5ZKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19sZWFmOiB3cm9uZyBpdGVtIHR5cGUgZm9yIGl0ZW0gJWgiLGloKTsKKwkgICAgcmV0dXJuIDA7CisJfQorCWlmIChpaF9sb2NhdGlvbiAoaWgpID49IGJsb2Nrc2l6ZSB8fCBpaF9sb2NhdGlvbiAoaWgpIDwgSUhfU0laRSAqIG5yKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19sZWFmOiBpdGVtIGxvY2F0aW9uIHNlZW1zIHdyb25nOiAlaCIsIGloKTsKKwkgICAgcmV0dXJuIDA7CisJfQorCWlmIChpaF9pdGVtX2xlbiAoaWgpIDwgMSB8fCBpaF9pdGVtX2xlbiAoaWgpID4gTUFYX0lURU1fTEVOIChibG9ja3NpemUpKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19sZWFmOiBpdGVtIGxlbmd0aCBzZWVtcyB3cm9uZzogJWgiLCBpaCk7CisJICAgIHJldHVybiAwOworCX0KKwlpZiAocHJldl9sb2NhdGlvbiAtIGloX2xvY2F0aW9uIChpaCkgIT0gaWhfaXRlbV9sZW4gKGloKSkgeworCSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiaXNfbGVhZjogaXRlbSBsb2NhdGlvbiBzZWVtcyB3cm9uZyAoc2Vjb25kIG9uZSk6ICVoIiwgaWgpOworCSAgICByZXR1cm4gMDsKKwl9CisJcHJldl9sb2NhdGlvbiA9IGloX2xvY2F0aW9uIChpaCk7CisgICAgfQorCisgICAgLy8gb25lIG1heSBpbWFnaW5lIG11Y2ggbW9yZSBjaGVja3MKKyAgICByZXR1cm4gMTsKK30KKworCisvKiByZXR1cm5zIDEgaWYgYnVmIGxvb2tzIGxpa2UgYW4gaW50ZXJuYWwgbm9kZSwgMCBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbnQgaXNfaW50ZXJuYWwgKGNoYXIgKiBidWYsIGludCBibG9ja3NpemUsIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQoreworICAgIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKKyAgICBpbnQgbnI7CisgICAgaW50IHVzZWRfc3BhY2U7CisKKyAgICBibGtoID0gKHN0cnVjdCBibG9ja19oZWFkICopYnVmOworICAgIG5yID0gYmxraF9sZXZlbChibGtoKTsKKyAgICBpZiAobnIgPD0gRElTS19MRUFGX05PREVfTEVWRUwgfHwgbnIgPiBNQVhfSEVJR0hUKSB7CisJLyogdGhpcyBsZXZlbCBpcyBub3QgcG9zc2libGUgZm9yIGludGVybmFsIG5vZGVzICovCisJcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImlzX2ludGVybmFsOiB0aGlzIHNob3VsZCBiZSBjYXVnaHQgZWFybGllciIpOworCXJldHVybiAwOworICAgIH0KKyAgICAKKyAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKKyAgICBpZiAobnIgPiAoYmxvY2tzaXplIC0gQkxLSF9TSVpFIC0gRENfU0laRSkgLyAoS0VZX1NJWkUgKyBEQ19TSVpFKSkgeworCS8qIGZvciBpbnRlcm5hbCB3aGljaCBpcyBub3Qgcm9vdCB3ZSBtaWdodCBjaGVjayBtaW4gbnVtYmVyIG9mIGtleXMgKi8KKwlyZWlzZXJmc193YXJuaW5nIChOVUxMLCAiaXNfaW50ZXJuYWw6IG51bWJlciBvZiBrZXkgc2VlbXMgd3Jvbmc6ICV6IiwgYmgpOworCXJldHVybiAwOworICAgIH0KKworICAgIHVzZWRfc3BhY2UgPSBCTEtIX1NJWkUgKyBLRVlfU0laRSAqIG5yICsgRENfU0laRSAqIChuciArIDEpOworICAgIGlmICh1c2VkX3NwYWNlICE9IGJsb2Nrc2l6ZSAtIGJsa2hfZnJlZV9zcGFjZShibGtoKSkgeworCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19pbnRlcm5hbDogZnJlZSBzcGFjZSBzZWVtcyB3cm9uZzogJXoiLCBiaCk7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gb25lIG1heSBpbWFnaW5lIG11Y2ggbW9yZSBjaGVja3MKKyAgICByZXR1cm4gMTsKK30KKworCisvLyBtYWtlIHN1cmUgdGhhdCBiaCBjb250YWlucyBmb3JtYXR0ZWQgbm9kZSBvZiByZWlzZXJmcyB0cmVlIG9mCisvLyAnbGV2ZWwnLXRoIGxldmVsCitzdGF0aWMgaW50IGlzX3RyZWVfbm9kZSAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIGludCBsZXZlbCkKK3sKKyAgICBpZiAoQl9MRVZFTCAoYmgpICE9IGxldmVsKSB7CisJcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImlzX3RyZWVfbm9kZTogbm9kZSBsZXZlbCAlZCBkb2VzIG5vdCBtYXRjaCB0byB0aGUgZXhwZWN0ZWQgb25lICVkIiwKKwkJQl9MRVZFTCAoYmgpLCBsZXZlbCk7CisJcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChsZXZlbCA9PSBESVNLX0xFQUZfTk9ERV9MRVZFTCkKKwlyZXR1cm4gaXNfbGVhZiAoYmgtPmJfZGF0YSwgYmgtPmJfc2l6ZSwgYmgpOworCisgICAgcmV0dXJuIGlzX2ludGVybmFsIChiaC0+Yl9kYXRhLCBiaC0+Yl9zaXplLCBiaCk7Cit9CisKKworCisjZGVmaW5lIFNFQVJDSF9CWV9LRVlfUkVBREEgMTYKKworLyogVGhlIGZ1bmN0aW9uIGlzIE5PVCBTQ0hFRFVMRS1TQUZFISAqLworc3RhdGljIHZvaWQgc2VhcmNoX2J5X2tleV9yZWFkYSAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLAorCQkJCSB1bnNpZ25lZCBsb25nICpiLCBpbnQgbnVtKQoreworICAgIGludCBpLGo7CisgIAorICAgIGZvciAoaSA9IDAgOyBpIDwgbnVtIDsgaSsrKSB7CisJYmhbaV0gPSBzYl9nZXRibGsgKHMsIGJbaV0pOworICAgIH0KKyAgICBmb3IgKGogPSAwIDsgaiA8IGkgOyBqKyspIHsKKwkvKgorCSAqIG5vdGUsIHRoaXMgbmVlZHMgYXR0ZW50aW9uIGlmIHdlIGFyZSBnZXR0aW5nIHJpZCBvZiB0aGUgQktMCisJICogeW91IGhhdmUgdG8gbWFrZSBzdXJlIHRoZSBwcmVwYXJlZCBiaXQgaXNuJ3Qgc2V0IG9uIHRoaXMgYnVmZmVyCisJICovCisJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmhbal0pKQorCSAgICBsbF9yd19ibG9jayhSRUFEQSwgMSwgYmggKyBqKTsKKyAgICAJYnJlbHNlKGJoW2pdKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWxnb3JpdGhtICAgU2VhcmNoQnlLZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICBsb29rIGZvciBpdGVtIGluIHRoZSBEaXNrIFMrVHJlZSBieSBpdHMga2V5ICAgICAgICAgICAgICAgICoKKyAqIElucHV0OiAgcF9zX3NiICAgLSAgc3VwZXIgYmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICBwX3Nfa2V5ICAtIHBvaW50ZXIgdG8gdGhlIGtleSB0byBzZWFyY2ggICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBPdXRwdXQ6IElURU1fRk9VTkQsIElURU1fTk9UX0ZPVU5EIG9yIElPX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgcF9zX3NlYXJjaF9wYXRoIC0gcGF0aCBmcm9tIHRoZSByb290IHRvIHRoZSBuZWVkZWQgbGVhZiAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGlzIGZ1bmN0aW9uIGZpbGxzIHVwIHRoZSBwYXRoIGZyb20gdGhlIHJvb3QgdG8gdGhlIGxlYWYgYXMgaXQKKyAgIGRlc2NlbmRzIHRoZSB0cmVlIGxvb2tpbmcgZm9yIHRoZSBrZXkuICBJdCB1c2VzIHJlaXNlcmZzX2JyZWFkIHRvCisgICB0cnkgdG8gZmluZCBidWZmZXJzIGluIHRoZSBjYWNoZSBnaXZlbiB0aGVpciBibG9jayBudW1iZXIuICBJZiBpdAorICAgZG9lcyBub3QgZmluZCB0aGVtIGluIHRoZSBjYWNoZSBpdCByZWFkcyB0aGVtIGZyb20gZGlzay4gIEZvciBlYWNoCisgICBub2RlIHNlYXJjaF9ieV9rZXkgZmluZHMgdXNpbmcgcmVpc2VyZnNfYnJlYWQgaXQgdGhlbiB1c2VzCisgICBiaW5fc2VhcmNoIHRvIGxvb2sgdGhyb3VnaCB0aGF0IG5vZGUuICBiaW5fc2VhcmNoIHdpbGwgZmluZCB0aGUKKyAgIHBvc2l0aW9uIG9mIHRoZSBibG9ja19udW1iZXIgb2YgdGhlIG5leHQgbm9kZSBpZiBpdCBpcyBsb29raW5nCisgICB0aHJvdWdoIGFuIGludGVybmFsIG5vZGUuICBJZiBpdCBpcyBsb29raW5nIHRocm91Z2ggYSBsZWFmIG5vZGUKKyAgIGJpbl9zZWFyY2ggd2lsbCBmaW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbSB3aGljaCBoYXMga2V5IGVpdGhlcgorICAgZXF1YWwgdG8gZ2l2ZW4ga2V5LCBvciB3aGljaCBpcyB0aGUgbWF4aW1hbCBrZXkgbGVzcyB0aGFuIHRoZSBnaXZlbgorICAga2V5LiAgc2VhcmNoX2J5X2tleSByZXR1cm5zIGEgcGF0aCB0aGF0IG11c3QgYmUgY2hlY2tlZCBmb3IgdGhlCisgICBjb3JyZWN0bmVzcyBvZiB0aGUgdG9wIG9mIHRoZSBwYXRoIGJ1dCBuZWVkIG5vdCBiZSBjaGVja2VkIGZvciB0aGUKKyAgIGNvcnJlY3RuZXNzIG9mIHRoZSBib3R0b20gb2YgdGhlIHBhdGggKi8KKy8qIFRoZSBmdW5jdGlvbiBpcyBOT1QgU0NIRURVTEUtU0FGRSEgKi8KK2ludCBzZWFyY2hfYnlfa2V5IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IsCisJCSAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICogcF9zX2tleSwgLyogS2V5IHRvIHNlYXJjaC4gKi8KKwkJICAgc3RydWN0IHBhdGggKiBwX3Nfc2VhcmNoX3BhdGgsIC8qIFRoaXMgc3RydWN0dXJlIHdhcworCQkJCQkJICAgICBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkCisJCQkJCQkgICAgIGJ5IHRoZSBjYWxsaW5nCisJCQkJCQkgICAgIGZ1bmN0aW9uLiBJdCBpcyBmaWxsZWQgdXAKKwkJCQkJCSAgICAgYnkgdGhpcyBmdW5jdGlvbi4gICovCisJCSAgIGludCBuX3N0b3BfbGV2ZWwgLyogSG93IGZhciBkb3duIHRoZSB0cmVlIHRvIHNlYXJjaC4gVG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AgYXQgbGVhZiBsZXZlbCAtIHNldCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTS19MRUFGX05PREVfTEVWRUwgKi8KKyAgICApIHsKKyAgICBpbnQgIG5fYmxvY2tfbnVtYmVyOworICAgIGludCAgZXhwZWN0ZWRfbGV2ZWw7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqICAgICAgIHBfc19iaDsKKyAgICBzdHJ1Y3QgcGF0aF9lbGVtZW50ICogICAgICAgcF9zX2xhc3RfZWxlbWVudDsKKyAgICBpbnQJCQkJbl9ub2RlX2xldmVsLCBuX3JldHZhbDsKKyAgICBpbnQgCQkJcmlnaHRfbmVpZ2hib3Jfb2ZfbGVhZl9ub2RlOworICAgIGludAkJCQlmc19nZW47CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpyZWFkYV9iaFtTRUFSQ0hfQllfS0VZX1JFQURBXTsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgcmVhZGFfYmxvY2tzW1NFQVJDSF9CWV9LRVlfUkVBREFdOworICAgIGludCByZWFkYV9jb3VudCA9IDA7CisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKyAgICBpbnQgbl9yZXBlYXRfY291bnRlciA9IDA7CisjZW5kaWYKKyAgICAKKyAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIHNlYXJjaF9ieV9rZXkgKTsKKyAgICAKKyAgICAvKiBBcyB3ZSBhZGQgZWFjaCBub2RlIHRvIGEgcGF0aCB3ZSBpbmNyZWFzZSBpdHMgY291bnQuICBUaGlzIG1lYW5zIHRoYXQKKyAgICAgICB3ZSBtdXN0IGJlIGNhcmVmdWwgdG8gcmVsZWFzZSBhbGwgbm9kZXMgaW4gYSBwYXRoIGJlZm9yZSB3ZSBlaXRoZXIKKyAgICAgICBkaXNjYXJkIHRoZSBwYXRoIHN0cnVjdCBvciByZS11c2UgdGhlIHBhdGggc3RydWN0LCBhcyB3ZSBkbyBoZXJlLiAqLworCisgICAgZGVjcmVtZW50X2NvdW50ZXJzX2luX3BhdGgocF9zX3NlYXJjaF9wYXRoKTsKKworICAgIHJpZ2h0X25laWdoYm9yX29mX2xlYWZfbm9kZSA9IDA7CisKKyAgICAvKiBXaXRoIGVhY2ggaXRlcmF0aW9uIG9mIHRoaXMgbG9vcCB3ZSBzZWFyY2ggdGhyb3VnaCB0aGUgaXRlbXMgaW4gdGhlCisgICAgICAgY3VycmVudCBub2RlLCBhbmQgY2FsY3VsYXRlIHRoZSBuZXh0IGN1cnJlbnQgbm9kZShuZXh0IHBhdGggZWxlbWVudCkKKyAgICAgICBmb3IgdGhlIG5leHQgaXRlcmF0aW9uIG9mIHRoaXMgbG9vcC4uICovCisgICAgbl9ibG9ja19udW1iZXIgPSBTQl9ST09UX0JMT0NLIChwX3Nfc2IpOworICAgIGV4cGVjdGVkX2xldmVsID0gLTE7CisgICAgd2hpbGUgKCAxICkgeworCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJaWYgKCAhKCsrbl9yZXBlYXRfY291bnRlciAlIDUwMDAwKSApCisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgIlBBUC01MTAwOiBzZWFyY2hfYnlfa2V5OiAlczoiCisJCQkgICAgICAidGhlcmUgd2VyZSAlZCBpdGVyYXRpb25zIG9mIHdoaWxlIGxvb3AgIgorCQkJICAgICAgImxvb2tpbmcgZm9yIGtleSAlSyIsCisJCQkgICAgICBjdXJyZW50LT5jb21tLCBuX3JlcGVhdF9jb3VudGVyLCBwX3Nfa2V5KTsKKyNlbmRpZgorCisJLyogcHJlcCBwYXRoIHRvIGhhdmUgYW5vdGhlciBlbGVtZW50IGFkZGVkIHRvIGl0LiAqLworCXBfc19sYXN0X2VsZW1lbnQgPSBQQVRIX09GRlNFVF9QRUxFTUVOVChwX3Nfc2VhcmNoX3BhdGgsICsrcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aCk7CisJZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24gKHBfc19zYik7CisKKwkvKiBSZWFkIHRoZSBuZXh0IHRyZWUgbm9kZSwgYW5kIHNldCB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBwYXRoIHRvCisgICAgICAgICAgIGhhdmUgYSBwb2ludGVyIHRvIGl0LiAqLworCWlmICgocF9zX2JoID0gcF9zX2xhc3RfZWxlbWVudC0+cGVfYnVmZmVyID0KKwkgICAgIHNiX2dldGJsayhwX3Nfc2IsIG5fYmxvY2tfbnVtYmVyKSkgKSB7CisJICAgIGlmICghYnVmZmVyX3VwdG9kYXRlKHBfc19iaCkgJiYgcmVhZGFfY291bnQgPiAxKSB7CisJCXNlYXJjaF9ieV9rZXlfcmVhZGEgKHBfc19zYiwgcmVhZGFfYmgsCisJCSAgICAgICAgICAgICAgICAgICAgIHJlYWRhX2Jsb2NrcywgcmVhZGFfY291bnQpOworCSAgICB9CisJICAgIGxsX3J3X2Jsb2NrKFJFQUQsIDEsICZwX3NfYmgpOworCSAgICB3YWl0X29uX2J1ZmZlcihwX3NfYmgpOworCSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShwX3NfYmgpKQorCSAgICAgICAgZ290byBpb19lcnJvcjsKKwl9IGVsc2UgeworaW9fZXJyb3I6CisJICAgIHBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGggLS07CisJICAgIHBhdGhyZWxzZShwX3Nfc2VhcmNoX3BhdGgpOworCSAgICByZXR1cm4gSU9fRVJST1I7CisJfQorCXJlYWRhX2NvdW50ID0gMDsKKwlpZiAoZXhwZWN0ZWRfbGV2ZWwgPT0gLTEpCisJCWV4cGVjdGVkX2xldmVsID0gU0JfVFJFRV9IRUlHSFQgKHBfc19zYik7CisJZXhwZWN0ZWRfbGV2ZWwgLS07CisKKwkvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHNjaGVkdWxlIG9jY3VycmVkLiBXZSBtdXN0IGNoZWNrIHdoZXRoZXIgdGhlIGtleQorCSAgIHRvIHNlYXJjaCBpcyBzdGlsbCBpbiB0aGUgdHJlZSByb290ZWQgZnJvbSB0aGUgY3VycmVudCBidWZmZXIuIElmCisJICAgbm90IHRoZW4gcmVwZWF0IHNlYXJjaCBmcm9tIHRoZSByb290LiAqLworCWlmICggZnNfY2hhbmdlZCAoZnNfZ2VuLCBwX3Nfc2IpICYmIAorCSAgICAoIUJfSVNfSU5fVFJFRSAocF9zX2JoKSB8fAorCSAgICAgQl9MRVZFTChwX3NfYmgpICE9IGV4cGVjdGVkX2xldmVsIHx8CisJICAgICAha2V5X2luX2J1ZmZlcihwX3Nfc2VhcmNoX3BhdGgsIHBfc19rZXksIHBfc19zYikpKSB7CisJICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgc2VhcmNoX2J5X2tleV9mc19jaGFuZ2VkICk7CisJICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgc2VhcmNoX2J5X2tleV9yZXN0YXJ0ZWQgKTsKKwkgICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBzYmtfcmVzdGFydGVkWyBleHBlY3RlZF9sZXZlbCAtIDEgXSApOworCSAgICBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aChwX3Nfc2VhcmNoX3BhdGgpOworCSAgICAKKwkgICAgLyogR2V0IHRoZSByb290IGJsb2NrIG51bWJlciBzbyB0aGF0IHdlIGNhbiByZXBlYXQgdGhlIHNlYXJjaAorCSAgICAgICBzdGFydGluZyBmcm9tIHRoZSByb290LiAqLworCSAgICBuX2Jsb2NrX251bWJlciA9IFNCX1JPT1RfQkxPQ0sgKHBfc19zYik7CisJICAgIGV4cGVjdGVkX2xldmVsID0gLTE7CisJICAgIHJpZ2h0X25laWdoYm9yX29mX2xlYWZfbm9kZSA9IDA7CisJICAgIAorCSAgICAvKiByZXBlYXQgc2VhcmNoIGZyb20gdGhlIHJvb3QgKi8KKwkgICAgY29udGludWU7CisJfQorCisgICAgICAgIC8qIG9ubHkgY2hlY2sgdGhhdCB0aGUga2V5IGlzIGluIHRoZSBidWZmZXIgaWYgcF9zX2tleSBpcyBub3QKKyAgICAgICAgICAgZXF1YWwgdG8gdGhlIE1BWF9LRVkuIExhdHRlciBjYXNlIGlzIG9ubHkgcG9zc2libGUgaW4KKyAgICAgICAgICAgImZpbmlzaF91bmZpbmlzaGVkKCkiIHByb2Nlc3NpbmcgZHVyaW5nIG1vdW50LiAqLworICAgICAgICBSRkFMU0UoIGNvbXBfa2V5cyggJk1BWF9LRVksIHBfc19rZXkgKSAmJgorICAgICAgICAgICAgICAgICEga2V5X2luX2J1ZmZlcihwX3Nfc2VhcmNoX3BhdGgsIHBfc19rZXksIHBfc19zYiksCisJCSJQQVAtNTEzMDoga2V5IGlzIG5vdCBpbiB0aGUgYnVmZmVyIik7CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJaWYgKCBjdXJfdGIgKSB7CisJICAgIHByaW50X2N1cl90YiAoIjUxNDAiKTsKKwkgICAgcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiUEFQLTUxNDA6IHNlYXJjaF9ieV9rZXk6IHNjaGVkdWxlIG9jY3VycmVkIGluIGRvX2JhbGFuY2UhIik7CisJfQorI2VuZGlmCisKKwkvLyBtYWtlIHN1cmUsIHRoYXQgdGhlIG5vZGUgY29udGVudHMgbG9vayBsaWtlIGEgbm9kZSBvZgorCS8vIGNlcnRhaW4gbGV2ZWwKKwlpZiAoIWlzX3RyZWVfbm9kZSAocF9zX2JoLCBleHBlY3RlZF9sZXZlbCkpIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAidnMtNTE1MDogc2VhcmNoX2J5X2tleTogIgorCQkJICAgICAgImludmFsaWQgZm9ybWF0IGZvdW5kIGluIGJsb2NrICVsZC4gRnNjaz8iLAorCQkJICAgICAgcF9zX2JoLT5iX2Jsb2NrbnIpOworCSAgICBwYXRocmVsc2UgKHBfc19zZWFyY2hfcGF0aCk7CisJICAgIHJldHVybiBJT19FUlJPUjsKKwl9CisJCisJLyogb2ssIHdlIGhhdmUgYWNxdWlyZWQgbmV4dCBmb3JtYXR0ZWQgbm9kZSBpbiB0aGUgdHJlZSAqLworCW5fbm9kZV9sZXZlbCA9IEJfTEVWRUwgKHBfc19iaCk7CisKKwlQUk9DX0lORk9fQkhfU1RBVCggcF9zX3NiLCBwX3NfYmgsIG5fbm9kZV9sZXZlbCAtIDEgKTsKKworCVJGQUxTRSggbl9ub2RlX2xldmVsIDwgbl9zdG9wX2xldmVsLAorCQkidnMtNTE1MjogdHJlZSBsZXZlbCAoJWQpIGlzIGxlc3MgdGhhbiBzdG9wIGxldmVsICglZCkiLAorCQluX25vZGVfbGV2ZWwsIG5fc3RvcF9sZXZlbCk7CisKKwluX3JldHZhbCA9IGJpbl9zZWFyY2goIHBfc19rZXksIEJfTl9QSVRFTV9IRUFEKHBfc19iaCwgMCksCisgICAgICAgICAgICAgICAgQl9OUl9JVEVNUyhwX3NfYmgpLAorICAgICAgICAgICAgICAgICggbl9ub2RlX2xldmVsID09IERJU0tfTEVBRl9OT0RFX0xFVkVMICkgPyBJSF9TSVpFIDogS0VZX1NJWkUsCisgICAgICAgICAgICAgICAgJihwX3NfbGFzdF9lbGVtZW50LT5wZV9wb3NpdGlvbikpOworCWlmIChuX25vZGVfbGV2ZWwgPT0gbl9zdG9wX2xldmVsKSB7CisJICAgIHJldHVybiBuX3JldHZhbDsKKwl9CisKKwkvKiB3ZSBhcmUgbm90IGluIHRoZSBzdG9wIGxldmVsICovCisJaWYgKG5fcmV0dmFsID09IElURU1fRk9VTkQpCisJICAgIC8qIGl0ZW0gaGFzIGJlZW4gZm91bmQsIHNvIHdlIGNob29zZSB0aGUgcG9pbnRlciB3aGljaCBpcyB0byB0aGUgcmlnaHQgb2YgdGhlIGZvdW5kIG9uZSAqLworCSAgICBwX3NfbGFzdF9lbGVtZW50LT5wZV9wb3NpdGlvbisrOworCisJLyogaWYgaXRlbSB3YXMgbm90IGZvdW5kIHdlIGNob29zZSB0aGUgcG9zaXRpb24gd2hpY2ggaXMgdG8KKwkgICB0aGUgbGVmdCBvZiB0aGUgZm91bmQgaXRlbS4gVGhpcyByZXF1aXJlcyBubyBjb2RlLAorCSAgIGJpbl9zZWFyY2ggZGlkIGl0IGFscmVhZHkuKi8KKworCS8qIFNvIHdlIGhhdmUgY2hvc2VuIGEgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgbm9kZSB3aGljaCBpcworCSAgIGFuIGludGVybmFsIG5vZGUuICBOb3cgd2UgY2FsY3VsYXRlIGNoaWxkIGJsb2NrIG51bWJlciBieQorCSAgIHBvc2l0aW9uIGluIHRoZSBub2RlLiAqLworCW5fYmxvY2tfbnVtYmVyID0gQl9OX0NISUxEX05VTShwX3NfYmgsIHBfc19sYXN0X2VsZW1lbnQtPnBlX3Bvc2l0aW9uKTsKKworCS8qIGlmIHdlIGFyZSBnb2luZyB0byByZWFkIGxlYWYgbm9kZXMsIHRyeSBmb3IgcmVhZCBhaGVhZCBhcyB3ZWxsICovCisJaWYgKChwX3Nfc2VhcmNoX3BhdGgtPnJlYWRhICYgUEFUSF9SRUFEQSkgJiYKKwkgICAgbl9ub2RlX2xldmVsID09IERJU0tfTEVBRl9OT0RFX0xFVkVMICsgMSkKKwl7CisJICAgIGludCBwb3MgPSBwX3NfbGFzdF9lbGVtZW50LT5wZV9wb3NpdGlvbjsKKwkgICAgaW50IGxpbWl0ID0gQl9OUl9JVEVNUyhwX3NfYmgpOworCSAgICBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICpsZV9rZXk7CisKKwkgICAgaWYgKHBfc19zZWFyY2hfcGF0aC0+cmVhZGEgJiBQQVRIX1JFQURBX0JBQ0spCisJCWxpbWl0ID0gMDsKKwkgICAgd2hpbGUocmVhZGFfY291bnQgPCBTRUFSQ0hfQllfS0VZX1JFQURBKSB7CisJCWlmIChwb3MgPT0gbGltaXQpCisJCSAgICBicmVhazsKKwkgICAgICAgIHJlYWRhX2Jsb2Nrc1tyZWFkYV9jb3VudCsrXSA9IEJfTl9DSElMRF9OVU0ocF9zX2JoLCBwb3MpOworCQlpZiAocF9zX3NlYXJjaF9wYXRoLT5yZWFkYSAmIFBBVEhfUkVBREFfQkFDSykKKwkJICAgIHBvcy0tOworCQllbHNlCisJCSAgICBwb3MrKzsKKworCQkvKgorCQkgKiBjaGVjayB0byBtYWtlIHN1cmUgd2UncmUgaW4gdGhlIHNhbWUgb2JqZWN0CisJCSAqLworCQlsZV9rZXkgPSBCX05fUERFTElNX0tFWShwX3NfYmgsIHBvcyk7CisJCWlmIChsZTMyX3RvX2NwdShsZV9rZXktPmtfb2JqZWN0aWQpICE9CisJCSAgICBwX3Nfa2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkKQorCQl7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyogRm9ybSB0aGUgcGF0aCB0byBhbiBpdGVtIGFuZCBwb3NpdGlvbiBpbiB0aGlzIGl0ZW0gd2hpY2ggY29udGFpbnMKKyAgIGZpbGUgYnl0ZSBkZWZpbmVkIGJ5IHBfc19rZXkuIElmIHRoZXJlIGlzIG5vIHN1Y2ggaXRlbQorICAgY29ycmVzcG9uZGluZyB0byB0aGUga2V5LCB3ZSBwb2ludCB0aGUgcGF0aCB0byB0aGUgaXRlbSB3aXRoCisgICBtYXhpbWFsIGtleSBsZXNzIHRoYW4gcF9zX2tleSwgYW5kICpwX25fcG9zX2luX2l0ZW0gaXMgc2V0IHRvIG9uZQorICAgcGFzdCB0aGUgbGFzdCBlbnRyeS9ieXRlIGluIHRoZSBpdGVtLiAgSWYgc2VhcmNoaW5nIGZvciBlbnRyeSBpbiBhCisgICBkaXJlY3RvcnkgaXRlbSwgYW5kIGl0IGlzIG5vdCBmb3VuZCwgKnBfbl9wb3NfaW5faXRlbSBpcyBzZXQgdG8gb25lCisgICBlbnRyeSBtb3JlIHRoYW4gdGhlIGVudHJ5IHdpdGggbWF4aW1hbCBrZXkgd2hpY2ggaXMgbGVzcyB0aGFuIHRoZQorICAgc291Z2h0IGtleS4KKworICAgTm90ZSB0aGF0IGlmIHRoZXJlIGlzIG5vIGVudHJ5IGluIHRoaXMgc2FtZSBub2RlIHdoaWNoIGlzIG9uZSBtb3JlLAorICAgdGhlbiB3ZSBwb2ludCB0byBhbiBpbWFnaW5hcnkgZW50cnkuICBmb3IgZGlyZWN0IGl0ZW1zLCB0aGUKKyAgIHBvc2l0aW9uIGlzIGluIHVuaXRzIG9mIGJ5dGVzLCBmb3IgaW5kaXJlY3QgaXRlbXMgdGhlIHBvc2l0aW9uIGlzCisgICBpbiB1bml0cyBvZiBibG9ja25yIGVudHJpZXMsIGZvciBkaXJlY3RvcnkgaXRlbXMgdGhlIHBvc2l0aW9uIGlzIGluCisgICB1bml0cyBvZiBkaXJlY3RvcnkgZW50cmllcy4gICovCisKKy8qIFRoZSBmdW5jdGlvbiBpcyBOT1QgU0NIRURVTEUtU0FGRSEgKi8KK2ludCBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleSAoc3RydWN0IHN1cGVyX2Jsb2NrICAqIHBfc19zYiwgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBzdXBlciBibG9jay4gICAgICAgICAgKi8KKwkJCQljb25zdCBzdHJ1Y3QgY3B1X2tleSAgKiBwX2NwdV9rZXksICAgICAgLyogS2V5IHRvIHNlYXJjaCAoY3B1IHZhcmlhYmxlKSAgICAgICAgICovCisJCQkJc3RydWN0IHBhdGggICAgICAgICAqIHBfc19zZWFyY2hfcGF0aCAvKiBGaWxsZWQgdXAgYnkgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgKi8KKyAgICApIHsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICAgICogcF9sZV9paDsgLyogcG9pbnRlciB0byBvbi1kaXNrIHN0cnVjdHVyZSAqLworICAgIGludCAgICAgICAgICAgICAgICAgICBuX2Jsa19zaXplOworICAgIGxvZmZfdCBpdGVtX29mZnNldCwgb2Zmc2V0OworICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CisgICAgaW50IHJldHZhbDsKKworICAgIC8qIElmIHNlYXJjaGluZyBmb3IgZGlyZWN0b3J5IGVudHJ5LiAqLworICAgIGlmICggaXNfZGlyZW50cnlfY3B1X2tleSAocF9jcHVfa2V5KSApCisJcmV0dXJuICBzZWFyY2hfYnlfZW50cnlfa2V5IChwX3Nfc2IsIHBfY3B1X2tleSwgcF9zX3NlYXJjaF9wYXRoLCAmZGUpOworCisgICAgLyogSWYgbm90IHNlYXJjaGluZyBmb3IgZGlyZWN0b3J5IGVudHJ5LiAqLworICAgIAorICAgIC8qIElmIGl0ZW0gaXMgZm91bmQuICovCisgICAgcmV0dmFsID0gc2VhcmNoX2l0ZW0gKHBfc19zYiwgcF9jcHVfa2V5LCBwX3Nfc2VhcmNoX3BhdGgpOworICAgIGlmIChyZXR2YWwgPT0gSU9fRVJST1IpCisJcmV0dXJuIHJldHZhbDsKKyAgICBpZiAoIHJldHZhbCA9PSBJVEVNX0ZPVU5EICkgIHsKKworCVJGQUxTRSggISBpaF9pdGVtX2xlbigKKyAgICAgICAgICAgICAgICBCX05fUElURU1fSEVBRChQQVRIX1BMQVNUX0JVRkZFUihwX3Nfc2VhcmNoX3BhdGgpLAorCQkJICAgICAgIFBBVEhfTEFTVF9QT1NJVElPTihwX3Nfc2VhcmNoX3BhdGgpKSksCisJICAgICAgICAiUEFQLTUxNjU6IGl0ZW0gbGVuZ3RoIGVxdWFscyB6ZXJvIik7CisKKwlwb3NfaW5faXRlbShwX3Nfc2VhcmNoX3BhdGgpID0gMDsKKwlyZXR1cm4gUE9TSVRJT05fRk9VTkQ7CisgICAgfQorCisgICAgUkZBTFNFKCAhIFBBVEhfTEFTVF9QT1NJVElPTihwX3Nfc2VhcmNoX3BhdGgpLAorCSAgICAiUEFQLTUxNzA6IHBvc2l0aW9uIGVxdWFscyB6ZXJvIik7CisKKyAgICAvKiBJdGVtIGlzIG5vdCBmb3VuZC4gU2V0IHBhdGggdG8gdGhlIHByZXZpb3VzIGl0ZW0uICovCisgICAgcF9sZV9paCA9IEJfTl9QSVRFTV9IRUFEKFBBVEhfUExBU1RfQlVGRkVSKHBfc19zZWFyY2hfcGF0aCksIC0tUEFUSF9MQVNUX1BPU0lUSU9OKHBfc19zZWFyY2hfcGF0aCkpOworICAgIG5fYmxrX3NpemUgPSBwX3Nfc2ItPnNfYmxvY2tzaXplOworCisgICAgaWYgKGNvbXBfc2hvcnRfa2V5cyAoJihwX2xlX2loLT5paF9rZXkpLCBwX2NwdV9rZXkpKSB7CisJcmV0dXJuIEZJTEVfTk9UX0ZPVU5EOworICAgIH0KKworICAgIC8vIEZJWE1FOiBxdWl0ZSB1Z2x5IHRoaXMgZmFyCisKKyAgICBpdGVtX29mZnNldCA9IGxlX2loX2tfb2Zmc2V0IChwX2xlX2loKTsKKyAgICBvZmZzZXQgPSBjcHVfa2V5X2tfb2Zmc2V0IChwX2NwdV9rZXkpOworCisgICAgLyogTmVlZGVkIGJ5dGUgaXMgY29udGFpbmVkIGluIHRoZSBpdGVtIHBvaW50ZWQgdG8gYnkgdGhlIHBhdGguKi8KKyAgICBpZiAoaXRlbV9vZmZzZXQgPD0gb2Zmc2V0ICYmCisJaXRlbV9vZmZzZXQgKyBvcF9ieXRlc19udW1iZXIgKHBfbGVfaWgsIG5fYmxrX3NpemUpID4gb2Zmc2V0KSB7CisJcG9zX2luX2l0ZW0gKHBfc19zZWFyY2hfcGF0aCkgPSBvZmZzZXQgLSBpdGVtX29mZnNldDsKKwlpZiAoIGlzX2luZGlyZWN0X2xlX2loKHBfbGVfaWgpICkgeworCSAgICBwb3NfaW5faXRlbSAocF9zX3NlYXJjaF9wYXRoKSAvPSBuX2Jsa19zaXplOworCX0KKwlyZXR1cm4gUE9TSVRJT05fRk9VTkQ7CisgICAgfQorCisgICAgLyogTmVlZGVkIGJ5dGUgaXMgbm90IGNvbnRhaW5lZCBpbiB0aGUgaXRlbSBwb2ludGVkIHRvIGJ5IHRoZQorICAgICBwYXRoLiBTZXQgcG9zX2luX2l0ZW0gb3V0IG9mIHRoZSBpdGVtLiAqLworICAgIGlmICggaXNfaW5kaXJlY3RfbGVfaWggKHBfbGVfaWgpICkKKwlwb3NfaW5faXRlbSAocF9zX3NlYXJjaF9wYXRoKSA9IGloX2l0ZW1fbGVuKHBfbGVfaWgpIC8gVU5GTV9QX1NJWkU7CisgICAgZWxzZQorICAgICAgICBwb3NfaW5faXRlbSAocF9zX3NlYXJjaF9wYXRoKSA9IGloX2l0ZW1fbGVuKCBwX2xlX2loICk7CisgIAorICAgIHJldHVybiBQT1NJVElPTl9OT1RfRk9VTkQ7Cit9CisKKworLyogQ29tcGFyZSBnaXZlbiBpdGVtIGFuZCBpdGVtIHBvaW50ZWQgdG8gYnkgdGhlIHBhdGguICovCitpbnQgY29tcF9pdGVtcyAoY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqIHN0b3JlZF9paCwgY29uc3Qgc3RydWN0IHBhdGggKiBwX3NfcGF0aCkKK3sKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICogcF9zX2JoOworICAgIHN0cnVjdCBpdGVtX2hlYWQgICAgKiBpaDsKKworICAgIC8qIExhc3QgYnVmZmVyIGF0IHRoZSBwYXRoIGlzIG5vdCBpbiB0aGUgdHJlZS4gKi8KKyAgICBpZiAoICEgQl9JU19JTl9UUkVFKHBfc19iaCA9IFBBVEhfUExBU1RfQlVGRkVSKHBfc19wYXRoKSkgKQorCXJldHVybiAxOworCisgICAgLyogTGFzdCBwYXRoIHBvc2l0aW9uIGlzIGludmFsaWQuICovCisgICAgaWYgKCBQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3BhdGgpID49IEJfTlJfSVRFTVMocF9zX2JoKSApCisJcmV0dXJuIDE7CisKKyAgICAvKiB3ZSBuZWVkIG9ubHkgdG8ga25vdywgd2hldGhlciBpdCBpcyB0aGUgc2FtZSBpdGVtICovCisgICAgaWggPSBnZXRfaWggKHBfc19wYXRoKTsKKyAgICByZXR1cm4gbWVtY21wIChzdG9yZWRfaWgsIGloLCBJSF9TSVpFKTsKK30KKworCisvKiB1bmZvcm1hdHRlZCBub2RlcyBhcmUgbm90IGxvZ2dlZCBhbnltb3JlLCBldmVyLiAgVGhpcyBpcyBzYWZlCisqKiBub3cKKyovCisjZGVmaW5lIGhlbGRfYnlfb3RoZXJzKGJoKSAoYXRvbWljX3JlYWQoJihiaCktPmJfY291bnQpID4gMSkKKworLy8gYmxvY2sgY2FuIG5vdCBiZSBmb3Jnb3R0ZW4gYXMgaXQgaXMgaW4gSS9PIG9yIGhlbGQgYnkgc29tZW9uZQorI2RlZmluZSBibG9ja19pbl91c2UoYmgpIChidWZmZXJfbG9ja2VkKGJoKSB8fCAoaGVsZF9ieV9vdGhlcnMoYmgpKSkKKworCisKKy8vIHByZXBhcmUgZm9yIGRlbGV0ZSBvciBjdXQgb2YgZGlyZWN0IGl0ZW0KK3N0YXRpYyBpbmxpbmUgaW50IHByZXBhcmVfZm9yX2RpcmVjdF9pdGVtIChzdHJ1Y3QgcGF0aCAqIHBhdGgsCisJCQkJCSAgIHN0cnVjdCBpdGVtX2hlYWQgKiBsZV9paCwKKwkJCQkJICAgc3RydWN0IGlub2RlICogaW5vZGUsCisJCQkJCSAgIGxvZmZfdCBuZXdfZmlsZV9sZW5ndGgsCisJCQkJCSAgIGludCAqIGN1dF9zaXplKQoreworICAgIGxvZmZfdCByb3VuZF9sZW47CisKKworICAgIGlmICggbmV3X2ZpbGVfbGVuZ3RoID09IG1heF9yZWlzZXJmc19vZmZzZXQgKGlub2RlKSApIHsKKwkvKiBpdGVtIGhhcyB0byBiZSBkZWxldGVkICovCisJKmN1dF9zaXplID0gLShJSF9TSVpFICsgaWhfaXRlbV9sZW4obGVfaWgpKTsKKwlyZXR1cm4gTV9ERUxFVEU7CisgICAgfQorCQorICAgIC8vIG5ldyBmaWxlIGdldHMgdHJ1bmNhdGVkCisgICAgaWYgKGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSkgPT0gS0VZX0ZPUk1BVF8zXzYpIHsKKwkvLyAKKwlyb3VuZF9sZW4gPSBST1VORF9VUCAobmV3X2ZpbGVfbGVuZ3RoKTsgCisJLyogdGhpcyB3YXMgbl9uZXdfZmlsZV9sZW5ndGggPCBsZV9paCAuLi4gKi8KKwlpZiAoIHJvdW5kX2xlbiA8IGxlX2loX2tfb2Zmc2V0IChsZV9paCkgKSAgeworCSAgICAqY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbihsZV9paCkpOworCSAgICByZXR1cm4gTV9ERUxFVEU7IC8qIERlbGV0ZSB0aGlzIGl0ZW0uICovCisJfQorCS8qIENhbGN1bGF0ZSBmaXJzdCBwb3NpdGlvbiBhbmQgc2l6ZSBmb3IgY3V0dGluZyBmcm9tIGl0ZW0uICovCisJcG9zX2luX2l0ZW0gKHBhdGgpID0gcm91bmRfbGVuIC0gKGxlX2loX2tfb2Zmc2V0IChsZV9paCkgLSAxKTsKKwkqY3V0X3NpemUgPSAtKGloX2l0ZW1fbGVuKGxlX2loKSAtIHBvc19pbl9pdGVtKHBhdGgpKTsKKwkKKwlyZXR1cm4gTV9DVVQ7IC8qIEN1dCBmcm9tIHRoaXMgaXRlbS4gKi8KKyAgICB9CisKKworICAgIC8vIG9sZCBmaWxlOiBpdGVtcyBtYXkgaGF2ZSBhbnkgbGVuZ3RoCisKKyAgICBpZiAoIG5ld19maWxlX2xlbmd0aCA8IGxlX2loX2tfb2Zmc2V0IChsZV9paCkgKSAgeworCSpjdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKGxlX2loKSk7CisJcmV0dXJuIE1fREVMRVRFOyAvKiBEZWxldGUgdGhpcyBpdGVtLiAqLworICAgIH0KKyAgICAvKiBDYWxjdWxhdGUgZmlyc3QgcG9zaXRpb24gYW5kIHNpemUgZm9yIGN1dHRpbmcgZnJvbSBpdGVtLiAqLworICAgICpjdXRfc2l6ZSA9IC0oaWhfaXRlbV9sZW4obGVfaWgpIC0KKwkJICAgICAgKHBvc19pbl9pdGVtIChwYXRoKSA9IG5ld19maWxlX2xlbmd0aCArIDEgLSBsZV9paF9rX29mZnNldCAobGVfaWgpKSk7CisgICAgcmV0dXJuIE1fQ1VUOyAvKiBDdXQgZnJvbSB0aGlzIGl0ZW0uICovCit9CisKKworc3RhdGljIGlubGluZSBpbnQgcHJlcGFyZV9mb3JfZGlyZW50cnlfaXRlbSAoc3RydWN0IHBhdGggKiBwYXRoLAorCQkJCQkgICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBsZV9paCwKKwkJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKKwkJCQkJICAgICBsb2ZmX3QgbmV3X2ZpbGVfbGVuZ3RoLAorCQkJCQkgICAgIGludCAqIGN1dF9zaXplKQoreworICAgIGlmIChsZV9paF9rX29mZnNldCAobGVfaWgpID09IERPVF9PRkZTRVQgJiYgCisJbmV3X2ZpbGVfbGVuZ3RoID09IG1heF9yZWlzZXJmc19vZmZzZXQgKGlub2RlKSkgeworCVJGQUxTRSggaWhfZW50cnlfY291bnQgKGxlX2loKSAhPSAyLAorCSAgICAgICAgIlBBUC01MjIwOiBpbmNvcnJlY3QgZW1wdHkgZGlyZWN0b3J5IGl0ZW0gKCVoKSIsIGxlX2loKTsKKwkqY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbihsZV9paCkpOworCXJldHVybiBNX0RFTEVURTsgLyogRGVsZXRlIHRoZSBkaXJlY3RvcnkgaXRlbSBjb250YWluaW5nICIuIiBhbmQgIi4uIiBlbnRyeS4gKi8KKyAgICB9CisgICAgCisgICAgaWYgKCBpaF9lbnRyeV9jb3VudCAobGVfaWgpID09IDEgKSAgeworCS8qIERlbGV0ZSB0aGUgZGlyZWN0b3J5IGl0ZW0gc3VjaCBhcyB0aGVyZSBpcyBvbmUgcmVjb3JkIG9ubHkKKwkgICBpbiB0aGlzIGl0ZW0qLworCSpjdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKGxlX2loKSk7CisJcmV0dXJuIE1fREVMRVRFOworICAgIH0KKyAgICAKKyAgICAvKiBDdXQgb25lIHJlY29yZCBmcm9tIHRoZSBkaXJlY3RvcnkgaXRlbS4gKi8KKyAgICAqY3V0X3NpemUgPSAtKERFSF9TSVpFICsgZW50cnlfbGVuZ3RoIChnZXRfbGFzdF9iaCAocGF0aCksIGxlX2loLCBwb3NfaW5faXRlbSAocGF0aCkpKTsKKyAgICByZXR1cm4gTV9DVVQ7IAorfQorCisKKy8qICBJZiB0aGUgcGF0aCBwb2ludHMgdG8gYSBkaXJlY3Rvcnkgb3IgZGlyZWN0IGl0ZW0sIGNhbGN1bGF0ZSBtb2RlIGFuZCB0aGUgc2l6ZSBjdXQsIGZvciBiYWxhbmNlLgorICAgIElmIHRoZSBwYXRoIHBvaW50cyB0byBhbiBpbmRpcmVjdCBpdGVtLCByZW1vdmUgc29tZSBudW1iZXIgb2YgaXRzIHVuZm9ybWF0dGVkIG5vZGVzLgorICAgIEluIGNhc2Ugb2YgZmlsZSB0cnVuY2F0ZSBjYWxjdWxhdGUgd2hldGhlciB0aGlzIGl0ZW0gbXVzdCBiZSBkZWxldGVkL3RydW5jYXRlZCBvciBsYXN0CisgICAgdW5mb3JtYXR0ZWQgbm9kZSBvZiB0aGlzIGl0ZW0gd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBkaXJlY3QgaXRlbS4KKyAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBkZXRlcm1pbmF0aW9uIG9mIHdoYXQgYmFsYW5jZSBtb2RlIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIHNob3VsZCBlbXBsb3kuICovCitzdGF0aWMgY2hhciAgcHJlcGFyZV9mb3JfZGVsZXRlX29yX2N1dCgKKwkJCQkgICAgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAorCQkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKKwkJCQkgICAgICAgc3RydWN0IHBhdGggICAgICAgICAqIHBfc19wYXRoLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAgICAgICogcF9zX2l0ZW1fa2V5LAorCQkJCSAgICAgICBpbnQgICAgICAgICAgICAgICAgICogcF9uX3JlbW92ZWQsICAgICAgLyogTnVtYmVyIG9mIHVuZm9ybWF0dGVkIG5vZGVzIHdoaWNoIHdlcmUgcmVtb3ZlZAorCQkJCQkJCQkJCSAgZnJvbSBlbmQgb2YgdGhlIGZpbGUuICovCisJCQkJICAgICAgIGludCAgICAgICAgICAgICAgICAgKiBwX25fY3V0X3NpemUsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgICBuX25ld19maWxlX2xlbmd0aCAvKiBNQVhfS0VZX09GRlNFVCBpbiBjYXNlIG9mIGRlbGV0ZS4gKi8KKyAgICApIHsKKyAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiID0gaW5vZGUtPmlfc2I7CisgICAgc3RydWN0IGl0ZW1faGVhZCAgICAqIHBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQocF9zX3BhdGgpOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfYmggPSBQQVRIX1BMQVNUX0JVRkZFUihwX3NfcGF0aCk7CisKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisKKyAgICAvKiBTdGF0X2RhdGEgaXRlbS4gKi8KKyAgICBpZiAoIGlzX3N0YXRkYXRhX2xlX2loIChwX2xlX2loKSApIHsKKworCVJGQUxTRSggbl9uZXdfZmlsZV9sZW5ndGggIT0gbWF4X3JlaXNlcmZzX29mZnNldCAoaW5vZGUpLAorCQkiUEFQLTUyMTA6IG1vZGUgbXVzdCBiZSBNX0RFTEVURSIpOworCisJKnBfbl9jdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKHBfbGVfaWgpKTsKKwlyZXR1cm4gTV9ERUxFVEU7CisgICAgfQorCisKKyAgICAvKiBEaXJlY3RvcnkgaXRlbS4gKi8KKyAgICBpZiAoIGlzX2RpcmVudHJ5X2xlX2loIChwX2xlX2loKSApCisJcmV0dXJuIHByZXBhcmVfZm9yX2RpcmVudHJ5X2l0ZW0gKHBfc19wYXRoLCBwX2xlX2loLCBpbm9kZSwgbl9uZXdfZmlsZV9sZW5ndGgsIHBfbl9jdXRfc2l6ZSk7CisKKyAgICAvKiBEaXJlY3QgaXRlbS4gKi8KKyAgICBpZiAoIGlzX2RpcmVjdF9sZV9paCAocF9sZV9paCkgKQorCXJldHVybiBwcmVwYXJlX2Zvcl9kaXJlY3RfaXRlbSAocF9zX3BhdGgsIHBfbGVfaWgsIGlub2RlLCBuX25ld19maWxlX2xlbmd0aCwgcF9uX2N1dF9zaXplKTsKKworCisgICAgLyogQ2FzZSBvZiBhbiBpbmRpcmVjdCBpdGVtLiAqLworICAgIHsKKwlpbnQgICAgICAgICAgICAgICAgICAgbl91bmZtX251bWJlciwgICAgLyogTnVtYmVyIG9mIHRoZSBpdGVtIHVuZm9ybWF0dGVkIG5vZGVzLiAqLworCSAgICBuX2NvdW50ZXIsCisJICAgIG5fYmxrX3NpemU7CisJX191MzIgICAgICAgICAgICAgICAqIHBfbl91bmZtX3BvaW50ZXI7IC8qIFBvaW50ZXIgdG8gdGhlIHVuZm9ybWF0dGVkIG5vZGUgbnVtYmVyLiAqLworCV9fdTMyIHRtcDsKKwlzdHJ1Y3QgaXRlbV9oZWFkICAgICAgc19paDsgICAgICAgICAgIC8qIEl0ZW0gaGVhZGVyLiAqLworCWNoYXIgICAgICAgICAgICAgICAgICBjX21vZGU7ICAgICAgICAgICAvKiBSZXR1cm5lZCBtb2RlIG9mIHRoZSBiYWxhbmNlLiAqLworCWludCBuZWVkX3Jlc2VhcmNoOworCisKKwluX2Jsa19zaXplID0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZTsKKworCS8qIFNlYXJjaCBmb3IgdGhlIG5lZWRlZCBvYmplY3QgaW5kaXJlY3QgaXRlbSB1bnRpbCB0aGVyZSBhcmUgbm8gdW5mb3JtYXR0ZWQgbm9kZXMgdG8gYmUgcmVtb3ZlZC4gKi8KKwlkbyAgeworCSAgICBuZWVkX3Jlc2VhcmNoID0gMDsKKyAgICAgICAgICAgIHBfc19iaCA9IFBBVEhfUExBU1RfQlVGRkVSKHBfc19wYXRoKTsKKwkgICAgLyogQ29weSBpbmRpcmVjdCBpdGVtIGhlYWRlciB0byBhIHRlbXAgdmFyaWFibGUuICovCisJICAgIGNvcHlfaXRlbV9oZWFkKCZzX2loLCBQQVRIX1BJVEVNX0hFQUQocF9zX3BhdGgpKTsKKwkgICAgLyogQ2FsY3VsYXRlIG51bWJlciBvZiB1bmZvcm1hdHRlZCBub2RlcyBpbiB0aGlzIGl0ZW0uICovCisJICAgIG5fdW5mbV9udW1iZXIgPSBJX1VORk1fTlVNKCZzX2loKTsKKworCSAgICBSRkFMU0UoICEgaXNfaW5kaXJlY3RfbGVfaWgoJnNfaWgpIHx8ICEgbl91bmZtX251bWJlciB8fAorCQkgICAgcG9zX2luX2l0ZW0gKHBfc19wYXRoKSArIDEgIT0gIG5fdW5mbV9udW1iZXIsCisJCSAgICAiUEFQLTUyNDA6IGludmFsaWQgaXRlbSAlaCAiCisJCSAgICAibl91bmZtX251bWJlciA9ICVkICpwX25fcG9zX2luX2l0ZW0gPSAlZCIsIAorCQkgICAgJnNfaWgsIG5fdW5mbV9udW1iZXIsIHBvc19pbl9pdGVtIChwX3NfcGF0aCkpOworCisJICAgIC8qIENhbGN1bGF0ZSBiYWxhbmNlIG1vZGUgYW5kIHBvc2l0aW9uIGluIHRoZSBpdGVtIHRvIHJlbW92ZSB1bmZvcm1hdHRlZCBub2Rlcy4gKi8KKwkgICAgaWYgKCBuX25ld19maWxlX2xlbmd0aCA9PSBtYXhfcmVpc2VyZnNfb2Zmc2V0IChpbm9kZSkgKSB7LyogQ2FzZSBvZiBkZWxldGUuICovCisJCXBvc19pbl9pdGVtIChwX3NfcGF0aCkgPSAwOworCQkqcF9uX2N1dF9zaXplID0gLShJSF9TSVpFICsgaWhfaXRlbV9sZW4oJnNfaWgpKTsKKwkJY19tb2RlID0gTV9ERUxFVEU7CisJICAgIH0KKwkgICAgZWxzZSAgeyAvKiBDYXNlIG9mIHRydW5jYXRlLiAqLworCQlpZiAoIG5fbmV3X2ZpbGVfbGVuZ3RoIDwgbGVfaWhfa19vZmZzZXQgKCZzX2loKSApICB7CisJCSAgICBwb3NfaW5faXRlbSAocF9zX3BhdGgpID0gMDsKKwkJICAgICpwX25fY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbigmc19paCkpOworCQkgICAgY19tb2RlID0gTV9ERUxFVEU7IC8qIERlbGV0ZSB0aGlzIGl0ZW0uICovCisJCX0KKwkJZWxzZSAgeworCQkgICAgLyogaW5kaXJlY3QgaXRlbSBtdXN0IGJlIHRydW5jYXRlZCBzdGFydGluZyBmcm9tICpwX25fcG9zX2luX2l0ZW0tdGggcG9zaXRpb24gKi8KKwkJICAgIHBvc19pbl9pdGVtIChwX3NfcGF0aCkgPSAobl9uZXdfZmlsZV9sZW5ndGggKyBuX2Jsa19zaXplIC0gbGVfaWhfa19vZmZzZXQgKCZzX2loKSApID4+IHBfc19zYi0+c19ibG9ja3NpemVfYml0czsKKworCQkgICAgUkZBTFNFKCBwb3NfaW5faXRlbSAocF9zX3BhdGgpID4gbl91bmZtX251bWJlciwKKwkJCSAgICAiUEFQLTUyNTA6IGludmFsaWQgcG9zaXRpb24gaW4gdGhlIGl0ZW0iKTsKKworCQkgICAgLyogRWl0aGVyIGNvbnZlcnQgbGFzdCB1bmZvcm1hdHRlZCBub2RlIG9mIGluZGlyZWN0IGl0ZW0gdG8gZGlyZWN0IGl0ZW0gb3IgaW5jcmVhc2UKKwkJICAgICAgIGl0cyBmcmVlIHNwYWNlLiAgKi8KKwkJICAgIGlmICggcG9zX2luX2l0ZW0gKHBfc19wYXRoKSA9PSBuX3VuZm1fbnVtYmVyICkgIHsKKwkJCSpwX25fY3V0X3NpemUgPSAwOyAvKiBOb3RoaW5nIHRvIGN1dC4gKi8KKwkJCXJldHVybiBNX0NPTlZFUlQ7IC8qIE1heWJlIGNvbnZlcnQgbGFzdCB1bmZvcm1hdHRlZCBub2RlIHRvIHRoZSBkaXJlY3QgaXRlbS4gKi8KKwkJICAgIH0KKwkJICAgIC8qIENhbGN1bGF0ZSBzaXplIHRvIGN1dC4gKi8KKwkJICAgICpwX25fY3V0X3NpemUgPSAtKGloX2l0ZW1fbGVuKCZzX2loKSAtIHBvc19pbl9pdGVtKHBfc19wYXRoKSAqIFVORk1fUF9TSVpFKTsKKworCQkgICAgY19tb2RlID0gTV9DVVQ7ICAgICAvKiBDdXQgZnJvbSB0aGlzIGluZGlyZWN0IGl0ZW0uICovCisJCX0KKwkgICAgfQorCisJICAgIFJGQUxTRSggbl91bmZtX251bWJlciA8PSBwb3NfaW5faXRlbSAocF9zX3BhdGgpLAorCQkgICAgIlBBUC01MjYwOiBpbnZhbGlkIHBvc2l0aW9uIGluIHRoZSBpbmRpcmVjdCBpdGVtIik7CisKKwkgICAgLyogcG9pbnRlcnMgdG8gYmUgY3V0ICovCisJICAgIG5fdW5mbV9udW1iZXIgLT0gcG9zX2luX2l0ZW0gKHBfc19wYXRoKTsKKwkgICAgLyogU2V0IHBvaW50ZXIgdG8gdGhlIGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSBwb2ludGVyIHRoYXQgaXMgdG8gYmUgY3V0LiAqLworCSAgICBwX25fdW5mbV9wb2ludGVyID0gKF9fdTMyICopQl9JX1BJVEVNKHBfc19iaCwgJnNfaWgpICsgSV9VTkZNX05VTSgmc19paCkgLSAxIC0gKnBfbl9yZW1vdmVkOworCisKKwkgICAgLyogV2UgZ28gdGhyb3VnaCB0aGUgdW5mb3JtYXR0ZWQgbm9kZXMgcG9pbnRlcnMgb2YgdGhlIGluZGlyZWN0CisJICAgICAgIGl0ZW0gYW5kIGxvb2sgZm9yIHRoZSB1bmZvcm1hdHRlZCBub2RlcyBpbiB0aGUgY2FjaGUuIElmIHdlCisJICAgICAgIGZvdW5kIHNvbWUgb2YgdGhlbSB3ZSBmcmVlIGl0LCB6ZXJvIGNvcnJlc3BvbmRpbmcgaW5kaXJlY3QgaXRlbQorCSAgICAgICBlbnRyeSBhbmQgbG9nIGJ1ZmZlciBjb250YWluaW5nIHRoYXQgaW5kaXJlY3QgaXRlbS4gRm9yIHRoaXMgd2UKKwkgICAgICAgbmVlZCB0byBwcmVwYXJlIGxhc3QgcGF0aCBlbGVtZW50IGZvciBsb2dnaW5nLiBJZiBzb21lCisJICAgICAgIHVuZm9ybWF0dGVkIG5vZGUgaGFzIGJfY291bnQgPiAxIHdlIG11c3Qgbm90IGZyZWUgdGhpcworCSAgICAgICB1bmZvcm1hdHRlZCBub2RlIHNpbmNlIGl0IGlzIGluIHVzZS4gKi8KKwkgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChwX3Nfc2IsIHBfc19iaCwgMSk7CisJICAgIC8vIG5vdGU6IHBhdGggY291bGQgYmUgY2hhbmdlZCwgZmlyc3QgbGluZSBpbiBmb3IgbG9vcCB0YWtlcyBjYXJlCisJICAgIC8vIG9mIGl0CisKKwkgICAgZm9yIChuX2NvdW50ZXIgPSAqcF9uX3JlbW92ZWQ7CisJCSBuX2NvdW50ZXIgPCBuX3VuZm1fbnVtYmVyOyBuX2NvdW50ZXIrKywgcF9uX3VuZm1fcG9pbnRlci0tICkgeworCisJCWNvbmRfcmVzY2hlZCgpOworCQlpZiAoaXRlbV9tb3ZlZCAoJnNfaWgsIHBfc19wYXRoKSkgeworCQkgICAgbmVlZF9yZXNlYXJjaCA9IDEgOworCQkgICAgYnJlYWs7CisJCX0KKwkJUkZBTFNFKCBwX25fdW5mbV9wb2ludGVyIDwgKF9fdTMyICopQl9JX1BJVEVNKHBfc19iaCwgJnNfaWgpIHx8CisJCQlwX25fdW5mbV9wb2ludGVyID4gKF9fdTMyICopQl9JX1BJVEVNKHBfc19iaCwgJnNfaWgpICsgSV9VTkZNX05VTSgmc19paCkgLSAxLAorCQkJInZzLTUyNjU6IHBvaW50ZXIgb3V0IG9mIHJhbmdlIik7CisKKwkJLyogSG9sZSwgbm90aGluZyB0byByZW1vdmUuICovCisJCWlmICggISBnZXRfYmxvY2tfbnVtKHBfbl91bmZtX3BvaW50ZXIsMCkgKSAgeworCQkJKCpwX25fcmVtb3ZlZCkrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJKCpwX25fcmVtb3ZlZCkrKzsKKworCQl0bXAgPSBnZXRfYmxvY2tfbnVtKHBfbl91bmZtX3BvaW50ZXIsMCk7CisJCXB1dF9ibG9ja19udW0ocF9uX3VuZm1fcG9pbnRlciwgMCwgMCk7CisJCWpvdXJuYWxfbWFya19kaXJ0eSAodGgsIHBfc19zYiwgcF9zX2JoKTsKKwkJcmVpc2VyZnNfZnJlZV9ibG9jayh0aCwgaW5vZGUsIHRtcCwgMSk7CisJCWlmICggaXRlbV9tb3ZlZCAoJnNfaWgsIHBfc19wYXRoKSApICB7CisJCQluZWVkX3Jlc2VhcmNoID0gMTsKKwkJCWJyZWFrIDsKKwkJfQorCSAgICB9CisKKwkgICAgLyogYSB0cmljay4gIElmIHRoZSBidWZmZXIgaGFzIGJlZW4gbG9nZ2VkLCB0aGlzCisJICAgICoqIHdpbGwgZG8gbm90aGluZy4gIElmIHdlJ3ZlIGJyb2tlbiB0aGUgbG9vcCB3aXRob3V0CisJICAgICoqIGxvZ2dpbmcgaXQsIGl0IHdpbGwgcmVzdG9yZSB0aGUgYnVmZmVyCisJICAgICoqCisJICAgICovCisJICAgIHJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc19zYiwgcF9zX2JoKTsKKworCSAgICAvKiBUaGlzIGxvb3AgY2FuIGJlIG9wdGltaXplZC4gKi8KKwl9IHdoaWxlICggKCpwX25fcmVtb3ZlZCA8IG5fdW5mbV9udW1iZXIgfHwgbmVlZF9yZXNlYXJjaCkgJiYKKwkJICBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShwX3Nfc2IsIHBfc19pdGVtX2tleSwgcF9zX3BhdGgpID09IFBPU0lUSU9OX0ZPVU5EICk7CisKKwlSRkFMU0UoICpwX25fcmVtb3ZlZCA8IG5fdW5mbV9udW1iZXIsIAorCQkiUEFQLTUzMTA6IGluZGlyZWN0IGl0ZW0gaXMgbm90IGZvdW5kIik7CisJUkZBTFNFKCBpdGVtX21vdmVkICgmc19paCwgcF9zX3BhdGgpLCAKKwkJImFmdGVyIHdoaWxlLCBjb21wIGZhaWxlZCwgcmV0cnkiKSA7CisKKwlpZiAoY19tb2RlID09IE1fQ1VUKQorCSAgICBwb3NfaW5faXRlbSAocF9zX3BhdGgpICo9IFVORk1fUF9TSVpFOworCXJldHVybiBjX21vZGU7CisgICAgfQorfQorCisvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIHdpbGwgYmUgZGVsZXRlZCBvciBjdXQgZHVyaW5nIGJhbGFuY2UgKi8KK3N0YXRpYyBpbnQgY2FsY19kZWxldGVkX2J5dGVzX251bWJlcigKKyAgICBzdHJ1Y3QgIHRyZWVfYmFsYW5jZSAgKiBwX3NfdGIsCisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgY19tb2RlCisgICAgKSB7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbl9kZWxfc2l6ZTsKKyAgICBzdHJ1Y3QgIGl0ZW1faGVhZCAgICAgKiBwX2xlX2loID0gUEFUSF9QSVRFTV9IRUFEKHBfc190Yi0+dGJfcGF0aCk7CisKKyAgICBpZiAoIGlzX3N0YXRkYXRhX2xlX2loIChwX2xlX2loKSApCisJcmV0dXJuIDA7CisKKyAgICBuX2RlbF9zaXplID0gKCBjX21vZGUgPT0gTV9ERUxFVEUgKSA/IGloX2l0ZW1fbGVuKHBfbGVfaWgpIDogLXBfc190Yi0+aW5zZXJ0X3NpemVbMF07CisgICAgaWYgKCBpc19kaXJlbnRyeV9sZV9paCAocF9sZV9paCkgKSB7CisJLy8gcmV0dXJuIEVNUFRZX0RJUl9TSVpFOyAvKiBXZSBkZWxldGUgZW10eSBkaXJlY3RvcmlzIG9ubHkuICovCisJLy8gd2UgY2FuJ3QgdXNlIEVNUFRZX0RJUl9TSVpFLCBhcyBvbGQgZm9ybWF0IGRpcnMgaGF2ZSBhIGRpZmZlcmVudAorCS8vIGVtcHR5IHNpemUuICBpY2suIEZJWE1FLCBpcyB0aGlzIHJpZ2h0PworCS8vCisJcmV0dXJuIG5fZGVsX3NpemUgOworICAgIH0KKworICAgIGlmICggaXNfaW5kaXJlY3RfbGVfaWggKHBfbGVfaWgpICkKKwluX2RlbF9zaXplID0gKG5fZGVsX3NpemUvVU5GTV9QX1NJWkUpKgorCSAgKFBBVEhfUExBU1RfQlVGRkVSKHBfc190Yi0+dGJfcGF0aCktPmJfc2l6ZSk7Ly8gLSBnZXRfaWhfZnJlZV9zcGFjZSAocF9sZV9paCk7CisgICAgcmV0dXJuIG5fZGVsX3NpemU7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfdGJfc3RydWN0KAorICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiBwX3NfdGIsCisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICAqIHBfc19zYiwKKyAgICBzdHJ1Y3QgcGF0aCAgICAgICAgICogcF9zX3BhdGgsCisgICAgaW50ICAgICAgICAgICAgICAgICAgIG5fc2l6ZQorICAgICkgeworCisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCisgICAgbWVtc2V0IChwX3NfdGIsJ1wwJyxzaXplb2Yoc3RydWN0IHRyZWVfYmFsYW5jZSkpOworICAgIHBfc190Yi0+dHJhbnNhY3Rpb25faGFuZGxlID0gdGggOworICAgIHBfc190Yi0+dGJfc2IgPSBwX3Nfc2I7CisgICAgcF9zX3RiLT50Yl9wYXRoID0gcF9zX3BhdGg7CisgICAgUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUKSA9IE5VTEw7CisgICAgUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3BhdGgsIElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCkgPSAwOworICAgIHBfc190Yi0+aW5zZXJ0X3NpemVbMF0gPSBuX3NpemU7Cit9CisKKworCit2b2lkIHBhZGRfaXRlbSAoY2hhciAqIGl0ZW0sIGludCB0b3RhbF9sZW5ndGgsIGludCBsZW5ndGgpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSB0b3RhbF9sZW5ndGg7IGkgPiBsZW5ndGg7ICkKKwlpdGVtIFstLWldID0gMDsKK30KKworI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCitjaGFyIGtleTJ0eXBlKHN0cnVjdCByZWlzZXJmc19rZXkgKmloKQoreworICBpZiAoaXNfZGlyZW50cnlfbGVfa2V5KDIsIGloKSkKKyAgICByZXR1cm4gJ2QnOworICBpZiAoaXNfZGlyZWN0X2xlX2tleSgyLCBpaCkpCisgICAgcmV0dXJuICdEJzsKKyAgaWYgKGlzX2luZGlyZWN0X2xlX2tleSgyLCBpaCkpCisgICAgcmV0dXJuICdpJzsKKyAgaWYgKGlzX3N0YXRkYXRhX2xlX2tleSgyLCBpaCkpCisgICAgcmV0dXJuICdzJzsKKyAgcmV0dXJuICd1JzsKK30KKworY2hhciBoZWFkMnR5cGUoc3RydWN0IGl0ZW1faGVhZCAqaWgpCit7CisgIGlmIChpc19kaXJlbnRyeV9sZV9paChpaCkpCisgICAgcmV0dXJuICdkJzsKKyAgaWYgKGlzX2RpcmVjdF9sZV9paChpaCkpCisgICAgcmV0dXJuICdEJzsKKyAgaWYgKGlzX2luZGlyZWN0X2xlX2loKGloKSkKKyAgICByZXR1cm4gJ2knOworICBpZiAoaXNfc3RhdGRhdGFfbGVfaWgoaWgpKQorICAgIHJldHVybiAncyc7CisgIHJldHVybiAndSc7Cit9CisjZW5kaWYKKworLyogRGVsZXRlIG9iamVjdCBpdGVtLiAqLworaW50IHJlaXNlcmZzX2RlbGV0ZV9pdGVtIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCisJCQkgIHN0cnVjdCBwYXRoICogcF9zX3BhdGgsIC8qIFBhdGggdG8gdGhlIGRlbGV0ZWQgaXRlbS4gKi8KKwkJCSAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBwX3NfaXRlbV9rZXksIC8qIEtleSB0byBzZWFyY2ggZm9yIHRoZSBkZWxldGVkIGl0ZW0uICAqLworCQkJICBzdHJ1Y3QgaW5vZGUgKiBwX3NfaW5vZGUsLyogaW5vZGUgaXMgaGVyZSBqdXN0IHRvIHVwZGF0ZSBpX2Jsb2NrcyBhbmQgcXVvdGFzICovCisJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfdW5fYmgpICAgIC8qIE5VTEwgb3IgdW5mb3JtYXR0ZWQgbm9kZSBwb2ludGVyLiAgICAqLworeworICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHBfc19zYiA9IHBfc19pbm9kZS0+aV9zYjsKKyAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICAgc19kZWxfYmFsYW5jZTsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICAgICAgc19paDsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICAgICAgKnFfaWg7CisgICAgaW50CQkJICBxdW90YV9jdXRfYnl0ZXM7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIG5fcmV0X3ZhbHVlLAorCW5fZGVsX3NpemUsCisJbl9yZW1vdmVkOworCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisgICAgY2hhciAgICAgICAgICAgICAgICAgIGNfbW9kZTsKKyAgICBpbnQJCQluX2l0ZXIgPSAwOworI2VuZGlmCisKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisKKyAgICBpbml0X3RiX3N0cnVjdCh0aCwgJnNfZGVsX2JhbGFuY2UsIHBfc19zYiwgcF9zX3BhdGgsIDAvKnNpemUgaXMgdW5rbm93biovKTsKKworICAgIHdoaWxlICggMSApIHsKKwluX3JlbW92ZWQgPSAwOworCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJbl9pdGVyKys7CisJY19tb2RlID0KKyNlbmRpZgorCSAgICBwcmVwYXJlX2Zvcl9kZWxldGVfb3JfY3V0KHRoLCBwX3NfaW5vZGUsIHBfc19wYXRoLCBwX3NfaXRlbV9rZXksICZuX3JlbW92ZWQsICZuX2RlbF9zaXplLCBtYXhfcmVpc2VyZnNfb2Zmc2V0IChwX3NfaW5vZGUpKTsKKworCVJGQUxTRSggY19tb2RlICE9IE1fREVMRVRFLCAiUEFQLTUzMjA6IG1vZGUgbXVzdCBiZSBNX0RFTEVURSIpOworCisJY29weV9pdGVtX2hlYWQoJnNfaWgsIFBBVEhfUElURU1fSEVBRChwX3NfcGF0aCkpOworCXNfZGVsX2JhbGFuY2UuaW5zZXJ0X3NpemVbMF0gPSBuX2RlbF9zaXplOworCisJbl9yZXRfdmFsdWUgPSBmaXhfbm9kZXMoTV9ERUxFVEUsICZzX2RlbF9iYWxhbmNlLCBOVUxMLCBOVUxMKTsKKwlpZiAoIG5fcmV0X3ZhbHVlICE9IFJFUEVBVF9TRUFSQ0ggKQorCSAgICBicmVhazsKKworCVBST0NfSU5GT19JTkMoIHBfc19zYiwgZGVsZXRlX2l0ZW1fcmVzdGFydGVkICk7CisKKwkvLyBmaWxlIHN5c3RlbSBjaGFuZ2VkLCByZXBlYXQgc2VhcmNoCisJbl9yZXRfdmFsdWUgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShwX3Nfc2IsIHBfc19pdGVtX2tleSwgcF9zX3BhdGgpOworCWlmIChuX3JldF92YWx1ZSA9PSBJT19FUlJPUikKKwkgICAgYnJlYWs7CisJaWYgKG5fcmV0X3ZhbHVlID09IEZJTEVfTk9UX0ZPVU5EKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgInZzLTUzNDA6IHJlaXNlcmZzX2RlbGV0ZV9pdGVtOiAiCisJCQkgICAgICAibm8gaXRlbXMgb2YgdGhlIGZpbGUgJUsgZm91bmQiLCBwX3NfaXRlbV9rZXkpOworCSAgICBicmVhazsKKwl9CisgICAgfSAvKiB3aGlsZSAoMSkgKi8KKworICAgIGlmICggbl9yZXRfdmFsdWUgIT0gQ0FSUllfT04gKSB7CisJdW5maXhfbm9kZXMoJnNfZGVsX2JhbGFuY2UpOworCXJldHVybiAwOworICAgIH0KKworICAgIC8vIHJlaXNlcmZzX2RlbGV0ZV9pdGVtIHJldHVybnMgaXRlbSBsZW5ndGggd2hlbiBzdWNjZXNzCisgICAgbl9yZXRfdmFsdWUgPSBjYWxjX2RlbGV0ZWRfYnl0ZXNfbnVtYmVyKCZzX2RlbF9iYWxhbmNlLCBNX0RFTEVURSk7CisgICAgcV9paCA9IGdldF9paChwX3NfcGF0aCkgOworICAgIHF1b3RhX2N1dF9ieXRlcyA9IGloX2l0ZW1fbGVuKHFfaWgpIDsKKworICAgIC8qIGhhY2sgc28gdGhlIHF1b3RhIGNvZGUgZG9lc24ndCBoYXZlIHRvIGd1ZXNzIGlmIHRoZSBmaWxlCisgICAgKiogaGFzIGEgdGFpbC4gIE9uIHRhaWwgaW5zZXJ0LCB3ZSBhbGxvY2F0ZSBxdW90YSBmb3IgMSB1bmZvcm1hdHRlZCBub2RlLgorICAgICoqIFdlIHRlc3QgdGhlIG9mZnNldCBiZWNhdXNlIHRoZSB0YWlsIG1pZ2h0IGhhdmUgYmVlbgorICAgICoqIHNwbGl0IGludG8gbXVsdGlwbGUgaXRlbXMsIGFuZCB3ZSBvbmx5IHdhbnQgdG8gZGVjcmVtZW50IGZvcgorICAgICoqIHRoZSB1bmZtIG5vZGUgb25jZQorICAgICovCisgICAgaWYgKCFTX0lTTE5LIChwX3NfaW5vZGUtPmlfbW9kZSkgJiYgaXNfZGlyZWN0X2xlX2loKHFfaWgpKSB7CisgICAgICAgIGlmICgobGVfaWhfa19vZmZzZXQocV9paCkgJiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSA9PSAxKSB7CisgICAgICAgICAgICBxdW90YV9jdXRfYnl0ZXMgPSBwX3Nfc2ItPnNfYmxvY2tzaXplICsgVU5GTV9QX1NJWkU7CisgICAgICAgIH0gZWxzZSB7CisJICAgIHF1b3RhX2N1dF9ieXRlcyA9IDAgOworCX0KKyAgICB9CisKKyAgICBpZiAoIHBfc191bl9iaCApICB7CisJaW50IG9mZjsKKyAgICAgICAgY2hhciAqZGF0YSA7CisKKwkvKiBXZSBhcmUgaW4gZGlyZWN0MmluZGlyZWN0IGNvbnZlcnNpb24sIHNvIG1vdmUgdGFpbCBjb250ZW50cworICAgICAgICAgICB0byB0aGUgdW5mb3JtYXR0ZWQgbm9kZSAqLworCS8qIG5vdGUsIHdlIGRvIHRoZSBjb3B5IGJlZm9yZSBwcmVwYXJpbmcgdGhlIGJ1ZmZlciBiZWNhdXNlIHdlCisJKiogZG9uJ3QgY2FyZSBhYm91dCB0aGUgY29udGVudHMgb2YgdGhlIHVuZm9ybWF0dGVkIG5vZGUgeWV0LgorCSoqIHRoZSBvbmx5IHRoaW5nIHdlIHJlYWxseSBjYXJlIGFib3V0IGlzIHRoZSBkaXJlY3QgaXRlbSdzIGRhdGEKKwkqKiBpcyBpbiB0aGUgdW5mb3JtYXR0ZWQgbm9kZS4KKwkqKgorCSoqIE90aGVyd2lzZSwgd2Ugd291bGQgaGF2ZSB0byBjYWxsIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwgb24KKwkqKiB0aGUgdW5mb3JtYXR0ZWQgbm9kZSwgd2hpY2ggbWlnaHQgc2NoZWR1bGUsIG1lYW5pbmcgd2UnZCBoYXZlIHRvCisJKiogbG9vcCBhbGwgdGhlIHdheSBiYWNrIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgd2hpbGUgbG9vcC4KKwkqKgorCSoqIFRoZSB1bmZvcm1hdHRlZCBub2RlIG11c3QgYmUgZGlydGllZCBsYXRlciBvbi4gIFdlIGNhbid0IGJlCisJKiogc3VyZSBoZXJlIGlmIHRoZSBlbnRpcmUgdGFpbCBoYXMgYmVlbiBkZWxldGVkIHlldC4KKyAgICAgICAgKioKKyAgICAgICAgKiogcF9zX3VuX2JoIGlzIGZyb20gdGhlIHBhZ2UgY2FjaGUgKGFsbCB1bmZvcm1hdHRlZCBub2RlcyBhcmUKKyAgICAgICAgKiogZnJvbSB0aGUgcGFnZSBjYWNoZSkgYW5kIG1pZ2h0IGJlIGEgaGlnaG1lbSBwYWdlLiAgU28sIHdlCisgICAgICAgICoqIGNhbid0IHVzZSBwX3NfdW5fYmgtPmJfZGF0YS4KKwkqKiAtY2xtCisJKi8KKworICAgICAgICBkYXRhID0ga21hcF9hdG9taWMocF9zX3VuX2JoLT5iX3BhZ2UsIEtNX1VTRVIwKTsKKwlvZmYgPSAoKGxlX2loX2tfb2Zmc2V0ICgmc19paCkgLSAxKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7CisJbWVtY3B5KGRhdGEgKyBvZmYsCisJICAgICAgIEJfSV9QSVRFTShQQVRIX1BMQVNUX0JVRkZFUihwX3NfcGF0aCksICZzX2loKSwgbl9yZXRfdmFsdWUpOworCWt1bm1hcF9hdG9taWMoZGF0YSwgS01fVVNFUjApOworICAgIH0KKyAgICAvKiBQZXJmb3JtIGJhbGFuY2luZyBhZnRlciBhbGwgcmVzb3VyY2VzIGhhdmUgYmVlbiBjb2xsZWN0ZWQgYXQgb25jZS4gKi8gCisgICAgZG9fYmFsYW5jZSgmc19kZWxfYmFsYW5jZSwgTlVMTCwgTlVMTCwgTV9ERUxFVEUpOworCisjaWZkZWYgUkVJU0VSUVVPVEFfREVCVUcKKyAgICByZWlzZXJmc19kZWJ1ZyAocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGEgZGVsZXRlX2l0ZW0oKTogZnJlZWluZyAldSwgaWQ9JXUgdHlwZT0lYyIsIHF1b3RhX2N1dF9ieXRlcywgcF9zX2lub2RlLT5pX3VpZCwgaGVhZDJ0eXBlKCZzX2loKSk7CisjZW5kaWYKKyAgICBEUVVPVF9GUkVFX1NQQUNFX05PRElSVFkocF9zX2lub2RlLCBxdW90YV9jdXRfYnl0ZXMpOworCisgICAgLyogUmV0dXJuIGRlbGV0ZWQgYm9keSBsZW5ndGggKi8KKyAgICByZXR1cm4gbl9yZXRfdmFsdWU7Cit9CisKKworLyogU3VtbWFyeSBPZiBNZWNoYW5pc21zIEZvciBIYW5kbGluZyBDb2xsaXNpb25zIEJldHdlZW4gUHJvY2Vzc2VzOgorCisgZGVsZXRpb24gb2YgdGhlIGJvZHkgb2YgdGhlIG9iamVjdCBpcyBwZXJmb3JtZWQgYnkgaXB1dCgpLCB3aXRoIHRoZQorIHJlc3VsdCB0aGF0IGlmIG11bHRpcGxlIHByb2Nlc3NlcyBhcmUgb3BlcmF0aW5nIG9uIGEgZmlsZSwgdGhlCisgZGVsZXRpb24gb2YgdGhlIGJvZHkgb2YgdGhlIGZpbGUgaXMgZGVmZXJyZWQgdW50aWwgdGhlIGxhc3QgcHJvY2VzcworIHRoYXQgaGFzIGFuIG9wZW4gaW5vZGUgcGVyZm9ybXMgaXRzIGlwdXQoKS4KKworIHdyaXRlcyBhbmQgdHJ1bmNhdGVzIGFyZSBwcm90ZWN0ZWQgZnJvbSBjb2xsaXNpb25zIGJ5IHVzZSBvZgorIHNlbWFwaG9yZXMuCisKKyBjcmVhdGVzLCBsaW5raW5nLCBhbmQgbWtub2QgYXJlIHByb3RlY3RlZCBmcm9tIGNvbGxpc2lvbnMgd2l0aCBvdGhlcgorIHByb2Nlc3NlcyBieSBtYWtpbmcgdGhlIHJlaXNlcmZzX2FkZF9lbnRyeSgpIHRoZSBsYXN0IHN0ZXAgaW4gdGhlCisgY3JlYXRpb24sIGFuZCB0aGVuIHJvbGxpbmcgYmFjayBhbGwgY2hhbmdlcyBpZiB0aGVyZSB3YXMgYSBjb2xsaXNpb24uCisgLSBIYW5zCisqLworCisKKy8qIHRoaXMgZGVsZXRlcyBpdGVtIHdoaWNoIG5ldmVyIGdldHMgc3BsaXQgKi8KK3ZvaWQgcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW0gKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5KQoreworICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgdGI7CisgICAgSU5JVElBTElaRV9QQVRIIChwYXRoKTsKKyAgICBpbnQgaXRlbV9sZW4gPSAwOworICAgIGludCB0Yl9pbml0ID0gMCA7CisgICAgc3RydWN0IGNwdV9rZXkgY3B1X2tleTsKKyAgICBpbnQgcmV0dmFsOworICAgIGludCBxdW90YV9jdXRfYnl0ZXMgPSAwOworCisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworICAgIAorICAgIGxlX2tleTJjcHVfa2V5ICgmY3B1X2tleSwga2V5KTsKKyAgICAKKyAgICB3aGlsZSAoMSkgeworCXJldHZhbCA9IHNlYXJjaF9pdGVtICh0aC0+dF9zdXBlciwgJmNwdV9rZXksICZwYXRoKTsKKwlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKHRoLT50X3N1cGVyLAorCQkJICAgICAgInZzLTUzNTA6IHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtOiAiCisJCQkgICAgICAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgdHJ5aW5nIHRvIGRlbGV0ZSAlSyIsCisJCQkgICAgICAmY3B1X2tleSk7CisJICAgIGJyZWFrOworCX0KKwlpZiAocmV0dmFsICE9IElURU1fRk9VTkQpIHsKKwkgICAgcGF0aHJlbHNlICgmcGF0aCk7CisJICAgIC8vIE5vIG5lZWQgZm9yIGEgd2FybmluZywgaWYgdGhlcmUgaXMganVzdCBubyBmcmVlIHNwYWNlIHRvIGluc2VydCAnLi4nIGl0ZW0gaW50byB0aGUgbmV3bHktY3JlYXRlZCBzdWJkaXIKKwkgICAgaWYgKCAhKCAodW5zaWduZWQgbG9uZyBsb25nKSBHRVRfSEFTSF9WQUxVRSAobGVfa2V5X2tfb2Zmc2V0IChsZV9rZXlfdmVyc2lvbiAoa2V5KSwga2V5KSkgPT0gMCAmJiBcCisJCSAodW5zaWduZWQgbG9uZyBsb25nKSBHRVRfR0VORVJBVElPTl9OVU1CRVIgKGxlX2tleV9rX29mZnNldCAobGVfa2V5X3ZlcnNpb24gKGtleSksIGtleSkpID09IDEgKSApCisJCXJlaXNlcmZzX3dhcm5pbmcgKHRoLT50X3N1cGVyLCAidnMtNTM1NTogcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW06ICVrIG5vdCBmb3VuZCIsIGtleSk7CisJICAgIGJyZWFrOworCX0KKwlpZiAoIXRiX2luaXQpIHsKKwkgICAgdGJfaW5pdCA9IDEgOworCSAgICBpdGVtX2xlbiA9IGloX2l0ZW1fbGVuKCBQQVRIX1BJVEVNX0hFQUQoJnBhdGgpICk7CisJICAgIGluaXRfdGJfc3RydWN0ICh0aCwgJnRiLCB0aC0+dF9zdXBlciwgJnBhdGgsIC0gKElIX1NJWkUgKyBpdGVtX2xlbikpOworCX0KKwlxdW90YV9jdXRfYnl0ZXMgPSBpaF9pdGVtX2xlbihQQVRIX1BJVEVNX0hFQUQoJnBhdGgpKSA7CisKKwlyZXR2YWwgPSBmaXhfbm9kZXMgKE1fREVMRVRFLCAmdGIsIE5VTEwsIE5VTEwpOworCWlmIChyZXR2YWwgPT0gUkVQRUFUX1NFQVJDSCkgeworCSAgICBQUk9DX0lORk9fSU5DKCB0aCAtPiB0X3N1cGVyLCBkZWxldGVfc29saWRfaXRlbV9yZXN0YXJ0ZWQgKTsKKwkgICAgY29udGludWU7CisJfQorCisJaWYgKHJldHZhbCA9PSBDQVJSWV9PTikgeworCSAgICBkb19iYWxhbmNlICgmdGIsIE5VTEwsIE5VTEwsIE1fREVMRVRFKTsKKwkgICAgaWYgKGlub2RlKSB7CS8qIFNob3VsZCB3ZSBjb3VudCBxdW90YSBmb3IgaXRlbT8gKHdlIGRvbid0IGNvdW50IHF1b3RhcyBmb3Igc2F2ZS1saW5rcykgKi8KKyNpZmRlZiBSRUlTRVJRVU9UQV9ERUJVRworCQlyZWlzZXJmc19kZWJ1ZyAodGgtPnRfc3VwZXIsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJyZWlzZXJxdW90YSBkZWxldGVfc29saWRfaXRlbSgpOiBmcmVlaW5nICV1IGlkPSV1IHR5cGU9JWMiLCBxdW90YV9jdXRfYnl0ZXMsIGlub2RlLT5pX3VpZCwga2V5MnR5cGUoa2V5KSk7CisjZW5kaWYKKwkJRFFVT1RfRlJFRV9TUEFDRV9OT0RJUlRZKGlub2RlLCBxdW90YV9jdXRfYnl0ZXMpOworCSAgICB9CisJICAgIGJyZWFrOworCX0KKworCS8vIElPX0VSUk9SLCBOT19ESVNLX1NQQUNFLCBldGMKKwlyZWlzZXJmc193YXJuaW5nICh0aC0+dF9zdXBlciwgInZzLTUzNjA6IHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtOiAiCisJCQkgICJjb3VsZCBub3QgZGVsZXRlICVLIGR1ZSB0byBmaXhfbm9kZXMgZmFpbHVyZSIsICZjcHVfa2V5KTsKKwl1bmZpeF9ub2RlcyAoJnRiKTsKKwlicmVhazsKKyAgICB9CisKKyAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKSA7Cit9CisKKworaW50IHJlaXNlcmZzX2RlbGV0ZV9vYmplY3QgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKyAgICBpbnQgZXJyOworICAgIGlub2RlLT5pX3NpemUgPSAwOworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKworICAgIC8qIGZvciBkaXJlY3RvcnkgdGhpcyBkZWxldGVzIGl0ZW0gY29udGFpbmluZyAiLiIgYW5kICIuLiIgKi8KKyAgICBlcnIgPSByZWlzZXJmc19kb190cnVuY2F0ZSAodGgsIGlub2RlLCBOVUxMLCAwLypubyB0aW1lc3RhbXAgdXBkYXRlcyovKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworICAgIAorI2lmIGRlZmluZWQoIFVTRV9JTk9ERV9HRU5FUkFUSU9OX0NPVU5URVIgKQorICAgIGlmKCAhb2xkX2Zvcm1hdF9vbmx5ICggdGggLT4gdF9zdXBlciApICkKKyAgICAgIHsKKyAgICAgICBfX3UzMiAqaW5vZGVfZ2VuZXJhdGlvbjsKKyAgICAgICAKKyAgICAgICBpbm9kZV9nZW5lcmF0aW9uID0gCisgICAgICAgICAmUkVJU0VSRlNfU0IodGggLT4gdF9zdXBlcikgLT4gc19ycyAtPiBzX2lub2RlX2dlbmVyYXRpb247CisgICAgICAgKmlub2RlX2dlbmVyYXRpb24gPSBjcHVfdG9fbGUzMiggbGUzMl90b19jcHUoICppbm9kZV9nZW5lcmF0aW9uICkgKyAxICk7CisgICAgICB9CisvKiBVU0VfSU5PREVfR0VORVJBVElPTl9DT1VOVEVSICovCisjZW5kaWYKKyAgICByZWlzZXJmc19kZWxldGVfc29saWRfaXRlbSAodGgsIGlub2RlLCBJTk9ERV9QS0VZIChpbm9kZSkpOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQKK3VubWFwX2J1ZmZlcnMoc3RydWN0IHBhZ2UgKnBhZ2UsIGxvZmZfdCBwb3MpIHsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoIDsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQgOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqbmV4dCA7CisgICAgdW5zaWduZWQgbG9uZyB0YWlsX2luZGV4IDsKKyAgICB1bnNpZ25lZCBsb25nIGN1cl9pbmRleCA7CisKKyAgICBpZiAocGFnZSkgeworCWlmIChwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJICAgIHRhaWxfaW5kZXggPSBwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkgOworCSAgICBjdXJfaW5kZXggPSAwIDsKKwkgICAgaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKSA7CisJICAgIGJoID0gaGVhZCA7CisJICAgIGRvIHsKKwkJbmV4dCA9IGJoLT5iX3RoaXNfcGFnZSA7CisKKwkJLyogd2Ugd2FudCB0byB1bm1hcCB0aGUgYnVmZmVycyB0aGF0IGNvbnRhaW4gdGhlIHRhaWwsIGFuZAorCQkqKiBhbGwgdGhlIGJ1ZmZlcnMgYWZ0ZXIgaXQgKHNpbmNlIHRoZSB0YWlsIG11c3QgYmUgYXQgdGhlCisJCSoqIGVuZCBvZiB0aGUgZmlsZSkuICBXZSBkb24ndCB3YW50IHRvIHVubWFwIGZpbGUgZGF0YQorCQkqKiBiZWZvcmUgdGhlIHRhaWwsIHNpbmNlIGl0IG1pZ2h0IGJlIGRpcnR5IGFuZCB3YWl0aW5nIHRvCisJCSoqIHJlYWNoIGRpc2sKKwkJKi8KKwkJY3VyX2luZGV4ICs9IGJoLT5iX3NpemUgOworCQlpZiAoY3VyX2luZGV4ID4gdGFpbF9pbmRleCkgeworCQkgICAgcmVpc2VyZnNfdW5tYXBfYnVmZmVyKGJoKSA7CisJCX0KKwkJYmggPSBuZXh0IDsKKwkgICAgfSB3aGlsZSAoYmggIT0gaGVhZCkgOworCSAgICBpZiAoIFBBR0VfU0laRSA9PSBiaC0+Yl9zaXplICkgeworCQljbGVhcl9wYWdlX2RpcnR5KHBhZ2UpOworCSAgICB9CisJfQorICAgIH0KK30KKworc3RhdGljIGludCBtYXliZV9pbmRpcmVjdF90b19kaXJlY3QgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCAKKwkJCSAgICAgIHN0cnVjdCBpbm9kZSAqIHBfc19pbm9kZSwKKwkJCSAgICAgIHN0cnVjdCBwYWdlICpwYWdlLCAKKwkJCSAgICAgIHN0cnVjdCBwYXRoICAgICAgICAgKiBwX3NfcGF0aCwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICAgICAgKiBwX3NfaXRlbV9rZXksCisJCQkgICAgICBsb2ZmX3QgICAgICAgICBuX25ld19maWxlX3NpemUsCisJCQkgICAgICBjaGFyICAgICAgICAgICAgICAgICogcF9jX21vZGUKKwkJCSAgICAgICkgeworICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHBfc19zYiA9IHBfc19pbm9kZS0+aV9zYjsKKyAgICBpbnQgbl9ibG9ja19zaXplID0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZTsKKyAgICBpbnQgY3V0X2J5dGVzOworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKworICAgIGlmIChuX25ld19maWxlX3NpemUgIT0gcF9zX2lub2RlLT5pX3NpemUpCisJQlVHICgpOworCisgICAgLyogdGhlIHBhZ2UgYmVpbmcgc2VudCBpbiBjb3VsZCBiZSBOVUxMIGlmIHRoZXJlIHdhcyBhbiBpL28gZXJyb3IKKyAgICAqKiByZWFkaW5nIGluIHRoZSBsYXN0IGJsb2NrLiAgVGhlIHVzZXIgd2lsbCBoaXQgcHJvYmxlbXMgdHJ5aW5nIHRvCisgICAgKiogcmVhZCB0aGUgZmlsZSwgYnV0IGZvciBub3cgd2UganVzdCBza2lwIHRoZSBpbmRpcmVjdDJkaXJlY3QKKyAgICAqLworICAgIGlmIChhdG9taWNfcmVhZCgmcF9zX2lub2RlLT5pX2NvdW50KSA+IDEgfHwgCisgICAgICAgICF0YWlsX2hhc190b19iZV9wYWNrZWQgKHBfc19pbm9kZSkgfHwgCisJIXBhZ2UgfHwgKFJFSVNFUkZTX0kocF9zX2lub2RlKS0+aV9mbGFncyAmIGlfbm9wYWNrX21hc2spKSB7CisJLy8gbGVhdmUgdGFpbCBpbiBhbiB1bmZvcm1hdHRlZCBub2RlCQorCSpwX2NfbW9kZSA9IE1fU0tJUF9CQUxBTkNJTkc7CisJY3V0X2J5dGVzID0gbl9ibG9ja19zaXplIC0gKG5fbmV3X2ZpbGVfc2l6ZSAmIChuX2Jsb2NrX3NpemUgLSAxKSk7CisJcGF0aHJlbHNlKHBfc19wYXRoKTsKKwlyZXR1cm4gY3V0X2J5dGVzOworICAgIH0KKyAgICAvKiBQZXJtb3JtIHRoZSBjb252ZXJzaW9uIHRvIGEgZGlyZWN0X2l0ZW0uICovCisgICAgLypyZXR1cm4gaW5kaXJlY3RfdG9fZGlyZWN0IChwX3NfaW5vZGUsIHBfc19wYXRoLCBwX3NfaXRlbV9rZXksIG5fbmV3X2ZpbGVfc2l6ZSwgcF9jX21vZGUpOyovCisgICAgcmV0dXJuIGluZGlyZWN0MmRpcmVjdCAodGgsIHBfc19pbm9kZSwgcGFnZSwgcF9zX3BhdGgsIHBfc19pdGVtX2tleSwgbl9uZXdfZmlsZV9zaXplLCBwX2NfbW9kZSk7Cit9CisKKworLyogd2UgZGlkIGluZGlyZWN0X3RvX2RpcmVjdCBjb252ZXJzaW9uLiBBbmQgd2UgaGF2ZSBpbnNlcnRlZCBkaXJlY3QKKyAgIGl0ZW0gc3VjY2Vzc2VzZnVsbHksIGJ1dCB0aGVyZSB3ZXJlIG5vIGRpc2sgc3BhY2UgdG8gY3V0IHVuZm0KKyAgIHBvaW50ZXIgYmVpbmcgY29udmVydGVkLiBUaGVyZWZvcmUgd2UgaGF2ZSB0byBkZWxldGUgaW5zZXJ0ZWQKKyAgIGRpcmVjdCBpdGVtKHMpICovCitzdGF0aWMgdm9pZCBpbmRpcmVjdF90b19kaXJlY3Rfcm9sbF9iYWNrIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBwYXRoICogcGF0aCkKK3sKKyAgICBzdHJ1Y3QgY3B1X2tleSB0YWlsX2tleTsKKyAgICBpbnQgdGFpbF9sZW47CisgICAgaW50IHJlbW92ZWQ7CisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCisgICAgbWFrZV9jcHVfa2V5ICgmdGFpbF9rZXksIGlub2RlLCBpbm9kZS0+aV9zaXplICsgMSwgVFlQRV9ESVJFQ1QsIDQpOy8vICEhISEKKyAgICB0YWlsX2tleS5rZXlfbGVuZ3RoID0gNDsKKworICAgIHRhaWxfbGVuID0gKGNwdV9rZXlfa19vZmZzZXQgKCZ0YWlsX2tleSkgJiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpIC0gMTsKKyAgICB3aGlsZSAodGFpbF9sZW4pIHsKKwkvKiBsb29rIGZvciB0aGUgbGFzdCBieXRlIG9mIHRoZSB0YWlsICovCisJaWYgKHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChpbm9kZS0+aV9zYiwgJnRhaWxfa2V5LCBwYXRoKSA9PSBQT1NJVElPTl9OT1RfRk9VTkQpCisJICAgIHJlaXNlcmZzX3BhbmljIChpbm9kZS0+aV9zYiwgInZzLTU2MTU6IGluZGlyZWN0X3RvX2RpcmVjdF9yb2xsX2JhY2s6IGZvdW5kIGludmFsaWQgaXRlbSIpOworCVJGQUxTRSggcGF0aC0+cG9zX2luX2l0ZW0gIT0gaWhfaXRlbV9sZW4oUEFUSF9QSVRFTV9IRUFEIChwYXRoKSkgLSAxLAorCSAgICAgICAgInZzLTU2MTY6IGFwcGVuZGVkIGJ5dGVzIGZvdW5kIik7CisJUEFUSF9MQVNUX1BPU0lUSU9OIChwYXRoKSAtLTsKKwkKKwlyZW1vdmVkID0gcmVpc2VyZnNfZGVsZXRlX2l0ZW0gKHRoLCBwYXRoLCAmdGFpbF9rZXksIGlub2RlLCBOVUxMLyp1bmJoIG5vdCBuZWVkZWQqLyk7CisJUkZBTFNFKCByZW1vdmVkIDw9IDAgfHwgcmVtb3ZlZCA+IHRhaWxfbGVuLAorCSAgICAgICAgInZzLTU2MTc6IHRoZXJlIHdhcyB0YWlsICVkIGJ5dGVzLCByZW1vdmVkIGl0ZW0gbGVuZ3RoICVkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICB0YWlsX2xlbiwgcmVtb3ZlZCk7CisJdGFpbF9sZW4gLT0gcmVtb3ZlZDsKKwlzZXRfY3B1X2tleV9rX29mZnNldCAoJnRhaWxfa2V5LCBjcHVfa2V5X2tfb2Zmc2V0ICgmdGFpbF9rZXkpIC0gcmVtb3ZlZCk7CisgICAgfQorICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiaW5kaXJlY3RfdG9fZGlyZWN0X3JvbGxfYmFjazogaW5kaXJlY3RfdG9fZGlyZWN0IGNvbnZlcnNpb24gaGFzIGJlZW4gcm9sbGVkIGJhY2sgZHVlIHRvIGxhY2sgb2YgZGlzayBzcGFjZSIpOworICAgIC8vbWFya19maWxlX3dpdGhvdXRfdGFpbCAoaW5vZGUpOworICAgIG1hcmtfaW5vZGVfZGlydHkgKGlub2RlKTsKK30KKworCisvKiAoVHJ1bmNhdGUgb3IgY3V0IGVudHJ5KSBvciBkZWxldGUgb2JqZWN0IGl0ZW0uIFJldHVybnMgPCAwIG9uIGZhaWx1cmUgKi8KK2ludCByZWlzZXJmc19jdXRfZnJvbV9pdGVtIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCisJCQkgICAgc3RydWN0IHBhdGggKiBwX3NfcGF0aCwKKwkJCSAgICBzdHJ1Y3QgY3B1X2tleSAqIHBfc19pdGVtX2tleSwKKwkJCSAgICBzdHJ1Y3QgaW5vZGUgKiBwX3NfaW5vZGUsCisJCQkgICAgc3RydWN0IHBhZ2UgKnBhZ2UsIAorCQkJICAgIGxvZmZfdCBuX25ld19maWxlX3NpemUpCit7CisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICogcF9zX3NiID0gcF9zX2lub2RlLT5pX3NiOworICAgIC8qIEV2ZXJ5IGZ1bmN0aW9uIHdoaWNoIGlzIGdvaW5nIHRvIGNhbGwgZG9fYmFsYW5jZSBtdXN0IGZpcnN0CisgICAgICAgY3JlYXRlIGEgdHJlZV9iYWxhbmNlIHN0cnVjdHVyZS4gIFRoZW4gaXQgbXVzdCBmaWxsIHVwIHRoaXMKKyAgICAgICBzdHJ1Y3R1cmUgYnkgdXNpbmcgdGhlIGluaXRfdGJfc3RydWN0IGFuZCBmaXhfbm9kZXMgZnVuY3Rpb25zLgorICAgICAgIEFmdGVyIHRoYXQgd2UgY2FuIG1ha2UgdHJlZSBiYWxhbmNpbmcuICovCisgICAgc3RydWN0IHRyZWVfYmFsYW5jZSBzX2N1dF9iYWxhbmNlOworICAgIHN0cnVjdCBpdGVtX2hlYWQgKnBfbGVfaWg7CisgICAgaW50IG5fY3V0X3NpemUgPSAwLCAgICAgICAgLyogQW1vdW50IHRvIGJlIGN1dC4gKi8KKwluX3JldF92YWx1ZSA9IENBUlJZX09OLAorCW5fcmVtb3ZlZCA9IDAsICAgICAvKiBOdW1iZXIgb2YgdGhlIHJlbW92ZWQgdW5mb3JtYXR0ZWQgbm9kZXMuICovCisJbl9pc19pbm9kZV9sb2NrZWQgPSAwOworICAgIGNoYXIgICAgICAgICAgICAgICAgY19tb2RlOyAgICAgICAgICAgIC8qIE1vZGUgb2YgdGhlIGJhbGFuY2UuICovCisgICAgaW50IHJldHZhbDIgPSAtMTsKKyAgICBpbnQgcXVvdGFfY3V0X2J5dGVzOworICAgIGxvZmZfdCB0YWlsX3BvcyA9IDA7CisKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisgICAgCisgICAgaW5pdF90Yl9zdHJ1Y3QodGgsICZzX2N1dF9iYWxhbmNlLCBwX3NfaW5vZGUtPmlfc2IsIHBfc19wYXRoLCBuX2N1dF9zaXplKTsKKworCisgICAgLyogUmVwZWF0IHRoaXMgbG9vcCB1bnRpbCB3ZSBlaXRoZXIgY3V0IHRoZSBpdGVtIHdpdGhvdXQgbmVlZGluZworICAgICAgIHRvIGJhbGFuY2UsIG9yIHdlIGZpeF9ub2RlcyB3aXRob3V0IHNjaGVkdWxlIG9jY3VycmluZyAqLworICAgIHdoaWxlICggMSApIHsKKwkvKiBEZXRlcm1pbmUgdGhlIGJhbGFuY2UgbW9kZSwgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJ5dGUgdG8KKwkgICBiZSBjdXQsIGFuZCBzaXplIHRvIGJlIGN1dC4gIEluIGNhc2Ugb2YgdGhlIGluZGlyZWN0IGl0ZW0KKwkgICBmcmVlIHVuZm9ybWF0dGVkIG5vZGVzIHdoaWNoIGFyZSBwb2ludGVkIHRvIGJ5IHRoZSBjdXQKKwkgICBwb2ludGVycy4gKi8KKyAgICAgIAorCWNfbW9kZSA9IHByZXBhcmVfZm9yX2RlbGV0ZV9vcl9jdXQodGgsIHBfc19pbm9kZSwgcF9zX3BhdGgsIHBfc19pdGVtX2tleSwgJm5fcmVtb3ZlZCwgCisJCQkJCSAgICZuX2N1dF9zaXplLCBuX25ld19maWxlX3NpemUpOworCWlmICggY19tb2RlID09IE1fQ09OVkVSVCApICB7CisJICAgIC8qIGNvbnZlcnQgbGFzdCB1bmZvcm1hdHRlZCBub2RlIHRvIGRpcmVjdCBpdGVtIG9yIGxlYXZlCisgICAgICAgICAgICAgICB0YWlsIGluIHRoZSB1bmZvcm1hdHRlZCBub2RlICovCisJICAgIFJGQUxTRSggbl9yZXRfdmFsdWUgIT0gQ0FSUllfT04sICJQQVAtNTU3MDogY2FuIG5vdCBjb252ZXJ0IHR3aWNlIik7CisKKwkgICAgbl9yZXRfdmFsdWUgPSBtYXliZV9pbmRpcmVjdF90b19kaXJlY3QgKHRoLCBwX3NfaW5vZGUsIHBhZ2UsIHBfc19wYXRoLCBwX3NfaXRlbV9rZXksCisJCQkJCQkgICAgbl9uZXdfZmlsZV9zaXplLCAmY19tb2RlKTsKKwkgICAgaWYgKCBjX21vZGUgPT0gTV9TS0lQX0JBTEFOQ0lORyApCisJCS8qIHRhaWwgaGFzIGJlZW4gbGVmdCBpbiB0aGUgdW5mb3JtYXR0ZWQgbm9kZSAqLworCQlyZXR1cm4gbl9yZXRfdmFsdWU7CisKKwkgICAgbl9pc19pbm9kZV9sb2NrZWQgPSAxOworCSAgCisJICAgIC8qIHJlbW92aW5nIG9mIGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSB3aWxsIGNoYW5nZSB2YWx1ZSB3ZQorICAgICAgICAgICAgICAgaGF2ZSB0byByZXR1cm4gdG8gdHJ1bmNhdGUuIFNhdmUgaXQgKi8KKwkgICAgcmV0dmFsMiA9IG5fcmV0X3ZhbHVlOworCSAgICAvKnJldHZhbDIgPSBwX3Nfc2ItPnNfYmxvY2tzaXplIC0gKG5fbmV3X2ZpbGVfc2l6ZSAmIChwX3Nfc2ItPnNfYmxvY2tzaXplIC0gMSkpOyovCisJICAKKwkgICAgLyogU28sIHdlIGhhdmUgcGVyZm9ybWVkIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBjb252ZXJzaW9uOgorCSAgICAgICBpbnNlcnRpbmcgdGhlIG5ldyBkaXJlY3QgaXRlbS4gIE5vdyB3ZSBhcmUgcmVtb3ZpbmcgdGhlCisJICAgICAgIGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSBwb2ludGVyLiBTZXQga2V5IHRvIHNlYXJjaCBmb3IKKwkgICAgICAgaXQuICovCisgICAgICAJICAgIHNldF9jcHVfa2V5X2tfdHlwZSAocF9zX2l0ZW1fa2V5LCBUWVBFX0lORElSRUNUKTsKKwkgICAgcF9zX2l0ZW1fa2V5LT5rZXlfbGVuZ3RoID0gNDsKKwkgICAgbl9uZXdfZmlsZV9zaXplIC09IChuX25ld19maWxlX3NpemUgJiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKTsKKwkgICAgdGFpbF9wb3MgPSBuX25ld19maWxlX3NpemU7CisJICAgIHNldF9jcHVfa2V5X2tfb2Zmc2V0IChwX3NfaXRlbV9rZXksIG5fbmV3X2ZpbGVfc2l6ZSArIDEpOworCSAgICBpZiAoIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KHBfc19zYiwgcF9zX2l0ZW1fa2V5LCBwX3NfcGF0aCkgPT0gUE9TSVRJT05fTk9UX0ZPVU5EICl7CisJCXByaW50X2Jsb2NrIChQQVRIX1BMQVNUX0JVRkZFUiAocF9zX3BhdGgpLCAzLCBQQVRIX0xBU1RfUE9TSVRJT04gKHBfc19wYXRoKSAtIDEsIFBBVEhfTEFTVF9QT1NJVElPTiAocF9zX3BhdGgpICsgMSk7CisJCXJlaXNlcmZzX3BhbmljKHBfc19zYiwgIlBBUC01NTgwOiByZWlzZXJmc19jdXRfZnJvbV9pdGVtOiBpdGVtIHRvIGNvbnZlcnQgZG9lcyBub3QgZXhpc3QgKCVLKSIsIHBfc19pdGVtX2tleSk7CisJICAgIH0KKwkgICAgY29udGludWU7CisJfQorCWlmIChuX2N1dF9zaXplID09IDApIHsKKwkgICAgcGF0aHJlbHNlIChwX3NfcGF0aCk7CisJICAgIHJldHVybiAwOworCX0KKworCXNfY3V0X2JhbGFuY2UuaW5zZXJ0X3NpemVbMF0gPSBuX2N1dF9zaXplOworCQorCW5fcmV0X3ZhbHVlID0gZml4X25vZGVzKGNfbW9kZSwgJnNfY3V0X2JhbGFuY2UsIE5VTEwsIE5VTEwpOworICAgICAgCWlmICggbl9yZXRfdmFsdWUgIT0gUkVQRUFUX1NFQVJDSCApCisJICAgIGJyZWFrOworCQorCVBST0NfSU5GT19JTkMoIHBfc19zYiwgY3V0X2Zyb21faXRlbV9yZXN0YXJ0ZWQgKTsKKworCW5fcmV0X3ZhbHVlID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkocF9zX3NiLCBwX3NfaXRlbV9rZXksIHBfc19wYXRoKTsKKwlpZiAobl9yZXRfdmFsdWUgPT0gUE9TSVRJT05fRk9VTkQpCisJICAgIGNvbnRpbnVlOworCisJcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiUEFQLTU2MTA6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW06IGl0ZW0gJUsgbm90IGZvdW5kIiwgcF9zX2l0ZW1fa2V5KTsKKwl1bmZpeF9ub2RlcyAoJnNfY3V0X2JhbGFuY2UpOworCXJldHVybiAobl9yZXRfdmFsdWUgPT0gSU9fRVJST1IpID8gLUVJTyA6IC1FTk9FTlQ7CisgICAgfSAvKiB3aGlsZSAqLworICAKKyAgICAvLyBjaGVjayBmaXhfbm9kZXMgcmVzdWx0cyAoSU9fRVJST1Igb3IgTk9fRElTS19TUEFDRSkKKyAgICBpZiAoIG5fcmV0X3ZhbHVlICE9IENBUlJZX09OICkgeworCWlmICggbl9pc19pbm9kZV9sb2NrZWQgKSB7CisJICAgIC8vIEZJWE1FOiB0aGlzIHNlZW1zIHRvIGJlIG5vdCBuZWVkZWQ6IHdlIGFyZSBhbHdheXMgYWJsZQorCSAgICAvLyB0byBjdXQgaXRlbQorCSAgICBpbmRpcmVjdF90b19kaXJlY3Rfcm9sbF9iYWNrICh0aCwgcF9zX2lub2RlLCBwX3NfcGF0aCk7CisJfQorCWlmIChuX3JldF92YWx1ZSA9PSBOT19ESVNLX1NQQUNFKQorCSAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJOT19ESVNLX1NQQUNFIik7CisJdW5maXhfbm9kZXMgKCZzX2N1dF9iYWxhbmNlKTsKKwlyZXR1cm4gLUVJTzsKKyAgICB9CisKKyAgICAvKiBnbyBhaGVhZCBhbmQgcGVyZm9ybSBiYWxhbmNpbmcgKi8KKyAgICAKKyAgICBSRkFMU0UoIGNfbW9kZSA9PSBNX1BBU1RFIHx8IGNfbW9kZSA9PSBNX0lOU0VSVCwgImludmFsaWQgbW9kZSIpOworCisgICAgLyogQ2FsY3VsYXRlIG51bWJlciBvZiBieXRlcyB0aGF0IG5lZWQgdG8gYmUgY3V0IGZyb20gdGhlIGl0ZW0uICovCisgICAgcXVvdGFfY3V0X2J5dGVzID0gKCBjX21vZGUgPT0gTV9ERUxFVEUgKSA/IGloX2l0ZW1fbGVuKGdldF9paChwX3NfcGF0aCkpIDogLXNfY3V0X2JhbGFuY2UuaW5zZXJ0X3NpemVbMF07CisgICAgaWYgKHJldHZhbDIgPT0gLTEpCisJbl9yZXRfdmFsdWUgPSBjYWxjX2RlbGV0ZWRfYnl0ZXNfbnVtYmVyKCZzX2N1dF9iYWxhbmNlLCBjX21vZGUpOworICAgIGVsc2UKKwluX3JldF92YWx1ZSA9IHJldHZhbDI7CisKKworICAgIC8qIEZvciBkaXJlY3QgaXRlbXMsIHdlIG9ubHkgY2hhbmdlIHRoZSBxdW90YSB3aGVuIGRlbGV0aW5nIHRoZSBsYXN0CisgICAgKiogaXRlbS4KKyAgICAqLworICAgIHBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQgKHNfY3V0X2JhbGFuY2UudGJfcGF0aCk7CisgICAgaWYgKCFTX0lTTE5LIChwX3NfaW5vZGUtPmlfbW9kZSkgJiYgaXNfZGlyZWN0X2xlX2loKHBfbGVfaWgpKSB7CisgICAgICAgIGlmIChjX21vZGUgPT0gTV9ERUxFVEUgJiYKKwkgICAobGVfaWhfa19vZmZzZXQgKHBfbGVfaWgpICYgKHBfc19zYi0+c19ibG9ja3NpemUgLSAxKSkgPT0gMSApIHsKKwkgICAgLy8gRklYTUU6IHRoaXMgaXMgdG8ga2VlcCAzLjUgaGFwcHkKKwkgICAgUkVJU0VSRlNfSShwX3NfaW5vZGUpLT5pX2ZpcnN0X2RpcmVjdF9ieXRlID0gVTMyX01BWDsKKwkgICAgcXVvdGFfY3V0X2J5dGVzID0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSArIFVORk1fUF9TSVpFIDsKKyAgICAgICAgfSBlbHNlIHsKKwkgICAgcXVvdGFfY3V0X2J5dGVzID0gMCA7CisJfQorICAgIH0KKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKyAgICBpZiAobl9pc19pbm9kZV9sb2NrZWQpIHsKKwlzdHJ1Y3QgaXRlbV9oZWFkICogbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQgKHNfY3V0X2JhbGFuY2UudGJfcGF0aCk7CisJLyogd2UgYXJlIGdvaW5nIHRvIGNvbXBsZXRlIGluZGlyZWN0MmRpcmVjdCBjb252ZXJzaW9uLiBNYWtlCisgICAgICAgICAgIHN1cmUsIHRoYXQgd2UgZXhhY3RseSByZW1vdmUgbGFzdCB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIKKyAgICAgICAgICAgb2YgdGhlIGl0ZW0gKi8KKwlpZiAoIWlzX2luZGlyZWN0X2xlX2loIChsZV9paCkpCisJICAgIHJlaXNlcmZzX3BhbmljIChwX3Nfc2IsICJ2cy01NjUyOiByZWlzZXJmc19jdXRfZnJvbV9pdGVtOiAiCisJCQkgICAgIml0ZW0gbXVzdCBiZSBpbmRpcmVjdCAlaCIsIGxlX2loKTsKKworCWlmIChjX21vZGUgPT0gTV9ERUxFVEUgJiYgaWhfaXRlbV9sZW4obGVfaWgpICE9IFVORk1fUF9TSVpFKQorCSAgICByZWlzZXJmc19wYW5pYyAocF9zX3NiLCAidnMtNTY1MzogcmVpc2VyZnNfY3V0X2Zyb21faXRlbTogIgorCQkJICAgICJjb21wbGV0aW5nIGluZGlyZWN0MmRpcmVjdCBjb252ZXJzaW9uIGluZGlyZWN0IGl0ZW0gJWggIgorCQkJICAgICJiZWluZyBkZWxldGVkIG11c3QgYmUgb2YgNCBieXRlIGxvbmciLCBsZV9paCk7CisKKwlpZiAoY19tb2RlID09IE1fQ1VUICYmIHNfY3V0X2JhbGFuY2UuaW5zZXJ0X3NpemVbMF0gIT0gLVVORk1fUF9TSVpFKSB7CisJICAgIHJlaXNlcmZzX3BhbmljIChwX3Nfc2IsICJ2cy01NjU0OiByZWlzZXJmc19jdXRfZnJvbV9pdGVtOiAiCisJCQkgICAgImNhbiBub3QgY29tcGxldGUgaW5kaXJlY3QyZGlyZWN0IGNvbnZlcnNpb24gb2YgJWggKENVVCwgaW5zZXJ0X3NpemU9PSVkKSIsCisJCQkgICAgbGVfaWgsIHNfY3V0X2JhbGFuY2UuaW5zZXJ0X3NpemVbMF0pOworCX0KKwkvKiBpdCB3b3VsZCBiZSB1c2VmdWwgdG8gbWFrZSBzdXJlLCB0aGF0IHJpZ2h0IG5laWdoYm9yaW5nCisgICAgICAgICAgIGl0ZW0gaXMgZGlyZWN0IGl0ZW0gb2YgdGhpcyBmaWxlICovCisgICAgfQorI2VuZGlmCisgICAgCisgICAgZG9fYmFsYW5jZSgmc19jdXRfYmFsYW5jZSwgTlVMTCwgTlVMTCwgY19tb2RlKTsKKyAgICBpZiAoIG5faXNfaW5vZGVfbG9ja2VkICkgeworCS8qIHdlJ3ZlIGRvbmUgYW4gaW5kaXJlY3QtPmRpcmVjdCBjb252ZXJzaW9uLiAgd2hlbiB0aGUgZGF0YSBibG9jaworCSoqIHdhcyBmcmVlZCwgaXQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBibG9ja3MgdGhhdCBtdXN0CisJKiogYmUgZmx1c2hlZCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGNvbW1pdHMsIG1ha2Ugc3VyZSB0bworCSoqIHVubWFwIGFuZCBpbnZhbGlkYXRlIGl0CisJKi8KKwl1bm1hcF9idWZmZXJzKHBhZ2UsIHRhaWxfcG9zKTsKKwlSRUlTRVJGU19JKHBfc19pbm9kZSktPmlfZmxhZ3MgJj0gfmlfcGFja19vbl9jbG9zZV9tYXNrIDsKKyAgICB9CisjaWZkZWYgUkVJU0VSUVVPVEFfREVCVUcKKyAgICByZWlzZXJmc19kZWJ1ZyAocF9zX2lub2RlLT5pX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGEgY3V0X2Zyb21faXRlbSgpOiBmcmVlaW5nICV1IGlkPSV1IHR5cGU9JWMiLCBxdW90YV9jdXRfYnl0ZXMsIHBfc19pbm9kZS0+aV91aWQsICc/Jyk7CisjZW5kaWYKKyAgICBEUVVPVF9GUkVFX1NQQUNFX05PRElSVFkocF9zX2lub2RlLCBxdW90YV9jdXRfYnl0ZXMpOworICAgIHJldHVybiBuX3JldF92YWx1ZTsKK30KKworc3RhdGljIHZvaWQgdHJ1bmNhdGVfZGlyZWN0b3J5IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICogaW5vZGUpCit7CisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworICAgIGlmIChpbm9kZS0+aV9ubGluaykKKwlyZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwKKwkJCSAgInZzLTU2NTU6IHRydW5jYXRlX2RpcmVjdG9yeTogbGluayBjb3VudCAhPSAwIik7CisKKyAgICBzZXRfbGVfa2V5X2tfb2Zmc2V0IChLRVlfRk9STUFUXzNfNSwgSU5PREVfUEtFWSAoaW5vZGUpLCBET1RfT0ZGU0VUKTsKKyAgICBzZXRfbGVfa2V5X2tfdHlwZSAoS0VZX0ZPUk1BVF8zXzUsIElOT0RFX1BLRVkgKGlub2RlKSwgVFlQRV9ESVJFTlRSWSk7CisgICAgcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW0gKHRoLCBpbm9kZSwgSU5PREVfUEtFWSAoaW5vZGUpKTsKKyAgICByZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKSA7CisgICAgc2V0X2xlX2tleV9rX29mZnNldCAoS0VZX0ZPUk1BVF8zXzUsIElOT0RFX1BLRVkgKGlub2RlKSwgU0RfT0ZGU0VUKTsKKyAgICBzZXRfbGVfa2V5X2tfdHlwZSAoS0VZX0ZPUk1BVF8zXzUsIElOT0RFX1BLRVkgKGlub2RlKSwgVFlQRV9TVEFUX0RBVEEpOyAgICAKK30KKworCisKKworLyogVHJ1bmNhdGUgZmlsZSB0byB0aGUgbmV3IHNpemUuIE5vdGUsIHRoaXMgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIHRyYW5zYWN0aW9uCisgICBhbHJlYWR5IHN0YXJ0ZWQgKi8KK2ludCByZWlzZXJmc19kb190cnVuY2F0ZSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICBzdHJ1Y3QgIGlub2RlICogcF9zX2lub2RlLCAvKiAtPmlfc2l6ZSBjb250YWlucyBuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKi8KKwkJCSAgIHN0cnVjdCBwYWdlICpwYWdlLCAvKiB1cCB0byBkYXRlIGZvciBsYXN0IGJsb2NrICovCisJCQkgICBpbnQgdXBkYXRlX3RpbWVzdGFtcHMgIC8qIHdoZW4gaXQgaXMgY2FsbGVkIGJ5CisJCQkJCQkgICAgIGZpbGVfcmVsZWFzZSB0byBjb252ZXJ0CisJCQkJCQkgICAgIHRoZSB0YWlsIC0gbm8gdGltZXN0YW1wcworCQkJCQkJICAgICBzaG91bGQgYmUgdXBkYXRlZCAqLworICAgICkgeworICAgIElOSVRJQUxJWkVfUEFUSCAoc19zZWFyY2hfcGF0aCk7ICAgICAgIC8qIFBhdGggdG8gdGhlIGN1cnJlbnQgb2JqZWN0IGl0ZW0uICovCisgICAgc3RydWN0IGl0ZW1faGVhZCAgICAqIHBfbGVfaWg7ICAgICAgICAgLyogUG9pbnRlciB0byBhbiBpdGVtIGhlYWRlci4gKi8KKyAgICBzdHJ1Y3QgY3B1X2tleSAgICAgIHNfaXRlbV9rZXk7ICAgICAvKiBLZXkgdG8gc2VhcmNoIGZvciBhIHByZXZpb3VzIGZpbGUgaXRlbS4gKi8KKyAgICBsb2ZmX3QgICAgICAgICBuX2ZpbGVfc2l6ZSwgICAgLyogT2xkIGZpbGUgc2l6ZS4gKi8KKwluX25ld19maWxlX3NpemU7LyogTmV3IGZpbGUgc2l6ZS4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9kZWxldGVkOyAgICAgIC8qIE51bWJlciBvZiBkZWxldGVkIG9yIHRydW5jYXRlZCBieXRlcy4gKi8KKyAgICBpbnQgcmV0dmFsOworICAgIGludCBlcnIgPSAwOworCisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworICAgIGlmICggISAoU19JU1JFRyhwX3NfaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihwX3NfaW5vZGUtPmlfbW9kZSkgfHwgU19JU0xOSyhwX3NfaW5vZGUtPmlfbW9kZSkpICkKKwlyZXR1cm4gMDsKKworICAgIGlmIChTX0lTRElSKHBfc19pbm9kZS0+aV9tb2RlKSkgeworCS8vIGRlbGV0aW9uIG9mIGRpcmVjdG9yeSAtIG5vIG5lZWQgdG8gdXBkYXRlIHRpbWVzdGFtcHMKKwl0cnVuY2F0ZV9kaXJlY3RvcnkgKHRoLCBwX3NfaW5vZGUpOworCXJldHVybiAwOworICAgIH0KKworICAgIC8qIEdldCBuZXcgZmlsZSBzaXplLiAqLworICAgIG5fbmV3X2ZpbGVfc2l6ZSA9IHBfc19pbm9kZS0+aV9zaXplOworCisgICAgLy8gRklYTUU6IG5vdGUsIHRoYXQga2V5IHR5cGUgaXMgdW5pbXBvcnRhbnQgaGVyZQorICAgIG1ha2VfY3B1X2tleSAoJnNfaXRlbV9rZXksIHBfc19pbm9kZSwgbWF4X3JlaXNlcmZzX29mZnNldCAocF9zX2lub2RlKSwgVFlQRV9ESVJFQ1QsIDMpOworCisgICAgcmV0dmFsID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkocF9zX2lub2RlLT5pX3NiLCAmc19pdGVtX2tleSwgJnNfc2VhcmNoX3BhdGgpOworICAgIGlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwlyZWlzZXJmc193YXJuaW5nIChwX3NfaW5vZGUtPmlfc2IsICJ2cy01NjU3OiByZWlzZXJmc19kb190cnVuY2F0ZTogIgorCQkJICAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgdHJ5aW5nIHRvIHRydW5jYXRlICVLIiwgJnNfaXRlbV9rZXkpOworICAgICAgICBlcnIgPSAtRUlPOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgaWYgKHJldHZhbCA9PSBQT1NJVElPTl9GT1VORCB8fCByZXR2YWwgPT0gRklMRV9OT1RfRk9VTkQpIHsKKwlyZWlzZXJmc193YXJuaW5nIChwX3NfaW5vZGUtPmlfc2IsICJQQVAtNTY2MDogcmVpc2VyZnNfZG9fdHJ1bmNhdGU6ICIKKwkJCSAgIndyb25nIHJlc3VsdCAlZCBvZiBzZWFyY2ggZm9yICVLIiwgcmV0dmFsLCAmc19pdGVtX2tleSk7CisKKyAgICAgICAgZXJyID0gLUVJTzsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgc19zZWFyY2hfcGF0aC5wb3NfaW5faXRlbSAtLTsKKworICAgIC8qIEdldCByZWFsIGZpbGUgc2l6ZSAodG90YWwgbGVuZ3RoIG9mIGFsbCBmaWxlIGl0ZW1zKSAqLworICAgIHBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQoJnNfc2VhcmNoX3BhdGgpOworICAgIGlmICggaXNfc3RhdGRhdGFfbGVfaWggKHBfbGVfaWgpICkKKwluX2ZpbGVfc2l6ZSA9IDA7CisgICAgZWxzZSB7CisJbG9mZl90IG9mZnNldCA9IGxlX2loX2tfb2Zmc2V0IChwX2xlX2loKTsKKwlpbnQgYnl0ZXMgPSBvcF9ieXRlc19udW1iZXIgKHBfbGVfaWgscF9zX2lub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisKKwkvKiB0aGlzIG1heSBtaXNtYXRjaCB3aXRoIHJlYWwgZmlsZSBzaXplOiBpZiBsYXN0IGRpcmVjdCBpdGVtCisgICAgICAgICAgIGhhZCBubyBwYWRkaW5nIHplcm9zIGFuZCBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgaGFkIG5vIGZyZWUKKyAgICAgICAgICAgc3BhY2UsIHRoaXMgZmlsZSB3b3VsZCBoYXZlIHRoaXMgZmlsZSBzaXplICovCisJbl9maWxlX3NpemUgPSBvZmZzZXQgKyBieXRlcyAtIDE7CisgICAgfQorICAgIC8qCisgICAgICogYXJlIHdlIGRvaW5nIGEgZnVsbCB0cnVuY2F0ZSBvciBkZWxldGUsIGlmIHNvCisgICAgICoga2ljayBpbiB0aGUgcmVhZGEgY29kZQorICAgICAqLworICAgIGlmIChuX25ld19maWxlX3NpemUgPT0gMCkKKyAgICAgICAgc19zZWFyY2hfcGF0aC5yZWFkYSA9IFBBVEhfUkVBREEgfCBQQVRIX1JFQURBX0JBQ0s7CisKKyAgICBpZiAoIG5fZmlsZV9zaXplID09IDAgfHwgbl9maWxlX3NpemUgPCBuX25ld19maWxlX3NpemUgKSB7CisJZ290byB1cGRhdGVfYW5kX291dCA7CisgICAgfQorCisgICAgLyogVXBkYXRlIGtleSB0byBzZWFyY2ggZm9yIHRoZSBsYXN0IGZpbGUgaXRlbS4gKi8KKyAgICBzZXRfY3B1X2tleV9rX29mZnNldCAoJnNfaXRlbV9rZXksIG5fZmlsZV9zaXplKTsKKworICAgIGRvICB7CisJLyogQ3V0IG9yIGRlbGV0ZSBmaWxlIGl0ZW0uICovCisJbl9kZWxldGVkID0gcmVpc2VyZnNfY3V0X2Zyb21faXRlbSh0aCwgJnNfc2VhcmNoX3BhdGgsICZzX2l0ZW1fa2V5LCBwX3NfaW5vZGUsICBwYWdlLCBuX25ld19maWxlX3NpemUpOworCWlmIChuX2RlbGV0ZWQgPCAwKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19pbm9kZS0+aV9zYiwgInZzLTU2NjU6IHJlaXNlcmZzX2RvX3RydW5jYXRlOiByZWlzZXJmc19jdXRfZnJvbV9pdGVtIGZhaWxlZCIpOworCSAgICByZWlzZXJmc19jaGVja19wYXRoKCZzX3NlYXJjaF9wYXRoKSA7CisJICAgIHJldHVybiAwOworCX0KKworCVJGQUxTRSggbl9kZWxldGVkID4gbl9maWxlX3NpemUsCisJCSJQQVAtNTY3MDogcmVpc2VyZnNfY3V0X2Zyb21faXRlbTogdG9vIG1hbnkgYnl0ZXMgZGVsZXRlZDogZGVsZXRlZCAlZCwgZmlsZV9zaXplICVsdSwgaXRlbV9rZXkgJUsiLAorCQluX2RlbGV0ZWQsIG5fZmlsZV9zaXplLCAmc19pdGVtX2tleSk7CisKKwkvKiBDaGFuZ2Uga2V5IHRvIHNlYXJjaCB0aGUgbGFzdCBmaWxlIGl0ZW0uICovCisJbl9maWxlX3NpemUgLT0gbl9kZWxldGVkOworCisJc2V0X2NwdV9rZXlfa19vZmZzZXQgKCZzX2l0ZW1fa2V5LCBuX2ZpbGVfc2l6ZSk7CisKKwkvKiBXaGlsZSB0aGVyZSBhcmUgYnl0ZXMgdG8gdHJ1bmNhdGUgYW5kIHByZXZpb3VzIGZpbGUgaXRlbSBpcyBwcmVzZW50ZWQgaW4gdGhlIHRyZWUuICovCisKKwkvKgorCSoqIFRoaXMgbG9vcCBjb3VsZCB0YWtlIGEgcmVhbGx5IGxvbmcgdGltZSwgYW5kIGNvdWxkIGxvZyAKKwkqKiBtYW55IG1vcmUgYmxvY2tzIHRoYW4gYSB0cmFuc2FjdGlvbiBjYW4gaG9sZC4gIFNvLCB3ZSBkbyBhIHBvbGl0ZQorCSoqIGpvdXJuYWwgZW5kIGhlcmUsIGFuZCBpZiB0aGUgdHJhbnNhY3Rpb24gbmVlZHMgZW5kaW5nLCB3ZSBtYWtlCisJKiogc3VyZSB0aGUgZmlsZSBpcyBjb25zaXN0ZW50IGJlZm9yZSBlbmRpbmcgdGhlIGN1cnJlbnQgdHJhbnMKKwkqKiBhbmQgc3RhcnRpbmcgYSBuZXcgb25lCisJKi8KKyAgICAgICAgaWYgKGpvdXJuYWxfdHJhbnNhY3Rpb25fc2hvdWxkX2VuZCh0aCwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCkpIHsKKwkgIGludCBvcmlnX2xlbl9hbGxvYyA9IHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQgOworCSAgZGVjcmVtZW50X2NvdW50ZXJzX2luX3BhdGgoJnNfc2VhcmNoX3BhdGgpIDsKKworCSAgaWYgKHVwZGF0ZV90aW1lc3RhbXBzKSB7CisJICAgICAgcF9zX2lub2RlLT5pX210aW1lID0gcF9zX2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwkgIH0gCisJICByZWlzZXJmc191cGRhdGVfc2QodGgsIHBfc19pbm9kZSkgOworCisJICBlcnIgPSBqb3VybmFsX2VuZCh0aCwgcF9zX2lub2RlLT5pX3NiLCBvcmlnX2xlbl9hbGxvYykgOworCSAgaWYgKGVycikKKwkgICAgZ290byBvdXQ7CisJICBlcnIgPSBqb3VybmFsX2JlZ2luICh0aCwgcF9zX2lub2RlLT5pX3NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogNik7CisJICBpZiAoZXJyKQorCSAgICBnb3RvIG91dDsKKwkgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihwX3NfaW5vZGUpIDsKKwl9CisgICAgfSB3aGlsZSAoIG5fZmlsZV9zaXplID4gUk9VTkRfVVAgKG5fbmV3X2ZpbGVfc2l6ZSkgJiYKKwkgICAgICBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShwX3NfaW5vZGUtPmlfc2IsICZzX2l0ZW1fa2V5LCAmc19zZWFyY2hfcGF0aCkgPT0gUE9TSVRJT05fRk9VTkQgKSAgOworCisgICAgUkZBTFNFKCBuX2ZpbGVfc2l6ZSA+IFJPVU5EX1VQIChuX25ld19maWxlX3NpemUpLAorCSAgICAiUEFQLTU2ODA6IHRydW5jYXRlIGRpZCBub3QgZmluaXNoOiBuZXdfZmlsZV9zaXplICVMZCwgY3VycmVudCAlTGQsIG9pZCAlZCIsCisJICAgIG5fbmV3X2ZpbGVfc2l6ZSwgbl9maWxlX3NpemUsIHNfaXRlbV9rZXkub25fZGlza19rZXkua19vYmplY3RpZCk7CisKK3VwZGF0ZV9hbmRfb3V0OgorICAgIGlmICh1cGRhdGVfdGltZXN0YW1wcykgeworCS8vIHRoaXMgaXMgdHJ1bmNhdGUsIG5vdCBmaWxlIGNsb3NpbmcKKwkgICAgcF9zX2lub2RlLT5pX210aW1lID0gcF9zX2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKyAgICB9CisgICAgcmVpc2VyZnNfdXBkYXRlX3NkICh0aCwgcF9zX2lub2RlKTsKKworb3V0OgorICAgIHBhdGhyZWxzZSgmc19zZWFyY2hfcGF0aCkgOworICAgIHJldHVybiBlcnI7Cit9CisKKworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworLy8gdGhpcyBtYWtlcyBzdXJlLCB0aGF0IHdlIF9fYXBwZW5kX18sIG5vdCBvdmVyd3JpdGUgb3IgYWRkIGhvbGVzCitzdGF0aWMgdm9pZCBjaGVja19yZXNlYXJjaF9mb3JfcGFzdGUgKHN0cnVjdCBwYXRoICogcGF0aCwgCisJCQkJICAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBwX3Nfa2V5KQoreworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBmb3VuZF9paCA9IGdldF9paCAocGF0aCk7CisgICAgCisgICAgaWYgKGlzX2RpcmVjdF9sZV9paCAoZm91bmRfaWgpKSB7CisJaWYgKGxlX2loX2tfb2Zmc2V0IChmb3VuZF9paCkgKyBvcF9ieXRlc19udW1iZXIgKGZvdW5kX2loLCBnZXRfbGFzdF9iaCAocGF0aCktPmJfc2l6ZSkgIT0KKwkgICAgY3B1X2tleV9rX29mZnNldCAocF9zX2tleSkgfHwKKwkgICAgb3BfYnl0ZXNfbnVtYmVyIChmb3VuZF9paCwgZ2V0X2xhc3RfYmggKHBhdGgpLT5iX3NpemUpICE9IHBvc19pbl9pdGVtIChwYXRoKSkKKwkgICAgcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJQQVAtNTcyMDogY2hlY2tfcmVzZWFyY2hfZm9yX3Bhc3RlOiAiCisJCQkgICAgImZvdW5kIGRpcmVjdCBpdGVtICVoIG9yIHBvc2l0aW9uICglZCkgZG9lcyBub3QgbWF0Y2ggdG8ga2V5ICVLIiwKKwkJCSAgICBmb3VuZF9paCwgcG9zX2luX2l0ZW0gKHBhdGgpLCBwX3Nfa2V5KTsKKyAgICB9CisgICAgaWYgKGlzX2luZGlyZWN0X2xlX2loIChmb3VuZF9paCkpIHsKKwlpZiAobGVfaWhfa19vZmZzZXQgKGZvdW5kX2loKSArIG9wX2J5dGVzX251bWJlciAoZm91bmRfaWgsIGdldF9sYXN0X2JoIChwYXRoKS0+Yl9zaXplKSAhPSBjcHVfa2V5X2tfb2Zmc2V0IChwX3Nfa2V5KSB8fCAKKwkgICAgSV9VTkZNX05VTSAoZm91bmRfaWgpICE9IHBvc19pbl9pdGVtIChwYXRoKSB8fAorCSAgICBnZXRfaWhfZnJlZV9zcGFjZSAoZm91bmRfaWgpICE9IDApCisJICAgIHJlaXNlcmZzX3BhbmljIChOVUxMLCAiUEFQLTU3MzA6IGNoZWNrX3Jlc2VhcmNoX2Zvcl9wYXN0ZTogIgorCQkJICAgICJmb3VuZCBpbmRpcmVjdCBpdGVtICglaCkgb3IgcG9zaXRpb24gKCVkKSBkb2VzIG5vdCBtYXRjaCB0byBrZXkgKCVLKSIsCisJCQkgICAgZm91bmRfaWgsIHBvc19pbl9pdGVtIChwYXRoKSwgcF9zX2tleSk7CisgICAgfQorfQorI2VuZGlmIC8qIGNvbmZpZyByZWlzZXJmcyBjaGVjayAqLworCisKKy8qIFBhc3RlIGJ5dGVzIHRvIHRoZSBleGlzdGluZyBpdGVtLiBSZXR1cm5zIGJ5dGVzIG51bWJlciBwYXN0ZWQgaW50byB0aGUgaXRlbS4gKi8KK2ludCByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW0gKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCAKKwkJCSAgICAgIHN0cnVjdCBwYXRoICAgICAgICAgKiBwX3Nfc2VhcmNoX3BhdGgsCS8qIFBhdGggdG8gdGhlIHBhc3RlZCBpdGVtLiAgICAgICAgICAqLworCQkJICAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgICAgICAqIHBfc19rZXksICAgICAgICAJLyogS2V5IHRvIHNlYXJjaCBmb3IgdGhlIG5lZWRlZCBpdGVtLiovCisJCQkgICAgICBzdHJ1Y3QgaW5vZGUJICAqIGlub2RlLAkJLyogSW5vZGUgaXRlbSBiZWxvbmdzIHRvICovCisJCQkgICAgICBjb25zdCBjaGFyICAgICAgICAgICogcF9jX2JvZHksICAgICAgIAkvKiBQb2ludGVyIHRvIHRoZSBieXRlcyB0byBwYXN0ZS4gICAgKi8KKwkJCSAgICAgIGludCAgICAgICAgICAgICAgICAgICBuX3Bhc3RlZF9zaXplKSAgCS8qIFNpemUgb2YgcGFzdGVkIGJ5dGVzLiAgICAgICAgICAgICAqLworeworICAgIHN0cnVjdCB0cmVlX2JhbGFuY2Ugc19wYXN0ZV9iYWxhbmNlOworICAgIGludCAgICAgICAgICAgICAgICAgcmV0dmFsOworICAgIGludAkJCWZzX2dlbjsKKworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKworICAgIGZzX2dlbiA9IGdldF9nZW5lcmF0aW9uKGlub2RlLT5pX3NiKSA7CisKKyNpZmRlZiBSRUlTRVJRVU9UQV9ERUJVRworICAgIHJlaXNlcmZzX2RlYnVnIChpbm9kZS0+aV9zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgInJlaXNlcnF1b3RhIHBhc3RlX2ludG9faXRlbSgpOiBhbGxvY2F0aW5nICV1IGlkPSV1IHR5cGU9JWMiLCBuX3Bhc3RlZF9zaXplLCBpbm9kZS0+aV91aWQsIGtleTJ0eXBlKCYocF9zX2tleS0+b25fZGlza19rZXkpKSk7CisjZW5kaWYKKworICAgIGlmIChEUVVPVF9BTExPQ19TUEFDRV9OT0RJUlRZKGlub2RlLCBuX3Bhc3RlZF9zaXplKSkgeworCXBhdGhyZWxzZShwX3Nfc2VhcmNoX3BhdGgpOworCXJldHVybiAtRURRVU9UOworICAgIH0KKyAgICBpbml0X3RiX3N0cnVjdCh0aCwgJnNfcGFzdGVfYmFsYW5jZSwgdGgtPnRfc3VwZXIsIHBfc19zZWFyY2hfcGF0aCwgbl9wYXN0ZWRfc2l6ZSk7CisjaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUworICAgIHNfcGFzdGVfYmFsYW5jZS5rZXkgPSBwX3Nfa2V5LT5vbl9kaXNrX2tleTsKKyNlbmRpZgorCisgICAgLyogRFFVT1RfKiBjYW4gc2NoZWR1bGUsIG11c3QgY2hlY2sgYmVmb3JlIHRoZSBmaXhfbm9kZXMgKi8KKyAgICBpZiAoZnNfY2hhbmdlZChmc19nZW4sIGlub2RlLT5pX3NiKSkgeworCWdvdG8gc2VhcmNoX2FnYWluOworICAgIH0KKworICAgIHdoaWxlICgocmV0dmFsID0gZml4X25vZGVzKE1fUEFTVEUsICZzX3Bhc3RlX2JhbGFuY2UsIE5VTEwsIHBfY19ib2R5KSkgPT0KK1JFUEVBVF9TRUFSQ0ggKSB7CitzZWFyY2hfYWdhaW46CisJLyogZmlsZSBzeXN0ZW0gY2hhbmdlZCB3aGlsZSB3ZSB3ZXJlIGluIHRoZSBmaXhfbm9kZXMgKi8KKwlQUk9DX0lORk9fSU5DKCB0aCAtPiB0X3N1cGVyLCBwYXN0ZV9pbnRvX2l0ZW1fcmVzdGFydGVkICk7CisJcmV0dmFsID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkgKHRoLT50X3N1cGVyLCBwX3Nfa2V5LCBwX3Nfc2VhcmNoX3BhdGgpOworCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkgICAgcmV0dmFsID0gLUVJTyA7CisJICAgIGdvdG8gZXJyb3Jfb3V0IDsKKwl9CisJaWYgKHJldHZhbCA9PSBQT1NJVElPTl9GT1VORCkgeworCSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgIlBBUC01NzEwOiByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW06IGVudHJ5IG9yIHBhc3RlZCBieXRlICglSykgZXhpc3RzIiwgcF9zX2tleSk7CisJICAgIHJldHZhbCA9IC1FRVhJU1QgOworCSAgICBnb3RvIGVycm9yX291dCA7CisJfQorCQorI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworCWNoZWNrX3Jlc2VhcmNoX2Zvcl9wYXN0ZSAocF9zX3NlYXJjaF9wYXRoLCBwX3Nfa2V5KTsKKyNlbmRpZgorICAgIH0KKworICAgIC8qIFBlcmZvcm0gYmFsYW5jaW5nIGFmdGVyIGFsbCByZXNvdXJjZXMgYXJlIGNvbGxlY3RlZCBieSBmaXhfbm9kZXMsIGFuZAorICAgICAgIGFjY2Vzc2luZyB0aGVtIHdpbGwgbm90IHJpc2sgdHJpZ2dlcmluZyBzY2hlZHVsZS4gKi8KKyAgICBpZiAoIHJldHZhbCA9PSBDQVJSWV9PTiApIHsKKwlkb19iYWxhbmNlKCZzX3Bhc3RlX2JhbGFuY2UsIE5VTEwvKmloKi8sIHBfY19ib2R5LCBNX1BBU1RFKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dmFsID0gKHJldHZhbCA9PSBOT19ESVNLX1NQQUNFKSA/IC1FTk9TUEMgOiAtRUlPOworZXJyb3Jfb3V0OgorICAgIC8qIHRoaXMgYWxzbyByZWxlYXNlcyB0aGUgcGF0aCAqLworICAgIHVuZml4X25vZGVzKCZzX3Bhc3RlX2JhbGFuY2UpOworI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCisgICAgcmVpc2VyZnNfZGVidWcgKGlub2RlLT5pX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGEgcGFzdGVfaW50b19pdGVtKCk6IGZyZWVpbmcgJXUgaWQ9JXUgdHlwZT0lYyIsIG5fcGFzdGVkX3NpemUsIGlub2RlLT5pX3VpZCwga2V5MnR5cGUoJihwX3Nfa2V5LT5vbl9kaXNrX2tleSkpKTsKKyNlbmRpZgorICAgIERRVU9UX0ZSRUVfU1BBQ0VfTk9ESVJUWShpbm9kZSwgbl9wYXN0ZWRfc2l6ZSk7CisgICAgcmV0dXJuIHJldHZhbCA7Cit9CisKKworLyogSW5zZXJ0IG5ldyBpdGVtIGludG8gdGhlIGJ1ZmZlciBhdCB0aGUgcGF0aC4gKi8KK2ludCByZWlzZXJmc19pbnNlcnRfaXRlbShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCisJCQkgc3RydWN0IHBhdGggICAgICAgICAqIAlwX3NfcGF0aCwgICAgICAgICAvKiBQYXRoIHRvIHRoZSBpbnNlcnRlZGVkIGl0ZW0uICAgICAgICAgKi8KKwkJCSBjb25zdCBzdHJ1Y3QgY3B1X2tleSAgICAgICoga2V5LAorCQkJIHN0cnVjdCBpdGVtX2hlYWQgICAgKiAJcF9zX2loLCAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaXRlbSBoZWFkZXIgdG8gaW5zZXJ0LiovCisJCQkgc3RydWN0IGlub2RlICAgICAgICAqIGlub2RlLAorCQkJIGNvbnN0IGNoYXIgICAgICAgICAgKiAJcF9jX2JvZHkpICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgYnl0ZXMgdG8gaW5zZXJ0LiAgICAgICovCit7CisgICAgc3RydWN0IHRyZWVfYmFsYW5jZSBzX2luc19iYWxhbmNlOworICAgIGludCAgICAgICAgICAgICAgICAgcmV0dmFsOworICAgIGludCBmc19nZW4gPSAwIDsKKyAgICBpbnQgcXVvdGFfYnl0ZXMgPSAwIDsKKworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKworICAgIGlmIChpbm9kZSkgeyAgICAgIC8qIERvIHdlIGNvdW50IHF1b3RhcyBmb3IgaXRlbT8gKi8KKwlmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbihpbm9kZS0+aV9zYik7CisJcXVvdGFfYnl0ZXMgPSBpaF9pdGVtX2xlbihwX3NfaWgpOworCisJLyogaGFjayBzbyB0aGUgcXVvdGEgY29kZSBkb2Vzbid0IGhhdmUgdG8gZ3Vlc3MgaWYgdGhlIGZpbGUgaGFzCisJICoqIGEgdGFpbCwgbGlua3MgYXJlIGFsd2F5cyB0YWlscywgc28gdGhlcmUncyBubyBndWVzc2luZyBuZWVkZWQKKwkgKi8KKwlpZiAoIVNfSVNMTksgKGlub2RlLT5pX21vZGUpICYmIGlzX2RpcmVjdF9sZV9paChwX3NfaWgpKSB7CisJICAgIHF1b3RhX2J5dGVzID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplICsgVU5GTV9QX1NJWkUgOworCX0KKyNpZmRlZiBSRUlTRVJRVU9UQV9ERUJVRworCXJlaXNlcmZzX2RlYnVnIChpbm9kZS0+aV9zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgInJlaXNlcnF1b3RhIGluc2VydF9pdGVtKCk6IGFsbG9jYXRpbmcgJXUgaWQ9JXUgdHlwZT0lYyIsIHF1b3RhX2J5dGVzLCBpbm9kZS0+aV91aWQsIGhlYWQydHlwZShwX3NfaWgpKTsKKyNlbmRpZgorCS8qIFdlIGNhbid0IGRpcnR5IGlub2RlIGhlcmUuIEl0IHdvdWxkIGJlIGltbWVkaWF0ZWx5IHdyaXR0ZW4gYnV0CisJICogYXBwcm9wcmlhdGUgc3RhdCBpdGVtIGlzbid0IGluc2VydGVkIHlldC4uLiAqLworCWlmIChEUVVPVF9BTExPQ19TUEFDRV9OT0RJUlRZKGlub2RlLCBxdW90YV9ieXRlcykpIHsKKwkgICAgcGF0aHJlbHNlKHBfc19wYXRoKTsKKwkgICAgcmV0dXJuIC1FRFFVT1Q7CisJfQorICAgIH0KKyAgICBpbml0X3RiX3N0cnVjdCh0aCwgJnNfaW5zX2JhbGFuY2UsIHRoLT50X3N1cGVyLCBwX3NfcGF0aCwgSUhfU0laRSArIGloX2l0ZW1fbGVuKHBfc19paCkpOworI2lmZGVmIERJU1BMQUNFX05FV19QQUNLSU5HX0xPQ0FMSVRJRVMKKyAgICBzX2luc19iYWxhbmNlLmtleSA9IGtleS0+b25fZGlza19rZXk7CisjZW5kaWYKKyAgICAvKiBEUVVPVF8qIGNhbiBzY2hlZHVsZSwgbXVzdCBjaGVjayB0byBiZSBzdXJlIGNhbGxpbmcgZml4X25vZGVzIGlzIHNhZmUgKi8KKyAgICBpZiAoaW5vZGUgJiYgZnNfY2hhbmdlZChmc19nZW4sIGlub2RlLT5pX3NiKSkgeworCWdvdG8gc2VhcmNoX2FnYWluOworICAgIH0KKworICAgIHdoaWxlICggKHJldHZhbCA9IGZpeF9ub2RlcyhNX0lOU0VSVCwgJnNfaW5zX2JhbGFuY2UsIHBfc19paCwgcF9jX2JvZHkpKSA9PSBSRVBFQVRfU0VBUkNIKSB7CitzZWFyY2hfYWdhaW46CisJLyogZmlsZSBzeXN0ZW0gY2hhbmdlZCB3aGlsZSB3ZSB3ZXJlIGluIHRoZSBmaXhfbm9kZXMgKi8KKwlQUk9DX0lORk9fSU5DKCB0aCAtPiB0X3N1cGVyLCBpbnNlcnRfaXRlbV9yZXN0YXJ0ZWQgKTsKKwlyZXR2YWwgPSBzZWFyY2hfaXRlbSAodGgtPnRfc3VwZXIsIGtleSwgcF9zX3BhdGgpOworCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkgICAgcmV0dmFsID0gLUVJTzsKKwkgICAgZ290byBlcnJvcl9vdXQgOworCX0KKwlpZiAocmV0dmFsID09IElURU1fRk9VTkQpIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAodGgtPnRfc3VwZXIsICJQQVAtNTc2MDogcmVpc2VyZnNfaW5zZXJ0X2l0ZW06ICIKKwkJCSAgICAgICJrZXkgJUsgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHRyZWUiLCBrZXkpOworCSAgICByZXR2YWwgPSAtRUVYSVNUIDsKKwkgICAgZ290byBlcnJvcl9vdXQ7IAorCX0KKyAgICB9CisKKyAgICAvKiBtYWtlIGJhbGFuY2luZyBhZnRlciBhbGwgcmVzb3VyY2VzIHdpbGwgYmUgY29sbGVjdGVkIGF0IGEgdGltZSAqLyAKKyAgICBpZiAoIHJldHZhbCA9PSBDQVJSWV9PTiApIHsKKwlkb19iYWxhbmNlICgmc19pbnNfYmFsYW5jZSwgcF9zX2loLCBwX2NfYm9keSwgTV9JTlNFUlQpOworCXJldHVybiAwOworICAgIH0KKworICAgIHJldHZhbCA9IChyZXR2YWwgPT0gTk9fRElTS19TUEFDRSkgPyAtRU5PU1BDIDogLUVJTzsKK2Vycm9yX291dDoKKyAgICAvKiBhbHNvIHJlbGVhc2VzIHRoZSBwYXRoICovCisgICAgdW5maXhfbm9kZXMoJnNfaW5zX2JhbGFuY2UpOworI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCisgICAgcmVpc2VyZnNfZGVidWcgKHRoLT50X3N1cGVyLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGEgaW5zZXJ0X2l0ZW0oKTogZnJlZWluZyAldSBpZD0ldSB0eXBlPSVjIiwgcXVvdGFfYnl0ZXMsIGlub2RlLT5pX3VpZCwgaGVhZDJ0eXBlKHBfc19paCkpOworI2VuZGlmCisgICAgaWYgKGlub2RlKQorCURRVU9UX0ZSRUVfU1BBQ0VfTk9ESVJUWShpbm9kZSwgcXVvdGFfYnl0ZXMpIDsKKyAgICByZXR1cm4gcmV0dmFsOyAKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvc3VwZXIuYyBiL2ZzL3JlaXNlcmZzL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkZjI0MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL3N1cGVyLmMKQEAgLTAsMCArMSwyMTQ4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAgYnkgSGFucyBSZWlzZXIsIGxpY2Vuc2luZyBnb3Zlcm5lZCBieSByZWlzZXJmcy9SRUFETUUKKyAqCisgKiBUcml2aWFsIGNoYW5nZXMgYnkgQWxhbiBDb3ggdG8gYWRkIHRoZSBMRlMgZml4ZXMKKyAqCisgKiBUcml2aWFsIENoYW5nZXM6CisgKiBSaWdodHMgZ3JhbnRlZCB0byBIYW5zIFJlaXNlciB0byByZWRpc3RyaWJ1dGUgdW5kZXIgb3RoZXIgdGVybXMgcHJvdmlkaW5nCisgKiBoZSBhY2NlcHRzIGFsbCBsaWFiaWxpdHkgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwYXRlbnQsIGZpdG5lc3MKKyAqIGZvciBwdXJwb3NlLCBhbmQgZGlyZWN0IG9yIGluZGlyZWN0IGNsYWltcyBhcmlzaW5nIGZyb20gZmFpbHVyZSB0byBwZXJmb3JtLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2FjbC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX3hhdHRyLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1lc3BhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKworc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgcmVpc2VyZnNfZnNfdHlwZTsKKworc3RhdGljIGNvbnN0IGNoYXIgcmVpc2VyZnNfM181X21hZ2ljX3N0cmluZ1tdID0gUkVJU0VSRlNfU1VQRVJfTUFHSUNfU1RSSU5HOworc3RhdGljIGNvbnN0IGNoYXIgcmVpc2VyZnNfM182X21hZ2ljX3N0cmluZ1tdID0gUkVJU0VSMkZTX1NVUEVSX01BR0lDX1NUUklORzsKK3N0YXRpYyBjb25zdCBjaGFyIHJlaXNlcmZzX2pyX21hZ2ljX3N0cmluZ1tdID0gUkVJU0VSMkZTX0pSX1NVUEVSX01BR0lDX1NUUklORzsKKworaW50IGlzX3JlaXNlcmZzXzNfNSAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnMpCit7CisgIHJldHVybiAhc3RybmNtcCAocnMtPnNfdjEuc19tYWdpYywgcmVpc2VyZnNfM181X21hZ2ljX3N0cmluZywKKwkJICAgc3RybGVuIChyZWlzZXJmc18zXzVfbWFnaWNfc3RyaW5nKSk7Cit9CisKKworaW50IGlzX3JlaXNlcmZzXzNfNiAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnMpCit7CisgIHJldHVybiAhc3RybmNtcCAocnMtPnNfdjEuc19tYWdpYywgcmVpc2VyZnNfM182X21hZ2ljX3N0cmluZywKKyAJCSAgIHN0cmxlbiAocmVpc2VyZnNfM182X21hZ2ljX3N0cmluZykpOworfQorCisKK2ludCBpc19yZWlzZXJmc19qciAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnMpCit7CisgIHJldHVybiAhc3RybmNtcCAocnMtPnNfdjEuc19tYWdpYywgcmVpc2VyZnNfanJfbWFnaWNfc3RyaW5nLAorIAkJICAgc3RybGVuIChyZWlzZXJmc19qcl9tYWdpY19zdHJpbmcpKTsKK30KKworCitzdGF0aWMgaW50IGlzX2FueV9yZWlzZXJmc19tYWdpY19zdHJpbmcgKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzKQoreworICByZXR1cm4gKGlzX3JlaXNlcmZzXzNfNSAocnMpIHx8IGlzX3JlaXNlcmZzXzNfNiAocnMpIHx8CisJICBpc19yZWlzZXJmc19qciAocnMpKTsKK30KKworc3RhdGljIGludCByZWlzZXJmc19yZW1vdW50IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBpbnQgKiBmbGFncywgY2hhciAqIGRhdGEpOworc3RhdGljIGludCByZWlzZXJmc19zdGF0ZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIHN0cnVjdCBrc3RhdGZzICogYnVmKTsKKworc3RhdGljIGludCByZWlzZXJmc19zeW5jX2ZzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBpbnQgd2FpdCkKK3sKKyAgICBpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCXJlaXNlcmZzX3dyaXRlX2xvY2socyk7CisJaWYgKCFqb3VybmFsX2JlZ2luKCZ0aCwgcywgMSkpCisgICAgICAgICAgICBpZiAoIWpvdXJuYWxfZW5kX3N5bmMoJnRoLCBzLCAxKSkKKyAgICAgICAgICAgICAgICByZWlzZXJmc19mbHVzaF9vbGRfY29tbWl0cyhzKTsKKwlzLT5zX2RpcnQgPSAwOyAvKiBFdmVuIGlmIGl0J3Mgbm90IHRydWUuCisgICAgICAgICAgICAgICAgICAgICAgICAqIFdlJ2xsIGxvb3AgZm9yZXZlciBpbiBzeW5jX3N1cGVycyBvdGhlcndpc2UgKi8KKwlyZWlzZXJmc193cml0ZV91bmxvY2socyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+c19kaXJ0ID0gMDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX3dyaXRlX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKyAgICByZWlzZXJmc19zeW5jX2ZzKHMsIDEpOworfQorCitzdGF0aWMgdm9pZCByZWlzZXJmc193cml0ZV9zdXBlcl9sb2NrZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCit7CisgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOworICByZWlzZXJmc193cml0ZV9sb2NrKHMpOworICBpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworICAgIGludCBlcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgcywgMSkgOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgcmVpc2VyZnNfYmxvY2tfd3JpdGVzKCZ0aCkgOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpOworICAgICAgICBqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBTQl9CVUZGRVJfV0lUSF9TQiAocykpOworICAgICAgICByZWlzZXJmc19ibG9ja193cml0ZXMoJnRoKSA7CisgICAgICAgIGpvdXJuYWxfZW5kX3N5bmMoJnRoLCBzLCAxKSA7CisgICAgfQorICB9CisgIHMtPnNfZGlydCA9IDA7CisgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKK30KKworc3RhdGljIHZvaWQgcmVpc2VyZnNfdW5sb2NrZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzKSB7CisgIHJlaXNlcmZzX2FsbG93X3dyaXRlcyhzKSA7Cit9CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICBNQVhfS0VZOworCisKKy8qIHRoaXMgaXMgdXNlZCB0byBkZWxldGUgInNhdmUgbGluayIgd2hlbiB0aGVyZSBhcmUgbm8gaXRlbXMgb2YgYQorICAgZmlsZSBpdCBwb2ludHMgdG8uIEl0IGNhbiBlaXRoZXIgaGFwcGVuIGlmIHVubGluayBpcyBjb21wbGV0ZWQgYnV0CisgICAic2F2ZSB1bmxpbmsiIHJlbW92YWwsIG9yIGlmIGZpbGUgaGFzIGJvdGggdW5saW5rIGFuZCB0cnVuY2F0ZQorICAgcGVuZGluZyBhbmQgYXMgdW5saW5rIGNvbXBsZXRlcyBmaXJzdCAoYmVjYXVzZSBrZXkgb2YgInNhdmUgbGluayIKKyAgIHByb3RlY3RpbmcgdW5saW5rIGlzIGJpZ2dlciB0aGF0IGEga2V5IGxmICJzYXZlIGxpbmsiIHdoaWNoCisgICBwcm90ZWN0cyB0cnVuY2F0ZSksIHNvIHRoZXJlIGxlZnQgbm8gaXRlbXMgdG8gbWFrZSB0cnVuY2F0ZQorICAgY29tcGxldGlvbiBvbiAqLworc3RhdGljIGludCByZW1vdmVfc2F2ZV9saW5rX29ubHkgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXksIGludCBvaWRfZnJlZSkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworICAgIGludCBlcnI7CisKKyAgICAgLyogd2UgYXJlIGdvaW5nIHRvIGRvIG9uZSBiYWxhbmNpbmcgKi8KKyAgICAgZXJyID0gam91cm5hbF9iZWdpbiAoJnRoLCBzLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCk7CisgICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiBlcnI7CisgCisgICAgIHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtICgmdGgsIE5VTEwsIGtleSk7CisgICAgIGlmIChvaWRfZnJlZSkKKyAgICAgICAgLyogcmVtb3ZhbHMgYXJlIHByb3RlY3RlZCBieSBkaXJlY3QgaXRlbXMgKi8KKyAgICAgICAgcmVpc2VyZnNfcmVsZWFzZV9vYmplY3RpZCAoJnRoLCBsZTMyX3RvX2NwdSAoa2V5LT5rX29iamVjdGlkKSk7CisKKyAgICAgcmV0dXJuIGpvdXJuYWxfZW5kICgmdGgsIHMsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UKTsKK30KKyAKKyNpZmRlZiBDT05GSUdfUVVPVEEKK3N0YXRpYyBpbnQgcmVpc2VyZnNfcXVvdGFfb25fbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCk7CisjZW5kaWYKKyAKKy8qIGxvb2sgZm9yIHVuY29tcGxldGVkIHVubGlua3MgYW5kIHRydW5jYXRlcyBhbmQgY29tcGxldGUgdGhlbSAqLworc3RhdGljIGludCBmaW5pc2hfdW5maW5pc2hlZCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcykKK3sKKyAgICBJTklUSUFMSVpFX1BBVEggKHBhdGgpOworICAgIHN0cnVjdCBjcHVfa2V5IG1heF9jcHVfa2V5LCBvYmpfa2V5OworICAgIHN0cnVjdCByZWlzZXJmc19rZXkgc2F2ZV9saW5rX2tleTsKKyAgICBpbnQgcmV0dmFsID0gMDsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisgICAgaW50IGl0ZW1fcG9zOworICAgIGNoYXIgKiBpdGVtOworICAgIGludCBkb25lOworICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlOworICAgIGludCB0cnVuY2F0ZTsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKyAgICBpbnQgaTsKKyAgICBpbnQgbXNfYWN0aXZlX3NldDsKKyNlbmRpZgorIAorIAorICAgIC8qIGNvbXBvc2Uga2V5IHRvIGxvb2sgZm9yICJzYXZlIiBsaW5rcyAqLworICAgIG1heF9jcHVfa2V5LnZlcnNpb24gPSBLRVlfRk9STUFUXzNfNTsKKyAgICBtYXhfY3B1X2tleS5vbl9kaXNrX2tleSA9IE1BWF9LRVk7CisgICAgbWF4X2NwdV9rZXkua2V5X2xlbmd0aCA9IDM7CisKKyNpZmRlZiBDT05GSUdfUVVPVEEKKyAgICAvKiBOZWVkZWQgZm9yIGlwdXQoKSB0byB3b3JrIGNvcnJlY3RseSBhbmQgbm90IHRyYXNoIGRhdGEgKi8KKyAgICBpZiAocy0+c19mbGFncyAmIE1TX0FDVElWRSkgeworCSAgICBtc19hY3RpdmVfc2V0ID0gMDsKKyAgICB9IGVsc2UgeworCSAgICBtc19hY3RpdmVfc2V0ID0gMTsKKwkgICAgcy0+c19mbGFncyB8PSBNU19BQ1RJVkU7CisgICAgfQorICAgIC8qIFR1cm4gb24gcXVvdGFzIHNvIHRoYXQgdGhleSBhcmUgdXBkYXRlZCBjb3JyZWN0bHkgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspIHsKKwlpZiAoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbaV0pIHsKKwkgICAgaW50IHJldCA9IHJlaXNlcmZzX3F1b3RhX29uX21vdW50KHMsIGkpOworCSAgICBpZiAocmV0IDwgMCkKKwkJcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnM6IGNhbm5vdCB0dXJuIG9uIGpvdXJuYWxsZWQgcXVvdGE6IGVycm9yICVkIiwgcmV0KTsKKwl9CisgICAgfQorI2VuZGlmCisgCisgICAgZG9uZSA9IDA7CisgICAgUkVJU0VSRlNfU0IocyktPnNfaXNfdW5saW5rZWRfb2sgPSAxOworICAgIHdoaWxlICghcmV0dmFsKSB7CisgICAgICAgIHJldHZhbCA9IHNlYXJjaF9pdGVtIChzLCAmbWF4X2NwdV9rZXksICZwYXRoKTsKKyAgICAgICAgaWYgKHJldHZhbCAhPSBJVEVNX05PVF9GT1VORCkgeworICAgICAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgInZzLTIxNDA6IGZpbmlzaF91bmZpbmlzaGVkOiBzZWFyY2hfYnlfa2V5IHJldHVybmVkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYmggPSBnZXRfbGFzdF9iaCAoJnBhdGgpOworICAgICAgICBpdGVtX3BvcyA9IGdldF9pdGVtX3BvcyAoJnBhdGgpOworICAgICAgICBpZiAoaXRlbV9wb3MgIT0gQl9OUl9JVEVNUyAoYmgpKSB7CisgICAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChzLCAidnMtMjA2MDogZmluaXNoX3VuZmluaXNoZWQ6IHdyb25nIHBvc2l0aW9uIGZvdW5kIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpdGVtX3BvcyAtLTsKKyAgICAgICAgaWggPSBCX05fUElURU1fSEVBRCAoYmgsIGl0ZW1fcG9zKTsKKyAKKyAgICAgICAgaWYgKGxlMzJfdG9fY3B1IChpaC0+aWhfa2V5LmtfZGlyX2lkKSAhPSBNQVhfS0VZX09CSkVDVElEKQorICAgICAgICAgICAgLyogdGhlcmUgYXJlIG5vICJzYXZlIiBsaW5rcyBhbnltb3JlICovCisgICAgICAgICAgICBicmVhazsKKyAKKyAgICAgICAgc2F2ZV9saW5rX2tleSA9IGloLT5paF9rZXk7CisgICAgICAgIGlmIChpc19pbmRpcmVjdF9sZV9paCAoaWgpKQorICAgICAgICAgICAgdHJ1bmNhdGUgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0cnVuY2F0ZSA9IDA7CisgCisgICAgICAgIC8qIHJlaXNlcmZzX2lnZXQgbmVlZHMga19kaXJpZCBhbmQga19vYmplY3RpZCBvbmx5ICovCisgICAgICAgIGl0ZW0gPSBCX0lfUElURU0gKGJoLCBpaCk7CisgICAgICAgIG9ial9rZXkub25fZGlza19rZXkua19kaXJfaWQgPSBsZTMyX3RvX2NwdSAoKihfX3UzMiAqKWl0ZW0pOworICAgICAgICBvYmpfa2V5Lm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSBsZTMyX3RvX2NwdSAoaWgtPmloX2tleS5rX29iamVjdGlkKTsKKwlvYmpfa2V5Lm9uX2Rpc2tfa2V5LnUua19vZmZzZXRfdjEua19vZmZzZXQgPSAwOworCW9ial9rZXkub25fZGlza19rZXkudS5rX29mZnNldF92MS5rX3VuaXF1ZW5lc3MgPSAwOworCQorICAgICAgICBwYXRocmVsc2UgKCZwYXRoKTsKKyAKKyAgICAgICAgaW5vZGUgPSByZWlzZXJmc19pZ2V0IChzLCAmb2JqX2tleSk7CisgICAgICAgIGlmICghaW5vZGUpIHsKKyAgICAgICAgICAgIC8qIHRoZSB1bmxpbmsgYWxtb3N0IGNvbXBsZXRlZCwgaXQganVzdCBkaWQgbm90IG1hbmFnZSB0byByZW1vdmUKKwkgICAgICAgInNhdmUiIGxpbmsgYW5kIHJlbGVhc2Ugb2JqZWN0aWQgKi8KKyAgICAgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy0yMTgwOiBmaW5pc2hfdW5maW5pc2hlZDogaWdldCBmYWlsZWQgZm9yICVLIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmpfa2V5KTsKKyAgICAgICAgICAgIHJldHZhbCA9IHJlbW92ZV9zYXZlX2xpbmtfb25seSAocywgJnNhdmVfbGlua19rZXksIDEpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworCWlmICghdHJ1bmNhdGUgJiYgaW5vZGUtPmlfbmxpbmspIHsKKwkgICAgLyogZmlsZSBpcyBub3QgdW5saW5rZWQgKi8KKyAgICAgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy0yMTg1OiBmaW5pc2hfdW5maW5pc2hlZDogZmlsZSAlSyBpcyBub3QgdW5saW5rZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9ial9rZXkpOworICAgICAgICAgICAgcmV0dmFsID0gcmVtb3ZlX3NhdmVfbGlua19vbmx5IChzLCAmc2F2ZV9saW5rX2tleSwgMCk7CisgICAgICAgICAgICBjb250aW51ZTsKKwl9CisJRFFVT1RfSU5JVChpbm9kZSk7CisKKwlpZiAodHJ1bmNhdGUgJiYgU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkgKSB7CisJICAgIC8qIFdlIGdvdCBhIHRydW5jYXRlIHJlcXVlc3QgZm9yIGEgZGlyIHdoaWNoIGlzIGltcG9zc2libGUuCisJICAgICAgIFRoZSBvbmx5IGltYWdpbmFibGUgd2F5IGlzIHRvIGV4ZWN1dGUgdW5maW5pc2hlZCB0cnVuY2F0ZSByZXF1ZXN0CisJICAgICAgIHRoZW4gYm9vdCBpbnRvIG9sZCBrZXJuZWwsIHJlbW92ZSB0aGUgZmlsZSBhbmQgY3JlYXRlIGRpciB3aXRoCisJICAgICAgIHRoZSBzYW1lIGtleS4gKi8KKwkgICAgcmVpc2VyZnNfd2FybmluZyhzLCAiZ3JlZW4tMjEwMTogaW1wb3NzaWJsZSB0cnVuY2F0ZSBvbiBhIGRpcmVjdG9yeSAlay4gUGxlYXNlIHJlcG9ydCIsIElOT0RFX1BLRVkgKGlub2RlKSk7CisJICAgIHJldHZhbCA9IHJlbW92ZV9zYXZlX2xpbmtfb25seSAocywgJnNhdmVfbGlua19rZXksIDApOworCSAgICB0cnVuY2F0ZSA9IDA7CisJICAgIGlwdXQgKGlub2RlKTsgCisJICAgIGNvbnRpbnVlOworCX0KKyAKKyAgICAgICAgaWYgKHRydW5jYXRlKSB7CisgICAgICAgICAgICBSRUlTRVJGU19JKGlub2RlKSAtPiBpX2ZsYWdzIHw9IGlfbGlua19zYXZlZF90cnVuY2F0ZV9tYXNrOworICAgICAgICAgICAgLyogbm90IGNvbXBsZXRlZCB0cnVuY2F0ZSBmb3VuZC4gTmV3IHNpemUgd2FzIGNvbW1pdHRlZCB0b2dldGhlcgorCSAgICAgICB3aXRoICJzYXZlIiBsaW5rICovCisgICAgICAgICAgICByZWlzZXJmc19pbmZvIChzLCAiVHJ1bmNhdGluZyAlayB0byAlTGQgLi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5PREVfUEtFWSAoaW5vZGUpLCBpbm9kZS0+aV9zaXplKTsKKyAgICAgICAgICAgIHJlaXNlcmZzX3RydW5jYXRlX2ZpbGUgKGlub2RlLCAwLypkb24ndCB1cGRhdGUgbW9kaWZpY2F0aW9uIHRpbWUqLyk7CisgICAgICAgICAgICByZXR2YWwgPSByZW1vdmVfc2F2ZV9saW5rIChpbm9kZSwgdHJ1bmNhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9mbGFncyB8PSBpX2xpbmtfc2F2ZWRfdW5saW5rX21hc2s7CisgICAgICAgICAgICAvKiBub3QgY29tcGxldGVkIHVubGluayAocm1kaXIpIGZvdW5kICovCisgICAgICAgICAgICByZWlzZXJmc19pbmZvIChzLCAiUmVtb3ZpbmcgJWsuLiIsIElOT0RFX1BLRVkgKGlub2RlKSk7CisgICAgICAgICAgICAvKiByZW1vdmFsIGdldHMgY29tcGxldGVkIGluIGlwdXQgKi8KKyAgICAgICAgICAgIHJldHZhbCA9IDA7CisgICAgICAgIH0KKyAKKyAgICAgICAgaXB1dCAoaW5vZGUpOworICAgICAgICBwcmludGsgKCJkb25lXG4iKTsKKyAgICAgICAgZG9uZSArKzsKKyAgICB9CisgICAgUkVJU0VSRlNfU0IocyktPnNfaXNfdW5saW5rZWRfb2sgPSAwOworICAgICAKKyNpZmRlZiBDT05GSUdfUVVPVEEKKyAgICAvKiBUdXJuIHF1b3RhcyBvZmYgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzYl9kcW9wdChzKS0+ZmlsZXNbaV0pCisgICAgICAgICAgICAgICAgICAgIHZmc19xdW90YV9vZmZfbW91bnQocywgaSk7CisgICAgfQorICAgIGlmIChtc19hY3RpdmVfc2V0KQorCSAgICAvKiBSZXN0b3JlIHRoZSBmbGFnIGJhY2sgKi8KKwkgICAgcy0+c19mbGFncyAmPSB+TVNfQUNUSVZFOworI2VuZGlmCisgICAgcGF0aHJlbHNlICgmcGF0aCk7CisgICAgaWYgKGRvbmUpCisgICAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJUaGVyZSB3ZXJlICVkIHVuY29tcGxldGVkIHVubGlua3MvdHJ1bmNhdGVzLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDb21wbGV0ZWRcbiIsIGRvbmUpOworICAgIHJldHVybiByZXR2YWw7Cit9CisgCisvKiB0byBwcm90ZWN0IGZpbGUgYmVpbmcgdW5saW5rZWQgZnJvbSBnZXR0aW5nIGxvc3Qgd2UgInNhZmUiIGxpbmsgZmlsZXMKKyAgIGJlaW5nIHVubGlua2VkLiBUaGlzIGxpbmsgd2lsbCBiZSBkZWxldGVkIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uIHdpdGggbGFzdAorICAgaXRlbSBvZiBmaWxlLiBtb3VudGluZyB0aGUgZmlsZXN5dGVtIHdlIHNjYW4gYWxsIHRoZXNlIGxpbmtzIGFuZCByZW1vdmUKKyAgIGZpbGVzIHdoaWNoIGFsbW9zdCBnb3QgbG9zdCAqLwordm9pZCBhZGRfc2F2ZV9saW5rIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICogdGgsCisJCSAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IHRydW5jYXRlKQoreworICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aCk7CisgICAgaW50IHJldHZhbDsKKyAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7CisgICAgc3RydWN0IGl0ZW1faGVhZCBpaDsKKyAgICBfX3UzMiBsaW5rOworCisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCisgICAgLyogZmlsZSBjYW4gb25seSBnZXQgb25lICJzYXZlIGxpbmsiIG9mIGVhY2gga2luZCAqLworICAgIFJGQUxTRSggdHJ1bmNhdGUgJiYgCisJICAgICggUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9mbGFncyAmIGlfbGlua19zYXZlZF90cnVuY2F0ZV9tYXNrICksCisJICAgICJzYXZlZCBsaW5rIGFscmVhZHkgZXhpc3RzIGZvciB0cnVuY2F0ZWQgaW5vZGUgJWx4IiwKKwkgICAgKCBsb25nICkgaW5vZGUgLT4gaV9pbm8gKTsKKyAgICBSRkFMU0UoICF0cnVuY2F0ZSAmJiAKKwkgICAgKCBSRUlTRVJGU19JKGlub2RlKSAtPiBpX2ZsYWdzICYgaV9saW5rX3NhdmVkX3VubGlua19tYXNrICksCisJICAgICJzYXZlZCBsaW5rIGFscmVhZHkgZXhpc3RzIGZvciB1bmxpbmtlZCBpbm9kZSAlbHgiLAorCSAgICAoIGxvbmcgKSBpbm9kZSAtPiBpX2lubyApOworCisgICAgLyogc2V0dXAga2V5IG9mICJzYXZlIiBsaW5rICovCisgICAga2V5LnZlcnNpb24gPSBLRVlfRk9STUFUXzNfNTsKKyAgICBrZXkub25fZGlza19rZXkua19kaXJfaWQgPSBNQVhfS0VZX09CSkVDVElEOworICAgIGtleS5vbl9kaXNrX2tleS5rX29iamVjdGlkID0gaW5vZGUtPmlfaW5vOworICAgIGlmICghdHJ1bmNhdGUpIHsKKwkvKiB1bmxpbmssIHJtZGlyLCByZW5hbWUgKi8KKwlzZXRfY3B1X2tleV9rX29mZnNldCAoJmtleSwgMSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJc2V0X2NwdV9rZXlfa190eXBlICgma2V5LCBUWVBFX0RJUkVDVCk7CisKKwkvKiBpdGVtIGhlYWQgb2YgInNhZmUiIGxpbmsgKi8KKwltYWtlX2xlX2l0ZW1faGVhZCAoJmloLCAma2V5LCBrZXkudmVyc2lvbiwgMSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwgVFlQRV9ESVJFQ1QsCisJCQkgICA0LypsZW5ndGgqLywgMHhmZmZmLypmcmVlIHNwYWNlKi8pOworICAgIH0gZWxzZSB7CisJLyogdHJ1bmNhdGUgKi8KKwlpZiAoU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkpCisJICAgIHJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsICJncmVlbi0yMTAyOiBBZGRpbmcgYSB0cnVuY2F0ZSBzYXZlbGluayBmb3IgYSBkaXJlY3RvcnkgJWshIFBsZWFzZSByZXBvcnQiLCBJTk9ERV9QS0VZKGlub2RlKSk7CisJc2V0X2NwdV9rZXlfa19vZmZzZXQgKCZrZXksIDEpOworCXNldF9jcHVfa2V5X2tfdHlwZSAoJmtleSwgVFlQRV9JTkRJUkVDVCk7CisKKwkvKiBpdGVtIGhlYWQgb2YgInNhZmUiIGxpbmsgKi8KKwltYWtlX2xlX2l0ZW1faGVhZCAoJmloLCAma2V5LCBrZXkudmVyc2lvbiwgMSwgVFlQRV9JTkRJUkVDVCwKKwkJCSAgIDQvKmxlbmd0aCovLCAwLypmcmVlIHNwYWNlKi8pOworICAgIH0KKyAgICBrZXkua2V5X2xlbmd0aCA9IDM7CisKKyAgICAvKiBsb29rIGZvciBpdHMgcGxhY2UgaW4gdGhlIHRyZWUgKi8KKyAgICByZXR2YWwgPSBzZWFyY2hfaXRlbSAoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKyAgICBpZiAocmV0dmFsICE9IElURU1fTk9UX0ZPVU5EKSB7CisJaWYgKCByZXR2YWwgIT0gLUVOT1NQQyApCisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAidnMtMjEwMDogYWRkX3NhdmVfbGluazoiCisJCQkgICJzZWFyY2hfYnlfa2V5ICglSykgcmV0dXJuZWQgJWQiLCAma2V5LCByZXR2YWwpOworCXBhdGhyZWxzZSAoJnBhdGgpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBib2R5IG9mICJzYXZlIiBsaW5rICovCisgICAgbGluayA9IElOT0RFX1BLRVkgKGlub2RlKS0+a19kaXJfaWQ7CisKKyAgICAvKiBwdXQgInNhdmUiIGxpbmsgaW5vdCB0cmVlLCBkb24ndCBjaGFyZ2UgcXVvdGEgdG8gYW55b25lICovCisgICAgcmV0dmFsID0gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0gKHRoLCAmcGF0aCwgJmtleSwgJmloLCBOVUxMLCAoY2hhciAqKSZsaW5rKTsKKyAgICBpZiAocmV0dmFsKSB7CisJaWYgKHJldHZhbCAhPSAtRU5PU1BDKQorCSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgInZzLTIxMjA6IGFkZF9zYXZlX2xpbms6IGluc2VydF9pdGVtIHJldHVybmVkICVkIiwKKwkJCSAgcmV0dmFsKTsKKyAgICB9IGVsc2UgeworCWlmKCB0cnVuY2F0ZSApCisJICAgIFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgfD0gaV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2s7CisJZWxzZQorCSAgICBSRUlTRVJGU19JKGlub2RlKSAtPiBpX2ZsYWdzIHw9IGlfbGlua19zYXZlZF91bmxpbmtfbWFzazsKKyAgICB9Cit9CisKKworLyogdGhpcyBvcGVucyB0cmFuc2FjdGlvbiB1bmxpa2UgYWRkX3NhdmVfbGluayAqLworaW50IHJlbW92ZV9zYXZlX2xpbmsgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgdHJ1bmNhdGUpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfa2V5IGtleTsKKyAgICBpbnQgZXJyOworIAorICAgIC8qIHdlIGFyZSBnb2luZyB0byBkbyBvbmUgYmFsYW5jaW5nIG9ubHkgKi8KKyAgICBlcnIgPSBqb3VybmFsX2JlZ2luICgmdGgsIGlub2RlLT5pX3NiLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCk7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKyAKKyAgICAvKiBzZXR1cCBrZXkgb2YgInNhdmUiIGxpbmsgKi8KKyAgICBrZXkua19kaXJfaWQgPSBjcHVfdG9fbGUzMiAoTUFYX0tFWV9PQkpFQ1RJRCk7CisgICAga2V5Lmtfb2JqZWN0aWQgPSBJTk9ERV9QS0VZIChpbm9kZSktPmtfb2JqZWN0aWQ7CisgICAgaWYgKCF0cnVuY2F0ZSkgeworICAgICAgICAvKiB1bmxpbmssIHJtZGlyLCByZW5hbWUgKi8KKyAgICAgICAgc2V0X2xlX2tleV9rX29mZnNldCAoS0VZX0ZPUk1BVF8zXzUsICZrZXksCisJCQkgICAgIDEgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworICAgICAgICBzZXRfbGVfa2V5X2tfdHlwZSAoS0VZX0ZPUk1BVF8zXzUsICZrZXksIFRZUEVfRElSRUNUKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiB0cnVuY2F0ZSAqLworICAgICAgICBzZXRfbGVfa2V5X2tfb2Zmc2V0IChLRVlfRk9STUFUXzNfNSwgJmtleSwgMSk7CisgICAgICAgIHNldF9sZV9rZXlfa190eXBlIChLRVlfRk9STUFUXzNfNSwgJmtleSwgVFlQRV9JTkRJUkVDVCk7CisgICAgfQorIAorICAgIGlmKCAoIHRydW5jYXRlICYmIAorICAgICAgICAgICggUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9mbGFncyAmIGlfbGlua19zYXZlZF90cnVuY2F0ZV9tYXNrICkgKSB8fAorICAgICAgICAoICF0cnVuY2F0ZSAmJiAKKyAgICAgICAgICAoIFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgJiBpX2xpbmtfc2F2ZWRfdW5saW5rX21hc2sgKSApICkKKwkvKiBkb24ndCB0YWtlIHF1b3RhIGJ5dGVzIGZyb20gYW55d2hlcmUgKi8KKwlyZWlzZXJmc19kZWxldGVfc29saWRfaXRlbSAoJnRoLCBOVUxMLCAma2V5KTsKKyAgICBpZiAoIXRydW5jYXRlKSB7CisJcmVpc2VyZnNfcmVsZWFzZV9vYmplY3RpZCAoJnRoLCBpbm9kZS0+aV9pbm8pOworCVJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgJj0gfmlfbGlua19zYXZlZF91bmxpbmtfbWFzazsKKyAgICB9IGVsc2UKKwlSRUlTRVJGU19JKGlub2RlKSAtPiBpX2ZsYWdzICY9IH5pX2xpbmtfc2F2ZWRfdHJ1bmNhdGVfbWFzazsKKyAKKyAgICByZXR1cm4gam91cm5hbF9lbmQgKCZ0aCwgaW5vZGUtPmlfc2IsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UKTsKK30KKworCitzdGF0aWMgdm9pZCByZWlzZXJmc19wdXRfc3VwZXIgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCit7CisgIGludCBpOworICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKKyAgdGgudF90cmFuc19pZCA9IDA7CisKKyAgaWYgKFJFSVNFUkZTX1NCKHMpLT54YXR0cl9yb290KSB7CisgICAgZF9pbnZhbGlkYXRlIChSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCk7CisgICAgZHB1dCAoUkVJU0VSRlNfU0IocyktPnhhdHRyX3Jvb3QpOworICB9CisgIAorICBpZiAoUkVJU0VSRlNfU0IocyktPnByaXZfcm9vdCkgeworICAgIGRfaW52YWxpZGF0ZSAoUkVJU0VSRlNfU0IocyktPnByaXZfcm9vdCk7CisgICAgZHB1dCAoUkVJU0VSRlNfU0IocyktPnByaXZfcm9vdCk7CisgIH0KKworICAvKiBjaGFuZ2UgZmlsZSBzeXN0ZW0gc3RhdGUgdG8gY3VycmVudCBzdGF0ZSBpZiBpdCB3YXMgbW91bnRlZCB3aXRoIHJlYWQtd3JpdGUgcGVybWlzc2lvbnMgKi8KKyAgaWYgKCEocy0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKyAgICBpZiAoIWpvdXJuYWxfYmVnaW4oJnRoLCBzLCAxMCkpIHsKKyAgICAgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSkgOworICAgICAgICBzZXRfc2JfdW1vdW50X3N0YXRlKCBTQl9ESVNLX1NVUEVSX0JMT0NLKHMpLCBSRUlTRVJGU19TQihzKS0+c19tb3VudF9zdGF0ZSApOworICAgICAgICBqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBTQl9CVUZGRVJfV0lUSF9TQiAocykpOworICAgIH0KKyAgfQorCisgIC8qIG5vdGUsIGpvdXJuYWxfcmVsZWFzZSBjaGVja3MgZm9yIHJlYWRvbmx5IG1vdW50LCBhbmQgY2FuIGRlY2lkZSBub3QKKyAgKiogdG8gZG8gYSBqb3VybmFsX2VuZAorICAqLworICBqb3VybmFsX3JlbGVhc2UoJnRoLCBzKSA7CisKKyAgZm9yIChpID0gMDsgaSA8IFNCX0JNQVBfTlIgKHMpOyBpICsrKQorICAgIGJyZWxzZSAoU0JfQVBfQklUTUFQIChzKVtpXS5iaCk7CisKKyAgdmZyZWUgKFNCX0FQX0JJVE1BUCAocykpOworCisgIGJyZWxzZSAoU0JfQlVGRkVSX1dJVEhfU0IgKHMpKTsKKworICBwcmludF9zdGF0aXN0aWNzIChzKTsKKworICBpZiAoUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MgIT0gMCkgeworICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy0yMDA0OiByZWlzZXJmc19wdXRfc3VwZXI6IGFsbG9jYXRlZCBtZW1vcnkgbGVmdCAlZCIsCisJCSAgICAgIFJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzKTsKKyAgfQorCisgIGlmIChSRUlTRVJGU19TQihzKS0+cmVzZXJ2ZWRfYmxvY2tzICE9IDApIHsKKyAgICByZWlzZXJmc193YXJuaW5nIChzLCAiZ3JlZW4tMjAwNTogcmVpc2VyZnNfcHV0X3N1cGVyOiByZXNlcnZlZCBibG9ja3MgbGVmdCAlZCIsCisJCSAgICAgIFJFSVNFUkZTX1NCKHMpLT5yZXNlcnZlZF9ibG9ja3MpOworICB9CisKKyAgcmVpc2VyZnNfcHJvY19pbmZvX2RvbmUoIHMgKTsKKworICBrZnJlZShzLT5zX2ZzX2luZm8pOworICBzLT5zX2ZzX2luZm8gPSBOVUxMOworCisgIHJldHVybjsKK30KKworc3RhdGljIGttZW1fY2FjaGVfdCAqIHJlaXNlcmZzX2lub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqcmVpc2VyZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqZWk7CisJZWkgPSAoc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKHJlaXNlcmZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghZWkpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmZWktPnZmc19pbm9kZTsKK30KKworc3RhdGljIHZvaWQgcmVpc2VyZnNfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShyZWlzZXJmc19pbm9kZV9jYWNoZXAsIFJFSVNFUkZTX0koaW5vZGUpKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKikgZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikgeworCQlJTklUX0xJU1RfSEVBRCgmZWktPmlfcHJlYWxsb2NfbGlzdCkgOworCQlpbm9kZV9pbml0X29uY2UoJmVpLT52ZnNfaW5vZGUpOworCQllaS0+aV9hY2xfYWNjZXNzID0gTlVMTDsKKwkJZWktPmlfYWNsX2RlZmF1bHQgPSBOVUxMOworCX0KK30KKyAKK3N0YXRpYyBpbnQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpCit7CisJcmVpc2VyZnNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoInJlaXNlcl9pbm9kZV9jYWNoZSIsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvKSwKKwkJCQkJICAgICAwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQkJICAgICBpbml0X29uY2UsIE5VTEwpOworCWlmIChyZWlzZXJmc19pbm9kZV9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQoreworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kocmVpc2VyZnNfaW5vZGVfY2FjaGVwKSkKKwkJcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgInJlaXNlcmZzX2lub2RlX2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZCIpOworfQorCisvKiB3ZSBkb24ndCBtYXJrIGlub2RlcyBkaXJ0eSwgd2UganVzdCBsb2cgdGhlbSAqLworc3RhdGljIHZvaWQgcmVpc2VyZnNfZGlydHlfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlKSB7CisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7CisKKyAgICBpbnQgZXJyID0gMDsKKyAgICBpZiAoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKKyAgICAgICAgcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwgImNsbS02MDA2OiB3cml0aW5nIGlub2RlICVsdSBvbiByZWFkb25seSBGUyIsCisJICAgICAgICAgICAgICAgICAgaW5vZGUtPmlfaW5vKSA7CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCisgICAgLyogdGhpcyBpcyByZWFsbHkgb25seSB1c2VkIGZvciBhdGltZSB1cGRhdGVzLCBzbyB0aGV5IGRvbid0IGhhdmUKKyAgICAqKiB0byBiZSBpbmNsdWRlZCBpbiBPX1NZTkMgb3IgZnN5bmMKKyAgICAqLworICAgIGVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgMSkgOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrIChpbm9kZS0+aV9zYik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlKTsKKyAgICBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCAxKSA7CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKK30KKworc3RhdGljIHZvaWQgcmVpc2VyZnNfY2xlYXJfaW5vZGUgKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisgICAgc3RydWN0IHBvc2l4X2FjbCAqYWNsOworCisgICAgYWNsID0gUkVJU0VSRlNfSShpbm9kZSktPmlfYWNsX2FjY2VzczsKKyAgICBpZiAoYWNsICYmICFJU19FUlIgKGFjbCkpCisgICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlIChhY2wpOworICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9hY2Nlc3MgPSBOVUxMOworCisgICAgYWNsID0gUkVJU0VSRlNfSShpbm9kZSktPmlfYWNsX2RlZmF1bHQ7CisgICAgaWYgKGFjbCAmJiAhSVNfRVJSIChhY2wpKQorICAgICAgICBwb3NpeF9hY2xfcmVsZWFzZSAoYWNsKTsKKyAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfZGVmYXVsdCA9IE5VTEw7Cit9CisKKyNpZmRlZiBDT05GSUdfUVVPVEEKK3N0YXRpYyBzc2l6ZV90IHJlaXNlcmZzX3F1b3RhX3dyaXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBsb2ZmX3QpOworc3RhdGljIHNzaXplX3QgcmVpc2VyZnNfcXVvdGFfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50LCBjaGFyICosIHNpemVfdCwgbG9mZl90KTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgcmVpc2VyZnNfc29wcyA9Cit7CisgIC5hbGxvY19pbm9kZSA9IHJlaXNlcmZzX2FsbG9jX2lub2RlLAorICAuZGVzdHJveV9pbm9kZSA9IHJlaXNlcmZzX2Rlc3Ryb3lfaW5vZGUsCisgIC53cml0ZV9pbm9kZSA9IHJlaXNlcmZzX3dyaXRlX2lub2RlLAorICAuZGlydHlfaW5vZGUgPSByZWlzZXJmc19kaXJ0eV9pbm9kZSwKKyAgLmRlbGV0ZV9pbm9kZSA9IHJlaXNlcmZzX2RlbGV0ZV9pbm9kZSwKKyAgLmNsZWFyX2lub2RlICA9IHJlaXNlcmZzX2NsZWFyX2lub2RlLAorICAucHV0X3N1cGVyID0gcmVpc2VyZnNfcHV0X3N1cGVyLAorICAud3JpdGVfc3VwZXIgPSByZWlzZXJmc193cml0ZV9zdXBlciwKKyAgLnN5bmNfZnMgPSByZWlzZXJmc19zeW5jX2ZzLAorICAud3JpdGVfc3VwZXJfbG9ja2ZzID0gcmVpc2VyZnNfd3JpdGVfc3VwZXJfbG9ja2ZzLAorICAudW5sb2NrZnMgPSByZWlzZXJmc191bmxvY2tmcywKKyAgLnN0YXRmcyA9IHJlaXNlcmZzX3N0YXRmcywKKyAgLnJlbW91bnRfZnMgPSByZWlzZXJmc19yZW1vdW50LAorI2lmZGVmIENPTkZJR19RVU9UQQorICAucXVvdGFfcmVhZCA9IHJlaXNlcmZzX3F1b3RhX3JlYWQsCisgIC5xdW90YV93cml0ZSA9IHJlaXNlcmZzX3F1b3RhX3dyaXRlLAorI2VuZGlmCit9OworCisjaWZkZWYgQ09ORklHX1FVT1RBCisjZGVmaW5lIFFUWVBFMk5BTUUodCkgKCh0KT09VVNSUVVPVEE/InVzZXIiOiJncm91cCIpCisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfZHF1b3RfaW5pdGlhbGl6ZShzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfZHF1b3RfZHJvcChzdHJ1Y3QgaW5vZGUgKik7CitzdGF0aWMgaW50IHJlaXNlcmZzX3dyaXRlX2RxdW90KHN0cnVjdCBkcXVvdCAqKTsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfYWNxdWlyZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKik7CitzdGF0aWMgaW50IHJlaXNlcmZzX3JlbGVhc2VfZHF1b3Qoc3RydWN0IGRxdW90ICopOworc3RhdGljIGludCByZWlzZXJmc19tYXJrX2RxdW90X2RpcnR5KHN0cnVjdCBkcXVvdCAqKTsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfd3JpdGVfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50KTsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfcXVvdGFfb24oc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgaW50LCBjaGFyICopOworCitzdGF0aWMgc3RydWN0IGRxdW90X29wZXJhdGlvbnMgcmVpc2VyZnNfcXVvdGFfb3BlcmF0aW9ucyA9Cit7CisgIC5pbml0aWFsaXplID0gcmVpc2VyZnNfZHF1b3RfaW5pdGlhbGl6ZSwKKyAgLmRyb3AgPSByZWlzZXJmc19kcXVvdF9kcm9wLAorICAuYWxsb2Nfc3BhY2UgPSBkcXVvdF9hbGxvY19zcGFjZSwKKyAgLmFsbG9jX2lub2RlID0gZHF1b3RfYWxsb2NfaW5vZGUsCisgIC5mcmVlX3NwYWNlID0gZHF1b3RfZnJlZV9zcGFjZSwKKyAgLmZyZWVfaW5vZGUgPSBkcXVvdF9mcmVlX2lub2RlLAorICAudHJhbnNmZXIgPSBkcXVvdF90cmFuc2ZlciwKKyAgLndyaXRlX2RxdW90ID0gcmVpc2VyZnNfd3JpdGVfZHF1b3QsCisgIC5hY3F1aXJlX2RxdW90ID0gcmVpc2VyZnNfYWNxdWlyZV9kcXVvdCwKKyAgLnJlbGVhc2VfZHF1b3QgPSByZWlzZXJmc19yZWxlYXNlX2RxdW90LAorICAubWFya19kaXJ0eSA9IHJlaXNlcmZzX21hcmtfZHF1b3RfZGlydHksCisgIC53cml0ZV9pbmZvID0gcmVpc2VyZnNfd3JpdGVfaW5mbywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcXVvdGFjdGxfb3BzIHJlaXNlcmZzX3FjdGxfb3BlcmF0aW9ucyA9Cit7CisgIC5xdW90YV9vbiA9IHJlaXNlcmZzX3F1b3RhX29uLAorICAucXVvdGFfb2ZmID0gdmZzX3F1b3RhX29mZiwKKyAgLnF1b3RhX3N5bmMgPSB2ZnNfcXVvdGFfc3luYywKKyAgLmdldF9pbmZvID0gdmZzX2dldF9kcWluZm8sCisgIC5zZXRfaW5mbyA9IHZmc19zZXRfZHFpbmZvLAorICAuZ2V0X2RxYmxrID0gdmZzX2dldF9kcWJsaywKKyAgLnNldF9kcWJsayA9IHZmc19zZXRfZHFibGssCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgcmVpc2VyZnNfZXhwb3J0X29wcyA9IHsKKyAgLmVuY29kZV9maCA9IHJlaXNlcmZzX2VuY29kZV9maCwKKyAgLmRlY29kZV9maCA9IHJlaXNlcmZzX2RlY29kZV9maCwKKyAgLmdldF9wYXJlbnQgPSByZWlzZXJmc19nZXRfcGFyZW50LAorICAuZ2V0X2RlbnRyeSA9IHJlaXNlcmZzX2dldF9kZW50cnksCit9IDsKKworLyogdGhpcyBzdHJ1Y3QgaXMgdXNlZCBpbiByZWlzZXJmc19nZXRvcHQgKCkgZm9yIGNvbnRhaW5pbmcgdGhlIHZhbHVlIGZvciB0aG9zZQorICAgbW91bnQgb3B0aW9ucyB0aGF0IGhhdmUgdmFsdWVzIHJhdGhlciB0aGFuIGJlaW5nIHRvZ2dsZXMuICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciAqIHZhbHVlOworICAgIGludCBzZXRtYXNrOyAvKiBiaXRtYXNrIHdoaWNoIGlzIHRvIHNldCBvbiBtb3VudF9vcHRpb25zIGJpdG1hc2sgd2hlbiB0aGlzCisgICAgICAgICAgICAgICAgICAgIHZhbHVlIGlzIGZvdW5kLCAwIGlzIG5vIGJpdHMgYXJlIHRvIGJlIGNoYW5nZWQuICovCisgICAgaW50IGNscm1hc2s7IC8qIGJpdG1hc2sgd2hpY2ggaXMgdG8gY2xlYXIgb24gbW91bnRfb3B0aW9ucyBiaXRtYXNrIHdoZW4gIHRoaXMKKwkJICAgIHZhbHVlIGlzIGZvdW5kLCAwIGlzIG5vIGJpdHMgYXJlIHRvIGJlIGNoYW5nZWQuIFRoaXMgaXMKKwkJICAgIGFwcGxpZWQgQkVGT1JFIHNldG1hc2sgKi8KK30gYXJnX2Rlc2NfdDsKKworLyogU2V0IHRoaXMgYml0IGluIGFyZ19yZXF1aXJlZCB0byBhbGxvdyBlbXB0eSBhcmd1bWVudHMgKi8KKyNkZWZpbmUgUkVJU0VSRlNfT1BUX0FMTE9XRU1QVFkgMzEKKworLyogdGhpcyBzdHJ1Y3QgaXMgdXNlZCBpbiByZWlzZXJmc19nZXRvcHQoKSBmb3IgZGVzY3JpYmluZyB0aGUgc2V0IG9mIHJlaXNlcmZzCisgICBtb3VudCBvcHRpb25zICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciAqIG9wdGlvbl9uYW1lOworICAgIGludCBhcmdfcmVxdWlyZWQ7IC8qIDAgaWYgYXJndW1lbnQgaXMgbm90IHJlcXVpcmVkLCBub3QgMCBvdGhlcndpc2UgKi8KKyAgICBjb25zdCBhcmdfZGVzY190ICogdmFsdWVzOyAvKiBsaXN0IG9mIHZhbHVlcyBhY2NlcHRlZCBieSBhbiBvcHRpb24gKi8KKyAgICBpbnQgc2V0bWFzazsgLyogYml0bWFzayB3aGljaCBpcyB0byBzZXQgb24gbW91bnRfb3B0aW9ucyBiaXRtYXNrIHdoZW4gdGhpcworICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpcyBmb3VuZCwgMCBpcyBubyBiaXRzIGFyZSB0byBiZSBjaGFuZ2VkLiAqLworICAgIGludCBjbHJtYXNrOyAvKiBiaXRtYXNrIHdoaWNoIGlzIHRvIGNsZWFyIG9uIG1vdW50X29wdGlvbnMgYml0bWFzayB3aGVuICB0aGlzCisJCSAgICB2YWx1ZSBpcyBmb3VuZCwgMCBpcyBubyBiaXRzIGFyZSB0byBiZSBjaGFuZ2VkLiBUaGlzIGlzCisJCSAgICBhcHBsaWVkIEJFRk9SRSBzZXRtYXNrICovCit9IG9wdF9kZXNjX3Q7CisKKy8qIHBvc3NpYmxlIHZhbHVlcyBmb3IgLW8gZGF0YT0gKi8KK3N0YXRpYyBjb25zdCBhcmdfZGVzY190IGxvZ2dpbmdfbW9kZVtdID0geworICAgIHsib3JkZXJlZCIsIDE8PFJFSVNFUkZTX0RBVEFfT1JERVJFRCwgKDE8PFJFSVNFUkZTX0RBVEFfTE9HfDE8PFJFSVNFUkZTX0RBVEFfV1JJVEVCQUNLKX0sCisgICAgeyJqb3VybmFsIiwgMTw8UkVJU0VSRlNfREFUQV9MT0csICgxPDxSRUlTRVJGU19EQVRBX09SREVSRUR8MTw8UkVJU0VSRlNfREFUQV9XUklURUJBQ0spfSwKKyAgICB7IndyaXRlYmFjayIsIDE8PFJFSVNFUkZTX0RBVEFfV1JJVEVCQUNLLCAoMTw8UkVJU0VSRlNfREFUQV9PUkRFUkVEfDE8PFJFSVNFUkZTX0RBVEFfTE9HKX0sCisgICAge05VTEwsIDB9Cit9OworCisvKiBwb3NzaWJsZSB2YWx1ZXMgZm9yIC1vIGJhcnJpZXI9ICovCitzdGF0aWMgY29uc3QgYXJnX2Rlc2NfdCBiYXJyaWVyX21vZGVbXSA9IHsKKyAgICB7Im5vbmUiLCAxPDxSRUlTRVJGU19CQVJSSUVSX05PTkUsIDE8PFJFSVNFUkZTX0JBUlJJRVJfRkxVU0h9LAorICAgIHsiZmx1c2giLCAxPDxSRUlTRVJGU19CQVJSSUVSX0ZMVVNILCAxPDxSRUlTRVJGU19CQVJSSUVSX05PTkV9LAorICAgIHtOVUxMLCAwfQorfTsKKworLyogcG9zc2libGUgdmFsdWVzIGZvciAiLW8gYmxvY2stYWxsb2NhdG9yPSIgYW5kIGJpdHMgd2hpY2ggYXJlIHRvIGJlIHNldCBpbgorICAgc19tb3VudF9vcHQgb2YgcmVpc2VyZnMgc3BlY2lmaWMgcGFydCBvZiBpbi1jb3JlIHN1cGVyIGJsb2NrICovCitzdGF0aWMgY29uc3QgYXJnX2Rlc2NfdCBiYWxsb2NbXSA9IHsKKyAgICB7Im5vYm9yZGVyIiwgMTw8UkVJU0VSRlNfTk9fQk9SREVSLCAwfSwKKyAgICB7ImJvcmRlciIsIDAsIDE8PFJFSVNFUkZTX05PX0JPUkRFUn0sCisgICAgeyJub191bmhhc2hlZF9yZWxvY2F0aW9uIiwgMTw8UkVJU0VSRlNfTk9fVU5IQVNIRURfUkVMT0NBVElPTiwgMH0sCisgICAgeyJoYXNoZWRfcmVsb2NhdGlvbiIsIDE8PFJFSVNFUkZTX0hBU0hFRF9SRUxPQ0FUSU9OLCAwfSwKKyAgICB7InRlc3Q0IiwgMTw8UkVJU0VSRlNfVEVTVDQsIDB9LAorICAgIHsibm90ZXN0NCIsIDAsIDE8PFJFSVNFUkZTX1RFU1Q0fSwKKyAgICB7TlVMTCwgMCwgMH0KK307CisKK3N0YXRpYyBjb25zdCBhcmdfZGVzY190IHRhaWxzW10gPSB7CisgICAgeyJvbiIsIDE8PFJFSVNFUkZTX0xBUkdFVEFJTCwgMTw8UkVJU0VSRlNfU01BTExUQUlMfSwKKyAgICB7Im9mZiIsIDAsICgxPDxSRUlTRVJGU19MQVJHRVRBSUwpfCgxPDxSRUlTRVJGU19TTUFMTFRBSUwpfSwKKyAgICB7InNtYWxsIiwgMTw8UkVJU0VSRlNfU01BTExUQUlMLCAxPDxSRUlTRVJGU19MQVJHRVRBSUx9LAorICAgIHtOVUxMLCAwLCAwfQorfTsKKworc3RhdGljIGNvbnN0IGFyZ19kZXNjX3QgZXJyb3JfYWN0aW9uc1tdID0geworICAgIHsicGFuaWMiLCAxIDw8IFJFSVNFUkZTX0VSUk9SX1BBTklDLAorICAgICAgICAgICAgICAoMSA8PCBSRUlTRVJGU19FUlJPUl9STyB8IDEgPDwgUkVJU0VSRlNfRVJST1JfQ09OVElOVUUpfSwKKyAgICB7InJvLXJlbW91bnQiLCAxIDw8IFJFSVNFUkZTX0VSUk9SX1JPLAorICAgICAgICAgICAgICAoMSA8PCBSRUlTRVJGU19FUlJPUl9QQU5JQyB8IDEgPDwgUkVJU0VSRlNfRVJST1JfQ09OVElOVUUpfSwKKyNpZmRlZiBSRUlTRVJGU19KT1VSTkFMX0VSUk9SX0FMTE9XU19OT19MT0cKKyAgICB7ImNvbnRpbnVlIiwgMSA8PCBSRUlTRVJGU19FUlJPUl9DT05USU5VRSwKKyAgICAgICAgICAgICAgKDEgPDwgUkVJU0VSRlNfRVJST1JfUEFOSUMgfCAxIDw8IFJFSVNFUkZTX0VSUk9SX1JPKX0sCisjZW5kaWYKKyAgICB7TlVMTCwgMCwgMH0sCit9OworCitpbnQgcmVpc2VyZnNfZGVmYXVsdF9pb19zaXplID0gMTI4ICogMTAyNDsgLyogRGVmYXVsdCByZWNvbW1lbmRlZCBJL08gc2l6ZSBpcyAxMjhrLgorCQkJCQkgICAgICBUaGVyZSBtaWdodCBiZSBicm9rZW4gYXBwbGljYXRpb25zIHRoYXQgYXJlCisJCQkJCSAgICAgIGNvbmZ1c2VkIGJ5IHRoaXMuIFVzZSBub2xhcmdlaW8gbW91bnQgb3B0aW9uCisJCQkJCSAgICAgIHRvIGdldCB1c3VhbCBpL28gc2l6ZSA9IFBBR0VfU0laRS4KKwkJCQkJICAgICovCisKKy8qIHByb2NlZWQgb25seSBvbmUgb3B0aW9uIGZyb20gYSBsaXN0ICpjdXIgLSBzdHJpbmcgY29udGFpbmluZyBvZiBtb3VudCBvcHRpb25zCisgICBvcHRzIC0gYXJyYXkgb2Ygb3B0aW9ucyB3aGljaCBhcmUgYWNjZXB0ZWQKKyAgIG9wdF9hcmcgLSBpZiBvcHRpb24gaXMgZm91bmQgYW5kIHJlcXVpcmVzIGFuIGFyZ3VtZW50IGFuZCBpZiBpdCBpcyBzcGVjaWZlZAorICAgaW4gdGhlIGlucHV0IC0gcG9pbnRlciB0byB0aGUgYXJndW1lbnQgaXMgc3RvcmVkIGhlcmUKKyAgIGJpdF9mbGFncyAtIGlmIG9wdGlvbiByZXF1aXJlcyB0byBzZXQgYSBjZXJ0YWluIGJpdCAtIGl0IGlzIHNldCBoZXJlCisgICByZXR1cm4gLTEgaWYgdW5rbm93biBvcHRpb24gaXMgZm91bmQsIG9wdC0+YXJnX3JlcXVpcmVkIG90aGVyd2lzZSAqLworc3RhdGljIGludCByZWlzZXJmc19nZXRvcHQgKCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBjaGFyICoqIGN1ciwgb3B0X2Rlc2NfdCAqIG9wdHMsIGNoYXIgKiogb3B0X2FyZywKKwkJCSAgICB1bnNpZ25lZCBsb25nICogYml0X2ZsYWdzKQoreworICAgIGNoYXIgKiBwOworICAgIC8qIGZvbz1iYXIsIAorICAgICAgIF4gICBeICBeCisgICAgICAgfCAgIHwgICstLSBvcHRpb25fZW5kCisgICAgICAgfCAgICstLSBhcmdfc3RhcnQKKyAgICAgICArLS0gb3B0aW9uX3N0YXJ0CisgICAgKi8KKyAgICBjb25zdCBvcHRfZGVzY190ICogb3B0OworICAgIGNvbnN0IGFyZ19kZXNjX3QgKiBhcmc7CisgICAgCisgICAgCisgICAgcCA9ICpjdXI7CisgICAgCisgICAgLyogYXNzdW1lIGFyZ3VtZW50IGNhbm5vdCBjb250YWluIGNvbW1hcyAqLworICAgICpjdXIgPSBzdHJjaHIgKHAsICcsJyk7CisgICAgaWYgKCpjdXIpIHsKKwkqKCpjdXIpID0gJ1wwJzsKKwkoKmN1cikgKys7CisgICAgfQorCisgICAgaWYgKCAhc3RybmNtcCAocCwgImFsbG9jPSIsIDYpICkgeworCS8qIFVnbHkgc3BlY2lhbCBjYXNlLCBwcm9iYWJseSB3ZSBzaG91bGQgcmVkbyBvcHRpb25zIHBhcnNlciBzbyB0aGF0CisJICAgaXQgY2FuIHVuZGVyc3RhbmQgc2V2ZXJhbCBhcmd1bWVudHMgZm9yIHNvbWUgb3B0aW9ucywgYWxzbyBzbyB0aGF0CisJICAgaXQgY2FuIGZpbGwgc2V2ZXJhbCBiaXRmaWVsZHMgd2l0aCBvcHRpb24gdmFsdWVzLiAqLworCWlmICggcmVpc2VyZnNfcGFyc2VfYWxsb2Nfb3B0aW9ucyggcywgcCArIDYpICkgeworCSAgICByZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIDA7CisJfQorICAgIH0KKworIAorICAgIC8qIGZvciBldmVyeSBvcHRpb24gaW4gdGhlIGxpc3QgKi8KKyAgICBmb3IgKG9wdCA9IG9wdHM7IG9wdC0+b3B0aW9uX25hbWU7IG9wdCArKykgeworCWlmICghc3RybmNtcCAocCwgb3B0LT5vcHRpb25fbmFtZSwgc3RybGVuIChvcHQtPm9wdGlvbl9uYW1lKSkpIHsKKwkgICAgaWYgKGJpdF9mbGFncykgeworICAgICAgICAgICAgICAgIGlmIChvcHQtPmNscm1hc2sgPT0gKDEgPDwgUkVJU0VSRlNfVU5TVVBQT1JURURfT1BUKSkKKyAgICAgICAgICAgICAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgIiVzIG5vdCBzdXBwb3J0ZWQuIiwgcCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqYml0X2ZsYWdzICY9IH5vcHQtPmNscm1hc2s7CisgICAgICAgICAgICAgICAgaWYgKG9wdC0+c2V0bWFzayA9PSAoMSA8PCBSRUlTRVJGU19VTlNVUFBPUlRFRF9PUFQpKQorICAgICAgICAgICAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChzLCAiJXMgbm90IHN1cHBvcnRlZC4iLCBwKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpiaXRfZmxhZ3MgfD0gb3B0LT5zZXRtYXNrOworCSAgICB9CisJICAgIGJyZWFrOworCX0KKyAgICB9CisgICAgaWYgKCFvcHQtPm9wdGlvbl9uYW1lKSB7CisJcmVpc2VyZnNfd2FybmluZyAocywgInVua25vd24gbW91bnQgb3B0aW9uIFwiJXNcIiIsIHApOworCXJldHVybiAtMTsKKyAgICB9CisgICAgCisgICAgcCArPSBzdHJsZW4gKG9wdC0+b3B0aW9uX25hbWUpOworICAgIHN3aXRjaCAoKnApIHsKKyAgICBjYXNlICc9JzoKKwlpZiAoIW9wdC0+YXJnX3JlcXVpcmVkKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ0aGUgb3B0aW9uIFwiJXNcIiBkb2VzIG5vdCByZXF1aXJlIGFuIGFyZ3VtZW50IiwKKwkJICAgIG9wdC0+b3B0aW9uX25hbWUpOworCSAgICByZXR1cm4gLTE7CisJfQorCWJyZWFrOworCQorICAgIGNhc2UgMDoKKwlpZiAob3B0LT5hcmdfcmVxdWlyZWQpIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAocywgInRoZSBvcHRpb24gXCIlc1wiIHJlcXVpcmVzIGFuIGFyZ3VtZW50Iiwgb3B0LT5vcHRpb25fbmFtZSk7CisJICAgIHJldHVybiAtMTsKKwl9CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlyZWlzZXJmc193YXJuaW5nIChzLCAiaGVhZCBvZiBvcHRpb24gXCIlc1wiIGlzIG9ubHkgY29ycmVjdCIsIG9wdC0+b3B0aW9uX25hbWUpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBtb3ZlIHRvIHRoZSBhcmd1bWVudCwgb3IgdG8gbmV4dCBvcHRpb24gaWYgYXJndW1lbnQgaXMgbm90IHJlcXVpcmVkICovCisgICAgcCArKzsKKyAgICAKKyAgICBpZiAoIG9wdC0+YXJnX3JlcXVpcmVkICYmICEob3B0LT5hcmdfcmVxdWlyZWQgJiAoMTw8UkVJU0VSRlNfT1BUX0FMTE9XRU1QVFkpKSAmJiAhc3RybGVuIChwKSApIHsKKwkvKiB0aGlzIGNhdGNoZXMgIm9wdGlvbj0sIiBpZiBub3QgYWxsb3dlZCAqLworCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJlbXB0eSBhcmd1bWVudCBmb3IgXCIlc1wiIiwgb3B0LT5vcHRpb25fbmFtZSk7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICBpZiAoIW9wdC0+dmFsdWVzKSB7CisJLyogKj1OVUxMb3B0X2FyZyBjb250YWlucyBwb2ludGVyIHRvIGFyZ3VtZW50ICovCisJKm9wdF9hcmcgPSBwOworCXJldHVybiBvcHQtPmFyZ19yZXF1aXJlZCAmIH4oMTw8UkVJU0VSRlNfT1BUX0FMTE9XRU1QVFkpOworICAgIH0KKyAgICAKKyAgICAvKiB2YWx1ZXMgcG9zc2libGUgZm9yIHRoaXMgb3B0aW9uIGFyZSBsaXN0ZWQgaW4gb3B0LT52YWx1ZXMgKi8KKyAgICBmb3IgKGFyZyA9IG9wdC0+dmFsdWVzOyBhcmctPnZhbHVlOyBhcmcgKyspIHsKKwlpZiAoIXN0cmNtcCAocCwgYXJnLT52YWx1ZSkpIHsKKwkgICAgaWYgKGJpdF9mbGFncykgeworCQkqYml0X2ZsYWdzICY9IH5hcmctPmNscm1hc2s7CisJCSpiaXRfZmxhZ3MgfD0gYXJnLT5zZXRtYXNrOworCSAgICB9CisJICAgIHJldHVybiBvcHQtPmFyZ19yZXF1aXJlZDsKKwl9CisgICAgfQorICAgIAorICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJiYWQgdmFsdWUgXCIlc1wiIGZvciBvcHRpb24gXCIlc1wiIiwgcCwgb3B0LT5vcHRpb25fbmFtZSk7CisgICAgcmV0dXJuIC0xOworfQorCisvKiByZXR1cm5zIDAgaWYgc29tZXRoaW5nIGlzIHdyb25nIGluIG9wdGlvbiBzdHJpbmcsIDEgLSBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbnQgcmVpc2VyZnNfcGFyc2Vfb3B0aW9ucyAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgY2hhciAqIG9wdGlvbnMsIC8qIHN0cmluZyBnaXZlbiB2aWEgbW91bnQncyAtbyAqLworCQkJCSAgIHVuc2lnbmVkIGxvbmcgKiBtb3VudF9vcHRpb25zLAorCQkJCSAgIC8qIGFmdGVyIHRoZSBwYXJzaW5nIHBoYXNlLCBjb250YWlucyB0aGUKKwkJCQkgICAgICBjb2xsZWN0aW9uIG9mIGJpdGZsYWdzIGRlZmluaW5nIHdoYXQKKwkJCQkgICAgICBtb3VudCBvcHRpb25zIHdlcmUgc2VsZWN0ZWQuICovCisJCQkJICAgdW5zaWduZWQgbG9uZyAqIGJsb2NrcywgLyogc3RydG9sLWVkIGZyb20gTk5OIG9mIHJlc2l6ZT1OTk4gKi8KKwkJCQkgICBjaGFyICoqIGpkZXZfbmFtZSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKiBjb21taXRfbWF4X2FnZSkKK3sKKyAgICBpbnQgYzsKKyAgICBjaGFyICogYXJnID0gTlVMTDsKKyAgICBjaGFyICogcG9zOworICAgIG9wdF9kZXNjX3Qgb3B0c1tdID0geworCS8qIENvbXBhdGliaWxpdHkgc3R1ZmYsIHNvIHRoYXQgLW8gbm90YWlsIGZvciBvbGQgc2V0dXBzIHN0aWxsIHdvcmsgKi8KKwl7InRhaWxzIiwJLmFyZ19yZXF1aXJlZCA9ICd0JywgLnZhbHVlcyA9IHRhaWxzfSwKKwl7Im5vdGFpbCIsCS5jbHJtYXNrID0gKDE8PFJFSVNFUkZTX0xBUkdFVEFJTCl8KDE8PFJFSVNFUkZTX1NNQUxMVEFJTCl9LAorCXsiY29udiIsCS5zZXRtYXNrID0gMTw8UkVJU0VSRlNfQ09OVkVSVH0sCisJeyJhdHRycyIsCS5zZXRtYXNrID0gMTw8UkVJU0VSRlNfQVRUUlN9LAorCXsibm9hdHRycyIsCS5jbHJtYXNrID0gMTw8UkVJU0VSRlNfQVRUUlN9LAorI2lmZGVmIENPTkZJR19SRUlTRVJGU19GU19YQVRUUgorCXsidXNlcl94YXR0ciIsCS5zZXRtYXNrID0gMTw8UkVJU0VSRlNfWEFUVFJTX1VTRVJ9LAorCXsibm91c2VyX3hhdHRyIiwuY2xybWFzayA9IDE8PFJFSVNFUkZTX1hBVFRSU19VU0VSfSwKKyNlbHNlCisJeyJ1c2VyX3hhdHRyIiwJLnNldG1hc2sgPSAxPDxSRUlTRVJGU19VTlNVUFBPUlRFRF9PUFR9LAorCXsibm91c2VyX3hhdHRyIiwuY2xybWFzayA9IDE8PFJFSVNFUkZTX1VOU1VQUE9SVEVEX09QVH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfRlNfUE9TSVhfQUNMCisJeyJhY2wiLAkJLnNldG1hc2sgPSAxPDxSRUlTRVJGU19QT1NJWEFDTH0sCisJeyJub2FjbCIsCS5jbHJtYXNrID0gMTw8UkVJU0VSRlNfUE9TSVhBQ0x9LAorI2Vsc2UKKwl7ImFjbCIsCQkuc2V0bWFzayA9IDE8PFJFSVNFUkZTX1VOU1VQUE9SVEVEX09QVH0sCisJeyJub2FjbCIsCS5jbHJtYXNrID0gMTw8UkVJU0VSRlNfVU5TVVBQT1JURURfT1BUfSwKKyNlbmRpZgorCXsibm9sb2ciLH0sCSAvKiBUaGlzIGlzIHVuc3VwcG9ydGVkICovCisJeyJyZXBsYXlvbmx5IiwJLnNldG1hc2sgPSAxPDxSRVBMQVlPTkxZfSwKKwl7ImJsb2NrLWFsbG9jYXRvciIsIC5hcmdfcmVxdWlyZWQgPSAnYScsIC52YWx1ZXMgPSBiYWxsb2N9LAorCXsiZGF0YSIsCS5hcmdfcmVxdWlyZWQgPSAnZCcsIC52YWx1ZXMgPSBsb2dnaW5nX21vZGV9LAorCXsiYmFycmllciIsCS5hcmdfcmVxdWlyZWQgPSAnYicsIC52YWx1ZXMgPSBiYXJyaWVyX21vZGV9LAorCXsicmVzaXplIiwJLmFyZ19yZXF1aXJlZCA9ICdyJywgLnZhbHVlcyA9IE5VTEx9LAorCXsiamRldiIsCS5hcmdfcmVxdWlyZWQgPSAnaicsIC52YWx1ZXMgPSBOVUxMfSwKKwl7Im5vbGFyZ2VpbyIsCS5hcmdfcmVxdWlyZWQgPSAndycsIC52YWx1ZXMgPSBOVUxMfSwKKwl7ImNvbW1pdCIsCS5hcmdfcmVxdWlyZWQgPSAnYycsIC52YWx1ZXMgPSBOVUxMfSwKKwl7InVzcnF1b3RhIix9LAorCXsiZ3JwcXVvdGEiLH0sCisJeyJlcnJvcnMiLCAJLmFyZ19yZXF1aXJlZCA9ICdlJywgLnZhbHVlcyA9IGVycm9yX2FjdGlvbnN9LAorCXsidXNyanF1b3RhIiwJLmFyZ19yZXF1aXJlZCA9ICd1J3woMTw8UkVJU0VSRlNfT1BUX0FMTE9XRU1QVFkpLCAudmFsdWVzID0gTlVMTH0sCisJeyJncnBqcXVvdGEiLAkuYXJnX3JlcXVpcmVkID0gJ2cnfCgxPDxSRUlTRVJGU19PUFRfQUxMT1dFTVBUWSksIC52YWx1ZXMgPSBOVUxMfSwKKwl7ImpxZm10IiwJLmFyZ19yZXF1aXJlZCA9ICdmJywgLnZhbHVlcyA9IE5VTEx9LAorCXtOVUxMLH0KKyAgICB9OworCQorICAgICpibG9ja3MgPSAwOworICAgIGlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCisJLyogdXNlIGRlZmF1bHQgY29uZmlndXJhdGlvbjogY3JlYXRlIHRhaWxzLCBqb3VybmFsaW5nIG9uLCBubworCSAgIGNvbnZlcnNpb24gdG8gbmV3ZXN0IGZvcm1hdCAqLworCXJldHVybiAxOworICAgIAorICAgIGZvciAocG9zID0gb3B0aW9uczsgcG9zOyApIHsKKwljID0gcmVpc2VyZnNfZ2V0b3B0IChzLCAmcG9zLCBvcHRzLCAmYXJnLCBtb3VudF9vcHRpb25zKTsKKwlpZiAoYyA9PSAtMSkKKwkgICAgLyogd3Jvbmcgb3B0aW9uIGlzIGdpdmVuICovCisJICAgIHJldHVybiAwOworCQorCWlmIChjID09ICdyJykgeworCSAgICBjaGFyICogcDsKKwkgICAgCisJICAgIHAgPSBOVUxMOworCSAgICAvKiAicmVzaXplPU5OTiIgKi8KKwkgICAgKmJsb2NrcyA9IHNpbXBsZV9zdHJ0b3VsIChhcmcsICZwLCAwKTsKKwkgICAgaWYgKCpwICE9ICdcMCcpIHsKKwkJLyogTk5OIGRvZXMgbm90IGxvb2sgbGlrZSBhIG51bWJlciAqLworCQlyZWlzZXJmc193YXJuaW5nIChzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogYmFkIHZhbHVlICVzIiwgYXJnKTsKKwkJcmV0dXJuIDA7CisJICAgIH0KKwl9CisKKwlpZiAoIGMgPT0gJ2MnICkgeworCQljaGFyICpwID0gTlVMTDsKKwkJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bCAoYXJnLCAmcCwgMCk7CisJCS8qIGNvbW1pdD1OTk4gKHRpbWUgaW4gc2Vjb25kcykgKi8KKwkJaWYgKCAqcCAhPSAnXDAnIHx8IHZhbCA+PSAodW5zaWduZWQgaW50KS0xKSB7CisJCQlyZWlzZXJmc193YXJuaW5nIChzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogYmFkIHZhbHVlICVzIiwgYXJnKTsJCQlyZXR1cm4gMDsKKwkJfQorCQkqY29tbWl0X21heF9hZ2UgPSAodW5zaWduZWQgaW50KXZhbDsKKwl9CisKKwlpZiAoIGMgPT0gJ3cnICkgeworCQljaGFyICpwPU5VTEw7CisJCWludCB2YWwgPSBzaW1wbGVfc3RydG91bCAoYXJnLCAmcCwgMCk7CisKKwkJaWYgKCAqcCAhPSAnXDAnKSB7CisJCSAgICByZWlzZXJmc193YXJuaW5nIChzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogbm9uLW51bWVyaWMgdmFsdWUgJXMgZm9yIG5vbGFyZ2VpbyBvcHRpb24iLCBhcmcpOworCQkgICAgcmV0dXJuIDA7CisJCX0KKwkJaWYgKCB2YWwgKSAKKwkJICAgIHJlaXNlcmZzX2RlZmF1bHRfaW9fc2l6ZSA9IFBBR0VfU0laRTsKKwkJZWxzZQorCQkgICAgcmVpc2VyZnNfZGVmYXVsdF9pb19zaXplID0gMTI4ICogMTAyNDsKKwl9CisKKwlpZiAoYyA9PSAnaicpIHsKKwkgICAgaWYgKGFyZyAmJiAqYXJnICYmIGpkZXZfbmFtZSkgeworCQlpZiAoICpqZGV2X25hbWUgKSB7IC8vSG0sIGFscmVhZHkgYXNzaWduZWQ/CisJCSAgICByZWlzZXJmc193YXJuaW5nIChzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogam91cm5hbCBkZXZpY2Ugd2FzIGFscmVhZHkgIHNwZWNpZmllZCB0byBiZSAlcyIsICpqZGV2X25hbWUpOworCQkgICAgcmV0dXJuIDA7CisJCX0KKwkJKmpkZXZfbmFtZSA9IGFyZzsKKwkgICAgfQorCX0KKworI2lmZGVmIENPTkZJR19RVU9UQQorCWlmIChjID09ICd1JyB8fCBjID09ICdnJykgeworCSAgICBpbnQgcXR5cGUgPSBjID09ICd1JyA/IFVTUlFVT1RBIDogR1JQUVVPVEE7CisKKwkgICAgaWYgKHNiX2FueV9xdW90YV9lbmFibGVkKHMpKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGNhbm5vdCBjaGFuZ2Ugam91cm5hbGxlZCBxdW90YSBvcHRpb25zIHdoZW4gcXVvdGEgdHVybmVkIG9uLiIpOworCQlyZXR1cm4gMDsKKwkgICAgfQorCSAgICBpZiAoKmFyZykgewkvKiBTb21lIGZpbGVuYW1lIHNwZWNpZmllZD8gKi8KKwkgICAgICAgIGlmIChSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0gJiYgc3RyY21wKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW3F0eXBlXSwgYXJnKSkgeworCQkgICAgcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogJXMgcXVvdGEgZmlsZSBhbHJlYWR5IHNwZWNpZmllZC4iLCBRVFlQRTJOQU1FKHF0eXBlKSk7CisJCSAgICByZXR1cm4gMDsKKwkJfQorCQlpZiAoc3RyY2hyKGFyZywgJy8nKSkgeworCQkgICAgcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogcXVvdGFmaWxlIG11c3QgYmUgb24gZmlsZXN5c3RlbSByb290LiIpOworCQkgICAgcmV0dXJuIDA7CisJCX0KKwkgICAgCVJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW3F0eXBlXSA9IGttYWxsb2Moc3RybGVuKGFyZykrMSwgR0ZQX0tFUk5FTCk7CisJCWlmICghUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdKSB7CisJCSAgICByZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBub3QgZW5vdWdoIG1lbW9yeSBmb3Igc3RvcmluZyBxdW90YWZpbGUgbmFtZS4iKTsKKwkJICAgIHJldHVybiAwOworCQl9CisJCXN0cmNweShSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0sIGFyZyk7CisJICAgIH0KKwkgICAgZWxzZSB7CisJCWlmIChSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0pIHsKKwkJICAgIGtmcmVlKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW3F0eXBlXSk7CisJCSAgICBSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0gPSBOVUxMOworCQl9CisJICAgIH0KKwl9CisJaWYgKGMgPT0gJ2YnKSB7CisJICAgIGlmICghc3RyY21wKGFyZywgInZmc29sZCIpKQorCQlSRUlTRVJGU19TQihzKS0+c19qcXVvdGFfZm10ID0gUUZNVF9WRlNfT0xEOworCSAgICBlbHNlIGlmICghc3RyY21wKGFyZywgInZmc3YwIikpCisJCVJFSVNFUkZTX1NCKHMpLT5zX2pxdW90YV9mbXQgPSBRRk1UX1ZGU19WMDsKKwkgICAgZWxzZSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IHVua25vd24gcXVvdGEgZm9ybWF0IHNwZWNpZmllZC4iKTsKKwkJcmV0dXJuIDA7CisJICAgIH0KKwl9CisjZWxzZQorCWlmIChjID09ICd1JyB8fCBjID09ICdnJyB8fCBjID09ICdmJykgeworCSAgICByZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBqb3VybmFsbGVkIHF1b3RhIG9wdGlvbnMgbm90IHN1cHBvcnRlZC4iKTsKKwkgICAgcmV0dXJuIDA7CisJfQorI2VuZGlmCisgICAgfQorICAgIAorI2lmZGVmIENPTkZJR19RVU9UQQorICAgIGlmICghUkVJU0VSRlNfU0IocyktPnNfanF1b3RhX2ZtdCAmJiAoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbVVNSUVVPVEFdIHx8IFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW0dSUFFVT1RBXSkpIHsKKwlyZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBqb3VybmFsbGVkIHF1b3RhIGZvcm1hdCBub3Qgc3BlY2lmaWVkLiIpOworCXJldHVybiAwOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBzd2l0Y2hfZGF0YV9tb2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdW5zaWduZWQgbG9uZyBtb2RlKSB7CisgICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ICY9IH4oKDEgPDwgUkVJU0VSRlNfREFUQV9MT0cpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IFJFSVNFUkZTX0RBVEFfT1JERVJFRCkgfAorCQkJCSAgICAgICAoMSA8PCBSRUlTRVJGU19EQVRBX1dSSVRFQkFDSykpOworICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSAoMSA8PCBtb2RlKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2RhdGFfbW9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHVuc2lnbmVkIGxvbmcgbW91bnRfb3B0aW9ucykKK3sKKyAgICBpZiAobW91bnRfb3B0aW9ucyAmICgxIDw8IFJFSVNFUkZTX0RBVEFfTE9HKSkgeworICAgICAgICBpZiAoIXJlaXNlcmZzX2RhdGFfbG9nKHMpKSB7CisJICAgIHN3aXRjaF9kYXRhX21vZGUocywgUkVJU0VSRlNfREFUQV9MT0cpOworCSAgICByZWlzZXJmc19pbmZvIChzLCAic3dpdGNoaW5nIHRvIGpvdXJuYWxlZCBkYXRhIG1vZGVcbiIpOworCX0KKyAgICB9IGVsc2UgaWYgKG1vdW50X29wdGlvbnMgJiAoMSA8PCBSRUlTRVJGU19EQVRBX09SREVSRUQpKSB7CisgICAgICAgIGlmICghcmVpc2VyZnNfZGF0YV9vcmRlcmVkKHMpKSB7CisJICAgIHN3aXRjaF9kYXRhX21vZGUocywgUkVJU0VSRlNfREFUQV9PUkRFUkVEKTsKKwkgICAgcmVpc2VyZnNfaW5mbyAocywgInN3aXRjaGluZyB0byBvcmRlcmVkIGRhdGEgbW9kZVxuIik7CisJfQorICAgIH0gZWxzZSBpZiAobW91bnRfb3B0aW9ucyAmICgxIDw8IFJFSVNFUkZTX0RBVEFfV1JJVEVCQUNLKSkgeworICAgICAgICBpZiAoIXJlaXNlcmZzX2RhdGFfd3JpdGViYWNrKHMpKSB7CisJICAgIHN3aXRjaF9kYXRhX21vZGUocywgUkVJU0VSRlNfREFUQV9XUklURUJBQ0spOworCSAgICByZWlzZXJmc19pbmZvIChzLCAic3dpdGNoaW5nIHRvIHdyaXRlYmFjayBkYXRhIG1vZGVcbiIpOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9iYXJyaWVyX21vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBsb25nIGJpdHMpIHsKKyAgICBpbnQgZmx1c2ggPSAoMSA8PCBSRUlTRVJGU19CQVJSSUVSX0ZMVVNIKTsKKyAgICBpbnQgbm9uZSA9ICgxIDw8IFJFSVNFUkZTX0JBUlJJRVJfTk9ORSk7CisgICAgaW50IGFsbF9iYXJyaWVyID0gZmx1c2ggfCBub25lOworCisgICAgaWYgKGJpdHMgJiBhbGxfYmFycmllcikgeworICAgICAgICBSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgJj0gfmFsbF9iYXJyaWVyOworCWlmIChiaXRzICYgZmx1c2gpIHsKKwkgICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0IHw9IGZsdXNoOworCSAgICBwcmludGsoInJlaXNlcmZzOiBlbmFibGluZyB3cml0ZSBiYXJyaWVyIGZsdXNoIG1vZGVcbiIpOworCX0gZWxzZSBpZiAoYml0cyAmIG5vbmUpIHsKKwkgICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0IHw9IG5vbmU7CisJICAgIHByaW50aygicmVpc2VyZnM6IHdyaXRlIGJhcnJpZXJzIHR1cm5lZCBvZmZcbiIpOworCX0KKyAgIH0KK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2F0dHJzKCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgKQoreworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzOworCisJaWYoIHJlaXNlcmZzX2F0dHJzKCBzICkgKSB7CisJCXJzID0gU0JfRElTS19TVVBFUl9CTE9DSyAocyk7CisJCWlmKCBvbGRfZm9ybWF0X29ubHkocykgKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmczogY2Fubm90IHN1cHBvcnQgYXR0cmlidXRlcyBvbiAzLjUueCBkaXNrIGZvcm1hdCIgKTsKKwkJCVJFSVNFUkZTX1NCKHMpIC0+IHNfbW91bnRfb3B0ICY9IH4gKCAxIDw8IFJFSVNFUkZTX0FUVFJTICk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYoICEoIGxlMzJfdG9fY3B1KCBycyAtPiBzX2ZsYWdzICkgJiByZWlzZXJmc19hdHRyc19jbGVhcmVkICkgKSB7CisJCQkJcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnM6IGNhbm5vdCBzdXBwb3J0IGF0dHJpYnV0ZXMgdW50aWwgZmxhZyBpcyBzZXQgaW4gc3VwZXItYmxvY2siICk7CisJCQkJUkVJU0VSRlNfU0IocykgLT4gc19tb3VudF9vcHQgJj0gfiAoIDEgPDwgUkVJU0VSRlNfQVRUUlMgKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCByZWlzZXJmc19yZW1vdW50IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBpbnQgKiBtb3VudF9mbGFncywgY2hhciAqIGFyZykKK3sKKyAgc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnM7CisgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOworICB1bnNpZ25lZCBsb25nIGJsb2NrczsKKyAgdW5zaWduZWQgbG9uZyBtb3VudF9vcHRpb25zID0gUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0OworICB1bnNpZ25lZCBsb25nIHNhZmVfbWFzayA9IDA7CisgIHVuc2lnbmVkIGludCBjb21taXRfbWF4X2FnZSA9ICh1bnNpZ25lZCBpbnQpLTE7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChzKTsKKyAgaW50IGVycjsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKyAgaW50IGk7CisjZW5kaWYKKworICBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpOworCisgIGlmICghcmVpc2VyZnNfcGFyc2Vfb3B0aW9ucyhzLCBhcmcsICZtb3VudF9vcHRpb25zLCAmYmxvY2tzLCBOVUxMLCAmY29tbWl0X21heF9hZ2UpKSB7CisjaWZkZWYgQ09ORklHX1FVT1RBCisgICAgZm9yIChpID0gMDsgaSA8IE1BWFFVT1RBUzsgaSsrKQorCWlmIChSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1tpXSkgeworCSAgICBrZnJlZShSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1tpXSk7CisJICAgIFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW2ldID0gTlVMTDsKKwl9CisjZW5kaWYKKyAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorICAKKyAgaGFuZGxlX2F0dHJzKHMpOworCisgIC8qIEFkZCBvcHRpb25zIHRoYXQgYXJlIHNhZmUgaGVyZSAqLworICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19TTUFMTFRBSUw7CisgIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0xBUkdFVEFJTDsKKyAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfTk9fQk9SREVSOworICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19OT19VTkhBU0hFRF9SRUxPQ0FUSU9OOworICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19IQVNIRURfUkVMT0NBVElPTjsKKyAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfVEVTVDQ7CisgIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0FUVFJTOworICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19YQVRUUlNfVVNFUjsKKyAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfUE9TSVhBQ0w7CisgIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0JBUlJJRVJfRkxVU0g7CisgIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0JBUlJJRVJfTk9ORTsKKyAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfRVJST1JfUk87CisgIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0VSUk9SX0NPTlRJTlVFOworICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19FUlJPUl9QQU5JQzsKKworICAvKiBVcGRhdGUgdGhlIGJpdG1hc2ssIHRha2luZyBjYXJlIHRvIGtlZXAKKyAgICogdGhlIGJpdHMgd2UncmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIGhlcmUgKi8KKyAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ID0gKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmIH5zYWZlX21hc2spIHwgIChtb3VudF9vcHRpb25zICYgc2FmZV9tYXNrKTsKKworICBpZihjb21taXRfbWF4X2FnZSAhPSAwICYmIGNvbW1pdF9tYXhfYWdlICE9ICh1bnNpZ25lZCBpbnQpLTEpIHsKKyAgICBqb3VybmFsLT5qX21heF9jb21taXRfYWdlID0gY29tbWl0X21heF9hZ2U7CisgICAgam91cm5hbC0+al9tYXhfdHJhbnNfYWdlID0gY29tbWl0X21heF9hZ2U7CisgIH0KKyAgZWxzZSBpZihjb21taXRfbWF4X2FnZSA9PSAwKQorICB7CisgICAgLyogMCBtZWFucyByZXN0b3JlIGRlZmF1bHRzLiAqLworICAgIGpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UgPSBqb3VybmFsLT5qX2RlZmF1bHRfbWF4X2NvbW1pdF9hZ2U7CisgICAgam91cm5hbC0+al9tYXhfdHJhbnNfYWdlID0gSk9VUk5BTF9NQVhfVFJBTlNfQUdFOworICB9CisKKyAgaWYoYmxvY2tzKSB7CisgICAgaW50IHJjID0gcmVpc2VyZnNfcmVzaXplKHMsIGJsb2Nrcyk7CisgICAgaWYgKHJjICE9IDApCisgICAgICByZXR1cm4gcmM7CisgIH0KKworICBpZiAoKm1vdW50X2ZsYWdzICYgTVNfUkRPTkxZKSB7CisgICAgcmVpc2VyZnNfeGF0dHJfaW5pdCAocywgKm1vdW50X2ZsYWdzKTsKKyAgICAvKiByZW1vdW50IHJlYWQtb25seSAqLworICAgIGlmIChzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorICAgICAgLyogaXQgaXMgcmVhZC1vbmx5IGFscmVhZHkgKi8KKyAgICAgIHJldHVybiAwOworICAgIC8qIHRyeSB0byByZW1vdW50IGZpbGUgc3lzdGVtIHdpdGggcmVhZC1vbmx5IHBlcm1pc3Npb25zICovCisgICAgaWYgKHNiX3Vtb3VudF9zdGF0ZShycykgPT0gUkVJU0VSRlNfVkFMSURfRlMgfHwgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfc3RhdGUgIT0gUkVJU0VSRlNfVkFMSURfRlMpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBzLCAxMCkgOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAvKiBNb3VudGluZyBhIHJ3IHBhcnRpdGlvbiByZWFkLW9ubHkuICovCisgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSkgOworICAgIHNldF9zYl91bW91bnRfc3RhdGUoIHJzLCBSRUlTRVJGU19TQihzKS0+c19tb3VudF9zdGF0ZSApOworICAgIGpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCIChzKSk7CisgIH0gZWxzZSB7CisgICAgLyogcmVtb3VudCByZWFkLXdyaXRlICovCisgICAgaWYgKCEocy0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwlyZWlzZXJmc194YXR0cl9pbml0IChzLCAqbW91bnRfZmxhZ3MpOworCXJldHVybiAwOyAvKiBXZSBhcmUgcmVhZC13cml0ZSBhbHJlYWR5ICovCisgICAgfQorCisgICAgaWYgKHJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZCAoam91cm5hbCkpCisJcmV0dXJuIGpvdXJuYWwtPmpfZXJybm87CisKKyAgICBoYW5kbGVfZGF0YV9tb2RlKHMsIG1vdW50X29wdGlvbnMpOworICAgIGhhbmRsZV9iYXJyaWVyX21vZGUocywgbW91bnRfb3B0aW9ucyk7CisgICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfc3RhdGUgPSBzYl91bW91bnRfc3RhdGUocnMpIDsKKyAgICBzLT5zX2ZsYWdzICY9IH5NU19SRE9OTFkgOyAvKiBub3cgaXQgaXMgc2FmZSB0byBjYWxsIGpvdXJuYWxfYmVnaW4gKi8KKyAgICBlcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgcywgMTApIDsKKyAgICBpZiAoZXJyKQorCXJldHVybiBlcnI7CisgICAgCisgICAgLyogTW91bnQgYSBwYXJ0aXRpb24gd2hpY2ggaXMgcmVhZC1vbmx5LCByZWFkLXdyaXRlICovCisgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSkgOworICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlID0gc2JfdW1vdW50X3N0YXRlKHJzKTsKKyAgICBzLT5zX2ZsYWdzICY9IH5NU19SRE9OTFk7CisgICAgc2V0X3NiX3Vtb3VudF9zdGF0ZSggcnMsIFJFSVNFUkZTX0VSUk9SX0ZTICk7CisgICAgLyogbWFya19idWZmZXJfZGlydHkgKFNCX0JVRkZFUl9XSVRIX1NCIChzKSwgMSk7ICovCisgICAgam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IgKHMpKTsKKyAgICBSRUlTRVJGU19TQihzKS0+c19tb3VudF9zdGF0ZSA9IFJFSVNFUkZTX1ZBTElEX0ZTIDsKKyAgfQorICAvKiB0aGlzIHdpbGwgZm9yY2UgYSBmdWxsIGZsdXNoIG9mIGFsbCBqb3VybmFsIGxpc3RzICovCisgIFNCX0pPVVJOQUwocyktPmpfbXVzdF93YWl0ID0gMSA7CisgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgcywgMTApIDsKKyAgaWYgKGVycikKKyAgICByZXR1cm4gZXJyOworICBzLT5zX2RpcnQgPSAwOworCisgIGlmICghKCAqbW91bnRfZmxhZ3MgJiBNU19SRE9OTFkgKSApIHsKKyAgICBmaW5pc2hfdW5maW5pc2hlZCggcyApOworICAgIHJlaXNlcmZzX3hhdHRyX2luaXQgKHMsICptb3VudF9mbGFncyk7CisgIH0KKworICByZXR1cm4gMDsKK30KKworLyogbG9hZF9iaXRtYXBfaW5mb19kYXRhIC0gU2V0cyB1cCB0aGUgcmVpc2VyZnNfYml0bWFwX2luZm8gc3RydWN0dXJlIGZyb20gZGlzay4KKyAqIEBzYiAtIHN1cGVyYmxvY2sgZm9yIHRoaXMgZmlsZXN5c3RlbQorICogQGJpIC0gdGhlIGJpdG1hcCBpbmZvIHRvIGJlIGxvYWRlZC4gUmVxdWlyZXMgdGhhdCBiaS0+YmggaXMgdmFsaWQuCisgKgorICogVGhpcyByb3V0aW5lIGNvdW50cyBob3cgbWFueSBmcmVlIGJpdHMgdGhlcmUgYXJlLCBmaW5kaW5nIHRoZSBmaXJzdCB6ZXJvCisgKiBhcyBhIHNpZGUgZWZmZWN0LiBDb3VsZCBhbHNvIGJlIGltcGxlbWVudGVkIGFzIGEgbG9vcCBvZiB0ZXN0X2JpdCgpIGNhbGxzLCBvcgorICogYSBsb29wIG9mIGZpbmRfZmlyc3RfemVyb19iaXQoKSBjYWxscy4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBzaW1pbGFyIHRvCisgKiBmaW5kX2ZpcnN0X3plcm9fYml0KCksIGJ1dCBkb2Vzbid0IHJldHVybiBhZnRlciBpdCBmaW5kcyB0aGUgZmlyc3QgYml0LgorICogU2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGZzIG1vdW50LCBidXQgc2hvdWxkIGJlIGZhaXJseSBlZmZpY2llbnQgYW55d2F5cy4KKyAqCisgKiBiaS0+Zmlyc3RfemVyb19oaW50IGlzIGNvbnNpZGVyZWQgdW5zZXQgaWYgaXQgPT0gMCwgc2luY2UgdGhlIGJpdG1hcCBpdHNlbGYKKyAqIHdpbGwgKiBpbnZhcmlhYmx5IG9jY3VwdCBibG9jayAwIHJlcHJlc2VudGVkIGluIHRoZSBiaXRtYXAuIFRoZSBvbmx5CisgKiBleGNlcHRpb24gdG8gdGhpcyBpcyB3aGVuIGZyZWVfY291bnQgYWxzbyA9PSAwLCBzaW5jZSB0aGVyZSB3aWxsIGJlIG5vCisgKiBmcmVlIGJsb2NrcyBhdCBhbGwuCisgKi8KKworc3RhdGljIHZvaWQgbG9hZF9iaXRtYXBfaW5mb19kYXRhIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8gKmJpKQoreworICAgIHVuc2lnbmVkIGxvbmcgKmN1ciA9ICh1bnNpZ25lZCBsb25nICopYmktPmJoLT5iX2RhdGE7CisKKyAgICB3aGlsZSAoKGNoYXIgKiljdXIgPCAoYmktPmJoLT5iX2RhdGEgKyBzYi0+c19ibG9ja3NpemUpKSB7CisKKwkvKiBObyBuZWVkIHRvIHNjYW4gaWYgYWxsIDAncyBvciBhbGwgMSdzLgorCSAqIFNpbmNlIHdlJ3JlIG9ubHkgY291bnRpbmcgMCdzLCB3ZSBjYW4gc2ltcGx5IGlnbm9yZSBhbGwgMSdzICovCisJaWYgKCpjdXIgPT0gMCkgeworCSAgICBpZiAoYmktPmZpcnN0X3plcm9faGludCA9PSAwKSB7CisJCWJpLT5maXJzdF96ZXJvX2hpbnQgPSAoKGNoYXIgKiljdXIgLSBiaS0+YmgtPmJfZGF0YSkgPDwgMzsKKwkgICAgfQorCSAgICBiaS0+ZnJlZV9jb3VudCArPSBzaXplb2YodW5zaWduZWQgbG9uZykqODsKKwl9IGVsc2UgaWYgKCpjdXIgIT0gfjBMKSB7CisJICAgIGludCBiOworCSAgICBmb3IgKGIgPSAwOyBiIDwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKjg7IGIrKykgeworCQlpZiAoIXJlaXNlcmZzX3Rlc3RfbGVfYml0IChiLCBjdXIpKSB7CisJCSAgICBiaS0+ZnJlZV9jb3VudCArKzsKKwkJICAgIGlmIChiaS0+Zmlyc3RfemVyb19oaW50ID09IDApCisJCQliaS0+Zmlyc3RfemVyb19oaW50ID0KKwkJCQkJKCgoY2hhciAqKWN1ciAtIGJpLT5iaC0+Yl9kYXRhKSA8PCAzKSArIGI7CisJCSAgICB9CisJCX0KKwkgICAgfQorCWN1ciArKzsKKyAgICB9CisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKy8vIFRoaXMgb3V0cHV0cyBhIGxvdCBvZiB1bm5lZGVkIGluZm8gb24gYmlnIEZTZXMKKy8vICAgIHJlaXNlcmZzX3dhcm5pbmcgKCJiaXRtYXAgbG9hZGVkIGZyb20gYmxvY2sgJWQ6ICVkIGZyZWUgYmxvY2tzIiwKKy8vCQkgICAgICBiaS0+YmgtPmJfYmxvY2tuciwgYmktPmZyZWVfY291bnQpOworI2VuZGlmCit9CisgIAorc3RhdGljIGludCByZWFkX2JpdG1hcHMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCit7CisgICAgaW50IGksIGJtYXBfbnI7CisKKyAgICBTQl9BUF9CSVRNQVAgKHMpID0gdm1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8pICogU0JfQk1BUF9OUihzKSk7CisgICAgaWYgKFNCX0FQX0JJVE1BUCAocykgPT0gMCkKKwlyZXR1cm4gMTsKKyAgICBtZW1zZXQgKFNCX0FQX0JJVE1BUCAocyksIDAsIHNpemVvZiAoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvKSAqIFNCX0JNQVBfTlIocykpOworICAgIGZvciAoaSA9IDAsIGJtYXBfbnIgPSBSRUlTRVJGU19ESVNLX09GRlNFVF9JTl9CWVRFUyAvIHMtPnNfYmxvY2tzaXplICsgMTsKKwkgaSA8IFNCX0JNQVBfTlIocyk7IGkrKywgYm1hcF9uciA9IHMtPnNfYmxvY2tzaXplICogOCAqIGkpIHsKKwlTQl9BUF9CSVRNQVAgKHMpW2ldLmJoID0gc2JfZ2V0YmxrKHMsIGJtYXBfbnIpOworCWlmICghYnVmZmVyX3VwdG9kYXRlKFNCX0FQX0JJVE1BUChzKVtpXS5iaCkpCisJICAgIGxsX3J3X2Jsb2NrKFJFQUQsIDEsICZTQl9BUF9CSVRNQVAocylbaV0uYmgpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgU0JfQk1BUF9OUihzKTsgaSsrKSB7CisJd2FpdF9vbl9idWZmZXIoU0JfQVBfQklUTUFQIChzKVtpXS5iaCk7CisJaWYgKCFidWZmZXJfdXB0b2RhdGUoU0JfQVBfQklUTUFQKHMpW2ldLmJoKSkgeworCSAgICByZWlzZXJmc193YXJuaW5nKHMsInNoLTIwMjk6IHJlaXNlcmZzIHJlYWRfYml0bWFwczogIgorCQkJICJiaXRtYXAgYmxvY2sgKCMlbHUpIHJlYWRpbmcgZmFpbGVkIiwKKwkJCSBTQl9BUF9CSVRNQVAocylbaV0uYmgtPmJfYmxvY2tucik7CisJICAgIGZvciAoaSA9IDA7IGkgPCBTQl9CTUFQX05SKHMpOyBpKyspCisJCWJyZWxzZShTQl9BUF9CSVRNQVAocylbaV0uYmgpOworCSAgICB2ZnJlZShTQl9BUF9CSVRNQVAocykpOworCSAgICBTQl9BUF9CSVRNQVAocykgPSBOVUxMOworCSAgICByZXR1cm4gMTsKKwl9CisJbG9hZF9iaXRtYXBfaW5mb19kYXRhIChzLCBTQl9BUF9CSVRNQVAgKHMpICsgaSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfb2xkX2JpdG1hcHMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCit7CisgIGludCBpIDsKKyAgc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnMgPSBTQl9ESVNLX1NVUEVSX0JMT0NLKHMpOworICBpbnQgYm1wMSA9IChSRUlTRVJGU19PTERfRElTS19PRkZTRVRfSU5fQllURVMgLyBzLT5zX2Jsb2Nrc2l6ZSkgKyAxOyAgLyogZmlyc3Qgb2YgYml0bWFwIGJsb2NrcyAqLworCisgIC8qIHJlYWQgdHJ1ZSBiaXRtYXAgKi8KKyAgU0JfQVBfQklUTUFQIChzKSA9IHZtYWxsb2MgKHNpemVvZiAoc3RydWN0IHJlaXNlcmZzX2J1ZmZlcl9pbmZvICopICogc2JfYm1hcF9ucihycykpOworICBpZiAoU0JfQVBfQklUTUFQIChzKSA9PSAwKQorICAgIHJldHVybiAxOworCisgIG1lbXNldCAoU0JfQVBfQklUTUFQIChzKSwgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfYnVmZmVyX2luZm8gKikgKiBzYl9ibWFwX25yKHJzKSk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNiX2JtYXBfbnIocnMpOyBpICsrKSB7CisgICAgU0JfQVBfQklUTUFQIChzKVtpXS5iaCA9IHNiX2JyZWFkIChzLCBibXAxICsgaSk7CisgICAgaWYgKCFTQl9BUF9CSVRNQVAgKHMpW2ldLmJoKQorICAgICAgcmV0dXJuIDE7CisgICAgbG9hZF9iaXRtYXBfaW5mb19kYXRhIChzLCBTQl9BUF9CSVRNQVAgKHMpICsgaSk7CisgIH0KKworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX3N1cGVyX2Jsb2NrIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBpbnQgb2Zmc2V0KQoreworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworICAgIHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzOworICAgIGludCBmc19ibG9ja3NpemU7CisgCisKKyAgICBiaCA9IHNiX2JyZWFkIChzLCBvZmZzZXQgLyBzLT5zX2Jsb2Nrc2l6ZSk7CisgICAgaWYgKCFiaCkgeworICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgInNoLTIwMDY6IHJlYWRfc3VwZXJfYmxvY2s6ICIKKyAgICAgICAgICAgICAgImJyZWFkIGZhaWxlZCAoZGV2ICVzLCBibG9jayAlbHUsIHNpemUgJWx1KSIsCisgICAgICAgICAgICAgIHJlaXNlcmZzX2JkZXZuYW1lIChzKSwgb2Zmc2V0IC8gcy0+c19ibG9ja3NpemUsIHMtPnNfYmxvY2tzaXplKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAKKyAgICBycyA9IChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiliaC0+Yl9kYXRhOworICAgIGlmICghaXNfYW55X3JlaXNlcmZzX21hZ2ljX3N0cmluZyAocnMpKSB7CisgICAgICBicmVsc2UgKGJoKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAKKyAgICAvLworICAgIC8vIG9rLCByZWlzZXJmcyBzaWduYXR1cmUgKG9sZCBvciBuZXcpIGZvdW5kIGluIGF0IHRoZSBnaXZlbiBvZmZzZXQKKyAgICAvLyAgICAKKyAgICBmc19ibG9ja3NpemUgPSBzYl9ibG9ja3NpemUocnMpOworICAgIGJyZWxzZSAoYmgpOworICAgIHNiX3NldF9ibG9ja3NpemUgKHMsIGZzX2Jsb2Nrc2l6ZSk7CisgICAgCisgICAgYmggPSBzYl9icmVhZCAocywgb2Zmc2V0IC8gcy0+c19ibG9ja3NpemUpOworICAgIGlmICghYmgpIHsKKwlyZWlzZXJmc193YXJuaW5nIChzLCAic2gtMjAwNzogcmVhZF9zdXBlcl9ibG9jazogIgorICAgICAgICAgICAgICAgICJicmVhZCBmYWlsZWQgKGRldiAlcywgYmxvY2sgJWx1LCBzaXplICVsdSlcbiIsCisgICAgICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHMpLCBvZmZzZXQgLyBzLT5zX2Jsb2Nrc2l6ZSwgcy0+c19ibG9ja3NpemUpOworCXJldHVybiAxOworICAgIH0KKyAgICAKKyAgICBycyA9IChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiliaC0+Yl9kYXRhOworICAgIGlmIChzYl9ibG9ja3NpemUocnMpICE9IHMtPnNfYmxvY2tzaXplKSB7CisJcmVpc2VyZnNfd2FybmluZyAocywgInNoLTIwMTE6IHJlYWRfc3VwZXJfYmxvY2s6ICIKKwkJImNhbid0IGZpbmQgYSByZWlzZXJmcyBmaWxlc3lzdGVtIG9uIChkZXYgJXMsIGJsb2NrICVMdSwgc2l6ZSAlbHUpXG4iLAorCQlyZWlzZXJmc19iZGV2bmFtZSAocyksICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwgcy0+c19ibG9ja3NpemUpOworCWJyZWxzZSAoYmgpOworCXJldHVybiAxOworICAgIH0KKworICAgIGlmICggcnMtPnNfdjEuc19yb290X2Jsb2NrID09IC0xICkgeworICAgICAgIGJyZWxzZShiaCkgOworICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJVbmZpbmlzaGVkIHJlaXNlcmZzY2sgLS1yZWJ1aWxkLXRyZWUgcnVuIGRldGVjdGVkLiBQbGVhc2UgcnVuXG4iCisgICAgICAgICAgICAgICJyZWlzZXJmc2NrIC0tcmVidWlsZC10cmVlIGFuZCB3YWl0IGZvciBhIGNvbXBsZXRpb24uIElmIHRoYXQgZmFpbHNcbiIKKyAgICAgICAgICAgICAgImdldCBuZXdlciByZWlzZXJmc3Byb2dzIHBhY2thZ2UiKTsKKyAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBTQl9CVUZGRVJfV0lUSF9TQiAocykgPSBiaDsKKyAgICBTQl9ESVNLX1NVUEVSX0JMT0NLIChzKSA9IHJzOworCisgICAgaWYgKGlzX3JlaXNlcmZzX2pyIChycykpIHsKKwkvKiBtYWdpYyBpcyBvZiBub24tc3RhbmRhcmQgam91cm5hbCBmaWxlc3lzdGVtLCBsb29rIGF0IHNfdmVyc2lvbiB0bworCSAgIGZpbmQgd2hpY2ggZm9ybWF0IGlzIGluIHVzZSAqLworCWlmIChzYl92ZXJzaW9uKHJzKSA9PSBSRUlTRVJGU19WRVJTSU9OXzIpCisJICByZWlzZXJmc193YXJuaW5nIChzLCAicmVhZF9zdXBlcl9ibG9jazogZm91bmQgcmVpc2VyZnMgZm9ybWF0IFwiMy42XCIiCisJCSAgIiB3aXRoIG5vbi1zdGFuZGFyZCBqb3VybmFsIik7CisJZWxzZSBpZiAoc2JfdmVyc2lvbihycykgPT0gUkVJU0VSRlNfVkVSU0lPTl8xKQorCSAgcmVpc2VyZnNfd2FybmluZyAocywgInJlYWRfc3VwZXJfYmxvY2s6IGZvdW5kIHJlaXNlcmZzIGZvcm1hdCBcIjMuNVwiIgorCQkgICIgd2l0aCBub24tc3RhbmRhcmQgam91cm5hbCIpOworCWVsc2UgeworCSAgcmVpc2VyZnNfd2FybmluZyAocywgInNoLTIwMTI6IHJlYWRfc3VwZXJfYmxvY2s6IGZvdW5kIHVua25vd24gIgorCQkJICAgICJmb3JtYXQgXCIldVwiIG9mIHJlaXNlcmZzIHdpdGggbm9uLXN0YW5kYXJkIG1hZ2ljIiwKKwkJCSAgICBzYl92ZXJzaW9uKHJzKSk7CisJcmV0dXJuIDE7CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgICAvKiBzX3ZlcnNpb24gb2Ygc3RhbmRhcmQgZm9ybWF0IG1heSBjb250YWluIGluY29ycmVjdCBpbmZvcm1hdGlvbiwKKwkgc28gd2UganVzdCBsb29rIGF0IHRoZSBtYWdpYyBzdHJpbmcgKi8KKyAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJmb3VuZCByZWlzZXJmcyBmb3JtYXQgXCIlc1wiIHdpdGggc3RhbmRhcmQgam91cm5hbFxuIiwKKwkgICAgICBpc19yZWlzZXJmc18zXzUgKHJzKSA/ICIzLjUiIDogIjMuNiIpOworCisgICAgcy0+c19vcCA9ICZyZWlzZXJmc19zb3BzOworICAgIHMtPnNfZXhwb3J0X29wID0gJnJlaXNlcmZzX2V4cG9ydF9vcHM7CisjaWZkZWYgQ09ORklHX1FVT1RBCisgICAgcy0+c19xY29wID0gJnJlaXNlcmZzX3FjdGxfb3BlcmF0aW9uczsKKyAgICBzLT5kcV9vcCA9ICZyZWlzZXJmc19xdW90YV9vcGVyYXRpb25zOworI2VuZGlmCisKKyAgICAvKiBuZXcgZm9ybWF0IGlzIGxpbWl0ZWQgYnkgdGhlIDMyIGJpdCB3aWRlIGlfYmxvY2tzIGZpZWxkLCB3YW50IHRvCisgICAgKiogYmUgb25lIGZ1bGwgYmxvY2sgYmVsb3cgdGhhdC4KKyAgICAqLworICAgIHMtPnNfbWF4Ynl0ZXMgPSAoNTEyTEwgPDwgMzIpIC0gcy0+c19ibG9ja3NpemUgOworICAgIHJldHVybiAwOworfQorCisKKworLyogYWZ0ZXIgam91cm5hbCByZXBsYXksIHJlcmVhZCBhbGwgYml0bWFwIGFuZCBzdXBlciBibG9ja3MgKi8KK3N0YXRpYyBpbnQgcmVyZWFkX21ldGFfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykgeworICBpbnQgaSA7CisgIGxsX3J3X2Jsb2NrKFJFQUQsIDEsICYoU0JfQlVGRkVSX1dJVEhfU0IocykpKSA7CisgIHdhaXRfb25fYnVmZmVyKFNCX0JVRkZFUl9XSVRIX1NCKHMpKSA7CisgIGlmICghYnVmZmVyX3VwdG9kYXRlKFNCX0JVRkZFUl9XSVRIX1NCKHMpKSkgeworICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJyZXJlYWRfbWV0YV9ibG9ja3MsIGVycm9yIHJlYWRpbmcgdGhlIHN1cGVyIikgOworICAgIHJldHVybiAxIDsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBTQl9CTUFQX05SKHMpIDsgaSsrKSB7CisgICAgbGxfcndfYmxvY2soUkVBRCwgMSwgJihTQl9BUF9CSVRNQVAocylbaV0uYmgpKSA7CisgICAgd2FpdF9vbl9idWZmZXIoU0JfQVBfQklUTUFQKHMpW2ldLmJoKSA7CisgICAgaWYgKCFidWZmZXJfdXB0b2RhdGUoU0JfQVBfQklUTUFQKHMpW2ldLmJoKSkgeworICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgInJlcmVhZF9tZXRhX2Jsb2NrcywgZXJyb3IgcmVhZGluZyBiaXRtYXAgYmxvY2sgbnVtYmVyICVkIGF0ICVsbHUiLAorICAgICAgICBpLCAodW5zaWduZWQgbG9uZyBsb25nKVNCX0FQX0JJVE1BUChzKVtpXS5iaC0+Yl9ibG9ja25yKSA7CisgICAgICByZXR1cm4gMSA7CisgICAgfQorICB9CisgIHJldHVybiAwIDsKKworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBoYXNoIGRldGVjdGlvbiBzdHVmZgorCisKKy8vIGlmIHJvb3QgZGlyZWN0b3J5IGlzIGVtcHR5IC0gd2Ugc2V0IGRlZmF1bHQgLSBZdXJhJ3MgLSBoYXNoIGFuZAorLy8gd2FybiBhYm91dCBpdAorLy8gRklYTUU6IHdlIGxvb2sgZm9yIG9ubHkgb25lIG5hbWUgaW4gYSBkaXJlY3RvcnkuIElmIHRlYSBhbmQgeXVyYQorLy8gYml0aCBoYXZlIHRoZSBzYW1lIHZhbHVlIC0gd2UgYXNrIHVzZXIgdG8gc2VuZCByZXBvcnQgdG8gdGhlCisvLyBtYWlsaW5nIGxpc3QKK3N0YXRpYyBfX3UzMiBmaW5kX2hhc2hfb3V0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQoreworICAgIGludCByZXR2YWw7CisgICAgc3RydWN0IGlub2RlICogaW5vZGU7CisgICAgc3RydWN0IGNwdV9rZXkga2V5OworICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aCk7CisgICAgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBkZTsKKyAgICBfX3UzMiBoYXNoID0gREVGQVVMVF9IQVNIOworCisgICAgaW5vZGUgPSBzLT5zX3Jvb3QtPmRfaW5vZGU7CisKKyAgICBkbyB7IC8vIFNvbWUgc2VyaW91cyAiZ290byItaGF0ZXIgd2FzIHRoZXJlIDspCisJdTMyIHRlYWhhc2gsIHI1aGFzaCwgeXVyYWhhc2g7CisKKwltYWtlX2NwdV9rZXkgKCZrZXksIGlub2RlLCB+MCwgVFlQRV9ESVJFTlRSWSwgMyk7CisJcmV0dmFsID0gc2VhcmNoX2J5X2VudHJ5X2tleSAocywgJmtleSwgJnBhdGgsICZkZSk7CisJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCSAgICBwYXRocmVsc2UgKCZwYXRoKTsKKwkgICAgcmV0dXJuIFVOU0VUX0hBU0ggOworCX0KKwlpZiAocmV0dmFsID09IE5BTUVfTk9UX0ZPVU5EKQorCSAgICBkZS5kZV9lbnRyeV9udW0gLS07CisJc2V0X2RlX25hbWVfYW5kX25hbWVsZW4gKCZkZSk7CisJaWYgKGRlaF9vZmZzZXQoICYoZGUuZGVfZGVoW2RlLmRlX2VudHJ5X251bV0pICkgPT0gRE9UX0RPVF9PRkZTRVQpIHsKKwkgICAgLyogYWxsb3cgb3ZlcnJpZGUgaW4gdGhpcyBjYXNlICovCisJICAgIGlmIChyZWlzZXJmc19ydXBhc292X2hhc2gocykpIHsKKwkJaGFzaCA9IFlVUkFfSEFTSCA7CisJICAgIH0KKwkgICAgcmVpc2VyZnNfd2FybmluZyhzLCJGUyBzZWVtcyB0byBiZSBlbXB0eSwgYXV0b2RldGVjdCAiCisJICAgICAgICAgICAgICAgICAgICAgImlzIHVzaW5nIHRoZSBkZWZhdWx0IGhhc2giKTsKKwkgICAgYnJlYWs7CisJfQorCXI1aGFzaD1HRVRfSEFTSF9WQUxVRSAocjVfaGFzaCAoZGUuZGVfbmFtZSwgZGUuZGVfbmFtZWxlbikpOworCXRlYWhhc2g9R0VUX0hBU0hfVkFMVUUgKGtleWVkX2hhc2ggKGRlLmRlX25hbWUsIGRlLmRlX25hbWVsZW4pKTsKKwl5dXJhaGFzaD1HRVRfSEFTSF9WQUxVRSAoeXVyYV9oYXNoIChkZS5kZV9uYW1lLCBkZS5kZV9uYW1lbGVuKSk7CisJaWYgKCAoICh0ZWFoYXNoID09IHI1aGFzaCkgJiYgKEdFVF9IQVNIX1ZBTFVFKCBkZWhfb2Zmc2V0KCYoZGUuZGVfZGVoW2RlLmRlX2VudHJ5X251bV0pKSkgPT0gcjVoYXNoKSApIHx8CisJICAgICAoICh0ZWFoYXNoID09IHl1cmFoYXNoKSAmJiAoeXVyYWhhc2ggPT0gR0VUX0hBU0hfVkFMVUUoIGRlaF9vZmZzZXQoJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkpKSkgKSB8fAorCSAgICAgKCAocjVoYXNoID09IHl1cmFoYXNoKSAmJiAoeXVyYWhhc2ggPT0gR0VUX0hBU0hfVkFMVUUoIGRlaF9vZmZzZXQoJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkpKSkgKSApIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyhzLCJVbmFibGUgdG8gYXV0b21hdGljYWxseSBkZXRlY3QgaGFzaCBmdW5jdGlvbi4gIgorCQkJICAgICAiUGxlYXNlIG1vdW50IHdpdGggLW8gaGFzaD17dGVhLHJ1cGFzb3YscjV9IiwKKwkJCSAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHMpKTsKKwkgICAgaGFzaCA9IFVOU0VUX0hBU0g7CisJICAgIGJyZWFrOworCX0KKwlpZiAoR0VUX0hBU0hfVkFMVUUoIGRlaF9vZmZzZXQoJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkpICkgPT0geXVyYWhhc2gpCisJICAgIGhhc2ggPSBZVVJBX0hBU0g7CisJZWxzZSBpZiAoR0VUX0hBU0hfVkFMVUUoIGRlaF9vZmZzZXQoJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkpICkgPT0gdGVhaGFzaCkKKwkgICAgaGFzaCA9IFRFQV9IQVNIOworCWVsc2UgaWYgKEdFVF9IQVNIX1ZBTFVFKCBkZWhfb2Zmc2V0KCYoZGUuZGVfZGVoW2RlLmRlX2VudHJ5X251bV0pKSApID09IHI1aGFzaCkKKwkgICAgaGFzaCA9IFI1X0hBU0g7CisJZWxzZSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsIlVucmVjb2duaXNlZCBoYXNoIGZ1bmN0aW9uIik7CisJICAgIGhhc2ggPSBVTlNFVF9IQVNIOworCX0KKyAgICB9IHdoaWxlICgwKTsKKworICAgIHBhdGhyZWxzZSAoJnBhdGgpOworICAgIHJldHVybiBoYXNoOworfQorCisvLyBmaW5kcyBvdXQgd2hpY2ggaGFzaCBuYW1lcyBhcmUgc29ydGVkIHdpdGgKK3N0YXRpYyBpbnQgd2hhdF9oYXNoIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQoreworICAgIF9fdTMyIGNvZGU7CisKKyAgICBjb2RlID0gc2JfaGFzaF9mdW5jdGlvbl9jb2RlKFNCX0RJU0tfU1VQRVJfQkxPQ0socykpOworCisgICAgLyogcmVpc2VyZnNfaGFzaF9kZXRlY3QoKSA9PSB0cnVlIGlmIGFueSBvZiB0aGUgaGFzaCBtb3VudCBvcHRpb25zCisgICAgKiogd2VyZSB1c2VkLiAgV2UgbXVzdCBjaGVjayB0aGVtIHRvIG1ha2Ugc3VyZSB0aGUgdXNlciBpc24ndAorICAgICoqIHVzaW5nIGEgYmFkIGhhc2ggdmFsdWUKKyAgICAqLworICAgIGlmIChjb2RlID09IFVOU0VUX0hBU0ggfHwgcmVpc2VyZnNfaGFzaF9kZXRlY3QocykpCisJY29kZSA9IGZpbmRfaGFzaF9vdXQgKHMpOworCisgICAgaWYgKGNvZGUgIT0gVU5TRVRfSEFTSCAmJiByZWlzZXJmc19oYXNoX2RldGVjdChzKSkgeworCS8qIGRldGVjdGlvbiBoYXMgZm91bmQgdGhlIGhhc2gsIGFuZCB3ZSBtdXN0IGNoZWNrIGFnYWluc3QgdGhlIAorCSoqIG1vdW50IG9wdGlvbnMgCisJKi8KKwlpZiAocmVpc2VyZnNfcnVwYXNvdl9oYXNoKHMpICYmIGNvZGUgIT0gWVVSQV9IQVNIKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJFcnJvciwgJXMgaGFzaCBkZXRlY3RlZCwgIgorCQkgICAidW5hYmxlIHRvIGZvcmNlIHJ1cGFzb3YgaGFzaCIsIHJlaXNlcmZzX2hhc2huYW1lKGNvZGUpKSA7CisJICAgIGNvZGUgPSBVTlNFVF9IQVNIIDsKKwl9IGVsc2UgaWYgKHJlaXNlcmZzX3RlYV9oYXNoKHMpICYmIGNvZGUgIT0gVEVBX0hBU0gpIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAocywgIkVycm9yLCAlcyBoYXNoIGRldGVjdGVkLCAiCisJCSAgICJ1bmFibGUgdG8gZm9yY2UgdGVhIGhhc2giLCByZWlzZXJmc19oYXNobmFtZShjb2RlKSkgOworCSAgICBjb2RlID0gVU5TRVRfSEFTSCA7CisJfSBlbHNlIGlmIChyZWlzZXJmc19yNV9oYXNoKHMpICYmIGNvZGUgIT0gUjVfSEFTSCkgeworCSAgICByZWlzZXJmc193YXJuaW5nIChzLCAiRXJyb3IsICVzIGhhc2ggZGV0ZWN0ZWQsICIKKwkJICAgInVuYWJsZSB0byBmb3JjZSByNSBoYXNoIiwgcmVpc2VyZnNfaGFzaG5hbWUoY29kZSkpIDsKKwkgICAgY29kZSA9IFVOU0VUX0hBU0ggOworCX0gCisgICAgfSBlbHNlIHsgCisgICAgICAgIC8qIGZpbmRfaGFzaF9vdXQgd2FzIG5vdCBjYWxsZWQgb3IgY291bGQgbm90IGRldGVybWluZSB0aGUgaGFzaCAqLworCWlmIChyZWlzZXJmc19ydXBhc292X2hhc2gocykpIHsKKwkgICAgY29kZSA9IFlVUkFfSEFTSCA7CisJfSBlbHNlIGlmIChyZWlzZXJmc190ZWFfaGFzaChzKSkgeworCSAgICBjb2RlID0gVEVBX0hBU0ggOworCX0gZWxzZSBpZiAocmVpc2VyZnNfcjVfaGFzaChzKSkgeworCSAgICBjb2RlID0gUjVfSEFTSCA7CisJfSAKKyAgICB9CisKKyAgICAvKiBpZiB3ZSBhcmUgbW91bnRlZCBSVywgYW5kIHdlIGhhdmUgYSBuZXcgdmFsaWQgaGFzaCBjb2RlLCB1cGRhdGUgCisgICAgKiogdGhlIHN1cGVyCisgICAgKi8KKyAgICBpZiAoY29kZSAhPSBVTlNFVF9IQVNIICYmIAorCSEocy0+c19mbGFncyAmIE1TX1JET05MWSkgJiYgCisgICAgICAgIGNvZGUgIT0gc2JfaGFzaF9mdW5jdGlvbl9jb2RlKFNCX0RJU0tfU1VQRVJfQkxPQ0socykpKSB7CisgICAgICAgIHNldF9zYl9oYXNoX2Z1bmN0aW9uX2NvZGUoU0JfRElTS19TVVBFUl9CTE9DSyhzKSwgY29kZSk7CisgICAgfQorICAgIHJldHVybiBjb2RlOworfQorCisvLyByZXR1cm4gcG9pbnRlciB0byBhcHByb3ByaWF0ZSBmdW5jdGlvbgorc3RhdGljIGhhc2hmX3QgaGFzaF9mdW5jdGlvbiAoc3RydWN0IHN1cGVyX2Jsb2NrICogcykKK3sKKyAgICBzd2l0Y2ggKHdoYXRfaGFzaCAocykpIHsKKyAgICBjYXNlIFRFQV9IQVNIOgorCXJlaXNlcmZzX2luZm8gKHMsICJVc2luZyB0ZWEgaGFzaCB0byBzb3J0IG5hbWVzXG4iKTsKKwlyZXR1cm4ga2V5ZWRfaGFzaDsKKyAgICBjYXNlIFlVUkFfSEFTSDoKKwlyZWlzZXJmc19pbmZvIChzLCAiVXNpbmcgcnVwYXNvdiBoYXNoIHRvIHNvcnQgbmFtZXNcbiIpOworCXJldHVybiB5dXJhX2hhc2g7CisgICAgY2FzZSBSNV9IQVNIOgorCXJlaXNlcmZzX2luZm8gKHMsICJVc2luZyByNSBoYXNoIHRvIHNvcnQgbmFtZXNcbiIpOworCXJldHVybiByNV9oYXNoOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gdGhpcyBpcyB1c2VkIHRvIHNldCB1cCBjb3JyZWN0IHZhbHVlIGZvciBvbGQgcGFydGl0aW9ucworc3RhdGljIGludCBmdW5jdGlvbjJjb2RlIChoYXNoZl90IGZ1bmMpCit7CisgICAgaWYgKGZ1bmMgPT0ga2V5ZWRfaGFzaCkKKwlyZXR1cm4gVEVBX0hBU0g7CisgICAgaWYgKGZ1bmMgPT0geXVyYV9oYXNoKQorCXJldHVybiBZVVJBX0hBU0g7CisgICAgaWYgKGZ1bmMgPT0gcjVfaGFzaCkKKwlyZXR1cm4gUjVfSEFTSDsKKworICAgIEJVRygpIDsgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgorCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgU1dBUk4oc2lsZW50LCBzLCAuLi4pCQkJXAorCWlmICghKHNpbGVudCkpCQkJCVwKKwkJcmVpc2VyZnNfd2FybmluZyAocywgX19WQV9BUkdTX18pCisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfZmlsbF9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgdm9pZCAqIGRhdGEsIGludCBzaWxlbnQpCit7CisgICAgc3RydWN0IGlub2RlICpyb290X2lub2RlOworICAgIGludCBqOworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOworICAgIGludCBvbGRfZm9ybWF0ID0gMDsKKyAgICB1bnNpZ25lZCBsb25nIGJsb2NrczsKKyAgICB1bnNpZ25lZCBpbnQgY29tbWl0X21heF9hZ2UgPSAwOworICAgIGludCBqaW5pdF9kb25lID0gMCA7CisgICAgc3RydWN0IHJlaXNlcmZzX2lnZXRfYXJncyBhcmdzIDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiByczsKKyAgICBjaGFyICpqZGV2X25hbWU7CisgICAgc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnNiaTsKKyAgICBpbnQgZXJydmFsID0gLUVJTlZBTDsKKworICAgIHNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFzYmkpIHsKKwllcnJ2YWwgPSAtRU5PTUVNOworCWdvdG8gZXJyb3I7CisgICAgfQorICAgIHMtPnNfZnNfaW5mbyA9IHNiaTsKKyAgICBtZW1zZXQgKHNiaSwgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbykpOworICAgIC8qIFNldCBkZWZhdWx0IHZhbHVlcyBmb3Igb3B0aW9uczogbm9uLWFnZ3Jlc3NpdmUgdGFpbHMsIFJPIG9uIGVycm9ycyAqLworICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSAoMSA8PCBSRUlTRVJGU19TTUFMTFRBSUwpOworICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSAoMSA8PCBSRUlTRVJGU19FUlJPUl9STyk7CisgICAgLyogbm8gcHJlYWxsb2NhdGlvbiBtaW5pbXVtLCBiZSBzbWFydCBpbgorICAgICAgIHJlaXNlcmZzX2ZpbGVfd3JpdGUgaW5zdGVhZCAqLworICAgIFJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NtaW4gPSAwOworICAgIC8qIFByZWFsbG9jYXRlIGJ5IDE2IGJsb2NrcyAoMTctMSkgYXQgb25jZSAqLworICAgIFJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NzaXplID0gMTc7CisgICAgLyogSW5pdGlhbGl6ZSB0aGUgcndzZW0gZm9yIHhhdHRyIGRpciAqLworICAgIGluaXRfcndzZW0oJlJFSVNFUkZTX1NCKHMpLT54YXR0cl9kaXJfc2VtKTsKKworICAgIC8qIHNldHVwIGRlZmF1bHQgYmxvY2sgYWxsb2NhdG9yIG9wdGlvbnMgKi8KKyAgICByZWlzZXJmc19pbml0X2FsbG9jX29wdGlvbnMocyk7CisKKyAgICBqZGV2X25hbWUgPSBOVUxMOworICAgIGlmIChyZWlzZXJmc19wYXJzZV9vcHRpb25zIChzLCAoY2hhciAqKSBkYXRhLCAmKHNiaS0+c19tb3VudF9vcHQpLCAmYmxvY2tzLCAmamRldl9uYW1lLCAmY29tbWl0X21heF9hZ2UpID09IDApIHsKKwlnb3RvIGVycm9yOworICAgIH0KKworICAgIGlmIChibG9ja3MpIHsKKwlTV0FSTiAoc2lsZW50LCBzLCAiam1hY2QtNzogcmVpc2VyZnNfZmlsbF9zdXBlcjogcmVzaXplIG9wdGlvbiAiCisJICAgICAgICJmb3IgcmVtb3VudCBvbmx5Iik7CisJZ290byBlcnJvcjsKKyAgICB9CQorCisgICAgLyogdHJ5IG9sZCBmb3JtYXQgKHVuZGlzdHJpYnV0ZWQgYml0bWFwLCBzdXBlciBibG9jayBpbiA4LXRoIDFrIGJsb2NrIG9mIGEgZGV2aWNlKSAqLworICAgIGlmICghcmVhZF9zdXBlcl9ibG9jayAocywgUkVJU0VSRlNfT0xEX0RJU0tfT0ZGU0VUX0lOX0JZVEVTKSkKKyAgICAgIG9sZF9mb3JtYXQgPSAxOworICAgIC8qIHRyeSBuZXcgZm9ybWF0ICg2NC10aCAxayBibG9jayksIHdoaWNoIGNhbiBjb250YWluIHJlaXNlcmZzIHN1cGVyIGJsb2NrICovCisgICAgZWxzZSBpZiAocmVhZF9zdXBlcl9ibG9jayAocywgUkVJU0VSRlNfRElTS19PRkZTRVRfSU5fQllURVMpKSB7CisgICAgICBTV0FSTihzaWxlbnQsIHMsICJzaC0yMDIxOiByZWlzZXJmc19maWxsX3N1cGVyOiBjYW4gbm90IGZpbmQgcmVpc2VyZnMgb24gJXMiLCByZWlzZXJmc19iZGV2bmFtZSAocykpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpOworICAgIC8qIExldCdzIGRvIGJhc2ljIHNhbml0eSBjaGVjayB0byB2ZXJpZnkgdGhhdCB1bmRlcmx5aW5nIGRldmljZSBpcyBub3QKKyAgICAgICBzbWFsbGVyIHRoYW4gdGhlIGZpbGVzeXN0ZW0uIElmIHRoZSBjaGVjayBmYWlscyB0aGVuIGFib3J0IGFuZCBzY3JlYW0sCisgICAgICAgYmVjYXVzZSBiYWQgc3R1ZmYgd2lsbCBoYXBwZW4gb3RoZXJ3aXNlLiAqLworICAgIGlmICggcy0+c19iZGV2ICYmIHMtPnNfYmRldi0+YmRfaW5vZGUgJiYgaV9zaXplX3JlYWQocy0+c19iZGV2LT5iZF9pbm9kZSkgPCBzYl9ibG9ja19jb3VudChycykqc2JfYmxvY2tzaXplKHJzKSkgeworCVNXQVJOIChzaWxlbnQsIHMsICJGaWxlc3lzdGVtIG9uICVzIGNhbm5vdCBiZSBtb3VudGVkIGJlY2F1c2UgaXQgaXMgYmlnZ2VyIHRoYW4gdGhlIGRldmljZSIsIHJlaXNlcmZzX2JkZXZuYW1lKHMpKTsKKwlTV0FSTihzaWxlbnQsIHMsICJZb3UgbWF5IG5lZWQgdG8gcnVuIGZzY2sgb3IgaW5jcmVhc2Ugc2l6ZSBvZiB5b3VyIExWTSBwYXJ0aXRpb24iKTsKKwlTV0FSTihzaWxlbnQsIHMsICJPciBtYXkgYmUgeW91IGZvcmdvdCB0byByZWJvb3QgYWZ0ZXIgZmRpc2sgd2hlbiBpdCB0b2xkIHlvdSB0byIpOworCWdvdG8gZXJyb3I7CisgICAgfQorCisgICAgc2JpLT5zX21vdW50X3N0YXRlID0gU0JfUkVJU0VSRlNfU1RBVEUocyk7CisgICAgc2JpLT5zX21vdW50X3N0YXRlID0gUkVJU0VSRlNfVkFMSURfRlMgOworCisgICAgaWYgKG9sZF9mb3JtYXQgPyByZWFkX29sZF9iaXRtYXBzKHMpIDogcmVhZF9iaXRtYXBzKHMpKSB7CisJU1dBUk4oc2lsZW50LCBzLCAiam1hY2QtODogcmVpc2VyZnNfZmlsbF9zdXBlcjogdW5hYmxlIHRvIHJlYWQgYml0bWFwIik7CisJZ290byBlcnJvcjsKKyAgICB9CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisgICAgU1dBUk4gKHNpbGVudCwgcywgIkNPTkZJR19SRUlTRVJGU19DSEVDSyBpcyBzZXQgT04iKTsKKyAgICBTV0FSTiAoc2lsZW50LCBzLCAiLSBpdCBpcyBzbG93IG1vZGUgZm9yIGRlYnVnZ2luZy4iKTsKKyNlbmRpZgorCisgICAgLyogbWFrZSBkYXRhPW9yZGVyZWQgdGhlIGRlZmF1bHQgKi8KKyAgICBpZiAoIXJlaXNlcmZzX2RhdGFfbG9nKHMpICYmICFyZWlzZXJmc19kYXRhX29yZGVyZWQocykgJiYKKyAgICAgICAgIXJlaXNlcmZzX2RhdGFfd3JpdGViYWNrKHMpKQorICAgIHsKKyAgICAgICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSAoMSA8PCBSRUlTRVJGU19EQVRBX09SREVSRUQpOworICAgIH0KKworICAgIGlmIChyZWlzZXJmc19kYXRhX2xvZyhzKSkgeworICAgICAgICByZWlzZXJmc19pbmZvIChzLCAidXNpbmcgam91cm5hbGVkIGRhdGEgbW9kZVxuIik7CisgICAgfSBlbHNlIGlmIChyZWlzZXJmc19kYXRhX29yZGVyZWQocykpIHsKKyAgICAgICAgcmVpc2VyZnNfaW5mbyAocywgInVzaW5nIG9yZGVyZWQgZGF0YSBtb2RlXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZWlzZXJmc19pbmZvIChzLCAidXNpbmcgd3JpdGViYWNrIGRhdGEgbW9kZVxuIik7CisgICAgfQorICAgIGlmIChyZWlzZXJmc19iYXJyaWVyX2ZsdXNoKHMpKSB7CisgICAgCXByaW50aygicmVpc2VyZnM6IHVzaW5nIGZsdXNoIGJhcnJpZXJzXG4iKTsKKyAgICB9CisKKyAgICAvLyBzZXRfZGV2aWNlX3JvKHMtPnNfZGV2LCAxKSA7CisgICAgaWYoIGpvdXJuYWxfaW5pdChzLCBqZGV2X25hbWUsIG9sZF9mb3JtYXQsIGNvbW1pdF9tYXhfYWdlKSApIHsKKwlTV0FSTihzaWxlbnQsIHMsICJzaC0yMDIyOiByZWlzZXJmc19maWxsX3N1cGVyOiB1bmFibGUgdG8gaW5pdGlhbGl6ZSBqb3VybmFsIHNwYWNlIikgOworCWdvdG8gZXJyb3IgOworICAgIH0gZWxzZSB7CisJamluaXRfZG9uZSA9IDEgOyAvKiBvbmNlIHRoaXMgaXMgc2V0LCBqb3VybmFsX3JlbGVhc2UgbXVzdCBiZSBjYWxsZWQKKwkJCSAqKiBpZiB3ZSBlcnJvciBvdXQgb2YgdGhlIG1vdW50CisJCQkgKi8KKyAgICB9CisgICAgaWYgKHJlcmVhZF9tZXRhX2Jsb2NrcyhzKSkgeworCVNXQVJOKHNpbGVudCwgcywgImptYWNkLTk6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IHVuYWJsZSB0byByZXJlYWQgbWV0YSBibG9ja3MgYWZ0ZXIgam91cm5hbCBpbml0IikgOworCWdvdG8gZXJyb3IgOworICAgIH0KKworICAgIGlmIChyZXBsYXlfb25seSAocykpCisJZ290byBlcnJvcjsKKworICAgIGlmIChiZGV2X3JlYWRfb25seShzLT5zX2JkZXYpICYmICEocy0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKyAgICAgICAgU1dBUk4oc2lsZW50LCBzLCAiY2xtLTcwMDA6IERldGVjdGVkIHJlYWRvbmx5IGRldmljZSwgbWFya2luZyBGUyByZWFkb25seSIpIDsKKwlzLT5zX2ZsYWdzIHw9IE1TX1JET05MWSA7CisgICAgfQorICAgIGFyZ3Mub2JqZWN0aWQgPSBSRUlTRVJGU19ST09UX09CSkVDVElEIDsKKyAgICBhcmdzLmRpcmlkID0gUkVJU0VSRlNfUk9PVF9QQVJFTlRfT0JKRUNUSUQgOworICAgIHJvb3RfaW5vZGUgPSBpZ2V0NV9sb2NrZWQgKHMsIFJFSVNFUkZTX1JPT1RfT0JKRUNUSUQsIHJlaXNlcmZzX2ZpbmRfYWN0b3IsIHJlaXNlcmZzX2luaXRfbG9ja2VkX2lub2RlLCAodm9pZCAqKSgmYXJncykpOworICAgIGlmICghcm9vdF9pbm9kZSkgeworCVNXQVJOKHNpbGVudCwgcywgImptYWNkLTEwOiByZWlzZXJmc19maWxsX3N1cGVyOiBnZXQgcm9vdCBpbm9kZSBmYWlsZWQiKTsKKwlnb3RvIGVycm9yOworICAgIH0KKworICAgIGlmIChyb290X2lub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKKwlyZWlzZXJmc19yZWFkX2xvY2tlZF9pbm9kZShyb290X2lub2RlLCAmYXJncyk7CisJdW5sb2NrX25ld19pbm9kZShyb290X2lub2RlKTsKKyAgICB9CisKKyAgICBzLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdF9pbm9kZSk7ICAKKyAgICBpZiAoIXMtPnNfcm9vdCkgeworCWlwdXQocm9vdF9pbm9kZSk7CisJZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvLyBkZWZpbmUgYW5kIGluaXRpYWxpemUgaGFzaCBmdW5jdGlvbgorICAgIHNiaS0+c19oYXNoX2Z1bmN0aW9uID0gaGFzaF9mdW5jdGlvbiAocyk7CisgICAgaWYgKHNiaS0+c19oYXNoX2Z1bmN0aW9uID09IE5VTEwpIHsKKyAgICAgIGRwdXQocy0+c19yb290KSA7CisgICAgICBzLT5zX3Jvb3QgPSBOVUxMIDsKKyAgICAgIGdvdG8gZXJyb3IgOworICAgIH0KKworICAgIGlmIChpc19yZWlzZXJmc18zXzUgKHJzKSB8fCAoaXNfcmVpc2VyZnNfanIgKHJzKSAmJiBTQl9WRVJTSU9OIChzKSA9PSBSRUlTRVJGU19WRVJTSU9OXzEpKQorCXNldF9iaXQoUkVJU0VSRlNfM181LCAmKHNiaS0+c19wcm9wZXJ0aWVzKSk7CisgICAgZWxzZQorCXNldF9iaXQoUkVJU0VSRlNfM182LCAmKHNiaS0+c19wcm9wZXJ0aWVzKSk7CisgICAgCisgICAgaWYgKCEocy0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKworCWVycnZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBzLCAxKSA7CisgICAgICAgIGlmIChlcnJ2YWwpIHsKKwkgICAgZHB1dCAocy0+c19yb290KTsKKwkgICAgcy0+c19yb290ID0gTlVMTDsKKwkgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpIDsKKworICAgICAgICBzZXRfc2JfdW1vdW50X3N0YXRlKCBycywgUkVJU0VSRlNfRVJST1JfRlMgKTsKKwlzZXRfc2JfZnNfc3RhdGUgKHJzLCAwKTsKKwkKKwlpZiAob2xkX2Zvcm1hdF9vbmx5KHMpKSB7CisJICAvKiBmaWxlc3lzdGVtIG9mIGZvcm1hdCAzLjUgZWl0aGVyIHdpdGggc3RhbmRhcmQgb3Igbm9uLXN0YW5kYXJkCisJICAgICBqb3VybmFsICovCisJICBpZiAoY29udmVydF9yZWlzZXJmcyAocykpIHsKKwkgICAgLyogYW5kIC1vIGNvbnYgaXMgZ2l2ZW4gKi8KKwkgICAgaWYoIXNpbGVudCkKKwkgICAgICByZWlzZXJmc19pbmZvIChzLCJjb252ZXJ0aW5nIDMuNSBmaWxlc3lzdGVtIHRvIHRoZSAzLjYgZm9ybWF0IikgOworCisJICAgIGlmIChpc19yZWlzZXJmc18zXzUgKHJzKSkKKwkgICAgICAvKiBwdXQgbWFnaWMgc3RyaW5nIG9mIDMuNiBmb3JtYXQuIDIuMiB3aWxsIG5vdCBiZSBhYmxlIHRvCisJCSBtb3VudCB0aGlzIGZpbGVzeXN0ZW0gYW55bW9yZSAqLworCSAgICAgIG1lbWNweSAocnMtPnNfdjEuc19tYWdpYywgcmVpc2VyZnNfM182X21hZ2ljX3N0cmluZywKKwkJICAgICAgc2l6ZW9mIChyZWlzZXJmc18zXzZfbWFnaWNfc3RyaW5nKSk7CisKKwkgICAgc2V0X3NiX3ZlcnNpb24ocnMsUkVJU0VSRlNfVkVSU0lPTl8yKTsKKwkgICAgcmVpc2VyZnNfY29udmVydF9vYmplY3RpZF9tYXBfdjEocykgOworCSAgICBzZXRfYml0KFJFSVNFUkZTXzNfNiwgJihzYmktPnNfcHJvcGVydGllcykpOworCSAgICBjbGVhcl9iaXQoUkVJU0VSRlNfM181LCAmKHNiaS0+c19wcm9wZXJ0aWVzKSk7CisJICB9IGVsc2UgaWYgKCFzaWxlbnQpeworCSAgICByZWlzZXJmc19pbmZvIChzLCAidXNpbmcgMy41LnggZGlzayBmb3JtYXRcbiIpIDsKKwkgIH0KKwl9CisKKwlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBTQl9CVUZGRVJfV0lUSF9TQiAocykpOworCWVycnZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgcywgMSkgOworCWlmIChlcnJ2YWwpIHsKKwkgICAgZHB1dCAocy0+c19yb290KTsKKwkgICAgcy0+c19yb290ID0gTlVMTDsKKwkgICAgZ290byBlcnJvcjsKKwl9CisKKwlpZiAoKGVycnZhbCA9IHJlaXNlcmZzX3hhdHRyX2luaXQgKHMsIHMtPnNfZmxhZ3MpKSkgeworCSAgICBkcHV0IChzLT5zX3Jvb3QpOworCSAgICBzLT5zX3Jvb3QgPSBOVUxMOworCSAgICBnb3RvIGVycm9yOworCX0KKworCS8qIGxvb2sgZm9yIGZpbGVzIHdoaWNoIHdlcmUgdG8gYmUgcmVtb3ZlZCBpbiBwcmV2aW91cyBzZXNzaW9uICovCisJZmluaXNoX3VuZmluaXNoZWQgKHMpOworICAgIH0gZWxzZSB7CisJaWYgKCBvbGRfZm9ybWF0X29ubHkocykgJiYgIXNpbGVudCkgeworCSAgICByZWlzZXJmc19pbmZvIChzLCAidXNpbmcgMy41LnggZGlzayBmb3JtYXRcbiIpIDsKKwl9CisKKwlpZiAoKGVycnZhbCA9IHJlaXNlcmZzX3hhdHRyX2luaXQgKHMsIHMtPnNfZmxhZ3MpKSkgeworCSAgICBkcHV0IChzLT5zX3Jvb3QpOworCSAgICBzLT5zX3Jvb3QgPSBOVUxMOworCSAgICBnb3RvIGVycm9yOworCX0KKyAgICB9CisgICAgLy8gbWFyayBoYXNoIGluIHN1cGVyIGJsb2NrOiBpdCBjb3VsZCBiZSB1bnNldC4gb3ZlcndyaXRlIHNob3VsZCBiZSBvaworICAgIHNldF9zYl9oYXNoX2Z1bmN0aW9uX2NvZGUoIHJzLCBmdW5jdGlvbjJjb2RlKHNiaS0+c19oYXNoX2Z1bmN0aW9uICkgKTsKKworICAgIGhhbmRsZV9hdHRycyggcyApOworCisgICAgcmVpc2VyZnNfcHJvY19pbmZvX2luaXQoIHMgKTsKKworICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQgKCYoc2JpLT5zX3dhaXQpKTsKKyAgICBzcGluX2xvY2tfaW5pdCgmc2JpLT5iaXRtYXBfbG9jayk7CisKKyAgICByZXR1cm4gKDApOworCisgZXJyb3I6CisgICAgaWYgKGppbml0X2RvbmUpIHsgLyoga2lsbCB0aGUgY29tbWl0IHRocmVhZCwgZnJlZSBqb3VybmFsIHJhbSAqLworCWpvdXJuYWxfcmVsZWFzZV9lcnJvcihOVUxMLCBzKSA7CisgICAgfQorICAgIGlmIChTQl9ESVNLX1NVUEVSX0JMT0NLIChzKSkgeworCWZvciAoaiA9IDA7IGogPCBTQl9CTUFQX05SIChzKTsgaiArKykgeworCSAgICBpZiAoU0JfQVBfQklUTUFQIChzKSkKKwkJYnJlbHNlIChTQl9BUF9CSVRNQVAgKHMpW2pdLmJoKTsKKwl9CisJaWYgKFNCX0FQX0JJVE1BUCAocykpCisJICAgIHZmcmVlIChTQl9BUF9CSVRNQVAgKHMpKTsKKyAgICB9CisgICAgaWYgKFNCX0JVRkZFUl9XSVRIX1NCIChzKSkKKwlicmVsc2UoU0JfQlVGRkVSX1dJVEhfU0IgKHMpKTsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKyAgICBmb3IgKGogPSAwOyBqIDwgTUFYUVVPVEFTOyBqKyspIHsKKwlpZiAoc2JpLT5zX3FmX25hbWVzW2pdKQorCSAgICBrZnJlZShzYmktPnNfcWZfbmFtZXNbal0pOworICAgIH0KKyNlbmRpZgorICAgIGlmIChzYmkgIT0gTlVMTCkgeworCWtmcmVlKHNiaSk7CisgICAgfQorCisgICAgcy0+c19mc19pbmZvID0gTlVMTDsKKyAgICByZXR1cm4gZXJydmFsOworfQorCisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfc3RhdGZzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBzdHJ1Y3Qga3N0YXRmcyAqIGJ1ZikKK3sKKyAgc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnMgPSBTQl9ESVNLX1NVUEVSX0JMT0NLIChzKTsKKyAgCisgIGJ1Zi0+Zl9uYW1lbGVuID0gKFJFSVNFUkZTX01BWF9OQU1FIChzLT5zX2Jsb2Nrc2l6ZSkpOworICBidWYtPmZfYmZyZWUgICA9IHNiX2ZyZWVfYmxvY2tzKHJzKTsKKyAgYnVmLT5mX2JhdmFpbCAgPSBidWYtPmZfYmZyZWU7CisgIGJ1Zi0+Zl9ibG9ja3MgID0gc2JfYmxvY2tfY291bnQocnMpIC0gc2JfYm1hcF9ucihycykgLSAxOworICBidWYtPmZfYnNpemUgICA9IHMtPnNfYmxvY2tzaXplOworICAvKiBjaGFuZ2VkIHRvIGFjY29tbW9kYXRlIGdjYyBmb2xrcy4qLworICBidWYtPmZfdHlwZSAgICA9ICBSRUlTRVJGU19TVVBFUl9NQUdJQzsKKyAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUVVPVEEKK3N0YXRpYyBpbnQgcmVpc2VyZnNfZHF1b3RfaW5pdGlhbGl6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworICAgIGludCByZXQ7CisKKyAgICAvKiBXZSBtYXkgY3JlYXRlIHF1b3RhIHN0cnVjdHVyZSBzbyB3ZSBuZWVkIHRvIHJlc2VydmUgZW5vdWdoIGJsb2NrcyAqLworICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworICAgIGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgMipSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyk7CisgICAgcmV0ID0gZHF1b3RfaW5pdGlhbGl6ZShpbm9kZSwgdHlwZSk7CisgICAgam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgMipSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyk7CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlaXNlcmZzX2RxdW90X2Ryb3Aoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworICAgIGludCByZXQ7CisKKyAgICAvKiBXZSBtYXkgZGVsZXRlIHF1b3RhIHN0cnVjdHVyZSBzbyB3ZSBuZWVkIHRvIHJlc2VydmUgZW5vdWdoIGJsb2NrcyAqLworICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworICAgIGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgMipSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyk7CisgICAgcmV0ID0gZHF1b3RfZHJvcChpbm9kZSk7CisgICAgam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgMipSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyk7CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlaXNlcmZzX3dyaXRlX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKyAgICBpbnQgcmV0OworCisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhkcXVvdC0+ZHFfc2IpOworICAgIGpvdXJuYWxfYmVnaW4oJnRoLCBkcXVvdC0+ZHFfc2IsIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyk7CisgICAgcmV0ID0gZHF1b3RfY29tbWl0KGRxdW90KTsKKyAgICBqb3VybmFsX2VuZCgmdGgsIGRxdW90LT5kcV9zYiwgUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKTsKKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soZHF1b3QtPmRxX3NiKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlaXNlcmZzX2FjcXVpcmVfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworICAgIGludCByZXQ7CisKKyAgICByZWlzZXJmc193cml0ZV9sb2NrKGRxdW90LT5kcV9zYik7CisgICAgam91cm5hbF9iZWdpbigmdGgsIGRxdW90LT5kcV9zYiwgUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MpOworICAgIHJldCA9IGRxdW90X2FjcXVpcmUoZHF1b3QpOworICAgIGpvdXJuYWxfZW5kKCZ0aCwgZHF1b3QtPmRxX3NiLCBSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyk7CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRxdW90LT5kcV9zYik7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZWlzZXJmc19yZWxlYXNlX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKyAgICBpbnQgcmV0OworCisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhkcXVvdC0+ZHFfc2IpOworICAgIGpvdXJuYWxfYmVnaW4oJnRoLCBkcXVvdC0+ZHFfc2IsIFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKTsKKyAgICByZXQgPSBkcXVvdF9yZWxlYXNlKGRxdW90KTsKKyAgICBqb3VybmFsX2VuZCgmdGgsIGRxdW90LT5kcV9zYiwgUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MpOworICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkcXVvdC0+ZHFfc2IpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfbWFya19kcXVvdF9kaXJ0eShzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworICAgIC8qIEFyZSB3ZSBqb3VybmFsbGluZyBxdW90YXM/ICovCisgICAgaWYgKFJFSVNFUkZTX1NCKGRxdW90LT5kcV9zYiktPnNfcWZfbmFtZXNbVVNSUVVPVEFdIHx8CisgICAgICAgIFJFSVNFUkZTX1NCKGRxdW90LT5kcV9zYiktPnNfcWZfbmFtZXNbR1JQUVVPVEFdKSB7CisJZHF1b3RfbWFya19kcXVvdF9kaXJ0eShkcXVvdCk7CisJcmV0dXJuIHJlaXNlcmZzX3dyaXRlX2RxdW90KGRxdW90KTsKKyAgICB9CisgICAgZWxzZQorCXJldHVybiBkcXVvdF9tYXJrX2RxdW90X2RpcnR5KGRxdW90KTsKK30KKworc3RhdGljIGludCByZWlzZXJmc193cml0ZV9pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisgICAgaW50IHJldDsKKworICAgIC8qIERhdGEgYmxvY2sgKyBpbm9kZSBibG9jayAqLworICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soc2IpOworICAgIGpvdXJuYWxfYmVnaW4oJnRoLCBzYiwgMik7CisgICAgcmV0ID0gZHF1b3RfY29tbWl0X2luZm8oc2IsIHR5cGUpOworICAgIGpvdXJuYWxfZW5kKCZ0aCwgc2IsIDIpOworICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhzYik7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFR1cm4gb24gcXVvdGFzIGR1cmluZyBtb3VudCB0aW1lIC0gd2UgbmVlZCB0byBmaW5kCisgKiB0aGUgcXVvdGEgZmlsZSBhbmQgc3VjaC4uLgorICovCitzdGF0aWMgaW50IHJlaXNlcmZzX3F1b3RhX29uX21vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworICAgIGludCBlcnI7CisgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5OworICAgIHN0cnVjdCBxc3RyIG5hbWUgPSB7IC5uYW1lID0gUkVJU0VSRlNfU0Ioc2IpLT5zX3FmX25hbWVzW3R5cGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNoID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAubGVuID0gc3RybGVuKFJFSVNFUkZTX1NCKHNiKS0+c19xZl9uYW1lc1t0eXBlXSl9OworCisgICAgZGVudHJ5ID0gbG9va3VwX2hhc2goJm5hbWUsIHNiLT5zX3Jvb3QpOworICAgIGlmIChJU19FUlIoZGVudHJ5KSkKKyAgICAgICAgICAgIHJldHVybiBQVFJfRVJSKGRlbnRyeSk7CisgICAgZXJyID0gdmZzX3F1b3RhX29uX21vdW50KHR5cGUsIFJFSVNFUkZTX1NCKHNiKS0+c19qcXVvdGFfZm10LCBkZW50cnkpOworICAgIC8qIE5vdyBpbnZhbGlkYXRlIGFuZCBwdXQgdGhlIGRlbnRyeSAtIHF1b3RhIGdvdCBpdHMgb3duIHJlZmVyZW5jZQorICAgICAqIHRvIGlub2RlIGFuZCBkZW50cnkgaGFzIGF0IGxlYXN0IHdyb25nIGhhc2ggc28gd2UgaGFkIGJldHRlcgorICAgICAqIHRocm93IGl0IGF3YXkgKi8KKyAgICBkX2ludmFsaWRhdGUoZGVudHJ5KTsKKyAgICBkcHV0KGRlbnRyeSk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFN0YW5kYXJkIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBxdW90YV9vbgorICovCitzdGF0aWMgaW50IHJlaXNlcmZzX3F1b3RhX29uKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBpbnQgZm9ybWF0X2lkLCBjaGFyICpwYXRoKQoreworICAgIGludCBlcnI7CisgICAgc3RydWN0IG5hbWVpZGF0YSBuZDsKKworICAgIGVyciA9IHBhdGhfbG9va3VwKHBhdGgsIExPT0tVUF9GT0xMT1csICZuZCk7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICAvKiBRdW90YWZpbGUgbm90IG9uIHRoZSBzYW1lIGZpbGVzeXN0ZW0/ICovCisgICAgaWYgKG5kLm1udC0+bW50X3NiICE9IHNiKSB7CisJcGF0aF9yZWxlYXNlKCZuZCk7CisgICAgICAgIHJldHVybiAtRVhERVY7CisgICAgfQorICAgIC8qIFdlIG11c3Qgbm90IHBhY2sgdGFpbHMgZm9yIHF1b3RhIGZpbGVzIG9uIHJlaXNlcmZzIGZvciBxdW90YSBJTyB0byB3b3JrICovCisgICAgaWYgKCFSRUlTRVJGU19JKG5kLmRlbnRyeS0+ZF9pbm9kZSktPmlfZmxhZ3MgJiBpX25vcGFja19tYXNrKSB7CisJcmVpc2VyZnNfd2FybmluZyhzYiwgInJlaXNlcmZzOiBRdW90YSBmaWxlIG11c3QgaGF2ZSB0YWlsIHBhY2tpbmcgZGlzYWJsZWQuIik7CisJcGF0aF9yZWxlYXNlKCZuZCk7CisJcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIC8qIE5vdCBqb3VybmFsbGluZyBxdW90YT8gTm8gbW9yZSB0ZXN0cyBuZWVkZWQuLi4gKi8KKyAgICBpZiAoIVJFSVNFUkZTX1NCKHNiKS0+c19xZl9uYW1lc1tVU1JRVU9UQV0gJiYKKyAgICAgICAgIVJFSVNFUkZTX1NCKHNiKS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pIHsKKwlwYXRoX3JlbGVhc2UoJm5kKTsKKyAgICAgICAgcmV0dXJuIHZmc19xdW90YV9vbihzYiwgdHlwZSwgZm9ybWF0X2lkLCBwYXRoKTsKKyAgICB9CisgICAgLyogUXVvdGFmaWxlIG5vdCBvZiBmcyByb290PyAqLworICAgIGlmIChuZC5kZW50cnktPmRfcGFyZW50LT5kX2lub2RlICE9IHNiLT5zX3Jvb3QtPmRfaW5vZGUpCisJcmVpc2VyZnNfd2FybmluZyhzYiwgInJlaXNlcmZzOiBRdW90YSBmaWxlIG5vdCBvbiBmaWxlc3lzdGVtIHJvb3QuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpvdXJuYWxsZWQgcXVvdGEgd2lsbCBub3Qgd29yay4iKTsKKyAgICBwYXRoX3JlbGVhc2UoJm5kKTsKKyAgICByZXR1cm4gdmZzX3F1b3RhX29uKHNiLCB0eXBlLCBmb3JtYXRfaWQsIHBhdGgpOworfQorCisvKiBSZWFkIGRhdGEgZnJvbSBxdW90YWZpbGUgLSBhdm9pZCBwYWdlY2FjaGUgYW5kIHN1Y2ggYmVjYXVzZSB3ZSBjYW5ub3QgYWZmb3JkCisgKiBhY3F1aXJpbmcgdGhlIGxvY2tzLi4uIEFzIHF1b3RhIGZpbGVzIGFyZSBuZXZlciB0cnVuY2F0ZWQgYW5kIHF1b3RhIGNvZGUKKyAqIGl0c2VsZiBzZXJpYWxpemVzIHRoZSBvcGVyYXRpb25zIChhbmQgbm9vbmUgZWxzZSBzaG91bGQgdG91Y2ggdGhlIGZpbGVzKQorICogd2UgZG9uJ3QgaGF2ZSB0byBiZSBhZnJhaWQgb2YgcmFjZXMgKi8KK3N0YXRpYyBzc2l6ZV90IHJlaXNlcmZzX3F1b3RhX3JlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGNoYXIgKmRhdGEsCisJCQkJICAgc2l6ZV90IGxlbiwgbG9mZl90IG9mZikKK3sKKyAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXTsKKyAgICB1bnNpZ25lZCBsb25nIGJsayA9IG9mZiA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKyAgICBpbnQgZXJyID0gMCwgb2Zmc2V0ID0gb2ZmICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpLCB0b2NvcHk7CisgICAgc2l6ZV90IHRvcmVhZDsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgdG1wX2JoLCAqYmg7CisgICAgbG9mZl90IGlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKworICAgIGlmIChvZmYgPiBpX3NpemUpCisJcmV0dXJuIDA7CisgICAgaWYgKG9mZitsZW4gPiBpX3NpemUpCisJbGVuID0gaV9zaXplLW9mZjsKKyAgICB0b3JlYWQgPSBsZW47CisgICAgd2hpbGUgKHRvcmVhZCA+IDApIHsKKwl0b2NvcHkgPSBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgPCB0b3JlYWQgPyBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgOiB0b3JlYWQ7CisJdG1wX2JoLmJfc3RhdGUgPSAwOworCS8qIFF1b3RhIGZpbGVzIGFyZSB3aXRob3V0IHRhaWxzIHNvIHdlIGNhbiBzYWZlbHkgdXNlIHRoaXMgZnVuY3Rpb24gKi8KKwlyZWlzZXJmc193cml0ZV9sb2NrKHNiKTsKKwllcnIgPSByZWlzZXJmc19nZXRfYmxvY2soaW5vZGUsIGJsaywgJnRtcF9iaCwgMCk7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHNiKTsKKwlpZiAoZXJyKQorCSAgICByZXR1cm4gZXJyOworCWlmICghYnVmZmVyX21hcHBlZCgmdG1wX2JoKSkgICAgLyogQSBob2xlPyAqLworCSAgICBtZW1zZXQoZGF0YSwgMCwgdG9jb3B5KTsKKwllbHNlIHsKKwkgICAgYmggPSBzYl9icmVhZChzYiwgdG1wX2JoLmJfYmxvY2tucik7CisJICAgIGlmICghYmgpCisJCXJldHVybiAtRUlPOworCSAgICBtZW1jcHkoZGF0YSwgYmgtPmJfZGF0YStvZmZzZXQsIHRvY29weSk7CisJICAgIGJyZWxzZShiaCk7CisJfQorCW9mZnNldCA9IDA7CisJdG9yZWFkIC09IHRvY29weTsKKwlkYXRhICs9IHRvY29weTsKKwlibGsrKzsKKyAgICB9CisgICAgcmV0dXJuIGxlbjsKK30KKworLyogV3JpdGUgdG8gcXVvdGFmaWxlICh3ZSBrbm93IHRoZSB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5IHN0YXJ0ZWQgYW5kIGhhcworICogZW5vdWdoIGNyZWRpdHMpICovCitzdGF0aWMgc3NpemVfdCByZWlzZXJmc19xdW90YV93cml0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwKKwkJCQkgICAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgbG9mZl90IG9mZikKK3sKKyAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXTsKKyAgICB1bnNpZ25lZCBsb25nIGJsayA9IG9mZiA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKyAgICBpbnQgZXJyID0gMCwgb2Zmc2V0ID0gb2ZmICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpLCB0b2NvcHk7CisgICAgaW50IGpvdXJuYWxfcXVvdGEgPSBSRUlTRVJGU19TQihzYiktPnNfcWZfbmFtZXNbdHlwZV0gIT0gTlVMTDsKKyAgICBzaXplX3QgdG93cml0ZSA9IGxlbjsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgdG1wX2JoLCAqYmg7CisKKyAgICBkb3duKCZpbm9kZS0+aV9zZW0pOworICAgIHdoaWxlICh0b3dyaXRlID4gMCkgeworCXRvY29weSA9IHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA8IHRvd3JpdGUgPworCSAgICAgICAgIHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA6IHRvd3JpdGU7CisJdG1wX2JoLmJfc3RhdGUgPSAwOworCWVyciA9IHJlaXNlcmZzX2dldF9ibG9jayhpbm9kZSwgYmxrLCAmdG1wX2JoLCBHRVRfQkxPQ0tfQ1JFQVRFKTsKKwlpZiAoZXJyKQorCSAgICBnb3RvIG91dDsKKwlpZiAob2Zmc2V0IHx8IHRvY29weSAhPSBzYi0+c19ibG9ja3NpemUpCisJICAgIGJoID0gc2JfYnJlYWQoc2IsIHRtcF9iaC5iX2Jsb2NrbnIpOworCWVsc2UKKwkgICAgYmggPSBzYl9nZXRibGsoc2IsIHRtcF9iaC5iX2Jsb2NrbnIpOworCWlmICghYmgpIHsKKwkgICAgZXJyID0gLUVJTzsKKwkgICAgZ290byBvdXQ7CisJfQorCWxvY2tfYnVmZmVyKGJoKTsKKwltZW1jcHkoYmgtPmJfZGF0YStvZmZzZXQsIGRhdGEsIHRvY29weSk7CisJZmx1c2hfZGNhY2hlX3BhZ2UoYmgtPmJfcGFnZSk7CisJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJdW5sb2NrX2J1ZmZlcihiaCk7CisJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzYiwgYmgsIDEpOworCWpvdXJuYWxfbWFya19kaXJ0eShjdXJyZW50LT5qb3VybmFsX2luZm8sIHNiLCBiaCk7CisJaWYgKCFqb3VybmFsX3F1b3RhKQorCQlyZWlzZXJmc19hZGRfb3JkZXJlZF9saXN0KGlub2RlLCBiaCk7CisJYnJlbHNlKGJoKTsKKwlvZmZzZXQgPSAwOworCXRvd3JpdGUgLT0gdG9jb3B5OworCWRhdGEgKz0gdG9jb3B5OworCWJsaysrOworICAgIH0KK291dDoKKyAgICBpZiAobGVuID09IHRvd3JpdGUpCisJcmV0dXJuIGVycjsKKyAgICBpZiAoaW5vZGUtPmlfc2l6ZSA8IG9mZitsZW4tdG93cml0ZSkKKwlpX3NpemVfd3JpdGUoaW5vZGUsIG9mZitsZW4tdG93cml0ZSk7CisgICAgaW5vZGUtPmlfdmVyc2lvbisrOworICAgIGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisgICAgbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisgICAgdXAoJmlub2RlLT5pX3NlbSk7CisgICAgcmV0dXJuIGxlbiAtIHRvd3JpdGU7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrKgorZ2V0X3N1cGVyX2Jsb2NrIChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAorCQkgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgcmVpc2VyZnNfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0Citpbml0X3JlaXNlcmZzX2ZzICggdm9pZCApCit7CisJaW50IHJldDsKKworCWlmICgocmV0ID0gaW5pdF9pbm9kZWNhY2hlICgpKSkgeworCQlyZXR1cm4gcmV0OworCX0KKworICAgICAgICBpZiAoKHJldCA9IHJlaXNlcmZzX3hhdHRyX3JlZ2lzdGVyX2hhbmRsZXJzICgpKSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkX3JlaXNlcmZzX3hhdHRyX3JlZ2lzdGVyX2hhbmRsZXJzOworCisJcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9pbml0ICgpOworCXJlaXNlcmZzX3Byb2NfcmVnaXN0ZXJfZ2xvYmFsICgidmVyc2lvbiIsIHJlaXNlcmZzX2dsb2JhbF92ZXJzaW9uX2luX3Byb2MpOworCisgICAgICAgIHJldCA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0gKCYgcmVpc2VyZnNfZnNfdHlwZSk7CisKKwlpZiAocmV0ID09IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCisgICAgICAgIHJlaXNlcmZzX3hhdHRyX3VucmVnaXN0ZXJfaGFuZGxlcnMgKCk7CisKK2ZhaWxlZF9yZWlzZXJmc194YXR0cl9yZWdpc3Rlcl9oYW5kbGVyczoKKwlyZWlzZXJmc19wcm9jX3VucmVnaXN0ZXJfZ2xvYmFsICgidmVyc2lvbiIpOworCXJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfZG9uZSAoKTsKKwlkZXN0cm95X2lub2RlY2FjaGUgKCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2V4aXRfcmVpc2VyZnNfZnMgKCB2b2lkICkKK3sKKyAgICAgICAgcmVpc2VyZnNfeGF0dHJfdW5yZWdpc3Rlcl9oYW5kbGVycyAoKTsKKwlyZWlzZXJmc19wcm9jX3VucmVnaXN0ZXJfZ2xvYmFsICgidmVyc2lvbiIpOworCXJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfZG9uZSAoKTsKKyAgICAgICAgdW5yZWdpc3Rlcl9maWxlc3lzdGVtICgmIHJlaXNlcmZzX2ZzX3R5cGUpOworCWRlc3Ryb3lfaW5vZGVjYWNoZSAoKTsKK30KKworc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgcmVpc2VyZnNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInJlaXNlcmZzIiwKKwkuZ2V0X3NiCQk9IGdldF9zdXBlcl9ibG9jaywKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworTU9EVUxFX0RFU0NSSVBUSU9OICgiUmVpc2VyRlMgam91cm5hbGVkIGZpbGVzeXN0ZW0iKTsKK01PRFVMRV9BVVRIT1IgICAgICAoIkhhbnMgUmVpc2VyIDxyZWlzZXJAbmFtZXN5cy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSAgICAgKCJHUEwiKTsKKworbW9kdWxlX2luaXQgKGluaXRfcmVpc2VyZnNfZnMpOworbW9kdWxlX2V4aXQgKGV4aXRfcmVpc2VyZnNfZnMpOwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvdGFpbF9jb252ZXJzaW9uLmMgYi9mcy9yZWlzZXJmcy90YWlsX2NvbnZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTkxOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcmVpc2VyZnMvdGFpbF9jb252ZXJzaW9uLmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSBIYW5zIFJlaXNlciwgc2VlIHJlaXNlcmZzL1JFQURNRSBmb3IgbGljZW5zaW5nIGFuZCBjb3B5cmlnaHQgZGV0YWlscworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKworLyogYWNjZXNzIHRvIHRhaWwgOiB3aGVuIG9uZSBpcyBnb2luZyB0byByZWFkIHRhaWwgaXQgbXVzdCBtYWtlIHN1cmUsIHRoYXQgaXMgbm90IHJ1bm5pbmcuCisgZGlyZWN0MmluZGlyZWN0IGFuZCBpbmRpcmVjdDJkaXJlY3QgY2FuIG5vdCBydW4gY29uY3VycmVudGx5ICovCisKKworLyogQ29udmVydHMgZGlyZWN0IGl0ZW1zIHRvIGFuIHVuZm9ybWF0dGVkIG5vZGUuIFBhbmljcyBpZiBmaWxlIGhhcyBubworICAgdGFpbC4gLUVOT1NQQyBpZiBubyBkaXNrIHNwYWNlIGZvciBjb252ZXJzaW9uICovCisvKiBwYXRoIHBvaW50cyB0byBmaXJzdCBkaXJlY3QgaXRlbSBvZiB0aGUgZmlsZSByZWdhcmxlc3Mgb2YgaG93IG1hbnkgb2YKKyAgIHRoZW0gYXJlIHRoZXJlICovCitpbnQgZGlyZWN0MmluZGlyZWN0IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICogaW5vZGUsIAorCQkgICAgIHN0cnVjdCBwYXRoICogcGF0aCwgc3RydWN0IGJ1ZmZlcl9oZWFkICogdW5iaCwKKwkJICAgICBsb2ZmX3QgdGFpbF9vZmZzZXQpCit7CisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICogc2IgPSBpbm9kZS0+aV9zYjsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnVwX3RvX2RhdGVfYmggOworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBwX2xlX2loID0gUEFUSF9QSVRFTV9IRUFEIChwYXRoKTsKKyAgICB1bnNpZ25lZCBsb25nIHRvdGFsX3RhaWwgPSAwIDsKKyAgICBzdHJ1Y3QgY3B1X2tleSBlbmRfa2V5OyAgLyogS2V5IHRvIHNlYXJjaCBmb3IgdGhlIGxhc3QgYnl0ZSBvZiB0aGUKKwkJCQljb252ZXJ0ZWQgaXRlbS4gKi8KKyAgICBzdHJ1Y3QgaXRlbV9oZWFkIGluZF9paDsgLyogbmV3IGluZGlyZWN0IGl0ZW0gdG8gYmUgaW5zZXJ0ZWQgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5IG9mIHVuZm0gcG9pbnRlciB0byBiZSBwYXN0ZWQgKi8KKyAgICBpbnQJbl9ibGtfc2l6ZSwKKyAgICAgIG5fcmV0dmFsOwkgIC8qIHJldHVybmVkIHZhbHVlIGZvciByZWlzZXJmc19pbnNlcnRfaXRlbSBhbmQgY2xvbmVzICovCisgICAgdW5wX3QgdW5mbV9wdHI7ICAvKiBIYW5kbGUgb24gYW4gdW5mb3JtYXR0ZWQgbm9kZQorCQkJCSAgICAgICB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgaW4gdGhlCisJCQkJICAgICAgIHRyZWUuICovCisKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisKKyAgICBSRUlTRVJGU19TQihzYiktPnNfZGlyZWN0MmluZGlyZWN0ICsrOworCisgICAgbl9ibGtfc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKworICAgIC8qIGFuZCBrZXkgdG8gc2VhcmNoIGZvciBhcHBlbmQgb3IgaW5zZXJ0IHBvaW50ZXIgdG8gdGhlIG5ldworICAgICAgIHVuZm9ybWF0dGVkIG5vZGUuICovCisgICAgY29weV9pdGVtX2hlYWQgKCZpbmRfaWgsIHBfbGVfaWgpOworICAgIHNldF9sZV9paF9rX29mZnNldCAoJmluZF9paCwgdGFpbF9vZmZzZXQpOworICAgIHNldF9sZV9paF9rX3R5cGUgKCZpbmRfaWgsIFRZUEVfSU5ESVJFQ1QpOworCisgICAgLyogU2V0IHRoZSBrZXkgdG8gc2VhcmNoIGZvciB0aGUgcGxhY2UgZm9yIG5ldyB1bmZtIHBvaW50ZXIgKi8KKyAgICBtYWtlX2NwdV9rZXkgKCZlbmRfa2V5LCBpbm9kZSwgdGFpbF9vZmZzZXQsIFRZUEVfSU5ESVJFQ1QsIDQpOworCisgICAgLy8gRklYTUU6IHdlIGNvdWxkIGF2b2lkIHRoaXMgCisgICAgaWYgKCBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleSAoc2IsICZlbmRfa2V5LCBwYXRoKSA9PSBQT1NJVElPTl9GT1VORCApIHsKKwlyZWlzZXJmc193YXJuaW5nIChzYiwgIlBBUC0xNDAzMDogZGlyZWN0MmluZGlyZWN0OiAiCisJCQkicGFzdGVkIG9yIGluc2VydGVkIGJ5dGUgZXhpc3RzIGluIHRoZSB0cmVlICVLLiAiCisJCQkiVXNlIGZzY2sgdG8gcmVwYWlyLiIsICZlbmRfa2V5KTsKKwlwYXRocmVsc2UocGF0aCk7CisJcmV0dXJuIC1FSU87CisgICAgfQorICAgIAorICAgIHBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQgKHBhdGgpOworCisgICAgdW5mbV9wdHIgPSBjcHVfdG9fbGUzMiAodW5iaC0+Yl9ibG9ja25yKTsKKyAgICAKKyAgICBpZiAoIGlzX3N0YXRkYXRhX2xlX2loIChwX2xlX2loKSApICB7CisJLyogSW5zZXJ0IG5ldyBpbmRpcmVjdCBpdGVtLiAqLworCXNldF9paF9mcmVlX3NwYWNlICgmaW5kX2loLCAwKTsgLyogZGVsZXRlIGF0IG5lYXJlc3QgZnV0dXJlICovCisgICAgICAgIHB1dF9paF9pdGVtX2xlbiggJmluZF9paCwgVU5GTV9QX1NJWkUgKTsKKwlQQVRIX0xBU1RfUE9TSVRJT04gKHBhdGgpKys7CisJbl9yZXR2YWwgPSByZWlzZXJmc19pbnNlcnRfaXRlbSAodGgsIHBhdGgsICZlbmRfa2V5LCAmaW5kX2loLCBpbm9kZSwKKwkJCQkJIChjaGFyICopJnVuZm1fcHRyKTsKKyAgICB9IGVsc2UgeworCS8qIFBhc3RlIGludG8gbGFzdCBpbmRpcmVjdCBpdGVtIG9mIGFuIG9iamVjdC4gKi8KKwluX3JldHZhbCA9IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbSh0aCwgcGF0aCwgJmVuZF9rZXksIGlub2RlLAorCQkJCQkgICAgKGNoYXIgKikmdW5mbV9wdHIsIFVORk1fUF9TSVpFKTsKKyAgICB9CisgICAgaWYgKCBuX3JldHZhbCApIHsKKwlyZXR1cm4gbl9yZXR2YWw7CisgICAgfQorCisgICAgLy8gbm90ZTogZnJvbSBoZXJlIHRoZXJlIGFyZSB0d28ga2V5cyB3aGljaCBoYXZlIG1hdGNoaW5nIGZpcnN0CisgICAgLy8gdGhyZWUga2V5IGNvbXBvbmVudHMuIFRoZXkgb25seSBkaWZmZXIgYnkgdGhlIGZvdXJ0aCBvbmUuCisKKworICAgIC8qIFNldCB0aGUga2V5IHRvIHNlYXJjaCBmb3IgdGhlIGRpcmVjdCBpdGVtcyBvZiB0aGUgZmlsZSAqLworICAgIG1ha2VfY3B1X2tleSAoJmVuZF9rZXksIGlub2RlLCBtYXhfcmVpc2VyZnNfb2Zmc2V0IChpbm9kZSksIFRZUEVfRElSRUNULCA0KTsKKworICAgIC8qIE1vdmUgYnl0ZXMgZnJvbSB0aGUgZGlyZWN0IGl0ZW1zIHRvIHRoZSBuZXcgdW5mb3JtYXR0ZWQgbm9kZQorICAgICAgIGFuZCBkZWxldGUgdGhlbS4gKi8KKyAgICB3aGlsZSAoMSkgIHsKKwlpbnQgdGFpbF9zaXplOworCisJLyogZW5kX2tleS5rX29mZnNldCBpcyBzZXQgc28sIHRoYXQgd2Ugd2lsbCBhbHdheXMgaGF2ZSBmb3VuZAorICAgICAgICAgICBsYXN0IGl0ZW0gb2YgdGhlIGZpbGUgKi8KKwlpZiAoIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChzYiwgJmVuZF9rZXksIHBhdGgpID09IFBPU0lUSU9OX0ZPVU5EICkKKwkgICAgcmVpc2VyZnNfcGFuaWMgKHNiLCAiUEFQLTE0MDUwOiBkaXJlY3QyaW5kaXJlY3Q6ICIKKwkJCSAgICAiZGlyZWN0IGl0ZW0gKCVLKSBub3QgZm91bmQiLCAmZW5kX2tleSk7CisJcF9sZV9paCA9IFBBVEhfUElURU1fSEVBRCAocGF0aCk7CisJUkZBTFNFKCAhaXNfZGlyZWN0X2xlX2loIChwX2xlX2loKSwKKwkgICAgICAgICJ2cy0xNDA1NTogZGlyZWN0IGl0ZW0gZXhwZWN0ZWQoJUspLCBmb3VuZCAlaCIsCisgICAgICAgICAgICAgICAgJmVuZF9rZXksIHBfbGVfaWgpOworICAgICAgICB0YWlsX3NpemUgPSAobGVfaWhfa19vZmZzZXQgKHBfbGVfaWgpICYgKG5fYmxrX3NpemUgLSAxKSkKKyAgICAgICAgICAgICsgaWhfaXRlbV9sZW4ocF9sZV9paCkgLSAxOworCisJLyogd2Ugb25seSBzZW5kIHRoZSB1bmJoIHBvaW50ZXIgaWYgdGhlIGJ1ZmZlciBpcyBub3QgdXAgdG8gZGF0ZS4KKwkqKiB0aGlzIGF2b2lkcyBvdmVyd3JpdGluZyBnb29kIGRhdGEgZnJvbSB3cml0ZXBhZ2UoKSB3aXRoIG9sZCBkYXRhCisJKiogZnJvbSB0aGUgZGlzayBvciBidWZmZXIgY2FjaGUKKwkqKiBTcGVjaWFsIGNhc2U6IHVuYmgtPmJfcGFnZSB3aWxsIGJlIE5VTEwgaWYgd2UgYXJlIGNvbWluZyB0aHJvdWdoCisJKiogRElSRUNUX0lPIGhhbmRsZXIgaGVyZS4KKwkqLworCWlmICghdW5iaC0+Yl9wYWdlIHx8IGJ1ZmZlcl91cHRvZGF0ZSh1bmJoKSB8fCBQYWdlVXB0b2RhdGUodW5iaC0+Yl9wYWdlKSkgeworCSAgICB1cF90b19kYXRlX2JoID0gTlVMTCA7CisJfSBlbHNlIHsKKwkgICAgdXBfdG9fZGF0ZV9iaCA9IHVuYmggOworCX0KKwluX3JldHZhbCA9IHJlaXNlcmZzX2RlbGV0ZV9pdGVtICh0aCwgcGF0aCwgJmVuZF9rZXksIGlub2RlLCAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cF90b19kYXRlX2JoKSA7CisKKwl0b3RhbF90YWlsICs9IG5fcmV0dmFsIDsKKwlpZiAodGFpbF9zaXplID09IG5fcmV0dmFsKQorCSAgICAvLyBkb25lOiBmaWxlIGRvZXMgbm90IGhhdmUgZGlyZWN0IGl0ZW1zIGFueW1vcmUKKwkgICAgYnJlYWs7CisKKyAgICB9CisgICAgLyogaWYgd2UndmUgY29waWVkIGJ5dGVzIGZyb20gZGlzayBpbnRvIHRoZSBwYWdlLCB3ZSBuZWVkIHRvIHplcm8KKyAgICAqKiBvdXQgdGhlIHVudXNlZCBwYXJ0IG9mIHRoZSBibG9jayAoaXQgd2FzIG5vdCB1cCB0byBkYXRlIGJlZm9yZSkKKyAgICAqLworICAgIGlmICh1cF90b19kYXRlX2JoKSB7CisgICAgICAgIHVuc2lnbmVkIHBnb2ZmID0gKHRhaWxfb2Zmc2V0ICsgdG90YWxfdGFpbCAtIDEpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCWNoYXIgKmthZGRyPWttYXBfYXRvbWljKHVwX3RvX2RhdGVfYmgtPmJfcGFnZSwgS01fVVNFUjApOworCW1lbXNldChrYWRkciArIHBnb2ZmLCAwLCBuX2Jsa19zaXplIC0gdG90YWxfdGFpbCkgOworCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKyAgICB9CisKKyAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9maXJzdF9kaXJlY3RfYnl0ZSA9IFUzMl9NQVg7CisKKyAgICByZXR1cm4gMDsKK30KKworCisvKiBzdG9sZW4gZnJvbSBmcy9idWZmZXIuYyAqLwordm9pZCByZWlzZXJmc191bm1hcF9idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgeworICAgIGxvY2tfYnVmZmVyKGJoKSA7CisgICAgaWYgKGJ1ZmZlcl9qb3VybmFsZWQoYmgpIHx8IGJ1ZmZlcl9qb3VybmFsX2RpcnR5KGJoKSkgeworICAgICAgQlVHKCkgOworICAgIH0KKyAgICBjbGVhcl9idWZmZXJfZGlydHkoYmgpIDsKKyAgICAvKiBSZW1vdmUgdGhlIGJ1ZmZlciBmcm9tIHdoYXRldmVyIGxpc3QgaXQgYmVsb25ncyB0by4gV2UgYXJlIG1vc3RseQorICAgICAgIGludGVyZXN0ZWQgaW4gcmVtb3ZpbmcgaXQgZnJvbSBwZXItc2Igal9kaXJ0eV9idWZmZXJzIGxpc3QsIHRvIGF2b2lkCisgICAgICAgIEJVRygpIG9uIGF0dGVtcHQgdG8gd3JpdGUgbm90IG1hcHBlZCBidWZmZXIgKi8KKyAgICBpZiAoICghbGlzdF9lbXB0eSgmYmgtPmJfYXNzb2NfYnVmZmVycykgfHwgYmgtPmJfcHJpdmF0ZSkgJiYgYmgtPmJfcGFnZSkgeworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBiaC0+Yl9wYWdlLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqID0gU0JfSk9VUk5BTChpbm9kZS0+aV9zYik7CisJc3Bpbl9sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jayk7CisJbGlzdF9kZWxfaW5pdCgmYmgtPmJfYXNzb2NfYnVmZmVycyk7CisJcmVpc2VyZnNfZnJlZV9qaChiaCk7CisJc3Bpbl91bmxvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKTsKKyAgICB9CisgICAgY2xlYXJfYnVmZmVyX21hcHBlZChiaCkgOworICAgIGNsZWFyX2J1ZmZlcl9yZXEoYmgpIDsKKyAgICBjbGVhcl9idWZmZXJfbmV3KGJoKTsKKyAgICBiaC0+Yl9iZGV2ID0gTlVMTDsKKyAgICB1bmxvY2tfYnVmZmVyKGJoKSA7Cit9CisKKy8qIHRoaXMgZmlyc3QgbG9ja3MgaW5vZGUgKG5laXRoZXIgcmVhZHMgbm9yIHN5bmMgYXJlIHBlcm1pdHRlZCksCisgICByZWFkcyB0YWlsIHRocm91Z2ggcGFnZSBjYWNoZSwgaW5zZXJ0IGRpcmVjdCBpdGVtLiBXaGVuIGRpcmVjdCBpdGVtCisgICBpbnNlcnRlZCBzdWNjZXNzZnVsbHkgaW5vZGUgaXMgbGVmdCBsb2NrZWQuIFJldHVybiB2YWx1ZSBpcyBhbHdheXMKKyAgIHdoYXQgd2UgZXhwZWN0IGZyb20gaXQgKG51bWJlciBvZiBjdXQgYnl0ZXMpLiBCdXQgd2hlbiB0YWlsIHJlbWFpbnMKKyAgIGluIHRoZSB1bmZvcm1hdHRlZCBub2RlLCB3ZSBzZXQgbW9kZSB0byBTS0lQX0JBTEFOQ0lORyBhbmQgdW5sb2NrCisgICBpbm9kZSAqLworaW50IGluZGlyZWN0MmRpcmVjdCAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAorCQkgICAgIHN0cnVjdCBpbm9kZSAqIHBfc19pbm9kZSwKKwkJICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgCisJCSAgICAgc3RydWN0IHBhdGggKiBwX3NfcGF0aCwgLyogcGF0aCB0byB0aGUgaW5kaXJlY3QgaXRlbS4gKi8KKwkJICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIHBfc19pdGVtX2tleSwgLyogS2V5IHRvIGxvb2sgZm9yIHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlciB0byBiZSBjdXQuICovCisJCSAgICAgbG9mZl90IG5fbmV3X2ZpbGVfc2l6ZSwgLyogTmV3IGZpbGUgc2l6ZS4gKi8KKwkJICAgICBjaGFyICogcF9jX21vZGUpCit7CisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICogcF9zX3NiID0gcF9zX2lub2RlLT5pX3NiOworICAgIHN0cnVjdCBpdGVtX2hlYWQgICAgICBzX2loOworICAgIHVuc2lnbmVkIGxvbmcgbl9ibG9ja19zaXplID0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZTsKKyAgICBjaGFyICogdGFpbDsKKyAgICBpbnQgdGFpbF9sZW4sIHJvdW5kX3RhaWxfbGVuOworICAgIGxvZmZfdCBwb3MsIHBvczE7IC8qIHBvc2l0aW9uIG9mIGZpcnN0IGJ5dGUgb2YgdGhlIHRhaWwgKi8KKyAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7CisKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisKKyAgICBSRUlTRVJGU19TQihwX3Nfc2IpLT5zX2luZGlyZWN0MmRpcmVjdCArKzsKKworICAgICpwX2NfbW9kZSA9IE1fU0tJUF9CQUxBTkNJTkc7CisKKyAgICAvKiBzdG9yZSBpdGVtIGhlYWQgcGF0aCBwb2ludHMgdG8uICovCisgICAgY29weV9pdGVtX2hlYWQgKCZzX2loLCBQQVRIX1BJVEVNX0hFQUQocF9zX3BhdGgpKTsKKworICAgIHRhaWxfbGVuID0gKG5fbmV3X2ZpbGVfc2l6ZSAmIChuX2Jsb2NrX3NpemUgLSAxKSk7CisgICAgaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uIChwX3NfaW5vZGUpID09IFNUQVRfREFUQV9WMikKKwlyb3VuZF90YWlsX2xlbiA9IFJPVU5EX1VQICh0YWlsX2xlbik7CisgICAgZWxzZQorCXJvdW5kX3RhaWxfbGVuID0gdGFpbF9sZW47CisKKyAgICBwb3MgPSBsZV9paF9rX29mZnNldCAoJnNfaWgpIC0gMSArIChpaF9pdGVtX2xlbigmc19paCkgLyBVTkZNX1BfU0laRSAtIDEpICogcF9zX3NiLT5zX2Jsb2Nrc2l6ZTsKKyAgICBwb3MxID0gcG9zOworCisgICAgLy8gd2UgYXJlIHByb3RlY3RlZCBieSBpX3NlbS4gVGhlIHRhaWwgY2FuIG5vdCBkaXNhcHBlciwgbm90CisgICAgLy8gYXBwZW5kIGNhbiBiZSBkb25lIGVpdGhlcgorICAgIC8vIHdlIGFyZSBpbiB0cnVuY2F0ZSBvciBwYWNraW5nIHRhaWwgaW4gZmlsZV9yZWxlYXNlCisKKyAgICB0YWlsID0gKGNoYXIgKilrbWFwKHBhZ2UpIDsgLyogdGhpcyBjYW4gc2NoZWR1bGUgKi8KKworICAgIGlmIChwYXRoX2NoYW5nZWQgKCZzX2loLCBwX3NfcGF0aCkpIHsKKwkvKiByZS1zZWFyY2ggaW5kaXJlY3QgaXRlbSAqLworCWlmICggc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkgKHBfc19zYiwgcF9zX2l0ZW1fa2V5LCBwX3NfcGF0aCkgPT0gUE9TSVRJT05fTk9UX0ZPVU5EICkKKwkgICAgcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiUEFQLTU1MjA6IGluZGlyZWN0MmRpcmVjdDogIgorCQkJICAgIml0ZW0gdG8gYmUgY29udmVydGVkICVLIGRvZXMgbm90IGV4aXN0IiwgcF9zX2l0ZW1fa2V5KTsKKwljb3B5X2l0ZW1faGVhZCgmc19paCwgUEFUSF9QSVRFTV9IRUFEKHBfc19wYXRoKSk7CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJcG9zID0gbGVfaWhfa19vZmZzZXQgKCZzX2loKSAtIDEgKyAKKwkgICAgKGloX2l0ZW1fbGVuKCZzX2loKSAvIFVORk1fUF9TSVpFIC0gMSkgKiBwX3Nfc2ItPnNfYmxvY2tzaXplOworCWlmIChwb3MgIT0gcG9zMSkKKwkgICAgcmVpc2VyZnNfcGFuaWMgKHBfc19zYiwgInZzLTU1MzA6IGluZGlyZWN0MmRpcmVjdDogIgorCQkJICAgICJ0YWlsIHBvc2l0aW9uIGNoYW5nZWQgd2hpbGUgd2Ugd2VyZSByZWFkaW5nIGl0Iik7CisjZW5kaWYKKyAgICB9CisKKworICAgIC8qIFNldCBkaXJlY3QgaXRlbSBoZWFkZXIgdG8gaW5zZXJ0LiAqLworICAgIG1ha2VfbGVfaXRlbV9oZWFkICgmc19paCwgTlVMTCwgZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24gKHBfc19pbm9kZSksIHBvczEgKyAxLAorCQkgICAgICAgVFlQRV9ESVJFQ1QsIHJvdW5kX3RhaWxfbGVuLCAweGZmZmYvKmloX2ZyZWVfc3BhY2UqLyk7CisKKyAgICAvKiB3ZSB3YW50IGEgcG9pbnRlciB0byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgdGFpbCBpbiB0aGUgcGFnZS4KKyAgICAqKiB0aGUgcGFnZSB3YXMgbG9ja2VkIGFuZCB0aGlzIHBhcnQgb2YgdGhlIHBhZ2Ugd2FzIHVwIHRvIGRhdGUgd2hlbgorICAgICoqIGluZGlyZWN0MmRpcmVjdCB3YXMgY2FsbGVkLCBzbyB3ZSBrbm93IHRoZSBieXRlcyBhcmUgc3RpbGwgdmFsaWQKKyAgICAqLworICAgIHRhaWwgPSB0YWlsICsgKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgOworCisgICAgUEFUSF9MQVNUX1BPU0lUSU9OKHBfc19wYXRoKSsrOworCisgICAga2V5ID0gKnBfc19pdGVtX2tleTsKKyAgICBzZXRfY3B1X2tleV9rX3R5cGUgKCZrZXksIFRZUEVfRElSRUNUKTsKKyAgICBrZXkua2V5X2xlbmd0aCA9IDQ7CisgICAgLyogSW5zZXJ0IHRhaWwgYXMgbmV3IGRpcmVjdCBpdGVtIGluIHRoZSB0cmVlICovCisgICAgaWYgKCByZWlzZXJmc19pbnNlcnRfaXRlbSh0aCwgcF9zX3BhdGgsICZrZXksICZzX2loLCBwX3NfaW5vZGUsCisJCQkgICAgICB0YWlsID8gdGFpbCA6IE5VTEwpIDwgMCApIHsKKwkvKiBObyBkaXNrIG1lbW9yeS4gU28gd2UgY2FuIG5vdCBjb252ZXJ0IGxhc3QgdW5mb3JtYXR0ZWQgbm9kZQorCSAgIHRvIHRoZSBkaXJlY3QgaXRlbS4gIEluIHRoaXMgY2FzZSB3ZSB1c2VkIHRvIGFkanVzdAorCSAgIGluZGlyZWN0IGl0ZW1zJ3MgaWhfZnJlZV9zcGFjZS4gTm93IGloX2ZyZWVfc3BhY2UgaXMgbm90CisJICAgdXNlZCwgaXQgd291bGQgYmUgaWRlYWwgdG8gd3JpdGUgemVyb3MgdG8gY29ycmVzcG9uZGluZworCSAgIHVuZm9ybWF0dGVkIG5vZGUuIEZvciBub3cgaV9zaXplIGlzIGNvbnNpZGVyZWQgYXMgZ3VhcmQgZm9yCisJICAgZ29pbmcgb3V0IG9mIGZpbGUgc2l6ZSAqLworCWt1bm1hcChwYWdlKSA7CisJcmV0dXJuIG5fYmxvY2tfc2l6ZSAtIHJvdW5kX3RhaWxfbGVuOworICAgIH0KKyAgICBrdW5tYXAocGFnZSkgOworCisgICAgLyogbWFrZSBzdXJlIHRvIGdldCB0aGUgaV9ibG9ja3MgY2hhbmdlcyBmcm9tIHJlaXNlcmZzX2luc2VydF9pdGVtICovCisgICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBwX3NfaW5vZGUpOworCisgICAgLy8gbm90ZTogd2UgaGF2ZSBub3cgdGhlIHNhbWUgYXMgaW4gYWJvdmUgZGlyZWN0MmluZGlyZWN0CisgICAgLy8gY29udmVyc2lvbjogdGhlcmUgYXJlIHR3byBrZXlzIHdoaWNoIGhhdmUgbWF0Y2hpbmcgZmlyc3QgdGhyZWUKKyAgICAvLyBrZXkgY29tcG9uZW50cy4gVGhleSBvbmx5IGRpZmZlciBieSB0aGUgZm91aHRoIG9uZS4KKworICAgIC8qIFdlIGhhdmUgaW5zZXJ0ZWQgbmV3IGRpcmVjdCBpdGVtIGFuZCBtdXN0IHJlbW92ZSBsYXN0CisgICAgICAgdW5mb3JtYXR0ZWQgbm9kZS4gKi8KKyAgICAqcF9jX21vZGUgPSBNX0NVVDsKKworICAgIC8qIHdlIHN0b3JlIHBvc2l0aW9uIG9mIGZpcnN0IGRpcmVjdCBpdGVtIGluIHRoZSBpbi1jb3JlIGlub2RlICovCisgICAgLy9tYXJrX2ZpbGVfd2l0aF90YWlsIChwX3NfaW5vZGUsIHBvczEgKyAxKTsKKyAgICBSRUlTRVJGU19JKHBfc19pbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUgPSBwb3MxICsgMTsKKworICAgIHJldHVybiBuX2Jsb2NrX3NpemUgLSByb3VuZF90YWlsX2xlbjsKK30KKworCisKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3hhdHRyLmMgYi9mcy9yZWlzZXJmcy94YXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NTgyZmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy94YXR0ci5jCkBAIC0wLDAgKzEsMTQ1MCBAQAorLyoKKyAqIGxpbnV4L2ZzL3JlaXNlcmZzL3hhdHRyLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgYnkgSmVmZiBNYWhvbmV5LCA8amVmZm1Ac3VzZS5jb20+CisgKgorICovCisKKy8qCisgKiBJbiBvcmRlciB0byBpbXBsZW1lbnQgRUEvQUNMcyBpbiBhIGNsZWFuLCBiYWNrd2FyZHMgY29tcGF0aWJsZSBtYW5uZXIsCisgKiB0aGV5IGFyZSBpbXBsZW1lbnRlZCBhcyBmaWxlcyBpbiBhICJwcml2YXRlIiBkaXJlY3RvcnkuCisgKiBFYWNoIEVBIGlzIGluIGl0J3Mgb3duIGZpbGUsIHdpdGggdGhlIGRpcmVjdG9yeSBsYXlvdXQgbGlrZSBzbyAoLyBpcyBhc3N1bWVkCisgKiB0byBiZSByZWxhdGl2ZSB0byBmcyByb290KS4gSW5zaWRlIHRoZSAvLnJlaXNlcmZzX3ByaXYveGF0dHJzIGRpcmVjdG9yeSwKKyAqIGRpcmVjdG9yaWVzIG5hbWVkIHVzaW5nIHRoZSBjYXBpdGFsLWhleCBmb3JtIG9mIHRoZSBvYmplY3RpZCBhbmQKKyAqIGdlbmVyYXRpb24gbnVtYmVyIGFyZSB1c2VkLiBJbnNpZGUgZWFjaCBkaXJlY3RvcnkgYXJlIGluZGl2aWR1YWwgZmlsZXMKKyAqIG5hbWVkIHdpdGggdGhlIG5hbWUgb2YgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZS4KKyAqCisgKiBTbywgZm9yIG9iamVjdGlkIDEyNjQ4NDMwLCB3ZSBjb3VsZCBoYXZlOgorICogLy5yZWlzZXJmc19wcml2L3hhdHRycy9DMEZGRUUuMC9zeXN0ZW0ucG9zaXhfYWNsX2FjY2VzcworICogLy5yZWlzZXJmc19wcml2L3hhdHRycy9DMEZGRUUuMC9zeXN0ZW0ucG9zaXhfYWNsX2RlZmF1bHQKKyAqIC8ucmVpc2VyZnNfcHJpdi94YXR0cnMvQzBGRkVFLjAvdXNlci5Db250ZW50LVR5cGUKKyAqIC4uIG9yIHNpbWlsYXIuCisgKgorICogVGhlIGZpbGUgY29udGVudHMgYXJlIHRoZSB0ZXh0IG9mIHRoZSBFQS4gVGhlIHNpemUgaXMga25vd24gYmFzZWQgb24gdGhlCisgKiBzdGF0IGRhdGEgZGVzY3JpYmluZyB0aGUgZmlsZS4KKyAqCisgKiBJbiB0aGUgY2FzZSBvZiBzeXN0ZW0ucG9zaXhfYWNsX2FjY2VzcyBhbmQgc3lzdGVtLnBvc2l4X2FjbF9kZWZhdWx0LCBzaW5jZQorICogdGhlc2UgYXJlIHNwZWNpYWwgY2FzZXMgZm9yIGZpbGVzeXN0ZW0gQUNMcywgdGhleSBhcmUgaW50ZXJwcmV0ZWQgYnkgdGhlCisgKiBrZXJuZWwsIGluIGFkZGl0aW9uLCB0aGV5IGFyZSBuZWdhdGl2ZWx5IGFuZCBwb3NpdGl2ZWx5IGNhY2hlZCBhbmQgYXR0YWNoZWQKKyAqIHRvIHRoZSBpbm9kZSBzbyB0aGF0IHVubmVjZXNzYXJ5IGxvb2t1cHMgYXJlIGF2b2lkZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX3hhdHRyLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfYWNsLmg+CisjaW5jbHVkZSA8bGludXgvbWJjYWNoZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjZGVmaW5lIEZMX1JFQURPTkxZIDEyOAorI2RlZmluZSBGTF9ESVJfU0VNX0hFTEQgMjU2CisjZGVmaW5lIFBSSVZST09UX05BTUUgIi5yZWlzZXJmc19wcml2IgorI2RlZmluZSBYQVJPT1RfTkFNRSAgICJ4YXR0cnMiCisKK3N0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeCAoY29uc3QgY2hhciAqcHJlZml4KTsKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKgorY3JlYXRlX3hhX3Jvb3QgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisgICAgc3RydWN0IGRlbnRyeSAqcHJpdnJvb3QgPSBkZ2V0IChSRUlTRVJGU19TQihzYiktPnByaXZfcm9vdCk7CisgICAgc3RydWN0IGRlbnRyeSAqeGFyb290OworCisgICAgLyogVGhpcyBuZWVkcyB0byBiZSBjcmVhdGVkIGF0IG1vdW50LXRpbWUgKi8KKyAgICBpZiAoIXByaXZyb290KQorICAgICAgICByZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7CisKKyAgICB4YXJvb3QgPSBsb29rdXBfb25lX2xlbiAoWEFST09UX05BTUUsIHByaXZyb290LCBzdHJsZW4gKFhBUk9PVF9OQU1FKSk7CisgICAgaWYgKElTX0VSUiAoeGFyb290KSkgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9IGVsc2UgaWYgKCF4YXJvb3QtPmRfaW5vZGUpIHsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgZG93biAoJnByaXZyb290LT5kX2lub2RlLT5pX3NlbSk7CisgICAgICAgIGVyciA9IHByaXZyb290LT5kX2lub2RlLT5pX29wLT5ta2RpciAocHJpdnJvb3QtPmRfaW5vZGUsIHhhcm9vdCwgMDcwMCk7CisgICAgICAgIHVwICgmcHJpdnJvb3QtPmRfaW5vZGUtPmlfc2VtKTsKKworICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICBkcHV0ICh4YXJvb3QpOworICAgICAgICAgICAgZHB1dCAocHJpdnJvb3QpOworICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIgKGVycik7CisgICAgICAgIH0KKyAgICAgICAgUkVJU0VSRlNfU0Ioc2IpLT54YXR0cl9yb290ID0gZGdldCAoeGFyb290KTsKKyAgICB9CisKK291dDoKKyAgICBkcHV0IChwcml2cm9vdCk7CisgICAgcmV0dXJuIHhhcm9vdDsKK30KKworLyogVGhpcyB3aWxsIHJldHVybiBhIGRlbnRyeSwgb3IgZXJyb3IsIHJlZmVyaW5nIHRvIHRoZSB4YSByb290IGRpcmVjdG9yeS4KKyAqIElmIHRoZSB4YSByb290IGRvZXNuJ3QgZXhpc3QgeWV0LCB0aGUgZGVudHJ5IHdpbGwgYmUgcmV0dXJuZWQgd2l0aG91dAorICogYW4gYXNzb2NpYXRlZCBpbm9kZS4gVGhpcyBkZW50cnkgY2FuIGJlIHVzZWQgd2l0aCAtPm1rZGlyIHRvIGNyZWF0ZQorICogdGhlIHhhIGRpcmVjdG9yeS4gKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKK19fZ2V0X3hhX3Jvb3QgKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKyAgICBzdHJ1Y3QgZGVudHJ5ICpwcml2cm9vdCA9IGRnZXQgKFJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpOworICAgIHN0cnVjdCBkZW50cnkgKnhhcm9vdCA9IE5VTEw7CisKKyAgICBpZiAoSVNfRVJSIChwcml2cm9vdCkgfHwgIXByaXZyb290KQorICAgICAgICByZXR1cm4gcHJpdnJvb3Q7CisKKyAgICB4YXJvb3QgPSBsb29rdXBfb25lX2xlbiAoWEFST09UX05BTUUsIHByaXZyb290LCBzdHJsZW4gKFhBUk9PVF9OQU1FKSk7CisgICAgaWYgKElTX0VSUiAoeGFyb290KSkgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9IGVsc2UgaWYgKCF4YXJvb3QtPmRfaW5vZGUpIHsKKyAgICAgICAgZHB1dCAoeGFyb290KTsKKyAgICAgICAgeGFyb290ID0gTlVMTDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgUkVJU0VSRlNfU0IocyktPnhhdHRyX3Jvb3QgPSBkZ2V0ICh4YXJvb3QpOworCitvdXQ6CisgICAgZHB1dCAocHJpdnJvb3QpOworICAgIHJldHVybiB4YXJvb3Q7Cit9CisKKy8qIFJldHVybnMgdGhlIGRlbnRyeSAob3IgTlVMTCkgcmVmZXJyaW5nIHRvIHRoZSByb290IG9mIHRoZSBleHRlbmRlZAorICogYXR0cmlidXRlIGRpcmVjdG9yeSB0cmVlLiBJZiBpdCBoYXMgYWxyZWFkeSBiZWVuIHJldHJlaXZlZCwgaXQgaXMgdXNlZC4KKyAqIE90aGVyd2lzZSwgd2UgYXR0ZW1wdCB0byByZXRyZWl2ZSBpdCBmcm9tIGRpc2suIEl0IG1heSBhbHNvIHJldHVybgorICogYSBwb2ludGVyLWVuY29kZWQgZXJyb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRlbnRyeSAqCitnZXRfeGFfcm9vdCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGRnZXQgKFJFSVNFUkZTX1NCKHMpLT54YXR0cl9yb290KTsKKworICAgIGlmICghZGVudHJ5KQorICAgICAgICBkZW50cnkgPSBfX2dldF94YV9yb290IChzKTsKKworICAgIHJldHVybiBkZW50cnk7Cit9CisKKy8qIE9wZW5zIHRoZSBkaXJlY3RvcnkgY29ycmVzcG9uZGluZyB0byB0aGUgaW5vZGUncyBleHRlbmRlZCBhdHRyaWJ1dGUgc3RvcmUuCisgKiBJZiBmbGFncyBhbGxvdywgdGhlIHRyZWUgdG8gdGhlIGRpcmVjdG9yeSBtYXkgYmUgY3JlYXRlZC4gSWYgY3JlYXRpb24gaXMKKyAqIHByb2hpYml0ZWQsIC1FTk9EQVRBIGlzIHJldHVybmVkLiAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKgorb3Blbl94YV9kaXIgKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmbGFncykKK3sKKyAgICBzdHJ1Y3QgZGVudHJ5ICp4YXJvb3QsICp4YWRpcjsKKyAgICBjaGFyIG5hbWVidWZbMTddOworCisgICAgeGFyb290ID0gZ2V0X3hhX3Jvb3QgKGlub2RlLT5pX3NiKTsKKyAgICBpZiAoSVNfRVJSICh4YXJvb3QpKSB7CisgICAgICAgIHJldHVybiB4YXJvb3Q7CisgICAgfSBlbHNlIGlmICgheGFyb290KSB7CisgICAgICAgIGlmIChmbGFncyA9PSAwIHx8IGZsYWdzICYgWEFUVFJfQ1JFQVRFKSB7CisgICAgICAgICAgICB4YXJvb3QgPSBjcmVhdGVfeGFfcm9vdCAoaW5vZGUtPmlfc2IpOworICAgICAgICAgICAgaWYgKElTX0VSUiAoeGFyb290KSkKKyAgICAgICAgICAgICAgICByZXR1cm4geGFyb290OworICAgICAgICB9CisgICAgICAgIGlmICgheGFyb290KQorICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIgKC1FTk9EQVRBKTsKKyAgICB9CisKKyAgICAvKiBvaywgd2UgaGF2ZSB4YXJvb3Qgb3BlbiAqLworCisgICAgc25wcmludGYgKG5hbWVidWYsIHNpemVvZiAobmFtZWJ1ZiksICIlWC4lWCIsCisgICAgICAgICAgICAgIGxlMzJfdG9fY3B1IChJTk9ERV9QS0VZIChpbm9kZSktPmtfb2JqZWN0aWQpLAorICAgICAgICAgICAgICBpbm9kZS0+aV9nZW5lcmF0aW9uKTsKKyAgICB4YWRpciA9IGxvb2t1cF9vbmVfbGVuIChuYW1lYnVmLCB4YXJvb3QsIHN0cmxlbiAobmFtZWJ1ZikpOworICAgIGlmIChJU19FUlIgKHhhZGlyKSkgeworICAgICAgICBkcHV0ICh4YXJvb3QpOworICAgICAgICByZXR1cm4geGFkaXI7CisgICAgfQorCisgICAgaWYgKCF4YWRpci0+ZF9pbm9kZSkgeworICAgICAgICBpbnQgZXJyOworICAgICAgICBpZiAoZmxhZ3MgPT0gMCB8fCBmbGFncyAmIFhBVFRSX0NSRUFURSkgeworICAgICAgICAgICAgLyogQWx0aG91Z2ggdGhlcmUgaXMgbm90aGluZyBlbHNlIHRyeWluZyB0byBjcmVhdGUgdGhpcyBkaXJlY3RvcnksCisgICAgICAgICAgICAgKiBhbm90aGVyIGRpcmVjdG9yeSB3aXRoIHRoZSBzYW1lIGhhc2ggbWF5IGJlIGNyZWF0ZWQsIHNvIHdlIG5lZWQKKyAgICAgICAgICAgICAqIHRvIHByb3RlY3QgYWdhaW5zdCB0aGF0ICovCisgICAgICAgICAgICBlcnIgPSB4YXJvb3QtPmRfaW5vZGUtPmlfb3AtPm1rZGlyICh4YXJvb3QtPmRfaW5vZGUsIHhhZGlyLCAwNzAwKTsKKyAgICAgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgICAgICBkcHV0ICh4YXJvb3QpOworICAgICAgICAgICAgICAgIGRwdXQgKHhhZGlyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJSX1BUUiAoZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXhhZGlyLT5kX2lub2RlKSB7CisgICAgICAgICAgICBkcHV0ICh4YXJvb3QpOworICAgICAgICAgICAgZHB1dCAoeGFkaXIpOworICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIgKC1FTk9EQVRBKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRwdXQgKHhhcm9vdCk7CisgICAgcmV0dXJuIHhhZGlyOworfQorCisvKiBSZXR1cm5zIGEgZGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gYSBzcGVjaWZpYyBleHRlbmRlZCBhdHRyaWJ1dGUgZmlsZQorICogZm9yIHRoZSBpbm9kZS4gSWYgZmxhZ3MgYWxsb3csIHRoZSBmaWxlIGlzIGNyZWF0ZWQuIE90aGVyd2lzZSwgYQorICogdmFsaWQgb3IgbmVnYXRpdmUgZGVudHJ5LCBvciBhbiBlcnJvciBpcyByZXR1cm5lZC4gKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKK2dldF94YV9maWxlX2RlbnRyeSAoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKQoreworICAgIHN0cnVjdCBkZW50cnkgKnhhZGlyLCAqeGFmaWxlOworICAgIGludCBlcnIgPSAwOworCisgICAgeGFkaXIgPSBvcGVuX3hhX2RpciAoaW5vZGUsIGZsYWdzKTsKKyAgICBpZiAoSVNfRVJSICh4YWRpcikpIHsKKyAgICAgICAgcmV0dXJuIEVSUl9QVFIgKFBUUl9FUlIgKHhhZGlyKSk7CisgICAgfSBlbHNlIGlmICh4YWRpciAmJiAheGFkaXItPmRfaW5vZGUpIHsKKyAgICAgICAgZHB1dCAoeGFkaXIpOworICAgICAgICByZXR1cm4gRVJSX1BUUiAoLUVOT0RBVEEpOworICAgIH0KKworICAgIHhhZmlsZSA9IGxvb2t1cF9vbmVfbGVuIChuYW1lLCB4YWRpciwgc3RybGVuIChuYW1lKSk7CisgICAgaWYgKElTX0VSUiAoeGFmaWxlKSkgeworICAgICAgICBkcHV0ICh4YWRpcik7CisgICAgICAgIHJldHVybiBFUlJfUFRSIChQVFJfRVJSICh4YWZpbGUpKTsKKyAgICB9CisKKyAgICBpZiAoeGFmaWxlLT5kX2lub2RlKSB7IC8qIGZpbGUgZXhpc3RzICovCisgICAgICAgIGlmIChmbGFncyAmIFhBVFRSX0NSRUFURSkgeworICAgICAgICAgICAgZXJyID0gLUVFWElTVDsKKyAgICAgICAgICAgIGRwdXQgKHhhZmlsZSk7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBYQVRUUl9SRVBMQUNFIHx8IGZsYWdzICYgRkxfUkVBRE9OTFkpIHsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogaW5vZGUtPmlfc2VtIGlzIGRvd24sIHNvIG5vdGhpbmcgZWxzZSBjYW4gdHJ5IHRvIGNyZWF0ZQorICAgICAgICAgKiB0aGUgc2FtZSB4YXR0ciAqLworICAgICAgICBlcnIgPSB4YWRpci0+ZF9pbm9kZS0+aV9vcC0+Y3JlYXRlICh4YWRpci0+ZF9pbm9kZSwgeGFmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwNzAwfFNfSUZSRUcsIE5VTEwpOworCisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgIGRwdXQgKHhhZmlsZSk7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworb3V0OgorICAgIGRwdXQgKHhhZGlyKTsKKyAgICBpZiAoZXJyKQorICAgICAgICB4YWZpbGUgPSBFUlJfUFRSIChlcnIpOworICAgIHJldHVybiB4YWZpbGU7Cit9CisKKworLyogT3BlbnMgYSBmaWxlIHBvaW50ZXIgdG8gdGhlIGF0dHJpYnV0ZSBhc3NvY2lhdGVkIHdpdGggaW5vZGUgKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZSAqCitvcGVuX3hhX2ZpbGUgKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFncykKK3sKKyAgICBzdHJ1Y3QgZGVudHJ5ICp4YWZpbGU7CisgICAgc3RydWN0IGZpbGUgKmZwOworCisgICAgeGFmaWxlID0gZ2V0X3hhX2ZpbGVfZGVudHJ5IChpbm9kZSwgbmFtZSwgZmxhZ3MpOworICAgIGlmIChJU19FUlIgKHhhZmlsZSkpCisgICAgICAgIHJldHVybiBFUlJfUFRSIChQVFJfRVJSICh4YWZpbGUpKTsKKyAgICBlbHNlIGlmICgheGFmaWxlLT5kX2lub2RlKSB7CisgICAgICAgIGRwdXQgKHhhZmlsZSk7CisgICAgICAgIHJldHVybiBFUlJfUFRSICgtRU5PREFUQSk7CisgICAgfQorCisgICAgZnAgPSBkZW50cnlfb3BlbiAoeGFmaWxlLCBOVUxMLCBPX1JEV1IpOworICAgIC8qIGRlbnRyeV9vcGVuIGRwdXRzIHRoZSBkZW50cnkgaWYgaXQgZmFpbHMgKi8KKworICAgIHJldHVybiBmcDsKK30KKworCisvKgorICogdGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gZnMvcmVpc2VyZnMvZGlyLmM6cmVpc2VyZnNfcmVhZGRpciwgYnV0CisgKiB3ZSBuZWVkIHRvIGRyb3AgdGhlIHBhdGggYmVmb3JlIGNhbGxpbmcgdGhlIGZpbGxkaXIgc3RydWN0LiAgVGhhdAorICogd291bGQgYmUgYSBiaWcgcGVyZm9ybWFuY2UgaGl0IHRvIHRoZSBub24teGF0dHIgY2FzZSwgc28gSSd2ZSBjb3BpZWQKKyAqIHRoZSB3aG9sZSB0aGluZyBmb3Igbm93LiAtLWNsbQorICoKKyAqIHRoZSBiaWcgZGlmZmVyZW5jZSBpcyB0aGF0IEkgZ28gYmFja3dhcmRzIHRocm91Z2ggdGhlIGRpcmVjdG9yeSwKKyAqIGFuZCBkb24ndCBtZXNzIHdpdGggZi0+Zl9wb3MsIGJ1dCB0aGUgaWRlYSBpcyB0aGUgc2FtZS4gIERvIHNvbWUKKyAqIGFjdGlvbiBvbiBlYWNoIGFuZCBldmVyeSBlbnRyeSBpbiB0aGUgZGlyZWN0b3J5LgorICoKKyAqIHdlJ3JlIGNhbGxlZCB3aXRoIGlfc2VtIGhlbGQsIHNvIHRoZXJlIGFyZSBubyB3b3JyaWVzIGFib3V0IHRoZSBkaXJlY3RvcnkKKyAqIGNoYW5naW5nIHVuZGVybmVhdGggdXMuCisgKi8KK3N0YXRpYyBpbnQgX194YXR0cl9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworICAgIHN0cnVjdCBjcHVfa2V5IHBvc19rZXk7CS8qIGtleSBvZiBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBkaXJlY3RvcnkgKGtleSBvZiBkaXJlY3RvcnkgZW50cnkpICovCisgICAgSU5JVElBTElaRV9QQVRIIChwYXRoX3RvX2VudHJ5KTsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKyAgICBpbnQgZW50cnlfbnVtOworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgdG1wX2loOworICAgIGludCBzZWFyY2hfcmVzOworICAgIGNoYXIgKiBsb2NhbF9idWY7CisgICAgbG9mZl90IG5leHRfcG9zOworICAgIGNoYXIgc21hbGxfYnVmWzMyXSA7IC8qIGF2b2lkIGttYWxsb2MgaWYgd2UgY2FuICovCisgICAgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaDsKKyAgICBpbnQgZF9yZWNsZW47CisgICAgY2hhciAqIGRfbmFtZTsKKyAgICBvZmZfdCBkX29mZjsKKyAgICBpbm9fdCBkX2lubzsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOworCisKKyAgICAvKiBmb3JtIGtleSBmb3Igc2VhcmNoIHRoZSBuZXh0IGRpcmVjdG9yeSBlbnRyeSB1c2luZyBmX3BvcyBmaWVsZCBvZgorICAgICAgIGZpbGUgc3RydWN0dXJlICovCisgICAgbmV4dF9wb3MgPSBtYXhfcmVpc2VyZnNfb2Zmc2V0KGlub2RlKTsKKworICAgIHdoaWxlICgxKSB7CityZXNlYXJjaDoKKwlpZiAobmV4dF9wb3MgPD0gRE9UX0RPVF9PRkZTRVQpCisJICAgIGJyZWFrOworCW1ha2VfY3B1X2tleSAoJnBvc19rZXksIGlub2RlLCBuZXh0X3BvcywgVFlQRV9ESVJFTlRSWSwgMyk7CisKKwlzZWFyY2hfcmVzID0gc2VhcmNoX2J5X2VudHJ5X2tleShpbm9kZS0+aV9zYiwgJnBvc19rZXksICZwYXRoX3RvX2VudHJ5LCAmZGUpOworCWlmIChzZWFyY2hfcmVzID09IElPX0VSUk9SKSB7CisJICAgIC8vIEZJWE1FOiB3ZSBjb3VsZCBqdXN0IHNraXAgcGFydCBvZiBkaXJlY3Rvcnkgd2hpY2ggY291bGQKKwkgICAgLy8gbm90IGJlIHJlYWQKKwkgICAgcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKKwkgICAgcmV0dXJuIC1FSU87CisJfQorCisJaWYgKHNlYXJjaF9yZXMgPT0gTkFNRV9OT1RfRk9VTkQpCisJICAgIGRlLmRlX2VudHJ5X251bS0tOworCisJc2V0X2RlX25hbWVfYW5kX25hbWVsZW4oJmRlKTsKKwllbnRyeV9udW0gPSBkZS5kZV9lbnRyeV9udW07CisJZGVoID0gJihkZS5kZV9kZWhbZW50cnlfbnVtXSk7CisKKwliaCA9IGRlLmRlX2JoOworCWloID0gZGUuZGVfaWg7CisKKwlpZiAoIWlzX2RpcmVudHJ5X2xlX2loKGloKSkgeworICAgICAgICAgICAgcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwgIm5vdCBkaXJlbnRyeSAlaCIsIGloKTsKKwkgICAgYnJlYWs7CisgICAgICAgIH0KKwljb3B5X2l0ZW1faGVhZCgmdG1wX2loLCBpaCk7CisKKwkvKiB3ZSBtdXN0IGhhdmUgZm91bmQgaXRlbSwgdGhhdCBpcyBpdGVtIG9mIHRoaXMgZGlyZWN0b3J5LCAqLworCVJGQUxTRSggQ09NUF9TSE9SVF9LRVlTICgmKGloLT5paF9rZXkpLCAmcG9zX2tleSksCisJCSJ2cy05MDAwOiBmb3VuZCBpdGVtICVoIGRvZXMgbm90IG1hdGNoIHRvIGRpciB3ZSByZWFkZGlyICVLIiwKKwkJaWgsICZwb3Nfa2V5KTsKKworCWlmIChkZWhfb2Zmc2V0KGRlaCkgPD0gRE9UX0RPVF9PRkZTRVQpIHsKKwkgICAgYnJlYWs7CisJfQorCisJLyogbG9vayBmb3IgdGhlIHByZXZpb3VzIGVudHJ5IGluIHRoZSBkaXJlY3RvcnkgKi8KKwluZXh0X3BvcyA9IGRlaF9vZmZzZXQgKGRlaCkgLSAxOworCisJaWYgKCFkZV92aXNpYmxlIChkZWgpKQorCSAgICAvKiBpdCBpcyBoaWRkZW4gZW50cnkgKi8KKwkgICAgY29udGludWU7CisKKwlkX3JlY2xlbiA9IGVudHJ5X2xlbmd0aChiaCwgaWgsIGVudHJ5X251bSk7CisJZF9uYW1lID0gQl9JX0RFSF9FTlRSWV9GSUxFX05BTUUgKGJoLCBpaCwgZGVoKTsKKwlkX29mZiA9IGRlaF9vZmZzZXQgKGRlaCk7CisJZF9pbm8gPSBkZWhfb2JqZWN0aWQgKGRlaCk7CisKKwlpZiAoIWRfbmFtZVtkX3JlY2xlbiAtIDFdKQorCSAgICBkX3JlY2xlbiA9IHN0cmxlbiAoZF9uYW1lKTsKKworCWlmIChkX3JlY2xlbiA+IFJFSVNFUkZTX01BWF9OQU1FKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpeworCSAgICAvKiB0b28gYmlnIHRvIHNlbmQgYmFjayB0byBWRlMgKi8KKwkgICAgY29udGludWUgOworCX0KKworICAgICAgICAvKiBJZ25vcmUgdGhlIC5yZWlzZXJmc19wcml2IGVudHJ5ICovCisgICAgICAgIGlmIChyZWlzZXJmc194YXR0cnMgKGlub2RlLT5pX3NiKSAmJgorICAgICAgICAgICAgIW9sZF9mb3JtYXRfb25seShpbm9kZS0+aV9zYikgJiYKKyAgICAgICAgICAgIGRlaF9vYmplY3RpZCAoZGVoKSA9PSBsZTMyX3RvX2NwdSAoSU5PREVfUEtFWShSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnByaXZfcm9vdC0+ZF9pbm9kZSktPmtfb2JqZWN0aWQpKQorICAgICAgICAgIGNvbnRpbnVlOworCisJaWYgKGRfcmVjbGVuIDw9IDMyKSB7CisJICBsb2NhbF9idWYgPSBzbWFsbF9idWYgOworCX0gZWxzZSB7CisJICAgIGxvY2FsX2J1ZiA9IHJlaXNlcmZzX2ttYWxsb2MoZF9yZWNsZW4sIEdGUF9OT0ZTLCBpbm9kZS0+aV9zYikgOworCSAgICBpZiAoIWxvY2FsX2J1ZikgeworCQlwYXRocmVsc2UgKCZwYXRoX3RvX2VudHJ5KTsKKwkJcmV0dXJuIC1FTk9NRU0gOworCSAgICB9CisJICAgIGlmIChpdGVtX21vdmVkICgmdG1wX2loLCAmcGF0aF90b19lbnRyeSkpIHsKKwkJcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLCBkX3JlY2xlbiwgaW5vZGUtPmlfc2IpIDsKKworCQkvKiBzaWdoLCBtdXN0IHJldHJ5LiAgRG8gdGhpcyBzYW1lIG9mZnNldCBhZ2FpbiAqLworCQluZXh0X3BvcyA9IGRfb2ZmOworCQlnb3RvIHJlc2VhcmNoOworCSAgICB9CisJfQorCisJLy8gTm90ZSwgdGhhdCB3ZSBjb3B5IG5hbWUgdG8gdXNlciBzcGFjZSB2aWEgdGVtcG9yYXJ5CisJLy8gYnVmZmVyIChsb2NhbF9idWYpIGJlY2F1c2UgZmlsbGRpciB3aWxsIGJsb2NrIGlmCisJLy8gdXNlciBzcGFjZSBidWZmZXIgaXMgc3dhcHBlZCBvdXQuIEF0IHRoYXQgdGltZQorCS8vIGVudHJ5IGNhbiBtb3ZlIHRvIHNvbWV3aGVyZSBlbHNlCisJbWVtY3B5IChsb2NhbF9idWYsIGRfbmFtZSwgZF9yZWNsZW4pOworCisJLyogdGhlIGZpbGxkaXIgZnVuY3Rpb24gbWlnaHQgbmVlZCB0byBzdGFydCB0cmFuc2FjdGlvbnMsCisJICogb3IgZG8gd2hvIGtub3dzIHdoYXQuICBSZWxlYXNlIHRoZSBwYXRoIG5vdyB0aGF0IHdlJ3ZlCisJICogY29waWVkIGFsbCB0aGUgaW1wb3J0YW50IHN0dWZmIG91dCBvZiB0aGUgZGVoCisJICovCisJcGF0aHJlbHNlICgmcGF0aF90b19lbnRyeSk7CisKKwlpZiAoZmlsbGRpciAoZGlyZW50LCBsb2NhbF9idWYsIGRfcmVjbGVuLCBkX29mZiwgZF9pbm8sCisJCSAgICAgRFRfVU5LTk9XTikgPCAwKSB7CisJICAgIGlmIChsb2NhbF9idWYgIT0gc21hbGxfYnVmKSB7CisJCXJlaXNlcmZzX2tmcmVlKGxvY2FsX2J1ZiwgZF9yZWNsZW4sIGlub2RlLT5pX3NiKSA7CisJICAgIH0KKwkgICAgZ290byBlbmQ7CisJfQorCWlmIChsb2NhbF9idWYgIT0gc21hbGxfYnVmKSB7CisJICAgIHJlaXNlcmZzX2tmcmVlKGxvY2FsX2J1ZiwgZF9yZWNsZW4sIGlub2RlLT5pX3NiKSA7CisJfQorICAgIH0gLyogd2hpbGUgKi8KKworZW5kOgorICAgIHBhdGhyZWxzZSAoJnBhdGhfdG9fZW50cnkpOworICAgIHJldHVybiAwOworfQorCisvKgorICogdGhpcyBjb3VsZCBiZSBkb25lIHdpdGggZGVkaWNhdGVkIHJlYWRkaXIgb3BzIGZvciB0aGUgeGF0dHIgZmlsZXMsCisgKiBidXQgSSB3YW50IHRvIGdldCBzb21ldGhpbmcgd29ya2luZyBhc2FwCisgKiB0aGlzIGlzIHN0b2xlbiBmcm9tIHZmc19yZWFkZGlyCisgKgorICovCitzdGF0aWMKK2ludCB4YXR0cl9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBmaWxsZGlyX3QgZmlsbGVyLCB2b2lkICpidWYpCit7CisgICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKyAgICAgICAgaW50IHJlcyA9IC1FTk9URElSOworICAgICAgICBpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPnJlYWRkaXIpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIGRvd24oJmlub2RlLT5pX3NlbSk7CisvLyAgICAgICAgZG93bigmaW5vZGUtPmlfem9tYmllKTsKKyAgICAgICAgcmVzID0gLUVOT0VOVDsKKyAgICAgICAgaWYgKCFJU19ERUFERElSKGlub2RlKSkgeworICAgICAgICAgICAgICAgIGxvY2tfa2VybmVsKCk7CisgICAgICAgICAgICAgICAgcmVzID0gX194YXR0cl9yZWFkZGlyKGZpbGUsIGJ1ZiwgZmlsbGVyKTsKKyAgICAgICAgICAgICAgICB1bmxvY2tfa2VybmVsKCk7CisgICAgICAgIH0KKy8vICAgICAgICB1cCgmaW5vZGUtPmlfem9tYmllKTsKKyAgICAgICAgdXAoJmlub2RlLT5pX3NlbSk7CitvdXQ6CisgICAgICAgIHJldHVybiByZXM7Cit9CisKKworLyogSW50ZXJuYWwgb3BlcmF0aW9ucyBvbiBmaWxlIGRhdGEgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorcmVpc2VyZnNfcHV0X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisgICAgICAgIGt1bm1hcChwYWdlKTsKKyAgICAgICAgcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKgorcmVpc2VyZnNfZ2V0X3BhZ2Uoc3RydWN0IGlub2RlICpkaXIsIHVuc2lnbmVkIGxvbmcgbikKK3sKKyAgICAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBkaXItPmlfbWFwcGluZzsKKyAgICAgICAgc3RydWN0IHBhZ2UgKnBhZ2U7CisgICAgICAgIC8qIFdlIGNhbiBkZWFkbG9jayBpZiB3ZSB0cnkgdG8gZnJlZSBkZW50cmllcywKKyAgICAgICAgICAgYW5kIGFuIHVubGluay9ybWRpciBoYXMganVzdCBvY2N1cmVkIC0gR0ZQX05PRlMgYXZvaWRzIHRoaXMgKi8KKyAgICAgICAgbWFwcGluZy0+ZmxhZ3MgPSAobWFwcGluZy0+ZmxhZ3MgJiB+X19HRlBfQklUU19NQVNLKSB8IEdGUF9OT0ZTOworICAgICAgICBwYWdlID0gcmVhZF9jYWNoZV9wYWdlIChtYXBwaW5nLCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsbGVyX3QqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisgICAgICAgIGlmICghSVNfRVJSKHBhZ2UpKSB7CisgICAgICAgICAgICAgICAgd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKyAgICAgICAgICAgICAgICBrbWFwKHBhZ2UpOworICAgICAgICAgICAgICAgIGlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgICAgICAgICAgaWYgKFBhZ2VFcnJvcihwYWdlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFnZTsKKworZmFpbDoKKyAgICAgICAgcmVpc2VyZnNfcHV0X3BhZ2UocGFnZSk7CisgICAgICAgIHJldHVybiBFUlJfUFRSKC1FSU8pOworfQorCitzdGF0aWMgaW5saW5lIF9fdTMyCit4YXR0cl9oYXNoIChjb25zdCBjaGFyICptc2csIGludCBsZW4pCit7CisgICAgcmV0dXJuIGNzdW1fcGFydGlhbCAobXNnLCBsZW4sIDApOworfQorCisvKiBHZW5lcmljIGV4dGVuZGVkIGF0dHJpYnV0ZSBvcGVyYXRpb25zIHRoYXQgY2FuIGJlIHVzZWQgYnkgeGEgcGx1Z2lucyAqLworCisvKgorICogaW5vZGUtPmlfc2VtOiBkb3duCisgKi8KK2ludAorcmVpc2VyZnNfeGF0dHJfc2V0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJfc2l6ZSwgaW50IGZsYWdzKQoreworICAgIGludCBlcnIgPSAwOworICAgIHN0cnVjdCBmaWxlICpmcDsKKyAgICBzdHJ1Y3QgcGFnZSAqcGFnZTsKKyAgICBjaGFyICpkYXRhOworICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworICAgIHNpemVfdCBmaWxlX3BvcyA9IDA7CisgICAgc2l6ZV90IGJ1ZmZlcl9wb3MgPSAwOworICAgIHN0cnVjdCBpbm9kZSAqeGlub2RlOworICAgIHN0cnVjdCBpYXR0ciBuZXdhdHRyczsKKyAgICBfX3UzMiB4YWhhc2ggPSAwOworCisgICAgaWYgKElTX1JET05MWSAoaW5vZGUpKQorICAgICAgICByZXR1cm4gLUVST0ZTOworCisgICAgaWYgKElTX0lNTVVUQUJMRSAoaW5vZGUpIHx8IElTX0FQUEVORCAoaW5vZGUpKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSkgPT0gU1RBVF9EQVRBX1YxKQorICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisKKyAgICAvKiBFbXB0eSB4YXR0cnMgYXJlIG9rLCB0aGV5J3JlIGp1c3QgZW1wdHkgZmlsZXMsIG5vIGhhc2ggKi8KKyAgICBpZiAoYnVmZmVyICYmIGJ1ZmZlcl9zaXplKQorICAgICAgICB4YWhhc2ggPSB4YXR0cl9oYXNoIChidWZmZXIsIGJ1ZmZlcl9zaXplKTsKKworb3Blbl9maWxlOgorICAgIGZwID0gb3Blbl94YV9maWxlIChpbm9kZSwgbmFtZSwgZmxhZ3MpOworICAgIGlmIChJU19FUlIgKGZwKSkgeworICAgICAgICBlcnIgPSBQVFJfRVJSIChmcCk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHhpbm9kZSA9IGZwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKyAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX2hhc194YXR0cl9kaXI7CisKKyAgICAvKiB3ZSBuZWVkIHRvIGNvcHkgaXQgb2ZmLi4gKi8KKyAgICBpZiAoeGlub2RlLT5pX25saW5rID4gMSkgeworCWZwdXQoZnApOworICAgICAgICBlcnIgPSByZWlzZXJmc194YXR0cl9kZWwgKGlub2RlLCBuYW1lKTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgLyogV2UganVzdCBraWxsZWQgdGhlIG9sZCBvbmUsIHdlJ3JlIG5vdCByZXBsYWNpbmcgYW55bW9yZSAqLworICAgICAgICBpZiAoZmxhZ3MgJiBYQVRUUl9SRVBMQUNFKQorICAgICAgICAgICAgZmxhZ3MgJj0gflhBVFRSX1JFUExBQ0U7CisgICAgICAgIGdvdG8gb3Blbl9maWxlOworICAgIH0KKworICAgIC8qIFJlc2l6ZSBpdCBzbyB3ZSdyZSBvayB0byB3cml0ZSB0aGVyZSAqLworICAgIG5ld2F0dHJzLmlhX3NpemUgPSBidWZmZXJfc2l6ZTsKKyAgICBuZXdhdHRycy5pYV92YWxpZCA9IEFUVFJfU0laRSB8IEFUVFJfQ1RJTUU7CisgICAgZG93biAoJnhpbm9kZS0+aV9zZW0pOworICAgIGVyciA9IG5vdGlmeV9jaGFuZ2UoZnAtPmZfZGVudHJ5LCAmbmV3YXR0cnMpOworICAgIGlmIChlcnIpCisgICAgICAgIGdvdG8gb3V0X2ZpbHA7CisKKyAgICBtYXBwaW5nID0geGlub2RlLT5pX21hcHBpbmc7CisgICAgd2hpbGUgKGJ1ZmZlcl9wb3MgPCBidWZmZXJfc2l6ZSB8fCBidWZmZXJfcG9zID09IDApIHsKKyAgICAgICAgc2l6ZV90IGNodW5rOworICAgICAgICBzaXplX3Qgc2tpcCA9IDA7CisgICAgICAgIHNpemVfdCBwYWdlX29mZnNldCA9IChmaWxlX3BvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7CisgICAgICAgIGlmIChidWZmZXJfc2l6ZSAtIGJ1ZmZlcl9wb3MgPiBQQUdFX0NBQ0hFX1NJWkUpCisgICAgICAgICAgICBjaHVuayA9IFBBR0VfQ0FDSEVfU0laRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY2h1bmsgPSBidWZmZXJfc2l6ZSAtIGJ1ZmZlcl9wb3M7CisKKyAgICAgICAgcGFnZSA9IHJlaXNlcmZzX2dldF9wYWdlICh4aW5vZGUsIGZpbGVfcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworICAgICAgICBpZiAoSVNfRVJSIChwYWdlKSkgeworICAgICAgICAgICAgZXJyID0gUFRSX0VSUiAocGFnZSk7CisgICAgICAgICAgICBnb3RvIG91dF9maWxwOworICAgICAgICB9CisKKyAgICAgICAgbG9ja19wYWdlIChwYWdlKTsKKyAgICAgICAgZGF0YSA9IHBhZ2VfYWRkcmVzcyAocGFnZSk7CisKKyAgICAgICAgaWYgKGZpbGVfcG9zID09IDApIHsKKyAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIgKnJ4aDsKKyAgICAgICAgICAgIHNraXAgPSBmaWxlX3BvcyA9IHNpemVvZiAoc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hlYWRlcik7CisgICAgICAgICAgICBpZiAoY2h1bmsgKyBza2lwID4gUEFHRV9DQUNIRV9TSVpFKQorICAgICAgICAgICAgICAgIGNodW5rID0gUEFHRV9DQUNIRV9TSVpFIC0gc2tpcDsKKyAgICAgICAgICAgIHJ4aCA9IChzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyICopZGF0YTsKKyAgICAgICAgICAgIHJ4aC0+aF9tYWdpYyA9IGNwdV90b19sZTMyIChSRUlTRVJGU19YQVRUUl9NQUdJQyk7CisgICAgICAgICAgICByeGgtPmhfaGFzaCA9IGNwdV90b19sZTMyICh4YWhhc2gpOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gbWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUgKGZwLCBwYWdlLCBwYWdlX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2Vfb2Zmc2V0ICsgY2h1bmsgKyBza2lwKTsKKyAgICAgICAgaWYgKCFlcnIpIHsKKwkgICAgaWYgKGJ1ZmZlcikKKwkJbWVtY3B5IChkYXRhICsgc2tpcCwgYnVmZmVyICsgYnVmZmVyX3BvcywgY2h1bmspOworICAgICAgICAgICAgZXJyID0gbWFwcGluZy0+YV9vcHMtPmNvbW1pdF93cml0ZSAoZnAsIHBhZ2UsIHBhZ2Vfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZV9vZmZzZXQgKyBjaHVuayArIHNraXApOworCX0KKyAgICAgICAgdW5sb2NrX3BhZ2UgKHBhZ2UpOworICAgICAgICByZWlzZXJmc19wdXRfcGFnZSAocGFnZSk7CisgICAgICAgIGJ1ZmZlcl9wb3MgKz0gY2h1bms7CisgICAgICAgIGZpbGVfcG9zICs9IGNodW5rOworICAgICAgICBza2lwID0gMDsKKyAgICAgICAgaWYgKGVyciB8fCBidWZmZXJfc2l6ZSA9PSAwIHx8ICFidWZmZXIpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBXZSBjYW4ndCBtYXJrIHRoZSBpbm9kZSBkaXJ0eSBpZiBpdCdzIG5vdCBoYXNoZWQuIFRoaXMgaXMgdGhlIGNhc2UKKyAgICAgKiB3aGVuIHdlJ3JlIGluaGVyaXRpbmcgdGhlIGRlZmF1bHQgQUNMLiBJZiB3ZSBkaXJ0eSBpdCwgdGhlIGlub2RlCisgICAgICogZ2V0cyBtYXJrZWQgZGlydHksIGJ1dCB3b24ndCAoZXZlcikgbWFrZSBpdCBvbnRvIHRoZSBkaXJ0eSBsaXN0IHVudGlsCisgICAgICogaXQncyBzeW5jZWQgZXhwbGljaXRseSB0byBjbGVhciBJX0RJUlRZLiBUaGlzIGlzIGJhZC4gKi8KKyAgICBpZiAoIWhsaXN0X3VuaGFzaGVkKCZpbm9kZS0+aV9oYXNoKSkgeworICAgICAgICBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisgICAgICAgIG1hcmtfaW5vZGVfZGlydHkgKGlub2RlKTsKKyAgICB9CisKK291dF9maWxwOgorICAgIHVwICgmeGlub2RlLT5pX3NlbSk7CisgICAgZnB1dChmcCk7CisKK291dDoKKyAgICByZXR1cm4gZXJyOworfQorCisvKgorICogaW5vZGUtPmlfc2VtOiBkb3duCisgKi8KK2ludAorcmVpc2VyZnNfeGF0dHJfZ2V0IChjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJfc2l6ZSkKK3sKKyAgICBzc2l6ZV90IGVyciA9IDA7CisgICAgc3RydWN0IGZpbGUgKmZwOworICAgIHNpemVfdCBpc2l6ZTsKKyAgICBzaXplX3QgZmlsZV9wb3MgPSAwOworICAgIHNpemVfdCBidWZmZXJfcG9zID0gMDsKKyAgICBzdHJ1Y3QgcGFnZSAqcGFnZTsKKyAgICBzdHJ1Y3QgaW5vZGUgKnhpbm9kZTsKKyAgICBfX3UzMiBoYXNoID0gMDsKKworICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgLyogV2UgY2FuJ3QgaGF2ZSB4YXR0cnMgYXR0YWNoZWQgdG8gdjEgaXRlbXMgc2luY2UgdGhleSBkb24ndCBoYXZlCisgICAgICogZ2VuZXJhdGlvbiBudW1iZXJzICovCisgICAgaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSkgPT0gU1RBVF9EQVRBX1YxKQorICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisKKyAgICBmcCA9IG9wZW5feGFfZmlsZSAoaW5vZGUsIG5hbWUsIEZMX1JFQURPTkxZKTsKKyAgICBpZiAoSVNfRVJSIChmcCkpIHsKKyAgICAgICAgZXJyID0gUFRSX0VSUiAoZnApOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICB4aW5vZGUgPSBmcC0+Zl9kZW50cnktPmRfaW5vZGU7CisgICAgaXNpemUgPSB4aW5vZGUtPmlfc2l6ZTsKKyAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX2hhc194YXR0cl9kaXI7CisKKyAgICAvKiBKdXN0IHJldHVybiB0aGUgc2l6ZSBuZWVkZWQgKi8KKyAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgZXJyID0gaXNpemUgLSBzaXplb2YgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpOworICAgICAgICBnb3RvIG91dF9kcHV0OworICAgIH0KKworICAgIGlmIChidWZmZXJfc2l6ZSA8IGlzaXplIC0gc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKSkgeworICAgICAgICBlcnIgPSAtRVJBTkdFOworICAgICAgICBnb3RvIG91dF9kcHV0OworICAgIH0KKworICAgIHdoaWxlIChmaWxlX3BvcyA8IGlzaXplKSB7CisgICAgICAgIHNpemVfdCBjaHVuazsKKyAgICAgICAgY2hhciAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNraXAgPSAwOworICAgICAgICBpZiAoaXNpemUgLSBmaWxlX3BvcyA+IFBBR0VfQ0FDSEVfU0laRSkKKyAgICAgICAgICAgIGNodW5rID0gUEFHRV9DQUNIRV9TSVpFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjaHVuayA9IGlzaXplIC0gZmlsZV9wb3M7CisKKyAgICAgICAgcGFnZSA9IHJlaXNlcmZzX2dldF9wYWdlICh4aW5vZGUsIGZpbGVfcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworICAgICAgICBpZiAoSVNfRVJSIChwYWdlKSkgeworICAgICAgICAgICAgZXJyID0gUFRSX0VSUiAocGFnZSk7CisgICAgICAgICAgICBnb3RvIG91dF9kcHV0OworICAgICAgICB9CisKKyAgICAgICAgbG9ja19wYWdlIChwYWdlKTsKKyAgICAgICAgZGF0YSA9IHBhZ2VfYWRkcmVzcyAocGFnZSk7CisgICAgICAgIGlmIChmaWxlX3BvcyA9PSAwKSB7CisgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyICpyeGggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyICopZGF0YTsKKyAgICAgICAgICAgIHNraXAgPSBmaWxlX3BvcyA9IHNpemVvZiAoc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hlYWRlcik7CisgICAgICAgICAgICBjaHVuayAtPSBza2lwOworICAgICAgICAgICAgLyogTWFnaWMgZG9lc24ndCBtYXRjaCB1cC4uICovCisgICAgICAgICAgICBpZiAocnhoLT5oX21hZ2ljICE9IGNwdV90b19sZTMyIChSRUlTRVJGU19YQVRUUl9NQUdJQykpIHsKKyAgICAgICAgICAgICAgICB1bmxvY2tfcGFnZSAocGFnZSk7CisgICAgICAgICAgICAgICAgcmVpc2VyZnNfcHV0X3BhZ2UgKHBhZ2UpOworICAgICAgICAgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiSW52YWxpZCBtYWdpYyBmb3IgeGF0dHIgKCVzKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFzc29jaWF0ZWQgd2l0aCAlayIsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5PREVfUEtFWSAoaW5vZGUpKTsKKyAgICAgICAgICAgICAgICBlcnIgPSAtRUlPOworICAgICAgICAgICAgICAgIGdvdG8gb3V0X2RwdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYXNoID0gbGUzMl90b19jcHUgKHJ4aC0+aF9oYXNoKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkgKGJ1ZmZlciArIGJ1ZmZlcl9wb3MsIGRhdGEgKyBza2lwLCBjaHVuayk7CisgICAgICAgIHVubG9ja19wYWdlIChwYWdlKTsKKyAgICAgICAgcmVpc2VyZnNfcHV0X3BhZ2UgKHBhZ2UpOworICAgICAgICBmaWxlX3BvcyArPSBjaHVuazsKKyAgICAgICAgYnVmZmVyX3BvcyArPSBjaHVuazsKKyAgICAgICAgc2tpcCA9IDA7CisgICAgfQorICAgIGVyciA9IGlzaXplIC0gc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKTsKKworICAgIGlmICh4YXR0cl9oYXNoIChidWZmZXIsIGlzaXplIC0gc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKSkgIT0gaGFzaCkgeworICAgICAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgIkludmFsaWQgaGFzaCBmb3IgeGF0dHIgKCVzKSBhc3NvY2lhdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggJWsiLCBuYW1lLCBJTk9ERV9QS0VZIChpbm9kZSkpOworICAgICAgICBlcnIgPSAtRUlPOworICAgIH0KKworb3V0X2RwdXQ6CisgICAgZnB1dChmcCk7CisKK291dDoKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CitfX3JlaXNlcmZzX3hhdHRyX2RlbCAoc3RydWN0IGRlbnRyeSAqeGFkaXIsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQoreworICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKyAgICBzdHJ1Y3QgaW5vZGUgKmRpciA9IHhhZGlyLT5kX2lub2RlOworICAgIGludCBlcnIgPSAwOworCisgICAgZGVudHJ5ID0gbG9va3VwX29uZV9sZW4gKG5hbWUsIHhhZGlyLCBuYW1lbGVuKTsKKyAgICBpZiAoSVNfRVJSIChkZW50cnkpKSB7CisgICAgICAgIGVyciA9IFBUUl9FUlIgKGRlbnRyeSk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0gZWxzZSBpZiAoIWRlbnRyeS0+ZF9pbm9kZSkgeworICAgICAgICBlcnIgPSAtRU5PREFUQTsKKyAgICAgICAgZ290byBvdXRfZmlsZTsKKyAgICB9CisKKyAgICAvKiBTa2lwIGRpcmVjdG9yaWVzLi4gKi8KKyAgICBpZiAoU19JU0RJUiAoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQorICAgICAgICBnb3RvIG91dF9maWxlOworCisgICAgaWYgKCFpc19yZWlzZXJmc19wcml2X29iamVjdCAoZGVudHJ5LT5kX2lub2RlKSkgeworICAgICAgICByZWlzZXJmc193YXJuaW5nIChkaXItPmlfc2IsICJPSUQgJTA4eCBbJS4qcy8lLipzXSBkb2Vzbid0IGhhdmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcml2IGZsYWcgc2V0IFtwYXJlbnQgaXMgJXNzZXRdLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBsZTMyX3RvX2NwdSAoSU5PREVfUEtFWSAoZGVudHJ5LT5kX2lub2RlKS0+a19vYmplY3RpZCksCisgICAgICAgICAgICAgICAgICAgICAgICB4YWRpci0+ZF9uYW1lLmxlbiwgeGFkaXItPmRfbmFtZS5uYW1lLCBuYW1lbGVuLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QgKHhhZGlyLT5kX2lub2RlKSA/ICIiIDogIm5vdCAiKTsKKyAgICAgICAgZHB1dCAoZGVudHJ5KTsKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorCisgICAgZXJyID0gZGlyLT5pX29wLT51bmxpbmsgKGRpciwgZGVudHJ5KTsKKyAgICBpZiAoIWVycikKKyAgICAgICAgZF9kZWxldGUgKGRlbnRyeSk7CisKK291dF9maWxlOgorICAgIGRwdXQgKGRlbnRyeSk7CisKK291dDoKKyAgICByZXR1cm4gZXJyOworfQorCisKK2ludAorcmVpc2VyZnNfeGF0dHJfZGVsIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIHN0cnVjdCBkZW50cnkgKmRpcjsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKElTX1JET05MWSAoaW5vZGUpKQorICAgICAgICByZXR1cm4gLUVST0ZTOworCisgICAgZGlyID0gb3Blbl94YV9kaXIgKGlub2RlLCBGTF9SRUFET05MWSk7CisgICAgaWYgKElTX0VSUiAoZGlyKSkgeworICAgICAgICBlcnIgPSBQVFJfRVJSIChkaXIpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBlcnIgPSBfX3JlaXNlcmZzX3hhdHRyX2RlbCAoZGlyLCBuYW1lLCBzdHJsZW4gKG5hbWUpKTsKKyAgICBkcHV0IChkaXIpOworCisgICAgaWYgKCFlcnIpIHsKKyAgICAgICAgaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworICAgICAgICBtYXJrX2lub2RlX2RpcnR5IChpbm9kZSk7CisgICAgfQorCitvdXQ6CisgICAgcmV0dXJuIGVycjsKK30KKworLyogVGhlIGZvbGxvd2luZyBhcmUgc2lkZSBlZmZlY3RzIG9mIG90aGVyIG9wZXJhdGlvbnMgdGhhdCBhcmVuJ3QgZXhwbGljaXRseQorICogbW9kaWZ5aW5nIGV4dGVuZGVkIGF0dHJpYnV0ZXMuIFRoaXMgaW5jbHVkZXMgb3BlcmF0aW9ucyBzdWNoIGFzIHBlcm1pc3Npb25zCisgKiBvciBvd25lcnNoaXAgY2hhbmdlcywgb2JqZWN0IGRlbGV0aW9ucywgZXRjLiAqLworCitzdGF0aWMgaW50CityZWlzZXJmc19kZWxldGVfeGF0dHJzX2ZpbGxlciAodm9pZCAqYnVmLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2ZmX3Qgb2Zmc2V0LCBpbm9fdCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCit7CisgICAgc3RydWN0IGRlbnRyeSAqeGFkaXIgPSAoc3RydWN0IGRlbnRyeSAqKWJ1ZjsKKworICAgIHJldHVybiBfX3JlaXNlcmZzX3hhdHRyX2RlbCAoeGFkaXIsIG5hbWUsIG5hbWVsZW4pOworCit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIHcvIGlub2RlLT5pX3NlbSBkb3duZWQgKi8KK2ludAorcmVpc2VyZnNfZGVsZXRlX3hhdHRycyAoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKyAgICBzdHJ1Y3QgZmlsZSAqZnA7CisgICAgc3RydWN0IGRlbnRyeSAqZGlyLCAqcm9vdDsKKyAgICBpbnQgZXJyID0gMDsKKworICAgIC8qIFNraXAgb3V0LCBhbiB4YXR0ciBoYXMgbm8geGF0dHJzIGFzc29jaWF0ZWQgd2l0aCBpdCAqLworICAgIGlmIChpc19yZWlzZXJmc19wcml2X29iamVjdCAoaW5vZGUpIHx8CisgICAgICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSkgPT0gU1RBVF9EQVRBX1YxIHx8CisgICAgICAgICFyZWlzZXJmc194YXR0cnMoaW5vZGUtPmlfc2IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKKyAgICBkaXIgPSBvcGVuX3hhX2RpciAoaW5vZGUsIEZMX1JFQURPTkxZKTsKKyAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKKyAgICBpZiAoSVNfRVJSIChkaXIpKSB7CisgICAgICAgIGVyciA9IFBUUl9FUlIgKGRpcik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0gZWxzZSBpZiAoIWRpci0+ZF9pbm9kZSkgeworICAgICAgICBkcHV0IChkaXIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmcCA9IGRlbnRyeV9vcGVuIChkaXIsIE5VTEwsIE9fUkRXUik7CisgICAgaWYgKElTX0VSUiAoZnApKSB7CisgICAgICAgIGVyciA9IFBUUl9FUlIgKGZwKTsKKyAgICAgICAgLyogZGVudHJ5X29wZW4gZHB1dHMgdGhlIGRlbnRyeSBpZiBpdCBmYWlscyAqLworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBsb2NrX2tlcm5lbCAoKTsKKyAgICBlcnIgPSB4YXR0cl9yZWFkZGlyIChmcCwgcmVpc2VyZnNfZGVsZXRlX3hhdHRyc19maWxsZXIsIGRpcik7CisgICAgaWYgKGVycikgeworICAgICAgICB1bmxvY2tfa2VybmVsICgpOworICAgICAgICBnb3RvIG91dF9kaXI7CisgICAgfQorCisgICAgLyogTGVmdG92ZXJzIGJlc2lkZXMgLiBhbmQgLi4gLS0gdGhhdCdzIG5vdCBnb29kLiAqLworICAgIGlmIChkaXItPmRfaW5vZGUtPmlfbmxpbmsgPD0gMikgeworICAgICAgICByb290ID0gZ2V0X3hhX3Jvb3QgKGlub2RlLT5pX3NiKTsKKyAgICAgICAgcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKKyAgICAgICAgZXJyID0gdmZzX3JtZGlyIChyb290LT5kX2lub2RlLCBkaXIpOworICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7CisgICAgICAgIGRwdXQgKHJvb3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgcmVtb3ZlIGFsbCBlbnRyaWVzIGluIGRpcmVjdG9yeSIpOworICAgIH0KKyAgICB1bmxvY2tfa2VybmVsICgpOworCitvdXRfZGlyOgorICAgIGZwdXQoZnApOworCitvdXQ6CisgICAgaWYgKCFlcnIpCisgICAgICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzID0gUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiB+aV9oYXNfeGF0dHJfZGlyOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0cnVjdCByZWlzZXJmc19jaG93bl9idWYgeworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGU7CisgICAgc3RydWN0IGRlbnRyeSAqeGFkaXI7CisgICAgc3RydWN0IGlhdHRyICphdHRyczsKK307CisKKy8qIFhYWDogSWYgdGhlcmUgaXMgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMsIEknZCBsb3ZlIHRvIGhlYXIgYWJvdXQgaXQgKi8KK3N0YXRpYyBpbnQKK3JlaXNlcmZzX2Nob3duX3hhdHRyc19maWxsZXIgKHZvaWQgKmJ1ZiwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90IG9mZnNldCwgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQoreworICAgIHN0cnVjdCByZWlzZXJmc19jaG93bl9idWYgKmNob3duX2J1ZiA9IChzdHJ1Y3QgcmVpc2VyZnNfY2hvd25fYnVmICopYnVmOworICAgIHN0cnVjdCBkZW50cnkgKnhhZmlsZSwgKnhhZGlyID0gY2hvd25fYnVmLT54YWRpcjsKKyAgICBzdHJ1Y3QgaWF0dHIgKmF0dHJzID0gY2hvd25fYnVmLT5hdHRyczsKKyAgICBpbnQgZXJyID0gMDsKKworICAgIHhhZmlsZSA9IGxvb2t1cF9vbmVfbGVuIChuYW1lLCB4YWRpciwgbmFtZWxlbik7CisgICAgaWYgKElTX0VSUiAoeGFmaWxlKSkKKyAgICAgICAgcmV0dXJuIFBUUl9FUlIgKHhhZmlsZSk7CisgICAgZWxzZSBpZiAoIXhhZmlsZS0+ZF9pbm9kZSkgeworICAgICAgICBkcHV0ICh4YWZpbGUpOworICAgICAgICByZXR1cm4gLUVOT0RBVEE7CisgICAgfQorCisgICAgaWYgKCFTX0lTRElSICh4YWZpbGUtPmRfaW5vZGUtPmlfbW9kZSkpCisgICAgICAgIGVyciA9IG5vdGlmeV9jaGFuZ2UgKHhhZmlsZSwgYXR0cnMpOworICAgIGRwdXQgKHhhZmlsZSk7CisKKyAgICByZXR1cm4gZXJyOworfQorCitpbnQKK3JlaXNlcmZzX2Nob3duX3hhdHRycyAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICphdHRycykKK3sKKyAgICBzdHJ1Y3QgZmlsZSAqZnA7CisgICAgc3RydWN0IGRlbnRyeSAqZGlyOworICAgIGludCBlcnIgPSAwOworICAgIHN0cnVjdCByZWlzZXJmc19jaG93bl9idWYgYnVmOworICAgIHVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHJzLT5pYV92YWxpZDsKKworICAgIC8qIFNraXAgb3V0LCBhbiB4YXR0ciBoYXMgbm8geGF0dHJzIGFzc29jaWF0ZWQgd2l0aCBpdCAqLworICAgIGlmIChpc19yZWlzZXJmc19wcml2X29iamVjdCAoaW5vZGUpIHx8CisgICAgICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSkgPT0gU1RBVF9EQVRBX1YxIHx8CisgICAgICAgICFyZWlzZXJmc194YXR0cnMoaW5vZGUtPmlfc2IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKKyAgICBkaXIgPSBvcGVuX3hhX2RpciAoaW5vZGUsIEZMX1JFQURPTkxZKTsKKyAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKKyAgICBpZiAoSVNfRVJSIChkaXIpKSB7CisgICAgICAgIGlmIChQVFJfRVJSIChkaXIpICE9IC1FTk9EQVRBKQorICAgICAgICAgICAgZXJyID0gUFRSX0VSUiAoZGlyKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfSBlbHNlIGlmICghZGlyLT5kX2lub2RlKSB7CisgICAgICAgIGRwdXQgKGRpcik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGZwID0gZGVudHJ5X29wZW4gKGRpciwgTlVMTCwgT19SRFdSKTsKKyAgICBpZiAoSVNfRVJSIChmcCkpIHsKKyAgICAgICAgZXJyID0gUFRSX0VSUiAoZnApOworICAgICAgICAvKiBkZW50cnlfb3BlbiBkcHV0cyB0aGUgZGVudHJ5IGlmIGl0IGZhaWxzICovCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGxvY2tfa2VybmVsICgpOworCisgICAgYXR0cnMtPmlhX3ZhbGlkICY9IChBVFRSX1VJRCB8IEFUVFJfR0lEIHwgQVRUUl9DVElNRSk7CisgICAgYnVmLnhhZGlyID0gZGlyOworICAgIGJ1Zi5hdHRycyA9IGF0dHJzOworICAgIGJ1Zi5pbm9kZSA9IGlub2RlOworCisgICAgZXJyID0geGF0dHJfcmVhZGRpciAoZnAsIHJlaXNlcmZzX2Nob3duX3hhdHRyc19maWxsZXIsICZidWYpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgdW5sb2NrX2tlcm5lbCAoKTsKKyAgICAgICAgZ290byBvdXRfZGlyOworICAgIH0KKworICAgIGVyciA9IG5vdGlmeV9jaGFuZ2UgKGRpciwgYXR0cnMpOworICAgIHVubG9ja19rZXJuZWwgKCk7CisKK291dF9kaXI6CisgICAgZnB1dChmcCk7CisKK291dDoKKyAgICBhdHRycy0+aWFfdmFsaWQgPSBpYV92YWxpZDsKKyAgICByZXR1cm4gZXJyOworfQorCisKKy8qIEFjdHVhbCBvcGVyYXRpb25zIHRoYXQgYXJlIGV4cG9ydGVkIHRvIFZGUy1sYW5kICovCisKKy8qCisgKiBJbm9kZSBvcGVyYXRpb24gZ2V0eGF0dHIoKQorICogUHJlbGltaW5hcnkgbG9ja2luZzogd2UgZG93biBkZW50cnktPmRfaW5vZGUtPmlfc2VtCisgKi8KK3NzaXplX3QKK3JlaXNlcmZzX2dldHhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqeGFoID0gZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeCAobmFtZSk7CisgICAgaW50IGVycjsKKworICAgIGlmICgheGFoIHx8ICFyZWlzZXJmc194YXR0cnMoZGVudHJ5LT5kX3NiKSB8fAorICAgICAgICBnZXRfaW5vZGVfc2RfdmVyc2lvbiAoZGVudHJ5LT5kX2lub2RlKSA9PSBTVEFUX0RBVEFfVjEpCisgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKworICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cl9pIChkZW50cnktPmRfaW5vZGUpOworICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMgKGRlbnRyeS0+ZF9zYik7CisgICAgZXJyID0geGFoLT5nZXQgKGRlbnRyeS0+ZF9pbm9kZSwgbmFtZSwgYnVmZmVyLCBzaXplKTsKKyAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGRlbnRyeS0+ZF9zYik7CisgICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJfaSAoZGVudHJ5LT5kX2lub2RlKTsKKyAgICByZXR1cm4gZXJyOworfQorCisKKy8qCisgKiBJbm9kZSBvcGVyYXRpb24gc2V0eGF0dHIoKQorICoKKyAqIGRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0gZG93bgorICovCitpbnQKK3JlaXNlcmZzX3NldHhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaCA9IGZpbmRfeGF0dHJfaGFuZGxlcl9wcmVmaXggKG5hbWUpOworICAgIGludCBlcnI7CisgICAgaW50IGxvY2s7CisKKyAgICBpZiAoIXhhaCB8fCAhcmVpc2VyZnNfeGF0dHJzKGRlbnRyeS0+ZF9zYikgfHwKKyAgICAgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGRlbnRyeS0+ZF9pbm9kZSkgPT0gU1RBVF9EQVRBX1YxKQorICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisKKyAgICBpZiAoSVNfUkRPTkxZIChkZW50cnktPmRfaW5vZGUpKQorICAgICAgICByZXR1cm4gLUVST0ZTOworCisgICAgaWYgKElTX0lNTVVUQUJMRSAoZGVudHJ5LT5kX2lub2RlKSB8fCBJU19BUFBFTkQgKGRlbnRyeS0+ZF9pbm9kZSkpCisgICAgICAgIHJldHVybiAtRVJPRlM7CisKKyAgICByZWlzZXJmc193cml0ZV9sb2NrX3hhdHRyX2kgKGRlbnRyeS0+ZF9pbm9kZSk7CisgICAgbG9jayA9ICFoYXNfeGF0dHJfZGlyIChkZW50cnktPmRfaW5vZGUpOworICAgIGlmIChsb2NrKQorICAgICAgICByZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyAoZGVudHJ5LT5kX3NiKTsKKyAgICBlbHNlCisgICAgICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMgKGRlbnRyeS0+ZF9zYik7CisgICAgZXJyID0geGFoLT5zZXQgKGRlbnRyeS0+ZF9pbm9kZSwgbmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKKyAgICBpZiAobG9jaykKKyAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyAoZGVudHJ5LT5kX3NiKTsKKyAgICBlbHNlCisgICAgICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyAoZGVudHJ5LT5kX3NiKTsKKyAgICByZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJfaSAoZGVudHJ5LT5kX2lub2RlKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKgorICogSW5vZGUgb3BlcmF0aW9uIHJlbW92ZXhhdHRyKCkKKyAqCisgKiBkZW50cnktPmRfaW5vZGUtPmlfc2VtIGRvd24KKyAqLworaW50CityZWlzZXJmc19yZW1vdmV4YXR0ciAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGludCBlcnI7CisgICAgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaCA9IGZpbmRfeGF0dHJfaGFuZGxlcl9wcmVmaXggKG5hbWUpOworCisgICAgaWYgKCF4YWggfHwgIXJlaXNlcmZzX3hhdHRycyhkZW50cnktPmRfc2IpIHx8CisgICAgICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uIChkZW50cnktPmRfaW5vZGUpID09IFNUQVRfREFUQV9WMSkKKyAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCisgICAgaWYgKElTX1JET05MWSAoZGVudHJ5LT5kX2lub2RlKSkKKyAgICAgICAgcmV0dXJuIC1FUk9GUzsKKworICAgIGlmIChJU19JTU1VVEFCTEUgKGRlbnRyeS0+ZF9pbm9kZSkgfHwgSVNfQVBQRU5EIChkZW50cnktPmRfaW5vZGUpKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cl9pIChkZW50cnktPmRfaW5vZGUpOworICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMgKGRlbnRyeS0+ZF9zYik7CisKKyAgICAvKiBEZWxldGlvbiBwcmUtb3BlcmF0aW9uICovCisgICAgaWYgKHhhaC0+ZGVsKSB7CisgICAgICAgIGVyciA9IHhhaC0+ZGVsIChkZW50cnktPmRfaW5vZGUsIG5hbWUpOworICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgZXJyID0gcmVpc2VyZnNfeGF0dHJfZGVsIChkZW50cnktPmRfaW5vZGUsIG5hbWUpOworCisgICAgZGVudHJ5LT5kX2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKyAgICBtYXJrX2lub2RlX2RpcnR5IChkZW50cnktPmRfaW5vZGUpOworCitvdXQ6CisgICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzIChkZW50cnktPmRfc2IpOworICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cl9pIChkZW50cnktPmRfaW5vZGUpOworICAgIHJldHVybiBlcnI7Cit9CisKKworLyogVGhpcyBpcyB3aGF0IGZpbGxkaXIgd2lsbCB1c2U6CisgKiByX3BvcyB3aWxsIGFsd2F5cyBjb250YWluIHRoZSBhbW91bnQgb2Ygc3BhY2UgcmVxdWlyZWQgZm9yIHRoZSBlbnRpcmUKKyAqIGxpc3QuIElmIHJfcG9zIGJlY29tZXMgbGFyZ2VyIHRoYW4gcl9zaXplLCB3ZSBuZWVkIG1vcmUgc3BhY2UgYW5kIHdlCisgKiByZXR1cm4gYW4gZXJyb3IgaW5kaWNhdGluZyB0aGlzLiBJZiByX3BvcyBpcyBsZXNzIHRoYW4gcl9zaXplLCB0aGVuIHdlJ3ZlCisgKiBmaWxsZWQgdGhlIGJ1ZmZlciBzdWNjZXNzZnVsbHkgYW5kIHdlIHJldHVybiBzdWNjZXNzICovCitzdHJ1Y3QgcmVpc2VyZnNfbGlzdHhhdHRyX2J1ZiB7CisgICAgaW50IHJfcG9zOworICAgIGludCByX3NpemU7CisgICAgY2hhciAqcl9idWY7CisgICAgc3RydWN0IGlub2RlICpyX2lub2RlOworfTsKKworc3RhdGljIGludAorcmVpc2VyZnNfbGlzdHhhdHRyX2ZpbGxlciAodm9pZCAqYnVmLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCBvZmZzZXQsIGlub190IGlubywgdW5zaWduZWQgaW50IGRfdHlwZSkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdHhhdHRyX2J1ZiAqYiA9IChzdHJ1Y3QgcmVpc2VyZnNfbGlzdHhhdHRyX2J1ZiAqKWJ1ZjsKKyAgICBpbnQgbGVuID0gMDsKKyAgICBpZiAobmFtZVswXSAhPSAnLicgfHwgKG5hbWVsZW4gIT0gMSAmJiAobmFtZVsxXSAhPSAnLicgfHwgbmFtZWxlbiAhPSAyKSkpIHsKKyAgICAgICAgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaCA9IGZpbmRfeGF0dHJfaGFuZGxlcl9wcmVmaXggKG5hbWUpOworICAgICAgICBpZiAoIXhhaCkgcmV0dXJuIDA7IC8qIFVuc3VwcG9ydGVkIHhhdHRyIG5hbWUsIHNraXAgaXQgKi8KKworICAgICAgICAvKiBXZSBjYWxsIC0+bGlzdCgpIHR3aWNlIGJlY2F1c2UgdGhlIG9wZXJhdGlvbiBpc24ndCByZXF1aXJlZCB0byBqdXN0CisgICAgICAgICAqIHJldHVybiB0aGUgbmFtZSBiYWNrIC0gd2Ugd2FudCB0byBtYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgKi8KKyAgICAgICAgbGVuICs9IHhhaC0+bGlzdCAoYi0+cl9pbm9kZSwgbmFtZSwgbmFtZWxlbiwgTlVMTCk7CisKKyAgICAgICAgaWYgKGxlbikgeworICAgICAgICAgICAgaWYgKGItPnJfcG9zICsgbGVuICsgMSA8PSBiLT5yX3NpemUpIHsKKyAgICAgICAgICAgICAgICBjaGFyICpwID0gYi0+cl9idWYgKyBiLT5yX3BvczsKKyAgICAgICAgICAgICAgICBwICs9IHhhaC0+bGlzdCAoYi0+cl9pbm9kZSwgbmFtZSwgbmFtZWxlbiwgcCk7CisgICAgICAgICAgICAgICAgKnArKyA9ICdcMCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiLT5yX3BvcyArPSBsZW4gKyAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisvKgorICogSW5vZGUgb3BlcmF0aW9uIGxpc3R4YXR0cigpCisgKgorICogUHJlbGltaW5hcnkgbG9ja2luZzogd2UgZG93biBkZW50cnktPmRfaW5vZGUtPmlfc2VtCisgKi8KK3NzaXplX3QKK3JlaXNlcmZzX2xpc3R4YXR0ciAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQoreworICAgIHN0cnVjdCBmaWxlICpmcDsKKyAgICBzdHJ1Y3QgZGVudHJ5ICpkaXI7CisgICAgaW50IGVyciA9IDA7CisgICAgc3RydWN0IHJlaXNlcmZzX2xpc3R4YXR0cl9idWYgYnVmOworCisgICAgaWYgKCFkZW50cnktPmRfaW5vZGUpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKCFyZWlzZXJmc194YXR0cnMoZGVudHJ5LT5kX3NiKSB8fAorICAgICAgICBnZXRfaW5vZGVfc2RfdmVyc2lvbiAoZGVudHJ5LT5kX2lub2RlKSA9PSBTVEFUX0RBVEFfVjEpCisgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKworICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cl9pIChkZW50cnktPmRfaW5vZGUpOworICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMgKGRlbnRyeS0+ZF9zYik7CisgICAgZGlyID0gb3Blbl94YV9kaXIgKGRlbnRyeS0+ZF9pbm9kZSwgRkxfUkVBRE9OTFkpOworICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyAoZGVudHJ5LT5kX3NiKTsKKyAgICBpZiAoSVNfRVJSIChkaXIpKSB7CisgICAgICAgIGVyciA9IFBUUl9FUlIgKGRpcik7CisgICAgICAgIGlmIChlcnIgPT0gLUVOT0RBVEEpCisgICAgICAgICAgICBlcnIgPSAwOyAvKiBOb3QgYW4gZXJyb3IgaWYgdGhlcmUgYXJlbid0IGFueSB4YXR0cnMgKi8KKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgZnAgPSBkZW50cnlfb3BlbiAoZGlyLCBOVUxMLCBPX1JEV1IpOworICAgIGlmIChJU19FUlIgKGZwKSkgeworICAgICAgICBlcnIgPSBQVFJfRVJSIChmcCk7CisgICAgICAgIC8qIGRlbnRyeV9vcGVuIGRwdXRzIHRoZSBkZW50cnkgaWYgaXQgZmFpbHMgKi8KKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgYnVmLnJfYnVmID0gYnVmZmVyOworICAgIGJ1Zi5yX3NpemUgPSBidWZmZXIgPyBzaXplIDogMDsKKyAgICBidWYucl9wb3MgPSAwOworICAgIGJ1Zi5yX2lub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisgICAgUkVJU0VSRlNfSShkZW50cnktPmRfaW5vZGUpLT5pX2ZsYWdzIHw9IGlfaGFzX3hhdHRyX2RpcjsKKworICAgIGVyciA9IHhhdHRyX3JlYWRkaXIgKGZwLCByZWlzZXJmc19saXN0eGF0dHJfZmlsbGVyLCAmYnVmKTsKKyAgICBpZiAoZXJyKQorICAgICAgICBnb3RvIG91dF9kaXI7CisKKyAgICBpZiAoYnVmLnJfcG9zID4gYnVmLnJfc2l6ZSAmJiBidWZmZXIgIT0gTlVMTCkKKyAgICAgICAgZXJyID0gLUVSQU5HRTsKKyAgICBlbHNlCisgICAgICAgIGVyciA9IGJ1Zi5yX3BvczsKKworb3V0X2RpcjoKKyAgICBmcHV0KGZwKTsKKworb3V0OgorICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRyX2kgKGRlbnRyeS0+ZF9pbm9kZSk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyogVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSB4YXR0ciBwbHVnaW4gaW5mcmFzdHJ1Y3R1cmUgKi8KK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHhhdHRyX2hhbmRsZXJzID0gTElTVF9IRUFEX0lOSVQgKHhhdHRyX2hhbmRsZXJzKTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKGhhbmRsZXJfbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqCitmaW5kX3hhdHRyX2hhbmRsZXJfcHJlZml4IChjb25zdCBjaGFyICpwcmVmaXgpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaCA9IE5VTEw7CisgICAgc3RydWN0IGxpc3RfaGVhZCAqcDsKKworICAgIHJlYWRfbG9jayAoJmhhbmRsZXJfbG9jayk7CisgICAgbGlzdF9mb3JfZWFjaCAocCwgJnhhdHRyX2hhbmRsZXJzKSB7CisgICAgICAgIHhhaCA9IGxpc3RfZW50cnkgKHAsIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyLCBoYW5kbGVycyk7CisgICAgICAgIGlmIChzdHJuY21wICh4YWgtPnByZWZpeCwgcHJlZml4LCBzdHJsZW4gKHhhaC0+cHJlZml4KSkgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB4YWggPSBOVUxMOworICAgIH0KKworICAgIHJlYWRfdW5sb2NrICgmaGFuZGxlcl9sb2NrKTsKKyAgICByZXR1cm4geGFoOworfQorCitzdGF0aWMgdm9pZAorX191bnJlZ2lzdGVyX2hhbmRsZXJzICh2b2lkKQoreworICAgIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyICp4YWg7CisgICAgc3RydWN0IGxpc3RfaGVhZCAqcCwgKnRtcDsKKworICAgIGxpc3RfZm9yX2VhY2hfc2FmZSAocCwgdG1wLCAmeGF0dHJfaGFuZGxlcnMpIHsKKyAgICAgICAgeGFoID0gbGlzdF9lbnRyeSAocCwgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIsIGhhbmRsZXJzKTsKKyAgICAgICAgaWYgKHhhaC0+ZXhpdCkKKyAgICAgICAgICAgIHhhaC0+ZXhpdCgpOworCisgICAgICAgIGxpc3RfZGVsX2luaXQgKHApOworICAgIH0KKyAgICBJTklUX0xJU1RfSEVBRCAoJnhhdHRyX2hhbmRsZXJzKTsKK30KKworaW50IF9faW5pdAorcmVpc2VyZnNfeGF0dHJfcmVnaXN0ZXJfaGFuZGxlcnMgKHZvaWQpCit7CisgICAgaW50IGVyciA9IDA7CisgICAgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaDsKKyAgICBzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisgICAgd3JpdGVfbG9jayAoJmhhbmRsZXJfbG9jayk7CisKKyAgICAvKiBJZiB3ZSdyZSBhbHJlYWR5IGluaXRpYWxpemVkLCBub3RoaW5nIHRvIGRvICovCisgICAgaWYgKCFsaXN0X2VtcHR5ICgmeGF0dHJfaGFuZGxlcnMpKSB7CisgICAgICAgIHdyaXRlX3VubG9jayAoJmhhbmRsZXJfbG9jayk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIEFkZCB0aGUgaGFuZGxlcnMgKi8KKyAgICBsaXN0X2FkZF90YWlsICgmdXNlcl9oYW5kbGVyLmhhbmRsZXJzLCAmeGF0dHJfaGFuZGxlcnMpOworICAgIGxpc3RfYWRkX3RhaWwgKCZ0cnVzdGVkX2hhbmRsZXIuaGFuZGxlcnMsICZ4YXR0cl9oYW5kbGVycyk7CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0ZTX1NFQ1VSSVRZCisgICAgbGlzdF9hZGRfdGFpbCAoJnNlY3VyaXR5X2hhbmRsZXIuaGFuZGxlcnMsICZ4YXR0cl9oYW5kbGVycyk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfRlNfUE9TSVhfQUNMCisgICAgbGlzdF9hZGRfdGFpbCAoJnBvc2l4X2FjbF9hY2Nlc3NfaGFuZGxlci5oYW5kbGVycywgJnhhdHRyX2hhbmRsZXJzKTsKKyAgICBsaXN0X2FkZF90YWlsICgmcG9zaXhfYWNsX2RlZmF1bHRfaGFuZGxlci5oYW5kbGVycywgJnhhdHRyX2hhbmRsZXJzKTsKKyNlbmRpZgorCisgICAgLyogUnVuIGluaXRpYWxpemVycywgaWYgYXZhaWxhYmxlICovCisgICAgbGlzdF9mb3JfZWFjaCAocCwgJnhhdHRyX2hhbmRsZXJzKSB7CisgICAgICAgIHhhaCA9IGxpc3RfZW50cnkgKHAsIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyLCBoYW5kbGVycyk7CisgICAgICAgIGlmICh4YWgtPmluaXQpIHsKKyAgICAgICAgICAgIGVyciA9IHhhaC0+aW5pdCAoKTsKKyAgICAgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgICAgICBsaXN0X2RlbF9pbml0IChwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENsZWFuIHVwIG90aGVyIGhhbmRsZXJzLCBpZiBhbnkgZmFpbGVkICovCisgICAgaWYgKGVycikKKyAgICAgICAgX191bnJlZ2lzdGVyX2hhbmRsZXJzICgpOworCisgICAgd3JpdGVfdW5sb2NrICgmaGFuZGxlcl9sb2NrKTsKKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkCityZWlzZXJmc194YXR0cl91bnJlZ2lzdGVyX2hhbmRsZXJzICh2b2lkKQoreworICAgIHdyaXRlX2xvY2sgKCZoYW5kbGVyX2xvY2spOworICAgIF9fdW5yZWdpc3Rlcl9oYW5kbGVycyAoKTsKKyAgICB3cml0ZV91bmxvY2sgKCZoYW5kbGVyX2xvY2spOworfQorCisvKiBUaGlzIHdpbGwgY2F0Y2ggbG9va3VwcyBmcm9tIHRoZSBmcyByb290IHRvIC5yZWlzZXJmc19wcml2ICovCitzdGF0aWMgaW50Cit4YXR0cl9sb29rdXBfcG9pc29uIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxMSwgc3RydWN0IHFzdHIgKm5hbWUpCit7CisgICAgc3RydWN0IGRlbnRyeSAqcHJpdl9yb290ID0gUkVJU0VSRlNfU0IoZGVudHJ5LT5kX3NiKS0+cHJpdl9yb290OworICAgIGlmIChuYW1lLT5sZW4gPT0gcHJpdl9yb290LT5kX25hbWUubGVuICYmCisgICAgICAgIG5hbWUtPmhhc2ggPT0gcHJpdl9yb290LT5kX25hbWUuaGFzaCAmJgorICAgICAgICAhbWVtY21wIChuYW1lLT5uYW1lLCBwcml2X3Jvb3QtPmRfbmFtZS5uYW1lLCBuYW1lLT5sZW4pKSB7CisgICAgICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9IGVsc2UgaWYgKHExLT5sZW4gPT0gbmFtZS0+bGVuICYmCisgICAgICAgICAgICAgICAhbWVtY21wKHExLT5uYW1lLCBuYW1lLT5uYW1lLCBuYW1lLT5sZW4pKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyB4YXR0cl9sb29rdXBfcG9pc29uX29wcyA9IHsKKyAgICAuZF9jb21wYXJlID0geGF0dHJfbG9va3VwX3BvaXNvbiwKK307CisKKworLyogV2UgbmVlZCB0byB0YWtlIGEgY29weSBvZiB0aGUgbW91bnQgZmxhZ3Mgc2luY2UgdGhpbmdzIGxpa2UKKyAqIE1TX1JET05MWSBkb24ndCBnZXQgc2V0IHVudGlsICphZnRlciogd2UncmUgY2FsbGVkLgorICogbW91bnRfZmxhZ3MgIT0gbW91bnRfb3B0aW9ucyAqLworaW50CityZWlzZXJmc194YXR0cl9pbml0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBtb3VudF9mbGFncykKK3sKKyAgaW50IGVyciA9IDA7CisKKyAgLyogV2UgbmVlZCBnZW5lcmF0aW9uIG51bWJlcnMgdG8gZW5zdXJlIHRoYXQgdGhlIG9pZCBtYXBwaW5nIGlzIGNvcnJlY3QKKyAgICogdjMuNSBmaWxlc3lzdGVtcyBkb24ndCBoYXZlIHRoZW0uICovCisgIGlmICghb2xkX2Zvcm1hdF9vbmx5IChzKSkgeworICAgIHNldF9iaXQgKFJFSVNFUkZTX1hBVFRSUywgJihSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQpKTsKKyAgfSBlbHNlIGlmIChyZWlzZXJmc194YXR0cnNfb3B0aW9uYWwgKHMpKSB7CisgICAgLyogT2xkIGZvcm1hdCBmaWxlc3lzdGVtLCBidXQgb3B0aW9uYWwgeGF0dHJzIGhhdmUgYmVlbiBlbmFibGVkCisgICAgICogYXQgbW91bnQgdGltZS4gRXJyb3Igb3V0LiAqLworICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ4YXR0cnMvQUNMcyBub3Qgc3VwcG9ydGVkIG9uIHByZSB2My42ICIKKyAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IGZpbGVzeXN0ZW0uIEZhaWxpbmcgbW91bnQuIik7CisgICAgZXJyID0gLUVPUE5PVFNVUFA7CisgICAgZ290byBlcnJvcjsKKyAgfSBlbHNlIHsKKyAgICAvKiBPbGQgZm9ybWF0IGZpbGVzeXN0ZW0sIGJ1dCBubyBvcHRpb25hbCB4YXR0cnMgaGF2ZSBiZWVuIGVuYWJsZWQuIFRoaXMKKyAgICAgKiBtZWFucyB3ZSBzaWxlbnRseSBkaXNhYmxlIHhhdHRycyBvbiB0aGUgZmlsZXN5c3RlbS4gKi8KKyAgICBjbGVhcl9iaXQgKFJFSVNFUkZTX1hBVFRSUywgJihSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQpKTsKKyAgfQorCisgIC8qIElmIHdlIGRvbid0IGhhdmUgdGhlIHByaXZyb290IGxvY2F0ZWQgeWV0IC0gZ28gZmluZCBpdCAqLworICBpZiAocmVpc2VyZnNfeGF0dHJzIChzKSAmJiAhUkVJU0VSRlNfU0IocyktPnByaXZfcm9vdCkgeworICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5OworICAgICAgZGVudHJ5ID0gbG9va3VwX29uZV9sZW4gKFBSSVZST09UX05BTUUsIHMtPnNfcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4gKFBSSVZST09UX05BTUUpKTsKKyAgICAgIGlmICghSVNfRVJSIChkZW50cnkpKSB7CisgICAgICAgIGlmICghKG1vdW50X2ZsYWdzICYgTVNfUkRPTkxZKSAmJiAhZGVudHJ5LT5kX2lub2RlKSB7CisgICAgICAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKKyAgICAgICAgICAgIGRvd24gKCZpbm9kZS0+aV9zZW0pOworICAgICAgICAgICAgZXJyID0gaW5vZGUtPmlfb3AtPm1rZGlyIChpbm9kZSwgZGVudHJ5LCAwNzAwKTsKKyAgICAgICAgICAgIHVwICgmaW5vZGUtPmlfc2VtKTsKKyAgICAgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgICAgICBkcHV0IChkZW50cnkpOworICAgICAgICAgICAgICAgIGRlbnRyeSA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkZW50cnkgJiYgZGVudHJ5LT5kX2lub2RlKQorICAgICAgICAgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJDcmVhdGVkICVzIG9uICVzIC0gcmVzZXJ2ZWQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieGF0dHIgc3RvcmFnZS4iLCBQUklWUk9PVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaXNlcmZzX2JkZXZuYW1lIChpbm9kZS0+aV9zYikpOworICAgICAgICB9IGVsc2UgaWYgKCFkZW50cnktPmRfaW5vZGUpIHsKKyAgICAgICAgICAgIGRwdXQgKGRlbnRyeSk7CisgICAgICAgICAgICBkZW50cnkgPSBOVUxMOworICAgICAgICB9CisgICAgICB9IGVsc2UKKyAgICAgICAgZXJyID0gUFRSX0VSUiAoZGVudHJ5KTsKKworICAgICAgaWYgKCFlcnIgJiYgZGVudHJ5KSB7CisgICAgICAgICAgcy0+c19yb290LT5kX29wID0gJnhhdHRyX2xvb2t1cF9wb2lzb25fb3BzOworICAgICAgICAgIHJlaXNlcmZzX21hcmtfaW5vZGVfcHJpdmF0ZSAoZGVudHJ5LT5kX2lub2RlKTsKKyAgICAgICAgICBSRUlTRVJGU19TQihzKS0+cHJpdl9yb290ID0gZGVudHJ5OworICAgICAgfSBlbHNlIGlmICghKG1vdW50X2ZsYWdzICYgTVNfUkRPTkxZKSkgeyAvKiB4YXR0cnMgYXJlIHVuYXZhaWxhYmxlICovCisgICAgICAgICAgLyogSWYgd2UncmUgcmVhZC1vbmx5IGl0IGp1c3QgbWVhbnMgdGhhdCB0aGUgZGlyIGhhc24ndCBiZWVuCisgICAgICAgICAgICogY3JlYXRlZC4gTm90IGFuIGVycm9yIC0tIGp1c3Qgbm8geGF0dHJzIG9uIHRoZSBmcy4gV2UnbGwKKyAgICAgICAgICAgKiBjaGVjayBhZ2FpbiBpZiB3ZSBnbyByZWFkLXdyaXRlICovCisgICAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgInhhdHRycy9BQ0xzIGVuYWJsZWQgYW5kIGNvdWxkbid0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmluZC9jcmVhdGUgLnJlaXNlcmZzX3ByaXYuIEZhaWxpbmcgbW91bnQuIik7CisgICAgICAgICAgZXJyID0gLUVPUE5PVFNVUFA7CisgICAgICB9CisgIH0KKworZXJyb3I6CisgICAvKiBUaGlzIGlzIG9ubHkgbm9uemVybyBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW5pdGlhbGl6aW5nIHRoZSB4YXR0cgorICAgICogZGlyZWN0b3J5IG9yIGlmIHRoZXJlIGlzIGEgY29uZGl0aW9uIHdoZXJlIHdlIGRvbid0IHN1cHBvcnQgdGhlbS4gKi8KKyAgICBpZiAoZXJyKSB7CisgICAgICAgICAgY2xlYXJfYml0IChSRUlTRVJGU19YQVRUUlMsICYoUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0KSk7CisgICAgICAgICAgY2xlYXJfYml0IChSRUlTRVJGU19YQVRUUlNfVVNFUiwgJihSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQpKTsKKyAgICAgICAgICBjbGVhcl9iaXQgKFJFSVNFUkZTX1BPU0lYQUNMLCAmKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCkpOworICAgIH0KKworICAgIC8qIFRoZSBzdXBlcl9ibG9jayBNU19QT1NJWEFDTCBtdXN0IG1pcnJvciB0aGUgKG5vKWFjbCBtb3VudCBvcHRpb24uICovCisgICAgcy0+c19mbGFncyA9IHMtPnNfZmxhZ3MgJiB+TVNfUE9TSVhBQ0w7CisgICAgaWYgKHJlaXNlcmZzX3Bvc2l4YWNsIChzKSkKKwlzLT5zX2ZsYWdzIHw9IE1TX1BPU0lYQUNMOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAorX19yZWlzZXJmc19wZXJtaXNzaW9uIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBuZWVkX2xvY2spCit7CisJdW1vZGVfdAkJCW1vZGUgPSBpbm9kZS0+aV9tb2RlOworCisJaWYgKG1hc2sgJiBNQVlfV1JJVEUpIHsKKwkJLyoKKwkJICogTm9ib2R5IGdldHMgd3JpdGUgYWNjZXNzIHRvIGEgcmVhZC1vbmx5IGZzLgorCQkgKi8KKwkJaWYgKElTX1JET05MWShpbm9kZSkgJiYKKwkJICAgIChTX0lTUkVHKG1vZGUpIHx8IFNfSVNESVIobW9kZSkgfHwgU19JU0xOSyhtb2RlKSkpCisJCQlyZXR1cm4gLUVST0ZTOworCisJCS8qCisJCSAqIE5vYm9keSBnZXRzIHdyaXRlIGFjY2VzcyB0byBhbiBpbW11dGFibGUgZmlsZS4KKwkJICovCisJCWlmIChJU19JTU1VVEFCTEUoaW5vZGUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisJLyogV2UgZG9uJ3QgZG8gcGVybWlzc2lvbiBjaGVja3Mgb24gdGhlIGludGVybmFsIG9iamVjdHMuCisJKiBQZXJtaXNzaW9ucyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgIm93bmluZyIgb2JqZWN0LiAqLworICAgICAgICBpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QgKGlub2RlKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY3VycmVudC0+ZnN1aWQgPT0gaW5vZGUtPmlfdWlkKSB7CisJCW1vZGUgPj49IDY7CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0ZTX1BPU0lYX0FDTAorCX0gZWxzZSBpZiAocmVpc2VyZnNfcG9zaXhhY2woaW5vZGUtPmlfc2IpICYmCisgICAgICAgICAgICAgICAgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGlub2RlKSAhPSBTVEFUX0RBVEFfVjEpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisKKwkJLyogQUNMIGNhbid0IGNvbnRhaW4gYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBpZgorCQkgICB0aGUgQUNMX01BU0sgZW50cnkgaXMgMCAqLworCQlpZiAoIShtb2RlICYgU19JUldYRykpCisJCQlnb3RvIGNoZWNrX2dyb3VwczsKKworICAgICAgICAgICAgICAgIGlmIChuZWVkX2xvY2spIHsKKwkJICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cl9pIChpbm9kZSk7CisgICAgICAgICAgICAgICAgICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKKwkJfQorICAgICAgICAgICAgICAgIGFjbCA9IHJlaXNlcmZzX2dldF9hY2wgKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MpOworICAgICAgICAgICAgICAgIGlmIChuZWVkX2xvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7CisJCSAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cl9pIChpbm9kZSk7CisJCX0KKyAgICAgICAgICAgICAgICBpZiAoSVNfRVJSIChhY2wpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChQVFJfRVJSIChhY2wpID09IC1FTk9EQVRBKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjaGVja19ncm91cHM7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQVFJfRVJSIChhY2wpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChhY2wpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVyciA9IHBvc2l4X2FjbF9wZXJtaXNzaW9uIChpbm9kZSwgYWNsLCBtYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UgKGFjbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gLUVBQ0NFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjaGVja19jYXBhYmlsaXRpZXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKwkJfSBlbHNlIHsKKwkJCWdvdG8gY2hlY2tfZ3JvdXBzOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCX0gZWxzZSB7CitjaGVja19ncm91cHM6CisJCWlmIChpbl9ncm91cF9wKGlub2RlLT5pX2dpZCkpCisJCQltb2RlID4+PSAzOworCX0KKworCS8qCisJICogSWYgdGhlIERBQ3MgYXJlIG9rIHdlIGRvbid0IG5lZWQgYW55IGNhcGFiaWxpdHkgY2hlY2suCisJICovCisJaWYgKCgobW9kZSAmIG1hc2sgJiAoTUFZX1JFQUR8TUFZX1dSSVRFfE1BWV9FWEVDKSkgPT0gbWFzaykpCisJCXJldHVybiAwOworCitjaGVja19jYXBhYmlsaXRpZXM6CisJLyoKKwkgKiBSZWFkL3dyaXRlIERBQ3MgYXJlIGFsd2F5cyBvdmVycmlkYWJsZS4KKwkgKiBFeGVjdXRhYmxlIERBQ3MgYXJlIG92ZXJyaWRhYmxlIGlmIGF0IGxlYXN0IG9uZSBleGVjIGJpdCBpcyBzZXQuCisJICovCisJaWYgKCEobWFzayAmIE1BWV9FWEVDKSB8fAorCSAgICAoaW5vZGUtPmlfbW9kZSAmIFNfSVhVR08pIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCWlmIChjYXBhYmxlKENBUF9EQUNfT1ZFUlJJREUpKQorCQkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFNlYXJjaGluZyBpbmNsdWRlcyBleGVjdXRhYmxlIG9uIGRpcmVjdG9yaWVzLCBlbHNlIGp1c3QgcmVhZC4KKwkgKi8KKwlpZiAobWFzayA9PSBNQVlfUkVBRCB8fCAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiAhKG1hc2sgJiBNQVlfV1JJVEUpKSkKKwkJaWYgKGNhcGFibGUoQ0FQX0RBQ19SRUFEX1NFQVJDSCkpCisJCQlyZXR1cm4gMDsKKworCXJldHVybiAtRUFDQ0VTOworfQorCitpbnQKK3JlaXNlcmZzX3Blcm1pc3Npb24gKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKyAgICByZXR1cm4gX19yZWlzZXJmc19wZXJtaXNzaW9uIChpbm9kZSwgbWFzaywgbmQsIDEpOworfQorCitpbnQKK3JlaXNlcmZzX3Blcm1pc3Npb25fbG9ja2VkIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisgICAgcmV0dXJuIF9fcmVpc2VyZnNfcGVybWlzc2lvbiAoaW5vZGUsIG1hc2ssIG5kLCAwKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3hhdHRyX2FjbC5jIGIvZnMvcmVpc2VyZnMveGF0dHJfYWNsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwMjA3MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL3hhdHRyX2FjbC5jCkBAIC0wLDAgKzEsNTcxIEBACisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CisjaW5jbHVkZSA8bGludXgveGF0dHJfYWNsLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfeGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19hY2wuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW50IHJlaXNlcmZzX3NldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUsIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCk7CisKK3N0YXRpYyBpbnQKK3hhdHRyX3NldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUsIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisJaW50IGVycm9yOworCisJaWYgKCFyZWlzZXJmc19wb3NpeGFjbChpbm9kZS0+aV9zYikpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCkgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAodmFsdWUpIHsKKwkJYWNsID0gcG9zaXhfYWNsX2Zyb21feGF0dHIodmFsdWUsIHNpemUpOworCQlpZiAoSVNfRVJSKGFjbCkpIHsKKwkJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJCX0gZWxzZSBpZiAoYWNsKSB7CisJCQllcnJvciA9IHBvc2l4X2FjbF92YWxpZChhY2wpOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gcmVsZWFzZV9hbmRfb3V0OworCQl9CisJfSBlbHNlCisJCWFjbCA9IE5VTEw7CisKKwllcnJvciA9IHJlaXNlcmZzX3NldF9hY2wgKGlub2RlLCB0eXBlLCBhY2wpOworCityZWxlYXNlX2FuZF9vdXQ6CisJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworc3RhdGljIGludAoreGF0dHJfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisJaW50IGVycm9yOworCisJaWYgKCFyZWlzZXJmc19wb3NpeGFjbChpbm9kZS0+aV9zYikpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWFjbCA9IHJlaXNlcmZzX2dldF9hY2wgKGlub2RlLCB0eXBlKTsKKwlpZiAoSVNfRVJSKGFjbCkpCisJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJaWYgKGFjbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RBVEE7CisJZXJyb3IgPSBwb3NpeF9hY2xfdG9feGF0dHIoYWNsLCBidWZmZXIsIHNpemUpOworCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoKKyAqIENvbnZlcnQgZnJvbSBmaWxlc3lzdGVtIHRvIGluLW1lbW9yeSByZXByZXNlbnRhdGlvbi4KKyAqLworc3RhdGljIHN0cnVjdCBwb3NpeF9hY2wgKgorcG9zaXhfYWNsX2Zyb21fZGlzayhjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUpCit7CisJY29uc3QgY2hhciAqZW5kID0gKGNoYXIgKil2YWx1ZSArIHNpemU7CisJaW50IG4sIGNvdW50OworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKworCWlmICghdmFsdWUpCisJCXJldHVybiBOVUxMOworCWlmIChzaXplIDwgc2l6ZW9mKHJlaXNlcmZzX2FjbF9oZWFkZXIpKQorCQkgcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKCgocmVpc2VyZnNfYWNsX2hlYWRlciAqKXZhbHVlKS0+YV92ZXJzaW9uICE9CisJICAgIGNwdV90b19sZTMyKFJFSVNFUkZTX0FDTF9WRVJTSU9OKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJdmFsdWUgPSAoY2hhciAqKXZhbHVlICsgc2l6ZW9mKHJlaXNlcmZzX2FjbF9oZWFkZXIpOworCWNvdW50ID0gcmVpc2VyZnNfYWNsX2NvdW50KHNpemUpOworCWlmIChjb3VudCA8IDApCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKwlhY2wgPSBwb3NpeF9hY2xfYWxsb2MoY291bnQsIEdGUF9OT0ZTKTsKKwlpZiAoIWFjbCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJZm9yIChuPTA7IG4gPCBjb3VudDsgbisrKSB7CisJCXJlaXNlcmZzX2FjbF9lbnRyeSAqZW50cnkgPQorCQkJKHJlaXNlcmZzX2FjbF9lbnRyeSAqKXZhbHVlOworCQlpZiAoKGNoYXIgKil2YWx1ZSArIHNpemVvZihyZWlzZXJmc19hY2xfZW50cnlfc2hvcnQpID4gZW5kKQorCQkJZ290byBmYWlsOworCQlhY2wtPmFfZW50cmllc1tuXS5lX3RhZyAgPSBsZTE2X3RvX2NwdShlbnRyeS0+ZV90YWcpOworCQlhY2wtPmFfZW50cmllc1tuXS5lX3Blcm0gPSBsZTE2X3RvX2NwdShlbnRyeS0+ZV9wZXJtKTsKKwkJc3dpdGNoKGFjbC0+YV9lbnRyaWVzW25dLmVfdGFnKSB7CisJCQljYXNlIEFDTF9VU0VSX09CSjoKKwkJCWNhc2UgQUNMX0dST1VQX09CSjoKKwkJCWNhc2UgQUNMX01BU0s6CisJCQljYXNlIEFDTF9PVEhFUjoKKwkJCQl2YWx1ZSA9IChjaGFyICopdmFsdWUgKworCQkJCQlzaXplb2YocmVpc2VyZnNfYWNsX2VudHJ5X3Nob3J0KTsKKwkJCQlhY2wtPmFfZW50cmllc1tuXS5lX2lkID0gQUNMX1VOREVGSU5FRF9JRDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBQ0xfVVNFUjoKKwkJCWNhc2UgQUNMX0dST1VQOgorCQkJCXZhbHVlID0gKGNoYXIgKil2YWx1ZSArIHNpemVvZihyZWlzZXJmc19hY2xfZW50cnkpOworCQkJCWlmICgoY2hhciAqKXZhbHVlID4gZW5kKQorCQkJCQlnb3RvIGZhaWw7CisJCQkJYWNsLT5hX2VudHJpZXNbbl0uZV9pZCA9CisJCQkJCWxlMzJfdG9fY3B1KGVudHJ5LT5lX2lkKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisJaWYgKHZhbHVlICE9IGVuZCkKKwkJZ290byBmYWlsOworCXJldHVybiBhY2w7CisKK2ZhaWw6CisJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKK30KKworLyoKKyAqIENvbnZlcnQgZnJvbSBpbi1tZW1vcnkgdG8gZmlsZXN5c3RlbSByZXByZXNlbnRhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgKgorcG9zaXhfYWNsX3RvX2Rpc2soY29uc3Qgc3RydWN0IHBvc2l4X2FjbCAqYWNsLCBzaXplX3QgKnNpemUpCit7CisJcmVpc2VyZnNfYWNsX2hlYWRlciAqZXh0X2FjbDsKKwljaGFyICplOworCWludCBuOworCisJKnNpemUgPSByZWlzZXJmc19hY2xfc2l6ZShhY2wtPmFfY291bnQpOworCWV4dF9hY2wgPSAocmVpc2VyZnNfYWNsX2hlYWRlciAqKWttYWxsb2Moc2l6ZW9mKHJlaXNlcmZzX2FjbF9oZWFkZXIpICsKKwkJYWNsLT5hX2NvdW50ICogc2l6ZW9mKHJlaXNlcmZzX2FjbF9lbnRyeSksIEdGUF9OT0ZTKTsKKwlpZiAoIWV4dF9hY2wpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWV4dF9hY2wtPmFfdmVyc2lvbiA9IGNwdV90b19sZTMyKFJFSVNFUkZTX0FDTF9WRVJTSU9OKTsKKwllID0gKGNoYXIgKilleHRfYWNsICsgc2l6ZW9mKHJlaXNlcmZzX2FjbF9oZWFkZXIpOworCWZvciAobj0wOyBuIDwgYWNsLT5hX2NvdW50OyBuKyspIHsKKwkJcmVpc2VyZnNfYWNsX2VudHJ5ICplbnRyeSA9IChyZWlzZXJmc19hY2xfZW50cnkgKillOworCQllbnRyeS0+ZV90YWcgID0gY3B1X3RvX2xlMTYoYWNsLT5hX2VudHJpZXNbbl0uZV90YWcpOworCQllbnRyeS0+ZV9wZXJtID0gY3B1X3RvX2xlMTYoYWNsLT5hX2VudHJpZXNbbl0uZV9wZXJtKTsKKwkJc3dpdGNoKGFjbC0+YV9lbnRyaWVzW25dLmVfdGFnKSB7CisJCQljYXNlIEFDTF9VU0VSOgorCQkJY2FzZSBBQ0xfR1JPVVA6CisJCQkJZW50cnktPmVfaWQgPQorCQkJCQljcHVfdG9fbGUzMihhY2wtPmFfZW50cmllc1tuXS5lX2lkKTsKKwkJCQllICs9IHNpemVvZihyZWlzZXJmc19hY2xfZW50cnkpOworCQkJCWJyZWFrOworCisJCQljYXNlIEFDTF9VU0VSX09CSjoKKwkJCWNhc2UgQUNMX0dST1VQX09CSjoKKwkJCWNhc2UgQUNMX01BU0s6CisJCQljYXNlIEFDTF9PVEhFUjoKKwkJCQllICs9IHNpemVvZihyZWlzZXJmc19hY2xfZW50cnlfc2hvcnQpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKwlyZXR1cm4gKGNoYXIgKilleHRfYWNsOworCitmYWlsOgorCWtmcmVlKGV4dF9hY2wpOworCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworfQorCisvKgorICogSW5vZGUgb3BlcmF0aW9uIGdldF9wb3NpeF9hY2woKS4KKyAqCisgKiBpbm9kZS0+aV9zZW06IGRvd24KKyAqIEJLTCBoZWxkIFtiZWZvcmUgMi41LnhdCisgKi8KK3N0cnVjdCBwb3NpeF9hY2wgKgorcmVpc2VyZnNfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKK3sKKwljaGFyICpuYW1lLCAqdmFsdWU7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsLCAqKnBfYWNsOworCXNpemVfdCBzaXplOworCWludCByZXR2YWw7CisgICAgICAgIHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICpyZWlzZXJmc19pID0gUkVJU0VSRlNfSShpbm9kZSk7CisKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIEFDTF9UWVBFX0FDQ0VTUzoKKyAgICAgICAgICAgICAgICBuYW1lID0gWEFUVFJfTkFNRV9BQ0xfQUNDRVNTOworICAgICAgICAgICAgICAgIHBfYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2FjY2VzczsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUNMX1RZUEVfREVGQVVMVDoKKyAgICAgICAgICAgICAgICBuYW1lID0gWEFUVFJfTkFNRV9BQ0xfREVGQVVMVDsKKyAgICAgICAgICAgICAgICBwX2FjbCA9ICZyZWlzZXJmc19pLT5pX2FjbF9kZWZhdWx0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJSX1BUUiAoLUVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoSVNfRVJSICgqcF9hY2wpKSB7CisgICAgICAgICAgICBpZiAoUFRSX0VSUiAoKnBfYWNsKSA9PSAtRU5PREFUQSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfSBlbHNlIGlmICgqcF9hY2wgIT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBwb3NpeF9hY2xfZHVwICgqcF9hY2wpOworCisgICAgICAgIHNpemUgPSByZWlzZXJmc194YXR0cl9nZXQgKGlub2RlLCBuYW1lLCBOVUxMLCAwKTsKKyAgICAgICAgaWYgKChpbnQpc2l6ZSA8IDApIHsKKyAgICAgICAgICAgIGlmIChzaXplID09IC1FTk9EQVRBIHx8IHNpemUgPT0gLUVOT1NZUykgeworCQkqcF9hY2wgPSBFUlJfUFRSICgtRU5PREFUQSk7CisJCXJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIgKHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBrbWFsbG9jIChzaXplLCBHRlBfTk9GUyk7CisgICAgICAgIGlmICghdmFsdWUpCisgICAgICAgICAgICByZXR1cm4gRVJSX1BUUiAoLUVOT01FTSk7CisKKwlyZXR2YWwgPSByZWlzZXJmc194YXR0cl9nZXQoaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplKTsKKwlpZiAocmV0dmFsID09IC1FTk9EQVRBIHx8IHJldHZhbCA9PSAtRU5PU1lTKSB7CisJCS8qIFRoaXMgc2hvdWxkbid0IGFjdHVhbGx5IGhhcHBlbiBhcyBpdCBzaG91bGQgaGF2ZQorCQkgICBiZWVuIGNhdWdodCBhYm92ZS4uIGJ1dCBqdXN0IGluIGNhc2UgKi8KKwkJYWNsID0gTlVMTDsKKwkJKnBfYWNsID0gRVJSX1BUUiAoLUVOT0RBVEEpOworICAgICAgICB9IGVsc2UgaWYgKHJldHZhbCA8IDApIHsKKwkJYWNsID0gRVJSX1BUUihyZXR2YWwpOworCX0gZWxzZSB7CisJCWFjbCA9IHBvc2l4X2FjbF9mcm9tX2Rpc2sodmFsdWUsIHJldHZhbCk7CisJCSpwX2FjbCA9IHBvc2l4X2FjbF9kdXAgKGFjbCk7CisgICAgICAgIH0KKworCWtmcmVlKHZhbHVlKTsKKwlyZXR1cm4gYWNsOworfQorCisvKgorICogSW5vZGUgb3BlcmF0aW9uIHNldF9wb3NpeF9hY2woKS4KKyAqCisgKiBpbm9kZS0+aV9zZW06IGRvd24KKyAqIEJLTCBoZWxkIFtiZWZvcmUgMi41LnhdCisgKi8KK3N0YXRpYyBpbnQKK3JlaXNlcmZzX3NldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUsIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCkKK3sKKyAgICAgICAgY2hhciAqbmFtZTsKKwl2b2lkICp2YWx1ZSA9IE5VTEw7CisJc3RydWN0IHBvc2l4X2FjbCAqKnBfYWNsOworCXNpemVfdCBzaXplOworCWludCBlcnJvcjsKKyAgICAgICAgc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKnJlaXNlcmZzX2kgPSBSRUlTRVJGU19JKGlub2RlKTsKKworCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIEFDTF9UWVBFX0FDQ0VTUzoKKyAgICAgICAgICAgICAgICBuYW1lID0gWEFUVFJfTkFNRV9BQ0xfQUNDRVNTOworICAgICAgICAgICAgICAgIHBfYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2FjY2VzczsKKyAgICAgICAgICAgICAgICBpZiAoYWNsKSB7CisgICAgICAgICAgICAgICAgICAgIG1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZSAoYWNsLCAmbW9kZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2wgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgorICAgICAgICAgICAgICAgIG5hbWUgPSBYQVRUUl9OQU1FX0FDTF9ERUZBVUxUOworICAgICAgICAgICAgICAgIHBfYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2RlZmF1bHQ7CisgICAgICAgICAgICAgICAgaWYgKCFTX0lTRElSIChpbm9kZS0+aV9tb2RlKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjbCA/IC1FQUNDRVMgOiAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgCWlmIChhY2wpIHsKKyAgICAgICAgICAgIHZhbHVlID0gcG9zaXhfYWNsX3RvX2Rpc2soYWNsLCAmc2l6ZSk7CisgICAgICAgICAgICBpZiAoSVNfRVJSKHZhbHVlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGludClQVFJfRVJSKHZhbHVlKTsKKyAgICAgICAgICAgIGVycm9yID0gcmVpc2VyZnNfeGF0dHJfc2V0KGlub2RlLCBuYW1lLCB2YWx1ZSwgc2l6ZSwgMCk7CisJfSBlbHNlIHsKKyAgICAgICAgICAgIGVycm9yID0gcmVpc2VyZnNfeGF0dHJfZGVsIChpbm9kZSwgbmFtZSk7CisgICAgICAgICAgICBpZiAoZXJyb3IgPT0gLUVOT0RBVEEpIHsKKyAgICAgICAgICAgICAgICAvKiBUaGlzIG1heSBzZWVtIG9kZCBoZXJlLCBidXQgaXQgbWVhbnMgdGhhdCB0aGUgQUNMIHdhcyBzZXQKKyAgICAgICAgICAgICAgICAgKiB3aXRoIGEgdmFsdWUgcmVwcmVzZW50YWJsZSB3aXRoIG1vZGUgYml0cy4gSWYgdGhlcmUgd2FzCisgICAgICAgICAgICAgICAgICogYW4gQUNMIGJlZm9yZSwgcmVpc2VyZnNfeGF0dHJfZGVsIGFscmVhZHkgZGlydGllZCB0aGUgaW5vZGUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbWFya19pbm9kZV9kaXJ0eSAoaW5vZGUpOworICAgICAgICAgICAgICAgIGVycm9yID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisJaWYgKHZhbHVlKQorCQlrZnJlZSh2YWx1ZSk7CisKKyAgICAgICAgaWYgKCFlcnJvcikgeworICAgICAgICAgICAgLyogUmVsZWFzZSB0aGUgb2xkIG9uZSAqLworICAgICAgICAgICAgaWYgKCFJU19FUlIgKCpwX2FjbCkgJiYgKnBfYWNsKQorICAgICAgICAgICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlICgqcF9hY2wpOworCisgICAgICAgICAgICBpZiAoYWNsID09IE5VTEwpCisgICAgICAgICAgICAgICAgKnBfYWNsID0gRVJSX1BUUiAoLUVOT0RBVEEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICpwX2FjbCA9IHBvc2l4X2FjbF9kdXAgKGFjbCk7CisgICAgICAgIH0KKworCXJldHVybiBlcnJvcjsKK30KKworLyogZGlyLT5pX3NlbTogZG93biwKKyAqIGlub2RlIGlzIG5ldyBhbmQgbm90IHJlbGVhc2VkIGludG8gdGhlIHdpbGQgeWV0ICovCitpbnQKK3JlaXNlcmZzX2luaGVyaXRfZGVmYXVsdF9hY2wgKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisgICAgc3RydWN0IHBvc2l4X2FjbCAqYWNsOworICAgIGludCBlcnIgPSAwOworCisgICAgLyogQUNMcyBvbmx5IGdldCBhcHBsaWVkIHRvIGZpbGVzIGFuZCBkaXJlY3RvcmllcyAqLworICAgIGlmIChTX0lTTE5LIChpbm9kZS0+aV9tb2RlKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBBQ0xzIGNhbiBvbmx5IGJlIHVzZWQgb24gIm5ldyIgb2JqZWN0cywgc28gaWYgaXQncyBhbiBvbGQgb2JqZWN0CisgICAgICogdGhlcmUgaXMgbm90aGluZyB0byBpbmhlcml0IGZyb20gKi8KKyAgICBpZiAoZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGRpcikgPT0gU1RBVF9EQVRBX1YxKQorICAgICAgICBnb3RvIGFwcGx5X3VtYXNrOworCisgICAgLyogRG9uJ3QgYXBwbHkgQUNMcyB0byBvYmplY3RzIGluIHRoZSAucmVpc2VyZnNfcHJpdiB0cmVlLi4gVGhpcworICAgICAqIHdvdWxkIGJlIHVzZWxlc3Mgc2luY2UgcGVybWlzc2lvbnMgYXJlIGlnbm9yZWQsIGFuZCBhIHBhaW4gYmVjYXVzZQorICAgICAqIGl0IGludHJvZHVjZXMgbG9ja2luZyBjeWNsZXMgKi8KKyAgICBpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QgKGRpcikpIHsKKyAgICAgICAgcmVpc2VyZnNfbWFya19pbm9kZV9wcml2YXRlIChpbm9kZSk7CisgICAgICAgIGdvdG8gYXBwbHlfdW1hc2s7CisgICAgfQorCisgICAgYWNsID0gcmVpc2VyZnNfZ2V0X2FjbCAoZGlyLCBBQ0xfVFlQRV9ERUZBVUxUKTsKKyAgICBpZiAoSVNfRVJSIChhY2wpKSB7CisgICAgICAgIGlmIChQVFJfRVJSIChhY2wpID09IC1FTk9EQVRBKQorICAgICAgICAgICAgZ290byBhcHBseV91bWFzazsKKyAgICAgICAgcmV0dXJuIFBUUl9FUlIgKGFjbCk7CisgICAgfQorCisgICAgaWYgKGFjbCkgeworICAgICAgICBzdHJ1Y3QgcG9zaXhfYWNsICphY2xfY29weTsKKyAgICAgICAgbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOworICAgICAgICBpbnQgbmVlZF9hY2w7CisKKyAgICAgICAgLyogQ29weSB0aGUgZGVmYXVsdCBBQ0wgdG8gdGhlIGRlZmF1bHQgQUNMIG9mIGEgbmV3IGRpcmVjdG9yeSAqLworICAgICAgICBpZiAoU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkpIHsKKyAgICAgICAgICAgIGVyciA9IHJlaXNlcmZzX3NldF9hY2wgKGlub2RlLCBBQ0xfVFlQRV9ERUZBVUxULCBhY2wpOworICAgICAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICAvKiBOb3cgd2UgcmVjb25jaWxlIHRoZSBuZXcgQUNMIGFuZCB0aGUgbW9kZSwKKyAgICAgICAgICAgcG90ZW50aWFsbHkgbW9kaWZ5aW5nIGJvdGggKi8KKyAgICAgICAgYWNsX2NvcHkgPSBwb3NpeF9hY2xfY2xvbmUgKGFjbCwgR0ZQX05PRlMpOworICAgICAgICBpZiAoIWFjbF9jb3B5KSB7CisgICAgICAgICAgICBlcnIgPSAtRU5PTUVNOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisKKworICAgICAgICBuZWVkX2FjbCA9IHBvc2l4X2FjbF9jcmVhdGVfbWFzcSAoYWNsX2NvcHksICZtb2RlKTsKKyAgICAgICAgaWYgKG5lZWRfYWNsID49IDApIHsKKyAgICAgICAgICAgIGlmIChtb2RlICE9IGlub2RlLT5pX21vZGUpIHsKKyAgICAgICAgICAgICAgICBpbm9kZS0+aV9tb2RlID0gbW9kZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogSWYgd2UgbmVlZCBhbiBBQ0wuLiAqLworICAgICAgICAgICAgaWYgKG5lZWRfYWNsID4gMCkgeworICAgICAgICAgICAgICAgIGVyciA9IHJlaXNlcmZzX3NldF9hY2wgKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGFjbF9jb3B5KTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXBfY29weTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorY2xlYW51cF9jb3B5OgorICAgICAgICBwb3NpeF9hY2xfcmVsZWFzZSAoYWNsX2NvcHkpOworY2xlYW51cDoKKyAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UgKGFjbCk7CisgICAgfSBlbHNlIHsKK2FwcGx5X3VtYXNrOgorICAgICAgICAvKiBubyBBQ0wsIGFwcGx5IHVtYXNrICovCisgICAgICAgIGlub2RlLT5pX21vZGUgJj0gfmN1cnJlbnQtPmZzLT51bWFzazsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKiBMb29rcyB1cCBhbmQgY2FjaGVzIHRoZSByZXN1bHQgb2YgdGhlIGRlZmF1bHQgQUNMLgorICogV2UgZG8gdGhpcyBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gY2FycnkgdGhlIHhhdHRyX3NlbSBpbnRvCisgKiByZWlzZXJmc19uZXdfaW5vZGUgaWYgd2UgZG9uJ3QgbmVlZCB0byAqLworaW50CityZWlzZXJmc19jYWNoZV9kZWZhdWx0X2FjbCAoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpZiAocmVpc2VyZnNfcG9zaXhhY2wgKGlub2RlLT5pX3NiKSAmJgorICAgICAgICAhaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QgKGlub2RlKSkgeworICAgICAgICBzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisgICAgICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cl9pIChpbm9kZSk7CisgICAgICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKKyAgICAgICAgYWNsID0gcmVpc2VyZnNfZ2V0X2FjbCAoaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQpOworICAgICAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKKyAgICAgICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJfaSAoaW5vZGUpOworICAgICAgICByZXQgPSBhY2wgPyAxIDogMDsKKyAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UgKGFjbCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworaW50CityZWlzZXJmc19hY2xfY2htb2QgKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisgICAgICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgKmNsb25lOworICAgICAgICBpbnQgZXJyb3I7CisKKyAgICAgICAgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSkgPT0gU1RBVF9EQVRBX1YxIHx8CisJICAgICFyZWlzZXJmc19wb3NpeGFjbChpbm9kZS0+aV9zYikpCisgICAgICAgIHsKKwkgICAgcmV0dXJuIDA7CisJfQorCisgICAgICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKKyAgICAgICAgYWNsID0gcmVpc2VyZnNfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKTsKKyAgICAgICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7CisgICAgICAgIGlmICghYWNsKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoSVNfRVJSKGFjbCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFBUUl9FUlIoYWNsKTsKKyAgICAgICAgY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfTk9GUyk7CisgICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisgICAgICAgIGlmICghY2xvbmUpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIGVycm9yID0gcG9zaXhfYWNsX2NobW9kX21hc3EoY2xvbmUsIGlub2RlLT5pX21vZGUpOworICAgICAgICBpZiAoIWVycm9yKSB7CisgICAgICAgICAgICAgICAgaW50IGxvY2sgPSAhaGFzX3hhdHRyX2RpciAoaW5vZGUpOworICAgICAgICAgICAgICAgIHJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJfaSAoaW5vZGUpOworICAgICAgICAgICAgICAgIGlmIChsb2NrKQorICAgICAgICAgICAgICAgICAgICByZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOworICAgICAgICAgICAgICAgIGVycm9yID0gcmVpc2VyZnNfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBjbG9uZSk7CisgICAgICAgICAgICAgICAgaWYgKGxvY2spCisgICAgICAgICAgICAgICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOworICAgICAgICAgICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cl9pIChpbm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UoY2xvbmUpOworICAgICAgICByZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQKK3Bvc2l4X2FjbF9hY2Nlc3NfZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJaWYgKHN0cmxlbihuYW1lKSAhPSBzaXplb2YoWEFUVFJfTkFNRV9BQ0xfQUNDRVNTKS0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4geGF0dHJfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50Citwb3NpeF9hY2xfYWNjZXNzX3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlpZiAoc3RybGVuKG5hbWUpICE9IHNpemVvZihYQVRUUl9OQU1FX0FDTF9BQ0NFU1MpLTEpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiB4YXR0cl9zZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIHZhbHVlLCBzaXplKTsKK30KKworc3RhdGljIGludAorcG9zaXhfYWNsX2FjY2Vzc19kZWwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKnJlaXNlcmZzX2kgPSBSRUlTRVJGU19JKGlub2RlKTsKKyAgICBzdHJ1Y3QgcG9zaXhfYWNsICoqYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2FjY2VzczsKKyAgICBpZiAoc3RybGVuKG5hbWUpICE9IHNpemVvZihYQVRUUl9OQU1FX0FDTF9BQ0NFU1MpLTEpCisJcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKCFJU19FUlIgKCphY2wpICYmICphY2wpIHsKKyAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UgKCphY2wpOworICAgICAgICAqYWNsID0gRVJSX1BUUiAoLUVOT0RBVEEpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Citwb3NpeF9hY2xfYWNjZXNzX2xpc3QgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBjaGFyICpvdXQpCit7CisgICAgaW50IGxlbiA9IG5hbWVsZW47CisgICAgaWYgKCFyZWlzZXJmc19wb3NpeGFjbCAoaW5vZGUtPmlfc2IpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAob3V0KQorICAgICAgICBtZW1jcHkgKG91dCwgbmFtZSwgbGVuKTsKKworICAgIHJldHVybiBsZW47Cit9CisKK3N0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyIHBvc2l4X2FjbF9hY2Nlc3NfaGFuZGxlciA9IHsKKwkucHJlZml4ID0gWEFUVFJfTkFNRV9BQ0xfQUNDRVNTLAorCS5nZXQgPSBwb3NpeF9hY2xfYWNjZXNzX2dldCwKKwkuc2V0ID0gcG9zaXhfYWNsX2FjY2Vzc19zZXQsCisJLmRlbCA9IHBvc2l4X2FjbF9hY2Nlc3NfZGVsLAorCS5saXN0ID0gcG9zaXhfYWNsX2FjY2Vzc19saXN0LAorfTsKKworc3RhdGljIGludAorcG9zaXhfYWNsX2RlZmF1bHRfZ2V0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoc3RybGVuKG5hbWUpICE9IHNpemVvZihYQVRUUl9OQU1FX0FDTF9ERUZBVUxUKS0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4geGF0dHJfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgYnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIGludAorcG9zaXhfYWNsX2RlZmF1bHRfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlpZiAoc3RybGVuKG5hbWUpICE9IHNpemVvZihYQVRUUl9OQU1FX0FDTF9ERUZBVUxUKS0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4geGF0dHJfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgdmFsdWUsIHNpemUpOworfQorCitzdGF0aWMgaW50Citwb3NpeF9hY2xfZGVmYXVsdF9kZWwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKnJlaXNlcmZzX2kgPSBSRUlTRVJGU19JKGlub2RlKTsKKyAgICBzdHJ1Y3QgcG9zaXhfYWNsICoqYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2RlZmF1bHQ7CisgICAgaWYgKHN0cmxlbihuYW1lKSAhPSBzaXplb2YoWEFUVFJfTkFNRV9BQ0xfREVGQVVMVCktMSkKKwlyZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAoIUlTX0VSUiAoKmFjbCkgJiYgKmFjbCkgeworICAgICAgICBwb3NpeF9hY2xfcmVsZWFzZSAoKmFjbCk7CisgICAgICAgICphY2wgPSBFUlJfUFRSICgtRU5PREFUQSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Bvc2l4X2FjbF9kZWZhdWx0X2xpc3QgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBjaGFyICpvdXQpCit7CisgICAgaW50IGxlbiA9IG5hbWVsZW47CisgICAgaWYgKCFyZWlzZXJmc19wb3NpeGFjbCAoaW5vZGUtPmlfc2IpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAob3V0KQorICAgICAgICBtZW1jcHkgKG91dCwgbmFtZSwgbGVuKTsKKworICAgIHJldHVybiBsZW47Cit9CisKK3N0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyIHBvc2l4X2FjbF9kZWZhdWx0X2hhbmRsZXIgPSB7CisJLnByZWZpeCA9IFhBVFRSX05BTUVfQUNMX0RFRkFVTFQsCisJLmdldCA9IHBvc2l4X2FjbF9kZWZhdWx0X2dldCwKKwkuc2V0ID0gcG9zaXhfYWNsX2RlZmF1bHRfc2V0LAorCS5kZWwgPSBwb3NpeF9hY2xfZGVmYXVsdF9kZWwsCisJLmxpc3QgPSBwb3NpeF9hY2xfZGVmYXVsdF9saXN0LAorfTsKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3hhdHRyX3NlY3VyaXR5LmMgYi9mcy9yZWlzZXJmcy94YXR0cl9zZWN1cml0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNDRkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy94YXR0cl9zZWN1cml0eS5jCkBAIC0wLDAgKzEsNjkgQEAKKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc194YXR0ci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgWEFUVFJfU0VDVVJJVFlfUFJFRklYICJzZWN1cml0eS4iCisKK3N0YXRpYyBpbnQKK3NlY3VyaXR5X2dldCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCkpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkKKyAgICAgICAgcmV0dXJuIC1FUEVSTTsKKworICAgIHJldHVybiByZWlzZXJmc194YXR0cl9nZXQgKGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50CitzZWN1cml0eV9zZXQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworICAgIGlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfU0VDVVJJVFlfUFJFRklYKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgcmV0dXJuIHJlaXNlcmZzX3hhdHRyX3NldCAoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSwgZmxhZ3MpOworfQorCitzdGF0aWMgaW50CitzZWN1cml0eV9kZWwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9TRUNVUklUWV9QUkVGSVgpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpCisgICAgICAgIHJldHVybiAtRVBFUk07CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2VjdXJpdHlfbGlzdCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGNoYXIgKm91dCkKK3sKKyAgICBpbnQgbGVuID0gbmFtZWxlbjsKKworICAgIGlmIChpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKG91dCkKKyAgICAgICAgbWVtY3B5IChvdXQsIG5hbWUsIGxlbik7CisKKyAgICByZXR1cm4gbGVuOworfQorCisKK3N0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyIHNlY3VyaXR5X2hhbmRsZXIgPSB7CisJLnByZWZpeCA9IFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwKKwkuZ2V0ID0gc2VjdXJpdHlfZ2V0LAorCS5zZXQgPSBzZWN1cml0eV9zZXQsCisJLmRlbCA9IHNlY3VyaXR5X2RlbCwKKwkubGlzdCA9IHNlY3VyaXR5X2xpc3QsCit9OwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMveGF0dHJfdHJ1c3RlZC5jIGIvZnMvcmVpc2VyZnMveGF0dHJfdHJ1c3RlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNzYyMTkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy94YXR0cl90cnVzdGVkLmMKQEAgLTAsMCArMSw4MSBAQAorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX3hhdHRyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBYQVRUUl9UUlVTVEVEX1BSRUZJWCAidHJ1c3RlZC4iCisKK3N0YXRpYyBpbnQKK3RydXN0ZWRfZ2V0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworICAgIGlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfVFJVU1RFRF9QUkVGSVgpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmICghcmVpc2VyZnNfeGF0dHJzIChpbm9kZS0+aV9zYikpCisgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKworICAgIGlmICghKGNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKSkKKyAgICAgICAgcmV0dXJuIC1FUEVSTTsKKworICAgIHJldHVybiByZWlzZXJmc194YXR0cl9nZXQgKGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50Cit0cnVzdGVkX3NldCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmZmVyLAorICAgICAgICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisgICAgaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9UUlVTVEVEX1BSRUZJWCkpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKCFyZWlzZXJmc194YXR0cnMgKGlub2RlLT5pX3NiKSkKKyAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCisgICAgaWYgKCEoY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgcmV0dXJuIHJlaXNlcmZzX3hhdHRyX3NldCAoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSwgZmxhZ3MpOworfQorCitzdGF0aWMgaW50Cit0cnVzdGVkX2RlbCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1RSVVNURURfUFJFRklYKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoIXJlaXNlcmZzX3hhdHRycyAoaW5vZGUtPmlfc2IpKQorICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisKKyAgICBpZiAoIShjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8IGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkpCisgICAgICAgIHJldHVybiAtRVBFUk07CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAordHJ1c3RlZF9saXN0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgY2hhciAqb3V0KQoreworICAgIGludCBsZW4gPSBuYW1lbGVuOworCisgICAgaWYgKCFyZWlzZXJmc194YXR0cnMgKGlub2RlLT5pX3NiKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIShjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8IGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKG91dCkKKyAgICAgICAgbWVtY3B5IChvdXQsIG5hbWUsIGxlbik7CisKKyAgICByZXR1cm4gbGVuOworfQorCisKK3N0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyIHRydXN0ZWRfaGFuZGxlciA9IHsKKwkucHJlZml4ID0gWEFUVFJfVFJVU1RFRF9QUkVGSVgsCisJLmdldCA9IHRydXN0ZWRfZ2V0LAorCS5zZXQgPSB0cnVzdGVkX3NldCwKKwkuZGVsID0gdHJ1c3RlZF9kZWwsCisJLmxpc3QgPSB0cnVzdGVkX2xpc3QsCit9OwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMveGF0dHJfdXNlci5jIGIvZnMvcmVpc2VyZnMveGF0dHJfdXNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NzI4MDYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy94YXR0cl91c2VyLmMKQEAgLTAsMCArMSw5OSBAQAorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX3hhdHRyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmZGVmIENPTkZJR19SRUlTRVJGU19GU19QT1NJWF9BQ0wKKyMgaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfYWNsLmg+CisjZW5kaWYKKworI2RlZmluZSBYQVRUUl9VU0VSX1BSRUZJWCAidXNlci4iCisKK3N0YXRpYyBpbnQKK3VzZXJfZ2V0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCisgICAgaW50IGVycm9yOworCisgICAgaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9VU0VSX1BSRUZJWCkpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKCFyZWlzZXJmc194YXR0cnNfdXNlciAoaW5vZGUtPmlfc2IpKQorICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisKKyAgICBlcnJvciA9IHJlaXNlcmZzX3Blcm1pc3Npb25fbG9ja2VkIChpbm9kZSwgTUFZX1JFQUQsIE5VTEwpOworICAgIGlmIChlcnJvcikKKyAgICAgICAgcmV0dXJuIGVycm9yOworCisgICAgcmV0dXJuIHJlaXNlcmZzX3hhdHRyX2dldCAoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK3VzZXJfc2V0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpidWZmZXIsCisgICAgICAgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKworICAgIGludCBlcnJvcjsKKworICAgIGlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfVVNFUl9QUkVGSVgpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmICghcmVpc2VyZnNfeGF0dHJzX3VzZXIgKGlub2RlLT5pX3NiKSkKKyAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCisgICAgaWYgKCFTX0lTUkVHIChpbm9kZS0+aV9tb2RlKSAmJgorICAgICAgICAoIVNfSVNESVIgKGlub2RlLT5pX21vZGUpIHx8IGlub2RlLT5pX21vZGUgJiBTX0lTVlRYKSkKKyAgICAgICAgcmV0dXJuIC1FUEVSTTsKKworICAgIGVycm9yID0gcmVpc2VyZnNfcGVybWlzc2lvbl9sb2NrZWQgKGlub2RlLCBNQVlfV1JJVEUsIE5VTEwpOworICAgIGlmIChlcnJvcikKKyAgICAgICAgcmV0dXJuIGVycm9yOworCisgICAgcmV0dXJuIHJlaXNlcmZzX3hhdHRyX3NldCAoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSwgZmxhZ3MpOworfQorCitzdGF0aWMgaW50Cit1c2VyX2RlbCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBpbnQgZXJyb3I7CisKKyAgICBpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1VTRVJfUFJFRklYKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoIXJlaXNlcmZzX3hhdHRyc191c2VyIChpbm9kZS0+aV9zYikpCisgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKworICAgIGlmICghU19JU1JFRyAoaW5vZGUtPmlfbW9kZSkgJiYKKyAgICAgICAgKCFTX0lTRElSIChpbm9kZS0+aV9tb2RlKSB8fCBpbm9kZS0+aV9tb2RlICYgU19JU1ZUWCkpCisgICAgICAgIHJldHVybiAtRVBFUk07CisKKyAgICBlcnJvciA9IHJlaXNlcmZzX3Blcm1pc3Npb25fbG9ja2VkIChpbm9kZSwgTUFZX1dSSVRFLCBOVUxMKTsKKyAgICBpZiAoZXJyb3IpCisgICAgICAgIHJldHVybiBlcnJvcjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit1c2VyX2xpc3QgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBjaGFyICpvdXQpCit7CisgICAgaW50IGxlbiA9IG5hbWVsZW47CisgICAgaWYgKCFyZWlzZXJmc194YXR0cnNfdXNlciAoaW5vZGUtPmlfc2IpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChvdXQpCisgICAgICAgIG1lbWNweSAob3V0LCBuYW1lLCBsZW4pOworCisgICAgcmV0dXJuIGxlbjsKK30KKworc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgdXNlcl9oYW5kbGVyID0geworCS5wcmVmaXggPSBYQVRUUl9VU0VSX1BSRUZJWCwKKwkuZ2V0ID0gdXNlcl9nZXQsCisJLnNldCA9IHVzZXJfc2V0LAorCS5kZWwgPSB1c2VyX2RlbCwKKwkubGlzdCA9IHVzZXJfbGlzdCwKK307CmRpZmYgLS1naXQgYS9mcy9yb21mcy9NYWtlZmlsZSBiL2ZzL3JvbWZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NWIyMWMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yb21mcy9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCByb21mcyBmaWxlc3lzdGVtIHJvdXRpbmVzLgorIworCitvYmotJChDT05GSUdfUk9NRlNfRlMpICs9IHJvbWZzLm8KKworcm9tZnMtb2JqcyA6PSBpbm9kZS5vCmRpZmYgLS1naXQgYS9mcy9yb21mcy9pbm9kZS5jIGIvZnMvcm9tZnMvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzRmMzgyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcm9tZnMvaW5vZGUuYwpAQCAtMCwwICsxLDY0OCBAQAorLyoKKyAqIFJPTUZTIGZpbGUgc3lzdGVtLCBMaW51eCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ny0xOTk5ICBKYW5vcyBGYXJrYXMgPGNoZXh1bUBzaGFkb3cuYmFua2kuaHU+CisgKgorICogVXNpbmcgcGFydHMgb2YgdGhlIG1pbml4IGZpbGVzeXN0ZW0KKyAqIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiBhbmQgcGFydHMgb2YgdGhlIGFmZnMgZmlsZXN5c3RlbSBhZGRpdGlvbmFsbHkKKyAqIENvcHlyaWdodCAoQykgMTk5MyAgUmF5IEJ1cnIKKyAqIENvcHlyaWdodCAoQykgMTk5NiAgSGFucy1Kb2FjaGltIFdpZG1haWVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDaGFuZ2VzCisgKgkJCQkJQ2hhbmdlZCBmb3IgMi4xLjE5IG1vZHVsZXMKKyAqCUphbiAxOTk3CQkJSW5pdGlhbCByZWxlYXNlCisgKglKdW4gMTk5NwkJCTIuMS40MysgY2hhbmdlcworICoJCQkJCVByb3BlciBwYWdlIGxvY2tpbmcgaW4gcmVhZHBhZ2UKKyAqCQkJCQlDaGFuZ2VkIHRvIHdvcmsgd2l0aCAyLjEuNDUrIGZzCisgKglKdWwgMTk5NwkJCUZpeGVkIGZvbGxvd19saW5rCisgKgkJCTIuMS40NworICoJCQkJCWxvb2t1cCBzaG91bGRuJ3QgcmV0dXJuIC1FTk9FTlQKKyAqCQkJCQlmcm9tIEhvcnN0IHZvbiBCcmFuZDoKKyAqCQkJCQkgIGZhaWwgb24gd3JvbmcgY2hlY2tzdW0KKyAqCQkJCQkgIGRvdWJsZSB1bmxvY2tfc3VwZXIgd2FzIHBvc3NpYmxlCisgKgkJCQkJICBjb3JyZWN0IG5hbWVsZW4gZm9yIHN0YXRmcworICoJCQkJCXNwb3R0ZWQgYnkgQmlsbCBIYXdlczoKKyAqCQkJCQkgIHJlYWRsaW5rIHNob3VsZG4ndCBpcHV0KCkKKyAqCUp1biAxOTk4CTIuMS4xMDYJCWZyb20gQXZlcnkgUGVubmFydW46IGdsaWJjIHNjYW5kaXIoKQorICoJCQkJCSAgZXhwb3NlZCBhIHByb2JsZW0gaW4gcmVhZGRpcgorICoJCQkyLjEuMTA3CQljb2RlLWZyZWV6ZSBzcGVsbGNoZWNrZXIgcnVuCisgKglBdWcgMTk5OAkJCTIuMS4xMTgrIFZGUyBjaGFuZ2VzCisgKglTZXAgMTk5OAkyLjEuMTIyCQlhbm90aGVyIFZGUyBjaGFuZ2UgKGZvbGxvd19saW5rKQorICoJQXByIDE5OTkJMi4yLjcJCW5vIG1vcmUgRUJBREYgY2hlY2tpbmcgaW4KKyAqCQkJCQkgIGxvb2t1cC9yZWFkZGlyLCB1c2UgRVJSX1BUUgorICoJSnVuIDE5OTkJMi4zLjYJCWRfYWxsb2Nfcm9vdCB1c2UgY2hhbmdlZAorICoJCQkyLjMuOQkJY2xlYW4gdXAgdXNhZ2Ugb2YgRU5PRU5UL25lZ2F0aXZlCisgKgkJCQkJICBkZW50cmllcyBpbiBsb29rdXAKKyAqCQkJCQljbGVhbiB1cCBwYWdlIGZsYWdzIHNldHRpbmcKKyAqCQkJCQkgIChlcnJvciwgdXB0b2RhdGUsIGxvY2tpbmcpIGluCisgKgkJCQkJICBpbiByZWFkcGFnZQorICoJCQkJCXVzZSBpbml0X3NwZWNpYWxfaW5vZGUgZm9yCisgKgkJCQkJICBmaWZvcy9zb2NrZXRzIChhbmQgc3RyZWFtbGluZSkgaW4KKyAqCQkJCQkgIHJlYWRfaW5vZGUsIGZpeCBfb3BzIHRhYmxlIG9yZGVyCisgKglBdWcgMTk5OQkyLjMuMTYJCV9faW5pdGZ1bmMoKSA9PiBfX2luaXQgY2hhbmdlCisgKglPY3QgMTk5OQkyLjMuMjQJCXBhZ2UtPm93bmVyIGhhY2sgb2Jzb2xldGVkCisgKglOb3YgMTk5OQkyLjMuMjcJCTIuMy4yNSsgcGFnZS0+b2Zmc2V0ID0+IGluZGV4IGNoYW5nZQorICovCisKKy8qIHRvZG86CisgKgktIHNlZSBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3JvbWZzLnR4dAorICoJLSB1c2UgYWxsb2NhdGVkLCBub3Qgc3RhY2sgbWVtb3J5IGZvciBmaWxlIG5hbWVzPworICoJLSBjb25zaWRlcmluZyB3cml0ZSBhY2Nlc3MuLi4KKyAqCS0gbmV0d29yayAodGZ0cCkgZmlsZXM/CisgKgktIG1lcmdlIGJhY2sgc29tZSBfb3AgdGFibGVzCisgKi8KKworLyoKKyAqIFNvcnJ5IGFib3V0IHNvbWUgb3B0aW1pemF0aW9ucyBhbmQgZm9yIHNvbWUgZ290bydzLiAgSSBqdXN0IHdhbnRlZAorICogdG8gc3F1ZWV6ZSBzb21lIG1vcmUgYnl0ZXMgb3V0IG9mIHRoaXMgY29kZS4uIDopCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcm9tZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RydWN0IHJvbWZzX2lub2RlX2luZm8geworCXVuc2lnbmVkIGxvbmcgaV9tZXRhc2l6ZTsJLyogc2l6ZSBvZiBub24tZGF0YSBhcmVhICovCisJdW5zaWduZWQgbG9uZyBpX2RhdGFvZmZzZXQ7CS8qIGZyb20gdGhlIHN0YXJ0IG9mIGZzICovCisJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKK307CisKKy8qIGluc3RlYWQgb2YgcHJpdmF0ZSBzdXBlcmJsb2NrIGRhdGEgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByb21mc19tYXhzaXplKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKXNiLT5zX2ZzX2luZm87Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJvbWZzX2lub2RlX2luZm8gKlJPTUZTX0koc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gbGlzdF9lbnRyeShpbm9kZSwgc3RydWN0IHJvbWZzX2lub2RlX2luZm8sIHZmc19pbm9kZSk7Cit9CisKK3N0YXRpYyBfX3UzMgorcm9tZnNfY2hlY2tzdW0odm9pZCAqZGF0YSwgaW50IHNpemUpCit7CisJX191MzIgc3VtOworCV9fYmUzMiAqcHRyOworCisJc3VtID0gMDsgcHRyID0gZGF0YTsKKwlzaXplPj49MjsKKwl3aGlsZSAoc2l6ZT4wKSB7CisJCXN1bSArPSBiZTMyX3RvX2NwdSgqcHRyKyspOworCQlzaXplLS07CisJfQorCXJldHVybiBzdW07Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyByb21mc19vcHM7CisKK3N0YXRpYyBpbnQgcm9tZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3Qgcm9tZnNfc3VwZXJfYmxvY2sgKnJzYjsKKwlzdHJ1Y3QgaW5vZGUgKnJvb3Q7CisJaW50IHN6OworCisJLyogSSB3b3VsZCBwYXJzZSB0aGUgb3B0aW9ucyBoZXJlLCBidXQgdGhlcmUgYXJlIG5vbmUuLiA6KSAqLworCisJc2Jfc2V0X2Jsb2Nrc2l6ZShzLCBST01CU0laRSk7CisJcy0+c19tYXhieXRlcyA9IDB4RkZGRkZGRkY7CisKKwliaCA9IHNiX2JyZWFkKHMsIDApOworCWlmICghYmgpIHsKKwkJLyogWFhYIG1lcmdlIHdpdGggb3RoZXIgcHJpbnRrPyAqLworICAgICAgICAgICAgICAgIHByaW50ayAoInJvbWZzOiB1bmFibGUgdG8gcmVhZCBzdXBlcmJsb2NrXG4iKTsKKwkJZ290byBvdXRub2JoOworCX0KKworCXJzYiA9IChzdHJ1Y3Qgcm9tZnNfc3VwZXJfYmxvY2sgKiliaC0+Yl9kYXRhOworCXN6ID0gYmUzMl90b19jcHUocnNiLT5zaXplKTsKKwlpZiAocnNiLT53b3JkMCAhPSBST01TQl9XT1JEMCB8fCByc2ItPndvcmQxICE9IFJPTVNCX1dPUkQxCisJICAgfHwgc3ogPCBST01GSF9TSVpFKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrICgiVkZTOiBDYW4ndCBmaW5kIGEgcm9tZnMgZmlsZXN5c3RlbSBvbiBkZXYgIgorCQkJCSIlcy5cbiIsIHMtPnNfaWQpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHJvbWZzX2NoZWNrc3VtKHJzYiwgbWluX3QoaW50LCBzeiwgNTEyKSkpIHsKKwkJcHJpbnRrICgicm9tZnM6IGJhZCBpbml0aWFsIGNoZWNrc3VtIG9uIGRldiAiCisJCQkiJXMuXG4iLCBzLT5zX2lkKTsKKwkJZ290byBvdXQ7CisJfQorCisJcy0+c19tYWdpYyA9IFJPTUZTX01BR0lDOworCXMtPnNfZnNfaW5mbyA9ICh2b2lkICopKGxvbmcpc3o7CisKKwlzLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKworCS8qIEZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBmcyAqLworCXN6ID0gKFJPTUZIX1NJWkUgKworCSAgICAgIHN0cm5sZW4ocnNiLT5uYW1lLCBST01GU19NQVhGTikgKyAxICsgUk9NRkhfUEFEKQorCSAgICAgJiBST01GSF9NQVNLOworCisJcy0+c19vcAk9ICZyb21mc19vcHM7CisJcm9vdCA9IGlnZXQocywgc3opOworCWlmICghcm9vdCkKKwkJZ290byBvdXQ7CisKKwlzLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CisJaWYgKCFzLT5zX3Jvb3QpCisJCWdvdG8gb3V0aXB1dDsKKworCWJyZWxzZShiaCk7CisJcmV0dXJuIDA7CisKK291dGlwdXQ6CisJaXB1dChyb290KTsKK291dDoKKwlicmVsc2UoYmgpOworb3V0bm9iaDoKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogVGhhdCdzIHNpbXBsZSB0b28uICovCisKK3N0YXRpYyBpbnQKK3JvbWZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCWJ1Zi0+Zl90eXBlID0gUk9NRlNfTUFHSUM7CisJYnVmLT5mX2JzaXplID0gUk9NQlNJWkU7CisJYnVmLT5mX2JmcmVlID0gYnVmLT5mX2JhdmFpbCA9IGJ1Zi0+Zl9mZnJlZTsKKwlidWYtPmZfYmxvY2tzID0gKHJvbWZzX21heHNpemUoc2IpK1JPTUJTSVpFLTEpPj5ST01CU0JJVFM7CisJYnVmLT5mX25hbWVsZW4gPSBST01GU19NQVhGTjsKKwlyZXR1cm4gMDsKK30KKworLyogc29tZSBoZWxwZXIgcm91dGluZXMgKi8KKworc3RhdGljIGludAorcm9tZnNfc3RybmxlbihzdHJ1Y3QgaW5vZGUgKmksIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJdW5zaWduZWQgbG9uZyBhdmFpbCwgbWF4c2l6ZSwgcmVzOworCisJbWF4c2l6ZSA9IHJvbWZzX21heHNpemUoaS0+aV9zYik7CisJaWYgKG9mZnNldCA+PSBtYXhzaXplKQorCQlyZXR1cm4gLTE7CisKKwkvKiBzdHJubGVuIGlzIGFsbW9zdCBhbHdheXMgdmFsaWQgKi8KKwlpZiAoY291bnQgPiBtYXhzaXplIHx8IG9mZnNldCtjb3VudCA+IG1heHNpemUpCisJCWNvdW50ID0gbWF4c2l6ZS1vZmZzZXQ7CisKKwliaCA9IHNiX2JyZWFkKGktPmlfc2IsIG9mZnNldD4+Uk9NQlNCSVRTKTsKKwlpZiAoIWJoKQorCQlyZXR1cm4gLTE7CQkvKiBlcnJvciAqLworCisJYXZhaWwgPSBST01CU0laRSAtIChvZmZzZXQgJiBST01CTUFTSyk7CisJbWF4c2l6ZSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGNvdW50LCBhdmFpbCk7CisJcmVzID0gc3RybmxlbigoKGNoYXIgKiliaC0+Yl9kYXRhKSsob2Zmc2V0JlJPTUJNQVNLKSwgbWF4c2l6ZSk7CisJYnJlbHNlKGJoKTsKKworCWlmIChyZXMgPCBtYXhzaXplKQorCQlyZXR1cm4gcmVzOwkJLyogZm91bmQgYWxsIG9mIGl0ICovCisKKwl3aGlsZSAocmVzIDwgY291bnQpIHsKKwkJb2Zmc2V0ICs9IG1heHNpemU7CisKKwkJYmggPSBzYl9icmVhZChpLT5pX3NiLCBvZmZzZXQ+PlJPTUJTQklUUyk7CisJCWlmICghYmgpCisJCQlyZXR1cm4gLTE7CisJCW1heHNpemUgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBjb3VudCAtIHJlcywgUk9NQlNJWkUpOworCQlhdmFpbCA9IHN0cm5sZW4oYmgtPmJfZGF0YSwgbWF4c2l6ZSk7CisJCXJlcyArPSBhdmFpbDsKKwkJYnJlbHNlKGJoKTsKKwkJaWYgKGF2YWlsIDwgbWF4c2l6ZSkKKwkJCXJldHVybiByZXM7CisJfQorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQKK3JvbWZzX2NvcHlmcm9tKHN0cnVjdCBpbm9kZSAqaSwgdm9pZCAqZGVzdCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwl1bnNpZ25lZCBsb25nIGF2YWlsLCBtYXhzaXplLCByZXM7CisKKwltYXhzaXplID0gcm9tZnNfbWF4c2l6ZShpLT5pX3NiKTsKKwlpZiAob2Zmc2V0ID49IG1heHNpemUgfHwgY291bnQgPiBtYXhzaXplIHx8IG9mZnNldCtjb3VudD5tYXhzaXplKQorCQlyZXR1cm4gLTE7CisKKwliaCA9IHNiX2JyZWFkKGktPmlfc2IsIG9mZnNldD4+Uk9NQlNCSVRTKTsKKwlpZiAoIWJoKQorCQlyZXR1cm4gLTE7CQkvKiBlcnJvciAqLworCisJYXZhaWwgPSBST01CU0laRSAtIChvZmZzZXQgJiBST01CTUFTSyk7CisJbWF4c2l6ZSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGNvdW50LCBhdmFpbCk7CisJbWVtY3B5KGRlc3QsICgoY2hhciAqKWJoLT5iX2RhdGEpICsgKG9mZnNldCAmIFJPTUJNQVNLKSwgbWF4c2l6ZSk7CisJYnJlbHNlKGJoKTsKKworCXJlcyA9IG1heHNpemU7CQkJLyogYWxsIG9mIGl0ICovCisKKwl3aGlsZSAocmVzIDwgY291bnQpIHsKKwkJb2Zmc2V0ICs9IG1heHNpemU7CisJCWRlc3QgKz0gbWF4c2l6ZTsKKworCQliaCA9IHNiX2JyZWFkKGktPmlfc2IsIG9mZnNldD4+Uk9NQlNCSVRTKTsKKwkJaWYgKCFiaCkKKwkJCXJldHVybiAtMTsKKwkJbWF4c2l6ZSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGNvdW50IC0gcmVzLCBST01CU0laRSk7CisJCW1lbWNweShkZXN0LCBiaC0+Yl9kYXRhLCBtYXhzaXplKTsKKwkJYnJlbHNlKGJoKTsKKwkJcmVzICs9IG1heHNpemU7CisJfQorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJvbWZzX2R0eXBlX3RhYmxlW10gPSB7CisJRFRfVU5LTk9XTiwgRFRfRElSLCBEVF9SRUcsIERUX0xOSywgRFRfQkxLLCBEVF9DSFIsIERUX1NPQ0ssIERUX0ZJRk8KK307CisKK3N0YXRpYyBpbnQKK3JvbWZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGlub2RlICppID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHJvbWZzX2lub2RlIHJpOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBtYXhvZmY7CisJaW50IGosIGlubywgbmV4dGZoOworCWludCBzdG9yZWQgPSAwOworCWNoYXIgZnNuYW1lW1JPTUZTX01BWEZOXTsJLyogWFhYIGR5bmFtaWM/ICovCisKKwlsb2NrX2tlcm5lbCgpOworCisJbWF4b2ZmID0gcm9tZnNfbWF4c2l6ZShpLT5pX3NiKTsKKworCW9mZnNldCA9IGZpbHAtPmZfcG9zOworCWlmICghb2Zmc2V0KSB7CisJCW9mZnNldCA9IGktPmlfaW5vICYgUk9NRkhfTUFTSzsKKwkJaWYgKHJvbWZzX2NvcHlmcm9tKGksICZyaSwgb2Zmc2V0LCBST01GSF9TSVpFKSA8PSAwKQorCQkJZ290byBvdXQ7CisJCW9mZnNldCA9IGJlMzJfdG9fY3B1KHJpLnNwZWMpICYgUk9NRkhfTUFTSzsKKwl9CisKKwkvKiBOb3QgcmVhbGx5IGZhaWxzYWZlLCBidXQgd2UgYXJlIHJlYWQtb25seS4uLiAqLworCWZvcig7OykgeworCQlpZiAoIW9mZnNldCB8fCBvZmZzZXQgPj0gbWF4b2ZmKSB7CisJCQlvZmZzZXQgPSBtYXhvZmY7CisJCQlmaWxwLT5mX3BvcyA9IG9mZnNldDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZpbHAtPmZfcG9zID0gb2Zmc2V0OworCisJCS8qIEZldGNoIGlub2RlIGluZm8gKi8KKwkJaWYgKHJvbWZzX2NvcHlmcm9tKGksICZyaSwgb2Zmc2V0LCBST01GSF9TSVpFKSA8PSAwKQorCQkJZ290byBvdXQ7CisKKwkJaiA9IHJvbWZzX3N0cm5sZW4oaSwgb2Zmc2V0K1JPTUZIX1NJWkUsIHNpemVvZihmc25hbWUpLTEpOworCQlpZiAoaiA8IDApCisJCQlnb3RvIG91dDsKKworCQlmc25hbWVbal09MDsKKwkJcm9tZnNfY29weWZyb20oaSwgZnNuYW1lLCBvZmZzZXQrUk9NRkhfU0laRSwgaik7CisKKwkJaW5vID0gb2Zmc2V0OworCQluZXh0ZmggPSBiZTMyX3RvX2NwdShyaS5uZXh0KTsKKwkJaWYgKChuZXh0ZmggJiBST01GSF9UWVBFKSA9PSBST01GSF9IUkQpCisJCQlpbm8gPSBiZTMyX3RvX2NwdShyaS5zcGVjKTsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCBmc25hbWUsIGosIG9mZnNldCwgaW5vLAorCQkJICAgIHJvbWZzX2R0eXBlX3RhYmxlW25leHRmaCAmIFJPTUZIX1RZUEVdKSA8IDApIHsKKwkJCWdvdG8gb3V0OworCQl9CisJCXN0b3JlZCsrOworCQlvZmZzZXQgPSBuZXh0ZmggJiBST01GSF9NQVNLOworCX0KK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHN0b3JlZDsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKgorcm9tZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBtYXhvZmY7CisJaW50IGZzbGVuLCByZXM7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwljaGFyIGZzbmFtZVtST01GU19NQVhGTl07CS8qIFhYWCBkeW5hbWljPyAqLworCXN0cnVjdCByb21mc19pbm9kZSByaTsKKwljb25zdCBjaGFyICpuYW1lOwkJLyogZ290IGZyb20gZGVudHJ5ICovCisJaW50IGxlbjsKKworCXJlcyA9IC1FQUNDRVM7CQkJLyogcGxhY2Vob2xkZXIgZm9yICJubyBkYXRhIGhlcmUiICovCisJb2Zmc2V0ID0gZGlyLT5pX2lubyAmIFJPTUZIX01BU0s7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAocm9tZnNfY29weWZyb20oZGlyLCAmcmksIG9mZnNldCwgUk9NRkhfU0laRSkgPD0gMCkKKwkJZ290byBvdXQ7CisKKwltYXhvZmYgPSByb21mc19tYXhzaXplKGRpci0+aV9zYik7CisJb2Zmc2V0ID0gYmUzMl90b19jcHUocmkuc3BlYykgJiBST01GSF9NQVNLOworCisJLyogT0ssIG5vdyBmaW5kIHRoZSBmaWxlIHdob3NlIG5hbWUgaXMgaW4gImRlbnRyeSIgaW4gdGhlCisJICogZGlyZWN0b3J5IHNwZWNpZmllZCBieSAiZGlyIi4gICovCisKKwluYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwlsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisKKwlmb3IoOzspIHsKKwkJaWYgKCFvZmZzZXQgfHwgb2Zmc2V0ID49IG1heG9mZikKKwkJCWdvdG8gb3V0MDsKKwkJaWYgKHJvbWZzX2NvcHlmcm9tKGRpciwgJnJpLCBvZmZzZXQsIFJPTUZIX1NJWkUpIDw9IDApCisJCQlnb3RvIG91dDsKKworCQkvKiB0cnkgdG8gbWF0Y2ggdGhlIGZpcnN0IDE2IGJ5dGVzIG9mIG5hbWUgKi8KKwkJZnNsZW4gPSByb21mc19zdHJubGVuKGRpciwgb2Zmc2V0K1JPTUZIX1NJWkUsIFJPTUZIX1NJWkUpOworCQlpZiAobGVuIDwgUk9NRkhfU0laRSkgeworCQkJaWYgKGxlbiA9PSBmc2xlbikgeworCQkJCS8qIGJvdGggYXJlIHNob3J0ZXIsIGFuZCBzYW1lIHNpemUgKi8KKwkJCQlyb21mc19jb3B5ZnJvbShkaXIsIGZzbmFtZSwgb2Zmc2V0K1JPTUZIX1NJWkUsIGxlbisxKTsKKwkJCQlpZiAoc3RybmNtcCAobmFtZSwgZnNuYW1lLCBsZW4pID09IDApCisJCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKGZzbGVuID49IFJPTUZIX1NJWkUpIHsKKwkJCS8qIGJvdGggYXJlIGxvbmdlcjsgWFhYIG9wdGltaXplIG1heCBzaXplICovCisJCQlmc2xlbiA9IHJvbWZzX3N0cm5sZW4oZGlyLCBvZmZzZXQrUk9NRkhfU0laRSwgc2l6ZW9mKGZzbmFtZSktMSk7CisJCQlpZiAobGVuID09IGZzbGVuKSB7CisJCQkJcm9tZnNfY29weWZyb20oZGlyLCBmc25hbWUsIG9mZnNldCtST01GSF9TSVpFLCBsZW4rMSk7CisJCQkJaWYgKHN0cm5jbXAobmFtZSwgZnNuYW1lLCBsZW4pID09IDApCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qIG5leHQgZW50cnkgKi8KKwkJb2Zmc2V0ID0gYmUzMl90b19jcHUocmkubmV4dCkgJiBST01GSF9NQVNLOworCX0KKworCS8qIEhhcmQgbGluayBoYW5kbGluZyAqLworCWlmICgoYmUzMl90b19jcHUocmkubmV4dCkgJiBST01GSF9UWVBFKSA9PSBST01GSF9IUkQpCisJCW9mZnNldCA9IGJlMzJfdG9fY3B1KHJpLnNwZWMpICYgUk9NRkhfTUFTSzsKKworCWlmICgoaW5vZGUgPSBpZ2V0KGRpci0+aV9zYiwgb2Zmc2V0KSkpCisJCWdvdG8gb3V0aTsKKworCS8qCisJICogaXQncyBhIGJpdCBmdW5reSwgX2xvb2t1cCBuZWVkcyB0byByZXR1cm4gYW4gZXJyb3IgY29kZQorCSAqIChuZWdhdGl2ZSkgb3IgYSBOVUxMLCBib3RoIGFzIGEgZGVudHJ5LiAgRU5PRU5UIHNob3VsZCBub3QKKwkgKiBiZSByZXR1cm5lZCwgaW5zdGVhZCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5lZ2F0aXZlIGRlbnRyeSBieQorCSAqIGRfYWRkKGRlbnRyeSwgTlVMTCk7IGFuZCByZXR1cm4gMCBhcyBubyBlcnJvci4KKwkgKiAoQWx0aG91Z2ggYXMgSSBzZWUsIGl0IG9ubHkgbWF0dGVycyBvbiB3cml0YWJsZSBmaWxlCisJICogc3lzdGVtcykuCisJICovCisKK291dDA6CWlub2RlID0gTlVMTDsKK291dGk6CXJlcyA9IDA7CisJZF9hZGQgKGRlbnRyeSwgaW5vZGUpOworCitvdXQ6CXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gRVJSX1BUUihyZXMpOworfQorCisvKgorICogT2ssIHdlIGRvIHJlYWRwYWdlLCB0byBiZSBhYmxlIHRvIGV4ZWN1dGUgcHJvZ3JhbXMuICBVbmZvcnR1bmF0ZWx5LAorICogd2UgY2FuJ3QgdXNlIGJtYXAsIHNpbmNlIHdlIG1heSBoYXZlIGxvb3NlciBhbGlnbm1lbnRzLgorICovCisKK3N0YXRpYyBpbnQKK3JvbWZzX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqIHBhZ2UpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQsIGF2YWlsLCByZWFkbGVuOworCXZvaWQgKmJ1ZjsKKwlpbnQgcmVzdWx0ID0gLUVJTzsKKworCXBhZ2VfY2FjaGVfZ2V0KHBhZ2UpOworCWxvY2tfa2VybmVsKCk7CisJYnVmID0ga21hcChwYWdlKTsKKwlpZiAoIWJ1ZikKKwkJZ290byBlcnJfb3V0OworCisJLyogMzIgYml0IHdhcm5pbmcgLS0gYnV0IG5vdCBmb3IgdXMgOikgKi8KKwlvZmZzZXQgPSBwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCWlmIChvZmZzZXQgPCBpbm9kZS0+aV9zaXplKSB7CisJCWF2YWlsID0gaW5vZGUtPmlfc2l6ZS1vZmZzZXQ7CisJCXJlYWRsZW4gPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBhdmFpbCwgUEFHRV9TSVpFKTsKKwkJaWYgKHJvbWZzX2NvcHlmcm9tKGlub2RlLCBidWYsIFJPTUZTX0koaW5vZGUpLT5pX2RhdGFvZmZzZXQrb2Zmc2V0LCByZWFkbGVuKSA9PSByZWFkbGVuKSB7CisJCQlpZiAocmVhZGxlbiA8IFBBR0VfU0laRSkgeworCQkJCW1lbXNldChidWYgKyByZWFkbGVuLDAsUEFHRV9TSVpFLXJlYWRsZW4pOworCQkJfQorCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCQkJcmVzdWx0ID0gMDsKKwkJfQorCX0KKwlpZiAocmVzdWx0KSB7CisJCW1lbXNldChidWYsIDAsIFBBR0VfU0laRSk7CisJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwl9CisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisKKwl1bmxvY2tfcGFnZShwYWdlKTsKKworCWt1bm1hcChwYWdlKTsKK2Vycl9vdXQ6CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIE1hcHBpbmcgZnJvbSBvdXIgdHlwZXMgdG8gdGhlIGtlcm5lbCAqLworCitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyByb21mc19hb3BzID0geworCS5yZWFkcGFnZSA9IHJvbWZzX3JlYWRwYWdlCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByb21mc19kaXJfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gcm9tZnNfcmVhZGRpciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyByb21mc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IHJvbWZzX2xvb2t1cCwKK307CisKK3N0YXRpYyBtb2RlX3Qgcm9tZnNfbW9kZW1hcFtdID0KK3sKKwkwLCBTX0lGRElSKzA2NDQsIFNfSUZSRUcrMDY0NCwgU19JRkxOSyswNzc3LAorCVNfSUZCTEsrMDYwMCwgU19JRkNIUiswNjAwLCBTX0lGU09DSyswNjQ0LCBTX0lGSUZPKzA2NDQKK307CisKK3N0YXRpYyB2b2lkCityb21mc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaSkKK3sKKwlpbnQgbmV4dGZoLCBpbm87CisJc3RydWN0IHJvbWZzX2lub2RlIHJpOworCisJaW5vID0gaS0+aV9pbm8gJiBST01GSF9NQVNLOworCWktPmlfbW9kZSA9IDA7CisKKwkvKiBMb29wIGZvciBmaW5kaW5nIHRoZSByZWFsIGhhcmQgbGluayAqLworCWZvcig7OykgeworCQlpZiAocm9tZnNfY29weWZyb20oaSwgJnJpLCBpbm8sIFJPTUZIX1NJWkUpIDw9IDApIHsKKwkJCXByaW50aygicm9tZnM6IHJlYWQgZXJyb3IgZm9yIGlub2RlIDB4JXhcbiIsIGlubyk7CisJCQlyZXR1cm47CisJCX0KKwkJLyogWFhYOiBkbyByb21mc19jaGVja3N1bSBoZXJlIHRvbyAod2l0aCBuYW1lKSAqLworCisJCW5leHRmaCA9IGJlMzJfdG9fY3B1KHJpLm5leHQpOworCQlpZiAoKG5leHRmaCAmIFJPTUZIX1RZUEUpICE9IFJPTUZIX0hSRCkKKwkJCWJyZWFrOworCisJCWlubyA9IGJlMzJfdG9fY3B1KHJpLnNwZWMpICYgUk9NRkhfTUFTSzsKKwl9CisKKwlpLT5pX25saW5rID0gMTsJCS8qIEhhcmQgdG8gZGVjaWRlLi4gKi8KKwlpLT5pX3NpemUgPSBiZTMyX3RvX2NwdShyaS5zaXplKTsKKwlpLT5pX210aW1lLnR2X3NlYyA9IGktPmlfYXRpbWUudHZfc2VjID0gaS0+aV9jdGltZS50dl9zZWMgPSAwOworCWktPmlfbXRpbWUudHZfbnNlYyA9IGktPmlfYXRpbWUudHZfbnNlYyA9IGktPmlfY3RpbWUudHZfbnNlYyA9IDA7CisJaS0+aV91aWQgPSBpLT5pX2dpZCA9IDA7CisKKyAgICAgICAgLyogUHJlY2FsY3VsYXRlIHRoZSBkYXRhIG9mZnNldCAqLworICAgICAgICBpbm8gPSByb21mc19zdHJubGVuKGksIGlubytST01GSF9TSVpFLCBST01GU19NQVhGTik7CisgICAgICAgIGlmIChpbm8gPj0gMCkKKyAgICAgICAgICAgICAgICBpbm8gPSAoKFJPTUZIX1NJWkUraW5vKzErUk9NRkhfUEFEKSZST01GSF9NQVNLKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGlubyA9IDA7CisKKyAgICAgICAgUk9NRlNfSShpKS0+aV9tZXRhc2l6ZSA9IGlubzsKKyAgICAgICAgUk9NRlNfSShpKS0+aV9kYXRhb2Zmc2V0ID0gaW5vKyhpLT5pX2lubyZST01GSF9NQVNLKTsKKworICAgICAgICAvKiBDb21wdXRlIHBlcm1pc3Npb25zICovCisgICAgICAgIGlubyA9IHJvbWZzX21vZGVtYXBbbmV4dGZoICYgUk9NRkhfVFlQRV07CisJLyogb25seSAibm9ybWFsIiBmaWxlcyBoYXZlIG9wcyAqLworCXN3aXRjaCAobmV4dGZoICYgUk9NRkhfVFlQRSkgeworCQljYXNlIDE6CisJCQlpLT5pX3NpemUgPSBST01GU19JKGkpLT5pX21ldGFzaXplOworCQkJaS0+aV9vcCA9ICZyb21mc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWktPmlfZm9wID0gJnJvbWZzX2Rpcl9vcGVyYXRpb25zOworCQkJaWYgKG5leHRmaCAmIFJPTUZIX0VYRUMpCisJCQkJaW5vIHw9IFNfSVhVR087CisJCQlpLT5pX21vZGUgPSBpbm87CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJaS0+aV9mb3AgPSAmZ2VuZXJpY19yb19mb3BzOworCQkJaS0+aV9kYXRhLmFfb3BzID0gJnJvbWZzX2FvcHM7CisJCQlpZiAobmV4dGZoICYgUk9NRkhfRVhFQykKKwkJCQlpbm8gfD0gU19JWFVHTzsKKwkJCWktPmlfbW9kZSA9IGlubzsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlpLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQkJaS0+aV9kYXRhLmFfb3BzID0gJnJvbWZzX2FvcHM7CisJCQlpLT5pX21vZGUgPSBpbm8gfCBTX0lSV1hVR087CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIGRlcGVuZGluZyBvbiBNQlogZm9yIHNvY2svZmlmb3MgKi8KKwkJCW5leHRmaCA9IGJlMzJfdG9fY3B1KHJpLnNwZWMpOworCQkJaW5pdF9zcGVjaWFsX2lub2RlKGksIGlubywKKwkJCQkJTUtERVYobmV4dGZoPj4xNixuZXh0ZmgmMHhmZmZmKSk7CisJfQorfQorCitzdGF0aWMga21lbV9jYWNoZV90ICogcm9tZnNfaW5vZGVfY2FjaGVwOworCitzdGF0aWMgc3RydWN0IGlub2RlICpyb21mc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCByb21mc19pbm9kZV9pbmZvICplaTsKKwllaSA9IChzdHJ1Y3Qgcm9tZnNfaW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2Mocm9tZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCByb21mc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJa21lbV9jYWNoZV9mcmVlKHJvbWZzX2lub2RlX2NhY2hlcCwgUk9NRlNfSShpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCByb21mc19pbm9kZV9pbmZvICplaSA9IChzdHJ1Y3Qgcm9tZnNfaW5vZGVfaW5mbyAqKSBmb287CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKQorCQlpbm9kZV9pbml0X29uY2UoJmVpLT52ZnNfaW5vZGUpOworfQorIAorc3RhdGljIGludCBpbml0X2lub2RlY2FjaGUodm9pZCkKK3sKKwlyb21mc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgicm9tZnNfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3Qgcm9tZnNfaW5vZGVfaW5mbyksCisJCQkJCSAgICAgMCwgU0xBQl9SRUNMQUlNX0FDQ09VTlQsCisJCQkJCSAgICAgaW5pdF9vbmNlLCBOVUxMKTsKKwlpZiAocm9tZnNfaW5vZGVfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKK3sKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KHJvbWZzX2lub2RlX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX0lORk8gInJvbWZzX2lub2RlX2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7Cit9CisKK3N0YXRpYyBpbnQgcm9tZnNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCSpmbGFncyB8PSBNU19SRE9OTFk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyByb21mc19vcHMgPSB7CisJLmFsbG9jX2lub2RlCT0gcm9tZnNfYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSByb21mc19kZXN0cm95X2lub2RlLAorCS5yZWFkX2lub2RlCT0gcm9tZnNfcmVhZF9pbm9kZSwKKwkuc3RhdGZzCQk9IHJvbWZzX3N0YXRmcywKKwkucmVtb3VudF9mcwk9IHJvbWZzX3JlbW91bnQsCit9OworCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpyb21mc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCByb21mc19maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHJvbWZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJyb21mcyIsCisJLmdldF9zYgkJPSByb21mc19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2Jsb2NrX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcm9tZnNfZnModm9pZCkKK3sKKwlpbnQgZXJyID0gaW5pdF9pbm9kZWNhY2hlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworICAgICAgICBlcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZyb21mc19mc190eXBlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlyZXR1cm4gMDsKK291dDoKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKK291dDE6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfcm9tZnNfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnJvbWZzX2ZzX3R5cGUpOworCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworfQorCisvKiBZZXMsIHdvcmtzIGV2ZW4gYXMgYSBtb2R1bGUuLi4gOikgKi8KKworbW9kdWxlX2luaXQoaW5pdF9yb21mc19mcykKK21vZHVsZV9leGl0KGV4aXRfcm9tZnNfZnMpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9zZWxlY3QuYyBiL2ZzL3NlbGVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YjFjY2EKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zZWxlY3QuYwpAQCAtMCwwICsxLDUzNCBAQAorLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcHJvY2VkdXJlcyBmb3IgdGhlIGhhbmRsaW5nIG9mIHNlbGVjdCBhbmQgcG9sbAorICoKKyAqIENyZWF0ZWQgZm9yIExpbnV4IGJhc2VkIGxvb3NlbHkgdXBvbiBNYXRoaXVzIExhdHRuZXIncyBtaW5peAorICogcGF0Y2hlcyBieSBQZXRlciBNYWNEb25hbGQuIEhlYXZpbHkgZWRpdGVkIGJ5IExpbnVzLgorICoKKyAqICA0IEZlYnJ1YXJ5IDE5OTQKKyAqICAgICBDT0ZGL0VMRiBiaW5hcnkgZW11bGF0aW9uLiBJZiB0aGUgcHJvY2VzcyBoYXMgdGhlIFNUSUNLWV9USU1FT1VUUworICogICAgIGZsYWcgc2V0IGluIGl0cyBwZXJzb25hbGl0eSB3ZSBkbyAqbm90KiBtb2RpZnkgdGhlIGdpdmVuIHRpbWVvdXQKKyAqICAgICBwYXJhbWV0ZXIgdG8gcmVmbGVjdCB0aW1lIHJlbWFpbmluZy4KKyAqCisgKiAgMjQgSmFudWFyeSAyMDAwCisgKiAgICAgQ2hhbmdlZCBzeXNfcG9sbCgpL2RvX3BvbGwoKSB0byB1c2UgUEFHRV9TSVpFIGNodW5rLWJhc2VkIGFsbG9jYXRpb24gCisgKiAgICAgb2YgZmRzIHRvIG92ZXJjb21lIG5mZHMgPCAxNjM5MCBkZXNjcmlwdG9ycyBsaW1pdCAoVGlncmFuIEFpdmF6aWFuKS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4gLyogZm9yIFNUSUNLWV9USU1FT1VUUyAqLworI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBST1VORF9VUCh4LHkpICgoKHgpKyh5KS0xKS8oeSkpCisjZGVmaW5lIERFRkFVTFRfUE9MTE1BU0sgKFBPTExJTiB8IFBPTExPVVQgfCBQT0xMUkROT1JNIHwgUE9MTFdSTk9STSkKKworc3RydWN0IHBvbGxfdGFibGVfZW50cnkgeworCXN0cnVjdCBmaWxlICogZmlscDsKKwl3YWl0X3F1ZXVlX3Qgd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAqIHdhaXRfYWRkcmVzczsKK307CisKK3N0cnVjdCBwb2xsX3RhYmxlX3BhZ2UgeworCXN0cnVjdCBwb2xsX3RhYmxlX3BhZ2UgKiBuZXh0OworCXN0cnVjdCBwb2xsX3RhYmxlX2VudHJ5ICogZW50cnk7CisJc3RydWN0IHBvbGxfdGFibGVfZW50cnkgZW50cmllc1swXTsKK307CisKKyNkZWZpbmUgUE9MTF9UQUJMRV9GVUxMKHRhYmxlKSBcCisJKCh1bnNpZ25lZCBsb25nKSgodGFibGUpLT5lbnRyeSsxKSA+IFBBR0VfU0laRSArICh1bnNpZ25lZCBsb25nKSh0YWJsZSkpCisKKy8qCisgKiBPaywgUGV0ZXIgbWFkZSBhIGNvbXBsaWNhdGVkLCBidXQgc3RyYWlnaHRmb3J3YXJkIG11bHRpcGxlX3dhaXQoKSBmdW5jdGlvbi4KKyAqIEkgaGF2ZSByZXdyaXR0ZW4gdGhpcywgdGFraW5nIHNvbWUgc2hvcnRjdXRzOiBUaGlzIGNvZGUgbWF5IG5vdCBiZSBlYXN5IHRvCisgKiBmb2xsb3csIGJ1dCBpdCBzaG91bGQgYmUgZnJlZSBvZiByYWNlLWNvbmRpdGlvbnMsIGFuZCBpdCdzIHByYWN0aWNhbC4gSWYgeW91CisgKiB1bmRlcnN0YW5kIHdoYXQgSSdtIGRvaW5nIGhlcmUsIHRoZW4geW91IHVuZGVyc3RhbmQgaG93IHRoZSBsaW51eAorICogc2xlZXAvd2FrZXVwIG1lY2hhbmlzbSB3b3Jrcy4KKyAqCisgKiBUd28gdmVyeSBzaW1wbGUgcHJvY2VkdXJlcywgcG9sbF93YWl0KCkgYW5kIHBvbGxfZnJlZXdhaXQoKSBtYWtlIGFsbCB0aGUKKyAqIHdvcmsuICBwb2xsX3dhaXQoKSBpcyBhbiBpbmxpbmUtZnVuY3Rpb24gZGVmaW5lZCBpbiA8bGludXgvcG9sbC5oPiwKKyAqIGFzIGFsbCBzZWxlY3QvcG9sbCBmdW5jdGlvbnMgaGF2ZSB0byBjYWxsIGl0IHRvIGFkZCBhbiBlbnRyeSB0byB0aGUKKyAqIHBvbGwgdGFibGUuCisgKi8KK3ZvaWQgX19wb2xsd2FpdChzdHJ1Y3QgZmlsZSAqZmlscCwgd2FpdF9xdWV1ZV9oZWFkX3QgKndhaXRfYWRkcmVzcywgcG9sbF90YWJsZSAqcCk7CisKK3ZvaWQgcG9sbF9pbml0d2FpdChzdHJ1Y3QgcG9sbF93cXVldWVzICpwd3EpCit7CisJaW5pdF9wb2xsX2Z1bmNwdHIoJnB3cS0+cHQsIF9fcG9sbHdhaXQpOworCXB3cS0+ZXJyb3IgPSAwOworCXB3cS0+dGFibGUgPSBOVUxMOworfQorCitFWFBPUlRfU1lNQk9MKHBvbGxfaW5pdHdhaXQpOworCit2b2lkIHBvbGxfZnJlZXdhaXQoc3RydWN0IHBvbGxfd3F1ZXVlcyAqcHdxKQoreworCXN0cnVjdCBwb2xsX3RhYmxlX3BhZ2UgKiBwID0gcHdxLT50YWJsZTsKKwl3aGlsZSAocCkgeworCQlzdHJ1Y3QgcG9sbF90YWJsZV9lbnRyeSAqIGVudHJ5OworCQlzdHJ1Y3QgcG9sbF90YWJsZV9wYWdlICpvbGQ7CisKKwkJZW50cnkgPSBwLT5lbnRyeTsKKwkJZG8geworCQkJZW50cnktLTsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKGVudHJ5LT53YWl0X2FkZHJlc3MsJmVudHJ5LT53YWl0KTsKKwkJCWZwdXQoZW50cnktPmZpbHApOworCQl9IHdoaWxlIChlbnRyeSA+IHAtPmVudHJpZXMpOworCQlvbGQgPSBwOworCQlwID0gcC0+bmV4dDsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBvbGQpOworCX0KK30KKworRVhQT1JUX1NZTUJPTChwb2xsX2ZyZWV3YWl0KTsKKwordm9pZCBfX3BvbGx3YWl0KHN0cnVjdCBmaWxlICpmaWxwLCB3YWl0X3F1ZXVlX2hlYWRfdCAqd2FpdF9hZGRyZXNzLCBwb2xsX3RhYmxlICpfcCkKK3sKKwlzdHJ1Y3QgcG9sbF93cXVldWVzICpwID0gY29udGFpbmVyX29mKF9wLCBzdHJ1Y3QgcG9sbF93cXVldWVzLCBwdCk7CisJc3RydWN0IHBvbGxfdGFibGVfcGFnZSAqdGFibGUgPSBwLT50YWJsZTsKKworCWlmICghdGFibGUgfHwgUE9MTF9UQUJMRV9GVUxMKHRhYmxlKSkgeworCQlzdHJ1Y3QgcG9sbF90YWJsZV9wYWdlICpuZXdfdGFibGU7CisKKwkJbmV3X3RhYmxlID0gKHN0cnVjdCBwb2xsX3RhYmxlX3BhZ2UgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIW5ld190YWJsZSkgeworCQkJcC0+ZXJyb3IgPSAtRU5PTUVNOworCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJcmV0dXJuOworCQl9CisJCW5ld190YWJsZS0+ZW50cnkgPSBuZXdfdGFibGUtPmVudHJpZXM7CisJCW5ld190YWJsZS0+bmV4dCA9IHRhYmxlOworCQlwLT50YWJsZSA9IG5ld190YWJsZTsKKwkJdGFibGUgPSBuZXdfdGFibGU7CisJfQorCisJLyogQWRkIGEgbmV3IGVudHJ5ICovCisJeworCQlzdHJ1Y3QgcG9sbF90YWJsZV9lbnRyeSAqIGVudHJ5ID0gdGFibGUtPmVudHJ5OworCQl0YWJsZS0+ZW50cnkgPSBlbnRyeSsxOworCSAJZ2V0X2ZpbGUoZmlscCk7CisJIAllbnRyeS0+ZmlscCA9IGZpbHA7CisJCWVudHJ5LT53YWl0X2FkZHJlc3MgPSB3YWl0X2FkZHJlc3M7CisJCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZlbnRyeS0+d2FpdCwgY3VycmVudCk7CisJCWFkZF93YWl0X3F1ZXVlKHdhaXRfYWRkcmVzcywmZW50cnktPndhaXQpOworCX0KK30KKworI2RlZmluZSBGRFNfSU4oZmRzLCBuKQkJKGZkcy0+aW4gKyBuKQorI2RlZmluZSBGRFNfT1VUKGZkcywgbikJCShmZHMtPm91dCArIG4pCisjZGVmaW5lIEZEU19FWChmZHMsIG4pCQkoZmRzLT5leCArIG4pCisKKyNkZWZpbmUgQklUUyhmZHMsIG4pCSgqRkRTX0lOKGZkcywgbil8KkZEU19PVVQoZmRzLCBuKXwqRkRTX0VYKGZkcywgbikpCisKK3N0YXRpYyBpbnQgbWF4X3NlbGVjdF9mZCh1bnNpZ25lZCBsb25nIG4sIGZkX3NldF9iaXRzICpmZHMpCit7CisJdW5zaWduZWQgbG9uZyAqb3Blbl9mZHM7CisJdW5zaWduZWQgbG9uZyBzZXQ7CisJaW50IG1heDsKKworCS8qIGhhbmRsZSBsYXN0IGluLWNvbXBsZXRlIGxvbmctd29yZCBmaXJzdCAqLworCXNldCA9IH4ofjBVTCA8PCAobiAmIChfX05GREJJVFMtMSkpKTsKKwluIC89IF9fTkZEQklUUzsKKwlvcGVuX2ZkcyA9IGN1cnJlbnQtPmZpbGVzLT5vcGVuX2Zkcy0+ZmRzX2JpdHMrbjsKKwltYXggPSAwOworCWlmIChzZXQpIHsKKwkJc2V0ICY9IEJJVFMoZmRzLCBuKTsKKwkJaWYgKHNldCkgeworCQkJaWYgKCEoc2V0ICYgfipvcGVuX2ZkcykpCisJCQkJZ290byBnZXRfbWF4OworCQkJcmV0dXJuIC1FQkFERjsKKwkJfQorCX0KKwl3aGlsZSAobikgeworCQlvcGVuX2Zkcy0tOworCQluLS07CisJCXNldCA9IEJJVFMoZmRzLCBuKTsKKwkJaWYgKCFzZXQpCisJCQljb250aW51ZTsKKwkJaWYgKHNldCAmIH4qb3Blbl9mZHMpCisJCQlyZXR1cm4gLUVCQURGOworCQlpZiAobWF4KQorCQkJY29udGludWU7CitnZXRfbWF4OgorCQlkbyB7CisJCQltYXgrKzsKKwkJCXNldCA+Pj0gMTsKKwkJfSB3aGlsZSAoc2V0KTsKKwkJbWF4ICs9IG4gKiBfX05GREJJVFM7CisJfQorCisJcmV0dXJuIG1heDsKK30KKworI2RlZmluZSBCSVQoaSkJCSgxVUwgPDwgKChpKSYoX19ORkRCSVRTLTEpKSkKKyNkZWZpbmUgTUVNKGksbSkJKChtKSsodW5zaWduZWQpKGkpL19fTkZEQklUUykKKyNkZWZpbmUgSVNTRVQoaSxtKQkoKChpKSYqKG0pKSAhPSAwKQorI2RlZmluZSBTRVQoaSxtKQkoKihtKSB8PSAoaSkpCisKKyNkZWZpbmUgUE9MTElOX1NFVCAoUE9MTFJETk9STSB8IFBPTExSREJBTkQgfCBQT0xMSU4gfCBQT0xMSFVQIHwgUE9MTEVSUikKKyNkZWZpbmUgUE9MTE9VVF9TRVQgKFBPTExXUkJBTkQgfCBQT0xMV1JOT1JNIHwgUE9MTE9VVCB8IFBPTExFUlIpCisjZGVmaW5lIFBPTExFWF9TRVQgKFBPTExQUkkpCisKK2ludCBkb19zZWxlY3QoaW50IG4sIGZkX3NldF9iaXRzICpmZHMsIGxvbmcgKnRpbWVvdXQpCit7CisJc3RydWN0IHBvbGxfd3F1ZXVlcyB0YWJsZTsKKwlwb2xsX3RhYmxlICp3YWl0OworCWludCByZXR2YWwsIGk7CisJbG9uZyBfX3RpbWVvdXQgPSAqdGltZW91dDsKKworIAlzcGluX2xvY2soJmN1cnJlbnQtPmZpbGVzLT5maWxlX2xvY2spOworCXJldHZhbCA9IG1heF9zZWxlY3RfZmQobiwgZmRzKTsKKwlzcGluX3VubG9jaygmY3VycmVudC0+ZmlsZXMtPmZpbGVfbG9jayk7CisKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKwluID0gcmV0dmFsOworCisJcG9sbF9pbml0d2FpdCgmdGFibGUpOworCXdhaXQgPSAmdGFibGUucHQ7CisJaWYgKCFfX3RpbWVvdXQpCisJCXdhaXQgPSBOVUxMOworCXJldHZhbCA9IDA7CisJZm9yICg7OykgeworCQl1bnNpZ25lZCBsb25nICpyaW5wLCAqcm91dHAsICpyZXhwLCAqaW5wLCAqb3V0cCwgKmV4cDsKKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCWlucCA9IGZkcy0+aW47IG91dHAgPSBmZHMtPm91dDsgZXhwID0gZmRzLT5leDsKKwkJcmlucCA9IGZkcy0+cmVzX2luOyByb3V0cCA9IGZkcy0+cmVzX291dDsgcmV4cCA9IGZkcy0+cmVzX2V4OworCisJCWZvciAoaSA9IDA7IGkgPCBuOyArK3JpbnAsICsrcm91dHAsICsrcmV4cCkgeworCQkJdW5zaWduZWQgbG9uZyBpbiwgb3V0LCBleCwgYWxsX2JpdHMsIGJpdCA9IDEsIG1hc2ssIGo7CisJCQl1bnNpZ25lZCBsb25nIHJlc19pbiA9IDAsIHJlc19vdXQgPSAwLCByZXNfZXggPSAwOworCQkJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZl9vcCA9IE5VTEw7CisJCQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IE5VTEw7CisKKwkJCWluID0gKmlucCsrOyBvdXQgPSAqb3V0cCsrOyBleCA9ICpleHArKzsKKwkJCWFsbF9iaXRzID0gaW4gfCBvdXQgfCBleDsKKwkJCWlmIChhbGxfYml0cyA9PSAwKSB7CisJCQkJaSArPSBfX05GREJJVFM7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWZvciAoaiA9IDA7IGogPCBfX05GREJJVFM7ICsraiwgKytpLCBiaXQgPDw9IDEpIHsKKwkJCQlpZiAoaSA+PSBuKQorCQkJCQlicmVhazsKKwkJCQlpZiAoIShiaXQgJiBhbGxfYml0cykpCisJCQkJCWNvbnRpbnVlOworCQkJCWZpbGUgPSBmZ2V0KGkpOworCQkJCWlmIChmaWxlKSB7CisJCQkJCWZfb3AgPSBmaWxlLT5mX29wOworCQkJCQltYXNrID0gREVGQVVMVF9QT0xMTUFTSzsKKwkJCQkJaWYgKGZfb3AgJiYgZl9vcC0+cG9sbCkKKwkJCQkJCW1hc2sgPSAoKmZfb3AtPnBvbGwpKGZpbGUsIHJldHZhbCA/IE5VTEwgOiB3YWl0KTsKKwkJCQkJZnB1dChmaWxlKTsKKwkJCQkJaWYgKChtYXNrICYgUE9MTElOX1NFVCkgJiYgKGluICYgYml0KSkgeworCQkJCQkJcmVzX2luIHw9IGJpdDsKKwkJCQkJCXJldHZhbCsrOworCQkJCQl9CisJCQkJCWlmICgobWFzayAmIFBPTExPVVRfU0VUKSAmJiAob3V0ICYgYml0KSkgeworCQkJCQkJcmVzX291dCB8PSBiaXQ7CisJCQkJCQlyZXR2YWwrKzsKKwkJCQkJfQorCQkJCQlpZiAoKG1hc2sgJiBQT0xMRVhfU0VUKSAmJiAoZXggJiBiaXQpKSB7CisJCQkJCQlyZXNfZXggfD0gYml0OworCQkJCQkJcmV0dmFsKys7CisJCQkJCX0KKwkJCQl9CisJCQkJY29uZF9yZXNjaGVkKCk7CisJCQl9CisJCQlpZiAocmVzX2luKQorCQkJCSpyaW5wID0gcmVzX2luOworCQkJaWYgKHJlc19vdXQpCisJCQkJKnJvdXRwID0gcmVzX291dDsKKwkJCWlmIChyZXNfZXgpCisJCQkJKnJleHAgPSByZXNfZXg7CisJCX0KKwkJd2FpdCA9IE5VTEw7CisJCWlmIChyZXR2YWwgfHwgIV9fdGltZW91dCB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQlpZih0YWJsZS5lcnJvcikgeworCQkJcmV0dmFsID0gdGFibGUuZXJyb3I7CisJCQlicmVhazsKKwkJfQorCQlfX3RpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KF9fdGltZW91dCk7CisJfQorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCXBvbGxfZnJlZXdhaXQoJnRhYmxlKTsKKworCS8qCisJICogVXAtdG8tZGF0ZSB0aGUgY2FsbGVyIHRpbWVvdXQuCisJICovCisJKnRpbWVvdXQgPSBfX3RpbWVvdXQ7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgKnNlbGVjdF9iaXRzX2FsbG9jKGludCBzaXplKQoreworCXJldHVybiBrbWFsbG9jKDYgKiBzaXplLCBHRlBfS0VSTkVMKTsKK30KKworc3RhdGljIHZvaWQgc2VsZWN0X2JpdHNfZnJlZSh2b2lkICpiaXRzLCBpbnQgc2l6ZSkKK3sKKwlrZnJlZShiaXRzKTsKK30KKworLyoKKyAqIFdlIGNhbiBhY3R1YWxseSByZXR1cm4gRVJFU1RBUlRTWVMgaW5zdGVhZCBvZiBFSU5UUiwgYnV0IEknZAorICogbGlrZSB0byBiZSBjZXJ0YWluIHRoaXMgbGVhZHMgdG8gbm8gcHJvYmxlbXMuIFNvIEkgcmV0dXJuCisgKiBFSU5UUiBqdXN0IGZvciBzYWZldHkuCisgKgorICogVXBkYXRlOiBFUkVTVEFSVFNZUyBicmVha3MgYXQgbGVhc3QgdGhlIHh2aWV3IGNsb2NrIGJpbmFyeSwgc28KKyAqIEknbSB0cnlpbmcgRVJFU1RBUlROT0hBTkQgd2hpY2ggcmVzdGFydCBvbmx5IHdoZW4geW91IHdhbnQgdG8uCisgKi8KKyNkZWZpbmUgTUFYX1NFTEVDVF9TRUNPTkRTIFwKKwkoKHVuc2lnbmVkIGxvbmcpIChNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKS0xKQorCithc21saW5rYWdlIGxvbmcKK3N5c19zZWxlY3QoaW50IG4sIGZkX3NldCBfX3VzZXIgKmlucCwgZmRfc2V0IF9fdXNlciAqb3V0cCwgZmRfc2V0IF9fdXNlciAqZXhwLCBzdHJ1Y3QgdGltZXZhbCBfX3VzZXIgKnR2cCkKK3sKKwlmZF9zZXRfYml0cyBmZHM7CisJY2hhciAqYml0czsKKwlsb25nIHRpbWVvdXQ7CisJaW50IHJldCwgc2l6ZSwgbWF4X2Zkc2V0OworCisJdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCWlmICh0dnApIHsKKwkJdGltZV90IHNlYywgdXNlYzsKKworCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdHZwLCBzaXplb2YoKnR2cCkpCisJCSAgICB8fCBfX2dldF91c2VyKHNlYywgJnR2cC0+dHZfc2VjKQorCQkgICAgfHwgX19nZXRfdXNlcih1c2VjLCAmdHZwLT50dl91c2VjKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0X25vZmRzOworCQl9CisKKwkJcmV0ID0gLUVJTlZBTDsKKwkJaWYgKHNlYyA8IDAgfHwgdXNlYyA8IDApCisJCQlnb3RvIG91dF9ub2ZkczsKKworCQlpZiAoKHVuc2lnbmVkIGxvbmcpIHNlYyA8IE1BWF9TRUxFQ1RfU0VDT05EUykgeworCQkJdGltZW91dCA9IFJPVU5EX1VQKHVzZWMsIDEwMDAwMDAvSFopOworCQkJdGltZW91dCArPSBzZWMgKiAodW5zaWduZWQgbG9uZykgSFo7CisJCX0KKwl9CisKKwlyZXQgPSAtRUlOVkFMOworCWlmIChuIDwgMCkKKwkJZ290byBvdXRfbm9mZHM7CisKKwkvKiBtYXhfZmRzZXQgY2FuIGluY3JlYXNlLCBzbyBncmFiIGl0IG9uY2UgdG8gYXZvaWQgcmFjZSAqLworCW1heF9mZHNldCA9IGN1cnJlbnQtPmZpbGVzLT5tYXhfZmRzZXQ7CisJaWYgKG4gPiBtYXhfZmRzZXQpCisJCW4gPSBtYXhfZmRzZXQ7CisKKwkvKgorCSAqIFdlIG5lZWQgNiBiaXRtYXBzIChpbi9vdXQvZXggZm9yIGJvdGggaW5jb21pbmcgYW5kIG91dGdvaW5nKSwKKwkgKiBzaW5jZSB3ZSB1c2VkIGZkc2V0IHdlIG5lZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGluIHVuaXRzIG9mCisJICogbG9uZy13b3Jkcy4gCisJICovCisJcmV0ID0gLUVOT01FTTsKKwlzaXplID0gRkRTX0JZVEVTKG4pOworCWJpdHMgPSBzZWxlY3RfYml0c19hbGxvYyhzaXplKTsKKwlpZiAoIWJpdHMpCisJCWdvdG8gb3V0X25vZmRzOworCWZkcy5pbiAgICAgID0gKHVuc2lnbmVkIGxvbmcgKikgIGJpdHM7CisJZmRzLm91dCAgICAgPSAodW5zaWduZWQgbG9uZyAqKSAoYml0cyArICAgc2l6ZSk7CisJZmRzLmV4ICAgICAgPSAodW5zaWduZWQgbG9uZyAqKSAoYml0cyArIDIqc2l6ZSk7CisJZmRzLnJlc19pbiAgPSAodW5zaWduZWQgbG9uZyAqKSAoYml0cyArIDMqc2l6ZSk7CisJZmRzLnJlc19vdXQgPSAodW5zaWduZWQgbG9uZyAqKSAoYml0cyArIDQqc2l6ZSk7CisJZmRzLnJlc19leCAgPSAodW5zaWduZWQgbG9uZyAqKSAoYml0cyArIDUqc2l6ZSk7CisKKwlpZiAoKHJldCA9IGdldF9mZF9zZXQobiwgaW5wLCBmZHMuaW4pKSB8fAorCSAgICAocmV0ID0gZ2V0X2ZkX3NldChuLCBvdXRwLCBmZHMub3V0KSkgfHwKKwkgICAgKHJldCA9IGdldF9mZF9zZXQobiwgZXhwLCBmZHMuZXgpKSkKKwkJZ290byBvdXQ7CisJemVyb19mZF9zZXQobiwgZmRzLnJlc19pbik7CisJemVyb19mZF9zZXQobiwgZmRzLnJlc19vdXQpOworCXplcm9fZmRfc2V0KG4sIGZkcy5yZXNfZXgpOworCisJcmV0ID0gZG9fc2VsZWN0KG4sICZmZHMsICZ0aW1lb3V0KTsKKworCWlmICh0dnAgJiYgIShjdXJyZW50LT5wZXJzb25hbGl0eSAmIFNUSUNLWV9USU1FT1VUUykpIHsKKwkJdGltZV90IHNlYyA9IDAsIHVzZWMgPSAwOworCQlpZiAodGltZW91dCkgeworCQkJc2VjID0gdGltZW91dCAvIEhaOworCQkJdXNlYyA9IHRpbWVvdXQgJSBIWjsKKwkJCXVzZWMgKj0gKDEwMDAwMDAvSFopOworCQl9CisJCXB1dF91c2VyKHNlYywgJnR2cC0+dHZfc2VjKTsKKwkJcHV0X3VzZXIodXNlYywgJnR2cC0+dHZfdXNlYyk7CisJfQorCisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCWlmICghcmV0KSB7CisJCXJldCA9IC1FUkVTVEFSVE5PSEFORDsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJZ290byBvdXQ7CisJCXJldCA9IDA7CisJfQorCisJaWYgKHNldF9mZF9zZXQobiwgaW5wLCBmZHMucmVzX2luKSB8fAorCSAgICBzZXRfZmRfc2V0KG4sIG91dHAsIGZkcy5yZXNfb3V0KSB8fAorCSAgICBzZXRfZmRfc2V0KG4sIGV4cCwgZmRzLnJlc19leCkpCisJCXJldCA9IC1FRkFVTFQ7CisKK291dDoKKwlzZWxlY3RfYml0c19mcmVlKGJpdHMsIHNpemUpOworb3V0X25vZmRzOgorCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBwb2xsX2xpc3QgeworCXN0cnVjdCBwb2xsX2xpc3QgKm5leHQ7CisJaW50IGxlbjsKKwlzdHJ1Y3QgcG9sbGZkIGVudHJpZXNbMF07Cit9OworCisjZGVmaW5lIFBPTExGRF9QRVJfUEFHRSAgKChQQUdFX1NJWkUtc2l6ZW9mKHN0cnVjdCBwb2xsX2xpc3QpKSAvIHNpemVvZihzdHJ1Y3QgcG9sbGZkKSkKKworc3RhdGljIHZvaWQgZG9fcG9sbGZkKHVuc2lnbmVkIGludCBudW0sIHN0cnVjdCBwb2xsZmQgKiBmZHBhZ2UsCisJcG9sbF90YWJsZSAqKiBwd2FpdCwgaW50ICpjb3VudCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlpbnQgZmQ7CisJCXVuc2lnbmVkIGludCBtYXNrOworCQlzdHJ1Y3QgcG9sbGZkICpmZHA7CisKKwkJbWFzayA9IDA7CisJCWZkcCA9IGZkcGFnZStpOworCQlmZCA9IGZkcC0+ZmQ7CisJCWlmIChmZCA+PSAwKSB7CisJCQlzdHJ1Y3QgZmlsZSAqIGZpbGUgPSBmZ2V0KGZkKTsKKwkJCW1hc2sgPSBQT0xMTlZBTDsKKwkJCWlmIChmaWxlICE9IE5VTEwpIHsKKwkJCQltYXNrID0gREVGQVVMVF9QT0xMTUFTSzsKKwkJCQlpZiAoZmlsZS0+Zl9vcCAmJiBmaWxlLT5mX29wLT5wb2xsKQorCQkJCQltYXNrID0gZmlsZS0+Zl9vcC0+cG9sbChmaWxlLCAqcHdhaXQpOworCQkJCW1hc2sgJj0gZmRwLT5ldmVudHMgfCBQT0xMRVJSIHwgUE9MTEhVUDsKKwkJCQlmcHV0KGZpbGUpOworCQkJfQorCQkJaWYgKG1hc2spIHsKKwkJCQkqcHdhaXQgPSBOVUxMOworCQkJCSgqY291bnQpKys7CisJCQl9CisJCX0KKwkJZmRwLT5yZXZlbnRzID0gbWFzazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZG9fcG9sbCh1bnNpZ25lZCBpbnQgbmZkcywgIHN0cnVjdCBwb2xsX2xpc3QgKmxpc3QsCisJCQlzdHJ1Y3QgcG9sbF93cXVldWVzICp3YWl0LCBsb25nIHRpbWVvdXQpCit7CisJaW50IGNvdW50ID0gMDsKKwlwb2xsX3RhYmxlKiBwdCA9ICZ3YWl0LT5wdDsKKworCWlmICghdGltZW91dCkKKwkJcHQgPSBOVUxMOworIAorCWZvciAoOzspIHsKKwkJc3RydWN0IHBvbGxfbGlzdCAqd2FsazsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJd2FsayA9IGxpc3Q7CisJCXdoaWxlKHdhbGsgIT0gTlVMTCkgeworCQkJZG9fcG9sbGZkKCB3YWxrLT5sZW4sIHdhbGstPmVudHJpZXMsICZwdCwgJmNvdW50KTsKKwkJCXdhbGsgPSB3YWxrLT5uZXh0OworCQl9CisJCXB0ID0gTlVMTDsKKwkJaWYgKGNvdW50IHx8ICF0aW1lb3V0IHx8IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJCWNvdW50ID0gd2FpdC0+ZXJyb3I7CisJCWlmIChjb3VudCkKKwkJCWJyZWFrOworCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiBjb3VudDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19wb2xsKHN0cnVjdCBwb2xsZmQgX191c2VyICogdWZkcywgdW5zaWduZWQgaW50IG5mZHMsIGxvbmcgdGltZW91dCkKK3sKKwlzdHJ1Y3QgcG9sbF93cXVldWVzIHRhYmxlOworIAlpbnQgZmRjb3VudCwgZXJyOworIAl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgcG9sbF9saXN0ICpoZWFkOworIAlzdHJ1Y3QgcG9sbF9saXN0ICp3YWxrOworCisJLyogRG8gYSBzYW5pdHkgY2hlY2sgb24gbmZkcyAuLi4gKi8KKwlpZiAobmZkcyA+IGN1cnJlbnQtPmZpbGVzLT5tYXhfZmRzZXQgJiYgbmZkcyA+IE9QRU5fTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0aW1lb3V0KSB7CisJCS8qIENhcmVmdWwgYWJvdXQgb3ZlcmZsb3cgaW4gdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMgKi8KKwkJaWYgKCh1bnNpZ25lZCBsb25nKSB0aW1lb3V0IDwgTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWikKKwkJCXRpbWVvdXQgPSAodW5zaWduZWQgbG9uZykodGltZW91dCpIWis5OTkpLzEwMDArMTsKKwkJZWxzZSAvKiBOZWdhdGl2ZSBvciBvdmVyZmxvdyAqLworCQkJdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCX0KKworCXBvbGxfaW5pdHdhaXQoJnRhYmxlKTsKKworCWhlYWQgPSBOVUxMOworCXdhbGsgPSBOVUxMOworCWkgPSBuZmRzOworCWVyciA9IC1FTk9NRU07CisJd2hpbGUoaSE9MCkgeworCQlzdHJ1Y3QgcG9sbF9saXN0ICpwcDsKKwkJcHAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG9sbF9saXN0KSsKKwkJCQlzaXplb2Yoc3RydWN0IHBvbGxmZCkqCisJCQkJKGk+UE9MTEZEX1BFUl9QQUdFP1BPTExGRF9QRVJfUEFHRTppKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJCWlmKHBwPT1OVUxMKQorCQkJZ290byBvdXRfZmRzOworCQlwcC0+bmV4dD1OVUxMOworCQlwcC0+bGVuID0gKGk+UE9MTEZEX1BFUl9QQUdFP1BPTExGRF9QRVJfUEFHRTppKTsKKwkJaWYgKGhlYWQgPT0gTlVMTCkKKwkJCWhlYWQgPSBwcDsKKwkJZWxzZQorCQkJd2Fsay0+bmV4dCA9IHBwOworCisJCXdhbGsgPSBwcDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHBwLT5lbnRyaWVzLCB1ZmRzICsgbmZkcy1pLCAKKwkJCQlzaXplb2Yoc3RydWN0IHBvbGxmZCkqcHAtPmxlbikpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dF9mZHM7CisJCX0KKwkJaSAtPSBwcC0+bGVuOworCX0KKwlmZGNvdW50ID0gZG9fcG9sbChuZmRzLCBoZWFkLCAmdGFibGUsIHRpbWVvdXQpOworCisJLyogT0ssIG5vdyBjb3B5IHRoZSByZXZlbnRzIGZpZWxkcyBiYWNrIHRvIHVzZXIgc3BhY2UuICovCisJd2FsayA9IGhlYWQ7CisJZXJyID0gLUVGQVVMVDsKKwl3aGlsZSh3YWxrICE9IE5VTEwpIHsKKwkJc3RydWN0IHBvbGxmZCAqZmRzID0gd2Fsay0+ZW50cmllczsKKwkJaW50IGo7CisKKwkJZm9yIChqPTA7IGogPCB3YWxrLT5sZW47IGorKywgdWZkcysrKSB7CisJCQlpZihfX3B1dF91c2VyKGZkc1tqXS5yZXZlbnRzLCAmdWZkcy0+cmV2ZW50cykpCisJCQkJZ290byBvdXRfZmRzOworCQl9CisJCXdhbGsgPSB3YWxrLT5uZXh0OworICAJfQorCWVyciA9IGZkY291bnQ7CisJaWYgKCFmZGNvdW50ICYmIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQllcnIgPSAtRUlOVFI7CitvdXRfZmRzOgorCXdhbGsgPSBoZWFkOworCXdoaWxlKHdhbGshPU5VTEwpIHsKKwkJc3RydWN0IHBvbGxfbGlzdCAqcHAgPSB3YWxrLT5uZXh0OworCQlrZnJlZSh3YWxrKTsKKwkJd2FsayA9IHBwOworCX0KKwlwb2xsX2ZyZWV3YWl0KCZ0YWJsZSk7CisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2ZzL3NlcV9maWxlLmMgYi9mcy9zZXFfZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MGM0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zZXFfZmlsZS5jCkBAIC0wLDAgKzEsNDQwIEBACisvKgorICogbGludXgvZnMvc2VxX2ZpbGUuYworICoKKyAqIGhlbHBlciBmdW5jdGlvbnMgZm9yIG1ha2luZyBzeW50aGV0aWMgZmlsZXMgZnJvbSBzZXF1ZW5jZXMgb2YgcmVjb3Jkcy4KKyAqIGluaXRpYWwgaW1wbGVtZW50YXRpb24gLS0gQVYsIE9jdCAyMDAxLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisvKioKKyAqCXNlcV9vcGVuIC0JaW5pdGlhbGl6ZSBzZXF1ZW50aWFsIGZpbGUKKyAqCUBmaWxlOiBmaWxlIHdlIGluaXRpYWxpemUKKyAqCUBvcDogbWV0aG9kIHRhYmxlIGRlc2NyaWJpbmcgdGhlIHNlcXVlbmNlCisgKgorICoJc2VxX29wZW4oKSBzZXRzIEBmaWxlLCBhc3NvY2lhdGluZyBpdCB3aXRoIGEgc2VxdWVuY2UgZGVzY3JpYmVkCisgKglieSBAb3AuICBAb3AtPnN0YXJ0KCkgc2V0cyB0aGUgaXRlcmF0b3IgdXAgYW5kIHJldHVybnMgdGhlIGZpcnN0CisgKgllbGVtZW50IG9mIHNlcXVlbmNlLiBAb3AtPnN0b3AoKSBzaHV0cyBpdCBkb3duLiAgQG9wLT5uZXh0KCkKKyAqCXJldHVybnMgdGhlIG5leHQgZWxlbWVudCBvZiBzZXF1ZW5jZS4gIEBvcC0+c2hvdygpIHByaW50cyBlbGVtZW50CisgKglpbnRvIHRoZSBidWZmZXIuICBJbiBjYXNlIG9mIGVycm9yIC0+c3RhcnQoKSBhbmQgLT5uZXh0KCkgcmV0dXJuCisgKglFUlJfUFRSKGVycm9yKS4gIEluIHRoZSBlbmQgb2Ygc2VxdWVuY2UgdGhleSByZXR1cm4gJU5VTEwuIC0+c2hvdygpCisgKglyZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBuZWdhdGl2ZSBudW1iZXIgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IHNlcV9vcGVuKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgKm9wKQoreworCXN0cnVjdCBzZXFfZmlsZSAqcCA9IGttYWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CisJc2VtYV9pbml0KCZwLT5zZW0sIDEpOworCXAtPm9wID0gb3A7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcDsKKworCS8qCisJICogV3JhcHBlcnMgYXJvdW5kIHNlcV9vcGVuKGUuZy4gc3dhcHNfb3BlbikgbmVlZCB0byBiZQorCSAqIGF3YXJlIG9mIHRoaXMuIElmIHRoZXkgc2V0IGZfdmVyc2lvbiB0aGVtc2VsdmVzLCB0aGV5CisJICogc2hvdWxkIGNhbGwgc2VxX29wZW4gZmlyc3QgYW5kIHRoZW4gc2V0IGZfdmVyc2lvbi4KKwkgKi8KKwlmaWxlLT5mX3ZlcnNpb24gPSAwOworCisJLyogU0VRIGZpbGVzIHN1cHBvcnQgbHNlZWssIGJ1dCBub3QgcHJlYWQvcHdyaXRlICovCisJZmlsZS0+Zl9tb2RlICY9IH4oRk1PREVfUFJFQUQgfCBGTU9ERV9QV1JJVEUpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChzZXFfb3Blbik7CisKKy8qKgorICoJc2VxX3JlYWQgLQktPnJlYWQoKSBtZXRob2QgZm9yIHNlcXVlbnRpYWwgZmlsZXMuCisgKglAZmlsZSwgQGJ1ZiwgQHNpemUsIEBwcG9zOiBzZWUgZmlsZV9vcGVyYXRpb25zIG1ldGhvZAorICoKKyAqCVJlYWR5LW1hZGUgLT5mX29wLT5yZWFkKCkKKyAqLworc3NpemVfdCBzZXFfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IHNpemUsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNpemVfdCBjb3BpZWQgPSAwOworCWxvZmZfdCBwb3M7CisJc2l6ZV90IG47CisJdm9pZCAqcDsKKwlpbnQgZXJyID0gMDsKKworCWRvd24oJm0tPnNlbSk7CisJLyoKKwkgKiBzZXFfZmlsZS0+b3AtPi4ubV9zdGFydC9tX3N0b3AvbV9uZXh0IG1heSBkbyBzcGVjaWFsIGFjdGlvbnMKKwkgKiBvciBvcHRpbWlzYXRpb25zIGJhc2VkIG9uIHRoZSBmaWxlLT5mX3ZlcnNpb24sIHNvIHdlIHdhbnQgdG8KKwkgKiBwYXNzIHRoZSBmaWxlLT5mX3ZlcnNpb24gdG8gdGhvc2UgbWV0aG9kcy4KKwkgKgorCSAqIHNlcV9maWxlLT52ZXJzaW9uIGlzIGp1c3QgY29weSBvZiBmX3ZlcnNpb24sIGFuZCBzZXFfZmlsZQorCSAqIG1ldGhvZHMgY2FuIHRyZWF0IGl0IHNpbXBseSBhcyBmaWxlIHZlcnNpb24uCisJICogSXQgaXMgY29waWVkIGluIGZpcnN0IGFuZCBjb3BpZWQgb3V0IGFmdGVyIGFsbCBvcGVyYXRpb25zLgorCSAqIEl0IGlzIGNvbnZlbmllbnQgdG8gaGF2ZSBpdCBhcyAgcGFydCBvZiBzdHJ1Y3R1cmUgdG8gYXZvaWQgdGhlCisJICogbmVlZCBvZiBwYXNzaW5nIGFub3RoZXIgYXJndW1lbnQgdG8gYWxsIHRoZSBzZXFfZmlsZSBtZXRob2RzLgorCSAqLworCW0tPnZlcnNpb24gPSBmaWxlLT5mX3ZlcnNpb247CisJLyogZ3JhYiBidWZmZXIgaWYgd2UgZGlkbid0IGhhdmUgb25lICovCisJaWYgKCFtLT5idWYpIHsKKwkJbS0+YnVmID0ga21hbGxvYyhtLT5zaXplID0gUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtLT5idWYpCisJCQlnb3RvIEVub21lbTsKKwl9CisJLyogaWYgbm90IGVtcHR5IC0gZmx1c2ggaXQgZmlyc3QgKi8KKwlpZiAobS0+Y291bnQpIHsKKwkJbiA9IG1pbihtLT5jb3VudCwgc2l6ZSk7CisJCWVyciA9IGNvcHlfdG9fdXNlcihidWYsIG0tPmJ1ZiArIG0tPmZyb20sIG4pOworCQlpZiAoZXJyKQorCQkJZ290byBFZmF1bHQ7CisJCW0tPmNvdW50IC09IG47CisJCW0tPmZyb20gKz0gbjsKKwkJc2l6ZSAtPSBuOworCQlidWYgKz0gbjsKKwkJY29waWVkICs9IG47CisJCWlmICghbS0+Y291bnQpCisJCQltLT5pbmRleCsrOworCQlpZiAoIXNpemUpCisJCQlnb3RvIERvbmU7CisJfQorCS8qIHdlIG5lZWQgYXQgbGVhc3Qgb25lIHJlY29yZCBpbiBidWZmZXIgKi8KKwl3aGlsZSAoMSkgeworCQlwb3MgPSBtLT5pbmRleDsKKwkJcCA9IG0tPm9wLT5zdGFydChtLCAmcG9zKTsKKwkJZXJyID0gUFRSX0VSUihwKTsKKwkJaWYgKCFwIHx8IElTX0VSUihwKSkKKwkJCWJyZWFrOworCQllcnIgPSBtLT5vcC0+c2hvdyhtLCBwKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCQlpZiAobS0+Y291bnQgPCBtLT5zaXplKQorCQkJZ290byBGaWxsOworCQltLT5vcC0+c3RvcChtLCBwKTsKKwkJa2ZyZWUobS0+YnVmKTsKKwkJbS0+YnVmID0ga21hbGxvYyhtLT5zaXplIDw8PSAxLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtLT5idWYpCisJCQlnb3RvIEVub21lbTsKKwkJbS0+Y291bnQgPSAwOworCQltLT52ZXJzaW9uID0gMDsKKwl9CisJbS0+b3AtPnN0b3AobSwgcCk7CisJbS0+Y291bnQgPSAwOworCWdvdG8gRG9uZTsKK0ZpbGw6CisJLyogdGhleSB3YW50IG1vcmU/IGxldCdzIHRyeSB0byBnZXQgc29tZSBtb3JlICovCisJd2hpbGUgKG0tPmNvdW50IDwgc2l6ZSkgeworCQlzaXplX3Qgb2ZmcyA9IG0tPmNvdW50OworCQlsb2ZmX3QgbmV4dCA9IHBvczsKKwkJcCA9IG0tPm9wLT5uZXh0KG0sIHAsICZuZXh0KTsKKwkJaWYgKCFwIHx8IElTX0VSUihwKSkgeworCQkJZXJyID0gUFRSX0VSUihwKTsKKwkJCWJyZWFrOworCQl9CisJCWVyciA9IG0tPm9wLT5zaG93KG0sIHApOworCQlpZiAoZXJyIHx8IG0tPmNvdW50ID09IG0tPnNpemUpIHsKKwkJCW0tPmNvdW50ID0gb2ZmczsKKwkJCWJyZWFrOworCQl9CisJCXBvcyA9IG5leHQ7CisJfQorCW0tPm9wLT5zdG9wKG0sIHApOworCW4gPSBtaW4obS0+Y291bnQsIHNpemUpOworCWVyciA9IGNvcHlfdG9fdXNlcihidWYsIG0tPmJ1Ziwgbik7CisJaWYgKGVycikKKwkJZ290byBFZmF1bHQ7CisJY29waWVkICs9IG47CisJbS0+Y291bnQgLT0gbjsKKwlpZiAobS0+Y291bnQpCisJCW0tPmZyb20gPSBuOworCWVsc2UKKwkJcG9zKys7CisJbS0+aW5kZXggPSBwb3M7CitEb25lOgorCWlmICghY29waWVkKQorCQljb3BpZWQgPSBlcnI7CisJZWxzZQorCQkqcHBvcyArPSBjb3BpZWQ7CisJZmlsZS0+Zl92ZXJzaW9uID0gbS0+dmVyc2lvbjsKKwl1cCgmbS0+c2VtKTsKKwlyZXR1cm4gY29waWVkOworRW5vbWVtOgorCWVyciA9IC1FTk9NRU07CisJZ290byBEb25lOworRWZhdWx0OgorCWVyciA9IC1FRkFVTFQ7CisJZ290byBEb25lOworfQorRVhQT1JUX1NZTUJPTChzZXFfcmVhZCk7CisKK3N0YXRpYyBpbnQgdHJhdmVyc2Uoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3Qgb2Zmc2V0KQoreworCWxvZmZfdCBwb3MgPSAwOworCWludCBlcnJvciA9IDA7CisJdm9pZCAqcDsKKworCW0tPnZlcnNpb24gPSAwOworCW0tPmluZGV4ID0gMDsKKwltLT5jb3VudCA9IG0tPmZyb20gPSAwOworCWlmICghb2Zmc2V0KQorCQlyZXR1cm4gMDsKKwlpZiAoIW0tPmJ1ZikgeworCQltLT5idWYgPSBrbWFsbG9jKG0tPnNpemUgPSBQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoIW0tPmJ1ZikKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKwlwID0gbS0+b3AtPnN0YXJ0KG0sICZtLT5pbmRleCk7CisJd2hpbGUgKHApIHsKKwkJZXJyb3IgPSBQVFJfRVJSKHApOworCQlpZiAoSVNfRVJSKHApKQorCQkJYnJlYWs7CisJCWVycm9yID0gbS0+b3AtPnNob3cobSwgcCk7CisJCWlmIChlcnJvcikKKwkJCWJyZWFrOworCQlpZiAobS0+Y291bnQgPT0gbS0+c2l6ZSkKKwkJCWdvdG8gRW92ZXJmbG93OworCQlpZiAocG9zICsgbS0+Y291bnQgPiBvZmZzZXQpIHsKKwkJCW0tPmZyb20gPSBvZmZzZXQgLSBwb3M7CisJCQltLT5jb3VudCAtPSBtLT5mcm9tOworCQkJYnJlYWs7CisJCX0KKwkJcG9zICs9IG0tPmNvdW50OworCQltLT5jb3VudCA9IDA7CisJCWlmIChwb3MgPT0gb2Zmc2V0KSB7CisJCQltLT5pbmRleCsrOworCQkJYnJlYWs7CisJCX0KKwkJcCA9IG0tPm9wLT5uZXh0KG0sIHAsICZtLT5pbmRleCk7CisJfQorCW0tPm9wLT5zdG9wKG0sIHApOworCXJldHVybiBlcnJvcjsKKworRW92ZXJmbG93OgorCW0tPm9wLT5zdG9wKG0sIHApOworCWtmcmVlKG0tPmJ1Zik7CisJbS0+YnVmID0ga21hbGxvYyhtLT5zaXplIDw8PSAxLCBHRlBfS0VSTkVMKTsKKwlyZXR1cm4gIW0tPmJ1ZiA/IC1FTk9NRU0gOiAtRUFHQUlOOworfQorCisvKioKKyAqCXNlcV9sc2VlayAtCS0+bGxzZWVrKCkgbWV0aG9kIGZvciBzZXF1ZW50aWFsIGZpbGVzLgorICoJQGZpbGUsIEBvZmZzZXQsIEBvcmlnaW46IHNlZSBmaWxlX29wZXJhdGlvbnMgbWV0aG9kCisgKgorICoJUmVhZHktbWFkZSAtPmZfb3AtPmxsc2VlaygpCisgKi8KK2xvZmZfdCBzZXFfbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pCit7CisJc3RydWN0IHNlcV9maWxlICptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlsb25nIGxvbmcgcmV0dmFsID0gLUVJTlZBTDsKKworCWRvd24oJm0tPnNlbSk7CisJbS0+dmVyc2lvbiA9IGZpbGUtPmZfdmVyc2lvbjsKKwlzd2l0Y2ggKG9yaWdpbikgeworCQljYXNlIDE6CisJCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7CisJCWNhc2UgMDoKKwkJCWlmIChvZmZzZXQgPCAwKQorCQkJCWJyZWFrOworCQkJcmV0dmFsID0gb2Zmc2V0OworCQkJaWYgKG9mZnNldCAhPSBmaWxlLT5mX3BvcykgeworCQkJCXdoaWxlICgocmV0dmFsPXRyYXZlcnNlKG0sIG9mZnNldCkpID09IC1FQUdBSU4pCisJCQkJCTsKKwkJCQlpZiAocmV0dmFsKSB7CisJCQkJCS8qIHdpdGggZXh0cmVtZSBwcmVqdWRpY2UuLi4gKi8KKwkJCQkJZmlsZS0+Zl9wb3MgPSAwOworCQkJCQltLT52ZXJzaW9uID0gMDsKKwkJCQkJbS0+aW5kZXggPSAwOworCQkJCQltLT5jb3VudCA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dmFsID0gZmlsZS0+Zl9wb3MgPSBvZmZzZXQ7CisJCQkJfQorCQkJfQorCX0KKwl1cCgmbS0+c2VtKTsKKwlmaWxlLT5mX3ZlcnNpb24gPSBtLT52ZXJzaW9uOworCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MKHNlcV9sc2Vlayk7CisKKy8qKgorICoJc2VxX3JlbGVhc2UgLQlmcmVlIHRoZSBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCBzZXF1ZW50aWFsIGZpbGUuCisgKglAZmlsZTogZmlsZSBpbiBxdWVzdGlvbgorICoJQGlub2RlOiBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZQorICoKKyAqCUZyZWVzIHRoZSBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCBzZXF1ZW50aWFsIGZpbGU7IGNhbiBiZSB1c2VkCisgKglhcyAtPmZfb3AtPnJlbGVhc2UoKSBpZiB5b3UgZG9uJ3QgaGF2ZSBwcml2YXRlIGRhdGEgdG8gZGVzdHJveS4KKyAqLworaW50IHNlcV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzZXFfZmlsZSAqbSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJa2ZyZWUobS0+YnVmKTsKKwlrZnJlZShtKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc2VxX3JlbGVhc2UpOworCisvKioKKyAqCXNlcV9lc2NhcGUgLQlwcmludCBzdHJpbmcgaW50byBidWZmZXIsIGVzY2FwaW5nIHNvbWUgY2hhcmFjdGVycworICoJQG06CXRhcmdldCBidWZmZXIKKyAqCUBzOglzdHJpbmcKKyAqCUBlc2M6CXNldCBvZiBjaGFyYWN0ZXJzIHRoYXQgbmVlZCBlc2NhcGluZworICoKKyAqCVB1dHMgc3RyaW5nIGludG8gYnVmZmVyLCByZXBsYWNpbmcgZWFjaCBvY2N1cnJlbmNlIG9mIGNoYXJhY3RlciBmcm9tCisgKglAZXNjIHdpdGggdXN1YWwgb2N0YWwgZXNjYXBlLiAgUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgLTEgLSBpbgorICoJY2FzZSBvZiBvdmVyZmxvdy4KKyAqLworaW50IHNlcV9lc2NhcGUoc3RydWN0IHNlcV9maWxlICptLCBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICplc2MpCit7CisJY2hhciAqZW5kID0gbS0+YnVmICsgbS0+c2l6ZTsKKyAgICAgICAgY2hhciAqcDsKKwljaGFyIGM7CisKKyAgICAgICAgZm9yIChwID0gbS0+YnVmICsgbS0+Y291bnQ7IChjID0gKnMpICE9ICdcMCcgJiYgcCA8IGVuZDsgcysrKSB7CisJCWlmICghc3RyY2hyKGVzYywgYykpIHsKKwkJCSpwKysgPSBjOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHAgKyAzIDwgZW5kKSB7CisJCQkqcCsrID0gJ1xcJzsKKwkJCSpwKysgPSAnMCcgKyAoKGMgJiAwMzAwKSA+PiA2KTsKKwkJCSpwKysgPSAnMCcgKyAoKGMgJiAwNzApID4+IDMpOworCQkJKnArKyA9ICcwJyArIChjICYgMDcpOworCQkJY29udGludWU7CisJCX0KKwkJbS0+Y291bnQgPSBtLT5zaXplOworCQlyZXR1cm4gLTE7CisgICAgICAgIH0KKwltLT5jb3VudCA9IHAgLSBtLT5idWY7CisgICAgICAgIHJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChzZXFfZXNjYXBlKTsKKworaW50IHNlcV9wcmludGYoc3RydWN0IHNlcV9maWxlICptLCBjb25zdCBjaGFyICpmLCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCBsZW47CisKKwlpZiAobS0+Y291bnQgPCBtLT5zaXplKSB7CisJCXZhX3N0YXJ0KGFyZ3MsIGYpOworCQlsZW4gPSB2c25wcmludGYobS0+YnVmICsgbS0+Y291bnQsIG0tPnNpemUgLSBtLT5jb3VudCwgZiwgYXJncyk7CisJCXZhX2VuZChhcmdzKTsKKwkJaWYgKG0tPmNvdW50ICsgbGVuIDwgbS0+c2l6ZSkgeworCQkJbS0+Y291bnQgKz0gbGVuOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJbS0+Y291bnQgPSBtLT5zaXplOworCXJldHVybiAtMTsKK30KK0VYUE9SVF9TWU1CT0woc2VxX3ByaW50Zik7CisKK2ludCBzZXFfcGF0aChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sCisJICAgICBzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCSAgICAgY2hhciAqZXNjKQoreworCWlmIChtLT5jb3VudCA8IG0tPnNpemUpIHsKKwkJY2hhciAqcyA9IG0tPmJ1ZiArIG0tPmNvdW50OworCQljaGFyICpwID0gZF9wYXRoKGRlbnRyeSwgbW50LCBzLCBtLT5zaXplIC0gbS0+Y291bnQpOworCQlpZiAoIUlTX0VSUihwKSkgeworCQkJd2hpbGUgKHMgPD0gcCkgeworCQkJCWNoYXIgYyA9ICpwKys7CisJCQkJaWYgKCFjKSB7CisJCQkJCXAgPSBtLT5idWYgKyBtLT5jb3VudDsKKwkJCQkJbS0+Y291bnQgPSBzIC0gbS0+YnVmOworCQkJCQlyZXR1cm4gcyAtIHA7CisJCQkJfSBlbHNlIGlmICghc3RyY2hyKGVzYywgYykpIHsKKwkJCQkJKnMrKyA9IGM7CisJCQkJfSBlbHNlIGlmIChzICsgNCA+IHApIHsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIHsKKwkJCQkJKnMrKyA9ICdcXCc7CisJCQkJCSpzKysgPSAnMCcgKyAoKGMgJiAwMzAwKSA+PiA2KTsKKwkJCQkJKnMrKyA9ICcwJyArICgoYyAmIDA3MCkgPj4gMyk7CisJCQkJCSpzKysgPSAnMCcgKyAoYyAmIDA3KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJbS0+Y291bnQgPSBtLT5zaXplOworCXJldHVybiAtMTsKK30KK0VYUE9SVF9TWU1CT0woc2VxX3BhdGgpOworCitzdGF0aWMgdm9pZCAqc2luZ2xlX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcCwgbG9mZl90ICpwb3MpCit7CisJcmV0dXJuIE5VTEwgKyAoKnBvcyA9PSAwKTsKK30KKworc3RhdGljIHZvaWQgKnNpbmdsZV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzaW5nbGVfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCit7Cit9CisKK2ludCBzaW5nbGVfb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50ICgqc2hvdykoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKiksCisJCXZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNlcV9vcGVyYXRpb25zICpvcCA9IGttYWxsb2Moc2l6ZW9mKCpvcCksIEdGUF9LRVJORUwpOworCWludCByZXMgPSAtRU5PTUVNOworCisJaWYgKG9wKSB7CisJCW9wLT5zdGFydCA9IHNpbmdsZV9zdGFydDsKKwkJb3AtPm5leHQgPSBzaW5nbGVfbmV4dDsKKwkJb3AtPnN0b3AgPSBzaW5nbGVfc3RvcDsKKwkJb3AtPnNob3cgPSBzaG93OworCQlyZXMgPSBzZXFfb3BlbihmaWxlLCBvcCk7CisJCWlmICghcmVzKQorCQkJKChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGEpLT5wcml2YXRlID0gZGF0YTsKKwkJZWxzZQorCQkJa2ZyZWUob3ApOworCX0KKwlyZXR1cm4gcmVzOworfQorRVhQT1JUX1NZTUJPTChzaW5nbGVfb3Blbik7CisKK2ludCBzaW5nbGVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgKm9wID0gKChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGEpLT5vcDsKKwlpbnQgcmVzID0gc2VxX3JlbGVhc2UoaW5vZGUsIGZpbGUpOworCWtmcmVlKG9wKTsKKwlyZXR1cm4gcmVzOworfQorRVhQT1JUX1NZTUJPTChzaW5nbGVfcmVsZWFzZSk7CisKK2ludCBzZXFfcmVsZWFzZV9wcml2YXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzZXFfZmlsZSAqc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJa2ZyZWUoc2VxLT5wcml2YXRlKTsKKwlzZXEtPnByaXZhdGUgPSBOVUxMOworCXJldHVybiBzZXFfcmVsZWFzZShpbm9kZSwgZmlsZSk7Cit9CitFWFBPUlRfU1lNQk9MKHNlcV9yZWxlYXNlX3ByaXZhdGUpOworCitpbnQgc2VxX3B1dGMoc3RydWN0IHNlcV9maWxlICptLCBjaGFyIGMpCit7CisJaWYgKG0tPmNvdW50IDwgbS0+c2l6ZSkgeworCQltLT5idWZbbS0+Y291bnQrK10gPSBjOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC0xOworfQorRVhQT1JUX1NZTUJPTChzZXFfcHV0Yyk7CisKK2ludCBzZXFfcHV0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGNvbnN0IGNoYXIgKnMpCit7CisJaW50IGxlbiA9IHN0cmxlbihzKTsKKwlpZiAobS0+Y291bnQgKyBsZW4gPCBtLT5zaXplKSB7CisJCW1lbWNweShtLT5idWYgKyBtLT5jb3VudCwgcywgbGVuKTsKKwkJbS0+Y291bnQgKz0gbGVuOworCQlyZXR1cm4gMDsKKwl9CisJbS0+Y291bnQgPSBtLT5zaXplOworCXJldHVybiAtMTsKK30KK0VYUE9SVF9TWU1CT0woc2VxX3B1dHMpOwpkaWZmIC0tZ2l0IGEvZnMvc21iZnMvTWFrZWZpbGUgYi9mcy9zbWJmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzI0NmI3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvc21iZnMvTWFrZWZpbGUKQEAgLTAsMCArMSwzOSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IHNtYi1maWxlc3lzdGVtIHJvdXRpbmVzLgorIworCitvYmotJChDT05GSUdfU01CX0ZTKSArPSBzbWJmcy5vCisKK3NtYmZzLW9ianMgOj0gcHJvYy5vIGRpci5vIGNhY2hlLm8gc29jay5vIGlub2RlLm8gZmlsZS5vIGlvY3RsLm8gZ2V0b3B0Lm8gXAorCQlzeW1saW5rLm8gc21iaW9kLm8gcmVxdWVzdC5vCisKKyMgSWYgeW91IHdhbnQgZGVidWdnaW5nIG91dHB1dCwgeW91IG1heSBhZGQgdGhlc2UgZmxhZ3MgdG8gdGhlIEVYVFJBX0NGTEFHUworIyBTTUJGU19QQVJBTk9JQSBzaG91bGQgbm9ybWFsbHkgYmUgZW5hYmxlZC4KKworRVhUUkFfQ0ZMQUdTICs9IC1EU01CRlNfUEFSQU5PSUEKKyNFWFRSQV9DRkxBR1MgKz0gLURTTUJGU19ERUJVRworI0VYVFJBX0NGTEFHUyArPSAtRFNNQkZTX0RFQlVHX1ZFUkJPU0UKKyNFWFRSQV9DRkxBR1MgKz0gLURERUJVR19TTUJfTUFMTE9DCisjRVhUUkFfQ0ZMQUdTICs9IC1EREVCVUdfU01CX1RJTUVTVEFNUAorI0VYVFJBX0NGTEFHUyArPSAtV2Vycm9yCisKKyMKKyMgTWFpbnRhaW5lciBydWxlcworIworCisjIGdldG9wdC5jIG5vdCBpbmNsdWRlZC4gSXQgaXMgaW50ZW50aW9uYWxseSBzZXBhcmF0ZQorU1JDID0gcHJvYy5jIGRpci5jIGNhY2hlLmMgc29jay5jIGlub2RlLmMgZmlsZS5jIGlvY3RsLmMgc21iaW9kLmMgcmVxdWVzdC5jIFwKKwlzeW1saW5rLmMKKworcHJvdG86CisJLXJtIC1mIHByb3RvLmgKKwlAZWNobyA+ICBwcm90bzIuaCAiLyoiCisJQGVjaG8gPj4gcHJvdG8yLmggIiAqICBBdXRvZ2VuZXJhdGVkIHdpdGggY3Byb3RvIG9uOiAiIGBkYXRlYAorCUBlY2hvID4+IHByb3RvMi5oICIgKi8iCisJQGVjaG8gPj4gcHJvdG8yLmggIiIKKwlAZWNobyA+PiBwcm90bzIuaCAic3RydWN0IHNtYl9yZXF1ZXN0OyIKKwlAZWNobyA+PiBwcm90bzIuaCAic3RydWN0IHNvY2s7IgorCUBlY2hvID4+IHByb3RvMi5oICJzdHJ1Y3Qgc3RhdGZzOyIKKwlAZWNobyA+PiBwcm90bzIuaCAiIgorCWNwcm90byAtRSAiZ2NjIC1FIiAtZSAtdiAtSSAkKFRPUERJUikvaW5jbHVkZSAtRE1BS0lOR19QUk9UTyAtRF9fS0VSTkVMX18gJChTUkMpID4+IHByb3RvMi5oCisJbXYgcHJvdG8yLmggcHJvdG8uaApkaWZmIC0tZ2l0IGEvZnMvc21iZnMvY2FjaGUuYyBiL2ZzL3NtYmZzL2NhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNlNmI4MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NtYmZzL2NhY2hlLmMKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiAgY2FjaGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NyBieSBCaWxsIEhhd2VzCisgKgorICogUm91dGluZXMgdG8gc3VwcG9ydCBkaXJlY3RvcnkgY2FjaGVpbmcgdXNpbmcgdGhlIHBhZ2UgY2FjaGUuCisgKiBUaGlzIGNhY2hlIGNvZGUgaXMgYWxtb3N0IGRpcmVjdGx5IHRha2VuIGZyb20gbmNwZnMuCisgKgorICogUGxlYXNlIGFkZCBhIG5vdGUgYWJvdXQgeW91ciBjaGFuZ2VzIHRvIHNtYmZzIGluIHRoZSBDaGFuZ2VMb2cgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kaXJlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbWJfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisjaW5jbHVkZSAic21iX2RlYnVnLmgiCisjaW5jbHVkZSAicHJvdG8uaCIKKworLyoKKyAqIEZvcmNlIHRoZSBuZXh0IGF0dGVtcHQgdG8gdXNlIHRoZSBjYWNoZSB0byBiZSBhIHRpbWVvdXQuCisgKiBJZiB3ZSBjYW4ndCBmaW5kIHRoZSBwYWdlIHRoYXQncyBmaW5lLCBpdCB3aWxsIGNhdXNlIGEgcmVmcmVzaC4KKyAqLwordm9pZAorc21iX2ludmFsaWRfZGlyX2NhY2hlKHN0cnVjdCBpbm9kZSAqIGRpcikKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2lub2RlKGRpcik7CisJdW5pb24gIHNtYl9kaXJfY2FjaGUgKmNhY2hlID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisKKwlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKCZkaXItPmlfZGF0YSwgMCk7CisJaWYgKCFwYWdlKQorCQlnb3RvIG91dDsKKworCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwljYWNoZSA9IGttYXAocGFnZSk7CisJY2FjaGUtPmhlYWQudGltZSA9IGppZmZpZXMgLSBTTUJfTUFYX0FHRShzZXJ2ZXIpOworCisJa3VubWFwKHBhZ2UpOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKK291dF91bmxvY2s6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworb3V0OgorCXJldHVybjsKK30KKworLyoKKyAqIE1hcmsgYWxsIGRlbnRyaWVzIGZvciAncGFyZW50JyBhcyBpbnZhbGlkLCBmb3JjaW5nIHRoZW0gdG8gYmUgcmUtcmVhZAorICovCit2b2lkCitzbWJfaW52YWxpZGF0ZV9kaXJjYWNoZV9lbnRyaWVzKHN0cnVjdCBkZW50cnkgKnBhcmVudCkKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2RlbnRyeShwYXJlbnQpOworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJbmV4dCA9IHBhcmVudC0+ZF9zdWJkaXJzLm5leHQ7CisJd2hpbGUgKG5leHQgIT0gJnBhcmVudC0+ZF9zdWJkaXJzKSB7CisJCWRlbnRyeSA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IGRlbnRyeSwgZF9jaGlsZCk7CisJCWRlbnRyeS0+ZF9mc2RhdGEgPSBOVUxMOworCQlzbWJfYWdlX2RlbnRyeShzZXJ2ZXIsIGRlbnRyeSk7CisJCW5leHQgPSBuZXh0LT5uZXh0OworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworfQorCisvKgorICogZGdldCwgYnV0IHJlcXVpcmUgdGhhdCBmcG9zIGFuZCBwYXJlbnQgbWF0Y2hlcyB3aGF0IHRoZSBkZW50cnkgY29udGFpbnMuCisgKiBkZW50cnkgaXMgbm90IGtub3duIHRvIGJlIGEgdmFsaWQgcG9pbnRlciBhdCBlbnRyeS4KKyAqLworc3RydWN0IGRlbnRyeSAqCitzbWJfZGdldF9mcG9zKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGRlbnRyeSAqcGFyZW50LCB1bnNpZ25lZCBsb25nIGZwb3MpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudCA9IGRlbnRyeTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0OworCisJaWYgKGRfdmFsaWRhdGUoZGVudCwgcGFyZW50KSkgeworCQlpZiAoZGVudC0+ZF9uYW1lLmxlbiA8PSBTTUJfTUFYTkFNRUxFTiAmJgorCQkgICAgKHVuc2lnbmVkIGxvbmcpZGVudC0+ZF9mc2RhdGEgPT0gZnBvcykgeworCQkJaWYgKCFkZW50LT5kX2lub2RlKSB7CisJCQkJZHB1dChkZW50KTsKKwkJCQlkZW50ID0gTlVMTDsKKwkJCX0KKwkJCXJldHVybiBkZW50OworCQl9CisJCWRwdXQoZGVudCk7CisJfQorCisJLyogSWYgYSBwb2ludGVyIGlzIGludmFsaWQsIHdlIHNlYXJjaCB0aGUgZGVudHJ5LiAqLworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCW5leHQgPSBwYXJlbnQtPmRfc3ViZGlycy5uZXh0OworCXdoaWxlIChuZXh0ICE9ICZwYXJlbnQtPmRfc3ViZGlycykgeworCQlkZW50ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKwkJaWYgKCh1bnNpZ25lZCBsb25nKWRlbnQtPmRfZnNkYXRhID09IGZwb3MpIHsKKwkJCWlmIChkZW50LT5kX2lub2RlKQorCQkJCWRnZXRfbG9ja2VkKGRlbnQpOworCQkJZWxzZQorCQkJCWRlbnQgPSBOVUxMOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJCW5leHQgPSBuZXh0LT5uZXh0OworCX0KKwlkZW50ID0gTlVMTDsKK291dF91bmxvY2s6CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwlyZXR1cm4gZGVudDsKK30KKworCisvKgorICogQ3JlYXRlIGRlbnRyeS9pbm9kZSBmb3IgdGhpcyBmaWxlIGFuZCBhZGQgaXQgdG8gdGhlIGRpcmNhY2hlLgorICovCitpbnQKK3NtYl9maWxsX2NhY2hlKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyLAorCSAgICAgICBzdHJ1Y3Qgc21iX2NhY2hlX2NvbnRyb2wgKmN0cmwsIHN0cnVjdCBxc3RyICpxbmFtZSwKKwkgICAgICAgc3RydWN0IHNtYl9mYXR0ciAqZW50cnkpCit7CisJc3RydWN0IGRlbnRyeSAqbmV3ZGVudCwgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqbmV3aW5vLCAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHNtYl9jYWNoZV9jb250cm9sIGN0bCA9ICpjdHJsOworCWludCB2YWxpZCA9IDA7CisJaW50IGhhc2hlZCA9IDA7CisJaW5vX3QgaW5vID0gMDsKKworCXFuYW1lLT5oYXNoID0gZnVsbF9uYW1lX2hhc2gocW5hbWUtPm5hbWUsIHFuYW1lLT5sZW4pOworCisJaWYgKGRlbnRyeS0+ZF9vcCAmJiBkZW50cnktPmRfb3AtPmRfaGFzaCkKKwkJaWYgKGRlbnRyeS0+ZF9vcC0+ZF9oYXNoKGRlbnRyeSwgcW5hbWUpICE9IDApCisJCQlnb3RvIGVuZF9hZHZhbmNlOworCisJbmV3ZGVudCA9IGRfbG9va3VwKGRlbnRyeSwgcW5hbWUpOworCisJaWYgKCFuZXdkZW50KSB7CisJCW5ld2RlbnQgPSBkX2FsbG9jKGRlbnRyeSwgcW5hbWUpOworCQlpZiAoIW5ld2RlbnQpCisJCQlnb3RvIGVuZF9hZHZhbmNlOworCX0gZWxzZSB7CisJCWhhc2hlZCA9IDE7CisJCW1lbWNweSgoY2hhciAqKSBuZXdkZW50LT5kX25hbWUubmFtZSwgcW5hbWUtPm5hbWUsCisJCSAgICAgICBuZXdkZW50LT5kX25hbWUubGVuKTsKKwl9CisKKwlpZiAoIW5ld2RlbnQtPmRfaW5vZGUpIHsKKwkJc21iX3JlbmV3X3RpbWVzKG5ld2RlbnQpOworCQllbnRyeS0+Zl9pbm8gPSBpdW5pcXVlKGlub2RlLT5pX3NiLCAyKTsKKwkJbmV3aW5vID0gc21iX2lnZXQoaW5vZGUtPmlfc2IsIGVudHJ5KTsKKwkJaWYgKG5ld2lubykgeworCQkJc21iX25ld19kZW50cnkobmV3ZGVudCk7CisJCQlkX2luc3RhbnRpYXRlKG5ld2RlbnQsIG5ld2lubyk7CisJCQlpZiAoIWhhc2hlZCkKKwkJCQlkX3JlaGFzaChuZXdkZW50KTsKKwkJfQorCX0gZWxzZQorCQlzbWJfc2V0X2lub2RlX2F0dHIobmV3ZGVudC0+ZF9pbm9kZSwgZW50cnkpOworCisgICAgICAgIGlmIChuZXdkZW50LT5kX2lub2RlKSB7CisJCWlubyA9IG5ld2RlbnQtPmRfaW5vZGUtPmlfaW5vOworCQluZXdkZW50LT5kX2ZzZGF0YSA9ICh2b2lkICopIGN0bC5mcG9zOworCQlzbWJfbmV3X2RlbnRyeShuZXdkZW50KTsKKwl9CisKKwlpZiAoY3RsLmlkeCA+PSBTTUJfRElSQ0FDSEVfU0laRSkgeworCQlpZiAoY3RsLnBhZ2UpIHsKKwkJCWt1bm1hcChjdGwucGFnZSk7CisJCQlTZXRQYWdlVXB0b2RhdGUoY3RsLnBhZ2UpOworCQkJdW5sb2NrX3BhZ2UoY3RsLnBhZ2UpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKGN0bC5wYWdlKTsKKwkJfQorCQljdGwuY2FjaGUgPSBOVUxMOworCQljdGwuaWR4ICAtPSBTTUJfRElSQ0FDSEVfU0laRTsKKwkJY3RsLm9mcyAgKz0gMTsKKwkJY3RsLnBhZ2UgID0gZ3JhYl9jYWNoZV9wYWdlKCZpbm9kZS0+aV9kYXRhLCBjdGwub2ZzKTsKKwkJaWYgKGN0bC5wYWdlKQorCQkJY3RsLmNhY2hlID0ga21hcChjdGwucGFnZSk7CisJfQorCWlmIChjdGwuY2FjaGUpIHsKKwkJY3RsLmNhY2hlLT5kZW50cnlbY3RsLmlkeF0gPSBuZXdkZW50OworCQl2YWxpZCA9IDE7CisJfQorCWRwdXQobmV3ZGVudCk7CisKK2VuZF9hZHZhbmNlOgorCWlmICghdmFsaWQpCisJCWN0bC52YWxpZCA9IDA7CisJaWYgKCFjdGwuZmlsbGVkICYmIChjdGwuZnBvcyA9PSBmaWxwLT5mX3BvcykpIHsKKwkJaWYgKCFpbm8pCisJCQlpbm8gPSBmaW5kX2lub2RlX251bWJlcihkZW50cnksIHFuYW1lKTsKKwkJaWYgKCFpbm8pCisJCQlpbm8gPSBpdW5pcXVlKGlub2RlLT5pX3NiLCAyKTsKKwkJY3RsLmZpbGxlZCA9IGZpbGxkaXIoZGlyZW50LCBxbmFtZS0+bmFtZSwgcW5hbWUtPmxlbiwKKwkJCQkgICAgIGZpbHAtPmZfcG9zLCBpbm8sIERUX1VOS05PV04pOworCQlpZiAoIWN0bC5maWxsZWQpCisJCQlmaWxwLT5mX3BvcyArPSAxOworCX0KKwljdGwuZnBvcyArPSAxOworCWN0bC5pZHggICs9IDE7CisJKmN0cmwgPSBjdGw7CisJcmV0dXJuIChjdGwudmFsaWQgfHwgIWN0bC5maWxsZWQpOworfQpkaWZmIC0tZ2l0IGEvZnMvc21iZnMvZGlyLmMgYi9mcy9zbWJmcy9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmMzM2UxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc21iZnMvZGlyLmMKQEAgLTAsMCArMSw2OTMgQEAKKy8qCisgKiAgZGlyLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IGJ5IFBhYWwtS3IuIEVuZ3N0YWQgYW5kIFZvbGtlciBMZW5kZWNrZQorICogIENvcHlyaWdodCAoQykgMTk5NyBieSBWb2xrZXIgTGVuZGVja2UKKyAqCisgKiAgUGxlYXNlIGFkZCBhIG5vdGUgYWJvdXQgeW91ciBjaGFuZ2VzIHRvIHNtYmZzIGluIHRoZSBDaGFuZ2VMb2cgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorCisjaW5jbHVkZSA8bGludXgvc21iX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21iX21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvc21ibm8uaD4KKworI2luY2x1ZGUgInNtYl9kZWJ1Zy5oIgorI2luY2x1ZGUgInByb3RvLmgiCisKK3N0YXRpYyBpbnQgc21iX3JlYWRkaXIoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOworc3RhdGljIGludCBzbWJfZGlyX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqc21iX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOworc3RhdGljIGludCBzbWJfY3JlYXRlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCwgc3RydWN0IG5hbWVpZGF0YSAqKTsKK3N0YXRpYyBpbnQgc21iX21rZGlyKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7CitzdGF0aWMgaW50IHNtYl9ybWRpcihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqKTsKK3N0YXRpYyBpbnQgc21iX3VubGluayhzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqKTsKK3N0YXRpYyBpbnQgc21iX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLAorCQkgICAgICBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqKTsKK3N0YXRpYyBpbnQgc21iX21ha2Vfbm9kZShzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosaW50LGRldl90KTsKK3N0YXRpYyBpbnQgc21iX2xpbmsoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqKTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbWJfZGlyX29wZXJhdGlvbnMgPQoreworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBzbWJfcmVhZGRpciwKKwkuaW9jdGwJCT0gc21iX2lvY3RsLAorCS5vcGVuCQk9IHNtYl9kaXJfb3BlbiwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNtYl9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9Cit7CisJLmNyZWF0ZQkJPSBzbWJfY3JlYXRlLAorCS5sb29rdXAJCT0gc21iX2xvb2t1cCwKKwkudW5saW5rCQk9IHNtYl91bmxpbmssCisJLm1rZGlyCQk9IHNtYl9ta2RpciwKKwkucm1kaXIJCT0gc21iX3JtZGlyLAorCS5yZW5hbWUJCT0gc21iX3JlbmFtZSwKKwkuZ2V0YXR0cgk9IHNtYl9nZXRhdHRyLAorCS5zZXRhdHRyCT0gc21iX25vdGlmeV9jaGFuZ2UsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzbWJfZGlyX2lub2RlX29wZXJhdGlvbnNfdW5peCA9Cit7CisJLmNyZWF0ZQkJPSBzbWJfY3JlYXRlLAorCS5sb29rdXAJCT0gc21iX2xvb2t1cCwKKwkudW5saW5rCQk9IHNtYl91bmxpbmssCisJLm1rZGlyCQk9IHNtYl9ta2RpciwKKwkucm1kaXIJCT0gc21iX3JtZGlyLAorCS5yZW5hbWUJCT0gc21iX3JlbmFtZSwKKwkuZ2V0YXR0cgk9IHNtYl9nZXRhdHRyLAorCS5zZXRhdHRyCT0gc21iX25vdGlmeV9jaGFuZ2UsCisJLnN5bWxpbmsJPSBzbWJfc3ltbGluaywKKwkubWtub2QJCT0gc21iX21ha2Vfbm9kZSwKKwkubGluawkJPSBzbWJfbGluaywKK307CisKKy8qCisgKiBSZWFkIGEgZGlyZWN0b3J5LCB1c2luZyBmaWxsZGlyIHRvIGZpbGwgdGhlIGRpcmVudCBtZW1vcnkuCisgKiBzbWJfcHJvY19yZWFkZGlyIGRvZXMgdGhlIGFjdHVhbCByZWFkaW5nIGZyb20gdGhlIHNtYiBzZXJ2ZXIuCisgKgorICogVGhlIGNhY2hlIGNvZGUgaXMgYWxtb3N0IGRpcmVjdGx5IHRha2VuIGZyb20gbmNwZnMKKyAqLworc3RhdGljIGludCAKK3NtYl9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqZGlyID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KGRlbnRyeSk7CisJdW5pb24gIHNtYl9kaXJfY2FjaGUgKmNhY2hlID0gTlVMTDsKKwlzdHJ1Y3Qgc21iX2NhY2hlX2NvbnRyb2wgY3RsOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwlpbnQgcmVzdWx0OworCisJY3RsLnBhZ2UgID0gTlVMTDsKKwljdGwuY2FjaGUgPSBOVUxMOworCisJVkVSQk9TRSgicmVhZGluZyAlcy8lcywgZl9wb3M9JWRcbiIsCisJCURFTlRSWV9QQVRIKGRlbnRyeSksICAoaW50KSBmaWxwLT5mX3Bvcyk7CisKKwlyZXN1bHQgPSAwOworCisJbG9ja19rZXJuZWwoKTsKKworCXN3aXRjaCAoKHVuc2lnbmVkIGludCkgZmlscC0+Zl9wb3MpIHsKKwljYXNlIDA6CisJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4iLCAxLCAwLCBkaXItPmlfaW5vLCBEVF9ESVIpIDwgMCkKKwkJCWdvdG8gb3V0OworCQlmaWxwLT5mX3BvcyA9IDE7CisJCS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSAxOgorCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIDEsIHBhcmVudF9pbm8oZGVudHJ5KSwgRFRfRElSKSA8IDApCisJCQlnb3RvIG91dDsKKwkJZmlscC0+Zl9wb3MgPSAyOworCX0KKworCS8qCisJICogTWFrZSBzdXJlIG91ciBpbm9kZSBpcyB1cC10by1kYXRlLgorCSAqLworCXJlc3VsdCA9IHNtYl9yZXZhbGlkYXRlX2lub2RlKGRlbnRyeSk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBvdXQ7CisKKworCXBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UoJmRpci0+aV9kYXRhLCAwKTsKKwlpZiAoIXBhZ2UpCisJCWdvdG8gcmVhZF9yZWFsbHk7CisKKwljdGwuY2FjaGUgPSBjYWNoZSA9IGttYXAocGFnZSk7CisJY3RsLmhlYWQgID0gY2FjaGUtPmhlYWQ7CisKKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSB8fCAhY3RsLmhlYWQuZW9mKSB7CisJCVZFUkJPU0UoIiVzLyVzLCBwYWdlIHVwdG9kYXRlPSVkLCBlb2Y9JWRcbiIsCisJCQkgREVOVFJZX1BBVEgoZGVudHJ5KSwgUGFnZVVwdG9kYXRlKHBhZ2UpLGN0bC5oZWFkLmVvZik7CisJCWdvdG8gaW5pdF9jYWNoZTsKKwl9CisKKwlpZiAoZmlscC0+Zl9wb3MgPT0gMikgeworCQlpZiAoamlmZmllcyAtIGN0bC5oZWFkLnRpbWUgPj0gU01CX01BWF9BR0Uoc2VydmVyKSkKKwkJCWdvdG8gaW5pdF9jYWNoZTsKKworCQkvKgorCQkgKiBOLkIuIG5jcGZzIGNoZWNrcyBtdGltZSBvZiBkZW50cnkgdG9vIGhlcmUsIHdlIGRvbid0LgorCQkgKiAgIDEuIGNvbW1vbiBzbWIgc2VydmVycyBkbyBub3QgdXBkYXRlIG10aW1lIG9uIGRpciBjaGFuZ2VzCisJCSAqICAgMi4gaXQgcmVxdWlyZXMgYW4gZXh0cmEgc21iIHJlcXVlc3QKKwkJICogICAgICAocmV2YWxpZGF0ZSBoYXMgdGhlIHNhbWUgdGltZW91dCBhcyBjdGwuaGVhZC50aW1lKQorCQkgKgorCQkgKiBJbnN0ZWFkIHNtYmZzIGludmFsaWRhdGVzIGl0cyBvd24gY2FjaGUgb24gbG9jYWwgY2hhbmdlcworCQkgKiBhbmQgcmVtb3RlIGNoYW5nZXMgYXJlIG5vdCBzZWVuIHVudGlsIHRpbWVvdXQuCisJCSAqLworCX0KKworCWlmIChmaWxwLT5mX3BvcyA+IGN0bC5oZWFkLmVuZCkKKwkJZ290byBmaW5pc2hlZDsKKworCWN0bC5mcG9zID0gZmlscC0+Zl9wb3MgKyAoU01CX0RJUkNBQ0hFX1NUQVJUIC0gMik7CisJY3RsLm9mcyAgPSBjdGwuZnBvcyAvIFNNQl9ESVJDQUNIRV9TSVpFOworCWN0bC5pZHggID0gY3RsLmZwb3MgJSBTTUJfRElSQ0FDSEVfU0laRTsKKworCWZvciAoOzspIHsKKwkJaWYgKGN0bC5vZnMgIT0gMCkgeworCQkJY3RsLnBhZ2UgPSBmaW5kX2xvY2tfcGFnZSgmZGlyLT5pX2RhdGEsIGN0bC5vZnMpOworCQkJaWYgKCFjdGwucGFnZSkKKwkJCQlnb3RvIGludmFsaWRfY2FjaGU7CisJCQljdGwuY2FjaGUgPSBrbWFwKGN0bC5wYWdlKTsKKwkJCWlmICghUGFnZVVwdG9kYXRlKGN0bC5wYWdlKSkKKwkJCQlnb3RvIGludmFsaWRfY2FjaGU7CisJCX0KKwkJd2hpbGUgKGN0bC5pZHggPCBTTUJfRElSQ0FDSEVfU0laRSkgeworCQkJc3RydWN0IGRlbnRyeSAqZGVudDsKKwkJCWludCByZXM7CisKKwkJCWRlbnQgPSBzbWJfZGdldF9mcG9zKGN0bC5jYWNoZS0+ZGVudHJ5W2N0bC5pZHhdLAorCQkJCQkgICAgIGRlbnRyeSwgZmlscC0+Zl9wb3MpOworCQkJaWYgKCFkZW50KQorCQkJCWdvdG8gaW52YWxpZF9jYWNoZTsKKworCQkJcmVzID0gZmlsbGRpcihkaXJlbnQsIGRlbnQtPmRfbmFtZS5uYW1lLAorCQkJCSAgICAgIGRlbnQtPmRfbmFtZS5sZW4sIGZpbHAtPmZfcG9zLAorCQkJCSAgICAgIGRlbnQtPmRfaW5vZGUtPmlfaW5vLCBEVF9VTktOT1dOKTsKKwkJCWRwdXQoZGVudCk7CisJCQlpZiAocmVzKQorCQkJCWdvdG8gZmluaXNoZWQ7CisJCQlmaWxwLT5mX3BvcyArPSAxOworCQkJY3RsLmlkeCArPSAxOworCQkJaWYgKGZpbHAtPmZfcG9zID4gY3RsLmhlYWQuZW5kKQorCQkJCWdvdG8gZmluaXNoZWQ7CisJCX0KKwkJaWYgKGN0bC5wYWdlKSB7CisJCQlrdW5tYXAoY3RsLnBhZ2UpOworCQkJU2V0UGFnZVVwdG9kYXRlKGN0bC5wYWdlKTsKKwkJCXVubG9ja19wYWdlKGN0bC5wYWdlKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShjdGwucGFnZSk7CisJCQljdGwucGFnZSA9IE5VTEw7CisJCX0KKwkJY3RsLmlkeCAgPSAwOworCQljdGwub2ZzICs9IDE7CisJfQoraW52YWxpZF9jYWNoZToKKwlpZiAoY3RsLnBhZ2UpIHsKKwkJa3VubWFwKGN0bC5wYWdlKTsKKwkJdW5sb2NrX3BhZ2UoY3RsLnBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UoY3RsLnBhZ2UpOworCQljdGwucGFnZSA9IE5VTEw7CisJfQorCWN0bC5jYWNoZSA9IGNhY2hlOworaW5pdF9jYWNoZToKKwlzbWJfaW52YWxpZGF0ZV9kaXJjYWNoZV9lbnRyaWVzKGRlbnRyeSk7CisJY3RsLmhlYWQudGltZSA9IGppZmZpZXM7CisJY3RsLmhlYWQuZW9mID0gMDsKKwljdGwuZnBvcyA9IDI7CisJY3RsLm9mcyA9IDA7CisJY3RsLmlkeCA9IFNNQl9ESVJDQUNIRV9TVEFSVDsKKwljdGwuZmlsbGVkID0gMDsKKwljdGwudmFsaWQgID0gMTsKK3JlYWRfcmVhbGx5OgorCXJlc3VsdCA9IHNlcnZlci0+b3BzLT5yZWFkZGlyKGZpbHAsIGRpcmVudCwgZmlsbGRpciwgJmN0bCk7CisJaWYgKGN0bC5pZHggPT0gLTEpCisJCWdvdG8gaW52YWxpZF9jYWNoZTsJLyogcmV0cnkgKi8KKwljdGwuaGVhZC5lbmQgPSBjdGwuZnBvcyAtIDE7CisJY3RsLmhlYWQuZW9mID0gY3RsLnZhbGlkOworZmluaXNoZWQ6CisJaWYgKHBhZ2UpIHsKKwkJY2FjaGUtPmhlYWQgPSBjdGwuaGVhZDsKKwkJa3VubWFwKHBhZ2UpOworCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJfQorCWlmIChjdGwucGFnZSkgeworCQlrdW5tYXAoY3RsLnBhZ2UpOworCQlTZXRQYWdlVXB0b2RhdGUoY3RsLnBhZ2UpOworCQl1bmxvY2tfcGFnZShjdGwucGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShjdGwucGFnZSk7CisJfQorb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CitzbWJfZGlyX29wZW4oc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyOworCWludCBlcnJvciA9IDA7CisKKwlWRVJCT1NFKCIoJXMvJXMpXG4iLCBkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwKKwkJZmlsZS0+Zl9kZW50cnktPmRfbmFtZS5uYW1lKTsKKworCS8qCisJICogRGlyZWN0b3J5IHRpbWVzdGFtcHMgaW4gdGhlIGNvcmUgcHJvdG9jb2wgYXJlbid0IHVwZGF0ZWQKKwkgKiB3aGVuIGEgZmlsZSBpcyBhZGRlZCwgc28gd2UgZ2l2ZSB0aGVtIGEgdmVyeSBzaG9ydCBUVEwuCisJICovCisJbG9ja19rZXJuZWwoKTsKKwlzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkoZGVudHJ5KTsKKwlpZiAoc2VydmVyLT5vcHQucHJvdG9jb2wgPCBTTUJfUFJPVE9DT0xfTEFOTUFOMikgeworCQl1bnNpZ25lZCBsb25nIGFnZSA9IGppZmZpZXMgLSBTTUJfSShkaXIpLT5vbGRtdGltZTsKKwkJaWYgKGFnZSA+IDIqSFopCisJCQlzbWJfaW52YWxpZF9kaXJfY2FjaGUoZGlyKTsKKwl9CisKKwkvKgorCSAqIE5vdGU6IGluIG9yZGVyIHRvIGFsbG93IHRoZSBzbWJtb3VudCBwcm9jZXNzIHRvIG9wZW4gdGhlCisJICogbW91bnQgcG9pbnQsIHdlIG9ubHkgcmV2YWxpZGF0ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyB2YWxpZCBvcgorCSAqIGlmIHRoZSBwcm9jZXNzIGlzIHRyeWluZyB0byBhY2Nlc3Mgc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHJvb3QuCisJICovCisJaWYgKHNlcnZlci0+c3RhdGUgPT0gQ09OTl9WQUxJRCB8fCAhSVNfUk9PVChkZW50cnkpKQorCQllcnJvciA9IHNtYl9yZXZhbGlkYXRlX2lub2RlKGRlbnRyeSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIERlbnRyeSBvcGVyYXRpb25zIHJvdXRpbmVzCisgKi8KK3N0YXRpYyBpbnQgc21iX2xvb2t1cF92YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBuYW1laWRhdGEgKik7CitzdGF0aWMgaW50IHNtYl9oYXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBxc3RyICopOworc3RhdGljIGludCBzbWJfY29tcGFyZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgcXN0ciAqLCBzdHJ1Y3QgcXN0ciAqKTsKK3N0YXRpYyBpbnQgc21iX2RlbGV0ZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqKTsKKworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBzbWJmc19kZW50cnlfb3BlcmF0aW9ucyA9Cit7CisJLmRfcmV2YWxpZGF0ZQk9IHNtYl9sb29rdXBfdmFsaWRhdGUsCisJLmRfaGFzaAkJPSBzbWJfaGFzaF9kZW50cnksCisJLmRfY29tcGFyZQk9IHNtYl9jb21wYXJlX2RlbnRyeSwKKwkuZF9kZWxldGUJPSBzbWJfZGVsZXRlX2RlbnRyeSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgc21iZnNfZGVudHJ5X29wZXJhdGlvbnNfY2FzZSA9Cit7CisJLmRfcmV2YWxpZGF0ZQk9IHNtYl9sb29rdXBfdmFsaWRhdGUsCisJLmRfZGVsZXRlCT0gc21iX2RlbGV0ZV9kZW50cnksCit9OworCisKKy8qCisgKiBUaGlzIGlzIHRoZSBjYWxsYmFjayB3aGVuIHRoZSBkY2FjaGUgaGFzIGEgbG9va3VwIGhpdC4KKyAqLworc3RhdGljIGludAorc21iX2xvb2t1cF92YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2RlbnRyeShkZW50cnkpOworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXVuc2lnbmVkIGxvbmcgYWdlID0gamlmZmllcyAtIGRlbnRyeS0+ZF90aW1lOworCWludCB2YWxpZDsKKworCS8qCisJICogVGhlIGRlZmF1bHQgdmFsaWRhdGlvbiBpcyBiYXNlZCBvbiBkZW50cnkgYWdlOgorCSAqIHdlIGJlbGlldmUgaW4gZGVudHJpZXMgZm9yIGEgZmV3IHNlY29uZHMuICAoQnV0IGVhY2gKKwkgKiBzdWNjZXNzZnVsIHNlcnZlciBsb29rdXAgcmVuZXdzIHRoZSB0aW1lc3RhbXAuKQorCSAqLworCXZhbGlkID0gKGFnZSA8PSBTTUJfTUFYX0FHRShzZXJ2ZXIpKTsKKyNpZmRlZiBTTUJGU19ERUJVR19WRVJCT1NFCisJaWYgKCF2YWxpZCkKKwkJVkVSQk9TRSgiJXMvJXMgbm90IHZhbGlkLCBhZ2U9JWx1XG4iLCAKKwkJCURFTlRSWV9QQVRIKGRlbnRyeSksIGFnZSk7CisjZW5kaWYKKworCWlmIChpbm9kZSkgeworCQlsb2NrX2tlcm5lbCgpOworCQlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkgeworCQkJUEFSQU5PSUEoIiVzLyVzIGhhcyBkdWQgaW5vZGVcbiIsIERFTlRSWV9QQVRIKGRlbnRyeSkpOworCQkJdmFsaWQgPSAwOworCQl9IGVsc2UgaWYgKCF2YWxpZCkKKwkJCXZhbGlkID0gKHNtYl9yZXZhbGlkYXRlX2lub2RlKGRlbnRyeSkgPT0gMCk7CisJCXVubG9ja19rZXJuZWwoKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBXaGF0IHNob3VsZCB3ZSBkbyBmb3IgbmVnYXRpdmUgZGVudHJpZXM/CisJCSAqLworCX0KKwlyZXR1cm4gdmFsaWQ7Cit9CisKK3N0YXRpYyBpbnQgCitzbWJfaGFzaF9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGlyLCBzdHJ1Y3QgcXN0ciAqdGhpcykKK3sKKwl1bnNpZ25lZCBsb25nIGhhc2g7CisJaW50IGk7CisKKwloYXNoID0gaW5pdF9uYW1lX2hhc2goKTsKKwlmb3IgKGk9MDsgaSA8IHRoaXMtPmxlbiA7IGkrKykKKwkJaGFzaCA9IHBhcnRpYWxfbmFtZV9oYXNoKHRvbG93ZXIodGhpcy0+bmFtZVtpXSksIGhhc2gpOworCXRoaXMtPmhhc2ggPSBlbmRfbmFtZV9oYXNoKGhhc2gpOworICAKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc21iX2NvbXBhcmVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRpciwgc3RydWN0IHFzdHIgKmEsIHN0cnVjdCBxc3RyICpiKQoreworCWludCBpLCByZXN1bHQgPSAxOworCisJaWYgKGEtPmxlbiAhPSBiLT5sZW4pCisJCWdvdG8gb3V0OworCWZvciAoaT0wOyBpIDwgYS0+bGVuOyBpKyspIHsKKwkJaWYgKHRvbG93ZXIoYS0+bmFtZVtpXSkgIT0gdG9sb3dlcihiLT5uYW1lW2ldKSkKKwkJCWdvdG8gb3V0OworCX0KKwlyZXN1bHQgPSAwOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBjYWxsYmFjayBmcm9tIGRwdXQoKSB3aGVuIGRfY291bnQgaXMgZ29pbmcgdG8gMC4KKyAqIFdlIHVzZSB0aGlzIHRvIHVuaGFzaCBkZW50cmllcyB3aXRoIGJhZCBpbm9kZXMuCisgKi8KK3N0YXRpYyBpbnQKK3NtYl9kZWxldGVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCit7CisJaWYgKGRlbnRyeS0+ZF9pbm9kZSkgeworCQlpZiAoaXNfYmFkX2lub2RlKGRlbnRyeS0+ZF9pbm9kZSkpIHsKKwkJCVBBUkFOT0lBKCJiYWQgaW5vZGUsIHVuaGFzaGluZyAlcy8lc1xuIiwKKwkJCQkgREVOVFJZX1BBVEgoZGVudHJ5KSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIE4uQi4gVW5oYXNoIG5lZ2F0aXZlIGRlbnRyaWVzPyAqLworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgYSBuZXcgZGVudHJ5CisgKi8KK3ZvaWQKK3NtYl9uZXdfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2RlbnRyeShkZW50cnkpOworCisJaWYgKHNlcnZlci0+bW50LT5mbGFncyAmIFNNQl9NT1VOVF9DQVNFKQorCQlkZW50cnktPmRfb3AgPSAmc21iZnNfZGVudHJ5X29wZXJhdGlvbnNfY2FzZTsKKwllbHNlCisJCWRlbnRyeS0+ZF9vcCA9ICZzbWJmc19kZW50cnlfb3BlcmF0aW9uczsKKwlkZW50cnktPmRfdGltZSA9IGppZmZpZXM7Cit9CisKKworLyoKKyAqIFdoZW5ldmVyIGEgbG9va3VwIHN1Y2NlZWRzLCB3ZSBrbm93IHRoZSBwYXJlbnQgZGlyZWN0b3JpZXMKKyAqIGFyZSBhbGwgdmFsaWQsIHNvIHdlIHdhbnQgdG8gdXBkYXRlIHRoZSBkZW50cnkgdGltZXN0YW1wcy4KKyAqIE4uQi4gTW92ZSB0aGlzIHRvIGRjYWNoZT8KKyAqLwordm9pZAorc21iX3JlbmV3X3RpbWVzKHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCit7CisJZGdldChkZW50cnkpOworCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCWZvciAoOzspIHsKKwkJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCisJCWRlbnRyeS0+ZF90aW1lID0gamlmZmllczsKKwkJaWYgKElTX1JPT1QoZGVudHJ5KSkKKwkJCWJyZWFrOworCQlwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OworCQlkZ2V0KHBhcmVudCk7CisJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCWRwdXQoZGVudHJ5KTsKKwkJZGVudHJ5ID0gcGFyZW50OworCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlkcHV0KGRlbnRyeSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKK3NtYl9sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHNtYl9mYXR0ciBmaW5mbzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnJvcjsKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcjsKKworCWVycm9yID0gLUVOQU1FVE9PTE9ORzsKKwlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gU01CX01BWE5BTUVMRU4pCisJCWdvdG8gb3V0OworCisJbG9ja19rZXJuZWwoKTsKKwllcnJvciA9IHNtYl9wcm9jX2dldGF0dHIoZGVudHJ5LCAmZmluZm8pOworI2lmZGVmIFNNQkZTX1BBUkFOT0lBCisJaWYgKGVycm9yICYmIGVycm9yICE9IC1FTk9FTlQpCisJCVBBUkFOT0lBKCJmaW5kICVzLyVzIGZhaWxlZCwgZXJyb3I9JWRcbiIsCisJCQkgREVOVFJZX1BBVEgoZGVudHJ5KSwgZXJyb3IpOworI2VuZGlmCisKKwlpbm9kZSA9IE5VTEw7CisJaWYgKGVycm9yID09IC1FTk9FTlQpCisJCWdvdG8gYWRkX2VudHJ5OworCWlmICghZXJyb3IpIHsKKwkJZXJyb3IgPSAtRUFDQ0VTOworCQlmaW5mby5mX2lubyA9IGl1bmlxdWUoZGVudHJ5LT5kX3NiLCAyKTsKKwkJaW5vZGUgPSBzbWJfaWdldChkaXItPmlfc2IsICZmaW5mbyk7CisJCWlmIChpbm9kZSkgeworCWFkZF9lbnRyeToKKwkJCXNlcnZlciA9IHNlcnZlcl9mcm9tX2RlbnRyeShkZW50cnkpOworCQkJaWYgKHNlcnZlci0+bW50LT5mbGFncyAmIFNNQl9NT1VOVF9DQVNFKQorCQkJCWRlbnRyeS0+ZF9vcCA9ICZzbWJmc19kZW50cnlfb3BlcmF0aW9uc19jYXNlOworCQkJZWxzZQorCQkJCWRlbnRyeS0+ZF9vcCA9ICZzbWJmc19kZW50cnlfb3BlcmF0aW9uczsKKworCQkJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJCQlzbWJfcmVuZXdfdGltZXMoZGVudHJ5KTsKKwkJCWVycm9yID0gMDsKKwkJfQorCX0KKwl1bmxvY2tfa2VybmVsKCk7CitvdXQ6CisJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworfQorCisvKgorICogVGhpcyBjb2RlIGlzIGNvbW1vbiB0byBhbGwgcm91dGluZXMgY3JlYXRpbmcgYSBuZXcgaW5vZGUuCisgKi8KK3N0YXRpYyBpbnQKK3NtYl9pbnN0YW50aWF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fdTE2IGZpbGVpZCwgaW50IGhhdmVfaWQpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkoZGVudHJ5KTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnJvcjsKKwlzdHJ1Y3Qgc21iX2ZhdHRyIGZhdHRyOworCisJVkVSQk9TRSgiZmlsZSAlcy8lcywgZmlsZWlkPSV1XG4iLCBERU5UUllfUEFUSChkZW50cnkpLCBmaWxlaWQpOworCisJZXJyb3IgPSBzbWJfcHJvY19nZXRhdHRyKGRlbnRyeSwgJmZhdHRyKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2Nsb3NlOworCisJc21iX3JlbmV3X3RpbWVzKGRlbnRyeSk7CisJZmF0dHIuZl9pbm8gPSBpdW5pcXVlKGRlbnRyeS0+ZF9zYiwgMik7CisJaW5vZGUgPSBzbWJfaWdldChkZW50cnktPmRfc2IsICZmYXR0cik7CisJaWYgKCFpbm9kZSkKKwkJZ290byBvdXRfbm9faW5vZGU7CisKKwlpZiAoaGF2ZV9pZCkgeworCQlzdHJ1Y3Qgc21iX2lub2RlX2luZm8gKmVpID0gU01CX0koaW5vZGUpOworCQllaS0+ZmlsZWlkID0gZmlsZWlkOworCQllaS0+YWNjZXNzID0gU01CX09fUkRXUjsKKwkJZWktPm9wZW4gPSBzZXJ2ZXItPmdlbmVyYXRpb247CisJfQorCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworCitvdXRfbm9faW5vZGU6CisJZXJyb3IgPSAtRUFDQ0VTOworb3V0X2Nsb3NlOgorCWlmIChoYXZlX2lkKSB7CisJCVBBUkFOT0lBKCIlcy8lcyBmYWlsZWQsIGVycm9yPSVkLCBjbG9zaW5nICV1XG4iLAorCQkJIERFTlRSWV9QQVRIKGRlbnRyeSksIGVycm9yLCBmaWxlaWQpOworCQlzbWJfY2xvc2VfZmlsZWlkKGRlbnRyeSwgZmlsZWlkKTsKKwl9CisJZ290byBvdXQ7Cit9CisKKy8qIE4uQi4gSG93IHNob3VsZCB0aGUgbW9kZSBhcmd1bWVudCBiZSB1c2VkPyAqLworc3RhdGljIGludAorc21iX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkoZGVudHJ5KTsKKwlfX3UxNiBmaWxlaWQ7CisJaW50IGVycm9yOworCXN0cnVjdCBpYXR0ciBhdHRyOworCisJVkVSQk9TRSgiY3JlYXRpbmcgJXMvJXMsIG1vZGU9JWRcbiIsIERFTlRSWV9QQVRIKGRlbnRyeSksIG1vZGUpOworCisJbG9ja19rZXJuZWwoKTsKKwlzbWJfaW52YWxpZF9kaXJfY2FjaGUoZGlyKTsKKwllcnJvciA9IHNtYl9wcm9jX2NyZWF0ZShkZW50cnksIDAsIGdldF9zZWNvbmRzKCksICZmaWxlaWQpOworCWlmICghZXJyb3IpIHsKKwkJaWYgKHNlcnZlci0+b3B0LmNhcGFiaWxpdGllcyAmIFNNQl9DQVBfVU5JWCkgeworCQkJLyogU2V0IGF0dHJpYnV0ZXMgZm9yIG5ldyBmaWxlICovCisJCQlhdHRyLmlhX3ZhbGlkID0gQVRUUl9NT0RFOworCQkJYXR0ci5pYV9tb2RlID0gbW9kZTsKKwkJCWVycm9yID0gc21iX3Byb2Nfc2V0YXR0cl91bml4KGRlbnRyeSwgJmF0dHIsIDAsIDApOworCQl9CisJCWVycm9yID0gc21iX2luc3RhbnRpYXRlKGRlbnRyeSwgZmlsZWlkLCAxKTsKKwl9IGVsc2UgeworCQlQQVJBTk9JQSgiJXMvJXMgZmFpbGVkLCBlcnJvcj0lZFxuIiwKKwkJCSBERU5UUllfUEFUSChkZW50cnkpLCBlcnJvcik7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qIE4uQi4gSG93IHNob3VsZCB0aGUgbW9kZSBhcmd1bWVudCBiZSB1c2VkPyAqLworc3RhdGljIGludAorc21iX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KGRlbnRyeSk7CisJaW50IGVycm9yOworCXN0cnVjdCBpYXR0ciBhdHRyOworCisJbG9ja19rZXJuZWwoKTsKKwlzbWJfaW52YWxpZF9kaXJfY2FjaGUoZGlyKTsKKwllcnJvciA9IHNtYl9wcm9jX21rZGlyKGRlbnRyeSk7CisJaWYgKCFlcnJvcikgeworCQlpZiAoc2VydmVyLT5vcHQuY2FwYWJpbGl0aWVzICYgU01CX0NBUF9VTklYKSB7CisJCQkvKiBTZXQgYXR0cmlidXRlcyBmb3IgbmV3IGRpcmVjdG9yeSAqLworCQkJYXR0ci5pYV92YWxpZCA9IEFUVFJfTU9ERTsKKwkJCWF0dHIuaWFfbW9kZSA9IG1vZGU7CisJCQllcnJvciA9IHNtYl9wcm9jX3NldGF0dHJfdW5peChkZW50cnksICZhdHRyLCAwLCAwKTsKKwkJfQorCQllcnJvciA9IHNtYl9pbnN0YW50aWF0ZShkZW50cnksIDAsIDApOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50CitzbWJfcm1kaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvcjsKKworCS8qCisJICogQ2xvc2UgdGhlIGRpcmVjdG9yeSBpZiBpdCdzIG9wZW4uCisJICovCisJbG9ja19rZXJuZWwoKTsKKwlzbWJfY2xvc2UoaW5vZGUpOworCisJLyoKKwkgKiBDaGVjayB0aGF0IG5vYm9keSBlbHNlIGlzIHVzaW5nIHRoZSBkaXJlY3RvcnkuLgorCSAqLworCWVycm9yID0gLUVCVVNZOworCWlmICghZF91bmhhc2hlZChkZW50cnkpKQorCQlnb3RvIG91dDsKKworCXNtYl9pbnZhbGlkX2Rpcl9jYWNoZShkaXIpOworCWVycm9yID0gc21iX3Byb2Nfcm1kaXIoZGVudHJ5KTsKKworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl91bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgZXJyb3I7CisKKwkvKgorCSAqIENsb3NlIHRoZSBmaWxlIGlmIGl0J3Mgb3Blbi4KKwkgKi8KKwlsb2NrX2tlcm5lbCgpOworCXNtYl9jbG9zZShkZW50cnktPmRfaW5vZGUpOworCisJc21iX2ludmFsaWRfZGlyX2NhY2hlKGRpcik7CisJZXJyb3IgPSBzbWJfcHJvY191bmxpbmsoZGVudHJ5KTsKKwlpZiAoIWVycm9yKQorCQlzbWJfcmVuZXdfdGltZXMoZGVudHJ5KTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50CitzbWJfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKKwkgICBzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisJaW50IGVycm9yOworCisJLyoKKwkgKiBDbG9zZSBhbnkgb3BlbiBmaWxlcywgYW5kIGNoZWNrIHdoZXRoZXIgdG8gZGVsZXRlIHRoZQorCSAqIHRhcmdldCBiZWZvcmUgYXR0ZW1wdGluZyB0aGUgcmVuYW1lLgorCSAqLworCWxvY2tfa2VybmVsKCk7CisJaWYgKG9sZF9kZW50cnktPmRfaW5vZGUpCisJCXNtYl9jbG9zZShvbGRfZGVudHJ5LT5kX2lub2RlKTsKKwlpZiAobmV3X2RlbnRyeS0+ZF9pbm9kZSkgeworCQlzbWJfY2xvc2UobmV3X2RlbnRyeS0+ZF9pbm9kZSk7CisJCWVycm9yID0gc21iX3Byb2NfdW5saW5rKG5ld19kZW50cnkpOworCQlpZiAoZXJyb3IpIHsKKwkJCVZFUkJPU0UoInVubGluayAlcy8lcywgZXJyb3I9JWRcbiIsCisJCQkJREVOVFJZX1BBVEgobmV3X2RlbnRyeSksIGVycm9yKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCS8qIEZJWE1FICovCisJCWRfZGVsZXRlKG5ld19kZW50cnkpOworCX0KKworCXNtYl9pbnZhbGlkX2Rpcl9jYWNoZShvbGRfZGlyKTsKKwlzbWJfaW52YWxpZF9kaXJfY2FjaGUobmV3X2Rpcik7CisJZXJyb3IgPSBzbWJfcHJvY19tdihvbGRfZGVudHJ5LCBuZXdfZGVudHJ5KTsKKwlpZiAoIWVycm9yKSB7CisJCXNtYl9yZW5ld190aW1lcyhvbGRfZGVudHJ5KTsKKwkJc21iX3JlbmV3X3RpbWVzKG5ld19kZW50cnkpOworCX0KK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogRklYTUU6IHNhbWJhIHNlcnZlcnMgd29uJ3QgbGV0IHlvdSBjcmVhdGUgZGV2aWNlIG5vZGVzIHVubGVzcyB1aWQvZ2lkCisgKiBtYXRjaGVzIHRoZSBjb25uZWN0aW9uIGNyZWRlbnRpYWxzIChhbmQgd2UgZG9uJ3Qga25vdyB3aGljaCB0aG9zZSBhcmUgLi4uKQorICovCitzdGF0aWMgaW50CitzbWJfbWFrZV9ub2RlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLCBkZXZfdCBkZXYpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBpYXR0ciBhdHRyOworCisJYXR0ci5pYV92YWxpZCA9IEFUVFJfTU9ERSB8IEFUVFJfVUlEIHwgQVRUUl9HSUQ7CisJYXR0ci5pYV9tb2RlID0gbW9kZTsKKwlhdHRyLmlhX3VpZCA9IGN1cnJlbnQtPmV1aWQ7CisJYXR0ci5pYV9naWQgPSBjdXJyZW50LT5lZ2lkOworCisJaWYgKCFuZXdfdmFsaWRfZGV2KGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJc21iX2ludmFsaWRfZGlyX2NhY2hlKGRpcik7CisJZXJyb3IgPSBzbWJfcHJvY19zZXRhdHRyX3VuaXgoZGVudHJ5LCAmYXR0ciwgTUFKT1IoZGV2KSwgTUlOT1IoZGV2KSk7CisJaWYgKCFlcnJvcikgeworCQllcnJvciA9IHNtYl9pbnN0YW50aWF0ZShkZW50cnksIDAsIDApOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBkZW50cnkgPSBleGlzdGluZyBmaWxlCisgKiBuZXdfZGVudHJ5ID0gbmV3IGZpbGUKKyAqLworc3RhdGljIGludAorc21iX2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwlpbnQgZXJyb3I7CisKKwlERUJVRzEoInNtYl9saW5rIG9sZD0lcy8lcyBuZXc9JXMvJXNcbiIsCisJICAgICAgIERFTlRSWV9QQVRIKGRlbnRyeSksIERFTlRSWV9QQVRIKG5ld19kZW50cnkpKTsKKwlzbWJfaW52YWxpZF9kaXJfY2FjaGUoZGlyKTsKKwllcnJvciA9IHNtYl9wcm9jX2xpbmsoc2VydmVyX2Zyb21fZGVudHJ5KGRlbnRyeSksIGRlbnRyeSwgbmV3X2RlbnRyeSk7CisJaWYgKCFlcnJvcikgeworCQlzbWJfcmVuZXdfdGltZXMoZGVudHJ5KTsKKwkJZXJyb3IgPSBzbWJfaW5zdGFudGlhdGUobmV3X2RlbnRyeSwgMCwgMCk7CisJfQorCXJldHVybiBlcnJvcjsKK30KZGlmZiAtLWdpdCBhL2ZzL3NtYmZzL2ZpbGUuYyBiL2ZzL3NtYmZzL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGZjZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvc21iZnMvZmlsZS5jCkBAIC0wLDAgKzEsNDIzIEBACisvKgorICogIGZpbGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgYnkgUGFhbC1Lci4gRW5nc3RhZCBhbmQgVm9sa2VyIExlbmRlY2tlCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3IGJ5IFZvbGtlciBMZW5kZWNrZQorICoKKyAqICBQbGVhc2UgYWRkIGEgbm90ZSBhYm91dCB5b3VyIGNoYW5nZXMgdG8gc21iZnMgaW4gdGhlIENoYW5nZUxvZyBmaWxlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8bGludXgvc21ibm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbWJfZnMuaD4KKworI2luY2x1ZGUgInNtYl9kZWJ1Zy5oIgorI2luY2x1ZGUgInByb3RvLmgiCisKK3N0YXRpYyBpbnQKK3NtYl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgaW50IGRhdGFzeW5jKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KGRlbnRyeSk7CisJaW50IHJlc3VsdDsKKworCVZFUkJPU0UoInN5bmMgZmlsZSAlcy8lc1xuIiwgREVOVFJZX1BBVEgoZGVudHJ5KSk7CisKKwkvKgorCSAqIFRoZSBWRlMgd2lsbCB3cml0ZXBhZ2UoKSBhbGwgZGlydHkgcGFnZXMgZm9yIHVzLCBidXQgd2UKKwkgKiBzaG91bGQgc2VuZCBhIFNNQmZsdXNoIHRvIHRoZSBzZXJ2ZXIsIGxldHRpbmcgaXQga25vdyB0aGF0CisJICogd2Ugd2FudCB0aGluZ3Mgc3luY2hyb25pemVkIHdpdGggYWN0dWFsIHN0b3JhZ2UuCisJICoKKwkgKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIHJlcXVpcmVzIGFsbCBwYWdlcyB0byBoYXZlIGJlZW4gd3JpdHRlbiBhbHJlYWR5CisJICogICAgICAgKHNob3VsZCBiZSBvayB3aXRoIHdyaXRlcGFnZV9zeW5jKQorCSAqLworCXJlc3VsdCA9IHNtYl9wcm9jX2ZsdXNoKHNlcnZlciwgU01CX0koZGVudHJ5LT5kX2lub2RlKS0+ZmlsZWlkKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogUmVhZCBhIHBhZ2Ugc3luY2hyb25vdXNseS4KKyAqLworc3RhdGljIGludAorc21iX3JlYWRwYWdlX3N5bmMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwljaGFyICpidWZmZXIgPSBrbWFwKHBhZ2UpOworCWxvZmZfdCBvZmZzZXQgPSAobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkoZGVudHJ5KTsKKwl1bnNpZ25lZCBpbnQgcnNpemUgPSBzbWJfZ2V0X3JzaXplKHNlcnZlcik7CisJaW50IGNvdW50ID0gUEFHRV9TSVpFOworCWludCByZXN1bHQ7CisKKwlWRVJCT1NFKCJmaWxlICVzLyVzLCBjb3VudD0lZEAlTGQsIHJzaXplPSVkXG4iLAorCQlERU5UUllfUEFUSChkZW50cnkpLCBjb3VudCwgb2Zmc2V0LCByc2l6ZSk7CisKKwlyZXN1bHQgPSBzbWJfb3BlbihkZW50cnksIFNNQl9PX1JET05MWSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gaW9fZXJyb3I7CisKKwlkbyB7CisJCWlmIChjb3VudCA8IHJzaXplKQorCQkJcnNpemUgPSBjb3VudDsKKworCQlyZXN1bHQgPSBzZXJ2ZXItPm9wcy0+cmVhZChkZW50cnktPmRfaW5vZGUsb2Zmc2V0LHJzaXplLGJ1ZmZlcik7CisJCWlmIChyZXN1bHQgPCAwKQorCQkJZ290byBpb19lcnJvcjsKKworCQljb3VudCAtPSByZXN1bHQ7CisJCW9mZnNldCArPSByZXN1bHQ7CisJCWJ1ZmZlciArPSByZXN1bHQ7CisJCWRlbnRyeS0+ZF9pbm9kZS0+aV9hdGltZSA9CisJCQljdXJyZW50X2ZzX3RpbWUoZGVudHJ5LT5kX2lub2RlLT5pX3NiKTsKKwkJaWYgKHJlc3VsdCA8IHJzaXplKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoY291bnQpOworCisJbWVtc2V0KGJ1ZmZlciwgMCwgY291bnQpOworCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlyZXN1bHQgPSAwOworCitpb19lcnJvcjoKKwlrdW5tYXAocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFdlIGFyZSBjYWxsZWQgd2l0aCB0aGUgcGFnZSBsb2NrZWQgYW5kIHdlIHVubG9jayBpdCB3aGVuIGRvbmUuCisgKi8KK3N0YXRpYyBpbnQKK3NtYl9yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJaW50CQllcnJvcjsKKwlzdHJ1Y3QgZGVudHJ5ICAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisKKwlwYWdlX2NhY2hlX2dldChwYWdlKTsKKwllcnJvciA9IHNtYl9yZWFkcGFnZV9zeW5jKGRlbnRyeSwgcGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFdyaXRlIGEgcGFnZSBzeW5jaHJvbm91c2x5LgorICogT2Zmc2V0IGlzIHRoZSBkYXRhIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2UuCisgKi8KK3N0YXRpYyBpbnQKK3NtYl93cml0ZXBhZ2Vfc3luYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJICAgdW5zaWduZWQgbG9uZyBwYWdlb2Zmc2V0LCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJbG9mZl90IG9mZnNldDsKKwljaGFyICpidWZmZXIgPSBrbWFwKHBhZ2UpICsgcGFnZW9mZnNldDsKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2lub2RlKGlub2RlKTsKKwl1bnNpZ25lZCBpbnQgd3NpemUgPSBzbWJfZ2V0X3dzaXplKHNlcnZlcik7CisJaW50IHJldCA9IDA7CisKKwlvZmZzZXQgPSAoKGxvZmZfdClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIHBhZ2VvZmZzZXQ7CisJVkVSQk9TRSgiZmlsZSBpbm89JWxkLCBmaWxlaWQ9JWQsIGNvdW50PSVkQCVMZCwgd3NpemU9JWRcbiIsCisJCWlub2RlLT5pX2lubywgU01CX0koaW5vZGUpLT5maWxlaWQsIGNvdW50LCBvZmZzZXQsIHdzaXplKTsKKworCWRvIHsKKwkJaW50IHdyaXRlX3JldDsKKworCQlpZiAoY291bnQgPCB3c2l6ZSkKKwkJCXdzaXplID0gY291bnQ7CisKKwkJd3JpdGVfcmV0ID0gc2VydmVyLT5vcHMtPndyaXRlKGlub2RlLCBvZmZzZXQsIHdzaXplLCBidWZmZXIpOworCQlpZiAod3JpdGVfcmV0IDwgMCkgeworCQkJUEFSQU5PSUEoImZhaWxlZCB3cml0ZSwgd3NpemU9JWQsIHdyaXRlX3JldD0lZFxuIiwKKwkJCQkgd3NpemUsIHdyaXRlX3JldCk7CisJCQlyZXQgPSB3cml0ZV9yZXQ7CisJCQlicmVhazsKKwkJfQorCQkvKiBOLkIuIHdoYXQgaWYgcmVzdWx0IDwgd3NpemU/PyAqLworI2lmZGVmIFNNQkZTX1BBUkFOT0lBCisJCWlmICh3cml0ZV9yZXQgPCB3c2l6ZSkKKwkJCVBBUkFOT0lBKCJzaG9ydCB3cml0ZSwgd3NpemU9JWQsIHdyaXRlX3JldD0lZFxuIiwKKwkJCQkgd3NpemUsIHdyaXRlX3JldCk7CisjZW5kaWYKKwkJYnVmZmVyICs9IHdzaXplOworCQlvZmZzZXQgKz0gd3NpemU7CisJCWNvdW50IC09IHdzaXplOworCQkvKgorCQkgKiBVcGRhdGUgdGhlIGlub2RlIG5vdyByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciBhIHJlZnJlc2guCisJCSAqLworCQlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKwkJU01CX0koaW5vZGUpLT5mbGFncyB8PSBTTUJfRl9MT0NBTFdSSVRFOworCQlpZiAob2Zmc2V0ID4gaW5vZGUtPmlfc2l6ZSkKKwkJCWlub2RlLT5pX3NpemUgPSBvZmZzZXQ7CisJfSB3aGlsZSAoY291bnQpOworCisJa3VubWFwKHBhZ2UpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBXcml0ZSBhIHBhZ2UgdG8gdGhlIHNlcnZlci4gVGhpcyB3aWxsIGJlIHVzZWQgZm9yIE5GUyBzd2FwcGluZyBvbmx5CisgKiAoZm9yIG5vdyksIGFuZCB3ZSBjdXJyZW50bHkgZG8gdGhpcyBzeW5jaHJvbm91c2x5IG9ubHkuCisgKgorICogV2UgYXJlIGNhbGxlZCB3aXRoIHRoZSBwYWdlIGxvY2tlZCBhbmQgd2UgdW5sb2NrIGl0IHdoZW4gZG9uZS4KKyAqLworc3RhdGljIGludAorc21iX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJdW5zaWduZWQgbG9uZyBlbmRfaW5kZXg7CisJdW5zaWduZWQgb2Zmc2V0ID0gUEFHRV9DQUNIRV9TSVpFOworCWludCBlcnI7CisKKwlpZiAoIW1hcHBpbmcpCisJCUJVRygpOworCWlub2RlID0gbWFwcGluZy0+aG9zdDsKKwlpZiAoIWlub2RlKQorCQlCVUcoKTsKKworCWVuZF9pbmRleCA9IGlub2RlLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCS8qIGVhc3kgY2FzZSAqLworCWlmIChwYWdlLT5pbmRleCA8IGVuZF9pbmRleCkKKwkJZ290byBkb19pdDsKKwkvKiB0aGluZ3MgZ290IGNvbXBsaWNhdGVkLi4uICovCisJb2Zmc2V0ID0gaW5vZGUtPmlfc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUtMSk7CisJLyogT0ssIGFyZSB3ZSBjb21wbGV0ZWx5IG91dD8gKi8KKwlpZiAocGFnZS0+aW5kZXggPj0gZW5kX2luZGV4KzEgfHwgIW9mZnNldCkKKwkJcmV0dXJuIDA7IC8qIHRydW5jYXRlZCAtIGRvbid0IGNhcmUgKi8KK2RvX2l0OgorCXBhZ2VfY2FjaGVfZ2V0KHBhZ2UpOworCWVyciA9IHNtYl93cml0ZXBhZ2Vfc3luYyhpbm9kZSwgcGFnZSwgMCwgb2Zmc2V0KTsKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl91cGRhdGVwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJICAgICAgIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKworCURFQlVHMSgiKCVzLyVzICVkQCVsZClcbiIsIERFTlRSWV9QQVRIKGRlbnRyeSksIAorCSAgICAgICBjb3VudCwgKHBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpK29mZnNldCk7CisKKwlyZXR1cm4gc21iX3dyaXRlcGFnZV9zeW5jKGRlbnRyeS0+ZF9pbm9kZSwgcGFnZSwgb2Zmc2V0LCBjb3VudCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzbWJfZmlsZV9yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzc2l6ZV90CXN0YXR1czsKKworCVZFUkJPU0UoImZpbGUgJXMvJXMsIGNvdW50PSVsdUAlbHVcbiIsIERFTlRSWV9QQVRIKGRlbnRyeSksCisJCSh1bnNpZ25lZCBsb25nKSBjb3VudCwgKHVuc2lnbmVkIGxvbmcpICpwcG9zKTsKKworCXN0YXR1cyA9IHNtYl9yZXZhbGlkYXRlX2lub2RlKGRlbnRyeSk7CisJaWYgKHN0YXR1cykgeworCQlQQVJBTk9JQSgiJXMvJXMgdmFsaWRhdGlvbiBmYWlsZWQsIGVycm9yPSVaZFxuIiwKKwkJCSBERU5UUllfUEFUSChkZW50cnkpLCBzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisKKwlWRVJCT1NFKCJiZWZvcmUgcmVhZCwgc2l6ZT0lbGQsIGZsYWdzPSV4LCBhdGltZT0lbGRcbiIsCisJCShsb25nKWRlbnRyeS0+ZF9pbm9kZS0+aV9zaXplLAorCQlkZW50cnktPmRfaW5vZGUtPmlfZmxhZ3MsIGRlbnRyeS0+ZF9pbm9kZS0+aV9hdGltZSk7CisKKwlzdGF0dXMgPSBnZW5lcmljX2ZpbGVfcmVhZChmaWxlLCBidWYsIGNvdW50LCBwcG9zKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CitzbWJfZmlsZV9tbWFwKHN0cnVjdCBmaWxlICogZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hKQoreworCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlpbnQJc3RhdHVzOworCisJVkVSQk9TRSgiZmlsZSAlcy8lcywgYWRkcmVzcyAlbHUgLSAlbHVcbiIsCisJCURFTlRSWV9QQVRIKGRlbnRyeSksIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kKTsKKworCXN0YXR1cyA9IHNtYl9yZXZhbGlkYXRlX2lub2RlKGRlbnRyeSk7CisJaWYgKHN0YXR1cykgeworCQlQQVJBTk9JQSgiJXMvJXMgdmFsaWRhdGlvbiBmYWlsZWQsIGVycm9yPSVkXG4iLAorCQkJIERFTlRSWV9QQVRIKGRlbnRyeSksIHN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KKwlzdGF0dXMgPSBnZW5lcmljX2ZpbGVfbW1hcChmaWxlLCB2bWEpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzbWJfZmlsZV9zZW5kZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90ICpwcG9zLAorCQkgIHNpemVfdCBjb3VudCwgcmVhZF9hY3Rvcl90IGFjdG9yLCB2b2lkICp0YXJnZXQpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3NpemVfdCBzdGF0dXM7CisKKwlWRVJCT1NFKCJmaWxlICVzLyVzLCBwb3M9JUxkLCBjb3VudD0lZFxuIiwKKwkJREVOVFJZX1BBVEgoZGVudHJ5KSwgKnBwb3MsIGNvdW50KTsKKworCXN0YXR1cyA9IHNtYl9yZXZhbGlkYXRlX2lub2RlKGRlbnRyeSk7CisJaWYgKHN0YXR1cykgeworCQlQQVJBTk9JQSgiJXMvJXMgdmFsaWRhdGlvbiBmYWlsZWQsIGVycm9yPSVaZFxuIiwKKwkJCSBERU5UUllfUEFUSChkZW50cnkpLCBzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisJc3RhdHVzID0gZ2VuZXJpY19maWxlX3NlbmRmaWxlKGZpbGUsIHBwb3MsIGNvdW50LCBhY3RvciwgdGFyZ2V0KTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogVGhpcyBkb2VzIHRoZSAicmVhbCIgd29yayBvZiB0aGUgd3JpdGUuIFRoZSBnZW5lcmljIHJvdXRpbmUgaGFzCisgKiBhbGxvY2F0ZWQgdGhlIHBhZ2UsIGxvY2tlZCBpdCwgZG9uZSBhbGwgdGhlIHBhZ2UgYWxpZ25tZW50IHN0dWZmCisgKiBjYWxjdWxhdGlvbnMgZXRjLiBOb3cgd2Ugc2hvdWxkIGp1c3QgY29weSB0aGUgZGF0YSBmcm9tIHVzZXIKKyAqIHNwYWNlIGFuZCB3cml0ZSBpdCBiYWNrIHRvIHRoZSByZWFsIG1lZGl1bS4uCisgKgorICogSWYgdGhlIHdyaXRlciBlbmRzIHVwIGRlbGF5aW5nIHRoZSB3cml0ZSwgdGhlIHdyaXRlciBuZWVkcyB0bworICogaW5jcmVtZW50IHRoZSBwYWdlIHVzZSBjb3VudHMgdW50aWwgaGUgaXMgZG9uZSB3aXRoIHRoZSBwYWdlLgorICovCitzdGF0aWMgaW50IHNtYl9wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgCisJCQkgICAgIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgdG8pCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21iX2NvbW1pdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICAgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCB0bykKK3sKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gLUVGQVVMVDsKKwlsb2NrX2tlcm5lbCgpOworCXN0YXR1cyA9IHNtYl91cGRhdGVwYWdlKGZpbGUsIHBhZ2UsIG9mZnNldCwgdG8tb2Zmc2V0KTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBzbWJfZmlsZV9hb3BzID0geworCS5yZWFkcGFnZSA9IHNtYl9yZWFkcGFnZSwKKwkud3JpdGVwYWdlID0gc21iX3dyaXRlcGFnZSwKKwkucHJlcGFyZV93cml0ZSA9IHNtYl9wcmVwYXJlX3dyaXRlLAorCS5jb21taXRfd3JpdGUgPSBzbWJfY29tbWl0X3dyaXRlCit9OworCisvKiAKKyAqIFdyaXRlIHRvIGEgZmlsZSAodGhyb3VnaCB0aGUgcGFnZSBjYWNoZSkuCisgKi8KK3N0YXRpYyBzc2l6ZV90CitzbWJfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCXNzaXplX3QJcmVzdWx0OworCisJVkVSQk9TRSgiZmlsZSAlcy8lcywgY291bnQ9JWx1QCVsdVxuIiwKKwkJREVOVFJZX1BBVEgoZGVudHJ5KSwKKwkJKHVuc2lnbmVkIGxvbmcpIGNvdW50LCAodW5zaWduZWQgbG9uZykgKnBwb3MpOworCisJcmVzdWx0ID0gc21iX3JldmFsaWRhdGVfaW5vZGUoZGVudHJ5KTsKKwlpZiAocmVzdWx0KSB7CisJCVBBUkFOT0lBKCIlcy8lcyB2YWxpZGF0aW9uIGZhaWxlZCwgZXJyb3I9JVpkXG4iLAorCQkJIERFTlRSWV9QQVRIKGRlbnRyeSksIHJlc3VsdCk7CisJCWdvdG8gb3V0OworCX0KKworCXJlc3VsdCA9IHNtYl9vcGVuKGRlbnRyeSwgU01CX09fV1JPTkxZKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIG91dDsKKworCWlmIChjb3VudCA+IDApIHsKKwkJcmVzdWx0ID0gZ2VuZXJpY19maWxlX3dyaXRlKGZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOworCQlWRVJCT1NFKCJwb3M9JWxkLCBzaXplPSVsZCwgbXRpbWU9JWxkLCBhdGltZT0lbGRcbiIsCisJCQkobG9uZykgZmlsZS0+Zl9wb3MsIChsb25nKSBkZW50cnktPmRfaW5vZGUtPmlfc2l6ZSwKKwkJCWRlbnRyeS0+ZF9pbm9kZS0+aV9tdGltZSwgZGVudHJ5LT5kX2lub2RlLT5pX2F0aW1lKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludAorc21iX2ZpbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlpbnQgc21iX21vZGUgPSAoZmlsZS0+Zl9tb2RlICYgT19BQ0NNT0RFKSAtIDE7CisKKwlsb2NrX2tlcm5lbCgpOworCXJlc3VsdCA9IHNtYl9vcGVuKGRlbnRyeSwgc21iX21vZGUpOworCWlmIChyZXN1bHQpCisJCWdvdG8gb3V0OworCVNNQl9JKGlub2RlKS0+b3BlbmVycysrOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CitzbWJfZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwlsb2NrX2tlcm5lbCgpOworCWlmICghLS1TTUJfSShpbm9kZSktPm9wZW5lcnMpIHsKKwkJLyogV2UgbXVzdCBmbHVzaCBhbnkgZGlydHkgcGFnZXMgbm93IGFzIHdlIHdvbid0IGJlIGFibGUgdG8KKwkJICAgd3JpdGUgYW55dGhpbmcgYWZ0ZXIgY2xvc2UuIG1tYXAgY2FuIHRyaWdnZXIgdGhpcy4KKwkJICAgIm9wZW5lcnMiIHNob3VsZCBwZXJoYXBzIGluY2x1ZGUgbW1hcCdlcnMgLi4uICovCisJCWZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0+aV9tYXBwaW5nKTsKKwkJZmlsZW1hcF9mZGF0YXdhaXQoaW5vZGUtPmlfbWFwcGluZyk7CisJCXNtYl9jbG9zZShpbm9kZSk7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoZWNrIHdoZXRoZXIgdGhlIHJlcXVpcmVkIGFjY2VzcyBpcyBjb21wYXRpYmxlIHdpdGgKKyAqIGFuIGlub2RlJ3MgcGVybWlzc2lvbi4gU01CIGRvZXNuJ3QgcmVjb2duaXplIHN1cGVydXNlcgorICogcHJpdmlsZWdlcywgc28gd2UgbmVlZCBvdXIgb3duIGNoZWNrIGZvciB0aGlzLgorICovCitzdGF0aWMgaW50CitzbWJfZmlsZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlpbnQgbW9kZSA9IGlub2RlLT5pX21vZGU7CisJaW50IGVycm9yID0gMDsKKworCVZFUkJPU0UoIm1vZGU9JXgsIG1hc2s9JXhcbiIsIG1vZGUsIG1hc2spOworCisJLyogTG9vayBhdCB1c2VyIHBlcm1pc3Npb25zICovCisJbW9kZSA+Pj0gNjsKKwlpZiAoKG1vZGUgJiA3ICYgbWFzaykgIT0gbWFzaykKKwkJZXJyb3IgPSAtRUFDQ0VTOworCXJldHVybiBlcnJvcjsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbWJfZmlsZV9vcGVyYXRpb25zID0KK3sKKwkubGxzZWVrCQk9IHJlbW90ZV9sbHNlZWssCisJLnJlYWQJCT0gc21iX2ZpbGVfcmVhZCwKKwkud3JpdGUJCT0gc21iX2ZpbGVfd3JpdGUsCisJLmlvY3RsCQk9IHNtYl9pb2N0bCwKKwkubW1hcAkJPSBzbWJfZmlsZV9tbWFwLAorCS5vcGVuCQk9IHNtYl9maWxlX29wZW4sCisJLnJlbGVhc2UJPSBzbWJfZmlsZV9yZWxlYXNlLAorCS5mc3luYwkJPSBzbWJfZnN5bmMsCisJLnNlbmRmaWxlCT0gc21iX2ZpbGVfc2VuZGZpbGUsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzbWJfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0KK3sKKwkucGVybWlzc2lvbgk9IHNtYl9maWxlX3Blcm1pc3Npb24sCisJLmdldGF0dHIJPSBzbWJfZ2V0YXR0ciwKKwkuc2V0YXR0cgk9IHNtYl9ub3RpZnlfY2hhbmdlLAorfTsKZGlmZiAtLWdpdCBhL2ZzL3NtYmZzL2dldG9wdC5jIGIvZnMvc21iZnMvZ2V0b3B0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FlMGY1MgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NtYmZzL2dldG9wdC5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBnZXRvcHQuYworICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKworI2luY2x1ZGUgImdldG9wdC5oIgorCisvKioKKyAqCXNtYl9nZXRvcHQgLSBvcHRpb24gcGFyc2VyCisgKglAY2FsbGVyOiBuYW1lIG9mIHRoZSBjYWxsZXIsIGZvciBlcnJvciBtZXNzYWdlcworICoJQG9wdGlvbnM6IHRoZSBvcHRpb25zIHN0cmluZworICoJQG9wdHM6IGFuIGFycmF5IG9mICZzdHJ1Y3Qgb3B0aW9uIGVudHJpZXMgY29udHJvbGxpbmcgcGFyc2VyIG9wZXJhdGlvbnMKKyAqCUBvcHRvcHQ6IG91dHB1dDsgd2lsbCBjb250YWluIHRoZSBjdXJyZW50IG9wdGlvbgorICoJQG9wdGFyZzogb3V0cHV0OyB3aWxsIGNvbnRhaW4gdGhlIHZhbHVlIChpZiBvbmUgZXhpc3RzKQorICoJQGZsYWc6IG91dHB1dDsgbWF5IGJlIE5VTEw7IHNob3VsZCBwb2ludCB0byBhIGxvbmcgZm9yIG9yJ2luZyBmbGFncworICoJQHZhbHVlOiBvdXRwdXQ7IG1heSBiZSBOVUxMOyB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIGludGVnZXIgdmFsdWUKKyAqCQlvZiB0aGUgY3VycmVudCBhcmd1bWVudC4KKyAqCisgKglIZWxwZXIgdG8gcGFyc2Ugb3B0aW9ucyBvbiB0aGUgZm9ybWF0IHVzZWQgYnkgbW91bnQgKCJhPWIsYz1kLGUsZiIpLgorICoJUmV0dXJucyBvcHRzLT52YWwgaWYgYSBtYXRjaGluZyBlbnRyeSBpbiB0aGUgJ29wdHMnIGFycmF5IGlzIGZvdW5kLAorICoJMCB3aGVuIG5vIG1vcmUgdG9rZW5zIGFyZSBmb3VuZCwgLTEgaWYgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQuCisgKi8KK2ludCBzbWJfZ2V0b3B0KGNoYXIgKmNhbGxlciwgY2hhciAqKm9wdGlvbnMsIHN0cnVjdCBvcHRpb24gKm9wdHMsCisJICAgICAgIGNoYXIgKipvcHRvcHQsIGNoYXIgKipvcHRhcmcsIHVuc2lnbmVkIGxvbmcgKmZsYWcsCisJICAgICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlKQoreworCWNoYXIgKnRva2VuOworCWNoYXIgKnZhbDsKKwlpbnQgaTsKKworCWRvIHsKKwkJaWYgKCh0b2tlbiA9IHN0cnNlcChvcHRpb25zLCAiLCIpKSA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJfSB3aGlsZSAoKnRva2VuID09ICdcMCcpOworCSpvcHRvcHQgPSB0b2tlbjsKKworCSpvcHRhcmcgPSBOVUxMOworCWlmICgodmFsID0gc3RyY2hyICh0b2tlbiwgJz0nKSkgIT0gTlVMTCkgeworCQkqdmFsKysgPSAwOworCQlpZiAodmFsdWUpCisJCQkqdmFsdWUgPSBzaW1wbGVfc3RydG91bCh2YWwsIE5VTEwsIDApOworCQkqb3B0YXJnID0gdmFsOworCX0KKworCWZvciAoaSA9IDA7IG9wdHNbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAob3B0c1tpXS5uYW1lLCB0b2tlbikpIHsKKwkJCWlmICghb3B0c1tpXS5mbGFnICYmICghdmFsIHx8ICEqdmFsKSkgeworCQkJCXByaW50aygiJXM6IHRoZSAlcyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIsCisJCQkJICAgICAgIGNhbGxlciwgdG9rZW4pOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJaWYgKGZsYWcgJiYgb3B0c1tpXS5mbGFnKQorCQkJCSpmbGFnIHw9IG9wdHNbaV0uZmxhZzsKKworCQkJcmV0dXJuIG9wdHNbaV0udmFsOworCQl9CisJfQorCXByaW50aygiJXM6IFVucmVjb2duaXplZCBtb3VudCBvcHRpb24gJXNcbiIsIGNhbGxlciwgdG9rZW4pOworCXJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL2ZzL3NtYmZzL2dldG9wdC5oIGIvZnMvc21iZnMvZ2V0b3B0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ2MjE5YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NtYmZzL2dldG9wdC5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgX0xJTlVYX0dFVE9QVF9ICisjZGVmaW5lIF9MSU5VWF9HRVRPUFRfSAorCitzdHJ1Y3Qgb3B0aW9uIHsKKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGxvbmcgZmxhZzsKKwlpbnQgdmFsOworfTsKKworZXh0ZXJuIGludCBzbWJfZ2V0b3B0KGNoYXIgKmNhbGxlciwgY2hhciAqKm9wdGlvbnMsIHN0cnVjdCBvcHRpb24gKm9wdHMsCisJCSAgICAgIGNoYXIgKipvcHRvcHQsIGNoYXIgKipvcHRhcmcsIHVuc2lnbmVkIGxvbmcgKmZsYWcsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlKTsKKworI2VuZGlmIC8qIF9MSU5VWF9HRVRPUFRfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvc21iZnMvaW5vZGUuYyBiL2ZzL3NtYmZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2NWFhYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NtYmZzL2lub2RlLmMKQEAgLTAsMCArMSw4NDkgQEAKKy8qCisgKiAgaW5vZGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgUGFhbC1Lci4gRW5nc3RhZCBhbmQgVm9sa2VyIExlbmRlY2tlCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3IGJ5IFZvbGtlciBMZW5kZWNrZQorICoKKyAqICBQbGVhc2UgYWRkIGEgbm90ZSBhYm91dCB5b3VyIGNoYW5nZXMgdG8gc21iZnMgaW4gdGhlIENoYW5nZUxvZyBmaWxlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdodWlkLmg+CisjaW5jbHVkZSA8bGludXgvc21iX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21ibm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbWJfbW91bnQuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAic21iX2RlYnVnLmgiCisjaW5jbHVkZSAiZ2V0b3B0LmgiCisjaW5jbHVkZSAicHJvdG8uaCIKKworLyogQWx3YXlzIHBpY2sgYSBkZWZhdWx0IHN0cmluZyAqLworI2lmZGVmIENPTkZJR19TTUJfTkxTX1JFTU9URQorI2RlZmluZSBTTUJfTkxTX1JFTU9URSBDT05GSUdfU01CX05MU19SRU1PVEUKKyNlbHNlCisjZGVmaW5lIFNNQl9OTFNfUkVNT1RFICIiCisjZW5kaWYKKworI2RlZmluZSBTTUJfVFRMX0RFRkFVTFQgMTAwMAorCitzdGF0aWMgdm9pZCBzbWJfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK3N0YXRpYyB2b2lkIHNtYl9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICopOworc3RhdGljIGludCAgc21iX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGtzdGF0ZnMgKik7CitzdGF0aWMgaW50ICBzbWJfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqLCBzdHJ1Y3QgdmZzbW91bnQgKik7CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKnNtYl9pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKnNtYl9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBzbWJfaW5vZGVfaW5mbyAqZWk7CisJZWkgPSAoc3RydWN0IHNtYl9pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhzbWJfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBzbWJfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShzbWJfaW5vZGVfY2FjaGVwLCBTTUJfSShpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBzbWJfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IHNtYl9pbm9kZV9pbmZvICopIGZvbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdtYXNrID0gU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1I7CisKKwlpZiAoKGZsYWdzICYgZmxhZ21hc2spID09IFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikKKwkJaW5vZGVfaW5pdF9vbmNlKCZlaS0+dmZzX2lub2RlKTsKK30KKyAKK3N0YXRpYyBpbnQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpCit7CisJc21iX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJzbWJfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc21iX2lub2RlX2luZm8pLAorCQkJCQkgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKHNtYl9pbm9kZV9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQoreworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koc21iX2lub2RlX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX0lORk8gInNtYl9pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQorCitzdGF0aWMgaW50IHNtYl9yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJKmZsYWdzIHw9IE1TX05PRElSQVRJTUU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBzbWJfc29wcyA9Cit7CisJLmFsbG9jX2lub2RlCT0gc21iX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gc21iX2Rlc3Ryb3lfaW5vZGUsCisJLmRyb3BfaW5vZGUJPSBnZW5lcmljX2RlbGV0ZV9pbm9kZSwKKwkuZGVsZXRlX2lub2RlCT0gc21iX2RlbGV0ZV9pbm9kZSwKKwkucHV0X3N1cGVyCT0gc21iX3B1dF9zdXBlciwKKwkuc3RhdGZzCQk9IHNtYl9zdGF0ZnMsCisJLnNob3dfb3B0aW9ucwk9IHNtYl9zaG93X29wdGlvbnMsCisJLnJlbW91bnRfZnMJPSBzbWJfcmVtb3VudCwKK307CisKKworLyogV2UgYXJlIGFsd2F5cyBnZW5lcmF0aW5nIGEgbmV3IGlub2RlIGhlcmUgKi8KK3N0cnVjdCBpbm9kZSAqCitzbWJfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qgc21iX2ZhdHRyICpmYXR0cikKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IFNNQl9TQihzYik7CisJc3RydWN0IGlub2RlICpyZXN1bHQ7CisKKwlERUJVRzEoInNtYl9pZ2V0OiAlcFxuIiwgZmF0dHIpOworCisJcmVzdWx0ID0gbmV3X2lub2RlKHNiKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKwlyZXN1bHQtPmlfaW5vID0gZmF0dHItPmZfaW5vOworCVNNQl9JKHJlc3VsdCktPm9wZW4gPSAwOworCVNNQl9JKHJlc3VsdCktPmZpbGVpZCA9IDA7CisJU01CX0kocmVzdWx0KS0+YWNjZXNzID0gMDsKKwlTTUJfSShyZXN1bHQpLT5mbGFncyA9IDA7CisJU01CX0kocmVzdWx0KS0+Y2xvc2VkID0gMDsKKwlTTUJfSShyZXN1bHQpLT5vcGVuZXJzID0gMDsKKwlzbWJfc2V0X2lub2RlX2F0dHIocmVzdWx0LCBmYXR0cik7CisJaWYgKFNfSVNSRUcocmVzdWx0LT5pX21vZGUpKSB7CisJCXJlc3VsdC0+aV9vcCA9ICZzbWJfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlyZXN1bHQtPmlfZm9wID0gJnNtYl9maWxlX29wZXJhdGlvbnM7CisJCXJlc3VsdC0+aV9kYXRhLmFfb3BzID0gJnNtYl9maWxlX2FvcHM7CisJfSBlbHNlIGlmIChTX0lTRElSKHJlc3VsdC0+aV9tb2RlKSkgeworCQlpZiAoc2VydmVyLT5vcHQuY2FwYWJpbGl0aWVzICYgU01CX0NBUF9VTklYKQorCQkJcmVzdWx0LT5pX29wID0gJnNtYl9kaXJfaW5vZGVfb3BlcmF0aW9uc191bml4OworCQllbHNlCisJCQlyZXN1bHQtPmlfb3AgPSAmc21iX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQlyZXN1bHQtPmlfZm9wID0gJnNtYl9kaXJfb3BlcmF0aW9uczsKKwl9IGVsc2UgaWYgKFNfSVNMTksocmVzdWx0LT5pX21vZGUpKSB7CisJCXJlc3VsdC0+aV9vcCA9ICZzbWJfbGlua19pbm9kZV9vcGVyYXRpb25zOworCX0gZWxzZSB7CisJCWluaXRfc3BlY2lhbF9pbm9kZShyZXN1bHQsIHJlc3VsdC0+aV9tb2RlLCBmYXR0ci0+Zl9yZGV2KTsKKwl9CisJaW5zZXJ0X2lub2RlX2hhc2gocmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogQ29weSB0aGUgaW5vZGUgZGF0YSB0byBhIHNtYl9mYXR0ciBzdHJ1Y3R1cmUuCisgKi8KK3ZvaWQKK3NtYl9nZXRfaW5vZGVfYXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgc21iX2ZhdHRyICpmYXR0cikKK3sKKwltZW1zZXQoZmF0dHIsIDAsIHNpemVvZihzdHJ1Y3Qgc21iX2ZhdHRyKSk7CisJZmF0dHItPmZfbW9kZQk9IGlub2RlLT5pX21vZGU7CisJZmF0dHItPmZfbmxpbmsJPSBpbm9kZS0+aV9ubGluazsKKwlmYXR0ci0+Zl9pbm8JPSBpbm9kZS0+aV9pbm87CisJZmF0dHItPmZfdWlkCT0gaW5vZGUtPmlfdWlkOworCWZhdHRyLT5mX2dpZAk9IGlub2RlLT5pX2dpZDsKKwlmYXR0ci0+Zl9zaXplCT0gaW5vZGUtPmlfc2l6ZTsKKwlmYXR0ci0+Zl9tdGltZQk9IGlub2RlLT5pX210aW1lOworCWZhdHRyLT5mX2N0aW1lCT0gaW5vZGUtPmlfY3RpbWU7CisJZmF0dHItPmZfYXRpbWUJPSBpbm9kZS0+aV9hdGltZTsKKwlmYXR0ci0+Zl9ibGtzaXplPSBpbm9kZS0+aV9ibGtzaXplOworCWZhdHRyLT5mX2Jsb2Nrcwk9IGlub2RlLT5pX2Jsb2NrczsKKworCWZhdHRyLT5hdHRyCT0gU01CX0koaW5vZGUpLT5hdHRyOworCS8qCisJICogS2VlcCB0aGUgYXR0cmlidXRlcyBpbiBzeW5jIHdpdGggdGhlIGlub2RlIHBlcm1pc3Npb25zLgorCSAqLworCWlmIChmYXR0ci0+Zl9tb2RlICYgU19JV1VTUikKKwkJZmF0dHItPmF0dHIgJj0gfmFST05MWTsKKwllbHNlCisJCWZhdHRyLT5hdHRyIHw9IGFST05MWTsKK30KKworLyoKKyAqIFVwZGF0ZSB0aGUgaW5vZGUsIHBvc3NpYmx5IGNhdXNpbmcgaXQgdG8gaW52YWxpZGF0ZSBpdHMgcGFnZXMgaWYgbXRpbWUvc2l6ZQorICogaXMgZGlmZmVyZW50IGZyb20gbGFzdCB0aW1lLgorICovCit2b2lkCitzbWJfc2V0X2lub2RlX2F0dHIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIpCit7CisJc3RydWN0IHNtYl9pbm9kZV9pbmZvICplaSA9IFNNQl9JKGlub2RlKTsKKworCS8qCisJICogQSBzaXplIGNoYW5nZSBzaG91bGQgaGF2ZSBhIGRpZmZlcmVudCBtdGltZSwgb3Igc2FtZSBtdGltZQorCSAqIGJ1dCBkaWZmZXJlbnQgc2l6ZS4KKwkgKi8KKwl0aW1lX3QgbGFzdF90aW1lID0gaW5vZGUtPmlfbXRpbWUudHZfc2VjOworCWxvZmZfdCBsYXN0X3N6ID0gaW5vZGUtPmlfc2l6ZTsKKworCWlub2RlLT5pX21vZGUJPSBmYXR0ci0+Zl9tb2RlOworCWlub2RlLT5pX25saW5rCT0gZmF0dHItPmZfbmxpbms7CisJaW5vZGUtPmlfdWlkCT0gZmF0dHItPmZfdWlkOworCWlub2RlLT5pX2dpZAk9IGZhdHRyLT5mX2dpZDsKKwlpbm9kZS0+aV9jdGltZQk9IGZhdHRyLT5mX2N0aW1lOworCWlub2RlLT5pX2Jsa3NpemU9IGZhdHRyLT5mX2Jsa3NpemU7CisJaW5vZGUtPmlfYmxvY2tzID0gZmF0dHItPmZfYmxvY2tzOworCWlub2RlLT5pX3NpemUJPSBmYXR0ci0+Zl9zaXplOworCWlub2RlLT5pX210aW1lCT0gZmF0dHItPmZfbXRpbWU7CisJaW5vZGUtPmlfYXRpbWUJPSBmYXR0ci0+Zl9hdGltZTsKKwllaS0+YXR0ciA9IGZhdHRyLT5hdHRyOworCisJLyoKKwkgKiBVcGRhdGUgdGhlICJsYXN0IHRpbWUgcmVmcmVzaGVkIiBmaWVsZCBmb3IgcmV2YWxpZGF0aW9uLgorCSAqLworCWVpLT5vbGRtdGltZSA9IGppZmZpZXM7CisKKwlpZiAoaW5vZGUtPmlfbXRpbWUudHZfc2VjICE9IGxhc3RfdGltZSB8fCBpbm9kZS0+aV9zaXplICE9IGxhc3Rfc3opIHsKKwkJVkVSQk9TRSgiJWxkIGNoYW5nZWQsIG9sZD0lbGQsIG5ldz0lbGQsIG96PSVsZCwgbno9JWxkXG4iLAorCQkJaW5vZGUtPmlfaW5vLAorCQkJKGxvbmcpIGxhc3RfdGltZSwgKGxvbmcpIGlub2RlLT5pX210aW1lLAorCQkJKGxvbmcpIGxhc3Rfc3osIChsb25nKSBpbm9kZS0+aV9zaXplKTsKKworCQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCQlpbnZhbGlkYXRlX3JlbW90ZV9pbm9kZShpbm9kZSk7CisJfQorfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgaWYgdGhlIGNvbm5lY3Rpb24gaGFzIGdvbmUgYmFkIC4uLgorICogdHJ5IHRvIGtpbGwgb2ZmIGFsbCB0aGUgY3VycmVudCBpbm9kZXMuCisgKi8KK3ZvaWQKK3NtYl9pbnZhbGlkYXRlX2lub2RlcyhzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcikKK3sKKwlWRVJCT1NFKCJcbiIpOworCXNocmlua19kY2FjaGVfc2IoU0Jfb2Yoc2VydmVyKSk7CisJaW52YWxpZGF0ZV9pbm9kZXMoU0Jfb2Yoc2VydmVyKSk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byB1cGRhdGUgdGhlIGlub2RlIGF0dHJpYnV0ZXMgYWZ0ZXIKKyAqIHdlJ3ZlIG1hZGUgY2hhbmdlcyB0byBhIGZpbGUgb3IgZGlyZWN0b3J5LgorICovCitzdGF0aWMgaW50CitzbWJfcmVmcmVzaF9pbm9kZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyb3I7CisJc3RydWN0IHNtYl9mYXR0ciBmYXR0cjsKKworCWVycm9yID0gc21iX3Byb2NfZ2V0YXR0cihkZW50cnksICZmYXR0cik7CisJaWYgKCFlcnJvcikgeworCQlzbWJfcmVuZXdfdGltZXMoZGVudHJ5KTsKKwkJLyoKKwkJICogQ2hlY2sgd2hldGhlciB0aGUgdHlwZSBwYXJ0IG9mIHRoZSBtb2RlIGNoYW5nZWQsCisJCSAqIGFuZCBkb24ndCB1cGRhdGUgdGhlIGF0dHJpYnV0ZXMgaWYgaXQgZGlkLgorCQkgKgorCQkgKiBBbmQgZG9uJ3QgZGljayB3aXRoIHRoZSByb290IGlub2RlCisJCSAqLworCQlpZiAoaW5vZGUtPmlfaW5vID09IDIpCisJCQlyZXR1cm4gZXJyb3I7CisJCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQorCQkJcmV0dXJuIGVycm9yOwkvKiBWRlMgd2lsbCBkZWFsIHdpdGggaXQgKi8KKworCQlpZiAoKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpID09IChmYXR0ci5mX21vZGUgJiBTX0lGTVQpKSB7CisJCQlzbWJfc2V0X2lub2RlX2F0dHIoaW5vZGUsICZmYXR0cik7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogQmlnIHRyb3VibGUhIFRoZSBpbm9kZSBoYXMgYmVjb21lIGEgbmV3IG9iamVjdCwKKwkJCSAqIHNvIGFueSBvcGVyYXRpb25zIGF0dGVtcHRlZCBvbiBpdCBhcmUgaW52YWxpZC4KKwkJCSAqCisJCQkgKiBUbyBsaW1pdCBkYW1hZ2UsIG1hcmsgdGhlIGlub2RlIGFzIGJhZCBzbyB0aGF0CisJCQkgKiBzdWJzZXF1ZW50IGxvb2t1cCB2YWxpZGF0aW9ucyB3aWxsIGZhaWwuCisJCQkgKi8KKwkJCVBBUkFOT0lBKCIlcy8lcyBjaGFuZ2VkIG1vZGUsICUwN28gdG8gJTA3b1xuIiwKKwkJCQkgREVOVFJZX1BBVEgoZGVudHJ5KSwKKwkJCQkgaW5vZGUtPmlfbW9kZSwgZmF0dHIuZl9tb2RlKTsKKworCQkJZmF0dHIuZl9tb2RlID0gaW5vZGUtPmlfbW9kZTsgLyogc2F2ZSBtb2RlICovCisJCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCQlpbm9kZS0+aV9tb2RlID0gZmF0dHIuZl9tb2RlOyAvKiByZXN0b3JlIG1vZGUgKi8KKwkJCS8qCisJCQkgKiBObyBuZWVkIHRvIHdvcnJ5IGFib3V0IHVuaGFzaGluZyB0aGUgZGVudHJ5OiB0aGUKKwkJCSAqIGxvb2t1cCB2YWxpZGF0aW9uIHdpbGwgc2VlIHRoYXQgdGhlIGlub2RlIGlzIGJhZC4KKwkJCSAqIEJ1dCB3ZSBkbyB3YW50IHRvIGludmFsaWRhdGUgdGhlIGNhY2hlcyAuLi4KKwkJCSAqLworCQkJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQkJCWludmFsaWRhdGVfcmVtb3RlX2lub2RlKGlub2RlKTsKKwkJCWVsc2UKKwkJCQlzbWJfaW52YWxpZF9kaXJfY2FjaGUoaW5vZGUpOworCQkJZXJyb3IgPSAtRUlPOworCQl9CisJfQorCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2Ugd2FudCB0byBjaGVjayB3aGV0aGVyIHRoZSBpbm9kZQorICogaGFzIGNoYW5nZWQgb24gdGhlIHNlcnZlci4gIElmIGl0IGhhcyBjaGFuZ2VkLCB3ZSBtdXN0CisgKiBpbnZhbGlkYXRlIG91ciBsb2NhbCBjYWNoZXMuCisgKi8KK2ludAorc21iX3JldmFsaWRhdGVfaW5vZGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqcyA9IHNlcnZlcl9mcm9tX2RlbnRyeShkZW50cnkpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGVycm9yID0gMDsKKworCURFQlVHMSgic21iX3JldmFsaWRhdGVfaW5vZGVcbiIpOworCWxvY2tfa2VybmVsKCk7CisKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgd2UndmUgcmVjZW50bHkgcmVmcmVzaGVkIHRoZSBpbm9kZS4KKwkgKi8KKwlpZiAodGltZV9iZWZvcmUoamlmZmllcywgU01CX0koaW5vZGUpLT5vbGRtdGltZSArIFNNQl9NQVhfQUdFKHMpKSkgeworCQlWRVJCT1NFKCJ1cC10by1kYXRlLCBpbm89JWxkLCBqaWZmaWVzPSVsdSwgb2xkdGltZT0lbHVcbiIsCisJCQlpbm9kZS0+aV9pbm8sIGppZmZpZXMsIFNNQl9JKGlub2RlKS0+b2xkbXRpbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnJvciA9IHNtYl9yZWZyZXNoX2lub2RlKGRlbnRyeSk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiBpX25saW5rID09IDAgYW5kIGlfY291bnQgZ29lcyB0byAwLgorICogQWxsIGJsb2NraW5nIGNsZWFudXAgb3BlcmF0aW9ucyBuZWVkIHRvIGdvIGhlcmUgdG8gYXZvaWQgcmFjZXMuCisgKi8KK3N0YXRpYyB2b2lkCitzbWJfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vKQoreworCURFQlVHMSgiaW5vPSVsZFxuIiwgaW5vLT5pX2lubyk7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoc21iX2Nsb3NlKGlubykpCisJCVBBUkFOT0lBKCJjb3VsZCBub3QgY2xvc2UgaW5vZGUgJWxkXG4iLCBpbm8tPmlfaW5vKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJY2xlYXJfaW5vZGUoaW5vKTsKK30KKworc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0c1tdID0geworCXsgInZlcnNpb24iLAkwLCAndicgfSwKKwl7ICJ3aW45NSIsCVNNQl9NT1VOVF9XSU45NSwgMSB9LAorCXsgIm9sZGF0dHIiLAlTTUJfTU9VTlRfT0xEQVRUUiwgMSB9LAorCXsgImRpcmF0dHIiLAlTTUJfTU9VTlRfRElSQVRUUiwgMSB9LAorCXsgImNhc2UiLAlTTUJfTU9VTlRfQ0FTRSwgMSB9LAorCXsgInVpZCIsCTAsICd1JyB9LAorCXsgImdpZCIsCTAsICdnJyB9LAorCXsgImZpbGVfbW9kZSIsCTAsICdmJyB9LAorCXsgImRpcl9tb2RlIiwJMCwgJ2QnIH0sCisJeyAiaW9jaGFyc2V0IiwJMCwgJ2knIH0sCisJeyAiY29kZXBhZ2UiLAkwLCAnYycgfSwKKwl7ICJ0dGwiLAkwLCAndCcgfSwKKwl7IE5VTEwsCQkwLCAwfQorfTsKKworc3RhdGljIGludAorcGFyc2Vfb3B0aW9ucyhzdHJ1Y3Qgc21iX21vdW50X2RhdGFfa2VybmVsICptbnQsIGNoYXIgKm9wdGlvbnMpCit7CisJaW50IGM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWNoYXIgKm9wdGFyZzsKKwljaGFyICpvcHRvcHQ7CisKKwlmbGFncyA9IDA7CisJd2hpbGUgKCAoYyA9IHNtYl9nZXRvcHQoInNtYmZzIiwgJm9wdGlvbnMsIG9wdHMsCisJCQkJJm9wdG9wdCwgJm9wdGFyZywgJmZsYWdzLCAmdmFsdWUpKSA+IDApIHsKKworCQlWRVJCT1NFKCInJXMnIC0+ICclcydcbiIsIG9wdG9wdCwgb3B0YXJnID8gb3B0YXJnIDogIjxub25lPiIpOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAxOgorCQkJLyogZ290IGEgImZsYWciIG9wdGlvbiAqLworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQkJaWYgKHZhbHVlICE9IFNNQl9NT1VOVF9WRVJTSU9OKSB7CisJCQlwcmludGsgKCJzbWJmczogQmFkIG1vdW50IHZlcnNpb24gJWxkLCBleHBlY3RlZCAlZFxuIiwKKwkJCQl2YWx1ZSwgU01CX01PVU5UX1ZFUlNJT04pOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbW50LT52ZXJzaW9uID0gdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSAndSc6CisJCQltbnQtPnVpZCA9IHZhbHVlOworCQkJZmxhZ3MgfD0gU01CX01PVU5UX1VJRDsKKwkJCWJyZWFrOworCQljYXNlICdnJzoKKwkJCW1udC0+Z2lkID0gdmFsdWU7CisJCQlmbGFncyB8PSBTTUJfTU9VTlRfR0lEOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJbW50LT5maWxlX21vZGUgPSAodmFsdWUgJiBTX0lSV1hVR08pIHwgU19JRlJFRzsKKwkJCWZsYWdzIHw9IFNNQl9NT1VOVF9GTU9ERTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCW1udC0+ZGlyX21vZGUgPSAodmFsdWUgJiBTX0lSV1hVR08pIHwgU19JRkRJUjsKKwkJCWZsYWdzIHw9IFNNQl9NT1VOVF9ETU9ERTsKKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCXN0cmxjcHkobW50LT5jb2RlcGFnZS5sb2NhbF9uYW1lLCBvcHRhcmcsIAorCQkJCVNNQl9OTFNfTUFYTkFNRUxFTik7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQlzdHJsY3B5KG1udC0+Y29kZXBhZ2UucmVtb3RlX25hbWUsIG9wdGFyZywKKwkJCQlTTUJfTkxTX01BWE5BTUVMRU4pOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJbW50LT50dGwgPSB2YWx1ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrICgic21iZnM6IFVucmVjb2duaXplZCBtb3VudCBvcHRpb24gJXNcbiIsCisJCQkJb3B0b3B0KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwltbnQtPmZsYWdzID0gZmxhZ3M7CisJcmV0dXJuIGM7Cit9CisKKy8qCisgKiBzbWJfc2hvd19vcHRpb25zKCkgaXMgZm9yIGRpc3BsYXlpbmcgbW91bnQgb3B0aW9ucyBpbiAvcHJvYy9tb3VudHMuCisgKiBJdCB0cmllcyB0byBhdm9pZCBzaG93aW5nIHNldHRpbmdzIHRoYXQgd2VyZSBub3QgY2hhbmdlZCBmcm9tIHRoZWlyCisgKiBkZWZhdWx0cy4KKyAqLworc3RhdGljIGludAorc21iX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCB2ZnNtb3VudCAqbSkKK3sKKwlzdHJ1Y3Qgc21iX21vdW50X2RhdGFfa2VybmVsICptbnQgPSBTTUJfU0IobS0+bW50X3NiKS0+bW50OworCWludCBpOworCisJZm9yIChpID0gMDsgb3B0c1tpXS5uYW1lICE9IE5VTEw7IGkrKykKKwkJaWYgKG1udC0+ZmxhZ3MgJiBvcHRzW2ldLmZsYWcpCisJCQlzZXFfcHJpbnRmKHMsICIsJXMiLCBvcHRzW2ldLm5hbWUpOworCisJaWYgKG1udC0+ZmxhZ3MgJiBTTUJfTU9VTlRfVUlEKQorCQlzZXFfcHJpbnRmKHMsICIsdWlkPSVkIiwgbW50LT51aWQpOworCWlmIChtbnQtPmZsYWdzICYgU01CX01PVU5UX0dJRCkKKwkJc2VxX3ByaW50ZihzLCAiLGdpZD0lZCIsIG1udC0+Z2lkKTsKKwlpZiAobW50LT5tb3VudGVkX3VpZCAhPSAwKQorCQlzZXFfcHJpbnRmKHMsICIsbW91bnRlZF91aWQ9JWQiLCBtbnQtPm1vdW50ZWRfdWlkKTsKKworCS8qIAorCSAqIERlZmF1bHRzIGZvciBmaWxlX21vZGUgYW5kIGRpcl9tb2RlIGFyZSB1bmtub3duIHRvIHVzOyB0aGV5CisJICogZGVwZW5kIG9uIHRoZSBjdXJyZW50IHVtYXNrIG9mIHRoZSB1c2VyIGRvaW5nIHRoZSBtb3VudC4KKwkgKi8KKwlpZiAobW50LT5mbGFncyAmIFNNQl9NT1VOVF9GTU9ERSkKKwkJc2VxX3ByaW50ZihzLCAiLGZpbGVfbW9kZT0lMDRvIiwgbW50LT5maWxlX21vZGUgJiBTX0lSV1hVR08pOworCWlmIChtbnQtPmZsYWdzICYgU01CX01PVU5UX0RNT0RFKQorCQlzZXFfcHJpbnRmKHMsICIsZGlyX21vZGU9JTA0byIsIG1udC0+ZGlyX21vZGUgJiBTX0lSV1hVR08pOworCisJaWYgKHN0cmNtcChtbnQtPmNvZGVwYWdlLmxvY2FsX25hbWUsIENPTkZJR19OTFNfREVGQVVMVCkpCisJCXNlcV9wcmludGYocywgIixpb2NoYXJzZXQ9JXMiLCBtbnQtPmNvZGVwYWdlLmxvY2FsX25hbWUpOworCWlmIChzdHJjbXAobW50LT5jb2RlcGFnZS5yZW1vdGVfbmFtZSwgU01CX05MU19SRU1PVEUpKQorCQlzZXFfcHJpbnRmKHMsICIsY29kZXBhZ2U9JXMiLCBtbnQtPmNvZGVwYWdlLnJlbW90ZV9uYW1lKTsKKworCWlmIChtbnQtPnR0bCAhPSBTTUJfVFRMX0RFRkFVTFQpCisJCXNlcV9wcmludGYocywgIix0dGw9JWQiLCBtbnQtPnR0bCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3NtYl91bmxvYWRfbmxzKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKQoreworCWlmIChzZXJ2ZXItPnJlbW90ZV9ubHMpIHsKKwkJdW5sb2FkX25scyhzZXJ2ZXItPnJlbW90ZV9ubHMpOworCQlzZXJ2ZXItPnJlbW90ZV9ubHMgPSBOVUxMOworCX0KKwlpZiAoc2VydmVyLT5sb2NhbF9ubHMpIHsKKwkJdW5sb2FkX25scyhzZXJ2ZXItPmxvY2FsX25scyk7CisJCXNlcnZlci0+bG9jYWxfbmxzID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzbWJfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBTTUJfU0Ioc2IpOworCisJc21iX2xvY2tfc2VydmVyKHNlcnZlcik7CisJc2VydmVyLT5zdGF0ZSA9IENPTk5fSU5WQUxJRDsKKwlzbWJpb2RfdW5yZWdpc3Rlcl9zZXJ2ZXIoc2VydmVyKTsKKworCXNtYl9jbG9zZV9zb2NrZXQoc2VydmVyKTsKKworCWlmIChzZXJ2ZXItPmNvbm5fcGlkKQorCQlraWxsX3Byb2Moc2VydmVyLT5jb25uX3BpZCwgU0lHVEVSTSwgMSk7CisKKwlzbWJfa2ZyZWUoc2VydmVyLT5vcHMpOworCXNtYl91bmxvYWRfbmxzKHNlcnZlcik7CisJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CisJc21iX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwlzbWJfa2ZyZWUoc2VydmVyKTsKK30KKworc3RhdGljIGludCBzbWJfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpyYXdfZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcjsKKwlzdHJ1Y3Qgc21iX21vdW50X2RhdGFfa2VybmVsICptbnQ7CisJc3RydWN0IHNtYl9tb3VudF9kYXRhICpvbGRtbnQ7CisJc3RydWN0IGlub2RlICpyb290X2lub2RlOworCXN0cnVjdCBzbWJfZmF0dHIgcm9vdDsKKwlpbnQgdmVyOworCXZvaWQgKm1lbTsKKworCWlmICghcmF3X2RhdGEpCisJCWdvdG8gb3V0X25vX2RhdGE7CisKKwlvbGRtbnQgPSAoc3RydWN0IHNtYl9tb3VudF9kYXRhICopIHJhd19kYXRhOworCXZlciA9IG9sZG1udC0+dmVyc2lvbjsKKwlpZiAodmVyICE9IFNNQl9NT1VOVF9PTERWRVJTSU9OICYmIGNwdV90b19iZTMyKHZlcikgIT0gU01CX01PVU5UX0FTQ0lJKQorCQlnb3RvIG91dF93cm9uZ19kYXRhOworCisJc2ItPnNfZmxhZ3MgfD0gTVNfTk9ESVJBVElNRTsKKwlzYi0+c19ibG9ja3NpemUgPSAxMDI0OwkvKiBFaC4uLiAgSXMgdGhpcyBjb3JyZWN0PyAqLworCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gMTA7CisJc2ItPnNfbWFnaWMgPSBTTUJfU1VQRVJfTUFHSUM7CisJc2ItPnNfb3AgPSAmc21iX3NvcHM7CisJc2ItPnNfdGltZV9ncmFuID0gMTAwOworCisJc2VydmVyID0gc21iX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbWJfc2JfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghc2VydmVyKQorCQlnb3RvIG91dF9ub19zZXJ2ZXI7CisJc2ItPnNfZnNfaW5mbyA9IHNlcnZlcjsKKwltZW1zZXQoc2VydmVyLCAwLCBzaXplb2Yoc3RydWN0IHNtYl9zYl9pbmZvKSk7CisKKwlzZXJ2ZXItPnN1cGVyX2Jsb2NrID0gc2I7CisJc2VydmVyLT5tbnQgPSBOVUxMOworCXNlcnZlci0+c29ja19maWxlID0gTlVMTDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZXJ2ZXItPmNvbm5fd3EpOworCWluaXRfTVVURVgoJnNlcnZlci0+c2VtKTsKKwlJTklUX0xJU1RfSEVBRCgmc2VydmVyLT5lbnRyeSk7CisJSU5JVF9MSVNUX0hFQUQoJnNlcnZlci0+eG1pdHEpOworCUlOSVRfTElTVF9IRUFEKCZzZXJ2ZXItPnJlY3ZxKTsKKwlzZXJ2ZXItPmNvbm5fZXJyb3IgPSAwOworCXNlcnZlci0+Y29ubl9waWQgPSAwOworCXNlcnZlci0+c3RhdGUgPSBDT05OX0lOVkFMSUQ7IC8qIG5vIGNvbm5lY3Rpb24geWV0ICovCisJc2VydmVyLT5nZW5lcmF0aW9uID0gMDsKKworCS8qIEFsbG9jYXRlIHRoZSBnbG9iYWwgdGVtcCBidWZmZXIgYW5kIHNvbWUgc3VwZXJibG9jayBoZWxwZXIgc3RydWN0cyAqLworCS8qIEZJWE1FOiBtb3ZlIHRoZXNlIHRvIHRoZSBzbWJfc2JfaW5mbyBzdHJ1Y3QgKi8KKwlWRVJCT1NFKCJhbGxvYyBjaHVuayA9ICVkXG4iLCBzaXplb2Yoc3RydWN0IHNtYl9vcHMpICsKKwkJc2l6ZW9mKHN0cnVjdCBzbWJfbW91bnRfZGF0YV9rZXJuZWwpKTsKKwltZW0gPSBzbWJfa21hbGxvYyhzaXplb2Yoc3RydWN0IHNtYl9vcHMpICsKKwkJCSAgc2l6ZW9mKHN0cnVjdCBzbWJfbW91bnRfZGF0YV9rZXJuZWwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1lbSkKKwkJZ290byBvdXRfbm9fbWVtOworCisJc2VydmVyLT5vcHMgPSBtZW07CisJc21iX2luc3RhbGxfbnVsbF9vcHMoc2VydmVyLT5vcHMpOworCXNlcnZlci0+bW50ID0gbWVtICsgc2l6ZW9mKHN0cnVjdCBzbWJfb3BzKTsKKworCS8qIFNldHVwIE5MUyBzdHVmZiAqLworCXNlcnZlci0+cmVtb3RlX25scyA9IE5VTEw7CisJc2VydmVyLT5sb2NhbF9ubHMgPSBOVUxMOworCisJbW50ID0gc2VydmVyLT5tbnQ7CisKKwltZW1zZXQobW50LCAwLCBzaXplb2Yoc3RydWN0IHNtYl9tb3VudF9kYXRhX2tlcm5lbCkpOworCXN0cmxjcHkobW50LT5jb2RlcGFnZS5sb2NhbF9uYW1lLCBDT05GSUdfTkxTX0RFRkFVTFQsCisJCVNNQl9OTFNfTUFYTkFNRUxFTik7CisJc3RybGNweShtbnQtPmNvZGVwYWdlLnJlbW90ZV9uYW1lLCBTTUJfTkxTX1JFTU9URSwKKwkJU01CX05MU19NQVhOQU1FTEVOKTsKKworCW1udC0+dHRsID0gU01CX1RUTF9ERUZBVUxUOworCWlmICh2ZXIgPT0gU01CX01PVU5UX09MRFZFUlNJT04pIHsKKwkJbW50LT52ZXJzaW9uID0gb2xkbW50LT52ZXJzaW9uOworCisJCVNFVF9VSUQobW50LT51aWQsIG9sZG1udC0+dWlkKTsKKwkJU0VUX0dJRChtbnQtPmdpZCwgb2xkbW50LT5naWQpOworCisJCW1udC0+ZmlsZV9tb2RlID0gKG9sZG1udC0+ZmlsZV9tb2RlICYgU19JUldYVUdPKSB8IFNfSUZSRUc7CisJCW1udC0+ZGlyX21vZGUgPSAob2xkbW50LT5kaXJfbW9kZSAmIFNfSVJXWFVHTykgfCBTX0lGRElSOworCisJCW1udC0+ZmxhZ3MgPSAob2xkbW50LT5maWxlX21vZGUgPj4gOSkgfCBTTUJfTU9VTlRfVUlEIHwKKwkJCVNNQl9NT1VOVF9HSUQgfCBTTUJfTU9VTlRfRk1PREUgfCBTTUJfTU9VTlRfRE1PREU7CisJfSBlbHNlIHsKKwkJbW50LT5maWxlX21vZGUgPSBTX0lSV1hVIHwgU19JUkdSUCB8IFNfSVhHUlAgfAorCQkJCVNfSVJPVEggfCBTX0lYT1RIIHwgU19JRlJFRzsKKwkJbW50LT5kaXJfbW9kZSA9IFNfSVJXWFUgfCBTX0lSR1JQIHwgU19JWEdSUCB8CisJCQkJU19JUk9USCB8IFNfSVhPVEggfCBTX0lGRElSOworCQlpZiAocGFyc2Vfb3B0aW9ucyhtbnQsIHJhd19kYXRhKSkKKwkJCWdvdG8gb3V0X2JhZF9vcHRpb247CisJfQorCW1udC0+bW91bnRlZF91aWQgPSBjdXJyZW50LT51aWQ7CisJc21iX3NldGNvZGVwYWdlKHNlcnZlciwgJm1udC0+Y29kZXBhZ2UpOworCisJLyoKKwkgKiBEaXNwbGF5IHRoZSBlbmFibGVkIG9wdGlvbnMKKwkgKiBOb3RlOiBzbWJfcHJvY19nZXRhdHRyIHVzZXMgdGhlc2UgaW4gMi40IChidXQgd2FzIGNoYW5nZWQgaW4gMi4yKQorCSAqLworCWlmIChtbnQtPmZsYWdzICYgU01CX01PVU5UX09MREFUVFIpCisJCXByaW50aygiU01CRlM6IFVzaW5nIGNvcmUgZ2V0YXR0ciAoV2luIDk1IHNwZWVkdXApXG4iKTsKKwllbHNlIGlmIChtbnQtPmZsYWdzICYgU01CX01PVU5UX0RJUkFUVFIpCisJCXByaW50aygiU01CRlM6IFVzaW5nIGRpciBmZiBnZXRhdHRyXG4iKTsKKworCWlmIChzbWJpb2RfcmVnaXN0ZXJfc2VydmVyKHNlcnZlcikgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAic21iZnM6IGZhaWxlZCB0byBzdGFydCBzbWJpb2RcbiIpOworCQlnb3RvIG91dF9ub19zbWJpb2Q7CisJfQorCisJLyoKKwkgKiBLZWVwIHRoZSBzdXBlciBibG9jayBsb2NrZWQgd2hpbGUgd2UgZ2V0IHRoZSByb290IGlub2RlLgorCSAqLworCXNtYl9pbml0X3Jvb3RfZGlyZW50KHNlcnZlciwgJnJvb3QsIHNiKTsKKwlyb290X2lub2RlID0gc21iX2lnZXQoc2IsICZyb290KTsKKwlpZiAoIXJvb3RfaW5vZGUpCisJCWdvdG8gb3V0X25vX3Jvb3Q7CisKKwlzYi0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOworCWlmICghc2ItPnNfcm9vdCkKKwkJZ290byBvdXRfbm9fcm9vdDsKKworCXNtYl9uZXdfZGVudHJ5KHNiLT5zX3Jvb3QpOworCisJcmV0dXJuIDA7CisKK291dF9ub19yb290OgorCWlwdXQocm9vdF9pbm9kZSk7CitvdXRfbm9fc21iaW9kOgorCXNtYl91bmxvYWRfbmxzKHNlcnZlcik7CitvdXRfYmFkX29wdGlvbjoKKwlzbWJfa2ZyZWUobWVtKTsKK291dF9ub19tZW06CisJaWYgKCFzZXJ2ZXItPm1udCkKKwkJcHJpbnRrKEtFUk5fRVJSICJzbWJfZmlsbF9zdXBlcjogYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlzbWJfa2ZyZWUoc2VydmVyKTsKKwlnb3RvIG91dF9mYWlsOworb3V0X3dyb25nX2RhdGE6CisJcHJpbnRrKEtFUk5fRVJSICJzbWJmczogbW91bnRfZGF0YSB2ZXJzaW9uICVkIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIHZlcik7CisJZ290byBvdXRfZmFpbDsKK291dF9ub19kYXRhOgorCXByaW50ayhLRVJOX0VSUiAic21iX2ZpbGxfc3VwZXI6IG1pc3NpbmcgZGF0YSBhcmd1bWVudFxuIik7CitvdXRfZmFpbDoKKwlyZXR1cm4gLUVJTlZBTDsKK291dF9ub19zZXJ2ZXI6CisJcHJpbnRrKEtFUk5fRVJSICJzbWJfZmlsbF9zdXBlcjogY2Fubm90IGFsbG9jYXRlIHN0cnVjdCBzbWJfc2JfaW5mb1xuIik7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbnQKK3NtYl9zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlpbnQgcmVzdWx0OworCQorCWxvY2tfa2VybmVsKCk7CisKKwlyZXN1bHQgPSBzbWJfcHJvY19kc2thdHRyKHNiLCBidWYpOworCisJdW5sb2NrX2tlcm5lbCgpOworCisJYnVmLT5mX3R5cGUgPSBTTUJfU1VQRVJfTUFHSUM7CisJYnVmLT5mX25hbWVsZW4gPSBTTUJfTUFYUEFUSExFTjsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgc21iX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ICpzdGF0KQoreworCWludCBlcnIgPSBzbWJfcmV2YWxpZGF0ZV9pbm9kZShkZW50cnkpOworCWlmICghZXJyKQorCQlnZW5lcmljX2ZpbGxhdHRyKGRlbnRyeS0+ZF9pbm9kZSwgc3RhdCk7CisJcmV0dXJuIGVycjsKK30KKworaW50CitzbWJfbm90aWZ5X2NoYW5nZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KGRlbnRyeSk7CisJdW5zaWduZWQgaW50IG1hc2sgPSAoU19JRlJFRyB8IFNfSUZESVIgfCBTX0lSV1hVR08pOworCWludCBlcnJvciwgY2hhbmdlZCwgcmVmcmVzaCA9IDA7CisJc3RydWN0IHNtYl9mYXR0ciBmYXR0cjsKKworCWxvY2tfa2VybmVsKCk7CisKKwllcnJvciA9IHNtYl9yZXZhbGlkYXRlX2lub2RlKGRlbnRyeSk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCWlmICgoZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGF0dHIpKSA8IDApCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSAtRVBFUk07CisJaWYgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKSAmJiAoYXR0ci0+aWFfdWlkICE9IHNlcnZlci0+bW50LT51aWQpKQorCQlnb3RvIG91dDsKKworCWlmICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCkgJiYgKGF0dHItPmlhX3VpZCAhPSBzZXJ2ZXItPm1udC0+Z2lkKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSAmJiAoYXR0ci0+aWFfbW9kZSAmIH5tYXNrKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSAhPSAwKSB7CisJCVZFUkJPU0UoImNoYW5naW5nICVzLyVzLCBvbGQgc2l6ZT0lbGQsIG5ldyBzaXplPSVsZFxuIiwKKwkJCURFTlRSWV9QQVRIKGRlbnRyeSksCisJCQkobG9uZykgaW5vZGUtPmlfc2l6ZSwgKGxvbmcpIGF0dHItPmlhX3NpemUpOworCisJCWZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0+aV9tYXBwaW5nKTsKKwkJZmlsZW1hcF9mZGF0YXdhaXQoaW5vZGUtPmlfbWFwcGluZyk7CisKKwkJZXJyb3IgPSBzbWJfb3BlbihkZW50cnksIE9fV1JPTkxZKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJCWVycm9yID0gc2VydmVyLT5vcHMtPnRydW5jYXRlKGlub2RlLCBhdHRyLT5pYV9zaXplKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJCWVycm9yID0gdm10cnVuY2F0ZShpbm9kZSwgYXR0ci0+aWFfc2l6ZSk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCQlyZWZyZXNoID0gMTsKKwl9CisKKwlpZiAoc2VydmVyLT5vcHQuY2FwYWJpbGl0aWVzICYgU01CX0NBUF9VTklYKSB7CisJCS8qIEZvciBub3cgd2UgZG9uJ3Qgd2FudCB0byBzZXQgdGhlIHNpemUgd2l0aCBzZXRhdHRyX3VuaXggKi8KKwkJYXR0ci0+aWFfdmFsaWQgJj0gfkFUVFJfU0laRTsKKwkJLyogRklYTUU6IG9ubHkgY2FsbCBpZiB3ZSBhY3R1YWxseSB3YW50IHRvIHNldCBzb21ldGhpbmc/ICovCisJCWVycm9yID0gc21iX3Byb2Nfc2V0YXR0cl91bml4KGRlbnRyeSwgYXR0ciwgMCwgMCk7CisJCWlmICghZXJyb3IpCisJCQlyZWZyZXNoID0gMTsKKworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGZhdHRyIGFuZCBjaGVjayBmb3IgY2hhbmdlZCBmaWVsZHMuCisJICogTm90ZTogQ1RJTUUgdW5kZXIgU01CIGlzIGNyZWF0aW9uIHRpbWUgcmF0aGVyIHRoYW4KKwkgKiBjaGFuZ2UgdGltZSwgc28gd2UgZG9uJ3QgYXR0ZW1wdCB0byBjaGFuZ2UgaXQuCisJICovCisJc21iX2dldF9pbm9kZV9hdHRyKGlub2RlLCAmZmF0dHIpOworCisJY2hhbmdlZCA9IDA7CisJaWYgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTVRJTUUpICE9IDApIHsKKwkJZmF0dHIuZl9tdGltZSA9IGF0dHItPmlhX210aW1lOworCQljaGFuZ2VkID0gMTsKKwl9CisJaWYgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUUpICE9IDApIHsKKwkJZmF0dHIuZl9hdGltZSA9IGF0dHItPmlhX2F0aW1lOworCQkvKiBFYXJsaWVyIHByb3RvY29scyBkb24ndCBoYXZlIGFuIGFjY2VzcyB0aW1lICovCisJCWlmIChzZXJ2ZXItPm9wdC5wcm90b2NvbCA+PSBTTUJfUFJPVE9DT0xfTEFOTUFOMikKKwkJCWNoYW5nZWQgPSAxOworCX0KKwlpZiAoY2hhbmdlZCkgeworCQllcnJvciA9IHNtYl9wcm9jX3NldHRpbWUoZGVudHJ5LCAmZmF0dHIpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKKwkJcmVmcmVzaCA9IDE7CisJfQorCisJLyoKKwkgKiBDaGVjayBmb3IgbW9kZSBjaGFuZ2VzIC4uLiB3ZSdyZSBleHRyZW1lbHkgbGltaXRlZCBpbgorCSAqIHdoYXQgY2FuIGJlIHNldCBmb3IgU01CIHNlcnZlcnM6IGp1c3QgdGhlIHJlYWQtb25seSBiaXQuCisJICovCisJaWYgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgIT0gMCkgeworCQlWRVJCT1NFKCIlcy8lcyBtb2RlIGNoYW5nZSwgb2xkPSV4LCBuZXc9JXhcbiIsCisJCQlERU5UUllfUEFUSChkZW50cnkpLCBmYXR0ci5mX21vZGUsIGF0dHItPmlhX21vZGUpOworCQljaGFuZ2VkID0gMDsKKwkJaWYgKGF0dHItPmlhX21vZGUgJiBTX0lXVVNSKSB7CisJCQlpZiAoZmF0dHIuYXR0ciAmIGFST05MWSkgeworCQkJCWZhdHRyLmF0dHIgJj0gfmFST05MWTsKKwkJCQljaGFuZ2VkID0gMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghKGZhdHRyLmF0dHIgJiBhUk9OTFkpKSB7CisJCQkJZmF0dHIuYXR0ciB8PSBhUk9OTFk7CisJCQkJY2hhbmdlZCA9IDE7CisJCQl9CisJCX0KKwkJaWYgKGNoYW5nZWQpIHsKKwkJCWVycm9yID0gc21iX3Byb2Nfc2V0YXR0cihkZW50cnksICZmYXR0cik7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBvdXQ7CisJCQlyZWZyZXNoID0gMTsKKwkJfQorCX0KKwllcnJvciA9IDA7CisKK291dDoKKwlpZiAocmVmcmVzaCkKKwkJc21iX3JlZnJlc2hfaW5vZGUoZGVudHJ5KTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycm9yOworfQorCisjaWZkZWYgREVCVUdfU01CX01BTExPQworaW50IHNtYl9tYWxsb2NlZDsKK2ludCBzbWJfY3VycmVudF9rbWFsbG9jZWQ7CitpbnQgc21iX2N1cnJlbnRfdm1hbGxvY2VkOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNtYl9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX25vZGV2KGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBzbWJfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBzbWJfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInNtYmZzIiwKKwkuZ2V0X3NiCQk9IHNtYl9nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2Fub25fc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfQklOQVJZX01PVU5UREFUQSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfc21iX2ZzKHZvaWQpCit7CisJaW50IGVycjsKKwlERUJVRzEoInJlZ2lzdGVyaW5nIC4uLlxuIik7CisKKyNpZmRlZiBERUJVR19TTUJfTUFMTE9DCisJc21iX21hbGxvY2VkID0gMDsKKwlzbWJfY3VycmVudF9rbWFsbG9jZWQgPSAwOworCXNtYl9jdXJyZW50X3ZtYWxsb2NlZCA9IDA7CisjZW5kaWYKKworCWVyciA9IGluaXRfaW5vZGVjYWNoZSgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2lub2RlOworCWVyciA9IHNtYl9pbml0X3JlcXVlc3RfY2FjaGUoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9yZXF1ZXN0OworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnNtYl9mc190eXBlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlyZXR1cm4gMDsKK291dDoKKwlzbWJfZGVzdHJveV9yZXF1ZXN0X2NhY2hlKCk7CitvdXRfcmVxdWVzdDoKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKK291dF9pbm9kZToKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9zbWJfZnModm9pZCkKK3sKKwlERUJVRzEoInVucmVnaXN0ZXJpbmcgLi4uXG4iKTsKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnNtYl9mc190eXBlKTsKKwlzbWJfZGVzdHJveV9yZXF1ZXN0X2NhY2hlKCk7CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CisjaWZkZWYgREVCVUdfU01CX01BTExPQworCXByaW50ayhLRVJOX0RFQlVHICJzbWJfbWFsbG9jZWQ6ICVkXG4iLCBzbWJfbWFsbG9jZWQpOworCXByaW50ayhLRVJOX0RFQlVHICJzbWJfY3VycmVudF9rbWFsbG9jZWQ6ICVkXG4iLHNtYl9jdXJyZW50X2ttYWxsb2NlZCk7CisJcHJpbnRrKEtFUk5fREVCVUcgInNtYl9jdXJyZW50X3ZtYWxsb2NlZDogJWRcbiIsc21iX2N1cnJlbnRfdm1hbGxvY2VkKTsKKyNlbmRpZgorfQorCittb2R1bGVfaW5pdChpbml0X3NtYl9mcykKK21vZHVsZV9leGl0KGV4aXRfc21iX2ZzKQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvc21iZnMvaW9jdGwuYyBiL2ZzL3NtYmZzL2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhZTFmOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NtYmZzL2lvY3RsLmMKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqICBpb2N0bC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBWb2xrZXIgTGVuZGVja2UKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTcgYnkgVm9sa2VyIExlbmRlY2tlCisgKgorICogIFBsZWFzZSBhZGQgYSBub3RlIGFib3V0IHlvdXIgY2hhbmdlcyB0byBzbWJmcyBpbiB0aGUgQ2hhbmdlTG9nIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NtYl9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtYl9tb3VudC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInByb3RvLmgiCisKK2ludAorc21iX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9pbm9kZShpbm9kZSk7CisJc3RydWN0IHNtYl9jb25uX29wdCBvcHQ7CisJaW50IHJlc3VsdCA9IC1FSU5WQUw7CisKKwlzd2l0Y2ggKGNtZCkgeworCQl1aWQxNl90IHVpZDE2OworCQl1aWRfdCB1aWQzMjsKKwljYXNlIFNNQl9JT0NfR0VUTU9VTlRVSUQ6CisJCVNFVF9VSUQodWlkMTYsIHNlcnZlci0+bW50LT5tb3VudGVkX3VpZCk7CisJCXJlc3VsdCA9IHB1dF91c2VyKHVpZDE2LCAodWlkMTZfdCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBTTUJfSU9DX0dFVE1PVU5UVUlEMzI6CisJCVNFVF9VSUQodWlkMzIsIHNlcnZlci0+bW50LT5tb3VudGVkX3VpZCk7CisJCXJlc3VsdCA9IHB1dF91c2VyKHVpZDMyLCAodWlkX3QgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBTTUJfSU9DX05FV0NPTk46CisJCS8qIGFyZyBpcyBzbWJfY29ubl9vcHQsIG9yIE5VTEwgaWYgbm8gY29ubmVjdGlvbiB3YXMgbWFkZSAqLworCQlpZiAoIWFyZykgeworCQkJcmVzdWx0ID0gMDsKKwkJCXNtYl9sb2NrX3NlcnZlcihzZXJ2ZXIpOworCQkJc2VydmVyLT5zdGF0ZSA9IENPTk5fUkVUUklFRDsKKwkJCXByaW50ayhLRVJOX0VSUiAiQ29ubmVjdGlvbiBhdHRlbXB0IGZhaWxlZCEgIFslZF1cbiIsCisJCQkgICAgICAgc2VydmVyLT5jb25uX2Vycm9yKTsKKwkJCXNtYmlvZF9mbHVzaChzZXJ2ZXIpOworCQkJc21iX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVzdWx0ID0gLUVGQVVMVDsKKwkJaWYgKCFjb3B5X2Zyb21fdXNlcigmb3B0LCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihvcHQpKSkKKwkJCXJlc3VsdCA9IHNtYl9uZXdjb25uKHNlcnZlciwgJm9wdCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9mcy9zbWJmcy9wcm9jLmMgYi9mcy9zbWJmcy9wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwYmFiZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NtYmZzL3Byb2MuYwpAQCAtMCwwICsxLDM1MDkgQEAKKy8qCisgKiAgcHJvYy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBQYWFsLUtyLiBFbmdzdGFkIGFuZCBWb2xrZXIgTGVuZGVja2UKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTcgYnkgVm9sa2VyIExlbmRlY2tlCisgKgorICogIFBsZWFzZSBhZGQgYSBub3RlIGFib3V0IHlvdXIgY2hhbmdlcyB0byBzbWJmcyBpbiB0aGUgQ2hhbmdlTG9nIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvZGlyZW50Lmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbWJfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbWJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NtYl9tb3VudC5oPgorCisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKworI2luY2x1ZGUgInNtYl9kZWJ1Zy5oIgorI2luY2x1ZGUgInByb3RvLmgiCisjaW5jbHVkZSAicmVxdWVzdC5oIgorCisKKy8qIEZlYXR1cmVzLiBVbmRlZmluZSBpZiB0aGV5IGNhdXNlIHByb2JsZW1zLCB0aGlzIHNob3VsZCBwZXJoYXBzIGJlIGEKKyAgIGNvbmZpZyBvcHRpb24uICovCisjZGVmaW5lIFNNQkZTX1BPU0lYX1VOTElOSyAxCisKKy8qIEFsbG93IHNtYl9yZXRyeSB0byBiZSBpbnRlcnJ1cHRlZC4gKi8KKyNkZWZpbmUgU01CX1JFVFJZX0lOVFIKKworI2RlZmluZSBTTUJfVldWKHBhY2tldCkgICgocGFja2V0KSArIFNNQl9IRUFERVJfTEVOKQorI2RlZmluZSBTTUJfQ01EKHBhY2tldCkgICgqKHBhY2tldCs4KSkKKyNkZWZpbmUgU01CX1dDVChwYWNrZXQpICAoKihwYWNrZXQrU01CX0hFQURFUl9MRU4gLSAxKSkKKworI2RlZmluZSBTTUJfRElSSU5GT19TSVpFIDQzCisjZGVmaW5lIFNNQl9TVEFUVVNfU0laRSAgMjEKKworI2RlZmluZSBTTUJfU1RfQkxLU0laRQkoUEFHRV9TSVpFKQorI2RlZmluZSBTTUJfU1RfQkxLU0hJRlQJKFBBR0VfU0hJRlQpCisKK3N0YXRpYyBzdHJ1Y3Qgc21iX29wcyBzbWJfb3BzX2NvcmU7CitzdGF0aWMgc3RydWN0IHNtYl9vcHMgc21iX29wc19vczI7CitzdGF0aWMgc3RydWN0IHNtYl9vcHMgc21iX29wc193aW45NTsKK3N0YXRpYyBzdHJ1Y3Qgc21iX29wcyBzbWJfb3BzX3dpbk5UOworc3RhdGljIHN0cnVjdCBzbWJfb3BzIHNtYl9vcHNfdW5peDsKK3N0YXRpYyBzdHJ1Y3Qgc21iX29wcyBzbWJfb3BzX251bGw7CisKK3N0YXRpYyB2b2lkCitzbWJfaW5pdF9kaXJlbnQoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyKTsKK3N0YXRpYyB2b2lkCitzbWJfZmluaXNoX2RpcmVudChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIpOworc3RhdGljIGludAorc21iX3Byb2NfZ2V0YXR0cl9jb3JlKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3QgZGVudHJ5ICpkaXIsCisJCSAgICAgIHN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyKTsKK3N0YXRpYyBpbnQKK3NtYl9wcm9jX2dldGF0dHJfZmYoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJICAgIHN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyKTsKK3N0YXRpYyBpbnQKK3NtYl9wcm9jX3NldGF0dHJfY29yZShzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICAgICB1MTYgYXR0cik7CitzdGF0aWMgaW50CitzbWJfcHJvY19zZXRhdHRyX2V4dChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwKKwkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgc21iX2ZhdHRyICpmYXR0cik7CitzdGF0aWMgaW50CitzbWJfcHJvY19xdWVyeV9jaWZzdW5peChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcik7CitzdGF0aWMgdm9pZAoraW5zdGFsbF9vcHMoc3RydWN0IHNtYl9vcHMgKmRzdCwgc3RydWN0IHNtYl9vcHMgKnNyYyk7CisKKworc3RhdGljIHZvaWQKK3N0cl91cHBlcihjaGFyICpuYW1lLCBpbnQgbGVuKQoreworCXdoaWxlIChsZW4tLSkKKwl7CisJCWlmICgqbmFtZSA+PSAnYScgJiYgKm5hbWUgPD0gJ3onKQorCQkJKm5hbWUgLT0gKCdhJyAtICdBJyk7CisJCW5hbWUrKzsKKwl9Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAorc3RyX2xvd2VyKGNoYXIgKm5hbWUsIGludCBsZW4pCit7CisJd2hpbGUgKGxlbi0tKQorCXsKKwkJaWYgKCpuYW1lID49ICdBJyAmJiAqbmFtZSA8PSAnWicpCisJCQkqbmFtZSArPSAoJ2EnIC0gJ0EnKTsKKwkJbmFtZSsrOworCX0KK30KKyNlbmRpZgorCisvKiByZXZlcnNlIGEgc3RyaW5nIGlubGluZS4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXJjYWNoZSB3YWxraW5nIHJvdXRpbmVzICovCitzdGF0aWMgdm9pZCByZXZlcnNlX3N0cmluZyhjaGFyICpidWYsIGludCBsZW4pCit7CisJY2hhciBjOworCWNoYXIgKmVuZCA9IGJ1ZitsZW4tMTsKKworCXdoaWxlKGJ1ZiA8IGVuZCkgeworCQljID0gKmJ1ZjsKKwkJKihidWYrKykgPSAqZW5kOworCQkqKGVuZC0tKSA9IGM7CisJfQorfQorCisvKiBubyBjb252ZXJzaW9uLCBqdXN0IGEgd3JhcHBlciBmb3IgbWVtY3B5LiAqLworc3RhdGljIGludCBjb252ZXJ0X21lbWNweSh1bnNpZ25lZCBjaGFyICpvdXRwdXQsIGludCBvbGVuLAorCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4sCisJCQkgIHN0cnVjdCBubHNfdGFibGUgKm5sc19mcm9tLAorCQkJICBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfdG8pCit7CisJaWYgKG9sZW4gPCBpbGVuKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwltZW1jcHkob3V0cHV0LCBpbnB1dCwgaWxlbik7CisJcmV0dXJuIGlsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHdyaXRlX2NoYXIodW5zaWduZWQgY2hhciBjaCwgY2hhciAqb3V0cHV0LCBpbnQgb2xlbikKK3sKKwlpZiAob2xlbiA8IDQpCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCXNwcmludGYob3V0cHV0LCAiOnglMDJ4IiwgY2gpOworCXJldHVybiA0OworfQorCitzdGF0aWMgaW5saW5lIGludCB3cml0ZV91bmljaGFyKHdjaGFyX3QgY2gsIGNoYXIgKm91dHB1dCwgaW50IG9sZW4pCit7CisJaWYgKG9sZW4gPCA1KQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwlzcHJpbnRmKG91dHB1dCwgIjolMDR4IiwgY2gpOworCXJldHVybiA1OworfQorCisvKiBjb252ZXJ0IGZyb20gb25lICJjb2RlcGFnZSIgdG8gYW5vdGhlciAocG9zc2libHkgYmVpbmcgdXRmOCkuICovCitzdGF0aWMgaW50IGNvbnZlcnRfY3AodW5zaWduZWQgY2hhciAqb3V0cHV0LCBpbnQgb2xlbiwKKwkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuLAorCQkgICAgICBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfZnJvbSwKKwkJICAgICAgc3RydWN0IG5sc190YWJsZSAqbmxzX3RvKQoreworCWludCBsZW4gPSAwOworCWludCBuOworCXdjaGFyX3QgY2g7CisKKwl3aGlsZSAoaWxlbiA+IDApIHsKKwkJLyogY29udmVydCBieSBjaGFuZ2luZyB0byB1bmljb2RlIGFuZCBiYWNrIHRvIHRoZSBuZXcgY3AgKi8KKwkJbiA9IG5sc19mcm9tLT5jaGFyMnVuaShpbnB1dCwgaWxlbiwgJmNoKTsKKwkJaWYgKG4gPT0gLUVJTlZBTCkgeworCQkJaWxlbi0tOworCQkJbiA9IHdyaXRlX2NoYXIoKmlucHV0KyssIG91dHB1dCwgb2xlbik7CisJCQlpZiAobiA8IDApCisJCQkJZ290byBmYWlsOworCQkJb3V0cHV0ICs9IG47CisJCQlvbGVuIC09IG47CisJCQlsZW4gKz0gbjsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKG4gPCAwKQorCQkJZ290byBmYWlsOworCQlpbnB1dCArPSBuOworCQlpbGVuIC09IG47CisKKwkJbiA9IG5sc190by0+dW5pMmNoYXIoY2gsIG91dHB1dCwgb2xlbik7CisJCWlmIChuID09IC1FSU5WQUwpCisJCQluID0gd3JpdGVfdW5pY2hhcihjaCwgb3V0cHV0LCBvbGVuKTsKKwkJaWYgKG4gPCAwKQorCQkJZ290byBmYWlsOworCQlvdXRwdXQgKz0gbjsKKwkJb2xlbiAtPSBuOworCisJCWxlbiArPSBuOworCX0KKwlyZXR1cm4gbGVuOworZmFpbDoKKwlyZXR1cm4gbjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIG5sc191bmljb2RlCisgKgorICogVGhpcyBlbmNvZGVzL2RlY29kZXMgbGl0dGxlIGVuZGlhbiB1bmljb2RlIGZvcm1hdAorICovCisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCWlmIChib3VuZGxlbiA8IDIpCisJCXJldHVybiAtRUlOVkFMOworCSpvdXQrKyA9IHVuaSAmIDB4ZmY7CisJKm91dCsrID0gdW5pID4+IDg7CisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKwlpZiAoYm91bmRsZW4gPCAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkqdW5pID0gKHJhd3N0cmluZ1sxXSA8PCA4KSB8IHJhd3N0cmluZ1swXTsKKwlyZXR1cm4gMjsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdW5pY29kZV90YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJ1bmljb2RlIiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgc2V0Y29kZXBhZ2Uoc3RydWN0IG5sc190YWJsZSAqKnAsIGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG5sc190YWJsZSAqbmxzOworCisJaWYgKCFuYW1lIHx8ICEqbmFtZSkgeworCQlubHMgPSBOVUxMOworCX0gZWxzZSBpZiAoIChubHMgPSBsb2FkX25scyhuYW1lKSkgPT0gTlVMTCkgeworCQlwcmludGsgKEtFUk5fRVJSICJzbWJmczogZmFpbGVkIHRvIGxvYWQgbmxzICclcydcbiIsIG5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBpZiBhbHJlYWR5IHNldCwgdW5sb2FkIHRoZSBwcmV2aW91cyBvbmUuICovCisJaWYgKCpwICYmICpwICE9ICZ1bmljb2RlX3RhYmxlKQorCQl1bmxvYWRfbmxzKCpwKTsKKwkqcCA9IG5sczsKKworCXJldHVybiAwOworfQorCisvKiBIYW5kbGVzIGFsbCBjaGFuZ2VzIHRvIGNvZGVwYWdlIHNldHRpbmdzLiAqLworaW50IHNtYl9zZXRjb2RlcGFnZShzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IHNtYl9ubHNfY29kZXBhZ2UgKmNwKQoreworCWludCBuID0gMDsKKworCXNtYl9sb2NrX3NlcnZlcihzZXJ2ZXIpOworCisJLyogRG9uJ3QgbG9hZCBhbnkgbmxzXyogYXQgYWxsLCBpZiBubyByZW1vdGUgaXMgcmVxdWVzdGVkICovCisJaWYgKCEqY3AtPnJlbW90ZV9uYW1lKQorCQlnb3RvIG91dDsKKworCS8qIGxvY2FsICovCisJbiA9IHNldGNvZGVwYWdlKCZzZXJ2ZXItPmxvY2FsX25scywgY3AtPmxvY2FsX25hbWUpOworCWlmIChuICE9IDApCisJCWdvdG8gb3V0OworCisJLyogcmVtb3RlICovCisJaWYgKCFzdHJjbXAoY3AtPnJlbW90ZV9uYW1lLCAidW5pY29kZSIpKSB7CisJCXNlcnZlci0+cmVtb3RlX25scyA9ICZ1bmljb2RlX3RhYmxlOworCX0gZWxzZSB7CisJCW4gPSBzZXRjb2RlcGFnZSgmc2VydmVyLT5yZW1vdGVfbmxzLCBjcC0+cmVtb3RlX25hbWUpOworCQlpZiAobiAhPSAwKQorCQkJc2V0Y29kZXBhZ2UoJnNlcnZlci0+bG9jYWxfbmxzLCBOVUxMKTsKKwl9CisKK291dDoKKwlpZiAoc2VydmVyLT5sb2NhbF9ubHMgIT0gTlVMTCAmJiBzZXJ2ZXItPnJlbW90ZV9ubHMgIT0gTlVMTCkKKwkJc2VydmVyLT5vcHMtPmNvbnZlcnQgPSBjb252ZXJ0X2NwOworCWVsc2UKKwkJc2VydmVyLT5vcHMtPmNvbnZlcnQgPSBjb252ZXJ0X21lbWNweTsKKworCXNtYl91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJcmV0dXJuIG47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEVuY29kaW5nL0RlY29kaW5nIHNlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgX191OCAqCitzbWJfZW5jb2RlX3NtYl9sZW5ndGgoX191OCAqIHAsIF9fdTMyIGxlbikKK3sKKwkqcCA9IDA7CisJKihwKzEpID0gMDsKKwkqKHArMikgPSAobGVuICYgMHhGRjAwKSA+PiA4OworCSoocCszKSA9IChsZW4gJiAweEZGKTsKKwlpZiAobGVuID4gMHhGRkZGKQorCXsKKwkJKihwKzEpID0gMTsKKwl9CisJcmV0dXJuIHAgKyA0OworfQorCisvKgorICogc21iX2J1aWxkX3BhdGg6IGJ1aWxkIHRoZSBwYXRoIHRvIGVudHJ5IGFuZCBuYW1lIHN0b3JpbmcgaXQgaW4gYnVmLgorICogVGhlIHBhdGggcmV0dXJuZWQgd2lsbCBoYXZlIHRoZSB0cmFpbGluZyAnXDAnLgorICovCitzdGF0aWMgaW50IHNtYl9idWlsZF9wYXRoKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkgIGludCBtYXhsZW4sCisJCQkgIHN0cnVjdCBkZW50cnkgKmVudHJ5LCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpwYXRoID0gYnVmOworCWludCBsZW47CisJaW50IHVuaWNvZGUgPSAoc2VydmVyLT5tbnQtPmZsYWdzICYgU01CX01PVU5UX1VOSUNPREUpICE9IDA7CisKKwlpZiAobWF4bGVuIDwgKDI8PHVuaWNvZGUpKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCWlmIChtYXhsZW4gPiBTTUJfTUFYUEFUSExFTiArIDEpCisJCW1heGxlbiA9IFNNQl9NQVhQQVRITEVOICsgMTsKKworCWlmIChlbnRyeSA9PSBOVUxMKQorCQlnb3RvIHRlc3RfbmFtZV9hbmRfb3V0OworCisJLyoKKwkgKiBJZiBJU19ST09ULCB3ZSBoYXZlIHRvIGRvIG5vIHdhbGtpbmcgYXQgYWxsLgorCSAqLworCWlmIChJU19ST09UKGVudHJ5KSAmJiAhbmFtZSkgeworCQkqcGF0aCsrID0gJ1xcJzsKKwkJaWYgKHVuaWNvZGUpICpwYXRoKysgPSAnXDAnOworCQkqcGF0aCsrID0gJ1wwJzsKKwkJaWYgKHVuaWNvZGUpICpwYXRoKysgPSAnXDAnOworCQlyZXR1cm4gcGF0aC1idWY7CisJfQorCisJLyoKKwkgKiBCdWlsZCB0aGUgcGF0aCBzdHJpbmcgd2Fsa2luZyB0aGUgdHJlZSBiYWNrd2FyZCBmcm9tIGVuZCB0byBST09UCisJICogYW5kIHN0b3JlIGl0IGluIHJldmVyc2VkIG9yZGVyIFtzZWUgcmV2ZXJzZV9zdHJpbmcoKV0KKwkgKi8KKwlkZ2V0KGVudHJ5KTsKKwlzcGluX2xvY2soJmVudHJ5LT5kX2xvY2spOworCXdoaWxlICghSVNfUk9PVChlbnRyeSkpIHsKKwkJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCisJCWlmIChtYXhsZW4gPCAoMzw8dW5pY29kZSkpIHsKKwkJCXNwaW5fdW5sb2NrKCZlbnRyeS0+ZF9sb2NrKTsKKwkJCWRwdXQoZW50cnkpOworCQkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisJCX0KKworCQlsZW4gPSBzZXJ2ZXItPm9wcy0+Y29udmVydChwYXRoLCBtYXhsZW4tMiwgCisJCQkJICAgICAgZW50cnktPmRfbmFtZS5uYW1lLCBlbnRyeS0+ZF9uYW1lLmxlbiwKKwkJCQkgICAgICBzZXJ2ZXItPmxvY2FsX25scywgc2VydmVyLT5yZW1vdGVfbmxzKTsKKwkJaWYgKGxlbiA8IDApIHsKKwkJCXNwaW5fdW5sb2NrKCZlbnRyeS0+ZF9sb2NrKTsKKwkJCWRwdXQoZW50cnkpOworCQkJcmV0dXJuIGxlbjsKKwkJfQorCQlyZXZlcnNlX3N0cmluZyhwYXRoLCBsZW4pOworCQlwYXRoICs9IGxlbjsKKwkJaWYgKHVuaWNvZGUpIHsKKwkJCS8qIE5vdGU6IHJldmVyc2Ugb3JkZXIgKi8KKwkJCSpwYXRoKysgPSAnXDAnOworCQkJbWF4bGVuLS07CisJCX0KKwkJKnBhdGgrKyA9ICdcXCc7CisJCW1heGxlbiAtPSBsZW4rMTsKKworCQlwYXJlbnQgPSBlbnRyeS0+ZF9wYXJlbnQ7CisJCWRnZXQocGFyZW50KTsKKwkJc3Bpbl91bmxvY2soJmVudHJ5LT5kX2xvY2spOworCQlkcHV0KGVudHJ5KTsKKwkJZW50cnkgPSBwYXJlbnQ7CisJCXNwaW5fbG9jaygmZW50cnktPmRfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrKCZlbnRyeS0+ZF9sb2NrKTsKKwlkcHV0KGVudHJ5KTsKKwlyZXZlcnNlX3N0cmluZyhidWYsIHBhdGgtYnVmKTsKKworCS8qIG1heGxlbiBoYXMgc3BhY2UgZm9yIGF0IGxlYXN0IG9uZSBjaGFyICovCit0ZXN0X25hbWVfYW5kX291dDoKKwlpZiAobmFtZSkgeworCQlpZiAobWF4bGVuIDwgKDM8PHVuaWNvZGUpKQorCQkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisJCSpwYXRoKysgPSAnXFwnOworCQlpZiAodW5pY29kZSkgeworCQkJKnBhdGgrKyA9ICdcMCc7CisJCQltYXhsZW4tLTsKKwkJfQorCQlsZW4gPSBzZXJ2ZXItPm9wcy0+Y29udmVydChwYXRoLCBtYXhsZW4tMiwgCisJCQkJICAgICAgbmFtZS0+bmFtZSwgbmFtZS0+bGVuLAorCQkJCSAgICAgIHNlcnZlci0+bG9jYWxfbmxzLCBzZXJ2ZXItPnJlbW90ZV9ubHMpOworCQlpZiAobGVuIDwgMCkKKwkJCXJldHVybiBsZW47CisJCXBhdGggKz0gbGVuOworCQltYXhsZW4gLT0gbGVuKzE7CisJfQorCS8qIG1heGxlbiBoYXMgc3BhY2UgZm9yIGF0IGxlYXN0IG9uZSBjaGFyICovCisJKnBhdGgrKyA9ICdcMCc7CisJaWYgKHVuaWNvZGUpICpwYXRoKysgPSAnXDAnOworCXJldHVybiBwYXRoLWJ1ZjsKK30KKworc3RhdGljIGludCBzbWJfZW5jb2RlX3BhdGgoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIGNoYXIgKmJ1ZiwgaW50IG1heGxlbiwKKwkJCSAgIHN0cnVjdCBkZW50cnkgKmRpciwgc3RydWN0IHFzdHIgKm5hbWUpCit7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IHNtYl9idWlsZF9wYXRoKHNlcnZlciwgYnVmLCBtYXhsZW4sIGRpciwgbmFtZSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0OworCWlmIChzZXJ2ZXItPm9wdC5wcm90b2NvbCA8PSBTTUJfUFJPVE9DT0xfQ09SRVBMVVMpCisJCXN0cl91cHBlcihidWYsIHJlc3VsdCk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogZW5jb2RlX3BhdGggZm9yIG5vbi10cmFuczIgcmVxdWVzdCBTTUJzICovCitzdGF0aWMgaW50IHNtYl9zaW1wbGVfZW5jb2RlX3BhdGgoc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEsIGNoYXIgKipwLAorCQkJCSAgc3RydWN0IGRlbnRyeSAqIGVudHJ5LCBzdHJ1Y3QgcXN0ciAqIG5hbWUpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSByZXEtPnJxX3NlcnZlcjsKKwljaGFyICpzID0gKnA7CisJaW50IHJlczsKKwlpbnQgbWF4bGVuID0gKChjaGFyICopcmVxLT5ycV9idWZmZXIgKyByZXEtPnJxX2J1ZnNpemUpIC0gczsKKwlpbnQgdW5pY29kZSA9IChzZXJ2ZXItPm1udC0+ZmxhZ3MgJiBTTUJfTU9VTlRfVU5JQ09ERSk7CisKKwlpZiAoIW1heGxlbikKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisJKnMrKyA9IDQ7CS8qIEFTQ0lJIGRhdGEgZm9ybWF0ICovCisKKwkvKgorCSAqIFNNQiBVbmljb2RlIHN0cmluZ3MgbXVzdCBiZSAxNmJpdCBhbGlnbmVkIHJlbGF0aXZlIHRoZSBzdGFydCBvZiB0aGUKKwkgKiBwYWNrZXQuIElmIHRoZXkgYXJlIG5vdCB0aGV5IG11c3QgYmUgcGFkZGVkIHdpdGggMC4KKwkgKi8KKwlpZiAodW5pY29kZSkgeworCQlpbnQgYWxpZ24gPSBzIC0gKGNoYXIgKilyZXEtPnJxX2J1ZmZlcjsKKwkJaWYgKCEoYWxpZ24gJiAxKSkgeworCQkJKnMrKyA9ICdcMCc7CisJCQltYXhsZW4tLTsKKwkJfQorCX0KKworCXJlcyA9IHNtYl9lbmNvZGVfcGF0aChzZXJ2ZXIsIHMsIG1heGxlbi0xLCBlbnRyeSwgbmFtZSk7CisJaWYgKHJlcyA8IDApCisJCXJldHVybiByZXM7CisJKnAgPSBzICsgcmVzOworCXJldHVybiAwOworfQorCisvKiBUaGUgZm9sbG93aW5nIGFyZSB0YWtlbiBkaXJlY3RseSBmcm9tIG1zZG9zLWZzICovCisKKy8qIExpbmVhciBkYXkgbnVtYmVycyBvZiB0aGUgcmVzcGVjdGl2ZSAxc3RzIGluIG5vbi1sZWFwIHllYXJzLiAqLworCitzdGF0aWMgaW50IGRheV9uW10gPQorezAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0LCAwLCAwLCAwLCAwfTsKKwkJICAvKiBKYW5GZWJNYXJBcHIgTWF5IEp1biBKdWwgQXVnIFNlcCBPY3QgTm92IERlYyAqLworCisKK3N0YXRpYyB0aW1lX3QKK3V0YzJsb2NhbChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgdGltZV90IHRpbWUpCit7CisJcmV0dXJuIHRpbWUgLSBzZXJ2ZXItPm9wdC5zZXJ2ZXJ6b25lKjYwOworfQorCitzdGF0aWMgdGltZV90Citsb2NhbDJ1dGMoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHRpbWVfdCB0aW1lKQoreworCXJldHVybiB0aW1lICsgc2VydmVyLT5vcHQuc2VydmVyem9uZSo2MDsKK30KKworLyogQ29udmVydCBhIE1TLURPUyB0aW1lL2RhdGUgcGFpciB0byBhIFVOSVggZGF0ZSAoc2Vjb25kcyBzaW5jZSAxIDEgNzApLiAqLworCitzdGF0aWMgdGltZV90CitkYXRlX2RvczJ1bml4KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBfX3UxNiBkYXRlLCBfX3UxNiB0aW1lKQoreworCWludCBtb250aCwgeWVhcjsKKwl0aW1lX3Qgc2VjczsKKworCS8qIGZpcnN0IHN1YnRyYWN0IGFuZCBtYXNrIGFmdGVyIHRoYXQuLi4gT3RoZXJ3aXNlLCBpZgorCSAgIGRhdGUgPT0gMCwgYmFkIHRoaW5ncyBoYXBwZW4gKi8KKwltb250aCA9ICgoZGF0ZSA+PiA1KSAtIDEpICYgMTU7CisJeWVhciA9IGRhdGUgPj4gOTsKKwlzZWNzID0gKHRpbWUgJiAzMSkgKiAyICsgNjAgKiAoKHRpbWUgPj4gNSkgJiA2MykgKyAodGltZSA+PiAxMSkgKiAzNjAwICsgODY0MDAgKgorCSAgICAoKGRhdGUgJiAzMSkgLSAxICsgZGF5X25bbW9udGhdICsgKHllYXIgLyA0KSArIHllYXIgKiAzNjUgLSAoKHllYXIgJiAzKSA9PSAwICYmCisJCQkJCQkgICBtb250aCA8IDIgPyAxIDogMCkgKyAzNjUzKTsKKwkvKiBkYXlzIHNpbmNlIDEuMS43MCBwbHVzIDgwJ3MgbGVhcCBkYXkgKi8KKwlyZXR1cm4gbG9jYWwydXRjKHNlcnZlciwgc2Vjcyk7Cit9CisKKworLyogQ29udmVydCBsaW5lYXIgVU5JWCBkYXRlIHRvIGEgTVMtRE9TIHRpbWUvZGF0ZSBwYWlyLiAqLworCitzdGF0aWMgdm9pZAorZGF0ZV91bml4MmRvcyhzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwKKwkgICAgICBpbnQgdW5peF9kYXRlLCBfX3UxNiAqZGF0ZSwgX191MTYgKnRpbWUpCit7CisJaW50IGRheSwgeWVhciwgbmxfZGF5LCBtb250aDsKKworCXVuaXhfZGF0ZSA9IHV0YzJsb2NhbChzZXJ2ZXIsIHVuaXhfZGF0ZSk7CisJaWYgKHVuaXhfZGF0ZSA8IDMxNTUzMjgwMCkKKwkJdW5peF9kYXRlID0gMzE1NTMyODAwOworCisJKnRpbWUgPSAodW5peF9kYXRlICUgNjApIC8gMiArCisJCSgoKHVuaXhfZGF0ZSAvIDYwKSAlIDYwKSA8PCA1KSArCisJCSgoKHVuaXhfZGF0ZSAvIDM2MDApICUgMjQpIDw8IDExKTsKKworCWRheSA9IHVuaXhfZGF0ZSAvIDg2NDAwIC0gMzY1MjsKKwl5ZWFyID0gZGF5IC8gMzY1OworCWlmICgoeWVhciArIDMpIC8gNCArIDM2NSAqIHllYXIgPiBkYXkpCisJCXllYXItLTsKKwlkYXkgLT0gKHllYXIgKyAzKSAvIDQgKyAzNjUgKiB5ZWFyOworCWlmIChkYXkgPT0gNTkgJiYgISh5ZWFyICYgMykpIHsKKwkJbmxfZGF5ID0gZGF5OworCQltb250aCA9IDI7CisJfSBlbHNlIHsKKwkJbmxfZGF5ID0gKHllYXIgJiAzKSB8fCBkYXkgPD0gNTkgPyBkYXkgOiBkYXkgLSAxOworCQlmb3IgKG1vbnRoID0gMDsgbW9udGggPCAxMjsgbW9udGgrKykKKwkJCWlmIChkYXlfblttb250aF0gPiBubF9kYXkpCisJCQkJYnJlYWs7CisJfQorCSpkYXRlID0gbmxfZGF5IC0gZGF5X25bbW9udGggLSAxXSArIDEgKyAobW9udGggPDwgNSkgKyAoeWVhciA8PCA5KTsKK30KKworLyogVGhlIGZvbGxvd2luZyBhcmUgdGFrZW4gZnJvbSBmcy9udGZzL3V0aWwuYyAqLworCisjZGVmaW5lIE5URlNfVElNRV9PRkZTRVQgKCh1NjQpKDM2OSozNjUgKyA4OSkgKiAyNCAqIDM2MDAgKiAxMDAwMDAwMCkKKworLyoKKyAqIENvbnZlcnQgdGhlIE5UIFVUQyAoYmFzZWQgMTYwMS0wMS0wMSwgaW4gaHVuZHJlZCBuYW5vc2Vjb25kIHVuaXRzKQorICogaW50byBVbml4IFVUQyAoYmFzZWQgMTk3MC0wMS0wMSwgaW4gc2Vjb25kcykuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdGltZXNwZWMKK3NtYl9udHV0YzJ1bml4dXRjKHU2NCBudHV0YykKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJLyogRklYTUU6IHdoYXQgYWJvdXQgdGhlIHRpbWV6b25lIGRpZmZlcmVuY2U/ICovCisJLyogU3VidHJhY3QgdGhlIE5URlMgdGltZSBvZmZzZXQsIHRoZW4gY29udmVydCB0byAxcyBpbnRlcnZhbHMuICovCisJdTY0IHQgPSBudHV0YyAtIE5URlNfVElNRV9PRkZTRVQ7CisJdHMudHZfbnNlYyA9IGRvX2Rpdih0LCAxMDAwMDAwMCkgKiAxMDA7CisJdHMudHZfc2VjID0gdDsgCisJcmV0dXJuIHRzOworfQorCisvKiBDb252ZXJ0IHRoZSBVbml4IFVUQyBpbnRvIE5UIHRpbWUgKi8KK3N0YXRpYyB1NjQKK3NtYl91bml4dXRjMm50dXRjKHN0cnVjdCB0aW1lc3BlYyB0cykKK3sKKwkvKiBOb3RlOiB0aW1lem9uZSBjb252ZXJzaW9uIGlzIHByb2JhYmx5IHdyb25nLiAqLworCS8qIHJldHVybiAoKHU2NCl1dGMybG9jYWwoc2VydmVyLCB0KSkgKiAxMDAwMDAwMCArIE5URlNfVElNRV9PRkZTRVQ7ICovCisJcmV0dXJuICgodTY0KXRzLnR2X3NlYykgKiAxMDAwMDAwMCArIHRzLnR2X25zZWMvMTAwICsgTlRGU19USU1FX09GRlNFVDsKK30KKworI2RlZmluZSBNQVhfRklMRV9NT0RFCTYKK3N0YXRpYyBtb2RlX3QgZmlsZV9tb2RlW10gPSB7CisJU19JRlJFRywgU19JRkRJUiwgU19JRkxOSywgU19JRkNIUiwgU19JRkJMSywgU19JRklGTywgU19JRlNPQ0sKK307CisKK3N0YXRpYyBpbnQgc21iX2ZpbGV0eXBlX3RvX21vZGUodTMyIGZpbGV0eXBlKQoreworCWlmIChmaWxldHlwZSA+IE1BWF9GSUxFX01PREUpIHsKKwkJUEFSQU5PSUEoIkZpbGV0eXBlIG91dCBvZiByYW5nZTogJWRcbiIsIGZpbGV0eXBlKTsKKwkJcmV0dXJuIFNfSUZSRUc7CisJfQorCXJldHVybiBmaWxlX21vZGVbZmlsZXR5cGVdOworfQorCitzdGF0aWMgdTMyIHNtYl9maWxldHlwZV9mcm9tX21vZGUoaW50IG1vZGUpCit7CisJaWYgKFNfSVNSRUcobW9kZSkpCisJCXJldHVybiBVTklYX1RZUEVfRklMRTsKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJcmV0dXJuIFVOSVhfVFlQRV9ESVI7CisJaWYgKFNfSVNMTksobW9kZSkpCisJCXJldHVybiBVTklYX1RZUEVfU1lNTElOSzsKKwlpZiAoU19JU0NIUihtb2RlKSkKKwkJcmV0dXJuIFVOSVhfVFlQRV9DSEFSREVWOworCWlmIChTX0lTQkxLKG1vZGUpKQorCQlyZXR1cm4gVU5JWF9UWVBFX0JMS0RFVjsKKwlpZiAoU19JU0ZJRk8obW9kZSkpCisJCXJldHVybiBVTklYX1RZUEVfRklGTzsKKwlpZiAoU19JU1NPQ0sobW9kZSkpCisJCXJldHVybiBVTklYX1RZUEVfU09DS0VUOworCXJldHVybiBVTklYX1RZUEVfVU5LTk9XTjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU3VwcG9ydCBzZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK19fdTMyCitzbWJfbGVuKF9fdTggKiBwKQoreworCXJldHVybiAoKCoocCsxKSAmIDB4MSkgPDwgMTZMKSB8ICgqKHArMikgPDwgOEwpIHwgKihwKzMpOworfQorCitzdGF0aWMgX191MTYKK3NtYl9iY2MoX191OCAqIHBhY2tldCkKK3sKKwlpbnQgcG9zID0gU01CX0hFQURFUl9MRU4gKyBTTUJfV0NUKHBhY2tldCkgKiBzaXplb2YoX191MTYpOworCXJldHVybiBXVkFMKHBhY2tldCwgcG9zKTsKK30KKworLyogc21iX3ZhbGlkX3BhY2tldDogV2UgY2hlY2sgaWYgcGFja2V0IGZ1bGZpbGxzIHRoZSBiYXNpYworICAgcmVxdWlyZW1lbnRzIG9mIGEgc21iIHBhY2tldCAqLworCitzdGF0aWMgaW50CitzbWJfdmFsaWRfcGFja2V0KF9fdTggKiBwYWNrZXQpCit7CisJcmV0dXJuIChwYWNrZXRbNF0gPT0gMHhmZgorCQkmJiBwYWNrZXRbNV0gPT0gJ1MnCisJCSYmIHBhY2tldFs2XSA9PSAnTScKKwkJJiYgcGFja2V0WzddID09ICdCJworCQkmJiAoc21iX2xlbihwYWNrZXQpICsgNCA9PSBTTUJfSEVBREVSX0xFTgorCQkgICAgKyBTTUJfV0NUKHBhY2tldCkgKiAyICsgc21iX2JjYyhwYWNrZXQpKSk7Cit9CisKKy8qIHNtYl92ZXJpZnk6IFdlIGNoZWNrIGlmIHdlIGdvdCB0aGUgYW5zd2VyIHdlIGV4cGVjdGVkLCBhbmQgaWYgd2UKKyAgIGdvdCBlbm91Z2ggZGF0YS4gSWYgYmNjID09IC0xLCB3ZSBkb24ndCBjYXJlLiAqLworCitzdGF0aWMgaW50CitzbWJfdmVyaWZ5KF9fdTggKiBwYWNrZXQsIGludCBjb21tYW5kLCBpbnQgd2N0LCBpbnQgYmNjKQoreworCWlmIChTTUJfQ01EKHBhY2tldCkgIT0gY29tbWFuZCkKKwkJZ290byBiYWRfY29tbWFuZDsKKwlpZiAoU01CX1dDVChwYWNrZXQpIDwgd2N0KQorCQlnb3RvIGJhZF93Y3Q7CisJaWYgKGJjYyAhPSAtMSAmJiBzbWJfYmNjKHBhY2tldCkgPCBiY2MpCisJCWdvdG8gYmFkX2JjYzsKKwlyZXR1cm4gMDsKKworYmFkX2NvbW1hbmQ6CisJcHJpbnRrKEtFUk5fRVJSICJzbWJfdmVyaWZ5OiBjb21tYW5kPSV4LCBTTUJfQ01EPSV4Pz9cbiIsCisJICAgICAgIGNvbW1hbmQsIFNNQl9DTUQocGFja2V0KSk7CisJZ290byBmYWlsOworYmFkX3djdDoKKwlwcmludGsoS0VSTl9FUlIgInNtYl92ZXJpZnk6IGNvbW1hbmQ9JXgsIHdjdD0lZCwgU01CX1dDVD0lZD8/XG4iLAorCSAgICAgICBjb21tYW5kLCB3Y3QsIFNNQl9XQ1QocGFja2V0KSk7CisJZ290byBmYWlsOworYmFkX2JjYzoKKwlwcmludGsoS0VSTl9FUlIgInNtYl92ZXJpZnk6IGNvbW1hbmQ9JXgsIGJjYz0lZCwgU01CX0JDQz0lZD8/XG4iLAorCSAgICAgICBjb21tYW5kLCBiY2MsIHNtYl9iY2MocGFja2V0KSk7CitmYWlsOgorCXJldHVybiAtRUlPOworfQorCisvKgorICogUmV0dXJucyB0aGUgbWF4aW11bSByZWFkIG9yIHdyaXRlIHNpemUgZm9yIHRoZSAicGF5bG9hZCIuIE1ha2luZyBhbGwgb2YgdGhlCisgKiBwYWNrZXQgZml0IHdpdGhpbiB0aGUgbmVnb3RpYXRlZCBtYXhfeG1pdCBzaXplLgorICoKKyAqIE4uQi4gU2luY2UgdGhpcyB2YWx1ZSBpcyB1c3VhbGx5IGNvbXB1dGVkIGJlZm9yZSBsb2NraW5nIHRoZSBzZXJ2ZXIsCisgKiB0aGUgc2VydmVyJ3MgcGFja2V0IHNpemUgbXVzdCBuZXZlciBiZSBkZWNyZWFzZWQhCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzbWJfZ2V0X3htaXRzaXplKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBpbnQgb3ZlcmhlYWQpCit7CisJcmV0dXJuIHNlcnZlci0+b3B0Lm1heF94bWl0IC0gb3ZlcmhlYWQ7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gcmVhZCBzaXplCisgKi8KK2ludAorc21iX2dldF9yc2l6ZShzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcikKK3sKKwkvKiByZWFkWCBoYXMgMTIgcGFyYW1ldGVycywgcmVhZCBoYXMgNSAqLworCWludCBvdmVyaGVhZCA9IFNNQl9IRUFERVJfTEVOICsgMTIgKiBzaXplb2YoX191MTYpICsgMiArIDEgKyAyOworCWludCBzaXplID0gc21iX2dldF94bWl0c2l6ZShzZXJ2ZXIsIG92ZXJoZWFkKTsKKworCVZFUkJPU0UoInhtaXQ9JWQsIHNpemU9JWRcbiIsIHNlcnZlci0+b3B0Lm1heF94bWl0LCBzaXplKTsKKworCXJldHVybiBzaXplOworfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHdyaXRlIHNpemUKKyAqLworaW50CitzbWJfZ2V0X3dzaXplKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKQoreworCS8qIHdyaXRlWCBoYXMgMTQgcGFyYW1ldGVycywgd3JpdGUgaGFzIDUgKi8KKwlpbnQgb3ZlcmhlYWQgPSBTTUJfSEVBREVSX0xFTiArIDE0ICogc2l6ZW9mKF9fdTE2KSArIDIgKyAxICsgMjsKKwlpbnQgc2l6ZSA9IHNtYl9nZXRfeG1pdHNpemUoc2VydmVyLCBvdmVyaGVhZCk7CisKKwlWRVJCT1NFKCJ4bWl0PSVkLCBzaXplPSVkXG4iLCBzZXJ2ZXItPm9wdC5tYXhfeG1pdCwgc2l6ZSk7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworLyoKKyAqIENvbnZlcnQgU01CIGVycm9yIGNvZGVzIHRvIC1FLi4uIGVycm5vIHZhbHVlcy4KKyAqLworaW50CitzbWJfZXJybm8oc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEpCit7CisJaW50IGVycmNscyA9IHJlcS0+cnFfcmNsczsKKwlpbnQgZXJyb3IgID0gcmVxLT5ycV9lcnI7CisJY2hhciAqY2xhc3MgPSAiVW5rbm93biI7CisKKwlWRVJCT1NFKCJlcnJjbHMgJWQgIGNvZGUgJWQgIGZyb20gY29tbWFuZCAweCV4XG4iLAorCQllcnJjbHMsIGVycm9yLCBTTUJfQ01EKHJlcS0+cnFfaGVhZGVyKSk7CisKKwlpZiAoZXJyY2xzID09IEVSUkRPUykgeworCQlzd2l0Y2ggKGVycm9yKSB7CisJCWNhc2UgRVJSYmFkZnVuYzoKKwkJCXJldHVybiAtRUlOVkFMOworCQljYXNlIEVSUmJhZGZpbGU6CisJCWNhc2UgRVJSYmFkcGF0aDoKKwkJCXJldHVybiAtRU5PRU5UOworCQljYXNlIEVSUm5vZmlkczoKKwkJCXJldHVybiAtRU1GSUxFOworCQljYXNlIEVSUm5vYWNjZXNzOgorCQkJcmV0dXJuIC1FQUNDRVM7CisJCWNhc2UgRVJSYmFkZmlkOgorCQkJcmV0dXJuIC1FQkFERjsKKwkJY2FzZSBFUlJiYWRtY2I6CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJY2FzZSBFUlJub21lbToKKwkJCXJldHVybiAtRU5PTUVNOworCQljYXNlIEVSUmJhZG1lbToKKwkJCXJldHVybiAtRUZBVUxUOworCQljYXNlIEVSUmJhZGVudjoKKwkJY2FzZSBFUlJiYWRmb3JtYXQ6CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJY2FzZSBFUlJiYWRhY2Nlc3M6CisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJY2FzZSBFUlJiYWRkYXRhOgorCQkJcmV0dXJuIC1FMkJJRzsKKwkJY2FzZSBFUlJiYWRkcml2ZToKKwkJCXJldHVybiAtRU5YSU87CisJCWNhc2UgRVJScmVtY2Q6CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJY2FzZSBFUlJkaWZmZGV2aWNlOgorCQkJcmV0dXJuIC1FWERFVjsKKwkJY2FzZSBFUlJub2ZpbGVzOgorCQkJcmV0dXJuIC1FTk9FTlQ7CisJCWNhc2UgRVJSYmFkc2hhcmU6CisJCQlyZXR1cm4gLUVUWFRCU1k7CisJCWNhc2UgRVJSbG9jazoKKwkJCXJldHVybiAtRURFQURMSzsKKwkJY2FzZSBFUlJmaWxleGlzdHM6CisJCQlyZXR1cm4gLUVFWElTVDsKKwkJY2FzZSBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUjoKKwkJCXJldHVybiAtRUlOVkFMOworCQljYXNlIEVSUk9SX0RJU0tfRlVMTDoKKwkJCXJldHVybiAtRU5PU1BDOworCQljYXNlIEVSUk9SX0lOVkFMSURfTkFNRToKKwkJCXJldHVybiAtRU5PRU5UOworCQljYXNlIEVSUk9SX0RJUl9OT1RfRU1QVFk6CisJCQlyZXR1cm4gLUVOT1RFTVBUWTsKKwkJY2FzZSBFUlJPUl9OT1RfTE9DS0VEOgorICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0xDSzsKKwkJY2FzZSBFUlJPUl9BTFJFQURZX0VYSVNUUzoKKwkJCXJldHVybiAtRUVYSVNUOworCQlkZWZhdWx0OgorCQkJY2xhc3MgPSAiRVJSRE9TIjsKKwkJCWdvdG8gZXJyX3Vua25vd247CisJCX0KKwl9IGVsc2UgaWYgKGVycmNscyA9PSBFUlJTUlYpIHsKKwkJc3dpdGNoIChlcnJvcikgeworCQkvKiBOLkIuIFRoaXMgaXMgd3JvbmcgLi4uIEVJTyA/ICovCisJCWNhc2UgRVJSZXJyb3I6CisJCQlyZXR1cm4gLUVORklMRTsKKwkJY2FzZSBFUlJiYWRwdzoKKwkJCXJldHVybiAtRUlOVkFMOworCQljYXNlIEVSUmJhZHR5cGU6CisJCWNhc2UgRVJSdGltZW91dDoKKwkJCXJldHVybiAtRUlPOworCQljYXNlIEVSUmFjY2VzczoKKwkJCXJldHVybiAtRUFDQ0VTOworCQkvKgorCQkgKiBUaGlzIGlzIGEgZmF0YWwgZXJyb3IsIGFzIGl0IG1lYW5zIHRoZSAidHJlZSBJRCIKKwkJICogZm9yIHRoaXMgY29ubmVjdGlvbiBpcyBubyBsb25nZXIgdmFsaWQuIFdlIG1hcAorCQkgKiB0byBhIHNwZWNpYWwgZXJyb3IgY29kZSBhbmQgZ2V0IGEgbmV3IGNvbm5lY3Rpb24uCisJCSAqLworCQljYXNlIEVSUmludm5pZDoKKwkJCXJldHVybiAtRUJBRFNMVDsKKwkJZGVmYXVsdDoKKwkJCWNsYXNzID0gIkVSUlNSViI7CisJCQlnb3RvIGVycl91bmtub3duOworCQl9CisJfSBlbHNlIGlmIChlcnJjbHMgPT0gRVJSSFJEKSB7CisJCXN3aXRjaCAoZXJyb3IpIHsKKwkJY2FzZSBFUlJub3dyaXRlOgorCQkJcmV0dXJuIC1FUk9GUzsKKwkJY2FzZSBFUlJiYWR1bml0OgorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWNhc2UgRVJSbm90cmVhZHk6CisJCQlyZXR1cm4gLUVVQ0xFQU47CisJCWNhc2UgRVJSYmFkY21kOgorCQljYXNlIEVSUmRhdGE6CisJCQlyZXR1cm4gLUVJTzsKKwkJY2FzZSBFUlJiYWRyZXE6CisJCQlyZXR1cm4gLUVSQU5HRTsKKwkJY2FzZSBFUlJiYWRzaGFyZToKKwkJCXJldHVybiAtRVRYVEJTWTsKKwkJY2FzZSBFUlJsb2NrOgorCQkJcmV0dXJuIC1FREVBRExLOworCQljYXNlIEVSUmRpc2tmdWxsOgorCQkJcmV0dXJuIC1FTk9TUEM7CisJCWRlZmF1bHQ6CisJCQljbGFzcyA9ICJFUlJIUkQiOworCQkJZ290byBlcnJfdW5rbm93bjsKKwkJfQorCX0gZWxzZSBpZiAoZXJyY2xzID09IEVSUkNNRCkgeworCQljbGFzcyA9ICJFUlJDTUQiOworCX0gZWxzZSBpZiAoZXJyY2xzID09IFNVQ0NFU1MpIHsKKwkJcmV0dXJuIDA7CS8qIFRoaXMgaXMgdGhlIG9ubHkgdmFsaWQgMCByZXR1cm4gKi8KKwl9CisKK2Vycl91bmtub3duOgorCXByaW50ayhLRVJOX0VSUiAic21iX2Vycm5vOiBjbGFzcyAlcywgY29kZSAlZCBmcm9tIGNvbW1hbmQgMHgleFxuIiwKKwkgICAgICAgY2xhc3MsIGVycm9yLCBTTUJfQ01EKHJlcS0+cnFfaGVhZGVyKSk7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qIHNtYl9yZXF1ZXN0X29rOiBXZSBleHBlY3QgdGhlIHNlcnZlciB0byBiZSBsb2NrZWQuIFRoZW4gd2UgZG8gdGhlCisgICByZXF1ZXN0IGFuZCBjaGVjayB0aGUgYW5zd2VyIGNvbXBsZXRlbHkuIFdoZW4gc21iX3JlcXVlc3Rfb2sKKyAgIHJldHVybnMgMCwgeW91IGNhbiBiZSBxdWl0ZSBzdXJlIHRoYXQgZXZlcnl0aGluZyB3ZW50IHdlbGwuIFdoZW4KKyAgIHRoZSBhbnN3ZXIgaXMgPD0wLCB0aGUgcmV0dXJuZWQgbnVtYmVyIGlzIGEgdmFsaWQgdW5peCBlcnJuby4gKi8KKworc3RhdGljIGludAorc21iX3JlcXVlc3Rfb2soc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEsIGludCBjb21tYW5kLCBpbnQgd2N0LCBpbnQgYmNjKQoreworCWludCByZXN1bHQ7CisKKwlyZXEtPnJxX3Jlc3Bfd2N0ID0gd2N0OworCXJlcS0+cnFfcmVzcF9iY2MgPSBiY2M7CisKKwlyZXN1bHQgPSBzbWJfYWRkX3JlcXVlc3QocmVxKTsKKwlpZiAocmVzdWx0ICE9IDApIHsKKwkJREVCVUcxKCJzbWJfcmVxdWVzdCBmYWlsZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoc21iX3ZhbGlkX3BhY2tldChyZXEtPnJxX2hlYWRlcikgIT0gMCkgeworCQlQQVJBTk9JQSgiaW52YWxpZCBwYWNrZXQhXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmVzdWx0ID0gc21iX3ZlcmlmeShyZXEtPnJxX2hlYWRlciwgY29tbWFuZCwgd2N0LCBiY2MpOworCitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFRoaXMgaW1wbGVtZW50cyB0aGUgTkVXQ09OTiBpb2N0bC4gSXQgaW5zdGFsbHMgdGhlIHNlcnZlciBwaWQsCisgKiBzZXRzIHNlcnZlci0+c3RhdGUgdG8gQ09OTl9WQUxJRCwgYW5kIHdha2VzIHVwIHRoZSB3YWl0aW5nIHByb2Nlc3MuCisgKi8KK2ludAorc21iX25ld2Nvbm4oc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHN0cnVjdCBzbWJfY29ubl9vcHQgKm9wdCkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlscDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJaW50IGVycm9yOworCisJVkVSQk9TRSgiZmQ9JWQsIHBpZD0lZFxuIiwgb3B0LT5mZCwgY3VycmVudC0+cGlkKTsKKworCXNtYl9sb2NrX3NlcnZlcihzZXJ2ZXIpOworCisJLyoKKwkgKiBNYWtlIHN1cmUgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGEgdmFsaWQgY29ubmVjdGlvbiAuLi4KKwkgKi8KKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKHNlcnZlci0+c3RhdGUgPT0gQ09OTl9WQUxJRCkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IC1FQUNDRVM7CisJaWYgKGN1cnJlbnQtPnVpZCAhPSBzZXJ2ZXItPm1udC0+bW91bnRlZF91aWQgJiYgCisJICAgICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gLUVCQURGOworCWZpbHAgPSBmZ2V0KG9wdC0+ZmQpOworCWlmICghZmlscCkKKwkJZ290byBvdXQ7CisJaWYgKCFzbWJfdmFsaWRfc29ja2V0KGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKSkKKwkJZ290byBvdXRfcHV0ZjsKKworCXNlcnZlci0+c29ja19maWxlID0gZmlscDsKKwlzZXJ2ZXItPmNvbm5fcGlkID0gY3VycmVudC0+cGlkOworCXNlcnZlci0+b3B0ID0gKm9wdDsKKwlzZXJ2ZXItPmdlbmVyYXRpb24gKz0gMTsKKwlzZXJ2ZXItPnN0YXRlID0gQ09OTl9WQUxJRDsKKwllcnJvciA9IDA7CisKKwlpZiAoc2VydmVyLT5jb25uX2Vycm9yKSB7CisJCS8qCisJCSAqIGNvbm5fZXJyb3IgaXMgdGhlIHJldHVybmNvZGUgd2Ugb3JpZ2luYWxseSBkZWNpZGVkIHRvCisJCSAqIGRyb3AgdGhlIG9sZCBjb25uZWN0aW9uIG9uLiBUaGlzIG1lc3NhZ2Ugc2hvdWxkIGJlIHBvc2l0aXZlCisJCSAqIGFuZCBub3QgbWFrZSBwZW9wbGUgYXNrIHF1ZXN0aW9ucyBvbiB3aHkgc21iZnMgaXMgcHJpbnRpbmcKKwkJICogZXJyb3IgbWVzc2FnZXMgLi4uCisJCSAqLworCQlwcmludGsoS0VSTl9JTkZPICJTTUIgY29ubmVjdGlvbiByZS1lc3RhYmxpc2hlZCAoJWQpXG4iLAorCQkgICAgICAgc2VydmVyLT5jb25uX2Vycm9yKTsKKwkJc2VydmVyLT5jb25uX2Vycm9yID0gMDsKKwl9CisKKwkvKgorCSAqIFN0b3JlIHRoZSBzZXJ2ZXIgaW4gc29jayB1c2VyX2RhdGEgKE9ubHkgdXNlZCBieSBzdW5ycGMpCisJICovCisJc2sgPSBTT0NLRVRfSShmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSktPnNrOworCXNrLT5za191c2VyX2RhdGEgPSBzZXJ2ZXI7CisKKwkvKiBjaGFpbiBpbnRvIHRoZSBkYXRhX3JlYWR5IGNhbGxiYWNrICovCisJc2VydmVyLT5kYXRhX3JlYWR5ID0geGNoZygmc2stPnNrX2RhdGFfcmVhZHksIHNtYl9kYXRhX3JlYWR5KTsKKworCS8qIGNoZWNrIGlmIHdlIGhhdmUgYW4gb2xkIHNtYm1vdW50IHRoYXQgdXNlcyBzZWNvbmRzIGZvciB0aGUgCisJICAgc2VydmVyem9uZSAqLworCWlmIChzZXJ2ZXItPm9wdC5zZXJ2ZXJ6b25lID4gMTIqNjAgfHwgc2VydmVyLT5vcHQuc2VydmVyem9uZSA8IC0xMio2MCkKKwkJc2VydmVyLT5vcHQuc2VydmVyem9uZSAvPSA2MDsKKworCS8qIG5vdyB0aGF0IHdlIGhhdmUgYW4gZXN0YWJsaXNoZWQgY29ubmVjdGlvbiB3ZSBjYW4gZGV0ZWN0IHRoZSBzZXJ2ZXIKKwkgICB0eXBlIGFuZCBlbmFibGUgYnVnIHdvcmthcm91bmRzICovCisJaWYgKHNlcnZlci0+b3B0LnByb3RvY29sIDwgU01CX1BST1RPQ09MX0xBTk1BTjIpCisJCWluc3RhbGxfb3BzKHNlcnZlci0+b3BzLCAmc21iX29wc19jb3JlKTsKKwllbHNlIGlmIChzZXJ2ZXItPm9wdC5wcm90b2NvbCA9PSBTTUJfUFJPVE9DT0xfTEFOTUFOMikKKwkJaW5zdGFsbF9vcHMoc2VydmVyLT5vcHMsICZzbWJfb3BzX29zMik7CisJZWxzZSBpZiAoc2VydmVyLT5vcHQucHJvdG9jb2wgPT0gU01CX1BST1RPQ09MX05UMSAmJgorCQkgKHNlcnZlci0+b3B0Lm1heF94bWl0IDwgMHgxMDAwKSAmJgorCQkgIShzZXJ2ZXItPm9wdC5jYXBhYmlsaXRpZXMgJiBTTUJfQ0FQX05UX1NNQlMpKSB7CisJCS8qIEZJWE1FOiBjYW4gd2Uga2lsbCB0aGUgV0lOOTUgZmxhZyBub3c/ICovCisJCXNlcnZlci0+bW50LT5mbGFncyB8PSBTTUJfTU9VTlRfV0lOOTU7CisJCVZFUkJPU0UoImRldGVjdGVkIFdJTjk1IHNlcnZlclxuIik7CisJCWluc3RhbGxfb3BzKHNlcnZlci0+b3BzLCAmc21iX29wc193aW45NSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU2FtYmEgaGFzIG1heF94bWl0IDY1NTM1CisJCSAqIE5UNHNwWCBoYXMgbWF4X3htaXQgNDUzNiAob3Igc29tZXRoaW5nIGxpa2UgdGhhdCkKKwkJICogd2luMmsgaGFzIC4uLgorCQkgKi8KKwkJVkVSQk9TRSgiZGV0ZWN0ZWQgTlQxIChTYW1iYSwgTlQ0LzUpIHNlcnZlclxuIik7CisJCWluc3RhbGxfb3BzKHNlcnZlci0+b3BzLCAmc21iX29wc193aW5OVCk7CisJfQorCisJLyogRklYTUU6IHRoZSB3aW45eCBjb2RlIHdhbnRzIHRvIG1vZGlmeSB0aGVzZSAuLi4gKHNlZWsvdHJ1bmMgYnVnKSAqLworCWlmIChzZXJ2ZXItPm1udC0+ZmxhZ3MgJiBTTUJfTU9VTlRfT0xEQVRUUikgeworCQlzZXJ2ZXItPm9wcy0+Z2V0YXR0ciA9IHNtYl9wcm9jX2dldGF0dHJfY29yZTsKKwl9IGVsc2UgaWYgKHNlcnZlci0+bW50LT5mbGFncyAmIFNNQl9NT1VOVF9ESVJBVFRSKSB7CisJCXNlcnZlci0+b3BzLT5nZXRhdHRyID0gc21iX3Byb2NfZ2V0YXR0cl9mZjsKKwl9CisKKwkvKiBEZWNvZGUgc2VydmVyIGNhcGFiaWxpdGllcyAqLworCWlmIChzZXJ2ZXItPm9wdC5jYXBhYmlsaXRpZXMgJiBTTUJfQ0FQX0xBUkdFX0ZJTEVTKSB7CisJCS8qIFNob3VsZCBiZSBvayB0byBzZXQgdGhpcyBub3csIGFzIG5vIG9uZSBjYW4gYWNjZXNzIHRoZQorCQkgICBtb3VudCB1bnRpbCB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBlc3RhYmxpc2hlZC4gKi8KKwkJU0Jfb2Yoc2VydmVyKS0+c19tYXhieXRlcyA9IH4wVUxMID4+IDE7CisJCVZFUkJPU0UoIkxGUyBlbmFibGVkXG4iKTsKKwl9CisJaWYgKHNlcnZlci0+b3B0LmNhcGFiaWxpdGllcyAmIFNNQl9DQVBfVU5JQ09ERSkgeworCQlzZXJ2ZXItPm1udC0+ZmxhZ3MgfD0gU01CX01PVU5UX1VOSUNPREU7CisJCVZFUkJPU0UoIlVuaWNvZGUgZW5hYmxlZFxuIik7CisJfSBlbHNlIHsKKwkJc2VydmVyLT5tbnQtPmZsYWdzICY9IH5TTUJfTU9VTlRfVU5JQ09ERTsKKwl9CisjaWYgMAorCS8qIGZsYWdzIHdlIG1heSB0ZXN0IGZvciBvdGhlciBwYXRjaGVzIC4uLiAqLworCWlmIChzZXJ2ZXItPm9wdC5jYXBhYmlsaXRpZXMgJiBTTUJfQ0FQX0xBUkdFX1JFQURYKSB7CisJCVZFUkJPU0UoIkxhcmdlIHJlYWRzIGVuYWJsZWRcbiIpOworCX0KKwlpZiAoc2VydmVyLT5vcHQuY2FwYWJpbGl0aWVzICYgU01CX0NBUF9MQVJHRV9XUklURVgpIHsKKwkJVkVSQk9TRSgiTGFyZ2Ugd3JpdGVzIGVuYWJsZWRcbiIpOworCX0KKyNlbmRpZgorCWlmIChzZXJ2ZXItPm9wdC5jYXBhYmlsaXRpZXMgJiBTTUJfQ0FQX1VOSVgpIHsKKwkJc3RydWN0IGlub2RlICppbm9kZTsKKwkJVkVSQk9TRSgiVXNpbmcgVU5JWCBDSUZTIGV4dGVuc2lvbnNcbiIpOworCQlpbnN0YWxsX29wcyhzZXJ2ZXItPm9wcywgJnNtYl9vcHNfdW5peCk7CisJCWlub2RlID0gU0Jfb2Yoc2VydmVyKS0+c19yb290LT5kX2lub2RlOworCQlpZiAoaW5vZGUpCisJCQlpbm9kZS0+aV9vcCA9ICZzbWJfZGlyX2lub2RlX29wZXJhdGlvbnNfdW5peDsKKwl9CisKKwlWRVJCT1NFKCJwcm90b2NvbD0lZCwgbWF4X3htaXQ9JWQsIHBpZD0lZCBjYXBhYmlsaXRpZXM9MHgleFxuIiwKKwkJc2VydmVyLT5vcHQucHJvdG9jb2wsIHNlcnZlci0+b3B0Lm1heF94bWl0LCBzZXJ2ZXItPmNvbm5fcGlkLAorCQlzZXJ2ZXItPm9wdC5jYXBhYmlsaXRpZXMpOworCisJLyogRklYTUU6IHRoaXMgcmVhbGx5IHNob3VsZCBiZSBkb25lIGJ5IHNtYm1vdW50LiAqLworCWlmIChzZXJ2ZXItPm9wdC5tYXhfeG1pdCA+IFNNQl9NQVhfUEFDS0VUX1NJWkUpIHsKKwkJc2VydmVyLT5vcHQubWF4X3htaXQgPSBTTUJfTUFYX1BBQ0tFVF9TSVpFOworCX0KKworCXNtYl91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJc21iaW9kX3dha2VfdXAoKTsKKwlpZiAoc2VydmVyLT5vcHQuY2FwYWJpbGl0aWVzICYgU01CX0NBUF9VTklYKQorCQlzbWJfcHJvY19xdWVyeV9jaWZzdW5peChzZXJ2ZXIpOworCisJc2VydmVyLT5jb25uX2NvbXBsZXRlKys7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmc2VydmVyLT5jb25uX3dxKTsKKwlyZXR1cm4gZXJyb3I7CisKK291dDoKKwlzbWJfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCXNtYmlvZF93YWtlX3VwKCk7CisJcmV0dXJuIGVycm9yOworCitvdXRfcHV0ZjoKKwlmcHV0KGZpbHApOworCWdvdG8gb3V0OworfQorCisvKiBzbWJfc2V0dXBfaGVhZGVyOiBXZSBjb21wbGV0ZWx5IHNldCB1cCB0aGUgcGFja2V0LiBZb3Ugb25seSBoYXZlIHRvCisgICBpbnNlcnQgdGhlIGNvbW1hbmQtc3BlY2lmaWMgZmllbGRzICovCisKK19fdTggKgorc21iX3NldHVwX2hlYWRlcihzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSwgX191OCBjb21tYW5kLCBfX3UxNiB3Y3QsIF9fdTE2IGJjYykKK3sKKwlfX3UzMiB4bWl0X2xlbiA9IFNNQl9IRUFERVJfTEVOICsgd2N0ICogc2l6ZW9mKF9fdTE2KSArIGJjYyArIDI7CisJX191OCAqcCA9IHJlcS0+cnFfaGVhZGVyOworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gcmVxLT5ycV9zZXJ2ZXI7CisKKwlwID0gc21iX2VuY29kZV9zbWJfbGVuZ3RoKHAsIHhtaXRfbGVuIC0gNCk7CisKKwkqcCsrID0gMHhmZjsKKwkqcCsrID0gJ1MnOworCSpwKysgPSAnTSc7CisJKnArKyA9ICdCJzsKKwkqcCsrID0gY29tbWFuZDsKKworCW1lbXNldChwLCAnXDAnLCAxOSk7CisJcCArPSAxOTsKKwlwICs9IDg7CisKKwlpZiAoc2VydmVyLT5vcHQucHJvdG9jb2wgPiBTTUJfUFJPVE9DT0xfQ09SRSkgeworCQlpbnQgZmxhZ3MgPSBTTUJfRkxBR1NfQ0FTRUxFU1NfUEFUSE5BTUVTOworCQlpbnQgZmxhZ3MyID0gU01CX0ZMQUdTMl9MT05HX1BBVEhfQ09NUE9ORU5UUyB8CisJCQlTTUJfRkxBR1MyX0VYVEVOREVEX0FUVFJJQlVURVM7CS8qIEVBPyBub3QgcmVhbGx5IC4uLiAqLworCisJCSoocmVxLT5ycV9oZWFkZXIgKyBzbWJfZmxnKSA9IGZsYWdzOworCQlpZiAoc2VydmVyLT5tbnQtPmZsYWdzICYgU01CX01PVU5UX1VOSUNPREUpCisJCQlmbGFnczIgfD0gU01CX0ZMQUdTMl9VTklDT0RFX1NUUklOR1M7CisJCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl9mbGcyLCBmbGFnczIpOworCX0KKwkqcCsrID0gd2N0OwkJLyogd2N0ICovCisJcCArPSAyICogd2N0OworCVdTRVQocCwgMCwgYmNjKTsKKworCS8qIEluY2x1ZGUgdGhlIGhlYWRlciBpbiB0aGUgZGF0YSB0byBzZW5kICovCisJcmVxLT5ycV9pb3ZsZW4gPSAxOworCXJlcS0+cnFfaW92WzBdLmlvdl9iYXNlID0gcmVxLT5ycV9oZWFkZXI7CisJcmVxLT5ycV9pb3ZbMF0uaW92X2xlbiAgPSB4bWl0X2xlbiAtIGJjYzsKKworCXJldHVybiByZXEtPnJxX2J1ZmZlcjsKK30KKworc3RhdGljIHZvaWQKK3NtYl9zZXR1cF9iY2Moc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEsIF9fdTggKnApCit7CisJdTE2IGJjYyA9IHAgLSByZXEtPnJxX2J1ZmZlcjsKKwl1OCAqcGJjYyA9IHJlcS0+cnFfaGVhZGVyICsgU01CX0hFQURFUl9MRU4gKyAyKlNNQl9XQ1QocmVxLT5ycV9oZWFkZXIpOworCisJV1NFVChwYmNjLCAwLCBiY2MpOworCisJc21iX2VuY29kZV9zbWJfbGVuZ3RoKHJlcS0+cnFfaGVhZGVyLCBTTUJfSEVBREVSX0xFTiArIAorCQkJICAgICAgMipTTUJfV0NUKHJlcS0+cnFfaGVhZGVyKSAtIDIgKyBiY2MpOworCisJLyogSW5jbHVkZSB0aGUgImJ5dGVzIiBpbiB0aGUgZGF0YSB0byBzZW5kICovCisJcmVxLT5ycV9pb3ZsZW4gPSAyOworCXJlcS0+cnFfaW92WzFdLmlvdl9iYXNlID0gcmVxLT5ycV9idWZmZXI7CisJcmVxLT5ycV9pb3ZbMV0uaW92X2xlbiAgPSBiY2M7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl9wcm9jX3NlZWsoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIF9fdTE2IGZpbGVpZCwKKwkgICAgICBfX3UxNiBtb2RlLCBvZmZfdCBvZmZzZXQpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgMCkpKQorCQlnb3RvIG91dDsKKworCXNtYl9zZXR1cF9oZWFkZXIocmVxLCBTTUJsc2VlaywgNCwgMCk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djAsIGZpbGVpZCk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djEsIG1vZGUpOworCURTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YyLCBvZmZzZXQpOworCXJlcS0+cnFfZmxhZ3MgfD0gU01CX1JFUV9OT1JFVFJZOworCisJcmVzdWx0ID0gc21iX3JlcXVlc3Rfb2socmVxLCBTTUJsc2VlaywgMiwgMCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcmVzdWx0ID0gMDsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlyZXN1bHQgPSBEVkFMKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MCk7CitvdXRfZnJlZToKKwlzbWJfcnB1dChyZXEpOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl9wcm9jX29wZW4oc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IHdpc2gpCit7CisJc3RydWN0IGlub2RlICppbm8gPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHNtYl9pbm9kZV9pbmZvICplaSA9IFNNQl9JKGlubyk7CisJaW50IG1vZGUsIHJlYWRfd3JpdGUgPSAweDQyLCByZWFkX29ubHkgPSAweDQwOworCWludCByZXM7CisJY2hhciAqcDsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKworCS8qCisJICogQXR0ZW1wdCB0byBvcGVuIHIvdywgdW5sZXNzIHRoZXJlIGFyZSBubyB3cml0ZSBwcml2aWxlZ2VzLgorCSAqLworCW1vZGUgPSByZWFkX3dyaXRlOworCWlmICghKGluby0+aV9tb2RlICYgKFNfSVdVU1IgfCBTX0lXR1JQIHwgU19JV09USCkpKQorCQltb2RlID0gcmVhZF9vbmx5OworI2lmIDAKKwkvKiBGSVhNRTogd2h5IGlzIHRoaXMgY29kZSBub3QgaW4/IGJlbG93IHdlIGZpeCBpdCBzbyB0aGF0IGEgY2FsbGVyCisJICAgd2FudGluZyBSTyBkb2Vzbid0IGdldCBSVy4gc21iX3JldmFsaWRhdGVfaW5vZGUgZG9lcyBzb21lIAorCSAgIG9wdGltaXphdGlvbiBiYXNlZCBvbiBhY2Nlc3MgbW9kZS4gdGFpbCAtZiBuZWVkcyBpdCB0byBiZSBjb3JyZWN0LgorCisJICAgV2UgbXVzdCBvcGVuIHJ3IHNpbmNlIHdlIGRvbid0IGRvIHRoZSBvcGVuIGlmIGNhbGxlZCBhIHNlY29uZCB0aW1lCisJICAgd2l0aCBkaWZmZXJlbnQgJ3dpc2gnLiBJcyB0aGF0IG5vdCBzdXBwb3J0ZWQgYnkgc21iIHNlcnZlcnM/ICovCisJaWYgKCEod2lzaCAmIChPX1dST05MWSB8IE9fUkRXUikpKQorCQltb2RlID0gcmVhZF9vbmx5OworI2VuZGlmCisKKwlyZXMgPSAtRU5PTUVNOworCWlmICghIChyZXEgPSBzbWJfYWxsb2NfcmVxdWVzdChzZXJ2ZXIsIFBBR0VfU0laRSkpKQorCQlnb3RvIG91dDsKKworICAgICAgcmV0cnk6CisJcCA9IHNtYl9zZXR1cF9oZWFkZXIocmVxLCBTTUJvcGVuLCAyLCAwKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MCwgbW9kZSk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djEsIGFTWVNURU0gfCBhSElEREVOIHwgYURJUik7CisJcmVzID0gc21iX3NpbXBsZV9lbmNvZGVfcGF0aChyZXEsICZwLCBkZW50cnksIE5VTEwpOworCWlmIChyZXMgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCXNtYl9zZXR1cF9iY2MocmVxLCBwKTsKKworCXJlcyA9IHNtYl9yZXF1ZXN0X29rKHJlcSwgU01Cb3BlbiwgNywgMCk7CisJaWYgKHJlcyAhPSAwKSB7CisJCWlmIChtb2RlID09IHJlYWRfd3JpdGUgJiYKKwkJICAgIChyZXMgPT0gLUVBQ0NFUyB8fCByZXMgPT0gLUVUWFRCU1kgfHwgcmVzID09IC1FUk9GUykpCisJCXsKKwkJCVZFUkJPU0UoIiVzLyVzIFIvVyBmYWlsZWQsIGVycm9yPSVkLCByZXRyeWluZyBSL09cbiIsCisJCQkJREVOVFJZX1BBVEgoZGVudHJ5KSwgcmVzKTsKKwkJCW1vZGUgPSByZWFkX29ubHk7CisJCQlyZXEtPnJxX2ZsYWdzID0gMDsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwkJZ290byBvdXRfZnJlZTsKKwl9CisJLyogV2Ugc2hvdWxkIG5vdyBoYXZlIGRhdGEgaW4gdnd2WzAuLjZdLiAqLworCisJZWktPmZpbGVpZCA9IFdWQUwocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YwKTsKKwllaS0+YXR0ciAgID0gV1ZBTChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djEpOworCS8qIHNtYl92d3YyIGhhcyBtdGltZSAqLworCS8qIHNtYl92d3Y0IGhhcyBzaXplICAqLworCWVpLT5hY2Nlc3MgPSAoV1ZBTChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djYpICYgU01CX0FDQ01BU0spOworCWVpLT5vcGVuID0gc2VydmVyLT5nZW5lcmF0aW9uOworCitvdXRfZnJlZToKKwlzbWJfcnB1dChyZXEpOworb3V0OgorCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBNYWtlIHN1cmUgdGhlIGZpbGUgaXMgb3BlbiwgYW5kIGNoZWNrIHRoYXQgdGhlIGFjY2VzcworICogaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBkZXNpcmVkIGFjY2Vzcy4KKyAqLworaW50CitzbWJfb3BlbihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCB3aXNoKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IHJlc3VsdDsKKwlfX3UxNiBhY2Nlc3M7CisKKwlyZXN1bHQgPSAtRU5PRU5UOworCWlmICghaW5vZGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzbWJfb3Blbjogbm8gaW5vZGUgZm9yIGRlbnRyeSAlcy8lc1xuIiwKKwkJICAgICAgIERFTlRSWV9QQVRIKGRlbnRyeSkpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXNtYl9pc19vcGVuKGlub2RlKSkgeworCQlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2lub2RlKGlub2RlKTsKKwkJcmVzdWx0ID0gMDsKKwkJaWYgKCFzbWJfaXNfb3Blbihpbm9kZSkpCisJCQlyZXN1bHQgPSBzbWJfcHJvY19vcGVuKHNlcnZlciwgZGVudHJ5LCB3aXNoKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWdvdG8gb3V0OworCQkvKgorCQkgKiBBIHN1Y2Nlc3NmdWwgb3BlbiBtZWFucyB0aGUgcGF0aCBpcyBzdGlsbCB2YWxpZCAuLi4KKwkJICovCisJCXNtYl9yZW5ld190aW1lcyhkZW50cnkpOworCX0KKworCS8qCisJICogQ2hlY2sgd2hldGhlciB0aGUgYWNjZXNzIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZGVzaXJlZCBtb2RlLgorCSAqLworCXJlc3VsdCA9IDA7CisJYWNjZXNzID0gU01CX0koaW5vZGUpLT5hY2Nlc3M7CisJaWYgKGFjY2VzcyAhPSB3aXNoICYmIGFjY2VzcyAhPSBTTUJfT19SRFdSKSB7CisJCVBBUkFOT0lBKCIlcy8lcyBhY2Nlc3MgZGVuaWVkLCBhY2Nlc3M9JXgsIHdpc2g9JXhcbiIsCisJCQkgREVOVFJZX1BBVEgoZGVudHJ5KSwgYWNjZXNzLCB3aXNoKTsKKwkJcmVzdWx0ID0gLUVBQ0NFUzsKKwl9CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCAKK3NtYl9wcm9jX2Nsb3NlKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBfX3UxNiBmaWxlaWQsIF9fdTMyIG10aW1lKQoreworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCWludCByZXN1bHQgPSAtRU5PTUVNOworCisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgMCkpKQorCQlnb3RvIG91dDsKKworCXNtYl9zZXR1cF9oZWFkZXIocmVxLCBTTUJjbG9zZSwgMywgMCk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djAsIGZpbGVpZCk7CisJRFNFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djEsIHV0YzJsb2NhbChzZXJ2ZXIsIG10aW1lKSk7CisJcmVxLT5ycV9mbGFncyB8PSBTTUJfUkVRX05PUkVUUlk7CisJcmVzdWx0ID0gc21iX3JlcXVlc3Rfb2socmVxLCBTTUJjbG9zZSwgMCwgMCk7CisKKwlzbWJfcnB1dChyZXEpOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBXaW4gTlQgNC4wIGhhcyBhbiBhcHBhcmVudCBidWcgaW4gdGhhdCBpdCBmYWlscyB0byB1cGRhdGUgdGhlCisgKiBtb2RpZnkgdGltZSB3aGVuIHdyaXRpbmcgdG8gYSBmaWxlLiBBcyBhIHdvcmthcm91bmQsIHdlIHVwZGF0ZQorICogYm90aCBtb2RpZnkgYW5kIGFjY2VzcyB0aW1lIGxvY2FsbHksIGFuZCBwb3N0IHRoZSB0aW1lcyB0byB0aGUKKyAqIHNlcnZlciB3aGVuIGNsb3NpbmcgdGhlIGZpbGUuCisgKi8KK3N0YXRpYyBpbnQgCitzbWJfcHJvY19jbG9zZV9pbm9kZShzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IGlub2RlICogaW5vKQoreworCXN0cnVjdCBzbWJfaW5vZGVfaW5mbyAqZWkgPSBTTUJfSShpbm8pOworCWludCByZXN1bHQgPSAwOworCWlmIChzbWJfaXNfb3Blbihpbm8pKQorCXsKKwkJLyoKKwkJICogV2UgY2xlYXIgdGhlIG9wZW4gZmxhZyBpbiBhZHZhbmNlLCBpbiBjYXNlIGFub3RoZXIKKyAJCSAqIHByb2Nlc3Mgb2JzZXJ2ZXMgdGhlIHZhbHVlIHdoaWxlIHdlIGJsb2NrIGJlbG93LgorCQkgKi8KKwkJZWktPm9wZW4gPSAwOworCisJCS8qCisJCSAqIEtsdWRnZSBhbGVydDogU01CIHRpbWVzdGFtcHMgYXJlIGFjY3VyYXRlIG9ubHkgdG8KKwkJICogdHdvIHNlY29uZHMgLi4uIHJvdW5kIHRoZSB0aW1lcyB0byBhdm9pZCBuZWVkbGVzcworCQkgKiBjYWNoZSBpbnZhbGlkYXRpb25zIQorCQkgKi8KKwkJaWYgKGluby0+aV9tdGltZS50dl9zZWMgJiAxKSB7IAorCQkJaW5vLT5pX210aW1lLnR2X3NlYy0tOworCQkJaW5vLT5pX210aW1lLnR2X25zZWMgPSAwOyAKKwkJfQorCQlpZiAoaW5vLT5pX2F0aW1lLnR2X3NlYyAmIDEpIHsKKwkJCWluby0+aV9hdGltZS50dl9zZWMtLTsKKwkJCWluby0+aV9hdGltZS50dl9uc2VjID0gMDsKKwkJfQorCQkvKgorCQkgKiBJZiB0aGUgZmlsZSBpcyBvcGVuIHdpdGggd3JpdGUgcGVybWlzc2lvbnMsCisJCSAqIHVwZGF0ZSB0aGUgdGltZSBzdGFtcHMgdG8gc3luYyBtdGltZSBhbmQgYXRpbWUuCisJCSAqLworCQlpZiAoKHNlcnZlci0+b3B0LmNhcGFiaWxpdGllcyAmIFNNQl9DQVBfVU5JWCkgPT0gMCAmJgorCQkgICAgKHNlcnZlci0+b3B0LnByb3RvY29sID49IFNNQl9QUk9UT0NPTF9MQU5NQU4yKSAmJgorCQkgICAgIShlaS0+YWNjZXNzID09IFNNQl9PX1JET05MWSkpCisJCXsKKwkJCXN0cnVjdCBzbWJfZmF0dHIgZmF0dHI7CisJCQlzbWJfZ2V0X2lub2RlX2F0dHIoaW5vLCAmZmF0dHIpOworCQkJc21iX3Byb2Nfc2V0YXR0cl9leHQoc2VydmVyLCBpbm8sICZmYXR0cik7CisJCX0KKworCQlyZXN1bHQgPSBzbWJfcHJvY19jbG9zZShzZXJ2ZXIsIGVpLT5maWxlaWQsIGluby0+aV9tdGltZS50dl9zZWMpOworCQkvKgorCQkgKiBGb3JjZSBhIHJldmFsaWRhdGlvbiBhZnRlciBjbG9zaW5nIC4uLiBzb21lIHNlcnZlcnMKKwkJICogZG9uJ3QgcG9zdCB0aGUgc2l6ZSB1bnRpbCB0aGUgZmlsZSBoYXMgYmVlbiBjbG9zZWQuCisJCSAqLworCQlpZiAoc2VydmVyLT5vcHQucHJvdG9jb2wgPCBTTUJfUFJPVE9DT0xfTlQxKQorCQkJZWktPm9sZG10aW1lID0gMDsKKwkJZWktPmNsb3NlZCA9IGppZmZpZXM7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK2ludAorc21iX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vKQoreworCWludCByZXN1bHQgPSAwOworCisJaWYgKHNtYl9pc19vcGVuKGlubykpIHsKKwkJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9pbm9kZShpbm8pOworCQlyZXN1bHQgPSBzbWJfcHJvY19jbG9zZV9pbm9kZShzZXJ2ZXIsIGlubyk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBUaGlzIGlzIHVzZWQgdG8gY2xvc2UgYSBmaWxlIGZvbGxvd2luZyBhIGZhaWxlZCBpbnN0YW50aWF0ZS4KKyAqIFNpbmNlIHdlIGRvbid0IGhhdmUgYW4gaW5vZGUsIHdlIGNhbid0IHVzZSBhbnkgb2YgdGhlIGFib3ZlLgorICovCitpbnQKK3NtYl9jbG9zZV9maWxlaWQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBfX3UxNiBmaWxlaWQpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkoZGVudHJ5KTsKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gc21iX3Byb2NfY2xvc2Uoc2VydmVyLCBmaWxlaWQsIGdldF9zZWNvbmRzKCkpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIEluIHNtYl9wcm9jX3JlYWQgYW5kIHNtYl9wcm9jX3dyaXRlIHdlIGRvIG5vdCByZXRyeSwgYmVjYXVzZSB0aGUKKyAgIGZpbGUtaWQgd291bGQgbm90IGJlIHZhbGlkIGFmdGVyIGEgcmVjb25uZWN0aW9uLiAqLworCitzdGF0aWMgdm9pZAorc21iX3Byb2NfcmVhZF9kYXRhKHN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxKQoreworCXJlcS0+cnFfaW92WzBdLmlvdl9iYXNlID0gcmVxLT5ycV9idWZmZXI7CisJcmVxLT5ycV9pb3ZbMF0uaW92X2xlbiAgPSAzOworCisJcmVxLT5ycV9pb3ZbMV0uaW92X2Jhc2UgPSByZXEtPnJxX3BhZ2U7CisJcmVxLT5ycV9pb3ZbMV0uaW92X2xlbiAgPSByZXEtPnJxX3JzaXplOworCXJlcS0+cnFfaW92bGVuID0gMjsKKworCXJlcS0+cnFfcmxlbiA9IHNtYl9sZW4ocmVxLT5ycV9oZWFkZXIpICsgNCAtIHJlcS0+cnFfYnl0ZXNfcmVjdmQ7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl9wcm9jX3JlYWQoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwgaW50IGNvdW50LCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21faW5vZGUoaW5vZGUpOworCV9fdTE2IHJldHVybmVkX2NvdW50LCBkYXRhX2xlbjsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKwl1OCByYnVmWzRdOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpZiAoISAocmVxID0gc21iX2FsbG9jX3JlcXVlc3Qoc2VydmVyLCAwKSkpCisJCWdvdG8gb3V0OworCisJc21iX3NldHVwX2hlYWRlcihyZXEsIFNNQnJlYWQsIDUsIDApOworCWJ1ZiA9IHJlcS0+cnFfaGVhZGVyOworCVdTRVQoYnVmLCBzbWJfdnd2MCwgU01CX0koaW5vZGUpLT5maWxlaWQpOworCVdTRVQoYnVmLCBzbWJfdnd2MSwgY291bnQpOworCURTRVQoYnVmLCBzbWJfdnd2Miwgb2Zmc2V0KTsKKwlXU0VUKGJ1Ziwgc21iX3Z3djQsIDApOworCisJcmVxLT5ycV9wYWdlID0gZGF0YTsKKwlyZXEtPnJxX3JzaXplID0gY291bnQ7CisJcmVxLT5ycV9jYWxsYmFjayA9IHNtYl9wcm9jX3JlYWRfZGF0YTsKKwlyZXEtPnJxX2J1ZmZlciA9IHJidWY7CisJcmVxLT5ycV9mbGFncyB8PSBTTUJfUkVRX05PUkVUUlkgfCBTTUJfUkVRX1NUQVRJQzsKKworCXJlc3VsdCA9IHNtYl9yZXF1ZXN0X29rKHJlcSwgU01CcmVhZCwgNSwgLTEpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCXJldHVybmVkX2NvdW50ID0gV1ZBTChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djApOworCisJZGF0YV9sZW4gPSBXVkFMKHJidWYsIDEpOworCisJaWYgKHJldHVybmVkX2NvdW50ICE9IGRhdGFfbGVuKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAic21iX3Byb2NfcmVhZDogcmV0dXJuZWQgIT0gZGF0YV9sZW5cbiIpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgInNtYl9wcm9jX3JlYWQ6IHJldF9jPSVkLCBkYXRhX2xlbj0lZFxuIiwKKwkJICAgICAgIHJldHVybmVkX2NvdW50LCBkYXRhX2xlbik7CisJfQorCXJlc3VsdCA9IGRhdGFfbGVuOworCitvdXRfZnJlZToKKwlzbWJfcnB1dChyZXEpOworb3V0OgorCVZFUkJPU0UoImlubz0lbGQsIGZpbGVpZD0lZCwgY291bnQ9JWQsIHJlc3VsdD0lZFxuIiwKKwkJaW5vZGUtPmlfaW5vLCBTTUJfSShpbm9kZSktPmZpbGVpZCwgY291bnQsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludAorc21iX3Byb2Nfd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwgaW50IGNvdW50LCBjb25zdCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21faW5vZGUoaW5vZGUpOworCWludCByZXN1bHQ7CisJdTE2IGZpbGVpZCA9IFNNQl9JKGlub2RlKS0+ZmlsZWlkOworCXU4IGJ1Zls0XTsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgMCkpKQorCQlnb3RvIG91dDsKKworCVZFUkJPU0UoImlubz0lbGQsIGZpbGVpZD0lZCwgY291bnQ9JWRAJUxkXG4iLAorCQlpbm9kZS0+aV9pbm8sIGZpbGVpZCwgY291bnQsIG9mZnNldCk7CisKKwlzbWJfc2V0dXBfaGVhZGVyKHJlcSwgU01Cd3JpdGUsIDUsIGNvdW50ICsgMyk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djAsIGZpbGVpZCk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djEsIGNvdW50KTsKKwlEU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2Miwgb2Zmc2V0KTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2NCwgMCk7CisKKwlidWZbMF0gPSAxOworCVdTRVQoYnVmLCAxLCBjb3VudCk7CS8qIHllcywgYWdhaW4gLi4uICovCisJcmVxLT5ycV9pb3ZbMV0uaW92X2Jhc2UgPSBidWY7CisJcmVxLT5ycV9pb3ZbMV0uaW92X2xlbiA9IDM7CisJcmVxLT5ycV9pb3ZbMl0uaW92X2Jhc2UgPSAoY2hhciAqKSBkYXRhOworCXJlcS0+cnFfaW92WzJdLmlvdl9sZW4gPSBjb3VudDsKKwlyZXEtPnJxX2lvdmxlbiA9IDM7CisJcmVxLT5ycV9mbGFncyB8PSBTTUJfUkVRX05PUkVUUlk7CisKKwlyZXN1bHQgPSBzbWJfcmVxdWVzdF9vayhyZXEsIFNNQndyaXRlLCAxLCAwKTsKKwlpZiAocmVzdWx0ID49IDApCisJCXJlc3VsdCA9IFdWQUwocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YwKTsKKworCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIEluIHNtYl9wcm9jX3JlYWRYIGFuZCBzbWJfcHJvY193cml0ZVggd2UgZG8gbm90IHJldHJ5LCBiZWNhdXNlIHRoZQorICogZmlsZS1pZCB3b3VsZCBub3QgYmUgdmFsaWQgYWZ0ZXIgYSByZWNvbm5lY3Rpb24uCisgKi8KKworI2RlZmluZSBTTUJfUkVBRFhfTUFYX1BBRCAgICAgIDY0CitzdGF0aWMgdm9pZAorc21iX3Byb2NfcmVhZFhfZGF0YShzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSkKK3sKKwkvKiBoZWFkZXIgbGVuZ3RoLCBleGNsdWRpbmcgdGhlIG5ldGJpb3MgbGVuZ3RoICgtNCkgKi8KKwlpbnQgaGRybGVuID0gU01CX0hFQURFUl9MRU4gKyByZXEtPnJxX3Jlc3Bfd2N0KjIgLSAyOworCWludCBkYXRhX29mZiA9IFdWQUwocmVxLT5ycV9oZWFkZXIsIHNtYl92d3Y2KTsKKworCS8qCisJICogU29tZSBnZW5pdXMgbWFkZSB0aGUgcGFkZGluZyB0byB0aGUgZGF0YSBieXRlcyBhcmJpdHJhcnkuCisJICogU28gd2UgbXVzdCBmaXJzdCBjYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBwYWRkaW5nIHVzZWQgYnkgdGhlIHNlcnZlci4KKwkgKi8KKwlkYXRhX29mZiAtPSBoZHJsZW47CisJaWYgKGRhdGFfb2ZmID4gU01CX1JFQURYX01BWF9QQUQgfHwgZGF0YV9vZmYgPCAwKSB7CisJCVBBUkFOT0lBKCJvZmZzZXQgaXMgbGFyZ2VyIHRoYW4gU01CX1JFQURYX01BWF9QQUQgb3IgbmVnYXRpdmUhXG4iKTsKKwkJUEFSQU5PSUEoIiVkID4gJWQgfHwgJWQgPCAwXG4iLCBkYXRhX29mZiwgU01CX1JFQURYX01BWF9QQUQsIGRhdGFfb2ZmKTsKKwkJcmVxLT5ycV9ybGVuID0gcmVxLT5ycV9idWZzaXplICsgMTsKKwkJcmV0dXJuOworCX0KKwlyZXEtPnJxX2lvdlswXS5pb3ZfYmFzZSA9IHJlcS0+cnFfYnVmZmVyOworCXJlcS0+cnFfaW92WzBdLmlvdl9sZW4gID0gZGF0YV9vZmY7CisKKwlyZXEtPnJxX2lvdlsxXS5pb3ZfYmFzZSA9IHJlcS0+cnFfcGFnZTsKKwlyZXEtPnJxX2lvdlsxXS5pb3ZfbGVuICA9IHJlcS0+cnFfcnNpemU7CisJcmVxLT5ycV9pb3ZsZW4gPSAyOworCisJcmVxLT5ycV9ybGVuID0gc21iX2xlbihyZXEtPnJxX2hlYWRlcikgKyA0IC0gcmVxLT5ycV9ieXRlc19yZWN2ZDsKK30KKworc3RhdGljIGludAorc21iX3Byb2NfcmVhZFgoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwgaW50IGNvdW50LCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21faW5vZGUoaW5vZGUpOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCXN0YXRpYyBjaGFyIHBhZFtTTUJfUkVBRFhfTUFYX1BBRF07CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWlmICghIChyZXEgPSBzbWJfYWxsb2NfcmVxdWVzdChzZXJ2ZXIsIDApKSkKKwkJZ290byBvdXQ7CisKKwlzbWJfc2V0dXBfaGVhZGVyKHJlcSwgU01CcmVhZFgsIDEyLCAwKTsKKwlidWYgPSByZXEtPnJxX2hlYWRlcjsKKwlXU0VUKGJ1Ziwgc21iX3Z3djAsIDB4MDBmZik7CisJV1NFVChidWYsIHNtYl92d3YxLCAwKTsKKwlXU0VUKGJ1Ziwgc21iX3Z3djIsIFNNQl9JKGlub2RlKS0+ZmlsZWlkKTsKKwlEU0VUKGJ1Ziwgc21iX3Z3djMsICh1MzIpb2Zmc2V0KTsgICAgICAgICAgICAgICAvKiBsb3cgMzIgYml0cyAqLworCVdTRVQoYnVmLCBzbWJfdnd2NSwgY291bnQpOworCVdTRVQoYnVmLCBzbWJfdnd2NiwgMCk7CisJRFNFVChidWYsIHNtYl92d3Y3LCAwKTsKKwlXU0VUKGJ1Ziwgc21iX3Z3djksIDApOworCURTRVQoYnVmLCBzbWJfdnd2MTAsICh1MzIpKG9mZnNldCA+PiAzMikpOyAgICAgIC8qIGhpZ2ggMzIgYml0cyAqLworCVdTRVQoYnVmLCBzbWJfdnd2MTEsIDApOworCisJcmVxLT5ycV9wYWdlID0gZGF0YTsKKwlyZXEtPnJxX3JzaXplID0gY291bnQ7CisJcmVxLT5ycV9jYWxsYmFjayA9IHNtYl9wcm9jX3JlYWRYX2RhdGE7CisJcmVxLT5ycV9idWZmZXIgPSBwYWQ7CisJcmVxLT5ycV9idWZzaXplID0gU01CX1JFQURYX01BWF9QQUQ7CisJcmVxLT5ycV9mbGFncyB8PSBTTUJfUkVRX1NUQVRJQyB8IFNNQl9SRVFfTk9SRVRSWTsKKworCXJlc3VsdCA9IHNtYl9yZXF1ZXN0X29rKHJlcSwgU01CcmVhZFgsIDEyLCAtMSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJcmVzdWx0ID0gV1ZBTChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djUpOworCitvdXRfZnJlZToKKwlzbWJfcnB1dChyZXEpOworb3V0OgorCVZFUkJPU0UoImlubz0lbGQsIGZpbGVpZD0lZCwgY291bnQ9JWQsIHJlc3VsdD0lZFxuIiwKKwkJaW5vZGUtPmlfaW5vLCBTTUJfSShpbm9kZSktPmZpbGVpZCwgY291bnQsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludAorc21iX3Byb2Nfd3JpdGVYKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBvZmZzZXQsIGludCBjb3VudCwgY29uc3QgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2lub2RlKGlub2RlKTsKKwlpbnQgcmVzdWx0OworCXU4ICpwOworCXN0YXRpYyB1OCBwYWRbNF07CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWlmICghIChyZXEgPSBzbWJfYWxsb2NfcmVxdWVzdChzZXJ2ZXIsIDApKSkKKwkJZ290byBvdXQ7CisKKwlWRVJCT1NFKCJpbm89JWxkLCBmaWxlaWQ9JWQsIGNvdW50PSVkQCVMZFxuIiwKKwkJaW5vZGUtPmlfaW5vLCBTTUJfSShpbm9kZSktPmZpbGVpZCwgY291bnQsIG9mZnNldCk7CisKKwlwID0gc21iX3NldHVwX2hlYWRlcihyZXEsIFNNQndyaXRlWCwgMTQsIGNvdW50ICsgMSk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djAsIDB4MDBmZik7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djEsIDApOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YyLCBTTUJfSShpbm9kZSktPmZpbGVpZCk7CisJRFNFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djMsICh1MzIpb2Zmc2V0KTsJLyogbG93IDMyIGJpdHMgKi8KKwlEU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2NSwgMCk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djcsIDApOwkJLyogd3JpdGUgbW9kZSAqLworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3Y4LCAwKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2OSwgMCk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djEwLCBjb3VudCk7CQkvKiBkYXRhIGxlbmd0aCAqLworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YxMSwgc21iX3Z3djEyICsgMiArIDEpOworCURTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YxMiwgKHUzMikob2Zmc2V0ID4+IDMyKSk7CisKKwlyZXEtPnJxX2lvdlsxXS5pb3ZfYmFzZSA9IHBhZDsKKwlyZXEtPnJxX2lvdlsxXS5pb3ZfbGVuID0gMTsKKwlyZXEtPnJxX2lvdlsyXS5pb3ZfYmFzZSA9IChjaGFyICopIGRhdGE7CisJcmVxLT5ycV9pb3ZbMl0uaW92X2xlbiA9IGNvdW50OworCXJlcS0+cnFfaW92bGVuID0gMzsKKwlyZXEtPnJxX2ZsYWdzIHw9IFNNQl9SRVFfTk9SRVRSWTsKKworCXJlc3VsdCA9IHNtYl9yZXF1ZXN0X29rKHJlcSwgU01Cd3JpdGVYLCA2LCAwKTsKKyAJaWYgKHJlc3VsdCA+PSAwKQorCQlyZXN1bHQgPSBXVkFMKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2Mik7CisKKwlzbWJfcnB1dChyZXEpOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKK2ludAorc21iX3Byb2NfY3JlYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgX191MTYgYXR0ciwgdGltZV90IGN0aW1lLCBfX3UxNiAqZmlsZWlkKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KGRlbnRyeSk7CisJY2hhciAqcDsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpZiAoISAocmVxID0gc21iX2FsbG9jX3JlcXVlc3Qoc2VydmVyLCBQQUdFX1NJWkUpKSkKKwkJZ290byBvdXQ7CisKKwlwID0gc21iX3NldHVwX2hlYWRlcihyZXEsIFNNQmNyZWF0ZSwgMywgMCk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djAsIGF0dHIpOworCURTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YxLCB1dGMybG9jYWwoc2VydmVyLCBjdGltZSkpOworCXJlc3VsdCA9IHNtYl9zaW1wbGVfZW5jb2RlX3BhdGgocmVxLCAmcCwgZGVudHJ5LCBOVUxMKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKwlzbWJfc2V0dXBfYmNjKHJlcSwgcCk7CisKKwlyZXN1bHQgPSBzbWJfcmVxdWVzdF9vayhyZXEsIFNNQmNyZWF0ZSwgMSwgMCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwkqZmlsZWlkID0gV1ZBTChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djApOworCXJlc3VsdCA9IDA7CisKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50CitzbWJfcHJvY19tdihzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KG9sZF9kZW50cnkpOworCWNoYXIgKnA7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgUEFHRV9TSVpFKSkpCisJCWdvdG8gb3V0OworCisJcCA9IHNtYl9zZXR1cF9oZWFkZXIocmVxLCBTTUJtdiwgMSwgMCk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djAsIGFTWVNURU0gfCBhSElEREVOIHwgYURJUik7CisJcmVzdWx0ID0gc21iX3NpbXBsZV9lbmNvZGVfcGF0aChyZXEsICZwLCBvbGRfZGVudHJ5LCBOVUxMKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKwlyZXN1bHQgPSBzbWJfc2ltcGxlX2VuY29kZV9wYXRoKHJlcSwgJnAsIG5ld19kZW50cnksIE5VTEwpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCXNtYl9zZXR1cF9iY2MocmVxLCBwKTsKKworCWlmICgocmVzdWx0ID0gc21iX3JlcXVlc3Rfb2socmVxLCBTTUJtdiwgMCwgMCkpIDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKwlyZXN1bHQgPSAwOworCitvdXRfZnJlZToKKwlzbWJfcnB1dChyZXEpOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBDb2RlIGNvbW1vbiB0byBta2RpciBhbmQgcm1kaXIuCisgKi8KK3N0YXRpYyBpbnQKK3NtYl9wcm9jX2dlbmVyaWNfY29tbWFuZChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fdTggY29tbWFuZCkKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2RlbnRyeShkZW50cnkpOworCWNoYXIgKnA7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgUEFHRV9TSVpFKSkpCisJCWdvdG8gb3V0OworCisJcCA9IHNtYl9zZXR1cF9oZWFkZXIocmVxLCBjb21tYW5kLCAwLCAwKTsKKwlyZXN1bHQgPSBzbWJfc2ltcGxlX2VuY29kZV9wYXRoKHJlcSwgJnAsIGRlbnRyeSwgTlVMTCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJc21iX3NldHVwX2JjYyhyZXEsIHApOworCisJcmVzdWx0ID0gc21iX3JlcXVlc3Rfb2socmVxLCBjb21tYW5kLCAwLCAwKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKwlyZXN1bHQgPSAwOworCitvdXRfZnJlZToKKwlzbWJfcnB1dChyZXEpOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKK2ludAorc21iX3Byb2NfbWtkaXIoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXJldHVybiBzbWJfcHJvY19nZW5lcmljX2NvbW1hbmQoZGVudHJ5LCBTTUJta2Rpcik7Cit9CisKK2ludAorc21iX3Byb2Nfcm1kaXIoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXJldHVybiBzbWJfcHJvY19nZW5lcmljX2NvbW1hbmQoZGVudHJ5LCBTTUJybWRpcik7Cit9CisKKyNpZiBTTUJGU19QT1NJWF9VTkxJTksKKy8qCisgKiBSZW1vdmVzIHJlYWRvbmx5IGF0dHJpYnV0ZSBmcm9tIGEgZmlsZS4gVXNlZCBieSB1bmxpbmsgdG8gZ2l2ZSBwb3NpeAorICogc2VtYW50aWNzLgorICovCitzdGF0aWMgaW50CitzbWJfc2V0X3J3KHN0cnVjdCBkZW50cnkgKmRlbnRyeSxzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzbWJfZmF0dHIgZmF0dHI7CisKKwkvKiBGSVhNRTogY2lmc1VFIHNob3VsZCBhbGxvdyByZW1vdmluZyBhIHJlYWRvbmx5IGZpbGUuICovCisKKwkvKiBmaXJzdCBnZXQgY3VycmVudCBhdHRyaWJ1dGUgKi8KKwlzbWJfaW5pdF9kaXJlbnQoc2VydmVyLCAmZmF0dHIpOworCXJlc3VsdCA9IHNlcnZlci0+b3BzLT5nZXRhdHRyKHNlcnZlciwgZGVudHJ5LCAmZmF0dHIpOworCXNtYl9maW5pc2hfZGlyZW50KHNlcnZlciwgJmZhdHRyKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCS8qIGlmIFJPTkxZIGF0dHJpYnV0ZSBpcyBzZXQsIHJlbW92ZSBpdCAqLworCWlmIChmYXR0ci5hdHRyICYgYVJPTkxZKSB7ICAvKiByZWFkIG9ubHkgYXR0cmlidXRlIGlzIHNldCAqLworCQlmYXR0ci5hdHRyICY9IH5hUk9OTFk7CisJCXJlc3VsdCA9IHNtYl9wcm9jX3NldGF0dHJfY29yZShzZXJ2ZXIsIGRlbnRyeSwgZmF0dHIuYXR0cik7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKworaW50CitzbWJfcHJvY191bmxpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KGRlbnRyeSk7CisJaW50IGZsYWcgPSAwOworCWNoYXIgKnA7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgUEFHRV9TSVpFKSkpCisJCWdvdG8gb3V0OworCisgICAgICByZXRyeToKKwlwID0gc21iX3NldHVwX2hlYWRlcihyZXEsIFNNQnVubGluaywgMSwgMCk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djAsIGFTWVNURU0gfCBhSElEREVOKTsKKwlyZXN1bHQgPSBzbWJfc2ltcGxlX2VuY29kZV9wYXRoKHJlcSwgJnAsIGRlbnRyeSwgTlVMTCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJc21iX3NldHVwX2JjYyhyZXEsIHApOworCisJaWYgKChyZXN1bHQgPSBzbWJfcmVxdWVzdF9vayhyZXEsIFNNQnVubGluaywgMCwgMCkpIDwgMCkgeworI2lmIFNNQkZTX1BPU0lYX1VOTElOSworCQlpZiAocmVzdWx0ID09IC1FQUNDRVMgJiYgIWZsYWcpIHsKKwkJCS8qIFBvc2l4IHNlbWFudGljcyBpcyBmb3IgdGhlIHJlYWQtb25seSBzdGF0ZQorCQkJICAgb2YgYSBmaWxlIHRvIGJlIGlnbm9yZWQgaW4gdW5saW5rKCkuIEluIHRoZQorCQkJICAgU01CIHdvcmxkIGEgdW5saW5rKCkgaXMgcmVmdXNlZCBvbiBhCisJCQkgICByZWFkLW9ubHkgZmlsZS4gVG8gbWFrZSB0aGluZ3MgZWFzaWVyIGZvcgorCQkJICAgdW5peCB1c2VycyB3ZSB0cnkgdG8gb3ZlcnJpZGUgdGhlIGZpbGVzCisJCQkgICBwZXJtaXNzaW9uIGlmIHRoZSB1bmxpbmsgZmFpbHMgd2l0aCB0aGUKKwkJCSAgIHJpZ2h0IGVycm9yLgorCQkJICAgVGhpcyBpbnRyb2R1Y2VzIGEgcmFjZSBjb25kaXRpb24gdGhhdCBjb3VsZAorCQkJICAgbGVhZCB0byBhIGZpbGUgYmVpbmcgd3JpdHRlbiBieSBzb21lb25lIHdobworCQkJICAgc2hvdWxkbid0IGhhdmUgYWNjZXNzLCBidXQgYXMgZmFyIGFzIEkgY2FuCisJCQkgICB0ZWxsIHRoYXQgaXMgdW5hdm9pZGFibGUgKi8KKworCQkJLyogcmVtb3ZlIFJPTkxZIGF0dHJpYnV0ZSBhbmQgdHJ5IGFnYWluICovCisJCQlyZXN1bHQgPSBzbWJfc2V0X3J3KGRlbnRyeSxzZXJ2ZXIpOworCQkJaWYgKHJlc3VsdCA9PSAwKSB7CisJCQkJZmxhZyA9IDE7CisJCQkJcmVxLT5ycV9mbGFncyA9IDA7CisJCQkJZ290byByZXRyeTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCXJlc3VsdCA9IDA7CisKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50CitzbWJfcHJvY19mbHVzaChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgX191MTYgZmlsZWlkKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWlmICghIChyZXEgPSBzbWJfYWxsb2NfcmVxdWVzdChzZXJ2ZXIsIDApKSkKKwkJZ290byBvdXQ7CisKKwlzbWJfc2V0dXBfaGVhZGVyKHJlcSwgU01CZmx1c2gsIDEsIDApOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YwLCBmaWxlaWQpOworCXJlcS0+cnFfZmxhZ3MgfD0gU01CX1JFUV9OT1JFVFJZOworCXJlc3VsdCA9IHNtYl9yZXF1ZXN0X29rKHJlcSwgU01CZmx1c2gsIDAsIDApOworCisJc21iX3JwdXQocmVxKTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CitzbWJfcHJvY190cnVuYzMyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsZW5ndGgpCit7CisJLyoKKwkgKiBXcml0aW5nIDBieXRlcyBpcyBvbGQtU01CIG1hZ2ljIGZvciB0cnVuY2F0aW5nIGZpbGVzLgorCSAqIE1BWF9OT05fTEZTIHNob3VsZCBwcmV2ZW50IHRoaXMgZnJvbSBiZWluZyBjYWxsZWQgd2l0aCBhIHRvbworCSAqIGxhcmdlIG9mZnNldC4KKwkgKi8KKwlyZXR1cm4gc21iX3Byb2Nfd3JpdGUoaW5vZGUsIGxlbmd0aCwgMCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl9wcm9jX3RydW5jNjQoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxlbmd0aCkKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2lub2RlKGlub2RlKTsKKwlpbnQgcmVzdWx0OworCWNoYXIgKnBhcmFtOworCWNoYXIgKmRhdGE7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWlmICghIChyZXEgPSBzbWJfYWxsb2NfcmVxdWVzdChzZXJ2ZXIsIDE0KSkpCisJCWdvdG8gb3V0OworCisJcGFyYW0gPSByZXEtPnJxX2J1ZmZlcjsKKwlkYXRhID0gcmVxLT5ycV9idWZmZXIgKyA2OworCisJLyogRklYTUU6IG11c3Qgd2UgYWxzbyBzZXQgYWxsb2NhdGlvbiBzaXplPyB3aW5OVCBzZWVtcyB0byBkbyB0aGF0ICovCisJV1NFVChwYXJhbSwgMCwgU01CX0koaW5vZGUpLT5maWxlaWQpOworCVdTRVQocGFyYW0sIDIsIFNNQl9TRVRfRklMRV9FTkRfT0ZfRklMRV9JTkZPKTsKKwlXU0VUKHBhcmFtLCA0LCAwKTsKKwlMU0VUKGRhdGEsIDAsIGxlbmd0aCk7CisKKwlyZXEtPnJxX3RyYW5zMl9jb21tYW5kID0gVFJBTlNBQ1QyX1NFVEZJTEVJTkZPOworCXJlcS0+cnFfbGRhdGEgPSA4OworCXJlcS0+cnFfZGF0YSAgPSBkYXRhOworCXJlcS0+cnFfbHBhcm0gPSA2OworCXJlcS0+cnFfcGFybSAgPSBwYXJhbTsKKwlyZXEtPnJxX2ZsYWdzIHw9IFNNQl9SRVFfTk9SRVRSWTsKKwlyZXN1bHQgPSBzbWJfYWRkX3JlcXVlc3QocmVxKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKworCXJlc3VsdCA9IDA7CisJaWYgKHJlcS0+cnFfcmNscyAhPSAwKQorCQlyZXN1bHQgPSBzbWJfZXJybm8ocmVxKTsKKworb3V0X2ZyZWU6CisJc21iX3JwdXQocmVxKTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CitzbWJfcHJvY190cnVuYzk1KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsZW5ndGgpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9pbm9kZShpbm9kZSk7CisJaW50IHJlc3VsdCA9IHNtYl9wcm9jX3RydW5jMzIoaW5vZGUsIGxlbmd0aCk7CisgCisJLyoKKwkgKiB3aW45eCBkb2Vzbid0IGFwcGVhciB0byB1cGRhdGUgdGhlIHNpemUgaW1tZWRpYXRlbHkuCisJICogSXQgd2lsbCByZXR1cm4gdGhlIG9sZCBmaWxlIHNpemUgYWZ0ZXIgdGhlIHRydW5jYXRlLAorCSAqIGNvbmZ1c2luZyBzbWJmcy4gU28gd2UgZm9yY2UgYW4gdXBkYXRlLgorCSAqCisJICogRklYTUU6IGlzIHRoaXMgc3RpbGwgbmVjZXNzYXJ5PworCSAqLworCXNtYl9wcm9jX2ZsdXNoKHNlcnZlciwgU01CX0koaW5vZGUpLT5maWxlaWQpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitzbWJfaW5pdF9kaXJlbnQoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyKQoreworCW1lbXNldChmYXR0ciwgMCwgc2l6ZW9mKCpmYXR0cikpOworCisJZmF0dHItPmZfbmxpbmsgPSAxOworCWZhdHRyLT5mX3VpZCA9IHNlcnZlci0+bW50LT51aWQ7CisJZmF0dHItPmZfZ2lkID0gc2VydmVyLT5tbnQtPmdpZDsKKwlmYXR0ci0+Zl9ibGtzaXplID0gU01CX1NUX0JMS1NJWkU7CisJZmF0dHItPmZfdW5peCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitzbWJfZmluaXNoX2RpcmVudChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIpCit7CisJaWYgKGZhdHRyLT5mX3VuaXgpCisJCXJldHVybjsKKworCWZhdHRyLT5mX21vZGUgPSBzZXJ2ZXItPm1udC0+ZmlsZV9tb2RlOworCWlmIChmYXR0ci0+YXR0ciAmIGFESVIpIHsKKwkJZmF0dHItPmZfbW9kZSA9IHNlcnZlci0+bW50LT5kaXJfbW9kZTsKKwkJZmF0dHItPmZfc2l6ZSA9IFNNQl9TVF9CTEtTSVpFOworCX0KKwkvKiBDaGVjayB0aGUgcmVhZC1vbmx5IGZsYWcgKi8KKwlpZiAoZmF0dHItPmF0dHIgJiBhUk9OTFkpCisJCWZhdHRyLT5mX21vZGUgJj0gfihTX0lXVVNSIHwgU19JV0dSUCB8IFNfSVdPVEgpOworCisJLyogSG93IG1hbnkgNTEyIGJ5dGUgYmxvY2tzIGRvIHdlIG5lZWQgZm9yIHRoaXMgZmlsZT8gKi8KKwlmYXR0ci0+Zl9ibG9ja3MgPSAwOworCWlmIChmYXR0ci0+Zl9zaXplICE9IDApCisJCWZhdHRyLT5mX2Jsb2NrcyA9IDEgKyAoKGZhdHRyLT5mX3NpemUtMSkgPj4gOSk7CisJcmV0dXJuOworfQorCit2b2lkCitzbWJfaW5pdF9yb290X2RpcmVudChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIsCisJCSAgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzbWJfaW5pdF9kaXJlbnQoc2VydmVyLCBmYXR0cik7CisJZmF0dHItPmF0dHIgPSBhRElSOworCWZhdHRyLT5mX2lubyA9IDI7IC8qIHRyYWRpdGlvbmFsIHJvb3QgaW5vZGUgbnVtYmVyICovCisJZmF0dHItPmZfbXRpbWUgPSBjdXJyZW50X2ZzX3RpbWUoc2IpOworCXNtYl9maW5pc2hfZGlyZW50KHNlcnZlciwgZmF0dHIpOworfQorCisvKgorICogRGVjb2RlIGEgZGlyZW50IGZvciBvbGQgcHJvdG9jb2xzCisgKgorICogcW5hbWUgaXMgZmlsbGVkIHdpdGggdGhlIGRlY29kZWQsIGFuZCBwb3NzaWJseSB0cmFuc2xhdGVkLCBuYW1lLgorICogZmF0dHIgcmVjZWl2ZXMgZGVjb2RlZCBhdHRyaWJ1dGVzCisgKgorICogQnVncyBOb3RlZDoKKyAqICgxKSBQYXRod29ya3Mgc2VydmVycyBtYXkgcGFkIHRoZSBuYW1lIHdpdGggZXh0cmEgc3BhY2VzLgorICovCitzdGF0aWMgY2hhciAqCitzbWJfZGVjb2RlX3Nob3J0X2RpcmVudChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgY2hhciAqcCwKKwkJCXN0cnVjdCBxc3RyICpxbmFtZSwgc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIsCisJCQl1bnNpZ25lZCBjaGFyICpuYW1lX2J1ZikKK3sKKwlpbnQgbGVuOworCisJLyoKKwkgKiBTTUIgZG9lc24ndCBoYXZlIGEgY29uY2VwdCBvZiBpbm9kZSBudW1iZXJzIC4uLgorCSAqLworCXNtYl9pbml0X2RpcmVudChzZXJ2ZXIsIGZhdHRyKTsKKwlmYXR0ci0+Zl9pbm8gPSAwOwkvKiBGSVhNRTogZG8gd2UgbmVlZCB0aGlzPyAqLworCisJcCArPSBTTUJfU1RBVFVTX1NJWkU7CS8qIHJlc2VydmVkIChzZWFyY2hfc3RhdHVzKSAqLworCWZhdHRyLT5hdHRyID0gKnA7CisJZmF0dHItPmZfbXRpbWUudHZfc2VjID0gZGF0ZV9kb3MydW5peChzZXJ2ZXIsIFdWQUwocCwgMyksIFdWQUwocCwgMSkpOworCWZhdHRyLT5mX210aW1lLnR2X25zZWMgPSAwOworCWZhdHRyLT5mX3NpemUgPSBEVkFMKHAsIDUpOworCWZhdHRyLT5mX2N0aW1lID0gZmF0dHItPmZfbXRpbWU7CisJZmF0dHItPmZfYXRpbWUgPSBmYXR0ci0+Zl9tdGltZTsKKwlxbmFtZS0+bmFtZSA9IHAgKyA5OworCWxlbiA9IHN0cm5sZW4ocW5hbWUtPm5hbWUsIDEyKTsKKworCS8qCisJICogVHJpbSB0cmFpbGluZyBibGFua3MgZm9yIFBhdGh3b3JrcyBzZXJ2ZXJzCisJICovCisJd2hpbGUgKGxlbiA+IDIgJiYgcW5hbWUtPm5hbWVbbGVuLTFdID09ICcgJykKKwkJbGVuLS07CisKKwlzbWJfZmluaXNoX2RpcmVudChzZXJ2ZXIsIGZhdHRyKTsKKworI2lmIDAKKwkvKiBGSVhNRTogVGhlc2Ugb25seSB3b3JrIGZvciBhc2NpaSBjaGFycywgYW5kIHJlY2VudCBzbWJtb3VudCBkb2Vzbid0CisJICAgYWxsb3cgdGhlIGZsYWcgdG8gYmUgc2V0IGFueXdheS4gSXQga2lsbHMgY29uc3QuIFJlbW92ZT8gKi8KKwlzd2l0Y2ggKHNlcnZlci0+b3B0LmNhc2VfaGFuZGxpbmcpIHsKKwljYXNlIFNNQl9DQVNFX1VQUEVSOgorCQlzdHJfdXBwZXIoZW50cnktPm5hbWUsIGxlbik7CisJCWJyZWFrOworCWNhc2UgU01CX0NBU0VfTE9XRVI6CisJCXN0cl9sb3dlcihlbnRyeS0+bmFtZSwgbGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorI2VuZGlmCisKKwlxbmFtZS0+bGVuID0gMDsKKwlsZW4gPSBzZXJ2ZXItPm9wcy0+Y29udmVydChuYW1lX2J1ZiwgU01CX01BWE5BTUVMRU4sCisJCQkJICAgcW5hbWUtPm5hbWUsIGxlbiwKKwkJCQkgICBzZXJ2ZXItPnJlbW90ZV9ubHMsIHNlcnZlci0+bG9jYWxfbmxzKTsKKwlpZiAobGVuID4gMCkgeworCQlxbmFtZS0+bGVuID0gbGVuOworCQlxbmFtZS0+bmFtZSA9IG5hbWVfYnVmOworCQlERUJVRzEoImxlbj0lZCwgbmFtZT0lLipzXG4iLHFuYW1lLT5sZW4scW5hbWUtPmxlbixxbmFtZS0+bmFtZSk7CisJfQorCisJcmV0dXJuIHAgKyAyMjsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHJlYWQgaW4gZGlyZWN0b3J5IGVudHJpZXMgZnJvbSB0aGUgbmV0d29yay4KKyAqIE5vdGUgdGhhdCBpdCBpcyBmb3Igc2hvcnQgZGlyZWN0b3J5IG5hbWUgc2Vla3MsIGkuZS46IHByb3RvY29sIDwKKyAqIFNNQl9QUk9UT0NPTF9MQU5NQU4yCisgKi8KK3N0YXRpYyBpbnQKK3NtYl9wcm9jX3JlYWRkaXJfc2hvcnQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIsCisJCSAgICAgICBzdHJ1Y3Qgc21iX2NhY2hlX2NvbnRyb2wgKmN0bCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkaXIgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2RlbnRyeShkaXIpOworCXN0cnVjdCBxc3RyIHFuYW1lOworCXN0cnVjdCBzbWJfZmF0dHIgZmF0dHI7CisJY2hhciAqcDsKKwlpbnQgcmVzdWx0OworCWludCBpLCBmaXJzdCwgZW50cmllc19zZWVuLCBlbnRyaWVzOworCWludCBlbnRyaWVzX2Fza2VkID0gKHNlcnZlci0+b3B0Lm1heF94bWl0IC0gMTAwKSAvIFNNQl9ESVJJTkZPX1NJWkU7CisJX191MTYgYmNjOworCV9fdTE2IGNvdW50OworCWNoYXIgc3RhdHVzW1NNQl9TVEFUVVNfU0laRV07CisJc3RhdGljIHN0cnVjdCBxc3RyIG1hc2sgPSB7CisJCS5uYW1lCT0gIiouKiIsCisJCS5sZW4JPSAzLAorCX07CisJdW5zaWduZWQgY2hhciAqbGFzdF9zdGF0dXM7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisJdW5zaWduZWQgY2hhciAqbmFtZV9idWY7CisKKwlWRVJCT1NFKCIlcy8lc1xuIiwgREVOVFJZX1BBVEgoZGlyKSk7CisKKwlsb2NrX2tlcm5lbCgpOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpZiAoISAobmFtZV9idWYgPSBrbWFsbG9jKFNNQl9NQVhOQU1FTEVOLCBHRlBfS0VSTkVMKSkpCisJCWdvdG8gb3V0OworCisJZmlyc3QgPSAxOworCWVudHJpZXMgPSAwOworCWVudHJpZXNfc2VlbiA9IDI7IC8qIGltcGxpY2l0IC4gYW5kIC4uICovCisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWlmICghIChyZXEgPSBzbWJfYWxsb2NfcmVxdWVzdChzZXJ2ZXIsIHNlcnZlci0+b3B0Lm1heF94bWl0KSkpCisJCWdvdG8gb3V0X25hbWU7CisKKwl3aGlsZSAoMSkgeworCQlwID0gc21iX3NldHVwX2hlYWRlcihyZXEsIFNNQnNlYXJjaCwgMiwgMCk7CisJCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YwLCBlbnRyaWVzX2Fza2VkKTsKKwkJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djEsIGFESVIpOworCQlpZiAoZmlyc3QgPT0gMSkgeworCQkJcmVzdWx0ID0gc21iX3NpbXBsZV9lbmNvZGVfcGF0aChyZXEsICZwLCBkaXIsICZtYXNrKTsKKwkJCWlmIChyZXN1bHQgPCAwKQorCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQlpZiAocCArIDMgPiAoY2hhciAqKXJlcS0+cnFfYnVmZmVyICsgcmVxLT5ycV9idWZzaXplKSB7CisJCQkJcmVzdWx0ID0gLUVOQU1FVE9PTE9ORzsKKwkJCQlnb3RvIG91dF9mcmVlOworCQkJfQorCQkJKnArKyA9IDU7CisJCQlXU0VUKHAsIDAsIDApOworCQkJcCArPSAyOworCQkJZmlyc3QgPSAwOworCQl9IGVsc2UgeworCQkJaWYgKHAgKyA1ICsgU01CX1NUQVRVU19TSVpFID4KKwkJCSAgICAoY2hhciAqKXJlcS0+cnFfYnVmZmVyICsgcmVxLT5ycV9idWZzaXplKSB7CisJCQkJcmVzdWx0ID0gLUVOQU1FVE9PTE9ORzsKKwkJCQlnb3RvIG91dF9mcmVlOworCQkJfQorCQkJCQorCQkJKnArKyA9IDQ7CisJCQkqcCsrID0gMDsKKwkJCSpwKysgPSA1OworCQkJV1NFVChwLCAwLCBTTUJfU1RBVFVTX1NJWkUpOworCQkJcCArPSAyOworCQkJbWVtY3B5KHAsIHN0YXR1cywgU01CX1NUQVRVU19TSVpFKTsKKwkJCXAgKz0gU01CX1NUQVRVU19TSVpFOworCQl9CisKKwkJc21iX3NldHVwX2JjYyhyZXEsIHApOworCisJCXJlc3VsdCA9IHNtYl9yZXF1ZXN0X29rKHJlcSwgU01Cc2VhcmNoLCAxLCAtMSk7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlpZiAoKHJlcS0+cnFfcmNscyA9PSBFUlJET1MpICYmIAorCQkJICAgIChyZXEtPnJxX2VyciAgPT0gRVJSbm9maWxlcykpCisJCQkJYnJlYWs7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCWNvdW50ID0gV1ZBTChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djApOworCQlpZiAoY291bnQgPD0gMCkKKwkJCWJyZWFrOworCisJCXJlc3VsdCA9IC1FSU87CisJCWJjYyA9IHNtYl9iY2MocmVxLT5ycV9oZWFkZXIpOworCQlpZiAoYmNjICE9IGNvdW50ICogU01CX0RJUklORk9fU0laRSArIDMpCisJCQlnb3RvIG91dF9mcmVlOworCQlwID0gcmVxLT5ycV9idWZmZXIgKyAzOworCisKKwkJLyogTWFrZSBzdXJlIHRoZSByZXNwb25zZSBmaXRzIGluIHRoZSBidWZmZXIuIEZpeGVkIHNpemVkIAorCQkgICBlbnRyaWVzIG1lYW5zIHdlIGRvbid0IGhhdmUgdG8gY2hlY2sgaW4gdGhlIGRlY29kZSBsb29wLiAqLworCisJCWxhc3Rfc3RhdHVzID0gcmVxLT5ycV9idWZmZXIgKyAzICsgKGNvdW50LTEpICogU01CX0RJUklORk9fU0laRTsKKworCQlpZiAobGFzdF9zdGF0dXMgKyBTTUJfRElSSU5GT19TSVpFID49CisJCSAgICByZXEtPnJxX2J1ZmZlciArIHJlcS0+cnFfYnVmc2l6ZSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzbWJfcHJvY19yZWFkZGlyX3Nob3J0OiAiCisJCQkgICAgICAgImxhc3QgZGlyIGVudHJ5IG91dHNpZGUgYnVmZmVyISAiCisJCQkgICAgICAgIiVkQCVwICAlZEAlcFxuIiwgU01CX0RJUklORk9fU0laRSwgbGFzdF9zdGF0dXMsCisJCQkgICAgICAgcmVxLT5ycV9idWZzaXplLCByZXEtPnJxX2J1ZmZlcik7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisKKwkJLyogUmVhZCB0aGUgbGFzdCBlbnRyeSBpbnRvIHRoZSBzdGF0dXMgZmllbGQuICovCisJCW1lbWNweShzdGF0dXMsIGxhc3Rfc3RhdHVzLCBTTUJfU1RBVFVTX1NJWkUpOworCisKKwkJLyogTm93IHdlIGFyZSByZWFkeSB0byBwYXJzZSBzbWIgZGlyZWN0b3J5IGVudHJpZXMuICovCisKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCXAgPSBzbWJfZGVjb2RlX3Nob3J0X2RpcmVudChzZXJ2ZXIsIHAsIAorCQkJCQkJICAgICZxbmFtZSwgJmZhdHRyLCBuYW1lX2J1Zik7CisJCQlpZiAocW5hbWUubGVuID09IDApCisJCQkJY29udGludWU7CisKKwkJCWlmIChlbnRyaWVzX3NlZW4gPT0gMiAmJiBxbmFtZS5uYW1lWzBdID09ICcuJykgeworCQkJCWlmIChxbmFtZS5sZW4gPT0gMSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKHFuYW1lLm5hbWVbMV0gPT0gJy4nICYmIHFuYW1lLmxlbiA9PSAyKQorCQkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc21iX2ZpbGxfY2FjaGUoZmlscCwgZGlyZW50LCBmaWxsZGlyLCBjdGwsIAorCQkJCQkgICAgJnFuYW1lLCAmZmF0dHIpKQorCQkJCTsJLyogc3RvcCByZWFkaW5nPyAqLworCQkJZW50cmllc19zZWVuKys7CisJCX0KKwl9CisJcmVzdWx0ID0gZW50cmllczsKKworb3V0X2ZyZWU6CisJc21iX3JwdXQocmVxKTsKK291dF9uYW1lOgorCWtmcmVlKG5hbWVfYnVmKTsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgc21iX2RlY29kZV91bml4X2Jhc2ljKHN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyLCBzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgY2hhciAqcCkKK3sKKwl1NjQgc2l6ZSwgZGlza19ieXRlczsKKworCS8qIEZJWE1FOiB2ZXJpZnkgbmxzIHN1cHBvcnQuIGFsbCBpcyBzZW50IGFzIHV0Zjg/ICovCisKKwlmYXR0ci0+Zl91bml4ID0gMTsKKwlmYXR0ci0+Zl9tb2RlID0gMDsKKworCS8qIEZJWE1FOiB1c2UgdGhlIHVuaXF1ZUlEIGZyb20gdGhlIHJlbW90ZSBpbnN0ZWFkPyAqLworCS8qIDAgTCBmaWxlIHNpemUgaW4gYnl0ZXMgKi8KKwkvKiA4IEwgZmlsZSBzaXplIG9uIGRpc2sgaW4gYnl0ZXMgKGJsb2NrIGNvdW50KSAqLworCS8qIDQwIEwgdWlkICovCisJLyogNDggTCBnaWQgKi8KKwkvKiA1NiBXIGZpbGUgdHlwZSAqLworCS8qIDYwIEwgZGV2bWFqb3IgKi8KKwkvKiA2OCBMIGRldm1pbm9yICovCisJLyogNzYgTCB1bmlxdWUgSUQgKGlub2RlKSAqLworCS8qIDg0IEwgcGVybWlzc2lvbnMgKi8KKwkvKiA5MiBMIGxpbmsgY291bnQgKi8KKworCXNpemUgPSBMVkFMKHAsIDApOworCWRpc2tfYnl0ZXMgPSBMVkFMKHAsIDgpOworCisJLyoKKwkgKiBTb21lIHNhbWJhIHZlcnNpb25zIHJvdW5kIHVwIG9uLWRpc2sgYnl0ZSB1c2FnZQorCSAqIHRvIDFNQiBib3VuZGFyaWVzLCBtYWtpbmcgaXQgdXNlbGVzcy4gV2hlbiBzZWVpbmcKKwkgKiB0aGF0LCB1c2UgdGhlIHNpemUgaW5zdGVhZC4KKwkgKi8KKwlpZiAoIShkaXNrX2J5dGVzICYgMHhmZmZmZikpCisJCWRpc2tfYnl0ZXMgPSBzaXplKzUxMTsKKworCWZhdHRyLT5mX3NpemUgPSBzaXplOworCWZhdHRyLT5mX2Jsb2NrcyA9IGRpc2tfYnl0ZXMgPj4gOTsKKwlmYXR0ci0+Zl9jdGltZSA9IHNtYl9udHV0YzJ1bml4dXRjKExWQUwocCwgMTYpKTsKKwlmYXR0ci0+Zl9hdGltZSA9IHNtYl9udHV0YzJ1bml4dXRjKExWQUwocCwgMjQpKTsKKwlmYXR0ci0+Zl9tdGltZSA9IHNtYl9udHV0YzJ1bml4dXRjKExWQUwocCwgMzIpKTsKKworCWlmIChzZXJ2ZXItPm1udC0+ZmxhZ3MgJiBTTUJfTU9VTlRfVUlEKQorCQlmYXR0ci0+Zl91aWQgPSBzZXJ2ZXItPm1udC0+dWlkOworCWVsc2UKKwkJZmF0dHItPmZfdWlkID0gTFZBTChwLCA0MCk7CisKKwlpZiAoc2VydmVyLT5tbnQtPmZsYWdzICYgU01CX01PVU5UX0dJRCkKKwkJZmF0dHItPmZfZ2lkID0gc2VydmVyLT5tbnQtPmdpZDsKKwllbHNlCisJCWZhdHRyLT5mX2dpZCA9IExWQUwocCwgNDgpOworCisJZmF0dHItPmZfbW9kZSB8PSBzbWJfZmlsZXR5cGVfdG9fbW9kZShXVkFMKHAsIDU2KSk7CisKKwlpZiAoU19JU0JMSyhmYXR0ci0+Zl9tb2RlKSB8fCBTX0lTQ0hSKGZhdHRyLT5mX21vZGUpKSB7CisJCV9fdTY0IG1ham9yID0gTFZBTChwLCA2MCk7CisJCV9fdTY0IG1pbm9yID0gTFZBTChwLCA2OCk7CisKKwkJZmF0dHItPmZfcmRldiA9IE1LREVWKG1ham9yICYgMHhmZmZmZmZmZiwgbWlub3IgJiAweGZmZmZmZmZmKTsKKwkJaWYgKE1BSk9SKGZhdHRyLT5mX3JkZXYpICE9IChtYWpvciAmIDB4ZmZmZmZmZmYpIHx8CisJICAgIAlNSU5PUihmYXR0ci0+Zl9yZGV2KSAhPSAobWlub3IgJiAweGZmZmZmZmZmKSkKKwkJCWZhdHRyLT5mX3JkZXYgPSAwOworCX0KKworCWZhdHRyLT5mX21vZGUgfD0gTFZBTChwLCA4NCk7CisKKwlpZiAoIChzZXJ2ZXItPm1udC0+ZmxhZ3MgJiBTTUJfTU9VTlRfRE1PREUpICYmCisJICAgICAoU19JU0RJUihmYXR0ci0+Zl9tb2RlKSkgKQorCQlmYXR0ci0+Zl9tb2RlID0gKHNlcnZlci0+bW50LT5kaXJfbW9kZSAmIFNfSVJXWFVHTykgfCBTX0lGRElSOworCWVsc2UgaWYgKCAoc2VydmVyLT5tbnQtPmZsYWdzICYgU01CX01PVU5UX0ZNT0RFKSAmJgorCSAgICAgICAgICAhKFNfSVNESVIoZmF0dHItPmZfbW9kZSkpICkKKwkJZmF0dHItPmZfbW9kZSA9IChzZXJ2ZXItPm1udC0+ZmlsZV9tb2RlICYgU19JUldYVUdPKSB8CisJCQkJKGZhdHRyLT5mX21vZGUgJiBTX0lGTVQpOworCit9CisKKy8qCisgKiBJbnRlcnByZXQgYSBsb25nIGZpbGVuYW1lIHN0cnVjdHVyZSB1c2luZyB0aGUgc3BlY2lmaWVkIGluZm8gbGV2ZWw6CisgKiAgIGxldmVsIDEgZm9yIGFueXRoaW5nIGJlbG93IE5UMSBwcm90b2NvbAorICogICBsZXZlbCAyNjAgZm9yIE5UMSBwcm90b2NvbAorICoKKyAqIHFuYW1lIGlzIGZpbGxlZCB3aXRoIHRoZSBkZWNvZGVkLCBhbmQgcG9zc2libHkgdHJhbnNsYXRlZCwgbmFtZQorICogZmF0dHIgcmVjZWl2ZXMgZGVjb2RlZCBhdHRyaWJ1dGVzLgorICoKKyAqIEJ1Z3MgTm90ZWQ6CisgKiAoMSkgV2luIE5UIDQuMCBhcHBlbmRzIGEgbnVsbCBieXRlIHRvIG5hbWVzIGFuZCBjb3VudHMgaXQgaW4gdGhlIGxlbmd0aCEKKyAqLworc3RhdGljIGNoYXIgKgorc21iX2RlY29kZV9sb25nX2RpcmVudChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgY2hhciAqcCwgaW50IGxldmVsLAorCQkgICAgICAgc3RydWN0IHFzdHIgKnFuYW1lLCBzdHJ1Y3Qgc21iX2ZhdHRyICpmYXR0ciwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKm5hbWVfYnVmKQoreworCWNoYXIgKnJlc3VsdDsKKwl1bnNpZ25lZCBpbnQgbGVuID0gMDsKKwlpbnQgbjsKKwlfX3UxNiBkYXRlLCB0aW1lOworCWludCB1bmljb2RlID0gKHNlcnZlci0+bW50LT5mbGFncyAmIFNNQl9NT1VOVF9VTklDT0RFKTsKKworCS8qCisJICogU01CIGRvZXNuJ3QgaGF2ZSBhIGNvbmNlcHQgb2YgaW5vZGUgbnVtYmVycyAuLi4KKwkgKi8KKwlzbWJfaW5pdF9kaXJlbnQoc2VydmVyLCBmYXR0cik7CisJZmF0dHItPmZfaW5vID0gMDsJLyogRklYTUU6IGRvIHdlIG5lZWQgdGhpcz8gKi8KKworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIDE6CisJCWxlbiA9ICooKHVuc2lnbmVkIGNoYXIgKikgcCArIDIyKTsKKwkJcW5hbWUtPm5hbWUgPSBwICsgMjM7CisJCXJlc3VsdCA9IHAgKyAyNCArIGxlbjsKKworCQlkYXRlID0gV1ZBTChwLCAwKTsKKwkJdGltZSA9IFdWQUwocCwgMik7CisJCWZhdHRyLT5mX2N0aW1lLnR2X3NlYyA9IGRhdGVfZG9zMnVuaXgoc2VydmVyLCBkYXRlLCB0aW1lKTsKKwkJZmF0dHItPmZfY3RpbWUudHZfbnNlYyA9IDA7CisKKwkJZGF0ZSA9IFdWQUwocCwgNCk7CisJCXRpbWUgPSBXVkFMKHAsIDYpOworCQlmYXR0ci0+Zl9hdGltZS50dl9zZWMgPSBkYXRlX2RvczJ1bml4KHNlcnZlciwgZGF0ZSwgdGltZSk7CisJCWZhdHRyLT5mX2F0aW1lLnR2X25zZWMgPSAwOworCisJCWRhdGUgPSBXVkFMKHAsIDgpOworCQl0aW1lID0gV1ZBTChwLCAxMCk7CisJCWZhdHRyLT5mX210aW1lLnR2X3NlYyA9IGRhdGVfZG9zMnVuaXgoc2VydmVyLCBkYXRlLCB0aW1lKTsKKwkJZmF0dHItPmZfbXRpbWUudHZfbnNlYyA9IDA7CisJCWZhdHRyLT5mX3NpemUgPSBEVkFMKHAsIDEyKTsKKwkJLyogVUxPTkcgYWxsb2NhdGlvbiBzaXplICovCisJCWZhdHRyLT5hdHRyID0gV1ZBTChwLCAyMCk7CisKKwkJVkVSQk9TRSgiaW5mbyAxIGF0ICVwLCBsZW49JWQsIG5hbWU9JS4qc1xuIiwKKwkJCXAsIGxlbiwgbGVuLCBxbmFtZS0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgMjYwOgorCQlyZXN1bHQgPSBwICsgV1ZBTChwLCAwKTsKKwkJbGVuID0gRFZBTChwLCA2MCk7CisJCWlmIChsZW4gPiAyNTUpIGxlbiA9IDI1NTsKKwkJLyogTlQ0IG51bGwgdGVybWluYXRlcywgdW5sZXNzIHdlIGFyZSB1c2luZyB1bmljb2RlIC4uLiAqLworCQlxbmFtZS0+bmFtZSA9IHAgKyA5NDsKKwkJaWYgKCF1bmljb2RlICYmIGxlbiAmJiBxbmFtZS0+bmFtZVtsZW4tMV0gPT0gJ1wwJykKKwkJCWxlbi0tOworCisJCWZhdHRyLT5mX2N0aW1lID0gc21iX250dXRjMnVuaXh1dGMoTFZBTChwLCA4KSk7CisJCWZhdHRyLT5mX2F0aW1lID0gc21iX250dXRjMnVuaXh1dGMoTFZBTChwLCAxNikpOworCQlmYXR0ci0+Zl9tdGltZSA9IHNtYl9udHV0YzJ1bml4dXRjKExWQUwocCwgMjQpKTsKKwkJLyogY2hhbmdlIHRpbWUgKDMyKSAqLworCQlmYXR0ci0+Zl9zaXplID0gTFZBTChwLCA0MCk7CisJCS8qIGFsbG9jIHNpemUgKDQ4KSAqLworCQlmYXR0ci0+YXR0ciA9IERWQUwocCwgNTYpOworCisJCVZFUkJPU0UoImluZm8gMjYwIGF0ICVwLCBsZW49JWQsIG5hbWU9JS4qc1xuIiwKKwkJCXAsIGxlbiwgbGVuLCBxbmFtZS0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgU01CX0ZJTkRfRklMRV9VTklYOgorCQlyZXN1bHQgPSBwICsgV1ZBTChwLCAwKTsKKwkJcW5hbWUtPm5hbWUgPSBwICsgMTA4OworCisJCWxlbiA9IHN0cmxlbihxbmFtZS0+bmFtZSk7CisJCS8qIEZJWE1FOiBzaG91bGQgd2UgY2hlY2sgdGhlIGxlbmd0aD8/ICovCisKKwkJcCArPSA4OworCQlzbWJfZGVjb2RlX3VuaXhfYmFzaWMoZmF0dHIsIHNlcnZlciwgcCk7CisJCVZFUkJPU0UoImluZm8gU01CX0ZJTkRfRklMRV9VTklYIGF0ICVwLCBsZW49JWQsIG5hbWU9JS4qc1xuIiwKKwkJCXAsIGxlbiwgbGVuLCBxbmFtZS0+bmFtZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBBUkFOT0lBKCJVbmtub3duIGluZm8gbGV2ZWwgJWRcbiIsIGxldmVsKTsKKwkJcmVzdWx0ID0gcCArIFdWQUwocCwgMCk7CisJCWdvdG8gb3V0OworCX0KKworCXNtYl9maW5pc2hfZGlyZW50KHNlcnZlciwgZmF0dHIpOworCisjaWYgMAorCS8qIEZJWE1FOiBUaGVzZSBvbmx5IHdvcmsgZm9yIGFzY2lpIGNoYXJzLCBhbmQgcmVjZW50IHNtYm1vdW50IGRvZXNuJ3QKKwkgICBhbGxvdyB0aGUgZmxhZyB0byBiZSBzZXQgYW55d2F5LiBSZW1vdmU/ICovCisJc3dpdGNoIChzZXJ2ZXItPm9wdC5jYXNlX2hhbmRsaW5nKSB7CisJY2FzZSBTTUJfQ0FTRV9VUFBFUjoKKwkJc3RyX3VwcGVyKHFuYW1lLT5uYW1lLCBsZW4pOworCQlicmVhazsKKwljYXNlIFNNQl9DQVNFX0xPV0VSOgorCQlzdHJfbG93ZXIocW5hbWUtPm5hbWUsIGxlbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKyNlbmRpZgorCisJcW5hbWUtPmxlbiA9IDA7CisJbiA9IHNlcnZlci0+b3BzLT5jb252ZXJ0KG5hbWVfYnVmLCBTTUJfTUFYTkFNRUxFTiwKKwkJCQkgcW5hbWUtPm5hbWUsIGxlbiwKKwkJCQkgc2VydmVyLT5yZW1vdGVfbmxzLCBzZXJ2ZXItPmxvY2FsX25scyk7CisJaWYgKG4gPiAwKSB7CisJCXFuYW1lLT5sZW4gPSBuOworCQlxbmFtZS0+bmFtZSA9IG5hbWVfYnVmOworCX0KKworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIGZpbmRmaXJzdC9maW5kbmV4dCBmbGFncyAqLworI2RlZmluZSBTTUJfQ0xPU0VfQUZURVJfRklSU1QgKDE8PDApCisjZGVmaW5lIFNNQl9DTE9TRV9JRl9FTkQgKDE8PDEpCisjZGVmaW5lIFNNQl9SRVFVSVJFX1JFU1VNRV9LRVkgKDE8PDIpCisjZGVmaW5lIFNNQl9DT05USU5VRV9CSVQgKDE8PDMpCisKKy8qCisgKiBOb3RlOiBzYW1iYS0yLjAuNyAoYXQgbGVhc3QpIGhhcyBhIHZlcnkgc2ltaWxhciByb3V0aW5lLCBjbGlfbGlzdCwgaW4KKyAqIHNvdXJjZS9saWJzbWIvY2xpbGlzdC5jLiBXaGVuIGxvb2tpbmcgZm9yIHNtYiBidWdzIGluIHRoZSByZWFkZGlyIGNvZGUsCisgKiBnbyB0aGVyZSBmb3IgYWR2aXNlLgorICoKKyAqIEJ1Z3MgTm90ZWQ6CisgKiAoMSkgV2hlbiB1c2luZyBJbmZvIExldmVsIDEgV2luIE5UIDQuMCB0cnVuY2F0ZXMgZGlyZWN0b3J5IGxpc3RpbmdzIAorICogZm9yIGNlcnRhaW4gcGF0dGVybnMgb2YgbmFtZXMgYW5kL29yIGxlbmd0aHMuIFRoZSBicmVha2FnZSBwYXR0ZXJuCisgKiBpcyBjb21wbGV0ZWx5IHJlcHJvZHVjaWJsZSBhbmQgY2FuIGJlIHRvZ2dsZWQgYnkgdGhlIGNyZWF0aW9uIG9mIGEKKyAqIHNpbmdsZSBmaWxlLiAoRS5nLiBlY2hvIGhpID5mb28gYnJlYWtzLCBybSAtZiBmb28gd29ya3MuKQorICovCitzdGF0aWMgaW50CitzbWJfcHJvY19yZWFkZGlyX2xvbmcoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIsCisJCSAgICAgIHN0cnVjdCBzbWJfY2FjaGVfY29udHJvbCAqY3RsKQoreworCXN0cnVjdCBkZW50cnkgKmRpciA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KGRpcik7CisJc3RydWN0IHFzdHIgcW5hbWU7CisJc3RydWN0IHNtYl9mYXR0ciBmYXR0cjsKKworCXVuc2lnbmVkIGNoYXIgKnAsICpsYXN0bmFtZTsKKwljaGFyICptYXNrLCAqcGFyYW07CisJX191MTYgY29tbWFuZDsKKwlpbnQgZmlyc3QsIGVudHJpZXNfc2VlbjsKKworCS8qIEJvdGggTlQgYW5kIE9TLzIgYWNjZXB0IGluZm8gbGV2ZWwgMSAoYnV0IHNlZSBub3RlIGJlbG93KS4gKi8KKwlpbnQgaW5mb19sZXZlbCA9IDI2MDsKKwljb25zdCBpbnQgbWF4X21hdGNoZXMgPSA1MTI7CisKKwl1bnNpZ25lZCBpbnQgZmZfc2VhcmNoY291bnQgPSAwOworCXVuc2lnbmVkIGludCBmZl9lb3MgPSAwOworCXVuc2lnbmVkIGludCBmZl9sYXN0bmFtZSA9IDA7CisJdW5zaWduZWQgaW50IGZmX2Rpcl9oYW5kbGUgPSAwOworCXVuc2lnbmVkIGludCBsb29wX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgbWFza19sZW4sIGk7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKwl1bnNpZ25lZCBjaGFyICpuYW1lX2J1ZjsKKwlzdGF0aWMgc3RydWN0IHFzdHIgc3RhciA9IHsKKwkJLm5hbWUJPSAiKiIsCisJCS5sZW4JPSAxLAorCX07CisKKwlsb2NrX2tlcm5lbCgpOworCisJLyoKKwkgKiBXZSBhbHdheXMgcHJlZmVyIHVuaXggc3R5bGUuIFVzZSBpbmZvIGxldmVsIDEgZm9yIG9sZGVyCisJICogc2VydmVycyB0aGF0IGRvbid0IGRvIDI2MC4KKwkgKi8KKwlpZiAoc2VydmVyLT5vcHQuY2FwYWJpbGl0aWVzICYgU01CX0NBUF9VTklYKQorCQlpbmZvX2xldmVsID0gU01CX0ZJTkRfRklMRV9VTklYOworCWVsc2UgaWYgKHNlcnZlci0+b3B0LnByb3RvY29sIDwgU01CX1BST1RPQ09MX05UMSkKKwkJaW5mb19sZXZlbCA9IDE7CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWlmICghIChuYW1lX2J1ZiA9IGttYWxsb2MoU01CX01BWE5BTUVMRU4rMiwgR0ZQX0tFUk5FTCkpKQorCQlnb3RvIG91dDsKKwlpZiAoISAocmVxID0gc21iX2FsbG9jX3JlcXVlc3Qoc2VydmVyLCBzZXJ2ZXItPm9wdC5tYXhfeG1pdCkpKQorCQlnb3RvIG91dF9uYW1lOworCXBhcmFtID0gcmVxLT5ycV9idWZmZXI7CisKKwkvKgorCSAqIEVuY29kZSB0aGUgaW5pdGlhbCBwYXRoCisJICovCisJbWFzayA9IHBhcmFtICsgMTI7CisKKwlyZXN1bHQgPSBzbWJfZW5jb2RlX3BhdGgoc2VydmVyLCBtYXNrLCBTTUJfTUFYUEFUSExFTisxLCBkaXIsICZzdGFyKTsKKwlpZiAocmVzdWx0IDw9IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJbWFza19sZW4gPSByZXN1bHQgLSAxOwkvKiBtYXNrX2xlbiBpcyBzdHJsZW4sIG5vdCAjYnl0ZXMgKi8KKwlyZXN1bHQgPSAwOworCWZpcnN0ID0gMTsKKwlWRVJCT1NFKCJzdGFydGluZyBtYXNrX2xlbj0lZCwgbWFzaz0lc1xuIiwgbWFza19sZW4sIG1hc2spOworCisJZW50cmllc19zZWVuID0gMjsKKwlmZl9lb3MgPSAwOworCisJd2hpbGUgKGZmX2VvcyA9PSAwKSB7CisJCWxvb3BfY291bnQgKz0gMTsKKwkJaWYgKGxvb3BfY291bnQgPiAxMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic21iX3Byb2NfcmVhZGRpcl9sb25nOiAiCisJCQkgICAgICAgIkxvb3BpbmcgaW4gRklORF9ORVhUPz9cbiIpOworCQkJcmVzdWx0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGZpcnN0ICE9IDApIHsKKwkJCWNvbW1hbmQgPSBUUkFOU0FDVDJfRklOREZJUlNUOworCQkJV1NFVChwYXJhbSwgMCwgYVNZU1RFTSB8IGFISURERU4gfCBhRElSKTsKKwkJCVdTRVQocGFyYW0sIDIsIG1heF9tYXRjaGVzKTsJLyogbWF4IGNvdW50ICovCisJCQlXU0VUKHBhcmFtLCA0LCBTTUJfQ0xPU0VfSUZfRU5EKTsKKwkJCVdTRVQocGFyYW0sIDYsIGluZm9fbGV2ZWwpOworCQkJRFNFVChwYXJhbSwgOCwgMCk7CisJCX0gZWxzZSB7CisJCQljb21tYW5kID0gVFJBTlNBQ1QyX0ZJTkRORVhUOworCisJCQlWRVJCT1NFKCJoYW5kbGU9MHglWCwgbGFzdG5hbWU9JWQsIG1hc2s9JS4qc1xuIiwKKwkJCQlmZl9kaXJfaGFuZGxlLCBmZl9sYXN0bmFtZSwgbWFza19sZW4sIG1hc2spOworCisJCQlXU0VUKHBhcmFtLCAwLCBmZl9kaXJfaGFuZGxlKTsJLyogc2VhcmNoIGhhbmRsZSAqLworCQkJV1NFVChwYXJhbSwgMiwgbWF4X21hdGNoZXMpOwkvKiBtYXggY291bnQgKi8KKwkJCVdTRVQocGFyYW0sIDQsIGluZm9fbGV2ZWwpOworCQkJRFNFVChwYXJhbSwgNiwgMCk7CisJCQlXU0VUKHBhcmFtLCAxMCwgU01CX0NPTlRJTlVFX0JJVHxTTUJfQ0xPU0VfSUZfRU5EKTsKKwkJfQorCisJCXJlcS0+cnFfdHJhbnMyX2NvbW1hbmQgPSBjb21tYW5kOworCQlyZXEtPnJxX2xkYXRhID0gMDsKKwkJcmVxLT5ycV9kYXRhICA9IE5VTEw7CisJCXJlcS0+cnFfbHBhcm0gPSAxMiArIG1hc2tfbGVuICsgMTsKKwkJcmVxLT5ycV9wYXJtICA9IHBhcmFtOworCQlyZXEtPnJxX2ZsYWdzID0gMDsKKwkJcmVzdWx0ID0gc21iX2FkZF9yZXF1ZXN0KHJlcSk7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlQQVJBTk9JQSgiZXJyb3I9JWQsIGJyZWFraW5nXG4iLCByZXN1bHQpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmVxLT5ycV9yY2xzID09IEVSUlNSViAmJiByZXEtPnJxX2VyciA9PSBFUlJlcnJvcikgeworCQkJLyogYSBkYW1uIFdpbjk1IGJ1ZyAtIHNvbWV0aW1lcyBpdCBjbGFncyBpZiB5b3UgCisJCQkgICBhc2sgaXQgdG9vIGZhc3QgKi8KKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQkJc2NoZWR1bGVfdGltZW91dChIWi81KTsKKwkJCWNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworCQlpZiAocmVxLT5ycV9yY2xzICE9IDApIHsKKwkJCXJlc3VsdCA9IHNtYl9lcnJubyhyZXEpOworCQkJUEFSQU5PSUEoIm5hbWU9JXMsIHJlc3VsdD0lZCwgcmNscz0lZCwgZXJyPSVkXG4iLAorCQkJCSBtYXNrLCByZXN1bHQsIHJlcS0+cnFfcmNscywgcmVxLT5ycV9lcnIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBwYXJzZSBvdXQgc29tZSBpbXBvcnRhbnQgcmV0dXJuIGluZm8gKi8KKwkJaWYgKGZpcnN0ICE9IDApIHsKKwkJCWZmX2Rpcl9oYW5kbGUgPSBXVkFMKHJlcS0+cnFfcGFybSwgMCk7CisJCQlmZl9zZWFyY2hjb3VudCA9IFdWQUwocmVxLT5ycV9wYXJtLCAyKTsKKwkJCWZmX2VvcyA9IFdWQUwocmVxLT5ycV9wYXJtLCA0KTsKKwkJCWZmX2xhc3RuYW1lID0gV1ZBTChyZXEtPnJxX3Bhcm0sIDgpOworCQl9IGVsc2UgeworCQkJZmZfc2VhcmNoY291bnQgPSBXVkFMKHJlcS0+cnFfcGFybSwgMCk7CisJCQlmZl9lb3MgPSBXVkFMKHJlcS0+cnFfcGFybSwgMik7CisJCQlmZl9sYXN0bmFtZSA9IFdWQUwocmVxLT5ycV9wYXJtLCA2KTsKKwkJfQorCisJCWlmIChmZl9zZWFyY2hjb3VudCA9PSAwKQorCQkJYnJlYWs7CisKKwkJLyogTm93IHdlIGFyZSByZWFkeSB0byBwYXJzZSBzbWIgZGlyZWN0b3J5IGVudHJpZXMuICovCisKKwkJLyogcG9pbnQgdG8gdGhlIGRhdGEgYnl0ZXMgKi8KKwkJcCA9IHJlcS0+cnFfZGF0YTsKKwkJZm9yIChpID0gMDsgaSA8IGZmX3NlYXJjaGNvdW50OyBpKyspIHsKKwkJCS8qIG1ha2Ugc3VyZSB3ZSBzdGF5IHdpdGhpbiB0aGUgYnVmZmVyICovCisJCQlpZiAocCA+PSByZXEtPnJxX2RhdGEgKyByZXEtPnJxX2xkYXRhKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJzbWJfcHJvY19yZWFkZGlyX2xvbmc6ICIKKwkJCQkgICAgICAgImRpcmVudCBwb2ludGVyIG91dHNpZGUgYnVmZmVyISAiCisJCQkJICAgICAgICIlcCAgJWRAJXBcbiIsCisJCQkJICAgICAgIHAsIHJlcS0+cnFfbGRhdGEsIHJlcS0+cnFfZGF0YSk7CisJCQkJcmVzdWx0ID0gLUVJTzsgLyogYWx3YXlzIGEgY29tbS4gZXJyb3I/ICovCisJCQkJZ290byBvdXRfZnJlZTsKKwkJCX0KKworCQkJcCA9IHNtYl9kZWNvZGVfbG9uZ19kaXJlbnQoc2VydmVyLCBwLCBpbmZvX2xldmVsLAorCQkJCQkJICAgJnFuYW1lLCAmZmF0dHIsIG5hbWVfYnVmKTsKKworCQkJLyogaWdub3JlIC4gYW5kIC4uIGZyb20gdGhlIHNlcnZlciAqLworCQkJaWYgKGVudHJpZXNfc2VlbiA9PSAyICYmIHFuYW1lLm5hbWVbMF0gPT0gJy4nKSB7CisJCQkJaWYgKHFuYW1lLmxlbiA9PSAxKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAocW5hbWUubmFtZVsxXSA9PSAnLicgJiYgcW5hbWUubGVuID09IDIpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoIXNtYl9maWxsX2NhY2hlKGZpbHAsIGRpcmVudCwgZmlsbGRpciwgY3RsLCAKKwkJCQkJICAgICZxbmFtZSwgJmZhdHRyKSkKKwkJCQk7CS8qIHN0b3AgcmVhZGluZz8gKi8KKwkJCWVudHJpZXNfc2VlbisrOworCQl9CisKKwkJVkVSQk9TRSgicmVjZWl2ZWQgJWQgZW50cmllcywgZW9zPSVkXG4iLCBmZl9zZWFyY2hjb3VudCxmZl9lb3MpOworCisJCS8qCisJCSAqIFdlIG1pZ2h0IG5lZWQgdGhlIGxhc3RuYW1lIGZvciBjb250aW51YXRpb25zLgorCQkgKgorCQkgKiBOb3RlIHRoYXQgc29tZSBzZXJ2ZXJzICh3aW45NT8pIHBvaW50IHRvIHRoZSBmaWxlbmFtZSBhbmQKKwkJICogb3RoZXJzIChOVDQsIFNhbWJhIHVzaW5nIE5UMSkgdG8gdGhlIGRpciBlbnRyeS4gV2UgYXNzdW1lCisJCSAqIGhlcmUgdGhhdCB0aG9zZSB3aG8gZG8gbm90IHBvaW50IHRvIGEgZmlsZW5hbWUgZG8gbm90IG5lZWQKKwkJICogdGhpcyBpbmZvIHRvIGNvbnRpbnVlIHRoZSBsaXN0aW5nLgorCQkgKgorCQkgKiBPUy8yIG5lZWRzIHRoaXMgYW5kIHRhbGtzIGluZm9sZXZlbCAxLgorCQkgKiBOZXRBcHBzIHdhbnQgbGFzdG5hbWUgd2l0aCBpbmZvbGV2ZWwgMjYwLgorCQkgKiB3aW4yayB3YW50IGxhc3RuYW1lIHdpdGggaW5mb2xldmVsIDI2MCwgYW5kIHBvaW50cyB0bworCQkgKiAgICAgICB0aGUgcmVjb3JkIG5vdCB0byB0aGUgbmFtZS4KKwkJICogU2FtYmErQ2lmc1VuaXhFeHQgZG9lc24ndCBuZWVkIGxhc3RuYW1lLgorCQkgKgorCQkgKiBCb3RoIGFyZSBoYXBweSBpZiB3ZSByZXR1cm4gdGhlIGRhdGEgdGhleSBwb2ludCB0by4gU28gd2UgZG8uCisJCSAqIChGSVhNRTogYWJvdmUgaXMgbm90IHRydWUgd2l0aCB3aW4yaykKKwkJICovCisJCW1hc2tfbGVuID0gMDsKKwkJaWYgKGluZm9fbGV2ZWwgIT0gU01CX0ZJTkRfRklMRV9VTklYICYmCisJCSAgICBmZl9sYXN0bmFtZSA+IDAgJiYgZmZfbGFzdG5hbWUgPCByZXEtPnJxX2xkYXRhKSB7CisJCQlsYXN0bmFtZSA9IHJlcS0+cnFfZGF0YSArIGZmX2xhc3RuYW1lOworCisJCQlzd2l0Y2ggKGluZm9fbGV2ZWwpIHsKKwkJCWNhc2UgMjYwOgorCQkJCW1hc2tfbGVuID0gcmVxLT5ycV9sZGF0YSAtIGZmX2xhc3RuYW1lOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCS8qIGxhc3RuYW1lIHBvaW50cyB0byBhIGxlbmd0aCBieXRlICovCisJCQkJbWFza19sZW4gPSAqbGFzdG5hbWUrKzsKKwkJCQlpZiAoZmZfbGFzdG5hbWUgKyAxICsgbWFza19sZW4gPiByZXEtPnJxX2xkYXRhKQorCQkJCQltYXNrX2xlbiA9IHJlcS0+cnFfbGRhdGEgLSBmZl9sYXN0bmFtZSAtIDE7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qCisJCQkgKiBVcGRhdGUgdGhlIG1hc2sgc3RyaW5nIGZvciB0aGUgbmV4dCBtZXNzYWdlLgorCQkJICovCisJCQlpZiAobWFza19sZW4gPiAyNTUpCisJCQkJbWFza19sZW4gPSAyNTU7CisJCQlpZiAobWFza19sZW4pCisJCQkJc3RybmNweShtYXNrLCBsYXN0bmFtZSwgbWFza19sZW4pOworCQl9CisJCW1hc2tfbGVuID0gc3RybmxlbihtYXNrLCBtYXNrX2xlbik7CisJCVZFUkJPU0UoIm5ldyBtYXNrLCBsZW49JWRAJWQgb2YgJWQsIG1hc2s9JS4qc1xuIiwKKwkJCW1hc2tfbGVuLCBmZl9sYXN0bmFtZSwgcmVxLT5ycV9sZGF0YSwgbWFza19sZW4sIG1hc2spOworCisJCWZpcnN0ID0gMDsKKwkJbG9vcF9jb3VudCA9IDA7CisJfQorCitvdXRfZnJlZToKKwlzbWJfcnB1dChyZXEpOworb3V0X25hbWU6CisJa2ZyZWUobmFtZV9idWYpOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogVGhpcyB2ZXJzaW9uIHVzZXMgdGhlIHRyYW5zMiBUUkFOU0FDVDJfRklOREZJUlNUIG1lc3NhZ2UgCisgKiB0byBnZXQgdGhlIGF0dHJpYnV0ZSBkYXRhLgorICoKKyAqIEJ1Z3MgTm90ZWQ6CisgKi8KK3N0YXRpYyBpbnQKK3NtYl9wcm9jX2dldGF0dHJfZmYoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCXN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyKQoreworCWNoYXIgKnBhcmFtLCAqbWFzazsKKwlfX3UxNiBkYXRlLCB0aW1lOworCWludCBtYXNrX2xlbiwgcmVzdWx0OworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpZiAoISAocmVxID0gc21iX2FsbG9jX3JlcXVlc3Qoc2VydmVyLCBQQUdFX1NJWkUpKSkKKwkJZ290byBvdXQ7CisJcGFyYW0gPSByZXEtPnJxX2J1ZmZlcjsKKwltYXNrID0gcGFyYW0gKyAxMjsKKworCW1hc2tfbGVuID0gc21iX2VuY29kZV9wYXRoKHNlcnZlciwgbWFzaywgU01CX01BWFBBVEhMRU4rMSwgZGVudHJ5LE5VTEwpOworCWlmIChtYXNrX2xlbiA8IDApIHsKKwkJcmVzdWx0ID0gbWFza19sZW47CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCVZFUkJPU0UoIm5hbWU9JXMsIGxlbj0lZFxuIiwgbWFzaywgbWFza19sZW4pOworCVdTRVQocGFyYW0sIDAsIGFTWVNURU0gfCBhSElEREVOIHwgYURJUik7CisJV1NFVChwYXJhbSwgMiwgMSk7CS8qIG1heCBjb3VudCAqLworCVdTRVQocGFyYW0sIDQsIDEpOwkvKiBjbG9zZSBhZnRlciB0aGlzIGNhbGwgKi8KKwlXU0VUKHBhcmFtLCA2LCAxKTsJLyogaW5mb19sZXZlbCAqLworCURTRVQocGFyYW0sIDgsIDApOworCisJcmVxLT5ycV90cmFuczJfY29tbWFuZCA9IFRSQU5TQUNUMl9GSU5ERklSU1Q7CisJcmVxLT5ycV9sZGF0YSA9IDA7CisJcmVxLT5ycV9kYXRhICA9IE5VTEw7CisJcmVxLT5ycV9scGFybSA9IDEyICsgbWFza19sZW47CisJcmVxLT5ycV9wYXJtICA9IHBhcmFtOworCXJlcS0+cnFfZmxhZ3MgPSAwOworCXJlc3VsdCA9IHNtYl9hZGRfcmVxdWVzdChyZXEpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCWlmIChyZXEtPnJxX3JjbHMgIT0gMCkgeworCQlyZXN1bHQgPSBzbWJfZXJybm8ocmVxKTsKKyNpZmRlZiBTTUJGU19QQVJBTk9JQQorCQlpZiAocmVzdWx0ICE9IC1FTk9FTlQpCisJCQlQQVJBTk9JQSgiZXJyb3IgZm9yICVzLCByY2xzPSVkLCBlcnI9JWRcbiIsCisJCQkJIG1hc2ssIHJlcS0+cnFfcmNscywgcmVxLT5ycV9lcnIpOworI2VuZGlmCisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCS8qIE1ha2Ugc3VyZSB3ZSBnb3QgZW5vdWdoIGRhdGEgLi4uICovCisJcmVzdWx0ID0gLUVJTlZBTDsKKwlpZiAocmVxLT5ycV9sZGF0YSA8IDIyIHx8IFdWQUwocmVxLT5ycV9wYXJtLCAyKSAhPSAxKSB7CisJCVBBUkFOT0lBKCJiYWQgcmVzdWx0IGZvciAlcywgbGVuPSVkLCBjb3VudD0lZFxuIiwKKwkJCSBtYXNrLCByZXEtPnJxX2xkYXRhLCBXVkFMKHJlcS0+cnFfcGFybSwgMikpOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCS8qCisJICogRGVjb2RlIHRoZSByZXNwb25zZSBpbnRvIHRoZSBmYXR0ciAuLi4KKwkgKi8KKwlkYXRlID0gV1ZBTChyZXEtPnJxX2RhdGEsIDApOworCXRpbWUgPSBXVkFMKHJlcS0+cnFfZGF0YSwgMik7CisJZmF0dHItPmZfY3RpbWUudHZfc2VjID0gZGF0ZV9kb3MydW5peChzZXJ2ZXIsIGRhdGUsIHRpbWUpOworCWZhdHRyLT5mX2N0aW1lLnR2X25zZWMgPSAwOworCisJZGF0ZSA9IFdWQUwocmVxLT5ycV9kYXRhLCA0KTsKKwl0aW1lID0gV1ZBTChyZXEtPnJxX2RhdGEsIDYpOworCWZhdHRyLT5mX2F0aW1lLnR2X3NlYyA9IGRhdGVfZG9zMnVuaXgoc2VydmVyLCBkYXRlLCB0aW1lKTsKKwlmYXR0ci0+Zl9hdGltZS50dl9uc2VjID0gMDsKKworCWRhdGUgPSBXVkFMKHJlcS0+cnFfZGF0YSwgOCk7CisJdGltZSA9IFdWQUwocmVxLT5ycV9kYXRhLCAxMCk7CisJZmF0dHItPmZfbXRpbWUudHZfc2VjID0gZGF0ZV9kb3MydW5peChzZXJ2ZXIsIGRhdGUsIHRpbWUpOworCWZhdHRyLT5mX210aW1lLnR2X25zZWMgPSAwOworCVZFUkJPU0UoIm5hbWU9JXMsIGRhdGU9JXgsIHRpbWU9JXgsIG10aW1lPSVsZFxuIiwKKwkJbWFzaywgZGF0ZSwgdGltZSwgZmF0dHItPmZfbXRpbWUpOworCWZhdHRyLT5mX3NpemUgPSBEVkFMKHJlcS0+cnFfZGF0YSwgMTIpOworCS8qIFVMT05HIGFsbG9jYXRpb24gc2l6ZSAqLworCWZhdHRyLT5hdHRyID0gV1ZBTChyZXEtPnJxX2RhdGEsIDIwKTsKKwlyZXN1bHQgPSAwOworCitvdXRfZnJlZToKKwlzbWJfcnB1dChyZXEpOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl9wcm9jX2dldGF0dHJfY29yZShzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IGRlbnRyeSAqZGlyLAorCQkgICAgICBzdHJ1Y3Qgc21iX2ZhdHRyICpmYXR0cikKK3sKKwlpbnQgcmVzdWx0OworCWNoYXIgKnA7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWlmICghIChyZXEgPSBzbWJfYWxsb2NfcmVxdWVzdChzZXJ2ZXIsIFBBR0VfU0laRSkpKQorCQlnb3RvIG91dDsKKworCXAgPSBzbWJfc2V0dXBfaGVhZGVyKHJlcSwgU01CZ2V0YXRyLCAwLCAwKTsKKwlyZXN1bHQgPSBzbWJfc2ltcGxlX2VuY29kZV9wYXRoKHJlcSwgJnAsIGRpciwgTlVMTCk7CisJaWYgKHJlc3VsdCA8IDApCisgCQlnb3RvIG91dF9mcmVlOworCXNtYl9zZXR1cF9iY2MocmVxLCBwKTsKKworCWlmICgocmVzdWx0ID0gc21iX3JlcXVlc3Rfb2socmVxLCBTTUJnZXRhdHIsIDEwLCAwKSkgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCWZhdHRyLT5hdHRyICAgID0gV1ZBTChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djApOworCWZhdHRyLT5mX210aW1lLnR2X3NlYyA9IGxvY2FsMnV0YyhzZXJ2ZXIsIERWQUwocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YxKSk7CisJZmF0dHItPmZfbXRpbWUudHZfbnNlYyA9IDA7CisJZmF0dHItPmZfc2l6ZSAgPSBEVkFMKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2Myk7CisJZmF0dHItPmZfY3RpbWUgPSBmYXR0ci0+Zl9tdGltZTsgCisJZmF0dHItPmZfYXRpbWUgPSBmYXR0ci0+Zl9tdGltZTsgCisjaWZkZWYgU01CRlNfREVCVUdfVElNRVNUQU1QCisJcHJpbnRrKCJnZXRhdHRyX2NvcmU6ICVzLyVzLCBtdGltZT0lbGRcbiIsCisJICAgICAgIERFTlRSWV9QQVRIKGRpciksIGZhdHRyLT5mX210aW1lKTsKKyNlbmRpZgorCXJlc3VsdCA9IDA7CisKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIEJ1Z3MgTm90ZWQ6CisgKiAoMSkgV2luIDk1IHN3YXBzIHRoZSBkYXRlIGFuZCB0aW1lIGZpZWxkcyBpbiB0aGUgc3RhbmRhcmQgaW5mbyBsZXZlbC4KKyAqLworc3RhdGljIGludAorc21iX3Byb2NfZ2V0YXR0cl90cmFuczIoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHN0cnVjdCBkZW50cnkgKmRpciwKKwkJCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxLCBpbnQgaW5mb2xldmVsKQoreworCWNoYXIgKnAsICpwYXJhbTsKKwlpbnQgcmVzdWx0OworCisJcGFyYW0gPSByZXEtPnJxX2J1ZmZlcjsKKwlXU0VUKHBhcmFtLCAwLCBpbmZvbGV2ZWwpOworCURTRVQocGFyYW0sIDIsIDApOworCXJlc3VsdCA9IHNtYl9lbmNvZGVfcGF0aChzZXJ2ZXIsIHBhcmFtKzYsIFNNQl9NQVhQQVRITEVOKzEsIGRpciwgTlVMTCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0OworCXAgPSBwYXJhbSArIDYgKyByZXN1bHQ7CisKKwlyZXEtPnJxX3RyYW5zMl9jb21tYW5kID0gVFJBTlNBQ1QyX1FQQVRISU5GTzsKKwlyZXEtPnJxX2xkYXRhID0gMDsKKwlyZXEtPnJxX2RhdGEgID0gTlVMTDsKKwlyZXEtPnJxX2xwYXJtID0gcCAtIHBhcmFtOworCXJlcS0+cnFfcGFybSAgPSBwYXJhbTsKKwlyZXEtPnJxX2ZsYWdzID0gMDsKKwlyZXN1bHQgPSBzbWJfYWRkX3JlcXVlc3QocmVxKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXQ7CisJaWYgKHJlcS0+cnFfcmNscyAhPSAwKSB7CisJCVZFUkJPU0UoImZvciAlczogcmVzdWx0PSVkLCByY2xzPSVkLCBlcnI9JWRcbiIsCisJCQkmcGFyYW1bNl0sIHJlc3VsdCwgcmVxLT5ycV9yY2xzLCByZXEtPnJxX2Vycik7CisJCXJlc3VsdCA9IHNtYl9lcnJubyhyZXEpOworCQlnb3RvIG91dDsKKwl9CisJcmVzdWx0ID0gLUVOT0VOVDsKKwlpZiAocmVxLT5ycV9sZGF0YSA8IDIyKSB7CisJCVBBUkFOT0lBKCJub3QgZW5vdWdoIGRhdGEgZm9yICVzLCBsZW49JWRcbiIsCisJCQkgJnBhcmFtWzZdLCByZXEtPnJxX2xkYXRhKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmVzdWx0ID0gMDsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CitzbWJfcHJvY19nZXRhdHRyX3RyYW5zMl9zdGQoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHN0cnVjdCBkZW50cnkgKmRpciwKKwkJCSAgICBzdHJ1Y3Qgc21iX2ZhdHRyICphdHRyKQoreworCXUxNiBkYXRlLCB0aW1lOworCWludCBvZmZfZGF0ZSA9IDAsIG9mZl90aW1lID0gMjsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpZiAoISAocmVxID0gc21iX2FsbG9jX3JlcXVlc3Qoc2VydmVyLCBQQUdFX1NJWkUpKSkKKwkJZ290byBvdXQ7CisKKwlyZXN1bHQgPSBzbWJfcHJvY19nZXRhdHRyX3RyYW5zMihzZXJ2ZXIsIGRpciwgcmVxLCBTTUJfSU5GT19TVEFOREFSRCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwkvKgorCSAqIEtsdWRnZSBhbGVydDogV2luIDk1IHN3YXBzIHRoZSBkYXRlIGFuZCB0aW1lIGZpZWxkLAorCSAqIGNvbnRyYXJ5IHRvIHRoZSBDSUZTIGRvY3MgYW5kIFdpbiBOVCBwcmFjdGljZS4KKwkgKi8KKwlpZiAoc2VydmVyLT5tbnQtPmZsYWdzICYgU01CX01PVU5UX1dJTjk1KSB7CisJCW9mZl9kYXRlID0gMjsKKwkJb2ZmX3RpbWUgPSAwOworCX0KKwlkYXRlID0gV1ZBTChyZXEtPnJxX2RhdGEsIG9mZl9kYXRlKTsKKwl0aW1lID0gV1ZBTChyZXEtPnJxX2RhdGEsIG9mZl90aW1lKTsKKwlhdHRyLT5mX2N0aW1lLnR2X3NlYyA9IGRhdGVfZG9zMnVuaXgoc2VydmVyLCBkYXRlLCB0aW1lKTsKKwlhdHRyLT5mX2N0aW1lLnR2X25zZWMgPSAwOworCisJZGF0ZSA9IFdWQUwocmVxLT5ycV9kYXRhLCA0ICsgb2ZmX2RhdGUpOworCXRpbWUgPSBXVkFMKHJlcS0+cnFfZGF0YSwgNCArIG9mZl90aW1lKTsKKwlhdHRyLT5mX2F0aW1lLnR2X3NlYyA9IGRhdGVfZG9zMnVuaXgoc2VydmVyLCBkYXRlLCB0aW1lKTsKKwlhdHRyLT5mX2F0aW1lLnR2X25zZWMgPSAwOworCisJZGF0ZSA9IFdWQUwocmVxLT5ycV9kYXRhLCA4ICsgb2ZmX2RhdGUpOworCXRpbWUgPSBXVkFMKHJlcS0+cnFfZGF0YSwgOCArIG9mZl90aW1lKTsKKwlhdHRyLT5mX210aW1lLnR2X3NlYyA9IGRhdGVfZG9zMnVuaXgoc2VydmVyLCBkYXRlLCB0aW1lKTsKKwlhdHRyLT5mX210aW1lLnR2X25zZWMgPSAwOworI2lmZGVmIFNNQkZTX0RFQlVHX1RJTUVTVEFNUAorCXByaW50ayhLRVJOX0RFQlVHICJnZXRhdHRyX3RyYW5zMjogJXMvJXMsIGRhdGU9JXgsIHRpbWU9JXgsIG10aW1lPSVsZFxuIiwKKwkgICAgICAgREVOVFJZX1BBVEgoZGlyKSwgZGF0ZSwgdGltZSwgYXR0ci0+Zl9tdGltZSk7CisjZW5kaWYKKwlhdHRyLT5mX3NpemUgPSBEVkFMKHJlcS0+cnFfZGF0YSwgMTIpOworCWF0dHItPmF0dHIgPSBXVkFMKHJlcS0+cnFfZGF0YSwgMjApOworCitvdXRfZnJlZToKKwlzbWJfcnB1dChyZXEpOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl9wcm9jX2dldGF0dHJfdHJhbnMyX2FsbChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IGRlbnRyeSAqZGlyLAorCQkJICAgIHN0cnVjdCBzbWJfZmF0dHIgKmF0dHIpCit7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgUEFHRV9TSVpFKSkpCisJCWdvdG8gb3V0OworCisJcmVzdWx0ID0gc21iX3Byb2NfZ2V0YXR0cl90cmFuczIoc2VydmVyLCBkaXIsIHJlcSwKKwkJCQkJIFNNQl9RVUVSWV9GSUxFX0FMTF9JTkZPKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKworCWF0dHItPmZfY3RpbWUgPSBzbWJfbnR1dGMydW5peHV0YyhMVkFMKHJlcS0+cnFfZGF0YSwgMCkpOworCWF0dHItPmZfYXRpbWUgPSBzbWJfbnR1dGMydW5peHV0YyhMVkFMKHJlcS0+cnFfZGF0YSwgOCkpOworCWF0dHItPmZfbXRpbWUgPSBzbWJfbnR1dGMydW5peHV0YyhMVkFMKHJlcS0+cnFfZGF0YSwgMTYpKTsKKwkvKiBjaGFuZ2UgKDI0KSAqLworCWF0dHItPmF0dHIgPSBXVkFMKHJlcS0+cnFfZGF0YSwgMzIpOworCS8qIHBhZD8gKDM0KSAqLworCS8qIGFsbG9jYXRlZCBzaXplICg0MCkgKi8KKwlhdHRyLT5mX3NpemUgPSBMVkFMKHJlcS0+cnFfZGF0YSwgNDgpOworCitvdXRfZnJlZToKKwlzbWJfcnB1dChyZXEpOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl9wcm9jX2dldGF0dHJfdW5peChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IGRlbnRyeSAqZGlyLAorCQkgICAgICBzdHJ1Y3Qgc21iX2ZhdHRyICphdHRyKQoreworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWlmICghIChyZXEgPSBzbWJfYWxsb2NfcmVxdWVzdChzZXJ2ZXIsIFBBR0VfU0laRSkpKQorCQlnb3RvIG91dDsKKworCXJlc3VsdCA9IHNtYl9wcm9jX2dldGF0dHJfdHJhbnMyKHNlcnZlciwgZGlyLCByZXEsCisJCQkJCSBTTUJfUVVFUllfRklMRV9VTklYX0JBU0lDKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKworCXNtYl9kZWNvZGVfdW5peF9iYXNpYyhhdHRyLCBzZXJ2ZXIsIHJlcS0+cnFfZGF0YSk7CisKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludAorc21iX3Byb2NfZ2V0YXR0cl85NShzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IGRlbnRyeSAqZGlyLAorCQkgICAgc3RydWN0IHNtYl9mYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGlyLT5kX2lub2RlOworCWludCByZXN1bHQ7CisKKwkvKiBGSVhNRTogd2h5IG5vdCB1c2UgdGhlICJhbGwiIHZlcnNpb24/ICovCisJcmVzdWx0ID0gc21iX3Byb2NfZ2V0YXR0cl90cmFuczJfc3RkKHNlcnZlciwgZGlyLCBhdHRyKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIE5vbmUgb2YgdGhlIGdldGF0dHIgdmVyc2lvbnMgaGVyZSBjYW4gbWFrZSB3aW45eCByZXR1cm4gdGhlIHJpZ2h0CisJICogZmlsZXNpemUgaWYgdGhlcmUgYXJlIGNoYW5nZXMgbWFkZSB0byBhbiBvcGVuIGZpbGUuCisJICogQSBzZWVrLXRvLWVuZCBkb2VzIHJldHVybiB0aGUgcmlnaHQgc2l6ZSwgYnV0IHdlIG9ubHkgbmVlZCB0byBkbworCSAqIHRoYXQgb24gZmlsZXMgd2UgaGF2ZSB3cml0dGVuLgorCSAqLworCWlmIChpbm9kZSAmJiBTTUJfSShpbm9kZSktPmZsYWdzICYgU01CX0ZfTE9DQUxXUklURSAmJgorCSAgICBzbWJfaXNfb3Blbihpbm9kZSkpCisJeworCQlfX3UxNiBmaWxlaWQgPSBTTUJfSShpbm9kZSktPmZpbGVpZDsKKwkJYXR0ci0+Zl9zaXplID0gc21iX3Byb2Nfc2VlayhzZXJ2ZXIsIGZpbGVpZCwgMiwgMCk7CisJfQorCitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludAorc21iX3Byb2Nfb3BzX3dhaXQoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpCit7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHNlcnZlci0+Y29ubl93cSwKKwkJCQlzZXJ2ZXItPmNvbm5fY29tcGxldGUsIDMwKkhaKTsKKworCWlmICghcmVzdWx0IHx8IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzbWJfcHJvY19nZXRhdHRyX251bGwoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHN0cnVjdCBkZW50cnkgKmRpciwKKwkJCSAgc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIpCit7CisJaW50IHJlc3VsdDsKKworCWlmIChzbWJfcHJvY19vcHNfd2FpdChzZXJ2ZXIpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlzbWJfaW5pdF9kaXJlbnQoc2VydmVyLCBmYXR0cik7CisJcmVzdWx0ID0gc2VydmVyLT5vcHMtPmdldGF0dHIoc2VydmVyLCBkaXIsIGZhdHRyKTsKKwlzbWJfZmluaXNoX2RpcmVudChzZXJ2ZXIsIGZhdHRyKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl9wcm9jX3JlYWRkaXJfbnVsbChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpciwKKwkJICAgICAgc3RydWN0IHNtYl9jYWNoZV9jb250cm9sICpjdGwpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkoZmlscC0+Zl9kZW50cnkpOworCisJaWYgKHNtYl9wcm9jX29wc193YWl0KHNlcnZlcikgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBzZXJ2ZXItPm9wcy0+cmVhZGRpcihmaWxwLCBkaXJlbnQsIGZpbGxkaXIsIGN0bCk7Cit9CisKK2ludAorc21iX3Byb2NfZ2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkaXIsIHN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KGRpcik7CisJaW50IHJlc3VsdDsKKworCXNtYl9pbml0X2RpcmVudChzZXJ2ZXIsIGZhdHRyKTsKKwlyZXN1bHQgPSBzZXJ2ZXItPm9wcy0+Z2V0YXR0cihzZXJ2ZXIsIGRpciwgZmF0dHIpOworCXNtYl9maW5pc2hfZGlyZW50KHNlcnZlciwgZmF0dHIpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogQmVjYXVzZSBvZiBidWdzIGluIHRoZSBjb3JlIHByb3RvY29sLCB3ZSB1c2UgdGhpcyBvbmx5IHRvIHNldAorICogYXR0cmlidXRlcy4gU2VlIHNtYl9wcm9jX3NldHRpbWUoKSBiZWxvdyBmb3IgdGltZXN0YW1wIGhhbmRsaW5nLgorICoKKyAqIEJ1Z3MgTm90ZWQ6CisgKiAoMSkgSWYgbXRpbWUgaXMgbm9uLXplcm8sIGJvdGggV2luIDMuMSBhbmQgV2luIDk1IGZhaWwKKyAqIHdpdGggYW4gdW5kb2N1bWVudGVkIGVycm9yIChFUlJET1MgY29kZSA1MCkuIFNldHRpbmcKKyAqIG10aW1lIHRvIDAgYWxsb3dzIHRoZSBhdHRyaWJ1dGVzIHRvIGJlIHNldC4KKyAqICgyKSBUaGUgZXh0cmEgcGFyYW1ldGVycyBmb2xsb3dpbmcgdGhlIG5hbWUgc3RyaW5nIGFyZW4ndAorICogaW4gdGhlIENJRlMgZG9jcywgYnV0IHNlZW0gdG8gYmUgbmVjZXNzYXJ5IGZvciBvcGVyYXRpb24uCisgKi8KK3N0YXRpYyBpbnQKK3NtYl9wcm9jX3NldGF0dHJfY29yZShzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICAgICBfX3UxNiBhdHRyKQoreworCWNoYXIgKnA7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgUEFHRV9TSVpFKSkpCisJCWdvdG8gb3V0OworCisJcCA9IHNtYl9zZXR1cF9oZWFkZXIocmVxLCBTTUJzZXRhdHIsIDgsIDApOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YwLCBhdHRyKTsKKwlEU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MSwgMCk7IC8qIG10aW1lICovCisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djMsIDApOyAvKiByZXNlcnZlZCB2YWx1ZXMgKi8KKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2NCwgMCk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djUsIDApOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3Y2LCAwKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2NywgMCk7CisJcmVzdWx0ID0gc21iX3NpbXBsZV9lbmNvZGVfcGF0aChyZXEsICZwLCBkZW50cnksIE5VTEwpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCWlmIChwICsgMiA+IChjaGFyICopcmVxLT5ycV9idWZmZXIgKyByZXEtPnJxX2J1ZnNpemUpIHsKKwkJcmVzdWx0ID0gLUVOQU1FVE9PTE9ORzsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisJKnArKyA9IDQ7CisJKnArKyA9IDA7CisJc21iX3NldHVwX2JjYyhyZXEsIHApOworCisJcmVzdWx0ID0gc21iX3JlcXVlc3Rfb2socmVxLCBTTUJzZXRhdHIsIDAsIDApOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCXJlc3VsdCA9IDA7CisKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIEJlY2F1c2Ugb2YgYnVncyBpbiB0aGUgdHJhbnMyIHNldGF0dHIgbWVzc2FnZXMsIHdlIG11c3Qgc2V0CisgKiBhdHRyaWJ1dGVzIGFuZCB0aW1lc3RhbXBzIHNlcGFyYXRlbHkuIFRoZSBjb3JlIFNNQnNldGF0cgorICogbWVzc2FnZSBzZWVtcyB0byBiZSB0aGUgb25seSByZWxpYWJsZSB3YXkgdG8gc2V0IGF0dHJpYnV0ZXMuCisgKi8KK2ludAorc21iX3Byb2Nfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkaXIsIHN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KGRpcik7CisJaW50IHJlc3VsdDsKKworCVZFUkJPU0UoInNldHRpbmcgJXMvJXMsIG9wZW49JWRcbiIsIAorCQlERU5UUllfUEFUSChkaXIpLCBzbWJfaXNfb3BlbihkaXItPmRfaW5vZGUpKTsKKwlyZXN1bHQgPSBzbWJfcHJvY19zZXRhdHRyX2NvcmUoc2VydmVyLCBkaXIsIGZhdHRyLT5hdHRyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogU2V0cyB0aGUgdGltZXN0YW1wcyBmb3IgYW4gZmlsZSBvcGVuIHdpdGggd3JpdGUgcGVybWlzc2lvbnMuCisgKi8KK3N0YXRpYyBpbnQKK3NtYl9wcm9jX3NldGF0dHJfZXh0KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLAorCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgc21iX2ZhdHRyICpmYXR0cikKK3sKKwlfX3UxNiBkYXRlLCB0aW1lOworCWludCByZXN1bHQ7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWlmICghIChyZXEgPSBzbWJfYWxsb2NfcmVxdWVzdChzZXJ2ZXIsIDApKSkKKwkJZ290byBvdXQ7CisKKwlzbWJfc2V0dXBfaGVhZGVyKHJlcSwgU01Cc2V0YXR0ckUsIDcsIDApOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YwLCBTTUJfSShpbm9kZSktPmZpbGVpZCk7CisJLyogV2UgZG9uJ3QgY2hhbmdlIHRoZSBjcmVhdGlvbiB0aW1lICovCisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djEsIDApOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YyLCAwKTsKKwlkYXRlX3VuaXgyZG9zKHNlcnZlciwgZmF0dHItPmZfYXRpbWUudHZfc2VjLCAmZGF0ZSwgJnRpbWUpOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YzLCBkYXRlKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2NCwgdGltZSk7CisJZGF0ZV91bml4MmRvcyhzZXJ2ZXIsIGZhdHRyLT5mX210aW1lLnR2X3NlYywgJmRhdGUsICZ0aW1lKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2NSwgZGF0ZSk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djYsIHRpbWUpOworI2lmZGVmIFNNQkZTX0RFQlVHX1RJTUVTVEFNUAorCXByaW50ayhLRVJOX0RFQlVHICJzbWJfcHJvY19zZXRhdHRyX2V4dDogZGF0ZT0lZCwgdGltZT0lZCwgbXRpbWU9JWxkXG4iLAorCSAgICAgICBkYXRlLCB0aW1lLCBmYXR0ci0+Zl9tdGltZSk7CisjZW5kaWYKKworCXJlcS0+cnFfZmxhZ3MgfD0gU01CX1JFUV9OT1JFVFJZOworCXJlc3VsdCA9IHNtYl9yZXF1ZXN0X29rKHJlcSwgU01Cc2V0YXR0ckUsIDAsIDApOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCXJlc3VsdCA9IDA7CitvdXRfZnJlZToKKwlzbWJfcnB1dChyZXEpOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBCdWdzIE5vdGVkOgorICogKDEpIFRoZSBUUkFOU0FDVDJfU0VUUEFUSElORk8gbWVzc2FnZSB1bmRlciBXaW4gTlQgNC4wIGRvZXNuJ3QKKyAqIHNldCB0aGUgZmlsZSdzIGF0dHJpYnV0ZSBmbGFncy4KKyAqLworc3RhdGljIGludAorc21iX3Byb2Nfc2V0YXR0cl90cmFuczIoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsCisJCQlzdHJ1Y3QgZGVudHJ5ICpkaXIsIHN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyKQoreworCV9fdTE2IGRhdGUsIHRpbWU7CisJY2hhciAqcCwgKnBhcmFtOworCWludCByZXN1bHQ7CisJY2hhciBkYXRhWzI2XTsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgUEFHRV9TSVpFKSkpCisJCWdvdG8gb3V0OworCXBhcmFtID0gcmVxLT5ycV9idWZmZXI7CisKKwlXU0VUKHBhcmFtLCAwLCAxKTsJLyogSW5mbyBsZXZlbCBTTUJfSU5GT19TVEFOREFSRCAqLworCURTRVQocGFyYW0sIDIsIDApOworCXJlc3VsdCA9IHNtYl9lbmNvZGVfcGF0aChzZXJ2ZXIsIHBhcmFtKzYsIFNNQl9NQVhQQVRITEVOKzEsIGRpciwgTlVMTCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJcCA9IHBhcmFtICsgNiArIHJlc3VsdDsKKworCVdTRVQoZGF0YSwgMCwgMCk7IC8qIGNyZWF0aW9uIHRpbWUgKi8KKwlXU0VUKGRhdGEsIDIsIDApOworCWRhdGVfdW5peDJkb3Moc2VydmVyLCBmYXR0ci0+Zl9hdGltZS50dl9zZWMsICZkYXRlLCAmdGltZSk7CisJV1NFVChkYXRhLCA0LCBkYXRlKTsKKwlXU0VUKGRhdGEsIDYsIHRpbWUpOworCWRhdGVfdW5peDJkb3Moc2VydmVyLCBmYXR0ci0+Zl9tdGltZS50dl9zZWMsICZkYXRlLCAmdGltZSk7CisJV1NFVChkYXRhLCA4LCBkYXRlKTsKKwlXU0VUKGRhdGEsIDEwLCB0aW1lKTsKKyNpZmRlZiBTTUJGU19ERUJVR19USU1FU1RBTVAKKwlwcmludGsoS0VSTl9ERUJVRyAic2V0YXR0cl90cmFuczI6ICVzLyVzLCBkYXRlPSV4LCB0aW1lPSV4LCBtdGltZT0lbGRcbiIsIAorCSAgICAgICBERU5UUllfUEFUSChkaXIpLCBkYXRlLCB0aW1lLCBmYXR0ci0+Zl9tdGltZSk7CisjZW5kaWYKKwlEU0VUKGRhdGEsIDEyLCAwKTsgLyogc2l6ZSAqLworCURTRVQoZGF0YSwgMTYsIDApOyAvKiBibGtzaXplICovCisJV1NFVChkYXRhLCAyMCwgMCk7IC8qIGF0dHIgKi8KKwlEU0VUKGRhdGEsIDIyLCAwKTsgLyogVUxPTkcgRUEgc2l6ZSAqLworCisJcmVxLT5ycV90cmFuczJfY29tbWFuZCA9IFRSQU5TQUNUMl9TRVRQQVRISU5GTzsKKwlyZXEtPnJxX2xkYXRhID0gMjY7CisJcmVxLT5ycV9kYXRhICA9IGRhdGE7CisJcmVxLT5ycV9scGFybSA9IHAgLSBwYXJhbTsKKwlyZXEtPnJxX3Bhcm0gID0gcGFyYW07CisJcmVxLT5ycV9mbGFncyA9IDA7CisJcmVzdWx0ID0gc21iX2FkZF9yZXF1ZXN0KHJlcSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJcmVzdWx0ID0gMDsKKwlpZiAocmVxLT5ycV9yY2xzICE9IDApCisJCXJlc3VsdCA9IHNtYl9lcnJubyhyZXEpOworCitvdXRfZnJlZToKKwlzbWJfcnB1dChyZXEpOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBBVFRSX01PREUgICAgICAweDAwMQorICogQVRUUl9VSUQgICAgICAgMHgwMDIKKyAqIEFUVFJfR0lEICAgICAgIDB4MDA0CisgKiBBVFRSX1NJWkUgICAgICAweDAwOAorICogQVRUUl9BVElNRSAgICAgMHgwMTAKKyAqIEFUVFJfTVRJTUUgICAgIDB4MDIwCisgKiBBVFRSX0NUSU1FICAgICAweDA0MAorICogQVRUUl9BVElNRV9TRVQgMHgwODAKKyAqIEFUVFJfTVRJTUVfU0VUIDB4MTAwCisgKiBBVFRSX0ZPUkNFICAgICAweDIwMAkKKyAqIEFUVFJfQVRUUl9GTEFHIDB4NDAwCisgKgorICogbWFqb3IvbWlub3Igc2hvdWxkIG9ubHkgYmUgc2V0IGJ5IG1rbm9kLgorICovCitpbnQKK3NtYl9wcm9jX3NldGF0dHJfdW5peChzdHJ1Y3QgZGVudHJ5ICpkLCBzdHJ1Y3QgaWF0dHIgKmF0dHIsCisJCSAgICAgIHVuc2lnbmVkIGludCBtYWpvciwgdW5zaWduZWQgaW50IG1pbm9yKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KGQpOworCXU2NCBudHRpbWU7CisJY2hhciAqcCwgKnBhcmFtOworCWludCByZXN1bHQ7CisJY2hhciBkYXRhWzEwMF07CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWlmICghIChyZXEgPSBzbWJfYWxsb2NfcmVxdWVzdChzZXJ2ZXIsIFBBR0VfU0laRSkpKQorCQlnb3RvIG91dDsKKwlwYXJhbSA9IHJlcS0+cnFfYnVmZmVyOworCisJREVCVUcxKCJ2YWxpZCBmbGFncyA9IDB4JTA0eFxuIiwgYXR0ci0+aWFfdmFsaWQpOworCisJV1NFVChwYXJhbSwgMCwgU01CX1NFVF9GSUxFX1VOSVhfQkFTSUMpOworCURTRVQocGFyYW0sIDIsIDApOworCXJlc3VsdCA9IHNtYl9lbmNvZGVfcGF0aChzZXJ2ZXIsIHBhcmFtKzYsIFNNQl9NQVhQQVRITEVOKzEsIGQsIE5VTEwpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCXAgPSBwYXJhbSArIDYgKyByZXN1bHQ7CisKKwkvKiAwIEwgZmlsZSBzaXplIGluIGJ5dGVzICovCisJLyogOCBMIGZpbGUgc2l6ZSBvbiBkaXNrIGluIGJ5dGVzIChibG9jayBjb3VudCkgKi8KKwkvKiA0MCBMIHVpZCAqLworCS8qIDQ4IEwgZ2lkICovCisJLyogNTYgVyBmaWxlIHR5cGUgZW51bSAqLworCS8qIDYwIEwgZGV2bWFqb3IgKi8KKwkvKiA2OCBMIGRldm1pbm9yICovCisJLyogNzYgTCB1bmlxdWUgSUQgKGlub2RlKSAqLworCS8qIDg0IEwgcGVybWlzc2lvbnMgKi8KKwkvKiA5MiBMIGxpbmsgY291bnQgKi8KKwlMU0VUKGRhdGEsIDAsIFNNQl9TSVpFX05PX0NIQU5HRSk7CisJTFNFVChkYXRhLCA4LCBTTUJfU0laRV9OT19DSEFOR0UpOworCUxTRVQoZGF0YSwgMTYsIFNNQl9USU1FX05PX0NIQU5HRSk7CisJTFNFVChkYXRhLCAyNCwgU01CX1RJTUVfTk9fQ0hBTkdFKTsKKwlMU0VUKGRhdGEsIDMyLCBTTUJfVElNRV9OT19DSEFOR0UpOworCUxTRVQoZGF0YSwgNDAsIFNNQl9VSURfTk9fQ0hBTkdFKTsKKwlMU0VUKGRhdGEsIDQ4LCBTTUJfR0lEX05PX0NIQU5HRSk7CisJTFNFVChkYXRhLCA1Niwgc21iX2ZpbGV0eXBlX2Zyb21fbW9kZShhdHRyLT5pYV9tb2RlKSk7CisJTFNFVChkYXRhLCA2MCwgbWFqb3IpOworCUxTRVQoZGF0YSwgNjgsIG1pbm9yKTsKKwlMU0VUKGRhdGEsIDc2LCAwKTsKKwlMU0VUKGRhdGEsIDg0LCBTTUJfTU9ERV9OT19DSEFOR0UpOworCUxTRVQoZGF0YSwgOTIsIDApOworCisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CisJCUxTRVQoZGF0YSwgMCwgYXR0ci0+aWFfc2l6ZSk7CisJCUxTRVQoZGF0YSwgOCwgMCk7IC8qIGNhbid0IHNldCBhbnl3YXkgKi8KKwl9CisKKwkvKgorCSAqIEZJWE1FOiBjaGVjayB0aGUgY29udmVyc2lvbiBmdW5jdGlvbiBpdCB0aGUgY29ycmVjdCBvbmUKKwkgKgorCSAqIHdlIGNhbid0IHNldCBjdGltZSBidXQgd2UgbWlnaHQgYXMgd2VsbCBwYXNzIHRoaXMgdG8gdGhlIHNlcnZlcgorCSAqIGFuZCBsZXQgaXQgaWdub3JlIGl0LgorCSAqLworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfQ1RJTUUpIHsKKwkJbnR0aW1lID0gc21iX3VuaXh1dGMybnR1dGMoYXR0ci0+aWFfY3RpbWUpOworCQlMU0VUKGRhdGEsIDE2LCBudHRpbWUpOworCX0KKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0FUSU1FKSB7CisJCW50dGltZSA9IHNtYl91bml4dXRjMm50dXRjKGF0dHItPmlhX2F0aW1lKTsKKwkJTFNFVChkYXRhLCAyNCwgbnR0aW1lKTsKKwl9CisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NVElNRSkgeworCQludHRpbWUgPSBzbWJfdW5peHV0YzJudHV0YyhhdHRyLT5pYV9tdGltZSk7CisJCUxTRVQoZGF0YSwgMzIsIG50dGltZSk7CisJfQorCQorCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKSB7CisJCUxTRVQoZGF0YSwgNDAsIGF0dHItPmlhX3VpZCk7CisJfQorCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfR0lEKSB7CisJCUxTRVQoZGF0YSwgNDgsIGF0dHItPmlhX2dpZCk7IAorCX0KKwkKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpIHsKKwkJTFNFVChkYXRhLCA4NCwgYXR0ci0+aWFfbW9kZSk7CisJfQorCisJcmVxLT5ycV90cmFuczJfY29tbWFuZCA9IFRSQU5TQUNUMl9TRVRQQVRISU5GTzsKKwlyZXEtPnJxX2xkYXRhID0gMTAwOworCXJlcS0+cnFfZGF0YSAgPSBkYXRhOworCXJlcS0+cnFfbHBhcm0gPSBwIC0gcGFyYW07CisJcmVxLT5ycV9wYXJtICA9IHBhcmFtOworCXJlcS0+cnFfZmxhZ3MgPSAwOworCXJlc3VsdCA9IHNtYl9hZGRfcmVxdWVzdChyZXEpOworCitvdXRfZnJlZToKKwlzbWJfcnB1dChyZXEpOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIFNldCB0aGUgbW9kaWZ5IGFuZCBhY2Nlc3MgdGltZXN0YW1wcyBmb3IgYSBmaWxlLgorICoKKyAqIEluY3JlZGlibHkgZW5vdWdoLCBpbiBhbGwgb2YgU01CIHRoZXJlIGlzIG5vIG1lc3NhZ2UgdG8gYWxsb3cKKyAqIHNldHRpbmcgYm90aCBhdHRyaWJ1dGVzIGFuZCB0aW1lc3RhbXBzIGF0IG9uY2UuIAorICoKKyAqIEJ1Z3MgTm90ZWQ6CisgKiAoMSkgV2luIDk1IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgVFJBTlNBQ1QyX1NFVEZJTEVJTkZPIG1lc3NhZ2UgCisgKiB3aXRoIGluZm8gbGV2ZWwgMSAoSU5GT19TVEFOREFSRCkuCisgKiAoMikgV2luIDk1IHNlZW1zIG5vdCB0byBzdXBwb3J0IHNldHRpbmcgZGlyZWN0b3J5IHRpbWVzdGFtcHMuCisgKiAoMykgVW5kZXIgdGhlIGNvcmUgcHJvdG9jb2wgYXBwYXJlbnRseSB0aGUgb25seSB3YXkgdG8gc2V0IHRoZQorICogdGltZXN0YW1wIGlzIHRvIG9wZW4gYW5kIGNsb3NlIHRoZSBmaWxlLgorICovCitpbnQKK3NtYl9wcm9jX3NldHRpbWUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qgc21iX2ZhdHRyICpmYXR0cikKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2RlbnRyeShkZW50cnkpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IHJlc3VsdDsKKworCVZFUkJPU0UoInNldHRpbmcgJXMvJXMsIG9wZW49JWRcbiIsCisJCURFTlRSWV9QQVRIKGRlbnRyeSksIHNtYl9pc19vcGVuKGlub2RlKSk7CisKKwkvKiBzZXR0aW5nIHRoZSB0aW1lIG9uIGEgV2luOTUgc2VydmVyIGZhaWxzICh0cmlkZ2UpICovCisJaWYgKHNlcnZlci0+b3B0LnByb3RvY29sID49IFNNQl9QUk9UT0NPTF9MQU5NQU4yICYmIAorCSAgICAhKHNlcnZlci0+bW50LT5mbGFncyAmIFNNQl9NT1VOVF9XSU45NSkpIHsKKwkJaWYgKHNtYl9pc19vcGVuKGlub2RlKSAmJiBTTUJfSShpbm9kZSktPmFjY2VzcyAhPSBTTUJfT19SRE9OTFkpCisJCQlyZXN1bHQgPSBzbWJfcHJvY19zZXRhdHRyX2V4dChzZXJ2ZXIsIGlub2RlLCBmYXR0cik7CisJCWVsc2UKKwkJCXJlc3VsdCA9IHNtYl9wcm9jX3NldGF0dHJfdHJhbnMyKHNlcnZlciwgZGVudHJ5LCBmYXR0cik7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRmFpbCBzaWxlbnRseSBvbiBkaXJlY3RvcmllcyAuLi4gdGltZXN0YW1wIGNhbid0IGJlIHNldD8KKwkJICovCisJCXJlc3VsdCA9IDA7CisJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCQkvKgorCQkJICogU2V0IHRoZSBtdGltZSBieSBvcGVuaW5nIGFuZCBjbG9zaW5nIHRoZSBmaWxlLgorCQkJICogTm90ZSB0aGF0IHRoZSBmaWxlIGlzIG9wZW5lZCByZWFkLW9ubHksIGJ1dCB0aGlzCisJCQkgKiBzdGlsbCBhbGxvd3MgdXMgdG8gc2V0IHRoZSBkYXRlICh0cmlkZ2UpCisJCQkgKi8KKwkJCXJlc3VsdCA9IC1FQUNDRVM7CisJCQlpZiAoIXNtYl9pc19vcGVuKGlub2RlKSkKKwkJCQlzbWJfcHJvY19vcGVuKHNlcnZlciwgZGVudHJ5LCBTTUJfT19SRE9OTFkpOworCQkJaWYgKHNtYl9pc19vcGVuKGlub2RlKSkgeworCQkJCWlub2RlLT5pX210aW1lID0gZmF0dHItPmZfbXRpbWU7CisJCQkJcmVzdWx0ID0gc21iX3Byb2NfY2xvc2VfaW5vZGUoc2VydmVyLCBpbm9kZSk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQKK3NtYl9wcm9jX2Rza2F0dHIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmF0dHIpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBTTUJfU0Ioc2IpOworCWludCByZXN1bHQ7CisJY2hhciAqcDsKKwlsb25nIHVuaXQ7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWlmICghIChyZXEgPSBzbWJfYWxsb2NfcmVxdWVzdChzZXJ2ZXIsIDApKSkKKwkJZ290byBvdXQ7CisKKwlzbWJfc2V0dXBfaGVhZGVyKHJlcSwgU01CZHNrYXR0ciwgMCwgMCk7CisJaWYgKChyZXN1bHQgPSBzbWJfcmVxdWVzdF9vayhyZXEsIFNNQmRza2F0dHIsIDUsIDApKSA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJcCA9IFNNQl9WV1YocmVxLT5ycV9oZWFkZXIpOworCXVuaXQgPSAoV1ZBTChwLCAyKSAqIFdWQUwocCwgNCkpID4+IFNNQl9TVF9CTEtTSElGVDsKKwlhdHRyLT5mX2Jsb2NrcyA9IFdWQUwocCwgMCkgKiB1bml0OworCWF0dHItPmZfYnNpemUgID0gU01CX1NUX0JMS1NJWkU7CisJYXR0ci0+Zl9iYXZhaWwgPSBhdHRyLT5mX2JmcmVlID0gV1ZBTChwLCA2KSAqIHVuaXQ7CisJcmVzdWx0ID0gMDsKKworb3V0X2ZyZWU6CisJc21iX3JwdXQocmVxKTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQKK3NtYl9wcm9jX3JlYWRfbGluayhzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IGRlbnRyeSAqZCwKKwkJICAgY2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCWNoYXIgKnAsICpwYXJhbTsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCisJREVCVUcxKCJyZWFkbGluayBvZiAlcy8lc1xuIiwgREVOVFJZX1BBVEgoZCkpOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpZiAoISAocmVxID0gc21iX2FsbG9jX3JlcXVlc3Qoc2VydmVyLCBQQUdFX1NJWkUpKSkKKwkJZ290byBvdXQ7CisJcGFyYW0gPSByZXEtPnJxX2J1ZmZlcjsKKworCVdTRVQocGFyYW0sIDAsIFNNQl9RVUVSWV9GSUxFX1VOSVhfTElOSyk7CisJRFNFVChwYXJhbSwgMiwgMCk7CisJcmVzdWx0ID0gc21iX2VuY29kZV9wYXRoKHNlcnZlciwgcGFyYW0rNiwgU01CX01BWFBBVEhMRU4rMSwgZCwgTlVMTCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJcCA9IHBhcmFtICsgNiArIHJlc3VsdDsKKworCXJlcS0+cnFfdHJhbnMyX2NvbW1hbmQgPSBUUkFOU0FDVDJfUVBBVEhJTkZPOworCXJlcS0+cnFfbGRhdGEgPSAwOworCXJlcS0+cnFfZGF0YSAgPSBOVUxMOworCXJlcS0+cnFfbHBhcm0gPSBwIC0gcGFyYW07CisJcmVxLT5ycV9wYXJtICA9IHBhcmFtOworCXJlcS0+cnFfZmxhZ3MgPSAwOworCXJlc3VsdCA9IHNtYl9hZGRfcmVxdWVzdChyZXEpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCURFQlVHMSgiZm9yICVzOiByZXN1bHQ9JWQsIHJjbHM9JWQsIGVycj0lZFxuIiwKKwkJJnBhcmFtWzZdLCByZXN1bHQsIHJlcS0+cnFfcmNscywgcmVxLT5ycV9lcnIpOworCisJLyogY29weSBkYXRhIHVwIHRvIHRoZSBcMCBvciBidWZmZXIgbGVuZ3RoICovCisJcmVzdWx0ID0gbGVuOworCWlmIChyZXEtPnJxX2xkYXRhIDwgbGVuKQorCQlyZXN1bHQgPSByZXEtPnJxX2xkYXRhOworCXN0cm5jcHkoYnVmZmVyLCByZXEtPnJxX2RhdGEsIHJlc3VsdCk7CisKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogQ3JlYXRlIGEgc3ltbGluayBvYmplY3QgY2FsbGVkIGRlbnRyeSB3aGljaCBwb2ludHMgdG8gb2xkcGF0aC4KKyAqIFNhbWJhIGRvZXMgbm90IHBlcm1pdCBkYW5nbGluZyBsaW5rcyBidXQgcmV0dXJucyBhIHN1aXRhYmxlIGVycm9yIG1lc3NhZ2UuCisgKi8KK2ludAorc21iX3Byb2Nfc3ltbGluayhzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IGRlbnRyeSAqZCwKKwkJIGNvbnN0IGNoYXIgKm9sZHBhdGgpCit7CisJY2hhciAqcCwgKnBhcmFtOworCWludCByZXN1bHQ7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWlmICghIChyZXEgPSBzbWJfYWxsb2NfcmVxdWVzdChzZXJ2ZXIsIFBBR0VfU0laRSkpKQorCQlnb3RvIG91dDsKKwlwYXJhbSA9IHJlcS0+cnFfYnVmZmVyOworCisJV1NFVChwYXJhbSwgMCwgU01CX1NFVF9GSUxFX1VOSVhfTElOSyk7CisJRFNFVChwYXJhbSwgMiwgMCk7CisJcmVzdWx0ID0gc21iX2VuY29kZV9wYXRoKHNlcnZlciwgcGFyYW0gKyA2LCBTTUJfTUFYUEFUSExFTisxLCBkLCBOVUxMKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKwlwID0gcGFyYW0gKyA2ICsgcmVzdWx0OworCisJcmVxLT5ycV90cmFuczJfY29tbWFuZCA9IFRSQU5TQUNUMl9TRVRQQVRISU5GTzsKKwlyZXEtPnJxX2xkYXRhID0gc3RybGVuKG9sZHBhdGgpICsgMTsKKwlyZXEtPnJxX2RhdGEgID0gKGNoYXIgKikgb2xkcGF0aDsKKwlyZXEtPnJxX2xwYXJtID0gcCAtIHBhcmFtOworCXJlcS0+cnFfcGFybSAgPSBwYXJhbTsKKwlyZXEtPnJxX2ZsYWdzID0gMDsKKwlyZXN1bHQgPSBzbWJfYWRkX3JlcXVlc3QocmVxKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKworCURFQlVHMSgiZm9yICVzOiByZXN1bHQ9JWQsIHJjbHM9JWQsIGVycj0lZFxuIiwKKwkJJnBhcmFtWzZdLCByZXN1bHQsIHJlcS0+cnFfcmNscywgcmVxLT5ycV9lcnIpOworCXJlc3VsdCA9IDA7CisKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIENyZWF0ZSBhIGhhcmQgbGluayBvYmplY3QgY2FsbGVkIG5ld19kZW50cnkgd2hpY2ggcG9pbnRzIHRvIGRlbnRyeS4KKyAqLworaW50CitzbWJfcHJvY19saW5rKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJICAgICAgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwljaGFyICpwLCAqcGFyYW07CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgUEFHRV9TSVpFKSkpCisJCWdvdG8gb3V0OworCXBhcmFtID0gcmVxLT5ycV9idWZmZXI7CisKKwlXU0VUKHBhcmFtLCAwLCBTTUJfU0VUX0ZJTEVfVU5JWF9ITElOSyk7CisJRFNFVChwYXJhbSwgMiwgMCk7CisJcmVzdWx0ID0gc21iX2VuY29kZV9wYXRoKHNlcnZlciwgcGFyYW0gKyA2LCBTTUJfTUFYUEFUSExFTisxLAorCQkJCSBuZXdfZGVudHJ5LCBOVUxMKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKwlwID0gcGFyYW0gKyA2ICsgcmVzdWx0OworCisJLyogR3JyLCBwb2ludGxlc3Mgc2VwYXJhdGlvbiBvZiBwYXJhbWV0ZXJzIGFuZCBkYXRhIC4uLiAqLworCXJlcS0+cnFfZGF0YSA9IHA7CisJcmVxLT5ycV9sZGF0YSA9IHNtYl9lbmNvZGVfcGF0aChzZXJ2ZXIsIHAsIFNNQl9NQVhQQVRITEVOKzEsCisJCQkJCWRlbnRyeSwgTlVMTCk7CisKKwlyZXEtPnJxX3RyYW5zMl9jb21tYW5kID0gVFJBTlNBQ1QyX1NFVFBBVEhJTkZPOworCXJlcS0+cnFfbHBhcm0gPSBwIC0gcGFyYW07CisJcmVxLT5ycV9wYXJtICA9IHBhcmFtOworCXJlcS0+cnFfZmxhZ3MgPSAwOworCXJlc3VsdCA9IHNtYl9hZGRfcmVxdWVzdChyZXEpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJREVCVUcxKCJmb3IgJXM6IHJlc3VsdD0lZCwgcmNscz0lZCwgZXJyPSVkXG4iLAorCSAgICAgICAmcGFyYW1bNl0sIHJlc3VsdCwgcmVxLT5ycV9yY2xzLCByZXEtPnJxX2Vycik7CisJcmVzdWx0ID0gMDsKKworb3V0X2ZyZWU6CisJc21iX3JwdXQocmVxKTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CitzbWJfcHJvY19xdWVyeV9jaWZzdW5peChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcikKK3sKKwlpbnQgcmVzdWx0OworCWludCBtYWpvciwgbWlub3I7CisJdTY0IGNhcHM7CisJY2hhciBwYXJhbVsyXTsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgMTAwKSkpCisJCWdvdG8gb3V0OworCisJV1NFVChwYXJhbSwgMCwgU01CX1FVRVJZX0NJRlNfVU5JWF9JTkZPKTsKKworCXJlcS0+cnFfdHJhbnMyX2NvbW1hbmQgPSBUUkFOU0FDVDJfUUZTSU5GTzsKKwlyZXEtPnJxX2xkYXRhID0gMDsKKwlyZXEtPnJxX2RhdGEgID0gTlVMTDsKKwlyZXEtPnJxX2xwYXJtID0gMjsKKwlyZXEtPnJxX3Bhcm0gID0gcGFyYW07CisJcmVxLT5ycV9mbGFncyA9IDA7CisJcmVzdWx0ID0gc21iX2FkZF9yZXF1ZXN0KHJlcSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlpZiAocmVxLT5ycV9sZGF0YSA8IDEyKSB7CisJCVBBUkFOT0lBKCJOb3QgZW5vdWdoIGRhdGFcbiIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKwltYWpvciA9IFdWQUwocmVxLT5ycV9kYXRhLCAwKTsKKwltaW5vciA9IFdWQUwocmVxLT5ycV9kYXRhLCAyKTsKKworCURFQlVHMSgiU2VydmVyIGltcGxlbWVudHMgQ0lGUyBFeHRlbnNpb25zIGZvciBVTklYIHN5c3RlbXMgdiVkLiVkXG4iLAorCSAgICAgICBtYWpvciwgbWlub3IpOworCS8qIEZJWE1FOiB2ZXJpZnkgdGhhdCB3ZSBhcmUgb2sgd2l0aCB0aGlzIG1ham9yL21pbm9yPyAqLworCisJY2FwcyA9IExWQUwocmVxLT5ycV9kYXRhLCA0KTsKKwlERUJVRzEoIlNlcnZlciBjYXBhYmlsaXRpZXMgMHglMDE2bGx4XG4iLCBjYXBzKTsKKworb3V0X2ZyZWU6CisJc21iX3JwdXQocmVxKTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyB2b2lkCitpbnN0YWxsX29wcyhzdHJ1Y3Qgc21iX29wcyAqZHN0LCBzdHJ1Y3Qgc21iX29wcyAqc3JjKQoreworCW1lbWNweShkc3QsIHNyYywgc2l6ZW9mKHZvaWQgKikgKiBTTUJfT1BTX05VTV9TVEFUSUMpOworfQorCisvKiA8IExBTk1BTjIgKi8KK3N0YXRpYyBzdHJ1Y3Qgc21iX29wcyBzbWJfb3BzX2NvcmUgPQoreworCS5yZWFkCQk9IHNtYl9wcm9jX3JlYWQsCisJLndyaXRlCQk9IHNtYl9wcm9jX3dyaXRlLAorCS5yZWFkZGlyCT0gc21iX3Byb2NfcmVhZGRpcl9zaG9ydCwKKwkuZ2V0YXR0cgk9IHNtYl9wcm9jX2dldGF0dHJfY29yZSwKKwkudHJ1bmNhdGUJPSBzbWJfcHJvY190cnVuYzMyLAorfTsKKworLyogTEFOTUFOMiwgT1MvMiwgb3RoZXJzPyAqLworc3RhdGljIHN0cnVjdCBzbWJfb3BzIHNtYl9vcHNfb3MyID0KK3sKKwkucmVhZAkJPSBzbWJfcHJvY19yZWFkLAorCS53cml0ZQkJPSBzbWJfcHJvY193cml0ZSwKKwkucmVhZGRpcgk9IHNtYl9wcm9jX3JlYWRkaXJfbG9uZywKKwkuZ2V0YXR0cgk9IHNtYl9wcm9jX2dldGF0dHJfdHJhbnMyX3N0ZCwKKwkudHJ1bmNhdGUJPSBzbWJfcHJvY190cnVuYzMyLAorfTsKKworLyogV2luOTUsIGFuZCBwb3NzaWJseSBzb21lIE5ldEFwcCB2ZXJzaW9ucyB0b28gKi8KK3N0YXRpYyBzdHJ1Y3Qgc21iX29wcyBzbWJfb3BzX3dpbjk1ID0KK3sKKwkucmVhZAkJPSBzbWJfcHJvY19yZWFkLCAgICAvKiBkb2VzIG5vdCBzdXBwb3J0IDEyd29yZCByZWFkWCAqLworCS53cml0ZQkJPSBzbWJfcHJvY193cml0ZSwKKwkucmVhZGRpcgk9IHNtYl9wcm9jX3JlYWRkaXJfbG9uZywKKwkuZ2V0YXR0cgk9IHNtYl9wcm9jX2dldGF0dHJfOTUsCisJLnRydW5jYXRlCT0gc21iX3Byb2NfdHJ1bmM5NSwKK307CisKKy8qIFNhbWJhLCBOVDQgYW5kIE5UNSAqLworc3RhdGljIHN0cnVjdCBzbWJfb3BzIHNtYl9vcHNfd2luTlQgPQoreworCS5yZWFkCQk9IHNtYl9wcm9jX3JlYWRYLAorCS53cml0ZQkJPSBzbWJfcHJvY193cml0ZVgsCisJLnJlYWRkaXIJPSBzbWJfcHJvY19yZWFkZGlyX2xvbmcsCisJLmdldGF0dHIJPSBzbWJfcHJvY19nZXRhdHRyX3RyYW5zMl9hbGwsCisJLnRydW5jYXRlCT0gc21iX3Byb2NfdHJ1bmM2NCwKK307CisKKy8qIFNhbWJhIHcvIHVuaXggZXh0ZW5zaW9ucy4gT3RoZXJzPyAqLworc3RhdGljIHN0cnVjdCBzbWJfb3BzIHNtYl9vcHNfdW5peCA9Cit7CisJLnJlYWQJCT0gc21iX3Byb2NfcmVhZFgsCisJLndyaXRlCQk9IHNtYl9wcm9jX3dyaXRlWCwKKwkucmVhZGRpcgk9IHNtYl9wcm9jX3JlYWRkaXJfbG9uZywKKwkuZ2V0YXR0cgk9IHNtYl9wcm9jX2dldGF0dHJfdW5peCwKKwkvKiBGSVhNRTogY29yZS9leHQvdGltZSBzZXRhdHRyIG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAhICovCisJLyogLnNldGF0dHIJPSBzbWJfcHJvY19zZXRhdHRyX3VuaXgsICovCisJLnRydW5jYXRlCT0gc21iX3Byb2NfdHJ1bmM2NCwKK307CisKKy8qIFBsYWNlIGhvbGRlciB1bnRpbCByZWFsIG9wcyBhcmUgaW4gcGxhY2UgKi8KK3N0YXRpYyBzdHJ1Y3Qgc21iX29wcyBzbWJfb3BzX251bGwgPQoreworCS5yZWFkZGlyCT0gc21iX3Byb2NfcmVhZGRpcl9udWxsLAorCS5nZXRhdHRyCT0gc21iX3Byb2NfZ2V0YXR0cl9udWxsLAorfTsKKwordm9pZCBzbWJfaW5zdGFsbF9udWxsX29wcyhzdHJ1Y3Qgc21iX29wcyAqb3BzKQoreworCWluc3RhbGxfb3BzKG9wcywgJnNtYl9vcHNfbnVsbCk7Cit9CmRpZmYgLS1naXQgYS9mcy9zbWJmcy9wcm90by5oIGIvZnMvc21iZnMvcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODY2ZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvc21iZnMvcHJvdG8uaApAQCAtMCwwICsxLDg3IEBACisvKgorICogIEF1dG9nZW5lcmF0ZWQgd2l0aCBjcHJvdG8gb246ICBTYXQgU2VwIDEzIDE3OjE4OjUxIENFU1QgMjAwMworICovCisKK3N0cnVjdCBzbWJfcmVxdWVzdDsKK3N0cnVjdCBzb2NrOworc3RydWN0IHN0YXRmczsKKworLyogcHJvYy5jICovCitleHRlcm4gaW50IHNtYl9zZXRjb2RlcGFnZShzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IHNtYl9ubHNfY29kZXBhZ2UgKmNwKTsKK2V4dGVybiBfX3UzMiBzbWJfbGVuKF9fdTggKnApOworZXh0ZXJuIGludCBzbWJfZ2V0X3JzaXplKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKTsKK2V4dGVybiBpbnQgc21iX2dldF93c2l6ZShzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcik7CitleHRlcm4gaW50IHNtYl9lcnJubyhzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSk7CitleHRlcm4gaW50IHNtYl9uZXdjb25uKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3Qgc21iX2Nvbm5fb3B0ICpvcHQpOworZXh0ZXJuIF9fdTggKnNtYl9zZXR1cF9oZWFkZXIoc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEsIF9fdTggY29tbWFuZCwgX191MTYgd2N0LCBfX3UxNiBiY2MpOworZXh0ZXJuIGludCBzbWJfb3BlbihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCB3aXNoKTsKK2V4dGVybiBpbnQgc21iX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vKTsKK2V4dGVybiBpbnQgc21iX2Nsb3NlX2ZpbGVpZChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fdTE2IGZpbGVpZCk7CitleHRlcm4gaW50IHNtYl9wcm9jX2NyZWF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fdTE2IGF0dHIsIHRpbWVfdCBjdGltZSwgX191MTYgKmZpbGVpZCk7CitleHRlcm4gaW50IHNtYl9wcm9jX212KHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpOworZXh0ZXJuIGludCBzbWJfcHJvY19ta2RpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworZXh0ZXJuIGludCBzbWJfcHJvY19ybWRpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworZXh0ZXJuIGludCBzbWJfcHJvY191bmxpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKK2V4dGVybiBpbnQgc21iX3Byb2NfZmx1c2goc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIF9fdTE2IGZpbGVpZCk7CitleHRlcm4gdm9pZCBzbWJfaW5pdF9yb290X2RpcmVudChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIsCisJCQkJIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworZXh0ZXJuIGludCBzbWJfcHJvY19nZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRpciwgc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIpOworZXh0ZXJuIGludCBzbWJfcHJvY19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRpciwgc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIpOworZXh0ZXJuIGludCBzbWJfcHJvY19zZXRhdHRyX3VuaXgoc3RydWN0IGRlbnRyeSAqZCwgc3RydWN0IGlhdHRyICphdHRyLCB1bnNpZ25lZCBpbnQgbWFqb3IsIHVuc2lnbmVkIGludCBtaW5vcik7CitleHRlcm4gaW50IHNtYl9wcm9jX3NldHRpbWUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qgc21iX2ZhdHRyICpmYXR0cik7CitleHRlcm4gaW50IHNtYl9wcm9jX2Rza2F0dHIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmF0dHIpOworZXh0ZXJuIGludCBzbWJfcHJvY19yZWFkX2xpbmsoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHN0cnVjdCBkZW50cnkgKmQsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbik7CitleHRlcm4gaW50IHNtYl9wcm9jX3N5bWxpbmsoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHN0cnVjdCBkZW50cnkgKmQsIGNvbnN0IGNoYXIgKm9sZHBhdGgpOworZXh0ZXJuIGludCBzbWJfcHJvY19saW5rKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpOworZXh0ZXJuIHZvaWQgc21iX2luc3RhbGxfbnVsbF9vcHMoc3RydWN0IHNtYl9vcHMgKm9wcyk7CisvKiBkaXIuYyAqLworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc21iX2Rpcl9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNtYl9kaXJfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzbWJfZGlyX2lub2RlX29wZXJhdGlvbnNfdW5peDsKK2V4dGVybiB2b2lkIHNtYl9uZXdfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CitleHRlcm4gdm9pZCBzbWJfcmVuZXdfdGltZXMoc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKKy8qIGNhY2hlLmMgKi8KK2V4dGVybiB2b2lkIHNtYl9pbnZhbGlkX2Rpcl9jYWNoZShzdHJ1Y3QgaW5vZGUgKmRpcik7CitleHRlcm4gdm9pZCBzbWJfaW52YWxpZGF0ZV9kaXJjYWNoZV9lbnRyaWVzKHN0cnVjdCBkZW50cnkgKnBhcmVudCk7CitleHRlcm4gc3RydWN0IGRlbnRyeSAqc21iX2RnZXRfZnBvcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgdW5zaWduZWQgbG9uZyBmcG9zKTsKK2V4dGVybiBpbnQgc21iX2ZpbGxfY2FjaGUoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIsIHN0cnVjdCBzbWJfY2FjaGVfY29udHJvbCAqY3RybCwgc3RydWN0IHFzdHIgKnFuYW1lLCBzdHJ1Y3Qgc21iX2ZhdHRyICplbnRyeSk7CisvKiBzb2NrLmMgKi8KK2V4dGVybiB2b2lkIHNtYl9kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaywgaW50IGxlbik7CitleHRlcm4gaW50IHNtYl92YWxpZF9zb2NrZXQoc3RydWN0IGlub2RlICppbm9kZSk7CitleHRlcm4gdm9pZCBzbWJfY2xvc2Vfc29ja2V0KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKTsKK2V4dGVybiBpbnQgc21iX3JlY3ZfYXZhaWxhYmxlKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKTsKK2V4dGVybiBpbnQgc21iX3JlY2VpdmVfaGVhZGVyKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKTsKK2V4dGVybiBpbnQgc21iX3JlY2VpdmVfZHJvcChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcik7CitleHRlcm4gaW50IHNtYl9yZWNlaXZlKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSk7CitleHRlcm4gaW50IHNtYl9zZW5kX3JlcXVlc3Qoc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEpOworLyogaW5vZGUuYyAqLworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqc21iX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIpOworZXh0ZXJuIHZvaWQgc21iX2dldF9pbm9kZV9hdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyKTsKK2V4dGVybiB2b2lkIHNtYl9zZXRfaW5vZGVfYXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgc21iX2ZhdHRyICpmYXR0cik7CitleHRlcm4gdm9pZCBzbWJfaW52YWxpZGF0ZV9pbm9kZXMoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpOworZXh0ZXJuIGludCBzbWJfcmV2YWxpZGF0ZV9pbm9kZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworZXh0ZXJuIGludCBzbWJfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXQgKnN0YXQpOworZXh0ZXJuIGludCBzbWJfbm90aWZ5X2NoYW5nZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cik7CisvKiBmaWxlLmMgKi8KK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHNtYl9maWxlX2FvcHM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbWJfZmlsZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNtYl9maWxlX2lub2RlX29wZXJhdGlvbnM7CisvKiBpb2N0bC5jICovCitleHRlcm4gaW50IHNtYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworLyogc21iaW9kLmMgKi8KK2V4dGVybiB2b2lkIHNtYmlvZF93YWtlX3VwKHZvaWQpOworZXh0ZXJuIGludCBzbWJpb2RfcmVnaXN0ZXJfc2VydmVyKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKTsKK2V4dGVybiB2b2lkIHNtYmlvZF91bnJlZ2lzdGVyX3NlcnZlcihzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcik7CitleHRlcm4gdm9pZCBzbWJpb2RfZmx1c2goc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpOworZXh0ZXJuIGludCBzbWJpb2RfcmV0cnkoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpOworLyogcmVxdWVzdC5jICovCitleHRlcm4gaW50IHNtYl9pbml0X3JlcXVlc3RfY2FjaGUodm9pZCk7CitleHRlcm4gdm9pZCBzbWJfZGVzdHJveV9yZXF1ZXN0X2NhY2hlKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBzbWJfcmVxdWVzdCAqc21iX2FsbG9jX3JlcXVlc3Qoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIGludCBidWZzaXplKTsKK2V4dGVybiB2b2lkIHNtYl9ycHV0KHN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxKTsKK2V4dGVybiBpbnQgc21iX2FkZF9yZXF1ZXN0KHN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxKTsKK2V4dGVybiBpbnQgc21iX3JlcXVlc3Rfc2VuZF9zZXJ2ZXIoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpOworZXh0ZXJuIGludCBzbWJfcmVxdWVzdF9yZWN2KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKTsKKy8qIHN5bWxpbmsuYyAqLworZXh0ZXJuIGludCBzbWJfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm9sZG5hbWUpOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNtYl9saW5rX2lub2RlX29wZXJhdGlvbnM7CmRpZmYgLS1naXQgYS9mcy9zbWJmcy9yZXF1ZXN0LmMgYi9mcy9zbWJmcy9yZXF1ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4NWRkNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NtYmZzL3JlcXVlc3QuYwpAQCAtMCwwICsxLDgyMyBAQAorLyoKKyAqICByZXF1ZXN0LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxIGJ5IFVyYmFuIFdpZG1hcmsKKyAqCisgKiAgUGxlYXNlIGFkZCBhIG5vdGUgYWJvdXQgeW91ciBjaGFuZ2VzIHRvIHNtYmZzIGluIHRoZSBDaGFuZ2VMb2cgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NtYl9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtYm5vLmg+CisjaW5jbHVkZSA8bGludXgvc21iX21vdW50Lmg+CisKKyNpbmNsdWRlICJzbWJfZGVidWcuaCIKKyNpbmNsdWRlICJyZXF1ZXN0LmgiCisjaW5jbHVkZSAicHJvdG8uaCIKKworLyogI2RlZmluZSBTTUJfU0xBQl9ERUJVRwkoU0xBQl9SRURfWk9ORSB8IFNMQUJfUE9JU09OKSAqLworI2RlZmluZSBTTUJfU0xBQl9ERUJVRwkwCisKKyNkZWZpbmUgUk9VTkRfVVAoeCkgKCgoeCkrMykgJiB+MykKKworLyogY2FjaGUgZm9yIHJlcXVlc3Qgc3RydWN0dXJlcyAqLworc3RhdGljIGttZW1fY2FjaGVfdCAqcmVxX2NhY2hlcDsKKworc3RhdGljIGludCBzbWJfcmVxdWVzdF9zZW5kX3JlcShzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSk7CisKKy8qCisgIC9wcm9jL3NsYWJpbmZvOgorICBuYW1lLCBhY3RpdmUsIG51bSwgb2Jqc2l6ZSwgYWN0aXZlX3NsYWJzLCBudW1fc2xhcHMsICNwYWdlcworKi8KKworCitpbnQgc21iX2luaXRfcmVxdWVzdF9jYWNoZSh2b2lkKQoreworCXJlcV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgic21iX3JlcXVlc3QiLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHNtYl9yZXF1ZXN0KSwgMCwKKwkJCQkgICAgICAgU01CX1NMQUJfREVCVUcgfCBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJICAgICAgIE5VTEwsIE5VTEwpOworCWlmIChyZXFfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc21iX2Rlc3Ryb3lfcmVxdWVzdF9jYWNoZSh2b2lkKQoreworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kocmVxX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX0lORk8gInNtYl9kZXN0cm95X3JlcXVlc3RfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworLyoKKyAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIGEgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHN0cnVjdCBzbWJfcmVxdWVzdCAqc21iX2RvX2FsbG9jX3JlcXVlc3Qoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsCisJCQkJCQlpbnQgYnVmc2l6ZSkKK3sKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSBOVUxMOworCisJcmVxID0ga21lbV9jYWNoZV9hbGxvYyhyZXFfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJVkVSQk9TRSgiYWxsb2NhdGluZyByZXF1ZXN0OiAlcFxuIiwgcmVxKTsKKwlpZiAoIXJlcSkKKwkJZ290byBvdXQ7CisKKwlpZiAoYnVmc2l6ZSA+IDApIHsKKwkJYnVmID0gc21iX2ttYWxsb2MoYnVmc2l6ZSwgR0ZQX05PRlMpOworCQlpZiAoIWJ1ZikgeworCQkJa21lbV9jYWNoZV9mcmVlKHJlcV9jYWNoZXAsIHJlcSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCW1lbXNldChyZXEsIDAsIHNpemVvZihzdHJ1Y3Qgc21iX3JlcXVlc3QpKTsKKwlyZXEtPnJxX2J1ZmZlciA9IGJ1ZjsKKwlyZXEtPnJxX2J1ZnNpemUgPSBidWZzaXplOworCXJlcS0+cnFfc2VydmVyID0gc2VydmVyOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJlcS0+cnFfd2FpdCk7CisJSU5JVF9MSVNUX0hFQUQoJnJlcS0+cnFfcXVldWUpOworCWF0b21pY19zZXQoJnJlcS0+cnFfY291bnQsIDEpOworCitvdXQ6CisJcmV0dXJuIHJlcTsKK30KKworc3RydWN0IHNtYl9yZXF1ZXN0ICpzbWJfYWxsb2NfcmVxdWVzdChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgaW50IGJ1ZnNpemUpCit7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEgPSBOVUxMOworCisJZm9yICg7OykgeworCQlhdG9taWNfaW5jKCZzZXJ2ZXItPm5yX3JlcXVlc3RzKTsKKwkJaWYgKGF0b21pY19yZWFkKCZzZXJ2ZXItPm5yX3JlcXVlc3RzKSA8PSBNQVhfUkVRVUVTVF9IQVJEKSB7CisJCQlyZXEgPSBzbWJfZG9fYWxsb2NfcmVxdWVzdChzZXJ2ZXIsIGJ1ZnNpemUpOworCQkJaWYgKHJlcSAhPSBOVUxMKQorCQkJCWJyZWFrOworCQl9CisKKyNpZiAwCisJCS8qCisJCSAqIFRyeSB0byBmcmVlIHVwIGF0IGxlYXN0IG9uZSByZXF1ZXN0IGluIG9yZGVyIHRvIHN0YXkKKwkJICogYmVsb3cgdGhlIGhhcmQgbGltaXQKKwkJICovCisgICAgICAgICAgICAgICAgaWYgKG5mc190cnlfdG9fZnJlZV9wYWdlcyhzZXJ2ZXIpKQorCQkJY29udGludWU7CisKKwkJaWYgKHNpZ25hbGxlZCgpICYmIChzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX0lOVFIpKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVSRVNUQVJUU1lTKTsKKwkJY3VycmVudC0+cG9saWN5ID0gU0NIRURfWUlFTEQ7CisJCXNjaGVkdWxlKCk7CisjZWxzZQorCQkvKiBGSVhNRTogd2Ugd2FudCBzb21ldGhpbmcgbGlrZSBuZnMgZG9lcyBhYm92ZSwgYnV0IHRoYXQKKwkJICAgcmVxdWlyZXMgY2hhbmdlcyB0byBhbGwgY2FsbGVycyBhbmQgY2FuIHdhaXQuICovCisJCWJyZWFrOworI2VuZGlmCisJfQorCXJldHVybiByZXE7Cit9CisKK3N0YXRpYyB2b2lkIHNtYl9mcmVlX3JlcXVlc3Qoc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEpCit7CisJYXRvbWljX2RlYygmcmVxLT5ycV9zZXJ2ZXItPm5yX3JlcXVlc3RzKTsKKwlpZiAocmVxLT5ycV9idWZmZXIgJiYgIShyZXEtPnJxX2ZsYWdzICYgU01CX1JFUV9TVEFUSUMpKQorCQlzbWJfa2ZyZWUocmVxLT5ycV9idWZmZXIpOworCWlmIChyZXEtPnJxX3RyYW5zMmJ1ZmZlcikKKwkJc21iX2tmcmVlKHJlcS0+cnFfdHJhbnMyYnVmZmVyKTsKKwlrbWVtX2NhY2hlX2ZyZWUocmVxX2NhY2hlcCwgcmVxKTsKK30KKworLyoKKyAqIFdoYXQgcHJldmVudHMgYSByZ2V0IHRvIHJhY2Ugd2l0aCBhIHJwdXQ/IFRoZSBjb3VudCBtdXN0IG5ldmVyIGRyb3AgdG8gemVybworICogd2hpbGUgaXQgaXMgaW4gdXNlLiBPbmx5IHJwdXQgaWYgaXQgaXMgb2sgdGhhdCBpdCBpcyBmcmVlJ2QuCisgKi8KK3N0YXRpYyB2b2lkIHNtYl9yZ2V0KHN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxKQoreworCWF0b21pY19pbmMoJnJlcS0+cnFfY291bnQpOworfQordm9pZCBzbWJfcnB1dChzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcmVxLT5ycV9jb3VudCkpIHsKKwkJbGlzdF9kZWxfaW5pdCgmcmVxLT5ycV9xdWV1ZSk7CisJCXNtYl9mcmVlX3JlcXVlc3QocmVxKTsKKwl9Cit9CisKKy8qIHNldHVwIHRvIHJlY2VpdmUgdGhlIGRhdGEgcGFydCBvZiB0aGUgU01CICovCitzdGF0aWMgaW50IHNtYl9zZXR1cF9iY2Moc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEpCit7CisJaW50IHJlc3VsdCA9IDA7CisJcmVxLT5ycV9ybGVuID0gc21iX2xlbihyZXEtPnJxX2hlYWRlcikgKyA0IC0gcmVxLT5ycV9ieXRlc19yZWN2ZDsKKworCWlmIChyZXEtPnJxX3JsZW4gPiByZXEtPnJxX2J1ZnNpemUpIHsKKwkJUEFSQU5PSUEoIlBhY2tldCB0b28gbGFyZ2UgJWQgPiAlZFxuIiwKKwkJCSByZXEtPnJxX3JsZW4sIHJlcS0+cnFfYnVmc2l6ZSk7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKwlyZXEtPnJxX2lvdlswXS5pb3ZfYmFzZSA9IHJlcS0+cnFfYnVmZmVyOworCXJlcS0+cnFfaW92WzBdLmlvdl9sZW4gID0gcmVxLT5ycV9ybGVuOworCXJlcS0+cnFfaW92bGVuID0gMTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBQcmVwYXJlIGEgIm5vcm1hbCIgcmVxdWVzdCBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBpbnQgc21iX3NldHVwX3JlcXVlc3Qoc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEpCit7CisJaW50IGxlbiA9IHNtYl9sZW4ocmVxLT5ycV9oZWFkZXIpICsgNDsKKwlyZXEtPnJxX3NsZW4gPSBsZW47CisKKwkvKiBpZiB3ZSBleHBlY3QgYSBkYXRhIHBhcnQgaW4gdGhlIHJlcGx5IHdlIHNldCB0aGUgaW92J3MgdG8gcmVhZCBpdCAqLworCWlmIChyZXEtPnJxX3Jlc3BfYmNjKQorCQlyZXEtPnJxX3NldHVwX3JlYWQgPSBzbWJfc2V0dXBfYmNjOworCisJLyogVGhpcyB0cmllcyB0byBzdXBwb3J0IHJlLXVzaW5nIHRoZSBzYW1lIHJlcXVlc3QgKi8KKwlyZXEtPnJxX2J5dGVzX3NlbnQgPSAwOworCXJlcS0+cnFfcmNscyA9IDA7CisJcmVxLT5ycV9lcnIgPSAwOworCXJlcS0+cnFfZXJybm8gPSAwOworCXJlcS0+cnFfZnJhZ21lbnQgPSAwOworCWlmIChyZXEtPnJxX3RyYW5zMmJ1ZmZlcikKKwkJc21iX2tmcmVlKHJlcS0+cnFfdHJhbnMyYnVmZmVyKTsKKworCXJldHVybiAwOworfQorCisvKgorICogUHJlcGFyZSBhIHRyYW5zYWN0aW9uMiByZXF1ZXN0IHN0cnVjdHVyZQorICovCitzdGF0aWMgaW50IHNtYl9zZXR1cF90cmFuczJyZXF1ZXN0KHN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gcmVxLT5ycV9zZXJ2ZXI7CisJaW50IG1wYXJhbSwgbWRhdGE7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFkZGluZ1s0XTsKKworCS8qIEkga25vdyB0aGUgZm9sbG93aW5nIGlzIHZlcnkgdWdseSwgYnV0IEkgd2FudCB0byBidWlsZCB0aGUKKwkgICBzbWIgcGFja2V0IGFzIGVmZmljaWVudGx5IGFzIHBvc3NpYmxlLiAqLworCisJY29uc3QgaW50IHNtYl9wYXJhbWV0ZXJzID0gMTU7CisJY29uc3QgaW50IGhlYWRlciA9IFNNQl9IRUFERVJfTEVOICsgMiAqIHNtYl9wYXJhbWV0ZXJzICsgMjsKKwljb25zdCBpbnQgb3BhcmFtID0gUk9VTkRfVVAoaGVhZGVyICsgMyk7CisJY29uc3QgaW50IG9kYXRhICA9IFJPVU5EX1VQKG9wYXJhbSArIHJlcS0+cnFfbHBhcm0pOworCWNvbnN0IGludCBiY2MgPSAocmVxLT5ycV9kYXRhID8gb2RhdGEgKyByZXEtPnJxX2xkYXRhIDoKKwkJCQkJb3BhcmFtICsgcmVxLT5ycV9scGFybSkgLSBoZWFkZXI7CisKKwlpZiAoKGJjYyArIG9wYXJhbSkgPiBzZXJ2ZXItPm9wdC5tYXhfeG1pdCkKKwkJcmV0dXJuIC1FTk9NRU07CisJc21iX3NldHVwX2hlYWRlcihyZXEsIFNNQnRyYW5zMiwgc21iX3BhcmFtZXRlcnMsIGJjYyk7CisKKwkvKgorCSAqIG1heCBwYXJhbWV0ZXJzICsgbWF4IGRhdGEgKyBtYXggc2V0dXAgPT0gYnVmc2l6ZSB0byBtYWtlIE5UNCBoYXBweQorCSAqIGFuZCBub3QgYWJvcnQgdGhlIHRyYW5zZmVyIG9yIHNwbGl0IGludG8gbXVsdGlwbGUgcmVzcG9uc2VzLiBJdCBhbHNvCisJICogbWFrZXMgc21iZnMgaGFwcHkgYXMgaGFuZGxpbmcgcGFja2V0cyBsYXJnZXIgdGhhbiB0aGUgYnVmZmVyIHNpemUKKwkgKiBpcyBleHRyYSB3b3JrLgorCSAqCisJICogT1MvMiBpcyBwcm9iYWJseSBnb2luZyB0byBoYXRlIG1lIGZvciB0aGlzIC4uLgorCSAqLworCW1wYXJhbSA9IFNNQl9UUkFOUzJfTUFYX1BBUkFNOworCW1kYXRhID0gcmVxLT5ycV9idWZzaXplIC0gbXBhcmFtOworCisJbWRhdGEgPSBzZXJ2ZXItPm9wdC5tYXhfeG1pdCAtIG1wYXJhbSAtIDEwMDsKKwlpZiAobWRhdGEgPCAxMDI0KSB7CisJCW1kYXRhID0gMTAyNDsKKwkJbXBhcmFtID0gMjA7CisJfQorCisjaWYgMAorCS8qIE5UL3dpbjJrIGhhcyB+NGsgbWF4X3htaXQsIHNvIHdpdGggdGhpcyB3ZSByZXF1ZXN0IG1vcmUgdGhhbiBpdCB3YW50cworCSAgIHRvIHJldHVybiBhcyBvbmUgU01CLiBVc2VmdWwgZm9yIHRlc3RpbmcgdGhlIGZyYWdtZW50ZWQgdHJhbnMyCisJICAgaGFuZGxpbmcuICovCisJbWRhdGEgPSA4MTkyOworI2VuZGlmCisKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdHBzY250LCByZXEtPnJxX2xwYXJtKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdGRzY250LCByZXEtPnJxX2xkYXRhKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfbXByY250LCBtcGFyYW0pOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl9tZHJjbnQsIG1kYXRhKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfbXNyY250LCAwKTsgICAgLyogbWF4IHNldHVwIGFsd2F5cyAwID8gKi8KKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfZmxhZ3MsIDApOworCURTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl90aW1lb3V0LCAwKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfcHNjbnQsIHJlcS0+cnFfbHBhcm0pOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl9wc29mZiwgb3BhcmFtIC0gNCk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX2RzY250LCByZXEtPnJxX2xkYXRhKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfZHNvZmYsIHJlcS0+cnFfZGF0YSA/IG9kYXRhIC0gNCA6IDApOworCSoocmVxLT5ycV9oZWFkZXIgKyBzbWJfc3V3Y250KSA9IDB4MDE7ICAgICAgICAgIC8qIHNldHVwIGNvdW50ICovCisJKihyZXEtPnJxX2hlYWRlciArIHNtYl9zdXdjbnQgKyAxKSA9IDB4MDA7ICAgICAgLyogcmVzZXJ2ZWQgKi8KKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfc2V0dXAwLCByZXEtPnJxX3RyYW5zMl9jb21tYW5kKTsKKworCXJlcS0+cnFfaW92bGVuID0gMjsKKwlyZXEtPnJxX2lvdlswXS5pb3ZfYmFzZSA9ICh2b2lkICopIHJlcS0+cnFfaGVhZGVyOworCXJlcS0+cnFfaW92WzBdLmlvdl9sZW4gPSBvcGFyYW07CisJcmVxLT5ycV9pb3ZbMV0uaW92X2Jhc2UgPSAocmVxLT5ycV9wYXJtPT1OVUxMKSA/IHBhZGRpbmcgOiByZXEtPnJxX3Bhcm07CisJcmVxLT5ycV9pb3ZbMV0uaW92X2xlbiA9IHJlcS0+cnFfbHBhcm07CisJcmVxLT5ycV9zbGVuID0gb3BhcmFtICsgcmVxLT5ycV9scGFybTsKKworCWlmIChyZXEtPnJxX2RhdGEpIHsKKwkJcmVxLT5ycV9pb3ZsZW4gKz0gMjsKKwkJcmVxLT5ycV9pb3ZbMl0uaW92X2Jhc2UgPSBwYWRkaW5nOworCQlyZXEtPnJxX2lvdlsyXS5pb3ZfbGVuID0gb2RhdGEgLSBvcGFyYW0gLSByZXEtPnJxX2xwYXJtOworCQlyZXEtPnJxX2lvdlszXS5pb3ZfYmFzZSA9IHJlcS0+cnFfZGF0YTsKKwkJcmVxLT5ycV9pb3ZbM10uaW92X2xlbiA9IHJlcS0+cnFfbGRhdGE7CisJCXJlcS0+cnFfc2xlbiA9IG9kYXRhICsgcmVxLT5ycV9sZGF0YTsKKwl9CisKKwkvKiBhbHdheXMgYSBkYXRhIHBhcnQgZm9yIHRyYW5zMiByZXBsaWVzICovCisJcmVxLT5ycV9zZXR1cF9yZWFkID0gc21iX3NldHVwX2JjYzsKKworCXJldHVybiAwOworfQorCisvKgorICogQWRkIGEgcmVxdWVzdCBhbmQgdGVsbCBzbWJpb2QgdG8gcHJvY2VzcyBpdAorICovCitpbnQgc21iX2FkZF9yZXF1ZXN0KHN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxKQoreworCWxvbmcgdGltZWxlZnQ7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSByZXEtPnJxX3NlcnZlcjsKKwlpbnQgcmVzdWx0ID0gMDsKKworCXNtYl9zZXR1cF9yZXF1ZXN0KHJlcSk7CisJaWYgKHJlcS0+cnFfdHJhbnMyX2NvbW1hbmQpIHsKKwkJaWYgKHJlcS0+cnFfYnVmZmVyID09IE5VTEwpIHsKKwkJCVBBUkFOT0lBKCJ0cmFuczIgYXR0ZW1wdGVkIHdpdGhvdXQgcmVzcG9uc2UgYnVmZmVyIVxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlyZXN1bHQgPSBzbWJfc2V0dXBfdHJhbnMycmVxdWVzdChyZXEpOworCX0KKwlpZiAocmVzdWx0IDwgMCkKKwkJcmV0dXJuIHJlc3VsdDsKKworI2lmZGVmIFNNQl9ERUJVR19QQUNLRVRfU0laRQorCWFkZF94bWl0X3N0YXRzKHJlcSk7CisjZW5kaWYKKworCS8qIGFkZCAncmVxJyB0byB0aGUgcXVldWUgb2YgcmVxdWVzdHMgKi8KKwlpZiAoc21iX2xvY2tfc2VydmVyX2ludGVycnVwdGlibGUoc2VydmVyKSkKKwkJcmV0dXJuIC1FSU5UUjsKKworCS8qCisJICogVHJ5IHRvIHNlbmQgdGhlIHJlcXVlc3QgYXMgdGhlIHByb2Nlc3MuIElmIHRoYXQgZmFpbHMgd2UgcXVldWUgdGhlCisJICogcmVxdWVzdCBhbmQgbGV0IHNtYmlvZCBzZW5kIGl0IGxhdGVyLgorCSAqLworCisJLyogRklYTUU6IGVhY2ggc2VydmVyIGhhcyBhIG51bWJlciBvbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGFyYWxsZWwKKwkgICByZXF1ZXN0cy4gMTAsIDUwIG9yIHNvLiBXZSBzaG91bGQgbm90IGFsbG93IG1vcmUgcmVxdWVzdHMgdG8gYmUKKwkgICBhY3RpdmUuICovCisJaWYgKHNlcnZlci0+bWlkID4gMHhmMDAwKQorCQlzZXJ2ZXItPm1pZCA9IDA7CisJcmVxLT5ycV9taWQgPSBzZXJ2ZXItPm1pZCsrOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl9taWQsIHJlcS0+cnFfbWlkKTsKKworCXJlc3VsdCA9IDA7CisJaWYgKHNlcnZlci0+c3RhdGUgPT0gQ09OTl9WQUxJRCkgeworCQlpZiAobGlzdF9lbXB0eSgmc2VydmVyLT54bWl0cSkpCisJCQlyZXN1bHQgPSBzbWJfcmVxdWVzdF9zZW5kX3JlcShyZXEpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJLyogQ29ubmVjdGlvbiBsb3N0PyAqLworCQkJc2VydmVyLT5jb25uX2Vycm9yID0gcmVzdWx0OworCQkJc2VydmVyLT5zdGF0ZSA9IENPTk5fSU5WQUxJRDsKKwkJfQorCX0KKwlpZiAocmVzdWx0ICE9IDEpCisJCWxpc3RfYWRkX3RhaWwoJnJlcS0+cnFfcXVldWUsICZzZXJ2ZXItPnhtaXRxKTsKKwlzbWJfcmdldChyZXEpOworCisJaWYgKHNlcnZlci0+c3RhdGUgIT0gQ09OTl9WQUxJRCkKKwkJc21iaW9kX3JldHJ5KHNlcnZlcik7CisKKwlzbWJfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCisJc21iaW9kX3dha2VfdXAoKTsKKworCXRpbWVsZWZ0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocmVxLT5ycV93YWl0LAorCQkJCSAgICByZXEtPnJxX2ZsYWdzICYgU01CX1JFUV9SRUNFSVZFRCwgMzAqSFopOworCWlmICghdGltZWxlZnQgfHwgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJLyoKKwkJICogT24gdGltZW91dCBvciBvbiBpbnRlcnJ1cHQgd2Ugd2FudCB0byB0cnkgYW5kIHJlbW92ZSB0aGUKKwkJICogcmVxdWVzdCBmcm9tIHRoZSByZWN2cS94bWl0cS4KKwkJICovCisJCXNtYl9sb2NrX3NlcnZlcihzZXJ2ZXIpOworCQlpZiAoIShyZXEtPnJxX2ZsYWdzICYgU01CX1JFUV9SRUNFSVZFRCkpIHsKKwkJCWxpc3RfZGVsX2luaXQoJnJlcS0+cnFfcXVldWUpOworCQkJc21iX3JwdXQocmVxKTsKKwkJfQorCQlzbWJfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCX0KKworCWlmICghdGltZWxlZnQpIHsKKwkJUEFSQU5PSUEoInJlcXVlc3QgWyVwLCBtaWQ9JWRdIHRpbWVkIG91dCFcbiIsCisJCQkgcmVxLCByZXEtPnJxX21pZCk7CisJCVZFUkJPU0UoInNtYl9jb206ICAlMDJ4XG4iLCAqKHJlcS0+cnFfaGVhZGVyICsgc21iX2NvbSkpOworCQlWRVJCT1NFKCJzbWJfcmNsczogJTAyeFxuIiwgKihyZXEtPnJxX2hlYWRlciArIHNtYl9yY2xzKSk7CisJCVZFUkJPU0UoInNtYl9mbGc6ICAlMDJ4XG4iLCAqKHJlcS0+cnFfaGVhZGVyICsgc21iX2ZsZykpOworCQlWRVJCT1NFKCJzbWJfdGlkOiAgJTA0eFxuIiwgV1ZBTChyZXEtPnJxX2hlYWRlciwgc21iX3RpZCkpOworCQlWRVJCT1NFKCJzbWJfcGlkOiAgJTA0eFxuIiwgV1ZBTChyZXEtPnJxX2hlYWRlciwgc21iX3BpZCkpOworCQlWRVJCT1NFKCJzbWJfdWlkOiAgJTA0eFxuIiwgV1ZBTChyZXEtPnJxX2hlYWRlciwgc21iX3VpZCkpOworCQlWRVJCT1NFKCJzbWJfbWlkOiAgJTA0eFxuIiwgV1ZBTChyZXEtPnJxX2hlYWRlciwgc21iX21pZCkpOworCQlWRVJCT1NFKCJzbWJfd2N0OiAgJTAyeFxuIiwgKihyZXEtPnJxX2hlYWRlciArIHNtYl93Y3QpKTsKKworCQlyZXEtPnJxX3JjbHMgPSBFUlJTUlY7CisJCXJlcS0+cnFfZXJyICA9IEVSUnRpbWVvdXQ7CisKKwkJLyogSnVzdCBpbiBjYXNlIGl0IHdhcyAic3R1Y2siICovCisJCXNtYmlvZF93YWtlX3VwKCk7CisJfQorCVZFUkJPU0UoIndva2UgdXAsIHJjbHM9JWRcbiIsIHJlcS0+cnFfcmNscyk7CisKKwlpZiAocmVxLT5ycV9yY2xzICE9IDApCisJCXJlcS0+cnFfZXJybm8gPSBzbWJfZXJybm8ocmVxKTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJlcS0+cnFfZXJybm8gPSAtRVJFU1RBUlRTWVM7CisJcmV0dXJuIHJlcS0+cnFfZXJybm87Cit9CisKKy8qCisgKiBTZW5kIGEgcmVxdWVzdCBhbmQgcGxhY2UgaXQgb24gdGhlIHJlY3ZxIGlmIHN1Y2Nlc3NmdWxseSBzZW50LgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgc2VydmVyIGxvY2sgaGVsZC4KKyAqLworc3RhdGljIGludCBzbWJfcmVxdWVzdF9zZW5kX3JlcShzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHJlcS0+cnFfc2VydmVyOworCWludCByZXN1bHQ7CisKKwlpZiAocmVxLT5ycV9ieXRlc19zZW50ID09IDApIHsKKwkJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3RpZCwgc2VydmVyLT5vcHQudGlkKTsKKwkJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3BpZCwgMSk7CisJCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl91aWQsIHNlcnZlci0+b3B0LnNlcnZlcl91aWQpOworCX0KKworCXJlc3VsdCA9IHNtYl9zZW5kX3JlcXVlc3QocmVxKTsKKwlpZiAocmVzdWx0IDwgMCAmJiByZXN1bHQgIT0gLUVBR0FJTikKKwkJZ290byBvdXQ7CisKKwlyZXN1bHQgPSAwOworCWlmICghKHJlcS0+cnFfZmxhZ3MgJiBTTUJfUkVRX1RSQU5TTUlUVEVEKSkKKwkJZ290byBvdXQ7CisKKwlsaXN0X2RlbF9pbml0KCZyZXEtPnJxX3F1ZXVlKTsKKwlsaXN0X2FkZF90YWlsKCZyZXEtPnJxX3F1ZXVlLCAmc2VydmVyLT5yZWN2cSk7CisJcmVzdWx0ID0gMTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogU2VuZHMgb25lIHJlcXVlc3QgZm9yIHRoaXMgc2VydmVyLiAoc21iaW9kKQorICogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgc2VydmVyIGxvY2sgaGVsZC4KKyAqIFJldHVybnM6IDwwIG9uIGVycm9yCisgKiAgICAgICAgICAgMCBpZiBubyByZXF1ZXN0IGNvdWxkIGJlIGNvbXBsZXRlbHkgc2VudAorICogICAgICAgICAgIDEgaWYgYWxsIGRhdGEgZm9yIG9uZSByZXF1ZXN0IHdhcyBzZW50CisgKi8KK2ludCBzbWJfcmVxdWVzdF9zZW5kX3NlcnZlcihzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCWludCByZXN1bHQ7CisKKwlpZiAoc2VydmVyLT5zdGF0ZSAhPSBDT05OX1ZBTElEKQorCQlyZXR1cm4gMDsKKworCS8qIGRlcXVldWUgZmlyc3QgcmVxdWVzdCwgaWYgYW55ICovCisJcmVxID0gTlVMTDsKKwloZWFkID0gc2VydmVyLT54bWl0cS5uZXh0OworCWlmIChoZWFkICE9ICZzZXJ2ZXItPnhtaXRxKSB7CisJCXJlcSA9IGxpc3RfZW50cnkoaGVhZCwgc3RydWN0IHNtYl9yZXF1ZXN0LCBycV9xdWV1ZSk7CisJfQorCWlmICghcmVxKQorCQlyZXR1cm4gMDsKKworCXJlc3VsdCA9IHNtYl9yZXF1ZXN0X3NlbmRfcmVxKHJlcSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJc2VydmVyLT5jb25uX2Vycm9yID0gcmVzdWx0OworCQlsaXN0X2RlbF9pbml0KCZyZXEtPnJxX3F1ZXVlKTsKKwkJbGlzdF9hZGQoJnJlcS0+cnFfcXVldWUsICZzZXJ2ZXItPnhtaXRxKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFRyeSB0byBmaW5kIGEgcmVxdWVzdCBtYXRjaGluZyB0aGlzICJtaWQiLiBUeXBpY2FsbHkgdGhlIGZpcnN0IGVudHJ5IHdpbGwKKyAqIGJlIHRoZSBtYXRjaGluZyBvbmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc21iX3JlcXVlc3QgKmZpbmRfcmVxdWVzdChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgaW50IG1pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEgPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaCh0bXAsICZzZXJ2ZXItPnJlY3ZxKSB7CisJCXJlcSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3Qgc21iX3JlcXVlc3QsIHJxX3F1ZXVlKTsKKwkJaWYgKHJlcS0+cnFfbWlkID09IG1pZCkgeworCQkJYnJlYWs7CisJCX0KKwkJcmVxID0gTlVMTDsKKwl9CisKKwlpZiAoIXJlcSkgeworCQlWRVJCT1NFKCJyZWNlaXZlZCByZXBseSB3aXRoIG1pZCAlZCBidXQgbm8gcmVxdWVzdCFcbiIsCisJCQlXVkFMKHNlcnZlci0+aGVhZGVyLCBzbWJfbWlkKSk7CisJCXNlcnZlci0+cnN0YXRlID0gU01CX1JFQ1ZfRFJPUDsKKwl9CisKKwlyZXR1cm4gcmVxOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gd2UgaGF2ZSByZWFkIHRoZSBzbWIgaGVhZGVyIGFuZCBiZWxpZXZlIHRoaXMgaXMgYSByZXNwb25zZS4KKyAqLworc3RhdGljIGludCBzbWJfaW5pdF9yZXF1ZXN0KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgaGRybGVuLCB3Y3Q7CisKKwltZW1jcHkocmVxLT5ycV9oZWFkZXIsIHNlcnZlci0+aGVhZGVyLCBTTUJfSEVBREVSX0xFTik7CisKKwl3Y3QgPSAqKHJlcS0+cnFfaGVhZGVyICsgc21iX3djdCk7CisJaWYgKHdjdCA+IDIwKSB7CQorCQlQQVJBTk9JQSgid2N0IHRvbyBsYXJnZSwgJWQgPiAyMFxuIiwgd2N0KTsKKwkJc2VydmVyLT5yc3RhdGUgPSBTTUJfUkVDVl9EUk9QOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXEtPnJxX3Jlc3Bfd2N0ID0gd2N0OworCWhkcmxlbiA9IFNNQl9IRUFERVJfTEVOICsgd2N0KjIgKyAyOworCVZFUkJPU0UoImhlYWRlciBsZW5ndGg6ICVkICAgc21iX3djdDogJTJkXG4iLCBoZHJsZW4sIHdjdCk7CisKKwlyZXEtPnJxX2J5dGVzX3JlY3ZkID0gU01CX0hFQURFUl9MRU47CisJcmVxLT5ycV9ybGVuID0gaGRybGVuOworCXJlcS0+cnFfaW92WzBdLmlvdl9iYXNlID0gcmVxLT5ycV9oZWFkZXI7CisJcmVxLT5ycV9pb3ZbMF0uaW92X2xlbiAgPSBoZHJsZW47CisJcmVxLT5ycV9pb3ZsZW4gPSAxOworCXNlcnZlci0+cnN0YXRlID0gU01CX1JFQ1ZfUEFSQU07CisKKyNpZmRlZiBTTUJfREVCVUdfUEFDS0VUX1NJWkUKKwlhZGRfcmVjdl9zdGF0cyhzbWJfbGVuKHNlcnZlci0+aGVhZGVyKSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWRzIHRoZSBTTUIgcGFyYW1ldGVycworICovCitzdGF0aWMgaW50IHNtYl9yZWN2X3BhcmFtKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gc21iX3JlY2VpdmUoc2VydmVyLCByZXEpOworCWlmIChyZXN1bHQgPCAwKQorCQlyZXR1cm4gcmVzdWx0OworCWlmIChyZXEtPnJxX2J5dGVzX3JlY3ZkIDwgcmVxLT5ycV9ybGVuKQorCQlyZXR1cm4gMDsKKworCVZFUkJPU0UoInJlc3VsdDogJWQgICBzbWJfYmNjOiAgJTA0eFxuIiwgcmVzdWx0LAorCQlXVkFMKHJlcS0+cnFfaGVhZGVyLCBTTUJfSEVBREVSX0xFTiArCisJCSAgICAgKCoocmVxLT5ycV9oZWFkZXIgKyBzbWJfd2N0KSAqIDIpKSk7CisKKwlyZXN1bHQgPSAwOworCXJlcS0+cnFfaW92WzBdLmlvdl9iYXNlID0gTlVMTDsKKwlyZXEtPnJxX3JsZW4gPSAwOworCWlmIChyZXEtPnJxX2NhbGxiYWNrKQorCQlyZXEtPnJxX2NhbGxiYWNrKHJlcSk7CisJZWxzZSBpZiAocmVxLT5ycV9zZXR1cF9yZWFkKQorCQlyZXN1bHQgPSByZXEtPnJxX3NldHVwX3JlYWQocmVxKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlzZXJ2ZXItPnJzdGF0ZSA9IFNNQl9SRUNWX0RST1A7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJc2VydmVyLT5yc3RhdGUgPSByZXEtPnJxX3JsZW4gPiAwID8gU01CX1JFQ1ZfREFUQSA6IFNNQl9SRUNWX0VORDsKKworCXJlcS0+cnFfYnl0ZXNfcmVjdmQgPSAwOwkvLyByZWN2ZCBvdXQgb2YgdGhlIGlvdgorCisJVkVSQk9TRSgicmxlbjogJWRcbiIsIHJlcS0+cnFfcmxlbik7CisJaWYgKHJlcS0+cnFfcmxlbiA8IDApIHsKKwkJUEFSQU5PSUEoIlBhcmFtZXRlcnMgcmVhZCBiZXlvbmQgZW5kIG9mIHBhY2tldCFcbiIpOworCQlzZXJ2ZXItPnJzdGF0ZSA9IFNNQl9SRUNWX0VORDsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCisvKgorICogUmVhZHMgdGhlIFNNQiBkYXRhCisgKi8KK3N0YXRpYyBpbnQgc21iX3JlY3ZfZGF0YShzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEpCit7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IHNtYl9yZWNlaXZlKHNlcnZlciwgcmVxKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXQ7CisJaWYgKHJlcS0+cnFfYnl0ZXNfcmVjdmQgPCByZXEtPnJxX3JsZW4pCisJCWdvdG8gb3V0OworCXNlcnZlci0+cnN0YXRlID0gU01CX1JFQ1ZfRU5EOworb3V0OgorCVZFUkJPU0UoInJlc3VsdDogJWRcbiIsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFJlY2VpdmUgYSB0cmFuc2FjdGlvbjIgcmVzcG9uc2UKKyAqIFJldHVybjogMCBpZiB0aGUgcmVzcG9uc2UgaGFzIGJlZW4gZnVsbHkgcmVhZAorICogICAgICAgICAxIGlmIHRoZXJlIGFyZSBmdXJ0aGVyICJmcmFnbWVudHMiIHRvIHJlYWQKKyAqICAgICAgICA8MCBpZiB0aGVyZSBpcyBhbiBlcnJvcgorICovCitzdGF0aWMgaW50IHNtYl9yZWN2X3RyYW5zMihzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEpCit7CisJdW5zaWduZWQgY2hhciAqaW5idWY7CisJdW5zaWduZWQgaW50IHBhcm1fZGlzcCwgcGFybV9vZmZzZXQsIHBhcm1fY291bnQsIHBhcm1fdG90OworCXVuc2lnbmVkIGludCBkYXRhX2Rpc3AsIGRhdGFfb2Zmc2V0LCBkYXRhX2NvdW50LCBkYXRhX3RvdDsKKwlpbnQgaGRybGVuID0gU01CX0hFQURFUl9MRU4gKyByZXEtPnJxX3Jlc3Bfd2N0KjIgLSAyOworCisJVkVSQk9TRSgiaGFuZGxpbmcgdHJhbnMyXG4iKTsKKworCWluYnVmID0gcmVxLT5ycV9oZWFkZXI7CisJZGF0YV90b3QgICAgPSBXVkFMKGluYnVmLCBzbWJfdGRyY250KTsKKwlwYXJtX3RvdCAgICA9IFdWQUwoaW5idWYsIHNtYl90cHJjbnQpOworCXBhcm1fZGlzcCAgID0gV1ZBTChpbmJ1Ziwgc21iX3ByZGlzcCk7CisJcGFybV9vZmZzZXQgPSBXVkFMKGluYnVmLCBzbWJfcHJvZmYpOworCXBhcm1fY291bnQgID0gV1ZBTChpbmJ1Ziwgc21iX3ByY250KTsKKwlkYXRhX2Rpc3AgICA9IFdWQUwoaW5idWYsIHNtYl9kcmRpc3ApOworCWRhdGFfb2Zmc2V0ID0gV1ZBTChpbmJ1Ziwgc21iX2Ryb2ZmKTsKKwlkYXRhX2NvdW50ICA9IFdWQUwoaW5idWYsIHNtYl9kcmNudCk7CisKKwkvKiBNb2RpZnkgb2Zmc2V0IGZvciB0aGUgc3BsaXQgaGVhZGVyL2J1ZmZlciB3ZSB1c2UgKi8KKwlpZiAoZGF0YV9jb3VudCB8fCBkYXRhX29mZnNldCkgeworCQlpZiAodW5saWtlbHkoZGF0YV9vZmZzZXQgPCBoZHJsZW4pKQorCQkJZ290byBvdXRfYmFkX2RhdGE7CisJCWVsc2UKKwkJCWRhdGFfb2Zmc2V0IC09IGhkcmxlbjsKKwl9CisJaWYgKHBhcm1fY291bnQgfHwgcGFybV9vZmZzZXQpIHsKKwkJaWYgKHVubGlrZWx5KHBhcm1fb2Zmc2V0IDwgaGRybGVuKSkKKwkJCWdvdG8gb3V0X2JhZF9wYXJtOworCQllbHNlCisJCQlwYXJtX29mZnNldCAtPSBoZHJsZW47CisJfQorCisJaWYgKHBhcm1fY291bnQgPT0gcGFybV90b3QgJiYgZGF0YV9jb3VudCA9PSBkYXRhX3RvdCkgeworCQkvKgorCQkgKiBUaGlzIHBhY2tldCBoYXMgYWxsIHRoZSB0cmFuczIgZGF0YS4KKwkJICoKKwkJICogV2Ugc2V0dXAgdGhlIHJlcXVlc3Qgc28gdGhhdCB0aGlzIHdpbGwgYmUgdGhlIGNvbW1vbgorCQkgKiBjYXNlLiBJdCBtYXkgYmUgYSBzZXJ2ZXIgZXJyb3IgdG8gbm90IHJldHVybiBhCisJCSAqIHJlc3BvbnNlIHRoYXQgZml0cy4KKwkJICovCisJCVZFUkJPU0UoInNpbmdsZSB0cmFuczIgcmVzcG9uc2UgICIKKwkJCSJkY250PSV1LCBwY250PSV1LCBkb2ZmPSV1LCBwb2ZmPSV1XG4iLAorCQkJZGF0YV9jb3VudCwgcGFybV9jb3VudCwKKwkJCWRhdGFfb2Zmc2V0LCBwYXJtX29mZnNldCk7CisJCXJlcS0+cnFfbGRhdGEgPSBkYXRhX2NvdW50OworCQlyZXEtPnJxX2xwYXJtID0gcGFybV9jb3VudDsKKwkJcmVxLT5ycV9kYXRhID0gcmVxLT5ycV9idWZmZXIgKyBkYXRhX29mZnNldDsKKwkJcmVxLT5ycV9wYXJtID0gcmVxLT5ycV9idWZmZXIgKyBwYXJtX29mZnNldDsKKwkJaWYgKHVubGlrZWx5KHBhcm1fb2Zmc2V0ICsgcGFybV9jb3VudCA+IHJlcS0+cnFfcmxlbikpCisJCQlnb3RvIG91dF9iYWRfcGFybTsKKwkJaWYgKHVubGlrZWx5KGRhdGFfb2Zmc2V0ICsgZGF0YV9jb3VudCA+IHJlcS0+cnFfcmxlbikpCisJCQlnb3RvIG91dF9iYWRfZGF0YTsKKwkJcmV0dXJuIDA7CisJfQorCisJVkVSQk9TRSgibXVsdGkgdHJhbnMyIHJlc3BvbnNlICAiCisJCSJmcmFnPSVkLCBkY250PSV1LCBwY250PSV1LCBkb2ZmPSV1LCBwb2ZmPSV1XG4iLAorCQlyZXEtPnJxX2ZyYWdtZW50LAorCQlkYXRhX2NvdW50LCBwYXJtX2NvdW50LAorCQlkYXRhX29mZnNldCwgcGFybV9vZmZzZXQpOworCisJaWYgKCFyZXEtPnJxX2ZyYWdtZW50KSB7CisJCWludCBidWZfbGVuOworCisJCS8qIFdlIGdvdCB0aGUgZmlyc3QgdHJhbnMyIGZyYWdtZW50ICovCisJCXJlcS0+cnFfZnJhZ21lbnQgPSAxOworCQlyZXEtPnJxX3RvdGFsX2RhdGEgPSBkYXRhX3RvdDsKKwkJcmVxLT5ycV90b3RhbF9wYXJtID0gcGFybV90b3Q7CisJCXJlcS0+cnFfbGRhdGEgPSAwOworCQlyZXEtPnJxX2xwYXJtID0gMDsKKworCQlidWZfbGVuID0gZGF0YV90b3QgKyBwYXJtX3RvdDsKKwkJaWYgKGJ1Zl9sZW4gPiBTTUJfTUFYX1BBQ0tFVF9TSVpFKQorCQkJZ290byBvdXRfdG9vX2xvbmc7CisKKwkJcmVxLT5ycV90cmFuczJidWZzaXplID0gYnVmX2xlbjsKKwkJcmVxLT5ycV90cmFuczJidWZmZXIgPSBzbWJfa21hbGxvYyhidWZfbGVuLCBHRlBfTk9GUyk7CisJCWlmICghcmVxLT5ycV90cmFuczJidWZmZXIpCisJCQlnb3RvIG91dF9ub19tZW07CisJCW1lbXNldChyZXEtPnJxX3RyYW5zMmJ1ZmZlciwgMCwgYnVmX2xlbik7CisKKwkJcmVxLT5ycV9wYXJtID0gcmVxLT5ycV90cmFuczJidWZmZXI7CisJCXJlcS0+cnFfZGF0YSA9IHJlcS0+cnFfdHJhbnMyYnVmZmVyICsgcGFybV90b3Q7CisJfSBlbHNlIGlmICh1bmxpa2VseShyZXEtPnJxX3RvdGFsX2RhdGEgPCBkYXRhX3RvdCB8fAorCQkJICAgIHJlcS0+cnFfdG90YWxfcGFybSA8IHBhcm1fdG90KSkKKwkJZ290byBvdXRfZGF0YV9ncmV3OworCisJaWYgKHVubGlrZWx5KHBhcm1fZGlzcCArIHBhcm1fY291bnQgPiByZXEtPnJxX3RvdGFsX3Bhcm0gfHwKKwkJICAgICBwYXJtX29mZnNldCArIHBhcm1fY291bnQgPiByZXEtPnJxX3JsZW4pKQorCQlnb3RvIG91dF9iYWRfcGFybTsKKwlpZiAodW5saWtlbHkoZGF0YV9kaXNwICsgZGF0YV9jb3VudCA+IHJlcS0+cnFfdG90YWxfZGF0YSB8fAorCQkgICAgIGRhdGFfb2Zmc2V0ICsgZGF0YV9jb3VudCA+IHJlcS0+cnFfcmxlbikpCisJCWdvdG8gb3V0X2JhZF9kYXRhOworCisJaW5idWYgPSByZXEtPnJxX2J1ZmZlcjsKKwltZW1jcHkocmVxLT5ycV9wYXJtICsgcGFybV9kaXNwLCBpbmJ1ZiArIHBhcm1fb2Zmc2V0LCBwYXJtX2NvdW50KTsKKwltZW1jcHkocmVxLT5ycV9kYXRhICsgZGF0YV9kaXNwLCBpbmJ1ZiArIGRhdGFfb2Zmc2V0LCBkYXRhX2NvdW50KTsKKworCXJlcS0+cnFfbGRhdGEgKz0gZGF0YV9jb3VudDsKKwlyZXEtPnJxX2xwYXJtICs9IHBhcm1fY291bnQ7CisKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgd2UndmUgcmVjZWl2ZWQgYWxsIG9mIHRoZSBkYXRhLiBOb3RlIHRoYXQKKwkgKiB3ZSB1c2UgdGhlIHBhY2tldCB0b3RhbHMgLS0gdG90YWwgbGVuZ3RocyBtaWdodCBzaHJpbmshCisJICovCisJaWYgKHJlcS0+cnFfbGRhdGEgPj0gZGF0YV90b3QgJiYgcmVxLT5ycV9scGFybSA+PSBwYXJtX3RvdCkgeworCQlyZXEtPnJxX2xkYXRhID0gZGF0YV90b3Q7CisJCXJlcS0+cnFfbHBhcm0gPSBwYXJtX3RvdDsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworCitvdXRfdG9vX2xvbmc6CisJcHJpbnRrKEtFUk5fRVJSICJzbWJfdHJhbnMyOiBkYXRhL3BhcmFtIHRvbyBsb25nLCBkYXRhPSV1LCBwYXJtPSV1XG4iLAorCQlkYXRhX3RvdCwgcGFybV90b3QpOworCWdvdG8gb3V0X0VJTzsKK291dF9ub19tZW06CisJcHJpbnRrKEtFUk5fRVJSICJzbWJfdHJhbnMyOiBjb3VsZG4ndCBhbGxvY2F0ZSBkYXRhIGFyZWEgb2YgJWQgYnl0ZXNcbiIsCisJICAgICAgIHJlcS0+cnFfdHJhbnMyYnVmc2l6ZSk7CisJcmVxLT5ycV9lcnJubyA9IC1FTk9NRU07CisJZ290byBvdXQ7CitvdXRfZGF0YV9ncmV3OgorCXByaW50ayhLRVJOX0VSUiAic21iX3RyYW5zMjogZGF0YS9wYXJhbXMgZ3JldyFcbiIpOworCWdvdG8gb3V0X0VJTzsKK291dF9iYWRfcGFybToKKwlwcmludGsoS0VSTl9FUlIgInNtYl90cmFuczI6IGludmFsaWQgcGFybXMsIGRpc3A9JXUsIGNudD0ldSwgdG90PSV1LCBvZnM9JXVcbiIsCisJICAgICAgIHBhcm1fZGlzcCwgcGFybV9jb3VudCwgcGFybV90b3QsIHBhcm1fb2Zmc2V0KTsKKwlnb3RvIG91dF9FSU87CitvdXRfYmFkX2RhdGE6CisJcHJpbnRrKEtFUk5fRVJSICJzbWJfdHJhbnMyOiBpbnZhbGlkIGRhdGEsIGRpc3A9JXUsIGNudD0ldSwgdG90PSV1LCBvZnM9JXVcbiIsCisJICAgICAgIGRhdGFfZGlzcCwgZGF0YV9jb3VudCwgZGF0YV90b3QsIGRhdGFfb2Zmc2V0KTsKK291dF9FSU86CisJcmVxLT5ycV9lcnJubyA9IC1FSU87CitvdXQ6CisJcmV0dXJuIHJlcS0+cnFfZXJybm87Cit9CisKKy8qCisgKiBTdGF0ZSBtYWNoaW5lIGZvciByZWNlaXZpbmcgcmVzcG9uc2VzLiBXZSBoYW5kbGUgdGhlIGZhY3QgdGhhdCB3ZSBjYW4ndAorICogcmVhZCB0aGUgZnVsbCByZXNwb25zZSBpbiBvbmUgdHJ5IGJ5IGhhdmluZyBzdGF0ZXMgdGVsbGluZyB1cyBob3cgbXVjaCB3ZQorICogaGF2ZSByZWFkLgorICoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHNlcnZlciBsb2NrIGhlbGQgKG9ubHkgY2FsbGVkIGZyb20gc21iaW9kKS4KKyAqCisgKiBSZXR1cm46IDwwIG9uIGVycm9yCisgKi8KK2ludCBzbWJfcmVxdWVzdF9yZWN2KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKQoreworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCWlmIChzbWJfcmVjdl9hdmFpbGFibGUoc2VydmVyKSA8PSAwKQorCQlyZXR1cm4gMDsKKworCVZFUkJPU0UoInN0YXRlOiAlZFxuIiwgc2VydmVyLT5yc3RhdGUpOworCXN3aXRjaCAoc2VydmVyLT5yc3RhdGUpIHsKKwljYXNlIFNNQl9SRUNWX0RST1A6CisJCXJlc3VsdCA9IHNtYl9yZWNlaXZlX2Ryb3Aoc2VydmVyKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlicmVhazsKKwkJaWYgKHNlcnZlci0+cnN0YXRlID09IFNNQl9SRUNWX0RST1ApCisJCQlicmVhazsKKwkJc2VydmVyLT5yc3RhdGUgPSBTTUJfUkVDVl9TVEFSVDsKKwkJLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIFNNQl9SRUNWX1NUQVJUOgorCQlzZXJ2ZXItPnNtYl9yZWFkID0gMDsKKwkJc2VydmVyLT5yc3RhdGUgPSBTTUJfUkVDVl9IRUFERVI7CisJCS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBTTUJfUkVDVl9IRUFERVI6CisJCXJlc3VsdCA9IHNtYl9yZWNlaXZlX2hlYWRlcihzZXJ2ZXIpOworCQlpZiAocmVzdWx0IDwgMCkKKwkJCWJyZWFrOworCQlpZiAoc2VydmVyLT5yc3RhdGUgPT0gU01CX1JFQ1ZfSEVBREVSKQorCQkJYnJlYWs7CisJCWlmICghICgqKHNlcnZlci0+aGVhZGVyICsgc21iX2ZsZykgJiBTTUJfRkxBR1NfUkVQTFkpICkgeworCQkJc2VydmVyLT5yc3RhdGUgPSBTTUJfUkVDVl9SRVFVRVNUOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHNlcnZlci0+cnN0YXRlICE9IFNNQl9SRUNWX0hDT01QTEVURSkKKwkJCWJyZWFrOworCQkvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgU01CX1JFQ1ZfSENPTVBMRVRFOgorCQlyZXEgPSBmaW5kX3JlcXVlc3Qoc2VydmVyLCBXVkFMKHNlcnZlci0+aGVhZGVyLCBzbWJfbWlkKSk7CisJCWlmICghcmVxKQorCQkJYnJlYWs7CisJCXNtYl9pbml0X3JlcXVlc3Qoc2VydmVyLCByZXEpOworCQlyZXEtPnJxX3JjbHMgPSAqKHJlcS0+cnFfaGVhZGVyICsgc21iX3JjbHMpOworCQlyZXEtPnJxX2VyciAgPSBXVkFMKHJlcS0+cnFfaGVhZGVyLCBzbWJfZXJyKTsKKwkJaWYgKHNlcnZlci0+cnN0YXRlICE9IFNNQl9SRUNWX1BBUkFNKQorCQkJYnJlYWs7CisJCS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBTTUJfUkVDVl9QQVJBTToKKwkJaWYgKCFyZXEpCisJCQlyZXEgPSBmaW5kX3JlcXVlc3Qoc2VydmVyLFdWQUwoc2VydmVyLT5oZWFkZXIsc21iX21pZCkpOworCQlpZiAoIXJlcSkKKwkJCWJyZWFrOworCQlyZXN1bHQgPSBzbWJfcmVjdl9wYXJhbShzZXJ2ZXIsIHJlcSk7CisJCWlmIChyZXN1bHQgPCAwKQorCQkJYnJlYWs7CisJCWlmIChzZXJ2ZXItPnJzdGF0ZSAhPSBTTUJfUkVDVl9EQVRBKQorCQkJYnJlYWs7CisJCS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBTTUJfUkVDVl9EQVRBOgorCQlpZiAoIXJlcSkKKwkJCXJlcSA9IGZpbmRfcmVxdWVzdChzZXJ2ZXIsV1ZBTChzZXJ2ZXItPmhlYWRlcixzbWJfbWlkKSk7CisJCWlmICghcmVxKQorCQkJYnJlYWs7CisJCXJlc3VsdCA9IHNtYl9yZWN2X2RhdGEoc2VydmVyLCByZXEpOworCQlpZiAocmVzdWx0IDwgMCkKKwkJCWJyZWFrOworCQlicmVhazsKKworCQkvKiBXZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIHdpdGggYW55IG9mIHRoZXNlIHN0YXRlcyAqLworCWNhc2UgU01CX1JFQ1ZfRU5EOgorCWNhc2UgU01CX1JFQ1ZfUkVRVUVTVDoKKwkJc2VydmVyLT5yc3RhdGUgPSBTTUJfUkVDVl9FTkQ7CisJCWJyZWFrOworCX0KKworCWlmIChyZXN1bHQgPCAwKSB7CisJCS8qIFdlIHNhdyBhbiBlcnJvciAqLworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCWlmIChzZXJ2ZXItPnJzdGF0ZSAhPSBTTUJfUkVDVl9FTkQpCisJCXJldHVybiAwOworCisJcmVzdWx0ID0gMDsKKwlpZiAocmVxLT5ycV90cmFuczJfY29tbWFuZCAmJiByZXEtPnJxX3JjbHMgPT0gU1VDQ0VTUykKKwkJcmVzdWx0ID0gc21iX3JlY3ZfdHJhbnMyKHNlcnZlciwgcmVxKTsKKworCS8qCisJICogUmVzcG9uc2UgY29tcGxldGVseSByZWFkLiBEcm9wIGFueSBleHRyYSBieXRlcyBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisJICogKFllcywgc2VydmVycyBzb21ldGltZXMgYWRkIGV4dHJhIGJ5dGVzIHRvIHJlc3BvbnNlcykKKwkgKi8KKwlWRVJCT1NFKCJzbWJfbGVuOiAlZCAgIHNtYl9yZWFkOiAlZFxuIiwKKwkJc2VydmVyLT5zbWJfbGVuLCBzZXJ2ZXItPnNtYl9yZWFkKTsKKwlpZiAoc2VydmVyLT5zbWJfcmVhZCA8IHNlcnZlci0+c21iX2xlbikKKwkJc21iX3JlY2VpdmVfZHJvcChzZXJ2ZXIpOworCisJc2VydmVyLT5yc3RhdGUgPSBTTUJfUkVDVl9TVEFSVDsKKworCWlmICghcmVzdWx0KSB7CisJCWxpc3RfZGVsX2luaXQoJnJlcS0+cnFfcXVldWUpOworCQlyZXEtPnJxX2ZsYWdzIHw9IFNNQl9SRVFfUkVDRUlWRUQ7CisJCXNtYl9ycHV0KHJlcSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcmVxLT5ycV93YWl0KTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9zbWJmcy9yZXF1ZXN0LmggYi9mcy9zbWJmcy9yZXF1ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZiMjE0NQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NtYmZzL3JlcXVlc3QuaApAQCAtMCwwICsxLDcwIEBACisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCitzdHJ1Y3Qgc21iX3JlcXVlc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgcnFfcXVldWU7CS8qIHJlY3ZxIG9yIHhtaXRxIGZvciB0aGUgc2VydmVyICovCisKKwlhdG9taWNfdCBycV9jb3VudDsKKworCXdhaXRfcXVldWVfaGVhZF90IHJxX3dhaXQ7CisJaW50IHJxX2ZsYWdzOworCWludCBycV9taWQ7CS8qIG11bHRpcGxleCBJRCwgc2V0IGJ5IHJlcXVlc3QuYyAqLworCisJc3RydWN0IHNtYl9zYl9pbmZvICpycV9zZXJ2ZXI7CisKKwkvKiBoZWFkZXIgKyB3b3JkIGNvdW50ICsgcGFyYW1ldGVyIHdvcmRzICsgYnl0ZSBjb3VudCAqLworCXVuc2lnbmVkIGNoYXIgcnFfaGVhZGVyW1NNQl9IRUFERVJfTEVOICsgMjAqMiArIDJdOworCisJaW50IHJxX2J1ZnNpemU7CisJdW5zaWduZWQgY2hhciAqcnFfYnVmZmVyOworCisJLyogRklYTUU6IHRoaXMgaXMgbm90IGdvb2QgZW5vdWdoIGZvciBtZXJnaW5nIElPIHJlcXVlc3RzLiAqLworCXVuc2lnbmVkIGNoYXIgKnJxX3BhZ2U7CisJaW50IHJxX3JzaXplOworCisJaW50IHJxX3Jlc3Bfd2N0OworCWludCBycV9yZXNwX2JjYzsKKworCWludCBycV9ybGVuOworCWludCBycV9ieXRlc19yZWN2ZDsKKworCWludCBycV9zbGVuOworCWludCBycV9ieXRlc19zZW50OworCisJaW50IHJxX2lvdmxlbjsKKwlzdHJ1Y3Qga3ZlYyBycV9pb3ZbNF07CisKKwlpbnQgKCpycV9zZXR1cF9yZWFkKSAoc3RydWN0IHNtYl9yZXF1ZXN0ICopOworCXZvaWQgKCpycV9jYWxsYmFjaykgKHN0cnVjdCBzbWJfcmVxdWVzdCAqKTsKKworCS8qIC0tLS0tLSB0cmFuczIgc3R1ZmYgLS0tLS0tICovCisKKwl1MTYgcnFfdHJhbnMyX2NvbW1hbmQ7CS8qIDAgaWYgbm90IGEgdHJhbnMyIHJlcXVlc3QgKi8KKwl1bnNpZ25lZCBpbnQgcnFfbGRhdGE7CisJdW5zaWduZWQgY2hhciAqcnFfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcnFfbHBhcm07CisJdW5zaWduZWQgY2hhciAqcnFfcGFybTsKKworCWludCBycV9mcmFnbWVudDsKKwl1MzIgcnFfdG90YWxfZGF0YTsKKwl1MzIgcnFfdG90YWxfcGFybTsKKwlpbnQgcnFfdHJhbnMyYnVmc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICpycV90cmFuczJidWZmZXI7CisKKwkvKiAtLS0tLS0gcmVzcG9uc2UgLS0tLS0tICovCisKKwl1bnNpZ25lZCBzaG9ydCBycV9yY2xzOworCXVuc2lnbmVkIHNob3J0IHJxX2VycjsKKwlpbnQgcnFfZXJybm87Cit9OworCisjZGVmaW5lIFNNQl9SRVFfU1RBVElDCQkweDAwMDEJLyogcnFfYnVmZmVyIGlzIHN0YXRpYyAqLworI2RlZmluZSBTTUJfUkVRX05PUkVUUlkJCTB4MDAwMgkvKiByZXF1ZXN0IGlzIGludmFsaWQgYWZ0ZXIgcmV0cnkgKi8KKworI2RlZmluZSBTTUJfUkVRX1RSQU5TTUlUVEVECTB4NDAwMAkvKiBhbGwgZGF0YSBoYXMgYmVlbiBzZW50ICovCisjZGVmaW5lIFNNQl9SRVFfUkVDRUlWRUQJMHg4MDAwCS8qIHJlcGx5IHJlY2VpdmVkLCBzbWJpb2QgaXMgZG9uZSAqLworCisjZGVmaW5lIHhTTUJfUkVRX05PUkVQTFkJMHgwMDA0CS8qIHdlIGRvbid0IHdhbnQgdGhlIHJlcGx5IChpZiBhbnkpICovCisjZGVmaW5lIHhTTUJfUkVRX05PUkVDRUlWRVIJMHgwMDA4CS8qIGNhbGxlciBkb2Vzbid0IHdhaXQgZm9yIHJlc3BvbnNlICovCmRpZmYgLS1naXQgYS9mcy9zbWJmcy9zbWJfZGVidWcuaCBiL2ZzL3NtYmZzL3NtYl9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNDk3MmIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zbWJmcy9zbWJfZGVidWcuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogRGVmaW5lcyBzb21lIGRlYnVnIG1hY3JvcyBmb3Igc21iZnMuCisgKi8KKworLyogVGhpcyBtYWtlcyBhIGRlbnRyeSBwYXJlbnQvY2hpbGQgbmFtZSBwYWlyLiBVc2VmdWwgZm9yIGRlYnVnZ2luZyBwcmludGsncyAqLworI2RlZmluZSBERU5UUllfUEFUSChkZW50cnkpIFwKKwkoZGVudHJ5KS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLChkZW50cnkpLT5kX25hbWUubmFtZQorCisvKgorICogc2FmZXR5IGNoZWNrcyB0aGF0IHNob3VsZCBuZXZlciBoYXBwZW4gPz8/CisgKiB0aGVzZSBhcmUgbm9ybWFsbHkgZW5hYmxlZC4KKyAqLworI2lmZGVmIFNNQkZTX1BBUkFOT0lBCisjIGRlZmluZSBQQVJBTk9JQShmLCBhLi4uKSBwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiAiIGYsIF9fRlVOQ1RJT05fXyAsICMjIGEpCisjZWxzZQorIyBkZWZpbmUgUEFSQU5PSUEoZiwgYS4uLikgZG8geyA7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisvKiBsb3RzIG9mIGRlYnVnIG1lc3NhZ2VzICovCisjaWZkZWYgU01CRlNfREVCVUdfVkVSQk9TRQorIyBkZWZpbmUgVkVSQk9TRShmLCBhLi4uKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZiwgX19GVU5DVElPTl9fICwgIyMgYSkKKyNlbHNlCisjIGRlZmluZSBWRVJCT1NFKGYsIGEuLi4pIGRvIHsgOyB9IHdoaWxlKDApCisjZW5kaWYKKworLyoKKyAqICJub3JtYWwiIGRlYnVnIG1lc3NhZ2VzLCBidXQgbm90IHdpdGggYSBub3JtYWwgREVCVUcgZGVmaW5lIC4uLiB3YXkKKyAqIHRvbyBjb21tb24gbmFtZS4KKyAqLworI2lmZGVmIFNNQkZTX0RFQlVHCisjZGVmaW5lIERFQlVHMShmLCBhLi4uKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZiwgX19GVU5DVElPTl9fICwgIyMgYSkKKyNlbHNlCisjZGVmaW5lIERFQlVHMShmLCBhLi4uKSBkbyB7IDsgfSB3aGlsZSgwKQorI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9zbWJmcy9zbWJpb2QuYyBiL2ZzL3NtYmZzL3NtYmlvZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MWE5N2EKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zbWJmcy9zbWJpb2QuYwpAQCAtMCwwICsxLDM0MSBAQAorLyoKKyAqICBzbWJpb2QuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAsIENoYXJsZXMgTG9lcCAvIENvcmVsIENvcnAuCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLCBVcmJhbiBXaWRtYXJrCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbWJfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbWJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NtYl9tb3VudC5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJzbWJfZGVidWcuaCIKKyNpbmNsdWRlICJyZXF1ZXN0LmgiCisjaW5jbHVkZSAicHJvdG8uaCIKKworZW51bSBzbWJpb2Rfc3RhdGUgeworCVNNQklPRF9ERUFELAorCVNNQklPRF9TVEFSVElORywKKwlTTUJJT0RfUlVOTklORywKK307CisKK3N0YXRpYyBlbnVtIHNtYmlvZF9zdGF0ZSBzbWJpb2Rfc3RhdGUgPSBTTUJJT0RfREVBRDsKK3N0YXRpYyBwaWRfdCBzbWJpb2RfcGlkOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHNtYmlvZF93YWl0KTsKK3N0YXRpYyBMSVNUX0hFQUQoc21iX3NlcnZlcnMpOworc3RhdGljIERFRklORV9TUElOTE9DSyhzZXJ2ZXJzX2xvY2spOworCisjZGVmaW5lIFNNQklPRF9EQVRBX1JFQURZCSgxPDwwKQorc3RhdGljIGxvbmcgc21iaW9kX2ZsYWdzOworCitzdGF0aWMgaW50IHNtYmlvZCh2b2lkICopOworc3RhdGljIGludCBzbWJpb2Rfc3RhcnQodm9pZCk7CisKKy8qCisgKiBjYWxsZWQgd2hlbiB0aGVyZSdzIHdvcmsgZm9yIHVzIHRvIGRvCisgKi8KK3ZvaWQgc21iaW9kX3dha2VfdXAodm9pZCkKK3sKKwlpZiAoc21iaW9kX3N0YXRlID09IFNNQklPRF9ERUFEKQorCQlyZXR1cm47CisJc2V0X2JpdChTTUJJT0RfREFUQV9SRUFEWSwgJnNtYmlvZF9mbGFncyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzbWJpb2Rfd2FpdCk7Cit9CisKKy8qCisgKiBzdGFydCBzbWJpb2QgaWYgbm9uZSBpcyBydW5uaW5nCisgKi8KK3N0YXRpYyBpbnQgc21iaW9kX3N0YXJ0KHZvaWQpCit7CisJcGlkX3QgcGlkOworCWlmIChzbWJpb2Rfc3RhdGUgIT0gU01CSU9EX0RFQUQpCisJCXJldHVybiAwOworCXNtYmlvZF9zdGF0ZSA9IFNNQklPRF9TVEFSVElORzsKKwlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCXNwaW5fdW5sb2NrKCZzZXJ2ZXJzX2xvY2spOworCXBpZCA9IGtlcm5lbF90aHJlYWQoc21iaW9kLCBOVUxMLCAwKTsKKwlpZiAocGlkIDwgMCkKKwkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisKKwlzcGluX2xvY2soJnNlcnZlcnNfbG9jayk7CisJc21iaW9kX3N0YXRlID0gcGlkIDwgMCA/IFNNQklPRF9ERUFEIDogU01CSU9EX1JVTk5JTkc7CisJc21iaW9kX3BpZCA9IHBpZDsKKwlyZXR1cm4gcGlkOworfQorCisvKgorICogcmVnaXN0ZXIgYSBzZXJ2ZXIgJiBzdGFydCBzbWJpb2QgaWYgbmVjZXNzYXJ5CisgKi8KK2ludCBzbWJpb2RfcmVnaXN0ZXJfc2VydmVyKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKQoreworCWludCByZXQ7CisJc3Bpbl9sb2NrKCZzZXJ2ZXJzX2xvY2spOworCWxpc3RfYWRkKCZzZXJ2ZXItPmVudHJ5LCAmc21iX3NlcnZlcnMpOworCVZFUkJPU0UoIiVwXG4iLCBzZXJ2ZXIpOworCXJldCA9IHNtYmlvZF9zdGFydCgpOworCXNwaW5fdW5sb2NrKCZzZXJ2ZXJzX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBVbnJlZ2lzdGVyIGEgc2VydmVyCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBzZXJ2ZXIgbG9jayBoZWxkLgorICovCit2b2lkIHNtYmlvZF91bnJlZ2lzdGVyX3NlcnZlcihzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcikKK3sKKwlzcGluX2xvY2soJnNlcnZlcnNfbG9jayk7CisJbGlzdF9kZWxfaW5pdCgmc2VydmVyLT5lbnRyeSk7CisJVkVSQk9TRSgiJXBcbiIsIHNlcnZlcik7CisJc3Bpbl91bmxvY2soJnNlcnZlcnNfbG9jayk7CisKKwlzbWJpb2Rfd2FrZV91cCgpOworCXNtYmlvZF9mbHVzaChzZXJ2ZXIpOworfQorCit2b2lkIHNtYmlvZF9mbHVzaChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAsICpuOworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHRtcCwgbiwgJnNlcnZlci0+eG1pdHEpIHsKKwkJcmVxID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBzbWJfcmVxdWVzdCwgcnFfcXVldWUpOworCQlyZXEtPnJxX2Vycm5vID0gLUVJTzsKKwkJbGlzdF9kZWxfaW5pdCgmcmVxLT5ycV9xdWV1ZSk7CisJCXNtYl9ycHV0KHJlcSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcmVxLT5ycV93YWl0KTsKKwl9CisJbGlzdF9mb3JfZWFjaF9zYWZlKHRtcCwgbiwgJnNlcnZlci0+cmVjdnEpIHsKKwkJcmVxID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBzbWJfcmVxdWVzdCwgcnFfcXVldWUpOworCQlyZXEtPnJxX2Vycm5vID0gLUVJTzsKKwkJbGlzdF9kZWxfaW5pdCgmcmVxLT5ycV9xdWV1ZSk7CisJCXNtYl9ycHV0KHJlcSk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcmVxLT5ycV93YWl0KTsKKwl9Cit9CisKKy8qCisgKiBXYWtlIHVwIHNtYm1vdW50IGFuZCBtYWtlIGl0IHJlY29ubmVjdCB0byB0aGUgc2VydmVyLgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBzZXJ2ZXIgbG9ja2VkLgorICoKKyAqIEZJWE1FOiBhZGQgc21iY29ubmVjdCB2ZXJzaW9uIHRvIHRoaXMKKyAqLworaW50IHNtYmlvZF9yZXRyeShzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCXBpZF90IHBpZCA9IHNlcnZlci0+Y29ubl9waWQ7CisJaW50IHJlc3VsdCA9IDA7CisKKwlWRVJCT1NFKCJzdGF0ZTogJWRcbiIsIHNlcnZlci0+c3RhdGUpOworCWlmIChzZXJ2ZXItPnN0YXRlID09IENPTk5fVkFMSUQgfHwgc2VydmVyLT5zdGF0ZSA9PSBDT05OX1JFVFJZSU5HKQorCQlnb3RvIG91dDsKKworCXNtYl9pbnZhbGlkYXRlX2lub2RlcyhzZXJ2ZXIpOworCisJLyoKKwkgKiBTb21lIHJlcXVlc3RzIGFyZSBtZWFuaW5nbGVzcyBhZnRlciBhIHJldHJ5LCBzbyB3ZSBhYm9ydCB0aGVtLgorCSAqIE9uZSBleGFtcGxlIGFyZSBhbGwgcmVxdWVzdHMgdXNpbmcgJ2ZpbGVpZCcgc2luY2UgdGhlIGZpbGVzIGFyZQorCSAqIGNsb3NlZCBvbiByZXRyeS4KKwkgKi8KKwloZWFkID0gc2VydmVyLT54bWl0cS5uZXh0OworCXdoaWxlIChoZWFkICE9ICZzZXJ2ZXItPnhtaXRxKSB7CisJCXJlcSA9IGxpc3RfZW50cnkoaGVhZCwgc3RydWN0IHNtYl9yZXF1ZXN0LCBycV9xdWV1ZSk7CisJCWhlYWQgPSBoZWFkLT5uZXh0OworCisJCXJlcS0+cnFfYnl0ZXNfc2VudCA9IDA7CisJCWlmIChyZXEtPnJxX2ZsYWdzICYgU01CX1JFUV9OT1JFVFJZKSB7CisJCQlWRVJCT1NFKCJhYm9ydGluZyByZXF1ZXN0ICVwIG9uIHhtaXRxXG4iLCByZXEpOworCQkJcmVxLT5ycV9lcnJubyA9IC1FSU87CisJCQlsaXN0X2RlbF9pbml0KCZyZXEtPnJxX3F1ZXVlKTsKKwkJCXNtYl9ycHV0KHJlcSk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnJlcS0+cnFfd2FpdCk7CisJCX0KKwl9CisKKwkvKgorCSAqIEZJWE1FOiB0ZXN0IHRoZSBjb2RlIGZvciByZXRyeWluZyByZXF1ZXN0IHdlIGFscmVhZHkgc2VudAorCSAqLworCWhlYWQgPSBzZXJ2ZXItPnJlY3ZxLm5leHQ7CisJd2hpbGUgKGhlYWQgIT0gJnNlcnZlci0+cmVjdnEpIHsKKwkJcmVxID0gbGlzdF9lbnRyeShoZWFkLCBzdHJ1Y3Qgc21iX3JlcXVlc3QsIHJxX3F1ZXVlKTsKKwkJaGVhZCA9IGhlYWQtPm5leHQ7CisjaWYgMAorCQlpZiAocmVxLT5ycV9mbGFncyAmIFNNQl9SRVFfUkVUUlkpIHsKKwkJCS8qIG11c3QgbW92ZSB0aGUgcmVxdWVzdCB0byB0aGUgeG1pdHEgKi8KKwkJCVZFUkJPU0UoInJldHJ5aW5nIHJlcXVlc3QgJXAgb24gcmVjdnFcbiIsIHJlcSk7CisJCQlsaXN0X2RlbCgmcmVxLT5ycV9xdWV1ZSk7CisJCQlsaXN0X2FkZCgmcmVxLT5ycV9xdWV1ZSwgJnNlcnZlci0+eG1pdHEpOworCQkJY29udGludWU7CisJCX0KKyNlbmRpZgorCisJCVZFUkJPU0UoImFib3J0aW5nIHJlcXVlc3QgJXAgb24gcmVjdnFcbiIsIHJlcSk7CisJCS8qIHJlcS0+cnFfcmNscyA9ID8/PzsgKi8gLyogRklYTUU6IHNldCBzbWIgZXJyb3IgY29kZSB0b28/ICovCisJCXJlcS0+cnFfZXJybm8gPSAtRUlPOworCQlsaXN0X2RlbF9pbml0KCZyZXEtPnJxX3F1ZXVlKTsKKwkJc21iX3JwdXQocmVxKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZyZXEtPnJxX3dhaXQpOworCX0KKworCXNtYl9jbG9zZV9zb2NrZXQoc2VydmVyKTsKKworCWlmIChwaWQgPT0gMCkgeworCQkvKiBGSVhNRTogdGhpcyBpcyBmYXRhbCwgdW1vdW50PyAqLworCQlwcmludGsoS0VSTl9FUlIgInNtYl9yZXRyeTogbm8gY29ubmVjdGlvbiBwcm9jZXNzXG4iKTsKKwkJc2VydmVyLT5zdGF0ZSA9IENPTk5fUkVUUklFRDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBDaGFuZ2Ugc3RhdGUgc28gdGhhdCBvbmx5IG9uZSByZXRyeSBwZXIgc2VydmVyIHdpbGwgYmUgc3RhcnRlZC4KKwkgKi8KKwlzZXJ2ZXItPnN0YXRlID0gQ09OTl9SRVRSWUlORzsKKworCS8qCisJICogTm90ZTogdXNlIHRoZSAicHJpdiIgZmxhZywgYXMgYSB1c2VyIHByb2Nlc3MgbWF5IG5lZWQgdG8gcmVjb25uZWN0LgorCSAqLworCXJlc3VsdCA9IGtpbGxfcHJvYyhwaWQsIFNJR1VTUjEsIDEpOworCWlmIChyZXN1bHQpIHsKKwkJLyogRklYTUU6IHRoaXMgaXMgbW9zdCBsaWtlbHkgZmF0YWwsIHVtb3VudD8gKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJzbWJfcmV0cnk6IHNpZ25hbCBmYWlsZWQgWyVkXVxuIiwgcmVzdWx0KTsKKwkJZ290byBvdXQ7CisJfQorCVZFUkJPU0UoInNpZ25hbGxlZCBwaWQgJWRcbiIsIHBpZCk7CisKKwkvKiBGSVhNRTogVGhlIHJldHJpZWQgcmVxdWVzdHMgc2hvdWxkIHBlcmhhcHMgZ2V0IGEgInRpbWUgYm9vc3QiLiAqLworCitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIEN1cnJlbnRseSBoYW5kbGVzIGxvY2tpbmdYIHBhY2tldHMuCisgKi8KK3N0YXRpYyB2b2lkIHNtYmlvZF9oYW5kbGVfcmVxdWVzdChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcikKK3sKKwlQQVJBTk9JQSgic21iaW9kIGdvdCBhIHJlcXVlc3QgLi4uIGFuZCB3ZSBkb24ndCBpbXBsZW1lbnQgb3Bsb2NrcyFcbiIpOworCXNlcnZlci0+cnN0YXRlID0gU01CX1JFQ1ZfRFJPUDsKK30KKworLyoKKyAqIERvIHNvbWUgSU8gZm9yIG9uZSBzZXJ2ZXIuCisgKi8KK3N0YXRpYyB2b2lkIHNtYmlvZF9kb2lvKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKQoreworCWludCByZXN1bHQ7CisJaW50IG1heHdvcmsgPSA3OworCisJaWYgKHNlcnZlci0+c3RhdGUgIT0gQ09OTl9WQUxJRCkKKwkJZ290byBvdXQ7CisKKwlkbyB7CisJCXJlc3VsdCA9IHNtYl9yZXF1ZXN0X3JlY3Yoc2VydmVyKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCXNlcnZlci0+c3RhdGUgPSBDT05OX0lOVkFMSUQ7CisJCQlzbWJpb2RfcmV0cnkoc2VydmVyKTsKKwkJCWdvdG8gb3V0OwkvKiByZWNvbm5lY3RpbmcgaXMgc2xvdyAqLworCQl9IGVsc2UgaWYgKHNlcnZlci0+cnN0YXRlID09IFNNQl9SRUNWX1JFUVVFU1QpCisJCQlzbWJpb2RfaGFuZGxlX3JlcXVlc3Qoc2VydmVyKTsKKwl9IHdoaWxlIChyZXN1bHQgPiAwICYmIG1heHdvcmstLSA+IDApOworCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBtb3JlIHRvIHJlYWQgdGhlbiB3ZSB3YW50IHRvIGJlIHN1cmUgdG8gd2FrZSB1cCBhZ2Fpbi4KKwkgKi8KKwlpZiAoc2VydmVyLT5zdGF0ZSAhPSBDT05OX1ZBTElEKQorCQlnb3RvIG91dDsKKwlpZiAoc21iX3JlY3ZfYXZhaWxhYmxlKHNlcnZlcikgPiAwKQorCQlzZXRfYml0KFNNQklPRF9EQVRBX1JFQURZLCAmc21iaW9kX2ZsYWdzKTsKKworCWRvIHsKKwkJcmVzdWx0ID0gc21iX3JlcXVlc3Rfc2VuZF9zZXJ2ZXIoc2VydmVyKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCXNlcnZlci0+c3RhdGUgPSBDT05OX0lOVkFMSUQ7CisJCQlzbWJpb2RfcmV0cnkoc2VydmVyKTsKKwkJCWdvdG8gb3V0OwkvKiByZWNvbm5lY3RpbmcgaXMgc2xvdyAqLworCQl9CisJfSB3aGlsZSAocmVzdWx0ID4gMCk7CisKKwkvKgorCSAqIElmIHRoZSBsYXN0IHJlcXVlc3Qgd2FzIG5vdCBzZW50IG91dCB3ZSB3YW50IHRvIHdha2UgdXAgYWdhaW4uCisJICovCisJaWYgKCFsaXN0X2VtcHR5KCZzZXJ2ZXItPnhtaXRxKSkKKwkJc2V0X2JpdChTTUJJT0RfREFUQV9SRUFEWSwgJnNtYmlvZF9mbGFncyk7CisKK291dDoKKwlyZXR1cm47Cit9CisKKy8qCisgKiBzbWJpb2Qga2VybmVsIHRocmVhZAorICovCitzdGF0aWMgaW50IHNtYmlvZCh2b2lkICp1bnVzZWQpCit7CisJZGFlbW9uaXplKCJzbWJpb2QiKTsKKworCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKKworCVZFUkJPU0UoIlNNQiBLZXJuZWwgdGhyZWFkIHN0YXJ0aW5nICglZCkgLi4uXG4iLCBjdXJyZW50LT5waWQpOworCisJZm9yICg7OykgeworCQlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcjsKKwkJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqbjsKKworCQkvKiBGSVhNRTogVXNlIHBvbGw/ICovCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzbWJpb2Rfd2FpdCwKKwkJCSB0ZXN0X2JpdChTTUJJT0RfREFUQV9SRUFEWSwgJnNtYmlvZF9mbGFncykpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXNwaW5fbG9jaygmc2VydmVyc19sb2NrKTsKKwkJCXNtYmlvZF9zdGF0ZSA9IFNNQklPRF9ERUFEOworCQkJc3Bpbl91bmxvY2soJnNlcnZlcnNfbG9jayk7CisJCQlicmVhazsKKwkJfQorCisJCWNsZWFyX2JpdChTTUJJT0RfREFUQV9SRUFEWSwgJnNtYmlvZF9mbGFncyk7CisKKwkJc3Bpbl9sb2NrKCZzZXJ2ZXJzX2xvY2spOworCQlpZiAobGlzdF9lbXB0eSgmc21iX3NlcnZlcnMpKSB7CisJCQlzbWJpb2Rfc3RhdGUgPSBTTUJJT0RfREVBRDsKKwkJCXNwaW5fdW5sb2NrKCZzZXJ2ZXJzX2xvY2spOworCQkJYnJlYWs7CisJCX0KKworCQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuLCAmc21iX3NlcnZlcnMpIHsKKwkJCXNlcnZlciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc21iX3NiX2luZm8sIGVudHJ5KTsKKwkJCVZFUkJPU0UoImNoZWNraW5nIHNlcnZlciAlcFxuIiwgc2VydmVyKTsKKworCQkJaWYgKHNlcnZlci0+c3RhdGUgPT0gQ09OTl9WQUxJRCkgeworCQkJCXNwaW5fdW5sb2NrKCZzZXJ2ZXJzX2xvY2spOworCisJCQkJc21iX2xvY2tfc2VydmVyKHNlcnZlcik7CisJCQkJc21iaW9kX2RvaW8oc2VydmVyKTsKKwkJCQlzbWJfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCisJCQkJc3Bpbl9sb2NrKCZzZXJ2ZXJzX2xvY2spOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrKCZzZXJ2ZXJzX2xvY2spOworCX0KKworCVZFUkJPU0UoIlNNQiBLZXJuZWwgdGhyZWFkIGV4aXRpbmcgKCVkKSAuLi5cbiIsIGN1cnJlbnQtPnBpZCk7CisJbW9kdWxlX3B1dF9hbmRfZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3NtYmZzL3NvY2suYyBiL2ZzL3NtYmZzL3NvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2YzY2QyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc21iZnMvc29jay5jCkBAIC0wLDAgKzEsMzg4IEBACisvKgorICogIHNvY2suYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgUGFhbC1Lci4gRW5nc3RhZCBhbmQgVm9sa2VyIExlbmRlY2tlCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3IGJ5IFZvbGtlciBMZW5kZWNrZQorICoKKyAqICBQbGVhc2UgYWRkIGEgbm90ZSBhYm91dCB5b3VyIGNoYW5nZXMgdG8gc21iZnMgaW4gdGhlIENoYW5nZUxvZyBmaWxlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPG5ldC9zY20uaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NtYl9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtYm5vLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKworI2luY2x1ZGUgInNtYl9kZWJ1Zy5oIgorI2luY2x1ZGUgInByb3RvLmgiCisjaW5jbHVkZSAicmVxdWVzdC5oIgorCisKK3N0YXRpYyBpbnQKK19yZWN2ZnJvbShzdHJ1Y3Qgc29ja2V0ICpzb2NrZXQsIHVuc2lnbmVkIGNoYXIgKnVidWYsIGludCBzaXplLCB1bnNpZ25lZCBmbGFncykKK3sKKwlzdHJ1Y3Qga3ZlYyBpb3YgPSB7dWJ1Ziwgc2l6ZX07CisJc3RydWN0IG1zZ2hkciBtc2cgPSB7Lm1zZ19mbGFncyA9IGZsYWdzfTsKKwltc2cubXNnX2ZsYWdzIHw9IE1TR19ET05UV0FJVCB8IE1TR19OT1NJR05BTDsKKwlyZXR1cm4ga2VybmVsX3JlY3Ztc2coc29ja2V0LCAmbXNnLCAmaW92LCAxLCBzaXplLCBtc2cubXNnX2ZsYWdzKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgc2VydmVyIHRoaXMgc29ja2V0IGJlbG9uZ3MgdG8KKyAqLworc3RhdGljIHN0cnVjdCBzbWJfc2JfaW5mbyAqCitzZXJ2ZXJfZnJvbV9zb2NrZXQoc3RydWN0IHNvY2tldCAqc29ja2V0KQoreworCXJldHVybiBzb2NrZXQtPnNrLT5za191c2VyX2RhdGE7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiB0aGVyZSBpcyBkYXRhIG9uIHRoZSBzb2NrZXQuCisgKi8KK3ZvaWQKK3NtYl9kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaywgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX3NvY2tldChzay0+c2tfc29ja2V0KTsKKwl2b2lkICgqZGF0YV9yZWFkeSkoc3RydWN0IHNvY2sgKiwgaW50KSA9IHNlcnZlci0+ZGF0YV9yZWFkeTsKKworCWRhdGFfcmVhZHkoc2ssIGxlbik7CisJVkVSQk9TRSgiKCVwLCAlZClcbiIsIHNrLCBsZW4pOworCXNtYmlvZF93YWtlX3VwKCk7Cit9CisKK2ludAorc21iX3ZhbGlkX3NvY2tldChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlyZXR1cm4gKGlub2RlICYmIFNfSVNTT0NLKGlub2RlLT5pX21vZGUpICYmIAorCQlTT0NLRVRfSShpbm9kZSktPnR5cGUgPT0gU09DS19TVFJFQU0pOworfQorCitzdGF0aWMgc3RydWN0IHNvY2tldCAqCitzZXJ2ZXJfc29jayhzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcikKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKworCWlmIChzZXJ2ZXIgJiYgKGZpbGUgPSBzZXJ2ZXItPnNvY2tfZmlsZSkpCisJeworI2lmZGVmIFNNQkZTX1BBUkFOT0lBCisJCWlmICghc21iX3ZhbGlkX3NvY2tldChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkpCisJCQlQQVJBTk9JQSgiYmFkIHNvY2tldCFcbiIpOworI2VuZGlmCisJCXJldHVybiBTT0NLRVRfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJfQorCXJldHVybiBOVUxMOworfQorCit2b2lkCitzbWJfY2xvc2Vfc29ja2V0KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKQoreworCXN0cnVjdCBmaWxlICogZmlsZSA9IHNlcnZlci0+c29ja19maWxlOworCisJaWYgKGZpbGUpIHsKKwkJc3RydWN0IHNvY2tldCAqc29jayA9IHNlcnZlcl9zb2NrKHNlcnZlcik7CisKKwkJVkVSQk9TRSgiY2xvc2luZyBzb2NrZXQgJXBcbiIsIHNvY2spOworCQlzb2NrLT5zay0+c2tfZGF0YV9yZWFkeSA9IHNlcnZlci0+ZGF0YV9yZWFkeTsKKwkJc2VydmVyLT5zb2NrX2ZpbGUgPSBOVUxMOworCQlmcHV0KGZpbGUpOworCX0KK30KKworc3RhdGljIGludAorc21iX2dldF9sZW5ndGgoc3RydWN0IHNvY2tldCAqc29ja2V0LCB1bnNpZ25lZCBjaGFyICpoZWFkZXIpCit7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IF9yZWN2ZnJvbShzb2NrZXQsIGhlYWRlciwgNCwgTVNHX1BFRUspOworCWlmIChyZXN1bHQgPT0gLUVBR0FJTikKKwkJcmV0dXJuIC1FTk9EQVRBOworCWlmIChyZXN1bHQgPCAwKSB7CisJCVBBUkFOT0lBKCJyZWN2IGVycm9yID0gJWRcbiIsIC1yZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlpZiAocmVzdWx0IDwgNCkKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJc3dpdGNoIChoZWFkZXJbMF0pIHsKKwljYXNlIDB4MDA6CisJY2FzZSAweDgyOgorCQlicmVhazsKKworCWNhc2UgMHg4NToKKwkJREVCVUcxKCJHb3QgU0VTU0lPTiBLRUVQIEFMSVZFXG4iKTsKKwkJX3JlY3Zmcm9tKHNvY2tldCwgaGVhZGVyLCA0LCAwKTsJLyogcmVhZCBhd2F5ICovCisJCXJldHVybiAtRU5PREFUQTsKKworCWRlZmF1bHQ6CisJCVBBUkFOT0lBKCJJbnZhbGlkIE5CVCBwYWNrZXQsIGNvZGU9JXhcbiIsIGhlYWRlclswXSk7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFRoZSBsZW5ndGggaW4gdGhlIFJGQyBOQiBoZWFkZXIgaXMgdGhlIHJhdyBkYXRhIGxlbmd0aCAqLworCXJldHVybiBzbWJfbGVuKGhlYWRlcik7Cit9CisKK2ludAorc21iX3JlY3ZfYXZhaWxhYmxlKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKQoreworCW1tX3NlZ21lbnRfdCBvbGRmczsKKwlpbnQgYXZhaWwsIGVycjsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gc2VydmVyX3NvY2soc2VydmVyKTsKKworCW9sZGZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKGdldF9kcygpKTsKKwllcnIgPSBzb2NrLT5vcHMtPmlvY3RsKHNvY2ssIFNJT0NJTlEsICh1bnNpZ25lZCBsb25nKSAmYXZhaWwpOworCXNldF9mcyhvbGRmcyk7CisJcmV0dXJuIChlcnIgPj0gMCkgPyBhdmFpbCA6IGVycjsKK30KKworLyoKKyAqIEFkanVzdCB0aGUga3ZlYyB0byBtb3ZlIG9uICduJyBieXRlcyAoZnJvbSBuZnMvc3VucnBjKQorICovCitzdGF0aWMgaW50CitzbWJfbW92ZV9pb3Yoc3RydWN0IGt2ZWMgKipkYXRhLCBzaXplX3QgKm51bSwgc3RydWN0IGt2ZWMgKnZlYywgdW5zaWduZWQgYW1vdW50KQoreworCXN0cnVjdCBrdmVjICppdiA9ICpkYXRhOworCWludCBpOworCWludCBsZW47CisKKwkvKgorCSAqCUVhdCBhbnkgc2VudCBrdmVjcworCSAqLworCXdoaWxlIChpdi0+aW92X2xlbiA8PSBhbW91bnQpIHsKKwkJYW1vdW50IC09IGl2LT5pb3ZfbGVuOworCQlpdisrOworCQkoKm51bSktLTsKKwl9CisKKwkvKgorCSAqCUFuZCBjaGV3IGRvd24gdGhlIHBhcnRpYWwgb25lCisJICovCisJdmVjWzBdLmlvdl9sZW4gPSBpdi0+aW92X2xlbi1hbW91bnQ7CisJdmVjWzBdLmlvdl9iYXNlID0oKHVuc2lnbmVkIGNoYXIgKilpdi0+aW92X2Jhc2UpK2Ftb3VudDsKKwlpdisrOworCisJbGVuID0gdmVjWzBdLmlvdl9sZW47CisKKwkvKgorCSAqCUFuZCBjb3B5IGFueSBvdGhlcnMKKwkgKi8KKwlmb3IgKGkgPSAxOyBpIDwgKm51bTsgaSsrKSB7CisJCXZlY1tpXSA9ICppdisrOworCQlsZW4gKz0gdmVjW2ldLmlvdl9sZW47CisJfQorCisJKmRhdGEgPSB2ZWM7CisJcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIHNtYl9yZWNlaXZlX2hlYWRlcgorICogT25seSBjYWxsZWQgYnkgdGhlIHNtYmlvZCB0aHJlYWQuCisgKi8KK2ludAorc21iX3JlY2VpdmVfaGVhZGVyKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgY2hhciBwZWVrX2J1Zls0XTsKKworCXJlc3VsdCA9IC1FSU87IAorCXNvY2sgPSBzZXJ2ZXJfc29jayhzZXJ2ZXIpOworCWlmICghc29jaykKKwkJZ290byBvdXQ7CisJaWYgKHNvY2stPnNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpCisJCWdvdG8gb3V0OworCisJaWYgKCFzZXJ2ZXItPnNtYl9yZWFkKSB7CisJCXJlc3VsdCA9IHNtYl9nZXRfbGVuZ3RoKHNvY2ssIHBlZWtfYnVmKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWlmIChyZXN1bHQgPT0gLUVOT0RBVEEpCisJCQkJcmVzdWx0ID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNlcnZlci0+c21iX2xlbiA9IHJlc3VsdCArIDQ7CisKKwkJaWYgKHNlcnZlci0+c21iX2xlbiA8IFNNQl9IRUFERVJfTEVOKSB7CisJCQlQQVJBTk9JQSgic2hvcnQgcGFja2V0OiAlZFxuIiwgcmVzdWx0KTsKKwkJCXNlcnZlci0+cnN0YXRlID0gU01CX1JFQ1ZfRFJPUDsKKwkJCXJlc3VsdCA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoc2VydmVyLT5zbWJfbGVuID4gU01CX01BWF9QQUNLRVRfU0laRSkgeworCQkJUEFSQU5PSUEoImxvbmcgcGFja2V0OiAlZFxuIiwgcmVzdWx0KTsKKwkJCXNlcnZlci0+cnN0YXRlID0gU01CX1JFQ1ZfRFJPUDsKKwkJCXJlc3VsdCA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXJlc3VsdCA9IF9yZWN2ZnJvbShzb2NrLCBzZXJ2ZXItPmhlYWRlciArIHNlcnZlci0+c21iX3JlYWQsCisJCQkgICBTTUJfSEVBREVSX0xFTiAtIHNlcnZlci0+c21iX3JlYWQsIDApOworCVZFUkJPU0UoIl9yZWN2ZnJvbTogJWRcbiIsIHJlc3VsdCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJVkVSQk9TRSgicmVjZWl2ZSBlcnJvcjogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gb3V0OworCX0KKwlzZXJ2ZXItPnNtYl9yZWFkICs9IHJlc3VsdDsKKworCWlmIChzZXJ2ZXItPnNtYl9yZWFkID09IFNNQl9IRUFERVJfTEVOKQorCQlzZXJ2ZXItPnJzdGF0ZSA9IFNNQl9SRUNWX0hDT01QTEVURTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgY2hhciBkcm9wX2J1ZmZlcltQQUdFX1NJWkVdOworCisvKgorICogc21iX3JlY2VpdmVfZHJvcCAtIHJlYWQgYW5kIHRocm93IGF3YXkgdGhlIGRhdGEKKyAqIE9ubHkgY2FsbGVkIGJ5IHRoZSBzbWJpb2QgdGhyZWFkLgorICoKKyAqIEZJWE1FOiB3ZSBhcmUgaW4gdGhlIGtlcm5lbCwgY291bGQgd2UganVzdCB0ZWxsIHRoZSBzb2NrZXQgdGhhdCB3ZSB3YW50CisgKiB0byBkcm9wIHN0dWZmIGZyb20gdGhlIGJ1ZmZlcj8KKyAqLworaW50CitzbWJfcmVjZWl2ZV9kcm9wKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCBrdmVjIGlvdjsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlpbnQgcmxlbiA9IHNtYl9sZW4oc2VydmVyLT5oZWFkZXIpIC0gc2VydmVyLT5zbWJfcmVhZCArIDQ7CisJaW50IHJlc3VsdCA9IC1FSU87CisKKwlpZiAocmxlbiA+IFBBR0VfU0laRSkKKwkJcmxlbiA9IFBBR0VfU0laRTsKKworCXNvY2sgPSBzZXJ2ZXJfc29jayhzZXJ2ZXIpOworCWlmICghc29jaykKKwkJZ290byBvdXQ7CisJaWYgKHNvY2stPnNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpCisJCWdvdG8gb3V0OworCisJZmxhZ3MgPSBNU0dfRE9OVFdBSVQgfCBNU0dfTk9TSUdOQUw7CisJaW92Lmlvdl9iYXNlID0gZHJvcF9idWZmZXI7CisJaW92Lmlvdl9sZW4gPSBQQUdFX1NJWkU7CisJbXNnLm1zZ19mbGFncyA9IGZsYWdzOworCW1zZy5tc2dfbmFtZSA9IE5VTEw7CisJbXNnLm1zZ19uYW1lbGVuID0gMDsKKwltc2cubXNnX2NvbnRyb2wgPSBOVUxMOworCisJcmVzdWx0ID0ga2VybmVsX3JlY3Ztc2coc29jaywgJm1zZywgJmlvdiwgMSwgcmxlbiwgZmxhZ3MpOworCisJVkVSQk9TRSgicmVhZDogJWRcbiIsIHJlc3VsdCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJVkVSQk9TRSgicmVjZWl2ZSBlcnJvcjogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gb3V0OworCX0KKwlzZXJ2ZXItPnNtYl9yZWFkICs9IHJlc3VsdDsKKworCWlmIChzZXJ2ZXItPnNtYl9yZWFkID49IHNlcnZlci0+c21iX2xlbikKKwkJc2VydmVyLT5yc3RhdGUgPSBTTUJfUkVDVl9FTkQ7CisKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogc21iX3JlY2VpdmUKKyAqIE9ubHkgY2FsbGVkIGJ5IHRoZSBzbWJpb2QgdGhyZWFkLgorICovCitpbnQKK3NtYl9yZWNlaXZlKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCXVuc2lnbmVkIGludCBmbGFnczsKKwlzdHJ1Y3Qga3ZlYyBpb3ZbNF07CisJc3RydWN0IGt2ZWMgKnAgPSByZXEtPnJxX2lvdjsKKwlzaXplX3QgbnVtID0gcmVxLT5ycV9pb3ZsZW47CisJc3RydWN0IG1zZ2hkciBtc2c7CisJaW50IHJsZW47CisJaW50IHJlc3VsdCA9IC1FSU87CisKKwlzb2NrID0gc2VydmVyX3NvY2soc2VydmVyKTsKKwlpZiAoIXNvY2spCisJCWdvdG8gb3V0OworCWlmIChzb2NrLT5zay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQorCQlnb3RvIG91dDsKKworCWZsYWdzID0gTVNHX0RPTlRXQUlUIHwgTVNHX05PU0lHTkFMOworCW1zZy5tc2dfZmxhZ3MgPSBmbGFnczsKKwltc2cubXNnX25hbWUgPSBOVUxMOworCW1zZy5tc2dfbmFtZWxlbiA9IDA7CisJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKworCS8qIERvbnQgcmVwZWF0IGJ5dGVzIGFuZCBjb3VudCBhdmFpbGFibGUgYnVmZmVyc3BhY2UgKi8KKwlybGVuID0gc21iX21vdmVfaW92KCZwLCAmbnVtLCBpb3YsIHJlcS0+cnFfYnl0ZXNfcmVjdmQpOworCWlmIChyZXEtPnJxX3JsZW4gPCBybGVuKQorCQlybGVuID0gcmVxLT5ycV9ybGVuOworCisJcmVzdWx0ID0ga2VybmVsX3JlY3Ztc2coc29jaywgJm1zZywgcCwgbnVtLCBybGVuLCBmbGFncyk7CisKKwlWRVJCT1NFKCJyZWFkOiAlZFxuIiwgcmVzdWx0KTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlWRVJCT1NFKCJyZWNlaXZlIGVycm9yOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBvdXQ7CisJfQorCXJlcS0+cnFfYnl0ZXNfcmVjdmQgKz0gcmVzdWx0OworCXNlcnZlci0+c21iX3JlYWQgKz0gcmVzdWx0OworCitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFRyeSB0byBzZW5kIGEgU01CIHJlcXVlc3QuIFRoaXMgbWF5IHJldHVybiBhZnRlciBzZW5kaW5nIG9ubHkgcGFydHMgb2YgdGhlCisgKiByZXF1ZXN0LiBTTUJfUkVRX1RSQU5TTUlUVEVEIHdpbGwgYmUgc2V0IGlmIGEgcmVxdWVzdCB3YXMgZnVsbHkgc2VudC4KKyAqCisgKiBQYXJ0cyBvZiB0aGlzIHdhcyB0YWtlbiBmcm9tIHhwcnRfc2VuZG1zZyBmcm9tIG5ldC9zdW5ycGMveHBydC5jCisgKi8KK2ludAorc21iX3NlbmRfcmVxdWVzdChzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHJlcS0+cnFfc2VydmVyOworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisJc3RydWN0IG1zZ2hkciBtc2cgPSB7Lm1zZ19mbGFncyA9IE1TR19OT1NJR05BTCB8IE1TR19ET05UV0FJVH07CisgICAgICAgIGludCBzbGVuID0gcmVxLT5ycV9zbGVuIC0gcmVxLT5ycV9ieXRlc19zZW50OworCWludCByZXN1bHQgPSAtRUlPOworCXN0cnVjdCBrdmVjIGlvdls0XTsKKwlzdHJ1Y3Qga3ZlYyAqcCA9IHJlcS0+cnFfaW92OworCXNpemVfdCBudW0gPSByZXEtPnJxX2lvdmxlbjsKKworCXNvY2sgPSBzZXJ2ZXJfc29jayhzZXJ2ZXIpOworCWlmICghc29jaykKKwkJZ290byBvdXQ7CisJaWYgKHNvY2stPnNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpCisJCWdvdG8gb3V0OworCisJLyogRG9udCByZXBlYXQgYnl0ZXMgKi8KKwlpZiAocmVxLT5ycV9ieXRlc19zZW50KQorCQlzbWJfbW92ZV9pb3YoJnAsICZudW0sIGlvdiwgcmVxLT5ycV9ieXRlc19zZW50KTsKKworCXJlc3VsdCA9IGtlcm5lbF9zZW5kbXNnKHNvY2ssICZtc2csIHAsIG51bSwgc2xlbik7CisKKwlpZiAocmVzdWx0ID49IDApIHsKKwkJcmVxLT5ycV9ieXRlc19zZW50ICs9IHJlc3VsdDsKKwkJaWYgKHJlcS0+cnFfYnl0ZXNfc2VudCA+PSByZXEtPnJxX3NsZW4pCisJCQlyZXEtPnJxX2ZsYWdzIHw9IFNNQl9SRVFfVFJBTlNNSVRURUQ7CisJfQorb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9mcy9zbWJmcy9zeW1saW5rLmMgYi9mcy9zbWJmcy9zeW1saW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwNjllMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NtYmZzL3N5bWxpbmsuYwpAQCAtMCwwICsxLDcwIEBACisvKgorICogIHN5bWxpbmsuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgSm9obiBOZXdiaWdpbgorICoKKyAqICBQbGVhc2UgYWRkIGEgbm90ZSBhYm91dCB5b3VyIGNoYW5nZXMgdG8gc21iZnMgaW4gdGhlIENoYW5nZUxvZyBmaWxlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8bGludXgvc21ibm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbWJfZnMuaD4KKworI2luY2x1ZGUgInNtYl9kZWJ1Zy5oIgorI2luY2x1ZGUgInByb3RvLmgiCisKK2ludCBzbWJfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm9sZG5hbWUpCit7CisJREVCVUcxKCJjcmVhdGUgc3ltbGluayAlcyAtPiAlcy8lc1xuIiwgb2xkbmFtZSwgREVOVFJZX1BBVEgoZGVudHJ5KSk7CisKKwlyZXR1cm4gc21iX3Byb2Nfc3ltbGluayhzZXJ2ZXJfZnJvbV9kZW50cnkoZGVudHJ5KSwgZGVudHJ5LCBvbGRuYW1lKTsKK30KKworc3RhdGljIGludCBzbWJfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwljaGFyICpsaW5rID0gX19nZXRuYW1lKCk7CisJREVCVUcxKCJmb2xsb3dsaW5rIG9mICVzLyVzXG4iLCBERU5UUllfUEFUSChkZW50cnkpKTsKKworCWlmICghbGluaykgeworCQlsaW5rID0gRVJSX1BUUigtRU5PTUVNKTsKKwl9IGVsc2UgeworCQlpbnQgbGVuID0gc21iX3Byb2NfcmVhZF9saW5rKHNlcnZlcl9mcm9tX2RlbnRyeShkZW50cnkpLAorCQkJCQkJZGVudHJ5LCBsaW5rLCBQQVRIX01BWCAtIDEpOworCQlpZiAobGVuIDwgMCkgeworCQkJcHV0bmFtZShsaW5rKTsKKwkJCWxpbmsgPSBFUlJfUFRSKGxlbik7CisJCX0gZWxzZSB7CisJCQlsaW5rW2xlbl0gPSAwOworCQl9CisJfQorCW5kX3NldF9saW5rKG5kLCBsaW5rKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc21iX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJY2hhciAqcyA9IG5kX2dldF9saW5rKG5kKTsKKwlpZiAoIUlTX0VSUihzKSkKKwkJcHV0bmFtZShzKTsKK30KKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc21iX2xpbmtfaW5vZGVfb3BlcmF0aW9ucyA9Cit7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBzbWJfZm9sbG93X2xpbmssCisJLnB1dF9saW5rCT0gc21iX3B1dF9saW5rLAorfTsKZGlmZiAtLWdpdCBhL2ZzL3N0YXQuYyBiL2ZzL3N0YXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGEwZTUxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3RhdC5jCkBAIC0wLDAgKzEsNDEwIEBACisvKgorICogIGxpbnV4L2ZzL3N0YXQuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdodWlkLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCit2b2lkIGdlbmVyaWNfZmlsbGF0dHIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGtzdGF0ICpzdGF0KQoreworCXN0YXQtPmRldiA9IGlub2RlLT5pX3NiLT5zX2RldjsKKwlzdGF0LT5pbm8gPSBpbm9kZS0+aV9pbm87CisJc3RhdC0+bW9kZSA9IGlub2RlLT5pX21vZGU7CisJc3RhdC0+bmxpbmsgPSBpbm9kZS0+aV9ubGluazsKKwlzdGF0LT51aWQgPSBpbm9kZS0+aV91aWQ7CisJc3RhdC0+Z2lkID0gaW5vZGUtPmlfZ2lkOworCXN0YXQtPnJkZXYgPSBpbm9kZS0+aV9yZGV2OworCXN0YXQtPmF0aW1lID0gaW5vZGUtPmlfYXRpbWU7CisJc3RhdC0+bXRpbWUgPSBpbm9kZS0+aV9tdGltZTsKKwlzdGF0LT5jdGltZSA9IGlub2RlLT5pX2N0aW1lOworCXN0YXQtPnNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJc3RhdC0+YmxvY2tzID0gaW5vZGUtPmlfYmxvY2tzOworCXN0YXQtPmJsa3NpemUgPSBpbm9kZS0+aV9ibGtzaXplOworfQorCitFWFBPUlRfU1lNQk9MKGdlbmVyaWNfZmlsbGF0dHIpOworCitpbnQgdmZzX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ICpzdGF0KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHNlY3VyaXR5X2lub2RlX2dldGF0dHIobW50LCBkZW50cnkpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAoaW5vZGUtPmlfb3AtPmdldGF0dHIpCisJCXJldHVybiBpbm9kZS0+aV9vcC0+Z2V0YXR0cihtbnQsIGRlbnRyeSwgc3RhdCk7CisKKwlnZW5lcmljX2ZpbGxhdHRyKGlub2RlLCBzdGF0KTsKKwlpZiAoIXN0YXQtPmJsa3NpemUpIHsKKwkJc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gaW5vZGUtPmlfc2I7CisJCXVuc2lnbmVkIGJsb2NrczsKKwkJYmxvY2tzID0gKHN0YXQtPnNpemUrcy0+c19ibG9ja3NpemUtMSkgPj4gcy0+c19ibG9ja3NpemVfYml0czsKKwkJc3RhdC0+YmxvY2tzID0gKHMtPnNfYmxvY2tzaXplIC8gNTEyKSAqIGJsb2NrczsKKwkJc3RhdC0+Ymxrc2l6ZSA9IHMtPnNfYmxvY2tzaXplOworCX0KKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTCh2ZnNfZ2V0YXR0cik7CisKK2ludCB2ZnNfc3RhdChjaGFyIF9fdXNlciAqbmFtZSwgc3RydWN0IGtzdGF0ICpzdGF0KQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJaW50IGVycm9yOworCisJZXJyb3IgPSB1c2VyX3BhdGhfd2FsayhuYW1lLCAmbmQpOworCWlmICghZXJyb3IpIHsKKwkJZXJyb3IgPSB2ZnNfZ2V0YXR0cihuZC5tbnQsIG5kLmRlbnRyeSwgc3RhdCk7CisJCXBhdGhfcmVsZWFzZSgmbmQpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK0VYUE9SVF9TWU1CT0wodmZzX3N0YXQpOworCitpbnQgdmZzX2xzdGF0KGNoYXIgX191c2VyICpuYW1lLCBzdHJ1Y3Qga3N0YXQgKnN0YXQpCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHVzZXJfcGF0aF93YWxrX2xpbmsobmFtZSwgJm5kKTsKKwlpZiAoIWVycm9yKSB7CisJCWVycm9yID0gdmZzX2dldGF0dHIobmQubW50LCBuZC5kZW50cnksIHN0YXQpOworCQlwYXRoX3JlbGVhc2UoJm5kKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCitFWFBPUlRfU1lNQk9MKHZmc19sc3RhdCk7CisKK2ludCB2ZnNfZnN0YXQodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3Qga3N0YXQgKnN0YXQpCit7CisJc3RydWN0IGZpbGUgKmYgPSBmZ2V0KGZkKTsKKwlpbnQgZXJyb3IgPSAtRUJBREY7CisKKwlpZiAoZikgeworCQllcnJvciA9IHZmc19nZXRhdHRyKGYtPmZfdmZzbW50LCBmLT5mX2RlbnRyeSwgc3RhdCk7CisJCWZwdXQoZik7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworRVhQT1JUX1NZTUJPTCh2ZnNfZnN0YXQpOworCisjaWZkZWYgX19BUkNIX1dBTlRfT0xEX1NUQVQKKworLyoKKyAqIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5PyAgTWF5YmUgdGhpcyBzaG91bGQgYmUgbW92ZWQKKyAqIGludG8gYXJjaC9pMzg2IGluc3RlYWQ/CisgKi8KK3N0YXRpYyBpbnQgY3Bfb2xkX3N0YXQoc3RydWN0IGtzdGF0ICpzdGF0LCBzdHJ1Y3QgX19vbGRfa2VybmVsX3N0YXQgX191c2VyICogc3RhdGJ1ZikKK3sKKwlzdGF0aWMgaW50IHdhcm5jb3VudCA9IDU7CisJc3RydWN0IF9fb2xkX2tlcm5lbF9zdGF0IHRtcDsKKwkKKwlpZiAod2FybmNvdW50ID4gMCkgeworCQl3YXJuY291bnQtLTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVkZTOiBXYXJuaW5nOiAlcyB1c2luZyBvbGQgc3RhdCgpIGNhbGwuIFJlY29tcGlsZSB5b3VyIGJpbmFyeS5cbiIsCisJCQljdXJyZW50LT5jb21tKTsKKwl9IGVsc2UgaWYgKHdhcm5jb3VudCA8IDApIHsKKwkJLyogaXQncyBsYXVnaGFibGUsIGJ1dC4uLiAqLworCQl3YXJuY291bnQgPSAwOworCX0KKworCW1lbXNldCgmdG1wLCAwLCBzaXplb2Yoc3RydWN0IF9fb2xkX2tlcm5lbF9zdGF0KSk7CisJdG1wLnN0X2RldiA9IG9sZF9lbmNvZGVfZGV2KHN0YXQtPmRldik7CisJdG1wLnN0X2lubyA9IHN0YXQtPmlubzsKKwl0bXAuc3RfbW9kZSA9IHN0YXQtPm1vZGU7CisJdG1wLnN0X25saW5rID0gc3RhdC0+bmxpbms7CisJaWYgKHRtcC5zdF9ubGluayAhPSBzdGF0LT5ubGluaykKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJU0VUX1VJRCh0bXAuc3RfdWlkLCBzdGF0LT51aWQpOworCVNFVF9HSUQodG1wLnN0X2dpZCwgc3RhdC0+Z2lkKTsKKwl0bXAuc3RfcmRldiA9IG9sZF9lbmNvZGVfZGV2KHN0YXQtPnJkZXYpOworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKKwlpZiAoc3RhdC0+c2l6ZSA+IE1BWF9OT05fTEZTKQorCQlyZXR1cm4gLUVPVkVSRkxPVzsKKyNlbmRpZgkKKwl0bXAuc3Rfc2l6ZSA9IHN0YXQtPnNpemU7CisJdG1wLnN0X2F0aW1lID0gc3RhdC0+YXRpbWUudHZfc2VjOworCXRtcC5zdF9tdGltZSA9IHN0YXQtPm10aW1lLnR2X3NlYzsKKwl0bXAuc3RfY3RpbWUgPSBzdGF0LT5jdGltZS50dl9zZWM7CisJcmV0dXJuIGNvcHlfdG9fdXNlcihzdGF0YnVmLCZ0bXAsc2l6ZW9mKHRtcCkpID8gLUVGQVVMVCA6IDA7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfc3RhdChjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBzdHJ1Y3QgX19vbGRfa2VybmVsX3N0YXQgX191c2VyICogc3RhdGJ1ZikKK3sKKwlzdHJ1Y3Qga3N0YXQgc3RhdDsKKwlpbnQgZXJyb3IgPSB2ZnNfc3RhdChmaWxlbmFtZSwgJnN0YXQpOworCisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBjcF9vbGRfc3RhdCgmc3RhdCwgc3RhdGJ1Zik7CisKKwlyZXR1cm4gZXJyb3I7Cit9Cithc21saW5rYWdlIGxvbmcgc3lzX2xzdGF0KGNoYXIgX191c2VyICogZmlsZW5hbWUsIHN0cnVjdCBfX29sZF9rZXJuZWxfc3RhdCBfX3VzZXIgKiBzdGF0YnVmKQoreworCXN0cnVjdCBrc3RhdCBzdGF0OworCWludCBlcnJvciA9IHZmc19sc3RhdChmaWxlbmFtZSwgJnN0YXQpOworCisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBjcF9vbGRfc3RhdCgmc3RhdCwgc3RhdGJ1Zik7CisKKwlyZXR1cm4gZXJyb3I7Cit9Cithc21saW5rYWdlIGxvbmcgc3lzX2ZzdGF0KHVuc2lnbmVkIGludCBmZCwgc3RydWN0IF9fb2xkX2tlcm5lbF9zdGF0IF9fdXNlciAqIHN0YXRidWYpCit7CisJc3RydWN0IGtzdGF0IHN0YXQ7CisJaW50IGVycm9yID0gdmZzX2ZzdGF0KGZkLCAmc3RhdCk7CisKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IGNwX29sZF9zdGF0KCZzdGF0LCBzdGF0YnVmKTsKKworCXJldHVybiBlcnJvcjsKK30KKworI2VuZGlmIC8qIF9fQVJDSF9XQU5UX09MRF9TVEFUICovCisKK3N0YXRpYyBpbnQgY3BfbmV3X3N0YXQoc3RydWN0IGtzdGF0ICpzdGF0LCBzdHJ1Y3Qgc3RhdCBfX3VzZXIgKnN0YXRidWYpCit7CisJc3RydWN0IHN0YXQgdG1wOworCisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCWlmICghb2xkX3ZhbGlkX2RldihzdGF0LT5kZXYpIHx8ICFvbGRfdmFsaWRfZGV2KHN0YXQtPnJkZXYpKQorCQlyZXR1cm4gLUVPVkVSRkxPVzsKKyNlbHNlCisJaWYgKCFuZXdfdmFsaWRfZGV2KHN0YXQtPmRldikgfHwgIW5ld192YWxpZF9kZXYoc3RhdC0+cmRldikpCisJCXJldHVybiAtRU9WRVJGTE9XOworI2VuZGlmCisKKwltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKKwl0bXAuc3RfZGV2ID0gb2xkX2VuY29kZV9kZXYoc3RhdC0+ZGV2KTsKKyNlbHNlCisJdG1wLnN0X2RldiA9IG5ld19lbmNvZGVfZGV2KHN0YXQtPmRldik7CisjZW5kaWYKKwl0bXAuc3RfaW5vID0gc3RhdC0+aW5vOworCXRtcC5zdF9tb2RlID0gc3RhdC0+bW9kZTsKKwl0bXAuc3RfbmxpbmsgPSBzdGF0LT5ubGluazsKKwlpZiAodG1wLnN0X25saW5rICE9IHN0YXQtPm5saW5rKQorCQlyZXR1cm4gLUVPVkVSRkxPVzsKKwlTRVRfVUlEKHRtcC5zdF91aWQsIHN0YXQtPnVpZCk7CisJU0VUX0dJRCh0bXAuc3RfZ2lkLCBzdGF0LT5naWQpOworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKKwl0bXAuc3RfcmRldiA9IG9sZF9lbmNvZGVfZGV2KHN0YXQtPnJkZXYpOworI2Vsc2UKKwl0bXAuc3RfcmRldiA9IG5ld19lbmNvZGVfZGV2KHN0YXQtPnJkZXYpOworI2VuZGlmCisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCWlmIChzdGF0LT5zaXplID4gTUFYX05PTl9MRlMpCisJCXJldHVybiAtRU9WRVJGTE9XOworI2VuZGlmCQorCXRtcC5zdF9zaXplID0gc3RhdC0+c2l6ZTsKKwl0bXAuc3RfYXRpbWUgPSBzdGF0LT5hdGltZS50dl9zZWM7CisJdG1wLnN0X210aW1lID0gc3RhdC0+bXRpbWUudHZfc2VjOworCXRtcC5zdF9jdGltZSA9IHN0YXQtPmN0aW1lLnR2X3NlYzsKKyNpZmRlZiBTVEFUX0hBVkVfTlNFQworCXRtcC5zdF9hdGltZV9uc2VjID0gc3RhdC0+YXRpbWUudHZfbnNlYzsKKwl0bXAuc3RfbXRpbWVfbnNlYyA9IHN0YXQtPm10aW1lLnR2X25zZWM7CisJdG1wLnN0X2N0aW1lX25zZWMgPSBzdGF0LT5jdGltZS50dl9uc2VjOworI2VuZGlmCisJdG1wLnN0X2Jsb2NrcyA9IHN0YXQtPmJsb2NrczsKKwl0bXAuc3RfYmxrc2l6ZSA9IHN0YXQtPmJsa3NpemU7CisJcmV0dXJuIGNvcHlfdG9fdXNlcihzdGF0YnVmLCZ0bXAsc2l6ZW9mKHRtcCkpID8gLUVGQVVMVCA6IDA7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfbmV3c3RhdChjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdCBfX3VzZXIgKiBzdGF0YnVmKQoreworCXN0cnVjdCBrc3RhdCBzdGF0OworCWludCBlcnJvciA9IHZmc19zdGF0KGZpbGVuYW1lLCAmc3RhdCk7CisKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IGNwX25ld19zdGF0KCZzdGF0LCBzdGF0YnVmKTsKKworCXJldHVybiBlcnJvcjsKK30KK2FzbWxpbmthZ2UgbG9uZyBzeXNfbmV3bHN0YXQoY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgc3RydWN0IHN0YXQgX191c2VyICogc3RhdGJ1ZikKK3sKKwlzdHJ1Y3Qga3N0YXQgc3RhdDsKKwlpbnQgZXJyb3IgPSB2ZnNfbHN0YXQoZmlsZW5hbWUsICZzdGF0KTsKKworCWlmICghZXJyb3IpCisJCWVycm9yID0gY3BfbmV3X3N0YXQoJnN0YXQsIHN0YXRidWYpOworCisJcmV0dXJuIGVycm9yOworfQorYXNtbGlua2FnZSBsb25nIHN5c19uZXdmc3RhdCh1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBzdGF0IF9fdXNlciAqIHN0YXRidWYpCit7CisJc3RydWN0IGtzdGF0IHN0YXQ7CisJaW50IGVycm9yID0gdmZzX2ZzdGF0KGZkLCAmc3RhdCk7CisKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IGNwX25ld19zdGF0KCZzdGF0LCBzdGF0YnVmKTsKKworCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19yZWFkbGluayhjb25zdCBjaGFyIF9fdXNlciAqIHBhdGgsIGNoYXIgX191c2VyICogYnVmLCBpbnQgYnVmc2l6KQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJaW50IGVycm9yOworCisJaWYgKGJ1ZnNpeiA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVycm9yID0gdXNlcl9wYXRoX3dhbGtfbGluayhwYXRoLCAmbmQpOworCWlmICghZXJyb3IpIHsKKwkJc3RydWN0IGlub2RlICogaW5vZGUgPSBuZC5kZW50cnktPmRfaW5vZGU7CisKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlpZiAoaW5vZGUtPmlfb3AgJiYgaW5vZGUtPmlfb3AtPnJlYWRsaW5rKSB7CisJCQllcnJvciA9IHNlY3VyaXR5X2lub2RlX3JlYWRsaW5rKG5kLmRlbnRyeSk7CisJCQlpZiAoIWVycm9yKSB7CisJCQkJdG91Y2hfYXRpbWUobmQubW50LCBuZC5kZW50cnkpOworCQkJCWVycm9yID0gaW5vZGUtPmlfb3AtPnJlYWRsaW5rKG5kLmRlbnRyeSwgYnVmLCBidWZzaXopOworCQkJfQorCQl9CisJCXBhdGhfcmVsZWFzZSgmbmQpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyogLS0tLS0tLS0tLSBMRlMtNjQgLS0tLS0tLS0tLS0gKi8KKyNpZmRlZiBfX0FSQ0hfV0FOVF9TVEFUNjQKKworc3RhdGljIGxvbmcgY3BfbmV3X3N0YXQ2NChzdHJ1Y3Qga3N0YXQgKnN0YXQsIHN0cnVjdCBzdGF0NjQgX191c2VyICpzdGF0YnVmKQoreworCXN0cnVjdCBzdGF0NjQgdG1wOworCisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZihzdHJ1Y3Qgc3RhdDY0KSk7CisjaWZkZWYgQ09ORklHX01JUFMKKwkvKiBtaXBzIGhhcyB3ZWlyZCBwYWRkaW5nLCBzbyB3ZSBkb24ndCBnZXQgNjQgYml0cyB0aGVyZSAqLworCWlmICghbmV3X3ZhbGlkX2RldihzdGF0LT5kZXYpIHx8ICFuZXdfdmFsaWRfZGV2KHN0YXQtPnJkZXYpKQorCQlyZXR1cm4gLUVPVkVSRkxPVzsKKwl0bXAuc3RfZGV2ID0gbmV3X2VuY29kZV9kZXYoc3RhdC0+ZGV2KTsKKwl0bXAuc3RfcmRldiA9IG5ld19lbmNvZGVfZGV2KHN0YXQtPnJkZXYpOworI2Vsc2UKKwl0bXAuc3RfZGV2ID0gaHVnZV9lbmNvZGVfZGV2KHN0YXQtPmRldik7CisJdG1wLnN0X3JkZXYgPSBodWdlX2VuY29kZV9kZXYoc3RhdC0+cmRldik7CisjZW5kaWYKKwl0bXAuc3RfaW5vID0gc3RhdC0+aW5vOworI2lmZGVmIFNUQVQ2NF9IQVNfQlJPS0VOX1NUX0lOTworCXRtcC5fX3N0X2lubyA9IHN0YXQtPmlubzsKKyNlbmRpZgorCXRtcC5zdF9tb2RlID0gc3RhdC0+bW9kZTsKKwl0bXAuc3RfbmxpbmsgPSBzdGF0LT5ubGluazsKKwl0bXAuc3RfdWlkID0gc3RhdC0+dWlkOworCXRtcC5zdF9naWQgPSBzdGF0LT5naWQ7CisJdG1wLnN0X2F0aW1lID0gc3RhdC0+YXRpbWUudHZfc2VjOworCXRtcC5zdF9hdGltZV9uc2VjID0gc3RhdC0+YXRpbWUudHZfbnNlYzsKKwl0bXAuc3RfbXRpbWUgPSBzdGF0LT5tdGltZS50dl9zZWM7CisJdG1wLnN0X210aW1lX25zZWMgPSBzdGF0LT5tdGltZS50dl9uc2VjOworCXRtcC5zdF9jdGltZSA9IHN0YXQtPmN0aW1lLnR2X3NlYzsKKwl0bXAuc3RfY3RpbWVfbnNlYyA9IHN0YXQtPmN0aW1lLnR2X25zZWM7CisJdG1wLnN0X3NpemUgPSBzdGF0LT5zaXplOworCXRtcC5zdF9ibG9ja3MgPSBzdGF0LT5ibG9ja3M7CisJdG1wLnN0X2Jsa3NpemUgPSBzdGF0LT5ibGtzaXplOworCXJldHVybiBjb3B5X3RvX3VzZXIoc3RhdGJ1ZiwmdG1wLHNpemVvZih0bXApKSA/IC1FRkFVTFQgOiAwOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX3N0YXQ2NChjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdDY0IF9fdXNlciAqIHN0YXRidWYpCit7CisJc3RydWN0IGtzdGF0IHN0YXQ7CisJaW50IGVycm9yID0gdmZzX3N0YXQoZmlsZW5hbWUsICZzdGF0KTsKKworCWlmICghZXJyb3IpCisJCWVycm9yID0gY3BfbmV3X3N0YXQ2NCgmc3RhdCwgc3RhdGJ1Zik7CisKKwlyZXR1cm4gZXJyb3I7Cit9Cithc21saW5rYWdlIGxvbmcgc3lzX2xzdGF0NjQoY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgc3RydWN0IHN0YXQ2NCBfX3VzZXIgKiBzdGF0YnVmKQoreworCXN0cnVjdCBrc3RhdCBzdGF0OworCWludCBlcnJvciA9IHZmc19sc3RhdChmaWxlbmFtZSwgJnN0YXQpOworCisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBjcF9uZXdfc3RhdDY0KCZzdGF0LCBzdGF0YnVmKTsKKworCXJldHVybiBlcnJvcjsKK30KK2FzbWxpbmthZ2UgbG9uZyBzeXNfZnN0YXQ2NCh1bnNpZ25lZCBsb25nIGZkLCBzdHJ1Y3Qgc3RhdDY0IF9fdXNlciAqIHN0YXRidWYpCit7CisJc3RydWN0IGtzdGF0IHN0YXQ7CisJaW50IGVycm9yID0gdmZzX2ZzdGF0KGZkLCAmc3RhdCk7CisKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IGNwX25ld19zdGF0NjQoJnN0YXQsIHN0YXRidWYpOworCisJcmV0dXJuIGVycm9yOworfQorCisjZW5kaWYgLyogX19BUkNIX1dBTlRfU1RBVDY0ICovCisKK3ZvaWQgaW5vZGVfYWRkX2J5dGVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBieXRlcykKK3sKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCWlub2RlLT5pX2Jsb2NrcyArPSBieXRlcyA+PiA5OworCWJ5dGVzICY9IDUxMTsKKwlpbm9kZS0+aV9ieXRlcyArPSBieXRlczsKKwlpZiAoaW5vZGUtPmlfYnl0ZXMgPj0gNTEyKSB7CisJCWlub2RlLT5pX2Jsb2NrcysrOworCQlpbm9kZS0+aV9ieXRlcyAtPSA1MTI7CisJfQorCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKK30KKworRVhQT1JUX1NZTUJPTChpbm9kZV9hZGRfYnl0ZXMpOworCit2b2lkIGlub2RlX3N1Yl9ieXRlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgYnl0ZXMpCit7CisJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlpbm9kZS0+aV9ibG9ja3MgLT0gYnl0ZXMgPj4gOTsKKwlieXRlcyAmPSA1MTE7CisJaWYgKGlub2RlLT5pX2J5dGVzIDwgYnl0ZXMpIHsKKwkJaW5vZGUtPmlfYmxvY2tzLS07CisJCWlub2RlLT5pX2J5dGVzICs9IDUxMjsKKwl9CisJaW5vZGUtPmlfYnl0ZXMgLT0gYnl0ZXM7CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworfQorCitFWFBPUlRfU1lNQk9MKGlub2RlX3N1Yl9ieXRlcyk7CisKK2xvZmZfdCBpbm9kZV9nZXRfYnl0ZXMoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlsb2ZmX3QgcmV0OworCisJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlyZXQgPSAoKChsb2ZmX3QpaW5vZGUtPmlfYmxvY2tzKSA8PCA5KSArIGlub2RlLT5pX2J5dGVzOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitFWFBPUlRfU1lNQk9MKGlub2RlX2dldF9ieXRlcyk7CisKK3ZvaWQgaW5vZGVfc2V0X2J5dGVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBieXRlcykKK3sKKwkvKiBDYWxsZXIgaXMgaGVyZSByZXNwb25zaWJsZSBmb3Igc3VmZmljaWVudCBsb2NraW5nCisJICogKGllLiBpbm9kZS0+aV9sb2NrKSAqLworCWlub2RlLT5pX2Jsb2NrcyA9IGJ5dGVzID4+IDk7CisJaW5vZGUtPmlfYnl0ZXMgPSBieXRlcyAmIDUxMTsKK30KKworRVhQT1JUX1NZTUJPTChpbm9kZV9zZXRfYnl0ZXMpOwpkaWZmIC0tZ2l0IGEvZnMvc3VwZXIuYyBiL2ZzL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ExYjhjYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3N1cGVyLmMKQEAgLTAsMCArMSw4NjAgQEAKKy8qCisgKiAgbGludXgvZnMvc3VwZXIuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIHN1cGVyLmMgY29udGFpbnMgY29kZSB0byBoYW5kbGU6IC0gbW91bnQgc3RydWN0dXJlcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc3VwZXItYmxvY2sgdGFibGVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBmaWxlc3lzdGVtIGRyaXZlcnMgbGlzdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbW91bnQgc3lzdGVtIGNhbGwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHVtb3VudCBzeXN0ZW0gY2FsbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdXN0YXQgc3lzdGVtIGNhbGwKKyAqCisgKiBHSyAyLzUvOTUgIC0gIENoYW5nZWQgdG8gc3VwcG9ydCBtb3VudGluZyB0aGUgcm9vdCBmcyB2aWEgTkZTCisgKgorICogIEFkZGVkIGtlcm5lbGQgc3VwcG9ydDogSmFjcXVlcyBHZWxpbmFzIGFuZCBCam9ybiBFa3dhbGwKKyAqICBBZGRlZCBjaGFuZ2Vfcm9vdDogV2VybmVyIEFsbWVzYmVyZ2VyICYgSGFucyBMZXJtZW4sIEZlYiAnOTYKKyAqICBBZGRlZCBvcHRpb25zIHRvIC9wcm9jL21vdW50czoKKyAqICAgIFRvcmJq9nJuIExpbmRoICh0b3Jiam9ybi5saW5kaEBnb3B0YS5zZSksIEFwcmlsIDE0LCAxOTk2LgorICogIEFkZGVkIGRldmZzIHN1cHBvcnQ6IFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PiwgMTMtSkFOLTE5OTgKKyAqICBIZWF2aWx5IHJld3JpdHRlbiBmb3IgJ29uZSBmcyAtIG9uZSB0cmVlJyBkY2FjaGUgYXJjaGl0ZWN0dXJlLiBBViwgTWFyIDIwMDAKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2FjY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4JCS8qIGZvciBmc3luY19zdXBlcigpICovCisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CQkvKiBmb3IgdGhlIGVtZXJnZW5jeSByZW1vdW50IHN0dWZmICovCisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKwordm9pZCBnZXRfZmlsZXN5c3RlbShzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnMpOwordm9pZCBwdXRfZmlsZXN5c3RlbShzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnMpOworc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmdldF9mc190eXBlKGNvbnN0IGNoYXIgKm5hbWUpOworCitMSVNUX0hFQUQoc3VwZXJfYmxvY2tzKTsKK0RFRklORV9TUElOTE9DSyhzYl9sb2NrKTsKKworLyoqCisgKglhbGxvY19zdXBlcgktCWNyZWF0ZSBuZXcgc3VwZXJibG9jaworICoKKyAqCUFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBuZXcgJnN0cnVjdCBzdXBlcl9ibG9jay4gIGFsbG9jX3N1cGVyKCkKKyAqCXJldHVybnMgYSBwb2ludGVyIG5ldyBzdXBlcmJsb2NrIG9yICVOVUxMIGlmIGFsbG9jYXRpb24gaGFkIGZhaWxlZC4KKyAqLworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqYWxsb2Nfc3VwZXIodm9pZCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3VwZXJfYmxvY2spLCAgR0ZQX1VTRVIpOworCXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBkZWZhdWx0X29wOworCisJaWYgKHMpIHsKKwkJbWVtc2V0KHMsIDAsIHNpemVvZihzdHJ1Y3Qgc3VwZXJfYmxvY2spKTsKKwkJaWYgKHNlY3VyaXR5X3NiX2FsbG9jKHMpKSB7CisJCQlrZnJlZShzKTsKKwkJCXMgPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKwkJSU5JVF9MSVNUX0hFQUQoJnMtPnNfZGlydHkpOworCQlJTklUX0xJU1RfSEVBRCgmcy0+c19pbyk7CisJCUlOSVRfTElTVF9IRUFEKCZzLT5zX2ZpbGVzKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnMtPnNfaW5zdGFuY2VzKTsKKwkJSU5JVF9ITElTVF9IRUFEKCZzLT5zX2Fub24pOworCQlJTklUX0xJU1RfSEVBRCgmcy0+c19pbm9kZXMpOworCQlpbml0X3J3c2VtKCZzLT5zX3Vtb3VudCk7CisJCXNlbWFfaW5pdCgmcy0+c19sb2NrLCAxKTsKKwkJZG93bl93cml0ZSgmcy0+c191bW91bnQpOworCQlzLT5zX2NvdW50ID0gU19CSUFTOworCQlhdG9taWNfc2V0KCZzLT5zX2FjdGl2ZSwgMSk7CisJCXNlbWFfaW5pdCgmcy0+c192ZnNfcmVuYW1lX3NlbSwxKTsKKwkJc2VtYV9pbml0KCZzLT5zX2RxdW90LmRxaW9fc2VtLCAxKTsKKwkJc2VtYV9pbml0KCZzLT5zX2RxdW90LmRxb25vZmZfc2VtLCAxKTsKKwkJaW5pdF9yd3NlbSgmcy0+c19kcXVvdC5kcXB0cl9zZW0pOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5zX3dhaXRfdW5mcm96ZW4pOworCQlzLT5zX21heGJ5dGVzID0gTUFYX05PTl9MRlM7CisJCXMtPmRxX29wID0gc2JfZHF1b3Rfb3BzOworCQlzLT5zX3Fjb3AgPSBzYl9xdW90YWN0bF9vcHM7CisJCXMtPnNfb3AgPSAmZGVmYXVsdF9vcDsKKwkJcy0+c190aW1lX2dyYW4gPSAxMDAwMDAwMDAwOworCX0KK291dDoKKwlyZXR1cm4gczsKK30KKworLyoqCisgKglkZXN0cm95X3N1cGVyCS0JZnJlZXMgYSBzdXBlcmJsb2NrCisgKglAczogc3VwZXJibG9jayB0byBmcmVlCisgKgorICoJRnJlZXMgYSBzdXBlcmJsb2NrLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVzdHJveV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJc2VjdXJpdHlfc2JfZnJlZShzKTsKKwlrZnJlZShzKTsKK30KKworLyogU3VwZXJibG9jayByZWZjb3VudGluZyAgKi8KKworLyoKKyAqIERyb3AgYSBzdXBlcmJsb2NrJ3MgcmVmY291bnQuICBSZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSBzdXBlcmJsb2NrIHdhcworICogZGVzdHJveWVkLiAgVGhlIGNhbGxlciBtdXN0IGhvbGQgc2JfbG9jay4KKyAqLworaW50IF9fcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIS0tc2ItPnNfY291bnQpIHsKKwkJZGVzdHJveV9zdXBlcihzYik7CisJCXJldCA9IDE7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBEcm9wIGEgc3VwZXJibG9jaydzIHJlZmNvdW50LgorICogUmV0dXJucyBub24temVybyBpZiB0aGUgc3VwZXJibG9jayBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQgYW5kCisgKiBhdCBsZWFzdCBpcyBhbHJlYWR5IHJlbW92ZWQgZnJvbSBzdXBlcl9ibG9ja3MgbGlzdCwgc28gaWYgd2UgYXJlCisgKiBtYWtpbmcgYSBsb29wIHRocm91Z2ggc3VwZXIgYmxvY2tzIHRoZW4gd2UgbmVlZCB0byByZXN0YXJ0LgorICogVGhlIGNhbGxlciBtdXN0IGhvbGQgc2JfbG9jay4KKyAqLworaW50IF9fcHV0X3N1cGVyX2FuZF9uZWVkX3Jlc3RhcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwkvKiBjaGVjayBmb3IgcmFjZSB3aXRoIGdlbmVyaWNfc2h1dGRvd25fc3VwZXIoKSAqLworCWlmIChsaXN0X2VtcHR5KCZzYi0+c19saXN0KSkgeworCQkvKiBzdXBlciBibG9jayBpcyByZW1vdmVkLCBuZWVkIHRvIHJlc3RhcnQuLi4gKi8KKwkJX19wdXRfc3VwZXIoc2IpOworCQlyZXR1cm4gMTsKKwl9CisJLyogY2FuJ3QgYmUgdGhlIGxhc3QsIHNpbmNlIHNfbGlzdCBpcyBzdGlsbCBpbiB1c2UgKi8KKwlzYi0+c19jb3VudC0tOworCUJVR19PTihzYi0+c19jb3VudCA9PSAwKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglwdXRfc3VwZXIJLQlkcm9wIGEgdGVtcG9yYXJ5IHJlZmVyZW5jZSB0byBzdXBlcmJsb2NrCisgKglAc2I6IHN1cGVyYmxvY2sgaW4gcXVlc3Rpb24KKyAqCisgKglEcm9wcyBhIHRlbXBvcmFyeSByZWZlcmVuY2UsIGZyZWVzIHN1cGVyYmxvY2sgaWYgdGhlcmUncyBubworICoJcmVmZXJlbmNlcyBsZWZ0LgorICovCitzdGF0aWMgdm9pZCBwdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzcGluX2xvY2soJnNiX2xvY2spOworCV9fcHV0X3N1cGVyKHNiKTsKKwlzcGluX3VubG9jaygmc2JfbG9jayk7Cit9CisKKworLyoqCisgKglkZWFjdGl2YXRlX3N1cGVyCS0JZHJvcCBhbiBhY3RpdmUgcmVmZXJlbmNlIHRvIHN1cGVyYmxvY2sKKyAqCUBzOiBzdXBlcmJsb2NrIHRvIGRlYWN0aXZhdGUKKyAqCisgKglEcm9wcyBhbiBhY3RpdmUgcmVmZXJlbmNlIHRvIHN1cGVyYmxvY2ssIGFjcXVpcmluZyBhIHRlbXByb3J5IG9uZSBpZgorICoJdGhlcmUgaXMgbm8gYWN0aXZlIHJlZmVyZW5jZXMgbGVmdC4gIEluIHRoYXQgY2FzZSB3ZSBsb2NrIHN1cGVyYmxvY2ssCisgKgl0ZWxsIGZzIGRyaXZlciB0byBzaHV0IGl0IGRvd24gYW5kIGRyb3AgdGhlIHRlbXBvcmFyeSByZWZlcmVuY2Ugd2UKKyAqCWhhZCBqdXN0IGFjcXVpcmVkLgorICovCit2b2lkIGRlYWN0aXZhdGVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCXN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmcyA9IHMtPnNfdHlwZTsKKwlpZiAoYXRvbWljX2RlY19hbmRfbG9jaygmcy0+c19hY3RpdmUsICZzYl9sb2NrKSkgeworCQlzLT5zX2NvdW50IC09IFNfQklBUy0xOworCQlzcGluX3VubG9jaygmc2JfbG9jayk7CisJCWRvd25fd3JpdGUoJnMtPnNfdW1vdW50KTsKKwkJZnMtPmtpbGxfc2Iocyk7CisJCXB1dF9maWxlc3lzdGVtKGZzKTsKKwkJcHV0X3N1cGVyKHMpOworCX0KK30KKworRVhQT1JUX1NZTUJPTChkZWFjdGl2YXRlX3N1cGVyKTsKKworLyoqCisgKglncmFiX3N1cGVyIC0gYWNxdWlyZSBhbiBhY3RpdmUgcmVmZXJlbmNlCisgKglAczogcmVmZXJlbmNlIHdlIGFyZSB0cnlpbmcgdG8gbWFrZSBhY3RpdmUKKyAqCisgKglUcmllcyB0byBhY3F1aXJlIGFuIGFjdGl2ZSByZWZlcmVuY2UuICBncmFiX3N1cGVyKCkgaXMgdXNlZCB3aGVuIHdlCisgKiAJaGFkIGp1c3QgZm91bmQgYSBzdXBlcmJsb2NrIGluIHN1cGVyX2Jsb2NrcyBvciBmc190eXBlLT5mc19zdXBlcnMKKyAqCWFuZCB3YW50IHRvIHR1cm4gaXQgaW50byBhIGZ1bGwtYmxvd24gYWN0aXZlIHJlZmVyZW5jZS4gIGdyYWJfc3VwZXIoKQorICoJaXMgY2FsbGVkIHdpdGggc2JfbG9jayBoZWxkIGFuZCBkcm9wcyBpdC4gIFJldHVybnMgMSBpbiBjYXNlIG9mCisgKglzdWNjZXNzLCAwIGlmIHdlIGhhZCBmYWlsZWQgKHN1cGVyYmxvY2sgY29udGVudHMgd2FzIGFscmVhZHkgZGVhZCBvcgorICoJZHlpbmcgd2hlbiBncmFiX3N1cGVyKCkgaGFkIGJlZW4gY2FsbGVkKS4KKyAqLworc3RhdGljIGludCBncmFiX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlzLT5zX2NvdW50Kys7CisJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCWRvd25fd3JpdGUoJnMtPnNfdW1vdW50KTsKKwlpZiAocy0+c19yb290KSB7CisJCXNwaW5fbG9jaygmc2JfbG9jayk7CisJCWlmIChzLT5zX2NvdW50ID4gU19CSUFTKSB7CisJCQlhdG9taWNfaW5jKCZzLT5zX2FjdGl2ZSk7CisJCQlzLT5zX2NvdW50LS07CisJCQlzcGluX3VubG9jaygmc2JfbG9jayk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlzcGluX3VubG9jaygmc2JfbG9jayk7CisJfQorCXVwX3dyaXRlKCZzLT5zX3Vtb3VudCk7CisJcHV0X3N1cGVyKHMpOworCXlpZWxkKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJZ2VuZXJpY19zaHV0ZG93bl9zdXBlcgktCWNvbW1vbiBoZWxwZXIgZm9yIC0+a2lsbF9zYigpCisgKglAc2I6IHN1cGVyYmxvY2sgdG8ga2lsbAorICoKKyAqCWdlbmVyaWNfc2h1dGRvd25fc3VwZXIoKSBkb2VzIGFsbCBmcy1pbmRlcGVuZGVudCB3b3JrIG9uIHN1cGVyYmxvY2sKKyAqCXNodXRkb3duLiAgVHlwaWNhbCAtPmtpbGxfc2IoKSBzaG91bGQgcGljayBhbGwgZnMtc3BlY2lmaWMgb2JqZWN0cworICoJdGhhdCBuZWVkIGRlc3RydWN0aW9uIG91dCBvZiBzdXBlcmJsb2NrLCBjYWxsIGdlbmVyaWNfc2h1dGRvd25fc3VwZXIoKQorICoJYW5kIHJlbGVhc2UgYWZvcmVtZW50aW9uZWQgb2JqZWN0cy4gIE5vdGU6IGRlbnRyaWVzIGFuZCBpbm9kZXMgX2FyZV8KKyAqCXRha2VuIGNhcmUgb2YgYW5kIGRvIG5vdCBuZWVkIHNwZWNpZmljIGhhbmRsaW5nLgorICovCit2b2lkIGdlbmVyaWNfc2h1dGRvd25fc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpyb290ID0gc2ItPnNfcm9vdDsKKwlzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyAqc29wID0gc2ItPnNfb3A7CisKKwlpZiAocm9vdCkgeworCQlzYi0+c19yb290ID0gTlVMTDsKKwkJc2hyaW5rX2RjYWNoZV9wYXJlbnQocm9vdCk7CisJCXNocmlua19kY2FjaGVfYW5vbigmc2ItPnNfYW5vbik7CisJCWRwdXQocm9vdCk7CisJCWZzeW5jX3N1cGVyKHNiKTsKKwkJbG9ja19zdXBlcihzYik7CisJCXNiLT5zX2ZsYWdzICY9IH5NU19BQ1RJVkU7CisJCS8qIGJhZCBuYW1lIC0gaXQgc2hvdWxkIGJlIGV2aWN0X2lub2RlcygpICovCisJCWludmFsaWRhdGVfaW5vZGVzKHNiKTsKKwkJbG9ja19rZXJuZWwoKTsKKworCQlpZiAoc29wLT53cml0ZV9zdXBlciAmJiBzYi0+c19kaXJ0KQorCQkJc29wLT53cml0ZV9zdXBlcihzYik7CisJCWlmIChzb3AtPnB1dF9zdXBlcikKKwkJCXNvcC0+cHV0X3N1cGVyKHNiKTsKKworCQkvKiBGb3JnZXQgYW55IHJlbWFpbmluZyBpbm9kZXMgKi8KKwkJaWYgKGludmFsaWRhdGVfaW5vZGVzKHNiKSkgeworCQkJcHJpbnRrKCJWRlM6IEJ1c3kgaW5vZGVzIGFmdGVyIHVubW91bnQuICIKKwkJCSAgICJTZWxmLWRlc3RydWN0IGluIDUgc2Vjb25kcy4gIEhhdmUgYSBuaWNlIGRheS4uLlxuIik7CisJCX0KKworCQl1bmxvY2tfa2VybmVsKCk7CisJCXVubG9ja19zdXBlcihzYik7CisJfQorCXNwaW5fbG9jaygmc2JfbG9jayk7CisJLyogc2hvdWxkIGJlIGluaXRpYWxpemVkIGZvciBfX3B1dF9zdXBlcl9hbmRfbmVlZF9yZXN0YXJ0KCkgKi8KKwlsaXN0X2RlbF9pbml0KCZzYi0+c19saXN0KTsKKwlsaXN0X2RlbCgmc2ItPnNfaW5zdGFuY2VzKTsKKwlzcGluX3VubG9jaygmc2JfbG9jayk7CisJdXBfd3JpdGUoJnNiLT5zX3Vtb3VudCk7Cit9CisKK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19zaHV0ZG93bl9zdXBlcik7CisKKy8qKgorICoJc2dldAktCWZpbmQgb3IgY3JlYXRlIGEgc3VwZXJibG9jaworICoJQHR5cGU6CWZpbGVzeXN0ZW0gdHlwZSBzdXBlcmJsb2NrIHNob3VsZCBiZWxvbmcgdG8KKyAqCUB0ZXN0Ogljb21wYXJpc29uIGNhbGxiYWNrCisgKglAc2V0OglzZXR1cCBjYWxsYmFjaworICoJQGRhdGE6CWFyZ3VtZW50IHRvIGVhY2ggb2YgdGhlbQorICovCitzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNnZXQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnR5cGUsCisJCQlpbnQgKCp0ZXN0KShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKix2b2lkICopLAorCQkJaW50ICgqc2V0KShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKix2b2lkICopLAorCQkJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJaW50IGVycjsKKworcmV0cnk6CisJc3Bpbl9sb2NrKCZzYl9sb2NrKTsKKwlpZiAodGVzdCkgbGlzdF9mb3JfZWFjaChwLCAmdHlwZS0+ZnNfc3VwZXJzKSB7CisJCXN0cnVjdCBzdXBlcl9ibG9jayAqb2xkOworCQlvbGQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzdXBlcl9ibG9jaywgc19pbnN0YW5jZXMpOworCQlpZiAoIXRlc3Qob2xkLCBkYXRhKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWdyYWJfc3VwZXIob2xkKSkKKwkJCWdvdG8gcmV0cnk7CisJCWlmIChzKQorCQkJZGVzdHJveV9zdXBlcihzKTsKKwkJcmV0dXJuIG9sZDsKKwl9CisJaWYgKCFzKSB7CisJCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKKwkJcyA9IGFsbG9jX3N1cGVyKCk7CisJCWlmICghcykKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIHJldHJ5OworCX0KKwkJCisJZXJyID0gc2V0KHMsIGRhdGEpOworCWlmIChlcnIpIHsKKwkJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCQlkZXN0cm95X3N1cGVyKHMpOworCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KKwlzLT5zX3R5cGUgPSB0eXBlOworCXN0cmxjcHkocy0+c19pZCwgdHlwZS0+bmFtZSwgc2l6ZW9mKHMtPnNfaWQpKTsKKwlsaXN0X2FkZF90YWlsKCZzLT5zX2xpc3QsICZzdXBlcl9ibG9ja3MpOworCWxpc3RfYWRkKCZzLT5zX2luc3RhbmNlcywgJnR5cGUtPmZzX3N1cGVycyk7CisJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCWdldF9maWxlc3lzdGVtKHR5cGUpOworCXJldHVybiBzOworfQorCitFWFBPUlRfU1lNQk9MKHNnZXQpOworCit2b2lkIGRyb3Bfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwl1cF9yZWFkKCZzYi0+c191bW91bnQpOworCXB1dF9zdXBlcihzYik7Cit9CisKK0VYUE9SVF9TWU1CT0woZHJvcF9zdXBlcik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWxvY2tfc3VwZXIoc2IpOworCWlmIChzYi0+c19yb290ICYmIHNiLT5zX2RpcnQpCisJCWlmIChzYi0+c19vcC0+d3JpdGVfc3VwZXIpCisJCQlzYi0+c19vcC0+d3JpdGVfc3VwZXIoc2IpOworCXVubG9ja19zdXBlcihzYik7Cit9CisKKy8qCisgKiBOb3RlOiBjaGVjayB0aGUgZGlydHkgZmxhZyBiZWZvcmUgd2FpdGluZywgc28gd2UgZG9uJ3QKKyAqIGhvbGQgdXAgdGhlIHN5bmMgd2hpbGUgbW91bnRpbmcgYSBkZXZpY2UuIChUaGUgbmV3bHkKKyAqIG1vdW50ZWQgZGV2aWNlIHdvbid0IG5lZWQgc3luY2luZy4pCisgKi8KK3ZvaWQgc3luY19zdXBlcnModm9pZCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKK3Jlc3RhcnQ6CisJc3Bpbl9sb2NrKCZzYl9sb2NrKTsKKwlzYiA9IHNiX2VudHJ5KHN1cGVyX2Jsb2Nrcy5uZXh0KTsKKwl3aGlsZSAoc2IgIT0gc2JfZW50cnkoJnN1cGVyX2Jsb2NrcykpCisJCWlmIChzYi0+c19kaXJ0KSB7CisJCQlzYi0+c19jb3VudCsrOworCQkJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCQkJZG93bl9yZWFkKCZzYi0+c191bW91bnQpOworCQkJd3JpdGVfc3VwZXIoc2IpOworCQkJZHJvcF9zdXBlcihzYik7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0gZWxzZQorCQkJc2IgPSBzYl9lbnRyeShzYi0+c19saXN0Lm5leHQpOworCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKK30KKworLyoKKyAqIENhbGwgdGhlIC0+c3luY19mcyBzdXBlcl9vcCBhZ2FpbnN0IGFsbCBmaWxlc3l0ZW1zIHdoaWNoIGFyZSByL3cgYW5kCisgKiB3aGljaCBpbXBsZW1lbnQgaXQuCisgKgorICogVGhpcyBvcGVyYXRpb24gaXMgY2FyZWZ1bCB0byBhdm9pZCB0aGUgbGl2ZWxvY2sgd2hpY2ggY291bGQgZWFzaWx5IGhhcHBlbgorICogaWYgdHdvIG9yIG1vcmUgZmlsZXN5c3RlbXMgYXJlIGJlaW5nIGNvbnRpbnVvdXNseSBkaXJ0aWVkLiAgc19uZWVkX3N5bmNfZnMKKyAqIGlzIHVzZWQgb25seSBoZXJlLiAgV2Ugc2V0IGl0IGFnYWluc3QgYWxsIGZpbGVzeXN0ZW1zIGFuZCB0aGVuIGNsZWFyIGl0IGFzCisgKiB3ZSBzeW5jIHRoZW0uICBTbyByZWRpcnRpZWQgZmlsZXN5c3RlbXMgYXJlIHNraXBwZWQuCisgKgorICogQnV0IGlmIHByb2Nlc3MgQSBpcyBjdXJyZW50bHkgcnVubmluZyBzeW5jX2ZpbGVzeXRlbXMgYW5kIHRoZW4gcHJvY2VzcyBCCisgKiBjYWxscyBzeW5jX2ZpbGVzeXN0ZW1zIGFzIHdlbGwsIHByb2Nlc3MgQiB3aWxsIHNldCBhbGwgdGhlIHNfbmVlZF9zeW5jX2ZzCisgKiBmbGFncyBhZ2Fpbiwgd2hpY2ggd2lsbCBjYXVzZSBwcm9jZXNzIEEgdG8gcmVzeW5jIGV2ZXJ5dGhpbmcuICBGaXggdGhhdCB3aXRoCisgKiBhIGxvY2FsIG11dGV4LgorICoKKyAqIChGYWJpYW4pIEF2b2lkIHN5bmNfZnMgd2l0aCBjbGVhbiBmcyAmIHdhaXQgbW9kZSAwCisgKi8KK3ZvaWQgc3luY19maWxlc3lzdGVtcyhpbnQgd2FpdCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0YXRpYyBERUNMQVJFX01VVEVYKG11dGV4KTsKKworCWRvd24oJm11dGV4KTsJCS8qIENvdWxkIGJlIGRvd25faW50ZXJydXB0aWJsZSAqLworCXNwaW5fbG9jaygmc2JfbG9jayk7CisJZm9yIChzYiA9IHNiX2VudHJ5KHN1cGVyX2Jsb2Nrcy5uZXh0KTsgc2IgIT0gc2JfZW50cnkoJnN1cGVyX2Jsb2Nrcyk7CisJCQlzYiA9IHNiX2VudHJ5KHNiLT5zX2xpc3QubmV4dCkpIHsKKwkJaWYgKCFzYi0+c19vcC0+c3luY19mcykKKwkJCWNvbnRpbnVlOworCQlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCQljb250aW51ZTsKKwkJc2ItPnNfbmVlZF9zeW5jX2ZzID0gMTsKKwl9CisJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCityZXN0YXJ0OgorCXNwaW5fbG9jaygmc2JfbG9jayk7CisJZm9yIChzYiA9IHNiX2VudHJ5KHN1cGVyX2Jsb2Nrcy5uZXh0KTsgc2IgIT0gc2JfZW50cnkoJnN1cGVyX2Jsb2Nrcyk7CisJCQlzYiA9IHNiX2VudHJ5KHNiLT5zX2xpc3QubmV4dCkpIHsKKwkJaWYgKCFzYi0+c19uZWVkX3N5bmNfZnMpCisJCQljb250aW51ZTsKKwkJc2ItPnNfbmVlZF9zeW5jX2ZzID0gMDsKKwkJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQkJY29udGludWU7CS8qIGhtLiAgV2FzIHJlbW91bnRlZCByL28gbWVhbndoaWxlICovCisJCXNiLT5zX2NvdW50Kys7CisJCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKKwkJZG93bl9yZWFkKCZzYi0+c191bW91bnQpOworCQlpZiAoc2ItPnNfcm9vdCAmJiAod2FpdCB8fCBzYi0+c19kaXJ0KSkKKwkJCXNiLT5zX29wLT5zeW5jX2ZzKHNiLCB3YWl0KTsKKwkJZHJvcF9zdXBlcihzYik7CisJCWdvdG8gcmVzdGFydDsKKwl9CisJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCXVwKCZtdXRleCk7Cit9CisKKy8qKgorICoJZ2V0X3N1cGVyIC0gZ2V0IHRoZSBzdXBlcmJsb2NrIG9mIGEgZGV2aWNlCisgKglAYmRldjogZGV2aWNlIHRvIGdldCB0aGUgc3VwZXJibG9jayBmb3IKKyAqCQorICoJU2NhbnMgdGhlIHN1cGVyYmxvY2sgbGlzdCBhbmQgZmluZHMgdGhlIHN1cGVyYmxvY2sgb2YgdGhlIGZpbGUgc3lzdGVtCisgKgltb3VudGVkIG9uIHRoZSBkZXZpY2UgZ2l2ZW4uICVOVUxMIGlzIHJldHVybmVkIGlmIG5vIG1hdGNoIGlzIGZvdW5kLgorICovCisKK3N0cnVjdCBzdXBlcl9ibG9jayAqIGdldF9zdXBlcihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJaWYgKCFiZGV2KQorCQlyZXR1cm4gTlVMTDsKK3Jlc2NhbjoKKwlzcGluX2xvY2soJnNiX2xvY2spOworCWxpc3RfZm9yX2VhY2gocCwgJnN1cGVyX2Jsb2NrcykgeworCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBzYl9lbnRyeShwKTsKKwkJaWYgKHMtPnNfYmRldiA9PSBiZGV2KSB7CisJCQlzLT5zX2NvdW50Kys7CisJCQlzcGluX3VubG9jaygmc2JfbG9jayk7CisJCQlkb3duX3JlYWQoJnMtPnNfdW1vdW50KTsKKwkJCWlmIChzLT5zX3Jvb3QpCisJCQkJcmV0dXJuIHM7CisJCQlkcm9wX3N1cGVyKHMpOworCQkJZ290byByZXNjYW47CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCXJldHVybiBOVUxMOworfQorCitFWFBPUlRfU1lNQk9MKGdldF9zdXBlcik7CisgCitzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiB1c2VyX2dldF9zdXBlcihkZXZfdCBkZXYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworcmVzY2FuOgorCXNwaW5fbG9jaygmc2JfbG9jayk7CisJbGlzdF9mb3JfZWFjaChwLCAmc3VwZXJfYmxvY2tzKSB7CisJCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IHNiX2VudHJ5KHApOworCQlpZiAocy0+c19kZXYgPT0gIGRldikgeworCQkJcy0+c19jb3VudCsrOworCQkJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCQkJZG93bl9yZWFkKCZzLT5zX3Vtb3VudCk7CisJCQlpZiAocy0+c19yb290KQorCQkJCXJldHVybiBzOworCQkJZHJvcF9zdXBlcihzKTsKKwkJCWdvdG8gcmVzY2FuOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKworRVhQT1JUX1NZTUJPTCh1c2VyX2dldF9zdXBlcik7CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfdXN0YXQodW5zaWduZWQgZGV2LCBzdHJ1Y3QgdXN0YXQgX191c2VyICogdWJ1ZikKK3sKKyAgICAgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzOworICAgICAgICBzdHJ1Y3QgdXN0YXQgdG1wOworICAgICAgICBzdHJ1Y3Qga3N0YXRmcyBzYnVmOworCWludCBlcnIgPSAtRUlOVkFMOworCisgICAgICAgIHMgPSB1c2VyX2dldF9zdXBlcihuZXdfZGVjb2RlX2RldihkZXYpKTsKKyAgICAgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKwllcnIgPSB2ZnNfc3RhdGZzKHMsICZzYnVmKTsKKwlkcm9wX3N1cGVyKHMpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisgICAgICAgIG1lbXNldCgmdG1wLDAsc2l6ZW9mKHN0cnVjdCB1c3RhdCkpOworICAgICAgICB0bXAuZl90ZnJlZSA9IHNidWYuZl9iZnJlZTsKKyAgICAgICAgdG1wLmZfdGlub2RlID0gc2J1Zi5mX2ZmcmVlOworCisgICAgICAgIGVyciA9IGNvcHlfdG9fdXNlcih1YnVmLCZ0bXAsc2l6ZW9mKHN0cnVjdCB1c3RhdCkpID8gLUVGQVVMVCA6IDA7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKgltYXJrX2ZpbGVzX3JvCisgKglAc2I6IHN1cGVyYmxvY2sgaW4gcXVlc3Rpb24KKyAqCisgKglBbGwgZmlsZXMgYXJlIG1hcmtlZCByZWFkL29ubHkuICBXZSBkb24ndCBjYXJlIGFib3V0IHBlbmRpbmcKKyAqCWRlbGV0ZSBmaWxlcyBzbyB0aGlzIHNob3VsZCBiZSB1c2VkIGluICdmb3JjZScgbW9kZSBvbmx5CisgKi8KKworc3RhdGljIHZvaWQgbWFya19maWxlc19ybyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBmaWxlICpmOworCisJZmlsZV9saXN0X2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGYsICZzYi0+c19maWxlcywgZl9saXN0KSB7CisJCWlmIChTX0lTUkVHKGYtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpICYmIGZpbGVfY291bnQoZikpCisJCQlmLT5mX21vZGUgJj0gfkZNT0RFX1dSSVRFOworCX0KKwlmaWxlX2xpc3RfdW5sb2NrKCk7Cit9CisKKy8qKgorICoJZG9fcmVtb3VudF9zYiAtIGFza3MgZmlsZXN5c3RlbSB0byBjaGFuZ2UgbW91bnQgb3B0aW9ucy4KKyAqCUBzYjoJc3VwZXJibG9jayBpbiBxdWVzdGlvbgorICoJQGZsYWdzOgludW1lcmljIHBhcnQgb2Ygb3B0aW9ucworICoJQGRhdGE6CXRoZSByZXN0IG9mIG9wdGlvbnMKKyAqICAgICAgQGZvcmNlOiB3aGV0aGVyIG9yIG5vdCB0byBmb3JjZSB0aGUgY2hhbmdlCisgKgorICoJQWx0ZXJzIHRoZSBtb3VudCBvcHRpb25zIG9mIGEgbW91bnRlZCBmaWxlIHN5c3RlbS4KKyAqLworaW50IGRvX3JlbW91bnRfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGZsYWdzLCB2b2lkICpkYXRhLCBpbnQgZm9yY2UpCit7CisJaW50IHJldHZhbDsKKwkKKwlpZiAoIShmbGFncyAmIE1TX1JET05MWSkgJiYgYmRldl9yZWFkX29ubHkoc2ItPnNfYmRldikpCisJCXJldHVybiAtRUFDQ0VTOworCWlmIChmbGFncyAmIE1TX1JET05MWSkKKwkJYWNjdF9hdXRvX2Nsb3NlKHNiKTsKKwlzaHJpbmtfZGNhY2hlX3NiKHNiKTsKKwlmc3luY19zdXBlcihzYik7CisKKwkvKiBJZiB3ZSBhcmUgcmVtb3VudGluZyBSRE9OTFkgYW5kIGN1cnJlbnQgc2IgaXMgcmVhZC93cml0ZSwKKwkgICBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHJ3IGZpbGVzIG9wZW5lZCAqLworCWlmICgoZmxhZ3MgJiBNU19SRE9OTFkpICYmICEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCWlmIChmb3JjZSkKKwkJCW1hcmtfZmlsZXNfcm8oc2IpOworCQllbHNlIGlmICghZnNfbWF5X3JlbW91bnRfcm8oc2IpKQorCQkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoc2ItPnNfb3AtPnJlbW91bnRfZnMpIHsKKwkJbG9ja19zdXBlcihzYik7CisJCXJldHZhbCA9IHNiLT5zX29wLT5yZW1vdW50X2ZzKHNiLCAmZmxhZ3MsIGRhdGEpOworCQl1bmxvY2tfc3VwZXIoc2IpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisJc2ItPnNfZmxhZ3MgPSAoc2ItPnNfZmxhZ3MgJiB+TVNfUk1UX01BU0spIHwgKGZsYWdzICYgTVNfUk1UX01BU0spOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkb19lbWVyZ2VuY3lfcmVtb3VudCh1bnNpZ25lZCBsb25nIGZvbykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCisJc3Bpbl9sb2NrKCZzYl9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNiLCAmc3VwZXJfYmxvY2tzLCBzX2xpc3QpIHsKKwkJc2ItPnNfY291bnQrKzsKKwkJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCQlkb3duX3JlYWQoJnNiLT5zX3Vtb3VudCk7CisJCWlmIChzYi0+c19yb290ICYmIHNiLT5zX2JkZXYgJiYgIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJCS8qCisJCQkgKiAtPnJlbW91bnRfZnMgbmVlZHMgbG9ja19rZXJuZWwoKS4KKwkJCSAqCisJCQkgKiBXaGF0IGxvY2sgcHJvdGVjdHMgc2ItPnNfZmxhZ3M/PworCQkJICovCisJCQlsb2NrX2tlcm5lbCgpOworCQkJZG9fcmVtb3VudF9zYihzYiwgTVNfUkRPTkxZLCBOVUxMLCAxKTsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJfQorCQlkcm9wX3N1cGVyKHNiKTsKKwkJc3Bpbl9sb2NrKCZzYl9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCXByaW50aygiRW1lcmdlbmN5IFJlbW91bnQgY29tcGxldGVcbiIpOworfQorCit2b2lkIGVtZXJnZW5jeV9yZW1vdW50KHZvaWQpCit7CisJcGRmbHVzaF9vcGVyYXRpb24oZG9fZW1lcmdlbmN5X3JlbW91bnQsIDApOworfQorCisvKgorICogVW5uYW1lZCBibG9jayBkZXZpY2VzIGFyZSBkdW1teSBkZXZpY2VzIHVzZWQgYnkgdmlydHVhbAorICogZmlsZXN5c3RlbXMgd2hpY2ggZG9uJ3QgdXNlIHJlYWwgYmxvY2stZGV2aWNlcy4gIC0tIGpycworICovCisKK3N0YXRpYyBzdHJ1Y3QgaWRyIHVubmFtZWRfZGV2X2lkcjsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodW5uYW1lZF9kZXZfbG9jayk7LyogcHJvdGVjdHMgdGhlIGFib3ZlICovCisKK2ludCBzZXRfYW5vbl9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHZvaWQgKmRhdGEpCit7CisJaW50IGRldjsKKwlpbnQgZXJyb3I7CisKKyByZXRyeToKKwlpZiAoaWRyX3ByZV9nZXQoJnVubmFtZWRfZGV2X2lkciwgR0ZQX0FUT01JQykgPT0gMCkKKwkJcmV0dXJuIC1FTk9NRU07CisJc3Bpbl9sb2NrKCZ1bm5hbWVkX2Rldl9sb2NrKTsKKwllcnJvciA9IGlkcl9nZXRfbmV3KCZ1bm5hbWVkX2Rldl9pZHIsIE5VTEwsICZkZXYpOworCXNwaW5fdW5sb2NrKCZ1bm5hbWVkX2Rldl9sb2NrKTsKKwlpZiAoZXJyb3IgPT0gLUVBR0FJTikKKwkJLyogV2UgcmFjZWQgYW5kIGxvc3Qgd2l0aCBhbm90aGVyIENQVS4gKi8KKwkJZ290byByZXRyeTsKKwllbHNlIGlmIChlcnJvcikKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlpZiAoKGRldiAmIE1BWF9JRF9NQVNLKSA9PSAoMSA8PCBNSU5PUkJJVFMpKSB7CisJCXNwaW5fbG9jaygmdW5uYW1lZF9kZXZfbG9jayk7CisJCWlkcl9yZW1vdmUoJnVubmFtZWRfZGV2X2lkciwgZGV2KTsKKwkJc3Bpbl91bmxvY2soJnVubmFtZWRfZGV2X2xvY2spOworCQlyZXR1cm4gLUVNRklMRTsKKwl9CisJcy0+c19kZXYgPSBNS0RFVigwLCBkZXYgJiBNSU5PUk1BU0spOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHNldF9hbm9uX3N1cGVyKTsKKwordm9pZCBraWxsX2Fub25fc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgc2xvdCA9IE1JTk9SKHNiLT5zX2Rldik7CisKKwlnZW5lcmljX3NodXRkb3duX3N1cGVyKHNiKTsKKwlzcGluX2xvY2soJnVubmFtZWRfZGV2X2xvY2spOworCWlkcl9yZW1vdmUoJnVubmFtZWRfZGV2X2lkciwgc2xvdCk7CisJc3Bpbl91bmxvY2soJnVubmFtZWRfZGV2X2xvY2spOworfQorCitFWFBPUlRfU1lNQk9MKGtpbGxfYW5vbl9zdXBlcik7CisKK3ZvaWQgX19pbml0IHVubmFtZWRfZGV2X2luaXQodm9pZCkKK3sKKwlpZHJfaW5pdCgmdW5uYW1lZF9kZXZfaWRyKTsKK30KKwordm9pZCBraWxsX2xpdHRlcl9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWlmIChzYi0+c19yb290KQorCQlkX2dlbm9jaWRlKHNiLT5zX3Jvb3QpOworCWtpbGxfYW5vbl9zdXBlcihzYik7Cit9CisKK0VYUE9SVF9TWU1CT0woa2lsbF9saXR0ZXJfc3VwZXIpOworCitzdGF0aWMgaW50IHNldF9iZGV2X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSkKK3sKKwlzLT5zX2JkZXYgPSBkYXRhOworCXMtPnNfZGV2ID0gcy0+c19iZGV2LT5iZF9kZXY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9iZGV2X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gKHZvaWQgKilzLT5zX2JkZXYgPT0gZGF0YTsKK30KKworc3RhdGljIHZvaWQgYmRldl91ZXZlbnQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgZW51bSBrb2JqZWN0X2FjdGlvbiBhY3Rpb24pCit7CisJaWYgKGJkZXYtPmJkX2Rpc2spIHsKKwkJaWYgKGJkZXYtPmJkX3BhcnQpCisJCQlrb2JqZWN0X3VldmVudCgmYmRldi0+YmRfcGFydC0+a29iaiwgYWN0aW9uLCBOVUxMKTsKKwkJZWxzZQorCQkJa29iamVjdF91ZXZlbnQoJmJkZXYtPmJkX2Rpc2stPmtvYmosIGFjdGlvbiwgTlVMTCk7CisJfQorfQorCitzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmdldF9zYl9iZGV2KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsCisJaW50ICgqZmlsbF9zdXBlcikoc3RydWN0IHN1cGVyX2Jsb2NrICosIHZvaWQgKiwgaW50KSkKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCXN0cnVjdCBzdXBlcl9ibG9jayAqczsKKwlpbnQgZXJyb3IgPSAwOworCisJYmRldiA9IG9wZW5fYmRldl9leGNsKGRldl9uYW1lLCBmbGFncywgZnNfdHlwZSk7CisJaWYgKElTX0VSUihiZGV2KSkKKwkJcmV0dXJuIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiliZGV2OworCisJLyoKKwkgKiBvbmNlIHRoZSBzdXBlciBpcyBpbnNlcnRlZCBpbnRvIHRoZSBsaXN0IGJ5IHNnZXQsIHNfdW1vdW50CisJICogd2lsbCBwcm90ZWN0IHRoZSBsb2NrZnMgY29kZSBmcm9tIHRyeWluZyB0byBzdGFydCBhIHNuYXBzaG90CisJICogd2hpbGUgd2UgYXJlIG1vdW50aW5nCisJICovCisJZG93bigmYmRldi0+YmRfbW91bnRfc2VtKTsKKwlzID0gc2dldChmc190eXBlLCB0ZXN0X2JkZXZfc3VwZXIsIHNldF9iZGV2X3N1cGVyLCBiZGV2KTsKKwl1cCgmYmRldi0+YmRfbW91bnRfc2VtKTsKKwlpZiAoSVNfRVJSKHMpKQorCQlnb3RvIG91dDsKKworCWlmIChzLT5zX3Jvb3QpIHsKKwkJaWYgKChmbGFncyBeIHMtPnNfZmxhZ3MpICYgTVNfUkRPTkxZKSB7CisJCQl1cF93cml0ZSgmcy0+c191bW91bnQpOworCQkJZGVhY3RpdmF0ZV9zdXBlcihzKTsKKwkJCXMgPSBFUlJfUFRSKC1FQlVTWSk7CisJCX0KKwkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJY2hhciBiW0JERVZOQU1FX1NJWkVdOworCisJCXMtPnNfZmxhZ3MgPSBmbGFnczsKKwkJc3RybGNweShzLT5zX2lkLCBiZGV2bmFtZShiZGV2LCBiKSwgc2l6ZW9mKHMtPnNfaWQpKTsKKwkJcy0+c19vbGRfYmxvY2tzaXplID0gYmxvY2tfc2l6ZShiZGV2KTsKKwkJc2Jfc2V0X2Jsb2Nrc2l6ZShzLCBzLT5zX29sZF9ibG9ja3NpemUpOworCQllcnJvciA9IGZpbGxfc3VwZXIocywgZGF0YSwgZmxhZ3MgJiBNU19WRVJCT1NFID8gMSA6IDApOworCQlpZiAoZXJyb3IpIHsKKwkJCXVwX3dyaXRlKCZzLT5zX3Vtb3VudCk7CisJCQlkZWFjdGl2YXRlX3N1cGVyKHMpOworCQkJcyA9IEVSUl9QVFIoZXJyb3IpOworCQl9IGVsc2UgeworCQkJcy0+c19mbGFncyB8PSBNU19BQ1RJVkU7CisJCQliZGV2X3VldmVudChiZGV2LCBLT0JKX01PVU5UKTsKKwkJfQorCX0KKworCXJldHVybiBzOworCitvdXQ6CisJY2xvc2VfYmRldl9leGNsKGJkZXYpOworCXJldHVybiBzOworfQorCitFWFBPUlRfU1lNQk9MKGdldF9zYl9iZGV2KTsKKwordm9pZCBraWxsX2Jsb2NrX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IHNiLT5zX2JkZXY7CisKKwliZGV2X3VldmVudChiZGV2LCBLT0JKX1VNT1VOVCk7CisJZ2VuZXJpY19zaHV0ZG93bl9zdXBlcihzYik7CisJc3luY19ibG9ja2RldihiZGV2KTsKKwljbG9zZV9iZGV2X2V4Y2woYmRldik7Cit9CisKK0VYUE9SVF9TWU1CT0woa2lsbF9ibG9ja19zdXBlcik7CisKK3N0cnVjdCBzdXBlcl9ibG9jayAqZ2V0X3NiX25vZGV2KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgdm9pZCAqZGF0YSwKKwlpbnQgKCpmaWxsX3N1cGVyKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqLCBpbnQpKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBzZ2V0KGZzX3R5cGUsIE5VTEwsIHNldF9hbm9uX3N1cGVyLCBOVUxMKTsKKworCWlmIChJU19FUlIocykpCisJCXJldHVybiBzOworCisJcy0+c19mbGFncyA9IGZsYWdzOworCisJZXJyb3IgPSBmaWxsX3N1cGVyKHMsIGRhdGEsIGZsYWdzICYgTVNfVkVSQk9TRSA/IDEgOiAwKTsKKwlpZiAoZXJyb3IpIHsKKwkJdXBfd3JpdGUoJnMtPnNfdW1vdW50KTsKKwkJZGVhY3RpdmF0ZV9zdXBlcihzKTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworCX0KKwlzLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKKwlyZXR1cm4gczsKK30KKworRVhQT1JUX1NZTUJPTChnZXRfc2Jfbm9kZXYpOworCitzdGF0aWMgaW50IGNvbXBhcmVfc2luZ2xlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqcCkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RydWN0IHN1cGVyX2Jsb2NrICpnZXRfc2Jfc2luZ2xlKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgdm9pZCAqZGF0YSwKKwlpbnQgKCpmaWxsX3N1cGVyKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqLCBpbnQpKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqczsKKwlpbnQgZXJyb3I7CisKKwlzID0gc2dldChmc190eXBlLCBjb21wYXJlX3NpbmdsZSwgc2V0X2Fub25fc3VwZXIsIE5VTEwpOworCWlmIChJU19FUlIocykpCisJCXJldHVybiBzOworCWlmICghcy0+c19yb290KSB7CisJCXMtPnNfZmxhZ3MgPSBmbGFnczsKKwkJZXJyb3IgPSBmaWxsX3N1cGVyKHMsIGRhdGEsIGZsYWdzICYgTVNfVkVSQk9TRSA/IDEgOiAwKTsKKwkJaWYgKGVycm9yKSB7CisJCQl1cF93cml0ZSgmcy0+c191bW91bnQpOworCQkJZGVhY3RpdmF0ZV9zdXBlcihzKTsKKwkJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKKwkJfQorCQlzLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKKwl9CisJZG9fcmVtb3VudF9zYihzLCBmbGFncywgZGF0YSwgMCk7CisJcmV0dXJuIHM7Cit9CisKK0VYUE9SVF9TWU1CT0woZ2V0X3NiX3NpbmdsZSk7CisKK3N0cnVjdCB2ZnNtb3VudCAqCitkb19rZXJuX21vdW50KGNvbnN0IGNoYXIgKmZzdHlwZSwgaW50IGZsYWdzLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICp0eXBlID0gZ2V0X2ZzX3R5cGUoZnN0eXBlKTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gRVJSX1BUUigtRU5PTUVNKTsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKKwlpbnQgZXJyb3I7CisJY2hhciAqc2VjZGF0YSA9IE5VTEw7CisKKwlpZiAoIXR5cGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJbW50ID0gYWxsb2NfdmZzbW50KG5hbWUpOworCWlmICghbW50KQorCQlnb3RvIG91dDsKKworCWlmIChkYXRhKSB7CisJCXNlY2RhdGEgPSBhbGxvY19zZWNkYXRhKCk7CisJCWlmICghc2VjZGF0YSkgeworCQkJc2IgPSBFUlJfUFRSKC1FTk9NRU0pOworCQkJZ290byBvdXRfbW50OworCQl9CisKKwkJZXJyb3IgPSBzZWN1cml0eV9zYl9jb3B5X2RhdGEodHlwZSwgZGF0YSwgc2VjZGF0YSk7CisJCWlmIChlcnJvcikgeworCQkJc2IgPSBFUlJfUFRSKGVycm9yKTsKKwkJCWdvdG8gb3V0X2ZyZWVfc2VjZGF0YTsKKwkJfQorCX0KKworCXNiID0gdHlwZS0+Z2V0X3NiKHR5cGUsIGZsYWdzLCBuYW1lLCBkYXRhKTsKKwlpZiAoSVNfRVJSKHNiKSkKKwkJZ290byBvdXRfZnJlZV9zZWNkYXRhOworIAllcnJvciA9IHNlY3VyaXR5X3NiX2tlcm5fbW91bnQoc2IsIHNlY2RhdGEpOworIAlpZiAoZXJyb3IpCisgCQlnb3RvIG91dF9zYjsKKwltbnQtPm1udF9zYiA9IHNiOworCW1udC0+bW50X3Jvb3QgPSBkZ2V0KHNiLT5zX3Jvb3QpOworCW1udC0+bW50X21vdW50cG9pbnQgPSBzYi0+c19yb290OworCW1udC0+bW50X3BhcmVudCA9IG1udDsKKwltbnQtPm1udF9uYW1lc3BhY2UgPSBjdXJyZW50LT5uYW1lc3BhY2U7CisJdXBfd3JpdGUoJnNiLT5zX3Vtb3VudCk7CisJcHV0X2ZpbGVzeXN0ZW0odHlwZSk7CisJcmV0dXJuIG1udDsKK291dF9zYjoKKwl1cF93cml0ZSgmc2ItPnNfdW1vdW50KTsKKwlkZWFjdGl2YXRlX3N1cGVyKHNiKTsKKwlzYiA9IEVSUl9QVFIoZXJyb3IpOworb3V0X2ZyZWVfc2VjZGF0YToKKwlmcmVlX3NlY2RhdGEoc2VjZGF0YSk7CitvdXRfbW50OgorCWZyZWVfdmZzbW50KG1udCk7CitvdXQ6CisJcHV0X2ZpbGVzeXN0ZW0odHlwZSk7CisJcmV0dXJuIChzdHJ1Y3QgdmZzbW91bnQgKilzYjsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoZG9fa2Vybl9tb3VudCk7CisKK3N0cnVjdCB2ZnNtb3VudCAqa2Vybl9tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqdHlwZSkKK3sKKwlyZXR1cm4gZG9fa2Vybl9tb3VudCh0eXBlLT5uYW1lLCAwLCB0eXBlLT5uYW1lLCBOVUxMKTsKK30KKworRVhQT1JUX1NZTUJPTChrZXJuX21vdW50KTsKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL01ha2VmaWxlIGIvZnMvc3lzZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExY2ViOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3N5c2ZzL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIHN5c2ZzIHZpcnR1YWwgZmlsZXN5c3RlbQorIworCitvYmoteQkJOj0gaW5vZGUubyBmaWxlLm8gZGlyLm8gc3ltbGluay5vIG1vdW50Lm8gYmluLm8gXAorCQkgICBncm91cC5vCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9iaW4uYyBiL2ZzL3N5c2ZzL2Jpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YWFhODgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zeXNmcy9iaW4uYwpAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIGJpbi5jIC0gYmluYXJ5IGZpbGUgb3BlcmF0aW9ucyBmb3Igc3lzZnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIFBhdHJpY2sgTW9jaGVsCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWF0dGhldyBXaWxjb3gKKyAqIENvcHlyaWdodCAoYykgMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKi8KKworI3VuZGVmIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJzeXNmcy5oIgorCitzdGF0aWMgaW50CitmaWxsX3JlYWQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqIGF0dHIgPSB0b19iaW5fYXR0cihkZW50cnkpOworCXN0cnVjdCBrb2JqZWN0ICoga29iaiA9IHRvX2tvYmooZGVudHJ5LT5kX3BhcmVudCk7CisKKwlpZiAoIWF0dHItPnJlYWQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGF0dHItPnJlYWQoa29iaiwgYnVmZmVyLCBvZmYsIGNvdW50KTsKK30KKworc3RhdGljIHNzaXplX3QKK3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIHVzZXJidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICogb2ZmKQoreworCWNoYXIgKmJ1ZmZlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlpbnQgc2l6ZSA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9zaXplOworCWxvZmZfdCBvZmZzID0gKm9mZjsKKwlpbnQgcmV0OworCisJaWYgKGNvdW50ID4gUEFHRV9TSVpFKQorCQljb3VudCA9IFBBR0VfU0laRTsKKworCWlmIChzaXplKSB7CisJCWlmIChvZmZzID4gc2l6ZSkKKwkJCXJldHVybiAwOworCQlpZiAob2ZmcyArIGNvdW50ID4gc2l6ZSkKKwkJCWNvdW50ID0gc2l6ZSAtIG9mZnM7CisJfQorCisJcmV0ID0gZmlsbF9yZWFkKGRlbnRyeSwgYnVmZmVyLCBvZmZzLCBjb3VudCk7CisJaWYgKHJldCA8IDApIAorCQlyZXR1cm4gcmV0OworCWNvdW50ID0gcmV0OworCisJaWYgKGNvcHlfdG9fdXNlcih1c2VyYnVmLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlwcl9kZWJ1Zygib2ZmcyA9ICVsbGQsICpvZmYgPSAlbGxkLCBjb3VudCA9ICV6ZFxuIiwgb2ZmcywgKm9mZiwgY291bnQpOworCisJKm9mZiA9IG9mZnMgKyBjb3VudDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludAorZmx1c2hfd3JpdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIGxvZmZfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX2Jpbl9hdHRyKGRlbnRyeSk7CisJc3RydWN0IGtvYmplY3QgKmtvYmogPSB0b19rb2JqKGRlbnRyeS0+ZF9wYXJlbnQpOworCisJaWYgKCFhdHRyLT53cml0ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gYXR0ci0+d3JpdGUoa29iaiwgYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKK30KKworc3RhdGljIHNzaXplX3Qgd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIHVzZXJidWYsCisJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBvZmYpCit7CisJY2hhciAqYnVmZmVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCWludCBzaXplID0gZGVudHJ5LT5kX2lub2RlLT5pX3NpemU7CisJbG9mZl90IG9mZnMgPSAqb2ZmOworCisJaWYgKGNvdW50ID4gUEFHRV9TSVpFKQorCQljb3VudCA9IFBBR0VfU0laRTsKKwlpZiAoc2l6ZSkgeworCQlpZiAob2ZmcyA+IHNpemUpCisJCQlyZXR1cm4gMDsKKwkJaWYgKG9mZnMgKyBjb3VudCA+IHNpemUpCisJCQljb3VudCA9IHNpemUgLSBvZmZzOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcihidWZmZXIsIHVzZXJidWYsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljb3VudCA9IGZsdXNoX3dyaXRlKGRlbnRyeSwgYnVmZmVyLCBvZmZzLCBjb3VudCk7CisJaWYgKGNvdW50ID4gMCkKKwkJKm9mZiA9IG9mZnMgKyBjb3VudDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIgPSB0b19iaW5fYXR0cihkZW50cnkpOworCXN0cnVjdCBrb2JqZWN0ICprb2JqID0gdG9fa29iaihkZW50cnktPmRfcGFyZW50KTsKKworCWlmICghYXR0ci0+bW1hcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gYXR0ci0+bW1hcChrb2JqLCBhdHRyLCB2bWEpOworfQorCitzdGF0aWMgaW50IG9wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwlzdHJ1Y3Qga29iamVjdCAqa29iaiA9IHN5c2ZzX2dldF9rb2JqZWN0KGZpbGUtPmZfZGVudHJ5LT5kX3BhcmVudCk7CisJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKiBhdHRyID0gdG9fYmluX2F0dHIoZmlsZS0+Zl9kZW50cnkpOworCWludCBlcnJvciA9IC1FSU5WQUw7CisKKwlpZiAoIWtvYmogfHwgIWF0dHIpCisJCWdvdG8gRG9uZTsKKworCS8qIEdyYWIgdGhlIG1vZHVsZSByZWZlcmVuY2UgZm9yIHRoaXMgYXR0cmlidXRlIGlmIHdlIGhhdmUgb25lICovCisJZXJyb3IgPSAtRU5PREVWOworCWlmICghdHJ5X21vZHVsZV9nZXQoYXR0ci0+YXR0ci5vd25lcikpIAorCQlnb3RvIERvbmU7CisKKwllcnJvciA9IC1FQUNDRVM7CisJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgIShhdHRyLT53cml0ZSB8fCBhdHRyLT5tbWFwKSkKKwkJZ290byBFcnJvcjsKKwlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmICEoYXR0ci0+cmVhZCB8fCBhdHRyLT5tbWFwKSkKKwkJZ290byBFcnJvcjsKKworCWVycm9yID0gLUVOT01FTTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmaWxlLT5wcml2YXRlX2RhdGEpCisJCWdvdG8gRXJyb3I7CisKKwllcnJvciA9IDA7CisgICAgZ290byBEb25lOworCisgRXJyb3I6CisJbW9kdWxlX3B1dChhdHRyLT5hdHRyLm93bmVyKTsKKyBEb25lOgorCWlmIChlcnJvciAmJiBrb2JqKQorCQlrb2JqZWN0X3B1dChrb2JqKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCXN0cnVjdCBrb2JqZWN0ICoga29iaiA9IHRvX2tvYmooZmlsZS0+Zl9kZW50cnktPmRfcGFyZW50KTsKKwlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqIGF0dHIgPSB0b19iaW5fYXR0cihmaWxlLT5mX2RlbnRyeSk7CisJdTggKiBidWZmZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoa29iaikgCisJCWtvYmplY3RfcHV0KGtvYmopOworCW1vZHVsZV9wdXQoYXR0ci0+YXR0ci5vd25lcik7CisJa2ZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBiaW5fZm9wcyA9IHsKKwkucmVhZAkJPSByZWFkLAorCS53cml0ZQkJPSB3cml0ZSwKKwkubW1hcAkJPSBtbWFwLAorCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkub3BlbgkJPSBvcGVuLAorCS5yZWxlYXNlCT0gcmVsZWFzZSwKK307CisKKy8qKgorICoJc3lzZnNfY3JlYXRlX2Jpbl9maWxlIC0gY3JlYXRlIGJpbmFyeSBmaWxlIGZvciBvYmplY3QuCisgKglAa29iajoJb2JqZWN0LgorICoJQGF0dHI6CWF0dHJpYnV0ZSBkZXNjcmlwdG9yLgorICoKKyAqLworCitpbnQgc3lzZnNfY3JlYXRlX2Jpbl9maWxlKHN0cnVjdCBrb2JqZWN0ICoga29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKiBhdHRyKQoreworCUJVR19PTigha29iaiB8fCAha29iai0+ZGVudHJ5IHx8ICFhdHRyKTsKKworCXJldHVybiBzeXNmc19hZGRfZmlsZShrb2JqLT5kZW50cnksICZhdHRyLT5hdHRyLCBTWVNGU19LT0JKX0JJTl9BVFRSKTsKK30KKworCisvKioKKyAqCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSAtIHJlbW92ZSBiaW5hcnkgZmlsZSBmb3Igb2JqZWN0LgorICoJQGtvYmo6CW9iamVjdC4KKyAqCUBhdHRyOglhdHRyaWJ1dGUgZGVzY3JpcHRvci4KKyAqCisgKi8KKworaW50IHN5c2ZzX3JlbW92ZV9iaW5fZmlsZShzdHJ1Y3Qga29iamVjdCAqIGtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICogYXR0cikKK3sKKwlzeXNmc19oYXNoX2FuZF9yZW1vdmUoa29iai0+ZGVudHJ5LGF0dHItPmF0dHIubmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSk7CitFWFBPUlRfU1lNQk9MX0dQTChzeXNmc19yZW1vdmVfYmluX2ZpbGUpOwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZGlyLmMgYi9mcy9zeXNmcy9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTE5ODIxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3lzZnMvZGlyLmMKQEAgLTAsMCArMSw0NzUgQEAKKy8qCisgKiBkaXIuYyAtIE9wZXJhdGlvbnMgZm9yIHN5c2ZzIGRpcmVjdG9yaWVzLgorICovCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlICJzeXNmcy5oIgorCitERUNMQVJFX1JXU0VNKHN5c2ZzX3JlbmFtZV9zZW0pOworCitzdGF0aWMgdm9pZCBzeXNmc19kX2lwdXQoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJc3RydWN0IHN5c2ZzX2RpcmVudCAqIHNkID0gZGVudHJ5LT5kX2ZzZGF0YTsKKworCWlmIChzZCkgeworCQlCVUdfT04oc2QtPnNfZGVudHJ5ICE9IGRlbnRyeSk7CisJCXNkLT5zX2RlbnRyeSA9IE5VTEw7CisJCXN5c2ZzX3B1dChzZCk7CisJfQorCWlwdXQoaW5vZGUpOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIHN5c2ZzX2RlbnRyeV9vcHMgPSB7CisJLmRfaXB1dAkJPSBzeXNmc19kX2lwdXQsCit9OworCisvKgorICogQWxsb2NhdGVzIGEgbmV3IHN5c2ZzX2RpcmVudCBhbmQgbGlua3MgaXQgdG8gdGhlIHBhcmVudCBzeXNmc19kaXJlbnQKKyAqLworc3RhdGljIHN0cnVjdCBzeXNmc19kaXJlbnQgKiBzeXNmc19uZXdfZGlyZW50KHN0cnVjdCBzeXNmc19kaXJlbnQgKiBwYXJlbnRfc2QsCisJCQkJCQl2b2lkICogZWxlbWVudCkKK3sKKwlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc2Q7CisKKwlzZCA9IGttZW1fY2FjaGVfYWxsb2Moc3lzZnNfZGlyX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZCkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQoc2QsIDAsIHNpemVvZigqc2QpKTsKKwlhdG9taWNfc2V0KCZzZC0+c19jb3VudCwgMSk7CisJSU5JVF9MSVNUX0hFQUQoJnNkLT5zX2NoaWxkcmVuKTsKKwlsaXN0X2FkZCgmc2QtPnNfc2libGluZywgJnBhcmVudF9zZC0+c19jaGlsZHJlbik7CisJc2QtPnNfZWxlbWVudCA9IGVsZW1lbnQ7CisKKwlyZXR1cm4gc2Q7Cit9CisKK2ludCBzeXNmc19tYWtlX2RpcmVudChzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogcGFyZW50X3NkLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LAorCQkJdm9pZCAqIGVsZW1lbnQsIHVtb2RlX3QgbW9kZSwgaW50IHR5cGUpCit7CisJc3RydWN0IHN5c2ZzX2RpcmVudCAqIHNkOworCisJc2QgPSBzeXNmc19uZXdfZGlyZW50KHBhcmVudF9zZCwgZWxlbWVudCk7CisJaWYgKCFzZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzZC0+c19tb2RlID0gbW9kZTsKKwlzZC0+c190eXBlID0gdHlwZTsKKwlzZC0+c19kZW50cnkgPSBkZW50cnk7CisJaWYgKGRlbnRyeSkgeworCQlkZW50cnktPmRfZnNkYXRhID0gc3lzZnNfZ2V0KHNkKTsKKwkJZGVudHJ5LT5kX29wID0gJnN5c2ZzX2RlbnRyeV9vcHM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9kaXIoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJaW5vZGUtPmlfb3AgPSAmc3lzZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJnN5c2ZzX2Rpcl9vcGVyYXRpb25zOworCisJLyogZGlyZWN0b3J5IGlub2RlcyBzdGFydCBvZmYgd2l0aCBpX25saW5rID09IDIgKGZvciAiLiIgZW50cnkpICovCisJaW5vZGUtPmlfbmxpbmsrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0X2ZpbGUoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJaW5vZGUtPmlfc2l6ZSA9IFBBR0VfU0laRTsKKwlpbm9kZS0+aV9mb3AgPSAmc3lzZnNfZmlsZV9vcGVyYXRpb25zOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluaXRfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlpbm9kZS0+aV9vcCA9ICZzeXNmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX2RpcihzdHJ1Y3Qga29iamVjdCAqIGssIHN0cnVjdCBkZW50cnkgKiBwLAorCQkgICAgICBjb25zdCBjaGFyICogbiwgc3RydWN0IGRlbnRyeSAqKiBkKQoreworCWludCBlcnJvcjsKKwl1bW9kZV90IG1vZGUgPSBTX0lGRElSfCBTX0lSV1hVIHwgU19JUlVHTyB8IFNfSVhVR087CisKKwlkb3duKCZwLT5kX2lub2RlLT5pX3NlbSk7CisJKmQgPSBzeXNmc19nZXRfZGVudHJ5KHAsbik7CisJaWYgKCFJU19FUlIoKmQpKSB7CisJCWVycm9yID0gc3lzZnNfY3JlYXRlKCpkLCBtb2RlLCBpbml0X2Rpcik7CisJCWlmICghZXJyb3IpIHsKKwkJCWVycm9yID0gc3lzZnNfbWFrZV9kaXJlbnQocC0+ZF9mc2RhdGEsICpkLCBrLCBtb2RlLAorCQkJCQkJU1lTRlNfRElSKTsKKwkJCWlmICghZXJyb3IpIHsKKwkJCQlwLT5kX2lub2RlLT5pX25saW5rKys7CisJCQkJKCpkKS0+ZF9vcCA9ICZzeXNmc19kZW50cnlfb3BzOworCQkJCWRfcmVoYXNoKCpkKTsKKwkJCX0KKwkJfQorCQlpZiAoZXJyb3IgJiYgKGVycm9yICE9IC1FRVhJU1QpKQorCQkJZF9kcm9wKCpkKTsKKwkJZHB1dCgqZCk7CisJfSBlbHNlCisJCWVycm9yID0gUFRSX0VSUigqZCk7CisJdXAoJnAtPmRfaW5vZGUtPmlfc2VtKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworaW50IHN5c2ZzX2NyZWF0ZV9zdWJkaXIoc3RydWN0IGtvYmplY3QgKiBrLCBjb25zdCBjaGFyICogbiwgc3RydWN0IGRlbnRyeSAqKiBkKQoreworCXJldHVybiBjcmVhdGVfZGlyKGssay0+ZGVudHJ5LG4sZCk7Cit9CisKKy8qKgorICoJc3lzZnNfY3JlYXRlX2RpciAtIGNyZWF0ZSBhIGRpcmVjdG9yeSBmb3IgYW4gb2JqZWN0LgorICoJQHBhcmVudDoJcGFyZW50IHBhcmVudCBvYmplY3QuCisgKglAa29iajoJCW9iamVjdCB3ZSdyZSBjcmVhdGluZyBkaXJlY3RvcnkgZm9yLiAKKyAqLworCitpbnQgc3lzZnNfY3JlYXRlX2RpcihzdHJ1Y3Qga29iamVjdCAqIGtvYmopCit7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IE5VTEw7CisJc3RydWN0IGRlbnRyeSAqIHBhcmVudDsKKwlpbnQgZXJyb3IgPSAwOworCisJQlVHX09OKCFrb2JqKTsKKworCWlmIChrb2JqLT5wYXJlbnQpCisJCXBhcmVudCA9IGtvYmotPnBhcmVudC0+ZGVudHJ5OworCWVsc2UgaWYgKHN5c2ZzX21vdW50ICYmIHN5c2ZzX21vdW50LT5tbnRfc2IpCisJCXBhcmVudCA9IHN5c2ZzX21vdW50LT5tbnRfc2ItPnNfcm9vdDsKKwllbHNlCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyb3IgPSBjcmVhdGVfZGlyKGtvYmoscGFyZW50LGtvYmplY3RfbmFtZShrb2JqKSwmZGVudHJ5KTsKKwlpZiAoIWVycm9yKQorCQlrb2JqLT5kZW50cnkgPSBkZW50cnk7CisJcmV0dXJuIGVycm9yOworfQorCisvKiBhdHRhY2hlcyBhdHRyaWJ1dGUncyBzeXNmc19kaXJlbnQgdG8gdGhlIGRlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZQorICogYXR0cmlidXRlIGZpbGUKKyAqLworc3RhdGljIGludCBzeXNmc19hdHRhY2hfYXR0cihzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc2QsIHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCit7CisJc3RydWN0IGF0dHJpYnV0ZSAqIGF0dHIgPSBOVUxMOworCXN0cnVjdCBiaW5fYXR0cmlidXRlICogYmluX2F0dHIgPSBOVUxMOworCWludCAoKiBpbml0KSAoc3RydWN0IGlub2RlICopID0gTlVMTDsKKwlpbnQgZXJyb3IgPSAwOworCisgICAgICAgIGlmIChzZC0+c190eXBlICYgU1lTRlNfS09CSl9CSU5fQVRUUikgeworICAgICAgICAgICAgICAgIGJpbl9hdHRyID0gc2QtPnNfZWxlbWVudDsKKyAgICAgICAgICAgICAgICBhdHRyID0gJmJpbl9hdHRyLT5hdHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF0dHIgPSBzZC0+c19lbGVtZW50OworICAgICAgICAgICAgICAgIGluaXQgPSBpbml0X2ZpbGU7CisgICAgICAgIH0KKworCWVycm9yID0gc3lzZnNfY3JlYXRlKGRlbnRyeSwgKGF0dHItPm1vZGUgJiBTX0lBTExVR08pIHwgU19JRlJFRywgaW5pdCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKyAgICAgICAgaWYgKGJpbl9hdHRyKSB7CisJCWRlbnRyeS0+ZF9pbm9kZS0+aV9zaXplID0gYmluX2F0dHItPnNpemU7CisJCWRlbnRyeS0+ZF9pbm9kZS0+aV9mb3AgPSAmYmluX2ZvcHM7CisJfQorCWRlbnRyeS0+ZF9vcCA9ICZzeXNmc19kZW50cnlfb3BzOworCWRlbnRyeS0+ZF9mc2RhdGEgPSBzeXNmc19nZXQoc2QpOworCXNkLT5zX2RlbnRyeSA9IGRlbnRyeTsKKwlkX3JlaGFzaChkZW50cnkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3lzZnNfYXR0YWNoX2xpbmsoc3RydWN0IHN5c2ZzX2RpcmVudCAqIHNkLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5KQoreworCWludCBlcnIgPSAwOworCisJZXJyID0gc3lzZnNfY3JlYXRlKGRlbnRyeSwgU19JRkxOS3xTX0lSV1hVR08sIGluaXRfc3ltbGluayk7CisJaWYgKCFlcnIpIHsKKwkJZGVudHJ5LT5kX29wID0gJnN5c2ZzX2RlbnRyeV9vcHM7CisJCWRlbnRyeS0+ZF9mc2RhdGEgPSBzeXNmc19nZXQoc2QpOworCQlzZC0+c19kZW50cnkgPSBkZW50cnk7CisJCWRfcmVoYXNoKGRlbnRyeSk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICogc3lzZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHN5c2ZzX2RpcmVudCAqIHBhcmVudF9zZCA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfZnNkYXRhOworCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBzZDsKKwlpbnQgZXJyID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2QsICZwYXJlbnRfc2QtPnNfY2hpbGRyZW4sIHNfc2libGluZykgeworCQlpZiAoc2QtPnNfdHlwZSAmIFNZU0ZTX05PVF9QSU5ORUQpIHsKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKiBuYW1lID0gc3lzZnNfZ2V0X25hbWUoc2QpOworCisJCQlpZiAoc3RyY21wKG5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoc2QtPnNfdHlwZSAmIFNZU0ZTX0tPQkpfTElOSykKKwkJCQllcnIgPSBzeXNmc19hdHRhY2hfbGluayhzZCwgZGVudHJ5KTsKKwkJCWVsc2UKKwkJCQllcnIgPSBzeXNmc19hdHRhY2hfYXR0cihzZCwgZGVudHJ5KTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc3lzZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmxvb2t1cAkJPSBzeXNmc19sb29rdXAsCit9OworCitzdGF0aWMgdm9pZCByZW1vdmVfZGlyKHN0cnVjdCBkZW50cnkgKiBkKQoreworCXN0cnVjdCBkZW50cnkgKiBwYXJlbnQgPSBkZ2V0KGQtPmRfcGFyZW50KTsKKwlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc2Q7CisKKwlkb3duKCZwYXJlbnQtPmRfaW5vZGUtPmlfc2VtKTsKKwlkX2RlbGV0ZShkKTsKKwlzZCA9IGQtPmRfZnNkYXRhOworIAlsaXN0X2RlbF9pbml0KCZzZC0+c19zaWJsaW5nKTsKKwlzeXNmc19wdXQoc2QpOworCWlmIChkLT5kX2lub2RlKQorCQlzaW1wbGVfcm1kaXIocGFyZW50LT5kX2lub2RlLGQpOworCisJcHJfZGVidWcoIiBvICVzIHJlbW92aW5nIGRvbmUgKCVkKVxuIixkLT5kX25hbWUubmFtZSwKKwkJIGF0b21pY19yZWFkKCZkLT5kX2NvdW50KSk7CisKKwl1cCgmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisJZHB1dChwYXJlbnQpOworfQorCit2b2lkIHN5c2ZzX3JlbW92ZV9zdWJkaXIoc3RydWN0IGRlbnRyeSAqIGQpCit7CisJcmVtb3ZlX2RpcihkKTsKK30KKworCisvKioKKyAqCXN5c2ZzX3JlbW92ZV9kaXIgLSByZW1vdmUgYW4gb2JqZWN0J3MgZGlyZWN0b3J5LgorICoJQGtvYmo6CW9iamVjdC4gCisgKgorICoJVGhlIG9ubHkgdGhpbmcgc3BlY2lhbCBhYm91dCB0aGlzIGlzIHRoYXQgd2UgcmVtb3ZlIGFueSBmaWxlcyBpbiAKKyAqCXRoZSBkaXJlY3RvcnkgYmVmb3JlIHdlIHJlbW92ZSB0aGUgZGlyZWN0b3J5LCBhbmQgd2UndmUgaW5saW5lZAorICoJd2hhdCB1c2VkIHRvIGJlIHN5c2ZzX3JtZGlyKCkgYmVsb3csIGluc3RlYWQgb2YgY2FsbGluZyBzZXBhcmF0ZWx5LgorICovCisKK3ZvaWQgc3lzZnNfcmVtb3ZlX2RpcihzdHJ1Y3Qga29iamVjdCAqIGtvYmopCit7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGRnZXQoa29iai0+ZGVudHJ5KTsKKwlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogcGFyZW50X3NkOworCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBzZCwgKiB0bXA7CisKKwlpZiAoIWRlbnRyeSkKKwkJcmV0dXJuOworCisJcHJfZGVidWcoInN5c2ZzICVzOiByZW1vdmluZyBkaXJcbiIsZGVudHJ5LT5kX25hbWUubmFtZSk7CisJZG93bigmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJcGFyZW50X3NkID0gZGVudHJ5LT5kX2ZzZGF0YTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2QsIHRtcCwgJnBhcmVudF9zZC0+c19jaGlsZHJlbiwgc19zaWJsaW5nKSB7CisJCWlmICghc2QtPnNfZWxlbWVudCB8fCAhKHNkLT5zX3R5cGUgJiBTWVNGU19OT1RfUElOTkVEKSkKKwkJCWNvbnRpbnVlOworCQlsaXN0X2RlbF9pbml0KCZzZC0+c19zaWJsaW5nKTsKKwkJc3lzZnNfZHJvcF9kZW50cnkoc2QsIGRlbnRyeSk7CisJCXN5c2ZzX3B1dChzZCk7CisJfQorCXVwKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKworCXJlbW92ZV9kaXIoZGVudHJ5KTsKKwkvKioKKwkgKiBEcm9wIHJlZmVyZW5jZSBmcm9tIGRnZXQoKSBvbiBlbnRyYW5jZS4KKwkgKi8KKwlkcHV0KGRlbnRyeSk7Cit9CisKK2ludCBzeXNmc19yZW5hbWVfZGlyKHN0cnVjdCBrb2JqZWN0ICoga29iaiwgY29uc3QgY2hhciAqbmV3X25hbWUpCit7CisJaW50IGVycm9yID0gMDsKKwlzdHJ1Y3QgZGVudHJ5ICogbmV3X2RlbnRyeSwgKiBwYXJlbnQ7CisKKwlpZiAoIXN0cmNtcChrb2JqZWN0X25hbWUoa29iaiksIG5ld19uYW1lKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWtvYmotPnBhcmVudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duX3dyaXRlKCZzeXNmc19yZW5hbWVfc2VtKTsKKwlwYXJlbnQgPSBrb2JqLT5wYXJlbnQtPmRlbnRyeTsKKworCWRvd24oJnBhcmVudC0+ZF9pbm9kZS0+aV9zZW0pOworCisJbmV3X2RlbnRyeSA9IHN5c2ZzX2dldF9kZW50cnkocGFyZW50LCBuZXdfbmFtZSk7CisJaWYgKCFJU19FUlIobmV3X2RlbnRyeSkpIHsKKyAgCQlpZiAoIW5ld19kZW50cnktPmRfaW5vZGUpIHsKKwkJCWVycm9yID0ga29iamVjdF9zZXRfbmFtZShrb2JqLCAiJXMiLCBuZXdfbmFtZSk7CisJCQlpZiAoIWVycm9yKSB7CisJCQkJZF9hZGQobmV3X2RlbnRyeSwgTlVMTCk7CisJCQkJZF9tb3ZlKGtvYmotPmRlbnRyeSwgbmV3X2RlbnRyeSk7CisJCQl9CisJCQllbHNlCisJCQkJZF9kcm9wKG5ld19kZW50cnkpOworCQl9IGVsc2UKKwkJCWVycm9yID0gLUVFWElTVDsKKwkJZHB1dChuZXdfZGVudHJ5KTsKKwl9CisJdXAoJnBhcmVudC0+ZF9pbm9kZS0+aV9zZW0pOwkKKwl1cF93cml0ZSgmc3lzZnNfcmVuYW1lX3NlbSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgc3lzZnNfZGlyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBwYXJlbnRfc2QgPSBkZW50cnktPmRfZnNkYXRhOworCisJZG93bigmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gc3lzZnNfbmV3X2RpcmVudChwYXJlbnRfc2QsIE5VTEwpOworCXVwKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKworCXJldHVybiBmaWxlLT5wcml2YXRlX2RhdGEgPyAwIDogLUVOT01FTTsKKworfQorCitzdGF0aWMgaW50IHN5c2ZzX2Rpcl9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IHN5c2ZzX2RpcmVudCAqIGN1cnNvciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWRvd24oJmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCWxpc3RfZGVsX2luaXQoJmN1cnNvci0+c19zaWJsaW5nKTsKKwl1cCgmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisKKwlyZWxlYXNlX3N5c2ZzX2RpcmVudChjdXJzb3IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNfbW9kZSBhbmQgdGhlIERUX3h4eCB0eXBlcyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIGR0X3R5cGUoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QpCit7CisJcmV0dXJuIChzZC0+c19tb2RlID4+IDEyKSAmIDE1OworfQorCitzdGF0aWMgaW50IHN5c2ZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogcGFyZW50X3NkID0gZGVudHJ5LT5kX2ZzZGF0YTsKKwlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpjdXJzb3IgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKnEgPSAmY3Vyc29yLT5zX3NpYmxpbmc7CisJaW5vX3QgaW5vOworCWludCBpID0gZmlscC0+Zl9wb3M7CisKKwlzd2l0Y2ggKGkpIHsKKwkJY2FzZSAwOgorCQkJaW5vID0gZGVudHJ5LT5kX2lub2RlLT5pX2lubzsKKwkJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4iLCAxLCBpLCBpbm8sIERUX0RJUikgPCAwKQorCQkJCWJyZWFrOworCQkJZmlscC0+Zl9wb3MrKzsKKwkJCWkrKzsKKwkJCS8qIGZhbGx0aHJvdWdoICovCisJCWNhc2UgMToKKwkJCWlubyA9IHBhcmVudF9pbm8oZGVudHJ5KTsKKwkJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgaSwgaW5vLCBEVF9ESVIpIDwgMCkKKwkJCQlicmVhazsKKwkJCWZpbHAtPmZfcG9zKys7CisJCQlpKys7CisJCQkvKiBmYWxsdGhyb3VnaCAqLworCQlkZWZhdWx0OgorCQkJaWYgKGZpbHAtPmZfcG9zID09IDIpIHsKKwkJCQlsaXN0X2RlbChxKTsKKwkJCQlsaXN0X2FkZChxLCAmcGFyZW50X3NkLT5zX2NoaWxkcmVuKTsKKwkJCX0KKwkJCWZvciAocD1xLT5uZXh0OyBwIT0gJnBhcmVudF9zZC0+c19jaGlsZHJlbjsgcD1wLT5uZXh0KSB7CisJCQkJc3RydWN0IHN5c2ZzX2RpcmVudCAqbmV4dDsKKwkJCQljb25zdCBjaGFyICogbmFtZTsKKwkJCQlpbnQgbGVuOworCisJCQkJbmV4dCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHN5c2ZzX2RpcmVudCwKKwkJCQkJCSAgIHNfc2libGluZyk7CisJCQkJaWYgKCFuZXh0LT5zX2VsZW1lbnQpCisJCQkJCWNvbnRpbnVlOworCisJCQkJbmFtZSA9IHN5c2ZzX2dldF9uYW1lKG5leHQpOworCQkJCWxlbiA9IHN0cmxlbihuYW1lKTsKKwkJCQlpZiAobmV4dC0+c19kZW50cnkpCisJCQkJCWlubyA9IG5leHQtPnNfZGVudHJ5LT5kX2lub2RlLT5pX2lubzsKKwkJCQllbHNlCisJCQkJCWlubyA9IGl1bmlxdWUoc3lzZnNfc2IsIDIpOworCisJCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBuYW1lLCBsZW4sIGZpbHAtPmZfcG9zLCBpbm8sCisJCQkJCQkgZHRfdHlwZShuZXh0KSkgPCAwKQorCQkJCQlyZXR1cm4gMDsKKworCQkJCWxpc3RfZGVsKHEpOworCQkJCWxpc3RfYWRkKHEsIHApOworCQkJCXAgPSBxOworCQkJCWZpbHAtPmZfcG9zKys7CisJCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgbG9mZl90IHN5c2ZzX2Rpcl9sc2VlayhzdHJ1Y3QgZmlsZSAqIGZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pCit7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCisJZG93bigmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJc3dpdGNoIChvcmlnaW4pIHsKKwkJY2FzZSAxOgorCQkJb2Zmc2V0ICs9IGZpbGUtPmZfcG9zOworCQljYXNlIDA6CisJCQlpZiAob2Zmc2V0ID49IDApCisJCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1cCgmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAob2Zmc2V0ICE9IGZpbGUtPmZfcG9zKSB7CisJCWZpbGUtPmZfcG9zID0gb2Zmc2V0OworCQlpZiAoZmlsZS0+Zl9wb3MgPj0gMikgeworCQkJc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QgPSBkZW50cnktPmRfZnNkYXRhOworCQkJc3RydWN0IHN5c2ZzX2RpcmVudCAqY3Vyc29yID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQkJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwkJCWxvZmZfdCBuID0gZmlsZS0+Zl9wb3MgLSAyOworCisJCQlsaXN0X2RlbCgmY3Vyc29yLT5zX3NpYmxpbmcpOworCQkJcCA9IHNkLT5zX2NoaWxkcmVuLm5leHQ7CisJCQl3aGlsZSAobiAmJiBwICE9ICZzZC0+c19jaGlsZHJlbikgeworCQkJCXN0cnVjdCBzeXNmc19kaXJlbnQgKm5leHQ7CisJCQkJbmV4dCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHN5c2ZzX2RpcmVudCwKKwkJCQkJCSAgIHNfc2libGluZyk7CisJCQkJaWYgKG5leHQtPnNfZWxlbWVudCkKKwkJCQkJbi0tOworCQkJCXAgPSBwLT5uZXh0OworCQkJfQorCQkJbGlzdF9hZGRfdGFpbCgmY3Vyc29yLT5zX3NpYmxpbmcsIHApOworCQl9CisJfQorCXVwKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN5c2ZzX2Rpcl9vcGVyYXRpb25zID0geworCS5vcGVuCQk9IHN5c2ZzX2Rpcl9vcGVuLAorCS5yZWxlYXNlCT0gc3lzZnNfZGlyX2Nsb3NlLAorCS5sbHNlZWsJCT0gc3lzZnNfZGlyX2xzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBzeXNmc19yZWFkZGlyLAorfTsKKworRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfY3JlYXRlX2Rpcik7CitFWFBPUlRfU1lNQk9MX0dQTChzeXNmc19yZW1vdmVfZGlyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN5c2ZzX3JlbmFtZV9kaXIpOworCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9maWxlLmMgYi9mcy9zeXNmcy9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyZjk2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3N5c2ZzL2ZpbGUuYwpAQCAtMCwwICsxLDQ0NyBAQAorLyoKKyAqIGZpbGUuYyAtIG9wZXJhdGlvbnMgZm9yIHJlZ3VsYXIgKHRleHQpIGZpbGVzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSAic3lzZnMuaCIKKworI2RlZmluZSB0b19zdWJzeXMoaykgY29udGFpbmVyX29mKGssc3RydWN0IHN1YnN5c3RlbSxrc2V0LmtvYmopCisjZGVmaW5lIHRvX3NhdHRyKGEpIGNvbnRhaW5lcl9vZihhLHN0cnVjdCBzdWJzeXNfYXR0cmlidXRlLGF0dHIpCisKKy8qKgorICogU3Vic3lzdGVtIGZpbGUgb3BlcmF0aW9ucy4KKyAqIFRoZXNlIG9wZXJhdGlvbnMgYWxsb3cgc3Vic3lzdGVtcyB0byBoYXZlIGZpbGVzIHRoYXQgY2FuIGJlIAorICogcmVhZC93cml0dGVuLiAKKyAqLworc3RhdGljIHNzaXplX3QgCitzdWJzeXNfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICoga29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqIGF0dHIsIGNoYXIgKiBwYWdlKQoreworCXN0cnVjdCBzdWJzeXN0ZW0gKiBzID0gdG9fc3Vic3lzKGtvYmopOworCXN0cnVjdCBzdWJzeXNfYXR0cmlidXRlICogc2F0dHIgPSB0b19zYXR0cihhdHRyKTsKKwlzc2l6ZV90IHJldCA9IDA7CisKKwlpZiAoc2F0dHItPnNob3cpCisJCXJldCA9IHNhdHRyLT5zaG93KHMscGFnZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgCitzdWJzeXNfYXR0cl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqIGtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKiBhdHRyLCAKKwkJICBjb25zdCBjaGFyICogcGFnZSwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzdWJzeXN0ZW0gKiBzID0gdG9fc3Vic3lzKGtvYmopOworCXN0cnVjdCBzdWJzeXNfYXR0cmlidXRlICogc2F0dHIgPSB0b19zYXR0cihhdHRyKTsKKwlzc2l6ZV90IHJldCA9IDA7CisKKwlpZiAoc2F0dHItPnN0b3JlKQorCQlyZXQgPSBzYXR0ci0+c3RvcmUocyxwYWdlLGNvdW50KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHN5c2ZzX29wcyBzdWJzeXNfc3lzZnNfb3BzID0geworCS5zaG93CT0gc3Vic3lzX2F0dHJfc2hvdywKKwkuc3RvcmUJPSBzdWJzeXNfYXR0cl9zdG9yZSwKK307CisKKworc3RydWN0IHN5c2ZzX2J1ZmZlciB7CisJc2l6ZV90CQkJY291bnQ7CisJbG9mZl90CQkJcG9zOworCWNoYXIJCQkqIHBhZ2U7CisJc3RydWN0IHN5c2ZzX29wcwkqIG9wczsKKwlzdHJ1Y3Qgc2VtYXBob3JlCXNlbTsKKwlpbnQJCQluZWVkc19yZWFkX2ZpbGw7Cit9OworCisKKy8qKgorICoJZmlsbF9yZWFkX2J1ZmZlciAtIGFsbG9jYXRlIGFuZCBmaWxsIGJ1ZmZlciBmcm9tIG9iamVjdC4KKyAqCUBkZW50cnk6CWRlbnRyeSBwb2ludGVyLgorICoJQGJ1ZmZlcjoJZGF0YSBidWZmZXIgZm9yIGZpbGUuCisgKgorICoJQWxsb2NhdGUgQGJ1ZmZlci0+cGFnZSwgaWYgaXQgaGFzbid0IGJlZW4gYWxyZWFkeSwgdGhlbiBjYWxsIHRoZQorICoJa29iamVjdCdzIHNob3coKSBtZXRob2QgdG8gZmlsbCB0aGUgYnVmZmVyIHdpdGggdGhpcyBhdHRyaWJ1dGUncyAKKyAqCWRhdGEuIAorICoJVGhpcyBpcyBjYWxsZWQgb25seSBvbmNlLCBvbiB0aGUgZmlsZSdzIGZpcnN0IHJlYWQuIAorICovCitzdGF0aWMgaW50IGZpbGxfcmVhZF9idWZmZXIoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IHN5c2ZzX2J1ZmZlciAqIGJ1ZmZlcikKK3sKKwlzdHJ1Y3QgYXR0cmlidXRlICogYXR0ciA9IHRvX2F0dHIoZGVudHJ5KTsKKwlzdHJ1Y3Qga29iamVjdCAqIGtvYmogPSB0b19rb2JqKGRlbnRyeS0+ZF9wYXJlbnQpOworCXN0cnVjdCBzeXNmc19vcHMgKiBvcHMgPSBidWZmZXItPm9wczsKKwlpbnQgcmV0ID0gMDsKKwlzc2l6ZV90IGNvdW50OworCisJaWYgKCFidWZmZXItPnBhZ2UpCisJCWJ1ZmZlci0+cGFnZSA9IChjaGFyICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZmZlci0+cGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb3VudCA9IG9wcy0+c2hvdyhrb2JqLGF0dHIsYnVmZmVyLT5wYWdlKTsKKwlidWZmZXItPm5lZWRzX3JlYWRfZmlsbCA9IDA7CisJQlVHX09OKGNvdW50ID4gKHNzaXplX3QpUEFHRV9TSVpFKTsKKwlpZiAoY291bnQgPj0gMCkKKwkJYnVmZmVyLT5jb3VudCA9IGNvdW50OworCWVsc2UKKwkJcmV0ID0gY291bnQ7CisJcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqCWZsdXNoX3JlYWRfYnVmZmVyIC0gcHVzaCBidWZmZXIgdG8gdXNlcnNwYWNlLgorICoJQGJ1ZmZlcjoJZGF0YSBidWZmZXIgZm9yIGZpbGUuCisgKglAdXNlcmJ1ZjoJdXNlci1wYXNzZWQgYnVmZmVyLgorICoJQGNvdW50OgkJbnVtYmVyIG9mIGJ5dGVzIHJlcXVlc3RlZC4KKyAqCUBwcG9zOgkJZmlsZSBwb3NpdGlvbi4KKyAqCisgKglDb3B5IHRoZSBidWZmZXIgd2UgZmlsbGVkIGluIGZpbGxfcmVhZF9idWZmZXIoKSB0byB1c2Vyc3BhY2UuCisgKglUaGlzIGlzIGRvbmUgYXQgdGhlIHJlYWRlcidzIGxlaXN1cmUsIGNvcHlpbmcgYW5kIGFkdmFuY2luZyAKKyAqCXRoZSBhbW91bnQgdGhleSBzcGVjaWZ5IGVhY2ggdGltZS4KKyAqCVRoaXMgbWF5IGJlIGNhbGxlZCBjb250aW51b3VzbHkgdW50aWwgdGhlIGJ1ZmZlciBpcyBlbXB0eS4KKyAqLworc3RhdGljIGludCBmbHVzaF9yZWFkX2J1ZmZlcihzdHJ1Y3Qgc3lzZnNfYnVmZmVyICogYnVmZmVyLCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCWludCBlcnJvcjsKKworCWlmICgqcHBvcyA+IGJ1ZmZlci0+Y291bnQpCisJCXJldHVybiAwOworCisJaWYgKGNvdW50ID4gKGJ1ZmZlci0+Y291bnQgLSAqcHBvcykpCisJCWNvdW50ID0gYnVmZmVyLT5jb3VudCAtICpwcG9zOworCisJZXJyb3IgPSBjb3B5X3RvX3VzZXIoYnVmLGJ1ZmZlci0+cGFnZSArICpwcG9zLGNvdW50KTsKKwlpZiAoIWVycm9yKQorCQkqcHBvcyArPSBjb3VudDsKKwlyZXR1cm4gZXJyb3IgPyAtRUZBVUxUIDogY291bnQ7Cit9CisKKy8qKgorICoJc3lzZnNfcmVhZF9maWxlIC0gcmVhZCBhbiBhdHRyaWJ1dGUuIAorICoJQGZpbGU6CWZpbGUgcG9pbnRlci4KKyAqCUBidWY6CWJ1ZmZlciB0byBmaWxsLgorICoJQGNvdW50OgludW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAqCUBwcG9zOglzdGFydGluZyBvZmZzZXQgaW4gZmlsZS4KKyAqCisgKglVc2Vyc3BhY2Ugd2FudHMgdG8gcmVhZCBhbiBhdHRyaWJ1dGUgZmlsZS4gVGhlIGF0dHJpYnV0ZSBkZXNjcmlwdG9yCisgKglpcyBpbiB0aGUgZmlsZSdzIC0+ZF9mc2RhdGEuIFRoZSB0YXJnZXQgb2JqZWN0IGlzIGluIHRoZSBkaXJlY3RvcnkncworICoJLT5kX2ZzZGF0YS4KKyAqCisgKglXZSBjYWxsIGZpbGxfcmVhZF9idWZmZXIoKSB0byBhbGxvY2F0ZSBhbmQgZmlsbCB0aGUgYnVmZmVyIGZyb20gdGhlCisgKglvYmplY3QncyBzaG93KCkgbWV0aG9kIGV4YWN0bHkgb25jZSAoaWYgdGhlIHJlYWQgaXMgaGFwcGVuaW5nIGZyb20KKyAqCXRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUpLiBUaGF0IHNob3VsZCBmaWxsIHRoZSBlbnRpcmUgYnVmZmVyIHdpdGgKKyAqCWFsbCB0aGUgZGF0YSB0aGUgb2JqZWN0IGhhcyB0byBvZmZlciBmb3IgdGhhdCBhdHRyaWJ1dGUuCisgKglXZSB0aGVuIGNhbGwgZmx1c2hfcmVhZF9idWZmZXIoKSB0byBjb3B5IHRoZSBidWZmZXIgdG8gdXNlcnNwYWNlCisgKglpbiB0aGUgaW5jcmVtZW50cyBzcGVjaWZpZWQuCisgKi8KKworc3RhdGljIHNzaXplX3QKK3N5c2ZzX3JlYWRfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHN5c2ZzX2J1ZmZlciAqIGJ1ZmZlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IHJldHZhbCA9IDA7CisKKwlkb3duKCZidWZmZXItPnNlbSk7CisJaWYgKGJ1ZmZlci0+bmVlZHNfcmVhZF9maWxsKSB7CisJCWlmICgocmV0dmFsID0gZmlsbF9yZWFkX2J1ZmZlcihmaWxlLT5mX2RlbnRyeSxidWZmZXIpKSkKKwkJCWdvdG8gb3V0OworCX0KKwlwcl9kZWJ1ZygiJXM6IGNvdW50ID0gJWQsIHBwb3MgPSAlbGxkLCBidWYgPSAlc1xuIiwKKwkJIF9fRlVOQ1RJT05fXyxjb3VudCwqcHBvcyxidWZmZXItPnBhZ2UpOworCXJldHZhbCA9IGZsdXNoX3JlYWRfYnVmZmVyKGJ1ZmZlcixidWYsY291bnQscHBvcyk7CitvdXQ6CisJdXAoJmJ1ZmZlci0+c2VtKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKy8qKgorICoJZmlsbF93cml0ZV9idWZmZXIgLSBjb3B5IGJ1ZmZlciBmcm9tIHVzZXJzcGFjZS4KKyAqCUBidWZmZXI6CWRhdGEgYnVmZmVyIGZvciBmaWxlLgorICoJQHVzZXJidWY6CWRhdGEgZnJvbSB1c2VyLgorICoJQGNvdW50OgkJbnVtYmVyIG9mIGJ5dGVzIGluIEB1c2VyYnVmLgorICoKKyAqCUFsbG9jYXRlIEBidWZmZXItPnBhZ2UgaWYgaXQgaGFzbid0IGJlZW4gYWxyZWFkeSwgdGhlbgorICoJY29weSB0aGUgdXNlci1zdXBwbGllZCBidWZmZXIgaW50byBpdC4KKyAqLworCitzdGF0aWMgaW50IAorZmlsbF93cml0ZV9idWZmZXIoc3RydWN0IHN5c2ZzX2J1ZmZlciAqIGJ1ZmZlciwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoIWJ1ZmZlci0+cGFnZSkKKwkJYnVmZmVyLT5wYWdlID0gKGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmZXItPnBhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGNvdW50ID49IFBBR0VfU0laRSkKKwkJY291bnQgPSBQQUdFX1NJWkUgLSAxOworCWVycm9yID0gY29weV9mcm9tX3VzZXIoYnVmZmVyLT5wYWdlLGJ1Zixjb3VudCk7CisJYnVmZmVyLT5uZWVkc19yZWFkX2ZpbGwgPSAxOworCXJldHVybiBlcnJvciA/IC1FRkFVTFQgOiBjb3VudDsKK30KKworCisvKioKKyAqCWZsdXNoX3dyaXRlX2J1ZmZlciAtIHB1c2ggYnVmZmVyIHRvIGtvYmplY3QuCisgKglAZmlsZToJCWZpbGUgcG9pbnRlci4KKyAqCUBidWZmZXI6CWRhdGEgYnVmZmVyIGZvciBmaWxlLgorICoKKyAqCUdldCB0aGUgY29ycmVjdCBwb2ludGVycyBmb3IgdGhlIGtvYmplY3QgYW5kIHRoZSBhdHRyaWJ1dGUgd2UncmUKKyAqCWRlYWxpbmcgd2l0aCwgdGhlbiBjYWxsIHRoZSBzdG9yZSgpIG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZSwgCisgKglwYXNzaW5nIHRoZSBidWZmZXIgdGhhdCB3ZSBhY3F1aXJlZCBpbiBmaWxsX3dyaXRlX2J1ZmZlcigpLgorICovCisKK3N0YXRpYyBpbnQgCitmbHVzaF93cml0ZV9idWZmZXIoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IHN5c2ZzX2J1ZmZlciAqIGJ1ZmZlciwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBhdHRyaWJ1dGUgKiBhdHRyID0gdG9fYXR0cihkZW50cnkpOworCXN0cnVjdCBrb2JqZWN0ICoga29iaiA9IHRvX2tvYmooZGVudHJ5LT5kX3BhcmVudCk7CisJc3RydWN0IHN5c2ZzX29wcyAqIG9wcyA9IGJ1ZmZlci0+b3BzOworCisJcmV0dXJuIG9wcy0+c3RvcmUoa29iaixhdHRyLGJ1ZmZlci0+cGFnZSxjb3VudCk7Cit9CisKKworLyoqCisgKglzeXNmc193cml0ZV9maWxlIC0gd3JpdGUgYW4gYXR0cmlidXRlLgorICoJQGZpbGU6CWZpbGUgcG9pbnRlcgorICoJQGJ1ZjoJZGF0YSB0byB3cml0ZQorICoJQGNvdW50OgludW1iZXIgb2YgYnl0ZXMKKyAqCUBwcG9zOglzdGFydGluZyBvZmZzZXQKKyAqCisgKglTaW1pbGFyIHRvIHN5c2ZzX3JlYWRfZmlsZSgpLCB0aG91Z2ggd29ya2luZyBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLgorICoJV2UgYWxsb2NhdGUgYW5kIGZpbGwgdGhlIGRhdGEgZnJvbSB0aGUgdXNlciBpbiBmaWxsX3dyaXRlX2J1ZmZlcigpLAorICoJdGhlbiBwdXNoIGl0IHRvIHRoZSBrb2JqZWN0IGluIGZsdXNoX3dyaXRlX2J1ZmZlcigpLgorICoJVGhlcmUgaXMgbm8gZWFzeSB3YXkgZm9yIHVzIHRvIGtub3cgaWYgdXNlcnNwYWNlIGlzIG9ubHkgZG9pbmcgYSBwYXJ0aWFsCisgKgl3cml0ZSwgc28gd2UgZG9uJ3Qgc3VwcG9ydCB0aGVtLiBXZSBleHBlY3QgdGhlIGVudGlyZSBidWZmZXIgdG8gY29tZQorICoJb24gdGhlIGZpcnN0IHdyaXRlLiAKKyAqCUhpbnQ6IGlmIHlvdSdyZSB3cml0aW5nIGEgdmFsdWUsIGZpcnN0IHJlYWQgdGhlIGZpbGUsIG1vZGlmeSBvbmx5IHRoZQorICoJdGhlIHZhbHVlIHlvdSdyZSBjaGFuZ2luZywgdGhlbiB3cml0ZSBlbnRpcmUgYnVmZmVyIGJhY2suIAorICovCisKK3N0YXRpYyBzc2l6ZV90CitzeXNmc193cml0ZV9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc3lzZnNfYnVmZmVyICogYnVmZmVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNzaXplX3QgbGVuOworCisJZG93bigmYnVmZmVyLT5zZW0pOworCWxlbiA9IGZpbGxfd3JpdGVfYnVmZmVyKGJ1ZmZlciwgYnVmLCBjb3VudCk7CisJaWYgKGxlbiA+IDApCisJCWxlbiA9IGZsdXNoX3dyaXRlX2J1ZmZlcihmaWxlLT5mX2RlbnRyeSwgYnVmZmVyLCBsZW4pOworCWlmIChsZW4gPiAwKQorCQkqcHBvcyArPSBsZW47CisJdXAoJmJ1ZmZlci0+c2VtKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGNoZWNrX3Blcm0oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwlzdHJ1Y3Qga29iamVjdCAqa29iaiA9IHN5c2ZzX2dldF9rb2JqZWN0KGZpbGUtPmZfZGVudHJ5LT5kX3BhcmVudCk7CisJc3RydWN0IGF0dHJpYnV0ZSAqIGF0dHIgPSB0b19hdHRyKGZpbGUtPmZfZGVudHJ5KTsKKwlzdHJ1Y3Qgc3lzZnNfYnVmZmVyICogYnVmZmVyOworCXN0cnVjdCBzeXNmc19vcHMgKiBvcHMgPSBOVUxMOworCWludCBlcnJvciA9IDA7CisKKwlpZiAoIWtvYmogfHwgIWF0dHIpCisJCWdvdG8gRWludmFsOworCisJLyogR3JhYiB0aGUgbW9kdWxlIHJlZmVyZW5jZSBmb3IgdGhpcyBhdHRyaWJ1dGUgaWYgd2UgaGF2ZSBvbmUgKi8KKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGF0dHItPm93bmVyKSkgeworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gRG9uZTsKKwl9CisKKwkvKiBpZiB0aGUga29iamVjdCBoYXMgbm8ga3R5cGUsIHRoZW4gd2UgYXNzdW1lIHRoYXQgaXQgaXMgYSBzdWJzeXN0ZW0KKwkgKiBpdHNlbGYsIGFuZCB1c2Ugb3BzIGZvciBpdC4KKwkgKi8KKwlpZiAoa29iai0+a3NldCAmJiBrb2JqLT5rc2V0LT5rdHlwZSkKKwkJb3BzID0ga29iai0+a3NldC0+a3R5cGUtPnN5c2ZzX29wczsKKwllbHNlIGlmIChrb2JqLT5rdHlwZSkKKwkJb3BzID0ga29iai0+a3R5cGUtPnN5c2ZzX29wczsKKwllbHNlCisJCW9wcyA9ICZzdWJzeXNfc3lzZnNfb3BzOworCisJLyogTm8gc3lzZnMgb3BlcmF0aW9ucywgZWl0aGVyIGZyb20gaGF2aW5nIG5vIHN1YnN5c3RlbSwKKwkgKiBvciB0aGUgc3Vic3lzdGVtIGhhdmUgbm8gb3BlcmF0aW9ucy4KKwkgKi8KKwlpZiAoIW9wcykKKwkJZ290byBFYWNjZXNzOworCisJLyogRmlsZSBuZWVkcyB3cml0ZSBzdXBwb3J0LgorCSAqIFRoZSBpbm9kZSdzIHBlcm1zIG11c3Qgc2F5IGl0J3Mgb2ssIAorCSAqIGFuZCB3ZSBtdXN0IGhhdmUgYSBzdG9yZSBtZXRob2QuCisJICovCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisKKwkJaWYgKCEoaW5vZGUtPmlfbW9kZSAmIFNfSVdVR08pIHx8ICFvcHMtPnN0b3JlKQorCQkJZ290byBFYWNjZXNzOworCisJfQorCisJLyogRmlsZSBuZWVkcyByZWFkIHN1cHBvcnQuCisJICogVGhlIGlub2RlJ3MgcGVybXMgbXVzdCBzYXkgaXQncyBvaywgYW5kIHdlIHRoZXJlCisJICogbXVzdCBiZSBhIHNob3cgbWV0aG9kIGZvciBpdC4KKwkgKi8KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAoIShpbm9kZS0+aV9tb2RlICYgU19JUlVHTykgfHwgIW9wcy0+c2hvdykKKwkJCWdvdG8gRWFjY2VzczsKKwl9CisKKwkvKiBObyBlcnJvcj8gR3JlYXQsIGFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgZmlsZSwgYW5kIHN0b3JlIGl0CisJICogaXQgaW4gZmlsZS0+cHJpdmF0ZV9kYXRhIGZvciBlYXN5IGFjY2Vzcy4KKwkgKi8KKwlidWZmZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3lzZnNfYnVmZmVyKSxHRlBfS0VSTkVMKTsKKwlpZiAoYnVmZmVyKSB7CisJCW1lbXNldChidWZmZXIsMCxzaXplb2Yoc3RydWN0IHN5c2ZzX2J1ZmZlcikpOworCQlpbml0X01VVEVYKCZidWZmZXItPnNlbSk7CisJCWJ1ZmZlci0+bmVlZHNfcmVhZF9maWxsID0gMTsKKwkJYnVmZmVyLT5vcHMgPSBvcHM7CisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGJ1ZmZlcjsKKwl9IGVsc2UKKwkJZXJyb3IgPSAtRU5PTUVNOworCWdvdG8gRG9uZTsKKworIEVpbnZhbDoKKwllcnJvciA9IC1FSU5WQUw7CisJZ290byBEb25lOworIEVhY2Nlc3M6CisJZXJyb3IgPSAtRUFDQ0VTOworCW1vZHVsZV9wdXQoYXR0ci0+b3duZXIpOworIERvbmU6CisJaWYgKGVycm9yICYmIGtvYmopCisJCWtvYmplY3RfcHV0KGtvYmopOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBzeXNmc19vcGVuX2ZpbGUoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlyZXR1cm4gY2hlY2tfcGVybShpbm9kZSxmaWxwKTsKK30KKworc3RhdGljIGludCBzeXNmc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IGtvYmplY3QgKiBrb2JqID0gdG9fa29iaihmaWxwLT5mX2RlbnRyeS0+ZF9wYXJlbnQpOworCXN0cnVjdCBhdHRyaWJ1dGUgKiBhdHRyID0gdG9fYXR0cihmaWxwLT5mX2RlbnRyeSk7CisJc3RydWN0IG1vZHVsZSAqIG93bmVyID0gYXR0ci0+b3duZXI7CisJc3RydWN0IHN5c2ZzX2J1ZmZlciAqIGJ1ZmZlciA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWlmIChrb2JqKSAKKwkJa29iamVjdF9wdXQoa29iaik7CisJLyogQWZ0ZXIgdGhpcyBwb2ludCwgYXR0ciBzaG91bGQgbm90IGJlIGFjY2Vzc2VkLiAqLworCW1vZHVsZV9wdXQob3duZXIpOworCisJaWYgKGJ1ZmZlcikgeworCQlpZiAoYnVmZmVyLT5wYWdlKQorCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWJ1ZmZlci0+cGFnZSk7CisJCWtmcmVlKGJ1ZmZlcik7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN5c2ZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBzeXNmc19yZWFkX2ZpbGUsCisJLndyaXRlCQk9IHN5c2ZzX3dyaXRlX2ZpbGUsCisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5vcGVuCQk9IHN5c2ZzX29wZW5fZmlsZSwKKwkucmVsZWFzZQk9IHN5c2ZzX3JlbGVhc2UsCit9OworCisKK2ludCBzeXNmc19hZGRfZmlsZShzdHJ1Y3QgZGVudHJ5ICogZGlyLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICogYXR0ciwgaW50IHR5cGUpCit7CisJc3RydWN0IHN5c2ZzX2RpcmVudCAqIHBhcmVudF9zZCA9IGRpci0+ZF9mc2RhdGE7CisJdW1vZGVfdCBtb2RlID0gKGF0dHItPm1vZGUgJiBTX0lBTExVR08pIHwgU19JRlJFRzsKKwlpbnQgZXJyb3IgPSAwOworCisJZG93bigmZGlyLT5kX2lub2RlLT5pX3NlbSk7CisJZXJyb3IgPSBzeXNmc19tYWtlX2RpcmVudChwYXJlbnRfc2QsIE5VTEwsICh2b2lkICopIGF0dHIsIG1vZGUsIHR5cGUpOworCXVwKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKworCXJldHVybiBlcnJvcjsKK30KKworCisvKioKKyAqCXN5c2ZzX2NyZWF0ZV9maWxlIC0gY3JlYXRlIGFuIGF0dHJpYnV0ZSBmaWxlIGZvciBhbiBvYmplY3QuCisgKglAa29iajoJb2JqZWN0IHdlJ3JlIGNyZWF0aW5nIGZvci4gCisgKglAYXR0cjoJYXRycmlidXRlIGRlc2NyaXB0b3IuCisgKi8KKworaW50IHN5c2ZzX2NyZWF0ZV9maWxlKHN0cnVjdCBrb2JqZWN0ICoga29iaiwgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqIGF0dHIpCit7CisJQlVHX09OKCFrb2JqIHx8ICFrb2JqLT5kZW50cnkgfHwgIWF0dHIpOworCisJcmV0dXJuIHN5c2ZzX2FkZF9maWxlKGtvYmotPmRlbnRyeSwgYXR0ciwgU1lTRlNfS09CSl9BVFRSKTsKKworfQorCisKKy8qKgorICogc3lzZnNfdXBkYXRlX2ZpbGUgLSB1cGRhdGUgdGhlIG1vZGlmaWVkIHRpbWVzdGFtcCBvbiBhbiBvYmplY3QgYXR0cmlidXRlLgorICogQGtvYmo6IG9iamVjdCB3ZSdyZSBhY3RpbmcgZm9yLgorICogQGF0dHI6IGF0dHJpYnV0ZSBkZXNjcmlwdG9yLgorICoKKyAqIEFsc28gY2FsbCBkbm90aWZ5IGZvciB0aGUgZGVudHJ5LCB3aGljaCBsb3RzIG9mIHVzZXJzcGFjZSBwcm9ncmFtcworICogdXNlLgorICovCitpbnQgc3lzZnNfdXBkYXRlX2ZpbGUoc3RydWN0IGtvYmplY3QgKiBrb2JqLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICogYXR0cikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICogZGlyID0ga29iai0+ZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKiB2aWN0aW07CisJaW50IHJlcyA9IC1FTk9FTlQ7CisKKwlkb3duKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKwl2aWN0aW0gPSBzeXNmc19nZXRfZGVudHJ5KGRpciwgYXR0ci0+bmFtZSk7CisJaWYgKCFJU19FUlIodmljdGltKSkgeworCQkvKiBtYWtlIHN1cmUgZGVudHJ5IGlzIHJlYWxseSB0aGVyZSAqLworCQlpZiAodmljdGltLT5kX2lub2RlICYmIAorCQkgICAgKHZpY3RpbS0+ZF9wYXJlbnQtPmRfaW5vZGUgPT0gZGlyLT5kX2lub2RlKSkgeworCQkJdmljdGltLT5kX2lub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOworCQkJZG5vdGlmeV9wYXJlbnQodmljdGltLCBETl9NT0RJRlkpOworCisJCQkvKioKKwkJCSAqIERyb3AgcmVmZXJlbmNlIGZyb20gaW5pdGlhbCBzeXNmc19nZXRfZGVudHJ5KCkuCisJCQkgKi8KKwkJCWRwdXQodmljdGltKTsKKwkJCXJlcyA9IDA7CisJCX0gZWxzZQorCQkJZF9kcm9wKHZpY3RpbSk7CisJCQorCQkvKioKKwkJICogRHJvcCB0aGUgcmVmZXJlbmNlIGFjcXVpcmVkIGZyb20gc3lzZnNfZ2V0X2RlbnRyeSgpIGFib3ZlLgorCQkgKi8KKwkJZHB1dCh2aWN0aW0pOworCX0KKwl1cCgmZGlyLT5kX2lub2RlLT5pX3NlbSk7CisKKwlyZXR1cm4gcmVzOworfQorCisKKy8qKgorICoJc3lzZnNfcmVtb3ZlX2ZpbGUgLSByZW1vdmUgYW4gb2JqZWN0IGF0dHJpYnV0ZS4KKyAqCUBrb2JqOglvYmplY3Qgd2UncmUgYWN0aW5nIGZvci4KKyAqCUBhdHRyOglhdHRyaWJ1dGUgZGVzY3JpcHRvci4KKyAqCisgKglIYXNoIHRoZSBhdHRyaWJ1dGUgbmFtZSBhbmQga2lsbCB0aGUgdmljdGltLgorICovCisKK3ZvaWQgc3lzZnNfcmVtb3ZlX2ZpbGUoc3RydWN0IGtvYmplY3QgKiBrb2JqLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICogYXR0cikKK3sKKwlzeXNmc19oYXNoX2FuZF9yZW1vdmUoa29iai0+ZGVudHJ5LGF0dHItPm5hbWUpOworfQorCisKK0VYUE9SVF9TWU1CT0xfR1BMKHN5c2ZzX2NyZWF0ZV9maWxlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN5c2ZzX3JlbW92ZV9maWxlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN5c2ZzX3VwZGF0ZV9maWxlKTsKKwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZ3JvdXAuYyBiL2ZzL3N5c2ZzL2dyb3VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExYWM1ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3N5c2ZzL2dyb3VwLmMKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIGZzL3N5c2ZzL2dyb3VwLmMgLSBPcGVyYXRpb25zIGZvciBhZGRpbmcvcmVtb3ZpbmcgbXVsdGlwbGUgZmlsZXMgYXQgb25jZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgUGF0cmljayBNb2NoZWwKKyAqIENvcHlyaWdodCAoYykgMjAwMyBPcGVuIFNvdXJjZSBEZXZlbG9wbWVudCBMYWIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXJ0IHRoZSBHUEwgdjIuIAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgInN5c2ZzLmgiCisKKworc3RhdGljIHZvaWQgcmVtb3ZlX2ZpbGVzKHN0cnVjdCBkZW50cnkgKiBkaXIsIAorCQkJIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKiBncnApCit7CisJc3RydWN0IGF0dHJpYnV0ZSAqY29uc3QqIGF0dHI7CisKKwlmb3IgKGF0dHIgPSBncnAtPmF0dHJzOyAqYXR0cjsgYXR0cisrKQorCQlzeXNmc19oYXNoX2FuZF9yZW1vdmUoZGlyLCgqYXR0ciktPm5hbWUpOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV9maWxlcyhzdHJ1Y3QgZGVudHJ5ICogZGlyLAorCQkJY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqIGdycCkKK3sKKwlzdHJ1Y3QgYXR0cmlidXRlICpjb25zdCogYXR0cjsKKwlpbnQgZXJyb3IgPSAwOworCisJZm9yIChhdHRyID0gZ3JwLT5hdHRyczsgKmF0dHIgJiYgIWVycm9yOyBhdHRyKyspIHsKKwkJZXJyb3IgPSBzeXNmc19hZGRfZmlsZShkaXIsICphdHRyLCBTWVNGU19LT0JKX0FUVFIpOworCX0KKwlpZiAoZXJyb3IpCisJCXJlbW92ZV9maWxlcyhkaXIsZ3JwKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworaW50IHN5c2ZzX2NyZWF0ZV9ncm91cChzdHJ1Y3Qga29iamVjdCAqIGtvYmosIAorCQkgICAgICAgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqIGdycCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICogZGlyOworCWludCBlcnJvcjsKKworCUJVR19PTigha29iaiB8fCAha29iai0+ZGVudHJ5KTsKKworCWlmIChncnAtPm5hbWUpIHsKKwkJZXJyb3IgPSBzeXNmc19jcmVhdGVfc3ViZGlyKGtvYmosZ3JwLT5uYW1lLCZkaXIpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJfSBlbHNlCisJCWRpciA9IGtvYmotPmRlbnRyeTsKKwlkaXIgPSBkZ2V0KGRpcik7CisJaWYgKChlcnJvciA9IGNyZWF0ZV9maWxlcyhkaXIsZ3JwKSkpIHsKKwkJaWYgKGdycC0+bmFtZSkKKwkJCXN5c2ZzX3JlbW92ZV9zdWJkaXIoZGlyKTsKKwl9CisJZHB1dChkaXIpOworCXJldHVybiBlcnJvcjsKK30KKwordm9pZCBzeXNmc19yZW1vdmVfZ3JvdXAoc3RydWN0IGtvYmplY3QgKiBrb2JqLCAKKwkJCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKiBncnApCit7CisJc3RydWN0IGRlbnRyeSAqIGRpcjsKKworCWlmIChncnAtPm5hbWUpCisJCWRpciA9IHN5c2ZzX2dldF9kZW50cnkoa29iai0+ZGVudHJ5LGdycC0+bmFtZSk7CisJZWxzZQorCQlkaXIgPSBkZ2V0KGtvYmotPmRlbnRyeSk7CisKKwlyZW1vdmVfZmlsZXMoZGlyLGdycCk7CisJaWYgKGdycC0+bmFtZSkKKwkJc3lzZnNfcmVtb3ZlX3N1YmRpcihkaXIpOworCS8qIHJlbGVhc2UgdGhlIHJlZi4gdGFrZW4gaW4gdGhpcyByb3V0aW5lICovCisJZHB1dChkaXIpOworfQorCisKK0VYUE9SVF9TWU1CT0xfR1BMKHN5c2ZzX2NyZWF0ZV9ncm91cCk7CitFWFBPUlRfU1lNQk9MX0dQTChzeXNmc19yZW1vdmVfZ3JvdXApOwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvaW5vZGUuYyBiL2ZzL3N5c2ZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZmN2IyZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3N5c2ZzL2lub2RlLmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBpbm9kZS5jIC0gYmFzaWMgaW5vZGUgYW5kIGRlbnRyeSBvcGVyYXRpb25zLgorICoKKyAqIHN5c2ZzIGlzIENvcHlyaWdodCAoYykgMjAwMS0zIFBhdHJpY2sgTW9jaGVsCisgKgorICogUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3N5c2ZzLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqLworCisjdW5kZWYgREVCVUcgCisKKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorI2luY2x1ZGUgInN5c2ZzLmgiCisKK2V4dGVybiBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzeXNmc19zYjsKKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgc3lzZnNfYW9wcyA9IHsKKwkucmVhZHBhZ2UJPSBzaW1wbGVfcmVhZHBhZ2UsCisJLnByZXBhcmVfd3JpdGUJPSBzaW1wbGVfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gc2ltcGxlX2NvbW1pdF93cml0ZQorfTsKKworc3RhdGljIHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvIHN5c2ZzX2JhY2tpbmdfZGV2X2luZm8gPSB7CisJLnJhX3BhZ2VzCT0gMCwJLyogTm8gcmVhZGFoZWFkICovCisJLmNhcGFiaWxpdGllcwk9IEJESV9DQVBfTk9fQUNDVF9ESVJUWSB8IEJESV9DQVBfTk9fV1JJVEVCQUNLLAorfTsKKworc3RydWN0IGlub2RlICogc3lzZnNfbmV3X2lub2RlKG1vZGVfdCBtb2RlKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gbmV3X2lub2RlKHN5c2ZzX3NiKTsKKwlpZiAoaW5vZGUpIHsKKwkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCWlub2RlLT5pX3VpZCA9IDA7CisJCWlub2RlLT5pX2dpZCA9IDA7CisJCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJCWlub2RlLT5pX2Jsb2NrcyA9IDA7CisJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmc3lzZnNfYW9wczsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZzeXNmc19iYWNraW5nX2Rldl9pbmZvOworCX0KKwlyZXR1cm4gaW5vZGU7Cit9CisKK2ludCBzeXNmc19jcmVhdGUoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgaW50IG1vZGUsIGludCAoKmluaXQpKHN0cnVjdCBpbm9kZSAqKSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gTlVMTDsKKwlpZiAoZGVudHJ5KSB7CisJCWlmICghZGVudHJ5LT5kX2lub2RlKSB7CisJCQlpZiAoKGlub2RlID0gc3lzZnNfbmV3X2lub2RlKG1vZGUpKSkgeworCQkJCWlmIChkZW50cnktPmRfcGFyZW50ICYmIGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUpIHsKKwkJCQkJc3RydWN0IGlub2RlICpwX2lub2RlID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKKwkJCQkJcF9pbm9kZS0+aV9tdGltZSA9IHBfaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJCQkJfQorCQkJCWdvdG8gUHJvY2VlZDsKKwkJCX0KKwkJCWVsc2UgCisJCQkJZXJyb3IgPSAtRU5PTUVNOworCQl9IGVsc2UKKwkJCWVycm9yID0gLUVFWElTVDsKKwl9IGVsc2UgCisJCWVycm9yID0gLUVOT0VOVDsKKwlnb3RvIERvbmU7CisKKyBQcm9jZWVkOgorCWlmIChpbml0KQorCQllcnJvciA9IGluaXQoaW5vZGUpOworCWlmICghZXJyb3IpIHsKKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwkJaWYgKFNfSVNESVIobW9kZSkpCisJCQlkZ2V0KGRlbnRyeSk7ICAvKiBwaW4gb25seSBkaXJlY3RvcnkgZGVudHJ5IGluIGNvcmUgKi8KKwl9IGVsc2UKKwkJaXB1dChpbm9kZSk7CisgRG9uZToKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0cnVjdCBkZW50cnkgKiBzeXNmc19nZXRfZGVudHJ5KHN0cnVjdCBkZW50cnkgKiBwYXJlbnQsIGNvbnN0IGNoYXIgKiBuYW1lKQoreworCXN0cnVjdCBxc3RyIHFzdHI7CisKKwlxc3RyLm5hbWUgPSBuYW1lOworCXFzdHIubGVuID0gc3RybGVuKG5hbWUpOworCXFzdHIuaGFzaCA9IGZ1bGxfbmFtZV9oYXNoKG5hbWUscXN0ci5sZW4pOworCXJldHVybiBsb29rdXBfaGFzaCgmcXN0cixwYXJlbnQpOworfQorCisvKgorICogR2V0IHRoZSBuYW1lIGZvciBjb3JyZXNwb25kaW5nIGVsZW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIHN5c2ZzX2RpcmVudAorICovCitjb25zdCB1bnNpZ25lZCBjaGFyICogc3lzZnNfZ2V0X25hbWUoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QpCit7CisJc3RydWN0IGF0dHJpYnV0ZSAqIGF0dHI7CisJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKiBiaW5fYXR0cjsKKwlzdHJ1Y3Qgc3lzZnNfc3ltbGluayAgKiBzbDsKKworCWlmICghc2QgfHwgIXNkLT5zX2VsZW1lbnQpCisJCUJVRygpOworCisJc3dpdGNoIChzZC0+c190eXBlKSB7CisJCWNhc2UgU1lTRlNfRElSOgorCQkJLyogQWx3YXlzIGhhdmUgYSBkZW50cnkgc28gdXNlIHRoYXQgKi8KKwkJCXJldHVybiBzZC0+c19kZW50cnktPmRfbmFtZS5uYW1lOworCisJCWNhc2UgU1lTRlNfS09CSl9BVFRSOgorCQkJYXR0ciA9IHNkLT5zX2VsZW1lbnQ7CisJCQlyZXR1cm4gYXR0ci0+bmFtZTsKKworCQljYXNlIFNZU0ZTX0tPQkpfQklOX0FUVFI6CisJCQliaW5fYXR0ciA9IHNkLT5zX2VsZW1lbnQ7CisJCQlyZXR1cm4gYmluX2F0dHItPmF0dHIubmFtZTsKKworCQljYXNlIFNZU0ZTX0tPQkpfTElOSzoKKwkJCXNsID0gc2QtPnNfZWxlbWVudDsKKwkJCXJldHVybiBzbC0+bGlua19uYW1lOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworCisvKgorICogVW5oYXNoZXMgdGhlIGRlbnRyeSBjb3JyZXNwb25kaW5nIHRvIGdpdmVuIHN5c2ZzX2RpcmVudAorICogQ2FsbGVkIHdpdGggcGFyZW50IGlub2RlJ3MgaV9zZW0gaGVsZC4KKyAqLwordm9pZCBzeXNmc19kcm9wX2RlbnRyeShzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc2QsIHN0cnVjdCBkZW50cnkgKiBwYXJlbnQpCit7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IHNkLT5zX2RlbnRyeTsKKworCWlmIChkZW50cnkpIHsKKwkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCQlpZiAoIShkX3VuaGFzaGVkKGRlbnRyeSkgJiYgZGVudHJ5LT5kX2lub2RlKSkgeworCQkJZGdldF9sb2NrZWQoZGVudHJ5KTsKKwkJCV9fZF9kcm9wKGRlbnRyeSk7CisJCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJCXNpbXBsZV91bmxpbmsocGFyZW50LT5kX2lub2RlLCBkZW50cnkpOworCQl9IGVsc2UgeworCQkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCX0KKwl9Cit9CisKK3ZvaWQgc3lzZnNfaGFzaF9hbmRfcmVtb3ZlKHN0cnVjdCBkZW50cnkgKiBkaXIsIGNvbnN0IGNoYXIgKiBuYW1lKQoreworCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBzZDsKKwlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogcGFyZW50X3NkID0gZGlyLT5kX2ZzZGF0YTsKKworCWRvd24oJmRpci0+ZF9pbm9kZS0+aV9zZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2QsICZwYXJlbnRfc2QtPnNfY2hpbGRyZW4sIHNfc2libGluZykgeworCQlpZiAoIXNkLT5zX2VsZW1lbnQpCisJCQljb250aW51ZTsKKwkJaWYgKCFzdHJjbXAoc3lzZnNfZ2V0X25hbWUoc2QpLCBuYW1lKSkgeworCQkJbGlzdF9kZWxfaW5pdCgmc2QtPnNfc2libGluZyk7CisJCQlzeXNmc19kcm9wX2RlbnRyeShzZCwgZGlyKTsKKwkJCXN5c2ZzX3B1dChzZCk7CisJCQlicmVhazsKKwkJfQorCX0KKwl1cCgmZGlyLT5kX2lub2RlLT5pX3NlbSk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvbW91bnQuYyBiL2ZzL3N5c2ZzL21vdW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4MDViYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3N5c2ZzL21vdW50LmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBtb3VudC5jIC0gb3BlcmF0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIGFuZCBtb3VudGluZyBzeXNmcy4KKyAqLworCisjZGVmaW5lIERFQlVHIAorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlICJzeXNmcy5oIgorCisvKiBSYW5kb20gbWFnaWMgbnVtYmVyICovCisjZGVmaW5lIFNZU0ZTX01BR0lDIDB4NjI2NTY1NzIKKworc3RydWN0IHZmc21vdW50ICpzeXNmc19tb3VudDsKK3N0cnVjdCBzdXBlcl9ibG9jayAqIHN5c2ZzX3NiID0gTlVMTDsKK2ttZW1fY2FjaGVfdCAqc3lzZnNfZGlyX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHN5c2ZzX29wcyA9IHsKKwkuc3RhdGZzCQk9IHNpbXBsZV9zdGF0ZnMsCisJLmRyb3BfaW5vZGUJPSBnZW5lcmljX2RlbGV0ZV9pbm9kZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfZGlyZW50IHN5c2ZzX3Jvb3QgPSB7CisJLnNfc2libGluZwk9IExJU1RfSEVBRF9JTklUKHN5c2ZzX3Jvb3Quc19zaWJsaW5nKSwKKwkuc19jaGlsZHJlbgk9IExJU1RfSEVBRF9JTklUKHN5c2ZzX3Jvb3Quc19jaGlsZHJlbiksCisJLnNfZWxlbWVudAk9IE5VTEwsCisJLnNfdHlwZQkJPSBTWVNGU19ST09ULAorfTsKKworc3RhdGljIGludCBzeXNmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5ICpyb290OworCisJc2ItPnNfYmxvY2tzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gUEFHRV9DQUNIRV9TSElGVDsKKwlzYi0+c19tYWdpYyA9IFNZU0ZTX01BR0lDOworCXNiLT5zX29wID0gJnN5c2ZzX29wczsKKwlzYi0+c190aW1lX2dyYW4gPSAxOworCXN5c2ZzX3NiID0gc2I7CisKKwlpbm9kZSA9IHN5c2ZzX25ld19pbm9kZShTX0lGRElSIHwgU19JUldYVSB8IFNfSVJVR08gfCBTX0lYVUdPKTsKKwlpZiAoaW5vZGUpIHsKKwkJaW5vZGUtPmlfb3AgPSAmc3lzZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZzeXNmc19kaXJfb3BlcmF0aW9uczsKKwkJLyogZGlyZWN0b3J5IGlub2RlcyBzdGFydCBvZmYgd2l0aCBpX25saW5rID09IDIgKGZvciAiLiIgZW50cnkpICovCisJCWlub2RlLT5pX25saW5rKys7CQorCX0gZWxzZSB7CisJCXByX2RlYnVnKCJzeXNmczogY291bGQgbm90IGdldCByb290IGlub2RlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcm9vdCA9IGRfYWxsb2Nfcm9vdChpbm9kZSk7CisJaWYgKCFyb290KSB7CisJCXByX2RlYnVnKCIlczogY291bGQgbm90IGdldCByb290IGRlbnRyeSFcbiIsX19GVU5DVElPTl9fKTsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyb290LT5kX2ZzZGF0YSA9ICZzeXNmc19yb290OworCXNiLT5zX3Jvb3QgPSByb290OworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpzeXNmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwgc3lzZnNfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBzeXNmc19mc190eXBlID0geworCS5uYW1lCQk9ICJzeXNmcyIsCisJLmdldF9zYgkJPSBzeXNmc19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2xpdHRlcl9zdXBlciwKK307CisKK2ludCBfX2luaXQgc3lzZnNfaW5pdCh2b2lkKQoreworCWludCBlcnIgPSAtRU5PTUVNOworCisJc3lzZnNfZGlyX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJzeXNmc19kaXJfY2FjaGUiLAorCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHN5c2ZzX2RpcmVudCksCisJCQkJCSAgICAgIDAsIDAsIE5VTEwsIE5VTEwpOworCWlmICghc3lzZnNfZGlyX2NhY2hlcCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZzeXNmc19mc190eXBlKTsKKwlpZiAoIWVycikgeworCQlzeXNmc19tb3VudCA9IGtlcm5fbW91bnQoJnN5c2ZzX2ZzX3R5cGUpOworCQlpZiAoSVNfRVJSKHN5c2ZzX21vdW50KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzeXNmczogY291bGQgbm90IG1vdW50IVxuIik7CisJCQllcnIgPSBQVFJfRVJSKHN5c2ZzX21vdW50KTsKKwkJCXN5c2ZzX21vdW50ID0gTlVMTDsKKwkJCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmc3lzZnNfZnNfdHlwZSk7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKwl9IGVsc2UKKwkJZ290byBvdXRfZXJyOworb3V0OgorCXJldHVybiBlcnI7CitvdXRfZXJyOgorCWttZW1fY2FjaGVfZGVzdHJveShzeXNmc19kaXJfY2FjaGVwKTsKKwlzeXNmc19kaXJfY2FjaGVwID0gTlVMTDsKKwlnb3RvIG91dDsKK30KZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL3N5bWxpbmsuYyBiL2ZzL3N5c2ZzL3N5bWxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmRmNzAxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3lzZnMvc3ltbGluay5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogc3ltbGluay5jIC0gb3BlcmF0aW9ucyBmb3Igc3lzZnMgc3ltbGlua3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisKKyNpbmNsdWRlICJzeXNmcy5oIgorCitzdGF0aWMgaW50IG9iamVjdF9kZXB0aChzdHJ1Y3Qga29iamVjdCAqIGtvYmopCit7CisJc3RydWN0IGtvYmplY3QgKiBwID0ga29iajsKKwlpbnQgZGVwdGggPSAwOworCWRvIHsgZGVwdGgrKzsgfSB3aGlsZSAoKHAgPSBwLT5wYXJlbnQpKTsKKwlyZXR1cm4gZGVwdGg7Cit9CisKK3N0YXRpYyBpbnQgb2JqZWN0X3BhdGhfbGVuZ3RoKHN0cnVjdCBrb2JqZWN0ICoga29iaikKK3sKKwlzdHJ1Y3Qga29iamVjdCAqIHAgPSBrb2JqOworCWludCBsZW5ndGggPSAxOworCWRvIHsKKwkJbGVuZ3RoICs9IHN0cmxlbihrb2JqZWN0X25hbWUocCkpICsgMTsKKwkJcCA9IHAtPnBhcmVudDsKKwl9IHdoaWxlIChwKTsKKwlyZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgdm9pZCBmaWxsX29iamVjdF9wYXRoKHN0cnVjdCBrb2JqZWN0ICoga29iaiwgY2hhciAqIGJ1ZmZlciwgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3Qga29iamVjdCAqIHA7CisKKwktLWxlbmd0aDsKKwlmb3IgKHAgPSBrb2JqOyBwOyBwID0gcC0+cGFyZW50KSB7CisJCWludCBjdXIgPSBzdHJsZW4oa29iamVjdF9uYW1lKHApKTsKKworCQkvKiBiYWNrIHVwIGVub3VnaCB0byBwcmludCB0aGlzIGJ1cyBpZCB3aXRoICcvJyAqLworCQlsZW5ndGggLT0gY3VyOworCQlzdHJuY3B5KGJ1ZmZlciArIGxlbmd0aCxrb2JqZWN0X25hbWUocCksY3VyKTsKKwkJKihidWZmZXIgKyAtLWxlbmd0aCkgPSAnLyc7CisJfQorfQorCitzdGF0aWMgaW50IHN5c2ZzX2FkZF9saW5rKHN0cnVjdCBkZW50cnkgKiBwYXJlbnQsIGNoYXIgKiBuYW1lLCBzdHJ1Y3Qga29iamVjdCAqIHRhcmdldCkKK3sKKwlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogcGFyZW50X3NkID0gcGFyZW50LT5kX2ZzZGF0YTsKKwlzdHJ1Y3Qgc3lzZnNfc3ltbGluayAqIHNsOworCWludCBlcnJvciA9IDA7CisKKwllcnJvciA9IC1FTk9NRU07CisJc2wgPSBrbWFsbG9jKHNpemVvZigqc2wpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNsKQorCQlnb3RvIGV4aXQxOworCisJc2wtPmxpbmtfbmFtZSA9IGttYWxsb2Moc3RybGVuKG5hbWUpICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzbC0+bGlua19uYW1lKQorCQlnb3RvIGV4aXQyOworCisJc3RyY3B5KHNsLT5saW5rX25hbWUsIG5hbWUpOworCXNsLT50YXJnZXRfa29iaiA9IGtvYmplY3RfZ2V0KHRhcmdldCk7CisKKwllcnJvciA9IHN5c2ZzX21ha2VfZGlyZW50KHBhcmVudF9zZCwgTlVMTCwgc2wsIFNfSUZMTkt8U19JUldYVUdPLAorCQkJCVNZU0ZTX0tPQkpfTElOSyk7CisJaWYgKCFlcnJvcikKKwkJcmV0dXJuIDA7CisKKwlrZnJlZShzbC0+bGlua19uYW1lKTsKK2V4aXQyOgorCWtmcmVlKHNsKTsKK2V4aXQxOgorCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglzeXNmc19jcmVhdGVfbGluayAtIGNyZWF0ZSBzeW1saW5rIGJldHdlZW4gdHdvIG9iamVjdHMuCisgKglAa29iajoJb2JqZWN0IHdob3NlIGRpcmVjdG9yeSB3ZSdyZSBjcmVhdGluZyB0aGUgbGluayBpbi4KKyAqCUB0YXJnZXQ6CW9iamVjdCB3ZSdyZSBwb2ludGluZyB0by4KKyAqCUBuYW1lOgkJbmFtZSBvZiB0aGUgc3ltbGluay4KKyAqLworaW50IHN5c2ZzX2NyZWF0ZV9saW5rKHN0cnVjdCBrb2JqZWN0ICoga29iaiwgc3RydWN0IGtvYmplY3QgKiB0YXJnZXQsIGNoYXIgKiBuYW1lKQoreworCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBrb2JqLT5kZW50cnk7CisJaW50IGVycm9yID0gMDsKKworCUJVR19PTigha29iaiB8fCAha29iai0+ZGVudHJ5IHx8ICFuYW1lKTsKKworCWRvd24oJmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCWVycm9yID0gc3lzZnNfYWRkX2xpbmsoZGVudHJ5LCBuYW1lLCB0YXJnZXQpOworCXVwKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoqCisgKglzeXNmc19yZW1vdmVfbGluayAtIHJlbW92ZSBzeW1saW5rIGluIG9iamVjdCdzIGRpcmVjdG9yeS4KKyAqCUBrb2JqOglvYmplY3Qgd2UncmUgYWN0aW5nIGZvci4KKyAqCUBuYW1lOgluYW1lIG9mIHRoZSBzeW1saW5rIHRvIHJlbW92ZS4KKyAqLworCit2b2lkIHN5c2ZzX3JlbW92ZV9saW5rKHN0cnVjdCBrb2JqZWN0ICoga29iaiwgY2hhciAqIG5hbWUpCit7CisJc3lzZnNfaGFzaF9hbmRfcmVtb3ZlKGtvYmotPmRlbnRyeSxuYW1lKTsKK30KKworc3RhdGljIGludCBzeXNmc19nZXRfdGFyZ2V0X3BhdGgoc3RydWN0IGtvYmplY3QgKiBrb2JqLCBzdHJ1Y3Qga29iamVjdCAqIHRhcmdldCwKKwkJCQkgICBjaGFyICpwYXRoKQoreworCWNoYXIgKiBzOworCWludCBkZXB0aCwgc2l6ZTsKKworCWRlcHRoID0gb2JqZWN0X2RlcHRoKGtvYmopOworCXNpemUgPSBvYmplY3RfcGF0aF9sZW5ndGgodGFyZ2V0KSArIGRlcHRoICogMyAtIDE7CisJaWYgKHNpemUgPiBQQVRIX01BWCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwlwcl9kZWJ1ZygiJXM6IGRlcHRoID0gJWQsIHNpemUgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBkZXB0aCwgc2l6ZSk7CisKKwlmb3IgKHMgPSBwYXRoOyBkZXB0aC0tOyBzICs9IDMpCisJCXN0cmNweShzLCIuLi8iKTsKKworCWZpbGxfb2JqZWN0X3BhdGgodGFyZ2V0LCBwYXRoLCBzaXplKTsKKwlwcl9kZWJ1ZygiJXM6IHBhdGggPSAnJXMnXG4iLCBfX0ZVTkNUSU9OX18sIHBhdGgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3lzZnNfZ2V0bGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKiBwYXRoKQoreworCXN0cnVjdCBrb2JqZWN0ICprb2JqLCAqdGFyZ2V0X2tvYmo7CisJaW50IGVycm9yID0gMDsKKworCWtvYmogPSBzeXNmc19nZXRfa29iamVjdChkZW50cnktPmRfcGFyZW50KTsKKwlpZiAoIWtvYmopCisJCXJldHVybiAtRUlOVkFMOworCisJdGFyZ2V0X2tvYmogPSBzeXNmc19nZXRfa29iamVjdChkZW50cnkpOworCWlmICghdGFyZ2V0X2tvYmopIHsKKwkJa29iamVjdF9wdXQoa29iaik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRvd25fcmVhZCgmc3lzZnNfcmVuYW1lX3NlbSk7CisJZXJyb3IgPSBzeXNmc19nZXRfdGFyZ2V0X3BhdGgoa29iaiwgdGFyZ2V0X2tvYmosIHBhdGgpOworCXVwX3JlYWQoJnN5c2ZzX3JlbmFtZV9zZW0pOworCQorCWtvYmplY3RfcHV0KGtvYmopOworCWtvYmplY3RfcHV0KHRhcmdldF9rb2JqKTsKKwlyZXR1cm4gZXJyb3I7CisKK30KKworc3RhdGljIGludCBzeXNmc19mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWludCBlcnJvciA9IC1FTk9NRU07CisJdW5zaWduZWQgbG9uZyBwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmIChwYWdlKQorCQllcnJvciA9IHN5c2ZzX2dldGxpbmsoZGVudHJ5LCAoY2hhciAqKSBwYWdlKTsgCisJbmRfc2V0X2xpbmsobmQsIGVycm9yID8gRVJSX1BUUihlcnJvcikgOiAoY2hhciAqKXBhZ2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzeXNmc19wdXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWNoYXIgKnBhZ2UgPSBuZF9nZXRfbGluayhuZCk7CisJaWYgKCFJU19FUlIocGFnZSkpCisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKK30KKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc3lzZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zID0geworCS5yZWFkbGluayA9IGdlbmVyaWNfcmVhZGxpbmssCisJLmZvbGxvd19saW5rID0gc3lzZnNfZm9sbG93X2xpbmssCisJLnB1dF9saW5rID0gc3lzZnNfcHV0X2xpbmssCit9OworCisKK0VYUE9SVF9TWU1CT0xfR1BMKHN5c2ZzX2NyZWF0ZV9saW5rKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN5c2ZzX3JlbW92ZV9saW5rKTsKKwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvc3lzZnMuaCBiL2ZzL3N5c2ZzL3N5c2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThhMjRhMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3N5c2ZzL3N5c2ZzLmgKQEAgLTAsMCArMSw5NSBAQAorCitleHRlcm4gc3RydWN0IHZmc21vdW50ICogc3lzZnNfbW91bnQ7CitleHRlcm4ga21lbV9jYWNoZV90ICpzeXNmc19kaXJfY2FjaGVwOworCitleHRlcm4gc3RydWN0IGlub2RlICogc3lzZnNfbmV3X2lub2RlKG1vZGVfdCBtb2RlKTsKK2V4dGVybiBpbnQgc3lzZnNfY3JlYXRlKHN0cnVjdCBkZW50cnkgKiwgaW50IG1vZGUsIGludCAoKmluaXQpKHN0cnVjdCBpbm9kZSAqKSk7CisKK2V4dGVybiBpbnQgc3lzZnNfbWFrZV9kaXJlbnQoc3RydWN0IHN5c2ZzX2RpcmVudCAqLCBzdHJ1Y3QgZGVudHJ5ICosIHZvaWQgKiwKKwkJCQl1bW9kZV90LCBpbnQpOworZXh0ZXJuIHN0cnVjdCBkZW50cnkgKiBzeXNmc19nZXRfZGVudHJ5KHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqKTsKKworZXh0ZXJuIGludCBzeXNmc19hZGRfZmlsZShzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKiwgaW50KTsKK2V4dGVybiB2b2lkIHN5c2ZzX2hhc2hfYW5kX3JlbW92ZShzdHJ1Y3QgZGVudHJ5ICogZGlyLCBjb25zdCBjaGFyICogbmFtZSk7CisKK2V4dGVybiBpbnQgc3lzZnNfY3JlYXRlX3N1YmRpcihzdHJ1Y3Qga29iamVjdCAqLCBjb25zdCBjaGFyICosIHN0cnVjdCBkZW50cnkgKiopOworZXh0ZXJuIHZvaWQgc3lzZnNfcmVtb3ZlX3N1YmRpcihzdHJ1Y3QgZGVudHJ5ICopOworCitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciAqIHN5c2ZzX2dldF9uYW1lKHN0cnVjdCBzeXNmc19kaXJlbnQgKnNkKTsKK2V4dGVybiB2b2lkIHN5c2ZzX2Ryb3BfZGVudHJ5KHN0cnVjdCBzeXNmc19kaXJlbnQgKnNkLCBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQpOworCitleHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSBzeXNmc19yZW5hbWVfc2VtOworZXh0ZXJuIHN0cnVjdCBzdXBlcl9ibG9jayAqIHN5c2ZzX3NiOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3lzZnNfZGlyX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzeXNmc19maWxlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBiaW5fZm9wczsKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzeXNmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzeXNmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisKK3N0cnVjdCBzeXNmc19zeW1saW5rIHsKKwljaGFyICogbGlua19uYW1lOworCXN0cnVjdCBrb2JqZWN0ICogdGFyZ2V0X2tvYmo7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBrb2JqZWN0ICogdG9fa29iaihzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5KQoreworCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBzZCA9IGRlbnRyeS0+ZF9mc2RhdGE7CisJcmV0dXJuICgoc3RydWN0IGtvYmplY3QgKikgc2QtPnNfZWxlbWVudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGF0dHJpYnV0ZSAqIHRvX2F0dHIoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKK3sKKwlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc2QgPSBkZW50cnktPmRfZnNkYXRhOworCXJldHVybiAoKHN0cnVjdCBhdHRyaWJ1dGUgKikgc2QtPnNfZWxlbWVudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKiB0b19iaW5fYXR0cihzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5KQoreworCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBzZCA9IGRlbnRyeS0+ZF9mc2RhdGE7CisJcmV0dXJuICgoc3RydWN0IGJpbl9hdHRyaWJ1dGUgKikgc2QtPnNfZWxlbWVudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGtvYmplY3QgKnN5c2ZzX2dldF9rb2JqZWN0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3Qga29iamVjdCAqIGtvYmogPSBOVUxMOworCisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJaWYgKCFkX3VuaGFzaGVkKGRlbnRyeSkpIHsKKwkJc3RydWN0IHN5c2ZzX2RpcmVudCAqIHNkID0gZGVudHJ5LT5kX2ZzZGF0YTsKKwkJaWYgKHNkLT5zX3R5cGUgJiBTWVNGU19LT0JKX0xJTkspIHsKKwkJCXN0cnVjdCBzeXNmc19zeW1saW5rICogc2wgPSBzZC0+c19lbGVtZW50OworCQkJa29iaiA9IGtvYmplY3RfZ2V0KHNsLT50YXJnZXRfa29iaik7CisJCX0gZWxzZQorCQkJa29iaiA9IGtvYmplY3RfZ2V0KHNkLT5zX2VsZW1lbnQpOworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCisJcmV0dXJuIGtvYmo7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWxlYXNlX3N5c2ZzX2RpcmVudChzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc2QpCit7CisJaWYgKHNkLT5zX3R5cGUgJiBTWVNGU19LT0JKX0xJTkspIHsKKwkJc3RydWN0IHN5c2ZzX3N5bWxpbmsgKiBzbCA9IHNkLT5zX2VsZW1lbnQ7CisJCWtmcmVlKHNsLT5saW5rX25hbWUpOworCQlrb2JqZWN0X3B1dChzbC0+dGFyZ2V0X2tvYmopOworCQlrZnJlZShzbCk7CisJfQorCWttZW1fY2FjaGVfZnJlZShzeXNmc19kaXJfY2FjaGVwLCBzZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN5c2ZzX2RpcmVudCAqIHN5c2ZzX2dldChzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc2QpCit7CisJaWYgKHNkKSB7CisJCVdBUk5fT04oIWF0b21pY19yZWFkKCZzZC0+c19jb3VudCkpOworCQlhdG9taWNfaW5jKCZzZC0+c19jb3VudCk7CisJfQorCXJldHVybiBzZDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN5c2ZzX3B1dChzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc2QpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnNkLT5zX2NvdW50KSkKKwkJcmVsZWFzZV9zeXNmc19kaXJlbnQoc2QpOworfQorCmRpZmYgLS1naXQgYS9mcy9zeXN2L0NIQU5HRVMgYi9mcy9zeXN2L0NIQU5HRVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlYTZlOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3N5c3YvQ0hBTkdFUwpAQCAtMCwwICsxLDYwIEBACitNb24sIDE1IERlYyAxOTk3CSAgS3J6eXN6dG9mIEcuIEJhcmFub3dza2kgPGtnYkBtYW5qYWsua25tLm9yZy5wbD4KKwkqICAgIG5hbWVpLmM6IHN0cnVjdCBzeXN2X2Rpcl9pbm9kZV9vcGVyYXRpb25zIHVwZGF0ZWQgdG8gdXNlIGRlbnRyaWVzLgorCitGcmksIDIzIEphbiAxOTk4ICAgS3J6eXN6dG9mIEcuIEJhcmFub3dza2kgPGtnYkBtYW5qYWsua25tLm9yZy5wbD4KKwkqICAgIGlub2RlLmM6IGNvcnJlY3RlZCAxIHRyYWNrIG9mZnNldCBzZXR0aW5nIChpbiBzYi0+c3ZfYmxvY2tfYmFzZSkuCisJCSAgICAgIE9yaWdpbmFsbHkgaXQgd2FzIG92ZXJyaWRkZW4gKGJ5IHNldHRpbmcgdG8gemVybykKKwkJICAgICAgaW4gZGV0ZWN0ZWRfW3hlbml4LHN5c3Y0LHN5c3YyLGNvaGVyZW50XS4gVGhhbmtzCisJCSAgICAgIHRvIEFuZHJ6ZWogS3J6eXN6dG9mb3dpY3ogPGFua3J5QG1pZi5wZy5nZGEucGw+CisJCSAgICAgIGZvciBpZGVudGlmeWluZyB0aGUgcHJvYmxlbS4KKworVHVlLCAyNyBKYW4gMTk5OCAgIEtyenlzenRvZiBHLiBCYXJhbm93c2tpIDxrZ2JAbWFuamFrLmtubS5vcmcucGw+CisgICAgICAgICogICAgaW5vZGUuYzogYWRkZWQgMjA0OC1ieXRlIGJsb2NrIHN1cHBvcnQgdG8gU3lzdGVtViBGUy4KKwkJICAgICAgTWVyZ2VkIGRldGVjdGVkX2JzWzUxMiwxMDI0LDIwNDhdKCkgaW50byBvbmUgZnVuY3Rpb246CisJCSAgICAgIHZvaWQgZGV0ZWN0ZWRfYnMgKHVfY2hhciB0eXBlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKS4KKwkJICAgICAgVGhhbmtzIHRvIEFuZHJ6ZWogS3J6eXN6dG9mb3dpY3ogPGFua3J5QG1pZi5wZy5nZGEucGw+CisJCSAgICAgIGZvciB0aGUgcGF0Y2guCisKK1dlZCwgNCBGZWIgMTk5OCAgIEtyenlzenRvZiBHLiBCYXJhbm93c2tpIDxrZ2JAbWFuamFrLmtubS5vcmcucGw+CisJKiAgICBuYW1laS5jOiByZW1vdmVkIHN0YXRpYyBzdWJkaXIoKTsgaXNfc3ViZGlyKCkgZnJvbSBkY2FjaGUuYworCQkgICAgICBpcyB1c2VkIGluc3RlYWQuIENvc21ldGljIGNoYW5nZXMuCisKK1RodSwgMyBEZWMgMTk5OCAgIEFsIFZpcm8gKHZpcm9AcGFyY2VsZmFyY2UubGludXgudGhlcGxhbmV0LmNvLnVrKQorCSogICAgbmFtZWkuYyAoc3lzdl9ybWRpcik6CisJCSAgICAgIEJ1Z2VjdG9teTogb2xkIGNoZWNrIGZvciB2aWN0aW0gYmVpbmcgYnVzeQorCQkgICAgICAoaW5vZGUtPmlfY291bnQpIHdhc24ndCByZXBsYWNlZCAod2l0aCBjaGVja2luZworCQkgICAgICBkZW50cnktPmRfY291bnQpIGFuZCBlc2NhcGVkIExpbnVzIGluIHRoZSBsYXN0IHJvdW5kCisJCSAgICAgIG9mIGNoYW5nZXMuIFNob3QgYW5kIGJ1cmllZC4KKworV2VkLCA5IERlYyAxOTk4ICAgQVYKKwkqICAgIG5hbWVpLmMgKGRvX3N5c3ZfcmVuYW1lKToKKwkJICAgICAgIEZpeGVkIGluY29ycmVjdCBjaGVjayBmb3Igb3RoZXIgb3duZXJzICsgcmFjZS4KKwkJICAgICAgIFJlbW92ZWQgY2hlY2tzIHRoYXQgd2VudCB0byBWRlMuCisJKiAgICBuYW1laS5jIChzeXN2X3VubGluayk6CisJCSAgICAgICBSZW1vdmVkIGNoZWNrcyB0aGF0IHdlbnQgdG8gVkZTLgorCitUaHUsIDEwIERlYyAxOTk4ICAgQVYKKwkqICAgIG5hbWVpLmMgKGRvX21rbm9kKToKKwkJCVJlbW92ZWQgZGVhZCBjb2RlIC0gbWtub2QgaXMgbmV2ZXIgYXNrZWQgdG8KKwkJCWNyZWF0ZSBhIHN5bWxpbmsgb3IgZGlyZWN0b3J5LiBJbmNpZGVudGlhbGx5LAorCQkJaXQgd291bGRuJ3QgZG8gaXQgcmlnaHQgaWYgaXQgd291bGQgYmUgY2FsbGVkLgorCitTYXQsIDI2IERlYyAxOTk4ICAgS0dCCisJKiAgICBpbm9kZS5jIChkZXRlY3Rfc3lzdjQpOgorCQkJQWRkZWQgZGV0ZWN0aW9uIG9mIGV4cGFuZGVkIHNfdHlwZSBmaWVsZCAoMHgxMCwKKwkJCTB4MjAgYW5kIDB4MzApLiAgRm9yY2VkIHJlYWQtb25seSBhY2Nlc3MgaW4gdGhpcyBjYXNlLgorCitTdW4sIDIxIE1hciAxOTk5ICAgQVYKKwkqICAgIG5hbWVpLmMgKHN5c3ZfbGluayk6CisJCQlGaXhlZCBpX2NvdW50IHVzYWdlIHRoYXQgcmVzdWx0ZWQgaW4gZGNhY2hlIGNvcnJ1cHRpb24uCisJKiAgICBpbm9kZS5jOgorCQkJRmlsbGVkIC0+ZGVsZXRlX2lub2RlKCkgbWV0aG9kIHdpdGggc3lzdl9kZWxldGVfaW5vZGUoKS4KKwkJCXN5c3ZfcHV0X2lub2RlKCkgaXMgZ29uZSwgYXMgaXQgdHJpZWQgdG8gZG8gLT5kZWxldGVfCisJCQlfaW5vZGUoKSdzIGpvYi4KKwkqICAgIGlhbGxvYy5jOiAoc3lzdl9mcmVlX2lub2RlKToKKwkJCUZpeGVkIHJhY2UuCisKK1N1biwgMzAgQXByIDE5OTkgICBBVgorCSogICAgbmFtZWkuYyAoc3lzdl9ta25vZCk6CisJCQlSZW1vdmVkIGRlYWQgY29kZSAoU19JRlJFRyBjYXNlIGlzIG5vdyBwYXNzZWQgdG8KKwkJCS0+Y3JlYXRlKCkgYnkgVkZTKS4KZGlmZiAtLWdpdCBhL2ZzL3N5c3YvQ2hhbmdlTG9nIGIvZnMvc3lzdi9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlMzQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3N5c3YvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMTA2IEBACitUaHUgRmViIDE0IDIwMDIgIEFuZHJldyBNb3J0b24gIDxha3BtQHppcC5jb20uYXU+CisKKwkqIGRpcl9jb21taXRfY2h1bmsoKTogY2FsbCB3cml0ZW91dF9vbmVfcGFnZSgpIGFzIHdlbGwgYXMKKwkgIHdhaXRmb3Jfb25lX3BhZ2UoKSBmb3IgSVNfU1lOQyBkaXJlY3Rvcmllcywgc28gdGhhdCB3ZQorCSAgYWN0dWFsbHkgZG8gc3luYyB0aGUgZGlyZWN0b3J5LiAoZm9yd2FyZC1wb3J0IGZyb20gMi40KS4KKworVGh1IEZlYiAgNyAyMDAyICBBbGV4YW5kZXIgVmlybyAgPHZpcm9AcGFyY2VsZmFyY2UubGludXgudGhlcGxhbmV0LmNvLnVrPgorCisJKiBzdXBlci5jOiBzd2l0Y2hlZCB0byAtPmdldF9zYigpCisJKiBDaGFuZ2VMb2c6IGZpeGVkIGRhdGVzIDstKQorCisyMDAyLTAxLTI0ICBEYXZpZCBTLiBNaWxsZXIgIDxkYXZlbUByZWRoYXQuY29tPgorCisJKiBpbm9kZS5jOiBJbmNsdWRlIGxpbnV4L2luaXQuaAorCitNb24gSmFuIDIxIDIwMDIgIEFsZXhhbmRlciBWaXJvICA8dmlyb0BwYXJjZWxmYXJjZS5saW51eC50aGVwbGFuZXQuY28udWs+CisJKiBpYWxsb2MuYyAoc3lzdl9uZXdfaW5vZGUpOiB6ZXJvIFNZU1ZfSShpbm9kZSktPmlfZGF0YSBvdXQuCisJKiBpX3Zub2RlIHJlbmFtZWQgdG8gdmZzX2lub2RlLiAgU29ycnksIGJ1dCBsZXQncyBrZWVwIHRoYXQKKwkgIGNvbnNpc3RlbnQuCisKK1NhdCBKYW4gMTkgMjAwMiAgQ2hyaXN0b3BoIEhlbGx3aWcgIDxoY2hAaW5mcmFkZWFkLm9yZz4KKworCSogaW5jbHVkZS9saW51eC9zeXN2X2ZzLmggKFNZU1ZfSSk6IEdldCBmcy1wcml2YXRlIGlub2RlIGRhdGEgdXNpbmcKKwkJbGlzdF9lbnRyeSgpIGluc3RlYWQgb2YgaW5vZGUtPnUuCisJKiBpbmNsdWRlL2xpbnV4L3N5c3ZfZnNfaS5oOiBBZGQgJ3N0cnVjdCBpbm9kZSAgaV92bm9kZScgZmllbGQgdG8KKwkJc3lzdl9pbm9kZV9pbmZvIHN0cnVjdHVyZS4KKwkqIGlub2RlLmM6IEluY2x1ZGUgPGxpbnV4L3NsYWIuaD4sIGltcGxlbWVudCBhbGxvY19pbm9kZS9kZXN0cm95X2lub2RlCisJCXNvcCBtZXRob2RzLCBhZGQgaW5mcmFzdHJ1Y3R1cmUgZm9yIHBlci1mcyBpbm9kZSBzbGFiIGNhY2hlLgorCSogc3VwZXIuYyAoaW5pdF9zeXN2X2ZzKTogSW5pdGlhbGl6ZSBpbm9kZSBjYWNoZSwgcmVjb3ZlciBwcm9wZXJseQorCQlpbiB0aGUgY2FzZSBvZiBmYWlsZWQgcmVnaXN0ZXJfZmlsZXN5c3RlbSBmb3IgVjcuCisJKGV4aXRfc3lzdl9mcyk6IERlc3Ryb3kgaW5vZGUgY2FjaGUuCisKK1NhdCBKYW4gMTkgMjAwMiAgQ2hyaXN0b3BoIEhlbGx3aWcgIDxoY2hAaW5mcmFkZWFkLm9yZz4KKworCSogaW5jbHVkZS9saW51eC9zeXN2X2ZzLmg6IEluY2x1ZGUgPGxpbnV4L3N5c3ZfZnNfaS5oPiwgZGVjbGFyZSBTWVNWX0koKS4KKwkqIGRpci5jIChzeXN2X2ZpbmRfZW50cnkpOiBVc2UgU1lTVl9JKCkgaW5zdGVhZCBvZiAtPnUuc3lzdl9pIHRvCisJCWFjY2VzcyBmcy1wcml2YXRlIGlub2RlIGRhdGEuCisJKiBpYWxsb2MuYyAoc3lzdl9uZXdfaW5vZGUpOiBMaWtld2lzZS4KKwkqIGlub2RlLmMgKHN5c3ZfcmVhZF9pbm9kZSk6IExpa2V3aXNlLgorCShzeXN2X3VwZGF0ZV9pbm9kZSk6IExpa2V3aXNlLgorCSogaXRyZWUuYyAoZ2V0X2JyYW5jaCk6IExpa2V3aXNlLgorCShzeXN2X3RydW5jYXRlKTogTGlrZXdpc2UuCisJKiBzeW1saW5rLmMgKHN5c3ZfcmVhZGxpbmspOiBMaWtld2lzZS4KKwkoc3lzdl9mb2xsb3dfbGluayk6IExpa2V3aXNlLgorCitGcmkgSmFuICA0IDIwMDIgIEFsZXhhbmRlciBWaXJvICA8dmlyb0BwYXJjZWxmYXJjZS5saW51eC50aGVwbGFuZXQuY28udWs+CisKKwkqIGlhbGxvYy5jIChzeXN2X2ZyZWVfaW5vZGUpOiBVc2Ugc2ItPnNfaWQgaW5zdGVhZCBvZiBiZGV2bmFtZSgpLgorCSogaW5vZGUuYyAoc3lzdl9yZWFkX2lub2RlKTogTGlrZXdpc2UuCisJICAoc3lzdl91cGRhdGVfaW5vZGUpOiBMaWtld2lzZS4KKwkgIChzeXN2X3N5bmNfaW5vZGUpOiBMaWtld2lzZS4KKwkqIHN1cGVyLmMgKGRldGVjdF9zeXN2KTogTGlrZXdpc2UuCisJICAoY29tcGxldGVfcmVhZF9zdXBlcik6IExpa2V3aXNlLgorCSAgKHN5c3ZfcmVhZF9zdXBlcik6IExpa2V3aXNlLgorCSAgKHY3X3JlYWRfc3VwZXIpOiBMaWtld2lzZS4KKworU3VuIERlYyAzMCAyMDAxICBNYW5mcmVkIFNwcmF1bCAgPG1hbmZyZWRzQGNvbG9yZnVsbGlmZS5jb20+CisKKwkqIGRpci5jIChkaXJfY29tbWl0X2NodW5rKTogRG8gbm90IHNldCBkaXItPmlfdmVyc2lvbi4KKwkoc3lzdl9yZWFkZGlyKTogTGlrZXdpc2UuCisKK1RodSBEZWMgMjcgMjAwMSAgQWxleGFuZGVyIFZpcm8gIDx2aXJvQHBhcmNlbGZhcmNlLmxpbnV4LnRoZXBsYW5ldC5jby51az4KKworCSogaXRyZWUuYyAoZ2V0X2Jsb2NrKTogVXNlIG1hcF9iaCgpIHRvIGZpbGwgb3V0IGJoX3Jlc3VsdC4KKworVHVlIERlYyAyNSAyMDAxICBBbGV4YW5kZXIgVmlybyAgPHZpcm9AcGFyY2VsZmFyY2UubGludXgudGhlcGxhbmV0LmNvLnVrPgorCisJKiBzdXBlci5jIChzeXN2X3JlYWRfc3VwZXIpOiBVc2Ugc2Jfc2V0X2Jsb2Nrc2l6ZSgpIHRvIHNldCBibG9ja3NpemUuCisJICAodjdfcmVhZF9zdXBlcik6IExpa2V3aXNlLgorCitUdWUgTm92IDI3IDIwMDEgIEFsZXhhbmRlciBWaXJvICA8dmlyb0BwYXJjZWxmYXJjZS5saW51eC50aGVwbGFuZXQuY28udWs+CisKKwkqIGl0cmVlLmMgKGdldF9ibG9jayk6IENoYW5nZSB0eXBlIGZvciBpYmxvY2sgYXJndW1lbnQgdG8gc2VjdG9yX3QuCisJKiBzdXBlci5jIChzeXN2X3JlYWRfc3VwZXIpOiBTZXQgc19ibG9ja3NpemUgZWFybHkuCisJICAodjdfcmVhZF9zdXBlcik6IExpa2V3aXNlLgorCSogYmFsbG9jLmMgKHN5c3ZfbmV3X2Jsb2NrKTogVXNlIHNiX2JyZWFkKCkuIGluc3RlYWQgb2YgYnJlYWQoKS4KKwkgIChzeXN2X2NvdW50X2ZyZWVfYmxvY2tzKTogTGlrZXdpc2UuCisJKiBpYWxsb2MuYyAoc3lzdl9yYXdfaW5vZGUpOiBMaWtld2lzZS4KKwkqIGl0cmVlLmMgKGdldF9icmFuY2gpOiBMaWtld2lzZS4KKwkgIChmcmVlX2JyYW5jaGVzKTogTGlrZXdpc2UuCisJKiBzdXBlci5jIChzeXN2X3JlYWRfc3VwZXIpOiBMaWtld2lzZS4KKwkgICh2N19yZWFkX3N1cGVyKTogTGlrZXdpc2UuCisKK1NhdCBEZWMgMTUgMjAwMSAgQ2hyaXN0b3BoIEhlbGx3aWcgIDxoY2hAaW5mcmFkZWFkLm9yZz4KKworCSogaW5vZGUuYyAoc3lzdl9yZWFkX2lub2RlKTogTWFyayBpbm9kZSBhcyBiYWQgaW4gY2FzZSBvZiBmYWlsdXJlLgorCSogc3VwZXIuYyAoY29tcGxldGVfcmVhZF9zdXBlcik6IENoZWNrIGZvciBiYWQgcm9vdCBpbm9kZS4KKworV2VkIE5vdiAyMSAyMDAxICBBbmRyZXcgTW9ydG9uICA8YW5kcmV3bUB1b3cuZWR1LmF1PgorCisJKiBmaWxlLmMgKHN5c3Zfc3luY19maWxlKTogQ2FsbCBmc3luY19pbm9kZV9kYXRhX2J1ZmZlcnMuCisKK0ZyaSBPY3QgMjYgMjAwMSAgQ2hyaXN0b3BoIEhlbGx3aWcgIDxoY2hAaW5mcmFkZWFkLm9yZz4KKworCSogZGlyLmMsIGlhbGxvYy5jLCBuYW1laS5jLCBpbmNsdWRlL2xpbnV4L3N5c3ZfZnNfaS5oOgorCUltcGxlbWVudCBwZXItSW5vZGUgbG9va3VwIG9mZnNldCBjYWNoZS4KKwlNb2RlbGxlZCBhZnRlciBUZWQncyBleHQyIHBhdGNoLgorCitGcmkgT2N0IDI2IDIwMDEgIENocmlzdG9waCBIZWxsd2lnICA8aGNoQGluZnJhZGVhZC5vcmc+CisKKwkqIGlub2RlLmMsIHN1cGVyLmMsIGluY2x1ZGUvbGludXgvc3lzdl9mcy5oLAorCSAgaW5jbHVkZS9saW51eC9zeXN2X2ZzX3NiLmg6CisJUmVtb3ZlIHN5bWxpbmsgZmFraW5nLglOb29uZSByZWFsbHkgd2FudHMgdG8gdXNlIHRoZXNlIGFzCisJbGludXggZmlsZXN5c3RlbXMgYW5kIG5hdGl2ZSBPU2VzIGRvbid0IHN1cHBvcnQgaXQgYW55d2F5LgorCisKZGlmZiAtLWdpdCBhL2ZzL3N5c3YvSU5UUk8gYi9mcy9zeXN2L0lOVFJPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNGU0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zeXN2L0lOVFJPCkBAIC0wLDAgKzEsMTgyIEBACitUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3lzdGVtVi9Db2hlcmVudCBmaWxlc3lzdGVtIGZvciBMaW51eC4KK0l0IGdyZXcgb3V0IG9mIHNlcGFyYXRlIGZpbGVzeXN0ZW0gaW1wbGVtZW50YXRpb25zCisKKyAgICBYZW5peCBGUyAgICAgIERvdWcgRXZhbnMgPGRqZUBjeWdudXMuY29tPiAgSnVuZSAxOTkyCisgICAgU3lzdGVtViBGUyAgICBQYXVsIEIuIE1vbmRheSA8cG1vbmRheUBlZWNzLndzdS5lZHU+IE1hcmNoLUp1bmUgMTk5MworICAgIENvaGVyZW50IEZTICAgQi4gSGFpYmxlIDxoYWlibGVAbWEyczIubWF0aGVtYXRpay51bmkta2FybHNydWhlLmRlPiBKdW5lIDE5OTMKKworYW5kIHdhcyBtZXJnZWQgdG9nZXRoZXIgaW4gSnVseSAxOTkzLgorCitUaGVzZSBmaWxlc3lzdGVtcyBhcmUgcmF0aGVyIHNpbWlsYXIuIEhlcmUgaXMgYSBjb21wYXJpc29uIHdpdGggTWluaXggRlM6CisKKyogTGludXggZmRpc2sgcmVwb3J0cyBvbiBwYXJ0aXRpb25zCisgIC0gTWluaXggRlMgICAgIDB4ODEgTGludXgvTWluaXgKKyAgLSBYZW5peCBGUyAgICAgPz8KKyAgLSBTeXN0ZW1WIEZTICAgPz8KKyAgLSBDb2hlcmVudCBGUyAgMHgwOCBBSVggYm9vdGFibGUKKworKiBTaXplIG9mIGEgYmxvY2sgb3Igem9uZSAoZGF0YSBhbGxvY2F0aW9uIHVuaXQgb24gZGlzaykKKyAgLSBNaW5peCBGUyAgICAgMTAyNAorICAtIFhlbml4IEZTICAgICAxMDI0IChhbHNvIDUxMiA/PykKKyAgLSBTeXN0ZW1WIEZTICAgMTAyNCAoYWxzbyA1MTIgYW5kIDIwNDgpCisgIC0gQ29oZXJlbnQgRlMgICA1MTIKKworKiBHZW5lcmFsIGxheW91dDogYWxsIGhhdmUgb25lIGJvb3QgYmxvY2ssIG9uZSBzdXBlciBibG9jayBhbmQKKyAgc2VwYXJhdGUgYXJlYXMgZm9yIGlub2RlcyBhbmQgZm9yIGRpcmVjdG9yaWVzL2RhdGEuCisgIE9uIFN5c3RlbVYgUmVsZWFzZSAyIEZTIChlLmcuIE1pY3JvcG9ydCkgdGhlIGZpcnN0IHRyYWNrIGlzIHJlc2VydmVkIGFuZAorICBhbGwgdGhlIGJsb2NrIG51bWJlcnMgKGluY2x1ZGluZyB0aGUgc3VwZXIgYmxvY2spIGFyZSBvZmZzZXQgYnkgb25lIHRyYWNrLgorCisqIEJ5dGUgb3JkZXJpbmcgb2YgInNob3J0IiAoMTYgYml0IGVudGl0aWVzKSBvbiBkaXNrOgorICAtIE1pbml4IEZTICAgICBsaXR0bGUgZW5kaWFuICAwIDEKKyAgLSBYZW5peCBGUyAgICAgbGl0dGxlIGVuZGlhbiAgMCAxCisgIC0gU3lzdGVtViBGUyAgIGxpdHRsZSBlbmRpYW4gIDAgMQorICAtIENvaGVyZW50IEZTICBsaXR0bGUgZW5kaWFuICAwIDEKKyAgT2YgY291cnNlLCB0aGlzIGFmZmVjdHMgb25seSB0aGUgZmlsZSBzeXN0ZW0sIG5vdCB0aGUgZGF0YSBvZiBmaWxlcyBvbiBpdCEKKworKiBCeXRlIG9yZGVyaW5nIG9mICJsb25nIiAoMzIgYml0IGVudGl0aWVzKSBvbiBkaXNrOgorICAtIE1pbml4IEZTICAgICBsaXR0bGUgZW5kaWFuICAwIDEgMiAzCisgIC0gWGVuaXggRlMgICAgIGxpdHRsZSBlbmRpYW4gIDAgMSAyIDMKKyAgLSBTeXN0ZW1WIEZTICAgbGl0dGxlIGVuZGlhbiAgMCAxIDIgMworICAtIENvaGVyZW50IEZTICBQRFAtMTEgICAgICAgICAyIDMgMCAxCisgIE9mIGNvdXJzZSwgdGhpcyBhZmZlY3RzIG9ubHkgdGhlIGZpbGUgc3lzdGVtLCBub3QgdGhlIGRhdGEgb2YgZmlsZXMgb24gaXQhCisKKyogSW5vZGUgb24gZGlzazogInNob3J0IiwgMCBtZWFucyBub24tZXhpc3RlbnQsIHRoZSByb290IGRpciBpbm8gaXM6CisgIC0gTWluaXggRlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorICAtIFhlbml4IEZTLCBTeXN0ZW1WIEZTLCBDb2hlcmVudCBGUyAgIDIKKworKiBNYXhpbXVtIG51bWJlciBvZiBoYXJkIGxpbmtzIHRvIGEgZmlsZToKKyAgLSBNaW5peCBGUyAgICAgMjUwCisgIC0gWGVuaXggRlMgICAgID8/CisgIC0gU3lzdGVtViBGUyAgID8/CisgIC0gQ29oZXJlbnQgRlMgID49MTAwMDAKKworKiBGcmVlIGlub2RlIG1hbmFnZW1lbnQ6CisgIC0gTWluaXggRlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgYml0bWFwCisgIC0gWGVuaXggRlMsIFN5c3RlbVYgRlMsIENvaGVyZW50IEZTCisgICAgICBUaGVyZSBpcyBhIGNhY2hlIG9mIGEgY2VydGFpbiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgaW4gdGhlIHN1cGVyLWJsb2NrLgorICAgICAgV2hlbiBpdCBpcyBleGhhdXN0ZWQsIG5ldyBmcmVlIGlub2RlcyBhcmUgZm91bmQgdXNpbmcgYSBsaW5lYXIgc2VhcmNoLgorCisqIEZyZWUgYmxvY2sgbWFuYWdlbWVudDoKKyAgLSBNaW5peCBGUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBiaXRtYXAKKyAgLSBYZW5peCBGUywgU3lzdGVtViBGUywgQ29oZXJlbnQgRlMKKyAgICAgIEZyZWUgYmxvY2tzIGFyZSBvcmdhbml6ZWQgaW4gYSAiZnJlZSBsaXN0Ii4gTWF5YmUgYSBtaXNsZWFkaW5nIHRlcm0sCisgICAgICBzaW5jZSBpdCBpcyBub3QgdHJ1ZSB0aGF0IGV2ZXJ5IGZyZWUgYmxvY2sgY29udGFpbnMgYSBwb2ludGVyIHRvCisgICAgICB0aGUgbmV4dCBmcmVlIGJsb2NrLiBSYXRoZXIsIHRoZSBmcmVlIGJsb2NrcyBhcmUgb3JnYW5pemVkIGluIGNodW5rcworICAgICAgb2YgbGltaXRlZCBzaXplLCBhbmQgZXZlcnkgbm93IGFuZCB0aGVuIGEgZnJlZSBibG9jayBjb250YWlucyBwb2ludGVycworICAgICAgdG8gdGhlIGZyZWUgYmxvY2tzIHBlcnRhaW5pbmcgdG8gdGhlIG5leHQgY2h1bms7IHRoZSBmaXJzdCBvZiB0aGVzZQorICAgICAgY29udGFpbnMgcG9pbnRlcnMgYW5kIHNvIG9uLiBUaGUgbGlzdCB0ZXJtaW5hdGVzIHdpdGggYSAiYmxvY2sgbnVtYmVyIgorICAgICAgMCBvbiBYZW5peCBGUyBhbmQgU3lzdGVtViBGUywgd2l0aCBhIGJsb2NrIHplcm9lZCBvdXQgb24gQ29oZXJlbnQgRlMuCisKKyogU3VwZXItYmxvY2sgbG9jYXRpb246CisgIC0gTWluaXggRlMgICAgIGJsb2NrIDEgPSBieXRlcyAxMDI0Li4yMDQ3CisgIC0gWGVuaXggRlMgICAgIGJsb2NrIDEgPSBieXRlcyAxMDI0Li4yMDQ3CisgIC0gU3lzdGVtViBGUyAgIGJ5dGVzIDUxMi4uMTAyMworICAtIENvaGVyZW50IEZTICBibG9jayAxID0gYnl0ZXMgNTEyLi4xMDIzCisKKyogU3VwZXItYmxvY2sgbGF5b3V0OgorICAtIE1pbml4IEZTCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfbmlub2RlczsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc19uem9uZXM7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfaW1hcF9ibG9ja3M7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfem1hcF9ibG9ja3M7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfZmlyc3RkYXRhem9uZTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc19sb2dfem9uZV9zaXplOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNfbWF4X3NpemU7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfbWFnaWM7CisgIC0gWGVuaXggRlMsIFN5c3RlbVYgRlMsIENvaGVyZW50IEZTCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfZmlyc3RkYXRhem9uZTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgc19uem9uZXM7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfZnpvbmVfY291bnQ7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIHNfZnpvbmVzW05JQ0ZSRUVdOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzX2Zpbm9kZV9jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc19maW5vZGVzW05JQ0lOT0RdOworICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICBzX2Zsb2NrOworICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICBzX2lsb2NrOworICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICBzX21vZGlmaWVkOworICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICBzX3Jkb25seTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgc190aW1lOworICAgICAgICAgICAgICAgICAgICBzaG9ydCAgICAgICAgICBzX2RpbmZvWzRdOyAtLSBTeXN0ZW1WIEZTIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgc19mcmVlX3pvbmVzOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzX2ZyZWVfaW5vZGVzOworICAgICAgICAgICAgICAgICAgICBzaG9ydCAgICAgICAgICBzX2RpbmZvWzRdOyAtLSBYZW5peCBGUyBvbmx5CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfaW50ZXJsZWF2ZV9tLHNfaW50ZXJsZWF2ZV9uOyAtLSBDb2hlcmVudCBGUyBvbmx5CisgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgIHNfZm5hbWVbNl07CisgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgIHNfZnBhY2tbNl07CisgICAgdGhlbiB0aGV5IGRpZmZlciBjb25zaWRlcmFibHk6CisgICAgICAgIFhlbml4IEZTCisgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgIHNfY2xlYW47CisgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgIHNfZmlsbFszNzFdOworICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICBzX21hZ2ljOworICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICBzX3R5cGU7CisgICAgICAgIFN5c3RlbVYgRlMKKyAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgc19maWxsWzEyIG9yIDE0XTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgc19zdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgc19tYWdpYzsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgc190eXBlOworICAgICAgICBDb2hlcmVudCBGUworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBzX3VuaXF1ZTsKKyAgICBOb3RlIHRoYXQgQ29oZXJlbnQgRlMgaGFzIG5vIG1hZ2ljLgorCisqIElub2RlIGxheW91dDoKKyAgLSBNaW5peCBGUworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpX21vZGU7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGlfdWlkOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBpX3NpemU7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGlfdGltZTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgaV9naWQ7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgIGlfbmxpbmtzOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpX3pvbmVbNysxKzFdOworICAtIFhlbml4IEZTLCBTeXN0ZW1WIEZTLCBDb2hlcmVudCBGUworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpX21vZGU7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGlfbmxpbms7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGlfdWlkOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpX2dpZDsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgaV9zaXplOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICBpX3pvbmVbMyooMTArMSsxKzEpXTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgaV9hdGltZTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgaV9tdGltZTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgaV9jdGltZTsKKworKiBSZWd1bGFyIGZpbGUgZGF0YSBibG9ja3MgYXJlIG9yZ2FuaXplZCBhcworICAtIE1pbml4IEZTCisgICAgICAgICAgICAgICA3IGRpcmVjdCBibG9ja3MKKyAgICAgICAgICAgICAgIDEgaW5kaXJlY3QgYmxvY2sgKHBvaW50ZXJzIHRvIGJsb2NrcykKKyAgICAgICAgICAgICAgIDEgZG91YmxlLWluZGlyZWN0IGJsb2NrIChwb2ludGVyIHRvIHBvaW50ZXJzIHRvIGJsb2NrcykKKyAgLSBYZW5peCBGUywgU3lzdGVtViBGUywgQ29oZXJlbnQgRlMKKyAgICAgICAgICAgICAgMTAgZGlyZWN0IGJsb2NrcworICAgICAgICAgICAgICAgMSBpbmRpcmVjdCBibG9jayAocG9pbnRlcnMgdG8gYmxvY2tzKQorICAgICAgICAgICAgICAgMSBkb3VibGUtaW5kaXJlY3QgYmxvY2sgKHBvaW50ZXIgdG8gcG9pbnRlcnMgdG8gYmxvY2tzKQorICAgICAgICAgICAgICAgMSB0cmlwbGUtaW5kaXJlY3QgYmxvY2sgKHBvaW50ZXIgdG8gcG9pbnRlcnMgdG8gcG9pbnRlcnMgdG8gYmxvY2tzKQorCisqIElub2RlIHNpemUsIGlub2RlcyBwZXIgYmxvY2sKKyAgLSBNaW5peCBGUyAgICAgICAgMzIgICAzMgorICAtIFhlbml4IEZTICAgICAgICA2NCAgIDE2CisgIC0gU3lzdGVtViBGUyAgICAgIDY0ICAgMTYKKyAgLSBDb2hlcmVudCBGUyAgICAgNjQgICAgOAorCisqIERpcmVjdG9yeSBlbnRyeSBvbiBkaXNrCisgIC0gTWluaXggRlMKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgaW5vZGU7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgbmFtZVsxNC8zMF07CisgIC0gWGVuaXggRlMsIFN5c3RlbVYgRlMsIENvaGVyZW50IEZTCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGlub2RlOworICAgICAgICAgICAgICAgICAgICBjaGFyIG5hbWVbMTRdOworCisqIERpciBlbnRyeSBzaXplLCBkaXIgZW50cmllcyBwZXIgYmxvY2sKKyAgLSBNaW5peCBGUyAgICAgMTYvMzIgICAgNjQvMzIKKyAgLSBYZW5peCBGUyAgICAgMTYgICAgICAgNjQKKyAgLSBTeXN0ZW1WIEZTICAgMTYgICAgICAgNjQKKyAgLSBDb2hlcmVudCBGUyAgMTYgICAgICAgMzIKKworKiBIb3cgdG8gaW1wbGVtZW50IHN5bWJvbGljIGxpbmtzIHN1Y2ggdGhhdCB0aGUgaG9zdCBmc2NrIGRvZXNuJ3Qgc2NyZWFtOgorICAtIE1pbml4IEZTICAgICBub3JtYWwKKyAgLSBYZW5peCBGUyAgICAga2x1ZGdlOiBhcyByZWd1bGFyIGZpbGVzIHdpdGggIGNobW9kIDEwMDAKKyAgLSBTeXN0ZW1WIEZTICAgPz8KKyAgLSBDb2hlcmVudCBGUyAga2x1ZGdlOiBhcyByZWd1bGFyIGZpbGVzIHdpdGggIGNobW9kIDEwMDAKKworCitOb3RhdGlvbjogV2Ugb2Z0ZW4gc3BlYWsgb2YgYSAiYmxvY2siIGJ1dCBtZWFuIGEgem9uZSAodGhlIGFsbG9jYXRpb24gdW5pdCkKK2FuZCBub3QgdGhlIGRpc2sgZHJpdmVyJ3Mgbm90aW9uIG9mICJibG9jayIuCisKKworQnJ1bm8gSGFpYmxlICA8aGFpYmxlQG1hMnMyLm1hdGhlbWF0aWsudW5pLWthcmxzcnVoZS5kZT4KZGlmZiAtLWdpdCBhL2ZzL3N5c3YvTWFrZWZpbGUgYi9mcy9zeXN2L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OTFmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zeXN2L01ha2VmaWxlCkBAIC0wLDAgKzEsOCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IFN5c3RlbVYvQ29oZXJlbnQgZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX1NZU1ZfRlMpICs9IHN5c3YubworCitzeXN2LW9ianMgOj0gaWFsbG9jLm8gYmFsbG9jLm8gaW5vZGUubyBpdHJlZS5vIGZpbGUubyBkaXIubyBcCisJICAgICBuYW1laS5vIHN1cGVyLm8gc3ltbGluay5vCmRpZmYgLS1naXQgYS9mcy9zeXN2L2JhbGxvYy5jIGIvZnMvc3lzdi9iYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTZhZDk2YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3N5c3YvYmFsbG9jLmMKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiAgbGludXgvZnMvc3lzdi9iYWxsb2MuYworICoKKyAqICBtaW5peC9iaXRtYXAuYworICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgZXh0L2ZyZWVsaXN0cy5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyICBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKgorICogIHhlbml4L2FsbG9jLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTIgIERvdWcgRXZhbnMKKyAqCisgKiAgY29oL2FsbG9jLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTMgIFBhc2NhbCBIYWlibGUsIEJydW5vIEhhaWJsZQorICoKKyAqICBzeXN2L2JhbGxvYy5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkzICBCcnVubyBIYWlibGUKKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgZm9yIGFsbG9jYXRpbmcvZnJlZWluZyBibG9ja3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSAic3lzdi5oIgorCisvKiBXZSBkb24ndCB0cnVzdCB0aGUgdmFsdWUgb2YKKyAgIHNiLT5zdl9zYmQyLT5zX3RmcmVlID0gKnNiLT5zdl9mcmVlX2Jsb2NrcworICAgYnV0IHdlIG5ldmVydGhlbGVzcyBrZWVwIGl0IHVwIHRvIGRhdGUuICovCisKK3N0YXRpYyBpbmxpbmUgc3lzdl96b25lX3QgKmdldF9jaHVuayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWNoYXIgKmJoX2RhdGEgPSBiaC0+Yl9kYXRhOworCisJaWYgKFNZU1ZfU0Ioc2IpLT5zX3R5cGUgPT0gRlNUWVBFX1NZU1Y0KQorCQlyZXR1cm4gKHN5c3Zfem9uZV90KikoYmhfZGF0YSs0KTsKKwllbHNlCisJCXJldHVybiAoc3lzdl96b25lX3QqKShiaF9kYXRhKzIpOworfQorCisvKiBOT1RFIE5PVEUgTk9URTogbnIgaXMgYSBibG9jayBudW1iZXIgX2FzXyBfc3RvcmVkXyBfb25fIF9kaXNrXyAqLworCit2b2lkIHN5c3ZfZnJlZV9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgc3lzdl96b25lX3QgbnIpCit7CisJc3RydWN0IHN5c3Zfc2JfaW5mbyAqIHNiaSA9IFNZU1ZfU0Ioc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN5c3Zfem9uZV90ICpibG9ja3MgPSBzYmktPnNfYmNhY2hlOworCXVuc2lnbmVkIGNvdW50OworCXVuc2lnbmVkIGJsb2NrID0gZnMzMl90b19jcHUoc2JpLCBucik7CisKKwkvKgorCSAqIFRoaXMgY29kZSBkb2VzIG5vdCB3b3JrIGF0IGFsbCBmb3IgQUZTIChpdCBoYXMgYSBiaXRtYXAKKwkgKiBmcmVlIGxpc3QpLiAgQXMgQUZTIGlzIHN1cHBvc2VkIHRvIGJlIHJlYWQtb25seSBubyBvbmUKKwkgKiBzaG91bGQgY2FsbCB0aGlzIGZvciBhbiBBRlMgZmlsZXN5c3RlbSBhbnl3YXkuLi4KKwkgKi8KKwlpZiAoc2JpLT5zX3R5cGUgPT0gRlNUWVBFX0FGUykKKwkJcmV0dXJuOworCisJaWYgKGJsb2NrIDwgc2JpLT5zX2ZpcnN0ZGF0YXpvbmUgfHwgYmxvY2sgPj0gc2JpLT5zX256b25lcykgeworCQlwcmludGsoInN5c3ZfZnJlZV9ibG9jazogdHJ5aW5nIHRvIGZyZWUgYmxvY2sgbm90IGluIGRhdGF6b25lXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWxvY2tfc3VwZXIoc2IpOworCWNvdW50ID0gZnMxNl90b19jcHUoc2JpLCAqc2JpLT5zX2JjYWNoZV9jb3VudCk7CisKKwlpZiAoY291bnQgPiBzYmktPnNfZmxjX3NpemUpIHsKKwkJcHJpbnRrKCJzeXN2X2ZyZWVfYmxvY2s6IGZsY19jb3VudCA+IGZsY19zaXplXG4iKTsKKwkJdW5sb2NrX3N1cGVyKHNiKTsKKwkJcmV0dXJuOworCX0KKwkvKiBJZiB0aGUgZnJlZSBsaXN0IGhlYWQgaW4gc3VwZXItYmxvY2sgaXMgZnVsbCwgaXQgaXMgY29waWVkCisJICogaW50byB0aGlzIGJsb2NrIGJlaW5nIGZyZWVkLCBkaXR0byBpZiBpdCdzIGNvbXBsZXRlbHkgZW1wdHkKKwkgKiAoYXBwbGllcyBvbmx5IG9uIENvaGVyZW50KS4KKwkgKi8KKwlpZiAoY291bnQgPT0gc2JpLT5zX2ZsY19zaXplIHx8IGNvdW50ID09IDApIHsKKwkJYmxvY2sgKz0gc2JpLT5zX2Jsb2NrX2Jhc2U7CisJCWJoID0gc2JfZ2V0YmxrKHNiLCBibG9jayk7CisJCWlmICghYmgpIHsKKwkJCXByaW50aygic3lzdl9mcmVlX2Jsb2NrOiBnZXRibGsoKSBmYWlsZWRcbiIpOworCQkJdW5sb2NrX3N1cGVyKHNiKTsKKwkJCXJldHVybjsKKwkJfQorCQltZW1zZXQoYmgtPmJfZGF0YSwgMCwgc2ItPnNfYmxvY2tzaXplKTsKKwkJKihfX2ZzMTYqKWJoLT5iX2RhdGEgPSBjcHVfdG9fZnMxNihzYmksIGNvdW50KTsKKwkJbWVtY3B5KGdldF9jaHVuayhzYixiaCksIGJsb2NrcywgY291bnQgKiBzaXplb2Yoc3lzdl96b25lX3QpKTsKKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJYnJlbHNlKGJoKTsKKwkJY291bnQgPSAwOworCX0KKwlzYmktPnNfYmNhY2hlW2NvdW50KytdID0gbnI7CisKKwkqc2JpLT5zX2JjYWNoZV9jb3VudCA9IGNwdV90b19mczE2KHNiaSwgY291bnQpOworCWZzMzJfYWRkKHNiaSwgc2JpLT5zX2ZyZWVfYmxvY2tzLCAxKTsKKwlkaXJ0eV9zYihzYik7CisJdW5sb2NrX3N1cGVyKHNiKTsKK30KKworc3lzdl96b25lX3Qgc3lzdl9uZXdfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpID0gU1lTVl9TQihzYik7CisJdW5zaWduZWQgaW50IGJsb2NrOworCXN5c3Zfem9uZV90IG5yOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXVuc2lnbmVkIGNvdW50OworCisJbG9ja19zdXBlcihzYik7CisJY291bnQgPSBmczE2X3RvX2NwdShzYmksICpzYmktPnNfYmNhY2hlX2NvdW50KTsKKworCWlmIChjb3VudCA9PSAwKSAvKiBBcHBsaWVzIG9ubHkgdG8gQ29oZXJlbnQgRlMgKi8KKwkJZ290byBFbm9zcGM7CisJbnIgPSBzYmktPnNfYmNhY2hlWy0tY291bnRdOworCWlmIChuciA9PSAwKSAgLyogQXBwbGllcyBvbmx5IHRvIFhlbml4IEZTLCBTeXN0ZW1WIEZTICovCisJCWdvdG8gRW5vc3BjOworCisJYmxvY2sgPSBmczMyX3RvX2NwdShzYmksIG5yKTsKKworCSpzYmktPnNfYmNhY2hlX2NvdW50ID0gY3B1X3RvX2ZzMTYoc2JpLCBjb3VudCk7CisKKwlpZiAoYmxvY2sgPCBzYmktPnNfZmlyc3RkYXRhem9uZSB8fCBibG9jayA+PSBzYmktPnNfbnpvbmVzKSB7CisJCXByaW50aygic3lzdl9uZXdfYmxvY2s6IG5ldyBibG9jayAlZCBpcyBub3QgaW4gZGF0YSB6b25lXG4iLAorCQkJYmxvY2spOworCQlnb3RvIEVub3NwYzsKKwl9CisKKwlpZiAoY291bnQgPT0gMCkgeyAvKiB0aGUgbGFzdCBibG9jayBjb250aW51ZXMgdGhlIGZyZWUgbGlzdCAqLworCQl1bnNpZ25lZCBjb3VudDsKKworCQlibG9jayArPSBzYmktPnNfYmxvY2tfYmFzZTsKKwkJaWYgKCEoYmggPSBzYl9icmVhZChzYiwgYmxvY2spKSkgeworCQkJcHJpbnRrKCJzeXN2X25ld19ibG9jazogY2Fubm90IHJlYWQgZnJlZS1saXN0IGJsb2NrXG4iKTsKKwkJCS8qIHJldHJ5IHRoaXMgc2FtZSBibG9jayBuZXh0IHRpbWUgKi8KKwkJCSpzYmktPnNfYmNhY2hlX2NvdW50ID0gY3B1X3RvX2ZzMTYoc2JpLCAxKTsKKwkJCWdvdG8gRW5vc3BjOworCQl9CisJCWNvdW50ID0gZnMxNl90b19jcHUoc2JpLCAqKF9fZnMxNiopYmgtPmJfZGF0YSk7CisJCWlmIChjb3VudCA+IHNiaS0+c19mbGNfc2l6ZSkgeworCQkJcHJpbnRrKCJzeXN2X25ld19ibG9jazogZnJlZS1saXN0IGJsb2NrIHdpdGggPmZsY19zaXplIGVudHJpZXNcbiIpOworCQkJYnJlbHNlKGJoKTsKKwkJCWdvdG8gRW5vc3BjOworCQl9CisJCSpzYmktPnNfYmNhY2hlX2NvdW50ID0gY3B1X3RvX2ZzMTYoc2JpLCBjb3VudCk7CisJCW1lbWNweShzYmktPnNfYmNhY2hlLCBnZXRfY2h1bmsoc2IsIGJoKSwKKwkJCQljb3VudCAqIHNpemVvZihzeXN2X3pvbmVfdCkpOworCQlicmVsc2UoYmgpOworCX0KKwkvKiBOb3cgdGhlIGZyZWUgbGlzdCBoZWFkIGluIHRoZSBzdXBlcmJsb2NrIGlzIHZhbGlkIGFnYWluLiAqLworCWZzMzJfYWRkKHNiaSwgc2JpLT5zX2ZyZWVfYmxvY2tzLCAtMSk7CisJZGlydHlfc2Ioc2IpOworCXVubG9ja19zdXBlcihzYik7CisJcmV0dXJuIG5yOworCitFbm9zcGM6CisJdW5sb2NrX3N1cGVyKHNiKTsKKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgbG9uZyBzeXN2X2NvdW50X2ZyZWVfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQoreworCXN0cnVjdCBzeXN2X3NiX2luZm8gKiBzYmkgPSBTWVNWX1NCKHNiKTsKKwlpbnQgc2JfY291bnQ7CisJaW50IGNvdW50OworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoID0gTlVMTDsKKwlzeXN2X3pvbmVfdCAqYmxvY2tzOworCXVuc2lnbmVkIGJsb2NrOworCWludCBuOworCisJLyoKKwkgKiBUaGlzIGNvZGUgZG9lcyBub3Qgd29yayBhdCBhbGwgZm9yIEFGUyAoaXQgaGFzIGEgYml0bWFwCisJICogZnJlZSBsaXN0KS4gIEFzIEFGUyBpcyBzdXBwb3NlZCB0byBiZSByZWFkLW9ubHkgd2UganVzdAorCSAqIGxpZSBhbmQgc2F5IGl0IGhhcyBubyBmcmVlIGJsb2NrIGF0IGFsbC4KKwkgKi8KKwlpZiAoc2JpLT5zX3R5cGUgPT0gRlNUWVBFX0FGUykKKwkJcmV0dXJuIDA7CisKKwlsb2NrX3N1cGVyKHNiKTsKKwlzYl9jb3VudCA9IGZzMzJfdG9fY3B1KHNiaSwgKnNiaS0+c19mcmVlX2Jsb2Nrcyk7CisKKwlpZiAoMCkKKwkJZ290byB0cnVzdF9zYjsKKworCS8qIHRoaXMgY2F1c2VzIGEgbG90IG9mIGRpc2sgdHJhZmZpYyAuLi4gKi8KKwljb3VudCA9IDA7CisJbiA9IGZzMTZfdG9fY3B1KHNiaSwgKnNiaS0+c19iY2FjaGVfY291bnQpOworCWJsb2NrcyA9IHNiaS0+c19iY2FjaGU7CisJd2hpbGUgKDEpIHsKKwkJc3lzdl96b25lX3Qgem9uZTsKKwkJaWYgKG4gPiBzYmktPnNfZmxjX3NpemUpCisJCQlnb3RvIEUyYmlnOworCQl6b25lID0gMDsKKwkJd2hpbGUgKG4gJiYgKHpvbmUgPSBibG9ja3NbLS1uXSkgIT0gMCkKKwkJCWNvdW50Kys7CisJCWlmICh6b25lID09IDApCisJCQlicmVhazsKKworCQlibG9jayA9IGZzMzJfdG9fY3B1KHNiaSwgem9uZSk7CisJCWlmIChiaCkKKwkJCWJyZWxzZShiaCk7CisKKwkJaWYgKGJsb2NrIDwgc2JpLT5zX2ZpcnN0ZGF0YXpvbmUgfHwgYmxvY2sgPj0gc2JpLT5zX256b25lcykKKwkJCWdvdG8gRWludmFsOworCQlibG9jayArPSBzYmktPnNfYmxvY2tfYmFzZTsKKwkJYmggPSBzYl9icmVhZChzYiwgYmxvY2spOworCQlpZiAoIWJoKQorCQkJZ290byBFaW87CisJCW4gPSBmczE2X3RvX2NwdShzYmksICooX19mczE2KiliaC0+Yl9kYXRhKTsKKwkJYmxvY2tzID0gZ2V0X2NodW5rKHNiLCBiaCk7CisJfQorCWlmIChiaCkKKwkJYnJlbHNlKGJoKTsKKwlpZiAoY291bnQgIT0gc2JfY291bnQpCisJCWdvdG8gRWNvdW50OworZG9uZToKKwl1bmxvY2tfc3VwZXIoc2IpOworCXJldHVybiBjb3VudDsKKworRWludmFsOgorCXByaW50aygic3lzdl9jb3VudF9mcmVlX2Jsb2NrczogbmV3IGJsb2NrICVkIGlzIG5vdCBpbiBkYXRhIHpvbmVcbiIsCisJCWJsb2NrKTsKKwlnb3RvIHRydXN0X3NiOworRWlvOgorCXByaW50aygic3lzdl9jb3VudF9mcmVlX2Jsb2NrczogY2Fubm90IHJlYWQgZnJlZS1saXN0IGJsb2NrXG4iKTsKKwlnb3RvIHRydXN0X3NiOworRTJiaWc6CisJcHJpbnRrKCJzeXN2X2NvdW50X2ZyZWVfYmxvY2tzOiA+ZmxjX3NpemUgZW50cmllcyBpbiBmcmVlLWxpc3QgYmxvY2tcbiIpOworCWlmIChiaCkKKwkJYnJlbHNlKGJoKTsKK3RydXN0X3NiOgorCWNvdW50ID0gc2JfY291bnQ7CisJZ290byBkb25lOworRWNvdW50OgorCXByaW50aygic3lzdl9jb3VudF9mcmVlX2Jsb2NrczogZnJlZSBibG9jayBjb3VudCB3YXMgJWQsICIKKwkJImNvcnJlY3RpbmcgdG8gJWRcbiIsIHNiX2NvdW50LCBjb3VudCk7CisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCSpzYmktPnNfZnJlZV9ibG9ja3MgPSBjcHVfdG9fZnMzMihzYmksIGNvdW50KTsKKwkJZGlydHlfc2Ioc2IpOworCX0KKwlnb3RvIGRvbmU7Cit9CmRpZmYgLS1naXQgYS9mcy9zeXN2L2Rpci5jIGIvZnMvc3lzdi9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWEwODVhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3lzdi9kaXIuYwpAQCAtMCwwICsxLDM4OCBAQAorLyoKKyAqICBsaW51eC9mcy9zeXN2L2Rpci5jCisgKgorICogIG1pbml4L2Rpci5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBjb2gvZGlyLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTMgIFBhc2NhbCBIYWlibGUsIEJydW5vIEhhaWJsZQorICoKKyAqICBzeXN2L2Rpci5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkzICBCcnVubyBIYWlibGUKKyAqCisgKiAgU3lzdGVtVi9Db2hlcmVudCBkaXJlY3RvcnkgaGFuZGxpbmcgZnVuY3Rpb25zCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlICJzeXN2LmgiCisKK3N0YXRpYyBpbnQgc3lzdl9yZWFkZGlyKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzeXN2X2Rpcl9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBzeXN2X3JlYWRkaXIsCisJLmZzeW5jCQk9IHN5c3Zfc3luY19maWxlLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGRpcl9wdXRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlrdW5tYXAocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZGlyX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIChpbm9kZS0+aV9zaXplK1BBR0VfQ0FDSEVfU0laRS0xKT4+UEFHRV9DQUNIRV9TSElGVDsKK30KKworc3RhdGljIGludCBkaXJfY29tbWl0X2NodW5rKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IChzdHJ1Y3QgaW5vZGUgKilwYWdlLT5tYXBwaW5nLT5ob3N0OworCWludCBlcnIgPSAwOworCisJcGFnZS0+bWFwcGluZy0+YV9vcHMtPmNvbW1pdF93cml0ZShOVUxMLCBwYWdlLCBmcm9tLCB0byk7CisJaWYgKElTX0RJUlNZTkMoZGlyKSkKKwkJZXJyID0gd3JpdGVfb25lX3BhZ2UocGFnZSwgMSk7CisJZWxzZQorCQl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKiBkaXJfZ2V0X3BhZ2Uoc3RydWN0IGlub2RlICpkaXIsIHVuc2lnbmVkIGxvbmcgbikKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGRpci0+aV9tYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIG4sCisJCQkJKGZpbGxlcl90KiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOworCWlmICghSVNfRVJSKHBhZ2UpKSB7CisJCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7CisJCWttYXAocGFnZSk7CisJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKQorCQkJZ290byBmYWlsOworCX0KKwlyZXR1cm4gcGFnZTsKKworZmFpbDoKKwlkaXJfcHV0X3BhZ2UocGFnZSk7CisJcmV0dXJuIEVSUl9QVFIoLUVJTyk7Cit9CisKK3N0YXRpYyBpbnQgc3lzdl9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJdW5zaWduZWQgbG9uZyBwb3MgPSBmaWxwLT5mX3BvczsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXVuc2lnbmVkIG9mZnNldCA9IHBvcyAmIH5QQUdFX0NBQ0hFX01BU0s7CisJdW5zaWduZWQgbG9uZyBuID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBucGFnZXMgPSBkaXJfcGFnZXMoaW5vZGUpOworCisJbG9ja19rZXJuZWwoKTsKKworCXBvcyA9IChwb3MgKyBTWVNWX0RJUlNJWkUtMSkgJiB+KFNZU1ZfRElSU0laRS0xKTsKKwlpZiAocG9zID49IGlub2RlLT5pX3NpemUpCisJCWdvdG8gZG9uZTsKKworCWZvciAoIDsgbiA8IG5wYWdlczsgbisrLCBvZmZzZXQgPSAwKSB7CisJCWNoYXIgKmthZGRyLCAqbGltaXQ7CisJCXN0cnVjdCBzeXN2X2Rpcl9lbnRyeSAqZGU7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gZGlyX2dldF9wYWdlKGlub2RlLCBuKTsKKworCQlpZiAoSVNfRVJSKHBhZ2UpKQorCQkJY29udGludWU7CisJCWthZGRyID0gKGNoYXIgKilwYWdlX2FkZHJlc3MocGFnZSk7CisJCWRlID0gKHN0cnVjdCBzeXN2X2Rpcl9lbnRyeSAqKShrYWRkcitvZmZzZXQpOworCQlsaW1pdCA9IGthZGRyICsgUEFHRV9DQUNIRV9TSVpFIC0gU1lTVl9ESVJTSVpFOworCQlmb3IgKCA7KGNoYXIqKWRlIDw9IGxpbWl0OyBkZSsrKSB7CisJCQljaGFyICpuYW1lID0gZGUtPm5hbWU7CisJCQlpbnQgb3ZlcjsKKworCQkJaWYgKCFkZS0+aW5vZGUpCisJCQkJY29udGludWU7CisKKwkJCW9mZnNldCA9IChjaGFyICopZGUgLSBrYWRkcjsKKworCQkJb3ZlciA9IGZpbGxkaXIoZGlyZW50LCBuYW1lLCBzdHJubGVuKG5hbWUsU1lTVl9OQU1FTEVOKSwKKwkJCQkJKG48PFBBR0VfQ0FDSEVfU0hJRlQpIHwgb2Zmc2V0LAorCQkJCQlmczE2X3RvX2NwdShTWVNWX1NCKHNiKSwgZGUtPmlub2RlKSwKKwkJCQkJRFRfVU5LTk9XTik7CisJCQlpZiAob3ZlcikgeworCQkJCWRpcl9wdXRfcGFnZShwYWdlKTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCX0KKwkJZGlyX3B1dF9wYWdlKHBhZ2UpOworCX0KKworZG9uZToKKwlmaWxwLT5mX3BvcyA9IChuIDw8IFBBR0VfQ0FDSEVfU0hJRlQpIHwgb2Zmc2V0OworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworLyogY29tcGFyZSBzdHJpbmdzOiBuYW1lWzAuLmxlbi0xXSAobm90IHplcm8tdGVybWluYXRlZCkgYW5kCisgKiBidWZmZXJbMC4uXSAoZmlsbGVkIHdpdGggemVyb2VzIHVwIHRvIGJ1ZmZlclswLi5tYXhsZW4tMV0pCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG5hbWVjb21wYXJlKGludCBsZW4sIGludCBtYXhsZW4sCisJY29uc3QgY2hhciAqIG5hbWUsIGNvbnN0IGNoYXIgKiBidWZmZXIpCit7CisJaWYgKGxlbiA8IG1heGxlbiAmJiBidWZmZXJbbGVuXSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuICFtZW1jbXAobmFtZSwgYnVmZmVyLCBsZW4pOworfQorCisvKgorICoJc3lzdl9maW5kX2VudHJ5KCkKKyAqCisgKiBmaW5kcyBhbiBlbnRyeSBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB3aXRoIHRoZSB3YW50ZWQgbmFtZS4gSXQKKyAqIHJldHVybnMgdGhlIGNhY2hlIGJ1ZmZlciBpbiB3aGljaCB0aGUgZW50cnkgd2FzIGZvdW5kLCBhbmQgdGhlIGVudHJ5CisgKiBpdHNlbGYgKGFzIGEgcGFyYW1ldGVyIC0gcmVzX2RpcikuIEl0IGRvZXMgTk9UIHJlYWQgdGhlIGlub2RlIG9mIHRoZQorICogZW50cnkgLSB5b3UnbGwgaGF2ZSB0byBkbyB0aGF0IHlvdXJzZWxmIGlmIHlvdSB3YW50IHRvLgorICovCitzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkgKnN5c3ZfZmluZF9lbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYWdlICoqcmVzX3BhZ2UpCit7CisJY29uc3QgY2hhciAqIG5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludCBuYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXN0cnVjdCBpbm9kZSAqIGRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgbjsKKwl1bnNpZ25lZCBsb25nIG5wYWdlcyA9IGRpcl9wYWdlcyhkaXIpOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwlzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkgKmRlOworCisJKnJlc19wYWdlID0gTlVMTDsKKworCXN0YXJ0ID0gU1lTVl9JKGRpciktPmlfZGlyX3N0YXJ0X2xvb2t1cDsKKwlpZiAoc3RhcnQgPj0gbnBhZ2VzKQorCQlzdGFydCA9IDA7CisJbiA9IHN0YXJ0OworCisJZG8geworCQljaGFyICprYWRkcjsKKwkJcGFnZSA9IGRpcl9nZXRfcGFnZShkaXIsIG4pOworCQlpZiAoIUlTX0VSUihwYWdlKSkgeworCQkJa2FkZHIgPSAoY2hhciopcGFnZV9hZGRyZXNzKHBhZ2UpOworCQkJZGUgPSAoc3RydWN0IHN5c3ZfZGlyX2VudHJ5ICopIGthZGRyOworCQkJa2FkZHIgKz0gUEFHRV9DQUNIRV9TSVpFIC0gU1lTVl9ESVJTSVpFOworCQkJZm9yICggOyAoY2hhciAqKSBkZSA8PSBrYWRkciA7IGRlKyspIHsKKwkJCQlpZiAoIWRlLT5pbm9kZSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKG5hbWVjb21wYXJlKG5hbWVsZW4sIFNZU1ZfTkFNRUxFTiwKKwkJCQkJCQluYW1lLCBkZS0+bmFtZSkpCisJCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCX0KKwkJZGlyX3B1dF9wYWdlKHBhZ2UpOworCisJCWlmICgrK24gPj0gbnBhZ2VzKQorCQkJbiA9IDA7CisJfSB3aGlsZSAobiAhPSBzdGFydCk7CisKKwlyZXR1cm4gTlVMTDsKKworZm91bmQ6CisJU1lTVl9JKGRpciktPmlfZGlyX3N0YXJ0X2xvb2t1cCA9IG47CisJKnJlc19wYWdlID0gcGFnZTsKKwlyZXR1cm4gZGU7Cit9CisKK2ludCBzeXN2X2FkZF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJY29uc3QgY2hhciAqIG5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludCBuYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwlzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkgKiBkZTsKKwl1bnNpZ25lZCBsb25nIG5wYWdlcyA9IGRpcl9wYWdlcyhkaXIpOworCXVuc2lnbmVkIGxvbmcgbjsKKwljaGFyICprYWRkcjsKKwl1bnNpZ25lZCBmcm9tLCB0bzsKKwlpbnQgZXJyOworCisJLyogV2UgdGFrZSBjYXJlIG9mIGRpcmVjdG9yeSBleHBhbnNpb24gaW4gdGhlIHNhbWUgbG9vcCAqLworCWZvciAobiA9IDA7IG4gPD0gbnBhZ2VzOyBuKyspIHsKKwkJcGFnZSA9IGRpcl9nZXRfcGFnZShkaXIsIG4pOworCQllcnIgPSBQVFJfRVJSKHBhZ2UpOworCQlpZiAoSVNfRVJSKHBhZ2UpKQorCQkJZ290byBvdXQ7CisJCWthZGRyID0gKGNoYXIqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJZGUgPSAoc3RydWN0IHN5c3ZfZGlyX2VudHJ5ICopa2FkZHI7CisJCWthZGRyICs9IFBBR0VfQ0FDSEVfU0laRSAtIFNZU1ZfRElSU0laRTsKKwkJd2hpbGUgKChjaGFyICopZGUgPD0ga2FkZHIpIHsKKwkJCWlmICghZGUtPmlub2RlKQorCQkJCWdvdG8gZ290X2l0OworCQkJZXJyID0gLUVFWElTVDsKKwkJCWlmIChuYW1lY29tcGFyZShuYW1lbGVuLCBTWVNWX05BTUVMRU4sIG5hbWUsIGRlLT5uYW1lKSkgCisJCQkJZ290byBvdXRfcGFnZTsKKwkJCWRlKys7CisJCX0KKwkJZGlyX3B1dF9wYWdlKHBhZ2UpOworCX0KKwlCVUcoKTsKKwlyZXR1cm4gLUVJTlZBTDsKKworZ290X2l0OgorCWZyb20gPSAoY2hhciopZGUgLSAoY2hhciopcGFnZV9hZGRyZXNzKHBhZ2UpOworCXRvID0gZnJvbSArIFNZU1ZfRElSU0laRTsKKwlsb2NrX3BhZ2UocGFnZSk7CisJZXJyID0gcGFnZS0+bWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgcGFnZSwgZnJvbSwgdG8pOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VubG9jazsKKwltZW1jcHkgKGRlLT5uYW1lLCBuYW1lLCBuYW1lbGVuKTsKKwltZW1zZXQgKGRlLT5uYW1lICsgbmFtZWxlbiwgMCwgU1lTVl9ESVJTSVpFIC0gbmFtZWxlbiAtIDIpOworCWRlLT5pbm9kZSA9IGNwdV90b19mczE2KFNZU1ZfU0IoaW5vZGUtPmlfc2IpLCBpbm9kZS0+aV9pbm8pOworCWVyciA9IGRpcl9jb21taXRfY2h1bmsocGFnZSwgZnJvbSwgdG8pOworCWRpci0+aV9tdGltZSA9IGRpci0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworb3V0X3BhZ2U6CisJZGlyX3B1dF9wYWdlKHBhZ2UpOworb3V0OgorCXJldHVybiBlcnI7CitvdXRfdW5sb2NrOgorCXVubG9ja19wYWdlKHBhZ2UpOworCWdvdG8gb3V0X3BhZ2U7Cit9CisKK2ludCBzeXN2X2RlbGV0ZV9lbnRyeShzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkgKmRlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2UtPm1hcHBpbmc7CisJc3RydWN0IGlub2RlICppbm9kZSA9IChzdHJ1Y3QgaW5vZGUqKW1hcHBpbmctPmhvc3Q7CisJY2hhciAqa2FkZHIgPSAoY2hhciopcGFnZV9hZGRyZXNzKHBhZ2UpOworCXVuc2lnbmVkIGZyb20gPSAoY2hhciopZGUgLSBrYWRkcjsKKwl1bnNpZ25lZCB0byA9IGZyb20gKyBTWVNWX0RJUlNJWkU7CisJaW50IGVycjsKKworCWxvY2tfcGFnZShwYWdlKTsKKwllcnIgPSBtYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCBmcm9tLCB0byk7CisJaWYgKGVycikKKwkJQlVHKCk7CisJZGUtPmlub2RlID0gMDsKKwllcnIgPSBkaXJfY29tbWl0X2NodW5rKHBhZ2UsIGZyb20sIHRvKTsKKwlkaXJfcHV0X3BhZ2UocGFnZSk7CisJaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJcmV0dXJuIGVycjsKK30KKworaW50IHN5c3ZfbWFrZV9lbXB0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpcikKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UobWFwcGluZywgMCk7CisJc3RydWN0IHN5c3ZfZGlyX2VudHJ5ICogZGU7CisJY2hhciAqYmFzZTsKKwlpbnQgZXJyOworCisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlrbWFwKHBhZ2UpOworCWVyciA9IG1hcHBpbmctPmFfb3BzLT5wcmVwYXJlX3dyaXRlKE5VTEwsIHBhZ2UsIDAsIDIgKiBTWVNWX0RJUlNJWkUpOworCWlmIChlcnIpIHsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwliYXNlID0gKGNoYXIqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwltZW1zZXQoYmFzZSwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKKworCWRlID0gKHN0cnVjdCBzeXN2X2Rpcl9lbnRyeSAqKSBiYXNlOworCWRlLT5pbm9kZSA9IGNwdV90b19mczE2KFNZU1ZfU0IoaW5vZGUtPmlfc2IpLCBpbm9kZS0+aV9pbm8pOworCXN0cmNweShkZS0+bmFtZSwiLiIpOworCWRlKys7CisJZGUtPmlub2RlID0gY3B1X3RvX2ZzMTYoU1lTVl9TQihpbm9kZS0+aV9zYiksIGRpci0+aV9pbm8pOworCXN0cmNweShkZS0+bmFtZSwiLi4iKTsKKworCWVyciA9IGRpcl9jb21taXRfY2h1bmsocGFnZSwgMCwgMiAqIFNZU1ZfRElSU0laRSk7CitmYWlsOgorCWt1bm1hcChwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIHJvdXRpbmUgdG8gY2hlY2sgdGhhdCB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBpcyBlbXB0eSAoZm9yIHJtZGlyKQorICovCitpbnQgc3lzdl9lbXB0eV9kaXIoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGksIG5wYWdlcyA9IGRpcl9wYWdlcyhpbm9kZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyspIHsKKwkJY2hhciAqa2FkZHI7CisJCXN0cnVjdCBzeXN2X2Rpcl9lbnRyeSAqIGRlOworCQlwYWdlID0gZGlyX2dldF9wYWdlKGlub2RlLCBpKTsKKworCQlpZiAoSVNfRVJSKHBhZ2UpKQorCQkJY29udGludWU7CisKKwkJa2FkZHIgPSAoY2hhciAqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJZGUgPSAoc3RydWN0IHN5c3ZfZGlyX2VudHJ5ICopa2FkZHI7CisJCWthZGRyICs9IFBBR0VfQ0FDSEVfU0laRS1TWVNWX0RJUlNJWkU7CisKKwkJZm9yICggOyhjaGFyICopZGUgPD0ga2FkZHI7IGRlKyspIHsKKwkJCWlmICghZGUtPmlub2RlKQorCQkJCWNvbnRpbnVlOworCQkJLyogY2hlY2sgZm9yIC4gYW5kIC4uICovCisJCQlpZiAoZGUtPm5hbWVbMF0gIT0gJy4nKQorCQkJCWdvdG8gbm90X2VtcHR5OworCQkJaWYgKCFkZS0+bmFtZVsxXSkgeworCQkJCWlmIChkZS0+aW5vZGUgPT0gY3B1X3RvX2ZzMTYoU1lTVl9TQihzYiksCisJCQkJCQkJaW5vZGUtPmlfaW5vKSkKKwkJCQkJY29udGludWU7CisJCQkJZ290byBub3RfZW1wdHk7CisJCQl9CisJCQlpZiAoZGUtPm5hbWVbMV0gIT0gJy4nIHx8IGRlLT5uYW1lWzJdKQorCQkJCWdvdG8gbm90X2VtcHR5OworCQl9CisJCWRpcl9wdXRfcGFnZShwYWdlKTsKKwl9CisJcmV0dXJuIDE7CisKK25vdF9lbXB0eToKKwlkaXJfcHV0X3BhZ2UocGFnZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJlbGVhc2VzIHRoZSBwYWdlICovCit2b2lkIHN5c3Zfc2V0X2xpbmsoc3RydWN0IHN5c3ZfZGlyX2VudHJ5ICpkZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IChzdHJ1Y3QgaW5vZGUqKXBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJdW5zaWduZWQgZnJvbSA9IChjaGFyICopZGUtKGNoYXIqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwl1bnNpZ25lZCB0byA9IGZyb20gKyBTWVNWX0RJUlNJWkU7CisJaW50IGVycjsKKworCWxvY2tfcGFnZShwYWdlKTsKKwllcnIgPSBwYWdlLT5tYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCBmcm9tLCB0byk7CisJaWYgKGVycikKKwkJQlVHKCk7CisJZGUtPmlub2RlID0gY3B1X3RvX2ZzMTYoU1lTVl9TQihpbm9kZS0+aV9zYiksIGlub2RlLT5pX2lubyk7CisJZXJyID0gZGlyX2NvbW1pdF9jaHVuayhwYWdlLCBmcm9tLCB0byk7CisJZGlyX3B1dF9wYWdlKHBhZ2UpOworCWRpci0+aV9tdGltZSA9IGRpci0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworfQorCitzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkgKiBzeXN2X2RvdGRvdCAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBwYWdlICoqcCkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGRpcl9nZXRfcGFnZShkaXIsIDApOworCXN0cnVjdCBzeXN2X2Rpcl9lbnRyeSAqZGUgPSBOVUxMOworCisJaWYgKCFJU19FUlIocGFnZSkpIHsKKwkJZGUgPSAoc3RydWN0IHN5c3ZfZGlyX2VudHJ5KikgcGFnZV9hZGRyZXNzKHBhZ2UpICsgMTsKKwkJKnAgPSBwYWdlOworCX0KKwlyZXR1cm4gZGU7Cit9CisKK2lub190IHN5c3ZfaW5vZGVfYnlfbmFtZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IHN5c3ZfZGlyX2VudHJ5ICpkZSA9IHN5c3ZfZmluZF9lbnRyeSAoZGVudHJ5LCAmcGFnZSk7CisJaW5vX3QgcmVzID0gMDsKKwkKKwlpZiAoZGUpIHsKKwkJcmVzID0gZnMxNl90b19jcHUoU1lTVl9TQihkZW50cnktPmRfc2IpLCBkZS0+aW5vZGUpOworCQlkaXJfcHV0X3BhZ2UocGFnZSk7CisJfQorCXJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9mcy9zeXN2L2ZpbGUuYyBiL2ZzL3N5c3YvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNjlhYmMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zeXN2L2ZpbGUuYwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogIGxpbnV4L2ZzL3N5c3YvZmlsZS5jCisgKgorICogIG1pbml4L2ZpbGUuYworICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgY29oL2ZpbGUuYworICogIENvcHlyaWdodCAoQykgMTk5MyAgUGFzY2FsIEhhaWJsZSwgQnJ1bm8gSGFpYmxlCisgKgorICogIHN5c3YvZmlsZS5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkzICBCcnVubyBIYWlibGUKKyAqCisgKiAgU3lzdGVtVi9Db2hlcmVudCByZWd1bGFyIGZpbGUgaGFuZGxpbmcgcHJpbWl0aXZlcworICovCisKKyNpbmNsdWRlICJzeXN2LmgiCisKKy8qCisgKiBXZSBoYXZlIG1vc3RseSBOVUxMcyBoZXJlOiB0aGUgY3VycmVudCBkZWZhdWx0cyBhcmUgT0sgZm9yCisgKiB0aGUgY29oIGZpbGVzeXN0ZW0uCisgKi8KK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3lzdl9maWxlX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfZmlsZV9yZWFkLAorCS53cml0ZQkJPSBnZW5lcmljX2ZpbGVfd3JpdGUsCisJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCisJLmZzeW5jCQk9IHN5c3Zfc3luY19maWxlLAorCS5zZW5kZmlsZQk9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHN5c3ZfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0geworCS50cnVuY2F0ZQk9IHN5c3ZfdHJ1bmNhdGUsCisJLmdldGF0dHIJPSBzeXN2X2dldGF0dHIsCit9OworCitpbnQgc3lzdl9zeW5jX2ZpbGUoc3RydWN0IGZpbGUgKiBmaWxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBkYXRhc3luYykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnI7CisKKwllcnIgPSBzeW5jX21hcHBpbmdfYnVmZmVycyhpbm9kZS0+aV9tYXBwaW5nKTsKKwlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFkpKQorCQlyZXR1cm4gZXJyOworCWlmIChkYXRhc3luYyAmJiAhKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWV9EQVRBU1lOQykpCisJCXJldHVybiBlcnI7CisJCisJZXJyIHw9IHN5c3Zfc3luY19pbm9kZShpbm9kZSk7CisJcmV0dXJuIGVyciA/IC1FSU8gOiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvc3lzdi9pYWxsb2MuYyBiL2ZzL3N5c3YvaWFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1ODVkMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3N5c3YvaWFsbG9jLmMKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiAgbGludXgvZnMvc3lzdi9pYWxsb2MuYworICoKKyAqICBtaW5peC9iaXRtYXAuYworICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgZXh0L2ZyZWVsaXN0cy5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyICBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKgorICogIHhlbml4L2FsbG9jLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTIgIERvdWcgRXZhbnMKKyAqCisgKiAgY29oL2FsbG9jLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTMgIFBhc2NhbCBIYWlibGUsIEJydW5vIEhhaWJsZQorICoKKyAqICBzeXN2L2lhbGxvYy5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkzICBCcnVubyBIYWlibGUKKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgZm9yIGFsbG9jYXRpbmcvZnJlZWluZyBpbm9kZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSAic3lzdi5oIgorCisvKiBXZSBkb24ndCB0cnVzdCB0aGUgdmFsdWUgb2YKKyAgIHNiLT5zdl9zYmQyLT5zX3Rpbm9kZSA9ICpzYi0+c3Zfc2JfdG90YWxfZnJlZV9pbm9kZXMKKyAgIGJ1dCB3ZSBuZXZlcnRoZWxlc3Mga2VlcCBpdCB1cCB0byBkYXRlLiAqLworCisvKiBBbiBpbm9kZSBvbiBkaXNrIGlzIGNvbnNpZGVyZWQgZnJlZSBpZiBib3RoIGlfbW9kZSA9PSAwIGFuZCBpX25saW5rID09IDAuICovCisKKy8qIHJldHVybiAmc2ItPnN2X3NiX2ZpY19pbm9kZXNbaV0gPSAmc2JkLT5zX2lub2RlW2ldOyAqLworc3RhdGljIGlubGluZSBzeXN2X2lub190ICoKK3N2X3NiX2ZpY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgdW5zaWduZWQgaW50IGkpCit7CisJc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpID0gU1lTVl9TQihzYik7CisKKwlpZiAoc2JpLT5zX2JoMSA9PSBzYmktPnNfYmgyKQorCQlyZXR1cm4gJnNiaS0+c19zYl9maWNfaW5vZGVzW2ldOworCWVsc2UgeworCQkvKiA1MTIgYnl0ZSBYZW5peCBGUyAqLworCQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHhlbml4X3N1cGVyX2Jsb2NrLCBzX2lub2RlW2ldKTsKKwkJaWYgKG9mZnNldCA8IDUxMikKKwkJCXJldHVybiAoc3lzdl9pbm9fdCopKHNiaS0+c19zYmQxICsgb2Zmc2V0KTsKKwkJZWxzZQorCQkJcmV0dXJuIChzeXN2X2lub190Kikoc2JpLT5zX3NiZDIgKyBvZmZzZXQpOworCX0KK30KKworc3RydWN0IHN5c3ZfaW5vZGUgKgorc3lzdl9yYXdfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW5vLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCkKK3sKKwlzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmkgPSBTWVNWX1NCKHNiKTsKKwlzdHJ1Y3Qgc3lzdl9pbm9kZSAqcmVzOworCWludCBibG9jayA9IHNiaS0+c19maXJzdGlub2Rlem9uZSArIHNiaS0+c19ibG9ja19iYXNlOworCisJYmxvY2sgKz0gKGluby0xKSA+PiBzYmktPnNfaW5vZGVzX3Blcl9ibG9ja19iaXRzOworCSpiaCA9IHNiX2JyZWFkKHNiLCBibG9jayk7CisJaWYgKCEqYmgpCisJCXJldHVybiBOVUxMOworCXJlcyA9IChzdHJ1Y3Qgc3lzdl9pbm9kZSAqKSgqYmgpLT5iX2RhdGE7CisJcmV0dXJuIHJlcyArICgoaW5vLTEpICYgc2JpLT5zX2lub2Rlc19wZXJfYmxvY2tfMSk7Cit9CisKK3N0YXRpYyBpbnQgcmVmaWxsX2ZyZWVfY2FjaGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmkgPSBTWVNWX1NCKHNiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3Qgc3lzdl9pbm9kZSAqIHJhd19pbm9kZTsKKwlpbnQgaSA9IDAsIGlubzsKKworCWlubyA9IFNZU1ZfUk9PVF9JTk8rMTsKKwlyYXdfaW5vZGUgPSBzeXN2X3Jhd19pbm9kZShzYiwgaW5vLCAmYmgpOworCWlmICghcmF3X2lub2RlKQorCQlnb3RvIG91dDsKKwl3aGlsZSAoaW5vIDw9IHNiaS0+c19uaW5vZGVzKSB7CisJCWlmIChyYXdfaW5vZGUtPmlfbW9kZSA9PSAwICYmIHJhd19pbm9kZS0+aV9ubGluayA9PSAwKSB7CisJCQkqc3Zfc2JfZmljX2lub2RlKHNiLGkrKykgPSBjcHVfdG9fZnMxNihTWVNWX1NCKHNiKSwgaW5vKTsKKwkJCWlmIChpID09IHNiaS0+c19maWNfc2l6ZSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoKGlubysrICYgc2JpLT5zX2lub2Rlc19wZXJfYmxvY2tfMSkgPT0gMCkgeworCQkJYnJlbHNlKGJoKTsKKwkJCXJhd19pbm9kZSA9IHN5c3ZfcmF3X2lub2RlKHNiLCBpbm8sICZiaCk7CisJCQlpZiAoIXJhd19pbm9kZSkKKwkJCQlnb3RvIG91dDsKKwkJfSBlbHNlCisJCQlyYXdfaW5vZGUrKzsKKwl9CisJYnJlbHNlKGJoKTsKK291dDoKKwlyZXR1cm4gaTsKK30KKwordm9pZCBzeXN2X2ZyZWVfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSA9IFNZU1ZfU0Ioc2IpOworCXVuc2lnbmVkIGludCBpbm87CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IHN5c3ZfaW5vZGUgKiByYXdfaW5vZGU7CisJdW5zaWduZWQgY291bnQ7CisKKwlzYiA9IGlub2RlLT5pX3NiOworCWlubyA9IGlub2RlLT5pX2lubzsKKwlpZiAoaW5vIDw9IFNZU1ZfUk9PVF9JTk8gfHwgaW5vID4gc2JpLT5zX25pbm9kZXMpIHsKKwkJcHJpbnRrKCJzeXN2X2ZyZWVfaW5vZGU6IGlub2RlIDAsMSwyIG9yIG5vbmV4aXN0ZW50IGlub2RlXG4iKTsKKwkJcmV0dXJuOworCX0KKwlyYXdfaW5vZGUgPSBzeXN2X3Jhd19pbm9kZShzYiwgaW5vLCAmYmgpOworCWNsZWFyX2lub2RlKGlub2RlKTsKKwlpZiAoIXJhd19pbm9kZSkgeworCQlwcmludGsoInN5c3ZfZnJlZV9pbm9kZTogdW5hYmxlIHRvIHJlYWQgaW5vZGUgYmxvY2sgb24gZGV2aWNlICIKKwkJICAgICAgICIlc1xuIiwgaW5vZGUtPmlfc2ItPnNfaWQpOworCQlyZXR1cm47CisJfQorCWxvY2tfc3VwZXIoc2IpOworCWNvdW50ID0gZnMxNl90b19jcHUoc2JpLCAqc2JpLT5zX3NiX2ZpY19jb3VudCk7CisJaWYgKGNvdW50IDwgc2JpLT5zX2ZpY19zaXplKSB7CisJCSpzdl9zYl9maWNfaW5vZGUoc2IsY291bnQrKykgPSBjcHVfdG9fZnMxNihzYmksIGlubyk7CisJCSpzYmktPnNfc2JfZmljX2NvdW50ID0gY3B1X3RvX2ZzMTYoc2JpLCBjb3VudCk7CisJfQorCWZzMTZfYWRkKHNiaSwgc2JpLT5zX3NiX3RvdGFsX2ZyZWVfaW5vZGVzLCAxKTsKKwlkaXJ0eV9zYihzYik7CisJbWVtc2V0KHJhd19pbm9kZSwgMCwgc2l6ZW9mKHN0cnVjdCBzeXN2X2lub2RlKSk7CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCXVubG9ja19zdXBlcihzYik7CisJYnJlbHNlKGJoKTsKK30KKworc3RydWN0IGlub2RlICogc3lzdl9uZXdfaW5vZGUoY29uc3Qgc3RydWN0IGlub2RlICogZGlyLCBtb2RlX3QgbW9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSA9IFNZU1ZfU0Ioc2IpOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3lzdl9pbm9fdCBpbm87CisJdW5zaWduZWQgY291bnQ7CisKKwlpbm9kZSA9IG5ld19pbm9kZShzYik7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlsb2NrX3N1cGVyKHNiKTsKKwljb3VudCA9IGZzMTZfdG9fY3B1KHNiaSwgKnNiaS0+c19zYl9maWNfY291bnQpOworCWlmIChjb3VudCA9PSAwIHx8ICgqc3Zfc2JfZmljX2lub2RlKHNiLGNvdW50LTEpID09IDApKSB7CisJCWNvdW50ID0gcmVmaWxsX2ZyZWVfY2FjaGUoc2IpOworCQlpZiAoY291bnQgPT0gMCkgeworCQkJaXB1dChpbm9kZSk7CisJCQl1bmxvY2tfc3VwZXIoc2IpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7CisJCX0KKwl9CisJLyogTm93IGNvdW50ID4gMC4gKi8KKwlpbm8gPSAqc3Zfc2JfZmljX2lub2RlKHNiLC0tY291bnQpOworCSpzYmktPnNfc2JfZmljX2NvdW50ID0gY3B1X3RvX2ZzMTYoc2JpLCBjb3VudCk7CisJZnMxNl9hZGQoc2JpLCBzYmktPnNfc2JfdG90YWxfZnJlZV9pbm9kZXMsIC0xKTsKKwlkaXJ0eV9zYihzYik7CisJCisJaWYgKGRpci0+aV9tb2RlICYgU19JU0dJRCkgeworCQlpbm9kZS0+aV9naWQgPSBkaXItPmlfZ2lkOworCQlpZiAoU19JU0RJUihtb2RlKSkKKwkJCW1vZGUgfD0gU19JU0dJRDsKKwl9IGVsc2UKKwkJaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisKKwlpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlpbm9kZS0+aV9pbm8gPSBmczE2X3RvX2NwdShzYmksIGlubyk7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpbm9kZS0+aV9ibG9ja3MgPSBpbm9kZS0+aV9ibGtzaXplID0gMDsKKwltZW1zZXQoU1lTVl9JKGlub2RlKS0+aV9kYXRhLCAwLCBzaXplb2YoU1lTVl9JKGlub2RlKS0+aV9kYXRhKSk7CisJU1lTVl9JKGlub2RlKS0+aV9kaXJfc3RhcnRfbG9va3VwID0gMDsKKwlpbnNlcnRfaW5vZGVfaGFzaChpbm9kZSk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisKKwlpbm9kZS0+aV9tb2RlID0gbW9kZTsJCS8qIGZvciBzeXN2X3dyaXRlX2lub2RlKCkgKi8KKwlzeXN2X3dyaXRlX2lub2RlKGlub2RlLCAwKTsJLyogZW5zdXJlIGlub2RlIG5vdCBhbGxvY2F0ZWQgYWdhaW4gKi8KKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsJLyogY2xlYXJlZCBieSBzeXN2X3dyaXRlX2lub2RlKCkgKi8KKwkvKiBUaGF0J3MgaXQuICovCisJdW5sb2NrX3N1cGVyKHNiKTsKKwlyZXR1cm4gaW5vZGU7Cit9CisKK3Vuc2lnbmVkIGxvbmcgc3lzdl9jb3VudF9mcmVlX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKK3sKKwlzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmkgPSBTWVNWX1NCKHNiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3Qgc3lzdl9pbm9kZSAqIHJhd19pbm9kZTsKKwlpbnQgaW5vLCBjb3VudCwgc2JfY291bnQ7CisKKwlsb2NrX3N1cGVyKHNiKTsKKworCXNiX2NvdW50ID0gZnMxNl90b19jcHUoc2JpLCAqc2JpLT5zX3NiX3RvdGFsX2ZyZWVfaW5vZGVzKTsKKworCWlmICgwKQorCQlnb3RvIHRydXN0X3NiOworCisJLyogdGhpcyBjYXVzZXMgYSBsb3Qgb2YgZGlzayB0cmFmZmljIC4uLiAqLworCWNvdW50ID0gMDsKKwlpbm8gPSBTWVNWX1JPT1RfSU5PKzE7CisJcmF3X2lub2RlID0gc3lzdl9yYXdfaW5vZGUoc2IsIGlubywgJmJoKTsKKwlpZiAoIXJhd19pbm9kZSkKKwkJZ290byBFaW87CisJd2hpbGUgKGlubyA8PSBzYmktPnNfbmlub2RlcykgeworCQlpZiAocmF3X2lub2RlLT5pX21vZGUgPT0gMCAmJiByYXdfaW5vZGUtPmlfbmxpbmsgPT0gMCkKKwkJCWNvdW50Kys7CisJCWlmICgoaW5vKysgJiBzYmktPnNfaW5vZGVzX3Blcl9ibG9ja18xKSA9PSAwKSB7CisJCQlicmVsc2UoYmgpOworCQkJcmF3X2lub2RlID0gc3lzdl9yYXdfaW5vZGUoc2IsIGlubywgJmJoKTsKKwkJCWlmICghcmF3X2lub2RlKQorCQkJCWdvdG8gRWlvOworCQl9IGVsc2UKKwkJCXJhd19pbm9kZSsrOworCX0KKwlicmVsc2UoYmgpOworCWlmIChjb3VudCAhPSBzYl9jb3VudCkKKwkJZ290byBFaW52YWw7CitvdXQ6CisJdW5sb2NrX3N1cGVyKHNiKTsKKwlyZXR1cm4gY291bnQ7CisKK0VpbnZhbDoKKwlwcmludGsoInN5c3ZfY291bnRfZnJlZV9pbm9kZXM6ICIKKwkJImZyZWUgaW5vZGUgY291bnQgd2FzICVkLCBjb3JyZWN0aW5nIHRvICVkXG4iLAorCQlzYl9jb3VudCwgY291bnQpOworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkqc2JpLT5zX3NiX3RvdGFsX2ZyZWVfaW5vZGVzID0gY3B1X3RvX2ZzMTYoU1lTVl9TQihzYiksIGNvdW50KTsKKwkJZGlydHlfc2Ioc2IpOworCX0KKwlnb3RvIG91dDsKKworRWlvOgorCXByaW50aygic3lzdl9jb3VudF9mcmVlX2lub2RlczogdW5hYmxlIHRvIHJlYWQgaW5vZGUgdGFibGVcbiIpOwordHJ1c3Rfc2I6CisJY291bnQgPSBzYl9jb3VudDsKKwlnb3RvIG91dDsKK30KZGlmZiAtLWdpdCBhL2ZzL3N5c3YvaW5vZGUuYyBiL2ZzL3N5c3YvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTMwMDc3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvc3lzdi9pbm9kZS5jCkBAIC0wLDAgKzEsMzU0IEBACisvKgorICogIGxpbnV4L2ZzL3N5c3YvaW5vZGUuYworICoKKyAqICBtaW5peC9pbm9kZS5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICB4ZW5peC9pbm9kZS5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyICBEb3VnIEV2YW5zCisgKgorICogIGNvaC9pbm9kZS5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkzICBQYXNjYWwgSGFpYmxlLCBCcnVubyBIYWlibGUKKyAqCisgKiAgc3lzdi9pbm9kZS5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkzICBQYXVsIEIuIE1vbmRheQorICoKKyAqICBzeXN2L2lub2RlLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTMgIEJydW5vIEhhaWJsZQorICogIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCAgS3J6eXN6dG9mIEcuIEJhcmFub3dza2kKKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgZm9yIGFsbG9jYXRpbmcvZnJlZWluZyBpbm9kZXMgYW5kIGZvciByZWFkL3dyaXRpbmcKKyAqICB0aGUgc3VwZXJibG9jay4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdodWlkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlICJzeXN2LmgiCisKKy8qIFRoaXMgaXMgb25seSBjYWxsZWQgb24gc3luYygpIGFuZCB1bW91bnQoKSwgd2hlbiBzX2RpcnQ9MS4gKi8KK3N0YXRpYyB2b2lkIHN5c3Zfd3JpdGVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmkgPSBTWVNWX1NCKHNiKTsKKwl1bnNpZ25lZCBsb25nIHRpbWUgPSBnZXRfc2Vjb25kcygpLCBvbGRfdGltZTsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlnb3RvIGNsZWFuOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgb3V0IHRoZSBzdXBlciBibG9jaywKKwkgKiB0aGVuIGF0dGFjaCBjdXJyZW50IHRpbWUgc3RhbXAuCisJICogQnV0IGlmIHRoZSBmaWxlc3lzdGVtIHdhcyBtYXJrZWQgY2xlYW4sIGtlZXAgaXQgY2xlYW4uCisJICovCisJb2xkX3RpbWUgPSBmczMyX3RvX2NwdShzYmksICpzYmktPnNfc2JfdGltZSk7CisJaWYgKHNiaS0+c190eXBlID09IEZTVFlQRV9TWVNWNCkgeworCQlpZiAoKnNiaS0+c19zYl9zdGF0ZSA9PSBjcHVfdG9fZnMzMihzYmksIDB4N2MyNjlkMzggLSBvbGRfdGltZSkpCisJCQkqc2JpLT5zX3NiX3N0YXRlID0gY3B1X3RvX2ZzMzIoc2JpLCAweDdjMjY5ZDM4IC0gdGltZSk7CisJCSpzYmktPnNfc2JfdGltZSA9IGNwdV90b19mczMyKHNiaSwgdGltZSk7CisJCW1hcmtfYnVmZmVyX2RpcnR5KHNiaS0+c19iaDIpOworCX0KK2NsZWFuOgorCXNiLT5zX2RpcnQgPSAwOworCXVubG9ja19rZXJuZWwoKTsKK30KKworc3RhdGljIGludCBzeXN2X3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmkgPSBTWVNWX1NCKHNiKTsKKwlpZiAoc2JpLT5zX2ZvcmNlZF9ybykKKwkJKmZsYWdzIHw9IE1TX1JET05MWTsKKwlpZiAoISgqZmxhZ3MgJiBNU19SRE9OTFkpKQorCQlzYi0+c19kaXJ0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3lzdl9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmkgPSBTWVNWX1NCKHNiKTsKKworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkvKiBYWFggZXh0MiBhbHNvIHVwZGF0ZXMgdGhlIHN0YXRlIGhlcmUgKi8KKwkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX2JoMSk7CisJCWlmIChzYmktPnNfYmgxICE9IHNiaS0+c19iaDIpCisJCQltYXJrX2J1ZmZlcl9kaXJ0eShzYmktPnNfYmgyKTsKKwl9CisKKwlicmVsc2Uoc2JpLT5zX2JoMSk7CisJaWYgKHNiaS0+c19iaDEgIT0gc2JpLT5zX2JoMikKKwkJYnJlbHNlKHNiaS0+c19iaDIpOworCisJa2ZyZWUoc2JpKTsKK30KKworc3RhdGljIGludCBzeXN2X3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCXN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSA9IFNZU1ZfU0Ioc2IpOworCisJYnVmLT5mX3R5cGUgPSBzYi0+c19tYWdpYzsKKwlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CisJYnVmLT5mX2Jsb2NrcyA9IHNiaS0+c19uZGF0YXpvbmVzOworCWJ1Zi0+Zl9iYXZhaWwgPSBidWYtPmZfYmZyZWUgPSBzeXN2X2NvdW50X2ZyZWVfYmxvY2tzKHNiKTsKKwlidWYtPmZfZmlsZXMgPSBzYmktPnNfbmlub2RlczsKKwlidWYtPmZfZmZyZWUgPSBzeXN2X2NvdW50X2ZyZWVfaW5vZGVzKHNiKTsKKwlidWYtPmZfbmFtZWxlbiA9IFNZU1ZfTkFNRUxFTjsKKwlyZXR1cm4gMDsKK30KKworLyogCisgKiBOWEkgPC0+IE4wWEkgZm9yIFBEUCwgWElOIDwtPiBYSU4wIGZvciBsZTMyLCBOSVggPC0+IDBOSVggZm9yIGJlMzIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJlYWQzYnl0ZShzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmksCisJdW5zaWduZWQgY2hhciAqIGZyb20sIHVuc2lnbmVkIGNoYXIgKiB0bykKK3sKKwlpZiAoc2JpLT5zX2J5dGVzZXggPT0gQllURVNFWF9QRFApIHsKKwkJdG9bMF0gPSBmcm9tWzBdOworCQl0b1sxXSA9IDA7CisJCXRvWzJdID0gZnJvbVsxXTsKKwkJdG9bM10gPSBmcm9tWzJdOworCX0gZWxzZSBpZiAoc2JpLT5zX2J5dGVzZXggPT0gQllURVNFWF9MRSkgeworCQl0b1swXSA9IGZyb21bMF07CisJCXRvWzFdID0gZnJvbVsxXTsKKwkJdG9bMl0gPSBmcm9tWzJdOworCQl0b1szXSA9IDA7CisJfSBlbHNlIHsKKwkJdG9bMF0gPSAwOworCQl0b1sxXSA9IGZyb21bMF07CisJCXRvWzJdID0gZnJvbVsxXTsKKwkJdG9bM10gPSBmcm9tWzJdOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlM2J5dGUoc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpLAorCXVuc2lnbmVkIGNoYXIgKiBmcm9tLCB1bnNpZ25lZCBjaGFyICogdG8pCit7CisJaWYgKHNiaS0+c19ieXRlc2V4ID09IEJZVEVTRVhfUERQKSB7CisJCXRvWzBdID0gZnJvbVswXTsKKwkJdG9bMV0gPSBmcm9tWzJdOworCQl0b1syXSA9IGZyb21bM107CisJfSBlbHNlIGlmIChzYmktPnNfYnl0ZXNleCA9PSBCWVRFU0VYX0xFKSB7CisJCXRvWzBdID0gZnJvbVswXTsKKwkJdG9bMV0gPSBmcm9tWzFdOworCQl0b1syXSA9IGZyb21bMl07CisJfSBlbHNlIHsKKwkJdG9bMF0gPSBmcm9tWzFdOworCQl0b1sxXSA9IGZyb21bMl07CisJCXRvWzJdID0gZnJvbVszXTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzeXN2X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZGxpbmsJPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawk9IHBhZ2VfZm9sbG93X2xpbmtfbGlnaHQsCisJLnB1dF9saW5rCT0gcGFnZV9wdXRfbGluaywKKwkuZ2V0YXR0cgk9IHN5c3ZfZ2V0YXR0ciwKK307CisKK3ZvaWQgc3lzdl9zZXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgZGV2X3QgcmRldikKK3sKKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZzeXN2X2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJnN5c3ZfZmlsZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZzeXN2X2FvcHM7CisJfSBlbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJnN5c3ZfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZzeXN2X2Rpcl9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZzeXN2X2FvcHM7CisJfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWlmIChpbm9kZS0+aV9ibG9ja3MpIHsKKwkJCWlub2RlLT5pX29wID0gJnN5c3Zfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmc3lzdl9hb3BzOworCQl9IGVsc2UKKwkJCWlub2RlLT5pX29wID0gJnN5c3ZfZmFzdF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJfSBlbHNlCisJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgcmRldik7Cit9CisKK3N0YXRpYyB2b2lkIHN5c3ZfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IHN5c3Zfc2JfaW5mbyAqIHNiaSA9IFNZU1ZfU0Ioc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBzeXN2X2lub2RlICogcmF3X2lub2RlOworCXN0cnVjdCBzeXN2X2lub2RlX2luZm8gKiBzaTsKKwl1bnNpZ25lZCBpbnQgYmxvY2ssIGlubyA9IGlub2RlLT5pX2lubzsKKworCWlmICghaW5vIHx8IGlubyA+IHNiaS0+c19uaW5vZGVzKSB7CisJCXByaW50aygiQmFkIGlub2RlIG51bWJlciBvbiBkZXYgJXM6ICVkIGlzIG91dCBvZiByYW5nZVxuIiwKKwkJICAgICAgIGlub2RlLT5pX3NiLT5zX2lkLCBpbm8pOworCQlnb3RvIGJhZF9pbm9kZTsKKwl9CisJcmF3X2lub2RlID0gc3lzdl9yYXdfaW5vZGUoc2IsIGlubywgJmJoKTsKKwlpZiAoIXJhd19pbm9kZSkgeworCQlwcmludGsoIk1ham9yIHByb2JsZW06IHVuYWJsZSB0byByZWFkIGlub2RlIGZyb20gZGV2ICVzXG4iLAorCQkgICAgICAgaW5vZGUtPmlfc2ItPnNfaWQpOworCQlnb3RvIGJhZF9pbm9kZTsKKwl9CisJLyogU3lzdGVtViBGUzoga2x1ZGdlIHBlcm1pc3Npb25zIGlmIGlubz09U1lTVl9ST09UX0lOTyA/PyAqLworCWlub2RlLT5pX21vZGUgPSBmczE2X3RvX2NwdShzYmksIHJhd19pbm9kZS0+aV9tb2RlKTsKKwlpbm9kZS0+aV91aWQgPSAodWlkX3QpZnMxNl90b19jcHUoc2JpLCByYXdfaW5vZGUtPmlfdWlkKTsKKwlpbm9kZS0+aV9naWQgPSAoZ2lkX3QpZnMxNl90b19jcHUoc2JpLCByYXdfaW5vZGUtPmlfZ2lkKTsKKwlpbm9kZS0+aV9ubGluayA9IGZzMTZfdG9fY3B1KHNiaSwgcmF3X2lub2RlLT5pX25saW5rKTsKKwlpbm9kZS0+aV9zaXplID0gZnMzMl90b19jcHUoc2JpLCByYXdfaW5vZGUtPmlfc2l6ZSk7CisJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gZnMzMl90b19jcHUoc2JpLCByYXdfaW5vZGUtPmlfYXRpbWUpOworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGZzMzJfdG9fY3B1KHNiaSwgcmF3X2lub2RlLT5pX210aW1lKTsKKwlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBmczMyX3RvX2NwdShzYmksIHJhd19pbm9kZS0+aV9jdGltZSk7CisJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7CisJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7CisJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IDA7CisJaW5vZGUtPmlfYmxvY2tzID0gaW5vZGUtPmlfYmxrc2l6ZSA9IDA7CisKKwlzaSA9IFNZU1ZfSShpbm9kZSk7CisJZm9yIChibG9jayA9IDA7IGJsb2NrIDwgMTArMSsxKzE7IGJsb2NrKyspCisJCXJlYWQzYnl0ZShzYmksICZyYXdfaW5vZGUtPmlfZGF0YVszKmJsb2NrXSwKKwkJCQkodTggKikmc2ktPmlfZGF0YVtibG9ja10pOworCWJyZWxzZShiaCk7CisJc2ktPmlfZGlyX3N0YXJ0X2xvb2t1cCA9IDA7CisJaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKKwkJc3lzdl9zZXRfaW5vZGUoaW5vZGUsCisJCQkgICAgICAgb2xkX2RlY29kZV9kZXYoZnMzMl90b19jcHUoc2JpLCBzaS0+aV9kYXRhWzBdKSkpOworCWVsc2UKKwkJc3lzdl9zZXRfaW5vZGUoaW5vZGUsIDApOworCXJldHVybjsKKworYmFkX2lub2RlOgorCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzeXN2X3VwZGF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBzeXN2X3NiX2luZm8gKiBzYmkgPSBTWVNWX1NCKHNiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3Qgc3lzdl9pbm9kZSAqIHJhd19pbm9kZTsKKwlzdHJ1Y3Qgc3lzdl9pbm9kZV9pbmZvICogc2k7CisJdW5zaWduZWQgaW50IGlubywgYmxvY2s7CisKKwlpbm8gPSBpbm9kZS0+aV9pbm87CisJaWYgKCFpbm8gfHwgaW5vID4gc2JpLT5zX25pbm9kZXMpIHsKKwkJcHJpbnRrKCJCYWQgaW5vZGUgbnVtYmVyIG9uIGRldiAlczogJWQgaXMgb3V0IG9mIHJhbmdlXG4iLAorCQkgICAgICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlubyk7CisJCXJldHVybiBOVUxMOworCX0KKwlyYXdfaW5vZGUgPSBzeXN2X3Jhd19pbm9kZShzYiwgaW5vLCAmYmgpOworCWlmICghcmF3X2lub2RlKSB7CisJCXByaW50aygidW5hYmxlIHRvIHJlYWQgaS1ub2RlIGJsb2NrXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmF3X2lub2RlLT5pX21vZGUgPSBjcHVfdG9fZnMxNihzYmksIGlub2RlLT5pX21vZGUpOworCXJhd19pbm9kZS0+aV91aWQgPSBjcHVfdG9fZnMxNihzYmksIGZzX2hpZ2gybG93dWlkKGlub2RlLT5pX3VpZCkpOworCXJhd19pbm9kZS0+aV9naWQgPSBjcHVfdG9fZnMxNihzYmksIGZzX2hpZ2gybG93Z2lkKGlub2RlLT5pX2dpZCkpOworCXJhd19pbm9kZS0+aV9ubGluayA9IGNwdV90b19mczE2KHNiaSwgaW5vZGUtPmlfbmxpbmspOworCXJhd19pbm9kZS0+aV9zaXplID0gY3B1X3RvX2ZzMzIoc2JpLCBpbm9kZS0+aV9zaXplKTsKKwlyYXdfaW5vZGUtPmlfYXRpbWUgPSBjcHVfdG9fZnMzMihzYmksIGlub2RlLT5pX2F0aW1lLnR2X3NlYyk7CisJcmF3X2lub2RlLT5pX210aW1lID0gY3B1X3RvX2ZzMzIoc2JpLCBpbm9kZS0+aV9tdGltZS50dl9zZWMpOworCXJhd19pbm9kZS0+aV9jdGltZSA9IGNwdV90b19mczMyKHNiaSwgaW5vZGUtPmlfY3RpbWUudHZfc2VjKTsKKworCXNpID0gU1lTVl9JKGlub2RlKTsKKwlpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpKQorCQlzaS0+aV9kYXRhWzBdID0gY3B1X3RvX2ZzMzIoc2JpLCBvbGRfZW5jb2RlX2Rldihpbm9kZS0+aV9yZGV2KSk7CisJZm9yIChibG9jayA9IDA7IGJsb2NrIDwgMTArMSsxKzE7IGJsb2NrKyspCisJCXdyaXRlM2J5dGUoc2JpLCAodTggKikmc2ktPmlfZGF0YVtibG9ja10sCisJCQkmcmF3X2lub2RlLT5pX2RhdGFbMypibG9ja10pOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlyZXR1cm4gYmg7Cit9CisKK2ludCBzeXN2X3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgd2FpdCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWxvY2tfa2VybmVsKCk7CisJYmggPSBzeXN2X3VwZGF0ZV9pbm9kZShpbm9kZSk7CisJYnJlbHNlKGJoKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzeXN2X3N5bmNfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisgICAgICAgIGludCBlcnIgPSAwOworICAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisgICAgICAgIGJoID0gc3lzdl91cGRhdGVfaW5vZGUoaW5vZGUpOworICAgICAgICBpZiAoYmggJiYgYnVmZmVyX2RpcnR5KGJoKSkgeworICAgICAgICAgICAgICAgIHN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyX3JlcShiaCkgJiYgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoIklPIGVycm9yIHN5bmNpbmcgc3lzdiBpbm9kZSBbJXM6JTA4bHhdXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghYmgpCisgICAgICAgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgIGJyZWxzZSAoYmgpOworICAgICAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBzeXN2X2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlub2RlLT5pX3NpemUgPSAwOworCXN5c3ZfdHJ1bmNhdGUoaW5vZGUpOworCWxvY2tfa2VybmVsKCk7CisJc3lzdl9mcmVlX2lub2RlKGlub2RlKTsKKwl1bmxvY2tfa2VybmVsKCk7Cit9CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKnN5c3ZfaW5vZGVfY2FjaGVwOworCitzdGF0aWMgc3RydWN0IGlub2RlICpzeXN2X2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHN5c3ZfaW5vZGVfaW5mbyAqc2k7CisKKwlzaSA9IGttZW1fY2FjaGVfYWxsb2Moc3lzdl9pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIXNpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gJnNpLT52ZnNfaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIHN5c3ZfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShzeXN2X2lub2RlX2NhY2hlcCwgU1lTVl9JKGlub2RlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpwLCBrbWVtX2NhY2hlX3QgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3Qgc3lzdl9pbm9kZV9pbmZvICpzaSA9IChzdHJ1Y3Qgc3lzdl9pbm9kZV9pbmZvICopcDsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQorCQkJU0xBQl9DVE9SX0NPTlNUUlVDVE9SKQorCQlpbm9kZV9pbml0X29uY2UoJnNpLT52ZnNfaW5vZGUpOworfQorCitzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBzeXN2X3NvcHMgPSB7CisJLmFsbG9jX2lub2RlCT0gc3lzdl9hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IHN5c3ZfZGVzdHJveV9pbm9kZSwKKwkucmVhZF9pbm9kZQk9IHN5c3ZfcmVhZF9pbm9kZSwKKwkud3JpdGVfaW5vZGUJPSBzeXN2X3dyaXRlX2lub2RlLAorCS5kZWxldGVfaW5vZGUJPSBzeXN2X2RlbGV0ZV9pbm9kZSwKKwkucHV0X3N1cGVyCT0gc3lzdl9wdXRfc3VwZXIsCisJLndyaXRlX3N1cGVyCT0gc3lzdl93cml0ZV9zdXBlciwKKwkucmVtb3VudF9mcwk9IHN5c3ZfcmVtb3VudCwKKwkuc3RhdGZzCQk9IHN5c3Zfc3RhdGZzLAorfTsKKworaW50IF9faW5pdCBzeXN2X2luaXRfaWNhY2hlKHZvaWQpCit7CisJc3lzdl9pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgic3lzdl9pbm9kZV9jYWNoZSIsCisJCQlzaXplb2Yoc3RydWN0IHN5c3ZfaW5vZGVfaW5mbyksIDAsCisJCQlTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCWluaXRfb25jZSwgTlVMTCk7CisJaWYgKCFzeXN2X2lub2RlX2NhY2hlcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc3lzdl9kZXN0cm95X2ljYWNoZSh2b2lkKQoreworCWttZW1fY2FjaGVfZGVzdHJveShzeXN2X2lub2RlX2NhY2hlcCk7Cit9CmRpZmYgLS1naXQgYS9mcy9zeXN2L2l0cmVlLmMgYi9mcy9zeXN2L2l0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZmNWY4ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3N5c3YvaXRyZWUuYwpAQCAtMCwwICsxLDQ3NSBAQAorLyoKKyAqICBsaW51eC9mcy9zeXN2L2l0cmVlLmMKKyAqCisgKiAgSGFuZGxpbmcgb2YgaW5kaXJlY3QgYmxvY2tzJyB0cmVlcy4KKyAqICBBViwgU2VwLS1EZWMgMjAwMAorICovCisKKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSAic3lzdi5oIgorCitlbnVtIHtESVJFQ1QgPSAxMCwgREVQVEggPSA0fTsJLyogSGF2ZSB0cmlwbGUgaW5kaXJlY3QgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGRpcnR5X2luZGlyZWN0KHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJbWFya19idWZmZXJfZGlydHlfaW5vZGUoYmgsIGlub2RlKTsKKwlpZiAoSVNfU1lOQyhpbm9kZSkpCisJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKK30KKworc3RhdGljIGludCBibG9ja190b19wYXRoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvbmcgYmxvY2ssIGludCBvZmZzZXRzW0RFUFRIXSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpID0gU1lTVl9TQihzYik7CisJaW50IHB0cnNfYml0cyA9IHNiaS0+c19pbmRfcGVyX2Jsb2NrX2JpdHM7CisJdW5zaWduZWQgbG9uZwlpbmRpcmVjdF9ibG9ja3MgPSBzYmktPnNfaW5kX3Blcl9ibG9jaywKKwkJCWRvdWJsZV9ibG9ja3MgPSBzYmktPnNfaW5kX3Blcl9ibG9ja18yOworCWludCBuID0gMDsKKworCWlmIChibG9jayA8IDApIHsKKwkJcHJpbnRrKCJzeXN2X2Jsb2NrX21hcDogYmxvY2sgPCAwXG4iKTsKKwl9IGVsc2UgaWYgKGJsb2NrIDwgRElSRUNUKSB7CisJCW9mZnNldHNbbisrXSA9IGJsb2NrOworCX0gZWxzZSBpZiAoIChibG9jayAtPSBESVJFQ1QpIDwgaW5kaXJlY3RfYmxvY2tzKSB7CisJCW9mZnNldHNbbisrXSA9IERJUkVDVDsKKwkJb2Zmc2V0c1tuKytdID0gYmxvY2s7CisJfSBlbHNlIGlmICgoYmxvY2sgLT0gaW5kaXJlY3RfYmxvY2tzKSA8IGRvdWJsZV9ibG9ja3MpIHsKKwkJb2Zmc2V0c1tuKytdID0gRElSRUNUKzE7CisJCW9mZnNldHNbbisrXSA9IGJsb2NrID4+IHB0cnNfYml0czsKKwkJb2Zmc2V0c1tuKytdID0gYmxvY2sgJiAoaW5kaXJlY3RfYmxvY2tzIC0gMSk7CisJfSBlbHNlIGlmICgoKGJsb2NrIC09IGRvdWJsZV9ibG9ja3MpID4+IChwdHJzX2JpdHMgKiAyKSkgPCBpbmRpcmVjdF9ibG9ja3MpIHsKKwkJb2Zmc2V0c1tuKytdID0gRElSRUNUKzI7CisJCW9mZnNldHNbbisrXSA9IGJsb2NrID4+IChwdHJzX2JpdHMgKiAyKTsKKwkJb2Zmc2V0c1tuKytdID0gKGJsb2NrID4+IHB0cnNfYml0cykgJiAoaW5kaXJlY3RfYmxvY2tzIC0gMSk7CisJCW9mZnNldHNbbisrXSA9IGJsb2NrICYgKGluZGlyZWN0X2Jsb2NrcyAtIDEpOworCX0gZWxzZSB7CisJCS8qIG5vdGhpbmcgKi87CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgaW5saW5lIGludCBibG9ja190b19jcHUoc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpLCBzeXN2X3pvbmVfdCBucikKK3sKKwlyZXR1cm4gc2JpLT5zX2Jsb2NrX2Jhc2UgKyBmczMyX3RvX2NwdShzYmksIG5yKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworCXN5c3Zfem9uZV90ICAgICAqcDsKKwlzeXN2X3pvbmVfdCAgICAga2V5OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7Cit9IEluZGlyZWN0OworCitzdGF0aWMgREVGSU5FX1JXTE9DSyhwb2ludGVyc19sb2NrKTsKKworc3RhdGljIGlubGluZSB2b2lkIGFkZF9jaGFpbihJbmRpcmVjdCAqcCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgc3lzdl96b25lX3QgKnYpCit7CisJcC0+a2V5ID0gKihwLT5wID0gdik7CisJcC0+YmggPSBiaDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdmVyaWZ5X2NoYWluKEluZGlyZWN0ICpmcm9tLCBJbmRpcmVjdCAqdG8pCit7CisJd2hpbGUgKGZyb20gPD0gdG8gJiYgZnJvbS0+a2V5ID09ICpmcm9tLT5wKQorCQlmcm9tKys7CisJcmV0dXJuIChmcm9tID4gdG8pOworfQorCitzdGF0aWMgaW5saW5lIHN5c3Zfem9uZV90ICpibG9ja19lbmQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlyZXR1cm4gKHN5c3Zfem9uZV90KikoKGNoYXIqKWJoLT5iX2RhdGEgKyBiaC0+Yl9zaXplKTsKK30KKworLyoKKyAqIFJlcXVpcmVzIHJlYWRfbG9jaygmcG9pbnRlcnNfbG9jaykgb3Igd3JpdGVfbG9jaygmcG9pbnRlcnNfbG9jaykKKyAqLworc3RhdGljIEluZGlyZWN0ICpnZXRfYnJhbmNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgaW50IGRlcHRoLAorCQkJICAgIGludCBvZmZzZXRzW10sCisJCQkgICAgSW5kaXJlY3QgY2hhaW5bXSwKKwkJCSAgICBpbnQgKmVycikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJSW5kaXJlY3QgKnAgPSBjaGFpbjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJKmVyciA9IDA7CisJYWRkX2NoYWluKGNoYWluLCBOVUxMLCBTWVNWX0koaW5vZGUpLT5pX2RhdGEgKyAqb2Zmc2V0cyk7CisJaWYgKCFwLT5rZXkpCisJCWdvdG8gbm9fYmxvY2s7CisJd2hpbGUgKC0tZGVwdGgpIHsKKwkJaW50IGJsb2NrID0gYmxvY2tfdG9fY3B1KFNZU1ZfU0Ioc2IpLCBwLT5rZXkpOworCQliaCA9IHNiX2JyZWFkKHNiLCBibG9jayk7CisJCWlmICghYmgpCisJCQlnb3RvIGZhaWx1cmU7CisJCWlmICghdmVyaWZ5X2NoYWluKGNoYWluLCBwKSkKKwkJCWdvdG8gY2hhbmdlZDsKKwkJYWRkX2NoYWluKCsrcCwgYmgsIChzeXN2X3pvbmVfdCopYmgtPmJfZGF0YSArICorK29mZnNldHMpOworCQlpZiAoIXAtPmtleSkKKwkJCWdvdG8gbm9fYmxvY2s7CisJfQorCXJldHVybiBOVUxMOworCitjaGFuZ2VkOgorCWJyZWxzZShiaCk7CisJKmVyciA9IC1FQUdBSU47CisJZ290byBub19ibG9jazsKK2ZhaWx1cmU6CisJKmVyciA9IC1FSU87Citub19ibG9jazoKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGludCBhbGxvY19icmFuY2goc3RydWN0IGlub2RlICppbm9kZSwKKwkJCWludCBudW0sCisJCQlpbnQgKm9mZnNldHMsCisJCQlJbmRpcmVjdCAqYnJhbmNoKQoreworCWludCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJaW50IG4gPSAwOworCWludCBpOworCisJYnJhbmNoWzBdLmtleSA9IHN5c3ZfbmV3X2Jsb2NrKGlub2RlLT5pX3NiKTsKKwlpZiAoYnJhbmNoWzBdLmtleSkgZm9yIChuID0gMTsgbiA8IG51bTsgbisrKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJCWludCBwYXJlbnQ7CisJCS8qIEFsbG9jYXRlIHRoZSBuZXh0IGJsb2NrICovCisJCWJyYW5jaFtuXS5rZXkgPSBzeXN2X25ld19ibG9jayhpbm9kZS0+aV9zYik7CisJCWlmICghYnJhbmNoW25dLmtleSkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBHZXQgYnVmZmVyX2hlYWQgZm9yIHBhcmVudCBibG9jaywgemVybyBpdCBvdXQgYW5kIHNldCAKKwkJICogdGhlIHBvaW50ZXIgdG8gbmV3IG9uZSwgdGhlbiBzZW5kIHBhcmVudCB0byBkaXNrLgorCQkgKi8KKwkJcGFyZW50ID0gYmxvY2tfdG9fY3B1KFNZU1ZfU0IoaW5vZGUtPmlfc2IpLCBicmFuY2hbbi0xXS5rZXkpOworCQliaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgcGFyZW50KTsKKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1zZXQoYmgtPmJfZGF0YSwgMCwgYmxvY2tzaXplKTsKKwkJYnJhbmNoW25dLmJoID0gYmg7CisJCWJyYW5jaFtuXS5wID0gKHN5c3Zfem9uZV90KikgYmgtPmJfZGF0YSArIG9mZnNldHNbbl07CisJCSpicmFuY2hbbl0ucCA9IGJyYW5jaFtuXS5rZXk7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJZGlydHlfaW5kaXJlY3QoYmgsIGlub2RlKTsKKwl9CisJaWYgKG4gPT0gbnVtKQorCQlyZXR1cm4gMDsKKworCS8qIEFsbG9jYXRpb24gZmFpbGVkLCBmcmVlIHdoYXQgd2UgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KKwlmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKQorCQliZm9yZ2V0KGJyYW5jaFtpXS5iaCk7CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJc3lzdl9mcmVlX2Jsb2NrKGlub2RlLT5pX3NiLCBicmFuY2hbaV0ua2V5KTsKKwlyZXR1cm4gLUVOT1NQQzsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3BsaWNlX2JyYW5jaChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCUluZGlyZWN0IGNoYWluW10sCisJCQkJSW5kaXJlY3QgKndoZXJlLAorCQkJCWludCBudW0pCit7CisJaW50IGk7CisKKwkvKiBWZXJpZnkgdGhhdCBwbGFjZSB3ZSBhcmUgc3BsaWNpbmcgdG8gaXMgc3RpbGwgdGhlcmUgYW5kIHZhY2FudCAqLworCXdyaXRlX2xvY2soJnBvaW50ZXJzX2xvY2spOworCWlmICghdmVyaWZ5X2NoYWluKGNoYWluLCB3aGVyZS0xKSB8fCAqd2hlcmUtPnApCisJCWdvdG8gY2hhbmdlZDsKKwkqd2hlcmUtPnAgPSB3aGVyZS0+a2V5OworCXdyaXRlX3VubG9jaygmcG9pbnRlcnNfbG9jayk7CisKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisKKwkvKiBoYWQgd2Ugc3BsaWNlZCBpdCBvbnRvIGluZGlyZWN0IGJsb2NrPyAqLworCWlmICh3aGVyZS0+YmgpCisJCWRpcnR5X2luZGlyZWN0KHdoZXJlLT5iaCwgaW5vZGUpOworCisJaWYgKElTX1NZTkMoaW5vZGUpKQorCQlzeXN2X3N5bmNfaW5vZGUoaW5vZGUpOworCWVsc2UKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJcmV0dXJuIDA7CisKK2NoYW5nZWQ6CisJd3JpdGVfdW5sb2NrKCZwb2ludGVyc19sb2NrKTsKKwlmb3IgKGkgPSAxOyBpIDwgbnVtOyBpKyspCisJCWJmb3JnZXQod2hlcmVbaV0uYmgpOworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJc3lzdl9mcmVlX2Jsb2NrKGlub2RlLT5pX3NiLCB3aGVyZVtpXS5rZXkpOworCXJldHVybiAtRUFHQUlOOworfQorCitzdGF0aWMgaW50IGdldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQoreworCWludCBlcnIgPSAtRUlPOworCWludCBvZmZzZXRzW0RFUFRIXTsKKwlJbmRpcmVjdCBjaGFpbltERVBUSF07CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCUluZGlyZWN0ICpwYXJ0aWFsOworCWludCBsZWZ0OworCWludCBkZXB0aCA9IGJsb2NrX3RvX3BhdGgoaW5vZGUsIGlibG9jaywgb2Zmc2V0cyk7CisKKwlpZiAoZGVwdGggPT0gMCkKKwkJZ290byBvdXQ7CisKK3JlcmVhZDoKKwlyZWFkX2xvY2soJnBvaW50ZXJzX2xvY2spOworCXBhcnRpYWwgPSBnZXRfYnJhbmNoKGlub2RlLCBkZXB0aCwgb2Zmc2V0cywgY2hhaW4sICZlcnIpOworCXJlYWRfdW5sb2NrKCZwb2ludGVyc19sb2NrKTsKKworCS8qIFNpbXBsZXN0IGNhc2UgLSBibG9jayBmb3VuZCwgbm8gYWxsb2NhdGlvbiBuZWVkZWQgKi8KKwlpZiAoIXBhcnRpYWwpIHsKK2dvdF9pdDoKKwkJbWFwX2JoKGJoX3Jlc3VsdCwgc2IsIGJsb2NrX3RvX2NwdShTWVNWX1NCKHNiKSwKKwkJCQkJY2hhaW5bZGVwdGgtMV0ua2V5KSk7CisJCS8qIENsZWFuIHVwIGFuZCBleGl0ICovCisJCXBhcnRpYWwgPSBjaGFpbitkZXB0aC0xOyAvKiB0aGUgd2hvbGUgY2hhaW4gKi8KKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIE5leHQgc2ltcGxlIGNhc2UgLSBwbGFpbiBsb29rdXAgb3IgZmFpbGVkIHJlYWQgb2YgaW5kaXJlY3QgYmxvY2sgKi8KKwlpZiAoIWNyZWF0ZSB8fCBlcnIgPT0gLUVJTykgeworY2xlYW51cDoKKwkJd2hpbGUgKHBhcnRpYWwgPiBjaGFpbikgeworCQkJYnJlbHNlKHBhcnRpYWwtPmJoKTsKKwkJCXBhcnRpYWwtLTsKKwkJfQorb3V0OgorCQlyZXR1cm4gZXJyOworCX0KKworCS8qCisJICogSW5kaXJlY3QgYmxvY2sgbWlnaHQgYmUgcmVtb3ZlZCBieSB0cnVuY2F0ZSB3aGlsZSB3ZSB3ZXJlCisJICogcmVhZGluZyBpdC4gSGFuZGxpbmcgb2YgdGhhdCBjYXNlIChmb3JnZXQgd2hhdCB3ZSd2ZSBnb3QgYW5kCisJICogcmVyZWFkKSBpcyB0YWtlbiBvdXQgb2YgdGhlIG1haW4gcGF0aC4KKwkgKi8KKwlpZiAoZXJyID09IC1FQUdBSU4pCisJCWdvdG8gY2hhbmdlZDsKKworCWxlZnQgPSAoY2hhaW4gKyBkZXB0aCkgLSBwYXJ0aWFsOworCWVyciA9IGFsbG9jX2JyYW5jaChpbm9kZSwgbGVmdCwgb2Zmc2V0cysocGFydGlhbC1jaGFpbiksIHBhcnRpYWwpOworCWlmIChlcnIpCisJCWdvdG8gY2xlYW51cDsKKworCWlmIChzcGxpY2VfYnJhbmNoKGlub2RlLCBjaGFpbiwgcGFydGlhbCwgbGVmdCkgPCAwKQorCQlnb3RvIGNoYW5nZWQ7CisKKwlzZXRfYnVmZmVyX25ldyhiaF9yZXN1bHQpOworCWdvdG8gZ290X2l0OworCitjaGFuZ2VkOgorCXdoaWxlIChwYXJ0aWFsID4gY2hhaW4pIHsKKwkJYnJlbHNlKHBhcnRpYWwtPmJoKTsKKwkJcGFydGlhbC0tOworCX0KKwlnb3RvIHJlcmVhZDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYWxsX3plcm9lcyhzeXN2X3pvbmVfdCAqcCwgc3lzdl96b25lX3QgKnEpCit7CisJd2hpbGUgKHAgPCBxKQorCQlpZiAoKnArKykKKwkJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgSW5kaXJlY3QgKmZpbmRfc2hhcmVkKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJaW50IGRlcHRoLAorCQkJCWludCBvZmZzZXRzW10sCisJCQkJSW5kaXJlY3QgY2hhaW5bXSwKKwkJCQlzeXN2X3pvbmVfdCAqdG9wKQoreworCUluZGlyZWN0ICpwYXJ0aWFsLCAqcDsKKwlpbnQgaywgZXJyOworCisJKnRvcCA9IDA7CisJZm9yIChrID0gZGVwdGg7IGsgPiAxICYmICFvZmZzZXRzW2stMV07IGstLSkKKwkJOworCisJd3JpdGVfbG9jaygmcG9pbnRlcnNfbG9jayk7CisJcGFydGlhbCA9IGdldF9icmFuY2goaW5vZGUsIGssIG9mZnNldHMsIGNoYWluLCAmZXJyKTsKKwlpZiAoIXBhcnRpYWwpCisJCXBhcnRpYWwgPSBjaGFpbiArIGstMTsKKwkvKgorCSAqIElmIHRoZSBicmFuY2ggYWNxdWlyZWQgY29udGludWF0aW9uIHNpbmNlIHdlJ3ZlIGxvb2tlZCBhdCBpdCAtCisJICogZmluZSwgaXQgc2hvdWxkIGFsbCBzdXJ2aXZlIGFuZCAobmV3KSB0b3AgZG9lc24ndCBiZWxvbmcgdG8gdXMuCisJICovCisJaWYgKCFwYXJ0aWFsLT5rZXkgJiYgKnBhcnRpYWwtPnApIHsKKwkJd3JpdGVfdW5sb2NrKCZwb2ludGVyc19sb2NrKTsKKwkJZ290byBub190b3A7CisJfQorCWZvciAocD1wYXJ0aWFsOyBwPmNoYWluICYmIGFsbF96ZXJvZXMoKHN5c3Zfem9uZV90KilwLT5iaC0+Yl9kYXRhLHAtPnApOyBwLS0pCisJCTsKKwkvKgorCSAqIE9LLCB3ZSd2ZSBmb3VuZCB0aGUgbGFzdCBibG9jayB0aGF0IG11c3Qgc3Vydml2ZS4gVGhlIHJlc3Qgb2Ygb3VyCisJICogYnJhbmNoIHNob3VsZCBiZSBkZXRhY2hlZCBiZWZvcmUgdW5sb2NraW5nLiBIb3dldmVyLCBpZiB0aGF0IHJlc3QKKwkgKiBvZiBicmFuY2ggaXMgYWxsIG91cnMgYW5kIGRvZXMgbm90IGdyb3cgaW1tZWRpYXRlbHkgZnJvbSB0aGUgaW5vZGUKKwkgKiBpdCdzIGVhc2llciB0byBjaGVhdCBhbmQganVzdCBkZWNyZW1lbnQgcGFydGlhbC0+cC4KKwkgKi8KKwlpZiAocCA9PSBjaGFpbiArIGsgLSAxICYmIHAgPiBjaGFpbikgeworCQlwLT5wLS07CisJfSBlbHNlIHsKKwkJKnRvcCA9ICpwLT5wOworCQkqcC0+cCA9IDA7CisJfQorCXdyaXRlX3VubG9jaygmcG9pbnRlcnNfbG9jayk7CisKKwl3aGlsZSAocGFydGlhbCA+IHApIHsKKwkJYnJlbHNlKHBhcnRpYWwtPmJoKTsKKwkJcGFydGlhbC0tOworCX0KK25vX3RvcDoKKwlyZXR1cm4gcGFydGlhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzeXN2X3pvbmVfdCAqcCwgc3lzdl96b25lX3QgKnEpCit7CisJZm9yICggOyBwIDwgcSA7IHArKykgeworCQlzeXN2X3pvbmVfdCBuciA9ICpwOworCQlpZiAobnIpIHsKKwkJCSpwID0gMDsKKwkJCXN5c3ZfZnJlZV9ibG9jayhpbm9kZS0+aV9zYiwgbnIpOworCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfYnJhbmNoZXMoc3RydWN0IGlub2RlICppbm9kZSwgc3lzdl96b25lX3QgKnAsIHN5c3Zfem9uZV90ICpxLCBpbnQgZGVwdGgpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCisJaWYgKGRlcHRoLS0pIHsKKwkJZm9yICggOyBwIDwgcSA7IHArKykgeworCQkJaW50IGJsb2NrOworCQkJc3lzdl96b25lX3QgbnIgPSAqcDsKKwkJCWlmICghbnIpCisJCQkJY29udGludWU7CisJCQkqcCA9IDA7CisJCQlibG9jayA9IGJsb2NrX3RvX2NwdShTWVNWX1NCKHNiKSwgbnIpOworCQkJYmggPSBzYl9icmVhZChzYiwgYmxvY2spOworCQkJaWYgKCFiaCkKKwkJCQljb250aW51ZTsKKwkJCWZyZWVfYnJhbmNoZXMoaW5vZGUsIChzeXN2X3pvbmVfdCopYmgtPmJfZGF0YSwKKwkJCQkJYmxvY2tfZW5kKGJoKSwgZGVwdGgpOworCQkJYmZvcmdldChiaCk7CisJCQlzeXN2X2ZyZWVfYmxvY2soc2IsIG5yKTsKKwkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQl9CisJfSBlbHNlCisJCWZyZWVfZGF0YShpbm9kZSwgcCwgcSk7Cit9CisKK3ZvaWQgc3lzdl90cnVuY2F0ZSAoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJc3lzdl96b25lX3QgKmlfZGF0YSA9IFNZU1ZfSShpbm9kZSktPmlfZGF0YTsKKwlpbnQgb2Zmc2V0c1tERVBUSF07CisJSW5kaXJlY3QgY2hhaW5bREVQVEhdOworCUluZGlyZWN0ICpwYXJ0aWFsOworCXN5c3Zfem9uZV90IG5yID0gMDsKKwlpbnQgbjsKKwlsb25nIGlibG9jazsKKwl1bnNpZ25lZCBibG9ja3NpemU7CisKKwlpZiAoIShTX0lTUkVHKGlub2RlLT5pX21vZGUpIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwKKwkgICAgU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkpCisJCXJldHVybjsKKworCWJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlpYmxvY2sgPSAoaW5vZGUtPmlfc2l6ZSArIGJsb2Nrc2l6ZS0xKQorCQkJCQk+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKworCWJsb2NrX3RydW5jYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5vZGUtPmlfc2l6ZSwgZ2V0X2Jsb2NrKTsKKworCW4gPSBibG9ja190b19wYXRoKGlub2RlLCBpYmxvY2ssIG9mZnNldHMpOworCWlmIChuID09IDApCisJCXJldHVybjsKKworCWlmIChuID09IDEpIHsKKwkJZnJlZV9kYXRhKGlub2RlLCBpX2RhdGErb2Zmc2V0c1swXSwgaV9kYXRhICsgRElSRUNUKTsKKwkJZ290byBkb19pbmRpcmVjdHM7CisJfQorCisJcGFydGlhbCA9IGZpbmRfc2hhcmVkKGlub2RlLCBuLCBvZmZzZXRzLCBjaGFpbiwgJm5yKTsKKwkvKiBLaWxsIHRoZSB0b3Agb2Ygc2hhcmVkIGJyYW5jaCAoYWxyZWFkeSBkZXRhY2hlZCkgKi8KKwlpZiAobnIpIHsKKwkJaWYgKHBhcnRpYWwgPT0gY2hhaW4pCisJCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJZWxzZQorCQkJZGlydHlfaW5kaXJlY3QocGFydGlhbC0+YmgsIGlub2RlKTsKKwkJZnJlZV9icmFuY2hlcyhpbm9kZSwgJm5yLCAmbnIrMSwgKGNoYWluK24tMSkgLSBwYXJ0aWFsKTsKKwl9CisJLyogQ2xlYXIgdGhlIGVuZHMgb2YgaW5kaXJlY3QgYmxvY2tzIG9uIHRoZSBzaGFyZWQgYnJhbmNoICovCisJd2hpbGUgKHBhcnRpYWwgPiBjaGFpbikgeworCQlmcmVlX2JyYW5jaGVzKGlub2RlLCBwYXJ0aWFsLT5wICsgMSwgYmxvY2tfZW5kKHBhcnRpYWwtPmJoKSwKKwkJCQkoY2hhaW4rbi0xKSAtIHBhcnRpYWwpOworCQlkaXJ0eV9pbmRpcmVjdChwYXJ0aWFsLT5iaCwgaW5vZGUpOworCQlicmVsc2UgKHBhcnRpYWwtPmJoKTsKKwkJcGFydGlhbC0tOworCX0KK2RvX2luZGlyZWN0czoKKwkvKiBLaWxsIHRoZSByZW1haW5pbmcgKHdob2xlKSBzdWJ0cmVlcyAoPT0gc3VidHJlZXMgZGVlcGVyIHRoYW4uLi4pICovCisJd2hpbGUgKG4gPCBERVBUSCkgeworCQluciA9IGlfZGF0YVtESVJFQ1QgKyBuIC0gMV07CisJCWlmIChucikgeworCQkJaV9kYXRhW0RJUkVDVCArIG4gLSAxXSA9IDA7CisJCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJCWZyZWVfYnJhbmNoZXMoaW5vZGUsICZuciwgJm5yKzEsIG4pOworCQl9CisJCW4rKzsKKwl9CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJaWYgKElTX1NZTkMoaW5vZGUpKQorCQlzeXN2X3N5bmNfaW5vZGUgKGlub2RlKTsKKwllbHNlCisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworfQorCitzdGF0aWMgdW5zaWduZWQgc3lzdl9uYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgbG9mZl90IHNpemUpCit7CisJc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpID0gU1lTVl9TQihzKTsKKwlpbnQgcHRyc19iaXRzID0gc2JpLT5zX2luZF9wZXJfYmxvY2tfYml0czsKKwl1bnNpZ25lZCBibG9ja3MsIHJlcywgZGlyZWN0ID0gRElSRUNULCBpID0gREVQVEg7CisJYmxvY2tzID0gKHNpemUgKyBzLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IHMtPnNfYmxvY2tzaXplX2JpdHM7CisJcmVzID0gYmxvY2tzOworCXdoaWxlICgtLWkgJiYgYmxvY2tzID4gZGlyZWN0KSB7CisJCWJsb2NrcyA9ICgoYmxvY2tzIC0gZGlyZWN0IC0gMSkgPj4gcHRyc19iaXRzKSArIDE7CisJCXJlcyArPSBibG9ja3M7CisJCWRpcmVjdCA9IDE7CisJfQorCXJldHVybiBibG9ja3M7Cit9CisKK2ludCBzeXN2X2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ICpzdGF0KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IG1udC0+bW50X3NiOworCWdlbmVyaWNfZmlsbGF0dHIoZGVudHJ5LT5kX2lub2RlLCBzdGF0KTsKKwlzdGF0LT5ibG9ja3MgPSAocy0+c19ibG9ja3NpemUgLyA1MTIpICogc3lzdl9uYmxvY2tzKHMsIHN0YXQtPnNpemUpOworCXN0YXQtPmJsa3NpemUgPSBzLT5zX2Jsb2Nrc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzeXN2X3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJcmV0dXJuIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLGdldF9ibG9jayx3YmMpOworfQorc3RhdGljIGludCBzeXN2X3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gYmxvY2tfcmVhZF9mdWxsX3BhZ2UocGFnZSxnZXRfYmxvY2spOworfQorc3RhdGljIGludCBzeXN2X3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlyZXR1cm4gYmxvY2tfcHJlcGFyZV93cml0ZShwYWdlLGZyb20sdG8sZ2V0X2Jsb2NrKTsKK30KK3N0YXRpYyBzZWN0b3JfdCBzeXN2X2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGJsb2NrKQoreworCXJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAobWFwcGluZyxibG9jayxnZXRfYmxvY2spOworfQorc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBzeXN2X2FvcHMgPSB7CisJLnJlYWRwYWdlID0gc3lzdl9yZWFkcGFnZSwKKwkud3JpdGVwYWdlID0gc3lzdl93cml0ZXBhZ2UsCisJLnN5bmNfcGFnZSA9IGJsb2NrX3N5bmNfcGFnZSwKKwkucHJlcGFyZV93cml0ZSA9IHN5c3ZfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlID0gZ2VuZXJpY19jb21taXRfd3JpdGUsCisJLmJtYXAgPSBzeXN2X2JtYXAKK307CmRpZmYgLS1naXQgYS9mcy9zeXN2L25hbWVpLmMgYi9mcy9zeXN2L25hbWVpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwZTRiNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3N5c3YvbmFtZWkuYwpAQCAtMCwwICsxLDMxOCBAQAorLyoKKyAqICBsaW51eC9mcy9zeXN2L25hbWVpLmMKKyAqCisgKiAgbWluaXgvbmFtZWkuYworICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgY29oL25hbWVpLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTMgIFBhc2NhbCBIYWlibGUsIEJydW5vIEhhaWJsZQorICoKKyAqICBzeXN2L25hbWVpLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTMgIEJydW5vIEhhaWJsZQorICogIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCAgS3J6eXN6dG9mIEcuIEJhcmFub3dza2kKKyAqLworCisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSAic3lzdi5oIgorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5jX2NvdW50KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW5vZGUtPmlfbmxpbmsrKzsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlY19jb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlub2RlLT5pX25saW5rLS07CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Cit9CisKK3N0YXRpYyBpbnQgYWRkX25vbmRpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGVyciA9IHN5c3ZfYWRkX2xpbmsoZGVudHJ5LCBpbm9kZSk7CisJaWYgKCFlcnIpIHsKKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCWRlY19jb3VudChpbm9kZSk7CisJaXB1dChpbm9kZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzeXN2X2hhc2goc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0cikKK3sKKwkvKiBUcnVuY2F0ZSB0aGUgbmFtZSBpbiBwbGFjZSwgYXZvaWRzIGhhdmluZyB0byBkZWZpbmUgYSBjb21wYXJlCisJICAgZnVuY3Rpb24uICovCisJaWYgKHFzdHItPmxlbiA+IFNZU1ZfTkFNRUxFTikgeworCQlxc3RyLT5sZW4gPSBTWVNWX05BTUVMRU47CisJCXFzdHItPmhhc2ggPSBmdWxsX25hbWVfaGFzaChxc3RyLT5uYW1lLCBxc3RyLT5sZW4pOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIHN5c3ZfZGVudHJ5X29wZXJhdGlvbnMgPSB7CisJLmRfaGFzaAkJPSBzeXN2X2hhc2gsCit9OworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqc3lzdl9sb29rdXAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IE5VTEw7CisJaW5vX3QgaW5vOworCisJZGVudHJ5LT5kX29wID0gZGlyLT5pX3NiLT5zX3Jvb3QtPmRfb3A7CisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IFNZU1ZfTkFNRUxFTikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CisJaW5vID0gc3lzdl9pbm9kZV9ieV9uYW1lKGRlbnRyeSk7CisKKwlpZiAoaW5vKSB7CisJCWlub2RlID0gaWdldChkaXItPmlfc2IsIGlubyk7CisJCWlmICghaW5vZGUpCisJCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKwl9CisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgc3lzdl9ta25vZChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGludCBtb2RlLCBkZXZfdCByZGV2KQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCWludCBlcnI7CisKKwlpZiAoIW9sZF92YWxpZF9kZXYocmRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJaW5vZGUgPSBzeXN2X25ld19pbm9kZShkaXIsIG1vZGUpOworCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCisJaWYgKCFJU19FUlIoaW5vZGUpKSB7CisJCXN5c3Zfc2V0X2lub2RlKGlub2RlLCByZGV2KTsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCWVyciA9IGFkZF9ub25kaXIoZGVudHJ5LCBpbm9kZSk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc3lzdl9jcmVhdGUoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBpbnQgbW9kZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJcmV0dXJuIHN5c3ZfbWtub2QoZGlyLCBkZW50cnksIG1vZGUsIDApOworfQorCitzdGF0aWMgaW50IHN5c3Zfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIAorCWNvbnN0IGNoYXIgKiBzeW1uYW1lKQoreworCWludCBlcnIgPSAtRU5BTUVUT09MT05HOworCWludCBsID0gc3RybGVuKHN5bW5hbWUpKzE7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisKKwlpZiAobCA+IGRpci0+aV9zYi0+c19ibG9ja3NpemUpCisJCWdvdG8gb3V0OworCisJaW5vZGUgPSBzeXN2X25ld19pbm9kZShkaXIsIFNfSUZMTkt8MDc3Nyk7CisJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCWdvdG8gb3V0OworCQorCXN5c3Zfc2V0X2lub2RlKGlub2RlLCAwKTsKKwllcnIgPSBwYWdlX3N5bWxpbmsoaW5vZGUsIHN5bW5hbWUsIGwpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZhaWw7CisKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwllcnIgPSBhZGRfbm9uZGlyKGRlbnRyeSwgaW5vZGUpOworb3V0OgorCXJldHVybiBlcnI7CisKK291dF9mYWlsOgorCWRlY19jb3VudChpbm9kZSk7CisJaXB1dChpbm9kZSk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgc3lzdl9saW5rKHN0cnVjdCBkZW50cnkgKiBvbGRfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKiBkaXIsIAorCXN0cnVjdCBkZW50cnkgKiBkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisKKwlpZiAoaW5vZGUtPmlfbmxpbmsgPj0gU1lTVl9TQihpbm9kZS0+aV9zYiktPnNfbGlua19tYXgpCisJCXJldHVybiAtRU1MSU5LOworCisJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWluY19jb3VudChpbm9kZSk7CisJYXRvbWljX2luYygmaW5vZGUtPmlfY291bnQpOworCisJcmV0dXJuIGFkZF9ub25kaXIoZGVudHJ5LCBpbm9kZSk7Cit9CisKK3N0YXRpYyBpbnQgc3lzdl9ta2RpcihzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJaW50IGVyciA9IC1FTUxJTks7CisKKwlpZiAoZGlyLT5pX25saW5rID49IFNZU1ZfU0IoZGlyLT5pX3NiKS0+c19saW5rX21heCkgCisJCWdvdG8gb3V0OworCWluY19jb3VudChkaXIpOworCisJaW5vZGUgPSBzeXN2X25ld19pbm9kZShkaXIsIFNfSUZESVJ8bW9kZSk7CisJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCWdvdG8gb3V0X2RpcjsKKworCXN5c3Zfc2V0X2lub2RlKGlub2RlLCAwKTsKKworCWluY19jb3VudChpbm9kZSk7CisKKwllcnIgPSBzeXN2X21ha2VfZW1wdHkoaW5vZGUsIGRpcik7CisJaWYgKGVycikKKwkJZ290byBvdXRfZmFpbDsKKworCWVyciA9IHN5c3ZfYWRkX2xpbmsoZGVudHJ5LCBpbm9kZSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZmFpbDsKKworICAgICAgICBkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworb3V0OgorCXJldHVybiBlcnI7CisKK291dF9mYWlsOgorCWRlY19jb3VudChpbm9kZSk7CisJZGVjX2NvdW50KGlub2RlKTsKKwlpcHV0KGlub2RlKTsKK291dF9kaXI6CisJZGVjX2NvdW50KGRpcik7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgc3lzdl91bmxpbmsoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBwYWdlICogcGFnZTsKKwlzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkgKiBkZTsKKwlpbnQgZXJyID0gLUVOT0VOVDsKKworCWRlID0gc3lzdl9maW5kX2VudHJ5KGRlbnRyeSwgJnBhZ2UpOworCWlmICghZGUpCisJCWdvdG8gb3V0OworCisJZXJyID0gc3lzdl9kZWxldGVfZW50cnkgKGRlLCBwYWdlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWlub2RlLT5pX2N0aW1lID0gZGlyLT5pX2N0aW1lOworCWRlY19jb3VudChpbm9kZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzeXN2X3JtZGlyKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnIgPSAtRU5PVEVNUFRZOworCisJaWYgKHN5c3ZfZW1wdHlfZGlyKGlub2RlKSkgeworCQllcnIgPSBzeXN2X3VubGluayhkaXIsIGRlbnRyeSk7CisJCWlmICghZXJyKSB7CisJCQlpbm9kZS0+aV9zaXplID0gMDsKKwkJCWRlY19jb3VudChpbm9kZSk7CisJCQlkZWNfY291bnQoZGlyKTsKKwkJfQorCX0KKwlyZXR1cm4gZXJyOworfQorCisvKgorICogQW55Ym9keSBjYW4gcmVuYW1lIGFueXRoaW5nIHdpdGggdGhpczogdGhlIHBlcm1pc3Npb24gY2hlY2tzIGFyZSBsZWZ0IHRvIHRoZQorICogaGlnaGVyLWxldmVsIHJvdXRpbmVzLgorICovCitzdGF0aWMgaW50IHN5c3ZfcmVuYW1lKHN0cnVjdCBpbm9kZSAqIG9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKiBvbGRfZGVudHJ5LAorCQkgIHN0cnVjdCBpbm9kZSAqIG5ld19kaXIsIHN0cnVjdCBkZW50cnkgKiBuZXdfZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqIG9sZF9pbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICogbmV3X2lub2RlID0gbmV3X2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgcGFnZSAqIGRpcl9wYWdlID0gTlVMTDsKKwlzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkgKiBkaXJfZGUgPSBOVUxMOworCXN0cnVjdCBwYWdlICogb2xkX3BhZ2U7CisJc3RydWN0IHN5c3ZfZGlyX2VudHJ5ICogb2xkX2RlOworCWludCBlcnIgPSAtRU5PRU5UOworCisJb2xkX2RlID0gc3lzdl9maW5kX2VudHJ5KG9sZF9kZW50cnksICZvbGRfcGFnZSk7CisJaWYgKCFvbGRfZGUpCisJCWdvdG8gb3V0OworCisJaWYgKFNfSVNESVIob2xkX2lub2RlLT5pX21vZGUpKSB7CisJCWVyciA9IC1FSU87CisJCWRpcl9kZSA9IHN5c3ZfZG90ZG90KG9sZF9pbm9kZSwgJmRpcl9wYWdlKTsKKwkJaWYgKCFkaXJfZGUpCisJCQlnb3RvIG91dF9vbGQ7CisJfQorCisJaWYgKG5ld19pbm9kZSkgeworCQlzdHJ1Y3QgcGFnZSAqIG5ld19wYWdlOworCQlzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkgKiBuZXdfZGU7CisKKwkJZXJyID0gLUVOT1RFTVBUWTsKKwkJaWYgKGRpcl9kZSAmJiAhc3lzdl9lbXB0eV9kaXIobmV3X2lub2RlKSkKKwkJCWdvdG8gb3V0X2RpcjsKKworCQllcnIgPSAtRU5PRU5UOworCQluZXdfZGUgPSBzeXN2X2ZpbmRfZW50cnkobmV3X2RlbnRyeSwgJm5ld19wYWdlKTsKKwkJaWYgKCFuZXdfZGUpCisJCQlnb3RvIG91dF9kaXI7CisJCWluY19jb3VudChvbGRfaW5vZGUpOworCQlzeXN2X3NldF9saW5rKG5ld19kZSwgbmV3X3BhZ2UsIG9sZF9pbm9kZSk7CisJCW5ld19pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJCWlmIChkaXJfZGUpCisJCQluZXdfaW5vZGUtPmlfbmxpbmstLTsKKwkJZGVjX2NvdW50KG5ld19pbm9kZSk7CisJfSBlbHNlIHsKKwkJaWYgKGRpcl9kZSkgeworCQkJZXJyID0gLUVNTElOSzsKKwkJCWlmIChuZXdfZGlyLT5pX25saW5rID49IFNZU1ZfU0IobmV3X2Rpci0+aV9zYiktPnNfbGlua19tYXgpCisJCQkJZ290byBvdXRfZGlyOworCQl9CisJCWluY19jb3VudChvbGRfaW5vZGUpOworCQllcnIgPSBzeXN2X2FkZF9saW5rKG5ld19kZW50cnksIG9sZF9pbm9kZSk7CisJCWlmIChlcnIpIHsKKwkJCWRlY19jb3VudChvbGRfaW5vZGUpOworCQkJZ290byBvdXRfZGlyOworCQl9CisJCWlmIChkaXJfZGUpCisJCQlpbmNfY291bnQobmV3X2Rpcik7CisJfQorCisJc3lzdl9kZWxldGVfZW50cnkob2xkX2RlLCBvbGRfcGFnZSk7CisJZGVjX2NvdW50KG9sZF9pbm9kZSk7CisKKwlpZiAoZGlyX2RlKSB7CisJCXN5c3Zfc2V0X2xpbmsoZGlyX2RlLCBkaXJfcGFnZSwgbmV3X2Rpcik7CisJCWRlY19jb3VudChvbGRfZGlyKTsKKwl9CisJcmV0dXJuIDA7CisKK291dF9kaXI6CisJaWYgKGRpcl9kZSkgeworCQlrdW5tYXAoZGlyX3BhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UoZGlyX3BhZ2UpOworCX0KK291dF9vbGQ6CisJa3VubWFwKG9sZF9wYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2Uob2xkX3BhZ2UpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBkaXJlY3RvcmllcyBjYW4gaGFuZGxlIG1vc3Qgb3BlcmF0aW9ucy4uLgorICovCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzeXN2X2Rpcl9pbm9kZV9vcGVyYXRpb25zID0geworCS5jcmVhdGUJCT0gc3lzdl9jcmVhdGUsCisJLmxvb2t1cAkJPSBzeXN2X2xvb2t1cCwKKwkubGluawkJPSBzeXN2X2xpbmssCisJLnVubGluawkJPSBzeXN2X3VubGluaywKKwkuc3ltbGluawk9IHN5c3Zfc3ltbGluaywKKwkubWtkaXIJCT0gc3lzdl9ta2RpciwKKwkucm1kaXIJCT0gc3lzdl9ybWRpciwKKwkubWtub2QJCT0gc3lzdl9ta25vZCwKKwkucmVuYW1lCQk9IHN5c3ZfcmVuYW1lLAorCS5nZXRhdHRyCT0gc3lzdl9nZXRhdHRyLAorfTsKZGlmZiAtLWdpdCBhL2ZzL3N5c3Yvc3VwZXIuYyBiL2ZzL3N5c3Yvc3VwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWU3NmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvc3lzdi9zdXBlci5jCkBAIC0wLDAgKzEsNTcyIEBACisvKgorICogIGxpbnV4L2ZzL3N5c3YvaW5vZGUuYworICoKKyAqICBtaW5peC9pbm9kZS5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICB4ZW5peC9pbm9kZS5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyICBEb3VnIEV2YW5zCisgKgorICogIGNvaC9pbm9kZS5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkzICBQYXNjYWwgSGFpYmxlLCBCcnVubyBIYWlibGUKKyAqCisgKiAgc3lzdi9pbm9kZS5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkzICBQYXVsIEIuIE1vbmRheQorICoKKyAqICBzeXN2L2lub2RlLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTMgIEJydW5vIEhhaWJsZQorICogIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCAgS3J6eXN6dG9mIEcuIEJhcmFub3dza2kKKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgZm9yIHJlYWQvcGFyc2luZyB0aGUgc3VwZXJibG9jay4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgInN5c3YuaCIKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRyeSB0byByZWNvZ25pemUgc3BlY2lmaWMgZmlsZXN5c3RlbXMuCisgKgorICogV2UgcmVjb2duaXplOgorICogLSBYZW5peCBGUyBieSBpdHMgbWFnaWMgbnVtYmVyLgorICogLSBTeXN0ZW1WIEZTIGJ5IGl0cyBtYWdpYyBudW1iZXIuCisgKiAtIENvaGVyZW50IEZTIGJ5IGl0cyBmdW5ueSBmbmFtZS9mcGFjayBmaWVsZC4KKyAqIC0gU0NPIEFGUyBieSBzX25mcmVlID09IDB4ZmZmZgorICogLSBWNyBGUyBoYXMgbm8gZGlzdGluZ3Vpc2hpbmcgZmVhdHVyZXMuCisgKgorICogV2UgZGlzY3JpbWluYXRlIGFtb25nIFN5c3RlbVY0IGFuZCBTeXN0ZW1WMiBGUyBieSB0aGUgYXNzdW1wdGlvbiB0aGF0CisgKiB0aGUgdGltZSBzdGFtcCBpcyBub3QgPCAwMS0wMS0xOTgwLgorICovCisKK2VudW0geworCUpBTl8xXzE5ODAgPSAoMTAqMzY1ICsgMikgKiAyNCAqIDYwICogNjAKK307CisKK3N0YXRpYyB2b2lkIGRldGVjdGVkX3hlbml4KHN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMSA9IHNiaS0+c19iaDE7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDIgPSBzYmktPnNfYmgyOworCXN0cnVjdCB4ZW5peF9zdXBlcl9ibG9jayAqIHNiZDE7CisJc3RydWN0IHhlbml4X3N1cGVyX2Jsb2NrICogc2JkMjsKKworCWlmIChiaDEgIT0gYmgyKQorCQlzYmQxID0gc2JkMiA9IChzdHJ1Y3QgeGVuaXhfc3VwZXJfYmxvY2sgKikgYmgxLT5iX2RhdGE7CisJZWxzZSB7CisJCS8qIGJsb2NrIHNpemUgPSA1MTIsIHNvIGJoMSAhPSBiaDIgKi8KKwkJc2JkMSA9IChzdHJ1Y3QgeGVuaXhfc3VwZXJfYmxvY2sgKikgYmgxLT5iX2RhdGE7CisJCXNiZDIgPSAoc3RydWN0IHhlbml4X3N1cGVyX2Jsb2NrICopIChiaDItPmJfZGF0YSAtIDUxMik7CisJfQorCisJc2JpLT5zX2xpbmtfbWF4ID0gWEVOSVhfTElOS19NQVg7CisJc2JpLT5zX2ZpY19zaXplID0gWEVOSVhfTklDSU5PRDsKKwlzYmktPnNfZmxjX3NpemUgPSBYRU5JWF9OSUNGUkVFOworCXNiaS0+c19zYmQxID0gKGNoYXIgKilzYmQxOworCXNiaS0+c19zYmQyID0gKGNoYXIgKilzYmQyOworCXNiaS0+c19zYl9maWNfY291bnQgPSAmc2JkMS0+c19uaW5vZGU7CisJc2JpLT5zX3NiX2ZpY19pbm9kZXMgPSAmc2JkMS0+c19pbm9kZVswXTsKKwlzYmktPnNfc2JfdG90YWxfZnJlZV9pbm9kZXMgPSAmc2JkMi0+c190aW5vZGU7CisJc2JpLT5zX2JjYWNoZV9jb3VudCA9ICZzYmQxLT5zX25mcmVlOworCXNiaS0+c19iY2FjaGUgPSAmc2JkMS0+c19mcmVlWzBdOworCXNiaS0+c19mcmVlX2Jsb2NrcyA9ICZzYmQyLT5zX3RmcmVlOworCXNiaS0+c19zYl90aW1lID0gJnNiZDItPnNfdGltZTsKKwlzYmktPnNfZmlyc3RkYXRhem9uZSA9IGZzMTZfdG9fY3B1KHNiaSwgc2JkMS0+c19pc2l6ZSk7CisJc2JpLT5zX256b25lcyA9IGZzMzJfdG9fY3B1KHNiaSwgc2JkMS0+c19mc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRldGVjdGVkX3N5c3Y0KHN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSkKK3sKKwlzdHJ1Y3Qgc3lzdjRfc3VwZXJfYmxvY2sgKiBzYmQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDEgPSBzYmktPnNfYmgxOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgyID0gc2JpLT5zX2JoMjsKKworCWlmIChiaDEgPT0gYmgyKQorCQlzYmQgPSAoc3RydWN0IHN5c3Y0X3N1cGVyX2Jsb2NrICopIChiaDEtPmJfZGF0YSArIEJMT0NLX1NJWkUvMik7CisJZWxzZQorCQlzYmQgPSAoc3RydWN0IHN5c3Y0X3N1cGVyX2Jsb2NrICopIGJoMi0+Yl9kYXRhOworCisJc2JpLT5zX2xpbmtfbWF4ID0gU1lTVl9MSU5LX01BWDsKKwlzYmktPnNfZmljX3NpemUgPSBTWVNWX05JQ0lOT0Q7CisJc2JpLT5zX2ZsY19zaXplID0gU1lTVl9OSUNGUkVFOworCXNiaS0+c19zYmQxID0gKGNoYXIgKilzYmQ7CisJc2JpLT5zX3NiZDIgPSAoY2hhciAqKXNiZDsKKwlzYmktPnNfc2JfZmljX2NvdW50ID0gJnNiZC0+c19uaW5vZGU7CisJc2JpLT5zX3NiX2ZpY19pbm9kZXMgPSAmc2JkLT5zX2lub2RlWzBdOworCXNiaS0+c19zYl90b3RhbF9mcmVlX2lub2RlcyA9ICZzYmQtPnNfdGlub2RlOworCXNiaS0+c19iY2FjaGVfY291bnQgPSAmc2JkLT5zX25mcmVlOworCXNiaS0+c19iY2FjaGUgPSAmc2JkLT5zX2ZyZWVbMF07CisJc2JpLT5zX2ZyZWVfYmxvY2tzID0gJnNiZC0+c190ZnJlZTsKKwlzYmktPnNfc2JfdGltZSA9ICZzYmQtPnNfdGltZTsKKwlzYmktPnNfc2Jfc3RhdGUgPSAmc2JkLT5zX3N0YXRlOworCXNiaS0+c19maXJzdGRhdGF6b25lID0gZnMxNl90b19jcHUoc2JpLCBzYmQtPnNfaXNpemUpOworCXNiaS0+c19uem9uZXMgPSBmczMyX3RvX2NwdShzYmksIHNiZC0+c19mc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRldGVjdGVkX3N5c3YyKHN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSkKK3sKKwlzdHJ1Y3Qgc3lzdjJfc3VwZXJfYmxvY2sgKnNiZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMSA9IHNiaS0+c19iaDE7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDIgPSBzYmktPnNfYmgyOworCisJaWYgKGJoMSA9PSBiaDIpCisJCXNiZCA9IChzdHJ1Y3Qgc3lzdjJfc3VwZXJfYmxvY2sgKikgKGJoMS0+Yl9kYXRhICsgQkxPQ0tfU0laRS8yKTsKKwllbHNlCisJCXNiZCA9IChzdHJ1Y3Qgc3lzdjJfc3VwZXJfYmxvY2sgKikgYmgyLT5iX2RhdGE7CisKKwlzYmktPnNfbGlua19tYXggPSBTWVNWX0xJTktfTUFYOworCXNiaS0+c19maWNfc2l6ZSA9IFNZU1ZfTklDSU5PRDsKKwlzYmktPnNfZmxjX3NpemUgPSBTWVNWX05JQ0ZSRUU7CisJc2JpLT5zX3NiZDEgPSAoY2hhciAqKXNiZDsKKwlzYmktPnNfc2JkMiA9IChjaGFyICopc2JkOworCXNiaS0+c19zYl9maWNfY291bnQgPSAmc2JkLT5zX25pbm9kZTsKKwlzYmktPnNfc2JfZmljX2lub2RlcyA9ICZzYmQtPnNfaW5vZGVbMF07CisJc2JpLT5zX3NiX3RvdGFsX2ZyZWVfaW5vZGVzID0gJnNiZC0+c190aW5vZGU7CisJc2JpLT5zX2JjYWNoZV9jb3VudCA9ICZzYmQtPnNfbmZyZWU7CisJc2JpLT5zX2JjYWNoZSA9ICZzYmQtPnNfZnJlZVswXTsKKwlzYmktPnNfZnJlZV9ibG9ja3MgPSAmc2JkLT5zX3RmcmVlOworCXNiaS0+c19zYl90aW1lID0gJnNiZC0+c190aW1lOworCXNiaS0+c19zYl9zdGF0ZSA9ICZzYmQtPnNfc3RhdGU7CisJc2JpLT5zX2ZpcnN0ZGF0YXpvbmUgPSBmczE2X3RvX2NwdShzYmksIHNiZC0+c19pc2l6ZSk7CisJc2JpLT5zX256b25lcyA9IGZzMzJfdG9fY3B1KHNiaSwgc2JkLT5zX2ZzaXplKTsKK30KKworc3RhdGljIHZvaWQgZGV0ZWN0ZWRfY29oZXJlbnQoc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpKQoreworCXN0cnVjdCBjb2hfc3VwZXJfYmxvY2sgKiBzYmQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDEgPSBzYmktPnNfYmgxOworCisJc2JkID0gKHN0cnVjdCBjb2hfc3VwZXJfYmxvY2sgKikgYmgxLT5iX2RhdGE7CisKKwlzYmktPnNfbGlua19tYXggPSBDT0hfTElOS19NQVg7CisJc2JpLT5zX2ZpY19zaXplID0gQ09IX05JQ0lOT0Q7CisJc2JpLT5zX2ZsY19zaXplID0gQ09IX05JQ0ZSRUU7CisJc2JpLT5zX3NiZDEgPSAoY2hhciAqKXNiZDsKKwlzYmktPnNfc2JkMiA9IChjaGFyICopc2JkOworCXNiaS0+c19zYl9maWNfY291bnQgPSAmc2JkLT5zX25pbm9kZTsKKwlzYmktPnNfc2JfZmljX2lub2RlcyA9ICZzYmQtPnNfaW5vZGVbMF07CisJc2JpLT5zX3NiX3RvdGFsX2ZyZWVfaW5vZGVzID0gJnNiZC0+c190aW5vZGU7CisJc2JpLT5zX2JjYWNoZV9jb3VudCA9ICZzYmQtPnNfbmZyZWU7CisJc2JpLT5zX2JjYWNoZSA9ICZzYmQtPnNfZnJlZVswXTsKKwlzYmktPnNfZnJlZV9ibG9ja3MgPSAmc2JkLT5zX3RmcmVlOworCXNiaS0+c19zYl90aW1lID0gJnNiZC0+c190aW1lOworCXNiaS0+c19maXJzdGRhdGF6b25lID0gZnMxNl90b19jcHUoc2JpLCBzYmQtPnNfaXNpemUpOworCXNiaS0+c19uem9uZXMgPSBmczMyX3RvX2NwdShzYmksIHNiZC0+c19mc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRldGVjdGVkX3Y3KHN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMiA9IHNiaS0+c19iaDI7CisJc3RydWN0IHY3X3N1cGVyX2Jsb2NrICpzYmQgPSAoc3RydWN0IHY3X3N1cGVyX2Jsb2NrICopYmgyLT5iX2RhdGE7CisKKwlzYmktPnNfbGlua19tYXggPSBWN19MSU5LX01BWDsKKwlzYmktPnNfZmljX3NpemUgPSBWN19OSUNJTk9EOworCXNiaS0+c19mbGNfc2l6ZSA9IFY3X05JQ0ZSRUU7CisJc2JpLT5zX3NiZDEgPSAoY2hhciAqKXNiZDsKKwlzYmktPnNfc2JkMiA9IChjaGFyICopc2JkOworCXNiaS0+c19zYl9maWNfY291bnQgPSAmc2JkLT5zX25pbm9kZTsKKwlzYmktPnNfc2JfZmljX2lub2RlcyA9ICZzYmQtPnNfaW5vZGVbMF07CisJc2JpLT5zX3NiX3RvdGFsX2ZyZWVfaW5vZGVzID0gJnNiZC0+c190aW5vZGU7CisJc2JpLT5zX2JjYWNoZV9jb3VudCA9ICZzYmQtPnNfbmZyZWU7CisJc2JpLT5zX2JjYWNoZSA9ICZzYmQtPnNfZnJlZVswXTsKKwlzYmktPnNfZnJlZV9ibG9ja3MgPSAmc2JkLT5zX3RmcmVlOworCXNiaS0+c19zYl90aW1lID0gJnNiZC0+c190aW1lOworCXNiaS0+c19maXJzdGRhdGF6b25lID0gZnMxNl90b19jcHUoc2JpLCBzYmQtPnNfaXNpemUpOworCXNiaS0+c19uem9uZXMgPSBmczMyX3RvX2NwdShzYmksIHNiZC0+c19mc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgZGV0ZWN0X3hlbml4KHN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3QgeGVuaXhfc3VwZXJfYmxvY2sgKnNiZCA9IChzdHJ1Y3QgeGVuaXhfc3VwZXJfYmxvY2sgKiliaC0+Yl9kYXRhOworCWlmICgqKF9fbGUzMiAqKSZzYmQtPnNfbWFnaWMgPT0gY3B1X3RvX2xlMzIoMHgyYjU1NDQpKQorCQlzYmktPnNfYnl0ZXNleCA9IEJZVEVTRVhfTEU7CisJZWxzZSBpZiAoKihfX2JlMzIgKikmc2JkLT5zX21hZ2ljID09IGNwdV90b19iZTMyKDB4MmI1NTQ0KSkKKwkJc2JpLT5zX2J5dGVzZXggPSBCWVRFU0VYX0JFOworCWVsc2UKKwkJcmV0dXJuIDA7CisJc3dpdGNoIChmczMyX3RvX2NwdShzYmksIHNiZC0+c190eXBlKSkgeworCWNhc2UgMToKKwkJc2JpLT5zX3R5cGUgPSBGU1RZUEVfWEVOSVg7CisJCXJldHVybiAxOworCWNhc2UgMjoKKwkJc2JpLT5zX3R5cGUgPSBGU1RZUEVfWEVOSVg7CisJCXJldHVybiAyOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCBkZXRlY3Rfc3lzdihzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmksIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHNiaS0+c19zYjsKKwkvKiBBbGwgcmVsZXZhbnQgZmllbGRzIGFyZSBhdCB0aGUgc2FtZSBvZmZzZXRzIGluIFIyIGFuZCBSNCAqLworCXN0cnVjdCBzeXN2NF9zdXBlcl9ibG9jayAqIHNiZDsKKwl1MzIgdHlwZTsKKworCXNiZCA9IChzdHJ1Y3Qgc3lzdjRfc3VwZXJfYmxvY2sgKikgKGJoLT5iX2RhdGEgKyBCTE9DS19TSVpFLzIpOworCWlmICgqKF9fbGUzMiAqKSZzYmQtPnNfbWFnaWMgPT0gY3B1X3RvX2xlMzIoMHhmZDE4N2UyMCkpCisJCXNiaS0+c19ieXRlc2V4ID0gQllURVNFWF9MRTsKKwllbHNlIGlmICgqKF9fYmUzMiAqKSZzYmQtPnNfbWFnaWMgPT0gY3B1X3RvX2JlMzIoMHhmZDE4N2UyMCkpCisJCXNiaS0+c19ieXRlc2V4ID0gQllURVNFWF9CRTsKKwllbHNlCisJCXJldHVybiAwOworCisJdHlwZSA9IGZzMzJfdG9fY3B1KHNiaSwgc2JkLT5zX3R5cGUpOworIAorIAlpZiAoZnMxNl90b19jcHUoc2JpLCBzYmQtPnNfbmZyZWUpID09IDB4ZmZmZikgeworIAkJc2JpLT5zX3R5cGUgPSBGU1RZUEVfQUZTOworCQlzYmktPnNfZm9yY2VkX3JvID0gMTsKKyAJCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworIAkJCXByaW50aygiU3lzViBGUzogU0NPIEVBRlMgb24gJXMgZGV0ZWN0ZWQsICIgCisgCQkJCSJmb3JjaW5nIHJlYWQtb25seSBtb2RlLlxuIiwgCisgCQkJCXNiLT5zX2lkKTsKKyAJCX0KKyAJCXJldHVybiB0eXBlOworIAl9CisgCisJaWYgKGZzMzJfdG9fY3B1KHNiaSwgc2JkLT5zX3RpbWUpIDwgSkFOXzFfMTk4MCkgeworCQkvKiB0aGlzIGlzIGxpa2VseSB0byBoYXBwZW4gb24gU3lzdGVtVjIgRlMgKi8KKwkJaWYgKHR5cGUgPiAzIHx8IHR5cGUgPCAxKQorCQkJcmV0dXJuIDA7CisJCXNiaS0+c190eXBlID0gRlNUWVBFX1NZU1YyOworCQlyZXR1cm4gdHlwZTsKKwl9CisJaWYgKCh0eXBlID4gMyB8fCB0eXBlIDwgMSkgJiYgKHR5cGUgPiAweDMwIHx8IHR5cGUgPCAweDEwKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBPbiBJbnRlcmFjdGl2ZSBVbml4IChJU0MpIFZlcnNpb24gNC4wLzMueCBzX3R5cGUgZmllbGQgPSAweDEwLAorCSAgIDB4MjAgb3IgMHgzMCBpbmRpY2F0ZXMgdGhhdCBzeW1ib2xpYyBsaW5rcyBhbmQgdGhlIDE0LWNoYXJhY3RlcgorCSAgIGZpbGVuYW1lIGxpbWl0IGlzIGdvbmUuIER1ZSB0byBsYWNrIG9mIGluZm9ybWF0aW9uIGFib3V0IHRoaXMKKyAgICAgICAgICAgZmVhdHVyZSByZWFkLW9ubHkgbW9kZSBzZWVtcyB0byBiZSBhIHJlYXNvbmFibGUgYXBwcm9hY2guLi4gLUtHQiAqLworCisJaWYgKHR5cGUgPj0gMHgxMCkgeworCQlwcmludGsoIlN5c1YgRlM6IGNhbid0IGhhbmRsZSBsb25nIGZpbGUgbmFtZXMgb24gJXMsICIKKwkJICAgICAgICJmb3JjaW5nIHJlYWQtb25seSBtb2RlLlxuIiwgc2ItPnNfaWQpOworCQlzYmktPnNfZm9yY2VkX3JvID0gMTsKKwl9CisKKwlzYmktPnNfdHlwZSA9IEZTVFlQRV9TWVNWNDsKKwlyZXR1cm4gdHlwZSA+PSAweDEwID8gdHlwZSA+PiA0IDogdHlwZTsKK30KKworc3RhdGljIGludCBkZXRlY3RfY29oZXJlbnQoc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBjb2hfc3VwZXJfYmxvY2sgKiBzYmQ7CisKKwlzYmQgPSAoc3RydWN0IGNvaF9zdXBlcl9ibG9jayAqKSAoYmgtPmJfZGF0YSArIEJMT0NLX1NJWkUvMik7CisJaWYgKChtZW1jbXAoc2JkLT5zX2ZuYW1lLCJub25hbWUiLDYpICYmIG1lbWNtcChzYmQtPnNfZm5hbWUsInh4eHh4ICIsNikpCisJICAgIHx8IChtZW1jbXAoc2JkLT5zX2ZwYWNrLCJub3BhY2siLDYpICYmIG1lbWNtcChzYmQtPnNfZnBhY2ssInh4eHh4XG4iLDYpKSkKKwkJcmV0dXJuIDA7CisJc2JpLT5zX2J5dGVzZXggPSBCWVRFU0VYX1BEUDsKKwlzYmktPnNfdHlwZSA9IEZTVFlQRV9DT0g7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZGV0ZWN0X3N5c3Zfb2RkKHN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpbnQgc2l6ZSA9IGRldGVjdF9zeXN2KHNiaSwgYmgpOworCisJcmV0dXJuIHNpemU+MiA/IDAgOiBzaXplOworfQorCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgYmxvY2s7CisJaW50ICgqdGVzdCkoc3RydWN0IHN5c3Zfc2JfaW5mbyAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7Cit9IGZsYXZvdXJzW10gPSB7CisJezEsIGRldGVjdF94ZW5peH0sCisJezAsIGRldGVjdF9zeXN2fSwKKwl7MCwgZGV0ZWN0X2NvaGVyZW50fSwKKwl7OSwgZGV0ZWN0X3N5c3Zfb2RkfSwKKwl7MTUsZGV0ZWN0X3N5c3Zfb2RkfSwKKwl7MTgsZGV0ZWN0X3N5c3Z9LAorfTsKKworc3RhdGljIGNoYXIgKmZsYXZvdXJfbmFtZXNbXSA9IHsKKwlbRlNUWVBFX1hFTklYXQk9ICJYZW5peCIsCisJW0ZTVFlQRV9TWVNWNF0JPSAiU3lzdGVtViIsCisJW0ZTVFlQRV9TWVNWMl0JPSAiU3lzdGVtViBSZWxlYXNlIDIiLAorCVtGU1RZUEVfQ09IXQk9ICJDb2hlcmVudCIsCisJW0ZTVFlQRV9WN10JPSAiVjciLAorCVtGU1RZUEVfQUZTXQk9ICJBRlMiLAorfTsKKworc3RhdGljIHZvaWQgKCpmbGF2b3VyX3NldHVwW10pKHN0cnVjdCBzeXN2X3NiX2luZm8gKikgPSB7CisJW0ZTVFlQRV9YRU5JWF0JPSBkZXRlY3RlZF94ZW5peCwKKwlbRlNUWVBFX1NZU1Y0XQk9IGRldGVjdGVkX3N5c3Y0LAorCVtGU1RZUEVfU1lTVjJdCT0gZGV0ZWN0ZWRfc3lzdjIsCisJW0ZTVFlQRV9DT0hdCT0gZGV0ZWN0ZWRfY29oZXJlbnQsCisJW0ZTVFlQRV9WN10JPSBkZXRlY3RlZF92NywKKwlbRlNUWVBFX0FGU10JPSBkZXRlY3RlZF9zeXN2NCwKK307CisKK3N0YXRpYyBpbnQgY29tcGxldGVfcmVhZF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgc2lsZW50LCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmkgPSBTWVNWX1NCKHNiKTsKKwlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGU7CisJY2hhciAqZm91bmQgPSBmbGF2b3VyX25hbWVzW3NiaS0+c190eXBlXTsKKwl1X2NoYXIgbl9iaXRzID0gc2l6ZSs4OworCWludCBic2l6ZSA9IDEgPDwgbl9iaXRzOworCWludCBic2l6ZV80ID0gYnNpemUgPj4gMjsKKworCXNiaS0+c19maXJzdGlub2Rlem9uZSA9IDI7CisKKwlmbGF2b3VyX3NldHVwW3NiaS0+c190eXBlXShzYmkpOworCQorCXNiaS0+c190cnVuY2F0ZSA9IDE7CisJc2JpLT5zX25kYXRhem9uZXMgPSBzYmktPnNfbnpvbmVzIC0gc2JpLT5zX2ZpcnN0ZGF0YXpvbmU7CisJc2JpLT5zX2lub2Rlc19wZXJfYmxvY2sgPSBic2l6ZSA+PiA2OworCXNiaS0+c19pbm9kZXNfcGVyX2Jsb2NrXzEgPSAoYnNpemUgPj4gNiktMTsKKwlzYmktPnNfaW5vZGVzX3Blcl9ibG9ja19iaXRzID0gbl9iaXRzLTY7CisJc2JpLT5zX2luZF9wZXJfYmxvY2sgPSBic2l6ZV80OworCXNiaS0+c19pbmRfcGVyX2Jsb2NrXzIgPSBic2l6ZV80KmJzaXplXzQ7CisJc2JpLT5zX3Rvb2JpZ19ibG9jayA9IDEwICsgYnNpemVfNCAqICgxICsgYnNpemVfNCAqICgxICsgYnNpemVfNCkpOworCXNiaS0+c19pbmRfcGVyX2Jsb2NrX2JpdHMgPSBuX2JpdHMtMjsKKworCXNiaS0+c19uaW5vZGVzID0gKHNiaS0+c19maXJzdGRhdGF6b25lIC0gc2JpLT5zX2ZpcnN0aW5vZGV6b25lKQorCQk8PCBzYmktPnNfaW5vZGVzX3Blcl9ibG9ja19iaXRzOworCisJaWYgKCFzaWxlbnQpCisJCXByaW50aygiVkZTOiBGb3VuZCBhICVzIEZTIChibG9jayBzaXplID0gJWxkKSBvbiBkZXZpY2UgJXNcbiIsCisJCSAgICAgICBmb3VuZCwgc2ItPnNfYmxvY2tzaXplLCBzYi0+c19pZCk7CisKKwlzYi0+c19tYWdpYyA9IFNZU1ZfTUFHSUNfQkFTRSArIHNiaS0+c190eXBlOworCS8qIHNldCB1cCBlbm91Z2ggc28gdGhhdCBpdCBjYW4gcmVhZCBhbiBpbm9kZSAqLworCXNiLT5zX29wID0gJnN5c3Zfc29wczsKKwlyb290X2lub2RlID0gaWdldChzYixTWVNWX1JPT1RfSU5PKTsKKwlpZiAoIXJvb3RfaW5vZGUgfHwgaXNfYmFkX2lub2RlKHJvb3RfaW5vZGUpKSB7CisJCXByaW50aygiU3lzViBGUzogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdF9pbm9kZSk7CisJaWYgKCFzYi0+c19yb290KSB7CisJCWlwdXQocm9vdF9pbm9kZSk7CisJCXByaW50aygiU3lzViBGUzogZ2V0IHJvb3QgZGVudHJ5IGZhaWxlZFxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoc2JpLT5zX2ZvcmNlZF9ybykKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCWlmIChzYmktPnNfdHJ1bmNhdGUpCisJCXNiLT5zX3Jvb3QtPmRfb3AgPSAmc3lzdl9kZW50cnlfb3BlcmF0aW9uczsKKwlzYi0+c19kaXJ0ID0gMTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzeXN2X2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMSwgKmJoID0gTlVMTDsKKwlzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmk7CisJdW5zaWduZWQgbG9uZyBibG9ja25yOworCWludCBzaXplID0gMCwgaTsKKwkKKwlpZiAoMTAyNCAhPSBzaXplb2YgKHN0cnVjdCB4ZW5peF9zdXBlcl9ibG9jaykpCisJCXBhbmljKCJYZW5peCBGUzogYmFkIHN1cGVyYmxvY2sgc2l6ZSIpOworCWlmICg1MTIgIT0gc2l6ZW9mIChzdHJ1Y3Qgc3lzdjRfc3VwZXJfYmxvY2spKQorCQlwYW5pYygiU3lzdGVtViBGUzogYmFkIHN1cGVyYmxvY2sgc2l6ZSIpOworCWlmICg1MTIgIT0gc2l6ZW9mIChzdHJ1Y3Qgc3lzdjJfc3VwZXJfYmxvY2spKQorCQlwYW5pYygiU3lzdGVtViBGUzogYmFkIHN1cGVyYmxvY2sgc2l6ZSIpOworCWlmICg1MDAgIT0gc2l6ZW9mIChzdHJ1Y3QgY29oX3N1cGVyX2Jsb2NrKSkKKwkJcGFuaWMoIkNvaGVyZW50IEZTOiBiYWQgc3VwZXJibG9jayBzaXplIik7CisJaWYgKDY0ICE9IHNpemVvZiAoc3RydWN0IHN5c3ZfaW5vZGUpKQorCQlwYW5pYygic3lzdiBmczogYmFkIGlub2RlIHNpemUiKTsKKworCXNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzeXN2X3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNiaSkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKHN0cnVjdCBzeXN2X3NiX2luZm8pKTsKKworCXNiaS0+c19zYiA9IHNiOworCXNiaS0+c19ibG9ja19iYXNlID0gMDsKKwlzYi0+c19mc19pbmZvID0gc2JpOworCQorCXNiX3NldF9ibG9ja3NpemUoc2IsIEJMT0NLX1NJWkUpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihmbGF2b3Vycykvc2l6ZW9mKGZsYXZvdXJzWzBdKSAmJiAhc2l6ZTsgaSsrKSB7CisJCWJyZWxzZShiaCk7CisJCWJoID0gc2JfYnJlYWQoc2IsIGZsYXZvdXJzW2ldLmJsb2NrKTsKKwkJaWYgKCFiaCkKKwkJCWNvbnRpbnVlOworCQlzaXplID0gZmxhdm91cnNbaV0udGVzdChTWVNWX1NCKHNiKSwgYmgpOworCX0KKworCWlmICghc2l6ZSkKKwkJZ290byBFdW5rbm93bjsKKworCXN3aXRjaCAoc2l6ZSkgeworCQljYXNlIDE6CisJCQlibG9ja25yID0gYmgtPmJfYmxvY2tuciA8PCAxOworCQkJYnJlbHNlKGJoKTsKKwkJCXNiX3NldF9ibG9ja3NpemUoc2IsIDUxMik7CisJCQliaDEgPSBzYl9icmVhZChzYiwgYmxvY2tucik7CisJCQliaCA9IHNiX2JyZWFkKHNiLCBibG9ja25yICsgMSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJYmgxID0gYmg7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJYmxvY2tuciA9IGJoLT5iX2Jsb2NrbnIgPj4gMTsKKwkJCWJyZWxzZShiaCk7CisJCQlzYl9zZXRfYmxvY2tzaXplKHNiLCAyMDQ4KTsKKwkJCWJoMSA9IGJoID0gc2JfYnJlYWQoc2IsIGJsb2NrbnIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIEViYWRzaXplOworCX0KKworCWlmIChiaCAmJiBiaDEpIHsKKwkJc2JpLT5zX2JoMSA9IGJoMTsKKwkJc2JpLT5zX2JoMiA9IGJoOworCQlpZiAoY29tcGxldGVfcmVhZF9zdXBlcihzYiwgc2lsZW50LCBzaXplKSkKKwkJCXJldHVybiAwOworCX0KKworCWJyZWxzZShiaDEpOworCWJyZWxzZShiaCk7CisJc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgQkxPQ0tfU0laRSk7CisJcHJpbnRrKCJvbGRmczogY2Fubm90IHJlYWQgc3VwZXJibG9ja1xuIik7CitmYWlsZWQ6CisJa2ZyZWUoc2JpKTsKKwlyZXR1cm4gLUVJTlZBTDsKKworRXVua25vd246CisJYnJlbHNlKGJoKTsKKwlpZiAoIXNpbGVudCkKKwkJcHJpbnRrKCJWRlM6IHVuYWJsZSB0byBmaW5kIG9sZGZzIHN1cGVyYmxvY2sgb24gZGV2aWNlICVzXG4iLAorCQkJc2ItPnNfaWQpOworCWdvdG8gZmFpbGVkOworRWJhZHNpemU6CisJYnJlbHNlKGJoKTsKKwlpZiAoIXNpbGVudCkKKwkJcHJpbnRrKCJWRlM6IG9sZGZzOiB1bnN1cHBvcnRlZCBibG9jayBzaXplICglZEtiKVxuIiwKKwkJCTE8PChzaXplLTIpKTsKKwlnb3RvIGZhaWxlZDsKK30KKworc3RhdGljIGludCB2N19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpiaDIgPSBOVUxMOworCXN0cnVjdCB2N19zdXBlcl9ibG9jayAqdjdzYjsKKwlzdHJ1Y3Qgc3lzdl9pbm9kZSAqdjdpOworCisJaWYgKDQ0MCAhPSBzaXplb2YgKHN0cnVjdCB2N19zdXBlcl9ibG9jaykpCisJCXBhbmljKCJWNyBGUzogYmFkIHN1cGVyLWJsb2NrIHNpemUiKTsKKwlpZiAoNjQgIT0gc2l6ZW9mIChzdHJ1Y3Qgc3lzdl9pbm9kZSkpCisJCXBhbmljKCJzeXN2IGZzOiBiYWQgaS1ub2RlIHNpemUiKTsKKworCXNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzeXN2X3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNiaSkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKHN0cnVjdCBzeXN2X3NiX2luZm8pKTsKKworCXNiaS0+c19zYiA9IHNiOworCXNiaS0+c19ibG9ja19iYXNlID0gMDsKKwlzYmktPnNfdHlwZSA9IEZTVFlQRV9WNzsKKwlzYmktPnNfYnl0ZXNleCA9IEJZVEVTRVhfUERQOworCXNiLT5zX2ZzX2luZm8gPSBzYmk7CisJCisJc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgNTEyKTsKKworCWlmICgoYmggPSBzYl9icmVhZChzYiwgMSkpID09IE5VTEwpIHsKKwkJaWYgKCFzaWxlbnQpCisJCQlwcmludGsoIlZGUzogdW5hYmxlIHRvIHJlYWQgVjcgRlMgc3VwZXJibG9jayBvbiAiCisJCQkgICAgICAgImRldmljZSAlcy5cbiIsIHNiLT5zX2lkKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJLyogcGxhdXNpYmlsaXR5IGNoZWNrIG9uIHN1cGVyYmxvY2sgKi8KKwl2N3NiID0gKHN0cnVjdCB2N19zdXBlcl9ibG9jayAqKSBiaC0+Yl9kYXRhOworCWlmIChmczE2X3RvX2NwdShzYmksIHY3c2ItPnNfbmZyZWUpID4gVjdfTklDRlJFRSB8fAorCSAgICBmczE2X3RvX2NwdShzYmksIHY3c2ItPnNfbmlub2RlKSA+IFY3X05JQ0lOT0QgfHwKKwkgICAgZnMzMl90b19jcHUoc2JpLCB2N3NiLT5zX3RpbWUpID09IDApCisJCWdvdG8gZmFpbGVkOworCisJLyogcGxhdXNpYmlsaXR5IGNoZWNrIG9uIHJvb3QgaW5vZGU6IGl0IGlzIGEgZGlyZWN0b3J5LAorCSAgIHdpdGggYSBub256ZXJvIHNpemUgdGhhdCBpcyBhIG11bHRpcGxlIG9mIDE2ICovCisJaWYgKChiaDIgPSBzYl9icmVhZChzYiwgMikpID09IE5VTEwpCisJCWdvdG8gZmFpbGVkOworCXY3aSA9IChzdHJ1Y3Qgc3lzdl9pbm9kZSAqKShiaDItPmJfZGF0YSArIDY0KTsKKwlpZiAoKGZzMTZfdG9fY3B1KHNiaSwgdjdpLT5pX21vZGUpICYgfjA3NzcpICE9IFNfSUZESVIgfHwKKwkgICAgKGZzMzJfdG9fY3B1KHNiaSwgdjdpLT5pX3NpemUpID09IDApIHx8CisJICAgIChmczMyX3RvX2NwdShzYmksIHY3aS0+aV9zaXplKSAmIDAxNykgIT0gMCkKKwkJZ290byBmYWlsZWQ7CisJYnJlbHNlKGJoMik7CisJYmgyID0gTlVMTDsKKworCXNiaS0+c19iaDEgPSBiaDsKKwlzYmktPnNfYmgyID0gYmg7CisJaWYgKGNvbXBsZXRlX3JlYWRfc3VwZXIoc2IsIHNpbGVudCwgMSkpCisJCXJldHVybiAwOworCitmYWlsZWQ6CisJYnJlbHNlKGJoMik7CisJYnJlbHNlKGJoKTsKKwlrZnJlZShzYmkpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKiBFdmVyeSBrZXJuZWwgbW9kdWxlIGNvbnRhaW5zIHN0dWZmIGxpa2UgdGhpcy4gKi8KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqc3lzdl9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBzeXN2X2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICp2N19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCB2N19maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHN5c3ZfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInN5c3YiLAorCS5nZXRfc2IJCT0gc3lzdl9nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2Jsb2NrX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB2N19mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAidjciLAorCS5nZXRfc2IJCT0gdjdfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworCitleHRlcm4gaW50IHN5c3ZfaW5pdF9pY2FjaGUodm9pZCkgX19pbml0OworZXh0ZXJuIHZvaWQgc3lzdl9kZXN0cm95X2ljYWNoZSh2b2lkKTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9zeXN2X2ZzKHZvaWQpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBzeXN2X2luaXRfaWNhY2hlKCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKwllcnJvciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnN5c3ZfZnNfdHlwZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGRlc3Ryb3lfaWNhY2hlOworCWVycm9yID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmdjdfZnNfdHlwZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIHVucmVnaXN0ZXI7CisJcmV0dXJuIDA7CisKK3VucmVnaXN0ZXI6CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZzeXN2X2ZzX3R5cGUpOworZGVzdHJveV9pY2FjaGU6CisJc3lzdl9kZXN0cm95X2ljYWNoZSgpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfc3lzdl9mcyh2b2lkKQoreworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmc3lzdl9mc190eXBlKTsKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnY3X2ZzX3R5cGUpOworCXN5c3ZfZGVzdHJveV9pY2FjaGUoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9zeXN2X2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9zeXN2X2ZzKQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvc3lzdi9zeW1saW5rLmMgYi9mcy9zeXN2L3N5bWxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDYzN2RiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3lzdi9zeW1saW5rLmMKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqICBsaW51eC9mcy9zeXN2L3N5bWxpbmsuYworICoKKyAqICBIYW5kbGluZyBvZiBTeXN0ZW0gViBmaWxlc3lzdGVtIGZhc3Qgc3ltbGlua3MgZXh0ZW5zaW9ucy4KKyAqICBBdWcgMjAwMSwgQ2hyaXN0b3BoIEhlbGx3aWcgKGhjaEBpbmZyYWRlYWQub3JnKQorICovCisKKyNpbmNsdWRlICJzeXN2LmgiCisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKworc3RhdGljIGludCBzeXN2X2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJbmRfc2V0X2xpbmsobmQsIChjaGFyICopU1lTVl9JKGRlbnRyeS0+ZF9pbm9kZSktPmlfZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHN5c3ZfZmFzdF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBzeXN2X2ZvbGxvd19saW5rLAorfTsKZGlmZiAtLWdpdCBhL2ZzL3N5c3Yvc3lzdi5oIGIvZnMvc3lzdi9zeXN2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdmOWI0YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3N5c3Yvc3lzdi5oCkBAIC0wLDAgKzEsMjQ0IEBACisjaWZuZGVmIF9TWVNWX0gKKyNkZWZpbmUgX1NZU1ZfSAorCisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKwordHlwZWRlZiBfX3UxNiBfX2JpdHdpc2UgX19mczE2OwordHlwZWRlZiBfX3UzMiBfX2JpdHdpc2UgX19mczMyOworCisjaW5jbHVkZSA8bGludXgvc3lzdl9mcy5oPgorCisvKgorICogU3lzdGVtVi9WNy9Db2hlcmVudCBzdXBlci1ibG9jayBkYXRhIGluIG1lbW9yeQorICoKKyAqIFRoZSBTeXN0ZW1WL1Y3L0NvaGVyZW50IHN1cGVyYmxvY2sgY29udGFpbnMgZHluYW1pYyBkYXRhIChpdCBnZXRzIG1vZGlmaWVkCisgKiB3aGlsZSB0aGUgc3lzdGVtIGlzIHJ1bm5pbmcpLiBUaGlzIGlzIGluIGNvbnRyYXN0IHRvIHRoZSBNaW5peCBhbmQgQmVya2VsZXkKKyAqIGZpbGVzeXN0ZW1zICh3aGVyZSB0aGUgc3VwZXJibG9jayBpcyBuZXZlciBtb2RpZmllZCkuIFRoaXMgYWZmZWN0cyB0aGUKKyAqIHN5bmMoKSBvcGVyYXRpb246IHdlIG11c3Qga2VlcCB0aGUgc3VwZXJibG9jayBpbiBhIGRpc2sgYnVmZmVyIGFuZCB1c2UgdGhpcworICogb25lIGFzIG91ciAid29ya2luZyBjb3B5Ii4KKyAqLworCitzdHJ1Y3Qgc3lzdl9zYl9pbmZvIHsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNfc2I7CS8qIFZGUyBzdXBlcmJsb2NrICovCisJaW50CSAgICAgICBzX3R5cGU7CQkvKiBmaWxlIHN5c3RlbSB0eXBlOiBGU1RZUEVfe1hFTklYfFNZU1Z8Q09IfSAqLworCWNoYXIJICAgICAgIHNfYnl0ZXNleDsJLyogYnl0ZXNleCAobGUvYmUvcGRwKSAqLworCWNoYXIJICAgICAgIHNfdHJ1bmNhdGU7CS8qIGlmIDE6IG5hbWVzID4gU1lTVl9OQU1FTEVOIGNoYXJzIGFyZSB0cnVuY2F0ZWQgKi8KKwkJCQkJLyogaWYgMDogdGhleSBhcmUgZGlzYWxsb3dlZCAoRU5BTUVUT09MT05HKSAqLworCW5saW5rX3QgICAgICAgIHNfbGlua19tYXg7CS8qIG1heCBudW1iZXIgb2YgaGFyZCBsaW5rcyB0byBhIGZpbGUgKi8KKwl1bnNpZ25lZCBpbnQgICBzX2lub2Rlc19wZXJfYmxvY2s7CS8qIG51bWJlciBvZiBpbm9kZXMgcGVyIGJsb2NrICovCisJdW5zaWduZWQgaW50ICAgc19pbm9kZXNfcGVyX2Jsb2NrXzE7CS8qIGlub2Rlc19wZXJfYmxvY2sgLSAxICovCisJdW5zaWduZWQgaW50ICAgc19pbm9kZXNfcGVyX2Jsb2NrX2JpdHM7CS8qIGxvZzIoaW5vZGVzX3Blcl9ibG9jaykgKi8KKwl1bnNpZ25lZCBpbnQgICBzX2luZF9wZXJfYmxvY2s7CQkvKiBudW1iZXIgb2YgaW5kaXJlY3Rpb25zIHBlciBibG9jayAqLworCXVuc2lnbmVkIGludCAgIHNfaW5kX3Blcl9ibG9ja19iaXRzOwkvKiBsb2cyKGluZF9wZXJfYmxvY2spICovCisJdW5zaWduZWQgaW50ICAgc19pbmRfcGVyX2Jsb2NrXzI7CS8qIGluZF9wZXJfYmxvY2sgXiAyICovCisJdW5zaWduZWQgaW50ICAgc190b29iaWdfYmxvY2s7CQkvKiAxMCArIGlwYiArIGlwYl4yICsgaXBiXjMgKi8KKwl1bnNpZ25lZCBpbnQgICBzX2Jsb2NrX2Jhc2U7CS8qIHBoeXNpY2FsIGJsb2NrIG51bWJlciBvZiBibG9jayAwICovCisJdW5zaWduZWQgc2hvcnQgc19maWNfc2l6ZTsJLyogZnJlZSBpbm9kZSBjYWNoZSBzaXplLCBOSUNJTk9EICovCisJdW5zaWduZWQgc2hvcnQgc19mbGNfc2l6ZTsJLyogZnJlZSBibG9jayBsaXN0IGNodW5rIHNpemUsIE5JQ0ZSRUUgKi8KKwkvKiBUaGUgc3VwZXJibG9jayBpcyBrZXB0IGluIG9uZSBvciB0d28gZGlzayBidWZmZXJzOiAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqc19iaDE7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpzX2JoMjsKKwkvKiBUaGVzZSBhcmUgcG9pbnRlcnMgaW50byB0aGUgZGlzayBidWZmZXIsIHRvIGNvbXBlbnNhdGUgZm9yCisJICAgZGlmZmVyZW50IHN1cGVyYmxvY2sgbGF5b3V0LiAqLworCWNoYXIgKiAgICAgICAgIHNfc2JkMTsJCS8qIGVudGlyZSBzdXBlcmJsb2NrIGRhdGEsIGZvciBwYXJ0IDEgKi8KKwljaGFyICogICAgICAgICBzX3NiZDI7CQkvKiBlbnRpcmUgc3VwZXJibG9jayBkYXRhLCBmb3IgcGFydCAyICovCisJX19mczE2ICAgICAgICAgKnNfc2JfZmljX2NvdW50OwkvKiBwb2ludGVyIHRvIHNfc2JkLT5zX25pbm9kZSAqLworICAgICAgICBzeXN2X2lub190ICAgICAqc19zYl9maWNfaW5vZGVzOyAvKiBwb2ludGVyIHRvIHNfc2JkLT5zX2lub2RlICovCisJX19mczE2ICAgICAgICAgKnNfc2JfdG90YWxfZnJlZV9pbm9kZXM7IC8qIHBvaW50ZXIgdG8gc19zYmQtPnNfdGlub2RlICovCisJX19mczE2ICAgICAgICAgKnNfYmNhY2hlX2NvdW50OwkvKiBwb2ludGVyIHRvIHNfc2JkLT5zX25mcmVlICovCisJc3lzdl96b25lX3QgICAgKnNfYmNhY2hlOwkvKiBwb2ludGVyIHRvIHNfc2JkLT5zX2ZyZWUgKi8KKwlfX2ZzMzIgICAgICAgICAqc19mcmVlX2Jsb2NrczsJLyogcG9pbnRlciB0byBzX3NiZC0+c190ZnJlZSAqLworCV9fZnMzMiAgICAgICAgICpzX3NiX3RpbWU7CS8qIHBvaW50ZXIgdG8gc19zYmQtPnNfdGltZSAqLworCV9fZnMzMiAgICAgICAgICpzX3NiX3N0YXRlOwkvKiBwb2ludGVyIHRvIHNfc2JkLT5zX3N0YXRlLCBvbmx5IEZTVFlQRV9TWVNWICovCisJLyogV2Uga2VlcCB0aG9zZSBzdXBlcmJsb2NrIGVudGl0aWVzIHRoYXQgZG9uJ3QgY2hhbmdlIGhlcmU7CisJICAgdGhpcyBzYXZlcyB1cyBhbiBpbmRpcmVjdGlvbiBhbmQgcGVyaGFwcyBhIGNvbnZlcnNpb24uICovCisJdTMyICAgICAgICAgICAgc19maXJzdGlub2Rlem9uZTsgLyogaW5kZXggb2YgZmlyc3QgaW5vZGUgem9uZSAqLworCXUzMiAgICAgICAgICAgIHNfZmlyc3RkYXRhem9uZTsJLyogc2FtZSBhcyBzX3NiZC0+c19pc2l6ZSAqLworCXUzMiAgICAgICAgICAgIHNfbmlub2RlczsJLyogdG90YWwgbnVtYmVyIG9mIGlub2RlcyAqLworCXUzMiAgICAgICAgICAgIHNfbmRhdGF6b25lczsJLyogdG90YWwgbnVtYmVyIG9mIGRhdGEgem9uZXMgKi8KKwl1MzIgICAgICAgICAgICBzX256b25lczsJLyogc2FtZSBhcyBzX3NiZC0+c19mc2l6ZSAqLworCXUxNgkgICAgICAgc19uYW1lbGVuOyAgICAgICAvKiBtYXggbGVuZ3RoIG9mIGRpciBlbnRyeSAqLworCWludAkgICAgICAgc19mb3JjZWRfcm87Cit9OworCisvKgorICogU3lzdGVtVi9WNy9Db2hlcmVudCBGUyBpbm9kZSBkYXRhIGluIG1lbW9yeQorICovCitzdHJ1Y3Qgc3lzdl9pbm9kZV9pbmZvIHsKKwlfX2ZzMzIJCWlfZGF0YVsxM107CisJdTMyCQlpX2Rpcl9zdGFydF9sb29rdXA7CisJc3RydWN0IGlub2RlCXZmc19pbm9kZTsKK307CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3lzdl9pbm9kZV9pbmZvICpTWVNWX0koc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gbGlzdF9lbnRyeShpbm9kZSwgc3RydWN0IHN5c3ZfaW5vZGVfaW5mbywgdmZzX2lub2RlKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpTWVNWX1NCKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIHNiLT5zX2ZzX2luZm87Cit9CisKKworLyogaWRlbnRpZnkgdGhlIEZTIGluIG1lbW9yeSAqLworZW51bSB7CisJRlNUWVBFX05PTkUgPSAwLAorCUZTVFlQRV9YRU5JWCwKKwlGU1RZUEVfU1lTVjQsCisJRlNUWVBFX1NZU1YyLAorCUZTVFlQRV9DT0gsCisJRlNUWVBFX1Y3LAorCUZTVFlQRV9BRlMsCisJRlNUWVBFX0VORCwKK307CisKKyNkZWZpbmUgU1lTVl9NQUdJQ19CQVNFCQkweDAxMkZGN0IzCisKKyNkZWZpbmUgWEVOSVhfU1VQRVJfTUFHSUMJKFNZU1ZfTUFHSUNfQkFTRStGU1RZUEVfWEVOSVgpCisjZGVmaW5lIFNZU1Y0X1NVUEVSX01BR0lDCShTWVNWX01BR0lDX0JBU0UrRlNUWVBFX1NZU1Y0KQorI2RlZmluZSBTWVNWMl9TVVBFUl9NQUdJQwkoU1lTVl9NQUdJQ19CQVNFK0ZTVFlQRV9TWVNWMikKKyNkZWZpbmUgQ09IX1NVUEVSX01BR0lDCQkoU1lTVl9NQUdJQ19CQVNFK0ZTVFlQRV9DT0gpCisKKworLyogQWRtaXNzaWJsZSB2YWx1ZXMgZm9yIGlfbmxpbms6IDAuLl9MSU5LX01BWCAqLworZW51bSB7CisJWEVOSVhfTElOS19NQVgJPQkxMjYsCS8qID8/ICovCisJU1lTVl9MSU5LX01BWAk9CTEyNiwJLyogMTI3PyAyNTE/ICovCisJVjdfTElOS19NQVggICAgID0JMTI2LAkvKiA/PyAqLworCUNPSF9MSU5LX01BWAk9CTEwMDAwLAorfTsKKworCitzdGF0aWMgaW5saW5lIHZvaWQgZGlydHlfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmkgPSBTWVNWX1NCKHNiKTsKKworCW1hcmtfYnVmZmVyX2RpcnR5KHNiaS0+c19iaDEpOworCWlmIChzYmktPnNfYmgxICE9IHNiaS0+c19iaDIpCisJCW1hcmtfYnVmZmVyX2RpcnR5KHNiaS0+c19iaDIpOworCXNiLT5zX2RpcnQgPSAxOworfQorCisKKy8qIGlhbGxvYy5jICovCitleHRlcm4gc3RydWN0IHN5c3ZfaW5vZGUgKnN5c3ZfcmF3X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1bnNpZ25lZCwKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqKik7CitleHRlcm4gc3RydWN0IGlub2RlICogc3lzdl9uZXdfaW5vZGUoY29uc3Qgc3RydWN0IGlub2RlICosIG1vZGVfdCk7CitleHRlcm4gdm9pZCBzeXN2X2ZyZWVfaW5vZGUoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3lzdl9jb3VudF9mcmVlX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CisKKy8qIGJhbGxvYy5jICovCitleHRlcm4gc3lzdl96b25lX3Qgc3lzdl9uZXdfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICopOworZXh0ZXJuIHZvaWQgc3lzdl9mcmVlX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzeXN2X3pvbmVfdCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBzeXN2X2NvdW50X2ZyZWVfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKworLyogaXRyZWUuYyAqLworZXh0ZXJuIHZvaWQgc3lzdl90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKik7CisKKy8qIGlub2RlLmMgKi8KK2V4dGVybiBpbnQgc3lzdl93cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKK2V4dGVybiBpbnQgc3lzdl9zeW5jX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgc3lzdl9zeW5jX2ZpbGUoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOworZXh0ZXJuIHZvaWQgc3lzdl9zZXRfaW5vZGUoc3RydWN0IGlub2RlICosIGRldl90KTsKK2V4dGVybiBpbnQgc3lzdl9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqLCBzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBrc3RhdCAqKTsKKworLyogZGlyLmMgKi8KK2V4dGVybiBzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkgKnN5c3ZfZmluZF9lbnRyeShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBwYWdlICoqKTsKK2V4dGVybiBpbnQgc3lzdl9hZGRfbGluayhzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgc3lzdl9kZWxldGVfZW50cnkoc3RydWN0IHN5c3ZfZGlyX2VudHJ5ICosIHN0cnVjdCBwYWdlICopOworZXh0ZXJuIGludCBzeXN2X21ha2VfZW1wdHkoc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgc3lzdl9lbXB0eV9kaXIoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHZvaWQgc3lzdl9zZXRfbGluayhzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkgKiwgc3RydWN0IHBhZ2UgKiwKKwkJCXN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkgKnN5c3ZfZG90ZG90KHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcGFnZSAqKik7CitleHRlcm4gaW5vX3Qgc3lzdl9pbm9kZV9ieV9uYW1lKHN0cnVjdCBkZW50cnkgKik7CisKKworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHN5c3ZfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHN5c3ZfZGlyX2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc3lzdl9mYXN0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN5c3ZfZmlsZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3lzdl9kaXJfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHN5c3ZfYW9wczsKK2V4dGVybiBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBzeXN2X3NvcHM7CitleHRlcm4gc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIHN5c3ZfZGVudHJ5X29wZXJhdGlvbnM7CisKKworZW51bSB7CisJQllURVNFWF9MRSwKKwlCWVRFU0VYX1BEUCwKKwlCWVRFU0VYX0JFLAorfTsKKworc3RhdGljIGlubGluZSB1MzIgUERQX3N3YWIodTMyIHgpCit7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJcmV0dXJuICgoeCAmIDB4ZmZmZikgPDwgMTYpIHwgKCh4ICYgMHhmZmZmMDAwMCkgPj4gMTYpOworI2Vsc2UKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwlyZXR1cm4gKCh4ICYgMHhmZjAwZmYpIDw8IDgpIHwgKCh4ICYgMHhmZjAwZmYwMCkgPj4gOCk7CisjZWxzZQorI2Vycm9yIEJZVEVTRVgKKyNlbmRpZgorI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgX191MzIgZnMzMl90b19jcHUoc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpLCBfX2ZzMzIgbikKK3sKKwlpZiAoc2JpLT5zX2J5dGVzZXggPT0gQllURVNFWF9QRFApCisJCXJldHVybiBQRFBfc3dhYigoX19mb3JjZSBfX3UzMiluKTsKKwllbHNlIGlmIChzYmktPnNfYnl0ZXNleCA9PSBCWVRFU0VYX0xFKQorCQlyZXR1cm4gbGUzMl90b19jcHUoKF9fZm9yY2UgX19sZTMyKW4pOworCWVsc2UKKwkJcmV0dXJuIGJlMzJfdG9fY3B1KChfX2ZvcmNlIF9fYmUzMiluKTsKK30KKworc3RhdGljIGlubGluZSBfX2ZzMzIgY3B1X3RvX2ZzMzIoc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpLCBfX3UzMiBuKQoreworCWlmIChzYmktPnNfYnl0ZXNleCA9PSBCWVRFU0VYX1BEUCkKKwkJcmV0dXJuIChfX2ZvcmNlIF9fZnMzMilQRFBfc3dhYihuKTsKKwllbHNlIGlmIChzYmktPnNfYnl0ZXNleCA9PSBCWVRFU0VYX0xFKQorCQlyZXR1cm4gKF9fZm9yY2UgX19mczMyKWNwdV90b19sZTMyKG4pOworCWVsc2UKKwkJcmV0dXJuIChfX2ZvcmNlIF9fZnMzMiljcHVfdG9fYmUzMihuKTsKK30KKworc3RhdGljIGlubGluZSBfX2ZzMzIgZnMzMl9hZGQoc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpLCBfX2ZzMzIgKm4sIGludCBkKQoreworCWlmIChzYmktPnNfYnl0ZXNleCA9PSBCWVRFU0VYX1BEUCkKKwkJKihfX3UzMiopbiA9IFBEUF9zd2FiKFBEUF9zd2FiKCooX191MzIqKW4pK2QpOworCWVsc2UgaWYgKHNiaS0+c19ieXRlc2V4ID09IEJZVEVTRVhfTEUpCisJCSooX19sZTMyKiluID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoKihfX2xlMzIqKW4pK2QpOworCWVsc2UKKwkJKihfX2JlMzIqKW4gPSBjcHVfdG9fYmUzMihiZTMyX3RvX2NwdSgqKF9fYmUzMiopbikrZCk7CisJcmV0dXJuICpuOworfQorCitzdGF0aWMgaW5saW5lIF9fdTE2IGZzMTZfdG9fY3B1KHN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSwgX19mczE2IG4pCit7CisJaWYgKHNiaS0+c19ieXRlc2V4ICE9IEJZVEVTRVhfQkUpCisJCXJldHVybiBsZTE2X3RvX2NwdSgoX19mb3JjZSBfX2xlMTYpbik7CisJZWxzZQorCQlyZXR1cm4gYmUxNl90b19jcHUoKF9fZm9yY2UgX19iZTE2KW4pOworfQorCitzdGF0aWMgaW5saW5lIF9fZnMxNiBjcHVfdG9fZnMxNihzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmksIF9fdTE2IG4pCit7CisJaWYgKHNiaS0+c19ieXRlc2V4ICE9IEJZVEVTRVhfQkUpCisJCXJldHVybiAoX19mb3JjZSBfX2ZzMTYpY3B1X3RvX2xlMTYobik7CisJZWxzZQorCQlyZXR1cm4gKF9fZm9yY2UgX19mczE2KWNwdV90b19iZTE2KG4pOworfQorCitzdGF0aWMgaW5saW5lIF9fZnMxNiBmczE2X2FkZChzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmksIF9fZnMxNiAqbiwgaW50IGQpCit7CisJaWYgKHNiaS0+c19ieXRlc2V4ICE9IEJZVEVTRVhfQkUpCisJCSooX19sZTE2KiluID0gY3B1X3RvX2xlMTYobGUxNl90b19jcHUoKihfX2xlMTYgKiluKStkKTsKKwllbHNlCisJCSooX19iZTE2KiluID0gY3B1X3RvX2JlMTYoYmUxNl90b19jcHUoKihfX2JlMTYgKiluKStkKTsKKwlyZXR1cm4gKm47Cit9CisKKyNlbmRpZiAvKiBfU1lTVl9IICovCmRpZmYgLS1naXQgYS9mcy91ZGYvTWFrZWZpbGUgYi9mcy91ZGYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4NDVlNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3VkZi9NYWtlZmlsZQpAQCAtMCwwICsxLDkgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCB1ZGYtZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX1VERl9GUykgKz0gdWRmLm8KKwordWRmLW9ianMgICAgIDo9IGJhbGxvYy5vIGRpci5vIGZpbGUubyBpYWxsb2MubyBpbm9kZS5vIGxvd2xldmVsLm8gbmFtZWkubyBcCisJCXBhcnRpdGlvbi5vIHN1cGVyLm8gdHJ1bmNhdGUubyBzeW1saW5rLm8gZnN5bmMubyBcCisJCWNyYy5vIGRpcmVjdG9yeS5vIG1pc2MubyB1ZGZ0aW1lLm8gdW5pY29kZS5vCmRpZmYgLS1naXQgYS9mcy91ZGYvYmFsbG9jLmMgYi9mcy91ZGYvYmFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkZWQyNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3VkZi9iYWxsb2MuYwpAQCAtMCwwICsxLDk1OSBAQAorLyoKKyAqIGJhbGxvYy5jCisgKgorICogUFVSUE9TRQorICoJQmxvY2sgYWxsb2NhdGlvbiBoYW5kbGluZyByb3V0aW5lcyBmb3IgdGhlIE9TVEEtVURGKHRtKSBmaWxlc3lzdGVtLgorICoKKyAqIENPTlRBQ1RTCisgKglFLW1haWwgcmVnYXJkaW5nIGFueSBwb3J0aW9uIG9mIHRoZSBMaW51eCBVREYgZmlsZSBzeXN0ZW0gc2hvdWxkIGJlCisgKglkaXJlY3RlZCB0byB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBtYWlsaW5nIGxpc3QgKHJ1biBieSBtYWpvcmRvbW8pOgorICoJCWxpbnV4X3VkZkBocGVzanJvLmZjLmhwLmNvbQorICoKKyAqIENPUFlSSUdIVAorICoJVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIChHUEwpLiBDb3BpZXMgb2YgdGhlIEdQTCBjYW4gYmUgb2J0YWluZWQgZnJvbToKKyAqCQlmdHA6Ly9wcmVwLmFpLm1pdC5lZHUvcHViL2dudS9HUEwKKyAqCUVhY2ggY29udHJpYnV0aW5nIGF1dGhvciByZXRhaW5zIGFsbCByaWdodHMgdG8gdGhlaXIgb3duIHdvcmsuCisgKgorICogIChDKSAxOTk5LTIwMDEgQmVuIEZlbm5lbWEKKyAqICAoQykgMTk5OSBTdGVsaWFzIENvbXB1dGluZyBJbmMKKyAqCisgKiBISVNUT1JZCisgKgorICogIDAyLzI0Lzk5IGJsZiAgQ3JlYXRlZC4KKyAqCisgKi8KKworI2luY2x1ZGUgInVkZmRlY2wuaCIKKworI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgInVkZl9pLmgiCisjaW5jbHVkZSAidWRmX3NiLmgiCisKKyNkZWZpbmUgdWRmX2NsZWFyX2JpdChucixhZGRyKSBleHQyX2NsZWFyX2JpdChucixhZGRyKQorI2RlZmluZSB1ZGZfc2V0X2JpdChucixhZGRyKSBleHQyX3NldF9iaXQobnIsYWRkcikKKyNkZWZpbmUgdWRmX3Rlc3RfYml0KG5yLCBhZGRyKSBleHQyX3Rlc3RfYml0KG5yLCBhZGRyKQorI2RlZmluZSB1ZGZfZmluZF9maXJzdF9vbmVfYml0KGFkZHIsIHNpemUpIGZpbmRfZmlyc3Rfb25lX2JpdChhZGRyLCBzaXplKQorI2RlZmluZSB1ZGZfZmluZF9uZXh0X29uZV9iaXQoYWRkciwgc2l6ZSwgb2Zmc2V0KSBmaW5kX25leHRfb25lX2JpdChhZGRyLCBzaXplLCBvZmZzZXQpCisKKyNkZWZpbmUgbGVCUExfdG9fY3B1cCh4KSBsZU5VTV90b19jcHVwKEJJVFNfUEVSX0xPTkcsIHgpCisjZGVmaW5lIGxlTlVNX3RvX2NwdXAoeCx5KSB4bGVOVU1fdG9fY3B1cCh4LHkpCisjZGVmaW5lIHhsZU5VTV90b19jcHVwKHgseSkgKGxlICMjIHggIyMgX3RvX2NwdXAoeSkpCisjZGVmaW5lIHVpbnRCUExfdCB1aW50KEJJVFNfUEVSX0xPTkcpCisjZGVmaW5lIHVpbnQoeCkgeHVpbnQoeCkKKyNkZWZpbmUgeHVpbnQoeCkgX19sZSAjIyB4CisKK2V4dGVybiBpbmxpbmUgaW50IGZpbmRfbmV4dF9vbmVfYml0ICh2b2lkICogYWRkciwgaW50IHNpemUsIGludCBvZmZzZXQpCit7CisJdWludEJQTF90ICogcCA9ICgodWludEJQTF90ICopIGFkZHIpICsgKG9mZnNldCAvIEJJVFNfUEVSX0xPTkcpOworCWludCByZXN1bHQgPSBvZmZzZXQgJiB+KEJJVFNfUEVSX0xPTkctMSk7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlpZiAob2Zmc2V0ID49IHNpemUpCisJCXJldHVybiBzaXplOworCXNpemUgLT0gcmVzdWx0OworCW9mZnNldCAmPSAoQklUU19QRVJfTE9ORy0xKTsKKwlpZiAob2Zmc2V0KQorCXsKKwkJdG1wID0gbGVCUExfdG9fY3B1cChwKyspOworCQl0bXAgJj0gfjBVTCA8PCBvZmZzZXQ7CisJCWlmIChzaXplIDwgQklUU19QRVJfTE9ORykKKwkJCWdvdG8gZm91bmRfZmlyc3Q7CisJCWlmICh0bXApCisJCQlnb3RvIGZvdW5kX21pZGRsZTsKKwkJc2l6ZSAtPSBCSVRTX1BFUl9MT05HOworCQlyZXN1bHQgKz0gQklUU19QRVJfTE9ORzsKKwl9CisJd2hpbGUgKHNpemUgJiB+KEJJVFNfUEVSX0xPTkctMSkpCisJeworCQlpZiAoKHRtcCA9IGxlQlBMX3RvX2NwdXAocCsrKSkpCisJCQlnb3RvIGZvdW5kX21pZGRsZTsKKwkJcmVzdWx0ICs9IEJJVFNfUEVSX0xPTkc7CisJCXNpemUgLT0gQklUU19QRVJfTE9ORzsKKwl9CisJaWYgKCFzaXplKQorCQlyZXR1cm4gcmVzdWx0OworCXRtcCA9IGxlQlBMX3RvX2NwdXAocCk7Citmb3VuZF9maXJzdDoKKwl0bXAgJj0gfjBVTCA+PiAoQklUU19QRVJfTE9ORy1zaXplKTsKK2ZvdW5kX21pZGRsZToKKwlyZXR1cm4gcmVzdWx0ICsgZmZ6KH50bXApOworfQorCisjZGVmaW5lIGZpbmRfZmlyc3Rfb25lX2JpdChhZGRyLCBzaXplKVwKKwlmaW5kX25leHRfb25lX2JpdCgoYWRkciksIChzaXplKSwgMCkKKworc3RhdGljIGludCByZWFkX2Jsb2NrX2JpdG1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwlzdHJ1Y3QgdWRmX2JpdG1hcCAqYml0bWFwLCB1bnNpZ25lZCBpbnQgYmxvY2ssIHVuc2lnbmVkIGxvbmcgYml0bWFwX25yKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWludCByZXR2YWwgPSAwOworCWtlcm5lbF9sYl9hZGRyIGxvYzsKKworCWxvYy5sb2dpY2FsQmxvY2tOdW0gPSBiaXRtYXAtPnNfZXh0UG9zaXRpb247CisJbG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IFVERl9TQl9QQVJUSVRJT04oc2IpOworCisJYmggPSB1ZGZfdHJlYWQoc2IsIHVkZl9nZXRfbGJfcGJsb2NrKHNiLCBsb2MsIGJsb2NrKSk7CisJaWYgKCFiaCkKKwl7CisJCXJldHZhbCA9IC1FSU87CisJfQorCWJpdG1hcC0+c19ibG9ja19iaXRtYXBbYml0bWFwX25yXSA9IGJoOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgX19sb2FkX2Jsb2NrX2JpdG1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwlzdHJ1Y3QgdWRmX2JpdG1hcCAqYml0bWFwLCB1bnNpZ25lZCBpbnQgYmxvY2tfZ3JvdXApCit7CisJaW50IHJldHZhbCA9IDA7CisJaW50IG5yX2dyb3VwcyA9IGJpdG1hcC0+c19ucl9ncm91cHM7CisKKwlpZiAoYmxvY2tfZ3JvdXAgPj0gbnJfZ3JvdXBzKQorCXsKKwkJdWRmX2RlYnVnKCJibG9ja19ncm91cCAoJWQpID4gbnJfZ3JvdXBzICglZClcbiIsIGJsb2NrX2dyb3VwLCBucl9ncm91cHMpOworCX0KKworCWlmIChiaXRtYXAtPnNfYmxvY2tfYml0bWFwW2Jsb2NrX2dyb3VwXSkKKwkJcmV0dXJuIGJsb2NrX2dyb3VwOworCWVsc2UKKwl7CisJCXJldHZhbCA9IHJlYWRfYmxvY2tfYml0bWFwKHNiLCBiaXRtYXAsIGJsb2NrX2dyb3VwLCBibG9ja19ncm91cCk7CisJCWlmIChyZXR2YWwgPCAwKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJcmV0dXJuIGJsb2NrX2dyb3VwOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgbG9hZF9ibG9ja19iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCisJc3RydWN0IHVkZl9iaXRtYXAgKmJpdG1hcCwgdW5zaWduZWQgaW50IGJsb2NrX2dyb3VwKQoreworCWludCBzbG90OworCisJc2xvdCA9IF9fbG9hZF9ibG9ja19iaXRtYXAoc2IsIGJpdG1hcCwgYmxvY2tfZ3JvdXApOworCisJaWYgKHNsb3QgPCAwKQorCQlyZXR1cm4gc2xvdDsKKworCWlmICghYml0bWFwLT5zX2Jsb2NrX2JpdG1hcFtzbG90XSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc2xvdDsKK30KKworc3RhdGljIHZvaWQgdWRmX2JpdG1hcF9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKKwlzdHJ1Y3QgdWRmX2JpdG1hcCAqYml0bWFwLAorCWtlcm5lbF9sYl9hZGRyIGJsb2MsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgY291bnQpCit7CisJc3RydWN0IHVkZl9zYl9pbmZvICpzYmkgPSBVREZfU0Ioc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGJsb2NrOworCXVuc2lnbmVkIGxvbmcgYmxvY2tfZ3JvdXA7CisJdW5zaWduZWQgbG9uZyBiaXQ7CisJdW5zaWduZWQgbG9uZyBpOworCWludCBiaXRtYXBfbnI7CisJdW5zaWduZWQgbG9uZyBvdmVyZmxvdzsKKworCWRvd24oJnNiaS0+c19hbGxvY19zZW0pOworCWlmIChibG9jLmxvZ2ljYWxCbG9ja051bSA8IDAgfHwKKwkJKGJsb2MubG9naWNhbEJsb2NrTnVtICsgY291bnQpID4gVURGX1NCX1BBUlRMRU4oc2IsIGJsb2MucGFydGl0aW9uUmVmZXJlbmNlTnVtKSkKKwl7CisJCXVkZl9kZWJ1ZygiJWQgPCAlZCB8fCAlZCArICVkID4gJWRcbiIsCisJCQlibG9jLmxvZ2ljYWxCbG9ja051bSwgMCwgYmxvYy5sb2dpY2FsQmxvY2tOdW0sIGNvdW50LAorCQkJVURGX1NCX1BBUlRMRU4oc2IsIGJsb2MucGFydGl0aW9uUmVmZXJlbmNlTnVtKSk7CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworCWJsb2NrID0gYmxvYy5sb2dpY2FsQmxvY2tOdW0gKyBvZmZzZXQgKyAoc2l6ZW9mKHN0cnVjdCBzcGFjZUJpdG1hcERlc2MpIDw8IDMpOworCitkb19tb3JlOgorCW92ZXJmbG93ID0gMDsKKwlibG9ja19ncm91cCA9IGJsb2NrID4+IChzYi0+c19ibG9ja3NpemVfYml0cyArIDMpOworCWJpdCA9IGJsb2NrICUgKHNiLT5zX2Jsb2Nrc2l6ZSA8PCAzKTsKKworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBmcmVlaW5nIGJsb2NrcyBhY3Jvc3MgYSBncm91cCBib3VuZGFyeS4KKwkgKi8KKwlpZiAoYml0ICsgY291bnQgPiAoc2ItPnNfYmxvY2tzaXplIDw8IDMpKQorCXsKKwkJb3ZlcmZsb3cgPSBiaXQgKyBjb3VudCAtIChzYi0+c19ibG9ja3NpemUgPDwgMyk7CisJCWNvdW50IC09IG92ZXJmbG93OworCX0KKwliaXRtYXBfbnIgPSBsb2FkX2Jsb2NrX2JpdG1hcChzYiwgYml0bWFwLCBibG9ja19ncm91cCk7CisJaWYgKGJpdG1hcF9uciA8IDApCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJYmggPSBiaXRtYXAtPnNfYmxvY2tfYml0bWFwW2JpdG1hcF9ucl07CisJZm9yIChpPTA7IGkgPCBjb3VudDsgaSsrKQorCXsKKwkJaWYgKHVkZl9zZXRfYml0KGJpdCArIGksIGJoLT5iX2RhdGEpKQorCQl7CisJCQl1ZGZfZGVidWcoImJpdCAlbGQgYWxyZWFkeSBzZXRcbiIsIGJpdCArIGkpOworCQkJdWRmX2RlYnVnKCJieXRlPSUyeFxuIiwgKChjaGFyICopYmgtPmJfZGF0YSlbKGJpdCArIGkpID4+IDNdKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChpbm9kZSkKKwkJCQlEUVVPVF9GUkVFX0JMT0NLKGlub2RlLCAxKTsKKwkJCWlmIChVREZfU0JfTFZJREJIKHNiKSkKKwkJCXsKKwkJCQlVREZfU0JfTFZJRChzYiktPmZyZWVTcGFjZVRhYmxlW1VERl9TQl9QQVJUSVRJT04oc2IpXSA9CisJCQkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KFVERl9TQl9MVklEKHNiKS0+ZnJlZVNwYWNlVGFibGVbVURGX1NCX1BBUlRJVElPTihzYildKSsxKTsKKwkJCX0KKwkJfQorCX0KKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKG92ZXJmbG93KQorCXsKKwkJYmxvY2sgKz0gY291bnQ7CisJCWNvdW50ID0gb3ZlcmZsb3c7CisJCWdvdG8gZG9fbW9yZTsKKwl9CitlcnJvcl9yZXR1cm46CisJc2ItPnNfZGlydCA9IDE7CisJaWYgKFVERl9TQl9MVklEQkgoc2IpKQorCQltYXJrX2J1ZmZlcl9kaXJ0eShVREZfU0JfTFZJREJIKHNiKSk7CisJdXAoJnNiaS0+c19hbGxvY19zZW0pOworCXJldHVybjsKK30KKworc3RhdGljIGludCB1ZGZfYml0bWFwX3ByZWFsbG9jX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKKwlzdHJ1Y3QgdWRmX2JpdG1hcCAqYml0bWFwLCB1aW50MTZfdCBwYXJ0aXRpb24sIHVpbnQzMl90IGZpcnN0X2Jsb2NrLAorCXVpbnQzMl90IGJsb2NrX2NvdW50KQoreworCXN0cnVjdCB1ZGZfc2JfaW5mbyAqc2JpID0gVURGX1NCKHNiKTsKKwlpbnQgYWxsb2NfY291bnQgPSAwOworCWludCBiaXQsIGJsb2NrLCBibG9ja19ncm91cCwgZ3JvdXBfc3RhcnQ7CisJaW50IG5yX2dyb3VwcywgYml0bWFwX25yOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwlkb3duKCZzYmktPnNfYWxsb2Nfc2VtKTsKKwlpZiAoZmlyc3RfYmxvY2sgPCAwIHx8IGZpcnN0X2Jsb2NrID49IFVERl9TQl9QQVJUTEVOKHNiLCBwYXJ0aXRpb24pKQorCQlnb3RvIG91dDsKKworCWlmIChmaXJzdF9ibG9jayArIGJsb2NrX2NvdW50ID4gVURGX1NCX1BBUlRMRU4oc2IsIHBhcnRpdGlvbikpCisJCWJsb2NrX2NvdW50ID0gVURGX1NCX1BBUlRMRU4oc2IsIHBhcnRpdGlvbikgLSBmaXJzdF9ibG9jazsKKworcmVwZWF0OgorCW5yX2dyb3VwcyA9IChVREZfU0JfUEFSVExFTihzYiwgcGFydGl0aW9uKSArCisJCShzaXplb2Yoc3RydWN0IHNwYWNlQml0bWFwRGVzYykgPDwgMykgKyAoc2ItPnNfYmxvY2tzaXplICogOCkgLSAxKSAvIChzYi0+c19ibG9ja3NpemUgKiA4KTsKKwlibG9jayA9IGZpcnN0X2Jsb2NrICsgKHNpemVvZihzdHJ1Y3Qgc3BhY2VCaXRtYXBEZXNjKSA8PCAzKTsKKwlibG9ja19ncm91cCA9IGJsb2NrID4+IChzYi0+c19ibG9ja3NpemVfYml0cyArIDMpOworCWdyb3VwX3N0YXJ0ID0gYmxvY2tfZ3JvdXAgPyAwIDogc2l6ZW9mKHN0cnVjdCBzcGFjZUJpdG1hcERlc2MpOworCisJYml0bWFwX25yID0gbG9hZF9ibG9ja19iaXRtYXAoc2IsIGJpdG1hcCwgYmxvY2tfZ3JvdXApOworCWlmIChiaXRtYXBfbnIgPCAwKQorCQlnb3RvIG91dDsKKwliaCA9IGJpdG1hcC0+c19ibG9ja19iaXRtYXBbYml0bWFwX25yXTsKKworCWJpdCA9IGJsb2NrICUgKHNiLT5zX2Jsb2Nrc2l6ZSA8PCAzKTsKKworCXdoaWxlIChiaXQgPCAoc2ItPnNfYmxvY2tzaXplIDw8IDMpICYmIGJsb2NrX2NvdW50ID4gMCkKKwl7CisJCWlmICghdWRmX3Rlc3RfYml0KGJpdCwgYmgtPmJfZGF0YSkpCisJCQlnb3RvIG91dDsKKwkJZWxzZSBpZiAoRFFVT1RfUFJFQUxMT0NfQkxPQ0soaW5vZGUsIDEpKQorCQkJZ290byBvdXQ7CisJCWVsc2UgaWYgKCF1ZGZfY2xlYXJfYml0KGJpdCwgYmgtPmJfZGF0YSkpCisJCXsKKwkJCXVkZl9kZWJ1ZygiYml0IGFscmVhZHkgY2xlYXJlZCBmb3IgYmxvY2sgJWRcbiIsIGJpdCk7CisJCQlEUVVPVF9GUkVFX0JMT0NLKGlub2RlLCAxKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWJsb2NrX2NvdW50IC0tOworCQlhbGxvY19jb3VudCArKzsKKwkJYml0ICsrOworCQlibG9jayArKzsKKwl9CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWlmIChibG9ja19jb3VudCA+IDApCisJCWdvdG8gcmVwZWF0Oworb3V0OgorCWlmIChVREZfU0JfTFZJREJIKHNiKSkKKwl7CisJCVVERl9TQl9MVklEKHNiKS0+ZnJlZVNwYWNlVGFibGVbcGFydGl0aW9uXSA9CisJCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShVREZfU0JfTFZJRChzYiktPmZyZWVTcGFjZVRhYmxlW3BhcnRpdGlvbl0pLWFsbG9jX2NvdW50KTsKKwkJbWFya19idWZmZXJfZGlydHkoVURGX1NCX0xWSURCSChzYikpOworCX0KKwlzYi0+c19kaXJ0ID0gMTsKKwl1cCgmc2JpLT5zX2FsbG9jX3NlbSk7CisJcmV0dXJuIGFsbG9jX2NvdW50OworfQorCitzdGF0aWMgaW50IHVkZl9iaXRtYXBfbmV3X2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAorCXN0cnVjdCBpbm9kZSAqIGlub2RlLAorCXN0cnVjdCB1ZGZfYml0bWFwICpiaXRtYXAsIHVpbnQxNl90IHBhcnRpdGlvbiwgdWludDMyX3QgZ29hbCwgaW50ICplcnIpCit7CisJc3RydWN0IHVkZl9zYl9pbmZvICpzYmkgPSBVREZfU0Ioc2IpOworCWludCBuZXdiaXQsIGJpdD0wLCBibG9jaywgYmxvY2tfZ3JvdXAsIGdyb3VwX3N0YXJ0OworCWludCBlbmRfZ29hbCwgbnJfZ3JvdXBzLCBiaXRtYXBfbnIsIGk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJY2hhciAqcHRyOworCWludCBuZXdibG9jayA9IDA7CisKKwkqZXJyID0gLUVOT1NQQzsKKwlkb3duKCZzYmktPnNfYWxsb2Nfc2VtKTsKKworcmVwZWF0OgorCWlmIChnb2FsIDwgMCB8fCBnb2FsID49IFVERl9TQl9QQVJUTEVOKHNiLCBwYXJ0aXRpb24pKQorCQlnb2FsID0gMDsKKworCW5yX2dyb3VwcyA9IGJpdG1hcC0+c19ucl9ncm91cHM7CisJYmxvY2sgPSBnb2FsICsgKHNpemVvZihzdHJ1Y3Qgc3BhY2VCaXRtYXBEZXNjKSA8PCAzKTsKKwlibG9ja19ncm91cCA9IGJsb2NrID4+IChzYi0+c19ibG9ja3NpemVfYml0cyArIDMpOworCWdyb3VwX3N0YXJ0ID0gYmxvY2tfZ3JvdXAgPyAwIDogc2l6ZW9mKHN0cnVjdCBzcGFjZUJpdG1hcERlc2MpOworCisJYml0bWFwX25yID0gbG9hZF9ibG9ja19iaXRtYXAoc2IsIGJpdG1hcCwgYmxvY2tfZ3JvdXApOworCWlmIChiaXRtYXBfbnIgPCAwKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwliaCA9IGJpdG1hcC0+c19ibG9ja19iaXRtYXBbYml0bWFwX25yXTsKKwlwdHIgPSBtZW1zY2FuKChjaGFyICopYmgtPmJfZGF0YSArIGdyb3VwX3N0YXJ0LCAweEZGLCBzYi0+c19ibG9ja3NpemUgLSBncm91cF9zdGFydCk7CisKKwlpZiAoKHB0ciAtICgoY2hhciAqKWJoLT5iX2RhdGEpKSA8IHNiLT5zX2Jsb2Nrc2l6ZSkKKwl7CisJCWJpdCA9IGJsb2NrICUgKHNiLT5zX2Jsb2Nrc2l6ZSA8PCAzKTsKKworCQlpZiAodWRmX3Rlc3RfYml0KGJpdCwgYmgtPmJfZGF0YSkpCisJCXsKKwkJCWdvdG8gZ290X2Jsb2NrOworCQl9CisJCWVuZF9nb2FsID0gKGJpdCArIDYzKSAmIH42MzsKKwkJYml0ID0gdWRmX2ZpbmRfbmV4dF9vbmVfYml0KGJoLT5iX2RhdGEsIGVuZF9nb2FsLCBiaXQpOworCQlpZiAoYml0IDwgZW5kX2dvYWwpCisJCQlnb3RvIGdvdF9ibG9jazsKKwkJcHRyID0gbWVtc2NhbigoY2hhciAqKWJoLT5iX2RhdGEgKyAoYml0ID4+IDMpLCAweEZGLCBzYi0+c19ibG9ja3NpemUgLSAoKGJpdCArIDcpID4+IDMpKTsKKwkJbmV3Yml0ID0gKHB0ciAtICgoY2hhciAqKWJoLT5iX2RhdGEpKSA8PCAzOworCQlpZiAobmV3Yml0IDwgc2ItPnNfYmxvY2tzaXplIDw8IDMpCisJCXsKKwkJCWJpdCA9IG5ld2JpdDsKKwkJCWdvdG8gc2VhcmNoX2JhY2s7CisJCX0KKwkJbmV3Yml0ID0gdWRmX2ZpbmRfbmV4dF9vbmVfYml0KGJoLT5iX2RhdGEsIHNiLT5zX2Jsb2Nrc2l6ZSA8PCAzLCBiaXQpOworCQlpZiAobmV3Yml0IDwgc2ItPnNfYmxvY2tzaXplIDw8IDMpCisJCXsKKwkJCWJpdCA9IG5ld2JpdDsKKwkJCWdvdG8gZ290X2Jsb2NrOworCQl9CisJfQorCisJZm9yIChpPTA7IGk8KG5yX2dyb3VwcyoyKTsgaSsrKQorCXsKKwkJYmxvY2tfZ3JvdXAgKys7CisJCWlmIChibG9ja19ncm91cCA+PSBucl9ncm91cHMpCisJCQlibG9ja19ncm91cCA9IDA7CisJCWdyb3VwX3N0YXJ0ID0gYmxvY2tfZ3JvdXAgPyAwIDogc2l6ZW9mKHN0cnVjdCBzcGFjZUJpdG1hcERlc2MpOworCisJCWJpdG1hcF9uciA9IGxvYWRfYmxvY2tfYml0bWFwKHNiLCBiaXRtYXAsIGJsb2NrX2dyb3VwKTsKKwkJaWYgKGJpdG1hcF9uciA8IDApCisJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJYmggPSBiaXRtYXAtPnNfYmxvY2tfYml0bWFwW2JpdG1hcF9ucl07CisJCWlmIChpIDwgbnJfZ3JvdXBzKQorCQl7CisJCQlwdHIgPSBtZW1zY2FuKChjaGFyICopYmgtPmJfZGF0YSArIGdyb3VwX3N0YXJ0LCAweEZGLCBzYi0+c19ibG9ja3NpemUgLSBncm91cF9zdGFydCk7CisJCQlpZiAoKHB0ciAtICgoY2hhciAqKWJoLT5iX2RhdGEpKSA8IHNiLT5zX2Jsb2Nrc2l6ZSkKKwkJCXsKKwkJCQliaXQgPSAocHRyIC0gKChjaGFyICopYmgtPmJfZGF0YSkpIDw8IDM7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQliaXQgPSB1ZGZfZmluZF9uZXh0X29uZV9iaXQoKGNoYXIgKiliaC0+Yl9kYXRhLCBzYi0+c19ibG9ja3NpemUgPDwgMywgZ3JvdXBfc3RhcnQgPDwgMyk7CisJCQlpZiAoYml0IDwgc2ItPnNfYmxvY2tzaXplIDw8IDMpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGkgPj0gKG5yX2dyb3VwcyoyKSkKKwl7CisJCXVwKCZzYmktPnNfYWxsb2Nfc2VtKTsKKwkJcmV0dXJuIG5ld2Jsb2NrOworCX0KKwlpZiAoYml0IDwgc2ItPnNfYmxvY2tzaXplIDw8IDMpCisJCWdvdG8gc2VhcmNoX2JhY2s7CisJZWxzZQorCQliaXQgPSB1ZGZfZmluZF9uZXh0X29uZV9iaXQoYmgtPmJfZGF0YSwgc2ItPnNfYmxvY2tzaXplIDw8IDMsIGdyb3VwX3N0YXJ0IDw8IDMpOworCWlmIChiaXQgPj0gc2ItPnNfYmxvY2tzaXplIDw8IDMpCisJeworCQl1cCgmc2JpLT5zX2FsbG9jX3NlbSk7CisJCXJldHVybiAwOworCX0KKworc2VhcmNoX2JhY2s6CisJZm9yIChpPTA7IGk8NyAmJiBiaXQgPiAoZ3JvdXBfc3RhcnQgPDwgMykgJiYgdWRmX3Rlc3RfYml0KGJpdCAtIDEsIGJoLT5iX2RhdGEpOyBpKyssIGJpdC0tKTsKKworZ290X2Jsb2NrOgorCisJLyoKKwkgKiBDaGVjayBxdW90YSBmb3IgYWxsb2NhdGlvbiBvZiB0aGlzIGJsb2NrLgorCSAqLworCWlmIChpbm9kZSAmJiBEUVVPVF9BTExPQ19CTE9DSyhpbm9kZSwgMSkpCisJeworCQl1cCgmc2JpLT5zX2FsbG9jX3NlbSk7CisJCSplcnIgPSAtRURRVU9UOworCQlyZXR1cm4gMDsKKwl9CisKKwluZXdibG9jayA9IGJpdCArIChibG9ja19ncm91cCA8PCAoc2ItPnNfYmxvY2tzaXplX2JpdHMgKyAzKSkgLQorCQkoc2l6ZW9mKHN0cnVjdCBzcGFjZUJpdG1hcERlc2MpIDw8IDMpOworCisJaWYgKCF1ZGZfY2xlYXJfYml0KGJpdCwgYmgtPmJfZGF0YSkpCisJeworCQl1ZGZfZGVidWcoImJpdCBhbHJlYWR5IGNsZWFyZWQgZm9yIGJsb2NrICVkXG4iLCBiaXQpOworCQlnb3RvIHJlcGVhdDsKKwl9CisKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisKKwlpZiAoVURGX1NCX0xWSURCSChzYikpCisJeworCQlVREZfU0JfTFZJRChzYiktPmZyZWVTcGFjZVRhYmxlW3BhcnRpdGlvbl0gPQorCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUoVURGX1NCX0xWSUQoc2IpLT5mcmVlU3BhY2VUYWJsZVtwYXJ0aXRpb25dKS0xKTsKKwkJbWFya19idWZmZXJfZGlydHkoVURGX1NCX0xWSURCSChzYikpOworCX0KKwlzYi0+c19kaXJ0ID0gMTsKKwl1cCgmc2JpLT5zX2FsbG9jX3NlbSk7CisJKmVyciA9IDA7CisJcmV0dXJuIG5ld2Jsb2NrOworCitlcnJvcl9yZXR1cm46CisJKmVyciA9IC1FSU87CisJdXAoJnNiaS0+c19hbGxvY19zZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1ZGZfdGFibGVfZnJlZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCisJc3RydWN0IGlub2RlICogaW5vZGUsCisJc3RydWN0IGlub2RlICogdGFibGUsCisJa2VybmVsX2xiX2FkZHIgYmxvYywgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaSA9IFVERl9TQihzYik7CisJdWludDMyX3Qgc3RhcnQsIGVuZDsKKwl1aW50MzJfdCBuZXh0b2Zmc2V0LCBvZXh0b2Zmc2V0LCBlbGVuOworCWtlcm5lbF9sYl9hZGRyIG5ibG9jLCBvYmxvYywgZWxvYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm9iaCwgKm5iaDsKKwlpbnQ4X3QgZXR5cGU7CisJaW50IGk7CisKKwlkb3duKCZzYmktPnNfYWxsb2Nfc2VtKTsKKwlpZiAoYmxvYy5sb2dpY2FsQmxvY2tOdW0gPCAwIHx8CisJCShibG9jLmxvZ2ljYWxCbG9ja051bSArIGNvdW50KSA+IFVERl9TQl9QQVJUTEVOKHNiLCBibG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bSkpCisJeworCQl1ZGZfZGVidWcoIiVkIDwgJWQgfHwgJWQgKyAlZCA+ICVkXG4iLAorCQkJYmxvYy5sb2dpY2FsQmxvY2tOdW0sIDAsIGJsb2MubG9naWNhbEJsb2NrTnVtLCBjb3VudCwKKwkJCVVERl9TQl9QQVJUTEVOKHNiLCBibG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bSkpOworCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisKKwkvKiBXZSBkbyB0aGlzIHVwIGZyb250IC0gVGhlcmUgYXJlIHNvbWUgZXJyb3IgY29uZGl0aW9ucyB0aGF0IGNvdWxkIG9jY3VyZSwKKwkgICBidXQuLiBvaCB3ZWxsICovCisJaWYgKGlub2RlKQorCQlEUVVPVF9GUkVFX0JMT0NLKGlub2RlLCBjb3VudCk7CisJaWYgKFVERl9TQl9MVklEQkgoc2IpKQorCXsKKwkJVURGX1NCX0xWSUQoc2IpLT5mcmVlU3BhY2VUYWJsZVtVREZfU0JfUEFSVElUSU9OKHNiKV0gPQorCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUoVURGX1NCX0xWSUQoc2IpLT5mcmVlU3BhY2VUYWJsZVtVREZfU0JfUEFSVElUSU9OKHNiKV0pK2NvdW50KTsKKwkJbWFya19idWZmZXJfZGlydHkoVURGX1NCX0xWSURCSChzYikpOworCX0KKworCXN0YXJ0ID0gYmxvYy5sb2dpY2FsQmxvY2tOdW0gKyBvZmZzZXQ7CisJZW5kID0gYmxvYy5sb2dpY2FsQmxvY2tOdW0gKyBvZmZzZXQgKyBjb3VudCAtIDE7CisKKwlvZXh0b2Zmc2V0ID0gbmV4dG9mZnNldCA9IHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpOworCWVsZW4gPSAwOworCW9ibG9jID0gbmJsb2MgPSBVREZfSV9MT0NBVElPTih0YWJsZSk7CisKKwlvYmggPSBuYmggPSBOVUxMOworCisJd2hpbGUgKGNvdW50ICYmIChldHlwZSA9CisJCXVkZl9uZXh0X2FleHQodGFibGUsICZuYmxvYywgJm5leHRvZmZzZXQsICZlbG9jLCAmZWxlbiwgJm5iaCwgMSkpICE9IC0xKQorCXsKKwkJaWYgKCgoZWxvYy5sb2dpY2FsQmxvY2tOdW0gKyAoZWxlbiA+PiBzYi0+c19ibG9ja3NpemVfYml0cykpID09CisJCQlzdGFydCkpCisJCXsKKwkJCWlmICgoMHgzRkZGRkZGRiAtIGVsZW4pIDwgKGNvdW50IDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSkKKwkJCXsKKwkJCQljb3VudCAtPSAoKDB4M0ZGRkZGRkYgLSBlbGVuKSA+PiBzYi0+c19ibG9ja3NpemVfYml0cyk7CisJCQkJc3RhcnQgKz0gKCgweDNGRkZGRkZGIC0gZWxlbikgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQkJCWVsZW4gPSAoZXR5cGUgPDwgMzApIHwgKDB4NDAwMDAwMDAgLSBzYi0+c19ibG9ja3NpemUpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWVsZW4gPSAoZXR5cGUgPDwgMzApIHwKKwkJCQkJKGVsZW4gKyAoY291bnQgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpKTsKKwkJCQlzdGFydCArPSBjb3VudDsKKwkJCQljb3VudCA9IDA7CisJCQl9CisJCQl1ZGZfd3JpdGVfYWV4dCh0YWJsZSwgb2Jsb2MsICZvZXh0b2Zmc2V0LCBlbG9jLCBlbGVuLCBvYmgsIDEpOworCQl9CisJCWVsc2UgaWYgKGVsb2MubG9naWNhbEJsb2NrTnVtID09IChlbmQgKyAxKSkKKwkJeworCQkJaWYgKCgweDNGRkZGRkZGIC0gZWxlbikgPCAoY291bnQgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpKQorCQkJeworCQkJCWNvdW50IC09ICgoMHgzRkZGRkZGRiAtIGVsZW4pID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJCQllbmQgLT0gKCgweDNGRkZGRkZGIC0gZWxlbikgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQkJCWVsb2MubG9naWNhbEJsb2NrTnVtIC09CisJCQkJCSgoMHgzRkZGRkZGRiAtIGVsZW4pID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJCQllbGVuID0gKGV0eXBlIDw8IDMwKSB8ICgweDQwMDAwMDAwIC0gc2ItPnNfYmxvY2tzaXplKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQllbG9jLmxvZ2ljYWxCbG9ja051bSA9IHN0YXJ0OworCQkJCWVsZW4gPSAoZXR5cGUgPDwgMzApIHwKKwkJCQkJKGVsZW4gKyAoY291bnQgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpKTsKKwkJCQllbmQgLT0gY291bnQ7CisJCQkJY291bnQgPSAwOworCQkJfQorCQkJdWRmX3dyaXRlX2FleHQodGFibGUsIG9ibG9jLCAmb2V4dG9mZnNldCwgZWxvYywgZWxlbiwgb2JoLCAxKTsKKwkJfQorCisJCWlmIChuYmggIT0gb2JoKQorCQl7CisJCQlpID0gLTE7CisJCQlvYmxvYyA9IG5ibG9jOworCQkJdWRmX3JlbGVhc2VfZGF0YShvYmgpOworCQkJYXRvbWljX2luYygmbmJoLT5iX2NvdW50KTsKKwkJCW9iaCA9IG5iaDsKKwkJCW9leHRvZmZzZXQgPSAwOworCQl9CisJCWVsc2UKKwkJCW9leHRvZmZzZXQgPSBuZXh0b2Zmc2V0OworCX0KKworCWlmIChjb3VudCkKKwl7CisJCS8qIE5PVEU6IHdlIENBTk5PVCB1c2UgdWRmX2FkZF9hZXh0IGhlcmUsIGFzIGl0IGNhbiB0cnkgdG8gYWxsb2NhdGUKKwkJCQkgYSBuZXcgYmxvY2ssIGFuZCBzaW5jZSB3ZSBob2xkIHRoZSBzdXBlciBibG9jayBsb2NrIGFscmVhZHkKKwkJCQkgdmVyeSBiYWQgdGhpbmdzIHdvdWxkIGhhcHBlbiA6KQorCisJCQkJIFdlIGNvcHkgdGhlIGJlaGF2aW9yIG9mIHVkZl9hZGRfYWV4dCwgYnV0IGluc3RlYWQgb2YKKwkJCQkgdHJ5aW5nIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrIGNsb3NlIHRvIHRoZSBleGlzdGluZyBvbmUsCisJCQkJIHdlIGp1c3Qgc3RlYWwgYSBibG9jayBmcm9tIHRoZSBleHRlbnQgd2UgYXJlIHRyeWluZyB0byBhZGQuCisKKwkJCQkgSXQgd291bGQgYmUgbmljZSBpZiB0aGUgYmxvY2tzIHdlcmUgY2xvc2UgdG9nZXRoZXIsIGJ1dCBpdAorCQkJCSBpc24ndCByZXF1aXJlZC4KKwkJKi8KKworCQlpbnQgYWRzaXplOworCQlzaG9ydF9hZCAqc2FkID0gTlVMTDsKKwkJbG9uZ19hZCAqbGFkID0gTlVMTDsKKwkJc3RydWN0IGFsbG9jRXh0RGVzYyAqYWVkOworCisJCWVsb2MubG9naWNhbEJsb2NrTnVtID0gc3RhcnQ7CisJCWVsZW4gPSBFWFRfUkVDT1JERURfQUxMT0NBVEVEIHwKKwkJCShjb3VudCA8PCBzYi0+c19ibG9ja3NpemVfYml0cyk7CisKKwkJaWYgKFVERl9JX0FMTE9DVFlQRSh0YWJsZSkgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCisJCQlhZHNpemUgPSBzaXplb2Yoc2hvcnRfYWQpOworCQllbHNlIGlmIChVREZfSV9BTExPQ1RZUEUodGFibGUpID09IElDQlRBR19GTEFHX0FEX0xPTkcpCisJCQlhZHNpemUgPSBzaXplb2YobG9uZ19hZCk7CisJCWVsc2UKKwkJeworCQkJdWRmX3JlbGVhc2VfZGF0YShvYmgpOworCQkJdWRmX3JlbGVhc2VfZGF0YShuYmgpOworCQkJZ290byBlcnJvcl9yZXR1cm47CisJCX0KKworCQlpZiAobmV4dG9mZnNldCArICgyICogYWRzaXplKSA+IHNiLT5zX2Jsb2Nrc2l6ZSkKKwkJeworCQkJY2hhciAqc3B0ciwgKmRwdHI7CisJCQlpbnQgbG9mZnNldDsKKwkKKwkJCXVkZl9yZWxlYXNlX2RhdGEob2JoKTsKKwkJCW9iaCA9IG5iaDsKKwkJCW9ibG9jID0gbmJsb2M7CisJCQlvZXh0b2Zmc2V0ID0gbmV4dG9mZnNldDsKKworCQkJLyogU3RlYWwgYSBibG9jayBmcm9tIHRoZSBleHRlbnQgYmVpbmcgZnJlZSdkICovCisJCQluYmxvYy5sb2dpY2FsQmxvY2tOdW0gPSBlbG9jLmxvZ2ljYWxCbG9ja051bTsKKwkJCWVsb2MubG9naWNhbEJsb2NrTnVtICsrOworCQkJZWxlbiAtPSBzYi0+c19ibG9ja3NpemU7CisKKwkJCWlmICghKG5iaCA9IHVkZl90cmVhZChzYiwKKwkJCQl1ZGZfZ2V0X2xiX3BibG9jayhzYiwgbmJsb2MsIDApKSkpCisJCQl7CisJCQkJdWRmX3JlbGVhc2VfZGF0YShvYmgpOworCQkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQkJfQorCQkJYWVkID0gKHN0cnVjdCBhbGxvY0V4dERlc2MgKikobmJoLT5iX2RhdGEpOworCQkJYWVkLT5wcmV2aW91c0FsbG9jRXh0TG9jYXRpb24gPSBjcHVfdG9fbGUzMihvYmxvYy5sb2dpY2FsQmxvY2tOdW0pOworCQkJaWYgKG5leHRvZmZzZXQgKyBhZHNpemUgPiBzYi0+c19ibG9ja3NpemUpCisJCQl7CisJCQkJbG9mZnNldCA9IG5leHRvZmZzZXQ7CisJCQkJYWVkLT5sZW5ndGhBbGxvY0Rlc2NzID0gY3B1X3RvX2xlMzIoYWRzaXplKTsKKwkJCQlpZiAob2JoKQorCQkJCQlzcHRyID0gVURGX0lfREFUQShpbm9kZSkgKyBuZXh0b2Zmc2V0IC0gIHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChpbm9kZSkgKyBVREZfSV9MRU5FQVRUUihpbm9kZSkgLSBhZHNpemU7CisJCQkJZWxzZQorCQkJCQlzcHRyID0gb2JoLT5iX2RhdGEgKyBuZXh0b2Zmc2V0IC0gYWRzaXplOworCQkJCWRwdHIgPSBuYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKTsKKwkJCQltZW1jcHkoZHB0ciwgc3B0ciwgYWRzaXplKTsKKwkJCQluZXh0b2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpICsgYWRzaXplOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWxvZmZzZXQgPSBuZXh0b2Zmc2V0ICsgYWRzaXplOworCQkJCWFlZC0+bGVuZ3RoQWxsb2NEZXNjcyA9IGNwdV90b19sZTMyKDApOworCQkJCXNwdHIgPSAob2JoKS0+Yl9kYXRhICsgbmV4dG9mZnNldDsKKwkJCQluZXh0b2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpOworCisJCQkJaWYgKG9iaCkKKwkJCQl7CisJCQkJCWFlZCA9IChzdHJ1Y3QgYWxsb2NFeHREZXNjICopKG9iaCktPmJfZGF0YTsKKwkJCQkJYWVkLT5sZW5ndGhBbGxvY0Rlc2NzID0KKwkJCQkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KGFlZC0+bGVuZ3RoQWxsb2NEZXNjcykgKyBhZHNpemUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlVREZfSV9MRU5BTExPQyh0YWJsZSkgKz0gYWRzaXplOworCQkJCQltYXJrX2lub2RlX2RpcnR5KHRhYmxlKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoVURGX1NCX1VERlJFVihzYikgPj0gMHgwMjAwKQorCQkJCXVkZl9uZXdfdGFnKG5iaC0+Yl9kYXRhLCBUQUdfSURFTlRfQUVELCAzLCAxLAorCQkJCQluYmxvYy5sb2dpY2FsQmxvY2tOdW0sIHNpemVvZih0YWcpKTsKKwkJCWVsc2UKKwkJCQl1ZGZfbmV3X3RhZyhuYmgtPmJfZGF0YSwgVEFHX0lERU5UX0FFRCwgMiwgMSwKKwkJCQkJbmJsb2MubG9naWNhbEJsb2NrTnVtLCBzaXplb2YodGFnKSk7CisJCQlzd2l0Y2ggKFVERl9JX0FMTE9DVFlQRSh0YWJsZSkpCisJCQl7CisJCQkJY2FzZSBJQ0JUQUdfRkxBR19BRF9TSE9SVDoKKwkJCQl7CisJCQkJCXNhZCA9IChzaG9ydF9hZCAqKXNwdHI7CisJCQkJCXNhZC0+ZXh0TGVuZ3RoID0gY3B1X3RvX2xlMzIoCisJCQkJCQlFWFRfTkVYVF9FWFRFTlRfQUxMT0NERUNTIHwKKwkJCQkJCXNiLT5zX2Jsb2Nrc2l6ZSk7CisJCQkJCXNhZC0+ZXh0UG9zaXRpb24gPSBjcHVfdG9fbGUzMihuYmxvYy5sb2dpY2FsQmxvY2tOdW0pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBJQ0JUQUdfRkxBR19BRF9MT05HOgorCQkJCXsKKwkJCQkJbGFkID0gKGxvbmdfYWQgKilzcHRyOworCQkJCQlsYWQtPmV4dExlbmd0aCA9IGNwdV90b19sZTMyKAorCQkJCQkJRVhUX05FWFRfRVhURU5UX0FMTE9DREVDUyB8CisJCQkJCQlzYi0+c19ibG9ja3NpemUpOworCQkJCQlsYWQtPmV4dExvY2F0aW9uID0gY3B1X3RvX2xlbGIobmJsb2MpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAob2JoKQorCQkJeworCQkJCXVkZl91cGRhdGVfdGFnKG9iaC0+Yl9kYXRhLCBsb2Zmc2V0KTsKKwkJCQltYXJrX2J1ZmZlcl9kaXJ0eShvYmgpOworCQkJfQorCQkJZWxzZQorCQkJCW1hcmtfaW5vZGVfZGlydHkodGFibGUpOworCQl9CisKKwkJaWYgKGVsZW4pIC8qIEl0J3MgcG9zc2libGUgdGhhdCBzdGVhbGluZyB0aGUgYmxvY2sgZW1wdGllZCB0aGUgZXh0ZW50ICovCisJCXsKKwkJCXVkZl93cml0ZV9hZXh0KHRhYmxlLCBuYmxvYywgJm5leHRvZmZzZXQsIGVsb2MsIGVsZW4sIG5iaCwgMSk7CisKKwkJCWlmICghbmJoKQorCQkJeworCQkJCVVERl9JX0xFTkFMTE9DKHRhYmxlKSArPSBhZHNpemU7CisJCQkJbWFya19pbm9kZV9kaXJ0eSh0YWJsZSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYWVkID0gKHN0cnVjdCBhbGxvY0V4dERlc2MgKiluYmgtPmJfZGF0YTsKKwkJCQlhZWQtPmxlbmd0aEFsbG9jRGVzY3MgPQorCQkJCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShhZWQtPmxlbmd0aEFsbG9jRGVzY3MpICsgYWRzaXplKTsKKwkJCQl1ZGZfdXBkYXRlX3RhZyhuYmgtPmJfZGF0YSwgbmV4dG9mZnNldCk7CisJCQkJbWFya19idWZmZXJfZGlydHkobmJoKTsKKwkJCX0KKwkJfQorCX0KKworCXVkZl9yZWxlYXNlX2RhdGEobmJoKTsKKwl1ZGZfcmVsZWFzZV9kYXRhKG9iaCk7CisKK2Vycm9yX3JldHVybjoKKwlzYi0+c19kaXJ0ID0gMTsKKwl1cCgmc2JpLT5zX2FsbG9jX3NlbSk7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHVkZl90YWJsZV9wcmVhbGxvY19ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCisJc3RydWN0IGlub2RlICogaW5vZGUsCisJc3RydWN0IGlub2RlICp0YWJsZSwgdWludDE2X3QgcGFydGl0aW9uLCB1aW50MzJfdCBmaXJzdF9ibG9jaywKKwl1aW50MzJfdCBibG9ja19jb3VudCkKK3sKKwlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaSA9IFVERl9TQihzYik7CisJaW50IGFsbG9jX2NvdW50ID0gMDsKKwl1aW50MzJfdCBleHRvZmZzZXQsIGVsZW4sIGFkc2l6ZTsKKwlrZXJuZWxfbGJfYWRkciBibG9jLCBlbG9jOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50OF90IGV0eXBlID0gLTE7CisKKwlpZiAoZmlyc3RfYmxvY2sgPCAwIHx8IGZpcnN0X2Jsb2NrID49IFVERl9TQl9QQVJUTEVOKHNiLCBwYXJ0aXRpb24pKQorCQlyZXR1cm4gMDsKKworCWlmIChVREZfSV9BTExPQ1RZUEUodGFibGUpID09IElDQlRBR19GTEFHX0FEX1NIT1JUKQorCQlhZHNpemUgPSBzaXplb2Yoc2hvcnRfYWQpOworCWVsc2UgaWYgKFVERl9JX0FMTE9DVFlQRSh0YWJsZSkgPT0gSUNCVEFHX0ZMQUdfQURfTE9ORykKKwkJYWRzaXplID0gc2l6ZW9mKGxvbmdfYWQpOworCWVsc2UKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZzYmktPnNfYWxsb2Nfc2VtKTsKKwlleHRvZmZzZXQgPSBzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KTsKKwlibG9jID0gVURGX0lfTE9DQVRJT04odGFibGUpOworCisJYmggPSBOVUxMOworCWVsb2MubG9naWNhbEJsb2NrTnVtID0gMHhGRkZGRkZGRjsKKworCXdoaWxlIChmaXJzdF9ibG9jayAhPSBlbG9jLmxvZ2ljYWxCbG9ja051bSAmJiAoZXR5cGUgPQorCQl1ZGZfbmV4dF9hZXh0KHRhYmxlLCAmYmxvYywgJmV4dG9mZnNldCwgJmVsb2MsICZlbGVuLCAmYmgsIDEpKSAhPSAtMSkKKwl7CisJCXVkZl9kZWJ1ZygiZWxvYz0lZCwgZWxlbj0lZCwgZmlyc3RfYmxvY2s9JWRcbiIsCisJCQllbG9jLmxvZ2ljYWxCbG9ja051bSwgZWxlbiwgZmlyc3RfYmxvY2spOworCQk7IC8qIGVtcHR5IGxvb3AgYm9keSAqLworCX0KKworCWlmIChmaXJzdF9ibG9jayA9PSBlbG9jLmxvZ2ljYWxCbG9ja051bSkKKwl7CisJCWV4dG9mZnNldCAtPSBhZHNpemU7CisKKwkJYWxsb2NfY291bnQgPSAoZWxlbiA+PiBzYi0+c19ibG9ja3NpemVfYml0cyk7CisJCWlmIChpbm9kZSAmJiBEUVVPVF9QUkVBTExPQ19CTE9DSyhpbm9kZSwgYWxsb2NfY291bnQgPiBibG9ja19jb3VudCA/IGJsb2NrX2NvdW50IDogYWxsb2NfY291bnQpKQorCQkJYWxsb2NfY291bnQgPSAwOworCQllbHNlIGlmIChhbGxvY19jb3VudCA+IGJsb2NrX2NvdW50KQorCQl7CisJCQlhbGxvY19jb3VudCA9IGJsb2NrX2NvdW50OworCQkJZWxvYy5sb2dpY2FsQmxvY2tOdW0gKz0gYWxsb2NfY291bnQ7CisJCQllbGVuIC09IChhbGxvY19jb3VudCA8PCBzYi0+c19ibG9ja3NpemVfYml0cyk7CisJCQl1ZGZfd3JpdGVfYWV4dCh0YWJsZSwgYmxvYywgJmV4dG9mZnNldCwgZWxvYywgKGV0eXBlIDw8IDMwKSB8IGVsZW4sIGJoLCAxKTsKKwkJfQorCQllbHNlCisJCQl1ZGZfZGVsZXRlX2FleHQodGFibGUsIGJsb2MsIGV4dG9mZnNldCwgZWxvYywgKGV0eXBlIDw8IDMwKSB8IGVsZW4sIGJoKTsKKwl9CisJZWxzZQorCQlhbGxvY19jb3VudCA9IDA7CisKKwl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKworCWlmIChhbGxvY19jb3VudCAmJiBVREZfU0JfTFZJREJIKHNiKSkKKwl7CisJCVVERl9TQl9MVklEKHNiKS0+ZnJlZVNwYWNlVGFibGVbcGFydGl0aW9uXSA9CisJCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShVREZfU0JfTFZJRChzYiktPmZyZWVTcGFjZVRhYmxlW3BhcnRpdGlvbl0pLWFsbG9jX2NvdW50KTsKKwkJbWFya19idWZmZXJfZGlydHkoVURGX1NCX0xWSURCSChzYikpOworCQlzYi0+c19kaXJ0ID0gMTsKKwl9CisJdXAoJnNiaS0+c19hbGxvY19zZW0pOworCXJldHVybiBhbGxvY19jb3VudDsKK30KKworc3RhdGljIGludCB1ZGZfdGFibGVfbmV3X2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAorCXN0cnVjdCBpbm9kZSAqIGlub2RlLAorCXN0cnVjdCBpbm9kZSAqdGFibGUsIHVpbnQxNl90IHBhcnRpdGlvbiwgdWludDMyX3QgZ29hbCwgaW50ICplcnIpCit7CisJc3RydWN0IHVkZl9zYl9pbmZvICpzYmkgPSBVREZfU0Ioc2IpOworCXVpbnQzMl90IHNwcmVhZCA9IDB4RkZGRkZGRkYsIG5zcHJlYWQgPSAweEZGRkZGRkZGOworCXVpbnQzMl90IG5ld2Jsb2NrID0gMCwgYWRzaXplOworCXVpbnQzMl90IGV4dG9mZnNldCwgZ29hbF9leHRvZmZzZXQsIGVsZW4sIGdvYWxfZWxlbiA9IDA7CisJa2VybmVsX2xiX2FkZHIgYmxvYywgZ29hbF9ibG9jLCBlbG9jLCBnb2FsX2Vsb2M7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmdvYWxfYmg7CisJaW50OF90IGV0eXBlOworCisJKmVyciA9IC1FTk9TUEM7CisKKwlpZiAoVURGX0lfQUxMT0NUWVBFKHRhYmxlKSA9PSBJQ0JUQUdfRkxBR19BRF9TSE9SVCkKKwkJYWRzaXplID0gc2l6ZW9mKHNob3J0X2FkKTsKKwllbHNlIGlmIChVREZfSV9BTExPQ1RZUEUodGFibGUpID09IElDQlRBR19GTEFHX0FEX0xPTkcpCisJCWFkc2l6ZSA9IHNpemVvZihsb25nX2FkKTsKKwllbHNlCisJCXJldHVybiBuZXdibG9jazsKKworCWRvd24oJnNiaS0+c19hbGxvY19zZW0pOworCWlmIChnb2FsIDwgMCB8fCBnb2FsID49IFVERl9TQl9QQVJUTEVOKHNiLCBwYXJ0aXRpb24pKQorCQlnb2FsID0gMDsKKworCS8qIFdlIHNlYXJjaCBmb3IgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgYmxvY2sgdG8gZ29hbC4gSWYgd2UgZmluZCBhIGV4YWN0IGhpdCwKKwkgICB3ZSBzdG9wLiBPdGhlcndpc2Ugd2Uga2VlcCBnb2luZyB0aWxsIHdlIHJ1biBvdXQgb2YgZXh0ZW50cy4KKwkgICBXZSBzdG9yZSB0aGUgYnVmZmVyX2hlYWQsIGJsb2MsIGFuZCBleHRvZmZzZXQgb2YgdGhlIGN1cnJlbnQgY2xvc2VzdAorCSAgIG1hdGNoIGFuZCB1c2UgdGhhdCB3aGVuIHdlIGFyZSBkb25lLgorCSovCisKKwlleHRvZmZzZXQgPSBzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KTsKKwlibG9jID0gVURGX0lfTE9DQVRJT04odGFibGUpOworCisJZ29hbF9iaCA9IGJoID0gTlVMTDsKKworCXdoaWxlIChzcHJlYWQgJiYgKGV0eXBlID0KKwkJdWRmX25leHRfYWV4dCh0YWJsZSwgJmJsb2MsICZleHRvZmZzZXQsICZlbG9jLCAmZWxlbiwgJmJoLCAxKSkgIT0gLTEpCisJeworCQlpZiAoZ29hbCA+PSBlbG9jLmxvZ2ljYWxCbG9ja051bSkKKwkJeworCQkJaWYgKGdvYWwgPCBlbG9jLmxvZ2ljYWxCbG9ja051bSArIChlbGVuID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSkKKwkJCQluc3ByZWFkID0gMDsKKwkJCWVsc2UKKwkJCQluc3ByZWFkID0gZ29hbCAtIGVsb2MubG9naWNhbEJsb2NrTnVtIC0KKwkJCQkJKGVsZW4gPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQl9CisJCWVsc2UKKwkJCW5zcHJlYWQgPSBlbG9jLmxvZ2ljYWxCbG9ja051bSAtIGdvYWw7CisKKwkJaWYgKG5zcHJlYWQgPCBzcHJlYWQpCisJCXsKKwkJCXNwcmVhZCA9IG5zcHJlYWQ7CisJCQlpZiAoZ29hbF9iaCAhPSBiaCkKKwkJCXsKKwkJCQl1ZGZfcmVsZWFzZV9kYXRhKGdvYWxfYmgpOworCQkJCWdvYWxfYmggPSBiaDsKKwkJCQlhdG9taWNfaW5jKCZnb2FsX2JoLT5iX2NvdW50KTsKKwkJCX0KKwkJCWdvYWxfYmxvYyA9IGJsb2M7CisJCQlnb2FsX2V4dG9mZnNldCA9IGV4dG9mZnNldCAtIGFkc2l6ZTsKKwkJCWdvYWxfZWxvYyA9IGVsb2M7CisJCQlnb2FsX2VsZW4gPSAoZXR5cGUgPDwgMzApIHwgZWxlbjsKKwkJfQorCX0KKworCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCisJaWYgKHNwcmVhZCA9PSAweEZGRkZGRkZGKQorCXsKKwkJdWRmX3JlbGVhc2VfZGF0YShnb2FsX2JoKTsKKwkJdXAoJnNiaS0+c19hbGxvY19zZW0pOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBPbmx5IGFsbG9jYXRlIGJsb2NrcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGV4dGVudC4KKwkgICBUaGF0IHdheSwgd2Ugb25seSBkZWxldGUgKGVtcHR5KSBleHRlbnRzLCBuZXZlciBoYXZlIHRvIGluc2VydCBhbgorCSAgIGV4dGVudCBiZWNhdXNlIG9mIHNwbGl0dGluZyAqLworCS8qIFRoaXMgd29ya3MsIGJ1dCB2ZXJ5IHBvb3JseS4uLi4gKi8KKworCW5ld2Jsb2NrID0gZ29hbF9lbG9jLmxvZ2ljYWxCbG9ja051bTsKKwlnb2FsX2Vsb2MubG9naWNhbEJsb2NrTnVtICsrOworCWdvYWxfZWxlbiAtPSBzYi0+c19ibG9ja3NpemU7CisKKwlpZiAoaW5vZGUgJiYgRFFVT1RfQUxMT0NfQkxPQ0soaW5vZGUsIDEpKQorCXsKKwkJdWRmX3JlbGVhc2VfZGF0YShnb2FsX2JoKTsKKwkJdXAoJnNiaS0+c19hbGxvY19zZW0pOworCQkqZXJyID0gLUVEUVVPVDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGdvYWxfZWxlbikKKwkJdWRmX3dyaXRlX2FleHQodGFibGUsIGdvYWxfYmxvYywgJmdvYWxfZXh0b2Zmc2V0LCBnb2FsX2Vsb2MsIGdvYWxfZWxlbiwgZ29hbF9iaCwgMSk7CisJZWxzZQorCQl1ZGZfZGVsZXRlX2FleHQodGFibGUsIGdvYWxfYmxvYywgZ29hbF9leHRvZmZzZXQsIGdvYWxfZWxvYywgZ29hbF9lbGVuLCBnb2FsX2JoKTsKKwl1ZGZfcmVsZWFzZV9kYXRhKGdvYWxfYmgpOworCisJaWYgKFVERl9TQl9MVklEQkgoc2IpKQorCXsKKwkJVURGX1NCX0xWSUQoc2IpLT5mcmVlU3BhY2VUYWJsZVtwYXJ0aXRpb25dID0KKwkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KFVERl9TQl9MVklEKHNiKS0+ZnJlZVNwYWNlVGFibGVbcGFydGl0aW9uXSktMSk7CisJCW1hcmtfYnVmZmVyX2RpcnR5KFVERl9TQl9MVklEQkgoc2IpKTsKKwl9CisKKwlzYi0+c19kaXJ0ID0gMTsKKwl1cCgmc2JpLT5zX2FsbG9jX3NlbSk7CisJKmVyciA9IDA7CisJcmV0dXJuIG5ld2Jsb2NrOworfQorCitpbmxpbmUgdm9pZCB1ZGZfZnJlZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCisJc3RydWN0IGlub2RlICogaW5vZGUsCisJa2VybmVsX2xiX2FkZHIgYmxvYywgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBjb3VudCkKK3sKKwl1aW50MTZfdCBwYXJ0aXRpb24gPSBibG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bTsKKworCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBwYXJ0aXRpb24pICYgVURGX1BBUlRfRkxBR19VTkFMTE9DX0JJVE1BUCkKKwl7CisJCXJldHVybiB1ZGZfYml0bWFwX2ZyZWVfYmxvY2tzKHNiLCBpbm9kZSwKKwkJCVVERl9TQl9QQVJUTUFQUyhzYilbcGFydGl0aW9uXS5zX3VzcGFjZS5zX2JpdG1hcCwKKwkJCWJsb2MsIG9mZnNldCwgY291bnQpOworCX0KKwllbHNlIGlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBwYXJ0aXRpb24pICYgVURGX1BBUlRfRkxBR19VTkFMTE9DX1RBQkxFKQorCXsKKwkJcmV0dXJuIHVkZl90YWJsZV9mcmVlX2Jsb2NrcyhzYiwgaW5vZGUsCisJCQlVREZfU0JfUEFSVE1BUFMoc2IpW3BhcnRpdGlvbl0uc191c3BhY2Uuc190YWJsZSwKKwkJCWJsb2MsIG9mZnNldCwgY291bnQpOworCX0KKwllbHNlIGlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBwYXJ0aXRpb24pICYgVURGX1BBUlRfRkxBR19GUkVFRF9CSVRNQVApCisJeworCQlyZXR1cm4gdWRmX2JpdG1hcF9mcmVlX2Jsb2NrcyhzYiwgaW5vZGUsCisJCQlVREZfU0JfUEFSVE1BUFMoc2IpW3BhcnRpdGlvbl0uc19mc3BhY2Uuc19iaXRtYXAsCisJCQlibG9jLCBvZmZzZXQsIGNvdW50KTsKKwl9CisJZWxzZSBpZiAoVURGX1NCX1BBUlRGTEFHUyhzYiwgcGFydGl0aW9uKSAmIFVERl9QQVJUX0ZMQUdfRlJFRURfVEFCTEUpCisJeworCQlyZXR1cm4gdWRmX3RhYmxlX2ZyZWVfYmxvY2tzKHNiLCBpbm9kZSwKKwkJCVVERl9TQl9QQVJUTUFQUyhzYilbcGFydGl0aW9uXS5zX2ZzcGFjZS5zX3RhYmxlLAorCQkJYmxvYywgb2Zmc2V0LCBjb3VudCk7CisJfQorCWVsc2UKKwkJcmV0dXJuOworfQorCitpbmxpbmUgaW50IHVkZl9wcmVhbGxvY19ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCisJc3RydWN0IGlub2RlICogaW5vZGUsCisJdWludDE2X3QgcGFydGl0aW9uLCB1aW50MzJfdCBmaXJzdF9ibG9jaywgdWludDMyX3QgYmxvY2tfY291bnQpCit7CisJaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsIHBhcnRpdGlvbikgJiBVREZfUEFSVF9GTEFHX1VOQUxMT0NfQklUTUFQKQorCXsKKwkJcmV0dXJuIHVkZl9iaXRtYXBfcHJlYWxsb2NfYmxvY2tzKHNiLCBpbm9kZSwKKwkJCVVERl9TQl9QQVJUTUFQUyhzYilbcGFydGl0aW9uXS5zX3VzcGFjZS5zX2JpdG1hcCwKKwkJCXBhcnRpdGlvbiwgZmlyc3RfYmxvY2ssIGJsb2NrX2NvdW50KTsKKwl9CisJZWxzZSBpZiAoVURGX1NCX1BBUlRGTEFHUyhzYiwgcGFydGl0aW9uKSAmIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19UQUJMRSkKKwl7CisJCXJldHVybiB1ZGZfdGFibGVfcHJlYWxsb2NfYmxvY2tzKHNiLCBpbm9kZSwKKwkJCVVERl9TQl9QQVJUTUFQUyhzYilbcGFydGl0aW9uXS5zX3VzcGFjZS5zX3RhYmxlLAorCQkJcGFydGl0aW9uLCBmaXJzdF9ibG9jaywgYmxvY2tfY291bnQpOworCX0KKwllbHNlIGlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBwYXJ0aXRpb24pICYgVURGX1BBUlRfRkxBR19GUkVFRF9CSVRNQVApCisJeworCQlyZXR1cm4gdWRmX2JpdG1hcF9wcmVhbGxvY19ibG9ja3Moc2IsIGlub2RlLAorCQkJVURGX1NCX1BBUlRNQVBTKHNiKVtwYXJ0aXRpb25dLnNfZnNwYWNlLnNfYml0bWFwLAorCQkJcGFydGl0aW9uLCBmaXJzdF9ibG9jaywgYmxvY2tfY291bnQpOworCX0KKwllbHNlIGlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBwYXJ0aXRpb24pICYgVURGX1BBUlRfRkxBR19GUkVFRF9UQUJMRSkKKwl7CisJCXJldHVybiB1ZGZfdGFibGVfcHJlYWxsb2NfYmxvY2tzKHNiLCBpbm9kZSwKKwkJCVVERl9TQl9QQVJUTUFQUyhzYilbcGFydGl0aW9uXS5zX2ZzcGFjZS5zX3RhYmxlLAorCQkJcGFydGl0aW9uLCBmaXJzdF9ibG9jaywgYmxvY2tfY291bnQpOworCX0KKwllbHNlCisJCXJldHVybiAwOworfQorCitpbmxpbmUgaW50IHVkZl9uZXdfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCisJc3RydWN0IGlub2RlICogaW5vZGUsCisJdWludDE2X3QgcGFydGl0aW9uLCB1aW50MzJfdCBnb2FsLCBpbnQgKmVycikKK3sKKwlpZiAoVURGX1NCX1BBUlRGTEFHUyhzYiwgcGFydGl0aW9uKSAmIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19CSVRNQVApCisJeworCQlyZXR1cm4gdWRmX2JpdG1hcF9uZXdfYmxvY2soc2IsIGlub2RlLAorCQkJVURGX1NCX1BBUlRNQVBTKHNiKVtwYXJ0aXRpb25dLnNfdXNwYWNlLnNfYml0bWFwLAorCQkJcGFydGl0aW9uLCBnb2FsLCBlcnIpOworCX0KKwllbHNlIGlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBwYXJ0aXRpb24pICYgVURGX1BBUlRfRkxBR19VTkFMTE9DX1RBQkxFKQorCXsKKwkJcmV0dXJuIHVkZl90YWJsZV9uZXdfYmxvY2soc2IsIGlub2RlLAorCQkJVURGX1NCX1BBUlRNQVBTKHNiKVtwYXJ0aXRpb25dLnNfdXNwYWNlLnNfdGFibGUsCisJCQlwYXJ0aXRpb24sIGdvYWwsIGVycik7CisJfQorCWVsc2UgaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsIHBhcnRpdGlvbikgJiBVREZfUEFSVF9GTEFHX0ZSRUVEX0JJVE1BUCkKKwl7CisJCXJldHVybiB1ZGZfYml0bWFwX25ld19ibG9jayhzYiwgaW5vZGUsCisJCQlVREZfU0JfUEFSVE1BUFMoc2IpW3BhcnRpdGlvbl0uc19mc3BhY2Uuc19iaXRtYXAsCisJCQlwYXJ0aXRpb24sIGdvYWwsIGVycik7CisJfQorCWVsc2UgaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsIHBhcnRpdGlvbikgJiBVREZfUEFSVF9GTEFHX0ZSRUVEX1RBQkxFKQorCXsKKwkJcmV0dXJuIHVkZl90YWJsZV9uZXdfYmxvY2soc2IsIGlub2RlLAorCQkJVURGX1NCX1BBUlRNQVBTKHNiKVtwYXJ0aXRpb25dLnNfZnNwYWNlLnNfdGFibGUsCisJCQlwYXJ0aXRpb24sIGdvYWwsIGVycik7CisJfQorCWVsc2UKKwl7CisJCSplcnIgPSAtRUlPOworCQlyZXR1cm4gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9mcy91ZGYvY3JjLmMgYi9mcy91ZGYvY3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1YzZlMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3VkZi9jcmMuYwpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIGNyYy5jCisgKgorICogUFVSUE9TRQorICoJUm91dGluZXMgdG8gZ2VuZXJhdGUsIGNhbGN1bGF0ZSwgYW5kIHRlc3QgYSAxNi1iaXQgQ1JDLgorICoKKyAqIERFU0NSSVBUSU9OCisgKglUaGUgQ1JDIGNvZGUgd2FzIGRldmlzZWQgYnkgRG9uIFAuIE1pdGNoZWxsIG9mIEFUJlQgQmVsbCBMYWJvcmF0b3JpZXMKKyAqCWFuZCBOZWQgVy4gUmhvZGVzIG9mIFNvZnR3YXJlIFN5c3RlbXMgR3JvdXAuIEl0IGhhcyBiZWVuIHB1Ymxpc2hlZCBpbgorICoJIkRlc2lnbiBhbmQgVmFsaWRhdGlvbiBvZiBDb21wdXRlciBQcm90b2NvbHMiLCBQcmVudGljZSBIYWxsLAorICoJRW5nbGV3b29kIENsaWZmcywgTkosIDE5OTEsIENoYXB0ZXIgMywgSVNCTiAwLTEzLTUzOTkyNS00LgorICoKKyAqCUNvcHlyaWdodCBpcyBoZWxkIGJ5IEFUJlQuCisgKgorICoJQVQmVCBnaXZlcyBwZXJtaXNzaW9uIGZvciB0aGUgZnJlZSB1c2Ugb2YgdGhlIENSQyBzb3VyY2UgY29kZS4KKyAqCisgKiBDT05UQUNUUworICoJRS1tYWlsIHJlZ2FyZGluZyBhbnkgcG9ydGlvbiBvZiB0aGUgTGludXggVURGIGZpbGUgc3lzdGVtIHNob3VsZCBiZQorICoJZGlyZWN0ZWQgdG8gdGhlIGRldmVsb3BtZW50IHRlYW0gbWFpbGluZyBsaXN0IChydW4gYnkgbWFqb3Jkb21vKToKKyAqCQlsaW51eF91ZGZAaHBlc2pyby5mYy5ocC5jb20KKyAqCisgKiBDT1BZUklHSFQKKyAqCVRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSAoR1BMKS4gQ29waWVzIG9mIHRoZSBHUEwgY2FuIGJlIG9idGFpbmVkIGZyb206CisgKgkJZnRwOi8vcHJlcC5haS5taXQuZWR1L3B1Yi9nbnUvR1BMCisgKglFYWNoIGNvbnRyaWJ1dGluZyBhdXRob3IgcmV0YWlucyBhbGwgcmlnaHRzIHRvIHRoZWlyIG93biB3b3JrLgorICovCisKKyNpbmNsdWRlICJ1ZGZkZWNsLmgiCisKK3N0YXRpYyB1aW50MTZfdCBjcmNfdGFibGVbMjU2XSA9IHsKKwkweDAwMDBVLCAweDEwMjFVLCAweDIwNDJVLCAweDMwNjNVLCAweDQwODRVLCAweDUwYTVVLCAweDYwYzZVLCAweDcwZTdVLAorCTB4ODEwOFUsIDB4OTEyOVUsIDB4YTE0YVUsIDB4YjE2YlUsIDB4YzE4Y1UsIDB4ZDFhZFUsIDB4ZTFjZVUsIDB4ZjFlZlUsCisJMHgxMjMxVSwgMHgwMjEwVSwgMHgzMjczVSwgMHgyMjUyVSwgMHg1MmI1VSwgMHg0Mjk0VSwgMHg3MmY3VSwgMHg2MmQ2VSwKKwkweDkzMzlVLCAweDgzMThVLCAweGIzN2JVLCAweGEzNWFVLCAweGQzYmRVLCAweGMzOWNVLCAweGYzZmZVLCAweGUzZGVVLAorCTB4MjQ2MlUsIDB4MzQ0M1UsIDB4MDQyMFUsIDB4MTQwMVUsIDB4NjRlNlUsIDB4NzRjN1UsIDB4NDRhNFUsIDB4NTQ4NVUsCisJMHhhNTZhVSwgMHhiNTRiVSwgMHg4NTI4VSwgMHg5NTA5VSwgMHhlNWVlVSwgMHhmNWNmVSwgMHhjNWFjVSwgMHhkNThkVSwKKwkweDM2NTNVLCAweDI2NzJVLCAweDE2MTFVLCAweDA2MzBVLCAweDc2ZDdVLCAweDY2ZjZVLCAweDU2OTVVLCAweDQ2YjRVLAorCTB4Yjc1YlUsIDB4YTc3YVUsIDB4OTcxOVUsIDB4ODczOFUsIDB4ZjdkZlUsIDB4ZTdmZVUsIDB4ZDc5ZFUsIDB4YzdiY1UsCisJMHg0OGM0VSwgMHg1OGU1VSwgMHg2ODg2VSwgMHg3OGE3VSwgMHgwODQwVSwgMHgxODYxVSwgMHgyODAyVSwgMHgzODIzVSwKKwkweGM5Y2NVLCAweGQ5ZWRVLCAweGU5OGVVLCAweGY5YWZVLCAweDg5NDhVLCAweDk5NjlVLCAweGE5MGFVLCAweGI5MmJVLAorCTB4NWFmNVUsIDB4NGFkNFUsIDB4N2FiN1UsIDB4NmE5NlUsIDB4MWE3MVUsIDB4MGE1MFUsIDB4M2EzM1UsIDB4MmExMlUsCisJMHhkYmZkVSwgMHhjYmRjVSwgMHhmYmJmVSwgMHhlYjllVSwgMHg5Yjc5VSwgMHg4YjU4VSwgMHhiYjNiVSwgMHhhYjFhVSwKKwkweDZjYTZVLCAweDdjODdVLCAweDRjZTRVLCAweDVjYzVVLCAweDJjMjJVLCAweDNjMDNVLCAweDBjNjBVLCAweDFjNDFVLAorCTB4ZWRhZVUsIDB4ZmQ4ZlUsIDB4Y2RlY1UsIDB4ZGRjZFUsIDB4YWQyYVUsIDB4YmQwYlUsIDB4OGQ2OFUsIDB4OWQ0OVUsCisJMHg3ZTk3VSwgMHg2ZWI2VSwgMHg1ZWQ1VSwgMHg0ZWY0VSwgMHgzZTEzVSwgMHgyZTMyVSwgMHgxZTUxVSwgMHgwZTcwVSwKKwkweGZmOWZVLCAweGVmYmVVLCAweGRmZGRVLCAweGNmZmNVLCAweGJmMWJVLCAweGFmM2FVLCAweDlmNTlVLCAweDhmNzhVLAorCTB4OTE4OFUsIDB4ODFhOVUsIDB4YjFjYVUsIDB4YTFlYlUsIDB4ZDEwY1UsIDB4YzEyZFUsIDB4ZjE0ZVUsIDB4ZTE2ZlUsCisJMHgxMDgwVSwgMHgwMGExVSwgMHgzMGMyVSwgMHgyMGUzVSwgMHg1MDA0VSwgMHg0MDI1VSwgMHg3MDQ2VSwgMHg2MDY3VSwKKwkweDgzYjlVLCAweDkzOThVLCAweGEzZmJVLCAweGIzZGFVLCAweGMzM2RVLCAweGQzMWNVLCAweGUzN2ZVLCAweGYzNWVVLAorCTB4MDJiMVUsIDB4MTI5MFUsIDB4MjJmM1UsIDB4MzJkMlUsIDB4NDIzNVUsIDB4NTIxNFUsIDB4NjI3N1UsIDB4NzI1NlUsCisJMHhiNWVhVSwgMHhhNWNiVSwgMHg5NWE4VSwgMHg4NTg5VSwgMHhmNTZlVSwgMHhlNTRmVSwgMHhkNTJjVSwgMHhjNTBkVSwKKwkweDM0ZTJVLCAweDI0YzNVLCAweDE0YTBVLCAweDA0ODFVLCAweDc0NjZVLCAweDY0NDdVLCAweDU0MjRVLCAweDQ0MDVVLAorCTB4YTdkYlUsIDB4YjdmYVUsIDB4ODc5OVUsIDB4OTdiOFUsIDB4ZTc1ZlUsIDB4Zjc3ZVUsIDB4YzcxZFUsIDB4ZDczY1UsCisJMHgyNmQzVSwgMHgzNmYyVSwgMHgwNjkxVSwgMHgxNmIwVSwgMHg2NjU3VSwgMHg3Njc2VSwgMHg0NjE1VSwgMHg1NjM0VSwKKwkweGQ5NGNVLCAweGM5NmRVLCAweGY5MGVVLCAweGU5MmZVLCAweDk5YzhVLCAweDg5ZTlVLCAweGI5OGFVLCAweGE5YWJVLAorCTB4NTg0NFUsIDB4NDg2NVUsIDB4NzgwNlUsIDB4NjgyN1UsIDB4MThjMFUsIDB4MDhlMVUsIDB4Mzg4MlUsIDB4MjhhM1UsCisJMHhjYjdkVSwgMHhkYjVjVSwgMHhlYjNmVSwgMHhmYjFlVSwgMHg4YmY5VSwgMHg5YmQ4VSwgMHhhYmJiVSwgMHhiYjlhVSwKKwkweDRhNzVVLCAweDVhNTRVLCAweDZhMzdVLCAweDdhMTZVLCAweDBhZjFVLCAweDFhZDBVLCAweDJhYjNVLCAweDNhOTJVLAorCTB4ZmQyZVUsIDB4ZWQwZlUsIDB4ZGQ2Y1UsIDB4Y2Q0ZFUsIDB4YmRhYVUsIDB4YWQ4YlUsIDB4OWRlOFUsIDB4OGRjOVUsCisJMHg3YzI2VSwgMHg2YzA3VSwgMHg1YzY0VSwgMHg0YzQ1VSwgMHgzY2EyVSwgMHgyYzgzVSwgMHgxY2UwVSwgMHgwY2MxVSwKKwkweGVmMWZVLCAweGZmM2VVLCAweGNmNWRVLCAweGRmN2NVLCAweGFmOWJVLCAweGJmYmFVLCAweDhmZDlVLCAweDlmZjhVLAorCTB4NmUxN1UsIDB4N2UzNlUsIDB4NGU1NVUsIDB4NWU3NFUsIDB4MmU5M1UsIDB4M2ViMlUsIDB4MGVkMVUsIDB4MWVmMFUKK307CisKKy8qCisgKiB1ZGZfY3JjCisgKgorICogUFVSUE9TRQorICoJQ2FsY3VsYXRlIGEgMTYtYml0IENSQyBjaGVja3N1bSB1c2luZyBJVFUtVCBWLjQxIHBvbHlub21pYWwuCisgKgorICogREVTQ1JJUFRJT04KKyAqCVRoZSBPU1RBLVVERih0bSkgMS41MCBzdGFuZGFyZCBzdGF0ZXMgdGhhdCB1c2luZyBDUkNzIGlzIG1hbmRhdG9yeS4KKyAqCVRoZSBwb2x5bm9taWFsIHVzZWQgaXM6CXheMTYgKyB4XjEyICsgeF4xNSArIDEKKyAqCisgKiBQUkUtQ09ORElUSU9OUworICoJZGF0YQkJUG9pbnRlciB0byB0aGUgZGF0YSBibG9jay4KKyAqCXNpemUJCVNpemUgb2YgdGhlIGRhdGEgYmxvY2suCisgKgorICogUE9TVC1DT05ESVRJT05TCisgKgk8cmV0dXJuPglDUkMgb2YgdGhlIGRhdGEgYmxvY2suCisgKgorICogSElTVE9SWQorICoJSnVseSAyMSwgMTk5NyAtIEFuZHJldyBFLiBNaWxlc2tpCisgKglBZGFwdGVkIGZyb20gT1NUQS1VREYodG0pIDEuNTAgc3RhbmRhcmQuCisgKi8KK3VpbnQxNl90Cit1ZGZfY3JjKHVpbnQ4X3QgKmRhdGEsIHVpbnQzMl90IHNpemUsIHVpbnQxNl90IGNyYykKK3sKKwl3aGlsZSAoc2l6ZS0tKQorCQljcmMgPSBjcmNfdGFibGVbKGNyYyA+PiA4IF4gKihkYXRhKyspKSAmIDB4ZmZVXSBeIChjcmMgPDwgOCk7CisKKwlyZXR1cm4gY3JjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKFRFU1QpCisKKy8qCisgKiBQVVJQT1NFCisgKglUZXN0IHVkZl9jcmMoKQorICoKKyAqIEhJU1RPUlkKKyAqCUp1bHkgMjEsIDE5OTcgLSBBbmRyZXcgRS4gTWlsZXNraQorICoJQWRhcHRlZCBmcm9tIE9TVEEtVURGKHRtKSAxLjUwIHN0YW5kYXJkLgorICovCisKK3Vuc2lnbmVkIGNoYXIgYnl0ZXNbXSA9IHsgMHg3MFUsIDB4NkFVLCAweDc3VSB9OworCitpbnQgbWFpbih2b2lkKQoreworCXVuc2lnbmVkIHNob3J0IHg7CisKKwl4ID0gdWRmX2NyYzE2KGJ5dGVzLCBzaXplb2YgYnl0ZXMpOworCXByaW50ZigidWRmX2NyYzE2OiBjYWxjdWxhdGVkID0gJTQuNHgsIGNvcnJlY3QgPSAlNC40eFxuIiwgeCwgMHgzMjk5VSk7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIGRlZmluZWQoVEVTVCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChHRU5FUkFURSkKKworLyoKKyAqIFBVUlBPU0UKKyAqCUdlbmVyYXRlIGEgdGFibGUgZm9yIGZhc3QgMTYtYml0IENSQyBjYWxjdWxhdGlvbnMgKGFueSBwb2x5bm9taWFsKS4KKyAqCisgKiBERVNDUklQVElPTgorICoJVGhlIElUVS1UIFYuNDEgcG9seW5vbWlhbCBpcyAwMTAwNDEuCisgKgorICogSElTVE9SWQorICoJSnVseSAyMSwgMTk5NyAtIEFuZHJldyBFLiBNaWxlc2tpCisgKglBZGFwdGVkIGZyb20gT1NUQS1VREYodG0pIDEuNTAgc3RhbmRhcmQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBsb25nIGNyYywgcG9seTsKKwlpbnQgbiwgaTsKKworCS8qIEdldCB0aGUgcG9seW5vbWlhbCAqLworCXNzY2FuZihhcmd2WzFdLCAiJWxvIiwgJnBvbHkpOworCWlmIChwb2x5ICYgMHhmZmZmMDAwMFUpeworCQlmcHJpbnRmKHN0ZGVyciwgInBvbHlub21pYWwgaXMgdG9vIGxhcmdlXGVuIik7CisJCWV4aXQoMSk7CisJfQorCisJcHJpbnRmKCIvKiBDUkMgMCVvICovXG4iLCBwb2x5KTsKKworCS8qIENyZWF0ZSBhIHRhYmxlICovCisJcHJpbnRmKCJzdGF0aWMgdW5zaWduZWQgc2hvcnQgY3JjX3RhYmxlWzI1Nl0gPSB7XG4iKTsKKwlmb3IgKG4gPSAwOyBuIDwgMjU2OyBuKyspeworCQlpZiAobiAlIDggPT0gMCkKKwkJCXByaW50ZigiXHQiKTsKKwkJY3JjID0gbiA8PCA4OworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKXsKKwkJCWlmKGNyYyAmIDB4ODAwMFUpCisJCQkJY3JjID0gKGNyYyA8PCAxKSBeIHBvbHk7CisJCQllbHNlCisJCQkJY3JjIDw8PSAxOworCQljcmMgJj0gMHhGRkZGVTsKKwkJfQorCQlpZiAobiA9PSAyNTUpCisJCQlwcmludGYoIjB4JTA0eFUgIiwgY3JjKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIweCUwNHhVLCAiLCBjcmMpOworCQlpZihuICUgOCA9PSA3KQorCQkJcHJpbnRmKCJcbiIpOworCX0KKwlwcmludGYoIn07XG4iKTsKKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogZGVmaW5lZChHRU5FUkFURSkgKi8KZGlmZiAtLWdpdCBhL2ZzL3VkZi9kaXIuYyBiL2ZzL3VkZi9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjQ0MGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvdWRmL2Rpci5jCkBAIC0wLDAgKzEsMjY4IEBACisvKgorICogZGlyLmMKKyAqCisgKiBQVVJQT1NFCisgKiAgRGlyZWN0b3J5IGhhbmRsaW5nIHJvdXRpbmVzIGZvciB0aGUgT1NUQS1VREYodG0pIGZpbGVzeXN0ZW0uCisgKgorICogQ09OVEFDVFMKKyAqCUUtbWFpbCByZWdhcmRpbmcgYW55IHBvcnRpb24gb2YgdGhlIExpbnV4IFVERiBmaWxlIHN5c3RlbSBzaG91bGQgYmUKKyAqCWRpcmVjdGVkIHRvIHRoZSBkZXZlbG9wbWVudCB0ZWFtIG1haWxpbmcgbGlzdCAocnVuIGJ5IG1ham9yZG9tbyk6CisgKgkJbGludXhfdWRmQGhwZXNqcm8uZmMuaHAuY29tCisgKgorICogQ09QWVJJR0hUCisgKglUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgKEdQTCkuIENvcGllcyBvZiB0aGUgR1BMIGNhbiBiZSBvYnRhaW5lZCBmcm9tOgorICoJCWZ0cDovL3ByZXAuYWkubWl0LmVkdS9wdWIvZ251L0dQTAorICoJRWFjaCBjb250cmlidXRpbmcgYXV0aG9yIHJldGFpbnMgYWxsIHJpZ2h0cyB0byB0aGVpciBvd24gd29yay4KKyAqCisgKiAgKEMpIDE5OTgtMjAwNCBCZW4gRmVubmVtYQorICoKKyAqIEhJU1RPUlkKKyAqCisgKiAgMTAvMDUvOTggZGdiICBTcGxpdCBkaXJlY3Rvcnkgb3BlcmF0aW9ucyBpbnRvIGl0cyBvd24gZmlsZQorICogICAgICAgICAgICAgICAgSW1wbGVtZW50ZWQgZGlyZWN0b3J5IHJlYWRzIHZpYSBkb191ZGZfcmVhZGRpcgorICogIDEwLzA2Lzk4ICAgICAgTWFkZSBkaXJlY3Rvcnkgb3BlcmF0aW9ucyB3b3JrIQorICogIDExLzE3Lzk4ICAgICAgUmV3cm90ZSBkaXJlY3RvcnkgdG8gc3VwcG9ydCBJQ0JUQUdfRkxBR19BRF9MT05HCisgKiAgMTEvMjUvOTggYmxmICBSZXdyb3RlIGRpcmVjdG9yeSBoYW5kbGluZyAocmVhZGRpcitsb29rdXApIHRvIHN1cHBvcnQgcmVhZGluZworICogICAgICAgICAgICAgICAgYWNyb3NzIGJsb2Nrcy4KKyAqICAxMi8xMi85OCAgICAgIFNwbGl0IG91dCB0aGUgbG9va3VwIGNvZGUgdG8gbmFtZWkuYy4gYnVsayBvZiBkaXJlY3RvcnkKKyAqICAgICAgICAgICAgICAgIGNvZGUgbm93IGluIGRpcmVjdG9yeS5jOnVkZl9maWxlaWRlbnRfcmVhZC4KKyAqLworCisjaW5jbHVkZSAidWRmZGVjbC5oIgorCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKyNpbmNsdWRlICJ1ZGZfaS5oIgorI2luY2x1ZGUgInVkZl9zYi5oIgorCisvKiBQcm90b3R5cGVzIGZvciBmaWxlIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgdWRmX3JlYWRkaXIoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOworc3RhdGljIGludCBkb191ZGZfcmVhZGRpcihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwgZmlsbGRpcl90LCB2b2lkICopOworCisvKiByZWFkZGlyIGFuZCBsb29rdXAgZnVuY3Rpb25zICovCisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgdWRmX2Rpcl9vcGVyYXRpb25zID0geworCS5yZWFkCQkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCQk9IHVkZl9yZWFkZGlyLAorCS5pb2N0bAkJCT0gdWRmX2lvY3RsLAorCS5mc3luYwkJCT0gdWRmX2ZzeW5jX2ZpbGUsCit9OworCisvKgorICogdWRmX3JlYWRkaXIKKyAqCisgKiBQVVJQT1NFCisgKglSZWFkIGEgZGlyZWN0b3J5IGVudHJ5LgorICoKKyAqIERFU0NSSVBUSU9OCisgKglPcHRpb25hbCAtIHN5c19nZXRkZW50cygpIHdpbGwgcmV0dXJuIC1FTk9URElSIGlmIHRoaXMgcm91dGluZSBpcyBub3QKKyAqCWF2YWlsYWJsZS4KKyAqCisgKglSZWZlciB0byBzeXNfZ2V0ZGVudHMoKSBpbiBmcy9yZWFkZGlyLmMKKyAqCXN5c19nZXRkZW50cygpIC0+IC4KKyAqCisgKiBQUkUtQ09ORElUSU9OUworICoJZmlscAkJCVBvaW50ZXIgdG8gZGlyZWN0b3J5IGZpbGUuCisgKglidWYJCQlQb2ludGVyIHRvIGRpcmVjdG9yeSBlbnRyeSBidWZmZXIuCisgKglmaWxsZGlyCQkJUG9pbnRlciB0byBmaWxsZGlyIGZ1bmN0aW9uLgorICoKKyAqIFBPU1QtQ09ORElUSU9OUworICoJPHJldHVybj4JCT49MCBvbiBzdWNjZXNzLgorICoKKyAqIEhJU1RPUlkKKyAqCUp1bHkgMSwgMTk5NyAtIEFuZHJldyBFLiBNaWxlc2tpCisgKglXcml0dGVuLCB0ZXN0ZWQsIGFuZCByZWxlYXNlZC4KKyAqLworCitpbnQgdWRmX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGlub2RlICpkaXIgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgcmVzdWx0OworCisJbG9ja19rZXJuZWwoKTsKKworCWlmICggZmlscC0+Zl9wb3MgPT0gMCApIAorCXsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIGZpbHAtPmZfcG9zLCBkaXItPmlfaW5vLCBEVF9ESVIpIDwgMCkKKwkJeworCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZmlscC0+Zl9wb3MgKys7CisJfQorCisJcmVzdWx0ID0gZG9fdWRmX3JlYWRkaXIoZGlyLCBmaWxwLCBmaWxsZGlyLCBkaXJlbnQpOworCXVubG9ja19rZXJuZWwoKTsKKyAJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCAKK2RvX3VkZl9yZWFkZGlyKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGZpbGUgKmZpbHAsIGZpbGxkaXJfdCBmaWxsZGlyLCB2b2lkICpkaXJlbnQpCit7CisJc3RydWN0IHVkZl9maWxlaWRlbnRfYmggZmliaDsKKwlzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqZmk9TlVMTDsKKwlzdHJ1Y3QgZmlsZUlkZW50RGVzYyBjZmk7CisJaW50IGJsb2NrLCBpYmxvY2s7CisJbG9mZl90IG5mX3BvcyA9IGZpbHAtPmZfcG9zIC0gMTsKKwlpbnQgZmxlbjsKKwljaGFyIGZuYW1lW1VERl9OQU1FX0xFTl07CisJY2hhciAqbmFtZXB0cjsKKwl1aW50MTZfdCBsaXU7CisJdWludDhfdCBsZmk7CisJbG9mZl90IHNpemUgPSAodWRmX2V4dDBfb2Zmc2V0KGRpcikgKyBkaXItPmlfc2l6ZSkgPj4gMjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCA9IE5VTEwsICogdG1wLCAqIGJoYVsxNl07CisJa2VybmVsX2xiX2FkZHIgYmxvYywgZWxvYzsKKwl1aW50MzJfdCBleHRvZmZzZXQsIGVsZW4sIG9mZnNldDsKKwlpbnQgaSwgbnVtOworCXVuc2lnbmVkIGludCBkdF90eXBlOworCisJaWYgKG5mX3BvcyA+PSBzaXplKQorCQlyZXR1cm4gMDsKKworCWlmIChuZl9wb3MgPT0gMCkKKwkJbmZfcG9zID0gKHVkZl9leHQwX29mZnNldChkaXIpID4+IDIpOworCisJZmliaC5zb2Zmc2V0ID0gZmliaC5lb2Zmc2V0ID0gKG5mX3BvcyAmICgoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IDIpKSA8PCAyOworCWlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCisJCWZpYmguc2JoID0gZmliaC5lYmggPSBOVUxMOworCWVsc2UgaWYgKGlub2RlX2JtYXAoZGlyLCBuZl9wb3MgPj4gKGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDIpLAorCQkmYmxvYywgJmV4dG9mZnNldCwgJmVsb2MsICZlbGVuLCAmb2Zmc2V0LCAmYmgpID09IChFWFRfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkKKwl7CisJCW9mZnNldCA+Pj0gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCQlibG9jayA9IHVkZl9nZXRfbGJfcGJsb2NrKGRpci0+aV9zYiwgZWxvYywgb2Zmc2V0KTsKKwkJaWYgKCgrK29mZnNldCA8PCBkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpIDwgZWxlbikKKwkJeworCQkJaWYgKFVERl9JX0FMTE9DVFlQRShkaXIpID09IElDQlRBR19GTEFHX0FEX1NIT1JUKQorCQkJCWV4dG9mZnNldCAtPSBzaXplb2Yoc2hvcnRfYWQpOworCQkJZWxzZSBpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfTE9ORykKKwkJCQlleHRvZmZzZXQgLT0gc2l6ZW9mKGxvbmdfYWQpOworCQl9CisJCWVsc2UKKwkJCW9mZnNldCA9IDA7CisKKwkJaWYgKCEoZmliaC5zYmggPSBmaWJoLmViaCA9IHVkZl90cmVhZChkaXItPmlfc2IsIGJsb2NrKSkpCisJCXsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkKKwkJaWYgKCEob2Zmc2V0ICYgKCgxNiA+PiAoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSkpLTEpKSkKKwkJeworCQkJaSA9IDE2ID4+IChkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KTsKKwkJCWlmIChpK29mZnNldCA+IChlbGVuID4+IGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cykpCisJCQkJaSA9IChlbGVuID4+IGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cyktb2Zmc2V0OworCQkJZm9yIChudW09MDsgaT4wOyBpLS0pCisJCQl7CisJCQkJYmxvY2sgPSB1ZGZfZ2V0X2xiX3BibG9jayhkaXItPmlfc2IsIGVsb2MsIG9mZnNldCtpKTsKKwkJCQl0bXAgPSB1ZGZfdGdldGJsayhkaXItPmlfc2IsIGJsb2NrKTsKKwkJCQlpZiAodG1wICYmICFidWZmZXJfdXB0b2RhdGUodG1wKSAmJiAhYnVmZmVyX2xvY2tlZCh0bXApKQorCQkJCQliaGFbbnVtKytdID0gdG1wOworCQkJCWVsc2UKKwkJCQkJYnJlbHNlKHRtcCk7CisJCQl9CisJCQlpZiAobnVtKQorCQkJeworCQkJCWxsX3J3X2Jsb2NrKFJFQURBLCBudW0sIGJoYSk7CisJCQkJZm9yIChpPTA7IGk8bnVtOyBpKyspCisJCQkJCWJyZWxzZShiaGFbaV0pOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwl3aGlsZSAoIG5mX3BvcyA8IHNpemUgKQorCXsKKwkJZmlscC0+Zl9wb3MgPSBuZl9wb3MgKyAxOworCisJCWZpID0gdWRmX2ZpbGVpZGVudF9yZWFkKGRpciwgJm5mX3BvcywgJmZpYmgsICZjZmksICZibG9jLCAmZXh0b2Zmc2V0LCAmZWxvYywgJmVsZW4sICZvZmZzZXQsICZiaCk7CisKKwkJaWYgKCFmaSkKKwkJeworCQkJaWYgKGZpYmguc2JoICE9IGZpYmguZWJoKQorCQkJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5lYmgpOworCQkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLnNiaCk7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJbGl1ID0gbGUxNl90b19jcHUoY2ZpLmxlbmd0aE9mSW1wVXNlKTsKKwkJbGZpID0gY2ZpLmxlbmd0aEZpbGVJZGVudDsKKworCQlpZiAoZmliaC5zYmggPT0gZmliaC5lYmgpCisJCQluYW1lcHRyID0gZmktPmZpbGVJZGVudCArIGxpdTsKKwkJZWxzZQorCQl7CisJCQlpbnQgcG9mZnNldDsJLyogVW5wYWRlZCBlbmRpbmcgb2Zmc2V0ICovCisKKwkJCXBvZmZzZXQgPSBmaWJoLnNvZmZzZXQgKyBzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpICsgbGl1ICsgbGZpOworCisJCQlpZiAocG9mZnNldCA+PSBsZmkpCisJCQkJbmFtZXB0ciA9IChjaGFyICopKGZpYmguZWJoLT5iX2RhdGEgKyBwb2Zmc2V0IC0gbGZpKTsKKwkJCWVsc2UKKwkJCXsKKwkJCQluYW1lcHRyID0gZm5hbWU7CisJCQkJbWVtY3B5KG5hbWVwdHIsIGZpLT5maWxlSWRlbnQgKyBsaXUsIGxmaSAtIHBvZmZzZXQpOworCQkJCW1lbWNweShuYW1lcHRyICsgbGZpIC0gcG9mZnNldCwgZmliaC5lYmgtPmJfZGF0YSwgcG9mZnNldCk7CisJCQl9CisJCX0KKworCQlpZiAoIChjZmkuZmlsZUNoYXJhY3RlcmlzdGljcyAmIEZJRF9GSUxFX0NIQVJfREVMRVRFRCkgIT0gMCApCisJCXsKKwkJCWlmICggIVVERl9RVUVSWV9GTEFHKGRpci0+aV9zYiwgVURGX0ZMQUdfVU5ERUxFVEUpICkKKwkJCQljb250aW51ZTsKKwkJfQorCQkKKwkJaWYgKCAoY2ZpLmZpbGVDaGFyYWN0ZXJpc3RpY3MgJiBGSURfRklMRV9DSEFSX0hJRERFTikgIT0gMCApCisJCXsKKwkJCWlmICggIVVERl9RVUVSWV9GTEFHKGRpci0+aV9zYiwgVURGX0ZMQUdfVU5ISURFKSApCisJCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIGNmaS5maWxlQ2hhcmFjdGVyaXN0aWNzICYgRklEX0ZJTEVfQ0hBUl9QQVJFTlQgKQorCQl7CisJCQlpYmxvY2sgPSBwYXJlbnRfaW5vKGZpbHAtPmZfZGVudHJ5KTsKKwkJCWZsZW4gPSAyOworCQkJbWVtY3B5KGZuYW1lLCAiLi4iLCBmbGVuKTsKKwkJCWR0X3R5cGUgPSBEVF9ESVI7CisJCX0KKwkJZWxzZQorCQl7CisJCQlrZXJuZWxfbGJfYWRkciB0bG9jID0gbGVsYl90b19jcHUoY2ZpLmljYi5leHRMb2NhdGlvbik7CisKKwkJCWlibG9jayA9IHVkZl9nZXRfbGJfcGJsb2NrKGRpci0+aV9zYiwgdGxvYywgMCk7CisJCQlmbGVuID0gdWRmX2dldF9maWxlbmFtZShkaXItPmlfc2IsIG5hbWVwdHIsIGZuYW1lLCBsZmkpOworCQkJZHRfdHlwZSA9IERUX1VOS05PV047CisJCX0KKworCQlpZiAoZmxlbikKKwkJeworCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBmbmFtZSwgZmxlbiwgZmlscC0+Zl9wb3MsIGlibG9jaywgZHRfdHlwZSkgPCAwKQorCQkJeworCQkJCWlmIChmaWJoLnNiaCAhPSBmaWJoLmViaCkKKwkJCQkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLmViaCk7CisJCQkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLnNiaCk7CisJCQkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJIAkJCXJldHVybiAwOworCQkJfQorCQl9CisJfSAvKiBlbmQgd2hpbGUgKi8KKworCWZpbHAtPmZfcG9zID0gbmZfcG9zICsgMTsKKworCWlmIChmaWJoLnNiaCAhPSBmaWJoLmViaCkKKwkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLmViaCk7CisJdWRmX3JlbGVhc2VfZGF0YShmaWJoLnNiaCk7CisJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL3VkZi9kaXJlY3RvcnkuYyBiL2ZzL3VkZi9kaXJlY3RvcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTYxZWNjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvdWRmL2RpcmVjdG9yeS5jCkBAIC0wLDAgKzEsMzQzIEBACisvKgorICogZGlyZWN0b3J5LmMKKyAqCisgKiBQVVJQT1NFCisgKglEaXJlY3RvcnkgcmVsYXRlZCBmdW5jdGlvbnMKKyAqCisgKiBDT05UQUNUUworICoJRS1tYWlsIHJlZ2FyZGluZyBhbnkgcG9ydGlvbiBvZiB0aGUgTGludXggVURGIGZpbGUgc3lzdGVtIHNob3VsZCBiZQorICoJZGlyZWN0ZWQgdG8gdGhlIGRldmVsb3BtZW50IHRlYW0gbWFpbGluZyBsaXN0IChydW4gYnkgbWFqb3Jkb21vKToKKyAqCQlsaW51eF91ZGZAaHBlc2pyby5mYy5ocC5jb20KKyAqCisgKiBDT1BZUklHSFQKKyAqCVRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSAoR1BMKS4gQ29waWVzIG9mIHRoZSBHUEwgY2FuIGJlIG9idGFpbmVkIGZyb206CisgKgkJZnRwOi8vcHJlcC5haS5taXQuZWR1L3B1Yi9nbnUvR1BMCisgKglFYWNoIGNvbnRyaWJ1dGluZyBhdXRob3IgcmV0YWlucyBhbGwgcmlnaHRzIHRvIHRoZWlyIG93biB3b3JrLgorICovCisKKyNpbmNsdWRlICJ1ZGZkZWNsLmgiCisjaW5jbHVkZSAidWRmX2kuaCIKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworI2lmIDAKK3N0YXRpYyB1aW50OF90ICoKK3VkZl9maWxlYWRfcmVhZChzdHJ1Y3QgaW5vZGUgKmRpciwgdWludDhfdCAqdG1wYWQsIHVpbnQ4X3QgYWRfc2l6ZSwKKwkJa2VybmVsX2xiX2FkZHIgZmVfbG9jLCBpbnQgKnBvcywgaW50ICpvZmZzZXQsCisJCXN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLCBpbnQgKmVycm9yKQoreworCWludCBsb2Zmc2V0ID0gKm9mZnNldDsKKwlpbnQgYmxvY2s7CisJdWludDhfdCAqYWQ7CisJaW50IHJlbWFpbmRlcjsKKworCSplcnJvciA9IDA7CisKKwlhZCA9ICh1aW50OF90ICopKCpiaCktPmJfZGF0YSArICpvZmZzZXQ7CisJKm9mZnNldCArPSBhZF9zaXplOworCisJaWYgKCFhZCkKKwl7CisJCXVkZl9yZWxlYXNlX2RhdGEoKmJoKTsKKwkJKmVycm9yID0gMTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCpvZmZzZXQgPT0gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkKKwl7CisJCXVkZl9yZWxlYXNlX2RhdGEoKmJoKTsKKwkJYmxvY2sgPSB1ZGZfZ2V0X2xiX3BibG9jayhkaXItPmlfc2IsIGZlX2xvYywgKysqcG9zKTsKKwkJaWYgKCFibG9jaykKKwkJCXJldHVybiBOVUxMOworCQlpZiAoISgqYmggPSB1ZGZfdHJlYWQoZGlyLT5pX3NiLCBibG9jaykpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCWVsc2UgaWYgKCpvZmZzZXQgPiBkaXItPmlfc2ItPnNfYmxvY2tzaXplKQorCXsKKwkJYWQgPSB0bXBhZDsKKworCQlyZW1haW5kZXIgPSBkaXItPmlfc2ItPnNfYmxvY2tzaXplIC0gbG9mZnNldDsKKwkJbWVtY3B5KCh1aW50OF90ICopYWQsICgqYmgpLT5iX2RhdGEgKyBsb2Zmc2V0LCByZW1haW5kZXIpOworCisJCXVkZl9yZWxlYXNlX2RhdGEoKmJoKTsKKwkJYmxvY2sgPSB1ZGZfZ2V0X2xiX3BibG9jayhkaXItPmlfc2IsIGZlX2xvYywgKysqcG9zKTsKKwkJaWYgKCFibG9jaykKKwkJCXJldHVybiBOVUxMOworCQlpZiAoISgoKmJoKSA9IHVkZl90cmVhZChkaXItPmlfc2IsIGJsb2NrKSkpCisJCQlyZXR1cm4gTlVMTDsKKworCQltZW1jcHkoKHVpbnQ4X3QgKilhZCArIHJlbWFpbmRlciwgKCpiaCktPmJfZGF0YSwgYWRfc2l6ZSAtIHJlbWFpbmRlcik7CisJCSpvZmZzZXQgPSBhZF9zaXplIC0gcmVtYWluZGVyOworCX0KKwlyZXR1cm4gYWQ7Cit9CisjZW5kaWYKKworc3RydWN0IGZpbGVJZGVudERlc2MgKgordWRmX2ZpbGVpZGVudF9yZWFkKHN0cnVjdCBpbm9kZSAqZGlyLCBsb2ZmX3QgKm5mX3BvcywKKwlzdHJ1Y3QgdWRmX2ZpbGVpZGVudF9iaCAqZmliaCwKKwlzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqY2ZpLAorCWtlcm5lbF9sYl9hZGRyICpibG9jLCB1aW50MzJfdCAqZXh0b2Zmc2V0LCAKKwlrZXJuZWxfbGJfYWRkciAqZWxvYywgdWludDMyX3QgKmVsZW4sCisJdWludDMyX3QgKm9mZnNldCwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpCit7CisJc3RydWN0IGZpbGVJZGVudERlc2MgKmZpOworCWludCBpLCBudW0sIGJsb2NrOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIHRtcCwgKiBiaGFbMTZdOworCisJZmliaC0+c29mZnNldCA9IGZpYmgtPmVvZmZzZXQ7CisKKwlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQorCXsKKwkJZmkgPSB1ZGZfZ2V0X2ZpbGVpZGVudChVREZfSV9EQVRBKGRpcikgLQorCQkJKFVERl9JX0VGRShkaXIpID8KKwkJCQlzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSA6CisJCQkJc2l6ZW9mKHN0cnVjdCBmaWxlRW50cnkpKSwKKwkJCWRpci0+aV9zYi0+c19ibG9ja3NpemUsICYoZmliaC0+ZW9mZnNldCkpOworCisJCWlmICghZmkpCisJCQlyZXR1cm4gTlVMTDsKKworCQkqbmZfcG9zICs9ICgoZmliaC0+ZW9mZnNldCAtIGZpYmgtPnNvZmZzZXQpID4+IDIpOworCisJCW1lbWNweSgodWludDhfdCAqKWNmaSwgKHVpbnQ4X3QgKilmaSwgc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSk7CisKKwkJcmV0dXJuIGZpOworCX0KKworCWlmIChmaWJoLT5lb2Zmc2V0ID09IGRpci0+aV9zYi0+c19ibG9ja3NpemUpCisJeworCQlpbnQgbGV4dG9mZnNldCA9ICpleHRvZmZzZXQ7CisKKwkJaWYgKHVkZl9uZXh0X2FleHQoZGlyLCBibG9jLCBleHRvZmZzZXQsIGVsb2MsIGVsZW4sIGJoLCAxKSAhPQorCQkJKEVYVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKQorCQl7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWJsb2NrID0gdWRmX2dldF9sYl9wYmxvY2soZGlyLT5pX3NiLCAqZWxvYywgKm9mZnNldCk7CisKKwkJKCpvZmZzZXQpICsrOworCisJCWlmICgoKm9mZnNldCA8PCBkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpID49ICplbGVuKQorCQkJKm9mZnNldCA9IDA7CisJCWVsc2UKKwkJCSpleHRvZmZzZXQgPSBsZXh0b2Zmc2V0OworCisJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC0+c2JoKTsKKwkJaWYgKCEoZmliaC0+c2JoID0gZmliaC0+ZWJoID0gdWRmX3RyZWFkKGRpci0+aV9zYiwgYmxvY2spKSkKKwkJCXJldHVybiBOVUxMOworCQlmaWJoLT5zb2Zmc2V0ID0gZmliaC0+ZW9mZnNldCA9IDA7CisKKwkJaWYgKCEoKm9mZnNldCAmICgoMTYgPj4gKGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDkpKS0xKSkpCisJCXsKKwkJCWkgPSAxNiA+PiAoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSk7CisJCQlpZiAoaSsqb2Zmc2V0ID4gKCplbGVuID4+IGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cykpCisJCQkJaSA9ICgqZWxlbiA+PiBkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpLSpvZmZzZXQ7CisJCQlmb3IgKG51bT0wOyBpPjA7IGktLSkKKwkJCXsKKwkJCQlibG9jayA9IHVkZl9nZXRfbGJfcGJsb2NrKGRpci0+aV9zYiwgKmVsb2MsICpvZmZzZXQraSk7CisJCQkJdG1wID0gdWRmX3RnZXRibGsoZGlyLT5pX3NiLCBibG9jayk7CisJCQkJaWYgKHRtcCAmJiAhYnVmZmVyX3VwdG9kYXRlKHRtcCkgJiYgIWJ1ZmZlcl9sb2NrZWQodG1wKSkKKwkJCQkJYmhhW251bSsrXSA9IHRtcDsKKwkJCQllbHNlCisJCQkJCWJyZWxzZSh0bXApOworCQkJfQorCQkJaWYgKG51bSkKKwkJCXsKKwkJCQlsbF9yd19ibG9jayhSRUFEQSwgbnVtLCBiaGEpOworCQkJCWZvciAoaT0wOyBpPG51bTsgaSsrKQorCQkJCQlicmVsc2UoYmhhW2ldKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlIGlmIChmaWJoLT5zYmggIT0gZmliaC0+ZWJoKQorCXsKKwkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLT5zYmgpOworCQlmaWJoLT5zYmggPSBmaWJoLT5lYmg7CisJfQorCisJZmkgPSB1ZGZfZ2V0X2ZpbGVpZGVudChmaWJoLT5zYmgtPmJfZGF0YSwgZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwKKwkJJihmaWJoLT5lb2Zmc2V0KSk7CisKKwlpZiAoIWZpKQorCQlyZXR1cm4gTlVMTDsKKworCSpuZl9wb3MgKz0gKChmaWJoLT5lb2Zmc2V0IC0gZmliaC0+c29mZnNldCkgPj4gMik7CisKKwlpZiAoZmliaC0+ZW9mZnNldCA8PSBkaXItPmlfc2ItPnNfYmxvY2tzaXplKQorCXsKKwkJbWVtY3B5KCh1aW50OF90ICopY2ZpLCAodWludDhfdCAqKWZpLCBzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpKTsKKwl9CisJZWxzZSBpZiAoZmliaC0+ZW9mZnNldCA+IGRpci0+aV9zYi0+c19ibG9ja3NpemUpCisJeworCQlpbnQgbGV4dG9mZnNldCA9ICpleHRvZmZzZXQ7CisKKwkJaWYgKHVkZl9uZXh0X2FleHQoZGlyLCBibG9jLCBleHRvZmZzZXQsIGVsb2MsIGVsZW4sIGJoLCAxKSAhPQorCQkJKEVYVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKQorCQl7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWJsb2NrID0gdWRmX2dldF9sYl9wYmxvY2soZGlyLT5pX3NiLCAqZWxvYywgKm9mZnNldCk7CisKKwkJKCpvZmZzZXQpICsrOworCisJCWlmICgoKm9mZnNldCA8PCBkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpID49ICplbGVuKQorCQkJKm9mZnNldCA9IDA7CisJCWVsc2UKKwkJCSpleHRvZmZzZXQgPSBsZXh0b2Zmc2V0OworCisJCWZpYmgtPnNvZmZzZXQgLT0gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJZmliaC0+ZW9mZnNldCAtPSBkaXItPmlfc2ItPnNfYmxvY2tzaXplOworCisJCWlmICghKGZpYmgtPmViaCA9IHVkZl90cmVhZChkaXItPmlfc2IsIGJsb2NrKSkpCisJCQlyZXR1cm4gTlVMTDsKKworCQlpZiAoc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSA+IC0gZmliaC0+c29mZnNldCkKKwkJeworCQkJaW50IGZpX2xlbjsKKworCQkJbWVtY3B5KCh1aW50OF90ICopY2ZpLCAodWludDhfdCAqKWZpLCAtIGZpYmgtPnNvZmZzZXQpOworCQkJbWVtY3B5KCh1aW50OF90ICopY2ZpIC0gZmliaC0+c29mZnNldCwgZmliaC0+ZWJoLT5iX2RhdGEsCisJCQkJc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSArIGZpYmgtPnNvZmZzZXQpOworCisJCQlmaV9sZW4gPSAoc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSArIGNmaS0+bGVuZ3RoRmlsZUlkZW50ICsKKwkJCQlsZTE2X3RvX2NwdShjZmktPmxlbmd0aE9mSW1wVXNlKSArIDMpICYgfjM7CisKKwkJCSpuZl9wb3MgKz0gKChmaV9sZW4gLSAoZmliaC0+ZW9mZnNldCAtIGZpYmgtPnNvZmZzZXQpKSA+PiAyKTsKKwkJCWZpYmgtPmVvZmZzZXQgPSBmaWJoLT5zb2Zmc2V0ICsgZmlfbGVuOworCQl9CisJCWVsc2UKKwkJeworCQkJbWVtY3B5KCh1aW50OF90ICopY2ZpLCAodWludDhfdCAqKWZpLCBzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpKTsKKwkJfQorCX0KKwlyZXR1cm4gZmk7Cit9CisKK3N0cnVjdCBmaWxlSWRlbnREZXNjICogCit1ZGZfZ2V0X2ZpbGVpZGVudCh2b2lkICogYnVmZmVyLCBpbnQgYnVmc2l6ZSwgaW50ICogb2Zmc2V0KQoreworCXN0cnVjdCBmaWxlSWRlbnREZXNjICpmaTsKKwlpbnQgbGVuZ3RoVGhpc0lkZW50OworCXVpbnQ4X3QgKiBwdHI7CisJaW50IHBhZGxlbjsKKworCWlmICggKCFidWZmZXIpIHx8ICghb2Zmc2V0KSApIHsKKwkJdWRmX2RlYnVnKCJpbnZhbGlkcGFybXNcbiwgYnVmZmVyPSVwLCBvZmZzZXQ9JXBcbiIsIGJ1ZmZlciwgb2Zmc2V0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcHRyID0gYnVmZmVyOworCisJaWYgKCAoKm9mZnNldCA+IDApICYmICgqb2Zmc2V0IDwgYnVmc2l6ZSkgKSB7CisJCXB0ciArPSAqb2Zmc2V0OworCX0KKwlmaT0oc3RydWN0IGZpbGVJZGVudERlc2MgKilwdHI7CisJaWYgKGxlMTZfdG9fY3B1KGZpLT5kZXNjVGFnLnRhZ0lkZW50KSAhPSBUQUdfSURFTlRfRklEKQorCXsKKwkJdWRmX2RlYnVnKCIweCV4ICE9IFRBR19JREVOVF9GSURcbiIsCisJCQlsZTE2X3RvX2NwdShmaS0+ZGVzY1RhZy50YWdJZGVudCkpOworCQl1ZGZfZGVidWcoIm9mZnNldDogJXUgc2l6ZW9mOiAlbHUgYnVmc2l6ZTogJXVcbiIsCisJCQkqb2Zmc2V0LCAodW5zaWduZWQgbG9uZylzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpLCBidWZzaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICggKCpvZmZzZXQgKyBzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpKSA+IGJ1ZnNpemUgKQorCXsKKwkJbGVuZ3RoVGhpc0lkZW50ID0gc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKTsKKwl9CisJZWxzZQorCQlsZW5ndGhUaGlzSWRlbnQgPSBzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpICsKKwkJCWZpLT5sZW5ndGhGaWxlSWRlbnQgKyBsZTE2X3RvX2NwdShmaS0+bGVuZ3RoT2ZJbXBVc2UpOworCisJLyogd2UgbmVlZCB0byBmaWd1cmUgcGFkZGluZywgdG9vISAqLworCXBhZGxlbiA9IGxlbmd0aFRoaXNJZGVudCAlIFVERl9OQU1FX1BBRDsKKwlpZiAocGFkbGVuKQorCQlsZW5ndGhUaGlzSWRlbnQgKz0gKFVERl9OQU1FX1BBRCAtIHBhZGxlbik7CisJKm9mZnNldCA9ICpvZmZzZXQgKyBsZW5ndGhUaGlzSWRlbnQ7CisKKwlyZXR1cm4gZmk7Cit9CisKKyNpZiAwCitzdGF0aWMgZXh0ZW50X2FkICoKK3VkZl9nZXRfZmlsZWV4dGVudCh2b2lkICogYnVmZmVyLCBpbnQgYnVmc2l6ZSwgaW50ICogb2Zmc2V0KQoreworCWV4dGVudF9hZCAqIGV4dDsKKwlzdHJ1Y3QgZmlsZUVudHJ5ICpmZTsKKwl1aW50OF90ICogcHRyOworCisJaWYgKCAoIWJ1ZmZlcikgfHwgKCFvZmZzZXQpICkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAidWRmOiB1ZGZfZ2V0X2ZpbGVleHRlbnQoKSBpbnZhbGlkcGFybXNcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmZSA9IChzdHJ1Y3QgZmlsZUVudHJ5ICopYnVmZmVyOworCisJaWYgKCBsZTE2X3RvX2NwdShmZS0+ZGVzY1RhZy50YWdJZGVudCkgIT0gVEFHX0lERU5UX0ZFICkKKwl7CisJCXVkZl9kZWJ1ZygiMHgleCAhPSBUQUdfSURFTlRfRkVcbiIsCisJCQlsZTE2X3RvX2NwdShmZS0+ZGVzY1RhZy50YWdJZGVudCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwdHI9KHVpbnQ4X3QgKikoZmUtPmV4dGVuZGVkQXR0cikgKyBsZTMyX3RvX2NwdShmZS0+bGVuZ3RoRXh0ZW5kZWRBdHRyKTsKKworCWlmICggKCpvZmZzZXQgPiAwKSAmJiAoKm9mZnNldCA8IGxlMzJfdG9fY3B1KGZlLT5sZW5ndGhBbGxvY0Rlc2NzKSkgKQorCXsKKwkJcHRyICs9ICpvZmZzZXQ7CisJfQorCisJZXh0ID0gKGV4dGVudF9hZCAqKXB0cjsKKworCSpvZmZzZXQgPSAqb2Zmc2V0ICsgc2l6ZW9mKGV4dGVudF9hZCk7CisJcmV0dXJuIGV4dDsKK30KKyNlbmRpZgorCitzaG9ydF9hZCAqCit1ZGZfZ2V0X2ZpbGVzaG9ydGFkKHVpbnQ4X3QgKnB0ciwgaW50IG1heG9mZnNldCwgaW50ICpvZmZzZXQsIGludCBpbmMpCit7CisJc2hvcnRfYWQgKnNhOworCisJaWYgKCAoIXB0cikgfHwgKCFvZmZzZXQpICkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAidWRmOiB1ZGZfZ2V0X2ZpbGVzaG9ydGFkKCkgaW52YWxpZHBhcm1zXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCAoKm9mZnNldCA8IDApIHx8ICgoKm9mZnNldCArIHNpemVvZihzaG9ydF9hZCkpID4gbWF4b2Zmc2V0KSApCisJCXJldHVybiBOVUxMOworCWVsc2UgaWYgKChzYSA9IChzaG9ydF9hZCAqKXB0ciktPmV4dExlbmd0aCA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChpbmMpCisJCSpvZmZzZXQgKz0gc2l6ZW9mKHNob3J0X2FkKTsKKwlyZXR1cm4gc2E7Cit9CisKK2xvbmdfYWQgKgordWRmX2dldF9maWxlbG9uZ2FkKHVpbnQ4X3QgKnB0ciwgaW50IG1heG9mZnNldCwgaW50ICogb2Zmc2V0LCBpbnQgaW5jKQoreworCWxvbmdfYWQgKmxhOworCisJaWYgKCAoIXB0cikgfHwgKCFvZmZzZXQpICkgCisJeworCQlwcmludGsoS0VSTl9FUlIgInVkZjogdWRmX2dldF9maWxlbG9uZ2FkKCkgaW52YWxpZHBhcm1zXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCAoKm9mZnNldCA8IDApIHx8ICgoKm9mZnNldCArIHNpemVvZihsb25nX2FkKSkgPiBtYXhvZmZzZXQpICkKKwkJcmV0dXJuIE5VTEw7CisJZWxzZSBpZiAoKGxhID0gKGxvbmdfYWQgKilwdHIpLT5leHRMZW5ndGggPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoaW5jKQorCQkqb2Zmc2V0ICs9IHNpemVvZihsb25nX2FkKTsKKwlyZXR1cm4gbGE7Cit9CmRpZmYgLS1naXQgYS9mcy91ZGYvZWNtYV8xNjcuaCBiL2ZzL3VkZi9lY21hXzE2Ny5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MWYyZWIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZGYvZWNtYV8xNjcuaApAQCAtMCwwICsxLDg2NCBAQAorLyoKKyAqIGVjbWFfMTY3LmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gRUNNQS0xNjcgM3JkIGVkaXRpb24gKEp1bmUgMTk5NykKKyAqIGh0dHA6Ly93d3cuZWNtYS5jaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyICBCZW4gRmVubmVtYSA8YmZlbm5lbWFAZmFsY29uLmNzYy5jYWxwb2x5LmVkdT4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgUHVibGljIExpY2Vuc2UgKCJHUEwiKS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaWZuZGVmIF9FQ01BXzE2N19ICisjZGVmaW5lIF9FQ01BXzE2N19IIDEKKworLyogQ2hhcmFjdGVyIHNldCBzcGVjaWZpY2F0aW9uIChFQ01BIDE2N3IzIDEvNy4yLjEpICovCit0eXBlZGVmIHN0cnVjdAoreworCXVpbnQ4X3QJCWNoYXJTZXRUeXBlOworCXVpbnQ4X3QJCWNoYXJTZXRJbmZvWzYzXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGNoYXJzcGVjOworCisvKiBDaGFyYWN0ZXIgU2V0IFR5cGUgKEVDTUEgMTY3cjMgMS83LjIuMS4xKSAqLworI2RlZmluZSBDSEFSU1BFQ19UWVBFX0NTMAkJMHgwMAkvKiAoMS83LjIuMikgKi8KKyNkZWZpbmUgQ0hBUlNQRUNfVFlQRV9DUzEJCTB4MDEJLyogKDEvNy4yLjMpICovCisjZGVmaW5lIENIQVJTUEVDX1RZUEVfQ1MyCQkweDAyCS8qICgxLzcuMi40KSAqLworI2RlZmluZSBDSEFSU1BFQ19UWVBFX0NTMwkJMHgwMwkvKiAoMS83LjIuNSkgKi8KKyNkZWZpbmUgQ0hBUlNQRUNfVFlQRV9DUzQJCTB4MDQJLyogKDEvNy4yLjYpICovCisjZGVmaW5lIENIQVJTUEVDX1RZUEVfQ1M1CQkweDA1CS8qICgxLzcuMi43KSAqLworI2RlZmluZSBDSEFSU1BFQ19UWVBFX0NTNgkJMHgwNgkvKiAoMS83LjIuOCkgKi8KKyNkZWZpbmUgQ0hBUlNQRUNfVFlQRV9DUzcJCTB4MDcJLyogKDEvNy4yLjkpICovCisjZGVmaW5lIENIQVJTUEVDX1RZUEVfQ1M4CQkweDA4CS8qICgxLzcuMi4xMCkgKi8KKwordHlwZWRlZiB1aW50OF90CQlkc3RyaW5nOworCisvKiBUaW1lc3RhbXAgKEVDTUEgMTY3cjMgMS83LjMpICovCit0eXBlZGVmIHN0cnVjdAoreworCV9fbGUxNgkJdHlwZUFuZFRpbWV6b25lOworCV9fbGUxNgkJeWVhcjsKKwl1aW50OF90CQltb250aDsKKwl1aW50OF90CQlkYXk7CisJdWludDhfdAkJaG91cjsKKwl1aW50OF90CQltaW51dGU7CisJdWludDhfdAkJc2Vjb25kOworCXVpbnQ4X3QJCWNlbnRpc2Vjb25kczsKKwl1aW50OF90CQlodW5kcmVkc09mTWljcm9zZWNvbmRzOworCXVpbnQ4X3QJCW1pY3Jvc2Vjb25kczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHRpbWVzdGFtcDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKwl1aW50MTZfdAl0eXBlQW5kVGltZXpvbmU7CisJaW50MTZfdAkJeWVhcjsKKwl1aW50OF90CQltb250aDsKKwl1aW50OF90CQlkYXk7CisJdWludDhfdAkJaG91cjsKKwl1aW50OF90CQltaW51dGU7CisJdWludDhfdAkJc2Vjb25kOworCXVpbnQ4X3QJCWNlbnRpc2Vjb25kczsKKwl1aW50OF90CQlodW5kcmVkc09mTWljcm9zZWNvbmRzOworCXVpbnQ4X3QJCW1pY3Jvc2Vjb25kczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGtlcm5lbF90aW1lc3RhbXA7CisKKy8qIFR5cGUgYW5kIFRpbWUgWm9uZSAoRUNNQSAxNjdyMyAxLzcuMy4xKSAqLworI2RlZmluZSBUSU1FU1RBTVBfVFlQRV9NQVNLCQkweEYwMDAKKyNkZWZpbmUgVElNRVNUQU1QX1RZUEVfQ1VUCQkweDAwMDAKKyNkZWZpbmUgVElNRVNUQU1QX1RZUEVfTE9DQUwJCTB4MTAwMAorI2RlZmluZSBUSU1FU1RBTVBfVFlQRV9BR1JFRU1FTlQJMHgyMDAwCisjZGVmaW5lIFRJTUVTVEFNUF9USU1FWk9ORV9NQVNLCQkweDBGRkYKKworLyogRW50aXR5IGlkZW50aWZpZXIgKEVDTUEgMTY3cjMgMS83LjQpICovCit0eXBlZGVmIHN0cnVjdAoreworCXVpbnQ4X3QJCWZsYWdzOworCXVpbnQ4X3QJCWlkZW50WzIzXTsKKwl1aW50OF90CQlpZGVudFN1ZmZpeFs4XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHJlZ2lkOworCisvKiBGbGFncyAoRUNNQSAxNjdyMyAxLzcuNC4xKSAqLworI2RlZmluZSBFTlRJVFlJRF9GTEFHU19ESVJUWQkJMHgwMAorI2RlZmluZSBFTlRJVFlJRF9GTEFHU19QUk9URUNURUQJMHgwMQorCisvKiBWb2x1bWUgU3RydWN0dXJlIERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgMi85LjEpICovCisjZGVmaW5lIFZTRF9TVERfSURfTEVOCQkJNQorc3RydWN0IHZvbFN0cnVjdERlc2MKK3sKKwl1aW50OF90CQlzdHJ1Y3RUeXBlOworCXVpbnQ4X3QJCXN0ZElkZW50W1ZTRF9TVERfSURfTEVOXTsKKwl1aW50OF90CQlzdHJ1Y3RWZXJzaW9uOworCXVpbnQ4X3QJCXN0cnVjdERhdGFbMjA0MV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogU3RhbmRhcmQgSWRlbnRpZmllciAoRU1DQSAxNjdyMiAyLzkuMS4yKSAqLworI2RlZmluZSBWU0RfU1REX0lEX05TUjAyCQkiTlNSMDIiCS8qICgzLzkuMSkgKi8KKworLyogU3RhbmRhcmQgSWRlbnRpZmllciAoRUNNQSAxNjdyMyAyLzkuMS4yKSAqLworI2RlZmluZSBWU0RfU1REX0lEX0JFQTAxCQkiQkVBMDEiCS8qICgyLzkuMikgKi8KKyNkZWZpbmUgVlNEX1NURF9JRF9CT09UMgkJIkJPT1QyIgkvKiAoMi85LjQpICovCisjZGVmaW5lIFZTRF9TVERfSURfQ0QwMDEJCSJDRDAwMSIJLyogKEVDTUEtMTE5KSAqLworI2RlZmluZSBWU0RfU1REX0lEX0NEVzAyCQkiQ0RXMDIiCS8qIChFQ01BLTE2OCkgKi8KKyNkZWZpbmUgVlNEX1NURF9JRF9OU1IwMwkJIk5TUjAzIgkvKiAoMy85LjEpICovCisjZGVmaW5lIFZTRF9TVERfSURfVEVBMDEJCSJURUEwMSIJLyogKDIvOS4zKSAqLworCisvKiBCZWdpbm5pbmcgRXh0ZW5kZWQgQXJlYSBEZXNjcmlwdG9yIChFQ01BIDE2N3IzIDIvOS4yKSAqLworc3RydWN0IGJlZ2lubmluZ0V4dGVuZGVkQXJlYURlc2MKK3sKKwl1aW50OF90CQlzdHJ1Y3RUeXBlOworCXVpbnQ4X3QJCXN0ZElkZW50W1ZTRF9TVERfSURfTEVOXTsKKwl1aW50OF90CQlzdHJ1Y3RWZXJzaW9uOworCXVpbnQ4X3QJCXN0cnVjdERhdGFbMjA0MV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVGVybWluYXRpbmcgRXh0ZW5kZWQgQXJlYSBEZXNjcmlwdG9yIChFQ01BIDE2N3IzIDIvOS4zKSAqLworc3RydWN0IHRlcm1pbmF0aW5nRXh0ZW5kZWRBcmVhRGVzYworeworCXVpbnQ4X3QJCXN0cnVjdFR5cGU7CisJdWludDhfdAkJc3RkSWRlbnRbVlNEX1NURF9JRF9MRU5dOworCXVpbnQ4X3QJCXN0cnVjdFZlcnNpb247CisJdWludDhfdAkJc3RydWN0RGF0YVsyMDQxXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBCb290IERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgMi85LjQpICovCitzdHJ1Y3QgYm9vdERlc2MKK3sKKwl1aW50OF90CQlzdHJ1Y3RUeXBlOworCXVpbnQ4X3QJCXN0ZElkZW50W1ZTRF9TVERfSURfTEVOXTsKKwl1aW50OF90CQlzdHJ1Y3RWZXJzaW9uOworCXVpbnQ4X3QJCXJlc2VydmVkMTsKKwlyZWdpZAkJYXJjaFR5cGU7CisJcmVnaWQJCWJvb3RJZGVudDsKKwlfX2xlMzIJCWJvb3RFeHRMb2NhdGlvbjsKKwlfX2xlMzIJCWJvb3RFeHRMZW5ndGg7CisJX19sZTY0CQlsb2FkQWRkcmVzczsKKwlfX2xlNjQJCXN0YXJ0QWRkcmVzczsKKwl0aW1lc3RhbXAJZGVzY0NyZWF0aW9uRGF0ZUFuZFRpbWU7CisJX19sZTE2CQlmbGFnczsKKwl1aW50OF90CQlyZXNlcnZlZDJbMzJdOworCXVpbnQ4X3QJCWJvb3RVc2VbMTkwNl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogRmxhZ3MgKEVDTUEgMTY3cjMgMi85LjQuMTIpICovCisjZGVmaW5lIEJPT1RfRkxBR1NfRVJBU0UJCTB4MDEKKworLyogRXh0ZW50IERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgMy83LjEpICovCit0eXBlZGVmIHN0cnVjdAoreworCV9fbGUzMgkJZXh0TGVuZ3RoOworCV9fbGUzMgkJZXh0TG9jYXRpb247Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBleHRlbnRfYWQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisJdWludDMyX3QJZXh0TGVuZ3RoOworCXVpbnQzMl90CWV4dExvY2F0aW9uOworfSBrZXJuZWxfZXh0ZW50X2FkOworCisvKiBEZXNjcmlwdG9yIFRhZyAoRUNNQSAxNjdyMyAzLzcuMikgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisJX19sZTE2CQl0YWdJZGVudDsKKwlfX2xlMTYJCWRlc2NWZXJzaW9uOworCXVpbnQ4X3QJCXRhZ0NoZWNrc3VtOworCXVpbnQ4X3QJCXJlc2VydmVkOworCV9fbGUxNgkJdGFnU2VyaWFsTnVtOworCV9fbGUxNgkJZGVzY0NSQzsKKwlfX2xlMTYJCWRlc2NDUkNMZW5ndGg7CisJX19sZTMyCQl0YWdMb2NhdGlvbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHRhZzsKKworLyogVGFnIElkZW50aWZpZXIgKEVDTUEgMTY3cjMgMy83LjIuMSkgKi8KKyNkZWZpbmUgVEFHX0lERU5UX1BWRAkJCTB4MDAwMQorI2RlZmluZSBUQUdfSURFTlRfQVZEUAkJCTB4MDAwMgorI2RlZmluZSBUQUdfSURFTlRfVkRQCQkJMHgwMDAzCisjZGVmaW5lIFRBR19JREVOVF9JVVZECQkJMHgwMDA0CisjZGVmaW5lIFRBR19JREVOVF9QRAkJCTB4MDAwNQorI2RlZmluZSBUQUdfSURFTlRfTFZECQkJMHgwMDA2CisjZGVmaW5lIFRBR19JREVOVF9VU0QJCQkweDAwMDcKKyNkZWZpbmUgVEFHX0lERU5UX1RECQkJMHgwMDA4CisjZGVmaW5lIFRBR19JREVOVF9MVklECQkJMHgwMDA5CisKKy8qIE5TUiBEZXNjcmlwdG9yIChFQ01BIDE2N3IzIDMvOS4xKSAqLworc3RydWN0IE5TUkRlc2MKK3sKKwl1aW50OF90CQlzdHJ1Y3RUeXBlOworCXVpbnQ4X3QJCXN0ZElkZW50W1ZTRF9TVERfSURfTEVOXTsKKwl1aW50OF90CQlzdHJ1Y3RWZXJzaW9uOworCXVpbnQ4X3QJCXJlc2VydmVkOworCXVpbnQ4X3QJCXN0cnVjdERhdGFbMjA0MF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwkKKy8qIFByaW1hcnkgVm9sdW1lIERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgMy8xMC4xKSAqLworc3RydWN0IHByaW1hcnlWb2xEZXNjCit7CisJdGFnCQlkZXNjVGFnOworCV9fbGUzMgkJdm9sRGVzY1NlcU51bTsKKwlfX2xlMzIJCXByaW1hcnlWb2xEZXNjTnVtOworCWRzdHJpbmcJCXZvbElkZW50WzMyXTsKKwlfX2xlMTYJCXZvbFNlcU51bTsKKwlfX2xlMTYJCW1heFZvbFNlcU51bTsKKwlfX2xlMTYJCWludGVyY2hhbmdlTHZsOworCV9fbGUxNgkJbWF4SW50ZXJjaGFuZ2VMdmw7CisJX19sZTMyCQljaGFyU2V0TGlzdDsKKwlfX2xlMzIJCW1heENoYXJTZXRMaXN0OworCWRzdHJpbmcJCXZvbFNldElkZW50WzEyOF07CisJY2hhcnNwZWMJZGVzY0NoYXJTZXQ7CisJY2hhcnNwZWMJZXhwbGFuYXRvcnlDaGFyU2V0OworCWV4dGVudF9hZAl2b2xBYnN0cmFjdDsKKwlleHRlbnRfYWQJdm9sQ29weXJpZ2h0OworCXJlZ2lkCQlhcHBJZGVudDsKKwl0aW1lc3RhbXAJcmVjb3JkaW5nRGF0ZUFuZFRpbWU7CisJcmVnaWQJCWltcElkZW50OworCXVpbnQ4X3QJCWltcFVzZVs2NF07CisJX19sZTMyCQlwcmVkZWNlc3NvclZvbERlc2NTZXFMb2NhdGlvbjsKKwlfX2xlMTYJCWZsYWdzOworCXVpbnQ4X3QJCXJlc2VydmVkWzIyXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBGbGFncyAoRUNNQSAxNjdyMyAzLzEwLjEuMjEpICovCisjZGVmaW5lIFBWRF9GTEFHU19WU0lEX0NPTU1PTgkJMHgwMDAxCisKKy8qIEFuY2hvciBWb2x1bWUgRGVzY3JpcHRvciBQb2ludGVyIChFQ01BIDE2N3IzIDMvMTAuMikgKi8KK3N0cnVjdCBhbmNob3JWb2xEZXNjUHRyCit7CisJdGFnCQlkZXNjVGFnOworCWV4dGVudF9hZAltYWluVm9sRGVzY1NlcUV4dDsKKwlleHRlbnRfYWQJcmVzZXJ2ZVZvbERlc2NTZXFFeHQ7CisJdWludDhfdAkgCXJlc2VydmVkWzQ4MF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVm9sdW1lIERlc2NyaXB0b3IgUG9pbnRlciAoRUNNQSAxNjdyMyAzLzEwLjMpICovCitzdHJ1Y3Qgdm9sRGVzY1B0cgoreworCXRhZwkJZGVzY1RhZzsKKwlfX2xlMzIJCXZvbERlc2NTZXFOdW07CisJZXh0ZW50X2FkCW5leHRWb2xEZXNjU2VxRXh0OworCXVpbnQ4X3QJCXJlc2VydmVkWzQ4NF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogSW1wbGVtZW50YXRpb24gVXNlIFZvbHVtZSBEZXNjcmlwdG9yIChFQ01BIDE2N3IzIDMvMTAuNCkgKi8KK3N0cnVjdCBpbXBVc2VWb2xEZXNjCit7CisJdGFnCQlkZXNjVGFnOworCV9fbGUzMgkJdm9sRGVzY1NlcU51bTsKKwlyZWdpZAkJaW1wSWRlbnQ7CisJdWludDhfdAkJaW1wVXNlWzQ2MF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogUGFydGl0aW9uIERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgMy8xMC41KSAqLworc3RydWN0IHBhcnRpdGlvbkRlc2MKK3sKKwl0YWcJCWRlc2NUYWc7CisJX19sZTMyCQl2b2xEZXNjU2VxTnVtOworCV9fbGUxNgkJcGFydGl0aW9uRmxhZ3M7CisJX19sZTE2CQlwYXJ0aXRpb25OdW1iZXI7CisJcmVnaWQJCXBhcnRpdGlvbkNvbnRlbnRzOworCXVpbnQ4X3QJCXBhcnRpdGlvbkNvbnRlbnRzVXNlWzEyOF07CisJX19sZTMyCQlhY2Nlc3NUeXBlOworCV9fbGUzMgkJcGFydGl0aW9uU3RhcnRpbmdMb2NhdGlvbjsKKwlfX2xlMzIJCXBhcnRpdGlvbkxlbmd0aDsKKwlyZWdpZAkJaW1wSWRlbnQ7CisJdWludDhfdAkJaW1wVXNlWzEyOF07CisJdWludDhfdAkJcmVzZXJ2ZWRbMTU2XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBQYXJ0aXRpb24gRmxhZ3MgKEVDTUEgMTY3cjMgMy8xMC41LjMpICovCisjZGVmaW5lIFBEX1BBUlRJVElPTl9GTEFHU19BTExPQwkweDAwMDEKKworLyogUGFydGl0aW9uIENvbnRlbnRzIChFQ01BIDE2N3IyIDMvMTAuNS4zKSAqLworI2RlZmluZSBQRF9QQVJUSVRJT05fQ09OVEVOVFNfTlNSMDIJIitOU1IwMiIKKworLyogUGFydGl0aW9uIENvbnRlbnRzIChFQ01BIDE2N3IzIDMvMTAuNS41KSAqLworI2RlZmluZSBQRF9QQVJUSVRJT05fQ09OVEVOVFNfRkRDMDEJIitGREMwMSIKKyNkZWZpbmUgUERfUEFSVElUSU9OX0NPTlRFTlRTX0NEMDAxCSIrQ0QwMDEiCisjZGVmaW5lIFBEX1BBUlRJVElPTl9DT05URU5UU19DRFcwMgkiK0NEVzAyIgorI2RlZmluZSBQRF9QQVJUSVRJT05fQ09OVEVOVFNfTlNSMDMJIitOU1IwMyIKKworLyogQWNjZXNzIFR5cGUgKEVDTUEgMTY3cjMgMy8xMC41LjcpICovCisjZGVmaW5lIFBEX0FDQ0VTU19UWVBFX05PTkUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgUERfQUNDRVNTX1RZUEVfUkVBRF9PTkxZCTB4MDAwMDAwMDEKKyNkZWZpbmUgUERfQUNDRVNTX1RZUEVfV1JJVEVfT05DRQkweDAwMDAwMDAyCisjZGVmaW5lIFBEX0FDQ0VTU19UWVBFX1JFV1JJVEFCTEUJMHgwMDAwMDAwMworI2RlZmluZSBQRF9BQ0NFU1NfVFlQRV9PVkVSV1JJVEFCTEUJMHgwMDAwMDAwNAorCisvKiBMb2dpY2FsIFZvbHVtZSBEZXNjcmlwdG9yIChFQ01BIDE2N3IzIDMvMTAuNikgKi8KK3N0cnVjdCBsb2dpY2FsVm9sRGVzYworeworCXRhZwkJZGVzY1RhZzsKKwlfX2xlMzIJCXZvbERlc2NTZXFOdW07CisJY2hhcnNwZWMJZGVzY0NoYXJTZXQ7CisJZHN0cmluZwkJbG9naWNhbFZvbElkZW50WzEyOF07CisJX19sZTMyCQlsb2dpY2FsQmxvY2tTaXplOworCXJlZ2lkCQlkb21haW5JZGVudDsKKwl1aW50OF90CQlsb2dpY2FsVm9sQ29udGVudHNVc2VbMTZdOworCV9fbGUzMgkJbWFwVGFibGVMZW5ndGg7CisJX19sZTMyCQludW1QYXJ0aXRpb25NYXBzOworCXJlZ2lkCQlpbXBJZGVudDsKKwl1aW50OF90CQlpbXBVc2VbMTI4XTsKKwlleHRlbnRfYWQJaW50ZWdyaXR5U2VxRXh0OworCXVpbnQ4X3QJCXBhcnRpdGlvbk1hcHNbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogR2VuZXJpYyBQYXJ0aXRpb24gTWFwIChFQ01BIDE2N3IzIDMvMTAuNy4xKSAqLworc3RydWN0IGdlbmVyaWNQYXJ0aXRpb25NYXAKK3sKKwl1aW50OF90CQlwYXJ0aXRpb25NYXBUeXBlOworCXVpbnQ4X3QJCXBhcnRpdGlvbk1hcExlbmd0aDsKKwl1aW50OF90CQlwYXJ0aXRpb25NYXBwaW5nWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFBhcnRpdGlvbiBNYXAgVHlwZSAoRUNNQSAxNjdyMyAzLzEwLjcuMS4xKSAqLworI2RlZmluZSBHUF9QQVJUSVRJT05fTUFQX1RZUEVfVU5ERUYJMHgwMAorI2RlZmluZSBHUF9QQVJUSUlUT05fTUFQX1RZUEVfMQkJMHgwMQorI2RlZmluZSBHUF9QQVJUSVRJT05fTUFQX1RZUEVfMgkJMHgwMgorCisvKiBUeXBlIDEgUGFydGl0aW9uIE1hcCAoRUNNQSAxNjdyMyAzLzEwLjcuMikgKi8KK3N0cnVjdCBnZW5lcmljUGFydGl0aW9uTWFwMQoreworCXVpbnQ4X3QJCXBhcnRpdGlvbk1hcFR5cGU7CisJdWludDhfdAkJcGFydGl0aW9uTWFwTGVuZ3RoOworCV9fbGUxNgkJdm9sU2VxTnVtOworCV9fbGUxNgkJcGFydGl0aW9uTnVtOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFR5cGUgMiBQYXJ0aXRpb24gTWFwIChFQ01BIDE2N3IzIDMvMTAuNy4zKSAqLworc3RydWN0IGdlbmVyaWNQYXJ0aXRpb25NYXAyCit7CisJdWludDhfdAkJcGFydGl0aW9uTWFwVHlwZTsKKwl1aW50OF90CQlwYXJ0aXRpb25NYXBMZW5ndGg7IAorCXVpbnQ4X3QJCXBhcnRpdGlvbklkZW50WzYyXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBVbmFsbG9jYXRlZCBTcGFjZSBEZXNjcmlwdG9yIChFQ01BIDE2N3IzIDMvMTAuOCkgKi8KK3N0cnVjdCB1bmFsbG9jU3BhY2VEZXNjCit7CisJdGFnCQlkZXNjVGFnOworCV9fbGUzMgkJdm9sRGVzY1NlcU51bTsKKwlfX2xlMzIJCW51bUFsbG9jRGVzY3M7CisJZXh0ZW50X2FkCWFsbG9jRGVzY3NbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVGVybWluYXRpbmcgRGVzY3JpcHRvciAoRUNNQSAxNjdyMyAzLzEwLjkpICovCitzdHJ1Y3QgdGVybWluYXRpbmdEZXNjCit7CisJdGFnCQlkZXNjVGFnOworCXVpbnQ4X3QJCXJlc2VydmVkWzQ5Nl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogTG9naWNhbCBWb2x1bWUgSW50ZWdyaXR5IERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgMy8xMC4xMCkgKi8KK3N0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzYworeworCXRhZwkJZGVzY1RhZzsKKwl0aW1lc3RhbXAJcmVjb3JkaW5nRGF0ZUFuZFRpbWU7CisJX19sZTMyCQlpbnRlZ3JpdHlUeXBlOworCWV4dGVudF9hZAluZXh0SW50ZWdyaXR5RXh0OworCXVpbnQ4X3QJCWxvZ2ljYWxWb2xDb250ZW50c1VzZVszMl07CisJX19sZTMyCQludW1PZlBhcnRpdGlvbnM7CisJX19sZTMyCQlsZW5ndGhPZkltcFVzZTsKKwlfX2xlMzIJCWZyZWVTcGFjZVRhYmxlWzBdOworCV9fbGUzMgkJc2l6ZVRhYmxlWzBdOworCXVpbnQ4X3QJCWltcFVzZVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBJbnRlZ3JpdHkgVHlwZSAoRUNNQSAxNjdyMyAzLzEwLjEwLjMpICovCisjZGVmaW5lIExWSURfSU5URUdSSVRZX1RZUEVfT1BFTgkweDAwMDAwMDAwCisjZGVmaW5lIExWSURfSU5URUdSSVRZX1RZUEVfQ0xPU0UJMHgwMDAwMDAwMQorCisvKiBSZWNvcmRlZCBBZGRyZXNzIChFQ01BIDE2N3IzIDQvNy4xKSAqLwordHlwZWRlZiBzdHJ1Y3QgCit7CisJX19sZTMyCQlsb2dpY2FsQmxvY2tOdW07CisJX19sZTE2CSAJcGFydGl0aW9uUmVmZXJlbmNlTnVtOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbGJfYWRkcjsKKworLyogLi4uIGFuZCBpdHMgaW4tY29yZSBhbmFsb2cgKi8KK3R5cGVkZWYgc3RydWN0IAoreworCXVpbnQzMl90CQlsb2dpY2FsQmxvY2tOdW07CisJdWludDE2X3QJIAlwYXJ0aXRpb25SZWZlcmVuY2VOdW07Cit9IGtlcm5lbF9sYl9hZGRyOworCisvKiBTaG9ydCBBbGxvY2F0aW9uIERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgNC8xNC4xNC4xKSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAgICAgX19sZTMyCQlleHRMZW5ndGg7CisgICAgICAgIF9fbGUzMgkJZXh0UG9zaXRpb247Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBzaG9ydF9hZDsKKworLyogTG9uZyBBbGxvY2F0aW9uIERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgNC8xNC4xNC4yKSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKwlfX2xlMzIJCWV4dExlbmd0aDsKKwlsYl9hZGRyCQlleHRMb2NhdGlvbjsKKwl1aW50OF90CQlpbXBVc2VbNl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBsb25nX2FkOworCit0eXBlZGVmIHN0cnVjdAoreworCXVpbnQzMl90CWV4dExlbmd0aDsKKwlrZXJuZWxfbGJfYWRkcglleHRMb2NhdGlvbjsKKwl1aW50OF90CQlpbXBVc2VbNl07Cit9IGtlcm5lbF9sb25nX2FkOworCisvKiBFeHRlbmRlZCBBbGxvY2F0aW9uIERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgNC8xNC4xNC4zKSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKwlfX2xlMzIJCWV4dExlbmd0aDsKKwlfX2xlMzIJCXJlY29yZGVkTGVuZ3RoOworCV9fbGUzMgkJaW5mb3JtYXRpb25MZW5ndGg7CisJbGJfYWRkcgkJZXh0TG9jYXRpb247Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBleHRfYWQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisJdWludDMyX3QJZXh0TGVuZ3RoOworCXVpbnQzMl90CXJlY29yZGVkTGVuZ3RoOworCXVpbnQzMl90CWluZm9ybWF0aW9uTGVuZ3RoOworCWtlcm5lbF9sYl9hZGRyCWV4dExvY2F0aW9uOworfSBrZXJuZWxfZXh0X2FkOworCisvKiBEZXNjcmlwdG9yIFRhZyAoRUNNQSAxNjdyMyA0LzcuMiAtIFNlZSAzLzcuMikgKi8KKworLyogVGFnIElkZW50aWZpZXIgKEVDTUEgMTY3cjMgNC83LjIuMSkgKi8KKyNkZWZpbmUgVEFHX0lERU5UX0ZTRAkJCTB4MDEwMAorI2RlZmluZSBUQUdfSURFTlRfRklECQkJMHgwMTAxCisjZGVmaW5lIFRBR19JREVOVF9BRUQJCQkweDAxMDIKKyNkZWZpbmUgVEFHX0lERU5UX0lFCQkJMHgwMTAzCisjZGVmaW5lIFRBR19JREVOVF9URQkJCTB4MDEwNAorI2RlZmluZSBUQUdfSURFTlRfRkUJCQkweDAxMDUKKyNkZWZpbmUgVEFHX0lERU5UX0VBSEQJCQkweDAxMDYKKyNkZWZpbmUgVEFHX0lERU5UX1VTRQkJCTB4MDEwNworI2RlZmluZSBUQUdfSURFTlRfU0JECQkJMHgwMTA4CisjZGVmaW5lIFRBR19JREVOVF9QSUUJCQkweDAxMDkKKyNkZWZpbmUgVEFHX0lERU5UX0VGRQkJCTB4MDEwQQorCisvKiBGaWxlIFNldCBEZXNjcmlwdG9yIChFQ01BIDE2N3IzIDQvMTQuMSkgKi8KK3N0cnVjdCBmaWxlU2V0RGVzYworeworCXRhZwkJZGVzY1RhZzsKKwl0aW1lc3RhbXAJcmVjb3JkaW5nRGF0ZUFuZFRpbWU7CisJX19sZTE2CQlpbnRlcmNoYW5nZUx2bDsKKwlfX2xlMTYJCW1heEludGVyY2hhbmdlTHZsOworCV9fbGUzMgkJY2hhclNldExpc3Q7CisJX19sZTMyCQltYXhDaGFyU2V0TGlzdDsKKwlfX2xlMzIJCWZpbGVTZXROdW07CisJX19sZTMyCQlmaWxlU2V0RGVzY051bTsKKwljaGFyc3BlYwlsb2dpY2FsVm9sSWRlbnRDaGFyU2V0OworCWRzdHJpbmcJCWxvZ2ljYWxWb2xJZGVudFsxMjhdOworCWNoYXJzcGVjCWZpbGVTZXRDaGFyU2V0OworCWRzdHJpbmcJCWZpbGVTZXRJZGVudFszMl07CisJZHN0cmluZwkJY29weXJpZ2h0RmlsZUlkZW50WzMyXTsKKwlkc3RyaW5nCQlhYnN0cmFjdEZpbGVJZGVudFszMl07CisJbG9uZ19hZAkJcm9vdERpcmVjdG9yeUlDQjsKKwlyZWdpZAkJZG9tYWluSWRlbnQ7CisJbG9uZ19hZAkJbmV4dEV4dDsKKwlsb25nX2FkCQlzdHJlYW1EaXJlY3RvcnlJQ0I7CisJdWludDhfdAkJcmVzZXJ2ZWRbMzJdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFBhcnRpdGlvbiBIZWFkZXIgRGVzY3JpcHRvciAoRUNNQSAxNjdyMyA0LzE0LjMpICovCitzdHJ1Y3QgcGFydGl0aW9uSGVhZGVyRGVzYworeworCXNob3J0X2FkCXVuYWxsb2NTcGFjZVRhYmxlOworCXNob3J0X2FkCXVuYWxsb2NTcGFjZUJpdG1hcDsKKwlzaG9ydF9hZAlwYXJ0aXRpb25JbnRlZ3JpdHlUYWJsZTsKKwlzaG9ydF9hZAlmcmVlZFNwYWNlVGFibGU7CisJc2hvcnRfYWQJZnJlZWRTcGFjZUJpdG1hcDsKKwl1aW50OF90CQlyZXNlcnZlZFs4OF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogRmlsZSBJZGVudGlmaWVyIERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgNC8xNC40KSAqLworc3RydWN0IGZpbGVJZGVudERlc2MKK3sKKwl0YWcJCWRlc2NUYWc7CisJX19sZTE2CQlmaWxlVmVyc2lvbk51bTsKKwl1aW50OF90CQlmaWxlQ2hhcmFjdGVyaXN0aWNzOworCXVpbnQ4X3QJCWxlbmd0aEZpbGVJZGVudDsKKwlsb25nX2FkCQlpY2I7CisJX19sZTE2CQlsZW5ndGhPZkltcFVzZTsKKwl1aW50OF90CQlpbXBVc2VbMF07CisJdWludDhfdAkJZmlsZUlkZW50WzBdOworCXVpbnQ4X3QJCXBhZGRpbmdbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogRmlsZSBDaGFyYWN0ZXJpc3RpY3MgKEVDTUEgMTY3cjMgNC8xNC40LjMpICovCisjZGVmaW5lIEZJRF9GSUxFX0NIQVJfSElEREVOCQkweDAxCisjZGVmaW5lIEZJRF9GSUxFX0NIQVJfRElSRUNUT1JZCQkweDAyCisjZGVmaW5lIEZJRF9GSUxFX0NIQVJfREVMRVRFRAkJMHgwNAorI2RlZmluZSBGSURfRklMRV9DSEFSX1BBUkVOVAkJMHgwOAorI2RlZmluZSBGSURfRklMRV9DSEFSX01FVEFEQVRBCQkweDEwCisKKy8qIEFsbG9jYXRpb24gRXh0IERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgNC8xNC41KSAqLworc3RydWN0IGFsbG9jRXh0RGVzYworeworCXRhZwkJZGVzY1RhZzsKKwlfX2xlMzIJCXByZXZpb3VzQWxsb2NFeHRMb2NhdGlvbjsKKwlfX2xlMzIJCWxlbmd0aEFsbG9jRGVzY3M7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogSUNCIFRhZyAoRUNNQSAxNjdyMyA0LzE0LjYpICovCit0eXBlZGVmIHN0cnVjdAoreworCV9fbGUzMgkJcHJpb3JSZWNvcmRlZE51bURpcmVjdEVudHJpZXM7CisJX19sZTE2CQlzdHJhdGVneVR5cGU7CisJX19sZTE2CQlzdHJhdGVneVBhcmFtZXRlcjsKKwlfX2xlMTYJCW51bUVudHJpZXM7CisJdWludDhfdAkJcmVzZXJ2ZWQ7CisJdWludDhfdAkJZmlsZVR5cGU7CisJbGJfYWRkcgkJcGFyZW50SUNCTG9jYXRpb247CisJX19sZTE2CQlmbGFnczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGljYnRhZzsKKworLyogU3RyYXRlZ3kgVHlwZSAoRUNNQSAxNjdyMyA0LzE0LjYuMikgKi8KKyNkZWZpbmUgSUNCVEFHX1NUUkFURUdZX1RZUEVfVU5ERUYJMHgwMDAwCisjZGVmaW5lIElDQlRBR19TVFJBVEVHWV9UWVBFXzEJCTB4MDAwMQorI2RlZmluZSBJQ0JUQUdfU1RSQVRFR1lfVFlQRV8yCQkweDAwMDIKKyNkZWZpbmUgSUNCVEFHX1NUUkFURUdZX1RZUEVfMwkJMHgwMDAzCisjZGVmaW5lIElDQlRBR19TVFJBVEVHWV9UWVBFXzQJCTB4MDAwNAorCisvKiBGaWxlIFR5cGUgKEVDTUEgMTY3cjMgNC8xNC42LjYpICovCisjZGVmaW5lIElDQlRBR19GSUxFX1RZUEVfVU5ERUYJCTB4MDAKKyNkZWZpbmUgSUNCVEFHX0ZJTEVfVFlQRV9VU0UJCTB4MDEKKyNkZWZpbmUgSUNCVEFHX0ZJTEVfVFlQRV9QSUUJCTB4MDIKKyNkZWZpbmUgSUNCVEFHX0ZJTEVfVFlQRV9JRQkJMHgwMworI2RlZmluZSBJQ0JUQUdfRklMRV9UWVBFX0RJUkVDVE9SWQkweDA0CisjZGVmaW5lIElDQlRBR19GSUxFX1RZUEVfUkVHVUxBUgkweDA1CisjZGVmaW5lIElDQlRBR19GSUxFX1RZUEVfQkxPQ0sJCTB4MDYKKyNkZWZpbmUgSUNCVEFHX0ZJTEVfVFlQRV9DSEFSCQkweDA3CisjZGVmaW5lIElDQlRBR19GSUxFX1RZUEVfRUEJCTB4MDgKKyNkZWZpbmUgSUNCVEFHX0ZJTEVfVFlQRV9GSUZPCQkweDA5CisjZGVmaW5lIElDQlRBR19GSUxFX1RZUEVfU09DS0VUCQkweDBBCisjZGVmaW5lIElDQlRBR19GSUxFX1RZUEVfVEUJCTB4MEIKKyNkZWZpbmUgSUNCVEFHX0ZJTEVfVFlQRV9TWU1MSU5LCTB4MEMKKyNkZWZpbmUgSUNCVEFHX0ZJTEVfVFlQRV9TVFJFQU1ESVIJMHgwRAorCisvKiBGbGFncyAoRUNNQSAxNjdyMyA0LzE0LjYuOCkgKi8KKyNkZWZpbmUgSUNCVEFHX0ZMQUdfQURfTUFTSwkJMHgwMDA3CisjZGVmaW5lIElDQlRBR19GTEFHX0FEX1NIT1JUCQkweDAwMDAKKyNkZWZpbmUgSUNCVEFHX0ZMQUdfQURfTE9ORwkJMHgwMDAxCisjZGVmaW5lIElDQlRBR19GTEFHX0FEX0VYVEVOREVECQkweDAwMDIKKyNkZWZpbmUgSUNCVEFHX0ZMQUdfQURfSU5fSUNCCQkweDAwMDMKKyNkZWZpbmUgSUNCVEFHX0ZMQUdfU09SVEVECQkweDAwMDgKKyNkZWZpbmUgSUNCVEFHX0ZMQUdfTk9OUkVMT0NBVEFCTEUJMHgwMDEwCisjZGVmaW5lIElDQlRBR19GTEFHX0FSQ0hJVkUJCTB4MDAyMAorI2RlZmluZSBJQ0JUQUdfRkxBR19TRVRVSUQJCTB4MDA0MAorI2RlZmluZSBJQ0JUQUdfRkxBR19TRVRHSUQJCTB4MDA4MAorI2RlZmluZSBJQ0JUQUdfRkxBR19TVElDS1kJCTB4MDEwMAorI2RlZmluZSBJQ0JUQUdfRkxBR19DT05USUdVT1VTCQkweDAyMDAKKyNkZWZpbmUgSUNCVEFHX0ZMQUdfU1lTVEVNCQkweDA0MDAKKyNkZWZpbmUgSUNCVEFHX0ZMQUdfVFJBTlNGT1JNRUQJCTB4MDgwMAorI2RlZmluZSBJQ0JUQUdfRkxBR19NVUxUSVZFUlNJT05TCTB4MTAwMAorI2RlZmluZSBJQ0JUQUdfRkxBR19TVFJFQU0JCTB4MjAwMAorCisvKiBJbmRpcmVjdCBFbnRyeSAoRUNNQSAxNjdyMyA0LzE0LjcpICovCitzdHJ1Y3QgaW5kaXJlY3RFbnRyeQoreworCXRhZwkJZGVzY1RhZzsKKwlpY2J0YWcJCWljYlRhZzsKKwlsb25nX2FkCQlpbmRpcmVjdElDQjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBUZXJtaW5hbCBFbnRyeSAoRUNNQSAxNjdyMyA0LzE0LjgpICovCitzdHJ1Y3QgdGVybWluYWxFbnRyeQoreworCXRhZwkJZGVzY1RhZzsKKwlpY2J0YWcJCWljYlRhZzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBGaWxlIEVudHJ5IChFQ01BIDE2N3IzIDQvMTQuOSkgKi8KK3N0cnVjdCBmaWxlRW50cnkKK3sKKwl0YWcJCWRlc2NUYWc7CisJaWNidGFnCQlpY2JUYWc7CisJX19sZTMyCQl1aWQ7CisJX19sZTMyCQlnaWQ7CisJX19sZTMyCQlwZXJtaXNzaW9uczsKKwlfX2xlMTYJCWZpbGVMaW5rQ291bnQ7CisJdWludDhfdAkJcmVjb3JkRm9ybWF0OworCXVpbnQ4X3QJCXJlY29yZERpc3BsYXlBdHRyOworCV9fbGUzMgkJcmVjb3JkTGVuZ3RoOworCV9fbGU2NAkJaW5mb3JtYXRpb25MZW5ndGg7CisJX19sZTY0CQlsb2dpY2FsQmxvY2tzUmVjb3JkZWQ7CisJdGltZXN0YW1wCWFjY2Vzc1RpbWU7CisJdGltZXN0YW1wCW1vZGlmaWNhdGlvblRpbWU7CisJdGltZXN0YW1wCWF0dHJUaW1lOworCV9fbGUzMgkJY2hlY2twb2ludDsKKwlsb25nX2FkCQlleHRlbmRlZEF0dHJJQ0I7CisJcmVnaWQJCWltcElkZW50OworCV9fbGU2NAkJdW5pcXVlSUQ7CisJX19sZTMyCQlsZW5ndGhFeHRlbmRlZEF0dHI7CisJX19sZTMyCQlsZW5ndGhBbGxvY0Rlc2NzOworCXVpbnQ4X3QJCWV4dGVuZGVkQXR0clswXTsKKwl1aW50OF90CQlhbGxvY0Rlc2NzWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFBlcm1pc3Npb25zIChFQ01BIDE2N3IzIDQvMTQuOS41KSAqLworI2RlZmluZSBGRV9QRVJNX09fRVhFQwkJCTB4MDAwMDAwMDFVCisjZGVmaW5lIEZFX1BFUk1fT19XUklURQkJCTB4MDAwMDAwMDJVCisjZGVmaW5lIEZFX1BFUk1fT19SRUFECQkJMHgwMDAwMDAwNFUKKyNkZWZpbmUgRkVfUEVSTV9PX0NIQVRUUgkJMHgwMDAwMDAwOFUKKyNkZWZpbmUgRkVfUEVSTV9PX0RFTEVURQkJMHgwMDAwMDAxMFUKKyNkZWZpbmUgRkVfUEVSTV9HX0VYRUMJCQkweDAwMDAwMDIwVQorI2RlZmluZSBGRV9QRVJNX0dfV1JJVEUJCQkweDAwMDAwMDQwVQorI2RlZmluZSBGRV9QRVJNX0dfUkVBRAkJCTB4MDAwMDAwODBVCisjZGVmaW5lIEZFX1BFUk1fR19DSEFUVFIJCTB4MDAwMDAxMDBVCisjZGVmaW5lIEZFX1BFUk1fR19ERUxFVEUJCTB4MDAwMDAyMDBVCisjZGVmaW5lIEZFX1BFUk1fVV9FWEVDCQkJMHgwMDAwMDQwMFUKKyNkZWZpbmUgRkVfUEVSTV9VX1dSSVRFCQkJMHgwMDAwMDgwMFUKKyNkZWZpbmUgRkVfUEVSTV9VX1JFQUQJCQkweDAwMDAxMDAwVQorI2RlZmluZSBGRV9QRVJNX1VfQ0hBVFRSCQkweDAwMDAyMDAwVQorI2RlZmluZSBGRV9QRVJNX1VfREVMRVRFCQkweDAwMDA0MDAwVQorCisvKiBSZWNvcmQgRm9ybWF0IChFQ01BIDE2N3IzIDQvMTQuOS43KSAqLworI2RlZmluZSBGRV9SRUNPUkRfRk1UX1VOREVGCQkweDAwCisjZGVmaW5lIEZFX1JFQ09SRF9GTVRfRklYRURfUEFECQkweDAxCisjZGVmaW5lIEZFX1JFQ09SRF9GTVRfRklYRUQJCTB4MDIKKyNkZWZpbmUgRkVfUkVDT1JEX0ZNVF9WQVJJQUJMRTgJCTB4MDMKKyNkZWZpbmUgRkVfUkVDT1JEX0ZNVF9WQVJJQUJMRTE2CTB4MDQKKyNkZWZpbmUgRkVfUkVDT1JEX0ZNVF9WQVJJQUJMRTE2X01TQgkweDA1CisjZGVmaW5lIEZFX1JFQ09SRF9GTVRfVkFSSUFCTEUzMgkweDA2CisjZGVmaW5lIEZFX1JFQ09SRF9GTVRfUFJJTlQJCTB4MDcKKyNkZWZpbmUgRkVfUkVDT1JEX0ZNVF9MRgkJMHgwOAorI2RlZmluZSBGRV9SRUNPUkRfRk1UX0NSCQkweDA5CisjZGVmaW5lIEZFX1JFQ09SRF9GTVRfQ1JMRgkJMHgwQQorI2RlZmluZSBGRV9SRUNPUkRfRk1UX0xGQ1IJCTB4MEIKKworLyogUmVjb3JkIERpc3BsYXkgQXR0cmlidXRlcyAoRUNNQSAxNjdyMyA0LzE0LjkuOCkgKi8KKyNkZWZpbmUgRkVfUkVDT1JEX0RJU1BMQVlfQVRUUl9VTkRFRgkweDAwCisjZGVmaW5lIEZFX1JFQ09SRF9ESVNQTEFZX0FUVFJfMQkweDAxCisjZGVmaW5lIEZFX1JFQ09SRF9ESVNQTEFZX0FUVFJfMgkweDAyCisjZGVmaW5lIEZFX1JFQ09SRF9ESVNQTEFZX0FUVFJfMwkweDAzCisKKy8qIEV4dGVuZGVkIEF0dHJpYnV0ZSBIZWFkZXIgRGVzY3JpcHRvciAoRUNNQSAxNjdyMyA0LzE0LjEwLjEpICovCitzdHJ1Y3QgZXh0ZW5kZWRBdHRySGVhZGVyRGVzYworeworCXRhZwkJZGVzY1RhZzsKKwlfX2xlMzIJCWltcEF0dHJMb2NhdGlvbjsKKwlfX2xlMzIJCWFwcEF0dHJMb2NhdGlvbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBHZW5lcmljIEZvcm1hdCAoRUNNQSAxNjdyMyA0LzE0LjEwLjIpICovCitzdHJ1Y3QgZ2VuZXJpY0Zvcm1hdAoreworCV9fbGUzMgkJYXR0clR5cGU7CisJdWludDhfdAkJYXR0clN1YnR5cGU7CisJdWludDhfdAkJcmVzZXJ2ZWRbM107CisJX19sZTMyCQlhdHRyTGVuZ3RoOworCXVpbnQ4X3QJCWF0dHJEYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIENoYXJhY3RlciBTZXQgSW5mb3JtYXRpb24gKEVDTUEgMTY3cjMgNC8xNC4xMC4zKSAqLworc3RydWN0IGNoYXJTZXRJbmZvCit7CisJX19sZTMyCQlhdHRyVHlwZTsKKwl1aW50OF90CQlhdHRyU3VidHlwZTsKKwl1aW50OF90CQlyZXNlcnZlZFszXTsKKwlfX2xlMzIJCWF0dHJMZW5ndGg7CisJX19sZTMyCQllc2NhcGVTZXFMZW5ndGg7CisJdWludDhfdAkJY2hhclNldFR5cGU7CisJdWludDhfdAkJZXNjYXBlU2VxWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEFsdGVybmF0ZSBQZXJtaXNzaW9ucyAoRUNNQSAxNjdyMyA0LzE0LjEwLjQpICovCitzdHJ1Y3QgYWx0UGVybXMKK3sKKwlfX2xlMzIJCWF0dHJUeXBlOworCXVpbnQ4X3QJCWF0dHJTdWJ0eXBlOworCXVpbnQ4X3QJCXJlc2VydmVkWzNdOworCV9fbGUzMgkJYXR0ckxlbmd0aDsKKwlfX2xlMTYJCW93bmVySWRlbnQ7CisJX19sZTE2CQlncm91cElkZW50OworCV9fbGUxNgkJcGVybWlzc2lvbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBGaWxlIFRpbWVzIEV4dGVuZGVkIEF0dHJpYnV0ZSAoRUNNQSAxNjdyMyA0LzE0LjEwLjUpICovCitzdHJ1Y3QgZmlsZVRpbWVzRXh0QXR0cgoreworCV9fbGUzMgkJYXR0clR5cGU7CisJdWludDhfdAkJYXR0clN1YnR5cGU7CisJdWludDhfdAkJcmVzZXJ2ZWRbM107CisJX19sZTMyCQlhdHRyTGVuZ3RoOworCV9fbGUzMgkJZGF0YUxlbmd0aDsKKwlfX2xlMzIJCWZpbGVUaW1lRXhpc3RlbmNlOworCXVpbnQ4X3QJCWZpbGVUaW1lczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBGaWxlVGltZUV4aXN0ZW5jZSAoRUNNQSAxNjdyMyA0LzE0LjEwLjUuNikgKi8KKyNkZWZpbmUgRlRFX0NSRUFUSU9OCQkJMHgwMDAwMDAwMQorI2RlZmluZSBGVEVfREVMRVRJT04JCQkweDAwMDAwMDA0CisjZGVmaW5lIEZURV9FRkZFQ1RJVkUJCQkweDAwMDAwMDA4CisjZGVmaW5lIEZURV9CQUNLVVAJCQkweDAwMDAwMDAyCisKKy8qIEluZm9ybWF0aW9uIFRpbWVzIEV4dGVuZGVkIEF0dHJpYnV0ZSAoRUNNQSAxNjdyMyA0LzE0LjEwLjYpICovCitzdHJ1Y3QgaW5mb1RpbWVzRXh0QXR0cgoreworCV9fbGUzMgkJYXR0clR5cGU7CisJdWludDhfdAkJYXR0clN1YnR5cGU7CisJdWludDhfdAkJcmVzZXJ2ZWRbM107CisJX19sZTMyCQlhdHRyTGVuZ3RoOworCV9fbGUzMgkJZGF0YUxlbmd0aDsKKwlfX2xlMzIJCWluZm9UaW1lRXhpc3RlbmNlOworCXVpbnQ4X3QJCWluZm9UaW1lc1swXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBEZXZpY2UgU3BlY2lmaWNhdGlvbiAoRUNNQSAxNjdyMyA0LzE0LjEwLjcpICovCitzdHJ1Y3QgZGV2aWNlU3BlYworeworCV9fbGUzMgkJYXR0clR5cGU7CisJdWludDhfdAkJYXR0clN1YnR5cGU7CisJdWludDhfdAkJcmVzZXJ2ZWRbM107CisJX19sZTMyCQlhdHRyTGVuZ3RoOworCV9fbGUzMgkJaW1wVXNlTGVuZ3RoOworCV9fbGUzMgkJbWFqb3JEZXZpY2VJZGVudDsKKwlfX2xlMzIJCW1pbm9yRGV2aWNlSWRlbnQ7CisJdWludDhfdAkJaW1wVXNlWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEltcGxlbWVudGF0aW9uIFVzZSBFeHRlbmRlZCBBdHRyIChFQ01BIDE2N3IzIDQvMTQuMTAuOCkgKi8KK3N0cnVjdCBpbXBVc2VFeHRBdHRyCit7CisJX19sZTMyCQlhdHRyVHlwZTsKKwl1aW50OF90CQlhdHRyU3VidHlwZTsKKwl1aW50OF90CQlyZXNlcnZlZFszXTsKKwlfX2xlMzIJCWF0dHJMZW5ndGg7CisJX19sZTMyCQlpbXBVc2VMZW5ndGg7CisJcmVnaWQJCWltcElkZW50OworCXVpbnQ4X3QJCWltcFVzZVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBBcHBsaWNhdGlvbiBVc2UgRXh0ZW5kZWQgQXR0cmlidXRlIChFQ01BIDE2N3IzIDQvMTQuMTAuOSkgKi8KK3N0cnVjdCBhcHBVc2VFeHRBdHRyCit7CisJX19sZTMyCQlhdHRyVHlwZTsKKwl1aW50OF90CQlhdHRyU3VidHlwZTsKKwl1aW50OF90CQlyZXNlcnZlZFszXTsKKwlfX2xlMzIJCWF0dHJMZW5ndGg7CisJX19sZTMyCQlhcHBVc2VMZW5ndGg7CisJcmVnaWQJCWFwcElkZW50OworCXVpbnQ4X3QJCWFwcFVzZVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIEVYVEFUVFJfQ0hBUl9TRVQJCTEKKyNkZWZpbmUgRVhUQVRUUl9BTFRfUEVSTVMJCTMKKyNkZWZpbmUgRVhUQVRUUl9GSUxFX1RJTUVTCQk1CisjZGVmaW5lIEVYVEFUVFJfSU5GT19USU1FUwkJNgorI2RlZmluZSBFWFRBVFRSX0RFVl9TUEVDCQkxMgorI2RlZmluZSBFWFRBVFRSX0lNUF9VU0UJCQkyMDQ4CisjZGVmaW5lIEVYVEFUVFJfQVBQX1VTRQkJCTY1NTM2CisKKworLyogVW5hbGxvY2F0ZWQgU3BhY2UgRW50cnkgKEVDTUEgMTY3cjMgNC8xNC4xMSkgKi8KK3N0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeQoreworCXRhZwkJZGVzY1RhZzsKKwlpY2J0YWcJCWljYlRhZzsKKwlfX2xlMzIJCWxlbmd0aEFsbG9jRGVzY3M7CisJdWludDhfdAkJYWxsb2NEZXNjc1swXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTcGFjZSBCaXRtYXAgRGVzY3JpcHRvciAoRUNNQSAxNjdyMyA0LzE0LjEyKSAqLworc3RydWN0IHNwYWNlQml0bWFwRGVzYworeworCXRhZwkJZGVzY1RhZzsKKwlfX2xlMzIJCW51bU9mQml0czsKKwlfX2xlMzIJCW51bU9mQnl0ZXM7CisJdWludDhfdAkJYml0bWFwWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFBhcnRpdGlvbiBJbnRlZ3JpdHkgRW50cnkgKEVDTUEgMTY3cjMgNC8xNC4xMykgKi8KK3N0cnVjdCBwYXJ0aXRpb25JbnRlZ3JpdHlFbnRyeQoreworCXRhZwkJZGVzY1RhZzsKKwlpY2J0YWcJCWljYlRhZzsKKwl0aW1lc3RhbXAJcmVjb3JkaW5nRGF0ZUFuZFRpbWU7CisJdWludDhfdAkJaW50ZWdyaXR5VHlwZTsKKwl1aW50OF90CQlyZXNlcnZlZFsxNzVdOworCXJlZ2lkCQlpbXBJZGVudDsKKwl1aW50OF90CQlpbXBVc2VbMjU2XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTaG9ydCBBbGxvY2F0aW9uIERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgNC8xNC4xNC4xKSAqLworCisvKiBFeHRlbnQgTGVuZ3RoIChFQ01BIDE2N3IzIDQvMTQuMTQuMS4xKSAqLworI2RlZmluZSBFWFRfUkVDT1JERURfQUxMT0NBVEVECQkweDAwMDAwMDAwCisjZGVmaW5lIEVYVF9OT1RfUkVDT1JERURfQUxMT0NBVEVECTB4NDAwMDAwMDAKKyNkZWZpbmUgRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVECTB4ODAwMDAwMDAKKyNkZWZpbmUgRVhUX05FWFRfRVhURU5UX0FMTE9DREVDUwkweEMwMDAwMDAwCisKKy8qIExvbmcgQWxsb2NhdGlvbiBEZXNjcmlwdG9yIChFQ01BIDE2N3IzIDQvMTQuMTQuMikgKi8KKworLyogRXh0ZW5kZWQgQWxsb2NhdGlvbiBEZXNjcmlwdG9yIChFQ01BIDE2N3IzIDQvMTQuMTQuMykgKi8KKworLyogTG9naWNhbCBWb2x1bWUgSGVhZGVyIERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgNC8xNC4xNSkgKi8KK3N0cnVjdCBsb2dpY2FsVm9sSGVhZGVyRGVzYworeworCV9fbGU2NAkJdW5pcXVlSUQ7CisJdWludDhfdAkJcmVzZXJ2ZWRbMjRdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFBhdGggQ29tcG9uZW50IChFQ01BIDE2N3IzIDQvMTQuMTYuMSkgKi8KK3N0cnVjdCBwYXRoQ29tcG9uZW50Cit7CisJdWludDhfdAkJY29tcG9uZW50VHlwZTsKKwl1aW50OF90CQlsZW5ndGhDb21wb25lbnRJZGVudDsKKwlfX2xlMTYJCWNvbXBvbmVudEZpbGVWZXJzaW9uTnVtOworCWRzdHJpbmcJCWNvbXBvbmVudElkZW50WzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEZpbGUgRW50cnkgKEVDTUEgMTY3cjMgNC8xNC4xNykgKi8KK3N0cnVjdCBleHRlbmRlZEZpbGVFbnRyeQoreworCXRhZwkJZGVzY1RhZzsKKwlpY2J0YWcJCWljYlRhZzsKKwlfX2xlMzIJCXVpZDsKKwlfX2xlMzIJCWdpZDsKKwlfX2xlMzIJCXBlcm1pc3Npb25zOworCV9fbGUxNgkJZmlsZUxpbmtDb3VudDsKKwl1aW50OF90CQlyZWNvcmRGb3JtYXQ7CisJdWludDhfdAkJcmVjb3JkRGlzcGxheUF0dHI7CisJX19sZTMyCQlyZWNvcmRMZW5ndGg7CisJX19sZTY0CQlpbmZvcm1hdGlvbkxlbmd0aDsKKwlfX2xlNjQJCW9iamVjdFNpemU7CisJX19sZTY0CQlsb2dpY2FsQmxvY2tzUmVjb3JkZWQ7CisJdGltZXN0YW1wCWFjY2Vzc1RpbWU7CisJdGltZXN0YW1wCW1vZGlmaWNhdGlvblRpbWU7CisJdGltZXN0YW1wCWNyZWF0ZVRpbWU7CisJdGltZXN0YW1wCWF0dHJUaW1lOworCV9fbGUzMgkJY2hlY2twb2ludDsKKwlfX2xlMzIJCXJlc2VydmVkOworCWxvbmdfYWQJCWV4dGVuZGVkQXR0cklDQjsKKwlsb25nX2FkCQlzdHJlYW1EaXJlY3RvcnlJQ0I7CisJcmVnaWQJCWltcElkZW50OworCV9fbGU2NAkJdW5pcXVlSUQ7CisJX19sZTMyCQlsZW5ndGhFeHRlbmRlZEF0dHI7CisJX19sZTMyCQlsZW5ndGhBbGxvY0Rlc2NzOworCXVpbnQ4X3QJCWV4dGVuZGVkQXR0clswXTsKKwl1aW50OF90CQlhbGxvY0Rlc2NzWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNlbmRpZiAvKiBfRUNNQV8xNjdfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvdWRmL2ZpbGUuYyBiL2ZzL3VkZi9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZhYTQxNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3VkZi9maWxlLmMKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBmaWxlLmMKKyAqCisgKiBQVVJQT1NFCisgKiAgRmlsZSBoYW5kbGluZyByb3V0aW5lcyBmb3IgdGhlIE9TVEEtVURGKHRtKSBmaWxlc3lzdGVtLgorICoKKyAqIENPTlRBQ1RTCisgKiAgRS1tYWlsIHJlZ2FyZGluZyBhbnkgcG9ydGlvbiBvZiB0aGUgTGludXggVURGIGZpbGUgc3lzdGVtIHNob3VsZCBiZQorICogIGRpcmVjdGVkIHRvIHRoZSBkZXZlbG9wbWVudCB0ZWFtIG1haWxpbmcgbGlzdCAocnVuIGJ5IG1ham9yZG9tbyk6CisgKiAgICBsaW51eF91ZGZAaHBlc2pyby5mYy5ocC5jb20KKyAqCisgKiBDT1BZUklHSFQKKyAqICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIChHUEwpLiBDb3BpZXMgb2YgdGhlIEdQTCBjYW4gYmUgb2J0YWluZWQgZnJvbToKKyAqICAgIGZ0cDovL3ByZXAuYWkubWl0LmVkdS9wdWIvZ251L0dQTAorICogIEVhY2ggY29udHJpYnV0aW5nIGF1dGhvciByZXRhaW5zIGFsbCByaWdodHMgdG8gdGhlaXIgb3duIHdvcmsuCisgKgorICogIChDKSAxOTk4LTE5OTkgRGF2ZSBCb3ludG9uCisgKiAgKEMpIDE5OTgtMjAwNCBCZW4gRmVubmVtYQorICogIChDKSAxOTk5LTIwMDAgU3RlbGlhcyBDb21wdXRpbmcgSW5jCisgKgorICogSElTVE9SWQorICoKKyAqICAxMC8wMi85OCBkZ2IgIEF0dGVtcHQgdG8gaW50ZWdyYXRlIGludG8gdWRmLm8KKyAqICAxMC8wNy85OCAgICAgIFN3aXRjaGVkIHRvIHVzaW5nIGdlbmVyaWNfcmVhZHBhZ2UsIGV0Yy4sIGxpa2UgaXNvZnMKKyAqICAgICAgICAgICAgICAgIEFuZCBpdCB3b3JrcyEKKyAqICAxMi8wNi85OCBibGYgIEFkZGVkIHVkZl9maWxlX3JlYWQuIHVzZXMgZ2VuZXJpY19maWxlX3JlYWQgZm9yIGFsbCBjYXNlcyBidXQKKyAqICAgICAgICAgICAgICAgIElDQlRBR19GTEFHX0FEX0lOX0lDQi4KKyAqICAwNC8wNi85OSAgICAgIDY0IGJpdCBmaWxlIGhhbmRsaW5nIG9uIDMyIGJpdCBzeXN0ZW1zIHRha2VuIGZyb20gZXh0MiBmaWxlLmMKKyAqICAwNS8xMi85OSAgICAgIFByZWxpbWluYXJ5IGZpbGUgd3JpdGUgc3VwcG9ydAorICovCisKKyNpbmNsdWRlICJ1ZGZkZWNsLmgiCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91ZGZfZnMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPiAvKiBtZW1zZXQgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKyNpbmNsdWRlICJ1ZGZfaS5oIgorI2luY2x1ZGUgInVkZl9zYi5oIgorCitzdGF0aWMgaW50IHVkZl9hZGluaWNiX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqIHBhZ2UpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJY2hhciAqa2FkZHI7CisKKwlpZiAoIVBhZ2VMb2NrZWQocGFnZSkpCisJCVBBR0VfQlVHKHBhZ2UpOworCisJa2FkZHIgPSBrbWFwKHBhZ2UpOworCW1lbXNldChrYWRkciwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKKwltZW1jcHkoa2FkZHIsIFVERl9JX0RBVEEoaW5vZGUpICsgVURGX0lfTEVORUFUVFIoaW5vZGUpLCBpbm9kZS0+aV9zaXplKTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJa3VubWFwKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVkZl9hZGluaWNiX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJY2hhciAqa2FkZHI7CisKKwlpZiAoIVBhZ2VMb2NrZWQocGFnZSkpCisJCVBBR0VfQlVHKHBhZ2UpOworCisJa2FkZHIgPSBrbWFwKHBhZ2UpOworCW1lbWNweShVREZfSV9EQVRBKGlub2RlKSArIFVERl9JX0xFTkVBVFRSKGlub2RlKSwga2FkZHIsIGlub2RlLT5pX3NpemUpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlrdW5tYXAocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdWRmX2FkaW5pY2JfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgdG8pCit7CisJa21hcChwYWdlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1ZGZfYWRpbmljYl9jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIHRvKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCWNoYXIgKmthZGRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCisJbWVtY3B5KFVERl9JX0RBVEEoaW5vZGUpICsgVURGX0lfTEVORUFUVFIoaW5vZGUpICsgb2Zmc2V0LAorCQlrYWRkciArIG9mZnNldCwgdG8gLSBvZmZzZXQpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlrdW5tYXAocGFnZSk7CisJLyogb25seSBvbmUgcGFnZSBoZXJlICovCisJaWYgKHRvID4gaW5vZGUtPmlfc2l6ZSkKKwkJaW5vZGUtPmlfc2l6ZSA9IHRvOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHVkZl9hZGluaWNiX2FvcHMgPSB7CisJLnJlYWRwYWdlCQk9IHVkZl9hZGluaWNiX3JlYWRwYWdlLAorCS53cml0ZXBhZ2UJCT0gdWRmX2FkaW5pY2Jfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UJCT0gYmxvY2tfc3luY19wYWdlLAorCS5wcmVwYXJlX3dyaXRlCQk9IHVkZl9hZGluaWNiX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZQkJPSB1ZGZfYWRpbmljYl9jb21taXRfd3JpdGUsCit9OworCitzdGF0aWMgc3NpemVfdCB1ZGZfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLAorCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXNzaXplX3QgcmV0dmFsOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyLCBwb3M7CisKKwlpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCisJeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EKQorCQkJcG9zID0gaW5vZGUtPmlfc2l6ZTsKKwkJZWxzZQorCQkJcG9zID0gKnBwb3M7CisKKwkJaWYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA8ICh1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpICsKKwkJCXBvcyArIGNvdW50KSkKKwkJeworCQkJdWRmX2V4cGFuZF9maWxlX2FkaW5pY2IoaW5vZGUsIHBvcyArIGNvdW50LCAmZXJyKTsKKwkJCWlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKKwkJCXsKKwkJCQl1ZGZfZGVidWcoInVkZl9leHBhbmRfYWRpbmljYjogZXJyPSVkXG4iLCBlcnIpOworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAocG9zICsgY291bnQgPiBpbm9kZS0+aV9zaXplKQorCQkJCVVERl9JX0xFTkFMTE9DKGlub2RlKSA9IHBvcyArIGNvdW50OworCQkJZWxzZQorCQkJCVVERl9JX0xFTkFMTE9DKGlub2RlKSA9IGlub2RlLT5pX3NpemU7CisJCX0KKwl9CisKKwlyZXR2YWwgPSBnZW5lcmljX2ZpbGVfd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7CisKKwlpZiAocmV0dmFsID4gMCkKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIHVkZl9pb2N0bAorICoKKyAqIFBVUlBPU0UKKyAqCUlzc3VlIGFuIGlvY3RsLgorICoKKyAqIERFU0NSSVBUSU9OCisgKglPcHRpb25hbCAtIHN5c19pb2N0bCgpIHdpbGwgcmV0dXJuIC1FTk9UVFkgaWYgdGhpcyByb3V0aW5lIGlzIG5vdAorICoJYXZhaWxhYmxlLCBhbmQgdGhlIGlvY3RsIGNhbm5vdCBiZSBoYW5kbGVkIHdpdGhvdXQgZmlsZXN5c3RlbSBoZWxwLgorICoKKyAqCXN5c19pb2N0bCgpIGhhbmRsZXMgdGhlc2UgaW9jdGxzIHRoYXQgYXBwbHkgb25seSB0byByZWd1bGFyIGZpbGVzOgorICoJCUZJQk1BUCBbcmVxdWlyZXMgdWRmX2Jsb2NrX21hcCgpXSwgRklHRVRCU1osIEZJT05SRUFECisgKglUaGVzZSBpb2N0bHMgYXJlIGFsc28gaGFuZGxlZCBieSBzeXNfaW9jdGwoKToKKyAqCQlGSU9DTEVYLCBGSU9OQ0xFWCwgRklPTkJJTywgRklPQVNZTkMKKyAqCUFsbCBvdGhlciBpb2N0bHMgYXJlIHBhc3NlZCB0byB0aGUgZmlsZXN5c3RlbS4KKyAqCisgKglSZWZlciB0byBzeXNfaW9jdGwoKSBpbiBmcy9pb2N0bC5jCisgKglzeXNfaW9jdGwoKSAtPiAuCisgKgorICogUFJFLUNPTkRJVElPTlMKKyAqCWlub2RlCQkJUG9pbnRlciB0byBpbm9kZSB0aGF0IGlvY3RsIHdhcyBpc3N1ZWQgb24uCisgKglmaWxwCQkJUG9pbnRlciB0byBmaWxlIHRoYXQgaW9jdGwgd2FzIGlzc3VlZCBvbi4KKyAqCWNtZAkJCVRoZSBpb2N0bCBjb21tYW5kLgorICoJYXJnCQkJVGhlIGlvY3RsIGFyZ3VtZW50IFtjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgYQorICoJCQkJdXNlci1zcGFjZSBwb2ludGVyIGlmIGRlc2lyZWRdLgorICoKKyAqIFBPU1QtQ09ORElUSU9OUworICoJPHJldHVybj4JCVN1Y2Nlc3MgKD49MCkgb3IgYW4gZXJyb3IgY29kZSAoPD0wKSB0aGF0CisgKgkJCQlzeXNfaW9jdGwoKSB3aWxsIHJldHVybi4KKyAqCisgKiBISVNUT1JZCisgKglKdWx5IDEsIDE5OTcgLSBBbmRyZXcgRS4gTWlsZXNraQorICoJV3JpdHRlbiwgdGVzdGVkLCBhbmQgcmVsZWFzZWQuCisgKi8KK2ludCB1ZGZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJlc3VsdCA9IC1FSU5WQUw7CisKKwlpZiAoIHBlcm1pc3Npb24oaW5vZGUsIE1BWV9SRUFELCBOVUxMKSAhPSAwICkKKwl7CisJCXVkZl9kZWJ1Zygibm8gcGVybWlzc2lvbiB0byBhY2Nlc3MgaW5vZGUgJWx1XG4iLAorCQkJCQkJaW5vZGUtPmlfaW5vKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlpZiAoICFhcmcgKQorCXsKKwkJdWRmX2RlYnVnKCJpbnZhbGlkIGFyZ3VtZW50IHRvIHVkZl9pb2N0bFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoY21kKQorCXsKKwkJY2FzZSBVREZfR0VUVk9MSURFTlQ6CisJCQlyZXR1cm4gY29weV90b191c2VyKChjaGFyIF9fdXNlciAqKWFyZywKKwkJCQlVREZfU0JfVk9MSURFTlQoaW5vZGUtPmlfc2IpLCAzMikgPyAtRUZBVUxUIDogMDsKKwkJY2FzZSBVREZfUkVMT0NBVEVfQkxPQ0tTOgorCQl7CisJCQlsb25nIG9sZCwgbmV3OworCisJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHJldHVybiAtRUFDQ0VTOworCQkJaWYgKGdldF91c2VyKG9sZCwgKGxvbmcgX191c2VyICopYXJnKSkgcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoKHJlc3VsdCA9IHVkZl9yZWxvY2F0ZV9ibG9ja3MoaW5vZGUtPmlfc2IsCisJCQkJCW9sZCwgJm5ldykpID09IDApCisJCQkJcmVzdWx0ID0gcHV0X3VzZXIobmV3LCAobG9uZyBfX3VzZXIgKilhcmcpOworCisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWNhc2UgVURGX0dFVEVBU0laRToKKwkJCXJlc3VsdCA9IHB1dF91c2VyKFVERl9JX0xFTkVBVFRSKGlub2RlKSwgKGludCBfX3VzZXIgKilhcmcpOworCQkJYnJlYWs7CisKKwkJY2FzZSBVREZfR0VURUFCTE9DSzoKKwkJCXJlc3VsdCA9IGNvcHlfdG9fdXNlcigoY2hhciBfX3VzZXIgKilhcmcsIFVERl9JX0RBVEEoaW5vZGUpLAorCQkJCVVERl9JX0xFTkVBVFRSKGlub2RlKSkgPyAtRUZBVUxUIDogMDsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiB1ZGZfcmVsZWFzZV9maWxlCisgKgorICogUFVSUE9TRQorICogIENhbGxlZCB3aGVuIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBmaWxlIGFyZSBjbG9zZWQKKyAqCisgKiBERVNDUklQVElPTgorICogIERpc2NhcmQgcHJlYWxsb2NlZCBibG9ja3MKKyAqCisgKiBISVNUT1JZCisgKgorICovCitzdGF0aWMgaW50IHVkZl9yZWxlYXNlX2ZpbGUoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJeworCQlsb2NrX2tlcm5lbCgpOworCQl1ZGZfZGlzY2FyZF9wcmVhbGxvYyhpbm9kZSk7CisJCXVubG9ja19rZXJuZWwoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgdWRmX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJCT0gZ2VuZXJpY19maWxlX3JlYWQsCisJLmlvY3RsCQkJPSB1ZGZfaW9jdGwsCisJLm9wZW4JCQk9IGdlbmVyaWNfZmlsZV9vcGVuLAorCS5tbWFwCQkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkud3JpdGUJCQk9IHVkZl9maWxlX3dyaXRlLAorCS5yZWxlYXNlCQk9IHVkZl9yZWxlYXNlX2ZpbGUsCisJLmZzeW5jCQkJPSB1ZGZfZnN5bmNfZmlsZSwKKwkuc2VuZGZpbGUJCT0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdWRmX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkudHJ1bmNhdGUJCT0gdWRmX3RydW5jYXRlLAorfTsKZGlmZiAtLWdpdCBhL2ZzL3VkZi9mc3luYy5jIGIvZnMvdWRmL2ZzeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkZTZiOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3VkZi9mc3luYy5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBmc3luYy5jCisgKgorICogUFVSUE9TRQorICogIEZzeW5jIGhhbmRsaW5nIHJvdXRpbmVzIGZvciB0aGUgT1NUQS1VREYodG0pIGZpbGVzeXN0ZW0uCisgKgorICogQ09OVEFDVFMKKyAqICBFLW1haWwgcmVnYXJkaW5nIGFueSBwb3J0aW9uIG9mIHRoZSBMaW51eCBVREYgZmlsZSBzeXN0ZW0gc2hvdWxkIGJlCisgKiAgZGlyZWN0ZWQgdG8gdGhlIGRldmVsb3BtZW50IHRlYW0gbWFpbGluZyBsaXN0IChydW4gYnkgbWFqb3Jkb21vKToKKyAqICAgICAgbGludXhfdWRmQGhwZXNqcm8uZmMuaHAuY29tCisgKgorICogQ09QWVJJR0hUCisgKiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSAoR1BMKS4gQ29waWVzIG9mIHRoZSBHUEwgY2FuIGJlIG9idGFpbmVkIGZyb206CisgKiAgICAgIGZ0cDovL3ByZXAuYWkubWl0LmVkdS9wdWIvZ251L0dQTAorICogIEVhY2ggY29udHJpYnV0aW5nIGF1dGhvciByZXRhaW5zIGFsbCByaWdodHMgdG8gdGhlaXIgb3duIHdvcmsuCisgKgorICogIChDKSAxOTk5LTIwMDEgQmVuIEZlbm5lbWEKKyAqICAoQykgMTk5OS0yMDAwIFN0ZWxpYXMgQ29tcHV0aW5nIEluYworICoKKyAqIEhJU1RPUlkKKyAqCisgKiAgMDUvMjIvOTkgYmxmICBDcmVhdGVkLgorICovCisKKyNpbmNsdWRlICJ1ZGZkZWNsLmgiCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKK3N0YXRpYyBpbnQgdWRmX2ZzeW5jX2lub2RlKHN0cnVjdCBpbm9kZSAqLCBpbnQpOworCisvKgorICoJRmlsZSBtYXkgYmUgTlVMTCB3aGVuIHdlIGFyZSBjYWxsZWQuIFBlcmhhcHMgd2Ugc2hvdWxkbid0CisgKglldmVuIHBhc3MgZmlsZSB0byBmc3luYyA/CisgKi8KKworaW50IHVkZl9mc3luY19maWxlKHN0cnVjdCBmaWxlICogZmlsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlyZXR1cm4gdWRmX2ZzeW5jX2lub2RlKGlub2RlLCBkYXRhc3luYyk7Cit9CisKK3N0YXRpYyBpbnQgdWRmX2ZzeW5jX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBkYXRhc3luYykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gc3luY19tYXBwaW5nX2J1ZmZlcnMoaW5vZGUtPmlfbWFwcGluZyk7CisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX0RJUlRZKSkKKwkJcmV0dXJuIGVycjsKKwlpZiAoZGF0YXN5bmMgJiYgIShpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFlfREFUQVNZTkMpKQorCQlyZXR1cm4gZXJyOworCisJZXJyIHw9IHVkZl9zeW5jX2lub2RlIChpbm9kZSk7CisJcmV0dXJuIGVyciA/IC1FSU8gOiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvdWRmL2lhbGxvYy5jIGIvZnMvdWRmL2lhbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZTVkNDAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZGYvaWFsbG9jLmMKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBpYWxsb2MuYworICoKKyAqIFBVUlBPU0UKKyAqCUlub2RlIGFsbG9jYXRpb24gaGFuZGxpbmcgcm91dGluZXMgZm9yIHRoZSBPU1RBLVVERih0bSkgZmlsZXN5c3RlbS4KKyAqCisgKiBDT05UQUNUUworICoJRS1tYWlsIHJlZ2FyZGluZyBhbnkgcG9ydGlvbiBvZiB0aGUgTGludXggVURGIGZpbGUgc3lzdGVtIHNob3VsZCBiZQorICoJZGlyZWN0ZWQgdG8gdGhlIGRldmVsb3BtZW50IHRlYW0gbWFpbGluZyBsaXN0IChydW4gYnkgbWFqb3Jkb21vKToKKyAqCQlsaW51eF91ZGZAaHBlc2pyby5mYy5ocC5jb20KKyAqCisgKiBDT1BZUklHSFQKKyAqCVRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSAoR1BMKS4gQ29waWVzIG9mIHRoZSBHUEwgY2FuIGJlIG9idGFpbmVkIGZyb206CisgKgkJZnRwOi8vcHJlcC5haS5taXQuZWR1L3B1Yi9nbnUvR1BMCisgKglFYWNoIGNvbnRyaWJ1dGluZyBhdXRob3IgcmV0YWlucyBhbGwgcmlnaHRzIHRvIHRoZWlyIG93biB3b3JrLgorICoKKyAqICAoQykgMTk5OC0yMDAxIEJlbiBGZW5uZW1hCisgKgorICogSElTVE9SWQorICoKKyAqICAwMi8yNC85OSBibGYgIENyZWF0ZWQuCisgKgorICovCisKKyNpbmNsdWRlICJ1ZGZkZWNsLmgiCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VkZl9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAidWRmX2kuaCIKKyNpbmNsdWRlICJ1ZGZfc2IuaCIKKwordm9pZCB1ZGZfZnJlZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IHVkZl9zYl9pbmZvICpzYmkgPSBVREZfU0Ioc2IpOworCisJLyoKKwkgKiBOb3RlOiB3ZSBtdXN0IGZyZWUgYW55IHF1b3RhIGJlZm9yZSBsb2NraW5nIHRoZSBzdXBlcmJsb2NrLAorCSAqIGFzIHdyaXRpbmcgdGhlIHF1b3RhIHRvIGRpc2sgbWF5IG5lZWQgdGhlIGxvY2sgYXMgd2VsbC4KKwkgKi8KKwlEUVVPVF9GUkVFX0lOT0RFKGlub2RlKTsKKwlEUVVPVF9EUk9QKGlub2RlKTsKKworCWNsZWFyX2lub2RlKGlub2RlKTsKKworCWRvd24oJnNiaS0+c19hbGxvY19zZW0pOworCWlmIChzYmktPnNfbHZpZGJoKSB7CisJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQkJVURGX1NCX0xWSURJVShzYiktPm51bURpcnMgPQorCQkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KFVERl9TQl9MVklESVUoc2IpLT5udW1EaXJzKSAtIDEpOworCQllbHNlCisJCQlVREZfU0JfTFZJRElVKHNiKS0+bnVtRmlsZXMgPQorCQkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KFVERl9TQl9MVklESVUoc2IpLT5udW1GaWxlcykgLSAxKTsKKwkJCisJCW1hcmtfYnVmZmVyX2RpcnR5KHNiaS0+c19sdmlkYmgpOworCX0KKwl1cCgmc2JpLT5zX2FsbG9jX3NlbSk7CisKKwl1ZGZfZnJlZV9ibG9ja3Moc2IsIE5VTEwsIFVERl9JX0xPQ0FUSU9OKGlub2RlKSwgMCwgMSk7Cit9CisKK3N0cnVjdCBpbm9kZSAqIHVkZl9uZXdfaW5vZGUgKHN0cnVjdCBpbm9kZSAqZGlyLCBpbnQgbW9kZSwgaW50ICogZXJyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IHVkZl9zYl9pbmZvICpzYmkgPSBVREZfU0Ioc2IpOworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCWludCBibG9jazsKKwl1aW50MzJfdCBzdGFydCA9IFVERl9JX0xPQ0FUSU9OKGRpcikubG9naWNhbEJsb2NrTnVtOworCisJaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCisJaWYgKCFpbm9kZSkKKwl7CisJCSplcnIgPSAtRU5PTUVNOworCQlyZXR1cm4gTlVMTDsKKwl9CisJKmVyciA9IC1FTk9TUEM7CisKKwlibG9jayA9IHVkZl9uZXdfYmxvY2soZGlyLT5pX3NiLCBOVUxMLCBVREZfSV9MT0NBVElPTihkaXIpLnBhcnRpdGlvblJlZmVyZW5jZU51bSwKKwkJc3RhcnQsIGVycik7CisJaWYgKCplcnIpCisJeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZG93bigmc2JpLT5zX2FsbG9jX3NlbSk7CisJVURGX0lfVU5JUVVFKGlub2RlKSA9IDA7CisJVURGX0lfTEVORVhURU5UUyhpbm9kZSkgPSAwOworCVVERl9JX05FWFRfQUxMT0NfQkxPQ0soaW5vZGUpID0gMDsKKwlVREZfSV9ORVhUX0FMTE9DX0dPQUwoaW5vZGUpID0gMDsKKwlVREZfSV9TVFJBVDQwOTYoaW5vZGUpID0gMDsKKwlpZiAoVURGX1NCX0xWSURCSChzYikpCisJeworCQlzdHJ1Y3QgbG9naWNhbFZvbEhlYWRlckRlc2MgKmx2aGQ7CisJCXVpbnQ2NF90IHVuaXF1ZUlEOworCQlsdmhkID0gKHN0cnVjdCBsb2dpY2FsVm9sSGVhZGVyRGVzYyAqKShVREZfU0JfTFZJRChzYiktPmxvZ2ljYWxWb2xDb250ZW50c1VzZSk7CisJCWlmIChTX0lTRElSKG1vZGUpKQorCQkJVURGX1NCX0xWSURJVShzYiktPm51bURpcnMgPQorCQkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KFVERl9TQl9MVklESVUoc2IpLT5udW1EaXJzKSArIDEpOworCQllbHNlCisJCQlVREZfU0JfTFZJRElVKHNiKS0+bnVtRmlsZXMgPQorCQkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KFVERl9TQl9MVklESVUoc2IpLT5udW1GaWxlcykgKyAxKTsKKwkJVURGX0lfVU5JUVVFKGlub2RlKSA9IHVuaXF1ZUlEID0gbGU2NF90b19jcHUobHZoZC0+dW5pcXVlSUQpOworCQlpZiAoISgrK3VuaXF1ZUlEICYgMHgwMDAwMDAwMEZGRkZGRkZGVUwpKQorCQkJdW5pcXVlSUQgKz0gMTY7CisJCWx2aGQtPnVuaXF1ZUlEID0gY3B1X3RvX2xlNjQodW5pcXVlSUQpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShVREZfU0JfTFZJREJIKHNiKSk7CisJfQorCWlub2RlLT5pX21vZGUgPSBtb2RlOworCWlub2RlLT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCWlmIChkaXItPmlfbW9kZSAmIFNfSVNHSUQpCisJeworCQlpbm9kZS0+aV9naWQgPSBkaXItPmlfZ2lkOworCQlpZiAoU19JU0RJUihtb2RlKSkKKwkJCW1vZGUgfD0gU19JU0dJRDsKKwl9CisJZWxzZQorCQlpbm9kZS0+aV9naWQgPSBjdXJyZW50LT5mc2dpZDsKKworCVVERl9JX0xPQ0FUSU9OKGlub2RlKS5sb2dpY2FsQmxvY2tOdW0gPSBibG9jazsKKwlVREZfSV9MT0NBVElPTihpbm9kZSkucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gVURGX0lfTE9DQVRJT04oZGlyKS5wYXJ0aXRpb25SZWZlcmVuY2VOdW07CisJaW5vZGUtPmlfaW5vID0gdWRmX2dldF9sYl9wYmxvY2soc2IsIFVERl9JX0xPQ0FUSU9OKGlub2RlKSwgMCk7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfU0laRTsKKwlpbm9kZS0+aV9ibG9ja3MgPSAwOworCVVERl9JX0xFTkVBVFRSKGlub2RlKSA9IDA7CisJVURGX0lfTEVOQUxMT0MoaW5vZGUpID0gMDsKKwlVREZfSV9VU0UoaW5vZGUpID0gMDsKKwlpZiAoVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1VTRV9FWFRFTkRFRF9GRSkpCisJeworCQlVREZfSV9FRkUoaW5vZGUpID0gMTsKKwkJVURGX1VQREFURV9VREZSRVYoaW5vZGUtPmlfc2IsIFVERl9WRVJTX1VTRV9FWFRFTkRFRF9GRSk7CisJCVVERl9JX0RBVEEoaW5vZGUpID0ga21hbGxvYyhpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJCW1lbXNldChVREZfSV9EQVRBKGlub2RlKSwgMHgwMCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSkpOworCX0KKwllbHNlCisJeworCQlVREZfSV9FRkUoaW5vZGUpID0gMDsKKwkJVURGX0lfREFUQShpbm9kZSkgPSBrbWFsbG9jKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJCW1lbXNldChVREZfSV9EQVRBKGlub2RlKSwgMHgwMCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBmaWxlRW50cnkpKTsKKwl9CisJaWYgKFVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19VU0VfQURfSU5fSUNCKSkKKwkJVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9IElDQlRBR19GTEFHX0FEX0lOX0lDQjsKKwllbHNlIGlmIChVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfVVNFX1NIT1JUX0FEKSkKKwkJVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9IElDQlRBR19GTEFHX0FEX1NIT1JUOworCWVsc2UKKwkJVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9IElDQlRBR19GTEFHX0FEX0xPTkc7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0KKwkJVURGX0lfQ1JUSU1FKGlub2RlKSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CisJaW5zZXJ0X2lub2RlX2hhc2goaW5vZGUpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXVwKCZzYmktPnNfYWxsb2Nfc2VtKTsKKworCWlmIChEUVVPVF9BTExPQ19JTk9ERShpbm9kZSkpCisJeworCQlEUVVPVF9EUk9QKGlub2RlKTsKKwkJaW5vZGUtPmlfZmxhZ3MgfD0gU19OT1FVT1RBOworCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCWlwdXQoaW5vZGUpOworCQkqZXJyID0gLUVEUVVPVDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJKmVyciA9IDA7CisJcmV0dXJuIGlub2RlOworfQpkaWZmIC0tZ2l0IGEvZnMvdWRmL2lub2RlLmMgYi9mcy91ZGYvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTA2ZTExCi0tLSAvZGV2L251bGwKKysrIGIvZnMvdWRmL2lub2RlLmMKQEAgLTAsMCArMSwyMDEwIEBACisvKgorICogaW5vZGUuYworICoKKyAqIFBVUlBPU0UKKyAqICBJbm9kZSBoYW5kbGluZyByb3V0aW5lcyBmb3IgdGhlIE9TVEEtVURGKHRtKSBmaWxlc3lzdGVtLgorICoKKyAqIENPTlRBQ1RTCisgKiAgRS1tYWlsIHJlZ2FyZGluZyBhbnkgcG9ydGlvbiBvZiB0aGUgTGludXggVURGIGZpbGUgc3lzdGVtIHNob3VsZCBiZQorICogIGRpcmVjdGVkIHRvIHRoZSBkZXZlbG9wbWVudCB0ZWFtIG1haWxpbmcgbGlzdCAocnVuIGJ5IG1ham9yZG9tbyk6CisgKiAgICBsaW51eF91ZGZAaHBlc2pyby5mYy5ocC5jb20KKyAqCisgKiBDT1BZUklHSFQKKyAqICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIChHUEwpLiBDb3BpZXMgb2YgdGhlIEdQTCBjYW4gYmUgb2J0YWluZWQgZnJvbToKKyAqICAgIGZ0cDovL3ByZXAuYWkubWl0LmVkdS9wdWIvZ251L0dQTAorICogIEVhY2ggY29udHJpYnV0aW5nIGF1dGhvciByZXRhaW5zIGFsbCByaWdodHMgdG8gdGhlaXIgb3duIHdvcmsuCisgKgorICogIChDKSAxOTk4IERhdmUgQm95bnRvbgorICogIChDKSAxOTk4LTIwMDQgQmVuIEZlbm5lbWEKKyAqICAoQykgMTk5OS0yMDAwIFN0ZWxpYXMgQ29tcHV0aW5nIEluYworICoKKyAqIEhJU1RPUlkKKyAqCisgKiAgMTAvMDQvOTggZGdiICBBZGRlZCBydWRpbWVudGFyeSBkaXJlY3RvcnkgZnVuY3Rpb25zCisgKiAgMTAvMDcvOTggICAgICBGdWxseSB3b3JraW5nIHVkZl9ibG9ja19tYXAhIEl0IHdvcmtzIQorICogIDExLzI1Lzk4ICAgICAgYm1hcCBhbHRlcmVkIHRvIGJldHRlciBzdXBwb3J0IGV4dGVudHMKKyAqICAxMi8wNi85OCBibGYgIHBhcnRpdGlvbiBzdXBwb3J0IGluIHVkZl9pZ2V0LCB1ZGZfYmxvY2tfbWFwIGFuZCB1ZGZfcmVhZF9pbm9kZQorICogIDEyLzEyLzk4ICAgICAgcmV3cm90ZSB1ZGZfYmxvY2tfbWFwIHRvIGhhbmRsZSBuZXh0IGV4dGVudHMgYW5kIGRlc2NzIGFjcm9zcworICogICAgICAgICAgICAgICAgYmxvY2sgYm91bmRhcmllcyAod2hpY2ggaXMgbm90IGFjdHVhbGx5IGFsbG93ZWQpCisgKiAgMTIvMjAvOTggICAgICBhZGRlZCBzdXBwb3J0IGZvciBzdHJhdGVneSA0MDk2CisgKiAgMDMvMDcvOTkgICAgICByZXdyb3RlIHVkZl9ibG9ja19tYXAgKGFnYWluKQorICogICAgICAgICAgICAgICAgTmV3IGZ1bmNzLCBpbm9kZV9ibWFwLCB1ZGZfbmV4dF9hZXh0CisgKiAgMDQvMTkvOTkgICAgICBTdXBwb3J0IGZvciB3cml0aW5nIGRldmljZSBFQSdzIGZvciBtYWpvci9taW5vciAjCisgKi8KKworI2luY2x1ZGUgInVkZmRlY2wuaCIKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAidWRmX2kuaCIKKyNpbmNsdWRlICJ1ZGZfc2IuaCIKKworTU9EVUxFX0FVVEhPUigiQmVuIEZlbm5lbWEiKTsKK01PRFVMRV9ERVNDUklQVElPTigiVW5pdmVyc2FsIERpc2sgRm9ybWF0IEZpbGVzeXN0ZW0iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBFWFRFTlRfTUVSR0VfU0laRSA1CisKK3N0YXRpYyBtb2RlX3QgdWRmX2NvbnZlcnRfcGVybWlzc2lvbnMoc3RydWN0IGZpbGVFbnRyeSAqKTsKK3N0YXRpYyBpbnQgdWRmX3VwZGF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKK3N0YXRpYyB2b2lkIHVkZl9maWxsX2lub2RlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7CitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICppbm9kZV9nZXRibGsoc3RydWN0IGlub2RlICosIGxvbmcsIGludCAqLAorCWxvbmcgKiwgaW50ICopOworc3RhdGljIGludDhfdCB1ZGZfaW5zZXJ0X2FleHQoc3RydWN0IGlub2RlICosIGtlcm5lbF9sYl9hZGRyLCBpbnQsCisJa2VybmVsX2xiX2FkZHIsIHVpbnQzMl90LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7CitzdGF0aWMgdm9pZCB1ZGZfc3BsaXRfZXh0ZW50cyhzdHJ1Y3QgaW5vZGUgKiwgaW50ICosIGludCwgaW50LAorCWtlcm5lbF9sb25nX2FkIFtFWFRFTlRfTUVSR0VfU0laRV0sIGludCAqKTsKK3N0YXRpYyB2b2lkIHVkZl9wcmVhbGxvY19leHRlbnRzKHN0cnVjdCBpbm9kZSAqLCBpbnQsIGludCwKKwkga2VybmVsX2xvbmdfYWQgW0VYVEVOVF9NRVJHRV9TSVpFXSwgaW50ICopOworc3RhdGljIHZvaWQgdWRmX21lcmdlX2V4dGVudHMoc3RydWN0IGlub2RlICosCisJIGtlcm5lbF9sb25nX2FkIFtFWFRFTlRfTUVSR0VfU0laRV0sIGludCAqKTsKK3N0YXRpYyB2b2lkIHVkZl91cGRhdGVfZXh0ZW50cyhzdHJ1Y3QgaW5vZGUgKiwKKwlrZXJuZWxfbG9uZ19hZCBbRVhURU5UX01FUkdFX1NJWkVdLCBpbnQsIGludCwKKwlrZXJuZWxfbGJfYWRkciwgdWludDMyX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqKik7CitzdGF0aWMgaW50IHVkZl9nZXRfYmxvY2soc3RydWN0IGlub2RlICosIHNlY3Rvcl90LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50KTsKKworLyoKKyAqIHVkZl9kZWxldGVfaW5vZGUKKyAqCisgKiBQVVJQT1NFCisgKglDbGVhbi11cCBiZWZvcmUgdGhlIHNwZWNpZmllZCBpbm9kZSBpcyBkZXN0cm95ZWQuCisgKgorICogREVTQ1JJUFRJT04KKyAqCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiB0aGUga2VybmVsIGRlc3Ryb3lzIGFuIGlub2RlIHN0cnVjdHVyZQorICoJaWUuIHdoZW4gaXB1dCgpIGZpbmRzIGlfY291bnQgPT0gMC4KKyAqCisgKiBISVNUT1JZCisgKglKdWx5IDEsIDE5OTcgLSBBbmRyZXcgRS4gTWlsZXNraQorICoJV3JpdHRlbiwgdGVzdGVkLCBhbmQgcmVsZWFzZWQuCisgKgorICogIENhbGxlZCBhdCB0aGUgbGFzdCBpcHV0KCkgaWYgaV9ubGluayBpcyB6ZXJvLgorICovCit2b2lkIHVkZl9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCisJCWdvdG8gbm9fZGVsZXRlOworCisJaW5vZGUtPmlfc2l6ZSA9IDA7CisJdWRmX3RydW5jYXRlKGlub2RlKTsKKwlsb2NrX2tlcm5lbCgpOworCisJdWRmX3VwZGF0ZV9pbm9kZShpbm9kZSwgSVNfU1lOQyhpbm9kZSkpOworCXVkZl9mcmVlX2lub2RlKGlub2RlKTsKKworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm47Citub19kZWxldGU6CisJY2xlYXJfaW5vZGUoaW5vZGUpOworfQorCit2b2lkIHVkZl9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmICghKGlub2RlLT5pX3NiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlsb2NrX2tlcm5lbCgpOworCQl1ZGZfZGlzY2FyZF9wcmVhbGxvYyhpbm9kZSk7CisJCXVubG9ja19rZXJuZWwoKTsKKwl9CisKKwlrZnJlZShVREZfSV9EQVRBKGlub2RlKSk7CisJVURGX0lfREFUQShpbm9kZSkgPSBOVUxMOworfQorCitzdGF0aWMgaW50IHVkZl93cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXJldHVybiBibG9ja193cml0ZV9mdWxsX3BhZ2UocGFnZSwgdWRmX2dldF9ibG9jaywgd2JjKTsKK30KKworc3RhdGljIGludCB1ZGZfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLCB1ZGZfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIGludCB1ZGZfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXJldHVybiBibG9ja19wcmVwYXJlX3dyaXRlKHBhZ2UsIGZyb20sIHRvLCB1ZGZfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIHNlY3Rvcl90IHVkZl9ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jaykKK3sKKwlyZXR1cm4gZ2VuZXJpY19ibG9ja19ibWFwKG1hcHBpbmcsYmxvY2ssdWRmX2dldF9ibG9jayk7Cit9CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdWRmX2FvcHMgPSB7CisJLnJlYWRwYWdlCQk9IHVkZl9yZWFkcGFnZSwKKwkud3JpdGVwYWdlCQk9IHVkZl93cml0ZXBhZ2UsCisJLnN5bmNfcGFnZQkJPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUJCT0gdWRmX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZQkJPSBnZW5lcmljX2NvbW1pdF93cml0ZSwKKwkuYm1hcAkJCT0gdWRmX2JtYXAsCit9OworCit2b2lkIHVkZl9leHBhbmRfZmlsZV9hZGluaWNiKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgbmV3c2l6ZSwgaW50ICogZXJyKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCWNoYXIgKmthZGRyOworCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCB1ZGZfd2JjID0geworCQkuc3luY19tb2RlID0gV0JfU1lOQ19OT05FLAorCQkubnJfdG9fd3JpdGUgPSAxLAorCX07CisKKwkvKiBmcm9tIG5vdyBvbiB3ZSBoYXZlIG5vcm1hbCBhZGRyZXNzX3NwYWNlIG1ldGhvZHMgKi8KKwlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJnVkZl9hb3BzOworCisJaWYgKCFVREZfSV9MRU5BTExPQyhpbm9kZSkpCisJeworCQlpZiAoVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1VTRV9TSE9SVF9BRCkpCisJCQlVREZfSV9BTExPQ1RZUEUoaW5vZGUpID0gSUNCVEFHX0ZMQUdfQURfU0hPUlQ7CisJCWVsc2UKKwkJCVVERl9JX0FMTE9DVFlQRShpbm9kZSkgPSBJQ0JUQUdfRkxBR19BRF9MT05HOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJcmV0dXJuOworCX0KKworCXBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgMCk7CisJaWYgKCFQYWdlTG9ja2VkKHBhZ2UpKQorCQlQQUdFX0JVRyhwYWdlKTsKKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKKwl7CisJCWthZGRyID0ga21hcChwYWdlKTsKKwkJbWVtc2V0KGthZGRyICsgVURGX0lfTEVOQUxMT0MoaW5vZGUpLCAweDAwLAorCQkJUEFHRV9DQUNIRV9TSVpFIC0gVURGX0lfTEVOQUxMT0MoaW5vZGUpKTsKKwkJbWVtY3B5KGthZGRyLCBVREZfSV9EQVRBKGlub2RlKSArIFVERl9JX0xFTkVBVFRSKGlub2RlKSwKKwkJCVVERl9JX0xFTkFMTE9DKGlub2RlKSk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCWt1bm1hcChwYWdlKTsKKwl9CisJbWVtc2V0KFVERl9JX0RBVEEoaW5vZGUpICsgVURGX0lfTEVORUFUVFIoaW5vZGUpLCAweDAwLAorCQlVREZfSV9MRU5BTExPQyhpbm9kZSkpOworCVVERl9JX0xFTkFMTE9DKGlub2RlKSA9IDA7CisJaWYgKFVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19VU0VfU0hPUlRfQUQpKQorCQlVREZfSV9BTExPQ1RZUEUoaW5vZGUpID0gSUNCVEFHX0ZMQUdfQURfU0hPUlQ7CisJZWxzZQorCQlVREZfSV9BTExPQ1RZUEUoaW5vZGUpID0gSUNCVEFHX0ZMQUdfQURfTE9ORzsKKworCWlub2RlLT5pX2RhdGEuYV9vcHMtPndyaXRlcGFnZShwYWdlLCAmdWRmX3diYyk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Cit9CisKK3N0cnVjdCBidWZmZXJfaGVhZCAqIHVkZl9leHBhbmRfZGlyX2FkaW5pY2Ioc3RydWN0IGlub2RlICppbm9kZSwgaW50ICpibG9jaywgaW50ICplcnIpCit7CisJaW50IG5ld2Jsb2NrOworCXN0cnVjdCBidWZmZXJfaGVhZCAqc2JoID0gTlVMTCwgKmRiaCA9IE5VTEw7CisJa2VybmVsX2xiX2FkZHIgYmxvYywgZWxvYzsKKwl1aW50MzJfdCBlbGVuLCBleHRvZmZzZXQ7CisJdWludDhfdCBhbGxvY3R5cGU7CisKKwlzdHJ1Y3QgdWRmX2ZpbGVpZGVudF9iaCBzZmliaCwgZGZpYmg7CisJbG9mZl90IGZfcG9zID0gdWRmX2V4dDBfb2Zmc2V0KGlub2RlKSA+PiAyOworCWludCBzaXplID0gKHVkZl9leHQwX29mZnNldChpbm9kZSkgKyBpbm9kZS0+aV9zaXplKSA+PiAyOworCXN0cnVjdCBmaWxlSWRlbnREZXNjIGNmaSwgKnNmaSwgKmRmaTsKKworCWlmIChVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfVVNFX1NIT1JUX0FEKSkKKwkJYWxsb2N0eXBlID0gSUNCVEFHX0ZMQUdfQURfU0hPUlQ7CisJZWxzZQorCQlhbGxvY3R5cGUgPSBJQ0JUQUdfRkxBR19BRF9MT05HOworCisJaWYgKCFpbm9kZS0+aV9zaXplKQorCXsKKwkJVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9IGFsbG9jdHlwZTsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGFsbG9jIGJsb2NrLCBhbmQgY29weSBkYXRhIHRvIGl0ICovCisJKmJsb2NrID0gdWRmX25ld19ibG9jayhpbm9kZS0+aV9zYiwgaW5vZGUsCisJCVVERl9JX0xPQ0FUSU9OKGlub2RlKS5wYXJ0aXRpb25SZWZlcmVuY2VOdW0sCisJCVVERl9JX0xPQ0FUSU9OKGlub2RlKS5sb2dpY2FsQmxvY2tOdW0sIGVycik7CisKKwlpZiAoISgqYmxvY2spKQorCQlyZXR1cm4gTlVMTDsKKwluZXdibG9jayA9IHVkZl9nZXRfcGJsb2NrKGlub2RlLT5pX3NiLCAqYmxvY2ssCisJCVVERl9JX0xPQ0FUSU9OKGlub2RlKS5wYXJ0aXRpb25SZWZlcmVuY2VOdW0sIDApOworCWlmICghbmV3YmxvY2spCisJCXJldHVybiBOVUxMOworCWRiaCA9IHVkZl90Z2V0YmxrKGlub2RlLT5pX3NiLCBuZXdibG9jayk7CisJaWYgKCFkYmgpCisJCXJldHVybiBOVUxMOworCWxvY2tfYnVmZmVyKGRiaCk7CisJbWVtc2V0KGRiaC0+Yl9kYXRhLCAweDAwLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCXNldF9idWZmZXJfdXB0b2RhdGUoZGJoKTsKKwl1bmxvY2tfYnVmZmVyKGRiaCk7CisJbWFya19idWZmZXJfZGlydHlfaW5vZGUoZGJoLCBpbm9kZSk7CisKKwlzZmliaC5zb2Zmc2V0ID0gc2ZpYmguZW9mZnNldCA9IChmX3BvcyAmICgoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgPj4gMikpIDw8IDI7CisJc2JoID0gc2ZpYmguc2JoID0gc2ZpYmguZWJoID0gTlVMTDsKKwlkZmliaC5zb2Zmc2V0ID0gZGZpYmguZW9mZnNldCA9IDA7CisJZGZpYmguc2JoID0gZGZpYmguZWJoID0gZGJoOworCXdoaWxlICggKGZfcG9zIDwgc2l6ZSkgKQorCXsKKwkJVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9IElDQlRBR19GTEFHX0FEX0lOX0lDQjsKKwkJc2ZpID0gdWRmX2ZpbGVpZGVudF9yZWFkKGlub2RlLCAmZl9wb3MsICZzZmliaCwgJmNmaSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCWlmICghc2ZpKQorCQl7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKGRiaCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlVREZfSV9BTExPQ1RZUEUoaW5vZGUpID0gYWxsb2N0eXBlOworCQlzZmktPmRlc2NUYWcudGFnTG9jYXRpb24gPSBjcHVfdG9fbGUzMigqYmxvY2spOworCQlkZmliaC5zb2Zmc2V0ID0gZGZpYmguZW9mZnNldDsKKwkJZGZpYmguZW9mZnNldCArPSAoc2ZpYmguZW9mZnNldCAtIHNmaWJoLnNvZmZzZXQpOworCQlkZmkgPSAoc3RydWN0IGZpbGVJZGVudERlc2MgKikoZGJoLT5iX2RhdGEgKyBkZmliaC5zb2Zmc2V0KTsKKwkJaWYgKHVkZl93cml0ZV9maShpbm9kZSwgc2ZpLCBkZmksICZkZmliaCwgc2ZpLT5pbXBVc2UsCisJCQlzZmktPmZpbGVJZGVudCArIGxlMTZfdG9fY3B1KHNmaS0+bGVuZ3RoT2ZJbXBVc2UpKSkKKwkJeworCQkJVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9IElDQlRBR19GTEFHX0FEX0lOX0lDQjsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoZGJoKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGRiaCwgaW5vZGUpOworCisJbWVtc2V0KFVERl9JX0RBVEEoaW5vZGUpICsgVURGX0lfTEVORUFUVFIoaW5vZGUpLCAwLCBVREZfSV9MRU5BTExPQyhpbm9kZSkpOworCVVERl9JX0xFTkFMTE9DKGlub2RlKSA9IDA7CisJYmxvYyA9IFVERl9JX0xPQ0FUSU9OKGlub2RlKTsKKwllbG9jLmxvZ2ljYWxCbG9ja051bSA9ICpibG9jazsKKwllbG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IFVERl9JX0xPQ0FUSU9OKGlub2RlKS5wYXJ0aXRpb25SZWZlcmVuY2VOdW07CisJZWxlbiA9IGlub2RlLT5pX3NpemU7CisJVURGX0lfTEVORVhURU5UUyhpbm9kZSkgPSBlbGVuOworCWV4dG9mZnNldCA9IHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChpbm9kZSk7CisJdWRmX2FkZF9hZXh0KGlub2RlLCAmYmxvYywgJmV4dG9mZnNldCwgZWxvYywgZWxlbiwgJnNiaCwgMCk7CisJLyogVW5pcXVlSUQgc3R1ZmYgKi8KKworCXVkZl9yZWxlYXNlX2RhdGEoc2JoKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlyZXR1cm4gZGJoOworfQorCitzdGF0aWMgaW50IHVkZl9nZXRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgYmxvY2ssIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQoreworCWludCBlcnIsIG5ldzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXVuc2lnbmVkIGxvbmcgcGh5czsKKworCWlmICghY3JlYXRlKQorCXsKKwkJcGh5cyA9IHVkZl9ibG9ja19tYXAoaW5vZGUsIGJsb2NrKTsKKwkJaWYgKHBoeXMpCisJCQltYXBfYmgoYmhfcmVzdWx0LCBpbm9kZS0+aV9zYiwgcGh5cyk7CisJCXJldHVybiAwOworCX0KKworCWVyciA9IC1FSU87CisJbmV3ID0gMDsKKwliaCA9IE5VTEw7CisKKwlsb2NrX2tlcm5lbCgpOworCisJaWYgKGJsb2NrIDwgMCkKKwkJZ290byBhYm9ydF9uZWdhdGl2ZTsKKworCWlmIChibG9jayA9PSBVREZfSV9ORVhUX0FMTE9DX0JMT0NLKGlub2RlKSArIDEpCisJeworCQlVREZfSV9ORVhUX0FMTE9DX0JMT0NLKGlub2RlKSArKzsKKwkJVURGX0lfTkVYVF9BTExPQ19HT0FMKGlub2RlKSArKzsKKwl9CisKKwllcnIgPSAwOworCisJYmggPSBpbm9kZV9nZXRibGsoaW5vZGUsIGJsb2NrLCAmZXJyLCAmcGh5cywgJm5ldyk7CisJaWYgKGJoKQorCQlCVUcoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGFib3J0OworCWlmICghcGh5cykKKwkJQlVHKCk7CisKKwlpZiAobmV3KQorCQlzZXRfYnVmZmVyX25ldyhiaF9yZXN1bHQpOworCW1hcF9iaChiaF9yZXN1bHQsIGlub2RlLT5pX3NiLCBwaHlzKTsKK2Fib3J0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworCithYm9ydF9uZWdhdGl2ZToKKwl1ZGZfd2FybmluZyhpbm9kZS0+aV9zYiwgInVkZl9nZXRfYmxvY2siLCAiYmxvY2sgPCAwIik7CisJZ290byBhYm9ydDsKK30KKworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqCit1ZGZfZ2V0YmxrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvbmcgYmxvY2ssIGludCBjcmVhdGUsIGludCAqZXJyKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCBkdW1teTsKKworCWR1bW15LmJfc3RhdGUgPSAwOworCWR1bW15LmJfYmxvY2tuciA9IC0xMDAwOworCSplcnIgPSB1ZGZfZ2V0X2Jsb2NrKGlub2RlLCBibG9jaywgJmR1bW15LCBjcmVhdGUpOworCWlmICghKmVyciAmJiBidWZmZXJfbWFwcGVkKCZkdW1teSkpCisJeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQliaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgZHVtbXkuYl9ibG9ja25yKTsKKwkJaWYgKGJ1ZmZlcl9uZXcoJmR1bW15KSkKKwkJeworCQkJbG9ja19idWZmZXIoYmgpOworCQkJbWVtc2V0KGJoLT5iX2RhdGEsIDB4MDAsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCXVubG9ja19idWZmZXIoYmgpOworCQkJbWFya19idWZmZXJfZGlydHlfaW5vZGUoYmgsIGlub2RlKTsKKwkJfQorCQlyZXR1cm4gYmg7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICogaW5vZGVfZ2V0YmxrKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBsb25nIGJsb2NrLAorCWludCAqZXJyLCBsb25nICpwaHlzLCBpbnQgKm5ldykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBiaCA9IE5VTEwsICpjYmggPSBOVUxMLCAqbmJoID0gTlVMTCwgKnJlc3VsdCA9IE5VTEw7CisJa2VybmVsX2xvbmdfYWQgbGFhcnJbRVhURU5UX01FUkdFX1NJWkVdOworCXVpbnQzMl90IHBleHRvZmZzZXQgPSAwLCBjZXh0b2Zmc2V0ID0gMCwgbmV4dG9mZnNldCA9IDA7CisJaW50IGNvdW50ID0gMCwgc3RhcnRudW0gPSAwLCBlbmRudW0gPSAwOworCXVpbnQzMl90IGVsZW4gPSAwOworCWtlcm5lbF9sYl9hZGRyIGVsb2MsIHBibG9jLCBjYmxvYywgbmJsb2M7CisJaW50IGMgPSAxOworCXVpbnQ2NF90IGxiY291bnQgPSAwLCBiX29mZiA9IDA7CisJdWludDMyX3QgbmV3YmxvY2tudW0sIG5ld2Jsb2NrLCBvZmZzZXQgPSAwOworCWludDhfdCBldHlwZTsKKwlpbnQgZ29hbCA9IDAsIHBnb2FsID0gVURGX0lfTE9DQVRJT04oaW5vZGUpLmxvZ2ljYWxCbG9ja051bTsKKwljaGFyIGxhc3RibG9jayA9IDA7CisKKwlwZXh0b2Zmc2V0ID0gY2V4dG9mZnNldCA9IG5leHRvZmZzZXQgPSB1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpOworCWJfb2ZmID0gKHVpbnQ2NF90KWJsb2NrIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCXBibG9jID0gY2Jsb2MgPSBuYmxvYyA9IFVERl9JX0xPQ0FUSU9OKGlub2RlKTsKKworCS8qIGZpbmQgdGhlIGV4dGVudCB3aGljaCBjb250YWlucyB0aGUgYmxvY2sgd2UgYXJlIGxvb2tpbmcgZm9yLgorICAgICAgIGFsdGVybmF0ZSBiZXR3ZWVuIGxhYXJyWzBdIGFuZCBsYWFyclsxXSBmb3IgbG9jYXRpb25zIG9mIHRoZQorICAgICAgIGN1cnJlbnQgZXh0ZW50LCBhbmQgdGhlIHByZXZpb3VzIGV4dGVudCAqLworCWRvCisJeworCQlpZiAocGJoICE9IGNiaCkKKwkJeworCQkJdWRmX3JlbGVhc2VfZGF0YShwYmgpOworCQkJYXRvbWljX2luYygmY2JoLT5iX2NvdW50KTsKKwkJCXBiaCA9IGNiaDsKKwkJfQorCQlpZiAoY2JoICE9IG5iaCkKKwkJeworCQkJdWRmX3JlbGVhc2VfZGF0YShjYmgpOworCQkJYXRvbWljX2luYygmbmJoLT5iX2NvdW50KTsKKwkJCWNiaCA9IG5iaDsKKwkJfQorCisJCWxiY291bnQgKz0gZWxlbjsKKworCQlwYmxvYyA9IGNibG9jOworCQljYmxvYyA9IG5ibG9jOworCisJCXBleHRvZmZzZXQgPSBjZXh0b2Zmc2V0OworCQljZXh0b2Zmc2V0ID0gbmV4dG9mZnNldDsKKworCQlpZiAoKGV0eXBlID0gdWRmX25leHRfYWV4dChpbm9kZSwgJm5ibG9jLCAmbmV4dG9mZnNldCwgJmVsb2MsICZlbGVuLCAmbmJoLCAxKSkgPT0gLTEpCisJCQlicmVhazsKKworCQljID0gIWM7CisKKwkJbGFhcnJbY10uZXh0TGVuZ3RoID0gKGV0eXBlIDw8IDMwKSB8IGVsZW47CisJCWxhYXJyW2NdLmV4dExvY2F0aW9uID0gZWxvYzsKKworCQlpZiAoZXR5cGUgIT0gKEVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRCA+PiAzMCkpCisJCQlwZ29hbCA9IGVsb2MubG9naWNhbEJsb2NrTnVtICsKKwkJCQkoKGVsZW4gKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PgorCQkJCWlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKworCQljb3VudCArKzsKKwl9IHdoaWxlIChsYmNvdW50ICsgZWxlbiA8PSBiX29mZik7CisKKwliX29mZiAtPSBsYmNvdW50OworCW9mZnNldCA9IGJfb2ZmID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCisJLyogaWYgdGhlIGV4dGVudCBpcyBhbGxvY2F0ZWQgYW5kIHJlY29yZGVkLCByZXR1cm4gdGhlIGJsb2NrCisgICAgICAgaWYgdGhlIGV4dGVudCBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgYmxvY2tzaXplLCByb3VuZCB1cCAqLworCisJaWYgKGV0eXBlID09IChFWFRfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkKKwl7CisJCWlmIChlbGVuICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKQorCQl7CisJCQllbGVuID0gRVhUX1JFQ09SREVEX0FMTE9DQVRFRCB8CisJCQkJKChlbGVuICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgJgorCQkJCX4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpOworCQkJZXR5cGUgPSB1ZGZfd3JpdGVfYWV4dChpbm9kZSwgbmJsb2MsICZjZXh0b2Zmc2V0LCBlbG9jLCBlbGVuLCBuYmgsIDEpOworCQl9CisJCXVkZl9yZWxlYXNlX2RhdGEocGJoKTsKKwkJdWRmX3JlbGVhc2VfZGF0YShjYmgpOworCQl1ZGZfcmVsZWFzZV9kYXRhKG5iaCk7CisJCW5ld2Jsb2NrID0gdWRmX2dldF9sYl9wYmxvY2soaW5vZGUtPmlfc2IsIGVsb2MsIG9mZnNldCk7CisJCSpwaHlzID0gbmV3YmxvY2s7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChldHlwZSA9PSAtMSkKKwl7CisJCWVuZG51bSA9IHN0YXJ0bnVtID0gKChjb3VudCA+IDEpID8gMSA6IGNvdW50KTsKKwkJaWYgKGxhYXJyW2NdLmV4dExlbmd0aCAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSkKKwkJeworCQkJbGFhcnJbY10uZXh0TGVuZ3RoID0KKwkJCQkobGFhcnJbY10uZXh0TGVuZ3RoICYgVURGX0VYVEVOVF9GTEFHX01BU0spIHwKKwkJCQkoKChsYWFycltjXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQkJCWlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpICYKKwkJCQl+KGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKTsKKwkJCVVERl9JX0xFTkVYVEVOVFMoaW5vZGUpID0KKwkJCQkoVURGX0lfTEVORVhURU5UUyhpbm9kZSkgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSAmCisJCQkJCX4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSk7CisJCX0KKwkJYyA9ICFjOworCQlsYWFycltjXS5leHRMZW5ndGggPSBFWFRfTk9UX1JFQ09SREVEX05PVF9BTExPQ0FURUQgfAorCQkJKChvZmZzZXQgKyAxKSA8PCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisJCW1lbXNldCgmbGFhcnJbY10uZXh0TG9jYXRpb24sIDB4MDAsIHNpemVvZihrZXJuZWxfbGJfYWRkcikpOworCQljb3VudCArKzsKKwkJZW5kbnVtICsrOworCQlsYXN0YmxvY2sgPSAxOworCX0KKwllbHNlCisJCWVuZG51bSA9IHN0YXJ0bnVtID0gKChjb3VudCA+IDIpID8gMiA6IGNvdW50KTsKKworCS8qIGlmIHRoZSBjdXJyZW50IGV4dGVudCBpcyBpbiBwb3NpdGlvbiAwLCBzd2FwIGl0IHdpdGggdGhlIHByZXZpb3VzICovCisJaWYgKCFjICYmIGNvdW50ICE9IDEpCisJeworCQlsYWFyclsyXSA9IGxhYXJyWzBdOworCQlsYWFyclswXSA9IGxhYXJyWzFdOworCQlsYWFyclsxXSA9IGxhYXJyWzJdOworCQljID0gMTsKKwl9CisKKwkvKiBpZiB0aGUgY3VycmVudCBibG9jayBpcyBsb2NhdGVkIGluIGEgZXh0ZW50LCByZWFkIHRoZSBuZXh0IGV4dGVudCAqLworCWlmIChldHlwZSAhPSAtMSkKKwl7CisJCWlmICgoZXR5cGUgPSB1ZGZfbmV4dF9hZXh0KGlub2RlLCAmbmJsb2MsICZuZXh0b2Zmc2V0LCAmZWxvYywgJmVsZW4sICZuYmgsIDApKSAhPSAtMSkKKwkJeworCQkJbGFhcnJbYysxXS5leHRMZW5ndGggPSAoZXR5cGUgPDwgMzApIHwgZWxlbjsKKwkJCWxhYXJyW2MrMV0uZXh0TG9jYXRpb24gPSBlbG9jOworCQkJY291bnQgKys7CisJCQlzdGFydG51bSArKzsKKwkJCWVuZG51bSArKzsKKwkJfQorCQllbHNlCisJCQlsYXN0YmxvY2sgPSAxOworCX0KKwl1ZGZfcmVsZWFzZV9kYXRhKGNiaCk7CisJdWRmX3JlbGVhc2VfZGF0YShuYmgpOworCisJLyogaWYgdGhlIGN1cnJlbnQgZXh0ZW50IGlzIG5vdCByZWNvcmRlZCBidXQgYWxsb2NhdGVkLCBnZXQgdGhlCisJCWJsb2NrIGluIHRoZSBleHRlbnQgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdGVkIGJsb2NrICovCisJaWYgKChsYWFycltjXS5leHRMZW5ndGggPj4gMzApID09IChFWFRfTk9UX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpCisJCW5ld2Jsb2NrbnVtID0gbGFhcnJbY10uZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtICsgb2Zmc2V0OworCWVsc2UgLyogb3RoZXJ3aXNlLCBhbGxvY2F0ZSBhIG5ldyBibG9jayAqLworCXsKKwkJaWYgKFVERl9JX05FWFRfQUxMT0NfQkxPQ0soaW5vZGUpID09IGJsb2NrKQorCQkJZ29hbCA9IFVERl9JX05FWFRfQUxMT0NfR09BTChpbm9kZSk7CisKKwkJaWYgKCFnb2FsKQorCQl7CisJCQlpZiAoIShnb2FsID0gcGdvYWwpKQorCQkJCWdvYWwgPSBVREZfSV9MT0NBVElPTihpbm9kZSkubG9naWNhbEJsb2NrTnVtICsgMTsKKwkJfQorCisJCWlmICghKG5ld2Jsb2NrbnVtID0gdWRmX25ld19ibG9jayhpbm9kZS0+aV9zYiwgaW5vZGUsCisJCQlVREZfSV9MT0NBVElPTihpbm9kZSkucGFydGl0aW9uUmVmZXJlbmNlTnVtLCBnb2FsLCBlcnIpKSkKKwkJeworCQkJdWRmX3JlbGVhc2VfZGF0YShwYmgpOworCQkJKmVyciA9IC1FTk9TUEM7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlVREZfSV9MRU5FWFRFTlRTKGlub2RlKSArPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJfQorCisJLyogaWYgdGhlIGV4dGVudCB0aGUgcmVxdXN0ZWQgYmxvY2sgaXMgbG9jYXRlZCBpbiBjb250YWlucyBtdWx0aXBsZSBibG9ja3MsCisgICAgICAgc3BsaXQgdGhlIGV4dGVudCBpbnRvIGF0IG1vc3QgdGhyZWUgZXh0ZW50cy4gYmxvY2tzIHByaW9yIHRvIHJlcXVlc3RlZAorICAgICAgIGJsb2NrLCByZXF1ZXN0ZWQgYmxvY2ssIGFuZCBibG9ja3MgYWZ0ZXIgcmVxdWVzdGVkIGJsb2NrICovCisJdWRmX3NwbGl0X2V4dGVudHMoaW5vZGUsICZjLCBvZmZzZXQsIG5ld2Jsb2NrbnVtLCBsYWFyciwgJmVuZG51bSk7CisKKyNpZmRlZiBVREZfUFJFQUxMT0NBVEUKKwkvKiBwcmVhbGxvY2F0ZSBibG9ja3MgKi8KKwl1ZGZfcHJlYWxsb2NfZXh0ZW50cyhpbm9kZSwgYywgbGFzdGJsb2NrLCBsYWFyciwgJmVuZG51bSk7CisjZW5kaWYKKworCS8qIG1lcmdlIGFueSBjb250aW51b3VzIGJsb2NrcyBpbiBsYWFyciAqLworCXVkZl9tZXJnZV9leHRlbnRzKGlub2RlLCBsYWFyciwgJmVuZG51bSk7CisKKwkvKiB3cml0ZSBiYWNrIHRoZSBuZXcgZXh0ZW50cywgaW5zZXJ0aW5nIG5ldyBleHRlbnRzIGlmIHRoZSBuZXcgbnVtYmVyCisgICAgICAgb2YgZXh0ZW50cyBpcyBncmVhdGVyIHRoYW4gdGhlIG9sZCBudW1iZXIsIGFuZCBkZWxldGluZyBleHRlbnRzIGlmCisgICAgICAgdGhlIG5ldyBudW1iZXIgb2YgZXh0ZW50cyBpcyBsZXNzIHRoYW4gdGhlIG9sZCBudW1iZXIgKi8KKwl1ZGZfdXBkYXRlX2V4dGVudHMoaW5vZGUsIGxhYXJyLCBzdGFydG51bSwgZW5kbnVtLCBwYmxvYywgcGV4dG9mZnNldCwgJnBiaCk7CisKKwl1ZGZfcmVsZWFzZV9kYXRhKHBiaCk7CisKKwlpZiAoIShuZXdibG9jayA9IHVkZl9nZXRfcGJsb2NrKGlub2RlLT5pX3NiLCBuZXdibG9ja251bSwKKwkJVURGX0lfTE9DQVRJT04oaW5vZGUpLnBhcnRpdGlvblJlZmVyZW5jZU51bSwgMCkpKQorCXsKKwkJcmV0dXJuIE5VTEw7CisJfQorCSpwaHlzID0gbmV3YmxvY2s7CisJKmVyciA9IDA7CisJKm5ldyA9IDE7CisJVURGX0lfTkVYVF9BTExPQ19CTE9DSyhpbm9kZSkgPSBibG9jazsKKwlVREZfSV9ORVhUX0FMTE9DX0dPQUwoaW5vZGUpID0gbmV3YmxvY2tudW07CisJaW5vZGUtPmlfY3RpbWUgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOworCisJaWYgKElTX1NZTkMoaW5vZGUpKQorCQl1ZGZfc3luY19pbm9kZShpbm9kZSk7CisJZWxzZQorCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCB1ZGZfc3BsaXRfZXh0ZW50cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmMsIGludCBvZmZzZXQsIGludCBuZXdibG9ja251bSwKKwlrZXJuZWxfbG9uZ19hZCBsYWFycltFWFRFTlRfTUVSR0VfU0laRV0sIGludCAqZW5kbnVtKQoreworCWlmICgobGFhcnJbKmNdLmV4dExlbmd0aCA+PiAzMCkgPT0gKEVYVF9OT1RfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSB8fAorCQkobGFhcnJbKmNdLmV4dExlbmd0aCA+PiAzMCkgPT0gKEVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRCA+PiAzMCkpCisJeworCQlpbnQgY3VyciA9ICpjOworCQlpbnQgYmxlbiA9ICgobGFhcnJbY3Vycl0uZXh0TGVuZ3RoICYgVURGX0VYVEVOVF9MRU5HVEhfTUFTSykgKworCQkJaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCWludDhfdCBldHlwZSA9IChsYWFycltjdXJyXS5leHRMZW5ndGggPj4gMzApOworCisJCWlmIChibGVuID09IDEpCisJCQk7CisJCWVsc2UgaWYgKCFvZmZzZXQgfHwgYmxlbiA9PSBvZmZzZXQgKyAxKQorCQl7CisJCQlsYWFycltjdXJyKzJdID0gbGFhcnJbY3VycisxXTsKKwkJCWxhYXJyW2N1cnIrMV0gPSBsYWFycltjdXJyXTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWxhYXJyW2N1cnIrM10gPSBsYWFycltjdXJyKzFdOworCQkJbGFhcnJbY3VycisyXSA9IGxhYXJyW2N1cnIrMV0gPSBsYWFycltjdXJyXTsKKwkJfQorCisJCWlmIChvZmZzZXQpCisJCXsKKwkJCWlmIChldHlwZSA9PSAoRVhUX05PVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKQorCQkJeworCQkJCXVkZl9mcmVlX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgaW5vZGUsIGxhYXJyW2N1cnJdLmV4dExvY2F0aW9uLCAwLCBvZmZzZXQpOworCQkJCWxhYXJyW2N1cnJdLmV4dExlbmd0aCA9IEVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRCB8CisJCQkJCShvZmZzZXQgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQkJCWxhYXJyW2N1cnJdLmV4dExvY2F0aW9uLmxvZ2ljYWxCbG9ja051bSA9IDA7CisJCQkJbGFhcnJbY3Vycl0uZXh0TG9jYXRpb24ucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gMDsKKwkJCX0KKwkJCWVsc2UKKwkJCQlsYWFycltjdXJyXS5leHRMZW5ndGggPSAoZXR5cGUgPDwgMzApIHwKKwkJCQkJKG9mZnNldCA8PCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisJCQljdXJyICsrOworCQkJKCpjKSArKzsKKwkJCSgqZW5kbnVtKSArKzsKKwkJfQorCQkKKwkJbGFhcnJbY3Vycl0uZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtID0gbmV3YmxvY2tudW07CisJCWlmIChldHlwZSA9PSAoRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEID4+IDMwKSkKKwkJCWxhYXJyW2N1cnJdLmV4dExvY2F0aW9uLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9CisJCQkJVURGX0lfTE9DQVRJT04oaW5vZGUpLnBhcnRpdGlvblJlZmVyZW5jZU51bTsKKwkJbGFhcnJbY3Vycl0uZXh0TGVuZ3RoID0gRVhUX1JFQ09SREVEX0FMTE9DQVRFRCB8CisJCQlpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJCWN1cnIgKys7CisKKwkJaWYgKGJsZW4gIT0gb2Zmc2V0ICsgMSkKKwkJeworCQkJaWYgKGV0eXBlID09IChFWFRfTk9UX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpCisJCQkJbGFhcnJbY3Vycl0uZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtICs9IChvZmZzZXQgKyAxKTsKKwkJCWxhYXJyW2N1cnJdLmV4dExlbmd0aCA9IChldHlwZSA8PCAzMCkgfAorCQkJCSgoYmxlbiAtIChvZmZzZXQgKyAxKSkgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQkJY3VyciArKzsKKwkJCSgqZW5kbnVtKSArKzsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgdWRmX3ByZWFsbG9jX2V4dGVudHMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGMsIGludCBsYXN0YmxvY2ssCisJIGtlcm5lbF9sb25nX2FkIGxhYXJyW0VYVEVOVF9NRVJHRV9TSVpFXSwgaW50ICplbmRudW0pCit7CisJaW50IHN0YXJ0LCBsZW5ndGggPSAwLCBjdXJybGVuZ3RoID0gMCwgaTsKKworCWlmICgqZW5kbnVtID49IChjKzEpKQorCXsKKwkJaWYgKCFsYXN0YmxvY2spCisJCQlyZXR1cm47CisJCWVsc2UKKwkJCXN0YXJ0ID0gYzsKKwl9CisJZWxzZQorCXsKKwkJaWYgKChsYWFycltjKzFdLmV4dExlbmd0aCA+PiAzMCkgPT0gKEVYVF9OT1RfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkKKwkJeworCQkJc3RhcnQgPSBjKzE7CisJCQlsZW5ndGggPSBjdXJybGVuZ3RoID0gKCgobGFhcnJbYysxXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQkJaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQl9CisJCWVsc2UKKwkJCXN0YXJ0ID0gYzsKKwl9CisKKwlmb3IgKGk9c3RhcnQrMTsgaTw9KmVuZG51bTsgaSsrKQorCXsKKwkJaWYgKGkgPT0gKmVuZG51bSkKKwkJeworCQkJaWYgKGxhc3RibG9jaykKKwkJCQlsZW5ndGggKz0gVURGX0RFRkFVTFRfUFJFQUxMT0NfQkxPQ0tTOworCQl9CisJCWVsc2UgaWYgKChsYWFycltpXS5leHRMZW5ndGggPj4gMzApID09IChFWFRfTk9UX1JFQ09SREVEX05PVF9BTExPQ0FURUQgPj4gMzApKQorCQkJbGVuZ3RoICs9ICgoKGxhYXJyW2ldLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKKwkJCQlpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKworCWlmIChsZW5ndGgpCisJeworCQlpbnQgbmV4dCA9IGxhYXJyW3N0YXJ0XS5leHRMb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW0gKworCQkJKCgobGFhcnJbc3RhcnRdLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKKwkJCWlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJaW50IG51bWFsbG9jID0gdWRmX3ByZWFsbG9jX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgaW5vZGUsCisJCQlsYWFycltzdGFydF0uZXh0TG9jYXRpb24ucGFydGl0aW9uUmVmZXJlbmNlTnVtLAorCQkJbmV4dCwgKFVERl9ERUZBVUxUX1BSRUFMTE9DX0JMT0NLUyA+IGxlbmd0aCA/IGxlbmd0aCA6CisJCQkJVURGX0RFRkFVTFRfUFJFQUxMT0NfQkxPQ0tTKSAtIGN1cnJsZW5ndGgpOworCisJCWlmIChudW1hbGxvYykKKwkJeworCQkJaWYgKHN0YXJ0ID09IChjKzEpKQorCQkJCWxhYXJyW3N0YXJ0XS5leHRMZW5ndGggKz0KKwkJCQkJKG51bWFsbG9jIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJCWVsc2UKKwkJCXsKKwkJCQltZW1tb3ZlKCZsYWFycltjKzJdLCAmbGFhcnJbYysxXSwKKwkJCQkJc2l6ZW9mKGxvbmdfYWQpICogKCplbmRudW0gLSAoYysxKSkpOworCQkJCSgqZW5kbnVtKSArKzsKKwkJCQlsYWFycltjKzFdLmV4dExvY2F0aW9uLmxvZ2ljYWxCbG9ja051bSA9IG5leHQ7CisJCQkJbGFhcnJbYysxXS5leHRMb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPQorCQkJCQlsYWFycltjXS5leHRMb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW07CisJCQkJbGFhcnJbYysxXS5leHRMZW5ndGggPSBFWFRfTk9UX1JFQ09SREVEX0FMTE9DQVRFRCB8CisJCQkJCShudW1hbGxvYyA8PCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisJCQkJc3RhcnQgPSBjKzE7CisJCQl9CisKKwkJCWZvciAoaT1zdGFydCsxOyBudW1hbGxvYyAmJiBpPCplbmRudW07IGkrKykKKwkJCXsKKwkJCQlpbnQgZWxlbiA9ICgobGFhcnJbaV0uZXh0TGVuZ3RoICYgVURGX0VYVEVOVF9MRU5HVEhfTUFTSykgKworCQkJCQlpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKworCQkJCWlmIChlbGVuID4gbnVtYWxsb2MpCisJCQkJeworCQkJCQlsYWFycltpXS5leHRMZW5ndGggLT0KKwkJCQkJCShudW1hbGxvYyA8PCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisJCQkJCW51bWFsbG9jID0gMDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbnVtYWxsb2MgLT0gZWxlbjsKKwkJCQkJaWYgKCplbmRudW0gPiAoaSsxKSkKKwkJCQkJCW1lbW1vdmUoJmxhYXJyW2ldLCAmbGFhcnJbaSsxXSwgCisJCQkJCQkJc2l6ZW9mKGxvbmdfYWQpICogKCplbmRudW0gLSAoaSsxKSkpOworCQkJCQlpIC0tOworCQkJCQkoKmVuZG51bSkgLS07CisJCQkJfQorCQkJfQorCQkJVURGX0lfTEVORVhURU5UUyhpbm9kZSkgKz0gbnVtYWxsb2MgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVkZl9tZXJnZV9leHRlbnRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJIGtlcm5lbF9sb25nX2FkIGxhYXJyW0VYVEVOVF9NRVJHRV9TSVpFXSwgaW50ICplbmRudW0pCit7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaTwoKmVuZG51bS0xKTsgaSsrKQorCXsKKwkJaWYgKChsYWFycltpXS5leHRMZW5ndGggPj4gMzApID09IChsYWFycltpKzFdLmV4dExlbmd0aCA+PiAzMCkpCisJCXsKKwkJCWlmICgoKGxhYXJyW2ldLmV4dExlbmd0aCA+PiAzMCkgPT0gKEVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRCA+PiAzMCkpIHx8CisJCQkJKChsYWFycltpKzFdLmV4dExvY2F0aW9uLmxvZ2ljYWxCbG9ja051bSAtIGxhYXJyW2ldLmV4dExvY2F0aW9uLmxvZ2ljYWxCbG9ja051bSkgPT0KKwkJCQkoKChsYWFycltpXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQkJaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpKSkKKwkJCXsKKwkJCQlpZiAoKChsYWFycltpXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQkJCShsYWFycltpKzFdLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKKwkJCQkJaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgJiB+VURGX0VYVEVOVF9MRU5HVEhfTUFTSykKKwkJCQl7CisJCQkJCWxhYXJyW2krMV0uZXh0TGVuZ3RoID0gKGxhYXJyW2krMV0uZXh0TGVuZ3RoIC0KKwkJCQkJCShsYWFycltpXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQkJCQlVREZfRVhURU5UX0xFTkdUSF9NQVNLKSAmIH4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplLTEpOworCQkJCQlsYWFycltpXS5leHRMZW5ndGggPSAobGFhcnJbaV0uZXh0TGVuZ3RoICYgVURGX0VYVEVOVF9GTEFHX01BU0spICsKKwkJCQkJCShVREZfRVhURU5UX0xFTkdUSF9NQVNLICsgMSkgLSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJCQkJCWxhYXJyW2krMV0uZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtID0KKwkJCQkJCWxhYXJyW2ldLmV4dExvY2F0aW9uLmxvZ2ljYWxCbG9ja051bSArCisJCQkJCQkoKGxhYXJyW2ldLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spID4+CisJCQkJCQkJaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlsYWFycltpXS5leHRMZW5ndGggPSBsYWFycltpKzFdLmV4dExlbmd0aCArCisJCQkJCQkoKChsYWFycltpXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQkJCQlpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSAmIH4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplLTEpKTsKKwkJCQkJaWYgKCplbmRudW0gPiAoaSsyKSkKKwkJCQkJCW1lbW1vdmUoJmxhYXJyW2krMV0sICZsYWFycltpKzJdLAorCQkJCQkJCXNpemVvZihsb25nX2FkKSAqICgqZW5kbnVtIC0gKGkrMikpKTsKKwkJCQkJaSAtLTsKKwkJCQkJKCplbmRudW0pIC0tOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIGlmICgoKGxhYXJyW2ldLmV4dExlbmd0aCA+PiAzMCkgPT0gKEVYVF9OT1RfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkgJiYKKwkJCSgobGFhcnJbaSsxXS5leHRMZW5ndGggPj4gMzApID09IChFWFRfTk9UX1JFQ09SREVEX05PVF9BTExPQ0FURUQgPj4gMzApKSkKKwkJeworCQkJdWRmX2ZyZWVfYmxvY2tzKGlub2RlLT5pX3NiLCBpbm9kZSwgbGFhcnJbaV0uZXh0TG9jYXRpb24sIDAsCisJCQkJKChsYWFycltpXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQkJaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQkJbGFhcnJbaV0uZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtID0gMDsKKwkJCWxhYXJyW2ldLmV4dExvY2F0aW9uLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IDA7CisKKwkJCWlmICgoKGxhYXJyW2ldLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKKwkJCQkobGFhcnJbaSsxXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQkJaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgJiB+VURGX0VYVEVOVF9MRU5HVEhfTUFTSykKKwkJCXsKKwkJCQlsYWFycltpKzFdLmV4dExlbmd0aCA9IChsYWFycltpKzFdLmV4dExlbmd0aCAtCisJCQkJCShsYWFycltpXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQkJCVVERl9FWFRFTlRfTEVOR1RIX01BU0spICYgfihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUtMSk7CisJCQkJbGFhcnJbaV0uZXh0TGVuZ3RoID0gKGxhYXJyW2ldLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfRkxBR19NQVNLKSArCisJCQkJCShVREZfRVhURU5UX0xFTkdUSF9NQVNLICsgMSkgLSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbGFhcnJbaV0uZXh0TGVuZ3RoID0gbGFhcnJbaSsxXS5leHRMZW5ndGggKworCQkJCQkoKChsYWFycltpXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQkJCWlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpICYgfihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUtMSkpOworCQkJCWlmICgqZW5kbnVtID4gKGkrMikpCisJCQkJCW1lbW1vdmUoJmxhYXJyW2krMV0sICZsYWFycltpKzJdLAorCQkJCQkJc2l6ZW9mKGxvbmdfYWQpICogKCplbmRudW0gLSAoaSsyKSkpOworCQkJCWkgLS07CisJCQkJKCplbmRudW0pIC0tOworCQkJfQorCQl9CisJCWVsc2UgaWYgKChsYWFycltpXS5leHRMZW5ndGggPj4gMzApID09IChFWFRfTk9UX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpCisJCXsKKwkJCXVkZl9mcmVlX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgaW5vZGUsIGxhYXJyW2ldLmV4dExvY2F0aW9uLCAwLAorCQkJCSgobGFhcnJbaV0uZXh0TGVuZ3RoICYgVURGX0VYVEVOVF9MRU5HVEhfTUFTSykgKworCQkJICAgICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJCWxhYXJyW2ldLmV4dExvY2F0aW9uLmxvZ2ljYWxCbG9ja051bSA9IDA7CisJCQlsYWFycltpXS5leHRMb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSAwOworCQkJbGFhcnJbaV0uZXh0TGVuZ3RoID0gKGxhYXJyW2ldLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spIHwKKwkJCQlFWFRfTk9UX1JFQ09SREVEX05PVF9BTExPQ0FURUQ7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVkZl91cGRhdGVfZXh0ZW50cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCWtlcm5lbF9sb25nX2FkIGxhYXJyW0VYVEVOVF9NRVJHRV9TSVpFXSwgaW50IHN0YXJ0bnVtLCBpbnQgZW5kbnVtLAorCWtlcm5lbF9sYl9hZGRyIHBibG9jLCB1aW50MzJfdCBwZXh0b2Zmc2V0LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipwYmgpCit7CisJaW50IHN0YXJ0ID0gMCwgaTsKKwlrZXJuZWxfbGJfYWRkciB0bXBsb2M7CisJdWludDMyX3QgdG1wbGVuOworCisJaWYgKHN0YXJ0bnVtID4gZW5kbnVtKQorCXsKKwkJZm9yIChpPTA7IGk8KHN0YXJ0bnVtLWVuZG51bSk7IGkrKykKKwkJeworCQkJdWRmX2RlbGV0ZV9hZXh0KGlub2RlLCBwYmxvYywgcGV4dG9mZnNldCwgbGFhcnJbaV0uZXh0TG9jYXRpb24sCisJCQkJbGFhcnJbaV0uZXh0TGVuZ3RoLCAqcGJoKTsKKwkJfQorCX0KKwllbHNlIGlmIChzdGFydG51bSA8IGVuZG51bSkKKwl7CisJCWZvciAoaT0wOyBpPChlbmRudW0tc3RhcnRudW0pOyBpKyspCisJCXsKKwkJCXVkZl9pbnNlcnRfYWV4dChpbm9kZSwgcGJsb2MsIHBleHRvZmZzZXQsIGxhYXJyW2ldLmV4dExvY2F0aW9uLAorCQkJCWxhYXJyW2ldLmV4dExlbmd0aCwgKnBiaCk7CisJCQl1ZGZfbmV4dF9hZXh0KGlub2RlLCAmcGJsb2MsICZwZXh0b2Zmc2V0LCAmbGFhcnJbaV0uZXh0TG9jYXRpb24sCisJCQkJJmxhYXJyW2ldLmV4dExlbmd0aCwgcGJoLCAxKTsKKwkJCXN0YXJ0ICsrOworCQl9CisJfQorCisJZm9yIChpPXN0YXJ0OyBpPGVuZG51bTsgaSsrKQorCXsKKwkJdWRmX25leHRfYWV4dChpbm9kZSwgJnBibG9jLCAmcGV4dG9mZnNldCwgJnRtcGxvYywgJnRtcGxlbiwgcGJoLCAwKTsKKwkJdWRmX3dyaXRlX2FleHQoaW5vZGUsIHBibG9jLCAmcGV4dG9mZnNldCwgbGFhcnJbaV0uZXh0TG9jYXRpb24sCisJCQlsYWFycltpXS5leHRMZW5ndGgsICpwYmgsIDEpOworCX0KK30KKworc3RydWN0IGJ1ZmZlcl9oZWFkICogdWRmX2JyZWFkKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgYmxvY2ssCisJaW50IGNyZWF0ZSwgaW50ICogZXJyKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoID0gTlVMTDsKKworCWJoID0gdWRmX2dldGJsayhpbm9kZSwgYmxvY2ssIGNyZWF0ZSwgZXJyKTsKKwlpZiAoIWJoKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKQorCQlyZXR1cm4gYmg7CisJbGxfcndfYmxvY2soUkVBRCwgMSwgJmJoKTsKKwl3YWl0X29uX2J1ZmZlcihiaCk7CisJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCXJldHVybiBiaDsKKwlicmVsc2UoYmgpOworCSplcnIgPSAtRUlPOworCXJldHVybiBOVUxMOworfQorCit2b2lkIHVkZl90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlpbnQgb2Zmc2V0OworCWludCBlcnI7CisKKwlpZiAoIShTX0lTUkVHKGlub2RlLT5pX21vZGUpIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwKKwkJCVNfSVNMTksoaW5vZGUtPmlfbW9kZSkpKQorCQlyZXR1cm47CisJaWYgKElTX0FQUEVORChpbm9kZSkgfHwgSVNfSU1NVVRBQkxFKGlub2RlKSkKKwkJcmV0dXJuOworCisJbG9ja19rZXJuZWwoKTsKKwlpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCisJeworCQlpZiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDwgKHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChpbm9kZSkgKworCQkJaW5vZGUtPmlfc2l6ZSkpCisJCXsKKwkJCXVkZl9leHBhbmRfZmlsZV9hZGluaWNiKGlub2RlLCBpbm9kZS0+aV9zaXplLCAmZXJyKTsKKwkJCWlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKKwkJCXsKKwkJCQlpbm9kZS0+aV9zaXplID0gVURGX0lfTEVOQUxMT0MoaW5vZGUpOworCQkJCXVubG9ja19rZXJuZWwoKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQllbHNlCisJCQkJdWRmX3RydW5jYXRlX2V4dGVudHMoaW5vZGUpOworCQl9CisJCWVsc2UKKwkJeworCQkJb2Zmc2V0ID0gaW5vZGUtPmlfc2l6ZSAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKTsKKwkJCW1lbXNldChVREZfSV9EQVRBKGlub2RlKSArIFVERl9JX0xFTkVBVFRSKGlub2RlKSArIG9mZnNldCwgMHgwMCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IC0gdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKSk7CisJCQlVREZfSV9MRU5BTExPQyhpbm9kZSkgPSBpbm9kZS0+aV9zaXplOworCQl9CisJfQorCWVsc2UKKwl7CisJCWJsb2NrX3RydW5jYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5vZGUtPmlfc2l6ZSwgdWRmX2dldF9ibG9jayk7CisJCXVkZl90cnVuY2F0ZV9leHRlbnRzKGlub2RlKTsKKwl9CQorCisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CisJaWYgKElTX1NZTkMoaW5vZGUpKQorCQl1ZGZfc3luY19pbm9kZSAoaW5vZGUpOworCWVsc2UKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJdW5sb2NrX2tlcm5lbCgpOworfQorCitzdGF0aWMgdm9pZAorX191ZGZfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCXN0cnVjdCBmaWxlRW50cnkgKmZlOworCXVpbnQxNl90IGlkZW50OworCisJLyoKKwkgKiBTZXQgZGVmYXVsdHMsIGJ1dCB0aGUgaW5vZGUgaXMgc3RpbGwgaW5jb21wbGV0ZSEKKwkgKiBOb3RlOiBnZXRfbmV3X2lub2RlKCkgc2V0cyB0aGUgZm9sbG93aW5nIG9uIGEgbmV3IGlub2RlOgorCSAqICAgICAgaV9zYiA9IHNiCisJICogICAgICBpX25vID0gaW5vCisJICogICAgICBpX2ZsYWdzID0gc2ItPnNfZmxhZ3MKKwkgKiAgICAgIGlfc3RhdGUgPSAwCisJICogY2xlYW5faW5vZGUoKTogemVybyBmaWxscyBhbmQgc2V0cworCSAqICAgICAgaV9jb3VudCA9IDEKKwkgKiAgICAgIGlfbmxpbmsgPSAxCisJICogICAgICBpX29wID0gTlVMTDsKKwkgKi8KKwlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOworCisJYmggPSB1ZGZfcmVhZF9wdGFnZ2VkKGlub2RlLT5pX3NiLCBVREZfSV9MT0NBVElPTihpbm9kZSksIDAsICZpZGVudCk7CisKKwlpZiAoIWJoKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHVkZl9yZWFkX2lub2RlKGlubyAlbGQpIGZhaWxlZCAhYmhcbiIsCisJCQlpbm9kZS0+aV9pbm8pOworCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaWRlbnQgIT0gVEFHX0lERU5UX0ZFICYmIGlkZW50ICE9IFRBR19JREVOVF9FRkUgJiYKKwkJaWRlbnQgIT0gVEFHX0lERU5UX1VTRSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAidWRmOiB1ZGZfcmVhZF9pbm9kZShpbm8gJWxkKSBmYWlsZWQgaWRlbnQ9JWRcbiIsCisJCQlpbm9kZS0+aV9pbm8sIGlkZW50KTsKKwkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJcmV0dXJuOworCX0KKworCWZlID0gKHN0cnVjdCBmaWxlRW50cnkgKiliaC0+Yl9kYXRhOworCisJaWYgKGxlMTZfdG9fY3B1KGZlLT5pY2JUYWcuc3RyYXRlZ3lUeXBlKSA9PSA0MDk2KQorCXsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICppYmggPSBOVUxMLCAqbmJoID0gTlVMTDsKKwkJc3RydWN0IGluZGlyZWN0RW50cnkgKmllOworCisJCWliaCA9IHVkZl9yZWFkX3B0YWdnZWQoaW5vZGUtPmlfc2IsIFVERl9JX0xPQ0FUSU9OKGlub2RlKSwgMSwgJmlkZW50KTsKKwkJaWYgKGlkZW50ID09IFRBR19JREVOVF9JRSkKKwkJeworCQkJaWYgKGliaCkKKwkJCXsKKwkJCQlrZXJuZWxfbGJfYWRkciBsb2M7CisJCQkJaWUgPSAoc3RydWN0IGluZGlyZWN0RW50cnkgKilpYmgtPmJfZGF0YTsKKwkKKwkJCQlsb2MgPSBsZWxiX3RvX2NwdShpZS0+aW5kaXJlY3RJQ0IuZXh0TG9jYXRpb24pOworCQorCQkJCWlmIChpZS0+aW5kaXJlY3RJQ0IuZXh0TGVuZ3RoICYmIAorCQkJCQkobmJoID0gdWRmX3JlYWRfcHRhZ2dlZChpbm9kZS0+aV9zYiwgbG9jLCAwLCAmaWRlbnQpKSkKKwkJCQl7CisJCQkJCWlmIChpZGVudCA9PSBUQUdfSURFTlRfRkUgfHwKKwkJCQkJCWlkZW50ID09IFRBR19JREVOVF9FRkUpCisJCQkJCXsKKwkJCQkJCW1lbWNweSgmVURGX0lfTE9DQVRJT04oaW5vZGUpLCAmbG9jLCBzaXplb2Yoa2VybmVsX2xiX2FkZHIpKTsKKwkJCQkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQkJCQkJdWRmX3JlbGVhc2VfZGF0YShpYmgpOworCQkJCQkJdWRmX3JlbGVhc2VfZGF0YShuYmgpOworCQkJCQkJX191ZGZfcmVhZF9pbm9kZShpbm9kZSk7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQl1ZGZfcmVsZWFzZV9kYXRhKG5iaCk7CisJCQkJCQl1ZGZfcmVsZWFzZV9kYXRhKGliaCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCQl1ZGZfcmVsZWFzZV9kYXRhKGliaCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQkJdWRmX3JlbGVhc2VfZGF0YShpYmgpOworCX0KKwllbHNlIGlmIChsZTE2X3RvX2NwdShmZS0+aWNiVGFnLnN0cmF0ZWd5VHlwZSkgIT0gNCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAidWRmOiB1bnN1cHBvcnRlZCBzdHJhdGVneSB0eXBlOiAlZFxuIiwKKwkJCWxlMTZfdG9fY3B1KGZlLT5pY2JUYWcuc3RyYXRlZ3lUeXBlKSk7CisJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCXJldHVybjsKKwl9CisJdWRmX2ZpbGxfaW5vZGUoaW5vZGUsIGJoKTsKKwl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKK30KKworc3RhdGljIHZvaWQgdWRmX2ZpbGxfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3QgZmlsZUVudHJ5ICpmZTsKKwlzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkgKmVmZTsKKwl0aW1lX3QgY29udnRpbWU7CisJbG9uZyBjb252dGltZV91c2VjOworCWludCBvZmZzZXQ7CisKKwlmZSA9IChzdHJ1Y3QgZmlsZUVudHJ5ICopYmgtPmJfZGF0YTsKKwllZmUgPSAoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5ICopYmgtPmJfZGF0YTsKKworCWlmIChsZTE2X3RvX2NwdShmZS0+aWNiVGFnLnN0cmF0ZWd5VHlwZSkgPT0gNCkKKwkJVURGX0lfU1RSQVQ0MDk2KGlub2RlKSA9IDA7CisJZWxzZSAvKiBpZiAobGUxNl90b19jcHUoZmUtPmljYlRhZy5zdHJhdGVneVR5cGUpID09IDQwOTYpICovCisJCVVERl9JX1NUUkFUNDA5Nihpbm9kZSkgPSAxOworCisJVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9IGxlMTZfdG9fY3B1KGZlLT5pY2JUYWcuZmxhZ3MpICYgSUNCVEFHX0ZMQUdfQURfTUFTSzsKKwlVREZfSV9VTklRVUUoaW5vZGUpID0gMDsKKwlVREZfSV9MRU5FQVRUUihpbm9kZSkgPSAwOworCVVERl9JX0xFTkVYVEVOVFMoaW5vZGUpID0gMDsKKwlVREZfSV9MRU5BTExPQyhpbm9kZSkgPSAwOworCVVERl9JX05FWFRfQUxMT0NfQkxPQ0soaW5vZGUpID0gMDsKKwlVREZfSV9ORVhUX0FMTE9DX0dPQUwoaW5vZGUpID0gMDsKKwlpZiAobGUxNl90b19jcHUoZmUtPmRlc2NUYWcudGFnSWRlbnQpID09IFRBR19JREVOVF9FRkUpCisJeworCQlVREZfSV9FRkUoaW5vZGUpID0gMTsKKwkJVURGX0lfVVNFKGlub2RlKSA9IDA7CisJCVVERl9JX0RBVEEoaW5vZGUpID0ga21hbGxvYyhpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJCW1lbWNweShVREZfSV9EQVRBKGlub2RlKSwgYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSk7CisJfQorCWVsc2UgaWYgKGxlMTZfdG9fY3B1KGZlLT5kZXNjVGFnLnRhZ0lkZW50KSA9PSBUQUdfSURFTlRfRkUpCisJeworCQlVREZfSV9FRkUoaW5vZGUpID0gMDsKKwkJVURGX0lfVVNFKGlub2RlKSA9IDA7CisJCVVERl9JX0RBVEEoaW5vZGUpID0ga21hbGxvYyhpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSksIEdGUF9LRVJORUwpOworCQltZW1jcHkoVURGX0lfREFUQShpbm9kZSksIGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSksIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSk7CisJfQorCWVsc2UgaWYgKGxlMTZfdG9fY3B1KGZlLT5kZXNjVGFnLnRhZ0lkZW50KSA9PSBUQUdfSURFTlRfVVNFKQorCXsKKwkJVURGX0lfRUZFKGlub2RlKSA9IDA7CisJCVVERl9JX1VTRShpbm9kZSkgPSAxOworCQlVREZfSV9MRU5BTExPQyhpbm9kZSkgPQorCQkJbGUzMl90b19jcHUoCisJCQkJKChzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkgKiliaC0+Yl9kYXRhKS0+bGVuZ3RoQWxsb2NEZXNjcyk7CisJCVVERl9JX0RBVEEoaW5vZGUpID0ga21hbGxvYyhpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJCW1lbWNweShVREZfSV9EQVRBKGlub2RlKSwgYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KSk7CisJCXJldHVybjsKKwl9CisKKwlpbm9kZS0+aV91aWQgPSBsZTMyX3RvX2NwdShmZS0+dWlkKTsKKwlpZiAoIGlub2RlLT5pX3VpZCA9PSAtMSApIGlub2RlLT5pX3VpZCA9IFVERl9TQihpbm9kZS0+aV9zYiktPnNfdWlkOworCisJaW5vZGUtPmlfZ2lkID0gbGUzMl90b19jcHUoZmUtPmdpZCk7CisJaWYgKCBpbm9kZS0+aV9naWQgPT0gLTEgKSBpbm9kZS0+aV9naWQgPSBVREZfU0IoaW5vZGUtPmlfc2IpLT5zX2dpZDsKKworCWlub2RlLT5pX25saW5rID0gbGUxNl90b19jcHUoZmUtPmZpbGVMaW5rQ291bnQpOworCWlmICghaW5vZGUtPmlfbmxpbmspCisJCWlub2RlLT5pX25saW5rID0gMTsKKwkKKwlpbm9kZS0+aV9zaXplID0gbGU2NF90b19jcHUoZmUtPmluZm9ybWF0aW9uTGVuZ3RoKTsKKwlVREZfSV9MRU5FWFRFTlRTKGlub2RlKSA9IGlub2RlLT5pX3NpemU7CisKKwlpbm9kZS0+aV9tb2RlID0gdWRmX2NvbnZlcnRfcGVybWlzc2lvbnMoZmUpOworCWlub2RlLT5pX21vZGUgJj0gflVERl9TQihpbm9kZS0+aV9zYiktPnNfdW1hc2s7CisKKwlpZiAoVURGX0lfRUZFKGlub2RlKSA9PSAwKQorCXsKKwkJaW5vZGUtPmlfYmxvY2tzID0gbGU2NF90b19jcHUoZmUtPmxvZ2ljYWxCbG9ja3NSZWNvcmRlZCkgPDwKKwkJCShpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDkpOworCisJCWlmICggdWRmX3N0YW1wX3RvX3RpbWUoJmNvbnZ0aW1lLCAmY29udnRpbWVfdXNlYywKKwkJCWxldHNfdG9fY3B1KGZlLT5hY2Nlc3NUaW1lKSkgKQorCQl7CisJCQlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBjb252dGltZTsKKwkJCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSBjb252dGltZV91c2VjICogMTAwMDsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlub2RlLT5pX2F0aW1lID0gVURGX1NCX1JFQ09SRFRJTUUoaW5vZGUtPmlfc2IpOworCQl9CisKKwkJaWYgKCB1ZGZfc3RhbXBfdG9fdGltZSgmY29udnRpbWUsICZjb252dGltZV91c2VjLAorCQkJbGV0c190b19jcHUoZmUtPm1vZGlmaWNhdGlvblRpbWUpKSApCisJCXsKKwkJCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGNvbnZ0aW1lOworCQkJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IGNvbnZ0aW1lX3VzZWMgKiAxMDAwOworCQl9CisJCWVsc2UKKwkJeworCQkJaW5vZGUtPmlfbXRpbWUgPSBVREZfU0JfUkVDT1JEVElNRShpbm9kZS0+aV9zYik7CisJCX0KKworCQlpZiAoIHVkZl9zdGFtcF90b190aW1lKCZjb252dGltZSwgJmNvbnZ0aW1lX3VzZWMsCisJCQlsZXRzX3RvX2NwdShmZS0+YXR0clRpbWUpKSApCisJCXsKKwkJCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IGNvbnZ0aW1lOworCQkJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IGNvbnZ0aW1lX3VzZWMgKiAxMDAwOworCQl9CisJCWVsc2UKKwkJeworCQkJaW5vZGUtPmlfY3RpbWUgPSBVREZfU0JfUkVDT1JEVElNRShpbm9kZS0+aV9zYik7CisJCX0KKworCQlVREZfSV9VTklRVUUoaW5vZGUpID0gbGU2NF90b19jcHUoZmUtPnVuaXF1ZUlEKTsKKwkJVURGX0lfTEVORUFUVFIoaW5vZGUpID0gbGUzMl90b19jcHUoZmUtPmxlbmd0aEV4dGVuZGVkQXR0cik7CisJCVVERl9JX0xFTkFMTE9DKGlub2RlKSA9IGxlMzJfdG9fY3B1KGZlLT5sZW5ndGhBbGxvY0Rlc2NzKTsKKwkJb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBmaWxlRW50cnkpICsgVURGX0lfTEVORUFUVFIoaW5vZGUpOworCX0KKwllbHNlCisJeworCQlpbm9kZS0+aV9ibG9ja3MgPSBsZTY0X3RvX2NwdShlZmUtPmxvZ2ljYWxCbG9ja3NSZWNvcmRlZCkgPDwgCisJCQkoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KTsKKworCQlpZiAoIHVkZl9zdGFtcF90b190aW1lKCZjb252dGltZSwgJmNvbnZ0aW1lX3VzZWMsCisJCQlsZXRzX3RvX2NwdShlZmUtPmFjY2Vzc1RpbWUpKSApCisJCXsKKwkJCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IGNvbnZ0aW1lOworCQkJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IGNvbnZ0aW1lX3VzZWMgKiAxMDAwOworCQl9CisJCWVsc2UKKwkJeworCQkJaW5vZGUtPmlfYXRpbWUgPSBVREZfU0JfUkVDT1JEVElNRShpbm9kZS0+aV9zYik7CisJCX0KKworCQlpZiAoIHVkZl9zdGFtcF90b190aW1lKCZjb252dGltZSwgJmNvbnZ0aW1lX3VzZWMsCisJCQlsZXRzX3RvX2NwdShlZmUtPm1vZGlmaWNhdGlvblRpbWUpKSApCisJCXsKKwkJCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGNvbnZ0aW1lOworCQkJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IGNvbnZ0aW1lX3VzZWMgKiAxMDAwOworCQl9CisJCWVsc2UKKwkJeworCQkJaW5vZGUtPmlfbXRpbWUgPSBVREZfU0JfUkVDT1JEVElNRShpbm9kZS0+aV9zYik7CisJCX0KKworCQlpZiAoIHVkZl9zdGFtcF90b190aW1lKCZjb252dGltZSwgJmNvbnZ0aW1lX3VzZWMsCisJCQlsZXRzX3RvX2NwdShlZmUtPmNyZWF0ZVRpbWUpKSApCisJCXsKKwkJCVVERl9JX0NSVElNRShpbm9kZSkudHZfc2VjID0gY29udnRpbWU7CisJCQlVREZfSV9DUlRJTUUoaW5vZGUpLnR2X25zZWMgPSBjb252dGltZV91c2VjICogMTAwMDsKKwkJfQorCQllbHNlCisJCXsKKwkJCVVERl9JX0NSVElNRShpbm9kZSkgPSBVREZfU0JfUkVDT1JEVElNRShpbm9kZS0+aV9zYik7CisJCX0KKworCQlpZiAoIHVkZl9zdGFtcF90b190aW1lKCZjb252dGltZSwgJmNvbnZ0aW1lX3VzZWMsCisJCQlsZXRzX3RvX2NwdShlZmUtPmF0dHJUaW1lKSkgKQorCQl7CisJCQlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBjb252dGltZTsKKwkJCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSBjb252dGltZV91c2VjICogMTAwMDsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlub2RlLT5pX2N0aW1lID0gVURGX1NCX1JFQ09SRFRJTUUoaW5vZGUtPmlfc2IpOworCQl9CisKKwkJVURGX0lfVU5JUVVFKGlub2RlKSA9IGxlNjRfdG9fY3B1KGVmZS0+dW5pcXVlSUQpOworCQlVREZfSV9MRU5FQVRUUihpbm9kZSkgPSBsZTMyX3RvX2NwdShlZmUtPmxlbmd0aEV4dGVuZGVkQXR0cik7CisJCVVERl9JX0xFTkFMTE9DKGlub2RlKSA9IGxlMzJfdG9fY3B1KGVmZS0+bGVuZ3RoQWxsb2NEZXNjcyk7CisJCW9mZnNldCA9IHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpICsgVURGX0lfTEVORUFUVFIoaW5vZGUpOworCX0KKworCXN3aXRjaCAoZmUtPmljYlRhZy5maWxlVHlwZSkKKwl7CisJCWNhc2UgSUNCVEFHX0ZJTEVfVFlQRV9ESVJFQ1RPUlk6CisJCXsKKwkJCWlub2RlLT5pX29wID0gJnVkZl9kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2ZvcCA9ICZ1ZGZfZGlyX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9tb2RlIHw9IFNfSUZESVI7CisJCQlpbm9kZS0+aV9ubGluayArKzsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgSUNCVEFHX0ZJTEVfVFlQRV9SRUFMVElNRToKKwkJY2FzZSBJQ0JUQUdfRklMRV9UWVBFX1JFR1VMQVI6CisJCWNhc2UgSUNCVEFHX0ZJTEVfVFlQRV9VTkRFRjoKKwkJeworCQkJaWYgKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQorCQkJCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmdWRmX2FkaW5pY2JfYW9wczsKKwkJCWVsc2UKKwkJCQlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJnVkZl9hb3BzOworCQkJaW5vZGUtPmlfb3AgPSAmdWRmX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2ZvcCA9ICZ1ZGZfZmlsZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGUkVHOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBJQ0JUQUdfRklMRV9UWVBFX0JMT0NLOgorCQl7CisJCQlpbm9kZS0+aV9tb2RlIHw9IFNfSUZCTEs7CisJCQlicmVhazsKKwkJfQorCQljYXNlIElDQlRBR19GSUxFX1RZUEVfQ0hBUjoKKwkJeworCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGQ0hSOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBJQ0JUQUdfRklMRV9UWVBFX0ZJRk86CisJCXsKKwkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSB8IFNfSUZJRk8sIDApOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBJQ0JUQUdfRklMRV9UWVBFX1NPQ0tFVDoKKwkJeworCQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlIHwgU19JRlNPQ0ssIDApOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBJQ0JUQUdfRklMRV9UWVBFX1NZTUxJTks6CisJCXsKKwkJCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmdWRmX3N5bWxpbmtfYW9wczsKKwkJCWlub2RlLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfbW9kZSA9IFNfSUZMTkt8U19JUldYVUdPOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHVkZl9maWxsX2lub2RlKGlubyAlbGQpIGZhaWxlZCB1bmtub3duIGZpbGUgdHlwZT0lZFxuIiwKKwkJCQlpbm9kZS0+aV9pbm8sIGZlLT5pY2JUYWcuZmlsZVR5cGUpOworCQkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQkJcmV0dXJuOworCQl9CisJfQorCWlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCisJeworCQlzdHJ1Y3QgZGV2aWNlU3BlYyAqZHNlYSA9CisJCQkoc3RydWN0IGRldmljZVNwZWMgKikKKwkJCQl1ZGZfZ2V0X2V4dGVuZGVkYXR0cihpbm9kZSwgMTIsIDEpOworCisJCWlmIChkc2VhKQorCQl7CisJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsIE1LREVWKAorCQkJCWxlMzJfdG9fY3B1KGRzZWEtPm1ham9yRGV2aWNlSWRlbnQpLAorCQkJCWxlMzJfdG9fY3B1KGRzZWEtPm1pbm9yRGV2aWNlSWRlbnQpKSk7CisJCQkvKiBEZXZlbG9wZXIgSUQgPz8/ICovCisJCX0KKwkJZWxzZQorCQl7CisJCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBtb2RlX3QKK3VkZl9jb252ZXJ0X3Blcm1pc3Npb25zKHN0cnVjdCBmaWxlRW50cnkgKmZlKQoreworCW1vZGVfdCBtb2RlOworCXVpbnQzMl90IHBlcm1pc3Npb25zOworCXVpbnQzMl90IGZsYWdzOworCisJcGVybWlzc2lvbnMgPSBsZTMyX3RvX2NwdShmZS0+cGVybWlzc2lvbnMpOworCWZsYWdzID0gbGUxNl90b19jcHUoZmUtPmljYlRhZy5mbGFncyk7CisKKwltb2RlID0JKCggcGVybWlzc2lvbnMgICAgICApICYgU19JUldYTykgfAorCQkoKCBwZXJtaXNzaW9ucyA+PiAyICkgJiBTX0lSV1hHKSB8CisJCSgoIHBlcm1pc3Npb25zID4+IDQgKSAmIFNfSVJXWFUpIHwKKwkJKCggZmxhZ3MgJiBJQ0JUQUdfRkxBR19TRVRVSUQpID8gU19JU1VJRCA6IDApIHwKKwkJKCggZmxhZ3MgJiBJQ0JUQUdfRkxBR19TRVRHSUQpID8gU19JU0dJRCA6IDApIHwKKwkJKCggZmxhZ3MgJiBJQ0JUQUdfRkxBR19TVElDS1kpID8gU19JU1ZUWCA6IDApOworCisJcmV0dXJuIG1vZGU7Cit9CisKKy8qCisgKiB1ZGZfd3JpdGVfaW5vZGUKKyAqCisgKiBQVVJQT1NFCisgKglXcml0ZSBvdXQgdGhlIHNwZWNpZmllZCBpbm9kZS4KKyAqCisgKiBERVNDUklQVElPTgorICoJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBpbm9kZSBpcyBzeW5jZWQuCisgKglDdXJyZW50bHkgdGhpcyByb3V0aW5lIGlzIGp1c3QgYSBwbGFjZWhvbGRlci4KKyAqCisgKiBISVNUT1JZCisgKglKdWx5IDEsIDE5OTcgLSBBbmRyZXcgRS4gTWlsZXNraQorICoJV3JpdHRlbiwgdGVzdGVkLCBhbmQgcmVsZWFzZWQuCisgKi8KKworaW50IHVkZl93cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IHN5bmMpCit7CisJaW50IHJldDsKKwlsb2NrX2tlcm5lbCgpOworCXJldCA9IHVkZl91cGRhdGVfaW5vZGUoaW5vZGUsIHN5bmMpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdWRmX3N5bmNfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJcmV0dXJuIHVkZl91cGRhdGVfaW5vZGUoaW5vZGUsIDEpOworfQorCitzdGF0aWMgaW50Cit1ZGZfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBkb19zeW5jKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCXN0cnVjdCBmaWxlRW50cnkgKmZlOworCXN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSAqZWZlOworCXVpbnQzMl90IHVkZnBlcm1zOworCXVpbnQxNl90IGljYmZsYWdzOworCXVpbnQxNl90IGNyY2xlbjsKKwlpbnQgaTsKKwlrZXJuZWxfdGltZXN0YW1wIGNwdV90aW1lOworCWludCBlcnIgPSAwOworCisJYmggPSB1ZGZfdHJlYWQoaW5vZGUtPmlfc2IsCisJCXVkZl9nZXRfbGJfcGJsb2NrKGlub2RlLT5pX3NiLCBVREZfSV9MT0NBVElPTihpbm9kZSksIDApKTsKKworCWlmICghYmgpCisJeworCQl1ZGZfZGVidWcoImJyZWFkIGZhaWx1cmVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltZW1zZXQoYmgtPmJfZGF0YSwgMHgwMCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKworCWZlID0gKHN0cnVjdCBmaWxlRW50cnkgKiliaC0+Yl9kYXRhOworCWVmZSA9IChzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkgKiliaC0+Yl9kYXRhOworCisJaWYgKGxlMTZfdG9fY3B1KGZlLT5kZXNjVGFnLnRhZ0lkZW50KSA9PSBUQUdfSURFTlRfVVNFKQorCXsKKwkJc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5ICp1c2UgPQorCQkJKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSAqKWJoLT5iX2RhdGE7CisKKwkJdXNlLT5sZW5ndGhBbGxvY0Rlc2NzID0gY3B1X3RvX2xlMzIoVURGX0lfTEVOQUxMT0MoaW5vZGUpKTsKKwkJbWVtY3B5KGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KSwgVURGX0lfREFUQShpbm9kZSksIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpKTsKKwkJY3JjbGVuID0gc2l6ZW9mKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSkgKyBVREZfSV9MRU5BTExPQyhpbm9kZSkgLQorCQkJc2l6ZW9mKHRhZyk7CisJCXVzZS0+ZGVzY1RhZy50YWdMb2NhdGlvbiA9IGNwdV90b19sZTMyKFVERl9JX0xPQ0FUSU9OKGlub2RlKS5sb2dpY2FsQmxvY2tOdW0pOworCQl1c2UtPmRlc2NUYWcuZGVzY0NSQ0xlbmd0aCA9IGNwdV90b19sZTE2KGNyY2xlbik7CisJCXVzZS0+ZGVzY1RhZy5kZXNjQ1JDID0gY3B1X3RvX2xlMTYodWRmX2NyYygoY2hhciAqKXVzZSArIHNpemVvZih0YWcpLCBjcmNsZW4sIDApKTsKKworCQl1c2UtPmRlc2NUYWcudGFnQ2hlY2tzdW0gPSAwOworCQlmb3IgKGk9MDsgaTwxNjsgaSsrKQorCQkJaWYgKGkgIT0gNCkKKwkJCQl1c2UtPmRlc2NUYWcudGFnQ2hlY2tzdW0gKz0gKCh1aW50OF90ICopJih1c2UtPmRlc2NUYWcpKVtpXTsKKworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChpbm9kZS0+aV91aWQgIT0gVURGX1NCKGlub2RlLT5pX3NiKS0+c191aWQpCisJCWZlLT51aWQgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV91aWQpOworCisJaWYgKGlub2RlLT5pX2dpZCAhPSBVREZfU0IoaW5vZGUtPmlfc2IpLT5zX2dpZCkKKwkJZmUtPmdpZCA9IGNwdV90b19sZTMyKGlub2RlLT5pX2dpZCk7CisKKwl1ZGZwZXJtcyA9CSgoaW5vZGUtPmlfbW9kZSAmIFNfSVJXWE8pICAgICApIHwKKwkJCSgoaW5vZGUtPmlfbW9kZSAmIFNfSVJXWEcpIDw8IDIpIHwKKwkJCSgoaW5vZGUtPmlfbW9kZSAmIFNfSVJXWFUpIDw8IDQpOworCisJdWRmcGVybXMgfD0JKGxlMzJfdG9fY3B1KGZlLT5wZXJtaXNzaW9ucykgJgorCQkJKEZFX1BFUk1fT19ERUxFVEUgfCBGRV9QRVJNX09fQ0hBVFRSIHwKKwkJCSBGRV9QRVJNX0dfREVMRVRFIHwgRkVfUEVSTV9HX0NIQVRUUiB8CisJCQkgRkVfUEVSTV9VX0RFTEVURSB8IEZFX1BFUk1fVV9DSEFUVFIpKTsKKwlmZS0+cGVybWlzc2lvbnMgPSBjcHVfdG9fbGUzMih1ZGZwZXJtcyk7CisKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJZmUtPmZpbGVMaW5rQ291bnQgPSBjcHVfdG9fbGUxNihpbm9kZS0+aV9ubGluayAtIDEpOworCWVsc2UKKwkJZmUtPmZpbGVMaW5rQ291bnQgPSBjcHVfdG9fbGUxNihpbm9kZS0+aV9ubGluayk7CisKKwlmZS0+aW5mb3JtYXRpb25MZW5ndGggPSBjcHVfdG9fbGU2NChpbm9kZS0+aV9zaXplKTsKKworCWlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCisJeworCQlyZWdpZCAqZWlkOworCQlzdHJ1Y3QgZGV2aWNlU3BlYyAqZHNlYSA9CisJCQkoc3RydWN0IGRldmljZVNwZWMgKikKKwkJCQl1ZGZfZ2V0X2V4dGVuZGVkYXR0cihpbm9kZSwgMTIsIDEpOworCisJCWlmICghZHNlYSkKKwkJeworCQkJZHNlYSA9IChzdHJ1Y3QgZGV2aWNlU3BlYyAqKQorCQkJCXVkZl9hZGRfZXh0ZW5kZWRhdHRyKGlub2RlLAorCQkJCQlzaXplb2Yoc3RydWN0IGRldmljZVNwZWMpICsKKwkJCQkJc2l6ZW9mKHJlZ2lkKSwgMTIsIDB4Myk7CisJCQlkc2VhLT5hdHRyVHlwZSA9IGNwdV90b19sZTMyKDEyKTsKKwkJCWRzZWEtPmF0dHJTdWJ0eXBlID0gMTsKKwkJCWRzZWEtPmF0dHJMZW5ndGggPSBjcHVfdG9fbGUzMihzaXplb2Yoc3RydWN0IGRldmljZVNwZWMpICsKKwkJCQlzaXplb2YocmVnaWQpKTsKKwkJCWRzZWEtPmltcFVzZUxlbmd0aCA9IGNwdV90b19sZTMyKHNpemVvZihyZWdpZCkpOworCQl9CisJCWVpZCA9IChyZWdpZCAqKWRzZWEtPmltcFVzZTsKKwkJbWVtc2V0KGVpZCwgMCwgc2l6ZW9mKHJlZ2lkKSk7CisJCXN0cmNweShlaWQtPmlkZW50LCBVREZfSURfREVWRUxPUEVSKTsKKwkJZWlkLT5pZGVudFN1ZmZpeFswXSA9IFVERl9PU19DTEFTU19VTklYOworCQllaWQtPmlkZW50U3VmZml4WzFdID0gVURGX09TX0lEX0xJTlVYOworCQlkc2VhLT5tYWpvckRldmljZUlkZW50ID0gY3B1X3RvX2xlMzIoaW1ham9yKGlub2RlKSk7CisJCWRzZWEtPm1pbm9yRGV2aWNlSWRlbnQgPSBjcHVfdG9fbGUzMihpbWlub3IoaW5vZGUpKTsKKwl9CisKKwlpZiAoVURGX0lfRUZFKGlub2RlKSA9PSAwKQorCXsKKwkJbWVtY3B5KGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSksIFVERl9JX0RBVEEoaW5vZGUpLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSkpOworCQlmZS0+bG9naWNhbEJsb2Nrc1JlY29yZGVkID0gY3B1X3RvX2xlNjQoCisJCQkoaW5vZGUtPmlfYmxvY2tzICsgKDEgPDwgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSkpIC0gMSkgPj4KKwkJCShpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDkpKTsKKworCQlpZiAodWRmX3RpbWVfdG9fc3RhbXAoJmNwdV90aW1lLCBpbm9kZS0+aV9hdGltZSkpCisJCQlmZS0+YWNjZXNzVGltZSA9IGNwdV90b19sZXRzKGNwdV90aW1lKTsKKwkJaWYgKHVkZl90aW1lX3RvX3N0YW1wKCZjcHVfdGltZSwgaW5vZGUtPmlfbXRpbWUpKQorCQkJZmUtPm1vZGlmaWNhdGlvblRpbWUgPSBjcHVfdG9fbGV0cyhjcHVfdGltZSk7CisJCWlmICh1ZGZfdGltZV90b19zdGFtcCgmY3B1X3RpbWUsIGlub2RlLT5pX2N0aW1lKSkKKwkJCWZlLT5hdHRyVGltZSA9IGNwdV90b19sZXRzKGNwdV90aW1lKTsKKwkJbWVtc2V0KCYoZmUtPmltcElkZW50KSwgMCwgc2l6ZW9mKHJlZ2lkKSk7CisJCXN0cmNweShmZS0+aW1wSWRlbnQuaWRlbnQsIFVERl9JRF9ERVZFTE9QRVIpOworCQlmZS0+aW1wSWRlbnQuaWRlbnRTdWZmaXhbMF0gPSBVREZfT1NfQ0xBU1NfVU5JWDsKKwkJZmUtPmltcElkZW50LmlkZW50U3VmZml4WzFdID0gVURGX09TX0lEX0xJTlVYOworCQlmZS0+dW5pcXVlSUQgPSBjcHVfdG9fbGU2NChVREZfSV9VTklRVUUoaW5vZGUpKTsKKwkJZmUtPmxlbmd0aEV4dGVuZGVkQXR0ciA9IGNwdV90b19sZTMyKFVERl9JX0xFTkVBVFRSKGlub2RlKSk7CisJCWZlLT5sZW5ndGhBbGxvY0Rlc2NzID0gY3B1X3RvX2xlMzIoVURGX0lfTEVOQUxMT0MoaW5vZGUpKTsKKwkJZmUtPmRlc2NUYWcudGFnSWRlbnQgPSBjcHVfdG9fbGUxNihUQUdfSURFTlRfRkUpOworCQljcmNsZW4gPSBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSk7CisJfQorCWVsc2UKKwl7CisJCW1lbWNweShiaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSksIFVERl9JX0RBVEEoaW5vZGUpLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSk7CisJCWVmZS0+b2JqZWN0U2l6ZSA9IGNwdV90b19sZTY0KGlub2RlLT5pX3NpemUpOworCQllZmUtPmxvZ2ljYWxCbG9ja3NSZWNvcmRlZCA9IGNwdV90b19sZTY0KAorCQkJKGlub2RlLT5pX2Jsb2NrcyArICgxIDw8IChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDkpKSAtIDEpID4+CisJCQkoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KSk7CisKKwkJaWYgKFVERl9JX0NSVElNRShpbm9kZSkudHZfc2VjID4gaW5vZGUtPmlfYXRpbWUudHZfc2VjIHx8CisJCQkoVURGX0lfQ1JUSU1FKGlub2RlKS50dl9zZWMgPT0gaW5vZGUtPmlfYXRpbWUudHZfc2VjICYmCisJCQkgVURGX0lfQ1JUSU1FKGlub2RlKS50dl9uc2VjID4gaW5vZGUtPmlfYXRpbWUudHZfbnNlYykpCisJCXsKKwkJCVVERl9JX0NSVElNRShpbm9kZSkgPSBpbm9kZS0+aV9hdGltZTsKKwkJfQorCQlpZiAoVURGX0lfQ1JUSU1FKGlub2RlKS50dl9zZWMgPiBpbm9kZS0+aV9tdGltZS50dl9zZWMgfHwKKwkJCShVREZfSV9DUlRJTUUoaW5vZGUpLnR2X3NlYyA9PSBpbm9kZS0+aV9tdGltZS50dl9zZWMgJiYKKwkJCSBVREZfSV9DUlRJTUUoaW5vZGUpLnR2X25zZWMgPiBpbm9kZS0+aV9tdGltZS50dl9uc2VjKSkKKwkJeworCQkJVURGX0lfQ1JUSU1FKGlub2RlKSA9IGlub2RlLT5pX210aW1lOworCQl9CisJCWlmIChVREZfSV9DUlRJTUUoaW5vZGUpLnR2X3NlYyA+IGlub2RlLT5pX2N0aW1lLnR2X3NlYyB8fAorCQkJKFVERl9JX0NSVElNRShpbm9kZSkudHZfc2VjID09IGlub2RlLT5pX2N0aW1lLnR2X3NlYyAmJgorCQkJIFVERl9JX0NSVElNRShpbm9kZSkudHZfbnNlYyA+IGlub2RlLT5pX2N0aW1lLnR2X25zZWMpKQorCQl7CisJCQlVREZfSV9DUlRJTUUoaW5vZGUpID0gaW5vZGUtPmlfY3RpbWU7CisJCX0KKworCQlpZiAodWRmX3RpbWVfdG9fc3RhbXAoJmNwdV90aW1lLCBpbm9kZS0+aV9hdGltZSkpCisJCQllZmUtPmFjY2Vzc1RpbWUgPSBjcHVfdG9fbGV0cyhjcHVfdGltZSk7CisJCWlmICh1ZGZfdGltZV90b19zdGFtcCgmY3B1X3RpbWUsIGlub2RlLT5pX210aW1lKSkKKwkJCWVmZS0+bW9kaWZpY2F0aW9uVGltZSA9IGNwdV90b19sZXRzKGNwdV90aW1lKTsKKwkJaWYgKHVkZl90aW1lX3RvX3N0YW1wKCZjcHVfdGltZSwgVURGX0lfQ1JUSU1FKGlub2RlKSkpCisJCQllZmUtPmNyZWF0ZVRpbWUgPSBjcHVfdG9fbGV0cyhjcHVfdGltZSk7CisJCWlmICh1ZGZfdGltZV90b19zdGFtcCgmY3B1X3RpbWUsIGlub2RlLT5pX2N0aW1lKSkKKwkJCWVmZS0+YXR0clRpbWUgPSBjcHVfdG9fbGV0cyhjcHVfdGltZSk7CisKKwkJbWVtc2V0KCYoZWZlLT5pbXBJZGVudCksIDAsIHNpemVvZihyZWdpZCkpOworCQlzdHJjcHkoZWZlLT5pbXBJZGVudC5pZGVudCwgVURGX0lEX0RFVkVMT1BFUik7CisJCWVmZS0+aW1wSWRlbnQuaWRlbnRTdWZmaXhbMF0gPSBVREZfT1NfQ0xBU1NfVU5JWDsKKwkJZWZlLT5pbXBJZGVudC5pZGVudFN1ZmZpeFsxXSA9IFVERl9PU19JRF9MSU5VWDsKKwkJZWZlLT51bmlxdWVJRCA9IGNwdV90b19sZTY0KFVERl9JX1VOSVFVRShpbm9kZSkpOworCQllZmUtPmxlbmd0aEV4dGVuZGVkQXR0ciA9IGNwdV90b19sZTMyKFVERl9JX0xFTkVBVFRSKGlub2RlKSk7CisJCWVmZS0+bGVuZ3RoQWxsb2NEZXNjcyA9IGNwdV90b19sZTMyKFVERl9JX0xFTkFMTE9DKGlub2RlKSk7CisJCWVmZS0+ZGVzY1RhZy50YWdJZGVudCA9IGNwdV90b19sZTE2KFRBR19JREVOVF9FRkUpOworCQljcmNsZW4gPSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KTsKKwl9CisJaWYgKFVERl9JX1NUUkFUNDA5Nihpbm9kZSkpCisJeworCQlmZS0+aWNiVGFnLnN0cmF0ZWd5VHlwZSA9IGNwdV90b19sZTE2KDQwOTYpOworCQlmZS0+aWNiVGFnLnN0cmF0ZWd5UGFyYW1ldGVyID0gY3B1X3RvX2xlMTYoMSk7CisJCWZlLT5pY2JUYWcubnVtRW50cmllcyA9IGNwdV90b19sZTE2KDIpOworCX0KKwllbHNlCisJeworCQlmZS0+aWNiVGFnLnN0cmF0ZWd5VHlwZSA9IGNwdV90b19sZTE2KDQpOworCQlmZS0+aWNiVGFnLm51bUVudHJpZXMgPSBjcHVfdG9fbGUxNigxKTsKKwl9CisKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJZmUtPmljYlRhZy5maWxlVHlwZSA9IElDQlRBR19GSUxFX1RZUEVfRElSRUNUT1JZOworCWVsc2UgaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCWZlLT5pY2JUYWcuZmlsZVR5cGUgPSBJQ0JUQUdfRklMRV9UWVBFX1JFR1VMQVI7CisJZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJZmUtPmljYlRhZy5maWxlVHlwZSA9IElDQlRBR19GSUxFX1RZUEVfU1lNTElOSzsKKwllbHNlIGlmIChTX0lTQkxLKGlub2RlLT5pX21vZGUpKQorCQlmZS0+aWNiVGFnLmZpbGVUeXBlID0gSUNCVEFHX0ZJTEVfVFlQRV9CTE9DSzsKKwllbHNlIGlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpKQorCQlmZS0+aWNiVGFnLmZpbGVUeXBlID0gSUNCVEFHX0ZJTEVfVFlQRV9DSEFSOworCWVsc2UgaWYgKFNfSVNGSUZPKGlub2RlLT5pX21vZGUpKQorCQlmZS0+aWNiVGFnLmZpbGVUeXBlID0gSUNCVEFHX0ZJTEVfVFlQRV9GSUZPOworCWVsc2UgaWYgKFNfSVNTT0NLKGlub2RlLT5pX21vZGUpKQorCQlmZS0+aWNiVGFnLmZpbGVUeXBlID0gSUNCVEFHX0ZJTEVfVFlQRV9TT0NLRVQ7CisKKwlpY2JmbGFncyA9CVVERl9JX0FMTE9DVFlQRShpbm9kZSkgfAorCQkJKChpbm9kZS0+aV9tb2RlICYgU19JU1VJRCkgPyBJQ0JUQUdfRkxBR19TRVRVSUQgOiAwKSB8CisJCQkoKGlub2RlLT5pX21vZGUgJiBTX0lTR0lEKSA/IElDQlRBR19GTEFHX1NFVEdJRCA6IDApIHwKKwkJCSgoaW5vZGUtPmlfbW9kZSAmIFNfSVNWVFgpID8gSUNCVEFHX0ZMQUdfU1RJQ0tZIDogMCkgfAorCQkJKGxlMTZfdG9fY3B1KGZlLT5pY2JUYWcuZmxhZ3MpICYKKwkJCQl+KElDQlRBR19GTEFHX0FEX01BU0sgfCBJQ0JUQUdfRkxBR19TRVRVSUQgfAorCQkJCUlDQlRBR19GTEFHX1NFVEdJRCB8IElDQlRBR19GTEFHX1NUSUNLWSkpOworCisJZmUtPmljYlRhZy5mbGFncyA9IGNwdV90b19sZTE2KGljYmZsYWdzKTsKKwlpZiAoVURGX1NCX1VERlJFVihpbm9kZS0+aV9zYikgPj0gMHgwMjAwKQorCQlmZS0+ZGVzY1RhZy5kZXNjVmVyc2lvbiA9IGNwdV90b19sZTE2KDMpOworCWVsc2UKKwkJZmUtPmRlc2NUYWcuZGVzY1ZlcnNpb24gPSBjcHVfdG9fbGUxNigyKTsKKwlmZS0+ZGVzY1RhZy50YWdTZXJpYWxOdW0gPSBjcHVfdG9fbGUxNihVREZfU0JfU0VSSUFMTlVNKGlub2RlLT5pX3NiKSk7CisJZmUtPmRlc2NUYWcudGFnTG9jYXRpb24gPSBjcHVfdG9fbGUzMihVREZfSV9MT0NBVElPTihpbm9kZSkubG9naWNhbEJsb2NrTnVtKTsKKwljcmNsZW4gKz0gVURGX0lfTEVORUFUVFIoaW5vZGUpICsgVURGX0lfTEVOQUxMT0MoaW5vZGUpIC0gc2l6ZW9mKHRhZyk7CisJZmUtPmRlc2NUYWcuZGVzY0NSQ0xlbmd0aCA9IGNwdV90b19sZTE2KGNyY2xlbik7CisJZmUtPmRlc2NUYWcuZGVzY0NSQyA9IGNwdV90b19sZTE2KHVkZl9jcmMoKGNoYXIgKilmZSArIHNpemVvZih0YWcpLCBjcmNsZW4sIDApKTsKKworCWZlLT5kZXNjVGFnLnRhZ0NoZWNrc3VtID0gMDsKKwlmb3IgKGk9MDsgaTwxNjsgaSsrKQorCQlpZiAoaSAhPSA0KQorCQkJZmUtPmRlc2NUYWcudGFnQ2hlY2tzdW0gKz0gKCh1aW50OF90ICopJihmZS0+ZGVzY1RhZykpW2ldOworCisJLyogd3JpdGUgdGhlIGRhdGEgYmxvY2tzICovCisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWlmIChkb19zeW5jKQorCXsKKwkJc3luY19kaXJ0eV9idWZmZXIoYmgpOworCQlpZiAoYnVmZmVyX3JlcShiaCkgJiYgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCXsKKwkJCXByaW50aygiSU8gZXJyb3Igc3luY2luZyB1ZGYgaW5vZGUgWyVzOiUwOGx4XVxuIiwKKwkJCQlpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsKKwkJCWVyciA9IC1FSU87CisJCX0KKwl9CisJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IGlub2RlICoKK3VkZl9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGtlcm5lbF9sYl9hZGRyIGlubykKK3sKKwl1bnNpZ25lZCBsb25nIGJsb2NrID0gdWRmX2dldF9sYl9wYmxvY2soc2IsIGlubywgMCk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGlnZXRfbG9ja2VkKHNiLCBibG9jayk7CisKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSB7CisJCW1lbWNweSgmVURGX0lfTE9DQVRJT04oaW5vZGUpLCAmaW5vLCBzaXplb2Yoa2VybmVsX2xiX2FkZHIpKTsKKwkJX191ZGZfcmVhZF9pbm9kZShpbm9kZSk7CisJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCX0KKworCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKQorCQlnb3RvIG91dF9pcHV0OworCisJaWYgKGluby5sb2dpY2FsQmxvY2tOdW0gPj0gVURGX1NCX1BBUlRMRU4oc2IsIGluby5wYXJ0aXRpb25SZWZlcmVuY2VOdW0pKSB7CisJCXVkZl9kZWJ1ZygiYmxvY2s9JWQsIHBhcnRpdGlvbj0lZCBvdXQgb2YgcmFuZ2VcbiIsCisJCQlpbm8ubG9naWNhbEJsb2NrTnVtLCBpbm8ucGFydGl0aW9uUmVmZXJlbmNlTnVtKTsKKwkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQlnb3RvIG91dF9pcHV0OworCX0KKworCXJldHVybiBpbm9kZTsKKworIG91dF9pcHV0OgorCWlwdXQoaW5vZGUpOworCXJldHVybiBOVUxMOworfQorCitpbnQ4X3QgdWRmX2FkZF9hZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGtlcm5lbF9sYl9hZGRyICpibG9jLCBpbnQgKmV4dG9mZnNldCwKKwlrZXJuZWxfbGJfYWRkciBlbG9jLCB1aW50MzJfdCBlbGVuLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCwgaW50IGluYykKK3sKKwlpbnQgYWRzaXplOworCXNob3J0X2FkICpzYWQgPSBOVUxMOworCWxvbmdfYWQgKmxhZCA9IE5VTEw7CisJc3RydWN0IGFsbG9jRXh0RGVzYyAqYWVkOworCWludDhfdCBldHlwZTsKKwl1aW50OF90ICpwdHI7CisKKwlpZiAoISpiaCkKKwkJcHRyID0gVURGX0lfREFUQShpbm9kZSkgKyAqZXh0b2Zmc2V0IC0gdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKSArIFVERl9JX0xFTkVBVFRSKGlub2RlKTsKKwllbHNlCisJCXB0ciA9ICgqYmgpLT5iX2RhdGEgKyAqZXh0b2Zmc2V0OworCisJaWYgKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCisJCWFkc2l6ZSA9IHNpemVvZihzaG9ydF9hZCk7CisJZWxzZSBpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQorCQlhZHNpemUgPSBzaXplb2YobG9uZ19hZCk7CisJZWxzZQorCQlyZXR1cm4gLTE7CisKKwlpZiAoKmV4dG9mZnNldCArICgyICogYWRzaXplKSA+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkKKwl7CisJCWNoYXIgKnNwdHIsICpkcHRyOworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5iaDsKKwkJaW50IGVyciwgbG9mZnNldDsKKwkJa2VybmVsX2xiX2FkZHIgb2Jsb2MgPSAqYmxvYzsKKworCQlpZiAoIShibG9jLT5sb2dpY2FsQmxvY2tOdW0gPSB1ZGZfbmV3X2Jsb2NrKGlub2RlLT5pX3NiLCBOVUxMLAorCQkJb2Jsb2MucGFydGl0aW9uUmVmZXJlbmNlTnVtLCBvYmxvYy5sb2dpY2FsQmxvY2tOdW0sICZlcnIpKSkKKwkJeworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICghKG5iaCA9IHVkZl90Z2V0YmxrKGlub2RlLT5pX3NiLCB1ZGZfZ2V0X2xiX3BibG9jayhpbm9kZS0+aV9zYiwKKwkJCSpibG9jLCAwKSkpKQorCQl7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbG9ja19idWZmZXIobmJoKTsKKwkJbWVtc2V0KG5iaC0+Yl9kYXRhLCAweDAwLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKG5iaCk7CisJCXVubG9ja19idWZmZXIobmJoKTsKKwkJbWFya19idWZmZXJfZGlydHlfaW5vZGUobmJoLCBpbm9kZSk7CisKKwkJYWVkID0gKHN0cnVjdCBhbGxvY0V4dERlc2MgKikobmJoLT5iX2RhdGEpOworCQlpZiAoIVVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19TVFJJQ1QpKQorCQkJYWVkLT5wcmV2aW91c0FsbG9jRXh0TG9jYXRpb24gPSBjcHVfdG9fbGUzMihvYmxvYy5sb2dpY2FsQmxvY2tOdW0pOworCQlpZiAoKmV4dG9mZnNldCArIGFkc2l6ZSA+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkKKwkJeworCQkJbG9mZnNldCA9ICpleHRvZmZzZXQ7CisJCQlhZWQtPmxlbmd0aEFsbG9jRGVzY3MgPSBjcHVfdG9fbGUzMihhZHNpemUpOworCQkJc3B0ciA9IHB0ciAtIGFkc2l6ZTsKKwkJCWRwdHIgPSBuYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKTsKKwkJCW1lbWNweShkcHRyLCBzcHRyLCBhZHNpemUpOworCQkJKmV4dG9mZnNldCA9IHNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKSArIGFkc2l6ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWxvZmZzZXQgPSAqZXh0b2Zmc2V0ICsgYWRzaXplOworCQkJYWVkLT5sZW5ndGhBbGxvY0Rlc2NzID0gY3B1X3RvX2xlMzIoMCk7CisJCQlzcHRyID0gcHRyOworCQkJKmV4dG9mZnNldCA9IHNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKTsKKworCQkJaWYgKCpiaCkKKwkJCXsKKwkJCQlhZWQgPSAoc3RydWN0IGFsbG9jRXh0RGVzYyAqKSgqYmgpLT5iX2RhdGE7CisJCQkJYWVkLT5sZW5ndGhBbGxvY0Rlc2NzID0KKwkJCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUoYWVkLT5sZW5ndGhBbGxvY0Rlc2NzKSArIGFkc2l6ZSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJVURGX0lfTEVOQUxMT0MoaW5vZGUpICs9IGFkc2l6ZTsKKwkJCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJCX0KKwkJfQorCQlpZiAoVURGX1NCX1VERlJFVihpbm9kZS0+aV9zYikgPj0gMHgwMjAwKQorCQkJdWRmX25ld190YWcobmJoLT5iX2RhdGEsIFRBR19JREVOVF9BRUQsIDMsIDEsCisJCQkJYmxvYy0+bG9naWNhbEJsb2NrTnVtLCBzaXplb2YodGFnKSk7CisJCWVsc2UKKwkJCXVkZl9uZXdfdGFnKG5iaC0+Yl9kYXRhLCBUQUdfSURFTlRfQUVELCAyLCAxLAorCQkJCWJsb2MtPmxvZ2ljYWxCbG9ja051bSwgc2l6ZW9mKHRhZykpOworCQlzd2l0Y2ggKFVERl9JX0FMTE9DVFlQRShpbm9kZSkpCisJCXsKKwkJCWNhc2UgSUNCVEFHX0ZMQUdfQURfU0hPUlQ6CisJCQl7CisJCQkJc2FkID0gKHNob3J0X2FkICopc3B0cjsKKwkJCQlzYWQtPmV4dExlbmd0aCA9IGNwdV90b19sZTMyKAorCQkJCQlFWFRfTkVYVF9FWFRFTlRfQUxMT0NERUNTIHwKKwkJCQkJaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwkJCQlzYWQtPmV4dFBvc2l0aW9uID0gY3B1X3RvX2xlMzIoYmxvYy0+bG9naWNhbEJsb2NrTnVtKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgSUNCVEFHX0ZMQUdfQURfTE9ORzoKKwkJCXsKKwkJCQlsYWQgPSAobG9uZ19hZCAqKXNwdHI7CisJCQkJbGFkLT5leHRMZW5ndGggPSBjcHVfdG9fbGUzMigKKwkJCQkJRVhUX05FWFRfRVhURU5UX0FMTE9DREVDUyB8CisJCQkJCWlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJCQkJbGFkLT5leHRMb2NhdGlvbiA9IGNwdV90b19sZWxiKCpibG9jKTsKKwkJCQltZW1zZXQobGFkLT5pbXBVc2UsIDB4MDAsIHNpemVvZihsYWQtPmltcFVzZSkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICgqYmgpCisJCXsKKwkJCWlmICghVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1NUUklDVCkgfHwgVURGX1NCX1VERlJFVihpbm9kZS0+aV9zYikgPj0gMHgwMjAxKQorCQkJCXVkZl91cGRhdGVfdGFnKCgqYmgpLT5iX2RhdGEsIGxvZmZzZXQpOworCQkJZWxzZQorCQkJCXVkZl91cGRhdGVfdGFnKCgqYmgpLT5iX2RhdGEsIHNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKSk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZSgqYmgsIGlub2RlKTsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoKmJoKTsKKwkJfQorCQllbHNlCisJCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJKmJoID0gbmJoOworCX0KKworCWV0eXBlID0gdWRmX3dyaXRlX2FleHQoaW5vZGUsICpibG9jLCBleHRvZmZzZXQsIGVsb2MsIGVsZW4sICpiaCwgaW5jKTsKKworCWlmICghKmJoKQorCXsKKwkJVURGX0lfTEVOQUxMT0MoaW5vZGUpICs9IGFkc2l6ZTsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJfQorCWVsc2UKKwl7CisJCWFlZCA9IChzdHJ1Y3QgYWxsb2NFeHREZXNjICopKCpiaCktPmJfZGF0YTsKKwkJYWVkLT5sZW5ndGhBbGxvY0Rlc2NzID0KKwkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KGFlZC0+bGVuZ3RoQWxsb2NEZXNjcykgKyBhZHNpemUpOworCQlpZiAoIVVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19TVFJJQ1QpIHx8IFVERl9TQl9VREZSRVYoaW5vZGUtPmlfc2IpID49IDB4MDIwMSkKKwkJCXVkZl91cGRhdGVfdGFnKCgqYmgpLT5iX2RhdGEsICpleHRvZmZzZXQgKyAoaW5jID8gMCA6IGFkc2l6ZSkpOworCQllbHNlCisJCQl1ZGZfdXBkYXRlX3RhZygoKmJoKS0+Yl9kYXRhLCBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYykpOworCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZSgqYmgsIGlub2RlKTsKKwl9CisKKwlyZXR1cm4gZXR5cGU7Cit9CisKK2ludDhfdCB1ZGZfd3JpdGVfYWV4dChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBrZXJuZWxfbGJfYWRkciBibG9jLCBpbnQgKmV4dG9mZnNldCwKKyAgICBrZXJuZWxfbGJfYWRkciBlbG9jLCB1aW50MzJfdCBlbGVuLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgaW5jKQoreworCWludCBhZHNpemU7CisJdWludDhfdCAqcHRyOworCisJaWYgKCFiaCkKKwkJcHRyID0gVURGX0lfREFUQShpbm9kZSkgKyAqZXh0b2Zmc2V0IC0gdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKSArIFVERl9JX0xFTkVBVFRSKGlub2RlKTsKKwllbHNlCisJeworCQlwdHIgPSBiaC0+Yl9kYXRhICsgKmV4dG9mZnNldDsKKwkJYXRvbWljX2luYygmYmgtPmJfY291bnQpOworCX0KKworCXN3aXRjaCAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSkKKwl7CisJCWNhc2UgSUNCVEFHX0ZMQUdfQURfU0hPUlQ6CisJCXsKKwkJCXNob3J0X2FkICpzYWQgPSAoc2hvcnRfYWQgKilwdHI7CisJCQlzYWQtPmV4dExlbmd0aCA9IGNwdV90b19sZTMyKGVsZW4pOworCQkJc2FkLT5leHRQb3NpdGlvbiA9IGNwdV90b19sZTMyKGVsb2MubG9naWNhbEJsb2NrTnVtKTsKKwkJCWFkc2l6ZSA9IHNpemVvZihzaG9ydF9hZCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIElDQlRBR19GTEFHX0FEX0xPTkc6CisJCXsKKwkJCWxvbmdfYWQgKmxhZCA9IChsb25nX2FkICopcHRyOworCQkJbGFkLT5leHRMZW5ndGggPSBjcHVfdG9fbGUzMihlbGVuKTsKKwkJCWxhZC0+ZXh0TG9jYXRpb24gPSBjcHVfdG9fbGVsYihlbG9jKTsKKwkJCW1lbXNldChsYWQtPmltcFVzZSwgMHgwMCwgc2l6ZW9mKGxhZC0+aW1wVXNlKSk7CisJCQlhZHNpemUgPSBzaXplb2YobG9uZ19hZCk7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCX0KKworCWlmIChiaCkKKwl7CisJCWlmICghVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1NUUklDVCkgfHwgVURGX1NCX1VERlJFVihpbm9kZS0+aV9zYikgPj0gMHgwMjAxKQorCQl7CisJCQlzdHJ1Y3QgYWxsb2NFeHREZXNjICphZWQgPSAoc3RydWN0IGFsbG9jRXh0RGVzYyAqKShiaCktPmJfZGF0YTsKKwkJCXVkZl91cGRhdGVfdGFnKChiaCktPmJfZGF0YSwKKwkJCQlsZTMyX3RvX2NwdShhZWQtPmxlbmd0aEFsbG9jRGVzY3MpICsgc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpKTsKKwkJfQorCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwl9CisJZWxzZQorCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKworCWlmIChpbmMpCisJCSpleHRvZmZzZXQgKz0gYWRzaXplOworCXJldHVybiAoZWxlbiA+PiAzMCk7Cit9CisKK2ludDhfdCB1ZGZfbmV4dF9hZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGtlcm5lbF9sYl9hZGRyICpibG9jLCBpbnQgKmV4dG9mZnNldCwKKwlrZXJuZWxfbGJfYWRkciAqZWxvYywgdWludDMyX3QgKmVsZW4sIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLCBpbnQgaW5jKQoreworCWludDhfdCBldHlwZTsKKworCXdoaWxlICgoZXR5cGUgPSB1ZGZfY3VycmVudF9hZXh0KGlub2RlLCBibG9jLCBleHRvZmZzZXQsIGVsb2MsIGVsZW4sIGJoLCBpbmMpKSA9PQorCQkoRVhUX05FWFRfRVhURU5UX0FMTE9DREVDUyA+PiAzMCkpCisJeworCQkqYmxvYyA9ICplbG9jOworCQkqZXh0b2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpOworCQl1ZGZfcmVsZWFzZV9kYXRhKCpiaCk7CisJCWlmICghKCpiaCA9IHVkZl90cmVhZChpbm9kZS0+aV9zYiwgdWRmX2dldF9sYl9wYmxvY2soaW5vZGUtPmlfc2IsICpibG9jLCAwKSkpKQorCQl7CisJCQl1ZGZfZGVidWcoInJlYWRpbmcgYmxvY2sgJWQgZmFpbGVkIVxuIiwKKwkJCQl1ZGZfZ2V0X2xiX3BibG9jayhpbm9kZS0+aV9zYiwgKmJsb2MsIDApKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldHVybiBldHlwZTsKK30KKworaW50OF90IHVkZl9jdXJyZW50X2FleHQoc3RydWN0IGlub2RlICppbm9kZSwga2VybmVsX2xiX2FkZHIgKmJsb2MsIGludCAqZXh0b2Zmc2V0LAorCWtlcm5lbF9sYl9hZGRyICplbG9jLCB1aW50MzJfdCAqZWxlbiwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgsIGludCBpbmMpCit7CisJaW50IGFsZW47CisJaW50OF90IGV0eXBlOworCXVpbnQ4X3QgKnB0cjsKKworCWlmICghKmJoKQorCXsKKwkJaWYgKCEoKmV4dG9mZnNldCkpCisJCQkqZXh0b2Zmc2V0ID0gdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKTsKKwkJcHRyID0gVURGX0lfREFUQShpbm9kZSkgKyAqZXh0b2Zmc2V0IC0gdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKSArIFVERl9JX0xFTkVBVFRSKGlub2RlKTsKKwkJYWxlbiA9IHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChpbm9kZSkgKyBVREZfSV9MRU5BTExPQyhpbm9kZSk7CisJfQorCWVsc2UKKwl7CisJCWlmICghKCpleHRvZmZzZXQpKQorCQkJKmV4dG9mZnNldCA9IHNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKTsKKwkJcHRyID0gKCpiaCktPmJfZGF0YSArICpleHRvZmZzZXQ7CisJCWFsZW4gPSBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYykgKyBsZTMyX3RvX2NwdSgoKHN0cnVjdCBhbGxvY0V4dERlc2MgKikoKmJoKS0+Yl9kYXRhKS0+bGVuZ3RoQWxsb2NEZXNjcyk7CisJfQorCisJc3dpdGNoIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpKQorCXsKKwkJY2FzZSBJQ0JUQUdfRkxBR19BRF9TSE9SVDoKKwkJeworCQkJc2hvcnRfYWQgKnNhZDsKKworCQkJaWYgKCEoc2FkID0gdWRmX2dldF9maWxlc2hvcnRhZChwdHIsIGFsZW4sIGV4dG9mZnNldCwgaW5jKSkpCisJCQkJcmV0dXJuIC0xOworCisJCQlldHlwZSA9IGxlMzJfdG9fY3B1KHNhZC0+ZXh0TGVuZ3RoKSA+PiAzMDsKKwkJCWVsb2MtPmxvZ2ljYWxCbG9ja051bSA9IGxlMzJfdG9fY3B1KHNhZC0+ZXh0UG9zaXRpb24pOworCQkJZWxvYy0+cGFydGl0aW9uUmVmZXJlbmNlTnVtID0gVURGX0lfTE9DQVRJT04oaW5vZGUpLnBhcnRpdGlvblJlZmVyZW5jZU51bTsKKwkJCSplbGVuID0gbGUzMl90b19jcHUoc2FkLT5leHRMZW5ndGgpICYgVURGX0VYVEVOVF9MRU5HVEhfTUFTSzsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgSUNCVEFHX0ZMQUdfQURfTE9ORzoKKwkJeworCQkJbG9uZ19hZCAqbGFkOworCisJCQlpZiAoIShsYWQgPSB1ZGZfZ2V0X2ZpbGVsb25nYWQocHRyLCBhbGVuLCBleHRvZmZzZXQsIGluYykpKQorCQkJCXJldHVybiAtMTsKKworCQkJZXR5cGUgPSBsZTMyX3RvX2NwdShsYWQtPmV4dExlbmd0aCkgPj4gMzA7CisJCQkqZWxvYyA9IGxlbGJfdG9fY3B1KGxhZC0+ZXh0TG9jYXRpb24pOworCQkJKmVsZW4gPSBsZTMyX3RvX2NwdShsYWQtPmV4dExlbmd0aCkgJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJeworCQkJdWRmX2RlYnVnKCJhbGxvY190eXBlID0gJWQgdW5zdXBwb3J0ZWRcbiIsIFVERl9JX0FMTE9DVFlQRShpbm9kZSkpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcmV0dXJuIGV0eXBlOworfQorCitzdGF0aWMgaW50OF90Cit1ZGZfaW5zZXJ0X2FleHQoc3RydWN0IGlub2RlICppbm9kZSwga2VybmVsX2xiX2FkZHIgYmxvYywgaW50IGV4dG9mZnNldCwKKwkJa2VybmVsX2xiX2FkZHIgbmVsb2MsIHVpbnQzMl90IG5lbGVuLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWtlcm5lbF9sYl9hZGRyIG9lbG9jOworCXVpbnQzMl90IG9lbGVuOworCWludDhfdCBldHlwZTsKKworCWlmIChiaCkKKwkJYXRvbWljX2luYygmYmgtPmJfY291bnQpOworCisJd2hpbGUgKChldHlwZSA9IHVkZl9uZXh0X2FleHQoaW5vZGUsICZibG9jLCAmZXh0b2Zmc2V0LCAmb2Vsb2MsICZvZWxlbiwgJmJoLCAwKSkgIT0gLTEpCisJeworCQl1ZGZfd3JpdGVfYWV4dChpbm9kZSwgYmxvYywgJmV4dG9mZnNldCwgbmVsb2MsIG5lbGVuLCBiaCwgMSk7CisKKwkJbmVsb2MgPSBvZWxvYzsKKwkJbmVsZW4gPSAoZXR5cGUgPDwgMzApIHwgb2VsZW47CisJfQorCXVkZl9hZGRfYWV4dChpbm9kZSwgJmJsb2MsICZleHRvZmZzZXQsIG5lbG9jLCBuZWxlbiwgJmJoLCAxKTsKKwl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwlyZXR1cm4gKG5lbGVuID4+IDMwKTsKK30KKworaW50OF90IHVkZl9kZWxldGVfYWV4dChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBrZXJuZWxfbGJfYWRkciBuYmxvYywgaW50IG5leHRvZmZzZXQsCisJa2VybmVsX2xiX2FkZHIgZWxvYywgdWludDMyX3QgZWxlbiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpuYmgpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpvYmg7CisJa2VybmVsX2xiX2FkZHIgb2Jsb2M7CisJaW50IG9leHRvZmZzZXQsIGFkc2l6ZTsKKwlpbnQ4X3QgZXR5cGU7CisJc3RydWN0IGFsbG9jRXh0RGVzYyAqYWVkOworCisJaWYgKG5iaCkKKwl7CisJCWF0b21pY19pbmMoJm5iaC0+Yl9jb3VudCk7CisJCWF0b21pY19pbmMoJm5iaC0+Yl9jb3VudCk7CisJfQorCisJaWYgKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCisJCWFkc2l6ZSA9IHNpemVvZihzaG9ydF9hZCk7CisJZWxzZSBpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQorCQlhZHNpemUgPSBzaXplb2YobG9uZ19hZCk7CisJZWxzZQorCQlhZHNpemUgPSAwOworCisJb2JoID0gbmJoOworCW9ibG9jID0gbmJsb2M7CisJb2V4dG9mZnNldCA9IG5leHRvZmZzZXQ7CisKKwlpZiAodWRmX25leHRfYWV4dChpbm9kZSwgJm5ibG9jLCAmbmV4dG9mZnNldCwgJmVsb2MsICZlbGVuLCAmbmJoLCAxKSA9PSAtMSkKKwkJcmV0dXJuIC0xOworCisJd2hpbGUgKChldHlwZSA9IHVkZl9uZXh0X2FleHQoaW5vZGUsICZuYmxvYywgJm5leHRvZmZzZXQsICZlbG9jLCAmZWxlbiwgJm5iaCwgMSkpICE9IC0xKQorCXsKKwkJdWRmX3dyaXRlX2FleHQoaW5vZGUsIG9ibG9jLCAmb2V4dG9mZnNldCwgZWxvYywgKGV0eXBlIDw8IDMwKSB8IGVsZW4sIG9iaCwgMSk7CisJCWlmIChvYmggIT0gbmJoKQorCQl7CisJCQlvYmxvYyA9IG5ibG9jOworCQkJdWRmX3JlbGVhc2VfZGF0YShvYmgpOworCQkJYXRvbWljX2luYygmbmJoLT5iX2NvdW50KTsKKwkJCW9iaCA9IG5iaDsKKwkJCW9leHRvZmZzZXQgPSBuZXh0b2Zmc2V0IC0gYWRzaXplOworCQl9CisJfQorCW1lbXNldCgmZWxvYywgMHgwMCwgc2l6ZW9mKGtlcm5lbF9sYl9hZGRyKSk7CisJZWxlbiA9IDA7CisKKwlpZiAobmJoICE9IG9iaCkKKwl7CisJCXVkZl9mcmVlX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgaW5vZGUsIG5ibG9jLCAwLCAxKTsKKwkJdWRmX3dyaXRlX2FleHQoaW5vZGUsIG9ibG9jLCAmb2V4dG9mZnNldCwgZWxvYywgZWxlbiwgb2JoLCAxKTsKKwkJdWRmX3dyaXRlX2FleHQoaW5vZGUsIG9ibG9jLCAmb2V4dG9mZnNldCwgZWxvYywgZWxlbiwgb2JoLCAxKTsKKwkJaWYgKCFvYmgpCisJCXsKKwkJCVVERl9JX0xFTkFMTE9DKGlub2RlKSAtPSAoYWRzaXplICogMik7CisJCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWFlZCA9IChzdHJ1Y3QgYWxsb2NFeHREZXNjICopKG9iaCktPmJfZGF0YTsKKwkJCWFlZC0+bGVuZ3RoQWxsb2NEZXNjcyA9CisJCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUoYWVkLT5sZW5ndGhBbGxvY0Rlc2NzKSAtICgyKmFkc2l6ZSkpOworCQkJaWYgKCFVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfU1RSSUNUKSB8fCBVREZfU0JfVURGUkVWKGlub2RlLT5pX3NiKSA+PSAweDAyMDEpCisJCQkJdWRmX3VwZGF0ZV90YWcoKG9iaCktPmJfZGF0YSwgb2V4dG9mZnNldCAtICgyKmFkc2l6ZSkpOworCQkJZWxzZQorCQkJCXVkZl91cGRhdGVfdGFnKChvYmgpLT5iX2RhdGEsIHNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKSk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShvYmgsIGlub2RlKTsKKwkJfQorCX0KKwllbHNlCisJeworCQl1ZGZfd3JpdGVfYWV4dChpbm9kZSwgb2Jsb2MsICZvZXh0b2Zmc2V0LCBlbG9jLCBlbGVuLCBvYmgsIDEpOworCQlpZiAoIW9iaCkKKwkJeworCQkJVURGX0lfTEVOQUxMT0MoaW5vZGUpIC09IGFkc2l6ZTsKKwkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQl9CisJCWVsc2UKKwkJeworCQkJYWVkID0gKHN0cnVjdCBhbGxvY0V4dERlc2MgKikob2JoKS0+Yl9kYXRhOworCQkJYWVkLT5sZW5ndGhBbGxvY0Rlc2NzID0KKwkJCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShhZWQtPmxlbmd0aEFsbG9jRGVzY3MpIC0gYWRzaXplKTsKKwkJCWlmICghVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1NUUklDVCkgfHwgVURGX1NCX1VERlJFVihpbm9kZS0+aV9zYikgPj0gMHgwMjAxKQorCQkJCXVkZl91cGRhdGVfdGFnKChvYmgpLT5iX2RhdGEsIG9leHRvZmZzZXQgLSBhZHNpemUpOworCQkJZWxzZQorCQkJCXVkZl91cGRhdGVfdGFnKChvYmgpLT5iX2RhdGEsIHNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKSk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShvYmgsIGlub2RlKTsKKwkJfQorCX0KKwkKKwl1ZGZfcmVsZWFzZV9kYXRhKG5iaCk7CisJdWRmX3JlbGVhc2VfZGF0YShvYmgpOworCXJldHVybiAoZWxlbiA+PiAzMCk7Cit9CisKK2ludDhfdCBpbm9kZV9ibWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBibG9jaywga2VybmVsX2xiX2FkZHIgKmJsb2MsIHVpbnQzMl90ICpleHRvZmZzZXQsCisJa2VybmVsX2xiX2FkZHIgKmVsb2MsIHVpbnQzMl90ICplbGVuLCB1aW50MzJfdCAqb2Zmc2V0LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCkKK3sKKwl1aW50NjRfdCBsYmNvdW50ID0gMCwgYmNvdW50ID0gKHVpbnQ2NF90KWJsb2NrIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCWludDhfdCBldHlwZTsKKworCWlmIChibG9jayA8IDApCisJeworCQlwcmludGsoS0VSTl9FUlIgInVkZjogaW5vZGVfYm1hcDogYmxvY2sgPCAwXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIWlub2RlKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IGlub2RlX2JtYXA6IE5VTEwgaW5vZGVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJKmV4dG9mZnNldCA9IDA7CisJKmVsZW4gPSAwOworCSpibG9jID0gVURGX0lfTE9DQVRJT04oaW5vZGUpOworCisJZG8KKwl7CisJCWlmICgoZXR5cGUgPSB1ZGZfbmV4dF9hZXh0KGlub2RlLCBibG9jLCBleHRvZmZzZXQsIGVsb2MsIGVsZW4sIGJoLCAxKSkgPT0gLTEpCisJCXsKKwkJCSpvZmZzZXQgPSBiY291bnQgLSBsYmNvdW50OworCQkJVURGX0lfTEVORVhURU5UUyhpbm9kZSkgPSBsYmNvdW50OworCQkJcmV0dXJuIC0xOworCQl9CisJCWxiY291bnQgKz0gKmVsZW47CisJfSB3aGlsZSAobGJjb3VudCA8PSBiY291bnQpOworCisJKm9mZnNldCA9IGJjb3VudCArICplbGVuIC0gbGJjb3VudDsKKworCXJldHVybiBldHlwZTsKK30KKworbG9uZyB1ZGZfYmxvY2tfbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvbmcgYmxvY2spCit7CisJa2VybmVsX2xiX2FkZHIgZWxvYywgYmxvYzsKKwl1aW50MzJfdCBvZmZzZXQsIGV4dG9mZnNldCwgZWxlbjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlpbnQgcmV0OworCisJbG9ja19rZXJuZWwoKTsKKworCWlmIChpbm9kZV9ibWFwKGlub2RlLCBibG9jaywgJmJsb2MsICZleHRvZmZzZXQsICZlbG9jLCAmZWxlbiwgJm9mZnNldCwgJmJoKSA9PSAoRVhUX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpCisJCXJldCA9IHVkZl9nZXRfbGJfcGJsb2NrKGlub2RlLT5pX3NiLCBlbG9jLCBvZmZzZXQgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCWVsc2UKKwkJcmV0ID0gMDsKKworCXVubG9ja19rZXJuZWwoKTsKKwl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKworCWlmIChVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfVkFSQ09OVikpCisJCXJldHVybiB1ZGZfZml4ZWRfdG9fdmFyaWFibGUocmV0KTsKKwllbHNlCisJCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mcy91ZGYvbG93bGV2ZWwuYyBiL2ZzL3VkZi9sb3dsZXZlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYTUwODcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZGYvbG93bGV2ZWwuYwpAQCAtMCwwICsxLDc3IEBACisvKgorICogbG93bGV2ZWwuYworICoKKyAqIFBVUlBPU0UKKyAqICBMb3cgTGV2ZWwgRGV2aWNlIFJvdXRpbmVzIGZvciB0aGUgVURGIGZpbGVzeXN0ZW0KKyAqCisgKiBDT05UQUNUUworICoJRS1tYWlsIHJlZ2FyZGluZyBhbnkgcG9ydGlvbiBvZiB0aGUgTGludXggVURGIGZpbGUgc3lzdGVtIHNob3VsZCBiZQorICoJZGlyZWN0ZWQgdG8gdGhlIGRldmVsb3BtZW50IHRlYW0gbWFpbGluZyBsaXN0IChydW4gYnkgbWFqb3Jkb21vKToKKyAqCQlsaW51eF91ZGZAaHBlc2pyby5mYy5ocC5jb20KKyAqCisgKiBDT1BZUklHSFQKKyAqCVRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSAoR1BMKS4gQ29waWVzIG9mIHRoZSBHUEwgY2FuIGJlIG9idGFpbmVkIGZyb206CisgKgkJZnRwOi8vcHJlcC5haS5taXQuZWR1L3B1Yi9nbnUvR1BMCisgKglFYWNoIGNvbnRyaWJ1dGluZyBhdXRob3IgcmV0YWlucyBhbGwgcmlnaHRzIHRvIHRoZWlyIG93biB3b3JrLgorICoKKyAqICAoQykgMTk5OS0yMDAxIEJlbiBGZW5uZW1hCisgKgorICogSElTVE9SWQorICoKKyAqICAwMy8yNi85OSBibGYgIENyZWF0ZWQuCisgKi8KKworI2luY2x1ZGUgInVkZmRlY2wuaCIKKworI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nkcm9tLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L3VkZl9mcy5oPgorI2luY2x1ZGUgInVkZl9zYi5oIgorCit1bnNpZ25lZCBpbnQgCit1ZGZfZ2V0X2xhc3Rfc2Vzc2lvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBjZHJvbV9tdWx0aXNlc3Npb24gbXNfaW5mbzsKKwl1bnNpZ25lZCBpbnQgdm9sX2Rlc2Nfc3RhcnQ7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IHNiLT5zX2JkZXY7CisJaW50IGk7CisKKwl2b2xfZGVzY19zdGFydD0wOworCW1zX2luZm8uYWRkcl9mb3JtYXQ9Q0RST01fTEJBOworCWkgPSBpb2N0bF9ieV9iZGV2KGJkZXYsIENEUk9NTVVMVElTRVNTSU9OLCAodW5zaWduZWQgbG9uZykgJm1zX2luZm8pOworCisjZGVmaW5lIFdFX09CRVlfVEhFX1dSSVRURU5fU1RBTkRBUkRTIDEKKworCWlmIChpID09IDApCisJeworCQl1ZGZfZGVidWcoIlhBIGRpc2s6ICVzLCB2b2xfZGVzY19zdGFydD0lZFxuIiwKKwkJCShtc19pbmZvLnhhX2ZsYWcgPyAieWVzIiA6ICJubyIpLCBtc19pbmZvLmFkZHIubGJhKTsKKyNpZiBXRV9PQkVZX1RIRV9XUklUVEVOX1NUQU5EQVJEUworCQlpZiAobXNfaW5mby54YV9mbGFnKSAvKiBuZWNlc3NhcnkgZm9yIGEgdmFsaWQgbXNfaW5mby5hZGRyICovCisjZW5kaWYKKwkJCXZvbF9kZXNjX3N0YXJ0ID0gbXNfaW5mby5hZGRyLmxiYTsKKwl9CisJZWxzZQorCXsKKwkJdWRmX2RlYnVnKCJDRFJPTU1VTFRJU0VTU0lPTiBub3Qgc3VwcG9ydGVkOiByYz0lZFxuIiwgaSk7CisJfQorCXJldHVybiB2b2xfZGVzY19zdGFydDsKK30KKwordW5zaWduZWQgbG9uZwordWRmX2dldF9sYXN0X2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IHNiLT5zX2JkZXY7CisJdW5zaWduZWQgbG9uZyBsYmxvY2sgPSAwOworCisJaWYgKGlvY3RsX2J5X2JkZXYoYmRldiwgQ0RST01fTEFTVF9XUklUVEVOLCAodW5zaWduZWQgbG9uZykgJmxibG9jaykpCisJCWxibG9jayA9IGJkZXYtPmJkX2lub2RlLT5pX3NpemUgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisKKwlpZiAobGJsb2NrKQorCQlyZXR1cm4gbGJsb2NrIC0gMTsKKwllbHNlCisJCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvdWRmL21pc2MuYyBiL2ZzL3VkZi9taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzMjFmOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3VkZi9taXNjLmMKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKiBtaXNjLmMKKyAqCisgKiBQVVJQT1NFCisgKglNaXNjZWxsYW5lb3VzIHJvdXRpbmVzIGZvciB0aGUgT1NUQS1VREYodG0pIGZpbGVzeXN0ZW0uCisgKgorICogQ09OVEFDVFMKKyAqCUUtbWFpbCByZWdhcmRpbmcgYW55IHBvcnRpb24gb2YgdGhlIExpbnV4IFVERiBmaWxlIHN5c3RlbSBzaG91bGQgYmUKKyAqCWRpcmVjdGVkIHRvIHRoZSBkZXZlbG9wbWVudCB0ZWFtIG1haWxpbmcgbGlzdCAocnVuIGJ5IG1ham9yZG9tbyk6CisgKgkJbGludXhfdWRmQGhwZXNqcm8uZmMuaHAuY29tCisgKgorICogQ09QWVJJR0hUCisgKglUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgKEdQTCkuIENvcGllcyBvZiB0aGUgR1BMIGNhbiBiZSBvYnRhaW5lZCBmcm9tOgorICoJCWZ0cDovL3ByZXAuYWkubWl0LmVkdS9wdWIvZ251L0dQTAorICoJRWFjaCBjb250cmlidXRpbmcgYXV0aG9yIHJldGFpbnMgYWxsIHJpZ2h0cyB0byB0aGVpciBvd24gd29yay4KKyAqCisgKiAgKEMpIDE5OTggRGF2ZSBCb3ludG9uCisgKiAgKEMpIDE5OTgtMjAwNCBCZW4gRmVubmVtYQorICogIChDKSAxOTk5LTIwMDAgU3RlbGlhcyBDb21wdXRpbmcgSW5jCisgKgorICogSElTVE9SWQorICoKKyAqICAwNC8xOS85OSBibGYgIHBhcnRpYWwgc3VwcG9ydCBmb3IgcmVhZGluZy93cml0aW5nIHNwZWNpZmljIEVBJ3MKKyAqLworCisjaW5jbHVkZSAidWRmZGVjbC5oIgorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC91ZGZfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisjaW5jbHVkZSAidWRmX2kuaCIKKyNpbmNsdWRlICJ1ZGZfc2IuaCIKKworc3RydWN0IGJ1ZmZlcl9oZWFkICoKK3VkZl90Z2V0YmxrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBibG9jaykKK3sKKwlpZiAoVURGX1FVRVJZX0ZMQUcoc2IsIFVERl9GTEFHX1ZBUkNPTlYpKQorCQlyZXR1cm4gc2JfZ2V0YmxrKHNiLCB1ZGZfZml4ZWRfdG9fdmFyaWFibGUoYmxvY2spKTsKKwllbHNlCisJCXJldHVybiBzYl9nZXRibGsoc2IsIGJsb2NrKTsKK30KKworc3RydWN0IGJ1ZmZlcl9oZWFkICoKK3VkZl90cmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgYmxvY2spCit7CisJaWYgKFVERl9RVUVSWV9GTEFHKHNiLCBVREZfRkxBR19WQVJDT05WKSkKKwkJcmV0dXJuIHNiX2JyZWFkKHNiLCB1ZGZfZml4ZWRfdG9fdmFyaWFibGUoYmxvY2spKTsKKwllbHNlCisJCXJldHVybiBzYl9icmVhZChzYiwgYmxvY2spOworfQorCitzdHJ1Y3QgZ2VuZXJpY0Zvcm1hdCAqCit1ZGZfYWRkX2V4dGVuZGVkYXR0cihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgdHlwZSwKKwl1aW50OF90IGxvYykKK3sKKwl1aW50OF90ICplYSA9IE5VTEwsICphZCA9IE5VTEw7CisJaW50IG9mZnNldDsKKwl1aW50MTZfdCBjcmNsZW47CisJaW50IGk7CisKKwllYSA9IFVERl9JX0RBVEEoaW5vZGUpOworCWlmIChVREZfSV9MRU5FQVRUUihpbm9kZSkpCisJCWFkID0gVURGX0lfREFUQShpbm9kZSkgKyBVREZfSV9MRU5FQVRUUihpbm9kZSk7CisJZWxzZQorCXsKKwkJYWQgPSBlYTsKKwkJc2l6ZSArPSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkQXR0ckhlYWRlckRlc2MpOworCX0KKworCW9mZnNldCA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChpbm9kZSkgLQorCQlVREZfSV9MRU5BTExPQyhpbm9kZSk7CisKKwkvKiBUT0RPIC0gQ2hlY2sgZm9yIEZyZWVFQVNwYWNlICovCisKKwlpZiAobG9jICYgMHgwMSAmJiBvZmZzZXQgPj0gc2l6ZSkKKwl7CisJCXN0cnVjdCBleHRlbmRlZEF0dHJIZWFkZXJEZXNjICplYWhkOworCQllYWhkID0gKHN0cnVjdCBleHRlbmRlZEF0dHJIZWFkZXJEZXNjICopZWE7CisKKwkJaWYgKFVERl9JX0xFTkFMTE9DKGlub2RlKSkKKwkJeworCQkJbWVtbW92ZSgmYWRbc2l6ZV0sIGFkLCBVREZfSV9MRU5BTExPQyhpbm9kZSkpOworCQl9CisKKwkJaWYgKFVERl9JX0xFTkVBVFRSKGlub2RlKSkKKwkJeworCQkJLyogY2hlY2sgY2hlY2tzdW0vY3JjICovCisJCQlpZiAobGUxNl90b19jcHUoZWFoZC0+ZGVzY1RhZy50YWdJZGVudCkgIT0gVEFHX0lERU5UX0VBSEQgfHwKKwkJCQlsZTMyX3RvX2NwdShlYWhkLT5kZXNjVGFnLnRhZ0xvY2F0aW9uKSAhPSBVREZfSV9MT0NBVElPTihpbm9kZSkubG9naWNhbEJsb2NrTnVtKQorCQkJeworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJc2l6ZSAtPSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkQXR0ckhlYWRlckRlc2MpOworCQkJVURGX0lfTEVORUFUVFIoaW5vZGUpICs9IHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRBdHRySGVhZGVyRGVzYyk7CisJCQllYWhkLT5kZXNjVGFnLnRhZ0lkZW50ID0gY3B1X3RvX2xlMTYoVEFHX0lERU5UX0VBSEQpOworCQkJaWYgKFVERl9TQl9VREZSRVYoaW5vZGUtPmlfc2IpID49IDB4MDIwMCkKKwkJCQllYWhkLT5kZXNjVGFnLmRlc2NWZXJzaW9uID0gY3B1X3RvX2xlMTYoMyk7CisJCQllbHNlCisJCQkJZWFoZC0+ZGVzY1RhZy5kZXNjVmVyc2lvbiA9IGNwdV90b19sZTE2KDIpOworCQkJZWFoZC0+ZGVzY1RhZy50YWdTZXJpYWxOdW0gPSBjcHVfdG9fbGUxNihVREZfU0JfU0VSSUFMTlVNKGlub2RlLT5pX3NiKSk7CisJCQllYWhkLT5kZXNjVGFnLnRhZ0xvY2F0aW9uID0gY3B1X3RvX2xlMzIoVURGX0lfTE9DQVRJT04oaW5vZGUpLmxvZ2ljYWxCbG9ja051bSk7CisJCQllYWhkLT5pbXBBdHRyTG9jYXRpb24gPSBjcHVfdG9fbGUzMigweEZGRkZGRkZGKTsKKwkJCWVhaGQtPmFwcEF0dHJMb2NhdGlvbiA9IGNwdV90b19sZTMyKDB4RkZGRkZGRkYpOworCQl9CisKKwkJb2Zmc2V0ID0gVURGX0lfTEVORUFUVFIoaW5vZGUpOworCQlpZiAodHlwZSA8IDIwNDgpCisJCXsKKwkJCWlmIChsZTMyX3RvX2NwdShlYWhkLT5hcHBBdHRyTG9jYXRpb24pIDwgVURGX0lfTEVORUFUVFIoaW5vZGUpKQorCQkJeworCQkJCXVpbnQzMl90IGFhbCA9IGxlMzJfdG9fY3B1KGVhaGQtPmFwcEF0dHJMb2NhdGlvbik7CisJCQkJbWVtbW92ZSgmZWFbb2Zmc2V0IC0gYWFsICsgc2l6ZV0sCisJCQkJCSZlYVthYWxdLCBvZmZzZXQgLSBhYWwpOworCQkJCW9mZnNldCAtPSBhYWw7CisJCQkJZWFoZC0+YXBwQXR0ckxvY2F0aW9uID0gY3B1X3RvX2xlMzIoYWFsICsgc2l6ZSk7CisJCQl9CisJCQlpZiAobGUzMl90b19jcHUoZWFoZC0+aW1wQXR0ckxvY2F0aW9uKSA8IFVERl9JX0xFTkVBVFRSKGlub2RlKSkKKwkJCXsKKwkJCQl1aW50MzJfdCBpYWwgPSBsZTMyX3RvX2NwdShlYWhkLT5pbXBBdHRyTG9jYXRpb24pOworCQkJCW1lbW1vdmUoJmVhW29mZnNldCAtIGlhbCArIHNpemVdLAorCQkJCQkmZWFbaWFsXSwgb2Zmc2V0IC0gaWFsKTsKKwkJCQlvZmZzZXQgLT0gaWFsOworCQkJCWVhaGQtPmltcEF0dHJMb2NhdGlvbiA9IGNwdV90b19sZTMyKGlhbCArIHNpemUpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKHR5cGUgPCA2NTUzNikKKwkJeworCQkJaWYgKGxlMzJfdG9fY3B1KGVhaGQtPmFwcEF0dHJMb2NhdGlvbikgPCBVREZfSV9MRU5FQVRUUihpbm9kZSkpCisJCQl7CisJCQkJdWludDMyX3QgYWFsID0gbGUzMl90b19jcHUoZWFoZC0+YXBwQXR0ckxvY2F0aW9uKTsKKwkJCQltZW1tb3ZlKCZlYVtvZmZzZXQgLSBhYWwgKyBzaXplXSwKKwkJCQkJJmVhW2FhbF0sIG9mZnNldCAtIGFhbCk7CisJCQkJb2Zmc2V0IC09IGFhbDsKKwkJCQllYWhkLT5hcHBBdHRyTG9jYXRpb24gPSBjcHVfdG9fbGUzMihhYWwgKyBzaXplKTsKKwkJCX0KKwkJfQorCQkvKiByZXdyaXRlIENSQyArIGNoZWNrc3VtIG9mIGVhaGQgKi8KKwkJY3JjbGVuID0gc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEF0dHJIZWFkZXJEZXNjKSAtIHNpemVvZih0YWcpOworCQllYWhkLT5kZXNjVGFnLmRlc2NDUkNMZW5ndGggPSBjcHVfdG9fbGUxNihjcmNsZW4pOworCQllYWhkLT5kZXNjVGFnLmRlc2NDUkMgPSBjcHVfdG9fbGUxNih1ZGZfY3JjKChjaGFyICopZWFoZCArIHNpemVvZih0YWcpLCBjcmNsZW4sIDApKTsKKwkJZWFoZC0+ZGVzY1RhZy50YWdDaGVja3N1bSA9IDA7CisJCWZvciAoaT0wOyBpPDE2OyBpKyspCisJCQlpZiAoaSAhPSA0KQorCQkJCWVhaGQtPmRlc2NUYWcudGFnQ2hlY2tzdW0gKz0gKCh1aW50OF90ICopJihlYWhkLT5kZXNjVGFnKSlbaV07CisJCVVERl9JX0xFTkVBVFRSKGlub2RlKSArPSBzaXplOworCQlyZXR1cm4gKHN0cnVjdCBnZW5lcmljRm9ybWF0ICopJmVhW29mZnNldF07CisJfQorCWlmIChsb2MgJiAweDAyKQorCXsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBnZW5lcmljRm9ybWF0ICoKK3VkZl9nZXRfZXh0ZW5kZWRhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVpbnQzMl90IHR5cGUsIHVpbnQ4X3Qgc3VidHlwZSkKK3sKKwlzdHJ1Y3QgZ2VuZXJpY0Zvcm1hdCAqZ2FmOworCXVpbnQ4X3QgKmVhID0gTlVMTDsKKwl1aW50MzJfdCBvZmZzZXQ7CisKKwllYSA9IFVERl9JX0RBVEEoaW5vZGUpOworCisJaWYgKFVERl9JX0xFTkVBVFRSKGlub2RlKSkKKwl7CisJCXN0cnVjdCBleHRlbmRlZEF0dHJIZWFkZXJEZXNjICplYWhkOworCQllYWhkID0gKHN0cnVjdCBleHRlbmRlZEF0dHJIZWFkZXJEZXNjICopZWE7CisKKwkJLyogY2hlY2sgY2hlY2tzdW0vY3JjICovCisJCWlmIChsZTE2X3RvX2NwdShlYWhkLT5kZXNjVGFnLnRhZ0lkZW50KSAhPSBUQUdfSURFTlRfRUFIRCB8fAorCQkJbGUzMl90b19jcHUoZWFoZC0+ZGVzY1RhZy50YWdMb2NhdGlvbikgIT0gVURGX0lfTE9DQVRJT04oaW5vZGUpLmxvZ2ljYWxCbG9ja051bSkKKwkJeworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkKKwkJaWYgKHR5cGUgPCAyMDQ4KQorCQkJb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEF0dHJIZWFkZXJEZXNjKTsKKwkJZWxzZSBpZiAodHlwZSA8IDY1NTM2KQorCQkJb2Zmc2V0ID0gbGUzMl90b19jcHUoZWFoZC0+aW1wQXR0ckxvY2F0aW9uKTsKKwkJZWxzZQorCQkJb2Zmc2V0ID0gbGUzMl90b19jcHUoZWFoZC0+YXBwQXR0ckxvY2F0aW9uKTsKKworCQl3aGlsZSAob2Zmc2V0IDwgVURGX0lfTEVORUFUVFIoaW5vZGUpKQorCQl7CisJCQlnYWYgPSAoc3RydWN0IGdlbmVyaWNGb3JtYXQgKikmZWFbb2Zmc2V0XTsKKwkJCWlmIChsZTMyX3RvX2NwdShnYWYtPmF0dHJUeXBlKSA9PSB0eXBlICYmIGdhZi0+YXR0clN1YnR5cGUgPT0gc3VidHlwZSkKKwkJCQlyZXR1cm4gZ2FmOworCQkJZWxzZQorCQkJCW9mZnNldCArPSBsZTMyX3RvX2NwdShnYWYtPmF0dHJMZW5ndGgpOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogdWRmX3JlYWRfdGFnZ2VkCisgKgorICogUFVSUE9TRQorICoJUmVhZCB0aGUgZmlyc3QgYmxvY2sgb2YgYSB0YWdnZWQgZGVzY3JpcHRvci4KKyAqCisgKiBISVNUT1JZCisgKglKdWx5IDEsIDE5OTcgLSBBbmRyZXcgRS4gTWlsZXNraQorICoJV3JpdHRlbiwgdGVzdGVkLCBhbmQgcmVsZWFzZWQuCisgKi8KK3N0cnVjdCBidWZmZXJfaGVhZCAqCit1ZGZfcmVhZF90YWdnZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdWludDMyX3QgYmxvY2ssIHVpbnQzMl90IGxvY2F0aW9uLCB1aW50MTZfdCAqaWRlbnQpCit7CisJdGFnICp0YWdfcDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlyZWdpc3RlciB1aW50OF90IGNoZWNrc3VtOworCXJlZ2lzdGVyIGludCBpOworCisJLyogUmVhZCB0aGUgYmxvY2sgKi8KKwlpZiAoYmxvY2sgPT0gMHhGRkZGRkZGRikKKwkJcmV0dXJuIE5VTEw7CisKKwliaCA9IHVkZl90cmVhZChzYiwgYmxvY2sgKyBVREZfU0JfU0VTU0lPTihzYikpOworCWlmICghYmgpCisJeworCQl1ZGZfZGVidWcoImJsb2NrPSVkLCBsb2NhdGlvbj0lZDogcmVhZCBmYWlsZWRcbiIsIGJsb2NrICsgVURGX1NCX1NFU1NJT04oc2IpLCBsb2NhdGlvbik7CisJCXJldHVybiBOVUxMOworCX0KKworCXRhZ19wID0gKHRhZyAqKShiaC0+Yl9kYXRhKTsKKworCSppZGVudCA9IGxlMTZfdG9fY3B1KHRhZ19wLT50YWdJZGVudCk7CisKKwlpZiAoIGxvY2F0aW9uICE9IGxlMzJfdG9fY3B1KHRhZ19wLT50YWdMb2NhdGlvbikgKQorCXsKKwkJdWRmX2RlYnVnKCJsb2NhdGlvbiBtaXNtYXRjaCBibG9jayAldSwgdGFnICV1ICE9ICV1XG4iLAorCQkJYmxvY2sgKyBVREZfU0JfU0VTU0lPTihzYiksIGxlMzJfdG9fY3B1KHRhZ19wLT50YWdMb2NhdGlvbiksIGxvY2F0aW9uKTsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCQorCS8qIFZlcmlmeSB0aGUgdGFnIGNoZWNrc3VtICovCisJY2hlY2tzdW0gPSAwVTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQljaGVja3N1bSArPSAodWludDhfdCkoYmgtPmJfZGF0YVtpXSk7CisJZm9yIChpID0gNTsgaSA8IDE2OyBpKyspCisJCWNoZWNrc3VtICs9ICh1aW50OF90KShiaC0+Yl9kYXRhW2ldKTsKKwlpZiAoY2hlY2tzdW0gIT0gdGFnX3AtPnRhZ0NoZWNrc3VtKSB7CisJCXByaW50ayhLRVJOX0VSUiAidWRmOiB0YWcgY2hlY2tzdW0gZmFpbGVkIGJsb2NrICVkXG4iLCBibG9jayk7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKworCS8qIFZlcmlmeSB0aGUgdGFnIHZlcnNpb24gKi8KKwlpZiAobGUxNl90b19jcHUodGFnX3AtPmRlc2NWZXJzaW9uKSAhPSAweDAwMDJVICYmCisJCWxlMTZfdG9fY3B1KHRhZ19wLT5kZXNjVmVyc2lvbikgIT0gMHgwMDAzVSkKKwl7CisJCXVkZl9kZWJ1ZygidGFnIHZlcnNpb24gMHglMDR4ICE9IDB4MDAwMiB8fCAweDAwMDMgYmxvY2sgJWRcbiIsCisJCQlsZTE2X3RvX2NwdSh0YWdfcC0+ZGVzY1ZlcnNpb24pLCBibG9jayk7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKworCS8qIFZlcmlmeSB0aGUgZGVzY3JpcHRvciBDUkMgKi8KKwlpZiAobGUxNl90b19jcHUodGFnX3AtPmRlc2NDUkNMZW5ndGgpICsgc2l6ZW9mKHRhZykgPiBzYi0+c19ibG9ja3NpemUgfHwKKwkJbGUxNl90b19jcHUodGFnX3AtPmRlc2NDUkMpID09IHVkZl9jcmMoYmgtPmJfZGF0YSArIHNpemVvZih0YWcpLAorCQkJbGUxNl90b19jcHUodGFnX3AtPmRlc2NDUkNMZW5ndGgpLCAwKSkKKwl7CisJCXJldHVybiBiaDsKKwl9CisJdWRmX2RlYnVnKCJDcmMgZmFpbHVyZSBibG9jayAlZDogY3JjID0gJWQsIGNyY2xlbiA9ICVkXG4iLAorCQlibG9jayArIFVERl9TQl9TRVNTSU9OKHNiKSwgbGUxNl90b19jcHUodGFnX3AtPmRlc2NDUkMpLCBsZTE2X3RvX2NwdSh0YWdfcC0+ZGVzY0NSQ0xlbmd0aCkpOworCitlcnJvcl9vdXQ6CisJYnJlbHNlKGJoKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGJ1ZmZlcl9oZWFkICoKK3VkZl9yZWFkX3B0YWdnZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwga2VybmVsX2xiX2FkZHIgbG9jLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQxNl90ICppZGVudCkKK3sKKwlyZXR1cm4gdWRmX3JlYWRfdGFnZ2VkKHNiLCB1ZGZfZ2V0X2xiX3BibG9jayhzYiwgbG9jLCBvZmZzZXQpLAorCQlsb2MubG9naWNhbEJsb2NrTnVtICsgb2Zmc2V0LCBpZGVudCk7Cit9CisKK3ZvaWQgdWRmX3JlbGVhc2VfZGF0YShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWlmIChiaCkKKwkJYnJlbHNlKGJoKTsKK30KKwordm9pZCB1ZGZfdXBkYXRlX3RhZyhjaGFyICpkYXRhLCBpbnQgbGVuZ3RoKQoreworCXRhZyAqdHB0ciA9ICh0YWcgKilkYXRhOworCWludCBpOworCisJbGVuZ3RoIC09IHNpemVvZih0YWcpOworCisJdHB0ci0+dGFnQ2hlY2tzdW0gPSAwOworCXRwdHItPmRlc2NDUkNMZW5ndGggPSBjcHVfdG9fbGUxNihsZW5ndGgpOworCXRwdHItPmRlc2NDUkMgPSBjcHVfdG9fbGUxNih1ZGZfY3JjKGRhdGEgKyBzaXplb2YodGFnKSwgbGVuZ3RoLCAwKSk7CisKKwlmb3IgKGk9MDsgaTwxNjsgaSsrKQorCQlpZiAoaSAhPSA0KQorCQkJdHB0ci0+dGFnQ2hlY2tzdW0gKz0gKHVpbnQ4X3QpKGRhdGFbaV0pOworfQorCit2b2lkIHVkZl9uZXdfdGFnKGNoYXIgKmRhdGEsIHVpbnQxNl90IGlkZW50LCB1aW50MTZfdCB2ZXJzaW9uLCB1aW50MTZfdCBzbnVtLAorCXVpbnQzMl90IGxvYywgaW50IGxlbmd0aCkKK3sKKwl0YWcgKnRwdHIgPSAodGFnICopZGF0YTsKKwl0cHRyLT50YWdJZGVudCA9IGNwdV90b19sZTE2KGlkZW50KTsKKwl0cHRyLT5kZXNjVmVyc2lvbiA9IGNwdV90b19sZTE2KHZlcnNpb24pOworCXRwdHItPnRhZ1NlcmlhbE51bSA9IGNwdV90b19sZTE2KHNudW0pOworCXRwdHItPnRhZ0xvY2F0aW9uID0gY3B1X3RvX2xlMzIobG9jKTsKKwl1ZGZfdXBkYXRlX3RhZyhkYXRhLCBsZW5ndGgpOworfQpkaWZmIC0tZ2l0IGEvZnMvdWRmL25hbWVpLmMgYi9mcy91ZGYvbmFtZWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjZkYzcxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvdWRmL25hbWVpLmMKQEAgLTAsMCArMSwxMzM0IEBACisvKgorICogbmFtZWkuYworICoKKyAqIFBVUlBPU0UKKyAqICAgICAgSW5vZGUgbmFtZSBoYW5kbGluZyByb3V0aW5lcyBmb3IgdGhlIE9TVEEtVURGKHRtKSBmaWxlc3lzdGVtLgorICoKKyAqIENPTlRBQ1RTCisgKiAgICAgIEUtbWFpbCByZWdhcmRpbmcgYW55IHBvcnRpb24gb2YgdGhlIExpbnV4IFVERiBmaWxlIHN5c3RlbSBzaG91bGQgYmUKKyAqICAgICAgZGlyZWN0ZWQgdG8gdGhlIGRldmVsb3BtZW50IHRlYW0gbWFpbGluZyBsaXN0IChydW4gYnkgbWFqb3Jkb21vKToKKyAqICAgICAgICAgICAgICBsaW51eF91ZGZAaHBlc2pyby5mYy5ocC5jb20KKyAqCisgKiBDT1BZUklHSFQKKyAqICAgICAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgIExpY2Vuc2UgKEdQTCkuIENvcGllcyBvZiB0aGUgR1BMIGNhbiBiZSBvYnRhaW5lZCBmcm9tOgorICogICAgICAgICAgICAgIGZ0cDovL3ByZXAuYWkubWl0LmVkdS9wdWIvZ251L0dQTAorICogICAgICBFYWNoIGNvbnRyaWJ1dGluZyBhdXRob3IgcmV0YWlucyBhbGwgcmlnaHRzIHRvIHRoZWlyIG93biB3b3JrLgorICoKKyAqICAoQykgMTk5OC0yMDA0IEJlbiBGZW5uZW1hCisgKiAgKEMpIDE5OTktMjAwMCBTdGVsaWFzIENvbXB1dGluZyBJbmMKKyAqCisgKiBISVNUT1JZCisgKgorICogIDEyLzEyLzk4IGJsZiAgQ3JlYXRlZC4gU3BsaXQgb3V0IHRoZSBsb29rdXAgY29kZSBmcm9tIGRpci5jCisgKiAgMDQvMTkvOTkgYmxmICBsaW5rLCBta25vZCwgc3ltbGluayBzdXBwb3J0CisgKi8KKworI2luY2x1ZGUgInVkZmRlY2wuaCIKKworI2luY2x1ZGUgInVkZl9pLmgiCisjaW5jbHVkZSAidWRmX3NiLmgiCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworc3RhdGljIGlubGluZSBpbnQgdWRmX21hdGNoKGludCBsZW4xLCBjb25zdCBjaGFyICpuYW1lMSwgaW50IGxlbjIsIGNvbnN0IGNoYXIgKm5hbWUyKQoreworCWlmIChsZW4xICE9IGxlbjIpCisJCXJldHVybiAwOworCXJldHVybiAhbWVtY21wKG5hbWUxLCBuYW1lMiwgbGVuMSk7Cit9CisKK2ludCB1ZGZfd3JpdGVfZmkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGVJZGVudERlc2MgKmNmaSwKKwlzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqc2ZpLCBzdHJ1Y3QgdWRmX2ZpbGVpZGVudF9iaCAqZmliaCwKKwl1aW50OF90ICppbXB1c2UsIHVpbnQ4X3QgKmZpbGVpZGVudCkKK3sKKwl1aW50MTZfdCBjcmNsZW4gPSBmaWJoLT5lb2Zmc2V0IC0gZmliaC0+c29mZnNldCAtIHNpemVvZih0YWcpOworCXVpbnQxNl90IGNyYzsKKwl1aW50OF90IGNoZWNrc3VtID0gMDsKKwlpbnQgaTsKKwlpbnQgb2Zmc2V0OworCXVpbnQxNl90IGxpdSA9IGxlMTZfdG9fY3B1KGNmaS0+bGVuZ3RoT2ZJbXBVc2UpOworCXVpbnQ4X3QgbGZpID0gY2ZpLT5sZW5ndGhGaWxlSWRlbnQ7CisJaW50IHBhZGxlbiA9IGZpYmgtPmVvZmZzZXQgLSBmaWJoLT5zb2Zmc2V0IC0gbGl1IC0gbGZpIC0KKwkJc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKTsKKwlpbnQgYWRpbmljYiA9IDA7CisKKwlpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCisJCWFkaW5pY2IgPSAxOworCisJb2Zmc2V0ID0gZmliaC0+c29mZnNldCArIHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYyk7CisKKwlpZiAoaW1wdXNlKQorCXsKKwkJaWYgKGFkaW5pY2IgfHwgKG9mZnNldCArIGxpdSA8IDApKQorCQkJbWVtY3B5KCh1aW50OF90ICopc2ZpLT5pbXBVc2UsIGltcHVzZSwgbGl1KTsKKwkJZWxzZSBpZiAob2Zmc2V0ID49IDApCisJCQltZW1jcHkoZmliaC0+ZWJoLT5iX2RhdGEgKyBvZmZzZXQsIGltcHVzZSwgbGl1KTsKKwkJZWxzZQorCQl7CisJCQltZW1jcHkoKHVpbnQ4X3QgKilzZmktPmltcFVzZSwgaW1wdXNlLCAtb2Zmc2V0KTsKKwkJCW1lbWNweShmaWJoLT5lYmgtPmJfZGF0YSwgaW1wdXNlIC0gb2Zmc2V0LCBsaXUgKyBvZmZzZXQpOworCQl9CisJfQorCisJb2Zmc2V0ICs9IGxpdTsKKworCWlmIChmaWxlaWRlbnQpCisJeworCQlpZiAoYWRpbmljYiB8fCAob2Zmc2V0ICsgbGZpIDwgMCkpCisJCQltZW1jcHkoKHVpbnQ4X3QgKilzZmktPmZpbGVJZGVudCArIGxpdSwgZmlsZWlkZW50LCBsZmkpOworCQllbHNlIGlmIChvZmZzZXQgPj0gMCkKKwkJCW1lbWNweShmaWJoLT5lYmgtPmJfZGF0YSArIG9mZnNldCwgZmlsZWlkZW50LCBsZmkpOworCQllbHNlCisJCXsKKwkJCW1lbWNweSgodWludDhfdCAqKXNmaS0+ZmlsZUlkZW50ICsgbGl1LCBmaWxlaWRlbnQsIC1vZmZzZXQpOworCQkJbWVtY3B5KGZpYmgtPmViaC0+Yl9kYXRhLCBmaWxlaWRlbnQgLSBvZmZzZXQsIGxmaSArIG9mZnNldCk7CisJCX0KKwl9CisKKwlvZmZzZXQgKz0gbGZpOworCisJaWYgKGFkaW5pY2IgfHwgKG9mZnNldCArIHBhZGxlbiA8IDApKQorCQltZW1zZXQoKHVpbnQ4X3QgKilzZmktPnBhZGRpbmcgKyBsaXUgKyBsZmksIDB4MDAsIHBhZGxlbik7CisJZWxzZSBpZiAob2Zmc2V0ID49IDApCisJCW1lbXNldChmaWJoLT5lYmgtPmJfZGF0YSArIG9mZnNldCwgMHgwMCwgcGFkbGVuKTsKKwllbHNlCisJeworCQltZW1zZXQoKHVpbnQ4X3QgKilzZmktPnBhZGRpbmcgKyBsaXUgKyBsZmksIDB4MDAsIC1vZmZzZXQpOworCQltZW1zZXQoZmliaC0+ZWJoLT5iX2RhdGEsIDB4MDAsIHBhZGxlbiArIG9mZnNldCk7CisJfQorCisJY3JjID0gdWRmX2NyYygodWludDhfdCAqKWNmaSArIHNpemVvZih0YWcpLCBzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpIC0KKwkJc2l6ZW9mKHRhZyksIDApOworCisJaWYgKGZpYmgtPnNiaCA9PSBmaWJoLT5lYmgpCisJCWNyYyA9IHVkZl9jcmMoKHVpbnQ4X3QgKilzZmktPmltcFVzZSwKKwkJCWNyY2xlbiArIHNpemVvZih0YWcpIC0gc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSwgY3JjKTsKKwllbHNlIGlmIChzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpID49IC1maWJoLT5zb2Zmc2V0KQorCQljcmMgPSB1ZGZfY3JjKGZpYmgtPmViaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSArIGZpYmgtPnNvZmZzZXQsCisJCQljcmNsZW4gKyBzaXplb2YodGFnKSAtIHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYyksIGNyYyk7CisJZWxzZQorCXsKKwkJY3JjID0gdWRmX2NyYygodWludDhfdCAqKXNmaS0+aW1wVXNlLAorCQkJLWZpYmgtPnNvZmZzZXQgLSBzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpLCBjcmMpOworCQljcmMgPSB1ZGZfY3JjKGZpYmgtPmViaC0+Yl9kYXRhLCBmaWJoLT5lb2Zmc2V0LCBjcmMpOworCX0KKworCWNmaS0+ZGVzY1RhZy5kZXNjQ1JDID0gY3B1X3RvX2xlMTYoY3JjKTsKKwljZmktPmRlc2NUYWcuZGVzY0NSQ0xlbmd0aCA9IGNwdV90b19sZTE2KGNyY2xlbik7CisKKwlmb3IgKGk9MDsgaTwxNjsgaSsrKQorCQlpZiAoaSAhPSA0KQorCQkJY2hlY2tzdW0gKz0gKCh1aW50OF90ICopJmNmaS0+ZGVzY1RhZylbaV07CisKKwljZmktPmRlc2NUYWcudGFnQ2hlY2tzdW0gPSBjaGVja3N1bTsKKwlpZiAoYWRpbmljYiB8fCAoc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSA8PSAtZmliaC0+c29mZnNldCkpCisJCW1lbWNweSgodWludDhfdCAqKXNmaSwgKHVpbnQ4X3QgKiljZmksIHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykpOworCWVsc2UKKwl7CisJCW1lbWNweSgodWludDhfdCAqKXNmaSwgKHVpbnQ4X3QgKiljZmksIC1maWJoLT5zb2Zmc2V0KTsKKwkJbWVtY3B5KGZpYmgtPmViaC0+Yl9kYXRhLCAodWludDhfdCAqKWNmaSAtIGZpYmgtPnNvZmZzZXQsCisJCQlzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpICsgZmliaC0+c29mZnNldCk7CisJfQorCisJaWYgKGFkaW5pY2IpCisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCWVsc2UKKwl7CisJCWlmIChmaWJoLT5zYmggIT0gZmliaC0+ZWJoKQorCQkJbWFya19idWZmZXJfZGlydHlfaW5vZGUoZmliaC0+ZWJoLCBpbm9kZSk7CisJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGZpYmgtPnNiaCwgaW5vZGUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlSWRlbnREZXNjICoKK3VkZl9maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJc3RydWN0IHVkZl9maWxlaWRlbnRfYmggKmZpYmgsCisJc3RydWN0IGZpbGVJZGVudERlc2MgKmNmaSkKK3sKKwlzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqZmk9TlVMTDsKKwlsb2ZmX3QgZl9wb3M7CisJaW50IGJsb2NrLCBmbGVuOworCWNoYXIgZm5hbWVbVURGX05BTUVfTEVOXTsKKwljaGFyICpuYW1lcHRyOworCXVpbnQ4X3QgbGZpOworCXVpbnQxNl90IGxpdTsKKwlsb2ZmX3Qgc2l6ZSA9ICh1ZGZfZXh0MF9vZmZzZXQoZGlyKSArIGRpci0+aV9zaXplKSA+PiAyOworCWtlcm5lbF9sYl9hZGRyIGJsb2MsIGVsb2M7CisJdWludDMyX3QgZXh0b2Zmc2V0LCBlbGVuLCBvZmZzZXQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisKKwlpZiAoIWRpcikKKwkJcmV0dXJuIE5VTEw7CisKKwlmX3BvcyA9ICh1ZGZfZXh0MF9vZmZzZXQoZGlyKSA+PiAyKTsKKworCWZpYmgtPnNvZmZzZXQgPSBmaWJoLT5lb2Zmc2V0ID0gKGZfcG9zICYgKChkaXItPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgPj4gMikpIDw8IDI7CisJaWYgKFVERl9JX0FMTE9DVFlQRShkaXIpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKKwkJZmliaC0+c2JoID0gZmliaC0+ZWJoID0gTlVMTDsKKwllbHNlIGlmIChpbm9kZV9ibWFwKGRpciwgZl9wb3MgPj4gKGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDIpLAorCQkmYmxvYywgJmV4dG9mZnNldCwgJmVsb2MsICZlbGVuLCAmb2Zmc2V0LCAmYmgpID09IChFWFRfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkKKwl7CisJCW9mZnNldCA+Pj0gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCQlibG9jayA9IHVkZl9nZXRfbGJfcGJsb2NrKGRpci0+aV9zYiwgZWxvYywgb2Zmc2V0KTsKKwkJaWYgKCgrK29mZnNldCA8PCBkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpIDwgZWxlbikKKwkJeworCQkJaWYgKFVERl9JX0FMTE9DVFlQRShkaXIpID09IElDQlRBR19GTEFHX0FEX1NIT1JUKQorCQkJCWV4dG9mZnNldCAtPSBzaXplb2Yoc2hvcnRfYWQpOworCQkJZWxzZSBpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfTE9ORykKKwkJCQlleHRvZmZzZXQgLT0gc2l6ZW9mKGxvbmdfYWQpOworCQl9CisJCWVsc2UKKwkJCW9mZnNldCA9IDA7CisKKwkJaWYgKCEoZmliaC0+c2JoID0gZmliaC0+ZWJoID0gdWRmX3RyZWFkKGRpci0+aV9zYiwgYmxvY2spKSkKKwkJeworCQkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwllbHNlCisJeworCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJd2hpbGUgKCAoZl9wb3MgPCBzaXplKSApCisJeworCQlmaSA9IHVkZl9maWxlaWRlbnRfcmVhZChkaXIsICZmX3BvcywgZmliaCwgY2ZpLCAmYmxvYywgJmV4dG9mZnNldCwgJmVsb2MsICZlbGVuLCAmb2Zmc2V0LCAmYmgpOworCisJCWlmICghZmkpCisJCXsKKwkJCWlmIChmaWJoLT5zYmggIT0gZmliaC0+ZWJoKQorCQkJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC0+ZWJoKTsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC0+c2JoKTsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlsaXUgPSBsZTE2X3RvX2NwdShjZmktPmxlbmd0aE9mSW1wVXNlKTsKKwkJbGZpID0gY2ZpLT5sZW5ndGhGaWxlSWRlbnQ7CisKKwkJaWYgKGZpYmgtPnNiaCA9PSBmaWJoLT5lYmgpCisJCXsKKwkJCW5hbWVwdHIgPSBmaS0+ZmlsZUlkZW50ICsgbGl1OworCQl9CisJCWVsc2UKKwkJeworCQkJaW50IHBvZmZzZXQ7CS8qIFVucGFkZWQgZW5kaW5nIG9mZnNldCAqLworCisJCQlwb2Zmc2V0ID0gZmliaC0+c29mZnNldCArIHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykgKyBsaXUgKyBsZmk7CisKKwkJCWlmIChwb2Zmc2V0ID49IGxmaSkKKwkJCQluYW1lcHRyID0gKHVpbnQ4X3QgKikoZmliaC0+ZWJoLT5iX2RhdGEgKyBwb2Zmc2V0IC0gbGZpKTsKKwkJCWVsc2UKKwkJCXsKKwkJCQluYW1lcHRyID0gZm5hbWU7CisJCQkJbWVtY3B5KG5hbWVwdHIsIGZpLT5maWxlSWRlbnQgKyBsaXUsIGxmaSAtIHBvZmZzZXQpOworCQkJCW1lbWNweShuYW1lcHRyICsgbGZpIC0gcG9mZnNldCwgZmliaC0+ZWJoLT5iX2RhdGEsIHBvZmZzZXQpOworCQkJfQorCQl9CisKKwkJaWYgKCAoY2ZpLT5maWxlQ2hhcmFjdGVyaXN0aWNzICYgRklEX0ZJTEVfQ0hBUl9ERUxFVEVEKSAhPSAwICkKKwkJeworCQkJaWYgKCAhVURGX1FVRVJZX0ZMQUcoZGlyLT5pX3NiLCBVREZfRkxBR19VTkRFTEVURSkgKQorCQkJCWNvbnRpbnVlOworCQl9CisJICAgIAorCQlpZiAoIChjZmktPmZpbGVDaGFyYWN0ZXJpc3RpY3MgJiBGSURfRklMRV9DSEFSX0hJRERFTikgIT0gMCApCisJCXsKKwkJCWlmICggIVVERl9RVUVSWV9GTEFHKGRpci0+aV9zYiwgVURGX0ZMQUdfVU5ISURFKSApCisJCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIWxmaSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgoZmxlbiA9IHVkZl9nZXRfZmlsZW5hbWUoZGlyLT5pX3NiLCBuYW1lcHRyLCBmbmFtZSwgbGZpKSkpCisJCXsKKwkJCWlmICh1ZGZfbWF0Y2goZmxlbiwgZm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSkpCisJCQl7CisJCQkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCQkJcmV0dXJuIGZpOworCQkJfQorCQl9CisJfQorCWlmIChmaWJoLT5zYmggIT0gZmliaC0+ZWJoKQorCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmgtPmViaCk7CisJdWRmX3JlbGVhc2VfZGF0YShmaWJoLT5zYmgpOworCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogdWRmX2xvb2t1cAorICoKKyAqIFBVUlBPU0UKKyAqCUxvb2stdXAgdGhlIGlub2RlIGZvciBhIGdpdmVuIG5hbWUuCisgKgorICogREVTQ1JJUFRJT04KKyAqCVJlcXVpcmVkIC0gbG9va3VwX2RlbnRyeSgpIHdpbGwgcmV0dXJuIC1FTk9URElSIGlmIHRoaXMgcm91dGluZSBpcyBub3QKKyAqCWF2YWlsYWJsZSBmb3IgYSBkaXJlY3RvcnkuIFRoZSBmaWxlc3lzdGVtIGlzIHVzZWxlc3MgaWYgdGhpcyByb3V0aW5lIGlzCisgKglub3QgYXZhaWxhYmxlIGZvciBhdCBsZWFzdCB0aGUgZmlsZXN5c3RlbSdzIHJvb3QgZGlyZWN0b3J5LgorICoKKyAqCVRoaXMgcm91dGluZSBpcyBwYXNzZWQgYW4gaW5jb21wbGV0ZSBkZW50cnkgLSBpdCBtdXN0IGJlIGNvbXBsZXRlZCBieQorICoJY2FsbGluZyBkX2FkZChkZW50cnksIGlub2RlKS4gSWYgdGhlIG5hbWUgZG9lcyBub3QgZXhpc3QsIHRoZW4gdGhlCisgKglzcGVjaWZpZWQgaW5vZGUgbXVzdCBiZSBzZXQgdG8gbnVsbC4gQW4gZXJyb3Igc2hvdWxkIG9ubHkgYmUgcmV0dXJuZWQKKyAqCXdoZW4gdGhlIGxvb2t1cCBmYWlscyBmb3IgYSByZWFzb24gb3RoZXIgdGhhbiB0aGUgbmFtZSBub3QgZXhpc3RpbmcuCisgKglOb3RlIHRoYXQgdGhlIGRpcmVjdG9yeSBpbm9kZSBzZW1hcGhvcmUgaXMgaGVsZCBkdXJpbmcgdGhlIGNhbGwuCisgKgorICoJUmVmZXIgdG8gbG9va3VwX2RlbnRyeSgpIGluIGZzL25hbWVpLmMKKyAqCWxvb2t1cF9kZW50cnkoKSAtPiBsb29rdXAoKSAtPiByZWFsX2xvb2t1cCgpIC0+IC4KKyAqCisgKiBQUkUtQ09ORElUSU9OUworICoJZGlyCQkJUG9pbnRlciB0byBpbm9kZSBvZiBwYXJlbnQgZGlyZWN0b3J5LgorICoJZGVudHJ5CQkJUG9pbnRlciB0byBkZW50cnkgdG8gY29tcGxldGUuCisgKgluZAkJCVBvaW50ZXIgdG8gbG9va3VwIG5hbWVpZGF0YQorICoKKyAqIFBPU1QtQ09ORElUSU9OUworICoJPHJldHVybj4JCVplcm8gb24gc3VjY2Vzcy4KKyAqCisgKiBISVNUT1JZCisgKglKdWx5IDEsIDE5OTcgLSBBbmRyZXcgRS4gTWlsZXNraQorICoJV3JpdHRlbiwgdGVzdGVkLCBhbmQgcmVsZWFzZWQuCisgKi8KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKgordWRmX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlzdHJ1Y3QgZmlsZUlkZW50RGVzYyBjZmksICpmaTsKKwlzdHJ1Y3QgdWRmX2ZpbGVpZGVudF9iaCBmaWJoOworCisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IFVERl9OQU1FX0xFTi0yKQorCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKKworCWxvY2tfa2VybmVsKCk7CisjaWZkZWYgVURGX1JFQ09WRVJZCisJLyogdGVtcG9yYXJ5IHNob3J0aGFuZCBmb3Igc3BlY2lmeWluZyBmaWxlcyBieSBpbm9kZSBudW1iZXIgKi8KKwlpZiAoIXN0cm5jbXAoZGVudHJ5LT5kX25hbWUubmFtZSwgIi5CPSIsIDMpICkKKwl7CisJCWtlcm5lbF9sYl9hZGRyIGxiID0geyAwLCBzaW1wbGVfc3RydG91bChkZW50cnktPmRfbmFtZS5uYW1lKzMsIE5VTEwsIDApIH07CisJCWlub2RlID0gdWRmX2lnZXQoZGlyLT5pX3NiLCBsYik7CisJCWlmICghaW5vZGUpCisJCXsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCQl9CisJfQorCWVsc2UKKyNlbmRpZiAvKiBVREZfUkVDT1ZFUlkgKi8KKworCWlmICgoZmkgPSB1ZGZfZmluZF9lbnRyeShkaXIsIGRlbnRyeSwgJmZpYmgsICZjZmkpKSkKKwl7CisJCWlmIChmaWJoLnNiaCAhPSBmaWJoLmViaCkKKwkJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5lYmgpOworCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmguc2JoKTsKKworCQlpbm9kZSA9IHVkZl9pZ2V0KGRpci0+aV9zYiwgbGVsYl90b19jcHUoY2ZpLmljYi5leHRMb2NhdGlvbikpOworCQlpZiAoICFpbm9kZSApCisJCXsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCQl9CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlSWRlbnREZXNjICoKK3VkZl9hZGRfZW50cnkoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwlzdHJ1Y3QgdWRmX2ZpbGVpZGVudF9iaCAqZmliaCwKKwlzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqY2ZpLCBpbnQgKmVycikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBmaWxlSWRlbnREZXNjICpmaT1OVUxMOworCWNoYXIgbmFtZVtVREZfTkFNRV9MRU5dLCBmbmFtZVtVREZfTkFNRV9MRU5dOworCWludCBuYW1lbGVuOworCWxvZmZfdCBmX3BvczsKKwlpbnQgZmxlbjsKKwljaGFyICpuYW1lcHRyOworCWxvZmZfdCBzaXplID0gKHVkZl9leHQwX29mZnNldChkaXIpICsgZGlyLT5pX3NpemUpID4+IDI7CisJaW50IG5maWRsZW47CisJdWludDhfdCBsZmk7CisJdWludDE2X3QgbGl1OworCWludCBibG9jazsKKwlrZXJuZWxfbGJfYWRkciBibG9jLCBlbG9jOworCXVpbnQzMl90IGV4dG9mZnNldCwgZWxlbiwgb2Zmc2V0OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCisJc2IgPSBkaXItPmlfc2I7CisKKwlpZiAoZGVudHJ5KQorCXsKKwkJaWYgKCFkZW50cnktPmRfbmFtZS5sZW4pCisJCXsKKwkJCSplcnIgPSAtRUlOVkFMOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlpZiAoICEobmFtZWxlbiA9IHVkZl9wdXRfZmlsZW5hbWUoc2IsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIG5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbikpKQorCQl7CisJCQkqZXJyID0gLUVOQU1FVE9PTE9ORzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCWVsc2UKKwkJbmFtZWxlbiA9IDA7CisKKwluZmlkbGVuID0gKHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykgKyBuYW1lbGVuICsgMykgJiB+MzsKKworCWZfcG9zID0gKHVkZl9leHQwX29mZnNldChkaXIpID4+IDIpOworCisJZmliaC0+c29mZnNldCA9IGZpYmgtPmVvZmZzZXQgPSAoZl9wb3MgJiAoKGRpci0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PiAyKSkgPDwgMjsKKwlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQorCQlmaWJoLT5zYmggPSBmaWJoLT5lYmggPSBOVUxMOworCWVsc2UgaWYgKGlub2RlX2JtYXAoZGlyLCBmX3BvcyA+PiAoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gMiksCisJCSZibG9jLCAmZXh0b2Zmc2V0LCAmZWxvYywgJmVsZW4sICZvZmZzZXQsICZiaCkgPT0gKEVYVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKQorCXsKKwkJb2Zmc2V0ID4+PSBkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCWJsb2NrID0gdWRmX2dldF9sYl9wYmxvY2soZGlyLT5pX3NiLCBlbG9jLCBvZmZzZXQpOworCQlpZiAoKCsrb2Zmc2V0IDw8IGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cykgPCBlbGVuKQorCQl7CisJCQlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCisJCQkJZXh0b2Zmc2V0IC09IHNpemVvZihzaG9ydF9hZCk7CisJCQllbHNlIGlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQorCQkJCWV4dG9mZnNldCAtPSBzaXplb2YobG9uZ19hZCk7CisJCX0KKwkJZWxzZQorCQkJb2Zmc2V0ID0gMDsKKworCQlpZiAoIShmaWJoLT5zYmggPSBmaWJoLT5lYmggPSB1ZGZfdHJlYWQoZGlyLT5pX3NiLCBibG9jaykpKQorCQl7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJCSplcnIgPSAtRUlPOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlibG9jayA9IFVERl9JX0xPQ0FUSU9OKGRpcikubG9naWNhbEJsb2NrTnVtOworCisJfQorCWVsc2UKKwl7CisJCWJsb2NrID0gdWRmX2dldF9sYl9wYmxvY2soZGlyLT5pX3NiLCBVREZfSV9MT0NBVElPTihkaXIpLCAwKTsKKwkJZmliaC0+c2JoID0gZmliaC0+ZWJoID0gTlVMTDsKKwkJZmliaC0+c29mZnNldCA9IGZpYmgtPmVvZmZzZXQgPSBzYi0+c19ibG9ja3NpemU7CisJCWdvdG8gYWRkOworCX0KKworCXdoaWxlICggKGZfcG9zIDwgc2l6ZSkgKQorCXsKKwkJZmkgPSB1ZGZfZmlsZWlkZW50X3JlYWQoZGlyLCAmZl9wb3MsIGZpYmgsIGNmaSwgJmJsb2MsICZleHRvZmZzZXQsICZlbG9jLCAmZWxlbiwgJm9mZnNldCwgJmJoKTsKKworCQlpZiAoIWZpKQorCQl7CisJCQlpZiAoZmliaC0+c2JoICE9IGZpYmgtPmViaCkKKwkJCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmgtPmViaCk7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmgtPnNiaCk7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJCSplcnIgPSAtRUlPOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlsaXUgPSBsZTE2X3RvX2NwdShjZmktPmxlbmd0aE9mSW1wVXNlKTsKKwkJbGZpID0gY2ZpLT5sZW5ndGhGaWxlSWRlbnQ7CisKKwkJaWYgKGZpYmgtPnNiaCA9PSBmaWJoLT5lYmgpCisJCQluYW1lcHRyID0gZmktPmZpbGVJZGVudCArIGxpdTsKKwkJZWxzZQorCQl7CisJCQlpbnQgcG9mZnNldDsJLyogVW5wYWRlZCBlbmRpbmcgb2Zmc2V0ICovCisKKwkJCXBvZmZzZXQgPSBmaWJoLT5zb2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSArIGxpdSArIGxmaTsKKworCQkJaWYgKHBvZmZzZXQgPj0gbGZpKQorCQkJCW5hbWVwdHIgPSAoY2hhciAqKShmaWJoLT5lYmgtPmJfZGF0YSArIHBvZmZzZXQgLSBsZmkpOworCQkJZWxzZQorCQkJeworCQkJCW5hbWVwdHIgPSBmbmFtZTsKKwkJCQltZW1jcHkobmFtZXB0ciwgZmktPmZpbGVJZGVudCArIGxpdSwgbGZpIC0gcG9mZnNldCk7CisJCQkJbWVtY3B5KG5hbWVwdHIgKyBsZmkgLSBwb2Zmc2V0LCBmaWJoLT5lYmgtPmJfZGF0YSwgcG9mZnNldCk7CisJCQl9CisJCX0KKworCQlpZiAoIChjZmktPmZpbGVDaGFyYWN0ZXJpc3RpY3MgJiBGSURfRklMRV9DSEFSX0RFTEVURUQpICE9IDAgKQorCQl7CisJCQlpZiAoKChzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpICsgbGl1ICsgbGZpICsgMykgJiB+MykgPT0gbmZpZGxlbikKKwkJCXsKKwkJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJCQljZmktPmRlc2NUYWcudGFnU2VyaWFsTnVtID0gY3B1X3RvX2xlMTYoMSk7CisJCQkJY2ZpLT5maWxlVmVyc2lvbk51bSA9IGNwdV90b19sZTE2KDEpOworCQkJCWNmaS0+ZmlsZUNoYXJhY3RlcmlzdGljcyA9IDA7CisJCQkJY2ZpLT5sZW5ndGhGaWxlSWRlbnQgPSBuYW1lbGVuOworCQkJCWNmaS0+bGVuZ3RoT2ZJbXBVc2UgPSBjcHVfdG9fbGUxNigwKTsKKwkJCQlpZiAoIXVkZl93cml0ZV9maShkaXIsIGNmaSwgZmksIGZpYmgsIE5VTEwsIG5hbWUpKQorCQkJCQlyZXR1cm4gZmk7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJKmVyciA9IC1FSU87CisJCQkJCXJldHVybiBOVUxMOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICghbGZpIHx8ICFkZW50cnkpCisJCQljb250aW51ZTsKKworCQlpZiAoKGZsZW4gPSB1ZGZfZ2V0X2ZpbGVuYW1lKGRpci0+aV9zYiwgbmFtZXB0ciwgZm5hbWUsIGxmaSkpICYmCisJCQl1ZGZfbWF0Y2goZmxlbiwgZm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSkpCisJCXsKKwkJCWlmIChmaWJoLT5zYmggIT0gZmliaC0+ZWJoKQorCQkJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC0+ZWJoKTsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC0+c2JoKTsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQkJKmVyciA9IC1FRVhJU1Q7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworYWRkOgorCWZfcG9zICs9IG5maWRsZW47CisKKwlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCICYmCisJCXNiLT5zX2Jsb2Nrc2l6ZSAtIGZpYmgtPmVvZmZzZXQgPCBuZmlkbGVuKQorCXsKKwkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCWJoID0gTlVMTDsKKwkJZmliaC0+c29mZnNldCAtPSB1ZGZfZXh0MF9vZmZzZXQoZGlyKTsKKwkJZmliaC0+ZW9mZnNldCAtPSB1ZGZfZXh0MF9vZmZzZXQoZGlyKTsKKwkJZl9wb3MgLT0gKHVkZl9leHQwX29mZnNldChkaXIpID4+IDIpOworCQlpZiAoZmliaC0+c2JoICE9IGZpYmgtPmViaCkKKwkJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC0+ZWJoKTsKKwkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLT5zYmgpOworCQlpZiAoIShmaWJoLT5zYmggPSBmaWJoLT5lYmggPSB1ZGZfZXhwYW5kX2Rpcl9hZGluaWNiKGRpciwgJmJsb2NrLCBlcnIpKSkKKwkJCXJldHVybiBOVUxMOworCQlibG9jID0gVURGX0lfTE9DQVRJT04oZGlyKTsKKwkJZWxvYy5sb2dpY2FsQmxvY2tOdW0gPSBibG9jazsKKwkJZWxvYy5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSBVREZfSV9MT0NBVElPTihkaXIpLnBhcnRpdGlvblJlZmVyZW5jZU51bTsKKwkJZWxlbiA9IGRpci0+aV9zYi0+c19ibG9ja3NpemU7CisJCWV4dG9mZnNldCA9IHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChkaXIpOworCQlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCisJCQlleHRvZmZzZXQgKz0gc2l6ZW9mKHNob3J0X2FkKTsKKwkJZWxzZSBpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfTE9ORykKKwkJCWV4dG9mZnNldCArPSBzaXplb2YobG9uZ19hZCk7CisJfQorCisJaWYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIGZpYmgtPmVvZmZzZXQgPj0gbmZpZGxlbikKKwl7CisJCWZpYmgtPnNvZmZzZXQgPSBmaWJoLT5lb2Zmc2V0OworCQlmaWJoLT5lb2Zmc2V0ICs9IG5maWRsZW47CisJCWlmIChmaWJoLT5zYmggIT0gZmliaC0+ZWJoKQorCQl7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmgtPnNiaCk7CisJCQlmaWJoLT5zYmggPSBmaWJoLT5lYmg7CisJCX0KKworCQlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQorCQl7CisJCQlibG9jayA9IFVERl9JX0xPQ0FUSU9OKGRpcikubG9naWNhbEJsb2NrTnVtOworCQkJZmkgPSAoc3RydWN0IGZpbGVJZGVudERlc2MgKikoVURGX0lfREFUQShkaXIpICsgZmliaC0+c29mZnNldCAtIHVkZl9leHQwX29mZnNldChkaXIpICsgVURGX0lfTEVORUFUVFIoZGlyKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlibG9jayA9IGVsb2MubG9naWNhbEJsb2NrTnVtICsgKChlbGVuIC0gMSkgPj4KKwkJCQlkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQkJZmkgPSAoc3RydWN0IGZpbGVJZGVudERlc2MgKikoZmliaC0+c2JoLT5iX2RhdGEgKyBmaWJoLT5zb2Zmc2V0KTsKKwkJfQorCX0KKwllbHNlCisJeworCQlmaWJoLT5zb2Zmc2V0ID0gZmliaC0+ZW9mZnNldCAtIHNiLT5zX2Jsb2Nrc2l6ZTsKKwkJZmliaC0+ZW9mZnNldCArPSBuZmlkbGVuIC0gc2ItPnNfYmxvY2tzaXplOworCQlpZiAoZmliaC0+c2JoICE9IGZpYmgtPmViaCkKKwkJeworCQkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLT5zYmgpOworCQkJZmliaC0+c2JoID0gZmliaC0+ZWJoOworCQl9CisKKwkJYmxvY2sgPSBlbG9jLmxvZ2ljYWxCbG9ja051bSArICgoZWxlbiAtIDEpID4+CisJCQlkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCisJCWlmICghKGZpYmgtPmViaCA9IHVkZl9icmVhZChkaXIsIGZfcG9zID4+IChkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSAyKSwgMSwgZXJyKSkpCisJCXsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLT5zYmgpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlpZiAoIShmaWJoLT5zb2Zmc2V0KSkKKwkJeworCQkJaWYgKHVkZl9uZXh0X2FleHQoZGlyLCAmYmxvYywgJmV4dG9mZnNldCwgJmVsb2MsICZlbGVuLCAmYmgsIDEpID09CisJCQkJKEVYVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKQorCQkJeworCQkJCWJsb2NrID0gZWxvYy5sb2dpY2FsQmxvY2tOdW0gKyAoKGVsZW4gLSAxKSA+PgorCQkJCQlkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQkJfQorCQkJZWxzZQorCQkJCWJsb2NrICsrOworCisJCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmgtPnNiaCk7CisJCQlmaWJoLT5zYmggPSBmaWJoLT5lYmg7CisJCQlmaSA9IChzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqKShmaWJoLT5zYmgtPmJfZGF0YSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlmaSA9IChzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqKQorCQkJCShmaWJoLT5zYmgtPmJfZGF0YSArIHNiLT5zX2Jsb2Nrc2l6ZSArIGZpYmgtPnNvZmZzZXQpOworCQl9CisJfQorCisJbWVtc2V0KGNmaSwgMCwgc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSk7CisJaWYgKFVERl9TQl9VREZSRVYoc2IpID49IDB4MDIwMCkKKwkJdWRmX25ld190YWcoKGNoYXIgKiljZmksIFRBR19JREVOVF9GSUQsIDMsIDEsIGJsb2NrLCBzaXplb2YodGFnKSk7CisJZWxzZQorCQl1ZGZfbmV3X3RhZygoY2hhciAqKWNmaSwgVEFHX0lERU5UX0ZJRCwgMiwgMSwgYmxvY2ssIHNpemVvZih0YWcpKTsKKwljZmktPmZpbGVWZXJzaW9uTnVtID0gY3B1X3RvX2xlMTYoMSk7CisJY2ZpLT5sZW5ndGhGaWxlSWRlbnQgPSBuYW1lbGVuOworCWNmaS0+bGVuZ3RoT2ZJbXBVc2UgPSBjcHVfdG9fbGUxNigwKTsKKwlpZiAoIXVkZl93cml0ZV9maShkaXIsIGNmaSwgZmksIGZpYmgsIE5VTEwsIG5hbWUpKQorCXsKKwkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCWRpci0+aV9zaXplICs9IG5maWRsZW47CisJCWlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCisJCQlVREZfSV9MRU5BTExPQyhkaXIpICs9IG5maWRsZW47CisJCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKKwkJcmV0dXJuIGZpOworCX0KKwllbHNlCisJeworCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJaWYgKGZpYmgtPnNiaCAhPSBmaWJoLT5lYmgpCisJCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmgtPmViaCk7CisJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC0+c2JoKTsKKwkJKmVyciA9IC1FSU87CisJCXJldHVybiBOVUxMOworCX0KK30KKworc3RhdGljIGludCB1ZGZfZGVsZXRlX2VudHJ5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlSWRlbnREZXNjICpmaSwKKwlzdHJ1Y3QgdWRmX2ZpbGVpZGVudF9iaCAqZmliaCwgc3RydWN0IGZpbGVJZGVudERlc2MgKmNmaSkKK3sKKwljZmktPmZpbGVDaGFyYWN0ZXJpc3RpY3MgfD0gRklEX0ZJTEVfQ0hBUl9ERUxFVEVEOworCWlmIChVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfU1RSSUNUKSkKKwkJbWVtc2V0KCYoY2ZpLT5pY2IpLCAweDAwLCBzaXplb2YobG9uZ19hZCkpOworCXJldHVybiB1ZGZfd3JpdGVfZmkoaW5vZGUsIGNmaSwgZmksIGZpYmgsIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHVkZl9jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoIGZpYmg7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZmlsZUlkZW50RGVzYyBjZmksICpmaTsKKwlpbnQgZXJyOworCisJbG9ja19rZXJuZWwoKTsKKwlpbm9kZSA9IHVkZl9uZXdfaW5vZGUoZGlyLCBtb2RlLCAmZXJyKTsKKwlpZiAoIWlub2RlKQorCXsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKKwkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZ1ZGZfYWRpbmljYl9hb3BzOworCWVsc2UKKwkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZ1ZGZfYW9wczsKKwlpbm9kZS0+aV9vcCA9ICZ1ZGZfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT5pX2ZvcCA9ICZ1ZGZfZmlsZV9vcGVyYXRpb25zOworCWlub2RlLT5pX21vZGUgPSBtb2RlOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCisJaWYgKCEoZmkgPSB1ZGZfYWRkX2VudHJ5KGRpciwgZGVudHJ5LCAmZmliaCwgJmNmaSwgJmVycikpKQorCXsKKwkJaW5vZGUtPmlfbmxpbmsgLS07CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gZXJyOworCX0KKwljZmkuaWNiLmV4dExlbmd0aCA9IGNwdV90b19sZTMyKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJY2ZpLmljYi5leHRMb2NhdGlvbiA9IGNwdV90b19sZWxiKFVERl9JX0xPQ0FUSU9OKGlub2RlKSk7CisJKihfX2xlMzIgKikoKHN0cnVjdCBhbGxvY0Rlc2NJbXBVc2UgKiljZmkuaWNiLmltcFVzZSktPmltcFVzZSA9CisJCWNwdV90b19sZTMyKFVERl9JX1VOSVFVRShpbm9kZSkgJiAweDAwMDAwMDAwRkZGRkZGRkZVTCk7CisJdWRmX3dyaXRlX2ZpKGRpciwgJmNmaSwgZmksICZmaWJoLCBOVUxMLCBOVUxMKTsKKwlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQorCXsKKwkJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCX0KKwlpZiAoZmliaC5zYmggIT0gZmliaC5lYmgpCisJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5lYmgpOworCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5zYmgpOworCXVubG9ja19rZXJuZWwoKTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVkZl9ta25vZChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGludCBtb2RlLCBkZXZfdCByZGV2KQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCXN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoIGZpYmg7CisJc3RydWN0IGZpbGVJZGVudERlc2MgY2ZpLCAqZmk7CisJaW50IGVycjsKKworCWlmICghb2xkX3ZhbGlkX2RldihyZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NrX2tlcm5lbCgpOworCWVyciA9IC1FSU87CisJaW5vZGUgPSB1ZGZfbmV3X2lub2RlKGRpciwgbW9kZSwgJmVycik7CisJaWYgKCFpbm9kZSkKKwkJZ290byBvdXQ7CisKKwlpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIG1vZGUsIHJkZXYpOworCWlmICghKGZpID0gdWRmX2FkZF9lbnRyeShkaXIsIGRlbnRyeSwgJmZpYmgsICZjZmksICZlcnIpKSkKKwl7CisJCWlub2RlLT5pX25saW5rIC0tOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJaXB1dChpbm9kZSk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJY2ZpLmljYi5leHRMZW5ndGggPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCWNmaS5pY2IuZXh0TG9jYXRpb24gPSBjcHVfdG9fbGVsYihVREZfSV9MT0NBVElPTihpbm9kZSkpOworCSooX19sZTMyICopKChzdHJ1Y3QgYWxsb2NEZXNjSW1wVXNlICopY2ZpLmljYi5pbXBVc2UpLT5pbXBVc2UgPQorCQljcHVfdG9fbGUzMihVREZfSV9VTklRVUUoaW5vZGUpICYgMHgwMDAwMDAwMEZGRkZGRkZGVUwpOworCXVkZl93cml0ZV9maShkaXIsICZjZmksIGZpLCAmZmliaCwgTlVMTCwgTlVMTCk7CisJaWYgKFVERl9JX0FMTE9DVFlQRShkaXIpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKKwl7CisJCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKKwl9CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisKKwlpZiAoZmliaC5zYmggIT0gZmliaC5lYmgpCisJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5lYmgpOworCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5zYmgpOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJZXJyID0gMDsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB1ZGZfbWtkaXIoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlzdHJ1Y3QgdWRmX2ZpbGVpZGVudF9iaCBmaWJoOworCXN0cnVjdCBmaWxlSWRlbnREZXNjIGNmaSwgKmZpOworCWludCBlcnI7CisKKwlsb2NrX2tlcm5lbCgpOworCWVyciA9IC1FTUxJTks7CisJaWYgKGRpci0+aV9ubGluayA+PSAoMjU2PDxzaXplb2YoZGlyLT5pX25saW5rKSktMSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRUlPOworCWlub2RlID0gdWRmX25ld19pbm9kZShkaXIsIFNfSUZESVIsICZlcnIpOworCWlmICghaW5vZGUpCisJCWdvdG8gb3V0OworCisJaW5vZGUtPmlfb3AgPSAmdWRmX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT5pX2ZvcCA9ICZ1ZGZfZGlyX29wZXJhdGlvbnM7CisJaWYgKCEoZmkgPSB1ZGZfYWRkX2VudHJ5KGlub2RlLCBOVUxMLCAmZmliaCwgJmNmaSwgJmVycikpKQorCXsKKwkJaW5vZGUtPmlfbmxpbmstLTsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCWlwdXQoaW5vZGUpOworCQlnb3RvIG91dDsKKwl9CisJaW5vZGUtPmlfbmxpbmsgPSAyOworCWNmaS5pY2IuZXh0TGVuZ3RoID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwljZmkuaWNiLmV4dExvY2F0aW9uID0gY3B1X3RvX2xlbGIoVURGX0lfTE9DQVRJT04oZGlyKSk7CisJKihfX2xlMzIgKikoKHN0cnVjdCBhbGxvY0Rlc2NJbXBVc2UgKiljZmkuaWNiLmltcFVzZSktPmltcFVzZSA9CisJCWNwdV90b19sZTMyKFVERl9JX1VOSVFVRShkaXIpICYgMHgwMDAwMDAwMEZGRkZGRkZGVUwpOworCWNmaS5maWxlQ2hhcmFjdGVyaXN0aWNzID0gRklEX0ZJTEVfQ0hBUl9ESVJFQ1RPUlkgfCBGSURfRklMRV9DSEFSX1BBUkVOVDsKKwl1ZGZfd3JpdGVfZmkoaW5vZGUsICZjZmksIGZpLCAmZmliaCwgTlVMTCwgTlVMTCk7CisJdWRmX3JlbGVhc2VfZGF0YShmaWJoLnNiaCk7CisJaW5vZGUtPmlfbW9kZSA9IFNfSUZESVIgfCBtb2RlOworCWlmIChkaXItPmlfbW9kZSAmIFNfSVNHSUQpCisJCWlub2RlLT5pX21vZGUgfD0gU19JU0dJRDsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKworCWlmICghKGZpID0gdWRmX2FkZF9lbnRyeShkaXIsIGRlbnRyeSwgJmZpYmgsICZjZmksICZlcnIpKSkKKwl7CisJCWlub2RlLT5pX25saW5rID0gMDsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCWlwdXQoaW5vZGUpOworCQlnb3RvIG91dDsKKwl9CisJY2ZpLmljYi5leHRMZW5ndGggPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCWNmaS5pY2IuZXh0TG9jYXRpb24gPSBjcHVfdG9fbGVsYihVREZfSV9MT0NBVElPTihpbm9kZSkpOworCSooX19sZTMyICopKChzdHJ1Y3QgYWxsb2NEZXNjSW1wVXNlICopY2ZpLmljYi5pbXBVc2UpLT5pbXBVc2UgPQorCQljcHVfdG9fbGUzMihVREZfSV9VTklRVUUoaW5vZGUpICYgMHgwMDAwMDAwMEZGRkZGRkZGVUwpOworCWNmaS5maWxlQ2hhcmFjdGVyaXN0aWNzIHw9IEZJRF9GSUxFX0NIQVJfRElSRUNUT1JZOworCXVkZl93cml0ZV9maShkaXIsICZjZmksIGZpLCAmZmliaCwgTlVMTCwgTlVMTCk7CisJZGlyLT5pX25saW5rKys7CisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJaWYgKGZpYmguc2JoICE9IGZpYmguZWJoKQorCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmguZWJoKTsKKwl1ZGZfcmVsZWFzZV9kYXRhKGZpYmguc2JoKTsKKwllcnIgPSAwOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGVtcHR5X2RpcihzdHJ1Y3QgaW5vZGUgKmRpcikKK3sKKwlzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqZmksIGNmaTsKKwlzdHJ1Y3QgdWRmX2ZpbGVpZGVudF9iaCBmaWJoOworCWxvZmZfdCBmX3BvczsKKwlsb2ZmX3Qgc2l6ZSA9ICh1ZGZfZXh0MF9vZmZzZXQoZGlyKSArIGRpci0+aV9zaXplKSA+PiAyOworCWludCBibG9jazsKKwlrZXJuZWxfbGJfYWRkciBibG9jLCBlbG9jOworCXVpbnQzMl90IGV4dG9mZnNldCwgZWxlbiwgb2Zmc2V0OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCisJZl9wb3MgPSAodWRmX2V4dDBfb2Zmc2V0KGRpcikgPj4gMik7CisKKwlmaWJoLnNvZmZzZXQgPSBmaWJoLmVvZmZzZXQgPSAoZl9wb3MgJiAoKGRpci0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PiAyKSkgPDwgMjsKKworCWlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCisJCWZpYmguc2JoID0gZmliaC5lYmggPSBOVUxMOworCWVsc2UgaWYgKGlub2RlX2JtYXAoZGlyLCBmX3BvcyA+PiAoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gMiksCisJCSZibG9jLCAmZXh0b2Zmc2V0LCAmZWxvYywgJmVsZW4sICZvZmZzZXQsICZiaCkgPT0gKEVYVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKQorCXsKKwkJb2Zmc2V0ID4+PSBkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCWJsb2NrID0gdWRmX2dldF9sYl9wYmxvY2soZGlyLT5pX3NiLCBlbG9jLCBvZmZzZXQpOworCQlpZiAoKCsrb2Zmc2V0IDw8IGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cykgPCBlbGVuKQorCQl7CisJCQlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCisJCQkJZXh0b2Zmc2V0IC09IHNpemVvZihzaG9ydF9hZCk7CisJCQllbHNlIGlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQorCQkJCWV4dG9mZnNldCAtPSBzaXplb2YobG9uZ19hZCk7CisJCX0KKwkJZWxzZQorCQkJb2Zmc2V0ID0gMDsKKworCQlpZiAoIShmaWJoLnNiaCA9IGZpYmguZWJoID0gdWRmX3RyZWFkKGRpci0+aV9zYiwgYmxvY2spKSkKKwkJeworCQkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwllbHNlCisJeworCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJcmV0dXJuIDA7CisJfQorCisKKwl3aGlsZSAoIChmX3BvcyA8IHNpemUpICkKKwl7CisJCWZpID0gdWRmX2ZpbGVpZGVudF9yZWFkKGRpciwgJmZfcG9zLCAmZmliaCwgJmNmaSwgJmJsb2MsICZleHRvZmZzZXQsICZlbG9jLCAmZWxlbiwgJm9mZnNldCwgJmJoKTsKKworCQlpZiAoIWZpKQorCQl7CisJCQlpZiAoZmliaC5zYmggIT0gZmliaC5lYmgpCisJCQkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLmViaCk7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmguc2JoKTsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoY2ZpLmxlbmd0aEZpbGVJZGVudCAmJiAoY2ZpLmZpbGVDaGFyYWN0ZXJpc3RpY3MgJiBGSURfRklMRV9DSEFSX0RFTEVURUQpID09IDApCisJCXsKKwkJCWlmIChmaWJoLnNiaCAhPSBmaWJoLmViaCkKKwkJCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmguZWJoKTsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5zYmgpOworCQkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAoZmliaC5zYmggIT0gZmliaC5lYmgpCisJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5lYmgpOworCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5zYmgpOworCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHVkZl9ybWRpcihzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgdWRmX2ZpbGVpZGVudF9iaCBmaWJoOworCXN0cnVjdCBmaWxlSWRlbnREZXNjICpmaSwgY2ZpOworCWtlcm5lbF9sYl9hZGRyIHRsb2M7CisKKwlyZXR2YWwgPSAtRU5PRU5UOworCWxvY2tfa2VybmVsKCk7CisJZmkgPSB1ZGZfZmluZF9lbnRyeShkaXIsIGRlbnRyeSwgJmZpYmgsICZjZmkpOworCWlmICghZmkpCisJCWdvdG8gb3V0OworCisJcmV0dmFsID0gLUVJTzsKKwl0bG9jID0gbGVsYl90b19jcHUoY2ZpLmljYi5leHRMb2NhdGlvbik7CisJaWYgKHVkZl9nZXRfbGJfcGJsb2NrKGRpci0+aV9zYiwgdGxvYywgMCkgIT0gaW5vZGUtPmlfaW5vKQorCQlnb3RvIGVuZF9ybWRpcjsKKwlyZXR2YWwgPSAtRU5PVEVNUFRZOworCWlmICghZW1wdHlfZGlyKGlub2RlKSkKKwkJZ290byBlbmRfcm1kaXI7CisJcmV0dmFsID0gdWRmX2RlbGV0ZV9lbnRyeShkaXIsIGZpLCAmZmliaCwgJmNmaSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlbmRfcm1kaXI7CisJaWYgKGlub2RlLT5pX25saW5rICE9IDIpCisJCXVkZl93YXJuaW5nKGlub2RlLT5pX3NiLCAidWRmX3JtZGlyIiwKKwkJCSJlbXB0eSBkaXJlY3RvcnkgaGFzIG5saW5rICE9IDIgKCVkKSIsCisJCQlpbm9kZS0+aV9ubGluayk7CisJaW5vZGUtPmlfbmxpbmsgPSAwOworCWlub2RlLT5pX3NpemUgPSAwOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCWRpci0+aV9ubGluayAtLTsKKwlpbm9kZS0+aV9jdGltZSA9IGRpci0+aV9jdGltZSA9IGRpci0+aV9tdGltZSA9IGN1cnJlbnRfZnNfdGltZShkaXItPmlfc2IpOworCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKKworZW5kX3JtZGlyOgorCWlmIChmaWJoLnNiaCAhPSBmaWJoLmViaCkKKwkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLmViaCk7CisJdWRmX3JlbGVhc2VfZGF0YShmaWJoLnNiaCk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgdWRmX3VubGluayhzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgdWRmX2ZpbGVpZGVudF9iaCBmaWJoOworCXN0cnVjdCBmaWxlSWRlbnREZXNjICpmaTsKKwlzdHJ1Y3QgZmlsZUlkZW50RGVzYyBjZmk7CisJa2VybmVsX2xiX2FkZHIgdGxvYzsKKworCXJldHZhbCA9IC1FTk9FTlQ7CisJbG9ja19rZXJuZWwoKTsKKwlmaSA9IHVkZl9maW5kX2VudHJ5KGRpciwgZGVudHJ5LCAmZmliaCwgJmNmaSk7CisJaWYgKCFmaSkKKwkJZ290byBvdXQ7CisKKwlyZXR2YWwgPSAtRUlPOworCXRsb2MgPSBsZWxiX3RvX2NwdShjZmkuaWNiLmV4dExvY2F0aW9uKTsKKwlpZiAodWRmX2dldF9sYl9wYmxvY2soZGlyLT5pX3NiLCB0bG9jLCAwKSAhPSBpbm9kZS0+aV9pbm8pCisJCWdvdG8gZW5kX3VubGluazsKKworCWlmICghaW5vZGUtPmlfbmxpbmspCisJeworCQl1ZGZfZGVidWcoIkRlbGV0aW5nIG5vbmV4aXN0ZW50IGZpbGUgKCVsdSksICVkXG4iLAorCQkJaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluayk7CisJCWlub2RlLT5pX25saW5rID0gMTsKKwl9CisJcmV0dmFsID0gdWRmX2RlbGV0ZV9lbnRyeShkaXIsIGZpLCAmZmliaCwgJmNmaSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlbmRfdW5saW5rOworCWRpci0+aV9jdGltZSA9IGRpci0+aV9tdGltZSA9IGN1cnJlbnRfZnNfdGltZShkaXItPmlfc2IpOworCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKKwlpbm9kZS0+aV9ubGluay0tOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCWlub2RlLT5pX2N0aW1lID0gZGlyLT5pX2N0aW1lOworCXJldHZhbCA9IDA7CisKK2VuZF91bmxpbms6CisJaWYgKGZpYmguc2JoICE9IGZpYmguZWJoKQorCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmguZWJoKTsKKwl1ZGZfcmVsZWFzZV9kYXRhKGZpYmguc2JoKTsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCB1ZGZfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGNvbnN0IGNoYXIgKiBzeW1uYW1lKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCXN0cnVjdCBwYXRoQ29tcG9uZW50ICpwYzsKKwljaGFyICpjb21wc3RhcnQ7CisJc3RydWN0IHVkZl9maWxlaWRlbnRfYmggZmliaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlpbnQgZW9mZnNldCwgZWxlbiA9IDA7CisJc3RydWN0IGZpbGVJZGVudERlc2MgKmZpOworCXN0cnVjdCBmaWxlSWRlbnREZXNjIGNmaTsKKwljaGFyICplYTsKKwlpbnQgZXJyOworCWludCBibG9jazsKKwljaGFyIG5hbWVbVURGX05BTUVfTEVOXTsKKwlpbnQgbmFtZWxlbjsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKCEoaW5vZGUgPSB1ZGZfbmV3X2lub2RlKGRpciwgU19JRkxOSywgJmVycikpKQorCQlnb3RvIG91dDsKKworCWlub2RlLT5pX21vZGUgPSBTX0lGTE5LIHwgU19JUldYVUdPOworCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmdWRmX3N5bWxpbmtfYW9wczsKKwlpbm9kZS0+aV9vcCA9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKworCWlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpICE9IElDQlRBR19GTEFHX0FEX0lOX0lDQikKKwl7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCQlrZXJuZWxfbGJfYWRkciBibG9jLCBlbG9jOworCQl1aW50MzJfdCBlbGVuLCBleHRvZmZzZXQ7CisKKwkJYmxvY2sgPSB1ZGZfbmV3X2Jsb2NrKGlub2RlLT5pX3NiLCBpbm9kZSwKKwkJCVVERl9JX0xPQ0FUSU9OKGlub2RlKS5wYXJ0aXRpb25SZWZlcmVuY2VOdW0sCisJCQlVREZfSV9MT0NBVElPTihpbm9kZSkubG9naWNhbEJsb2NrTnVtLCAmZXJyKTsKKwkJaWYgKCFibG9jaykKKwkJCWdvdG8gb3V0X25vX2VudHJ5OworCQlibG9jID0gVURGX0lfTE9DQVRJT04oaW5vZGUpOworCQllbG9jLmxvZ2ljYWxCbG9ja051bSA9IGJsb2NrOworCQllbG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IFVERl9JX0xPQ0FUSU9OKGlub2RlKS5wYXJ0aXRpb25SZWZlcmVuY2VOdW07CisJCWVsZW4gPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJCVVERl9JX0xFTkVYVEVOVFMoaW5vZGUpID0gZWxlbjsKKwkJZXh0b2Zmc2V0ID0gdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKTsKKwkJdWRmX2FkZF9hZXh0KGlub2RlLCAmYmxvYywgJmV4dG9mZnNldCwgZWxvYywgZWxlbiwgJmJoLCAwKTsKKwkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisKKwkJYmxvY2sgPSB1ZGZfZ2V0X3BibG9jayhpbm9kZS0+aV9zYiwgYmxvY2ssCisJCQlVREZfSV9MT0NBVElPTihpbm9kZSkucGFydGl0aW9uUmVmZXJlbmNlTnVtLCAwKTsKKwkJYmggPSB1ZGZfdHJlYWQoaW5vZGUtPmlfc2IsIGJsb2NrKTsKKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1zZXQoYmgtPmJfZGF0YSwgMHgwMCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCXVubG9ja19idWZmZXIoYmgpOworCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCQllYSA9IGJoLT5iX2RhdGEgKyB1ZGZfZXh0MF9vZmZzZXQoaW5vZGUpOworCX0KKwllbHNlCisJCWVhID0gVURGX0lfREFUQShpbm9kZSkgKyBVREZfSV9MRU5FQVRUUihpbm9kZSk7CisKKwllb2Zmc2V0ID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gdWRmX2V4dDBfb2Zmc2V0KGlub2RlKTsKKwlwYyA9IChzdHJ1Y3QgcGF0aENvbXBvbmVudCAqKWVhOworCisJaWYgKCpzeW1uYW1lID09ICcvJykKKwl7CisJCWRvCisJCXsKKwkJCXN5bW5hbWUrKzsKKwkJfSB3aGlsZSAoKnN5bW5hbWUgPT0gJy8nKTsKKworCQlwYy0+Y29tcG9uZW50VHlwZSA9IDE7CisJCXBjLT5sZW5ndGhDb21wb25lbnRJZGVudCA9IDA7CisJCXBjLT5jb21wb25lbnRGaWxlVmVyc2lvbk51bSA9IDA7CisJCXBjICs9IHNpemVvZihzdHJ1Y3QgcGF0aENvbXBvbmVudCk7CisJCWVsZW4gKz0gc2l6ZW9mKHN0cnVjdCBwYXRoQ29tcG9uZW50KTsKKwl9CisKKwllcnIgPSAtRU5BTUVUT09MT05HOworCisJd2hpbGUgKCpzeW1uYW1lKQorCXsKKwkJaWYgKGVsZW4gKyBzaXplb2Yoc3RydWN0IHBhdGhDb21wb25lbnQpID4gZW9mZnNldCkKKwkJCWdvdG8gb3V0X25vX2VudHJ5OworCisJCXBjID0gKHN0cnVjdCBwYXRoQ29tcG9uZW50ICopKGVhICsgZWxlbik7CisKKwkJY29tcHN0YXJ0ID0gKGNoYXIgKilzeW1uYW1lOworCisJCWRvCisJCXsKKwkJCXN5bW5hbWUrKzsKKwkJfSB3aGlsZSAoKnN5bW5hbWUgJiYgKnN5bW5hbWUgIT0gJy8nKTsKKworCQlwYy0+Y29tcG9uZW50VHlwZSA9IDU7CisJCXBjLT5sZW5ndGhDb21wb25lbnRJZGVudCA9IDA7CisJCXBjLT5jb21wb25lbnRGaWxlVmVyc2lvbk51bSA9IDA7CisJCWlmIChjb21wc3RhcnRbMF0gPT0gJy4nKQorCQl7CisJCQlpZiAoKHN5bW5hbWUtY29tcHN0YXJ0KSA9PSAxKQorCQkJCXBjLT5jb21wb25lbnRUeXBlID0gNDsKKwkJCWVsc2UgaWYgKChzeW1uYW1lLWNvbXBzdGFydCkgPT0gMiAmJiBjb21wc3RhcnRbMV0gPT0gJy4nKQorCQkJCXBjLT5jb21wb25lbnRUeXBlID0gMzsKKwkJfQorCisJCWlmIChwYy0+Y29tcG9uZW50VHlwZSA9PSA1KQorCQl7CisJCQlpZiAoICEobmFtZWxlbiA9IHVkZl9wdXRfZmlsZW5hbWUoaW5vZGUtPmlfc2IsIGNvbXBzdGFydCwgbmFtZSwgc3ltbmFtZS1jb21wc3RhcnQpKSkKKwkJCQlnb3RvIG91dF9ub19lbnRyeTsKKworCQkJaWYgKGVsZW4gKyBzaXplb2Yoc3RydWN0IHBhdGhDb21wb25lbnQpICsgbmFtZWxlbiA+IGVvZmZzZXQpCisJCQkJZ290byBvdXRfbm9fZW50cnk7CisJCQllbHNlCisJCQkJcGMtPmxlbmd0aENvbXBvbmVudElkZW50ID0gbmFtZWxlbjsKKworCQkJbWVtY3B5KHBjLT5jb21wb25lbnRJZGVudCwgbmFtZSwgbmFtZWxlbik7CisJCX0KKworCQllbGVuICs9IHNpemVvZihzdHJ1Y3QgcGF0aENvbXBvbmVudCkgKyBwYy0+bGVuZ3RoQ29tcG9uZW50SWRlbnQ7CisKKwkJaWYgKCpzeW1uYW1lKQorCQl7CisJCQlkbworCQkJeworCQkJCXN5bW5hbWUrKzsKKwkJCX0gd2hpbGUgKCpzeW1uYW1lID09ICcvJyk7CisJCX0KKwl9CisKKwl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwlpbm9kZS0+aV9zaXplID0gZWxlbjsKKwlpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCisJCVVERl9JX0xFTkFMTE9DKGlub2RlKSA9IGlub2RlLT5pX3NpemU7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisKKwlpZiAoIShmaSA9IHVkZl9hZGRfZW50cnkoZGlyLCBkZW50cnksICZmaWJoLCAmY2ZpLCAmZXJyKSkpCisJCWdvdG8gb3V0X25vX2VudHJ5OworCWNmaS5pY2IuZXh0TGVuZ3RoID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwljZmkuaWNiLmV4dExvY2F0aW9uID0gY3B1X3RvX2xlbGIoVURGX0lfTE9DQVRJT04oaW5vZGUpKTsKKwlpZiAoVURGX1NCX0xWSURCSChpbm9kZS0+aV9zYikpCisJeworCQlzdHJ1Y3QgbG9naWNhbFZvbEhlYWRlckRlc2MgKmx2aGQ7CisJCXVpbnQ2NF90IHVuaXF1ZUlEOworCQlsdmhkID0gKHN0cnVjdCBsb2dpY2FsVm9sSGVhZGVyRGVzYyAqKShVREZfU0JfTFZJRChpbm9kZS0+aV9zYiktPmxvZ2ljYWxWb2xDb250ZW50c1VzZSk7CisJCXVuaXF1ZUlEID0gbGU2NF90b19jcHUobHZoZC0+dW5pcXVlSUQpOworCQkqKF9fbGUzMiAqKSgoc3RydWN0IGFsbG9jRGVzY0ltcFVzZSAqKWNmaS5pY2IuaW1wVXNlKS0+aW1wVXNlID0KKwkJCWNwdV90b19sZTMyKHVuaXF1ZUlEICYgMHgwMDAwMDAwMEZGRkZGRkZGVUwpOworCQlpZiAoISgrK3VuaXF1ZUlEICYgMHgwMDAwMDAwMEZGRkZGRkZGVUwpKQorCQkJdW5pcXVlSUQgKz0gMTY7CisJCWx2aGQtPnVuaXF1ZUlEID0gY3B1X3RvX2xlNjQodW5pcXVlSUQpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShVREZfU0JfTFZJREJIKGlub2RlLT5pX3NiKSk7CisJfQorCXVkZl93cml0ZV9maShkaXIsICZjZmksIGZpLCAmZmliaCwgTlVMTCwgTlVMTCk7CisJaWYgKFVERl9JX0FMTE9DVFlQRShkaXIpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKKwl7CisJCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKKwl9CisJaWYgKGZpYmguc2JoICE9IGZpYmguZWJoKQorCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmguZWJoKTsKKwl1ZGZfcmVsZWFzZV9kYXRhKGZpYmguc2JoKTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCWVyciA9IDA7CisKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycjsKKworb3V0X25vX2VudHJ5OgorCWlub2RlLT5pX25saW5rLS07CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJaXB1dChpbm9kZSk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgdWRmX2xpbmsoc3RydWN0IGRlbnRyeSAqIG9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqIGRpciwKKwkgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoIGZpYmg7CisJc3RydWN0IGZpbGVJZGVudERlc2MgY2ZpLCAqZmk7CisJaW50IGVycjsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKGlub2RlLT5pX25saW5rID49ICgyNTY8PHNpemVvZihpbm9kZS0+aV9ubGluaykpLTEpCisJeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU1MSU5LOworCX0KKworCWlmICghKGZpID0gdWRmX2FkZF9lbnRyeShkaXIsIGRlbnRyeSwgJmZpYmgsICZjZmksICZlcnIpKSkKKwl7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJY2ZpLmljYi5leHRMZW5ndGggPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCWNmaS5pY2IuZXh0TG9jYXRpb24gPSBjcHVfdG9fbGVsYihVREZfSV9MT0NBVElPTihpbm9kZSkpOworCWlmIChVREZfU0JfTFZJREJIKGlub2RlLT5pX3NiKSkKKwl7CisJCXN0cnVjdCBsb2dpY2FsVm9sSGVhZGVyRGVzYyAqbHZoZDsKKwkJdWludDY0X3QgdW5pcXVlSUQ7CisJCWx2aGQgPSAoc3RydWN0IGxvZ2ljYWxWb2xIZWFkZXJEZXNjICopKFVERl9TQl9MVklEKGlub2RlLT5pX3NiKS0+bG9naWNhbFZvbENvbnRlbnRzVXNlKTsKKwkJdW5pcXVlSUQgPSBsZTY0X3RvX2NwdShsdmhkLT51bmlxdWVJRCk7CisJCSooX19sZTMyICopKChzdHJ1Y3QgYWxsb2NEZXNjSW1wVXNlICopY2ZpLmljYi5pbXBVc2UpLT5pbXBVc2UgPQorCQkJY3B1X3RvX2xlMzIodW5pcXVlSUQgJiAweDAwMDAwMDAwRkZGRkZGRkZVTCk7CisJCWlmICghKCsrdW5pcXVlSUQgJiAweDAwMDAwMDAwRkZGRkZGRkZVTCkpCisJCQl1bmlxdWVJRCArPSAxNjsKKwkJbHZoZC0+dW5pcXVlSUQgPSBjcHVfdG9fbGU2NCh1bmlxdWVJRCk7CisJCW1hcmtfYnVmZmVyX2RpcnR5KFVERl9TQl9MVklEQkgoaW5vZGUtPmlfc2IpKTsKKwl9CisJdWRmX3dyaXRlX2ZpKGRpciwgJmNmaSwgZmksICZmaWJoLCBOVUxMLCBOVUxMKTsKKwlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQorCXsKKwkJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCX0KKwlpZiAoZmliaC5zYmggIT0gZmliaC5lYmgpCisJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5lYmgpOworCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5zYmgpOworCWlub2RlLT5pX25saW5rICsrOworCWlub2RlLT5pX2N0aW1lID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlhdG9taWNfaW5jKCZpbm9kZS0+aV9jb3VudCk7CisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEFueWJvZHkgY2FuIHJlbmFtZSBhbnl0aGluZyB3aXRoIHRoaXM6IHRoZSBwZXJtaXNzaW9uIGNoZWNrcyBhcmUgbGVmdCB0byB0aGUKKyAqIGhpZ2hlci1sZXZlbCByb3V0aW5lcy4KKyAqLworc3RhdGljIGludCB1ZGZfcmVuYW1lIChzdHJ1Y3QgaW5vZGUgKiBvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICogb2xkX2RlbnRyeSwKKwlzdHJ1Y3QgaW5vZGUgKiBuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICogbmV3X2RlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBvbGRfaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqIG5ld19pbm9kZSA9IG5ld19kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHVkZl9maWxlaWRlbnRfYmggb2ZpYmgsIG5maWJoOworCXN0cnVjdCBmaWxlSWRlbnREZXNjICpvZmkgPSBOVUxMLCAqbmZpID0gTlVMTCwgKmRpcl9maSA9IE5VTEwsIG9jZmksIG5jZmk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaXJfYmggPSBOVUxMOworCWludCByZXR2YWwgPSAtRU5PRU5UOworCWtlcm5lbF9sYl9hZGRyIHRsb2M7CisKKwlsb2NrX2tlcm5lbCgpOworCWlmICgob2ZpID0gdWRmX2ZpbmRfZW50cnkob2xkX2Rpciwgb2xkX2RlbnRyeSwgJm9maWJoLCAmb2NmaSkpKQorCXsKKwkJaWYgKG9maWJoLnNiaCAhPSBvZmliaC5lYmgpCisJCQl1ZGZfcmVsZWFzZV9kYXRhKG9maWJoLmViaCk7CisJCXVkZl9yZWxlYXNlX2RhdGEob2ZpYmguc2JoKTsKKwl9CisJdGxvYyA9IGxlbGJfdG9fY3B1KG9jZmkuaWNiLmV4dExvY2F0aW9uKTsKKwlpZiAoIW9maSB8fCB1ZGZfZ2V0X2xiX3BibG9jayhvbGRfZGlyLT5pX3NiLCB0bG9jLCAwKQorCQkJCQkhPSBvbGRfaW5vZGUtPmlfaW5vKQorCQlnb3RvIGVuZF9yZW5hbWU7CisKKwluZmkgPSB1ZGZfZmluZF9lbnRyeShuZXdfZGlyLCBuZXdfZGVudHJ5LCAmbmZpYmgsICZuY2ZpKTsKKwlpZiAobmZpKQorCXsKKwkJaWYgKCFuZXdfaW5vZGUpCisJCXsKKwkJCWlmIChuZmliaC5zYmggIT0gbmZpYmguZWJoKQorCQkJCXVkZl9yZWxlYXNlX2RhdGEobmZpYmguZWJoKTsKKwkJCXVkZl9yZWxlYXNlX2RhdGEobmZpYmguc2JoKTsKKwkJCW5maSA9IE5VTEw7CisJCX0KKwl9CisJaWYgKFNfSVNESVIob2xkX2lub2RlLT5pX21vZGUpKQorCXsKKwkJdWludDMyX3Qgb2Zmc2V0ID0gdWRmX2V4dDBfb2Zmc2V0KG9sZF9pbm9kZSk7CisKKwkJaWYgKG5ld19pbm9kZSkKKwkJeworCQkJcmV0dmFsID0gLUVOT1RFTVBUWTsKKwkJCWlmICghZW1wdHlfZGlyKG5ld19pbm9kZSkpCisJCQkJZ290byBlbmRfcmVuYW1lOworCQl9CisJCXJldHZhbCA9IC1FSU87CisJCWlmIChVREZfSV9BTExPQ1RZUEUob2xkX2lub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCisJCXsKKwkJCWRpcl9maSA9IHVkZl9nZXRfZmlsZWlkZW50KFVERl9JX0RBVEEob2xkX2lub2RlKSAtCisJCQkJKFVERl9JX0VGRShvbGRfaW5vZGUpID8KKwkJCQkJc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSkgOgorCQkJCQlzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSkpLAorCQkJCW9sZF9pbm9kZS0+aV9zYi0+c19ibG9ja3NpemUsICZvZmZzZXQpOworCQl9CisJCWVsc2UKKwkJeworCQkJZGlyX2JoID0gdWRmX2JyZWFkKG9sZF9pbm9kZSwgMCwgMCwgJnJldHZhbCk7CisJCQlpZiAoIWRpcl9iaCkKKwkJCQlnb3RvIGVuZF9yZW5hbWU7CisJCQlkaXJfZmkgPSB1ZGZfZ2V0X2ZpbGVpZGVudChkaXJfYmgtPmJfZGF0YSwgb2xkX2lub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwgJm9mZnNldCk7CisJCX0KKwkJaWYgKCFkaXJfZmkpCisJCQlnb3RvIGVuZF9yZW5hbWU7CisJCXRsb2MgPSBsZWxiX3RvX2NwdShkaXJfZmktPmljYi5leHRMb2NhdGlvbik7CisJCWlmICh1ZGZfZ2V0X2xiX3BibG9jayhvbGRfaW5vZGUtPmlfc2IsIHRsb2MsIDApCisJCQkJCSE9IG9sZF9kaXItPmlfaW5vKQorCQkJZ290byBlbmRfcmVuYW1lOworCisJCXJldHZhbCA9IC1FTUxJTks7CisJCWlmICghbmV3X2lub2RlICYmIG5ld19kaXItPmlfbmxpbmsgPj0gKDI1Njw8c2l6ZW9mKG5ld19kaXItPmlfbmxpbmspKS0xKQorCQkJZ290byBlbmRfcmVuYW1lOworCX0KKwlpZiAoIW5maSkKKwl7CisJCW5maSA9IHVkZl9hZGRfZW50cnkobmV3X2RpciwgbmV3X2RlbnRyeSwgJm5maWJoLCAmbmNmaSwgJnJldHZhbCk7CisJCWlmICghbmZpKQorCQkJZ290byBlbmRfcmVuYW1lOworCX0KKworCS8qCisJICogTGlrZSBtb3N0IG90aGVyIFVuaXggc3lzdGVtcywgc2V0IHRoZSBjdGltZSBmb3IgaW5vZGVzIG9uIGEKKwkgKiByZW5hbWUuCisJICovCisJb2xkX2lub2RlLT5pX2N0aW1lID0gY3VycmVudF9mc190aW1lKG9sZF9pbm9kZS0+aV9zYik7CisJbWFya19pbm9kZV9kaXJ0eShvbGRfaW5vZGUpOworCisJLyoKKwkgKiBvaywgdGhhdCdzIGl0CisJICovCisJbmNmaS5maWxlVmVyc2lvbk51bSA9IG9jZmkuZmlsZVZlcnNpb25OdW07CisJbmNmaS5maWxlQ2hhcmFjdGVyaXN0aWNzID0gb2NmaS5maWxlQ2hhcmFjdGVyaXN0aWNzOworCW1lbWNweSgmKG5jZmkuaWNiKSwgJihvY2ZpLmljYiksIHNpemVvZihsb25nX2FkKSk7CisJdWRmX3dyaXRlX2ZpKG5ld19kaXIsICZuY2ZpLCBuZmksICZuZmliaCwgTlVMTCwgTlVMTCk7CisKKwkvKiBUaGUgb2xkIGZpZCBtYXkgaGF2ZSBtb3ZlZCAtIGZpbmQgaXQgYWdhaW4gKi8KKwlvZmkgPSB1ZGZfZmluZF9lbnRyeShvbGRfZGlyLCBvbGRfZGVudHJ5LCAmb2ZpYmgsICZvY2ZpKTsKKwl1ZGZfZGVsZXRlX2VudHJ5KG9sZF9kaXIsIG9maSwgJm9maWJoLCAmb2NmaSk7CisKKwlpZiAobmV3X2lub2RlKQorCXsKKwkJbmV3X2lub2RlLT5pX25saW5rLS07CisJCW5ld19pbm9kZS0+aV9jdGltZSA9IGN1cnJlbnRfZnNfdGltZShuZXdfaW5vZGUtPmlfc2IpOworCQltYXJrX2lub2RlX2RpcnR5KG5ld19pbm9kZSk7CisJfQorCW9sZF9kaXItPmlfY3RpbWUgPSBvbGRfZGlyLT5pX210aW1lID0gY3VycmVudF9mc190aW1lKG9sZF9kaXItPmlfc2IpOworCW1hcmtfaW5vZGVfZGlydHkob2xkX2Rpcik7CisKKwlpZiAoZGlyX2ZpKQorCXsKKwkJZGlyX2ZpLT5pY2IuZXh0TG9jYXRpb24gPSBjcHVfdG9fbGVsYihVREZfSV9MT0NBVElPTihuZXdfZGlyKSk7CisJCXVkZl91cGRhdGVfdGFnKChjaGFyICopZGlyX2ZpLCAoc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSArCisJCQlsZTE2X3RvX2NwdShkaXJfZmktPmxlbmd0aE9mSW1wVXNlKSArIDMpICYgfjMpOworCQlpZiAoVURGX0lfQUxMT0NUWVBFKG9sZF9pbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQorCQl7CisJCQltYXJrX2lub2RlX2RpcnR5KG9sZF9pbm9kZSk7CisJCX0KKwkJZWxzZQorCQkJbWFya19idWZmZXJfZGlydHlfaW5vZGUoZGlyX2JoLCBvbGRfaW5vZGUpOworCQlvbGRfZGlyLT5pX25saW5rIC0tOworCQltYXJrX2lub2RlX2RpcnR5KG9sZF9kaXIpOworCQlpZiAobmV3X2lub2RlKQorCQl7CisJCQluZXdfaW5vZGUtPmlfbmxpbmsgLS07CisJCQltYXJrX2lub2RlX2RpcnR5KG5ld19pbm9kZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQluZXdfZGlyLT5pX25saW5rICsrOworCQkJbWFya19pbm9kZV9kaXJ0eShuZXdfZGlyKTsKKwkJfQorCX0KKworCWlmIChvZmkpCisJeworCQlpZiAob2ZpYmguc2JoICE9IG9maWJoLmViaCkKKwkJCXVkZl9yZWxlYXNlX2RhdGEob2ZpYmguZWJoKTsKKwkJdWRmX3JlbGVhc2VfZGF0YShvZmliaC5zYmgpOworCX0KKworCXJldHZhbCA9IDA7CisKK2VuZF9yZW5hbWU6CisJdWRmX3JlbGVhc2VfZGF0YShkaXJfYmgpOworCWlmIChuZmkpCisJeworCQlpZiAobmZpYmguc2JoICE9IG5maWJoLmViaCkKKwkJCXVkZl9yZWxlYXNlX2RhdGEobmZpYmguZWJoKTsKKwkJdWRmX3JlbGVhc2VfZGF0YShuZmliaC5zYmgpOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdWRmX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0geworCS5sb29rdXAJCQkJPSB1ZGZfbG9va3VwLAorCS5jcmVhdGUJCQkJPSB1ZGZfY3JlYXRlLAorCS5saW5rCQkJCT0gdWRmX2xpbmssCisJLnVubGluawkJCQk9IHVkZl91bmxpbmssCisJLnN5bWxpbmsJCQk9IHVkZl9zeW1saW5rLAorCS5ta2RpcgkJCQk9IHVkZl9ta2RpciwKKwkucm1kaXIJCQkJPSB1ZGZfcm1kaXIsCisJLm1rbm9kCQkJCT0gdWRmX21rbm9kLAorCS5yZW5hbWUJCQkJPSB1ZGZfcmVuYW1lLAorfTsKZGlmZiAtLWdpdCBhL2ZzL3VkZi9vc3RhX3VkZi5oIGIvZnMvdWRmL29zdGFfdWRmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyYWFlNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3VkZi9vc3RhX3VkZi5oCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogb3N0YV91ZGYuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBPU1RBIFVERih0bSkgMi41MCAoQXByaWwgMzAsIDIwMDMpCisgKiBodHRwOi8vd3d3Lm9zdGEub3JnCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgIEJlbiBGZW5uZW1hIDxiZmVubmVtYUBmYWxjb24uY3NjLmNhbHBvbHkuZWR1PgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBQdWJsaWMgTGljZW5zZSAoIkdQTCIpLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImVjbWFfMTY3LmgiCisKKyNpZm5kZWYgX09TVEFfVURGX0gKKyNkZWZpbmUgX09TVEFfVURGX0ggMQorCisvKiBPU1RBIENTMCBDaGFyc3BlYyAoVURGIDIuNTAgMi4xLjIpICovCisjZGVmaW5lIFVERl9DSEFSX1NFVF9UWVBFCQkwCisjZGVmaW5lIFVERl9DSEFSX1NFVF9JTkZPCQkiT1NUQSBDb21wcmVzc2VkIFVuaWNvZGUiCisKKy8qIEVudGl0eSBJZGVudGlmaWVyIChVREYgMi41MCAyLjEuNSkgKi8KKy8qIElkZW50aWZpZXJzIChVREYgMi41MCAyLjEuNS4yKSAqLworI2RlZmluZSBVREZfSURfREVWRUxPUEVSCQkiKkxpbnV4IFVERkZTIgorI2RlZmluZQlVREZfSURfQ09NUExJQU5UCQkiKk9TVEEgVURGIENvbXBsaWFudCIKKyNkZWZpbmUgVURGX0lEX0xWX0lORk8JCQkiKlVERiBMViBJbmZvIgorI2RlZmluZSBVREZfSURfRlJFRV9FQQkJCSIqVURGIEZyZWVFQVNwYWNlIgorI2RlZmluZSBVREZfSURfRlJFRV9BUFBfRUEJCSIqVURGIEZyZWVBcHBFQVNwYWNlIgorI2RlZmluZSBVREZfSURfRFZEX0NHTVMJCQkiKlVERiBEVkQgQ0dNUyBJbmZvIgorI2RlZmluZSBVREZfSURfT1MyX0VBCQkJIipVREYgT1MvMiBFQSIKKyNkZWZpbmUgVURGX0lEX09TMl9FQV9MRU5HVEgJCSIqVURGIE9TLzIgRUFMZW5ndGgiCisjZGVmaW5lIFVERl9JRF9NQUNfVk9MVU1FCQkiKlVERiBNYWMgVm9sdW1lSW5mbyIKKyNkZWZpbmUgVURGX0lEX01BQ19GSU5ERVIJCSIqVURGIE1hYyBGaW5kZXJJbmZvIgorI2RlZmluZSBVREZfSURfTUFDX1VOSVFVRQkJIipVREYgTWFjIFVuaXF1ZUlEVGFibGUiCisjZGVmaW5lIFVERl9JRF9NQUNfUkVTT1VSQ0UJCSIqVURGIE1hYyBSZXNvdXJjZUZvcmsiCisjZGVmaW5lIFVERl9JRF9WSVJUVUFMCQkJIipVREYgVmlydHVhbCBQYXJ0aXRpb24iCisjZGVmaW5lIFVERl9JRF9TUEFSQUJMRQkJCSIqVURGIFNwYXJhYmxlIFBhcnRpdGlvbiIKKyNkZWZpbmUgVURGX0lEX0FMTE9DCQkJIipVREYgVmlydHVhbCBBbGxvYyBUYmwiCisjZGVmaW5lIFVERl9JRF9TUEFSSU5HCQkJIipVREYgU3BhcmluZyBUYWJsZSIKKyNkZWZpbmUgVURGX0lEX01FVEFEQVRBCQkJIipVREYgTWV0YWRhdGEgUGFydGl0aW9uIgorCisvKiBJZGVudGlmaWVyIFN1ZmZpeCAoVURGIDIuNTAgMi4xLjUuMykgKi8KKyNkZWZpbmUgSVNfREZfSEFSRF9XUklURV9QUk9URUNUCTB4MDEKKyNkZWZpbmUgSVNfREZfU09GVF9XUklURV9QUk9URUNUCTB4MDIKKworc3RydWN0IFVERklkZW50U3VmZml4Cit7CisJX19sZTE2CQlVREZSZXZpc2lvbjsKKwl1aW50OF90CQlPU0NsYXNzOworCXVpbnQ4X3QJCU9TSWRlbnRpZmllcjsKKwl1aW50OF90CQlyZXNlcnZlZFs0XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaW1wSWRlbnRTdWZmaXgKK3sKKwl1aW50OF90CQlPU0NsYXNzOworCXVpbnQ4X3QJCU9TSWRlbnRpZmllcjsKKwl1aW50OF90CQlyZXNlcnZlZFs2XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgYXBwSWRlbnRTdWZmaXgKK3sKKwl1aW50OF90CQlpbXBVc2VbOF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogTG9naWNhbCBWb2x1bWUgSW50ZWdyaXR5IERlc2NyaXB0b3IgKFVERiAyLjUwIDIuMi42KSAqLworLyogSW1wbGVtZW50YXRpb24gVXNlIChVREYgMi41MCAyLjIuNi40KSAqLworc3RydWN0IGxvZ2ljYWxWb2xJbnRlZ3JpdHlEZXNjSW1wVXNlCit7CisJcmVnaWQJCWltcElkZW50OworCV9fbGUzMgkJbnVtRmlsZXM7CisJX19sZTMyCQludW1EaXJzOworCV9fbGUxNgkJbWluVURGUmVhZFJldjsKKwlfX2xlMTYJCW1pblVERldyaXRlUmV2OworCV9fbGUxNgkJbWF4VURGV3JpdGVSZXY7CisJdWludDhfdAkJaW1wVXNlWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEltcGxlbWVudGF0aW9uIFVzZSBWb2x1bWUgRGVzY3JpcHRvciAoVURGIDIuNTAgMi4yLjcpICovCisvKiBJbXBsZW1lbnRhdGlvbiBVc2UgKFVERiAyLjUwIDIuMi43LjIpICovCitzdHJ1Y3QgaW1wVXNlVm9sRGVzY0ltcFVzZQoreworCWNoYXJzcGVjCUxWSUNoYXJzZXQ7CisJZHN0cmluZwkJbG9naWNhbFZvbElkZW50WzEyOF07CisJZHN0cmluZwkJTFZJbmZvMVszNl07CisJZHN0cmluZwkJTFZJbmZvMlszNl07CisJZHN0cmluZwkJTFZJbmZvM1szNl07CisJcmVnaWQJCWltcElkZW50OworCXVpbnQ4X3QJCWltcFVzZVsxMjhdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCB1ZGZQYXJ0aXRpb25NYXAyCit7CisJdWludDhfdAkJcGFydGl0aW9uTWFwVHlwZTsKKwl1aW50OF90CQlwYXJ0aXRpb25NYXBMZW5ndGg7CisJdWludDhfdAkJcmVzZXJ2ZWQxWzJdOworCXJlZ2lkCQlwYXJ0SWRlbnQ7CisJX19sZTE2CQl2b2xTZXFOdW07CisJX19sZTE2CQlwYXJ0aXRpb25OdW07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVmlydHVhbCBQYXJ0aXRpb24gTWFwIChVREYgMi41MCAyLjIuOCkgKi8KK3N0cnVjdCB2aXJ0dWFsUGFydGl0aW9uTWFwCit7CisJdWludDhfdAkJcGFydGl0aW9uTWFwVHlwZTsKKwl1aW50OF90CQlwYXJ0aXRpb25NYXBMZW5ndGg7CisJdWludDhfdAkJcmVzZXJ2ZWQxWzJdOworCXJlZ2lkCQlwYXJ0SWRlbnQ7CisJX19sZTE2CQl2b2xTZXFOdW07CisJX19sZTE2CQlwYXJ0aXRpb25OdW07CisJdWludDhfdAkJcmVzZXJ2ZWQyWzI0XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTcGFyYWJsZSBQYXJ0aXRpb24gTWFwIChVREYgMi41MCAyLjIuOSkgKi8KK3N0cnVjdCBzcGFyYWJsZVBhcnRpdGlvbk1hcAoreworCXVpbnQ4X3QJCXBhcnRpdGlvbk1hcFR5cGU7CisJdWludDhfdAkJcGFydGl0aW9uTWFwTGVuZ3RoOworCXVpbnQ4X3QJCXJlc2VydmVkMVsyXTsKKwlyZWdpZAkJcGFydElkZW50OworCV9fbGUxNgkJdm9sU2VxTnVtOworCV9fbGUxNgkJcGFydGl0aW9uTnVtOworCV9fbGUxNgkJcGFja2V0TGVuZ3RoOworCXVpbnQ4X3QJCW51bVNwYXJpbmdUYWJsZXM7CisJdWludDhfdAkJcmVzZXJ2ZWQyWzFdOworCV9fbGUzMgkJc2l6ZVNwYXJpbmdUYWJsZTsKKwlfX2xlMzIJCWxvY1NwYXJpbmdUYWJsZVs0XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBNZXRhZGF0YSBQYXJ0aXRpb24gTWFwIChVREYgMi40LjAgMi4yLjEwKSAqLworc3RydWN0IG1ldGFkYXRhUGFydGl0aW9uTWFwCit7CisJdWludDhfdAkJcGFydGl0aW9uTWFwVHlwZTsKKwl1aW50OF90CQlwYXJ0aXRpb25NYXBMZW5ndGg7CisJdWludDhfdAkJcmVzZXJ2ZWQxWzJdOworCXJlZ2lkCQlwYXJ0SWRlbnQ7CisJX19sZTE2CQl2b2xTZXFOdW07CisJX19sZTE2CQlwYXJ0aXRpb25OdW07CisJX19sZTMyCQltZXRhZGF0YUZpbGVMb2M7CisJX19sZTMyCQltZXRhZGF0YU1pcnJvckZpbGVMb2M7CisJX19sZTMyCQltZXRhZGF0YUJpdG1hcEZpbGVMb2M7CisJX19sZTMyCQlhbGxvY1VuaXRTaXplOworCV9fbGUxNgkJYWxpZ25Vbml0U2l6ZTsKKwl1aW50OF90CQlmbGFnczsKKwl1aW50OF90CQlyZXNlcnZlZDJbNV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVmlydHVhbCBBbGxvY2F0aW9uIFRhYmxlIChVREYgMS41IDIuMi4xMCkgKi8KK3N0cnVjdCB2aXJ0dWFsQWxsb2NhdGlvblRhYmxlMTUKK3sKKwlfX2xlMzIJCVZpcnR1YWxTZWN0b3JbMF07CisJcmVnaWQJCXZhdElkZW50OworCV9fbGUzMgkJcHJldmlvdXNWQVRJQ0JMb2M7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsgIAorCisjZGVmaW5lIElDQlRBR19GSUxFX1RZUEVfVkFUMTUJCTB4MDBVCisKKy8qIFZpcnR1YWwgQWxsb2NhdGlvbiBUYWJsZSAoVURGIDIuNTAgMi4yLjExKSAqLworc3RydWN0IHZpcnR1YWxBbGxvY2F0aW9uVGFibGUyMAoreworCV9fbGUxNgkJbGVuZ3RoSGVhZGVyOworCV9fbGUxNgkJbGVuZ3RoSW1wVXNlOworCWRzdHJpbmcJCWxvZ2ljYWxWb2xJZGVudFsxMjhdOworCV9fbGUzMgkJcHJldmlvdXNWQVRJQ0JMb2M7CisJX19sZTMyCQludW1GaWxlczsKKwlfX2xlMzIJCW51bURpcnM7CisJX19sZTE2CQltaW5SZWFkUmV2aXNpb247CisJX19sZTE2CQltaW5Xcml0ZVJldmlzaW9uOworCV9fbGUxNgkJbWF4V3JpdGVSZXZpc2lvbjsKKwlfX2xlMTYJCXJlc2VydmVkOworCXVpbnQ4X3QJCWltcFVzZVswXTsKKwlfX2xlMzIJCXZhdEVudHJ5WzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgSUNCVEFHX0ZJTEVfVFlQRV9WQVQyMAkJMHhGOFUKKworLyogU3BhcmluZyBUYWJsZSAoVURGIDIuNTAgMi4yLjEyKSAqLworc3RydWN0IHNwYXJpbmdFbnRyeQoreworCV9fbGUzMgkJb3JpZ0xvY2F0aW9uOworCV9fbGUzMgkJbWFwcGVkTG9jYXRpb247Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHNwYXJpbmdUYWJsZQoreworCXRhZyAJCWRlc2NUYWc7CisJcmVnaWQJCXNwYXJpbmdJZGVudDsKKwlfX2xlMTYJCXJlYWxsb2NhdGlvblRhYmxlTGVuOworCV9fbGUxNgkJcmVzZXJ2ZWQ7CisJX19sZTMyCQlzZXF1ZW5jZU51bTsKKwlzdHJ1Y3Qgc3BhcmluZ0VudHJ5CisJCQltYXBFbnRyeVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBNZXRhZGF0YSBGaWxlIChhbmQgTWV0YWRhdGEgTWlycm9yIEZpbGUpIChVREYgMi41MCAyLjIuMTMuMSkgKi8KKyNkZWZpbmUgSUNCVEFHX0ZJTEVfVFlQRV9NQUlOCQkweEZBCisjZGVmaW5lIElDQlRBR19GSUxFX1RZUEVfTUlSUk9SCQkweEZCCisjZGVmaW5lIElDQlRBR19GSUxFX1RZUEVfQklUTUFQCQkweEZDCisKKy8qIHN0cnVjdCBsb25nX2FkIElDQiAtIEFESW1wVXNlIChVREYgMi41MCAyLjIuNC4zKSAqLworc3RydWN0IGFsbG9jRGVzY0ltcFVzZQoreworCV9fbGUxNgkJZmxhZ3M7CisJdWludDhfdAkJaW1wVXNlWzRdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgQURfSVVfRVhUX0VSQVNFRAkJMHgwMDAxCisKKy8qIFJlYWwtVGltZSBGaWxlcyAoVURGIDIuNTAgNi4xMSkgKi8KKyNkZWZpbmUgSUNCVEFHX0ZJTEVfVFlQRV9SRUFMVElNRQkweEY5VQorCisvKiBJbXBsZW1lbnRhdGlvbiBVc2UgRXh0ZW5kZWQgQXR0cmlidXRlIChVREYgMi41MCAzLjMuNC41KSAqLworLyogRnJlZUVBU3BhY2UgKFVERiAyLjUwIDMuMy40LjUuMS4xKSAqLworc3RydWN0IGZyZWVFYVNwYWNlCit7CisJX19sZTE2CQloZWFkZXJDaGVja3N1bTsKKwl1aW50OF90CQlmcmVlRUFTcGFjZVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBEVkQgQ29weXJpZ2h0IE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gKFVERiAyLjUwIDMuMy40LjUuMS4yKSAqLworc3RydWN0IERWRENvcHlyaWdodEltcFVzZSAKK3sKKwlfX2xlMTYJCWhlYWRlckNoZWNrc3VtOworCXVpbnQ4X3QJCUNHTVNJbmZvOworCXVpbnQ4X3QJCWRhdGFUeXBlOworCXVpbnQ4X3QJCXByb3RlY3Rpb25TeXN0ZW1JbmZvWzRdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEFwcGxpY2F0aW9uIFVzZSBFeHRlbmRlZCBBdHRyaWJ1dGUgKFVERiAyLjUwIDMuMy40LjYpICovCisvKiBGcmVlQXBwRUFTcGFjZSAoVURGIDIuNTAgMy4zLjQuNi4xKSAqLworc3RydWN0IGZyZWVBcHBFQVNwYWNlCit7CisJX19sZTE2CQloZWFkZXJDaGVja3N1bTsKKwl1aW50OF90CQlmcmVlRUFTcGFjZVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBVREYgRGVmaW5lZCBTeXN0ZW0gU3RyZWFtIChVREYgMi41MCAzLjMuNykgKi8KKyNkZWZpbmUgVURGX0lEX1VOSVFVRV9JRAkJIipVREYgVW5pcXVlIElEIE1hcHBpbmcgRGF0YSIKKyNkZWZpbmUgVURGX0lEX05PTl9BTExPQwkJIipVREYgTm9uLUFsbG9jYXRhYmxlIFNwYWNlIgorI2RlZmluZSBVREZfSURfUE9XRVJfQ0FMCQkiKlVERiBQb3dlciBDYWwgVGFibGUiCisjZGVmaW5lIFVERl9JRF9CQUNLVVAJCQkiKlVERiBCYWNrdXAiCisKKy8qIE9wZXJhdGluZyBTeXN0ZW0gSWRlbnRpZmllcnMgKFVERiAyLjUwIDYuMykgKi8KKyNkZWZpbmUgVURGX09TX0NMQVNTX1VOREVGCQkweDAwVQorI2RlZmluZSBVREZfT1NfQ0xBU1NfRE9TCQkweDAxVQorI2RlZmluZSBVREZfT1NfQ0xBU1NfT1MyCQkweDAyVQorI2RlZmluZSBVREZfT1NfQ0xBU1NfTUFDCQkweDAzVQorI2RlZmluZSBVREZfT1NfQ0xBU1NfVU5JWAkJMHgwNFUKKyNkZWZpbmUgVURGX09TX0NMQVNTX1dJTjlYCQkweDA1VQorI2RlZmluZSBVREZfT1NfQ0xBU1NfV0lOTlQJCTB4MDZVCisjZGVmaW5lIFVERl9PU19DTEFTU19PUzQwMAkJMHgwN1UKKyNkZWZpbmUgVURGX09TX0NMQVNTX0JFT1MJCTB4MDhVCisjZGVmaW5lIFVERl9PU19DTEFTU19XSU5DRQkJMHgwOVUKKworI2RlZmluZSBVREZfT1NfSURfVU5ERUYJCQkweDAwVQorI2RlZmluZSBVREZfT1NfSURfRE9TCQkJMHgwMFUKKyNkZWZpbmUgVURGX09TX0lEX09TMgkJCTB4MDBVCisjZGVmaW5lIFVERl9PU19JRF9NQUMJCQkweDAwVQorI2RlZmluZSBVREZfT1NfSURfTUFYX09TWAkJMHgwMVUKKyNkZWZpbmUgVURGX09TX0lEX1VOSVgJCQkweDAwVQorI2RlZmluZSBVREZfT1NfSURfQUlYCQkJMHgwMVUKKyNkZWZpbmUgVURGX09TX0lEX1NPTEFSSVMJCTB4MDJVCisjZGVmaW5lIFVERl9PU19JRF9IUFVYCQkJMHgwM1UKKyNkZWZpbmUgVURGX09TX0lEX0lSSVgJCQkweDA0VQorI2RlZmluZSBVREZfT1NfSURfTElOVVgJCQkweDA1VQorI2RlZmluZSBVREZfT1NfSURfTUtMSU5VWAkJMHgwNlUKKyNkZWZpbmUgVURGX09TX0lEX0ZSRUVCU0QJCTB4MDdVCisjZGVmaW5lIFVERl9PU19JRF9XSU45WAkJCTB4MDBVCisjZGVmaW5lIFVERl9PU19JRF9XSU5OVAkJCTB4MDBVCisjZGVmaW5lIFVERl9PU19JRF9PUzQwMAkJCTB4MDBVCisjZGVmaW5lIFVERl9PU19JRF9CRU9TCQkJMHgwMFUKKyNkZWZpbmUgVURGX09TX0lEX1dJTkNFCQkJMHgwMFUKKworI2VuZGlmIC8qIF9PU1RBX1VERl9IICovCmRpZmYgLS1naXQgYS9mcy91ZGYvcGFydGl0aW9uLmMgYi9mcy91ZGYvcGFydGl0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzNmYyNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3VkZi9wYXJ0aXRpb24uYwpAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqIHBhcnRpdGlvbi5jCisgKgorICogUFVSUE9TRQorICogICAgICBQYXJ0aXRpb24gaGFuZGxpbmcgcm91dGluZXMgZm9yIHRoZSBPU1RBLVVERih0bSkgZmlsZXN5c3RlbS4KKyAqCisgKiBDT05UQUNUUworICogICAgICBFLW1haWwgcmVnYXJkaW5nIGFueSBwb3J0aW9uIG9mIHRoZSBMaW51eCBVREYgZmlsZSBzeXN0ZW0gc2hvdWxkIGJlCisgKiAgICAgIGRpcmVjdGVkIHRvIHRoZSBkZXZlbG9wbWVudCB0ZWFtIG1haWxpbmcgbGlzdCAocnVuIGJ5IG1ham9yZG9tbyk6CisgKiAgICAgICAgICAgICAgbGludXhfdWRmQGhwZXNqcm8uZmMuaHAuY29tCisgKgorICogQ09QWVJJR0hUCisgKiAgICAgIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgICBMaWNlbnNlIChHUEwpLiBDb3BpZXMgb2YgdGhlIEdQTCBjYW4gYmUgb2J0YWluZWQgZnJvbToKKyAqICAgICAgICAgICAgICBmdHA6Ly9wcmVwLmFpLm1pdC5lZHUvcHViL2dudS9HUEwKKyAqICAgICAgRWFjaCBjb250cmlidXRpbmcgYXV0aG9yIHJldGFpbnMgYWxsIHJpZ2h0cyB0byB0aGVpciBvd24gd29yay4KKyAqCisgKiAgKEMpIDE5OTgtMjAwMSBCZW4gRmVubmVtYQorICoKKyAqIEhJU1RPUlkKKyAqCisgKiAxMi8wNi85OCBibGYgIENyZWF0ZWQgZmlsZS4gCisgKgorICovCisKKyNpbmNsdWRlICJ1ZGZkZWNsLmgiCisjaW5jbHVkZSAidWRmX3NiLmgiCisjaW5jbHVkZSAidWRmX2kuaCIKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdWRmX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKK2lubGluZSB1aW50MzJfdCB1ZGZfZ2V0X3BibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1aW50MzJfdCBibG9jaywgdWludDE2X3QgcGFydGl0aW9uLCB1aW50MzJfdCBvZmZzZXQpCit7CisJaWYgKHBhcnRpdGlvbiA+PSBVREZfU0JfTlVNUEFSVFMoc2IpKQorCXsKKwkJdWRmX2RlYnVnKCJibG9jaz0lZCwgcGFydGl0aW9uPSVkLCBvZmZzZXQ9JWQ6IGludmFsaWQgcGFydGl0aW9uXG4iLAorCQkJYmxvY2ssIHBhcnRpdGlvbiwgb2Zmc2V0KTsKKwkJcmV0dXJuIDB4RkZGRkZGRkY7CisJfQorCWlmIChVREZfU0JfUEFSVEZVTkMoc2IsIHBhcnRpdGlvbikpCisJCXJldHVybiBVREZfU0JfUEFSVEZVTkMoc2IsIHBhcnRpdGlvbikoc2IsIGJsb2NrLCBwYXJ0aXRpb24sIG9mZnNldCk7CisJZWxzZQorCQlyZXR1cm4gVURGX1NCX1BBUlRST09UKHNiLCBwYXJ0aXRpb24pICsgYmxvY2sgKyBvZmZzZXQ7Cit9CisKK3VpbnQzMl90IHVkZl9nZXRfcGJsb2NrX3ZpcnQxNShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1aW50MzJfdCBibG9jaywgdWludDE2X3QgcGFydGl0aW9uLCB1aW50MzJfdCBvZmZzZXQpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJdWludDMyX3QgbmV3YmxvY2s7CisJdWludDMyX3QgaW5kZXg7CisJdWludDMyX3QgbG9jOworCisJaW5kZXggPSAoc2ItPnNfYmxvY2tzaXplIC0gVURGX1NCX1RZUEVWSVJUKHNiLHBhcnRpdGlvbikuc19zdGFydF9vZmZzZXQpIC8gc2l6ZW9mKHVpbnQzMl90KTsKKworCWlmIChibG9jayA+IFVERl9TQl9UWVBFVklSVChzYixwYXJ0aXRpb24pLnNfbnVtX2VudHJpZXMpCisJeworCQl1ZGZfZGVidWcoIlRyeWluZyB0byBhY2Nlc3MgYmxvY2sgYmV5b25kIGVuZCBvZiBWQVQgKCVkIG1heCAlZClcbiIsCisJCQlibG9jaywgVURGX1NCX1RZUEVWSVJUKHNiLHBhcnRpdGlvbikuc19udW1fZW50cmllcyk7CisJCXJldHVybiAweEZGRkZGRkZGOworCX0KKworCWlmIChibG9jayA+PSBpbmRleCkKKwl7CisJCWJsb2NrIC09IGluZGV4OworCQluZXdibG9jayA9IDEgKyAoYmxvY2sgLyAoc2ItPnNfYmxvY2tzaXplIC8gc2l6ZW9mKHVpbnQzMl90KSkpOworCQlpbmRleCA9IGJsb2NrICUgKHNiLT5zX2Jsb2Nrc2l6ZSAvIHNpemVvZih1aW50MzJfdCkpOworCX0KKwllbHNlCisJeworCQluZXdibG9jayA9IDA7CisJCWluZGV4ID0gVURGX1NCX1RZUEVWSVJUKHNiLHBhcnRpdGlvbikuc19zdGFydF9vZmZzZXQgLyBzaXplb2YodWludDMyX3QpICsgYmxvY2s7CisJfQorCisJbG9jID0gdWRmX2Jsb2NrX21hcChVREZfU0JfVkFUKHNiKSwgbmV3YmxvY2spOworCisJaWYgKCEoYmggPSBzYl9icmVhZChzYiwgbG9jKSkpCisJeworCQl1ZGZfZGVidWcoImdldF9wYmxvY2soVURGX1ZJUlRVQUxfTUFQOiVwLCVkLCVkKSBWQVQ6ICVkWyVkXVxuIiwKKwkJCXNiLCBibG9jaywgcGFydGl0aW9uLCBsb2MsIGluZGV4KTsKKwkJcmV0dXJuIDB4RkZGRkZGRkY7CisJfQorCisJbG9jID0gbGUzMl90b19jcHUoKChfX2xlMzIgKiliaC0+Yl9kYXRhKVtpbmRleF0pOworCisJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisKKwlpZiAoVURGX0lfTE9DQVRJT04oVURGX1NCX1ZBVChzYikpLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9PSBwYXJ0aXRpb24pCisJeworCQl1ZGZfZGVidWcoInJlY3Vyc2l2ZSBjYWxsIHRvIHVkZl9nZXRfcGJsb2NrIVxuIik7CisJCXJldHVybiAweEZGRkZGRkZGOworCX0KKworCXJldHVybiB1ZGZfZ2V0X3BibG9jayhzYiwgbG9jLCBVREZfSV9MT0NBVElPTihVREZfU0JfVkFUKHNiKSkucGFydGl0aW9uUmVmZXJlbmNlTnVtLCBvZmZzZXQpOworfQorCitpbmxpbmUgdWludDMyX3QgdWRmX2dldF9wYmxvY2tfdmlydDIwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVpbnQzMl90IGJsb2NrLCB1aW50MTZfdCBwYXJ0aXRpb24sIHVpbnQzMl90IG9mZnNldCkKK3sKKwlyZXR1cm4gdWRmX2dldF9wYmxvY2tfdmlydDE1KHNiLCBibG9jaywgcGFydGl0aW9uLCBvZmZzZXQpOworfQorCit1aW50MzJfdCB1ZGZfZ2V0X3BibG9ja19zcGFyMTUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdWludDMyX3QgYmxvY2ssIHVpbnQxNl90IHBhcnRpdGlvbiwgdWludDMyX3Qgb2Zmc2V0KQoreworCWludCBpOworCXN0cnVjdCBzcGFyaW5nVGFibGUgKnN0ID0gTlVMTDsKKwl1aW50MzJfdCBwYWNrZXQgPSAoYmxvY2sgKyBvZmZzZXQpICYgfihVREZfU0JfVFlQRVNQQVIoc2IscGFydGl0aW9uKS5zX3BhY2tldF9sZW4gLSAxKTsKKworCWZvciAoaT0wOyBpPDQ7IGkrKykKKwl7CisJCWlmIChVREZfU0JfVFlQRVNQQVIoc2IscGFydGl0aW9uKS5zX3NwYXJfbWFwW2ldICE9IE5VTEwpCisJCXsKKwkJCXN0ID0gKHN0cnVjdCBzcGFyaW5nVGFibGUgKilVREZfU0JfVFlQRVNQQVIoc2IscGFydGl0aW9uKS5zX3NwYXJfbWFwW2ldLT5iX2RhdGE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChzdCkKKwl7CisJCWZvciAoaT0wOyBpPGxlMTZfdG9fY3B1KHN0LT5yZWFsbG9jYXRpb25UYWJsZUxlbik7IGkrKykKKwkJeworCQkJaWYgKGxlMzJfdG9fY3B1KHN0LT5tYXBFbnRyeVtpXS5vcmlnTG9jYXRpb24pID49IDB4RkZGRkZGRjApCisJCQkJYnJlYWs7CisJCQllbHNlIGlmIChsZTMyX3RvX2NwdShzdC0+bWFwRW50cnlbaV0ub3JpZ0xvY2F0aW9uKSA9PSBwYWNrZXQpCisJCQl7CisJCQkJcmV0dXJuIGxlMzJfdG9fY3B1KHN0LT5tYXBFbnRyeVtpXS5tYXBwZWRMb2NhdGlvbikgKworCQkJCQkoKGJsb2NrICsgb2Zmc2V0KSAmIChVREZfU0JfVFlQRVNQQVIoc2IscGFydGl0aW9uKS5zX3BhY2tldF9sZW4gLSAxKSk7CisJCQl9CisJCQllbHNlIGlmIChsZTMyX3RvX2NwdShzdC0+bWFwRW50cnlbaV0ub3JpZ0xvY2F0aW9uKSA+IHBhY2tldCkKKwkJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gVURGX1NCX1BBUlRST09UKHNiLHBhcnRpdGlvbikgKyBibG9jayArIG9mZnNldDsKK30KKworaW50IHVkZl9yZWxvY2F0ZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgbG9uZyBvbGRfYmxvY2ssIGxvbmcgKm5ld19ibG9jaykKK3sKKwlzdHJ1Y3QgdWRmX3NwYXJpbmdfZGF0YSAqc2RhdGE7CisJc3RydWN0IHNwYXJpbmdUYWJsZSAqc3QgPSBOVUxMOworCXN0cnVjdCBzcGFyaW5nRW50cnkgbWFwRW50cnk7CisJdWludDMyX3QgcGFja2V0OworCWludCBpLCBqLCBrLCBsOworCisJZm9yIChpPTA7IGk8VURGX1NCX05VTVBBUlRTKHNiKTsgaSsrKQorCXsKKwkJaWYgKG9sZF9ibG9jayA+IFVERl9TQl9QQVJUUk9PVChzYixpKSAmJgorCQkgICAgb2xkX2Jsb2NrIDwgVURGX1NCX1BBUlRST09UKHNiLGkpICsgVURGX1NCX1BBUlRMRU4oc2IsaSkpCisJCXsKKwkJCXNkYXRhID0gJlVERl9TQl9UWVBFU1BBUihzYixpKTsKKwkJCXBhY2tldCA9IChvbGRfYmxvY2sgLSBVREZfU0JfUEFSVFJPT1Qoc2IsaSkpICYgfihzZGF0YS0+c19wYWNrZXRfbGVuIC0gMSk7CisKKwkJCWZvciAoaj0wOyBqPDQ7IGorKykKKwkJCXsKKwkJCQlpZiAoVURGX1NCX1RZUEVTUEFSKHNiLGkpLnNfc3Bhcl9tYXBbal0gIT0gTlVMTCkKKwkJCQl7CisJCQkJCXN0ID0gKHN0cnVjdCBzcGFyaW5nVGFibGUgKilzZGF0YS0+c19zcGFyX21hcFtqXS0+Yl9kYXRhOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmICghc3QpCisJCQkJcmV0dXJuIDE7CisKKwkJCWZvciAoaz0wOyBrPGxlMTZfdG9fY3B1KHN0LT5yZWFsbG9jYXRpb25UYWJsZUxlbik7IGsrKykKKwkJCXsKKwkJCQlpZiAobGUzMl90b19jcHUoc3QtPm1hcEVudHJ5W2tdLm9yaWdMb2NhdGlvbikgPT0gMHhGRkZGRkZGRikKKwkJCQl7CisJCQkJCWZvciAoOyBqPDQ7IGorKykKKwkJCQkJeworCQkJCQkJaWYgKHNkYXRhLT5zX3NwYXJfbWFwW2pdKQorCQkJCQkJeworCQkJCQkJCXN0ID0gKHN0cnVjdCBzcGFyaW5nVGFibGUgKilzZGF0YS0+c19zcGFyX21hcFtqXS0+Yl9kYXRhOworCQkJCQkJCXN0LT5tYXBFbnRyeVtrXS5vcmlnTG9jYXRpb24gPSBjcHVfdG9fbGUzMihwYWNrZXQpOworCQkJCQkJCXVkZl91cGRhdGVfdGFnKChjaGFyICopc3QsIHNpemVvZihzdHJ1Y3Qgc3BhcmluZ1RhYmxlKSArIGxlMTZfdG9fY3B1KHN0LT5yZWFsbG9jYXRpb25UYWJsZUxlbikgKiBzaXplb2Yoc3RydWN0IHNwYXJpbmdFbnRyeSkpOworCQkJCQkJCW1hcmtfYnVmZmVyX2RpcnR5KHNkYXRhLT5zX3NwYXJfbWFwW2pdKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkqbmV3X2Jsb2NrID0gbGUzMl90b19jcHUoc3QtPm1hcEVudHJ5W2tdLm1hcHBlZExvY2F0aW9uKSArCisJCQkJCQkoKG9sZF9ibG9jayAtIFVERl9TQl9QQVJUUk9PVChzYixpKSkgJiAoc2RhdGEtPnNfcGFja2V0X2xlbiAtIDEpKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCWVsc2UgaWYgKGxlMzJfdG9fY3B1KHN0LT5tYXBFbnRyeVtrXS5vcmlnTG9jYXRpb24pID09IHBhY2tldCkKKwkJCQl7CisJCQkJCSpuZXdfYmxvY2sgPSBsZTMyX3RvX2NwdShzdC0+bWFwRW50cnlba10ubWFwcGVkTG9jYXRpb24pICsKKwkJCQkJCSgob2xkX2Jsb2NrIC0gVURGX1NCX1BBUlRST09UKHNiLGkpKSAmIChzZGF0YS0+c19wYWNrZXRfbGVuIC0gMSkpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJZWxzZSBpZiAobGUzMl90b19jcHUoc3QtPm1hcEVudHJ5W2tdLm9yaWdMb2NhdGlvbikgPiBwYWNrZXQpCisJCQkJCWJyZWFrOworCQkJfQorCQkJZm9yIChsPWs7IGw8bGUxNl90b19jcHUoc3QtPnJlYWxsb2NhdGlvblRhYmxlTGVuKTsgbCsrKQorCQkJeworCQkJCWlmIChsZTMyX3RvX2NwdShzdC0+bWFwRW50cnlbbF0ub3JpZ0xvY2F0aW9uKSA9PSAweEZGRkZGRkZGKQorCQkJCXsKKwkJCQkJZm9yICg7IGo8NDsgaisrKQorCQkJCQl7CisJCQkJCQlpZiAoc2RhdGEtPnNfc3Bhcl9tYXBbal0pCisJCQkJCQl7CisJCQkJCQkJc3QgPSAoc3RydWN0IHNwYXJpbmdUYWJsZSAqKXNkYXRhLT5zX3NwYXJfbWFwW2pdLT5iX2RhdGE7CisJCQkJCQkJbWFwRW50cnkgPSBzdC0+bWFwRW50cnlbbF07CisJCQkJCQkJbWFwRW50cnkub3JpZ0xvY2F0aW9uID0gY3B1X3RvX2xlMzIocGFja2V0KTsKKwkJCQkJCQltZW1tb3ZlKCZzdC0+bWFwRW50cnlbaysxXSwgJnN0LT5tYXBFbnRyeVtrXSwgKGwtaykqc2l6ZW9mKHN0cnVjdCBzcGFyaW5nRW50cnkpKTsKKwkJCQkJCQlzdC0+bWFwRW50cnlba10gPSBtYXBFbnRyeTsKKwkJCQkJCQl1ZGZfdXBkYXRlX3RhZygoY2hhciAqKXN0LCBzaXplb2Yoc3RydWN0IHNwYXJpbmdUYWJsZSkgKyBsZTE2X3RvX2NwdShzdC0+cmVhbGxvY2F0aW9uVGFibGVMZW4pICogc2l6ZW9mKHN0cnVjdCBzcGFyaW5nRW50cnkpKTsKKwkJCQkJCQltYXJrX2J1ZmZlcl9kaXJ0eShzZGF0YS0+c19zcGFyX21hcFtqXSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJKm5ld19ibG9jayA9IGxlMzJfdG9fY3B1KHN0LT5tYXBFbnRyeVtrXS5tYXBwZWRMb2NhdGlvbikgKworCQkJCQkJKChvbGRfYmxvY2sgLSBVREZfU0JfUEFSVFJPT1Qoc2IsaSkpICYgKHNkYXRhLT5zX3BhY2tldF9sZW4gLSAxKSk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiAxOworCQl9CisJfQorCWlmIChpID09IFVERl9TQl9OVU1QQVJUUyhzYikpCisJeworCQkvKiBvdXRzaWRlIG9mIHBhcnRpdGlvbnMgKi8KKwkJLyogZm9yIG5vdywgZmFpbCA9KSAqLworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL3VkZi9zdXBlci5jIGIvZnMvdWRmL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTViZDRmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3VkZi9zdXBlci5jCkBAIC0wLDAgKzEsMTkzNCBAQAorLyoKKyAqIHN1cGVyLmMKKyAqCisgKiBQVVJQT1NFCisgKiAgU3VwZXIgYmxvY2sgcm91dGluZXMgZm9yIHRoZSBPU1RBLVVERih0bSkgZmlsZXN5c3RlbS4KKyAqCisgKiBERVNDUklQVElPTgorICogIE9TVEEtVURGKHRtKSA9IE9wdGljYWwgU3RvcmFnZSBUZWNobm9sb2d5IEFzc29jaWF0aW9uCisgKiAgVW5pdmVyc2FsIERpc2sgRm9ybWF0LgorICoKKyAqICBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdmVyc2lvbiAyLjAwIG9mIHRoZSBVREYgc3BlY2lmaWNhdGlvbiwKKyAqICBhbmQgcmV2aXNpb24gMyBvZiB0aGUgRUNNQSAxNjcgc3RhbmRhcmQgW2VxdWl2YWxlbnQgdG8gSVNPIDEzMzQ2XS4KKyAqICAgIGh0dHA6Ly93d3cub3N0YS5vcmcvCisgKiAgICBodHRwOi8vd3d3LmVjbWEuY2gvCisgKiAgICBodHRwOi8vd3d3Lmlzby5vcmcvCisgKgorICogQ09OVEFDVFMKKyAqICBFLW1haWwgcmVnYXJkaW5nIGFueSBwb3J0aW9uIG9mIHRoZSBMaW51eCBVREYgZmlsZSBzeXN0ZW0gc2hvdWxkIGJlCisgKiAgZGlyZWN0ZWQgdG8gdGhlIGRldmVsb3BtZW50IHRlYW0gbWFpbGluZyBsaXN0IChydW4gYnkgbWFqb3Jkb21vKToKKyAqCSAgbGludXhfdWRmQGhwZXNqcm8uZmMuaHAuY29tCisgKgorICogQ09QWVJJR0hUCisgKiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSAoR1BMKS4gQ29waWVzIG9mIHRoZSBHUEwgY2FuIGJlIG9idGFpbmVkIGZyb206CisgKiAgICBmdHA6Ly9wcmVwLmFpLm1pdC5lZHUvcHViL2dudS9HUEwKKyAqICBFYWNoIGNvbnRyaWJ1dGluZyBhdXRob3IgcmV0YWlucyBhbGwgcmlnaHRzIHRvIHRoZWlyIG93biB3b3JrLgorICoKKyAqICAoQykgMTk5OCBEYXZlIEJveW50b24KKyAqICAoQykgMTk5OC0yMDA0IEJlbiBGZW5uZW1hCisgKiAgKEMpIDIwMDAgU3RlbGlhcyBDb21wdXRpbmcgSW5jCisgKgorICogSElTVE9SWQorICoKKyAqICAwOS8yNC85OCBkZ2IgIGNoYW5nZWQgdG8gYWxsb3cgY29tcGlsaW5nIG91dHNpZGUgb2Yga2VybmVsLCBhbmQKKyAqICAgICAgICAgICAgICAgIGFkZGVkIHNvbWUgZGVidWdnaW5nLgorICogIDEwLzAxLzk4IGRnYiAgdXBkYXRlZCB0byBhbGxvdyAoc29tZSkgcG9zc2liaWxpdHkgb2YgY29tcGlsaW5nIHcvMi4wLjM0CisgKiAgMTAvMTYvOTggICAgICBhdHRlbXB0aW5nIHNvbWUgbXVsdGktc2Vzc2lvbiBzdXBwb3J0CisgKiAgMTAvMTcvOTggICAgICBhZGRlZCBmcmVlc3BhY2UgY291bnQgZm9yICJkZiIKKyAqICAxMS8xMS85OCBnciAgIGFkZGVkIG5vdnJzIG9wdGlvbgorICogIDExLzI2Lzk4IGRnYiAgYWRkZWQgZmlsZXNldCxhbmNob3IgbW91bnQgb3B0aW9ucworICogIDEyLzA2Lzk4IGJsZiAgcmVhbGx5IGhvc2VkIHRoaW5ncyByb3lhbGx5LiB2YXQvc3BhcmluZyBzdXBwb3J0LiBzZXF1ZW5jZWQgdm9sIGRlc2NzCisgKiAgICAgICAgICAgICAgICByZXdyb3RlIG9wdGlvbiBoYW5kbGluZyBiYXNlZCBvbiBpc29mcworICogIDEyLzIwLzk4ICAgICAgZmluZCB0aGUgZnJlZSBzcGFjZSBiaXRtYXAgKGlmIGl0IGV4aXN0cykKKyAqLworCisjaW5jbHVkZSAidWRmZGVjbC5oIiAgICAKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPGxpbnV4L3VkZl9mcy5oPgorI2luY2x1ZGUgInVkZl9zYi5oIgorI2luY2x1ZGUgInVkZl9pLmgiCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBWRFNfUE9TX1BSSU1BUllfVk9MX0RFU0MJMAorI2RlZmluZSBWRFNfUE9TX1VOQUxMT0NfU1BBQ0VfREVTQwkxCisjZGVmaW5lIFZEU19QT1NfTE9HSUNBTF9WT0xfREVTQwkyCisjZGVmaW5lIFZEU19QT1NfUEFSVElUSU9OX0RFU0MJCTMKKyNkZWZpbmUgVkRTX1BPU19JTVBfVVNFX1ZPTF9ERVNDCTQKKyNkZWZpbmUgVkRTX1BPU19WT0xfREVTQ19QVFIJCTUKKyNkZWZpbmUgVkRTX1BPU19URVJNSU5BVElOR19ERVNDCTYKKyNkZWZpbmUgVkRTX1BPU19MRU5HVEgJCQk3CisKK3N0YXRpYyBjaGFyIGVycm9yX2J1ZlsxMDI0XTsKKworLyogVGhlc2UgYXJlIHRoZSAibWVhdCIgLSBldmVyeXRoaW5nIGVsc2UgaXMgc3R1ZmZpbmcgKi8KK3N0YXRpYyBpbnQgdWRmX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICosIHZvaWQgKiwgaW50KTsKK3N0YXRpYyB2b2lkIHVkZl9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICopOworc3RhdGljIHZvaWQgdWRmX3dyaXRlX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK3N0YXRpYyBpbnQgdWRmX3JlbW91bnRfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCAqLCBjaGFyICopOworc3RhdGljIGludCB1ZGZfY2hlY2tfdmFsaWQoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgaW50KTsKK3N0YXRpYyBpbnQgdWRmX3ZycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgc2lsZW50KTsKK3N0YXRpYyBpbnQgdWRmX2xvYWRfcGFydGl0aW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBrZXJuZWxfbGJfYWRkciAqKTsKK3N0YXRpYyBpbnQgdWRmX2xvYWRfbG9naWNhbHZvbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICosIGtlcm5lbF9sYl9hZGRyICopOworc3RhdGljIHZvaWQgdWRmX2xvYWRfbG9naWNhbHZvbGludChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwga2VybmVsX2V4dGVudF9hZCk7CitzdGF0aWMgdm9pZCB1ZGZfZmluZF9hbmNob3Ioc3RydWN0IHN1cGVyX2Jsb2NrICopOworc3RhdGljIGludCB1ZGZfZmluZF9maWxlc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBrZXJuZWxfbGJfYWRkciAqLCBrZXJuZWxfbGJfYWRkciAqKTsKK3N0YXRpYyB2b2lkIHVkZl9sb2FkX3B2b2xkZXNjKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7CitzdGF0aWMgdm9pZCB1ZGZfbG9hZF9maWxlc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwga2VybmVsX2xiX2FkZHIgKik7CitzdGF0aWMgdm9pZCB1ZGZfbG9hZF9wYXJ0ZGVzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICopOworc3RhdGljIHZvaWQgdWRmX29wZW5fbHZpZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitzdGF0aWMgdm9pZCB1ZGZfY2xvc2VfbHZpZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitzdGF0aWMgdW5zaWduZWQgaW50IHVkZl9jb3VudF9mcmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK3N0YXRpYyBpbnQgdWRmX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGtzdGF0ZnMgKik7CisKKy8qIFVERiBmaWxlc3lzdGVtIHR5cGUgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnVkZl9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCB1ZGZfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB1ZGZfZnN0eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAidWRmIiwKKwkuZ2V0X3NiCQk9IHVkZl9nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2Jsb2NrX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwKK307CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKiB1ZGZfaW5vZGVfY2FjaGVwOworCitzdGF0aWMgc3RydWN0IGlub2RlICp1ZGZfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKmVpOworCWVpID0gKHN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2ModWRmX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghZWkpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmZWktPnZmc19pbm9kZTsKK30KKworc3RhdGljIHZvaWQgdWRmX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUodWRmX2lub2RlX2NhY2hlcCwgVURGX0koaW5vZGUpKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqKSBmb287CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKQorCXsKKwkJZWktPmlfZXh0LmlfZGF0YSA9IE5VTEw7CisJCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7CisJfQorfQorCitzdGF0aWMgaW50IGluaXRfaW5vZGVjYWNoZSh2b2lkKQoreworCXVkZl9pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgidWRmX2lub2RlX2NhY2hlIiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IHVkZl9pbm9kZV9pbmZvKSwKKwkJCQkJICAgICAwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQkJICAgICBpbml0X29uY2UsIE5VTEwpOworCWlmICh1ZGZfaW5vZGVfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKK3sKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KHVkZl9pbm9kZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9JTkZPICJ1ZGZfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworLyogU3VwZXJibG9jayBvcGVyYXRpb25zICovCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgdWRmX3NiX29wcyA9IHsKKwkuYWxsb2NfaW5vZGUJCT0gdWRmX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCQk9IHVkZl9kZXN0cm95X2lub2RlLAorCS53cml0ZV9pbm9kZQkJPSB1ZGZfd3JpdGVfaW5vZGUsCisJLmRlbGV0ZV9pbm9kZQkJPSB1ZGZfZGVsZXRlX2lub2RlLAorCS5jbGVhcl9pbm9kZQkJPSB1ZGZfY2xlYXJfaW5vZGUsCisJLnB1dF9zdXBlcgkJPSB1ZGZfcHV0X3N1cGVyLAorCS53cml0ZV9zdXBlcgkJPSB1ZGZfd3JpdGVfc3VwZXIsCisJLnN0YXRmcwkJCT0gdWRmX3N0YXRmcywKKwkucmVtb3VudF9mcwkJPSB1ZGZfcmVtb3VudF9mcywKK307CisKK3N0cnVjdCB1ZGZfb3B0aW9ucworeworCXVuc2lnbmVkIGNoYXIgbm92cnM7CisJdW5zaWduZWQgaW50IGJsb2Nrc2l6ZTsKKwl1bnNpZ25lZCBpbnQgc2Vzc2lvbjsKKwl1bnNpZ25lZCBpbnQgbGFzdGJsb2NrOworCXVuc2lnbmVkIGludCBhbmNob3I7CisJdW5zaWduZWQgaW50IHZvbHVtZTsKKwl1bnNpZ25lZCBzaG9ydCBwYXJ0aXRpb247CisJdW5zaWduZWQgaW50IGZpbGVzZXQ7CisJdW5zaWduZWQgaW50IHJvb3RkaXI7CisJdW5zaWduZWQgaW50IGZsYWdzOworCW1vZGVfdCB1bWFzazsKKwlnaWRfdCBnaWQ7CisJdWlkX3QgdWlkOworCXN0cnVjdCBubHNfdGFibGUgKm5sc19tYXA7Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3VkZl9mcyh2b2lkKQoreworCWludCBlcnI7CisJZXJyID0gaW5pdF9pbm9kZWNhY2hlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnVkZl9mc3R5cGUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCXJldHVybiAwOworb3V0OgorCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworb3V0MToKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF91ZGZfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnVkZl9mc3R5cGUpOworCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworfQorCittb2R1bGVfaW5pdChpbml0X3VkZl9mcykKK21vZHVsZV9leGl0KGV4aXRfdWRmX2ZzKQorCisvKgorICogdWRmX3BhcnNlX29wdGlvbnMKKyAqCisgKiBQVVJQT1NFCisgKglQYXJzZSBtb3VudCBvcHRpb25zLgorICoKKyAqIERFU0NSSVBUSU9OCisgKglUaGUgZm9sbG93aW5nIG1vdW50IG9wdGlvbnMgYXJlIHN1cHBvcnRlZDoKKyAqCisgKglnaWQ9CQlTZXQgdGhlIGRlZmF1bHQgZ3JvdXAuCisgKgl1bWFzaz0JCVNldCB0aGUgZGVmYXVsdCB1bWFzay4KKyAqCXVpZD0JCVNldCB0aGUgZGVmYXVsdCB1c2VyLgorICoJYnM9CQlTZXQgdGhlIGJsb2NrIHNpemUuCisgKgl1bmhpZGUJCVNob3cgb3RoZXJ3aXNlIGhpZGRlbiBmaWxlcy4KKyAqCXVuZGVsZXRlCVNob3cgZGVsZXRlZCBmaWxlcyBpbiBsaXN0cy4KKyAqCWFkaW5pY2IJCUVtYmVkIGRhdGEgaW4gdGhlIGlub2RlIChkZWZhdWx0KQorICoJbm9hZGluaWNiCURvbid0IGVtYmVkIGRhdGEgaW4gdGhlIGlub2RlCisgKglzaG9ydGFkCQlVc2Ugc2hvcnQgYWQncworICoJbG9uZ2FkCQlVc2UgbG9uZyBhZCdzIChkZWZhdWx0KQorICoJbm9zdHJpY3QJVW5zZXQgc3RyaWN0IGNvbmZvcm1hbmNlCisgKglpb2NoYXJzZXQ9CVNldCB0aGUgTkxTIGNoYXJhY3RlciBzZXQKKyAqCisgKglUaGUgcmVtYWluaW5nIGFyZSBmb3IgZGVidWdnaW5nIGFuZCBkaXNhc3RlciByZWNvdmVyeToKKyAqCisgKglub3ZycwkJU2tpcCB2b2x1bWUgc2VxdWVuY2UgcmVjb2duaXRpb24gCisgKgorICoJVGhlIGZvbGxvd2luZyBleHBlY3QgYSBvZmZzZXQgZnJvbSAwLgorICoKKyAqCXNlc3Npb249CVNldCB0aGUgQ0RST00gc2Vzc2lvbiAoZGVmYXVsdD0gbGFzdCBzZXNzaW9uKQorICoJYW5jaG9yPQkJT3ZlcnJpZGUgc3RhbmRhcmQgYW5jaG9yIGxvY2F0aW9uLiAoZGVmYXVsdD0gMjU2KQorICoJdm9sdW1lPQkJT3ZlcnJpZGUgdGhlIFZvbHVtZURlc2MgbG9jYXRpb24uICh1bnVzZWQpCisgKglwYXJ0aXRpb249CU92ZXJyaWRlIHRoZSBQYXJ0aXRpb25EZXNjIGxvY2F0aW9uLiAodW51c2VkKQorICoJbGFzdGJsb2NrPQlTZXQgdGhlIGxhc3QgYmxvY2sgb2YgdGhlIGZpbGVzeXN0ZW0vCisgKgorICoJVGhlIGZvbGxvd2luZyBleHBlY3QgYSBvZmZzZXQgZnJvbSB0aGUgcGFydGl0aW9uIHJvb3QuCisgKgorICoJZmlsZXNldD0JT3ZlcnJpZGUgdGhlIGZpbGVzZXQgYmxvY2sgbG9jYXRpb24uICh1bnVzZWQpCisgKglyb290ZGlyPQlPdmVycmlkZSB0aGUgcm9vdCBkaXJlY3RvcnkgbG9jYXRpb24uICh1bnVzZWQpCisgKgkJV0FSTklORzogb3ZlcnJpZGluZyB0aGUgcm9vdGRpciB0byBhIG5vbi1kaXJlY3RvcnkgbWF5CisgKgkJeWllbGQgaGlnaGx5IHVucHJlZGljdGFibGUgcmVzdWx0cy4KKyAqCisgKiBQUkUtQ09ORElUSU9OUworICoJb3B0aW9ucwkJUG9pbnRlciB0byBtb3VudCBvcHRpb25zIHN0cmluZy4KKyAqCXVvcHRzCQlQb2ludGVyIHRvIG1vdW50IG9wdGlvbnMgdmFyaWFibGUuCisgKgorICogUE9TVC1DT05ESVRJT05TCisgKgk8cmV0dXJuPgkxCU1vdW50IG9wdGlvbnMgcGFyc2VkIG9rYXkuCisgKgk8cmV0dXJuPgkwCUVycm9yIHBhcnNpbmcgbW91bnQgb3B0aW9ucy4KKyAqCisgKiBISVNUT1JZCisgKglKdWx5IDEsIDE5OTcgLSBBbmRyZXcgRS4gTWlsZXNraQorICoJV3JpdHRlbiwgdGVzdGVkLCBhbmQgcmVsZWFzZWQuCisgKi8KKworZW51bSB7CisJT3B0X25vdnJzLCBPcHRfbm9zdHJpY3QsIE9wdF9icywgT3B0X3VuaGlkZSwgT3B0X3VuZGVsZXRlLAorCU9wdF9ub2FkaW5pY2IsIE9wdF9hZGluaWNiLCBPcHRfc2hvcnRhZCwgT3B0X2xvbmdhZCwKKwlPcHRfZ2lkLCBPcHRfdWlkLCBPcHRfdW1hc2ssIE9wdF9zZXNzaW9uLCBPcHRfbGFzdGJsb2NrLAorCU9wdF9hbmNob3IsIE9wdF92b2x1bWUsIE9wdF9wYXJ0aXRpb24sIE9wdF9maWxlc2V0LAorCU9wdF9yb290ZGlyLCBPcHRfdXRmOCwgT3B0X2lvY2hhcnNldCwKKwlPcHRfZXJyCit9OworCitzdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CisJe09wdF9ub3ZycywgIm5vdnJzIn0sCisJe09wdF9ub3N0cmljdCwgIm5vc3RyaWN0In0sCisJe09wdF9icywgImJzPSV1In0sCisJe09wdF91bmhpZGUsICJ1bmhpZGUifSwKKwl7T3B0X3VuZGVsZXRlLCAidW5kZWxldGUifSwKKwl7T3B0X25vYWRpbmljYiwgIm5vYWRpbmljYiJ9LAorCXtPcHRfYWRpbmljYiwgImFkaW5pY2IifSwKKwl7T3B0X3Nob3J0YWQsICJzaG9ydGFkIn0sCisJe09wdF9sb25nYWQsICJsb25nYWQifSwKKwl7T3B0X2dpZCwgImdpZD0ldSJ9LAorCXtPcHRfdWlkLCAidWlkPSV1In0sCisJe09wdF91bWFzaywgInVtYXNrPSVvIn0sCisJe09wdF9zZXNzaW9uLCAic2Vzc2lvbj0ldSJ9LAorCXtPcHRfbGFzdGJsb2NrLCAibGFzdGJsb2NrPSV1In0sCisJe09wdF9hbmNob3IsICJhbmNob3I9JXUifSwKKwl7T3B0X3ZvbHVtZSwgInZvbHVtZT0ldSJ9LAorCXtPcHRfcGFydGl0aW9uLCAicGFydGl0aW9uPSV1In0sCisJe09wdF9maWxlc2V0LCAiZmlsZXNldD0ldSJ9LAorCXtPcHRfcm9vdGRpciwgInJvb3RkaXI9JXUifSwKKwl7T3B0X3V0ZjgsICJ1dGY4In0sCisJe09wdF9pb2NoYXJzZXQsICJpb2NoYXJzZXQ9JXMifSwKKwl7T3B0X2VyciwgTlVMTH0KK307CisKK3N0YXRpYyBpbnQKK3VkZl9wYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIHN0cnVjdCB1ZGZfb3B0aW9ucyAqdW9wdCkKK3sKKwljaGFyICpwOworCWludCBvcHRpb247CisKKwl1b3B0LT5ub3ZycyA9IDA7CisJdW9wdC0+YmxvY2tzaXplID0gMjA0ODsKKwl1b3B0LT5wYXJ0aXRpb24gPSAweEZGRkY7CisJdW9wdC0+c2Vzc2lvbiA9IDB4RkZGRkZGRkY7CisJdW9wdC0+bGFzdGJsb2NrID0gMDsKKwl1b3B0LT5hbmNob3IgPSAwOworCXVvcHQtPnZvbHVtZSA9IDB4RkZGRkZGRkY7CisJdW9wdC0+cm9vdGRpciA9IDB4RkZGRkZGRkY7CisJdW9wdC0+ZmlsZXNldCA9IDB4RkZGRkZGRkY7CisJdW9wdC0+bmxzX21hcCA9IE5VTEw7CisKKwlpZiAoIW9wdGlvbnMpCisJCXJldHVybiAxOworCisJd2hpbGUgKChwID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKQorCXsKKwkJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCQlpbnQgdG9rZW47CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CisJCXN3aXRjaCAodG9rZW4pCisJCXsKKwkJCWNhc2UgT3B0X25vdnJzOgorCQkJCXVvcHQtPm5vdnJzID0gMTsKKwkJCWNhc2UgT3B0X2JzOgorCQkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCQlyZXR1cm4gMDsKKwkJCQl1b3B0LT5ibG9ja3NpemUgPSBvcHRpb247CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF91bmhpZGU6CisJCQkJdW9wdC0+ZmxhZ3MgfD0gKDEgPDwgVURGX0ZMQUdfVU5ISURFKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X3VuZGVsZXRlOgorCQkJCXVvcHQtPmZsYWdzIHw9ICgxIDw8IFVERl9GTEFHX1VOREVMRVRFKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X25vYWRpbmljYjoKKwkJCQl1b3B0LT5mbGFncyAmPSB+KDEgPDwgVURGX0ZMQUdfVVNFX0FEX0lOX0lDQik7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9hZGluaWNiOgorCQkJCXVvcHQtPmZsYWdzIHw9ICgxIDw8IFVERl9GTEFHX1VTRV9BRF9JTl9JQ0IpOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfc2hvcnRhZDoKKwkJCQl1b3B0LT5mbGFncyB8PSAoMSA8PCBVREZfRkxBR19VU0VfU0hPUlRfQUQpOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfbG9uZ2FkOgorCQkJCXVvcHQtPmZsYWdzICY9IH4oMSA8PCBVREZfRkxBR19VU0VfU0hPUlRfQUQpOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfZ2lkOgorCQkJCWlmIChtYXRjaF9pbnQoYXJncywgJm9wdGlvbikpCisJCQkJCXJldHVybiAwOworCQkJCXVvcHQtPmdpZCA9IG9wdGlvbjsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X3VpZDoKKwkJCQlpZiAobWF0Y2hfaW50KGFyZ3MsICZvcHRpb24pKQorCQkJCQlyZXR1cm4gMDsKKwkJCQl1b3B0LT51aWQgPSBvcHRpb247CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF91bWFzazoKKwkJCQlpZiAobWF0Y2hfb2N0YWwoYXJncywgJm9wdGlvbikpCisJCQkJCXJldHVybiAwOworCQkJCXVvcHQtPnVtYXNrID0gb3B0aW9uOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfbm9zdHJpY3Q6CisJCQkJdW9wdC0+ZmxhZ3MgJj0gfigxIDw8IFVERl9GTEFHX1NUUklDVCk7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9zZXNzaW9uOgorCQkJCWlmIChtYXRjaF9pbnQoYXJncywgJm9wdGlvbikpCisJCQkJCXJldHVybiAwOworCQkJCXVvcHQtPnNlc3Npb24gPSBvcHRpb247CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9sYXN0YmxvY2s6CisJCQkJaWYgKG1hdGNoX2ludChhcmdzLCAmb3B0aW9uKSkKKwkJCQkJcmV0dXJuIDA7CisJCQkJdW9wdC0+bGFzdGJsb2NrID0gb3B0aW9uOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfYW5jaG9yOgorCQkJCWlmIChtYXRjaF9pbnQoYXJncywgJm9wdGlvbikpCisJCQkJCXJldHVybiAwOworCQkJCXVvcHQtPmFuY2hvciA9IG9wdGlvbjsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X3ZvbHVtZToKKwkJCQlpZiAobWF0Y2hfaW50KGFyZ3MsICZvcHRpb24pKQorCQkJCQlyZXR1cm4gMDsKKwkJCQl1b3B0LT52b2x1bWUgPSBvcHRpb247CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9wYXJ0aXRpb246CisJCQkJaWYgKG1hdGNoX2ludChhcmdzLCAmb3B0aW9uKSkKKwkJCQkJcmV0dXJuIDA7CisJCQkJdW9wdC0+cGFydGl0aW9uID0gb3B0aW9uOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfZmlsZXNldDoKKwkJCQlpZiAobWF0Y2hfaW50KGFyZ3MsICZvcHRpb24pKQorCQkJCQlyZXR1cm4gMDsKKwkJCQl1b3B0LT5maWxlc2V0ID0gb3B0aW9uOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfcm9vdGRpcjoKKwkJCQlpZiAobWF0Y2hfaW50KGFyZ3MsICZvcHRpb24pKQorCQkJCQlyZXR1cm4gMDsKKwkJCQl1b3B0LT5yb290ZGlyID0gb3B0aW9uOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfdXRmODoKKwkJCQl1b3B0LT5mbGFncyB8PSAoMSA8PCBVREZfRkxBR19VVEY4KTsKKwkJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfVURGX05MUworCQkJY2FzZSBPcHRfaW9jaGFyc2V0OgorCQkJCXVvcHQtPm5sc19tYXAgPSBsb2FkX25scyhhcmdzWzBdLmZyb20pOworCQkJCXVvcHQtPmZsYWdzIHw9ICgxIDw8IFVERl9GTEFHX05MU19NQVApOworCQkJCWJyZWFrOworI2VuZGlmCisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX0VSUiAidWRmOiBiYWQgbW91bnQgb3B0aW9uIFwiJXNcIiAiCisJCQkJCQkib3IgbWlzc2luZyB2YWx1ZVxuIiwgcCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKwordm9pZAordWRmX3dyaXRlX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCisJCXVkZl9vcGVuX2x2aWQoc2IpOworCXNiLT5zX2RpcnQgPSAwOworCXVubG9ja19rZXJuZWwoKTsKK30KKworc3RhdGljIGludAordWRmX3JlbW91bnRfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqb3B0aW9ucykKK3sKKwlzdHJ1Y3QgdWRmX29wdGlvbnMgdW9wdDsKKworCXVvcHQuZmxhZ3MgPSBVREZfU0Ioc2IpLT5zX2ZsYWdzIDsKKwl1b3B0LnVpZCAgID0gVURGX1NCKHNiKS0+c191aWQgOworCXVvcHQuZ2lkICAgPSBVREZfU0Ioc2IpLT5zX2dpZCA7CisJdW9wdC51bWFzayA9IFVERl9TQihzYiktPnNfdW1hc2sgOworCisJaWYgKCAhdWRmX3BhcnNlX29wdGlvbnMob3B0aW9ucywgJnVvcHQpICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlVREZfU0Ioc2IpLT5zX2ZsYWdzID0gdW9wdC5mbGFnczsKKwlVREZfU0Ioc2IpLT5zX3VpZCAgID0gdW9wdC51aWQ7CisJVURGX1NCKHNiKS0+c19naWQgICA9IHVvcHQuZ2lkOworCVVERl9TQihzYiktPnNfdW1hc2sgPSB1b3B0LnVtYXNrOworCisJaWYgKFVERl9TQl9MVklEQkgoc2IpKSB7CisJCWludCB3cml0ZV9yZXYgPSBsZTE2X3RvX2NwdShVREZfU0JfTFZJRElVKHNiKS0+bWluVURGV3JpdGVSZXYpOworCQlpZiAod3JpdGVfcmV2ID4gVURGX01BWF9XUklURV9WRVJTSU9OKQorCQkJKmZsYWdzIHw9IE1TX1JET05MWTsKKwl9CisKKwlpZiAoKCpmbGFncyAmIE1TX1JET05MWSkgPT0gKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKwkJcmV0dXJuIDA7CisJaWYgKCpmbGFncyAmIE1TX1JET05MWSkKKwkJdWRmX2Nsb3NlX2x2aWQoc2IpOworCWVsc2UKKwkJdWRmX29wZW5fbHZpZChzYik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHVkZl9zZXRfYmxvY2tzaXplCisgKgorICogUFVSUE9TRQorICoJU2V0IHRoZSBibG9jayBzaXplIHRvIGJlIHVzZWQgaW4gYWxsIHRyYW5zZmVycy4KKyAqCisgKiBERVNDUklQVElPTgorICoJVG8gYWxsb3cgcm9vbSBmb3IgYSBETUEgdHJhbnNmZXIsIGl0IGlzIGJlc3QgdG8gZ3Vlc3MgYmlnIHdoZW4gdW5zdXJlLgorICoJVGhpcyByb3V0aW5lIHBpY2tzIDIwNDggYnl0ZXMgYXMgdGhlIGJsb2Nrc2l6ZSB3aGVuIGd1ZXNzaW5nLiBUaGlzCisgKglzaG91bGQgYmUgYWRlcXVhdGUgdW50aWwgZGV2aWNlcyB3aXRoIGxhcmdlciBibG9jayBzaXplcyBiZWNvbWUgY29tbW9uLgorICoKKyAqCU5vdGUgdGhhdCB0aGUgTGludXgga2VybmVsIGNhbiBjdXJyZW50bHkgb25seSBkZWFsIHdpdGggYmxvY2tzaXplcyBvZgorICoJNTEyLCAxMDI0LCAyMDQ4LCA0MDk2LCBhbmQgODE5MiBieXRlcy4KKyAqCisgKiBQUkUtQ09ORElUSU9OUworICoJc2IJCQlQb2ludGVyIHRvIF9sb2NrZWRfIHN1cGVyYmxvY2suCisgKgorICogUE9TVC1DT05ESVRJT05TCisgKglzYi0+c19ibG9ja3NpemUJCUJsb2Nrc2l6ZS4KKyAqCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzCWxvZzIgb2YgYmxvY2tzaXplLgorICoJPHJldHVybj4JMAlCbG9ja3NpemUgaXMgdmFsaWQuCisgKgk8cmV0dXJuPgkxCUJsb2Nrc2l6ZSBpcyBpbnZhbGlkLgorICoKKyAqIEhJU1RPUlkKKyAqCUp1bHkgMSwgMTk5NyAtIEFuZHJldyBFLiBNaWxlc2tpCisgKglXcml0dGVuLCB0ZXN0ZWQsIGFuZCByZWxlYXNlZC4KKyAqLworc3RhdGljICBpbnQKK3VkZl9zZXRfYmxvY2tzaXplKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBic2l6ZSkKK3sKKwlpZiAoIXNiX21pbl9ibG9ja3NpemUoc2IsIGJzaXplKSkgeworCQl1ZGZfZGVidWcoIkJhZCBibG9jayBzaXplICglZClcbiIsIGJzaXplKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IGJhZCBibG9jayBzaXplICglZClcbiIsIGJzaXplKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBzYi0+c19ibG9ja3NpemU7Cit9CisKK3N0YXRpYyBpbnQKK3VkZl92cnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3Qgdm9sU3RydWN0RGVzYyAqdnNkID0gTlVMTDsKKwlpbnQgc2VjdG9yID0gMzI3Njg7CisJaW50IHNlY3RvcnNpemU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJaW50IGlzbzk2NjA9MDsKKwlpbnQgbnNyMDI9MDsKKwlpbnQgbnNyMDM9MDsKKworCS8qIEJsb2NrIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDUxMiAqLworCWlmIChzYi0+c19ibG9ja3NpemUgJiA1MTEpCisJCXJldHVybiAwOworCisJaWYgKHNiLT5zX2Jsb2Nrc2l6ZSA8IHNpemVvZihzdHJ1Y3Qgdm9sU3RydWN0RGVzYykpCisJCXNlY3RvcnNpemUgPSBzaXplb2Yoc3RydWN0IHZvbFN0cnVjdERlc2MpOworCWVsc2UKKwkJc2VjdG9yc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKworCXNlY3RvciArPSAoVURGX1NCX1NFU1NJT04oc2IpIDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKworCXVkZl9kZWJ1ZygiU3RhcnRpbmcgYXQgc2VjdG9yICV1ICglbGQgYnl0ZSBzZWN0b3JzKVxuIiwKKwkJKHNlY3RvciA+PiBzYi0+c19ibG9ja3NpemVfYml0cyksIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJLyogUHJvY2VzcyB0aGUgc2VxdWVuY2UgKGlmIGFwcGxpY2FibGUpICovCisJZm9yICg7IW5zcjAyICYmICFuc3IwMzsgc2VjdG9yICs9IHNlY3RvcnNpemUpCisJeworCQkvKiBSZWFkIGEgYmxvY2sgKi8KKwkJYmggPSB1ZGZfdHJlYWQoc2IsIHNlY3RvciA+PiBzYi0+c19ibG9ja3NpemVfYml0cyk7CisJCWlmICghYmgpCisJCQlicmVhazsKKworCQkvKiBMb29rIGZvciBJU08gIGRlc2NyaXB0b3JzICovCisJCXZzZCA9IChzdHJ1Y3Qgdm9sU3RydWN0RGVzYyAqKShiaC0+Yl9kYXRhICsKKwkJCShzZWN0b3IgJiAoc2ItPnNfYmxvY2tzaXplIC0gMSkpKTsKKworCQlpZiAodnNkLT5zdGRJZGVudFswXSA9PSAwKQorCQl7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UgaWYgKCFzdHJuY21wKHZzZC0+c3RkSWRlbnQsIFZTRF9TVERfSURfQ0QwMDEsIFZTRF9TVERfSURfTEVOKSkKKwkJeworCQkJaXNvOTY2MCA9IHNlY3RvcjsKKwkJCXN3aXRjaCAodnNkLT5zdHJ1Y3RUeXBlKQorCQkJeworCQkJCWNhc2UgMDogCisJCQkJCXVkZl9kZWJ1ZygiSVNPOTY2MCBCb290IFJlY29yZCBmb3VuZFxuIik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMTogCisJCQkJCXVkZl9kZWJ1ZygiSVNPOTY2MCBQcmltYXJ5IFZvbHVtZSBEZXNjcmlwdG9yIGZvdW5kXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyOiAKKwkJCQkJdWRmX2RlYnVnKCJJU085NjYwIFN1cHBsZW1lbnRhcnkgVm9sdW1lIERlc2NyaXB0b3IgZm91bmRcbiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDM6IAorCQkJCQl1ZGZfZGVidWcoIklTTzk2NjAgVm9sdW1lIFBhcnRpdGlvbiBEZXNjcmlwdG9yIGZvdW5kXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyNTU6IAorCQkJCQl1ZGZfZGVidWcoIklTTzk2NjAgVm9sdW1lIERlc2NyaXB0b3IgU2V0IFRlcm1pbmF0b3IgZm91bmRcbiIpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OiAKKwkJCQkJdWRmX2RlYnVnKCJJU085NjYwIFZSUyAoJXUpIGZvdW5kXG4iLCB2c2QtPnN0cnVjdFR5cGUpOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQllbHNlIGlmICghc3RybmNtcCh2c2QtPnN0ZElkZW50LCBWU0RfU1REX0lEX0JFQTAxLCBWU0RfU1REX0lEX0xFTikpCisJCXsKKwkJfQorCQllbHNlIGlmICghc3RybmNtcCh2c2QtPnN0ZElkZW50LCBWU0RfU1REX0lEX1RFQTAxLCBWU0RfU1REX0lEX0xFTikpCisJCXsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQkJYnJlYWs7CisJCX0KKwkJZWxzZSBpZiAoIXN0cm5jbXAodnNkLT5zdGRJZGVudCwgVlNEX1NURF9JRF9OU1IwMiwgVlNEX1NURF9JRF9MRU4pKQorCQl7CisJCQluc3IwMiA9IHNlY3RvcjsKKwkJfQorCQllbHNlIGlmICghc3RybmNtcCh2c2QtPnN0ZElkZW50LCBWU0RfU1REX0lEX05TUjAzLCBWU0RfU1REX0lEX0xFTikpCisJCXsKKwkJCW5zcjAzID0gc2VjdG9yOworCQl9CisJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCX0KKworCWlmIChuc3IwMykKKwkJcmV0dXJuIG5zcjAzOworCWVsc2UgaWYgKG5zcjAyKQorCQlyZXR1cm4gbnNyMDI7CisJZWxzZSBpZiAoc2VjdG9yIC0gKFVERl9TQl9TRVNTSU9OKHNiKSA8PCBzYi0+c19ibG9ja3NpemVfYml0cykgPT0gMzI3NjgpCisJCXJldHVybiAtMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKgorICogdWRmX2ZpbmRfYW5jaG9yCisgKgorICogUFVSUE9TRQorICoJRmluZCBhbiBhbmNob3Igdm9sdW1lIGRlc2NyaXB0b3IuCisgKgorICogUFJFLUNPTkRJVElPTlMKKyAqCXNiCQkJUG9pbnRlciB0byBfbG9ja2VkXyBzdXBlcmJsb2NrLgorICoJbGFzdGJsb2NrCQlMYXN0IGJsb2NrIG9uIG1lZGlhLgorICoKKyAqIFBPU1QtQ09ORElUSU9OUworICoJPHJldHVybj4JCTEgaWYgbm90IGZvdW5kLCAwIGlmIG9rCisgKgorICogSElTVE9SWQorICoJSnVseSAxLCAxOTk3IC0gQW5kcmV3IEUuIE1pbGVza2kKKyAqCVdyaXR0ZW4sIHRlc3RlZCwgYW5kIHJlbGVhc2VkLgorICovCitzdGF0aWMgdm9pZAordWRmX2ZpbmRfYW5jaG9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaW50IGxhc3RibG9jayA9IFVERl9TQl9MQVNUQkxPQ0soc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCXVpbnQxNl90IGlkZW50OworCXVpbnQzMl90IGxvY2F0aW9uOworCWludCBpOworCisJaWYgKGxhc3RibG9jaykKKwl7CisJCWludCB2YXJsYXN0YmxvY2sgPSB1ZGZfdmFyaWFibGVfdG9fZml4ZWQobGFzdGJsb2NrKTsKKwkJaW50IGxhc3RbXSA9ICB7IGxhc3RibG9jaywgbGFzdGJsb2NrIC0gMiwKKwkJCQlsYXN0YmxvY2sgLSAxNTAsIGxhc3RibG9jayAtIDE1MiwKKwkJCQl2YXJsYXN0YmxvY2ssIHZhcmxhc3RibG9jayAtIDIsCisJCQkJdmFybGFzdGJsb2NrIC0gMTUwLCB2YXJsYXN0YmxvY2sgLSAxNTIgfTsKKworCQlsYXN0YmxvY2sgPSAwOworCisJCS8qIFNlYXJjaCBmb3IgYW4gYW5jaG9yIHZvbHVtZSBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KKworCQkvKiAgYWNjb3JkaW5nIHRvIHNwZWMsIGFuY2hvciBpcyBpbiBlaXRoZXI6CisJCSAqICAgICBibG9jayAyNTYKKwkJICogICAgIGxhc3RibG9jay0yNTYKKwkJICogICAgIGxhc3RibG9jaworCQkgKiAgaG93ZXZlciwgaWYgdGhlIGRpc2MgaXNuJ3QgY2xvc2VkLCBpdCBjb3VsZCBiZSA1MTIgKi8KKworCQlmb3IgKGk9MDsgKCFsYXN0YmxvY2sgJiYgaTxzaXplb2YobGFzdCkvc2l6ZW9mKGludCkpOyBpKyspCisJCXsKKwkJCWlmIChsYXN0W2ldIDwgMCB8fCAhKGJoID0gc2JfYnJlYWQoc2IsIGxhc3RbaV0pKSkKKwkJCXsKKwkJCQlpZGVudCA9IGxvY2F0aW9uID0gMDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZGVudCA9IGxlMTZfdG9fY3B1KCgodGFnICopYmgtPmJfZGF0YSktPnRhZ0lkZW50KTsKKwkJCQlsb2NhdGlvbiA9IGxlMzJfdG9fY3B1KCgodGFnICopYmgtPmJfZGF0YSktPnRhZ0xvY2F0aW9uKTsKKwkJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJCX0KKwkKKwkJCWlmIChpZGVudCA9PSBUQUdfSURFTlRfQVZEUCkKKwkJCXsKKwkJCQlpZiAobG9jYXRpb24gPT0gbGFzdFtpXSAtIFVERl9TQl9TRVNTSU9OKHNiKSkKKwkJCQl7CisJCQkJCWxhc3RibG9jayA9IFVERl9TQl9BTkNIT1Ioc2IpWzBdID0gbGFzdFtpXSAtIFVERl9TQl9TRVNTSU9OKHNiKTsKKwkJCQkJVURGX1NCX0FOQ0hPUihzYilbMV0gPSBsYXN0W2ldIC0gMjU2IC0gVURGX1NCX1NFU1NJT04oc2IpOworCQkJCX0KKwkJCQllbHNlIGlmIChsb2NhdGlvbiA9PSB1ZGZfdmFyaWFibGVfdG9fZml4ZWQobGFzdFtpXSkgLSBVREZfU0JfU0VTU0lPTihzYikpCisJCQkJeworCQkJCQlVREZfU0VUX0ZMQUcoc2IsIFVERl9GTEFHX1ZBUkNPTlYpOworCQkJCQlsYXN0YmxvY2sgPSBVREZfU0JfQU5DSE9SKHNiKVswXSA9IHVkZl92YXJpYWJsZV90b19maXhlZChsYXN0W2ldKSAtIFVERl9TQl9TRVNTSU9OKHNiKTsKKwkJCQkJVURGX1NCX0FOQ0hPUihzYilbMV0gPSBsYXN0YmxvY2sgLSAyNTYgLSBVREZfU0JfU0VTU0lPTihzYik7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJdWRmX2RlYnVnKCJBbmNob3IgZm91bmQgYXQgYmxvY2sgJWQsIGxvY2F0aW9uIG1pc21hdGNoICVkLlxuIiwKKwkJCQkJCWxhc3RbaV0sIGxvY2F0aW9uKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGlkZW50ID09IFRBR19JREVOVF9GRSB8fCBpZGVudCA9PSBUQUdfSURFTlRfRUZFKQorCQkJeworCQkJCWxhc3RibG9jayA9IGxhc3RbaV07CisJCQkJVURGX1NCX0FOQ0hPUihzYilbM10gPSA1MTI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKGxhc3RbaV0gPCAyNTYgfHwgIShiaCA9IHNiX2JyZWFkKHNiLCBsYXN0W2ldIC0gMjU2KSkpCisJCQkJeworCQkJCQlpZGVudCA9IGxvY2F0aW9uID0gMDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWRlbnQgPSBsZTE2X3RvX2NwdSgoKHRhZyAqKWJoLT5iX2RhdGEpLT50YWdJZGVudCk7CisJCQkJCWxvY2F0aW9uID0gbGUzMl90b19jcHUoKCh0YWcgKiliaC0+Yl9kYXRhKS0+dGFnTG9jYXRpb24pOworCQkJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJCQl9CisJCisJCQkJaWYgKGlkZW50ID09IFRBR19JREVOVF9BVkRQICYmCisJCQkJCWxvY2F0aW9uID09IGxhc3RbaV0gLSAyNTYgLSBVREZfU0JfU0VTU0lPTihzYikpCisJCQkJeworCQkJCQlsYXN0YmxvY2sgPSBsYXN0W2ldOworCQkJCQlVREZfU0JfQU5DSE9SKHNiKVsxXSA9IGxhc3RbaV0gLSAyNTY7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmIChsYXN0W2ldIDwgMzEyICsgVURGX1NCX1NFU1NJT04oc2IpIHx8ICEoYmggPSBzYl9icmVhZChzYiwgbGFzdFtpXSAtIDMxMiAtIFVERl9TQl9TRVNTSU9OKHNiKSkpKQorCQkJCQl7CisJCQkJCQlpZGVudCA9IGxvY2F0aW9uID0gMDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWlkZW50ID0gbGUxNl90b19jcHUoKCh0YWcgKiliaC0+Yl9kYXRhKS0+dGFnSWRlbnQpOworCQkJCQkJbG9jYXRpb24gPSBsZTMyX3RvX2NwdSgoKHRhZyAqKWJoLT5iX2RhdGEpLT50YWdMb2NhdGlvbik7CisJCQkJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJCQkJfQorCQorCQkJCQlpZiAoaWRlbnQgPT0gVEFHX0lERU5UX0FWRFAgJiYKKwkJCQkJCWxvY2F0aW9uID09IHVkZl92YXJpYWJsZV90b19maXhlZChsYXN0W2ldKSAtIDI1NikKKwkJCQkJeworCQkJCQkJVURGX1NFVF9GTEFHKHNiLCBVREZfRkxBR19WQVJDT05WKTsKKwkJCQkJCWxhc3RibG9jayA9IHVkZl92YXJpYWJsZV90b19maXhlZChsYXN0W2ldKTsKKwkJCQkJCVVERl9TQl9BTkNIT1Ioc2IpWzFdID0gbGFzdGJsb2NrIC0gMjU2OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKCFsYXN0YmxvY2spCisJeworCQkvKiBXZSBoYXZuJ3QgZm91bmQgdGhlIGxhc3RibG9jay4gY2hlY2sgMzEyICovCisJCWlmICgoYmggPSBzYl9icmVhZChzYiwgMzEyICsgVURGX1NCX1NFU1NJT04oc2IpKSkpCisJCXsKKwkJCWlkZW50ID0gbGUxNl90b19jcHUoKCh0YWcgKiliaC0+Yl9kYXRhKS0+dGFnSWRlbnQpOworCQkJbG9jYXRpb24gPSBsZTMyX3RvX2NwdSgoKHRhZyAqKWJoLT5iX2RhdGEpLT50YWdMb2NhdGlvbik7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKworCQkJaWYgKGlkZW50ID09IFRBR19JREVOVF9BVkRQICYmIGxvY2F0aW9uID09IDI1NikKKwkJCQlVREZfU0VUX0ZMQUcoc2IsIFVERl9GTEFHX1ZBUkNPTlYpOworCQl9CisJfQorCisJZm9yIChpPTA7IGk8c2l6ZW9mKFVERl9TQl9BTkNIT1Ioc2IpKS9zaXplb2YoaW50KTsgaSsrKQorCXsKKwkJaWYgKFVERl9TQl9BTkNIT1Ioc2IpW2ldKQorCQl7CisJCQlpZiAoIShiaCA9IHVkZl9yZWFkX3RhZ2dlZChzYiwKKwkJCQlVREZfU0JfQU5DSE9SKHNiKVtpXSwgVURGX1NCX0FOQ0hPUihzYilbaV0sICZpZGVudCkpKQorCQkJeworCQkJCVVERl9TQl9BTkNIT1Ioc2IpW2ldID0gMDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJCQlpZiAoKGlkZW50ICE9IFRBR19JREVOVF9BVkRQKSAmJiAoaSB8fAorCQkJCQkoaWRlbnQgIT0gVEFHX0lERU5UX0ZFICYmIGlkZW50ICE9IFRBR19JREVOVF9FRkUpKSkKKwkJCQl7CisJCQkJCVVERl9TQl9BTkNIT1Ioc2IpW2ldID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlVREZfU0JfTEFTVEJMT0NLKHNiKSA9IGxhc3RibG9jazsKK30KKworc3RhdGljIGludCAKK3VkZl9maW5kX2ZpbGVzZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwga2VybmVsX2xiX2FkZHIgKmZpbGVzZXQsIGtlcm5lbF9sYl9hZGRyICpyb290KQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWxvbmcgbGFzdGJsb2NrOworCXVpbnQxNl90IGlkZW50OworCisJaWYgKGZpbGVzZXQtPmxvZ2ljYWxCbG9ja051bSAhPSAweEZGRkZGRkZGIHx8CisJCWZpbGVzZXQtPnBhcnRpdGlvblJlZmVyZW5jZU51bSAhPSAweEZGRkYpCisJeworCQliaCA9IHVkZl9yZWFkX3B0YWdnZWQoc2IsICpmaWxlc2V0LCAwLCAmaWRlbnQpOworCisJCWlmICghYmgpCisJCQlyZXR1cm4gMTsKKwkJZWxzZSBpZiAoaWRlbnQgIT0gVEFHX0lERU5UX0ZTRCkKKwkJeworCQkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQkJCisJfQorCisJaWYgKCFiaCkgLyogU2VhcmNoIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSBwYXJ0aXRpb25zICovCisJeworCQlrZXJuZWxfbGJfYWRkciBuZXdmaWxlc2V0OworCisJCXJldHVybiAxOworCQkKKwkJZm9yIChuZXdmaWxlc2V0LnBhcnRpdGlvblJlZmVyZW5jZU51bT1VREZfU0JfTlVNUEFSVFMoc2IpLTE7CisJCQkobmV3ZmlsZXNldC5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gIT0gMHhGRkZGICYmCisJCQkJZmlsZXNldC0+bG9naWNhbEJsb2NrTnVtID09IDB4RkZGRkZGRkYgJiYKKwkJCQlmaWxlc2V0LT5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPT0gMHhGRkZGKTsKKwkJCW5ld2ZpbGVzZXQucGFydGl0aW9uUmVmZXJlbmNlTnVtLS0pCisJCXsKKwkJCWxhc3RibG9jayA9IFVERl9TQl9QQVJUTEVOKHNiLCBuZXdmaWxlc2V0LnBhcnRpdGlvblJlZmVyZW5jZU51bSk7CisJCQluZXdmaWxlc2V0LmxvZ2ljYWxCbG9ja051bSA9IDA7CisKKwkJCWRvCisJCQl7CisJCQkJYmggPSB1ZGZfcmVhZF9wdGFnZ2VkKHNiLCBuZXdmaWxlc2V0LCAwLCAmaWRlbnQpOworCQkJCWlmICghYmgpCisJCQkJeworCQkJCQluZXdmaWxlc2V0LmxvZ2ljYWxCbG9ja051bSArKzsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJc3dpdGNoIChpZGVudCkKKwkJCQl7CisJCQkJCWNhc2UgVEFHX0lERU5UX1NCRDoKKwkJCQkJeworCQkJCQkJc3RydWN0IHNwYWNlQml0bWFwRGVzYyAqc3A7CisJCQkJCQlzcCA9IChzdHJ1Y3Qgc3BhY2VCaXRtYXBEZXNjICopYmgtPmJfZGF0YTsKKwkJCQkJCW5ld2ZpbGVzZXQubG9naWNhbEJsb2NrTnVtICs9IDEgKworCQkJCQkJCSgobGUzMl90b19jcHUoc3AtPm51bU9mQnl0ZXMpICsgc2l6ZW9mKHN0cnVjdCBzcGFjZUJpdG1hcERlc2MpIC0gMSkKKwkJCQkJCQkJPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQkJCQkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIFRBR19JREVOVF9GU0Q6CisJCQkJCXsKKwkJCQkJCSpmaWxlc2V0ID0gbmV3ZmlsZXNldDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWRlZmF1bHQ6CisJCQkJCXsKKwkJCQkJCW5ld2ZpbGVzZXQubG9naWNhbEJsb2NrTnVtICsrOworCQkJCQkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCQkJCQliaCA9IE5VTEw7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXdoaWxlIChuZXdmaWxlc2V0LmxvZ2ljYWxCbG9ja051bSA8IGxhc3RibG9jayAmJgorCQkJCWZpbGVzZXQtPmxvZ2ljYWxCbG9ja051bSA9PSAweEZGRkZGRkZGICYmCisJCQkJZmlsZXNldC0+cGFydGl0aW9uUmVmZXJlbmNlTnVtID09IDB4RkZGRik7CisJCX0KKwl9CisKKwlpZiAoKGZpbGVzZXQtPmxvZ2ljYWxCbG9ja051bSAhPSAweEZGRkZGRkZGIHx8CisJCWZpbGVzZXQtPnBhcnRpdGlvblJlZmVyZW5jZU51bSAhPSAweEZGRkYpICYmIGJoKQorCXsKKwkJdWRmX2RlYnVnKCJGaWxlc2V0IGF0IGJsb2NrPSVkLCBwYXJ0aXRpb249JWRcbiIsCisJCQlmaWxlc2V0LT5sb2dpY2FsQmxvY2tOdW0sIGZpbGVzZXQtPnBhcnRpdGlvblJlZmVyZW5jZU51bSk7CisKKwkJVURGX1NCX1BBUlRJVElPTihzYikgPSBmaWxlc2V0LT5wYXJ0aXRpb25SZWZlcmVuY2VOdW07CisJCXVkZl9sb2FkX2ZpbGVzZXQoc2IsIGJoLCByb290KTsKKwkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgCit1ZGZfbG9hZF9wdm9sZGVzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBwcmltYXJ5Vm9sRGVzYyAqcHZvbGRlc2M7CisJdGltZV90IHJlY29yZGluZzsKKwlsb25nIHJlY29yZGluZ191c2VjOworCXN0cnVjdCB1c3RyIGluc3RyOworCXN0cnVjdCB1c3RyIG91dHN0cjsKKworCXB2b2xkZXNjID0gKHN0cnVjdCBwcmltYXJ5Vm9sRGVzYyAqKWJoLT5iX2RhdGE7CisKKwlpZiAoIHVkZl9zdGFtcF90b190aW1lKCZyZWNvcmRpbmcsICZyZWNvcmRpbmdfdXNlYywKKwkJbGV0c190b19jcHUocHZvbGRlc2MtPnJlY29yZGluZ0RhdGVBbmRUaW1lKSkgKQorCXsKKwkJa2VybmVsX3RpbWVzdGFtcCB0czsKKwkJdHMgPSBsZXRzX3RvX2NwdShwdm9sZGVzYy0+cmVjb3JkaW5nRGF0ZUFuZFRpbWUpOworCQl1ZGZfZGVidWcoInJlY29yZGluZyB0aW1lICVsZC8lbGQsICUwNHUvJTAydS8lMDJ1ICUwMnU6JTAydSAoJXgpXG4iLAorCQkJcmVjb3JkaW5nLCByZWNvcmRpbmdfdXNlYywKKwkJCXRzLnllYXIsIHRzLm1vbnRoLCB0cy5kYXksIHRzLmhvdXIsIHRzLm1pbnV0ZSwgdHMudHlwZUFuZFRpbWV6b25lKTsKKwkJVURGX1NCX1JFQ09SRFRJTUUoc2IpLnR2X3NlYyA9IHJlY29yZGluZzsKKwkJVURGX1NCX1JFQ09SRFRJTUUoc2IpLnR2X25zZWMgPSByZWNvcmRpbmdfdXNlYyAqIDEwMDA7CisJfQorCisJaWYgKCAhdWRmX2J1aWxkX3VzdHIoJmluc3RyLCBwdm9sZGVzYy0+dm9sSWRlbnQsIDMyKSApCisJeworCQlpZiAodWRmX0NTMHRvVVRGOCgmb3V0c3RyLCAmaW5zdHIpKQorCQl7CisJCQlzdHJuY3B5KCBVREZfU0JfVk9MSURFTlQoc2IpLCBvdXRzdHIudV9uYW1lLAorCQkJCW91dHN0ci51X2xlbiA+IDMxID8gMzEgOiBvdXRzdHIudV9sZW4pOworCQkJdWRmX2RlYnVnKCJ2b2xJZGVudFtdID0gJyVzJ1xuIiwgVURGX1NCX1ZPTElERU5UKHNiKSk7CisJCX0KKwl9CisKKwlpZiAoICF1ZGZfYnVpbGRfdXN0cigmaW5zdHIsIHB2b2xkZXNjLT52b2xTZXRJZGVudCwgMTI4KSApCisJeworCQlpZiAodWRmX0NTMHRvVVRGOCgmb3V0c3RyLCAmaW5zdHIpKQorCQkJdWRmX2RlYnVnKCJ2b2xTZXRJZGVudFtdID0gJyVzJ1xuIiwgb3V0c3RyLnVfbmFtZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCAKK3VkZl9sb2FkX2ZpbGVzZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwga2VybmVsX2xiX2FkZHIgKnJvb3QpCit7CisJc3RydWN0IGZpbGVTZXREZXNjICpmc2V0OworCisJZnNldCA9IChzdHJ1Y3QgZmlsZVNldERlc2MgKiliaC0+Yl9kYXRhOworCisJKnJvb3QgPSBsZWxiX3RvX2NwdShmc2V0LT5yb290RGlyZWN0b3J5SUNCLmV4dExvY2F0aW9uKTsKKworCVVERl9TQl9TRVJJQUxOVU0oc2IpID0gbGUxNl90b19jcHUoZnNldC0+ZGVzY1RhZy50YWdTZXJpYWxOdW0pOworCisJdWRmX2RlYnVnKCJSb290ZGlyIGF0IGJsb2NrPSVkLCBwYXJ0aXRpb249JWRcbiIsIAorCQlyb290LT5sb2dpY2FsQmxvY2tOdW0sIHJvb3QtPnBhcnRpdGlvblJlZmVyZW5jZU51bSk7Cit9CisKK3N0YXRpYyB2b2lkIAordWRmX2xvYWRfcGFydGRlc2Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3QgcGFydGl0aW9uRGVzYyAqcDsKKwlpbnQgaTsKKworCXAgPSAoc3RydWN0IHBhcnRpdGlvbkRlc2MgKiliaC0+Yl9kYXRhOworCisJZm9yIChpPTA7IGk8VURGX1NCX05VTVBBUlRTKHNiKTsgaSsrKQorCXsKKwkJdWRmX2RlYnVnKCJTZWFyY2hpbmcgbWFwOiAoJWQgPT0gJWQpXG4iLCAKKwkJCVVERl9TQl9QQVJUTUFQUyhzYilbaV0uc19wYXJ0aXRpb25fbnVtLCBsZTE2X3RvX2NwdShwLT5wYXJ0aXRpb25OdW1iZXIpKTsKKwkJaWYgKFVERl9TQl9QQVJUTUFQUyhzYilbaV0uc19wYXJ0aXRpb25fbnVtID09IGxlMTZfdG9fY3B1KHAtPnBhcnRpdGlvbk51bWJlcikpCisJCXsKKwkJCVVERl9TQl9QQVJUTEVOKHNiLGkpID0gbGUzMl90b19jcHUocC0+cGFydGl0aW9uTGVuZ3RoKTsgLyogYmxvY2tzICovCisJCQlVREZfU0JfUEFSVFJPT1Qoc2IsaSkgPSBsZTMyX3RvX2NwdShwLT5wYXJ0aXRpb25TdGFydGluZ0xvY2F0aW9uKTsKKwkJCWlmIChsZTMyX3RvX2NwdShwLT5hY2Nlc3NUeXBlKSA9PSBQRF9BQ0NFU1NfVFlQRV9SRUFEX09OTFkpCisJCQkJVURGX1NCX1BBUlRGTEFHUyhzYixpKSB8PSBVREZfUEFSVF9GTEFHX1JFQURfT05MWTsKKwkJCWlmIChsZTMyX3RvX2NwdShwLT5hY2Nlc3NUeXBlKSA9PSBQRF9BQ0NFU1NfVFlQRV9XUklURV9PTkNFKQorCQkJCVVERl9TQl9QQVJURkxBR1Moc2IsaSkgfD0gVURGX1BBUlRfRkxBR19XUklURV9PTkNFOworCQkJaWYgKGxlMzJfdG9fY3B1KHAtPmFjY2Vzc1R5cGUpID09IFBEX0FDQ0VTU19UWVBFX1JFV1JJVEFCTEUpCisJCQkJVURGX1NCX1BBUlRGTEFHUyhzYixpKSB8PSBVREZfUEFSVF9GTEFHX1JFV1JJVEFCTEU7CisJCQlpZiAobGUzMl90b19jcHUocC0+YWNjZXNzVHlwZSkgPT0gUERfQUNDRVNTX1RZUEVfT1ZFUldSSVRBQkxFKQorCQkJCVVERl9TQl9QQVJURkxBR1Moc2IsaSkgfD0gVURGX1BBUlRfRkxBR19PVkVSV1JJVEFCTEU7CisKKwkJCWlmICghc3RyY21wKHAtPnBhcnRpdGlvbkNvbnRlbnRzLmlkZW50LCBQRF9QQVJUSVRJT05fQ09OVEVOVFNfTlNSMDIpIHx8CisJCQkJIXN0cmNtcChwLT5wYXJ0aXRpb25Db250ZW50cy5pZGVudCwgUERfUEFSVElUSU9OX0NPTlRFTlRTX05TUjAzKSkKKwkJCXsKKwkJCQlzdHJ1Y3QgcGFydGl0aW9uSGVhZGVyRGVzYyAqcGhkOworCisJCQkJcGhkID0gKHN0cnVjdCBwYXJ0aXRpb25IZWFkZXJEZXNjICopKHAtPnBhcnRpdGlvbkNvbnRlbnRzVXNlKTsKKwkJCQlpZiAocGhkLT51bmFsbG9jU3BhY2VUYWJsZS5leHRMZW5ndGgpCisJCQkJeworCQkJCQlrZXJuZWxfbGJfYWRkciBsb2MgPSB7IGxlMzJfdG9fY3B1KHBoZC0+dW5hbGxvY1NwYWNlVGFibGUuZXh0UG9zaXRpb24pLCBpIH07CisKKwkJCQkJVURGX1NCX1BBUlRNQVBTKHNiKVtpXS5zX3VzcGFjZS5zX3RhYmxlID0KKwkJCQkJCXVkZl9pZ2V0KHNiLCBsb2MpOworCQkJCQlVREZfU0JfUEFSVEZMQUdTKHNiLGkpIHw9IFVERl9QQVJUX0ZMQUdfVU5BTExPQ19UQUJMRTsKKwkJCQkJdWRmX2RlYnVnKCJ1bmFsbG9jU3BhY2VUYWJsZSAocGFydCAlZCkgQCAlbGRcbiIsCisJCQkJCQlpLCBVREZfU0JfUEFSVE1BUFMoc2IpW2ldLnNfdXNwYWNlLnNfdGFibGUtPmlfaW5vKTsKKwkJCQl9CisJCQkJaWYgKHBoZC0+dW5hbGxvY1NwYWNlQml0bWFwLmV4dExlbmd0aCkKKwkJCQl7CisJCQkJCVVERl9TQl9BTExPQ19CSVRNQVAoc2IsIGksIHNfdXNwYWNlKTsKKwkJCQkJaWYgKFVERl9TQl9QQVJUTUFQUyhzYilbaV0uc191c3BhY2Uuc19iaXRtYXAgIT0gTlVMTCkKKwkJCQkJeworCQkJCQkJVURGX1NCX1BBUlRNQVBTKHNiKVtpXS5zX3VzcGFjZS5zX2JpdG1hcC0+c19leHRMZW5ndGggPQorCQkJCQkJCWxlMzJfdG9fY3B1KHBoZC0+dW5hbGxvY1NwYWNlQml0bWFwLmV4dExlbmd0aCk7CisJCQkJCQlVREZfU0JfUEFSVE1BUFMoc2IpW2ldLnNfdXNwYWNlLnNfYml0bWFwLT5zX2V4dFBvc2l0aW9uID0KKwkJCQkJCQlsZTMyX3RvX2NwdShwaGQtPnVuYWxsb2NTcGFjZUJpdG1hcC5leHRQb3NpdGlvbik7CisJCQkJCQlVREZfU0JfUEFSVEZMQUdTKHNiLGkpIHw9IFVERl9QQVJUX0ZMQUdfVU5BTExPQ19CSVRNQVA7CisJCQkJCQl1ZGZfZGVidWcoInVuYWxsb2NTcGFjZUJpdG1hcCAocGFydCAlZCkgQCAlZFxuIiwKKwkJCQkJCQlpLCBVREZfU0JfUEFSVE1BUFMoc2IpW2ldLnNfdXNwYWNlLnNfYml0bWFwLT5zX2V4dFBvc2l0aW9uKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAocGhkLT5wYXJ0aXRpb25JbnRlZ3JpdHlUYWJsZS5leHRMZW5ndGgpCisJCQkJCXVkZl9kZWJ1ZygicGFydGl0aW9uSW50ZWdyaXR5VGFibGUgKHBhcnQgJWQpXG4iLCBpKTsKKwkJCQlpZiAocGhkLT5mcmVlZFNwYWNlVGFibGUuZXh0TGVuZ3RoKQorCQkJCXsKKwkJCQkJa2VybmVsX2xiX2FkZHIgbG9jID0geyBsZTMyX3RvX2NwdShwaGQtPmZyZWVkU3BhY2VUYWJsZS5leHRQb3NpdGlvbiksIGkgfTsKKworCQkJCQlVREZfU0JfUEFSVE1BUFMoc2IpW2ldLnNfZnNwYWNlLnNfdGFibGUgPQorCQkJCQkJdWRmX2lnZXQoc2IsIGxvYyk7CisJCQkJCVVERl9TQl9QQVJURkxBR1Moc2IsaSkgfD0gVURGX1BBUlRfRkxBR19GUkVFRF9UQUJMRTsKKwkJCQkJdWRmX2RlYnVnKCJmcmVlZFNwYWNlVGFibGUgKHBhcnQgJWQpIEAgJWxkXG4iLAorCQkJCQkJaSwgVURGX1NCX1BBUlRNQVBTKHNiKVtpXS5zX2ZzcGFjZS5zX3RhYmxlLT5pX2lubyk7CisJCQkJfQorCQkJCWlmIChwaGQtPmZyZWVkU3BhY2VCaXRtYXAuZXh0TGVuZ3RoKQorCQkJCXsKKwkJCQkJVURGX1NCX0FMTE9DX0JJVE1BUChzYiwgaSwgc19mc3BhY2UpOworCQkJCQlpZiAoVURGX1NCX1BBUlRNQVBTKHNiKVtpXS5zX2ZzcGFjZS5zX2JpdG1hcCAhPSBOVUxMKQorCQkJCQl7CisJCQkJCQlVREZfU0JfUEFSVE1BUFMoc2IpW2ldLnNfZnNwYWNlLnNfYml0bWFwLT5zX2V4dExlbmd0aCA9CisJCQkJCQkJbGUzMl90b19jcHUocGhkLT5mcmVlZFNwYWNlQml0bWFwLmV4dExlbmd0aCk7CisJCQkJCQlVREZfU0JfUEFSVE1BUFMoc2IpW2ldLnNfZnNwYWNlLnNfYml0bWFwLT5zX2V4dFBvc2l0aW9uID0KKwkJCQkJCQlsZTMyX3RvX2NwdShwaGQtPmZyZWVkU3BhY2VCaXRtYXAuZXh0UG9zaXRpb24pOworCQkJCQkJVURGX1NCX1BBUlRGTEFHUyhzYixpKSB8PSBVREZfUEFSVF9GTEFHX0ZSRUVEX0JJVE1BUDsKKwkJCQkJCXVkZl9kZWJ1ZygiZnJlZWRTcGFjZUJpdG1hcCAocGFydCAlZCkgQCAlZFxuIiwKKwkJCQkJCQlpLCBVREZfU0JfUEFSVE1BUFMoc2IpW2ldLnNfZnNwYWNlLnNfYml0bWFwLT5zX2V4dFBvc2l0aW9uKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChpID09IFVERl9TQl9OVU1QQVJUUyhzYikpCisJeworCQl1ZGZfZGVidWcoIlBhcnRpdGlvbiAoJWQpIG5vdCBmb3VuZCBpbiBwYXJ0aXRpb24gbWFwXG4iLCBsZTE2X3RvX2NwdShwLT5wYXJ0aXRpb25OdW1iZXIpKTsKKwl9CisJZWxzZQorCXsKKwkJdWRmX2RlYnVnKCJQYXJ0aXRpb24gKCVkOiVkIHR5cGUgJXgpIHN0YXJ0cyBhdCBwaHlzaWNhbCAlZCwgYmxvY2sgbGVuZ3RoICVkXG4iLAorCQkJbGUxNl90b19jcHUocC0+cGFydGl0aW9uTnVtYmVyKSwgaSwgVURGX1NCX1BBUlRUWVBFKHNiLGkpLAorCQkJVURGX1NCX1BBUlRST09UKHNiLGkpLCBVREZfU0JfUEFSVExFTihzYixpKSk7CisJfQorfQorCitzdGF0aWMgaW50IAordWRmX2xvYWRfbG9naWNhbHZvbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwga2VybmVsX2xiX2FkZHIgKmZpbGVzZXQpCit7CisJc3RydWN0IGxvZ2ljYWxWb2xEZXNjICpsdmQ7CisJaW50IGksIGosIG9mZnNldDsKKwl1aW50OF90IHR5cGU7CisKKwlsdmQgPSAoc3RydWN0IGxvZ2ljYWxWb2xEZXNjICopYmgtPmJfZGF0YTsKKworCVVERl9TQl9BTExPQ19QQVJUTUFQUyhzYiwgbGUzMl90b19jcHUobHZkLT5udW1QYXJ0aXRpb25NYXBzKSk7CisKKwlmb3IgKGk9MCxvZmZzZXQ9MDsKKwkJIGk8VURGX1NCX05VTVBBUlRTKHNiKSAmJiBvZmZzZXQ8bGUzMl90b19jcHUobHZkLT5tYXBUYWJsZUxlbmd0aCk7CisJCSBpKyssb2Zmc2V0Kz0oKHN0cnVjdCBnZW5lcmljUGFydGl0aW9uTWFwICopJihsdmQtPnBhcnRpdGlvbk1hcHNbb2Zmc2V0XSkpLT5wYXJ0aXRpb25NYXBMZW5ndGgpCisJeworCQl0eXBlID0gKChzdHJ1Y3QgZ2VuZXJpY1BhcnRpdGlvbk1hcCAqKSYobHZkLT5wYXJ0aXRpb25NYXBzW29mZnNldF0pKS0+cGFydGl0aW9uTWFwVHlwZTsKKwkJaWYgKHR5cGUgPT0gMSkKKwkJeworCQkJc3RydWN0IGdlbmVyaWNQYXJ0aXRpb25NYXAxICpncG0xID0gKHN0cnVjdCBnZW5lcmljUGFydGl0aW9uTWFwMSAqKSYobHZkLT5wYXJ0aXRpb25NYXBzW29mZnNldF0pOworCQkJVURGX1NCX1BBUlRUWVBFKHNiLGkpID0gVURGX1RZUEUxX01BUDE1OworCQkJVURGX1NCX1BBUlRWU04oc2IsaSkgPSBsZTE2X3RvX2NwdShncG0xLT52b2xTZXFOdW0pOworCQkJVURGX1NCX1BBUlROVU0oc2IsaSkgPSBsZTE2X3RvX2NwdShncG0xLT5wYXJ0aXRpb25OdW0pOworCQkJVURGX1NCX1BBUlRGVU5DKHNiLGkpID0gTlVMTDsKKwkJfQorCQllbHNlIGlmICh0eXBlID09IDIpCisJCXsKKwkJCXN0cnVjdCB1ZGZQYXJ0aXRpb25NYXAyICp1cG0yID0gKHN0cnVjdCB1ZGZQYXJ0aXRpb25NYXAyICopJihsdmQtPnBhcnRpdGlvbk1hcHNbb2Zmc2V0XSk7CisJCQlpZiAoIXN0cm5jbXAodXBtMi0+cGFydElkZW50LmlkZW50LCBVREZfSURfVklSVFVBTCwgc3RybGVuKFVERl9JRF9WSVJUVUFMKSkpCisJCQl7CisJCQkJaWYgKGxlMTZfdG9fY3B1KCgoX19sZTE2ICopdXBtMi0+cGFydElkZW50LmlkZW50U3VmZml4KVswXSkgPT0gMHgwMTUwKQorCQkJCXsKKwkJCQkJVURGX1NCX1BBUlRUWVBFKHNiLGkpID0gVURGX1ZJUlRVQUxfTUFQMTU7CisJCQkJCVVERl9TQl9QQVJURlVOQyhzYixpKSA9IHVkZl9nZXRfcGJsb2NrX3ZpcnQxNTsKKwkJCQl9CisJCQkJZWxzZSBpZiAobGUxNl90b19jcHUoKChfX2xlMTYgKil1cG0yLT5wYXJ0SWRlbnQuaWRlbnRTdWZmaXgpWzBdKSA9PSAweDAyMDApCisJCQkJeworCQkJCQlVREZfU0JfUEFSVFRZUEUoc2IsaSkgPSBVREZfVklSVFVBTF9NQVAyMDsKKwkJCQkJVURGX1NCX1BBUlRGVU5DKHNiLGkpID0gdWRmX2dldF9wYmxvY2tfdmlydDIwOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKCFzdHJuY21wKHVwbTItPnBhcnRJZGVudC5pZGVudCwgVURGX0lEX1NQQVJBQkxFLCBzdHJsZW4oVURGX0lEX1NQQVJBQkxFKSkpCisJCQl7CisJCQkJdWludDMyX3QgbG9jOworCQkJCXVpbnQxNl90IGlkZW50OworCQkJCXN0cnVjdCBzcGFyaW5nVGFibGUgKnN0OworCQkJCXN0cnVjdCBzcGFyYWJsZVBhcnRpdGlvbk1hcCAqc3BtID0gKHN0cnVjdCBzcGFyYWJsZVBhcnRpdGlvbk1hcCAqKSYobHZkLT5wYXJ0aXRpb25NYXBzW29mZnNldF0pOworCisJCQkJVURGX1NCX1BBUlRUWVBFKHNiLGkpID0gVURGX1NQQVJBQkxFX01BUDE1OworCQkJCVVERl9TQl9UWVBFU1BBUihzYixpKS5zX3BhY2tldF9sZW4gPSBsZTE2X3RvX2NwdShzcG0tPnBhY2tldExlbmd0aCk7CisJCQkJZm9yIChqPTA7IGo8c3BtLT5udW1TcGFyaW5nVGFibGVzOyBqKyspCisJCQkJeworCQkJCQlsb2MgPSBsZTMyX3RvX2NwdShzcG0tPmxvY1NwYXJpbmdUYWJsZVtqXSk7CisJCQkJCVVERl9TQl9UWVBFU1BBUihzYixpKS5zX3NwYXJfbWFwW2pdID0KKwkJCQkJCXVkZl9yZWFkX3RhZ2dlZChzYiwgbG9jLCBsb2MsICZpZGVudCk7CisJCQkJCWlmIChVREZfU0JfVFlQRVNQQVIoc2IsaSkuc19zcGFyX21hcFtqXSAhPSBOVUxMKQorCQkJCQl7CisJCQkJCQlzdCA9IChzdHJ1Y3Qgc3BhcmluZ1RhYmxlICopVURGX1NCX1RZUEVTUEFSKHNiLGkpLnNfc3Bhcl9tYXBbal0tPmJfZGF0YTsKKwkJCQkJCWlmIChpZGVudCAhPSAwIHx8CisJCQkJCQkJc3RybmNtcChzdC0+c3BhcmluZ0lkZW50LmlkZW50LCBVREZfSURfU1BBUklORywgc3RybGVuKFVERl9JRF9TUEFSSU5HKSkpCisJCQkJCQl7CisJCQkJCQkJdWRmX3JlbGVhc2VfZGF0YShVREZfU0JfVFlQRVNQQVIoc2IsaSkuc19zcGFyX21hcFtqXSk7CisJCQkJCQkJVURGX1NCX1RZUEVTUEFSKHNiLGkpLnNfc3Bhcl9tYXBbal0gPSBOVUxMOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCVVERl9TQl9QQVJURlVOQyhzYixpKSA9IHVkZl9nZXRfcGJsb2NrX3NwYXIxNTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl1ZGZfZGVidWcoIlVua25vd24gaWRlbnQ6ICVzXG4iLCB1cG0yLT5wYXJ0SWRlbnQuaWRlbnQpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJVURGX1NCX1BBUlRWU04oc2IsaSkgPSBsZTE2X3RvX2NwdSh1cG0yLT52b2xTZXFOdW0pOworCQkJVURGX1NCX1BBUlROVU0oc2IsaSkgPSBsZTE2X3RvX2NwdSh1cG0yLT5wYXJ0aXRpb25OdW0pOworCQl9CisJCXVkZl9kZWJ1ZygiUGFydGl0aW9uICglZDolZCkgdHlwZSAlZCBvbiB2b2x1bWUgJWRcbiIsCisJCQlpLCBVREZfU0JfUEFSVE5VTShzYixpKSwgdHlwZSwgVURGX1NCX1BBUlRWU04oc2IsaSkpOworCX0KKworCWlmIChmaWxlc2V0KQorCXsKKwkJbG9uZ19hZCAqbGEgPSAobG9uZ19hZCAqKSYobHZkLT5sb2dpY2FsVm9sQ29udGVudHNVc2VbMF0pOworCisJCSpmaWxlc2V0ID0gbGVsYl90b19jcHUobGEtPmV4dExvY2F0aW9uKTsKKwkJdWRmX2RlYnVnKCJGaWxlU2V0IGZvdW5kIGluIExvZ2ljYWxWb2xEZXNjIGF0IGJsb2NrPSVkLCBwYXJ0aXRpb249JWRcbiIsCisJCQlmaWxlc2V0LT5sb2dpY2FsQmxvY2tOdW0sCisJCQlmaWxlc2V0LT5wYXJ0aXRpb25SZWZlcmVuY2VOdW0pOworCX0KKwlpZiAobHZkLT5pbnRlZ3JpdHlTZXFFeHQuZXh0TGVuZ3RoKQorCQl1ZGZfbG9hZF9sb2dpY2Fsdm9saW50KHNiLCBsZWVhX3RvX2NwdShsdmQtPmludGVncml0eVNlcUV4dCkpOworCXJldHVybiAwOworfQorCisvKgorICogdWRmX2xvYWRfbG9naWNhbHZvbGludAorICoKKyAqLworc3RhdGljIHZvaWQKK3VkZl9sb2FkX2xvZ2ljYWx2b2xpbnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwga2VybmVsX2V4dGVudF9hZCBsb2MpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJdWludDE2X3QgaWRlbnQ7CisKKwl3aGlsZSAobG9jLmV4dExlbmd0aCA+IDAgJiYKKwkJKGJoID0gdWRmX3JlYWRfdGFnZ2VkKHNiLCBsb2MuZXh0TG9jYXRpb24sCisJCQlsb2MuZXh0TG9jYXRpb24sICZpZGVudCkpICYmCisJCWlkZW50ID09IFRBR19JREVOVF9MVklEKQorCXsKKwkJVURGX1NCX0xWSURCSChzYikgPSBiaDsKKwkJCisJCWlmIChVREZfU0JfTFZJRChzYiktPm5leHRJbnRlZ3JpdHlFeHQuZXh0TGVuZ3RoKQorCQkJdWRmX2xvYWRfbG9naWNhbHZvbGludChzYiwgbGVlYV90b19jcHUoVURGX1NCX0xWSUQoc2IpLT5uZXh0SW50ZWdyaXR5RXh0KSk7CisJCQorCQlpZiAoVURGX1NCX0xWSURCSChzYikgIT0gYmgpCisJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJbG9jLmV4dExlbmd0aCAtPSBzYi0+c19ibG9ja3NpemU7CisJCWxvYy5leHRMb2NhdGlvbiArKzsKKwl9CisJaWYgKFVERl9TQl9MVklEQkgoc2IpICE9IGJoKQorCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKK30KKworLyoKKyAqIHVkZl9wcm9jZXNzX3NlcXVlbmNlCisgKgorICogUFVSUE9TRQorICoJUHJvY2VzcyBhIG1haW4vcmVzZXJ2ZSB2b2x1bWUgZGVzY3JpcHRvciBzZXF1ZW5jZS4KKyAqCisgKiBQUkUtQ09ORElUSU9OUworICoJc2IJCQlQb2ludGVyIHRvIF9sb2NrZWRfIHN1cGVyYmxvY2suCisgKglibG9jawkJCUZpcnN0IGJsb2NrIG9mIGZpcnN0IGV4dGVudCBvZiB0aGUgc2VxdWVuY2UuCisgKglsYXN0YmxvY2sJCUxhc3RibG9jayBvZiBmaXJzdCBleHRlbnQgb2YgdGhlIHNlcXVlbmNlLgorICoKKyAqIEhJU1RPUlkKKyAqCUp1bHkgMSwgMTk5NyAtIEFuZHJldyBFLiBNaWxlc2tpCisgKglXcml0dGVuLCB0ZXN0ZWQsIGFuZCByZWxlYXNlZC4KKyAqLworc3RhdGljICBpbnQKK3VkZl9wcm9jZXNzX3NlcXVlbmNlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGxvbmcgYmxvY2ssIGxvbmcgbGFzdGJsb2NrLCBrZXJuZWxfbGJfYWRkciAqZmlsZXNldCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlzdHJ1Y3QgdWRmX3Zkc19yZWNvcmQgdmRzW1ZEU19QT1NfTEVOR1RIXTsKKwlzdHJ1Y3QgZ2VuZXJpY19kZXNjICpnZDsKKwlzdHJ1Y3Qgdm9sRGVzY1B0ciAqdmRwOworCWludCBkb25lPTA7CisJaW50IGksajsKKwl1aW50MzJfdCB2ZHNuOworCXVpbnQxNl90IGlkZW50OworCWxvbmcgbmV4dF9zID0gMCwgbmV4dF9lID0gMDsKKworCW1lbXNldCh2ZHMsIDAsIHNpemVvZihzdHJ1Y3QgdWRmX3Zkc19yZWNvcmQpICogVkRTX1BPU19MRU5HVEgpOworCisJLyogUmVhZCB0aGUgbWFpbiBkZXNjcmlwdG9yIHNlcXVlbmNlICovCisJZm9yICg7KCFkb25lICYmIGJsb2NrIDw9IGxhc3RibG9jayk7IGJsb2NrKyspCisJeworCisJCWJoID0gdWRmX3JlYWRfdGFnZ2VkKHNiLCBibG9jaywgYmxvY2ssICZpZGVudCk7CisJCWlmICghYmgpIAorCQkJYnJlYWs7CisKKwkJLyogUHJvY2VzcyBlYWNoIGRlc2NyaXB0b3IgKElTTyAxMzM0NiAzLzguMy04LjQpICovCisJCWdkID0gKHN0cnVjdCBnZW5lcmljX2Rlc2MgKiliaC0+Yl9kYXRhOworCQl2ZHNuID0gbGUzMl90b19jcHUoZ2QtPnZvbERlc2NTZXFOdW0pOworCQlzd2l0Y2ggKGlkZW50KQorCQl7CisJCQljYXNlIFRBR19JREVOVF9QVkQ6IC8qIElTTyAxMzM0NiAzLzEwLjEgKi8KKwkJCQlpZiAodmRzbiA+PSB2ZHNbVkRTX1BPU19QUklNQVJZX1ZPTF9ERVNDXS52b2xEZXNjU2VxTnVtKQorCQkJCXsKKwkJCQkJdmRzW1ZEU19QT1NfUFJJTUFSWV9WT0xfREVTQ10udm9sRGVzY1NlcU51bSA9IHZkc247CisJCQkJCXZkc1tWRFNfUE9TX1BSSU1BUllfVk9MX0RFU0NdLmJsb2NrID0gYmxvY2s7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUQUdfSURFTlRfVkRQOiAvKiBJU08gMTMzNDYgMy8xMC4zICovCisJCQkJaWYgKHZkc24gPj0gdmRzW1ZEU19QT1NfVk9MX0RFU0NfUFRSXS52b2xEZXNjU2VxTnVtKQorCQkJCXsKKwkJCQkJdmRzW1ZEU19QT1NfVk9MX0RFU0NfUFRSXS52b2xEZXNjU2VxTnVtID0gdmRzbjsKKwkJCQkJdmRzW1ZEU19QT1NfVk9MX0RFU0NfUFRSXS5ibG9jayA9IGJsb2NrOworCisJCQkJCXZkcCA9IChzdHJ1Y3Qgdm9sRGVzY1B0ciAqKWJoLT5iX2RhdGE7CisJCQkJCW5leHRfcyA9IGxlMzJfdG9fY3B1KHZkcC0+bmV4dFZvbERlc2NTZXFFeHQuZXh0TG9jYXRpb24pOworCQkJCQluZXh0X2UgPSBsZTMyX3RvX2NwdSh2ZHAtPm5leHRWb2xEZXNjU2VxRXh0LmV4dExlbmd0aCk7CisJCQkJCW5leHRfZSA9IG5leHRfZSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwkJCQkJbmV4dF9lICs9IG5leHRfczsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRBR19JREVOVF9JVVZEOiAvKiBJU08gMTMzNDYgMy8xMC40ICovCisJCQkJaWYgKHZkc24gPj0gdmRzW1ZEU19QT1NfSU1QX1VTRV9WT0xfREVTQ10udm9sRGVzY1NlcU51bSkKKwkJCQl7CisJCQkJCXZkc1tWRFNfUE9TX0lNUF9VU0VfVk9MX0RFU0NdLnZvbERlc2NTZXFOdW0gPSB2ZHNuOworCQkJCQl2ZHNbVkRTX1BPU19JTVBfVVNFX1ZPTF9ERVNDXS5ibG9jayA9IGJsb2NrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVEFHX0lERU5UX1BEOiAvKiBJU08gMTMzNDYgMy8xMC41ICovCisJCQkJaWYgKCF2ZHNbVkRTX1BPU19QQVJUSVRJT05fREVTQ10uYmxvY2spCisJCQkJCXZkc1tWRFNfUE9TX1BBUlRJVElPTl9ERVNDXS5ibG9jayA9IGJsb2NrOworCQkJCWJyZWFrOworCQkJY2FzZSBUQUdfSURFTlRfTFZEOiAvKiBJU08gMTMzNDYgMy8xMC42ICovCisJCQkJaWYgKHZkc24gPj0gdmRzW1ZEU19QT1NfTE9HSUNBTF9WT0xfREVTQ10udm9sRGVzY1NlcU51bSkKKwkJCQl7CisJCQkJCXZkc1tWRFNfUE9TX0xPR0lDQUxfVk9MX0RFU0NdLnZvbERlc2NTZXFOdW0gPSB2ZHNuOworCQkJCQl2ZHNbVkRTX1BPU19MT0dJQ0FMX1ZPTF9ERVNDXS5ibG9jayA9IGJsb2NrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVEFHX0lERU5UX1VTRDogLyogSVNPIDEzMzQ2IDMvMTAuOCAqLworCQkJCWlmICh2ZHNuID49IHZkc1tWRFNfUE9TX1VOQUxMT0NfU1BBQ0VfREVTQ10udm9sRGVzY1NlcU51bSkKKwkJCQl7CisJCQkJCXZkc1tWRFNfUE9TX1VOQUxMT0NfU1BBQ0VfREVTQ10udm9sRGVzY1NlcU51bSA9IHZkc247CisJCQkJCXZkc1tWRFNfUE9TX1VOQUxMT0NfU1BBQ0VfREVTQ10uYmxvY2sgPSBibG9jazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRBR19JREVOVF9URDogLyogSVNPIDEzMzQ2IDMvMTAuOSAqLworCQkJCXZkc1tWRFNfUE9TX1RFUk1JTkFUSU5HX0RFU0NdLmJsb2NrID0gYmxvY2s7CisJCQkJaWYgKG5leHRfZSkKKwkJCQl7CisJCQkJCWJsb2NrID0gbmV4dF9zOworCQkJCQlsYXN0YmxvY2sgPSBuZXh0X2U7CisJCQkJCW5leHRfcyA9IG5leHRfZSA9IDA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJZG9uZSA9IDE7CisJCQkJYnJlYWs7CisJCX0KKwkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJfQorCWZvciAoaT0wOyBpPFZEU19QT1NfTEVOR1RIOyBpKyspCisJeworCQlpZiAodmRzW2ldLmJsb2NrKQorCQl7CisJCQliaCA9IHVkZl9yZWFkX3RhZ2dlZChzYiwgdmRzW2ldLmJsb2NrLCB2ZHNbaV0uYmxvY2ssICZpZGVudCk7CisKKwkJCWlmIChpID09IFZEU19QT1NfUFJJTUFSWV9WT0xfREVTQykKKwkJCQl1ZGZfbG9hZF9wdm9sZGVzYyhzYiwgYmgpOworCQkJZWxzZSBpZiAoaSA9PSBWRFNfUE9TX0xPR0lDQUxfVk9MX0RFU0MpCisJCQkJdWRmX2xvYWRfbG9naWNhbHZvbChzYiwgYmgsIGZpbGVzZXQpOworCQkJZWxzZSBpZiAoaSA9PSBWRFNfUE9TX1BBUlRJVElPTl9ERVNDKQorCQkJeworCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgyID0gTlVMTDsKKwkJCQl1ZGZfbG9hZF9wYXJ0ZGVzYyhzYiwgYmgpOworCQkJCWZvciAoaj12ZHNbaV0uYmxvY2srMTsgajx2ZHNbVkRTX1BPU19URVJNSU5BVElOR19ERVNDXS5ibG9jazsgaisrKQorCQkJCXsKKwkJCQkJYmgyID0gdWRmX3JlYWRfdGFnZ2VkKHNiLCBqLCBqLCAmaWRlbnQpOworCQkJCQlnZCA9IChzdHJ1Y3QgZ2VuZXJpY19kZXNjICopYmgyLT5iX2RhdGE7CisJCQkJCWlmIChpZGVudCA9PSBUQUdfSURFTlRfUEQpCisJCQkJCQl1ZGZfbG9hZF9wYXJ0ZGVzYyhzYiwgYmgyKTsKKwkJCQkJdWRmX3JlbGVhc2VfZGF0YShiaDIpOworCQkJCX0KKwkJCX0KKwkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB1ZGZfY2hlY2tfdmFsaWQoKQorICovCitzdGF0aWMgaW50Cit1ZGZfY2hlY2tfdmFsaWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG5vdnJzLCBpbnQgc2lsZW50KQoreworCWxvbmcgYmxvY2s7CisKKwlpZiAobm92cnMpCisJeworCQl1ZGZfZGVidWcoIlZhbGlkaXR5IGNoZWNrIHNraXBwZWQgYmVjYXVzZSBvZiBub3ZycyBvcHRpb25cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJLyogQ2hlY2sgdGhhdCBpdCBpcyBOU1IwMiBjb21wbGlhbnQgKi8KKwkvKiBQcm9jZXNzIGFueSAiQ0QtUk9NIFZvbHVtZSBEZXNjcmlwdG9yIFNldCIgKEVDTUEgMTY3IDIvOC4zLjEpICovCisJZWxzZSBpZiAoKGJsb2NrID0gdWRmX3ZycyhzYiwgc2lsZW50KSkgPT0gLTEpCisJeworCQl1ZGZfZGVidWcoIkZhaWxlZCB0byByZWFkIGJ5dGUgMzI3NjguIEFzc3VtaW5nIG9wZW4gZGlzYy4gU2tpcHBpbmcgdmFsaWRpdHkgY2hlY2tcbiIpOworCQlpZiAoIVVERl9TQl9MQVNUQkxPQ0soc2IpKQorCQkJVURGX1NCX0xBU1RCTE9DSyhzYikgPSB1ZGZfZ2V0X2xhc3RfYmxvY2soc2IpOworCQlyZXR1cm4gMDsKKwl9CisJZWxzZSAKKwkJcmV0dXJuICFibG9jazsKK30KKworc3RhdGljIGludAordWRmX2xvYWRfcGFydGl0aW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGtlcm5lbF9sYl9hZGRyICpmaWxlc2V0KQoreworCXN0cnVjdCBhbmNob3JWb2xEZXNjUHRyICphbmNob3I7CisJdWludDE2X3QgaWRlbnQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlsb25nIG1haW5fcywgbWFpbl9lLCByZXNlcnZlX3MsIHJlc2VydmVfZTsKKwlpbnQgaSwgajsKKworCWlmICghc2IpCisJCXJldHVybiAxOworCisJZm9yIChpPTA7IGk8c2l6ZW9mKFVERl9TQl9BTkNIT1Ioc2IpKS9zaXplb2YoaW50KTsgaSsrKQorCXsKKwkJaWYgKFVERl9TQl9BTkNIT1Ioc2IpW2ldICYmIChiaCA9IHVkZl9yZWFkX3RhZ2dlZChzYiwKKwkJCVVERl9TQl9BTkNIT1Ioc2IpW2ldLCBVREZfU0JfQU5DSE9SKHNiKVtpXSwgJmlkZW50KSkpCisJCXsKKwkJCWFuY2hvciA9IChzdHJ1Y3QgYW5jaG9yVm9sRGVzY1B0ciAqKWJoLT5iX2RhdGE7CisKKwkJCS8qIExvY2F0ZSB0aGUgbWFpbiBzZXF1ZW5jZSAqLworCQkJbWFpbl9zID0gbGUzMl90b19jcHUoIGFuY2hvci0+bWFpblZvbERlc2NTZXFFeHQuZXh0TG9jYXRpb24gKTsKKwkJCW1haW5fZSA9IGxlMzJfdG9fY3B1KCBhbmNob3ItPm1haW5Wb2xEZXNjU2VxRXh0LmV4dExlbmd0aCApOworCQkJbWFpbl9lID0gbWFpbl9lID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCQkJbWFpbl9lICs9IG1haW5fczsKKwkKKwkJCS8qIExvY2F0ZSB0aGUgcmVzZXJ2ZSBzZXF1ZW5jZSAqLworCQkJcmVzZXJ2ZV9zID0gbGUzMl90b19jcHUoYW5jaG9yLT5yZXNlcnZlVm9sRGVzY1NlcUV4dC5leHRMb2NhdGlvbik7CisJCQlyZXNlcnZlX2UgPSBsZTMyX3RvX2NwdShhbmNob3ItPnJlc2VydmVWb2xEZXNjU2VxRXh0LmV4dExlbmd0aCk7CisJCQlyZXNlcnZlX2UgPSByZXNlcnZlX2UgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCQlyZXNlcnZlX2UgKz0gcmVzZXJ2ZV9zOworCisJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKworCQkJLyogUHJvY2VzcyB0aGUgbWFpbiAmIHJlc2VydmUgc2VxdWVuY2VzICovCisJCQkvKiByZXNwb25zaWJsZSBmb3IgZmluZGluZyB0aGUgUGFydGl0aW9uRGVzYyhzKSAqLworCQkJaWYgKCEodWRmX3Byb2Nlc3Nfc2VxdWVuY2Uoc2IsIG1haW5fcywgbWFpbl9lLCBmaWxlc2V0KSAmJgorCQkJCXVkZl9wcm9jZXNzX3NlcXVlbmNlKHNiLCByZXNlcnZlX3MsIHJlc2VydmVfZSwgZmlsZXNldCkpKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGkgPT0gc2l6ZW9mKFVERl9TQl9BTkNIT1Ioc2IpKS9zaXplb2YoaW50KSkKKwl7CisJCXVkZl9kZWJ1ZygiTm8gQW5jaG9yIGJsb2NrIGZvdW5kXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWVsc2UKKwkJdWRmX2RlYnVnKCJVc2luZyBhbmNob3IgaW4gYmxvY2sgJWRcbiIsIFVERl9TQl9BTkNIT1Ioc2IpW2ldKTsKKworCWZvciAoaT0wOyBpPFVERl9TQl9OVU1QQVJUUyhzYik7IGkrKykKKwl7CisJCXN3aXRjaCBVREZfU0JfUEFSVFRZUEUoc2IsIGkpCisJCXsKKwkJCWNhc2UgVURGX1ZJUlRVQUxfTUFQMTU6CisJCQljYXNlIFVERl9WSVJUVUFMX01BUDIwOgorCQkJeworCQkJCWtlcm5lbF9sYl9hZGRyIGlubzsKKworCQkJCWlmICghVURGX1NCX0xBU1RCTE9DSyhzYikpCisJCQkJeworCQkJCQlVREZfU0JfTEFTVEJMT0NLKHNiKSA9IHVkZl9nZXRfbGFzdF9ibG9jayhzYik7CisJCQkJCXVkZl9maW5kX2FuY2hvcihzYik7CisJCQkJfQorCisJCQkJaWYgKCFVREZfU0JfTEFTVEJMT0NLKHNiKSkKKwkJCQl7CisJCQkJCXVkZl9kZWJ1ZygiVW5hYmxlIHRvIGRldGVybWluZSBMYXN0YmxvY2sgKEZvciBWaXJ0dWFsIFBhcnRpdGlvbilcbiIpOworCQkJCQlyZXR1cm4gMTsKKwkJCQl9CisKKwkJCQlmb3IgKGo9MDsgajxVREZfU0JfTlVNUEFSVFMoc2IpOyBqKyspCisJCQkJeworCQkJCQlpZiAoaiAhPSBpICYmCisJCQkJCQlVREZfU0JfUEFSVFZTTihzYixpKSA9PSBVREZfU0JfUEFSVFZTTihzYixqKSAmJgorCQkJCQkJVURGX1NCX1BBUlROVU0oc2IsaSkgPT0gVURGX1NCX1BBUlROVU0oc2IsaikpCisJCQkJCXsKKwkJCQkJCWluby5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSBqOworCQkJCQkJaW5vLmxvZ2ljYWxCbG9ja051bSA9IFVERl9TQl9MQVNUQkxPQ0soc2IpIC0KKwkJCQkJCQlVREZfU0JfUEFSVFJPT1Qoc2Isaik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChqID09IFVERl9TQl9OVU1QQVJUUyhzYikpCisJCQkJCXJldHVybiAxOworCisJCQkJaWYgKCEoVURGX1NCX1ZBVChzYikgPSB1ZGZfaWdldChzYiwgaW5vKSkpCisJCQkJCXJldHVybiAxOworCisJCQkJaWYgKFVERl9TQl9QQVJUVFlQRShzYixpKSA9PSBVREZfVklSVFVBTF9NQVAxNSkKKwkJCQl7CisJCQkJCVVERl9TQl9UWVBFVklSVChzYixpKS5zX3N0YXJ0X29mZnNldCA9IHVkZl9leHQwX29mZnNldChVREZfU0JfVkFUKHNiKSk7CisJCQkJCVVERl9TQl9UWVBFVklSVChzYixpKS5zX251bV9lbnRyaWVzID0gKFVERl9TQl9WQVQoc2IpLT5pX3NpemUgLSAzNikgPj4gMjsKKwkJCQl9CisJCQkJZWxzZSBpZiAoVURGX1NCX1BBUlRUWVBFKHNiLGkpID09IFVERl9WSVJUVUFMX01BUDIwKQorCQkJCXsKKwkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJCQkJCXVpbnQzMl90IHBvczsKKworCQkJCQlwb3MgPSB1ZGZfYmxvY2tfbWFwKFVERl9TQl9WQVQoc2IpLCAwKTsKKwkJCQkJYmggPSBzYl9icmVhZChzYiwgcG9zKTsKKwkJCQkJVURGX1NCX1RZUEVWSVJUKHNiLGkpLnNfc3RhcnRfb2Zmc2V0ID0KKwkJCQkJCWxlMTZfdG9fY3B1KCgoc3RydWN0IHZpcnR1YWxBbGxvY2F0aW9uVGFibGUyMCAqKWJoLT5iX2RhdGEgKyB1ZGZfZXh0MF9vZmZzZXQoVURGX1NCX1ZBVChzYikpKS0+bGVuZ3RoSGVhZGVyKSArCisJCQkJCQkJdWRmX2V4dDBfb2Zmc2V0KFVERl9TQl9WQVQoc2IpKTsKKwkJCQkJVURGX1NCX1RZUEVWSVJUKHNiLGkpLnNfbnVtX2VudHJpZXMgPSAoVURGX1NCX1ZBVChzYiktPmlfc2l6ZSAtCisJCQkJCQlVREZfU0JfVFlQRVZJUlQoc2IsaSkuc19zdGFydF9vZmZzZXQpID4+IDI7CisJCQkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQkJCX0KKwkJCQlVREZfU0JfUEFSVFJPT1Qoc2IsaSkgPSB1ZGZfZ2V0X3BibG9jayhzYiwgMCwgaSwgMCk7CisJCQkJVURGX1NCX1BBUlRMRU4oc2IsaSkgPSBVREZfU0JfUEFSVExFTihzYixpbm8ucGFydGl0aW9uUmVmZXJlbmNlTnVtKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdWRmX29wZW5fbHZpZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWlmIChVREZfU0JfTFZJREJIKHNiKSkKKwl7CisJCWludCBpOworCQlrZXJuZWxfdGltZXN0YW1wIGNwdV90aW1lOworCisJCVVERl9TQl9MVklESVUoc2IpLT5pbXBJZGVudC5pZGVudFN1ZmZpeFswXSA9IFVERl9PU19DTEFTU19VTklYOworCQlVREZfU0JfTFZJRElVKHNiKS0+aW1wSWRlbnQuaWRlbnRTdWZmaXhbMV0gPSBVREZfT1NfSURfTElOVVg7CisJCWlmICh1ZGZfdGltZV90b19zdGFtcCgmY3B1X3RpbWUsIENVUlJFTlRfVElNRSkpCisJCQlVREZfU0JfTFZJRChzYiktPnJlY29yZGluZ0RhdGVBbmRUaW1lID0gY3B1X3RvX2xldHMoY3B1X3RpbWUpOworCQlVREZfU0JfTFZJRChzYiktPmludGVncml0eVR5cGUgPSBMVklEX0lOVEVHUklUWV9UWVBFX09QRU47CisKKwkJVURGX1NCX0xWSUQoc2IpLT5kZXNjVGFnLmRlc2NDUkMgPQorCQkJY3B1X3RvX2xlMTYodWRmX2NyYygoY2hhciAqKVVERl9TQl9MVklEKHNiKSArIHNpemVvZih0YWcpLAorCQkJbGUxNl90b19jcHUoVURGX1NCX0xWSUQoc2IpLT5kZXNjVGFnLmRlc2NDUkNMZW5ndGgpLCAwKSk7CisKKwkJVURGX1NCX0xWSUQoc2IpLT5kZXNjVGFnLnRhZ0NoZWNrc3VtID0gMDsKKwkJZm9yIChpPTA7IGk8MTY7IGkrKykKKwkJCWlmIChpICE9IDQpCisJCQkJVURGX1NCX0xWSUQoc2IpLT5kZXNjVGFnLnRhZ0NoZWNrc3VtICs9CisJCQkJCSgodWludDhfdCAqKSYoVURGX1NCX0xWSUQoc2IpLT5kZXNjVGFnKSlbaV07CisKKwkJbWFya19idWZmZXJfZGlydHkoVURGX1NCX0xWSURCSChzYikpOworCX0KK30KKworc3RhdGljIHZvaWQgdWRmX2Nsb3NlX2x2aWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpZiAoVURGX1NCX0xWSURCSChzYikgJiYKKwkJVURGX1NCX0xWSUQoc2IpLT5pbnRlZ3JpdHlUeXBlID09IExWSURfSU5URUdSSVRZX1RZUEVfT1BFTikKKwl7CisJCWludCBpOworCQlrZXJuZWxfdGltZXN0YW1wIGNwdV90aW1lOworCisJCVVERl9TQl9MVklESVUoc2IpLT5pbXBJZGVudC5pZGVudFN1ZmZpeFswXSA9IFVERl9PU19DTEFTU19VTklYOworCQlVREZfU0JfTFZJRElVKHNiKS0+aW1wSWRlbnQuaWRlbnRTdWZmaXhbMV0gPSBVREZfT1NfSURfTElOVVg7CisJCWlmICh1ZGZfdGltZV90b19zdGFtcCgmY3B1X3RpbWUsIENVUlJFTlRfVElNRSkpCisJCQlVREZfU0JfTFZJRChzYiktPnJlY29yZGluZ0RhdGVBbmRUaW1lID0gY3B1X3RvX2xldHMoY3B1X3RpbWUpOworCQlpZiAoVURGX01BWF9XUklURV9WRVJTSU9OID4gbGUxNl90b19jcHUoVURGX1NCX0xWSURJVShzYiktPm1heFVERldyaXRlUmV2KSkKKwkJCVVERl9TQl9MVklESVUoc2IpLT5tYXhVREZXcml0ZVJldiA9IGNwdV90b19sZTE2KFVERl9NQVhfV1JJVEVfVkVSU0lPTik7CisJCWlmIChVREZfU0JfVURGUkVWKHNiKSA+IGxlMTZfdG9fY3B1KFVERl9TQl9MVklESVUoc2IpLT5taW5VREZSZWFkUmV2KSkKKwkJCVVERl9TQl9MVklESVUoc2IpLT5taW5VREZSZWFkUmV2ID0gY3B1X3RvX2xlMTYoVURGX1NCX1VERlJFVihzYikpOworCQlpZiAoVURGX1NCX1VERlJFVihzYikgPiBsZTE2X3RvX2NwdShVREZfU0JfTFZJRElVKHNiKS0+bWluVURGV3JpdGVSZXYpKQorCQkJVURGX1NCX0xWSURJVShzYiktPm1pblVERldyaXRlUmV2ID0gY3B1X3RvX2xlMTYoVURGX1NCX1VERlJFVihzYikpOworCQlVREZfU0JfTFZJRChzYiktPmludGVncml0eVR5cGUgPSBjcHVfdG9fbGUzMihMVklEX0lOVEVHUklUWV9UWVBFX0NMT1NFKTsKKworCQlVREZfU0JfTFZJRChzYiktPmRlc2NUYWcuZGVzY0NSQyA9CisJCQljcHVfdG9fbGUxNih1ZGZfY3JjKChjaGFyICopVURGX1NCX0xWSUQoc2IpICsgc2l6ZW9mKHRhZyksCisJCQlsZTE2X3RvX2NwdShVREZfU0JfTFZJRChzYiktPmRlc2NUYWcuZGVzY0NSQ0xlbmd0aCksIDApKTsKKworCQlVREZfU0JfTFZJRChzYiktPmRlc2NUYWcudGFnQ2hlY2tzdW0gPSAwOworCQlmb3IgKGk9MDsgaTwxNjsgaSsrKQorCQkJaWYgKGkgIT0gNCkKKwkJCQlVREZfU0JfTFZJRChzYiktPmRlc2NUYWcudGFnQ2hlY2tzdW0gKz0KKwkJCQkJKCh1aW50OF90ICopJihVREZfU0JfTFZJRChzYiktPmRlc2NUYWcpKVtpXTsKKworCQltYXJrX2J1ZmZlcl9kaXJ0eShVREZfU0JfTFZJREJIKHNiKSk7CisJfQorfQorCisvKgorICogdWRmX3JlYWRfc3VwZXIKKyAqCisgKiBQVVJQT1NFCisgKglDb21wbGV0ZSB0aGUgc3BlY2lmaWVkIHN1cGVyIGJsb2NrLgorICoKKyAqIFBSRS1DT05ESVRJT05TCisgKglzYgkJCVBvaW50ZXIgdG8gc3VwZXJibG9jayB0byBjb21wbGV0ZSAtIG5ldmVyIE5VTEwuCisgKglzYi0+c19kZXYJCURldmljZSB0byByZWFkIHN1YmVyYmxvY2sgZnJvbS4KKyAqCW9wdGlvbnMJCQlQb2ludGVyIHRvIG1vdW50IG9wdGlvbnMuCisgKglzaWxlbnQJCQlTaWxlbnQgZmxhZy4KKyAqCisgKiBISVNUT1JZCisgKglKdWx5IDEsIDE5OTcgLSBBbmRyZXcgRS4gTWlsZXNraQorICoJV3JpdHRlbiwgdGVzdGVkLCBhbmQgcmVsZWFzZWQuCisgKi8KK3N0YXRpYyBpbnQgdWRmX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqb3B0aW9ucywgaW50IHNpbGVudCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlPU5VTEw7CisJc3RydWN0IHVkZl9vcHRpb25zIHVvcHQ7CisJa2VybmVsX2xiX2FkZHIgcm9vdGRpciwgZmlsZXNldDsKKwlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaTsKKworCXVvcHQuZmxhZ3MgPSAoMSA8PCBVREZfRkxBR19VU0VfQURfSU5fSUNCKSB8ICgxIDw8IFVERl9GTEFHX1NUUklDVCk7CisJdW9wdC51aWQgPSAtMTsKKwl1b3B0LmdpZCA9IC0xOworCXVvcHQudW1hc2sgPSAwOworCisJc2JpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVkZl9zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmkpCisJCXJldHVybiAtRU5PTUVNOworCXNiLT5zX2ZzX2luZm8gPSBzYmk7CisJbWVtc2V0KFVERl9TQihzYiksIDB4MDAsIHNpemVvZihzdHJ1Y3QgdWRmX3NiX2luZm8pKTsKKworCWluaXRfTVVURVgoJnNiaS0+c19hbGxvY19zZW0pOworCisJaWYgKCF1ZGZfcGFyc2Vfb3B0aW9ucygoY2hhciAqKW9wdGlvbnMsICZ1b3B0KSkKKwkJZ290byBlcnJvcl9vdXQ7CisKKwlpZiAodW9wdC5mbGFncyAmICgxIDw8IFVERl9GTEFHX1VURjgpICYmCisJICAgIHVvcHQuZmxhZ3MgJiAoMSA8PCBVREZfRkxBR19OTFNfTUFQKSkKKwl7CisJCXVkZl9lcnJvcihzYiwgInVkZl9yZWFkX3N1cGVyIiwKKwkJCSJ1dGY4IGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGlvY2hhcnNldFxuIik7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKyNpZmRlZiBDT05GSUdfVURGX05MUworCWlmICgodW9wdC5mbGFncyAmICgxIDw8IFVERl9GTEFHX05MU19NQVApKSAmJiAhdW9wdC5ubHNfbWFwKQorCXsKKwkJdW9wdC5ubHNfbWFwID0gbG9hZF9ubHNfZGVmYXVsdCgpOworCQlpZiAoIXVvcHQubmxzX21hcCkKKwkJCXVvcHQuZmxhZ3MgJj0gfigxIDw8IFVERl9GTEFHX05MU19NQVApOworCQllbHNlCisJCQl1ZGZfZGVidWcoIlVzaW5nIGRlZmF1bHQgTkxTIG1hcFxuIik7CisJfQorI2VuZGlmCisJaWYgKCEodW9wdC5mbGFncyAmICgxIDw8IFVERl9GTEFHX05MU19NQVApKSkKKwkJdW9wdC5mbGFncyB8PSAoMSA8PCBVREZfRkxBR19VVEY4KTsKKworCWZpbGVzZXQubG9naWNhbEJsb2NrTnVtID0gMHhGRkZGRkZGRjsKKwlmaWxlc2V0LnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IDB4RkZGRjsKKworCVVERl9TQihzYiktPnNfZmxhZ3MgPSB1b3B0LmZsYWdzOworCVVERl9TQihzYiktPnNfdWlkID0gdW9wdC51aWQ7CisJVURGX1NCKHNiKS0+c19naWQgPSB1b3B0LmdpZDsKKwlVREZfU0Ioc2IpLT5zX3VtYXNrID0gdW9wdC51bWFzazsKKwlVREZfU0Ioc2IpLT5zX25sc19tYXAgPSB1b3B0Lm5sc19tYXA7CisKKwkvKiBTZXQgdGhlIGJsb2NrIHNpemUgZm9yIGFsbCB0cmFuc2ZlcnMgKi8KKwlpZiAoIXVkZl9zZXRfYmxvY2tzaXplKHNiLCB1b3B0LmJsb2Nrc2l6ZSkpCisJCWdvdG8gZXJyb3Jfb3V0OworCisJaWYgKCB1b3B0LnNlc3Npb24gPT0gMHhGRkZGRkZGRiApCisJCVVERl9TQl9TRVNTSU9OKHNiKSA9IHVkZl9nZXRfbGFzdF9zZXNzaW9uKHNiKTsKKwllbHNlCisJCVVERl9TQl9TRVNTSU9OKHNiKSA9IHVvcHQuc2Vzc2lvbjsKKworCXVkZl9kZWJ1ZygiTXVsdGktc2Vzc2lvbj0lZFxuIiwgVURGX1NCX1NFU1NJT04oc2IpKTsKKworCVVERl9TQl9MQVNUQkxPQ0soc2IpID0gdW9wdC5sYXN0YmxvY2s7CisJVURGX1NCX0FOQ0hPUihzYilbMF0gPSBVREZfU0JfQU5DSE9SKHNiKVsxXSA9IDA7CisJVURGX1NCX0FOQ0hPUihzYilbMl0gPSB1b3B0LmFuY2hvcjsKKwlVREZfU0JfQU5DSE9SKHNiKVszXSA9IDI1NjsKKworCWlmICh1ZGZfY2hlY2tfdmFsaWQoc2IsIHVvcHQubm92cnMsIHNpbGVudCkpIC8qIHJlYWQgdm9sdW1lIHJlY29nbml0aW9uIHNlcXVlbmNlcyAqLworCXsKKwkJcHJpbnRrKCJVREYtZnM6IE5vIFZSUyBmb3VuZFxuIik7CisgCQlnb3RvIGVycm9yX291dDsKKwl9CisKKwl1ZGZfZmluZF9hbmNob3Ioc2IpOworCisJLyogRmlsbCBpbiB0aGUgcmVzdCBvZiB0aGUgc3VwZXJibG9jayAqLworCXNiLT5zX29wID0gJnVkZl9zYl9vcHM7CisJc2ItPmRxX29wID0gTlVMTDsKKwlzYi0+c19kaXJ0ID0gMDsKKwlzYi0+c19tYWdpYyA9IFVERl9TVVBFUl9NQUdJQzsKKwlzYi0+c190aW1lX2dyYW4gPSAxMDAwOworCisJaWYgKHVkZl9sb2FkX3BhcnRpdGlvbihzYiwgJmZpbGVzZXQpKQorCXsKKwkJcHJpbnRrKCJVREYtZnM6IE5vIHBhcnRpdGlvbiBmb3VuZCAoMSlcbiIpOworCQlnb3RvIGVycm9yX291dDsKKwl9CisKKwl1ZGZfZGVidWcoIkxhc3RibG9jaz0lZFxuIiwgVURGX1NCX0xBU1RCTE9DSyhzYikpOworCisJaWYgKCBVREZfU0JfTFZJREJIKHNiKSApCisJeworCQl1aW50MTZfdCBtaW5VREZSZWFkUmV2ID0gbGUxNl90b19jcHUoVURGX1NCX0xWSURJVShzYiktPm1pblVERlJlYWRSZXYpOworCQl1aW50MTZfdCBtaW5VREZXcml0ZVJldiA9IGxlMTZfdG9fY3B1KFVERl9TQl9MVklESVUoc2IpLT5taW5VREZXcml0ZVJldik7CisJCS8qIHVpbnQxNl90IG1heFVERldyaXRlUmV2ID0gbGUxNl90b19jcHUoVURGX1NCX0xWSURJVShzYiktPm1heFVERldyaXRlUmV2KTsgKi8KKworCQlpZiAobWluVURGUmVhZFJldiA+IFVERl9NQVhfUkVBRF9WRVJTSU9OKQorCQl7CisJCQlwcmludGsoIlVERi1mczogbWluVURGUmVhZFJldj0leCAobWF4IGlzICV4KVxuIiwKKwkJCQlsZTE2X3RvX2NwdShVREZfU0JfTFZJRElVKHNiKS0+bWluVURGUmVhZFJldiksCisJCQkJVURGX01BWF9SRUFEX1ZFUlNJT04pOworCQkJZ290byBlcnJvcl9vdXQ7CisJCX0KKwkJZWxzZSBpZiAobWluVURGV3JpdGVSZXYgPiBVREZfTUFYX1dSSVRFX1ZFUlNJT04pCisJCXsKKwkJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKwkJfQorCisJCVVERl9TQl9VREZSRVYoc2IpID0gbWluVURGV3JpdGVSZXY7CisKKwkJaWYgKG1pblVERlJlYWRSZXYgPj0gVURGX1ZFUlNfVVNFX0VYVEVOREVEX0ZFKQorCQkJVURGX1NFVF9GTEFHKHNiLCBVREZfRkxBR19VU0VfRVhURU5ERURfRkUpOworCQlpZiAobWluVURGUmVhZFJldiA+PSBVREZfVkVSU19VU0VfU1RSRUFNUykKKwkJCVVERl9TRVRfRkxBRyhzYiwgVURGX0ZMQUdfVVNFX1NUUkVBTVMpOworCX0KKworCWlmICggIVVERl9TQl9OVU1QQVJUUyhzYikgKQorCXsKKwkJcHJpbnRrKCJVREYtZnM6IE5vIHBhcnRpdGlvbiBmb3VuZCAoMilcbiIpOworCQlnb3RvIGVycm9yX291dDsKKwl9CisKKwlpZiAoIHVkZl9maW5kX2ZpbGVzZXQoc2IsICZmaWxlc2V0LCAmcm9vdGRpcikgKQorCXsKKwkJcHJpbnRrKCJVREYtZnM6IE5vIGZpbGVzZXQgZm91bmRcbiIpOworCQlnb3RvIGVycm9yX291dDsKKwl9CisKKwlpZiAoIXNpbGVudCkKKwl7CisJCWtlcm5lbF90aW1lc3RhbXAgdHM7CisJCXVkZl90aW1lX3RvX3N0YW1wKCZ0cywgVURGX1NCX1JFQ09SRFRJTUUoc2IpKTsKKwkJdWRmX2luZm8oIlVERiAlcyAoJXMpIE1vdW50aW5nIHZvbHVtZSAnJXMnLCB0aW1lc3RhbXAgJTA0dS8lMDJ1LyUwMnUgJTAydTolMDJ1ICgleClcbiIsCisJCQlVREZGU19WRVJTSU9OLCBVREZGU19EQVRFLAorCQkJVURGX1NCX1ZPTElERU5UKHNiKSwgdHMueWVhciwgdHMubW9udGgsIHRzLmRheSwgdHMuaG91ciwgdHMubWludXRlLAorCQkJdHMudHlwZUFuZFRpbWV6b25lKTsKKwl9CisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQorCQl1ZGZfb3Blbl9sdmlkKHNiKTsKKworCS8qIEFzc2lnbiB0aGUgcm9vdCBpbm9kZSAqLworCS8qIGFzc2lnbiBpbm9kZXMgYnkgcGh5c2ljYWwgYmxvY2sgbnVtYmVyICovCisJLyogcGVyaGFwcyBpdCdzIG5vdCBleHRlbnNpYmxlIGVub3VnaCwgYnV0IGZvciBub3cgLi4uICovCisJaW5vZGUgPSB1ZGZfaWdldChzYiwgcm9vdGRpcik7IAorCWlmICghaW5vZGUpCisJeworCQlwcmludGsoIlVERi1mczogRXJyb3IgaW4gdWRmX2lnZXQsIGJsb2NrPSVkLCBwYXJ0aXRpb249JWRcbiIsCisJCQlyb290ZGlyLmxvZ2ljYWxCbG9ja051bSwgcm9vdGRpci5wYXJ0aXRpb25SZWZlcmVuY2VOdW0pOworCQlnb3RvIGVycm9yX291dDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhIGRlbnRyeSBmb3IgdGhlIHJvb3QgaW5vZGUgKi8KKwlzYi0+c19yb290ID0gZF9hbGxvY19yb290KGlub2RlKTsKKwlpZiAoIXNiLT5zX3Jvb3QpCisJeworCQlwcmludGsoIlVERi1mczogQ291bGRuJ3QgYWxsb2NhdGUgcm9vdCBkZW50cnlcbiIpOworCQlpcHV0KGlub2RlKTsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCXNiLT5zX21heGJ5dGVzID0gTUFYX0xGU19GSUxFU0laRTsKKwlyZXR1cm4gMDsKKworZXJyb3Jfb3V0OgorCWlmIChVREZfU0JfVkFUKHNiKSkKKwkJaXB1dChVREZfU0JfVkFUKHNiKSk7CisJaWYgKFVERl9TQl9OVU1QQVJUUyhzYikpCisJeworCQlpZiAoVURGX1NCX1BBUlRGTEFHUyhzYiwgVURGX1NCX1BBUlRJVElPTihzYikpICYgVURGX1BBUlRfRkxBR19VTkFMTE9DX1RBQkxFKQorCQkJaXB1dChVREZfU0JfUEFSVE1BUFMoc2IpW1VERl9TQl9QQVJUSVRJT04oc2IpXS5zX3VzcGFjZS5zX3RhYmxlKTsKKwkJaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsIFVERl9TQl9QQVJUSVRJT04oc2IpKSAmIFVERl9QQVJUX0ZMQUdfRlJFRURfVEFCTEUpCisJCQlpcHV0KFVERl9TQl9QQVJUTUFQUyhzYilbVURGX1NCX1BBUlRJVElPTihzYildLnNfZnNwYWNlLnNfdGFibGUpOworCQlpZiAoVURGX1NCX1BBUlRGTEFHUyhzYiwgVURGX1NCX1BBUlRJVElPTihzYikpICYgVURGX1BBUlRfRkxBR19VTkFMTE9DX0JJVE1BUCkKKwkJCVVERl9TQl9GUkVFX0JJVE1BUChzYixVREZfU0JfUEFSVElUSU9OKHNiKSxzX3VzcGFjZSk7CisJCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBVREZfU0JfUEFSVElUSU9OKHNiKSkgJiBVREZfUEFSVF9GTEFHX0ZSRUVEX0JJVE1BUCkKKwkJCVVERl9TQl9GUkVFX0JJVE1BUChzYixVREZfU0JfUEFSVElUSU9OKHNiKSxzX2ZzcGFjZSk7CisJCWlmIChVREZfU0JfUEFSVFRZUEUoc2IsIFVERl9TQl9QQVJUSVRJT04oc2IpKSA9PSBVREZfU1BBUkFCTEVfTUFQMTUpCisJCXsKKwkJCWZvciAoaT0wOyBpPDQ7IGkrKykKKwkJCQl1ZGZfcmVsZWFzZV9kYXRhKFVERl9TQl9UWVBFU1BBUihzYiwgVURGX1NCX1BBUlRJVElPTihzYikpLnNfc3Bhcl9tYXBbaV0pOworCQl9CisJfQorI2lmZGVmIENPTkZJR19VREZfTkxTCisJaWYgKFVERl9RVUVSWV9GTEFHKHNiLCBVREZfRkxBR19OTFNfTUFQKSkKKwkJdW5sb2FkX25scyhVREZfU0Ioc2IpLT5zX25sc19tYXApOworI2VuZGlmCisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQorCQl1ZGZfY2xvc2VfbHZpZChzYik7CisJdWRmX3JlbGVhc2VfZGF0YShVREZfU0JfTFZJREJIKHNiKSk7CisJVURGX1NCX0ZSRUUoc2IpOworCWtmcmVlKHNiaSk7CisJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3ZvaWQgdWRmX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLAorCWNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKwl7CisJCS8qIG1hcmsgc2IgZXJyb3IgKi8KKwkJc2ItPnNfZGlydCA9IDE7CisJfQorCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnNwcmludGYoZXJyb3JfYnVmLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlwcmludGsgKEtFUk5fQ1JJVCAiVURGLWZzIGVycm9yIChkZXZpY2UgJXMpOiAlczogJXNcbiIsCisJCXNiLT5zX2lkLCBmdW5jdGlvbiwgZXJyb3JfYnVmKTsKK30KKwordm9pZCB1ZGZfd2FybmluZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKKwljb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydCAoYXJncywgZm10KTsKKwl2c3ByaW50ZihlcnJvcl9idWYsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIlVERi1mcyB3YXJuaW5nIChkZXZpY2UgJXMpOiAlczogJXNcbiIsCisJCXNiLT5zX2lkLCBmdW5jdGlvbiwgZXJyb3JfYnVmKTsKK30KKworLyoKKyAqIHVkZl9wdXRfc3VwZXIKKyAqCisgKiBQVVJQT1NFCisgKglQcmVwYXJlIGZvciBkZXN0cnVjdGlvbiBvZiB0aGUgc3VwZXJibG9jay4KKyAqCisgKiBERVNDUklQVElPTgorICoJQ2FsbGVkIGJlZm9yZSB0aGUgZmlsZXN5c3RlbSBpcyB1bm1vdW50ZWQuCisgKgorICogSElTVE9SWQorICoJSnVseSAxLCAxOTk3IC0gQW5kcmV3IEUuIE1pbGVza2kKKyAqCVdyaXR0ZW4sIHRlc3RlZCwgYW5kIHJlbGVhc2VkLgorICovCitzdGF0aWMgdm9pZAordWRmX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWludCBpOworCisJaWYgKFVERl9TQl9WQVQoc2IpKQorCQlpcHV0KFVERl9TQl9WQVQoc2IpKTsKKwlpZiAoVURGX1NCX05VTVBBUlRTKHNiKSkKKwl7CisJCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBVREZfU0JfUEFSVElUSU9OKHNiKSkgJiBVREZfUEFSVF9GTEFHX1VOQUxMT0NfVEFCTEUpCisJCQlpcHV0KFVERl9TQl9QQVJUTUFQUyhzYilbVURGX1NCX1BBUlRJVElPTihzYildLnNfdXNwYWNlLnNfdGFibGUpOworCQlpZiAoVURGX1NCX1BBUlRGTEFHUyhzYiwgVURGX1NCX1BBUlRJVElPTihzYikpICYgVURGX1BBUlRfRkxBR19GUkVFRF9UQUJMRSkKKwkJCWlwdXQoVURGX1NCX1BBUlRNQVBTKHNiKVtVREZfU0JfUEFSVElUSU9OKHNiKV0uc19mc3BhY2Uuc190YWJsZSk7CisJCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBVREZfU0JfUEFSVElUSU9OKHNiKSkgJiBVREZfUEFSVF9GTEFHX1VOQUxMT0NfQklUTUFQKQorCQkJVURGX1NCX0ZSRUVfQklUTUFQKHNiLFVERl9TQl9QQVJUSVRJT04oc2IpLHNfdXNwYWNlKTsKKwkJaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsIFVERl9TQl9QQVJUSVRJT04oc2IpKSAmIFVERl9QQVJUX0ZMQUdfRlJFRURfQklUTUFQKQorCQkJVURGX1NCX0ZSRUVfQklUTUFQKHNiLFVERl9TQl9QQVJUSVRJT04oc2IpLHNfZnNwYWNlKTsKKwkJaWYgKFVERl9TQl9QQVJUVFlQRShzYiwgVURGX1NCX1BBUlRJVElPTihzYikpID09IFVERl9TUEFSQUJMRV9NQVAxNSkKKwkJeworCQkJZm9yIChpPTA7IGk8NDsgaSsrKQorCQkJCXVkZl9yZWxlYXNlX2RhdGEoVURGX1NCX1RZUEVTUEFSKHNiLCBVREZfU0JfUEFSVElUSU9OKHNiKSkuc19zcGFyX21hcFtpXSk7CisJCX0KKwl9CisjaWZkZWYgQ09ORklHX1VERl9OTFMKKwlpZiAoVURGX1FVRVJZX0ZMQUcoc2IsIFVERl9GTEFHX05MU19NQVApKQorCQl1bmxvYWRfbmxzKFVERl9TQihzYiktPnNfbmxzX21hcCk7CisjZW5kaWYKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCisJCXVkZl9jbG9zZV9sdmlkKHNiKTsKKwl1ZGZfcmVsZWFzZV9kYXRhKFVERl9TQl9MVklEQkgoc2IpKTsKKwlVREZfU0JfRlJFRShzYik7CisJa2ZyZWUoc2ItPnNfZnNfaW5mbyk7CisJc2ItPnNfZnNfaW5mbyA9IE5VTEw7Cit9CisKKy8qCisgKiB1ZGZfc3RhdF9mcworICoKKyAqIFBVUlBPU0UKKyAqCVJldHVybiBpbmZvIGFib3V0IHRoZSBmaWxlc3lzdGVtLgorICoKKyAqIERFU0NSSVBUSU9OCisgKglDYWxsZWQgYnkgc3lzX3N0YXRmcygpCisgKgorICogSElTVE9SWQorICoJSnVseSAxLCAxOTk3IC0gQW5kcmV3IEUuIE1pbGVza2kKKyAqCVdyaXR0ZW4sIHRlc3RlZCwgYW5kIHJlbGVhc2VkLgorICovCitzdGF0aWMgaW50Cit1ZGZfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCit7CisJYnVmLT5mX3R5cGUgPSBVREZfU1VQRVJfTUFHSUM7CisJYnVmLT5mX2JzaXplID0gc2ItPnNfYmxvY2tzaXplOworCWJ1Zi0+Zl9ibG9ja3MgPSBVREZfU0JfUEFSVExFTihzYiwgVURGX1NCX1BBUlRJVElPTihzYikpOworCWJ1Zi0+Zl9iZnJlZSA9IHVkZl9jb3VudF9mcmVlKHNiKTsKKwlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlOworCWJ1Zi0+Zl9maWxlcyA9IChVREZfU0JfTFZJREJIKHNiKSA/CisJCShsZTMyX3RvX2NwdShVREZfU0JfTFZJRElVKHNiKS0+bnVtRmlsZXMpICsKKwkJbGUzMl90b19jcHUoVURGX1NCX0xWSURJVShzYiktPm51bURpcnMpKSA6IDApICsgYnVmLT5mX2JmcmVlOworCWJ1Zi0+Zl9mZnJlZSA9IGJ1Zi0+Zl9iZnJlZTsKKwkvKiBfX2tlcm5lbF9mc2lkX3QgZl9mc2lkICovCisJYnVmLT5mX25hbWVsZW4gPSBVREZfTkFNRV9MRU4tMjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciB1ZGZfYml0bWFwX2xvb2t1cFsxNl0gPSB7CisJMCwgMSwgMSwgMiwgMSwgMiwgMiwgMywgMSwgMiwgMiwgMywgMiwgMywgMywgNAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludAordWRmX2NvdW50X2ZyZWVfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCB1ZGZfYml0bWFwICpiaXRtYXApCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJdW5zaWduZWQgaW50IGFjY3VtID0gMDsKKwlpbnQgaW5kZXg7CisJaW50IGJsb2NrID0gMCwgbmV3YmxvY2s7CisJa2VybmVsX2xiX2FkZHIgbG9jOworCXVpbnQzMl90IGJ5dGVzOworCXVpbnQ4X3QgdmFsdWU7CisJdWludDhfdCAqcHRyOworCXVpbnQxNl90IGlkZW50OworCXN0cnVjdCBzcGFjZUJpdG1hcERlc2MgKmJtOworCisJbG9ja19rZXJuZWwoKTsKKworCWxvYy5sb2dpY2FsQmxvY2tOdW0gPSBiaXRtYXAtPnNfZXh0UG9zaXRpb247CisJbG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IFVERl9TQl9QQVJUSVRJT04oc2IpOworCWJoID0gdWRmX3JlYWRfcHRhZ2dlZChzYiwgbG9jLCAwLCAmaWRlbnQpOworCisJaWYgKCFiaCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAidWRmOiB1ZGZfY291bnRfZnJlZSBmYWlsZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisJZWxzZSBpZiAoaWRlbnQgIT0gVEFHX0lERU5UX1NCRCkKKwl7CisJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQlwcmludGsoS0VSTl9FUlIgInVkZjogdWRmX2NvdW50X2ZyZWUgZmFpbGVkXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJYm0gPSAoc3RydWN0IHNwYWNlQml0bWFwRGVzYyAqKWJoLT5iX2RhdGE7CisJYnl0ZXMgPSBsZTMyX3RvX2NwdShibS0+bnVtT2ZCeXRlcyk7CisJaW5kZXggPSBzaXplb2Yoc3RydWN0IHNwYWNlQml0bWFwRGVzYyk7IC8qIG9mZnNldCBpbiBmaXJzdCBibG9jayBvbmx5ICovCisJcHRyID0gKHVpbnQ4X3QgKiliaC0+Yl9kYXRhOworCisJd2hpbGUgKCBieXRlcyA+IDAgKQorCXsKKwkJd2hpbGUgKChieXRlcyA+IDApICYmIChpbmRleCA8IHNiLT5zX2Jsb2Nrc2l6ZSkpCisJCXsKKwkJCXZhbHVlID0gcHRyW2luZGV4XTsKKwkJCWFjY3VtICs9IHVkZl9iaXRtYXBfbG9va3VwWyB2YWx1ZSAmIDB4MGYgXTsKKwkJCWFjY3VtICs9IHVkZl9iaXRtYXBfbG9va3VwWyB2YWx1ZSA+PiA0IF07CisJCQlpbmRleCsrOworCQkJYnl0ZXMtLTsKKwkJfQorCQlpZiAoIGJ5dGVzICkKKwkJeworCQkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCQluZXdibG9jayA9IHVkZl9nZXRfbGJfcGJsb2NrKHNiLCBsb2MsICsrYmxvY2spOworCQkJYmggPSB1ZGZfdHJlYWQoc2IsIG5ld2Jsb2NrKTsKKwkJCWlmICghYmgpCisJCQl7CisJCQkJdWRmX2RlYnVnKCJyZWFkIGZhaWxlZFxuIik7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlpbmRleCA9IDA7CisJCQlwdHIgPSAodWludDhfdCAqKWJoLT5iX2RhdGE7CisJCX0KKwl9CisJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gYWNjdW07Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3VkZl9jb3VudF9mcmVlX3RhYmxlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBpbm9kZSAqIHRhYmxlKQoreworCXVuc2lnbmVkIGludCBhY2N1bSA9IDA7CisJdWludDMyX3QgZXh0b2Zmc2V0LCBlbGVuOworCWtlcm5lbF9sYl9hZGRyIGJsb2MsIGVsb2M7CisJaW50OF90IGV0eXBlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCisJbG9ja19rZXJuZWwoKTsKKworCWJsb2MgPSBVREZfSV9MT0NBVElPTih0YWJsZSk7CisJZXh0b2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSk7CisKKwl3aGlsZSAoKGV0eXBlID0gdWRmX25leHRfYWV4dCh0YWJsZSwgJmJsb2MsICZleHRvZmZzZXQsICZlbG9jLCAmZWxlbiwgJmJoLCAxKSkgIT0gLTEpCisJeworCQlhY2N1bSArPSAoZWxlbiA+PiB0YWJsZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisJfQorCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIGFjY3VtOworfQorCQorc3RhdGljIHVuc2lnbmVkIGludAordWRmX2NvdW50X2ZyZWUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwl1bnNpZ25lZCBpbnQgYWNjdW0gPSAwOworCisJaWYgKFVERl9TQl9MVklEQkgoc2IpKQorCXsKKwkJaWYgKGxlMzJfdG9fY3B1KFVERl9TQl9MVklEKHNiKS0+bnVtT2ZQYXJ0aXRpb25zKSA+IFVERl9TQl9QQVJUSVRJT04oc2IpKQorCQl7CisJCQlhY2N1bSA9IGxlMzJfdG9fY3B1KFVERl9TQl9MVklEKHNiKS0+ZnJlZVNwYWNlVGFibGVbVURGX1NCX1BBUlRJVElPTihzYildKTsKKworCQkJaWYgKGFjY3VtID09IDB4RkZGRkZGRkYpCisJCQkJYWNjdW0gPSAwOworCQl9CisJfQorCisJaWYgKGFjY3VtKQorCQlyZXR1cm4gYWNjdW07CisKKwlpZiAoVURGX1NCX1BBUlRGTEFHUyhzYixVREZfU0JfUEFSVElUSU9OKHNiKSkgJiBVREZfUEFSVF9GTEFHX1VOQUxMT0NfQklUTUFQKQorCXsKKwkJYWNjdW0gKz0gdWRmX2NvdW50X2ZyZWVfYml0bWFwKHNiLAorCQkJVURGX1NCX1BBUlRNQVBTKHNiKVtVREZfU0JfUEFSVElUSU9OKHNiKV0uc191c3BhY2Uuc19iaXRtYXApOworCX0KKwlpZiAoVURGX1NCX1BBUlRGTEFHUyhzYixVREZfU0JfUEFSVElUSU9OKHNiKSkgJiBVREZfUEFSVF9GTEFHX0ZSRUVEX0JJVE1BUCkKKwl7CisJCWFjY3VtICs9IHVkZl9jb3VudF9mcmVlX2JpdG1hcChzYiwKKwkJCVVERl9TQl9QQVJUTUFQUyhzYilbVURGX1NCX1BBUlRJVElPTihzYildLnNfZnNwYWNlLnNfYml0bWFwKTsKKwl9CisJaWYgKGFjY3VtKQorCQlyZXR1cm4gYWNjdW07CisKKwlpZiAoVURGX1NCX1BBUlRGTEFHUyhzYixVREZfU0JfUEFSVElUSU9OKHNiKSkgJiBVREZfUEFSVF9GTEFHX1VOQUxMT0NfVEFCTEUpCisJeworCQlhY2N1bSArPSB1ZGZfY291bnRfZnJlZV90YWJsZShzYiwKKwkJCVVERl9TQl9QQVJUTUFQUyhzYilbVURGX1NCX1BBUlRJVElPTihzYildLnNfdXNwYWNlLnNfdGFibGUpOworCX0KKwlpZiAoVURGX1NCX1BBUlRGTEFHUyhzYixVREZfU0JfUEFSVElUSU9OKHNiKSkgJiBVREZfUEFSVF9GTEFHX0ZSRUVEX1RBQkxFKQorCXsKKwkJYWNjdW0gKz0gdWRmX2NvdW50X2ZyZWVfdGFibGUoc2IsCisJCQlVREZfU0JfUEFSVE1BUFMoc2IpW1VERl9TQl9QQVJUSVRJT04oc2IpXS5zX2ZzcGFjZS5zX3RhYmxlKTsKKwl9CisKKwlyZXR1cm4gYWNjdW07Cit9CmRpZmYgLS1naXQgYS9mcy91ZGYvc3ltbGluay5jIGIvZnMvdWRmL3N5bWxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2YzMDUxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvdWRmL3N5bWxpbmsuYwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIHN5bWxpbmsuYworICoKKyAqIFBVUlBPU0UKKyAqCVN5bWxpbmsgaGFuZGxpbmcgcm91dGluZXMgZm9yIHRoZSBPU1RBLVVERih0bSkgZmlsZXN5c3RlbS4KKyAqCisgKiBDT05UQUNUUworICoJRS1tYWlsIHJlZ2FyZGluZyBhbnkgcG9ydGlvbiBvZiB0aGUgTGludXggVURGIGZpbGUgc3lzdGVtIHNob3VsZCBiZQorICoJZGlyZWN0ZWQgdG8gdGhlIGRldmVsb3BtZW50IHRlYW0gbWFpbGluZyBsaXN0IChydW4gYnkgbWFqb3Jkb21vKToKKyAqCQlsaW51eF91ZGZAaHBlc2pyby5mYy5ocC5jb20KKyAqCisgKiBDT1BZUklHSFQKKyAqCVRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSAoR1BMKS4gQ29waWVzIG9mIHRoZSBHUEwgY2FuIGJlIG9idGFpbmVkIGZyb206CisgKgkJZnRwOi8vcHJlcC5haS5taXQuZWR1L3B1Yi9nbnUvR1BMCisgKglFYWNoIGNvbnRyaWJ1dGluZyBhdXRob3IgcmV0YWlucyBhbGwgcmlnaHRzIHRvIHRoZWlyIG93biB3b3JrLgorICoKKyAqICAoQykgMTk5OC0yMDAxIEJlbiBGZW5uZW1hCisgKiAgKEMpIDE5OTkgU3RlbGlhcyBDb21wdXRpbmcgSW5jIAorICoKKyAqIEhJU1RPUlkKKyAqCisgKiAgMDQvMTYvOTkgYmxmICBDcmVhdGVkLgorICoKKyAqLworCisjaW5jbHVkZSAidWRmZGVjbC5oIgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VkZl9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlICJ1ZGZfaS5oIgorCitzdGF0aWMgdm9pZCB1ZGZfcGNfdG9fY2hhcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpmcm9tLCBpbnQgZnJvbWxlbiwgY2hhciAqdG8pCit7CisJc3RydWN0IHBhdGhDb21wb25lbnQgKnBjOworCWludCBlbGVuID0gMDsKKwljaGFyICpwID0gdG87CisKKwl3aGlsZSAoZWxlbiA8IGZyb21sZW4pCisJeworCQlwYyA9IChzdHJ1Y3QgcGF0aENvbXBvbmVudCAqKShmcm9tICsgZWxlbik7CisJCXN3aXRjaCAocGMtPmNvbXBvbmVudFR5cGUpCisJCXsKKwkJCWNhc2UgMToKKwkJCQlpZiAocGMtPmxlbmd0aENvbXBvbmVudElkZW50ID09IDApCisJCQkJeworCQkJCQlwID0gdG87CisJCQkJCSpwKysgPSAnLyc7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCW1lbWNweShwLCAiLi4vIiwgMyk7CisJCQkJcCArPSAzOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCW1lbWNweShwLCAiLi8iLCAyKTsKKwkJCQlwICs9IDI7CisJCQkJLyogdGhhdCB3b3VsZCBiZSAuIC0ganVzdCBpZ25vcmUgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQlwICs9IHVkZl9nZXRfZmlsZW5hbWUoc2IsIHBjLT5jb21wb25lbnRJZGVudCwgcCwgcGMtPmxlbmd0aENvbXBvbmVudElkZW50KTsKKwkJCQkqcCsrID0gJy8nOworCQkJCWJyZWFrOworCQl9CisJCWVsZW4gKz0gc2l6ZW9mKHN0cnVjdCBwYXRoQ29tcG9uZW50KSArIHBjLT5sZW5ndGhDb21wb25lbnRJZGVudDsKKwl9CisJaWYgKHAgPiB0bysxKQorCQlwWy0xXSA9ICdcMCc7CisJZWxzZQorCQlwWzBdID0gJ1wwJzsKK30KKworc3RhdGljIGludCB1ZGZfc3ltbGlua19maWxsZXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWNoYXIgKnN5bWxpbms7CisJaW50IGVyciA9IC1FSU87CisJY2hhciAqcCA9IGttYXAocGFnZSk7CisKKwlsb2NrX2tlcm5lbCgpOworCWlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKKwkJc3ltbGluayA9IFVERl9JX0RBVEEoaW5vZGUpICsgVURGX0lfTEVORUFUVFIoaW5vZGUpOworCWVsc2UKKwl7CisJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIHVkZl9ibG9ja19tYXAoaW5vZGUsIDApKTsKKworCQlpZiAoIWJoKQorCQkJZ290byBvdXQ7CisKKwkJc3ltbGluayA9IGJoLT5iX2RhdGE7CisJfQorCisJdWRmX3BjX3RvX2NoYXIoaW5vZGUtPmlfc2IsIHN5bWxpbmssIGlub2RlLT5pX3NpemUsIHApOworCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCisJdW5sb2NrX2tlcm5lbCgpOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlrdW5tYXAocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIDA7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCVNldFBhZ2VFcnJvcihwYWdlKTsKKwlrdW5tYXAocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIHN5bWxpbmtzIGNhbid0IGRvIG11Y2guLi4KKyAqLworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB1ZGZfc3ltbGlua19hb3BzID0geworCS5yZWFkcGFnZQkJPSB1ZGZfc3ltbGlua19maWxsZXIsCit9OwpkaWZmIC0tZ2l0IGEvZnMvdWRmL3RydW5jYXRlLmMgYi9mcy91ZGYvdHJ1bmNhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGM4YTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvdWRmL3RydW5jYXRlLmMKQEAgLTAsMCArMSwyODQgQEAKKy8qCisgKiB0cnVuY2F0ZS5jCisgKgorICogUFVSUE9TRQorICoJVHJ1bmNhdGUgaGFuZGxpbmcgcm91dGluZXMgZm9yIHRoZSBPU1RBLVVERih0bSkgZmlsZXN5c3RlbS4KKyAqCisgKiBDT05UQUNUUworICoJRS1tYWlsIHJlZ2FyZGluZyBhbnkgcG9ydGlvbiBvZiB0aGUgTGludXggVURGIGZpbGUgc3lzdGVtIHNob3VsZCBiZQorICoJZGlyZWN0ZWQgdG8gdGhlIGRldmVsb3BtZW50IHRlYW0gbWFpbGluZyBsaXN0IChydW4gYnkgbWFqb3Jkb21vKToKKyAqCQlsaW51eF91ZGZAaHBlc2pyby5mYy5ocC5jb20KKyAqCisgKiBDT1BZUklHSFQKKyAqCVRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSAoR1BMKS4gQ29waWVzIG9mIHRoZSBHUEwgY2FuIGJlIG9idGFpbmVkIGZyb206CisgKgkJZnRwOi8vcHJlcC5haS5taXQuZWR1L3B1Yi9nbnUvR1BMCisgKglFYWNoIGNvbnRyaWJ1dGluZyBhdXRob3IgcmV0YWlucyBhbGwgcmlnaHRzIHRvIHRoZWlyIG93biB3b3JrLgorICoKKyAqICAoQykgMTk5OS0yMDA0IEJlbiBGZW5uZW1hCisgKiAgKEMpIDE5OTkgU3RlbGlhcyBDb21wdXRpbmcgSW5jCisgKgorICogSElTVE9SWQorICoKKyAqICAwMi8yNC85OSBibGYgIENyZWF0ZWQuCisgKgorICovCisKKyNpbmNsdWRlICJ1ZGZkZWNsLmgiCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3VkZl9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKyNpbmNsdWRlICJ1ZGZfaS5oIgorI2luY2x1ZGUgInVkZl9zYi5oIgorCitzdGF0aWMgdm9pZCBleHRlbnRfdHJ1bmMoc3RydWN0IGlub2RlICogaW5vZGUsIGtlcm5lbF9sYl9hZGRyIGJsb2MsIGludCBleHRvZmZzZXQsCisJa2VybmVsX2xiX2FkZHIgZWxvYywgaW50OF90IGV0eXBlLCB1aW50MzJfdCBlbGVuLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB1aW50MzJfdCBuZWxlbikKK3sKKwlrZXJuZWxfbGJfYWRkciBuZWxvYyA9IHsgMCwgMCB9OworCWludCBsYXN0X2Jsb2NrID0gKGVsZW4gKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwlpbnQgZmlyc3RfYmxvY2sgPSAobmVsZW4gKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKworCWlmIChuZWxlbikKKwl7CisJCWlmIChldHlwZSA9PSAoRVhUX05PVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKQorCQl7CisJCQl1ZGZfZnJlZV9ibG9ja3MoaW5vZGUtPmlfc2IsIGlub2RlLCBlbG9jLCAwLCBsYXN0X2Jsb2NrKTsKKwkJCWV0eXBlID0gKEVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRCA+PiAzMCk7CisJCX0KKwkJZWxzZQorCQkJbmVsb2MgPSBlbG9jOworCQluZWxlbiA9IChldHlwZSA8PCAzMCkgfCBuZWxlbjsKKwl9CisKKwlpZiAoZWxlbiAhPSBuZWxlbikKKwl7CisJCXVkZl93cml0ZV9hZXh0KGlub2RlLCBibG9jLCAmZXh0b2Zmc2V0LCBuZWxvYywgbmVsZW4sIGJoLCAwKTsKKwkJaWYgKGxhc3RfYmxvY2sgLSBmaXJzdF9ibG9jayA+IDApCisJCXsKKwkJCWlmIChldHlwZSA9PSAoRVhUX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpCisJCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisKKwkJCWlmIChldHlwZSAhPSAoRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEID4+IDMwKSkKKwkJCQl1ZGZfZnJlZV9ibG9ja3MoaW5vZGUtPmlfc2IsIGlub2RlLCBlbG9jLCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jayAtIGZpcnN0X2Jsb2NrKTsKKwkJfQorCX0KK30KKwordm9pZCB1ZGZfZGlzY2FyZF9wcmVhbGxvYyhzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlrZXJuZWxfbGJfYWRkciBibG9jLCBlbG9jOworCXVpbnQzMl90IGV4dG9mZnNldCA9IDAsIGVsZW4sIG5lbGVuOworCXVpbnQ2NF90IGxiY291bnQgPSAwOworCWludDhfdCBldHlwZSA9IC0xLCBuZXR5cGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJaW50IGFkc2l6ZTsKKworCWlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQiB8fAorCQlpbm9kZS0+aV9zaXplID09IFVERl9JX0xFTkVYVEVOVFMoaW5vZGUpKQorCXsKKwkJcmV0dXJuOworCX0KKworCWlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX1NIT1JUKQorCQlhZHNpemUgPSBzaXplb2Yoc2hvcnRfYWQpOworCWVsc2UgaWYgKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfTE9ORykKKwkJYWRzaXplID0gc2l6ZW9mKGxvbmdfYWQpOworCWVsc2UKKwkJYWRzaXplID0gMDsKKworCWJsb2MgPSBVREZfSV9MT0NBVElPTihpbm9kZSk7CisKKwl3aGlsZSAoKG5ldHlwZSA9IHVkZl9uZXh0X2FleHQoaW5vZGUsICZibG9jLCAmZXh0b2Zmc2V0LCAmZWxvYywgJmVsZW4sICZiaCwgMSkpICE9IC0xKQorCXsKKwkJZXR5cGUgPSBuZXR5cGU7CisJCWxiY291bnQgKz0gZWxlbjsKKwkJaWYgKGxiY291bnQgPiBpbm9kZS0+aV9zaXplICYmIGxiY291bnQgLSBpbm9kZS0+aV9zaXplIDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKQorCQl7CisJCQluZWxlbiA9IGVsZW4gLSAobGJjb3VudCAtIGlub2RlLT5pX3NpemUpOworCQkJZXh0ZW50X3RydW5jKGlub2RlLCBibG9jLCBleHRvZmZzZXQtYWRzaXplLCBlbG9jLCBldHlwZSwgZWxlbiwgYmgsIG5lbGVuKTsKKwkJCWxiY291bnQgPSBpbm9kZS0+aV9zaXplOworCQl9CisJfQorCWlmIChldHlwZSA9PSAoRVhUX05PVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKQorCXsKKwkJZXh0b2Zmc2V0IC09IGFkc2l6ZTsKKwkJbGJjb3VudCAtPSBlbGVuOworCQlleHRlbnRfdHJ1bmMoaW5vZGUsIGJsb2MsIGV4dG9mZnNldCwgZWxvYywgZXR5cGUsIGVsZW4sIGJoLCAwKTsKKwkJaWYgKCFiaCkKKwkJeworCQkJVURGX0lfTEVOQUxMT0MoaW5vZGUpID0gZXh0b2Zmc2V0IC0gdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKTsKKwkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQl9CisJCWVsc2UKKwkJeworCQkJc3RydWN0IGFsbG9jRXh0RGVzYyAqYWVkID0gKHN0cnVjdCBhbGxvY0V4dERlc2MgKikoYmgtPmJfZGF0YSk7CisJCQlhZWQtPmxlbmd0aEFsbG9jRGVzY3MgPSBjcHVfdG9fbGUzMihleHRvZmZzZXQgLSBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYykpOworCQkJaWYgKCFVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfU1RSSUNUKSB8fCBVREZfU0JfVURGUkVWKGlub2RlLT5pX3NiKSA+PSAweDAyMDEpCisJCQkJdWRmX3VwZGF0ZV90YWcoYmgtPmJfZGF0YSwgZXh0b2Zmc2V0KTsKKwkJCWVsc2UKKwkJCQl1ZGZfdXBkYXRlX3RhZyhiaC0+Yl9kYXRhLCBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYykpOworCQkJbWFya19idWZmZXJfZGlydHlfaW5vZGUoYmgsIGlub2RlKTsKKwkJfQorCX0KKwlVREZfSV9MRU5FWFRFTlRTKGlub2RlKSA9IGxiY291bnQ7CisKKwl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKK30KKwordm9pZCB1ZGZfdHJ1bmNhdGVfZXh0ZW50cyhzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlrZXJuZWxfbGJfYWRkciBibG9jLCBlbG9jLCBuZWxvYyA9IHsgMCwgMCB9OworCXVpbnQzMl90IGV4dG9mZnNldCwgZWxlbiwgb2Zmc2V0LCBuZWxlbiA9IDAsIGxlbGVuID0gMCwgbGVuYWxsb2M7CisJaW50OF90IGV0eXBlOworCWludCBmaXJzdF9ibG9jayA9IGlub2RlLT5pX3NpemUgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJaW50IGFkc2l6ZTsKKworCWlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX1NIT1JUKQorCQlhZHNpemUgPSBzaXplb2Yoc2hvcnRfYWQpOworCWVsc2UgaWYgKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfTE9ORykKKwkJYWRzaXplID0gc2l6ZW9mKGxvbmdfYWQpOworCWVsc2UKKwkJYWRzaXplID0gMDsKKworCWV0eXBlID0gaW5vZGVfYm1hcChpbm9kZSwgZmlyc3RfYmxvY2ssICZibG9jLCAmZXh0b2Zmc2V0LCAmZWxvYywgJmVsZW4sICZvZmZzZXQsICZiaCk7CisJb2Zmc2V0ICs9IChpbm9kZS0+aV9zaXplICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKTsKKwlpZiAoZXR5cGUgIT0gLTEpCisJeworCQlleHRvZmZzZXQgLT0gYWRzaXplOworCQlleHRlbnRfdHJ1bmMoaW5vZGUsIGJsb2MsIGV4dG9mZnNldCwgZWxvYywgZXR5cGUsIGVsZW4sIGJoLCBvZmZzZXQpOworCQlleHRvZmZzZXQgKz0gYWRzaXplOworCisJCWlmIChvZmZzZXQpCisJCQlsZW5hbGxvYyA9IGV4dG9mZnNldDsKKwkJZWxzZQorCQkJbGVuYWxsb2MgPSBleHRvZmZzZXQgLSBhZHNpemU7CisKKwkJaWYgKCFiaCkKKwkJCWxlbmFsbG9jIC09IHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChpbm9kZSk7CisJCWVsc2UKKwkJCWxlbmFsbG9jIC09IHNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKTsKKworCQl3aGlsZSAoKGV0eXBlID0gdWRmX2N1cnJlbnRfYWV4dChpbm9kZSwgJmJsb2MsICZleHRvZmZzZXQsICZlbG9jLCAmZWxlbiwgJmJoLCAwKSkgIT0gLTEpCisJCXsKKwkJCWlmIChldHlwZSA9PSAoRVhUX05FWFRfRVhURU5UX0FMTE9DREVDUyA+PiAzMCkpCisJCQl7CisJCQkJdWRmX3dyaXRlX2FleHQoaW5vZGUsIGJsb2MsICZleHRvZmZzZXQsIG5lbG9jLCBuZWxlbiwgYmgsIDApOworCQkJCWV4dG9mZnNldCA9IDA7CisJCQkJaWYgKGxlbGVuKQorCQkJCXsKKwkJCQkJaWYgKCFiaCkKKwkJCQkJCUJVRygpOworCQkJCQllbHNlCisJCQkJCQltZW1zZXQoYmgtPmJfZGF0YSwgMHgwMCwgc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpKTsKKwkJCQkJdWRmX2ZyZWVfYmxvY2tzKGlub2RlLT5pX3NiLCBpbm9kZSwgYmxvYywgMCwgbGVsZW4pOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpZiAoIWJoKQorCQkJCQl7CisJCQkJCQlVREZfSV9MRU5BTExPQyhpbm9kZSkgPSBsZW5hbGxvYzsKKwkJCQkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJc3RydWN0IGFsbG9jRXh0RGVzYyAqYWVkID0gKHN0cnVjdCBhbGxvY0V4dERlc2MgKikoYmgtPmJfZGF0YSk7CisJCQkJCQlhZWQtPmxlbmd0aEFsbG9jRGVzY3MgPSBjcHVfdG9fbGUzMihsZW5hbGxvYyk7CisJCQkJCQlpZiAoIVVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19TVFJJQ1QpIHx8IFVERl9TQl9VREZSRVYoaW5vZGUtPmlfc2IpID49IDB4MDIwMSkKKwkJCQkJCQl1ZGZfdXBkYXRlX3RhZyhiaC0+Yl9kYXRhLCBsZW5hbGxvYyArCisJCQkJCQkJCXNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKSk7CisJCQkJCQllbHNlCisJCQkJCQkJdWRmX3VwZGF0ZV90YWcoYmgtPmJfZGF0YSwgc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpKTsKKwkJCQkJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGJoLCBpbm9kZSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJCQlleHRvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYyk7CisJCQkJYmxvYyA9IGVsb2M7CisJCQkJYmggPSB1ZGZfdHJlYWQoaW5vZGUtPmlfc2IsIHVkZl9nZXRfbGJfcGJsb2NrKGlub2RlLT5pX3NiLCBibG9jLCAwKSk7CisJCQkJaWYgKGVsZW4pCisJCQkJCWxlbGVuID0gKGVsZW4gKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PgorCQkJCQkJaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCQkJZWxzZQorCQkJCQlsZWxlbiA9IDE7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZXh0ZW50X3RydW5jKGlub2RlLCBibG9jLCBleHRvZmZzZXQsIGVsb2MsIGV0eXBlLCBlbGVuLCBiaCwgMCk7CisJCQkJZXh0b2Zmc2V0ICs9IGFkc2l6ZTsKKwkJCX0KKwkJfQorCisJCWlmIChsZWxlbikKKwkJeworCQkJaWYgKCFiaCkKKwkJCQlCVUcoKTsKKwkJCWVsc2UKKwkJCQltZW1zZXQoYmgtPmJfZGF0YSwgMHgwMCwgc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpKTsKKwkJCXVkZl9mcmVlX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgaW5vZGUsIGJsb2MsIDAsIGxlbGVuKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICghYmgpCisJCQl7CisJCQkJVURGX0lfTEVOQUxMT0MoaW5vZGUpID0gbGVuYWxsb2M7CisJCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc3RydWN0IGFsbG9jRXh0RGVzYyAqYWVkID0gKHN0cnVjdCBhbGxvY0V4dERlc2MgKikoYmgtPmJfZGF0YSk7CisJCQkJYWVkLT5sZW5ndGhBbGxvY0Rlc2NzID0gY3B1X3RvX2xlMzIobGVuYWxsb2MpOworCQkJCWlmICghVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1NUUklDVCkgfHwgVURGX1NCX1VERlJFVihpbm9kZS0+aV9zYikgPj0gMHgwMjAxKQorCQkJCQl1ZGZfdXBkYXRlX3RhZyhiaC0+Yl9kYXRhLCBsZW5hbGxvYyArCisJCQkJCQlzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYykpOworCQkJCWVsc2UKKwkJCQkJdWRmX3VwZGF0ZV90YWcoYmgtPmJfZGF0YSwgc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpKTsKKwkJCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYgKGlub2RlLT5pX3NpemUpCisJeworCQlpZiAob2Zmc2V0KQorCQl7CisJCQlleHRvZmZzZXQgLT0gYWRzaXplOworCQkJZXR5cGUgPSB1ZGZfbmV4dF9hZXh0KGlub2RlLCAmYmxvYywgJmV4dG9mZnNldCwgJmVsb2MsICZlbGVuLCAmYmgsIDEpOworCQkJaWYgKGV0eXBlID09IChFWFRfTk9UX1JFQ09SREVEX05PVF9BTExPQ0FURUQgPj4gMzApKQorCQkJeworCQkJCWV4dG9mZnNldCAtPSBhZHNpemU7CisJCQkJZWxlbiA9IEVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRCB8IChlbGVuICsgb2Zmc2V0KTsKKwkJCQl1ZGZfd3JpdGVfYWV4dChpbm9kZSwgYmxvYywgJmV4dG9mZnNldCwgZWxvYywgZWxlbiwgYmgsIDApOworCQkJfQorCQkJZWxzZSBpZiAoZXR5cGUgPT0gKEVYVF9OT1RfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkKKwkJCXsKKwkJCQlrZXJuZWxfbGJfYWRkciBuZWxvYyA9IHsgMCwgMCB9OworCQkJCWV4dG9mZnNldCAtPSBhZHNpemU7CisJCQkJbmVsZW4gPSBFWFRfTk9UX1JFQ09SREVEX05PVF9BTExPQ0FURUQgfAorCQkJCQkoKGVsZW4gKyBvZmZzZXQgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSAmCisJCQkJCX4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpOworCQkJCXVkZl93cml0ZV9hZXh0KGlub2RlLCBibG9jLCAmZXh0b2Zmc2V0LCBuZWxvYywgbmVsZW4sIGJoLCAxKTsKKwkJCQl1ZGZfYWRkX2FleHQoaW5vZGUsICZibG9jLCAmZXh0b2Zmc2V0LCBlbG9jLCAoZXR5cGUgPDwgMzApIHwgZWxlbiwgJmJoLCAxKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoZWxlbiAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSkKKwkJCQl7CisJCQkJCWV4dG9mZnNldCAtPSBhZHNpemU7CisJCQkJCWVsZW4gPSBFWFRfUkVDT1JERURfQUxMT0NBVEVEIHwKKwkJCQkJCSgoZWxlbiArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpICYKKwkJCQkJCX4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpOworCQkJCQl1ZGZfd3JpdGVfYWV4dChpbm9kZSwgYmxvYywgJmV4dG9mZnNldCwgZWxvYywgZWxlbiwgYmgsIDEpOworCQkJCX0KKwkJCQltZW1zZXQoJmVsb2MsIDB4MDAsIHNpemVvZihrZXJuZWxfbGJfYWRkcikpOworCQkJCWVsZW4gPSBFWFRfTk9UX1JFQ09SREVEX05PVF9BTExPQ0FURUQgfCBvZmZzZXQ7CisJCQkJdWRmX2FkZF9hZXh0KGlub2RlLCAmYmxvYywgJmV4dG9mZnNldCwgZWxvYywgZWxlbiwgJmJoLCAxKTsKKwkJCX0KKwkJfQorCX0KKwlVREZfSV9MRU5FWFRFTlRTKGlub2RlKSA9IGlub2RlLT5pX3NpemU7CisKKwl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3VkZi91ZGZfaS5oIGIvZnMvdWRmL3VkZl9pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdkYmU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3VkZi91ZGZfaS5oCkBAIC0wLDAgKzEsMjYgQEAKKyNpZm5kZWYgX19MSU5VWF9VREZfSV9ICisjZGVmaW5lIF9fTElOVVhfVURGX0lfSAorCisjaW5jbHVkZSA8bGludXgvdWRmX2ZzX2kuaD4KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVkZl9pbm9kZV9pbmZvICpVREZfSShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBsaXN0X2VudHJ5KGlub2RlLCBzdHJ1Y3QgdWRmX2lub2RlX2luZm8sIHZmc19pbm9kZSk7Cit9CisKKyNkZWZpbmUgVURGX0lfTE9DQVRJT04oWCkJKCBVREZfSShYKS0+aV9sb2NhdGlvbiApCisjZGVmaW5lIFVERl9JX0xFTkVBVFRSKFgpCSggVURGX0koWCktPmlfbGVuRUF0dHIgKQorI2RlZmluZSBVREZfSV9MRU5BTExPQyhYKQkoIFVERl9JKFgpLT5pX2xlbkFsbG9jICkKKyNkZWZpbmUgVURGX0lfTEVORVhURU5UUyhYKQkoIFVERl9JKFgpLT5pX2xlbkV4dGVudHMgKQorI2RlZmluZSBVREZfSV9VTklRVUUoWCkJCSggVURGX0koWCktPmlfdW5pcXVlICkKKyNkZWZpbmUgVURGX0lfQUxMT0NUWVBFKFgpCSggVURGX0koWCktPmlfYWxsb2NfdHlwZSApCisjZGVmaW5lIFVERl9JX0VGRShYKQkJKCBVREZfSShYKS0+aV9lZmUgKQorI2RlZmluZSBVREZfSV9VU0UoWCkJCSggVURGX0koWCktPmlfdXNlICkKKyNkZWZpbmUgVURGX0lfU1RSQVQ0MDk2KFgpCSggVURGX0koWCktPmlfc3RyYXQ0MDk2ICkKKyNkZWZpbmUgVURGX0lfTkVYVF9BTExPQ19CTE9DSyhYKQkoIFVERl9JKFgpLT5pX25leHRfYWxsb2NfYmxvY2sgKQorI2RlZmluZSBVREZfSV9ORVhUX0FMTE9DX0dPQUwoWCkJKCBVREZfSShYKS0+aV9uZXh0X2FsbG9jX2dvYWwgKQorI2RlZmluZSBVREZfSV9DUlRJTUUoWCkJCSggVURGX0koWCktPmlfY3J0aW1lICkKKyNkZWZpbmUgVURGX0lfU0FEKFgpCQkoIFVERl9JKFgpLT5pX2V4dC5pX3NhZCApCisjZGVmaW5lIFVERl9JX0xBRChYKQkJKCBVREZfSShYKS0+aV9leHQuaV9sYWQgKQorI2RlZmluZSBVREZfSV9EQVRBKFgpCQkoIFVERl9JKFgpLT5pX2V4dC5pX2RhdGEgKQorCisjZW5kaWYgLyogIWRlZmluZWQoX0xJTlVYX1VERl9JX0gpICovCmRpZmYgLS1naXQgYS9mcy91ZGYvdWRmX3NiLmggYi9mcy91ZGYvdWRmX3NiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU1NDkyMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3VkZi91ZGZfc2IuaApAQCAtMCwwICsxLDEzOSBAQAorI2lmbmRlZiBfX0xJTlVYX1VERl9TQl9ICisjZGVmaW5lIF9fTElOVVhfVURGX1NCX0gKKworLyogU2luY2UgVURGIDIuMDEgaXMgSVNPIDEzMzQ2IGJhc2VkLi4uICovCisjZGVmaW5lIFVERl9TVVBFUl9NQUdJQwkJCTB4MTUwMTMzNDYKKworI2RlZmluZSBVREZfTUFYX1JFQURfVkVSU0lPTgkJMHgwMjAxCisjZGVmaW5lIFVERl9NQVhfV1JJVEVfVkVSU0lPTgkJMHgwMjAxCisKKyNkZWZpbmUgVURGX0ZMQUdfVVNFX0VYVEVOREVEX0ZFCTAKKyNkZWZpbmUgVURGX1ZFUlNfVVNFX0VYVEVOREVEX0ZFCTB4MDIwMAorI2RlZmluZSBVREZfRkxBR19VU0VfU1RSRUFNUwkJMQorI2RlZmluZSBVREZfVkVSU19VU0VfU1RSRUFNUwkJMHgwMjAwCisjZGVmaW5lIFVERl9GTEFHX1VTRV9TSE9SVF9BRAkJMgorI2RlZmluZSBVREZfRkxBR19VU0VfQURfSU5fSUNCCQkzCisjZGVmaW5lIFVERl9GTEFHX1VTRV9GSUxFX0NUSU1FX0VBCTQKKyNkZWZpbmUgVURGX0ZMQUdfU1RSSUNUCQkJNQorI2RlZmluZSBVREZfRkxBR19VTkRFTEVURQkJNgorI2RlZmluZSBVREZfRkxBR19VTkhJREUJCQk3CisjZGVmaW5lIFVERl9GTEFHX1ZBUkNPTlYJCTgKKyNkZWZpbmUgVURGX0ZMQUdfTkxTX01BUAkJOQorI2RlZmluZSBVREZfRkxBR19VVEY4CQkJMTAKKworI2RlZmluZSBVREZfUEFSVF9GTEFHX1VOQUxMT0NfQklUTUFQCTB4MDAwMQorI2RlZmluZSBVREZfUEFSVF9GTEFHX1VOQUxMT0NfVEFCTEUJMHgwMDAyCisjZGVmaW5lIFVERl9QQVJUX0ZMQUdfRlJFRURfQklUTUFQCTB4MDAwNAorI2RlZmluZSBVREZfUEFSVF9GTEFHX0ZSRUVEX1RBQkxFCTB4MDAwOAorI2RlZmluZSBVREZfUEFSVF9GTEFHX1JFQURfT05MWQkJMHgwMDEwCisjZGVmaW5lIFVERl9QQVJUX0ZMQUdfV1JJVEVfT05DRQkweDAwMjAKKyNkZWZpbmUgVURGX1BBUlRfRkxBR19SRVdSSVRBQkxFCTB4MDA0MAorI2RlZmluZSBVREZfUEFSVF9GTEFHX09WRVJXUklUQUJMRQkweDAwODAKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdWRmX3NiX2luZm8gKlVERl9TQihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiBzYi0+c19mc19pbmZvOworfQorCisjZGVmaW5lIFVERl9TQl9GUkVFKFgpXAore1wKKwlpZiAoVURGX1NCKFgpKVwKKwl7XAorCQlpZiAoVURGX1NCX1BBUlRNQVBTKFgpKVwKKwkJCWtmcmVlKFVERl9TQl9QQVJUTUFQUyhYKSk7XAorCQlVREZfU0JfUEFSVE1BUFMoWCkgPSBOVUxMO1wKKwl9XAorfQorCisjZGVmaW5lIFVERl9TQl9BTExPQ19QQVJUTUFQUyhYLFkpXAore1wKKwlVREZfU0JfUEFSVE1BUFMoWCkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdWRmX3BhcnRfbWFwKSAqIFksIEdGUF9LRVJORUwpO1wKKwlpZiAoVURGX1NCX1BBUlRNQVBTKFgpICE9IE5VTEwpXAorCXtcCisJCVVERl9TQl9OVU1QQVJUUyhYKSA9IFk7XAorCQltZW1zZXQoVURGX1NCX1BBUlRNQVBTKFgpLCAweDAwLCBzaXplb2Yoc3RydWN0IHVkZl9wYXJ0X21hcCkgKiBZKTtcCisJfVwKKwllbHNlXAorCXtcCisJCVVERl9TQl9OVU1QQVJUUyhYKSA9IDA7XAorCQl1ZGZfZXJyb3IoWCwgX19GVU5DVElPTl9fLCAiVW5hYmxlIHRvIGFsbG9jYXRlIHNwYWNlIGZvciAlZCBwYXJ0aXRpb24gbWFwcyIsIFkpO1wKKwl9XAorfQorCisjZGVmaW5lIFVERl9TQl9BTExPQ19CSVRNQVAoWCxZLFopXAore1wKKwlpbnQgbnJfZ3JvdXBzID0gKChVREZfU0JfUEFSVExFTigoWCksKFkpKSArIChzaXplb2Yoc3RydWN0IHNwYWNlQml0bWFwRGVzYykgPDwgMykgK1wKKwkJKChYKS0+c19ibG9ja3NpemUgKiA4KSAtIDEpIC8gKChYKS0+c19ibG9ja3NpemUgKiA4KSk7XAorCWludCBzaXplID0gc2l6ZW9mKHN0cnVjdCB1ZGZfYml0bWFwKSArIChzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopICogbnJfZ3JvdXBzKTtcCisJaWYgKHNpemUgPD0gUEFHRV9TSVpFKVwKKwkJVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uWi5zX2JpdG1hcCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7XAorCWVsc2VcCisJCVVERl9TQl9QQVJUTUFQUyhYKVsoWSldLlouc19iaXRtYXAgPSB2bWFsbG9jKHNpemUpO1wKKwlpZiAoVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uWi5zX2JpdG1hcCAhPSBOVUxMKVwKKwl7XAorCQltZW1zZXQoVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uWi5zX2JpdG1hcCwgMHgwMCwgc2l6ZSk7XAorCQlVREZfU0JfUEFSVE1BUFMoWClbKFkpXS5aLnNfYml0bWFwLT5zX2Jsb2NrX2JpdG1hcCA9XAorCQkJKHN0cnVjdCBidWZmZXJfaGVhZCAqKikoVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uWi5zX2JpdG1hcCArIDEpO1wKKwkJVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uWi5zX2JpdG1hcC0+c19ucl9ncm91cHMgPSBucl9ncm91cHM7XAorCX1cCisJZWxzZVwKKwl7XAorCQl1ZGZfZXJyb3IoWCwgX19GVU5DVElPTl9fLCAiVW5hYmxlIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBiaXRtYXAgYW5kICVkIGJ1ZmZlcl9oZWFkIHBvaW50ZXJzIiwgbnJfZ3JvdXBzKTtcCisJfVwKK30KKworI2RlZmluZSBVREZfU0JfRlJFRV9CSVRNQVAoWCxZLFopXAore1wKKwlpbnQgaTtcCisJaW50IG5yX2dyb3VwcyA9IFVERl9TQl9CSVRNQVBfTlJfR1JPVVBTKFgsWSxaKTtcCisJaW50IHNpemUgPSBzaXplb2Yoc3RydWN0IHVkZl9iaXRtYXApICsgKHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKikgKiBucl9ncm91cHMpO1wKKwlmb3IgKGk9MDsgaTxucl9ncm91cHM7IGkrKylcCisJe1wKKwkJaWYgKFVERl9TQl9CSVRNQVAoWCxZLFosaSkpXAorCQkJdWRmX3JlbGVhc2VfZGF0YShVREZfU0JfQklUTUFQKFgsWSxaLGkpKTtcCisJfVwKKwlpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpXAorCQlrZnJlZShVREZfU0JfUEFSVE1BUFMoWClbWV0uWi5zX2JpdG1hcCk7XAorCWVsc2VcCisJCXZmcmVlKFVERl9TQl9QQVJUTUFQUyhYKVtZXS5aLnNfYml0bWFwKTtcCit9CisKKyNkZWZpbmUgVURGX1FVRVJZX0ZMQUcoWCxZKQkJCSggVURGX1NCKFgpLT5zX2ZsYWdzICYgKCAxIDw8IChZKSApICkKKyNkZWZpbmUgVURGX1NFVF9GTEFHKFgsWSkJCQkoIFVERl9TQihYKS0+c19mbGFncyB8PSAoIDEgPDwgKFkpICkgKQorI2RlZmluZSBVREZfQ0xFQVJfRkxBRyhYLFkpCQkJKCBVREZfU0IoWCktPnNfZmxhZ3MgJj0gfiggMSA8PCAoWSkgKSApCisKKyNkZWZpbmUgVURGX1VQREFURV9VREZSRVYoWCxZKQkJCSggKChZKSA+IFVERl9TQl9VREZSRVYoWCkpID8gVURGX1NCX1VERlJFVihYKSA9IChZKSA6IFVERl9TQl9VREZSRVYoWCkgKQorCisjZGVmaW5lIFVERl9TQl9QQVJUTUFQUyhYKQkJCSggVURGX1NCKFgpLT5zX3BhcnRtYXBzICkKKyNkZWZpbmUgVURGX1NCX1BBUlRUWVBFKFgsWSkJCQkoIFVERl9TQl9QQVJUTUFQUyhYKVsoWSldLnNfcGFydGl0aW9uX3R5cGUgKQorI2RlZmluZSBVREZfU0JfUEFSVFJPT1QoWCxZKQkJCSggVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uc19wYXJ0aXRpb25fcm9vdCApCisjZGVmaW5lIFVERl9TQl9QQVJUTEVOKFgsWSkJCQkoIFVERl9TQl9QQVJUTUFQUyhYKVsoWSldLnNfcGFydGl0aW9uX2xlbiApCisjZGVmaW5lIFVERl9TQl9QQVJUVlNOKFgsWSkJCQkoIFVERl9TQl9QQVJUTUFQUyhYKVsoWSldLnNfdm9sdW1lc2VxbnVtICkKKyNkZWZpbmUgVURGX1NCX1BBUlROVU0oWCxZKQkJCSggVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uc19wYXJ0aXRpb25fbnVtICkKKyNkZWZpbmUgVURGX1NCX1RZUEVTUEFSKFgsWSkJCQkoIFVERl9TQl9QQVJUTUFQUyhYKVsoWSldLnNfdHlwZV9zcGVjaWZpYy5zX3NwYXJpbmcgKQorI2RlZmluZSBVREZfU0JfVFlQRVZJUlQoWCxZKQkJCSggVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uc190eXBlX3NwZWNpZmljLnNfdmlydHVhbCApCisjZGVmaW5lIFVERl9TQl9QQVJURlVOQyhYLFkpCQkJKCBVREZfU0JfUEFSVE1BUFMoWClbKFkpXS5zX3BhcnRpdGlvbl9mdW5jICkKKyNkZWZpbmUgVURGX1NCX1BBUlRGTEFHUyhYLFkpCQkJKCBVREZfU0JfUEFSVE1BUFMoWClbKFkpXS5zX3BhcnRpdGlvbl9mbGFncyApCisjZGVmaW5lIFVERl9TQl9CSVRNQVAoWCxZLFosSSkJCQkoIFVERl9TQl9QQVJUTUFQUyhYKVsoWSldLlouc19iaXRtYXAtPnNfYmxvY2tfYml0bWFwW0ldICkKKyNkZWZpbmUgVURGX1NCX0JJVE1BUF9OUl9HUk9VUFMoWCxZLFopCQkoIFVERl9TQl9QQVJUTUFQUyhYKVsoWSldLlouc19iaXRtYXAtPnNfbnJfZ3JvdXBzICkKKworI2RlZmluZSBVREZfU0JfVk9MSURFTlQoWCkJCQkoIFVERl9TQihYKS0+c192b2xpZGVudCApCisjZGVmaW5lIFVERl9TQl9OVU1QQVJUUyhYKQkJCSggVURGX1NCKFgpLT5zX3BhcnRpdGlvbnMgKQorI2RlZmluZSBVREZfU0JfUEFSVElUSU9OKFgpCQkJKCBVREZfU0IoWCktPnNfcGFydGl0aW9uICkKKyNkZWZpbmUgVURGX1NCX1NFU1NJT04oWCkJCQkoIFVERl9TQihYKS0+c19zZXNzaW9uICkKKyNkZWZpbmUgVURGX1NCX0FOQ0hPUihYKQkJCSggVURGX1NCKFgpLT5zX2FuY2hvciApCisjZGVmaW5lIFVERl9TQl9MQVNUQkxPQ0soWCkJCQkoIFVERl9TQihYKS0+c19sYXN0YmxvY2sgKQorI2RlZmluZSBVREZfU0JfTFZJREJIKFgpCQkJKCBVREZfU0IoWCktPnNfbHZpZGJoICkKKyNkZWZpbmUgVURGX1NCX0xWSUQoWCkJCQkJKCAoc3RydWN0IGxvZ2ljYWxWb2xJbnRlZ3JpdHlEZXNjICopVURGX1NCX0xWSURCSChYKS0+Yl9kYXRhICkKKyNkZWZpbmUgVURGX1NCX0xWSURJVShYKQkJCSggKHN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzY0ltcFVzZSAqKSYoVURGX1NCX0xWSUQoWCktPmltcFVzZVtsZTMyX3RvX2NwdShVREZfU0JfTFZJRChYKS0+bnVtT2ZQYXJ0aXRpb25zKSAqIDIgKiBzaXplb2YodWludDMyX3QpL3NpemVvZih1aW50OF90KV0pICkKKworI2RlZmluZSBVREZfU0JfVU1BU0soWCkJCQkJKCBVREZfU0IoWCktPnNfdW1hc2sgKQorI2RlZmluZSBVREZfU0JfR0lEKFgpCQkJCSggVURGX1NCKFgpLT5zX2dpZCApCisjZGVmaW5lIFVERl9TQl9VSUQoWCkJCQkJKCBVREZfU0IoWCktPnNfdWlkICkKKyNkZWZpbmUgVURGX1NCX1JFQ09SRFRJTUUoWCkJCQkoIFVERl9TQihYKS0+c19yZWNvcmR0aW1lICkKKyNkZWZpbmUgVURGX1NCX1NFUklBTE5VTShYKQkJCSggVURGX1NCKFgpLT5zX3NlcmlhbG51bSApCisjZGVmaW5lIFVERl9TQl9VREZSRVYoWCkJCQkoIFVERl9TQihYKS0+c191ZGZyZXYgKQorI2RlZmluZSBVREZfU0JfRkxBR1MoWCkJCQkJKCBVREZfU0IoWCktPnNfZmxhZ3MgKQorI2RlZmluZSBVREZfU0JfVkFUKFgpCQkJCSggVURGX1NCKFgpLT5zX3ZhdCApCisKKyNlbmRpZiAvKiBfX0xJTlVYX1VERl9TQl9IICovCmRpZmYgLS1naXQgYS9mcy91ZGYvdWRmZGVjbC5oIGIvZnMvdWRmL3VkZmRlY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDU4MDBlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvdWRmL3VkZmRlY2wuaApAQCAtMCwwICsxLDE2NyBAQAorI2lmbmRlZiBfX1VERl9ERUNMX0gKKyNkZWZpbmUgX19VREZfREVDTF9ICisKKyNpbmNsdWRlIDxsaW51eC91ZGZfZnMuaD4KKyNpbmNsdWRlICJlY21hXzE2Ny5oIgorI2luY2x1ZGUgIm9zdGFfdWRmLmgiCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdWRmX2ZzX2kuaD4KKyNpbmNsdWRlIDxsaW51eC91ZGZfZnNfc2IuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisjaW5jbHVkZSAidWRmZW5kLmgiCisKKyNkZWZpbmUgdWRmX2ZpeGVkX3RvX3ZhcmlhYmxlKHgpICggKCAoICh4KSA+PiA1ICkgKiAzOSApICsgKCAoeCkgJiAweDAwMDAwMDFGICkgKQorI2RlZmluZSB1ZGZfdmFyaWFibGVfdG9fZml4ZWQoeCkgKCAoICggKHgpIC8gMzkgKSA8PCA1ICkgKyAoICh4KSAlIDM5ICkgKQorCisjZGVmaW5lIFVERl9FWFRFTlRfTEVOR1RIX01BU0sJMHgzRkZGRkZGRgorI2RlZmluZSBVREZfRVhURU5UX0ZMQUdfTUFTSwkweEMwMDAwMDAwCisKKyNkZWZpbmUgVURGX05BTUVfUEFECQk0CisjZGVmaW5lIFVERl9OQU1FX0xFTgkJMjU2CisjZGVmaW5lIFVERl9QQVRIX0xFTgkJMTAyMworCisjZGVmaW5lIHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChpbm9kZSlcCisJKFVERl9JX1VTRShpbm9kZSkgP1wKKwkJc2l6ZW9mKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSkgOlwKKwkJKChVREZfSV9FRkUoaW5vZGUpID9cCisJCQlzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSA6XAorCQkJc2l6ZW9mKHN0cnVjdCBmaWxlRW50cnkpKSArIFVERl9JX0xFTkVBVFRSKGlub2RlKSkpCisKKyNkZWZpbmUgdWRmX2V4dDBfb2Zmc2V0KGlub2RlKVwKKwkoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IgP1wKKwkJdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKSA6IDApCisKKyNkZWZpbmUgdWRmX2dldF9sYl9wYmxvY2soc2IsbG9jLG9mZnNldCkgdWRmX2dldF9wYmxvY2soKHNiKSwgKGxvYykubG9naWNhbEJsb2NrTnVtLCAobG9jKS5wYXJ0aXRpb25SZWZlcmVuY2VOdW0sIChvZmZzZXQpKQorCitzdHJ1Y3QgZGVudHJ5Oworc3RydWN0IGlub2RlOworc3RydWN0IHRhc2tfc3RydWN0Oworc3RydWN0IGJ1ZmZlcl9oZWFkOworc3RydWN0IHN1cGVyX2Jsb2NrOworCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdWRmX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdWRmX2Rpcl9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHVkZl9maWxlX2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1ZGZfZmlsZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdWRmX2FvcHM7CitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB1ZGZfYWRpbmljYl9hb3BzOworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdWRmX3N5bWxpbmtfYW9wczsKKworc3RydWN0IHVkZl9maWxlaWRlbnRfYmgKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNiaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmViaDsKKwlpbnQgc29mZnNldDsKKwlpbnQgZW9mZnNldDsKK307CisKK3N0cnVjdCB1ZGZfdmRzX3JlY29yZAoreworCXVpbnQzMl90IGJsb2NrOworCXVpbnQzMl90IHZvbERlc2NTZXFOdW07Cit9OworCitzdHJ1Y3QgZ2VuZXJpY19kZXNjCit7CisJdGFnCQlkZXNjVGFnOworCV9fbGUzMgkJdm9sRGVzY1NlcU51bTsKK307CisKK3N0cnVjdCB1c3RyCit7CisJdWludDhfdCB1X2NtcElEOworCXVpbnQ4X3QgdV9uYW1lW1VERl9OQU1FX0xFTi0yXTsKKwl1aW50OF90IHVfbGVuOworfTsKKworLyogc3VwZXIuYyAqLworZXh0ZXJuIHZvaWQgdWRmX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKK2V4dGVybiB2b2lkIHVkZl93YXJuaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKKworLyogbmFtZWkuYyAqLworZXh0ZXJuIGludCB1ZGZfd3JpdGVfZmkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGVJZGVudERlc2MgKiwgc3RydWN0IGZpbGVJZGVudERlc2MgKiwgc3RydWN0IHVkZl9maWxlaWRlbnRfYmggKiwgdWludDhfdCAqLCB1aW50OF90ICopOworCisvKiBmaWxlLmMgKi8KK2V4dGVybiBpbnQgdWRmX2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworCisvKiBpbm9kZS5jICovCitleHRlcm4gc3RydWN0IGlub2RlICp1ZGZfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwga2VybmVsX2xiX2FkZHIpOworZXh0ZXJuIGludCB1ZGZfc3luY19pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gdm9pZCB1ZGZfZXhwYW5kX2ZpbGVfYWRpbmljYihzdHJ1Y3QgaW5vZGUgKiwgaW50LCBpbnQgKik7CitleHRlcm4gc3RydWN0IGJ1ZmZlcl9oZWFkICogdWRmX2V4cGFuZF9kaXJfYWRpbmljYihzdHJ1Y3QgaW5vZGUgKiwgaW50ICosIGludCAqKTsKK2V4dGVybiBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB1ZGZfYnJlYWQoc3RydWN0IGlub2RlICosIGludCwgaW50LCBpbnQgKik7CitleHRlcm4gdm9pZCB1ZGZfdHJ1bmNhdGUoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHZvaWQgdWRmX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHZvaWQgdWRmX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gdm9pZCB1ZGZfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOworZXh0ZXJuIGludCB1ZGZfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICosIGludCk7CitleHRlcm4gbG9uZyB1ZGZfYmxvY2tfbWFwKHN0cnVjdCBpbm9kZSAqLCBsb25nKTsKK2V4dGVybiBpbnQ4X3QgaW5vZGVfYm1hcChzdHJ1Y3QgaW5vZGUgKiwgaW50LCBrZXJuZWxfbGJfYWRkciAqLCB1aW50MzJfdCAqLCBrZXJuZWxfbGJfYWRkciAqLCB1aW50MzJfdCAqLCB1aW50MzJfdCAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiopOworZXh0ZXJuIGludDhfdCB1ZGZfYWRkX2FleHQoc3RydWN0IGlub2RlICosIGtlcm5lbF9sYl9hZGRyICosIGludCAqLCBrZXJuZWxfbGJfYWRkciwgdWludDMyX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqKiwgaW50KTsKK2V4dGVybiBpbnQ4X3QgdWRmX3dyaXRlX2FleHQoc3RydWN0IGlub2RlICosIGtlcm5lbF9sYl9hZGRyLCBpbnQgKiwga2VybmVsX2xiX2FkZHIsIHVpbnQzMl90LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50KTsKK2V4dGVybiBpbnQ4X3QgdWRmX2RlbGV0ZV9hZXh0KHN0cnVjdCBpbm9kZSAqLCBrZXJuZWxfbGJfYWRkciwgaW50LCBrZXJuZWxfbGJfYWRkciwgdWludDMyX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKK2V4dGVybiBpbnQ4X3QgdWRmX25leHRfYWV4dChzdHJ1Y3QgaW5vZGUgKiwga2VybmVsX2xiX2FkZHIgKiwgaW50ICosIGtlcm5lbF9sYl9hZGRyICosIHVpbnQzMl90ICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKiwgaW50KTsKK2V4dGVybiBpbnQ4X3QgdWRmX2N1cnJlbnRfYWV4dChzdHJ1Y3QgaW5vZGUgKiwga2VybmVsX2xiX2FkZHIgKiwgaW50ICosIGtlcm5lbF9sYl9hZGRyICosIHVpbnQzMl90ICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKiwgaW50KTsKKworLyogbWlzYy5jICovCitleHRlcm4gc3RydWN0IGJ1ZmZlcl9oZWFkICp1ZGZfdGdldGJsayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50KTsKK2V4dGVybiBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnVkZl90cmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50KTsKK2V4dGVybiBzdHJ1Y3QgZ2VuZXJpY0Zvcm1hdCAqdWRmX2FkZF9leHRlbmRlZGF0dHIoc3RydWN0IGlub2RlICosIHVpbnQzMl90LCB1aW50MzJfdCwgdWludDhfdCk7CitleHRlcm4gc3RydWN0IGdlbmVyaWNGb3JtYXQgKnVkZl9nZXRfZXh0ZW5kZWRhdHRyKHN0cnVjdCBpbm9kZSAqLCB1aW50MzJfdCwgdWludDhfdCk7CitleHRlcm4gc3RydWN0IGJ1ZmZlcl9oZWFkICp1ZGZfcmVhZF90YWdnZWQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVpbnQzMl90LCB1aW50MzJfdCwgdWludDE2X3QgKik7CitleHRlcm4gc3RydWN0IGJ1ZmZlcl9oZWFkICp1ZGZfcmVhZF9wdGFnZ2VkKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBrZXJuZWxfbGJfYWRkciwgdWludDMyX3QsIHVpbnQxNl90ICopOworZXh0ZXJuIHZvaWQgdWRmX3JlbGVhc2VfZGF0YShzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7CitleHRlcm4gdm9pZCB1ZGZfdXBkYXRlX3RhZyhjaGFyICosIGludCk7CitleHRlcm4gdm9pZCB1ZGZfbmV3X3RhZyhjaGFyICosIHVpbnQxNl90LCB1aW50MTZfdCwgdWludDE2X3QsIHVpbnQzMl90LCBpbnQpOworCisvKiBsb3dsZXZlbC5jICovCitleHRlcm4gdW5zaWduZWQgaW50IHVkZl9nZXRfbGFzdF9zZXNzaW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHVkZl9nZXRfbGFzdF9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CisKKy8qIHBhcnRpdGlvbi5jICovCitleHRlcm4gdWludDMyX3QgdWRmX2dldF9wYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICosIHVpbnQzMl90LCB1aW50MTZfdCwgdWludDMyX3QpOworZXh0ZXJuIHVpbnQzMl90IHVkZl9nZXRfcGJsb2NrX3ZpcnQxNShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdWludDMyX3QsIHVpbnQxNl90LCB1aW50MzJfdCk7CitleHRlcm4gdWludDMyX3QgdWRmX2dldF9wYmxvY2tfdmlydDIwKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1aW50MzJfdCwgdWludDE2X3QsIHVpbnQzMl90KTsKK2V4dGVybiB1aW50MzJfdCB1ZGZfZ2V0X3BibG9ja19zcGFyMTUoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVpbnQzMl90LCB1aW50MTZfdCwgdWludDMyX3QpOworZXh0ZXJuIGludCB1ZGZfcmVsb2NhdGVfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBsb25nLCBsb25nICopOworCisvKiB1bmljb2RlLmMgKi8KK2V4dGVybiBpbnQgdWRmX2dldF9maWxlbmFtZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdWludDhfdCAqLCB1aW50OF90ICosIGludCk7CitleHRlcm4gaW50IHVkZl9wdXRfZmlsZW5hbWUoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IHVpbnQ4X3QgKiwgdWludDhfdCAqLCBpbnQpOworZXh0ZXJuIGludCB1ZGZfYnVpbGRfdXN0cihzdHJ1Y3QgdXN0ciAqLCBkc3RyaW5nICosIGludCk7CitleHRlcm4gaW50IHVkZl9DUzB0b1VURjgoc3RydWN0IHVzdHIgKiwgc3RydWN0IHVzdHIgKik7CisKKy8qIGlhbGxvYy5jICovCitleHRlcm4gdm9pZCB1ZGZfZnJlZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gc3RydWN0IGlub2RlICogdWRmX25ld19pbm9kZSAoc3RydWN0IGlub2RlICosIGludCwgaW50ICopOworCisvKiB0cnVuY2F0ZS5jICovCitleHRlcm4gdm9pZCB1ZGZfZGlzY2FyZF9wcmVhbGxvYyhzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gdm9pZCB1ZGZfdHJ1bmNhdGVfZXh0ZW50cyhzdHJ1Y3QgaW5vZGUgKik7CisKKy8qIGJhbGxvYy5jICovCitleHRlcm4gdm9pZCB1ZGZfZnJlZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBpbm9kZSAqLCBrZXJuZWxfbGJfYWRkciwgdWludDMyX3QsIHVpbnQzMl90KTsKK2V4dGVybiBpbnQgdWRmX3ByZWFsbG9jX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGlub2RlICosIHVpbnQxNl90LCB1aW50MzJfdCwgdWludDMyX3QpOworZXh0ZXJuIGludCB1ZGZfbmV3X2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgaW5vZGUgKiwgdWludDE2X3QsIHVpbnQzMl90LCBpbnQgKik7CisKKy8qIGZzeW5jLmMgKi8KK2V4dGVybiBpbnQgdWRmX2ZzeW5jX2ZpbGUoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOworCisvKiBkaXJlY3RvcnkuYyAqLworZXh0ZXJuIHN0cnVjdCBmaWxlSWRlbnREZXNjICogdWRmX2ZpbGVpZGVudF9yZWFkKHN0cnVjdCBpbm9kZSAqLCBsb2ZmX3QgKiwgc3RydWN0IHVkZl9maWxlaWRlbnRfYmggKiwgc3RydWN0IGZpbGVJZGVudERlc2MgKiwga2VybmVsX2xiX2FkZHIgKiwgdWludDMyX3QgKiwga2VybmVsX2xiX2FkZHIgKiwgdWludDMyX3QgKiwgdWludDMyX3QgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqKTsKK2V4dGVybiBzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqIHVkZl9nZXRfZmlsZWlkZW50KHZvaWQgKiBidWZmZXIsIGludCBidWZzaXplLCBpbnQgKiBvZmZzZXQpOworZXh0ZXJuIGxvbmdfYWQgKiB1ZGZfZ2V0X2ZpbGVsb25nYWQodWludDhfdCAqLCBpbnQsIGludCAqLCBpbnQpOworZXh0ZXJuIHNob3J0X2FkICogdWRmX2dldF9maWxlc2hvcnRhZCh1aW50OF90ICosIGludCwgaW50ICosIGludCk7CisKKy8qIGNyYy5jICovCitleHRlcm4gdWludDE2X3QgdWRmX2NyYyh1aW50OF90ICosIHVpbnQzMl90LCB1aW50MTZfdCk7CisKKy8qIHVkZnRpbWUuYyAqLworZXh0ZXJuIHRpbWVfdCAqdWRmX3N0YW1wX3RvX3RpbWUodGltZV90ICosIGxvbmcgKiwga2VybmVsX3RpbWVzdGFtcCk7CitleHRlcm4ga2VybmVsX3RpbWVzdGFtcCAqdWRmX3RpbWVfdG9fc3RhbXAoa2VybmVsX3RpbWVzdGFtcCAqLCBzdHJ1Y3QgdGltZXNwZWMpOworCisjZW5kaWYgLyogX19VREZfREVDTF9IICovCmRpZmYgLS1naXQgYS9mcy91ZGYvdWRmZW5kLmggYi9mcy91ZGYvdWRmZW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdkMzc4OAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3VkZi91ZGZlbmQuaApAQCAtMCwwICsxLDgxIEBACisjaWZuZGVmIF9fVURGX0VORElBTl9ICisjZGVmaW5lIF9fVURGX0VORElBTl9ICisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKK3N0YXRpYyBpbmxpbmUga2VybmVsX2xiX2FkZHIgbGVsYl90b19jcHUobGJfYWRkciBpbikKK3sKKwlrZXJuZWxfbGJfYWRkciBvdXQ7CisJb3V0LmxvZ2ljYWxCbG9ja051bSA9IGxlMzJfdG9fY3B1KGluLmxvZ2ljYWxCbG9ja051bSk7CisJb3V0LnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IGxlMTZfdG9fY3B1KGluLnBhcnRpdGlvblJlZmVyZW5jZU51bSk7CisJcmV0dXJuIG91dDsKK30KKworc3RhdGljIGlubGluZSBsYl9hZGRyIGNwdV90b19sZWxiKGtlcm5lbF9sYl9hZGRyIGluKQoreworCWxiX2FkZHIgb3V0OworCW91dC5sb2dpY2FsQmxvY2tOdW0gPSBjcHVfdG9fbGUzMihpbi5sb2dpY2FsQmxvY2tOdW0pOworCW91dC5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSBjcHVfdG9fbGUxNihpbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0pOworCXJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUga2VybmVsX3RpbWVzdGFtcCBsZXRzX3RvX2NwdSh0aW1lc3RhbXAgaW4pCit7CisJa2VybmVsX3RpbWVzdGFtcCBvdXQ7CisJbWVtY3B5KCZvdXQsICZpbiwgc2l6ZW9mKHRpbWVzdGFtcCkpOworCW91dC50eXBlQW5kVGltZXpvbmUgPSBsZTE2X3RvX2NwdShpbi50eXBlQW5kVGltZXpvbmUpOworCW91dC55ZWFyID0gbGUxNl90b19jcHUoaW4ueWVhcik7CisJcmV0dXJuIG91dDsKK30KKworc3RhdGljIGlubGluZSBzaG9ydF9hZCBsZXNhX3RvX2NwdShzaG9ydF9hZCBpbikKK3sKKwlzaG9ydF9hZCBvdXQ7CisJb3V0LmV4dExlbmd0aCA9IGxlMzJfdG9fY3B1KGluLmV4dExlbmd0aCk7CisJb3V0LmV4dFBvc2l0aW9uID0gbGUzMl90b19jcHUoaW4uZXh0UG9zaXRpb24pOworCXJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2hvcnRfYWQgY3B1X3RvX2xlc2Eoc2hvcnRfYWQgaW4pCit7CisJc2hvcnRfYWQgb3V0OworCW91dC5leHRMZW5ndGggPSBjcHVfdG9fbGUzMihpbi5leHRMZW5ndGgpOworCW91dC5leHRQb3NpdGlvbiA9IGNwdV90b19sZTMyKGluLmV4dFBvc2l0aW9uKTsKKwlyZXR1cm4gb3V0OworfQorCitzdGF0aWMgaW5saW5lIGtlcm5lbF9sb25nX2FkIGxlbGFfdG9fY3B1KGxvbmdfYWQgaW4pCit7CisJa2VybmVsX2xvbmdfYWQgb3V0OworCW91dC5leHRMZW5ndGggPSBsZTMyX3RvX2NwdShpbi5leHRMZW5ndGgpOworCW91dC5leHRMb2NhdGlvbiA9IGxlbGJfdG9fY3B1KGluLmV4dExvY2F0aW9uKTsKKwlyZXR1cm4gb3V0OworfQorCitzdGF0aWMgaW5saW5lIGxvbmdfYWQgY3B1X3RvX2xlbGEoa2VybmVsX2xvbmdfYWQgaW4pCit7CisJbG9uZ19hZCBvdXQ7CisJb3V0LmV4dExlbmd0aCA9IGNwdV90b19sZTMyKGluLmV4dExlbmd0aCk7CisJb3V0LmV4dExvY2F0aW9uID0gY3B1X3RvX2xlbGIoaW4uZXh0TG9jYXRpb24pOworCXJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUga2VybmVsX2V4dGVudF9hZCBsZWVhX3RvX2NwdShleHRlbnRfYWQgaW4pCit7CisJa2VybmVsX2V4dGVudF9hZCBvdXQ7CisJb3V0LmV4dExlbmd0aCA9IGxlMzJfdG9fY3B1KGluLmV4dExlbmd0aCk7CisJb3V0LmV4dExvY2F0aW9uID0gbGUzMl90b19jcHUoaW4uZXh0TG9jYXRpb24pOworCXJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdGltZXN0YW1wIGNwdV90b19sZXRzKGtlcm5lbF90aW1lc3RhbXAgaW4pCit7CisJdGltZXN0YW1wIG91dDsKKwltZW1jcHkoJm91dCwgJmluLCBzaXplb2YodGltZXN0YW1wKSk7CisJb3V0LnR5cGVBbmRUaW1lem9uZSA9IGNwdV90b19sZTE2KGluLnR5cGVBbmRUaW1lem9uZSk7CisJb3V0LnllYXIgPSBjcHVfdG9fbGUxNihpbi55ZWFyKTsKKwlyZXR1cm4gb3V0OworfQorCisjZW5kaWYgLyogX19VREZfRU5ESUFOX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL3VkZi91ZGZ0aW1lLmMgYi9mcy91ZGYvdWRmdGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNjM0YmQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZGYvdWRmdGltZS5jCkBAIC0wLDAgKzEsMTc0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IFBhdWwgRWdnZXJ0IChlZ2dlcnRAdHdpbnN1bi5jb20pLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKyAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKKyAqIGRnYiAxMC8wMi85ODogcmlwcGVkIHRoaXMgZnJvbSBnbGliYyBzb3VyY2UgdG8gaGVscCBjb252ZXJ0IHRpbWVzdGFtcHMgdG8gdW5peCB0aW1lIAorICogICAgIDEwLzA0Lzk4OiBhZGRlZCBuZXcgdGFibGUtYmFzZWQgbG9va3VwIGFmdGVyIHNlZWluZyBob3cgdWdseSB0aGUgZ251IGNvZGUgaXMKKyAqIGJsZiAwOS8yNy85OTogcmlwcGVkIG91dCBhbGwgdGhlIG9sZCBjb2RlIGFuZCBpbnNlcnRlZCBuZXcgdGFibGUgZnJvbQorICoJCQkJCUpvaG4gQnJvY2ttZXllciAod2l0aG91dCBsZWFwIHNlY29uZCBjb3JyZWN0aW9ucykKKyAqCQkJCSByZXdyb3RlIHVkZl9zdGFtcF90b190aW1lIGFuZCBmaXhlZCB0aW1lem9uZSBhY2NvdW50aW5nIGluCisJCQkJCXVkZl90aW1lX3RvX3N0YW1wLgorICovCisKKy8qCisgKiBXZSBkb24ndCB0YWtlIGludG8gYWNjb3VudCBsZWFwIHNlY29uZHMuIFRoaXMgbWF5IGJlIGNvcnJlY3Qgb3IgaW5jb3JyZWN0LgorICogRm9yIG1vcmUgTklTVCBpbmZvcm1hdGlvbiAoZXNwZWNpYWxseSBkZWFsaW5nIHdpdGggbGVhcCBzZWNvbmRzKSwgc2VlOgorICogIGh0dHA6Ly93d3cuYm91bGRlci5uaXN0Lmdvdi90aW1lZnJlcS9wdWJzL2J1bGxldGluL2xlYXBzZWNvbmQuaHRtCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSAidWRmZGVjbC5oIgorCisjZGVmaW5lIEVQT0NIX1lFQVIgMTk3MAorCisjaWZuZGVmIF9faXNsZWFwCisvKiBOb256ZXJvIGlmIFlFQVIgaXMgYSBsZWFwIHllYXIgKGV2ZXJ5IDQgeWVhcnMsCisgICBleGNlcHQgZXZlcnkgMTAwdGggaXNuJ3QsIGFuZCBldmVyeSA0MDB0aCBpcykuICAqLworI2RlZmluZQlfX2lzbGVhcCh5ZWFyKQlcCisgICgoeWVhcikgJSA0ID09IDAgJiYgKCh5ZWFyKSAlIDEwMCAhPSAwIHx8ICh5ZWFyKSAlIDQwMCA9PSAwKSkKKyNlbmRpZgorCisvKiBIb3cgbWFueSBkYXlzIGNvbWUgYmVmb3JlIGVhY2ggbW9udGggKDAtMTIpLiAgKi8KK2NvbnN0IHVuc2lnbmVkIHNob3J0IGludCBfX21vbl95ZGF5WzJdWzEzXSA9Cit7CisJLyogTm9ybWFsIHllYXJzLiAgKi8KKwl7IDAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0LCAzNjUgfSwKKwkvKiBMZWFwIHllYXJzLiAgKi8KKwl7IDAsIDMxLCA2MCwgOTEsIDEyMSwgMTUyLCAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1LCAzNjYgfQorfTsKKworI2RlZmluZSBNQVhfWUVBUl9TRUNPTkRTCTY5CisjZGVmaW5lIFNQRCAweDE1MTgwIC8qMzYwMCoyNCovCisjZGVmaW5lIFNQWSh5LGwscykgKFNQRCAqICgzNjUqeStsKStzKQorCitzdGF0aWMgdGltZV90IHllYXJfc2Vjb25kc1tNQVhfWUVBUl9TRUNPTkRTXT0geworLyoxOTcwKi8gU1BZKCAwLCAwLDApLCBTUFkoIDEsIDAsMCksIFNQWSggMiwgMCwwKSwgU1BZKCAzLCAxLDApLCAKKy8qMTk3NCovIFNQWSggNCwgMSwwKSwgU1BZKCA1LCAxLDApLCBTUFkoIDYsIDEsMCksIFNQWSggNywgMiwwKSwgCisvKjE5NzgqLyBTUFkoIDgsIDIsMCksIFNQWSggOSwgMiwwKSwgU1BZKDEwLCAyLDApLCBTUFkoMTEsIDMsMCksIAorLyoxOTgyKi8gU1BZKDEyLCAzLDApLCBTUFkoMTMsIDMsMCksIFNQWSgxNCwgMywwKSwgU1BZKDE1LCA0LDApLCAKKy8qMTk4NiovIFNQWSgxNiwgNCwwKSwgU1BZKDE3LCA0LDApLCBTUFkoMTgsIDQsMCksIFNQWSgxOSwgNSwwKSwgCisvKjE5OTAqLyBTUFkoMjAsIDUsMCksIFNQWSgyMSwgNSwwKSwgU1BZKDIyLCA1LDApLCBTUFkoMjMsIDYsMCksIAorLyoxOTk0Ki8gU1BZKDI0LCA2LDApLCBTUFkoMjUsIDYsMCksIFNQWSgyNiwgNiwwKSwgU1BZKDI3LCA3LDApLCAKKy8qMTk5OCovIFNQWSgyOCwgNywwKSwgU1BZKDI5LCA3LDApLCBTUFkoMzAsIDcsMCksIFNQWSgzMSwgOCwwKSwgCisvKjIwMDIqLyBTUFkoMzIsIDgsMCksIFNQWSgzMywgOCwwKSwgU1BZKDM0LCA4LDApLCBTUFkoMzUsIDksMCksIAorLyoyMDA2Ki8gU1BZKDM2LCA5LDApLCBTUFkoMzcsIDksMCksIFNQWSgzOCwgOSwwKSwgU1BZKDM5LDEwLDApLCAKKy8qMjAxMCovIFNQWSg0MCwxMCwwKSwgU1BZKDQxLDEwLDApLCBTUFkoNDIsMTAsMCksIFNQWSg0MywxMSwwKSwgCisvKjIwMTQqLyBTUFkoNDQsMTEsMCksIFNQWSg0NSwxMSwwKSwgU1BZKDQ2LDExLDApLCBTUFkoNDcsMTIsMCksIAorLyoyMDE4Ki8gU1BZKDQ4LDEyLDApLCBTUFkoNDksMTIsMCksIFNQWSg1MCwxMiwwKSwgU1BZKDUxLDEzLDApLCAKKy8qMjAyMiovIFNQWSg1MiwxMywwKSwgU1BZKDUzLDEzLDApLCBTUFkoNTQsMTMsMCksIFNQWSg1NSwxNCwwKSwgCisvKjIwMjYqLyBTUFkoNTYsMTQsMCksIFNQWSg1NywxNCwwKSwgU1BZKDU4LDE0LDApLCBTUFkoNTksMTUsMCksIAorLyoyMDMwKi8gU1BZKDYwLDE1LDApLCBTUFkoNjEsMTUsMCksIFNQWSg2MiwxNSwwKSwgU1BZKDYzLDE2LDApLCAKKy8qMjAzNCovIFNQWSg2NCwxNiwwKSwgU1BZKDY1LDE2LDApLCBTUFkoNjYsMTYsMCksIFNQWSg2NywxNywwKSwgCisvKjIwMzgqLyBTUFkoNjgsMTcsMCkKK307CisKK2V4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OworCisjZGVmaW5lIFNFQ1NfUEVSX0hPVVIJKDYwICogNjApCisjZGVmaW5lIFNFQ1NfUEVSX0RBWQkoU0VDU19QRVJfSE9VUiAqIDI0KQorCit0aW1lX3QgKgordWRmX3N0YW1wX3RvX3RpbWUodGltZV90ICpkZXN0LCBsb25nICpkZXN0X3VzZWMsIGtlcm5lbF90aW1lc3RhbXAgc3JjKQoreworCWludCB5ZGF5OworCXVpbnQ4X3QgdHlwZSA9IHNyYy50eXBlQW5kVGltZXpvbmUgPj4gMTI7CisJaW50MTZfdCBvZmZzZXQ7CisKKwlpZiAodHlwZSA9PSAxKQorCXsKKwkJb2Zmc2V0ID0gc3JjLnR5cGVBbmRUaW1lem9uZSA8PCA0OworCQkvKiBzaWduIGV4dGVudCBvZmZzZXQgKi8KKwkJb2Zmc2V0ID0gKG9mZnNldCA+PiA0KTsKKwkJaWYgKG9mZnNldCA9PSAtMjA0NykgLyogdW5zcGVjaWZpZWQgb2Zmc2V0ICovCisJCQlvZmZzZXQgPSAwOworCX0KKwllbHNlCisJCW9mZnNldCA9IDA7CisKKwlpZiAoKHNyYy55ZWFyIDwgRVBPQ0hfWUVBUikgfHwKKwkJKHNyYy55ZWFyID4gRVBPQ0hfWUVBUitNQVhfWUVBUl9TRUNPTkRTKSkKKwl7CisJCSpkZXN0ID0gLTE7CisJCSpkZXN0X3VzZWMgPSAtMTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCSpkZXN0ID0geWVhcl9zZWNvbmRzW3NyYy55ZWFyIC0gRVBPQ0hfWUVBUl07CisJKmRlc3QgLT0gb2Zmc2V0ICogNjA7CisKKwl5ZGF5ID0gKChfX21vbl95ZGF5W19faXNsZWFwIChzcmMueWVhcildCisJCVtzcmMubW9udGgtMV0pICsgKHNyYy5kYXktMSkpOworCSpkZXN0ICs9ICggKCAoeWRheSogMjQpICsgc3JjLmhvdXIgKSAqIDYwICsgc3JjLm1pbnV0ZSApICogNjAgKyBzcmMuc2Vjb25kOworCSpkZXN0X3VzZWMgPSBzcmMuY2VudGlzZWNvbmRzICogMTAwMDAgKyBzcmMuaHVuZHJlZHNPZk1pY3Jvc2Vjb25kcyAqIDEwMCArIHNyYy5taWNyb3NlY29uZHM7CisJcmV0dXJuIGRlc3Q7Cit9CisKKwora2VybmVsX3RpbWVzdGFtcCAqCit1ZGZfdGltZV90b19zdGFtcChrZXJuZWxfdGltZXN0YW1wICpkZXN0LCBzdHJ1Y3QgdGltZXNwZWMgdHMpCit7CisJbG9uZyBpbnQgZGF5cywgcmVtLCB5OworCWNvbnN0IHVuc2lnbmVkIHNob3J0IGludCAqaXA7CisJaW50MTZfdCBvZmZzZXQ7CisKKwlvZmZzZXQgPSAtc3lzX3R6LnR6X21pbnV0ZXN3ZXN0OworCisJaWYgKCFkZXN0KQorCQlyZXR1cm4gTlVMTDsKKworCWRlc3QtPnR5cGVBbmRUaW1lem9uZSA9IDB4MTAwMCB8IChvZmZzZXQgJiAweDBGRkYpOworCisJdHMudHZfc2VjICs9IG9mZnNldCAqIDYwOworCWRheXMgPSB0cy50dl9zZWMgLyBTRUNTX1BFUl9EQVk7CisJcmVtID0gdHMudHZfc2VjICUgU0VDU19QRVJfREFZOworCWRlc3QtPmhvdXIgPSByZW0gLyBTRUNTX1BFUl9IT1VSOworCXJlbSAlPSBTRUNTX1BFUl9IT1VSOworCWRlc3QtPm1pbnV0ZSA9IHJlbSAvIDYwOworCWRlc3QtPnNlY29uZCA9IHJlbSAlIDYwOworCXkgPSAxOTcwOworCisjZGVmaW5lIERJVihhLGIpICgoYSkgLyAoYikgLSAoKGEpICUgKGIpIDwgMCkpCisjZGVmaW5lIExFQVBTX1RIUlVfRU5EX09GKHkpIChESVYgKHksIDQpIC0gRElWICh5LCAxMDApICsgRElWICh5LCA0MDApKQorCisJd2hpbGUgKGRheXMgPCAwIHx8IGRheXMgPj0gKF9faXNsZWFwKHkpID8gMzY2IDogMzY1KSkKKwl7CisJCWxvbmcgaW50IHlnID0geSArIGRheXMgLyAzNjUgLSAoZGF5cyAlIDM2NSA8IDApOworCisJCS8qIEFkanVzdCBEQVlTIGFuZCBZIHRvIG1hdGNoIHRoZSBndWVzc2VkIHllYXIuICAqLworCQlkYXlzIC09ICgoeWcgLSB5KSAqIDM2NQorCQkJKyBMRUFQU19USFJVX0VORF9PRiAoeWcgLSAxKQorCQkJLSBMRUFQU19USFJVX0VORF9PRiAoeSAtIDEpKTsKKwkJeSA9IHlnOworCX0KKwlkZXN0LT55ZWFyID0geTsKKwlpcCA9IF9fbW9uX3lkYXlbX19pc2xlYXAoeSldOworCWZvciAoeSA9IDExOyBkYXlzIDwgKGxvbmcgaW50KSBpcFt5XTsgLS15KQorCQljb250aW51ZTsKKwlkYXlzIC09IGlwW3ldOworCWRlc3QtPm1vbnRoID0geSArIDE7CisJZGVzdC0+ZGF5ID0gZGF5cyArIDE7CisKKwlkZXN0LT5jZW50aXNlY29uZHMgPSB0cy50dl9uc2VjIC8gMTAwMDAwMDA7CisJZGVzdC0+aHVuZHJlZHNPZk1pY3Jvc2Vjb25kcyA9ICh0cy50dl9uc2VjIC8gMTAwMCAtIGRlc3QtPmNlbnRpc2Vjb25kcyAqIDEwMDAwKSAvIDEwMDsKKwlkZXN0LT5taWNyb3NlY29uZHMgPSAodHMudHZfbnNlYyAvIDEwMDAgLSBkZXN0LT5jZW50aXNlY29uZHMgKiAxMDAwMCAtCisJCWRlc3QtPmh1bmRyZWRzT2ZNaWNyb3NlY29uZHMgKiAxMDApOworCXJldHVybiBkZXN0OworfQorCisvKiBFT0YgKi8KZGlmZiAtLWdpdCBhL2ZzL3VkZi91bmljb2RlLmMgYi9mcy91ZGYvdW5pY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhODBlZmQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZGYvdW5pY29kZS5jCkBAIC0wLDAgKzEsNTE2IEBACisvKgorICogdW5pY29kZS5jCisgKgorICogUFVSUE9TRQorICoJUm91dGluZXMgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBVVEYtOCBhbmQgT1NUQSBDb21wcmVzc2VkIFVuaWNvZGUuCisgKiAgICAgIEFsc28gaGFuZGxlcyBmaWxlbmFtZSBtYW5nbGluZworICoKKyAqIERFU0NSSVBUSU9OCisgKglPU1RBIENvbXByZXNzZWQgVW5pY29kZSBpcyBleHBsYWluZWQgaW4gdGhlIE9TVEEgVURGIHNwZWNpZmljYXRpb24uCisgKgkJaHR0cDovL3d3dy5vc3RhLm9yZy8KKyAqCVVURi04IGlzIGV4cGxhaW5lZCBpbiB0aGUgSUVURiBSRkMgWFhYWC4KKyAqCQlmdHA6Ly9mdHAuaW50ZXJuaWMubmV0L3JmYy9yZmN4eHh4LnR4dAorICoKKyAqIENPTlRBQ1RTCisgKglFLW1haWwgcmVnYXJkaW5nIGFueSBwb3J0aW9uIG9mIHRoZSBMaW51eCBVREYgZmlsZSBzeXN0ZW0gc2hvdWxkIGJlCisgKglkaXJlY3RlZCB0byB0aGUgZGV2ZWxvcG1lbnQgdGVhbSdzIG1haWxpbmcgbGlzdCAocnVuIGJ5IG1ham9yZG9tbyk6CisgKgkJbGludXhfdWRmQGhwZXNqcm8uZmMuaHAuY29tCisgKgorICogQ09QWVJJR0hUCisgKglUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgKEdQTCkuIENvcGllcyBvZiB0aGUgR1BMIGNhbiBiZSBvYnRhaW5lZCBmcm9tOgorICoJCWZ0cDovL3ByZXAuYWkubWl0LmVkdS9wdWIvZ251L0dQTAorICoJRWFjaCBjb250cmlidXRpbmcgYXV0aG9yIHJldGFpbnMgYWxsIHJpZ2h0cyB0byB0aGVpciBvd24gd29yay4KKyAqLworCisjaW5jbHVkZSAidWRmZGVjbC5oIgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CS8qIGZvciBtZW1zZXQgKi8KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC91ZGZfZnMuaD4KKworI2luY2x1ZGUgInVkZl9zYi5oIgorCitzdGF0aWMgaW50IHVkZl90cmFuc2xhdGVfdG9fbGludXgodWludDhfdCAqLCB1aW50OF90ICosIGludCwgdWludDhfdCAqLCBpbnQpOworCitzdGF0aWMgaW50IHVkZl9jaGFyX3RvX3VzdHIoc3RydWN0IHVzdHIgKmRlc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHN0cmxlbikKK3sKKwlpZiAoICghZGVzdCkgfHwgKCFzcmMpIHx8ICghc3RybGVuKSB8fCAoc3RybGVuID4gVURGX05BTUVfTEVOLTIpICkKKwkJcmV0dXJuIDA7CisJbWVtc2V0KGRlc3QsIDAsIHNpemVvZihzdHJ1Y3QgdXN0cikpOworCW1lbWNweShkZXN0LT51X25hbWUsIHNyYywgc3RybGVuKTsKKwlkZXN0LT51X2NtcElEID0gMHgwODsKKwlkZXN0LT51X2xlbiA9IHN0cmxlbjsKKwlyZXR1cm4gc3RybGVuOworfQorCisvKgorICogdWRmX2J1aWxkX3VzdHIKKyAqLworaW50IHVkZl9idWlsZF91c3RyKHN0cnVjdCB1c3RyICpkZXN0LCBkc3RyaW5nICpwdHIsIGludCBzaXplKQoreworCWludCB1c2VzaXplOworCisJaWYgKCAoIWRlc3QpIHx8ICghcHRyKSB8fCAoIXNpemUpICkKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KGRlc3QsIDAsIHNpemVvZihzdHJ1Y3QgdXN0cikpOworCXVzZXNpemU9IChzaXplID4gVURGX05BTUVfTEVOKSA/IFVERl9OQU1FX0xFTiA6IHNpemU7CisJZGVzdC0+dV9jbXBJRD1wdHJbMF07CisJZGVzdC0+dV9sZW49cHRyW3NpemUtMV07CisJbWVtY3B5KGRlc3QtPnVfbmFtZSwgcHRyKzEsIHVzZXNpemUtMSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB1ZGZfYnVpbGRfdXN0cl9leGFjdAorICovCitzdGF0aWMgaW50IHVkZl9idWlsZF91c3RyX2V4YWN0KHN0cnVjdCB1c3RyICpkZXN0LCBkc3RyaW5nICpwdHIsIGludCBleGFjdHNpemUpCit7CisJaWYgKCAoIWRlc3QpIHx8ICghcHRyKSB8fCAoIWV4YWN0c2l6ZSkgKQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQoZGVzdCwgMCwgc2l6ZW9mKHN0cnVjdCB1c3RyKSk7CisJZGVzdC0+dV9jbXBJRD1wdHJbMF07CisJZGVzdC0+dV9sZW49ZXhhY3RzaXplLTE7CisJbWVtY3B5KGRlc3QtPnVfbmFtZSwgcHRyKzEsIGV4YWN0c2l6ZS0xKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHVkZl9vY3VfdG9fdXRmOAorICoKKyAqIFBVUlBPU0UKKyAqCUNvbnZlcnQgT1NUQSBDb21wcmVzc2VkIFVuaWNvZGUgdG8gdGhlIFVURi04IGVxdWl2YWxlbnQuCisgKgorICogREVTQ1JJUFRJT04KKyAqCVRoaXMgcm91dGluZSBpcyBvbmx5IGNhbGxlZCBieSB1ZGZfZmlsbGRpcigpLgorICoKKyAqIFBSRS1DT05ESVRJT05TCisgKgl1dGYJCQlQb2ludGVyIHRvIFVURi04IG91dHB1dCBidWZmZXIuCisgKglvY3UJCQlQb2ludGVyIHRvIE9TVEEgQ29tcHJlc3NlZCBVbmljb2RlIGlucHV0IGJ1ZmZlcgorICoJCQkJb2Ygc2l6ZSBVREZfTkFNRV9MRU4gYnl0ZXMuCisgKiAJCQkJYm90aCBvZiB0eXBlICJzdHJ1Y3QgdXN0ciAqIgorICoKKyAqIFBPU1QtQ09ORElUSU9OUworICoJPHJldHVybj4JCVplcm8gb24gc3VjY2Vzcy4KKyAqCisgKiBISVNUT1JZCisgKglOb3ZlbWJlciAxMiwgMTk5NyAtIEFuZHJldyBFLiBNaWxlc2tpCisgKglXcml0dGVuLCB0ZXN0ZWQsIGFuZCByZWxlYXNlZC4KKyAqLworaW50IHVkZl9DUzB0b1VURjgoc3RydWN0IHVzdHIgKnV0Zl9vLCBzdHJ1Y3QgdXN0ciAqb2N1X2kpCit7CisJdWludDhfdCAqb2N1OworCXVpbnQzMl90IGM7CisJdWludDhfdCBjbXBfaWQsIG9jdV9sZW47CisJaW50IGk7CisKKwlvY3UgPSBvY3VfaS0+dV9uYW1lOworCisJb2N1X2xlbiA9IG9jdV9pLT51X2xlbjsKKwljbXBfaWQgPSBvY3VfaS0+dV9jbXBJRDsKKwl1dGZfby0+dV9sZW4gPSAwOworCisJaWYgKG9jdV9sZW4gPT0gMCkKKwl7CisJCW1lbXNldCh1dGZfbywgMCwgc2l6ZW9mKHN0cnVjdCB1c3RyKSk7CisJCXV0Zl9vLT51X2NtcElEID0gMDsKKwkJdXRmX28tPnVfbGVuID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChjbXBfaWQgIT0gOCkgJiYgKGNtcF9pZCAhPSAxNikpCisJeworCQlwcmludGsoS0VSTl9FUlIgInVkZjogdW5rbm93biBjb21wcmVzc2lvbiBjb2RlICglZCkgc3RyaT0lc1xuIiwgY21wX2lkLCBvY3VfaS0+dV9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgKGkgPCBvY3VfbGVuKSAmJiAodXRmX28tPnVfbGVuIDw9IChVREZfTkFNRV9MRU4tMykpIDspCisJeworCisJCS8qIEV4cGFuZCBPU1RBIGNvbXByZXNzZWQgVW5pY29kZSB0byBVbmljb2RlICovCisJCWMgPSBvY3VbaSsrXTsKKwkJaWYgKGNtcF9pZCA9PSAxNikKKwkJCWMgPSAoYyA8PCA4KSB8IG9jdVtpKytdOworCisJCS8qIENvbXByZXNzIFVuaWNvZGUgdG8gVVRGLTggKi8KKwkJaWYgKGMgPCAweDgwVSkKKwkJCXV0Zl9vLT51X25hbWVbdXRmX28tPnVfbGVuKytdID0gKHVpbnQ4X3QpYzsKKwkJZWxzZSBpZiAoYyA8IDB4ODAwVSkKKwkJeworCQkJdXRmX28tPnVfbmFtZVt1dGZfby0+dV9sZW4rK10gPSAodWludDhfdCkoMHhjMCB8IChjID4+IDYpKTsKKwkJCXV0Zl9vLT51X25hbWVbdXRmX28tPnVfbGVuKytdID0gKHVpbnQ4X3QpKDB4ODAgfCAoYyAmIDB4M2YpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXV0Zl9vLT51X25hbWVbdXRmX28tPnVfbGVuKytdID0gKHVpbnQ4X3QpKDB4ZTAgfCAoYyA+PiAxMikpOworCQkJdXRmX28tPnVfbmFtZVt1dGZfby0+dV9sZW4rK10gPSAodWludDhfdCkoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M2YpKTsKKwkJCXV0Zl9vLT51X25hbWVbdXRmX28tPnVfbGVuKytdID0gKHVpbnQ4X3QpKDB4ODAgfCAoYyAmIDB4M2YpKTsKKwkJfQorCX0KKwl1dGZfby0+dV9jbXBJRD04OworCisJcmV0dXJuIHV0Zl9vLT51X2xlbjsKK30KKworLyoKKyAqCisgKiB1ZGZfdXRmOF90b19vY3UKKyAqCisgKiBQVVJQT1NFCisgKglDb252ZXJ0IFVURi04IHRvIHRoZSBPU1RBIENvbXByZXNzZWQgVW5pY29kZSBlcXVpdmFsZW50LgorICoKKyAqIERFU0NSSVBUSU9OCisgKglUaGlzIHJvdXRpbmUgaXMgb25seSBjYWxsZWQgYnkgdWRmX2xvb2t1cCgpLgorICoKKyAqIFBSRS1DT05ESVRJT05TCisgKglvY3UJCQlQb2ludGVyIHRvIE9TVEEgQ29tcHJlc3NlZCBVbmljb2RlIG91dHB1dAorICoJCQkJYnVmZmVyIG9mIHNpemUgVURGX05BTUVfTEVOIGJ5dGVzLgorICoJdXRmCQkJUG9pbnRlciB0byBVVEYtOCBpbnB1dCBidWZmZXIuCisgKgl1dGZfbGVuCQkJTGVuZ3RoIG9mIFVURi04IGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KKyAqCisgKiBQT1NULUNPTkRJVElPTlMKKyAqCTxyZXR1cm4+CQlaZXJvIG9uIHN1Y2Nlc3MuCisgKgorICogSElTVE9SWQorICoJTm92ZW1iZXIgMTIsIDE5OTcgLSBBbmRyZXcgRS4gTWlsZXNraQorICoJV3JpdHRlbiwgdGVzdGVkLCBhbmQgcmVsZWFzZWQuCisgKi8KK3N0YXRpYyBpbnQgdWRmX1VURjh0b0NTMChkc3RyaW5nICpvY3UsIHN0cnVjdCB1c3RyICp1dGYsIGludCBsZW5ndGgpCit7CisJdW5zaWduZWQgYywgaSwgbWF4X3ZhbCwgdXRmX2NoYXI7CisJaW50IHV0Zl9jbnQsIHVfbGVuOworCisJbWVtc2V0KG9jdSwgMCwgc2l6ZW9mKGRzdHJpbmcpICogbGVuZ3RoKTsKKwlvY3VbMF0gPSA4OworCW1heF92YWwgPSAweGZmVTsKKwordHJ5X2FnYWluOgorCXVfbGVuID0gMFU7CisJdXRmX2NoYXIgPSAwVTsKKwl1dGZfY250ID0gMFU7CisJZm9yIChpID0gMFU7IGkgPCB1dGYtPnVfbGVuOyBpKyspCisJeworCQljID0gKHVpbnQ4X3QpdXRmLT51X25hbWVbaV07CisKKwkJLyogQ29tcGxldGUgYSBtdWx0aS1ieXRlIFVURi04IGNoYXJhY3RlciAqLworCQlpZiAodXRmX2NudCkKKwkJeworCQkJdXRmX2NoYXIgPSAodXRmX2NoYXIgPDwgNikgfCAoYyAmIDB4M2ZVKTsKKwkJCWlmICgtLXV0Zl9jbnQpCisJCQkJY29udGludWU7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBDaGVjayBmb3IgYSBtdWx0aS1ieXRlIFVURi04IGNoYXJhY3RlciAqLworCQkJaWYgKGMgJiAweDgwVSkKKwkJCXsKKwkJCQkvKiBTdGFydCBhIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyICovCisJCQkJaWYgKChjICYgMHhlMFUpID09IDB4YzBVKQorCQkJCXsKKwkJCQkJdXRmX2NoYXIgPSBjICYgMHgxZlU7CisJCQkJCXV0Zl9jbnQgPSAxOworCQkJCX0KKwkJCQllbHNlIGlmICgoYyAmIDB4ZjBVKSA9PSAweGUwVSkKKwkJCQl7CisJCQkJCXV0Zl9jaGFyID0gYyAmIDB4MGZVOworCQkJCQl1dGZfY250ID0gMjsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKGMgJiAweGY4VSkgPT0gMHhmMFUpCisJCQkJeworCQkJCQl1dGZfY2hhciA9IGMgJiAweDA3VTsKKwkJCQkJdXRmX2NudCA9IDM7CisJCQkJfQorCQkJCWVsc2UgaWYgKChjICYgMHhmY1UpID09IDB4ZjhVKQorCQkJCXsKKwkJCQkJdXRmX2NoYXIgPSBjICYgMHgwM1U7CisJCQkJCXV0Zl9jbnQgPSA0OworCQkJCX0KKwkJCQllbHNlIGlmICgoYyAmIDB4ZmVVKSA9PSAweGZjVSkKKwkJCQl7CisJCQkJCXV0Zl9jaGFyID0gYyAmIDB4MDFVOworCQkJCQl1dGZfY250ID0gNTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlnb3RvIGVycm9yX291dDsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZQorCQkJCS8qIFNpbmdsZSBieXRlIFVURi04IGNoYXJhY3RlciAobW9zdCBjb21tb24pICovCisJCQkJdXRmX2NoYXIgPSBjOworCQl9CisKKwkJLyogQ2hvb3NlIG5vIGNvbXByZXNzaW9uIGlmIG5lY2Vzc2FyeSAqLworCQlpZiAodXRmX2NoYXIgPiBtYXhfdmFsKQorCQl7CisJCQlpZiAoIDB4ZmZVID09IG1heF92YWwgKQorCQkJeworCQkJCW1heF92YWwgPSAweGZmZmZVOworCQkJCW9jdVswXSA9ICh1aW50OF90KTB4MTBVOworCQkJCWdvdG8gdHJ5X2FnYWluOworCQkJfQorCQkJZ290byBlcnJvcl9vdXQ7CisJCX0KKworCQlpZiAobWF4X3ZhbCA9PSAweGZmZmZVKQorCQl7CisJCQlvY3VbKyt1X2xlbl0gPSAodWludDhfdCkodXRmX2NoYXIgPj4gOCk7CisJCX0KKwkJb2N1WysrdV9sZW5dID0gKHVpbnQ4X3QpKHV0Zl9jaGFyICYgMHhmZlUpOworCX0KKworCisJaWYgKHV0Zl9jbnQpCisJeworZXJyb3Jfb3V0OgorCQlvY3VbKyt1X2xlbl0gPSAnPyc7CisJCXByaW50ayhLRVJOX0RFQlVHICJ1ZGY6IGJhZCBVVEYtOCBjaGFyYWN0ZXJcbiIpOworCX0KKworCW9jdVtsZW5ndGggLSAxXSA9ICh1aW50OF90KXVfbGVuICsgMTsKKwlyZXR1cm4gdV9sZW4gKyAxOworfQorCitzdGF0aWMgaW50IHVkZl9DUzB0b05MUyhzdHJ1Y3QgbmxzX3RhYmxlICpubHMsIHN0cnVjdCB1c3RyICp1dGZfbywgc3RydWN0IHVzdHIgKm9jdV9pKQoreworCXVpbnQ4X3QgKm9jdTsKKwl1aW50MzJfdCBjOworCXVpbnQ4X3QgY21wX2lkLCBvY3VfbGVuOworCWludCBpOworCisJb2N1ID0gb2N1X2ktPnVfbmFtZTsKKworCW9jdV9sZW4gPSBvY3VfaS0+dV9sZW47CisJY21wX2lkID0gb2N1X2ktPnVfY21wSUQ7CisJdXRmX28tPnVfbGVuID0gMDsKKworCWlmIChvY3VfbGVuID09IDApCisJeworCQltZW1zZXQodXRmX28sIDAsIHNpemVvZihzdHJ1Y3QgdXN0cikpOworCQl1dGZfby0+dV9jbXBJRCA9IDA7CisJCXV0Zl9vLT51X2xlbiA9IDA7CisJCXJldHVybiAwOworCX0KKworCWlmICgoY21wX2lkICE9IDgpICYmIChjbXBfaWQgIT0gMTYpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHVua25vd24gY29tcHJlc3Npb24gY29kZSAoJWQpIHN0cmk9JXNcbiIsIGNtcF9pZCwgb2N1X2ktPnVfbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IChpIDwgb2N1X2xlbikgJiYgKHV0Zl9vLT51X2xlbiA8PSAoVURGX05BTUVfTEVOLTMpKSA7KQorCXsKKwkJLyogRXhwYW5kIE9TVEEgY29tcHJlc3NlZCBVbmljb2RlIHRvIFVuaWNvZGUgKi8KKwkJYyA9IG9jdVtpKytdOworCQlpZiAoY21wX2lkID09IDE2KQorCQkJYyA9IChjIDw8IDgpIHwgb2N1W2krK107CisKKwkJdXRmX28tPnVfbGVuICs9IG5scy0+dW5pMmNoYXIoYywgJnV0Zl9vLT51X25hbWVbdXRmX28tPnVfbGVuXSwgCisJCQlVREZfTkFNRV9MRU4gLSB1dGZfby0+dV9sZW4pOworCX0KKwl1dGZfby0+dV9jbXBJRD04OworCisJcmV0dXJuIHV0Zl9vLT51X2xlbjsKK30KKworc3RhdGljIGludCB1ZGZfTkxTdG9DUzAoc3RydWN0IG5sc190YWJsZSAqbmxzLCBkc3RyaW5nICpvY3UsIHN0cnVjdCB1c3RyICp1bmksIGludCBsZW5ndGgpCit7CisJdW5zaWduZWQgbGVuLCBpLCBtYXhfdmFsOworCXVpbnQxNl90IHVuaV9jaGFyOworCWludCB1X2xlbjsKKworCW1lbXNldChvY3UsIDAsIHNpemVvZihkc3RyaW5nKSAqIGxlbmd0aCk7CisJb2N1WzBdID0gODsKKwltYXhfdmFsID0gMHhmZlU7CisKK3RyeV9hZ2FpbjoKKwl1X2xlbiA9IDBVOworCWZvciAoaSA9IDBVOyBpIDwgdW5pLT51X2xlbjsgaSsrKQorCXsKKwkJbGVuID0gbmxzLT5jaGFyMnVuaSgmdW5pLT51X25hbWVbaV0sIHVuaS0+dV9sZW4taSwgJnVuaV9jaGFyKTsKKwkJaWYgKGxlbiA8PSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKHVuaV9jaGFyID4gbWF4X3ZhbCkKKwkJeworCQkJbWF4X3ZhbCA9IDB4ZmZmZlU7CisJCQlvY3VbMF0gPSAodWludDhfdCkweDEwVTsKKwkJCWdvdG8gdHJ5X2FnYWluOworCQl9CisJCQorCQlpZiAobWF4X3ZhbCA9PSAweGZmZmZVKQorCQkJb2N1WysrdV9sZW5dID0gKHVpbnQ4X3QpKHVuaV9jaGFyID4+IDgpOworCQlvY3VbKyt1X2xlbl0gPSAodWludDhfdCkodW5pX2NoYXIgJiAweGZmVSk7CisJCWkgKz0gbGVuIC0gMTsKKwl9CisKKwlvY3VbbGVuZ3RoIC0gMV0gPSAodWludDhfdCl1X2xlbiArIDE7CisJcmV0dXJuIHVfbGVuICsgMTsKK30KKworaW50IHVkZl9nZXRfZmlsZW5hbWUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdWludDhfdCAqc25hbWUsIHVpbnQ4X3QgKmRuYW1lLCBpbnQgZmxlbikKK3sKKwlzdHJ1Y3QgdXN0ciBmaWxlbmFtZSwgdW5pZmlsZW5hbWU7CisJaW50IGxlbjsKKworCWlmICh1ZGZfYnVpbGRfdXN0cl9leGFjdCgmdW5pZmlsZW5hbWUsIHNuYW1lLCBmbGVuKSkKKwl7CisJCXJldHVybiAwOworCX0KKworCWlmIChVREZfUVVFUllfRkxBRyhzYiwgVURGX0ZMQUdfVVRGOCkpCisJeworCQlpZiAoIXVkZl9DUzB0b1VURjgoJmZpbGVuYW1lLCAmdW5pZmlsZW5hbWUpICkKKwkJeworCQkJdWRmX2RlYnVnKCJGYWlsZWQgaW4gdWRmX2dldF9maWxlbmFtZTogc25hbWUgPSAlc1xuIiwgc25hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJZWxzZSBpZiAoVURGX1FVRVJZX0ZMQUcoc2IsIFVERl9GTEFHX05MU19NQVApKQorCXsKKwkJaWYgKCF1ZGZfQ1MwdG9OTFMoVURGX1NCKHNiKS0+c19ubHNfbWFwLCAmZmlsZW5hbWUsICZ1bmlmaWxlbmFtZSkgKQorCQl7CisJCQl1ZGZfZGVidWcoIkZhaWxlZCBpbiB1ZGZfZ2V0X2ZpbGVuYW1lOiBzbmFtZSA9ICVzXG4iLCBzbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwllbHNlCisJCXJldHVybiAwOworCisJaWYgKChsZW4gPSB1ZGZfdHJhbnNsYXRlX3RvX2xpbnV4KGRuYW1lLCBmaWxlbmFtZS51X25hbWUsIGZpbGVuYW1lLnVfbGVuLAorCQl1bmlmaWxlbmFtZS51X25hbWUsIHVuaWZpbGVuYW1lLnVfbGVuKSkpCisJeworCQlyZXR1cm4gbGVuOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHVkZl9wdXRfZmlsZW5hbWUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgdWludDhfdCAqc25hbWUsIHVpbnQ4X3QgKmRuYW1lLCBpbnQgZmxlbikKK3sKKwlzdHJ1Y3QgdXN0ciB1bmlmaWxlbmFtZTsKKwlpbnQgbmFtZWxlbjsKKworCWlmICggISh1ZGZfY2hhcl90b191c3RyKCZ1bmlmaWxlbmFtZSwgc25hbWUsIGZsZW4pKSApCisJeworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoVURGX1FVRVJZX0ZMQUcoc2IsIFVERl9GTEFHX1VURjgpKQorCXsKKwkJaWYgKCAhKG5hbWVsZW4gPSB1ZGZfVVRGOHRvQ1MwKGRuYW1lLCAmdW5pZmlsZW5hbWUsIFVERl9OQU1FX0xFTikpICkKKwkJeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJZWxzZSBpZiAoVURGX1FVRVJZX0ZMQUcoc2IsIFVERl9GTEFHX05MU19NQVApKQorCXsKKwkJaWYgKCAhKG5hbWVsZW4gPSB1ZGZfTkxTdG9DUzAoVURGX1NCKHNiKS0+c19ubHNfbWFwLCBkbmFtZSwgJnVuaWZpbGVuYW1lLCBVREZfTkFNRV9MRU4pKSApCisJCXsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWVsc2UKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gbmFtZWxlbjsKK30KKworI2RlZmluZSBJTExFR0FMX0NIQVJfTUFSSwknXycKKyNkZWZpbmUgRVhUX01BUksJCQknLicKKyNkZWZpbmUgQ1JDX01BUksJCQknIycKKyNkZWZpbmUgRVhUX1NJWkUJCQk1CisKK3N0YXRpYyBpbnQgdWRmX3RyYW5zbGF0ZV90b19saW51eCh1aW50OF90ICpuZXdOYW1lLCB1aW50OF90ICp1ZGZOYW1lLCBpbnQgdWRmTGVuLCB1aW50OF90ICpmaWROYW1lLCBpbnQgZmlkTmFtZUxlbikKK3sKKwlpbnQgaW5kZXgsIG5ld0luZGV4ID0gMCwgbmVlZHNDUkMgPSAwOwkKKwlpbnQgZXh0SW5kZXggPSAwLCBuZXdFeHRJbmRleCA9IDAsIGhhc0V4dCA9IDA7CisJdW5zaWduZWQgc2hvcnQgdmFsdWVDUkM7CisJdWludDhfdCBjdXJyOworCWNvbnN0IHVpbnQ4X3QgaGV4Q2hhcltdID0gIjAxMjM0NTY3ODlBQkNERUYiOworCisJaWYgKHVkZk5hbWVbMF0gPT0gJy4nICYmICh1ZGZMZW4gPT0gMSB8fAorCQkodWRmTGVuID09IDIgJiYgdWRmTmFtZVsxXSA9PSAnLicpKSkKKwl7CisJCW5lZWRzQ1JDID0gMTsKKwkJbmV3SW5kZXggPSB1ZGZMZW47CisJCW1lbWNweShuZXdOYW1lLCB1ZGZOYW1lLCB1ZGZMZW4pOworCX0KKwllbHNlCisJewkKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdWRmTGVuOyBpbmRleCsrKQorCQl7CisJCQljdXJyID0gdWRmTmFtZVtpbmRleF07CisJCQlpZiAoY3VyciA9PSAnLycgfHwgY3VyciA9PSAwKQorCQkJeworCQkJCW5lZWRzQ1JDID0gMTsKKwkJCQljdXJyID0gSUxMRUdBTF9DSEFSX01BUks7CisJCQkJd2hpbGUgKGluZGV4KzEgPCB1ZGZMZW4gJiYgKHVkZk5hbWVbaW5kZXgrMV0gPT0gJy8nIHx8CisJCQkJCXVkZk5hbWVbaW5kZXgrMV0gPT0gMCkpCisJCQkJCWluZGV4Kys7CisJCQl9CisJCQlpZiAoY3VyciA9PSBFWFRfTUFSSyAmJiAodWRmTGVuIC0gaW5kZXggLSAxKSA8PSBFWFRfU0laRSkKKwkJCXsKKwkJCQlpZiAodWRmTGVuID09IGluZGV4ICsgMSkKKwkJCQkJaGFzRXh0ID0gMDsKKwkJCQllbHNlCisJCQkJeworCQkJCQloYXNFeHQgPSAxOworCQkJCQlleHRJbmRleCA9IGluZGV4OworCQkJCQluZXdFeHRJbmRleCA9IG5ld0luZGV4OworCQkJCX0KKwkJCX0KKwkJCWlmIChuZXdJbmRleCA8IDI1NikKKwkJCQluZXdOYW1lW25ld0luZGV4KytdID0gY3VycjsKKwkJCWVsc2UKKwkJCQluZWVkc0NSQyA9IDE7CisJCX0KKwl9CisJaWYgKG5lZWRzQ1JDKQorCXsKKwkJdWludDhfdCBleHRbRVhUX1NJWkVdOworCQlpbnQgbG9jYWxFeHRJbmRleCA9IDA7CisKKwkJaWYgKGhhc0V4dCkKKwkJeworCQkJaW50IG1heEZpbGVuYW1lTGVuOworCQkJZm9yKGluZGV4ID0gMDsgaW5kZXg8RVhUX1NJWkUgJiYgZXh0SW5kZXggKyBpbmRleCArMSA8IHVkZkxlbjsKKwkJCQlpbmRleCsrICkKKwkJCXsKKwkJCQljdXJyID0gdWRmTmFtZVtleHRJbmRleCArIGluZGV4ICsgMV07CisKKwkJCQlpZiAoY3VyciA9PSAnLycgfHwgY3VyciA9PSAwKQorCQkJCXsKKwkJCQkJbmVlZHNDUkMgPSAxOworCQkJCQljdXJyID0gSUxMRUdBTF9DSEFSX01BUks7CisJCQkJCXdoaWxlKGV4dEluZGV4ICsgaW5kZXggKyAyIDwgdWRmTGVuICYmIChpbmRleCArIDEgPCBFWFRfU0laRQorCQkJCQkJJiYgKHVkZk5hbWVbZXh0SW5kZXggKyBpbmRleCArIDJdID09ICcvJyB8fAorCQkJCQkJCXVkZk5hbWVbZXh0SW5kZXggKyBpbmRleCArIDJdID09IDApKSkKKwkJCQkJCWluZGV4Kys7CisJCQkJfQorCQkJCWV4dFtsb2NhbEV4dEluZGV4KytdID0gY3VycjsKKwkJCX0KKwkJCW1heEZpbGVuYW1lTGVuID0gMjUwIC0gbG9jYWxFeHRJbmRleDsKKwkJCWlmIChuZXdJbmRleCA+IG1heEZpbGVuYW1lTGVuKQorCQkJCW5ld0luZGV4ID0gbWF4RmlsZW5hbWVMZW47CisJCQllbHNlCisJCQkJbmV3SW5kZXggPSBuZXdFeHRJbmRleDsKKwkJfQorCQllbHNlIGlmIChuZXdJbmRleCA+IDI1MCkKKwkJCW5ld0luZGV4ID0gMjUwOworCQluZXdOYW1lW25ld0luZGV4KytdID0gQ1JDX01BUks7CisJCXZhbHVlQ1JDID0gdWRmX2NyYyhmaWROYW1lLCBmaWROYW1lTGVuLCAwKTsKKwkJbmV3TmFtZVtuZXdJbmRleCsrXSA9IGhleENoYXJbKHZhbHVlQ1JDICYgMHhmMDAwKSA+PiAxMl07CisJCW5ld05hbWVbbmV3SW5kZXgrK10gPSBoZXhDaGFyWyh2YWx1ZUNSQyAmIDB4MGYwMCkgPj4gOF07CisJCW5ld05hbWVbbmV3SW5kZXgrK10gPSBoZXhDaGFyWyh2YWx1ZUNSQyAmIDB4MDBmMCkgPj4gNF07CisJCW5ld05hbWVbbmV3SW5kZXgrK10gPSBoZXhDaGFyWyh2YWx1ZUNSQyAmIDB4MDAwZildOworCisJCWlmIChoYXNFeHQpCisJCXsKKwkJCW5ld05hbWVbbmV3SW5kZXgrK10gPSBFWFRfTUFSSzsKKwkJCWZvciAoaW5kZXggPSAwO2luZGV4IDwgbG9jYWxFeHRJbmRleCA7aW5kZXgrKyApCisJCQkJbmV3TmFtZVtuZXdJbmRleCsrXSA9IGV4dFtpbmRleF07CisJCX0KKwl9CisJcmV0dXJuIG5ld0luZGV4OworfQpkaWZmIC0tZ2l0IGEvZnMvdWZzL01ha2VmaWxlIGIvZnMvdWZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMzk5ODAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZnMvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggdWZzIGZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19VRlNfRlMpICs9IHVmcy5vCisKK3Vmcy1vYmpzIDo9IGJhbGxvYy5vIGN5bGluZGVyLm8gZGlyLm8gZmlsZS5vIGlhbGxvYy5vIGlub2RlLm8gXAorCSAgICBuYW1laS5vIHN1cGVyLm8gc3ltbGluay5vIHRydW5jYXRlLm8gdXRpbC5vCmRpZmYgLS1naXQgYS9mcy91ZnMvYmFsbG9jLmMgYi9mcy91ZnMvYmFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3NjQwYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Vmcy9iYWxsb2MuYwpAQCAtMCwwICsxLDgxOCBAQAorLyoKKyAqICBsaW51eC9mcy91ZnMvYmFsbG9jLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgKKyAqIERhbmllbCBQaXJrbCA8ZGFuaWVsLnBpcmtsQGVtYWlsLmN6PgorICogQ2hhcmxlcyBVbml2ZXJzaXR5LCBGYWN1bHR5IG9mIE1hdGhlbWF0aWNzIGFuZCBQaHlzaWNzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdWZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlICJzd2FiLmgiCisjaW5jbHVkZSAidXRpbC5oIgorCisjdW5kZWYgVUZTX0JBTExPQ19ERUJVRworCisjaWZkZWYgVUZTX0JBTExPQ19ERUJVRworI2RlZmluZSBVRlNEKHgpIHByaW50aygiKCVzLCAlZCksICVzOiIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgcHJpbnRrIHg7CisjZWxzZQorI2RlZmluZSBVRlNEKHgpCisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIHVmc19hZGRfZnJhZ21lbnRzIChzdHJ1Y3QgaW5vZGUgKiwgdW5zaWduZWQsIHVuc2lnbmVkLCB1bnNpZ25lZCwgaW50ICopOworc3RhdGljIHVuc2lnbmVkIHVmc19hbGxvY19mcmFnbWVudHMgKHN0cnVjdCBpbm9kZSAqLCB1bnNpZ25lZCwgdW5zaWduZWQsIHVuc2lnbmVkLCBpbnQgKik7CitzdGF0aWMgdW5zaWduZWQgdWZzX2FsbG9jY2dfYmxvY2sgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgdWZzX2NnX3ByaXZhdGVfaW5mbyAqLCB1bnNpZ25lZCwgaW50ICopOworc3RhdGljIHVuc2lnbmVkIHVmc19iaXRtYXBfc2VhcmNoIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IHVmc19jZ19wcml2YXRlX2luZm8gKiwgdW5zaWduZWQsIHVuc2lnbmVkKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHVmc19mcmFndGFibGVfOGZwYltdLCB1ZnNfZnJhZ3RhYmxlX290aGVyW107CitzdGF0aWMgdm9pZCB1ZnNfY2x1c3RlcmFjY3Qoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCB1ZnNfY2dfcHJpdmF0ZV9pbmZvICosIHVuc2lnbmVkLCBpbnQpOworCisvKgorICogRnJlZSAnY291bnQnIGZyYWdtZW50cyBmcm9tIGZyYWdtZW50IG51bWJlciAnZnJhZ21lbnQnCisgKi8KK3ZvaWQgdWZzX2ZyZWVfZnJhZ21lbnRzIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgdW5zaWduZWQgZnJhZ21lbnQsIHVuc2lnbmVkIGNvdW50KSB7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKiB1c2IxOworCXN0cnVjdCB1ZnNfY2dfcHJpdmF0ZV9pbmZvICogdWNwaTsKKwlzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwICogdWNnOworCXVuc2lnbmVkIGNnbm8sIGJpdCwgZW5kX2JpdCwgYmJhc2UsIGJsa21hcCwgaSwgYmxrbm8sIGN5bG5vOworCQorCXNiID0gaW5vZGUtPmlfc2I7CisJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QoVVNQSV9VQkgpOworCQorCVVGU0QoKCJFTlRFUiwgZnJhZ21lbnQgJXUsIGNvdW50ICV1XG4iLCBmcmFnbWVudCwgY291bnQpKQorCQorCWlmICh1ZnNfZnJhZ251bShmcmFnbWVudCkgKyBjb3VudCA+IHVzcGktPnNfZnBnKQorCQl1ZnNfZXJyb3IgKHNiLCAidWZzX2ZyZWVfZnJhZ21lbnRzIiwgImludGVybmFsIGVycm9yIik7CisJCisJbG9ja19zdXBlcihzYik7CisJCisJY2dubyA9IHVmc19kdG9nKGZyYWdtZW50KTsKKwliaXQgPSB1ZnNfZHRvZ2QoZnJhZ21lbnQpOworCWlmIChjZ25vID49IHVzcGktPnNfbmNnKSB7CisJCXVmc19wYW5pYyAoc2IsICJ1ZnNfZnJlZV9mcmFnbWVudHMiLCAiZnJlZWluZyBibG9ja3MgYXJlIG91dHNpZGUgZGV2aWNlIik7CisJCWdvdG8gZmFpbGVkOworCX0KKwkJCisJdWNwaSA9IHVmc19sb2FkX2N5bGluZGVyIChzYiwgY2dubyk7CisJaWYgKCF1Y3BpKSAKKwkJZ290byBmYWlsZWQ7CisJdWNnID0gdWJoX2dldF91Y2cgKFVDUElfVUJIKTsKKwlpZiAoIXVmc19jZ19jaGttYWdpYyhzYiwgdWNnKSkgeworCQl1ZnNfcGFuaWMgKHNiLCAidWZzX2ZyZWVfZnJhZ21lbnRzIiwgImludGVybmFsIGVycm9yLCBiYWQgbWFnaWMgbnVtYmVyIG9uIGNnICV1IiwgY2dubyk7CisJCWdvdG8gZmFpbGVkOworCX0KKworCWVuZF9iaXQgPSBiaXQgKyBjb3VudDsKKwliYmFzZSA9IHVmc19ibGtudW0gKGJpdCk7CisJYmxrbWFwID0gdWJoX2Jsa21hcCAoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgYmJhc2UpOworCXVmc19mcmFnYWNjdCAoc2IsIGJsa21hcCwgdWNnLT5jZ19mcnN1bSwgLTEpOworCWZvciAoaSA9IGJpdDsgaSA8IGVuZF9iaXQ7IGkrKykgeworCQlpZiAodWJoX2lzY2xyIChVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCBpKSkKKwkJCXViaF9zZXRiaXQgKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGkpOworCQllbHNlIHVmc19lcnJvciAoc2IsICJ1ZnNfZnJlZV9mcmFnbWVudHMiLAorCQkJImJpdCBhbHJlYWR5IGNsZWFyZWQgZm9yIGZyYWdtZW50ICV1IiwgaSk7CisJfQorCQorCURRVU9UX0ZSRUVfQkxPQ0sgKGlub2RlLCBjb3VudCk7CisKKwkKKwlmczMyX2FkZChzYiwgJnVjZy0+Y2dfY3MuY3NfbmZmcmVlLCBjb3VudCk7CisJZnMzMl9hZGQoc2IsICZ1c2IxLT5mc19jc3RvdGFsLmNzX25mZnJlZSwgY291bnQpOworCWZzMzJfYWRkKHNiLCAmVUZTX1NCKHNiKS0+ZnNfY3MoY2dubykuY3NfbmZmcmVlLCBjb3VudCk7CisJYmxrbWFwID0gdWJoX2Jsa21hcCAoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgYmJhc2UpOworCXVmc19mcmFnYWNjdChzYiwgYmxrbWFwLCB1Y2ctPmNnX2Zyc3VtLCAxKTsKKworCS8qCisJICogVHJ5aW5nIHRvIHJlYXNzZW1ibGUgZnJlZSBmcmFnbWVudHMgaW50byBibG9jaworCSAqLworCWJsa25vID0gdWZzX2ZyYWdzdG9ibGtzIChiYmFzZSk7CisJaWYgKHViaF9pc2Jsb2Nrc2V0KFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGJsa25vKSkgeworCQlmczMyX3N1YihzYiwgJnVjZy0+Y2dfY3MuY3NfbmZmcmVlLCB1c3BpLT5zX2ZwYik7CisJCWZzMzJfc3ViKHNiLCAmdXNiMS0+ZnNfY3N0b3RhbC5jc19uZmZyZWUsIHVzcGktPnNfZnBiKTsKKwkJZnMzMl9zdWIoc2IsICZVRlNfU0Ioc2IpLT5mc19jcyhjZ25vKS5jc19uZmZyZWUsIHVzcGktPnNfZnBiKTsKKwkJaWYgKChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX0NHX01BU0spID09IFVGU19DR180NEJTRCkKKwkJCXVmc19jbHVzdGVyYWNjdCAoc2IsIHVjcGksIGJsa25vLCAxKTsKKwkJZnMzMl9hZGQoc2IsICZ1Y2ctPmNnX2NzLmNzX25iZnJlZSwgMSk7CisJCWZzMzJfYWRkKHNiLCAmdXNiMS0+ZnNfY3N0b3RhbC5jc19uYmZyZWUsIDEpOworCQlmczMyX2FkZChzYiwgJlVGU19TQihzYiktPmZzX2NzKGNnbm8pLmNzX25iZnJlZSwgMSk7CisJCWN5bG5vID0gdWZzX2NidG9jeWxubyAoYmJhc2UpOworCQlmczE2X2FkZChzYiwgJnViaF9jZ19ibGtzKHVjcGksIGN5bG5vLCB1ZnNfY2J0b3Jwb3MoYmJhc2UpKSwgMSk7CisJCWZzMzJfYWRkKHNiLCAmdWJoX2NnX2Jsa3RvdCh1Y3BpLCBjeWxubyksIDEpOworCX0KKwkKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKTsKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKTsKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykgeworCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKKwkJdWJoX2xsX3J3X2Jsb2NrIChXUklURSwgMSwgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopJnVjcGkpOworCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKKwl9CisJc2ItPnNfZGlydCA9IDE7CisJCisJdW5sb2NrX3N1cGVyIChzYik7CisJVUZTRCgoIkVYSVRcbiIpKQorCXJldHVybjsKKworZmFpbGVkOgorCXVubG9ja19zdXBlciAoc2IpOworCVVGU0QoKCJFWElUIChGQUlMRUQpXG4iKSkKKwlyZXR1cm47Cit9CisKKy8qCisgKiBGcmVlICdjb3VudCcgZnJhZ21lbnRzIGZyb20gZnJhZ21lbnQgbnVtYmVyICdmcmFnbWVudCcgKGZyZWUgd2hvbGUgYmxvY2tzKQorICovCit2b2lkIHVmc19mcmVlX2Jsb2NrcyAoc3RydWN0IGlub2RlICogaW5vZGUsIHVuc2lnbmVkIGZyYWdtZW50LCB1bnNpZ25lZCBjb3VudCkgeworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICogdXNiMTsKKwlzdHJ1Y3QgdWZzX2NnX3ByaXZhdGVfaW5mbyAqIHVjcGk7CisJc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCAqIHVjZzsKKwl1bnNpZ25lZCBvdmVyZmxvdywgY2dubywgYml0LCBlbmRfYml0LCBibGtubywgaSwgY3lsbm87CisJCisJc2IgPSBpbm9kZS0+aV9zYjsKKwl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7CisKKwlVRlNEKCgiRU5URVIsIGZyYWdtZW50ICV1LCBjb3VudCAldVxuIiwgZnJhZ21lbnQsIGNvdW50KSkKKwkKKwlpZiAoKGZyYWdtZW50ICYgdXNwaS0+c19mcGJtYXNrKSB8fCAoY291bnQgJiB1c3BpLT5zX2ZwYm1hc2spKSB7CisJCXVmc19lcnJvciAoc2IsICJ1ZnNfZnJlZV9ibG9ja3MiLCAiaW50ZXJuYWwgZXJyb3IsICIKKwkJCSJmcmFnbWVudCAldSwgY291bnQgJXVcbiIsIGZyYWdtZW50LCBjb3VudCk7CisJCWdvdG8gZmFpbGVkOworCX0KKworCWxvY2tfc3VwZXIoc2IpOworCQorZG9fbW9yZToKKwlvdmVyZmxvdyA9IDA7CisJY2dubyA9IHVmc19kdG9nIChmcmFnbWVudCk7CisJYml0ID0gdWZzX2R0b2dkIChmcmFnbWVudCk7CisJaWYgKGNnbm8gPj0gdXNwaS0+c19uY2cpIHsKKwkJdWZzX3BhbmljIChzYiwgInVmc19mcmVlX2Jsb2NrcyIsICJmcmVlaW5nIGJsb2NrcyBhcmUgb3V0c2lkZSBkZXZpY2UiKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCWVuZF9iaXQgPSBiaXQgKyBjb3VudDsKKwlpZiAoZW5kX2JpdCA+IHVzcGktPnNfZnBnKSB7CisJCW92ZXJmbG93ID0gYml0ICsgY291bnQgLSB1c3BpLT5zX2ZwZzsKKwkJY291bnQgLT0gb3ZlcmZsb3c7CisJCWVuZF9iaXQgLT0gb3ZlcmZsb3c7CisJfQorCisJdWNwaSA9IHVmc19sb2FkX2N5bGluZGVyIChzYiwgY2dubyk7CisJaWYgKCF1Y3BpKSAKKwkJZ290byBmYWlsZWQ7CisJdWNnID0gdWJoX2dldF91Y2cgKFVDUElfVUJIKTsKKwlpZiAoIXVmc19jZ19jaGttYWdpYyhzYiwgdWNnKSkgeworCQl1ZnNfcGFuaWMgKHNiLCAidWZzX2ZyZWVfYmxvY2tzIiwgImludGVybmFsIGVycm9yLCBiYWQgbWFnaWMgbnVtYmVyIG9uIGNnICV1IiwgY2dubyk7CisJCWdvdG8gZmFpbGVkOworCX0KKworCWZvciAoaSA9IGJpdDsgaSA8IGVuZF9iaXQ7IGkgKz0gdXNwaS0+c19mcGIpIHsKKwkJYmxrbm8gPSB1ZnNfZnJhZ3N0b2Jsa3MoaSk7CisJCWlmICh1YmhfaXNibG9ja3NldChVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCBibGtubykpIHsKKwkJCXVmc19lcnJvcihzYiwgInVmc19mcmVlX2Jsb2NrcyIsICJmcmVlaW5nIGZyZWUgZnJhZ21lbnQiKTsKKwkJfQorCQl1Ymhfc2V0YmxvY2soVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgYmxrbm8pOworCQlpZiAoKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfQ0dfTUFTSykgPT0gVUZTX0NHXzQ0QlNEKQorCQkJdWZzX2NsdXN0ZXJhY2N0IChzYiwgdWNwaSwgYmxrbm8sIDEpOworCQlEUVVPVF9GUkVFX0JMT0NLKGlub2RlLCB1c3BpLT5zX2ZwYik7CisKKwkJZnMzMl9hZGQoc2IsICZ1Y2ctPmNnX2NzLmNzX25iZnJlZSwgMSk7CisJCWZzMzJfYWRkKHNiLCAmdXNiMS0+ZnNfY3N0b3RhbC5jc19uYmZyZWUsIDEpOworCQlmczMyX2FkZChzYiwgJlVGU19TQihzYiktPmZzX2NzKGNnbm8pLmNzX25iZnJlZSwgMSk7CisJCWN5bG5vID0gdWZzX2NidG9jeWxubyhpKTsKKwkJZnMxNl9hZGQoc2IsICZ1YmhfY2dfYmxrcyh1Y3BpLCBjeWxubywgdWZzX2NidG9ycG9zKGkpKSwgMSk7CisJCWZzMzJfYWRkKHNiLCAmdWJoX2NnX2Jsa3RvdCh1Y3BpLCBjeWxubyksIDEpOworCX0KKworCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVVNQSV9VQkgpOworCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVUNQSV9VQkgpOworCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKSB7CisJCXViaF93YWl0X29uX2J1ZmZlciAoVUNQSV9VQkgpOworCQl1YmhfbGxfcndfYmxvY2sgKFdSSVRFLCAxLCAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKikmdWNwaSk7CisJCXViaF93YWl0X29uX2J1ZmZlciAoVUNQSV9VQkgpOworCX0KKworCWlmIChvdmVyZmxvdykgeworCQlmcmFnbWVudCArPSBjb3VudDsKKwkJY291bnQgPSBvdmVyZmxvdzsKKwkJZ290byBkb19tb3JlOworCX0KKworCXNiLT5zX2RpcnQgPSAxOworCXVubG9ja19zdXBlciAoc2IpOworCVVGU0QoKCJFWElUXG4iKSkKKwlyZXR1cm47CisKK2ZhaWxlZDoKKwl1bmxvY2tfc3VwZXIgKHNiKTsKKwlVRlNEKCgiRVhJVCAoRkFJTEVEKVxuIikpCisJcmV0dXJuOworfQorCisKKworI2RlZmluZSBOVUxMSUZZX0ZSQUdNRU5UUyBcCisJZm9yIChpID0gb2xkY291bnQ7IGkgPCBuZXdjb3VudDsgaSsrKSB7IFwKKwkJYmggPSBzYl9nZXRibGsoc2IsIHJlc3VsdCArIGkpOyBcCisJCW1lbXNldCAoYmgtPmJfZGF0YSwgMCwgc2ItPnNfYmxvY2tzaXplKTsgXAorCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsgXAorCQltYXJrX2J1ZmZlcl9kaXJ0eSAoYmgpOyBcCisJCWlmIChJU19TWU5DKGlub2RlKSkgXAorCQkJc3luY19kaXJ0eV9idWZmZXIoYmgpOyBcCisJCWJyZWxzZSAoYmgpOyBcCisJfQorCit1bnNpZ25lZCB1ZnNfbmV3X2ZyYWdtZW50cyAoc3RydWN0IGlub2RlICogaW5vZGUsIF9fZnMzMiAqIHAsIHVuc2lnbmVkIGZyYWdtZW50LAorCXVuc2lnbmVkIGdvYWwsIHVuc2lnbmVkIGNvdW50LCBpbnQgKiBlcnIgKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICogdXNiMTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwl1bnNpZ25lZCBjZ25vLCBvbGRjb3VudCwgbmV3Y291bnQsIHRtcCwgcmVxdWVzdCwgaSwgcmVzdWx0OworCQorCVVGU0QoKCJFTlRFUiwgaW5vICVsdSwgZnJhZ21lbnQgJXUsIGdvYWwgJXUsIGNvdW50ICV1XG4iLCBpbm9kZS0+aV9pbm8sIGZyYWdtZW50LCBnb2FsLCBjb3VudCkpCisJCisJc2IgPSBpbm9kZS0+aV9zYjsKKwl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7CisJKmVyciA9IC1FTk9TUEM7CisKKwlsb2NrX3N1cGVyIChzYik7CisJCisJdG1wID0gZnMzMl90b19jcHUoc2IsICpwKTsKKwlpZiAoY291bnQgKyB1ZnNfZnJhZ251bShmcmFnbWVudCkgPiB1c3BpLT5zX2ZwYikgeworCQl1ZnNfd2FybmluZyAoc2IsICJ1ZnNfbmV3X2ZyYWdtZW50cyIsICJpbnRlcm5hbCB3YXJuaW5nIgorCQkJIiBmcmFnbWVudCAldSwgY291bnQgJXUiLCBmcmFnbWVudCwgY291bnQpOworCQljb3VudCA9IHVzcGktPnNfZnBiIC0gdWZzX2ZyYWdudW0oZnJhZ21lbnQpOyAKKwl9CisJb2xkY291bnQgPSB1ZnNfZnJhZ251bSAoZnJhZ21lbnQpOworCW5ld2NvdW50ID0gb2xkY291bnQgKyBjb3VudDsKKworCS8qCisJICogU29tZWJvZHkgZWxzZSBoYXMganVzdCBhbGxvY2F0ZWQgb3VyIGZyYWdtZW50cworCSAqLworCWlmIChvbGRjb3VudCkgeworCQlpZiAoIXRtcCkgeworCQkJdWZzX2Vycm9yIChzYiwgInVmc19uZXdfZnJhZ21lbnRzIiwgImludGVybmFsIGVycm9yLCAiCisJCQkJImZyYWdtZW50ICV1LCB0bXAgJXVcbiIsIGZyYWdtZW50LCB0bXApOworCQkJdW5sb2NrX3N1cGVyIChzYik7CisJCQlyZXR1cm4gKHVuc2lnbmVkKS0xOworCQl9CisJCWlmIChmcmFnbWVudCA8IFVGU19JKGlub2RlKS0+aV9sYXN0ZnJhZykgeworCQkJVUZTRCgoIkVYSVQgKEFMUkVBRFkgQUxMT0NBVEVEKVxuIikpCisJCQl1bmxvY2tfc3VwZXIgKHNiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWVsc2UgeworCQlpZiAodG1wKSB7CisJCQlVRlNEKCgiRVhJVCAoQUxSRUFEWSBBTExPQ0FURUQpXG4iKSkKKwkJCXVubG9ja19zdXBlcihzYik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qCisJICogVGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSBmb3IgdXNlciBvbiB0aGUgZGV2aWNlCisJICovCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpICYmIHVmc19mcmVlc3BhY2UodXNiMSwgVUZTX01JTkZSRUUpIDw9IDApIHsKKwkJdW5sb2NrX3N1cGVyIChzYik7CisJCVVGU0QoKCJFWElUIChGQUlMRUQpXG4iKSkKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGdvYWwgPj0gdXNwaS0+c19zaXplKSAKKwkJZ29hbCA9IDA7CisJaWYgKGdvYWwgPT0gMCkgCisJCWNnbm8gPSB1ZnNfaW5vdG9jZyAoaW5vZGUtPmlfaW5vKTsKKwllbHNlCisJCWNnbm8gPSB1ZnNfZHRvZyAoZ29hbCk7CisJIAorCS8qCisJICogYWxsb2NhdGUgbmV3IGZyYWdtZW50CisJICovCisJaWYgKG9sZGNvdW50ID09IDApIHsKKwkJcmVzdWx0ID0gdWZzX2FsbG9jX2ZyYWdtZW50cyAoaW5vZGUsIGNnbm8sIGdvYWwsIGNvdW50LCBlcnIpOworCQlpZiAocmVzdWx0KSB7CisJCQkqcCA9IGNwdV90b19mczMyKHNiLCByZXN1bHQpOworCQkJKmVyciA9IDA7CisJCQlpbm9kZS0+aV9ibG9ja3MgKz0gY291bnQgPDwgdXNwaS0+c19uc3Bmc2hpZnQ7CisJCQlVRlNfSShpbm9kZSktPmlfbGFzdGZyYWcgPSBtYXhfdCh1MzIsIFVGU19JKGlub2RlKS0+aV9sYXN0ZnJhZywgZnJhZ21lbnQgKyBjb3VudCk7CisJCQlOVUxMSUZZX0ZSQUdNRU5UUworCQl9CisJCXVubG9ja19zdXBlcihzYik7CisJCVVGU0QoKCJFWElULCByZXN1bHQgJXVcbiIsIHJlc3VsdCkpCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoKKwkgKiByZXNpemUgYmxvY2sKKwkgKi8KKwlyZXN1bHQgPSB1ZnNfYWRkX2ZyYWdtZW50cyAoaW5vZGUsIHRtcCwgb2xkY291bnQsIG5ld2NvdW50LCBlcnIpOworCWlmIChyZXN1bHQpIHsKKwkJKmVyciA9IDA7CisJCWlub2RlLT5pX2Jsb2NrcyArPSBjb3VudCA8PCB1c3BpLT5zX25zcGZzaGlmdDsKKwkJVUZTX0koaW5vZGUpLT5pX2xhc3RmcmFnID0gbWF4X3QodTMyLCBVRlNfSShpbm9kZSktPmlfbGFzdGZyYWcsIGZyYWdtZW50ICsgY291bnQpOworCQlOVUxMSUZZX0ZSQUdNRU5UUworCQl1bmxvY2tfc3VwZXIoc2IpOworCQlVRlNEKCgiRVhJVCwgcmVzdWx0ICV1XG4iLCByZXN1bHQpKQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qCisJICogYWxsb2NhdGUgbmV3IGJsb2NrIGFuZCBtb3ZlIGRhdGEKKwkgKi8KKwlzd2l0Y2ggKGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19vcHRpbSkpIHsKKwkgICAgY2FzZSBVRlNfT1BUU1BBQ0U6CisJCXJlcXVlc3QgPSBuZXdjb3VudDsKKwkJaWYgKHVzcGktPnNfbWluZnJlZSA8IDUgfHwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NzdG90YWwuY3NfbmZmcmVlKSAKKwkJICAgID4gdXNwaS0+c19kc2l6ZSAqIHVzcGktPnNfbWluZnJlZSAvICgyICogMTAwKSApCisJCQlicmVhazsKKwkJdXNiMS0+ZnNfb3B0aW0gPSBjcHVfdG9fZnMzMihzYiwgVUZTX09QVFRJTUUpOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJdXNiMS0+ZnNfb3B0aW0gPSBjcHVfdG9fZnMzMihzYiwgVUZTX09QVFRJTUUpOworCQorCSAgICBjYXNlIFVGU19PUFRUSU1FOgorCQlyZXF1ZXN0ID0gdXNwaS0+c19mcGI7CisJCWlmIChmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3N0b3RhbC5jc19uZmZyZWUpIDwgdXNwaS0+c19kc2l6ZSAqCisJCSAgICAodXNwaS0+c19taW5mcmVlIC0gMikgLyAxMDApCisJCQlicmVhazsKKwkJdXNiMS0+ZnNfb3B0aW0gPSBjcHVfdG9fZnMzMihzYiwgVUZTX09QVFRJTUUpOworCQlicmVhazsKKwl9CisJcmVzdWx0ID0gdWZzX2FsbG9jX2ZyYWdtZW50cyAoaW5vZGUsIGNnbm8sIGdvYWwsIHJlcXVlc3QsIGVycik7CisJaWYgKHJlc3VsdCkgeworCQlmb3IgKGkgPSAwOyBpIDwgb2xkY291bnQ7IGkrKykgeworCQkJYmggPSBzYl9icmVhZChzYiwgdG1wICsgaSk7CisJCQlpZihiaCkKKwkJCXsKKwkJCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCQkJCWJoLT5iX2Jsb2NrbnIgPSByZXN1bHQgKyBpOworCQkJCW1hcmtfYnVmZmVyX2RpcnR5IChiaCk7CisJCQkJaWYgKElTX1NZTkMoaW5vZGUpKQorCQkJCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CisJCQkJYnJlbHNlIChiaCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJ1ZnNfbmV3X2ZyYWdtZW50czogYnJlYWQgZmFpbFxuIik7CisJCQkJdW5sb2NrX3N1cGVyKHNiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQkqcCA9IGNwdV90b19mczMyKHNiLCByZXN1bHQpOworCQkqZXJyID0gMDsKKwkJaW5vZGUtPmlfYmxvY2tzICs9IGNvdW50IDw8IHVzcGktPnNfbnNwZnNoaWZ0OworCQlVRlNfSShpbm9kZSktPmlfbGFzdGZyYWcgPSBtYXhfdCh1MzIsIFVGU19JKGlub2RlKS0+aV9sYXN0ZnJhZywgZnJhZ21lbnQgKyBjb3VudCk7CisJCU5VTExJRllfRlJBR01FTlRTCisJCXVubG9ja19zdXBlcihzYik7CisJCWlmIChuZXdjb3VudCA8IHJlcXVlc3QpCisJCQl1ZnNfZnJlZV9mcmFnbWVudHMgKGlub2RlLCByZXN1bHQgKyBuZXdjb3VudCwgcmVxdWVzdCAtIG5ld2NvdW50KTsKKwkJdWZzX2ZyZWVfZnJhZ21lbnRzIChpbm9kZSwgdG1wLCBvbGRjb3VudCk7CisJCVVGU0QoKCJFWElULCByZXN1bHQgJXVcbiIsIHJlc3VsdCkpCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJdW5sb2NrX3N1cGVyKHNiKTsKKwlVRlNEKCgiRVhJVCAoRkFJTEVEKVxuIikpCisJcmV0dXJuIDA7Cit9CQkKKworc3RhdGljIHVuc2lnbmVkCit1ZnNfYWRkX2ZyYWdtZW50cyAoc3RydWN0IGlub2RlICogaW5vZGUsIHVuc2lnbmVkIGZyYWdtZW50LAorCQkgICB1bnNpZ25lZCBvbGRjb3VudCwgdW5zaWduZWQgbmV3Y291bnQsIGludCAqIGVycikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqIHVzYjE7CisJc3RydWN0IHVmc19jZ19wcml2YXRlX2luZm8gKiB1Y3BpOworCXN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKiB1Y2c7CisJdW5zaWduZWQgY2dubywgZnJhZ25vLCBmcmFnb2ZmLCBjb3VudCwgZnJhZ3NpemUsIGk7CisJCisJVUZTRCgoIkVOVEVSLCBmcmFnbWVudCAldSwgb2xkY291bnQgJXUsIG5ld2NvdW50ICV1XG4iLCBmcmFnbWVudCwgb2xkY291bnQsIG5ld2NvdW50KSkKKwkKKwlzYiA9IGlub2RlLT5pX3NiOworCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0IChVU1BJX1VCSCk7CisJY291bnQgPSBuZXdjb3VudCAtIG9sZGNvdW50OworCQorCWNnbm8gPSB1ZnNfZHRvZyhmcmFnbWVudCk7CisJaWYgKGZzMzJfdG9fY3B1KHNiLCBVRlNfU0Ioc2IpLT5mc19jcyhjZ25vKS5jc19uZmZyZWUpIDwgY291bnQpCisJCXJldHVybiAwOworCWlmICgodWZzX2ZyYWdudW0gKGZyYWdtZW50KSArIG5ld2NvdW50KSA+IHVzcGktPnNfZnBiKQorCQlyZXR1cm4gMDsKKwl1Y3BpID0gdWZzX2xvYWRfY3lsaW5kZXIgKHNiLCBjZ25vKTsKKwlpZiAoIXVjcGkpCisJCXJldHVybiAwOworCXVjZyA9IHViaF9nZXRfdWNnIChVQ1BJX1VCSCk7CisJaWYgKCF1ZnNfY2dfY2hrbWFnaWMoc2IsIHVjZykpIHsKKwkJdWZzX3BhbmljIChzYiwgInVmc19hZGRfZnJhZ21lbnRzIiwKKwkJCSJpbnRlcm5hbCBlcnJvciwgYmFkIG1hZ2ljIG51bWJlciBvbiBjZyAldSIsIGNnbm8pOworCQlyZXR1cm4gMDsKKwl9CisKKwlmcmFnbm8gPSB1ZnNfZHRvZ2QgKGZyYWdtZW50KTsKKwlmcmFnb2ZmID0gdWZzX2ZyYWdudW0gKGZyYWdubyk7CisJZm9yIChpID0gb2xkY291bnQ7IGkgPCBuZXdjb3VudDsgaSsrKQorCQlpZiAodWJoX2lzY2xyIChVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCBmcmFnbm8gKyBpKSkKKwkJCXJldHVybiAwOworCS8qCisJICogQmxvY2sgY2FuIGJlIGV4dGVuZGVkCisJICovCisJdWNnLT5jZ190aW1lID0gY3B1X3RvX2ZzMzIoc2IsIGdldF9zZWNvbmRzKCkpOworCWZvciAoaSA9IG5ld2NvdW50OyBpIDwgKHVzcGktPnNfZnBiIC0gZnJhZ29mZik7IGkrKykKKwkJaWYgKHViaF9pc2NsciAoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgZnJhZ25vICsgaSkpCisJCQlicmVhazsKKwlmcmFnc2l6ZSA9IGkgLSBvbGRjb3VudDsKKwlpZiAoIWZzMzJfdG9fY3B1KHNiLCB1Y2ctPmNnX2Zyc3VtW2ZyYWdzaXplXSkpCisJCXVmc19wYW5pYyAoc2IsICJ1ZnNfYWRkX2ZyYWdtZW50cyIsCisJCQkiaW50ZXJuYWwgZXJyb3Igb3IgY29ycnVwdGVkIGJpdG1hcCBvbiBjZyAldSIsIGNnbm8pOworCWZzMzJfc3ViKHNiLCAmdWNnLT5jZ19mcnN1bVtmcmFnc2l6ZV0sIDEpOworCWlmIChmcmFnc2l6ZSAhPSBjb3VudCkKKwkJZnMzMl9hZGQoc2IsICZ1Y2ctPmNnX2Zyc3VtW2ZyYWdzaXplIC0gY291bnRdLCAxKTsKKwlmb3IgKGkgPSBvbGRjb3VudDsgaSA8IG5ld2NvdW50OyBpKyspCisJCXViaF9jbHJiaXQgKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGZyYWdubyArIGkpOworCWlmKERRVU9UX0FMTE9DX0JMT0NLKGlub2RlLCBjb3VudCkpIHsKKwkJKmVyciA9IC1FRFFVT1Q7CisJCXJldHVybiAwOworCX0KKworCWZzMzJfc3ViKHNiLCAmdWNnLT5jZ19jcy5jc19uZmZyZWUsIGNvdW50KTsKKwlmczMyX3N1YihzYiwgJlVGU19TQihzYiktPmZzX2NzKGNnbm8pLmNzX25mZnJlZSwgY291bnQpOworCWZzMzJfc3ViKHNiLCAmdXNiMS0+ZnNfY3N0b3RhbC5jc19uZmZyZWUsIGNvdW50KTsKKwkKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKTsKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKTsKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykgeworCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKKwkJdWJoX2xsX3J3X2Jsb2NrIChXUklURSwgMSwgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopJnVjcGkpOworCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKKwl9CisJc2ItPnNfZGlydCA9IDE7CisKKwlVRlNEKCgiRVhJVCwgZnJhZ21lbnQgJXVcbiIsIGZyYWdtZW50KSkKKwkKKwlyZXR1cm4gZnJhZ21lbnQ7Cit9CisKKyNkZWZpbmUgVUZTX1RFU1RfRlJFRV9TUEFDRV9DRyBcCisJdWNnID0gKHN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKikgVUZTX1NCKHNiKS0+c191Y2dbY2dub10tPmJfZGF0YTsgXAorCWlmIChmczMyX3RvX2NwdShzYiwgdWNnLT5jZ19jcy5jc19uYmZyZWUpKSBcCisJCWdvdG8gY2dfZm91bmQ7IFwKKwlmb3IgKGsgPSBjb3VudDsgayA8IHVzcGktPnNfZnBiOyBrKyspIFwKKwkJaWYgKGZzMzJfdG9fY3B1KHNiLCB1Y2ctPmNnX2Zyc3VtW2tdKSkgXAorCQkJZ290byBjZ19mb3VuZDsgCisKK3N0YXRpYyB1bnNpZ25lZCB1ZnNfYWxsb2NfZnJhZ21lbnRzIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgdW5zaWduZWQgY2dubywKKwl1bnNpZ25lZCBnb2FsLCB1bnNpZ25lZCBjb3VudCwgaW50ICogZXJyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICogdXNiMTsKKwlzdHJ1Y3QgdWZzX2NnX3ByaXZhdGVfaW5mbyAqIHVjcGk7CisJc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCAqIHVjZzsKKwl1bnNpZ25lZCBvbGRjZywgaSwgaiwgaywgcmVzdWx0LCBhbGxvY3NpemU7CisJCisJVUZTRCgoIkVOVEVSLCBpbm8gJWx1LCBjZ25vICV1LCBnb2FsICV1LCBjb3VudCAldVxuIiwgaW5vZGUtPmlfaW5vLCBjZ25vLCBnb2FsLCBjb3VudCkpCisKKwlzYiA9IGlub2RlLT5pX3NiOworCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKKwlvbGRjZyA9IGNnbm87CisJCisJLyoKKwkgKiAxLiBzZWFyY2hpbmcgb24gcHJlZmVycmVkIGN5bGluZGVyIGdyb3VwCisJICovCisJVUZTX1RFU1RfRlJFRV9TUEFDRV9DRworCisJLyoKKwkgKiAyLiBxdWFkcmF0aWMgcmVoYXNoCisJICovCisJZm9yIChqID0gMTsgaiA8IHVzcGktPnNfbmNnOyBqICo9IDIpIHsKKwkJY2dubyArPSBqOworCQlpZiAoY2dubyA+PSB1c3BpLT5zX25jZykgCisJCQljZ25vIC09IHVzcGktPnNfbmNnOworCQlVRlNfVEVTVF9GUkVFX1NQQUNFX0NHCisJfQorCisJLyoKKwkgKiAzLiBicnV0ZSBmb3JjZSBzZWFyY2gKKwkgKiBXZSBzdGFydCBhdCBpID0gMiAoIDAgaXMgY2hlY2tlZCBhdCAxLnN0ZXAsIDEgYXQgMi5zdGVwICkKKwkgKi8KKwljZ25vID0gKG9sZGNnICsgMSkgJSB1c3BpLT5zX25jZzsKKwlmb3IgKGogPSAyOyBqIDwgdXNwaS0+c19uY2c7IGorKykgeworCQljZ25vKys7CisJCWlmIChjZ25vID49IHVzcGktPnNfbmNnKQorCQkJY2dubyA9IDA7CisJCVVGU19URVNUX0ZSRUVfU1BBQ0VfQ0cKKwl9CisJCisJVUZTRCgoIkVYSVQgKEZBSUxFRClcbiIpKQorCXJldHVybiAwOworCitjZ19mb3VuZDoKKwl1Y3BpID0gdWZzX2xvYWRfY3lsaW5kZXIgKHNiLCBjZ25vKTsKKwlpZiAoIXVjcGkpCisJCXJldHVybiAwOworCXVjZyA9IHViaF9nZXRfdWNnIChVQ1BJX1VCSCk7CisJaWYgKCF1ZnNfY2dfY2hrbWFnaWMoc2IsIHVjZykpIAorCQl1ZnNfcGFuaWMgKHNiLCAidWZzX2FsbG9jX2ZyYWdtZW50cyIsCisJCQkiaW50ZXJuYWwgZXJyb3IsIGJhZCBtYWdpYyBudW1iZXIgb24gY2cgJXUiLCBjZ25vKTsKKwl1Y2ctPmNnX3RpbWUgPSBjcHVfdG9fZnMzMihzYiwgZ2V0X3NlY29uZHMoKSk7CisKKwlpZiAoY291bnQgPT0gdXNwaS0+c19mcGIpIHsKKwkJcmVzdWx0ID0gdWZzX2FsbG9jY2dfYmxvY2sgKGlub2RlLCB1Y3BpLCBnb2FsLCBlcnIpOworCQlpZiAocmVzdWx0ID09ICh1bnNpZ25lZCktMSkKKwkJCXJldHVybiAwOworCQlnb3RvIHN1Y2NlZDsKKwl9CisKKwlmb3IgKGFsbG9jc2l6ZSA9IGNvdW50OyBhbGxvY3NpemUgPCB1c3BpLT5zX2ZwYjsgYWxsb2NzaXplKyspCisJCWlmIChmczMyX3RvX2NwdShzYiwgdWNnLT5jZ19mcnN1bVthbGxvY3NpemVdKSAhPSAwKQorCQkJYnJlYWs7CisJCisJaWYgKGFsbG9jc2l6ZSA9PSB1c3BpLT5zX2ZwYikgeworCQlyZXN1bHQgPSB1ZnNfYWxsb2NjZ19ibG9jayAoaW5vZGUsIHVjcGksIGdvYWwsIGVycik7CisJCWlmIChyZXN1bHQgPT0gKHVuc2lnbmVkKS0xKQorCQkJcmV0dXJuIDA7CisJCWdvYWwgPSB1ZnNfZHRvZ2QgKHJlc3VsdCk7CisJCWZvciAoaSA9IGNvdW50OyBpIDwgdXNwaS0+c19mcGI7IGkrKykKKwkJCXViaF9zZXRiaXQgKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGdvYWwgKyBpKTsKKwkJaSA9IHVzcGktPnNfZnBiIC0gY291bnQ7CisJCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIGkpOworCisJCWZzMzJfYWRkKHNiLCAmdWNnLT5jZ19jcy5jc19uZmZyZWUsIGkpOworCQlmczMyX2FkZChzYiwgJnVzYjEtPmZzX2NzdG90YWwuY3NfbmZmcmVlLCBpKTsKKwkJZnMzMl9hZGQoc2IsICZVRlNfU0Ioc2IpLT5mc19jcyhjZ25vKS5jc19uZmZyZWUsIGkpOworCQlmczMyX2FkZChzYiwgJnVjZy0+Y2dfZnJzdW1baV0sIDEpOworCQlnb3RvIHN1Y2NlZDsKKwl9CisKKwlyZXN1bHQgPSB1ZnNfYml0bWFwX3NlYXJjaCAoc2IsIHVjcGksIGdvYWwsIGFsbG9jc2l6ZSk7CisJaWYgKHJlc3VsdCA9PSAodW5zaWduZWQpLTEpCisJCXJldHVybiAwOworCWlmKERRVU9UX0FMTE9DX0JMT0NLKGlub2RlLCBjb3VudCkpIHsKKwkJKmVyciA9IC1FRFFVT1Q7CisJCXJldHVybiAwOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJdWJoX2NscmJpdCAoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgcmVzdWx0ICsgaSk7CisJCisJZnMzMl9zdWIoc2IsICZ1Y2ctPmNnX2NzLmNzX25mZnJlZSwgY291bnQpOworCWZzMzJfc3ViKHNiLCAmdXNiMS0+ZnNfY3N0b3RhbC5jc19uZmZyZWUsIGNvdW50KTsKKwlmczMyX3N1YihzYiwgJlVGU19TQihzYiktPmZzX2NzKGNnbm8pLmNzX25mZnJlZSwgY291bnQpOworCWZzMzJfc3ViKHNiLCAmdWNnLT5jZ19mcnN1bVthbGxvY3NpemVdLCAxKTsKKworCWlmIChjb3VudCAhPSBhbGxvY3NpemUpCisJCWZzMzJfYWRkKHNiLCAmdWNnLT5jZ19mcnN1bVthbGxvY3NpemUgLSBjb3VudF0sIDEpOworCitzdWNjZWQ6CisJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCk7CisJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCk7CisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfU1lOQ0hST05PVVMpIHsKKwkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7CisJCXViaF9sbF9yd19ibG9jayAoV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSZ1Y3BpKTsKKwkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7CisJfQorCXNiLT5zX2RpcnQgPSAxOworCisJcmVzdWx0ICs9IGNnbm8gKiB1c3BpLT5zX2ZwZzsKKwlVRlNEKCgiRVhJVDMsIHJlc3VsdCAldVxuIiwgcmVzdWx0KSkKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdW5zaWduZWQgdWZzX2FsbG9jY2dfYmxvY2sgKHN0cnVjdCBpbm9kZSAqIGlub2RlLAorCXN0cnVjdCB1ZnNfY2dfcHJpdmF0ZV9pbmZvICogdWNwaSwgdW5zaWduZWQgZ29hbCwgaW50ICogZXJyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICogdXNiMTsKKwlzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwICogdWNnOworCXVuc2lnbmVkIHJlc3VsdCwgY3lsbm8sIGJsa25vOworCisJVUZTRCgoIkVOVEVSLCBnb2FsICV1XG4iLCBnb2FsKSkKKworCXNiID0gaW5vZGUtPmlfc2I7CisJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QoVVNQSV9VQkgpOworCXVjZyA9IHViaF9nZXRfdWNnKFVDUElfVUJIKTsKKworCWlmIChnb2FsID09IDApIHsKKwkJZ29hbCA9IHVjcGktPmNfcm90b3I7CisJCWdvdG8gbm9yb3Q7CisJfQorCWdvYWwgPSB1ZnNfYmxrbnVtIChnb2FsKTsKKwlnb2FsID0gdWZzX2R0b2dkIChnb2FsKTsKKwkKKwkvKgorCSAqIElmIHRoZSByZXF1ZXN0ZWQgYmxvY2sgaXMgYXZhaWxhYmxlLCB1c2UgaXQuCisJICovCisJaWYgKHViaF9pc2Jsb2Nrc2V0KFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIHVmc19mcmFnc3RvYmxrcyhnb2FsKSkpIHsKKwkJcmVzdWx0ID0gZ29hbDsKKwkJZ290byBnb3RpdDsKKwl9CisJCitub3JvdDoJCisJcmVzdWx0ID0gdWZzX2JpdG1hcF9zZWFyY2ggKHNiLCB1Y3BpLCBnb2FsLCB1c3BpLT5zX2ZwYik7CisJaWYgKHJlc3VsdCA9PSAodW5zaWduZWQpLTEpCisJCXJldHVybiAodW5zaWduZWQpLTE7CisJdWNwaS0+Y19yb3RvciA9IHJlc3VsdDsKK2dvdGl0OgorCWJsa25vID0gdWZzX2ZyYWdzdG9ibGtzKHJlc3VsdCk7CisJdWJoX2NscmJsb2NrIChVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCBibGtubyk7CisJaWYgKChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX0NHX01BU0spID09IFVGU19DR180NEJTRCkKKwkJdWZzX2NsdXN0ZXJhY2N0IChzYiwgdWNwaSwgYmxrbm8sIC0xKTsKKwlpZihEUVVPVF9BTExPQ19CTE9DSyhpbm9kZSwgdXNwaS0+c19mcGIpKSB7CisJCSplcnIgPSAtRURRVU9UOworCQlyZXR1cm4gKHVuc2lnbmVkKS0xOworCX0KKworCWZzMzJfc3ViKHNiLCAmdWNnLT5jZ19jcy5jc19uYmZyZWUsIDEpOworCWZzMzJfc3ViKHNiLCAmdXNiMS0+ZnNfY3N0b3RhbC5jc19uYmZyZWUsIDEpOworCWZzMzJfc3ViKHNiLCAmVUZTX1NCKHNiKS0+ZnNfY3ModWNwaS0+Y19jZ3gpLmNzX25iZnJlZSwgMSk7CisJY3lsbm8gPSB1ZnNfY2J0b2N5bG5vKHJlc3VsdCk7CisJZnMxNl9zdWIoc2IsICZ1YmhfY2dfYmxrcyh1Y3BpLCBjeWxubywgdWZzX2NidG9ycG9zKHJlc3VsdCkpLCAxKTsKKwlmczMyX3N1YihzYiwgJnViaF9jZ19ibGt0b3QodWNwaSwgY3lsbm8pLCAxKTsKKwkKKwlVRlNEKCgiRVhJVCwgcmVzdWx0ICV1XG4iLCByZXN1bHQpKQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHVuc2lnbmVkIHVmc19iaXRtYXBfc2VhcmNoIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwlzdHJ1Y3QgdWZzX2NnX3ByaXZhdGVfaW5mbyAqIHVjcGksIHVuc2lnbmVkIGdvYWwsIHVuc2lnbmVkIGNvdW50KQoreworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICogdXNiMTsKKwlzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwICogdWNnOworCXVuc2lnbmVkIHN0YXJ0LCBsZW5ndGgsIGxvY2F0aW9uLCByZXN1bHQ7CisJdW5zaWduZWQgcG9zc2l0aW9uLCBmcmFnc2l6ZSwgYmxvY2ttYXAsIG1hc2s7CisJCisJVUZTRCgoIkVOVEVSLCBjZyAldSwgZ29hbCAldSwgY291bnQgJXVcbiIsIHVjcGktPmNfY2d4LCBnb2FsLCBjb3VudCkpCisKKwl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCAoVVNQSV9VQkgpOworCXVjZyA9IHViaF9nZXRfdWNnKFVDUElfVUJIKTsKKworCWlmIChnb2FsKQorCQlzdGFydCA9IHVmc19kdG9nZChnb2FsKSA+PiAzOworCWVsc2UKKwkJc3RhcnQgPSB1Y3BpLT5jX2Zyb3RvciA+PiAzOworCQkKKwlsZW5ndGggPSAoKHVzcGktPnNfZnBnICsgNykgPj4gMykgLSBzdGFydDsKKwlsb2NhdGlvbiA9IHViaF9zY2FuYyhVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmICsgc3RhcnQsIGxlbmd0aCwKKwkJKHVzcGktPnNfZnBiID09IDgpID8gdWZzX2ZyYWd0YWJsZV84ZnBiIDogdWZzX2ZyYWd0YWJsZV9vdGhlciwKKwkJMSA8PCAoY291bnQgLSAxICsgKHVzcGktPnNfZnBiICYgNykpKTsgCisJaWYgKGxvY2F0aW9uID09IDApIHsKKwkJbGVuZ3RoID0gc3RhcnQgKyAxOworCQlsb2NhdGlvbiA9IHViaF9zY2FuYyhVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCBsZW5ndGgsIAorCQkJKHVzcGktPnNfZnBiID09IDgpID8gdWZzX2ZyYWd0YWJsZV84ZnBiIDogdWZzX2ZyYWd0YWJsZV9vdGhlciwKKwkJCTEgPDwgKGNvdW50IC0gMSArICh1c3BpLT5zX2ZwYiAmIDcpKSk7CisJCWlmIChsb2NhdGlvbiA9PSAwKSB7CisJCQl1ZnNfZXJyb3IgKHNiLCAidWZzX2JpdG1hcF9zZWFyY2giLAorCQkJImJpdG1hcCBjb3JydXB0ZWQgb24gY2cgJXUsIHN0YXJ0ICV1LCBsZW5ndGggJXUsIGNvdW50ICV1LCBmcmVlb2ZmICV1XG4iLAorCQkJdWNwaS0+Y19jZ3gsIHN0YXJ0LCBsZW5ndGgsIGNvdW50LCB1Y3BpLT5jX2ZyZWVvZmYpOworCQkJcmV0dXJuICh1bnNpZ25lZCktMTsKKwkJfQorCQlzdGFydCA9IDA7CisJfQorCXJlc3VsdCA9IChzdGFydCArIGxlbmd0aCAtIGxvY2F0aW9uKSA8PCAzOworCXVjcGktPmNfZnJvdG9yID0gcmVzdWx0OworCisJLyoKKwkgKiBmb3VuZCB0aGUgYnl0ZSBpbiB0aGUgbWFwCisJICovCisJYmxvY2ttYXAgPSB1YmhfYmxrbWFwKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIHJlc3VsdCk7CisJZnJhZ3NpemUgPSAwOworCWZvciAocG9zc2l0aW9uID0gMCwgbWFzayA9IDE7IHBvc3NpdGlvbiA8IDg7IHBvc3NpdGlvbisrLCBtYXNrIDw8PSAxKSB7CisJCWlmIChibG9ja21hcCAmIG1hc2spIHsKKwkJCWlmICghKHBvc3NpdGlvbiAmIHVzcGktPnNfZnBibWFzaykpCisJCQkJZnJhZ3NpemUgPSAxOworCQkJZWxzZSAKKwkJCQlmcmFnc2l6ZSsrOworCQl9CisJCWVsc2UgeworCQkJaWYgKGZyYWdzaXplID09IGNvdW50KSB7CisJCQkJcmVzdWx0ICs9IHBvc3NpdGlvbiAtIGNvdW50OworCQkJCVVGU0QoKCJFWElULCByZXN1bHQgJXVcbiIsIHJlc3VsdCkpCisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWZyYWdzaXplID0gMDsKKwkJfQorCX0KKwlpZiAoZnJhZ3NpemUgPT0gY291bnQpIHsKKwkJcmVzdWx0ICs9IHBvc3NpdGlvbiAtIGNvdW50OworCQlVRlNEKCgiRVhJVCwgcmVzdWx0ICV1XG4iLCByZXN1bHQpKQorCQlyZXR1cm4gcmVzdWx0OworCX0KKwl1ZnNfZXJyb3IgKHNiLCAidWZzX2JpdG1hcF9zZWFyY2giLCAiYmxvY2sgbm90IGluIG1hcCBvbiBjZyAldVxuIiwgdWNwaS0+Y19jZ3gpOworCVVGU0QoKCJFWElUIChGQUlMRUQpXG4iKSkKKwlyZXR1cm4gKHVuc2lnbmVkKS0xOworfQorCitzdGF0aWMgdm9pZCB1ZnNfY2x1c3RlcmFjY3Qoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCisJc3RydWN0IHVmc19jZ19wcml2YXRlX2luZm8gKiB1Y3BpLCB1bnNpZ25lZCBibGtubywgaW50IGNudCkKK3sKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJaW50IGksIHN0YXJ0LCBlbmQsIGZvcncsIGJhY2s7CisJCisJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKwlpZiAodXNwaS0+c19jb250aWdzdW1zaXplIDw9IDApCisJCXJldHVybjsKKworCWlmIChjbnQgPiAwKQorCQl1Ymhfc2V0Yml0KFVDUElfVUJILCB1Y3BpLT5jX2NsdXN0ZXJvZmYsIGJsa25vKTsKKwllbHNlCisJCXViaF9jbHJiaXQoVUNQSV9VQkgsIHVjcGktPmNfY2x1c3Rlcm9mZiwgYmxrbm8pOworCisJLyoKKwkgKiBGaW5kIHRoZSBzaXplIG9mIHRoZSBjbHVzdGVyIGdvaW5nIGZvcndhcmQuCisJICovCisJc3RhcnQgPSBibGtubyArIDE7CisJZW5kID0gc3RhcnQgKyB1c3BpLT5zX2NvbnRpZ3N1bXNpemU7CisJaWYgKCBlbmQgPj0gdWNwaS0+Y19uY2x1c3RlcmJsa3MpCisJCWVuZCA9IHVjcGktPmNfbmNsdXN0ZXJibGtzOworCWkgPSB1YmhfZmluZF9uZXh0X3plcm9fYml0IChVQ1BJX1VCSCwgdWNwaS0+Y19jbHVzdGVyb2ZmLCBlbmQsIHN0YXJ0KTsKKwlpZiAoaSA+IGVuZCkKKwkJaSA9IGVuZDsKKwlmb3J3ID0gaSAtIHN0YXJ0OworCQorCS8qCisJICogRmluZCB0aGUgc2l6ZSBvZiB0aGUgY2x1c3RlciBnb2luZyBiYWNrd2FyZC4KKwkgKi8KKwlzdGFydCA9IGJsa25vIC0gMTsKKwllbmQgPSBzdGFydCAtIHVzcGktPnNfY29udGlnc3Vtc2l6ZTsKKwlpZiAoZW5kIDwgMCApIAorCQllbmQgPSAtMTsKKwlpID0gdWJoX2ZpbmRfbGFzdF96ZXJvX2JpdCAoVUNQSV9VQkgsIHVjcGktPmNfY2x1c3Rlcm9mZiwgc3RhcnQsIGVuZCk7CisJaWYgKCBpIDwgZW5kKSAKKwkJaSA9IGVuZDsKKwliYWNrID0gc3RhcnQgLSBpOworCQorCS8qCisJICogQWNjb3VudCBmb3Igb2xkIGNsdXN0ZXIgYW5kIHRoZSBwb3NzaWJseSBuZXcgZm9yd2FyZCBhbmQKKwkgKiBiYWNrIGNsdXN0ZXJzLgorCSAqLworCWkgPSBiYWNrICsgZm9ydyArIDE7CisJaWYgKGkgPiB1c3BpLT5zX2NvbnRpZ3N1bXNpemUpCisJCWkgPSB1c3BpLT5zX2NvbnRpZ3N1bXNpemU7CisJZnMzMl9hZGQoc2IsIChfX2ZzMzIqKXViaF9nZXRfYWRkcihVQ1BJX1VCSCwgdWNwaS0+Y19jbHVzdGVyc3Vtb2ZmICsgKGkgPDwgMikpLCBjbnQpOworCWlmIChiYWNrID4gMCkKKwkJZnMzMl9zdWIoc2IsIChfX2ZzMzIqKXViaF9nZXRfYWRkcihVQ1BJX1VCSCwgdWNwaS0+Y19jbHVzdGVyc3Vtb2ZmICsgKGJhY2sgPDwgMikpLCBjbnQpOworCWlmIChmb3J3ID4gMCkKKwkJZnMzMl9zdWIoc2IsIChfX2ZzMzIqKXViaF9nZXRfYWRkcihVQ1BJX1VCSCwgdWNwaS0+Y19jbHVzdGVyc3Vtb2ZmICsgKGZvcncgPDwgMikpLCBjbnQpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHVmc19mcmFndGFibGVfOGZwYltdID0geworCTB4MDAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDMsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDgsCisJMHgwMSwgMHgwMSwgMHgwMSwgMHgwMywgMHgwMSwgMHgwMSwgMHgwMywgMHgwNSwgMHgwMiwgMHgwMywgMHgwMywgMHgwMiwgMHgwNCwgMHgwNSwgMHgwOCwgMHgxMCwKKwkweDAxLCAweDAxLCAweDAxLCAweDAzLCAweDAxLCAweDAxLCAweDAzLCAweDA1LCAweDAxLCAweDAxLCAweDAxLCAweDAzLCAweDAzLCAweDAzLCAweDA1LCAweDA5LAorCTB4MDIsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDYsIDB4MDQsIDB4MDUsIDB4MDUsIDB4MDYsIDB4MDgsIDB4MDksIDB4MTAsIDB4MjAsCisJMHgwMSwgMHgwMSwgMHgwMSwgMHgwMywgMHgwMSwgMHgwMSwgMHgwMywgMHgwNSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMywgMHgwMywgMHgwMywgMHgwNSwgMHgwOSwJCisJMHgwMSwgMHgwMSwgMHgwMSwgMHgwMywgMHgwMSwgMHgwMSwgMHgwMywgMHgwNSwgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwNSwgMHgwNSwgMHgwOSwgMHgxMSwKKwkweDAyLCAweDAzLCAweDAzLCAweDAyLCAweDAzLCAweDAzLCAweDAyLCAweDA2LCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAyLCAweDAzLCAweDA2LCAweDBBLAorCTB4MDQsIDB4MDUsIDB4MDUsIDB4MDYsIDB4MDUsIDB4MDUsIDB4MDYsIDB4MDQsIDB4MDgsIDB4MDksIDB4MDksIDB4MEEsIDB4MTAsIDB4MTEsIDB4MjAsIDB4NDAsCisJMHgwMSwgMHgwMSwgMHgwMSwgMHgwMywgMHgwMSwgMHgwMSwgMHgwMywgMHgwNSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMywgMHgwMywgMHgwMywgMHgwNSwgMHgwOSwKKwkweDAxLCAweDAxLCAweDAxLCAweDAzLCAweDAxLCAweDAxLCAweDAzLCAweDA1LCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDA1LCAweDA1LCAweDA5LCAweDExLAorCTB4MDEsIDB4MDEsIDB4MDEsIDB4MDMsIDB4MDEsIDB4MDEsIDB4MDMsIDB4MDUsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDUsIDB4MDksCisJMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwNywgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNywgMHgwOSwgMHgwOSwgMHgxMSwgMHgyMSwKKwkweDAyLCAweDAzLCAweDAzLCAweDAyLCAweDAzLCAweDAzLCAweDAyLCAweDA2LCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAyLCAweDAzLCAweDA2LCAweDBBLAorCTB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDcsIDB4MDIsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDYsIDB4MDcsIDB4MEEsIDB4MTIsCisJMHgwNCwgMHgwNSwgMHgwNSwgMHgwNiwgMHgwNSwgMHgwNSwgMHgwNiwgMHgwNCwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNywgMHgwNiwgMHgwNywgMHgwNCwgMHgwQywKKwkweDA4LCAweDA5LCAweDA5LCAweDBBLCAweDA5LCAweDA5LCAweDBBLCAweDBDLCAweDEwLCAweDExLCAweDExLCAweDEyLCAweDIwLCAweDIxLCAweDQwLCAweDgwLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdWZzX2ZyYWd0YWJsZV9vdGhlcltdID0geworCTB4MDAsIDB4MTYsIDB4MTYsIDB4MkEsIDB4MTYsIDB4MTYsIDB4MjYsIDB4NEUsIDB4MTYsIDB4MTYsIDB4MTYsIDB4M0UsIDB4MkEsIDB4M0UsIDB4NEUsIDB4OEEsCisJMHgxNiwgMHgxNiwgMHgxNiwgMHgzRSwgMHgxNiwgMHgxNiwgMHgzNiwgMHg1RSwgMHgxNiwgMHgxNiwgMHgxNiwgMHgzRSwgMHgzRSwgMHgzRSwgMHg1RSwgMHg5RSwKKwkweDE2LCAweDE2LCAweDE2LCAweDNFLCAweDE2LCAweDE2LCAweDM2LCAweDVFLCAweDE2LCAweDE2LCAweDE2LCAweDNFLCAweDNFLCAweDNFLCAweDVFLCAweDlFLAorCTB4MkEsIDB4M0UsIDB4M0UsIDB4MkEsIDB4M0UsIDB4M0UsIDB4MkUsIDB4NkUsIDB4M0UsIDB4M0UsIDB4M0UsIDB4M0UsIDB4MkEsIDB4M0UsIDB4NkUsIDB4QUEsCisJMHgxNiwgMHgxNiwgMHgxNiwgMHgzRSwgMHgxNiwgMHgxNiwgMHgzNiwgMHg1RSwgMHgxNiwgMHgxNiwgMHgxNiwgMHgzRSwgMHgzRSwgMHgzRSwgMHg1RSwgMHg5RSwKKwkweDE2LCAweDE2LCAweDE2LCAweDNFLCAweDE2LCAweDE2LCAweDM2LCAweDVFLCAweDE2LCAweDE2LCAweDE2LCAweDNFLCAweDNFLCAweDNFLCAweDVFLCAweDlFLAorCTB4MjYsIDB4MzYsIDB4MzYsIDB4MkUsIDB4MzYsIDB4MzYsIDB4MjYsIDB4NkUsIDB4MzYsIDB4MzYsIDB4MzYsIDB4M0UsIDB4MkUsIDB4M0UsIDB4NkUsIDB4QUUsCisJMHg0RSwgMHg1RSwgMHg1RSwgMHg2RSwgMHg1RSwgMHg1RSwgMHg2RSwgMHg0RSwgMHg1RSwgMHg1RSwgMHg1RSwgMHg3RSwgMHg2RSwgMHg3RSwgMHg0RSwgMHhDRSwKKwkweDE2LCAweDE2LCAweDE2LCAweDNFLCAweDE2LCAweDE2LCAweDM2LCAweDVFLCAweDE2LCAweDE2LCAweDE2LCAweDNFLCAweDNFLCAweDNFLCAweDVFLCAweDlFLAorCTB4MTYsIDB4MTYsIDB4MTYsIDB4M0UsIDB4MTYsIDB4MTYsIDB4MzYsIDB4NUUsIDB4MTYsIDB4MTYsIDB4MTYsIDB4M0UsIDB4M0UsIDB4M0UsIDB4NUUsIDB4OUUsCisJMHgxNiwgMHgxNiwgMHgxNiwgMHgzRSwgMHgxNiwgMHgxNiwgMHgzNiwgMHg1RSwgMHgxNiwgMHgxNiwgMHgxNiwgMHgzRSwgMHgzRSwgMHgzRSwgMHg1RSwgMHg5RSwKKwkweDNFLCAweDNFLCAweDNFLCAweDNFLCAweDNFLCAweDNFLCAweDNFLCAweDdFLCAweDNFLCAweDNFLCAweDNFLCAweDNFLCAweDNFLCAweDNFLCAweDdFLCAweEJFLAorCTB4MkEsIDB4M0UsIDB4M0UsIDB4MkEsIDB4M0UsIDB4M0UsIDB4MkUsIDB4NkUsIDB4M0UsIDB4M0UsIDB4M0UsIDB4M0UsIDB4MkEsIDB4M0UsIDB4NkUsIDB4QUEsCisJMHgzRSwgMHgzRSwgMHgzRSwgMHgzRSwgMHgzRSwgMHgzRSwgMHgzRSwgMHg3RSwJMHgzRSwgMHgzRSwgMHgzRSwgMHgzRSwgMHgzRSwgMHgzRSwgMHg3RSwgMHhCRSwKKwkweDRFLCAweDVFLCAweDVFLCAweDZFLCAweDVFLCAweDVFLCAweDZFLCAweDRFLCAweDVFLCAweDVFLCAweDVFLCAweDdFLCAweDZFLCAweDdFLCAweDRFLCAweENFLAorCTB4OEEsIDB4OUUsIDB4OUUsIDB4QUEsIDB4OUUsIDB4OUUsIDB4QUUsIDB4Q0UsIDB4OUUsIDB4OUUsIDB4OUUsIDB4QkUsIDB4QUEsIDB4QkUsIDB4Q0UsIDB4OEEsCit9OwpkaWZmIC0tZ2l0IGEvZnMvdWZzL2N5bGluZGVyLmMgYi9mcy91ZnMvY3lsaW5kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGFiYjhiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvdWZzL2N5bGluZGVyLmMKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiAgbGludXgvZnMvdWZzL2N5bGluZGVyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgKKyAqIERhbmllbCBQaXJrbCA8ZGFuaWVsLnBpcmtsQGVtYWlsLmN6PgorICogQ2hhcmxlcyBVbml2ZXJzaXR5LCBGYWN1bHR5IG9mIE1hdGhlbWF0aWNzIGFuZCBQaHlzaWNzCisgKgorICogIGV4dDIgLSBpbm9kZSAoYmxvY2spIGJpdG1hcCBjYWNoaW5nIGluc3BpcmVkCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdWZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgInN3YWIuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCisKKyN1bmRlZiBVRlNfQ1lMSU5ERVJfREVCVUcKKworI2lmZGVmIFVGU19DWUxJTkRFUl9ERUJVRworI2RlZmluZSBVRlNEKHgpIHByaW50aygiKCVzLCAlZCksICVzOiIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgcHJpbnRrIHg7CisjZWxzZQorI2RlZmluZSBVRlNEKHgpCisjZW5kaWYKKworCisvKgorICogUmVhZCBjeWxpbmRlciBncm91cCBpbnRvIGNhY2hlLiBUaGUgbWVtb3J5IHNwYWNlIGZvciB1ZnNfY2dfcHJpdmF0ZV9pbmZvCisgKiBzdHJ1Y3R1cmUgaXMgYWxyZWFkeSBhbGxvY2F0ZWQgZHVyaW5nIHVmc19yZWFkX3N1cGVyLgorICovCitzdGF0aWMgdm9pZCB1ZnNfcmVhZF9jeWxpbmRlciAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCisJdW5zaWduZWQgY2dubywgdW5zaWduZWQgYml0bWFwX25yKQoreworCXN0cnVjdCB1ZnNfc2JfaW5mbyAqIHNiaSA9IFVGU19TQihzYik7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCB1ZnNfY2dfcHJpdmF0ZV9pbmZvICogdWNwaTsKKwlzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwICogdWNnOworCXVuc2lnbmVkIGksIGo7CisKKwlVRlNEKCgiRU5URVIsIGNnbm8gJXUsIGJpdG1hcF9uciAldVxuIiwgY2dubywgYml0bWFwX25yKSkKKwl1c3BpID0gc2JpLT5zX3VzcGk7CisJdWNwaSA9IHNiaS0+c191Y3BpW2JpdG1hcF9ucl07CisJdWNnID0gKHN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKilzYmktPnNfdWNnW2Nnbm9dLT5iX2RhdGE7CisKKwlVQ1BJX1VCSC0+ZnJhZ21lbnQgPSB1ZnNfY2djbWluKGNnbm8pOworCVVDUElfVUJILT5jb3VudCA9IHVzcGktPnNfY2dzaXplID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCS8qCisJICogV2UgaGF2ZSBhbHJlYWR5IHRoZSBmaXJzdCBmcmFnbWVudCBvZiBjeWxpbmRlciBncm91cCBibG9jayBpbiBidWZmZXIKKwkgKi8KKwlVQ1BJX1VCSC0+YmhbMF0gPSBzYmktPnNfdWNnW2Nnbm9dOworCWZvciAoaSA9IDE7IGkgPCBVQ1BJX1VCSC0+Y291bnQ7IGkrKykKKwkJaWYgKCEoVUNQSV9VQkgtPmJoW2ldID0gc2JfYnJlYWQoc2IsIFVDUElfVUJILT5mcmFnbWVudCArIGkpKSkKKwkJCWdvdG8gZmFpbGVkOworCXNiaS0+c19jZ25vW2JpdG1hcF9ucl0gPSBjZ25vOworCQkJCisJdWNwaS0+Y19jZ3gJPSBmczMyX3RvX2NwdShzYiwgdWNnLT5jZ19jZ3gpOworCXVjcGktPmNfbmN5bAk9IGZzMTZfdG9fY3B1KHNiLCB1Y2ctPmNnX25jeWwpOworCXVjcGktPmNfbmlibGsJPSBmczE2X3RvX2NwdShzYiwgdWNnLT5jZ19uaWJsayk7CisJdWNwaS0+Y19uZGJsawk9IGZzMzJfdG9fY3B1KHNiLCB1Y2ctPmNnX25kYmxrKTsKKwl1Y3BpLT5jX3JvdG9yCT0gZnMzMl90b19jcHUoc2IsIHVjZy0+Y2dfcm90b3IpOworCXVjcGktPmNfZnJvdG9yCT0gZnMzMl90b19jcHUoc2IsIHVjZy0+Y2dfZnJvdG9yKTsKKwl1Y3BpLT5jX2lyb3Rvcgk9IGZzMzJfdG9fY3B1KHNiLCB1Y2ctPmNnX2lyb3Rvcik7CisJdWNwaS0+Y19idG90b2ZmCT0gZnMzMl90b19jcHUoc2IsIHVjZy0+Y2dfYnRvdG9mZik7CisJdWNwaS0+Y19ib2ZmCT0gZnMzMl90b19jcHUoc2IsIHVjZy0+Y2dfYm9mZik7CisJdWNwaS0+Y19pdXNlZG9mZiA9IGZzMzJfdG9fY3B1KHNiLCB1Y2ctPmNnX2l1c2Vkb2ZmKTsKKwl1Y3BpLT5jX2ZyZWVvZmYJPSBmczMyX3RvX2NwdShzYiwgdWNnLT5jZ19mcmVlb2ZmKTsKKwl1Y3BpLT5jX25leHRmcmVlb2ZmID0gZnMzMl90b19jcHUoc2IsIHVjZy0+Y2dfbmV4dGZyZWVvZmYpOworCXVjcGktPmNfY2x1c3RlcnN1bW9mZiA9IGZzMzJfdG9fY3B1KHNiLCB1Y2ctPmNnX3UuY2dfNDQuY2dfY2x1c3RlcnN1bW9mZik7CisJdWNwaS0+Y19jbHVzdGVyb2ZmID0gZnMzMl90b19jcHUoc2IsIHVjZy0+Y2dfdS5jZ180NC5jZ19jbHVzdGVyb2ZmKTsKKwl1Y3BpLT5jX25jbHVzdGVyYmxrcyA9IGZzMzJfdG9fY3B1KHNiLCB1Y2ctPmNnX3UuY2dfNDQuY2dfbmNsdXN0ZXJibGtzKTsKKwlVRlNEKCgiRVhJVFxuIikpCisJcmV0dXJuOwkKKwkKK2ZhaWxlZDoKKwlmb3IgKGogPSAxOyBqIDwgaTsgaisrKQorCQlicmVsc2UgKHNiaS0+c191Y2dbal0pOworCXNiaS0+c19jZ25vW2JpdG1hcF9ucl0gPSBVRlNfQ0dOT19FTVBUWTsKKwl1ZnNfZXJyb3IgKHNiLCAidWZzX3JlYWRfY3lsaW5kZXIiLCAiY2FuJ3QgcmVhZCBjeWxpbmRlciBncm91cCBibG9jayAldSIsIGNnbm8pOworfQorCisvKgorICogUmVtb3ZlIGN5bGluZGVyIGdyb3VwIGZyb20gY2FjaGUsIGRvZXNuJ3QgcmVsZWFzZSBtZW1vcnkKKyAqIGFsbG9jYXRlZCBmb3IgY3lsaW5kZXIgZ3JvdXAgKHRoaXMgaXMgZG9uZSBhdCB1ZnNfcHV0X3N1cGVyIG9ubHkpLgorICovCit2b2lkIHVmc19wdXRfY3lsaW5kZXIgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCB1bnNpZ25lZCBiaXRtYXBfbnIpCit7CisJc3RydWN0IHVmc19zYl9pbmZvICogc2JpID0gVUZTX1NCKHNiKTsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7IAorCXN0cnVjdCB1ZnNfY2dfcHJpdmF0ZV9pbmZvICogdWNwaTsKKwlzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwICogdWNnOworCXVuc2lnbmVkIGk7CisKKwlVRlNEKCgiRU5URVIsIGJpdG1hcF9uciAldVxuIiwgYml0bWFwX25yKSkKKworCXVzcGkgPSBzYmktPnNfdXNwaTsKKwlpZiAoc2JpLT5zX2Nnbm9bYml0bWFwX25yXSA9PSBVRlNfQ0dOT19FTVBUWSkgeworCQlVRlNEKCgiRVhJVFxuIikpCisJCXJldHVybjsKKwl9CisJdWNwaSA9IHNiaS0+c191Y3BpW2JpdG1hcF9ucl07CisJdWNnID0gdWJoX2dldF91Y2coVUNQSV9VQkgpOworCisJaWYgKHVzcGktPnNfbmNnID4gVUZTX01BWF9HUk9VUF9MT0FERUQgJiYgYml0bWFwX25yID49IHNiaS0+c19jZ19sb2FkZWQpIHsKKwkJdWZzX3BhbmljIChzYiwgInVmc19wdXRfY3lsaW5kZXIiLCAiaW50ZXJuYWwgZXJyb3IiKTsKKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIHJvdG9yIGlzIG5vdCBzbyBpbXBvcnRhbnQgZGF0YSwgc28gd2UgcHV0IGl0IHRvIGRpc2sgCisJICogYXQgdGhlIGVuZCBvZiB3b3JraW5nIHdpdGggY3lsaW5kZXIKKwkgKi8KKwl1Y2ctPmNnX3JvdG9yID0gY3B1X3RvX2ZzMzIoc2IsIHVjcGktPmNfcm90b3IpOworCXVjZy0+Y2dfZnJvdG9yID0gY3B1X3RvX2ZzMzIoc2IsIHVjcGktPmNfZnJvdG9yKTsKKwl1Y2ctPmNnX2lyb3RvciA9IGNwdV90b19mczMyKHNiLCB1Y3BpLT5jX2lyb3Rvcik7CisJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCk7CisJZm9yIChpID0gMTsgaSA8IFVDUElfVUJILT5jb3VudDsgaSsrKSB7CisJCWJyZWxzZSAoVUNQSV9VQkgtPmJoW2ldKTsKKwl9CisKKwlzYmktPnNfY2dub1tiaXRtYXBfbnJdID0gVUZTX0NHTk9fRU1QVFk7CisJVUZTRCgoIkVYSVRcbiIpKQorfQorCisvKgorICogRmluZCBjeWxpbmRlciBncm91cCBpbiBjYWNoZSBhbmQgcmV0dXJuIGl0IGFzIHBvaW50ZXIuCisgKiBJZiBjeWxpbmRlciBncm91cCBpcyBub3QgaW4gY2FjaGUsIHdlIHdpbGwgbG9hZCBpdCBmcm9tIGRpc2suCisgKgorICogVGhlIGNhY2hlIGlzIG1hbmFnZWQgYnkgTFJVIGFsZ29yaXRobS4gCisgKi8KK3N0cnVjdCB1ZnNfY2dfcHJpdmF0ZV9pbmZvICogdWZzX2xvYWRfY3lsaW5kZXIgKAorCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCB1bnNpZ25lZCBjZ25vKQoreworCXN0cnVjdCB1ZnNfc2JfaW5mbyAqIHNiaSA9IFVGU19TQihzYik7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCB1ZnNfY2dfcHJpdmF0ZV9pbmZvICogdWNwaTsKKwl1bnNpZ25lZCBjZywgaSwgajsKKworCVVGU0QoKCJFTlRFUiwgY2dubyAldVxuIiwgY2dubykpCisKKwl1c3BpID0gc2JpLT5zX3VzcGk7CisJaWYgKGNnbm8gPj0gdXNwaS0+c19uY2cpIHsKKwkJdWZzX3BhbmljIChzYiwgInVmc19sb2FkX2N5bGluZGVyIiwgImludGVybmFsIGVycm9yLCBoaWdoIG51bWJlciBvZiBjZyIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLyoKKwkgKiBDeWxpbmRlciBncm91cCBudW1iZXIgY2cgaXQgaW4gY2FjaGUgYW5kIGl0IHdhcyBsYXN0IHVzZWQKKwkgKi8KKwlpZiAoc2JpLT5zX2Nnbm9bMF0gPT0gY2dubykgeworCQlVRlNEKCgiRVhJVFxuIikpCisJCXJldHVybiBzYmktPnNfdWNwaVswXTsKKwl9CisJLyoKKwkgKiBOdW1iZXIgb2YgY3lsaW5kZXIgZ3JvdXBzIGlzIG5vdCBoaWdoZXIgdGhhbiBVRlNfTUFYX0dST1VQX0xPQURFRAorCSAqLworCWlmICh1c3BpLT5zX25jZyA8PSBVRlNfTUFYX0dST1VQX0xPQURFRCkgeworCQlpZiAoc2JpLT5zX2Nnbm9bY2dub10gIT0gVUZTX0NHTk9fRU1QVFkpIHsKKwkJCWlmIChzYmktPnNfY2dub1tjZ25vXSAhPSBjZ25vKSB7CisJCQkJdWZzX3BhbmljIChzYiwgInVmc19sb2FkX2N5bGluZGVyIiwgImludGVybmFsIGVycm9yLCB3cm9uZyBudW1iZXIgb2YgY2cgaW4gY2FjaGUiKTsKKwkJCQlVRlNEKCgiRVhJVCAoRkFJTEVEKVxuIikpCisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQllbHNlIHsKKwkJCQlVRlNEKCgiRVhJVFxuIikpCisJCQkJcmV0dXJuIHNiaS0+c191Y3BpW2Nnbm9dOworCQkJfQorCQl9IGVsc2UgeworCQkJdWZzX3JlYWRfY3lsaW5kZXIgKHNiLCBjZ25vLCBjZ25vKTsKKwkJCVVGU0QoKCJFWElUXG4iKSkKKwkJCXJldHVybiBzYmktPnNfdWNwaVtjZ25vXTsKKwkJfQorCX0KKwkvKgorCSAqIEN5bGluZGVyIGdyb3VwIG51bWJlciBjZyBpcyBpbiBjYWNoZSBidXQgaXQgd2FzIG5vdCBsYXN0IHVzZWQsIAorCSAqIHdlIHdpbGwgbW92ZSB0byB0aGUgZmlyc3QgcG9zaXRpb24KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2JpLT5zX2NnX2xvYWRlZCAmJiBzYmktPnNfY2dub1tpXSAhPSBjZ25vOyBpKyspOworCWlmIChpIDwgc2JpLT5zX2NnX2xvYWRlZCAmJiBzYmktPnNfY2dub1tpXSA9PSBjZ25vKSB7CisJCWNnID0gc2JpLT5zX2Nnbm9baV07CisJCXVjcGkgPSBzYmktPnNfdWNwaVtpXTsKKwkJZm9yIChqID0gaTsgaiA+IDA7IGotLSkgeworCQkJc2JpLT5zX2Nnbm9bal0gPSBzYmktPnNfY2dub1tqLTFdOworCQkJc2JpLT5zX3VjcGlbal0gPSBzYmktPnNfdWNwaVtqLTFdOworCQl9CisJCXNiaS0+c19jZ25vWzBdID0gY2c7CisJCXNiaS0+c191Y3BpWzBdID0gdWNwaTsKKwkvKgorCSAqIEN5bGluZGVyIGdyb3VwIG51bWJlciBjZyBpcyBub3QgaW4gY2FjaGUsIHdlIHdpbGwgcmVhZCBpdCBmcm9tIGRpc2sKKwkgKiBhbmQgcHV0IGl0IHRvIHRoZSBmaXJzdCBwb3NpdGlvbgorCSAqLworCX0gZWxzZSB7CisJCWlmIChzYmktPnNfY2dfbG9hZGVkIDwgVUZTX01BWF9HUk9VUF9MT0FERUQpCisJCQlzYmktPnNfY2dfbG9hZGVkKys7CisJCWVsc2UKKwkJCXVmc19wdXRfY3lsaW5kZXIgKHNiLCBVRlNfTUFYX0dST1VQX0xPQURFRC0xKTsKKwkJdWNwaSA9IHNiaS0+c191Y3BpW3NiaS0+c19jZ19sb2FkZWQgLSAxXTsKKwkJZm9yIChqID0gc2JpLT5zX2NnX2xvYWRlZCAtIDE7IGogPiAwOyBqLS0pIHsKKwkJCXNiaS0+c19jZ25vW2pdID0gc2JpLT5zX2Nnbm9bai0xXTsKKwkJCXNiaS0+c191Y3BpW2pdID0gc2JpLT5zX3VjcGlbai0xXTsKKwkJfQorCQlzYmktPnNfdWNwaVswXSA9IHVjcGk7CisJCXVmc19yZWFkX2N5bGluZGVyIChzYiwgY2dubywgMCk7CisJfQorCVVGU0QoKCJFWElUXG4iKSkKKwlyZXR1cm4gc2JpLT5zX3VjcGlbMF07Cit9CmRpZmYgLS1naXQgYS9mcy91ZnMvZGlyLmMgYi9mcy91ZnMvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5MTVmYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Vmcy9kaXIuYwpAQCAtMCwwICsxLDYyNyBAQAorLyoKKyAqICBsaW51eC9mcy91ZnMvdWZzX2Rpci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2CisgKiBBZHJpYW4gUm9kcmlndWV6IChhZHJpYW5AZnJhbmtsaW5zLXRvd2VyLnJ1dGdlcnMuZWR1KQorICogTGFib3JhdG9yeSBmb3IgQ29tcHV0ZXIgU2NpZW5jZSBSZXNlYXJjaCBDb21wdXRpbmcgRmFjaWxpdHkKKyAqIFJ1dGdlcnMsIFRoZSBTdGF0ZSBVbml2ZXJzaXR5IG9mIE5ldyBKZXJzZXkKKyAqCisgKiBzd2FiIHN1cHBvcnQgYnkgRnJhbmNvaXMtUmVuZSBSaWRlYXUgPGZhcmVAdHVuZXMub3JnPiAxOTk3MDQwNgorICoKKyAqIDQuNEJTRCAoRnJlZUJTRCkgc3VwcG9ydCBhZGRlZCBvbiBGZWJydWFyeSAxc3QgMTk5OCBieQorICogTmllbHMgS3Jpc3RpYW4gQmVjaCBKZW5zZW4gPG5rYmpAaW1hZ2UuZGs+IHBhcnRpYWxseSBiYXNlZAorICogb24gY29kZSBieSBNYXJ0aW4gdm9uIExvZXdpcyA8bWFydGluQG1pcmEuaXNkbi5jcy50dS1iZXJsaW4uZGU+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91ZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgInN3YWIuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCisKKyN1bmRlZiBVRlNfRElSX0RFQlVHCisKKyNpZmRlZiBVRlNfRElSX0RFQlVHCisjZGVmaW5lIFVGU0QoeCkgcHJpbnRrKCIoJXMsICVkKSwgJXM6ICIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgcHJpbnRrIHg7CisjZWxzZQorI2RlZmluZSBVRlNEKHgpCisjZW5kaWYKKworc3RhdGljIGludAordWZzX2NoZWNrX2Rpcl9lbnRyeSAoY29uc3QgY2hhciAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHVmc19kaXJfZW50cnkgKiwKKwkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgdW5zaWduZWQgbG9uZyk7CisKKworLyoKKyAqIE5PVEUhIHVubGlrZSBzdHJuY21wLCB1ZnNfbWF0Y2ggcmV0dXJucyAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLgorICoKKyAqIGxlbiA8PSBVRlNfTUFYTkFNTEVOIGFuZCBkZSAhPSBOVUxMIGFyZSBndWFyYW50ZWVkIGJ5IGNhbGxlci4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdWZzX21hdGNoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBsZW4sCisJCWNvbnN0IGNoYXIgKiBjb25zdCBuYW1lLCBzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIGRlKQoreworCWlmIChsZW4gIT0gdWZzX2dldF9kZV9uYW1sZW4oc2IsIGRlKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFkZS0+ZF9pbm8pCisJCXJldHVybiAwOworCXJldHVybiAhbWVtY21wKG5hbWUsIGRlLT5kX25hbWUsIGxlbik7Cit9CisKKy8qCisgKiBUaGlzIGlzIGJsYXRhbnRseSBzdG9sZW4gZnJvbSBleHQyZnMKKyAqLworc3RhdGljIGludAordWZzX3JlYWRkaXIgKHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvciA9IDA7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQsIGxibGs7CisJaW50IGksIHN0b3JlZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIGRlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworCWludCBkZV9yZWNsZW47CisJdW5zaWduZWQgZmxhZ3M7CisJdTY0ICAgICBibGs9IDBMOworCisJbG9ja19rZXJuZWwoKTsKKworCXNiID0gaW5vZGUtPmlfc2I7CisJZmxhZ3MgPSBVRlNfU0Ioc2IpLT5zX2ZsYWdzOworCisJVUZTRCgoIkVOVEVSLCBpbm8gJWx1ICBmX3BvcyAlbHVcbiIsIGlub2RlLT5pX2lubywgKHVuc2lnbmVkIGxvbmcpIGZpbHAtPmZfcG9zKSkKKworCXN0b3JlZCA9IDA7CisJYmggPSBOVUxMOworCW9mZnNldCA9IGZpbHAtPmZfcG9zICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOworCisJd2hpbGUgKCFlcnJvciAmJiAhc3RvcmVkICYmIGZpbHAtPmZfcG9zIDwgaW5vZGUtPmlfc2l6ZSkgeworCQlsYmxrID0gKGZpbHAtPmZfcG9zKSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwkJYmxrID0gdWZzX2ZyYWdfbWFwKGlub2RlLCBsYmxrKTsKKwkJaWYgKCFibGsgfHwgIShiaCA9IHNiX2JyZWFkKHNiLCBibGspKSkgeworCQkJLyogWFhYIC0gZXJyb3IgLSBza2lwIHRvIHRoZSBuZXh0IGJsb2NrICovCisJCQlwcmludGsoInVmc19yZWFkZGlyOiAiCisJCQkgICAgICAgImRpciBpbm9kZSAlbHUgaGFzIGEgaG9sZSBhdCBvZmZzZXQgJWx1XG4iLAorCQkJICAgICAgIGlub2RlLT5pX2lubywgKHVuc2lnbmVkIGxvbmcgaW50KWZpbHAtPmZfcG9zKTsKKwkJCWZpbHAtPmZfcG9zICs9IHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldDsKKwkJCWNvbnRpbnVlOworCQl9CisKK3JldmFsaWRhdGU6CisJCS8qIElmIHRoZSBkaXIgYmxvY2sgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0bworCQkgKiByZWFkZGlyKDIpLCB0aGVuIHdlIG1pZ2h0IGJlIHBvaW50aW5nIHRvIGFuIGludmFsaWQKKwkJICogZGlyZW50IHJpZ2h0IG5vdy4gIFNjYW4gZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrCisJCSAqIHRvIG1ha2Ugc3VyZS4gKi8KKwkJaWYgKGZpbHAtPmZfdmVyc2lvbiAhPSBpbm9kZS0+aV92ZXJzaW9uKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2ItPnNfYmxvY2tzaXplICYmIGkgPCBvZmZzZXQ7ICkgeworCQkJCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopKGJoLT5iX2RhdGEgKyBpKTsKKwkJCQkvKiBJdCdzIHRvbyBleHBlbnNpdmUgdG8gZG8gYSBmdWxsCisJCQkJICogZGlyZW50IHRlc3QgZWFjaCB0aW1lIHJvdW5kIHRoaXMKKwkJCQkgKiBsb29wLCBidXQgd2UgZG8gaGF2ZSB0byB0ZXN0IGF0CisJCQkJICogbGVhc3QgdGhhdCBpdCBpcyBub24temVyby4gIEEKKwkJCQkgKiBmYWlsdXJlIHdpbGwgYmUgZGV0ZWN0ZWQgaW4gdGhlCisJCQkJICogZGlyZW50IHRlc3QgYmVsb3cuICovCisJCQkJZGVfcmVjbGVuID0gZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbik7CisJCQkJaWYgKGRlX3JlY2xlbiA8IDEpCisJCQkJCWJyZWFrOworCQkJCWkgKz0gZGVfcmVjbGVuOworCQkJfQorCQkJb2Zmc2V0ID0gaTsKKwkJCWZpbHAtPmZfcG9zID0gKGZpbHAtPmZfcG9zICYgfihzYi0+c19ibG9ja3NpemUgLSAxKSkKKwkJCQl8IG9mZnNldDsKKwkJCWZpbHAtPmZfdmVyc2lvbiA9IGlub2RlLT5pX3ZlcnNpb247CisJCX0KKworCQl3aGlsZSAoIWVycm9yICYmIGZpbHAtPmZfcG9zIDwgaW5vZGUtPmlfc2l6ZQorCQkgICAgICAgJiYgb2Zmc2V0IDwgc2ItPnNfYmxvY2tzaXplKSB7CisJCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSAoYmgtPmJfZGF0YSArIG9mZnNldCk7CisJCQkvKiBYWFggLSBwdXQgaW4gYSByZWFsIHVmc19jaGVja19kaXJfZW50cnkoKSAqLworCQkJaWYgKChkZS0+ZF9yZWNsZW4gPT0gMCkgfHwgKHVmc19nZXRfZGVfbmFtbGVuKHNiLCBkZSkgPT0gMCkpIHsKKwkJCQlmaWxwLT5mX3BvcyA9IChmaWxwLT5mX3BvcyAmCisJCQkJICAgICAgICAgICAgICAoc2ItPnNfYmxvY2tzaXplIC0gMSkpICsKKwkJCQkgICAgICAgICAgICAgICBzYi0+c19ibG9ja3NpemU7CisJCQkJYnJlbHNlKGJoKTsKKwkJCQl1bmxvY2tfa2VybmVsKCk7CisJCQkJcmV0dXJuIHN0b3JlZDsKKwkJCX0KKwkJCWlmICghdWZzX2NoZWNrX2Rpcl9lbnRyeSAoInVmc19yZWFkZGlyIiwgaW5vZGUsIGRlLAorCQkJCQkJICAgYmgsIG9mZnNldCkpIHsKKwkJCQkvKiBPbiBlcnJvciwgc2tpcCB0aGUgZl9wb3MgdG8gdGhlCisJCQkJICAgbmV4dCBibG9jay4gKi8KKwkJCQlmaWxwLT5mX3BvcyA9IChmaWxwLT5mX3BvcyB8CisJCQkJICAgICAgICAgICAgICAoc2ItPnNfYmxvY2tzaXplIC0gMSkpICsKKwkJCQkJICAgICAgIDE7CisJCQkJYnJlbHNlIChiaCk7CisJCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJCXJldHVybiBzdG9yZWQ7CisJCQl9CisJCQlvZmZzZXQgKz0gZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbik7CisJCQlpZiAoZGUtPmRfaW5vKSB7CisJCQkJLyogV2UgbWlnaHQgYmxvY2sgaW4gdGhlIG5leHQgc2VjdGlvbgorCQkJCSAqIGlmIHRoZSBkYXRhIGRlc3RpbmF0aW9uIGlzCisJCQkJICogY3VycmVudGx5IHN3YXBwZWQgb3V0LiAgU28sIHVzZSBhCisJCQkJICogdmVyc2lvbiBzdGFtcCB0byBkZXRlY3Qgd2hldGhlciBvcgorCQkJCSAqIG5vdCB0aGUgZGlyZWN0b3J5IGhhcyBiZWVuIG1vZGlmaWVkCisJCQkJICogZHVyaW5nIHRoZSBjb3B5IG9wZXJhdGlvbi4gKi8KKwkJCQl1bnNpZ25lZCBsb25nIHZlcnNpb24gPSBmaWxwLT5mX3ZlcnNpb247CisJCQkJdW5zaWduZWQgY2hhciBkX3R5cGUgPSBEVF9VTktOT1dOOworCisJCQkJVUZTRCgoImZpbGxkaXIoJXMsJXUpXG4iLCBkZS0+ZF9uYW1lLAorCQkJCQkJCWZzMzJfdG9fY3B1KHNiLCBkZS0+ZF9pbm8pKSkKKwkJCQlVRlNEKCgibmFtbGVuICV1XG4iLCB1ZnNfZ2V0X2RlX25hbWxlbihzYiwgZGUpKSkKKworCQkJCWlmICgoZmxhZ3MgJiBVRlNfREVfTUFTSykgPT0gVUZTX0RFXzQ0QlNEKQorCQkJCQlkX3R5cGUgPSBkZS0+ZF91LmRfNDQuZF90eXBlOworCQkJCWVycm9yID0gZmlsbGRpcihkaXJlbnQsIGRlLT5kX25hbWUsCisJCQkJCQl1ZnNfZ2V0X2RlX25hbWxlbihzYiwgZGUpLCBmaWxwLT5mX3BvcywKKwkJCQkJCWZzMzJfdG9fY3B1KHNiLCBkZS0+ZF9pbm8pLCBkX3R5cGUpOworCQkJCWlmIChlcnJvcikKKwkJCQkJYnJlYWs7CisJCQkJaWYgKHZlcnNpb24gIT0gZmlscC0+Zl92ZXJzaW9uKQorCQkJCQlnb3RvIHJldmFsaWRhdGU7CisJCQkJc3RvcmVkICsrOworCQkJfQorCQkJZmlscC0+Zl9wb3MgKz0gZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbik7CisJCX0KKwkJb2Zmc2V0ID0gMDsKKwkJYnJlbHNlIChiaCk7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRlZmluZSBob3cgZmFyIGFoZWFkIHRvIHJlYWQgZGlyZWN0b3JpZXMgd2hpbGUgc2VhcmNoaW5nIHRoZW0uCisgKi8KKyNkZWZpbmUgTkFNRUlfUkFfQ0hVTktTICAyCisjZGVmaW5lIE5BTUVJX1JBX0JMT0NLUyAgNAorI2RlZmluZSBOQU1FSV9SQV9TSVpFICAgICAgICAoTkFNRUlfUkFfQ0hVTktTICogTkFNRUlfUkFfQkxPQ0tTKQorI2RlZmluZSBOQU1FSV9SQV9JTkRFWChjLGIpICAoKChjKSAqIE5BTUVJX1JBX0JMT0NLUykgKyAoYikpCisKKy8qCisgKgl1ZnNfZmluZF9lbnRyeSgpCisgKgorICogZmluZHMgYW4gZW50cnkgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rvcnkgd2l0aCB0aGUgd2FudGVkIG5hbWUuIEl0CisgKiByZXR1cm5zIHRoZSBjYWNoZSBidWZmZXIgaW4gd2hpY2ggdGhlIGVudHJ5IHdhcyBmb3VuZCwgYW5kIHRoZSBlbnRyeQorICogaXRzZWxmIChhcyBhIHBhcmFtZXRlciAtIHJlc19iaCkuIEl0IGRvZXMgTk9UIHJlYWQgdGhlIGlub2RlIG9mIHRoZQorICogZW50cnkgLSB5b3UnbGwgaGF2ZSB0byBkbyB0aGF0IHlvdXJzZWxmIGlmIHlvdSB3YW50IHRvLgorICovCitzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIHVmc19maW5kX2VudHJ5IChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJc3RydWN0IGJ1ZmZlcl9oZWFkICoqIHJlc19iaCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaF91c2VbTkFNRUlfUkFfU0laRV07CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmhfcmVhZFtOQU1FSV9SQV9TSVpFXTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlpbnQgYmxvY2ssIHRvcmVhZCwgaSwgZXJyOworCXN0cnVjdCBpbm9kZSAqZGlyID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKKwljb25zdCBjaGFyICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwlpbnQgbmFtZWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKworCVVGU0QoKCJFTlRFUiwgZGlyX2lubyAlbHUsIG5hbWUgJXMsIG5hbWxlbiAldVxuIiwgZGlyLT5pX2lubywgbmFtZSwgbmFtZWxlbikpCisJCisJKnJlc19iaCA9IE5VTEw7CisJCisJc2IgPSBkaXItPmlfc2I7CisJCisJaWYgKG5hbWVsZW4gPiBVRlNfTUFYTkFNTEVOKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldCAoYmhfdXNlLCAwLCBzaXplb2YgKGJoX3VzZSkpOworCXRvcmVhZCA9IDA7CisJZm9yIChibG9jayA9IDA7IGJsb2NrIDwgTkFNRUlfUkFfU0laRTsgKytibG9jaykgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKworCQlpZiAoKGJsb2NrIDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSA+PSBkaXItPmlfc2l6ZSkKKwkJCWJyZWFrOworCQliaCA9IHVmc19nZXRmcmFnIChkaXIsIGJsb2NrLCAwLCAmZXJyKTsKKwkJYmhfdXNlW2Jsb2NrXSA9IGJoOworCQlpZiAoYmggJiYgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQliaF9yZWFkW3RvcmVhZCsrXSA9IGJoOworCX0KKworCWZvciAoYmxvY2sgPSAwLCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBkaXItPmlfc2l6ZTsgYmxvY2srKykgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwkJc3RydWN0IHVmc19kaXJfZW50cnkgKiBkZTsKKwkJY2hhciAqIGRsaW1pdDsKKworCQlpZiAoKGJsb2NrICUgTkFNRUlfUkFfQkxPQ0tTKSA9PSAwICYmIHRvcmVhZCkgeworCQkJbGxfcndfYmxvY2sgKFJFQUQsIHRvcmVhZCwgYmhfcmVhZCk7CisJCQl0b3JlYWQgPSAwOworCQl9CisJCWJoID0gYmhfdXNlW2Jsb2NrICUgTkFNRUlfUkFfU0laRV07CisJCWlmICghYmgpIHsKKwkJCXVmc19lcnJvciAoc2IsICJ1ZnNfZmluZF9lbnRyeSIsIAorCQkJCSJkaXJlY3RvcnkgIyVsdSBjb250YWlucyBhIGhvbGUgYXQgb2Zmc2V0ICVsdSIsCisJCQkJZGlyLT5pX2lubywgb2Zmc2V0KTsKKwkJCW9mZnNldCArPSBzYi0+c19ibG9ja3NpemU7CisJCQljb250aW51ZTsKKwkJfQorCQl3YWl0X29uX2J1ZmZlciAoYmgpOworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJCS8qCisJCQkgKiByZWFkIGVycm9yOiBhbGwgYmV0cyBhcmUgb2ZmCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJZGUgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikgYmgtPmJfZGF0YTsKKwkJZGxpbWl0ID0gYmgtPmJfZGF0YSArIHNiLT5zX2Jsb2Nrc2l6ZTsKKwkJd2hpbGUgKChjaGFyICopIGRlIDwgZGxpbWl0ICYmIG9mZnNldCA8IGRpci0+aV9zaXplKSB7CisJCQkvKiB0aGlzIGNvZGUgaXMgZXhlY3V0ZWQgcXVhZHJhdGljYWxseSBvZnRlbiAqLworCQkJLyogZG8gbWluaW1hbCBjaGVja2luZyBieSBoYW5kICovCisJCQlpbnQgZGVfbGVuOworCisJCQlpZiAoKGNoYXIgKikgZGUgKyBuYW1lbGVuIDw9IGRsaW1pdCAmJgorCQkJICAgIHVmc19tYXRjaChzYiwgbmFtZWxlbiwgbmFtZSwgZGUpKSB7CisJCQkJLyogZm91bmQgYSBtYXRjaCAtCisJCQkJanVzdCB0byBiZSBzdXJlLCBkbyBhIGZ1bGwgY2hlY2sgKi8KKwkJCQlpZiAoIXVmc19jaGVja19kaXJfZW50cnkoInVmc19maW5kX2VudHJ5IiwKKwkJCQkgICAgZGlyLCBkZSwgYmgsIG9mZnNldCkpCisJCQkJCWdvdG8gZmFpbGVkOworCQkJCWZvciAoaSA9IDA7IGkgPCBOQU1FSV9SQV9TSVpFOyArK2kpIHsKKwkJCQkJaWYgKGJoX3VzZVtpXSAhPSBiaCkKKwkJCQkJCWJyZWxzZSAoYmhfdXNlW2ldKTsKKwkJCQl9CisJCQkJKnJlc19iaCA9IGJoOworCQkJCXJldHVybiBkZTsKKwkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZXZlbnQgbG9vcGluZyBvbiBhIGJhZCBibG9jayAqLworCQkJZGVfbGVuID0gZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbik7CisJCQlpZiAoZGVfbGVuIDw9IDApCisJCQkJZ290byBmYWlsZWQ7CisJCQlvZmZzZXQgKz0gZGVfbGVuOworCQkJZGUgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikgKChjaGFyICopIGRlICsgZGVfbGVuKTsKKwkJfQorCisJCWJyZWxzZSAoYmgpOworCQlpZiAoKChibG9jayArIE5BTUVJX1JBX1NJWkUpIDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzICkgPj0KKwkJICAgIGRpci0+aV9zaXplKQorCQkJYmggPSBOVUxMOworCQllbHNlCisJCQliaCA9IHVmc19nZXRmcmFnIChkaXIsIGJsb2NrICsgTkFNRUlfUkFfU0laRSwgMCwgJmVycik7CisJCWJoX3VzZVtibG9jayAlIE5BTUVJX1JBX1NJWkVdID0gYmg7CisJCWlmIChiaCAmJiAhYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCWJoX3JlYWRbdG9yZWFkKytdID0gYmg7CisJfQorCitmYWlsZWQ6CisJZm9yIChpID0gMDsgaSA8IE5BTUVJX1JBX1NJWkU7ICsraSkgYnJlbHNlIChiaF91c2VbaV0pOworCVVGU0QoKCJFWElUXG4iKSkKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludAordWZzX2NoZWNrX2Rpcl9lbnRyeSAoY29uc3QgY2hhciAqZnVuY3Rpb24sIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkgICAgIHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCWNvbnN0IGNoYXIgKmVycm9yX21zZyA9IE5VTEw7CisJaW50IHJsZW4gPSBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKTsKKworCWlmIChybGVuIDwgVUZTX0RJUl9SRUNfTEVOKDEpKQorCQllcnJvcl9tc2cgPSAicmVjbGVuIGlzIHNtYWxsZXIgdGhhbiBtaW5pbWFsIjsKKwllbHNlIGlmIChybGVuICUgNCAhPSAwKQorCQllcnJvcl9tc2cgPSAicmVjbGVuICUgNCAhPSAwIjsKKwllbHNlIGlmIChybGVuIDwgVUZTX0RJUl9SRUNfTEVOKHVmc19nZXRfZGVfbmFtbGVuKHNiLCBkZSkpKQorCQllcnJvcl9tc2cgPSAicmVjbGVuIGlzIHRvbyBzbWFsbCBmb3IgbmFtbGVuIjsKKwllbHNlIGlmICgoKGNoYXIgKikgZGUgLSBiaC0+Yl9kYXRhKSArIHJsZW4gPiBkaXItPmlfc2ItPnNfYmxvY2tzaXplKQorCQllcnJvcl9tc2cgPSAiZGlyZWN0b3J5IGVudHJ5IGFjcm9zcyBibG9ja3MiOworCWVsc2UgaWYgKGZzMzJfdG9fY3B1KHNiLCBkZS0+ZF9pbm8pID4gKFVGU19TQihzYiktPnNfdXNwaS0+c19pcGcgKgorCQkJCSAgICAgIFVGU19TQihzYiktPnNfdXNwaS0+c19uY2cpKQorCQllcnJvcl9tc2cgPSAiaW5vZGUgb3V0IG9mIGJvdW5kcyI7CisKKwlpZiAoZXJyb3JfbXNnICE9IE5VTEwpCisJCXVmc19lcnJvciAoc2IsIGZ1bmN0aW9uLCAiYmFkIGVudHJ5IGluIGRpcmVjdG9yeSAjJWx1LCBzaXplICVMdTogJXMgLSAiCisJCQkgICAgIm9mZnNldD0lbHUsIGlub2RlPSVsdSwgcmVjbGVuPSVkLCBuYW1sZW49JWQiLAorCQkJICAgIGRpci0+aV9pbm8sIGRpci0+aV9zaXplLCBlcnJvcl9tc2csIG9mZnNldCwKKwkJCSAgICAodW5zaWduZWQgbG9uZylmczMyX3RvX2NwdShzYiwgZGUtPmRfaW5vKSwKKwkJCSAgICBybGVuLCB1ZnNfZ2V0X2RlX25hbWxlbihzYiwgZGUpKTsKKwkKKwlyZXR1cm4gKGVycm9yX21zZyA9PSBOVUxMID8gMSA6IDApOworfQorCitzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqdWZzX2RvdGRvdChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqcCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSB1ZnNfYnJlYWQgKGRpciwgMCwgMCwgJmVycik7CisJc3RydWN0IHVmc19kaXJfZW50cnkgKnJlcyA9IE5VTEw7CisKKwlpZiAoYmgpIHsKKwkJcmVzID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopIGJoLT5iX2RhdGE7CisJCXJlcyA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSgoY2hhciAqKXJlcyArCisJCQlmczE2X3RvX2NwdShkaXItPmlfc2IsIHJlcy0+ZF9yZWNsZW4pKTsKKwl9CisJKnAgPSBiaDsKKwlyZXR1cm4gcmVzOworfQoraW5vX3QgdWZzX2lub2RlX2J5X25hbWUoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW5vX3QgcmVzID0gMDsKKwlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIGRlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwlkZSA9IHVmc19maW5kX2VudHJ5IChkZW50cnksICZiaCk7CisJaWYgKGRlKSB7CisJCXJlcyA9IGZzMzJfdG9fY3B1KGRpci0+aV9zYiwgZGUtPmRfaW5vKTsKKwkJYnJlbHNlKGJoKTsKKwl9CisJcmV0dXJuIHJlczsKK30KKwordm9pZCB1ZnNfc2V0X2xpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkZSwKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlkaXItPmlfdmVyc2lvbisrOworCWRlLT5kX2lubyA9IGNwdV90b19mczMyKGRpci0+aV9zYiwgaW5vZGUtPmlfaW5vKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKElTX0RJUlNZTkMoZGlyKSkKKwkJc3luY19kaXJ0eV9idWZmZXIoYmgpOworCWJyZWxzZSAoYmgpOworfQorCisvKgorICoJdWZzX2FkZF9lbnRyeSgpCisgKgorICogYWRkcyBhIGZpbGUgZW50cnkgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnksIHVzaW5nIHRoZSBzYW1lCisgKiBzZW1hbnRpY3MgYXMgdWZzX2ZpbmRfZW50cnkoKS4gSXQgcmV0dXJucyBOVUxMIGlmIGl0IGZhaWxlZC4KKyAqLworaW50IHVmc19hZGRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXVuc2lnbmVkIGZyYWdvZmY7CisJdW5zaWduZWQgc2hvcnQgcmVjX2xlbjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIGRlLCAqIGRlMTsKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJaW50IG5hbWVsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJaW50IGVycjsKKworCVVGU0QoKCJFTlRFUiwgbmFtZSAlcywgbmFtZWxlbiAldVxuIiwgbmFtZSwgbmFtZWxlbikpCisJCisJc2IgPSBkaXItPmlfc2I7CisJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKworCWlmICghbmFtZWxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJYmggPSB1ZnNfYnJlYWQgKGRpciwgMCwgMCwgJmVycik7CisJaWYgKCFiaCkKKwkJcmV0dXJuIGVycjsKKwlyZWNfbGVuID0gVUZTX0RJUl9SRUNfTEVOKG5hbWVsZW4pOworCW9mZnNldCA9IDA7CisJZGUgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikgYmgtPmJfZGF0YTsKKwl3aGlsZSAoMSkgeworCQlpZiAoKGNoYXIgKilkZSA+PSBVRlNfU0VDVE9SX1NJWkUgKyBiaC0+Yl9kYXRhKSB7CisJCQlmcmFnb2ZmID0gb2Zmc2V0ICYgfnVzcGktPnNfZm1hc2s7CisJCQlpZiAoZnJhZ29mZiAhPSAwICYmIGZyYWdvZmYgIT0gVUZTX1NFQ1RPUl9TSVpFKQorCQkJCXVmc19lcnJvciAoc2IsICJ1ZnNfYWRkX2VudHJ5IiwgImludGVybmFsIGVycm9yIgorCQkJCQkiIGZyYWdvZmYgJXUiLCBmcmFnb2ZmKTsKKwkJCWlmICghZnJhZ29mZikgeworCQkJCWJyZWxzZSAoYmgpOworCQkJCWJoID0gdWZzX2JyZWFkIChkaXIsIG9mZnNldCA+PiBzYi0+c19ibG9ja3NpemVfYml0cywgMSwgJmVycik7CisJCQkJaWYgKCFiaCkKKwkJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJCWlmIChkaXItPmlfc2l6ZSA8PSBvZmZzZXQpIHsKKwkJCQlpZiAoZGlyLT5pX3NpemUgPT0gMCkgeworCQkJCQlicmVsc2UoYmgpOworCQkJCQlyZXR1cm4gLUVOT0VOVDsKKwkJCQl9CisJCQkJZGUgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikgKGJoLT5iX2RhdGEgKyBmcmFnb2ZmKTsKKwkJCQlkZS0+ZF9pbm8gPSAwOworCQkJCWRlLT5kX3JlY2xlbiA9IGNwdV90b19mczE2KHNiLCBVRlNfU0VDVE9SX1NJWkUpOworCQkJCXVmc19zZXRfZGVfbmFtbGVuKHNiLCBkZSwgMCk7CisJCQkJZGlyLT5pX3NpemUgPSBvZmZzZXQgKyBVRlNfU0VDVE9SX1NJWkU7CisJCQkJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCQkJfSBlbHNlIHsKKwkJCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSBiaC0+Yl9kYXRhOworCQkJfQorCQl9CisJCWlmICghdWZzX2NoZWNrX2Rpcl9lbnRyeSAoInVmc19hZGRfZW50cnkiLCBkaXIsIGRlLCBiaCwgb2Zmc2V0KSkgeworCQkJYnJlbHNlIChiaCk7CisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJfQorCQlpZiAodWZzX21hdGNoKHNiLCBuYW1lbGVuLCBuYW1lLCBkZSkpIHsKKwkJCWJyZWxzZSAoYmgpOworCQkJcmV0dXJuIC1FRVhJU1Q7CisJCX0KKwkJaWYgKGRlLT5kX2lubyA9PSAwICYmIGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pID49IHJlY19sZW4pCisJCQlicmVhazsKKwkJCQorCQlpZiAoZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbikgPj0KKwkJICAgICBVRlNfRElSX1JFQ19MRU4odWZzX2dldF9kZV9uYW1sZW4oc2IsIGRlKSkgKyByZWNfbGVuKQorCQkJYnJlYWs7CisJCW9mZnNldCArPSBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKTsKKwkJZGUgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikgKChjaGFyICopIGRlICsgZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbikpOworCX0KKworCWlmIChkZS0+ZF9pbm8pIHsKKwkJZGUxID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopICgoY2hhciAqKSBkZSArCisJCQlVRlNfRElSX1JFQ19MRU4odWZzX2dldF9kZV9uYW1sZW4oc2IsIGRlKSkpOworCQlkZTEtPmRfcmVjbGVuID0KKwkJCWNwdV90b19mczE2KHNiLCBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKSAtCisJCQkJVUZTX0RJUl9SRUNfTEVOKHVmc19nZXRfZGVfbmFtbGVuKHNiLCBkZSkpKTsKKwkJZGUtPmRfcmVjbGVuID0KKwkJCWNwdV90b19mczE2KHNiLCBVRlNfRElSX1JFQ19MRU4odWZzX2dldF9kZV9uYW1sZW4oc2IsIGRlKSkpOworCQlkZSA9IGRlMTsKKwl9CisJZGUtPmRfaW5vID0gMDsKKwl1ZnNfc2V0X2RlX25hbWxlbihzYiwgZGUsIG5hbWVsZW4pOworCW1lbWNweSAoZGUtPmRfbmFtZSwgbmFtZSwgbmFtZWxlbiArIDEpOworCWRlLT5kX2lubyA9IGNwdV90b19mczMyKHNiLCBpbm9kZS0+aV9pbm8pOworCXVmc19zZXRfZGVfdHlwZShzYiwgZGUsIGlub2RlLT5pX21vZGUpOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlpZiAoSVNfRElSU1lOQyhkaXIpKQorCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CisJYnJlbHNlIChiaCk7CisJZGlyLT5pX210aW1lID0gZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlkaXItPmlfdmVyc2lvbisrOworCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKKworCVVGU0QoKCJFWElUXG4iKSkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHVmc19kZWxldGVfZW50cnkgZGVsZXRlcyBhIGRpcmVjdG9yeSBlbnRyeSBieSBtZXJnaW5nIGl0IHdpdGggdGhlCisgKiBwcmV2aW91cyBlbnRyeS4KKyAqLworaW50IHVmc19kZWxldGVfZW50cnkgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIGRpciwKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCApCisJCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IHVmc19kaXJfZW50cnkgKiBkZSwgKiBwZGU7CisJdW5zaWduZWQgaTsKKwkKKwlVRlNEKCgiRU5URVJcbiIpKQorCisJc2IgPSBpbm9kZS0+aV9zYjsKKwlpID0gMDsKKwlwZGUgPSBOVUxMOworCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopIGJoLT5iX2RhdGE7CisJCisJVUZTRCgoImlubyAldSwgcmVjbGVuICV1LCBuYW1sZW4gJXUsIG5hbWUgJXNcbiIsCisJCWZzMzJfdG9fY3B1KHNiLCBkZS0+ZF9pbm8pLAorCQlmczE2dG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pLAorCQl1ZnNfZ2V0X2RlX25hbWxlbihzYiwgZGUpLCBkZS0+ZF9uYW1lKSkKKworCXdoaWxlIChpIDwgYmgtPmJfc2l6ZSkgeworCQlpZiAoIXVmc19jaGVja19kaXJfZW50cnkgKCJ1ZnNfZGVsZXRlX2VudHJ5IiwgaW5vZGUsIGRlLCBiaCwgaSkpIHsKKwkJCWJyZWxzZShiaCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpZiAoZGUgPT0gZGlyKSAgeworCQkJaWYgKHBkZSkKKwkJCQlmczE2X2FkZChzYiwgJnBkZS0+ZF9yZWNsZW4sCisJCQkJCWZzMTZfdG9fY3B1KHNiLCBkaXItPmRfcmVjbGVuKSk7CisJCQlkaXItPmRfaW5vID0gMDsKKwkJCWlub2RlLT5pX3ZlcnNpb24rKzsKKwkJCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQlpZiAoSVNfRElSU1lOQyhpbm9kZSkpCisJCQkJc3luY19kaXJ0eV9idWZmZXIoYmgpOworCQkJYnJlbHNlKGJoKTsKKwkJCVVGU0QoKCJFWElUXG4iKSkKKwkJCXJldHVybiAwOworCQl9CisJCWkgKz0gZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbik7CisJCWlmIChpID09IFVGU19TRUNUT1JfU0laRSkgcGRlID0gTlVMTDsKKwkJZWxzZSBwZGUgPSBkZTsKKwkJZGUgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikKKwkJICAgICgoY2hhciAqKSBkZSArIGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pKTsKKwkJaWYgKGkgPT0gVUZTX1NFQ1RPUl9TSVpFICYmIGRlLT5kX3JlY2xlbiA9PSAwKQorCQkJYnJlYWs7CisJfQorCVVGU0QoKCJFWElUXG4iKSkKKwlicmVsc2UoYmgpOworCXJldHVybiAtRU5PRU5UOworfQorCitpbnQgdWZzX21ha2VfZW1wdHkoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGRpcl9ibG9jazsKKwlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIGRlOworCWludCBlcnI7CisKKwlkaXJfYmxvY2sgPSB1ZnNfYnJlYWQgKGlub2RlLCAwLCAxLCAmZXJyKTsKKwlpZiAoIWRpcl9ibG9jaykKKwkJcmV0dXJuIGVycjsKKworCWlub2RlLT5pX2Jsb2NrcyA9IHNiLT5zX2Jsb2Nrc2l6ZSAvIFVGU19TRUNUT1JfU0laRTsKKwlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSBkaXJfYmxvY2stPmJfZGF0YTsKKwlkZS0+ZF9pbm8gPSBjcHVfdG9fZnMzMihzYiwgaW5vZGUtPmlfaW5vKTsKKwl1ZnNfc2V0X2RlX3R5cGUoc2IsIGRlLCBpbm9kZS0+aV9tb2RlKTsKKwl1ZnNfc2V0X2RlX25hbWxlbihzYiwgZGUsIDEpOworCWRlLT5kX3JlY2xlbiA9IGNwdV90b19mczE2KHNiLCBVRlNfRElSX1JFQ19MRU4oMSkpOworCXN0cmNweSAoZGUtPmRfbmFtZSwgIi4iKTsKKwlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKQorCQkoKGNoYXIgKilkZSArIGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pKTsKKwlkZS0+ZF9pbm8gPSBjcHVfdG9fZnMzMihzYiwgZGlyLT5pX2lubyk7CisJdWZzX3NldF9kZV90eXBlKHNiLCBkZSwgZGlyLT5pX21vZGUpOworCWRlLT5kX3JlY2xlbiA9IGNwdV90b19mczE2KHNiLCBVRlNfU0VDVE9SX1NJWkUgLSBVRlNfRElSX1JFQ19MRU4oMSkpOworCXVmc19zZXRfZGVfbmFtbGVuKHNiLCBkZSwgMik7CisJc3RyY3B5IChkZS0+ZF9uYW1lLCAiLi4iKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShkaXJfYmxvY2spOworCWJyZWxzZSAoZGlyX2Jsb2NrKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHJvdXRpbmUgdG8gY2hlY2sgdGhhdCB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBpcyBlbXB0eSAoZm9yIHJtZGlyKQorICovCitpbnQgdWZzX2VtcHR5X2RpciAoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IHVmc19kaXJfZW50cnkgKiBkZSwgKiBkZTE7CisJaW50IGVycjsKKwkKKwlzYiA9IGlub2RlLT5pX3NiOworCisJaWYgKGlub2RlLT5pX3NpemUgPCBVRlNfRElSX1JFQ19MRU4oMSkgKyBVRlNfRElSX1JFQ19MRU4oMikgfHwKKwkgICAgIShiaCA9IHVmc19icmVhZCAoaW5vZGUsIDAsIDAsICZlcnIpKSkgeworCSAgICAJdWZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiZW1wdHlfZGlyIiwKKwkJCSAgICAgICJiYWQgZGlyZWN0b3J5IChkaXIgIyVsdSkgLSBubyBkYXRhIGJsb2NrIiwKKwkJCSAgICAgIGlub2RlLT5pX2lubyk7CisJCXJldHVybiAxOworCX0KKwlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSBiaC0+Yl9kYXRhOworCWRlMSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKQorCQkoKGNoYXIgKilkZSArIGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pKTsKKwlpZiAoZnMzMl90b19jcHUoc2IsIGRlLT5kX2lubykgIT0gaW5vZGUtPmlfaW5vIHx8IGRlMS0+ZF9pbm8gPT0gMCB8fAorCSAgICAgc3RyY21wICgiLiIsIGRlLT5kX25hbWUpIHx8IHN0cmNtcCAoIi4uIiwgZGUxLT5kX25hbWUpKSB7CisJICAgIAl1ZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJlbXB0eV9kaXIiLAorCQkJICAgICAgImJhZCBkaXJlY3RvcnkgKGRpciAjJWx1KSAtIG5vIGAuJyBvciBgLi4nIiwKKwkJCSAgICAgIGlub2RlLT5pX2lubyk7CisJCXJldHVybiAxOworCX0KKwlvZmZzZXQgPSBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKSArIGZzMTZfdG9fY3B1KHNiLCBkZTEtPmRfcmVjbGVuKTsKKwlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKQorCQkoKGNoYXIgKilkZTEgKyBmczE2X3RvX2NwdShzYiwgZGUxLT5kX3JlY2xlbikpOworCXdoaWxlIChvZmZzZXQgPCBpbm9kZS0+aV9zaXplICkgeworCQlpZiAoIWJoIHx8ICh2b2lkICopIGRlID49ICh2b2lkICopIChiaC0+Yl9kYXRhICsgc2ItPnNfYmxvY2tzaXplKSkgeworCQkJYnJlbHNlIChiaCk7CisJCQliaCA9IHVmc19icmVhZCAoaW5vZGUsIG9mZnNldCA+PiBzYi0+c19ibG9ja3NpemVfYml0cywgMSwgJmVycik7CisJIAkJaWYgKCFiaCkgeworCQkJCXVmc19lcnJvciAoc2IsICJlbXB0eV9kaXIiLAorCQkJCQkgICAgImRpcmVjdG9yeSAjJWx1IGNvbnRhaW5zIGEgaG9sZSBhdCBvZmZzZXQgJWx1IiwKKwkJCQkJICAgIGlub2RlLT5pX2lubywgb2Zmc2V0KTsKKwkJCQlvZmZzZXQgKz0gc2ItPnNfYmxvY2tzaXplOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZGUgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikgYmgtPmJfZGF0YTsKKwkJfQorCQlpZiAoIXVmc19jaGVja19kaXJfZW50cnkgKCJlbXB0eV9kaXIiLCBpbm9kZSwgZGUsIGJoLCBvZmZzZXQpKSB7CisJCQlicmVsc2UgKGJoKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChkZS0+ZF9pbm8pIHsKKwkJCWJyZWxzZSAoYmgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJb2Zmc2V0ICs9IGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pOworCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKQorCQkJKChjaGFyICopZGUgKyBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKSk7CisJfQorCWJyZWxzZSAoYmgpOworCXJldHVybiAxOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVmc19kaXJfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gdWZzX3JlYWRkaXIsCisJLmZzeW5jCQk9IGZpbGVfZnN5bmMsCit9OwpkaWZmIC0tZ2l0IGEvZnMvdWZzL2ZpbGUuYyBiL2ZzL3Vmcy9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2OWQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Vmcy9maWxlLmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqICBsaW51eC9mcy91ZnMvZmlsZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4CisgKiBEYW5pZWwgUGlya2wgPGRhbmllbC5waXJrbEBlbWFpbC5jej4KKyAqIENoYXJsZXMgVW5pdmVyc2l0eSwgRmFjdWx0eSBvZiBNYXRoZW1hdGljcyBhbmQgUGh5c2ljcworICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2ZzL2V4dDIvZmlsZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2ZzL21pbml4L2ZpbGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIGV4dDIgZnMgcmVndWxhciBmaWxlIGhhbmRsaW5nIHByaW1pdGl2ZXMKKyAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdWZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKy8qCisgKiBXZSBoYXZlIG1vc3RseSBOVUxMJ3MgaGVyZTogdGhlIGN1cnJlbnQgZGVmYXVsdHMgYXJlIG9rIGZvcgorICogdGhlIHVmcyBmaWxlc3lzdGVtLgorICovCisgCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVmc19maWxlX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfZmlsZV9yZWFkLAorCS53cml0ZQkJPSBnZW5lcmljX2ZpbGVfd3JpdGUsCisJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCisJLm9wZW4gICAgICAgICAgID0gZ2VuZXJpY19maWxlX29wZW4sCisJLnNlbmRmaWxlCT0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkudHJ1bmNhdGUJPSB1ZnNfdHJ1bmNhdGUsCit9OwpkaWZmIC0tZ2l0IGEvZnMvdWZzL2lhbGxvYy5jIGIvZnMvdWZzL2lhbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYTZiMTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZnMvaWFsbG9jLmMKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiAgbGludXgvZnMvdWZzL2lhbGxvYy5jCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4CisgKiBEYW5pZWwgUGlya2wgPGRhbmllbC5waXJrbEBlbWFpbC5jej4KKyAqIENoYXJsZXMgVW5pdmVyc2l0eSwgRmFjdWx0eSBvZiBNYXRoZW1hdGljcyBhbmQgUGh5c2ljcworICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2ZzL2V4dDIvaWFsbG9jLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIEJTRCB1ZnMtaW5zcGlyZWQgaW5vZGUgYW5kIGRpcmVjdG9yeSBhbGxvY2F0aW9uIGJ5IAorICogIFN0ZXBoZW4gVHdlZWRpZSAoc2N0QGRjcy5lZC5hYy51ayksIDE5OTMKKyAqICBCaWctZW5kaWFuIHRvIGxpdHRsZS1lbmRpYW4gYnl0ZS1zd2FwcGluZy9iaXRtYXBzIGJ5CisgKiAgICAgICAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KSwgMTk5NQorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Vmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSAic3dhYi5oIgorI2luY2x1ZGUgInV0aWwuaCIKKworI3VuZGVmIFVGU19JQUxMT0NfREVCVUcKKworI2lmZGVmIFVGU19JQUxMT0NfREVCVUcKKyNkZWZpbmUgVUZTRCh4KSBwcmludGsoIiglcywgJWQpLCAlczogIiwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOyBwcmludGsgeDsKKyNlbHNlCisjZGVmaW5lIFVGU0QoeCkKKyNlbmRpZgorCisvKgorICogTk9URSEgV2hlbiB3ZSBnZXQgdGhlIGlub2RlLCB3ZSdyZSB0aGUgb25seSBwZW9wbGUKKyAqIHRoYXQgaGF2ZSBhY2Nlc3MgdG8gaXQsIGFuZCBhcyBzdWNoIHRoZXJlIGFyZSBubworICogcmFjZSBjb25kaXRpb25zIHdlIGhhdmUgdG8gd29ycnkgYWJvdXQuIFRoZSBpbm9kZQorICogaXMgbm90IG9uIHRoZSBoYXNoLWxpc3RzLCBhbmQgaXQgY2Fubm90IGJlIHJlYWNoZWQKKyAqIHRocm91Z2ggdGhlIGZpbGVzeXN0ZW0gYmVjYXVzZSB0aGUgZGlyZWN0b3J5IGVudHJ5CisgKiBoYXMgYmVlbiBkZWxldGVkIGVhcmxpZXIuCisgKgorICogSE9XRVZFUjogd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB3ZSBnZXQgbm8gYWxpYXNlcywKKyAqIHdoaWNoIG1lYW5zIHRoYXQgd2UgaGF2ZSB0byBjYWxsICJjbGVhcl9pbm9kZSgpIgorICogX2JlZm9yZV8gd2UgbWFyayB0aGUgaW5vZGUgbm90IGluIHVzZSBpbiB0aGUgaW5vZGUKKyAqIGJpdG1hcHMuIE90aGVyd2lzZSBhIG5ld2x5IGNyZWF0ZWQgZmlsZSBtaWdodCB1c2UKKyAqIHRoZSBzYW1lIGlub2RlIG51bWJlciAobm90IGFjdHVhbGx5IHRoZSBzYW1lIHBvaW50ZXIKKyAqIHRob3VnaCksIGFuZCB0aGVuIHdlJ2QgaGF2ZSB0d28gaW5vZGVzIHNoYXJpbmcgdGhlCisgKiBzYW1lIGlub2RlIG51bWJlciBhbmQgc3BhY2Ugb24gdGhlIGhhcmRkaXNrLgorICovCit2b2lkIHVmc19mcmVlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqIHVzYjE7CisJc3RydWN0IHVmc19jZ19wcml2YXRlX2luZm8gKiB1Y3BpOworCXN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKiB1Y2c7CisJaW50IGlzX2RpcmVjdG9yeTsKKwl1bnNpZ25lZCBpbm8sIGNnLCBiaXQ7CisJCisJVUZTRCgoIkVOVEVSLCBpbm8gJWx1XG4iLCBpbm9kZS0+aV9pbm8pKQorCisJc2IgPSBpbm9kZS0+aV9zYjsKKwl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7CisJCisJaW5vID0gaW5vZGUtPmlfaW5vOworCisJbG9ja19zdXBlciAoc2IpOworCisJaWYgKCEoKGlubyA+IDEpICYmIChpbm8gPCAodXNwaS0+c19uY2cgKiB1c3BpLT5zX2lwZyApKSkpIHsKKwkJdWZzX3dhcm5pbmcoc2IsICJ1ZnNfZnJlZV9pbm9kZSIsICJyZXNlcnZlZCBpbm9kZSBvciBub25leGlzdGVudCBpbm9kZSAldVxuIiwgaW5vKTsKKwkJdW5sb2NrX3N1cGVyIChzYik7CisJCXJldHVybjsKKwl9CisJCisJY2cgPSB1ZnNfaW5vdG9jZyAoaW5vKTsKKwliaXQgPSB1ZnNfaW5vdG9jZ29mZiAoaW5vKTsKKwl1Y3BpID0gdWZzX2xvYWRfY3lsaW5kZXIgKHNiLCBjZyk7CisJaWYgKCF1Y3BpKSB7CisJCXVubG9ja19zdXBlciAoc2IpOworCQlyZXR1cm47CisJfQorCXVjZyA9IHViaF9nZXRfdWNnKFVDUElfVUJIKTsKKwlpZiAoIXVmc19jZ19jaGttYWdpYyhzYiwgdWNnKSkKKwkJdWZzX3BhbmljIChzYiwgInVmc19mcmVlX2ZyYWdtZW50cyIsICJpbnRlcm5hbCBlcnJvciwgYmFkIGNnIG1hZ2ljIG51bWJlciIpOworCisJdWNnLT5jZ190aW1lID0gY3B1X3RvX2ZzMzIoc2IsIGdldF9zZWNvbmRzKCkpOworCisJaXNfZGlyZWN0b3J5ID0gU19JU0RJUihpbm9kZS0+aV9tb2RlKTsKKworCURRVU9UX0ZSRUVfSU5PREUoaW5vZGUpOworCURRVU9UX0RST1AoaW5vZGUpOworCisJY2xlYXJfaW5vZGUgKGlub2RlKTsKKworCWlmICh1YmhfaXNjbHIgKFVDUElfVUJILCB1Y3BpLT5jX2l1c2Vkb2ZmLCBiaXQpKQorCQl1ZnNfZXJyb3Ioc2IsICJ1ZnNfZnJlZV9pbm9kZSIsICJiaXQgYWxyZWFkeSBjbGVhcmVkIGZvciBpbm9kZSAldSIsIGlubyk7CisJZWxzZSB7CisJCXViaF9jbHJiaXQgKFVDUElfVUJILCB1Y3BpLT5jX2l1c2Vkb2ZmLCBiaXQpOworCQlpZiAoaW5vIDwgdWNwaS0+Y19pcm90b3IpCisJCQl1Y3BpLT5jX2lyb3RvciA9IGlubzsKKwkJZnMzMl9hZGQoc2IsICZ1Y2ctPmNnX2NzLmNzX25pZnJlZSwgMSk7CisJCWZzMzJfYWRkKHNiLCAmdXNiMS0+ZnNfY3N0b3RhbC5jc19uaWZyZWUsIDEpOworCQlmczMyX2FkZChzYiwgJlVGU19TQihzYiktPmZzX2NzKGNnKS5jc19uaWZyZWUsIDEpOworCisJCWlmIChpc19kaXJlY3RvcnkpIHsKKwkJCWZzMzJfc3ViKHNiLCAmdWNnLT5jZ19jcy5jc19uZGlyLCAxKTsKKwkJCWZzMzJfc3ViKHNiLCAmdXNiMS0+ZnNfY3N0b3RhbC5jc19uZGlyLCAxKTsKKwkJCWZzMzJfc3ViKHNiLCAmVUZTX1NCKHNiKS0+ZnNfY3MoY2cpLmNzX25kaXIsIDEpOworCQl9CisJfQorCisJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCk7CisJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCk7CisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfU1lOQ0hST05PVVMpIHsKKwkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7CisJCXViaF9sbF9yd19ibG9jayAoV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSAmdWNwaSk7CisJCXViaF93YWl0X29uX2J1ZmZlciAoVUNQSV9VQkgpOworCX0KKwkKKwlzYi0+c19kaXJ0ID0gMTsKKwl1bmxvY2tfc3VwZXIgKHNiKTsKKwlVRlNEKCgiRVhJVFxuIikpCit9CisKKy8qCisgKiBUaGVyZSBhcmUgdHdvIHBvbGljaWVzIGZvciBhbGxvY2F0aW5nIGFuIGlub2RlLiAgSWYgdGhlIG5ldyBpbm9kZSBpcworICogYSBkaXJlY3RvcnksIHRoZW4gYSBmb3J3YXJkIHNlYXJjaCBpcyBtYWRlIGZvciBhIGJsb2NrIGdyb3VwIHdpdGggYm90aAorICogZnJlZSBzcGFjZSBhbmQgYSBsb3cgZGlyZWN0b3J5LXRvLWlub2RlIHJhdGlvOyBpZiB0aGF0IGZhaWxzLCB0aGVuIG9mCisgKiB0aGUgZ3JvdXBzIHdpdGggYWJvdmUtYXZlcmFnZSBmcmVlIHNwYWNlLCB0aGF0IGdyb3VwIHdpdGggdGhlIGZld2VzdAorICogZGlyZWN0b3JpZXMgYWxyZWFkeSBpcyBjaG9zZW4uCisgKgorICogRm9yIG90aGVyIGlub2Rlcywgc2VhcmNoIGZvcndhcmQgZnJvbSB0aGUgcGFyZW50IGRpcmVjdG9yeSdzIGJsb2NrCisgKiBncm91cCB0byBmaW5kIGEgZnJlZSBpbm9kZS4KKyAqLworc3RydWN0IGlub2RlICogdWZzX25ld19pbm9kZShzdHJ1Y3QgaW5vZGUgKiBkaXIsIGludCBtb2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworCXN0cnVjdCB1ZnNfc2JfaW5mbyAqIHNiaTsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqIHVzYjE7CisJc3RydWN0IHVmc19jZ19wcml2YXRlX2luZm8gKiB1Y3BpOworCXN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKiB1Y2c7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJdW5zaWduZWQgY2csIGJpdCwgaSwgaiwgc3RhcnQ7CisJc3RydWN0IHVmc19pbm9kZV9pbmZvICp1ZnNpOworCisJVUZTRCgoIkVOVEVSXG4iKSkKKwkKKwkvKiBDYW5ub3QgY3JlYXRlIGZpbGVzIGluIGEgZGVsZXRlZCBkaXJlY3RvcnkgKi8KKwlpZiAoIWRpciB8fCAhZGlyLT5pX25saW5rKQorCQlyZXR1cm4gRVJSX1BUUigtRVBFUk0pOworCXNiID0gZGlyLT5pX3NiOworCWlub2RlID0gbmV3X2lub2RlKHNiKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl1ZnNpID0gVUZTX0koaW5vZGUpOworCXNiaSA9IFVGU19TQihzYik7CisJdXNwaSA9IHNiaS0+c191c3BpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7CisKKwlsb2NrX3N1cGVyIChzYik7CisKKwkvKgorCSAqIFRyeSB0byBwbGFjZSB0aGUgaW5vZGUgaW4gaXRzIHBhcmVudCBkaXJlY3RvcnkKKwkgKi8KKwlpID0gdWZzX2lub3RvY2coZGlyLT5pX2lubyk7CisJaWYgKHNiaS0+ZnNfY3MoaSkuY3NfbmlmcmVlKSB7CisJCWNnID0gaTsKKwkJZ290byBjZ19mb3VuZDsKKwl9CisKKwkvKgorCSAqIFVzZSBhIHF1YWRyYXRpYyBoYXNoIHRvIGZpbmQgYSBncm91cCB3aXRoIGEgZnJlZSBpbm9kZQorCSAqLworCWZvciAoIGogPSAxOyBqIDwgdXNwaS0+c19uY2c7IGogPDw9IDEgKSB7CisJCWkgKz0gajsKKwkJaWYgKGkgPj0gdXNwaS0+c19uY2cpCisJCQlpIC09IHVzcGktPnNfbmNnOworCQlpZiAoc2JpLT5mc19jcyhpKS5jc19uaWZyZWUpIHsKKwkJCWNnID0gaTsKKwkJCWdvdG8gY2dfZm91bmQ7CisJCX0KKwl9CisKKwkvKgorCSAqIFRoYXQgZmFpbGVkOiB0cnkgbGluZWFyIHNlYXJjaCBmb3IgYSBmcmVlIGlub2RlCisJICovCisJaSA9IHVmc19pbm90b2NnKGRpci0+aV9pbm8pICsgMTsKKwlmb3IgKGogPSAyOyBqIDwgdXNwaS0+c19uY2c7IGorKykgeworCQlpKys7CisJCWlmIChpID49IHVzcGktPnNfbmNnKQorCQkJaSA9IDA7CisJCWlmIChzYmktPmZzX2NzKGkpLmNzX25pZnJlZSkgeworCQkJY2cgPSBpOworCQkJZ290byBjZ19mb3VuZDsKKwkJfQorCX0KKwkKKwlnb3RvIGZhaWxlZDsKKworY2dfZm91bmQ6CisJdWNwaSA9IHVmc19sb2FkX2N5bGluZGVyIChzYiwgY2cpOworCWlmICghdWNwaSkKKwkJZ290byBmYWlsZWQ7CisJdWNnID0gdWJoX2dldF91Y2coVUNQSV9VQkgpOworCWlmICghdWZzX2NnX2Noa21hZ2ljKHNiLCB1Y2cpKSAKKwkJdWZzX3BhbmljIChzYiwgInVmc19uZXdfaW5vZGUiLCAiaW50ZXJuYWwgZXJyb3IsIGJhZCBjZyBtYWdpYyBudW1iZXIiKTsKKworCXN0YXJ0ID0gdWNwaS0+Y19pcm90b3I7CisJYml0ID0gdWJoX2ZpbmRfbmV4dF96ZXJvX2JpdCAoVUNQSV9VQkgsIHVjcGktPmNfaXVzZWRvZmYsIHVzcGktPnNfaXBnLCBzdGFydCk7CisJaWYgKCEoYml0IDwgdXNwaS0+c19pcGcpKSB7CisJCWJpdCA9IHViaF9maW5kX2ZpcnN0X3plcm9fYml0IChVQ1BJX1VCSCwgdWNwaS0+Y19pdXNlZG9mZiwgc3RhcnQpOworCQlpZiAoIShiaXQgPCBzdGFydCkpIHsKKwkJCXVmc19lcnJvciAoc2IsICJ1ZnNfbmV3X2lub2RlIiwKKwkJCSAgICAiY3lsaW5kZXIgZ3JvdXAgJXUgY29ycnVwdGVkIC0gZXJyb3IgaW4gaW5vZGUgYml0bWFwXG4iLCBjZyk7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCX0KKwlVRlNEKCgic3RhcnQgPSAldSwgYml0ID0gJXUsIGlwZyA9ICV1XG4iLCBzdGFydCwgYml0LCB1c3BpLT5zX2lwZykpCisJaWYgKHViaF9pc2NsciAoVUNQSV9VQkgsIHVjcGktPmNfaXVzZWRvZmYsIGJpdCkpCisJCXViaF9zZXRiaXQgKFVDUElfVUJILCB1Y3BpLT5jX2l1c2Vkb2ZmLCBiaXQpOworCWVsc2UgeworCQl1ZnNfcGFuaWMgKHNiLCAidWZzX25ld19pbm9kZSIsICJpbnRlcm5hbCBlcnJvciIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJCisJZnMzMl9zdWIoc2IsICZ1Y2ctPmNnX2NzLmNzX25pZnJlZSwgMSk7CisJZnMzMl9zdWIoc2IsICZ1c2IxLT5mc19jc3RvdGFsLmNzX25pZnJlZSwgMSk7CisJZnMzMl9zdWIoc2IsICZzYmktPmZzX2NzKGNnKS5jc19uaWZyZWUsIDEpOworCQorCWlmIChTX0lTRElSKG1vZGUpKSB7CisJCWZzMzJfYWRkKHNiLCAmdWNnLT5jZ19jcy5jc19uZGlyLCAxKTsKKwkJZnMzMl9hZGQoc2IsICZ1c2IxLT5mc19jc3RvdGFsLmNzX25kaXIsIDEpOworCQlmczMyX2FkZChzYiwgJnNiaS0+ZnNfY3MoY2cpLmNzX25kaXIsIDEpOworCX0KKworCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVVNQSV9VQkgpOworCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVUNQSV9VQkgpOworCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKSB7CisJCXViaF93YWl0X29uX2J1ZmZlciAoVUNQSV9VQkgpOworCQl1YmhfbGxfcndfYmxvY2sgKFdSSVRFLCAxLCAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKikgJnVjcGkpOworCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKKwl9CisJc2ItPnNfZGlydCA9IDE7CisKKwlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwlpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlpZiAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKSB7CisJCWlub2RlLT5pX2dpZCA9IGRpci0+aV9naWQ7CisJCWlmIChTX0lTRElSKG1vZGUpKQorCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lTR0lEOworCX0gZWxzZQorCQlpbm9kZS0+aV9naWQgPSBjdXJyZW50LT5mc2dpZDsKKworCWlub2RlLT5pX2lubyA9IGNnICogdXNwaS0+c19pcGcgKyBiaXQ7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfU0laRTsJLyogVGhpcyBpcyB0aGUgb3B0aW1hbCBJTyBzaXplIChmb3Igc3RhdCksIG5vdCB0aGUgZnMgYmxvY2sgc2l6ZSAqLworCWlub2RlLT5pX2Jsb2NrcyA9IDA7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwl1ZnNpLT5pX2ZsYWdzID0gVUZTX0koZGlyKS0+aV9mbGFnczsKKwl1ZnNpLT5pX2xhc3RmcmFnID0gMDsKKwl1ZnNpLT5pX2dlbiA9IDA7CisJdWZzaS0+aV9zaGFkb3cgPSAwOworCXVmc2ktPmlfb3N5bmMgPSAwOworCXVmc2ktPmlfb2VmdGZsYWcgPSAwOworCW1lbXNldCgmdWZzaS0+aV91MSwgMCwgc2l6ZW9mKHVmc2ktPmlfdTEpKTsKKworCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKworCXVubG9ja19zdXBlciAoc2IpOworCisJaWYgKERRVU9UX0FMTE9DX0lOT0RFKGlub2RlKSkgeworCQlEUVVPVF9EUk9QKGlub2RlKTsKKwkJaW5vZGUtPmlfZmxhZ3MgfD0gU19OT1FVT1RBOworCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gRVJSX1BUUigtRURRVU9UKTsKKwl9CisKKwlVRlNEKCgiYWxsb2NhdGluZyBpbm9kZSAlbHVcbiIsIGlub2RlLT5pX2lubykpCisJVUZTRCgoIkVYSVRcbiIpKQorCXJldHVybiBpbm9kZTsKKworZmFpbGVkOgorCXVubG9ja19zdXBlciAoc2IpOworCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwlpcHV0IChpbm9kZSk7CisJVUZTRCgoIkVYSVQgKEZBSUxFRClcbiIpKQorCXJldHVybiBFUlJfUFRSKC1FTk9TUEMpOworfQpkaWZmIC0tZ2l0IGEvZnMvdWZzL2lub2RlLmMgYi9mcy91ZnMvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTg2MjdjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvdWZzL2lub2RlLmMKQEAgLTAsMCArMSw4MTYgQEAKKy8qCisgKiAgbGludXgvZnMvdWZzL2lub2RlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgKKyAqIERhbmllbCBQaXJrbCA8ZGFuaWVsLnBpcmtsQGVtYWlsLmN6PgorICogQ2hhcmxlcyBVbml2ZXJzaXR5LCBGYWN1bHR5IG9mIE1hdGhlbWF0aWNzIGFuZCBQaHlzaWNzCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvZXh0Mi9pbm9kZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2ZzL21pbml4L2lub2RlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBHb2FsLWRpcmVjdGVkIGJsb2NrIGFsbG9jYXRpb24gYnkgU3RlcGhlbiBUd2VlZGllIChzY3RAZGNzLmVkLmFjLnVrKSwgMTk5MworICogIEJpZy1lbmRpYW4gdG8gbGl0dGxlLWVuZGlhbiBieXRlLXN3YXBwaW5nL2JpdG1hcHMgYnkKKyAqICAgICAgICBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpLCAxOTk1CisgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Vmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKyNpbmNsdWRlICJzd2FiLmgiCisjaW5jbHVkZSAidXRpbC5oIgorCisjdW5kZWYgVUZTX0lOT0RFX0RFQlVHCisjdW5kZWYgVUZTX0lOT0RFX0RFQlVHX01PUkUKKworI2lmZGVmIFVGU19JTk9ERV9ERUJVRworI2RlZmluZSBVRlNEKHgpIHByaW50aygiKCVzLCAlZCksICVzOiAiLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXyk7IHByaW50ayB4OworI2Vsc2UKKyNkZWZpbmUgVUZTRCh4KQorI2VuZGlmCisKK3N0YXRpYyBpbnQgdWZzX2Jsb2NrX3RvX3BhdGgoc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgaV9ibG9jaywgc2VjdG9yX3Qgb2Zmc2V0c1s0XSkKK3sKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqdXNwaSA9IFVGU19TQihpbm9kZS0+aV9zYiktPnNfdXNwaTsKKwlpbnQgcHRycyA9IHVzcGktPnNfYXBiOworCWludCBwdHJzX2JpdHMgPSB1c3BpLT5zX2FwYnNoaWZ0OworCWNvbnN0IGxvbmcgZGlyZWN0X2Jsb2NrcyA9IFVGU19OREFERFIsCisJCWluZGlyZWN0X2Jsb2NrcyA9IHB0cnMsCisJCWRvdWJsZV9ibG9ja3MgPSAoMSA8PCAocHRyc19iaXRzICogMikpOworCWludCBuID0gMDsKKworCisJVUZTRCgoInB0cnM9dXNwaS0+c19hcGIgPSAlZCxkb3VibGVfYmxvY2tzPSVkIFxuIixwdHJzLGRvdWJsZV9ibG9ja3MpKTsKKwlpZiAoaV9ibG9jayA8IDApIHsKKwkJdWZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsICJ1ZnNfYmxvY2tfdG9fcGF0aCIsICJibG9jayA8IDAiKTsKKwl9IGVsc2UgaWYgKGlfYmxvY2sgPCBkaXJlY3RfYmxvY2tzKSB7CisJCW9mZnNldHNbbisrXSA9IGlfYmxvY2s7CisJfSBlbHNlIGlmICgoaV9ibG9jayAtPSBkaXJlY3RfYmxvY2tzKSA8IGluZGlyZWN0X2Jsb2NrcykgeworCQlvZmZzZXRzW24rK10gPSBVRlNfSU5EX0JMT0NLOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrOworCX0gZWxzZSBpZiAoKGlfYmxvY2sgLT0gaW5kaXJlY3RfYmxvY2tzKSA8IGRvdWJsZV9ibG9ja3MpIHsKKwkJb2Zmc2V0c1tuKytdID0gVUZTX0RJTkRfQkxPQ0s7CisJCW9mZnNldHNbbisrXSA9IGlfYmxvY2sgPj4gcHRyc19iaXRzOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKKwl9IGVsc2UgaWYgKCgoaV9ibG9jayAtPSBkb3VibGVfYmxvY2tzKSA+PiAocHRyc19iaXRzICogMikpIDwgcHRycykgeworCQlvZmZzZXRzW24rK10gPSBVRlNfVElORF9CTE9DSzsKKwkJb2Zmc2V0c1tuKytdID0gaV9ibG9jayA+PiAocHRyc19iaXRzICogMik7CisJCW9mZnNldHNbbisrXSA9IChpX2Jsb2NrID4+IHB0cnNfYml0cykgJiAocHRycyAtIDEpOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKKwl9IGVsc2UgeworCQl1ZnNfd2FybmluZyhpbm9kZS0+aV9zYiwgInVmc19ibG9ja190b19wYXRoIiwgImJsb2NrID4gYmlnIik7CisJfQorCXJldHVybiBuOworfQorCisvKgorICogUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIGZyYWdtZW50IGZyb20KKyAqIHRoZSBiZWdpbmluZyBvZiB0aGUgZmlsZXN5c3RlbS4KKyAqLworCit1NjQgIHVmc19mcmFnX21hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBmcmFnKQoreworCXN0cnVjdCB1ZnNfaW5vZGVfaW5mbyAqdWZzaSA9IFVGU19JKGlub2RlKTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKnVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJdTY0IG1hc2sgPSAodTY0KSB1c3BpLT5zX2FwYm1hc2s+PnVzcGktPnNfZnBic2hpZnQ7CisJaW50IHNoaWZ0ID0gdXNwaS0+c19hcGJzaGlmdC11c3BpLT5zX2ZwYnNoaWZ0OworCXNlY3Rvcl90IG9mZnNldHNbNF0sICpwOworCWludCBkZXB0aCA9IHVmc19ibG9ja190b19wYXRoKGlub2RlLCBmcmFnID4+IHVzcGktPnNfZnBic2hpZnQsIG9mZnNldHMpOworCXU2NCAgcmV0ID0gMEw7CisJX19mczMyIGJsb2NrOworCV9fZnM2NCB1Ml9ibG9jayA9IDBMOworCXVuc2lnbmVkIGZsYWdzID0gVUZTX1NCKHNiKS0+c19mbGFnczsKKwl1NjQgdGVtcCA9IDBMOworCisJVUZTRCgoIjogZnJhZyA9ICVsdSAgZGVwdGggPSAlZFxuIixmcmFnLGRlcHRoKSk7CisJVUZTRCgoIjogdXNwaS0+c19mcGJzaGlmdCA9ICVkICx1c3BpLT5zX2FwYm1hc2sgPSAleCwgbWFzaz0lbGx4XG4iLHVzcGktPnNfZnBic2hpZnQsdXNwaS0+c19hcGJtYXNrLG1hc2spKTsKKworCWlmIChkZXB0aCA9PSAwKQorCQlyZXR1cm4gMDsKKworCXAgPSBvZmZzZXRzOworCisJbG9ja19rZXJuZWwoKTsKKwlpZiAoKGZsYWdzICYgVUZTX1RZUEVfTUFTSykgPT0gVUZTX1RZUEVfVUZTMikKKwkJZ290byB1ZnMyOworCisJYmxvY2sgPSB1ZnNpLT5pX3UxLmlfZGF0YVsqcCsrXTsKKwlpZiAoIWJsb2NrKQorCQlnb3RvIG91dDsKKwl3aGlsZSAoLS1kZXB0aCkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQlzZWN0b3JfdCBuID0gKnArKzsKKworCQliaCA9IHNiX2JyZWFkKHNiLCB1c3BpLT5zX3NiYmFzZSArIGZzMzJfdG9fY3B1KHNiLCBibG9jaykrKG4+PnNoaWZ0KSk7CisJCWlmICghYmgpCisJCQlnb3RvIG91dDsKKwkJYmxvY2sgPSAoKF9fZnMzMiAqKSBiaC0+Yl9kYXRhKVtuICYgbWFza107CisJCWJyZWxzZSAoYmgpOworCQlpZiAoIWJsb2NrKQorCQkJZ290byBvdXQ7CisJfQorCXJldCA9ICh1NjQpICh1c3BpLT5zX3NiYmFzZSArIGZzMzJfdG9fY3B1KHNiLCBibG9jaykgKyAoZnJhZyAmIHVzcGktPnNfZnBibWFzaykpOworCWdvdG8gb3V0OwordWZzMjoKKwl1Ml9ibG9jayA9IHVmc2ktPmlfdTEudTJfaV9kYXRhWypwKytdOworCWlmICghdTJfYmxvY2spCisJCWdvdG8gb3V0OworCisKKwl3aGlsZSAoLS1kZXB0aCkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQlzZWN0b3JfdCBuID0gKnArKzsKKworCisJCXRlbXAgPSAodTY0KSh1c3BpLT5zX3NiYmFzZSkgKyBmczY0X3RvX2NwdShzYiwgdTJfYmxvY2spOworCQliaCA9IHNiX2JyZWFkKHNiLCB0ZW1wICsodTY0KSAobj4+c2hpZnQpKTsKKwkJaWYgKCFiaCkKKwkJCWdvdG8gb3V0OworCQl1Ml9ibG9jayA9ICgoX19mczY0ICopYmgtPmJfZGF0YSlbbiAmIG1hc2tdOworCQlicmVsc2UoYmgpOworCQlpZiAoIXUyX2Jsb2NrKQorCQkJZ290byBvdXQ7CisJfQorCXRlbXAgPSAodTY0KXVzcGktPnNfc2JiYXNlICsgZnM2NF90b19jcHUoc2IsIHUyX2Jsb2NrKTsKKwlyZXQgPSB0ZW1wICsgKHU2NCkgKGZyYWcgJiB1c3BpLT5zX2ZwYm1hc2spOworCitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB1ZnNfaW5vZGVfZ2V0ZnJhZyAoc3RydWN0IGlub2RlICppbm9kZSwKKwl1bnNpZ25lZCBpbnQgZnJhZ21lbnQsIHVuc2lnbmVkIGludCBuZXdfZnJhZ21lbnQsCisJdW5zaWduZWQgaW50IHJlcXVpcmVkLCBpbnQgKmVyciwgaW50IG1ldGFkYXRhLCBsb25nICpwaHlzLCBpbnQgKm5ldykKK3sKKwlzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKnVmc2kgPSBVRlNfSShpbm9kZSk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIHJlc3VsdDsKKwl1bnNpZ25lZCBibG9jaywgYmxvY2tvZmYsIGxhc3RmcmFnLCBsYXN0YmxvY2ssIGxhc3RibG9ja29mZjsKKwl1bnNpZ25lZCB0bXAsIGdvYWw7CisJX19mczMyICogcCwgKiBwMjsKKwl1bnNpZ25lZCBmbGFncyA9IDA7CisKKwlVRlNEKCgiRU5URVIsIGlubyAlbHUsIGZyYWdtZW50ICV1LCBuZXdfZnJhZ21lbnQgJXUsIHJlcXVpcmVkICV1XG4iLAorCQlpbm9kZS0+aV9pbm8sIGZyYWdtZW50LCBuZXdfZnJhZ21lbnQsIHJlcXVpcmVkKSkgICAgICAgICAKKworCXNiID0gaW5vZGUtPmlfc2I7CisJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKworCWZsYWdzID0gVUZTX1NCKHNiKS0+c19mbGFnczsKKyAgICAgICAgLyogVE9ETyA6IHRvIGJlIGRvbmUgZm9yIHdyaXRlIHN1cHBvcnQKKyAgICAgICAgaWYgKCAoZmxhZ3MgJiBVRlNfVFlQRV9NQVNLKSA9PSBVRlNfVFlQRV9VRlMyKQorICAgICAgICAgICAgIGdvdG8gdWZzMjsKKyAgICAgICAgICovCisKKwlibG9jayA9IHVmc19mcmFnc3RvYmxrcyAoZnJhZ21lbnQpOworCWJsb2Nrb2ZmID0gdWZzX2ZyYWdudW0gKGZyYWdtZW50KTsKKwlwID0gdWZzaS0+aV91MS5pX2RhdGEgKyBibG9jazsKKwlnb2FsID0gMDsKKworcmVwZWF0OgorCXRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqcCk7CisJbGFzdGZyYWcgPSB1ZnNpLT5pX2xhc3RmcmFnOworCWlmICh0bXAgJiYgZnJhZ21lbnQgPCBsYXN0ZnJhZykgeworCQlpZiAobWV0YWRhdGEpIHsKKwkJCXJlc3VsdCA9IHNiX2dldGJsayhzYiwgdXNwaS0+c19zYmJhc2UgKyB0bXAgKyBibG9ja29mZik7CisJCQlpZiAodG1wID09IGZzMzJfdG9fY3B1KHNiLCAqcCkpIHsKKwkJCQlVRlNEKCgiRVhJVCwgcmVzdWx0ICV1XG4iLCB0bXAgKyBibG9ja29mZikpCisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWJyZWxzZSAocmVzdWx0KTsKKwkJCWdvdG8gcmVwZWF0OworCQl9IGVsc2UgeworCQkJKnBoeXMgPSB0bXA7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCWxhc3RibG9jayA9IHVmc19mcmFnc3RvYmxrcyAobGFzdGZyYWcpOworCWxhc3RibG9ja29mZiA9IHVmc19mcmFnbnVtIChsYXN0ZnJhZyk7CisJLyoKKwkgKiBXZSB3aWxsIGV4dGVuZCBmaWxlIGludG8gbmV3IGJsb2NrIGJleW9uZCBsYXN0IGFsbG9jYXRlZCBibG9jaworCSAqLworCWlmIChsYXN0YmxvY2sgPCBibG9jaykgeworCQkvKgorCQkgKiBXZSBtdXN0IHJlYWxsb2NhdGUgbGFzdCBhbGxvY2F0ZWQgYmxvY2sKKwkJICovCisJCWlmIChsYXN0YmxvY2tvZmYpIHsKKwkJCXAyID0gdWZzaS0+aV91MS5pX2RhdGEgKyBsYXN0YmxvY2s7CisJCQl0bXAgPSB1ZnNfbmV3X2ZyYWdtZW50cyAoaW5vZGUsIHAyLCBsYXN0ZnJhZywgCisJCQkJZnMzMl90b19jcHUoc2IsICpwMiksIHVzcGktPnNfZnBiIC0gbGFzdGJsb2Nrb2ZmLCBlcnIpOworCQkJaWYgKCF0bXApIHsKKwkJCQlpZiAobGFzdGZyYWcgIT0gdWZzaS0+aV9sYXN0ZnJhZykKKwkJCQkJZ290byByZXBlYXQ7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWxhc3RmcmFnID0gdWZzaS0+aV9sYXN0ZnJhZzsKKwkJCQorCQl9CisJCWdvYWwgPSBmczMyX3RvX2NwdShzYiwgdWZzaS0+aV91MS5pX2RhdGFbbGFzdGJsb2NrXSkgKyB1c3BpLT5zX2ZwYjsKKwkJdG1wID0gdWZzX25ld19mcmFnbWVudHMgKGlub2RlLCBwLCBmcmFnbWVudCAtIGJsb2Nrb2ZmLCAKKwkJCWdvYWwsIHJlcXVpcmVkICsgYmxvY2tvZmYsIGVycik7CisJfQorCS8qCisJICogV2Ugd2lsbCBleHRlbmQgbGFzdCBhbGxvY2F0ZWQgYmxvY2sKKwkgKi8KKwllbHNlIGlmIChsYXN0YmxvY2sgPT0gYmxvY2spIHsKKwkJdG1wID0gdWZzX25ld19mcmFnbWVudHMgKGlub2RlLCBwLCBmcmFnbWVudCAtIChibG9ja29mZiAtIGxhc3RibG9ja29mZiksCisJCQlmczMyX3RvX2NwdShzYiwgKnApLCByZXF1aXJlZCArICAoYmxvY2tvZmYgLSBsYXN0YmxvY2tvZmYpLCBlcnIpOworCX0KKwkvKgorCSAqIFdlIHdpbGwgYWxsb2NhdGUgbmV3IGJsb2NrIGJlZm9yZSBsYXN0IGFsbG9jYXRlZCBibG9jaworCSAqLworCWVsc2UgLyogKGxhc3RibG9jayA+IGJsb2NrKSAqLyB7CisJCWlmIChsYXN0YmxvY2sgJiYgKHRtcCA9IGZzMzJfdG9fY3B1KHNiLCB1ZnNpLT5pX3UxLmlfZGF0YVtsYXN0YmxvY2stMV0pKSkKKwkJCWdvYWwgPSB0bXAgKyB1c3BpLT5zX2ZwYjsKKwkJdG1wID0gdWZzX25ld19mcmFnbWVudHMgKGlub2RlLCBwLCBmcmFnbWVudCAtIGJsb2Nrb2ZmLCAKKwkJCWdvYWwsIHVzcGktPnNfZnBiLCBlcnIpOworCX0KKwlpZiAoIXRtcCkgeworCQlpZiAoKCFibG9ja29mZiAmJiAqcCkgfHwgCisJCSAgICAoYmxvY2tvZmYgJiYgbGFzdGZyYWcgIT0gdWZzaS0+aV9sYXN0ZnJhZykpCisJCQlnb3RvIHJlcGVhdDsKKwkJKmVyciA9IC1FTk9TUEM7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIFRoZSBudWxsaWZpY2F0aW9uIG9mIGZyYW1nZW50cyBkb25lIGluIHVmcy9iYWxsb2MuYyBpcworCSAqIHNvbWV0aGluZyBJIGRvbid0IGhhdmUgdGhlIHN0b21hY2hlIHRvIG1vdmUgaW50byBoZXJlIHJpZ2h0CisJICogbm93LiAtRGF2ZU0KKwkgKi8KKwlpZiAobWV0YWRhdGEpIHsKKwkJcmVzdWx0ID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCB0bXAgKyBibG9ja29mZik7CisJfSBlbHNlIHsKKwkJKnBoeXMgPSB0bXA7CisJCXJlc3VsdCA9IE5VTEw7CisJCSplcnIgPSAwOworCQkqbmV3ID0gMTsKKwl9CisKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJaWYgKElTX1NZTkMoaW5vZGUpKQorCQl1ZnNfc3luY19pbm9kZSAoaW5vZGUpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCVVGU0QoKCJFWElULCByZXN1bHQgJXVcbiIsIHRtcCArIGJsb2Nrb2ZmKSkKKwlyZXR1cm4gcmVzdWx0OworCisgICAgIC8qIFRoaXMgcGFydCA6IFRvIGJlIGltcGxlbWVudGVkIC4uLi4KKyAgICAgICAgUmVxdWlyZWQgb25seSBmb3Igd3JpdGluZywgbm90IHJlcXVpcmVkIGZvciBSRUFELU9OTFkuCit1ZnMyOgorCisJdTJfYmxvY2sgPSB1ZnNfZnJhZ3N0b2Jsa3MoZnJhZ21lbnQpOworCXUyX2Jsb2Nrb2ZmID0gdWZzX2ZyYWdudW0oZnJhZ21lbnQpOworCXAgPSB1ZnNpLT5pX3UxLnUyX2lfZGF0YSArIGJsb2NrOworCWdvYWwgPSAwOworCityZXBlYXQyOgorCXRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqcCk7CisJbGFzdGZyYWcgPSB1ZnNpLT5pX2xhc3RmcmFnOworCisgICAgICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB1ZnNfYmxvY2tfZ2V0ZnJhZyAoc3RydWN0IGlub2RlICppbm9kZSwKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB1bnNpZ25lZCBpbnQgZnJhZ21lbnQsIHVuc2lnbmVkIGludCBuZXdfZnJhZ21lbnQsIAorCXVuc2lnbmVkIGludCBibG9ja3NpemUsIGludCAqIGVyciwgaW50IG1ldGFkYXRhLCBsb25nICpwaHlzLCBpbnQgKm5ldykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogcmVzdWx0OworCXVuc2lnbmVkIHRtcCwgZ29hbCwgYmxvY2ssIGJsb2Nrb2ZmOworCV9fZnMzMiAqIHA7CisKKwlzYiA9IGlub2RlLT5pX3NiOworCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJYmxvY2sgPSB1ZnNfZnJhZ3N0b2Jsa3MgKGZyYWdtZW50KTsKKwlibG9ja29mZiA9IHVmc19mcmFnbnVtIChmcmFnbWVudCk7CisKKwlVRlNEKCgiRU5URVIsIGlubyAlbHUsIGZyYWdtZW50ICV1LCBuZXdfZnJhZ21lbnQgJXVcbiIsIGlub2RlLT5pX2lubywgZnJhZ21lbnQsIG5ld19mcmFnbWVudCkpCQorCisJcmVzdWx0ID0gTlVMTDsKKwlpZiAoIWJoKQorCQlnb3RvIG91dDsKKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJbGxfcndfYmxvY2sgKFJFQUQsIDEsICZiaCk7CisJCXdhaXRfb25fYnVmZmVyIChiaCk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCWdvdG8gb3V0OworCX0KKworCXAgPSAoX19mczMyICopIGJoLT5iX2RhdGEgKyBibG9jazsKK3JlcGVhdDoKKwl0bXAgPSBmczMyX3RvX2NwdShzYiwgKnApOworCWlmICh0bXApIHsKKwkJaWYgKG1ldGFkYXRhKSB7CisJCQlyZXN1bHQgPSBzYl9nZXRibGsoc2IsIHVzcGktPnNfc2JiYXNlICsgdG1wICsgYmxvY2tvZmYpOworCQkJaWYgKHRtcCA9PSBmczMyX3RvX2NwdShzYiwgKnApKQorCQkJCWdvdG8gb3V0OworCQkJYnJlbHNlIChyZXN1bHQpOworCQkJZ290byByZXBlYXQ7CisJCX0gZWxzZSB7CisJCQkqcGh5cyA9IHRtcDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKGJsb2NrICYmICh0bXAgPSBmczMyX3RvX2NwdShzYiwgKChfX2ZzMzIqKWJoLT5iX2RhdGEpW2Jsb2NrLTFdKSArIHVzcGktPnNfZnBiKSkKKwkJZ29hbCA9IHRtcCArIHVzcGktPnNfZnBiOworCWVsc2UKKwkJZ29hbCA9IGJoLT5iX2Jsb2NrbnIgKyB1c3BpLT5zX2ZwYjsKKwl0bXAgPSB1ZnNfbmV3X2ZyYWdtZW50cyAoaW5vZGUsIHAsIHVmc19ibGtudW0obmV3X2ZyYWdtZW50KSwgZ29hbCwgdXNwaS0+c19mcGIsIGVycik7CisJaWYgKCF0bXApIHsKKwkJaWYgKGZzMzJfdG9fY3B1KHNiLCAqcCkpCisJCQlnb3RvIHJlcGVhdDsKKwkJZ290byBvdXQ7CisJfQkJCisKKwkvKiBUaGUgbnVsbGlmaWNhdGlvbiBvZiBmcmFtZ2VudHMgZG9uZSBpbiB1ZnMvYmFsbG9jLmMgaXMKKwkgKiBzb21ldGhpbmcgSSBkb24ndCBoYXZlIHRoZSBzdG9tYWNoZSB0byBtb3ZlIGludG8gaGVyZSByaWdodAorCSAqIG5vdy4gLURhdmVNCisJICovCisJaWYgKG1ldGFkYXRhKSB7CisJCXJlc3VsdCA9IHNiX2dldGJsayhzYiwgdG1wICsgYmxvY2tvZmYpOworCX0gZWxzZSB7CisJCSpwaHlzID0gdG1wOworCQkqbmV3ID0gMTsKKwl9CisKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKElTX1NZTkMoaW5vZGUpKQorCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CisJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworb3V0OgorCWJyZWxzZSAoYmgpOworCVVGU0QoKCJFWElULCByZXN1bHQgJXVcbiIsIHRtcCArIGJsb2Nrb2ZmKSkKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBibG9jayB3aGljaCBjb250YWlucyB0aGUgZnJhZ21lbnQuCisgKi8KKworc3RhdGljIGludCB1ZnNfZ2V0ZnJhZ19ibG9jayAoc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgZnJhZ21lbnQsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCWludCByZXQsIGVyciwgbmV3OworCXVuc2lnbmVkIGxvbmcgcHRyLHBoeXM7CisJdTY0IHBoeXM2NCA9IDA7CisJCisJaWYgKCFjcmVhdGUpIHsKKwkJcGh5czY0ID0gdWZzX2ZyYWdfbWFwKGlub2RlLCBmcmFnbWVudCk7CisJCVVGU0QoKCJwaHlzNjQgPSAlbHUgXG4iLHBoeXM2NCkpOworCQlpZiAocGh5czY0KQorCQkJbWFwX2JoKGJoX3Jlc3VsdCwgc2IsIHBoeXM2NCk7CisJCXJldHVybiAwOworCX0KKworICAgICAgICAvKiBUaGlzIGNvZGUgZW50ZXJlZCBvbmx5IHdoaWxlIHdyaXRpbmcgLi4uLj8gKi8KKworCWVyciA9IC1FSU87CisJbmV3ID0gMDsKKwlyZXQgPSAwOworCWJoID0gTlVMTDsKKworCWxvY2tfa2VybmVsKCk7CisKKwlVRlNEKCgiRU5URVIsIGlubyAlbHUsIGZyYWdtZW50ICV1XG4iLCBpbm9kZS0+aV9pbm8sIGZyYWdtZW50KSkKKwlpZiAoZnJhZ21lbnQgPCAwKQorCQlnb3RvIGFib3J0X25lZ2F0aXZlOworCWlmIChmcmFnbWVudCA+CisJICAgICgoVUZTX05EQUREUiArIHVzcGktPnNfYXBiICsgdXNwaS0+c18yYXBiICsgdXNwaS0+c18zYXBiKQorCSAgICAgPDwgdXNwaS0+c19mcGJzaGlmdCkpCisJCWdvdG8gYWJvcnRfdG9vX2JpZzsKKworCWVyciA9IDA7CisJcHRyID0gZnJhZ21lbnQ7CisJICAKKwkvKgorCSAqIG9rLCB0aGVzZSBtYWNyb3MgY2xlYW4gdGhlIGxvZ2ljIHVwIGEgYml0IGFuZCBtYWtlCisJICogaXQgbXVjaCBtb3JlIHJlYWRhYmxlOgorCSAqLworI2RlZmluZSBHRVRfSU5PREVfREFUQUJMT0NLKHgpIFwKKwkJdWZzX2lub2RlX2dldGZyYWcoaW5vZGUsIHgsIGZyYWdtZW50LCAxLCAmZXJyLCAwLCAmcGh5cywgJm5ldykKKyNkZWZpbmUgR0VUX0lOT0RFX1BUUih4KSBcCisJCXVmc19pbm9kZV9nZXRmcmFnKGlub2RlLCB4LCBmcmFnbWVudCwgdXNwaS0+c19mcGIsICZlcnIsIDEsIE5VTEwsIE5VTEwpCisjZGVmaW5lIEdFVF9JTkRJUkVDVF9EQVRBQkxPQ0soeCkgXAorCQl1ZnNfYmxvY2tfZ2V0ZnJhZyhpbm9kZSwgYmgsIHgsIGZyYWdtZW50LCBzYi0+c19ibG9ja3NpemUsIFwKKwkJCQkgICZlcnIsIDAsICZwaHlzLCAmbmV3KTsKKyNkZWZpbmUgR0VUX0lORElSRUNUX1BUUih4KSBcCisJCXVmc19ibG9ja19nZXRmcmFnKGlub2RlLCBiaCwgeCwgZnJhZ21lbnQsIHNiLT5zX2Jsb2Nrc2l6ZSwgXAorCQkJCSAgJmVyciwgMSwgTlVMTCwgTlVMTCk7CisKKwlpZiAocHRyIDwgVUZTX05ESVJfRlJBR01FTlQpIHsKKwkJYmggPSBHRVRfSU5PREVfREFUQUJMT0NLKHB0cik7CisJCWdvdG8gb3V0OworCX0KKwlwdHIgLT0gVUZTX05ESVJfRlJBR01FTlQ7CisJaWYgKHB0ciA8ICgxIDw8ICh1c3BpLT5zX2FwYnNoaWZ0ICsgdXNwaS0+c19mcGJzaGlmdCkpKSB7CisJCWJoID0gR0VUX0lOT0RFX1BUUihVRlNfSU5EX0ZSQUdNRU5UICsgKHB0ciA+PiB1c3BpLT5zX2FwYnNoaWZ0KSk7CisJCWdvdG8gZ2V0X2luZGlyZWN0OworCX0KKwlwdHIgLT0gMSA8PCAodXNwaS0+c19hcGJzaGlmdCArIHVzcGktPnNfZnBic2hpZnQpOworCWlmIChwdHIgPCAoMSA8PCAodXNwaS0+c18yYXBic2hpZnQgKyB1c3BpLT5zX2ZwYnNoaWZ0KSkpIHsKKwkJYmggPSBHRVRfSU5PREVfUFRSKFVGU19ESU5EX0ZSQUdNRU5UICsgKHB0ciA+PiB1c3BpLT5zXzJhcGJzaGlmdCkpOworCQlnb3RvIGdldF9kb3VibGU7CisJfQorCXB0ciAtPSAxIDw8ICh1c3BpLT5zXzJhcGJzaGlmdCArIHVzcGktPnNfZnBic2hpZnQpOworCWJoID0gR0VUX0lOT0RFX1BUUihVRlNfVElORF9GUkFHTUVOVCArIChwdHIgPj4gdXNwaS0+c18zYXBic2hpZnQpKTsKKwliaCA9IEdFVF9JTkRJUkVDVF9QVFIoKHB0ciA+PiB1c3BpLT5zXzJhcGJzaGlmdCkgJiB1c3BpLT5zX2FwYm1hc2spOworZ2V0X2RvdWJsZToKKwliaCA9IEdFVF9JTkRJUkVDVF9QVFIoKHB0ciA+PiB1c3BpLT5zX2FwYnNoaWZ0KSAmIHVzcGktPnNfYXBibWFzayk7CitnZXRfaW5kaXJlY3Q6CisJYmggPSBHRVRfSU5ESVJFQ1RfREFUQUJMT0NLKHB0ciAmIHVzcGktPnNfYXBibWFzayk7CisKKyN1bmRlZiBHRVRfSU5PREVfREFUQUJMT0NLCisjdW5kZWYgR0VUX0lOT0RFX1BUUgorI3VuZGVmIEdFVF9JTkRJUkVDVF9EQVRBQkxPQ0sKKyN1bmRlZiBHRVRfSU5ESVJFQ1RfUFRSCisKK291dDoKKwlpZiAoZXJyKQorCQlnb3RvIGFib3J0OworCWlmIChuZXcpCisJCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJbWFwX2JoKGJoX3Jlc3VsdCwgc2IsIHBoeXMpOworYWJvcnQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7CisKK2Fib3J0X25lZ2F0aXZlOgorCXVmc193YXJuaW5nKHNiLCAidWZzX2dldF9ibG9jayIsICJibG9jayA8IDAiKTsKKwlnb3RvIGFib3J0OworCithYm9ydF90b29fYmlnOgorCXVmc193YXJuaW5nKHNiLCAidWZzX2dldF9ibG9jayIsICJibG9jayA+IGJpZyIpOworCWdvdG8gYWJvcnQ7Cit9CisKK3N0cnVjdCBidWZmZXJfaGVhZCAqdWZzX2dldGZyYWcoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgaW50IGZyYWdtZW50LAorCQkJCWludCBjcmVhdGUsIGludCAqZXJyKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCBkdW1teTsKKwlpbnQgZXJyb3I7CisKKwlkdW1teS5iX3N0YXRlID0gMDsKKwlkdW1teS5iX2Jsb2NrbnIgPSAtMTAwMDsKKwllcnJvciA9IHVmc19nZXRmcmFnX2Jsb2NrKGlub2RlLCBmcmFnbWVudCwgJmR1bW15LCBjcmVhdGUpOworCSplcnIgPSBlcnJvcjsKKwlpZiAoIWVycm9yICYmIGJ1ZmZlcl9tYXBwZWQoJmR1bW15KSkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQliaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgZHVtbXkuYl9ibG9ja25yKTsKKwkJaWYgKGJ1ZmZlcl9uZXcoJmR1bW15KSkgeworCQkJbWVtc2V0KGJoLT5iX2RhdGEsIDAsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJfQorCQlyZXR1cm4gYmg7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB1ZnNfYnJlYWQgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCB1bnNpZ25lZCBmcmFnbWVudCwKKwlpbnQgY3JlYXRlLCBpbnQgKiBlcnIpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisKKwlVRlNEKCgiRU5URVIsIGlubyAlbHUsIGZyYWdtZW50ICV1XG4iLCBpbm9kZS0+aV9pbm8sIGZyYWdtZW50KSkKKwliaCA9IHVmc19nZXRmcmFnIChpbm9kZSwgZnJhZ21lbnQsIGNyZWF0ZSwgZXJyKTsKKwlpZiAoIWJoIHx8IGJ1ZmZlcl91cHRvZGF0ZShiaCkpIAkJCisJCXJldHVybiBiaDsKKwlsbF9yd19ibG9jayAoUkVBRCwgMSwgJmJoKTsKKwl3YWl0X29uX2J1ZmZlciAoYmgpOworCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKQorCQlyZXR1cm4gYmg7CisJYnJlbHNlIChiaCk7CisJKmVyciA9IC1FSU87CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgdWZzX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJcmV0dXJuIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLHVmc19nZXRmcmFnX2Jsb2NrLHdiYyk7Cit9CitzdGF0aWMgaW50IHVmc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlKHBhZ2UsdWZzX2dldGZyYWdfYmxvY2spOworfQorc3RhdGljIGludCB1ZnNfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXJldHVybiBibG9ja19wcmVwYXJlX3dyaXRlKHBhZ2UsZnJvbSx0byx1ZnNfZ2V0ZnJhZ19ibG9jayk7Cit9CitzdGF0aWMgc2VjdG9yX3QgdWZzX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGJsb2NrKQoreworCXJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAobWFwcGluZyxibG9jayx1ZnNfZ2V0ZnJhZ19ibG9jayk7Cit9CitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHVmc19hb3BzID0geworCS5yZWFkcGFnZSA9IHVmc19yZWFkcGFnZSwKKwkud3JpdGVwYWdlID0gdWZzX3dyaXRlcGFnZSwKKwkuc3luY19wYWdlID0gYmxvY2tfc3luY19wYWdlLAorCS5wcmVwYXJlX3dyaXRlID0gdWZzX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZSA9IGdlbmVyaWNfY29tbWl0X3dyaXRlLAorCS5ibWFwID0gdWZzX2JtYXAKK307CisKK3ZvaWQgdWZzX3JlYWRfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXN0cnVjdCB1ZnNfaW5vZGVfaW5mbyAqdWZzaSA9IFVGU19JKGlub2RlKTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IHVmc19pbm9kZSAqIHVmc19pbm9kZTsJCisJc3RydWN0IHVmczJfaW5vZGUgKnVmczJfaW5vZGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJbW9kZV90IG1vZGU7CisJdW5zaWduZWQgaTsKKwl1bnNpZ25lZCBmbGFnczsKKwkKKwlVRlNEKCgiRU5URVIsIGlubyAlbHVcbiIsIGlub2RlLT5pX2lubykpCisJCisJc2IgPSBpbm9kZS0+aV9zYjsKKwl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCWZsYWdzID0gVUZTX1NCKHNiKS0+c19mbGFnczsKKworCWlmIChpbm9kZS0+aV9pbm8gPCBVRlNfUk9PVElOTyB8fCAKKwkgICAgaW5vZGUtPmlfaW5vID4gKHVzcGktPnNfbmNnICogdXNwaS0+c19pcGcpKSB7CisJCXVmc193YXJuaW5nIChzYiwgInVmc19yZWFkX2lub2RlIiwgImJhZCBpbm9kZSBudW1iZXIgKCVsdSlcbiIsIGlub2RlLT5pX2lubyk7CisJCWdvdG8gYmFkX2lub2RlOworCX0KKwkKKwliaCA9IHNiX2JyZWFkKHNiLCB1c3BpLT5zX3NiYmFzZSArIHVmc19pbm90b2ZzYmEoaW5vZGUtPmlfaW5vKSk7CisJaWYgKCFiaCkgeworCQl1ZnNfd2FybmluZyAoc2IsICJ1ZnNfcmVhZF9pbm9kZSIsICJ1bmFibGUgdG8gcmVhZCBpbm9kZSAlbHVcbiIsIGlub2RlLT5pX2lubyk7CisJCWdvdG8gYmFkX2lub2RlOworCX0KKwlpZiAoKGZsYWdzICYgVUZTX1RZUEVfTUFTSykgPT0gVUZTX1RZUEVfVUZTMikKKwkJZ290byB1ZnMyX2lub2RlOworCisJdWZzX2lub2RlID0gKHN0cnVjdCB1ZnNfaW5vZGUgKikgKGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IHVmc19pbm9kZSkgKiB1ZnNfaW5vdG9mc2JvKGlub2RlLT5pX2lubykpOworCisJLyoKKwkgKiBDb3B5IGRhdGEgdG8gdGhlIGluLWNvcmUgaW5vZGUuCisJICovCisJaW5vZGUtPmlfbW9kZSA9IG1vZGUgPSBmczE2X3RvX2NwdShzYiwgdWZzX2lub2RlLT51aV9tb2RlKTsKKwlpbm9kZS0+aV9ubGluayA9IGZzMTZfdG9fY3B1KHNiLCB1ZnNfaW5vZGUtPnVpX25saW5rKTsKKwlpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCkKKwkJdWZzX2Vycm9yIChzYiwgInVmc19yZWFkX2lub2RlIiwgImlub2RlICVsdSBoYXMgemVybyBubGlua1xuIiwgaW5vZGUtPmlfaW5vKTsKKwkKKwkvKgorCSAqIExpbnV4IG5vdyBoYXMgMzItYml0IHVpZCBhbmQgZ2lkLCBzbyB3ZSBjYW4gc3VwcG9ydCBFRlQuCisJICovCisJaW5vZGUtPmlfdWlkID0gdWZzX2dldF9pbm9kZV91aWQoc2IsIHVmc19pbm9kZSk7CisJaW5vZGUtPmlfZ2lkID0gdWZzX2dldF9pbm9kZV9naWQoc2IsIHVmc19pbm9kZSk7CisKKwlpbm9kZS0+aV9zaXplID0gZnM2NF90b19jcHUoc2IsIHVmc19pbm9kZS0+dWlfc2l6ZSk7CisJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gZnMzMl90b19jcHUoc2IsIHVmc19pbm9kZS0+dWlfYXRpbWUudHZfc2VjKTsKKwlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBmczMyX3RvX2NwdShzYiwgdWZzX2lub2RlLT51aV9jdGltZS50dl9zZWMpOworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGZzMzJfdG9fY3B1KHNiLCB1ZnNfaW5vZGUtPnVpX210aW1lLnR2X3NlYyk7CisJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IDA7CisJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7CisJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7CisJaW5vZGUtPmlfYmxvY2tzID0gZnMzMl90b19jcHUoc2IsIHVmc19pbm9kZS0+dWlfYmxvY2tzKTsKKwlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOyAgIC8qIFRoaXMgaXMgdGhlIG9wdGltYWwgSU8gc2l6ZSAoZm9yIHN0YXQpICovCisJaW5vZGUtPmlfdmVyc2lvbisrOworCXVmc2ktPmlfZmxhZ3MgPSBmczMyX3RvX2NwdShzYiwgdWZzX2lub2RlLT51aV9mbGFncyk7CisJdWZzaS0+aV9nZW4gPSBmczMyX3RvX2NwdShzYiwgdWZzX2lub2RlLT51aV9nZW4pOworCXVmc2ktPmlfc2hhZG93ID0gZnMzMl90b19jcHUoc2IsIHVmc19pbm9kZS0+dWlfdTMudWlfc3VuLnVpX3NoYWRvdyk7CisJdWZzaS0+aV9vZWZ0ZmxhZyA9IGZzMzJfdG9fY3B1KHNiLCB1ZnNfaW5vZGUtPnVpX3UzLnVpX3N1bi51aV9vZWZ0ZmxhZyk7CisJdWZzaS0+aV9sYXN0ZnJhZyA9IChpbm9kZS0+aV9zaXplICsgdXNwaS0+c19mc2l6ZSAtIDEpID4+IHVzcGktPnNfZnNoaWZ0OworCQorCWlmIChTX0lTQ0hSKG1vZGUpIHx8IFNfSVNCTEsobW9kZSkgfHwgaW5vZGUtPmlfYmxvY2tzKSB7CisJCWZvciAoaSA9IDA7IGkgPCAoVUZTX05EQUREUiArIFVGU19OSU5ESVIpOyBpKyspCisJCQl1ZnNpLT5pX3UxLmlfZGF0YVtpXSA9IHVmc19pbm9kZS0+dWlfdTIudWlfYWRkci51aV9kYltpXTsKKwl9CisJZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCAoVUZTX05EQUREUiArIFVGU19OSU5ESVIpICogNDsgaSsrKQorCQkJdWZzaS0+aV91MS5pX3N5bWxpbmtbaV0gPSB1ZnNfaW5vZGUtPnVpX3UyLnVpX3N5bWxpbmtbaV07CisJfQorCXVmc2ktPmlfb3N5bmMgPSAwOworCisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmdWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJnVmc19maWxlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnVmc19hb3BzOworCX0gZWxzZSBpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZ1ZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZ1ZnNfZGlyX29wZXJhdGlvbnM7CisJfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWlmICghaW5vZGUtPmlfYmxvY2tzKQorCQkJaW5vZGUtPmlfb3AgPSAmdWZzX2Zhc3Rfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQllbHNlIHsKKwkJCWlub2RlLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmdWZzX2FvcHM7CisJCX0KKwl9IGVsc2UKKwkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLAorCQkJdWZzX2dldF9pbm9kZV9kZXYoc2IsIHVmc2kpKTsKKworCWJyZWxzZSAoYmgpOworCisJVUZTRCgoIkVYSVRcbiIpKQorCXJldHVybjsKKworYmFkX2lub2RlOgorCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwlyZXR1cm47CisKK3VmczJfaW5vZGUgOgorCVVGU0QoKCJSZWFkaW5nIHVmczIgaW5vZGUsIGlubyAlbHVcbiIsIGlub2RlLT5pX2lubykpCisKKwl1ZnMyX2lub2RlID0gKHN0cnVjdCB1ZnMyX2lub2RlICopKGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IHVmczJfaW5vZGUpICogdWZzX2lub3RvZnNibyhpbm9kZS0+aV9pbm8pKTsKKworCS8qCisJICogQ29weSBkYXRhIHRvIHRoZSBpbi1jb3JlIGlub2RlLgorCSAqLworCWlub2RlLT5pX21vZGUgPSBtb2RlID0gZnMxNl90b19jcHUoc2IsIHVmczJfaW5vZGUtPnVpX21vZGUpOworCWlub2RlLT5pX25saW5rID0gZnMxNl90b19jcHUoc2IsIHVmczJfaW5vZGUtPnVpX25saW5rKTsKKwlpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCkKKwkJdWZzX2Vycm9yIChzYiwgInVmc19yZWFkX2lub2RlIiwgImlub2RlICVsdSBoYXMgemVybyBubGlua1xuIiwgaW5vZGUtPmlfaW5vKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBMaW51eCBub3cgaGFzIDMyLWJpdCB1aWQgYW5kIGdpZCwgc28gd2UgY2FuIHN1cHBvcnQgRUZULgorICAgICAgICAgKi8KKwlpbm9kZS0+aV91aWQgPSBmczMyX3RvX2NwdShzYiwgdWZzMl9pbm9kZS0+dWlfdWlkKTsKKwlpbm9kZS0+aV9naWQgPSBmczMyX3RvX2NwdShzYiwgdWZzMl9pbm9kZS0+dWlfZ2lkKTsKKworCWlub2RlLT5pX3NpemUgPSBmczY0X3RvX2NwdShzYiwgdWZzMl9pbm9kZS0+dWlfc2l6ZSk7CisJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gZnMzMl90b19jcHUoc2IsIHVmczJfaW5vZGUtPnVpX2F0aW1lLnR2X3NlYyk7CisJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gZnMzMl90b19jcHUoc2IsIHVmczJfaW5vZGUtPnVpX2N0aW1lLnR2X3NlYyk7CisJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gZnMzMl90b19jcHUoc2IsIHVmczJfaW5vZGUtPnVpX210aW1lLnR2X3NlYyk7CisJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IDA7CisJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7CisJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7CisJaW5vZGUtPmlfYmxvY2tzID0gZnM2NF90b19jcHUoc2IsIHVmczJfaW5vZGUtPnVpX2Jsb2Nrcyk7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfU0laRTsgLypUaGlzIGlzIHRoZSBvcHRpbWFsIElPIHNpemUoZm9yIHN0YXQpKi8KKworCWlub2RlLT5pX3ZlcnNpb24rKzsKKwl1ZnNpLT5pX2ZsYWdzID0gZnMzMl90b19jcHUoc2IsIHVmczJfaW5vZGUtPnVpX2ZsYWdzKTsKKwl1ZnNpLT5pX2dlbiA9IGZzMzJfdG9fY3B1KHNiLCB1ZnMyX2lub2RlLT51aV9nZW4pOworCS8qCisJdWZzaS0+aV9zaGFkb3cgPSBmczMyX3RvX2NwdShzYiwgdWZzX2lub2RlLT51aV91My51aV9zdW4udWlfc2hhZG93KTsKKwl1ZnNpLT5pX29lZnRmbGFnID0gZnMzMl90b19jcHUoc2IsIHVmc19pbm9kZS0+dWlfdTMudWlfc3VuLnVpX29lZnRmbGFnKTsKKwkqLworCXVmc2ktPmlfbGFzdGZyYWc9IChpbm9kZS0+aV9zaXplICsgdXNwaS0+c19mc2l6ZS0gMSkgPj4gdXNwaS0+c19mc2hpZnQ7CisKKwlpZiAoU19JU0NIUihtb2RlKSB8fCBTX0lTQkxLKG1vZGUpIHx8IGlub2RlLT5pX2Jsb2NrcykgeworCQlmb3IgKGkgPSAwOyBpIDwgKFVGU19OREFERFIgKyBVRlNfTklORElSKTsgaSsrKQorCQkJdWZzaS0+aV91MS51Ml9pX2RhdGFbaV0gPQorCQkJCXVmczJfaW5vZGUtPnVpX3UyLnVpX2FkZHIudWlfZGJbaV07CisJfQorCWVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgKFVGU19OREFERFIgKyBVRlNfTklORElSKSAqIDQ7IGkrKykKKwkJCXVmc2ktPmlfdTEuaV9zeW1saW5rW2ldID0gdWZzMl9pbm9kZS0+dWlfdTIudWlfc3ltbGlua1tpXTsKKwl9CisJdWZzaS0+aV9vc3luYyA9IDA7CisKKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZ1ZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmdWZzX2ZpbGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmdWZzX2FvcHM7CisJfSBlbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJnVmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJnVmc19kaXJfb3BlcmF0aW9uczsKKwl9IGVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKCFpbm9kZS0+aV9ibG9ja3MpCisJCQlpbm9kZS0+aV9vcCA9ICZ1ZnNfZmFzdF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWVsc2UgeworCQkJaW5vZGUtPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZ1ZnNfYW9wczsKKwkJfQorCX0gZWxzZSAgIC8qIFRPRE8gIDogaGVyZSAuLi4qLworCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCisJCQl1ZnNfZ2V0X2lub2RlX2RldihzYiwgdWZzaSkpOworCisJYnJlbHNlKGJoKTsKKworCVVGU0QoKCJFWElUXG4iKSkKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgdWZzX3VwZGF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IGRvX3N5bmMpCit7CisJc3RydWN0IHVmc19pbm9kZV9pbmZvICp1ZnNpID0gVUZTX0koaW5vZGUpOworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgdWZzX2lub2RlICogdWZzX2lub2RlOworCXVuc2lnbmVkIGk7CisJdW5zaWduZWQgZmxhZ3M7CisKKwlVRlNEKCgiRU5URVIsIGlubyAlbHVcbiIsIGlub2RlLT5pX2lubykpCisKKwlzYiA9IGlub2RlLT5pX3NiOworCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJZmxhZ3MgPSBVRlNfU0Ioc2IpLT5zX2ZsYWdzOworCisJaWYgKGlub2RlLT5pX2lubyA8IFVGU19ST09USU5PIHx8IAorCSAgICBpbm9kZS0+aV9pbm8gPiAodXNwaS0+c19uY2cgKiB1c3BpLT5zX2lwZykpIHsKKwkJdWZzX3dhcm5pbmcgKHNiLCAidWZzX3JlYWRfaW5vZGUiLCAiYmFkIGlub2RlIG51bWJlciAoJWx1KVxuIiwgaW5vZGUtPmlfaW5vKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWJoID0gc2JfYnJlYWQoc2IsIHVmc19pbm90b2ZzYmEoaW5vZGUtPmlfaW5vKSk7CisJaWYgKCFiaCkgeworCQl1ZnNfd2FybmluZyAoc2IsICJ1ZnNfcmVhZF9pbm9kZSIsICJ1bmFibGUgdG8gcmVhZCBpbm9kZSAlbHVcbiIsIGlub2RlLT5pX2lubyk7CisJCXJldHVybiAtMTsKKwl9CisJdWZzX2lub2RlID0gKHN0cnVjdCB1ZnNfaW5vZGUgKikgKGJoLT5iX2RhdGEgKyB1ZnNfaW5vdG9mc2JvKGlub2RlLT5pX2lubykgKiBzaXplb2Yoc3RydWN0IHVmc19pbm9kZSkpOworCisJdWZzX2lub2RlLT51aV9tb2RlID0gY3B1X3RvX2ZzMTYoc2IsIGlub2RlLT5pX21vZGUpOworCXVmc19pbm9kZS0+dWlfbmxpbmsgPSBjcHVfdG9fZnMxNihzYiwgaW5vZGUtPmlfbmxpbmspOworCisJdWZzX3NldF9pbm9kZV91aWQoc2IsIHVmc19pbm9kZSwgaW5vZGUtPmlfdWlkKTsKKwl1ZnNfc2V0X2lub2RlX2dpZChzYiwgdWZzX2lub2RlLCBpbm9kZS0+aV9naWQpOworCQkKKwl1ZnNfaW5vZGUtPnVpX3NpemUgPSBjcHVfdG9fZnM2NChzYiwgaW5vZGUtPmlfc2l6ZSk7CisJdWZzX2lub2RlLT51aV9hdGltZS50dl9zZWMgPSBjcHVfdG9fZnMzMihzYiwgaW5vZGUtPmlfYXRpbWUudHZfc2VjKTsKKwl1ZnNfaW5vZGUtPnVpX2F0aW1lLnR2X3VzZWMgPSAwOworCXVmc19pbm9kZS0+dWlfY3RpbWUudHZfc2VjID0gY3B1X3RvX2ZzMzIoc2IsIGlub2RlLT5pX2N0aW1lLnR2X3NlYyk7CisJdWZzX2lub2RlLT51aV9jdGltZS50dl91c2VjID0gMDsKKwl1ZnNfaW5vZGUtPnVpX210aW1lLnR2X3NlYyA9IGNwdV90b19mczMyKHNiLCBpbm9kZS0+aV9tdGltZS50dl9zZWMpOworCXVmc19pbm9kZS0+dWlfbXRpbWUudHZfdXNlYyA9IDA7CisJdWZzX2lub2RlLT51aV9ibG9ja3MgPSBjcHVfdG9fZnMzMihzYiwgaW5vZGUtPmlfYmxvY2tzKTsKKwl1ZnNfaW5vZGUtPnVpX2ZsYWdzID0gY3B1X3RvX2ZzMzIoc2IsIHVmc2ktPmlfZmxhZ3MpOworCXVmc19pbm9kZS0+dWlfZ2VuID0gY3B1X3RvX2ZzMzIoc2IsIHVmc2ktPmlfZ2VuKTsKKworCWlmICgoZmxhZ3MgJiBVRlNfVUlEX01BU0spID09IFVGU19VSURfRUZUKSB7CisJCXVmc19pbm9kZS0+dWlfdTMudWlfc3VuLnVpX3NoYWRvdyA9IGNwdV90b19mczMyKHNiLCB1ZnNpLT5pX3NoYWRvdyk7CisJCXVmc19pbm9kZS0+dWlfdTMudWlfc3VuLnVpX29lZnRmbGFnID0gY3B1X3RvX2ZzMzIoc2IsIHVmc2ktPmlfb2VmdGZsYWcpOworCX0KKworCWlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHsKKwkJLyogdWZzX2lub2RlLT51aV91Mi51aV9hZGRyLnVpX2RiWzBdID0gY3B1X3RvX2ZzMzIoc2IsIGlub2RlLT5pX3JkZXYpOyAqLworCQl1ZnNfaW5vZGUtPnVpX3UyLnVpX2FkZHIudWlfZGJbMF0gPSB1ZnNpLT5pX3UxLmlfZGF0YVswXTsKKwl9IGVsc2UgaWYgKGlub2RlLT5pX2Jsb2NrcykgeworCQlmb3IgKGkgPSAwOyBpIDwgKFVGU19OREFERFIgKyBVRlNfTklORElSKTsgaSsrKQorCQkJdWZzX2lub2RlLT51aV91Mi51aV9hZGRyLnVpX2RiW2ldID0gdWZzaS0+aV91MS5pX2RhdGFbaV07CisJfQorCWVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgKFVGU19OREFERFIgKyBVRlNfTklORElSKSAqIDQ7IGkrKykKKwkJCXVmc19pbm9kZS0+dWlfdTIudWlfc3ltbGlua1tpXSA9IHVmc2ktPmlfdTEuaV9zeW1saW5rW2ldOworCX0KKworCWlmICghaW5vZGUtPmlfbmxpbmspCisJCW1lbXNldCAodWZzX2lub2RlLCAwLCBzaXplb2Yoc3RydWN0IHVmc19pbm9kZSkpOworCQkKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKGRvX3N5bmMpCisJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwlicmVsc2UgKGJoKTsKKwkKKwlVRlNEKCgiRVhJVFxuIikpCisJcmV0dXJuIDA7Cit9CisKK2ludCB1ZnNfd3JpdGVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgd2FpdCkKK3sKKwlpbnQgcmV0OworCWxvY2tfa2VybmVsKCk7CisJcmV0ID0gdWZzX3VwZGF0ZV9pbm9kZSAoaW5vZGUsIHdhaXQpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdWZzX3N5bmNfaW5vZGUgKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIHVmc191cGRhdGVfaW5vZGUgKGlub2RlLCAxKTsKK30KKwordm9pZCB1ZnNfZGVsZXRlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwkvKlVGU19JKGlub2RlKS0+aV9kdGltZSA9IENVUlJFTlRfVElNRTsqLworCWxvY2tfa2VybmVsKCk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJdWZzX3VwZGF0ZV9pbm9kZShpbm9kZSwgSVNfU1lOQyhpbm9kZSkpOworCWlub2RlLT5pX3NpemUgPSAwOworCWlmIChpbm9kZS0+aV9ibG9ja3MpCisJCXVmc190cnVuY2F0ZSAoaW5vZGUpOworCXVmc19mcmVlX2lub2RlIChpbm9kZSk7CisJdW5sb2NrX2tlcm5lbCgpOworfQpkaWZmIC0tZ2l0IGEvZnMvdWZzL25hbWVpLmMgYi9mcy91ZnMvbmFtZWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTU4Y2RlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvdWZzL25hbWVpLmMKQEAgLTAsMCArMSwzNzUgQEAKKy8qCisgKiBsaW51eC9mcy91ZnMvbmFtZWkuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OAorICogRGFuaWVsIFBpcmtsIDxkYW5pZWwucGlya2xAZW1haWwuY3o+CisgKiBDaGFybGVzIFVuaXZlcnNpdHksIEZhY3VsdHkgb2YgTWF0aGVtYXRpY3MgYW5kIFBoeXNpY3MKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9mcy9leHQyL25hbWVpLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvbWluaXgvbmFtZWkuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIEJpZy1lbmRpYW4gdG8gbGl0dGxlLWVuZGlhbiBieXRlLXN3YXBwaW5nL2JpdG1hcHMgYnkKKyAqICAgICAgICBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpLCAxOTk1CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Vmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlICJzd2FiLmgiCS8qIHdpbGwgZ28gYXdheSAtIHNlZSBjb21tZW50IGluIG1rbm9kKCkgKi8KKyNpbmNsdWRlICJ1dGlsLmgiCisKKy8qCisjdW5kZWYgVUZTX05BTUVJX0RFQlVHCisqLworI2RlZmluZSBVRlNfTkFNRUlfREVCVUcKKworI2lmZGVmIFVGU19OQU1FSV9ERUJVRworI2RlZmluZSBVRlNEKHgpIHByaW50aygiKCVzLCAlZCksICVzOiAiLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXyk7IHByaW50ayB4OworI2Vsc2UKKyNkZWZpbmUgVUZTRCh4KQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1ZnNfaW5jX2NvdW50KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW5vZGUtPmlfbmxpbmsrKzsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVmc19kZWNfY291bnQoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbm9kZS0+aV9ubGluay0tOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworfQorCitzdGF0aWMgaW5saW5lIGludCB1ZnNfYWRkX25vbmRpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGVyciA9IHVmc19hZGRfbGluayhkZW50cnksIGlub2RlKTsKKwlpZiAoIWVycikgeworCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCQlyZXR1cm4gMDsKKwl9CisJdWZzX2RlY19jb3VudChpbm9kZSk7CisJaXB1dChpbm9kZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKnVmc19sb29rdXAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gTlVMTDsKKwlpbm9fdCBpbm87CisJCisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IFVGU19NQVhOQU1MRU4pCisJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCisJbG9ja19rZXJuZWwoKTsKKwlpbm8gPSB1ZnNfaW5vZGVfYnlfbmFtZShkaXIsIGRlbnRyeSk7CisJaWYgKGlubykgeworCQlpbm9kZSA9IGlnZXQoZGlyLT5pX3NiLCBpbm8pOworCQlpZiAoIWlub2RlKSB7CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKwkJfQorCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBCeSB0aGUgdGltZSB0aGlzIGlzIGNhbGxlZCwgd2UgYWxyZWFkeSBoYXZlIGNyZWF0ZWQKKyAqIHRoZSBkaXJlY3RvcnkgY2FjaGUgZW50cnkgZm9yIHRoZSBuZXcgZmlsZSwgYnV0IGl0CisgKiBpcyBzbyBmYXIgbmVnYXRpdmUgLSBpdCBoYXMgbm8gaW5vZGUuCisgKgorICogSWYgdGhlIGNyZWF0ZSBzdWNjZWVkcywgd2UgZmlsbCBpbiB0aGUgaW5vZGUgaW5mb3JtYXRpb24KKyAqIHdpdGggZF9pbnN0YW50aWF0ZSgpLiAKKyAqLworc3RhdGljIGludCB1ZnNfY3JlYXRlIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGludCBtb2RlLAorCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IHVmc19uZXdfaW5vZGUoZGlyLCBtb2RlKTsKKwlpbnQgZXJyID0gUFRSX0VSUihpbm9kZSk7CisJaWYgKCFJU19FUlIoaW5vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJnVmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZ1ZnNfZmlsZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZ1ZnNfYW9wczsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCWxvY2tfa2VybmVsKCk7CisJCWVyciA9IHVmc19hZGRfbm9uZGlyKGRlbnRyeSwgaW5vZGUpOworCQl1bmxvY2tfa2VybmVsKCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdWZzX21rbm9kIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIGRldl90IHJkZXYpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgZXJyOworCisJaWYgKCFvbGRfdmFsaWRfZGV2KHJkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpbm9kZSA9IHVmc19uZXdfaW5vZGUoZGlyLCBtb2RlKTsKKwllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwlpZiAoIUlTX0VSUihpbm9kZSkpIHsKKwkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBtb2RlLCByZGV2KTsKKwkJLyogTk9URTogdGhhdCdsbCBnbyB3aGVuIHdlIGdldCB3aWRlIGRldl90ICovCisJCXVmc19zZXRfaW5vZGVfZGV2KGlub2RlLT5pX3NiLCBVRlNfSShpbm9kZSksIHJkZXYpOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJbG9ja19rZXJuZWwoKTsKKwkJZXJyID0gdWZzX2FkZF9ub25kaXIoZGVudHJ5LCBpbm9kZSk7CisJCXVubG9ja19rZXJuZWwoKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB1ZnNfc3ltbGluayAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LAorCWNvbnN0IGNoYXIgKiBzeW1uYW1lKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gZGlyLT5pX3NiOworCWludCBlcnIgPSAtRU5BTUVUT09MT05HOworCXVuc2lnbmVkIGwgPSBzdHJsZW4oc3ltbmFtZSkrMTsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKworCWlmIChsID4gc2ItPnNfYmxvY2tzaXplKQorCQlnb3RvIG91dDsKKworCWxvY2tfa2VybmVsKCk7CisJaW5vZGUgPSB1ZnNfbmV3X2lub2RlKGRpciwgU19JRkxOSyB8IFNfSVJXWFVHTyk7CisJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCWdvdG8gb3V0OworCisJaWYgKGwgPiBVRlNfU0Ioc2IpLT5zX3VzcGktPnNfbWF4c3ltbGlua2xlbikgeworCQkvKiBzbG93IHN5bWxpbmsgKi8KKwkJaW5vZGUtPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnVmc19hb3BzOworCQllcnIgPSBwYWdlX3N5bWxpbmsoaW5vZGUsIHN5bW5hbWUsIGwpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfZmFpbDsKKwl9IGVsc2UgeworCQkvKiBmYXN0IHN5bWxpbmsgKi8KKwkJaW5vZGUtPmlfb3AgPSAmdWZzX2Zhc3Rfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQltZW1jcHkoKGNoYXIqKSZVRlNfSShpbm9kZSktPmlfdTEuaV9kYXRhLHN5bW5hbWUsbCk7CisJCWlub2RlLT5pX3NpemUgPSBsLTE7CisJfQorCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCisJZXJyID0gdWZzX2FkZF9ub25kaXIoZGVudHJ5LCBpbm9kZSk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7CisKK291dF9mYWlsOgorCXVmc19kZWNfY291bnQoaW5vZGUpOworCWlwdXQoaW5vZGUpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IHVmc19saW5rIChzdHJ1Y3QgZGVudHJ5ICogb2xkX2RlbnRyeSwgc3RydWN0IGlub2RlICogZGlyLAorCXN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyb3I7CisKKwlsb2NrX2tlcm5lbCgpOworCWlmIChpbm9kZS0+aV9ubGluayA+PSBVRlNfTElOS19NQVgpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVNTElOSzsKKwl9CisKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJdWZzX2luY19jb3VudChpbm9kZSk7CisJYXRvbWljX2luYygmaW5vZGUtPmlfY291bnQpOworCisJZXJyb3IgPSB1ZnNfYWRkX25vbmRpcihkZW50cnksIGlub2RlKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IHVmc19ta2RpcihzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGludCBtb2RlKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCWludCBlcnIgPSAtRU1MSU5LOworCisJaWYgKGRpci0+aV9ubGluayA+PSBVRlNfTElOS19NQVgpCisJCWdvdG8gb3V0OworCisJbG9ja19rZXJuZWwoKTsKKwl1ZnNfaW5jX2NvdW50KGRpcik7CisKKwlpbm9kZSA9IHVmc19uZXdfaW5vZGUoZGlyLCBTX0lGRElSfG1vZGUpOworCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCWlmIChJU19FUlIoaW5vZGUpKQorCQlnb3RvIG91dF9kaXI7CisKKwlpbm9kZS0+aV9vcCA9ICZ1ZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJnVmc19kaXJfb3BlcmF0aW9uczsKKworCXVmc19pbmNfY291bnQoaW5vZGUpOworCisJZXJyID0gdWZzX21ha2VfZW1wdHkoaW5vZGUsIGRpcik7CisJaWYgKGVycikKKwkJZ290byBvdXRfZmFpbDsKKworCWVyciA9IHVmc19hZGRfbGluayhkZW50cnksIGlub2RlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mYWlsOworCXVubG9ja19rZXJuZWwoKTsKKworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKKworb3V0X2ZhaWw6CisJdWZzX2RlY19jb3VudChpbm9kZSk7CisJdWZzX2RlY19jb3VudChpbm9kZSk7CisJaXB1dCAoaW5vZGUpOworb3V0X2RpcjoKKwl1ZnNfZGVjX2NvdW50KGRpcik7CisJdW5sb2NrX2tlcm5lbCgpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IHVmc191bmxpbmsoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IHVmc19kaXJfZW50cnkgKiBkZTsKKwlpbnQgZXJyID0gLUVOT0VOVDsKKworCWxvY2tfa2VybmVsKCk7CisJZGUgPSB1ZnNfZmluZF9lbnRyeSAoZGVudHJ5LCAmYmgpOworCWlmICghZGUpCisJCWdvdG8gb3V0OworCisJZXJyID0gdWZzX2RlbGV0ZV9lbnRyeSAoZGlyLCBkZSwgYmgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWU7CisJdWZzX2RlY19jb3VudChpbm9kZSk7CisJZXJyID0gMDsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB1ZnNfcm1kaXIgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnI9IC1FTk9URU1QVFk7CisKKwlsb2NrX2tlcm5lbCgpOworCWlmICh1ZnNfZW1wdHlfZGlyIChpbm9kZSkpIHsKKwkJZXJyID0gdWZzX3VubGluayhkaXIsIGRlbnRyeSk7CisJCWlmICghZXJyKSB7CisJCQlpbm9kZS0+aV9zaXplID0gMDsKKwkJCXVmc19kZWNfY291bnQoaW5vZGUpOworCQkJdWZzX2RlY19jb3VudChkaXIpOworCQl9CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHVmc19yZW5hbWUgKHN0cnVjdCBpbm9kZSAqIG9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKiBvbGRfZGVudHJ5LAorCXN0cnVjdCBpbm9kZSAqIG5ld19kaXIsCXN0cnVjdCBkZW50cnkgKiBuZXdfZGVudHJ5ICkKK3sKKwlzdHJ1Y3QgaW5vZGUgKm9sZF9pbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICpuZXdfaW5vZGUgPSBuZXdfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlyX2JoID0gTlVMTDsKKwlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqZGlyX2RlID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm9sZF9iaDsKKwlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqb2xkX2RlOworCWludCBlcnIgPSAtRU5PRU5UOworCisJbG9ja19rZXJuZWwoKTsKKwlvbGRfZGUgPSB1ZnNfZmluZF9lbnRyeSAob2xkX2RlbnRyeSwgJm9sZF9iaCk7CisJaWYgKCFvbGRfZGUpCisJCWdvdG8gb3V0OworCisJaWYgKFNfSVNESVIob2xkX2lub2RlLT5pX21vZGUpKSB7CisJCWVyciA9IC1FSU87CisJCWRpcl9kZSA9IHVmc19kb3Rkb3Qob2xkX2lub2RlLCAmZGlyX2JoKTsKKwkJaWYgKCFkaXJfZGUpCisJCQlnb3RvIG91dF9vbGQ7CisJfQorCisJaWYgKG5ld19pbm9kZSkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5ld19iaDsKKwkJc3RydWN0IHVmc19kaXJfZW50cnkgKm5ld19kZTsKKworCQllcnIgPSAtRU5PVEVNUFRZOworCQlpZiAoZGlyX2RlICYmICF1ZnNfZW1wdHlfZGlyIChuZXdfaW5vZGUpKQorCQkJZ290byBvdXRfZGlyOworCQllcnIgPSAtRU5PRU5UOworCQluZXdfZGUgPSB1ZnNfZmluZF9lbnRyeSAobmV3X2RlbnRyeSwgJm5ld19iaCk7CisJCWlmICghbmV3X2RlKQorCQkJZ290byBvdXRfZGlyOworCQl1ZnNfaW5jX2NvdW50KG9sZF9pbm9kZSk7CisJCXVmc19zZXRfbGluayhuZXdfZGlyLCBuZXdfZGUsIG5ld19iaCwgb2xkX2lub2RlKTsKKwkJbmV3X2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwkJaWYgKGRpcl9kZSkKKwkJCW5ld19pbm9kZS0+aV9ubGluay0tOworCQl1ZnNfZGVjX2NvdW50KG5ld19pbm9kZSk7CisJfSBlbHNlIHsKKwkJaWYgKGRpcl9kZSkgeworCQkJZXJyID0gLUVNTElOSzsKKwkJCWlmIChuZXdfZGlyLT5pX25saW5rID49IFVGU19MSU5LX01BWCkKKwkJCQlnb3RvIG91dF9kaXI7CisJCX0KKwkJdWZzX2luY19jb3VudChvbGRfaW5vZGUpOworCQllcnIgPSB1ZnNfYWRkX2xpbmsobmV3X2RlbnRyeSwgb2xkX2lub2RlKTsKKwkJaWYgKGVycikgeworCQkJdWZzX2RlY19jb3VudChvbGRfaW5vZGUpOworCQkJZ290byBvdXRfZGlyOworCQl9CisJCWlmIChkaXJfZGUpCisJCQl1ZnNfaW5jX2NvdW50KG5ld19kaXIpOworCX0KKworCXVmc19kZWxldGVfZW50cnkgKG9sZF9kaXIsIG9sZF9kZSwgb2xkX2JoKTsKKworCXVmc19kZWNfY291bnQob2xkX2lub2RlKTsKKworCWlmIChkaXJfZGUpIHsKKwkJdWZzX3NldF9saW5rKG9sZF9pbm9kZSwgZGlyX2RlLCBkaXJfYmgsIG5ld19kaXIpOworCQl1ZnNfZGVjX2NvdW50KG9sZF9kaXIpOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7CisKK291dF9kaXI6CisJaWYgKGRpcl9kZSkKKwkJYnJlbHNlKGRpcl9iaCk7CitvdXRfb2xkOgorCWJyZWxzZSAob2xkX2JoKTsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0geworCS5jcmVhdGUJCT0gdWZzX2NyZWF0ZSwKKwkubG9va3VwCQk9IHVmc19sb29rdXAsCisJLmxpbmsJCT0gdWZzX2xpbmssCisJLnVubGluawkJPSB1ZnNfdW5saW5rLAorCS5zeW1saW5rCT0gdWZzX3N5bWxpbmssCisJLm1rZGlyCQk9IHVmc19ta2RpciwKKwkucm1kaXIJCT0gdWZzX3JtZGlyLAorCS5ta25vZAkJPSB1ZnNfbWtub2QsCisJLnJlbmFtZQkJPSB1ZnNfcmVuYW1lLAorfTsKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9zdXBlci5jIGIvZnMvdWZzL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzNmQ2OQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Vmcy9zdXBlci5jCkBAIC0wLDAgKzEsMTM0NyBAQAorLyoKKyAqICBsaW51eC9mcy91ZnMvc3VwZXIuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OAorICogRGFuaWVsIFBpcmtsIDxkYW5pZWwucGlya2xAZW1haWwuY3o+CisgKiBDaGFybGVzIFVuaXZlcnNpdHksIEZhY3VsdHkgb2YgTWF0aGVtYXRpY3MgYW5kIFBoeXNpY3MKKyAqLworCisvKiBEZXJpdmVkIGZyb20KKyAqCisgKiAgbGludXgvZnMvZXh0Mi9zdXBlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2ZzL21pbml4L2lub2RlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBCaWctZW5kaWFuIHRvIGxpdHRsZS1lbmRpYW4gYnl0ZS1zd2FwcGluZy9iaXRtYXBzIGJ5CisgKiAgICAgICAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KSwgMTk5NQorICovCisgCisvKgorICogSW5zcGlyZWQgYnkKKyAqCisgKiAgbGludXgvZnMvdWZzL3N1cGVyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYKKyAqIEFkcmlhbiBSb2RyaWd1ZXogKGFkcmlhbkBmcmFua2xpbnMtdG93ZXIucnV0Z2Vycy5lZHUpCisgKiBMYWJvcmF0b3J5IGZvciBDb21wdXRlciBTY2llbmNlIFJlc2VhcmNoIENvbXB1dGluZyBGYWNpbGl0eQorICogUnV0Z2VycywgVGhlIFN0YXRlIFVuaXZlcnNpdHkgb2YgTmV3IEplcnNleQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiAgRWRkaWUgQy4gRG9zdCAgKGVjZEBza3luZXQuYmUpCisgKgorICogS2VybmVsIG1vZHVsZSBzdXBwb3J0IGFkZGVkIG9uIDk2LzA0LzI2IGJ5CisgKiBTdGVmYW4gUmVpbmF1ZXIgPHN0ZXBhbkBob21lLmN1bHR1cmUubWlwdC5ydT4KKyAqCisgKiBNb2R1bGUgdXNhZ2UgY291bnRzIGFkZGVkIG9uIDk2LzA0LzI5IGJ5CisgKiBHZXJ0amFuIHZhbiBXaW5nZXJkZSA8Z2VydGphbkBjcy52dS5ubD4KKyAqCisgKiBDbGVhbiBzd2FiIHN1cHBvcnQgb24gMTk5NzA0MDYgYnkKKyAqIEZyYW5jb2lzLVJlbmUgUmlkZWF1IDxmYXJlQHR1bmVzLm9yZz4KKyAqCisgKiA0LjRCU0QgKEZyZWVCU0QpIHN1cHBvcnQgYWRkZWQgb24gRmVicnVhcnkgMXN0IDE5OTggYnkKKyAqIE5pZWxzIEtyaXN0aWFuIEJlY2ggSmVuc2VuIDxua2JqQGltYWdlLmRrPiBwYXJ0aWFsbHkgYmFzZWQKKyAqIG9uIGNvZGUgYnkgTWFydGluIHZvbiBMb2V3aXMgPG1hcnRpbkBtaXJhLmlzZG4uY3MudHUtYmVybGluLmRlPi4KKyAqCisgKiBOZVhUc3RlcCBzdXBwb3J0IGFkZGVkIG9uIEZlYnJ1YXJ5IDV0aCAxOTk4IGJ5CisgKiBOaWVscyBLcmlzdGlhbiBCZWNoIEplbnNlbiA8bmtiakBpbWFnZS5kaz4uCisgKgorICogd3JpdGUgc3VwcG9ydCBEYW5pZWwgUGlya2wgPGRhbmllbC5waXJrbEBlbWFpbC5jej4gMTk5OAorICogCisgKiBIUC9VWCBoZnMgZmlsZXN5c3RlbSBzdXBwb3J0IGFkZGVkIGJ5CisgKiBNYXJ0aW4gSy4gUGV0ZXJzZW4gPG1rcEBta3AubmV0PiwgQXVndXN0IDE5OTkKKyAqCisgKiBVRlMyIChvZiBGcmVlQlNEIDUueCkgc3VwcG9ydCBhZGRlZCBieQorICogTmlyYWogS3VtYXIgPG5pcmFqMTdAaWl0Ym9tYmF5Lm9yZz4sIEphbiAyMDA0CisgKgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91ZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorCisjaW5jbHVkZSAic3dhYi5oIgorI2luY2x1ZGUgInV0aWwuaCIKKworI3VuZGVmIFVGU19TVVBFUl9ERUJVRworI3VuZGVmIFVGU19TVVBFUl9ERUJVR19NT1JFCisKKworI3VuZGVmIFVGU19TVVBFUl9ERUJVR19NT1JFCisjaWZkZWYgVUZTX1NVUEVSX0RFQlVHCisjZGVmaW5lIFVGU0QoeCkgcHJpbnRrKCIoJXMsICVkKSwgJXM6ICIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgcHJpbnRrIHg7CisjZWxzZQorI2RlZmluZSBVRlNEKHgpCisjZW5kaWYKKworI2lmZGVmIFVGU19TVVBFUl9ERUJVR19NT1JFCisvKgorICogUHJpbnQgY29udGVudHMgb2YgdWZzX3N1cGVyX2Jsb2NrLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworICovCit2b2lkIHVmc19wcmludF9zdXBlcl9zdHVmZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKiB1c2IxLAorCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfc2Vjb25kICogdXNiMiwgCisJc3RydWN0IHVmc19zdXBlcl9ibG9ja190aGlyZCAqIHVzYjMpCit7CisJcHJpbnRrKCJ1ZnNfcHJpbnRfc3VwZXJfc3R1ZmZcbiIpOworCXByaW50aygic2l6ZSBvZiB1c2I6ICAgICAldVxuIiwgc2l6ZW9mKHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2spKTsKKwlwcmludGsoIiAgbWFnaWM6ICAgICAgICAgMHgleFxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjMtPmZzX21hZ2ljKSk7CisJcHJpbnRrKCIgIHNibGtubzogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfc2Jsa25vKSk7CisJcHJpbnRrKCIgIGNibGtubzogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY2Jsa25vKSk7CisJcHJpbnRrKCIgIGlibGtubzogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfaWJsa25vKSk7CisJcHJpbnRrKCIgIGRibGtubzogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZGJsa25vKSk7CisJcHJpbnRrKCIgIGNnb2Zmc2V0OiAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY2dvZmZzZXQpKTsKKwlwcmludGsoIiAgfmNnbWFzazogICAgICAgMHgleFxuIiwgfmZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jZ21hc2spKTsKKwlwcmludGsoIiAgc2l6ZTogICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19zaXplKSk7CisJcHJpbnRrKCIgIGRzaXplOiAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZHNpemUpKTsKKwlwcmludGsoIiAgbmNnOiAgICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19uY2cpKTsKKwlwcmludGsoIiAgYnNpemU6ICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19ic2l6ZSkpOworCXByaW50aygiICBmc2l6ZTogICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZzaXplKSk7CisJcHJpbnRrKCIgIGZyYWc6ICAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnJhZykpOworCXByaW50aygiICBmcmFnc2hpZnQ6ICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZyYWdzaGlmdCkpOworCXByaW50aygiICB+Zm1hc2s6ICAgICAgICAldVxuIiwgfmZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19mbWFzaykpOworCXByaW50aygiICBmc2hpZnQ6ICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZzaGlmdCkpOworCXByaW50aygiICBzYnNpemU6ICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX3Nic2l6ZSkpOworCXByaW50aygiICBzcGM6ICAgICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX3NwYykpOworCXByaW50aygiICBjcGc6ICAgICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NwZykpOworCXByaW50aygiICBpcGc6ICAgICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2lwZykpOworCXByaW50aygiICBmcGc6ICAgICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZwZykpOworCXByaW50aygiICBjc2FkZHI6ICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NzYWRkcikpOworCXByaW50aygiICBjc3NpemU6ICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2Nzc2l6ZSkpOworCXByaW50aygiICBjZ3NpemU6ICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2Nnc2l6ZSkpOworCXByaW50aygiICBmc3RvZGI6ICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZzYnRvZGIpKTsKKwlwcmludGsoIiAgY29udGlnc3Vtc2l6ZTogJWRcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc191Mi5mc180NC5mc19jb250aWdzdW1zaXplKSk7CisJcHJpbnRrKCIgIHBvc3RibGZvcm1hdDogICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfcG9zdGJsZm9ybWF0KSk7CisJcHJpbnRrKCIgIG5ycG9zOiAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfbnJwb3MpKTsKKwlwcmludGsoIiAgbmRpciAgICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25kaXIpKTsKKwlwcmludGsoIiAgbmlmcmVlICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25pZnJlZSkpOworCXByaW50aygiICBuYmZyZWUgICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NzdG90YWwuY3NfbmJmcmVlKSk7CisJcHJpbnRrKCIgIG5mZnJlZSAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3N0b3RhbC5jc19uZmZyZWUpKTsKKwlwcmludGsoIlxuIik7Cit9CisKKy8qCisgKiBQcmludCBjb250ZW50cyBvZiB1ZnMyIHVmc19zdXBlcl9ibG9jaywgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyAqLwordm9pZCB1ZnMyX3ByaW50X3N1cGVyX3N0dWZmKAorICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorICAgICAgc3RydWN0IHVmc19zdXBlcl9ibG9jayAqdXNiKQoreworCXByaW50aygidWZzX3ByaW50X3N1cGVyX3N0dWZmXG4iKTsKKwlwcmludGsoInNpemUgb2YgdXNiOiAgICAgJXVcbiIsIHNpemVvZihzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrKSk7CisJcHJpbnRrKCIgIG1hZ2ljOiAgICAgICAgIDB4JXhcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2ItPmZzX21hZ2ljKSk7CisJcHJpbnRrKCIgIGZzX3NpemU6ICAgJXVcbiIsZnM2NF90b19jcHUoc2IsIHVzYi0+ZnNfdTExLmZzX3UyLmZzX3NpemUpKTsKKwlwcmludGsoIiAgZnNfZHNpemU6ICAldVxuIixmczY0X3RvX2NwdShzYiwgdXNiLT5mc191MTEuZnNfdTIuZnNfZHNpemUpKTsKKwlwcmludGsoIiAgYnNpemU6ICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHVzYiwgdXNiLT5mc19ic2l6ZSkpOworCXByaW50aygiICBmc2l6ZTogICAgICAgICAldVxuIiwgZnMzMl90b19jcHUodXNiLCB1c2ItPmZzX2ZzaXplKSk7CisJcHJpbnRrKCIgIGZzX3ZvbG5hbWU6ICAlc1xuIiwgdXNiLT5mc191MTEuZnNfdTIuZnNfdm9sbmFtZSk7CisJcHJpbnRrKCIgIGZzX2ZzbW50OiAgJXNcbiIsIHVzYi0+ZnNfdTExLmZzX3UyLmZzX2ZzbW50KTsKKwlwcmludGsoIiAgZnNfc2Jsb2NrbG9jOiAldVxuIixmczY0X3RvX2NwdShzYiwKKwkJCXVzYi0+ZnNfdTExLmZzX3UyLmZzX3NibG9ja2xvYykpOworCXByaW50aygiICBjc19uZGlyKE5vIG9mIGRpcnMpOiAgJXVcbiIsZnM2NF90b19jcHUoc2IsCisJCQl1c2ItPmZzX3UxMS5mc191Mi5mc19jc3RvdGFsLmNzX25kaXIpKTsKKwlwcmludGsoIiAgY3NfbmJmcmVlKE5vIG9mIGZyZWUgYmxvY2tzKTogICV1XG4iLGZzNjRfdG9fY3B1KHNiLAorCQkJdXNiLT5mc191MTEuZnNfdTIuZnNfY3N0b3RhbC5jc19uYmZyZWUpKTsKKwlwcmludGsoIlxuIik7Cit9CisKKy8qCisgKiBQcmludCBjb250ZW50cyBvZiB1ZnNfY3lsaW5kZXJfZ3JvdXAsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisgKi8KK3ZvaWQgdWZzX3ByaW50X2N5bGluZGVyX3N0dWZmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKmNnKQoreworCXByaW50aygiXG51ZnNfcHJpbnRfY3lsaW5kZXJfc3R1ZmZcbiIpOworCXByaW50aygic2l6ZSBvZiB1Y2c6ICV1XG4iLCBzaXplb2Yoc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCkpOworCXByaW50aygiICBtYWdpYzogICAgICAgICV4XG4iLCBmczMyX3RvX2NwdShzYiwgY2ctPmNnX21hZ2ljKSk7CisJcHJpbnRrKCIgIHRpbWU6ICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfdGltZSkpOworCXByaW50aygiICBjZ3g6ICAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgY2ctPmNnX2NneCkpOworCXByaW50aygiICBuY3lsOiAgICAgICAgICV1XG4iLCBmczE2X3RvX2NwdShzYiwgY2ctPmNnX25jeWwpKTsKKwlwcmludGsoIiAgbmlibGs6ICAgICAgICAldVxuIiwgZnMxNl90b19jcHUoc2IsIGNnLT5jZ19uaWJsaykpOworCXByaW50aygiICBuZGJsazogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgY2ctPmNnX25kYmxrKSk7CisJcHJpbnRrKCIgIGNzX25kaXI6ICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfY3MuY3NfbmRpcikpOworCXByaW50aygiICBjc19uYmZyZWU6ICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgY2ctPmNnX2NzLmNzX25iZnJlZSkpOworCXByaW50aygiICBjc19uaWZyZWU6ICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgY2ctPmNnX2NzLmNzX25pZnJlZSkpOworCXByaW50aygiICBjc19uZmZyZWU6ICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgY2ctPmNnX2NzLmNzX25mZnJlZSkpOworCXByaW50aygiICByb3RvcjogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgY2ctPmNnX3JvdG9yKSk7CisJcHJpbnRrKCIgIGZyb3RvcjogICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfZnJvdG9yKSk7CisJcHJpbnRrKCIgIGlyb3RvcjogICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfaXJvdG9yKSk7CisJcHJpbnRrKCIgIGZyc3VtOiAgICAgICAgJXUsICV1LCAldSwgJXUsICV1LCAldSwgJXUsICV1XG4iLAorCSAgICBmczMyX3RvX2NwdShzYiwgY2ctPmNnX2Zyc3VtWzBdKSwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ19mcnN1bVsxXSksCisJICAgIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfZnJzdW1bMl0pLCBmczMyX3RvX2NwdShzYiwgY2ctPmNnX2Zyc3VtWzNdKSwKKwkgICAgZnMzMl90b19jcHUoc2IsIGNnLT5jZ19mcnN1bVs0XSksIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfZnJzdW1bNV0pLAorCSAgICBmczMyX3RvX2NwdShzYiwgY2ctPmNnX2Zyc3VtWzZdKSwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ19mcnN1bVs3XSkpOworCXByaW50aygiICBidG90b2ZmOiAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgY2ctPmNnX2J0b3RvZmYpKTsKKwlwcmludGsoIiAgYm9mZjogICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ19ib2ZmKSk7CisJcHJpbnRrKCIgIGl1c2VvZmY6ICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfaXVzZWRvZmYpKTsKKwlwcmludGsoIiAgZnJlZW9mZjogICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ19mcmVlb2ZmKSk7CisJcHJpbnRrKCIgIG5leHRmcmVlb2ZmOiAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfbmV4dGZyZWVvZmYpKTsKKwlwcmludGsoIiAgY2x1c3RlcnN1bW9mZiAldVxuIiwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ191LmNnXzQ0LmNnX2NsdXN0ZXJzdW1vZmYpKTsKKwlwcmludGsoIiAgY2x1c3Rlcm9mZiAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ191LmNnXzQ0LmNnX2NsdXN0ZXJvZmYpKTsKKwlwcmludGsoIiAgbmNsdXN0ZXJibGtzICAldVxuIiwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ191LmNnXzQ0LmNnX25jbHVzdGVyYmxrcykpOworCXByaW50aygiXG4iKTsKK30KKyNlbmRpZiAvKiBVRlNfU1VQRVJfREVCVUdfTU9SRSAqLworCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgdWZzX3N1cGVyX29wczsKKworc3RhdGljIGNoYXIgZXJyb3JfYnVmWzEwMjRdOworCit2b2lkIHVmc19lcnJvciAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGNvbnN0IGNoYXIgKiBmdW5jdGlvbiwKKwljb25zdCBjaGFyICogZm10LCAuLi4pCit7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKiB1c2IxOworCXZhX2xpc3QgYXJnczsKKworCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKKwkKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJdXNiMS0+ZnNfY2xlYW4gPSBVRlNfRlNCQUQ7CisJCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eShVU1BJX1VCSCk7CisJCXNiLT5zX2RpcnQgPSAxOworCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJfQorCXZhX3N0YXJ0IChhcmdzLCBmbXQpOworCXZzcHJpbnRmIChlcnJvcl9idWYsIGZtdCwgYXJncyk7CisJdmFfZW5kIChhcmdzKTsKKwlzd2l0Y2ggKFVGU19TQihzYiktPnNfbW91bnRfb3B0ICYgVUZTX01PVU5UX09ORVJST1IpIHsKKwljYXNlIFVGU19NT1VOVF9PTkVSUk9SX1BBTklDOgorCQlwYW5pYyAoIlVGUy1mcyBwYW5pYyAoZGV2aWNlICVzKTogJXM6ICVzXG4iLCAKKwkJCXNiLT5zX2lkLCBmdW5jdGlvbiwgZXJyb3JfYnVmKTsKKworCWNhc2UgVUZTX01PVU5UX09ORVJST1JfTE9DSzoKKwljYXNlIFVGU19NT1VOVF9PTkVSUk9SX1VNT1VOVDoKKwljYXNlIFVGU19NT1VOVF9PTkVSUk9SX1JFUEFJUjoKKwkJcHJpbnRrIChLRVJOX0NSSVQgIlVGUy1mcyBlcnJvciAoZGV2aWNlICVzKTogJXM6ICVzXG4iLAorCQkJc2ItPnNfaWQsIGZ1bmN0aW9uLCBlcnJvcl9idWYpOworCX0JCQorfQorCit2b2lkIHVmc19wYW5pYyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGNvbnN0IGNoYXIgKiBmdW5jdGlvbiwKKwljb25zdCBjaGFyICogZm10LCAuLi4pCit7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKiB1c2IxOworCXZhX2xpc3QgYXJnczsKKwkKKwl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7CisJCisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCXVzYjEtPmZzX2NsZWFuID0gVUZTX0ZTQkFEOworCQl1YmhfbWFya19idWZmZXJfZGlydHkoVVNQSV9VQkgpOworCQlzYi0+c19kaXJ0ID0gMTsKKwl9CisJdmFfc3RhcnQgKGFyZ3MsIGZtdCk7CisJdnNwcmludGYgKGVycm9yX2J1ZiwgZm10LCBhcmdzKTsKKwl2YV9lbmQgKGFyZ3MpOworCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKwlwcmludGsgKEtFUk5fQ1JJVCAiVUZTLWZzIHBhbmljIChkZXZpY2UgJXMpOiAlczogJXNcbiIsCisJCXNiLT5zX2lkLCBmdW5jdGlvbiwgZXJyb3JfYnVmKTsKK30KKwordm9pZCB1ZnNfd2FybmluZyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGNvbnN0IGNoYXIgKiBmdW5jdGlvbiwKKwljb25zdCBjaGFyICogZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQgKGFyZ3MsIGZtdCk7CisJdnNwcmludGYgKGVycm9yX2J1ZiwgZm10LCBhcmdzKTsKKwl2YV9lbmQgKGFyZ3MpOworCXByaW50ayAoS0VSTl9XQVJOSU5HICJVRlMtZnMgd2FybmluZyAoZGV2aWNlICVzKTogJXM6ICVzXG4iLAorCQlzYi0+c19pZCwgZnVuY3Rpb24sIGVycm9yX2J1Zik7Cit9CisKK2VudW0geworCU9wdF90eXBlX29sZCwgT3B0X3R5cGVfc3VueDg2LCBPcHRfdHlwZV9zdW4sIE9wdF90eXBlXzQ0YnNkLAorCU9wdF90eXBlX3VmczIsIE9wdF90eXBlX2hwLCBPcHRfdHlwZV9uZXh0c3RlcGNkLCBPcHRfdHlwZV9uZXh0c3RlcCwKKwlPcHRfdHlwZV9vcGVuc3RlcCwgT3B0X29uZXJyb3JfcGFuaWMsIE9wdF9vbmVycm9yX2xvY2ssCisJT3B0X29uZXJyb3JfdW1vdW50LCBPcHRfb25lcnJvcl9yZXBhaXIsIE9wdF9lcnIKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7T3B0X3R5cGVfb2xkLCAidWZzdHlwZT1vbGQifSwKKwl7T3B0X3R5cGVfc3VueDg2LCAidWZzdHlwZT1zdW54ODYifSwKKwl7T3B0X3R5cGVfc3VuLCAidWZzdHlwZT1zdW4ifSwKKwl7T3B0X3R5cGVfNDRic2QsICJ1ZnN0eXBlPTQ0YnNkIn0sCisJe09wdF90eXBlX3VmczIsICJ1ZnN0eXBlPXVmczIifSwKKwl7T3B0X3R5cGVfdWZzMiwgInVmc3R5cGU9NXhic2QifSwKKwl7T3B0X3R5cGVfaHAsICJ1ZnN0eXBlPWhwIn0sCisJe09wdF90eXBlX25leHRzdGVwY2QsICJ1ZnN0eXBlPW5leHRzdGVwLWNkIn0sCisJe09wdF90eXBlX25leHRzdGVwLCAidWZzdHlwZT1uZXh0c3RlcCJ9LAorCXtPcHRfdHlwZV9vcGVuc3RlcCwgInVmc3R5cGU9b3BlbnN0ZXAifSwKKwl7T3B0X29uZXJyb3JfcGFuaWMsICJvbmVycm9yPXBhbmljIn0sCisJe09wdF9vbmVycm9yX2xvY2ssICJvbmVycm9yPWxvY2sifSwKKwl7T3B0X29uZXJyb3JfdW1vdW50LCAib25lcnJvcj11bW91bnQifSwKKwl7T3B0X29uZXJyb3JfcmVwYWlyLCAib25lcnJvcj1yZXBhaXIifSwKKwl7T3B0X2VyciwgTlVMTH0KK307CisKK3N0YXRpYyBpbnQgdWZzX3BhcnNlX29wdGlvbnMgKGNoYXIgKiBvcHRpb25zLCB1bnNpZ25lZCAqIG1vdW50X29wdGlvbnMpCit7CisJY2hhciAqIHA7CisJCisJVUZTRCgoIkVOVEVSXG4iKSkKKwkKKwlpZiAoIW9wdGlvbnMpCisJCXJldHVybiAxOworCisJd2hpbGUgKChwID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CisJCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKKwkJaW50IHRva2VuOworCQlpZiAoISpwKQorCQkJY29udGludWU7CisKKwkJdG9rZW4gPSBtYXRjaF90b2tlbihwLCB0b2tlbnMsIGFyZ3MpOworCQlzd2l0Y2ggKHRva2VuKSB7CisJCWNhc2UgT3B0X3R5cGVfb2xkOgorCQkJdWZzX2NsZWFyX29wdCAoKm1vdW50X29wdGlvbnMsIFVGU1RZUEUpOworCQkJdWZzX3NldF9vcHQgKCptb3VudF9vcHRpb25zLCBVRlNUWVBFX09MRCk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfdHlwZV9zdW54ODY6CisJCQl1ZnNfY2xlYXJfb3B0ICgqbW91bnRfb3B0aW9ucywgVUZTVFlQRSk7CisJCQl1ZnNfc2V0X29wdCAoKm1vdW50X29wdGlvbnMsIFVGU1RZUEVfU1VOeDg2KTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF90eXBlX3N1bjoKKwkJCXVmc19jbGVhcl9vcHQgKCptb3VudF9vcHRpb25zLCBVRlNUWVBFKTsKKwkJCXVmc19zZXRfb3B0ICgqbW91bnRfb3B0aW9ucywgVUZTVFlQRV9TVU4pOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3R5cGVfNDRic2Q6CisJCQl1ZnNfY2xlYXJfb3B0ICgqbW91bnRfb3B0aW9ucywgVUZTVFlQRSk7CisJCQl1ZnNfc2V0X29wdCAoKm1vdW50X29wdGlvbnMsIFVGU1RZUEVfNDRCU0QpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3R5cGVfdWZzMjoKKwkJCXVmc19jbGVhcl9vcHQoKm1vdW50X29wdGlvbnMsIFVGU1RZUEUpOworCQkJdWZzX3NldF9vcHQoKm1vdW50X29wdGlvbnMsIFVGU1RZUEVfVUZTMik7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfdHlwZV9ocDoKKwkJCXVmc19jbGVhcl9vcHQgKCptb3VudF9vcHRpb25zLCBVRlNUWVBFKTsKKwkJCXVmc19zZXRfb3B0ICgqbW91bnRfb3B0aW9ucywgVUZTVFlQRV9IUCk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfdHlwZV9uZXh0c3RlcGNkOgorCQkJdWZzX2NsZWFyX29wdCAoKm1vdW50X29wdGlvbnMsIFVGU1RZUEUpOworCQkJdWZzX3NldF9vcHQgKCptb3VudF9vcHRpb25zLCBVRlNUWVBFX05FWFRTVEVQX0NEKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF90eXBlX25leHRzdGVwOgorCQkJdWZzX2NsZWFyX29wdCAoKm1vdW50X29wdGlvbnMsIFVGU1RZUEUpOworCQkJdWZzX3NldF9vcHQgKCptb3VudF9vcHRpb25zLCBVRlNUWVBFX05FWFRTVEVQKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF90eXBlX29wZW5zdGVwOgorCQkJdWZzX2NsZWFyX29wdCAoKm1vdW50X29wdGlvbnMsIFVGU1RZUEUpOworCQkJdWZzX3NldF9vcHQgKCptb3VudF9vcHRpb25zLCBVRlNUWVBFX09QRU5TVEVQKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9vbmVycm9yX3BhbmljOgorCQkJdWZzX2NsZWFyX29wdCAoKm1vdW50X29wdGlvbnMsIE9ORVJST1IpOworCQkJdWZzX3NldF9vcHQgKCptb3VudF9vcHRpb25zLCBPTkVSUk9SX1BBTklDKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9vbmVycm9yX2xvY2s6CisJCQl1ZnNfY2xlYXJfb3B0ICgqbW91bnRfb3B0aW9ucywgT05FUlJPUik7CisJCQl1ZnNfc2V0X29wdCAoKm1vdW50X29wdGlvbnMsIE9ORVJST1JfTE9DSyk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfb25lcnJvcl91bW91bnQ6CisJCQl1ZnNfY2xlYXJfb3B0ICgqbW91bnRfb3B0aW9ucywgT05FUlJPUik7CisJCQl1ZnNfc2V0X29wdCAoKm1vdW50X29wdGlvbnMsIE9ORVJST1JfVU1PVU5UKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9vbmVycm9yX3JlcGFpcjoKKwkJCXByaW50aygiVUZTLWZzOiBVbmFibGUgdG8gZG8gcmVwYWlyIG9uIGVycm9yLCAiCisJCQkJIndpbGwgbG9jayBsb2NrIGluc3RlYWRcbiIpOworCQkJdWZzX2NsZWFyX29wdCAoKm1vdW50X29wdGlvbnMsIE9ORVJST1IpOworCQkJdWZzX3NldF9vcHQgKCptb3VudF9vcHRpb25zLCBPTkVSUk9SX1JFUEFJUik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiVUZTLWZzOiBJbnZhbGlkIG9wdGlvbjogXCIlc1wiICIKKwkJCQkJIm9yIG1pc3NpbmcgdmFsdWVcbiIsIHApOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZWFkIG9uLWRpc2sgc3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGggY3lsaW5kZXIgZ3JvdXBzCisgKi8KK3N0YXRpYyBpbnQgdWZzX3JlYWRfY3lsaW5kZXJfc3RydWN0dXJlcyAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikgeworCXN0cnVjdCB1ZnNfc2JfaW5mbyAqIHNiaSA9IFVGU19TQihzYik7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgKnVzYjsKKwlzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdWJoOworCXVuc2lnbmVkIGNoYXIgKiBiYXNlLCAqIHNwYWNlOworCXVuc2lnbmVkIHNpemUsIGJsa3MsIGk7CisJdW5zaWduZWQgZmxhZ3MgPSAwOworCQorCVVGU0QoKCJFTlRFUlxuIikpCisJCisJdXNwaSA9IHNiaS0+c191c3BpOworCisJdXNiICA9IChzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrICopCisJCSgoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKXVzcGkpLT5iaFswXS0+Yl9kYXRhOworCisgICAgICAgIGZsYWdzID0gVUZTX1NCKHNiKS0+c19mbGFnczsKKwkKKwkvKgorCSAqIFJlYWQgY3Mgc3RydWN0dXJlcyBmcm9tICh1c3VhbGx5KSBmaXJzdCBkYXRhIGJsb2NrCisJICogb24gdGhlIGRldmljZS4gCisJICovCisJc2l6ZSA9IHVzcGktPnNfY3NzaXplOworCWJsa3MgPSAoc2l6ZSArIHVzcGktPnNfZnNpemUgLSAxKSA+PiB1c3BpLT5zX2ZzaGlmdDsKKwliYXNlID0gc3BhY2UgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghYmFzZSkKKwkJZ290byBmYWlsZWQ7IAorCWZvciAoaSA9IDA7IGkgPCBibGtzOyBpICs9IHVzcGktPnNfZnBiKSB7CisJCXNpemUgPSB1c3BpLT5zX2JzaXplOworCQlpZiAoaSArIHVzcGktPnNfZnBiID4gYmxrcykKKwkJCXNpemUgPSAoYmxrcyAtIGkpICogdXNwaS0+c19mc2l6ZTsKKworCQlpZiAoKGZsYWdzICYgVUZTX1RZUEVfTUFTSykgPT0gVUZTX1RZUEVfVUZTMikgeworCQkJdWJoID0gdWJoX2JyZWFkKHNiLAorCQkJCWZzNjRfdG9fY3B1KHNiLCB1c2ItPmZzX3UxMS5mc191Mi5mc19jc2FkZHIpICsgaSwgc2l6ZSk7CisJCQlpZiAoIXViaCkKKwkJCQlnb3RvIGZhaWxlZDsKKwkJCXViaF91YmhjcHltZW0gKHNwYWNlLCB1YmgsIHNpemUpOworCQkJc2JpLT5zX2NzcFt1ZnNfZnJhZ3N0b2Jsa3MoaSldPShzdHJ1Y3QgdWZzX2NzdW0gKilzcGFjZTsKKwkJfQorCQllbHNlIHsKKwkJCXViaCA9IHViaF9icmVhZChzYiwgdXNwaS0+c19jc2FkZHIgKyBpLCBzaXplKTsKKwkJCWlmICghdWJoKQorCQkJCWdvdG8gZmFpbGVkOworCQkJdWJoX3ViaGNweW1lbShzcGFjZSwgdWJoLCBzaXplKTsKKwkJCXNiaS0+c19jc3BbdWZzX2ZyYWdzdG9ibGtzKGkpXT0oc3RydWN0IHVmc19jc3VtICopc3BhY2U7CisJCX0KKwkJc3BhY2UgKz0gc2l6ZTsKKwkJdWJoX2JyZWxzZSAodWJoKTsKKwkJdWJoID0gTlVMTDsKKwl9CisKKwkvKgorCSAqIFJlYWQgY3lsaW5kZXIgZ3JvdXAgKHdlIHJlYWQgb25seSBmaXJzdCBmcmFnbWVudCBmcm9tIGJsb2NrCisJICogYXQgdGhpcyB0aW1lKSBhbmQgcHJlcGFyZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgZm9yIGNnIGNhY2hpbmcuCisJICovCisJaWYgKCEoc2JpLT5zX3VjZyA9IGttYWxsb2MgKHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKikgKiB1c3BpLT5zX25jZywgR0ZQX0tFUk5FTCkpKQorCQlnb3RvIGZhaWxlZDsKKwlmb3IgKGkgPSAwOyBpIDwgdXNwaS0+c19uY2c7IGkrKykgCisJCXNiaS0+c191Y2dbaV0gPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBVRlNfTUFYX0dST1VQX0xPQURFRDsgaSsrKSB7CisJCXNiaS0+c191Y3BpW2ldID0gTlVMTDsKKwkJc2JpLT5zX2Nnbm9baV0gPSBVRlNfQ0dOT19FTVBUWTsKKwl9CisJZm9yIChpID0gMDsgaSA8IHVzcGktPnNfbmNnOyBpKyspIHsKKwkJVUZTRCgoInJlYWQgY2cgJXVcbiIsIGkpKQorCQlpZiAoIShzYmktPnNfdWNnW2ldID0gc2JfYnJlYWQoc2IsIHVmc19jZ2NtaW4oaSkpKSkKKwkJCWdvdG8gZmFpbGVkOworCQlpZiAoIXVmc19jZ19jaGttYWdpYyAoc2IsIChzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwICopIHNiaS0+c191Y2dbaV0tPmJfZGF0YSkpCisJCQlnb3RvIGZhaWxlZDsKKyNpZmRlZiBVRlNfU1VQRVJfREVCVUdfTU9SRQorCQl1ZnNfcHJpbnRfY3lsaW5kZXJfc3R1ZmYoc2IsIChzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwICopIHNiaS0+c191Y2dbaV0tPmJfZGF0YSk7CisjZW5kaWYKKwl9CisJZm9yIChpID0gMDsgaSA8IFVGU19NQVhfR1JPVVBfTE9BREVEOyBpKyspIHsKKwkJaWYgKCEoc2JpLT5zX3VjcGlbaV0gPSBrbWFsbG9jIChzaXplb2Yoc3RydWN0IHVmc19jZ19wcml2YXRlX2luZm8pLCBHRlBfS0VSTkVMKSkpCisJCQlnb3RvIGZhaWxlZDsKKwkJc2JpLT5zX2Nnbm9baV0gPSBVRlNfQ0dOT19FTVBUWTsKKwl9CisJc2JpLT5zX2NnX2xvYWRlZCA9IDA7CisJVUZTRCgoIkVYSVRcbiIpKQorCXJldHVybiAxOworCitmYWlsZWQ6CisJaWYgKGJhc2UpIGtmcmVlIChiYXNlKTsKKwlpZiAoc2JpLT5zX3VjZykgeworCQlmb3IgKGkgPSAwOyBpIDwgdXNwaS0+c19uY2c7IGkrKykKKwkJCWlmIChzYmktPnNfdWNnW2ldKSBicmVsc2UgKHNiaS0+c191Y2dbaV0pOworCQlrZnJlZSAoc2JpLT5zX3VjZyk7CisJCWZvciAoaSA9IDA7IGkgPCBVRlNfTUFYX0dST1VQX0xPQURFRDsgaSsrKQorCQkJaWYgKHNiaS0+c191Y3BpW2ldKSBrZnJlZSAoc2JpLT5zX3VjcGlbaV0pOworCX0KKwlVRlNEKCgiRVhJVCAoRkFJTEVEKVxuIikpCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQdXQgb24tZGlzayBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCBjeWxpbmRlciBncm91cHMgYW5kIAorICogd3JpdGUgdGhlbSBiYWNrIHRvIGRpc2sKKyAqLworc3RhdGljIHZvaWQgdWZzX3B1dF9jeWxpbmRlcl9zdHJ1Y3R1cmVzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKSB7CisJc3RydWN0IHVmc19zYl9pbmZvICogc2JpID0gVUZTX1NCKHNiKTsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIHViaDsKKwl1bnNpZ25lZCBjaGFyICogYmFzZSwgKiBzcGFjZTsKKwl1bnNpZ25lZCBibGtzLCBzaXplLCBpOworCQorCVVGU0QoKCJFTlRFUlxuIikpCisJCisJdXNwaSA9IHNiaS0+c191c3BpOworCisJc2l6ZSA9IHVzcGktPnNfY3NzaXplOworCWJsa3MgPSAoc2l6ZSArIHVzcGktPnNfZnNpemUgLSAxKSA+PiB1c3BpLT5zX2ZzaGlmdDsKKwliYXNlID0gc3BhY2UgPSAoY2hhciopIHNiaS0+c19jc3BbMF07CisJZm9yIChpID0gMDsgaSA8IGJsa3M7IGkgKz0gdXNwaS0+c19mcGIpIHsKKwkJc2l6ZSA9IHVzcGktPnNfYnNpemU7CisJCWlmIChpICsgdXNwaS0+c19mcGIgPiBibGtzKQorCQkJc2l6ZSA9IChibGtzIC0gaSkgKiB1c3BpLT5zX2ZzaXplOworCQl1YmggPSB1YmhfYnJlYWQoc2IsIHVzcGktPnNfY3NhZGRyICsgaSwgc2l6ZSk7CisJCXViaF9tZW1jcHl1YmggKHViaCwgc3BhY2UsIHNpemUpOworCQlzcGFjZSArPSBzaXplOworCQl1YmhfbWFya19idWZmZXJfdXB0b2RhdGUgKHViaCwgMSk7CisJCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAodWJoKTsKKwkJdWJoX2JyZWxzZSAodWJoKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IHNiaS0+c19jZ19sb2FkZWQ7IGkrKykgeworCQl1ZnNfcHV0X2N5bGluZGVyIChzYiwgaSk7CisJCWtmcmVlIChzYmktPnNfdWNwaVtpXSk7CisJfQorCWZvciAoOyBpIDwgVUZTX01BWF9HUk9VUF9MT0FERUQ7IGkrKykgCisJCWtmcmVlIChzYmktPnNfdWNwaVtpXSk7CisJZm9yIChpID0gMDsgaSA8IHVzcGktPnNfbmNnOyBpKyspIAorCQlicmVsc2UgKHNiaS0+c191Y2dbaV0pOworCWtmcmVlIChzYmktPnNfdWNnKTsKKwlrZnJlZSAoYmFzZSk7CisJVUZTRCgoIkVYSVRcbiIpKQorfQorCitzdGF0aWMgaW50IHVmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IHVmc19zYl9pbmZvICogc2JpOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICogdXNiMTsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3NlY29uZCAqIHVzYjI7CisJc3RydWN0IHVmc19zdXBlcl9ibG9ja190aGlyZCAqIHVzYjM7CisJc3RydWN0IHVmc19zdXBlcl9ibG9jayAqdXNiOworCXN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1Ymg7CQorCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJdW5zaWduZWQgYmxvY2tfc2l6ZSwgc3VwZXJfYmxvY2tfc2l6ZTsKKwl1bnNpZ25lZCBmbGFnczsKKworCXVzcGkgPSBOVUxMOworCXViaCA9IE5VTEw7CisJZmxhZ3MgPSAwOworCQorCVVGU0QoKCJFTlRFUlxuIikpCisJCQorCXNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1ZnNfc2JfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghc2JpKQorCQlnb3RvIGZhaWxlZF9ub21lbTsKKwlzYi0+c19mc19pbmZvID0gc2JpOworCW1lbXNldChzYmksIDAsIHNpemVvZihzdHJ1Y3QgdWZzX3NiX2luZm8pKTsKKworCVVGU0QoKCJmbGFnICV1XG4iLCAoaW50KShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpKQorCQorI2lmbmRlZiBDT05GSUdfVUZTX0ZTX1dSSVRFCisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCXByaW50aygidWZzIHdhcyBjb21waWxlZCB3aXRoIHJlYWQtb25seSBzdXBwb3J0LCAiCisJCSJjYW4ndCBiZSBtb3VudGVkIGFzIHJlYWQtd3JpdGVcbiIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisjZW5kaWYKKwkvKgorCSAqIFNldCBkZWZhdWx0IG1vdW50IG9wdGlvbnMKKwkgKiBQYXJzZSBtb3VudCBvcHRpb25zCisJICovCisJc2JpLT5zX21vdW50X29wdCA9IDA7CisJdWZzX3NldF9vcHQgKHNiaS0+c19tb3VudF9vcHQsIE9ORVJST1JfTE9DSyk7CisJaWYgKCF1ZnNfcGFyc2Vfb3B0aW9ucyAoKGNoYXIgKikgZGF0YSwgJnNiaS0+c19tb3VudF9vcHQpKSB7CisJCXByaW50aygid3JvbmcgbW91bnQgb3B0aW9uc1xuIik7CisJCWdvdG8gZmFpbGVkOworCX0KKwlpZiAoIShzYmktPnNfbW91bnRfb3B0ICYgVUZTX01PVU5UX1VGU1RZUEUpKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKCJZb3UgZGlkbid0IHNwZWNpZnkgdGhlIHR5cGUgb2YgeW91ciB1ZnMgZmlsZXN5c3RlbVxuXG4iCisJCQkibW91bnQgLXQgdWZzIC1vIHVmc3R5cGU9IgorCQkJInN1bnxzdW54ODZ8NDRic2R8dWZzMnw1eGJzZHxvbGR8aHB8bmV4dHN0ZXB8bmV0eHN0ZXAtY2R8b3BlbnN0ZXAgLi4uXG5cbiIKKwkJCSI+Pj5XQVJOSU5HPDw8IFdyb25nIHVmc3R5cGUgbWF5IGNvcnJ1cHQgeW91ciBmaWxlc3lzdGVtLCAiCisJCQkiZGVmYXVsdCBpcyB1ZnN0eXBlPW9sZFxuIik7CisJCXVmc19zZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBVRlNUWVBFX09MRCk7CisJfQorCisJc2JpLT5zX3VzcGkgPSB1c3BpID0KKwkJa21hbGxvYyAoc2l6ZW9mKHN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1c3BpKQorCQlnb3RvIGZhaWxlZDsKKworCS8qIEtlZXAgMkdpZyBmaWxlIGxpbWl0LiBTb21lIFVGUyB2YXJpYW50cyBuZWVkIHRvIG92ZXJyaWRlIAorCSAgIHRoaXMgYnV0IGFzIEkgZG9uJ3Qga25vdyB3aGljaCBJJ2xsIGxldCB0aG9zZSBpbiB0aGUga25vdyBsb29zZW4KKwkgICB0aGUgcnVsZXMgKi8KKwkgICAKKwlzd2l0Y2ggKHNiaS0+c19tb3VudF9vcHQgJiBVRlNfTU9VTlRfVUZTVFlQRSkgeworCWNhc2UgVUZTX01PVU5UX1VGU1RZUEVfNDRCU0Q6CisJCVVGU0QoKCJ1ZnN0eXBlPTQ0YnNkXG4iKSkKKwkJdXNwaS0+c19mc2l6ZSA9IGJsb2NrX3NpemUgPSA1MTI7CisJCXVzcGktPnNfZm1hc2sgPSB+KDUxMiAtIDEpOworCQl1c3BpLT5zX2ZzaGlmdCA9IDk7CisJCXVzcGktPnNfc2JzaXplID0gc3VwZXJfYmxvY2tfc2l6ZSA9IDE1MzY7CisJCXVzcGktPnNfc2JiYXNlID0gMDsKKwkJZmxhZ3MgfD0gVUZTX0RFXzQ0QlNEIHwgVUZTX1VJRF80NEJTRCB8IFVGU19TVF80NEJTRCB8IFVGU19DR180NEJTRDsKKwkJYnJlYWs7CisJY2FzZSBVRlNfTU9VTlRfVUZTVFlQRV9VRlMyOgorCQlVRlNEKCgidWZzdHlwZT11ZnMyXG4iKSkKKwkJdXNwaS0+c19mc2l6ZSA9IGJsb2NrX3NpemUgPSA1MTI7CisJCXVzcGktPnNfZm1hc2sgPSB+KDUxMiAtIDEpOworCQl1c3BpLT5zX2ZzaGlmdCA9IDk7CisJCXVzcGktPnNfc2JzaXplID0gc3VwZXJfYmxvY2tfc2l6ZSA9IDE1MzY7CisJCXVzcGktPnNfc2JiYXNlID0gIDA7CisJCWZsYWdzIHw9IFVGU19UWVBFX1VGUzIgfCBVRlNfREVfNDRCU0QgfCBVRlNfVUlEXzQ0QlNEIHwgVUZTX1NUXzQ0QlNEIHwgVUZTX0NHXzQ0QlNEOworCQlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gInVmc3R5cGU9dWZzMiBpcyBzdXBwb3J0ZWQgcmVhZC1vbmx5XG4iKTsKKwkJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKyAJCX0KKwkJYnJlYWs7CisJCQorCWNhc2UgVUZTX01PVU5UX1VGU1RZUEVfU1VOOgorCQlVRlNEKCgidWZzdHlwZT1zdW5cbiIpKQorCQl1c3BpLT5zX2ZzaXplID0gYmxvY2tfc2l6ZSA9IDEwMjQ7CisJCXVzcGktPnNfZm1hc2sgPSB+KDEwMjQgLSAxKTsKKwkJdXNwaS0+c19mc2hpZnQgPSAxMDsKKwkJdXNwaS0+c19zYnNpemUgPSBzdXBlcl9ibG9ja19zaXplID0gMjA0ODsKKwkJdXNwaS0+c19zYmJhc2UgPSAwOworCQl1c3BpLT5zX21heHN5bWxpbmtsZW4gPSA1NjsKKwkJZmxhZ3MgfD0gVUZTX0RFX09MRCB8IFVGU19VSURfRUZUIHwgVUZTX1NUX1NVTiB8IFVGU19DR19TVU47CisJCWJyZWFrOworCisJY2FzZSBVRlNfTU9VTlRfVUZTVFlQRV9TVU54ODY6CisJCVVGU0QoKCJ1ZnN0eXBlPXN1bng4NlxuIikpCisJCXVzcGktPnNfZnNpemUgPSBibG9ja19zaXplID0gMTAyNDsKKwkJdXNwaS0+c19mbWFzayA9IH4oMTAyNCAtIDEpOworCQl1c3BpLT5zX2ZzaGlmdCA9IDEwOworCQl1c3BpLT5zX3Nic2l6ZSA9IHN1cGVyX2Jsb2NrX3NpemUgPSAyMDQ4OworCQl1c3BpLT5zX3NiYmFzZSA9IDA7CisJCXVzcGktPnNfbWF4c3ltbGlua2xlbiA9IDU2OworCQlmbGFncyB8PSBVRlNfREVfT0xEIHwgVUZTX1VJRF9FRlQgfCBVRlNfU1RfU1VOeDg2IHwgVUZTX0NHX1NVTjsKKwkJYnJlYWs7CisKKwljYXNlIFVGU19NT1VOVF9VRlNUWVBFX09MRDoKKwkJVUZTRCgoInVmc3R5cGU9b2xkXG4iKSkKKwkJdXNwaS0+c19mc2l6ZSA9IGJsb2NrX3NpemUgPSAxMDI0OworCQl1c3BpLT5zX2ZtYXNrID0gfigxMDI0IC0gMSk7CisJCXVzcGktPnNfZnNoaWZ0ID0gMTA7CisJCXVzcGktPnNfc2JzaXplID0gc3VwZXJfYmxvY2tfc2l6ZSA9IDIwNDg7CisJCXVzcGktPnNfc2JiYXNlID0gMDsKKwkJZmxhZ3MgfD0gVUZTX0RFX09MRCB8IFVGU19VSURfT0xEIHwgVUZTX1NUX09MRCB8IFVGU19DR19PTEQ7CisJCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJaWYgKCFzaWxlbnQpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAidWZzdHlwZT1vbGQgaXMgc3VwcG9ydGVkIHJlYWQtb25seVxuIik7CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJCX0KKwkJYnJlYWs7CisJCisJY2FzZSBVRlNfTU9VTlRfVUZTVFlQRV9ORVhUU1RFUDoKKwkJVUZTRCgoInVmc3R5cGU9bmV4dHN0ZXBcbiIpKQorCQl1c3BpLT5zX2ZzaXplID0gYmxvY2tfc2l6ZSA9IDEwMjQ7CisJCXVzcGktPnNfZm1hc2sgPSB+KDEwMjQgLSAxKTsKKwkJdXNwaS0+c19mc2hpZnQgPSAxMDsKKwkJdXNwaS0+c19zYnNpemUgPSBzdXBlcl9ibG9ja19zaXplID0gMjA0ODsKKwkJdXNwaS0+c19zYmJhc2UgPSAwOworCQlmbGFncyB8PSBVRlNfREVfT0xEIHwgVUZTX1VJRF9PTEQgfCBVRlNfU1RfT0xEIHwgVUZTX0NHX09MRDsKKwkJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCQlpZiAoIXNpbGVudCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICJ1ZnN0eXBlPW5leHRzdGVwIGlzIHN1cHBvcnRlZCByZWFkLW9ubHlcbiIpOworCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCQl9CisJCWJyZWFrOworCQorCWNhc2UgVUZTX01PVU5UX1VGU1RZUEVfTkVYVFNURVBfQ0Q6CisJCVVGU0QoKCJ1ZnN0eXBlPW5leHRzdGVwLWNkXG4iKSkKKwkJdXNwaS0+c19mc2l6ZSA9IGJsb2NrX3NpemUgPSAyMDQ4OworCQl1c3BpLT5zX2ZtYXNrID0gfigyMDQ4IC0gMSk7CisJCXVzcGktPnNfZnNoaWZ0ID0gMTE7CisJCXVzcGktPnNfc2JzaXplID0gc3VwZXJfYmxvY2tfc2l6ZSA9IDIwNDg7CisJCXVzcGktPnNfc2JiYXNlID0gMDsKKwkJZmxhZ3MgfD0gVUZTX0RFX09MRCB8IFVGU19VSURfT0xEIHwgVUZTX1NUX09MRCB8IFVGU19DR19PTEQ7CisJCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJaWYgKCFzaWxlbnQpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAidWZzdHlwZT1uZXh0c3RlcC1jZCBpcyBzdXBwb3J0ZWQgcmVhZC1vbmx5XG4iKTsKKwkJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKwkJfQorCQlicmVhazsKKwkKKwljYXNlIFVGU19NT1VOVF9VRlNUWVBFX09QRU5TVEVQOgorCQlVRlNEKCgidWZzdHlwZT1vcGVuc3RlcFxuIikpCisJCXVzcGktPnNfZnNpemUgPSBibG9ja19zaXplID0gMTAyNDsKKwkJdXNwaS0+c19mbWFzayA9IH4oMTAyNCAtIDEpOworCQl1c3BpLT5zX2ZzaGlmdCA9IDEwOworCQl1c3BpLT5zX3Nic2l6ZSA9IHN1cGVyX2Jsb2NrX3NpemUgPSAyMDQ4OworCQl1c3BpLT5zX3NiYmFzZSA9IDA7CisJCWZsYWdzIHw9IFVGU19ERV80NEJTRCB8IFVGU19VSURfNDRCU0QgfCBVRlNfU1RfNDRCU0QgfCBVRlNfQ0dfNDRCU0Q7CisJCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJaWYgKCFzaWxlbnQpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAidWZzdHlwZT1vcGVuc3RlcCBpcyBzdXBwb3J0ZWQgcmVhZC1vbmx5XG4iKTsKKwkJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKwkJfQorCQlicmVhazsKKwkKKwljYXNlIFVGU19NT1VOVF9VRlNUWVBFX0hQOgorCQlVRlNEKCgidWZzdHlwZT1ocFxuIikpCisJCXVzcGktPnNfZnNpemUgPSBibG9ja19zaXplID0gMTAyNDsKKwkJdXNwaS0+c19mbWFzayA9IH4oMTAyNCAtIDEpOworCQl1c3BpLT5zX2ZzaGlmdCA9IDEwOworCQl1c3BpLT5zX3Nic2l6ZSA9IHN1cGVyX2Jsb2NrX3NpemUgPSAyMDQ4OworCQl1c3BpLT5zX3NiYmFzZSA9IDA7CisJCWZsYWdzIHw9IFVGU19ERV9PTEQgfCBVRlNfVUlEX09MRCB8IFVGU19TVF9PTEQgfCBVRlNfQ0dfT0xEOworCQlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJCWlmICghc2lsZW50KQorCQkJCXByaW50ayhLRVJOX0lORk8gInVmc3R5cGU9aHAgaXMgc3VwcG9ydGVkIHJlYWQtb25seVxuIik7CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisgCQl9CisgCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoIXNpbGVudCkKKwkJCXByaW50aygidW5rbm93biB1ZnN0eXBlXG4iKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCQorYWdhaW46CQorCWlmICghc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgYmxvY2tfc2l6ZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVRlM6IGZhaWxlZCB0byBzZXQgYmxvY2tzaXplXG4iKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJLyoKKwkgKiByZWFkIHVmcyBzdXBlciBibG9jayBmcm9tIGRldmljZQorCSAqLworCWlmICggKGZsYWdzICYgVUZTX1RZUEVfTUFTSykgPT0gVUZTX1RZUEVfVUZTMikgeworCQl1YmggPSB1YmhfYnJlYWRfdXNwaSh1c3BpLCBzYiwgdXNwaS0+c19zYmJhc2UgKyBTQkxPQ0tfVUZTMi9ibG9ja19zaXplLCBzdXBlcl9ibG9ja19zaXplKTsKKwl9CisJZWxzZSB7CisJCXViaCA9IHViaF9icmVhZF91c3BpKHVzcGksIHNiLCB1c3BpLT5zX3NiYmFzZSArIFVGU19TQkxPQ0svYmxvY2tfc2l6ZSwgc3VwZXJfYmxvY2tfc2l6ZSk7CisJfQorCWlmICghdWJoKSAKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworCisJCisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKKwl1c2IyID0gdWJoX2dldF91c2Jfc2Vjb25kKFVTUElfVUJIKTsKKwl1c2IzID0gdWJoX2dldF91c2JfdGhpcmQoVVNQSV9VQkgpOworCXVzYiAgPSAoc3RydWN0IHVmc19zdXBlcl9ibG9jayAqKQorCQkoKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKil1c3BpKS0+YmhbMF0tPmJfZGF0YSA7CisKKwkvKgorCSAqIENoZWNrIHVmcyBtYWdpYyBudW1iZXIKKwkgKi8KKwlzYmktPnNfYnl0ZXNleCA9IEJZVEVTRVhfTEU7CisJc3dpdGNoICgodXNwaS0+ZnNfbWFnaWMgPSBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfbWFnaWMpKSkgeworCQljYXNlIFVGU19NQUdJQzoKKwkJY2FzZSBVRlMyX01BR0lDOgorCQljYXNlIFVGU19NQUdJQ19MRk46CisJICAgICAgICBjYXNlIFVGU19NQUdJQ19GRUE6CisJICAgICAgICBjYXNlIFVGU19NQUdJQ180R0I6CisJCQlnb3RvIG1hZ2ljX2ZvdW5kOworCX0KKwlzYmktPnNfYnl0ZXNleCA9IEJZVEVTRVhfQkU7CisJc3dpdGNoICgodXNwaS0+ZnNfbWFnaWMgPSBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfbWFnaWMpKSkgeworCQljYXNlIFVGU19NQUdJQzoKKwkJY2FzZSBVRlMyX01BR0lDOgorCQljYXNlIFVGU19NQUdJQ19MRk46CisJICAgICAgICBjYXNlIFVGU19NQUdJQ19GRUE6CisJICAgICAgICBjYXNlIFVGU19NQUdJQ180R0I6CisJCQlnb3RvIG1hZ2ljX2ZvdW5kOworCX0KKworCWlmICgoKChzYmktPnNfbW91bnRfb3B0ICYgVUZTX01PVU5UX1VGU1RZUEUpID09IFVGU19NT1VOVF9VRlNUWVBFX05FWFRTVEVQKSAKKwkgIHx8ICgoc2JpLT5zX21vdW50X29wdCAmIFVGU19NT1VOVF9VRlNUWVBFKSA9PSBVRlNfTU9VTlRfVUZTVFlQRV9ORVhUU1RFUF9DRCkgCisJICB8fCAoKHNiaS0+c19tb3VudF9vcHQgJiBVRlNfTU9VTlRfVUZTVFlQRSkgPT0gVUZTX01PVU5UX1VGU1RZUEVfT1BFTlNURVApKSAKKwkgICYmIHVzcGktPnNfc2JiYXNlIDwgMjU2KSB7CisJCXViaF9icmVsc2VfdXNwaSh1c3BpKTsKKwkJdWJoID0gTlVMTDsKKwkJdXNwaS0+c19zYmJhc2UgKz0gODsKKwkJZ290byBhZ2FpbjsKKwl9CisJaWYgKCFzaWxlbnQpCisJCXByaW50aygidWZzX3JlYWRfc3VwZXI6IGJhZCBtYWdpYyBudW1iZXJcbiIpOworCWdvdG8gZmFpbGVkOworCittYWdpY19mb3VuZDoKKwkvKgorCSAqIENoZWNrIGJsb2NrIGFuZCBmcmFnbWVudCBzaXplcworCSAqLworCXVzcGktPnNfYnNpemUgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfYnNpemUpOworCXVzcGktPnNfZnNpemUgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnNpemUpOworCXVzcGktPnNfc2JzaXplID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX3Nic2l6ZSk7CisJdXNwaS0+c19mbWFzayA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19mbWFzayk7CisJdXNwaS0+c19mc2hpZnQgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnNoaWZ0KTsKKworCWlmICh1c3BpLT5zX2ZzaXplICYgKHVzcGktPnNfZnNpemUgLSAxKSkgeworCQlwcmludGsoS0VSTl9FUlIgInVmc19yZWFkX3N1cGVyOiBmcmFnbWVudCBzaXplICV1IGlzIG5vdCBhIHBvd2VyIG9mIDJcbiIsCisJCQl1c3BpLT5zX2ZzaXplKTsKKwkJCWdvdG8gZmFpbGVkOworCX0KKwlpZiAodXNwaS0+c19mc2l6ZSA8IDUxMikgeworCQlwcmludGsoS0VSTl9FUlIgInVmc19yZWFkX3N1cGVyOiBmcmFnbWVudCBzaXplICV1IGlzIHRvbyBzbWFsbFxuIiwKKwkJCXVzcGktPnNfZnNpemUpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJaWYgKHVzcGktPnNfZnNpemUgPiA0MDk2KSB7CisJCXByaW50ayhLRVJOX0VSUiAidWZzX3JlYWRfc3VwZXI6IGZyYWdtZW50IHNpemUgJXUgaXMgdG9vIGxhcmdlXG4iLAorCQkJdXNwaS0+c19mc2l6ZSk7CisJCWdvdG8gZmFpbGVkOworCX0KKwlpZiAodXNwaS0+c19ic2l6ZSAmICh1c3BpLT5zX2JzaXplIC0gMSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1ZnNfcmVhZF9zdXBlcjogYmxvY2sgc2l6ZSAldSBpcyBub3QgYSBwb3dlciBvZiAyXG4iLAorCQkJdXNwaS0+c19ic2l6ZSk7CisJCWdvdG8gZmFpbGVkOworCX0KKwlpZiAodXNwaS0+c19ic2l6ZSA8IDQwOTYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1ZnNfcmVhZF9zdXBlcjogYmxvY2sgc2l6ZSAldSBpcyB0b28gc21hbGxcbiIsCisJCQl1c3BpLT5zX2JzaXplKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCWlmICh1c3BpLT5zX2JzaXplIC8gdXNwaS0+c19mc2l6ZSA+IDgpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1ZnNfcmVhZF9zdXBlcjogdG9vIG1hbnkgZnJhZ21lbnRzIHBlciBibG9jayAoJXUpXG4iLAorCQkJdXNwaS0+c19ic2l6ZSAvIHVzcGktPnNfZnNpemUpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJaWYgKHVzcGktPnNfZnNpemUgIT0gYmxvY2tfc2l6ZSB8fCB1c3BpLT5zX3Nic2l6ZSAhPSBzdXBlcl9ibG9ja19zaXplKSB7CisJCXViaF9icmVsc2VfdXNwaSh1c3BpKTsKKwkJdWJoID0gTlVMTDsKKwkJYmxvY2tfc2l6ZSA9IHVzcGktPnNfZnNpemU7CisJCXN1cGVyX2Jsb2NrX3NpemUgPSB1c3BpLT5zX3Nic2l6ZTsKKwkJVUZTRCgoImFub3RoZXIgdmFsdWUgb2YgYmxvY2tfc2l6ZSBvciBzdXBlcl9ibG9ja19zaXplICV1LCAldVxuIiwgYmxvY2tfc2l6ZSwgc3VwZXJfYmxvY2tfc2l6ZSkpCisJCWdvdG8gYWdhaW47CisJfQorCisjaWZkZWYgVUZTX1NVUEVSX0RFQlVHX01PUkUKKyAgICAgICAgaWYgKChmbGFncyAmIFVGU19UWVBFX01BU0spID09IFVGU19UWVBFX1VGUzIpCisJCXVmczJfcHJpbnRfc3VwZXJfc3R1ZmYoc2IsdXNiKTsKKyAgICAgICAgZWxzZQorCQl1ZnNfcHJpbnRfc3VwZXJfc3R1ZmYoc2IsIHVzYjEsIHVzYjIsIHVzYjMpOworI2VuZGlmCisKKwkvKgorCSAqIENoZWNrLCBpZiBmaWxlIHN5c3RlbSB3YXMgY29ycmVjdGx5IHVubW91bnRlZC4KKwkgKiBJZiBub3QsIG1ha2UgaXQgcmVhZCBvbmx5LgorCSAqLworCWlmICgoKGZsYWdzICYgVUZTX1NUX01BU0spID09IFVGU19TVF80NEJTRCkgfHwKKwkgICgoZmxhZ3MgJiBVRlNfU1RfTUFTSykgPT0gVUZTX1NUX09MRCkgfHwKKwkgICgoKGZsYWdzICYgVUZTX1NUX01BU0spID09IFVGU19TVF9TVU4gfHwgCisJICAoZmxhZ3MgJiBVRlNfU1RfTUFTSykgPT0gVUZTX1NUX1NVTng4NikgJiYgCisJICAodWZzX2dldF9mc19zdGF0ZShzYiwgdXNiMSwgdXNiMykgPT0gKFVGU19GU09LIC0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX3RpbWUpKSkpKSB7CisJCXN3aXRjaCh1c2IxLT5mc19jbGVhbikgeworCQljYXNlIFVGU19GU0NMRUFOOgorCQkJVUZTRCgoImZzIGlzIGNsZWFuXG4iKSkKKwkJCWJyZWFrOworCQljYXNlIFVGU19GU1NUQUJMRToKKwkJCVVGU0QoKCJmcyBpcyBzdGFibGVcbiIpKQorCQkJYnJlYWs7CisJCWNhc2UgVUZTX0ZTT1NGMToKKwkJCVVGU0QoKCJmcyBpcyBERUMgT1NGLzFcbiIpKQorCQkJYnJlYWs7CisJCWNhc2UgVUZTX0ZTQUNUSVZFOgorCQkJcHJpbnRrKCJ1ZnNfcmVhZF9zdXBlcjogZnMgaXMgYWN0aXZlXG4iKTsKKwkJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKwkJCWJyZWFrOworCQljYXNlIFVGU19GU0JBRDoKKwkJCXByaW50aygidWZzX3JlYWRfc3VwZXI6IGZzIGlzIGJhZFxuIik7CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygidWZzX3JlYWRfc3VwZXI6IGNhbid0IGdyb2sgZnNfY2xlYW4gMHgleFxuIiwgdXNiMS0+ZnNfY2xlYW4pOworCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCQkJYnJlYWs7CisJCX0KKwl9CisJZWxzZSB7CisJCXByaW50aygidWZzX3JlYWRfc3VwZXI6IGZzIG5lZWRzIGZzY2tcbiIpOworCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJfQorCisJLyoKKwkgKiBSZWFkIHVmc19zdXBlcl9ibG9jayBpbnRvIGludGVybmFsIGRhdGEgc3RydWN0dXJlcworCSAqLworCXNiLT5zX29wID0gJnVmc19zdXBlcl9vcHM7CisJc2ItPmRxX29wID0gTlVMTDsgLyoqKi8KKwlzYi0+c19tYWdpYyA9IGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc19tYWdpYyk7CisKKwl1c3BpLT5zX3NibGtubyA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19zYmxrbm8pOworCXVzcGktPnNfY2Jsa25vID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NibGtubyk7CisJdXNwaS0+c19pYmxrbm8gPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfaWJsa25vKTsKKwl1c3BpLT5zX2RibGtubyA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19kYmxrbm8pOworCXVzcGktPnNfY2dvZmZzZXQgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY2dvZmZzZXQpOworCXVzcGktPnNfY2dtYXNrID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NnbWFzayk7CisKKwlpZiAoKGZsYWdzICYgVUZTX1RZUEVfTUFTSykgPT0gVUZTX1RZUEVfVUZTMikgeworCQl1c3BpLT5zX3UyX3NpemUgID0gZnM2NF90b19jcHUoc2IsIHVzYi0+ZnNfdTExLmZzX3UyLmZzX3NpemUpOworCQl1c3BpLT5zX3UyX2RzaXplID0gZnM2NF90b19jcHUoc2IsIHVzYi0+ZnNfdTExLmZzX3UyLmZzX2RzaXplKTsKKwl9CisJZWxzZSB7CisJCXVzcGktPnNfc2l6ZSAgPSAgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX3NpemUpOworCQl1c3BpLT5zX2RzaXplID0gIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19kc2l6ZSk7CisJfQorCisJdXNwaS0+c19uY2cgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfbmNnKTsKKwkvKiBzX2JzaXplIGFscmVhZHkgc2V0ICovCisJLyogc19mc2l6ZSBhbHJlYWR5IHNldCAqLworCXVzcGktPnNfZnBiID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZyYWcpOworCXVzcGktPnNfbWluZnJlZSA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19taW5mcmVlKTsKKwl1c3BpLT5zX2JtYXNrID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2JtYXNrKTsKKwl1c3BpLT5zX2ZtYXNrID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZtYXNrKTsKKwl1c3BpLT5zX2JzaGlmdCA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19ic2hpZnQpOworCXVzcGktPnNfZnNoaWZ0ID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZzaGlmdCk7CisJVUZTRCgoInVzcGktPnNfYnNoaWZ0ID0gJWQsdXNwaS0+c19mc2hpZnQgPSAlZCIsIHVzcGktPnNfYnNoaWZ0LAorCQl1c3BpLT5zX2ZzaGlmdCkpOworCXVzcGktPnNfZnBic2hpZnQgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnJhZ3NoaWZ0KTsKKwl1c3BpLT5zX2ZzYnRvZGIgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnNidG9kYik7CisJLyogc19zYnNpemUgYWxyZWFkeSBzZXQgKi8KKwl1c3BpLT5zX2NzbWFzayA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc21hc2spOworCXVzcGktPnNfY3NzaGlmdCA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3NoaWZ0KTsKKwl1c3BpLT5zX25pbmRpciA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19uaW5kaXIpOworCXVzcGktPnNfaW5vcGIgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfaW5vcGIpOworCXVzcGktPnNfbnNwZiA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19uc3BmKTsKKwl1c3BpLT5zX25wc2VjdCA9IHVmc19nZXRfZnNfbnBzZWN0KHNiLCB1c2IxLCB1c2IzKTsKKwl1c3BpLT5zX2ludGVybGVhdmUgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfaW50ZXJsZWF2ZSk7CisJdXNwaS0+c190cmFja3NrZXcgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfdHJhY2tza2V3KTsKKwl1c3BpLT5zX2NzYWRkciA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc2FkZHIpOworCXVzcGktPnNfY3NzaXplID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2Nzc2l6ZSk7CisJdXNwaS0+c19jZ3NpemUgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY2dzaXplKTsKKwl1c3BpLT5zX250cmFrID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX250cmFrKTsKKwl1c3BpLT5zX25zZWN0ID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX25zZWN0KTsKKwl1c3BpLT5zX3NwYyA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19zcGMpOworCXVzcGktPnNfaXBnID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2lwZyk7CisJdXNwaS0+c19mcGcgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnBnKTsKKwl1c3BpLT5zX2NwYyA9IGZzMzJfdG9fY3B1KHNiLCB1c2IyLT5mc19jcGMpOworCXVzcGktPnNfY29udGlnc3Vtc2l6ZSA9IGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc191Mi5mc180NC5mc19jb250aWdzdW1zaXplKTsKKwl1c3BpLT5zX3FibWFzayA9IHVmc19nZXRfZnNfcWJtYXNrKHNiLCB1c2IzKTsKKwl1c3BpLT5zX3FmbWFzayA9IHVmc19nZXRfZnNfcWZtYXNrKHNiLCB1c2IzKTsKKwl1c3BpLT5zX3Bvc3RibGZvcm1hdCA9IGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc19wb3N0Ymxmb3JtYXQpOworCXVzcGktPnNfbnJwb3MgPSBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfbnJwb3MpOworCXVzcGktPnNfcG9zdGJsb2ZmID0gZnMzMl90b19jcHUoc2IsIHVzYjMtPmZzX3Bvc3RibG9mZik7CisJdXNwaS0+c19yb3RibG9mZiA9IGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc19yb3RibG9mZik7CisKKwkvKgorCSAqIENvbXB1dGUgYW5vdGhlciBmcmVxdWVudGx5IHVzZWQgdmFsdWVzCisJICovCisJdXNwaS0+c19mcGJtYXNrID0gdXNwaS0+c19mcGIgLSAxOworCWlmICgoZmxhZ3MgJiBVRlNfVFlQRV9NQVNLKSA9PSBVRlNfVFlQRV9VRlMyKSB7CisJCXVzcGktPnNfYXBic2hpZnQgPSB1c3BpLT5zX2JzaGlmdCAtIDM7CisJfQorCWVsc2UgeworCQl1c3BpLT5zX2FwYnNoaWZ0ID0gdXNwaS0+c19ic2hpZnQgLSAyOworCX0KKwl1c3BpLT5zXzJhcGJzaGlmdCA9IHVzcGktPnNfYXBic2hpZnQgKiAyOworCXVzcGktPnNfM2FwYnNoaWZ0ID0gdXNwaS0+c19hcGJzaGlmdCAqIDM7CisJdXNwaS0+c19hcGIgPSAxIDw8IHVzcGktPnNfYXBic2hpZnQ7CisJdXNwaS0+c18yYXBiID0gMSA8PCB1c3BpLT5zXzJhcGJzaGlmdDsKKwl1c3BpLT5zXzNhcGIgPSAxIDw8IHVzcGktPnNfM2FwYnNoaWZ0OworCXVzcGktPnNfYXBibWFzayA9IHVzcGktPnNfYXBiIC0gMTsKKwl1c3BpLT5zX25zcGZzaGlmdCA9IHVzcGktPnNfZnNoaWZ0IC0gVUZTX1NFQ1RPUl9CSVRTOworCXVzcGktPnNfbnNwYiA9IHVzcGktPnNfbnNwZiA8PCB1c3BpLT5zX2ZwYnNoaWZ0OworCXVzcGktPnNfaW5vcGYgPSB1c3BpLT5zX2lub3BiID4+IHVzcGktPnNfZnBic2hpZnQ7CisJdXNwaS0+c19icGYgPSB1c3BpLT5zX2ZzaXplIDw8IDM7CisJdXNwaS0+c19icGZzaGlmdCA9IHVzcGktPnNfZnNoaWZ0ICsgMzsKKwl1c3BpLT5zX2JwZm1hc2sgPSB1c3BpLT5zX2JwZiAtIDE7CisJaWYgKChzYmktPnNfbW91bnRfb3B0ICYgVUZTX01PVU5UX1VGU1RZUEUpID09CisJICAgIFVGU19NT1VOVF9VRlNUWVBFXzQ0QlNEKQorCQl1c3BpLT5zX21heHN5bWxpbmtsZW4gPQorCQkgICAgZnMzMl90b19jcHUoc2IsIHVzYjMtPmZzX3UyLmZzXzQ0LmZzX21heHN5bWxpbmtsZW4pOworCQorCXNiaS0+c19mbGFncyA9IGZsYWdzOworCisJaW5vZGUgPSBpZ2V0KHNiLCBVRlNfUk9PVElOTyk7CisJaWYgKCFpbm9kZSB8fCBpc19iYWRfaW5vZGUoaW5vZGUpKQorCQlnb3RvIGZhaWxlZDsKKwlzYi0+c19yb290ID0gZF9hbGxvY19yb290KGlub2RlKTsKKwlpZiAoIXNiLT5zX3Jvb3QpCisJCWdvdG8gZGFsbG9jX2ZhaWxlZDsKKworCisJLyoKKwkgKiBSZWFkIGN5bGluZGVyIGdyb3VwIHN0cnVjdHVyZXMKKwkgKi8KKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCisJCWlmICghdWZzX3JlYWRfY3lsaW5kZXJfc3RydWN0dXJlcyhzYikpCisJCQlnb3RvIGZhaWxlZDsKKworCVVGU0QoKCJFWElUXG4iKSkKKwlyZXR1cm4gMDsKKworZGFsbG9jX2ZhaWxlZDoKKwlpcHV0KGlub2RlKTsKK2ZhaWxlZDoKKwlpZiAodWJoKSB1YmhfYnJlbHNlX3VzcGkgKHVzcGkpOworCWlmICh1c3BpKSBrZnJlZSAodXNwaSk7CisJaWYgKHNiaSkga2ZyZWUoc2JpKTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlVRlNEKCgiRVhJVCAoRkFJTEVEKVxuIikpCisJcmV0dXJuIC1FSU5WQUw7CisKK2ZhaWxlZF9ub21lbToKKwlVRlNEKCgiRVhJVCAoTk9NRU0pXG4iKSkKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgdWZzX3dyaXRlX3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKSB7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKiB1c2IxOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfdGhpcmQgKiB1c2IzOworCXVuc2lnbmVkIGZsYWdzOworCisJbG9ja19rZXJuZWwoKTsKKworCVVGU0QoKCJFTlRFUlxuIikpCisJZmxhZ3MgPSBVRlNfU0Ioc2IpLT5zX2ZsYWdzOworCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKKwl1c2IzID0gdWJoX2dldF91c2JfdGhpcmQoVVNQSV9VQkgpOworCisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCXVzYjEtPmZzX3RpbWUgPSBjcHVfdG9fZnMzMihzYiwgZ2V0X3NlY29uZHMoKSk7CisJCWlmICgoZmxhZ3MgJiBVRlNfU1RfTUFTSykgPT0gVUZTX1NUX1NVTiAKKwkJICB8fCAoZmxhZ3MgJiBVRlNfU1RfTUFTSykgPT0gVUZTX1NUX1NVTng4NikKKwkJCXVmc19zZXRfZnNfc3RhdGUoc2IsIHVzYjEsIHVzYjMsCisJCQkJCVVGU19GU09LIC0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX3RpbWUpKTsKKwkJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCk7CisJfQorCXNiLT5zX2RpcnQgPSAwOworCVVGU0QoKCJFWElUXG4iKSkKKwl1bmxvY2tfa2VybmVsKCk7Cit9CisKK3N0YXRpYyB2b2lkIHVmc19wdXRfc3VwZXIgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHVmc19zYl9pbmZvICogc2JpID0gVUZTX1NCKHNiKTsKKwkJCisJVUZTRCgoIkVOVEVSXG4iKSkKKworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKwkJdWZzX3B1dF9jeWxpbmRlcl9zdHJ1Y3R1cmVzIChzYik7CisJCisJdWJoX2JyZWxzZV91c3BpIChzYmktPnNfdXNwaSk7CisJa2ZyZWUgKHNiaS0+c191c3BpKTsKKwlrZnJlZSAoc2JpKTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlyZXR1cm47Cit9CisKKworc3RhdGljIGludCB1ZnNfcmVtb3VudCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICptb3VudF9mbGFncywgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqIHVzYjE7CisJc3RydWN0IHVmc19zdXBlcl9ibG9ja190aGlyZCAqIHVzYjM7CisJdW5zaWduZWQgbmV3X21vdW50X29wdCwgdWZzdHlwZTsKKwl1bnNpZ25lZCBmbGFnczsKKwkKKwl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCWZsYWdzID0gVUZTX1NCKHNiKS0+c19mbGFnczsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QoVVNQSV9VQkgpOworCXVzYjMgPSB1YmhfZ2V0X3VzYl90aGlyZChVU1BJX1VCSCk7CisJCisJLyoKKwkgKiBBbGxvdyB0aGUgImNoZWNrIiBvcHRpb24gdG8gYmUgcGFzc2VkIGFzIGEgcmVtb3VudCBvcHRpb24uCisJICogSXQgaXMgbm90IHBvc3NpYmxlIHRvIGNoYW5nZSB1ZnN0eXBlIG9wdGlvbiBkdXJpbmcgcmVtb3VudAorCSAqLworCXVmc3R5cGUgPSBVRlNfU0Ioc2IpLT5zX21vdW50X29wdCAmIFVGU19NT1VOVF9VRlNUWVBFOworCW5ld19tb3VudF9vcHQgPSAwOworCXVmc19zZXRfb3B0IChuZXdfbW91bnRfb3B0LCBPTkVSUk9SX0xPQ0spOworCWlmICghdWZzX3BhcnNlX29wdGlvbnMgKGRhdGEsICZuZXdfbW91bnRfb3B0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCEobmV3X21vdW50X29wdCAmIFVGU19NT1VOVF9VRlNUWVBFKSkgeworCQluZXdfbW91bnRfb3B0IHw9IHVmc3R5cGU7CisJfQorCWVsc2UgaWYgKChuZXdfbW91bnRfb3B0ICYgVUZTX01PVU5UX1VGU1RZUEUpICE9IHVmc3R5cGUpIHsKKwkJcHJpbnRrKCJ1ZnN0eXBlIGNhbid0IGJlIGNoYW5nZWQgZHVyaW5nIHJlbW91bnRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKCptb3VudF9mbGFncyAmIE1TX1JET05MWSkgPT0gKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlVRlNfU0Ioc2IpLT5zX21vdW50X29wdCA9IG5ld19tb3VudF9vcHQ7CisJCXJldHVybiAwOworCX0KKwkKKwkvKgorCSAqIGZzIHdhcyBtb3V0ZWQgYXMgcncsIHJlbW91bnRpbmcgcm8KKwkgKi8KKwlpZiAoKm1vdW50X2ZsYWdzICYgTVNfUkRPTkxZKSB7CisJCXVmc19wdXRfY3lsaW5kZXJfc3RydWN0dXJlcyhzYik7CisJCXVzYjEtPmZzX3RpbWUgPSBjcHVfdG9fZnMzMihzYiwgZ2V0X3NlY29uZHMoKSk7CisJCWlmICgoZmxhZ3MgJiBVRlNfU1RfTUFTSykgPT0gVUZTX1NUX1NVTgorCQkgIHx8IChmbGFncyAmIFVGU19TVF9NQVNLKSA9PSBVRlNfU1RfU1VOeDg2KSAKKwkJCXVmc19zZXRfZnNfc3RhdGUoc2IsIHVzYjEsIHVzYjMsCisJCQkJVUZTX0ZTT0sgLSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfdGltZSkpOworCQl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKTsKKwkJc2ItPnNfZGlydCA9IDA7CisJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKwl9CisJLyoKKwkgKiBmcyB3YXMgbW91bnRlZCBhcyBybywgcmVtb3VudGluZyBydworCSAqLworCWVsc2UgeworI2lmbmRlZiBDT05GSUdfVUZTX0ZTX1dSSVRFCisJCXByaW50aygidWZzIHdhcyBjb21waWxlZCB3aXRoIHJlYWQtb25seSBzdXBwb3J0LCAiCisJCSJjYW4ndCBiZSBtb3VudGVkIGFzIHJlYWQtd3JpdGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKyNlbHNlCisJCWlmICh1ZnN0eXBlICE9IFVGU19NT1VOVF9VRlNUWVBFX1NVTiAmJiAKKwkJICAgIHVmc3R5cGUgIT0gVUZTX01PVU5UX1VGU1RZUEVfNDRCU0QgJiYKKwkJICAgIHVmc3R5cGUgIT0gVUZTX01PVU5UX1VGU1RZUEVfU1VOeDg2KSB7CisJCQlwcmludGsoInRoaXMgdWZzdHlwZSBpcyByZWFkLW9ubHkgc3VwcG9ydGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICghdWZzX3JlYWRfY3lsaW5kZXJfc3RydWN0dXJlcyAoc2IpKSB7CisJCQlwcmludGsoImZhaWxlZCBkdXJpbmcgcmVtb3VudGluZ1xuIik7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJCXNiLT5zX2ZsYWdzICY9IH5NU19SRE9OTFk7CisjZW5kaWYKKwl9CisJVUZTX1NCKHNiKS0+c19tb3VudF9vcHQgPSBuZXdfbW91bnRfb3B0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVmc19zdGF0ZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCit7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKiB1c2IxOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgKiB1c2I7CisJdW5zaWduZWQgIGZsYWdzID0gMDsKKworCWxvY2tfa2VybmVsKCk7CisKKwl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCAoVVNQSV9VQkgpOworCXVzYiAgPSAoc3RydWN0IHVmc19zdXBlcl9ibG9jayAqKQorCQkoKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKil1c3BpKS0+YmhbMF0tPmJfZGF0YSA7CisJCisJZmxhZ3MgPSBVRlNfU0Ioc2IpLT5zX2ZsYWdzOworCWlmICgoZmxhZ3MgJiBVRlNfVFlQRV9NQVNLKSA9PSBVRlNfVFlQRV9VRlMyKSB7CisJCWJ1Zi0+Zl90eXBlID0gVUZTMl9NQUdJQzsKKwkJYnVmLT5mX2Jsb2NrcyA9IGZzNjRfdG9fY3B1KHNiLCB1c2ItPmZzX3UxMS5mc191Mi5mc19kc2l6ZSk7CisJCWJ1Zi0+Zl9iZnJlZSA9IHVmc19ibGtzdG9mcmFncyhmczY0X3RvX2NwdShzYiwgdXNiLT5mc191MTEuZnNfdTIuZnNfY3N0b3RhbC5jc19uYmZyZWUpKSArCisJCQlmczY0X3RvX2NwdShzYiwgdXNiLT5mc191MTEuZnNfdTIuZnNfY3N0b3RhbC5jc19uZmZyZWUpOworCQlidWYtPmZfZmZyZWUgPSBmczY0X3RvX2NwdShzYiwKKyAgICAgICAgCQl1c2ItPmZzX3UxMS5mc191Mi5mc19jc3RvdGFsLmNzX25pZnJlZSk7CisJfQorCWVsc2UgeworCQlidWYtPmZfdHlwZSA9IFVGU19NQUdJQzsKKwkJYnVmLT5mX2Jsb2NrcyA9IHVzcGktPnNfZHNpemU7CisJCWJ1Zi0+Zl9iZnJlZSA9IHVmc19ibGtzdG9mcmFncyhmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3N0b3RhbC5jc19uYmZyZWUpKSArCisJCQlmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3N0b3RhbC5jc19uZmZyZWUpOworCQlidWYtPmZfZmZyZWUgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3N0b3RhbC5jc19uaWZyZWUpOworCX0KKwlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CisJYnVmLT5mX2JhdmFpbCA9IChidWYtPmZfYmZyZWUgPiAoKChsb25nKWJ1Zi0+Zl9ibG9ja3MgLyAxMDApICogdXNwaS0+c19taW5mcmVlKSkKKwkJPyAoYnVmLT5mX2JmcmVlIC0gKCgobG9uZylidWYtPmZfYmxvY2tzIC8gMTAwKSAqIHVzcGktPnNfbWluZnJlZSkpIDogMDsKKwlidWYtPmZfZmlsZXMgPSB1c3BpLT5zX25jZyAqIHVzcGktPnNfaXBnOworCWJ1Zi0+Zl9uYW1lbGVuID0gVUZTX01BWE5BTUxFTjsKKworCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMga21lbV9jYWNoZV90ICogdWZzX2lub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqdWZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHVmc19pbm9kZV9pbmZvICplaTsKKwllaSA9IChzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKHVmc19pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIWVpKQorCQlyZXR1cm4gTlVMTDsKKwllaS0+dmZzX2lub2RlLmlfdmVyc2lvbiA9IDE7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCB1ZnNfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZSh1ZnNfaW5vZGVfY2FjaGVwLCBVRlNfSShpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCB1ZnNfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IHVmc19pbm9kZV9pbmZvICopIGZvbzsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQorCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpCisJCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7Cit9CisgCitzdGF0aWMgaW50IGluaXRfaW5vZGVjYWNoZSh2b2lkKQoreworCXVmc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgidWZzX2lub2RlX2NhY2hlIiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IHVmc19pbm9kZV9pbmZvKSwKKwkJCQkJICAgICAwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQkJICAgICBpbml0X29uY2UsIE5VTEwpOworCWlmICh1ZnNfaW5vZGVfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKK3sKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KHVmc19pbm9kZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9JTkZPICJ1ZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworI2lmZGVmIENPTkZJR19RVU9UQQorc3RhdGljIHNzaXplX3QgdWZzX3F1b3RhX3JlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgY2hhciAqLHNpemVfdCwgbG9mZl90KTsKK3N0YXRpYyBzc2l6ZV90IHVmc19xdW90YV93cml0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50LCBjb25zdCBjaGFyICosIHNpemVfdCwgbG9mZl90KTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgdWZzX3N1cGVyX29wcyA9IHsKKwkuYWxsb2NfaW5vZGUJPSB1ZnNfYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSB1ZnNfZGVzdHJveV9pbm9kZSwKKwkucmVhZF9pbm9kZQk9IHVmc19yZWFkX2lub2RlLAorCS53cml0ZV9pbm9kZQk9IHVmc193cml0ZV9pbm9kZSwKKwkuZGVsZXRlX2lub2RlCT0gdWZzX2RlbGV0ZV9pbm9kZSwKKwkucHV0X3N1cGVyCT0gdWZzX3B1dF9zdXBlciwKKwkud3JpdGVfc3VwZXIJPSB1ZnNfd3JpdGVfc3VwZXIsCisJLnN0YXRmcwkJPSB1ZnNfc3RhdGZzLAorCS5yZW1vdW50X2ZzCT0gdWZzX3JlbW91bnQsCisjaWZkZWYgQ09ORklHX1FVT1RBCisJLnF1b3RhX3JlYWQJPSB1ZnNfcXVvdGFfcmVhZCwKKwkucXVvdGFfd3JpdGUJPSB1ZnNfcXVvdGFfd3JpdGUsCisjZW5kaWYKK307CisKKyNpZmRlZiBDT05GSUdfUVVPVEEKKworLyogUmVhZCBkYXRhIGZyb20gcXVvdGFmaWxlIC0gYXZvaWQgcGFnZWNhY2hlIGFuZCBzdWNoIGJlY2F1c2Ugd2UgY2Fubm90IGFmZm9yZAorICogYWNxdWlyaW5nIHRoZSBsb2Nrcy4uLiBBcyBxdW90YSBmaWxlcyBhcmUgbmV2ZXIgdHJ1bmNhdGVkIGFuZCBxdW90YSBjb2RlCisgKiBpdHNlbGYgc2VyaWFsaXplcyB0aGUgb3BlcmF0aW9ucyAoYW5kIG5vb25lIGVsc2Ugc2hvdWxkIHRvdWNoIHRoZSBmaWxlcykKKyAqIHdlIGRvbid0IGhhdmUgdG8gYmUgYWZyYWlkIG9mIHJhY2VzICovCitzdGF0aWMgc3NpemVfdCB1ZnNfcXVvdGFfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgY2hhciAqZGF0YSwKKwkJCSAgICAgICBzaXplX3QgbGVuLCBsb2ZmX3Qgb2ZmKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzYl9kcW9wdChzYiktPmZpbGVzW3R5cGVdOworCXNlY3Rvcl90IGJsayA9IG9mZiA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwlpbnQgZXJyID0gMDsKKwlpbnQgb2Zmc2V0ID0gb2ZmICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOworCWludCB0b2NvcHk7CisJc2l6ZV90IHRvcmVhZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWxvZmZfdCBpX3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisKKwlpZiAob2ZmID4gaV9zaXplKQorCQlyZXR1cm4gMDsKKwlpZiAob2ZmK2xlbiA+IGlfc2l6ZSkKKwkJbGVuID0gaV9zaXplLW9mZjsKKwl0b3JlYWQgPSBsZW47CisJd2hpbGUgKHRvcmVhZCA+IDApIHsKKwkJdG9jb3B5ID0gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDwgdG9yZWFkID8KKwkJCQlzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgOiB0b3JlYWQ7CisKKwkJYmggPSB1ZnNfYnJlYWQoaW5vZGUsIGJsaywgMCwgJmVycik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlpZiAoIWJoKQkvKiBBIGhvbGU/ICovCisJCQltZW1zZXQoZGF0YSwgMCwgdG9jb3B5KTsKKwkJZWxzZSB7CisJCQltZW1jcHkoZGF0YSwgYmgtPmJfZGF0YStvZmZzZXQsIHRvY29weSk7CisJCQlicmVsc2UoYmgpOworCQl9CisJCW9mZnNldCA9IDA7CisJCXRvcmVhZCAtPSB0b2NvcHk7CisJCWRhdGEgKz0gdG9jb3B5OworCQlibGsrKzsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworLyogV3JpdGUgdG8gcXVvdGFmaWxlICovCitzdGF0aWMgc3NpemVfdCB1ZnNfcXVvdGFfd3JpdGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsCisJCQkJY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgbG9mZl90IG9mZikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXTsKKwlzZWN0b3JfdCBibGsgPSBvZmYgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJaW50IGVyciA9IDA7CisJaW50IG9mZnNldCA9IG9mZiAmIChzYi0+c19ibG9ja3NpemUgLSAxKTsKKwlpbnQgdG9jb3B5OworCXNpemVfdCB0b3dyaXRlID0gbGVuOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwlkb3duKCZpbm9kZS0+aV9zZW0pOworCXdoaWxlICh0b3dyaXRlID4gMCkgeworCQl0b2NvcHkgPSBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgPCB0b3dyaXRlID8KKwkJCQlzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgOiB0b3dyaXRlOworCisJCWJoID0gdWZzX2JyZWFkKGlub2RlLCBibGssIDEsICZlcnIpOworCQlpZiAoIWJoKQorCQkJZ290byBvdXQ7CisJCWxvY2tfYnVmZmVyKGJoKTsKKwkJbWVtY3B5KGJoLT5iX2RhdGErb2Zmc2V0LCBkYXRhLCB0b2NvcHkpOworCQlmbHVzaF9kY2FjaGVfcGFnZShiaC0+Yl9wYWdlKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCWJyZWxzZShiaCk7CisJCW9mZnNldCA9IDA7CisJCXRvd3JpdGUgLT0gdG9jb3B5OworCQlkYXRhICs9IHRvY29weTsKKwkJYmxrKys7CisJfQorb3V0OgorCWlmIChsZW4gPT0gdG93cml0ZSkKKwkJcmV0dXJuIGVycjsKKwlpZiAoaW5vZGUtPmlfc2l6ZSA8IG9mZitsZW4tdG93cml0ZSkKKwkJaV9zaXplX3dyaXRlKGlub2RlLCBvZmYrbGVuLXRvd3JpdGUpOworCWlub2RlLT5pX3ZlcnNpb24rKzsKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl1cCgmaW5vZGUtPmlfc2VtKTsKKwlyZXR1cm4gbGVuIC0gdG93cml0ZTsKK30KKworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnVmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCB1ZnNfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB1ZnNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInVmcyIsCisJLmdldF9zYgkJPSB1ZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3Vmc19mcyh2b2lkKQoreworCWludCBlcnIgPSBpbml0X2lub2RlY2FjaGUoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmdWZzX2ZzX3R5cGUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCXJldHVybiAwOworb3V0OgorCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworb3V0MToKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF91ZnNfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnVmc19mc190eXBlKTsKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF91ZnNfZnMpCittb2R1bGVfZXhpdChleGl0X3Vmc19mcykKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9zd2FiLmggYi9mcy91ZnMvc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ODNkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZnMvc3dhYi5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogIGxpbnV4L2ZzL3Vmcy9zd2FiLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJhbmNvaXMtUmVuZSBSaWRlYXUgPGZhcmVAdHVuZXMub3JnPgorICogQ29weXJpZ2h0IChDKSAxOTk4IEpha3ViIEplbGluZWsgPGpqQHVsdHJhLmxpbnV4LmN6PgorICogQ29weXJpZ2h0IChDKSAyMDAxIENocmlzdG9waCBIZWxsd2lnIDxoY2hAaW5mcmFkZWFkLm9yZz4KKyAqLworCisjaWZuZGVmIF9VRlNfU1dBQl9ICisjZGVmaW5lIF9VRlNfU1dBQl9ICisKKy8qCisgKiBOb3RlczoKKyAqICAgIEhFUkUgV0UgQVNTVU1FIEVJVEhFUiBCSUcgT1IgTElUVExFIEVORElBTiBVRlNlcworICogICAgaW4gY2FzZSB0aGVyZSBhcmUgdWZzIGltcGxlbWVudGF0aW9ucyB0aGF0IGhhdmUgc3RyYW5nZSBieXRlc2V4ZXMsCisgKiAgICB5b3UnbGwgbmVlZCB0byBtb2RpZnkgY29kZSBoZXJlIGFzIHdlbGwgYXMgaW4gdWZzX3N1cGVyLmMgYW5kIHVmc19mcy5oCisgKiAgICB0byBzdXBwb3J0IHRoZW0uCisgKi8KKworZW51bSB7CisJQllURVNFWF9MRSwKKwlCWVRFU0VYX0JFCit9OworCitzdGF0aWMgaW5saW5lIHU2NAorZnM2NF90b19jcHUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIF9fZnM2NCBuKQoreworCWlmIChVRlNfU0Ioc2JwKS0+c19ieXRlc2V4ID09IEJZVEVTRVhfTEUpCisJCXJldHVybiBsZTY0X3RvX2NwdSgoX19mb3JjZSBfX2xlNjQpbik7CisJZWxzZQorCQlyZXR1cm4gYmU2NF90b19jcHUoKF9fZm9yY2UgX19iZTY0KW4pOworfQorCitzdGF0aWMgaW5saW5lIF9fZnM2NAorY3B1X3RvX2ZzNjQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIHU2NCBuKQoreworCWlmIChVRlNfU0Ioc2JwKS0+c19ieXRlc2V4ID09IEJZVEVTRVhfTEUpCisJCXJldHVybiAoX19mb3JjZSBfX2ZzNjQpY3B1X3RvX2xlNjQobik7CisJZWxzZQorCQlyZXR1cm4gKF9fZm9yY2UgX19mczY0KWNwdV90b19iZTY0KG4pOworfQorCitzdGF0aWMgX19pbmxpbmUgdTMyCitmczY0X2FkZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgdTMyICpuLCBpbnQgZCkKK3sKKwlpZiAoVUZTX1NCKHNicCktPnNfYnl0ZXNleCA9PSBCWVRFU0VYX0xFKQorCQlyZXR1cm4gKm4gPSBjcHVfdG9fbGU2NChsZTY0X3RvX2NwdSgqbikrZCk7CisJZWxzZQorCQlyZXR1cm4gKm4gPSBjcHVfdG9fYmU2NChiZTY0X3RvX2NwdSgqbikrZCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1MzIKK2ZzNjRfc3ViKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCB1MzIgKm4sIGludCBkKQoreworCWlmIChVRlNfU0Ioc2JwKS0+c19ieXRlc2V4ID09IEJZVEVTRVhfTEUpCisJCXJldHVybiAqbiA9IGNwdV90b19sZTY0KGxlNjRfdG9fY3B1KCpuKS1kKTsKKwllbHNlCisJCXJldHVybiAqbiA9IGNwdV90b19iZTY0KGJlNjRfdG9fY3B1KCpuKS1kKTsKK30KKworc3RhdGljIF9faW5saW5lIHUzMgorZnMzMl90b19jcHUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIF9fZnMzMiBuKQoreworCWlmIChVRlNfU0Ioc2JwKS0+c19ieXRlc2V4ID09IEJZVEVTRVhfTEUpCisJCXJldHVybiBsZTMyX3RvX2NwdSgoX19mb3JjZSBfX2xlMzIpbik7CisJZWxzZQorCQlyZXR1cm4gYmUzMl90b19jcHUoKF9fZm9yY2UgX19iZTMyKW4pOworfQorCitzdGF0aWMgaW5saW5lIF9fZnMzMgorY3B1X3RvX2ZzMzIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIHUzMiBuKQoreworCWlmIChVRlNfU0Ioc2JwKS0+c19ieXRlc2V4ID09IEJZVEVTRVhfTEUpCisJCXJldHVybiAoX19mb3JjZSBfX2ZzMzIpY3B1X3RvX2xlMzIobik7CisJZWxzZQorCQlyZXR1cm4gKF9fZm9yY2UgX19mczMyKWNwdV90b19iZTMyKG4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZzMzJfYWRkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCBfX2ZzMzIgKm4sIGludCBkKQoreworCWlmIChVRlNfU0Ioc2JwKS0+c19ieXRlc2V4ID09IEJZVEVTRVhfTEUpCisJCSooX19sZTMyICopbiA9IGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KCooX19sZTMyICopbikrZCk7CisJZWxzZQorCQkqKF9fYmUzMiAqKW4gPSBjcHVfdG9fYmUzMihiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKW4pK2QpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZzMzJfc3ViKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCBfX2ZzMzIgKm4sIGludCBkKQoreworCWlmIChVRlNfU0Ioc2JwKS0+c19ieXRlc2V4ID09IEJZVEVTRVhfTEUpCisJCSooX19sZTMyICopbiA9IGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KCooX19sZTMyICopbiktZCk7CisJZWxzZQorCQkqKF9fYmUzMiAqKW4gPSBjcHVfdG9fYmUzMihiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKW4pLWQpOworfQorCitzdGF0aWMgaW5saW5lIHUxNgorZnMxNl90b19jcHUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIF9fZnMxNiBuKQoreworCWlmIChVRlNfU0Ioc2JwKS0+c19ieXRlc2V4ID09IEJZVEVTRVhfTEUpCisJCXJldHVybiBsZTE2X3RvX2NwdSgoX19mb3JjZSBfX2xlMTYpbik7CisJZWxzZQorCQlyZXR1cm4gYmUxNl90b19jcHUoKF9fZm9yY2UgX19iZTE2KW4pOworfQorCitzdGF0aWMgaW5saW5lIF9fZnMxNgorY3B1X3RvX2ZzMTYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIHUxNiBuKQoreworCWlmIChVRlNfU0Ioc2JwKS0+c19ieXRlc2V4ID09IEJZVEVTRVhfTEUpCisJCXJldHVybiAoX19mb3JjZSBfX2ZzMTYpY3B1X3RvX2xlMTYobik7CisJZWxzZQorCQlyZXR1cm4gKF9fZm9yY2UgX19mczE2KWNwdV90b19iZTE2KG4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZzMTZfYWRkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCBfX2ZzMTYgKm4sIGludCBkKQoreworCWlmIChVRlNfU0Ioc2JwKS0+c19ieXRlc2V4ID09IEJZVEVTRVhfTEUpCisJCSooX19sZTE2ICopbiA9IGNwdV90b19sZTE2KGxlMTZfdG9fY3B1KCooX19sZTE2ICopbikrZCk7CisJZWxzZQorCQkqKF9fYmUxNiAqKW4gPSBjcHVfdG9fYmUxNihiZTE2X3RvX2NwdSgqKF9fYmUxNiAqKW4pK2QpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZzMTZfc3ViKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCBfX2ZzMTYgKm4sIGludCBkKQoreworCWlmIChVRlNfU0Ioc2JwKS0+c19ieXRlc2V4ID09IEJZVEVTRVhfTEUpCisJCSooX19sZTE2ICopbiA9IGNwdV90b19sZTE2KGxlMTZfdG9fY3B1KCooX19sZTE2ICopbiktZCk7CisJZWxzZQorCQkqKF9fYmUxNiAqKW4gPSBjcHVfdG9fYmUxNihiZTE2X3RvX2NwdSgqKF9fYmUxNiAqKW4pLWQpOworfQorCisjZW5kaWYgLyogX1VGU19TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL3Vmcy9zeW1saW5rLmMgYi9mcy91ZnMvc3ltbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZTQ5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZnMvc3ltbGluay5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiAgbGludXgvZnMvdWZzL3N5bWxpbmsuYworICoKKyAqIE9ubHkgZmFzdCBzeW1saW5rcyBsZWZ0IGhlcmUgLSB0aGUgcmVzdCBpcyBkb25lIGJ5IGdlbmVyaWMgY29kZS4gQVYsIDE5OTkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgKKyAqIERhbmllbCBQaXJrbCA8ZGFuaWVsLnBpcmtsQGVtYWkuY3o+CisgKiBDaGFybGVzIFVuaXZlcnNpdHksIEZhY3VsdHkgb2YgTWF0aGVtYXRpY3MgYW5kIFBoeXNpY3MKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9mcy9leHQyL3N5bWxpbmsuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9mcy9taW5peC9zeW1saW5rLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBleHQyIHN5bWxpbmsgaGFuZGxpbmcgY29kZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvdWZzX2ZzLmg+CisKK3N0YXRpYyBpbnQgdWZzX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHVmc19pbm9kZV9pbmZvICpwID0gVUZTX0koZGVudHJ5LT5kX2lub2RlKTsKKwluZF9zZXRfbGluayhuZCwgKGNoYXIqKXAtPmlfdTEuaV9zeW1saW5rKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdWZzX2Zhc3Rfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zID0geworCS5yZWFkbGluawk9IGdlbmVyaWNfcmVhZGxpbmssCisJLmZvbGxvd19saW5rCT0gdWZzX2ZvbGxvd19saW5rLAorfTsKZGlmZiAtLWdpdCBhL2ZzL3Vmcy90cnVuY2F0ZS5jIGIvZnMvdWZzL3RydW5jYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMxMmJmOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Vmcy90cnVuY2F0ZS5jCkBAIC0wLDAgKzEsNDc3IEBACisvKgorICogIGxpbnV4L2ZzL3Vmcy90cnVuY2F0ZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4CisgKiBEYW5pZWwgUGlya2wgPGRhbmllbC5waXJrbEBlbWFpbC5jej4KKyAqIENoYXJsZXMgVW5pdmVyc2l0eSwgRmFjdWx0eSBvZiBNYXRoZW1hdGljcyBhbmQgUGh5c2ljcworICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2ZzL2V4dDIvdHJ1bmNhdGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9mcy9taW5peC90cnVuY2F0ZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqLworCisvKgorICogUmVhbCByYW5kb20gbnVtYmVycyBmb3Igc2VjdXJlIHJtIGFkZGVkIDk0LzAyLzE4CisgKiBJZGVhIGZyb20gUGllcnJlIGRlbCBQZXJ1Z2lhIDxkZWxwZXJ1Z0BnbGEuZWNvbGVkb2MuaWJwLmZyPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdWZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSAic3dhYi5oIgorI2luY2x1ZGUgInV0aWwuaCIKKworI3VuZGVmIFVGU19UUlVOQ0FURV9ERUJVRworCisjaWZkZWYgVUZTX1RSVU5DQVRFX0RFQlVHCisjZGVmaW5lIFVGU0QoeCkgcHJpbnRrKCIoJXMsICVkKSwgJXM6ICIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgcHJpbnRrIHg7CisjZWxzZQorI2RlZmluZSBVRlNEKHgpCisjZW5kaWYKKyAKKy8qCisgKiBTZWN1cmUgZGVsZXRpb24gY3VycmVudGx5IGRvZXNuJ3Qgd29yay4gSXQgaW50ZXJhY3RzIHZlcnkgYmFkbHkKKyAqIHdpdGggYnVmZmVycyBzaGFyZWQgd2l0aCBtZW1vcnkgbWFwcGluZ3MsIGFuZCBmb3IgdGhhdCByZWFzb24KKyAqIGNhbid0IGJlIGRvbmUgaW4gdGhlIHRydW5jYXRlKCkgcm91dGluZXMuIEl0IHNob3VsZCBpbnN0ZWFkIGJlCisgKiBkb25lIHNlcGFyYXRlbHkgaW4gInJlbGVhc2UoKSIgYmVmb3JlIGNhbGxpbmcgdGhlIHRydW5jYXRlIHJvdXRpbmVzCisgKiB0aGF0IHdpbGwgcmVsZWFzZSB0aGUgYWN0dWFsIGZpbGUgYmxvY2tzLgorICoKKyAqCQlMaW51cworICovCisKKyNkZWZpbmUgRElSRUNUX0JMT0NLICgoaW5vZGUtPmlfc2l6ZSArIHVzcGktPnNfYnNpemUgLSAxKSA+PiB1c3BpLT5zX2JzaGlmdCkKKyNkZWZpbmUgRElSRUNUX0ZSQUdNRU5UICgoaW5vZGUtPmlfc2l6ZSArIHVzcGktPnNfZnNpemUgLSAxKSA+PiB1c3BpLT5zX2ZzaGlmdCkKKworI2RlZmluZSBEQVRBX0JVRkZFUl9VU0VEKGJoKSBcCisJKGF0b21pY19yZWFkKCZiaC0+Yl9jb3VudCk+MSB8fCBidWZmZXJfbG9ja2VkKGJoKSkKKworc3RhdGljIGludCB1ZnNfdHJ1bmNfZGlyZWN0IChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKnVmc2kgPSBVRlNfSShpbm9kZSk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCV9fZnMzMiAqIHA7CisJdW5zaWduZWQgZnJhZzEsIGZyYWcyLCBmcmFnMywgZnJhZzQsIGJsb2NrMSwgYmxvY2syOworCXVuc2lnbmVkIGZyYWdfdG9fZnJlZSwgZnJlZV9jb3VudDsKKwl1bnNpZ25lZCBpLCBqLCB0bXA7CisJaW50IHJldHJ5OworCQorCVVGU0QoKCJFTlRFUlxuIikpCisKKwlzYiA9IGlub2RlLT5pX3NiOworCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJCisJZnJhZ190b19mcmVlID0gMDsKKwlmcmVlX2NvdW50ID0gMDsKKwlyZXRyeSA9IDA7CisJCisJZnJhZzEgPSBESVJFQ1RfRlJBR01FTlQ7CisJZnJhZzQgPSBtaW5fdCh1MzIsIFVGU19ORElSX0ZSQUdNRU5ULCB1ZnNpLT5pX2xhc3RmcmFnKTsKKwlmcmFnMiA9ICgoZnJhZzEgJiB1c3BpLT5zX2ZwYm1hc2spID8gKChmcmFnMSB8IHVzcGktPnNfZnBibWFzaykgKyAxKSA6IGZyYWcxKTsKKwlmcmFnMyA9IGZyYWc0ICYgfnVzcGktPnNfZnBibWFzazsKKwlibG9jazEgPSBibG9jazIgPSAwOworCWlmIChmcmFnMiA+IGZyYWczKSB7CisJCWZyYWcyID0gZnJhZzQ7CisJCWZyYWczID0gZnJhZzQgPSAwOworCX0KKwllbHNlIGlmIChmcmFnMiA8IGZyYWczKSB7CisJCWJsb2NrMSA9IHVmc19mcmFnc3RvYmxrcyAoZnJhZzIpOworCQlibG9jazIgPSB1ZnNfZnJhZ3N0b2Jsa3MgKGZyYWczKTsKKwl9CisKKwlVRlNEKCgiZnJhZzEgJXUsIGZyYWcyICV1LCBibG9jazEgJXUsIGJsb2NrMiAldSwgZnJhZzMgJXUsIGZyYWc0ICV1XG4iLCBmcmFnMSwgZnJhZzIsIGJsb2NrMSwgYmxvY2syLCBmcmFnMywgZnJhZzQpKQorCisJaWYgKGZyYWcxID49IGZyYWcyKQorCQlnb3RvIG5leHQxOwkJCisKKwkvKgorCSAqIEZyZWUgZmlyc3QgZnJlZSBmcmFnbWVudHMKKwkgKi8KKwlwID0gdWZzaS0+aV91MS5pX2RhdGEgKyB1ZnNfZnJhZ3N0b2Jsa3MgKGZyYWcxKTsKKwl0bXAgPSBmczMyX3RvX2NwdShzYiwgKnApOworCWlmICghdG1wICkKKwkJdWZzX3BhbmljIChzYiwgInVmc190cnVuY19kaXJlY3QiLCAiaW50ZXJuYWwgZXJyb3IiKTsKKwlmcmFnMSA9IHVmc19mcmFnbnVtIChmcmFnMSk7CisJZnJhZzIgPSB1ZnNfZnJhZ251bSAoZnJhZzIpOworCWZvciAoaiA9IGZyYWcxOyBqIDwgZnJhZzI7IGorKykgeworCQliaCA9IHNiX2ZpbmRfZ2V0X2Jsb2NrIChzYiwgdG1wICsgaik7CisJCWlmICgoYmggJiYgREFUQV9CVUZGRVJfVVNFRChiaCkpIHx8IHRtcCAhPSBmczMyX3RvX2NwdShzYiwgKnApKSB7CisJCQlyZXRyeSA9IDE7CisJCQlicmVsc2UgKGJoKTsKKwkJCWdvdG8gbmV4dDE7CisJCX0KKwkJYmZvcmdldCAoYmgpOworCX0KKwlpbm9kZS0+aV9ibG9ja3MgLT0gKGZyYWcyLWZyYWcxKSA8PCB1c3BpLT5zX25zcGZzaGlmdDsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl1ZnNfZnJlZV9mcmFnbWVudHMgKGlub2RlLCB0bXAgKyBmcmFnMSwgZnJhZzIgLSBmcmFnMSk7CisJZnJhZ190b19mcmVlID0gdG1wICsgZnJhZzE7CisKK25leHQxOgorCS8qCisJICogRnJlZSB3aG9sZSBibG9ja3MKKwkgKi8KKwlmb3IgKGkgPSBibG9jazEgOyBpIDwgYmxvY2syOyBpKyspIHsKKwkJcCA9IHVmc2ktPmlfdTEuaV9kYXRhICsgaTsKKwkJdG1wID0gZnMzMl90b19jcHUoc2IsICpwKTsKKwkJaWYgKCF0bXApCisJCQljb250aW51ZTsKKwkJZm9yIChqID0gMDsgaiA8IHVzcGktPnNfZnBiOyBqKyspIHsKKwkJCWJoID0gc2JfZmluZF9nZXRfYmxvY2soc2IsIHRtcCArIGopOworCQkJaWYgKChiaCAmJiBEQVRBX0JVRkZFUl9VU0VEKGJoKSkgfHwgdG1wICE9IGZzMzJfdG9fY3B1KHNiLCAqcCkpIHsKKwkJCQlyZXRyeSA9IDE7CisJCQkJYnJlbHNlIChiaCk7CisJCQkJZ290byBuZXh0MjsKKwkJCX0KKwkJCWJmb3JnZXQgKGJoKTsKKwkJfQorCQkqcCA9IDA7CisJCWlub2RlLT5pX2Jsb2NrcyAtPSB1c3BpLT5zX25zcGI7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlpZiAoZnJlZV9jb3VudCA9PSAwKSB7CisJCQlmcmFnX3RvX2ZyZWUgPSB0bXA7CisJCQlmcmVlX2NvdW50ID0gdXNwaS0+c19mcGI7CisJCX0gZWxzZSBpZiAoZnJlZV9jb3VudCA+IDAgJiYgZnJhZ190b19mcmVlID09IHRtcCAtIGZyZWVfY291bnQpCisJCQlmcmVlX2NvdW50ICs9IHVzcGktPnNfZnBiOworCQllbHNlIHsKKwkJCXVmc19mcmVlX2Jsb2NrcyAoaW5vZGUsIGZyYWdfdG9fZnJlZSwgZnJlZV9jb3VudCk7CisJCQlmcmFnX3RvX2ZyZWUgPSB0bXA7CisJCQlmcmVlX2NvdW50ID0gdXNwaS0+c19mcGI7CisJCX0KK25leHQyOjsKKwl9CisJCisJaWYgKGZyZWVfY291bnQgPiAwKQorCQl1ZnNfZnJlZV9ibG9ja3MgKGlub2RlLCBmcmFnX3RvX2ZyZWUsIGZyZWVfY291bnQpOworCisJaWYgKGZyYWczID49IGZyYWc0KQorCQlnb3RvIG5leHQzOworCisJLyoKKwkgKiBGcmVlIGxhc3QgZnJlZSBmcmFnbWVudHMKKwkgKi8KKwlwID0gdWZzaS0+aV91MS5pX2RhdGEgKyB1ZnNfZnJhZ3N0b2Jsa3MgKGZyYWczKTsKKwl0bXAgPSBmczMyX3RvX2NwdShzYiwgKnApOworCWlmICghdG1wICkKKwkJdWZzX3BhbmljKHNiLCAidWZzX3RydW5jYXRlX2RpcmVjdCIsICJpbnRlcm5hbCBlcnJvciIpOworCWZyYWc0ID0gdWZzX2ZyYWdudW0gKGZyYWc0KTsKKwlmb3IgKGogPSAwOyBqIDwgZnJhZzQ7IGorKykgeworCQliaCA9IHNiX2ZpbmRfZ2V0X2Jsb2NrIChzYiwgdG1wICsgaik7CisJCWlmICgoYmggJiYgREFUQV9CVUZGRVJfVVNFRChiaCkpIHx8IHRtcCAhPSBmczMyX3RvX2NwdShzYiwgKnApKSB7CisJCQlyZXRyeSA9IDE7CisJCQlicmVsc2UgKGJoKTsKKwkJCWdvdG8gbmV4dDE7CisJCX0KKwkJYmZvcmdldCAoYmgpOworCX0KKwkqcCA9IDA7CisJaW5vZGUtPmlfYmxvY2tzIC09IGZyYWc0IDw8IHVzcGktPnNfbnNwZnNoaWZ0OworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXVmc19mcmVlX2ZyYWdtZW50cyAoaW5vZGUsIHRtcCwgZnJhZzQpOworIG5leHQzOgorCisJVUZTRCgoIkVYSVRcbiIpKQorCXJldHVybiByZXRyeTsKK30KKworCitzdGF0aWMgaW50IHVmc190cnVuY19pbmRpcmVjdCAoc3RydWN0IGlub2RlICogaW5vZGUsIHVuc2lnbmVkIG9mZnNldCwgX19mczMyICpwKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKKwlzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogaW5kX3ViaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlfX2ZzMzIgKiBpbmQ7CisJdW5zaWduZWQgaW5kaXJlY3RfYmxvY2ssIGksIGosIHRtcDsKKwl1bnNpZ25lZCBmcmFnX3RvX2ZyZWUsIGZyZWVfY291bnQ7CisJaW50IHJldHJ5OworCisJVUZTRCgoIkVOVEVSXG4iKSkKKwkJCisJc2IgPSBpbm9kZS0+aV9zYjsKKwl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCisJZnJhZ190b19mcmVlID0gMDsKKwlmcmVlX2NvdW50ID0gMDsKKwlyZXRyeSA9IDA7CisJCisJdG1wID0gZnMzMl90b19jcHUoc2IsICpwKTsKKwlpZiAoIXRtcCkKKwkJcmV0dXJuIDA7CisJaW5kX3ViaCA9IHViaF9icmVhZChzYiwgdG1wLCB1c3BpLT5zX2JzaXplKTsKKwlpZiAodG1wICE9IGZzMzJfdG9fY3B1KHNiLCAqcCkpIHsKKwkJdWJoX2JyZWxzZSAoaW5kX3ViaCk7CisJCXJldHVybiAxOworCX0KKwlpZiAoIWluZF91YmgpIHsKKwkJKnAgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlpbmRpcmVjdF9ibG9jayA9IChESVJFQ1RfQkxPQ0sgPiBvZmZzZXQpID8gKERJUkVDVF9CTE9DSyAtIG9mZnNldCkgOiAwOworCWZvciAoaSA9IGluZGlyZWN0X2Jsb2NrOyBpIDwgdXNwaS0+c19hcGI7IGkrKykgeworCQlpbmQgPSB1YmhfZ2V0X2FkZHIzMiAoaW5kX3ViaCwgaSk7CisJCXRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqaW5kKTsKKwkJaWYgKCF0bXApCisJCQljb250aW51ZTsKKwkJZm9yIChqID0gMDsgaiA8IHVzcGktPnNfZnBiOyBqKyspIHsKKwkJCWJoID0gc2JfZmluZF9nZXRfYmxvY2soc2IsIHRtcCArIGopOworCQkJaWYgKChiaCAmJiBEQVRBX0JVRkZFUl9VU0VEKGJoKSkgfHwgdG1wICE9IGZzMzJfdG9fY3B1KHNiLCAqaW5kKSkgeworCQkJCXJldHJ5ID0gMTsKKwkJCQlicmVsc2UgKGJoKTsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCQliZm9yZ2V0IChiaCk7CisJCX0JCisJCSppbmQgPSAwOworCQl1YmhfbWFya19idWZmZXJfZGlydHkoaW5kX3ViaCk7CisJCWlmIChmcmVlX2NvdW50ID09IDApIHsKKwkJCWZyYWdfdG9fZnJlZSA9IHRtcDsKKwkJCWZyZWVfY291bnQgPSB1c3BpLT5zX2ZwYjsKKwkJfSBlbHNlIGlmIChmcmVlX2NvdW50ID4gMCAmJiBmcmFnX3RvX2ZyZWUgPT0gdG1wIC0gZnJlZV9jb3VudCkKKwkJCWZyZWVfY291bnQgKz0gdXNwaS0+c19mcGI7CisJCWVsc2UgeworCQkJdWZzX2ZyZWVfYmxvY2tzIChpbm9kZSwgZnJhZ190b19mcmVlLCBmcmVlX2NvdW50KTsKKwkJCWZyYWdfdG9fZnJlZSA9IHRtcDsKKwkJCWZyZWVfY291bnQgPSB1c3BpLT5zX2ZwYjsKKwkJfQorCQlpbm9kZS0+aV9ibG9ja3MgLT0gdXNwaS0+c19uc3BiOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKK25leHQ6OworCX0KKworCWlmIChmcmVlX2NvdW50ID4gMCkgeworCQl1ZnNfZnJlZV9ibG9ja3MgKGlub2RlLCBmcmFnX3RvX2ZyZWUsIGZyZWVfY291bnQpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgdXNwaS0+c19hcGI7IGkrKykKKwkJaWYgKCp1YmhfZ2V0X2FkZHIzMihpbmRfdWJoLGkpKQorCQkJYnJlYWs7CisJaWYgKGkgPj0gdXNwaS0+c19hcGIpIHsKKwkJaWYgKHViaF9tYXhfYmNvdW50KGluZF91YmgpICE9IDEpIHsKKwkJCXJldHJ5ID0gMTsKKwkJfQorCQllbHNlIHsKKwkJCXRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqcCk7CisJCQkqcCA9IDA7CisJCQlpbm9kZS0+aV9ibG9ja3MgLT0gdXNwaS0+c19uc3BiOworCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCQl1ZnNfZnJlZV9ibG9ja3MgKGlub2RlLCB0bXAsIHVzcGktPnNfZnBiKTsKKwkJCXViaF9iZm9yZ2V0KGluZF91YmgpOworCQkJaW5kX3ViaCA9IE5VTEw7CisJCX0KKwl9CisJaWYgKElTX1NZTkMoaW5vZGUpICYmIGluZF91YmggJiYgdWJoX2J1ZmZlcl9kaXJ0eShpbmRfdWJoKSkgeworCQl1Ymhfd2FpdF9vbl9idWZmZXIgKGluZF91YmgpOworCQl1YmhfbGxfcndfYmxvY2sgKFdSSVRFLCAxLCAmaW5kX3ViaCk7CisJCXViaF93YWl0X29uX2J1ZmZlciAoaW5kX3ViaCk7CisJfQorCXViaF9icmVsc2UgKGluZF91YmgpOworCQorCVVGU0QoKCJFWElUXG4iKSkKKwkKKwlyZXR1cm4gcmV0cnk7Cit9CisKK3N0YXRpYyBpbnQgdWZzX3RydW5jX2RpbmRpcmVjdCAoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgb2Zmc2V0LCBfX2ZzMzIgKnApCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiBkaW5kX2JoOworCXVuc2lnbmVkIGksIHRtcCwgZGluZGlyZWN0X2Jsb2NrOworCV9fZnMzMiAqIGRpbmQ7CisJaW50IHJldHJ5ID0gMDsKKwkKKwlVRlNEKCgiRU5URVJcbiIpKQorCQorCXNiID0gaW5vZGUtPmlfc2I7CisJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKworCWRpbmRpcmVjdF9ibG9jayA9IChESVJFQ1RfQkxPQ0sgPiBvZmZzZXQpIAorCQk/ICgoRElSRUNUX0JMT0NLIC0gb2Zmc2V0KSA+PiB1c3BpLT5zX2FwYnNoaWZ0KSA6IDA7CisJcmV0cnkgPSAwOworCQorCXRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqcCk7CisJaWYgKCF0bXApCisJCXJldHVybiAwOworCWRpbmRfYmggPSB1YmhfYnJlYWQoc2IsIHRtcCwgdXNwaS0+c19ic2l6ZSk7CisJaWYgKHRtcCAhPSBmczMyX3RvX2NwdShzYiwgKnApKSB7CisJCXViaF9icmVsc2UgKGRpbmRfYmgpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCFkaW5kX2JoKSB7CisJCSpwID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gZGluZGlyZWN0X2Jsb2NrIDsgaSA8IHVzcGktPnNfYXBiIDsgaSsrKSB7CisJCWRpbmQgPSB1YmhfZ2V0X2FkZHIzMiAoZGluZF9iaCwgaSk7CisJCXRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqZGluZCk7CisJCWlmICghdG1wKQorCQkJY29udGludWU7CisJCXJldHJ5IHw9IHVmc190cnVuY19pbmRpcmVjdCAoaW5vZGUsIG9mZnNldCArIChpIDw8IHVzcGktPnNfYXBic2hpZnQpLCBkaW5kKTsKKwkJdWJoX21hcmtfYnVmZmVyX2RpcnR5KGRpbmRfYmgpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCB1c3BpLT5zX2FwYjsgaSsrKQorCQlpZiAoKnViaF9nZXRfYWRkcjMyIChkaW5kX2JoLCBpKSkKKwkJCWJyZWFrOworCWlmIChpID49IHVzcGktPnNfYXBiKSB7CisJCWlmICh1YmhfbWF4X2Jjb3VudChkaW5kX2JoKSAhPSAxKQorCQkJcmV0cnkgPSAxOworCQllbHNlIHsKKwkJCXRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqcCk7CisJCQkqcCA9IDA7CisJCQlpbm9kZS0+aV9ibG9ja3MgLT0gdXNwaS0+c19uc3BiOworCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCQl1ZnNfZnJlZV9ibG9ja3MgKGlub2RlLCB0bXAsIHVzcGktPnNfZnBiKTsKKwkJCXViaF9iZm9yZ2V0KGRpbmRfYmgpOworCQkJZGluZF9iaCA9IE5VTEw7CisJCX0KKwl9CisJaWYgKElTX1NZTkMoaW5vZGUpICYmIGRpbmRfYmggJiYgdWJoX2J1ZmZlcl9kaXJ0eShkaW5kX2JoKSkgeworCQl1Ymhfd2FpdF9vbl9idWZmZXIgKGRpbmRfYmgpOworCQl1YmhfbGxfcndfYmxvY2sgKFdSSVRFLCAxLCAmZGluZF9iaCk7CisJCXViaF93YWl0X29uX2J1ZmZlciAoZGluZF9iaCk7CisJfQorCXViaF9icmVsc2UgKGRpbmRfYmgpOworCQorCVVGU0QoKCJFWElUXG4iKSkKKwkKKwlyZXR1cm4gcmV0cnk7Cit9CisKK3N0YXRpYyBpbnQgdWZzX3RydW5jX3RpbmRpcmVjdCAoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJc3RydWN0IHVmc19pbm9kZV9pbmZvICp1ZnNpID0gVUZTX0koaW5vZGUpOworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKKwlzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdGluZF9iaDsKKwl1bnNpZ25lZCB0aW5kaXJlY3RfYmxvY2ssIHRtcCwgaTsKKwlfX2ZzMzIgKiB0aW5kLCAqIHA7CisJaW50IHJldHJ5OworCQorCVVGU0QoKCJFTlRFUlxuIikpCisKKwlzYiA9IGlub2RlLT5pX3NiOworCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJcmV0cnkgPSAwOworCQorCXRpbmRpcmVjdF9ibG9jayA9IChESVJFQ1RfQkxPQ0sgPiAoVUZTX05EQUREUiArIHVzcGktPnNfYXBiICsgdXNwaS0+c18yYXBiKSkKKwkJPyAoKERJUkVDVF9CTE9DSyAtIFVGU19OREFERFIgLSB1c3BpLT5zX2FwYiAtIHVzcGktPnNfMmFwYikgPj4gdXNwaS0+c18yYXBic2hpZnQpIDogMDsKKwlwID0gdWZzaS0+aV91MS5pX2RhdGEgKyBVRlNfVElORF9CTE9DSzsKKwlpZiAoISh0bXAgPSBmczMyX3RvX2NwdShzYiwgKnApKSkKKwkJcmV0dXJuIDA7CisJdGluZF9iaCA9IHViaF9icmVhZCAoc2IsIHRtcCwgdXNwaS0+c19ic2l6ZSk7CisJaWYgKHRtcCAhPSBmczMyX3RvX2NwdShzYiwgKnApKSB7CisJCXViaF9icmVsc2UgKHRpbmRfYmgpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCF0aW5kX2JoKSB7CisJCSpwID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gdGluZGlyZWN0X2Jsb2NrIDsgaSA8IHVzcGktPnNfYXBiIDsgaSsrKSB7CisJCXRpbmQgPSB1YmhfZ2V0X2FkZHIzMiAodGluZF9iaCwgaSk7CisJCXJldHJ5IHw9IHVmc190cnVuY19kaW5kaXJlY3QoaW5vZGUsIFVGU19OREFERFIgKyAKKwkJCXVzcGktPnNfYXBiICsgKChpICsgMSkgPDwgdXNwaS0+c18yYXBic2hpZnQpLCB0aW5kKTsKKwkJdWJoX21hcmtfYnVmZmVyX2RpcnR5KHRpbmRfYmgpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgdXNwaS0+c19hcGI7IGkrKykKKwkJaWYgKCp1YmhfZ2V0X2FkZHIzMiAodGluZF9iaCwgaSkpCisJCQlicmVhazsKKwlpZiAoaSA+PSB1c3BpLT5zX2FwYikgeworCQlpZiAodWJoX21heF9iY291bnQodGluZF9iaCkgIT0gMSkKKwkJCXJldHJ5ID0gMTsKKwkJZWxzZSB7CisJCQl0bXAgPSBmczMyX3RvX2NwdShzYiwgKnApOworCQkJKnAgPSAwOworCQkJaW5vZGUtPmlfYmxvY2tzIC09IHVzcGktPnNfbnNwYjsKKwkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkJdWZzX2ZyZWVfYmxvY2tzIChpbm9kZSwgdG1wLCB1c3BpLT5zX2ZwYik7CisJCQl1YmhfYmZvcmdldCh0aW5kX2JoKTsKKwkJCXRpbmRfYmggPSBOVUxMOworCQl9CisJfQorCWlmIChJU19TWU5DKGlub2RlKSAmJiB0aW5kX2JoICYmIHViaF9idWZmZXJfZGlydHkodGluZF9iaCkpIHsKKwkJdWJoX3dhaXRfb25fYnVmZmVyICh0aW5kX2JoKTsKKwkJdWJoX2xsX3J3X2Jsb2NrIChXUklURSwgMSwgJnRpbmRfYmgpOworCQl1Ymhfd2FpdF9vbl9idWZmZXIgKHRpbmRfYmgpOworCX0KKwl1YmhfYnJlbHNlICh0aW5kX2JoKTsKKwkKKwlVRlNEKCgiRVhJVFxuIikpCisJcmV0dXJuIHJldHJ5OworfQorCQkKK3ZvaWQgdWZzX3RydW5jYXRlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKnVmc2kgPSBVRlNfSShpbm9kZSk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXVuc2lnbmVkIG9mZnNldDsKKwlpbnQgZXJyLCByZXRyeTsKKwkKKwlVRlNEKCgiRU5URVJcbiIpKQorCXNiID0gaW5vZGUtPmlfc2I7CisJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKworCWlmICghKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTTE5LKGlub2RlLT5pX21vZGUpKSkKKwkJcmV0dXJuOworCWlmIChJU19BUFBFTkQoaW5vZGUpIHx8IElTX0lNTVVUQUJMRShpbm9kZSkpCisJCXJldHVybjsKKwlsb2NrX2tlcm5lbCgpOworCXdoaWxlICgxKSB7CisJCXJldHJ5ID0gdWZzX3RydW5jX2RpcmVjdChpbm9kZSk7CisJCXJldHJ5IHw9IHVmc190cnVuY19pbmRpcmVjdCAoaW5vZGUsIFVGU19JTkRfQkxPQ0ssCisJCQkoX19mczMyICopICZ1ZnNpLT5pX3UxLmlfZGF0YVtVRlNfSU5EX0JMT0NLXSk7CisJCXJldHJ5IHw9IHVmc190cnVuY19kaW5kaXJlY3QgKGlub2RlLCBVRlNfSU5EX0JMT0NLICsgdXNwaS0+c19hcGIsCisJCQkoX19mczMyICopICZ1ZnNpLT5pX3UxLmlfZGF0YVtVRlNfRElORF9CTE9DS10pOworCQlyZXRyeSB8PSB1ZnNfdHJ1bmNfdGluZGlyZWN0IChpbm9kZSk7CisJCWlmICghcmV0cnkpCisJCQlicmVhazsKKwkJaWYgKElTX1NZTkMoaW5vZGUpICYmIChpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFkpKQorCQkJdWZzX3N5bmNfaW5vZGUgKGlub2RlKTsKKwkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKGlub2RlLT5pX21hcHBpbmcpOworCQl5aWVsZCgpOworCX0KKwlvZmZzZXQgPSBpbm9kZS0+aV9zaXplICYgdXNwaS0+c19mc2hpZnQ7CisJaWYgKG9mZnNldCkgeworCQliaCA9IHVmc19icmVhZCAoaW5vZGUsIGlub2RlLT5pX3NpemUgPj4gdXNwaS0+c19mc2hpZnQsIDAsICZlcnIpOworCQlpZiAoYmgpIHsKKwkJCW1lbXNldCAoYmgtPmJfZGF0YSArIG9mZnNldCwgMCwgdXNwaS0+c19mc2l6ZSAtIG9mZnNldCk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eSAoYmgpOworCQkJYnJlbHNlIChiaCk7CisJCX0KKwl9CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJdWZzaS0+aV9sYXN0ZnJhZyA9IERJUkVDVF9GUkFHTUVOVDsKKwl1bmxvY2tfa2VybmVsKCk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJVUZTRCgoIkVYSVRcbiIpKQorfQpkaWZmIC0tZ2l0IGEvZnMvdWZzL3V0aWwuYyBiL2ZzL3Vmcy91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlhY2M4ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Vmcy91dGlsLmMKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiAgbGludXgvZnMvdWZzL3V0aWwuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OAorICogRGFuaWVsIFBpcmtsIDxkYW5pZWwucGlya2xAZW1haWwuY3o+CisgKiBDaGFybGVzIFVuaXZlcnNpdHksIEZhY3VsdHkgb2YgTWF0aGVtYXRpY3MgYW5kIFBoeXNpY3MKKyAqLworIAorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91ZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisjaW5jbHVkZSAic3dhYi5oIgorI2luY2x1ZGUgInV0aWwuaCIKKworI3VuZGVmIFVGU19VVElMU19ERUJVRworCisjaWZkZWYgVUZTX1VUSUxTX0RFQlVHCisjZGVmaW5lIFVGU0QoeCkgcHJpbnRrKCIoJXMsICVkKSwgJXM6ICIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgcHJpbnRrIHg7CisjZWxzZQorI2RlZmluZSBVRlNEKHgpCisjZW5kaWYKKworCitzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogX3ViaF9icmVhZF8gKHN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaSwKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1NjQgZnJhZ21lbnQsIHU2NCBzaXplKQoreworCXN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1Ymg7CisJdW5zaWduZWQgaSwgaiA7CisJdTY0ICBjb3VudCA9IDA7CisJaWYgKHNpemUgJiB+dXNwaS0+c19mbWFzaykKKwkJcmV0dXJuIE5VTEw7CisJY291bnQgPSBzaXplID4+IHVzcGktPnNfZnNoaWZ0OworCWlmIChjb3VudCA+IFVGU19NQVhGUkFHKQorCQlyZXR1cm4gTlVMTDsKKwl1YmggPSAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKQorCQlrbWFsbG9jIChzaXplb2YgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXViaCkKKwkJcmV0dXJuIE5VTEw7CisJdWJoLT5mcmFnbWVudCA9IGZyYWdtZW50OworCXViaC0+Y291bnQgPSBjb3VudDsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJaWYgKCEodWJoLT5iaFtpXSA9IHNiX2JyZWFkKHNiLCBmcmFnbWVudCArIGkpKSkKKwkJCWdvdG8gZmFpbGVkOworCWZvciAoOyBpIDwgVUZTX01BWEZSQUc7IGkrKykKKwkJdWJoLT5iaFtpXSA9IE5VTEw7CisJcmV0dXJuIHViaDsKK2ZhaWxlZDoKKwlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCQlicmVsc2UgKHViaC0+Ymhbal0pOworCWtmcmVlKHViaCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1YmhfYnJlYWRfdXNwaSAoc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpLAorCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHU2NCBmcmFnbWVudCwgdTY0IHNpemUpCit7CisJdW5zaWduZWQgaSwgajsKKwl1NjQgY291bnQgPSAwOworCWlmIChzaXplICYgfnVzcGktPnNfZm1hc2spCisJCXJldHVybiBOVUxMOworCWNvdW50ID0gc2l6ZSA+PiB1c3BpLT5zX2ZzaGlmdDsKKwlpZiAoY291bnQgPD0gMCB8fCBjb3VudCA+IFVGU19NQVhGUkFHKQorCQlyZXR1cm4gTlVMTDsKKwlVU1BJX1VCSC0+ZnJhZ21lbnQgPSBmcmFnbWVudDsKKwlVU1BJX1VCSC0+Y291bnQgPSBjb3VudDsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJaWYgKCEoVVNQSV9VQkgtPmJoW2ldID0gc2JfYnJlYWQoc2IsIGZyYWdtZW50ICsgaSkpKQorCQkJZ290byBmYWlsZWQ7CisJZm9yICg7IGkgPCBVRlNfTUFYRlJBRzsgaSsrKQorCQlVU1BJX1VCSC0+YmhbaV0gPSBOVUxMOworCXJldHVybiBVU1BJX1VCSDsKK2ZhaWxlZDoKKwlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCQlicmVsc2UgKFVTUElfVUJILT5iaFtqXSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgdWJoX2JyZWxzZSAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIHViaCkKK3sKKwl1bnNpZ25lZCBpOworCWlmICghdWJoKQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IHViaC0+Y291bnQ7IGkrKykKKwkJYnJlbHNlICh1YmgtPmJoW2ldKTsKKwlrZnJlZSAodWJoKTsKK30KKwordm9pZCB1YmhfYnJlbHNlX3VzcGkgKHN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaSkKK3sKKwl1bnNpZ25lZCBpOworCWlmICghVVNQSV9VQkgpCisJCXJldHVybjsKKwlmb3IgKCBpID0gMDsgaSA8IFVTUElfVUJILT5jb3VudDsgaSsrICkgeworCQlicmVsc2UgKFVTUElfVUJILT5iaFtpXSk7CisJCVVTUElfVUJILT5iaFtpXSA9IE5VTEw7CisJfQorfQorCit2b2lkIHViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIHViaCkKK3sKKwl1bnNpZ25lZCBpOworCWlmICghdWJoKQorCQlyZXR1cm47CisJZm9yICggaSA9IDA7IGkgPCB1YmgtPmNvdW50OyBpKysgKQorCQltYXJrX2J1ZmZlcl9kaXJ0eSAodWJoLT5iaFtpXSk7Cit9CisKK3ZvaWQgdWJoX21hcmtfYnVmZmVyX3VwdG9kYXRlIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdWJoLCBpbnQgZmxhZykKK3sKKwl1bnNpZ25lZCBpOworCWlmICghdWJoKQorCQlyZXR1cm47CisJaWYgKGZsYWcpIHsKKwkJZm9yICggaSA9IDA7IGkgPCB1YmgtPmNvdW50OyBpKysgKQorCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZSAodWJoLT5iaFtpXSk7CisJfSBlbHNlIHsKKwkJZm9yICggaSA9IDA7IGkgPCB1YmgtPmNvdW50OyBpKysgKQorCQkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlICh1YmgtPmJoW2ldKTsKKwl9Cit9CisKK3ZvaWQgdWJoX2xsX3J3X2Jsb2NrIChpbnQgcncsIHVuc2lnbmVkIG5yLCBzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdWJoW10pCit7CisJdW5zaWduZWQgaTsKKwlpZiAoIXViaCkKKwkJcmV0dXJuOworCWZvciAoIGkgPSAwOyBpIDwgbnI7IGkrKyApCisJCWxsX3J3X2Jsb2NrIChydywgdWJoW2ldLT5jb3VudCwgdWJoW2ldLT5iaCk7Cit9CisKK3ZvaWQgdWJoX3dhaXRfb25fYnVmZmVyIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdWJoKQoreworCXVuc2lnbmVkIGk7CisJaWYgKCF1YmgpCisJCXJldHVybjsKKwlmb3IgKCBpID0gMDsgaSA8IHViaC0+Y291bnQ7IGkrKyApCisJCXdhaXRfb25fYnVmZmVyICh1YmgtPmJoW2ldKTsKK30KKwordW5zaWduZWQgdWJoX21heF9iY291bnQgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1YmgpCit7CisJdW5zaWduZWQgaTsKKwl1bnNpZ25lZCBtYXggPSAwOworCWlmICghdWJoKQorCQlyZXR1cm4gMDsKKwlmb3IgKCBpID0gMDsgaSA8IHViaC0+Y291bnQ7IGkrKyApIAorCQlpZiAoIGF0b21pY19yZWFkKCZ1YmgtPmJoW2ldLT5iX2NvdW50KSA+IG1heCApCisJCQltYXggPSBhdG9taWNfcmVhZCgmdWJoLT5iaFtpXS0+Yl9jb3VudCk7CisJcmV0dXJuIG1heDsKK30KKwordm9pZCB1YmhfYmZvcmdldCAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIHViaCkKK3sKKwl1bnNpZ25lZCBpOworCWlmICghdWJoKSAKKwkJcmV0dXJuOworCWZvciAoIGkgPSAwOyBpIDwgdWJoLT5jb3VudDsgaSsrICkgaWYgKCB1YmgtPmJoW2ldICkgCisJCWJmb3JnZXQgKHViaC0+YmhbaV0pOworfQorIAoraW50IHViaF9idWZmZXJfZGlydHkgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1YmgpCit7CisJdW5zaWduZWQgaTsKKwl1bnNpZ25lZCByZXN1bHQgPSAwOworCWlmICghdWJoKQorCQlyZXR1cm4gMDsKKwlmb3IgKCBpID0gMDsgaSA8IHViaC0+Y291bnQ7IGkrKyApCisJCXJlc3VsdCB8PSBidWZmZXJfZGlydHkodWJoLT5iaFtpXSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBfdWJoX3ViaGNweW1lbV8oc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpLCAKKwl1bnNpZ25lZCBjaGFyICogbWVtLCBzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdWJoLCB1bnNpZ25lZCBzaXplKQoreworCXVuc2lnbmVkIGxlbiwgYmhubzsKKwlpZiAoc2l6ZSA+ICh1YmgtPmNvdW50IDw8IHVzcGktPnNfZnNoaWZ0KSkKKwkJc2l6ZSA9IHViaC0+Y291bnQgPDwgdXNwaS0+c19mc2hpZnQ7CisJYmhubyA9IDA7CisJd2hpbGUgKHNpemUpIHsKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBzaXplLCB1c3BpLT5zX2ZzaXplKTsKKwkJbWVtY3B5IChtZW0sIHViaC0+YmhbYmhub10tPmJfZGF0YSwgbGVuKTsKKwkJbWVtICs9IHVzcGktPnNfZnNpemU7CisJCXNpemUgLT0gbGVuOworCQliaG5vKys7CisJfQorfQorCit2b2lkIF91YmhfbWVtY3B5dWJoXyhzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGksIAorCXN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1YmgsIHVuc2lnbmVkIGNoYXIgKiBtZW0sIHVuc2lnbmVkIHNpemUpCit7CisJdW5zaWduZWQgbGVuLCBiaG5vOworCWlmIChzaXplID4gKHViaC0+Y291bnQgPDwgdXNwaS0+c19mc2hpZnQpKQorCQlzaXplID0gdWJoLT5jb3VudCA8PCB1c3BpLT5zX2ZzaGlmdDsKKwliaG5vID0gMDsKKwl3aGlsZSAoc2l6ZSkgeworCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHNpemUsIHVzcGktPnNfZnNpemUpOworCQltZW1jcHkgKHViaC0+YmhbYmhub10tPmJfZGF0YSwgbWVtLCBsZW4pOworCQltZW0gKz0gdXNwaS0+c19mc2l6ZTsKKwkJc2l6ZSAtPSBsZW47CisJCWJobm8rKzsKKwl9Cit9CisKK2Rldl90Cit1ZnNfZ2V0X2lub2RlX2RldihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKnVmc2kpCit7CisJX19mczMyIGZzMzI7CisJZGV2X3QgZGV2OworCisJaWYgKChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX1NUX01BU0spID09IFVGU19TVF9TVU54ODYpCisJCWZzMzIgPSB1ZnNpLT5pX3UxLmlfZGF0YVsxXTsKKwllbHNlCisJCWZzMzIgPSB1ZnNpLT5pX3UxLmlfZGF0YVswXTsKKwlmczMyID0gZnMzMl90b19jcHUoc2IsIGZzMzIpOworCXN3aXRjaCAoVUZTX1NCKHNiKS0+c19mbGFncyAmIFVGU19TVF9NQVNLKSB7CisJY2FzZSBVRlNfU1RfU1VOeDg2OgorCWNhc2UgVUZTX1NUX1NVTjoKKwkJaWYgKChmczMyICYgMHhmZmZmMDAwMCkgPT0gMCB8fAorCQkgICAgKGZzMzIgJiAweGZmZmYwMDAwKSA9PSAweGZmZmYwMDAwKQorCQkJZGV2ID0gb2xkX2RlY29kZV9kZXYoZnMzMiAmIDB4N2ZmZik7CisJCWVsc2UKKwkJCWRldiA9IE1LREVWKHN5c3ZfbWFqb3IoZnMzMiksIHN5c3ZfbWlub3IoZnMzMikpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldiA9IG9sZF9kZWNvZGVfZGV2KGZzMzIpOworCQlicmVhazsKKwl9CisJcmV0dXJuIGRldjsKK30KKwordm9pZAordWZzX3NldF9pbm9kZV9kZXYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHVmc19pbm9kZV9pbmZvICp1ZnNpLCBkZXZfdCBkZXYpCit7CisJX19mczMyIGZzMzI7CisKKwlzd2l0Y2ggKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfU1RfTUFTSykgeworCWNhc2UgVUZTX1NUX1NVTng4NjoKKwljYXNlIFVGU19TVF9TVU46CisJCWZzMzIgPSBzeXN2X2VuY29kZV9kZXYoZGV2KTsKKwkJaWYgKChmczMyICYgMHhmZmZmODAwMCkgPT0gMCkgeworCQkJZnMzMiA9IG9sZF9lbmNvZGVfZGV2KGRldik7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlmczMyID0gb2xkX2VuY29kZV9kZXYoZGV2KTsKKwkJYnJlYWs7CisJfQorCWZzMzIgPSBjcHVfdG9fZnMzMihzYiwgZnMzMik7CisJaWYgKChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX1NUX01BU0spID09IFVGU19TVF9TVU54ODYpCisJCXVmc2ktPmlfdTEuaV9kYXRhWzFdID0gZnMzMjsKKwllbHNlCisJCXVmc2ktPmlfdTEuaV9kYXRhWzBdID0gZnMzMjsKK30KZGlmZiAtLWdpdCBhL2ZzL3Vmcy91dGlsLmggYi9mcy91ZnMvdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjQwMDcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZnMvdXRpbC5oCkBAIC0wLDAgKzEsNTI2IEBACisvKgorICogIGxpbnV4L2ZzL3Vmcy91dGlsLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggCisgKiBEYW5pZWwgUGlya2wgPGRhbmllbC5waXJrbEBlbWFpbC5jej4KKyAqIENoYXJsZXMgVW5pdmVyc2l0eSwgRmFjdWx0eSBvZiBNYXRoZW1hdGljcyBhbmQgUGh5c2ljcworICovCisKKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSAic3dhYi5oIgorCisKKy8qCisgKiBzb21lIHVzZWZ1bCBtYWNyb3MKKyAqLworI2RlZmluZSBpbl9yYW5nZShiLGZpcnN0LGxlbikJKChiKT49KGZpcnN0KSYmKGIpPChmaXJzdCkrKGxlbikpCisKKy8qCisgKiBtYWNyb3MgdXNlZCBmb3IgcmV0eXBpbmcKKyAqLworI2RlZmluZSBVQ1BJX1VCSCAoKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKil1Y3BpKQorI2RlZmluZSBVU1BJX1VCSCAoKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKil1c3BpKQorCisKKworLyoKKyAqIG1hY3JvcyB1c2VkIGZvciBhY2Nlc3Npbmcgc3RydWN0dXJlcworICovCitzdGF0aWMgaW5saW5lIHMzMgordWZzX2dldF9mc19zdGF0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICp1c2IxLAorCQkgc3RydWN0IHVmc19zdXBlcl9ibG9ja190aGlyZCAqdXNiMykKK3sKKwlzd2l0Y2ggKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfU1RfTUFTSykgeworCWNhc2UgVUZTX1NUX1NVTjoKKwkJcmV0dXJuIGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc191Mi5mc19zdW4uZnNfc3RhdGUpOworCWNhc2UgVUZTX1NUX1NVTng4NjoKKwkJcmV0dXJuIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc191MS5mc19zdW54ODYuZnNfc3RhdGUpOworCWNhc2UgVUZTX1NUXzQ0QlNEOgorCWRlZmF1bHQ6CisJCXJldHVybiBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfdTIuZnNfNDQuZnNfc3RhdGUpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkCit1ZnNfc2V0X2ZzX3N0YXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKnVzYjEsCisJCSBzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3RoaXJkICp1c2IzLCBzMzIgdmFsdWUpCit7CisJc3dpdGNoIChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX1NUX01BU0spIHsKKwljYXNlIFVGU19TVF9TVU46CisJCXVzYjMtPmZzX3UyLmZzX3N1bi5mc19zdGF0ZSA9IGNwdV90b19mczMyKHNiLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVUZTX1NUX1NVTng4NjoKKwkJdXNiMS0+ZnNfdTEuZnNfc3VueDg2LmZzX3N0YXRlID0gY3B1X3RvX2ZzMzIoc2IsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBVRlNfU1RfNDRCU0Q6CisJCXVzYjMtPmZzX3UyLmZzXzQ0LmZzX3N0YXRlID0gY3B1X3RvX2ZzMzIoc2IsIHZhbHVlKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHUzMgordWZzX2dldF9mc19ucHNlY3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqdXNiMSwKKwkJICBzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3RoaXJkICp1c2IzKQoreworCWlmICgoVUZTX1NCKHNiKS0+c19mbGFncyAmIFVGU19TVF9NQVNLKSA9PSBVRlNfU1RfU1VOeDg2KQorCQlyZXR1cm4gZnMzMl90b19jcHUoc2IsIHVzYjMtPmZzX3UyLmZzX3N1bng4Ni5mc19ucHNlY3QpOworCWVsc2UKKwkJcmV0dXJuIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc191MS5mc19zdW4uZnNfbnBzZWN0KTsKK30KKworc3RhdGljIGlubGluZSB1NjQKK3Vmc19nZXRfZnNfcWJtYXNrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfdGhpcmQgKnVzYjMpCit7CisJX19mczY0IHRtcDsKKworCXN3aXRjaCAoVUZTX1NCKHNiKS0+c19mbGFncyAmIFVGU19TVF9NQVNLKSB7CisJY2FzZSBVRlNfU1RfU1VOOgorCQkoKF9fZnMzMiAqKSZ0bXApWzBdID0gdXNiMy0+ZnNfdTIuZnNfc3VuLmZzX3FibWFza1swXTsKKwkJKChfX2ZzMzIgKikmdG1wKVsxXSA9IHVzYjMtPmZzX3UyLmZzX3N1bi5mc19xYm1hc2tbMV07CisJCWJyZWFrOworCWNhc2UgVUZTX1NUX1NVTng4NjoKKwkJKChfX2ZzMzIgKikmdG1wKVswXSA9IHVzYjMtPmZzX3UyLmZzX3N1bng4Ni5mc19xYm1hc2tbMF07CisJCSgoX19mczMyICopJnRtcClbMV0gPSB1c2IzLT5mc191Mi5mc19zdW54ODYuZnNfcWJtYXNrWzFdOworCQlicmVhazsKKwljYXNlIFVGU19TVF80NEJTRDoKKwkJKChfX2ZzMzIgKikmdG1wKVswXSA9IHVzYjMtPmZzX3UyLmZzXzQ0LmZzX3FibWFza1swXTsKKwkJKChfX2ZzMzIgKikmdG1wKVsxXSA9IHVzYjMtPmZzX3UyLmZzXzQ0LmZzX3FibWFza1sxXTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGZzNjRfdG9fY3B1KHNiLCB0bXApOworfQorCitzdGF0aWMgaW5saW5lIHU2NAordWZzX2dldF9mc19xZm1hc2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHVmc19zdXBlcl9ibG9ja190aGlyZCAqdXNiMykKK3sKKwlfX2ZzNjQgdG1wOworCisJc3dpdGNoIChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX1NUX01BU0spIHsKKwljYXNlIFVGU19TVF9TVU46CisJCSgoX19mczMyICopJnRtcClbMF0gPSB1c2IzLT5mc191Mi5mc19zdW4uZnNfcWZtYXNrWzBdOworCQkoKF9fZnMzMiAqKSZ0bXApWzFdID0gdXNiMy0+ZnNfdTIuZnNfc3VuLmZzX3FmbWFza1sxXTsKKwkJYnJlYWs7CisJY2FzZSBVRlNfU1RfU1VOeDg2OgorCQkoKF9fZnMzMiAqKSZ0bXApWzBdID0gdXNiMy0+ZnNfdTIuZnNfc3VueDg2LmZzX3FmbWFza1swXTsKKwkJKChfX2ZzMzIgKikmdG1wKVsxXSA9IHVzYjMtPmZzX3UyLmZzX3N1bng4Ni5mc19xZm1hc2tbMV07CisJCWJyZWFrOworCWNhc2UgVUZTX1NUXzQ0QlNEOgorCQkoKF9fZnMzMiAqKSZ0bXApWzBdID0gdXNiMy0+ZnNfdTIuZnNfNDQuZnNfcWZtYXNrWzBdOworCQkoKF9fZnMzMiAqKSZ0bXApWzFdID0gdXNiMy0+ZnNfdTIuZnNfNDQuZnNfcWZtYXNrWzFdOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZnM2NF90b19jcHUoc2IsIHRtcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2Cit1ZnNfZ2V0X2RlX25hbWxlbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqZGUpCit7CisJaWYgKChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX0RFX01BU0spID09IFVGU19ERV9PTEQpCisJCXJldHVybiBmczE2X3RvX2NwdShzYiwgZGUtPmRfdS5kX25hbWxlbik7CisJZWxzZQorCQlyZXR1cm4gZGUtPmRfdS5kXzQ0LmRfbmFtbGVuOyAvKiBYWFggdGhpcyBzZWVtcyB3cm9uZyAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3Vmc19zZXRfZGVfbmFtbGVuKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkZSwgdTE2IHZhbHVlKQoreworCWlmICgoVUZTX1NCKHNiKS0+c19mbGFncyAmIFVGU19ERV9NQVNLKSA9PSBVRlNfREVfT0xEKQorCQlkZS0+ZF91LmRfbmFtbGVuID0gY3B1X3RvX2ZzMTYoc2IsIHZhbHVlKTsKKwllbHNlCisJCWRlLT5kX3UuZF80NC5kX25hbWxlbiA9IHZhbHVlOyAvKiBYWFggdGhpcyBzZWVtcyB3cm9uZyAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3Vmc19zZXRfZGVfdHlwZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqZGUsIGludCBtb2RlKQoreworCWlmICgoVUZTX1NCKHNiKS0+c19mbGFncyAmIFVGU19ERV9NQVNLKSAhPSBVRlNfREVfNDRCU0QpCisJCXJldHVybjsKKworCS8qCisJICogVE9ETyB0dXJuIHRoaXMgaW50byBhIHRhYmxlIGxvb2t1cAorCSAqLworCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgeworCWNhc2UgU19JRlNPQ0s6CisJCWRlLT5kX3UuZF80NC5kX3R5cGUgPSBEVF9TT0NLOworCQlicmVhazsKKwljYXNlIFNfSUZMTks6CisJCWRlLT5kX3UuZF80NC5kX3R5cGUgPSBEVF9MTks7CisJCWJyZWFrOworCWNhc2UgU19JRlJFRzoKKwkJZGUtPmRfdS5kXzQ0LmRfdHlwZSA9IERUX1JFRzsKKwkJYnJlYWs7CisJY2FzZSBTX0lGQkxLOgorCQlkZS0+ZF91LmRfNDQuZF90eXBlID0gRFRfQkxLOworCQlicmVhazsKKwljYXNlIFNfSUZESVI6CisJCWRlLT5kX3UuZF80NC5kX3R5cGUgPSBEVF9ESVI7CisJCWJyZWFrOworCWNhc2UgU19JRkNIUjoKKwkJZGUtPmRfdS5kXzQ0LmRfdHlwZSA9IERUX0NIUjsKKwkJYnJlYWs7CisJY2FzZSBTX0lGSUZPOgorCQlkZS0+ZF91LmRfNDQuZF90eXBlID0gRFRfRklGTzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGUtPmRfdS5kXzQ0LmRfdHlwZSA9IERUX1VOS05PV047CisJfQorfQorCitzdGF0aWMgaW5saW5lIHUzMgordWZzX2dldF9pbm9kZV91aWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHVmc19pbm9kZSAqaW5vZGUpCit7CisJc3dpdGNoIChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX1VJRF9NQVNLKSB7CisJY2FzZSBVRlNfVUlEX0VGVDoKKwkJcmV0dXJuIGZzMzJfdG9fY3B1KHNiLCBpbm9kZS0+dWlfdTMudWlfc3VuLnVpX3VpZCk7CisJY2FzZSBVRlNfVUlEXzQ0QlNEOgorCQlyZXR1cm4gZnMzMl90b19jcHUoc2IsIGlub2RlLT51aV91My51aV80NC51aV91aWQpOworCWRlZmF1bHQ6CisJCXJldHVybiBmczE2X3RvX2NwdShzYiwgaW5vZGUtPnVpX3UxLm9sZGlkcy51aV9zdWlkKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordWZzX3NldF9pbm9kZV91aWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHVmc19pbm9kZSAqaW5vZGUsIHUzMiB2YWx1ZSkKK3sKKwlzd2l0Y2ggKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfVUlEX01BU0spIHsKKwljYXNlIFVGU19VSURfRUZUOgorCQlpbm9kZS0+dWlfdTMudWlfc3VuLnVpX3VpZCA9IGNwdV90b19mczMyKHNiLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVUZTX1VJRF80NEJTRDoKKwkJaW5vZGUtPnVpX3UzLnVpXzQ0LnVpX3VpZCA9IGNwdV90b19mczMyKHNiLCB2YWx1ZSk7CisJCWJyZWFrOworCX0KKwlpbm9kZS0+dWlfdTEub2xkaWRzLnVpX3N1aWQgPSBjcHVfdG9fZnMxNihzYiwgdmFsdWUpOyAKK30KKworc3RhdGljIGlubGluZSB1MzIKK3Vmc19nZXRfaW5vZGVfZ2lkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCB1ZnNfaW5vZGUgKmlub2RlKQoreworCXN3aXRjaCAoVUZTX1NCKHNiKS0+c19mbGFncyAmIFVGU19VSURfTUFTSykgeworCWNhc2UgVUZTX1VJRF9FRlQ6CisJCXJldHVybiBmczMyX3RvX2NwdShzYiwgaW5vZGUtPnVpX3UzLnVpX3N1bi51aV9naWQpOworCWNhc2UgVUZTX1VJRF80NEJTRDoKKwkJcmV0dXJuIGZzMzJfdG9fY3B1KHNiLCBpbm9kZS0+dWlfdTMudWlfNDQudWlfZ2lkKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZnMxNl90b19jcHUoc2IsIGlub2RlLT51aV91MS5vbGRpZHMudWlfc2dpZCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3Vmc19zZXRfaW5vZGVfZ2lkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCB1ZnNfaW5vZGUgKmlub2RlLCB1MzIgdmFsdWUpCit7CisJc3dpdGNoIChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX1VJRF9NQVNLKSB7CisJY2FzZSBVRlNfVUlEX0VGVDoKKwkJaW5vZGUtPnVpX3UzLnVpX3N1bi51aV9naWQgPSBjcHVfdG9fZnMzMihzYiwgdmFsdWUpOworCQlicmVhazsKKwljYXNlIFVGU19VSURfNDRCU0Q6CisJCWlub2RlLT51aV91My51aV80NC51aV9naWQgPSBjcHVfdG9fZnMzMihzYiwgdmFsdWUpOworCQlicmVhazsKKwl9CisJaW5vZGUtPnVpX3UxLm9sZGlkcy51aV9zZ2lkID0gIGNwdV90b19mczE2KHNiLCB2YWx1ZSk7Cit9CisKK2V4dGVybiBkZXZfdCB1ZnNfZ2V0X2lub2RlX2RldihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IHVmc19pbm9kZV9pbmZvICopOworZXh0ZXJuIHZvaWQgdWZzX3NldF9pbm9kZV9kZXYoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCB1ZnNfaW5vZGVfaW5mbyAqLCBkZXZfdCk7CisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgbWFuaXB1bGF0ZSB1ZnMgYnVmZmVycworICovCisjZGVmaW5lIHViaF9icmVhZChzYixmcmFnbWVudCxzaXplKSBfdWJoX2JyZWFkXyh1c3BpLHNiLGZyYWdtZW50LHNpemUpICAKK2V4dGVybiBzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogX3ViaF9icmVhZF8oc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiwgc3RydWN0IHN1cGVyX2Jsb2NrICosIHU2NCAsIHU2NCk7CitleHRlcm4gc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIHViaF9icmVhZF91c3BpKHN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICosIHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1NjQsIHU2NCk7CitleHRlcm4gdm9pZCB1YmhfYnJlbHNlIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICopOworZXh0ZXJuIHZvaWQgdWJoX2JyZWxzZV91c3BpIChzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqKTsKK2V4dGVybiB2b2lkIHViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKTsKK2V4dGVybiB2b2lkIHViaF9tYXJrX2J1ZmZlcl91cHRvZGF0ZSAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgdWJoX2xsX3J3X2Jsb2NrIChpbnQsIHVuc2lnbmVkLCBzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKTsKK2V4dGVybiB2b2lkIHViaF93YWl0X29uX2J1ZmZlciAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKTsKK2V4dGVybiB1bnNpZ25lZCB1YmhfbWF4X2Jjb3VudCAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKTsKK2V4dGVybiB2b2lkIHViaF9iZm9yZ2V0IChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICopOworZXh0ZXJuIGludCAgdWJoX2J1ZmZlcl9kaXJ0eSAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKTsKKyNkZWZpbmUgdWJoX3ViaGNweW1lbShtZW0sdWJoLHNpemUpIF91YmhfdWJoY3B5bWVtXyh1c3BpLG1lbSx1Ymgsc2l6ZSkKK2V4dGVybiB2b2lkIF91YmhfdWJoY3B5bWVtXyhzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqLCB1bnNpZ25lZCBjaGFyICosIHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiwgdW5zaWduZWQpOworI2RlZmluZSB1YmhfbWVtY3B5dWJoKHViaCxtZW0sc2l6ZSkgX3ViaF9tZW1jcHl1YmhfKHVzcGksdWJoLG1lbSxzaXplKQorZXh0ZXJuIHZvaWQgX3ViaF9tZW1jcHl1YmhfKHN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICosIHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCk7CisKKworCisvKgorICogbWFjcm9zIHRvIGdldCBpbXBvcnRhbnQgc3RydWN0dXJlcyBmcm9tIHVmc19idWZmZXJfaGVhZAorICovCisjZGVmaW5lIHViaF9nZXRfdXNiX2ZpcnN0KHViaCkgXAorCSgoc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqKSgodWJoKS0+YmhbMF0tPmJfZGF0YSkpCisKKyNkZWZpbmUgdWJoX2dldF91c2Jfc2Vjb25kKHViaCkgXAorCSgoc3RydWN0IHVmc19zdXBlcl9ibG9ja19zZWNvbmQgKikodWJoKS0+IFwKKwliaFtVRlNfU0VDVE9SX1NJWkUgPj4gdXNwaS0+c19mc2hpZnRdLT5iX2RhdGEgKyAoVUZTX1NFQ1RPUl9TSVpFICYgfnVzcGktPnNfZm1hc2spKQorCisjZGVmaW5lIHViaF9nZXRfdXNiX3RoaXJkKHViaCkgXAorCSgoc3RydWN0IHVmc19zdXBlcl9ibG9ja190aGlyZCAqKSgodWJoKS0+IFwKKwliaFtVRlNfU0VDVE9SX1NJWkUqMiA+PiB1c3BpLT5zX2ZzaGlmdF0tPmJfZGF0YSArIChVRlNfU0VDVE9SX1NJWkUqMiAmIH51c3BpLT5zX2ZtYXNrKSkpCisKKyNkZWZpbmUgdWJoX2dldF91Y2codWJoKSBcCisJKChzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwICopKCh1YmgpLT5iaFswXS0+Yl9kYXRhKSkKKworCisvKgorICogRXh0cmFjdCBieXRlIGZyb20gdWZzX2J1ZmZlcl9oZWFkCisgKiBFeHRyYWN0IHRoZSBiaXRzIGZvciBhIGJsb2NrIGZyb20gYSBtYXAgaW5zaWRlIHVmc19idWZmZXJfaGVhZAorICovCisjZGVmaW5lIHViaF9nZXRfYWRkcjgodWJoLGJlZ2luKSBcCisJKCh1OCopKHViaCktPmJoWyhiZWdpbikgPj4gdXNwaS0+c19mc2hpZnRdLT5iX2RhdGEgKyBcCisJKChiZWdpbikgJiB+dXNwaS0+c19mbWFzaykpCisKKyNkZWZpbmUgdWJoX2dldF9hZGRyMTYodWJoLGJlZ2luKSBcCisJKCgoX19mczE2KikoKHViaCktPmJoWyhiZWdpbikgPj4gKHVzcGktPnNfZnNoaWZ0LTEpXS0+Yl9kYXRhKSkgKyBcCisJKChiZWdpbikgJiAodXNwaS0+ZnNpemU+PjEpIC0gMSkpKQorCisjZGVmaW5lIHViaF9nZXRfYWRkcjMyKHViaCxiZWdpbikgXAorCSgoKF9fZnMzMiopKCh1YmgpLT5iaFsoYmVnaW4pID4+ICh1c3BpLT5zX2ZzaGlmdC0yKV0tPmJfZGF0YSkpICsgXAorCSgoYmVnaW4pICYgKCh1c3BpLT5zX2ZzaXplPj4yKSAtIDEpKSkKKworI2RlZmluZSB1YmhfZ2V0X2FkZHIgdWJoX2dldF9hZGRyOAorCisjZGVmaW5lIHViaF9ibGttYXAodWJoLGJlZ2luLGJpdCkgXAorCSgoKnViaF9nZXRfYWRkcih1YmgsIChiZWdpbikgKyAoKGJpdCkgPj4gMykpID4+ICgoYml0KSAmIDcpKSAmICgweGZmID4+IChVRlNfTUFYRlJBRyAtIHVzcGktPnNfZnBiKSkpCisKKworLyoKKyAqIE1hY3JvcyBmb3IgYWNjZXNzIHRvIHN1cGVyYmxvY2sgYXJyYXkgc3RydWN0dXJlcworICovCisjZGVmaW5lIHViaF9wb3N0YmwodWJoLGN5bG5vLGkpIFwKKwkoKHVzcGktPnNfcG9zdGJsZm9ybWF0ICE9IFVGU19EWU5BTUlDUE9TVEJMRk1UKSBcCisJPyAoKihfX3MxNiopKHViaF9nZXRfYWRkcih1YmgsIFwKKwkodW5zaWduZWQpKCYoKHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgKikwKS0+ZnNfb3Bvc3RibCkgXAorCSsgKCgoY3lsbm8pICogMTYgKyAoaSkpIDw8IDEpICkgKSkgXAorCTogKCooX19zMTYqKSh1YmhfZ2V0X2FkZHIodWJoLCBcCisJdXNwaS0+c19wb3N0YmxvZmYgKyAoKChjeWxubykgKiB1c3BpLT5zX25ycG9zICsgKGkpKSA8PCAxKSApKSkpCisKKyNkZWZpbmUgdWJoX3JvdGJsKHViaCxpKSBcCisJKCh1c3BpLT5zX3Bvc3RibGZvcm1hdCAhPSBVRlNfRFlOQU1JQ1BPU1RCTEZNVCkgXAorCT8gKCooX191OCopKHViaF9nZXRfYWRkcih1YmgsIFwKKwkodW5zaWduZWQpKCYoKHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgKikwKS0+ZnNfc3BhY2UpICsgKGkpKSkpIFwKKwk6ICgqKF9fdTgqKSh1YmhfZ2V0X2FkZHIodWJoLCB1c3BpLT5zX3JvdGJsb2ZmICsgKGkpKSkpKQorCisvKgorICogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGZyYWdzIGdpdmVuIGEKKyAqIHBlcmNlbnRhZ2UgdG8gaG9sZCBpbiByZXNlcnZlLgorICovCisjZGVmaW5lIHVmc19mcmVlc3BhY2UodXNiLCBwZXJjZW50cmVzZXJ2ZWQpIFwKKwkodWZzX2Jsa3N0b2ZyYWdzKGZzMzJfdG9fY3B1KHNiLCAodXNiKS0+ZnNfY3N0b3RhbC5jc19uYmZyZWUpKSArIFwKKwlmczMyX3RvX2NwdShzYiwgKHVzYiktPmZzX2NzdG90YWwuY3NfbmZmcmVlKSAtICh1c3BpLT5zX2RzaXplICogKHBlcmNlbnRyZXNlcnZlZCkgLyAxMDApKQorCisvKgorICogTWFjcm9zIHRvIGFjY2VzcyBjeWxpbmRlciBncm91cCBhcnJheSBzdHJ1Y3R1cmVzCisgKi8KKyNkZWZpbmUgdWJoX2NnX2Jsa3RvdCh1Y3BpLGN5bG5vKSBcCisJKCooKF9fZnMzMiopdWJoX2dldF9hZGRyKFVDUElfVUJILCAodWNwaSktPmNfYnRvdG9mZiArICgoY3lsbm8pIDw8IDIpKSkpCisKKyNkZWZpbmUgdWJoX2NnX2Jsa3ModWNwaSxjeWxubyxycG9zKSBcCisJKCooKF9fZnMxNiopdWJoX2dldF9hZGRyKFVDUElfVUJILCBcCisJKHVjcGkpLT5jX2JvZmYgKyAoKChjeWxubykgKiB1c3BpLT5zX25ycG9zICsgKHJwb3MpKSA8PCAxICkpKSkKKworLyoKKyAqIEJpdG1hcCBvcGVyYXRpb25zCisgKiBUaGVzZSBmdW5jdGlvbnMgd29yayBsaWtlIGNsYXNzaWNhbCBiaXRtYXAgb3BlcmF0aW9ucy4KKyAqIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0aGUgd2hvbGUgYml0bWFwCisgKiBpbiBvbmUgY29udGlndW91cyBjaHVuayBvZiBtZW1vcnksIGJ1dCBpbiBzZXZlcmFsIGJ1ZmZlcnMuCisgKiBUaGUgcGFyYW1ldGVycyBvZiBlYWNoIGZ1bmN0aW9uIGFyZSBzdXBlcl9ibG9jaywgdWZzX2J1ZmZlcl9oZWFkIGFuZAorICogcG9zaXRpb24gb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgYml0bWFwLgorICovCisjZGVmaW5lIHViaF9zZXRiaXQodWJoLGJlZ2luLGJpdCkgXAorCSgqdWJoX2dldF9hZGRyKHViaCwgKGJlZ2luKSArICgoYml0KSA+PiAzKSkgfD0gKDEgPDwgKChiaXQpICYgNykpKQorCisjZGVmaW5lIHViaF9jbHJiaXQodWJoLGJlZ2luLGJpdCkgXAorCSgqdWJoX2dldF9hZGRyICh1YmgsIChiZWdpbikgKyAoKGJpdCkgPj4gMykpICY9IH4oMSA8PCAoKGJpdCkgJiA3KSkpCisKKyNkZWZpbmUgdWJoX2lzc2V0KHViaCxiZWdpbixiaXQpIFwKKwkoKnViaF9nZXRfYWRkciAodWJoLCAoYmVnaW4pICsgKChiaXQpID4+IDMpKSAmICgxIDw8ICgoYml0KSAmIDcpKSkKKworI2RlZmluZSB1YmhfaXNjbHIodWJoLGJlZ2luLGJpdCkgKCF1YmhfaXNzZXQodWJoLGJlZ2luLGJpdCkpCisKKyNkZWZpbmUgdWJoX2ZpbmRfZmlyc3RfemVyb19iaXQodWJoLGJlZ2luLHNpemUpIF91YmhfZmluZF9uZXh0X3plcm9fYml0Xyh1c3BpLHViaCxiZWdpbixzaXplLDApCisKKyNkZWZpbmUgdWJoX2ZpbmRfbmV4dF96ZXJvX2JpdCh1YmgsYmVnaW4sc2l6ZSxvZmZzZXQpIF91YmhfZmluZF9uZXh0X3plcm9fYml0Xyh1c3BpLHViaCxiZWdpbixzaXplLG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgX3ViaF9maW5kX25leHRfemVyb19iaXRfKAorCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaSwgc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIHViaCwKKwl1bnNpZ25lZCBiZWdpbiwgdW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgb2Zmc2V0KQoreworCXVuc2lnbmVkIGJhc2UsIGNvdW50LCBwb3M7CisKKwlzaXplIC09IG9mZnNldDsKKwliZWdpbiA8PD0gMzsKKwlvZmZzZXQgKz0gYmVnaW47CisJYmFzZSA9IG9mZnNldCA+PiB1c3BpLT5zX2JwZnNoaWZ0OworCW9mZnNldCAmPSB1c3BpLT5zX2JwZm1hc2s7CisJZm9yICg7OykgeworCQljb3VudCA9IG1pbl90KHVuc2lnbmVkIGludCwgc2l6ZSArIG9mZnNldCwgdXNwaS0+c19icGYpOworCQlzaXplIC09IGNvdW50IC0gb2Zmc2V0OworCQlwb3MgPSBleHQyX2ZpbmRfbmV4dF96ZXJvX2JpdCAodWJoLT5iaFtiYXNlXS0+Yl9kYXRhLCBjb3VudCwgb2Zmc2V0KTsKKwkJaWYgKHBvcyA8IGNvdW50IHx8ICFzaXplKQorCQkJYnJlYWs7CisJCWJhc2UrKzsKKwkJb2Zmc2V0ID0gMDsKKwl9CisJcmV0dXJuIChiYXNlIDw8IHVzcGktPnNfYnBmc2hpZnQpICsgcG9zIC0gYmVnaW47Cit9IAkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBmaW5kX2xhc3RfemVyb19iaXQgKHVuc2lnbmVkIGNoYXIgKiBiaXRtYXAsCisJdW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgb2Zmc2V0KQoreworCXVuc2lnbmVkIGJpdCwgaTsKKwl1bnNpZ25lZCBjaGFyICogbWFwcDsKKwl1bnNpZ25lZCBjaGFyIG1hcDsKKworCW1hcHAgPSBiaXRtYXAgKyAoc2l6ZSA+PiAzKTsKKwltYXAgPSAqbWFwcC0tOworCWJpdCA9IDEgPDwgKHNpemUgJiA3KTsKKwlmb3IgKGkgPSBzaXplOyBpID4gb2Zmc2V0OyBpLS0pIHsKKwkJaWYgKChtYXAgJiBiaXQpID09IDApCisJCQlicmVhazsKKwkJaWYgKChpICYgNykgIT0gMCkgeworCQkJYml0ID4+PSAxOworCQl9IGVsc2UgeworCQkJbWFwID0gKm1hcHAtLTsKKwkJCWJpdCA9IDEgPDwgNzsKKwkJfQorCX0KKwlyZXR1cm4gaTsKK30KKworI2RlZmluZSB1YmhfZmluZF9sYXN0X3plcm9fYml0KHViaCxiZWdpbixzaXplLG9mZnNldCkgX3ViaF9maW5kX2xhc3RfemVyb19iaXRfKHVzcGksdWJoLGJlZ2luLHNpemUsb2Zmc2V0KQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBfdWJoX2ZpbmRfbGFzdF96ZXJvX2JpdF8oCisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpLCBzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdWJoLAorCXVuc2lnbmVkIGJlZ2luLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5kKQoreworCXVuc2lnbmVkIGJhc2UsIGNvdW50LCBwb3MsIHNpemU7CisKKwlzaXplID0gc3RhcnQgLSBlbmQ7CisJYmVnaW4gPDw9IDM7CisJc3RhcnQgKz0gYmVnaW47CisJYmFzZSA9IHN0YXJ0ID4+IHVzcGktPnNfYnBmc2hpZnQ7CisJc3RhcnQgJj0gdXNwaS0+c19icGZtYXNrOworCWZvciAoOzspIHsKKwkJY291bnQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkgICAgc2l6ZSArICh1c3BpLT5zX2JwZiAtIHN0YXJ0KSwgdXNwaS0+c19icGYpCisJCQktICh1c3BpLT5zX2JwZiAtIHN0YXJ0KTsKKwkJc2l6ZSAtPSBjb3VudDsKKwkJcG9zID0gZmluZF9sYXN0X3plcm9fYml0ICh1YmgtPmJoW2Jhc2VdLT5iX2RhdGEsCisJCQlzdGFydCwgc3RhcnQgLSBjb3VudCk7CisJCWlmIChwb3MgPiBzdGFydCAtIGNvdW50IHx8ICFzaXplKQorCQkJYnJlYWs7CisJCWJhc2UtLTsKKwkJc3RhcnQgPSB1c3BpLT5zX2JwZjsKKwl9CisJcmV0dXJuIChiYXNlIDw8IHVzcGktPnNfYnBmc2hpZnQpICsgcG9zIC0gYmVnaW47Cit9IAkKKworI2RlZmluZSB1YmhfaXNibG9ja2NsZWFyKHViaCxiZWdpbixibG9jaykgKCFfdWJoX2lzYmxvY2tzZXRfKHVzcGksdWJoLGJlZ2luLGJsb2NrKSkKKworI2RlZmluZSB1YmhfaXNibG9ja3NldCh1YmgsYmVnaW4sYmxvY2spIF91YmhfaXNibG9ja3NldF8odXNwaSx1YmgsYmVnaW4sYmxvY2spCitzdGF0aWMgaW5saW5lIGludCBfdWJoX2lzYmxvY2tzZXRfKHN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaSwKKwlzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdWJoLCB1bnNpZ25lZCBiZWdpbiwgdW5zaWduZWQgYmxvY2spCit7CisJc3dpdGNoICh1c3BpLT5zX2ZwYikgeworCWNhc2UgODoKKwkgICAgCXJldHVybiAoKnViaF9nZXRfYWRkciAodWJoLCBiZWdpbiArIGJsb2NrKSA9PSAweGZmKTsKKwljYXNlIDQ6CisJCXJldHVybiAoKnViaF9nZXRfYWRkciAodWJoLCBiZWdpbiArIChibG9jayA+PiAxKSkgPT0gKDB4MGYgPDwgKChibG9jayAmIDB4MDEpIDw8IDIpKSk7CisJY2FzZSAyOgorCQlyZXR1cm4gKCp1YmhfZ2V0X2FkZHIgKHViaCwgYmVnaW4gKyAoYmxvY2sgPj4gMikpID09ICgweDAzIDw8ICgoYmxvY2sgJiAweDAzKSA8PCAxKSkpOworCWNhc2UgMToKKwkJcmV0dXJuICgqdWJoX2dldF9hZGRyICh1YmgsIGJlZ2luICsgKGJsb2NrID4+IDMpKSA9PSAoMHgwMSA8PCAoYmxvY2sgJiAweDA3KSkpOworCX0KKwlyZXR1cm4gMDsJCit9CisKKyNkZWZpbmUgdWJoX2NscmJsb2NrKHViaCxiZWdpbixibG9jaykgX3ViaF9jbHJibG9ja18odXNwaSx1YmgsYmVnaW4sYmxvY2spCitzdGF0aWMgaW5saW5lIHZvaWQgX3ViaF9jbHJibG9ja18oc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpLAorCXN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1YmgsIHVuc2lnbmVkIGJlZ2luLCB1bnNpZ25lZCBibG9jaykKK3sKKwlzd2l0Y2ggKHVzcGktPnNfZnBiKSB7CisJY2FzZSA4OgorCSAgICAJKnViaF9nZXRfYWRkciAodWJoLCBiZWdpbiArIGJsb2NrKSA9IDB4MDA7CisJICAgIAlyZXR1cm47IAorCWNhc2UgNDoKKwkJKnViaF9nZXRfYWRkciAodWJoLCBiZWdpbiArIChibG9jayA+PiAxKSkgJj0gfigweDBmIDw8ICgoYmxvY2sgJiAweDAxKSA8PCAyKSk7CisJCXJldHVybjsKKwljYXNlIDI6CisJCSp1YmhfZ2V0X2FkZHIgKHViaCwgYmVnaW4gKyAoYmxvY2sgPj4gMikpICY9IH4oMHgwMyA8PCAoKGJsb2NrICYgMHgwMykgPDwgMSkpOworCQlyZXR1cm47CisJY2FzZSAxOgorCQkqdWJoX2dldF9hZGRyICh1YmgsIGJlZ2luICsgKGJsb2NrID4+IDMpKSAmPSB+KDB4MDEgPDwgKChibG9jayAmIDB4MDcpKSk7CisJCXJldHVybjsKKwl9Cit9CisKKyNkZWZpbmUgdWJoX3NldGJsb2NrKHViaCxiZWdpbixibG9jaykgX3ViaF9zZXRibG9ja18odXNwaSx1YmgsYmVnaW4sYmxvY2spCitzdGF0aWMgaW5saW5lIHZvaWQgX3ViaF9zZXRibG9ja18oc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpLAorCXN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1YmgsIHVuc2lnbmVkIGJlZ2luLCB1bnNpZ25lZCBibG9jaykKK3sKKwlzd2l0Y2ggKHVzcGktPnNfZnBiKSB7CisJY2FzZSA4OgorCSAgICAJKnViaF9nZXRfYWRkcih1YmgsIGJlZ2luICsgYmxvY2spID0gMHhmZjsKKwkgICAgCXJldHVybjsKKwljYXNlIDQ6CisJCSp1YmhfZ2V0X2FkZHIodWJoLCBiZWdpbiArIChibG9jayA+PiAxKSkgfD0gKDB4MGYgPDwgKChibG9jayAmIDB4MDEpIDw8IDIpKTsKKwkJcmV0dXJuOworCWNhc2UgMjoKKwkJKnViaF9nZXRfYWRkcih1YmgsIGJlZ2luICsgKGJsb2NrID4+IDIpKSB8PSAoMHgwMyA8PCAoKGJsb2NrICYgMHgwMykgPDwgMSkpOworCQlyZXR1cm47CisJY2FzZSAxOgorCQkqdWJoX2dldF9hZGRyKHViaCwgYmVnaW4gKyAoYmxvY2sgPj4gMykpIHw9ICgweDAxIDw8ICgoYmxvY2sgJiAweDA3KSkpOworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWZzX2ZyYWdhY2N0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgdW5zaWduZWQgYmxvY2ttYXAsCisJX19mczMyICogZnJhZ2xpc3QsIGludCBjbnQpCit7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXVuc2lnbmVkIGZyYWdzaXplLCBwb3M7CisJCisJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKwkKKwlmcmFnc2l6ZSA9IDA7CisJZm9yIChwb3MgPSAwOyBwb3MgPCB1c3BpLT5zX2ZwYjsgcG9zKyspIHsKKwkJaWYgKGJsb2NrbWFwICYgKDEgPDwgcG9zKSkgeworCQkJZnJhZ3NpemUrKzsKKwkJfQorCQllbHNlIGlmIChmcmFnc2l6ZSA+IDApIHsKKwkJCWZzMzJfYWRkKHNiLCAmZnJhZ2xpc3RbZnJhZ3NpemVdLCBjbnQpOworCQkJZnJhZ3NpemUgPSAwOworCQl9CisJfQorCWlmIChmcmFnc2l6ZSA+IDAgJiYgZnJhZ3NpemUgPCB1c3BpLT5zX2ZwYikKKwkJZnMzMl9hZGQoc2IsICZmcmFnbGlzdFtmcmFnc2l6ZV0sIGNudCk7Cit9CisKKyNkZWZpbmUgdWJoX3NjYW5jKHViaCxiZWdpbixzaXplLHRhYmxlLG1hc2spIF91Ymhfc2NhbmNfKHVzcGksdWJoLGJlZ2luLHNpemUsdGFibGUsbWFzaykKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgX3ViaF9zY2FuY18oc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpLCBzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdWJoLCAKKwl1bnNpZ25lZCBiZWdpbiwgdW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgY2hhciAqIHRhYmxlLCB1bnNpZ25lZCBjaGFyIG1hc2spCit7CisJdW5zaWduZWQgcmVzdCwgb2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgKiBjcDsKKwkKKworCW9mZnNldCA9IGJlZ2luICYgfnVzcGktPnNfZm1hc2s7CisJYmVnaW4gPj49IHVzcGktPnNfZnNoaWZ0OworCWZvciAoOzspIHsKKwkJaWYgKChvZmZzZXQgKyBzaXplKSA8IHVzcGktPnNfZnNpemUpCisJCQlyZXN0ID0gc2l6ZTsKKwkJZWxzZQorCQkJcmVzdCA9IHVzcGktPnNfZnNpemUgLSBvZmZzZXQ7CisJCXNpemUgLT0gcmVzdDsKKwkJY3AgPSB1YmgtPmJoW2JlZ2luXS0+Yl9kYXRhICsgb2Zmc2V0OworCQl3aGlsZSAoKHRhYmxlWypjcCsrXSAmIG1hc2spID09IDAgJiYgLS1yZXN0KTsKKwkJaWYgKHJlc3QgfHwgIXNpemUpCisJCQlicmVhazsKKwkJYmVnaW4rKzsKKwkJb2Zmc2V0ID0gMDsKKwl9CisJcmV0dXJuIChzaXplICsgcmVzdCk7Cit9CmRpZmYgLS1naXQgYS9mcy91bXNkb3Mvbm90ZXMgYi9mcy91bXNkb3Mvbm90ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M0N2QxZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Vtc2Rvcy9ub3RlcwpAQCAtMCwwICsxLDE3IEBACitUaGlzIGZpbGUgY29udGFpbiBpZGVhIGFuZCB0aGluZ3MgSSBkb24ndCB3YW50IHRvIGZvcmdldAorCitQb3NzaWJsZSBidWcgaW4gZnMvcmVhZF93cml0ZS5jCitGdW5jdGlvbiBzeXNfcmVhZGRpcigpCisKKwlUaGVyZSBpcyBhIGNhbGwgdGhlIHZlcmlmeV9hcmVhIHRoYXQgZG9lcyBub3QgdGFrZSBpbiBhY2NvdW50CisJdGhlIGNvdW50IHBhcmFtZXRlci4gSSBndWVzcyBpdCBzaG91bGQgcmVhZAorCisJZXJyb3IgPSB2ZXJpZnlfYXJlYShWRVJJRllfV1JJVEUsIGRpcmVudCwgY291bnQqc2l6ZW9mICgqZGlyZW50KSk7CisKKwlpbnN0ZWFkIG9mCisKKwllcnJvciA9IHZlcmlmeV9hcmVhKFZFUklGWV9XUklURSwgZGlyZW50LCBzaXplb2YgKCpkaXJlbnQpKTsKKworCU9mIGNvdXJzZSwgbm93ICwgY291bnQgaXMgYWx3YXlzIDEKKworCmRpZmYgLS1naXQgYS9mcy92ZmF0L01ha2VmaWxlIGIvZnMvdmZhdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGYyNzk4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvdmZhdC9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCB2ZmF0LWZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19WRkFUX0ZTKSArPSB2ZmF0Lm8KKwordmZhdC15IDo9IG5hbWVpLm8KZGlmZiAtLWdpdCBhL2ZzL3ZmYXQvbmFtZWkuYyBiL2ZzL3ZmYXQvbmFtZWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzZmNmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvdmZhdC9uYW1laS5jCkBAIC0wLDAgKzEsMTA4MiBAQAorLyoKKyAqICBsaW51eC9mcy92ZmF0L25hbWVpLmMKKyAqCisgKiAgV3JpdHRlbiAxOTkyLDE5OTMgYnkgV2VybmVyIEFsbWVzYmVyZ2VyCisgKgorICogIFdpbmRvd3M5NS9XaW5kb3dzIE5UIGNvbXBhdGlibGUgZXh0ZW5kZWQgTVNET1MgZmlsZXN5c3RlbQorICogICAgYnkgR29yZG9uIENoYWZmZWUgQ29weXJpZ2h0IChDKSAxOTk1LiAgU2VuZCBidWcgcmVwb3J0cyBmb3IgdGhlCisgKiAgICBWRkFUIGZpbGVzeXN0ZW0gdG8gPGNoYWZmZWVAY3MuYmVya2VsZXkuZWR1Pi4gIFNwZWNpZnkKKyAqICAgIHdoYXQgZmlsZSBvcGVyYXRpb24gY2F1c2VkIHlvdSB0cm91YmxlIGFuZCBpZiB5b3UgY2FuIGR1cGxpY2F0ZQorICogICAgdGhlIHByb2JsZW0sIHNlbmQgYSBzY3JpcHQgdGhhdCBkZW1vbnN0cmF0ZXMgaXQuCisgKgorICogIFNob3J0IG5hbWUgdHJhbnNsYXRpb24gMTk5OSwgMjAwMSBieSBXb2xmcmFtIFBpZW5rb3NzIDx3cEBic3poLmRlPgorICoKKyAqICBTdXBwb3J0IE11bHRpYnl0ZSBjaGFyYWN0ZXJzIGFuZCBjbGVhbnVwIGJ5CisgKgkJCQlPR0FXQSBIaXJvZnVtaSA8aGlyb2Z1bWlAbWFpbC5wYXJrbmV0LmNvLmpwPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tc2Rvc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorCitzdGF0aWMgaW50IHZmYXRfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWludCByZXQgPSAxOworCisJaWYgKCFkZW50cnktPmRfaW5vZGUgJiYKKwkgICAgbmQgJiYgIShuZC0+ZmxhZ3MgJiBMT09LVVBfQ09OVElOVUUpICYmIChuZC0+ZmxhZ3MgJiBMT09LVVBfQ1JFQVRFKSkKKwkJLyoKKwkJICogbmVnYXRpdmUgZGVudHJ5IGlzIGRyb3BwZWQsIGluIG9yZGVyIHRvIG1ha2Ugc3VyZQorCQkgKiB0byB1c2UgdGhlIG5hbWUgd2hpY2ggYSB1c2VyIGRlc2lyZXMgaWYgdGhpcyBpcworCQkgKiBjcmVhdGUgcGF0aC4KKwkJICovCisJCXJldCA9IDA7CisJZWxzZSB7CisJCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCQlpZiAoZGVudHJ5LT5kX3RpbWUgIT0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZS0+aV92ZXJzaW9uKQorCQkJcmV0ID0gMDsKKwkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogcmV0dXJucyB0aGUgbGVuZ3RoIG9mIGEgc3RydWN0IHFzdHIsIGlnbm9yaW5nIHRyYWlsaW5nIGRvdHMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmZhdF9zdHJpcHRhaWxfbGVuKHN0cnVjdCBxc3RyICpxc3RyKQoreworCXVuc2lnbmVkIGludCBsZW4gPSBxc3RyLT5sZW47CisKKwl3aGlsZSAobGVuICYmIHFzdHItPm5hbWVbbGVuIC0gMV0gPT0gJy4nKQorCQlsZW4tLTsKKwlyZXR1cm4gbGVuOworfQorCisvKgorICogQ29tcHV0ZSB0aGUgaGFzaCBmb3IgdGhlIHZmYXQgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZW50cnkuCisgKiBOb3RlOiBpZiB0aGUgbmFtZSBpcyBpbnZhbGlkLCB3ZSBsZWF2ZSB0aGUgaGFzaCBjb2RlIHVuY2hhbmdlZCBzbworICogdGhhdCB0aGUgZXhpc3RpbmcgZGVudHJ5IGNhbiBiZSB1c2VkLiBUaGUgdmZhdCBmcyByb3V0aW5lcyB3aWxsCisgKiByZXR1cm4gRU5PRU5UIG9yIEVJTlZBTCBhcyBhcHByb3ByaWF0ZS4KKyAqLworc3RhdGljIGludCB2ZmF0X2hhc2goc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0cikKK3sKKwlxc3RyLT5oYXNoID0gZnVsbF9uYW1lX2hhc2gocXN0ci0+bmFtZSwgdmZhdF9zdHJpcHRhaWxfbGVuKHFzdHIpKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvbXB1dGUgdGhlIGhhc2ggZm9yIHRoZSB2ZmF0IG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgZGVudHJ5LgorICogTm90ZTogaWYgdGhlIG5hbWUgaXMgaW52YWxpZCwgd2UgbGVhdmUgdGhlIGhhc2ggY29kZSB1bmNoYW5nZWQgc28KKyAqIHRoYXQgdGhlIGV4aXN0aW5nIGRlbnRyeSBjYW4gYmUgdXNlZC4gVGhlIHZmYXQgZnMgcm91dGluZXMgd2lsbAorICogcmV0dXJuIEVOT0VOVCBvciBFSU5WQUwgYXMgYXBwcm9wcmlhdGUuCisgKi8KK3N0YXRpYyBpbnQgdmZhdF9oYXNoaShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxc3RyKQoreworCXN0cnVjdCBubHNfdGFibGUgKnQgPSBNU0RPU19TQihkZW50cnktPmRfaW5vZGUtPmlfc2IpLT5ubHNfaW87CisJY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXVuc2lnbmVkIGxvbmcgaGFzaDsKKworCW5hbWUgPSBxc3RyLT5uYW1lOworCWxlbiA9IHZmYXRfc3RyaXB0YWlsX2xlbihxc3RyKTsKKworCWhhc2ggPSBpbml0X25hbWVfaGFzaCgpOworCXdoaWxlIChsZW4tLSkKKwkJaGFzaCA9IHBhcnRpYWxfbmFtZV9oYXNoKG5sc190b2xvd2VyKHQsICpuYW1lKyspLCBoYXNoKTsKKwlxc3RyLT5oYXNoID0gZW5kX25hbWVfaGFzaChoYXNoKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJlIG9mIHR3byB2ZmF0IG5hbWVzLgorICovCitzdGF0aWMgaW50IHZmYXRfY21waShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICphLCBzdHJ1Y3QgcXN0ciAqYikKK3sKKwlzdHJ1Y3QgbmxzX3RhYmxlICp0ID0gTVNET1NfU0IoZGVudHJ5LT5kX2lub2RlLT5pX3NiKS0+bmxzX2lvOworCXVuc2lnbmVkIGludCBhbGVuLCBibGVuOworCisJLyogQSBmaWxlbmFtZSBjYW5ub3QgZW5kIGluICcuJyBvciB3ZSB0cmVhdCBpdCBsaWtlIGl0IGhhcyBub25lICovCisJYWxlbiA9IHZmYXRfc3RyaXB0YWlsX2xlbihhKTsKKwlibGVuID0gdmZhdF9zdHJpcHRhaWxfbGVuKGIpOworCWlmIChhbGVuID09IGJsZW4pIHsKKwkJaWYgKG5sc19zdHJuaWNtcCh0LCBhLT5uYW1lLCBiLT5uYW1lLCBhbGVuKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisvKgorICogQ2FzZSBzZW5zaXRpdmUgY29tcGFyZSBvZiB0d28gdmZhdCBuYW1lcy4KKyAqLworc3RhdGljIGludCB2ZmF0X2NtcChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICphLCBzdHJ1Y3QgcXN0ciAqYikKK3sKKwl1bnNpZ25lZCBpbnQgYWxlbiwgYmxlbjsKKworCS8qIEEgZmlsZW5hbWUgY2Fubm90IGVuZCBpbiAnLicgb3Igd2UgdHJlYXQgaXQgbGlrZSBpdCBoYXMgbm9uZSAqLworCWFsZW4gPSB2ZmF0X3N0cmlwdGFpbF9sZW4oYSk7CisJYmxlbiA9IHZmYXRfc3RyaXB0YWlsX2xlbihiKTsKKwlpZiAoYWxlbiA9PSBibGVuKSB7CisJCWlmIChzdHJuY21wKGEtPm5hbWUsIGItPm5hbWUsIGFsZW4pID09IDApCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgdmZhdF9kZW50cnlfb3BzWzRdID0geworCXsKKwkJLmRfaGFzaAkJPSB2ZmF0X2hhc2hpLAorCQkuZF9jb21wYXJlCT0gdmZhdF9jbXBpLAorCX0sCisJeworCQkuZF9yZXZhbGlkYXRlCT0gdmZhdF9yZXZhbGlkYXRlLAorCQkuZF9oYXNoCQk9IHZmYXRfaGFzaGksCisJCS5kX2NvbXBhcmUJPSB2ZmF0X2NtcGksCisJfSwKKwl7CisJCS5kX2hhc2gJCT0gdmZhdF9oYXNoLAorCQkuZF9jb21wYXJlCT0gdmZhdF9jbXAsCisJfSwKKwl7CisJCS5kX3JldmFsaWRhdGUJPSB2ZmF0X3JldmFsaWRhdGUsCisJCS5kX2hhc2gJCT0gdmZhdF9oYXNoLAorCQkuZF9jb21wYXJlCT0gdmZhdF9jbXAsCisJfQorfTsKKworLyogQ2hhcmFjdGVycyB0aGF0IGFyZSB1bmRlc2lyYWJsZSBpbiBhbiBNUy1ET1MgZmlsZSBuYW1lICovCisKK3N0YXRpYyBpbmxpbmUgd2NoYXJfdCB2ZmF0X2JhZF9jaGFyKHdjaGFyX3QgdykKK3sKKwlyZXR1cm4gKHcgPCAweDAwMjApCisJICAgIHx8ICh3ID09ICcqJykgfHwgKHcgPT0gJz8nKSB8fCAodyA9PSAnPCcpIHx8ICh3ID09ICc+JykKKwkgICAgfHwgKHcgPT0gJ3wnKSB8fCAodyA9PSAnIicpIHx8ICh3ID09ICc6JykgfHwgKHcgPT0gJy8nKQorCSAgICB8fCAodyA9PSAnXFwnKTsKK30KKworc3RhdGljIGlubGluZSB3Y2hhcl90IHZmYXRfcmVwbGFjZV9jaGFyKHdjaGFyX3QgdykKK3sKKwlyZXR1cm4gKHcgPT0gJ1snKSB8fCAodyA9PSAnXScpIHx8ICh3ID09ICc7JykgfHwgKHcgPT0gJywnKQorCSAgICB8fCAodyA9PSAnKycpIHx8ICh3ID09ICc9Jyk7Cit9CisKK3N0YXRpYyB3Y2hhcl90IHZmYXRfc2tpcF9jaGFyKHdjaGFyX3QgdykKK3sKKwlyZXR1cm4gKHcgPT0gJy4nKSB8fCAodyA9PSAnICcpOworfQorCitzdGF0aWMgaW5saW5lIGludCB2ZmF0X2lzX3VzZWRfYmFkY2hhcnMoY29uc3Qgd2NoYXJfdCAqcywgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJaWYgKHZmYXRfYmFkX2NoYXIoc1tpXSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZmF0X3ZhbGlkX2xvbmduYW1lKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBsZW4pCit7CisJaWYgKG5hbWVbbGVuIC0gMV0gPT0gJyAnKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobGVuID49IDI1NikKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwkvKiBNUy1ET1MgImRldmljZSBzcGVjaWFsIGZpbGVzIiAqLworCWlmIChsZW4gPT0gMyB8fCAobGVuID4gMyAmJiBuYW1lWzNdID09ICcuJykpIHsJLyogYmFzZW5hbWUgPT0gMyAqLworCQlpZiAoIXN0cm5pY21wKG5hbWUsICJhdXgiLCAzKSB8fAorCQkgICAgIXN0cm5pY21wKG5hbWUsICJjb24iLCAzKSB8fAorCQkgICAgIXN0cm5pY21wKG5hbWUsICJudWwiLCAzKSB8fAorCQkgICAgIXN0cm5pY21wKG5hbWUsICJwcm4iLCAzKSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobGVuID09IDQgfHwgKGxlbiA+IDQgJiYgbmFtZVs0XSA9PSAnLicpKSB7CS8qIGJhc2VuYW1lID09IDQgKi8KKwkJLyogImNvbTEiLCAiY29tMiIsIC4uLiAqLworCQlpZiAoJzEnIDw9IG5hbWVbM10gJiYgbmFtZVszXSA8PSAnOScpIHsKKwkJCWlmICghc3RybmljbXAobmFtZSwgImNvbSIsIDMpIHx8CisJCQkgICAgIXN0cm5pY21wKG5hbWUsICJscHQiLCAzKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZmYXRfZmluZF9mb3JtKHN0cnVjdCBpbm9kZSAqZGlyLCB1bnNpZ25lZCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBmYXRfc2xvdF9pbmZvIHNpbmZvOworCWludCBlcnIgPSBmYXRfc2NhbihkaXIsIG5hbWUsICZzaW5mbyk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FTk9FTlQ7CisJYnJlbHNlKHNpbmZvLmJoKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIDEpIFZhbGlkIGNoYXJhY3RlcnMgZm9yIHRoZSA4LjMgZm9ybWF0IGFsaWFzIGFyZSBhbnkgY29tYmluYXRpb24gb2YKKyAqIGxldHRlcnMsIHVwcGVyY2FzZSBhbHBoYWJldHMsIGRpZ2l0cywgYW55IG9mIHRoZQorICogZm9sbG93aW5nIHNwZWNpYWwgY2hhcmFjdGVyczoKKyAqICAgICAkICUgJyBgIC0gQCB7IH0gfiAhICMgKCApICYgXyBeCisgKiBJbiB0aGlzIGNhc2UgTG9uZ2ZpbGVuYW1lIGlzIG5vdCBzdG9yZWQgaW4gZGlzay4KKyAqCisgKiBXaW5OVCdzIEV4dGVuc2lvbjoKKyAqIEZpbGUgbmFtZSBhbmQgZXh0ZW5zaW9uIG5hbWUgaXMgY29udGFpbiB1cHBlcmNhc2UvbG93ZXJjYXNlCisgKiBvbmx5LiBBbmQgaXQgaXMgZXhwcmVzc2VkIGJ5IENBU0VfTE9XRVJfQkFTRSBhbmQgQ0FTRV9MT1dFUl9FWFQuCisgKgorICogMikgRmlsZSBuYW1lIGlzIDguMyBmb3JtYXQsIGJ1dCBpdCBjb250YWluIHRoZSB1cHBlcmNhc2UgYW5kCisgKiBsb3dlcmNhc2UgY2hhciwgbXVsaXRpIGJ5dGVzIGNoYXIsIGV0Yy4gSW4gdGhpcyBjYXNlIG51bXRhaWwgaXMgbm90CisgKiBhZGRlZCwgYnV0IExvbmdmaWxlbmFtZSBpcyBzdG9yZWQuCisgKgorICogMykgV2hlbiB0aGUgb25lIGV4Y2VwdCBmb3IgdGhlIGFib3ZlLCBvciB0aGUgZm9sbG93aW5nIHNwZWNpYWwKKyAqIGNoYXJhY3RlciBhcmUgY29udGFpbmVkOgorICogICAgICAgIC4gICBbIF0gOyAsICsgPQorICogbnVtdGFpbCBpcyBhZGRlZCwgYW5kIExvbmdmaWxlbmFtZSBtdXN0IGJlIHN0b3JlZCBpbiBkaXNrIC4KKyAqLworc3RydWN0IHNob3J0bmFtZV9pbmZvIHsKKwl1bnNpZ25lZCBjaGFyIGxvd2VyOjEsCisJCSAgICAgIHVwcGVyOjEsCisJCSAgICAgIHZhbGlkOjE7Cit9OworI2RlZmluZSBJTklUX1NIT1JUTkFNRV9JTkZPKHgpCWRvIHsJCVwKKwkoeCktPmxvd2VyID0gMTsJCQkJXAorCSh4KS0+dXBwZXIgPSAxOwkJCQlcCisJKHgpLT52YWxpZCA9IDE7CQkJCVwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IHRvX3Nob3J0bmFtZV9jaGFyKHN0cnVjdCBubHNfdGFibGUgKm5scywKKwkJCQkgICAgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsCisJCQkJICAgIHdjaGFyX3QgKnNyYywgc3RydWN0IHNob3J0bmFtZV9pbmZvICppbmZvKQoreworCWludCBsZW47CisKKwlpZiAodmZhdF9za2lwX2NoYXIoKnNyYykpIHsKKwkJaW5mby0+dmFsaWQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHZmYXRfcmVwbGFjZV9jaGFyKCpzcmMpKSB7CisJCWluZm8tPnZhbGlkID0gMDsKKwkJYnVmWzBdID0gJ18nOworCQlyZXR1cm4gMTsKKwl9CisKKwlsZW4gPSBubHMtPnVuaTJjaGFyKCpzcmMsIGJ1ZiwgYnVmX3NpemUpOworCWlmIChsZW4gPD0gMCkgeworCQlpbmZvLT52YWxpZCA9IDA7CisJCWJ1ZlswXSA9ICdfJzsKKwkJbGVuID0gMTsKKwl9IGVsc2UgaWYgKGxlbiA9PSAxKSB7CisJCXVuc2lnbmVkIGNoYXIgcHJldiA9IGJ1ZlswXTsKKworCQlpZiAoYnVmWzBdID49IDB4N0YpIHsKKwkJCWluZm8tPmxvd2VyID0gMDsKKwkJCWluZm8tPnVwcGVyID0gMDsKKwkJfQorCisJCWJ1ZlswXSA9IG5sc190b3VwcGVyKG5scywgYnVmWzBdKTsKKwkJaWYgKGlzYWxwaGEoYnVmWzBdKSkgeworCQkJaWYgKGJ1ZlswXSA9PSBwcmV2KQorCQkJCWluZm8tPmxvd2VyID0gMDsKKwkJCWVsc2UKKwkJCQlpbmZvLT51cHBlciA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlpbmZvLT5sb3dlciA9IDA7CisJCWluZm8tPnVwcGVyID0gMDsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCisvKgorICogR2l2ZW4gYSB2YWxpZCBsb25nbmFtZSwgY3JlYXRlIGEgdW5pcXVlIHNob3J0bmFtZS4gIE1ha2Ugc3VyZSB0aGUKKyAqIHNob3J0bmFtZSBkb2VzIG5vdCBleGlzdAorICogUmV0dXJucyBuZWdhdGl2ZSBudW1iZXIgb24gZXJyb3IsIDAgZm9yIGEgbm9ybWFsCisgKiByZXR1cm4sIGFuZCAxIGZvciB2YWxpZCBzaG9ydG5hbWUKKyAqLworc3RhdGljIGludCB2ZmF0X2NyZWF0ZV9zaG9ydG5hbWUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBubHNfdGFibGUgKm5scywKKwkJCQkgd2NoYXJfdCAqdW5hbWUsIGludCB1bGVuLAorCQkJCSB1bnNpZ25lZCBjaGFyICpuYW1lX3JlcywgdW5zaWduZWQgY2hhciAqbGNhc2UpCit7CisJc3RydWN0IGZhdF9tb3VudF9vcHRpb25zICpvcHRzID0gJk1TRE9TX1NCKGRpci0+aV9zYiktPm9wdGlvbnM7CisJd2NoYXJfdCAqaXAsICpleHRfc3RhcnQsICplbmQsICpuYW1lX3N0YXJ0OworCXVuc2lnbmVkIGNoYXIgYmFzZVs5XSwgZXh0WzRdLCBidWZbOF0sICpwOworCXVuc2lnbmVkIGNoYXIgY2hhcmJ1ZltOTFNfTUFYX0NIQVJTRVRfU0laRV07CisJaW50IGNobCwgY2hpOworCWludCBzeiA9IDAsIGV4dGxlbiwgYmFzZWxlbiwgaSwgbnVtdGFpbF9iYXNlbGVuLCBudW10YWlsMl9iYXNlbGVuOworCWludCBpc19zaG9ydG5hbWU7CisJc3RydWN0IHNob3J0bmFtZV9pbmZvIGJhc2VfaW5mbywgZXh0X2luZm87CisKKwlpc19zaG9ydG5hbWUgPSAxOworCUlOSVRfU0hPUlROQU1FX0lORk8oJmJhc2VfaW5mbyk7CisJSU5JVF9TSE9SVE5BTUVfSU5GTygmZXh0X2luZm8pOworCisJLyogTm93LCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHNob3J0bmFtZSBmcm9tIHRoZSBsb25nIG5hbWUgKi8KKwlleHRfc3RhcnQgPSBlbmQgPSAmdW5hbWVbdWxlbl07CisJd2hpbGUgKC0tZXh0X3N0YXJ0ID49IHVuYW1lKSB7CisJCWlmICgqZXh0X3N0YXJ0ID09IDB4MDAyRSkgewkvKiBpcyBgLicgKi8KKwkJCWlmIChleHRfc3RhcnQgPT0gZW5kIC0gMSkgeworCQkJCXN6ID0gdWxlbjsKKwkJCQlleHRfc3RhcnQgPSBOVUxMOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZXh0X3N0YXJ0ID09IHVuYW1lIC0gMSkgeworCQlzeiA9IHVsZW47CisJCWV4dF9zdGFydCA9IE5VTEw7CisJfSBlbHNlIGlmIChleHRfc3RhcnQpIHsKKwkJLyoKKwkJICogTmFtZXMgd2hpY2ggc3RhcnQgd2l0aCBhIGRvdCBjb3VsZCBiZSBqdXN0CisJCSAqIGFuIGV4dGVuc2lvbiBlZy4gIi4uLnRlc3QiLiAgSW4gdGhpcyBjYXNlIFdpbjk1CisJCSAqIHVzZXMgdGhlIGV4dGVuc2lvbiBhcyB0aGUgbmFtZSBhbmQgc2V0cyBubyBleHRlbnNpb24uCisJCSAqLworCQluYW1lX3N0YXJ0ID0gJnVuYW1lWzBdOworCQl3aGlsZSAobmFtZV9zdGFydCA8IGV4dF9zdGFydCkgeworCQkJaWYgKCF2ZmF0X3NraXBfY2hhcigqbmFtZV9zdGFydCkpCisJCQkJYnJlYWs7CisJCQluYW1lX3N0YXJ0Kys7CisJCX0KKwkJaWYgKG5hbWVfc3RhcnQgIT0gZXh0X3N0YXJ0KSB7CisJCQlzeiA9IGV4dF9zdGFydCAtIHVuYW1lOworCQkJZXh0X3N0YXJ0Kys7CisJCX0gZWxzZSB7CisJCQlzeiA9IHVsZW47CisJCQlleHRfc3RhcnQgPSBOVUxMOworCQl9CisJfQorCisJbnVtdGFpbF9iYXNlbGVuID0gNjsKKwludW10YWlsMl9iYXNlbGVuID0gMjsKKwlmb3IgKGJhc2VsZW4gPSBpID0gMCwgcCA9IGJhc2UsIGlwID0gdW5hbWU7IGkgPCBzejsgaSsrLCBpcCsrKSB7CisJCWNobCA9IHRvX3Nob3J0bmFtZV9jaGFyKG5scywgY2hhcmJ1Ziwgc2l6ZW9mKGNoYXJidWYpLAorCQkJCQlpcCwgJmJhc2VfaW5mbyk7CisJCWlmIChjaGwgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChiYXNlbGVuIDwgMiAmJiAoYmFzZWxlbiArIGNobCkgPiAyKQorCQkJbnVtdGFpbDJfYmFzZWxlbiA9IGJhc2VsZW47CisJCWlmIChiYXNlbGVuIDwgNiAmJiAoYmFzZWxlbiArIGNobCkgPiA2KQorCQkJbnVtdGFpbF9iYXNlbGVuID0gYmFzZWxlbjsKKwkJZm9yIChjaGkgPSAwOyBjaGkgPCBjaGw7IGNoaSsrKSB7CisJCQkqcCsrID0gY2hhcmJ1ZltjaGldOworCQkJYmFzZWxlbisrOworCQkJaWYgKGJhc2VsZW4gPj0gOCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoYmFzZWxlbiA+PSA4KSB7CisJCQlpZiAoKGNoaSA8IGNobCAtIDEpIHx8IChpcCArIDEpIC0gdW5hbWUgPCBzeikKKwkJCQlpc19zaG9ydG5hbWUgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGJhc2VsZW4gPT0gMCkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlleHRsZW4gPSAwOworCWlmIChleHRfc3RhcnQpIHsKKwkJZm9yIChwID0gZXh0LCBpcCA9IGV4dF9zdGFydDsgZXh0bGVuIDwgMyAmJiBpcCA8IGVuZDsgaXArKykgeworCQkJY2hsID0gdG9fc2hvcnRuYW1lX2NoYXIobmxzLCBjaGFyYnVmLCBzaXplb2YoY2hhcmJ1ZiksCisJCQkJCQlpcCwgJmV4dF9pbmZvKTsKKwkJCWlmIChjaGwgPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKChleHRsZW4gKyBjaGwpID4gMykgeworCQkJCWlzX3Nob3J0bmFtZSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlmb3IgKGNoaSA9IDA7IGNoaSA8IGNobDsgY2hpKyspIHsKKwkJCQkqcCsrID0gY2hhcmJ1ZltjaGldOworCQkJCWV4dGxlbisrOworCQkJfQorCQkJaWYgKGV4dGxlbiA+PSAzKSB7CisJCQkJaWYgKGlwICsgMSAhPSBlbmQpCisJCQkJCWlzX3Nob3J0bmFtZSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJZXh0W2V4dGxlbl0gPSAnXDAnOworCWJhc2VbYmFzZWxlbl0gPSAnXDAnOworCisJLyogWWVzLCBpdCBjYW4gaGFwcGVuLiAiLlx4ZTUiIHdvdWxkIGRvIGl0LiAqLworCWlmIChiYXNlWzBdID09IERFTEVURURfRkxBRykKKwkJYmFzZVswXSA9IDB4MDU7CisKKwkvKiBPSywgYXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgYmFzZSBpcyBub3QgbG9uZ2VyIHRoYW4gOCBzeW1ib2xzLAorCSAqIGV4dCBpcyBub3QgbG9uZ2VyIHRoYW4gMywgYmFzZSBpcyBub25lbXB0eSwgYm90aCBkb24ndCBjb250YWluCisJICogYW55IGJhZCBzeW1ib2xzIChsb3dlcmNhc2UgdHJhbnNmb3JtZWQgdG8gdXBwZXJjYXNlKS4KKwkgKi8KKworCW1lbXNldChuYW1lX3JlcywgJyAnLCBNU0RPU19OQU1FKTsKKwltZW1jcHkobmFtZV9yZXMsIGJhc2UsIGJhc2VsZW4pOworCW1lbWNweShuYW1lX3JlcyArIDgsIGV4dCwgZXh0bGVuKTsKKwkqbGNhc2UgPSAwOworCWlmIChpc19zaG9ydG5hbWUgJiYgYmFzZV9pbmZvLnZhbGlkICYmIGV4dF9pbmZvLnZhbGlkKSB7CisJCWlmICh2ZmF0X2ZpbmRfZm9ybShkaXIsIG5hbWVfcmVzKSA9PSAwKQorCQkJcmV0dXJuIC1FRVhJU1Q7CisKKwkJaWYgKG9wdHMtPnNob3J0bmFtZSAmIFZGQVRfU0ZOX0NSRUFURV9XSU45NSkgeworCQkJcmV0dXJuIChiYXNlX2luZm8udXBwZXIgJiYgZXh0X2luZm8udXBwZXIpOworCQl9IGVsc2UgaWYgKG9wdHMtPnNob3J0bmFtZSAmIFZGQVRfU0ZOX0NSRUFURV9XSU5OVCkgeworCQkJaWYgKChiYXNlX2luZm8udXBwZXIgfHwgYmFzZV9pbmZvLmxvd2VyKSAmJgorCQkJICAgIChleHRfaW5mby51cHBlciB8fCBleHRfaW5mby5sb3dlcikpIHsKKwkJCQlpZiAoIWJhc2VfaW5mby51cHBlciAmJiBiYXNlX2luZm8ubG93ZXIpCisJCQkJCSpsY2FzZSB8PSBDQVNFX0xPV0VSX0JBU0U7CisJCQkJaWYgKCFleHRfaW5mby51cHBlciAmJiBleHRfaW5mby5sb3dlcikKKwkJCQkJKmxjYXNlIHw9IENBU0VfTE9XRVJfRVhUOworCQkJCXJldHVybiAxOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlCVUcoKTsKKwkJfQorCX0KKworCWlmIChvcHRzLT5udW10YWlsID09IDApCisJCWlmICh2ZmF0X2ZpbmRfZm9ybShkaXIsIG5hbWVfcmVzKSA8IDApCisJCQlyZXR1cm4gMDsKKworCS8qCisJICogVHJ5IHRvIGZpbmQgYSB1bmlxdWUgZXh0ZW5zaW9uLiAgVGhpcyB1c2VkIHRvCisJICogaXRlcmF0ZSB0aHJvdWdoIGFsbCBwb3NzaWJpbGl0aWVzIHNlcXVlbnRpYWxseSwKKwkgKiBidXQgdGhhdCBnYXZlIGV4dHJlbWVseSBiYWQgcGVyZm9ybWFuY2UuICBXaW5kb3dzCisJICogb25seSB0cmllcyBhIGZldyBjYXNlcyBiZWZvcmUgdXNpbmcgcmFuZG9tCisJICogdmFsdWVzIGZvciBwYXJ0IG9mIHRoZSBiYXNlLgorCSAqLworCisJaWYgKGJhc2VsZW4gPiA2KSB7CisJCWJhc2VsZW4gPSBudW10YWlsX2Jhc2VsZW47CisJCW5hbWVfcmVzWzddID0gJyAnOworCX0KKwluYW1lX3Jlc1tiYXNlbGVuXSA9ICd+JzsKKwlmb3IgKGkgPSAxOyBpIDwgMTA7IGkrKykgeworCQluYW1lX3Jlc1tiYXNlbGVuICsgMV0gPSBpICsgJzAnOworCQlpZiAodmZhdF9maW5kX2Zvcm0oZGlyLCBuYW1lX3JlcykgPCAwKQorCQkJcmV0dXJuIDA7CisJfQorCisJaSA9IGppZmZpZXMgJiAweGZmZmY7CisJc3ogPSAoamlmZmllcyA+PiAxNikgJiAweDc7CisJaWYgKGJhc2VsZW4gPiAyKSB7CisJCWJhc2VsZW4gPSBudW10YWlsMl9iYXNlbGVuOworCQluYW1lX3Jlc1s3XSA9ICcgJzsKKwl9CisJbmFtZV9yZXNbYmFzZWxlbiArIDRdID0gJ34nOworCW5hbWVfcmVzW2Jhc2VsZW4gKyA1XSA9ICcxJyArIHN6OworCXdoaWxlICgxKSB7CisJCXNwcmludGYoYnVmLCAiJTA0WCIsIGkpOworCQltZW1jcHkoJm5hbWVfcmVzW2Jhc2VsZW5dLCBidWYsIDQpOworCQlpZiAodmZhdF9maW5kX2Zvcm0oZGlyLCBuYW1lX3JlcykgPCAwKQorCQkJYnJlYWs7CisJCWkgLT0gMTE7CisJfQorCXJldHVybiAwOworfQorCisvKiBUcmFuc2xhdGUgYSBzdHJpbmcsIGluY2x1ZGluZyBjb2RlZCBzZXF1ZW5jZXMgaW50byBVbmljb2RlICovCitzdGF0aWMgaW50Cit4bGF0ZV90b191bmkoY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqb3V0bmFtZSwKKwkgICAgIGludCAqbG9uZ2xlbiwgaW50ICpvdXRsZW4sIGludCBlc2NhcGUsIGludCB1dGY4LAorCSAgICAgc3RydWN0IG5sc190YWJsZSAqbmxzKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmlwOworCXVuc2lnbmVkIGNoYXIgbmM7CisJdW5zaWduZWQgY2hhciAqb3A7CisJdW5zaWduZWQgaW50IGVjOworCWludCBpLCBrLCBmaWxsOworCWludCBjaGFybGVuOworCisJaWYgKHV0ZjgpIHsKKwkJaW50IG5hbWVfbGVuID0gc3RybGVuKG5hbWUpOworCisJCSpvdXRsZW4gPSB1dGY4X21ic3Rvd2NzKCh3Y2hhcl90ICopb3V0bmFtZSwgbmFtZSwgUEFHRV9TSVpFKTsKKworCQkvKgorCQkgKiBXZSBzdHJpcHBlZCAnLidzIGJlZm9yZSBhbmQgc2V0IGxlbiBhcHByb3ByaWF0ZWx5LAorCQkgKiBidXQgdXRmOF9tYnN0b3djcyBkb2Vzbid0IGNhcmUgYWJvdXQgbGVuCisJCSAqLworCQkqb3V0bGVuIC09IChuYW1lX2xlbiAtIGxlbik7CisKKwkJb3AgPSAmb3V0bmFtZVsqb3V0bGVuICogc2l6ZW9mKHdjaGFyX3QpXTsKKwl9IGVsc2UgeworCQlpZiAobmxzKSB7CisJCQlmb3IgKGkgPSAwLCBpcCA9IG5hbWUsIG9wID0gb3V0bmFtZSwgKm91dGxlbiA9IDA7CisJCQkgICAgIGkgPCBsZW4gJiYgKm91dGxlbiA8PSAyNjA7CisJCQkgICAgICpvdXRsZW4gKz0gMSkKKwkJCXsKKwkJCQlpZiAoZXNjYXBlICYmICgqaXAgPT0gJzonKSkgeworCQkJCQlpZiAoaSA+IGxlbiAtIDUpCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJZWMgPSAwOworCQkJCQlmb3IgKGsgPSAxOyBrIDwgNTsgaysrKSB7CisJCQkJCQluYyA9IGlwW2tdOworCQkJCQkJZWMgPDw9IDQ7CisJCQkJCQlpZiAobmMgPj0gJzAnICYmIG5jIDw9ICc5JykgeworCQkJCQkJCWVjIHw9IG5jIC0gJzAnOworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQkJaWYgKG5jID49ICdhJyAmJiBuYyA8PSAnZicpIHsKKwkJCQkJCQllYyB8PSBuYyAtICgnYScgLSAxMCk7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCQlpZiAobmMgPj0gJ0EnICYmIG5jIDw9ICdGJykgeworCQkJCQkJCWVjIHw9IG5jIC0gKCdBJyAtIDEwKTsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQl9CisJCQkJCSpvcCsrID0gZWMgJiAweEZGOworCQkJCQkqb3ArKyA9IGVjID4+IDg7CisJCQkJCWlwICs9IDU7CisJCQkJCWkgKz0gNTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoKGNoYXJsZW4gPSBubHMtPmNoYXIydW5pKGlwLCBsZW4gLSBpLCAod2NoYXJfdCAqKW9wKSkgPCAwKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCWlwICs9IGNoYXJsZW47CisJCQkJCWkgKz0gY2hhcmxlbjsKKwkJCQkJb3AgKz0gMjsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlmb3IgKGkgPSAwLCBpcCA9IG5hbWUsIG9wID0gb3V0bmFtZSwgKm91dGxlbiA9IDA7CisJCQkgICAgIGkgPCBsZW4gJiYgKm91dGxlbiA8PSAyNjA7CisJCQkgICAgIGkrKywgKm91dGxlbiArPSAxKQorCQkJeworCQkJCSpvcCsrID0gKmlwKys7CisJCQkJKm9wKysgPSAwOworCQkJfQorCQl9CisJfQorCWlmICgqb3V0bGVuID4gMjYwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCSpsb25nbGVuID0gKm91dGxlbjsKKwlpZiAoKm91dGxlbiAlIDEzKSB7CisJCSpvcCsrID0gMDsKKwkJKm9wKysgPSAwOworCQkqb3V0bGVuICs9IDE7CisJCWlmICgqb3V0bGVuICUgMTMpIHsKKwkJCWZpbGwgPSAxMyAtICgqb3V0bGVuICUgMTMpOworCQkJZm9yIChpID0gMDsgaSA8IGZpbGw7IGkrKykgeworCQkJCSpvcCsrID0gMHhmZjsKKwkJCQkqb3ArKyA9IDB4ZmY7CisJCQl9CisJCQkqb3V0bGVuICs9IGZpbGw7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZmF0X2J1aWxkX3Nsb3RzKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLAorCQkJICAgIGludCBsZW4sIGludCBpc19kaXIsIGludCBjbHVzdGVyLAorCQkJICAgIHN0cnVjdCB0aW1lc3BlYyAqdHMsCisJCQkgICAgc3RydWN0IG1zZG9zX2Rpcl9zbG90ICpzbG90cywgaW50ICpucl9zbG90cykKK3sKKwlzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpID0gTVNET1NfU0IoZGlyLT5pX3NiKTsKKwlzdHJ1Y3QgZmF0X21vdW50X29wdGlvbnMgKm9wdHMgPSAmc2JpLT5vcHRpb25zOworCXN0cnVjdCBtc2Rvc19kaXJfc2xvdCAqcHM7CisJc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqZGU7CisJdW5zaWduZWQgbG9uZyBwYWdlOworCXVuc2lnbmVkIGNoYXIgY2tzdW0sIGxjYXNlOworCXVuc2lnbmVkIGNoYXIgbXNkb3NfbmFtZVtNU0RPU19OQU1FXTsKKwl3Y2hhcl90ICp1bmFtZTsKKwlfX2xlMTYgdGltZSwgZGF0ZTsKKwlpbnQgZXJyLCB1bGVuLCB1c2l6ZSwgaTsKKwlsb2ZmX3Qgb2Zmc2V0OworCisJKm5yX3Nsb3RzID0gMDsKKwllcnIgPSB2ZmF0X3ZhbGlkX2xvbmduYW1lKG5hbWUsIGxlbik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXBhZ2UgPSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXVuYW1lID0gKHdjaGFyX3QgKilwYWdlOworCWVyciA9IHhsYXRlX3RvX3VuaShuYW1lLCBsZW4sICh1bnNpZ25lZCBjaGFyICopdW5hbWUsICZ1bGVuLCAmdXNpemUsCisJCQkgICBvcHRzLT51bmljb2RlX3hsYXRlLCBvcHRzLT51dGY4LCBzYmktPm5sc19pbyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZTsKKworCWVyciA9IHZmYXRfaXNfdXNlZF9iYWRjaGFycyh1bmFtZSwgdWxlbik7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZTsKKworCWVyciA9IHZmYXRfY3JlYXRlX3Nob3J0bmFtZShkaXIsIHNiaS0+bmxzX2Rpc2ssIHVuYW1lLCB1bGVuLAorCQkJCSAgICBtc2Rvc19uYW1lLCAmbGNhc2UpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCWVsc2UgaWYgKGVyciA9PSAxKSB7CisJCWRlID0gKHN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKilzbG90czsKKwkJZXJyID0gMDsKKwkJZ290byBzaG9ydG5hbWU7CisJfQorCisJLyogYnVpbGQgdGhlIGVudHJ5IG9mIGxvbmcgZmlsZSBuYW1lICovCisJZm9yIChja3N1bSA9IGkgPSAwOyBpIDwgMTE7IGkrKykKKwkJY2tzdW0gPSAoKChja3N1bSYxKTw8Nyl8KChja3N1bSYweGZlKT4+MSkpICsgbXNkb3NfbmFtZVtpXTsKKworCSpucl9zbG90cyA9IHVzaXplIC8gMTM7CisJZm9yIChwcyA9IHNsb3RzLCBpID0gKm5yX3Nsb3RzOyBpID4gMDsgaS0tLCBwcysrKSB7CisJCXBzLT5pZCA9IGk7CisJCXBzLT5hdHRyID0gQVRUUl9FWFQ7CisJCXBzLT5yZXNlcnZlZCA9IDA7CisJCXBzLT5hbGlhc19jaGVja3N1bSA9IGNrc3VtOworCQlwcy0+c3RhcnQgPSAwOworCQlvZmZzZXQgPSAoaSAtIDEpICogMTM7CisJCWZhdHdjaGFyX3RvMTYocHMtPm5hbWUwXzQsIHVuYW1lICsgb2Zmc2V0LCA1KTsKKwkJZmF0d2NoYXJfdG8xNihwcy0+bmFtZTVfMTAsIHVuYW1lICsgb2Zmc2V0ICsgNSwgNik7CisJCWZhdHdjaGFyX3RvMTYocHMtPm5hbWUxMV8xMiwgdW5hbWUgKyBvZmZzZXQgKyAxMSwgMik7CisJfQorCXNsb3RzWzBdLmlkIHw9IDB4NDA7CisJZGUgPSAoc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqKXBzOworCitzaG9ydG5hbWU6CisJLyogYnVpbGQgdGhlIGVudHJ5IG9mIDguMyBhbGlhcyBuYW1lICovCisJKCpucl9zbG90cykrKzsKKwltZW1jcHkoZGUtPm5hbWUsIG1zZG9zX25hbWUsIE1TRE9TX05BTUUpOworCWRlLT5hdHRyID0gaXNfZGlyID8gQVRUUl9ESVIgOiBBVFRSX0FSQ0g7CisJZGUtPmxjYXNlID0gbGNhc2U7CisJZmF0X2RhdGVfdW5peDJkb3ModHMtPnR2X3NlYywgJnRpbWUsICZkYXRlKTsKKwlkZS0+dGltZSA9IGRlLT5jdGltZSA9IHRpbWU7CisJZGUtPmRhdGUgPSBkZS0+Y2RhdGUgPSBkZS0+YWRhdGUgPSBkYXRlOworCWRlLT5jdGltZV9jcyA9IDA7CisJZGUtPnN0YXJ0ID0gY3B1X3RvX2xlMTYoY2x1c3Rlcik7CisJZGUtPnN0YXJ0aGkgPSBjcHVfdG9fbGUxNihjbHVzdGVyID4+IDE2KTsKKwlkZS0+c2l6ZSA9IDA7CitvdXRfZnJlZToKKwlmcmVlX3BhZ2UocGFnZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2ZmF0X2FkZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKnFuYW1lLCBpbnQgaXNfZGlyLAorCQkJICBpbnQgY2x1c3Rlciwgc3RydWN0IHRpbWVzcGVjICp0cywKKwkJCSAgc3RydWN0IGZhdF9zbG90X2luZm8gKnNpbmZvKQoreworCXN0cnVjdCBtc2Rvc19kaXJfc2xvdCAqc2xvdHM7CisJdW5zaWduZWQgaW50IGxlbjsKKwlpbnQgZXJyLCBucl9zbG90czsKKworCWxlbiA9IHZmYXRfc3RyaXB0YWlsX2xlbihxbmFtZSk7CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXNsb3RzID0ga21hbGxvYyhzaXplb2YoKnNsb3RzKSAqIE1TRE9TX1NMT1RTLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2xvdHMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnIgPSB2ZmF0X2J1aWxkX3Nsb3RzKGRpciwgcW5hbWUtPm5hbWUsIGxlbiwgaXNfZGlyLCBjbHVzdGVyLCB0cywKKwkJCSAgICAgICBzbG90cywgJm5yX3Nsb3RzKTsKKwlpZiAoZXJyKQorCQlnb3RvIGNsZWFudXA7CisKKwllcnIgPSBmYXRfYWRkX2VudHJpZXMoZGlyLCBzbG90cywgbnJfc2xvdHMsIHNpbmZvKTsKKwlpZiAoZXJyKQorCQlnb3RvIGNsZWFudXA7CisKKwkvKiB1cGRhdGUgdGltZXN0YW1wICovCisJZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gZGlyLT5pX2F0aW1lID0gKnRzOworCWlmIChJU19ESVJTWU5DKGRpcikpCisJCSh2b2lkKWZhdF9zeW5jX2lub2RlKGRpcik7CisJZWxzZQorCQltYXJrX2lub2RlX2RpcnR5KGRpcik7CitjbGVhbnVwOgorCWtmcmVlKHNsb3RzKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZmYXRfZmluZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKnFuYW1lLAorCQkgICAgIHN0cnVjdCBmYXRfc2xvdF9pbmZvICpzaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgbGVuID0gdmZhdF9zdHJpcHRhaWxfbGVuKHFuYW1lKTsKKwlpZiAobGVuID09IDApCisJCXJldHVybiAtRU5PRU5UOworCXJldHVybiBmYXRfc2VhcmNoX2xvbmcoZGlyLCBxbmFtZS0+bmFtZSwgbGVuLCBzaW5mbyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICp2ZmF0X2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKKwlzdHJ1Y3QgZmF0X3Nsb3RfaW5mbyBzaW5mbzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlzdHJ1Y3QgZGVudHJ5ICphbGlhczsKKwlpbnQgZXJyLCB0YWJsZTsKKworCWxvY2tfa2VybmVsKCk7CisJdGFibGUgPSAoTVNET1NfU0Ioc2IpLT5vcHRpb25zLm5hbWVfY2hlY2sgPT0gJ3MnKSA/IDIgOiAwOworCWRlbnRyeS0+ZF9vcCA9ICZ2ZmF0X2RlbnRyeV9vcHNbdGFibGVdOworCisJZXJyID0gdmZhdF9maW5kKGRpciwgJmRlbnRyeS0+ZF9uYW1lLCAmc2luZm8pOworCWlmIChlcnIpIHsKKwkJdGFibGUrKzsKKwkJZ290byBlcnJvcjsKKwl9CisJaW5vZGUgPSBmYXRfYnVpbGRfaW5vZGUoc2IsIHNpbmZvLmRlLCBzaW5mby5pX3Bvcyk7CisJYnJlbHNlKHNpbmZvLmJoKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoaW5vZGUpKTsKKwl9CisJYWxpYXMgPSBkX2ZpbmRfYWxpYXMoaW5vZGUpOworCWlmIChhbGlhcykgeworCQlpZiAoZF9pbnZhbGlkYXRlKGFsaWFzKSA9PSAwKQorCQkJZHB1dChhbGlhcyk7CisJCWVsc2UgeworCQkJaXB1dChpbm9kZSk7CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCQlyZXR1cm4gYWxpYXM7CisJCX0KKworCX0KK2Vycm9yOgorCXVubG9ja19rZXJuZWwoKTsKKwlkZW50cnktPmRfb3AgPSAmdmZhdF9kZW50cnlfb3BzW3RhYmxlXTsKKwlkZW50cnktPmRfdGltZSA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfdmVyc2lvbjsKKwlkZW50cnkgPSBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKKwlpZiAoZGVudHJ5KSB7CisJCWRlbnRyeS0+ZF9vcCA9ICZ2ZmF0X2RlbnRyeV9vcHNbdGFibGVdOworCQlkZW50cnktPmRfdGltZSA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfdmVyc2lvbjsKKwl9CisJcmV0dXJuIGRlbnRyeTsKK30KKworc3RhdGljIGludCB2ZmF0X2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJICAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZmF0X3Nsb3RfaW5mbyBzaW5mbzsKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJaW50IGVycjsKKworCWxvY2tfa2VybmVsKCk7CisKKwl0cyA9IENVUlJFTlRfVElNRV9TRUM7CisJZXJyID0gdmZhdF9hZGRfZW50cnkoZGlyLCAmZGVudHJ5LT5kX25hbWUsIDAsIDAsICZ0cywgJnNpbmZvKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlkaXItPmlfdmVyc2lvbisrOworCisJaW5vZGUgPSBmYXRfYnVpbGRfaW5vZGUoc2IsIHNpbmZvLmRlLCBzaW5mby5pX3Bvcyk7CisJYnJlbHNlKHNpbmZvLmJoKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwkJZ290byBvdXQ7CisJfQorCWlub2RlLT5pX3ZlcnNpb24rKzsKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSB0czsKKwkvKiB0aW1lc3RhbXAgaXMgYWxyZWFkeSB3cml0dGVuLCBzbyBtYXJrX2lub2RlX2RpcnR5KCkgaXMgdW5uZWVkZWQuICovCisKKwlkZW50cnktPmRfdGltZSA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfdmVyc2lvbjsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZmYXRfcm1kaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBmYXRfc2xvdF9pbmZvIHNpbmZvOworCWludCBlcnI7CisKKwlsb2NrX2tlcm5lbCgpOworCisJZXJyID0gZmF0X2Rpcl9lbXB0eShpbm9kZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gdmZhdF9maW5kKGRpciwgJmRlbnRyeS0+ZF9uYW1lLCAmc2luZm8pOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gZmF0X3JlbW92ZV9lbnRyaWVzKGRpciwgJnNpbmZvKTsJLyogYW5kIHJlbGVhc2VzIGJoICovCisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZGlyLT5pX25saW5rLS07CisKKwlpbm9kZS0+aV9ubGluayA9IDA7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJZmF0X2RldGFjaChpbm9kZSk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2ZmF0X3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGZhdF9zbG90X2luZm8gc2luZm87CisJaW50IGVycjsKKworCWxvY2tfa2VybmVsKCk7CisKKwllcnIgPSB2ZmF0X2ZpbmQoZGlyLCAmZGVudHJ5LT5kX25hbWUsICZzaW5mbyk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBmYXRfcmVtb3ZlX2VudHJpZXMoZGlyLCAmc2luZm8pOwkvKiBhbmQgcmVsZWFzZXMgYmggKi8KKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlpbm9kZS0+aV9ubGluayA9IDA7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJZmF0X2RldGFjaChpbm9kZSk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2ZmF0X21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZmF0X3Nsb3RfaW5mbyBzaW5mbzsKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJaW50IGVyciwgY2x1c3RlcjsKKworCWxvY2tfa2VybmVsKCk7CisKKwl0cyA9IENVUlJFTlRfVElNRV9TRUM7CisJY2x1c3RlciA9IGZhdF9hbGxvY19uZXdfZGlyKGRpciwgJnRzKTsKKwlpZiAoY2x1c3RlciA8IDApIHsKKwkJZXJyID0gY2x1c3RlcjsKKwkJZ290byBvdXQ7CisJfQorCWVyciA9IHZmYXRfYWRkX2VudHJ5KGRpciwgJmRlbnRyeS0+ZF9uYW1lLCAxLCBjbHVzdGVyLCAmdHMsICZzaW5mbyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZTsKKwlkaXItPmlfdmVyc2lvbisrOworCWRpci0+aV9ubGluaysrOworCisJaW5vZGUgPSBmYXRfYnVpbGRfaW5vZGUoc2IsIHNpbmZvLmRlLCBzaW5mby5pX3Bvcyk7CisJYnJlbHNlKHNpbmZvLmJoKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwkJLyogdGhlIGRpcmVjdG9yeSB3YXMgY29tcGxldGVkLCBqdXN0IHJldHVybiBhIGVycm9yICovCisJCWdvdG8gb3V0OworCX0KKwlpbm9kZS0+aV92ZXJzaW9uKys7CisJaW5vZGUtPmlfbmxpbmsgPSAyOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IHRzOworCS8qIHRpbWVzdGFtcCBpcyBhbHJlYWR5IHdyaXR0ZW4sIHNvIG1hcmtfaW5vZGVfZGlydHkoKSBpcyB1bm5lZWRlZC4gKi8KKworCWRlbnRyeS0+ZF90aW1lID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZS0+aV92ZXJzaW9uOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7CisKK291dF9mcmVlOgorCWZhdF9mcmVlX2NsdXN0ZXJzKGRpciwgY2x1c3Rlcik7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdmZhdF9yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorCQkgICAgICAgc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqZG90ZG90X2JoOworCXN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKmRvdGRvdF9kZTsKKwlsb2ZmX3QgZG90ZG90X2lfcG9zOworCXN0cnVjdCBpbm9kZSAqb2xkX2lub2RlLCAqbmV3X2lub2RlOworCXN0cnVjdCBmYXRfc2xvdF9pbmZvIG9sZF9zaW5mbywgc2luZm87CisJc3RydWN0IHRpbWVzcGVjIHRzOworCWludCBlcnIsIGlzX2RpciwgdXBkYXRlX2RvdGRvdCwgY29ycnVwdCA9IDA7CisKKwlvbGRfc2luZm8uYmggPSBzaW5mby5iaCA9IGRvdGRvdF9iaCA9IE5VTEw7CisJb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKwluZXdfaW5vZGUgPSBuZXdfZGVudHJ5LT5kX2lub2RlOworCWxvY2tfa2VybmVsKCk7CisJZXJyID0gdmZhdF9maW5kKG9sZF9kaXIsICZvbGRfZGVudHJ5LT5kX25hbWUsICZvbGRfc2luZm8pOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJaXNfZGlyID0gU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSk7CisJdXBkYXRlX2RvdGRvdCA9IChpc19kaXIgJiYgb2xkX2RpciAhPSBuZXdfZGlyKTsKKwlpZiAodXBkYXRlX2RvdGRvdCkgeworCQlpZiAoZmF0X2dldF9kb3Rkb3RfZW50cnkob2xkX2lub2RlLCAmZG90ZG90X2JoLCAmZG90ZG90X2RlLAorCQkJCQkgJmRvdGRvdF9pX3BvcykgPCAwKSB7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwl0cyA9IENVUlJFTlRfVElNRV9TRUM7CisJaWYgKG5ld19pbm9kZSkgeworCQllcnIgPSB2ZmF0X2ZpbmQobmV3X2RpciwgJm5ld19kZW50cnktPmRfbmFtZSwgJnNpbmZvKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQlpZiAoTVNET1NfSShuZXdfaW5vZGUpLT5pX3BvcyAhPSBzaW5mby5pX3BvcykgeworCQkJLyogV1RGPz8/IENyeSBhbmQgZmFpbC4gKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInZmYXRfcmVuYW1lOiBmcyBjb3JydXB0ZWRcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoaXNfZGlyKSB7CisJCQllcnIgPSBmYXRfZGlyX2VtcHR5KG5ld19pbm9kZSk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0OworCQl9CisJCWZhdF9kZXRhY2gobmV3X2lub2RlKTsKKwl9IGVsc2UgeworCQllcnIgPSB2ZmF0X2FkZF9lbnRyeShuZXdfZGlyLCAmbmV3X2RlbnRyeS0+ZF9uYW1lLCBpc19kaXIsIDAsCisJCQkJICAgICAmdHMsICZzaW5mbyk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwl9CisJbmV3X2Rpci0+aV92ZXJzaW9uKys7CisKKwlmYXRfZGV0YWNoKG9sZF9pbm9kZSk7CisJZmF0X2F0dGFjaChvbGRfaW5vZGUsIHNpbmZvLmlfcG9zKTsKKwlpZiAoSVNfRElSU1lOQyhuZXdfZGlyKSkgeworCQllcnIgPSBmYXRfc3luY19pbm9kZShvbGRfaW5vZGUpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJvcl9pbm9kZTsKKwl9IGVsc2UKKwkJbWFya19pbm9kZV9kaXJ0eShvbGRfaW5vZGUpOworCisJaWYgKHVwZGF0ZV9kb3Rkb3QpIHsKKwkJaW50IHN0YXJ0ID0gTVNET1NfSShuZXdfZGlyKS0+aV9sb2dzdGFydDsKKwkJZG90ZG90X2RlLT5zdGFydCA9IGNwdV90b19sZTE2KHN0YXJ0KTsKKwkJZG90ZG90X2RlLT5zdGFydGhpID0gY3B1X3RvX2xlMTYoc3RhcnQgPj4gMTYpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShkb3Rkb3RfYmgpOworCQlpZiAoSVNfRElSU1lOQyhuZXdfZGlyKSkgeworCQkJZXJyID0gc3luY19kaXJ0eV9idWZmZXIoZG90ZG90X2JoKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBlcnJvcl9kb3Rkb3Q7CisJCX0KKwkJb2xkX2Rpci0+aV9ubGluay0tOworCQlpZiAoIW5ld19pbm9kZSkKKyAJCQluZXdfZGlyLT5pX25saW5rKys7CisJfQorCisJZXJyID0gZmF0X3JlbW92ZV9lbnRyaWVzKG9sZF9kaXIsICZvbGRfc2luZm8pOwkvKiBhbmQgcmVsZWFzZXMgYmggKi8KKwlvbGRfc2luZm8uYmggPSBOVUxMOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3JfZG90ZG90OworCW9sZF9kaXItPmlfdmVyc2lvbisrOworCW9sZF9kaXItPmlfY3RpbWUgPSBvbGRfZGlyLT5pX210aW1lID0gdHM7CisJaWYgKElTX0RJUlNZTkMob2xkX2RpcikpCisJCSh2b2lkKWZhdF9zeW5jX2lub2RlKG9sZF9kaXIpOworCWVsc2UKKwkJbWFya19pbm9kZV9kaXJ0eShvbGRfZGlyKTsKKworCWlmIChuZXdfaW5vZGUpIHsKKwkJaWYgKGlzX2RpcikKKwkJCW5ld19pbm9kZS0+aV9ubGluayAtPSAyOworCQllbHNlCisJCQluZXdfaW5vZGUtPmlfbmxpbmstLTsKKwkJbmV3X2lub2RlLT5pX2N0aW1lID0gdHM7CisJfQorb3V0OgorCWJyZWxzZShzaW5mby5iaCk7CisJYnJlbHNlKGRvdGRvdF9iaCk7CisJYnJlbHNlKG9sZF9zaW5mby5iaCk7CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIGVycjsKKworZXJyb3JfZG90ZG90OgorCS8qIGRhdGEgY2x1c3RlciBpcyBzaGFyZWQsIHNlcmlvdXMgY29ycnVwdGlvbiAqLworCWNvcnJ1cHQgPSAxOworCisJaWYgKHVwZGF0ZV9kb3Rkb3QpIHsKKwkJaW50IHN0YXJ0ID0gTVNET1NfSShvbGRfZGlyKS0+aV9sb2dzdGFydDsKKwkJZG90ZG90X2RlLT5zdGFydCA9IGNwdV90b19sZTE2KHN0YXJ0KTsKKwkJZG90ZG90X2RlLT5zdGFydGhpID0gY3B1X3RvX2xlMTYoc3RhcnQgPj4gMTYpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShkb3Rkb3RfYmgpOworCQljb3JydXB0IHw9IHN5bmNfZGlydHlfYnVmZmVyKGRvdGRvdF9iaCk7CisJfQorZXJyb3JfaW5vZGU6CisJZmF0X2RldGFjaChvbGRfaW5vZGUpOworCWZhdF9hdHRhY2gob2xkX2lub2RlLCBvbGRfc2luZm8uaV9wb3MpOworCWlmIChuZXdfaW5vZGUpIHsKKwkJZmF0X2F0dGFjaChuZXdfaW5vZGUsIHNpbmZvLmlfcG9zKTsKKwkJaWYgKGNvcnJ1cHQpCisJCQljb3JydXB0IHw9IGZhdF9zeW5jX2lub2RlKG5ld19pbm9kZSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSWYgbmV3IGVudHJ5IHdhcyBub3Qgc2hhcmluZyB0aGUgZGF0YSBjbHVzdGVyLCBpdAorCQkgKiBzaG91bGRuJ3QgYmUgc2VyaW91cyBjb3JydXB0aW9uLgorCQkgKi8KKwkJaW50IGVycjIgPSBmYXRfcmVtb3ZlX2VudHJpZXMobmV3X2RpciwgJnNpbmZvKTsKKwkJaWYgKGNvcnJ1cHQpCisJCQljb3JydXB0IHw9IGVycjI7CisJCXNpbmZvLmJoID0gTlVMTDsKKwl9CisJaWYgKGNvcnJ1cHQgPCAwKSB7CisJCWZhdF9mc19wYW5pYyhuZXdfZGlyLT5pX3NiLAorCQkJICAgICAiJXM6IEZpbGVzeXN0ZW0gY29ycnVwdGVkIChpX3BvcyAlbGxkKSIsCisJCQkgICAgIF9fRlVOQ1RJT05fXywgc2luZm8uaV9wb3MpOworCX0KKwlnb3RvIG91dDsKK30KKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHZmYXRfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmNyZWF0ZQkJPSB2ZmF0X2NyZWF0ZSwKKwkubG9va3VwCQk9IHZmYXRfbG9va3VwLAorCS51bmxpbmsJCT0gdmZhdF91bmxpbmssCisJLm1rZGlyCQk9IHZmYXRfbWtkaXIsCisJLnJtZGlyCQk9IHZmYXRfcm1kaXIsCisJLnJlbmFtZQkJPSB2ZmF0X3JlbmFtZSwKKwkuc2V0YXR0cgk9IGZhdF9ub3RpZnlfY2hhbmdlLAorfTsKKworc3RhdGljIGludCB2ZmF0X2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlpbnQgcmVzOworCisJcmVzID0gZmF0X2ZpbGxfc3VwZXIoc2IsIGRhdGEsIHNpbGVudCwgJnZmYXRfZGlyX2lub2RlX29wZXJhdGlvbnMsIDEpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKKwlpZiAoTVNET1NfU0Ioc2IpLT5vcHRpb25zLm5hbWVfY2hlY2sgIT0gJ3MnKQorCQlzYi0+c19yb290LT5kX29wID0gJnZmYXRfZGVudHJ5X29wc1swXTsKKwllbHNlCisJCXNiLT5zX3Jvb3QtPmRfb3AgPSAmdmZhdF9kZW50cnlfb3BzWzJdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnZmYXRfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkJCSAgICAgICBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJCSAgICAgICB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIHZmYXRfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB2ZmF0X2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJ2ZmF0IiwKKwkuZ2V0X3NiCQk9IHZmYXRfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3ZmYXRfZnModm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmdmZhdF9mc190eXBlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfdmZhdF9mcyh2b2lkKQoreworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmdmZhdF9mc190eXBlKTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJWRkFUIGZpbGVzeXN0ZW0gc3VwcG9ydCIpOworTU9EVUxFX0FVVEhPUigiR29yZG9uIENoYWZmZWUiKTsKKworbW9kdWxlX2luaXQoaW5pdF92ZmF0X2ZzKQorbW9kdWxlX2V4aXQoZXhpdF92ZmF0X2ZzKQpkaWZmIC0tZ2l0IGEvZnMveGF0dHIuYyBiL2ZzL3hhdHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkZWU3MAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hhdHRyLmMKQEAgLTAsMCArMSw0ODAgQEAKKy8qCisgIEZpbGU6IGZzL3hhdHRyLmMKKworICBFeHRlbmRlZCBhdHRyaWJ1dGUgaGFuZGxpbmcuCisKKyAgQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEFuZHJlYXMgR3J1ZW5iYWNoZXIgPGEuZ3J1ZW5iYWNoZXJAY29tcHV0ZXIub3JnPgorICBDb3B5cmlnaHQgKEMpIDIwMDEgU0dJIC0gU2lsaWNvbiBHcmFwaGljcywgSW5jIDxsaW51eC14ZnNAb3NzLnNnaS5jb20+CisgIENvcHlyaWdodCAoYykgMjAwNCBSZWQgSGF0LCBJbmMuLCBKYW1lcyBNb3JyaXMgPGptb3JyaXNAcmVkaGF0LmNvbT4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyoKKyAqIEV4dGVuZGVkIGF0dHJpYnV0ZSBTRVQgb3BlcmF0aW9ucworICovCitzdGF0aWMgbG9uZworc2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZCwgY2hhciBfX3VzZXIgKm5hbWUsIHZvaWQgX191c2VyICp2YWx1ZSwKKwkgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlpbnQgZXJyb3I7CisJdm9pZCAqa3ZhbHVlID0gTlVMTDsKKwljaGFyIGtuYW1lW1hBVFRSX05BTUVfTUFYICsgMV07CisKKwlpZiAoZmxhZ3MgJiB+KFhBVFRSX0NSRUFURXxYQVRUUl9SRVBMQUNFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnJvciA9IHN0cm5jcHlfZnJvbV91c2VyKGtuYW1lLCBuYW1lLCBzaXplb2Yoa25hbWUpKTsKKwlpZiAoZXJyb3IgPT0gMCB8fCBlcnJvciA9PSBzaXplb2Yoa25hbWUpKQorCQllcnJvciA9IC1FUkFOR0U7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKHNpemUpIHsKKwkJaWYgKHNpemUgPiBYQVRUUl9TSVpFX01BWCkKKwkJCXJldHVybiAtRTJCSUc7CisJCWt2YWx1ZSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICgha3ZhbHVlKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWlmIChjb3B5X2Zyb21fdXNlcihrdmFsdWUsIHZhbHVlLCBzaXplKSkgeworCQkJa2ZyZWUoa3ZhbHVlKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCisJZXJyb3IgPSAtRU9QTk9UU1VQUDsKKwlpZiAoZC0+ZF9pbm9kZS0+aV9vcCAmJiBkLT5kX2lub2RlLT5pX29wLT5zZXR4YXR0cikgeworCQlkb3duKCZkLT5kX2lub2RlLT5pX3NlbSk7CisJCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfc2V0eGF0dHIoZCwga25hbWUsIGt2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKKwkJZXJyb3IgPSBkLT5kX2lub2RlLT5pX29wLT5zZXR4YXR0cihkLCBrbmFtZSwga3ZhbHVlLCBzaXplLCBmbGFncyk7CisJCWlmICghZXJyb3IpCisJCQlzZWN1cml0eV9pbm9kZV9wb3N0X3NldHhhdHRyKGQsIGtuYW1lLCBrdmFsdWUsIHNpemUsIGZsYWdzKTsKK291dDoKKwkJdXAoJmQtPmRfaW5vZGUtPmlfc2VtKTsKKwl9CisJaWYgKGt2YWx1ZSkKKwkJa2ZyZWUoa3ZhbHVlKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZworc3lzX3NldHhhdHRyKGNoYXIgX191c2VyICpwYXRoLCBjaGFyIF9fdXNlciAqbmFtZSwgdm9pZCBfX3VzZXIgKnZhbHVlLAorCSAgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCBlcnJvcjsKKworCWVycm9yID0gdXNlcl9wYXRoX3dhbGsocGF0aCwgJm5kKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwllcnJvciA9IHNldHhhdHRyKG5kLmRlbnRyeSwgbmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKKwlwYXRoX3JlbGVhc2UoJm5kKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZworc3lzX2xzZXR4YXR0cihjaGFyIF9fdXNlciAqcGF0aCwgY2hhciBfX3VzZXIgKm5hbWUsIHZvaWQgX191c2VyICp2YWx1ZSwKKwkgICAgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJaW50IGVycm9yOworCisJZXJyb3IgPSB1c2VyX3BhdGhfd2Fsa19saW5rKHBhdGgsICZuZCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJZXJyb3IgPSBzZXR4YXR0cihuZC5kZW50cnksIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7CisJcGF0aF9yZWxlYXNlKCZuZCk7CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIGxvbmcKK3N5c19mc2V0eGF0dHIoaW50IGZkLCBjaGFyIF9fdXNlciAqbmFtZSwgdm9pZCBfX3VzZXIgKnZhbHVlLAorCSAgICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGZpbGUgKmY7CisJaW50IGVycm9yID0gLUVCQURGOworCisJZiA9IGZnZXQoZmQpOworCWlmICghZikKKwkJcmV0dXJuIGVycm9yOworCWVycm9yID0gc2V0eGF0dHIoZi0+Zl9kZW50cnksIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7CisJZnB1dChmKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBFeHRlbmRlZCBhdHRyaWJ1dGUgR0VUIG9wZXJhdGlvbnMKKyAqLworc3RhdGljIHNzaXplX3QKK2dldHhhdHRyKHN0cnVjdCBkZW50cnkgKmQsIGNoYXIgX191c2VyICpuYW1lLCB2b2lkIF9fdXNlciAqdmFsdWUsIHNpemVfdCBzaXplKQoreworCXNzaXplX3QgZXJyb3I7CisJdm9pZCAqa3ZhbHVlID0gTlVMTDsKKwljaGFyIGtuYW1lW1hBVFRSX05BTUVfTUFYICsgMV07CisKKwllcnJvciA9IHN0cm5jcHlfZnJvbV91c2VyKGtuYW1lLCBuYW1lLCBzaXplb2Yoa25hbWUpKTsKKwlpZiAoZXJyb3IgPT0gMCB8fCBlcnJvciA9PSBzaXplb2Yoa25hbWUpKQorCQllcnJvciA9IC1FUkFOR0U7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKHNpemUpIHsKKwkJaWYgKHNpemUgPiBYQVRUUl9TSVpFX01BWCkKKwkJCXNpemUgPSBYQVRUUl9TSVpFX01BWDsKKwkJa3ZhbHVlID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFrdmFsdWUpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwllcnJvciA9IC1FT1BOT1RTVVBQOworCWlmIChkLT5kX2lub2RlLT5pX29wICYmIGQtPmRfaW5vZGUtPmlfb3AtPmdldHhhdHRyKSB7CisJCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfZ2V0eGF0dHIoZCwga25hbWUpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKKwkJZXJyb3IgPSBkLT5kX2lub2RlLT5pX29wLT5nZXR4YXR0cihkLCBrbmFtZSwga3ZhbHVlLCBzaXplKTsKKwkJaWYgKGVycm9yID4gMCkgeworCQkJaWYgKHNpemUgJiYgY29weV90b191c2VyKHZhbHVlLCBrdmFsdWUsIGVycm9yKSkKKwkJCQllcnJvciA9IC1FRkFVTFQ7CisJCX0gZWxzZSBpZiAoZXJyb3IgPT0gLUVSQU5HRSAmJiBzaXplID49IFhBVFRSX1NJWkVfTUFYKSB7CisJCQkvKiBUaGUgZmlsZSBzeXN0ZW0gdHJpZWQgdG8gcmV0dXJuZWQgYSB2YWx1ZSBiaWdnZXIKKwkJCSAgIHRoYW4gWEFUVFJfU0laRV9NQVggYnl0ZXMuIE5vdCBwb3NzaWJsZS4gKi8KKwkJCWVycm9yID0gLUUyQklHOworCQl9CisJfQorb3V0OgorCWlmIChrdmFsdWUpCisJCWtmcmVlKGt2YWx1ZSk7CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIHNzaXplX3QKK3N5c19nZXR4YXR0cihjaGFyIF9fdXNlciAqcGF0aCwgY2hhciBfX3VzZXIgKm5hbWUsIHZvaWQgX191c2VyICp2YWx1ZSwKKwkgICAgIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJc3NpemVfdCBlcnJvcjsKKworCWVycm9yID0gdXNlcl9wYXRoX3dhbGsocGF0aCwgJm5kKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwllcnJvciA9IGdldHhhdHRyKG5kLmRlbnRyeSwgbmFtZSwgdmFsdWUsIHNpemUpOworCXBhdGhfcmVsZWFzZSgmbmQpOworCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBzc2l6ZV90CitzeXNfbGdldHhhdHRyKGNoYXIgX191c2VyICpwYXRoLCBjaGFyIF9fdXNlciAqbmFtZSwgdm9pZCBfX3VzZXIgKnZhbHVlLAorCSAgICAgIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJc3NpemVfdCBlcnJvcjsKKworCWVycm9yID0gdXNlcl9wYXRoX3dhbGtfbGluayhwYXRoLCAmbmQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWVycm9yID0gZ2V0eGF0dHIobmQuZGVudHJ5LCBuYW1lLCB2YWx1ZSwgc2l6ZSk7CisJcGF0aF9yZWxlYXNlKCZuZCk7CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIHNzaXplX3QKK3N5c19mZ2V0eGF0dHIoaW50IGZkLCBjaGFyIF9fdXNlciAqbmFtZSwgdm9pZCBfX3VzZXIgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZmlsZSAqZjsKKwlzc2l6ZV90IGVycm9yID0gLUVCQURGOworCisJZiA9IGZnZXQoZmQpOworCWlmICghZikKKwkJcmV0dXJuIGVycm9yOworCWVycm9yID0gZ2V0eGF0dHIoZi0+Zl9kZW50cnksIG5hbWUsIHZhbHVlLCBzaXplKTsKKwlmcHV0KGYpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEV4dGVuZGVkIGF0dHJpYnV0ZSBMSVNUIG9wZXJhdGlvbnMKKyAqLworc3RhdGljIHNzaXplX3QKK2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkLCBjaGFyIF9fdXNlciAqbGlzdCwgc2l6ZV90IHNpemUpCit7CisJc3NpemVfdCBlcnJvcjsKKwljaGFyICprbGlzdCA9IE5VTEw7CisKKwlpZiAoc2l6ZSkgeworCQlpZiAoc2l6ZSA+IFhBVFRSX0xJU1RfTUFYKQorCQkJc2l6ZSA9IFhBVFRSX0xJU1RfTUFYOworCQlrbGlzdCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICgha2xpc3QpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwllcnJvciA9IC1FT1BOT1RTVVBQOworCWlmIChkLT5kX2lub2RlLT5pX29wICYmIGQtPmRfaW5vZGUtPmlfb3AtPmxpc3R4YXR0cikgeworCQllcnJvciA9IHNlY3VyaXR5X2lub2RlX2xpc3R4YXR0cihkKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJCWVycm9yID0gZC0+ZF9pbm9kZS0+aV9vcC0+bGlzdHhhdHRyKGQsIGtsaXN0LCBzaXplKTsKKwkJaWYgKGVycm9yID4gMCkgeworCQkJaWYgKHNpemUgJiYgY29weV90b191c2VyKGxpc3QsIGtsaXN0LCBlcnJvcikpCisJCQkJZXJyb3IgPSAtRUZBVUxUOworCQl9IGVsc2UgaWYgKGVycm9yID09IC1FUkFOR0UgJiYgc2l6ZSA+PSBYQVRUUl9MSVNUX01BWCkgeworCQkJLyogVGhlIGZpbGUgc3lzdGVtIHRyaWVkIHRvIHJldHVybmVkIGEgbGlzdCBiaWdnZXIKKwkJCSAgIHRoYW4gWEFUVFJfTElTVF9NQVggYnl0ZXMuIE5vdCBwb3NzaWJsZS4gKi8KKwkJCWVycm9yID0gLUUyQklHOworCQl9CisJfQorb3V0OgorCWlmIChrbGlzdCkKKwkJa2ZyZWUoa2xpc3QpOworCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBzc2l6ZV90CitzeXNfbGlzdHhhdHRyKGNoYXIgX191c2VyICpwYXRoLCBjaGFyIF9fdXNlciAqbGlzdCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlzc2l6ZV90IGVycm9yOworCisJZXJyb3IgPSB1c2VyX3BhdGhfd2FsayhwYXRoLCAmbmQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWVycm9yID0gbGlzdHhhdHRyKG5kLmRlbnRyeSwgbGlzdCwgc2l6ZSk7CisJcGF0aF9yZWxlYXNlKCZuZCk7CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIHNzaXplX3QKK3N5c19sbGlzdHhhdHRyKGNoYXIgX191c2VyICpwYXRoLCBjaGFyIF9fdXNlciAqbGlzdCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlzc2l6ZV90IGVycm9yOworCisJZXJyb3IgPSB1c2VyX3BhdGhfd2Fsa19saW5rKHBhdGgsICZuZCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJZXJyb3IgPSBsaXN0eGF0dHIobmQuZGVudHJ5LCBsaXN0LCBzaXplKTsKKwlwYXRoX3JlbGVhc2UoJm5kKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2Ugc3NpemVfdAorc3lzX2ZsaXN0eGF0dHIoaW50IGZkLCBjaGFyIF9fdXNlciAqbGlzdCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGZpbGUgKmY7CisJc3NpemVfdCBlcnJvciA9IC1FQkFERjsKKworCWYgPSBmZ2V0KGZkKTsKKwlpZiAoIWYpCisJCXJldHVybiBlcnJvcjsKKwllcnJvciA9IGxpc3R4YXR0cihmLT5mX2RlbnRyeSwgbGlzdCwgc2l6ZSk7CisJZnB1dChmKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBFeHRlbmRlZCBhdHRyaWJ1dGUgUkVNT1ZFIG9wZXJhdGlvbnMKKyAqLworc3RhdGljIGxvbmcKK3JlbW92ZXhhdHRyKHN0cnVjdCBkZW50cnkgKmQsIGNoYXIgX191c2VyICpuYW1lKQoreworCWludCBlcnJvcjsKKwljaGFyIGtuYW1lW1hBVFRSX05BTUVfTUFYICsgMV07CisKKwllcnJvciA9IHN0cm5jcHlfZnJvbV91c2VyKGtuYW1lLCBuYW1lLCBzaXplb2Yoa25hbWUpKTsKKwlpZiAoZXJyb3IgPT0gMCB8fCBlcnJvciA9PSBzaXplb2Yoa25hbWUpKQorCQllcnJvciA9IC1FUkFOR0U7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSAtRU9QTk9UU1VQUDsKKwlpZiAoZC0+ZF9pbm9kZS0+aV9vcCAmJiBkLT5kX2lub2RlLT5pX29wLT5yZW1vdmV4YXR0cikgeworCQllcnJvciA9IHNlY3VyaXR5X2lub2RlX3JlbW92ZXhhdHRyKGQsIGtuYW1lKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJCWRvd24oJmQtPmRfaW5vZGUtPmlfc2VtKTsKKwkJZXJyb3IgPSBkLT5kX2lub2RlLT5pX29wLT5yZW1vdmV4YXR0cihkLCBrbmFtZSk7CisJCXVwKCZkLT5kX2lub2RlLT5pX3NlbSk7CisJfQorb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nCitzeXNfcmVtb3ZleGF0dHIoY2hhciBfX3VzZXIgKnBhdGgsIGNoYXIgX191c2VyICpuYW1lKQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJaW50IGVycm9yOworCisJZXJyb3IgPSB1c2VyX3BhdGhfd2FsayhwYXRoLCAmbmQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWVycm9yID0gcmVtb3ZleGF0dHIobmQuZGVudHJ5LCBuYW1lKTsKKwlwYXRoX3JlbGVhc2UoJm5kKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZworc3lzX2xyZW1vdmV4YXR0cihjaGFyIF9fdXNlciAqcGF0aCwgY2hhciBfX3VzZXIgKm5hbWUpCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHVzZXJfcGF0aF93YWxrX2xpbmsocGF0aCwgJm5kKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwllcnJvciA9IHJlbW92ZXhhdHRyKG5kLmRlbnRyeSwgbmFtZSk7CisJcGF0aF9yZWxlYXNlKCZuZCk7CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIGxvbmcKK3N5c19mcmVtb3ZleGF0dHIoaW50IGZkLCBjaGFyIF9fdXNlciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZmlsZSAqZjsKKwlpbnQgZXJyb3IgPSAtRUJBREY7CisKKwlmID0gZmdldChmZCk7CisJaWYgKCFmKQorCQlyZXR1cm4gZXJyb3I7CisJZXJyb3IgPSByZW1vdmV4YXR0cihmLT5mX2RlbnRyeSwgbmFtZSk7CisJZnB1dChmKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKgorc3RyY21wX3ByZWZpeChjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICphX3ByZWZpeCkKK3sKKwl3aGlsZSAoKmFfcHJlZml4ICYmICphID09ICphX3ByZWZpeCkgeworCQlhKys7CisJCWFfcHJlZml4Kys7CisJfQorCXJldHVybiAqYV9wcmVmaXggPyBOVUxMIDogYTsKK30KKworLyoKKyAqIEluIG9yZGVyIHRvIGltcGxlbWVudCBkaWZmZXJlbnQgc2V0cyBvZiB4YXR0ciBvcGVyYXRpb25zIGZvciBlYWNoIHhhdHRyCisgKiBwcmVmaXggd2l0aCB0aGUgZ2VuZXJpYyB4YXR0ciBBUEksIGEgZmlsZXN5c3RlbSBzaG91bGQgY3JlYXRlIGEKKyAqIG51bGwtdGVybWluYXRlZCBhcnJheSBvZiBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAob25lIGZvciBlYWNoIHByZWZpeCkgYW5kCisgKiBoYW5nIGEgcG9pbnRlciB0byBpdCBvZmYgb2YgdGhlIHNfeGF0dHIgZmllbGQgb2YgdGhlIHN1cGVyYmxvY2suCisgKgorICogVGhlIGdlbmVyaWNfZm9veGF0dHIoKSBmdW5jdGlvbnMgd2lsbCB1c2UgdGhpcyBsaXN0IHRvIGRpc3BhdGNoIHhhdHRyCisgKiBvcGVyYXRpb25zIHRvIHRoZSBjb3JyZWN0IHhhdHRyX2hhbmRsZXIuCisgKi8KKyNkZWZpbmUgZm9yX2VhY2hfeGF0dHJfaGFuZGxlcihoYW5kbGVycywgaGFuZGxlcikJCVwKKwkJZm9yICgoaGFuZGxlcikgPSAqKGhhbmRsZXJzKSsrOwkJCVwKKwkJCShoYW5kbGVyKSAhPSBOVUxMOwkJCVwKKwkJCShoYW5kbGVyKSA9ICooaGFuZGxlcnMpKyspCisKKy8qCisgKiBGaW5kIHRoZSB4YXR0cl9oYW5kbGVyIHdpdGggdGhlIG1hdGNoaW5nIHByZWZpeC4KKyAqLworc3RhdGljIHN0cnVjdCB4YXR0cl9oYW5kbGVyICoKK3hhdHRyX3Jlc29sdmVfbmFtZShzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqKmhhbmRsZXJzLCBjb25zdCBjaGFyICoqbmFtZSkKK3sKKwlzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlcjsKKworCWlmICghKm5hbWUpCisJCXJldHVybiBOVUxMOworCisJZm9yX2VhY2hfeGF0dHJfaGFuZGxlcihoYW5kbGVycywgaGFuZGxlcikgeworCQljb25zdCBjaGFyICpuID0gc3RyY21wX3ByZWZpeCgqbmFtZSwgaGFuZGxlci0+cHJlZml4KTsKKwkJaWYgKG4pIHsKKwkJCSpuYW1lID0gbjsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBoYW5kbGVyOworfQorCisvKgorICogRmluZCB0aGUgaGFuZGxlciBmb3IgdGhlIHByZWZpeCBhbmQgZGlzcGF0Y2ggaXRzIGdldCgpIG9wZXJhdGlvbi4KKyAqLworc3NpemVfdAorZ2VuZXJpY19nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXI7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWhhbmRsZXIgPSB4YXR0cl9yZXNvbHZlX25hbWUoaW5vZGUtPmlfc2ItPnNfeGF0dHIsICZuYW1lKTsKKwlpZiAoIWhhbmRsZXIpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlyZXR1cm4gaGFuZGxlci0+Z2V0KGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOworfQorCisvKgorICogQ29tYmluZSB0aGUgcmVzdWx0cyBvZiB0aGUgbGlzdCgpIG9wZXJhdGlvbiBmcm9tIGV2ZXJ5IHhhdHRyX2hhbmRsZXIgaW4gdGhlCisgKiBsaXN0LgorICovCitzc2l6ZV90CitnZW5lcmljX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIsICoqaGFuZGxlcnMgPSBpbm9kZS0+aV9zYi0+c194YXR0cjsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IDA7CisKKwlpZiAoIWJ1ZmZlcikgeworCQlmb3JfZWFjaF94YXR0cl9oYW5kbGVyKGhhbmRsZXJzLCBoYW5kbGVyKQorCQkJc2l6ZSArPSBoYW5kbGVyLT5saXN0KGlub2RlLCBOVUxMLCAwLCBOVUxMLCAwKTsKKwl9IGVsc2UgeworCQljaGFyICpidWYgPSBidWZmZXI7CisKKwkJZm9yX2VhY2hfeGF0dHJfaGFuZGxlcihoYW5kbGVycywgaGFuZGxlcikgeworCQkJc2l6ZSA9IGhhbmRsZXItPmxpc3QoaW5vZGUsIGJ1ZiwgYnVmZmVyX3NpemUsIE5VTEwsIDApOworCQkJaWYgKHNpemUgPiBidWZmZXJfc2l6ZSkKKwkJCQlyZXR1cm4gLUVSQU5HRTsKKwkJCWJ1ZiArPSBzaXplOworCQkJYnVmZmVyX3NpemUgLT0gc2l6ZTsKKwkJfQorCQlzaXplID0gYnVmIC0gYnVmZmVyOworCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworLyoKKyAqIEZpbmQgdGhlIGhhbmRsZXIgZm9yIHRoZSBwcmVmaXggYW5kIGRpc3BhdGNoIGl0cyBzZXQoKSBvcGVyYXRpb24uCisgKi8KK2ludAorZ2VuZXJpY19zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisKKwlpZiAoc2l6ZSA9PSAwKQorCQl2YWx1ZSA9ICIiOyAgLyogZW1wdHkgRUEsIGRvIG5vdCByZW1vdmUgKi8KKwloYW5kbGVyID0geGF0dHJfcmVzb2x2ZV9uYW1lKGlub2RlLT5pX3NiLT5zX3hhdHRyLCAmbmFtZSk7CisJaWYgKCFoYW5kbGVyKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJcmV0dXJuIGhhbmRsZXItPnNldChpbm9kZSwgbmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKK30KKworLyoKKyAqIEZpbmQgdGhlIGhhbmRsZXIgZm9yIHRoZSBwcmVmaXggYW5kIGRpc3BhdGNoIGl0cyBzZXQoKSBvcGVyYXRpb24gdG8gcmVtb3ZlCisgKiBhbnkgYXNzb2NpYXRlZCBleHRlbmRlZCBhdHRyaWJ1dGUuCisgKi8KK2ludAorZ2VuZXJpY19yZW1vdmV4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXI7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWhhbmRsZXIgPSB4YXR0cl9yZXNvbHZlX25hbWUoaW5vZGUtPmlfc2ItPnNfeGF0dHIsICZuYW1lKTsKKwlpZiAoIWhhbmRsZXIpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlyZXR1cm4gaGFuZGxlci0+c2V0KGlub2RlLCBuYW1lLCBOVUxMLCAwLCBYQVRUUl9SRVBMQUNFKTsKK30KKworRVhQT1JUX1NZTUJPTChnZW5lcmljX2dldHhhdHRyKTsKK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19saXN0eGF0dHIpOworRVhQT1JUX1NZTUJPTChnZW5lcmljX3NldHhhdHRyKTsKK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19yZW1vdmV4YXR0cik7CmRpZmYgLS1naXQgYS9mcy94YXR0cl9hY2wuYyBiL2ZzL3hhdHRyX2FjbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OWEyNTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94YXR0cl9hY2wuYwpAQCAtMCwwICsxLDk5IEBACisvKgorICogbGludXgvZnMveGF0dHJfYWNsLmMKKyAqCisgKiBBbG1vc3QgYWxsIGZyb20gbGludXgvZnMvZXh0Mi9hY2wuYzoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBieSBBbmRyZWFzIEdydWVuYmFjaGVyLCA8YS5ncnVlbmJhY2hlckBjb21wdXRlci5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsX3hhdHRyLmg+CisKKworLyoKKyAqIENvbnZlcnQgZnJvbSBleHRlbmRlZCBhdHRyaWJ1dGUgdG8gaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uLgorICovCitzdHJ1Y3QgcG9zaXhfYWNsICoKK3Bvc2l4X2FjbF9mcm9tX3hhdHRyKGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKK3sKKwlwb3NpeF9hY2xfeGF0dHJfaGVhZGVyICpoZWFkZXIgPSAocG9zaXhfYWNsX3hhdHRyX2hlYWRlciAqKXZhbHVlOworCXBvc2l4X2FjbF94YXR0cl9lbnRyeSAqZW50cnkgPSAocG9zaXhfYWNsX3hhdHRyX2VudHJ5ICopKGhlYWRlcisxKSwgKmVuZDsKKwlpbnQgY291bnQ7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsOworCXN0cnVjdCBwb3NpeF9hY2xfZW50cnkgKmFjbF9lOworCisJaWYgKCF2YWx1ZSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHNpemUgPCBzaXplb2YocG9zaXhfYWNsX3hhdHRyX2hlYWRlcikpCisJCSByZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlpZiAoaGVhZGVyLT5hX3ZlcnNpb24gIT0gY3B1X3RvX2xlMzIoUE9TSVhfQUNMX1hBVFRSX1ZFUlNJT04pKQorCQlyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7CisKKwljb3VudCA9IHBvc2l4X2FjbF94YXR0cl9jb3VudChzaXplKTsKKwlpZiAoY291bnQgPCAwKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJCisJYWNsID0gcG9zaXhfYWNsX2FsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFjbCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJYWNsX2UgPSBhY2wtPmFfZW50cmllczsKKwkKKwlmb3IgKGVuZCA9IGVudHJ5ICsgY291bnQ7IGVudHJ5ICE9IGVuZDsgYWNsX2UrKywgZW50cnkrKykgeworCQlhY2xfZS0+ZV90YWcgID0gbGUxNl90b19jcHUoZW50cnktPmVfdGFnKTsKKwkJYWNsX2UtPmVfcGVybSA9IGxlMTZfdG9fY3B1KGVudHJ5LT5lX3Blcm0pOworCisJCXN3aXRjaChhY2xfZS0+ZV90YWcpIHsKKwkJCWNhc2UgQUNMX1VTRVJfT0JKOgorCQkJY2FzZSBBQ0xfR1JPVVBfT0JKOgorCQkJY2FzZSBBQ0xfTUFTSzoKKwkJCWNhc2UgQUNMX09USEVSOgorCQkJCWFjbF9lLT5lX2lkID0gQUNMX1VOREVGSU5FRF9JRDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBQ0xfVVNFUjoKKwkJCWNhc2UgQUNMX0dST1VQOgorCQkJCWFjbF9lLT5lX2lkID0gbGUzMl90b19jcHUoZW50cnktPmVfaWQpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKwlyZXR1cm4gYWNsOworCitmYWlsOgorCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cit9CitFWFBPUlRfU1lNQk9MIChwb3NpeF9hY2xfZnJvbV94YXR0cik7CisKKy8qCisgKiBDb252ZXJ0IGZyb20gaW4tbWVtb3J5IHRvIGV4dGVuZGVkIGF0dHJpYnV0ZSByZXByZXNlbnRhdGlvbi4KKyAqLworaW50Citwb3NpeF9hY2xfdG9feGF0dHIoY29uc3Qgc3RydWN0IHBvc2l4X2FjbCAqYWNsLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCXBvc2l4X2FjbF94YXR0cl9oZWFkZXIgKmV4dF9hY2wgPSAocG9zaXhfYWNsX3hhdHRyX2hlYWRlciAqKWJ1ZmZlcjsKKwlwb3NpeF9hY2xfeGF0dHJfZW50cnkgKmV4dF9lbnRyeSA9IGV4dF9hY2wtPmFfZW50cmllczsKKwlpbnQgcmVhbF9zaXplLCBuOworCisJcmVhbF9zaXplID0gcG9zaXhfYWNsX3hhdHRyX3NpemUoYWNsLT5hX2NvdW50KTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIHJlYWxfc2l6ZTsKKwlpZiAocmVhbF9zaXplID4gc2l6ZSkKKwkJcmV0dXJuIC1FUkFOR0U7CisJCisJZXh0X2FjbC0+YV92ZXJzaW9uID0gY3B1X3RvX2xlMzIoUE9TSVhfQUNMX1hBVFRSX1ZFUlNJT04pOworCisJZm9yIChuPTA7IG4gPCBhY2wtPmFfY291bnQ7IG4rKywgZXh0X2VudHJ5KyspIHsKKwkJZXh0X2VudHJ5LT5lX3RhZyAgPSBjcHVfdG9fbGUxNihhY2wtPmFfZW50cmllc1tuXS5lX3RhZyk7CisJCWV4dF9lbnRyeS0+ZV9wZXJtID0gY3B1X3RvX2xlMTYoYWNsLT5hX2VudHJpZXNbbl0uZV9wZXJtKTsKKwkJZXh0X2VudHJ5LT5lX2lkICAgPSBjcHVfdG9fbGUzMihhY2wtPmFfZW50cmllc1tuXS5lX2lkKTsKKwl9CisJcmV0dXJuIHJlYWxfc2l6ZTsKK30KK0VYUE9SVF9TWU1CT0wgKHBvc2l4X2FjbF90b194YXR0cik7CmRpZmYgLS1naXQgYS9mcy94ZnMvS2NvbmZpZyBiL2ZzL3hmcy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MjMwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvS2NvbmZpZwpAQCAtMCwwICsxLDg1IEBACittZW51ICJYRlMgc3VwcG9ydCIKKworY29uZmlnIFhGU19GUworCXRyaXN0YXRlICJYRlMgZmlsZXN5c3RlbSBzdXBwb3J0IgorCXNlbGVjdCBFWFBPUlRGUyBpZiBORlNEIT1uCisJaGVscAorCSAgWEZTIGlzIGEgaGlnaCBwZXJmb3JtYW5jZSBqb3VybmFsaW5nIGZpbGVzeXN0ZW0gd2hpY2ggb3JpZ2luYXRlZAorCSAgb24gdGhlIFNHSSBJUklYIHBsYXRmb3JtLiAgSXQgaXMgY29tcGxldGVseSBtdWx0aS10aHJlYWRlZCwgY2FuCisJICBzdXBwb3J0IGxhcmdlIGZpbGVzIGFuZCBsYXJnZSBmaWxlc3lzdGVtcywgZXh0ZW5kZWQgYXR0cmlidXRlcywKKwkgIHZhcmlhYmxlIGJsb2NrIHNpemVzLCBpcyBleHRlbnQgYmFzZWQsIGFuZCBtYWtlcyBleHRlbnNpdmUgdXNlIG9mCisJICBCdHJlZXMgKGRpcmVjdG9yaWVzLCBleHRlbnRzLCBmcmVlIHNwYWNlKSB0byBhaWQgYm90aCBwZXJmb3JtYW5jZQorCSAgYW5kIHNjYWxhYmlsaXR5LgorCisJICBSZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBhdCA8aHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL3hmcy8+CisJICBmb3IgY29tcGxldGUgZGV0YWlscy4gIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgb24tZGlzayBjb21wYXRpYmxlCisJICB3aXRoIHRoZSBJUklYIHZlcnNpb24gb2YgWEZTLgorCisJICBUbyBjb21waWxlIHRoaXMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgeGZzLiAgQmUgYXdhcmUsIGhvd2V2ZXIsIHRoYXQgaWYgdGhlIGZpbGUKKwkgIHN5c3RlbSBvZiB5b3VyIHJvb3QgcGFydGl0aW9uIGlzIGNvbXBpbGVkIGFzIGEgbW9kdWxlLCB5b3UnbGwgbmVlZAorCSAgdG8gdXNlIGFuIGluaXRpYWwgcmFtZGlzayAoaW5pdHJkKSB0byBib290LgorCitjb25maWcgWEZTX0VYUE9SVAorCWJvb2wKKwlkZWZhdWx0IHkgaWYgWEZTX0ZTICYmIEVYUE9SVEZTCisKK2NvbmZpZyBYRlNfUlQKKwlib29sICJSZWFsdGltZSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gWEZTX0ZTICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGJlIGFibGUgdG8gbW91bnQgYW5kIHVzZSBYRlMgZmlsZXN5c3RlbXMKKwkgIHdoaWNoIGNvbnRhaW4gYSByZWFsdGltZSBzdWJ2b2x1bWUuIFRoZSByZWFsdGltZSBzdWJ2b2x1bWUgaXMgYQorCSAgc2VwYXJhdGUgYXJlYSBvZiBkaXNrIHNwYWNlIHdoZXJlIG9ubHkgZmlsZSBkYXRhIGlzIHN0b3JlZC4gVGhlCisJICByZWFsdGltZSBzdWJ2b2x1bWUgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSB2ZXJ5IGRldGVybWluaXN0aWMKKwkgIGRhdGEgcmF0ZXMgc3VpdGFibGUgZm9yIG1lZGlhIHN0cmVhbWluZyBhcHBsaWNhdGlvbnMuCisKKwkgIFNlZSB0aGUgeGZzIG1hbiBwYWdlIGluIHNlY3Rpb24gNSBmb3IgYSBiaXQgbW9yZSBpbmZvcm1hdGlvbi4KKworCSAgVGhpcyBmZWF0dXJlIGlzIHVuc3VwcG9ydGVkIGF0IHRoaXMgdGltZSwgaXMgbm90IHlldCBmdWxseQorCSAgZnVuY3Rpb25hbCwgYW5kIG1heSBjYXVzZSBzZXJpb3VzIHByb2JsZW1zLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgWEZTX1FVT1RBCisJYm9vbCAiUXVvdGEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFhGU19GUworCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNldCBsaW1pdHMgZm9yIGRpc2sgdXNhZ2Ugb24KKwkgIGEgcGVyIHVzZXIgYW5kL29yIGEgcGVyIGdyb3VwIGJhc2lzIHVuZGVyIFhGUy4gIFhGUyBjb25zaWRlcnMgcXVvdGEKKwkgIGluZm9ybWF0aW9uIGFzIGZpbGVzeXN0ZW0gbWV0YWRhdGEgYW5kIHVzZXMgam91cm5hbGluZyB0byBwcm92aWRlIGEKKwkgIGhpZ2hlciBsZXZlbCBndWFyYW50ZWUgb2YgY29uc2lzdGVuY3kuICBUaGUgb24tZGlzayBkYXRhIGZvcm1hdCBmb3IKKwkgIHF1b3RhIGlzIGFsc28gY29tcGF0aWJsZSB3aXRoIHRoZSBJUklYIHZlcnNpb24gb2YgWEZTLCBhbGxvd2luZyBhCisJICBmaWxlc3lzdGVtIHRvIGJlIG1pZ3JhdGVkIGJldHdlZW4gTGludXggYW5kIElSSVggd2l0aG91dCBhbnkgbmVlZAorCSAgZm9yIGNvbnZlcnNpb24uCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uICBNb3JlIGNvbXByZWhlbnNpdmUgZG9jdW1lbnRhdGlvbiBjYW4gYmUgZm91bmQgaW4KKwkgIFJFQURNRS5xdW90YSBpbiB0aGUgeGZzcHJvZ3MgcGFja2FnZS4gIFhGUyBxdW90YSBjYW4gYmUgdXNlZCBlaXRoZXIKKwkgIHdpdGggb3Igd2l0aG91dCB0aGUgZ2VuZXJpYyBxdW90YSBzdXBwb3J0IGVuYWJsZWQgKENPTkZJR19RVU9UQSkgLQorCSAgdGhleSBhcmUgY29tcGxldGVseSBpbmRlcGVuZGVudCBzdWJzeXN0ZW1zLgorCitjb25maWcgWEZTX1NFQ1VSSVRZCisJYm9vbCAiU2VjdXJpdHkgTGFiZWwgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFhGU19GUworCWhlbHAKKwkgIFNlY3VyaXR5IGxhYmVscyBzdXBwb3J0IGFsdGVybmF0aXZlIGFjY2VzcyBjb250cm9sIG1vZGVscworCSAgaW1wbGVtZW50ZWQgYnkgc2VjdXJpdHkgbW9kdWxlcyBsaWtlIFNFTGludXguICBUaGlzIG9wdGlvbgorCSAgZW5hYmxlcyBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgbmFtZXNwYWNlIGZvciBpbm9kZSBzZWN1cml0eQorCSAgbGFiZWxzIGluIHRoZSBYRlMgZmlsZXN5c3RlbS4KKworCSAgSWYgeW91IGFyZSBub3QgdXNpbmcgYSBzZWN1cml0eSBtb2R1bGUgdGhhdCByZXF1aXJlcyB1c2luZworCSAgZXh0ZW5kZWQgYXR0cmlidXRlcyBmb3IgaW5vZGUgc2VjdXJpdHkgbGFiZWxzLCBzYXkgTi4KKworY29uZmlnIFhGU19QT1NJWF9BQ0wKKwlib29sICJQT1NJWCBBQ0wgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFhGU19GUworCWhlbHAKKwkgIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzIChBQ0xzKSBzdXBwb3J0IHBlcm1pc3Npb25zIGZvciB1c2VycyBhbmQKKwkgIGdyb3VwcyBiZXlvbmQgdGhlIG93bmVyL2dyb3VwL3dvcmxkIHNjaGVtZS4KKworCSAgVG8gbGVhcm4gbW9yZSBhYm91dCBBY2Nlc3MgQ29udHJvbCBMaXN0cywgdmlzaXQgdGhlIFBPU0lYIEFDTHMgZm9yCisJICBMaW51eCB3ZWJzaXRlIDxodHRwOi8vYWNsLmJlc3RiaXRzLmF0Lz4uCisKKwkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgQWNjZXNzIENvbnRyb2wgTGlzdHMgYXJlLCBzYXkgTi4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZnMveGZzL01ha2VmaWxlIGIvZnMveGZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NGU0YTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvTWFrZWZpbGUKQEAgLTAsMCArMSwxNTAgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorIworIyBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyMgZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisjIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyMgb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorIyBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisjIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorIyBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisjIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisjCisjIGh0dHA6Ly93d3cuc2dpLmNvbQorIworIyBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyMKKyMgaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworIworCitFWFRSQV9DRkxBR1MgKz0JIC1JZnMveGZzIC1JZnMveGZzL2xpbnV4LTIuNiAtZnVuc2lnbmVkLWNoYXIKKworaWZlcSAoJChDT05GSUdfWEZTX0RFQlVHKSx5KQorCUVYVFJBX0NGTEFHUyArPSAtZyAtRFNUQVRJQz0iIiAtRERFQlVHCisJRVhUUkFfQ0ZMQUdTICs9IC1EUEFHRUJVRl9MT0NLX1RSQUNLSU5HCitlbmRpZgoraWZlcSAoJChDT05GSUdfWEZTX1RSQUNFKSx5KQorCUVYVFJBX0NGTEFHUyArPSAtRFhGU19BTExPQ19UUkFDRQorCUVYVFJBX0NGTEFHUyArPSAtRFhGU19BVFRSX1RSQUNFCisJRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0JMSV9UUkFDRQorCUVYVFJBX0NGTEFHUyArPSAtRFhGU19CTUFQX1RSQUNFCisJRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0JNQlRfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLURYRlNfRElSX1RSQUNFCisJRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0RJUjJfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLURYRlNfRFFVT1RfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLURYRlNfSUxPQ0tfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLURYRlNfTE9HX1RSQUNFCisJRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX1JXX1RSQUNFCisJRVhUUkFfQ0ZMQUdTICs9IC1EUEFHRUJVRl9UUkFDRQorCSMgRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX1ZOT0RFX1RSQUNFCitlbmRpZgorCitvYmotJChDT05GSUdfWEZTX0ZTKQkJKz0geGZzLm8KKworeGZzLSQoQ09ORklHX1hGU19RVU9UQSkJCSs9ICQoYWRkcHJlZml4IHF1b3RhLywgXAorCQkJCSAgIHhmc19kcXVvdC5vIFwKKwkJCQkgICB4ZnNfZHF1b3RfaXRlbS5vIFwKKwkJCQkgICB4ZnNfdHJhbnNfZHF1b3QubyBcCisJCQkJICAgeGZzX3FtX3N5c2NhbGxzLm8gXAorCQkJCSAgIHhmc19xbV9iaHYubyBcCisJCQkJICAgeGZzX3FtLm8pCitpZmVxICgkKENPTkZJR19YRlNfUVVPVEEpLHkpCit4ZnMtJChDT05GSUdfUFJPQ19GUykJCSs9IHF1b3RhL3hmc19xbV9zdGF0cy5vCitlbmRpZgorCit4ZnMtJChDT05GSUdfWEZTX1JUKQkJKz0geGZzX3J0YWxsb2MubworeGZzLSQoQ09ORklHX1hGU19QT1NJWF9BQ0wpCSs9IHhmc19hY2wubworeGZzLSQoQ09ORklHX1BST0NfRlMpCQkrPSBsaW51eC0yLjYveGZzX3N0YXRzLm8KK3hmcy0kKENPTkZJR19TWVNDVEwpCQkrPSBsaW51eC0yLjYveGZzX3N5c2N0bC5vCit4ZnMtJChDT05GSUdfQ09NUEFUKQkJKz0gbGludXgtMi42L3hmc19pb2N0bDMyLm8KK3hmcy0kKENPTkZJR19YRlNfRVhQT1JUKQkrPSBsaW51eC0yLjYveGZzX2V4cG9ydC5vCisKKworeGZzLXkJCQkJKz0geGZzX2FsbG9jLm8gXAorCQkJCSAgIHhmc19hbGxvY19idHJlZS5vIFwKKwkJCQkgICB4ZnNfYXR0ci5vIFwKKwkJCQkgICB4ZnNfYXR0cl9sZWFmLm8gXAorCQkJCSAgIHhmc19iZWhhdmlvci5vIFwKKwkJCQkgICB4ZnNfYml0Lm8gXAorCQkJCSAgIHhmc19ibWFwLm8gXAorCQkJCSAgIHhmc19ibWFwX2J0cmVlLm8gXAorCQkJCSAgIHhmc19idHJlZS5vIFwKKwkJCQkgICB4ZnNfYnVmX2l0ZW0ubyBcCisJCQkJICAgeGZzX2RhX2J0cmVlLm8gXAorCQkJCSAgIHhmc19kaXIubyBcCisJCQkJICAgeGZzX2RpcjIubyBcCisJCQkJICAgeGZzX2RpcjJfYmxvY2subyBcCisJCQkJICAgeGZzX2RpcjJfZGF0YS5vIFwKKwkJCQkgICB4ZnNfZGlyMl9sZWFmLm8gXAorCQkJCSAgIHhmc19kaXIyX25vZGUubyBcCisJCQkJICAgeGZzX2RpcjJfc2YubyBcCisJCQkJICAgeGZzX2Rpcl9sZWFmLm8gXAorCQkJCSAgIHhmc19lcnJvci5vIFwKKwkJCQkgICB4ZnNfZXh0ZnJlZV9pdGVtLm8gXAorCQkJCSAgIHhmc19mc29wcy5vIFwKKwkJCQkgICB4ZnNfaWFsbG9jLm8gXAorCQkJCSAgIHhmc19pYWxsb2NfYnRyZWUubyBcCisJCQkJICAgeGZzX2lnZXQubyBcCisJCQkJICAgeGZzX2lub2RlLm8gXAorCQkJCSAgIHhmc19pbm9kZV9pdGVtLm8gXAorCQkJCSAgIHhmc19pb2NvcmUubyBcCisJCQkJICAgeGZzX2lvbWFwLm8gXAorCQkJCSAgIHhmc19pdGFibGUubyBcCisJCQkJICAgeGZzX2RmcmFnLm8gXAorCQkJCSAgIHhmc19sb2cubyBcCisJCQkJICAgeGZzX2xvZ19yZWNvdmVyLm8gXAorCQkJCSAgIHhmc19tYWNyb3MubyBcCisJCQkJICAgeGZzX21vdW50Lm8gXAorCQkJCSAgIHhmc19yZW5hbWUubyBcCisJCQkJICAgeGZzX3RyYW5zLm8gXAorCQkJCSAgIHhmc190cmFuc19haWwubyBcCisJCQkJICAgeGZzX3RyYW5zX2J1Zi5vIFwKKwkJCQkgICB4ZnNfdHJhbnNfZXh0ZnJlZS5vIFwKKwkJCQkgICB4ZnNfdHJhbnNfaW5vZGUubyBcCisJCQkJICAgeGZzX3RyYW5zX2l0ZW0ubyBcCisJCQkJICAgeGZzX3V0aWxzLm8gXAorCQkJCSAgIHhmc192ZnNvcHMubyBcCisJCQkJICAgeGZzX3Zub2Rlb3BzLm8gXAorCQkJCSAgIHhmc19ydy5vIFwKKwkJCQkgICB4ZnNfZG1vcHMubyBcCisJCQkJICAgeGZzX3Ftb3BzLm8KKworeGZzLSQoQ09ORklHX1hGU19UUkFDRSkJCSs9IHhmc19kaXIyX3RyYWNlLm8KKworIyBPYmplY3RzIGluIGxpbnV4LTIuNi8KK3hmcy15CQkJCSs9ICQoYWRkcHJlZml4IGxpbnV4LTIuNi8sIFwKKwkJCQkgICBrbWVtLm8gXAorCQkJCSAgIHhmc19hb3BzLm8gXAorCQkJCSAgIHhmc19idWYubyBcCisJCQkJICAgeGZzX2ZpbGUubyBcCisJCQkJICAgeGZzX2ZzX3N1YnIubyBcCisJCQkJICAgeGZzX2dsb2JhbHMubyBcCisJCQkJICAgeGZzX2lvY3RsLm8gXAorCQkJCSAgIHhmc19pb3BzLm8gXAorCQkJCSAgIHhmc19scncubyBcCisJCQkJICAgeGZzX3N1cGVyLm8gXAorCQkJCSAgIHhmc192ZnMubyBcCisJCQkJICAgeGZzX3Zub2RlLm8pCisKKyMgT2JqZWN0cyBpbiBzdXBwb3J0LworeGZzLXkJCQkJKz0gJChhZGRwcmVmaXggc3VwcG9ydC8sIFwKKwkJCQkgICBkZWJ1Zy5vIFwKKwkJCQkgICBtb3ZlLm8gXAorCQkJCSAgIHFzb3J0Lm8gXAorCQkJCSAgIHV1aWQubykKKworeGZzLSQoQ09ORklHX1hGU19UUkFDRSkJCSs9IHN1cHBvcnQva3RyYWNlLm8KKwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi9rbWVtLmMgYi9mcy94ZnMvbGludXgtMi42L2ttZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjRlYThjCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi9rbWVtLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisKKyNpbmNsdWRlICJ0aW1lLmgiCisjaW5jbHVkZSAia21lbS5oIgorCisjZGVmaW5lIE1BWF9WTUFMTE9DUwk2CisjZGVmaW5lIE1BWF9TTEFCX1NJWkUJMHgyMDAwMAorCisKK3ZvaWQgKgora21lbV9hbGxvYyhzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWludAlyZXRyaWVzID0gMDsKKwlpbnQJbGZsYWdzID0ga21lbV9mbGFnc19jb252ZXJ0KGZsYWdzKTsKKwl2b2lkCSpwdHI7CisKKwlkbyB7CisJCWlmIChzaXplIDwgTUFYX1NMQUJfU0laRSB8fCByZXRyaWVzID4gTUFYX1ZNQUxMT0NTKQorCQkJcHRyID0ga21hbGxvYyhzaXplLCBsZmxhZ3MpOworCQllbHNlCisJCQlwdHIgPSBfX3ZtYWxsb2Moc2l6ZSwgbGZsYWdzLCBQQUdFX0tFUk5FTCk7CisJCWlmIChwdHIgfHwgKGZsYWdzICYgKEtNX01BWUZBSUx8S01fTk9TTEVFUCkpKQorCQkJcmV0dXJuIHB0cjsKKwkJaWYgKCEoKytyZXRyaWVzICUgMTAwKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiWEZTOiBwb3NzaWJsZSBtZW1vcnkgYWxsb2NhdGlvbiAiCisJCQkJCSJkZWFkbG9jayBpbiAlcyAobW9kZToweCV4KVxuIiwKKwkJCQkJX19GVU5DVElPTl9fLCBsZmxhZ3MpOworCQlibGtfY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi81MCk7CisJfSB3aGlsZSAoMSk7Cit9CisKK3ZvaWQgKgora21lbV96YWxsb2Moc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwl2b2lkCSpwdHI7CisKKwlwdHIgPSBrbWVtX2FsbG9jKHNpemUsIGZsYWdzKTsKKwlpZiAocHRyKQorCQltZW1zZXQoKGNoYXIgKilwdHIsIDAsIChpbnQpc2l6ZSk7CisJcmV0dXJuIHB0cjsKK30KKwordm9pZAora21lbV9mcmVlKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisJaWYgKCgodW5zaWduZWQgbG9uZylwdHIgPCBWTUFMTE9DX1NUQVJUKSB8fAorCSAgICAoKHVuc2lnbmVkIGxvbmcpcHRyID49IFZNQUxMT0NfRU5EKSkgeworCQlrZnJlZShwdHIpOworCX0gZWxzZSB7CisJCXZmcmVlKHB0cik7CisJfQorfQorCit2b2lkICoKK2ttZW1fcmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBuZXdzaXplLCBzaXplX3Qgb2xkc2l6ZSwgaW50IGZsYWdzKQoreworCXZvaWQJKm5ldzsKKworCW5ldyA9IGttZW1fYWxsb2MobmV3c2l6ZSwgZmxhZ3MpOworCWlmIChwdHIpIHsKKwkJaWYgKG5ldykKKwkJCW1lbWNweShuZXcsIHB0ciwKKwkJCQkoKG9sZHNpemUgPCBuZXdzaXplKSA/IG9sZHNpemUgOiBuZXdzaXplKSk7CisJCWttZW1fZnJlZShwdHIsIG9sZHNpemUpOworCX0KKwlyZXR1cm4gbmV3OworfQorCit2b2lkICoKK2ttZW1fem9uZV9hbGxvYyhrbWVtX3pvbmVfdCAqem9uZSwgaW50IGZsYWdzKQoreworCWludAlyZXRyaWVzID0gMDsKKwlpbnQJbGZsYWdzID0ga21lbV9mbGFnc19jb252ZXJ0KGZsYWdzKTsKKwl2b2lkCSpwdHI7CisKKwlkbyB7CisJCXB0ciA9IGttZW1fY2FjaGVfYWxsb2Moem9uZSwgbGZsYWdzKTsKKwkJaWYgKHB0ciB8fCAoZmxhZ3MgJiAoS01fTUFZRkFJTHxLTV9OT1NMRUVQKSkpCisJCQlyZXR1cm4gcHRyOworCQlpZiAoISgrK3JldHJpZXMgJSAxMDApKQorCQkJcHJpbnRrKEtFUk5fRVJSICJYRlM6IHBvc3NpYmxlIG1lbW9yeSBhbGxvY2F0aW9uICIKKwkJCQkJImRlYWRsb2NrIGluICVzIChtb2RlOjB4JXgpXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIGxmbGFncyk7CisJCWJsa19jb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzUwKTsKKwl9IHdoaWxlICgxKTsKK30KKwordm9pZCAqCitrbWVtX3pvbmVfemFsbG9jKGttZW1fem9uZV90ICp6b25lLCBpbnQgZmxhZ3MpCit7CisJdm9pZAkqcHRyOworCisJcHRyID0ga21lbV96b25lX2FsbG9jKHpvbmUsIGZsYWdzKTsKKwlpZiAocHRyKQorCQltZW1zZXQoKGNoYXIgKilwdHIsIDAsIGttZW1fY2FjaGVfc2l6ZSh6b25lKSk7CisJcmV0dXJuIHB0cjsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYva21lbS5oIGIvZnMveGZzL2xpbnV4LTIuNi9rbWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM5N2I2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYva21lbS5oCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19TVVBQT1JUX0tNRU1fSF9fCisjZGVmaW5lIF9fWEZTX1NVUFBPUlRfS01FTV9IX18KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKy8qCisgKiBtZW1vcnkgbWFuYWdlbWVudCByb3V0aW5lcworICovCisjZGVmaW5lIEtNX1NMRUVQCTB4MDAwMQorI2RlZmluZSBLTV9OT1NMRUVQCTB4MDAwMgorI2RlZmluZSBLTV9OT0ZTCQkweDAwMDQKKyNkZWZpbmUgS01fTUFZRkFJTAkweDAwMDgKKworI2RlZmluZQlrbWVtX3pvbmUJa21lbV9jYWNoZV9zCisjZGVmaW5lIGttZW1fem9uZV90CWttZW1fY2FjaGVfdAorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgeGZzX3BmbGFnc190OworCisjZGVmaW5lIFBGTEFHU19URVNUX05PSU8oKSAgICAgICAgICAgICAgKGN1cnJlbnQtPmZsYWdzICYgUEZfTk9JTykKKyNkZWZpbmUgUEZMQUdTX1RFU1RfRlNUUkFOUygpICAgICAgICAgICAoY3VycmVudC0+ZmxhZ3MgJiBQRl9GU1RSQU5TKQorCisjZGVmaW5lIFBGTEFHU19TRVRfTk9JTygpIGRvIHsJCVwKKwljdXJyZW50LT5mbGFncyB8PSBQRl9OT0lPOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFBGTEFHU19DTEVBUl9OT0lPKCkgZG8gewlcCisJY3VycmVudC0+ZmxhZ3MgJj0gflBGX05PSU87CVwKK30gd2hpbGUgKDApCisKKy8qIHRoZXNlIGNvdWxkIGJlIG5lc3RlZCwgc28gd2Ugc2F2ZSBzdGF0ZSAqLworI2RlZmluZSBQRkxBR1NfU0VUX0ZTVFJBTlMoU1RBVEVQKSBkbyB7CVwKKwkqKFNUQVRFUCkgPSBjdXJyZW50LT5mbGFnczsJXAorCWN1cnJlbnQtPmZsYWdzIHw9IFBGX0ZTVFJBTlM7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUEZMQUdTX0NMRUFSX0ZTVFJBTlMoU1RBVEVQKSBkbyB7IFwKKwkqKFNUQVRFUCkgPSBjdXJyZW50LT5mbGFnczsJXAorCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9GU1RSQU5TOwlcCit9IHdoaWxlICgwKQorCisvKiBSZXN0b3JlIHRoZSBQRl9GU1RSQU5TIHN0YXRlIHRvIHdoYXQgd2FzIHNhdmVkIGluIFNUQVRFUCAqLworI2RlZmluZSBQRkxBR1NfUkVTVE9SRV9GU1RSQU5TKFNUQVRFUCkgZG8geyAgICAgCQlcCisJY3VycmVudC0+ZmxhZ3MgPSAoKGN1cnJlbnQtPmZsYWdzICYgflBGX0ZTVFJBTlMpIHwJXAorCQkJICAoKihTVEFURVApICYgUEZfRlNUUkFOUykpOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBQRkxBR1NfRFVQKE9TVEFURVAsIE5TVEFURVApIGRvIHsgXAorCSooTlNUQVRFUCkgPSAqKE9TVEFURVApOwlcCit9IHdoaWxlICgwKQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50IGttZW1fZmxhZ3NfY29udmVydChpbnQgZmxhZ3MpCit7CisJaW50CWxmbGFncyA9IF9fR0ZQX05PV0FSTjsJLyogd2UnbGwgcmVwb3J0IHByb2JsZW1zLCBpZiBuZWVkIGJlICovCisKKyNpZmRlZiBERUJVRworCWlmICh1bmxpa2VseShmbGFncyAmIH4oS01fU0xFRVB8S01fTk9TTEVFUHxLTV9OT0ZTfEtNX01BWUZBSUwpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAiWEZTOiBtZW1vcnkgYWxsb2NhdGlvbiB3aXRoIHdyb25nIGZsYWdzICgleClcbiIsIGZsYWdzKTsKKwkJQlVHKCk7CisJfQorI2VuZGlmCisKKwlpZiAoZmxhZ3MgJiBLTV9OT1NMRUVQKSB7CisJCWxmbGFncyB8PSBHRlBfQVRPTUlDOworCX0gZWxzZSB7CisJCWxmbGFncyB8PSBHRlBfS0VSTkVMOworCisJCS8qIGF2b2lkIHJlY3VzaXZlIGNhbGxiYWNrcyB0byBmaWxlc3lzdGVtIGR1cmluZyB0cmFuc2FjdGlvbnMgKi8KKwkJaWYgKFBGTEFHU19URVNUX0ZTVFJBTlMoKSB8fCAoZmxhZ3MgJiBLTV9OT0ZTKSkKKwkJCWxmbGFncyAmPSB+X19HRlBfRlM7CisJfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGxmbGFnczsKK30KKworc3RhdGljIF9faW5saW5lIGttZW1fem9uZV90ICoKK2ttZW1fem9uZV9pbml0KGludCBzaXplLCBjaGFyICp6b25lX25hbWUpCit7CisJcmV0dXJuIGttZW1fY2FjaGVfY3JlYXRlKHpvbmVfbmFtZSwgc2l6ZSwgMCwgMCwgTlVMTCwgTlVMTCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitrbWVtX3pvbmVfZnJlZShrbWVtX3pvbmVfdCAqem9uZSwgdm9pZCAqcHRyKQoreworCWttZW1fY2FjaGVfZnJlZSh6b25lLCBwdHIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAora21lbV96b25lX2Rlc3Ryb3koa21lbV96b25lX3QgKnpvbmUpCit7CisJaWYgKHpvbmUgJiYga21lbV9jYWNoZV9kZXN0cm95KHpvbmUpKQorCQlCVUcoKTsKK30KKworZXh0ZXJuIHZvaWQJICAgICprbWVtX3pvbmVfemFsbG9jKGttZW1fem9uZV90ICosIGludCk7CitleHRlcm4gdm9pZAkgICAgKmttZW1fem9uZV9hbGxvYyhrbWVtX3pvbmVfdCAqLCBpbnQpOworCitleHRlcm4gdm9pZAkgICAgKmttZW1fYWxsb2Moc2l6ZV90LCBpbnQpOworZXh0ZXJuIHZvaWQJICAgICprbWVtX3JlYWxsb2Modm9pZCAqLCBzaXplX3QsIHNpemVfdCwgaW50KTsKK2V4dGVybiB2b2lkCSAgICAqa21lbV96YWxsb2Moc2l6ZV90LCBpbnQpOworZXh0ZXJuIHZvaWQgICAgICAgICBrbWVtX2ZyZWUodm9pZCAqLCBzaXplX3QpOworCit0eXBlZGVmIHN0cnVjdCBzaHJpbmtlciAqa21lbV9zaGFrZXJfdDsKK3R5cGVkZWYgaW50ICgqa21lbV9zaGFrZV9mdW5jX3QpKGludCwgdW5zaWduZWQgaW50KTsKKworc3RhdGljIF9faW5saW5lIGttZW1fc2hha2VyX3QKK2ttZW1fc2hha2VfcmVnaXN0ZXIoa21lbV9zaGFrZV9mdW5jX3Qgc2Z1bmMpCit7CisJcmV0dXJuIHNldF9zaHJpbmtlcihERUZBVUxUX1NFRUtTLCBzZnVuYyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitrbWVtX3NoYWtlX2RlcmVnaXN0ZXIoa21lbV9zaGFrZXJfdCBzaHJpbmtlcikKK3sKKwlyZW1vdmVfc2hyaW5rZXIoc2hyaW5rZXIpOworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitrbWVtX3NoYWtlX2FsbG93KHVuc2lnbmVkIGludCBnZnBfbWFzaykKK3sKKwlyZXR1cm4gKGdmcF9tYXNrICYgX19HRlBfV0FJVCk7Cit9CisKKyNlbmRpZiAvKiBfX1hGU19TVVBQT1JUX0tNRU1fSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L21ybG9jay5oIGIvZnMveGZzL2xpbnV4LTIuNi9tcmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmMxMWEwCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi9tcmxvY2suaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfU1VQUE9SVF9NUkxPQ0tfSF9fCisjZGVmaW5lIF9fWEZTX1NVUFBPUlRfTVJMT0NLX0hfXworCisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKworZW51bSB7IE1SX05PTkUsIE1SX0FDQ0VTUywgTVJfVVBEQVRFIH07CisKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3Qgcndfc2VtYXBob3JlCW1yX2xvY2s7CisJaW50CQkJbXJfd3JpdGVyOworfSBtcmxvY2tfdDsKKworI2RlZmluZSBtcmluaXQobXJwLCBuYW1lKQlcCisJKCAobXJwKS0+bXJfd3JpdGVyID0gMCwgaW5pdF9yd3NlbSgmKG1ycCktPm1yX2xvY2spICkKKyNkZWZpbmUgbXJsb2NrX2luaXQobXJwLCB0LG4scykJbXJpbml0KG1ycCwgbikKKyNkZWZpbmUgbXJmcmVlKG1ycCkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgbXJhY2Nlc3MobXJwKQkJbXJhY2Nlc3NmKG1ycCwgMCkKKyNkZWZpbmUgbXJ1cGRhdGUobXJwKQkJbXJ1cGRhdGVmKG1ycCwgMCkKKworc3RhdGljIGlubGluZSB2b2lkIG1yYWNjZXNzZihtcmxvY2tfdCAqbXJwLCBpbnQgZmxhZ3MpCit7CisJZG93bl9yZWFkKCZtcnAtPm1yX2xvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXJ1cGRhdGVmKG1ybG9ja190ICptcnAsIGludCBmbGFncykKK3sKKwlkb3duX3dyaXRlKCZtcnAtPm1yX2xvY2spOworCW1ycC0+bXJfd3JpdGVyID0gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXJ0cnlhY2Nlc3MobXJsb2NrX3QgKm1ycCkKK3sKKwlyZXR1cm4gZG93bl9yZWFkX3RyeWxvY2soJm1ycC0+bXJfbG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1ydHJ5dXBkYXRlKG1ybG9ja190ICptcnApCit7CisJaWYgKCFkb3duX3dyaXRlX3RyeWxvY2soJm1ycC0+bXJfbG9jaykpCisJCXJldHVybiAwOworCW1ycC0+bXJfd3JpdGVyID0gMTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1ydW5sb2NrKG1ybG9ja190ICptcnApCit7CisJaWYgKG1ycC0+bXJfd3JpdGVyKSB7CisJCW1ycC0+bXJfd3JpdGVyID0gMDsKKwkJdXBfd3JpdGUoJm1ycC0+bXJfbG9jayk7CisJfSBlbHNlIHsKKwkJdXBfcmVhZCgmbXJwLT5tcl9sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcmRlbW90ZShtcmxvY2tfdCAqbXJwKQoreworCW1ycC0+bXJfd3JpdGVyID0gMDsKKwlkb3duZ3JhZGVfd3JpdGUoJm1ycC0+bXJfbG9jayk7Cit9CisKKyNpZmRlZiBERUJVRworLyoKKyAqIERlYnVnLW9ubHkgcm91dGluZSwgd2l0aG91dCBzb21lIHBsYXRmb3JtLXNwZWNpZmljIGFzbSBjb2RlLCB3ZSBjYW4KKyAqIG5vdyBvbmx5IGFuc3dlciByZXF1ZXN0cyByZWdhcmRpbmcgd2hldGhlciB3ZSBob2xkIHRoZSBsb2NrIGZvciB3cml0ZQorICogKHJlYWRlciBzdGF0ZSBpcyBvdXRzaWRlIG91ciB2aXNpYmlsaXR5LCB3ZSBvbmx5IHRyYWNrIHdyaXRlciBzdGF0ZSkuCisgKiBOb3RlOiBtZWFucyAhaXNtcmxvY2tlZCB3b3VsZCBnaXZlIGZhbHNlIHBvc2l0aXZpZXMsIHNvIGRvbid0IGRvIHRoYXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzbXJsb2NrZWQobXJsb2NrX3QgKm1ycCwgaW50IHR5cGUpCit7CisJaWYgKG1ycCAmJiB0eXBlID09IE1SX1VQREFURSkKKwkJcmV0dXJuIG1ycC0+bXJfd3JpdGVyOworCXJldHVybiAxOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1hGU19TVVBQT1JUX01STE9DS19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYvbXV0ZXguaCBiL2ZzL3hmcy9saW51eC0yLjYvbXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjI5NmJiCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi9tdXRleC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX1NVUFBPUlRfTVVURVhfSF9fCisjZGVmaW5lIF9fWEZTX1NVUFBPUlRfTVVURVhfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworLyoKKyAqIE1hcCB0aGUgbXV0ZXgnZXMgZnJvbSBJUklYIHRvIExpbnV4IHNlbWFwaG9yZXMuCisgKgorICogRGVzdHJveSBqdXN0IHNpbXBseSBpbml0aWFsaXplcyB0byAtOTkgd2hpY2ggc2hvdWxkIGJsb2NrIGFsbCBvdGhlcgorICogY2FsbGVycy4KKyAqLworI2RlZmluZSBNVVRFWF9ERUZBVUxUCQkweDAKK3R5cGVkZWYgc3RydWN0IHNlbWFwaG9yZQltdXRleF90OworCisjZGVmaW5lIG11dGV4X2luaXQobG9jaywgdHlwZSwgbmFtZSkJCXNlbWFfaW5pdChsb2NrLCAxKQorI2RlZmluZSBtdXRleF9kZXN0cm95KGxvY2spCQkJc2VtYV9pbml0KGxvY2ssIC05OSkKKyNkZWZpbmUgbXV0ZXhfbG9jayhsb2NrLCBudW0pCQkJZG93bihsb2NrKQorI2RlZmluZSBtdXRleF90cnlsb2NrKGxvY2spCQkJKGRvd25fdHJ5bG9jayhsb2NrKSA/IDAgOiAxKQorI2RlZmluZSBtdXRleF91bmxvY2sobG9jaykJCQl1cChsb2NrKQorCisjZW5kaWYgLyogX19YRlNfU1VQUE9SVF9NVVRFWF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYvc2VtYS5oIGIvZnMveGZzL2xpbnV4LTIuNi9zZW1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBiNjdiNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYvc2VtYS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX1NVUFBPUlRfU0VNQV9IX18KKyNkZWZpbmUgX19YRlNfU1VQUE9SVF9TRU1BX0hfXworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisvKgorICogc2VtYV90IHN0cnVjdHVyZSBqdXN0IG1hcHMgdG8gc3RydWN0IHNlbWFwaG9yZSBpbiBMaW51eCBrZXJuZWwuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc2VtYXBob3JlIHNlbWFfdDsKKworI2RlZmluZSBpbml0X3NlbWEoc3AsIHZhbCwgYywgZCkJc2VtYV9pbml0KHNwLCB2YWwpCisjZGVmaW5lIGluaXRzZW1hKHNwLCB2YWwpCQlzZW1hX2luaXQoc3AsIHZhbCkKKyNkZWZpbmUgaW5pdG5zZW1hKHNwLCB2YWwsIG5hbWUpCXNlbWFfaW5pdChzcCwgdmFsKQorI2RlZmluZSBwc2VtYShzcCwgYikJCQlkb3duKHNwKQorI2RlZmluZSB2c2VtYShzcCkJCQl1cChzcCkKKyNkZWZpbmUgdmFsdXNlbWEoc3ApCQkJKGF0b21pY19yZWFkKCYoc3ApLT5jb3VudCkpCisjZGVmaW5lIGZyZWVzZW1hKHNlbWEpCisKKy8qCisgKiBNYXAgY3BzZW1hICh0cnkgdG8gZ2V0IHRoZSBzZW1hKSB0byBkb3duX3RyeWxvY2suIFdlIG5lZWQgdG8gc3dpdGNoCisgKiB0aGUgcmV0dXJuIHZhbHVlcyBzaW5jZSBjcHNlbWEgcmV0dXJucyAxIChhY3F1aXJlZCkgMCAoZmFpbGVkKSBhbmQKKyAqIGRvd25fdHJ5bG9jayByZXR1cm5zIHRoZSByZXZlcnNlIDAgKGFjcXVpcmVkKSAxIChmYWlsZWQpLgorICovCisKKyNkZWZpbmUgY3BzZW1hKHNwKQkJCShkb3duX3RyeWxvY2soc3ApID8gMCA6IDEpCisKKy8qCisgKiBEaWRuJ3QgZG8gY3ZzZW1hKHNwKS4gTm90IHN1cmUgaG93IHRvIG1hcCB0aGlzIHRvIHVwL2Rvd24vLi4uCisgKiBJdCBkb2VzIGEgdnNlbWEgaWYgdGhlIHZhbHVlcyBpcyA8IDAgb3RoZXIgd2lzZSBub3RoaW5nLgorICovCisKKyNlbmRpZiAvKiBfX1hGU19TVVBQT1JUX1NFTUFfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3NwaW4uaCBiL2ZzL3hmcy9saW51eC0yLjYvc3Bpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjYwYTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3NwaW4uaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19TVVBQT1JUX1NQSU5fSF9fCisjZGVmaW5lIF9fWEZTX1NVUFBPUlRfU1BJTl9IX18KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIHByZWVtcHQgbmVlZHMgdGhpcyAqLworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKy8qCisgKiBNYXAgbG9ja190IGZyb20gSVJJWCB0byBMaW51eCBzcGlubG9ja3MuCisgKgorICogV2UgZG8gbm90IG1ha2UgdXNlIG9mIGxvY2tfdCBmcm9tIGludGVycnVwdCBjb250ZXh0LCBzbyB3ZSBkbyBub3QKKyAqIGhhdmUgdG8gd29ycnkgYWJvdXQgZGlzYWJsaW5nIGludGVycnVwdHMgYXQgYWxsICh1bmxpa2UgSVJJWCkuCisgKi8KKwordHlwZWRlZiBzcGlubG9ja190IGxvY2tfdDsKKworI2RlZmluZSBTUExERUNMKHMpCQkJdW5zaWduZWQgbG9uZyBzCisKKyNkZWZpbmUgc3BpbmxvY2tfaW5pdChsb2NrLCBuYW1lKQlzcGluX2xvY2tfaW5pdChsb2NrKQorI2RlZmluZQlzcGlubG9ja19kZXN0cm95KGxvY2spCisjZGVmaW5lIG11dGV4X3NwaW5sb2NrKGxvY2spCQkoeyBzcGluX2xvY2sobG9jayk7IDA7IH0pCisjZGVmaW5lIG11dGV4X3NwaW51bmxvY2sobG9jaywgcykJZG8geyBzcGluX3VubG9jayhsb2NrKTsgKHZvaWQpczsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgbmVzdGVkX3NwaW5sb2NrKGxvY2spCQlzcGluX2xvY2sobG9jaykKKyNkZWZpbmUgbmVzdGVkX3NwaW51bmxvY2sobG9jaykJCXNwaW5fdW5sb2NrKGxvY2spCisKKyNlbmRpZiAvKiBfX1hGU19TVVBQT1JUX1NQSU5fSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3N2LmggYi9mcy94ZnMvbGludXgtMi42L3N2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIxZDMxNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYvc3YuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19TVVBQT1JUX1NWX0hfXworI2RlZmluZSBfX1hGU19TVVBQT1JUX1NWX0hfXworCisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworLyoKKyAqIFN5bmNocm9uaXNhdGlvbiB2YXJpYWJsZXMuCisgKgorICogKFBhcmFtZXRlcnMgInByaSIsICJzdmYiIGFuZCAicnRzIiBhcmUgbm90IGltcGxlbWVudGVkKQorICovCisKK3R5cGVkZWYgc3RydWN0IHN2X3MgeworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRlcnM7Cit9IHN2X3Q7CisKKyNkZWZpbmUgU1ZfRklGTwkJMHgwCQkvKiBzdl90IGlzIEZJRk8gdHlwZSAqLworI2RlZmluZSBTVl9MSUZPCQkweDIJCS8qIHN2X3QgaXMgTElGTyB0eXBlICovCisjZGVmaW5lIFNWX1BSSU8JCTB4NAkJLyogc3ZfdCBpcyBQUklPIHR5cGUgKi8KKyNkZWZpbmUgU1ZfS0VZRUQJMHg2CQkvKiBzdl90IGlzIEtFWUVEIHR5cGUgKi8KKyNkZWZpbmUgU1ZfREVGQVVMVCAgICAgIFNWX0ZJRk8KKworCitzdGF0aWMgaW5saW5lIHZvaWQgX3N2X3dhaXQoc3ZfdCAqc3YsIHNwaW5sb2NrX3QgKmxvY2ssIGludCBzdGF0ZSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJYWRkX3dhaXRfcXVldWVfZXhjbHVzaXZlKCZzdi0+d2FpdGVycywgJndhaXQpOworCV9fc2V0X2N1cnJlbnRfc3RhdGUoc3RhdGUpOworCXNwaW5fdW5sb2NrKGxvY2spOworCisJc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKworCXJlbW92ZV93YWl0X3F1ZXVlKCZzdi0+d2FpdGVycywgJndhaXQpOworfQorCisjZGVmaW5lIGluaXRfc3Yoc3YsdHlwZSxuYW1lLGZsYWcpIFwKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCYoc3YpLT53YWl0ZXJzKQorI2RlZmluZSBzdl9pbml0KHN2LGZsYWcsbmFtZSkgXAorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJihzdiktPndhaXRlcnMpCisjZGVmaW5lIHN2X2Rlc3Ryb3koc3YpIFwKKwkvKk5PVEhJTkcqLworI2RlZmluZSBzdl93YWl0KHN2LCBwcmksIGxvY2ssIHMpIFwKKwlfc3Zfd2FpdChzdiwgbG9jaywgVEFTS19VTklOVEVSUlVQVElCTEUsIE1BWF9TQ0hFRFVMRV9USU1FT1VUKQorI2RlZmluZSBzdl93YWl0X3NpZyhzdiwgcHJpLCBsb2NrLCBzKSAgIFwKKwlfc3Zfd2FpdChzdiwgbG9jaywgVEFTS19JTlRFUlJVUFRJQkxFLCBNQVhfU0NIRURVTEVfVElNRU9VVCkKKyNkZWZpbmUgc3ZfdGltZWR3YWl0KHN2LCBwcmksIGxvY2ssIHMsIHN2ZiwgdHMsIHJ0cykgXAorCV9zdl93YWl0KHN2LCBsb2NrLCBUQVNLX1VOSU5URVJSVVBUSUJMRSwgdGltZXNwZWNfdG9famlmZmllcyh0cykpCisjZGVmaW5lIHN2X3RpbWVkd2FpdF9zaWcoc3YsIHByaSwgbG9jaywgcywgc3ZmLCB0cywgcnRzKSBcCisJX3N2X3dhaXQoc3YsIGxvY2ssIFRBU0tfSU5URVJSVVBUSUJMRSwgdGltZXNwZWNfdG9famlmZmllcyh0cykpCisjZGVmaW5lIHN2X3NpZ25hbChzdikgXAorCXdha2VfdXAoJihzdiktPndhaXRlcnMpCisjZGVmaW5lIHN2X2Jyb2FkY2FzdChzdikgXAorCXdha2VfdXBfYWxsKCYoc3YpLT53YWl0ZXJzKQorCisjZW5kaWYgLyogX19YRlNfU1VQUE9SVF9TVl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYvdGltZS5oIGIvZnMveGZzL2xpbnV4LTIuNi90aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2ZmQwZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYvdGltZS5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX1NVUFBPUlRfVElNRV9IX18KKyNkZWZpbmUgX19YRlNfU1VQUE9SVF9USU1FX0hfXworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKK3R5cGVkZWYgc3RydWN0IHRpbWVzcGVjIHRpbWVzcGVjX3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxheShsb25nIHRpY2tzKQoreworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlzY2hlZHVsZV90aW1lb3V0KHRpY2tzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5hbm90aW1lKHN0cnVjdCB0aW1lc3BlYyAqdHZwKQoreworCSp0dnAgPSBDVVJSRU5UX1RJTUU7Cit9CisKKyNlbmRpZiAvKiBfX1hGU19TVVBQT1JUX1RJTUVfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZhODQ3NQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYwpAQCAtMCwwICsxLDEyNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuCSBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKyNpbmNsdWRlICJ4ZnNfaW9tYXAuaCIKKyNpbmNsdWRlIDxsaW51eC9tcGFnZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgorCitTVEFUSUMgdm9pZCB4ZnNfY291bnRfcGFnZV9zdGF0ZShzdHJ1Y3QgcGFnZSAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK1NUQVRJQyB2b2lkIHhmc19jb252ZXJ0X3BhZ2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBwYWdlICosIHhmc19pb21hcF90ICosCisJCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLCB2b2lkICosIGludCwgaW50KTsKKworI2lmIGRlZmluZWQoWEZTX1JXX1RSQUNFKQordm9pZAoreGZzX3BhZ2VfdHJhY2UoCisJaW50CQl0YWcsCisJc3RydWN0IGlub2RlCSppbm9kZSwKKwlzdHJ1Y3QgcGFnZQkqcGFnZSwKKwlpbnQJCW1hc2spCit7CisJeGZzX2lub2RlX3QJKmlwOworCWJodl9kZXNjX3QJKmJkcDsKKwl2bm9kZV90CQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKwlsb2ZmX3QJCWlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCWxvZmZfdAkJb2Zmc2V0ID0gKGxvZmZfdClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCWludAkJZGVsYWxsb2MgPSAtMSwgdW5tYXBwZWQgPSAtMSwgdW53cml0dGVuID0gLTE7CisKKwlpZiAocGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwkJeGZzX2NvdW50X3BhZ2Vfc3RhdGUocGFnZSwgJmRlbGFsbG9jLCAmdW5tYXBwZWQsICZ1bndyaXR0ZW4pOworCisJYmRwID0gdm5fYmh2X2xvb2t1cChWTl9CSFZfSEVBRCh2cCksICZ4ZnNfdm5vZGVvcHMpOworCWlwID0gWEZTX0JIVlRPSShiZHApOworCWlmICghaXAtPmlfcnd0cmFjZSkKKwkJcmV0dXJuOworCisJa3RyYWNlX2VudGVyKGlwLT5pX3J3dHJhY2UsCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKXRhZyksCisJCSh2b2lkICopaXAsCisJCSh2b2lkICopaW5vZGUsCisJCSh2b2lkICopcGFnZSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpbWFzayksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKSgoaXAtPmlfZC5kaV9zaXplID4+IDMyKSAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGlwLT5pX2QuZGlfc2l6ZSAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKChpc2l6ZSA+PiAzMikgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShpc2l6ZSAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKChvZmZzZXQgPj4gMzIpICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykob2Zmc2V0ICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZylkZWxhbGxvYyksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKXVubWFwcGVkKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdW53cml0dGVuKSwKKwkJKHZvaWQgKilOVUxMLAorCQkodm9pZCAqKU5VTEwpOworfQorI2Vsc2UKKyNkZWZpbmUgeGZzX3BhZ2VfdHJhY2UodGFnLCBpbm9kZSwgcGFnZSwgbWFzaykKKyNlbmRpZgorCit2b2lkCitsaW52ZnNfdW53cml0dGVuX2RvbmUoCisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaCwKKwlpbnQJCQl1cHRvZGF0ZSkKK3sKKwl4ZnNfYnVmX3QJCSpwYiA9ICh4ZnNfYnVmX3QgKiliaC0+Yl9wcml2YXRlOworCisJQVNTRVJUKGJ1ZmZlcl91bndyaXR0ZW4oYmgpKTsKKwliaC0+Yl9lbmRfaW8gPSBOVUxMOworCWNsZWFyX2J1ZmZlcl91bndyaXR0ZW4oYmgpOworCWlmICghdXB0b2RhdGUpCisJCXBhZ2VidWZfaW9lcnJvcihwYiwgRUlPKTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcGItPnBiX2lvX3JlbWFpbmluZykgPT0gMSkgeworCQlwYWdlYnVmX2lvZG9uZShwYiwgMSwgMSk7CisJfQorCWVuZF9idWZmZXJfYXN5bmNfd3JpdGUoYmgsIHVwdG9kYXRlKTsKK30KKworLyoKKyAqIElzc3VlIHRyYW5zYWN0aW9ucyB0byBjb252ZXJ0IGEgYnVmZmVyIHJhbmdlIGZyb20gdW53cml0dGVuCisgKiB0byB3cml0dGVuIGV4dGVudHMgKGJ1ZmZlcmVkIElPKS4KKyAqLworU1RBVElDIHZvaWQKK2xpbnZmc191bndyaXR0ZW5fY29udmVydCgKKwl4ZnNfYnVmX3QJKmJwKQoreworCXZub2RlX3QJCSp2cCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB2bm9kZV90ICopOworCWludAkJZXJyb3I7CisKKwlCVUdfT04oYXRvbWljX3JlYWQoJmJwLT5wYl9ob2xkKSA8IDEpOworCVZPUF9CTUFQKHZwLCBYRlNfQlVGX09GRlNFVChicCksIFhGU19CVUZfU0laRShicCksCisJCQlCTUFQSV9VTldSSVRURU4sIE5VTEwsIE5VTEwsIGVycm9yKTsKKwlYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIE5VTEwpOworCVhGU19CVUZfQ0xSX0lPRE9ORV9GVU5DKGJwKTsKKwlYRlNfQlVGX1VOREFUQUlPKGJwKTsKKwlpcHV0KExJTlZGU19HRVRfSVAodnApKTsKKwlwYWdlYnVmX2lvZG9uZShicCwgMCwgMCk7Cit9CisKKy8qCisgKiBJc3N1ZSB0cmFuc2FjdGlvbnMgdG8gY29udmVydCBhIGJ1ZmZlciByYW5nZSBmcm9tIHVud3JpdHRlbgorICogdG8gd3JpdHRlbiBleHRlbnRzIChkaXJlY3QgSU8pLgorICovCitTVEFUSUMgdm9pZAorbGludmZzX3Vud3JpdHRlbl9jb252ZXJ0X2RpcmVjdCgKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlLAorCWxvZmZfdAkJb2Zmc2V0LAorCXNzaXplX3QJCXNpemUsCisJdm9pZAkJKnByaXZhdGUpCit7CisJQVNTRVJUKCFwcml2YXRlIHx8IGlub2RlID09IChzdHJ1Y3QgaW5vZGUgKilwcml2YXRlKTsKKworCS8qIHByaXZhdGUgaW5kaWNhdGVzIGFuIHVud3JpdHRlbiBleHRlbnQgbGF5IGJlbmVhdGggdGhpcyBJTyAqLworCWlmIChwcml2YXRlICYmIHNpemUgPiAwKSB7CisJCXZub2RlX3QJKnZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CisJCWludAllcnJvcjsKKworCQlWT1BfQk1BUCh2cCwgb2Zmc2V0LCBzaXplLCBCTUFQSV9VTldSSVRURU4sIE5VTEwsIE5VTEwsIGVycm9yKTsKKwl9Cit9CisKK1NUQVRJQyBpbnQKK3hmc19tYXBfYmxvY2tzKAorCXN0cnVjdCBpbm9kZQkJKmlub2RlLAorCWxvZmZfdAkJCW9mZnNldCwKKwlzc2l6ZV90CQkJY291bnQsCisJeGZzX2lvbWFwX3QJCSptYXBwLAorCWludAkJCWZsYWdzKQoreworCXZub2RlX3QJCQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKwlpbnQJCQllcnJvciwgbm1hcHMgPSAxOworCisJVk9QX0JNQVAodnAsIG9mZnNldCwgY291bnQsIGZsYWdzLCBtYXBwLCAmbm1hcHMsIGVycm9yKTsKKwlpZiAoIWVycm9yICYmIChmbGFncyAmIChCTUFQSV9XUklURXxCTUFQSV9BTExPQ0FURSkpKQorCQlWTU9ESUZZKHZwKTsKKwlyZXR1cm4gLWVycm9yOworfQorCisvKgorICogRmluZHMgdGhlIGNvcnJlc3BvbmRpbmcgbWFwcGluZyBpbiBibG9jayBAbWFwIGFycmF5IG9mIHRoZQorICogZ2l2ZW4gQG9mZnNldCB3aXRoaW4gYSBAcGFnZS4KKyAqLworU1RBVElDIHhmc19pb21hcF90ICoKK3hmc19vZmZzZXRfdG9fbWFwKAorCXN0cnVjdCBwYWdlCQkqcGFnZSwKKwl4ZnNfaW9tYXBfdAkJKmlvbWFwcCwKKwl1bnNpZ25lZCBsb25nCQlvZmZzZXQpCit7CisJbG9mZl90CQkJZnVsbF9vZmZzZXQ7CS8qIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGZpbGUgKi8KKworCUFTU0VSVChvZmZzZXQgPCBQQUdFX0NBQ0hFX1NJWkUpOworCisJZnVsbF9vZmZzZXQgPSBwYWdlLT5pbmRleDsJCS8qIE5COiB1c2luZyA2NGJpdCBudW1iZXIgKi8KKwlmdWxsX29mZnNldCA8PD0gUEFHRV9DQUNIRV9TSElGVDsJLyogb2Zmc2V0IGZyb20gZmlsZSBzdGFydCAqLworCWZ1bGxfb2Zmc2V0ICs9IG9mZnNldDsJCQkvKiBvZmZzZXQgZnJvbSBwYWdlIHN0YXJ0ICovCisKKwlpZiAoZnVsbF9vZmZzZXQgPCBpb21hcHAtPmlvbWFwX29mZnNldCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGlvbWFwcC0+aW9tYXBfb2Zmc2V0ICsgKGlvbWFwcC0+aW9tYXBfYnNpemUgLTEpID49IGZ1bGxfb2Zmc2V0KQorCQlyZXR1cm4gaW9tYXBwOworCXJldHVybiBOVUxMOworfQorCitTVEFUSUMgdm9pZAoreGZzX21hcF9hdF9vZmZzZXQoCisJc3RydWN0IHBhZ2UJCSpwYWdlLAorCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsCisJdW5zaWduZWQgbG9uZwkJb2Zmc2V0LAorCWludAkJCWJsb2NrX2JpdHMsCisJeGZzX2lvbWFwX3QJCSppb21hcHApCit7CisJeGZzX2RhZGRyX3QJCWJuOworCWxvZmZfdAkJCWRlbHRhOworCWludAkJCXNlY3Rvcl9zaGlmdDsKKworCUFTU0VSVCghKGlvbWFwcC0+aW9tYXBfZmxhZ3MgJiBJT01BUF9IT0xFKSk7CisJQVNTRVJUKCEoaW9tYXBwLT5pb21hcF9mbGFncyAmIElPTUFQX0RFTEFZKSk7CisJQVNTRVJUKGlvbWFwcC0+aW9tYXBfYm4gIT0gSU9NQVBfREFERFJfTlVMTCk7CisKKwlkZWx0YSA9IHBhZ2UtPmluZGV4OworCWRlbHRhIDw8PSBQQUdFX0NBQ0hFX1NISUZUOworCWRlbHRhICs9IG9mZnNldDsKKwlkZWx0YSAtPSBpb21hcHAtPmlvbWFwX29mZnNldDsKKwlkZWx0YSA+Pj0gYmxvY2tfYml0czsKKworCXNlY3Rvcl9zaGlmdCA9IGJsb2NrX2JpdHMgLSBCQlNISUZUOworCWJuID0gaW9tYXBwLT5pb21hcF9ibiA+PiBzZWN0b3Jfc2hpZnQ7CisJYm4gKz0gZGVsdGE7CisJQlVHX09OKCFibiAmJiAhKGlvbWFwcC0+aW9tYXBfZmxhZ3MgJiBJT01BUF9SRUFMVElNRSkpOworCUFTU0VSVCgoYm4gPDwgc2VjdG9yX3NoaWZ0KSA+PSBpb21hcHAtPmlvbWFwX2JuKTsKKworCWxvY2tfYnVmZmVyKGJoKTsKKwliaC0+Yl9ibG9ja25yID0gYm47CisJYmgtPmJfYmRldiA9IGlvbWFwcC0+aW9tYXBfdGFyZ2V0LT5wYnJfYmRldjsKKwlzZXRfYnVmZmVyX21hcHBlZChiaCk7CisJY2xlYXJfYnVmZmVyX2RlbGF5KGJoKTsKK30KKworLyoKKyAqIExvb2sgZm9yIGEgcGFnZSBhdCBpbmRleCB3aGljaCBpcyB1bmxvY2tlZCBhbmQgY29udGFpbnMgb3VyCisgKiB1bndyaXR0ZW4gZXh0ZW50IGZsYWdnZWQgYnVmZmVycyBhdCBpdHMgaGVhZC4gIFJldHVybnMgcGFnZQorICogbG9ja2VkIGFuZCB3aXRoIGFuIGV4dHJhIHJlZmVyZW5jZSBjb3VudCwgYW5kIGxlbmd0aCBvZiB0aGUKKyAqIHVud3JpdHRlbiBleHRlbnQgY29tcG9uZW50IG9uIHRoaXMgcGFnZSB0aGF0IHdlIGNhbiB3cml0ZSwKKyAqIGluIHVuaXRzIG9mIGZpbGVzeXN0ZW0gYmxvY2tzLgorICovCitTVEFUSUMgc3RydWN0IHBhZ2UgKgoreGZzX3Byb2JlX3Vud3JpdHRlbl9wYWdlKAorCXN0cnVjdCBhZGRyZXNzX3NwYWNlCSptYXBwaW5nLAorCXBnb2ZmX3QJCQlpbmRleCwKKwl4ZnNfaW9tYXBfdAkJKmlvbWFwcCwKKwl4ZnNfYnVmX3QJCSpwYiwKKwl1bnNpZ25lZCBsb25nCQltYXhfb2Zmc2V0LAorCXVuc2lnbmVkIGxvbmcJCSpmc2JzLAorCXVuc2lnbmVkIGludCAgICAgICAgICAgIGJiaXRzKQoreworCXN0cnVjdCBwYWdlCQkqcGFnZTsKKworCXBhZ2UgPSBmaW5kX3RyeWxvY2tfcGFnZShtYXBwaW5nLCBpbmRleCk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkKKwkJZ290byBvdXQ7CisKKwlpZiAocGFnZS0+bWFwcGluZyAmJiBwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsICpoZWFkOworCQl1bnNpZ25lZCBsb25nCQlwX29mZnNldCA9IDA7CisKKwkJKmZzYnMgPSAwOworCQliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJCWRvIHsKKwkJCWlmICghYnVmZmVyX3Vud3JpdHRlbihiaCkgfHwgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQkJYnJlYWs7CisJCQlpZiAoIXhmc19vZmZzZXRfdG9fbWFwKHBhZ2UsIGlvbWFwcCwgcF9vZmZzZXQpKQorCQkJCWJyZWFrOworCQkJaWYgKHBfb2Zmc2V0ID49IG1heF9vZmZzZXQpCisJCQkJYnJlYWs7CisJCQl4ZnNfbWFwX2F0X29mZnNldChwYWdlLCBiaCwgcF9vZmZzZXQsIGJiaXRzLCBpb21hcHApOworCQkJc2V0X2J1ZmZlcl91bndyaXR0ZW5faW8oYmgpOworCQkJYmgtPmJfcHJpdmF0ZSA9IHBiOworCQkJcF9vZmZzZXQgKz0gYmgtPmJfc2l6ZTsKKwkJCSgqZnNicykrKzsKKwkJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKworCQlpZiAocF9vZmZzZXQpCisJCQlyZXR1cm4gcGFnZTsKKwl9CisKK291dDoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIExvb2sgZm9yIGEgcGFnZSBhdCBpbmRleCB3aGljaCBpcyB1bmxvY2tlZCBhbmQgbm90IG1hcHBlZAorICogeWV0IC0gY2x1c3RlcmluZyBmb3IgbW1hcCB3cml0ZSBjYXNlLgorICovCitTVEFUSUMgdW5zaWduZWQgaW50Cit4ZnNfcHJvYmVfdW5tYXBwZWRfcGFnZSgKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZQkqbWFwcGluZywKKwlwZ29mZl90CQkJaW5kZXgsCisJdW5zaWduZWQgaW50CQlwZ19vZmZzZXQpCit7CisJc3RydWN0IHBhZ2UJCSpwYWdlOworCWludAkJCXJldCA9IDA7CisKKwlwYWdlID0gZmluZF90cnlsb2NrX3BhZ2UobWFwcGluZywgaW5kZXgpOworCWlmICghcGFnZSkKKwkJcmV0dXJuIDA7CisJaWYgKFBhZ2VXcml0ZWJhY2socGFnZSkpCisJCWdvdG8gb3V0OworCisJaWYgKHBhZ2UtPm1hcHBpbmcgJiYgUGFnZURpcnR5KHBhZ2UpKSB7CisJCWlmIChwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLCAqaGVhZDsKKworCQkJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCQkJZG8geworCQkJCWlmIChidWZmZXJfbWFwcGVkKGJoKSB8fCAhYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCQkJYnJlYWs7CisJCQkJcmV0ICs9IGJoLT5iX3NpemU7CisJCQkJaWYgKHJldCA+PSBwZ19vZmZzZXQpCisJCQkJCWJyZWFrOworCQkJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKwkJfSBlbHNlCisJCQlyZXQgPSBQQUdFX0NBQ0hFX1NJWkU7CisJfQorCitvdXQ6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIHJldDsKK30KKworU1RBVElDIHVuc2lnbmVkIGludAoreGZzX3Byb2JlX3VubWFwcGVkX2NsdXN0ZXIoCisJc3RydWN0IGlub2RlCQkqaW5vZGUsCisJc3RydWN0IHBhZ2UJCSpzdGFydHBhZ2UsCisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaCwKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmhlYWQpCit7CisJcGdvZmZfdAkJCXRpbmRleCwgdGxhc3QsIHRsb2ZmOworCXVuc2lnbmVkIGludAkJcGdfb2Zmc2V0LCBsZW4sIHRvdGFsID0gMDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZQkqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisKKwkvKiBGaXJzdCBzdW0gZm9yd2FyZHMgaW4gdGhpcyBwYWdlICovCisJZG8geworCQlpZiAoYnVmZmVyX21hcHBlZChiaCkpCisJCQlicmVhazsKKwkJdG90YWwgKz0gYmgtPmJfc2l6ZTsKKwl9IHdoaWxlICgoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOworCisJLyogSWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBwYWdlLCBzdW0gZm9yd2FyZHMgaW4KKwkgKiBmb2xsb3dpbmcgcGFnZXMuCisJICovCisJaWYgKGJoID09IGhlYWQpIHsKKwkJdGxhc3QgPSBpX3NpemVfcmVhZChpbm9kZSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJLyogUHJ1bmUgdGhpcyBiYWNrIHRvIGF2b2lkIHBhdGhvbG9naWNhbCBiZWhhdmlvciAqLworCQl0bG9mZiA9IG1pbih0bGFzdCwgc3RhcnRwYWdlLT5pbmRleCArIDY0KTsKKwkJZm9yICh0aW5kZXggPSBzdGFydHBhZ2UtPmluZGV4ICsgMTsgdGluZGV4IDwgdGxvZmY7IHRpbmRleCsrKSB7CisJCQlsZW4gPSB4ZnNfcHJvYmVfdW5tYXBwZWRfcGFnZShtYXBwaW5nLCB0aW5kZXgsCisJCQkJCQkJUEFHRV9DQUNIRV9TSVpFKTsKKwkJCWlmICghbGVuKQorCQkJCXJldHVybiB0b3RhbDsKKwkJCXRvdGFsICs9IGxlbjsKKwkJfQorCQlpZiAodGluZGV4ID09IHRsYXN0ICYmCisJCSAgICAocGdfb2Zmc2V0ID0gaV9zaXplX3JlYWQoaW5vZGUpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSkgeworCQkJdG90YWwgKz0geGZzX3Byb2JlX3VubWFwcGVkX3BhZ2UobWFwcGluZywKKwkJCQkJCQl0aW5kZXgsIHBnX29mZnNldCk7CisJCX0KKwl9CisJcmV0dXJuIHRvdGFsOworfQorCisvKgorICogUHJvYmUgZm9yIGEgZ2l2ZW4gcGFnZSAoaW5kZXgpIGluIHRoZSBpbm9kZSBhbmQgdGVzdCBpZiBpdCBpcyBkZWxheWVkCisgKiBhbmQgd2l0aG91dCB1bndyaXR0ZW4gYnVmZmVycy4gIFJldHVybnMgcGFnZSBsb2NrZWQgYW5kIHdpdGggYW4gZXh0cmEKKyAqIHJlZmVyZW5jZSBjb3VudC4KKyAqLworU1RBVElDIHN0cnVjdCBwYWdlICoKK3hmc19wcm9iZV9kZWxhbGxvY19wYWdlKAorCXN0cnVjdCBpbm9kZQkJKmlub2RlLAorCXBnb2ZmX3QJCQlpbmRleCkKK3sKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2U7CisKKwlwYWdlID0gZmluZF90cnlsb2NrX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5kZXgpOworCWlmICghcGFnZSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKFBhZ2VXcml0ZWJhY2socGFnZSkpCisJCWdvdG8gb3V0OworCisJaWYgKHBhZ2UtPm1hcHBpbmcgJiYgcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLCAqaGVhZDsKKwkJaW50CQkJYWNjZXB0YWJsZSA9IDA7CisKKwkJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCQlkbyB7CisJCQlpZiAoYnVmZmVyX3Vud3JpdHRlbihiaCkpIHsKKwkJCQlhY2NlcHRhYmxlID0gMDsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoYnVmZmVyX2RlbGF5KGJoKSkgeworCQkJCWFjY2VwdGFibGUgPSAxOworCQkJfQorCQl9IHdoaWxlICgoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOworCisJCWlmIChhY2NlcHRhYmxlKQorCQkJcmV0dXJuIHBhZ2U7CisJfQorCitvdXQ6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19tYXBfdW53cml0dGVuKAorCXN0cnVjdCBpbm9kZQkJKmlub2RlLAorCXN0cnVjdCBwYWdlCQkqc3RhcnRfcGFnZSwKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmhlYWQsCisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpjdXJyLAorCXVuc2lnbmVkIGxvbmcJCXBfb2Zmc2V0LAorCWludAkJCWJsb2NrX2JpdHMsCisJeGZzX2lvbWFwX3QJCSppb21hcHAsCisJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsCisJaW50CQkJc3RhcnRpbywKKwlpbnQJCQlhbGxfYmgpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaCA9IGN1cnI7CisJeGZzX2lvbWFwX3QJCSp0bXA7CisJeGZzX2J1Zl90CQkqcGI7CisJbG9mZl90CQkJb2Zmc2V0LCBzaXplOworCXVuc2lnbmVkIGxvbmcJCW5ibG9ja3MgPSAwOworCisJb2Zmc2V0ID0gc3RhcnRfcGFnZS0+aW5kZXg7CisJb2Zmc2V0IDw8PSBQQUdFX0NBQ0hFX1NISUZUOworCW9mZnNldCArPSBwX29mZnNldDsKKworCS8qIGdldCBhbiAiZW1wdHkiIHBhZ2VidWYgdG8gbWFuYWdlIElPIGNvbXBsZXRpb24KKwkgKiBQcm9wZXIgdmFsdWVzIHdpbGwgYmUgc2V0IGJlZm9yZSByZXR1cm5pbmcgKi8KKwlwYiA9IHBhZ2VidWZfbG9va3VwKGlvbWFwcC0+aW9tYXBfdGFyZ2V0LCAwLCAwLCAwKTsKKwlpZiAoIXBiKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCS8qIFRha2UgYSByZWZlcmVuY2UgdG8gdGhlIGlub2RlIHRvIHByZXZlbnQgaXQgZnJvbQorCSAqIGJlaW5nIHJlY2xhaW1lZCB3aGlsZSB3ZSBoYXZlIG91dHN0YW5kaW5nIHVud3JpdHRlbgorCSAqIGV4dGVudCBJTyBvbiBpdC4KKwkgKi8KKwlpZiAoKGlncmFiKGlub2RlKSkgIT0gaW5vZGUpIHsKKwkJcGFnZWJ1Zl9mcmVlKHBiKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJLyogU2V0IHRoZSBjb3VudCB0byAxIGluaXRpYWxseSwgdGhpcyB3aWxsIHN0b3AgYW4gSS9PCisJICogY29tcGxldGlvbiBjYWxsb3V0IHdoaWNoIGhhcHBlbnMgYmVmb3JlIHdlIGhhdmUgc3RhcnRlZAorCSAqIGFsbCB0aGUgSS9PIGZyb20gY2FsbGluZyBwYWdlYnVmX2lvZG9uZSB0b28gZWFybHkuCisJICovCisJYXRvbWljX3NldCgmcGItPnBiX2lvX3JlbWFpbmluZywgMSk7CisKKwkvKiBGaXJzdCBtYXAgZm9yd2FyZHMgaW4gdGhlIHBhZ2UgY29uc2VjdXRpdmUgYnVmZmVycworCSAqIGNvdmVyaW5nIHRoaXMgdW53cml0dGVuIGV4dGVudAorCSAqLworCWRvIHsKKwkJaWYgKCFidWZmZXJfdW53cml0dGVuKGJoKSkKKwkJCWJyZWFrOworCQl0bXAgPSB4ZnNfb2Zmc2V0X3RvX21hcChzdGFydF9wYWdlLCBpb21hcHAsIHBfb2Zmc2V0KTsKKwkJaWYgKCF0bXApCisJCQlicmVhazsKKwkJeGZzX21hcF9hdF9vZmZzZXQoc3RhcnRfcGFnZSwgYmgsIHBfb2Zmc2V0LCBibG9ja19iaXRzLCBpb21hcHApOworCQlzZXRfYnVmZmVyX3Vud3JpdHRlbl9pbyhiaCk7CisJCWJoLT5iX3ByaXZhdGUgPSBwYjsKKwkJcF9vZmZzZXQgKz0gYmgtPmJfc2l6ZTsKKwkJbmJsb2NrcysrOworCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisKKwlhdG9taWNfYWRkKG5ibG9ja3MsICZwYi0+cGJfaW9fcmVtYWluaW5nKTsKKworCS8qIElmIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgcGFnZSwgbWFwIGZvcndhcmRzIGluIGFueQorCSAqIGZvbGxvd2luZyBwYWdlcyB3aGljaCBhcmUgYWxzbyBjb3ZlcmVkIGJ5IHRoaXMgZXh0ZW50LgorCSAqLworCWlmIChiaCA9PSBoZWFkKSB7CisJCXN0cnVjdCBhZGRyZXNzX3NwYWNlCSptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwkJcGdvZmZfdAkJCXRpbmRleCwgdGxvZmYsIHRsYXN0OworCQl1bnNpZ25lZCBsb25nCQliczsKKwkJdW5zaWduZWQgaW50CQlwZ19vZmZzZXQsIGJiaXRzID0gaW5vZGUtPmlfYmxrYml0czsKKwkJc3RydWN0IHBhZ2UJCSpwYWdlOworCisJCXRsYXN0ID0gaV9zaXplX3JlYWQoaW5vZGUpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCXRsb2ZmID0gKGlvbWFwcC0+aW9tYXBfb2Zmc2V0ICsgaW9tYXBwLT5pb21hcF9ic2l6ZSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJdGxvZmYgPSBtaW4odGxhc3QsIHRsb2ZmKTsKKwkJZm9yICh0aW5kZXggPSBzdGFydF9wYWdlLT5pbmRleCArIDE7IHRpbmRleCA8IHRsb2ZmOyB0aW5kZXgrKykgeworCQkJcGFnZSA9IHhmc19wcm9iZV91bndyaXR0ZW5fcGFnZShtYXBwaW5nLAorCQkJCQkJdGluZGV4LCBpb21hcHAsIHBiLAorCQkJCQkJUEFHRV9DQUNIRV9TSVpFLCAmYnMsIGJiaXRzKTsKKwkJCWlmICghcGFnZSkKKwkJCQlicmVhazsKKwkJCW5ibG9ja3MgKz0gYnM7CisJCQlhdG9taWNfYWRkKGJzLCAmcGItPnBiX2lvX3JlbWFpbmluZyk7CisJCQl4ZnNfY29udmVydF9wYWdlKGlub2RlLCBwYWdlLCBpb21hcHAsIHdiYywgcGIsCisJCQkJCQkJc3RhcnRpbywgYWxsX2JoKTsKKwkJCS8qIHN0b3AgaWYgY29udmVydGluZyB0aGUgbmV4dCBwYWdlIG1pZ2h0IGFkZAorCQkJICogZW5vdWdoIGJsb2NrcyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIGJ5dGUKKwkJCSAqIGNvdW50IHdvbid0IGZpdCBpbiBvdXIgdWxvbmcgcGFnZSBidWYgbGVuZ3RoICovCisJCQlpZiAobmJsb2NrcyA+PSAoKFVMT05HX01BWCAtIFBBR0VfU0laRSkgPj4gYmxvY2tfYml0cykpCisJCQkJZ290byBlbm91Z2g7CisJCX0KKworCQlpZiAodGluZGV4ID09IHRsYXN0ICYmCisJCSAgICAocGdfb2Zmc2V0ID0gKGlfc2l6ZV9yZWFkKGlub2RlKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkpKSB7CisJCQlwYWdlID0geGZzX3Byb2JlX3Vud3JpdHRlbl9wYWdlKG1hcHBpbmcsCisJCQkJCQkJdGluZGV4LCBpb21hcHAsIHBiLAorCQkJCQkJCXBnX29mZnNldCwgJmJzLCBiYml0cyk7CisJCQlpZiAocGFnZSkgeworCQkJCW5ibG9ja3MgKz0gYnM7CisJCQkJYXRvbWljX2FkZChicywgJnBiLT5wYl9pb19yZW1haW5pbmcpOworCQkJCXhmc19jb252ZXJ0X3BhZ2UoaW5vZGUsIHBhZ2UsIGlvbWFwcCwgd2JjLCBwYiwKKwkJCQkJCQlzdGFydGlvLCBhbGxfYmgpOworCQkJCWlmIChuYmxvY2tzID49ICgoVUxPTkdfTUFYIC0gUEFHRV9TSVpFKSA+PiBibG9ja19iaXRzKSkKKwkJCQkJZ290byBlbm91Z2g7CisJCQl9CisJCX0KKwl9CisKK2Vub3VnaDoKKwlzaXplID0gbmJsb2NrczsJCS8qIE5COiB1c2luZyA2NGJpdCBudW1iZXIgaGVyZSAqLworCXNpemUgPDw9IGJsb2NrX2JpdHM7CS8qIGNvbnZlcnQgZnNiJ3MgdG8gYnl0ZSByYW5nZSAqLworCisJWEZTX0JVRl9EQVRBSU8ocGIpOworCVhGU19CVUZfQVNZTkMocGIpOworCVhGU19CVUZfU0VUX1NJWkUocGIsIHNpemUpOworCVhGU19CVUZfU0VUX0NPVU5UKHBiLCBzaXplKTsKKwlYRlNfQlVGX1NFVF9PRkZTRVQocGIsIG9mZnNldCk7CisJWEZTX0JVRl9TRVRfRlNQUklWQVRFKHBiLCBMSU5WRlNfR0VUX1ZQKGlub2RlKSk7CisJWEZTX0JVRl9TRVRfSU9ET05FX0ZVTkMocGIsIGxpbnZmc191bndyaXR0ZW5fY29udmVydCk7CisKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcGItPnBiX2lvX3JlbWFpbmluZykgPT0gMSkgeworCQlwYWdlYnVmX2lvZG9uZShwYiwgMSwgMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfc3VibWl0X3BhZ2UoCisJc3RydWN0IHBhZ2UJCSpwYWdlLAorCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLAorCXN0cnVjdCBidWZmZXJfaGVhZAkqYmhfYXJyW10sCisJaW50CQkJYmhfY291bnQsCisJaW50CQkJcHJvYmVkX3BhZ2UsCisJaW50CQkJY2xlYXJfZGlydHkpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaDsKKwlpbnQJCQlpOworCisJQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOworCXNldF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwlpZiAoY2xlYXJfZGlydHkpCisJCWNsZWFyX3BhZ2VfZGlydHkocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisKKwlpZiAoYmhfY291bnQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGJoX2NvdW50OyBpKyspIHsKKwkJCWJoID0gYmhfYXJyW2ldOworCQkJbWFya19idWZmZXJfYXN5bmNfd3JpdGUoYmgpOworCQkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpKQorCQkJCXNldF9idWZmZXJfdW53cml0dGVuX2lvKGJoKTsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBiaF9jb3VudDsgaSsrKQorCQkJc3VibWl0X2JoKFdSSVRFLCBiaF9hcnJbaV0pOworCisJCWlmIChwcm9iZWRfcGFnZSAmJiBjbGVhcl9kaXJ0eSkKKwkJCXdiYy0+bnJfdG9fd3JpdGUtLTsJLyogV3JvdGUgYW4gImV4dHJhIiBwYWdlICovCisJfSBlbHNlIHsKKwkJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCQl3YmMtPnBhZ2VzX3NraXBwZWQrKzsJLyogV2UgZGlkbid0IHdyaXRlIHRoaXMgcGFnZSAqLworCX0KK30KKworLyoKKyAqIEFsbG9jYXRlICYgbWFwIGJ1ZmZlcnMgZm9yIHBhZ2UgZ2l2ZW4gdGhlIGV4dGVudCBtYXAuIFdyaXRlIGl0IG91dC4KKyAqIGV4Y2VwdCBmb3IgdGhlIG9yaWdpbmFsIHBhZ2Ugb2YgYSB3cml0ZXBhZ2UsIHRoaXMgaXMgY2FsbGVkIG9uCisgKiBkZWxhbGxvYy91bndyaXR0ZW4gcGFnZXMgb25seSwgZm9yIHRoZSBvcmlnaW5hbCBwYWdlIGl0IGlzIHBvc3NpYmxlCisgKiB0aGF0IHRoZSBwYWdlIGhhcyBubyBtYXBwaW5nIGF0IGFsbC4KKyAqLworU1RBVElDIHZvaWQKK3hmc19jb252ZXJ0X3BhZ2UoCisJc3RydWN0IGlub2RlCQkqaW5vZGUsCisJc3RydWN0IHBhZ2UJCSpwYWdlLAorCXhmc19pb21hcF90CQkqaW9tYXBwLAorCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLAorCXZvaWQJCQkqcHJpdmF0ZSwKKwlpbnQJCQlzdGFydGlvLAorCWludAkJCWFsbF9iaCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoX2FycltNQVhfQlVGX1BFUl9QQUdFXSwgKmJoLCAqaGVhZDsKKwl4ZnNfaW9tYXBfdAkJKm1wID0gaW9tYXBwLCAqdG1wOworCXVuc2lnbmVkIGxvbmcJCWVuZCwgb2Zmc2V0OworCXBnb2ZmX3QJCQllbmRfaW5kZXg7CisJaW50CQkJaSA9IDAsIGluZGV4ID0gMDsKKwlpbnQJCQliYml0cyA9IGlub2RlLT5pX2Jsa2JpdHM7CisKKwllbmRfaW5kZXggPSBpX3NpemVfcmVhZChpbm9kZSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlpZiAocGFnZS0+aW5kZXggPCBlbmRfaW5kZXgpIHsKKwkJZW5kID0gUEFHRV9DQUNIRV9TSVpFOworCX0gZWxzZSB7CisJCWVuZCA9IGlfc2l6ZV9yZWFkKGlub2RlKSAmIChQQUdFX0NBQ0hFX1NJWkUtMSk7CisJfQorCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlkbyB7CisJCW9mZnNldCA9IGkgPDwgYmJpdHM7CisJCWlmIChvZmZzZXQgPj0gZW5kKQorCQkJYnJlYWs7CisJCWlmICghKFBhZ2VVcHRvZGF0ZShwYWdlKSB8fCBidWZmZXJfdXB0b2RhdGUoYmgpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYWxsX2JoICYmCisJCSAgICAhKGJ1ZmZlcl91bndyaXR0ZW4oYmgpIHx8IGJ1ZmZlcl9kZWxheShiaCkpKSB7CisJCQlpZiAoc3RhcnRpbykgeworCQkJCWxvY2tfYnVmZmVyKGJoKTsKKwkJCQliaF9hcnJbaW5kZXgrK10gPSBiaDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCXRtcCA9IHhmc19vZmZzZXRfdG9fbWFwKHBhZ2UsIG1wLCBvZmZzZXQpOworCQlpZiAoIXRtcCkKKwkJCWNvbnRpbnVlOworCQlBU1NFUlQoISh0bXAtPmlvbWFwX2ZsYWdzICYgSU9NQVBfSE9MRSkpOworCQlBU1NFUlQoISh0bXAtPmlvbWFwX2ZsYWdzICYgSU9NQVBfREVMQVkpKTsKKworCQkvKiBJZiB0aGlzIGlzIGEgbmV3IHVud3JpdHRlbiBleHRlbnQgYnVmZmVyIChpLmUuIG9uZQorCQkgKiB0aGF0IHdlIGhhdmVuJ3QgcGFzc2VkIGluIHByaXZhdGUgZGF0YSBmb3IsIHdlIG11c3QKKwkJICogbm93IG1hcCB0aGlzIGJ1ZmZlciB0b28uCisJCSAqLworCQlpZiAoYnVmZmVyX3Vud3JpdHRlbihiaCkgJiYgIWJoLT5iX2VuZF9pbykgeworCQkJQVNTRVJUKHRtcC0+aW9tYXBfZmxhZ3MgJiBJT01BUF9VTldSSVRURU4pOworCQkJeGZzX21hcF91bndyaXR0ZW4oaW5vZGUsIHBhZ2UsIGhlYWQsIGJoLCBvZmZzZXQsCisJCQkJCWJiaXRzLCB0bXAsIHdiYywgc3RhcnRpbywgYWxsX2JoKTsKKwkJfSBlbHNlIGlmICghIChidWZmZXJfdW53cml0dGVuKGJoKSAmJiBidWZmZXJfbG9ja2VkKGJoKSkpIHsKKwkJCXhmc19tYXBfYXRfb2Zmc2V0KHBhZ2UsIGJoLCBvZmZzZXQsIGJiaXRzLCB0bXApOworCQkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpKSB7CisJCQkJc2V0X2J1ZmZlcl91bndyaXR0ZW5faW8oYmgpOworCQkJCWJoLT5iX3ByaXZhdGUgPSBwcml2YXRlOworCQkJCUFTU0VSVChwcml2YXRlKTsKKwkJCX0KKwkJfQorCQlpZiAoc3RhcnRpbykgeworCQkJYmhfYXJyW2luZGV4KytdID0gYmg7CisJCX0gZWxzZSB7CisJCQlzZXRfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCXVubG9ja19idWZmZXIoYmgpOworCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQl9CisJfSB3aGlsZSAoaSsrLCAoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOworCisJaWYgKHN0YXJ0aW8pIHsKKwkJeGZzX3N1Ym1pdF9wYWdlKHBhZ2UsIHdiYywgYmhfYXJyLCBpbmRleCwgMSwgaW5kZXggPT0gaSk7CisJfSBlbHNlIHsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJfQorfQorCisvKgorICogQ29udmVydCAmIHdyaXRlIG91dCBhIGNsdXN0ZXIgb2YgcGFnZXMgaW4gdGhlIHNhbWUgZXh0ZW50IGFzIGRlZmluZWQKKyAqIGJ5IG1wIGFuZCBmb2xsb3dpbmcgdGhlIHN0YXJ0IHBhZ2UuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfY2x1c3Rlcl93cml0ZSgKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKKwlwZ29mZl90CQkJdGluZGV4LAorCXhmc19pb21hcF90CQkqaW9tYXBwLAorCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLAorCWludAkJCXN0YXJ0aW8sCisJaW50CQkJYWxsX2JoLAorCXBnb2ZmX3QJCQl0bGFzdCkKK3sKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2U7CisKKwlmb3IgKDsgdGluZGV4IDw9IHRsYXN0OyB0aW5kZXgrKykgeworCQlwYWdlID0geGZzX3Byb2JlX2RlbGFsbG9jX3BhZ2UoaW5vZGUsIHRpbmRleCk7CisJCWlmICghcGFnZSkKKwkJCWJyZWFrOworCQl4ZnNfY29udmVydF9wYWdlKGlub2RlLCBwYWdlLCBpb21hcHAsIHdiYywgTlVMTCwKKwkJCQlzdGFydGlvLCBhbGxfYmgpOworCX0KK30KKworLyoKKyAqIENhbGxpbmcgdGhpcyB3aXRob3V0IHN0YXJ0aW8gc2V0IG1lYW5zIHdlIGFyZSBiZWluZyBhc2tlZCB0byBtYWtlIGEgZGlydHkKKyAqIHBhZ2UgcmVhZHkgZm9yIGZyZWVpbmcgaXQncyBidWZmZXJzLiAgV2hlbiBjYWxsZWQgd2l0aCBzdGFydGlvIHNldCB0aGVuCisgKiB3ZSBhcmUgY29taW5nIGZyb20gd3JpdGVwYWdlLgorICoKKyAqIFdoZW4gY2FsbGVkIHdpdGggc3RhcnRpbyBzZXQgaXQgaXMgaW1wb3J0YW50IHRoYXQgd2Ugd3JpdGUgdGhlIFdIT0xFCisgKiBwYWdlIGlmIHBvc3NpYmxlLgorICogVGhlIGJoLT5iX3N0YXRlJ3MgY2Fubm90IGtub3cgaWYgYW55IG9mIHRoZSBibG9ja3Mgb3Igd2hpY2ggYmxvY2sgZm9yCisgKiB0aGF0IG1hdHRlciBhcmUgZGlydHkgZHVlIHRvIG1tYXAgd3JpdGVzLCBhbmQgdGhlcmVmb3JlIGJoIHVwdG9kYXRlIGlzCisgKiBvbmx5IHZhaWxkIGlmIHRoZSBwYWdlIGl0c2VsZiBpc24ndCBjb21wbGV0ZWx5IHVwdG9kYXRlLiAgU29tZSBsYXllcnMKKyAqIG1heSBjbGVhciB0aGUgcGFnZSBkaXJ0eSBmbGFnIHByaW9yIHRvIGNhbGxpbmcgd3JpdGUgcGFnZSwgdW5kZXIgdGhlCisgKiBhc3N1bXB0aW9uIHRoZSBlbnRpcmUgcGFnZSB3aWxsIGJlIHdyaXR0ZW4gb3V0OyBieSBub3Qgd3JpdGluZyBvdXQgdGhlCisgKiB3aG9sZSBwYWdlIHRoZSBwYWdlIGNhbiBiZSByZXVzZWQgYmVmb3JlIGFsbCB2YWxpZCBkaXJ0eSBkYXRhIGlzCisgKiB3cml0dGVuIG91dC4gIE5vdGU6IGluIHRoZSBjYXNlIG9mIGEgcGFnZSB0aGF0IGhhcyBiZWVuIGRpcnR5J2QgYnkKKyAqIG1hcHdyaXRlIGFuZCBidXQgcGFydGlhbGx5IHNldHVwIGJ5IGJsb2NrX3ByZXBhcmVfd3JpdGUgdGhlCisgKiBiaC0+Yl9zdGF0ZXMncyB3aWxsIG5vdCBhZ3JlZSBhbmQgb25seSBvbmVzIHNldHVwIGJ5IEJQVy9CQ1cgd2lsbCBoYXZlCisgKiB2YWxpZCBzdGF0ZSwgdGh1cyB0aGUgd2hvbGUgcGFnZSBtdXN0IGJlIHdyaXR0ZW4gb3V0IHRoaW5nLgorICovCisKK1NUQVRJQyBpbnQKK3hmc19wYWdlX3N0YXRlX2NvbnZlcnQoCisJc3RydWN0IGlub2RlCSppbm9kZSwKKwlzdHJ1Y3QgcGFnZQkqcGFnZSwKKwlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywKKwlpbnQJCXN0YXJ0aW8sCisJaW50CQl1bm1hcHBlZCkgLyogYWxzbyBpbXBsaWVzIHBhZ2UgdXB0b2RhdGUgKi8KK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoX2FycltNQVhfQlVGX1BFUl9QQUdFXSwgKmJoLCAqaGVhZDsKKwl4ZnNfaW9tYXBfdAkJKmlvbXAsIGlvbWFwOworCWxvZmZfdAkJCW9mZnNldDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICBwX29mZnNldCA9IDA7CisJX191aW50NjRfdCAgICAgICAgICAgICAgZW5kX29mZnNldDsKKwlwZ29mZl90ICAgICAgICAgICAgICAgICBlbmRfaW5kZXgsIGxhc3RfaW5kZXgsIHRsYXN0OworCWludAkJCWxlbiwgZXJyLCBpLCBjbnQgPSAwLCB1cHRvZGF0ZSA9IDE7CisJaW50CQkJZmxhZ3MgPSBzdGFydGlvID8gMCA6IEJNQVBJX1RSWUxPQ0s7CisJaW50CQkJcGFnZV9kaXJ0eSwgZGVsYWxsb2MgPSAwOworCisJLyogSXMgdGhpcyBwYWdlIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlPyAqLworCW9mZnNldCA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwllbmRfaW5kZXggPSBvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlsYXN0X2luZGV4ID0gKG9mZnNldCAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaWYgKHBhZ2UtPmluZGV4ID49IGVuZF9pbmRleCkgeworCQlpZiAoKHBhZ2UtPmluZGV4ID49IGVuZF9pbmRleCArIDEpIHx8CisJCSAgICAhKGlfc2l6ZV9yZWFkKGlub2RlKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkpIHsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJb2Zmc2V0ID0gKGxvZmZfdClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCWVuZF9vZmZzZXQgPSBtaW5fdCh1bnNpZ25lZCBsb25nIGxvbmcsCisJCQlvZmZzZXQgKyBQQUdFX0NBQ0hFX1NJWkUsIGlfc2l6ZV9yZWFkKGlub2RlKSk7CisKKwliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJaW9tcCA9IE5VTEw7CisKKwkvKgorCSAqIHBhZ2VfZGlydHkgaXMgaW5pdGlhbGx5IGEgY291bnQgb2YgYnVmZmVycyBvbiB0aGUgcGFnZSBhbmQKKwkgKiBpcyBkZWNyZW1lbXRlZCBhcyB3ZSBtb3ZlIGVhY2ggaW50byBhIGNsZWFuYWJsZSBzdGF0ZS4KKwkgKi8KKwlsZW4gPSBiaC0+Yl9zaXplOworCXBhZ2VfZGlydHkgPSBQQUdFX0NBQ0hFX1NJWkUgLyBsZW47CisKKwlkbyB7CisJCWlmIChvZmZzZXQgPj0gZW5kX29mZnNldCkKKwkJCWJyZWFrOworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQl1cHRvZGF0ZSA9IDA7CisJCWlmICghKFBhZ2VVcHRvZGF0ZShwYWdlKSB8fCBidWZmZXJfdXB0b2RhdGUoYmgpKSAmJiAhc3RhcnRpbykKKwkJCWNvbnRpbnVlOworCisJCWlmIChpb21wKSB7CisJCQlpb21wID0geGZzX29mZnNldF90b19tYXAocGFnZSwgJmlvbWFwLCBwX29mZnNldCk7CisJCX0KKworCQkvKgorCQkgKiBGaXJzdCBjYXNlLCBtYXAgYW4gdW53cml0dGVuIGV4dGVudCBhbmQgcHJlcGFyZSBmb3IKKwkJICogZXh0ZW50IHN0YXRlIGNvbnZlcnNpb24gdHJhbnNhY3Rpb24gb24gY29tcGxldGlvbi4KKwkJICovCisJCWlmIChidWZmZXJfdW53cml0dGVuKGJoKSkgeworCQkJaWYgKCFzdGFydGlvKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFpb21wKSB7CisJCQkJZXJyID0geGZzX21hcF9ibG9ja3MoaW5vZGUsIG9mZnNldCwgbGVuLCAmaW9tYXAsCisJCQkJCQlCTUFQSV9SRUFEfEJNQVBJX0lHTlNUQVRFKTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCQkJCWlvbXAgPSB4ZnNfb2Zmc2V0X3RvX21hcChwYWdlLCAmaW9tYXAsCisJCQkJCQkJCXBfb2Zmc2V0KTsKKwkJCX0KKwkJCWlmIChpb21wKSB7CisJCQkJaWYgKCFiaC0+Yl9lbmRfaW8pIHsKKwkJCQkJZXJyID0geGZzX21hcF91bndyaXR0ZW4oaW5vZGUsIHBhZ2UsCisJCQkJCQkJaGVhZCwgYmgsIHBfb2Zmc2V0LAorCQkJCQkJCWlub2RlLT5pX2Jsa2JpdHMsIGlvbXAsCisJCQkJCQkJd2JjLCBzdGFydGlvLCB1bm1hcHBlZCk7CisJCQkJCWlmIChlcnIpIHsKKwkJCQkJCWdvdG8gZXJyb3I7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlzZXRfYml0KEJIX0xvY2ssICZiaC0+Yl9zdGF0ZSk7CisJCQkJfQorCQkJCUJVR19PTighYnVmZmVyX2xvY2tlZChiaCkpOworCQkJCWJoX2FycltjbnQrK10gPSBiaDsKKwkJCQlwYWdlX2RpcnR5LS07CisJCQl9CisJCS8qCisJCSAqIFNlY29uZCBjYXNlLCBhbGxvY2F0ZSBzcGFjZSBmb3IgYSBkZWxhbGxvYyBidWZmZXIuCisJCSAqIFdlIGNhbiByZXR1cm4gRUFHQUlOIGhlcmUgaW4gdGhlIHJlbGVhc2UgcGFnZSBjYXNlLgorCQkgKi8KKwkJfSBlbHNlIGlmIChidWZmZXJfZGVsYXkoYmgpKSB7CisJCQlpZiAoIWlvbXApIHsKKwkJCQlkZWxhbGxvYyA9IDE7CisJCQkJZXJyID0geGZzX21hcF9ibG9ja3MoaW5vZGUsIG9mZnNldCwgbGVuLCAmaW9tYXAsCisJCQkJCQlCTUFQSV9BTExPQ0FURSB8IGZsYWdzKTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCQkJCWlvbXAgPSB4ZnNfb2Zmc2V0X3RvX21hcChwYWdlLCAmaW9tYXAsCisJCQkJCQkJCXBfb2Zmc2V0KTsKKwkJCX0KKwkJCWlmIChpb21wKSB7CisJCQkJeGZzX21hcF9hdF9vZmZzZXQocGFnZSwgYmgsIHBfb2Zmc2V0LAorCQkJCQkJaW5vZGUtPmlfYmxrYml0cywgaW9tcCk7CisJCQkJaWYgKHN0YXJ0aW8pIHsKKwkJCQkJYmhfYXJyW2NudCsrXSA9IGJoOworCQkJCX0gZWxzZSB7CisJCQkJCXNldF9idWZmZXJfZGlydHkoYmgpOworCQkJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJCX0KKwkJCQlwYWdlX2RpcnR5LS07CisJCQl9CisJCX0gZWxzZSBpZiAoKGJ1ZmZlcl91cHRvZGF0ZShiaCkgfHwgUGFnZVVwdG9kYXRlKHBhZ2UpKSAmJgorCQkJICAgKHVubWFwcGVkIHx8IHN0YXJ0aW8pKSB7CisKKwkJCWlmICghYnVmZmVyX21hcHBlZChiaCkpIHsKKwkJCQlpbnQJc2l6ZTsKKworCQkJCS8qCisJCQkJICogR2V0dGluZyBoZXJlIGltcGxpZXMgYW4gdW5tYXBwZWQgYnVmZmVyCisJCQkJICogd2FzIGZvdW5kLCBhbmQgd2UgYXJlIGluIGEgcGF0aCB3aGVyZSB3ZQorCQkJCSAqIG5lZWQgdG8gd3JpdGUgdGhlIHdob2xlIHBhZ2Ugb3V0LgorCQkJCSAqLworCQkJCWlmICghaW9tcCkgeworCQkJCQlzaXplID0geGZzX3Byb2JlX3VubWFwcGVkX2NsdXN0ZXIoCisJCQkJCQkJaW5vZGUsIHBhZ2UsIGJoLCBoZWFkKTsKKwkJCQkJZXJyID0geGZzX21hcF9ibG9ja3MoaW5vZGUsIG9mZnNldCwKKwkJCQkJCQlzaXplLCAmaW9tYXAsCisJCQkJCQkJQk1BUElfV1JJVEV8Qk1BUElfTU1BUCk7CisJCQkJCWlmIChlcnIpIHsKKwkJCQkJCWdvdG8gZXJyb3I7CisJCQkJCX0KKwkJCQkJaW9tcCA9IHhmc19vZmZzZXRfdG9fbWFwKHBhZ2UsICZpb21hcCwKKwkJCQkJCQkJICAgICBwX29mZnNldCk7CisJCQkJfQorCQkJCWlmIChpb21wKSB7CisJCQkJCXhmc19tYXBfYXRfb2Zmc2V0KHBhZ2UsCisJCQkJCQkJYmgsIHBfb2Zmc2V0LAorCQkJCQkJCWlub2RlLT5pX2Jsa2JpdHMsIGlvbXApOworCQkJCQlpZiAoc3RhcnRpbykgeworCQkJCQkJYmhfYXJyW2NudCsrXSA9IGJoOworCQkJCQl9IGVsc2UgeworCQkJCQkJc2V0X2J1ZmZlcl9kaXJ0eShiaCk7CisJCQkJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJCQkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCQkJfQorCQkJCQlwYWdlX2RpcnR5LS07CisJCQkJfQorCQkJfSBlbHNlIGlmIChzdGFydGlvKSB7CisJCQkJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaCkgJiYKKwkJCQkgICAgIXRlc3RfYW5kX3NldF9iaXQoQkhfTG9jaywgJmJoLT5iX3N0YXRlKSkgeworCQkJCQliaF9hcnJbY250KytdID0gYmg7CisJCQkJCXBhZ2VfZGlydHktLTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IHdoaWxlIChvZmZzZXQgKz0gbGVuLCBwX29mZnNldCArPSBsZW4sCisJCSgoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpKTsKKworCWlmICh1cHRvZGF0ZSAmJiBiaCA9PSBoZWFkKQorCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisKKwlpZiAoc3RhcnRpbykKKwkJeGZzX3N1Ym1pdF9wYWdlKHBhZ2UsIHdiYywgYmhfYXJyLCBjbnQsIDAsIDEpOworCisJaWYgKGlvbXApIHsKKwkJdGxhc3QgPSAoaW9tcC0+aW9tYXBfb2Zmc2V0ICsgaW9tcC0+aW9tYXBfYnNpemUgLSAxKSA+PgorCQkJCQlQQUdFX0NBQ0hFX1NISUZUOworCQlpZiAoZGVsYWxsb2MgJiYgKHRsYXN0ID4gbGFzdF9pbmRleCkpCisJCQl0bGFzdCA9IGxhc3RfaW5kZXg7CisJCXhmc19jbHVzdGVyX3dyaXRlKGlub2RlLCBwYWdlLT5pbmRleCArIDEsIGlvbXAsIHdiYywKKwkJCQkJc3RhcnRpbywgdW5tYXBwZWQsIHRsYXN0KTsKKwl9CisKKwlyZXR1cm4gcGFnZV9kaXJ0eTsKKworZXJyb3I6CisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCXVubG9ja19idWZmZXIoYmhfYXJyW2ldKTsKKwl9CisKKwkvKgorCSAqIElmIGl0J3MgZGVsYWxsb2MgYW5kIHdlIGhhdmUgbm93aGVyZSB0byBwdXQgaXQsCisJICogdGhyb3cgaXQgYXdheSwgdW5sZXNzIHRoZSBsb3dlciBsYXllcnMgdG9sZAorCSAqIHVzIHRvIHRyeSBhZ2Fpbi4KKwkgKi8KKwlpZiAoZXJyICE9IC1FQUdBSU4pIHsKKwkJaWYgKCF1bm1hcHBlZCkgeworCQkJYmxvY2tfaW52YWxpZGF0ZXBhZ2UocGFnZSwgMCk7CisJCX0KKwkJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK1NUQVRJQyBpbnQKK19fbGludmZzX2dldF9ibG9jaygKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKKwlzZWN0b3JfdAkJaWJsb2NrLAorCXVuc2lnbmVkIGxvbmcJCWJsb2NrcywKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoX3Jlc3VsdCwKKwlpbnQJCQljcmVhdGUsCisJaW50CQkJZGlyZWN0LAorCWJtYXBpX2ZsYWdzX3QJCWZsYWdzKQoreworCXZub2RlX3QJCQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKwl4ZnNfaW9tYXBfdAkJaW9tYXA7CisJaW50CQkJcmV0cGJibSA9IDE7CisJaW50CQkJZXJyb3I7CisJc3NpemVfdAkJCXNpemU7CisJbG9mZl90CQkJb2Zmc2V0ID0gKGxvZmZfdClpYmxvY2sgPDwgaW5vZGUtPmlfYmxrYml0czsKKworCWlmIChibG9ja3MpCisJCXNpemUgPSBibG9ja3MgPDwgaW5vZGUtPmlfYmxrYml0czsKKwllbHNlCisJCXNpemUgPSAxIDw8IGlub2RlLT5pX2Jsa2JpdHM7CisKKwlWT1BfQk1BUCh2cCwgb2Zmc2V0LCBzaXplLAorCQljcmVhdGUgPyBmbGFncyA6IEJNQVBJX1JFQUQsICZpb21hcCwgJnJldHBiYm0sIGVycm9yKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiAtZXJyb3I7CisKKwlpZiAocmV0cGJibSA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChpb21hcC5pb21hcF9ibiAhPSBJT01BUF9EQUREUl9OVUxMKSB7CisJCXhmc19kYWRkcl90CQlibjsKKwkJbG9mZl90CQkJZGVsdGE7CisKKwkJLyogRm9yIHVud3JpdHRlbiBleHRlbnRzIGRvIG5vdCByZXBvcnQgYSBkaXNrIGFkZHJlc3Mgb24KKwkJICogdGhlIHJlYWQgY2FzZSAodHJlYXQgYXMgaWYgd2UncmUgcmVhZGluZyBpbnRvIGEgaG9sZSkuCisJCSAqLworCQlpZiAoY3JlYXRlIHx8ICEoaW9tYXAuaW9tYXBfZmxhZ3MgJiBJT01BUF9VTldSSVRURU4pKSB7CisJCQlkZWx0YSA9IG9mZnNldCAtIGlvbWFwLmlvbWFwX29mZnNldDsKKwkJCWRlbHRhID4+PSBpbm9kZS0+aV9ibGtiaXRzOworCisJCQlibiA9IGlvbWFwLmlvbWFwX2JuID4+IChpbm9kZS0+aV9ibGtiaXRzIC0gQkJTSElGVCk7CisJCQlibiArPSBkZWx0YTsKKwkJCUJVR19PTighYm4gJiYgIShpb21hcC5pb21hcF9mbGFncyAmIElPTUFQX1JFQUxUSU1FKSk7CisJCQliaF9yZXN1bHQtPmJfYmxvY2tuciA9IGJuOworCQkJc2V0X2J1ZmZlcl9tYXBwZWQoYmhfcmVzdWx0KTsKKwkJfQorCQlpZiAoY3JlYXRlICYmIChpb21hcC5pb21hcF9mbGFncyAmIElPTUFQX1VOV1JJVFRFTikpIHsKKwkJCWlmIChkaXJlY3QpCisJCQkJYmhfcmVzdWx0LT5iX3ByaXZhdGUgPSBpbm9kZTsKKwkJCXNldF9idWZmZXJfdW53cml0dGVuKGJoX3Jlc3VsdCk7CisJCQlzZXRfYnVmZmVyX2RlbGF5KGJoX3Jlc3VsdCk7CisJCX0KKwl9CisKKwkvKiBJZiB0aGlzIGlzIGEgcmVhbHRpbWUgZmlsZSwgZGF0YSBtaWdodCBiZSBvbiBhIG5ldyBkZXZpY2UgKi8KKwliaF9yZXN1bHQtPmJfYmRldiA9IGlvbWFwLmlvbWFwX3RhcmdldC0+cGJyX2JkZXY7CisKKwkvKiBJZiB3ZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBhIGJsb2NrIG91dCBiZXlvbmQgZW9mIGFuZAorCSAqIHdlIGFyZSBub3cgY29taW5nIGJhY2sgdG8gdXNlIGl0IHRoZW4gd2Ugd2lsbCBuZWVkIHRvCisJICogZmxhZyBpdCBhcyBuZXcgZXZlbiBpZiBpdCBoYXMgYSBkaXNrIGFkZHJlc3MuCisJICovCisJaWYgKGNyZWF0ZSAmJgorCSAgICAoKCFidWZmZXJfbWFwcGVkKGJoX3Jlc3VsdCkgJiYgIWJ1ZmZlcl91cHRvZGF0ZShiaF9yZXN1bHQpKSB8fAorCSAgICAgKG9mZnNldCA+PSBpX3NpemVfcmVhZChpbm9kZSkpIHx8IChpb21hcC5pb21hcF9mbGFncyAmIElPTUFQX05FVykpKSB7CisJCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJfQorCisJaWYgKGlvbWFwLmlvbWFwX2ZsYWdzICYgSU9NQVBfREVMQVkpIHsKKwkJQlVHX09OKGRpcmVjdCk7CisJCWlmIChjcmVhdGUpIHsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmhfcmVzdWx0KTsKKwkJCXNldF9idWZmZXJfbWFwcGVkKGJoX3Jlc3VsdCk7CisJCQlzZXRfYnVmZmVyX2RlbGF5KGJoX3Jlc3VsdCk7CisJCX0KKwl9CisKKwlpZiAoYmxvY2tzKSB7CisJCWJoX3Jlc3VsdC0+Yl9zaXplID0gKHNzaXplX3QpbWluKAorCQkJKGxvZmZfdCkoaW9tYXAuaW9tYXBfYnNpemUgLSBpb21hcC5pb21hcF9kZWx0YSksCisJCQkobG9mZl90KShibG9ja3MgPDwgaW5vZGUtPmlfYmxrYml0cykpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQKK2xpbnZmc19nZXRfYmxvY2soCisJc3RydWN0IGlub2RlCQkqaW5vZGUsCisJc2VjdG9yX3QJCWlibG9jaywKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoX3Jlc3VsdCwKKwlpbnQJCQljcmVhdGUpCit7CisJcmV0dXJuIF9fbGludmZzX2dldF9ibG9jayhpbm9kZSwgaWJsb2NrLCAwLCBiaF9yZXN1bHQsCisJCQkJCWNyZWF0ZSwgMCwgQk1BUElfV1JJVEUpOworfQorCitTVEFUSUMgaW50CitsaW52ZnNfZ2V0X2Jsb2Nrc19kaXJlY3QoCisJc3RydWN0IGlub2RlCQkqaW5vZGUsCisJc2VjdG9yX3QJCWlibG9jaywKKwl1bnNpZ25lZCBsb25nCQltYXhfYmxvY2tzLAorCXN0cnVjdCBidWZmZXJfaGVhZAkqYmhfcmVzdWx0LAorCWludAkJCWNyZWF0ZSkKK3sKKwlyZXR1cm4gX19saW52ZnNfZ2V0X2Jsb2NrKGlub2RlLCBpYmxvY2ssIG1heF9ibG9ja3MsIGJoX3Jlc3VsdCwKKwkJCQkJY3JlYXRlLCAxLCBCTUFQSV9XUklURXxCTUFQSV9ESVJFQ1QpOworfQorCitTVEFUSUMgc3NpemVfdAorbGludmZzX2RpcmVjdF9JTygKKwlpbnQJCQlydywKKwlzdHJ1Y3Qga2lvY2IJCSppb2NiLAorCWNvbnN0IHN0cnVjdCBpb3ZlYwkqaW92LAorCWxvZmZfdAkJCW9mZnNldCwKKwl1bnNpZ25lZCBsb25nCQlucl9zZWdzKQoreworCXN0cnVjdCBmaWxlCSpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCXZub2RlX3QJCSp2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOworCXhmc19pb21hcF90CWlvbWFwOworCWludAkJbWFwcyA9IDE7CisJaW50CQllcnJvcjsKKworCVZPUF9CTUFQKHZwLCBvZmZzZXQsIDAsIEJNQVBJX0RFVklDRSwgJmlvbWFwLCAmbWFwcywgZXJyb3IpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIC1lcnJvcjsKKworCXJldHVybiBibG9ja2Rldl9kaXJlY3RfSU9fb3duX2xvY2tpbmcocncsIGlvY2IsIGlub2RlLAorCQlpb21hcC5pb21hcF90YXJnZXQtPnBicl9iZGV2LAorCQlpb3YsIG9mZnNldCwgbnJfc2VncywKKwkJbGludmZzX2dldF9ibG9ja3NfZGlyZWN0LAorCQlsaW52ZnNfdW53cml0dGVuX2NvbnZlcnRfZGlyZWN0KTsKK30KKworCitTVEFUSUMgc2VjdG9yX3QKK2xpbnZmc19ibWFwKAorCXN0cnVjdCBhZGRyZXNzX3NwYWNlCSptYXBwaW5nLAorCXNlY3Rvcl90CQlibG9jaykKK3sKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IChzdHJ1Y3QgaW5vZGUgKiltYXBwaW5nLT5ob3N0OworCXZub2RlX3QJCQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKwlpbnQJCQllcnJvcjsKKworCXZuX3RyYWNlX2VudHJ5KHZwLCAibGludmZzX2JtYXAiLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwlWT1BfUldMT0NLKHZwLCBWUldMT0NLX1JFQUQpOworCVZPUF9GTFVTSF9QQUdFUyh2cCwgKHhmc19vZmZfdCkwLCAtMSwgMCwgRklfUkVNQVBGLCBlcnJvcik7CisJVk9QX1JXVU5MT0NLKHZwLCBWUldMT0NLX1JFQUQpOworCXJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAobWFwcGluZywgYmxvY2ssIGxpbnZmc19nZXRfYmxvY2spOworfQorCitTVEFUSUMgaW50CitsaW52ZnNfcmVhZHBhZ2UoCisJc3RydWN0IGZpbGUJCSp1bnVzZWQsCisJc3RydWN0IHBhZ2UJCSpwYWdlKQoreworCXJldHVybiBtcGFnZV9yZWFkcGFnZShwYWdlLCBsaW52ZnNfZ2V0X2Jsb2NrKTsKK30KKworU1RBVElDIGludAorbGludmZzX3JlYWRwYWdlcygKKwlzdHJ1Y3QgZmlsZQkJKnVudXNlZCwKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZQkqbWFwcGluZywKKwlzdHJ1Y3QgbGlzdF9oZWFkCSpwYWdlcywKKwl1bnNpZ25lZAkJbnJfcGFnZXMpCit7CisJcmV0dXJuIG1wYWdlX3JlYWRwYWdlcyhtYXBwaW5nLCBwYWdlcywgbnJfcGFnZXMsIGxpbnZmc19nZXRfYmxvY2spOworfQorCitTVEFUSUMgdm9pZAoreGZzX2NvdW50X3BhZ2Vfc3RhdGUoCisJc3RydWN0IHBhZ2UJCSpwYWdlLAorCWludAkJCSpkZWxhbGxvYywKKwlpbnQJCQkqdW5tYXBwZWQsCisJaW50CQkJKnVud3JpdHRlbikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLCAqaGVhZDsKKworCSpkZWxhbGxvYyA9ICp1bm1hcHBlZCA9ICp1bndyaXR0ZW4gPSAwOworCisJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWRvIHsKKwkJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaCkgJiYgIWJ1ZmZlcl9tYXBwZWQoYmgpKQorCQkJKCp1bm1hcHBlZCkgPSAxOworCQllbHNlIGlmIChidWZmZXJfdW53cml0dGVuKGJoKSAmJiAhYnVmZmVyX2RlbGF5KGJoKSkKKwkJCWNsZWFyX2J1ZmZlcl91bndyaXR0ZW4oYmgpOworCQllbHNlIGlmIChidWZmZXJfdW53cml0dGVuKGJoKSkKKwkJCSgqdW53cml0dGVuKSA9IDE7CisJCWVsc2UgaWYgKGJ1ZmZlcl9kZWxheShiaCkpCisJCQkoKmRlbGFsbG9jKSA9IDE7CisJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKK30KKworCisvKgorICogd3JpdGVwYWdlOiBDYWxsZWQgZnJvbSBvbmUgb2YgdHdvIHBsYWNlczoKKyAqCisgKiAxLiB3ZSBhcmUgZmx1c2hpbmcgYSBkZWxhbGxvYyBidWZmZXIgaGVhZC4KKyAqCisgKiAyLiB3ZSBhcmUgd3JpdGluZyBvdXQgYSBkaXJ0eSBwYWdlLiBUeXBpY2FsbHkgdGhlIHBhZ2UgZGlydHkKKyAqICAgIHN0YXRlIGlzIGNsZWFyZWQgYmVmb3JlIHdlIGdldCBoZXJlLiBJbiB0aGlzIGNhc2UgaXMgaXQKKyAqICAgIGNvbmNlaXZhYmxlIHdlIGhhdmUgbm8gYnVmZmVyIGhlYWRzLgorICoKKyAqIEZvciBkZWxhbGxvYyBzcGFjZSBvbiB0aGUgcGFnZSB3ZSBuZWVkIHRvIGFsbG9jYXRlIHNwYWNlIGFuZAorICogZmx1c2ggaXQuIEZvciB1bm1hcHBlZCBidWZmZXIgaGVhZHMgb24gdGhlIHBhZ2Ugd2Ugc2hvdWxkCisgKiBhbGxvY2F0ZSBzcGFjZSBpZiB0aGUgcGFnZSBpcyB1cHRvZGF0ZS4gRm9yIGFueSBvdGhlciBkaXJ0eQorICogYnVmZmVyIGhlYWRzIG9uIHRoZSBwYWdlIHdlIHNob3VsZCBmbHVzaCB0aGVtLgorICoKKyAqIElmIHdlIGRldGVjdCB0aGF0IGEgdHJhbnNhY3Rpb24gd291bGQgYmUgcmVxdWlyZWQgdG8gZmx1c2gKKyAqIHRoZSBwYWdlLCB3ZSBoYXZlIHRvIGNoZWNrIHRoZSBwcm9jZXNzIGZsYWdzIGZpcnN0LCBpZiB3ZQorICogYXJlIGFscmVhZHkgaW4gYSB0cmFuc2FjdGlvbiBvciBkaXNrIEkvTyBkdXJpbmcgYWxsb2NhdGlvbnMKKyAqIGlzIG9mZiwgd2UgbmVlZCB0byBmYWlsIHRoZSB3cml0ZXBhZ2UgYW5kIHJlZGlydHkgdGhlIHBhZ2UuCisgKi8KKworU1RBVElDIGludAorbGludmZzX3dyaXRlcGFnZSgKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2UsCisJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJaW50CQkJZXJyb3I7CisJaW50CQkJbmVlZF90cmFuczsKKwlpbnQJCQlkZWxhbGxvYywgdW5tYXBwZWQsIHVud3JpdHRlbjsKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisKKwl4ZnNfcGFnZV90cmFjZShYRlNfV1JJVEVQQUdFX0VOVEVSLCBpbm9kZSwgcGFnZSwgMCk7CisKKwkvKgorCSAqIFdlIG5lZWQgYSB0cmFuc2FjdGlvbiBpZjoKKwkgKiAgMS4gVGhlcmUgYXJlIGRlbGFsbG9jIGJ1ZmZlcnMgb24gdGhlIHBhZ2UKKwkgKiAgMi4gVGhlIHBhZ2UgaXMgdXB0b2RhdGUgYW5kIHdlIGhhdmUgdW5tYXBwZWQgYnVmZmVycworCSAqICAzLiBUaGUgcGFnZSBpcyB1cHRvZGF0ZSBhbmQgd2UgaGF2ZSBubyBidWZmZXJzCisJICogIDQuIFRoZXJlIGFyZSB1bndyaXR0ZW4gYnVmZmVycyBvbiB0aGUgcGFnZQorCSAqLworCisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCXVubWFwcGVkID0gMTsKKwkJbmVlZF90cmFucyA9IDE7CisJfSBlbHNlIHsKKwkJeGZzX2NvdW50X3BhZ2Vfc3RhdGUocGFnZSwgJmRlbGFsbG9jLCAmdW5tYXBwZWQsICZ1bndyaXR0ZW4pOworCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJCXVubWFwcGVkID0gMDsKKwkJbmVlZF90cmFucyA9IGRlbGFsbG9jICsgdW5tYXBwZWQgKyB1bndyaXR0ZW47CisJfQorCisJLyoKKwkgKiBJZiB3ZSBuZWVkIGEgdHJhbnNhY3Rpb24gYW5kIHRoZSBwcm9jZXNzIGZsYWdzIHNheQorCSAqIHdlIGFyZSBhbHJlYWR5IGluIGEgdHJhbnNhY3Rpb24sIG9yIG5vIElPIGlzIGFsbG93ZWQKKwkgKiB0aGVuIG1hcmsgdGhlIHBhZ2UgZGlydHkgYWdhaW4gYW5kIGxlYXZlIHRoZSBwYWdlCisJICogYXMgaXMuCisJICovCisJaWYgKFBGTEFHU19URVNUX0ZTVFJBTlMoKSAmJiBuZWVkX3RyYW5zKQorCQlnb3RvIG91dF9mYWlsOworCisJLyoKKwkgKiBEZWxheSBob29raW5nIHVwIGJ1ZmZlciBoZWFkcyB1bnRpbCB3ZSBoYXZlCisJICogbWFkZSBvdXIgZ28vbm8tZ28gZGVjaXNpb24uCisJICovCisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQorCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCAxIDw8IGlub2RlLT5pX2Jsa2JpdHMsIDApOworCisJLyoKKwkgKiBDb252ZXJ0IGRlbGF5ZWQgYWxsb2NhdGUsIHVud3JpdHRlbiBvciB1bm1hcHBlZCBzcGFjZQorCSAqIHRvIHJlYWwgc3BhY2UgYW5kIGZsdXNoIG91dCB0byBkaXNrLgorCSAqLworCWVycm9yID0geGZzX3BhZ2Vfc3RhdGVfY29udmVydChpbm9kZSwgcGFnZSwgd2JjLCAxLCB1bm1hcHBlZCk7CisJaWYgKGVycm9yID09IC1FQUdBSU4pCisJCWdvdG8gb3V0X2ZhaWw7CisJaWYgKHVubGlrZWx5KGVycm9yIDwgMCkpCisJCWdvdG8gb3V0X3VubG9jazsKKworCXJldHVybiAwOworCitvdXRfZmFpbDoKKwlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiAwOworb3V0X3VubG9jazoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBDYWxsZWQgdG8gbW92ZSBhIHBhZ2UgaW50byBjbGVhbmFibGUgc3RhdGUgLSBhbmQgZnJvbSB0aGVyZQorICogdG8gYmUgcmVsZWFzZWQuIFBvc3NpYmx5IHRoZSBwYWdlIGlzIGFscmVhZHkgY2xlYW4uIFdlIGFsd2F5cworICogaGF2ZSBidWZmZXIgaGVhZHMgaW4gdGhpcyBjYWxsLgorICoKKyAqIFJldHVybnMgMCBpZiB0aGUgcGFnZSBpcyBvayB0byByZWxlYXNlLCAxIG90aGVyd2lzZS4KKyAqCisgKiBQb3NzaWJsZSBzY2VuYXJpb3MgYXJlOgorICoKKyAqIDEuIFdlIGFyZSBiZWluZyBjYWxsZWQgdG8gcmVsZWFzZSBhIHBhZ2Ugd2hpY2ggaGFzIGJlZW4gd3JpdHRlbgorICogICAgdG8gdmlhIHJlZ3VsYXIgSS9PLiBidWZmZXIgaGVhZHMgd2lsbCBiZSBkaXJ0eSBhbmQgcG9zc2libHkKKyAqICAgIGRlbGFsbG9jLiBJZiBubyBkZWxhbGxvYyBidWZmZXIgaGVhZHMgaW4gdGhpcyBjYXNlIHRoZW4gd2UKKyAqICAgIGNhbiBqdXN0IHJldHVybiB6ZXJvLgorICoKKyAqIDIuIFdlIGFyZSBjYWxsZWQgdG8gcmVsZWFzZSBhIHBhZ2Ugd2hpY2ggaGFzIGJlZW4gd3JpdHRlbiB2aWEKKyAqICAgIG1tYXAsIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIGVuc3VyZSB0aGVyZSBpcyBubyBkZWxhbGxvYworICogICAgc3RhdGUgaW4gdGhlIGJ1ZmZlciBoZWFkcywgaWYgbm90IHdlIGNhbiBsZXQgdGhlIGNhbGxlcgorICogICAgZnJlZSB0aGVtIGFuZCB3ZSBzaG91bGQgY29tZSBiYWNrIGxhdGVyIHZpYSB3cml0ZXBhZ2UuCisgKi8KK1NUQVRJQyBpbnQKK2xpbnZmc19yZWxlYXNlX3BhZ2UoCisJc3RydWN0IHBhZ2UJCSpwYWdlLAorCWludAkJCWdmcF9tYXNrKQoreworCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlpbnQJCQlkaXJ0eSwgZGVsYWxsb2MsIHVubWFwcGVkLCB1bndyaXR0ZW47CisJc3RydWN0IHdyaXRlYmFja19jb250cm9sIHdiYyA9IHsKKwkJLnN5bmNfbW9kZSA9IFdCX1NZTkNfQUxMLAorCQkubnJfdG9fd3JpdGUgPSAxLAorCX07CisKKwl4ZnNfcGFnZV90cmFjZShYRlNfUkVMRUFTRVBBR0VfRU5URVIsIGlub2RlLCBwYWdlLCBnZnBfbWFzayk7CisKKwl4ZnNfY291bnRfcGFnZV9zdGF0ZShwYWdlLCAmZGVsYWxsb2MsICZ1bm1hcHBlZCwgJnVud3JpdHRlbik7CisJaWYgKCFkZWxhbGxvYyAmJiAhdW53cml0dGVuKQorCQlnb3RvIGZyZWVfYnVmZmVyczsKKworCWlmICghKGdmcF9tYXNrICYgX19HRlBfRlMpKQorCQlyZXR1cm4gMDsKKworCS8qIElmIHdlIGFyZSBhbHJlYWR5IGluc2lkZSBhIHRyYW5zYWN0aW9uIG9yIHRoZSB0aHJlYWQgY2Fubm90CisJICogZG8gSS9PLCB3ZSBjYW5ub3QgcmVsZWFzZSB0aGlzIHBhZ2UuCisJICovCisJaWYgKFBGTEFHU19URVNUX0ZTVFJBTlMoKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIENvbnZlcnQgZGVsYWxsb2Mgc3BhY2UgdG8gcmVhbCBzcGFjZSwgZG8gbm90IGZsdXNoIHRoZQorCSAqIGRhdGEgb3V0IHRvIGRpc2ssIHRoYXQgd2lsbCBiZSBkb25lIGJ5IHRoZSBjYWxsZXIuCisJICogTmV2ZXIgbmVlZCB0byBhbGxvY2F0ZSBzcGFjZSBoZXJlIC0gd2Ugd2lsbCBhbHdheXMKKwkgKiBjb21lIGJhY2sgdG8gd3JpdGVwYWdlIGluIHRoYXQgY2FzZS4KKwkgKi8KKwlkaXJ0eSA9IHhmc19wYWdlX3N0YXRlX2NvbnZlcnQoaW5vZGUsIHBhZ2UsICZ3YmMsIDAsIDApOworCWlmIChkaXJ0eSA9PSAwICYmICF1bndyaXR0ZW4pCisJCWdvdG8gZnJlZV9idWZmZXJzOworCXJldHVybiAwOworCitmcmVlX2J1ZmZlcnM6CisJcmV0dXJuIHRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSk7Cit9CisKK1NUQVRJQyBpbnQKK2xpbnZmc19wcmVwYXJlX3dyaXRlKAorCXN0cnVjdCBmaWxlCQkqZmlsZSwKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2UsCisJdW5zaWduZWQgaW50CQlmcm9tLAorCXVuc2lnbmVkIGludAkJdG8pCit7CisJcmV0dXJuIGJsb2NrX3ByZXBhcmVfd3JpdGUocGFnZSwgZnJvbSwgdG8sIGxpbnZmc19nZXRfYmxvY2spOworfQorCitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGxpbnZmc19hb3BzID0geworCS5yZWFkcGFnZQkJPSBsaW52ZnNfcmVhZHBhZ2UsCisJLnJlYWRwYWdlcwkJPSBsaW52ZnNfcmVhZHBhZ2VzLAorCS53cml0ZXBhZ2UJCT0gbGludmZzX3dyaXRlcGFnZSwKKwkuc3luY19wYWdlCQk9IGJsb2NrX3N5bmNfcGFnZSwKKwkucmVsZWFzZXBhZ2UJCT0gbGludmZzX3JlbGVhc2VfcGFnZSwKKwkucHJlcGFyZV93cml0ZQkJPSBsaW52ZnNfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCQk9IGdlbmVyaWNfY29tbWl0X3dyaXRlLAorCS5ibWFwCQkJPSBsaW52ZnNfYm1hcCwKKwkuZGlyZWN0X0lPCQk9IGxpbnZmc19kaXJlY3RfSU8sCit9OwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2UwZWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKQEAgLTAsMCArMSwxOTgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisvKgorICoJVGhlIHhmc19idWYuYyBjb2RlIHByb3ZpZGVzIGFuIGFic3RyYWN0IGJ1ZmZlciBjYWNoZSBtb2RlbCBvbiB0b3AKKyAqCW9mIHRoZSBMaW51eCBwYWdlIGNhY2hlLiAgQ2FjaGVkIG1ldGFkYXRhIGJsb2NrcyBmb3IgYSBmaWxlIHN5c3RlbQorICoJYXJlIGhhc2hlZCB0byB0aGUgaW5vZGUgZm9yIHRoZSBibG9jayBkZXZpY2UuICB4ZnNfYnVmLmMgYXNzZW1ibGVzCisgKglidWZmZXJzICh4ZnNfYnVmX3QpIG9uIGRlbWFuZCB0byBhZ2dyZWdhdGUgc3VjaCBjYWNoZWQgcGFnZXMgZm9yIEkvTy4KKyAqCisgKiAgICAgIFdyaXR0ZW4gYnkgU3RldmUgTG9yZCwgSmltIE1vc3RlaywgUnVzc2VsbCBDYXR0ZWxhbgorICoJCSAgICBhbmQgUmFqYWdvcGFsIEFuYW50aGFuYXJheWFuYW4gKCJhbmFudGgiKSBhdCBTR0kuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9iaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaGFzaC5oPgorCisjaW5jbHVkZSAieGZzX2xpbnV4LmgiCisKKy8qCisgKiBGaWxlIHdpZGUgZ2xvYmFscworICovCisKK1NUQVRJQyBrbWVtX2NhY2hlX3QgKnBhZ2VidWZfY2FjaGU7CitTVEFUSUMga21lbV9zaGFrZXJfdCBwYWdlYnVmX3NoYWtlOworU1RBVElDIGludCBwYWdlYnVmX2RhZW1vbl93YWtldXAoaW50LCB1bnNpZ25lZCBpbnQpOworU1RBVElDIHZvaWQgcGFnZWJ1Zl9kZWx3cmlfcXVldWUoeGZzX2J1Zl90ICosIGludCk7CitTVEFUSUMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnBhZ2VidWZfbG9naW9fd29ya3F1ZXVlOworU1RBVElDIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpwYWdlYnVmX2RhdGFpb193b3JrcXVldWU7CisKKy8qCisgKiBQYWdlYnVmIGRlYnVnZ2luZworICovCisKKyNpZmRlZiBQQUdFQlVGX1RSQUNFCit2b2lkCitwYWdlYnVmX3RyYWNlKAorCXhmc19idWZfdAkqcGIsCisJY2hhcgkJKmlkLAorCXZvaWQJCSpkYXRhLAorCXZvaWQJCSpyYSkKK3sKKwlrdHJhY2VfZW50ZXIocGFnZWJ1Zl90cmFjZV9idWYsCisJCXBiLCBpZCwKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZylwYi0+cGJfZmxhZ3MsCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpcGItPnBiX2hvbGQuY291bnRlciwKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZylwYi0+cGJfc2VtYS5jb3VudC5jb3VudGVyLAorCQkodm9pZCAqKWN1cnJlbnQsCisJCWRhdGEsIHJhLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKSgocGItPnBiX2ZpbGVfb2Zmc2V0Pj4zMikgJiAweGZmZmZmZmZmKSwKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZykocGItPnBiX2ZpbGVfb2Zmc2V0ICYgMHhmZmZmZmZmZiksCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpcGItPnBiX2J1ZmZlcl9sZW5ndGgsCisJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworfQora3RyYWNlX3QgKnBhZ2VidWZfdHJhY2VfYnVmOworI2RlZmluZSBQQUdFQlVGX1RSQUNFX1NJWkUJNDA5NgorI2RlZmluZSBQQl9UUkFDRShwYiwgaWQsIGRhdGEpCVwKKwlwYWdlYnVmX3RyYWNlKHBiLCBpZCwgKHZvaWQgKilkYXRhLCAodm9pZCAqKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSkKKyNlbHNlCisjZGVmaW5lIFBCX1RSQUNFKHBiLCBpZCwgZGF0YSkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZmRlZiBQQUdFQlVGX0xPQ0tfVFJBQ0tJTkcKKyMgZGVmaW5lIFBCX1NFVF9PV05FUihwYikJKChwYiktPnBiX2xhc3RfaG9sZGVyID0gY3VycmVudC0+cGlkKQorIyBkZWZpbmUgUEJfQ0xFQVJfT1dORVIocGIpCSgocGIpLT5wYl9sYXN0X2hvbGRlciA9IC0xKQorIyBkZWZpbmUgUEJfR0VUX09XTkVSKHBiKQkoKHBiKS0+cGJfbGFzdF9ob2xkZXIpCisjZWxzZQorIyBkZWZpbmUgUEJfU0VUX09XTkVSKHBiKQlkbyB7IH0gd2hpbGUgKDApCisjIGRlZmluZSBQQl9DTEVBUl9PV05FUihwYikJZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgUEJfR0VUX09XTkVSKHBiKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworLyoKKyAqIFBhZ2VidWYgYWxsb2NhdGlvbiAvIGZyZWVpbmcuCisgKi8KKworI2RlZmluZSBwYl90b19nZnAoZmxhZ3MpIFwKKwkoKCgoZmxhZ3MpICYgUEJGX1JFQURfQUhFQUQpID8gX19HRlBfTk9SRVRSWSA6IFwKKwkgICgoZmxhZ3MpICYgUEJGX0RPTlRfQkxPQ0spID8gR0ZQX05PRlMgOiBHRlBfS0VSTkVMKSB8IF9fR0ZQX05PV0FSTikKKworI2RlZmluZSBwYl90b19rbShmbGFncykgXAorCSAoKChmbGFncykgJiBQQkZfRE9OVF9CTE9DSykgPyBLTV9OT0ZTIDogS01fU0xFRVApCisKKworI2RlZmluZSBwYWdlYnVmX2FsbG9jYXRlKGZsYWdzKSBcCisJa21lbV96b25lX2FsbG9jKHBhZ2VidWZfY2FjaGUsIHBiX3RvX2ttKGZsYWdzKSkKKyNkZWZpbmUgcGFnZWJ1Zl9kZWFsbG9jYXRlKHBiKSBcCisJa21lbV96b25lX2ZyZWUocGFnZWJ1Zl9jYWNoZSwgKHBiKSk7CisKKy8qCisgKiBQYWdlIFJlZ2lvbiBpbnRlcmZhY2VzLgorICoKKyAqIEZvciBwYWdlcyBpbiBmaWxlc3lzdGVtcyB3aGVyZSB0aGUgYmxvY2tzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUKKyAqIHBhZ2VzaXplLCB3ZSB1c2UgdGhlIHBhZ2UtPnByaXZhdGUgZmllbGQgKGxvbmcpIHRvIGhvbGQgYSBiaXRtYXAKKyAqIG9mIHVwdG9kYXRlIHJlZ2lvbnMgd2l0aGluIHRoZSBwYWdlLgorICoKKyAqIEVhY2ggc3VjaCByZWdpb24gaXMgImJ5dGVzIHBlciBwYWdlIC8gYml0cyBwZXIgbG9uZyIgYnl0ZXMgbG9uZy4KKyAqCisgKiBOQlBQUiA9PSBudW1iZXItb2YtYnl0ZXMtcGVyLXBhZ2UtcmVnaW9uCisgKiBCVE9QUiA9PSBieXRlcy10by1wYWdlLXJlZ2lvbiAocm91bmRlZCB1cCkKKyAqIEJUT1BSVCA9PSBieXRlcy10by1wYWdlLXJlZ2lvbi10cnVuY2F0ZWQgKHJvdW5kZWQgZG93bikKKyAqLworI2lmIChCSVRTX1BFUl9MT05HID09IDMyKQorI2RlZmluZSBQUlNISUZUCQkoUEFHRV9DQUNIRV9TSElGVCAtIDUpCS8qICgzMiA9PSAxPDw1KSAqLworI2VsaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQpCisjZGVmaW5lIFBSU0hJRlQJCShQQUdFX0NBQ0hFX1NISUZUIC0gNikJLyogKDY0ID09IDE8PDYpICovCisjZWxzZQorI2Vycm9yIEJJVFNfUEVSX0xPTkcgbXVzdCBiZSAzMiBvciA2NAorI2VuZGlmCisjZGVmaW5lIE5CUFBSCQkoUEFHRV9DQUNIRV9TSVpFL0JJVFNfUEVSX0xPTkcpCisjZGVmaW5lIEJUT1BSKGIpCSgoKHVuc2lnbmVkIGludCkoYikgKyAoTkJQUFIgLSAxKSkgPj4gUFJTSElGVCkKKyNkZWZpbmUgQlRPUFJUKGIpCSgoKHVuc2lnbmVkIGludCkoYikgPj4gUFJTSElGVCkpCisKK1NUQVRJQyB1bnNpZ25lZCBsb25nCitwYWdlX3JlZ2lvbl9tYXNrKAorCXNpemVfdAkJb2Zmc2V0LAorCXNpemVfdAkJbGVuZ3RoKQoreworCXVuc2lnbmVkIGxvbmcJbWFzazsKKwlpbnQJCWZpcnN0LCBmaW5hbDsKKworCWZpcnN0ID0gQlRPUFIob2Zmc2V0KTsKKwlmaW5hbCA9IEJUT1BSVChvZmZzZXQgKyBsZW5ndGggLSAxKTsKKwlmaXJzdCA9IG1pbihmaXJzdCwgZmluYWwpOworCisJbWFzayA9IH4wVUw7CisJbWFzayA8PD0gQklUU19QRVJfTE9ORyAtIChmaW5hbCAtIGZpcnN0KTsKKwltYXNrID4+PSBCSVRTX1BFUl9MT05HIC0gKGZpbmFsKTsKKworCUFTU0VSVChvZmZzZXQgKyBsZW5ndGggPD0gUEFHRV9DQUNIRV9TSVpFKTsKKwlBU1NFUlQoKGZpbmFsIC0gZmlyc3QpIDwgQklUU19QRVJfTE9ORyAmJiAoZmluYWwgLSBmaXJzdCkgPj0gMCk7CisKKwlyZXR1cm4gbWFzazsKK30KKworU1RBVElDIGlubGluZSB2b2lkCitzZXRfcGFnZV9yZWdpb24oCisJc3RydWN0IHBhZ2UJKnBhZ2UsCisJc2l6ZV90CQlvZmZzZXQsCisJc2l6ZV90CQlsZW5ndGgpCit7CisJcGFnZS0+cHJpdmF0ZSB8PSBwYWdlX3JlZ2lvbl9tYXNrKG9mZnNldCwgbGVuZ3RoKTsKKwlpZiAocGFnZS0+cHJpdmF0ZSA9PSB+MFVMKQorCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7Cit9CisKK1NUQVRJQyBpbmxpbmUgaW50Cit0ZXN0X3BhZ2VfcmVnaW9uKAorCXN0cnVjdCBwYWdlCSpwYWdlLAorCXNpemVfdAkJb2Zmc2V0LAorCXNpemVfdAkJbGVuZ3RoKQoreworCXVuc2lnbmVkIGxvbmcJbWFzayA9IHBhZ2VfcmVnaW9uX21hc2sob2Zmc2V0LCBsZW5ndGgpOworCisJcmV0dXJuIChtYXNrICYmIChwYWdlLT5wcml2YXRlICYgbWFzaykgPT0gbWFzayk7Cit9CisKKy8qCisgKiBNYXBwaW5nIG9mIG11bHRpLXBhZ2UgYnVmZmVycyBpbnRvIGNvbnRpZ3VvdXMgdmlydHVhbCBzcGFjZQorICovCisKK3R5cGVkZWYgc3RydWN0IGFfbGlzdCB7CisJdm9pZAkJKnZtX2FkZHI7CisJc3RydWN0IGFfbGlzdAkqbmV4dDsKK30gYV9saXN0X3Q7CisKK1NUQVRJQyBhX2xpc3RfdAkJKmFzX2ZyZWVfaGVhZDsKK1NUQVRJQyBpbnQJCWFzX2xpc3RfbGVuOworU1RBVElDIERFRklORV9TUElOTE9DSyhhc19sb2NrKTsKKworLyoKKyAqIFRyeSB0byBiYXRjaCB2dW5tYXBzIGJlY2F1c2UgdGhleSBhcmUgY29zdGx5LgorICovCitTVEFUSUMgdm9pZAorZnJlZV9hZGRyZXNzKAorCXZvaWQJCSphZGRyKQoreworCWFfbGlzdF90CSphZW50cnk7CisKKwlhZW50cnkgPSBrbWFsbG9jKHNpemVvZihhX2xpc3RfdCksIEdGUF9BVE9NSUMgJiB+X19HRlBfSElHSCk7CisJaWYgKGxpa2VseShhZW50cnkpKSB7CisJCXNwaW5fbG9jaygmYXNfbG9jayk7CisJCWFlbnRyeS0+bmV4dCA9IGFzX2ZyZWVfaGVhZDsKKwkJYWVudHJ5LT52bV9hZGRyID0gYWRkcjsKKwkJYXNfZnJlZV9oZWFkID0gYWVudHJ5OworCQlhc19saXN0X2xlbisrOworCQlzcGluX3VubG9jaygmYXNfbG9jayk7CisJfSBlbHNlIHsKKwkJdnVubWFwKGFkZHIpOworCX0KK30KKworU1RBVElDIHZvaWQKK3B1cmdlX2FkZHJlc3Nlcyh2b2lkKQoreworCWFfbGlzdF90CSphZW50cnksICpvbGQ7CisKKwlpZiAoYXNfZnJlZV9oZWFkID09IE5VTEwpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmYXNfbG9jayk7CisJYWVudHJ5ID0gYXNfZnJlZV9oZWFkOworCWFzX2ZyZWVfaGVhZCA9IE5VTEw7CisJYXNfbGlzdF9sZW4gPSAwOworCXNwaW5fdW5sb2NrKCZhc19sb2NrKTsKKworCXdoaWxlICgob2xkID0gYWVudHJ5KSAhPSBOVUxMKSB7CisJCXZ1bm1hcChhZW50cnktPnZtX2FkZHIpOworCQlhZW50cnkgPSBhZW50cnktPm5leHQ7CisJCWtmcmVlKG9sZCk7CisJfQorfQorCisvKgorICoJSW50ZXJuYWwgcGFnZWJ1ZiBvYmplY3QgbWFuaXB1bGF0aW9uCisgKi8KKworU1RBVElDIHZvaWQKK19wYWdlYnVmX2luaXRpYWxpemUoCisJeGZzX2J1Zl90CQkqcGIsCisJeGZzX2J1ZnRhcmdfdAkJKnRhcmdldCwKKwlsb2ZmX3QJCQlyYW5nZV9iYXNlLAorCXNpemVfdAkJCXJhbmdlX2xlbmd0aCwKKwlwYWdlX2J1Zl9mbGFnc190CWZsYWdzKQoreworCS8qCisJICogV2UgZG9uJ3Qgd2FudCBjZXJ0YWluIGZsYWdzIHRvIGFwcGVhciBpbiBwYi0+cGJfZmxhZ3MuCisJICovCisJZmxhZ3MgJj0gfihQQkZfTE9DS3xQQkZfTUFQUEVEfFBCRl9ET05UX0JMT0NLfFBCRl9SRUFEX0FIRUFEKTsKKworCW1lbXNldChwYiwgMCwgc2l6ZW9mKHhmc19idWZfdCkpOworCWF0b21pY19zZXQoJnBiLT5wYl9ob2xkLCAxKTsKKwlpbml0X01VVEVYX0xPQ0tFRCgmcGItPnBiX2lvZG9uZXNlbWEpOworCUlOSVRfTElTVF9IRUFEKCZwYi0+cGJfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnBiLT5wYl9oYXNoX2xpc3QpOworCWluaXRfTVVURVhfTE9DS0VEKCZwYi0+cGJfc2VtYSk7IC8qIGhlbGQsIG5vIHdhaXRlcnMgKi8KKwlQQl9TRVRfT1dORVIocGIpOworCXBiLT5wYl90YXJnZXQgPSB0YXJnZXQ7CisJcGItPnBiX2ZpbGVfb2Zmc2V0ID0gcmFuZ2VfYmFzZTsKKwkvKgorCSAqIFNldCBidWZmZXJfbGVuZ3RoIGFuZCBjb3VudF9kZXNpcmVkIHRvIHRoZSBzYW1lIHZhbHVlIGluaXRpYWxseS4KKwkgKiBJL08gcm91dGluZXMgc2hvdWxkIHVzZSBjb3VudF9kZXNpcmVkLCB3aGljaCB3aWxsIGJlIHRoZSBzYW1lIGluCisJICogbW9zdCBjYXNlcyBidXQgbWF5IGJlIHJlc2V0IChlLmcuIFhGUyByZWNvdmVyeSkuCisJICovCisJcGItPnBiX2J1ZmZlcl9sZW5ndGggPSBwYi0+cGJfY291bnRfZGVzaXJlZCA9IHJhbmdlX2xlbmd0aDsKKwlwYi0+cGJfZmxhZ3MgPSBmbGFncyB8IFBCRl9OT05FOworCXBiLT5wYl9ibiA9IFhGU19CVUZfREFERFJfTlVMTDsKKwlhdG9taWNfc2V0KCZwYi0+cGJfcGluX2NvdW50LCAwKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwYi0+cGJfd2FpdGVycyk7CisKKwlYRlNfU1RBVFNfSU5DKHBiX2NyZWF0ZSk7CisJUEJfVFJBQ0UocGIsICJpbml0aWFsaXplIiwgdGFyZ2V0KTsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgcGFnZSBhcnJheSBjYXBhYmxlIG9mIGhvbGRpbmcgYSBzcGVjaWZpZWQgbnVtYmVyCisgKiBvZiBwYWdlcywgYW5kIHBvaW50IHRoZSBwYWdlIGJ1ZiBhdCBpdC4KKyAqLworU1RBVElDIGludAorX3BhZ2VidWZfZ2V0X3BhZ2VzKAorCXhmc19idWZfdAkJKnBiLAorCWludAkJCXBhZ2VfY291bnQsCisJcGFnZV9idWZfZmxhZ3NfdAlmbGFncykKK3sKKwkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgcGFnZSBsaXN0ICovCisJaWYgKHBiLT5wYl9wYWdlcyA9PSBOVUxMKSB7CisJCXBiLT5wYl9vZmZzZXQgPSBwYWdlX2J1Zl9wb2ZmKHBiLT5wYl9maWxlX29mZnNldCk7CisJCXBiLT5wYl9wYWdlX2NvdW50ID0gcGFnZV9jb3VudDsKKwkJaWYgKHBhZ2VfY291bnQgPD0gUEJfUEFHRVMpIHsKKwkJCXBiLT5wYl9wYWdlcyA9IHBiLT5wYl9wYWdlX2FycmF5OworCQl9IGVsc2UgeworCQkJcGItPnBiX3BhZ2VzID0ga21lbV9hbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKgorCQkJCQlwYWdlX2NvdW50LCBwYl90b19rbShmbGFncykpOworCQkJaWYgKHBiLT5wYl9wYWdlcyA9PSBOVUxMKQorCQkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1lbXNldChwYi0+cGJfcGFnZXMsIDAsIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqIHBhZ2VfY291bnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUZyZWVzIHBiX3BhZ2VzIGlmIGl0IHdhcyBtYWxsb2NlZC4KKyAqLworU1RBVElDIHZvaWQKK19wYWdlYnVmX2ZyZWVfcGFnZXMoCisJeGZzX2J1Zl90CSpicCkKK3sKKwlpZiAoYnAtPnBiX3BhZ2VzICE9IGJwLT5wYl9wYWdlX2FycmF5KSB7CisJCWttZW1fZnJlZShicC0+cGJfcGFnZXMsCisJCQkgIGJwLT5wYl9wYWdlX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBwYWdlICopKTsKKwl9Cit9CisKKy8qCisgKglSZWxlYXNlcyB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqCisgKiAJVGhlIG1vZGlmaWNhdGlvbiBzdGF0ZSBvZiBhbnkgYXNzb2NpYXRlZCBwYWdlcyBpcyBsZWZ0IHVuY2hhbmdlZC4KKyAqIAlUaGUgYnVmZmVyIG1vc3Qgbm90IGJlIG9uIGFueSBoYXNoIC0gdXNlIHBhZ2VidWZfcmVsZSBpbnN0ZWFkIGZvcgorICogCWhhc2hlZCBhbmQgcmVmY291bnRlZCBidWZmZXJzCisgKi8KK3ZvaWQKK3BhZ2VidWZfZnJlZSgKKwl4ZnNfYnVmX3QJCSpicCkKK3sKKwlQQl9UUkFDRShicCwgImZyZWUiLCAwKTsKKworCUFTU0VSVChsaXN0X2VtcHR5KCZicC0+cGJfaGFzaF9saXN0KSk7CisKKwlpZiAoYnAtPnBiX2ZsYWdzICYgX1BCRl9QQUdFX0NBQ0hFKSB7CisJCXVpbnQJCWk7CisKKwkJaWYgKChicC0+cGJfZmxhZ3MgJiBQQkZfTUFQUEVEKSAmJiAoYnAtPnBiX3BhZ2VfY291bnQgPiAxKSkKKwkJCWZyZWVfYWRkcmVzcyhicC0+cGJfYWRkciAtIGJwLT5wYl9vZmZzZXQpOworCisJCWZvciAoaSA9IDA7IGkgPCBicC0+cGJfcGFnZV9jb3VudDsgaSsrKQorCQkJcGFnZV9jYWNoZV9yZWxlYXNlKGJwLT5wYl9wYWdlc1tpXSk7CisJCV9wYWdlYnVmX2ZyZWVfcGFnZXMoYnApOworCX0gZWxzZSBpZiAoYnAtPnBiX2ZsYWdzICYgX1BCRl9LTUVNX0FMTE9DKSB7CisJCSAvKgorCQkgICogWFhYKGhjaCk6IGJwLT5wYl9jb3VudF9kZXNpcmVkIG1pZ2h0IGJlIGluY29ycmVjdCAoc2VlCisJCSAgKiBwYWdlYnVmX2Fzc29jaWF0ZV9tZW1vcnkgZm9yIGRldGFpbHMpLCBidXQgZm9ydHVuYXRlbHkKKwkJICAqIHRoZSBMaW51eCB2ZXJzaW9uIG9mIGttZW1fZnJlZSBpZ25vcmVzIHRoZSBsZW4gYXJndW1lbnQuLgorCQkgICovCisJCWttZW1fZnJlZShicC0+cGJfYWRkciwgYnAtPnBiX2NvdW50X2Rlc2lyZWQpOworCQlfcGFnZWJ1Zl9mcmVlX3BhZ2VzKGJwKTsKKwl9CisKKwlwYWdlYnVmX2RlYWxsb2NhdGUoYnApOworfQorCisvKgorICoJRmluZHMgYWxsIHBhZ2VzIGZvciBidWZmZXIgaW4gcXVlc3Rpb24gYW5kIGJ1aWxkcyBpdCdzIHBhZ2UgbGlzdC4KKyAqLworU1RBVElDIGludAorX3BhZ2VidWZfbG9va3VwX3BhZ2VzKAorCXhmc19idWZfdAkJKmJwLAorCXVpbnQJCQlmbGFncykKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZQkqbWFwcGluZyA9IGJwLT5wYl90YXJnZXQtPnBicl9tYXBwaW5nOworCXNpemVfdAkJCWJsb2Nrc2l6ZSA9IGJwLT5wYl90YXJnZXQtPnBicl9ic2l6ZTsKKwlzaXplX3QJCQlzaXplID0gYnAtPnBiX2NvdW50X2Rlc2lyZWQ7CisJc2l6ZV90CQkJbmJ5dGVzLCBvZmZzZXQ7CisJaW50CQkJZ2ZwX21hc2sgPSBwYl90b19nZnAoZmxhZ3MpOworCXVuc2lnbmVkIHNob3J0CQlwYWdlX2NvdW50LCBpOworCXBnb2ZmX3QJCQlmaXJzdDsKKwlsb2ZmX3QJCQllbmQ7CisJaW50CQkJZXJyb3I7CisKKwllbmQgPSBicC0+cGJfZmlsZV9vZmZzZXQgKyBicC0+cGJfYnVmZmVyX2xlbmd0aDsKKwlwYWdlX2NvdW50ID0gcGFnZV9idWZfYnRvYyhlbmQpIC0gcGFnZV9idWZfYnRvY3QoYnAtPnBiX2ZpbGVfb2Zmc2V0KTsKKworCWVycm9yID0gX3BhZ2VidWZfZ2V0X3BhZ2VzKGJwLCBwYWdlX2NvdW50LCBmbGFncyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJcmV0dXJuIGVycm9yOworCWJwLT5wYl9mbGFncyB8PSBfUEJGX1BBR0VfQ0FDSEU7CisKKwlvZmZzZXQgPSBicC0+cGJfb2Zmc2V0OworCWZpcnN0ID0gYnAtPnBiX2ZpbGVfb2Zmc2V0ID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnAtPnBiX3BhZ2VfY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgcGFnZQkqcGFnZTsKKwkJdWludAkJcmV0cmllcyA9IDA7CisKKwkgICAgICByZXRyeToKKwkJcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UobWFwcGluZywgZmlyc3QgKyBpLCBnZnBfbWFzayk7CisJCWlmICh1bmxpa2VseShwYWdlID09IE5VTEwpKSB7CisJCQlpZiAoZmxhZ3MgJiBQQkZfUkVBRF9BSEVBRCkgeworCQkJCWJwLT5wYl9wYWdlX2NvdW50ID0gaTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgYnAtPnBiX3BhZ2VfY291bnQ7IGkrKykKKwkJCQkJdW5sb2NrX3BhZ2UoYnAtPnBiX3BhZ2VzW2ldKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFRoaXMgY291bGQgZGVhZGxvY2suCisJCQkgKgorCQkJICogQnV0IHVudGlsIGFsbCB0aGUgWEZTIGxvd2xldmVsIGNvZGUgaXMgcmV2YW1wZWQgdG8KKwkJCSAqIGhhbmRsZSBidWZmZXIgYWxsb2NhdGlvbiBmYWlsdXJlcyB3ZSBjYW4ndCBkbyBtdWNoLgorCQkJICovCisJCQlpZiAoISgrK3JldHJpZXMgJSAxMDApKQorCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkiWEZTOiBwb3NzaWJsZSBtZW1vcnkgYWxsb2NhdGlvbiAiCisJCQkJCSJkZWFkbG9jayBpbiAlcyAobW9kZToweCV4KVxuIiwKKwkJCQkJX19GVU5DVElPTl9fLCBnZnBfbWFzayk7CisKKwkJCVhGU19TVEFUU19JTkMocGJfcGFnZV9yZXRyaWVzKTsKKwkJCXBhZ2VidWZfZGFlbW9uX3dha2V1cCgwLCBnZnBfbWFzayk7CisJCQlibGtfY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi81MCk7CisJCQlnb3RvIHJldHJ5OworCQl9CisKKwkJWEZTX1NUQVRTX0lOQyhwYl9wYWdlX2ZvdW5kKTsKKworCQluYnl0ZXMgPSBtaW5fdChzaXplX3QsIHNpemUsIFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldCk7CisJCXNpemUgLT0gbmJ5dGVzOworCisJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQlwYWdlX2NvdW50LS07CisJCQlpZiAoYmxvY2tzaXplID49IFBBR0VfQ0FDSEVfU0laRSkgeworCQkJCWlmIChmbGFncyAmIFBCRl9SRUFEKQorCQkJCQlicC0+cGJfbG9ja2VkID0gMTsKKwkJCX0gZWxzZSBpZiAoIVBhZ2VQcml2YXRlKHBhZ2UpKSB7CisJCQkJaWYgKHRlc3RfcGFnZV9yZWdpb24ocGFnZSwgb2Zmc2V0LCBuYnl0ZXMpKQorCQkJCQlwYWdlX2NvdW50Kys7CisJCQl9CisJCX0KKworCQlicC0+cGJfcGFnZXNbaV0gPSBwYWdlOworCQlvZmZzZXQgPSAwOworCX0KKworCWlmICghYnAtPnBiX2xvY2tlZCkgeworCQlmb3IgKGkgPSAwOyBpIDwgYnAtPnBiX3BhZ2VfY291bnQ7IGkrKykKKwkJCXVubG9ja19wYWdlKGJwLT5wYl9wYWdlc1tpXSk7CisJfQorCisJaWYgKHBhZ2VfY291bnQpIHsKKwkJLyogaWYgd2UgaGF2ZSBhbnkgdXB0b2RhdGUgcGFnZXMsIG1hcmsgdGhhdCBpbiB0aGUgYnVmZmVyICovCisJCWJwLT5wYl9mbGFncyAmPSB+UEJGX05PTkU7CisKKwkJLyogaWYgc29tZSBwYWdlcyBhcmVuJ3QgdXB0b2RhdGUsIG1hcmsgdGhhdCBpbiB0aGUgYnVmZmVyICovCisJCWlmIChwYWdlX2NvdW50ICE9IGJwLT5wYl9wYWdlX2NvdW50KQorCQkJYnAtPnBiX2ZsYWdzIHw9IFBCRl9QQVJUSUFMOworCX0KKworCVBCX1RSQUNFKGJwLCAibG9va3VwX3BhZ2VzIiwgKGxvbmcpcGFnZV9jb3VudCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICoJTWFwIGJ1ZmZlciBpbnRvIGtlcm5lbCBhZGRyZXNzLXNwYWNlIGlmIG5lc3NlY2FyeS4KKyAqLworU1RBVElDIGludAorX3BhZ2VidWZfbWFwX3BhZ2VzKAorCXhmc19idWZfdAkJKmJwLAorCXVpbnQJCQlmbGFncykKK3sKKwkvKiBBIHNpbmdsZSBwYWdlIGJ1ZmZlciBpcyBhbHdheXMgbWFwcGFibGUgKi8KKwlpZiAoYnAtPnBiX3BhZ2VfY291bnQgPT0gMSkgeworCQlicC0+cGJfYWRkciA9IHBhZ2VfYWRkcmVzcyhicC0+cGJfcGFnZXNbMF0pICsgYnAtPnBiX29mZnNldDsKKwkJYnAtPnBiX2ZsYWdzIHw9IFBCRl9NQVBQRUQ7CisJfSBlbHNlIGlmIChmbGFncyAmIFBCRl9NQVBQRUQpIHsKKwkJaWYgKGFzX2xpc3RfbGVuID4gNjQpCisJCQlwdXJnZV9hZGRyZXNzZXMoKTsKKwkJYnAtPnBiX2FkZHIgPSB2bWFwKGJwLT5wYl9wYWdlcywgYnAtPnBiX3BhZ2VfY291bnQsCisJCQkJVk1fTUFQLCBQQUdFX0tFUk5FTCk7CisJCWlmICh1bmxpa2VseShicC0+cGJfYWRkciA9PSBOVUxMKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlicC0+cGJfYWRkciArPSBicC0+cGJfb2Zmc2V0OworCQlicC0+cGJfZmxhZ3MgfD0gUEJGX01BUFBFRDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUZpbmRpbmcgYW5kIFJlYWRpbmcgQnVmZmVycworICovCisKKy8qCisgKglfcGFnZWJ1Zl9maW5kCisgKgorICoJTG9va3MgdXAsIGFuZCBjcmVhdGVzIGlmIGFic2VudCwgYSBsb2NrYWJsZSBidWZmZXIgZm9yCisgKglhIGdpdmVuIHJhbmdlIG9mIGFuIGlub2RlLiAgVGhlIGJ1ZmZlciBpcyByZXR1cm5lZAorICoJbG9ja2VkLgkgSWYgb3RoZXIgb3ZlcmxhcHBpbmcgYnVmZmVycyBleGlzdCwgdGhleSBhcmUKKyAqCXJlbGVhc2VkIGJlZm9yZSB0aGUgbmV3IGJ1ZmZlciBpcyBjcmVhdGVkIGFuZCBsb2NrZWQsCisgKgl3aGljaCBtYXkgaW1wbHkgdGhhdCB0aGlzIGNhbGwgd2lsbCBibG9jayB1bnRpbCB0aG9zZSBidWZmZXJzCisgKglhcmUgdW5sb2NrZWQuICBObyBJL08gaXMgaW1wbGllZCBieSB0aGlzIGNhbGwuCisgKi8KK3hmc19idWZfdCAqCitfcGFnZWJ1Zl9maW5kKAorCXhmc19idWZ0YXJnX3QJCSpidHAsCS8qIGJsb2NrIGRldmljZSB0YXJnZXQJCSovCisJbG9mZl90CQkJaW9mZiwJLyogc3RhcnRpbmcgb2Zmc2V0IG9mIHJhbmdlCSovCisJc2l6ZV90CQkJaXNpemUsCS8qIGxlbmd0aCBvZiByYW5nZQkJKi8KKwlwYWdlX2J1Zl9mbGFnc190CWZsYWdzLAkvKiBQQkZfVFJZTE9DSwkJCSovCisJeGZzX2J1Zl90CQkqbmV3X3BiKS8qIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIJKi8KK3sKKwlsb2ZmX3QJCQlyYW5nZV9iYXNlOworCXNpemVfdAkJCXJhbmdlX2xlbmd0aDsKKwl4ZnNfYnVmaGFzaF90CQkqaGFzaDsKKwl4ZnNfYnVmX3QJCSpwYiwgKm47CisKKwlyYW5nZV9iYXNlID0gKGlvZmYgPDwgQkJTSElGVCk7CisJcmFuZ2VfbGVuZ3RoID0gKGlzaXplIDw8IEJCU0hJRlQpOworCisJLyogQ2hlY2sgZm9yIElPcyBzbWFsbGVyIHRoYW4gdGhlIHNlY3RvciBzaXplIC8gbm90IHNlY3RvciBhbGlnbmVkICovCisJQVNTRVJUKCEocmFuZ2VfbGVuZ3RoIDwgKDEgPDwgYnRwLT5wYnJfc3NoaWZ0KSkpOworCUFTU0VSVCghKHJhbmdlX2Jhc2UgJiAobG9mZl90KWJ0cC0+cGJyX3NtYXNrKSk7CisKKwloYXNoID0gJmJ0cC0+YnRfaGFzaFtoYXNoX2xvbmcoKHVuc2lnbmVkIGxvbmcpaW9mZiwgYnRwLT5idF9oYXNoc2hpZnQpXTsKKworCXNwaW5fbG9jaygmaGFzaC0+YmhfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGIsIG4sICZoYXNoLT5iaF9saXN0LCBwYl9oYXNoX2xpc3QpIHsKKwkJQVNTRVJUKGJ0cCA9PSBwYi0+cGJfdGFyZ2V0KTsKKwkJaWYgKHBiLT5wYl9maWxlX29mZnNldCA9PSByYW5nZV9iYXNlICYmCisJCSAgICBwYi0+cGJfYnVmZmVyX2xlbmd0aCA9PSByYW5nZV9sZW5ndGgpIHsKKwkJCS8qCisJCQkgKiBJZiB3ZSBsb29rIGF0IHNvbWV0aGluZyBicmluZyBpdCB0byB0aGUKKwkJCSAqIGZyb250IG9mIHRoZSBsaXN0IGZvciBuZXh0IHRpbWUuCisJCQkgKi8KKwkJCWF0b21pY19pbmMoJnBiLT5wYl9ob2xkKTsKKwkJCWxpc3RfbW92ZSgmcGItPnBiX2hhc2hfbGlzdCwgJmhhc2gtPmJoX2xpc3QpOworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKworCS8qIE5vIG1hdGNoIGZvdW5kICovCisJaWYgKG5ld19wYikgeworCQlfcGFnZWJ1Zl9pbml0aWFsaXplKG5ld19wYiwgYnRwLCByYW5nZV9iYXNlLAorCQkJCXJhbmdlX2xlbmd0aCwgZmxhZ3MpOworCQluZXdfcGItPnBiX2hhc2ggPSBoYXNoOworCQlsaXN0X2FkZCgmbmV3X3BiLT5wYl9oYXNoX2xpc3QsICZoYXNoLT5iaF9saXN0KTsKKwl9IGVsc2UgeworCQlYRlNfU1RBVFNfSU5DKHBiX21pc3NfbG9ja2VkKTsKKwl9CisKKwlzcGluX3VubG9jaygmaGFzaC0+YmhfbG9jayk7CisJcmV0dXJuIG5ld19wYjsKKworZm91bmQ6CisJc3Bpbl91bmxvY2soJmhhc2gtPmJoX2xvY2spOworCisJLyogQXR0ZW1wdCB0byBnZXQgdGhlIHNlbWFwaG9yZSB3aXRob3V0IHNsZWVwaW5nLAorCSAqIGlmIHRoaXMgZG9lcyBub3Qgd29yayB0aGVuIHdlIG5lZWQgdG8gZHJvcCB0aGUKKwkgKiBzcGlubG9jayBhbmQgZG8gYSBoYXJkIGF0dGVtcHQgb24gdGhlIHNlbWFwaG9yZS4KKwkgKi8KKwlpZiAoZG93bl90cnlsb2NrKCZwYi0+cGJfc2VtYSkpIHsKKwkJaWYgKCEoZmxhZ3MgJiBQQkZfVFJZTE9DSykpIHsKKwkJCS8qIHdhaXQgZm9yIGJ1ZmZlciBvd25lcnNoaXAgKi8KKwkJCVBCX1RSQUNFKHBiLCAiZ2V0X2xvY2siLCAwKTsKKwkJCXBhZ2VidWZfbG9jayhwYik7CisJCQlYRlNfU1RBVFNfSU5DKHBiX2dldF9sb2NrZWRfd2FpdGVkKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFdlIGFza2VkIGZvciBhIHRyeWxvY2sgYW5kIGZhaWxlZCwgbm8gbmVlZAorCQkJICogdG8gbG9vayBhdCBmaWxlIG9mZnNldCBhbmQgbGVuZ3RoIGhlcmUsIHdlCisJCQkgKiBrbm93IHRoYXQgdGhpcyBwYWdlYnVmIGF0IGxlYXN0IG92ZXJsYXBzIG91cgorCQkJICogcGFnZWJ1ZiBhbmQgaXMgbG9ja2VkLCB0aGVyZWZvcmUgb3VyIGJ1ZmZlcgorCQkJICogZWl0aGVyIGRvZXMgbm90IGV4aXN0LCBvciBpcyB0aGlzIGJ1ZmZlcgorCQkJICovCisKKwkJCXBhZ2VidWZfcmVsZShwYik7CisJCQlYRlNfU1RBVFNfSU5DKHBiX2J1c3lfbG9ja2VkKTsKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiB0cnlsb2NrIHdvcmtlZCAqLworCQlQQl9TRVRfT1dORVIocGIpOworCX0KKworCWlmIChwYi0+cGJfZmxhZ3MgJiBQQkZfU1RBTEUpCisJCXBiLT5wYl9mbGFncyAmPSBQQkZfTUFQUEVEOworCVBCX1RSQUNFKHBiLCAiZ290X2xvY2siLCAwKTsKKwlYRlNfU1RBVFNfSU5DKHBiX2dldF9sb2NrZWQpOworCXJldHVybiAocGIpOworfQorCisvKgorICoJeGZzX2J1Zl9nZXRfZmxhZ3MgYXNzZW1ibGVzIGEgYnVmZmVyIGNvdmVyaW5nIHRoZSBzcGVjaWZpZWQgcmFuZ2UuCisgKgorICoJU3RvcmFnZSBpbiBtZW1vcnkgZm9yIGFsbCBwb3J0aW9ucyBvZiB0aGUgYnVmZmVyIHdpbGwgYmUgYWxsb2NhdGVkLAorICoJYWx0aG91Z2ggYmFja2luZyBzdG9yYWdlIG1heSBub3QgYmUuCisgKi8KK3hmc19idWZfdCAqCit4ZnNfYnVmX2dldF9mbGFncygJCQkvKiBhbGxvY2F0ZSBhIGJ1ZmZlcgkJKi8KKwl4ZnNfYnVmdGFyZ190CQkqdGFyZ2V0LC8qIHRhcmdldCBmb3IgYnVmZmVyCQkqLworCWxvZmZfdAkJCWlvZmYsCS8qIHN0YXJ0aW5nIG9mZnNldCBvZiByYW5nZQkqLworCXNpemVfdAkJCWlzaXplLAkvKiBsZW5ndGggb2YgcmFuZ2UJCSovCisJcGFnZV9idWZfZmxhZ3NfdAlmbGFncykJLyogUEJGX1RSWUxPQ0sJCQkqLworeworCXhmc19idWZfdAkJKnBiLCAqbmV3X3BiOworCWludAkJCWVycm9yID0gMCwgaTsKKworCW5ld19wYiA9IHBhZ2VidWZfYWxsb2NhdGUoZmxhZ3MpOworCWlmICh1bmxpa2VseSghbmV3X3BiKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwYiA9IF9wYWdlYnVmX2ZpbmQodGFyZ2V0LCBpb2ZmLCBpc2l6ZSwgZmxhZ3MsIG5ld19wYik7CisJaWYgKHBiID09IG5ld19wYikgeworCQllcnJvciA9IF9wYWdlYnVmX2xvb2t1cF9wYWdlcyhwYiwgZmxhZ3MpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG5vX2J1ZmZlcjsKKwl9IGVsc2UgeworCQlwYWdlYnVmX2RlYWxsb2NhdGUobmV3X3BiKTsKKwkJaWYgKHVubGlrZWx5KHBiID09IE5VTEwpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHBiLT5wYl9wYWdlX2NvdW50OyBpKyspCisJCW1hcmtfcGFnZV9hY2Nlc3NlZChwYi0+cGJfcGFnZXNbaV0pOworCisJaWYgKCEocGItPnBiX2ZsYWdzICYgUEJGX01BUFBFRCkpIHsKKwkJZXJyb3IgPSBfcGFnZWJ1Zl9tYXBfcGFnZXMocGIsIGZsYWdzKTsKKwkJaWYgKHVubGlrZWx5KGVycm9yKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZhaWxlZCB0byBtYXAgcGFnZXNcbiIsCisJCQkJCV9fRlVOQ1RJT05fXyk7CisJCQlnb3RvIG5vX2J1ZmZlcjsKKwkJfQorCX0KKworCVhGU19TVEFUU19JTkMocGJfZ2V0KTsKKworCS8qCisJICogQWx3YXlzIGZpbGwgaW4gdGhlIGJsb2NrIG51bWJlciBub3csIHRoZSBtYXBwZWQgY2FzZXMgY2FuIGRvCisJICogdGhlaXIgb3duIG92ZXJsYXkgb2YgdGhpcyBsYXRlci4KKwkgKi8KKwlwYi0+cGJfYm4gPSBpb2ZmOworCXBiLT5wYl9jb3VudF9kZXNpcmVkID0gcGItPnBiX2J1ZmZlcl9sZW5ndGg7CisKKwlQQl9UUkFDRShwYiwgImdldCIsICh1bnNpZ25lZCBsb25nKWZsYWdzKTsKKwlyZXR1cm4gcGI7CisKKyBub19idWZmZXI6CisJaWYgKGZsYWdzICYgKFBCRl9MT0NLIHwgUEJGX1RSWUxPQ0spKQorCQlwYWdlYnVmX3VubG9jayhwYik7CisJcGFnZWJ1Zl9yZWxlKHBiKTsKKwlyZXR1cm4gTlVMTDsKK30KKworeGZzX2J1Zl90ICoKK3hmc19idWZfcmVhZF9mbGFncygKKwl4ZnNfYnVmdGFyZ190CQkqdGFyZ2V0LAorCWxvZmZfdAkJCWlvZmYsCisJc2l6ZV90CQkJaXNpemUsCisJcGFnZV9idWZfZmxhZ3NfdAlmbGFncykKK3sKKwl4ZnNfYnVmX3QJCSpwYjsKKworCWZsYWdzIHw9IFBCRl9SRUFEOworCisJcGIgPSB4ZnNfYnVmX2dldF9mbGFncyh0YXJnZXQsIGlvZmYsIGlzaXplLCBmbGFncyk7CisJaWYgKHBiKSB7CisJCWlmIChQQkZfTk9UX0RPTkUocGIpKSB7CisJCQlQQl9UUkFDRShwYiwgInJlYWQiLCAodW5zaWduZWQgbG9uZylmbGFncyk7CisJCQlYRlNfU1RBVFNfSU5DKHBiX2dldF9yZWFkKTsKKwkJCXBhZ2VidWZfaW9zdGFydChwYiwgZmxhZ3MpOworCQl9IGVsc2UgaWYgKGZsYWdzICYgUEJGX0FTWU5DKSB7CisJCQlQQl9UUkFDRShwYiwgInJlYWRfYXN5bmMiLCAodW5zaWduZWQgbG9uZylmbGFncyk7CisJCQkvKgorCQkJICogUmVhZCBhaGVhZCBjYWxsIHdoaWNoIGlzIGFscmVhZHkgc2F0aXNmaWVkLAorCQkJICogZHJvcCB0aGUgYnVmZmVyCisJCQkgKi8KKwkJCWdvdG8gbm9fYnVmZmVyOworCQl9IGVsc2UgeworCQkJUEJfVFJBQ0UocGIsICJyZWFkX2RvbmUiLCAodW5zaWduZWQgbG9uZylmbGFncyk7CisJCQkvKiBXZSBkbyBub3Qgd2FudCByZWFkIGluIHRoZSBmbGFncyAqLworCQkJcGItPnBiX2ZsYWdzICY9IH5QQkZfUkVBRDsKKwkJfQorCX0KKworCXJldHVybiBwYjsKKworIG5vX2J1ZmZlcjoKKwlpZiAoZmxhZ3MgJiAoUEJGX0xPQ0sgfCBQQkZfVFJZTE9DSykpCisJCXBhZ2VidWZfdW5sb2NrKHBiKTsKKwlwYWdlYnVmX3JlbGUocGIpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogQ3JlYXRlIGEgc2tlbGV0YWwgcGFnZWJ1ZiAobm8gcGFnZXMgYXNzb2NpYXRlZCB3aXRoIGl0KS4KKyAqLworeGZzX2J1Zl90ICoKK3BhZ2VidWZfbG9va3VwKAorCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQsCisJbG9mZl90CQkJaW9mZiwKKwlzaXplX3QJCQlpc2l6ZSwKKwlwYWdlX2J1Zl9mbGFnc190CWZsYWdzKQoreworCXhmc19idWZfdAkJKnBiOworCisJcGIgPSBwYWdlYnVmX2FsbG9jYXRlKGZsYWdzKTsKKwlpZiAocGIpIHsKKwkJX3BhZ2VidWZfaW5pdGlhbGl6ZShwYiwgdGFyZ2V0LCBpb2ZmLCBpc2l6ZSwgZmxhZ3MpOworCX0KKwlyZXR1cm4gcGI7Cit9CisKKy8qCisgKiBJZiB3ZSBhcmUgbm90IGxvdyBvbiBtZW1vcnkgdGhlbiBkbyB0aGUgcmVhZGFoZWFkIGluIGEgZGVhZGxvY2sKKyAqIHNhZmUgbWFubmVyLgorICovCit2b2lkCitwYWdlYnVmX3JlYWRhaGVhZCgKKwl4ZnNfYnVmdGFyZ190CQkqdGFyZ2V0LAorCWxvZmZfdAkJCWlvZmYsCisJc2l6ZV90CQkJaXNpemUsCisJcGFnZV9idWZfZmxhZ3NfdAlmbGFncykKK3sKKwlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpOworCisJYmRpID0gdGFyZ2V0LT5wYnJfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbzsKKwlpZiAoYmRpX3JlYWRfY29uZ2VzdGVkKGJkaSkpCisJCXJldHVybjsKKworCWZsYWdzIHw9IChQQkZfVFJZTE9DS3xQQkZfQVNZTkN8UEJGX1JFQURfQUhFQUQpOworCXhmc19idWZfcmVhZF9mbGFncyh0YXJnZXQsIGlvZmYsIGlzaXplLCBmbGFncyk7Cit9CisKK3hmc19idWZfdCAqCitwYWdlYnVmX2dldF9lbXB0eSgKKwlzaXplX3QJCQlsZW4sCisJeGZzX2J1ZnRhcmdfdAkJKnRhcmdldCkKK3sKKwl4ZnNfYnVmX3QJCSpwYjsKKworCXBiID0gcGFnZWJ1Zl9hbGxvY2F0ZSgwKTsKKwlpZiAocGIpCisJCV9wYWdlYnVmX2luaXRpYWxpemUocGIsIHRhcmdldCwgMCwgbGVuLCAwKTsKKwlyZXR1cm4gcGI7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKgorbWVtX3RvX3BhZ2UoCisJdm9pZAkJCSphZGRyKQoreworCWlmICgoKHVuc2lnbmVkIGxvbmcpYWRkciA8IFZNQUxMT0NfU1RBUlQpIHx8CisJICAgICgodW5zaWduZWQgbG9uZylhZGRyID49IFZNQUxMT0NfRU5EKSkgeworCQlyZXR1cm4gdmlydF90b19wYWdlKGFkZHIpOworCX0gZWxzZSB7CisJCXJldHVybiB2bWFsbG9jX3RvX3BhZ2UoYWRkcik7CisJfQorfQorCitpbnQKK3BhZ2VidWZfYXNzb2NpYXRlX21lbW9yeSgKKwl4ZnNfYnVmX3QJCSpwYiwKKwl2b2lkCQkJKm1lbSwKKwlzaXplX3QJCQlsZW4pCit7CisJaW50CQkJcnZhbDsKKwlpbnQJCQlpID0gMDsKKwlzaXplX3QJCQlwdHI7CisJc2l6ZV90CQkJZW5kLCBlbmRfY3VyOworCW9mZl90CQkJb2Zmc2V0OworCWludAkJCXBhZ2VfY291bnQ7CisKKwlwYWdlX2NvdW50ID0gUEFHRV9DQUNIRV9BTElHTihsZW4pID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJb2Zmc2V0ID0gKG9mZl90KSBtZW0gLSAoKG9mZl90KW1lbSAmIFBBR0VfQ0FDSEVfTUFTSyk7CisJaWYgKG9mZnNldCAmJiAobGVuID4gUEFHRV9DQUNIRV9TSVpFKSkKKwkJcGFnZV9jb3VudCsrOworCisJLyogRnJlZSBhbnkgcHJldmlvdXMgc2V0IG9mIHBhZ2UgcG9pbnRlcnMgKi8KKwlpZiAocGItPnBiX3BhZ2VzKQorCQlfcGFnZWJ1Zl9mcmVlX3BhZ2VzKHBiKTsKKworCXBiLT5wYl9wYWdlcyA9IE5VTEw7CisJcGItPnBiX2FkZHIgPSBtZW07CisKKwlydmFsID0gX3BhZ2VidWZfZ2V0X3BhZ2VzKHBiLCBwYWdlX2NvdW50LCAwKTsKKwlpZiAocnZhbCkKKwkJcmV0dXJuIHJ2YWw7CisKKwlwYi0+cGJfb2Zmc2V0ID0gb2Zmc2V0OworCXB0ciA9IChzaXplX3QpIG1lbSAmIFBBR0VfQ0FDSEVfTUFTSzsKKwllbmQgPSBQQUdFX0NBQ0hFX0FMSUdOKChzaXplX3QpIG1lbSArIGxlbik7CisJZW5kX2N1ciA9IGVuZDsKKwkvKiBzZXQgdXAgZmlyc3QgcGFnZSAqLworCXBiLT5wYl9wYWdlc1swXSA9IG1lbV90b19wYWdlKG1lbSk7CisKKwlwdHIgKz0gUEFHRV9DQUNIRV9TSVpFOworCXBiLT5wYl9wYWdlX2NvdW50ID0gKytpOworCXdoaWxlIChwdHIgPCBlbmQpIHsKKwkJcGItPnBiX3BhZ2VzW2ldID0gbWVtX3RvX3BhZ2UoKHZvaWQgKilwdHIpOworCQlwYi0+cGJfcGFnZV9jb3VudCA9ICsraTsKKwkJcHRyICs9IFBBR0VfQ0FDSEVfU0laRTsKKwl9CisJcGItPnBiX2xvY2tlZCA9IDA7CisKKwlwYi0+cGJfY291bnRfZGVzaXJlZCA9IHBiLT5wYl9idWZmZXJfbGVuZ3RoID0gbGVuOworCXBiLT5wYl9mbGFncyB8PSBQQkZfTUFQUEVEOworCisJcmV0dXJuIDA7Cit9CisKK3hmc19idWZfdCAqCitwYWdlYnVmX2dldF9ub19kYWRkcigKKwlzaXplX3QJCQlsZW4sCisJeGZzX2J1ZnRhcmdfdAkJKnRhcmdldCkKK3sKKwlzaXplX3QJCQltYWxsb2NfbGVuID0gbGVuOworCXhmc19idWZfdAkJKmJwOworCXZvaWQJCQkqZGF0YTsKKwlpbnQJCQllcnJvcjsKKworCWJwID0gcGFnZWJ1Zl9hbGxvY2F0ZSgwKTsKKwlpZiAodW5saWtlbHkoYnAgPT0gTlVMTCkpCisJCWdvdG8gZmFpbDsKKwlfcGFnZWJ1Zl9pbml0aWFsaXplKGJwLCB0YXJnZXQsIDAsIGxlbiwgUEJGX0ZPUkNFSU8pOworCisgdHJ5X2FnYWluOgorCWRhdGEgPSBrbWVtX2FsbG9jKG1hbGxvY19sZW4sIEtNX1NMRUVQIHwgS01fTUFZRkFJTCk7CisJaWYgKHVubGlrZWx5KGRhdGEgPT0gTlVMTCkpCisJCWdvdG8gZmFpbF9mcmVlX2J1ZjsKKworCS8qIGNoZWNrIHdoZXRoZXIgYWxpZ25tZW50IG1hdGNoZXMuLiAqLworCWlmICgoX19wc3Vuc2lnbmVkX3QpZGF0YSAhPQorCSAgICAoKF9fcHN1bnNpZ25lZF90KWRhdGEgJiB+dGFyZ2V0LT5wYnJfc21hc2spKSB7CisJCS8qIC4uIGVsc2UgZG91YmxlIHRoZSBzaXplIGFuZCB0cnkgYWdhaW4gKi8KKwkJa21lbV9mcmVlKGRhdGEsIG1hbGxvY19sZW4pOworCQltYWxsb2NfbGVuIDw8PSAxOworCQlnb3RvIHRyeV9hZ2FpbjsKKwl9CisKKwllcnJvciA9IHBhZ2VidWZfYXNzb2NpYXRlX21lbW9yeShicCwgZGF0YSwgbGVuKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbF9mcmVlX21lbTsKKwlicC0+cGJfZmxhZ3MgfD0gX1BCRl9LTUVNX0FMTE9DOworCisJcGFnZWJ1Zl91bmxvY2soYnApOworCisJUEJfVFJBQ0UoYnAsICJub19kYWRkciIsIGRhdGEpOworCXJldHVybiBicDsKKyBmYWlsX2ZyZWVfbWVtOgorCWttZW1fZnJlZShkYXRhLCBtYWxsb2NfbGVuKTsKKyBmYWlsX2ZyZWVfYnVmOgorCXBhZ2VidWZfZnJlZShicCk7CisgZmFpbDoKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqCXBhZ2VidWZfaG9sZAorICoKKyAqCUluY3JlbWVudCByZWZlcmVuY2UgY291bnQgb24gYnVmZmVyLCB0byBob2xkIHRoZSBidWZmZXIgY29uY3VycmVudGx5CisgKgl3aXRoIGFub3RoZXIgdGhyZWFkIHdoaWNoIG1heSByZWxlYXNlIChmcmVlKSB0aGUgYnVmZmVyIGFzeW5jaHJvbm91c2x5LgorICoKKyAqCU11c3QgaG9sZCB0aGUgYnVmZmVyIGFscmVhZHkgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLgorICovCit2b2lkCitwYWdlYnVmX2hvbGQoCisJeGZzX2J1Zl90CQkqcGIpCit7CisJYXRvbWljX2luYygmcGItPnBiX2hvbGQpOworCVBCX1RSQUNFKHBiLCAiaG9sZCIsIDApOworfQorCisvKgorICoJcGFnZWJ1Zl9yZWxlCisgKgorICoJcGFnZWJ1Zl9yZWxlIHJlbGVhc2VzIGEgaG9sZCBvbiB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4gIElmIHRoZQorICoJdGhlIGhvbGQgY291bnQgaXMgMSwgcGFnZWJ1Zl9yZWxlIGNhbGxzIHBhZ2VidWZfZnJlZS4KKyAqLwordm9pZAorcGFnZWJ1Zl9yZWxlKAorCXhmc19idWZfdAkJKnBiKQoreworCXhmc19idWZoYXNoX3QJCSpoYXNoID0gcGItPnBiX2hhc2g7CisKKwlQQl9UUkFDRShwYiwgInJlbGUiLCBwYi0+cGJfcmVsc2UpOworCisJLyoKKwkgKiBwYWdlYnVmX2xvb2t1cCBidWZmZXJzIGFyZSBub3QgaGFzaGVkLCBub3QgZGVsYXllZCB3cml0ZSwKKwkgKiBhbmQgZG9uJ3QgaGF2ZSB0aGVpciBvd24gcmVsZWFzZSByb3V0aW5lcy4gIFNwZWNpYWwgY2FzZS4KKwkgKi8KKwlpZiAodW5saWtlbHkoIWhhc2gpKSB7CisJCUFTU0VSVCghcGItPnBiX3JlbHNlKTsKKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnBiLT5wYl9ob2xkKSkKKwkJCXhmc19idWZfZnJlZShwYik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoYXRvbWljX2RlY19hbmRfbG9jaygmcGItPnBiX2hvbGQsICZoYXNoLT5iaF9sb2NrKSkgeworCQlpbnQJCWRvX2ZyZWUgPSAxOworCisJCWlmIChwYi0+cGJfcmVsc2UpIHsKKwkJCWF0b21pY19pbmMoJnBiLT5wYl9ob2xkKTsKKwkJCXNwaW5fdW5sb2NrKCZoYXNoLT5iaF9sb2NrKTsKKwkJCSgqKHBiLT5wYl9yZWxzZSkpIChwYik7CisJCQlzcGluX2xvY2soJmhhc2gtPmJoX2xvY2spOworCQkJZG9fZnJlZSA9IDA7CisJCX0KKworCQlpZiAocGItPnBiX2ZsYWdzICYgUEJGX0RFTFdSSSkgeworCQkJcGItPnBiX2ZsYWdzIHw9IFBCRl9BU1lOQzsKKwkJCWF0b21pY19pbmMoJnBiLT5wYl9ob2xkKTsKKwkJCXBhZ2VidWZfZGVsd3JpX3F1ZXVlKHBiLCAwKTsKKwkJCWRvX2ZyZWUgPSAwOworCQl9IGVsc2UgaWYgKHBiLT5wYl9mbGFncyAmIFBCRl9GU19NQU5BR0VEKSB7CisJCQlkb19mcmVlID0gMDsKKwkJfQorCisJCWlmIChkb19mcmVlKSB7CisJCQlsaXN0X2RlbF9pbml0KCZwYi0+cGJfaGFzaF9saXN0KTsKKwkJCXNwaW5fdW5sb2NrKCZoYXNoLT5iaF9sb2NrKTsKKwkJCXBhZ2VidWZfZnJlZShwYik7CisJCX0gZWxzZSB7CisJCQlzcGluX3VubG9jaygmaGFzaC0+YmhfbG9jayk7CisJCX0KKwl9Cit9CisKKworLyoKKyAqCU11dHVhbCBleGNsdXNpb24gb24gYnVmZmVycy4gIExvY2tpbmcgbW9kZWw6CisgKgorICoJQnVmZmVycyBhc3NvY2lhdGVkIHdpdGggaW5vZGVzIGZvciB3aGljaCBidWZmZXIgbG9ja2luZworICoJaXMgbm90IGVuYWJsZWQgYXJlIG5vdCBwcm90ZWN0ZWQgYnkgc2VtYXBob3JlcywgYW5kIGFyZQorICoJYXNzdW1lZCB0byBiZSBleGNsdXNpdmVseSBvd25lZCBieSB0aGUgY2FsbGVyLiAgVGhlcmUgaXMgYQorICoJc3BpbmxvY2sgaW4gdGhlIGJ1ZmZlciwgdXNlZCBieSB0aGUgY2FsbGVyIHdoZW4gY29uY3VycmVudAorICoJYWNjZXNzIGlzIHBvc3NpYmxlLgorICovCisKKy8qCisgKglwYWdlYnVmX2NvbmRfbG9jaworICoKKyAqCXBhZ2VidWZfY29uZF9sb2NrIGxvY2tzIGEgYnVmZmVyIG9iamVjdCwgaWYgaXQgaXMgbm90IGFscmVhZHkgbG9ja2VkLgorICoJTm90ZSB0aGF0IHRoaXMgaW4gbm8gd2F5CisgKglsb2NrcyB0aGUgdW5kZXJseWluZyBwYWdlcywgc28gaXQgaXMgb25seSB1c2VmdWwgZm9yIHN5bmNocm9uaXppbmcKKyAqCWNvbmN1cnJlbnQgdXNlIG9mIHBhZ2UgYnVmZmVyIG9iamVjdHMsIG5vdCBmb3Igc3luY2hyb25pemluZyBpbmRlcGVuZGVudAorICoJYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIHBhZ2VzLgorICovCitpbnQKK3BhZ2VidWZfY29uZF9sb2NrKAkJCS8qIGxvY2sgYnVmZmVyLCBpZiBub3QgbG9ja2VkCSovCisJCQkJCS8qIHJldHVybnMgLUVCVVNZIGlmIGxvY2tlZCkJKi8KKwl4ZnNfYnVmX3QJCSpwYikKK3sKKwlpbnQJCQlsb2NrZWQ7CisKKwlsb2NrZWQgPSBkb3duX3RyeWxvY2soJnBiLT5wYl9zZW1hKSA9PSAwOworCWlmIChsb2NrZWQpIHsKKwkJUEJfU0VUX09XTkVSKHBiKTsKKwl9CisJUEJfVFJBQ0UocGIsICJjb25kX2xvY2siLCAobG9uZylsb2NrZWQpOworCXJldHVybihsb2NrZWQgPyAwIDogLUVCVVNZKTsKK30KKworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoWEZTX0JMSV9UUkFDRSkKKy8qCisgKglwYWdlYnVmX2xvY2tfdmFsdWUKKyAqCisgKglSZXR1cm4gbG9jayB2YWx1ZSBmb3IgYSBwYWdlYnVmCisgKi8KK2ludAorcGFnZWJ1Zl9sb2NrX3ZhbHVlKAorCXhmc19idWZfdAkJKnBiKQoreworCXJldHVybihhdG9taWNfcmVhZCgmcGItPnBiX3NlbWEuY291bnQpKTsKK30KKyNlbmRpZgorCisvKgorICoJcGFnZWJ1Zl9sb2NrCisgKgorICoJcGFnZWJ1Zl9sb2NrIGxvY2tzIGEgYnVmZmVyIG9iamVjdC4gIE5vdGUgdGhhdCB0aGlzIGluIG5vIHdheQorICoJbG9ja3MgdGhlIHVuZGVybHlpbmcgcGFnZXMsIHNvIGl0IGlzIG9ubHkgdXNlZnVsIGZvciBzeW5jaHJvbml6aW5nCisgKgljb25jdXJyZW50IHVzZSBvZiBwYWdlIGJ1ZmZlciBvYmplY3RzLCBub3QgZm9yIHN5bmNocm9uaXppbmcgaW5kZXBlbmRlbnQKKyAqCWFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBwYWdlcy4KKyAqLworaW50CitwYWdlYnVmX2xvY2soCisJeGZzX2J1Zl90CQkqcGIpCit7CisJUEJfVFJBQ0UocGIsICJsb2NrIiwgMCk7CisJaWYgKGF0b21pY19yZWFkKCZwYi0+cGJfaW9fcmVtYWluaW5nKSkKKwkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKHBiLT5wYl90YXJnZXQtPnBicl9tYXBwaW5nKTsKKwlkb3duKCZwYi0+cGJfc2VtYSk7CisJUEJfU0VUX09XTkVSKHBiKTsKKwlQQl9UUkFDRShwYiwgImxvY2tlZCIsIDApOworCXJldHVybiAwOworfQorCisvKgorICoJcGFnZWJ1Zl91bmxvY2sKKyAqCisgKglwYWdlYnVmX3VubG9jayByZWxlYXNlcyB0aGUgbG9jayBvbiB0aGUgYnVmZmVyIG9iamVjdCBjcmVhdGVkIGJ5CisgKglwYWdlYnVmX2xvY2sgb3IgcGFnZWJ1Zl9jb25kX2xvY2sgKG5vdCBhbnkKKyAqCXBpbm5pbmcgb2YgdW5kZXJseWluZyBwYWdlcyBjcmVhdGVkIGJ5IHBhZ2VidWZfcGluKS4KKyAqLwordm9pZAorcGFnZWJ1Zl91bmxvY2soCQkJCS8qIHVubG9jayBidWZmZXIJCSovCisJeGZzX2J1Zl90CQkqcGIpCS8qIGJ1ZmZlciB0byB1bmxvY2sJCSovCit7CisJUEJfQ0xFQVJfT1dORVIocGIpOworCXVwKCZwYi0+cGJfc2VtYSk7CisJUEJfVFJBQ0UocGIsICJ1bmxvY2siLCAwKTsKK30KKworCisvKgorICoJUGlubmluZyBCdWZmZXIgU3RvcmFnZSBpbiBNZW1vcnkKKyAqLworCisvKgorICoJcGFnZWJ1Zl9waW4KKyAqCisgKglwYWdlYnVmX3BpbiBsb2NrcyBhbGwgb2YgdGhlIG1lbW9yeSByZXByZXNlbnRlZCBieSBhIGJ1ZmZlciBpbgorICoJbWVtb3J5LiAgTXVsdGlwbGUgY2FsbHMgdG8gcGFnZWJ1Zl9waW4gYW5kIHBhZ2VidWZfdW5waW4sIGZvcgorICoJdGhlIHNhbWUgb3IgZGlmZmVyZW50IGJ1ZmZlcnMgYWZmZWN0aW5nIGEgZ2l2ZW4gcGFnZSwgd2lsbAorICoJcHJvcGVybHkgY291bnQgdGhlIG51bWJlciBvZiBvdXRzdGFuZGluZyAicGluIiByZXF1ZXN0cy4gIFRoZQorICoJYnVmZmVyIG1heSBiZSByZWxlYXNlZCBhZnRlciB0aGUgcGFnZWJ1Zl9waW4gYW5kIGEgZGlmZmVyZW50CisgKglidWZmZXIgdXNlZCB3aGVuIGNhbGxpbmcgcGFnZWJ1Zl91bnBpbiwgaWYgZGVzaXJlZC4KKyAqCXBhZ2VidWZfcGluIHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBmaWxlIHN5c3RlbSB3aGVuIGl0IHdhbnRzIGJlCisgKglhc3N1cmVkIHRoYXQgbm8gYXR0ZW1wdCB3aWxsIGJlIG1hZGUgdG8gZm9yY2UgdGhlIGFmZmVjdGVkCisgKgltZW1vcnkgdG8gZGlzay4JIEl0IGRvZXMgbm90IGFzc3VyZSB0aGF0IGEgZ2l2ZW4gbG9naWNhbCBwYWdlCisgKgl3aWxsIG5vdCBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCBwaHlzaWNhbCBwYWdlLgorICovCit2b2lkCitwYWdlYnVmX3BpbigKKwl4ZnNfYnVmX3QJCSpwYikKK3sKKwlhdG9taWNfaW5jKCZwYi0+cGJfcGluX2NvdW50KTsKKwlQQl9UUkFDRShwYiwgInBpbiIsIChsb25nKXBiLT5wYl9waW5fY291bnQuY291bnRlcik7Cit9CisKKy8qCisgKglwYWdlYnVmX3VucGluCisgKgorICoJcGFnZWJ1Zl91bnBpbiByZXZlcnNlcyB0aGUgbG9ja2luZyBvZiBtZW1vcnkgcGVyZm9ybWVkIGJ5CisgKglwYWdlYnVmX3Bpbi4gIE5vdGUgdGhhdCBib3RoIGZ1bmN0aW9ucyBhZmZlY3RlZCB0aGUgbG9naWNhbAorICoJcGFnZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBidWZmZXIsIG5vdCB0aGUgYnVmZmVyIGl0c2VsZi4KKyAqLwordm9pZAorcGFnZWJ1Zl91bnBpbigKKwl4ZnNfYnVmX3QJCSpwYikKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcGItPnBiX3Bpbl9jb3VudCkpIHsKKwkJd2FrZV91cF9hbGwoJnBiLT5wYl93YWl0ZXJzKTsKKwl9CisJUEJfVFJBQ0UocGIsICJ1bnBpbiIsIChsb25nKXBiLT5wYl9waW5fY291bnQuY291bnRlcik7Cit9CisKK2ludAorcGFnZWJ1Zl9pc3BpbigKKwl4ZnNfYnVmX3QJCSpwYikKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJnBiLT5wYl9waW5fY291bnQpOworfQorCisvKgorICoJcGFnZWJ1Zl93YWl0X3VucGluCisgKgorICoJcGFnZWJ1Zl93YWl0X3VucGluIHdhaXRzIHVudGlsIGFsbCBvZiB0aGUgbWVtb3J5IGFzc29jaWF0ZWQKKyAqCXdpdGggdGhlIGJ1ZmZlciBpcyBub3QgbG9uZ2VyIGxvY2tlZCBpbiBtZW1vcnkuICBJdCByZXR1cm5zCisgKglpbW1lZGlhdGVseSBpZiBub25lIG9mIHRoZSBhZmZlY3RlZCBwYWdlcyBhcmUgbG9ja2VkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19wYWdlYnVmX3dhaXRfdW5waW4oCisJeGZzX2J1Zl90CQkqcGIpCit7CisJREVDTEFSRV9XQUlUUVVFVUUJKHdhaXQsIGN1cnJlbnQpOworCisJaWYgKGF0b21pY19yZWFkKCZwYi0+cGJfcGluX2NvdW50KSA9PSAwKQorCQlyZXR1cm47CisKKwlhZGRfd2FpdF9xdWV1ZSgmcGItPnBiX3dhaXRlcnMsICZ3YWl0KTsKKwlmb3IgKDs7KSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGF0b21pY19yZWFkKCZwYi0+cGJfcGluX2NvdW50KSA9PSAwKQorCQkJYnJlYWs7CisJCWlmIChhdG9taWNfcmVhZCgmcGItPnBiX2lvX3JlbWFpbmluZykpCisJCQlibGtfcnVuX2FkZHJlc3Nfc3BhY2UocGItPnBiX3RhcmdldC0+cGJyX21hcHBpbmcpOworCQlzY2hlZHVsZSgpOworCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcGItPnBiX3dhaXRlcnMsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworfQorCisvKgorICoJQnVmZmVyIFV0aWxpdHkgUm91dGluZXMKKyAqLworCisvKgorICoJcGFnZWJ1Zl9pb2RvbmUKKyAqCisgKglwYWdlYnVmX2lvZG9uZSBtYXJrcyBhIGJ1ZmZlciBmb3Igd2hpY2ggSS9PIGlzIGluIHByb2dyZXNzCisgKglkb25lIHdpdGggcmVzcGVjdCB0byB0aGF0IEkvTy4JVGhlIHBiX2lvZG9uZSByb3V0aW5lLCBpZgorICoJcHJlc2VudCwgd2lsbCBiZSBjYWxsZWQgYXMgYSBzaWRlLWVmZmVjdC4KKyAqLworU1RBVElDIHZvaWQKK3BhZ2VidWZfaW9kb25lX3dvcmsoCisJdm9pZAkJCSp2KQoreworCXhmc19idWZfdAkJKmJwID0gKHhmc19idWZfdCAqKXY7CisKKwlpZiAoYnAtPnBiX2lvZG9uZSkKKwkJKCooYnAtPnBiX2lvZG9uZSkpKGJwKTsKKwllbHNlIGlmIChicC0+cGJfZmxhZ3MgJiBQQkZfQVNZTkMpCisJCXhmc19idWZfcmVsc2UoYnApOworfQorCit2b2lkCitwYWdlYnVmX2lvZG9uZSgKKwl4ZnNfYnVmX3QJCSpwYiwKKwlpbnQJCQlkYXRhaW8sCisJaW50CQkJc2NoZWR1bGUpCit7CisJcGItPnBiX2ZsYWdzICY9IH4oUEJGX1JFQUQgfCBQQkZfV1JJVEUpOworCWlmIChwYi0+cGJfZXJyb3IgPT0gMCkgeworCQlwYi0+cGJfZmxhZ3MgJj0gfihQQkZfUEFSVElBTCB8IFBCRl9OT05FKTsKKwl9CisKKwlQQl9UUkFDRShwYiwgImlvZG9uZSIsIHBiLT5wYl9pb2RvbmUpOworCisJaWYgKChwYi0+cGJfaW9kb25lKSB8fCAocGItPnBiX2ZsYWdzICYgUEJGX0FTWU5DKSkgeworCQlpZiAoc2NoZWR1bGUpIHsKKwkJCUlOSVRfV09SSygmcGItPnBiX2lvZG9uZV93b3JrLCBwYWdlYnVmX2lvZG9uZV93b3JrLCBwYik7CisJCQlxdWV1ZV93b3JrKGRhdGFpbyA/IHBhZ2VidWZfZGF0YWlvX3dvcmtxdWV1ZSA6CisJCQkJcGFnZWJ1Zl9sb2dpb193b3JrcXVldWUsICZwYi0+cGJfaW9kb25lX3dvcmspOworCQl9IGVsc2UgeworCQkJcGFnZWJ1Zl9pb2RvbmVfd29yayhwYik7CisJCX0KKwl9IGVsc2UgeworCQl1cCgmcGItPnBiX2lvZG9uZXNlbWEpOworCX0KK30KKworLyoKKyAqCXBhZ2VidWZfaW9lcnJvcgorICoKKyAqCXBhZ2VidWZfaW9lcnJvciBzZXRzIHRoZSBlcnJvciBjb2RlIGZvciBhIGJ1ZmZlci4KKyAqLwordm9pZAorcGFnZWJ1Zl9pb2Vycm9yKAkJCS8qIG1hcmsvY2xlYXIgYnVmZmVyIGVycm9yIGZsYWcgKi8KKwl4ZnNfYnVmX3QJCSpwYiwJLyogYnVmZmVyIHRvIG1hcmsJCSovCisJaW50CQkJZXJyb3IpCS8qIGVycm9yIHRvIHN0b3JlICgwIGlmIG5vbmUpCSovCit7CisJQVNTRVJUKGVycm9yID49IDAgJiYgZXJyb3IgPD0gMHhmZmZmKTsKKwlwYi0+cGJfZXJyb3IgPSAodW5zaWduZWQgc2hvcnQpZXJyb3I7CisJUEJfVFJBQ0UocGIsICJpb2Vycm9yIiwgKHVuc2lnbmVkIGxvbmcpZXJyb3IpOworfQorCisvKgorICoJcGFnZWJ1Zl9pb3N0YXJ0CisgKgorICoJcGFnZWJ1Zl9pb3N0YXJ0IGluaXRpYXRlcyBJL08gb24gYSBidWZmZXIsIGJhc2VkIG9uIHRoZSBmbGFncyBzdXBwbGllZC4KKyAqCUlmIG5lY2Vzc2FyeSwgaXQgd2lsbCBhcnJhbmdlIGZvciBhbnkgZGlzayBzcGFjZSBhbGxvY2F0aW9uIHJlcXVpcmVkLAorICoJYW5kIGl0IHdpbGwgYnJlYWsgdXAgdGhlIHJlcXVlc3QgaWYgdGhlIGJsb2NrIG1hcHBpbmdzIHJlcXVpcmUgaXQuCisgKglUaGUgcGJfaW9kb25lIHJvdXRpbmUgaW4gdGhlIGJ1ZmZlciBzdXBwbGllZCB3aWxsIG9ubHkgYmUgY2FsbGVkCisgKgl3aGVuIGFsbCBvZiB0aGUgc3Vic2lkaWFyeSBJL08gcmVxdWVzdHMsIGlmIGFueSwgaGF2ZSBiZWVuIGNvbXBsZXRlZC4KKyAqCXBhZ2VidWZfaW9zdGFydCBjYWxscyB0aGUgcGFnZWJ1Zl9pb2luaXRpYXRlIHJvdXRpbmUgb3IKKyAqCXBhZ2VidWZfaW9yZXF1ZXN0LCBpZiB0aGUgZm9ybWVyIHJvdXRpbmUgaXMgbm90IGRlZmluZWQsIHRvIHN0YXJ0CisgKgl0aGUgSS9PIG9uIGEgZ2l2ZW4gbG93LWxldmVsIHJlcXVlc3QuCisgKi8KK2ludAorcGFnZWJ1Zl9pb3N0YXJ0KAkJCS8qIHN0YXJ0IEkvTyBvbiBhIGJ1ZmZlcgkgICovCisJeGZzX2J1Zl90CQkqcGIsCS8qIGJ1ZmZlciB0byBzdGFydAkJICAqLworCXBhZ2VfYnVmX2ZsYWdzX3QJZmxhZ3MpCS8qIFBCRl9MT0NLLCBQQkZfQVNZTkMsIFBCRl9SRUFELCAqLworCQkJCQkvKiBQQkZfV1JJVEUsIFBCRl9ERUxXUkksCSAgKi8KKwkJCQkJLyogUEJGX0RPTlRfQkxPQ0sJCSAgKi8KK3sKKwlpbnQJCQlzdGF0dXMgPSAwOworCisJUEJfVFJBQ0UocGIsICJpb3N0YXJ0IiwgKHVuc2lnbmVkIGxvbmcpZmxhZ3MpOworCisJaWYgKGZsYWdzICYgUEJGX0RFTFdSSSkgeworCQlwYi0+cGJfZmxhZ3MgJj0gfihQQkZfUkVBRCB8IFBCRl9XUklURSB8IFBCRl9BU1lOQyk7CisJCXBiLT5wYl9mbGFncyB8PSBmbGFncyAmIChQQkZfREVMV1JJIHwgUEJGX0FTWU5DKTsKKwkJcGFnZWJ1Zl9kZWx3cmlfcXVldWUocGIsIDEpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXBiLT5wYl9mbGFncyAmPSB+KFBCRl9SRUFEIHwgUEJGX1dSSVRFIHwgUEJGX0FTWU5DIHwgUEJGX0RFTFdSSSB8IFwKKwkJCVBCRl9SRUFEX0FIRUFEIHwgX1BCRl9SVU5fUVVFVUVTKTsKKwlwYi0+cGJfZmxhZ3MgfD0gZmxhZ3MgJiAoUEJGX1JFQUQgfCBQQkZfV1JJVEUgfCBQQkZfQVNZTkMgfCBcCisJCQlQQkZfUkVBRF9BSEVBRCB8IF9QQkZfUlVOX1FVRVVFUyk7CisKKwlCVUdfT04ocGItPnBiX2JuID09IFhGU19CVUZfREFERFJfTlVMTCk7CisKKwkvKiBGb3Igd3JpdGVzIGFsbG93IGFuIGFsdGVybmF0ZSBzdHJhdGVneSByb3V0aW5lIHRvIHByZWNlZGUKKwkgKiB0aGUgYWN0dWFsIEkvTyByZXF1ZXN0ICh3aGljaCBtYXkgbm90IGJlIGlzc3VlZCBhdCBhbGwgaW4KKwkgKiBhIHNodXRkb3duIHNpdHVhdGlvbiwgZm9yIGV4YW1wbGUpLgorCSAqLworCXN0YXR1cyA9IChmbGFncyAmIFBCRl9XUklURSkgPworCQlwYWdlYnVmX2lvc3RyYXRlZ3kocGIpIDogcGFnZWJ1Zl9pb3JlcXVlc3QocGIpOworCisJLyogV2FpdCBmb3IgSS9PIGlmIHdlIGFyZSBub3QgYW4gYXN5bmMgcmVxdWVzdC4KKwkgKiBOb3RlOiBhc3luYyBJL08gcmVxdWVzdCBjb21wbGV0aW9uIHdpbGwgcmVsZWFzZSB0aGUgYnVmZmVyLAorCSAqIGFuZCB0aGF0IGNhbiBhbHJlYWR5IGJlIGRvbmUgYnkgdGhpcyBwb2ludC4gIFNvIHVzaW5nIHRoZQorCSAqIGJ1ZmZlciBwb2ludGVyIGZyb20gaGVyZSBvbiwgYWZ0ZXIgYXN5bmMgSS9PLCBpcyBpbnZhbGlkLgorCSAqLworCWlmICghc3RhdHVzICYmICEoZmxhZ3MgJiBQQkZfQVNZTkMpKQorCQlzdGF0dXMgPSBwYWdlYnVmX2lvd2FpdChwYik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogSGVscGVyIHJvdXRpbmUgZm9yIHBhZ2VidWZfaW9yZXF1ZXN0CisgKi8KKworU1RBVElDIF9faW5saW5lX18gaW50CitfcGFnZWJ1Zl9pb2xvY2tlZCgKKwl4ZnNfYnVmX3QJCSpwYikKK3sKKwlBU1NFUlQocGItPnBiX2ZsYWdzICYgKFBCRl9SRUFEfFBCRl9XUklURSkpOworCWlmIChwYi0+cGJfZmxhZ3MgJiBQQkZfUkVBRCkKKwkJcmV0dXJuIHBiLT5wYl9sb2NrZWQ7CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBfX2lubGluZV9fIHZvaWQKK19wYWdlYnVmX2lvZG9uZSgKKwl4ZnNfYnVmX3QJCSpwYiwKKwlpbnQJCQlzY2hlZHVsZSkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcGItPnBiX2lvX3JlbWFpbmluZykgPT0gMSkgeworCQlwYi0+cGJfbG9ja2VkID0gMDsKKwkJcGFnZWJ1Zl9pb2RvbmUocGIsIChwYi0+cGJfZmxhZ3MgJiBQQkZfRlNfREFUQUlPRCksIHNjaGVkdWxlKTsKKwl9Cit9CisKK1NUQVRJQyBpbnQKK2Jpb19lbmRfaW9fcGFnZWJ1ZigKKwlzdHJ1Y3QgYmlvCQkqYmlvLAorCXVuc2lnbmVkIGludAkJYnl0ZXNfZG9uZSwKKwlpbnQJCQllcnJvcikKK3sKKwl4ZnNfYnVmX3QJCSpwYiA9ICh4ZnNfYnVmX3QgKiliaW8tPmJpX3ByaXZhdGU7CisJdW5zaWduZWQgaW50CQlpLCBibG9ja3NpemUgPSBwYi0+cGJfdGFyZ2V0LT5wYnJfYnNpemU7CisJc3RydWN0IGJpb192ZWMJCSpidmVjID0gYmlvLT5iaV9pb192ZWM7CisKKwlpZiAoYmlvLT5iaV9zaXplKQorCQlyZXR1cm4gMTsKKworCWlmICghdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncykpCisJCXBiLT5wYl9lcnJvciA9IEVJTzsKKworCWZvciAoaSA9IDA7IGkgPCBiaW8tPmJpX3ZjbnQ7IGkrKywgYnZlYysrKSB7CisJCXN0cnVjdCBwYWdlCSpwYWdlID0gYnZlYy0+YnZfcGFnZTsKKworCQlpZiAocGItPnBiX2Vycm9yKSB7CisJCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJCX0gZWxzZSBpZiAoYmxvY2tzaXplID09IFBBR0VfQ0FDSEVfU0laRSkgeworCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCQl9IGVsc2UgaWYgKCFQYWdlUHJpdmF0ZShwYWdlKSAmJgorCQkJCShwYi0+cGJfZmxhZ3MgJiBfUEJGX1BBR0VfQ0FDSEUpKSB7CisJCQlzZXRfcGFnZV9yZWdpb24ocGFnZSwgYnZlYy0+YnZfb2Zmc2V0LCBidmVjLT5idl9sZW4pOworCQl9CisKKwkJaWYgKF9wYWdlYnVmX2lvbG9ja2VkKHBiKSkgeworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCX0KKwl9CisKKwlfcGFnZWJ1Zl9pb2RvbmUocGIsIDEpOworCWJpb19wdXQoYmlvKTsKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIHZvaWQKK19wYWdlYnVmX2lvYXBwbHkoCisJeGZzX2J1Zl90CQkqcGIpCit7CisJaW50CQkJaSwgcncsIG1hcF9pLCB0b3RhbF9ucl9wYWdlcywgbnJfcGFnZXM7CisJc3RydWN0IGJpbwkJKmJpbzsKKwlpbnQJCQlvZmZzZXQgPSBwYi0+cGJfb2Zmc2V0OworCWludAkJCXNpemUgPSBwYi0+cGJfY291bnRfZGVzaXJlZDsKKwlzZWN0b3JfdAkJc2VjdG9yID0gcGItPnBiX2JuOworCXVuc2lnbmVkIGludAkJYmxvY2tzaXplID0gcGItPnBiX3RhcmdldC0+cGJyX2JzaXplOworCWludAkJCWxvY2tpbmcgPSBfcGFnZWJ1Zl9pb2xvY2tlZChwYik7CisKKwl0b3RhbF9ucl9wYWdlcyA9IHBiLT5wYl9wYWdlX2NvdW50OworCW1hcF9pID0gMDsKKworCWlmIChwYi0+cGJfZmxhZ3MgJiBfUEJGX1JVTl9RVUVVRVMpIHsKKwkJcGItPnBiX2ZsYWdzICY9IH5fUEJGX1JVTl9RVUVVRVM7CisJCXJ3ID0gKHBiLT5wYl9mbGFncyAmIFBCRl9SRUFEKSA/IFJFQURfU1lOQyA6IFdSSVRFX1NZTkM7CisJfSBlbHNlIHsKKwkJcncgPSAocGItPnBiX2ZsYWdzICYgUEJGX1JFQUQpID8gUkVBRCA6IFdSSVRFOworCX0KKworCS8qIFNwZWNpYWwgY29kZSBwYXRoIGZvciByZWFkaW5nIGEgc3ViIHBhZ2Ugc2l6ZSBwYWdlYnVmIGluIC0tCisJICogd2UgcG9wdWxhdGUgdXAgdGhlIHdob2xlIHBhZ2UsIGFuZCBoZW5jZSB0aGUgb3RoZXIgbWV0YWRhdGEKKwkgKiBpbiB0aGUgc2FtZSBwYWdlLiAgVGhpcyBvcHRpbWl6YXRpb24gaXMgb25seSB2YWxpZCB3aGVuIHRoZQorCSAqIGZpbGVzeXN0ZW0gYmxvY2sgc2l6ZSBhbmQgdGhlIHBhZ2Ugc2l6ZSBhcmUgZXF1YWwuCisJICovCisJaWYgKChwYi0+cGJfYnVmZmVyX2xlbmd0aCA8IFBBR0VfQ0FDSEVfU0laRSkgJiYKKwkgICAgKHBiLT5wYl9mbGFncyAmIFBCRl9SRUFEKSAmJiBsb2NraW5nICYmCisJICAgIChibG9ja3NpemUgPT0gUEFHRV9DQUNIRV9TSVpFKSkgeworCQliaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIDEpOworCisJCWJpby0+YmlfYmRldiA9IHBiLT5wYl90YXJnZXQtPnBicl9iZGV2OworCQliaW8tPmJpX3NlY3RvciA9IHNlY3RvciAtIChvZmZzZXQgPj4gQkJTSElGVCk7CisJCWJpby0+YmlfZW5kX2lvID0gYmlvX2VuZF9pb19wYWdlYnVmOworCQliaW8tPmJpX3ByaXZhdGUgPSBwYjsKKworCQliaW9fYWRkX3BhZ2UoYmlvLCBwYi0+cGJfcGFnZXNbMF0sIFBBR0VfQ0FDSEVfU0laRSwgMCk7CisJCXNpemUgPSAwOworCisJCWF0b21pY19pbmMoJnBiLT5wYl9pb19yZW1haW5pbmcpOworCisJCWdvdG8gc3VibWl0X2lvOworCX0KKworCS8qIExvY2sgZG93biB0aGUgcGFnZXMgd2hpY2ggd2UgbmVlZCB0byBmb3IgdGhlIHJlcXVlc3QgKi8KKwlpZiAobG9ja2luZyAmJiAocGItPnBiX2ZsYWdzICYgUEJGX1dSSVRFKSAmJiAocGItPnBiX2xvY2tlZCA9PSAwKSkgeworCQlmb3IgKGkgPSAwOyBzaXplOyBpKyspIHsKKwkJCWludAkJbmJ5dGVzID0gUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0OworCQkJc3RydWN0IHBhZ2UJKnBhZ2UgPSBwYi0+cGJfcGFnZXNbaV07CisKKwkJCWlmIChuYnl0ZXMgPiBzaXplKQorCQkJCW5ieXRlcyA9IHNpemU7CisKKwkJCWxvY2tfcGFnZShwYWdlKTsKKworCQkJc2l6ZSAtPSBuYnl0ZXM7CisJCQlvZmZzZXQgPSAwOworCQl9CisJCW9mZnNldCA9IHBiLT5wYl9vZmZzZXQ7CisJCXNpemUgPSBwYi0+cGJfY291bnRfZGVzaXJlZDsKKwl9CisKK25leHRfY2h1bms6CisJYXRvbWljX2luYygmcGItPnBiX2lvX3JlbWFpbmluZyk7CisJbnJfcGFnZXMgPSBCSU9fTUFYX1NFQ1RPUlMgPj4gKFBBR0VfU0hJRlQgLSBCQlNISUZUKTsKKwlpZiAobnJfcGFnZXMgPiB0b3RhbF9ucl9wYWdlcykKKwkJbnJfcGFnZXMgPSB0b3RhbF9ucl9wYWdlczsKKworCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9JTywgbnJfcGFnZXMpOworCWJpby0+YmlfYmRldiA9IHBiLT5wYl90YXJnZXQtPnBicl9iZGV2OworCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yOworCWJpby0+YmlfZW5kX2lvID0gYmlvX2VuZF9pb19wYWdlYnVmOworCWJpby0+YmlfcHJpdmF0ZSA9IHBiOworCisJZm9yICg7IHNpemUgJiYgbnJfcGFnZXM7IG5yX3BhZ2VzLS0sIG1hcF9pKyspIHsKKwkJaW50CW5ieXRlcyA9IFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldDsKKworCQlpZiAobmJ5dGVzID4gc2l6ZSkKKwkJCW5ieXRlcyA9IHNpemU7CisKKwkJaWYgKGJpb19hZGRfcGFnZShiaW8sIHBiLT5wYl9wYWdlc1ttYXBfaV0sCisJCQkJCW5ieXRlcywgb2Zmc2V0KSA8IG5ieXRlcykKKwkJCWJyZWFrOworCisJCW9mZnNldCA9IDA7CisJCXNlY3RvciArPSBuYnl0ZXMgPj4gQkJTSElGVDsKKwkJc2l6ZSAtPSBuYnl0ZXM7CisJCXRvdGFsX25yX3BhZ2VzLS07CisJfQorCitzdWJtaXRfaW86CisJaWYgKGxpa2VseShiaW8tPmJpX3NpemUpKSB7CisJCXN1Ym1pdF9iaW8ocncsIGJpbyk7CisJCWlmIChzaXplKQorCQkJZ290byBuZXh0X2NodW5rOworCX0gZWxzZSB7CisJCWJpb19wdXQoYmlvKTsKKwkJcGFnZWJ1Zl9pb2Vycm9yKHBiLCBFSU8pOworCX0KK30KKworLyoKKyAqCXBhZ2VidWZfaW9yZXF1ZXN0IC0tIHRoZSBjb3JlIEkvTyByZXF1ZXN0IHJvdXRpbmUuCisgKi8KK2ludAorcGFnZWJ1Zl9pb3JlcXVlc3QoCQkJLyogc3RhcnQgcmVhbCBJL08JCSovCisJeGZzX2J1Zl90CQkqcGIpCS8qIGJ1ZmZlciB0byBjb252ZXkgdG8gZGV2aWNlCSovCit7CisJUEJfVFJBQ0UocGIsICJpb3JlcXVlc3QiLCAwKTsKKworCWlmIChwYi0+cGJfZmxhZ3MgJiBQQkZfREVMV1JJKSB7CisJCXBhZ2VidWZfZGVsd3JpX3F1ZXVlKHBiLCAxKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBiLT5wYl9mbGFncyAmIFBCRl9XUklURSkgeworCQlfcGFnZWJ1Zl93YWl0X3VucGluKHBiKTsKKwl9CisKKwlwYWdlYnVmX2hvbGQocGIpOworCisJLyogU2V0IHRoZSBjb3VudCB0byAxIGluaXRpYWxseSwgdGhpcyB3aWxsIHN0b3AgYW4gSS9PCisJICogY29tcGxldGlvbiBjYWxsb3V0IHdoaWNoIGhhcHBlbnMgYmVmb3JlIHdlIGhhdmUgc3RhcnRlZAorCSAqIGFsbCB0aGUgSS9PIGZyb20gY2FsbGluZyBwYWdlYnVmX2lvZG9uZSB0b28gZWFybHkuCisJICovCisJYXRvbWljX3NldCgmcGItPnBiX2lvX3JlbWFpbmluZywgMSk7CisJX3BhZ2VidWZfaW9hcHBseShwYik7CisJX3BhZ2VidWZfaW9kb25lKHBiLCAwKTsKKworCXBhZ2VidWZfcmVsZShwYik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglwYWdlYnVmX2lvd2FpdAorICoKKyAqCXBhZ2VidWZfaW93YWl0IHdhaXRzIGZvciBJL08gdG8gY29tcGxldGUgb24gdGhlIGJ1ZmZlciBzdXBwbGllZC4KKyAqCUl0IHJldHVybnMgaW1tZWRpYXRlbHkgaWYgbm8gSS9PIGlzIHBlbmRpbmcuICBJbiBhbnkgY2FzZSwgaXQgcmV0dXJucworICoJdGhlIGVycm9yIGNvZGUsIGlmIGFueSwgb3IgMCBpZiB0aGVyZSBpcyBubyBlcnJvci4KKyAqLworaW50CitwYWdlYnVmX2lvd2FpdCgKKwl4ZnNfYnVmX3QJCSpwYikKK3sKKwlQQl9UUkFDRShwYiwgImlvd2FpdCIsIDApOworCWlmIChhdG9taWNfcmVhZCgmcGItPnBiX2lvX3JlbWFpbmluZykpCisJCWJsa19ydW5fYWRkcmVzc19zcGFjZShwYi0+cGJfdGFyZ2V0LT5wYnJfbWFwcGluZyk7CisJZG93bigmcGItPnBiX2lvZG9uZXNlbWEpOworCVBCX1RSQUNFKHBiLCAiaW93YWl0ZWQiLCAobG9uZylwYi0+cGJfZXJyb3IpOworCXJldHVybiBwYi0+cGJfZXJyb3I7Cit9CisKK2NhZGRyX3QKK3BhZ2VidWZfb2Zmc2V0KAorCXhmc19idWZfdAkJKnBiLAorCXNpemVfdAkJCW9mZnNldCkKK3sKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2U7CisKKwlvZmZzZXQgKz0gcGItPnBiX29mZnNldDsKKworCXBhZ2UgPSBwYi0+cGJfcGFnZXNbb2Zmc2V0ID4+IFBBR0VfQ0FDSEVfU0hJRlRdOworCXJldHVybiAoY2FkZHJfdCkgcGFnZV9hZGRyZXNzKHBhZ2UpICsgKG9mZnNldCAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7Cit9CisKKy8qCisgKglwYWdlYnVmX2lvbW92ZQorICoKKyAqCU1vdmUgZGF0YSBpbnRvIG9yIG91dCBvZiBhIGJ1ZmZlci4KKyAqLwordm9pZAorcGFnZWJ1Zl9pb21vdmUoCisJeGZzX2J1Zl90CQkqcGIsCS8qIGJ1ZmZlciB0byBwcm9jZXNzCQkqLworCXNpemVfdAkJCWJvZmYsCS8qIHN0YXJ0aW5nIGJ1ZmZlciBvZmZzZXQJKi8KKwlzaXplX3QJCQlic2l6ZSwJLyogbGVuZ3RoIHRvIGNvcHkJCSovCisJY2FkZHJfdAkJCWRhdGEsCS8qIGRhdGEgYWRkcmVzcwkJCSovCisJcGFnZV9idWZfcndfdAkJbW9kZSkJLyogcmVhZC93cml0ZSBmbGFnCQkqLworeworCXNpemVfdAkJCWJlbmQsIGNwb2ZmLCBjc2l6ZTsKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2U7CisKKwliZW5kID0gYm9mZiArIGJzaXplOworCXdoaWxlIChib2ZmIDwgYmVuZCkgeworCQlwYWdlID0gcGItPnBiX3BhZ2VzW3BhZ2VfYnVmX2J0b2N0KGJvZmYgKyBwYi0+cGJfb2Zmc2V0KV07CisJCWNwb2ZmID0gcGFnZV9idWZfcG9mZihib2ZmICsgcGItPnBiX29mZnNldCk7CisJCWNzaXplID0gbWluX3Qoc2l6ZV90LAorCQkJICAgICAgUEFHRV9DQUNIRV9TSVpFLWNwb2ZmLCBwYi0+cGJfY291bnRfZGVzaXJlZC1ib2ZmKTsKKworCQlBU1NFUlQoKChjc2l6ZSArIGNwb2ZmKSA8PSBQQUdFX0NBQ0hFX1NJWkUpKTsKKworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBQQlJXX1pFUk86CisJCQltZW1zZXQocGFnZV9hZGRyZXNzKHBhZ2UpICsgY3BvZmYsIDAsIGNzaXplKTsKKwkJCWJyZWFrOworCQljYXNlIFBCUldfUkVBRDoKKwkJCW1lbWNweShkYXRhLCBwYWdlX2FkZHJlc3MocGFnZSkgKyBjcG9mZiwgY3NpemUpOworCQkJYnJlYWs7CisJCWNhc2UgUEJSV19XUklURToKKwkJCW1lbWNweShwYWdlX2FkZHJlc3MocGFnZSkgKyBjcG9mZiwgZGF0YSwgY3NpemUpOworCQl9CisKKwkJYm9mZiArPSBjc2l6ZTsKKwkJZGF0YSArPSBjc2l6ZTsKKwl9Cit9CisKKy8qCisgKglIYW5kbGluZyBvZiBidWZ0YXJncy4KKyAqLworCisvKgorICogV2FpdCBmb3IgYW55IGJ1ZnMgd2l0aCBjYWxsYmFja3MgdGhhdCBoYXZlIGJlZW4gc3VibWl0dGVkIGJ1dAorICogaGF2ZSBub3QgeWV0IHJldHVybmVkLi4uIHdhbGsgdGhlIGhhc2ggbGlzdCBmb3IgdGhlIHRhcmdldC4KKyAqLwordm9pZAoreGZzX3dhaXRfYnVmdGFyZygKKwl4ZnNfYnVmdGFyZ190CSpidHApCit7CisJeGZzX2J1Zl90CSpicCwgKm47CisJeGZzX2J1Zmhhc2hfdAkqaGFzaDsKKwl1aW50CQlpOworCisJZm9yIChpID0gMDsgaSA8ICgxIDw8IGJ0cC0+YnRfaGFzaHNoaWZ0KTsgaSsrKSB7CisJCWhhc2ggPSAmYnRwLT5idF9oYXNoW2ldOworYWdhaW46CisJCXNwaW5fbG9jaygmaGFzaC0+YmhfbG9jayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShicCwgbiwgJmhhc2gtPmJoX2xpc3QsIHBiX2hhc2hfbGlzdCkgeworCQkJQVNTRVJUKGJ0cCA9PSBicC0+cGJfdGFyZ2V0KTsKKwkJCWlmICghKGJwLT5wYl9mbGFncyAmIFBCRl9GU19NQU5BR0VEKSkgeworCQkJCXNwaW5fdW5sb2NrKCZoYXNoLT5iaF9sb2NrKTsKKwkJCQlkZWxheSgxMDApOworCQkJCWdvdG8gYWdhaW47CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2soJmhhc2gtPmJoX2xvY2spOworCX0KK30KKworLyoKKyAqIEFsbG9jYXRlIGJ1ZmZlciBoYXNoIHRhYmxlIGZvciBhIGdpdmVuIHRhcmdldC4KKyAqIEZvciBkZXZpY2VzIGNvbnRhaW5pbmcgbWV0YWRhdGEgKGkuZS4gbm90IHRoZSBsb2cvcmVhbHRpbWUgZGV2aWNlcykKKyAqIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSBtdWNoIGxhcmdlciBoYXNoIHRhYmxlLgorICovCitTVEFUSUMgdm9pZAoreGZzX2FsbG9jX2J1Zmhhc2goCisJeGZzX2J1ZnRhcmdfdAkJKmJ0cCwKKwlpbnQJCQlleHRlcm5hbCkKK3sKKwl1bnNpZ25lZCBpbnQJCWk7CisKKwlidHAtPmJ0X2hhc2hzaGlmdCA9IGV4dGVybmFsID8gMyA6IDg7CS8qIDggb3IgMjU2IGJ1Y2tldHMgKi8KKwlidHAtPmJ0X2hhc2htYXNrID0gKDEgPDwgYnRwLT5idF9oYXNoc2hpZnQpIC0gMTsKKwlidHAtPmJ0X2hhc2ggPSBrbWVtX3phbGxvYygoMSA8PCBidHAtPmJ0X2hhc2hzaGlmdCkgKgorCQkJCQlzaXplb2YoeGZzX2J1Zmhhc2hfdCksIEtNX1NMRUVQKTsKKwlmb3IgKGkgPSAwOyBpIDwgKDEgPDwgYnRwLT5idF9oYXNoc2hpZnQpOyBpKyspIHsKKwkJc3Bpbl9sb2NrX2luaXQoJmJ0cC0+YnRfaGFzaFtpXS5iaF9sb2NrKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmJ0cC0+YnRfaGFzaFtpXS5iaF9saXN0KTsKKwl9Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfZnJlZV9idWZoYXNoKAorCXhmc19idWZ0YXJnX3QJCSpidHApCit7CisJa21lbV9mcmVlKGJ0cC0+YnRfaGFzaCwKKwkJCSgxIDw8IGJ0cC0+YnRfaGFzaHNoaWZ0KSAqIHNpemVvZih4ZnNfYnVmaGFzaF90KSk7CisJYnRwLT5idF9oYXNoID0gTlVMTDsKK30KKwordm9pZAoreGZzX2ZyZWVfYnVmdGFyZygKKwl4ZnNfYnVmdGFyZ190CQkqYnRwLAorCWludAkJCWV4dGVybmFsKQoreworCXhmc19mbHVzaF9idWZ0YXJnKGJ0cCwgMSk7CisJaWYgKGV4dGVybmFsKQorCQl4ZnNfYmxrZGV2X3B1dChidHAtPnBicl9iZGV2KTsKKwl4ZnNfZnJlZV9idWZoYXNoKGJ0cCk7CisJaXB1dChidHAtPnBicl9tYXBwaW5nLT5ob3N0KTsKKwlrbWVtX2ZyZWUoYnRwLCBzaXplb2YoKmJ0cCkpOworfQorCit2b2lkCit4ZnNfaW5jb3JlX3JlbHNlKAorCXhmc19idWZ0YXJnX3QJCSpidHAsCisJaW50CQkJZGVsd3JpX29ubHksCisJaW50CQkJd2FpdCkKK3sKKwlpbnZhbGlkYXRlX2JkZXYoYnRwLT5wYnJfYmRldiwgMSk7CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoYnRwLT5wYnJfbWFwcGluZywgMExMKTsKK30KKworU1RBVElDIGludAoreGZzX3NldHNpemVfYnVmdGFyZ19mbGFncygKKwl4ZnNfYnVmdGFyZ190CQkqYnRwLAorCXVuc2lnbmVkIGludAkJYmxvY2tzaXplLAorCXVuc2lnbmVkIGludAkJc2VjdG9yc2l6ZSwKKwlpbnQJCQl2ZXJib3NlKQoreworCWJ0cC0+cGJyX2JzaXplID0gYmxvY2tzaXplOworCWJ0cC0+cGJyX3NzaGlmdCA9IGZmcyhzZWN0b3JzaXplKSAtIDE7CisJYnRwLT5wYnJfc21hc2sgPSBzZWN0b3JzaXplIC0gMTsKKworCWlmIChzZXRfYmxvY2tzaXplKGJ0cC0+cGJyX2JkZXYsIHNlY3RvcnNpemUpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJYRlM6IENhbm5vdCBzZXRfYmxvY2tzaXplIHRvICV1IG9uIGRldmljZSAlc1xuIiwKKwkJCXNlY3RvcnNpemUsIFhGU19CVUZUQVJHX05BTUUoYnRwKSk7CisJCXJldHVybiBFSU5WQUw7CisJfQorCisJaWYgKHZlcmJvc2UgJiYKKwkgICAgKFBBR0VfQ0FDSEVfU0laRSAvIEJJVFNfUEVSX0xPTkcpID4gc2VjdG9yc2l6ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiWEZTOiAldSBieXRlIHNlY3RvcnMgaW4gdXNlIG9uIGRldmljZSAlcy4gICIKKwkJCSJUaGlzIGlzIHN1Ym9wdGltYWw7ICV1IG9yIGdyZWF0ZXIgaXMgaWRlYWwuXG4iLAorCQkJc2VjdG9yc2l6ZSwgWEZTX0JVRlRBUkdfTkFNRShidHApLAorCQkJKHVuc2lnbmVkIGludClQQUdFX0NBQ0hFX1NJWkUgLyBCSVRTX1BFUl9MT05HKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyogV2hlbiBhbGxvY2F0aW5nIHRoZSBpbml0aWFsIGJ1ZmZlciB0YXJnZXQgd2UgaGF2ZSBub3QgeWV0CisqIHJlYWQgaW4gdGhlIHN1cGVyYmxvY2ssIHNvIGRvbid0IGtub3cgd2hhdCBzaXplZCBzZWN0b3JzCisqIGFyZSBiZWluZyB1c2VkIGlzIGF0IHRoaXMgZWFybHkgc3RhZ2UuICBQbGF5IHNhZmUuCisqLworU1RBVElDIGludAoreGZzX3NldHNpemVfYnVmdGFyZ19lYXJseSgKKwl4ZnNfYnVmdGFyZ190CQkqYnRwLAorCXN0cnVjdCBibG9ja19kZXZpY2UJKmJkZXYpCit7CisJcmV0dXJuIHhmc19zZXRzaXplX2J1ZnRhcmdfZmxhZ3MoYnRwLAorCQkJUEFHRV9DQUNIRV9TSVpFLCBiZGV2X2hhcmRzZWN0X3NpemUoYmRldiksIDApOworfQorCitpbnQKK3hmc19zZXRzaXplX2J1ZnRhcmcoCisJeGZzX2J1ZnRhcmdfdAkJKmJ0cCwKKwl1bnNpZ25lZCBpbnQJCWJsb2Nrc2l6ZSwKKwl1bnNpZ25lZCBpbnQJCXNlY3RvcnNpemUpCit7CisJcmV0dXJuIHhmc19zZXRzaXplX2J1ZnRhcmdfZmxhZ3MoYnRwLCBibG9ja3NpemUsIHNlY3RvcnNpemUsIDEpOworfQorCitTVEFUSUMgaW50Cit4ZnNfbWFwcGluZ19idWZ0YXJnKAorCXhmc19idWZ0YXJnX3QJCSpidHAsCisJc3RydWN0IGJsb2NrX2RldmljZQkqYmRldikKK3sKKwlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbwkqYmRpOworCXN0cnVjdCBpbm9kZQkJKmlub2RlOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlCSptYXBwaW5nOworCXN0YXRpYyBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIG1hcHBpbmdfYW9wcyA9IHsKKwkJLnN5bmNfcGFnZSA9IGJsb2NrX3N5bmNfcGFnZSwKKwl9OworCisJaW5vZGUgPSBuZXdfaW5vZGUoYmRldi0+YmRfaW5vZGUtPmlfc2IpOworCWlmICghaW5vZGUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIlhGUzogQ2Fubm90IGFsbG9jYXRlIG1hcHBpbmcgaW5vZGUgZm9yIGRldmljZSAlc1xuIiwKKwkJCVhGU19CVUZUQVJHX05BTUUoYnRwKSk7CisJCXJldHVybiBFTk9NRU07CisJfQorCWlub2RlLT5pX21vZGUgPSBTX0lGQkxLOworCWlub2RlLT5pX2JkZXYgPSBiZGV2OworCWlub2RlLT5pX3JkZXYgPSBiZGV2LT5iZF9kZXY7CisJYmRpID0gYmxrX2dldF9iYWNraW5nX2Rldl9pbmZvKGJkZXYpOworCWlmICghYmRpKQorCQliZGkgPSAmZGVmYXVsdF9iYWNraW5nX2Rldl9pbmZvOworCW1hcHBpbmcgPSAmaW5vZGUtPmlfZGF0YTsKKwltYXBwaW5nLT5hX29wcyA9ICZtYXBwaW5nX2FvcHM7CisJbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9IGJkaTsKKwltYXBwaW5nX3NldF9nZnBfbWFzayhtYXBwaW5nLCBHRlBfTk9GUyk7CisJYnRwLT5wYnJfbWFwcGluZyA9IG1hcHBpbmc7CisJcmV0dXJuIDA7Cit9CisKK3hmc19idWZ0YXJnX3QgKgoreGZzX2FsbG9jX2J1ZnRhcmcoCisJc3RydWN0IGJsb2NrX2RldmljZQkqYmRldiwKKwlpbnQJCQlleHRlcm5hbCkKK3sKKwl4ZnNfYnVmdGFyZ190CQkqYnRwOworCisJYnRwID0ga21lbV96YWxsb2Moc2l6ZW9mKCpidHApLCBLTV9TTEVFUCk7CisKKwlidHAtPnBicl9kZXYgPSAgYmRldi0+YmRfZGV2OworCWJ0cC0+cGJyX2JkZXYgPSBiZGV2OworCWlmICh4ZnNfc2V0c2l6ZV9idWZ0YXJnX2Vhcmx5KGJ0cCwgYmRldikpCisJCWdvdG8gZXJyb3I7CisJaWYgKHhmc19tYXBwaW5nX2J1ZnRhcmcoYnRwLCBiZGV2KSkKKwkJZ290byBlcnJvcjsKKwl4ZnNfYWxsb2NfYnVmaGFzaChidHAsIGV4dGVybmFsKTsKKwlyZXR1cm4gYnRwOworCitlcnJvcjoKKwlrbWVtX2ZyZWUoYnRwLCBzaXplb2YoKmJ0cCkpOworCXJldHVybiBOVUxMOworfQorCisKKy8qCisgKiBQYWdlYnVmIGRlbGF5ZWQgd3JpdGUgYnVmZmVyIGhhbmRsaW5nCisgKi8KKworU1RBVElDIExJU1RfSEVBRChwYmRfZGVsd3JpdGVfcXVldWUpOworU1RBVElDIERFRklORV9TUElOTE9DSyhwYmRfZGVsd3JpdGVfbG9jayk7CisKK1NUQVRJQyB2b2lkCitwYWdlYnVmX2RlbHdyaV9xdWV1ZSgKKwl4ZnNfYnVmX3QJCSpwYiwKKwlpbnQJCQl1bmxvY2spCit7CisJUEJfVFJBQ0UocGIsICJkZWx3cmlfcSIsIChsb25nKXVubG9jayk7CisJQVNTRVJUKHBiLT5wYl9mbGFncyAmIFBCRl9ERUxXUkkpOworCisJc3Bpbl9sb2NrKCZwYmRfZGVsd3JpdGVfbG9jayk7CisJLyogSWYgYWxyZWFkeSBpbiB0aGUgcXVldWUsIGRlcXVldWUgYW5kIHBsYWNlIGF0IHRhaWwgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJnBiLT5wYl9saXN0KSkgeworCQlpZiAodW5sb2NrKSB7CisJCQlhdG9taWNfZGVjKCZwYi0+cGJfaG9sZCk7CisJCX0KKwkJbGlzdF9kZWwoJnBiLT5wYl9saXN0KTsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZwYi0+cGJfbGlzdCwgJnBiZF9kZWx3cml0ZV9xdWV1ZSk7CisJcGItPnBiX3F1ZXVldGltZSA9IGppZmZpZXM7CisJc3Bpbl91bmxvY2soJnBiZF9kZWx3cml0ZV9sb2NrKTsKKworCWlmICh1bmxvY2spCisJCXBhZ2VidWZfdW5sb2NrKHBiKTsKK30KKwordm9pZAorcGFnZWJ1Zl9kZWx3cmlfZGVxdWV1ZSgKKwl4ZnNfYnVmX3QJCSpwYikKK3sKKwlpbnQJCQlkZXF1ZXVlZCA9IDA7CisKKwlzcGluX2xvY2soJnBiZF9kZWx3cml0ZV9sb2NrKTsKKwlpZiAoKHBiLT5wYl9mbGFncyAmIFBCRl9ERUxXUkkpICYmICFsaXN0X2VtcHR5KCZwYi0+cGJfbGlzdCkpIHsKKwkJbGlzdF9kZWxfaW5pdCgmcGItPnBiX2xpc3QpOworCQlkZXF1ZXVlZCA9IDE7CisJfQorCXBiLT5wYl9mbGFncyAmPSB+UEJGX0RFTFdSSTsKKwlzcGluX3VubG9jaygmcGJkX2RlbHdyaXRlX2xvY2spOworCisJaWYgKGRlcXVldWVkKQorCQlwYWdlYnVmX3JlbGUocGIpOworCisJUEJfVFJBQ0UocGIsICJkZWx3cmlfZHEiLCAobG9uZylkZXF1ZXVlZCk7Cit9CisKK1NUQVRJQyB2b2lkCitwYWdlYnVmX3J1bmFsbF9xdWV1ZXMoCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJKnF1ZXVlKQoreworCWZsdXNoX3dvcmtxdWV1ZShxdWV1ZSk7Cit9CisKKy8qIERlZmluZXMgZm9yIHBhZ2VidWYgZGFlbW9uICovCitTVEFUSUMgREVDTEFSRV9DT01QTEVUSU9OKHBhZ2VidWZfZGFlbW9uX2RvbmUpOworU1RBVElDIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGFnZWJ1Zl9kYWVtb25fdGFzazsKK1NUQVRJQyBpbnQgcGFnZWJ1Zl9kYWVtb25fYWN0aXZlOworU1RBVElDIGludCBmb3JjZV9mbHVzaDsKKworCitTVEFUSUMgaW50CitwYWdlYnVmX2RhZW1vbl93YWtldXAoCisJaW50CQkJcHJpb3JpdHksCisJdW5zaWduZWQgaW50CQltYXNrKQoreworCWZvcmNlX2ZsdXNoID0gMTsKKwliYXJyaWVyKCk7CisJd2FrZV91cF9wcm9jZXNzKHBhZ2VidWZfZGFlbW9uX3Rhc2spOworCXJldHVybiAwOworfQorCitTVEFUSUMgaW50CitwYWdlYnVmX2RhZW1vbigKKwl2b2lkCQkJKmRhdGEpCit7CisJc3RydWN0IGxpc3RfaGVhZAl0bXA7CisJdW5zaWduZWQgbG9uZwkJYWdlOworCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQ7CisJeGZzX2J1Zl90CQkqcGIsICpuOworCisJLyogIFNldCB1cCB0aGUgdGhyZWFkICAqLworCWRhZW1vbml6ZSgieGZzYnVmZCIpOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX01FTUFMTE9DOworCisJcGFnZWJ1Zl9kYWVtb25fdGFzayA9IGN1cnJlbnQ7CisJcGFnZWJ1Zl9kYWVtb25fYWN0aXZlID0gMTsKKwliYXJyaWVyKCk7CisKKwlJTklUX0xJU1RfSEVBRCgmdG1wKTsKKwlkbyB7CisJCXRyeV90b19mcmVlemUoUEZfRlJFRVpFKTsKKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KCh4ZnNfYnVmX3RpbWVyX2NlbnRpc2VjcyAqIEhaKSAvIDEwMCk7CisKKwkJYWdlID0gKHhmc19idWZfYWdlX2NlbnRpc2VjcyAqIEhaKSAvIDEwMDsKKwkJc3Bpbl9sb2NrKCZwYmRfZGVsd3JpdGVfbG9jayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYiwgbiwgJnBiZF9kZWx3cml0ZV9xdWV1ZSwgcGJfbGlzdCkgeworCQkJUEJfVFJBQ0UocGIsICJ3YWxrcTEiLCAobG9uZylwYWdlYnVmX2lzcGluKHBiKSk7CisJCQlBU1NFUlQocGItPnBiX2ZsYWdzICYgUEJGX0RFTFdSSSk7CisKKwkJCWlmICghcGFnZWJ1Zl9pc3BpbihwYikgJiYgIXBhZ2VidWZfY29uZF9sb2NrKHBiKSkgeworCQkJCWlmICghZm9yY2VfZmx1c2ggJiYKKwkJCQkgICAgdGltZV9iZWZvcmUoamlmZmllcywKKwkJCQkJCXBiLT5wYl9xdWV1ZXRpbWUgKyBhZ2UpKSB7CisJCQkJCXBhZ2VidWZfdW5sb2NrKHBiKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJcGItPnBiX2ZsYWdzICY9IH5QQkZfREVMV1JJOworCQkJCXBiLT5wYl9mbGFncyB8PSBQQkZfV1JJVEU7CisJCQkJbGlzdF9tb3ZlKCZwYi0+cGJfbGlzdCwgJnRtcCk7CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2soJnBiZF9kZWx3cml0ZV9sb2NrKTsKKworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnRtcCkpIHsKKwkJCXBiID0gbGlzdF9lbnRyeSh0bXAubmV4dCwgeGZzX2J1Zl90LCBwYl9saXN0KTsKKwkJCXRhcmdldCA9IHBiLT5wYl90YXJnZXQ7CisKKwkJCWxpc3RfZGVsX2luaXQoJnBiLT5wYl9saXN0KTsKKwkJCXBhZ2VidWZfaW9zdHJhdGVneShwYik7CisKKwkJCWJsa19ydW5fYWRkcmVzc19zcGFjZSh0YXJnZXQtPnBicl9tYXBwaW5nKTsKKwkJfQorCisJCWlmIChhc19saXN0X2xlbiA+IDApCisJCQlwdXJnZV9hZGRyZXNzZXMoKTsKKworCQlmb3JjZV9mbHVzaCA9IDA7CisJfSB3aGlsZSAocGFnZWJ1Zl9kYWVtb25fYWN0aXZlKTsKKworCWNvbXBsZXRlX2FuZF9leGl0KCZwYWdlYnVmX2RhZW1vbl9kb25lLCAwKTsKK30KKworLyoKKyAqIEdvIHRocm91Z2ggYWxsIGluY29yZSBidWZmZXJzLCBhbmQgcmVsZWFzZSBidWZmZXJzIGlmIHRoZXkgYmVsb25nIHRvCisgKiB0aGUgZ2l2ZW4gZGV2aWNlLiBUaGlzIGlzIHVzZWQgaW4gZmlsZXN5c3RlbSBlcnJvciBoYW5kbGluZyB0bworICogcHJlc2VydmUgdGhlIGNvbnNpc3RlbmN5IG9mIGl0cyBtZXRhZGF0YS4KKyAqLworaW50Cit4ZnNfZmx1c2hfYnVmdGFyZygKKwl4ZnNfYnVmdGFyZ190CQkqdGFyZ2V0LAorCWludAkJCXdhaXQpCit7CisJc3RydWN0IGxpc3RfaGVhZAl0bXA7CisJeGZzX2J1Zl90CQkqcGIsICpuOworCWludAkJCXBpbmNvdW50ID0gMDsKKworCXBhZ2VidWZfcnVuYWxsX3F1ZXVlcyhwYWdlYnVmX2RhdGFpb193b3JrcXVldWUpOworCXBhZ2VidWZfcnVuYWxsX3F1ZXVlcyhwYWdlYnVmX2xvZ2lvX3dvcmtxdWV1ZSk7CisKKwlJTklUX0xJU1RfSEVBRCgmdG1wKTsKKwlzcGluX2xvY2soJnBiZF9kZWx3cml0ZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGIsIG4sICZwYmRfZGVsd3JpdGVfcXVldWUsIHBiX2xpc3QpIHsKKworCQlpZiAocGItPnBiX3RhcmdldCAhPSB0YXJnZXQpCisJCQljb250aW51ZTsKKworCQlBU1NFUlQocGItPnBiX2ZsYWdzICYgUEJGX0RFTFdSSSk7CisJCVBCX1RSQUNFKHBiLCAid2Fsa3EyIiwgKGxvbmcpcGFnZWJ1Zl9pc3BpbihwYikpOworCQlpZiAocGFnZWJ1Zl9pc3BpbihwYikpIHsKKwkJCXBpbmNvdW50Kys7CisJCQljb250aW51ZTsKKwkJfQorCisJCXBiLT5wYl9mbGFncyAmPSB+UEJGX0RFTFdSSTsKKwkJcGItPnBiX2ZsYWdzIHw9IFBCRl9XUklURTsKKwkJbGlzdF9tb3ZlKCZwYi0+cGJfbGlzdCwgJnRtcCk7CisJfQorCXNwaW5fdW5sb2NrKCZwYmRfZGVsd3JpdGVfbG9jayk7CisKKwkvKgorCSAqIERyb3BwZWQgdGhlIGRlbGF5ZWQgd3JpdGUgbGlzdCBsb2NrLCBub3cgd2FsayB0aGUgdGVtcG9yYXJ5IGxpc3QKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGIsIG4sICZ0bXAsIHBiX2xpc3QpIHsKKwkJaWYgKHdhaXQpCisJCQlwYi0+cGJfZmxhZ3MgJj0gflBCRl9BU1lOQzsKKwkJZWxzZQorCQkJbGlzdF9kZWxfaW5pdCgmcGItPnBiX2xpc3QpOworCisJCXBhZ2VidWZfbG9jayhwYik7CisJCXBhZ2VidWZfaW9zdHJhdGVneShwYik7CisJfQorCisJLyoKKwkgKiBSZW1haW5pbmcgbGlzdCBpdGVtcyBtdXN0IGJlIGZsdXNoZWQgYmVmb3JlIHJldHVybmluZworCSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmdG1wKSkgeworCQlwYiA9IGxpc3RfZW50cnkodG1wLm5leHQsIHhmc19idWZfdCwgcGJfbGlzdCk7CisKKwkJbGlzdF9kZWxfaW5pdCgmcGItPnBiX2xpc3QpOworCQl4ZnNfaW93YWl0KHBiKTsKKwkJeGZzX2J1Zl9yZWxzZShwYik7CisJfQorCisJaWYgKHdhaXQpCisJCWJsa19ydW5fYWRkcmVzc19zcGFjZSh0YXJnZXQtPnBicl9tYXBwaW5nKTsKKworCXJldHVybiBwaW5jb3VudDsKK30KKworU1RBVElDIGludAorcGFnZWJ1Zl9kYWVtb25fc3RhcnQodm9pZCkKK3sKKwlpbnQJCXJ2YWw7CisKKwlwYWdlYnVmX2xvZ2lvX3dvcmtxdWV1ZSA9IGNyZWF0ZV93b3JrcXVldWUoInhmc2xvZ2QiKTsKKwlpZiAoIXBhZ2VidWZfbG9naW9fd29ya3F1ZXVlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBhZ2VidWZfZGF0YWlvX3dvcmtxdWV1ZSA9IGNyZWF0ZV93b3JrcXVldWUoInhmc2RhdGFkIik7CisJaWYgKCFwYWdlYnVmX2RhdGFpb193b3JrcXVldWUpIHsKKwkJZGVzdHJveV93b3JrcXVldWUocGFnZWJ1Zl9sb2dpb193b3JrcXVldWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlydmFsID0ga2VybmVsX3RocmVhZChwYWdlYnVmX2RhZW1vbiwgTlVMTCwgQ0xPTkVfRlN8Q0xPTkVfRklMRVMpOworCWlmIChydmFsIDwgMCkgeworCQlkZXN0cm95X3dvcmtxdWV1ZShwYWdlYnVmX2xvZ2lvX3dvcmtxdWV1ZSk7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKHBhZ2VidWZfZGF0YWlvX3dvcmtxdWV1ZSk7CisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBwYWdlYnVmX2RhZW1vbl9zdG9wCisgKgorICogTm90ZTogZG8gbm90IG1hcmsgYXMgX19leGl0LCBpdCBpcyBjYWxsZWQgZnJvbSBwYWdlYnVmX3Rlcm1pbmF0ZS4KKyAqLworU1RBVElDIHZvaWQKK3BhZ2VidWZfZGFlbW9uX3N0b3Aodm9pZCkKK3sKKwlwYWdlYnVmX2RhZW1vbl9hY3RpdmUgPSAwOworCWJhcnJpZXIoKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZwYWdlYnVmX2RhZW1vbl9kb25lKTsKKworCWRlc3Ryb3lfd29ya3F1ZXVlKHBhZ2VidWZfbG9naW9fd29ya3F1ZXVlKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShwYWdlYnVmX2RhdGFpb193b3JrcXVldWUpOworfQorCisvKgorICoJSW5pdGlhbGl6YXRpb24gYW5kIFRlcm1pbmF0aW9uCisgKi8KKworaW50IF9faW5pdAorcGFnZWJ1Zl9pbml0KHZvaWQpCit7CisJcGFnZWJ1Zl9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJ4ZnNfYnVmX3QiLCBzaXplb2YoeGZzX2J1Zl90KSwgMCwKKwkJCVNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCwgTlVMTCk7CisJaWYgKHBhZ2VidWZfY2FjaGUgPT0gTlVMTCkgeworCQlwcmludGsoIlhGUzogY291bGRuJ3QgaW5pdCB4ZnNfYnVmX3QgY2FjaGVcbiIpOworCQlwYWdlYnVmX3Rlcm1pbmF0ZSgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKyNpZmRlZiBQQUdFQlVGX1RSQUNFCisJcGFnZWJ1Zl90cmFjZV9idWYgPSBrdHJhY2VfYWxsb2MoUEFHRUJVRl9UUkFDRV9TSVpFLCBLTV9TTEVFUCk7CisjZW5kaWYKKworCXBhZ2VidWZfZGFlbW9uX3N0YXJ0KCk7CisKKwlwYWdlYnVmX3NoYWtlID0ga21lbV9zaGFrZV9yZWdpc3RlcihwYWdlYnVmX2RhZW1vbl93YWtldXApOworCWlmIChwYWdlYnVmX3NoYWtlID09IE5VTEwpIHsKKwkJcGFnZWJ1Zl90ZXJtaW5hdGUoKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCXBhZ2VidWZfdGVybWluYXRlLgorICoKKyAqCU5vdGU6IGRvIG5vdCBtYXJrIGFzIF9fZXhpdCwgdGhpcyBpcyBhbHNvIGNhbGxlZCBmcm9tIHRoZSBfX2luaXQgY29kZS4KKyAqLwordm9pZAorcGFnZWJ1Zl90ZXJtaW5hdGUodm9pZCkKK3sKKwlwYWdlYnVmX2RhZW1vbl9zdG9wKCk7CisKKyNpZmRlZiBQQUdFQlVGX1RSQUNFCisJa3RyYWNlX2ZyZWUocGFnZWJ1Zl90cmFjZV9idWYpOworI2VuZGlmCisKKwlrbWVtX3pvbmVfZGVzdHJveShwYWdlYnVmX2NhY2hlKTsKKwlrbWVtX3NoYWtlX2RlcmVnaXN0ZXIocGFnZWJ1Zl9zaGFrZSk7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZGVlZDgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuaApAQCAtMCwwICsxLDU5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworLyoKKyAqIFdyaXR0ZW4gYnkgU3RldmUgTG9yZCwgSmltIE1vc3RlaywgUnVzc2VsbCBDYXR0ZWxhbiBhdCBTR0kKKyAqLworCisjaWZuZGVmIF9fWEZTX0JVRl9IX18KKyNkZWZpbmUgX19YRlNfQlVGX0hfXworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CisKKy8qCisgKglCYXNlIHR5cGVzCisgKi8KKworI2RlZmluZSBYRlNfQlVGX0RBRERSX05VTEwgKCh4ZnNfZGFkZHJfdCkgKC0xTEwpKQorCisjZGVmaW5lIHBhZ2VfYnVmX2N0b2IocHApCSgocHApICogUEFHRV9DQUNIRV9TSVpFKQorI2RlZmluZSBwYWdlX2J1Zl9idG9jKGRkKQkoKChkZCkgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUKQorI2RlZmluZSBwYWdlX2J1Zl9idG9jdChkZCkJKChkZCkgPj4gUEFHRV9DQUNIRV9TSElGVCkKKyNkZWZpbmUgcGFnZV9idWZfcG9mZihhYSkJKChhYSkgJiB+UEFHRV9DQUNIRV9NQVNLKQorCit0eXBlZGVmIGVudW0gcGFnZV9idWZfcndfZSB7CisJUEJSV19SRUFEID0gMSwJCQkvKiB0cmFuc2ZlciBpbnRvIHRhcmdldCBtZW1vcnkgKi8KKwlQQlJXX1dSSVRFID0gMiwJCQkvKiB0cmFuc2ZlciBmcm9tIHRhcmdldCBtZW1vcnkgKi8KKwlQQlJXX1pFUk8gPSAzCQkJLyogWmVybyB0YXJnZXQgbWVtb3J5ICovCit9IHBhZ2VfYnVmX3J3X3Q7CisKKwordHlwZWRlZiBlbnVtIHBhZ2VfYnVmX2ZsYWdzX2UgewkJLyogcGJfZmxhZ3MgdmFsdWVzICovCisJUEJGX1JFQUQgPSAoMSA8PCAwKSwJLyogYnVmZmVyIGludGVuZGVkIGZvciByZWFkaW5nIGZyb20gZGV2aWNlICovCisJUEJGX1dSSVRFID0gKDEgPDwgMSksCS8qIGJ1ZmZlciBpbnRlbmRlZCBmb3Igd3JpdGluZyB0byBkZXZpY2UgICAqLworCVBCRl9NQVBQRUQgPSAoMSA8PCAyKSwgIC8qIGJ1ZmZlciBtYXBwZWQgKHBiX2FkZHIgdmFsaWQpICAgICAgICAgICAqLworCVBCRl9QQVJUSUFMID0gKDEgPDwgMyksIC8qIGJ1ZmZlciBwYXJ0aWFsbHkgcmVhZCAgICAgICAgICAgICAgICAgICAqLworCVBCRl9BU1lOQyA9ICgxIDw8IDQpLCAgIC8qIGluaXRpYXRvciB3aWxsIG5vdCB3YWl0IGZvciBjb21wbGV0aW9uICAqLworCVBCRl9OT05FID0gKDEgPDwgNSksICAgIC8qIGJ1ZmZlciBub3QgcmVhZCBhdCBhbGwgICAgICAgICAgICAgICAgICAqLworCVBCRl9ERUxXUkkgPSAoMSA8PCA2KSwgIC8qIGJ1ZmZlciBoYXMgZGlydHkgcGFnZXMgICAgICAgICAgICAgICAgICAqLworCVBCRl9TVEFMRSA9ICgxIDw8IDcpLAkvKiBidWZmZXIgaGFzIGJlZW4gc3RhbGVkLCBkbyBub3QgZmluZCBpdCAgKi8KKwlQQkZfRlNfTUFOQUdFRCA9ICgxIDw8IDgpLCAgLyogZmlsZXN5c3RlbSBjb250cm9scyBmcmVlaW5nIG1lbW9yeSAgKi8KKwlQQkZfRlNfREFUQUlPRCA9ICgxIDw8IDkpLCAgLyogc2NoZWR1bGUgSU8gY29tcGxldGlvbiBvbiBmcyBkYXRhZCAgKi8KKwlQQkZfRk9SQ0VJTyA9ICgxIDw8IDEwKSwgICAgLyogaWdub3JlIGFueSBjYWNoZSBzdGF0ZQkJICAgKi8KKwlQQkZfRkxVU0ggPSAoMSA8PCAxMSksCSAgICAvKiBmbHVzaCBkaXNrIHdyaXRlIGNhY2hlCQkgICAqLworCVBCRl9SRUFEX0FIRUFEID0gKDEgPDwgMTIpLCAvKiBhc3luY2hyb25vdXMgcmVhZC1haGVhZAkJICAgKi8KKworCS8qIGZsYWdzIHVzZWQgb25seSBhcyBhcmd1bWVudHMgdG8gYWNjZXNzIHJvdXRpbmVzICovCisJUEJGX0xPQ0sgPSAoMSA8PCAxNCksICAgICAgIC8qIGxvY2sgcmVxdWVzdGVkCQkJICAgKi8KKwlQQkZfVFJZTE9DSyA9ICgxIDw8IDE1KSwgICAgLyogbG9jayByZXF1ZXN0ZWQsIGJ1dCBkbyBub3Qgd2FpdAkgICAqLworCVBCRl9ET05UX0JMT0NLID0gKDEgPDwgMTYpLCAvKiBkbyBub3QgYmxvY2sgaW4gY3VycmVudCB0aHJlYWQJICAgKi8KKworCS8qIGZsYWdzIHVzZWQgb25seSBpbnRlcm5hbGx5ICovCisJX1BCRl9QQUdFX0NBQ0hFID0gKDEgPDwgMTcpLC8qIGJhY2tlZCBieSBwYWdlY2FjaGUJCSAgICovCisJX1BCRl9LTUVNX0FMTE9DID0gKDEgPDwgMTgpLC8qIGJhY2tlZCBieSBrbWVtX2FsbG9jKCkJCSAgICovCisJX1BCRl9SVU5fUVVFVUVTID0gKDEgPDwgMTkpLC8qIHJ1biBibG9jayBkZXZpY2UgdGFzayBxdWV1ZQkgICAqLworfSBwYWdlX2J1Zl9mbGFnc190OworCisjZGVmaW5lIFBCRl9VUERBVEUgKFBCRl9SRUFEIHwgUEJGX1dSSVRFKQorI2RlZmluZSBQQkZfTk9UX0RPTkUocGIpICgoKHBiKS0+cGJfZmxhZ3MgJiAoUEJGX1BBUlRJQUx8UEJGX05PTkUpKSAhPSAwKQorI2RlZmluZSBQQkZfRE9ORShwYikgKCgocGIpLT5wYl9mbGFncyAmIChQQkZfUEFSVElBTHxQQkZfTk9ORSkpID09IDApCisKK3R5cGVkZWYgc3RydWN0IHhmc19idWZoYXNoIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWJoX2xpc3Q7CisJc3BpbmxvY2tfdAkJYmhfbG9jazsKK30geGZzX2J1Zmhhc2hfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2J1ZnRhcmcgeworCWRldl90CQkJcGJyX2RldjsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlCSpwYnJfYmRldjsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZQkqcGJyX21hcHBpbmc7CisJdW5zaWduZWQgaW50CQlwYnJfYnNpemU7CisJdW5zaWduZWQgaW50CQlwYnJfc3NoaWZ0OworCXNpemVfdAkJCXBicl9zbWFzazsKKworCS8qIHBlci1kZXZpY2UgYnVmZmVyIGhhc2ggdGFibGUgKi8KKwl1aW50CQkJYnRfaGFzaG1hc2s7CisJdWludAkJCWJ0X2hhc2hzaGlmdDsKKwl4ZnNfYnVmaGFzaF90CQkqYnRfaGFzaDsKK30geGZzX2J1ZnRhcmdfdDsKKworLyoKKyAqCXhmc19idWZfdDogIEJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIHBhZ2UgY2FjaGUtYmFzZWQgYnVmZmVycworICoKKyAqIFRoaXMgYnVmZmVyIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IHRoZSBwYWdlIGNhY2hlIGJ1ZmZlciBtYW5hZ2VtZW50IHJvdXRpbmVzCisgKiB0byByZWZlciB0byBhbiBhc3NlbWJseSBvZiBwYWdlcyBmb3JtaW5nIGEgbG9naWNhbCBidWZmZXIuICBUaGUgYWN0dWFsIEkvTworICogaXMgcGVyZm9ybWVkIHdpdGggYnVmZmVyX2hlYWQgc3RydWN0dXJlcywgYXMgcmVxdWlyZWQgYnkgZHJpdmVycy4KKyAqIAorICogVGhlIGJ1ZmZlciBzdHJ1Y3R1cmUgaXMgdXNlZCBvbiB0ZW1wb3JhcnkgYmFzaXMgb25seSwgYW5kIGRpc2NhcmRlZCB3aGVuCisgKiByZWxlYXNlZC4gIFRoZSByZWFsIGRhdGEgc3RvcmFnZSBpcyByZWNvcmRlZCBpbiB0aGUgcGFnZSBjYWNoZS4gIE1ldGFkYXRhIGlzCisgKiBoYXNoZWQgdG8gdGhlIGJsb2NrIGRldmljZSBvbiB3aGljaCB0aGUgZmlsZSBzeXN0ZW0gcmVzaWRlcy4KKyAqLworCitzdHJ1Y3QgeGZzX2J1ZjsKKworLyogY2FsbC1iYWNrIGZ1bmN0aW9uIG9uIEkvTyBjb21wbGV0aW9uICovCit0eXBlZGVmIHZvaWQgKCpwYWdlX2J1Zl9pb2RvbmVfdCkoc3RydWN0IHhmc19idWYgKik7CisvKiBjYWxsLWJhY2sgZnVuY3Rpb24gb24gSS9PIGNvbXBsZXRpb24gKi8KK3R5cGVkZWYgdm9pZCAoKnBhZ2VfYnVmX3JlbHNlX3QpKHN0cnVjdCB4ZnNfYnVmICopOworLyogcHJlLXdyaXRlIGZ1bmN0aW9uICovCit0eXBlZGVmIGludCAoKnBhZ2VfYnVmX2Jkc3RyYXRfdCkoc3RydWN0IHhmc19idWYgKik7CisKKyNkZWZpbmUgUEJfUEFHRVMJMgorCit0eXBlZGVmIHN0cnVjdCB4ZnNfYnVmIHsKKwlzdHJ1Y3Qgc2VtYXBob3JlCXBiX3NlbWE7CS8qIHNlbWFwaG9yZSBmb3IgbG9ja2FibGVzICAqLworCXVuc2lnbmVkIGxvbmcJCXBiX3F1ZXVldGltZTsJLyogdGltZSBidWZmZXIgd2FzIHF1ZXVlZCAgICovCisJYXRvbWljX3QJCXBiX3Bpbl9jb3VudDsJLyogcGluIGNvdW50CQkgICAgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAlwYl93YWl0ZXJzOwkvKiB1bnBpbiB3YWl0ZXJzCSAgICAqLworCXN0cnVjdCBsaXN0X2hlYWQJcGJfbGlzdDsKKwlwYWdlX2J1Zl9mbGFnc190CXBiX2ZsYWdzOwkvKiBzdGF0dXMgZmxhZ3MgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXBiX2hhc2hfbGlzdDsJLyogaGFzaCB0YWJsZSBsaXN0ICovCisJeGZzX2J1Zmhhc2hfdAkJKnBiX2hhc2g7CS8qIGhhc2ggdGFibGUgbGlzdCBzdGFydCAqLworCXhmc19idWZ0YXJnX3QJCSpwYl90YXJnZXQ7CS8qIGJ1ZmZlciB0YXJnZXQgKGRldmljZSkgKi8KKwlhdG9taWNfdAkJcGJfaG9sZDsJLyogcmVmZXJlbmNlIGNvdW50ICovCisJeGZzX2RhZGRyX3QJCXBiX2JuOwkJLyogYmxvY2sgbnVtYmVyIGZvciBJL08gKi8KKwlsb2ZmX3QJCQlwYl9maWxlX29mZnNldDsJLyogb2Zmc2V0IGluIGZpbGUgKi8KKwlzaXplX3QJCQlwYl9idWZmZXJfbGVuZ3RoOyAvKiBzaXplIG9mIGJ1ZmZlciBpbiBieXRlcyAqLworCXNpemVfdAkJCXBiX2NvdW50X2Rlc2lyZWQ7IC8qIGRlc2lyZWQgdHJhbnNmZXIgc2l6ZSAqLworCXZvaWQJCQkqcGJfYWRkcjsJLyogdmlydHVhbCBhZGRyZXNzIG9mIGJ1ZmZlciAqLworCXN0cnVjdCB3b3JrX3N0cnVjdAlwYl9pb2RvbmVfd29yazsKKwlhdG9taWNfdAkJcGJfaW9fcmVtYWluaW5nOy8qICNvdXRzdGFuZGluZyBJL08gcmVxdWVzdHMgKi8KKwlwYWdlX2J1Zl9pb2RvbmVfdAlwYl9pb2RvbmU7CS8qIEkvTyBjb21wbGV0aW9uIGZ1bmN0aW9uICovCisJcGFnZV9idWZfcmVsc2VfdAlwYl9yZWxzZTsJLyogcmVsZWFzaW5nIGZ1bmN0aW9uICovCisJcGFnZV9idWZfYmRzdHJhdF90CXBiX3N0cmF0OwkvKiBwcmUtd3JpdGUgZnVuY3Rpb24gKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlCXBiX2lvZG9uZXNlbWE7CS8qIFNlbWFwaG9yZSBmb3IgSS9PIHdhaXRlcnMgKi8KKwl2b2lkCQkJKnBiX2ZzcHJpdjsKKwl2b2lkCQkJKnBiX2ZzcHJpdjI7CisJdm9pZAkJCSpwYl9mc3ByaXYzOworCXVuc2lnbmVkIHNob3J0CQlwYl9lcnJvcjsJLyogZXJyb3IgY29kZSBvbiBJL08gKi8KKyAJdW5zaWduZWQgc2hvcnQJCXBiX2xvY2tlZDsJLyogcGFnZSBhcnJheSBpcyBsb2NrZWQgKi8KKyAJdW5zaWduZWQgaW50CQlwYl9wYWdlX2NvdW50OwkvKiBzaXplIG9mIHBhZ2UgYXJyYXkgKi8KKwl1bnNpZ25lZCBpbnQJCXBiX29mZnNldDsJLyogcGFnZSBvZmZzZXQgaW4gZmlyc3QgcGFnZSAqLworCXN0cnVjdCBwYWdlCQkqKnBiX3BhZ2VzOwkvKiBhcnJheSBvZiBwYWdlIHBvaW50ZXJzICovCisJc3RydWN0IHBhZ2UJCSpwYl9wYWdlX2FycmF5W1BCX1BBR0VTXTsgLyogaW5saW5lIHBhZ2VzICovCisjaWZkZWYgUEFHRUJVRl9MT0NLX1RSQUNLSU5HCisJaW50CQkJcGJfbGFzdF9ob2xkZXI7CisjZW5kaWYKK30geGZzX2J1Zl90OworCisKKy8qIEZpbmRpbmcgYW5kIFJlYWRpbmcgQnVmZmVycyAqLworCitleHRlcm4geGZzX2J1Zl90ICpfcGFnZWJ1Zl9maW5kKAkvKiBmaW5kIGJ1ZmZlciBmb3IgYmxvY2sgaWYJKi8KKwkJCQkJLyogdGhlIGJsb2NrIGlzIGluIG1lbW9yeQkqLworCQl4ZnNfYnVmdGFyZ190ICosCS8qIGlub2RlIGZvciBibG9jawkJKi8KKwkJbG9mZl90LAkJCS8qIHN0YXJ0aW5nIG9mZnNldCBvZiByYW5nZQkqLworCQlzaXplX3QsCQkJLyogbGVuZ3RoIG9mIHJhbmdlCQkqLworCQlwYWdlX2J1Zl9mbGFnc190LAkvKiBQQkZfTE9DSwkJCSovCisJICAgICAgICB4ZnNfYnVmX3QgKik7CQkvKiBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyCSovCisKKyNkZWZpbmUgeGZzX2luY29yZShidWZ0YXJnLGJsa25vLGxlbixsb2NraXQpIFwKKwlfcGFnZWJ1Zl9maW5kKGJ1ZnRhcmcsIGJsa25vICxsZW4sIGxvY2tpdCwgTlVMTCkKKworZXh0ZXJuIHhmc19idWZfdCAqeGZzX2J1Zl9nZXRfZmxhZ3MoCS8qIGFsbG9jYXRlIGEgYnVmZmVyCQkqLworCQl4ZnNfYnVmdGFyZ190ICosCS8qIGlub2RlIGZvciBidWZmZXIJCSovCisJCWxvZmZfdCwJCQkvKiBzdGFydGluZyBvZmZzZXQgb2YgcmFuZ2UgICAgICovCisJCXNpemVfdCwJCQkvKiBsZW5ndGggb2YgcmFuZ2UgICAgICAgICAgICAgICovCisJCXBhZ2VfYnVmX2ZsYWdzX3QpOwkvKiBQQkZfTE9DSywgUEJGX1JFQUQsCQkqLworCQkJCQkvKiBQQkZfQVNZTkMJCQkqLworCisjZGVmaW5lIHhmc19idWZfZ2V0KHRhcmdldCwgYmxrbm8sIGxlbiwgZmxhZ3MpIFwKKwl4ZnNfYnVmX2dldF9mbGFncygodGFyZ2V0KSwgKGJsa25vKSwgKGxlbiksIFBCRl9MT0NLIHwgUEJGX01BUFBFRCkKKworZXh0ZXJuIHhmc19idWZfdCAqeGZzX2J1Zl9yZWFkX2ZsYWdzKAkvKiBhbGxvY2F0ZSBhbmQgcmVhZCBhIGJ1ZmZlcgkqLworCQl4ZnNfYnVmdGFyZ190ICosCS8qIGlub2RlIGZvciBidWZmZXIJCSovCisJCWxvZmZfdCwJCQkvKiBzdGFydGluZyBvZmZzZXQgb2YgcmFuZ2UJKi8KKwkJc2l6ZV90LAkJCS8qIGxlbmd0aCBvZiByYW5nZQkJKi8KKwkJcGFnZV9idWZfZmxhZ3NfdCk7CS8qIFBCRl9MT0NLLCBQQkZfQVNZTkMJCSovCisKKyNkZWZpbmUgeGZzX2J1Zl9yZWFkKHRhcmdldCwgYmxrbm8sIGxlbiwgZmxhZ3MpIFwKKwl4ZnNfYnVmX3JlYWRfZmxhZ3MoKHRhcmdldCksIChibGtubyksIChsZW4pLCBQQkZfTE9DSyB8IFBCRl9NQVBQRUQpCisKK2V4dGVybiB4ZnNfYnVmX3QgKnBhZ2VidWZfbG9va3VwKAorCQl4ZnNfYnVmdGFyZ190ICosCisJCWxvZmZfdCwJCQkvKiBzdGFydGluZyBvZmZzZXQgb2YgcmFuZ2UJKi8KKwkJc2l6ZV90LAkJCS8qIGxlbmd0aCBvZiByYW5nZQkJKi8KKwkJcGFnZV9idWZfZmxhZ3NfdCk7CS8qIFBCRl9SRUFELCBQQkZfV1JJVEUsCQkqLworCQkJCQkvKiBQQkZfRk9SQ0VJTywgCQkqLworCitleHRlcm4geGZzX2J1Zl90ICpwYWdlYnVmX2dldF9lbXB0eSgJLyogYWxsb2NhdGUgcGFnZWJ1ZiBzdHJ1Y3Qgd2l0aAkqLworCQkJCQkvKiAgbm8gbWVtb3J5IG9yIGRpc2sgYWRkcmVzcwkqLworCQlzaXplX3QgbGVuLAorCQl4ZnNfYnVmdGFyZ190ICopOwkvKiBtb3VudCBwb2ludCAiZmFrZSIgaW5vZGUJKi8KKworZXh0ZXJuIHhmc19idWZfdCAqcGFnZWJ1Zl9nZXRfbm9fZGFkZHIoLyogYWxsb2NhdGUgcGFnZWJ1ZiBzdHJ1Y3QJKi8KKwkJCQkJLyogd2l0aG91dCBkaXNrIGFkZHJlc3MJCSovCisJCXNpemVfdCBsZW4sCisJCXhmc19idWZ0YXJnX3QgKik7CS8qIG1vdW50IHBvaW50ICJmYWtlIiBpbm9kZQkqLworCitleHRlcm4gaW50IHBhZ2VidWZfYXNzb2NpYXRlX21lbW9yeSgKKwkJeGZzX2J1Zl90ICosCisJCXZvaWQgKiwKKwkJc2l6ZV90KTsKKworZXh0ZXJuIHZvaWQgcGFnZWJ1Zl9ob2xkKAkJLyogaW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudAkqLworCQl4ZnNfYnVmX3QgKik7CQkvKiBidWZmZXIgdG8gaG9sZAkJKi8KKworZXh0ZXJuIHZvaWQgcGFnZWJ1Zl9yZWFkYWhlYWQoCQkvKiByZWFkIGFoZWFkIGludG8gY2FjaGUJKi8KKwkJeGZzX2J1ZnRhcmdfdCAgKiwJLyogdGFyZ2V0IGZvciBidWZmZXIgKG9yIE5VTEwpCSovCisJCWxvZmZfdCwJCQkvKiBzdGFydGluZyBvZmZzZXQgb2YgcmFuZ2UgICAgICovCisJCXNpemVfdCwJCQkvKiBsZW5ndGggb2YgcmFuZ2UgICAgICAgICAgICAgICovCisJCXBhZ2VfYnVmX2ZsYWdzX3QpOwkvKiBhZGRpdGlvbmFsIHJlYWQgZmxhZ3MJKi8KKworLyogUmVsZWFzaW5nIEJ1ZmZlcnMgKi8KKworZXh0ZXJuIHZvaWQgcGFnZWJ1Zl9mcmVlKAkJLyogZGVhbGxvY2F0ZSBhIGJ1ZmZlcgkJKi8KKwkJeGZzX2J1Zl90ICopOwkJLyogYnVmZmVyIHRvIGRlYWxsb2NhdGUJCSovCisKK2V4dGVybiB2b2lkIHBhZ2VidWZfcmVsZSgJCS8qIHJlbGVhc2UgaG9sZCBvbiBhIGJ1ZmZlcgkqLworCQl4ZnNfYnVmX3QgKik7CQkvKiBidWZmZXIgdG8gcmVsZWFzZQkJKi8KKworLyogTG9ja2luZyBhbmQgVW5sb2NraW5nIEJ1ZmZlcnMgKi8KKworZXh0ZXJuIGludCBwYWdlYnVmX2NvbmRfbG9jaygJCS8qIGxvY2sgYnVmZmVyLCBpZiBub3QgbG9ja2VkCSovCisJCQkJCS8qIChyZXR1cm5zIC1FQlVTWSBpZiBsb2NrZWQpCSovCisJCXhmc19idWZfdCAqKTsJCS8qIGJ1ZmZlciB0byBsb2NrCQkqLworCitleHRlcm4gaW50IHBhZ2VidWZfbG9ja192YWx1ZSgJCS8qIHJldHVybiBjb3VudCBvbiBsb2NrCQkqLworCQl4ZnNfYnVmX3QgKik7ICAgICAgICAgIC8qIGJ1ZmZlciB0byBjaGVjayAgICAgICAgICAgICAgKi8KKworZXh0ZXJuIGludCBwYWdlYnVmX2xvY2soCQkvKiBsb2NrIGJ1ZmZlciAgICAgICAgICAgICAgICAgICovCisJCXhmc19idWZfdCAqKTsgICAgICAgICAgLyogYnVmZmVyIHRvIGxvY2sgICAgICAgICAgICAgICAqLworCitleHRlcm4gdm9pZCBwYWdlYnVmX3VubG9jaygJCS8qIHVubG9jayBidWZmZXIJCSovCisJCXhmc19idWZfdCAqKTsJCS8qIGJ1ZmZlciB0byB1bmxvY2sJCSovCisKKy8qIEJ1ZmZlciBSZWFkIGFuZCBXcml0ZSBSb3V0aW5lcyAqLworCitleHRlcm4gdm9pZCBwYWdlYnVmX2lvZG9uZSgJCS8qIG1hcmsgYnVmZmVyIEkvTyBjb21wbGV0ZQkqLworCQl4ZnNfYnVmX3QgKiwJCS8qIGJ1ZmZlciB0byBtYXJrCQkqLworCQlpbnQsCQkJLyogdXNlIGRhdGEvbG9nIGhlbHBlciB0aHJlYWQuCSovCisJCWludCk7CQkJLyogcnVuIGNvbXBsZXRpb24gbG9jYWxseSwgb3IgaW4KKwkJCQkJICogYSBoZWxwZXIgdGhyZWFkLgkJKi8KKworZXh0ZXJuIHZvaWQgcGFnZWJ1Zl9pb2Vycm9yKAkJLyogbWFyayBidWZmZXIgaW4gZXJyb3IJKG9yIG5vdCkgKi8KKwkJeGZzX2J1Zl90ICosCQkvKiBidWZmZXIgdG8gbWFyawkJKi8KKwkJaW50KTsJCQkvKiBlcnJvciB0byBzdG9yZSAoMCBpZiBub25lKQkqLworCitleHRlcm4gaW50IHBhZ2VidWZfaW9zdGFydCgJCS8qIHN0YXJ0IEkvTyBvbiBhIGJ1ZmZlcgkqLworCQl4ZnNfYnVmX3QgKiwJCS8qIGJ1ZmZlciB0byBzdGFydAkJKi8KKwkJcGFnZV9idWZfZmxhZ3NfdCk7CS8qIFBCRl9MT0NLLCBQQkZfQVNZTkMsCQkqLworCQkJCQkvKiBQQkZfUkVBRCwgUEJGX1dSSVRFLAkJKi8KKwkJCQkJLyogUEJGX0RFTFdSSQkJCSovCisKK2V4dGVybiBpbnQgcGFnZWJ1Zl9pb3JlcXVlc3QoCQkvKiBzdGFydCByZWFsIEkvTwkJKi8KKwkJeGZzX2J1Zl90ICopOwkJLyogYnVmZmVyIHRvIGNvbnZleSB0byBkZXZpY2UJKi8KKworZXh0ZXJuIGludCBwYWdlYnVmX2lvd2FpdCgJCS8qIHdhaXQgZm9yIGJ1ZmZlciBJL08gZG9uZQkqLworCQl4ZnNfYnVmX3QgKik7CQkvKiBidWZmZXIgdG8gd2FpdCBvbgkJKi8KKworZXh0ZXJuIHZvaWQgcGFnZWJ1Zl9pb21vdmUoCQkvKiBtb3ZlIGRhdGEgaW4vb3V0IG9mIHBhZ2VidWYJKi8KKwkJeGZzX2J1Zl90ICosCQkvKiBidWZmZXIgdG8gbWFuaXB1bGF0ZQkJKi8KKwkJc2l6ZV90LAkJCS8qIHN0YXJ0aW5nIGJ1ZmZlciBvZmZzZXQJKi8KKwkJc2l6ZV90LAkJCS8qIGxlbmd0aCBpbiBidWZmZXIJCSovCisJCWNhZGRyX3QsCQkvKiBkYXRhIHBvaW50ZXIJCQkqLworCQlwYWdlX2J1Zl9yd190KTsJCS8qIGRpcmVjdGlvbgkJCSovCisKK3N0YXRpYyBpbmxpbmUgaW50IHBhZ2VidWZfaW9zdHJhdGVneSh4ZnNfYnVmX3QgKnBiKQoreworCXJldHVybiBwYi0+cGJfc3RyYXQgPyBwYi0+cGJfc3RyYXQocGIpIDogcGFnZWJ1Zl9pb3JlcXVlc3QocGIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwYWdlYnVmX2dldGVycm9yKHhmc19idWZfdCAqcGIpCit7CisJcmV0dXJuIHBiID8gcGItPnBiX2Vycm9yIDogRU5PTUVNOworfQorCisvKiBCdWZmZXIgVXRpbGl0eSBSb3V0aW5lcyAqLworCitleHRlcm4gY2FkZHJfdCBwYWdlYnVmX29mZnNldCgJCS8qIHBvaW50ZXIgYXQgb2Zmc2V0IGluIGJ1ZmZlcgkqLworCQl4ZnNfYnVmX3QgKiwJCS8qIGJ1ZmZlciB0byBvZmZzZXQgaW50bwkqLworCQlzaXplX3QpOwkJLyogb2Zmc2V0CQkJKi8KKworLyogUGlubmluZyBCdWZmZXIgU3RvcmFnZSBpbiBNZW1vcnkgKi8KKworZXh0ZXJuIHZvaWQgcGFnZWJ1Zl9waW4oCQkvKiBwaW4gYnVmZmVyIGluIG1lbW9yeQkJKi8KKwkJeGZzX2J1Zl90ICopOwkJLyogYnVmZmVyIHRvIHBpbgkJKi8KKworZXh0ZXJuIHZvaWQgcGFnZWJ1Zl91bnBpbigJCS8qIHVucGluIGJ1ZmZlcmVkIGRhdGEJCSovCisJCXhmc19idWZfdCAqKTsJCS8qIGJ1ZmZlciB0byB1bnBpbgkJKi8KKworZXh0ZXJuIGludCBwYWdlYnVmX2lzcGluKAkJLyogY2hlY2sgaWYgYnVmZmVyIGlzIHBpbm5lZAkqLworCQl4ZnNfYnVmX3QgKik7CQkvKiBidWZmZXIgdG8gY2hlY2sJCSovCisKKy8qIERlbGF5ZWQgV3JpdGUgQnVmZmVyIFJvdXRpbmVzICovCisKK2V4dGVybiB2b2lkIHBhZ2VidWZfZGVsd3JpX2RlcXVldWUoeGZzX2J1Zl90ICopOworCisvKiBCdWZmZXIgRGFlbW9uIFNldHVwIFJvdXRpbmVzICovCisKK2V4dGVybiBpbnQgcGFnZWJ1Zl9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgcGFnZWJ1Zl90ZXJtaW5hdGUodm9pZCk7CisKKworI2lmZGVmIFBBR0VCVUZfVFJBQ0UKK2V4dGVybiBrdHJhY2VfdCAqcGFnZWJ1Zl90cmFjZV9idWY7CitleHRlcm4gdm9pZCBwYWdlYnVmX3RyYWNlKAorCQl4ZnNfYnVmX3QgKiwJCS8qIGJ1ZmZlciBiZWluZyB0cmFjZWQJCSovCisJCWNoYXIgKiwJCQkvKiBkZXNjcmlwdGlvbiBvZiBvcGVyYXRpb24JKi8KKwkJdm9pZCAqLAkJCS8qIGFyYml0cmFyeSBkaWFnbm9zdGljIHZhbHVlCSovCisJCXZvaWQgKik7CQkvKiByZXR1cm4gYWRkcmVzcwkJKi8KKyNlbHNlCisjIGRlZmluZSBwYWdlYnVmX3RyYWNlKHBiLCBpZCwgcHRyLCByYSkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgcGFnZWJ1Zl90YXJnZXRfbmFtZSh0YXJnZXQpCVwKKwkoeyBjaGFyIF9fYltCREVWTkFNRV9TSVpFXTsgYmRldm5hbWUoKHRhcmdldCktPnBicl9iZGV2LCBfX2IpOyBfX2I7IH0pCisKKworCisKKworLyogVGhlc2UgYXJlIGp1c3QgZm9yIHhmc19zeW5jc3ViLi4uIGl0IHNldHMgYW4gaW50ZXJuYWwgdmFyaWFibGUKKyAqIHRoZW4gcGFzc2VzIGl0IHRvIFZPUF9GTFVTSF9QQUdFUyBvciBhZGRzIHRoZSBmbGFncyB0byBhIG5ld2x5IGdvdHRlbiBidWZfdAorICovCisjZGVmaW5lIFhGU19CX0FTWU5DCQlQQkZfQVNZTkMKKyNkZWZpbmUgWEZTX0JfREVMV1JJCQlQQkZfREVMV1JJCisjZGVmaW5lIFhGU19CX1JFQUQJCVBCRl9SRUFECisjZGVmaW5lIFhGU19CX1dSSVRFCQlQQkZfV1JJVEUKKyNkZWZpbmUgWEZTX0JfU1RBTEUJCVBCRl9TVEFMRQorCisjZGVmaW5lIFhGU19CVUZfVFJZTE9DSwkJUEJGX1RSWUxPQ0sKKyNkZWZpbmUgWEZTX0lOQ09SRV9UUllMT0NLCVBCRl9UUllMT0NLCisjZGVmaW5lIFhGU19CVUZfTE9DSwkJUEJGX0xPQ0sKKyNkZWZpbmUgWEZTX0JVRl9NQVBQRUQJCVBCRl9NQVBQRUQKKworI2RlZmluZSBCVUZfQlVTWQkJUEJGX0RPTlRfQkxPQ0sKKworI2RlZmluZSBYRlNfQlVGX0JGTEFHUyh4KQkoKHgpLT5wYl9mbGFncykKKyNkZWZpbmUgWEZTX0JVRl9aRVJPRkxBR1MoeCkJXAorCSgoeCktPnBiX2ZsYWdzICY9IH4oUEJGX1JFQUR8UEJGX1dSSVRFfFBCRl9BU1lOQ3xQQkZfREVMV1JJKSkKKworI2RlZmluZSBYRlNfQlVGX1NUQUxFKHgpCSgoeCktPnBiX2ZsYWdzIHw9IFhGU19CX1NUQUxFKQorI2RlZmluZSBYRlNfQlVGX1VOU1RBTEUoeCkJKCh4KS0+cGJfZmxhZ3MgJj0gflhGU19CX1NUQUxFKQorI2RlZmluZSBYRlNfQlVGX0lTU1RBTEUoeCkJKCh4KS0+cGJfZmxhZ3MgJiBYRlNfQl9TVEFMRSkKKyNkZWZpbmUgWEZTX0JVRl9TVVBFUl9TVEFMRSh4KQlkbyB7CQkJCVwKKwkJCQkJWEZTX0JVRl9TVEFMRSh4KTsJXAorCQkJCQlwYWdlYnVmX2RlbHdyaV9kZXF1ZXVlKHgpOwlcCisJCQkJCVhGU19CVUZfRE9ORSh4KTsJXAorCQkJCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgWEZTX0JVRl9NQU5BR0UJCVBCRl9GU19NQU5BR0VECisjZGVmaW5lIFhGU19CVUZfVU5NQU5BR0UoeCkJKCh4KS0+cGJfZmxhZ3MgJj0gflBCRl9GU19NQU5BR0VEKQorCisjZGVmaW5lIFhGU19CVUZfREVMQVlXUklURSh4KQkgKCh4KS0+cGJfZmxhZ3MgfD0gUEJGX0RFTFdSSSkKKyNkZWZpbmUgWEZTX0JVRl9VTkRFTEFZV1JJVEUoeCkJIHBhZ2VidWZfZGVsd3JpX2RlcXVldWUoeCkKKyNkZWZpbmUgWEZTX0JVRl9JU0RFTEFZV1JJVEUoeCkJICgoeCktPnBiX2ZsYWdzICYgUEJGX0RFTFdSSSkKKworI2RlZmluZSBYRlNfQlVGX0VSUk9SKHgsbm8pCSBwYWdlYnVmX2lvZXJyb3IoeCxubykKKyNkZWZpbmUgWEZTX0JVRl9HRVRFUlJPUih4KQkgcGFnZWJ1Zl9nZXRlcnJvcih4KQorI2RlZmluZSBYRlNfQlVGX0lTRVJST1IoeCkJIChwYWdlYnVmX2dldGVycm9yKHgpPzE6MCkKKworI2RlZmluZSBYRlNfQlVGX0RPTkUoeCkJCSAoKHgpLT5wYl9mbGFncyAmPSB+KFBCRl9QQVJUSUFMfFBCRl9OT05FKSkKKyNkZWZpbmUgWEZTX0JVRl9VTkRPTkUoeCkJICgoeCktPnBiX2ZsYWdzIHw9IFBCRl9QQVJUSUFMfFBCRl9OT05FKQorI2RlZmluZSBYRlNfQlVGX0lTRE9ORSh4KQkgKCEoUEJGX05PVF9ET05FKHgpKSkKKworI2RlZmluZSBYRlNfQlVGX0JVU1koeCkJCSAoKHgpLT5wYl9mbGFncyB8PSBQQkZfRk9SQ0VJTykKKyNkZWZpbmUgWEZTX0JVRl9VTkJVU1koeCkJICgoeCktPnBiX2ZsYWdzICY9IH5QQkZfRk9SQ0VJTykKKyNkZWZpbmUgWEZTX0JVRl9JU0JVU1koeCkJICgxKQorCisjZGVmaW5lIFhGU19CVUZfQVNZTkMoeCkJICgoeCktPnBiX2ZsYWdzIHw9IFBCRl9BU1lOQykKKyNkZWZpbmUgWEZTX0JVRl9VTkFTWU5DKHgpCSAoKHgpLT5wYl9mbGFncyAmPSB+UEJGX0FTWU5DKQorI2RlZmluZSBYRlNfQlVGX0lTQVNZTkMoeCkJICgoeCktPnBiX2ZsYWdzICYgUEJGX0FTWU5DKQorCisjZGVmaW5lIFhGU19CVUZfRkxVU0goeCkJICgoeCktPnBiX2ZsYWdzIHw9IFBCRl9GTFVTSCkKKyNkZWZpbmUgWEZTX0JVRl9VTkZMVVNIKHgpCSAoKHgpLT5wYl9mbGFncyAmPSB+UEJGX0ZMVVNIKQorI2RlZmluZSBYRlNfQlVGX0lTRkxVU0goeCkJICgoeCktPnBiX2ZsYWdzICYgUEJGX0ZMVVNIKQorCisjZGVmaW5lIFhGU19CVUZfU0hVVCh4KQkJIHByaW50aygiWEZTX0JVRl9TSFVUIG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIpCisjZGVmaW5lIFhGU19CVUZfVU5TSFVUKHgpCSBwcmludGsoIlhGU19CVUZfVU5TSFVUIG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIpCisjZGVmaW5lIFhGU19CVUZfSVNTSFVUKHgpCSAoMCkKKworI2RlZmluZSBYRlNfQlVGX0hPTEQoeCkJCXBhZ2VidWZfaG9sZCh4KQorI2RlZmluZSBYRlNfQlVGX1JFQUQoeCkJCSgoeCktPnBiX2ZsYWdzIHw9IFBCRl9SRUFEKQorI2RlZmluZSBYRlNfQlVGX1VOUkVBRCh4KQkoKHgpLT5wYl9mbGFncyAmPSB+UEJGX1JFQUQpCisjZGVmaW5lIFhGU19CVUZfSVNSRUFEKHgpCSgoeCktPnBiX2ZsYWdzICYgUEJGX1JFQUQpCisKKyNkZWZpbmUgWEZTX0JVRl9XUklURSh4KQkoKHgpLT5wYl9mbGFncyB8PSBQQkZfV1JJVEUpCisjZGVmaW5lIFhGU19CVUZfVU5XUklURSh4KQkoKHgpLT5wYl9mbGFncyAmPSB+UEJGX1dSSVRFKQorI2RlZmluZSBYRlNfQlVGX0lTV1JJVEUoeCkJKCh4KS0+cGJfZmxhZ3MgJiBQQkZfV1JJVEUpCisKKyNkZWZpbmUgWEZTX0JVRl9JU1VOSU5JVElBTCh4KQkgKDApCisjZGVmaW5lIFhGU19CVUZfVU5VTklOSVRJQUwoeCkJICgwKQorCisjZGVmaW5lIFhGU19CVUZfQlBfSVNNQVBQRUQoYnApCSAxCisKKyNkZWZpbmUgWEZTX0JVRl9EQVRBSU8oeCkJKCh4KS0+cGJfZmxhZ3MgfD0gUEJGX0ZTX0RBVEFJT0QpCisjZGVmaW5lIFhGU19CVUZfVU5EQVRBSU8oeCkJKCh4KS0+cGJfZmxhZ3MgJj0gflBCRl9GU19EQVRBSU9EKQorCisjZGVmaW5lIFhGU19CVUZfSU9ET05FX0ZVTkMoYnVmKQkoYnVmKS0+cGJfaW9kb25lCisjZGVmaW5lIFhGU19CVUZfU0VUX0lPRE9ORV9GVU5DKGJ1ZiwgZnVuYykJXAorCQkJKGJ1ZiktPnBiX2lvZG9uZSA9IChmdW5jKQorI2RlZmluZSBYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhidWYpCQlcCisJCQkoYnVmKS0+cGJfaW9kb25lID0gTlVMTAorI2RlZmluZSBYRlNfQlVGX1NFVF9CRFNUUkFUX0ZVTkMoYnVmLCBmdW5jKQlcCisJCQkoYnVmKS0+cGJfc3RyYXQgPSAoZnVuYykKKyNkZWZpbmUgWEZTX0JVRl9DTFJfQkRTVFJBVF9GVU5DKGJ1ZikJCVwKKwkJCShidWYpLT5wYl9zdHJhdCA9IE5VTEwKKworI2RlZmluZSBYRlNfQlVGX0ZTUFJJVkFURShidWYsIHR5cGUpCQlcCisJCQkoKHR5cGUpKGJ1ZiktPnBiX2ZzcHJpdikKKyNkZWZpbmUgWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJ1ZiwgdmFsdWUpCVwKKwkJCShidWYpLT5wYl9mc3ByaXYgPSAodm9pZCAqKSh2YWx1ZSkKKyNkZWZpbmUgWEZTX0JVRl9GU1BSSVZBVEUyKGJ1ZiwgdHlwZSkJCVwKKwkJCSgodHlwZSkoYnVmKS0+cGJfZnNwcml2MikKKyNkZWZpbmUgWEZTX0JVRl9TRVRfRlNQUklWQVRFMihidWYsIHZhbHVlKQlcCisJCQkoYnVmKS0+cGJfZnNwcml2MiA9ICh2b2lkICopKHZhbHVlKQorI2RlZmluZSBYRlNfQlVGX0ZTUFJJVkFURTMoYnVmLCB0eXBlKQkJXAorCQkJKCh0eXBlKShidWYpLT5wYl9mc3ByaXYzKQorI2RlZmluZSBYRlNfQlVGX1NFVF9GU1BSSVZBVEUzKGJ1ZiwgdmFsdWUpCVwKKwkJCShidWYpLT5wYl9mc3ByaXYzICA9ICh2b2lkICopKHZhbHVlKQorI2RlZmluZSBYRlNfQlVGX1NFVF9TVEFSVChidWYpCisKKyNkZWZpbmUgWEZTX0JVRl9TRVRfQlJFTFNFX0ZVTkMoYnVmLCB2YWx1ZSkgXAorCQkJKGJ1ZiktPnBiX3JlbHNlID0gKHZhbHVlKQorCisjZGVmaW5lIFhGU19CVUZfUFRSKGJwKQkJKHhmc19jYWRkcl90KSgoYnApLT5wYl9hZGRyKQorCitleHRlcm4gaW5saW5lIHhmc19jYWRkcl90IHhmc19idWZfb2Zmc2V0KHhmc19idWZfdCAqYnAsIHNpemVfdCBvZmZzZXQpCit7CisJaWYgKGJwLT5wYl9mbGFncyAmIFBCRl9NQVBQRUQpCisJCXJldHVybiBYRlNfQlVGX1BUUihicCkgKyBvZmZzZXQ7CisJcmV0dXJuICh4ZnNfY2FkZHJfdCkgcGFnZWJ1Zl9vZmZzZXQoYnAsIG9mZnNldCk7Cit9CisKKyNkZWZpbmUgWEZTX0JVRl9TRVRfUFRSKGJwLCB2YWwsIGNvdW50KQkJXAorCQkJCXBhZ2VidWZfYXNzb2NpYXRlX21lbW9yeShicCwgdmFsLCBjb3VudCkKKyNkZWZpbmUgWEZTX0JVRl9BRERSKGJwKQkoKGJwKS0+cGJfYm4pCisjZGVmaW5lIFhGU19CVUZfU0VUX0FERFIoYnAsIGJsaykJCVwKKwkJCSgoYnApLT5wYl9ibiA9ICh4ZnNfZGFkZHJfdCkoYmxrKSkKKyNkZWZpbmUgWEZTX0JVRl9PRkZTRVQoYnApCSgoYnApLT5wYl9maWxlX29mZnNldCkKKyNkZWZpbmUgWEZTX0JVRl9TRVRfT0ZGU0VUKGJwLCBvZmYpCQlcCisJCQkoKGJwKS0+cGJfZmlsZV9vZmZzZXQgPSAob2ZmKSkKKyNkZWZpbmUgWEZTX0JVRl9DT1VOVChicCkJKChicCktPnBiX2NvdW50X2Rlc2lyZWQpCisjZGVmaW5lIFhGU19CVUZfU0VUX0NPVU5UKGJwLCBjbnQpCQlcCisJCQkoKGJwKS0+cGJfY291bnRfZGVzaXJlZCA9IChjbnQpKQorI2RlZmluZSBYRlNfQlVGX1NJWkUoYnApCSgoYnApLT5wYl9idWZmZXJfbGVuZ3RoKQorI2RlZmluZSBYRlNfQlVGX1NFVF9TSVpFKGJwLCBjbnQpCQlcCisJCQkoKGJwKS0+cGJfYnVmZmVyX2xlbmd0aCA9IChjbnQpKQorI2RlZmluZSBYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIHR5cGUsIHJlZikKKyNkZWZpbmUgWEZTX0JVRl9TRVRfVlRZUEUoYnAsIHR5cGUpCisjZGVmaW5lIFhGU19CVUZfU0VUX1JFRihicCwgcmVmKQorCisjZGVmaW5lIFhGU19CVUZfSVNQSU5ORUQoYnApCXBhZ2VidWZfaXNwaW4oYnApCisKKyNkZWZpbmUgWEZTX0JVRl9WQUxVU0VNQShicCkJcGFnZWJ1Zl9sb2NrX3ZhbHVlKGJwKQorI2RlZmluZSBYRlNfQlVGX0NQU0VNQShicCkJKHBhZ2VidWZfY29uZF9sb2NrKGJwKSA9PSAwKQorI2RlZmluZSBYRlNfQlVGX1ZTRU1BKGJwKQlwYWdlYnVmX3VubG9jayhicCkKKyNkZWZpbmUgWEZTX0JVRl9QU0VNQShicCx4KQlwYWdlYnVmX2xvY2soYnApCisjZGVmaW5lIFhGU19CVUZfVl9JT0RPTkVTRU1BKGJwKSB1cCgmYnAtPnBiX2lvZG9uZXNlbWEpOworCisvKiBzZXR1cCB0aGUgYnVmZmVyIHRhcmdldCBmcm9tIGEgYnVmdGFyZyBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgWEZTX0JVRl9TRVRfVEFSR0VUKGJwLCB0YXJnZXQpCVwKKwkJKGJwKS0+cGJfdGFyZ2V0ID0gKHRhcmdldCkKKyNkZWZpbmUgWEZTX0JVRl9UQVJHRVQoYnApCSgoYnApLT5wYl90YXJnZXQpCisjZGVmaW5lIFhGU19CVUZUQVJHX05BTUUodGFyZ2V0KQlcCisJCXBhZ2VidWZfdGFyZ2V0X25hbWUodGFyZ2V0KQorCisjZGVmaW5lIFhGU19CVUZfU0VUX1ZUWVBFX1JFRihicCwgdHlwZSwgcmVmKQorI2RlZmluZSBYRlNfQlVGX1NFVF9WVFlQRShicCwgdHlwZSkKKyNkZWZpbmUgWEZTX0JVRl9TRVRfUkVGKGJwLCByZWYpCisKK3N0YXRpYyBpbmxpbmUgaW50CXhmc19iYXdyaXRlKHZvaWQgKm1wLCB4ZnNfYnVmX3QgKmJwKQoreworCWJwLT5wYl9mc3ByaXYzID0gbXA7CisJYnAtPnBiX3N0cmF0ID0geGZzX2Jkc3RyYXRfY2I7CisJcGFnZWJ1Zl9kZWx3cmlfZGVxdWV1ZShicCk7CisJcmV0dXJuIHBhZ2VidWZfaW9zdGFydChicCwgUEJGX1dSSVRFIHwgUEJGX0FTWU5DIHwgX1BCRl9SVU5fUVVFVUVTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCXhmc19idWZfcmVsc2UoeGZzX2J1Zl90ICpicCkKK3sKKwlpZiAoIWJwLT5wYl9yZWxzZSkKKwkJcGFnZWJ1Zl91bmxvY2soYnApOworCXBhZ2VidWZfcmVsZShicCk7Cit9CisKKyNkZWZpbmUgeGZzX2JwaW4oYnApCQlwYWdlYnVmX3BpbihicCkKKyNkZWZpbmUgeGZzX2J1bnBpbihicCkJCXBhZ2VidWZfdW5waW4oYnApCisKKyNkZWZpbmUgeGZzX2J1ZnRyYWNlKGlkLCBicCkJXAorCSAgICBwYWdlYnVmX3RyYWNlKGJwLCBpZCwgTlVMTCwgKHZvaWQgKilfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpCisKKyNkZWZpbmUgeGZzX2Jpb2RvbmUocGIpCQkgICAgXAorCSAgICBwYWdlYnVmX2lvZG9uZShwYiwgKHBiLT5wYl9mbGFncyAmIFBCRl9GU19EQVRBSU9EKSwgMCkKKworI2RlZmluZSB4ZnNfYmlvbW92ZShwYiwgb2ZmLCBsZW4sIGRhdGEsIHJ3KSBcCisJICAgIHBhZ2VidWZfaW9tb3ZlKChwYiksIChvZmYpLCAobGVuKSwgKGRhdGEpLCBcCisJCSgocncpID09IFhGU19CX1dSSVRFKSA/IFBCUldfV1JJVEUgOiBQQlJXX1JFQUQpCisKKyNkZWZpbmUgeGZzX2Jpb3plcm8ocGIsIG9mZiwgbGVuKSBcCisJICAgIHBhZ2VidWZfaW9tb3ZlKChwYiksIChvZmYpLCAobGVuKSwgTlVMTCwgUEJSV19aRVJPKQorCisKK3N0YXRpYyBpbmxpbmUgaW50CVhGU19id3JpdGUoeGZzX2J1Zl90ICpwYikKK3sKKwlpbnQJaW93YWl0ID0gKHBiLT5wYl9mbGFncyAmIFBCRl9BU1lOQykgPT0gMDsKKwlpbnQJZXJyb3IgPSAwOworCisJaWYgKCFpb3dhaXQpCisJCXBiLT5wYl9mbGFncyB8PSBfUEJGX1JVTl9RVUVVRVM7CisKKwlwYWdlYnVmX2RlbHdyaV9kZXF1ZXVlKHBiKTsKKwlwYWdlYnVmX2lvc3RyYXRlZ3kocGIpOworCWlmIChpb3dhaXQpIHsKKwkJZXJyb3IgPSBwYWdlYnVmX2lvd2FpdChwYik7CisJCXhmc19idWZfcmVsc2UocGIpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKyNkZWZpbmUgWEZTX2Jkd3JpdGUocGIpCQkgICAgIFwKKwkgICAgcGFnZWJ1Zl9pb3N0YXJ0KHBiLCBQQkZfREVMV1JJIHwgUEJGX0FTWU5DKQorCitzdGF0aWMgaW5saW5lIGludCB4ZnNfYmR3cml0ZSh2b2lkICptcCwgeGZzX2J1Zl90ICpicCkKK3sKKwlicC0+cGJfc3RyYXQgPSB4ZnNfYmRzdHJhdF9jYjsKKwlicC0+cGJfZnNwcml2MyA9IG1wOworCisJcmV0dXJuIHBhZ2VidWZfaW9zdGFydChicCwgUEJGX0RFTFdSSSB8IFBCRl9BU1lOQyk7Cit9CisKKyNkZWZpbmUgWEZTX2Jkc3RyYXQoYnApIHBhZ2VidWZfaW9yZXF1ZXN0KGJwKQorCisjZGVmaW5lIHhmc19pb3dhaXQocGIpCXBhZ2VidWZfaW93YWl0KHBiKQorCisjZGVmaW5lIHhmc19iYXJlYWQodGFyZ2V0LCByYWJsa25vLCByYWxlbikgIFwKKwlwYWdlYnVmX3JlYWRhaGVhZCgodGFyZ2V0KSwgKHJhYmxrbm8pLCAocmFsZW4pLCBQQkZfRE9OVF9CTE9DSykKKworI2RlZmluZSB4ZnNfYnVmX2dldF9lbXB0eShsZW4sIHRhcmdldCkJcGFnZWJ1Zl9nZXRfZW1wdHkoKGxlbiksICh0YXJnZXQpKQorI2RlZmluZSB4ZnNfYnVmX2dldF9ub2FkZHIobGVuLCB0YXJnZXQpCXBhZ2VidWZfZ2V0X25vX2RhZGRyKChsZW4pLCAodGFyZ2V0KSkKKyNkZWZpbmUgeGZzX2J1Zl9mcmVlKGJwKQkJcGFnZWJ1Zl9mcmVlKGJwKQorCisKKy8qCisgKglIYW5kbGluZyBvZiBidWZ0YXJncy4KKyAqLworCitleHRlcm4geGZzX2J1ZnRhcmdfdCAqeGZzX2FsbG9jX2J1ZnRhcmcoc3RydWN0IGJsb2NrX2RldmljZSAqLCBpbnQpOworZXh0ZXJuIHZvaWQgeGZzX2ZyZWVfYnVmdGFyZyh4ZnNfYnVmdGFyZ190ICosIGludCk7CitleHRlcm4gdm9pZCB4ZnNfd2FpdF9idWZ0YXJnKHhmc19idWZ0YXJnX3QgKik7CitleHRlcm4gaW50IHhmc19zZXRzaXplX2J1ZnRhcmcoeGZzX2J1ZnRhcmdfdCAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CitleHRlcm4gdm9pZCB4ZnNfaW5jb3JlX3JlbHNlKHhmc19idWZ0YXJnX3QgKiwgaW50LCBpbnQpOworZXh0ZXJuIGludCB4ZnNfZmx1c2hfYnVmdGFyZyh4ZnNfYnVmdGFyZ190ICosIGludCk7CisKKyNkZWZpbmUgeGZzX2dldHNpemVfYnVmdGFyZyhidWZ0YXJnKSBcCisJYmxvY2tfc2l6ZSgoYnVmdGFyZyktPnBicl9iZGV2KQorI2RlZmluZSB4ZnNfcmVhZG9ubHlfYnVmdGFyZyhidWZ0YXJnKSBcCisJYmRldl9yZWFkX29ubHkoKGJ1ZnRhcmcpLT5wYnJfYmRldikKKyNkZWZpbmUgeGZzX2JpbnZhbChidWZ0YXJnKSBcCisJeGZzX2ZsdXNoX2J1ZnRhcmcoYnVmdGFyZywgMSkKKyNkZWZpbmUgWEZTX2JmbHVzaChidWZ0YXJnKSBcCisJeGZzX2ZsdXNoX2J1ZnRhcmcoYnVmdGFyZywgMSkKKworI2VuZGlmCS8qIF9fWEZTX0JVRl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2NyZWQuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2NyZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGM0NTg0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfY3JlZC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0NSRURfSF9fCisjZGVmaW5lIF9fWEZTX0NSRURfSF9fCisKKy8qCisgKiBDcmVkZW50aWFscworICovCit0eXBlZGVmIHN0cnVjdCBjcmVkIHsKKwkvKiBFTVBUWSAqLworfSBjcmVkX3Q7CisKK2V4dGVybiBzdHJ1Y3QgY3JlZCAqc3lzX2NyZWQ7CisKKy8qIHRoaXMgaXMgYSBoYWNrLi4gKGFzc3VtcyBzeXNfY3JlZCBpcyB0aGUgb25seSBjcmVkX3QgaW4gdGhlIHN5c3RlbSkgKi8KK3N0YXRpYyBfX2lubGluZSBpbnQgY2FwYWJsZV9jcmVkKGNyZWRfdCAqY3IsIGludCBjaWQpCit7CisJcmV0dXJuIChjciA9PSBzeXNfY3JlZCkgPyAxIDogY2FwYWJsZShjaWQpOworfQorCisjZW5kaWYgIC8qIF9fWEZTX0NSRURfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19leHBvcnQuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2V4cG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNzJhMWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19leHBvcnQuYwpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2V4cG9ydC5oIgorCisvKgorICogWEZTIGVuY29kZSBhbmQgZGVjb2RlcyB0aGUgZmlsZWlkIHBvcnRpb24gb2YgTkZTIGZpbGVoYW5kbGVzCisgKiBpdHNlbGYgaW5zdGVhZCBvZiBsZXR0aW5nIHRoZSBnZW5lcmljIE5GUyBjb2RlIGRvIGl0LiAgVGhpcworICogYWxsb3dzIGZpbGVzeXN0ZW1zIHdpdGggNjQgYml0IGlub2RlIG51bWJlcnMgdG8gYmUgZXhwb3J0ZWQuCisgKgorICogTm90ZSB0aGF0IGEgc2lkZSBlZmZlY3QgaXMgdGhhdCB4ZnNfdmdldCgpIHdvbid0IGJlIHBhc3NlZCBhCisgKiB6ZXJvIGlub2RlL2dlbmVyYXRpb24gcGFpciB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcy4gIEFzCisgKiBob3dldmVyIGEgbWFsaWNpb3VzIGNsaWVudCBjb3VsZCBzZW5kIHVzIHN1Y2ggZGF0YSwgdGhlIGNoZWNrCisgKiByZW1haW5zIGluIHRoYXQgY29kZS4KKyAqLworCisKK1NUQVRJQyBzdHJ1Y3QgZGVudHJ5ICoKK2xpbnZmc19kZWNvZGVfZmgoCisJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYiwKKwlfX3UzMgkJCSpmaCwKKwlpbnQJCQlmaF9sZW4sCisJaW50CQkJZmlsZWlkX3R5cGUsCisJaW50ICgqYWNjZXB0YWJsZSkoCisJCXZvaWQJCSpjb250ZXh0LAorCQlzdHJ1Y3QgZGVudHJ5CSpkZSksCisJdm9pZAkJCSpjb250ZXh0KQoreworCXhmc19maWQyX3QJCWlmaWQ7CisJeGZzX2ZpZDJfdAkJcGZpZDsKKwl2b2lkCQkJKnBhcmVudCA9IE5VTEw7CisJaW50CQkJaXM2NCA9IDA7CisJX191MzIJCQkqcCA9IGZoOworCisjaWYgWEZTX0JJR19JTlVNUworCWlzNjQgPSAoZmlsZWlkX3R5cGUgJiBYRlNfRklMRUlEX1RZUEVfNjRGTEFHKTsKKwlmaWxlaWRfdHlwZSAmPSB+WEZTX0ZJTEVJRF9UWVBFXzY0RkxBRzsKKyNlbmRpZgorCisJLyoKKwkgKiBOb3RlIHRoYXQgd2Ugb25seSBhY2NlcHQgZmlsZWlkcyB3aGljaCBhcmUgbG9uZyBlbm91Z2gKKwkgKiByYXRoZXIgdGhhbiBhbGxvdyB0aGUgcGFyZW50IGdlbmVyYXRpb24gbnVtYmVyIHRvIGRlZmF1bHQKKwkgKiB0byB6ZXJvLiAgWEZTIGNvbnNpZGVycyB6ZXJvIGEgdmFsaWQgZ2VuZXJhdGlvbiBudW1iZXIgbm90CisJICogYW4gaW52YWxpZC93aWxkY2FyZCB2YWx1ZS4gIFRoZXJlJ3MgbGl0dGxlIHBvaW50IHByaW50aydpbmcKKwkgKiBhIHdhcm5pbmcgaGVyZSBhcyB3ZSBkb24ndCBoYXZlIHRoZSBjbGllbnQgaW5mb3JtYXRpb24KKwkgKiB3aGljaCB3b3VsZCBtYWtlIHN1Y2ggYSB3YXJuaW5nIHVzZWZ1bC4KKwkgKi8KKwlpZiAoZmlsZWlkX3R5cGUgPiAyIHx8CisJICAgIGZoX2xlbiA8IHhmc19maWxlaWRfbGVuZ3RoKChmaWxlaWRfdHlwZSA9PSAyKSwgaXM2NCkpCisJCXJldHVybiBOVUxMOworCisJcCA9IHhmc19maWxlaWRfZGVjb2RlX2ZpZDIocCwgJmlmaWQsIGlzNjQpOworCisJaWYgKGZpbGVpZF90eXBlID09IDIpIHsKKwkJcCA9IHhmc19maWxlaWRfZGVjb2RlX2ZpZDIocCwgJnBmaWQsIGlzNjQpOworCQlwYXJlbnQgPSAmcGZpZDsKKwl9CisJCisJZmggPSAoX191MzIgKikmaWZpZDsKKwlyZXR1cm4gZmluZF9leHBvcnRlZF9kZW50cnkoc2IsIGZoLCBwYXJlbnQsIGFjY2VwdGFibGUsIGNvbnRleHQpOworfQorCisKK1NUQVRJQyBpbnQKK2xpbnZmc19lbmNvZGVfZmgoCisJc3RydWN0IGRlbnRyeQkJKmRlbnRyeSwKKwlfX3UzMgkJCSpmaCwKKwlpbnQJCQkqbWF4X2xlbiwKKwlpbnQJCQljb25uZWN0YWJsZSkKK3sKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQJCQl0eXBlID0gMTsKKwlfX3UzMgkJCSpwID0gZmg7CisJaW50CQkJbGVuOworCWludAkJCWlzNjQgPSAwOworI2lmIFhGU19CSUdfSU5VTVMKKwl2ZnNfdAkJCSp2ZnMgPSBMSU5WRlNfR0VUX1ZGUyhpbm9kZS0+aV9zYik7CisJeGZzX21vdW50X3QJCSptcCA9IFhGU19WRlNUT00odmZzKTsKKwkKKwlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF8zMkJJVElOT09QVCkpIHsKKwkJLyogZmlsZXN5c3RlbSBtYXkgY29udGFpbiA2NGJpdCBpbm9kZSBudW1iZXJzICovCisJCWlzNjQgPSBYRlNfRklMRUlEX1RZUEVfNjRGTEFHOworCX0KKyNlbmRpZgorCisJLyogRGlyZWN0b3JpZXMgZG9uJ3QgbmVlZCB0aGVpciBwYXJlbnQgZW5jb2RlZCwgdGhleSBoYXZlICIuLiIgKi8KKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkgICAgY29ubmVjdGFibGUgPSAwOworCisJLyoKKwkgKiBPbmx5IGVuY29kZSBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgZ2l2ZW4uICBJbiBwcmFjdGljZQorCSAqIHRoaXMgbWVhbnMgd2UgY2FuJ3QgZXhwb3J0IGEgZmlsZXN5c3RlbSB3aXRoIDY0Yml0IGlub2RlcworCSAqIG92ZXIgTkZTdjIgd2l0aCB0aGUgc3VidHJlZV9jaGVjayBleHBvcnQgb3B0aW9uOyB0aGUgb3RoZXIKKwkgKiBzZXZlbiBjb21iaW5hdGlvbnMgd29yay4gIFRoZSByZWFsIGFuc3dlciBpcyAiZG9uJ3QgdXNlIHYyIi4KKwkgKi8KKwlsZW4gPSB4ZnNfZmlsZWlkX2xlbmd0aChjb25uZWN0YWJsZSwgaXM2NCk7CisJaWYgKCptYXhfbGVuIDwgbGVuKQorCQlyZXR1cm4gMjU1OworCSptYXhfbGVuID0gbGVuOworCisJcCA9IHhmc19maWxlaWRfZW5jb2RlX2lub2RlKHAsIGlub2RlLCBpczY0KTsKKwlpZiAoY29ubmVjdGFibGUpIHsKKwkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCXAgPSB4ZnNfZmlsZWlkX2VuY29kZV9pbm9kZShwLCBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLCBpczY0KTsKKwkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJdHlwZSA9IDI7CisJfQorCUJVR19PTigocCAtIGZoKSAhPSBsZW4pOworCXJldHVybiB0eXBlIHwgaXM2NDsKK30KKworU1RBVElDIHN0cnVjdCBkZW50cnkgKgorbGludmZzX2dldF9kZW50cnkoCisJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYiwKKwl2b2lkCQkJKmRhdGEpCit7CisJdm5vZGVfdAkJCSp2cDsKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5CQkqcmVzdWx0OworCXZmc190CQkJKnZmc3AgPSBMSU5WRlNfR0VUX1ZGUyhzYik7CisJaW50CQkJZXJyb3I7CisKKwlWRlNfVkdFVCh2ZnNwLCAmdnAsIChmaWRfdCAqKWRhdGEsIGVycm9yKTsKKwlpZiAoZXJyb3IgfHwgdnAgPT0gTlVMTCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSkgOworCisJaW5vZGUgPSBMSU5WRlNfR0VUX0lQKHZwKTsKKwlyZXN1bHQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOworICAgICAgICBpZiAoIXJlc3VsdCkgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK1NUQVRJQyBzdHJ1Y3QgZGVudHJ5ICoKK2xpbnZmc19nZXRfcGFyZW50KAorCXN0cnVjdCBkZW50cnkJCSpjaGlsZCkKK3sKKwlpbnQJCQllcnJvcjsKKwl2bm9kZV90CQkJKnZwLCAqY3ZwOworCXN0cnVjdCBkZW50cnkJCSpwYXJlbnQ7CisJc3RydWN0IGRlbnRyeQkJZG90ZG90OworCisJZG90ZG90LmRfbmFtZS5uYW1lID0gIi4uIjsKKwlkb3Rkb3QuZF9uYW1lLmxlbiA9IDI7CisJZG90ZG90LmRfaW5vZGUgPSBOVUxMOworCisJY3ZwID0gTlVMTDsKKwl2cCA9IExJTlZGU19HRVRfVlAoY2hpbGQtPmRfaW5vZGUpOworCVZPUF9MT09LVVAodnAsICZkb3Rkb3QsICZjdnAsIDAsIE5VTEwsIE5VTEwsIGVycm9yKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlyZXR1cm4gRVJSX1BUUigtZXJyb3IpOworCisJcGFyZW50ID0gZF9hbGxvY19hbm9uKExJTlZGU19HRVRfSVAoY3ZwKSk7CisJaWYgKHVubGlrZWx5KCFwYXJlbnQpKSB7CisJCVZOX1JFTEUoY3ZwKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCXJldHVybiBwYXJlbnQ7Cit9CisKK3N0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBsaW52ZnNfZXhwb3J0X29wcyA9IHsKKwkuZGVjb2RlX2ZoCQk9IGxpbnZmc19kZWNvZGVfZmgsCisJLmVuY29kZV9maAkJPSBsaW52ZnNfZW5jb2RlX2ZoLAorCS5nZXRfcGFyZW50CQk9IGxpbnZmc19nZXRfcGFyZW50LAorCS5nZXRfZGVudHJ5CQk9IGxpbnZmc19nZXRfZGVudHJ5LAorfTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2V4cG9ydC5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZXhwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiMmFiYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2V4cG9ydC5oCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfRVhQT1JUX0hfXworI2RlZmluZSBfX1hGU19FWFBPUlRfSF9fCisKKy8qCisgKiBDb21tb24gZGVmaW5lcyBmb3IgY29kZSByZWxhdGVkIHRvIGV4cG9ydGluZyBYRlMgZmlsZXN5c3RlbXMgb3ZlciBORlMuCisgKgorICogVGhlIE5GUyBmaWxlaWQgZ29lcyBvdXQgb24gdGhlIHdpcmUgYXMgYW4gYXJyYXkgb2YKKyAqIDMyYml0IHVuc2lnbmVkIGludHMgaW4gaG9zdCBvcmRlci4gIFRoZXJlIGFyZSA1IHBvc3NpYmxlCisgKiBmb3JtYXRzLgorICoKKyAqICgxKQlmaWxlaWRfdHlwZT0weDAwCisgKgkobm8gZmlsZWlkIGRhdGE7IGhhbmRsZWQgYnkgdGhlIGdlbmVyaWMgY29kZSkKKyAqCisgKiAoMikJZmlsZWlkX3R5cGU9MHgwMQorICoJaW5vZGUtbnVtCisgKglnZW5lcmF0aW9uCisgKgorICogKDMpCWZpbGVpZF90eXBlPTB4MDIKKyAqCWlub2RlLW51bQorICoJZ2VuZXJhdGlvbgorICoJcGFyZW50LWlub2RlLW51bQorICoJcGFyZW50LWdlbmVyYXRpb24KKyAqCisgKiAoNCkJZmlsZWlkX3R5cGU9MHg4MQorICoJaW5vZGUtbnVtLWxvMzIKKyAqCWlub2RlLW51bS1oaTMyCisgKglnZW5lcmF0aW9uCisgKgorICogKDUpCWZpbGVpZF90eXBlPTB4ODIKKyAqCWlub2RlLW51bS1sbzMyCisgKglpbm9kZS1udW0taGkzMgorICoJZ2VuZXJhdGlvbgorICoJcGFyZW50LWlub2RlLW51bS1sbzMyCisgKglwYXJlbnQtaW5vZGUtbnVtLWhpMzIKKyAqCXBhcmVudC1nZW5lcmF0aW9uCisgKgorICogTm90ZSwgdGhlIE5GUyBmaWxlaGFuZGxlIGFsc28gaW5jbHVkZXMgYW4gZnNpZCBwb3J0aW9uIHdoaWNoCisgKiBtYXkgaGF2ZSBhbiBpbm9kZSBudW1iZXIgaW4gaXQuICBUaGF0IG51bWJlciBpcyBoYXJkY29kZWQgdG8KKyAqIDMyYml0cyBhbmQgdGhlcmUgaXMgbm8gd2F5IGZvciBYRlMgdG8gaW50ZXJjZXB0IGl0LiAgSW4KKyAqIHByYWN0aWNlIHRoaXMgbWVhbnMgd2hlbiBleHBvcnRpbmcgYW4gWEZTIGZpbGVzeXRlbSB3aXRoIDY0Yml0CisgKiBpbm9kZXMgeW91IHNob3VsZCBlaXRoZXIgZXhwb3J0IHRoZSBtb3VudHBvaW50IChyYXRoZXIgdGhhbgorICogYSBzdWJkaXJlY3RvcnkpIG9yIHVzZSB0aGUgImZzaWQiIGV4cG9ydCBvcHRpb24uCisgKi8KKworLyogVGhpcyBmbGFnIGdvZXMgb24gdGhlIHdpcmUuICBEb24ndCBwbGF5IHdpdGggaXQuICovCisjZGVmaW5lIFhGU19GSUxFSURfVFlQRV82NEZMQUcJMHg4MAkvKiBORlMgZmlsZWlkIGhhcyA2NGJpdCBpbm9kZXMgKi8KKworLyogQ2FsY3VsYXRlIHRoZSBsZW5ndGggaW4gdTMyIHVuaXRzIG9mIHRoZSBmaWxlaWQgZGF0YSAqLworc3RhdGljIGlubGluZSBpbnQKK3hmc19maWxlaWRfbGVuZ3RoKGludCBoYXNwYXJlbnQsIGludCBpczY0KQoreworCXJldHVybiBoYXNwYXJlbnQgPyAoaXM2NCA/IDYgOiA0KSA6IChpczY0ID8gMyA6IDIpOworfQorCisvKgorICogRGVjb2RlIGVuY29kZWQgaW5vZGUgaW5mb3JtYXRpb24gKGVpdGhlciBmb3IgdGhlIGlub2RlIGl0c2VsZgorICogb3IgdGhlIHBhcmVudCkgaW50byBhbiB4ZnNfZmlkMl90IHN0cnVjdHVyZS4gIEFkdmFuY2VzIGFuZAorICogcmV0dXJucyB0aGUgbmV3IGRhdGEgcG9pbnRlcgorICovCitzdGF0aWMgaW5saW5lIF9fdTMyICoKK3hmc19maWxlaWRfZGVjb2RlX2ZpZDIoX191MzIgKnAsIHhmc19maWQyX3QgKmZpZCwgaW50IGlzNjQpCit7CisJZmlkLT5maWRfbGVuID0gc2l6ZW9mKHhmc19maWQyX3QpIC0gc2l6ZW9mKGZpZC0+ZmlkX2xlbik7CisJZmlkLT5maWRfcGFkID0gMDsKKwlmaWQtPmZpZF9pbm8gPSAqcCsrOworI2lmIFhGU19CSUdfSU5VTVMKKwlpZiAoaXM2NCkKKwkJZmlkLT5maWRfaW5vIHw9ICgoKF9fdTY0KSgqcCsrKSkgPDwgMzIpOworI2VuZGlmCisJZmlkLT5maWRfZ2VuID0gKnArKzsKKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIEVuY29kZSBpbm9kZSBpbmZvcm1hdGlvbiAoZWl0aGVyIGZvciB0aGUgaW5vZGUgaXRzZWxmIG9yIHRoZQorICogcGFyZW50KSBpbnRvIGEgZmlsZWlkIGJ1ZmZlci4gIEFkdmFuY2VzIGFuZCByZXR1cm5zIHRoZSBuZXcKKyAqIGRhdGEgcG9pbnRlci4KKyAqLworc3RhdGljIGlubGluZSBfX3UzMiAqCit4ZnNfZmlsZWlkX2VuY29kZV9pbm9kZShfX3UzMiAqcCwgc3RydWN0IGlub2RlICppbm9kZSwgaW50IGlzNjQpCit7CisJKnArKyA9IChfX3UzMilpbm9kZS0+aV9pbm87CisjaWYgWEZTX0JJR19JTlVNUworCWlmIChpczY0KQorCQkqcCsrID0gKF9fdTMyKShpbm9kZS0+aV9pbm8gPj4gMzIpOworI2VuZGlmCisJKnArKyA9IGlub2RlLT5pX2dlbmVyYXRpb247CisJcmV0dXJuIHA7Cit9CisKKyNlbmRpZgkvKiBfX1hGU19FWFBPUlRfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwNTdhNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYwpAQCAtMCwwICsxLDU3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgInhmc19pb2N0bDMyLmgiCisKKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGxpbnZmc19maWxlX3ZtX29wczsKKworCitTVEFUSUMgaW5saW5lIHNzaXplX3QKK19fbGludmZzX3JlYWQoCisJc3RydWN0IGtpb2NiCQkqaW9jYiwKKwljaGFyCQkJX191c2VyICpidWYsCisJaW50CQkJaW9mbGFncywKKwlzaXplX3QJCQljb3VudCwKKwlsb2ZmX3QJCQlwb3MpCit7CisJc3RydWN0IGlvdmVjCQlpb3YgPSB7YnVmLCBjb3VudH07CisJc3RydWN0IGZpbGUJCSpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwl2bm9kZV90CQkJKnZwID0gTElOVkZTX0dFVF9WUChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3NpemVfdAkJCXJ2YWw7CisKKwlCVUdfT04oaW9jYi0+a2lfcG9zICE9IHBvcyk7CisKKwlpZiAodW5saWtlbHkoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSkKKwkJaW9mbGFncyB8PSBJT19JU0RJUkVDVDsKKwlWT1BfUkVBRCh2cCwgaW9jYiwgJmlvdiwgMSwgJmlvY2ItPmtpX3BvcywgaW9mbGFncywgTlVMTCwgcnZhbCk7CisJcmV0dXJuIHJ2YWw7Cit9CisKKworU1RBVElDIHNzaXplX3QKK2xpbnZmc19haW9fcmVhZCgKKwlzdHJ1Y3Qga2lvY2IJCSppb2NiLAorCWNoYXIJCQlfX3VzZXIgKmJ1ZiwKKwlzaXplX3QJCQljb3VudCwKKwlsb2ZmX3QJCQlwb3MpCit7CisJcmV0dXJuIF9fbGludmZzX3JlYWQoaW9jYiwgYnVmLCBJT19JU0FJTywgY291bnQsIHBvcyk7Cit9CisKK1NUQVRJQyBzc2l6ZV90CitsaW52ZnNfYWlvX3JlYWRfaW52aXMoCisJc3RydWN0IGtpb2NiCQkqaW9jYiwKKwljaGFyCQkJX191c2VyICpidWYsCisJc2l6ZV90CQkJY291bnQsCisJbG9mZl90CQkJcG9zKQoreworCXJldHVybiBfX2xpbnZmc19yZWFkKGlvY2IsIGJ1ZiwgSU9fSVNBSU98SU9fSU5WSVMsIGNvdW50LCBwb3MpOworfQorCisKK1NUQVRJQyBpbmxpbmUgc3NpemVfdAorX19saW52ZnNfd3JpdGUoCisJc3RydWN0IGtpb2NiCSppb2NiLAorCWNvbnN0IGNoYXIJX191c2VyICpidWYsCisJaW50CQlpb2ZsYWdzLAorCXNpemVfdAkJY291bnQsCisJbG9mZl90CQlwb3MpCit7CisJc3RydWN0IGlvdmVjCWlvdiA9IHsodm9pZCBfX3VzZXIgKilidWYsIGNvdW50fTsKKwlzdHJ1Y3QgZmlsZQkqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKwl2bm9kZV90CQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKwlzc2l6ZV90CQlydmFsOworCisJQlVHX09OKGlvY2ItPmtpX3BvcyAhPSBwb3MpOworCWlmICh1bmxpa2VseShmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpKQorCQlpb2ZsYWdzIHw9IElPX0lTRElSRUNUOworCisJVk9QX1dSSVRFKHZwLCBpb2NiLCAmaW92LCAxLCAmaW9jYi0+a2lfcG9zLCBpb2ZsYWdzLCBOVUxMLCBydmFsKTsKKwlyZXR1cm4gcnZhbDsKK30KKworCitTVEFUSUMgc3NpemVfdAorbGludmZzX2Fpb193cml0ZSgKKwlzdHJ1Y3Qga2lvY2IJCSppb2NiLAorCWNvbnN0IGNoYXIJCV9fdXNlciAqYnVmLAorCXNpemVfdAkJCWNvdW50LAorCWxvZmZfdAkJCXBvcykKK3sKKwlyZXR1cm4gX19saW52ZnNfd3JpdGUoaW9jYiwgYnVmLCBJT19JU0FJTywgY291bnQsIHBvcyk7Cit9CisKK1NUQVRJQyBzc2l6ZV90CitsaW52ZnNfYWlvX3dyaXRlX2ludmlzKAorCXN0cnVjdCBraW9jYgkJKmlvY2IsCisJY29uc3QgY2hhcgkJX191c2VyICpidWYsCisJc2l6ZV90CQkJY291bnQsCisJbG9mZl90CQkJcG9zKQoreworCXJldHVybiBfX2xpbnZmc193cml0ZShpb2NiLCBidWYsIElPX0lTQUlPfElPX0lOVklTLCBjb3VudCwgcG9zKTsKK30KKworCitTVEFUSUMgaW5saW5lIHNzaXplX3QKK19fbGludmZzX3JlYWR2KAorCXN0cnVjdCBmaWxlCQkqZmlsZSwKKwljb25zdCBzdHJ1Y3QgaW92ZWMgCSppb3YsCisJaW50CQkJaW9mbGFncywKKwl1bnNpZ25lZCBsb25nCQlucl9zZWdzLAorCWxvZmZfdAkJCSpwcG9zKQoreworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CisJdm5vZGVfdAkJKnZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CisJc3RydWN0CQlraW9jYiBraW9jYjsKKwlzc2l6ZV90CQlydmFsOworCisJaW5pdF9zeW5jX2tpb2NiKCZraW9jYiwgZmlsZSk7CisJa2lvY2Iua2lfcG9zID0gKnBwb3M7CisKKwlpZiAodW5saWtlbHkoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSkKKwkJaW9mbGFncyB8PSBJT19JU0RJUkVDVDsKKwlWT1BfUkVBRCh2cCwgJmtpb2NiLCBpb3YsIG5yX3NlZ3MsICZraW9jYi5raV9wb3MsIGlvZmxhZ3MsIE5VTEwsIHJ2YWwpOworCisJKnBwb3MgPSBraW9jYi5raV9wb3M7CisJcmV0dXJuIHJ2YWw7Cit9CisKK1NUQVRJQyBzc2l6ZV90CitsaW52ZnNfcmVhZHYoCisJc3RydWN0IGZpbGUJCSpmaWxlLAorCWNvbnN0IHN0cnVjdCBpb3ZlYyAJKmlvdiwKKwl1bnNpZ25lZCBsb25nCQlucl9zZWdzLAorCWxvZmZfdAkJCSpwcG9zKQoreworCXJldHVybiBfX2xpbnZmc19yZWFkdihmaWxlLCBpb3YsIDAsIG5yX3NlZ3MsIHBwb3MpOworfQorCitTVEFUSUMgc3NpemVfdAorbGludmZzX3JlYWR2X2ludmlzKAorCXN0cnVjdCBmaWxlCQkqZmlsZSwKKwljb25zdCBzdHJ1Y3QgaW92ZWMgCSppb3YsCisJdW5zaWduZWQgbG9uZwkJbnJfc2VncywKKwlsb2ZmX3QJCQkqcHBvcykKK3sKKwlyZXR1cm4gX19saW52ZnNfcmVhZHYoZmlsZSwgaW92LCBJT19JTlZJUywgbnJfc2VncywgcHBvcyk7Cit9CisKKworU1RBVElDIGlubGluZSBzc2l6ZV90CitfX2xpbnZmc193cml0ZXYoCisJc3RydWN0IGZpbGUJCSpmaWxlLAorCWNvbnN0IHN0cnVjdCBpb3ZlYyAJKmlvdiwKKwlpbnQJCQlpb2ZsYWdzLAorCXVuc2lnbmVkIGxvbmcJCW5yX3NlZ3MsCisJbG9mZl90CQkJKnBwb3MpCit7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKwl2bm9kZV90CQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKwlzdHJ1Y3QJCWtpb2NiIGtpb2NiOworCXNzaXplX3QJCXJ2YWw7CisKKwlpbml0X3N5bmNfa2lvY2IoJmtpb2NiLCBmaWxlKTsKKwlraW9jYi5raV9wb3MgPSAqcHBvczsKKwlpZiAodW5saWtlbHkoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSkKKwkJaW9mbGFncyB8PSBJT19JU0RJUkVDVDsKKworCVZPUF9XUklURSh2cCwgJmtpb2NiLCBpb3YsIG5yX3NlZ3MsICZraW9jYi5raV9wb3MsIGlvZmxhZ3MsIE5VTEwsIHJ2YWwpOworCisJKnBwb3MgPSBraW9jYi5raV9wb3M7CisJcmV0dXJuIHJ2YWw7Cit9CisKKworU1RBVElDIHNzaXplX3QKK2xpbnZmc193cml0ZXYoCisJc3RydWN0IGZpbGUJCSpmaWxlLAorCWNvbnN0IHN0cnVjdCBpb3ZlYyAJKmlvdiwKKwl1bnNpZ25lZCBsb25nCQlucl9zZWdzLAorCWxvZmZfdAkJCSpwcG9zKQoreworCXJldHVybiBfX2xpbnZmc193cml0ZXYoZmlsZSwgaW92LCAwLCBucl9zZWdzLCBwcG9zKTsKK30KKworU1RBVElDIHNzaXplX3QKK2xpbnZmc193cml0ZXZfaW52aXMoCisJc3RydWN0IGZpbGUJCSpmaWxlLAorCWNvbnN0IHN0cnVjdCBpb3ZlYyAJKmlvdiwKKwl1bnNpZ25lZCBsb25nCQlucl9zZWdzLAorCWxvZmZfdAkJCSpwcG9zKQoreworCXJldHVybiBfX2xpbnZmc193cml0ZXYoZmlsZSwgaW92LCBJT19JTlZJUywgbnJfc2VncywgcHBvcyk7Cit9CisKK1NUQVRJQyBzc2l6ZV90CitsaW52ZnNfc2VuZGZpbGUoCisJc3RydWN0IGZpbGUJCSpmaWxwLAorCWxvZmZfdAkJCSpwcG9zLAorCXNpemVfdAkJCWNvdW50LAorCXJlYWRfYWN0b3JfdAkJYWN0b3IsCisJdm9pZAkJCSp0YXJnZXQpCit7CisJdm5vZGVfdAkJCSp2cCA9IExJTlZGU19HRVRfVlAoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCXNzaXplX3QJCQlydmFsOworCisJVk9QX1NFTkRGSUxFKHZwLCBmaWxwLCBwcG9zLCAwLCBjb3VudCwgYWN0b3IsIHRhcmdldCwgTlVMTCwgcnZhbCk7CisJcmV0dXJuIHJ2YWw7Cit9CisKKworU1RBVElDIGludAorbGludmZzX29wZW4oCisJc3RydWN0IGlub2RlCSppbm9kZSwKKwlzdHJ1Y3QgZmlsZQkqZmlscCkKK3sKKwl2bm9kZV90CQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKwlpbnQJCWVycm9yOworCisJaWYgKCEoZmlscC0+Zl9mbGFncyAmIE9fTEFSR0VGSUxFKSAmJiBpX3NpemVfcmVhZChpbm9kZSkgPiBNQVhfTk9OX0xGUykKKwkJcmV0dXJuIC1FRkJJRzsKKworCUFTU0VSVCh2cCk7CisJVk9QX09QRU4odnAsIE5VTEwsIGVycm9yKTsKKwlyZXR1cm4gLWVycm9yOworfQorCisKK1NUQVRJQyBpbnQKK2xpbnZmc19yZWxlYXNlKAorCXN0cnVjdCBpbm9kZQkqaW5vZGUsCisJc3RydWN0IGZpbGUJKmZpbHApCit7CisJdm5vZGVfdAkJKnZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CisJaW50CQllcnJvciA9IDA7CisKKwlpZiAodnApCisJCVZPUF9SRUxFQVNFKHZwLCBlcnJvcik7CisJcmV0dXJuIC1lcnJvcjsKK30KKworCitTVEFUSUMgaW50CitsaW52ZnNfZnN5bmMoCisJc3RydWN0IGZpbGUJKmZpbHAsCisJc3RydWN0IGRlbnRyeQkqZGVudHJ5LAorCWludAkJZGF0YXN5bmMpCit7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwl2bm9kZV90CQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKwlpbnQJCWVycm9yOworCWludAkJZmxhZ3MgPSBGU1lOQ19XQUlUOworCisJaWYgKGRhdGFzeW5jKQorCQlmbGFncyB8PSBGU1lOQ19EQVRBOworCisJQVNTRVJUKHZwKTsKKwlWT1BfRlNZTkModnAsIGZsYWdzLCBOVUxMLCAoeGZzX29mZl90KTAsICh4ZnNfb2ZmX3QpLTEsIGVycm9yKTsKKwlyZXR1cm4gLWVycm9yOworfQorCisvKgorICogbGludmZzX3JlYWRkaXIgbWFwcyB0byBWT1BfUkVBRERJUigpLgorICogV2UgbmVlZCB0byBidWlsZCBhIHVpbywgY3JlZCwgLi4uCisgKi8KKworI2RlZmluZSBuZXh0ZHAoZHApICAgICAgKChzdHJ1Y3QgeGZzX2RpcmVudCAqKSgoY2hhciAqKShkcCkgKyAoZHApLT5kX3JlY2xlbikpCisKK1NUQVRJQyBpbnQKK2xpbnZmc19yZWFkZGlyKAorCXN0cnVjdCBmaWxlCSpmaWxwLAorCXZvaWQJCSpkaXJlbnQsCisJZmlsbGRpcl90CWZpbGxkaXIpCit7CisJaW50CQllcnJvciA9IDA7CisJdm5vZGVfdAkJKnZwOworCXVpb190CQl1aW87CisJaW92ZWNfdAkJaW92OworCWludAkJZW9mID0gMDsKKwljYWRkcl90CQlyZWFkX2J1ZjsKKwlpbnQJCW5hbWVsZW4sIHNpemUgPSAwOworCXNpemVfdAkJcmxlbiA9IFBBR0VfQ0FDSEVfU0laRTsKKwl4ZnNfb2ZmX3QJc3RhcnRfb2Zmc2V0LCBjdXJyX29mZnNldDsKKwl4ZnNfZGlyZW50X3QJKmRicCA9IE5VTEw7CisKKwl2cCA9IExJTlZGU19HRVRfVlAoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCUFTU0VSVCh2cCk7CisKKwkvKiBUcnkgZmFpcmx5IGhhcmQgdG8gZ2V0IG1lbW9yeSAqLworCWRvIHsKKwkJaWYgKChyZWFkX2J1ZiA9IChjYWRkcl90KWttYWxsb2MocmxlbiwgR0ZQX0tFUk5FTCkpKQorCQkJYnJlYWs7CisJCXJsZW4gPj49IDE7CisJfSB3aGlsZSAocmxlbiA+PSAxMDI0KTsKKworCWlmIChyZWFkX2J1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXVpby51aW9faW92ID0gJmlvdjsKKwl1aW8udWlvX3NlZ2ZsZyA9IFVJT19TWVNTUEFDRTsKKwljdXJyX29mZnNldCA9IGZpbHAtPmZfcG9zOworCWlmIChmaWxwLT5mX3BvcyAhPSAweDdmZmZmZmZmKQorCQl1aW8udWlvX29mZnNldCA9IGZpbHAtPmZfcG9zOworCWVsc2UKKwkJdWlvLnVpb19vZmZzZXQgPSAweGZmZmZmZmZmOworCisJd2hpbGUgKCFlb2YpIHsKKwkJdWlvLnVpb19yZXNpZCA9IGlvdi5pb3ZfbGVuID0gcmxlbjsKKwkJaW92Lmlvdl9iYXNlID0gcmVhZF9idWY7CisJCXVpby51aW9faW92Y250ID0gMTsKKworCQlzdGFydF9vZmZzZXQgPSB1aW8udWlvX29mZnNldDsKKworCQlWT1BfUkVBRERJUih2cCwgJnVpbywgTlVMTCwgJmVvZiwgZXJyb3IpOworCQlpZiAoKHVpby51aW9fb2Zmc2V0ID09IHN0YXJ0X29mZnNldCkgfHwgZXJyb3IpIHsKKwkJCXNpemUgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlzaXplID0gcmxlbiAtIHVpby51aW9fcmVzaWQ7CisJCWRicCA9ICh4ZnNfZGlyZW50X3QgKilyZWFkX2J1ZjsKKwkJd2hpbGUgKHNpemUgPiAwKSB7CisJCQluYW1lbGVuID0gc3RybGVuKGRicC0+ZF9uYW1lKTsKKworCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBkYnAtPmRfbmFtZSwgbmFtZWxlbiwKKwkJCQkJKGxvZmZfdCkgY3Vycl9vZmZzZXQgJiAweDdmZmZmZmZmLAorCQkJCQkoaW5vX3QpIGRicC0+ZF9pbm8sCisJCQkJCURUX1VOS05PV04pKSB7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJc2l6ZSAtPSBkYnAtPmRfcmVjbGVuOworCQkJY3Vycl9vZmZzZXQgPSAobG9mZl90KWRicC0+ZF9vZmYgLyogJiAweDdmZmZmZmZmICovOworCQkJZGJwID0gbmV4dGRwKGRicCk7CisJCX0KKwl9Citkb25lOgorCWlmICghZXJyb3IpIHsKKwkJaWYgKHNpemUgPT0gMCkKKwkJCWZpbHAtPmZfcG9zID0gdWlvLnVpb19vZmZzZXQgJiAweDdmZmZmZmZmOworCQllbHNlIGlmIChkYnApCisJCQlmaWxwLT5mX3BvcyA9IGN1cnJfb2Zmc2V0OworCX0KKworCWtmcmVlKHJlYWRfYnVmKTsKKwlyZXR1cm4gLWVycm9yOworfQorCisKK1NUQVRJQyBpbnQKK2xpbnZmc19maWxlX21tYXAoCisJc3RydWN0IGZpbGUJKmZpbHAsCisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGlub2RlCSppcCA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXZub2RlX3QJCSp2cCA9IExJTlZGU19HRVRfVlAoaXApOworCXZhdHRyX3QJCXZhID0geyAudmFfbWFzayA9IFhGU19BVF9VUERBVElNRSB9OworCWludAkJZXJyb3I7CisKKwlpZiAodnAtPnZfdmZzcC0+dmZzX2ZsYWcgJiBWRlNfRE1JKSB7CisJCXhmc19tb3VudF90CSptcCA9IFhGU19WRlNUT00odnAtPnZfdmZzcCk7CisKKwkJZXJyb3IgPSAtWEZTX1NFTkRfTU1BUChtcCwgdm1hLCAwKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCX0KKworCXZtYS0+dm1fb3BzID0gJmxpbnZmc19maWxlX3ZtX29wczsKKworCVZPUF9TRVRBVFRSKHZwLCAmdmEsIFhGU19BVF9VUERBVElNRSwgTlVMTCwgZXJyb3IpOworCWlmICghZXJyb3IpCisJCXZuX3JldmFsaWRhdGUodnApOwkvKiB1cGRhdGUgTGludXggaW5vZGUgZmxhZ3MgKi8KKwlyZXR1cm4gMDsKK30KKworCitTVEFUSUMgbG9uZworbGludmZzX2lvY3RsKAorCXN0cnVjdCBmaWxlCSpmaWxwLAorCXVuc2lnbmVkIGludAljbWQsCisJdW5zaWduZWQgbG9uZwlhcmcpCit7CisJaW50CQllcnJvcjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJdm5vZGVfdAkJKnZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CisKKwlWT1BfSU9DVEwodnAsIGlub2RlLCBmaWxwLCAwLCBjbWQsICh2b2lkIF9fdXNlciAqKWFyZywgZXJyb3IpOworCVZNT0RJRlkodnApOworCisJLyogTk9URTogIHNvbWUgb2YgdGhlIGlvY3RsJ3MgcmV0dXJuIHBvc2l0aXZlICMncyBhcyBhCisJICoJICBieXRlIGNvdW50IGluZGljYXRpbmcgc3VjY2Vzcywgc3VjaCBhcworCSAqCSAgcmVhZGxpbmtfYnlfaGFuZGxlLiAgU28gd2UgZG9uJ3QgInNpZ24gZmxpcCIKKwkgKgkgIGxpa2UgbW9zdCBvdGhlciByb3V0aW5lcy4gIFRoaXMgbWVhbnMgdHJ1ZQorCSAqCSAgZXJyb3JzIG5lZWQgdG8gYmUgcmV0dXJuZWQgYXMgYSBuZWdhdGl2ZSB2YWx1ZS4KKwkgKi8KKwlyZXR1cm4gZXJyb3I7Cit9CisKK1NUQVRJQyBsb25nCitsaW52ZnNfaW9jdGxfaW52aXMoCisJc3RydWN0IGZpbGUJKmZpbHAsCisJdW5zaWduZWQgaW50CWNtZCwKKwl1bnNpZ25lZCBsb25nCWFyZykKK3sKKwlpbnQJCWVycm9yOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwl2bm9kZV90CQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKworCUFTU0VSVCh2cCk7CisJVk9QX0lPQ1RMKHZwLCBpbm9kZSwgZmlscCwgSU9fSU5WSVMsIGNtZCwgKHZvaWQgX191c2VyICopYXJnLCBlcnJvcik7CisJVk1PRElGWSh2cCk7CisKKwkvKiBOT1RFOiAgc29tZSBvZiB0aGUgaW9jdGwncyByZXR1cm4gcG9zaXRpdmUgIydzIGFzIGEKKwkgKgkgIGJ5dGUgY291bnQgaW5kaWNhdGluZyBzdWNjZXNzLCBzdWNoIGFzCisJICoJICByZWFkbGlua19ieV9oYW5kbGUuICBTbyB3ZSBkb24ndCAic2lnbiBmbGlwIgorCSAqCSAgbGlrZSBtb3N0IG90aGVyIHJvdXRpbmVzLiAgVGhpcyBtZWFucyB0cnVlCisJICoJICBlcnJvcnMgbmVlZCB0byBiZSByZXR1cm5lZCBhcyBhIG5lZ2F0aXZlIHZhbHVlLgorCSAqLworCXJldHVybiBlcnJvcjsKK30KKworI2lmZGVmIEhBVkVfVk1PUF9NUFJPVEVDVAorU1RBVElDIGludAorbGludmZzX21wcm90ZWN0KAorCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCXVuc2lnbmVkIGludAluZXdmbGFncykKK3sKKwl2bm9kZV90CQkqdnAgPSBMSU5WRlNfR0VUX1ZQKHZtYS0+dm1fZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWludAkJZXJyb3IgPSAwOworCisJaWYgKHZwLT52X3Zmc3AtPnZmc19mbGFnICYgVkZTX0RNSSkgeworCQlpZiAoKHZtYS0+dm1fZmxhZ3MgJiBWTV9NQVlTSEFSRSkgJiYKKwkJICAgIChuZXdmbGFncyAmIFZNX1dSSVRFKSAmJiAhKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpIHsKKwkJCXhmc19tb3VudF90CSptcCA9IFhGU19WRlNUT00odnAtPnZfdmZzcCk7CisKKwkJCWVycm9yID0gWEZTX1NFTkRfTU1BUChtcCwgdm1hLCBWTV9XUklURSk7CisJCSAgICB9CisJfQorCXJldHVybiBlcnJvcjsKK30KKyNlbmRpZiAvKiBIQVZFX1ZNT1BfTVBST1RFQ1QgKi8KKworI2lmZGVmIEhBVkVfRk9QX09QRU5fRVhFQworLyogSWYgdGhlIHVzZXIgaXMgYXR0ZW1wdGluZyB0byBleGVjdXRlIGEgZmlsZSB0aGF0IGlzIG9mZmxpbmUgdGhlbgorICogd2UgaGF2ZSB0byB0cmlnZ2VyIGEgRE1BUEkgUkVBRCBldmVudCBiZWZvcmUgdGhlIGZpbGUgaXMgbWFya2VkIGFzIGJ1c3kKKyAqIG90aGVyd2lzZSB0aGUgaW52aXNpYmxlIEkvTyB3aWxsIG5vdCBiZSBhYmxlIHRvIHdyaXRlIHRvIHRoZSBmaWxlIHRvIGJyaW5nCisgKiBpdCBiYWNrIG9ubGluZS4KKyAqLworU1RBVElDIGludAorbGludmZzX29wZW5fZXhlYygKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlKQoreworCXZub2RlX3QJCSp2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOworCXhmc19tb3VudF90CSptcCA9IFhGU19WRlNUT00odnAtPnZfdmZzcCk7CisJaW50CQllcnJvciA9IDA7CisJYmh2X2Rlc2NfdAkqYmRwOworCXhmc19pbm9kZV90CSppcDsKKworCWlmICh2cC0+dl92ZnNwLT52ZnNfZmxhZyAmIFZGU19ETUkpIHsKKwkJYmRwID0gdm5fYmh2X2xvb2t1cChWTl9CSFZfSEVBRCh2cCksICZ4ZnNfdm5vZGVvcHMpOworCQlpZiAoIWJkcCkgeworCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJZ290byBvcGVuX2V4ZWNfb3V0OworCQl9CisJCWlwID0gWEZTX0JIVlRPSShiZHApOworCQlpZiAoRE1fRVZFTlRfRU5BQkxFRCh2cC0+dl92ZnNwLCBpcCwgRE1fRVZFTlRfUkVBRCkpIHsKKwkJCWVycm9yID0gLVhGU19TRU5EX0RBVEEobXAsIERNX0VWRU5UX1JFQUQsIHZwLAorCQkJCQkgICAgICAgMCwgMCwgMCwgTlVMTCk7CisJCX0KKwl9CitvcGVuX2V4ZWNfb3V0OgorCXJldHVybiBlcnJvcjsKK30KKyNlbmRpZiAvKiBIQVZFX0ZPUF9PUEVOX0VYRUMgKi8KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsaW52ZnNfZmlsZV9vcGVyYXRpb25zID0geworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkucmVhZAkJPSBkb19zeW5jX3JlYWQsCisJLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCisJLnJlYWR2CQk9IGxpbnZmc19yZWFkdiwKKwkud3JpdGV2CQk9IGxpbnZmc193cml0ZXYsCisJLmFpb19yZWFkCT0gbGludmZzX2Fpb19yZWFkLAorCS5haW9fd3JpdGUJPSBsaW52ZnNfYWlvX3dyaXRlLAorCS5zZW5kZmlsZQk9IGxpbnZmc19zZW5kZmlsZSwKKwkudW5sb2NrZWRfaW9jdGwJPSBsaW52ZnNfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwgICA9IHhmc19jb21wYXRfaW9jdGwsCisjZW5kaWYKKwkubW1hcAkJPSBsaW52ZnNfZmlsZV9tbWFwLAorCS5vcGVuCQk9IGxpbnZmc19vcGVuLAorCS5yZWxlYXNlCT0gbGludmZzX3JlbGVhc2UsCisJLmZzeW5jCQk9IGxpbnZmc19mc3luYywKKyNpZmRlZiBIQVZFX0ZPUF9PUEVOX0VYRUMKKwkub3Blbl9leGVjCT0gbGludmZzX29wZW5fZXhlYywKKyNlbmRpZgorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsaW52ZnNfaW52aXNfZmlsZV9vcGVyYXRpb25zID0geworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkucmVhZAkJPSBkb19zeW5jX3JlYWQsCisJLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCisJLnJlYWR2CQk9IGxpbnZmc19yZWFkdl9pbnZpcywKKwkud3JpdGV2CQk9IGxpbnZmc193cml0ZXZfaW52aXMsCisJLmFpb19yZWFkCT0gbGludmZzX2Fpb19yZWFkX2ludmlzLAorCS5haW9fd3JpdGUJPSBsaW52ZnNfYWlvX3dyaXRlX2ludmlzLAorCS5zZW5kZmlsZQk9IGxpbnZmc19zZW5kZmlsZSwKKwkudW5sb2NrZWRfaW9jdGwJPSBsaW52ZnNfaW9jdGxfaW52aXMsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwgICA9IHhmc19jb21wYXRfaW52aXNfaW9jdGwsCisjZW5kaWYKKwkubW1hcAkJPSBsaW52ZnNfZmlsZV9tbWFwLAorCS5vcGVuCQk9IGxpbnZmc19vcGVuLAorCS5yZWxlYXNlCT0gbGludmZzX3JlbGVhc2UsCisJLmZzeW5jCQk9IGxpbnZmc19mc3luYywKK307CisKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsaW52ZnNfZGlyX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IGxpbnZmc19yZWFkZGlyLAorCS51bmxvY2tlZF9pb2N0bAk9IGxpbnZmc19pb2N0bCwKKwkuZnN5bmMJCT0gbGludmZzX2ZzeW5jLAorfTsKKworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBsaW52ZnNfZmlsZV92bV9vcHMgPSB7CisJLm5vcGFnZQkJPSBmaWxlbWFwX25vcGFnZSwKKwkucG9wdWxhdGUJPSBmaWxlbWFwX3BvcHVsYXRlLAorI2lmZGVmIEhBVkVfVk1PUF9NUFJPVEVDVAorCS5tcHJvdGVjdAk9IGxpbnZmc19tcHJvdGVjdCwKKyNlbmRpZgorfTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZzX3N1YnIuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZzX3N1YnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWViZDMwCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZnNfc3Vici5jCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKy8qCisgKiBTdHViIGZvciBuby1vcCB2bm9kZSBvcGVyYXRpb25zIHRoYXQgcmV0dXJuIGVycm9yIHN0YXR1cy4KKyAqLworaW50Citmc19ub2Vycih2b2lkKQoreworCXJldHVybiAwOworfQorCisvKgorICogT3BlcmF0aW9uIHVuc3VwcG9ydGVkIHVuZGVyIHRoaXMgZmlsZSBzeXN0ZW0uCisgKi8KK2ludAorZnNfbm9zeXModm9pZCkKK3sKKwlyZXR1cm4gRU5PU1lTOworfQorCisvKgorICogU3R1YiBmb3IgaW5hY3RpdmUsIHN0cmF0ZWd5LCBhbmQgcmVhZC93cml0ZSBsb2NrL3VubG9jay4gIERvZXMgbm90aGluZy4KKyAqLworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK2ZzX25vdmFsKHZvaWQpCit7Cit9CisKKy8qCisgKiB2bm9kZSBwY2FjaGUgbGF5ZXIgZm9yIHZub2RlX3Rvc3NwYWdlcy4KKyAqICdsYXN0JyBwYXJhbWV0ZXIgdW51c2VkIGJ1dCBsZWZ0IGluIGZvciBJUklYIGNvbXBhdGliaWxpdHkKKyAqLwordm9pZAorZnNfdG9zc3BhZ2VzKAorCWJodl9kZXNjX3QJKmJkcCwKKwl4ZnNfb2ZmX3QJZmlyc3QsCisJeGZzX29mZl90CWxhc3QsCisJaW50CQlmaW9wdCkKK3sKKwl2bm9kZV90CQkqdnAgPSBCSFZfVE9fVk5PREUoYmRwKTsKKwlzdHJ1Y3QgaW5vZGUJKmlwID0gTElOVkZTX0dFVF9JUCh2cCk7CisKKwlpZiAoVk5fQ0FDSEVEKHZwKSkKKwkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaXAtPmlfbWFwcGluZywgZmlyc3QpOworfQorCisKKy8qCisgKiB2bm9kZSBwY2FjaGUgbGF5ZXIgZm9yIHZub2RlX2ZsdXNoaW52YWxfcGFnZXMuCisgKiAnbGFzdCcgcGFyYW1ldGVyIHVudXNlZCBidXQgbGVmdCBpbiBmb3IgSVJJWCBjb21wYXRpYmlsaXR5CisgKi8KK3ZvaWQKK2ZzX2ZsdXNoaW52YWxfcGFnZXMoCisJYmh2X2Rlc2NfdAkqYmRwLAorCXhmc19vZmZfdAlmaXJzdCwKKwl4ZnNfb2ZmX3QJbGFzdCwKKwlpbnQJCWZpb3B0KQoreworCXZub2RlX3QJCSp2cCA9IEJIVl9UT19WTk9ERShiZHApOworCXN0cnVjdCBpbm9kZQkqaXAgPSBMSU5WRlNfR0VUX0lQKHZwKTsKKworCWlmIChWTl9DQUNIRUQodnApKSB7CisJCWZpbGVtYXBfZmRhdGF3cml0ZShpcC0+aV9tYXBwaW5nKTsKKwkJZmlsZW1hcF9mZGF0YXdhaXQoaXAtPmlfbWFwcGluZyk7CisKKwkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaXAtPmlfbWFwcGluZywgZmlyc3QpOworCX0KK30KKworLyoKKyAqIHZub2RlIHBjYWNoZSBsYXllciBmb3Igdm5vZGVfZmx1c2hfcGFnZXMuCisgKiAnbGFzdCcgcGFyYW1ldGVyIHVudXNlZCBidXQgbGVmdCBpbiBmb3IgSVJJWCBjb21wYXRpYmlsaXR5CisgKi8KK2ludAorZnNfZmx1c2hfcGFnZXMoCisJYmh2X2Rlc2NfdAkqYmRwLAorCXhmc19vZmZfdAlmaXJzdCwKKwl4ZnNfb2ZmX3QJbGFzdCwKKwl1aW50NjRfdAlmbGFncywKKwlpbnQJCWZpb3B0KQoreworCXZub2RlX3QJCSp2cCA9IEJIVl9UT19WTk9ERShiZHApOworCXN0cnVjdCBpbm9kZQkqaXAgPSBMSU5WRlNfR0VUX0lQKHZwKTsKKworCWlmIChWTl9DQUNIRUQodnApKSB7CisJCWZpbGVtYXBfZmRhdGF3cml0ZShpcC0+aV9tYXBwaW5nKTsKKwkJZmlsZW1hcF9mZGF0YXdhaXQoaXAtPmlfbWFwcGluZyk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19mc19zdWJyLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19mc19zdWJyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRiOWRkYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZzX3N1YnIuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYJX19YRlNfU1VCUl9IX18KKyNkZWZpbmUgX19YRlNfU1VCUl9IX18KKworLyoKKyAqIFV0aWxpdGllcyBzaGFyZWQgYW1vbmcgZmlsZSBzeXN0ZW0gaW1wbGVtZW50YXRpb25zLgorICovCisKK3N0cnVjdCBjcmVkOworCitleHRlcm4gaW50CWZzX25vZXJyKHZvaWQpOworZXh0ZXJuIGludAlmc19ub3N5cyh2b2lkKTsKK2V4dGVybiB2b2lkCWZzX25vdmFsKHZvaWQpOworZXh0ZXJuIHZvaWQJZnNfdG9zc3BhZ2VzKGJodl9kZXNjX3QgKiwgeGZzX29mZl90LCB4ZnNfb2ZmX3QsIGludCk7CitleHRlcm4gdm9pZAlmc19mbHVzaGludmFsX3BhZ2VzKGJodl9kZXNjX3QgKiwgeGZzX29mZl90LCB4ZnNfb2ZmX3QsIGludCk7CitleHRlcm4gaW50CWZzX2ZsdXNoX3BhZ2VzKGJodl9kZXNjX3QgKiwgeGZzX29mZl90LCB4ZnNfb2ZmX3QsIHVpbnQ2NF90LCBpbnQpOworCisjZW5kaWYJLyogX19YRlNfRlNfU1VCUl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2dsb2JhbHMuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2dsb2JhbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmRhNWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZ2xvYmFscy5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZ2xvYmFscyBuZWVkZWQgYnkgWEZTIHRoYXQgd2VyZSBub3JtYWxseSBkZWZpbmVkCisgKiBzb21ld2hlcmUgZWxzZSBpbiBJUklYLgorICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfY3JlZC5oIgorI2luY2x1ZGUgInhmc19zeXNjdGwuaCIKKworLyoKKyAqIFN5c3RlbSBtZW1vcnkgc2l6ZSAtIHVzZWQgdG8gc2NhbGUgY2VydGFpbiBkYXRhIHN0cnVjdHVyZXMgaW4gWEZTLgorICovCit1bnNpZ25lZCBsb25nIHhmc19waHlzbWVtOworCisvKgorICogVHVuYWJsZSBYRlMgcGFyYW1ldGVycy4gIHhmc19wYXJhbXMgaXMgcmVxdWlyZWQgZXZlbiB3aGVuIENPTkZJR19TWVNDVEw9biwKKyAqIG90aGVyIFhGUyBjb2RlIHVzZXMgdGhlc2UgdmFsdWVzLiAgVGltZXMgYXJlIG1lYXN1cmVkIGluIGNlbnRpc2VjcyAoaS5lLgorICogMTAwdGhzIG9mIGEgc2Vjb25kKS4KKyAqLworeGZzX3BhcmFtX3QgeGZzX3BhcmFtcyA9IHsKKwkJCSAgLyoJTUlOCQlERkxUCQlNQVgJKi8KKwkucmVzdHJpY3RfY2hvd24JPSB7CTAsCQkxLAkJMQl9LAorCS5zZ2lkX2luaGVyaXQJPSB7CTAsCQkwLAkJMQl9LAorCS5zeW1saW5rX21vZGUJPSB7CTAsCQkwLAkJMQl9LAorCS5wYW5pY19tYXNrCT0gewkwLAkJMCwJCTEyNwl9LAorCS5lcnJvcl9sZXZlbAk9IHsJMCwJCTMsCQkxMQl9LAorCS5zeW5jZF90aW1lcgk9IHsJMSoxMDAsCQkzMCoxMDAsCQk3MjAwKjEwMH0sCisJLnN0YXRzX2NsZWFyCT0gewkwLAkJMCwJCTEJfSwKKwkuaW5oZXJpdF9zeW5jCT0gewkwLAkJMSwJCTEJfSwKKwkuaW5oZXJpdF9ub2R1bXAJPSB7CTAsCQkxLAkJMQl9LAorCS5pbmhlcml0X25vYXRpbSA9IHsJMCwJCTEsCQkxCX0sCisJLnhmc19idWZfdGltZXIJPSB7CTEwMC8yLAkJMSoxMDAsCQkzMCoxMDAJfSwKKwkueGZzX2J1Zl9hZ2UJPSB7CTEqMTAwLAkJMTUqMTAwLAkJNzIwMCoxMDB9LAorCS5pbmhlcml0X25vc3ltCT0gewkwLAkJMCwJCTEJfSwKKwkucm90b3JzdGVwCT0gewkxLAkJMSwJCTI1NQl9LAorfTsKKworLyoKKyAqIEdsb2JhbCBzeXN0ZW0gY3JlZGVudGlhbCBzdHJ1Y3R1cmUuCisgKi8KK2NyZWRfdCBzeXNfY3JlZF92YWwsICpzeXNfY3JlZCA9ICZzeXNfY3JlZF92YWw7CisKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2dsb2JhbHMuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2dsb2JhbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODFlMmYzCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZ2xvYmFscy5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0dMT0JBTFNfSF9fCisjZGVmaW5lIF9fWEZTX0dMT0JBTFNfSF9fCisKKy8qCisgKiBUaGlzIGZpbGUgZGVjbGFyZXMgZ2xvYmFscyBuZWVkZWQgYnkgWEZTIHRoYXQgd2VyZSBub3JtYWxseSBkZWZpbmVkCisgKiBzb21ld2hlcmUgZWxzZSBpbiBJUklYLgorICovCisKK2V4dGVybiB1aW50NjRfdAl4ZnNfcGFuaWNfbWFzazsJCS8qIHNldCB0byBjYXVzZSBtb3JlIHBhbmljcyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgeGZzX3BoeXNtZW07CitleHRlcm4gc3RydWN0IGNyZWQgKnN5c19jcmVkOworCisjZW5kaWYJLyogX19YRlNfR0xPQkFMU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ODA5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bC5jCkBAIC0wLDAgKzEsMTMzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorCisjaW5jbHVkZSAieGZzX2ZzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgInhmc19hY2wuaCIKKyNpbmNsdWRlICJ4ZnNfY2FwLmgiCisjaW5jbHVkZSAieGZzX21hYy5oIgorI2luY2x1ZGUgInhmc19hdHRyLmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCisjaW5jbHVkZSAieGZzX3V0aWxzLmgiCisjaW5jbHVkZSAieGZzX2RmcmFnLmgiCisjaW5jbHVkZSAieGZzX2Zzb3BzLmgiCisKKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorCisvKgorICogeGZzX2ZpbmRfaGFuZGxlIG1hcHMgZnJvbSB1c2Vyc3BhY2UgeGZzX2Zzb3BfaGFuZGxlcmVxIHN0cnVjdHVyZSB0bworICogYSBmaWxlIG9yIGZzIGhhbmRsZS4KKyAqCisgKiBYRlNfSU9DX1BBVEhfVE9fRlNIQU5ETEUKKyAqICAgIHJldHVybnMgZnMgaGFuZGxlIGZvciBhIG1vdW50IHBvaW50IG9yIHBhdGggd2l0aGluIHRoYXQgbW91bnQgcG9pbnQKKyAqIFhGU19JT0NfRkRfVE9fSEFORExFCisgKiAgICByZXR1cm5zIGZ1bGwgaGFuZGxlIGZvciBhIEZEIG9wZW5lZCBpbiB1c2VyIHNwYWNlCisgKiBYRlNfSU9DX1BBVEhfVE9fSEFORExFCisgKiAgICByZXR1cm5zIGZ1bGwgaGFuZGxlIGZvciBhIHBhdGgKKyAqLworU1RBVElDIGludAoreGZzX2ZpbmRfaGFuZGxlKAorCXVuc2lnbmVkIGludAkJY21kLAorCXZvaWQJCQlfX3VzZXIgKmFyZykKK3sKKwlpbnQJCQloc2l6ZTsKKwl4ZnNfaGFuZGxlX3QJCWhhbmRsZTsKKwl4ZnNfZnNvcF9oYW5kbGVyZXFfdAlocmVxOworCXN0cnVjdCBpbm9kZQkJKmlub2RlOworCXN0cnVjdCB2bm9kZQkJKnZwOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZocmVxLCBhcmcsIHNpemVvZihocmVxKSkpCisJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisKKwltZW1zZXQoKGNoYXIgKikmaGFuZGxlLCAwLCBzaXplb2YoaGFuZGxlKSk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgWEZTX0lPQ19QQVRIX1RPX0ZTSEFORExFOgorCWNhc2UgWEZTX0lPQ19QQVRIX1RPX0hBTkRMRTogeworCQlzdHJ1Y3QgbmFtZWlkYXRhCW5kOworCQlpbnQJCQllcnJvcjsKKworCQllcnJvciA9IHVzZXJfcGF0aF93YWxrX2xpbmsoKGNvbnN0IGNoYXIgX191c2VyICopaHJlcS5wYXRoLCAmbmQpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisKKwkJQVNTRVJUKG5kLmRlbnRyeSk7CisJCUFTU0VSVChuZC5kZW50cnktPmRfaW5vZGUpOworCQlpbm9kZSA9IGlncmFiKG5kLmRlbnRyeS0+ZF9pbm9kZSk7CisJCXBhdGhfcmVsZWFzZSgmbmQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFhGU19JT0NfRkRfVE9fSEFORExFOiB7CisJCXN0cnVjdCBmaWxlCSpmaWxlOworCisJCWZpbGUgPSBmZ2V0KGhyZXEuZmQpOworCQlpZiAoIWZpbGUpCisJCSAgICByZXR1cm4gLUVCQURGOworCisJCUFTU0VSVChmaWxlLT5mX2RlbnRyeSk7CisJCUFTU0VSVChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJCWlub2RlID0gaWdyYWIoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCQlmcHV0KGZpbGUpOworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJCXJldHVybiAtWEZTX0VSUk9SKEVJTlZBTCk7CisJfQorCisJaWYgKGlub2RlLT5pX3NiLT5zX21hZ2ljICE9IFhGU19TQl9NQUdJQykgeworCQkvKiB3ZSdyZSBub3QgaW4gWEZTIGFueW1vcmUsIFRvdG8gKi8KKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiAtWEZTX0VSUk9SKEVJTlZBTCk7CisJfQorCisJLyogd2UgbmVlZCB0aGUgdm5vZGUgKi8KKwl2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOworCWlmICh2cC0+dl90eXBlICE9IFZSRUcgJiYgdnAtPnZfdHlwZSAhPSBWRElSICYmIHZwLT52X3R5cGUgIT0gVkxOSykgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUJBREYpOworCX0KKworCS8qIG5vdyB3ZSBjYW4gZ3JhYiB0aGUgZnNpZCAqLworCW1lbWNweSgmaGFuZGxlLmhhX2ZzaWQsIHZwLT52X3Zmc3AtPnZmc19hbHRmc2lkLCBzaXplb2YoeGZzX2ZzaWRfdCkpOworCWhzaXplID0gc2l6ZW9mKHhmc19mc2lkX3QpOworCisJaWYgKGNtZCAhPSBYRlNfSU9DX1BBVEhfVE9fRlNIQU5ETEUpIHsKKwkJeGZzX2lub2RlX3QJKmlwOworCQliaHZfZGVzY190CSpiaHY7CisJCWludAkJbG9ja19tb2RlOworCisJCS8qIG5lZWQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgeGZzX2lub2RlIHRvIHJlYWQgdGhlIGdlbmVyYXRpb24gKi8KKwkJYmh2ID0gdm5fYmh2X2xvb2t1cF91bmxvY2tlZChWTl9CSFZfSEVBRCh2cCksICZ4ZnNfdm5vZGVvcHMpOworCQlBU1NFUlQoYmh2KTsKKwkJaXAgPSBYRlNfQkhWVE9JKGJodik7CisJCUFTU0VSVChpcCk7CisJCWxvY2tfbW9kZSA9IHhmc19pbG9ja19tYXBfc2hhcmVkKGlwKTsKKworCQkvKiBmaWxsIGluIGZpZCBzZWN0aW9uIG9mIGhhbmRsZSBmcm9tIGlub2RlICovCisJCWhhbmRsZS5oYV9maWQueGZzX2ZpZF9sZW4gPSBzaXplb2YoeGZzX2ZpZF90KSAtCisJCQkJCSAgICBzaXplb2YoaGFuZGxlLmhhX2ZpZC54ZnNfZmlkX2xlbik7CisJCWhhbmRsZS5oYV9maWQueGZzX2ZpZF9wYWQgPSAwOworCQloYW5kbGUuaGFfZmlkLnhmc19maWRfZ2VuID0gaXAtPmlfZC5kaV9nZW47CisJCWhhbmRsZS5oYV9maWQueGZzX2ZpZF9pbm8gPSBpcC0+aV9pbm87CisKKwkJeGZzX2l1bmxvY2tfbWFwX3NoYXJlZChpcCwgbG9ja19tb2RlKTsKKworCQloc2l6ZSA9IFhGU19IU0laRShoYW5kbGUpOworCX0KKworCS8qIG5vdyBjb3B5IG91ciBoYW5kbGUgaW50byB0aGUgdXNlciBidWZmZXIgJiB3cml0ZSBvdXQgdGhlIHNpemUgKi8KKwlpZiAoY29weV90b191c2VyKGhyZXEub2hhbmRsZSwgJmhhbmRsZSwgaHNpemUpIHx8CisJICAgIGNvcHlfdG9fdXNlcihocmVxLm9oYW5kbGVuLCAmaHNpemUsIHNpemVvZihfX3MzMikpKSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCX0KKworCWlwdXQoaW5vZGUpOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBDb252ZXJ0IHVzZXJzcGFjZSBoYW5kbGUgZGF0YSBpbnRvIHZub2RlIChhbmQgaW5vZGUpLgorICogV2UgW2FiXXVzZSB0aGUgZmFjdCB0aGF0IGFsbCB0aGUgZnNvcF9oYW5kbGVyZXEgaW9jdGwgY2FsbHMKKyAqIGhhdmUgYSBkYXRhIHN0cnVjdHVyZSBhcmd1bWVudCB3aG9zZSBmaXJzdCBjb21wb25lbnQgaXMgYWx3YXlzCisgKiBhIHhmc19mc29wX2hhbmRsZXJlcV90LCBzbyB3ZSBjYW4gY2FzdCB0byBhbmQgZnJvbSB0aGlzIHR5cGUuCisgKiBUaGlzIGFsbG93cyB1cyB0byBvcHRpbWlzZSB0aGUgY29weV9mcm9tX3VzZXIgY2FsbHMgYW5kIGdpdmVzCisgKiBhIGhhbmR5LCBzaGFyZWQgcm91dGluZS4KKyAqCisgKiBJZiBubyBlcnJvciwgY2FsbGVyIG11c3QgYWx3YXlzIFZOX1JFTEUgdGhlIHJldHVybmVkIHZwLgorICovCitTVEFUSUMgaW50Cit4ZnNfdmdldF9mc29wX2hhbmRsZXJlcSgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXN0cnVjdCBpbm9kZQkJKnBhcmlub2RlLAkvKiBwYXJlbnQgaW5vZGUgcG9pbnRlciAgICAqLworCXhmc19mc29wX2hhbmRsZXJlcV90CSpocmVxLAorCXZub2RlX3QJCQkqKnZwLAorCXN0cnVjdCBpbm9kZQkJKippbm9kZSkKK3sKKwl2b2lkCQkJX191c2VyICpoYW5wOworCXNpemVfdAkJCWhsZW47CisJeGZzX2ZpZF90CQkqeGZpZDsKKwl4ZnNfaGFuZGxlX3QJCSpoYW5kbGVwOworCXhmc19oYW5kbGVfdAkJaGFuZGxlOworCXhmc19pbm9kZV90CQkqaXA7CisJc3RydWN0IGlub2RlCQkqaW5vZGVwOworCXZub2RlX3QJCQkqdnBwOworCXhmc19pbm9fdAkJaW5vOworCV9fdTMyCQkJaWdlbjsKKwlpbnQJCQllcnJvcjsKKworCS8qCisJICogT25seSBhbGxvdyBoYW5kbGUgb3BlbnMgdW5kZXIgYSBkaXJlY3RvcnkuCisJICovCisJaWYgKCFTX0lTRElSKHBhcmlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVOT1RESVIpOworCisJaGFucCA9IGhyZXEtPmloYW5kbGU7CisJaGxlbiA9IGhyZXEtPmloYW5kbGVuOworCWhhbmRsZXAgPSAmaGFuZGxlOworCisJaWYgKGhsZW4gPCBzaXplb2YoaGFuZGxlcC0+aGFfZnNpZCkgfHwgaGxlbiA+IHNpemVvZigqaGFuZGxlcCkpCisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoaGFuZGxlcCwgaGFucCwgaGxlbikpCisJCXJldHVybiBYRlNfRVJST1IoRUZBVUxUKTsKKwlpZiAoaGxlbiA8IHNpemVvZigqaGFuZGxlcCkpCisJCW1lbXNldCgoKGNoYXIgKiloYW5kbGVwKSArIGhsZW4sIDAsIHNpemVvZigqaGFuZGxlcCkgLSBobGVuKTsKKwlpZiAoaGxlbiA+IHNpemVvZihoYW5kbGVwLT5oYV9mc2lkKSkgeworCQlpZiAoaGFuZGxlcC0+aGFfZmlkLnhmc19maWRfbGVuICE9CisJCQkJKGhsZW4gLSBzaXplb2YoaGFuZGxlcC0+aGFfZnNpZCkKKwkJCQkJLSBzaXplb2YoaGFuZGxlcC0+aGFfZmlkLnhmc19maWRfbGVuKSkKKwkJICAgIHx8IGhhbmRsZXAtPmhhX2ZpZC54ZnNfZmlkX3BhZCkKKwkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwl9CisKKwkvKgorCSAqIENyYWNrIHRoZSBoYW5kbGUsIG9idGFpbiB0aGUgaW5vZGUgIyAmIGdlbmVyYXRpb24gIworCSAqLworCXhmaWQgPSAoc3RydWN0IHhmc19maWQgKikmaGFuZGxlcC0+aGFfZmlkOworCWlmICh4ZmlkLT54ZnNfZmlkX2xlbiA9PSBzaXplb2YoKnhmaWQpIC0gc2l6ZW9mKHhmaWQtPnhmc19maWRfbGVuKSkgeworCQlpbm8gID0geGZpZC0+eGZzX2ZpZF9pbm87CisJCWlnZW4gPSB4ZmlkLT54ZnNfZmlkX2dlbjsKKwl9IGVsc2UgeworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIFhGUyBpbm9kZSwgYnVpbGRpbmcgYSB2bm9kZSB0byBnbyB3aXRoIGl0LgorCSAqLworCWVycm9yID0geGZzX2lnZXQobXAsIE5VTEwsIGlubywgMCwgWEZTX0lMT0NLX1NIQVJFRCwgJmlwLCAwKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlpZiAoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCWlmIChpcC0+aV9kLmRpX21vZGUgPT0gMCB8fCBpcC0+aV9kLmRpX2dlbiAhPSBpZ2VuKSB7CisJCXhmc19pcHV0X25ldyhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJCXJldHVybiBYRlNfRVJST1IoRU5PRU5UKTsKKwl9CisKKwl2cHAgPSBYRlNfSVRPVihpcCk7CisJaW5vZGVwID0gTElOVkZTX0dFVF9JUCh2cHApOworCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKworCSp2cCA9IHZwcDsKKwkqaW5vZGUgPSBpbm9kZXA7CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19vcGVuX2J5X2hhbmRsZSgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXZvaWQJCQlfX3VzZXIgKmFyZywKKwlzdHJ1Y3QgZmlsZQkJKnBhcmZpbHAsCisJc3RydWN0IGlub2RlCQkqcGFyaW5vZGUpCit7CisJaW50CQkJZXJyb3I7CisJaW50CQkJbmV3X2ZkOworCWludAkJCXBlcm1mbGFnOworCXN0cnVjdCBmaWxlCQkqZmlscDsKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5CQkqZGVudHJ5OworCXZub2RlX3QJCQkqdnA7CisJeGZzX2Zzb3BfaGFuZGxlcmVxX3QJaHJlcTsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRVBFUk0pOworCWlmIChjb3B5X2Zyb21fdXNlcigmaHJlcSwgYXJnLCBzaXplb2YoeGZzX2Zzb3BfaGFuZGxlcmVxX3QpKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKworCWVycm9yID0geGZzX3ZnZXRfZnNvcF9oYW5kbGVyZXEobXAsIHBhcmlub2RlLCAmaHJlcSwgJnZwLCAmaW5vZGUpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIC1lcnJvcjsKKworCS8qIFJlc3RyaWN0IHhmc19vcGVuX2J5X2hhbmRsZSB0byBkaXJlY3RvcmllcyAmIHJlZ3VsYXIgZmlsZXMuICovCisJaWYgKCEoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpKSkgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUlOVkFMKTsKKwl9CisKKyNpZiBCSVRTX1BFUl9MT05HICE9IDMyCisJaHJlcS5vZmxhZ3MgfD0gT19MQVJHRUZJTEU7CisjZW5kaWYKKwkvKiBQdXQgb3BlbiBwZXJtaXNzaW9uIGluIG5hbWVpIGZvcm1hdC4gKi8KKwlwZXJtZmxhZyA9IGhyZXEub2ZsYWdzOworCWlmICgocGVybWZsYWcrMSkgJiBPX0FDQ01PREUpCisJCXBlcm1mbGFnKys7CisJaWYgKHBlcm1mbGFnICYgT19UUlVOQykKKwkJcGVybWZsYWcgfD0gMjsKKworCWlmICgoIShwZXJtZmxhZyAmIE9fQVBQRU5EKSB8fCAocGVybWZsYWcgJiBPX1RSVU5DKSkgJiYKKwkgICAgKHBlcm1mbGFnICYgRk1PREVfV1JJVEUpICYmIElTX0FQUEVORChpbm9kZSkpIHsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiAtWEZTX0VSUk9SKEVQRVJNKTsKKwl9CisKKwlpZiAoKHBlcm1mbGFnICYgRk1PREVfV1JJVEUpICYmIElTX0lNTVVUQUJMRShpbm9kZSkpIHsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiAtWEZTX0VSUk9SKEVBQ0NFUyk7CisJfQorCisJLyogQ2FuJ3Qgd3JpdGUgZGlyZWN0b3JpZXMuICovCisJaWYgKCBTX0lTRElSKGlub2RlLT5pX21vZGUpICYmIChwZXJtZmxhZyAmIEZNT0RFX1dSSVRFKSkgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUlTRElSKTsKKwl9CisKKwlpZiAoKG5ld19mZCA9IGdldF91bnVzZWRfZmQoKSkgPCAwKSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gbmV3X2ZkOworCX0KKworCWRlbnRyeSA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisJaWYgKGRlbnRyeSA9PSBOVUxMKSB7CisJCWlwdXQoaW5vZGUpOworCQlwdXRfdW51c2VkX2ZkKG5ld19mZCk7CisJCXJldHVybiAtWEZTX0VSUk9SKEVOT01FTSk7CisJfQorCisJLyogRW5zdXJlIHVtb3VudCByZXR1cm5zIEVCVVNZIG9uIHVtb3VudHMgd2hpbGUgdGhpcyBmaWxlIGlzIG9wZW4uICovCisJbW50Z2V0KHBhcmZpbHAtPmZfdmZzbW50KTsKKworCS8qIENyZWF0ZSBmaWxlIHBvaW50ZXIuICovCisJZmlscCA9IGRlbnRyeV9vcGVuKGRlbnRyeSwgcGFyZmlscC0+Zl92ZnNtbnQsIGhyZXEub2ZsYWdzKTsKKwlpZiAoSVNfRVJSKGZpbHApKSB7CisJCXB1dF91bnVzZWRfZmQobmV3X2ZkKTsKKwkJcmV0dXJuIC1YRlNfRVJST1IoLVBUUl9FUlIoZmlscCkpOworCX0KKwlpZiAoaW5vZGUtPmlfbW9kZSAmIFNfSUZSRUcpCisJCWZpbHAtPmZfb3AgPSAmbGludmZzX2ludmlzX2ZpbGVfb3BlcmF0aW9uczsKKworCWZkX2luc3RhbGwobmV3X2ZkLCBmaWxwKTsKKwlyZXR1cm4gbmV3X2ZkOworfQorCitTVEFUSUMgaW50Cit4ZnNfcmVhZGxpbmtfYnlfaGFuZGxlKAorCXhmc19tb3VudF90CQkqbXAsCisJdm9pZAkJCV9fdXNlciAqYXJnLAorCXN0cnVjdCBmaWxlCQkqcGFyZmlscCwKKwlzdHJ1Y3QgaW5vZGUJCSpwYXJpbm9kZSkKK3sKKwlpbnQJCQllcnJvcjsKKwlzdHJ1Y3QgaW92ZWMJCWFpb3Y7CisJc3RydWN0IHVpbwkJYXVpbzsKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZTsKKwl4ZnNfZnNvcF9oYW5kbGVyZXFfdAlocmVxOworCXZub2RlX3QJCQkqdnA7CisJX191MzIJCQlvbGVuOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLVhGU19FUlJPUihFUEVSTSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZocmVxLCBhcmcsIHNpemVvZih4ZnNfZnNvcF9oYW5kbGVyZXFfdCkpKQorCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCisJZXJyb3IgPSB4ZnNfdmdldF9mc29wX2hhbmRsZXJlcShtcCwgcGFyaW5vZGUsICZocmVxLCAmdnAsICZpbm9kZSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gLWVycm9yOworCisJLyogUmVzdHJpY3QgdGhpcyBoYW5kbGUgb3BlcmF0aW9uIHRvIHN5bWxpbmtzIG9ubHkuICovCisJaWYgKHZwLT52X3R5cGUgIT0gVkxOSykgeworCQlWTl9SRUxFKHZwKTsKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUlOVkFMKTsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm9sZW4sIGhyZXEub2hhbmRsZW4sIHNpemVvZihfX3UzMikpKSB7CisJCVZOX1JFTEUodnApOworCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCX0KKwlhaW92Lmlvdl9sZW4JPSBvbGVuOworCWFpb3YuaW92X2Jhc2UJPSBocmVxLm9oYW5kbGU7CisKKwlhdWlvLnVpb19pb3YJPSAmYWlvdjsKKwlhdWlvLnVpb19pb3ZjbnQJPSAxOworCWF1aW8udWlvX29mZnNldAk9IDA7CisJYXVpby51aW9fc2VnZmxnCT0gVUlPX1VTRVJTUEFDRTsKKwlhdWlvLnVpb19yZXNpZAk9IG9sZW47CisKKwlWT1BfUkVBRExJTksodnAsICZhdWlvLCBJT19JTlZJUywgTlVMTCwgZXJyb3IpOworCisJVk5fUkVMRSh2cCk7CisJcmV0dXJuIChvbGVuIC0gYXVpby51aW9fcmVzaWQpOworfQorCitTVEFUSUMgaW50Cit4ZnNfZnNzZXRkbV9ieV9oYW5kbGUoCisJeGZzX21vdW50X3QJCSptcCwKKwl2b2lkCQkJX191c2VyICphcmcsCisJc3RydWN0IGZpbGUJCSpwYXJmaWxwLAorCXN0cnVjdCBpbm9kZQkJKnBhcmlub2RlKQoreworCWludAkJCWVycm9yOworCXN0cnVjdCBmc2RtaWRhdGEJZnNkOworCXhmc19mc29wX3NldGRtX2hhbmRsZXJlcV90IGRtaHJlcTsKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZTsKKwliaHZfZGVzY190CQkqYmRwOworCXZub2RlX3QJCQkqdnA7CisKKwlpZiAoIWNhcGFibGUoQ0FQX01LTk9EKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRVBFUk0pOworCWlmIChjb3B5X2Zyb21fdXNlcigmZG1ocmVxLCBhcmcsIHNpemVvZih4ZnNfZnNvcF9zZXRkbV9oYW5kbGVyZXFfdCkpKQorCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCisJZXJyb3IgPSB4ZnNfdmdldF9mc29wX2hhbmRsZXJlcShtcCwgcGFyaW5vZGUsICZkbWhyZXEuaHJlcSwgJnZwLCAmaW5vZGUpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIC1lcnJvcjsKKworCWlmIChJU19JTU1VVEFCTEUoaW5vZGUpIHx8IElTX0FQUEVORChpbm9kZSkpIHsKKwkJVk5fUkVMRSh2cCk7CisJCXJldHVybiAtWEZTX0VSUk9SKEVQRVJNKTsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmZzZCwgZG1ocmVxLmRhdGEsIHNpemVvZihmc2QpKSkgeworCQlWTl9SRUxFKHZwKTsKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKwl9CisKKwliZHAgPSBiaHZfYmFzZV91bmxvY2tlZChWTl9CSFZfSEVBRCh2cCkpOworCWVycm9yID0geGZzX3NldF9kbWF0dHJzKGJkcCwgZnNkLmZzZF9kbWV2bWFzaywgZnNkLmZzZF9kbXN0YXRlLCBOVUxMKTsKKworCVZOX1JFTEUodnApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIC1lcnJvcjsKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIGludAoreGZzX2F0dHJsaXN0X2J5X2hhbmRsZSgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXZvaWQJCQlfX3VzZXIgKmFyZywKKwlzdHJ1Y3QgZmlsZQkJKnBhcmZpbHAsCisJc3RydWN0IGlub2RlCQkqcGFyaW5vZGUpCit7CisJaW50CQkJZXJyb3I7CisJYXR0cmxpc3RfY3Vyc29yX2tlcm5fdAkqY3Vyc29yOworCXhmc19mc29wX2F0dHJsaXN0X2hhbmRsZXJlcV90IGFsX2hyZXE7CisJc3RydWN0IGlub2RlCQkqaW5vZGU7CisJdm5vZGVfdAkJCSp2cDsKKwljaGFyCQkJKmtidWY7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtWEZTX0VSUk9SKEVQRVJNKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmFsX2hyZXEsIGFyZywgc2l6ZW9mKHhmc19mc29wX2F0dHJsaXN0X2hhbmRsZXJlcV90KSkpCisJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisJaWYgKGFsX2hyZXEuYnVmbGVuID4gWEFUVFJfTElTVF9NQVgpCisJCXJldHVybiAtWEZTX0VSUk9SKEVJTlZBTCk7CisKKwllcnJvciA9IHhmc192Z2V0X2Zzb3BfaGFuZGxlcmVxKG1wLCBwYXJpbm9kZSwgJmFsX2hyZXEuaHJlcSwKKwkJCSZ2cCwgJmlub2RlKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJa2J1ZiA9IGttYWxsb2MoYWxfaHJlcS5idWZsZW4sIEdGUF9LRVJORUwpOworCWlmICgha2J1ZikKKwkJZ290byBvdXRfdm5fcmVsZTsKKworCWN1cnNvciA9IChhdHRybGlzdF9jdXJzb3Jfa2Vybl90ICopJmFsX2hyZXEucG9zOworCVZPUF9BVFRSX0xJU1QodnAsIGtidWYsIGFsX2hyZXEuYnVmbGVuLCBhbF9ocmVxLmZsYWdzLAorCQkJY3Vyc29yLCBOVUxMLCBlcnJvcik7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9rZnJlZTsKKworCWlmIChjb3B5X3RvX3VzZXIoYWxfaHJlcS5idWZmZXIsIGtidWYsIGFsX2hyZXEuYnVmbGVuKSkKKwkJZXJyb3IgPSAtRUZBVUxUOworCisgb3V0X2tmcmVlOgorCWtmcmVlKGtidWYpOworIG91dF92bl9yZWxlOgorCVZOX1JFTEUodnApOworIG91dDoKKwlyZXR1cm4gLWVycm9yOworfQorCitTVEFUSUMgaW50Cit4ZnNfYXR0cm11bHRpX2F0dHJfZ2V0KAorCXN0cnVjdCB2bm9kZQkJKnZwLAorCWNoYXIJCQkqbmFtZSwKKwljaGFyCQkJX191c2VyICp1YnVmLAorCV9fdWludDMyX3QJCSpsZW4sCisJX191aW50MzJfdAkJZmxhZ3MpCit7CisJY2hhcgkJCSprYnVmOworCWludAkJCWVycm9yID0gRUZBVUxUOworCQorCWlmICgqbGVuID4gWEFUVFJfU0laRV9NQVgpCisJCXJldHVybiBFSU5WQUw7CisJa2J1ZiA9IGttYWxsb2MoKmxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrYnVmKQorCQlyZXR1cm4gRU5PTUVNOworCisJVk9QX0FUVFJfR0VUKHZwLCBuYW1lLCBrYnVmLCBsZW4sIGZsYWdzLCBOVUxMLCBlcnJvcik7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9rZnJlZTsKKworCWlmIChjb3B5X3RvX3VzZXIodWJ1Ziwga2J1ZiwgKmxlbikpCisJCWVycm9yID0gRUZBVUxUOworCisgb3V0X2tmcmVlOgorCWtmcmVlKGtidWYpOworCXJldHVybiBlcnJvcjsKK30KKworU1RBVElDIGludAoreGZzX2F0dHJtdWx0aV9hdHRyX3NldCgKKwlzdHJ1Y3Qgdm5vZGUJCSp2cCwKKwljaGFyCQkJKm5hbWUsCisJY29uc3QgY2hhcgkJX191c2VyICp1YnVmLAorCV9fdWludDMyX3QJCWxlbiwKKwlfX3VpbnQzMl90CQlmbGFncykKK3sKKwljaGFyCQkJKmtidWY7CisJaW50CQkJZXJyb3IgPSBFRkFVTFQ7CisKKwlpZiAoSVNfSU1NVVRBQkxFKCZ2cC0+dl9pbm9kZSkgfHwgSVNfQVBQRU5EKCZ2cC0+dl9pbm9kZSkpCisJCXJldHVybiBFUEVSTTsKKwlpZiAobGVuID4gWEFUVFJfU0laRV9NQVgpCisJCXJldHVybiBFSU5WQUw7CisKKwlrYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmICgha2J1ZikKKwkJcmV0dXJuIEVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihrYnVmLCB1YnVmLCBsZW4pKQorCQlnb3RvIG91dF9rZnJlZTsKKwkJCQorCVZPUF9BVFRSX1NFVCh2cCwgbmFtZSwga2J1ZiwgbGVuLCBmbGFncywgTlVMTCwgZXJyb3IpOworCisgb3V0X2tmcmVlOgorCWtmcmVlKGtidWYpOworCXJldHVybiBlcnJvcjsKK30KKworU1RBVElDIGludAoreGZzX2F0dHJtdWx0aV9hdHRyX3JlbW92ZSgKKwlzdHJ1Y3Qgdm5vZGUJCSp2cCwKKwljaGFyCQkJKm5hbWUsCisJX191aW50MzJfdAkJZmxhZ3MpCit7CisJaW50CQkJZXJyb3I7CisKKwlpZiAoSVNfSU1NVVRBQkxFKCZ2cC0+dl9pbm9kZSkgfHwgSVNfQVBQRU5EKCZ2cC0+dl9pbm9kZSkpCisJCXJldHVybiBFUEVSTTsKKworCVZPUF9BVFRSX1JFTU9WRSh2cCwgbmFtZSwgZmxhZ3MsIE5VTEwsIGVycm9yKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19hdHRybXVsdGlfYnlfaGFuZGxlKAorCXhmc19tb3VudF90CQkqbXAsCisJdm9pZAkJCV9fdXNlciAqYXJnLAorCXN0cnVjdCBmaWxlCQkqcGFyZmlscCwKKwlzdHJ1Y3QgaW5vZGUJCSpwYXJpbm9kZSkKK3sKKwlpbnQJCQllcnJvcjsKKwl4ZnNfYXR0cl9tdWx0aW9wX3QJKm9wczsKKwl4ZnNfZnNvcF9hdHRybXVsdGlfaGFuZGxlcmVxX3QgYW1faHJlcTsKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZTsKKwl2bm9kZV90CQkJKnZwOworCXVuc2lnbmVkIGludAkJaSwgc2l6ZTsKKwljaGFyCQkJKmF0dHJfbmFtZTsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRVBFUk0pOworCWlmIChjb3B5X2Zyb21fdXNlcigmYW1faHJlcSwgYXJnLCBzaXplb2YoeGZzX2Zzb3BfYXR0cm11bHRpX2hhbmRsZXJlcV90KSkpCisJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisKKwllcnJvciA9IHhmc192Z2V0X2Zzb3BfaGFuZGxlcmVxKG1wLCBwYXJpbm9kZSwgJmFtX2hyZXEuaHJlcSwgJnZwLCAmaW5vZGUpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IEUyQklHOworCXNpemUgPSBhbV9ocmVxLm9wY291bnQgKiBzaXplb2YoYXR0cl9tdWx0aW9wX3QpOworCWlmICghc2l6ZSB8fCBzaXplID4gMTYgKiBQQUdFX1NJWkUpCisJCWdvdG8gb3V0X3ZuX3JlbGU7CisKKwllcnJvciA9IEVOT01FTTsKKwlvcHMgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghb3BzKQorCQlnb3RvIG91dF92bl9yZWxlOworCisJZXJyb3IgPSBFRkFVTFQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKG9wcywgYW1faHJlcS5vcHMsIHNpemUpKQorCQlnb3RvIG91dF9rZnJlZV9vcHM7CisKKwlhdHRyX25hbWUgPSBrbWFsbG9jKE1BWE5BTUVMRU4sIEdGUF9LRVJORUwpOworCWlmICghYXR0cl9uYW1lKQorCQlnb3RvIG91dF9rZnJlZV9vcHM7CisKKworCWVycm9yID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgYW1faHJlcS5vcGNvdW50OyBpKyspIHsKKwkJb3BzW2ldLmFtX2Vycm9yID0gc3RybmNweV9mcm9tX3VzZXIoYXR0cl9uYW1lLAorCQkJCW9wc1tpXS5hbV9hdHRybmFtZSwgTUFYTkFNRUxFTik7CisJCWlmIChvcHNbaV0uYW1fZXJyb3IgPT0gMCB8fCBvcHNbaV0uYW1fZXJyb3IgPT0gTUFYTkFNRUxFTikKKwkJCWVycm9yID0gLUVSQU5HRTsKKwkJaWYgKG9wc1tpXS5hbV9lcnJvciA8IDApCisJCQlicmVhazsKKworCQlzd2l0Y2ggKG9wc1tpXS5hbV9vcGNvZGUpIHsKKwkJY2FzZSBBVFRSX09QX0dFVDoKKwkJCW9wc1tpXS5hbV9lcnJvciA9IHhmc19hdHRybXVsdGlfYXR0cl9nZXQodnAsCisJCQkJCWF0dHJfbmFtZSwgb3BzW2ldLmFtX2F0dHJ2YWx1ZSwKKwkJCQkJJm9wc1tpXS5hbV9sZW5ndGgsIG9wc1tpXS5hbV9mbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSBBVFRSX09QX1NFVDoKKwkJCW9wc1tpXS5hbV9lcnJvciA9IHhmc19hdHRybXVsdGlfYXR0cl9zZXQodnAsCisJCQkJCWF0dHJfbmFtZSwgb3BzW2ldLmFtX2F0dHJ2YWx1ZSwKKwkJCQkJb3BzW2ldLmFtX2xlbmd0aCwgb3BzW2ldLmFtX2ZsYWdzKTsKKwkJCWJyZWFrOworCQljYXNlIEFUVFJfT1BfUkVNT1ZFOgorCQkJb3BzW2ldLmFtX2Vycm9yID0geGZzX2F0dHJtdWx0aV9hdHRyX3JlbW92ZSh2cCwKKwkJCQkJYXR0cl9uYW1lLCBvcHNbaV0uYW1fZmxhZ3MpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlvcHNbaV0uYW1fZXJyb3IgPSBFSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoY29weV90b191c2VyKGFtX2hyZXEub3BzLCBvcHMsIHNpemUpKQorCQllcnJvciA9IFhGU19FUlJPUihFRkFVTFQpOworCisJa2ZyZWUoYXR0cl9uYW1lKTsKKyBvdXRfa2ZyZWVfb3BzOgorCWtmcmVlKG9wcyk7Cisgb3V0X3ZuX3JlbGU6CisJVk5fUkVMRSh2cCk7Cisgb3V0OgorCXJldHVybiAtZXJyb3I7Cit9CisKKy8qIHByb3RvdHlwZXMgZm9yIGEgZmV3IG9mIHRoZSBzdGFjay1odW5ncnkgY2FzZXMgdGhhdCBoYXZlCisgKiB0aGVpciBvd24gZnVuY3Rpb25zLiAgRnVuY3Rpb25zIGFyZSBkZWZpbmVkIGFmdGVyIHRoZWlyIHVzZQorICogc28gZ2NjIGRvZXNuJ3QgZ2V0IGZhbmN5IGFuZCBpbmxpbmUgdGhlbSB3aXRoIC0wMyAqLworCitTVEFUSUMgaW50Cit4ZnNfaW9jX3NwYWNlKAorCWJodl9kZXNjX3QJCSpiZHAsCisJdm5vZGVfdAkJCSp2cCwKKwlzdHJ1Y3QgZmlsZQkJKmZpbHAsCisJaW50CQkJZmxhZ3MsCisJdW5zaWduZWQgaW50CQljbWQsCisJdm9pZAkJCV9fdXNlciAqYXJnKTsKKworU1RBVElDIGludAoreGZzX2lvY19idWxrc3RhdCgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXVuc2lnbmVkIGludAkJY21kLAorCXZvaWQJCQlfX3VzZXIgKmFyZyk7CisKK1NUQVRJQyBpbnQKK3hmc19pb2NfZnNnZW9tZXRyeV92MSgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXZvaWQJCQlfX3VzZXIgKmFyZyk7CisKK1NUQVRJQyBpbnQKK3hmc19pb2NfZnNnZW9tZXRyeSgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXZvaWQJCQlfX3VzZXIgKmFyZyk7CisKK1NUQVRJQyBpbnQKK3hmc19pb2NfeGF0dHIoCisJdm5vZGVfdAkJCSp2cCwKKwl4ZnNfaW5vZGVfdAkJKmlwLAorCXN0cnVjdCBmaWxlCQkqZmlscCwKKwl1bnNpZ25lZCBpbnQJCWNtZCwKKwl2b2lkCQkJX191c2VyICphcmcpOworCitTVEFUSUMgaW50Cit4ZnNfaW9jX2dldGJtYXAoCisJYmh2X2Rlc2NfdAkJKmJkcCwKKwlzdHJ1Y3QgZmlsZQkJKmZpbHAsCisJaW50CQkJZmxhZ3MsCisJdW5zaWduZWQgaW50CQljbWQsCisJdm9pZAkJCV9fdXNlciAqYXJnKTsKKworU1RBVElDIGludAoreGZzX2lvY19nZXRibWFweCgKKwliaHZfZGVzY190CQkqYmRwLAorCXZvaWQJCQlfX3VzZXIgKmFyZyk7CisKK2ludAoreGZzX2lvY3RsKAorCWJodl9kZXNjX3QJCSpiZHAsCisJc3RydWN0IGlub2RlCQkqaW5vZGUsCisJc3RydWN0IGZpbGUJCSpmaWxwLAorCWludAkJCWlvZmxhZ3MsCisJdW5zaWduZWQgaW50CQljbWQsCisJdm9pZAkJCV9fdXNlciAqYXJnKQoreworCWludAkJCWVycm9yOworCXZub2RlX3QJCQkqdnA7CisJeGZzX2lub2RlX3QJCSppcDsKKwl4ZnNfbW91bnRfdAkJKm1wOworCisJdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKworCXZuX3RyYWNlX2VudHJ5KHZwLCAieGZzX2lvY3RsIiwgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCisJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CisJbXAgPSBpcC0+aV9tb3VudDsKKworCXN3aXRjaCAoY21kKSB7CisKKwljYXNlIFhGU19JT0NfQUxMT0NTUDoKKwljYXNlIFhGU19JT0NfRlJFRVNQOgorCWNhc2UgWEZTX0lPQ19SRVNWU1A6CisJY2FzZSBYRlNfSU9DX1VOUkVTVlNQOgorCWNhc2UgWEZTX0lPQ19BTExPQ1NQNjQ6CisJY2FzZSBYRlNfSU9DX0ZSRUVTUDY0OgorCWNhc2UgWEZTX0lPQ19SRVNWU1A2NDoKKwljYXNlIFhGU19JT0NfVU5SRVNWU1A2NDoKKwkJLyoKKwkJICogT25seSBhbGxvdyB0aGUgc3lzIGFkbWluIHRvIHJlc2VydmUgc3BhY2UgdW5sZXNzCisJCSAqIHVud3JpdHRlbiBleHRlbnRzIGFyZSBlbmFibGVkLgorCQkgKi8KKwkJaWYgKCFYRlNfU0JfVkVSU0lPTl9IQVNFWFRGTEdCSVQoJm1wLT5tX3NiKSAmJgorCQkgICAgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCXJldHVybiB4ZnNfaW9jX3NwYWNlKGJkcCwgdnAsIGZpbHAsIGlvZmxhZ3MsIGNtZCwgYXJnKTsKKworCWNhc2UgWEZTX0lPQ19ESU9JTkZPOiB7CisJCXN0cnVjdCBkaW9hdHRyCWRhOworCQl4ZnNfYnVmdGFyZ190CSp0YXJnZXQgPQorCQkJKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSA/CisJCQltcC0+bV9ydGRldl90YXJncCA6IG1wLT5tX2RkZXZfdGFyZ3A7CisKKwkJZGEuZF9tZW0gPSBkYS5kX21pbmlvc3ogPSAxIDw8IHRhcmdldC0+cGJyX3NzaGlmdDsKKwkJLyogVGhlIHNpemUgZGlvIHdpbGwgZG8gaW4gb25lIGdvICovCisJCWRhLmRfbWF4aW9zeiA9IDY0ICogUEFHRV9DQUNIRV9TSVpFOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZGEsIHNpemVvZihkYSkpKQorCQkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBYRlNfSU9DX0ZTQlVMS1NUQVRfU0lOR0xFOgorCWNhc2UgWEZTX0lPQ19GU0JVTEtTVEFUOgorCWNhc2UgWEZTX0lPQ19GU0lOVU1CRVJTOgorCQlyZXR1cm4geGZzX2lvY19idWxrc3RhdChtcCwgY21kLCBhcmcpOworCisJY2FzZSBYRlNfSU9DX0ZTR0VPTUVUUllfVjE6CisJCXJldHVybiB4ZnNfaW9jX2ZzZ2VvbWV0cnlfdjEobXAsIGFyZyk7CisKKwljYXNlIFhGU19JT0NfRlNHRU9NRVRSWToKKwkJcmV0dXJuIHhmc19pb2NfZnNnZW9tZXRyeShtcCwgYXJnKTsKKworCWNhc2UgWEZTX0lPQ19HRVRWRVJTSU9OOgorCWNhc2UgWEZTX0lPQ19HRVRYRkxBR1M6CisJY2FzZSBYRlNfSU9DX1NFVFhGTEFHUzoKKwljYXNlIFhGU19JT0NfRlNHRVRYQVRUUjoKKwljYXNlIFhGU19JT0NfRlNTRVRYQVRUUjoKKwljYXNlIFhGU19JT0NfRlNHRVRYQVRUUkE6CisJCXJldHVybiB4ZnNfaW9jX3hhdHRyKHZwLCBpcCwgZmlscCwgY21kLCBhcmcpOworCisJY2FzZSBYRlNfSU9DX0ZTU0VURE06IHsKKwkJc3RydWN0IGZzZG1pZGF0YQlkbWk7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZkbWksIGFyZywgc2l6ZW9mKGRtaSkpKQorCQkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKworCQllcnJvciA9IHhmc19zZXRfZG1hdHRycyhiZHAsIGRtaS5mc2RfZG1ldm1hc2ssIGRtaS5mc2RfZG1zdGF0ZSwKKwkJCQkJCQlOVUxMKTsKKwkJcmV0dXJuIC1lcnJvcjsKKwl9CisKKwljYXNlIFhGU19JT0NfR0VUQk1BUDoKKwljYXNlIFhGU19JT0NfR0VUQk1BUEE6CisJCXJldHVybiB4ZnNfaW9jX2dldGJtYXAoYmRwLCBmaWxwLCBpb2ZsYWdzLCBjbWQsIGFyZyk7CisKKwljYXNlIFhGU19JT0NfR0VUQk1BUFg6CisJCXJldHVybiB4ZnNfaW9jX2dldGJtYXB4KGJkcCwgYXJnKTsKKworCWNhc2UgWEZTX0lPQ19GRF9UT19IQU5ETEU6CisJY2FzZSBYRlNfSU9DX1BBVEhfVE9fSEFORExFOgorCWNhc2UgWEZTX0lPQ19QQVRIX1RPX0ZTSEFORExFOgorCQlyZXR1cm4geGZzX2ZpbmRfaGFuZGxlKGNtZCwgYXJnKTsKKworCWNhc2UgWEZTX0lPQ19PUEVOX0JZX0hBTkRMRToKKwkJcmV0dXJuIHhmc19vcGVuX2J5X2hhbmRsZShtcCwgYXJnLCBmaWxwLCBpbm9kZSk7CisKKwljYXNlIFhGU19JT0NfRlNTRVRETV9CWV9IQU5ETEU6CisJCXJldHVybiB4ZnNfZnNzZXRkbV9ieV9oYW5kbGUobXAsIGFyZywgZmlscCwgaW5vZGUpOworCisJY2FzZSBYRlNfSU9DX1JFQURMSU5LX0JZX0hBTkRMRToKKwkJcmV0dXJuIHhmc19yZWFkbGlua19ieV9oYW5kbGUobXAsIGFyZywgZmlscCwgaW5vZGUpOworCisJY2FzZSBYRlNfSU9DX0FUVFJMSVNUX0JZX0hBTkRMRToKKwkJcmV0dXJuIHhmc19hdHRybGlzdF9ieV9oYW5kbGUobXAsIGFyZywgZmlscCwgaW5vZGUpOworCisJY2FzZSBYRlNfSU9DX0FUVFJNVUxUSV9CWV9IQU5ETEU6CisJCXJldHVybiB4ZnNfYXR0cm11bHRpX2J5X2hhbmRsZShtcCwgYXJnLCBmaWxwLCBpbm9kZSk7CisKKwljYXNlIFhGU19JT0NfU1dBUEVYVDogeworCQllcnJvciA9IHhmc19zd2FwZXh0KChzdHJ1Y3QgeGZzX3N3YXBleHQgX191c2VyICopYXJnKTsKKwkJcmV0dXJuIC1lcnJvcjsKKwl9CisKKwljYXNlIFhGU19JT0NfRlNDT1VOVFM6IHsKKwkJeGZzX2Zzb3BfY291bnRzX3Qgb3V0OworCisJCWVycm9yID0geGZzX2ZzX2NvdW50cyhtcCwgJm91dCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiAtZXJyb3I7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZvdXQsIHNpemVvZihvdXQpKSkKKwkJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisJCXJldHVybiAwOworCX0KKworCWNhc2UgWEZTX0lPQ19TRVRfUkVTQkxLUzogeworCQl4ZnNfZnNvcF9yZXNibGtzX3QgaW5vdXQ7CisJCV9fdWludDY0X3QJICAgaW47CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmlub3V0LCBhcmcsIHNpemVvZihpbm91dCkpKQorCQkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKworCQkvKiBpbnB1dCBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluIHJlc2Jsa3MgZmllbGQgb2Ygc3RydWN0dXJlICovCisJCWluID0gaW5vdXQucmVzYmxrczsKKwkJZXJyb3IgPSB4ZnNfcmVzZXJ2ZV9ibG9ja3MobXAsICZpbiwgJmlub3V0KTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIC1lcnJvcjsKKworCQlpZiAoY29weV90b191c2VyKGFyZywgJmlub3V0LCBzaXplb2YoaW5vdXQpKSkKKwkJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisJCXJldHVybiAwOworCX0KKworCWNhc2UgWEZTX0lPQ19HRVRfUkVTQkxLUzogeworCQl4ZnNfZnNvcF9yZXNibGtzX3Qgb3V0OworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJZXJyb3IgPSB4ZnNfcmVzZXJ2ZV9ibG9ja3MobXAsIE5VTEwsICZvdXQpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gLWVycm9yOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmb3V0LCBzaXplb2Yob3V0KSkpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCisJCXJldHVybiAwOworCX0KKworCWNhc2UgWEZTX0lPQ19GU0dST1dGU0RBVEE6IHsKKwkJeGZzX2dyb3dmc19kYXRhX3QgaW47CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmluLCBhcmcsIHNpemVvZihpbikpKQorCQkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKworCQllcnJvciA9IHhmc19ncm93ZnNfZGF0YShtcCwgJmluKTsKKwkJcmV0dXJuIC1lcnJvcjsKKwl9CisKKwljYXNlIFhGU19JT0NfRlNHUk9XRlNMT0c6IHsKKwkJeGZzX2dyb3dmc19sb2dfdCBpbjsKKworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmaW4sIGFyZywgc2l6ZW9mKGluKSkpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCisJCWVycm9yID0geGZzX2dyb3dmc19sb2cobXAsICZpbik7CisJCXJldHVybiAtZXJyb3I7CisJfQorCisJY2FzZSBYRlNfSU9DX0ZTR1JPV0ZTUlQ6IHsKKwkJeGZzX2dyb3dmc19ydF90IGluOworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbiwgYXJnLCBzaXplb2YoaW4pKSkKKwkJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisKKwkJZXJyb3IgPSB4ZnNfZ3Jvd2ZzX3J0KG1wLCAmaW4pOworCQlyZXR1cm4gLWVycm9yOworCX0KKworCWNhc2UgWEZTX0lPQ19GUkVFWkU6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGlub2RlLT5pX3NiLT5zX2Zyb3plbiA9PSBTQl9VTkZST1pFTikKKwkJCWZyZWV6ZV9iZGV2KGlub2RlLT5pX3NiLT5zX2JkZXYpOworCQlyZXR1cm4gMDsKKworCWNhc2UgWEZTX0lPQ19USEFXOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoaW5vZGUtPmlfc2ItPnNfZnJvemVuICE9IFNCX1VORlJPWkVOKQorCQkJdGhhd19iZGV2KGlub2RlLT5pX3NiLT5zX2JkZXYsIGlub2RlLT5pX3NiKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFhGU19JT0NfR09JTkdET1dOOiB7CisJCV9fdWludDMyX3QgaW47CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoZ2V0X3VzZXIoaW4sIChfX3VpbnQzMl90IF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCisJCWVycm9yID0geGZzX2ZzX2dvaW5nZG93bihtcCwgaW4pOworCQlyZXR1cm4gLWVycm9yOworCX0KKworCWNhc2UgWEZTX0lPQ19FUlJPUl9JTkpFQ1RJT046IHsKKwkJeGZzX2Vycm9yX2luamVjdGlvbl90IGluOworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbiwgYXJnLCBzaXplb2YoaW4pKSkKKwkJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisKKwkJZXJyb3IgPSB4ZnNfZXJyb3J0YWdfYWRkKGluLmVycnRhZywgbXApOworCQlyZXR1cm4gLWVycm9yOworCX0KKworCWNhc2UgWEZTX0lPQ19FUlJPUl9DTEVBUkFMTDoKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQllcnJvciA9IHhmc19lcnJvcnRhZ19jbGVhcmFsbChtcCk7CisJCXJldHVybiAtZXJyb3I7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKKwl9Cit9CisKK1NUQVRJQyBpbnQKK3hmc19pb2Nfc3BhY2UoCisJYmh2X2Rlc2NfdAkJKmJkcCwKKwl2bm9kZV90CQkJKnZwLAorCXN0cnVjdCBmaWxlCQkqZmlscCwKKwlpbnQJCQlpb2ZsYWdzLAorCXVuc2lnbmVkIGludAkJY21kLAorCXZvaWQJCQlfX3VzZXIgKmFyZykKK3sKKwl4ZnNfZmxvY2s2NF90CQliZjsKKwlpbnQJCQlhdHRyX2ZsYWdzID0gMDsKKwlpbnQJCQllcnJvcjsKKworCWlmICh2cC0+dl9pbm9kZS5pX2ZsYWdzICYgKFNfSU1NVVRBQkxFfFNfQVBQRU5EKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRVBFUk0pOworCisJaWYgKCEoZmlscC0+Zl9mbGFncyAmIEZNT0RFX1dSSVRFKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUJBREYpOworCisJaWYgKHZwLT52X3R5cGUgIT0gVlJFRykKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUlOVkFMKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmYmYsIGFyZywgc2l6ZW9mKGJmKSkpCisJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisKKwlpZiAoZmlscC0+Zl9mbGFncyAmIChPX05ERUxBWXxPX05PTkJMT0NLKSkKKwkJYXR0cl9mbGFncyB8PSBBVFRSX05PTkJMT0NLOworCWlmIChpb2ZsYWdzICYgSU9fSU5WSVMpCisJCWF0dHJfZmxhZ3MgfD0gQVRUUl9ETUk7CisKKwllcnJvciA9IHhmc19jaGFuZ2VfZmlsZV9zcGFjZShiZHAsIGNtZCwgJmJmLCBmaWxwLT5mX3BvcywKKwkJCQkJICAgICAgTlVMTCwgYXR0cl9mbGFncyk7CisJcmV0dXJuIC1lcnJvcjsKK30KKworU1RBVElDIGludAoreGZzX2lvY19idWxrc3RhdCgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXVuc2lnbmVkIGludAkJY21kLAorCXZvaWQJCQlfX3VzZXIgKmFyZykKK3sKKwl4ZnNfZnNvcF9idWxrcmVxX3QJYnVsa3JlcTsKKwlpbnQJCQljb3VudDsJLyogIyBvZiByZWNvcmRzIHJldHVybmVkICovCisJeGZzX2lub190CQlpbmxhc3Q7CS8qIGxhc3QgaW5vZGUgbnVtYmVyICovCisJaW50CQkJZG9uZTsKKwlpbnQJCQllcnJvcjsKKworCS8qIGRvbmUgPSAxIGlmIHRoZXJlIGFyZSBtb3JlIHN0YXRzIHRvIGdldCBhbmQgaWYgYnVsa3N0YXQgKi8KKwkvKiBzaG91bGQgYmUgY2FsbGVkIGFnYWluICh1bnVzZWQgaGVyZSwgYnV0IHVzZWQgaW4gZG1hcGkpICovCisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCXJldHVybiAtWEZTX0VSUk9SKEVJTyk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmJ1bGtyZXEsIGFyZywgc2l6ZW9mKHhmc19mc29wX2J1bGtyZXFfdCkpKQorCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmxhc3QsIGJ1bGtyZXEubGFzdGlwLCBzaXplb2YoX19zNjQpKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKworCWlmICgoY291bnQgPSBidWxrcmVxLmljb3VudCkgPD0gMCkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUlOVkFMKTsKKworCWlmIChjbWQgPT0gWEZTX0lPQ19GU0lOVU1CRVJTKQorCQllcnJvciA9IHhmc19pbnVtYmVycyhtcCwgJmlubGFzdCwgJmNvdW50LAorCQkJCQkJYnVsa3JlcS51YnVmZmVyKTsKKwllbHNlIGlmIChjbWQgPT0gWEZTX0lPQ19GU0JVTEtTVEFUX1NJTkdMRSkKKwkJZXJyb3IgPSB4ZnNfYnVsa3N0YXRfc2luZ2xlKG1wLCAmaW5sYXN0LAorCQkJCQkJYnVsa3JlcS51YnVmZmVyLCAmZG9uZSk7CisJZWxzZSB7CS8qIFhGU19JT0NfRlNCVUxLU1RBVCAqLworCQlpZiAoY291bnQgPT0gMSAmJiBpbmxhc3QgIT0gMCkgeworCQkJaW5sYXN0Kys7CisJCQllcnJvciA9IHhmc19idWxrc3RhdF9zaW5nbGUobXAsICZpbmxhc3QsCisJCQkJCWJ1bGtyZXEudWJ1ZmZlciwgJmRvbmUpOworCQl9IGVsc2UgeworCQkJZXJyb3IgPSB4ZnNfYnVsa3N0YXQobXAsICZpbmxhc3QsICZjb3VudCwKKwkJCQkoYnVsa3N0YXRfb25lX3BmKXhmc19idWxrc3RhdF9vbmUsIE5VTEwsCisJCQkJc2l6ZW9mKHhmc19ic3RhdF90KSwgYnVsa3JlcS51YnVmZmVyLAorCQkJCUJVTEtTVEFUX0ZHX1FVSUNLLCAmZG9uZSk7CisJCX0KKwl9CisKKwlpZiAoZXJyb3IpCisJCXJldHVybiAtZXJyb3I7CisKKwlpZiAoYnVsa3JlcS5vY291bnQgIT0gTlVMTCkgeworCQlpZiAoY29weV90b191c2VyKGJ1bGtyZXEubGFzdGlwLCAmaW5sYXN0LAorCQkJCQkJc2l6ZW9mKHhmc19pbm9fdCkpKQorCQkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKworCQlpZiAoY29weV90b191c2VyKGJ1bGtyZXEub2NvdW50LCAmY291bnQsIHNpemVvZihjb3VudCkpKQorCQkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIGludAoreGZzX2lvY19mc2dlb21ldHJ5X3YxKAorCXhmc19tb3VudF90CQkqbXAsCisJdm9pZAkJCV9fdXNlciAqYXJnKQoreworCXhmc19mc29wX2dlb21fdjFfdAlmc2dlbzsKKwlpbnQJCQllcnJvcjsKKworCWVycm9yID0geGZzX2ZzX2dlb21ldHJ5KG1wLCAoeGZzX2Zzb3BfZ2VvbV90ICopJmZzZ2VvLCAzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiAtZXJyb3I7CisKKwlpZiAoY29weV90b191c2VyKGFyZywgJmZzZ2VvLCBzaXplb2YoZnNnZW8pKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIGludAoreGZzX2lvY19mc2dlb21ldHJ5KAorCXhmc19tb3VudF90CQkqbXAsCisJdm9pZAkJCV9fdXNlciAqYXJnKQoreworCXhmc19mc29wX2dlb21fdAkJZnNnZW87CisJaW50CQkJZXJyb3I7CisKKwllcnJvciA9IHhmc19mc19nZW9tZXRyeShtcCwgJmZzZ2VvLCA0KTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiAtZXJyb3I7CisKKwlpZiAoY29weV90b191c2VyKGFyZywgJmZzZ2VvLCBzaXplb2YoZnNnZW8pKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExpbnV4IGV4dGVuZGVkIGlub2RlIGZsYWdzIGludGVyZmFjZS4KKyAqLworI2RlZmluZSBMSU5VWF9YRkxBR19TWU5DCTB4MDAwMDAwMDggLyogU3luY2hyb25vdXMgdXBkYXRlcyAqLworI2RlZmluZSBMSU5VWF9YRkxBR19JTU1VVEFCTEUJMHgwMDAwMDAxMCAvKiBJbW11dGFibGUgZmlsZSAqLworI2RlZmluZSBMSU5VWF9YRkxBR19BUFBFTkQJMHgwMDAwMDAyMCAvKiB3cml0ZXMgdG8gZmlsZSBtYXkgb25seSBhcHBlbmQgKi8KKyNkZWZpbmUgTElOVVhfWEZMQUdfTk9EVU1QCTB4MDAwMDAwNDAgLyogZG8gbm90IGR1bXAgZmlsZSAqLworI2RlZmluZSBMSU5VWF9YRkxBR19OT0FUSU1FCTB4MDAwMDAwODAgLyogZG8gbm90IHVwZGF0ZSBhdGltZSAqLworCitTVEFUSUMgdW5zaWduZWQgaW50Cit4ZnNfbWVyZ2VfaW9jX3hmbGFncygKKwl1bnNpZ25lZCBpbnQJZmxhZ3MsCisJdW5zaWduZWQgaW50CXN0YXJ0KQoreworCXVuc2lnbmVkIGludAl4ZmxhZ3MgPSBzdGFydDsKKworCWlmIChmbGFncyAmIExJTlVYX1hGTEFHX0lNTVVUQUJMRSkKKwkJeGZsYWdzIHw9IFhGU19YRkxBR19JTU1VVEFCTEU7CisJZWxzZQorCQl4ZmxhZ3MgJj0gflhGU19YRkxBR19JTU1VVEFCTEU7CisJaWYgKGZsYWdzICYgTElOVVhfWEZMQUdfQVBQRU5EKQorCQl4ZmxhZ3MgfD0gWEZTX1hGTEFHX0FQUEVORDsKKwllbHNlCisJCXhmbGFncyAmPSB+WEZTX1hGTEFHX0FQUEVORDsKKwlpZiAoZmxhZ3MgJiBMSU5VWF9YRkxBR19TWU5DKQorCQl4ZmxhZ3MgfD0gWEZTX1hGTEFHX1NZTkM7CisJZWxzZQorCQl4ZmxhZ3MgJj0gflhGU19YRkxBR19TWU5DOworCWlmIChmbGFncyAmIExJTlVYX1hGTEFHX05PQVRJTUUpCisJCXhmbGFncyB8PSBYRlNfWEZMQUdfTk9BVElNRTsKKwllbHNlCisJCXhmbGFncyAmPSB+WEZTX1hGTEFHX05PQVRJTUU7CisJaWYgKGZsYWdzICYgTElOVVhfWEZMQUdfTk9EVU1QKQorCQl4ZmxhZ3MgfD0gWEZTX1hGTEFHX05PRFVNUDsKKwllbHNlCisJCXhmbGFncyAmPSB+WEZTX1hGTEFHX05PRFVNUDsKKworCXJldHVybiB4ZmxhZ3M7Cit9CisKK1NUQVRJQyB1bnNpZ25lZCBpbnQKK3hmc19kaTJseGZsYWdzKAorCV9fdWludDE2X3QJZGlfZmxhZ3MpCit7CisJdW5zaWduZWQgaW50CWZsYWdzID0gMDsKKworCWlmIChkaV9mbGFncyAmIFhGU19ESUZMQUdfSU1NVVRBQkxFKQorCQlmbGFncyB8PSBMSU5VWF9YRkxBR19JTU1VVEFCTEU7CisJaWYgKGRpX2ZsYWdzICYgWEZTX0RJRkxBR19BUFBFTkQpCisJCWZsYWdzIHw9IExJTlVYX1hGTEFHX0FQUEVORDsKKwlpZiAoZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1NZTkMpCisJCWZsYWdzIHw9IExJTlVYX1hGTEFHX1NZTkM7CisJaWYgKGRpX2ZsYWdzICYgWEZTX0RJRkxBR19OT0FUSU1FKQorCQlmbGFncyB8PSBMSU5VWF9YRkxBR19OT0FUSU1FOworCWlmIChkaV9mbGFncyAmIFhGU19ESUZMQUdfTk9EVU1QKQorCQlmbGFncyB8PSBMSU5VWF9YRkxBR19OT0RVTVA7CisJcmV0dXJuIGZsYWdzOworfQorCitTVEFUSUMgaW50Cit4ZnNfaW9jX3hhdHRyKAorCXZub2RlX3QJCQkqdnAsCisJeGZzX2lub2RlX3QJCSppcCwKKwlzdHJ1Y3QgZmlsZQkJKmZpbHAsCisJdW5zaWduZWQgaW50CQljbWQsCisJdm9pZAkJCV9fdXNlciAqYXJnKQoreworCXN0cnVjdCBmc3hhdHRyCQlmYTsKKwl2YXR0cl90CQkJdmE7CisJaW50CQkJZXJyb3I7CisJaW50CQkJYXR0cl9mbGFnczsKKwl1bnNpZ25lZCBpbnQJCWZsYWdzOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFhGU19JT0NfRlNHRVRYQVRUUjogeworCQl2YS52YV9tYXNrID0gWEZTX0FUX1hGTEFHU3xYRlNfQVRfRVhUU0laRXxYRlNfQVRfTkVYVEVOVFM7CisJCVZPUF9HRVRBVFRSKHZwLCAmdmEsIDAsIE5VTEwsIGVycm9yKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIC1lcnJvcjsKKworCQlmYS5mc3hfeGZsYWdzCT0gdmEudmFfeGZsYWdzOworCQlmYS5mc3hfZXh0c2l6ZQk9IHZhLnZhX2V4dHNpemU7CisJCWZhLmZzeF9uZXh0ZW50cyA9IHZhLnZhX25leHRlbnRzOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZmEsIHNpemVvZihmYSkpKQorCQkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBYRlNfSU9DX0ZTU0VUWEFUVFI6IHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZmYSwgYXJnLCBzaXplb2YoZmEpKSkKKwkJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisKKwkJYXR0cl9mbGFncyA9IDA7CisJCWlmIChmaWxwLT5mX2ZsYWdzICYgKE9fTkRFTEFZfE9fTk9OQkxPQ0spKQorCQkJYXR0cl9mbGFncyB8PSBBVFRSX05PTkJMT0NLOworCisJCXZhLnZhX21hc2sgPSBYRlNfQVRfWEZMQUdTIHwgWEZTX0FUX0VYVFNJWkU7CisJCXZhLnZhX3hmbGFncyAgPSBmYS5mc3hfeGZsYWdzOworCQl2YS52YV9leHRzaXplID0gZmEuZnN4X2V4dHNpemU7CisKKwkJVk9QX1NFVEFUVFIodnAsICZ2YSwgYXR0cl9mbGFncywgTlVMTCwgZXJyb3IpOworCQlpZiAoIWVycm9yKQorCQkJdm5fcmV2YWxpZGF0ZSh2cCk7CS8qIHVwZGF0ZSBMaW51eCBpbm9kZSBmbGFncyAqLworCQlyZXR1cm4gLWVycm9yOworCX0KKworCWNhc2UgWEZTX0lPQ19GU0dFVFhBVFRSQTogeworCQl2YS52YV9tYXNrID0gWEZTX0FUX1hGTEFHU3xYRlNfQVRfRVhUU0laRXxYRlNfQVRfQU5FWFRFTlRTOworCQlWT1BfR0VUQVRUUih2cCwgJnZhLCAwLCBOVUxMLCBlcnJvcik7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiAtZXJyb3I7CisKKwkJZmEuZnN4X3hmbGFncwk9IHZhLnZhX3hmbGFnczsKKwkJZmEuZnN4X2V4dHNpemUJPSB2YS52YV9leHRzaXplOworCQlmYS5mc3hfbmV4dGVudHMgPSB2YS52YV9hbmV4dGVudHM7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZmYSwgc2l6ZW9mKGZhKSkpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFhGU19JT0NfR0VUWEZMQUdTOiB7CisJCWZsYWdzID0geGZzX2RpMmx4ZmxhZ3MoaXAtPmlfZC5kaV9mbGFncyk7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZmxhZ3MsIHNpemVvZihmbGFncykpKQorCQkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBYRlNfSU9DX1NFVFhGTEFHUzogeworCQlpZiAoY29weV9mcm9tX3VzZXIoJmZsYWdzLCBhcmcsIHNpemVvZihmbGFncykpKQorCQkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKworCQlpZiAoZmxhZ3MgJiB+KExJTlVYX1hGTEFHX0lNTVVUQUJMRSB8IExJTlVYX1hGTEFHX0FQUEVORCB8IFwKKwkJCSAgICAgIExJTlVYX1hGTEFHX05PQVRJTUUgfCBMSU5VWF9YRkxBR19OT0RVTVAgfCBcCisJCQkgICAgICBMSU5VWF9YRkxBR19TWU5DKSkKKwkJCXJldHVybiAtWEZTX0VSUk9SKEVPUE5PVFNVUFApOworCisJCWF0dHJfZmxhZ3MgPSAwOworCQlpZiAoZmlscC0+Zl9mbGFncyAmIChPX05ERUxBWXxPX05PTkJMT0NLKSkKKwkJCWF0dHJfZmxhZ3MgfD0gQVRUUl9OT05CTE9DSzsKKworCQl2YS52YV9tYXNrID0gWEZTX0FUX1hGTEFHUzsKKwkJdmEudmFfeGZsYWdzID0geGZzX21lcmdlX2lvY194ZmxhZ3MoZmxhZ3MsCisJCQkJeGZzX2lwMnhmbGFncyhpcCkpOworCisJCVZPUF9TRVRBVFRSKHZwLCAmdmEsIGF0dHJfZmxhZ3MsIE5VTEwsIGVycm9yKTsKKwkJaWYgKCFlcnJvcikKKwkJCXZuX3JldmFsaWRhdGUodnApOwkvKiB1cGRhdGUgTGludXggaW5vZGUgZmxhZ3MgKi8KKwkJcmV0dXJuIC1lcnJvcjsKKwl9CisKKwljYXNlIFhGU19JT0NfR0VUVkVSU0lPTjogeworCQlmbGFncyA9IExJTlZGU19HRVRfSVAodnApLT5pX2dlbmVyYXRpb247CisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZmxhZ3MsIHNpemVvZihmbGFncykpKQorCQkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorfQorCitTVEFUSUMgaW50Cit4ZnNfaW9jX2dldGJtYXAoCisJYmh2X2Rlc2NfdAkJKmJkcCwKKwlzdHJ1Y3QgZmlsZQkJKmZpbHAsCisJaW50CQkJaW9mbGFncywKKwl1bnNpZ25lZCBpbnQJCWNtZCwKKwl2b2lkCQkJX191c2VyICphcmcpCit7CisJc3RydWN0IGdldGJtYXAJCWJtOworCWludAkJCWlmbGFnczsKKwlpbnQJCQllcnJvcjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmYm0sIGFyZywgc2l6ZW9mKGJtKSkpCisJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisKKwlpZiAoYm0uYm12X2NvdW50IDwgMikKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUlOVkFMKTsKKworCWlmbGFncyA9IChjbWQgPT0gWEZTX0lPQ19HRVRCTUFQQSA/IEJNVl9JRl9BVFRSRk9SSyA6IDApOworCWlmIChpb2ZsYWdzICYgSU9fSU5WSVMpCisJCWlmbGFncyB8PSBCTVZfSUZfTk9fRE1BUElfUkVBRDsKKworCWVycm9yID0geGZzX2dldGJtYXAoYmRwLCAmYm0sIChzdHJ1Y3QgZ2V0Ym1hcCBfX3VzZXIgKilhcmcrMSwgaWZsYWdzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiAtZXJyb3I7CisKKwlpZiAoY29weV90b191c2VyKGFyZywgJmJtLCBzaXplb2YoYm0pKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIGludAoreGZzX2lvY19nZXRibWFweCgKKwliaHZfZGVzY190CQkqYmRwLAorCXZvaWQJCQlfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgZ2V0Ym1hcHgJCWJteDsKKwlzdHJ1Y3QgZ2V0Ym1hcAkJYm07CisJaW50CQkJaWZsYWdzOworCWludAkJCWVycm9yOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZibXgsIGFyZywgc2l6ZW9mKGJteCkpKQorCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCisJaWYgKGJteC5ibXZfY291bnQgPCAyKQorCQlyZXR1cm4gLVhGU19FUlJPUihFSU5WQUwpOworCisJLyoKKwkgKiBNYXAgaW5wdXQgZ2V0Ym1hcHggc3RydWN0dXJlIHRvIGEgZ2V0Ym1hcAorCSAqIHN0cnVjdHVyZSBmb3IgeGZzX2dldGJtYXAuCisJICovCisJR0VUQk1BUF9DT05WRVJUKGJteCwgYm0pOworCisJaWZsYWdzID0gYm14LmJtdl9pZmxhZ3M7CisKKwlpZiAoaWZsYWdzICYgKH5CTVZfSUZfVkFMSUQpKQorCQlyZXR1cm4gLVhGU19FUlJPUihFSU5WQUwpOworCisJaWZsYWdzIHw9IEJNVl9JRl9FWFRFTkRFRDsKKworCWVycm9yID0geGZzX2dldGJtYXAoYmRwLCAmYm0sIChzdHJ1Y3QgZ2V0Ym1hcHggX191c2VyICopYXJnKzEsIGlmbGFncyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gLWVycm9yOworCisJR0VUQk1BUF9DT05WRVJUKGJtLCBibXgpOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZibXgsIHNpemVvZihibXgpKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMTJjODMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmMKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKKyNpbmNsdWRlICJ4ZnNfdmZzLmgiCisjaW5jbHVkZSAieGZzX3Zub2RlLmgiCisjaW5jbHVkZSAieGZzX2RmcmFnLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19JQTY0KSB8fCBkZWZpbmVkKENPTkZJR19YODZfNjQpCisjZGVmaW5lIEJST0tFTl9YODZfQUxJR05NRU5UCisjZWxzZQorCit0eXBlZGVmIHN0cnVjdCB4ZnNfZnNvcF9idWxrcmVxMzIgeworCWNvbXBhdF91cHRyX3QJbGFzdGlwOwkJLyogbGFzdCBpbm9kZSAjIHBvaW50ZXIJCSovCisJX19zMzIJCWljb3VudDsJCS8qIGNvdW50IG9mIGVudHJpZXMgaW4gYnVmZmVyCSovCisJY29tcGF0X3VwdHJfdAl1YnVmZmVyOwkvKiB1c2VyIGJ1ZmZlciBmb3IgaW5vZGUgZGVzYy4JKi8KKwlfX3MzMgkJb2NvdW50OwkJLyogb3V0cHV0IGNvdW50IHBvaW50ZXIJCSovCit9IHhmc19mc29wX2J1bGtyZXEzMl90OworCitzdGF0aWMgdW5zaWduZWQgbG9uZworeGZzX2lvY3RsMzJfYnVsa3N0YXQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJeGZzX2Zzb3BfYnVsa3JlcTMyX3QJX191c2VyICpwMzIgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJeGZzX2Zzb3BfYnVsa3JlcV90CV9fdXNlciAqcCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcCkpOworCXUzMgkJCWFkZHI7CisKKwlpZiAoZ2V0X3VzZXIoYWRkciwgJnAzMi0+bGFzdGlwKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKGFkZHIpLCAmcC0+bGFzdGlwKSB8fAorCSAgICBjb3B5X2luX3VzZXIoJnAtPmljb3VudCwgJnAzMi0+aWNvdW50LCBzaXplb2YoczMyKSkgfHwKKwkgICAgZ2V0X3VzZXIoYWRkciwgJnAzMi0+dWJ1ZmZlcikgfHwKKwkgICAgcHV0X3VzZXIoY29tcGF0X3B0cihhZGRyKSwgJnAtPnVidWZmZXIpIHx8CisJICAgIGdldF91c2VyKGFkZHIsICZwMzItPm9jb3VudCkgfHwKKwkgICAgcHV0X3VzZXIoY29tcGF0X3B0cihhZGRyKSwgJnAtPm9jb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuICh1bnNpZ25lZCBsb25nKXA7Cit9CisjZW5kaWYKKworc3RhdGljIGxvbmcKK19feGZzX2NvbXBhdF9pb2N0bChpbnQgbW9kZSwgc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50CQllcnJvcjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZi0+Zl9kZW50cnktPmRfaW5vZGU7CisJdm5vZGVfdAkJKnZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgWEZTX0lPQ19ESU9JTkZPOgorCWNhc2UgWEZTX0lPQ19GU0dFT01FVFJZX1YxOgorCWNhc2UgWEZTX0lPQ19GU0dFT01FVFJZOgorCWNhc2UgWEZTX0lPQ19HRVRWRVJTSU9OOgorCWNhc2UgWEZTX0lPQ19HRVRYRkxBR1M6CisJY2FzZSBYRlNfSU9DX1NFVFhGTEFHUzoKKwljYXNlIFhGU19JT0NfRlNHRVRYQVRUUjoKKwljYXNlIFhGU19JT0NfRlNTRVRYQVRUUjoKKwljYXNlIFhGU19JT0NfRlNHRVRYQVRUUkE6CisJY2FzZSBYRlNfSU9DX0ZTU0VURE06CisJY2FzZSBYRlNfSU9DX0dFVEJNQVA6CisJY2FzZSBYRlNfSU9DX0dFVEJNQVBBOgorCWNhc2UgWEZTX0lPQ19HRVRCTUFQWDoKKy8qIG5vdCBoYW5kbGVkCisJY2FzZSBYRlNfSU9DX0ZEX1RPX0hBTkRMRToKKwljYXNlIFhGU19JT0NfUEFUSF9UT19IQU5ETEU6CisJY2FzZSBYRlNfSU9DX1BBVEhfVE9fSEFORExFOgorCWNhc2UgWEZTX0lPQ19QQVRIX1RPX0ZTSEFORExFOgorCWNhc2UgWEZTX0lPQ19PUEVOX0JZX0hBTkRMRToKKwljYXNlIFhGU19JT0NfRlNTRVRETV9CWV9IQU5ETEU6CisJY2FzZSBYRlNfSU9DX1JFQURMSU5LX0JZX0hBTkRMRToKKwljYXNlIFhGU19JT0NfQVRUUkxJU1RfQllfSEFORExFOgorCWNhc2UgWEZTX0lPQ19BVFRSTVVMVElfQllfSEFORExFOgorKi8KKwljYXNlIFhGU19JT0NfRlNDT1VOVFM6CisJY2FzZSBYRlNfSU9DX1NFVF9SRVNCTEtTOgorCWNhc2UgWEZTX0lPQ19HRVRfUkVTQkxLUzoKKwljYXNlIFhGU19JT0NfRlNHUk9XRlNEQVRBOgorCWNhc2UgWEZTX0lPQ19GU0dST1dGU0xPRzoKKwljYXNlIFhGU19JT0NfRlNHUk9XRlNSVDoKKwljYXNlIFhGU19JT0NfRlJFRVpFOgorCWNhc2UgWEZTX0lPQ19USEFXOgorCWNhc2UgWEZTX0lPQ19HT0lOR0RPV046CisJY2FzZSBYRlNfSU9DX0VSUk9SX0lOSkVDVElPTjoKKwljYXNlIFhGU19JT0NfRVJST1JfQ0xFQVJBTEw6CisJCWJyZWFrOworCisjaWZuZGVmIEJST0tFTl9YODZfQUxJR05NRU5UCisJLyogeGZzX2Zsb2NrX3QgYW5kIHhmc19ic3RhdF90IGhhdmUgd3JvbmcgdTMyIHZzIHU2NCBhbGlnbm1lbnQgKi8KKwljYXNlIFhGU19JT0NfQUxMT0NTUDoKKwljYXNlIFhGU19JT0NfRlJFRVNQOgorCWNhc2UgWEZTX0lPQ19SRVNWU1A6CisJY2FzZSBYRlNfSU9DX1VOUkVTVlNQOgorCWNhc2UgWEZTX0lPQ19BTExPQ1NQNjQ6CisJY2FzZSBYRlNfSU9DX0ZSRUVTUDY0OgorCWNhc2UgWEZTX0lPQ19SRVNWU1A2NDoKKwljYXNlIFhGU19JT0NfVU5SRVNWU1A2NDoKKwljYXNlIFhGU19JT0NfU1dBUEVYVDoKKwkJYnJlYWs7CisKKwljYXNlIFhGU19JT0NfRlNCVUxLU1RBVF9TSU5HTEU6CisJY2FzZSBYRlNfSU9DX0ZTQlVMS1NUQVQ6CisJY2FzZSBYRlNfSU9DX0ZTSU5VTUJFUlM6CisJCWFyZyA9IHhmc19pb2N0bDMyX2J1bGtzdGF0KGFyZyk7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisKKwlWT1BfSU9DVEwodnAsIGlub2RlLCBmLCBtb2RlLCBjbWQsICh2b2lkIF9fdXNlciAqKWFyZywgZXJyb3IpOworCVZNT0RJRlkodnApOworCisJcmV0dXJuIGVycm9yOworfQorCitsb25nIHhmc19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIF9feGZzX2NvbXBhdF9pb2N0bCgwLCBmLCBjbWQsIGFyZyk7Cit9CisKK2xvbmcgeGZzX2NvbXBhdF9pbnZpc19pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gX194ZnNfY29tcGF0X2lvY3RsKElPX0lOVklTLCBmLCBjbWQsIGFyZyk7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5ZjY5YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsMzIuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworbG9uZyB4ZnNfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2xvbmcgeGZzX2NvbXBhdF9pbnZpc19pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA3ZTk5MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYwpAQCAtMCwwICsxLDY4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19mcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19xdW90YS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19pdGFibGUuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKyNpbmNsdWRlICJ4ZnNfYWNsLmgiCisjaW5jbHVkZSAieGZzX2NhcC5oIgorI2luY2x1ZGUgInhmc19tYWMuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0ci5oIgorI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgorI2luY2x1ZGUgInhmc191dGlscy5oIgorCisjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorCisKKy8qCisgKiBQdWxsIHRoZSBsaW5rIGNvdW50IGFuZCBzaXplIHVwIGZyb20gdGhlIHhmcyBpbm9kZSB0byB0aGUgbGludXggaW5vZGUKKyAqLworU1RBVElDIHZvaWQKK3ZhbGlkYXRlX2ZpZWxkcygKKwlzdHJ1Y3QgaW5vZGUJKmlwKQoreworCXZub2RlX3QJCSp2cCA9IExJTlZGU19HRVRfVlAoaXApOworCXZhdHRyX3QJCXZhOworCWludAkJZXJyb3I7CisKKwl2YS52YV9tYXNrID0gWEZTX0FUX05MSU5LfFhGU19BVF9TSVpFfFhGU19BVF9OQkxPQ0tTOworCVZPUF9HRVRBVFRSKHZwLCAmdmEsIEFUVFJfTEFaWSwgTlVMTCwgZXJyb3IpOworCWlmIChsaWtlbHkoIWVycm9yKSkgeworCQlpcC0+aV9ubGluayA9IHZhLnZhX25saW5rOworCQlpcC0+aV9ibG9ja3MgPSB2YS52YV9uYmxvY2tzOworCisJCS8qIHdlJ3JlIHVuZGVyIGlfc2VtIHNvIGlfc2l6ZSBjYW4ndCBjaGFuZ2UgdW5kZXIgdXMgKi8KKwkJaWYgKGlfc2l6ZV9yZWFkKGlwKSAhPSB2YS52YV9zaXplKQorCQkJaV9zaXplX3dyaXRlKGlwLCB2YS52YV9zaXplKTsKKwl9Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgd2hldGhlciBhIHByb2Nlc3MgaGFzIGEgdmFsaWQgZnNfc3RydWN0IChrZXJuZWwgZGFlbW9ucworICogbGlrZSBrbmZzZCBkb24ndCBoYXZlIGFuIGZzX3N0cnVjdCkuCisgKgorICogWFhYKGhjaCk6ICBuZnNkIGlzIGJyb2tlbiwgYmV0dGVyIGZpeCBpdCBpbnN0ZWFkLgorICovCitTVEFUSUMgaW5saW5lIGludAoraGFzX2ZzX3N0cnVjdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJcmV0dXJuICh0YXNrLT5mcyAhPSBpbml0X3Rhc2suZnMpOworfQorCitTVEFUSUMgaW50CitsaW52ZnNfbWtub2QoCisJc3RydWN0IGlub2RlCSpkaXIsCisJc3RydWN0IGRlbnRyeQkqZGVudHJ5LAorCWludAkJbW9kZSwKKwlkZXZfdAkJcmRldikKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlwOworCXZhdHRyX3QJCXZhOworCXZub2RlX3QJCSp2cCA9IE5VTEwsICpkdnAgPSBMSU5WRlNfR0VUX1ZQKGRpcik7CisJeGZzX2FjbF90CSpkZWZhdWx0X2FjbCA9IE5VTEw7CisJYXR0cmV4aXN0c190CXRlc3RfZGVmYXVsdF9hY2wgPSBfQUNMX0RFRkFVTFRfRVhJU1RTOworCWludAkJZXJyb3I7CisKKwkvKgorCSAqIElyaXggdXNlcyBNaXNzZWQnZW0nViBzcGxpdCwgYnV0IGRvZXNuJ3Qgd2FudCB0byBzZWUKKwkgKiB0aGUgdXBwZXIgNSBiaXRzIG9mICgxNGJpdCkgbWFqb3IuCisJICovCisJaWYgKCFzeXN2X3ZhbGlkX2RldihyZGV2KSB8fCBNQUpPUihyZGV2KSAmIH4weDFmZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGVzdF9kZWZhdWx0X2FjbCAmJiB0ZXN0X2RlZmF1bHRfYWNsKGR2cCkpIHsKKwkJaWYgKCFfQUNMX0FMTE9DKGRlZmF1bHRfYWNsKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoIV9BQ0xfR0VUX0RFRkFVTFQoZHZwLCBkZWZhdWx0X2FjbCkpIHsKKwkJCV9BQ0xfRlJFRShkZWZhdWx0X2FjbCk7CisJCQlkZWZhdWx0X2FjbCA9IE5VTEw7CisJCX0KKwl9CisKKwlpZiAoSVNfUE9TSVhBQ0woZGlyKSAmJiAhZGVmYXVsdF9hY2wgJiYgaGFzX2ZzX3N0cnVjdChjdXJyZW50KSkKKwkJbW9kZSAmPSB+Y3VycmVudC0+ZnMtPnVtYXNrOworCisJbWVtc2V0KCZ2YSwgMCwgc2l6ZW9mKHZhKSk7CisJdmEudmFfbWFzayA9IFhGU19BVF9UWVBFfFhGU19BVF9NT0RFOworCXZhLnZhX3R5cGUgPSBJRlRPVlQobW9kZSk7CisJdmEudmFfbW9kZSA9IG1vZGU7CisKKwlzd2l0Y2ggKG1vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZDSFI6IGNhc2UgU19JRkJMSzogY2FzZSBTX0lGSUZPOiBjYXNlIFNfSUZTT0NLOgorCQl2YS52YV9yZGV2ID0gc3lzdl9lbmNvZGVfZGV2KHJkZXYpOworCQl2YS52YV9tYXNrIHw9IFhGU19BVF9SREVWOworCQkvKkZBTExUSFJPVUdIKi8KKwljYXNlIFNfSUZSRUc6CisJCVZPUF9DUkVBVEUoZHZwLCBkZW50cnksICZ2YSwgJnZwLCBOVUxMLCBlcnJvcik7CisJCWJyZWFrOworCWNhc2UgU19JRkRJUjoKKwkJVk9QX01LRElSKGR2cCwgZGVudHJ5LCAmdmEsICZ2cCwgTlVMTCwgZXJyb3IpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJvciA9IEVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJaWYgKGRlZmF1bHRfYWNsKSB7CisJCWlmICghZXJyb3IpIHsKKwkJCWVycm9yID0gX0FDTF9JTkhFUklUKHZwLCAmdmEsIGRlZmF1bHRfYWNsKTsKKwkJCWlmICghZXJyb3IpIHsKKwkJCQlWTU9ESUZZKHZwKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IGRlbnRyeQl0ZWFyZG93biA9IHt9OworCQkJCWludAkJZXJyMjsKKworCQkJCS8qIE9oLCB0aGUgaG9ycm9yLgorCQkJCSAqIElmIHdlIGNhbid0IGFkZCB0aGUgQUNMIHdlIG11c3QgYmFjayBvdXQuCisJCQkJICogRU5PU1BDIGNhbiBoaXQgaGVyZSwgYW1vbmcgb3RoZXIgdGhpbmdzLgorCQkJCSAqLworCQkJCXRlYXJkb3duLmRfaW5vZGUgPSBpcCA9IExJTlZGU19HRVRfSVAodnApOworCQkJCXRlYXJkb3duLmRfbmFtZSA9IGRlbnRyeS0+ZF9uYW1lOworCisJCQkJdm5fbWFya19iYWQodnApOworCQkJCQorCQkJCWlmIChTX0lTRElSKG1vZGUpKQorCQkJCQlWT1BfUk1ESVIoZHZwLCAmdGVhcmRvd24sIE5VTEwsIGVycjIpOworCQkJCWVsc2UKKwkJCQkJVk9QX1JFTU9WRShkdnAsICZ0ZWFyZG93biwgTlVMTCwgZXJyMik7CisJCQkJVk5fUkVMRSh2cCk7CisJCQl9CisJCX0KKwkJX0FDTF9GUkVFKGRlZmF1bHRfYWNsKTsKKwl9CisKKwlpZiAoIWVycm9yKSB7CisJCUFTU0VSVCh2cCk7CisJCWlwID0gTElOVkZTX0dFVF9JUCh2cCk7CisKKwkJaWYgKFNfSVNDSFIobW9kZSkgfHwgU19JU0JMSyhtb2RlKSkKKwkJCWlwLT5pX3JkZXYgPSByZGV2OworCQllbHNlIGlmIChTX0lTRElSKG1vZGUpKQorCQkJdmFsaWRhdGVfZmllbGRzKGlwKTsKKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlwKTsKKwkJdmFsaWRhdGVfZmllbGRzKGRpcik7CisJfQorCXJldHVybiAtZXJyb3I7Cit9CisKK1NUQVRJQyBpbnQKK2xpbnZmc19jcmVhdGUoCisJc3RydWN0IGlub2RlCSpkaXIsCisJc3RydWN0IGRlbnRyeQkqZGVudHJ5LAorCWludAkJbW9kZSwKKwlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlyZXR1cm4gbGludmZzX21rbm9kKGRpciwgZGVudHJ5LCBtb2RlLCAwKTsKK30KKworU1RBVElDIGludAorbGludmZzX21rZGlyKAorCXN0cnVjdCBpbm9kZQkqZGlyLAorCXN0cnVjdCBkZW50cnkJKmRlbnRyeSwKKwlpbnQJCW1vZGUpCit7CisJcmV0dXJuIGxpbnZmc19ta25vZChkaXIsIGRlbnRyeSwgbW9kZXxTX0lGRElSLCAwKTsKK30KKworU1RBVElDIHN0cnVjdCBkZW50cnkgKgorbGludmZzX2xvb2t1cCgKKwlzdHJ1Y3QgaW5vZGUJKmRpciwKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnksCisJc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHZub2RlCSp2cCA9IExJTlZGU19HRVRfVlAoZGlyKSwgKmN2cDsKKwlpbnQJCWVycm9yOworCisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+PSBNQVhOQU1FTEVOKQorCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKKworCVZPUF9MT09LVVAodnAsIGRlbnRyeSwgJmN2cCwgMCwgTlVMTCwgTlVMTCwgZXJyb3IpOworCWlmIChlcnJvcikgeworCQlpZiAodW5saWtlbHkoZXJyb3IgIT0gRU5PRU5UKSkKKwkJCXJldHVybiBFUlJfUFRSKC1lcnJvcik7CisJCWRfYWRkKGRlbnRyeSwgTlVMTCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBkX3NwbGljZV9hbGlhcyhMSU5WRlNfR0VUX0lQKGN2cCksIGRlbnRyeSk7Cit9CisKK1NUQVRJQyBpbnQKK2xpbnZmc19saW5rKAorCXN0cnVjdCBkZW50cnkJKm9sZF9kZW50cnksCisJc3RydWN0IGlub2RlCSpkaXIsCisJc3RydWN0IGRlbnRyeQkqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZQkqaXA7CS8qIGlub2RlIG9mIGd1eSBiZWluZyBsaW5rZWQgdG8gKi8KKwl2bm9kZV90CQkqdGR2cDsJLyogdGFyZ2V0IGRpcmVjdG9yeSBmb3IgbmV3IG5hbWUvbGluayAqLworCXZub2RlX3QJCSp2cDsJLyogdnAgb2YgbmFtZSBiZWluZyBsaW5rZWQgKi8KKwlpbnQJCWVycm9yOworCisJaXAgPSBvbGRfZGVudHJ5LT5kX2lub2RlOwkvKiBpbm9kZSBiZWluZyBsaW5rZWQgdG8gKi8KKwlpZiAoU19JU0RJUihpcC0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXRkdnAgPSBMSU5WRlNfR0VUX1ZQKGRpcik7CisJdnAgPSBMSU5WRlNfR0VUX1ZQKGlwKTsKKworCVZPUF9MSU5LKHRkdnAsIHZwLCBkZW50cnksIE5VTEwsIGVycm9yKTsKKwlpZiAoIWVycm9yKSB7CisJCVZNT0RJRlkodGR2cCk7CisJCVZOX0hPTEQodnApOworCQl2YWxpZGF0ZV9maWVsZHMoaXApOworCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaXApOworCX0KKwlyZXR1cm4gLWVycm9yOworfQorCitTVEFUSUMgaW50CitsaW52ZnNfdW5saW5rKAorCXN0cnVjdCBpbm9kZQkqZGlyLAorCXN0cnVjdCBkZW50cnkJKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlOworCXZub2RlX3QJCSpkdnA7CS8qIGRpcmVjdG9yeSBjb250YWluaW5nIG5hbWUgdG8gcmVtb3ZlICovCisJaW50CQllcnJvcjsKKworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWR2cCA9IExJTlZGU19HRVRfVlAoZGlyKTsKKworCVZPUF9SRU1PVkUoZHZwLCBkZW50cnksIE5VTEwsIGVycm9yKTsKKwlpZiAoIWVycm9yKSB7CisJCXZhbGlkYXRlX2ZpZWxkcyhkaXIpOwkvKiBGb3Igc2l6ZSBvbmx5ICovCisJCXZhbGlkYXRlX2ZpZWxkcyhpbm9kZSk7CisJfQorCisJcmV0dXJuIC1lcnJvcjsKK30KKworU1RBVElDIGludAorbGludmZzX3N5bWxpbmsoCisJc3RydWN0IGlub2RlCSpkaXIsCisJc3RydWN0IGRlbnRyeQkqZGVudHJ5LAorCWNvbnN0IGNoYXIJKnN5bW5hbWUpCit7CisJc3RydWN0IGlub2RlCSppcDsKKwl2YXR0cl90CQl2YTsKKwl2bm9kZV90CQkqZHZwOwkvKiBkaXJlY3RvcnkgY29udGFpbmluZyBuYW1lIG9mIHN5bWxpbmsgKi8KKwl2bm9kZV90CQkqY3ZwOwkvKiB1c2VkIHRvIGxvb2t1cCBzeW1saW5rIHRvIHB1dCBpbiBkZW50cnkgKi8KKwlpbnQJCWVycm9yOworCisJZHZwID0gTElOVkZTX0dFVF9WUChkaXIpOworCWN2cCA9IE5VTEw7CisKKwltZW1zZXQoJnZhLCAwLCBzaXplb2YodmEpKTsKKwl2YS52YV90eXBlID0gVkxOSzsKKwl2YS52YV9tb2RlID0gaXJpeF9zeW1saW5rX21vZGUgPyAwNzc3ICYgfmN1cnJlbnQtPmZzLT51bWFzayA6IFNfSVJXWFVHTzsKKwl2YS52YV9tYXNrID0gWEZTX0FUX1RZUEV8WEZTX0FUX01PREU7CisKKwllcnJvciA9IDA7CisJVk9QX1NZTUxJTksoZHZwLCBkZW50cnksICZ2YSwgKGNoYXIgKilzeW1uYW1lLCAmY3ZwLCBOVUxMLCBlcnJvcik7CisJaWYgKCFlcnJvciAmJiBjdnApIHsKKwkJQVNTRVJUKGN2cC0+dl90eXBlID09IFZMTkspOworCQlpcCA9IExJTlZGU19HRVRfSVAoY3ZwKTsKKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlwKTsKKwkJdmFsaWRhdGVfZmllbGRzKGRpcik7CisJCXZhbGlkYXRlX2ZpZWxkcyhpcCk7IC8qIHNpemUgbmVlZHMgdXBkYXRlICovCisJfQorCXJldHVybiAtZXJyb3I7Cit9CisKK1NUQVRJQyBpbnQKK2xpbnZmc19ybWRpcigKKwlzdHJ1Y3QgaW5vZGUJKmRpciwKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnkpCit7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwl2bm9kZV90CQkqZHZwID0gTElOVkZTX0dFVF9WUChkaXIpOworCWludAkJZXJyb3I7CisKKwlWT1BfUk1ESVIoZHZwLCBkZW50cnksIE5VTEwsIGVycm9yKTsKKwlpZiAoIWVycm9yKSB7CisJCXZhbGlkYXRlX2ZpZWxkcyhpbm9kZSk7CisJCXZhbGlkYXRlX2ZpZWxkcyhkaXIpOworCX0KKwlyZXR1cm4gLWVycm9yOworfQorCitTVEFUSUMgaW50CitsaW52ZnNfcmVuYW1lKAorCXN0cnVjdCBpbm9kZQkqb2RpciwKKwlzdHJ1Y3QgZGVudHJ5CSpvZGVudHJ5LAorCXN0cnVjdCBpbm9kZQkqbmRpciwKKwlzdHJ1Y3QgZGVudHJ5CSpuZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZQkqbmV3X2lub2RlID0gbmRlbnRyeS0+ZF9pbm9kZTsKKwl2bm9kZV90CQkqZnZwOwkvKiBmcm9tIGRpcmVjdG9yeSAqLworCXZub2RlX3QJCSp0dnA7CS8qIHRhcmdldCBkaXJlY3RvcnkgKi8KKwlpbnQJCWVycm9yOworCisJZnZwID0gTElOVkZTX0dFVF9WUChvZGlyKTsKKwl0dnAgPSBMSU5WRlNfR0VUX1ZQKG5kaXIpOworCisJVk9QX1JFTkFNRShmdnAsIG9kZW50cnksIHR2cCwgbmRlbnRyeSwgTlVMTCwgZXJyb3IpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIC1lcnJvcjsKKworCWlmIChuZXdfaW5vZGUpCisJCXZhbGlkYXRlX2ZpZWxkcyhuZXdfaW5vZGUpOworCisJdmFsaWRhdGVfZmllbGRzKG9kaXIpOworCWlmIChuZGlyICE9IG9kaXIpCisJCXZhbGlkYXRlX2ZpZWxkcyhuZGlyKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNhcmVmdWwgaGVyZSAtIHRoaXMgZnVuY3Rpb24gY2FuIGdldCBjYWxsZWQgcmVjdXJzaXZlbHksIHNvCisgKiB3ZSBuZWVkIHRvIGJlIHZlcnkgY2FyZWZ1bCBhYm91dCBob3cgbXVjaCBzdGFjayB3ZSB1c2UuCisgKiB1aW8gaXMga21hbGxvY2VkIGZvciB0aGlzIHJlYXNvbi4uLgorICovCitTVEFUSUMgaW50CitsaW52ZnNfZm9sbG93X2xpbmsoCisJc3RydWN0IGRlbnRyeQkJKmRlbnRyeSwKKwlzdHJ1Y3QgbmFtZWlkYXRhCSpuZCkKK3sKKwl2bm9kZV90CQkJKnZwOworCXVpb190CQkJKnVpbzsKKwlpb3ZlY190CQkJaW92OworCWludAkJCWVycm9yOworCWNoYXIJCQkqbGluazsKKworCUFTU0VSVChkZW50cnkpOworCUFTU0VSVChuZCk7CisKKwlsaW5rID0gKGNoYXIgKilrbWFsbG9jKE1BWE5BTUVMRU4rMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsaW5rKSB7CisJCW5kX3NldF9saW5rKG5kLCBFUlJfUFRSKC1FTk9NRU0pKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdWlvID0gKHVpb190ICopa21hbGxvYyhzaXplb2YodWlvX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVpbykgeworCQlrZnJlZShsaW5rKTsKKwkJbmRfc2V0X2xpbmsobmQsIEVSUl9QVFIoLUVOT01FTSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwl2cCA9IExJTlZGU19HRVRfVlAoZGVudHJ5LT5kX2lub2RlKTsKKworCWlvdi5pb3ZfYmFzZSA9IGxpbms7CisJaW92Lmlvdl9sZW4gPSBNQVhOQU1FTEVOOworCisJdWlvLT51aW9faW92ID0gJmlvdjsKKwl1aW8tPnVpb19vZmZzZXQgPSAwOworCXVpby0+dWlvX3NlZ2ZsZyA9IFVJT19TWVNTUEFDRTsKKwl1aW8tPnVpb19yZXNpZCA9IE1BWE5BTUVMRU47CisJdWlvLT51aW9faW92Y250ID0gMTsKKworCVZPUF9SRUFETElOSyh2cCwgdWlvLCAwLCBOVUxMLCBlcnJvcik7CisJaWYgKGVycm9yKSB7CisJCWtmcmVlKGxpbmspOworCQlsaW5rID0gRVJSX1BUUigtZXJyb3IpOworCX0gZWxzZSB7CisJCWxpbmtbTUFYTkFNRUxFTiAtIHVpby0+dWlvX3Jlc2lkXSA9ICdcMCc7CisJfQorCWtmcmVlKHVpbyk7CisKKwluZF9zZXRfbGluayhuZCwgbGluayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxpbnZmc19wdXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWNoYXIgKnMgPSBuZF9nZXRfbGluayhuZCk7CisJaWYgKCFJU19FUlIocykpCisJCWtmcmVlKHMpOworfQorCisjaWZkZWYgQ09ORklHX1hGU19QT1NJWF9BQ0wKK1NUQVRJQyBpbnQKK2xpbnZmc19wZXJtaXNzaW9uKAorCXN0cnVjdCBpbm9kZQkqaW5vZGUsCisJaW50CQltb2RlLAorCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXZub2RlX3QJCSp2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOworCWludAkJZXJyb3I7CisKKwltb2RlIDw8PSA2OwkJLyogY29udmVydCBmcm9tIGxpbnV4IHRvIHZub2RlIGFjY2VzcyBiaXRzICovCisJVk9QX0FDQ0VTUyh2cCwgbW9kZSwgTlVMTCwgZXJyb3IpOworCXJldHVybiAtZXJyb3I7Cit9CisjZWxzZQorI2RlZmluZSBsaW52ZnNfcGVybWlzc2lvbiBOVUxMCisjZW5kaWYKKworU1RBVElDIGludAorbGludmZzX2dldGF0dHIoCisJc3RydWN0IHZmc21vdW50CSptbnQsCisJc3RydWN0IGRlbnRyeQkqZGVudHJ5LAorCXN0cnVjdCBrc3RhdAkqc3RhdCkKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXZub2RlX3QJCSp2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOworCWludAkJZXJyb3IgPSAwOworCisJaWYgKHVubGlrZWx5KHZwLT52X2ZsYWcgJiBWTU9ESUZJRUQpKQorCQllcnJvciA9IHZuX3JldmFsaWRhdGUodnApOworCWlmICghZXJyb3IpCisJCWdlbmVyaWNfZmlsbGF0dHIoaW5vZGUsIHN0YXQpOworCXJldHVybiAwOworfQorCitTVEFUSUMgaW50CitsaW52ZnNfc2V0YXR0cigKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnksCisJc3RydWN0IGlhdHRyCSphdHRyKQoreworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJdW5zaWduZWQgaW50CWlhX3ZhbGlkID0gYXR0ci0+aWFfdmFsaWQ7CisJdm5vZGVfdAkJKnZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CisJdmF0dHJfdAkJdmF0dHI7CisJaW50CQlmbGFncyA9IDA7CisJaW50CQllcnJvcjsKKworCW1lbXNldCgmdmF0dHIsIDAsIHNpemVvZih2YXR0cl90KSk7CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9VSUQpIHsKKwkJdmF0dHIudmFfbWFzayB8PSBYRlNfQVRfVUlEOworCQl2YXR0ci52YV91aWQgPSBhdHRyLT5pYV91aWQ7CisJfQorCWlmIChpYV92YWxpZCAmIEFUVFJfR0lEKSB7CisJCXZhdHRyLnZhX21hc2sgfD0gWEZTX0FUX0dJRDsKKwkJdmF0dHIudmFfZ2lkID0gYXR0ci0+aWFfZ2lkOworCX0KKwlpZiAoaWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKKwkJdmF0dHIudmFfbWFzayB8PSBYRlNfQVRfU0laRTsKKwkJdmF0dHIudmFfc2l6ZSA9IGF0dHItPmlhX3NpemU7CisJfQorCWlmIChpYV92YWxpZCAmIEFUVFJfQVRJTUUpIHsKKwkJdmF0dHIudmFfbWFzayB8PSBYRlNfQVRfQVRJTUU7CisJCXZhdHRyLnZhX2F0aW1lID0gYXR0ci0+aWFfYXRpbWU7CisJfQorCWlmIChpYV92YWxpZCAmIEFUVFJfTVRJTUUpIHsKKwkJdmF0dHIudmFfbWFzayB8PSBYRlNfQVRfTVRJTUU7CisJCXZhdHRyLnZhX210aW1lID0gYXR0ci0+aWFfbXRpbWU7CisJfQorCWlmIChpYV92YWxpZCAmIEFUVFJfQ1RJTUUpIHsKKwkJdmF0dHIudmFfbWFzayB8PSBYRlNfQVRfQ1RJTUU7CisJCXZhdHRyLnZhX2N0aW1lID0gYXR0ci0+aWFfY3RpbWU7CisJfQorCWlmIChpYV92YWxpZCAmIEFUVFJfTU9ERSkgeworCQl2YXR0ci52YV9tYXNrIHw9IFhGU19BVF9NT0RFOworCQl2YXR0ci52YV9tb2RlID0gYXR0ci0+aWFfbW9kZTsKKwkJaWYgKCFpbl9ncm91cF9wKGlub2RlLT5pX2dpZCkgJiYgIWNhcGFibGUoQ0FQX0ZTRVRJRCkpCisJCQlpbm9kZS0+aV9tb2RlICY9IH5TX0lTR0lEOworCX0KKworCWlmIChpYV92YWxpZCAmIChBVFRSX01USU1FX1NFVCB8IEFUVFJfQVRJTUVfU0VUKSkKKwkJZmxhZ3MgfD0gQVRUUl9VVElNRTsKKyNpZmRlZiBBVFRSX05PX0JMT0NLCisJaWYgKChpYV92YWxpZCAmIEFUVFJfTk9fQkxPQ0spKQorCQlmbGFncyB8PSBBVFRSX05PTkJMT0NLOworI2VuZGlmCisKKwlWT1BfU0VUQVRUUih2cCwgJnZhdHRyLCBmbGFncywgTlVMTCwgZXJyb3IpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIC1lcnJvcjsKKwl2bl9yZXZhbGlkYXRlKHZwKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK1NUQVRJQyB2b2lkCitsaW52ZnNfdHJ1bmNhdGUoCisJc3RydWN0IGlub2RlCSppbm9kZSkKK3sKKwlibG9ja190cnVuY2F0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGlub2RlLT5pX3NpemUsIGxpbnZmc19nZXRfYmxvY2spOworfQorCitTVEFUSUMgaW50CitsaW52ZnNfc2V0eGF0dHIoCisJc3RydWN0IGRlbnRyeQkqZGVudHJ5LAorCWNvbnN0IGNoYXIJKm5hbWUsCisJY29uc3Qgdm9pZAkqZGF0YSwKKwlzaXplX3QJCXNpemUsCisJaW50CQlmbGFncykKK3sKKwl2bm9kZV90CQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGRlbnRyeS0+ZF9pbm9kZSk7CisJY2hhcgkJKmF0dHIgPSAoY2hhciAqKW5hbWU7CisJYXR0cm5hbWVzX3QJKm5hbWVzcDsKKwlpbnQJCXhmbGFncyA9IDA7CisJaW50CQllcnJvcjsKKworCW5hbWVzcCA9IGF0dHJfbG9va3VwX25hbWVzcGFjZShhdHRyLCBhdHRyX25hbWVzcGFjZXMsIEFUVFJfTkFNRUNPVU5UKTsKKwlpZiAoIW5hbWVzcCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWF0dHIgKz0gbmFtZXNwLT5hdHRyX25hbWVsZW47CisJZXJyb3IgPSBuYW1lc3AtPmF0dHJfY2FwYWJsZSh2cCwgTlVMTCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwkvKiBDb252ZXJ0IExpbnV4IHN5c2NhbGwgdG8gWEZTIGludGVybmFsIEFUVFIgZmxhZ3MgKi8KKwlpZiAoZmxhZ3MgJiBYQVRUUl9DUkVBVEUpCisJCXhmbGFncyB8PSBBVFRSX0NSRUFURTsKKwlpZiAoZmxhZ3MgJiBYQVRUUl9SRVBMQUNFKQorCQl4ZmxhZ3MgfD0gQVRUUl9SRVBMQUNFOworCXhmbGFncyB8PSBuYW1lc3AtPmF0dHJfZmxhZzsKKwlyZXR1cm4gbmFtZXNwLT5hdHRyX3NldCh2cCwgYXR0ciwgKHZvaWQgKilkYXRhLCBzaXplLCB4ZmxhZ3MpOworfQorCitTVEFUSUMgc3NpemVfdAorbGludmZzX2dldHhhdHRyKAorCXN0cnVjdCBkZW50cnkJKmRlbnRyeSwKKwljb25zdCBjaGFyCSpuYW1lLAorCXZvaWQJCSpkYXRhLAorCXNpemVfdAkJc2l6ZSkKK3sKKwl2bm9kZV90CQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGRlbnRyeS0+ZF9pbm9kZSk7CisJY2hhcgkJKmF0dHIgPSAoY2hhciAqKW5hbWU7CisJYXR0cm5hbWVzX3QJKm5hbWVzcDsKKwlpbnQJCXhmbGFncyA9IDA7CisJc3NpemVfdAkJZXJyb3I7CisKKwluYW1lc3AgPSBhdHRyX2xvb2t1cF9uYW1lc3BhY2UoYXR0ciwgYXR0cl9uYW1lc3BhY2VzLCBBVFRSX05BTUVDT1VOVCk7CisJaWYgKCFuYW1lc3ApCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlhdHRyICs9IG5hbWVzcC0+YXR0cl9uYW1lbGVuOworCWVycm9yID0gbmFtZXNwLT5hdHRyX2NhcGFibGUodnAsIE5VTEwpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJLyogQ29udmVydCBMaW51eCBzeXNjYWxsIHRvIFhGUyBpbnRlcm5hbCBBVFRSIGZsYWdzICovCisJaWYgKCFzaXplKSB7CisJCXhmbGFncyB8PSBBVFRSX0tFUk5PVkFMOworCQlkYXRhID0gTlVMTDsKKwl9CisJeGZsYWdzIHw9IG5hbWVzcC0+YXR0cl9mbGFnOworCXJldHVybiBuYW1lc3AtPmF0dHJfZ2V0KHZwLCBhdHRyLCAodm9pZCAqKWRhdGEsIHNpemUsIHhmbGFncyk7Cit9CisKK1NUQVRJQyBzc2l6ZV90CitsaW52ZnNfbGlzdHhhdHRyKAorCXN0cnVjdCBkZW50cnkJCSpkZW50cnksCisJY2hhcgkJCSpkYXRhLAorCXNpemVfdAkJCXNpemUpCit7CisJdm5vZGVfdAkJCSp2cCA9IExJTlZGU19HRVRfVlAoZGVudHJ5LT5kX2lub2RlKTsKKwlpbnQJCQllcnJvciwgeGZsYWdzID0gQVRUUl9LRVJOQU1FTFM7CisJc3NpemVfdAkJCXJlc3VsdDsKKworCWlmICghc2l6ZSkKKwkJeGZsYWdzIHw9IEFUVFJfS0VSTk9WQUw7CisJeGZsYWdzIHw9IGNhcGFibGUoQ0FQX1NZU19BRE1JTikgPyBBVFRSX0tFUk5GVUxMUyA6IEFUVFJfS0VSTk9STUFMUzsKKworCWVycm9yID0gYXR0cl9nZW5lcmljX2xpc3QodnAsIGRhdGEsIHNpemUsIHhmbGFncywgJnJlc3VsdCk7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCXJldHVybiByZXN1bHQ7Cit9CisKK1NUQVRJQyBpbnQKK2xpbnZmc19yZW1vdmV4YXR0cigKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnksCisJY29uc3QgY2hhcgkqbmFtZSkKK3sKKwl2bm9kZV90CQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGRlbnRyeS0+ZF9pbm9kZSk7CisJY2hhcgkJKmF0dHIgPSAoY2hhciAqKW5hbWU7CisJYXR0cm5hbWVzX3QJKm5hbWVzcDsKKwlpbnQJCXhmbGFncyA9IDA7CisJaW50CQllcnJvcjsKKworCW5hbWVzcCA9IGF0dHJfbG9va3VwX25hbWVzcGFjZShhdHRyLCBhdHRyX25hbWVzcGFjZXMsIEFUVFJfTkFNRUNPVU5UKTsKKwlpZiAoIW5hbWVzcCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWF0dHIgKz0gbmFtZXNwLT5hdHRyX25hbWVsZW47CisJZXJyb3IgPSBuYW1lc3AtPmF0dHJfY2FwYWJsZSh2cCwgTlVMTCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJeGZsYWdzIHw9IG5hbWVzcC0+YXR0cl9mbGFnOworCXJldHVybiBuYW1lc3AtPmF0dHJfcmVtb3ZlKHZwLCBhdHRyLCB4ZmxhZ3MpOworfQorCisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGxpbnZmc19maWxlX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnBlcm1pc3Npb24JCT0gbGludmZzX3Blcm1pc3Npb24sCisJLnRydW5jYXRlCQk9IGxpbnZmc190cnVuY2F0ZSwKKwkuZ2V0YXR0cgkJPSBsaW52ZnNfZ2V0YXR0ciwKKwkuc2V0YXR0cgkJPSBsaW52ZnNfc2V0YXR0ciwKKwkuc2V0eGF0dHIJCT0gbGludmZzX3NldHhhdHRyLAorCS5nZXR4YXR0cgkJPSBsaW52ZnNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0cgkJPSBsaW52ZnNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgkJPSBsaW52ZnNfcmVtb3ZleGF0dHIsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBsaW52ZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmNyZWF0ZQkJCT0gbGludmZzX2NyZWF0ZSwKKwkubG9va3VwCQkJPSBsaW52ZnNfbG9va3VwLAorCS5saW5rCQkJPSBsaW52ZnNfbGluaywKKwkudW5saW5rCQkJPSBsaW52ZnNfdW5saW5rLAorCS5zeW1saW5rCQk9IGxpbnZmc19zeW1saW5rLAorCS5ta2RpcgkJCT0gbGludmZzX21rZGlyLAorCS5ybWRpcgkJCT0gbGludmZzX3JtZGlyLAorCS5ta25vZAkJCT0gbGludmZzX21rbm9kLAorCS5yZW5hbWUJCQk9IGxpbnZmc19yZW5hbWUsCisJLnBlcm1pc3Npb24JCT0gbGludmZzX3Blcm1pc3Npb24sCisJLmdldGF0dHIJCT0gbGludmZzX2dldGF0dHIsCisJLnNldGF0dHIJCT0gbGludmZzX3NldGF0dHIsCisJLnNldHhhdHRyCQk9IGxpbnZmc19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJCT0gbGludmZzX2dldHhhdHRyLAorCS5saXN0eGF0dHIJCT0gbGludmZzX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJCT0gbGludmZzX3JlbW92ZXhhdHRyLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbGludmZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZGxpbmsJCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJCT0gbGludmZzX2ZvbGxvd19saW5rLAorCS5wdXRfbGluawkJPSBsaW52ZnNfcHV0X2xpbmssCisJLnBlcm1pc3Npb24JCT0gbGludmZzX3Blcm1pc3Npb24sCisJLmdldGF0dHIJCT0gbGludmZzX2dldGF0dHIsCisJLnNldGF0dHIJCT0gbGludmZzX3NldGF0dHIsCisJLnNldHhhdHRyCQk9IGxpbnZmc19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJCT0gbGludmZzX2dldHhhdHRyLAorCS5saXN0eGF0dHIJCT0gbGludmZzX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJCT0gbGludmZzX3JlbW92ZXhhdHRyLAorfTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTY5YTYyCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0lPUFNfSF9fCisjZGVmaW5lIF9fWEZTX0lPUFNfSF9fCisKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBsaW52ZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGxpbnZmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBsaW52ZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsaW52ZnNfZmlsZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbGludmZzX2ludmlzX2ZpbGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxpbnZmc19kaXJfb3BlcmF0aW9uczsKKworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgbGludmZzX2FvcHM7CisKK2V4dGVybiBpbnQgbGludmZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgbGludmZzX3Vud3JpdHRlbl9kb25lKHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOworCitleHRlcm4gaW50IHhmc19pb2N0bChzdHJ1Y3QgYmh2X2Rlc2MgKiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQsIHVuc2lnbmVkIGludCwgdm9pZCBfX3VzZXIgKik7CisKKyNlbmRpZiAvKiBfX1hGU19JT1BTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbGludXguaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiYjQxMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xpbnV4LmgKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0xJTlVYX18KKyNkZWZpbmUgX19YRlNfTElOVVhfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworLyoKKyAqIFNvbWUgdHlwZXMgYXJlIGNvbmRpdGlvbmFsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IHN5c3RlbS4KKyAqIFhGU19CSUdfQkxLTk9TIG5lZWRzIGJsb2NrIGxheWVyIGRpc2sgYWRkcmVzc2VzIHRvIGJlIDY0IGJpdHMuCisgKiBYRlNfQklHX0lOVU1TIG5lZWRzIHRoZSBWRlMgaW5vZGUgbnVtYmVyIHRvIGJlIDY0IGJpdHMsIGFzIHdlbGwKKyAqIGFzIHJlcXVpcmluZyBYRlNfQklHX0JMS05PUyB0byBiZSBzZXQuCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19MQkQpIHx8IChCSVRTX1BFUl9MT05HID09IDY0KQorIyBkZWZpbmUgWEZTX0JJR19CTEtOT1MJMQorIyBpZiBCSVRTX1BFUl9MT05HID09IDY0CisjICBkZWZpbmUgWEZTX0JJR19JTlVNUwkxCisjIGVsc2UKKyMgIGRlZmluZSBYRlNfQklHX0lOVU1TCTAKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBYRlNfQklHX0JMS05PUwkwCisjIGRlZmluZSBYRlNfQklHX0lOVU1TCTAKKyNlbmRpZgorCisjaW5jbHVkZSA8eGZzX3R5cGVzLmg+CisjaW5jbHVkZSA8eGZzX2FyY2guaD4KKworI2luY2x1ZGUgPGttZW0uaD4KKyNpbmNsdWRlIDxtcmxvY2suaD4KKyNpbmNsdWRlIDxzcGluLmg+CisjaW5jbHVkZSA8c3YuaD4KKyNpbmNsdWRlIDxtdXRleC5oPgorI2luY2x1ZGUgPHNlbWEuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlIDxzdXBwb3J0L3Fzb3J0Lmg+CisjaW5jbHVkZSA8c3VwcG9ydC9rdHJhY2UuaD4KKyNpbmNsdWRlIDxzdXBwb3J0L2RlYnVnLmg+CisjaW5jbHVkZSA8c3VwcG9ydC9tb3ZlLmg+CisjaW5jbHVkZSA8c3VwcG9ydC91dWlkLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zb3J0Lmg+CisKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworI2luY2x1ZGUgPHhmc19iZWhhdmlvci5oPgorI2luY2x1ZGUgPHhmc192ZnMuaD4KKyNpbmNsdWRlIDx4ZnNfY3JlZC5oPgorI2luY2x1ZGUgPHhmc192bm9kZS5oPgorI2luY2x1ZGUgPHhmc19zdGF0cy5oPgorI2luY2x1ZGUgPHhmc19zeXNjdGwuaD4KKyNpbmNsdWRlIDx4ZnNfaW9wcy5oPgorI2luY2x1ZGUgPHhmc19zdXBlci5oPgorI2luY2x1ZGUgPHhmc19nbG9iYWxzLmg+CisjaW5jbHVkZSA8eGZzX2ZzX3N1YnIuaD4KKyNpbmNsdWRlIDx4ZnNfbHJ3Lmg+CisjaW5jbHVkZSA8eGZzX2J1Zi5oPgorCisvKgorICogRmVhdHVyZSBtYWNyb3MgKGRpc2FibGUvZW5hYmxlKQorICovCisjdW5kZWYgIEhBVkVfUkVGQ0FDSEUJLyogcmVmZXJlbmNlIGNhY2hlIG5vdCBuZWVkZWQgZm9yIE5GUyBpbiAyLjYgKi8KKyNkZWZpbmUgSEFWRV9TRU5ERklMRQkvKiBzZW5kZmlsZSgyKSBleGlzdHMgaW4gMi42LCBidXQgbm90IGluIDIuNCAqLworCisvKgorICogU3RhdGUgZmxhZyBmb3IgdW53cml0dGVuIGV4dGVudCBidWZmZXJzLgorICoKKyAqIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZXNlIGFuZCBkZWxheWVkCisgKiBhbGxvY2F0ZSBidWZmZXJzIHdpdGhpbiBYRlMuICBUaGUgZ2VuZXJpYyBJTyBwYXRoIGNvZGUgZG9lcworICogbm90IG5lZWQgdG8gZGlzdGluZ3Vpc2ggLSB3ZSB1c2UgdGhlIEJIX0RlbGF5IGZsYWcgZm9yIGJvdGgKKyAqIGRlbGFsbG9jIGFuZCB0aGVzZSBvbmRpc2stdW5pbml0aWFsaXNlZCBidWZmZXJzLgorICovCitCVUZGRVJfRk5TKFByaXZhdGVTdGFydCwgdW53cml0dGVuKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYnVmZmVyX3Vud3JpdHRlbl9pbyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWJoLT5iX2VuZF9pbyA9IGxpbnZmc191bndyaXR0ZW5fZG9uZTsKK30KKworI2RlZmluZSByZXN0cmljdGVkX2Nob3duCXhmc19wYXJhbXMucmVzdHJpY3RfY2hvd24udmFsCisjZGVmaW5lIGlyaXhfc2dpZF9pbmhlcml0CXhmc19wYXJhbXMuc2dpZF9pbmhlcml0LnZhbAorI2RlZmluZSBpcml4X3N5bWxpbmtfbW9kZQl4ZnNfcGFyYW1zLnN5bWxpbmtfbW9kZS52YWwKKyNkZWZpbmUgeGZzX3BhbmljX21hc2sJCXhmc19wYXJhbXMucGFuaWNfbWFzay52YWwKKyNkZWZpbmUgeGZzX2Vycm9yX2xldmVsCQl4ZnNfcGFyYW1zLmVycm9yX2xldmVsLnZhbAorI2RlZmluZSB4ZnNfc3luY2RfY2VudGlzZWNzCXhmc19wYXJhbXMuc3luY2RfdGltZXIudmFsCisjZGVmaW5lIHhmc19zdGF0c19jbGVhcgkJeGZzX3BhcmFtcy5zdGF0c19jbGVhci52YWwKKyNkZWZpbmUgeGZzX2luaGVyaXRfc3luYwl4ZnNfcGFyYW1zLmluaGVyaXRfc3luYy52YWwKKyNkZWZpbmUgeGZzX2luaGVyaXRfbm9kdW1wCXhmc19wYXJhbXMuaW5oZXJpdF9ub2R1bXAudmFsCisjZGVmaW5lIHhmc19pbmhlcml0X25vYXRpbWUJeGZzX3BhcmFtcy5pbmhlcml0X25vYXRpbS52YWwKKyNkZWZpbmUgeGZzX2J1Zl90aW1lcl9jZW50aXNlY3MJeGZzX3BhcmFtcy54ZnNfYnVmX3RpbWVyLnZhbAorI2RlZmluZSB4ZnNfYnVmX2FnZV9jZW50aXNlY3MJeGZzX3BhcmFtcy54ZnNfYnVmX2FnZS52YWwKKyNkZWZpbmUgeGZzX2luaGVyaXRfbm9zeW1saW5rcwl4ZnNfcGFyYW1zLmluaGVyaXRfbm9zeW0udmFsCisjZGVmaW5lIHhmc19yb3RvcnN0ZXAJCXhmc19wYXJhbXMucm90b3JzdGVwLnZhbAorCisjaWZuZGVmIF9fc21wX3Byb2Nlc3Nvcl9pZAorI2RlZmluZSBfX3NtcF9wcm9jZXNzb3JfaWQoKQlzbXBfcHJvY2Vzc29yX2lkKCkKKyNlbmRpZgorI2RlZmluZSBjdXJyZW50X2NwdSgpCQlfX3NtcF9wcm9jZXNzb3JfaWQoKQorI2RlZmluZSBjdXJyZW50X3BpZCgpCQkoY3VycmVudC0+cGlkKQorI2RlZmluZSBjdXJyZW50X2ZzdWlkKGNyZWQpCShjdXJyZW50LT5mc3VpZCkKKyNkZWZpbmUgY3VycmVudF9mc2dpZChjcmVkKQkoY3VycmVudC0+ZnNnaWQpCisKKyNkZWZpbmUgTkJQUAkJUEFHRV9TSVpFCisjZGVmaW5lIERQUFNIRlQJCShQQUdFX1NISUZUIC0gOSkKKyNkZWZpbmUgTkRQUAkJKDEgPDwgKFBBR0VfU0hJRlQgLSA5KSkKKyNkZWZpbmUgZHRvcChERCkJKCgoREQpICsgTkRQUCAtIDEpID4+IERQUFNIRlQpCisjZGVmaW5lIGR0b3B0KEREKQkoKEREKSA+PiBEUFBTSEZUKQorI2RlZmluZSBkcG9mZihERCkJKChERCkgJiAoTkRQUC0xKSkKKworI2RlZmluZSBOQkJZCQk4CQkvKiBudW1iZXIgb2YgYml0cyBwZXIgYnl0ZSAqLworI2RlZmluZQlOQlBDCQlQQUdFX1NJWkUJLyogTnVtYmVyIG9mIGJ5dGVzIHBlciBjbGljayAqLworI2RlZmluZQlCUENTSElGVAlQQUdFX1NISUZUCS8qIExPRzIoTkJQQykgaWYgZXhhY3QgKi8KKworLyoKKyAqIFNpemUgb2YgYmxvY2sgZGV2aWNlIGkvbyBpcyBwYXJhbWV0ZXJpemVkIGhlcmUuCisgKiBDdXJyZW50bHkgdGhlIHN5c3RlbSBzdXBwb3J0cyBwYWdlLXNpemVkIGkvby4KKyAqLworI2RlZmluZQlCTEtERVZfSU9TSElGVAkJQlBDU0hJRlQKKyNkZWZpbmUJQkxLREVWX0lPU0laRQkJKDE8PEJMS0RFVl9JT1NISUZUKQorLyogbnVtYmVyIG9mIEJCJ3MgcGVyIGJsb2NrIGRldmljZSBibG9jayAqLworI2RlZmluZQlCTEtERVZfQkIJCUJUT0JCKEJMS0RFVl9JT1NJWkUpCisKKy8qIGJ5dGVzIHRvIGNsaWNrcyAqLworI2RlZmluZQlidG9jKHgpCQkoKChfX3BzdW5zaWduZWRfdCkoeCkrKE5CUEMtMSkpPj5CUENTSElGVCkKKyNkZWZpbmUJYnRvY3QoeCkJKChfX3BzdW5zaWduZWRfdCkoeCk+PkJQQ1NISUZUKQorI2RlZmluZQlidG9jNjQoeCkJKCgoX191aW50NjRfdCkoeCkrKE5CUEMtMSkpPj5CUENTSElGVCkKKyNkZWZpbmUJYnRvY3Q2NCh4KQkoKF9fdWludDY0X3QpKHgpPj5CUENTSElGVCkKKyNkZWZpbmUJaW9fYnRvYyh4KQkoKChfX3BzdW5zaWduZWRfdCkoeCkrKElPX05CUEMtMSkpPj5JT19CUENTSElGVCkKKyNkZWZpbmUJaW9fYnRvY3QoeCkJKChfX3BzdW5zaWduZWRfdCkoeCk+PklPX0JQQ1NISUZUKQorCisvKiBvZmZfdCBieXRlcyB0byBjbGlja3MgKi8KKyNkZWZpbmUgb2ZmdG9jKHgpICAgICAgICgoKF9fdWludDY0X3QpKHgpKyhOQlBDLTEpKT4+QlBDU0hJRlQpCisjZGVmaW5lIG9mZnRvY3QoeCkgICAgICAoKHhmc19vZmZfdCkoeCk+PkJQQ1NISUZUKQorCisvKiBjbGlja3MgdG8gb2ZmX3QgYnl0ZXMgKi8KKyNkZWZpbmUJY3Rvb2ZmKHgpCSgoeGZzX29mZl90KSh4KTw8QlBDU0hJRlQpCisKKy8qIGNsaWNrcyB0byBieXRlcyAqLworI2RlZmluZQljdG9iKHgpCQkoKF9fcHN1bnNpZ25lZF90KSh4KTw8QlBDU0hJRlQpCisjZGVmaW5lIGJ0b2N0KHgpICAgICAgICAoKF9fcHN1bnNpZ25lZF90KSh4KT4+QlBDU0hJRlQpCisjZGVmaW5lCWN0b2I2NCh4KQkoKF9fdWludDY0X3QpKHgpPDxCUENTSElGVCkKKyNkZWZpbmUJaW9fY3RvYih4KQkoKF9fcHN1bnNpZ25lZF90KSh4KTw8SU9fQlBDU0hJRlQpCisKKy8qIGJ5dGVzIHRvIGNsaWNrcyAqLworI2RlZmluZSBidG9jKHgpICAgICAgICAgKCgoX19wc3Vuc2lnbmVkX3QpKHgpKyhOQlBDLTEpKT4+QlBDU0hJRlQpCisKKyNpZm5kZWYgQ0VMTF9DQVBBQkxFCisjZGVmaW5lIEZTQ19OT1RJRllfTkFNRV9DSEFOR0VEKHZwKQorI2VuZGlmCisKKyNpZm5kZWYgRU5PQVRUUgorI2RlZmluZSBFTk9BVFRSCQlFTk9EQVRBCQkvKiBBdHRyaWJ1dGUgbm90IGZvdW5kICovCisjZW5kaWYKKworLyogTm90ZTogRVdST05HRlMgbmV2ZXIgdmlzaWJsZSBvdXRzaWRlIHRoZSBrZXJuZWwgKi8KKyNkZWZpbmUJRVdST05HRlMJRUlOVkFMCQkvKiBNb3VudCB3aXRoIHdyb25nIGZpbGVzeXN0ZW0gdHlwZSAqLworCisvKgorICogWFhYIEVGU0NPUlJVUFRFRCBuZWVkcyBhIHJlYWwgdmFsdWUgaW4gZXJybm8uaC4gYXNtLWkzODYvZXJybm8uaCB3b24ndAorICogICAgIHJldHVybiBjb2RlcyBvdXQgb2YgaXRzIGtub3duIHJhbmdlIGluIGVycm5vLgorICogWFhYIEFsc28gbm90ZTogbmVlZHMgdG8gYmUgPCAxMDAwIGFuZCBmYWlybHkgdW5pcXVlIG9uIExpbnV4IChtdXN0bid0CisgKiAgICAgY29uZmxpY3Qgd2l0aCBhbnkgY29kZSB3ZSB1c2UgYWxyZWFkeSBvciBhbnkgY29kZSBhIGRyaXZlciBtYXkgdXNlKQorICogWFhYIFNvbWUgb3B0aW9ucyAoY3VycmVudGx5IHdlIGRvICMyKToKKyAqCTEvIE5ldyBlcnJvciBjb2RlIFsiRmlsZXN5c3RlbSBpcyBjb3JydXB0ZWQiLCBfYWZ0ZXJfIGdsaWJjIHVwZGF0ZWRdCisgKgkyLyA5OTAgWyJVbmtub3duIGVycm9yIDk5MCJdCisgKgkzLyBFVUNMRUFOIFsiU3RydWN0dXJlIG5lZWRzIGNsZWFuaW5nIl0KKyAqCTQvIENvbnZlcnQgRUZTQ09SUlVQVEVEIHRvIEVJTyBbanVzdCBwcmlvciB0byByZXR1cm4gaW50byB1c2Vyc3BhY2VdCisgKi8KKyNkZWZpbmUgRUZTQ09SUlVQVEVEICAgIDk5MAkJLyogRmlsZXN5c3RlbSBpcyBjb3JydXB0ZWQgKi8KKworI2RlZmluZSBTWU5DSFJPTklaRSgpCWJhcnJpZXIoKQorI2RlZmluZSBfX3JldHVybl9hZGRyZXNzIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKQorCisvKgorICogSVJJWCAoQlNEKSBxdW90YWN0bCBtYWtlcyB1c2Ugb2Ygc2VwYXJhdGUgY29tbWFuZHMgZm9yIHVzZXIvZ3JvdXAsCisgKiB3aGVyZWFzIG9uIExpbnV4IHRoZSBzeXNjYWxsIGVuY29kZXMgdGhpcyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBjbWQKKyAqIGZpZWxkIChzZWUgdGhlIFFDTUQgbWFjcm8gaW4gcXVvdGEuaCkuICBUaGVzZSBtYWNyb3MgaGVscCBrZWVwIHRoZQorICogY29kZSBwb3J0YWJsZSAtIHRoZXkgYXJlIG5vdCB2aXNpYmxlIGZyb20gdGhlIHN5c2NhbGwgaW50ZXJmYWNlLgorICovCisjZGVmaW5lIFFfWFNFVEdRTElNCVhRTV9DTUQoMHg4KQkvKiBzZXQgZ3JvdXBzIGRpc2sgbGltaXRzICovCisjZGVmaW5lIFFfWEdFVEdRVU9UQQlYUU1fQ01EKDB4OSkJLyogZ2V0IGdyb3VwcyBkaXNrIGxpbWl0cyAqLworCisvKiBJUklYIHVzZXMgYSBkeW5hbWljIHNpemluZyBhbGdvcml0aG0gKG5kcXVvdCA9IDIwMCArIG51bXByb2NzKjIpICovCisvKiB3ZSBtYXkgd2VsbCBuZWVkIHRvIGZpbmUtdHVuZSB0aGlzIGlmIGl0IGV2ZXIgYmVjb21lcyBhbiBpc3N1ZS4gICovCisjZGVmaW5lIERRVU9UX01BWF9IRVVSSVNUSUMJMTAyNAkvKiBOUl9EUVVPVFMgKi8KKyNkZWZpbmUgbmRxdW90CQkJRFFVT1RfTUFYX0hFVVJJU1RJQworCisvKiBJUklYIHVzZXMgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgbmFtZSBjYWNoZSB0byBndWVzcyBhIGdvb2QgdmFsdWUgKi8KKy8qIC0gdGhpcyBpc24ndCB0aGUgc2FtZSBidXQgaXMgYSBnb29kIGVub3VnaCBzdGFydGluZyBwb2ludCBmb3Igbm93LiAqLworI2RlZmluZSBEUVVPVF9IQVNIX0hFVVJJU1RJQwlmaWxlc19zdGF0Lm5yX2ZpbGVzCisKKy8qIElSSVggaW5vZGVzIG1haW50YWluIHRoZSBwcm9qZWN0IElEIGFsc28sIHplcm8gdGhpcyBmaWVsZCBvbiBMaW51eCAqLworI2RlZmluZSBERUZBVUxUX1BST0pJRAkwCisjZGVmaW5lIGRmbHRwcmlkCURFRkFVTFRfUFJPSklECisKKyNkZWZpbmUgTUFYUEFUSExFTgkxMDI0CisKKyNkZWZpbmUgTUlOKGEsYikJKG1pbihhLGIpKQorI2RlZmluZSBNQVgoYSxiKQkobWF4KGEsYikpCisjZGVmaW5lIGhvd21hbnkoeCwgeSkJKCgoeCkrKCh5KS0xKSkvKHkpKQorI2RlZmluZSByb3VuZHVwKHgsIHkpCSgoKCh4KSsoKHkpLTEpKS8oeSkpKih5KSkKKworI2RlZmluZSB4ZnNfc3RhY2tfdHJhY2UoKQlkdW1wX3N0YWNrKCkKKworI2RlZmluZSB4ZnNfaXRydW5jYXRlX2RhdGEoaXAsIG9mZikJXAorCSgtdm10cnVuY2F0ZShMSU5WRlNfR0VUX0lQKFhGU19JVE9WKGlwKSksIChvZmYpKSkKKworCisvKiBNb3ZlIHRoZSBrZXJuZWwgZG9fZGl2IGRlZmluaXRpb24gb2ZmIHRvIG9uZSBzaWRlICovCisKKyNpZiBkZWZpbmVkIF9faTM4Nl9fCisvKiBGb3IgaWEzMiB3ZSBuZWVkIHRvIHB1bGwgc29tZSB0cmlja3MgdG8gZ2V0IHBhc3QgdmFyaW91cyB2ZXJzaW9ucworICogb2YgdGhlIGNvbXBpbGVyIHdoaWNoIGRvIG5vdCBsaWtlIHVzIHVzaW5nIGRvX2RpdiBpbiB0aGUgbWlkZGxlCisgKiBvZiBsYXJnZSBmdW5jdGlvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgX191MzIgeGZzX2RvX2Rpdih2b2lkICphLCBfX3UzMiBiLCBpbnQgbikKK3sKKwlfX3UzMgltb2Q7CisKKwlzd2l0Y2ggKG4pIHsKKwkJY2FzZSA0OgorCQkJbW9kID0gKihfX3UzMiAqKWEgJSBiOworCQkJKihfX3UzMiAqKWEgPSAqKF9fdTMyICopYSAvIGI7CisJCQlyZXR1cm4gbW9kOworCQljYXNlIDg6CisJCQl7CisJCQl1bnNpZ25lZCBsb25nIF9fdXBwZXIsIF9fbG93LCBfX2hpZ2gsIF9fbW9kOworCQkJX191NjQJYyA9ICooX191NjQgKilhOworCQkJX191cHBlciA9IF9faGlnaCA9IGMgPj4gMzI7CisJCQlfX2xvdyA9IGM7CisJCQlpZiAoX19oaWdoKSB7CisJCQkJX191cHBlciA9IF9faGlnaCAlIChiKTsKKwkJCQlfX2hpZ2ggPSBfX2hpZ2ggLyAoYik7CisJCQl9CisJCQlhc20oImRpdmwgJTIiOiI9YSIgKF9fbG93KSwgIj1kIiAoX19tb2QpOiJybSIgKGIpLCAiMCIgKF9fbG93KSwgIjEiIChfX3VwcGVyKSk7CisJCQlhc20oIiI6Ij1BIiAoYyk6ImEiIChfX2xvdyksImQiIChfX2hpZ2gpKTsKKwkJCSooX191NjQgKilhID0gYzsKKwkJCXJldHVybiBfX21vZDsKKwkJCX0KKwl9CisKKwkvKiBOT1RSRUFDSEVEICovCisJcmV0dXJuIDA7Cit9CisKKy8qIFNpZGUgZWZmZWN0IGZyZWUgNjQgYml0IG1vZCBvcGVyYXRpb24gKi8KK3N0YXRpYyBpbmxpbmUgX191MzIgeGZzX2RvX21vZCh2b2lkICphLCBfX3UzMiBiLCBpbnQgbikKK3sKKwlzd2l0Y2ggKG4pIHsKKwkJY2FzZSA0OgorCQkJcmV0dXJuICooX191MzIgKilhICUgYjsKKwkJY2FzZSA4OgorCQkJeworCQkJdW5zaWduZWQgbG9uZyBfX3VwcGVyLCBfX2xvdywgX19oaWdoLCBfX21vZDsKKwkJCV9fdTY0CWMgPSAqKF9fdTY0ICopYTsKKwkJCV9fdXBwZXIgPSBfX2hpZ2ggPSBjID4+IDMyOworCQkJX19sb3cgPSBjOworCQkJaWYgKF9faGlnaCkgeworCQkJCV9fdXBwZXIgPSBfX2hpZ2ggJSAoYik7CisJCQkJX19oaWdoID0gX19oaWdoIC8gKGIpOworCQkJfQorCQkJYXNtKCJkaXZsICUyIjoiPWEiIChfX2xvdyksICI9ZCIgKF9fbW9kKToicm0iIChiKSwgIjAiIChfX2xvdyksICIxIiAoX191cHBlcikpOworCQkJYXNtKCIiOiI9QSIgKGMpOiJhIiAoX19sb3cpLCJkIiAoX19oaWdoKSk7CisJCQlyZXR1cm4gX19tb2Q7CisJCQl9CisJfQorCisJLyogTk9UUkVBQ0hFRCAqLworCXJldHVybiAwOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgX191MzIgeGZzX2RvX2Rpdih2b2lkICphLCBfX3UzMiBiLCBpbnQgbikKK3sKKwlfX3UzMgltb2Q7CisKKwlzd2l0Y2ggKG4pIHsKKwkJY2FzZSA0OgorCQkJbW9kID0gKihfX3UzMiAqKWEgJSBiOworCQkJKihfX3UzMiAqKWEgPSAqKF9fdTMyICopYSAvIGI7CisJCQlyZXR1cm4gbW9kOworCQljYXNlIDg6CisJCQltb2QgPSBkb19kaXYoKihfX3U2NCAqKWEsIGIpOworCQkJcmV0dXJuIG1vZDsKKwl9CisKKwkvKiBOT1RSRUFDSEVEICovCisJcmV0dXJuIDA7Cit9CisKKy8qIFNpZGUgZWZmZWN0IGZyZWUgNjQgYml0IG1vZCBvcGVyYXRpb24gKi8KK3N0YXRpYyBpbmxpbmUgX191MzIgeGZzX2RvX21vZCh2b2lkICphLCBfX3UzMiBiLCBpbnQgbikKK3sKKwlzd2l0Y2ggKG4pIHsKKwkJY2FzZSA0OgorCQkJcmV0dXJuICooX191MzIgKilhICUgYjsKKwkJY2FzZSA4OgorCQkJeworCQkJX191NjQJYyA9ICooX191NjQgKilhOworCQkJcmV0dXJuIGRvX2RpdihjLCBiKTsKKwkJCX0KKwl9CisKKwkvKiBOT1RSRUFDSEVEICovCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI3VuZGVmIGRvX2RpdgorI2RlZmluZSBkb19kaXYoYSwgYikJeGZzX2RvX2RpdigmKGEpLCAoYiksIHNpemVvZihhKSkKKyNkZWZpbmUgZG9fbW9kKGEsIGIpCXhmc19kb19tb2QoJihhKSwgKGIpLCBzaXplb2YoYSkpCisKK3N0YXRpYyBpbmxpbmUgX191aW50NjRfdCByb3VuZHVwXzY0KF9fdWludDY0X3QgeCwgX191aW50MzJfdCB5KQoreworCXggKz0geSAtIDE7CisJZG9fZGl2KHgsIHkpOworCXJldHVybih4ICogeSk7Cit9CisKKyNkZWZpbmUgcXNvcnQoYSwgbiwgcywgY21wKSBzb3J0KGEsIG4sIHMsIGNtcCwgTlVMTCkKKworI2VuZGlmIC8qIF9fWEZTX0xJTlVYX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYxNDVmZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5jCkBAIC0wLDAgKzEsMTA4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKy8qCisgKiAgZnMveGZzL2xpbnV4L3hmc19scncuYyAoTGludXggUmVhZCBXcml0ZSBzdHVmZikKKyAqCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorCisjaW5jbHVkZSAieGZzX2ZzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX3F1b3RhLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgInhmc19hY2wuaCIKKyNpbmNsdWRlICJ4ZnNfY2FwLmgiCisjaW5jbHVkZSAieGZzX21hYy5oIgorI2luY2x1ZGUgInhmc19hdHRyLmgiCisjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfdXRpbHMuaCIKKyNpbmNsdWRlICJ4ZnNfaW9tYXAuaCIKKworI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKworCisjaWYgZGVmaW5lZChYRlNfUldfVFJBQ0UpCit2b2lkCit4ZnNfcndfZW50ZXJfdHJhY2UoCisJaW50CQkJdGFnLAorCXhmc19pb2NvcmVfdAkJKmlvLAorCXZvaWQJCQkqZGF0YSwKKwlzaXplX3QJCQlzZWdzLAorCWxvZmZfdAkJCW9mZnNldCwKKwlpbnQJCQlpb2ZsYWdzKQoreworCXhmc19pbm9kZV90CSppcCA9IFhGU19JT19JTk9ERShpbyk7CisKKwlpZiAoaXAtPmlfcnd0cmFjZSA9PSBOVUxMKQorCQlyZXR1cm47CisJa3RyYWNlX2VudGVyKGlwLT5pX3J3dHJhY2UsCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpdGFnLAorCQkodm9pZCAqKWlwLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoKGlwLT5pX2QuZGlfc2l6ZSA+PiAzMikgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShpcC0+aV9kLmRpX3NpemUgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopZGF0YSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpc2VncyksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKSgob2Zmc2V0ID4+IDMyKSAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKG9mZnNldCAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpaW9mbGFncyksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKSgoaW8tPmlvX25ld19zaXplID4+IDMyKSAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGlvLT5pb19uZXdfc2l6ZSAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKilOVUxMLAorCQkodm9pZCAqKU5VTEwsCisJCSh2b2lkICopTlVMTCwKKwkJKHZvaWQgKilOVUxMLAorCQkodm9pZCAqKU5VTEwpOworfQorCit2b2lkCit4ZnNfaW52YWxfY2FjaGVkX3RyYWNlKAorCXhmc19pb2NvcmVfdAkqaW8sCisJeGZzX29mZl90CW9mZnNldCwKKwl4ZnNfb2ZmX3QJbGVuLAorCXhmc19vZmZfdAlmaXJzdCwKKwl4ZnNfb2ZmX3QJbGFzdCkKK3sKKwl4ZnNfaW5vZGVfdAkqaXAgPSBYRlNfSU9fSU5PREUoaW8pOworCisJaWYgKGlwLT5pX3J3dHJhY2UgPT0gTlVMTCkKKwkJcmV0dXJuOworCWt0cmFjZV9lbnRlcihpcC0+aV9yd3RyYWNlLAorCQkodm9pZCAqKShfX3BzaW50X3QpWEZTX0lOVkFMX0NBQ0hFRCwKKwkJKHZvaWQgKilpcCwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKChvZmZzZXQgPj4gMzIpICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykob2Zmc2V0ICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoKGxlbiA+PiAzMikgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShsZW4gJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKSgoZmlyc3QgPj4gMzIpICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoZmlyc3QgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKSgobGFzdCA+PiAzMikgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShsYXN0ICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKU5VTEwsCisJCSh2b2lkICopTlVMTCwKKwkJKHZvaWQgKilOVUxMLAorCQkodm9pZCAqKU5VTEwsCisJCSh2b2lkICopTlVMTCwKKwkJKHZvaWQgKilOVUxMKTsKK30KKyNlbmRpZgorCisvKgorICoJeGZzX2lvemVybworICoKKyAqCXhmc19pb3plcm8gY2xlYXJzIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgYnVmZmVyIHN1cHBsaWVkLAorICoJYW5kIG1hcmtzIGFsbCB0aGUgYWZmZWN0ZWQgYmxvY2tzIGFzIHZhbGlkIGFuZCBtb2RpZmllZC4gIElmCisgKglhbiBhZmZlY3RlZCBibG9jayBpcyBub3QgYWxsb2NhdGVkLCBpdCB3aWxsIGJlIGFsbG9jYXRlZC4gIElmCisgKglhbiBhZmZlY3RlZCBibG9jayBpcyBub3QgY29tcGxldGVseSBvdmVyd3JpdHRlbiwgYW5kIGlzIG5vdAorICoJdmFsaWQgYmVmb3JlIHRoZSBvcGVyYXRpb24sIGl0IHdpbGwgYmUgcmVhZCBmcm9tIGRpc2sgYmVmb3JlCisgKgliZWluZyBwYXJ0aWFsbHkgemVyb2VkLgorICovCitTVEFUSUMgaW50Cit4ZnNfaW96ZXJvKAorCXN0cnVjdCBpbm9kZQkJKmlwLAkvKiBpbm9kZQkJCSovCisJbG9mZl90CQkJcG9zLAkvKiBvZmZzZXQgaW4gZmlsZQkJKi8KKwlzaXplX3QJCQljb3VudCwJLyogc2l6ZSBvZiBkYXRhIHRvIHplcm8JCSovCisJbG9mZl90CQkJZW5kX3NpemUpCS8qIG1heCBmaWxlIHNpemUgdG8gc2V0ICovCit7CisJdW5zaWduZWQJCWJ5dGVzOworCXN0cnVjdCBwYWdlCQkqcGFnZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZQkqbWFwcGluZzsKKwljaGFyCQkJKmthZGRyOworCWludAkJCXN0YXR1czsKKworCW1hcHBpbmcgPSBpcC0+aV9tYXBwaW5nOworCWRvIHsKKwkJdW5zaWduZWQgbG9uZyBpbmRleCwgb2Zmc2V0OworCisJCW9mZnNldCA9IChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0xKSk7IC8qIFdpdGhpbiBwYWdlICovCisJCWluZGV4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCWJ5dGVzID0gUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0OworCQlpZiAoYnl0ZXMgPiBjb3VudCkKKwkJCWJ5dGVzID0gY291bnQ7CisKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCk7CisJCWlmICghcGFnZSkKKwkJCWJyZWFrOworCisJCWthZGRyID0ga21hcChwYWdlKTsKKwkJc3RhdHVzID0gbWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgcGFnZSwgb2Zmc2V0LAorCQkJCQkJCW9mZnNldCArIGJ5dGVzKTsKKwkJaWYgKHN0YXR1cykgeworCQkJZ290byB1bmxvY2s7CisJCX0KKworCQltZW1zZXQoKHZvaWQgKikgKGthZGRyICsgb2Zmc2V0KSwgMCwgYnl0ZXMpOworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJc3RhdHVzID0gbWFwcGluZy0+YV9vcHMtPmNvbW1pdF93cml0ZShOVUxMLCBwYWdlLCBvZmZzZXQsCisJCQkJCQkJb2Zmc2V0ICsgYnl0ZXMpOworCQlpZiAoIXN0YXR1cykgeworCQkJcG9zICs9IGJ5dGVzOworCQkJY291bnQgLT0gYnl0ZXM7CisJCQlpZiAocG9zID4gaV9zaXplX3JlYWQoaXApKQorCQkJCWlfc2l6ZV93cml0ZShpcCwgcG9zIDwgZW5kX3NpemUgPyBwb3MgOiBlbmRfc2l6ZSk7CisJCX0KKwordW5sb2NrOgorCQlrdW5tYXAocGFnZSk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCWlmIChzdGF0dXMpCisJCQlicmVhazsKKwl9IHdoaWxlIChjb3VudCk7CisKKwlyZXR1cm4gKC1zdGF0dXMpOworfQorCisvKgorICogeGZzX2ludmFsX2NhY2hlZF9wYWdlcworICogCisgKiBUaGlzIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIGtlZXBpbmcgZGlyZWN0IEkvTyBhbmQgYnVmZmVyZWQgSS9PCisgKiBzb21ld2hhdCBjb2hlcmVudC4gIEZyb20gaGVyZSB3ZSBtYWtlIHN1cmUgdGhhdCB3ZSdyZSBhdCBsZWFzdAorICogdGVtcG9yYXJpbHkgaG9sZGluZyB0aGUgaW5vZGUgSS9PIGxvY2sgZXhjbHVzaXZlbHkgYW5kIHRoZW4gY2FsbAorICogdGhlIHBhZ2UgY2FjaGUgdG8gZmx1c2ggYW5kIGludmFsaWRhdGUgYW55IGNhY2hlZCBwYWdlcy4gIElmIHRoZXJlCisgKiBhcmUgbm8gY2FjaGVkIHBhZ2VzIHRoaXMgcm91dGluZSB3aWxsIGJlIHZlcnkgcXVpY2suCisgKi8KK3ZvaWQKK3hmc19pbnZhbF9jYWNoZWRfcGFnZXMoCisJdm5vZGVfdAkJKnZwLAorCXhmc19pb2NvcmVfdAkqaW8sCisJeGZzX29mZl90CW9mZnNldCwKKwlpbnQJCXdyaXRlLAorCWludAkJcmVsb2NrKQoreworCWlmIChWTl9DQUNIRUQodnApKSB7CisJCXhmc19pbnZhbF9jYWNoZWRfdHJhY2UoaW8sIG9mZnNldCwgLTEsIGN0b29mZihvZmZ0b2N0KG9mZnNldCkpLCAtMSk7CisJCVZPUF9GTFVTSElOVkFMX1BBR0VTKHZwLCBjdG9vZmYob2ZmdG9jdChvZmZzZXQpKSwgLTEsIEZJX1JFTUFQRl9MT0NLRUQpOworCX0KKworfQorCitzc2l6ZV90CQkJLyogYnl0ZXMgcmVhZCwgb3IgKC0pICBlcnJvciAqLworeGZzX3JlYWQoCisJYmh2X2Rlc2NfdAkJKmJkcCwKKwlzdHJ1Y3Qga2lvY2IJCSppb2NiLAorCWNvbnN0IHN0cnVjdCBpb3ZlYwkqaW92cCwKKwl1bnNpZ25lZCBpbnQJCXNlZ3MsCisJbG9mZl90CQkJKm9mZnNldCwKKwlpbnQJCQlpb2ZsYWdzLAorCWNyZWRfdAkJCSpjcmVkcCkKK3sKKwlzdHJ1Y3QgZmlsZQkJKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCXNpemVfdAkJCXNpemUgPSAwOworCXNzaXplX3QJCQlyZXQ7CisJeGZzX2ZzaXplX3QJCW47CisJeGZzX2lub2RlX3QJCSppcDsKKwl4ZnNfbW91bnRfdAkJKm1wOworCXZub2RlX3QJCQkqdnA7CisJdW5zaWduZWQgbG9uZwkJc2VnOworCisJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CisJdnAgPSBCSFZfVE9fVk5PREUoYmRwKTsKKwltcCA9IGlwLT5pX21vdW50OworCisJWEZTX1NUQVRTX0lOQyh4c19yZWFkX2NhbGxzKTsKKworCS8qIFNUQVJUIGNvcHkgJiB3YXN0ZSBmcm9tIGZpbGVtYXAuYyAqLworCWZvciAoc2VnID0gMDsgc2VnIDwgc2Vnczsgc2VnKyspIHsKKwkJY29uc3Qgc3RydWN0IGlvdmVjICppdiA9ICZpb3ZwW3NlZ107CisKKwkJLyoKKwkJICogSWYgYW55IHNlZ21lbnQgaGFzIGEgbmVnYXRpdmUgbGVuZ3RoLCBvciB0aGUgY3VtdWxhdGl2ZQorCQkgKiBsZW5ndGggZXZlciB3cmFwcyBuZWdhdGl2ZSB0aGVuIHJldHVybiAtRUlOVkFMLgorCQkgKi8KKwkJc2l6ZSArPSBpdi0+aW92X2xlbjsKKwkJaWYgKHVubGlrZWx5KChzc2l6ZV90KShzaXplfGl2LT5pb3ZfbGVuKSA8IDApKQorCQkJcmV0dXJuIFhGU19FUlJPUigtRUlOVkFMKTsKKwl9CisJLyogRU5EIGNvcHkgJiB3YXN0ZSBmcm9tIGZpbGVtYXAuYyAqLworCisJaWYgKHVubGlrZWx5KGlvZmxhZ3MgJiBJT19JU0RJUkVDVCkpIHsKKwkJeGZzX2J1ZnRhcmdfdAkqdGFyZ2V0ID0KKwkJCShpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkgPworCQkJCW1wLT5tX3J0ZGV2X3RhcmdwIDogbXAtPm1fZGRldl90YXJncDsKKwkJaWYgKCgqb2Zmc2V0ICYgdGFyZ2V0LT5wYnJfc21hc2spIHx8CisJCSAgICAoc2l6ZSAmIHRhcmdldC0+cGJyX3NtYXNrKSkgeworCQkJaWYgKCpvZmZzZXQgPT0gaXAtPmlfZC5kaV9zaXplKSB7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCXJldHVybiAtWEZTX0VSUk9SKEVJTlZBTCk7CisJCX0KKwl9CisKKwluID0gWEZTX01BWElPRkZTRVQobXApIC0gKm9mZnNldDsKKwlpZiAoKG4gPD0gMCkgfHwgKHNpemUgPT0gMCkpCisJCXJldHVybiAwOworCisJaWYgKG4gPCBzaXplKQorCQlzaXplID0gbjsKKworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgeworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAodW5saWtlbHkoaW9mbGFncyAmIElPX0lTRElSRUNUKSkKKwkJZG93bigmaW5vZGUtPmlfc2VtKTsKKwl4ZnNfaWxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKKworCWlmIChETV9FVkVOVF9FTkFCTEVEKHZwLT52X3Zmc3AsIGlwLCBETV9FVkVOVF9SRUFEKSAmJgorCSAgICAhKGlvZmxhZ3MgJiBJT19JTlZJUykpIHsKKwkJdnJ3bG9ja190IGxvY2t0eXBlID0gVlJXTE9DS19SRUFEOworCisJCXJldCA9IC1YRlNfU0VORF9EQVRBKG1wLCBETV9FVkVOVF9SRUFELAorCQkJCQlCSFZfVE9fVk5PREUoYmRwKSwgKm9mZnNldCwgc2l6ZSwKKwkJCQkJRklMUF9ERUxBWV9GTEFHKGZpbGUpLCAmbG9ja3R5cGUpOworCQlpZiAocmV0KSB7CisJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19TSEFSRUQpOworCQkJZ290byB1bmxvY2tfaXNlbTsKKwkJfQorCX0KKworCXhmc19yd19lbnRlcl90cmFjZShYRlNfUkVBRF9FTlRFUiwgJmlwLT5pX2lvY29yZSwKKwkJCQkodm9pZCAqKWlvdnAsIHNlZ3MsICpvZmZzZXQsIGlvZmxhZ3MpOworCXJldCA9IF9fZ2VuZXJpY19maWxlX2Fpb19yZWFkKGlvY2IsIGlvdnAsIHNlZ3MsIG9mZnNldCk7CisJaWYgKHJldCA9PSAtRUlPQ0JRVUVVRUQgJiYgIShpb2ZsYWdzICYgSU9fSVNBSU8pKQorCQlyZXQgPSB3YWl0X29uX3N5bmNfa2lvY2IoaW9jYik7CisJaWYgKHJldCA+IDApCisJCVhGU19TVEFUU19BREQoeHNfcmVhZF9ieXRlcywgcmV0KTsKKworCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX1NIQVJFRCk7CisKKwlpZiAobGlrZWx5KCEoaW9mbGFncyAmIElPX0lOVklTKSkpCisJCXhmc19pY2hndGltZShpcCwgWEZTX0lDSEdUSU1FX0FDQyk7CisKK3VubG9ja19pc2VtOgorCWlmICh1bmxpa2VseShpb2ZsYWdzICYgSU9fSVNESVJFQ1QpKQorCQl1cCgmaW5vZGUtPmlfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitzc2l6ZV90Cit4ZnNfc2VuZGZpbGUoCisJYmh2X2Rlc2NfdAkJKmJkcCwKKwlzdHJ1Y3QgZmlsZQkJKmZpbHAsCisJbG9mZl90CQkJKm9mZnNldCwKKwlpbnQJCQlpb2ZsYWdzLAorCXNpemVfdAkJCWNvdW50LAorCXJlYWRfYWN0b3JfdAkJYWN0b3IsCisJdm9pZAkJCSp0YXJnZXQsCisJY3JlZF90CQkJKmNyZWRwKQoreworCXNzaXplX3QJCQlyZXQ7CisJeGZzX2ZzaXplX3QJCW47CisJeGZzX2lub2RlX3QJCSppcDsKKwl4ZnNfbW91bnRfdAkJKm1wOworCXZub2RlX3QJCQkqdnA7CisKKwlpcCA9IFhGU19CSFZUT0koYmRwKTsKKwl2cCA9IEJIVl9UT19WTk9ERShiZHApOworCW1wID0gaXAtPmlfbW91bnQ7CisKKwlYRlNfU1RBVFNfSU5DKHhzX3JlYWRfY2FsbHMpOworCisJbiA9IFhGU19NQVhJT0ZGU0VUKG1wKSAtICpvZmZzZXQ7CisJaWYgKChuIDw9IDApIHx8IChjb3VudCA9PSAwKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobiA8IGNvdW50KQorCQljb3VudCA9IG47CisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkpCisJCXJldHVybiAtRUlPOworCisJeGZzX2lsb2NrKGlwLCBYRlNfSU9MT0NLX1NIQVJFRCk7CisKKwlpZiAoRE1fRVZFTlRfRU5BQkxFRCh2cC0+dl92ZnNwLCBpcCwgRE1fRVZFTlRfUkVBRCkgJiYKKwkgICAgKCEoaW9mbGFncyAmIElPX0lOVklTKSkpIHsKKwkJdnJ3bG9ja190IGxvY2t0eXBlID0gVlJXTE9DS19SRUFEOworCQlpbnQgZXJyb3I7CisKKwkJZXJyb3IgPSBYRlNfU0VORF9EQVRBKG1wLCBETV9FVkVOVF9SRUFELCBCSFZfVE9fVk5PREUoYmRwKSwgKm9mZnNldCwgY291bnQsCisJCQkJICAgICAgRklMUF9ERUxBWV9GTEFHKGZpbHApLCAmbG9ja3R5cGUpOworCQlpZiAoZXJyb3IpIHsKKwkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX1NIQVJFRCk7CisJCQlyZXR1cm4gLWVycm9yOworCQl9CisJfQorCXhmc19yd19lbnRlcl90cmFjZShYRlNfU0VOREZJTEVfRU5URVIsICZpcC0+aV9pb2NvcmUsCisJCSAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpdGFyZ2V0LCBjb3VudCwgKm9mZnNldCwgaW9mbGFncyk7CisJcmV0ID0gZ2VuZXJpY19maWxlX3NlbmRmaWxlKGZpbHAsIG9mZnNldCwgY291bnQsIGFjdG9yLCB0YXJnZXQpOworCisJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKKworCWlmIChyZXQgPiAwKQorCQlYRlNfU1RBVFNfQUREKHhzX3JlYWRfYnl0ZXMsIHJldCk7CisKKwlpZiAobGlrZWx5KCEoaW9mbGFncyAmIElPX0lOVklTKSkpCisJCXhmc19pY2hndGltZShpcCwgWEZTX0lDSEdUSU1FX0FDQyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBoYW5kbGUgemVyb2luZyBhbnkgc3BhY2UgaW4gdGhlIGxhc3QKKyAqIGJsb2NrIG9mIHRoZSBmaWxlIHRoYXQgaXMgYmV5b25kIHRoZSBFT0YuICBXZSBkbyB0aGlzIHNpbmNlIHRoZQorICogc2l6ZSBpcyBiZWluZyBpbmNyZWFzZWQgd2l0aG91dCB3cml0aW5nIGFueXRoaW5nIHRvIHRoYXQgYmxvY2sKKyAqIGFuZCB3ZSBkb24ndCB3YW50IGFueW9uZSB0byByZWFkIHRoZSBnYXJiYWdlIG9uIHRoZSBkaXNrLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yIChwb3NpdGl2ZSkgKi8KK3hmc196ZXJvX2xhc3RfYmxvY2soCisJc3RydWN0IGlub2RlCSppcCwKKwl4ZnNfaW9jb3JlX3QJKmlvLAorCXhmc19vZmZfdAlvZmZzZXQsCisJeGZzX2ZzaXplX3QJaXNpemUsCisJeGZzX2ZzaXplX3QJZW5kX3NpemUpCit7CisJeGZzX2ZpbGVvZmZfdAlsYXN0X2ZzYjsKKwl4ZnNfbW91bnRfdAkqbXA7CisJaW50CQluaW1hcHM7CisJaW50CQl6ZXJvX29mZnNldDsKKwlpbnQJCXplcm9fbGVuOworCWludAkJaXNpemVfZnNiX29mZnNldDsKKwlpbnQJCWVycm9yID0gMDsKKwl4ZnNfYm1idF9pcmVjX3QJaW1hcDsKKwlsb2ZmX3QJCWxvZmY7CisJc2l6ZV90CQlsc2l6ZTsKKworCUFTU0VSVChpc21ybG9ja2VkKGlvLT5pb19sb2NrLCBNUl9VUERBVEUpICE9IDApOworCUFTU0VSVChvZmZzZXQgPiBpc2l6ZSk7CisKKwltcCA9IGlvLT5pb19tb3VudDsKKworCWlzaXplX2ZzYl9vZmZzZXQgPSBYRlNfQl9GU0JfT0ZGU0VUKG1wLCBpc2l6ZSk7CisJaWYgKGlzaXplX2ZzYl9vZmZzZXQgPT0gMCkgeworCQkvKgorCQkgKiBUaGVyZSBhcmUgbm8gZXh0cmEgYnl0ZXMgaW4gdGhlIGxhc3QgYmxvY2sgb24gZGlzayB0bworCQkgKiB6ZXJvLCBzbyByZXR1cm4uCisJCSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlsYXN0X2ZzYiA9IFhGU19CX1RPX0ZTQlQobXAsIGlzaXplKTsKKwluaW1hcHMgPSAxOworCWVycm9yID0gWEZTX0JNQVBJKG1wLCBOVUxMLCBpbywgbGFzdF9mc2IsIDEsIDAsIE5VTEwsIDAsICZpbWFwLAorCQkJICAmbmltYXBzLCBOVUxMKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlBU1NFUlQobmltYXBzID4gMCk7CisJLyoKKwkgKiBJZiB0aGUgYmxvY2sgdW5kZXJseWluZyBpc2l6ZSBpcyBqdXN0IGEgaG9sZSwgdGhlbiB0aGVyZQorCSAqIGlzIG5vdGhpbmcgdG8gemVyby4KKwkgKi8KKwlpZiAoaW1hcC5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLKSB7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIFplcm8gdGhlIHBhcnQgb2YgdGhlIGxhc3QgYmxvY2sgYmV5b25kIHRoZSBFT0YsIGFuZCB3cml0ZSBpdAorCSAqIG91dCBzeW5jLiAgV2UgbmVlZCB0byBkcm9wIHRoZSBpbG9jayB3aGlsZSB3ZSBkbyB0aGlzIHNvIHdlCisJICogZG9uJ3QgZGVhZGxvY2sgd2hlbiB0aGUgYnVmZmVyIGNhY2hlIGNhbGxzIGJhY2sgdG8gdXMuCisJICovCisJWEZTX0lVTkxPQ0sobXAsIGlvLCBYRlNfSUxPQ0tfRVhDTHwgWEZTX0VYVFNJWkVfUkQpOworCWxvZmYgPSBYRlNfRlNCX1RPX0IobXAsIGxhc3RfZnNiKTsKKwlsc2l6ZSA9IFhGU19GU0JfVE9fQihtcCwgMSk7CisKKwl6ZXJvX29mZnNldCA9IGlzaXplX2ZzYl9vZmZzZXQ7CisJemVyb19sZW4gPSBtcC0+bV9zYi5zYl9ibG9ja3NpemUgLSBpc2l6ZV9mc2Jfb2Zmc2V0OworCisJZXJyb3IgPSB4ZnNfaW96ZXJvKGlwLCBsb2ZmICsgemVyb19vZmZzZXQsIHplcm9fbGVuLCBlbmRfc2l6ZSk7CisKKwlYRlNfSUxPQ0sobXAsIGlvLCBYRlNfSUxPQ0tfRVhDTHxYRlNfRVhUU0laRV9SRCk7CisJQVNTRVJUKGVycm9yID49IDApOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFplcm8gYW55IG9uIGRpc2sgc3BhY2UgYmV0d2VlbiB0aGUgY3VycmVudCBFT0YgYW5kIHRoZSBuZXcsCisgKiBsYXJnZXIgRU9GLiAgVGhpcyBoYW5kbGVzIHRoZSBub3JtYWwgY2FzZSBvZiB6ZXJvaW5nIHRoZSByZW1haW5kZXIKKyAqIG9mIHRoZSBsYXN0IGJsb2NrIGluIHRoZSBmaWxlIGFuZCB0aGUgdW51c3VhbCBjYXNlIG9mIHplcm9pbmcgYmxvY2tzCisgKiBvdXQgYmV5b25kIHRoZSBzaXplIG9mIHRoZSBmaWxlLiAgVGhpcyBzZWNvbmQgY2FzZSBvbmx5IGhhcHBlbnMKKyAqIHdpdGggZml4ZWQgc2l6ZSBleHRlbnRzIGFuZCB3aGVuIHRoZSBzeXN0ZW0gY3Jhc2hlcyBiZWZvcmUgdGhlIGlub2RlCisgKiBzaXplIHdhcyB1cGRhdGVkIGJ1dCBhZnRlciBibG9ja3Mgd2VyZSBhbGxvY2F0ZWQuICBJZiBmaWxsIGlzIHNldCwKKyAqIHRoZW4gYW55IGhvbGVzIGluIHRoZSByYW5nZSBhcmUgZmlsbGVkIGFuZCB6ZXJvZWQuICBJZiBub3QsIHRoZSBob2xlcworICogYXJlIGxlZnQgYWxvbmUgYXMgaG9sZXMuCisgKi8KKworaW50CQkJCQkvKiBlcnJvciAocG9zaXRpdmUpICovCit4ZnNfemVyb19lb2YoCisJdm5vZGVfdAkJKnZwLAorCXhmc19pb2NvcmVfdAkqaW8sCisJeGZzX29mZl90CW9mZnNldCwJCS8qIHN0YXJ0aW5nIEkvTyBvZmZzZXQgKi8KKwl4ZnNfZnNpemVfdAlpc2l6ZSwJCS8qIGN1cnJlbnQgaW5vZGUgc2l6ZSAqLworCXhmc19mc2l6ZV90CWVuZF9zaXplKQkvKiB0ZXJtaW5hbCBpbm9kZSBzaXplICovCit7CisJc3RydWN0IGlub2RlCSppcCA9IExJTlZGU19HRVRfSVAodnApOworCXhmc19maWxlb2ZmX3QJc3RhcnRfemVyb19mc2I7CisJeGZzX2ZpbGVvZmZfdAllbmRfemVyb19mc2I7CisJeGZzX2ZpbGVvZmZfdAlwcmV2X3plcm9fZnNiOworCXhmc19maWxlb2ZmX3QJemVyb19jb3VudF9mc2I7CisJeGZzX2ZpbGVvZmZfdAlsYXN0X2ZzYjsKKwl4ZnNfZXh0bGVuX3QJYnVmX2xlbl9mc2I7CisJeGZzX2V4dGxlbl90CXByZXZfemVyb19jb3VudDsKKwl4ZnNfbW91bnRfdAkqbXA7CisJaW50CQluaW1hcHM7CisJaW50CQllcnJvciA9IDA7CisJeGZzX2JtYnRfaXJlY190CWltYXA7CisJbG9mZl90CQlsb2ZmOworCXNpemVfdAkJbHNpemU7CisKKwlBU1NFUlQoaXNtcmxvY2tlZChpby0+aW9fbG9jaywgTVJfVVBEQVRFKSk7CisJQVNTRVJUKGlzbXJsb2NrZWQoaW8tPmlvX2lvbG9jaywgTVJfVVBEQVRFKSk7CisKKwltcCA9IGlvLT5pb19tb3VudDsKKworCS8qCisJICogRmlyc3QgaGFuZGxlIHplcm9pbmcgdGhlIGJsb2NrIG9uIHdoaWNoIGlzaXplIHJlc2lkZXMuCisJICogV2Ugb25seSB6ZXJvIGEgcGFydCBvZiB0aGF0IGJsb2NrIHNvIGl0IGlzIGhhbmRsZWQgc3BlY2lhbGx5LgorCSAqLworCWVycm9yID0geGZzX3plcm9fbGFzdF9ibG9jayhpcCwgaW8sIG9mZnNldCwgaXNpemUsIGVuZF9zaXplKTsKKwlpZiAoZXJyb3IpIHsKKwkJQVNTRVJUKGlzbXJsb2NrZWQoaW8tPmlvX2xvY2ssIE1SX1VQREFURSkpOworCQlBU1NFUlQoaXNtcmxvY2tlZChpby0+aW9faW9sb2NrLCBNUl9VUERBVEUpKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSByYW5nZSBiZXR3ZWVuIHRoZSBuZXcgc2l6ZSBhbmQgdGhlIG9sZAorCSAqIHdoZXJlIGJsb2NrcyBuZWVkaW5nIHRvIGJlIHplcm9lZCBtYXkgZXhpc3QuICBUbyBnZXQgdGhlCisJICogYmxvY2sgd2hlcmUgdGhlIGxhc3QgYnl0ZSBpbiB0aGUgZmlsZSBjdXJyZW50bHkgcmVzaWRlcywKKwkgKiB3ZSBuZWVkIHRvIHN1YnRyYWN0IG9uZSBmcm9tIHRoZSBzaXplIGFuZCB0cnVuY2F0ZSBiYWNrCisJICogdG8gYSBibG9jayBib3VuZGFyeS4gIFdlIHN1YnRyYWN0IDEgaW4gY2FzZSB0aGUgc2l6ZSBpcworCSAqIGV4YWN0bHkgb24gYSBibG9jayBib3VuZGFyeS4KKwkgKi8KKwlsYXN0X2ZzYiA9IGlzaXplID8gWEZTX0JfVE9fRlNCVChtcCwgaXNpemUgLSAxKSA6ICh4ZnNfZmlsZW9mZl90KS0xOworCXN0YXJ0X3plcm9fZnNiID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KWlzaXplKTsKKwllbmRfemVyb19mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBvZmZzZXQgLSAxKTsKKwlBU1NFUlQoKHhmc19zZmlsb2ZmX3QpbGFzdF9mc2IgPCAoeGZzX3NmaWxvZmZfdClzdGFydF96ZXJvX2ZzYik7CisJaWYgKGxhc3RfZnNiID09IGVuZF96ZXJvX2ZzYikgeworCQkvKgorCQkgKiBUaGUgc2l6ZSB3YXMgb25seSBpbmNyZW1lbnRlZCBvbiBpdHMgbGFzdCBibG9jay4KKwkJICogV2UgdG9vayBjYXJlIG9mIHRoYXQgYWJvdmUsIHNvIGp1c3QgcmV0dXJuLgorCQkgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJQVNTRVJUKHN0YXJ0X3plcm9fZnNiIDw9IGVuZF96ZXJvX2ZzYik7CisJcHJldl96ZXJvX2ZzYiA9IE5VTExGSUxFT0ZGOworCXByZXZfemVyb19jb3VudCA9IDA7CisJd2hpbGUgKHN0YXJ0X3plcm9fZnNiIDw9IGVuZF96ZXJvX2ZzYikgeworCQluaW1hcHMgPSAxOworCQl6ZXJvX2NvdW50X2ZzYiA9IGVuZF96ZXJvX2ZzYiAtIHN0YXJ0X3plcm9fZnNiICsgMTsKKwkJZXJyb3IgPSBYRlNfQk1BUEkobXAsIE5VTEwsIGlvLCBzdGFydF96ZXJvX2ZzYiwgemVyb19jb3VudF9mc2IsCisJCQkJICAwLCBOVUxMLCAwLCAmaW1hcCwgJm5pbWFwcywgTlVMTCk7CisJCWlmIChlcnJvcikgeworCQkJQVNTRVJUKGlzbXJsb2NrZWQoaW8tPmlvX2xvY2ssIE1SX1VQREFURSkpOworCQkJQVNTRVJUKGlzbXJsb2NrZWQoaW8tPmlvX2lvbG9jaywgTVJfVVBEQVRFKSk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJQVNTRVJUKG5pbWFwcyA+IDApOworCisJCWlmIChpbWFwLmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOIHx8CisJCSAgICBpbWFwLmJyX3N0YXJ0YmxvY2sgPT0gSE9MRVNUQVJUQkxPQ0spIHsKKwkJCS8qCisJCQkgKiBUaGlzIGxvb3AgaGFuZGxlcyBpbml0aWFsaXppbmcgcGFnZXMgdGhhdCB3ZXJlCisJCQkgKiBwYXJ0aWFsbHkgaW5pdGlhbGl6ZWQgYnkgdGhlIGNvZGUgYmVsb3cgdGhpcworCQkJICogbG9vcC4gSXQgYmFzaWNhbGx5IHplcm9lcyB0aGUgcGFydCBvZiB0aGUgcGFnZQorCQkJICogdGhhdCBzaXRzIG9uIGEgaG9sZSBhbmQgc2V0cyB0aGUgcGFnZSBhcyBQX0hPTEUKKwkJCSAqIGFuZCBjYWxscyByZW1hcGYgaWYgaXQgaXMgYSBtYXBwZWQgZmlsZS4KKwkJCSAqLworCQkJcHJldl96ZXJvX2ZzYiA9IE5VTExGSUxFT0ZGOworCQkJcHJldl96ZXJvX2NvdW50ID0gMDsKKwkJCXN0YXJ0X3plcm9fZnNiID0gaW1hcC5icl9zdGFydG9mZiArCisJCQkJCSBpbWFwLmJyX2Jsb2NrY291bnQ7CisJCQlBU1NFUlQoc3RhcnRfemVyb19mc2IgPD0gKGVuZF96ZXJvX2ZzYiArIDEpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogVGhlcmUgYXJlIGJsb2NrcyBpbiB0aGUgcmFuZ2UgcmVxdWVzdGVkLgorCQkgKiBaZXJvIHRoZW0gYSBzaW5nbGUgd3JpdGUgYXQgYSB0aW1lLiAgV2UgYWN0dWFsbHkKKwkJICogZG9uJ3QgemVybyB0aGUgZW50aXJlIHJhbmdlIHJldHVybmVkIGlmIGl0IGlzCisJCSAqIHRvbyBiaWcgYW5kIHNpbXBseSBsb29wIGFyb3VuZCB0byBnZXQgdGhlIHJlc3QuCisJCSAqIFRoYXQgaXMgbm90IHRoZSBtb3N0IGVmZmljaWVudCB0aGluZyB0byBkbywgYnV0IGl0CisJCSAqIGlzIHNpbXBsZSBhbmQgdGhpcyBwYXRoIHNob3VsZCBub3QgYmUgZXhlcmNpc2VkIG9mdGVuLgorCQkgKi8KKwkJYnVmX2xlbl9mc2IgPSBYRlNfRklMQkxLU19NSU4oaW1hcC5icl9ibG9ja2NvdW50LAorCQkJCQkgICAgICBtcC0+bV93cml0ZWlvX2Jsb2NrcyA8PCA4KTsKKwkJLyoKKwkJICogRHJvcCB0aGUgaW5vZGUgbG9jayB3aGlsZSB3ZSdyZSBkb2luZyB0aGUgSS9PLgorCQkgKiBXZSdsbCBzdGlsbCBoYXZlIHRoZSBpb2xvY2sgdG8gcHJvdGVjdCB1cy4KKwkJICovCisJCVhGU19JVU5MT0NLKG1wLCBpbywgWEZTX0lMT0NLX0VYQ0x8WEZTX0VYVFNJWkVfUkQpOworCisJCWxvZmYgPSBYRlNfRlNCX1RPX0IobXAsIHN0YXJ0X3plcm9fZnNiKTsKKwkJbHNpemUgPSBYRlNfRlNCX1RPX0IobXAsIGJ1Zl9sZW5fZnNiKTsKKworCQllcnJvciA9IHhmc19pb3plcm8oaXAsIGxvZmYsIGxzaXplLCBlbmRfc2l6ZSk7CisKKwkJaWYgKGVycm9yKSB7CisJCQlnb3RvIG91dF9sb2NrOworCQl9CisKKwkJcHJldl96ZXJvX2ZzYiA9IHN0YXJ0X3plcm9fZnNiOworCQlwcmV2X3plcm9fY291bnQgPSBidWZfbGVuX2ZzYjsKKwkJc3RhcnRfemVyb19mc2IgPSBpbWFwLmJyX3N0YXJ0b2ZmICsgYnVmX2xlbl9mc2I7CisJCUFTU0VSVChzdGFydF96ZXJvX2ZzYiA8PSAoZW5kX3plcm9fZnNiICsgMSkpOworCisJCVhGU19JTE9DSyhtcCwgaW8sIFhGU19JTE9DS19FWENMfFhGU19FWFRTSVpFX1JEKTsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X2xvY2s6CisKKwlYRlNfSUxPQ0sobXAsIGlvLCBYRlNfSUxPQ0tfRVhDTHxYRlNfRVhUU0laRV9SRCk7CisJQVNTRVJUKGVycm9yID49IDApOworCXJldHVybiBlcnJvcjsKK30KKworc3NpemVfdAkJCQkvKiBieXRlcyB3cml0dGVuLCBvciAoLSkgZXJyb3IgKi8KK3hmc193cml0ZSgKKwliaHZfZGVzY190CQkqYmRwLAorCXN0cnVjdCBraW9jYgkJKmlvY2IsCisJY29uc3Qgc3RydWN0IGlvdmVjCSppb3ZwLAorCXVuc2lnbmVkIGludAkJbnNlZ3MsCisJbG9mZl90CQkJKm9mZnNldCwKKwlpbnQJCQlpb2ZsYWdzLAorCWNyZWRfdAkJCSpjcmVkcCkKK3sKKwlzdHJ1Y3QgZmlsZQkJKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlCSptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOworCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKwl1bnNpZ25lZCBsb25nCQlzZWdzID0gbnNlZ3M7CisJeGZzX2lub2RlX3QJCSp4aXA7CisJeGZzX21vdW50X3QJCSptcDsKKwlzc2l6ZV90CQkJcmV0ID0gMCwgZXJyb3IgPSAwOworCXhmc19mc2l6ZV90CQlpc2l6ZSwgbmV3X3NpemU7CisJeGZzX2lvY29yZV90CQkqaW87CisJdm5vZGVfdAkJCSp2cDsKKwl1bnNpZ25lZCBsb25nCQlzZWc7CisJaW50CQkJaW9sb2NrOworCWludAkJCWV2ZW50c2VudCA9IDA7CisJdnJ3bG9ja190CQlsb2NrdHlwZTsKKwlzaXplX3QJCQlvY291bnQgPSAwLCBjb3VudDsKKwlsb2ZmX3QJCQlwb3M7CisJaW50CQkJbmVlZF9pc2VtID0gMSwgbmVlZF9mbHVzaCA9IDA7CisKKwlYRlNfU1RBVFNfSU5DKHhzX3dyaXRlX2NhbGxzKTsKKworCXZwID0gQkhWX1RPX1ZOT0RFKGJkcCk7CisJeGlwID0gWEZTX0JIVlRPSShiZHApOworCisJZm9yIChzZWcgPSAwOyBzZWcgPCBzZWdzOyBzZWcrKykgeworCQljb25zdCBzdHJ1Y3QgaW92ZWMgKml2ID0gJmlvdnBbc2VnXTsKKworCQkvKgorCQkgKiBJZiBhbnkgc2VnbWVudCBoYXMgYSBuZWdhdGl2ZSBsZW5ndGgsIG9yIHRoZSBjdW11bGF0aXZlCisJCSAqIGxlbmd0aCBldmVyIHdyYXBzIG5lZ2F0aXZlIHRoZW4gcmV0dXJuIC1FSU5WQUwuCisJCSAqLworCQlvY291bnQgKz0gaXYtPmlvdl9sZW47CisJCWlmICh1bmxpa2VseSgoc3NpemVfdCkob2NvdW50fGl2LT5pb3ZfbGVuKSA8IDApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGl2LT5pb3ZfYmFzZSwgaXYtPmlvdl9sZW4pKQorCQkJY29udGludWU7CisJCWlmIChzZWcgPT0gMCkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzZWdzID0gc2VnOworCQlvY291bnQgLT0gaXYtPmlvdl9sZW47ICAvKiBUaGlzIHNlZ21lbnQgaXMgbm8gZ29vZCAqLworCQlicmVhazsKKwl9CisKKwljb3VudCA9IG9jb3VudDsKKwlwb3MgPSAqb2Zmc2V0OworCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCisJaW8gPSAmeGlwLT5pX2lvY29yZTsKKwltcCA9IGlvLT5pb19tb3VudDsKKworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJcmV0dXJuIC1FSU87CisKKwlmc19jaGVja19mcm96ZW4odnAtPnZfdmZzcCwgU0JfRlJFRVpFX1dSSVRFKTsKKworCWlmIChpb2ZsYWdzICYgSU9fSVNESVJFQ1QpIHsKKwkJeGZzX2J1ZnRhcmdfdAkqdGFyZ2V0ID0KKwkJCSh4aXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpID8KKwkJCQltcC0+bV9ydGRldl90YXJncCA6IG1wLT5tX2RkZXZfdGFyZ3A7CisKKwkJaWYgKChwb3MgJiB0YXJnZXQtPnBicl9zbWFzaykgfHwgKGNvdW50ICYgdGFyZ2V0LT5wYnJfc21hc2spKQorCQkJcmV0dXJuIFhGU19FUlJPUigtRUlOVkFMKTsKKworCQlpZiAoIVZOX0NBQ0hFRCh2cCkgJiYgcG9zIDwgaV9zaXplX3JlYWQoaW5vZGUpKQorCQkJbmVlZF9pc2VtID0gMDsKKworCQlpZiAoVk5fQ0FDSEVEKHZwKSkKKwkJCW5lZWRfZmx1c2ggPSAxOworCX0KKworcmVsb2NrOgorCWlmIChuZWVkX2lzZW0pIHsKKwkJaW9sb2NrID0gWEZTX0lPTE9DS19FWENMOworCQlsb2NrdHlwZSA9IFZSV0xPQ0tfV1JJVEU7CisKKwkJZG93bigmaW5vZGUtPmlfc2VtKTsKKwl9IGVsc2UgeworCQlpb2xvY2sgPSBYRlNfSU9MT0NLX1NIQVJFRDsKKwkJbG9ja3R5cGUgPSBWUldMT0NLX1dSSVRFX0RJUkVDVDsKKwl9CisKKwl4ZnNfaWxvY2soeGlwLCBYRlNfSUxPQ0tfRVhDTHxpb2xvY2spOworCisJaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EKQorCQkqb2Zmc2V0ID0gaXNpemU7CisKK3N0YXJ0OgorCWVycm9yID0gLWdlbmVyaWNfd3JpdGVfY2hlY2tzKGZpbGUsICZwb3MsICZjb3VudCwKKwkJCQkJU19JU0JMSyhpbm9kZS0+aV9tb2RlKSk7CisJaWYgKGVycm9yKSB7CisJCXhmc19pdW5sb2NrKHhpcCwgWEZTX0lMT0NLX0VYQ0x8aW9sb2NrKTsKKwkJZ290byBvdXRfdW5sb2NrX2lzZW07CisJfQorCisJbmV3X3NpemUgPSBwb3MgKyBjb3VudDsKKwlpZiAobmV3X3NpemUgPiBpc2l6ZSkKKwkJaW8tPmlvX25ld19zaXplID0gbmV3X3NpemU7CisKKwlpZiAoKERNX0VWRU5UX0VOQUJMRUQodnAtPnZfdmZzcCwgeGlwLCBETV9FVkVOVF9XUklURSkgJiYKKwkgICAgIShpb2ZsYWdzICYgSU9fSU5WSVMpICYmICFldmVudHNlbnQpKSB7CisJCWxvZmZfdAkJc2F2ZWRzaXplID0gcG9zOworCQlpbnQJCWRtZmxhZ3MgPSBGSUxQX0RFTEFZX0ZMQUcoZmlsZSk7CisKKwkJaWYgKG5lZWRfaXNlbSkKKwkJCWRtZmxhZ3MgfD0gRE1fRkxBR1NfSVNFTTsKKworCQl4ZnNfaXVubG9jayh4aXAsIFhGU19JTE9DS19FWENMKTsKKwkJZXJyb3IgPSBYRlNfU0VORF9EQVRBKHhpcC0+aV9tb3VudCwgRE1fRVZFTlRfV1JJVEUsIHZwLAorCQkJCSAgICAgIHBvcywgY291bnQsCisJCQkJICAgICAgZG1mbGFncywgJmxvY2t0eXBlKTsKKwkJaWYgKGVycm9yKSB7CisJCQl4ZnNfaXVubG9jayh4aXAsIGlvbG9jayk7CisJCQlnb3RvIG91dF91bmxvY2tfaXNlbTsKKwkJfQorCQl4ZnNfaWxvY2soeGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCWV2ZW50c2VudCA9IDE7CisKKwkJLyoKKwkJICogVGhlIGlvbG9jayB3YXMgZHJvcHBlZCBhbmQgcmVhcXVpcmVkIGluIFhGU19TRU5EX0RBVEEKKwkJICogc28gd2UgaGF2ZSB0byByZWNoZWNrIHRoZSBzaXplIHdoZW4gYXBwZW5kaW5nLgorCQkgKiBXZSB3aWxsIG9ubHkgImdvdG8gc3RhcnQ7IiBvbmNlLCBzaW5jZSBoYXZpbmcgc2VudCB0aGUKKwkJICogZXZlbnQgcHJldmVudHMgYW5vdGhlciBjYWxsIHRvIFhGU19TRU5EX0RBVEEsIHdoaWNoIGlzCisJCSAqIHdoYXQgYWxsb3dzIHRoZSBzaXplIHRvIGNoYW5nZSBpbiB0aGUgZmlyc3QgcGxhY2UuCisJCSAqLworCQlpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX0FQUEVORCkgJiYgc2F2ZWRzaXplICE9IGlzaXplKSB7CisJCQlwb3MgPSBpc2l6ZSA9IHhpcC0+aV9kLmRpX3NpemU7CisJCQlnb3RvIHN0YXJ0OworCQl9CisJfQorCisJLyoKKwkgKiBPbiBMaW51eCwgZ2VuZXJpY19maWxlX3dyaXRlIHVwZGF0ZXMgdGhlIHRpbWVzIGV2ZW4gaWYKKwkgKiBubyBkYXRhIGlzIGNvcGllZCBpbiBzbyBsb25nIGFzIHRoZSB3cml0ZSBoYWQgYSBzaXplLgorCSAqCisJICogV2UgbXVzdCB1cGRhdGUgeGZzJyB0aW1lcyBzaW5jZSByZXZhbGlkYXRlIHdpbGwgb3ZlcmNvcHkgeGZzLgorCSAqLworCWlmICghKGlvZmxhZ3MgJiBJT19JTlZJUykpIHsKKwkJeGZzX2ljaGd0aW1lKHhpcCwgWEZTX0lDSEdUSU1FX01PRCB8IFhGU19JQ0hHVElNRV9DSEcpOworCQlpbm9kZV91cGRhdGVfdGltZShpbm9kZSwgMSk7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgb2Zmc2V0IGlzIGJleW9uZCB0aGUgc2l6ZSBvZiB0aGUgZmlsZSwgd2UgaGF2ZSBhIGNvdXBsZQorCSAqIG9mIHRoaW5ncyB0byBkby4gRmlyc3QsIGlmIHRoZXJlIGlzIGFscmVhZHkgc3BhY2UgYWxsb2NhdGVkCisJICogd2UgbmVlZCB0byBlaXRoZXIgY3JlYXRlIGhvbGVzIG9yIHplcm8gdGhlIGRpc2sgb3IgLi4uCisJICoKKwkgKiBJZiB0aGVyZSBpcyBhIHBhZ2Ugd2hlcmUgdGhlIHByZXZpb3VzIHNpemUgbGFuZHMsIHdlIG5lZWQKKwkgKiB0byB6ZXJvIGl0IG91dCB1cCB0byB0aGUgbmV3IHNpemUuCisJICovCisKKwlpZiAocG9zID4gaXNpemUpIHsKKwkJZXJyb3IgPSB4ZnNfemVyb19lb2YoQkhWX1RPX1ZOT0RFKGJkcCksIGlvLCBwb3MsCisJCQkJCWlzaXplLCBwb3MgKyBjb3VudCk7CisJCWlmIChlcnJvcikgeworCQkJeGZzX2l1bmxvY2soeGlwLCBYRlNfSUxPQ0tfRVhDTHxpb2xvY2spOworCQkJZ290byBvdXRfdW5sb2NrX2lzZW07CisJCX0KKwl9CisJeGZzX2l1bmxvY2soeGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwkvKgorCSAqIElmIHdlJ3JlIHdyaXRpbmcgdGhlIGZpbGUgdGhlbiBtYWtlIHN1cmUgdG8gY2xlYXIgdGhlCisJICogc2V0dWlkIGFuZCBzZXRnaWQgYml0cyBpZiB0aGUgcHJvY2VzcyBpcyBub3QgYmVpbmcgcnVuCisJICogYnkgcm9vdC4gIFRoaXMga2VlcHMgcGVvcGxlIGZyb20gbW9kaWZ5aW5nIHNldHVpZCBhbmQKKwkgKiBzZXRnaWQgYmluYXJpZXMuCisJICovCisKKwlpZiAoKCh4aXAtPmlfZC5kaV9tb2RlICYgU19JU1VJRCkgfHwKKwkgICAgKCh4aXAtPmlfZC5kaV9tb2RlICYgKFNfSVNHSUQgfCBTX0lYR1JQKSkgPT0KKwkJKFNfSVNHSUQgfCBTX0lYR1JQKSkpICYmCisJICAgICAhY2FwYWJsZShDQVBfRlNFVElEKSkgeworCQllcnJvciA9IHhmc193cml0ZV9jbGVhcl9zZXR1aWQoeGlwKTsKKwkJaWYgKGxpa2VseSghZXJyb3IpKQorCQkJZXJyb3IgPSAtcmVtb3ZlX3N1aWQoZmlsZS0+Zl9kZW50cnkpOworCQlpZiAodW5saWtlbHkoZXJyb3IpKSB7CisJCQl4ZnNfaXVubG9jayh4aXAsIGlvbG9jayk7CisJCQlnb3RvIG91dF91bmxvY2tfaXNlbTsKKwkJfQorCX0KKworcmV0cnk6CisJLyogV2UgY2FuIHdyaXRlIGJhY2sgdGhpcyBxdWV1ZSBpbiBwYWdlIHJlY2xhaW0gKi8KKwljdXJyZW50LT5iYWNraW5nX2Rldl9pbmZvID0gbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbzsKKworCWlmICgoaW9mbGFncyAmIElPX0lTRElSRUNUKSkgeworCQlpZiAobmVlZF9mbHVzaCkgeworCQkJeGZzX2ludmFsX2NhY2hlZF90cmFjZShpbywgcG9zLCAtMSwKKwkJCQkJY3Rvb2ZmKG9mZnRvY3QocG9zKSksIC0xKTsKKwkJCVZPUF9GTFVTSElOVkFMX1BBR0VTKHZwLCBjdG9vZmYob2ZmdG9jdChwb3MpKSwKKwkJCQkJLTEsIEZJX1JFTUFQRl9MT0NLRUQpOworCQl9CisKKwkJaWYgKG5lZWRfaXNlbSkgeworCQkJLyogZGVtb3RlIHRoZSBsb2NrIG5vdyB0aGUgY2FjaGVkIHBhZ2VzIGFyZSBnb25lICovCisJCQlYRlNfSUxPQ0tfREVNT1RFKG1wLCBpbywgWEZTX0lPTE9DS19FWENMKTsKKwkJCXVwKCZpbm9kZS0+aV9zZW0pOworCisJCQlpb2xvY2sgPSBYRlNfSU9MT0NLX1NIQVJFRDsKKwkJCWxvY2t0eXBlID0gVlJXTE9DS19XUklURV9ESVJFQ1Q7CisJCQluZWVkX2lzZW0gPSAwOworCQl9CisKKyAJCXhmc19yd19lbnRlcl90cmFjZShYRlNfRElPV1JfRU5URVIsIGlvLCAodm9pZCAqKWlvdnAsIHNlZ3MsCisJCQkJKm9mZnNldCwgaW9mbGFncyk7CisJCXJldCA9IGdlbmVyaWNfZmlsZV9kaXJlY3Rfd3JpdGUoaW9jYiwgaW92cCwKKwkJCQkmc2VncywgcG9zLCBvZmZzZXQsIGNvdW50LCBvY291bnQpOworCisJCS8qCisJCSAqIGRpcmVjdC1pbyB3cml0ZSB0byBhIGhvbGU6IGZhbGwgdGhyb3VnaCB0byBidWZmZXJlZCBJL08KKwkJICogZm9yIGNvbXBsZXRpbmcgdGhlIHJlc3Qgb2YgdGhlIHJlcXVlc3QuCisJCSAqLworCQlpZiAocmV0ID49IDAgJiYgcmV0ICE9IGNvdW50KSB7CisJCQlYRlNfU1RBVFNfQUREKHhzX3dyaXRlX2J5dGVzLCByZXQpOworCisJCQlwb3MgKz0gcmV0OworCQkJY291bnQgLT0gcmV0OworCisJCQluZWVkX2lzZW0gPSAxOworCQkJaW9mbGFncyAmPSB+SU9fSVNESVJFQ1Q7CisJCQl4ZnNfaXVubG9jayh4aXAsIGlvbG9jayk7CisJCQlnb3RvIHJlbG9jazsKKwkJfQorCX0gZWxzZSB7CisJCXhmc19yd19lbnRlcl90cmFjZShYRlNfV1JJVEVfRU5URVIsIGlvLCAodm9pZCAqKWlvdnAsIHNlZ3MsCisJCQkJKm9mZnNldCwgaW9mbGFncyk7CisJCXJldCA9IGdlbmVyaWNfZmlsZV9idWZmZXJlZF93cml0ZShpb2NiLCBpb3ZwLCBzZWdzLAorCQkJCXBvcywgb2Zmc2V0LCBjb3VudCwgcmV0KTsKKwl9CisKKwljdXJyZW50LT5iYWNraW5nX2Rldl9pbmZvID0gTlVMTDsKKworCWlmIChyZXQgPT0gLUVJT0NCUVVFVUVEICYmICEoaW9mbGFncyAmIElPX0lTQUlPKSkKKwkJcmV0ID0gd2FpdF9vbl9zeW5jX2tpb2NiKGlvY2IpOworCisJaWYgKChyZXQgPT0gLUVOT1NQQykgJiYKKwkgICAgRE1fRVZFTlRfRU5BQkxFRCh2cC0+dl92ZnNwLCB4aXAsIERNX0VWRU5UX05PU1BBQ0UpICYmCisJICAgICEoaW9mbGFncyAmIElPX0lOVklTKSkgeworCisJCXhmc19yd3VubG9jayhiZHAsIGxvY2t0eXBlKTsKKwkJZXJyb3IgPSBYRlNfU0VORF9OQU1FU1AoeGlwLT5pX21vdW50LCBETV9FVkVOVF9OT1NQQUNFLCB2cCwKKwkJCQlETV9SSUdIVF9OVUxMLCB2cCwgRE1fUklHSFRfTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkwLCAwLCAwKTsgLyogRGVsYXkgZmxhZyBpbnRlbnRpb25hbGx5ICB1bnVzZWQgKi8KKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXRfdW5sb2NrX2lzZW07CisJCXhmc19yd2xvY2soYmRwLCBsb2NrdHlwZSk7CisJCXBvcyA9IHhpcC0+aV9kLmRpX3NpemU7CisJCXJldCA9IDA7CisJCWdvdG8gcmV0cnk7CisJfQorCisJaWYgKCpvZmZzZXQgPiB4aXAtPmlfZC5kaV9zaXplKSB7CisJCXhmc19pbG9jayh4aXAsIFhGU19JTE9DS19FWENMKTsKKwkJaWYgKCpvZmZzZXQgPiB4aXAtPmlfZC5kaV9zaXplKSB7CisJCQl4aXAtPmlfZC5kaV9zaXplID0gKm9mZnNldDsKKwkJCWlfc2l6ZV93cml0ZShpbm9kZSwgKm9mZnNldCk7CisJCQl4aXAtPmlfdXBkYXRlX2NvcmUgPSAxOworCQkJeGlwLT5pX3VwZGF0ZV9zaXplID0gMTsKKwkJfQorCQl4ZnNfaXVubG9jayh4aXAsIFhGU19JTE9DS19FWENMKTsKKwl9CisKKwllcnJvciA9IC1yZXQ7CisJaWYgKHJldCA8PSAwKQorCQlnb3RvIG91dF91bmxvY2tfaW50ZXJuYWw7CisKKwlYRlNfU1RBVFNfQUREKHhzX3dyaXRlX2J5dGVzLCByZXQpOworCisJLyogSGFuZGxlIHZhcmlvdXMgU1lOQy10eXBlIHdyaXRlcyAqLworCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykgfHwgSVNfU1lOQyhpbm9kZSkpIHsKKwkJLyoKKwkJICogSWYgd2UncmUgdHJlYXRpbmcgdGhpcyBhcyBPX0RTWU5DIGFuZCB3ZSBoYXZlIG5vdCB1cGRhdGVkIHRoZQorCQkgKiBzaXplLCBmb3JjZSB0aGUgbG9nLgorCQkgKi8KKwkJaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfT1NZTkNJU09TWU5DKSAmJgorCQkgICAgISh4aXAtPmlfdXBkYXRlX3NpemUpKSB7CisJCQl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwID0geGlwLT5pX2l0ZW1wOworCisJCQkvKgorCQkJICogSWYgYW4gYWxsb2NhdGlvbiB0cmFuc2FjdGlvbiBvY2N1cnJlZAorCQkJICogd2l0aG91dCBleHRlbmRpbmcgdGhlIHNpemUsIHRoZW4gd2UgaGF2ZSB0byBmb3JjZQorCQkJICogdGhlIGxvZyB1cCB0aGUgcHJvcGVyIHBvaW50IHRvIGVuc3VyZSB0aGF0IHRoZQorCQkJICogYWxsb2NhdGlvbiBpcyBwZXJtYW5lbnQuICBXZSBjYW4ndCBjb3VudCBvbgorCQkJICogdGhlIGZhY3QgdGhhdCBidWZmZXJlZCB3cml0ZXMgbG9jayBvdXQgZGlyZWN0IEkvTworCQkJICogd3JpdGVzIC0gdGhlIGRpcmVjdCBJL08gd3JpdGUgY291bGQgaGF2ZSBleHRlbmRlZAorCQkJICogdGhlIHNpemUgbm9udHJhbnNhY3Rpb25hbGx5LCB0aGVuIGZpbmlzaGVkIGJlZm9yZQorCQkJICogd2Ugc3RhcnRlZC4gIHhmc193cml0ZV9maWxlIHdpbGwgdGhpbmsgdGhhdCB0aGUgZmlsZQorCQkJICogZGlkbid0IGdyb3cgYnV0IHRoZSB1cGRhdGUgaXNuJ3Qgc2FmZSB1bmxlc3MgdGhlCisJCQkgKiBzaXplIGNoYW5nZSBpcyBsb2dnZWQuCisJCQkgKgorCQkJICogRm9yY2UgdGhlIGxvZyBpZiB3ZSd2ZSBjb21taXR0ZWQgYSB0cmFuc2FjdGlvbgorCQkJICogYWdhaW5zdCB0aGUgaW5vZGUgb3IgaWYgc29tZW9uZSBlbHNlIGhhcyBhbmQKKwkJCSAqIHRoZSBjb21taXQgcmVjb3JkIGhhc24ndCBnb25lIHRvIGRpc2sgKGUuZy4KKwkJCSAqIHRoZSBpbm9kZSBpcyBwaW5uZWQpLiAgVGhpcyBndWFyYW50ZWVzIHRoYXQKKwkJCSAqIGFsbCBjaGFuZ2VzIGFmZmVjdGluZyB0aGUgaW5vZGUgYXJlIHBlcm1hbmVudAorCQkJICogd2hlbiB3ZSByZXR1cm4uCisJCQkgKi8KKwkJCWlmIChpaXAgJiYgaWlwLT5pbGlfbGFzdF9sc24pIHsKKwkJCQl4ZnNfbG9nX2ZvcmNlKG1wLCBpaXAtPmlsaV9sYXN0X2xzbiwKKwkJCQkJCVhGU19MT0dfRk9SQ0UgfCBYRlNfTE9HX1NZTkMpOworCQkJfSBlbHNlIGlmICh4ZnNfaXBpbmNvdW50KHhpcCkgPiAwKSB7CisJCQkJeGZzX2xvZ19mb3JjZShtcCwgKHhmc19sc25fdCkwLAorCQkJCQkJWEZTX0xPR19GT1JDRSB8IFhGU19MT0dfU1lOQyk7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCXhmc190cmFuc190CSp0cDsKKworCQkJLyoKKwkJCSAqIE9fU1lOQyBvciBPX0RTWU5DIF93aXRoXyBhIHNpemUgdXBkYXRlIGFyZSBoYW5kbGVkCisJCQkgKiB0aGUgc2FtZSB3YXkuCisJCQkgKgorCQkJICogSWYgdGhlIHdyaXRlIHdhcyBzeW5jaHJvbm91cyB0aGVuIHdlIG5lZWQgdG8gbWFrZQorCQkJICogc3VyZSB0aGF0IHRoZSBpbm9kZSBtb2RpZmljYXRpb24gdGltZSBpcyBwZXJtYW5lbnQuCisJCQkgKiBXZSdsbCBoYXZlIHVwZGF0ZWQgdGhlIHRpbWVzdGFtcCBhYm92ZSwgc28gaGVyZQorCQkJICogd2UgdXNlIGEgc3luY2hyb25vdXMgdHJhbnNhY3Rpb24gdG8gbG9nIHRoZSBpbm9kZS4KKwkJCSAqIEl0J3Mgbm90IGZhc3QsIGJ1dCBpdCdzIG5lY2Vzc2FyeS4KKwkJCSAqCisJCQkgKiBJZiB0aGlzIGEgZHN5bmMgd3JpdGUgYW5kIHRoZSBzaXplIGdvdCBjaGFuZ2VkCisJCQkgKiBub24tdHJhbnNhY3Rpb25hbGx5LCB0aGVuIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQKKwkJCSAqIHRoZSBzaXplIGNoYW5nZSBnZXRzIGxvZ2dlZCBpbiBhIHN5bmNocm9ub3VzCisJCQkgKiB0cmFuc2FjdGlvbi4KKwkJCSAqLworCisJCQl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1dSSVRFX1NZTkMpOworCQkJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLAorCQkJCQkJICAgICAgWEZTX1NXUklURV9MT0dfUkVTKG1wKSwKKwkJCQkJCSAgICAgIDAsIDAsIDApKSkgeworCQkJCS8qIFRyYW5zYWN0aW9uIHJlc2VydmUgZmFpbGVkICovCisJCQkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCQl9IGVsc2UgeworCQkJCS8qIFRyYW5zYWN0aW9uIHJlc2VydmUgc3VjY2Vzc2Z1bCAqLworCQkJCXhmc19pbG9jayh4aXAsIFhGU19JTE9DS19FWENMKTsKKwkJCQl4ZnNfdHJhbnNfaWpvaW4odHAsIHhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJCXhmc190cmFuc19paG9sZCh0cCwgeGlwKTsKKwkJCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCB4aXAsIFhGU19JTE9HX0NPUkUpOworCQkJCXhmc190cmFuc19zZXRfc3luYyh0cCk7CisJCQkJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwLCBOVUxMKTsKKwkJCQl4ZnNfaXVubG9jayh4aXAsIFhGU19JTE9DS19FWENMKTsKKwkJCX0KKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIG91dF91bmxvY2tfaW50ZXJuYWw7CisJCX0KKwkKKwkJeGZzX3J3dW5sb2NrKGJkcCwgbG9ja3R5cGUpOworCQlpZiAobmVlZF9pc2VtKQorCQkJdXAoJmlub2RlLT5pX3NlbSk7CisKKwkJZXJyb3IgPSBzeW5jX3BhZ2VfcmFuZ2UoaW5vZGUsIG1hcHBpbmcsIHBvcywgcmV0KTsKKwkJaWYgKCFlcnJvcikKKwkJCWVycm9yID0gcmV0OworCQlyZXR1cm4gZXJyb3I7CisJfQorCisgb3V0X3VubG9ja19pbnRlcm5hbDoKKwl4ZnNfcnd1bmxvY2soYmRwLCBsb2NrdHlwZSk7Cisgb3V0X3VubG9ja19pc2VtOgorCWlmIChuZWVkX2lzZW0pCisJCXVwKCZpbm9kZS0+aV9zZW0pOworCXJldHVybiAtZXJyb3I7Cit9CisKKy8qCisgKiBBbGwgeGZzIG1ldGFkYXRhIGJ1ZmZlcnMgZXhjZXB0IGxvZyBzdGF0ZSBtYWNoaW5lIGJ1ZmZlcnMKKyAqIGdldCB0aGlzIGF0dGFjaGVkIGFzIHRoZWlyIGJfYmRzdHJhdCBjYWxsYmFjayBmdW5jdGlvbi4KKyAqIFRoaXMgaXMgc28gdGhhdCB3ZSBjYW4gY2F0Y2ggYSBidWZmZXIKKyAqIGFmdGVyIHByZW1hdHVyZWx5IHVucGlubmluZyBpdCB0byBmb3JjaWJseSBzaHV0ZG93biB0aGUgZmlsZXN5c3RlbS4KKyAqLworaW50Cit4ZnNfYmRzdHJhdF9jYihzdHJ1Y3QgeGZzX2J1ZiAqYnApCit7CisJeGZzX21vdW50X3QJKm1wOworCisJbXAgPSBYRlNfQlVGX0ZTUFJJVkFURTMoYnAsIHhmc19tb3VudF90ICopOworCWlmICghWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKKwkJcGFnZWJ1Zl9pb3JlcXVlc3QoYnApOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQl4ZnNfYnVmdHJhY2UoIlhGU19fQkRTVFJBVCBJT0VSUk9SIiwgYnApOworCQkvKgorCQkgKiBNZXRhZGF0YSB3cml0ZSB0aGF0IGRpZG4ndCBnZXQgbG9nZ2VkIGJ1dAorCQkgKiB3cml0dGVuIGRlbGF5ZWQgYW55d2F5LiBUaGVzZSBhcmVuJ3QgYXNzb2NpYXRlZAorCQkgKiB3aXRoIGEgdHJhbnNhY3Rpb24sIGFuZCBjYW4gYmUgaWdub3JlZC4KKwkJICovCisJCWlmIChYRlNfQlVGX0lPRE9ORV9GVU5DKGJwKSA9PSBOVUxMICYmCisJCSAgICAoWEZTX0JVRl9JU1JFQUQoYnApKSA9PSAwKQorCQkJcmV0dXJuICh4ZnNfYmlvZXJyb3JfcmVsc2UoYnApKTsKKwkJZWxzZQorCQkJcmV0dXJuICh4ZnNfYmlvZXJyb3IoYnApKTsKKwl9Cit9CisKKworaW50Cit4ZnNfYm1hcChiaHZfZGVzY190CSpiZHAsCisJeGZzX29mZl90CW9mZnNldCwKKwlzc2l6ZV90CQljb3VudCwKKwlpbnQJCWZsYWdzLAorCXhmc19pb21hcF90CSppb21hcHAsCisJaW50CQkqbmlvbWFwcykKK3sKKwl4ZnNfaW5vZGVfdAkqaXAgPSBYRlNfQkhWVE9JKGJkcCk7CisJeGZzX2lvY29yZV90CSppbyA9ICZpcC0+aV9pb2NvcmU7CisKKwlBU1NFUlQoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRlJFRyk7CisJQVNTRVJUKCgoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpICE9IDApID09CisJICAgICAgICgoaXAtPmlfaW9jb3JlLmlvX2ZsYWdzICYgWEZTX0lPQ09SRV9SVCkgIT0gMCkpOworCisJcmV0dXJuIHhmc19pb21hcChpbywgb2Zmc2V0LCBjb3VudCwgZmxhZ3MsIGlvbWFwcCwgbmlvbWFwcyk7Cit9CisKKy8qCisgKiBXcmFwcGVyIGFyb3VuZCBiZHN0cmF0IHNvIHRoYXQgd2UgY2FuIHN0b3AgZGF0YQorICogZnJvbSBnb2luZyB0byBkaXNrIGluIGNhc2Ugd2UgYXJlIHNodXR0aW5nIGRvd24gdGhlIGZpbGVzeXN0ZW0uCisgKiBUeXBpY2FsbHkgdXNlciBkYXRhIGdvZXMgdGhydSB0aGlzIHBhdGg7IG9uZSBvZiB0aGUgZXhjZXB0aW9ucworICogaXMgdGhlIHN1cGVyYmxvY2suCisgKi8KK2ludAoreGZzYmRzdHJhdCgKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwKQoreworCUFTU0VSVChtcCk7CisJaWYgKCFYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgeworCQkvKiBHcmlvIHJlZGlyZWN0aW9uIHdvdWxkIGdvIGhlcmUKKwkJICogaWYgKFhGU19CVUZfSVNfR1JJTyhicCkpIHsKKwkJICovCisKKwkJcGFnZWJ1Zl9pb3JlcXVlc3QoYnApOworCQlyZXR1cm4gMDsKKwl9CisKKwl4ZnNfYnVmdHJhY2UoIlhGU0JEU1RSQVQgSU9FUlJPUiIsIGJwKTsKKwlyZXR1cm4gKHhmc19iaW9lcnJvcl9yZWxzZShicCkpOworfQorCisvKgorICogSWYgdGhlIHVuZGVybHlpbmcgKGRhdGEvbG9nL3J0KSBkZXZpY2UgaXMgcmVhZG9ubHksIHRoZXJlIGFyZSBzb21lCisgKiBvcGVyYXRpb25zIHRoYXQgY2Fubm90IHByb2NlZWQuCisgKi8KK2ludAoreGZzX2Rldl9pc19yZWFkX29ubHkoCisJeGZzX21vdW50X3QJCSptcCwKKwljaGFyCQkJKm1lc3NhZ2UpCit7CisJaWYgKHhmc19yZWFkb25seV9idWZ0YXJnKG1wLT5tX2RkZXZfdGFyZ3ApIHx8CisJICAgIHhmc19yZWFkb25seV9idWZ0YXJnKG1wLT5tX2xvZ2Rldl90YXJncCkgfHwKKwkgICAgKG1wLT5tX3J0ZGV2X3RhcmdwICYmIHhmc19yZWFkb25seV9idWZ0YXJnKG1wLT5tX3J0ZGV2X3RhcmdwKSkpIHsKKwkJY21uX2VycihDRV9OT1RFLAorCQkJIlhGUzogJXMgcmVxdWlyZWQgb24gcmVhZC1vbmx5IGRldmljZS4iLCBtZXNzYWdlKTsKKwkJY21uX2VycihDRV9OT1RFLAorCQkJIlhGUzogd3JpdGUgYWNjZXNzIHVuYXZhaWxhYmxlLCBjYW5ub3QgcHJvY2VlZC4iKTsKKwkJcmV0dXJuIEVST0ZTOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcyM2UzNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5oCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19MUldfSF9fCisjZGVmaW5lIF9fWEZTX0xSV19IX18KKworc3RydWN0IHZub2RlOworc3RydWN0IGJodl9kZXNjOworc3RydWN0IHhmc19tb3VudDsKK3N0cnVjdCB4ZnNfaW9jb3JlOworc3RydWN0IHhmc19pbm9kZTsKK3N0cnVjdCB4ZnNfYm1idF9pcmVjOworc3RydWN0IHhmc19idWY7CitzdHJ1Y3QgeGZzX2lvbWFwOworCisjaWYgZGVmaW5lZChYRlNfUldfVFJBQ0UpCisvKgorICogRGVmaW5lcyBmb3IgdGhlIHRyYWNlIG1lY2hhbmlzbXMgaW4geGZzX2xydy5jLgorICovCisjZGVmaW5lCVhGU19SV19LVFJBQ0VfU0laRQkxMjgKKworI2RlZmluZQlYRlNfUkVBRF9FTlRFUgkJMQorI2RlZmluZQlYRlNfV1JJVEVfRU5URVIJCTIKKyNkZWZpbmUgWEZTX0lPTUFQX1JFQURfRU5URVIJMworI2RlZmluZQlYRlNfSU9NQVBfV1JJVEVfRU5URVIJNAorI2RlZmluZQlYRlNfSU9NQVBfUkVBRF9NQVAJNQorI2RlZmluZQlYRlNfSU9NQVBfV1JJVEVfTUFQCTYKKyNkZWZpbmUJWEZTX0lPTUFQX1dSSVRFX05PU1BBQ0UJNworI2RlZmluZQlYRlNfSVRSVU5DX1NUQVJUCTgKKyNkZWZpbmUJWEZTX0lUUlVOQ19GSU5JU0gxCTkKKyNkZWZpbmUJWEZTX0lUUlVOQ19GSU5JU0gyCTEwCisjZGVmaW5lCVhGU19DVFJVTkMxCQkxMQorI2RlZmluZQlYRlNfQ1RSVU5DMgkJMTIKKyNkZWZpbmUJWEZTX0NUUlVOQzMJCTEzCisjZGVmaW5lCVhGU19DVFJVTkM0CQkxNAorI2RlZmluZQlYRlNfQ1RSVU5DNQkJMTUKKyNkZWZpbmUJWEZTX0NUUlVOQzYJCTE2CisjZGVmaW5lCVhGU19CVU5NQVBJCQkxNworI2RlZmluZQlYRlNfSU5WQUxfQ0FDSEVECTE4CisjZGVmaW5lCVhGU19ESU9SRF9FTlRFUgkJMTkKKyNkZWZpbmUJWEZTX0RJT1dSX0VOVEVSCQkyMAorI2RlZmluZQlYRlNfU0VOREZJTEVfRU5URVIJMjEKKyNkZWZpbmUJWEZTX1dSSVRFUEFHRV9FTlRFUgkyMgorI2RlZmluZQlYRlNfUkVMRUFTRVBBR0VfRU5URVIJMjMKKyNkZWZpbmUJWEZTX0lPTUFQX0FMTE9DX0VOVEVSCTI0CisjZGVmaW5lCVhGU19JT01BUF9BTExPQ19NQVAJMjUKKyNkZWZpbmUJWEZTX0lPTUFQX1VOV1JJVFRFTgkyNgorZXh0ZXJuIHZvaWQgeGZzX3J3X2VudGVyX3RyYWNlKGludCwgc3RydWN0IHhmc19pb2NvcmUgKiwKKwkJCQl2b2lkICosIHNpemVfdCwgbG9mZl90LCBpbnQpOworZXh0ZXJuIHZvaWQgeGZzX2ludmFsX2NhY2hlZF90cmFjZShzdHJ1Y3QgeGZzX2lvY29yZSAqLAorCQkJCXhmc19vZmZfdCwgeGZzX29mZl90LCB4ZnNfb2ZmX3QsIHhmc19vZmZfdCk7CisjZWxzZQorI2RlZmluZSB4ZnNfcndfZW50ZXJfdHJhY2UodGFnLCBpbywgZGF0YSwgc2l6ZSwgb2Zmc2V0LCBpb2ZsYWdzKQorI2RlZmluZSB4ZnNfaW52YWxfY2FjaGVkX3RyYWNlKGlvLCBvZmZzZXQsIGxlbiwgZmlyc3QsIGxhc3QpCisjZW5kaWYKKworLyoKKyAqIE1heGltdW0gY291bnQgb2YgYm1hcHMgdXNlZCBieSByZWFkIGFuZCB3cml0ZSBwYXRocy4KKyAqLworI2RlZmluZQlYRlNfTUFYX1JXX05CTUFQUwk0CisKK2V4dGVybiBpbnQgeGZzX2JtYXAoc3RydWN0IGJodl9kZXNjICosIHhmc19vZmZfdCwgc3NpemVfdCwgaW50LAorCQkJc3RydWN0IHhmc19pb21hcCAqLCBpbnQgKik7CitleHRlcm4gaW50IHhmc2Jkc3RyYXQoc3RydWN0IHhmc19tb3VudCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKK2V4dGVybiBpbnQgeGZzX2Jkc3RyYXRfY2Ioc3RydWN0IHhmc19idWYgKik7CisKK2V4dGVybiBpbnQgeGZzX3plcm9fZW9mKHN0cnVjdCB2bm9kZSAqLCBzdHJ1Y3QgeGZzX2lvY29yZSAqLCB4ZnNfb2ZmX3QsCisJCQkJeGZzX2ZzaXplX3QsIHhmc19mc2l6ZV90KTsKK2V4dGVybiB2b2lkIHhmc19pbnZhbF9jYWNoZWRfcGFnZXMoc3RydWN0IHZub2RlCSosIHN0cnVjdCB4ZnNfaW9jb3JlICosCisJCQkJeGZzX29mZl90LCBpbnQsIGludCk7CitleHRlcm4gc3NpemVfdCB4ZnNfcmVhZChzdHJ1Y3QgYmh2X2Rlc2MgKiwgc3RydWN0IGtpb2NiICosCisJCQkJY29uc3Qgc3RydWN0IGlvdmVjICosIHVuc2lnbmVkIGludCwKKwkJCQlsb2ZmX3QgKiwgaW50LCBzdHJ1Y3QgY3JlZCAqKTsKK2V4dGVybiBzc2l6ZV90IHhmc193cml0ZShzdHJ1Y3QgYmh2X2Rlc2MgKiwgc3RydWN0IGtpb2NiICosCisJCQkJY29uc3Qgc3RydWN0IGlvdmVjICosIHVuc2lnbmVkIGludCwKKwkJCQlsb2ZmX3QgKiwgaW50LCBzdHJ1Y3QgY3JlZCAqKTsKK2V4dGVybiBzc2l6ZV90IHhmc19zZW5kZmlsZShzdHJ1Y3QgYmh2X2Rlc2MgKiwgc3RydWN0IGZpbGUgKiwKKwkJCQlsb2ZmX3QgKiwgaW50LCBzaXplX3QsIHJlYWRfYWN0b3JfdCwKKwkJCQl2b2lkICosIHN0cnVjdCBjcmVkICopOworCitleHRlcm4gaW50IHhmc19kZXZfaXNfcmVhZF9vbmx5KHN0cnVjdCB4ZnNfbW91bnQgKiwgY2hhciAqKTsKKworI2RlZmluZSBYRlNfRlNCX1RPX0RCX0lPKGlvLGZzYikgXAorCQkoKChpbyktPmlvX2ZsYWdzICYgWEZTX0lPQ09SRV9SVCkgPyBcCisJCSBYRlNfRlNCX1RPX0JCKChpbyktPmlvX21vdW50LCAoZnNiKSkgOiBcCisJCSBYRlNfRlNCX1RPX0RBRERSKChpbyktPmlvX21vdW50LCAoZnNiKSkpCisKKyNlbmRpZgkvKiBfX1hGU19MUldfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdGF0cy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3RhdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWY1ZGRiCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3RhdHMuYwpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworREVGSU5FX1BFUl9DUFUoc3RydWN0IHhmc3N0YXRzLCB4ZnNzdGF0cyk7CisKK1NUQVRJQyBpbnQKK3hmc19yZWFkX3hmc3N0YXRzKAorCWNoYXIJCSpidWZmZXIsCisJY2hhcgkJKipzdGFydCwKKwlvZmZfdAkJb2Zmc2V0LAorCWludAkJY291bnQsCisJaW50CQkqZW9mLAorCXZvaWQJCSpkYXRhKQoreworCWludAkJYywgaSwgaiwgbGVuLCB2YWw7CisJX191aW50NjRfdAl4c194c3RyYXRfYnl0ZXMgPSAwOworCV9fdWludDY0X3QJeHNfd3JpdGVfYnl0ZXMgPSAwOworCV9fdWludDY0X3QJeHNfcmVhZF9ieXRlcyA9IDA7CisKKwlzdGF0aWMgc3RydWN0IHhzdGF0c19lbnRyeSB7CisJCWNoYXIJKmRlc2M7CisJCWludAllbmRwb2ludDsKKwl9IHhzdGF0c1tdID0geworCQl7ICJleHRlbnRfYWxsb2MiLAlYRlNTVEFUX0VORF9FWFRFTlRfQUxMT0MJfSwKKwkJeyAiYWJ0IiwJCVhGU1NUQVRfRU5EX0FMTE9DX0JUUkVFCQl9LAorCQl7ICJibGtfbWFwIiwJCVhGU1NUQVRfRU5EX0JMT0NLX01BUFBJTkcJfSwKKwkJeyAiYm1idCIsCQlYRlNTVEFUX0VORF9CTE9DS19NQVBfQlRSRUUJfSwKKwkJeyAiZGlyIiwJCVhGU1NUQVRfRU5EX0RJUkVDVE9SWV9PUFMJfSwKKwkJeyAidHJhbnMiLAkJWEZTU1RBVF9FTkRfVFJBTlNBQ1RJT05TCX0sCisJCXsgImlnIiwJCQlYRlNTVEFUX0VORF9JTk9ERV9PUFMJCX0sCisJCXsgImxvZyIsCQlYRlNTVEFUX0VORF9MT0dfT1BTCQl9LAorCQl7ICJwdXNoX2FpbCIsCQlYRlNTVEFUX0VORF9UQUlMX1BVU0hJTkcJfSwKKwkJeyAieHN0cmF0IiwJCVhGU1NUQVRfRU5EX1dSSVRFX0NPTlZFUlQJfSwKKwkJeyAicnciLAkJCVhGU1NUQVRfRU5EX1JFQURfV1JJVEVfT1BTCX0sCisJCXsgImF0dHIiLAkJWEZTU1RBVF9FTkRfQVRUUklCVVRFX09QUwl9LAorCQl7ICJpY2x1c3RlciIsCQlYRlNTVEFUX0VORF9JTk9ERV9DTFVTVEVSCX0sCisJCXsgInZub2RlcyIsCQlYRlNTVEFUX0VORF9WTk9ERV9PUFMJCX0sCisJCXsgImJ1ZiIsCQlYRlNTVEFUX0VORF9CVUYJCQl9LAorCX07CisKKwkvKiBMb29wIG92ZXIgYWxsIHN0YXRzIGdyb3VwcyAqLworCWZvciAoaT1qPWxlbiA9IDA7IGkgPCBzaXplb2YoeHN0YXRzKS9zaXplb2Yoc3RydWN0IHhzdGF0c19lbnRyeSk7IGkrKykgeworCQlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sIHhzdGF0c1tpXS5kZXNjKTsKKwkJLyogaW5uZXIgbG9vcCBkb2VzIGVhY2ggZ3JvdXAgKi8KKwkJd2hpbGUgKGogPCB4c3RhdHNbaV0uZW5kcG9pbnQpIHsKKwkJCXZhbCA9IDA7CisJCQkvKiBzdW0gb3ZlciBhbGwgY3B1cyAqLworCQkJZm9yIChjID0gMDsgYyA8IE5SX0NQVVM7IGMrKykgeworCQkJCWlmICghY3B1X3Bvc3NpYmxlKGMpKSBjb250aW51ZTsKKwkJCQl2YWwgKz0gKigoKF9fdTMyKikmcGVyX2NwdSh4ZnNzdGF0cywgYykgKyBqKSk7CisJCQl9CisJCQlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICIgJXUiLCB2YWwpOworCQkJaisrOworCQl9CisJCWJ1ZmZlcltsZW4rK10gPSAnXG4nOworCX0KKwkvKiBleHRyYSBwcmVjaXNpb24gY291bnRlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7CisJCWlmICghY3B1X3Bvc3NpYmxlKGkpKSBjb250aW51ZTsKKwkJeHNfeHN0cmF0X2J5dGVzICs9IHBlcl9jcHUoeGZzc3RhdHMsIGkpLnhzX3hzdHJhdF9ieXRlczsKKwkJeHNfd3JpdGVfYnl0ZXMgKz0gcGVyX2NwdSh4ZnNzdGF0cywgaSkueHNfd3JpdGVfYnl0ZXM7CisJCXhzX3JlYWRfYnl0ZXMgKz0gcGVyX2NwdSh4ZnNzdGF0cywgaSkueHNfcmVhZF9ieXRlczsKKwl9CisKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICJ4cGMgJUx1ICVMdSAlTHVcbiIsCisJCQl4c194c3RyYXRfYnl0ZXMsIHhzX3dyaXRlX2J5dGVzLCB4c19yZWFkX2J5dGVzKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIgKyBsZW4sICJkZWJ1ZyAldVxuIiwKKyNpZiBkZWZpbmVkKERFQlVHKQorCQkxKTsKKyNlbHNlCisJCTApOworI2VuZGlmCisKKwlpZiAob2Zmc2V0ID49IGxlbikgeworCQkqc3RhcnQgPSBidWZmZXI7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCWlmICgobGVuIC09IG9mZnNldCkgPiBjb3VudCkKKwkJcmV0dXJuIGNvdW50OworCSplb2YgPSAxOworCisJcmV0dXJuIGxlbjsKK30KKwordm9pZAoreGZzX2luaXRfcHJvY2ZzKHZvaWQpCit7CisJaWYgKCFwcm9jX21rZGlyKCJmcy94ZnMiLCBOVUxMKSkKKwkJcmV0dXJuOworCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImZzL3hmcy9zdGF0IiwgMCwgTlVMTCwgeGZzX3JlYWRfeGZzc3RhdHMsIE5VTEwpOworfQorCit2b2lkCit4ZnNfY2xlYW51cF9wcm9jZnModm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgiZnMveGZzL3N0YXQiLCBOVUxMKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiZnMveGZzIiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdGF0cy5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3RhdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjc1NmE2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3RhdHMuaApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX1NUQVRTX0hfXworI2RlZmluZSBfX1hGU19TVEFUU19IX18KKworCisjaWYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykgJiYgIWRlZmluZWQoWEZTX1NUQVRTX09GRikKKworI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorCisvKgorICogWEZTIGdsb2JhbCBzdGF0aXN0aWNzCisgKi8KK3N0cnVjdCB4ZnNzdGF0cyB7CisjIGRlZmluZSBYRlNTVEFUX0VORF9FWFRFTlRfQUxMT0MJNAorCV9fdWludDMyX3QJCXhzX2FsbG9jeDsKKwlfX3VpbnQzMl90CQl4c19hbGxvY2I7CisJX191aW50MzJfdAkJeHNfZnJlZXg7CisJX191aW50MzJfdAkJeHNfZnJlZWI7CisjIGRlZmluZSBYRlNTVEFUX0VORF9BTExPQ19CVFJFRQkoWEZTU1RBVF9FTkRfRVhURU5UX0FMTE9DKzQpCisJX191aW50MzJfdAkJeHNfYWJ0X2xvb2t1cDsKKwlfX3VpbnQzMl90CQl4c19hYnRfY29tcGFyZTsKKwlfX3VpbnQzMl90CQl4c19hYnRfaW5zcmVjOworCV9fdWludDMyX3QJCXhzX2FidF9kZWxyZWM7CisjIGRlZmluZSBYRlNTVEFUX0VORF9CTE9DS19NQVBQSU5HCShYRlNTVEFUX0VORF9BTExPQ19CVFJFRSs3KQorCV9fdWludDMyX3QJCXhzX2Jsa19tYXByOworCV9fdWludDMyX3QJCXhzX2Jsa19tYXB3OworCV9fdWludDMyX3QJCXhzX2Jsa191bm1hcDsKKwlfX3VpbnQzMl90CQl4c19hZGRfZXhsaXN0OworCV9fdWludDMyX3QJCXhzX2RlbF9leGxpc3Q7CisJX191aW50MzJfdAkJeHNfbG9va19leGxpc3Q7CisJX191aW50MzJfdAkJeHNfY21wX2V4bGlzdDsKKyMgZGVmaW5lIFhGU1NUQVRfRU5EX0JMT0NLX01BUF9CVFJFRQkoWEZTU1RBVF9FTkRfQkxPQ0tfTUFQUElORys0KQorCV9fdWludDMyX3QJCXhzX2JtYnRfbG9va3VwOworCV9fdWludDMyX3QJCXhzX2JtYnRfY29tcGFyZTsKKwlfX3VpbnQzMl90CQl4c19ibWJ0X2luc3JlYzsKKwlfX3VpbnQzMl90CQl4c19ibWJ0X2RlbHJlYzsKKyMgZGVmaW5lIFhGU1NUQVRfRU5EX0RJUkVDVE9SWV9PUFMJKFhGU1NUQVRfRU5EX0JMT0NLX01BUF9CVFJFRSs0KQorCV9fdWludDMyX3QJCXhzX2Rpcl9sb29rdXA7CisJX191aW50MzJfdAkJeHNfZGlyX2NyZWF0ZTsKKwlfX3VpbnQzMl90CQl4c19kaXJfcmVtb3ZlOworCV9fdWludDMyX3QJCXhzX2Rpcl9nZXRkZW50czsKKyMgZGVmaW5lIFhGU1NUQVRfRU5EX1RSQU5TQUNUSU9OUwkoWEZTU1RBVF9FTkRfRElSRUNUT1JZX09QUyszKQorCV9fdWludDMyX3QJCXhzX3RyYW5zX3N5bmM7CisJX191aW50MzJfdAkJeHNfdHJhbnNfYXN5bmM7CisJX191aW50MzJfdAkJeHNfdHJhbnNfZW1wdHk7CisjIGRlZmluZSBYRlNTVEFUX0VORF9JTk9ERV9PUFMJCShYRlNTVEFUX0VORF9UUkFOU0FDVElPTlMrNykKKwlfX3VpbnQzMl90CQl4c19pZ19hdHRlbXB0czsKKwlfX3VpbnQzMl90CQl4c19pZ19mb3VuZDsKKwlfX3VpbnQzMl90CQl4c19pZ19mcmVjeWNsZTsKKwlfX3VpbnQzMl90CQl4c19pZ19taXNzZWQ7CisJX191aW50MzJfdAkJeHNfaWdfZHVwOworCV9fdWludDMyX3QJCXhzX2lnX3JlY2xhaW1zOworCV9fdWludDMyX3QJCXhzX2lnX2F0dHJjaGc7CisjIGRlZmluZSBYRlNTVEFUX0VORF9MT0dfT1BTCQkoWEZTU1RBVF9FTkRfSU5PREVfT1BTKzUpCisJX191aW50MzJfdAkJeHNfbG9nX3dyaXRlczsKKwlfX3VpbnQzMl90CQl4c19sb2dfYmxvY2tzOworCV9fdWludDMyX3QJCXhzX2xvZ19ub2ljbG9nczsKKwlfX3VpbnQzMl90CQl4c19sb2dfZm9yY2U7CisJX191aW50MzJfdAkJeHNfbG9nX2ZvcmNlX3NsZWVwOworIyBkZWZpbmUgWEZTU1RBVF9FTkRfVEFJTF9QVVNISU5HCShYRlNTVEFUX0VORF9MT0dfT1BTKzEwKQorCV9fdWludDMyX3QJCXhzX3RyeV9sb2dzcGFjZTsKKwlfX3VpbnQzMl90CQl4c19zbGVlcF9sb2dzcGFjZTsKKwlfX3VpbnQzMl90CQl4c19wdXNoX2FpbDsKKwlfX3VpbnQzMl90CQl4c19wdXNoX2FpbF9zdWNjZXNzOworCV9fdWludDMyX3QJCXhzX3B1c2hfYWlsX3B1c2hidWY7CisJX191aW50MzJfdAkJeHNfcHVzaF9haWxfcGlubmVkOworCV9fdWludDMyX3QJCXhzX3B1c2hfYWlsX2xvY2tlZDsKKwlfX3VpbnQzMl90CQl4c19wdXNoX2FpbF9mbHVzaGluZzsKKwlfX3VpbnQzMl90CQl4c19wdXNoX2FpbF9yZXN0YXJ0czsKKwlfX3VpbnQzMl90CQl4c19wdXNoX2FpbF9mbHVzaDsKKyMgZGVmaW5lIFhGU1NUQVRfRU5EX1dSSVRFX0NPTlZFUlQJKFhGU1NUQVRfRU5EX1RBSUxfUFVTSElORysyKQorCV9fdWludDMyX3QJCXhzX3hzdHJhdF9xdWljazsKKwlfX3VpbnQzMl90CQl4c194c3RyYXRfc3BsaXQ7CisjIGRlZmluZSBYRlNTVEFUX0VORF9SRUFEX1dSSVRFX09QUwkoWEZTU1RBVF9FTkRfV1JJVEVfQ09OVkVSVCsyKQorCV9fdWludDMyX3QJCXhzX3dyaXRlX2NhbGxzOworCV9fdWludDMyX3QJCXhzX3JlYWRfY2FsbHM7CisjIGRlZmluZSBYRlNTVEFUX0VORF9BVFRSSUJVVEVfT1BTCShYRlNTVEFUX0VORF9SRUFEX1dSSVRFX09QUys0KQorCV9fdWludDMyX3QJCXhzX2F0dHJfZ2V0OworCV9fdWludDMyX3QJCXhzX2F0dHJfc2V0OworCV9fdWludDMyX3QJCXhzX2F0dHJfcmVtb3ZlOworCV9fdWludDMyX3QJCXhzX2F0dHJfbGlzdDsKKyMgZGVmaW5lIFhGU1NUQVRfRU5EX0lOT0RFX0NMVVNURVIJKFhGU1NUQVRfRU5EX0FUVFJJQlVURV9PUFMrMykKKwlfX3VpbnQzMl90CQl4c19pZmx1c2hfY291bnQ7CisJX191aW50MzJfdAkJeHNfaWNsdXN0ZXJfZmx1c2hjbnQ7CisJX191aW50MzJfdAkJeHNfaWNsdXN0ZXJfZmx1c2hpbm9kZTsKKyMgZGVmaW5lIFhGU1NUQVRfRU5EX1ZOT0RFX09QUwkJKFhGU1NUQVRfRU5EX0lOT0RFX0NMVVNURVIrOCkKKwlfX3VpbnQzMl90CQl2bl9hY3RpdmU7CS8qICMgdm5vZGVzIG5vdCBvbiBmcmVlIGxpc3RzICovCisJX191aW50MzJfdAkJdm5fYWxsb2M7CS8qICMgdGltZXMgdm5fYWxsb2MgY2FsbGVkICovCisJX191aW50MzJfdAkJdm5fZ2V0OwkJLyogIyB0aW1lcyB2bl9nZXQgY2FsbGVkICovCisJX191aW50MzJfdAkJdm5faG9sZDsJLyogIyB0aW1lcyB2bl9ob2xkIGNhbGxlZCAqLworCV9fdWludDMyX3QJCXZuX3JlbGU7CS8qICMgdGltZXMgdm5fcmVsZSBjYWxsZWQgKi8KKwlfX3VpbnQzMl90CQl2bl9yZWNsYWltOwkvKiAjIHRpbWVzIHZuX3JlY2xhaW0gY2FsbGVkICovCisJX191aW50MzJfdAkJdm5fcmVtb3ZlOwkvKiAjIHRpbWVzIHZuX3JlbW92ZSBjYWxsZWQgKi8KKwlfX3VpbnQzMl90CQl2bl9mcmVlOwkvKiAjIHRpbWVzIHZuX2ZyZWUgY2FsbGVkICovCisjZGVmaW5lIFhGU1NUQVRfRU5EX0JVRgkJCShYRlNTVEFUX0VORF9WTk9ERV9PUFMrOSkKKwlfX3VpbnQzMl90CQlwYl9nZXQ7CisJX191aW50MzJfdAkJcGJfY3JlYXRlOworCV9fdWludDMyX3QJCXBiX2dldF9sb2NrZWQ7CisJX191aW50MzJfdAkJcGJfZ2V0X2xvY2tlZF93YWl0ZWQ7CisJX191aW50MzJfdAkJcGJfYnVzeV9sb2NrZWQ7CisJX191aW50MzJfdAkJcGJfbWlzc19sb2NrZWQ7CisJX191aW50MzJfdAkJcGJfcGFnZV9yZXRyaWVzOworCV9fdWludDMyX3QJCXBiX3BhZ2VfZm91bmQ7CisJX191aW50MzJfdAkJcGJfZ2V0X3JlYWQ7CisvKiBFeHRyYSBwcmVjaXNpb24gY291bnRlcnMgKi8KKwlfX3VpbnQ2NF90CQl4c194c3RyYXRfYnl0ZXM7CisJX191aW50NjRfdAkJeHNfd3JpdGVfYnl0ZXM7CisJX191aW50NjRfdAkJeHNfcmVhZF9ieXRlczsKK307CisKK0RFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgeGZzc3RhdHMsIHhmc3N0YXRzKTsKKworLyoKKyAqIFdlIGRvbid0IGRpc2FibGUgcHJlZW1wdCwgbm90IHRvbyB3b3JyaWVkIGFib3V0IHBva2luZyB0aGUKKyAqIHdyb25nIENQVSdzIHN0YXQgZm9yIG5vdyAoYWxzbyBhZ2dyZWdhdGVkIGJlZm9yZSByZXBvcnRpbmcpLgorICovCisjZGVmaW5lIFhGU19TVEFUU19JTkModikJKHBlcl9jcHUoeGZzc3RhdHMsIGN1cnJlbnRfY3B1KCkpLnYrKykKKyNkZWZpbmUgWEZTX1NUQVRTX0RFQyh2KQkocGVyX2NwdSh4ZnNzdGF0cywgY3VycmVudF9jcHUoKSkudi0tKQorI2RlZmluZSBYRlNfU1RBVFNfQUREKHYsIGluYykJKHBlcl9jcHUoeGZzc3RhdHMsIGN1cnJlbnRfY3B1KCkpLnYgKz0gKGluYykpCisKK2V4dGVybiB2b2lkIHhmc19pbml0X3Byb2Nmcyh2b2lkKTsKK2V4dGVybiB2b2lkIHhmc19jbGVhbnVwX3Byb2Nmcyh2b2lkKTsKKworCisjZWxzZQkvKiAhQ09ORklHX1BST0NfRlMgKi8KKworIyBkZWZpbmUgWEZTX1NUQVRTX0lOQyhjb3VudCkKKyMgZGVmaW5lIFhGU19TVEFUU19ERUMoY291bnQpCisjIGRlZmluZSBYRlNfU1RBVFNfQUREKGNvdW50LCBpbmMpCisKK3N0YXRpYyBfX2lubGluZSB2b2lkIHhmc19pbml0X3Byb2Nmcyh2b2lkKSB7IH07CitzdGF0aWMgX19pbmxpbmUgdm9pZCB4ZnNfY2xlYW51cF9wcm9jZnModm9pZCkgeyB9OworCisjZW5kaWYJLyogIUNPTkZJR19QUk9DX0ZTICovCisKKyNlbmRpZiAvKiBfX1hGU19TVEFUU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZGM2NTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCkBAIC0wLDAgKzEsOTEyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfY2xudC5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19xdW90YS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19pdGFibGUuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKyNpbmNsdWRlICJ4ZnNfYWNsLmgiCisjaW5jbHVkZSAieGZzX2NhcC5oIgorI2luY2x1ZGUgInhmc19tYWMuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0ci5oIgorI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgorI2luY2x1ZGUgInhmc191dGlscy5oIgorI2luY2x1ZGUgInhmc192ZXJzaW9uLmgiCisjaW5jbHVkZSAieGZzX2lvY3RsMzIuaCIKKworI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisKK1NUQVRJQyBzdHJ1Y3QgcXVvdGFjdGxfb3BzIGxpbnZmc19xb3BzOworU1RBVElDIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGxpbnZmc19zb3BzOworU1RBVElDIGttZW1fem9uZV90ICpsaW52ZnNfaW5vZGVfem9uZTsKKworU1RBVElDIHN0cnVjdCB4ZnNfbW91bnRfYXJncyAqCit4ZnNfYXJnc19hbGxvY2F0ZSgKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiKQoreworCXN0cnVjdCB4ZnNfbW91bnRfYXJncwkqYXJnczsKKworCWFyZ3MgPSBrbWVtX3phbGxvYyhzaXplb2Yoc3RydWN0IHhmc19tb3VudF9hcmdzKSwgS01fU0xFRVApOworCWFyZ3MtPmxvZ2J1ZnMgPSBhcmdzLT5sb2didWZzaXplID0gLTE7CisJc3RybmNweShhcmdzLT5mc25hbWUsIHNiLT5zX2lkLCBNQVhOQU1FTEVOKTsKKworCS8qIENvcHkgdGhlIGFscmVhZHktcGFyc2VkIG1vdW50KDIpIGZsYWdzIHdlJ3JlIGludGVyZXN0ZWQgaW4gKi8KKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19OT0FUSU1FKQorCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfTk9BVElNRTsKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19ESVJTWU5DKQorCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfRElSU1lOQzsKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykKKwkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX1dTWU5DOworCisJLyogRGVmYXVsdCB0byAzMiBiaXQgaW5vZGVzIG9uIExpbnV4IGFsbCB0aGUgdGltZSAqLworCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF8zMkJJVElOT0RFUzsKKworCXJldHVybiBhcmdzOworfQorCitfX3VpbnQ2NF90Cit4ZnNfbWF4X2ZpbGVfb2Zmc2V0KAorCXVuc2lnbmVkIGludAkJYmxvY2tzaGlmdCkKK3sKKwl1bnNpZ25lZCBpbnQJCXBhZ2VmYWN0b3IgPSAxOworCXVuc2lnbmVkIGludAkJYml0c2hpZnQgPSBCSVRTX1BFUl9MT05HIC0gMTsKKworCS8qIEZpZ3VyZSBvdXQgbWF4aW11bSBmaWxlc2l6ZSwgb24gTGludXggdGhpcyBjYW4gZGVwZW5kIG9uCisJICogdGhlIGZpbGVzeXN0ZW0gYmxvY2tzaXplIChvbiAzMiBiaXQgcGxhdGZvcm1zKS4KKwkgKiBfX2Jsb2NrX3ByZXBhcmVfd3JpdGUgZG9lcyB0aGlzIGluIGFuIFt1bnNpZ25lZF0gbG9uZy4uLgorCSAqICAgICAgcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBiYml0cykKKwkgKiBTbywgZm9yIHBhZ2Ugc2l6ZWQgYmxvY2tzICg0SyBvbiAzMiBiaXQgcGxhdGZvcm1zKSwKKwkgKiB0aGlzIHdyYXBzIGF0IGFyb3VuZCA4VGIgKGhlbmNlIE1BWF9MRlNfRklMRVNJWkUgd2hpY2ggaXMKKwkgKiAgICAgICgoKHU2NClQQUdFX0NBQ0hFX1NJWkUgPDwgKEJJVFNfUEVSX0xPTkctMSkpLTEpCisJICogYnV0IGZvciBzbWFsbGVyIGJsb2Nrc2l6ZXMgaXQgaXMgbGVzcyAoYmJpdHMgPSBsb2cyIGJzaXplKS4KKwkgKiBOb3RlMTogZ2V0X2Jsb2NrX3QgdGFrZXMgYSBsb25nIChpbXBsaWNpdCBjYXN0IGZyb20gYWJvdmUpCisJICogTm90ZTI6IFRoZSBMYXJnZSBCbG9jayBEZXZpY2UgKExCRCBhbmQgSEFWRV9TRUNUT1JfVCkgcGF0Y2gKKwkgKiBjYW4gb3B0aW9uYWxseSBjb252ZXJ0IHRoZSBbdW5zaWduZWRdIGxvbmcgZnJvbSBhYm92ZSBpbnRvCisJICogYW4gW3Vuc2lnbmVkXSBsb25nIGxvbmcuCisJICovCisKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisjIGlmIGRlZmluZWQoQ09ORklHX0xCRCkKKwlBU1NFUlQoc2l6ZW9mKHNlY3Rvcl90KSA9PSA4KTsKKwlwYWdlZmFjdG9yID0gUEFHRV9DQUNIRV9TSVpFOworCWJpdHNoaWZ0ID0gQklUU19QRVJfTE9ORzsKKyMgZWxzZQorCXBhZ2VmYWN0b3IgPSBQQUdFX0NBQ0hFX1NJWkUgPj4gKFBBR0VfQ0FDSEVfU0hJRlQgLSBibG9ja3NoaWZ0KTsKKyMgZW5kaWYKKyNlbmRpZgorCisJcmV0dXJuICgoKF9fdWludDY0X3QpcGFnZWZhY3RvcikgPDwgYml0c2hpZnQpIC0gMTsKK30KKworU1RBVElDIF9faW5saW5lX18gdm9pZAoreGZzX3NldF9pbm9kZW9wcygKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSkKK3sKKwl2bm9kZV90CQkJKnZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CisKKwlpZiAodnAtPnZfdHlwZSA9PSBWTk9OKSB7CisJCXZuX21hcmtfYmFkKHZwKTsKKwl9IGVsc2UgaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmbGludmZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmxpbnZmc19maWxlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmxpbnZmc19hb3BzOworCX0gZWxzZSBpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZsaW52ZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZsaW52ZnNfZGlyX29wZXJhdGlvbnM7CisJfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJmxpbnZmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWlmIChpbm9kZS0+aV9ibG9ja3MpCisJCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZsaW52ZnNfYW9wczsKKwl9IGVsc2UgeworCQlpbm9kZS0+aV9vcCA9ICZsaW52ZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsIGlub2RlLT5pX3JkZXYpOworCX0KK30KKworU1RBVElDIF9faW5saW5lX18gdm9pZAoreGZzX3JldmFsaWRhdGVfaW5vZGUoCisJeGZzX21vdW50X3QJCSptcCwKKwl2bm9kZV90CQkJKnZwLAorCXhmc19pbm9kZV90CQkqaXApCit7CisJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBMSU5WRlNfR0VUX0lQKHZwKTsKKworCWlub2RlLT5pX21vZGUJPSAoaXAtPmlfZC5kaV9tb2RlICYgTU9ERU1BU0spIHwgVlRUT0lGKHZwLT52X3R5cGUpOworCWlub2RlLT5pX25saW5rCT0gaXAtPmlfZC5kaV9ubGluazsKKwlpbm9kZS0+aV91aWQJPSBpcC0+aV9kLmRpX3VpZDsKKwlpbm9kZS0+aV9naWQJPSBpcC0+aV9kLmRpX2dpZDsKKwlpZiAoKCgxIDw8IHZwLT52X3R5cGUpICYgKCgxPDxWQkxLKSB8ICgxPDxWQ0hSKSkpID09IDApIHsKKwkJaW5vZGUtPmlfcmRldiA9IDA7CisJfSBlbHNlIHsKKwkJeGZzX2Rldl90IGRldiA9IGlwLT5pX2RmLmlmX3UyLmlmX3JkZXY7CisJCWlub2RlLT5pX3JkZXYgPSBNS0RFVihzeXN2X21ham9yKGRldikgJiAweDFmZiwgc3lzdl9taW5vcihkZXYpKTsKKwl9CisJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwlpbm9kZS0+aV9nZW5lcmF0aW9uID0gaXAtPmlfZC5kaV9nZW47CisJaV9zaXplX3dyaXRlKGlub2RlLCBpcC0+aV9kLmRpX3NpemUpOworCWlub2RlLT5pX2Jsb2NrcyA9CisJCVhGU19GU0JfVE9fQkIobXAsIGlwLT5pX2QuZGlfbmJsb2NrcyArIGlwLT5pX2RlbGF5ZWRfYmxrcyk7CisJaW5vZGUtPmlfYXRpbWUudHZfc2VjCT0gaXAtPmlfZC5kaV9hdGltZS50X3NlYzsKKwlpbm9kZS0+aV9hdGltZS50dl9uc2VjCT0gaXAtPmlfZC5kaV9hdGltZS50X25zZWM7CisJaW5vZGUtPmlfbXRpbWUudHZfc2VjCT0gaXAtPmlfZC5kaV9tdGltZS50X3NlYzsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjCT0gaXAtPmlfZC5kaV9tdGltZS50X25zZWM7CisJaW5vZGUtPmlfY3RpbWUudHZfc2VjCT0gaXAtPmlfZC5kaV9jdGltZS50X3NlYzsKKwlpbm9kZS0+aV9jdGltZS50dl9uc2VjCT0gaXAtPmlfZC5kaV9jdGltZS50X25zZWM7CisJaWYgKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX0lNTVVUQUJMRSkKKwkJaW5vZGUtPmlfZmxhZ3MgfD0gU19JTU1VVEFCTEU7CisJZWxzZQorCQlpbm9kZS0+aV9mbGFncyAmPSB+U19JTU1VVEFCTEU7CisJaWYgKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX0FQUEVORCkKKwkJaW5vZGUtPmlfZmxhZ3MgfD0gU19BUFBFTkQ7CisJZWxzZQorCQlpbm9kZS0+aV9mbGFncyAmPSB+U19BUFBFTkQ7CisJaWYgKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1NZTkMpCisJCWlub2RlLT5pX2ZsYWdzIHw9IFNfU1lOQzsKKwllbHNlCisJCWlub2RlLT5pX2ZsYWdzICY9IH5TX1NZTkM7CisJaWYgKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX05PQVRJTUUpCisJCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9BVElNRTsKKwllbHNlCisJCWlub2RlLT5pX2ZsYWdzICY9IH5TX05PQVRJTUU7CisJdnAtPnZfZmxhZyAmPSB+Vk1PRElGSUVEOworfQorCit2b2lkCit4ZnNfaW5pdGlhbGl6ZV92bm9kZSgKKwliaHZfZGVzY190CQkqYmRwLAorCXZub2RlX3QJCQkqdnAsCisJYmh2X2Rlc2NfdAkJKmlub2RlX2JodiwKKwlpbnQJCQl1bmxvY2spCit7CisJeGZzX2lub2RlX3QJCSppcCA9IFhGU19CSFZUT0koaW5vZGVfYmh2KTsKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IExJTlZGU19HRVRfSVAodnApOworCisJaWYgKCFpbm9kZV9iaHYtPmJkX3ZvYmopIHsKKwkJdnAtPnZfdmZzcCA9IGJodnRvdmZzKGJkcCk7CisJCWJodl9kZXNjX2luaXQoaW5vZGVfYmh2LCBpcCwgdnAsICZ4ZnNfdm5vZGVvcHMpOworCQliaHZfaW5zZXJ0KFZOX0JIVl9IRUFEKHZwKSwgaW5vZGVfYmh2KTsKKwl9CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gc2V0IHRoZSBvcHMgdmVjdG9ycywgYW5kIHVubG9jayB0aGUgaW5vZGUsIGJ1dCBpZgorCSAqIHdlIGhhdmUgYmVlbiBjYWxsZWQgZHVyaW5nIHRoZSBuZXcgaW5vZGUgY3JlYXRlIHByb2Nlc3MsIGl0IGlzCisJICogdG9vIGVhcmx5IHRvIGZpbGwgaW4gdGhlIExpbnV4IGlub2RlLiAgV2Ugd2lsbCBnZXQgY2FsbGVkIGEKKwkgKiBzZWNvbmQgdGltZSBvbmNlIHRoZSBpbm9kZSBpcyBwcm9wZXJseSBzZXQgdXAsIGFuZCB0aGVuIHdlIGNhbgorCSAqIGZpbmlzaCBvdXIgd29yay4KKwkgKi8KKwlpZiAoaXAtPmlfZC5kaV9tb2RlICE9IDAgJiYgdW5sb2NrICYmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSkgeworCQl2cC0+dl90eXBlID0gSUZUT1ZUKGlwLT5pX2QuZGlfbW9kZSk7CisJCXhmc19yZXZhbGlkYXRlX2lub2RlKFhGU19CSFZUT00oYmRwKSwgdnAsIGlwKTsKKwkJeGZzX3NldF9pbm9kZW9wcyhpbm9kZSk7CisJCisJCWlwLT5pX2ZsYWdzICY9IH5YRlNfSU5FVzsKKwkJYmFycmllcigpOworCisJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCX0KK30KKworaW50Cit4ZnNfYmxrZGV2X2dldCgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCWNvbnN0IGNoYXIJCSpuYW1lLAorCXN0cnVjdCBibG9ja19kZXZpY2UJKipiZGV2cCkKK3sKKwlpbnQJCQllcnJvciA9IDA7CisKKwkqYmRldnAgPSBvcGVuX2JkZXZfZXhjbChuYW1lLCAwLCBtcCk7CisJaWYgKElTX0VSUigqYmRldnApKSB7CisJCWVycm9yID0gUFRSX0VSUigqYmRldnApOworCQlwcmludGsoIlhGUzogSW52YWxpZCBkZXZpY2UgWyVzXSwgZXJyb3I9JWRcbiIsIG5hbWUsIGVycm9yKTsKKwl9CisKKwlyZXR1cm4gLWVycm9yOworfQorCit2b2lkCit4ZnNfYmxrZGV2X3B1dCgKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlCSpiZGV2KQoreworCWlmIChiZGV2KQorCQljbG9zZV9iZGV2X2V4Y2woYmRldik7Cit9CisKKworU1RBVElDIHN0cnVjdCBpbm9kZSAqCitsaW52ZnNfYWxsb2NfaW5vZGUoCisJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYikKK3sKKwl2bm9kZV90CQkJKnZwOworCisJdnAgPSAodm5vZGVfdCAqKWttZW1fY2FjaGVfYWxsb2MobGludmZzX2lub2RlX3pvbmUsIAorICAgICAgICAgICAgICAgIGttZW1fZmxhZ3NfY29udmVydChLTV9TTEVFUCkpOworCWlmICghdnApCisJCXJldHVybiBOVUxMOworCXJldHVybiBMSU5WRlNfR0VUX0lQKHZwKTsKK30KKworU1RBVElDIHZvaWQKK2xpbnZmc19kZXN0cm95X2lub2RlKAorCXN0cnVjdCBpbm9kZQkJKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShsaW52ZnNfaW5vZGVfem9uZSwgTElOVkZTX0dFVF9WUChpbm9kZSkpOworfQorCitTVEFUSUMgdm9pZAoraW5pdF9vbmNlKAorCXZvaWQJCQkqZGF0YSwKKwlrbWVtX2NhY2hlX3QJCSpjYWNoZXAsCisJdW5zaWduZWQgbG9uZwkJZmxhZ3MpCit7CisJdm5vZGVfdAkJCSp2cCA9ICh2bm9kZV90ICopZGF0YTsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQorCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpCisJCWlub2RlX2luaXRfb25jZShMSU5WRlNfR0VUX0lQKHZwKSk7Cit9CisKK1NUQVRJQyBpbnQKK2luaXRfaW5vZGVjYWNoZSggdm9pZCApCit7CisJbGludmZzX2lub2RlX3pvbmUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibGludmZzX2ljYWNoZSIsCisJCQkJc2l6ZW9mKHZub2RlX3QpLCAwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQlpbml0X29uY2UsIE5VTEwpOworCWlmIChsaW52ZnNfaW5vZGVfem9uZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIHZvaWQKK2Rlc3Ryb3lfaW5vZGVjYWNoZSggdm9pZCApCit7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShsaW52ZnNfaW5vZGVfem9uZSkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjYWNoZSBzdGlsbCBpbiB1c2UhXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisvKgorICogQXR0ZW1wdCB0byBmbHVzaCB0aGUgaW5vZGUsIHRoaXMgd2lsbCBhY3R1YWxseSBmYWlsCisgKiBpZiB0aGUgaW5vZGUgaXMgcGlubmVkLCBidXQgd2UgZGlydHkgdGhlIGlub2RlIGFnYWluCisgKiBhdCB0aGUgcG9pbnQgd2hlbiBpdCBpcyB1bnBpbm5lZCBhZnRlciBhIGxvZyB3cml0ZSwKKyAqIHNpbmNlIHRoaXMgaXMgd2hlbiB0aGUgaW5vZGUgaXRzZWxmIGJlY29tZXMgZmx1c2hhYmxlLiAKKyAqLworU1RBVElDIGludAorbGludmZzX3dyaXRlX2lub2RlKAorCXN0cnVjdCBpbm9kZQkJKmlub2RlLAorCWludAkJCXN5bmMpCit7CisJdm5vZGVfdAkJCSp2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOworCWludAkJCWVycm9yID0gMCwgZmxhZ3MgPSBGTFVTSF9JTk9ERTsKKworCWlmICh2cCkgeworCQl2bl90cmFjZV9lbnRyeSh2cCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisJCWlmIChzeW5jKQorCQkJZmxhZ3MgfD0gRkxVU0hfU1lOQzsKKwkJVk9QX0lGTFVTSCh2cCwgZmxhZ3MsIGVycm9yKTsKKwkJaWYgKGVycm9yID09IEVBR0FJTikgeworCQkJaWYgKHN5bmMpCisJCQkJVk9QX0lGTFVTSCh2cCwgZmxhZ3MgfCBGTFVTSF9MT0csIGVycm9yKTsKKwkJCWVsc2UKKwkJCQllcnJvciA9IDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLWVycm9yOworfQorCitTVEFUSUMgdm9pZAorbGludmZzX2NsZWFyX2lub2RlKAorCXN0cnVjdCBpbm9kZQkJKmlub2RlKQoreworCXZub2RlX3QJCQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKworCWlmICh2cCkgeworCQl2bl9yZWxlKHZwKTsKKwkJdm5fdHJhY2VfZW50cnkodnAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCQkvKgorCQkgKiBEbyBhbGwgb3VyIGNsZWFudXAsIGFuZCByZW1vdmUgdGhpcyB2bm9kZS4KKwkJICovCisJCXZuX3JlbW92ZSh2cCk7CisJfQorfQorCisKKy8qCisgKiBFbnF1ZXVlIGEgd29yayBpdGVtIHRvIGJlIHBpY2tlZCB1cCBieSB0aGUgdmZzIHhmc3N5bmNkIHRocmVhZC4KKyAqIERvaW5nIHRoaXMgaGFzIHR3byBhZHZhbnRhZ2VzOgorICogLSBJdCBzYXZlcyBvbiBzdGFjayBzcGFjZSwgd2hpY2ggaXMgdGlnaHQgaW4gY2VydGFpbiBzaXR1YXRpb25zCisgKiAtIEl0IGNhbiBiZSB1c2VkICh3aXRoIGNhcmUpIGFzIGEgbWVjaGFuaXNtIHRvIGF2b2lkIGRlYWRsb2Nrcy4KKyAqIEZsdXNoaW5nIHdoaWxlIGFsbG9jYXRpbmcgaW4gYSBmdWxsIGZpbGVzeXN0ZW0gcmVxdWlyZXMgYm90aC4KKyAqLworU1RBVElDIHZvaWQKK3hmc19zeW5jZF9xdWV1ZV93b3JrKAorCXN0cnVjdCB2ZnMJKnZmcywKKwl2b2lkCQkqZGF0YSwKKwl2b2lkCQkoKnN5bmNlcikodmZzX3QgKiwgdm9pZCAqKSkKK3sKKwl2ZnNfc3luY193b3JrX3QJKndvcms7CisKKwl3b3JrID0ga21lbV9hbGxvYyhzaXplb2Yoc3RydWN0IHZmc19zeW5jX3dvcmspLCBLTV9TTEVFUCk7CisJSU5JVF9MSVNUX0hFQUQoJndvcmstPndfbGlzdCk7CisJd29yay0+d19zeW5jZXIgPSBzeW5jZXI7CisJd29yay0+d19kYXRhID0gZGF0YTsKKwl3b3JrLT53X3ZmcyA9IHZmczsKKwlzcGluX2xvY2soJnZmcy0+dmZzX3N5bmNfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmd29yay0+d19saXN0LCAmdmZzLT52ZnNfc3luY19saXN0KTsKKwlzcGluX3VubG9jaygmdmZzLT52ZnNfc3luY19sb2NrKTsKKwl3YWtlX3VwX3Byb2Nlc3ModmZzLT52ZnNfc3luY190YXNrKTsKK30KKworLyoKKyAqIEZsdXNoIGRlbGF5ZWQgYWxsb2NhdGUgZGF0YSwgYXR0ZW1wdGluZyB0byBmcmVlIHVwIHJlc2VydmVkIHNwYWNlCisgKiBmcm9tIGV4aXN0aW5nIGFsbG9jYXRpb25zLiAgQXQgdGhpcyBwb2ludCBhIG5ldyBhbGxvY2F0aW9uIGF0dGVtcHQKKyAqIGhhcyBmYWlsZWQgd2l0aCBFTk9TUEMgYW5kIHdlIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBzY3JhdGNoaW5nIG91cgorICogaGVhZHMsIGxvb2tpbmcgYWJvdXQgZm9yIG1vcmUgcm9vbS4uLgorICovCitTVEFUSUMgdm9pZAoreGZzX2ZsdXNoX2lub2RlX3dvcmsoCisJdmZzX3QJCSp2ZnMsCisJdm9pZAkJKmlub2RlKQoreworCWZpbGVtYXBfZmx1c2goKChzdHJ1Y3QgaW5vZGUgKilpbm9kZSktPmlfbWFwcGluZyk7CisJaXB1dCgoc3RydWN0IGlub2RlICopaW5vZGUpOworfQorCit2b2lkCit4ZnNfZmx1c2hfaW5vZGUoCisJeGZzX2lub2RlX3QJKmlwKQoreworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBMSU5WRlNfR0VUX0lQKFhGU19JVE9WKGlwKSk7CisJc3RydWN0IHZmcwkqdmZzID0gWEZTX01UT1ZGUyhpcC0+aV9tb3VudCk7CisKKwlpZ3JhYihpbm9kZSk7CisJeGZzX3N5bmNkX3F1ZXVlX3dvcmsodmZzLCBpbm9kZSwgeGZzX2ZsdXNoX2lub2RlX3dvcmspOworCWRlbGF5KEhaLzIpOworfQorCisvKgorICogVGhpcyBpcyB0aGUgImJpZ2dlciBoYW1tZXIiIHZlcnNpb24gb2YgeGZzX2ZsdXNoX2lub2RlX3dvcmsuLi4KKyAqIChJT1csICJJZiBhdCBmaXJzdCB5b3UgZG9uJ3Qgc3VjY2VlZCwgdXNlIGEgQmlnZ2VyIEhhbW1lciIpLgorICovCitTVEFUSUMgdm9pZAoreGZzX2ZsdXNoX2RldmljZV93b3JrKAorCXZmc190CQkqdmZzLAorCXZvaWQJCSppbm9kZSkKK3sKKwlzeW5jX2Jsb2NrZGV2KHZmcy0+dmZzX3N1cGVyLT5zX2JkZXYpOworCWlwdXQoKHN0cnVjdCBpbm9kZSAqKWlub2RlKTsKK30KKwordm9pZAoreGZzX2ZsdXNoX2RldmljZSgKKwl4ZnNfaW5vZGVfdAkqaXApCit7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IExJTlZGU19HRVRfSVAoWEZTX0lUT1YoaXApKTsKKwlzdHJ1Y3QgdmZzCSp2ZnMgPSBYRlNfTVRPVkZTKGlwLT5pX21vdW50KTsKKworCWlncmFiKGlub2RlKTsKKwl4ZnNfc3luY2RfcXVldWVfd29yayh2ZnMsIGlub2RlLCB4ZnNfZmx1c2hfZGV2aWNlX3dvcmspOworCWRlbGF5KEhaLzIpOworCXhmc19sb2dfZm9yY2UoaXAtPmlfbW91bnQsICh4ZnNfbHNuX3QpMCwgWEZTX0xPR19GT1JDRXxYRlNfTE9HX1NZTkMpOworfQorCisjZGVmaW5lIFNZTkNEX0ZMQUdTCShTWU5DX0ZTREFUQXxTWU5DX0JERkxVU0h8U1lOQ19BVFRSKQorU1RBVElDIHZvaWQKK3Zmc19zeW5jX3dvcmtlcigKKwl2ZnNfdAkJKnZmc3AsCisJdm9pZAkJKnVudXNlZCkKK3sKKwlpbnQJCWVycm9yOworCisJaWYgKCEodmZzcC0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKSkKKwkJVkZTX1NZTkModmZzcCwgU1lOQ0RfRkxBR1MsIE5VTEwsIGVycm9yKTsKKwl2ZnNwLT52ZnNfc3luY19zZXErKzsKKwl3bWIoKTsKKwl3YWtlX3VwKCZ2ZnNwLT52ZnNfd2FpdF9zaW5nbGVfc3luY190YXNrKTsKK30KKworU1RBVElDIGludAoreGZzc3luY2QoCisJdm9pZAkJCSphcmcpCit7CisJbG9uZwkJCXRpbWVsZWZ0OworCXZmc190CQkJKnZmc3AgPSAodmZzX3QgKikgYXJnOworCXN0cnVjdCBsaXN0X2hlYWQJdG1wOworCXN0cnVjdCB2ZnNfc3luY193b3JrCSp3b3JrLCAqbjsKKworCWRhZW1vbml6ZSgieGZzc3luY2QiKTsKKworCXZmc3AtPnZmc19zeW5jX3dvcmsud192ZnMgPSB2ZnNwOworCXZmc3AtPnZmc19zeW5jX3dvcmsud19zeW5jZXIgPSB2ZnNfc3luY193b3JrZXI7CisJdmZzcC0+dmZzX3N5bmNfdGFzayA9IGN1cnJlbnQ7CisJd21iKCk7CisJd2FrZV91cCgmdmZzcC0+dmZzX3dhaXRfc3luY190YXNrKTsKKworCUlOSVRfTElTVF9IRUFEKCZ0bXApOworCXRpbWVsZWZ0ID0gKHhmc19zeW5jZF9jZW50aXNlY3MgKiBIWikgLyAxMDA7CisJZm9yICg7OykgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl0aW1lbGVmdCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZWxlZnQpOworCQkvKiBzd3N1c3AgKi8KKwkJdHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpOworCQlpZiAodmZzcC0+dmZzX2ZsYWcgJiBWRlNfVU1PVU5UKQorCQkJYnJlYWs7CisKKwkJc3Bpbl9sb2NrKCZ2ZnNwLT52ZnNfc3luY19sb2NrKTsKKwkJLyoKKwkJICogV2UgY2FuIGdldCB3b2tlbiBieSBsYXB0b3AgbW9kZSwgdG8gZG8gYSBzeW5jIC0KKwkJICogdGhhdCdzIHRoZSAob25seSEpIGNhc2Ugd2hlcmUgdGhlIGxpc3Qgd291bGQgYmUKKwkJICogZW1wdHkgd2l0aCB0aW1lIHJlbWFpbmluZy4KKwkJICovCisJCWlmICghdGltZWxlZnQgfHwgbGlzdF9lbXB0eSgmdmZzcC0+dmZzX3N5bmNfbGlzdCkpIHsKKwkJCWlmICghdGltZWxlZnQpCisJCQkJdGltZWxlZnQgPSAoeGZzX3N5bmNkX2NlbnRpc2VjcyAqIEhaKSAvIDEwMDsKKwkJCUlOSVRfTElTVF9IRUFEKCZ2ZnNwLT52ZnNfc3luY193b3JrLndfbGlzdCk7CisJCQlsaXN0X2FkZF90YWlsKCZ2ZnNwLT52ZnNfc3luY193b3JrLndfbGlzdCwKKwkJCQkJJnZmc3AtPnZmc19zeW5jX2xpc3QpOworCQl9CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3b3JrLCBuLCAmdmZzcC0+dmZzX3N5bmNfbGlzdCwgd19saXN0KQorCQkJbGlzdF9tb3ZlKCZ3b3JrLT53X2xpc3QsICZ0bXApOworCQlzcGluX3VubG9jaygmdmZzcC0+dmZzX3N5bmNfbG9jayk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdvcmssIG4sICZ0bXAsIHdfbGlzdCkgeworCQkJKCp3b3JrLT53X3N5bmNlcikodmZzcCwgd29yay0+d19kYXRhKTsKKwkJCWxpc3RfZGVsKCZ3b3JrLT53X2xpc3QpOworCQkJaWYgKHdvcmsgPT0gJnZmc3AtPnZmc19zeW5jX3dvcmspCisJCQkJY29udGludWU7CisJCQlrbWVtX2ZyZWUod29yaywgc2l6ZW9mKHN0cnVjdCB2ZnNfc3luY193b3JrKSk7CisJCX0KKwl9CisKKwl2ZnNwLT52ZnNfc3luY190YXNrID0gTlVMTDsKKwl3bWIoKTsKKwl3YWtlX3VwKCZ2ZnNwLT52ZnNfd2FpdF9zeW5jX3Rhc2spOworCisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBpbnQKK2xpbnZmc19zdGFydF9zeW5jZCgKKwl2ZnNfdAkJCSp2ZnNwKQoreworCWludAkJCXBpZDsKKworCXBpZCA9IGtlcm5lbF90aHJlYWQoeGZzc3luY2QsICh2b2lkICopIHZmc3AsCisJCQlDTE9ORV9WTSB8IENMT05FX0ZTIHwgQ0xPTkVfRklMRVMpOworCWlmIChwaWQgPCAwKQorCQlyZXR1cm4gLXBpZDsKKwl3YWl0X2V2ZW50KHZmc3AtPnZmc193YWl0X3N5bmNfdGFzaywgdmZzcC0+dmZzX3N5bmNfdGFzayk7CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyB2b2lkCitsaW52ZnNfc3RvcF9zeW5jZCgKKwl2ZnNfdAkJCSp2ZnNwKQoreworCXZmc3AtPnZmc19mbGFnIHw9IFZGU19VTU9VTlQ7CisJd21iKCk7CisKKwl3YWtlX3VwX3Byb2Nlc3ModmZzcC0+dmZzX3N5bmNfdGFzayk7CisJd2FpdF9ldmVudCh2ZnNwLT52ZnNfd2FpdF9zeW5jX3Rhc2ssICF2ZnNwLT52ZnNfc3luY190YXNrKTsKK30KKworU1RBVElDIHZvaWQKK2xpbnZmc19wdXRfc3VwZXIoCisJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYikKK3sKKwl2ZnNfdAkJCSp2ZnNwID0gTElOVkZTX0dFVF9WRlMoc2IpOworCWludAkJCWVycm9yOworCisJbGludmZzX3N0b3Bfc3luY2QodmZzcCk7CisJVkZTX1NZTkModmZzcCwgU1lOQ19BVFRSfFNZTkNfREVMV1JJLCBOVUxMLCBlcnJvcik7CisJaWYgKCFlcnJvcikKKwkJVkZTX1VOTU9VTlQodmZzcCwgMCwgTlVMTCwgZXJyb3IpOworCWlmIChlcnJvcikgeworCQlwcmludGsoIlhGUyB1bm1vdW50IGdvdCBlcnJvciAlZFxuIiwgZXJyb3IpOworCQlwcmludGsoIiVzOiB2ZnNwLzB4JXAgbGVmdCBkYW5nbGluZyFcbiIsIF9fRlVOQ1RJT05fXywgdmZzcCk7CisJCXJldHVybjsKKwl9CisKKwl2ZnNfZGVhbGxvY2F0ZSh2ZnNwKTsKK30KKworU1RBVElDIHZvaWQKK2xpbnZmc193cml0ZV9zdXBlcigKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiKQoreworCXZmc190CQkJKnZmc3AgPSBMSU5WRlNfR0VUX1ZGUyhzYik7CisJaW50CQkJZXJyb3I7CisKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKKwkJc2ItPnNfZGlydCA9IDA7IC8qIHBhcmFub2lhICovCisJCXJldHVybjsKKwl9CisJLyogUHVzaCB0aGUgbG9nIGFuZCBzdXBlcmJsb2NrIGEgbGl0dGxlICovCisJVkZTX1NZTkModmZzcCwgU1lOQ19GU0RBVEEsIE5VTEwsIGVycm9yKTsKKwlzYi0+c19kaXJ0ID0gMDsKK30KKworU1RBVElDIGludAorbGludmZzX3N5bmNfc3VwZXIoCisJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYiwKKwlpbnQJCQl3YWl0KQoreworCXZmc190CQkqdmZzcCA9IExJTlZGU19HRVRfVkZTKHNiKTsKKwlpbnQJCWVycm9yOworCWludAkJZmxhZ3MgPSBTWU5DX0ZTREFUQTsKKworCWlmICh3YWl0KQorCQlmbGFncyB8PSBTWU5DX1dBSVQ7CisKKwlWRlNfU1lOQyh2ZnNwLCBmbGFncywgTlVMTCwgZXJyb3IpOworCXNiLT5zX2RpcnQgPSAwOworCisJaWYgKHVubGlrZWx5KGxhcHRvcF9tb2RlKSkgeworCQlpbnQJcHJldl9zeW5jX3NlcSA9IHZmc3AtPnZmc19zeW5jX3NlcTsKKworCQkvKgorCQkgKiBUaGUgZGlzayBtdXN0IGJlIGFjdGl2ZSBiZWNhdXNlIHdlJ3JlIHN5bmNpbmcuCisJCSAqIFdlIHNjaGVkdWxlIHhmc3N5bmNkIG5vdyAobm93IHRoYXQgdGhlIGRpc2sgaXMKKwkJICogYWN0aXZlKSBpbnN0ZWFkIG9mIGxhdGVyICh3aGVuIGl0IG1pZ2h0IG5vdCBiZSkuCisJCSAqLworCQl3YWtlX3VwX3Byb2Nlc3ModmZzcC0+dmZzX3N5bmNfdGFzayk7CisJCS8qCisJCSAqIFdlIGhhdmUgdG8gd2FpdCBmb3IgdGhlIHN5bmMgaXRlcmF0aW9uIHRvIGNvbXBsZXRlLgorCQkgKiBJZiB3ZSBkb24ndCwgdGhlIGRpc2sgYWN0aXZpdHkgY2F1c2VkIGJ5IHRoZSBzeW5jCisJCSAqIHdpbGwgY29tZSBhZnRlciB0aGUgc3luYyBpcyBjb21wbGV0ZWQsIGFuZCB0aGF0CisJCSAqIHRyaWdnZXJzIGFub3RoZXIgc3luYyBmcm9tIGxhcHRvcCBtb2RlLgorCQkgKi8KKwkJd2FpdF9ldmVudCh2ZnNwLT52ZnNfd2FpdF9zaW5nbGVfc3luY190YXNrLAorCQkJCXZmc3AtPnZmc19zeW5jX3NlcSAhPSBwcmV2X3N5bmNfc2VxKTsKKwl9CisKKwlyZXR1cm4gLWVycm9yOworfQorCitTVEFUSUMgaW50CitsaW52ZnNfc3RhdGZzKAorCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IsCisJc3RydWN0IGtzdGF0ZnMJCSpzdGF0cCkKK3sKKwl2ZnNfdAkJCSp2ZnNwID0gTElOVkZTX0dFVF9WRlMoc2IpOworCWludAkJCWVycm9yOworCisJVkZTX1NUQVRWRlModmZzcCwgc3RhdHAsIE5VTEwsIGVycm9yKTsKKwlyZXR1cm4gLWVycm9yOworfQorCitTVEFUSUMgaW50CitsaW52ZnNfcmVtb3VudCgKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiLAorCWludAkJCSpmbGFncywKKwljaGFyCQkJKm9wdGlvbnMpCit7CisJdmZzX3QJCQkqdmZzcCA9IExJTlZGU19HRVRfVkZTKHNiKTsKKwlzdHJ1Y3QgeGZzX21vdW50X2FyZ3MJKmFyZ3MgPSB4ZnNfYXJnc19hbGxvY2F0ZShzYik7CisJaW50CQkJZXJyb3I7CisKKwlWRlNfUEFSU0VBUkdTKHZmc3AsIG9wdGlvbnMsIGFyZ3MsIDEsIGVycm9yKTsKKwlpZiAoIWVycm9yKQorCQlWRlNfTU5UVVBEQVRFKHZmc3AsIGZsYWdzLCBhcmdzLCBlcnJvcik7CisJa21lbV9mcmVlKGFyZ3MsIHNpemVvZigqYXJncykpOworCXJldHVybiAtZXJyb3I7Cit9CisKK1NUQVRJQyB2b2lkCitsaW52ZnNfZnJlZXplX2ZzKAorCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IpCit7CisJVkZTX0ZSRUVaRShMSU5WRlNfR0VUX1ZGUyhzYikpOworfQorCitTVEFUSUMgaW50CitsaW52ZnNfc2hvd19vcHRpb25zKAorCXN0cnVjdCBzZXFfZmlsZQkJKm0sCisJc3RydWN0IHZmc21vdW50CQkqbW50KQoreworCXN0cnVjdCB2ZnMJCSp2ZnNwID0gTElOVkZTX0dFVF9WRlMobW50LT5tbnRfc2IpOworCWludAkJCWVycm9yOworCisJVkZTX1NIT1dBUkdTKHZmc3AsIG0sIGVycm9yKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK1NUQVRJQyBpbnQKK2xpbnZmc19nZXR4c3RhdGUoCisJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYiwKKwlzdHJ1Y3QgZnNfcXVvdGFfc3RhdAkqZnFzKQoreworCXN0cnVjdCB2ZnMJCSp2ZnNwID0gTElOVkZTX0dFVF9WRlMoc2IpOworCWludAkJCWVycm9yOworCisJVkZTX1FVT1RBQ1RMKHZmc3AsIFFfWEdFVFFTVEFULCAwLCAoY2FkZHJfdClmcXMsIGVycm9yKTsKKwlyZXR1cm4gLWVycm9yOworfQorCitTVEFUSUMgaW50CitsaW52ZnNfc2V0eHN0YXRlKAorCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IsCisJdW5zaWduZWQgaW50CQlmbGFncywKKwlpbnQJCQlvcCkKK3sKKwlzdHJ1Y3QgdmZzCQkqdmZzcCA9IExJTlZGU19HRVRfVkZTKHNiKTsKKwlpbnQJCQllcnJvcjsKKworCVZGU19RVU9UQUNUTCh2ZnNwLCBvcCwgMCwgKGNhZGRyX3QpJmZsYWdzLCBlcnJvcik7CisJcmV0dXJuIC1lcnJvcjsKK30KKworU1RBVElDIGludAorbGludmZzX2dldHhxdW90YSgKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiLAorCWludAkJCXR5cGUsCisJcWlkX3QJCQlpZCwKKwlzdHJ1Y3QgZnNfZGlza19xdW90YQkqZmRxKQoreworCXN0cnVjdCB2ZnMJCSp2ZnNwID0gTElOVkZTX0dFVF9WRlMoc2IpOworCWludAkJCWVycm9yLCBnZXRtb2RlOworCisJZ2V0bW9kZSA9ICh0eXBlID09IEdSUFFVT1RBKSA/IFFfWEdFVEdRVU9UQSA6IFFfWEdFVFFVT1RBOworCVZGU19RVU9UQUNUTCh2ZnNwLCBnZXRtb2RlLCBpZCwgKGNhZGRyX3QpZmRxLCBlcnJvcik7CisJcmV0dXJuIC1lcnJvcjsKK30KKworU1RBVElDIGludAorbGludmZzX3NldHhxdW90YSgKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiLAorCWludAkJCXR5cGUsCisJcWlkX3QJCQlpZCwKKwlzdHJ1Y3QgZnNfZGlza19xdW90YQkqZmRxKQoreworCXN0cnVjdCB2ZnMJCSp2ZnNwID0gTElOVkZTX0dFVF9WRlMoc2IpOworCWludAkJCWVycm9yLCBzZXRtb2RlOworCisJc2V0bW9kZSA9ICh0eXBlID09IEdSUFFVT1RBKSA/IFFfWFNFVEdRTElNIDogUV9YU0VUUUxJTTsKKwlWRlNfUVVPVEFDVEwodmZzcCwgc2V0bW9kZSwgaWQsIChjYWRkcl90KWZkcSwgZXJyb3IpOworCXJldHVybiAtZXJyb3I7Cit9CisKK1NUQVRJQyBpbnQKK2xpbnZmc19maWxsX3N1cGVyKAorCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IsCisJdm9pZAkJCSpkYXRhLAorCWludAkJCXNpbGVudCkKK3sKKwl2bm9kZV90CQkJKnJvb3R2cDsKKwlzdHJ1Y3QgdmZzCQkqdmZzcCA9IHZmc19hbGxvY2F0ZSgpOworCXN0cnVjdCB4ZnNfbW91bnRfYXJncwkqYXJncyA9IHhmc19hcmdzX2FsbG9jYXRlKHNiKTsKKwlzdHJ1Y3Qga3N0YXRmcwkJc3RhdHZmczsKKwlpbnQJCQllcnJvciwgZXJyb3IyOworCisJdmZzcC0+dmZzX3N1cGVyID0gc2I7CisJTElOVkZTX1NFVF9WRlMoc2IsIHZmc3ApOworCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkKKwkJdmZzcC0+dmZzX2ZsYWcgfD0gVkZTX1JET05MWTsKKwliaHZfaW5zZXJ0X2FsbF92ZnNvcHModmZzcCk7CisKKwlWRlNfUEFSU0VBUkdTKHZmc3AsIChjaGFyICopZGF0YSwgYXJncywgMCwgZXJyb3IpOworCWlmIChlcnJvcikgeworCQliaHZfcmVtb3ZlX2FsbF92ZnNvcHModmZzcCwgMSk7CisJCWdvdG8gZmFpbF92ZnNvcDsKKwl9CisKKwlzYl9taW5fYmxvY2tzaXplKHNiLCBCQlNJWkUpOworI2lmZGVmIENPTkZJR19YRlNfRVhQT1JUCisJc2ItPnNfZXhwb3J0X29wID0gJmxpbnZmc19leHBvcnRfb3BzOworI2VuZGlmCisJc2ItPnNfcWNvcCA9ICZsaW52ZnNfcW9wczsKKwlzYi0+c19vcCA9ICZsaW52ZnNfc29wczsKKworCVZGU19NT1VOVCh2ZnNwLCBhcmdzLCBOVUxMLCBlcnJvcik7CisJaWYgKGVycm9yKSB7CisJCWJodl9yZW1vdmVfYWxsX3Zmc29wcyh2ZnNwLCAxKTsKKwkJZ290byBmYWlsX3Zmc29wOworCX0KKworCVZGU19TVEFUVkZTKHZmc3AsICZzdGF0dmZzLCBOVUxMLCBlcnJvcik7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWxfdW5tb3VudDsKKworCXNiLT5zX2RpcnQgPSAxOworCXNiLT5zX21hZ2ljID0gc3RhdHZmcy5mX3R5cGU7CisJc2ItPnNfYmxvY2tzaXplID0gc3RhdHZmcy5mX2JzaXplOworCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gZmZzKHN0YXR2ZnMuZl9ic2l6ZSkgLSAxOworCXNiLT5zX21heGJ5dGVzID0geGZzX21heF9maWxlX29mZnNldChzYi0+c19ibG9ja3NpemVfYml0cyk7CisJc2ItPnNfdGltZV9ncmFuID0gMTsKKwlzZXRfcG9zaXhfYWNsX2ZsYWcoc2IpOworCisJVkZTX1JPT1QodmZzcCwgJnJvb3R2cCwgZXJyb3IpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsX3VubW91bnQ7CisKKwlzYi0+c19yb290ID0gZF9hbGxvY19yb290KExJTlZGU19HRVRfSVAocm9vdHZwKSk7CisJaWYgKCFzYi0+c19yb290KSB7CisJCWVycm9yID0gRU5PTUVNOworCQlnb3RvIGZhaWxfdm5yZWxlOworCX0KKwlpZiAoaXNfYmFkX2lub2RlKHNiLT5zX3Jvb3QtPmRfaW5vZGUpKSB7CisJCWVycm9yID0gRUlOVkFMOworCQlnb3RvIGZhaWxfdm5yZWxlOworCX0KKwlpZiAoKGVycm9yID0gbGludmZzX3N0YXJ0X3N5bmNkKHZmc3ApKSkKKwkJZ290byBmYWlsX3ZucmVsZTsKKwl2bl90cmFjZV9leGl0KHJvb3R2cCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwlrbWVtX2ZyZWUoYXJncywgc2l6ZW9mKCphcmdzKSk7CisJcmV0dXJuIDA7CisKK2ZhaWxfdm5yZWxlOgorCWlmIChzYi0+c19yb290KSB7CisJCWRwdXQoc2ItPnNfcm9vdCk7CisJCXNiLT5zX3Jvb3QgPSBOVUxMOworCX0gZWxzZSB7CisJCVZOX1JFTEUocm9vdHZwKTsKKwl9CisKK2ZhaWxfdW5tb3VudDoKKwlWRlNfVU5NT1VOVCh2ZnNwLCAwLCBOVUxMLCBlcnJvcjIpOworCitmYWlsX3Zmc29wOgorCXZmc19kZWFsbG9jYXRlKHZmc3ApOworCWttZW1fZnJlZShhcmdzLCBzaXplb2YoKmFyZ3MpKTsKKwlyZXR1cm4gLWVycm9yOworfQorCitTVEFUSUMgc3RydWN0IHN1cGVyX2Jsb2NrICoKK2xpbnZmc19nZXRfc2IoCisJc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUJKmZzX3R5cGUsCisJaW50CQkJZmxhZ3MsCisJY29uc3QgY2hhcgkJKmRldl9uYW1lLAorCXZvaWQJCQkqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBsaW52ZnNfZmlsbF9zdXBlcik7Cit9CisKK1NUQVRJQyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBsaW52ZnNfc29wcyA9IHsKKwkuYWxsb2NfaW5vZGUJCT0gbGludmZzX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCQk9IGxpbnZmc19kZXN0cm95X2lub2RlLAorCS53cml0ZV9pbm9kZQkJPSBsaW52ZnNfd3JpdGVfaW5vZGUsCisJLmNsZWFyX2lub2RlCQk9IGxpbnZmc19jbGVhcl9pbm9kZSwKKwkucHV0X3N1cGVyCQk9IGxpbnZmc19wdXRfc3VwZXIsCisJLndyaXRlX3N1cGVyCQk9IGxpbnZmc193cml0ZV9zdXBlciwKKwkuc3luY19mcwkJPSBsaW52ZnNfc3luY19zdXBlciwKKwkud3JpdGVfc3VwZXJfbG9ja2ZzCT0gbGludmZzX2ZyZWV6ZV9mcywKKwkuc3RhdGZzCQkJPSBsaW52ZnNfc3RhdGZzLAorCS5yZW1vdW50X2ZzCQk9IGxpbnZmc19yZW1vdW50LAorCS5zaG93X29wdGlvbnMJCT0gbGludmZzX3Nob3dfb3B0aW9ucywKK307CisKK1NUQVRJQyBzdHJ1Y3QgcXVvdGFjdGxfb3BzIGxpbnZmc19xb3BzID0geworCS5nZXRfeHN0YXRlCQk9IGxpbnZmc19nZXR4c3RhdGUsCisJLnNldF94c3RhdGUJCT0gbGludmZzX3NldHhzdGF0ZSwKKwkuZ2V0X3hxdW90YQkJPSBsaW52ZnNfZ2V0eHF1b3RhLAorCS5zZXRfeHF1b3RhCQk9IGxpbnZmc19zZXR4cXVvdGEsCit9OworCitTVEFUSUMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgeGZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gInhmcyIsCisJLmdldF9zYgkJCT0gbGludmZzX2dldF9zYiwKKwkua2lsbF9zYgkJPSBraWxsX2Jsb2NrX3N1cGVyLAorCS5mc19mbGFncwkJPSBGU19SRVFVSVJFU19ERVYsCit9OworCisKK1NUQVRJQyBpbnQgX19pbml0Citpbml0X3hmc19mcyggdm9pZCApCit7CisJaW50CQkJZXJyb3I7CisJc3RydWN0IHN5c2luZm8JCXNpOworCXN0YXRpYyBjaGFyCQltZXNzYWdlW10gX19pbml0ZGF0YSA9IEtFUk5fSU5GTyBcCisJCVhGU19WRVJTSU9OX1NUUklORyAiIHdpdGggIiBYRlNfQlVJTERfT1BUSU9OUyAiIGVuYWJsZWRcbiI7CisKKwlwcmludGsobWVzc2FnZSk7CisKKwlzaV9tZW1pbmZvKCZzaSk7CisJeGZzX3BoeXNtZW0gPSBzaS50b3RhbHJhbTsKKworCWt0cmFjZV9pbml0KDY0KTsKKworCWVycm9yID0gaW5pdF9pbm9kZWNhY2hlKCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byB1bmRvX2lub2RlY2FjaGU7CisKKwllcnJvciA9IHBhZ2VidWZfaW5pdCgpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gdW5kb19wYWdlYnVmOworCisJdm5faW5pdCgpOworCXhmc19pbml0KCk7CisJdXVpZF9pbml0KCk7CisJdmZzX2luaXRxdW90YSgpOworCisJZXJyb3IgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZ4ZnNfZnNfdHlwZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIHVuZG9fcmVnaXN0ZXI7CisJWEZTX0RNX0lOSVQoJnhmc19mc190eXBlKTsKKwlyZXR1cm4gMDsKKwordW5kb19yZWdpc3RlcjoKKwlwYWdlYnVmX3Rlcm1pbmF0ZSgpOworCit1bmRvX3BhZ2VidWY6CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CisKK3VuZG9faW5vZGVjYWNoZToKKwlyZXR1cm4gZXJyb3I7Cit9CisKK1NUQVRJQyB2b2lkIF9fZXhpdAorZXhpdF94ZnNfZnMoIHZvaWQgKQoreworCXZmc19leGl0cXVvdGEoKTsKKwlYRlNfRE1fRVhJVCgmeGZzX2ZzX3R5cGUpOworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmeGZzX2ZzX3R5cGUpOworCXhmc19jbGVhbnVwKCk7CisJcGFnZWJ1Zl90ZXJtaW5hdGUoKTsKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKKwlrdHJhY2VfdW5pbml0KCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfeGZzX2ZzKTsKK21vZHVsZV9leGl0KGV4aXRfeGZzX2ZzKTsKKworTU9EVUxFX0FVVEhPUigiU2lsaWNvbiBHcmFwaGljcywgSW5jLiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKFhGU19WRVJTSU9OX1NUUklORyAiIHdpdGggIiBYRlNfQlVJTERfT1BUSU9OUyAiIGVuYWJsZWQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjN2UwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5oCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19TVVBFUl9IX18KKyNkZWZpbmUgX19YRlNfU1VQRVJfSF9fCisKKyNpZmRlZiBDT05GSUdfWEZTX0RNQVBJCisjIGRlZmluZSB2ZnNfaW5zZXJ0ZG1hcGkodmZzKQl2ZnNfaW5zZXJ0b3BzKHZmc3AsICZ4ZnNfZG1vcHMpCisjIGRlZmluZSB2ZnNfaW5pdGRtYXBpKCkJZG1hcGlfaW5pdCgpCisjIGRlZmluZSB2ZnNfZXhpdGRtYXBpKCkJZG1hcGlfdW5pbml0KCkKKyNlbHNlCisjIGRlZmluZSB2ZnNfaW5zZXJ0ZG1hcGkodmZzKQlkbyB7IH0gd2hpbGUgKDApCisjIGRlZmluZSB2ZnNfaW5pdGRtYXBpKCkJZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgdmZzX2V4aXRkbWFwaSgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1hGU19RVU9UQQorIyBkZWZpbmUgdmZzX2luc2VydHF1b3RhKHZmcykJdmZzX2luc2VydG9wcyh2ZnNwLCAmeGZzX3Ftb3BzKQorZXh0ZXJuIHZvaWQgeGZzX3FtX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCB4ZnNfcW1fZXhpdCh2b2lkKTsKKyMgZGVmaW5lIHZmc19pbml0cXVvdGEoKQl4ZnNfcW1faW5pdCgpCisjIGRlZmluZSB2ZnNfZXhpdHF1b3RhKCkJeGZzX3FtX2V4aXQoKQorI2Vsc2UKKyMgZGVmaW5lIHZmc19pbnNlcnRxdW90YSh2ZnMpCWRvIHsgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIHZmc19pbml0cXVvdGEoKQlkbyB7IH0gd2hpbGUgKDApCisjIGRlZmluZSB2ZnNfZXhpdHF1b3RhKCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfWEZTX1BPU0lYX0FDTAorIyBkZWZpbmUgWEZTX0FDTF9TVFJJTkcJCSJBQ0xzLCAiCisjIGRlZmluZSBzZXRfcG9zaXhfYWNsX2ZsYWcoc2IpCSgoc2IpLT5zX2ZsYWdzIHw9IE1TX1BPU0lYQUNMKQorI2Vsc2UKKyMgZGVmaW5lIFhGU19BQ0xfU1RSSU5HCisjIGRlZmluZSBzZXRfcG9zaXhfYWNsX2ZsYWcoc2IpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1hGU19TRUNVUklUWQorIyBkZWZpbmUgWEZTX1NFQ1VSSVRZX1NUUklORwkic2VjdXJpdHkgYXR0cmlidXRlcywgIgorIyBkZWZpbmUgRU5PU0VDVVJJVFkJCTAKKyNlbHNlCisjIGRlZmluZSBYRlNfU0VDVVJJVFlfU1RSSU5HCisjIGRlZmluZSBFTk9TRUNVUklUWQkJRU9QTk9UU1VQUAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfWEZTX1JUCisjIGRlZmluZSBYRlNfUkVBTFRJTUVfU1RSSU5HCSJyZWFsdGltZSwgIgorI2Vsc2UKKyMgZGVmaW5lIFhGU19SRUFMVElNRV9TVFJJTkcKKyNlbmRpZgorCisjaWYgWEZTX0JJR19CTEtOT1MKKyMgaWYgWEZTX0JJR19JTlVNUworIyAgZGVmaW5lIFhGU19CSUdGU19TVFJJTkcJImxhcmdlIGJsb2NrL2lub2RlIG51bWJlcnMsICIKKyMgZWxzZQorIyAgZGVmaW5lIFhGU19CSUdGU19TVFJJTkcJImxhcmdlIGJsb2NrIG51bWJlcnMsICIKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBYRlNfQklHRlNfU1RSSU5HCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YRlNfVFJBQ0UKKyMgZGVmaW5lIFhGU19UUkFDRV9TVFJJTkcJInRyYWNpbmcsICIKKyNlbHNlCisjIGRlZmluZSBYRlNfVFJBQ0VfU1RSSU5HCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YRlNfRE1BUEkKKyMgZGVmaW5lIFhGU19ETUFQSV9TVFJJTkcJImRtYXBpIHN1cHBvcnQsICIKKyNlbHNlCisjIGRlZmluZSBYRlNfRE1BUElfU1RSSU5HCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjIGRlZmluZSBYRlNfREJHX1NUUklORwkJImRlYnVnIgorI2Vsc2UKKyMgZGVmaW5lIFhGU19EQkdfU1RSSU5HCQkibm8gZGVidWciCisjZW5kaWYKKworI2RlZmluZSBYRlNfQlVJTERfT1BUSU9OUwlYRlNfQUNMX1NUUklORyBcCisJCQkJWEZTX1NFQ1VSSVRZX1NUUklORyBcCisJCQkJWEZTX1JFQUxUSU1FX1NUUklORyBcCisJCQkJWEZTX0JJR0ZTX1NUUklORyBcCisJCQkJWEZTX1RSQUNFX1NUUklORyBcCisJCQkJWEZTX0RNQVBJX1NUUklORyBcCisJCQkJWEZTX0RCR19TVFJJTkcgLyogREJHIG11c3QgYmUgbGFzdCAqLworCisjZGVmaW5lIExJTlZGU19HRVRfVkZTKHMpIFwKKwkodmZzX3QgKikoKHMpLT5zX2ZzX2luZm8pCisjZGVmaW5lIExJTlZGU19TRVRfVkZTKHMsIHZmc3ApIFwKKwkoKHMpLT5zX2ZzX2luZm8gPSB2ZnNwKQorCitzdHJ1Y3QgeGZzX2lub2RlOworc3RydWN0IHhmc19tb3VudDsKK3N0cnVjdCB4ZnNfYnVmdGFyZzsKK3N0cnVjdCBibG9ja19kZXZpY2U7CisKK2V4dGVybiBfX3VpbnQ2NF90IHhmc19tYXhfZmlsZV9vZmZzZXQodW5zaWduZWQgaW50KTsKKworZXh0ZXJuIHZvaWQgeGZzX2luaXRpYWxpemVfdm5vZGUoYmh2X2Rlc2NfdCAqLCB2bm9kZV90ICosIGJodl9kZXNjX3QgKiwgaW50KTsKKworZXh0ZXJuIHZvaWQgeGZzX2ZsdXNoX2lub2RlKHN0cnVjdCB4ZnNfaW5vZGUgKik7CitleHRlcm4gdm9pZCB4ZnNfZmx1c2hfZGV2aWNlKHN0cnVjdCB4ZnNfaW5vZGUgKik7CisKK2V4dGVybiBpbnQgIHhmc19ibGtkZXZfZ2V0KHN0cnVjdCB4ZnNfbW91bnQgKiwgY29uc3QgY2hhciAqLAorCQkJCXN0cnVjdCBibG9ja19kZXZpY2UgKiopOworZXh0ZXJuIHZvaWQgeGZzX2Jsa2Rldl9wdXQoc3RydWN0IGJsb2NrX2RldmljZSAqKTsKKworZXh0ZXJuIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBsaW52ZnNfZXhwb3J0X29wczsKKworI2VuZGlmCS8qIF9fWEZTX1NVUEVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3lzY3RsLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19zeXNjdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGMwMTAzCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3lzY3RsLmMKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICp4ZnNfdGFibGVfaGVhZGVyOworCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworU1RBVElDIGludAoreGZzX3N0YXRzX2NsZWFyX3Byb2NfaGFuZGxlcigKKwljdGxfdGFibGUJKmN0bCwKKwlpbnQJCXdyaXRlLAorCXN0cnVjdCBmaWxlCSpmaWxwLAorCXZvaWQJCV9fdXNlciAqYnVmZmVyLAorCXNpemVfdAkJKmxlbnAsCisJbG9mZl90CQkqcHBvcykKK3sKKwlpbnQJCWMsIHJldCwgKnZhbHAgPSBjdGwtPmRhdGE7CisJX191aW50MzJfdAl2bl9hY3RpdmU7CisKKwlyZXQgPSBwcm9jX2RvaW50dmVjX21pbm1heChjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCisJaWYgKCFyZXQgJiYgd3JpdGUgJiYgKnZhbHApIHsKKwkJcHJpbnRrKCJYRlMgQ2xlYXJpbmcgeGZzc3RhdHNcbiIpOworCQlmb3IgKGMgPSAwOyBjIDwgTlJfQ1BVUzsgYysrKSB7CisJCQlpZiAoIWNwdV9wb3NzaWJsZShjKSkgY29udGludWU7CisJCQlwcmVlbXB0X2Rpc2FibGUoKTsKKwkJCS8qIHNhdmUgdm5fYWN0aXZlLCBpdCdzIGEgdW5pdmVyc2FsIHRydXRoISAqLworCQkJdm5fYWN0aXZlID0gcGVyX2NwdSh4ZnNzdGF0cywgYykudm5fYWN0aXZlOworCQkJbWVtc2V0KCZwZXJfY3B1KHhmc3N0YXRzLCBjKSwgMCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHhmc3N0YXRzKSk7CisJCQlwZXJfY3B1KHhmc3N0YXRzLCBjKS52bl9hY3RpdmUgPSB2bl9hY3RpdmU7CisJCQlwcmVlbXB0X2VuYWJsZSgpOworCQl9CisJCXhmc19zdGF0c19jbGVhciA9IDA7CisJfQorCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCitTVEFUSUMgY3RsX3RhYmxlIHhmc190YWJsZVtdID0geworCXtYRlNfUkVTVFJJQ1RfQ0hPV04sICJyZXN0cmljdF9jaG93biIsICZ4ZnNfcGFyYW1zLnJlc3RyaWN0X2Nob3duLnZhbCwKKwlzaXplb2YoaW50KSwgMDY0NCwgTlVMTCwgJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCSZzeXNjdGxfaW50dmVjLCBOVUxMLCAKKwkmeGZzX3BhcmFtcy5yZXN0cmljdF9jaG93bi5taW4sICZ4ZnNfcGFyYW1zLnJlc3RyaWN0X2Nob3duLm1heH0sCisKKwl7WEZTX1NHSURfSU5IRVJJVCwgImlyaXhfc2dpZF9pbmhlcml0IiwgJnhmc19wYXJhbXMuc2dpZF9pbmhlcml0LnZhbCwKKwlzaXplb2YoaW50KSwgMDY0NCwgTlVMTCwgJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCSZzeXNjdGxfaW50dmVjLCBOVUxMLAorCSZ4ZnNfcGFyYW1zLnNnaWRfaW5oZXJpdC5taW4sICZ4ZnNfcGFyYW1zLnNnaWRfaW5oZXJpdC5tYXh9LAorCisJe1hGU19TWU1MSU5LX01PREUsICJpcml4X3N5bWxpbmtfbW9kZSIsICZ4ZnNfcGFyYW1zLnN5bWxpbmtfbW9kZS52YWwsCisJc2l6ZW9mKGludCksIDA2NDQsIE5VTEwsICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkmc3lzY3RsX2ludHZlYywgTlVMTCwgCisJJnhmc19wYXJhbXMuc3ltbGlua19tb2RlLm1pbiwgJnhmc19wYXJhbXMuc3ltbGlua19tb2RlLm1heH0sCisKKwl7WEZTX1BBTklDX01BU0ssICJwYW5pY19tYXNrIiwgJnhmc19wYXJhbXMucGFuaWNfbWFzay52YWwsCisJc2l6ZW9mKGludCksIDA2NDQsIE5VTEwsICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkmc3lzY3RsX2ludHZlYywgTlVMTCwgCisJJnhmc19wYXJhbXMucGFuaWNfbWFzay5taW4sICZ4ZnNfcGFyYW1zLnBhbmljX21hc2subWF4fSwKKworCXtYRlNfRVJSTEVWRUwsICJlcnJvcl9sZXZlbCIsICZ4ZnNfcGFyYW1zLmVycm9yX2xldmVsLnZhbCwKKwlzaXplb2YoaW50KSwgMDY0NCwgTlVMTCwgJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCSZzeXNjdGxfaW50dmVjLCBOVUxMLCAKKwkmeGZzX3BhcmFtcy5lcnJvcl9sZXZlbC5taW4sICZ4ZnNfcGFyYW1zLmVycm9yX2xldmVsLm1heH0sCisKKwl7WEZTX1NZTkNEX1RJTUVSLCAieGZzc3luY2RfY2VudGlzZWNzIiwgJnhmc19wYXJhbXMuc3luY2RfdGltZXIudmFsLAorCXNpemVvZihpbnQpLCAwNjQ0LCBOVUxMLCAmcHJvY19kb2ludHZlY19taW5tYXgsCisJJnN5c2N0bF9pbnR2ZWMsIE5VTEwsIAorCSZ4ZnNfcGFyYW1zLnN5bmNkX3RpbWVyLm1pbiwgJnhmc19wYXJhbXMuc3luY2RfdGltZXIubWF4fSwKKworCXtYRlNfSU5IRVJJVF9TWU5DLCAiaW5oZXJpdF9zeW5jIiwgJnhmc19wYXJhbXMuaW5oZXJpdF9zeW5jLnZhbCwKKwlzaXplb2YoaW50KSwgMDY0NCwgTlVMTCwgJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCSZzeXNjdGxfaW50dmVjLCBOVUxMLAorCSZ4ZnNfcGFyYW1zLmluaGVyaXRfc3luYy5taW4sICZ4ZnNfcGFyYW1zLmluaGVyaXRfc3luYy5tYXh9LAorCisJe1hGU19JTkhFUklUX05PRFVNUCwgImluaGVyaXRfbm9kdW1wIiwgJnhmc19wYXJhbXMuaW5oZXJpdF9ub2R1bXAudmFsLAorCXNpemVvZihpbnQpLCAwNjQ0LCBOVUxMLCAmcHJvY19kb2ludHZlY19taW5tYXgsCisJJnN5c2N0bF9pbnR2ZWMsIE5VTEwsCisJJnhmc19wYXJhbXMuaW5oZXJpdF9ub2R1bXAubWluLCAmeGZzX3BhcmFtcy5pbmhlcml0X25vZHVtcC5tYXh9LAorCisJe1hGU19JTkhFUklUX05PQVRJTUUsICJpbmhlcml0X25vYXRpbWUiLCAmeGZzX3BhcmFtcy5pbmhlcml0X25vYXRpbS52YWwsCisJc2l6ZW9mKGludCksIDA2NDQsIE5VTEwsICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkmc3lzY3RsX2ludHZlYywgTlVMTCwKKwkmeGZzX3BhcmFtcy5pbmhlcml0X25vYXRpbS5taW4sICZ4ZnNfcGFyYW1zLmluaGVyaXRfbm9hdGltLm1heH0sCisJCisJe1hGU19CVUZfVElNRVIsICJ4ZnNidWZkX2NlbnRpc2VjcyIsICZ4ZnNfcGFyYW1zLnhmc19idWZfdGltZXIudmFsLAorCXNpemVvZihpbnQpLCAwNjQ0LCBOVUxMLCAmcHJvY19kb2ludHZlY19taW5tYXgsCisJJnN5c2N0bF9pbnR2ZWMsIE5VTEwsCisJJnhmc19wYXJhbXMueGZzX2J1Zl90aW1lci5taW4sICZ4ZnNfcGFyYW1zLnhmc19idWZfdGltZXIubWF4fSwKKworCXtYRlNfQlVGX0FHRSwgImFnZV9idWZmZXJfY2VudGlzZWNzIiwgJnhmc19wYXJhbXMueGZzX2J1Zl9hZ2UudmFsLAorCXNpemVvZihpbnQpLCAwNjQ0LCBOVUxMLCAmcHJvY19kb2ludHZlY19taW5tYXgsCisJJnN5c2N0bF9pbnR2ZWMsIE5VTEwsCisJJnhmc19wYXJhbXMueGZzX2J1Zl9hZ2UubWluLCAmeGZzX3BhcmFtcy54ZnNfYnVmX2FnZS5tYXh9LAorCisJe1hGU19JTkhFUklUX05PU1lNLCAiaW5oZXJpdF9ub3N5bWxpbmtzIiwgJnhmc19wYXJhbXMuaW5oZXJpdF9ub3N5bS52YWwsCisJc2l6ZW9mKGludCksIDA2NDQsIE5VTEwsICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkmc3lzY3RsX2ludHZlYywgTlVMTCwKKwkmeGZzX3BhcmFtcy5pbmhlcml0X25vc3ltLm1pbiwgJnhmc19wYXJhbXMuaW5oZXJpdF9ub3N5bS5tYXh9LAorCisJe1hGU19ST1RPUlNURVAsICJyb3RvcnN0ZXAiLCAmeGZzX3BhcmFtcy5yb3RvcnN0ZXAudmFsLAorCXNpemVvZihpbnQpLCAwNjQ0LCBOVUxMLCAmcHJvY19kb2ludHZlY19taW5tYXgsCisJJnN5c2N0bF9pbnR2ZWMsIE5VTEwsIAorCSZ4ZnNfcGFyYW1zLnJvdG9yc3RlcC5taW4sICZ4ZnNfcGFyYW1zLnJvdG9yc3RlcC5tYXh9LAorCisJLyogcGxlYXNlIGtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeSAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJe1hGU19TVEFUU19DTEVBUiwgInN0YXRzX2NsZWFyIiwgJnhmc19wYXJhbXMuc3RhdHNfY2xlYXIudmFsLAorCXNpemVvZihpbnQpLCAwNjQ0LCBOVUxMLCAmeGZzX3N0YXRzX2NsZWFyX3Byb2NfaGFuZGxlciwKKwkmc3lzY3RsX2ludHZlYywgTlVMTCwgCisJJnhmc19wYXJhbXMuc3RhdHNfY2xlYXIubWluLCAmeGZzX3BhcmFtcy5zdGF0c19jbGVhci5tYXh9LAorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKKwl7MH0KK307CisKK1NUQVRJQyBjdGxfdGFibGUgeGZzX2Rpcl90YWJsZVtdID0geworCXtGU19YRlMsICJ4ZnMiLCBOVUxMLCAwLCAwNTU1LCB4ZnNfdGFibGV9LAorCXswfQorfTsKKworU1RBVElDIGN0bF90YWJsZSB4ZnNfcm9vdF90YWJsZVtdID0geworCXtDVExfRlMsICJmcyIsICBOVUxMLCAwLCAwNTU1LCB4ZnNfZGlyX3RhYmxlfSwKKwl7MH0KK307CisKK3ZvaWQKK3hmc19zeXNjdGxfcmVnaXN0ZXIodm9pZCkKK3sKKwl4ZnNfdGFibGVfaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHhmc19yb290X3RhYmxlLCAxKTsKK30KKwordm9pZAoreGZzX3N5c2N0bF91bnJlZ2lzdGVyKHZvaWQpCit7CisJaWYgKHhmc190YWJsZV9oZWFkZXIpCisJCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHhmc190YWJsZV9oZWFkZXIpOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3lzY3RsLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19zeXNjdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzlhOTUwCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3lzY3RsLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpZm5kZWYgX19YRlNfU1lTQ1RMX0hfXworI2RlZmluZSBfX1hGU19TWVNDVExfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKworLyoKKyAqIFR1bmFibGUgeGZzIHBhcmFtZXRlcnMKKyAqLworCit0eXBlZGVmIHN0cnVjdCB4ZnNfc3lzY3RsX3ZhbCB7CisJaW50IG1pbjsKKwlpbnQgdmFsOworCWludCBtYXg7Cit9IHhmc19zeXNjdGxfdmFsX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19wYXJhbSB7CisJeGZzX3N5c2N0bF92YWxfdCByZXN0cmljdF9jaG93bjsvKiBSb290L25vbi1yb290IGNhbiBnaXZlIGF3YXkgZmlsZXMuKi8KKwl4ZnNfc3lzY3RsX3ZhbF90IHNnaWRfaW5oZXJpdDsJLyogSW5oZXJpdCBTX0lTR0lEIGlmIHByb2Nlc3MnIEdJRCBpcworCQkJCQkgKiBub3QgYSBtZW1iZXIgb2YgcGFyZW50IGRpciBHSUQuICovCisJeGZzX3N5c2N0bF92YWxfdCBzeW1saW5rX21vZGU7CS8qIExpbmsgY3JlYXQgbW9kZSBhZmZlY3RlZCBieSB1bWFzayAqLworCXhmc19zeXNjdGxfdmFsX3QgcGFuaWNfbWFzazsJLyogYml0bWFzayB0byBjYXVzZSBwYW5pYyBvbiBlcnJvcnMuICovCisJeGZzX3N5c2N0bF92YWxfdCBlcnJvcl9sZXZlbDsJLyogRGVncmVlIG9mIHJlcG9ydGluZyBmb3IgcHJvYmxlbXMgICovCisJeGZzX3N5c2N0bF92YWxfdCBzeW5jZF90aW1lcjsJLyogSW50ZXJ2YWwgYmV0d2VlbiB4ZnNzeW5jZCB3YWtldXBzICovCisJeGZzX3N5c2N0bF92YWxfdCBzdGF0c19jbGVhcjsJLyogUmVzZXQgYWxsIFhGUyBzdGF0aXN0aWNzIHRvIHplcm8uICovCisJeGZzX3N5c2N0bF92YWxfdCBpbmhlcml0X3N5bmM7CS8qIEluaGVyaXQgdGhlICJzeW5jIiBpbm9kZSBmbGFnLiAqLworCXhmc19zeXNjdGxfdmFsX3QgaW5oZXJpdF9ub2R1bXA7LyogSW5oZXJpdCB0aGUgIm5vZHVtcCIgaW5vZGUgZmxhZy4gKi8KKwl4ZnNfc3lzY3RsX3ZhbF90IGluaGVyaXRfbm9hdGltOy8qIEluaGVyaXQgdGhlICJub2F0aW1lIiBpbm9kZSBmbGFnLiAqLworCXhmc19zeXNjdGxfdmFsX3QgeGZzX2J1Zl90aW1lcjsJLyogSW50ZXJ2YWwgYmV0d2VlbiB4ZnNidWZkIHdha2V1cHMuICovCisJeGZzX3N5c2N0bF92YWxfdCB4ZnNfYnVmX2FnZTsJLyogTWV0YWRhdGEgYnVmZmVyIGFnZSBiZWZvcmUgZmx1c2guICovCisJeGZzX3N5c2N0bF92YWxfdCBpbmhlcml0X25vc3ltOwkvKiBJbmhlcml0IHRoZSAibm9zeW1saW5rcyIgZmxhZy4gKi8KKwl4ZnNfc3lzY3RsX3ZhbF90IHJvdG9yc3RlcDsJLyogaW5vZGUzMiBBRyByb3RvcmluZyBjb250cm9sIGtub2IgKi8KK30geGZzX3BhcmFtX3Q7CisKKy8qCisgKiB4ZnNfZXJyb3JfbGV2ZWw6CisgKgorICogSG93IG11Y2ggZXJyb3IgcmVwb3J0aW5nIHdpbGwgYmUgZG9uZSB3aGVuIGludGVybmFsIHByb2JsZW1zIGFyZQorICogZW5jb3VudGVyZWQuICBUaGVzZSBwcm9ibGVtcyBub3JtYWxseSByZXR1cm4gYW4gRUZTQ09SUlVQVEVEIHRvIHRoZWlyCisgKiBjYWxsZXIsIHdpdGggbm8gb3RoZXIgaW5mb3JtYXRpb24gcmVwb3J0ZWQuCisgKgorICogMAlObyBlcnJvciByZXBvcnRzCisgKiAxCVJlcG9ydCBFRlNDT1JSVVBURUQgZXJyb3JzIHRoYXQgd2lsbCBjYXVzZSBhIGZpbGVzeXN0ZW0gc2h1dGRvd24KKyAqIDUJUmVwb3J0IGFsbCBFRlNDT1JSVVBURUQgZXJyb3JzIChhbGwgb2YgdGhlIGFib3ZlIGVycm9ycywgcGx1cyBhbnkKKyAqCWFkZGl0aW9uYWwgZXJyb3JzIHRoYXQgYXJlIGtub3duIHRvIG5vdCBjYXVzZSBzaHV0ZG93bnMpCisgKgorICogeGZzX3BhbmljX21hc2sgYml0IDB4OCB0dXJucyB0aGUgZXJyb3IgcmVwb3J0cyBpbnRvIHBhbmljcworICovCisKK2VudW0geworCS8qIFhGU19SRUZDQUNIRV9TSVpFID0gMSAqLworCS8qIFhGU19SRUZDQUNIRV9QVVJHRSA9IDIgKi8KKwlYRlNfUkVTVFJJQ1RfQ0hPV04gPSAzLAorCVhGU19TR0lEX0lOSEVSSVQgPSA0LAorCVhGU19TWU1MSU5LX01PREUgPSA1LAorCVhGU19QQU5JQ19NQVNLID0gNiwKKwlYRlNfRVJSTEVWRUwgPSA3LAorCVhGU19TWU5DRF9USU1FUiA9IDgsCisJLyogWEZTX1BST0JFX0RNQVBJID0gOSAqLworCS8qIFhGU19QUk9CRV9JT09QUyA9IDEwICovCisJLyogWEZTX1BST0JFX1FVT1RBID0gMTEgKi8KKwlYRlNfU1RBVFNfQ0xFQVIgPSAxMiwKKwlYRlNfSU5IRVJJVF9TWU5DID0gMTMsCisJWEZTX0lOSEVSSVRfTk9EVU1QID0gMTQsCisJWEZTX0lOSEVSSVRfTk9BVElNRSA9IDE1LAorCVhGU19CVUZfVElNRVIgPSAxNiwKKwlYRlNfQlVGX0FHRSA9IDE3LAorCS8qIFhGU19JT19CWVBBU1MgPSAxOCAqLworCVhGU19JTkhFUklUX05PU1lNID0gMTksCisJWEZTX1JPVE9SU1RFUCA9IDIwLAorfTsKKworZXh0ZXJuIHhmc19wYXJhbV90CXhmc19wYXJhbXM7CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCitleHRlcm4gdm9pZCB4ZnNfc3lzY3RsX3JlZ2lzdGVyKHZvaWQpOworZXh0ZXJuIHZvaWQgeGZzX3N5c2N0bF91bnJlZ2lzdGVyKHZvaWQpOworI2Vsc2UKKyMgZGVmaW5lIHhmc19zeXNjdGxfcmVnaXN0ZXIoKQkJZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgeGZzX3N5c2N0bF91bnJlZ2lzdGVyKCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KKworI2VuZGlmIC8qIF9fWEZTX1NZU0NUTF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3ZlcnNpb24uaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmY5NjM5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdmVyc2lvbi5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuCSBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKy8qCisgKiBEdW1teSBmaWxlIHRoYXQgY2FuIGNvbnRhaW4gYSB0aW1lc3RhbXAgdG8gcHV0IGludG8gdGhlCisgKiBYRlMgaW5pdCBzdHJpbmcsIHRvIGhlbHAgdXNlcnMga2VlcCB0cmFjayBvZiB3aGF0IHRoZXkncmUKKyAqIHJ1bm5pbmcKKyAqLworCisjaWZuZGVmIF9fWEZTX1ZFUlNJT05fSF9fCisjZGVmaW5lIF9fWEZTX1ZFUlNJT05fSF9fCisKKyNkZWZpbmUgWEZTX1ZFUlNJT05fU1RSSU5HICJTR0kgWEZTIgorCisjZW5kaWYgLyogX19YRlNfVkVSU0lPTl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zmcy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdmZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5YzYxNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zmcy5jCkBAIC0wLDAgKzEsMzMwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19jbG50LmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2ltYXAuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKKworaW50Cit2ZnNfbW91bnQoCisJc3RydWN0IGJodl9kZXNjCQkqYmRwLAorCXN0cnVjdCB4ZnNfbW91bnRfYXJncwkqYXJncywKKwlzdHJ1Y3QgY3JlZAkJKmNyKQoreworCXN0cnVjdCBiaHZfZGVzYwkJKm5leHQgPSBiZHA7CisKKwlBU1NFUlQobmV4dCk7CisJd2hpbGUgKCEgKGJodnRvdmZzb3BzKG5leHQpKS0+dmZzX21vdW50KQorCQluZXh0ID0gQkhWX05FWFQobmV4dCk7CisJcmV0dXJuICgoKmJodnRvdmZzb3BzKG5leHQpLT52ZnNfbW91bnQpKG5leHQsIGFyZ3MsIGNyKSk7Cit9CisKK2ludAordmZzX3BhcnNlYXJncygKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpiZHAsCisJY2hhcgkJCSpzLAorCXN0cnVjdCB4ZnNfbW91bnRfYXJncwkqYXJncywKKwlpbnQJCQlmKQoreworCXN0cnVjdCBiaHZfZGVzYwkJKm5leHQgPSBiZHA7CisKKwlBU1NFUlQobmV4dCk7CisJd2hpbGUgKCEgKGJodnRvdmZzb3BzKG5leHQpKS0+dmZzX3BhcnNlYXJncykKKwkJbmV4dCA9IEJIVl9ORVhUKG5leHQpOworCXJldHVybiAoKCpiaHZ0b3Zmc29wcyhuZXh0KS0+dmZzX3BhcnNlYXJncykobmV4dCwgcywgYXJncywgZikpOworfQorCitpbnQKK3Zmc19zaG93YXJncygKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpiZHAsCisJc3RydWN0IHNlcV9maWxlCQkqbSkKK3sKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpuZXh0ID0gYmRwOworCisJQVNTRVJUKG5leHQpOworCXdoaWxlICghIChiaHZ0b3Zmc29wcyhuZXh0KSktPnZmc19zaG93YXJncykKKwkJbmV4dCA9IEJIVl9ORVhUKG5leHQpOworCXJldHVybiAoKCpiaHZ0b3Zmc29wcyhuZXh0KS0+dmZzX3Nob3dhcmdzKShuZXh0LCBtKSk7Cit9CisKK2ludAordmZzX3VubW91bnQoCisJc3RydWN0IGJodl9kZXNjCQkqYmRwLAorCWludAkJCWZsLAorCXN0cnVjdCBjcmVkCQkqY3IpCit7CisJc3RydWN0IGJodl9kZXNjCQkqbmV4dCA9IGJkcDsKKworCUFTU0VSVChuZXh0KTsKKwl3aGlsZSAoISAoYmh2dG92ZnNvcHMobmV4dCkpLT52ZnNfdW5tb3VudCkKKwkJbmV4dCA9IEJIVl9ORVhUKG5leHQpOworCXJldHVybiAoKCpiaHZ0b3Zmc29wcyhuZXh0KS0+dmZzX3VubW91bnQpKG5leHQsIGZsLCBjcikpOworfQorCitpbnQKK3Zmc19tbnR1cGRhdGUoCisJc3RydWN0IGJodl9kZXNjCQkqYmRwLAorCWludAkJCSpmbCwKKwlzdHJ1Y3QgeGZzX21vdW50X2FyZ3MJKmFyZ3MpCit7CisJc3RydWN0IGJodl9kZXNjCQkqbmV4dCA9IGJkcDsKKworCUFTU0VSVChuZXh0KTsKKwl3aGlsZSAoISAoYmh2dG92ZnNvcHMobmV4dCkpLT52ZnNfbW50dXBkYXRlKQorCQluZXh0ID0gQkhWX05FWFQobmV4dCk7CisJcmV0dXJuICgoKmJodnRvdmZzb3BzKG5leHQpLT52ZnNfbW50dXBkYXRlKShuZXh0LCBmbCwgYXJncykpOworfQorCitpbnQKK3Zmc19yb290KAorCXN0cnVjdCBiaHZfZGVzYwkJKmJkcCwKKwlzdHJ1Y3Qgdm5vZGUJCSoqdnBwKQoreworCXN0cnVjdCBiaHZfZGVzYwkJKm5leHQgPSBiZHA7CisKKwlBU1NFUlQobmV4dCk7CisJd2hpbGUgKCEgKGJodnRvdmZzb3BzKG5leHQpKS0+dmZzX3Jvb3QpCisJCW5leHQgPSBCSFZfTkVYVChuZXh0KTsKKwlyZXR1cm4gKCgqYmh2dG92ZnNvcHMobmV4dCktPnZmc19yb290KShuZXh0LCB2cHApKTsKK30KKworaW50Cit2ZnNfc3RhdHZmcygKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpiZHAsCisJeGZzX3N0YXRmc190CQkqc3AsCisJc3RydWN0IHZub2RlCQkqdnApCit7CisJc3RydWN0IGJodl9kZXNjCQkqbmV4dCA9IGJkcDsKKworCUFTU0VSVChuZXh0KTsKKwl3aGlsZSAoISAoYmh2dG92ZnNvcHMobmV4dCkpLT52ZnNfc3RhdHZmcykKKwkJbmV4dCA9IEJIVl9ORVhUKG5leHQpOworCXJldHVybiAoKCpiaHZ0b3Zmc29wcyhuZXh0KS0+dmZzX3N0YXR2ZnMpKG5leHQsIHNwLCB2cCkpOworfQorCitpbnQKK3Zmc19zeW5jKAorCXN0cnVjdCBiaHZfZGVzYwkJKmJkcCwKKwlpbnQJCQlmbCwKKwlzdHJ1Y3QgY3JlZAkJKmNyKQoreworCXN0cnVjdCBiaHZfZGVzYwkJKm5leHQgPSBiZHA7CisKKwlBU1NFUlQobmV4dCk7CisJd2hpbGUgKCEgKGJodnRvdmZzb3BzKG5leHQpKS0+dmZzX3N5bmMpCisJCW5leHQgPSBCSFZfTkVYVChuZXh0KTsKKwlyZXR1cm4gKCgqYmh2dG92ZnNvcHMobmV4dCktPnZmc19zeW5jKShuZXh0LCBmbCwgY3IpKTsKK30KKworaW50Cit2ZnNfdmdldCgKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpiZHAsCisJc3RydWN0IHZub2RlCQkqKnZwcCwKKwlzdHJ1Y3QgZmlkCQkqZmlkcCkKK3sKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpuZXh0ID0gYmRwOworCisJQVNTRVJUKG5leHQpOworCXdoaWxlICghIChiaHZ0b3Zmc29wcyhuZXh0KSktPnZmc192Z2V0KQorCQluZXh0ID0gQkhWX05FWFQobmV4dCk7CisJcmV0dXJuICgoKmJodnRvdmZzb3BzKG5leHQpLT52ZnNfdmdldCkobmV4dCwgdnBwLCBmaWRwKSk7Cit9CisKK2ludAordmZzX2RtYXBpb3BzKAorCXN0cnVjdCBiaHZfZGVzYwkJKmJkcCwKKwljYWRkcl90CQkJYWRkcikKK3sKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpuZXh0ID0gYmRwOworCisJQVNTRVJUKG5leHQpOworCXdoaWxlICghIChiaHZ0b3Zmc29wcyhuZXh0KSktPnZmc19kbWFwaW9wcykKKwkJbmV4dCA9IEJIVl9ORVhUKG5leHQpOworCXJldHVybiAoKCpiaHZ0b3Zmc29wcyhuZXh0KS0+dmZzX2RtYXBpb3BzKShuZXh0LCBhZGRyKSk7Cit9CisKK2ludAordmZzX3F1b3RhY3RsKAorCXN0cnVjdCBiaHZfZGVzYwkJKmJkcCwKKwlpbnQJCQljbWQsCisJaW50CQkJaWQsCisJY2FkZHJfdAkJCWFkZHIpCit7CisJc3RydWN0IGJodl9kZXNjCQkqbmV4dCA9IGJkcDsKKworCUFTU0VSVChuZXh0KTsKKwl3aGlsZSAoISAoYmh2dG92ZnNvcHMobmV4dCkpLT52ZnNfcXVvdGFjdGwpCisJCW5leHQgPSBCSFZfTkVYVChuZXh0KTsKKwlyZXR1cm4gKCgqYmh2dG92ZnNvcHMobmV4dCktPnZmc19xdW90YWN0bCkobmV4dCwgY21kLCBpZCwgYWRkcikpOworfQorCit2b2lkCit2ZnNfaW5pdF92bm9kZSgKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpiZHAsCisJc3RydWN0IHZub2RlCQkqdnAsCisJc3RydWN0IGJodl9kZXNjCQkqYnAsCisJaW50CQkJdW5sb2NrKQoreworCXN0cnVjdCBiaHZfZGVzYwkJKm5leHQgPSBiZHA7CisKKwlBU1NFUlQobmV4dCk7CisJd2hpbGUgKCEgKGJodnRvdmZzb3BzKG5leHQpKS0+dmZzX2luaXRfdm5vZGUpCisJCW5leHQgPSBCSFZfTkVYVChuZXh0KTsKKwkoKCpiaHZ0b3Zmc29wcyhuZXh0KS0+dmZzX2luaXRfdm5vZGUpKG5leHQsIHZwLCBicCwgdW5sb2NrKSk7Cit9CisKK3ZvaWQKK3Zmc19mb3JjZV9zaHV0ZG93bigKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpiZHAsCisJaW50CQkJZmwsCisJY2hhcgkJCSpmaWxlLAorCWludAkJCWxpbmUpCit7CisJc3RydWN0IGJodl9kZXNjCQkqbmV4dCA9IGJkcDsKKworCUFTU0VSVChuZXh0KTsKKwl3aGlsZSAoISAoYmh2dG92ZnNvcHMobmV4dCkpLT52ZnNfZm9yY2Vfc2h1dGRvd24pCisJCW5leHQgPSBCSFZfTkVYVChuZXh0KTsKKwkoKCpiaHZ0b3Zmc29wcyhuZXh0KS0+dmZzX2ZvcmNlX3NodXRkb3duKShuZXh0LCBmbCwgZmlsZSwgbGluZSkpOworfQorCit2b2lkCit2ZnNfZnJlZXplKAorCXN0cnVjdCBiaHZfZGVzYwkJKmJkcCkKK3sKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpuZXh0ID0gYmRwOworCisJQVNTRVJUKG5leHQpOworCXdoaWxlICghIChiaHZ0b3Zmc29wcyhuZXh0KSktPnZmc19mcmVlemUpCisJCW5leHQgPSBCSFZfTkVYVChuZXh0KTsKKwkoKCpiaHZ0b3Zmc29wcyhuZXh0KS0+dmZzX2ZyZWV6ZSkobmV4dCkpOworfQorCit2ZnNfdCAqCit2ZnNfYWxsb2NhdGUoIHZvaWQgKQoreworCXN0cnVjdCB2ZnMJCSp2ZnNwOworCisJdmZzcCA9IGttZW1femFsbG9jKHNpemVvZih2ZnNfdCksIEtNX1NMRUVQKTsKKwliaHZfaGVhZF9pbml0KFZGU19CSFZIRUFEKHZmc3ApLCAidmZzIik7CisJSU5JVF9MSVNUX0hFQUQoJnZmc3AtPnZmc19zeW5jX2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZ2ZnNwLT52ZnNfc3luY19sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2ZnNwLT52ZnNfd2FpdF9zeW5jX3Rhc2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZmc3AtPnZmc193YWl0X3NpbmdsZV9zeW5jX3Rhc2spOworCXJldHVybiB2ZnNwOworfQorCit2b2lkCit2ZnNfZGVhbGxvY2F0ZSgKKwlzdHJ1Y3QgdmZzCQkqdmZzcCkKK3sKKwliaHZfaGVhZF9kZXN0cm95KFZGU19CSFZIRUFEKHZmc3ApKTsKKwlrbWVtX2ZyZWUodmZzcCwgc2l6ZW9mKHZmc190KSk7Cit9CisKK3ZvaWQKK3Zmc19pbnNlcnRvcHMoCisJc3RydWN0IHZmcwkJKnZmc3AsCisJc3RydWN0IGJodl92ZnNvcHMJKnZmc29wcykKK3sKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpiZHA7CisKKwliZHAgPSBrbWVtX2FsbG9jKHNpemVvZihzdHJ1Y3QgYmh2X2Rlc2MpLCBLTV9TTEVFUCk7CisJYmh2X2Rlc2NfaW5pdChiZHAsIE5VTEwsIHZmc3AsIHZmc29wcyk7CisJYmh2X2luc2VydCgmdmZzcC0+dmZzX2JoLCBiZHApOworfQorCit2b2lkCit2ZnNfaW5zZXJ0Ymh2KAorCXN0cnVjdCB2ZnMJCSp2ZnNwLAorCXN0cnVjdCBiaHZfZGVzYwkJKmJkcCwKKwlzdHJ1Y3QgdmZzb3BzCQkqdmZzb3BzLAorCXZvaWQJCQkqbW91bnQpCit7CisJYmh2X2Rlc2NfaW5pdChiZHAsIG1vdW50LCB2ZnNwLCB2ZnNvcHMpOworCWJodl9pbnNlcnRfaW5pdGlhbCgmdmZzcC0+dmZzX2JoLCBiZHApOworfQorCit2b2lkCitiaHZfcmVtb3ZlX3Zmc29wcygKKwlzdHJ1Y3QgdmZzCQkqdmZzcCwKKwlpbnQJCQlwb3MpCit7CisJc3RydWN0IGJodl9kZXNjCQkqYmh2OworCisJYmh2ID0gYmh2X2xvb2t1cF9yYW5nZSgmdmZzcC0+dmZzX2JoLCBwb3MsIHBvcyk7CisJaWYgKCFiaHYpCisJCXJldHVybjsKKwliaHZfcmVtb3ZlKCZ2ZnNwLT52ZnNfYmgsIGJodik7CisJa21lbV9mcmVlKGJodiwgc2l6ZW9mKCpiaHYpKTsKK30KKwordm9pZAorYmh2X3JlbW92ZV9hbGxfdmZzb3BzKAorCXN0cnVjdCB2ZnMJCSp2ZnNwLAorCWludAkJCWZyZWViYXNlKQoreworCXN0cnVjdCB4ZnNfbW91bnQJKm1wOworCisJYmh2X3JlbW92ZV92ZnNvcHModmZzcCwgVkZTX1BPU0lUSU9OX1FNKTsKKwliaHZfcmVtb3ZlX3Zmc29wcyh2ZnNwLCBWRlNfUE9TSVRJT05fRE0pOworCWlmICghZnJlZWJhc2UpCisJCXJldHVybjsKKwltcCA9IFhGU19CSFZUT00oYmh2X2xvb2t1cChWRlNfQkhWSEVBRCh2ZnNwKSwgJnhmc192ZnNvcHMpKTsKKwlWRlNfUkVNT1ZFQkhWKHZmc3AsICZtcC0+bV9iaHYpOworCXhmc19tb3VudF9mcmVlKG1wLCAwKTsKK30KKwordm9pZAorYmh2X2luc2VydF9hbGxfdmZzb3BzKAorCXN0cnVjdCB2ZnMJCSp2ZnNwKQoreworCXN0cnVjdCB4ZnNfbW91bnQJKm1wOworCisJbXAgPSB4ZnNfbW91bnRfaW5pdCgpOworCXZmc19pbnNlcnRiaHYodmZzcCwgJm1wLT5tX2JodiwgJnhmc192ZnNvcHMsIG1wKTsKKwl2ZnNfaW5zZXJ0ZG1hcGkodmZzcCk7CisJdmZzX2luc2VydHF1b3RhKHZmc3ApOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdmZzLmggYi9mcy94ZnMvbGludXgtMi42L3hmc192ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjQ5Mzk5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdmZzLmgKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX1ZGU19IX18KKyNkZWZpbmUgX19YRlNfVkZTX0hfXworCisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSAieGZzX2ZzLmgiCisKK3N0cnVjdCBmaWQ7CitzdHJ1Y3QgdmZzOworc3RydWN0IGNyZWQ7CitzdHJ1Y3Qgdm5vZGU7CitzdHJ1Y3Qga3N0YXRmczsKK3N0cnVjdCBzZXFfZmlsZTsKK3N0cnVjdCBzdXBlcl9ibG9jazsKK3N0cnVjdCB4ZnNfbW91bnRfYXJnczsKKwordHlwZWRlZiBzdHJ1Y3Qga3N0YXRmcyB4ZnNfc3RhdGZzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHZmc19zeW5jX3dvcmsgeworCXN0cnVjdCBsaXN0X2hlYWQJd19saXN0OworCXN0cnVjdCB2ZnMJCSp3X3ZmczsKKwl2b2lkCQkJKndfZGF0YTsJLyogc3luY2VyIHJvdXRpbmUgYXJndW1lbnQgKi8KKwl2b2lkCQkJKCp3X3N5bmNlcikoc3RydWN0IHZmcyAqLCB2b2lkICopOworfSB2ZnNfc3luY193b3JrX3Q7CisKK3R5cGVkZWYgc3RydWN0IHZmcyB7CisJdV9pbnQJCQl2ZnNfZmxhZzsJLyogZmxhZ3MgKi8KKwl4ZnNfZnNpZF90CQl2ZnNfZnNpZDsJLyogZmlsZSBzeXN0ZW0gSUQgKi8KKwl4ZnNfZnNpZF90CQkqdmZzX2FsdGZzaWQ7CS8qIEFuIElEIGZpeGVkIGZvciBsaWZlIG9mIEZTICovCisJYmh2X2hlYWRfdAkJdmZzX2JoOwkJLyogaGVhZCBvZiB2ZnMgYmVoYXZpb3IgY2hhaW4gKi8KKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnZmc19zdXBlcjsJLyogZ2VuZXJpYyBzdXBlcmJsb2NrIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnZmc19zeW5jX3Rhc2s7CS8qIGdlbmVyYWxpc2VkIHN5bmMgdGhyZWFkICovCisJdmZzX3N5bmNfd29ya190CQl2ZnNfc3luY193b3JrOwkvKiB3b3JrIGl0ZW0gZm9yIFZGU19TWU5DICovCisJc3RydWN0IGxpc3RfaGVhZAl2ZnNfc3luY19saXN0OwkvKiBzeW5jIHRocmVhZCB3b3JrIGl0ZW0gbGlzdCAqLworCXNwaW5sb2NrX3QJCXZmc19zeW5jX2xvY2s7CS8qIHdvcmsgaXRlbSBsaXN0IGxvY2sgKi8KKwlpbnQgCQkJdmZzX3N5bmNfc2VxOwkvKiBzeW5jIHRocmVhZCBnZW5lcmF0aW9uIG5vLiAqLworCXdhaXRfcXVldWVfaGVhZF90CXZmc193YWl0X3NpbmdsZV9zeW5jX3Rhc2s7CisJd2FpdF9xdWV1ZV9oZWFkX3QJdmZzX3dhaXRfc3luY190YXNrOworfSB2ZnNfdDsKKworI2RlZmluZSB2ZnNfZmJodgkJdmZzX2JoLmJoX2ZpcnN0CS8qIDFzdCBvbiB2ZnMgYmVoYXZpb3IgY2hhaW4gKi8KKworI2RlZmluZSBiaHZ0b3ZmcyhiZHApCQkoIChzdHJ1Y3QgdmZzICopQkhWX1ZPQkooYmRwKSApCisjZGVmaW5lIGJodnRvdmZzb3BzKGJkcCkJKCAoc3RydWN0IHZmc29wcyAqKUJIVl9PUFMoYmRwKSApCisjZGVmaW5lIFZGU19CSFZIRUFEKHZmcykJKCAmKHZmcyktPnZmc19iaCApCisjZGVmaW5lIFZGU19SRU1PVkVCSFYodmZzLCBiZHApCSggYmh2X3JlbW92ZShWRlNfQkhWSEVBRCh2ZnMpLCBiZHApICkKKworI2RlZmluZSBWRlNfUE9TSVRJT05fQkFTRQlCSFZfUE9TSVRJT05fQkFTRQkvKiBjaGFpbiBib3R0b20gKi8KKyNkZWZpbmUgVkZTX1BPU0lUSU9OX1RPUAlCSFZfUE9TSVRJT05fVE9QCS8qIGNoYWluIHRvcCAqLworI2RlZmluZSBWRlNfUE9TSVRJT05fSU5WQUxJRAlCSFZfUE9TSVRJT05fSU5WQUxJRAkvKiBpbnZhbGlkIHBvcy4gbnVtICovCisKK3R5cGVkZWYgZW51bSB7CisJVkZTX0JIVl9VTktOT1dOLAkvKiBub3Qgc3BlY2lmaWVkICovCisJVkZTX0JIVl9YRlMsCQkvKiB4ZnMgKi8KKwlWRlNfQkhWX0RNLAkJLyogZGF0YSBtaWdyYXRpb24gKi8KKwlWRlNfQkhWX1FNLAkJLyogcXVvdGEgbWFuYWdlciAqLworCVZGU19CSFZfSU8sCQkvKiBJTyBwYXRoICovCisJVkZTX0JIVl9FTkQJCS8qIGhvdXNla2VlcGluZyBlbmQtb2YtcmFuZ2UgKi8KK30gdmZzX2Jodl90OworCisjZGVmaW5lIFZGU19QT1NJVElPTl9YRlMJKEJIVl9QT1NJVElPTl9CQVNFKQorI2RlZmluZSBWRlNfUE9TSVRJT05fRE0JCShWRlNfUE9TSVRJT05fQkFTRSsxMCkKKyNkZWZpbmUgVkZTX1BPU0lUSU9OX1FNCQkoVkZTX1BPU0lUSU9OX0JBU0UrMjApCisjZGVmaW5lIFZGU19QT1NJVElPTl9JTwkJKFZGU19QT1NJVElPTl9CQVNFKzMwKQorCisjZGVmaW5lIFZGU19SRE9OTFkJCTB4MDAwMQkvKiByZWFkLW9ubHkgdmZzICovCisjZGVmaW5lIFZGU19HUlBJRAkJMHgwMDAyCS8qIGdyb3VwLUlEIGFzc2lnbmVkIGZyb20gZGlyZWN0b3J5ICovCisjZGVmaW5lIFZGU19ETUkJCQkweDAwMDQJLyogZmlsZXN5c3RlbSBoYXMgdGhlIERNSSBlbmFibGVkICovCisjZGVmaW5lIFZGU19VTU9VTlQJCTB4MDAwOAkvKiB1bm1vdW50IGluIHByb2dyZXNzICovCisjZGVmaW5lIFZGU19FTkQJCQkweDAwMDgJLyogbWF4IGZsYWcgKi8KKworI2RlZmluZSBTWU5DX0FUVFIJCTB4MDAwMQkvKiBzeW5jIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgU1lOQ19DTE9TRQkJMHgwMDAyCS8qIGNsb3NlIGZpbGUgc3lzdGVtIGRvd24gKi8KKyNkZWZpbmUgU1lOQ19ERUxXUkkJCTB4MDAwNAkvKiBsb29rIGF0IGRlbGF5ZWQgd3JpdGVzICovCisjZGVmaW5lIFNZTkNfV0FJVAkJMHgwMDA4CS8qIHdhaXQgZm9yIGkvbyB0byBjb21wbGV0ZSAqLworI2RlZmluZSBTWU5DX0JERkxVU0gJCTB4MDAxMAkvKiBCREZMVVNIIGlzIGNhbGxpbmcgLS0gZG9uJ3QgYmxvY2sgKi8KKyNkZWZpbmUgU1lOQ19GU0RBVEEJCTB4MDAyMAkvKiBmbHVzaCBmcyBkYXRhIChlLmcuIHN1cGVyYmxvY2tzKSAqLworI2RlZmluZSBTWU5DX1JFRkNBQ0hFCQkweDAwNDAgIC8qIHBydW5lIHNvbWUgb2YgdGhlIG5mcyByZWYgY2FjaGUgKi8KKyNkZWZpbmUgU1lOQ19SRU1PVU5UCQkweDAwODAgIC8qIHJlbW91bnQgcmVhZG9ubHksIG5vIGR1bW15IExScyAqLworCit0eXBlZGVmIGludAkoKnZmc19tb3VudF90KShiaHZfZGVzY190ICosCisJCQkJc3RydWN0IHhmc19tb3VudF9hcmdzICosIHN0cnVjdCBjcmVkICopOwordHlwZWRlZiBpbnQJKCp2ZnNfcGFyc2VhcmdzX3QpKGJodl9kZXNjX3QgKiwgY2hhciAqLAorCQkJCXN0cnVjdCB4ZnNfbW91bnRfYXJncyAqLCBpbnQpOwordHlwZWRlZglpbnQJKCp2ZnNfc2hvd2FyZ3NfdCkoYmh2X2Rlc2NfdCAqLCBzdHJ1Y3Qgc2VxX2ZpbGUgKik7Cit0eXBlZGVmIGludAkoKnZmc191bm1vdW50X3QpKGJodl9kZXNjX3QgKiwgaW50LCBzdHJ1Y3QgY3JlZCAqKTsKK3R5cGVkZWYgaW50CSgqdmZzX21udHVwZGF0ZV90KShiaHZfZGVzY190ICosIGludCAqLAorCQkJCXN0cnVjdCB4ZnNfbW91bnRfYXJncyAqKTsKK3R5cGVkZWYgaW50CSgqdmZzX3Jvb3RfdCkoYmh2X2Rlc2NfdCAqLCBzdHJ1Y3Qgdm5vZGUgKiopOwordHlwZWRlZiBpbnQJKCp2ZnNfc3RhdHZmc190KShiaHZfZGVzY190ICosIHhmc19zdGF0ZnNfdCAqLCBzdHJ1Y3Qgdm5vZGUgKik7Cit0eXBlZGVmIGludAkoKnZmc19zeW5jX3QpKGJodl9kZXNjX3QgKiwgaW50LCBzdHJ1Y3QgY3JlZCAqKTsKK3R5cGVkZWYgaW50CSgqdmZzX3ZnZXRfdCkoYmh2X2Rlc2NfdCAqLCBzdHJ1Y3Qgdm5vZGUgKiosIHN0cnVjdCBmaWQgKik7Cit0eXBlZGVmIGludAkoKnZmc19kbWFwaW9wc190KShiaHZfZGVzY190ICosIGNhZGRyX3QpOwordHlwZWRlZiBpbnQJKCp2ZnNfcXVvdGFjdGxfdCkoYmh2X2Rlc2NfdCAqLCBpbnQsIGludCwgY2FkZHJfdCk7Cit0eXBlZGVmIHZvaWQJKCp2ZnNfaW5pdF92bm9kZV90KShiaHZfZGVzY190ICosCisJCQkJc3RydWN0IHZub2RlICosIGJodl9kZXNjX3QgKiwgaW50KTsKK3R5cGVkZWYgdm9pZAkoKnZmc19mb3JjZV9zaHV0ZG93bl90KShiaHZfZGVzY190ICosIGludCwgY2hhciAqLCBpbnQpOwordHlwZWRlZiB2b2lkCSgqdmZzX2ZyZWV6ZV90KShiaHZfZGVzY190ICopOworCit0eXBlZGVmIHN0cnVjdCB2ZnNvcHMgeworCWJodl9wb3NpdGlvbl90CQl2Zl9wb3NpdGlvbjsJLyogYmVoYXZpb3IgY2hhaW4gcG9zaXRpb24gKi8KKwl2ZnNfbW91bnRfdAkJdmZzX21vdW50OwkvKiBtb3VudCBmaWxlIHN5c3RlbSAqLworCXZmc19wYXJzZWFyZ3NfdAkJdmZzX3BhcnNlYXJnczsJLyogcGFyc2UgbW91bnQgb3B0aW9ucyAqLworCXZmc19zaG93YXJnc190CQl2ZnNfc2hvd2FyZ3M7CS8qIHVucGFyc2UgbW91bnQgb3B0aW9ucyAqLworCXZmc191bm1vdW50X3QJCXZmc191bm1vdW50OwkvKiB1bm1vdW50IGZpbGUgc3lzdGVtICovCisJdmZzX21udHVwZGF0ZV90CQl2ZnNfbW50dXBkYXRlOwkvKiB1cGRhdGUgZmlsZSBzeXN0ZW0gb3B0aW9ucyAqLworCXZmc19yb290X3QJCXZmc19yb290OwkvKiBnZXQgcm9vdCB2bm9kZSAqLworCXZmc19zdGF0dmZzX3QJCXZmc19zdGF0dmZzOwkvKiBmaWxlIHN5c3RlbSBzdGF0aXN0aWNzICovCisJdmZzX3N5bmNfdAkJdmZzX3N5bmM7CS8qIGZsdXNoIGZpbGVzICovCisJdmZzX3ZnZXRfdAkJdmZzX3ZnZXQ7CS8qIGdldCB2bm9kZSBmcm9tIGZpZCAqLworCXZmc19kbWFwaW9wc190CQl2ZnNfZG1hcGlvcHM7CS8qIGRhdGEgbWlncmF0aW9uICovCisJdmZzX3F1b3RhY3RsX3QJCXZmc19xdW90YWN0bDsJLyogZGlzayBxdW90YSAqLworCXZmc19pbml0X3Zub2RlX3QJdmZzX2luaXRfdm5vZGU7CS8qIGluaXRpYWxpemUgYSBuZXcgdm5vZGUgKi8KKwl2ZnNfZm9yY2Vfc2h1dGRvd25fdAl2ZnNfZm9yY2Vfc2h1dGRvd247CS8qIGNyYXNoIGFuZCBidXJuICovCisJdmZzX2ZyZWV6ZV90CQl2ZnNfZnJlZXplOwkvKiBmcmVlemUgZnMgZm9yIHNuYXBzaG90ICovCit9IHZmc29wc190OworCisvKgorICogVkZTJ3MuICBPcGVyYXRlcyBvbiB2ZnMgc3RydWN0dXJlIHBvaW50ZXJzIChzdGFydHMgYXQgYmh2IGhlYWQpLgorICovCisjZGVmaW5lIFZIRUFEKHYpCQkJKCh2KS0+dmZzX2ZiaHYpCisjZGVmaW5lIFZGU19NT1VOVCh2LCBtYSxjciwgcnYpCQkoKHJ2KSA9IHZmc19tb3VudChWSEVBRCh2KSwgbWEsY3IpKQorI2RlZmluZSBWRlNfUEFSU0VBUkdTKHYsIG8sbWEsZiwgcnYpCSgocnYpID0gdmZzX3BhcnNlYXJncyhWSEVBRCh2KSwgbyxtYSxmKSkKKyNkZWZpbmUgVkZTX1NIT1dBUkdTKHYsIG0sIHJ2KQkJKChydikgPSB2ZnNfc2hvd2FyZ3MoVkhFQUQodiksIG0pKQorI2RlZmluZSBWRlNfVU5NT1VOVCh2LCBmLCBjciwgcnYpCSgocnYpID0gdmZzX3VubW91bnQoVkhFQUQodiksIGYsY3IpKQorI2RlZmluZSBWRlNfTU5UVVBEQVRFKHYsIGZsLCBhcmdzLCBydikJKChydikgPSB2ZnNfbW50dXBkYXRlKFZIRUFEKHYpLCBmbCwgYXJncykpCisjZGVmaW5lIFZGU19ST09UKHYsIHZwcCwgcnYpCQkoKHJ2KSA9IHZmc19yb290KFZIRUFEKHYpLCB2cHApKQorI2RlZmluZSBWRlNfU1RBVFZGUyh2LCBzcCx2cCwgcnYpCSgocnYpID0gdmZzX3N0YXR2ZnMoVkhFQUQodiksIHNwLHZwKSkKKyNkZWZpbmUgVkZTX1NZTkModiwgZmxhZyxjciwgcnYpCSgocnYpID0gdmZzX3N5bmMoVkhFQUQodiksIGZsYWcsY3IpKQorI2RlZmluZSBWRlNfVkdFVCh2LCB2cHAsZmlkcCwgcnYpCSgocnYpID0gdmZzX3ZnZXQoVkhFQUQodiksIHZwcCxmaWRwKSkKKyNkZWZpbmUgVkZTX0RNQVBJT1BTKHYsIHAsIHJ2KQkJKChydikgPSB2ZnNfZG1hcGlvcHMoVkhFQUQodiksIHApKQorI2RlZmluZSBWRlNfUVVPVEFDVEwodiwgYyxpZCxwLCBydikJKChydikgPSB2ZnNfcXVvdGFjdGwoVkhFQUQodiksIGMsaWQscCkpCisjZGVmaW5lIFZGU19JTklUX1ZOT0RFKHYsIHZwLGIsdWwpCSggdmZzX2luaXRfdm5vZGUoVkhFQUQodiksIHZwLGIsdWwpICkKKyNkZWZpbmUgVkZTX0ZPUkNFX1NIVVRET1dOKHYsIGZsLGYsbCkJKCB2ZnNfZm9yY2Vfc2h1dGRvd24oVkhFQUQodiksIGZsLGYsbCkgKQorI2RlZmluZSBWRlNfRlJFRVpFKHYpCQkJKCB2ZnNfZnJlZXplKFZIRUFEKHYpKSApCisKKy8qCisgKiBQVkZTJ3MuICBPcGVyYXRlcyBvbiBiZWhhdmlvciBkZXNjcmlwdG9yIHBvaW50ZXJzLgorICovCisjZGVmaW5lIFBWRlNfTU9VTlQoYiwgbWEsY3IsIHJ2KQkoKHJ2KSA9IHZmc19tb3VudChiLCBtYSxjcikpCisjZGVmaW5lIFBWRlNfUEFSU0VBUkdTKGIsIG8sbWEsZiwgcnYpCSgocnYpID0gdmZzX3BhcnNlYXJncyhiLCBvLG1hLGYpKQorI2RlZmluZSBQVkZTX1NIT1dBUkdTKGIsIG0sIHJ2KQkJKChydikgPSB2ZnNfc2hvd2FyZ3MoYiwgbSkpCisjZGVmaW5lIFBWRlNfVU5NT1VOVChiLCBmLGNyLCBydikJKChydikgPSB2ZnNfdW5tb3VudChiLCBmLGNyKSkKKyNkZWZpbmUgUFZGU19NTlRVUERBVEUoYiwgZmwsIGFyZ3MsIHJ2KQkoKHJ2KSA9IHZmc19tbnR1cGRhdGUoYiwgZmwsIGFyZ3MpKQorI2RlZmluZSBQVkZTX1JPT1QoYiwgdnBwLCBydikJCSgocnYpID0gdmZzX3Jvb3QoYiwgdnBwKSkKKyNkZWZpbmUgUFZGU19TVEFUVkZTKGIsIHNwLHZwLCBydikJKChydikgPSB2ZnNfc3RhdHZmcyhiLCBzcCx2cCkpCisjZGVmaW5lIFBWRlNfU1lOQyhiLCBmbGFnLGNyLCBydikJKChydikgPSB2ZnNfc3luYyhiLCBmbGFnLGNyKSkKKyNkZWZpbmUgUFZGU19WR0VUKGIsIHZwcCxmaWRwLCBydikJKChydikgPSB2ZnNfdmdldChiLCB2cHAsZmlkcCkpCisjZGVmaW5lIFBWRlNfRE1BUElPUFMoYiwgcCwgcnYpCQkoKHJ2KSA9IHZmc19kbWFwaW9wcyhiLCBwKSkKKyNkZWZpbmUgUFZGU19RVU9UQUNUTChiLCBjLGlkLHAsIHJ2KQkoKHJ2KSA9IHZmc19xdW90YWN0bChiLCBjLGlkLHApKQorI2RlZmluZSBQVkZTX0lOSVRfVk5PREUoYiwgdnAsYjIsdWwpCSggdmZzX2luaXRfdm5vZGUoYiwgdnAsYjIsdWwpICkKKyNkZWZpbmUgUFZGU19GT1JDRV9TSFVURE9XTihiLCBmbCxmLGwpCSggdmZzX2ZvcmNlX3NodXRkb3duKGIsIGZsLGYsbCkgKQorI2RlZmluZSBQVkZTX0ZSRUVaRShiKQkJCSggdmZzX2ZyZWV6ZShiKSApCisKK2V4dGVybiBpbnQgdmZzX21vdW50KGJodl9kZXNjX3QgKiwgc3RydWN0IHhmc19tb3VudF9hcmdzICosIHN0cnVjdCBjcmVkICopOworZXh0ZXJuIGludCB2ZnNfcGFyc2VhcmdzKGJodl9kZXNjX3QgKiwgY2hhciAqLCBzdHJ1Y3QgeGZzX21vdW50X2FyZ3MgKiwgaW50KTsKK2V4dGVybiBpbnQgdmZzX3Nob3dhcmdzKGJodl9kZXNjX3QgKiwgc3RydWN0IHNlcV9maWxlICopOworZXh0ZXJuIGludCB2ZnNfdW5tb3VudChiaHZfZGVzY190ICosIGludCwgc3RydWN0IGNyZWQgKik7CitleHRlcm4gaW50IHZmc19tbnR1cGRhdGUoYmh2X2Rlc2NfdCAqLCBpbnQgKiwgc3RydWN0IHhmc19tb3VudF9hcmdzICopOworZXh0ZXJuIGludCB2ZnNfcm9vdChiaHZfZGVzY190ICosIHN0cnVjdCB2bm9kZSAqKik7CitleHRlcm4gaW50IHZmc19zdGF0dmZzKGJodl9kZXNjX3QgKiwgeGZzX3N0YXRmc190ICosIHN0cnVjdCB2bm9kZSAqKTsKK2V4dGVybiBpbnQgdmZzX3N5bmMoYmh2X2Rlc2NfdCAqLCBpbnQsIHN0cnVjdCBjcmVkICopOworZXh0ZXJuIGludCB2ZnNfdmdldChiaHZfZGVzY190ICosIHN0cnVjdCB2bm9kZSAqKiwgc3RydWN0IGZpZCAqKTsKK2V4dGVybiBpbnQgdmZzX2RtYXBpb3BzKGJodl9kZXNjX3QgKiwgY2FkZHJfdCk7CitleHRlcm4gaW50IHZmc19xdW90YWN0bChiaHZfZGVzY190ICosIGludCwgaW50LCBjYWRkcl90KTsKK2V4dGVybiB2b2lkIHZmc19pbml0X3Zub2RlKGJodl9kZXNjX3QgKiwgc3RydWN0IHZub2RlICosIGJodl9kZXNjX3QgKiwgaW50KTsKK2V4dGVybiB2b2lkIHZmc19mb3JjZV9zaHV0ZG93bihiaHZfZGVzY190ICosIGludCwgY2hhciAqLCBpbnQpOworZXh0ZXJuIHZvaWQgdmZzX2ZyZWV6ZShiaHZfZGVzY190ICopOworCit0eXBlZGVmIHN0cnVjdCBiaHZfdmZzb3BzIHsKKwlzdHJ1Y3QgdmZzb3BzCQliaHZfY29tbW9uOworCXZvaWQgKgkJCWJodl9jdXN0b207Cit9IGJodl92ZnNvcHNfdDsKKworI2RlZmluZSB2ZnNfYmh2X2xvb2t1cCh2LCBpZCkJKCBiaHZfbG9va3VwX3JhbmdlKCYodiktPnZmc19iaCwgKGlkKSwgKGlkKSkgKQorI2RlZmluZSB2ZnNfYmh2X2N1c3RvbShiKQkoICgoYmh2X3Zmc29wc190ICopQkhWX09QUyhiKSktPmJodl9jdXN0b20gKQorI2RlZmluZSB2ZnNfYmh2X3NldF9jdXN0b20oYixvKQkoIChiKS0+Ymh2X2N1c3RvbSA9ICh2b2lkICopKG8pKQorI2RlZmluZSB2ZnNfYmh2X2Nscl9jdXN0b20oYikJKCAoYiktPmJodl9jdXN0b20gPSBOVUxMICkKKworZXh0ZXJuIHZmc190ICp2ZnNfYWxsb2NhdGUodm9pZCk7CitleHRlcm4gdm9pZCB2ZnNfZGVhbGxvY2F0ZSh2ZnNfdCAqKTsKK2V4dGVybiB2b2lkIHZmc19pbnNlcnRvcHModmZzX3QgKiwgYmh2X3Zmc29wc190ICopOworZXh0ZXJuIHZvaWQgdmZzX2luc2VydGJodih2ZnNfdCAqLCBiaHZfZGVzY190ICosIHZmc29wc190ICosIHZvaWQgKik7CisKK2V4dGVybiB2b2lkIGJodl9pbnNlcnRfYWxsX3Zmc29wcyhzdHJ1Y3QgdmZzICopOworZXh0ZXJuIHZvaWQgYmh2X3JlbW92ZV9hbGxfdmZzb3BzKHN0cnVjdCB2ZnMgKiwgaW50KTsKK2V4dGVybiB2b2lkIGJodl9yZW1vdmVfdmZzb3BzKHN0cnVjdCB2ZnMgKiwgaW50KTsKKworI2RlZmluZSBmc19mcm96ZW4odmZzcCkJCSgodmZzcCktPnZmc19zdXBlci0+c19mcm96ZW4pCisjZGVmaW5lIGZzX2NoZWNrX2Zyb3plbih2ZnNwLCBsZXZlbCkgXAorCXZmc19jaGVja19mcm96ZW4odmZzcC0+dmZzX3N1cGVyLCBsZXZlbCk7CisKKyNlbmRpZgkvKiBfX1hGU19WRlNfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDljNjFjCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuYwpAQCAtMCwwICsxLDQ1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorCisKK3VpbnQ2NF90IHZuX2dlbmVyYXRpb247CQkvKiB2bm9kZSBnZW5lcmF0aW9uIG51bWJlciAqLworREVGSU5FX1NQSU5MT0NLKHZudW1iZXJfbG9jayk7CisKKy8qCisgKiBEZWRpY2F0ZWQgdm5vZGUgaW5hY3RpdmUvcmVjbGFpbSBzeW5jIHNlbWFwaG9yZXMuCisgKiBQcmltZSBudW1iZXIgb2YgaGFzaCBidWNrZXRzIHNpbmNlIGFkZHJlc3MgaXMgdXNlZCBhcyB0aGUga2V5LgorICovCisjZGVmaW5lIE5WU1lOQyAgICAgICAgICAgICAgICAgIDM3CisjZGVmaW5lIHZwdG9zeW5jKHYpICAgICAgICAgICAgICgmdnN5bmNbKCh1bnNpZ25lZCBsb25nKXYpICUgTlZTWU5DXSkKK3N2X3QgdnN5bmNbTlZTWU5DXTsKKworLyoKKyAqIFRyYW5zbGF0ZSBzdGF0KDIpIGZpbGUgdHlwZXMgdG8gdm5vZGUgdHlwZXMgYW5kIHZpY2UgdmVyc2EuCisgKiBBd2FyZSBvZiBudW1lcmljIG9yZGVyIG9mIFNfSUZNVCBhbmQgdm5vZGUgdHlwZSB2YWx1ZXMuCisgKi8KK2VudW0gdnR5cGUgaWZ0b3Z0X3RhYltdID0geworCVZOT04sIFZGSUZPLCBWQ0hSLCBWTk9OLCBWRElSLCBWTk9OLCBWQkxLLCBWTk9OLAorCVZSRUcsIFZOT04sIFZMTkssIFZOT04sIFZTT0NLLCBWTk9OLCBWTk9OLCBWTk9OCit9OworCit1X3Nob3J0IHZ0dG9pZl90YWJbXSA9IHsKKwkwLCBTX0lGUkVHLCBTX0lGRElSLCBTX0lGQkxLLCBTX0lGQ0hSLCBTX0lGTE5LLCBTX0lGSUZPLCAwLCBTX0lGU09DSworfTsKKworCit2b2lkCit2bl9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXIgc3ZfdCAqc3ZwOworCXJlZ2lzdGVyIGludCBpOworCisJZm9yIChzdnAgPSB2c3luYywgaSA9IDA7IGkgPCBOVlNZTkM7IGkrKywgc3ZwKyspCisJCWluaXRfc3Yoc3ZwLCBTVl9ERUZBVUxULCAidnN5IiwgaSk7Cit9CisKKy8qCisgKiBDbGVhbiBhIHZub2RlIG9mIGZpbGVzeXN0ZW0tc3BlY2lmaWMgZGF0YSBhbmQgcHJlcGFyZSBpdCBmb3IgcmV1c2UuCisgKi8KK1NUQVRJQyBpbnQKK3ZuX3JlY2xhaW0oCisJc3RydWN0IHZub2RlCSp2cCkKK3sKKwlpbnQJCWVycm9yOworCisJWEZTX1NUQVRTX0lOQyh2bl9yZWNsYWltKTsKKwl2bl90cmFjZV9lbnRyeSh2cCwgInZuX3JlY2xhaW0iLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwkvKgorCSAqIE9ubHkgbWFrZSB0aGUgVk9QX1JFQ0xBSU0gY2FsbCBpZiB0aGVyZSBhcmUgYmVoYXZpb3JzCisJICogdG8gY2FsbC4KKwkgKi8KKwlpZiAodnAtPnZfZmJodikgeworCQlWT1BfUkVDTEFJTSh2cCwgZXJyb3IpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gLWVycm9yOworCX0KKwlBU1NFUlQodnAtPnZfZmJodiA9PSBOVUxMKTsKKworCVZOX0xPQ0sodnApOworCXZwLT52X2ZsYWcgJj0gKFZSRUNMTXxWV0FJVCk7CisJVk5fVU5MT0NLKHZwLCAwKTsKKworCXZwLT52X3R5cGUgPSBWTk9OOworCXZwLT52X2ZiaHYgPSBOVUxMOworCisjaWZkZWYgWEZTX1ZOT0RFX1RSQUNFCisJa3RyYWNlX2ZyZWUodnAtPnZfdHJhY2UpOworCXZwLT52X3RyYWNlID0gTlVMTDsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyB2b2lkCit2bl93YWtldXAoCisJc3RydWN0IHZub2RlCSp2cCkKK3sKKwlWTl9MT0NLKHZwKTsKKwlpZiAodnAtPnZfZmxhZyAmIFZXQUlUKQorCQlzdl9icm9hZGNhc3QodnB0b3N5bmModnApKTsKKwl2cC0+dl9mbGFnICY9IH4oVlJFQ0xNfFZXQUlUfFZNT0RJRklFRCk7CisJVk5fVU5MT0NLKHZwLCAwKTsKK30KKworaW50Cit2bl93YWl0KAorCXN0cnVjdCB2bm9kZQkqdnApCit7CisJVk5fTE9DSyh2cCk7CisJaWYgKHZwLT52X2ZsYWcgJiAoVklOQUNUIHwgVlJFQ0xNKSkgeworCQl2cC0+dl9mbGFnIHw9IFZXQUlUOworCQlzdl93YWl0KHZwdG9zeW5jKHZwKSwgUElOT0QsICZ2cC0+dl9sb2NrLCAwKTsKKwkJcmV0dXJuIDE7CisJfQorCVZOX1VOTE9DSyh2cCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB2bm9kZSAqCit2bl9pbml0aWFsaXplKAorCXN0cnVjdCBpbm9kZQkqaW5vZGUpCit7CisJc3RydWN0IHZub2RlCSp2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOworCisJWEZTX1NUQVRTX0lOQyh2bl9hY3RpdmUpOworCVhGU19TVEFUU19JTkModm5fYWxsb2MpOworCisJdnAtPnZfZmxhZyA9IFZNT0RJRklFRDsKKwlzcGlubG9ja19pbml0KCZ2cC0+dl9sb2NrLCAidl9sb2NrIik7CisKKwlzcGluX2xvY2soJnZudW1iZXJfbG9jayk7CisJaWYgKCErK3ZuX2dlbmVyYXRpb24pCS8qIHZfbnVtYmVyIHNob3VsZG4ndCBiZSB6ZXJvICovCisJCXZuX2dlbmVyYXRpb24rKzsKKwl2cC0+dl9udW1iZXIgPSB2bl9nZW5lcmF0aW9uOworCXNwaW5fdW5sb2NrKCZ2bnVtYmVyX2xvY2spOworCisJQVNTRVJUKFZOX0NBQ0hFRCh2cCkgPT0gMCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBmaXJzdCBiZWhhdmlvciBhbmQgdGhlIGJlaGF2aW9yIGNoYWluIGhlYWQuICovCisJdm5fYmh2X2hlYWRfaW5pdChWTl9CSFZfSEVBRCh2cCksICJ2bm9kZSIpOworCisjaWZkZWYJWEZTX1ZOT0RFX1RSQUNFCisJdnAtPnZfdHJhY2UgPSBrdHJhY2VfYWxsb2MoVk5PREVfVFJBQ0VfU0laRSwgS01fU0xFRVApOworCXByaW50aygiQWxsb2NhdGVkIFZOT0RFX1RSQUNFIGF0IDB4JXBcbiIsIHZwLT52X3RyYWNlKTsKKyNlbmRpZgkvKiBYRlNfVk5PREVfVFJBQ0UgKi8KKworCXZuX3RyYWNlX2V4aXQodnAsICJ2bl9pbml0aWFsaXplIiwgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCXJldHVybiB2cDsKK30KKworLyoKKyAqIEdldCBhIHJlZmVyZW5jZSBvbiBhIHZub2RlLgorICovCit2bm9kZV90ICoKK3ZuX2dldCgKKwlzdHJ1Y3Qgdm5vZGUJKnZwLAorCXZtYXBfdAkJKnZtYXApCit7CisJc3RydWN0IGlub2RlCSppbm9kZTsKKworCVhGU19TVEFUU19JTkModm5fZ2V0KTsKKwlpbm9kZSA9IExJTlZGU19HRVRfSVAodnApOworCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfRlJFRUlORykKKwkJcmV0dXJuIE5VTEw7CisKKwlpbm9kZSA9IGlsb29rdXAodm1hcC0+dl92ZnNwLT52ZnNfc3VwZXIsIHZtYXAtPnZfaW5vKTsKKwlpZiAoIWlub2RlKQkvKiBJbm9kZSBub3QgcHJlc2VudCAqLworCQlyZXR1cm4gTlVMTDsKKworCXZuX3RyYWNlX2V4aXQodnAsICJ2bl9nZXQiLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwlyZXR1cm4gdnA7Cit9CisKKy8qCisgKiBSZXZhbGlkYXRlIHRoZSBMaW51eCBpbm9kZSBmcm9tIHRoZSB2YXR0ci4KKyAqIE5vdGU6IGlfc2l6ZSBfbm90XyB1cGRhdGVkOyB3ZSBtdXN0IGhvbGQgdGhlIGlub2RlCisgKiBzZW1hcGhvcmUgd2hlbiBkb2luZyB0aGF0IC0gY2FsbGVycyByZXNwb25zaWJpbGl0eS4KKyAqLwordm9pZAordm5fcmV2YWxpZGF0ZV9jb3JlKAorCXN0cnVjdCB2bm9kZQkqdnAsCisJdmF0dHJfdAkJKnZhcCkKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gTElOVkZTX0dFVF9JUCh2cCk7CisKKwlpbm9kZS0+aV9tb2RlCSAgICA9IFZUVE9JRih2YXAtPnZhX3R5cGUpIHwgdmFwLT52YV9tb2RlOworCWlub2RlLT5pX25saW5rCSAgICA9IHZhcC0+dmFfbmxpbms7CisJaW5vZGUtPmlfdWlkCSAgICA9IHZhcC0+dmFfdWlkOworCWlub2RlLT5pX2dpZAkgICAgPSB2YXAtPnZhX2dpZDsKKwlpbm9kZS0+aV9ibG9ja3MJICAgID0gdmFwLT52YV9uYmxvY2tzOworCWlub2RlLT5pX210aW1lCSAgICA9IHZhcC0+dmFfbXRpbWU7CisJaW5vZGUtPmlfY3RpbWUJICAgID0gdmFwLT52YV9jdGltZTsKKwlpbm9kZS0+aV9hdGltZQkgICAgPSB2YXAtPnZhX2F0aW1lOworCWlmICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19JTU1VVEFCTEUpCisJCWlub2RlLT5pX2ZsYWdzIHw9IFNfSU1NVVRBQkxFOworCWVsc2UKKwkJaW5vZGUtPmlfZmxhZ3MgJj0gflNfSU1NVVRBQkxFOworCWlmICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19BUFBFTkQpCisJCWlub2RlLT5pX2ZsYWdzIHw9IFNfQVBQRU5EOworCWVsc2UKKwkJaW5vZGUtPmlfZmxhZ3MgJj0gflNfQVBQRU5EOworCWlmICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19TWU5DKQorCQlpbm9kZS0+aV9mbGFncyB8PSBTX1NZTkM7CisJZWxzZQorCQlpbm9kZS0+aV9mbGFncyAmPSB+U19TWU5DOworCWlmICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19OT0FUSU1FKQorCQlpbm9kZS0+aV9mbGFncyB8PSBTX05PQVRJTUU7CisJZWxzZQorCQlpbm9kZS0+aV9mbGFncyAmPSB+U19OT0FUSU1FOworfQorCisvKgorICogUmV2YWxpZGF0ZSB0aGUgTGludXggaW5vZGUgZnJvbSB0aGUgdm5vZGUuCisgKi8KK2ludAordm5fcmV2YWxpZGF0ZSgKKwlzdHJ1Y3Qgdm5vZGUJKnZwKQoreworCXZhdHRyX3QJCXZhOworCWludAkJZXJyb3I7CisKKwl2bl90cmFjZV9lbnRyeSh2cCwgInZuX3JldmFsaWRhdGUiLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisJQVNTRVJUKHZwLT52X2ZiaHYgIT0gTlVMTCk7CisKKwl2YS52YV9tYXNrID0gWEZTX0FUX1NUQVR8WEZTX0FUX1hGTEFHUzsKKwlWT1BfR0VUQVRUUih2cCwgJnZhLCAwLCBOVUxMLCBlcnJvcik7CisJaWYgKCFlcnJvcikgeworCQl2bl9yZXZhbGlkYXRlX2NvcmUodnAsICZ2YSk7CisJCVZVTk1PRElGWSh2cCk7CisJfQorCXJldHVybiAtZXJyb3I7Cit9CisKKy8qCisgKiBwdXJnZSBhIHZub2RlIGZyb20gdGhlIGNhY2hlCisgKiBBdCB0aGlzIHBvaW50IHRoZSB2bm9kZSBpcyBndWFyYW50ZWVkIHRvIGhhdmUgbm8gcmVmZXJlbmNlcyAodm5fY291bnQgPT0gMCkKKyAqIFRoZSBjYWxsZXIgaGFzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGFyZSBubyB3YXlzIHNvbWVvbmUgY291bGQKKyAqIGdldCBhIGhhbmRsZSAodmlhIHZuX2dldCkgb24gdGhlIHZub2RlICh1c3VhbGx5IGRvbmUgdmlhIGEgbW91bnQvdmZzIGxvY2spLgorICovCit2b2lkCit2bl9wdXJnZSgKKwlzdHJ1Y3Qgdm5vZGUJKnZwLAorCXZtYXBfdAkJKnZtYXApCit7CisJdm5fdHJhY2VfZW50cnkodnAsICJ2bl9wdXJnZSIsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKworYWdhaW46CisJLyoKKwkgKiBDaGVjayB3aGV0aGVyIHZwIGhhcyBhbHJlYWR5IGJlZW4gcmVjbGFpbWVkIHNpbmNlIG91ciBjYWxsZXIKKwkgKiBzYW1wbGVkIGl0cyB2ZXJzaW9uIHdoaWxlIGhvbGRpbmcgYSBmaWxlc3lzdGVtIGNhY2hlIGxvY2sgdGhhdAorCSAqIGl0cyBWT1BfUkVDTEFJTSBmdW5jdGlvbiBhY3F1aXJlcy4KKwkgKi8KKwlWTl9MT0NLKHZwKTsKKwlpZiAodnAtPnZfbnVtYmVyICE9IHZtYXAtPnZfbnVtYmVyKSB7CisJCVZOX1VOTE9DSyh2cCwgMCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIElmIHZwIGlzIGJlaW5nIHJlY2xhaW1lZCBvciBpbmFjdGl2YXRlZCwgd2FpdCB1bnRpbCBpdCBpcyBpbmVydCwKKwkgKiB0aGVuIHByb2NlZWQuICBDYW4ndCBhc3N1bWUgdGhhdCB2bm9kZSBpcyBhY3R1YWxseSByZWNsYWltZWQKKwkgKiBqdXN0IGJlY2F1c2UgdGhlIHJlY2xhaW1lZCBmbGFnIGlzIGFzc2VydGVkIC0tIGEgdm5fYWxsb2MKKwkgKiByZWNsYWltIGNhbiBmYWlsLgorCSAqLworCWlmICh2cC0+dl9mbGFnICYgKFZJTkFDVCB8IFZSRUNMTSkpIHsKKwkJQVNTRVJUKHZuX2NvdW50KHZwKSA9PSAwKTsKKwkJdnAtPnZfZmxhZyB8PSBWV0FJVDsKKwkJc3Zfd2FpdCh2cHRvc3luYyh2cCksIFBJTk9ELCAmdnAtPnZfbG9jaywgMCk7CisJCWdvdG8gYWdhaW47CisJfQorCisJLyoKKwkgKiBBbm90aGVyIHByb2Nlc3MgY291bGQgaGF2ZSByYWNlZCBpbiBhbmQgZ290dGVuIHRoaXMgdm5vZGUuLi4KKwkgKi8KKwlpZiAodm5fY291bnQodnApID4gMCkgeworCQlWTl9VTkxPQ0sodnAsIDApOworCQlyZXR1cm47CisJfQorCisJWEZTX1NUQVRTX0RFQyh2bl9hY3RpdmUpOworCXZwLT52X2ZsYWcgfD0gVlJFQ0xNOworCVZOX1VOTE9DSyh2cCwgMCk7CisKKwkvKgorCSAqIENhbGwgVk9QX1JFQ0xBSU0gYW5kIGNsZWFuIHZwLiBUaGUgRlNZTkNfSU5WQUwgZmxhZyB0ZWxscworCSAqIHZwJ3MgZmlsZXN5c3RlbSB0byBmbHVzaCBhbmQgaW52YWxpZGF0ZSBhbGwgY2FjaGVkIHJlc291cmNlcy4KKwkgKiBXaGVuIHZuX3JlY2xhaW0gcmV0dXJucywgdnAgc2hvdWxkIGhhdmUgbm8gcHJpdmF0ZSBkYXRhLAorCSAqIGVpdGhlciBpbiBhIHN5c3RlbSBjYWNoZSBvciBhdHRhY2hlZCB0byB2X2RhdGEuCisJICovCisJaWYgKHZuX3JlY2xhaW0odnApICE9IDApCisJCXBhbmljKCJ2bl9wdXJnZTogY2Fubm90IHJlY2xhaW0iKTsKKworCS8qCisJICogV2FrZXVwIGFueW9uZSB3YWl0aW5nIGZvciB2cCB0byBiZSByZWNsYWltZWQuCisJICovCisJdm5fd2FrZXVwKHZwKTsKK30KKworLyoKKyAqIEFkZCBhIHJlZmVyZW5jZSB0byBhIHJlZmVyZW5jZWQgdm5vZGUuCisgKi8KK3N0cnVjdCB2bm9kZSAqCit2bl9ob2xkKAorCXN0cnVjdCB2bm9kZQkqdnApCit7CisJc3RydWN0IGlub2RlCSppbm9kZTsKKworCVhGU19TVEFUU19JTkModm5faG9sZCk7CisKKwlWTl9MT0NLKHZwKTsKKwlpbm9kZSA9IGlncmFiKExJTlZGU19HRVRfSVAodnApKTsKKwlBU1NFUlQoaW5vZGUpOworCVZOX1VOTE9DSyh2cCwgMCk7CisKKwlyZXR1cm4gdnA7Cit9CisKKy8qCisgKiAgQ2FsbCBWT1BfSU5BQ1RJVkUgb24gbGFzdCByZWZlcmVuY2UuCisgKi8KK3ZvaWQKK3ZuX3JlbGUoCisJc3RydWN0IHZub2RlCSp2cCkKK3sKKwlpbnQJCXZjbnQ7CisJaW50CQljYWNoZTsKKworCVhGU19TVEFUU19JTkModm5fcmVsZSk7CisKKwlWTl9MT0NLKHZwKTsKKworCXZuX3RyYWNlX2VudHJ5KHZwLCAidm5fcmVsZSIsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwl2Y250ID0gdm5fY291bnQodnApOworCisJLyoKKwkgKiBTaW5jZSB3ZSBhbHdheXMgZ2V0IGNhbGxlZCBmcm9tIHB1dF9pbm9kZSB3ZSBrbm93CisJICogdGhhdCBpX2NvdW50IHdvbid0IGJlIGRlY3JlbWVudGVkIGFmdGVyIHdlCisJICogcmV0dXJuLgorCSAqLworCWlmICghdmNudCkgeworCQkvKgorCQkgKiBBcyBzb29uIGFzIHdlIHR1cm4gdGhpcyBvbiwgbm9vbmUgY2FuIGZpbmQgdXMgaW4gdm5fZ2V0CisJCSAqIHVudGlsIHdlIHR1cm4gb2ZmIFZJTkFDVCBvciBWUkVDTE0KKwkJICovCisJCXZwLT52X2ZsYWcgfD0gVklOQUNUOworCQlWTl9VTkxPQ0sodnAsIDApOworCisJCS8qCisJCSAqIERvIG5vdCBtYWtlIHRoZSBWT1BfSU5BQ1RJVkUgY2FsbCBpZiB0aGVyZQorCQkgKiBhcmUgbm8gYmVoYXZpb3JzIGF0dGFjaGVkIHRvIHRoZSB2bm9kZSB0byBjYWxsLgorCQkgKi8KKwkJaWYgKHZwLT52X2ZiaHYpCisJCQlWT1BfSU5BQ1RJVkUodnAsIE5VTEwsIGNhY2hlKTsKKworCQlWTl9MT0NLKHZwKTsKKwkJaWYgKHZwLT52X2ZsYWcgJiBWV0FJVCkKKwkJCXN2X2Jyb2FkY2FzdCh2cHRvc3luYyh2cCkpOworCisJCXZwLT52X2ZsYWcgJj0gfihWSU5BQ1R8VldBSVR8VlJFQ0xNfFZNT0RJRklFRCk7CisJfQorCisJVk5fVU5MT0NLKHZwLCAwKTsKKworCXZuX3RyYWNlX2V4aXQodnAsICJ2bl9yZWxlIiwgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworfQorCisvKgorICogRmluaXNoIHRoZSByZW1vdmFsIG9mIGEgdm5vZGUuCisgKi8KK3ZvaWQKK3ZuX3JlbW92ZSgKKwlzdHJ1Y3Qgdm5vZGUJKnZwKQoreworCXZtYXBfdAkJdm1hcDsKKworCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBkbyB0aGlzIHRvIHRoZSBzYW1lIHZub2RlIHR3aWNlICovCisJaWYgKCEodnAtPnZfZmJodikpCisJCXJldHVybjsKKworCVhGU19TVEFUU19JTkModm5fcmVtb3ZlKTsKKwl2bl90cmFjZV9leGl0KHZwLCAidm5fcmVtb3ZlIiwgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCisJLyoKKwkgKiBBZnRlciB0aGUgZm9sbG93aW5nIHB1cmdlIHRoZSB2bm9kZQorCSAqIHdpbGwgbm8gbG9uZ2VyIGV4aXN0LgorCSAqLworCVZNQVAodnAsIHZtYXApOworCXZuX3B1cmdlKHZwLCAmdm1hcCk7Cit9CisKKworI2lmZGVmCVhGU19WTk9ERV9UUkFDRQorCisjZGVmaW5lIEtUUkFDRV9FTlRFUih2cCwgdmssIHMsIGxpbmUsIHJhKQkJCVwKKwlrdHJhY2VfZW50ZXIoCSh2cCktPnZfdHJhY2UsCQkJCVwKKy8qICAwICovCQkodm9pZCAqKShfX3BzaW50X3QpKHZrKSwJCVwKKy8qICAxICovCQkodm9pZCAqKShzKSwJCQkJXAorLyogIDIgKi8JCSh2b2lkICopKF9fcHNpbnRfdCkgbGluZSwJCVwKKy8qICAzICovCQkodm9pZCAqKSh2bl9jb3VudCh2cCkpLCBcCisvKiAgNCAqLwkJKHZvaWQgKikocmEpLAkJCQlcCisvKiAgNSAqLwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpKHZwKS0+dl9mbGFnLAlcCisvKiAgNiAqLwkJKHZvaWQgKikoX19wc2ludF90KWN1cnJlbnRfY3B1KCksCVwKKy8qICA3ICovCQkodm9pZCAqKShfX3BzaW50X3QpY3VycmVudF9waWQoKSwJXAorLyogIDggKi8JCSh2b2lkICopX19yZXR1cm5fYWRkcmVzcywJCVwKKy8qICA5ICovCQkwLCAwLCAwLCAwLCAwLCAwLCAwKQorCisvKgorICogVm5vZGUgdHJhY2luZyBjb2RlLgorICovCit2b2lkCit2bl90cmFjZV9lbnRyeSh2bm9kZV90ICp2cCwgY2hhciAqZnVuYywgaW5zdF90ICpyYSkKK3sKKwlLVFJBQ0VfRU5URVIodnAsIFZOT0RFX0tUUkFDRV9FTlRSWSwgZnVuYywgMCwgcmEpOworfQorCit2b2lkCit2bl90cmFjZV9leGl0KHZub2RlX3QgKnZwLCBjaGFyICpmdW5jLCBpbnN0X3QgKnJhKQoreworCUtUUkFDRV9FTlRFUih2cCwgVk5PREVfS1RSQUNFX0VYSVQsIGZ1bmMsIDAsIHJhKTsKK30KKwordm9pZAordm5fdHJhY2VfaG9sZCh2bm9kZV90ICp2cCwgY2hhciAqZmlsZSwgaW50IGxpbmUsIGluc3RfdCAqcmEpCit7CisJS1RSQUNFX0VOVEVSKHZwLCBWTk9ERV9LVFJBQ0VfSE9MRCwgZmlsZSwgbGluZSwgcmEpOworfQorCit2b2lkCit2bl90cmFjZV9yZWYodm5vZGVfdCAqdnAsIGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnN0X3QgKnJhKQoreworCUtUUkFDRV9FTlRFUih2cCwgVk5PREVfS1RSQUNFX1JFRiwgZmlsZSwgbGluZSwgcmEpOworfQorCit2b2lkCit2bl90cmFjZV9yZWxlKHZub2RlX3QgKnZwLCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW5zdF90ICpyYSkKK3sKKwlLVFJBQ0VfRU5URVIodnAsIFZOT0RFX0tUUkFDRV9SRUxFLCBmaWxlLCBsaW5lLCByYSk7Cit9CisjZW5kaWYJLyogWEZTX1ZOT0RFX1RSQUNFICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTc2YzFmCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuaApAQCAtMCwwICsxLDY2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgX19YRlNfVk5PREVfSF9fCisjZGVmaW5lIF9fWEZTX1ZOT0RFX0hfXworCitzdHJ1Y3QgdWlvOworc3RydWN0IGZpbGU7CitzdHJ1Y3QgdmF0dHI7CitzdHJ1Y3QgeGZzX2lvbWFwOworc3RydWN0IGF0dHJsaXN0X2N1cnNvcl9rZXJuOworCisvKgorICogVm5vZGUgdHlwZXMuICBWTk9OIG1lYW5zIG5vIHR5cGUuCisgKi8KK2VudW0gdnR5cGUJeyBWTk9OLCBWUkVHLCBWRElSLCBWQkxLLCBWQ0hSLCBWTE5LLCBWRklGTywgVkJBRCwgVlNPQ0sgfTsKKwordHlwZWRlZiB4ZnNfaW5vX3Qgdm51bWJlcl90OwordHlwZWRlZiBzdHJ1Y3QgZGVudHJ5IHZuYW1lX3Q7Cit0eXBlZGVmIGJodl9oZWFkX3Qgdm5fYmh2X2hlYWRfdDsKKworLyoKKyAqIE1QIGxvY2tpbmcgcHJvdG9jb2xzOgorICoJdl9mbGFnLCB2X3Zmc3AJCQkJVk5fTE9DSy9WTl9VTkxPQ0sKKyAqCXZfdHlwZQkJCQkJcmVhZC1vbmx5IG9yIGZzLWRlcGVuZGVudAorICovCit0eXBlZGVmIHN0cnVjdCB2bm9kZSB7CisJX191MzIJCXZfZmxhZzsJCQkvKiB2bm9kZSBmbGFncyAoc2VlIGJlbG93KSAqLworCWVudW0gdnR5cGUJdl90eXBlOwkJCS8qIHZub2RlIHR5cGUgKi8KKwlzdHJ1Y3QgdmZzCSp2X3Zmc3A7CQkvKiBwdHIgdG8gY29udGFpbmluZyBWRlMgKi8KKwl2bnVtYmVyX3QJdl9udW1iZXI7CQkvKiBpbi1jb3JlIHZub2RlIG51bWJlciAqLworCXZuX2Jodl9oZWFkX3QJdl9iaDsJCQkvKiBiZWhhdmlvciBoZWFkICovCisJc3BpbmxvY2tfdAl2X2xvY2s7CQkJLyogVk5fTE9DSy9WTl9VTkxPQ0sgKi8KKwlzdHJ1Y3QgaW5vZGUJdl9pbm9kZTsJCS8qIExpbnV4IGlub2RlICovCisjaWZkZWYgWEZTX1ZOT0RFX1RSQUNFCisJc3RydWN0IGt0cmFjZQkqdl90cmFjZTsJCS8qIHRyYWNlIGhlYWRlciBzdHJ1Y3R1cmUgICAgKi8KKyNlbmRpZgorfSB2bm9kZV90OworCisjZGVmaW5lIHZfZmJodgkJCXZfYmguYmhfZmlyc3QJICAgICAgIC8qIGZpcnN0IGJlaGF2aW9yICovCisjZGVmaW5lIHZfZm9wcwkJCXZfYmguYmhfZmlyc3QtPmJkX29wcyAgLyogZmlyc3QgYmVoYXZpb3Igb3BzICovCisKKyNkZWZpbmUgVk5PREVfUE9TSVRJT05fQkFTRQlCSFZfUE9TSVRJT05fQkFTRQkvKiBjaGFpbiBib3R0b20gKi8KKyNkZWZpbmUgVk5PREVfUE9TSVRJT05fVE9QCUJIVl9QT1NJVElPTl9UT1AJLyogY2hhaW4gdG9wICovCisjZGVmaW5lIFZOT0RFX1BPU0lUSU9OX0lOVkFMSUQJQkhWX1BPU0lUSU9OX0lOVkFMSUQJLyogaW52YWxpZCBwb3MuIG51bSAqLworCit0eXBlZGVmIGVudW0geworCVZOX0JIVl9VTktOT1dOLAkJLyogbm90IHNwZWNpZmllZCAqLworCVZOX0JIVl9YRlMsCQkvKiB4ZnMgKi8KKwlWTl9CSFZfRE0sCQkvKiBkYXRhIG1pZ3JhdGlvbiAqLworCVZOX0JIVl9RTSwJCS8qIHF1b3RhIG1hbmFnZXIgKi8KKwlWTl9CSFZfSU8sCQkvKiBJTyBwYXRoICovCisJVk5fQkhWX0VORAkJLyogaG91c2VrZWVwaW5nIGVuZC1vZi1yYW5nZSAqLworfSB2bl9iaHZfdDsKKworI2RlZmluZSBWTk9ERV9QT1NJVElPTl9YRlMJKFZOT0RFX1BPU0lUSU9OX0JBU0UpCisjZGVmaW5lIFZOT0RFX1BPU0lUSU9OX0RNCShWTk9ERV9QT1NJVElPTl9CQVNFKzEwKQorI2RlZmluZSBWTk9ERV9QT1NJVElPTl9RTQkoVk5PREVfUE9TSVRJT05fQkFTRSsyMCkKKyNkZWZpbmUgVk5PREVfUE9TSVRJT05fSU8JKFZOT0RFX1BPU0lUSU9OX0JBU0UrMzApCisKKy8qCisgKiBNYWNyb3MgZm9yIGRlYWxpbmcgd2l0aCB0aGUgYmVoYXZpb3IgZGVzY3JpcHRvciBpbnNpZGUgb2YgdGhlIHZub2RlLgorICovCisjZGVmaW5lIEJIVl9UT19WTk9ERShiZHApCSgodm5vZGVfdCAqKUJIVl9WT0JKKGJkcCkpCisjZGVmaW5lIEJIVl9UT19WTk9ERV9OVUxMKGJkcCkJKCh2bm9kZV90ICopQkhWX1ZPQkpOVUxMKGJkcCkpCisKKyNkZWZpbmUgVk5fQkhWX0hFQUQodnApCQkJKChiaHZfaGVhZF90ICopKCYoKHZwKS0+dl9iaCkpKQorI2RlZmluZSB2bl9iaHZfaGVhZF9pbml0KGJocCxuYW1lKQliaHZfaGVhZF9pbml0KGJocCxuYW1lKQorI2RlZmluZSB2bl9iaHZfcmVtb3ZlKGJocCxiZHApCQliaHZfcmVtb3ZlKGJocCxiZHApCisjZGVmaW5lIHZuX2Jodl9sb29rdXAoYmhwLG9wcykJCWJodl9sb29rdXAoYmhwLG9wcykKKyNkZWZpbmUgdm5fYmh2X2xvb2t1cF91bmxvY2tlZChiaHAsb3BzKSBiaHZfbG9va3VwX3VubG9ja2VkKGJocCxvcHMpCisKKy8qCisgKiBWbm9kZSB0byBMaW51eCBpbm9kZSBtYXBwaW5nLgorICovCisjZGVmaW5lIExJTlZGU19HRVRfVlAoaW5vZGUpCSgodm5vZGVfdCAqKWxpc3RfZW50cnkoaW5vZGUsIHZub2RlX3QsIHZfaW5vZGUpKQorI2RlZmluZSBMSU5WRlNfR0VUX0lQKHZwKQkoJih2cCktPnZfaW5vZGUpCisKKy8qCisgKiBDb252ZXJ0IGJldHdlZW4gdm5vZGUgdHlwZXMgYW5kIGlub2RlIGZvcm1hdHMgKHNpbmNlIFBPU0lYLjEKKyAqIGRlZmluZXMgbW9kZSB3b3JkIG9mIHN0YXQgc3RydWN0dXJlIGluIHRlcm1zIG9mIGlub2RlIGZvcm1hdHMpLgorICovCitleHRlcm4gZW51bSB2dHlwZQlpZnRvdnRfdGFiW107CitleHRlcm4gdV9zaG9ydAkJdnR0b2lmX3RhYltdOworI2RlZmluZSBJRlRPVlQobW9kZSkJKGlmdG92dF90YWJbKChtb2RlKSAmIFNfSUZNVCkgPj4gMTJdKQorI2RlZmluZSBWVFRPSUYoaW5keCkJKHZ0dG9pZl90YWJbKGludCkoaW5keCldKQorI2RlZmluZSBNQUtFSU1PREUoaW5keCwgbW9kZSkJKGludCkoVlRUT0lGKGluZHgpIHwgKG1vZGUpKQorCisKKy8qCisgKiBWbm9kZSBmbGFncy4KKyAqLworI2RlZmluZSBWSU5BQ1QJCSAgICAgICAweDEJLyogdm5vZGUgaXMgYmVpbmcgaW5hY3RpdmF0ZWQJKi8KKyNkZWZpbmUgVlJFQ0xNCQkgICAgICAgMHgyCS8qIHZub2RlIGlzIGJlaW5nIHJlY2xhaW1lZAkqLworI2RlZmluZSBWV0FJVAkJICAgICAgIDB4NAkvKiB3YWl0aW5nIGZvciBWSU5BQ1QvVlJFQ0xNIHRvIGVuZCAqLworI2RlZmluZSBWTU9ESUZJRUQJICAgICAgIDB4OAkvKiBYRlMgaW5vZGUgc3RhdGUgcG9zc2libHkgZGlmZmVycyAqLworCQkJCQkvKiB0byB0aGUgTGludXggaW5vZGUgc3RhdGUuCSovCisKKy8qCisgKiBWYWx1ZXMgZm9yIHRoZSBWT1BfUldMT0NLIGFuZCBWT1BfUldVTkxPQ0sgZmxhZ3MgcGFyYW1ldGVyLgorICovCit0eXBlZGVmIGVudW0gdnJ3bG9jayB7CisJVlJXTE9DS19OT05FLAorCVZSV0xPQ0tfUkVBRCwKKwlWUldMT0NLX1dSSVRFLAorCVZSV0xPQ0tfV1JJVEVfRElSRUNULAorCVZSV0xPQ0tfVFJZX1JFQUQsCisJVlJXTE9DS19UUllfV1JJVEUKK30gdnJ3bG9ja190OworCisvKgorICogUmV0dXJuIHZhbHVlcyBmb3IgVk9QX0lOQUNUSVZFLiAgQSByZXR1cm4gdmFsdWUgb2YKKyAqIFZOX0lOQUNUSVZFX05PQ0FDSEUgaW1wbGllcyB0aGF0IHRoZSBmaWxlIHN5c3RlbSBiZWhhdmlvcgorICogaGFzIGRpc2Fzc29jaWF0ZWQgaXRzIHN0YXRlIGFuZCBiaHZfZGVzY190IGZyb20gdGhlIHZub2RlLgorICovCisjZGVmaW5lCVZOX0lOQUNUSVZFX0NBQ0hFCTAKKyNkZWZpbmUJVk5fSU5BQ1RJVkVfTk9DQUNIRQkxCisKKy8qCisgKiBWYWx1ZXMgZm9yIHRoZSBjbWQgY29kZSBnaXZlbiB0byBWT1BfVk5PREVfQ0hBTkdFLgorICovCit0eXBlZGVmIGVudW0gdmNoYW5nZSB7CisJVkNIQU5HRV9GTEFHU19GUkxPQ0tTCQk9IDAsCisJVkNIQU5HRV9GTEFHU19FTkZfTE9DS0lORwk9IDEsCisJVkNIQU5HRV9GTEFHU19UUlVOQ0FURUQJCT0gMiwKKwlWQ0hBTkdFX0ZMQUdTX1BBR0VfRElSVFkJPSAzLAorCVZDSEFOR0VfRkxBR1NfSU9FWENMX0NPVU5UCT0gNAorfSB2Y2hhbmdlX3Q7CisKKwordHlwZWRlZiBpbnQJKCp2b3Bfb3Blbl90KShiaHZfZGVzY190ICosIHN0cnVjdCBjcmVkICopOwordHlwZWRlZiBzc2l6ZV90ICgqdm9wX3JlYWRfdCkoYmh2X2Rlc2NfdCAqLCBzdHJ1Y3Qga2lvY2IgKiwKKwkJCQljb25zdCBzdHJ1Y3QgaW92ZWMgKiwgdW5zaWduZWQgaW50LAorCQkJCWxvZmZfdCAqLCBpbnQsIHN0cnVjdCBjcmVkICopOwordHlwZWRlZiBzc2l6ZV90ICgqdm9wX3dyaXRlX3QpKGJodl9kZXNjX3QgKiwgc3RydWN0IGtpb2NiICosCisJCQkJY29uc3Qgc3RydWN0IGlvdmVjICosIHVuc2lnbmVkIGludCwKKwkJCQlsb2ZmX3QgKiwgaW50LCBzdHJ1Y3QgY3JlZCAqKTsKK3R5cGVkZWYgc3NpemVfdCAoKnZvcF9zZW5kZmlsZV90KShiaHZfZGVzY190ICosIHN0cnVjdCBmaWxlICosCisJCQkJbG9mZl90ICosIGludCwgc2l6ZV90LCByZWFkX2FjdG9yX3QsCisJCQkJdm9pZCAqLCBzdHJ1Y3QgY3JlZCAqKTsKK3R5cGVkZWYgaW50CSgqdm9wX2lvY3RsX3QpKGJodl9kZXNjX3QgKiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosCisJCQkJaW50LCB1bnNpZ25lZCBpbnQsIHZvaWQgX191c2VyICopOwordHlwZWRlZiBpbnQJKCp2b3BfZ2V0YXR0cl90KShiaHZfZGVzY190ICosIHN0cnVjdCB2YXR0ciAqLCBpbnQsCisJCQkJc3RydWN0IGNyZWQgKik7Cit0eXBlZGVmIGludAkoKnZvcF9zZXRhdHRyX3QpKGJodl9kZXNjX3QgKiwgc3RydWN0IHZhdHRyICosIGludCwKKwkJCQlzdHJ1Y3QgY3JlZCAqKTsKK3R5cGVkZWYgaW50CSgqdm9wX2FjY2Vzc190KShiaHZfZGVzY190ICosIGludCwgc3RydWN0IGNyZWQgKik7Cit0eXBlZGVmIGludAkoKnZvcF9sb29rdXBfdCkoYmh2X2Rlc2NfdCAqLCB2bmFtZV90ICosIHZub2RlX3QgKiosCisJCQkJaW50LCB2bm9kZV90ICosIHN0cnVjdCBjcmVkICopOwordHlwZWRlZiBpbnQJKCp2b3BfY3JlYXRlX3QpKGJodl9kZXNjX3QgKiwgdm5hbWVfdCAqLCBzdHJ1Y3QgdmF0dHIgKiwKKwkJCQl2bm9kZV90ICoqLCBzdHJ1Y3QgY3JlZCAqKTsKK3R5cGVkZWYgaW50CSgqdm9wX3JlbW92ZV90KShiaHZfZGVzY190ICosIHZuYW1lX3QgKiwgc3RydWN0IGNyZWQgKik7Cit0eXBlZGVmIGludAkoKnZvcF9saW5rX3QpKGJodl9kZXNjX3QgKiwgdm5vZGVfdCAqLCB2bmFtZV90ICosCisJCQkJc3RydWN0IGNyZWQgKik7Cit0eXBlZGVmIGludAkoKnZvcF9yZW5hbWVfdCkoYmh2X2Rlc2NfdCAqLCB2bmFtZV90ICosIHZub2RlX3QgKiwgdm5hbWVfdCAqLAorCQkJCXN0cnVjdCBjcmVkICopOwordHlwZWRlZiBpbnQJKCp2b3BfbWtkaXJfdCkoYmh2X2Rlc2NfdCAqLCB2bmFtZV90ICosIHN0cnVjdCB2YXR0ciAqLAorCQkJCXZub2RlX3QgKiosIHN0cnVjdCBjcmVkICopOwordHlwZWRlZiBpbnQJKCp2b3Bfcm1kaXJfdCkoYmh2X2Rlc2NfdCAqLCB2bmFtZV90ICosIHN0cnVjdCBjcmVkICopOwordHlwZWRlZiBpbnQJKCp2b3BfcmVhZGRpcl90KShiaHZfZGVzY190ICosIHN0cnVjdCB1aW8gKiwgc3RydWN0IGNyZWQgKiwKKwkJCQlpbnQgKik7Cit0eXBlZGVmIGludAkoKnZvcF9zeW1saW5rX3QpKGJodl9kZXNjX3QgKiwgdm5hbWVfdCAqLCBzdHJ1Y3QgdmF0dHIgKiwKKwkJCQljaGFyICosIHZub2RlX3QgKiosIHN0cnVjdCBjcmVkICopOwordHlwZWRlZiBpbnQJKCp2b3BfcmVhZGxpbmtfdCkoYmh2X2Rlc2NfdCAqLCBzdHJ1Y3QgdWlvICosIGludCwKKwkJCQlzdHJ1Y3QgY3JlZCAqKTsKK3R5cGVkZWYgaW50CSgqdm9wX2ZzeW5jX3QpKGJodl9kZXNjX3QgKiwgaW50LCBzdHJ1Y3QgY3JlZCAqLAorCQkJCXhmc19vZmZfdCwgeGZzX29mZl90KTsKK3R5cGVkZWYgaW50CSgqdm9wX2luYWN0aXZlX3QpKGJodl9kZXNjX3QgKiwgc3RydWN0IGNyZWQgKik7Cit0eXBlZGVmIGludAkoKnZvcF9maWQyX3QpKGJodl9kZXNjX3QgKiwgc3RydWN0IGZpZCAqKTsKK3R5cGVkZWYgaW50CSgqdm9wX3JlbGVhc2VfdCkoYmh2X2Rlc2NfdCAqKTsKK3R5cGVkZWYgaW50CSgqdm9wX3J3bG9ja190KShiaHZfZGVzY190ICosIHZyd2xvY2tfdCk7Cit0eXBlZGVmIHZvaWQJKCp2b3Bfcnd1bmxvY2tfdCkoYmh2X2Rlc2NfdCAqLCB2cndsb2NrX3QpOwordHlwZWRlZiBpbnQJKCp2b3BfYm1hcF90KShiaHZfZGVzY190ICosIHhmc19vZmZfdCwgc3NpemVfdCwgaW50LAorCQkJCXN0cnVjdCB4ZnNfaW9tYXAgKiwgaW50ICopOwordHlwZWRlZiBpbnQJKCp2b3BfcmVjbGFpbV90KShiaHZfZGVzY190ICopOwordHlwZWRlZiBpbnQJKCp2b3BfYXR0cl9nZXRfdCkoYmh2X2Rlc2NfdCAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCwKKwkJCQlzdHJ1Y3QgY3JlZCAqKTsKK3R5cGVkZWYJaW50CSgqdm9wX2F0dHJfc2V0X3QpKGJodl9kZXNjX3QgKiwgY2hhciAqLCBjaGFyICosIGludCwgaW50LAorCQkJCXN0cnVjdCBjcmVkICopOwordHlwZWRlZglpbnQJKCp2b3BfYXR0cl9yZW1vdmVfdCkoYmh2X2Rlc2NfdCAqLCBjaGFyICosIGludCwgc3RydWN0IGNyZWQgKik7Cit0eXBlZGVmCWludAkoKnZvcF9hdHRyX2xpc3RfdCkoYmh2X2Rlc2NfdCAqLCBjaGFyICosIGludCwgaW50LAorCQkJCXN0cnVjdCBhdHRybGlzdF9jdXJzb3Jfa2VybiAqLCBzdHJ1Y3QgY3JlZCAqKTsKK3R5cGVkZWYgdm9pZAkoKnZvcF9saW5rX3JlbW92ZWRfdCkoYmh2X2Rlc2NfdCAqLCB2bm9kZV90ICosIGludCk7Cit0eXBlZGVmIHZvaWQJKCp2b3Bfdm5vZGVfY2hhbmdlX3QpKGJodl9kZXNjX3QgKiwgdmNoYW5nZV90LCBfX3BzaW50X3QpOwordHlwZWRlZiB2b2lkCSgqdm9wX3B0b3NzdnBfdCkoYmh2X2Rlc2NfdCAqLCB4ZnNfb2ZmX3QsIHhmc19vZmZfdCwgaW50KTsKK3R5cGVkZWYgdm9pZAkoKnZvcF9wZmx1c2hpbnZhbHZwX3QpKGJodl9kZXNjX3QgKiwgeGZzX29mZl90LCB4ZnNfb2ZmX3QsIGludCk7Cit0eXBlZGVmIGludAkoKnZvcF9wZmx1c2h2cF90KShiaHZfZGVzY190ICosIHhmc19vZmZfdCwgeGZzX29mZl90LAorCQkJCXVpbnQ2NF90LCBpbnQpOwordHlwZWRlZiBpbnQJKCp2b3BfaWZsdXNoX3QpKGJodl9kZXNjX3QgKiwgaW50KTsKKworCit0eXBlZGVmIHN0cnVjdCB2bm9kZW9wcyB7CisJYmh2X3Bvc2l0aW9uX3QgIHZuX3Bvc2l0aW9uOyAgICAvKiBwb3NpdGlvbiB3aXRoaW4gYmVoYXZpb3IgY2hhaW4gKi8KKwl2b3Bfb3Blbl90CQl2b3Bfb3BlbjsKKwl2b3BfcmVhZF90CQl2b3BfcmVhZDsKKwl2b3Bfd3JpdGVfdAkJdm9wX3dyaXRlOworCXZvcF9zZW5kZmlsZV90CQl2b3Bfc2VuZGZpbGU7CisJdm9wX2lvY3RsX3QJCXZvcF9pb2N0bDsKKwl2b3BfZ2V0YXR0cl90CQl2b3BfZ2V0YXR0cjsKKwl2b3Bfc2V0YXR0cl90CQl2b3Bfc2V0YXR0cjsKKwl2b3BfYWNjZXNzX3QJCXZvcF9hY2Nlc3M7CisJdm9wX2xvb2t1cF90CQl2b3BfbG9va3VwOworCXZvcF9jcmVhdGVfdAkJdm9wX2NyZWF0ZTsKKwl2b3BfcmVtb3ZlX3QJCXZvcF9yZW1vdmU7CisJdm9wX2xpbmtfdAkJdm9wX2xpbms7CisJdm9wX3JlbmFtZV90CQl2b3BfcmVuYW1lOworCXZvcF9ta2Rpcl90CQl2b3BfbWtkaXI7CisJdm9wX3JtZGlyX3QJCXZvcF9ybWRpcjsKKwl2b3BfcmVhZGRpcl90CQl2b3BfcmVhZGRpcjsKKwl2b3Bfc3ltbGlua190CQl2b3Bfc3ltbGluazsKKwl2b3BfcmVhZGxpbmtfdAkJdm9wX3JlYWRsaW5rOworCXZvcF9mc3luY190CQl2b3BfZnN5bmM7CisJdm9wX2luYWN0aXZlX3QJCXZvcF9pbmFjdGl2ZTsKKwl2b3BfZmlkMl90CQl2b3BfZmlkMjsKKwl2b3Bfcndsb2NrX3QJCXZvcF9yd2xvY2s7CisJdm9wX3J3dW5sb2NrX3QJCXZvcF9yd3VubG9jazsKKwl2b3BfYm1hcF90CQl2b3BfYm1hcDsKKwl2b3BfcmVjbGFpbV90CQl2b3BfcmVjbGFpbTsKKwl2b3BfYXR0cl9nZXRfdAkJdm9wX2F0dHJfZ2V0OworCXZvcF9hdHRyX3NldF90CQl2b3BfYXR0cl9zZXQ7CisJdm9wX2F0dHJfcmVtb3ZlX3QJdm9wX2F0dHJfcmVtb3ZlOworCXZvcF9hdHRyX2xpc3RfdAkJdm9wX2F0dHJfbGlzdDsKKwl2b3BfbGlua19yZW1vdmVkX3QJdm9wX2xpbmtfcmVtb3ZlZDsKKwl2b3Bfdm5vZGVfY2hhbmdlX3QJdm9wX3Zub2RlX2NoYW5nZTsKKwl2b3BfcHRvc3N2cF90CQl2b3BfdG9zc3BhZ2VzOworCXZvcF9wZmx1c2hpbnZhbHZwX3QJdm9wX2ZsdXNoaW52YWxfcGFnZXM7CisJdm9wX3BmbHVzaHZwX3QJCXZvcF9mbHVzaF9wYWdlczsKKwl2b3BfcmVsZWFzZV90CQl2b3BfcmVsZWFzZTsKKwl2b3BfaWZsdXNoX3QJCXZvcF9pZmx1c2g7Cit9IHZub2Rlb3BzX3Q7CisKKy8qCisgKiBWT1Ancy4KKyAqLworI2RlZmluZSBfVk9QXyhvcCwgdnApCSgqKCh2bm9kZW9wc190ICopKHZwKS0+dl9mb3BzKS0+b3ApCisKKyNkZWZpbmUgVk9QX1JFQUQodnAsZmlsZSxpb3Ysc2VncyxvZmZzZXQsaW9mbGFncyxjcixydikJCQlcCisJcnYgPSBfVk9QXyh2b3BfcmVhZCwgdnApKCh2cCktPnZfZmJodixmaWxlLGlvdixzZWdzLG9mZnNldCxpb2ZsYWdzLGNyKQorI2RlZmluZSBWT1BfV1JJVEUodnAsZmlsZSxpb3Ysc2VncyxvZmZzZXQsaW9mbGFncyxjcixydikJCVwKKwlydiA9IF9WT1BfKHZvcF93cml0ZSwgdnApKCh2cCktPnZfZmJodixmaWxlLGlvdixzZWdzLG9mZnNldCxpb2ZsYWdzLGNyKQorI2RlZmluZSBWT1BfU0VOREZJTEUodnAsZixvZmYsaW9mbGFncyxjbnQsYWN0LHRhcmcsY3IscnYpCQlcCisJcnYgPSBfVk9QXyh2b3Bfc2VuZGZpbGUsIHZwKSgodnApLT52X2ZiaHYsZixvZmYsaW9mbGFncyxjbnQsYWN0LHRhcmcsY3IpCisjZGVmaW5lIFZPUF9CTUFQKHZwLG9mLHN6LHJ3LGIsbixydikJCQkJCVwKKwlydiA9IF9WT1BfKHZvcF9ibWFwLCB2cCkoKHZwKS0+dl9mYmh2LG9mLHN6LHJ3LGIsbikKKyNkZWZpbmUgVk9QX09QRU4odnAsIGNyLCBydikJCQkJCQlcCisJcnYgPSBfVk9QXyh2b3Bfb3BlbiwgdnApKCh2cCktPnZfZmJodiwgY3IpCisjZGVmaW5lIFZPUF9HRVRBVFRSKHZwLCB2YXAsIGYsIGNyLCBydikJCQkJCVwKKwlydiA9IF9WT1BfKHZvcF9nZXRhdHRyLCB2cCkoKHZwKS0+dl9mYmh2LCB2YXAsIGYsIGNyKQorI2RlZmluZQlWT1BfU0VUQVRUUih2cCwgdmFwLCBmLCBjciwgcnYpCQkJCQlcCisJcnYgPSBfVk9QXyh2b3Bfc2V0YXR0ciwgdnApKCh2cCktPnZfZmJodiwgdmFwLCBmLCBjcikKKyNkZWZpbmUJVk9QX0FDQ0VTUyh2cCwgbW9kZSwgY3IsIHJ2KQkJCQkJXAorCXJ2ID0gX1ZPUF8odm9wX2FjY2VzcywgdnApKCh2cCktPnZfZmJodiwgbW9kZSwgY3IpCisjZGVmaW5lCVZPUF9MT09LVVAodnAsZCx2cHAsZixyZGlyLGNyLHJ2KQkJCQlcCisJcnYgPSBfVk9QXyh2b3BfbG9va3VwLCB2cCkoKHZwKS0+dl9mYmh2LGQsdnBwLGYscmRpcixjcikKKyNkZWZpbmUgVk9QX0NSRUFURShkdnAsZCx2YXAsdnBwLGNyLHJ2KQkJCQkJXAorCXJ2ID0gX1ZPUF8odm9wX2NyZWF0ZSwgZHZwKSgoZHZwKS0+dl9mYmh2LGQsdmFwLHZwcCxjcikKKyNkZWZpbmUgVk9QX1JFTU9WRShkdnAsZCxjcixydikJCQkJCQlcCisJcnYgPSBfVk9QXyh2b3BfcmVtb3ZlLCBkdnApKChkdnApLT52X2ZiaHYsZCxjcikKKyNkZWZpbmUJVk9QX0xJTksodGR2cCxmdnAsZCxjcixydikJCQkJCVwKKwlydiA9IF9WT1BfKHZvcF9saW5rLCB0ZHZwKSgodGR2cCktPnZfZmJodixmdnAsZCxjcikKKyNkZWZpbmUJVk9QX1JFTkFNRShmdnAsZm5tLHRkdnAsdG5tLGNyLHJ2KQkJCQlcCisJcnYgPSBfVk9QXyh2b3BfcmVuYW1lLCBmdnApKChmdnApLT52X2ZiaHYsZm5tLHRkdnAsdG5tLGNyKQorI2RlZmluZQlWT1BfTUtESVIoZHAsZCx2YXAsdnBwLGNyLHJ2KQkJCQkJXAorCXJ2ID0gX1ZPUF8odm9wX21rZGlyLCBkcCkoKGRwKS0+dl9mYmh2LGQsdmFwLHZwcCxjcikKKyNkZWZpbmUJVk9QX1JNRElSKGRwLGQsY3IscnYpCSAJCQkJCVwKKwlydiA9IF9WT1BfKHZvcF9ybWRpciwgZHApKChkcCktPnZfZmJodixkLGNyKQorI2RlZmluZQlWT1BfUkVBRERJUih2cCx1aW9wLGNyLGVvZnAscnYpCQkJCQlcCisJcnYgPSBfVk9QXyh2b3BfcmVhZGRpciwgdnApKCh2cCktPnZfZmJodix1aW9wLGNyLGVvZnApCisjZGVmaW5lCVZPUF9TWU1MSU5LKGR2cCxkLHZhcCx0bm0sdnBwLGNyLHJ2KQkJCQlcCisJcnYgPSBfVk9QXyh2b3Bfc3ltbGluaywgZHZwKSAoKGR2cCktPnZfZmJodixkLHZhcCx0bm0sdnBwLGNyKQorI2RlZmluZQlWT1BfUkVBRExJTksodnAsdWlvcCxmbCxjcixydikJCQkJCVwKKwlydiA9IF9WT1BfKHZvcF9yZWFkbGluaywgdnApKCh2cCktPnZfZmJodix1aW9wLGZsLGNyKQorI2RlZmluZQlWT1BfRlNZTkModnAsZixjcixiLGUscnYpCQkJCQlcCisJcnYgPSBfVk9QXyh2b3BfZnN5bmMsIHZwKSgodnApLT52X2ZiaHYsZixjcixiLGUpCisjZGVmaW5lIFZPUF9JTkFDVElWRSh2cCwgY3IsIHJ2KQkJCQkJXAorCXJ2ID0gX1ZPUF8odm9wX2luYWN0aXZlLCB2cCkoKHZwKS0+dl9mYmh2LCBjcikKKyNkZWZpbmUgVk9QX1JFTEVBU0UodnAsIHJ2KQkJCQkJCVwKKwlydiA9IF9WT1BfKHZvcF9yZWxlYXNlLCB2cCkoKHZwKS0+dl9mYmh2KQorI2RlZmluZSBWT1BfRklEMih2cCwgZmlkcCwgcnYpCQkJCQkJXAorCXJ2ID0gX1ZPUF8odm9wX2ZpZDIsIHZwKSgodnApLT52X2ZiaHYsIGZpZHApCisjZGVmaW5lIFZPUF9SV0xPQ0sodnAsaSkJCQkJCQlcCisJKHZvaWQpX1ZPUF8odm9wX3J3bG9jaywgdnApKCh2cCktPnZfZmJodiwgaSkKKyNkZWZpbmUgVk9QX1JXTE9DS19UUlkodnAsaSkJCQkJCQlcCisJX1ZPUF8odm9wX3J3bG9jaywgdnApKCh2cCktPnZfZmJodiwgaSkKKyNkZWZpbmUgVk9QX1JXVU5MT0NLKHZwLGkpCQkJCQkJXAorCSh2b2lkKV9WT1BfKHZvcF9yd3VubG9jaywgdnApKCh2cCktPnZfZmJodiwgaSkKKyNkZWZpbmUgVk9QX0ZSTE9DSyh2cCxjLGZsLGZsYWdzLG9mZnNldCxmcixydikJCQkJXAorCXJ2ID0gX1ZPUF8odm9wX2ZybG9jaywgdnApKCh2cCktPnZfZmJodixjLGZsLGZsYWdzLG9mZnNldCxmcikKKyNkZWZpbmUgVk9QX1JFQ0xBSU0odnAsIHJ2KQkJCQkJCVwKKwlydiA9IF9WT1BfKHZvcF9yZWNsYWltLCB2cCkoKHZwKS0+dl9mYmh2KQorI2RlZmluZSBWT1BfQVRUUl9HRVQodnAsIG5hbWUsIHZhbCwgdmFsbGVucCwgZmwsIGNyZWQsIHJ2KQkJXAorCXJ2ID0gX1ZPUF8odm9wX2F0dHJfZ2V0LCB2cCkoKHZwKS0+dl9mYmh2LG5hbWUsdmFsLHZhbGxlbnAsZmwsY3JlZCkKKyNkZWZpbmUJVk9QX0FUVFJfU0VUKHZwLCBuYW1lLCB2YWwsIHZhbGxlbiwgZmwsIGNyZWQsIHJ2KQkJXAorCXJ2ID0gX1ZPUF8odm9wX2F0dHJfc2V0LCB2cCkoKHZwKS0+dl9mYmh2LG5hbWUsdmFsLHZhbGxlbixmbCxjcmVkKQorI2RlZmluZQlWT1BfQVRUUl9SRU1PVkUodnAsIG5hbWUsIGZsYWdzLCBjcmVkLCBydikJCQlcCisJcnYgPSBfVk9QXyh2b3BfYXR0cl9yZW1vdmUsIHZwKSgodnApLT52X2ZiaHYsbmFtZSxmbGFncyxjcmVkKQorI2RlZmluZQlWT1BfQVRUUl9MSVNUKHZwLCBidWYsIGJ1ZmxlbiwgZmwsIGN1cnNvciwgY3JlZCwgcnYpCQlcCisJcnYgPSBfVk9QXyh2b3BfYXR0cl9saXN0LCB2cCkoKHZwKS0+dl9mYmh2LGJ1ZixidWZsZW4sZmwsY3Vyc29yLGNyZWQpCisjZGVmaW5lIFZPUF9MSU5LX1JFTU9WRUQodnAsIGR2cCwgbGlua3plcm8pCQkJCVwKKwkodm9pZClfVk9QXyh2b3BfbGlua19yZW1vdmVkLCB2cCkoKHZwKS0+dl9mYmh2LCBkdnAsIGxpbmt6ZXJvKQorI2RlZmluZSBWT1BfVk5PREVfQ0hBTkdFKHZwLCBjbWQsIHZhbCkJCQkJCVwKKwkodm9pZClfVk9QXyh2b3Bfdm5vZGVfY2hhbmdlLCB2cCkoKHZwKS0+dl9mYmh2LGNtZCx2YWwpCisvKgorICogVGhlc2UgYXJlIHBhZ2UgY2FjaGUgZnVuY3Rpb25zIHRoYXQgbm93IGdvIHRocnUgVk9Qcy4KKyAqICdsYXN0JyBwYXJhbWV0ZXIgaXMgdW51c2VkIGFuZCBsZWZ0IGluIGZvciBJUklYIGNvbXBhdGliaWxpdHkKKyAqLworI2RlZmluZSBWT1BfVE9TU19QQUdFUyh2cCwgZmlyc3QsIGxhc3QsIGZpb3B0KQkJCQlcCisJX1ZPUF8odm9wX3Rvc3NwYWdlcywgdnApKCh2cCktPnZfZmJodixmaXJzdCwgbGFzdCwgZmlvcHQpCisvKgorICogJ2xhc3QnIHBhcmFtZXRlciBpcyB1bnVzZWQgYW5kIGxlZnQgaW4gZm9yIElSSVggY29tcGF0aWJpbGl0eQorICovCisjZGVmaW5lIFZPUF9GTFVTSElOVkFMX1BBR0VTKHZwLCBmaXJzdCwgbGFzdCwgZmlvcHQpCQkJXAorCV9WT1BfKHZvcF9mbHVzaGludmFsX3BhZ2VzLCB2cCkoKHZwKS0+dl9mYmh2LGZpcnN0LGxhc3QsZmlvcHQpCisvKgorICogJ2xhc3QnIHBhcmFtZXRlciBpcyB1bnVzZWQgYW5kIGxlZnQgaW4gZm9yIElSSVggY29tcGF0aWJpbGl0eQorICovCisjZGVmaW5lIFZPUF9GTFVTSF9QQUdFUyh2cCwgZmlyc3QsIGxhc3QsIGZsYWdzLCBmaW9wdCwgcnYpCQlcCisJcnYgPSBfVk9QXyh2b3BfZmx1c2hfcGFnZXMsIHZwKSgodnApLT52X2ZiaHYsZmlyc3QsbGFzdCxmbGFncyxmaW9wdCkKKyNkZWZpbmUgVk9QX0lPQ1RMKHZwLCBpbm9kZSwgZmlscCwgZmwsIGNtZCwgYXJnLCBydikJCQlcCisJcnYgPSBfVk9QXyh2b3BfaW9jdGwsIHZwKSgodnApLT52X2ZiaHYsaW5vZGUsZmlscCxmbCxjbWQsYXJnKQorI2RlZmluZSBWT1BfSUZMVVNIKHZwLCBmbGFncywgcnYpCQkJCQlcCisJcnYgPSBfVk9QXyh2b3BfaWZsdXNoLCB2cCkoKHZwKS0+dl9mYmh2LCBmbGFncykKKworLyoKKyAqIEZsYWdzIGZvciByZWFkL3dyaXRlIGNhbGxzIC0gc2FtZSB2YWx1ZXMgYXMgSVJJWAorICovCisjZGVmaW5lIElPX0lTQUlPCTB4MDAwMDEJCS8qIGRvbid0IHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgSU9fSVNESVJFQ1QJMHgwMDAwNAkJLyogYnlwYXNzIHBhZ2UgY2FjaGUgKi8KKyNkZWZpbmUgSU9fSU5WSVMJMHgwMDAyMAkJLyogZG9uJ3QgdXBkYXRlIGlub2RlIHRpbWVzdGFtcHMgKi8KKworLyoKKyAqIEZsYWdzIGZvciBWT1BfSUZMVVNIIGNhbGwKKyAqLworI2RlZmluZSBGTFVTSF9TWU5DCQkxCS8qIHdhaXQgZm9yIGZsdXNoIHRvIGNvbXBsZXRlCSovCisjZGVmaW5lIEZMVVNIX0lOT0RFCQkyCS8qIGZsdXNoIHRoZSBpbm9kZSBpdHNlbGYJKi8KKyNkZWZpbmUgRkxVU0hfTE9HCQk0CS8qIGZvcmNlIHRoZSBsYXN0IGxvZyBlbnRyeSBmb3IKKwkJCQkJICogdGhpcyBpbm9kZSBvdXQgdG8gZGlzawkqLworCisvKgorICogRmx1c2gvSW52YWxpZGF0ZSBvcHRpb25zIGZvciBWT1BfVE9TU19QQUdFUywgVk9QX0ZMVVNISU5WQUxfUEFHRVMgYW5kCisgKglWT1BfRkxVU0hfUEFHRVMuCisgKi8KKyNkZWZpbmUgRklfTk9ORQkJCTAJLyogbm9uZSAqLworI2RlZmluZSBGSV9SRU1BUEYJCTEJLyogRG8gYSByZW1hcGYgcHJpb3IgdG8gdGhlIG9wZXJhdGlvbiAqLworI2RlZmluZSBGSV9SRU1BUEZfTE9DS0VECTIJLyogRG8gYSByZW1hcGYgcHJpb3IgdG8gdGhlIG9wZXJhdGlvbi4KKwkJCQkJICAgUHJldmVudCBWTSBhY2Nlc3MgdG8gdGhlIHBhZ2VzIHVudGlsCisJCQkJCSAgIHRoZSBvcGVyYXRpb24gY29tcGxldGVzLiAqLworCisvKgorICogVm5vZGUgYXR0cmlidXRlcy4gIHZhX21hc2sgaW5kaWNhdGVzIHRob3NlIGF0dHJpYnV0ZXMgdGhlIGNhbGxlcgorICogd2FudHMgdG8gc2V0IG9yIGV4dHJhY3QuCisgKi8KK3R5cGVkZWYgc3RydWN0IHZhdHRyIHsKKwlpbnQJCXZhX21hc2s7CS8qIGJpdC1tYXNrIG9mIGF0dHJpYnV0ZXMgcHJlc2VudCAqLworCWVudW0gdnR5cGUJdmFfdHlwZTsJLyogdm5vZGUgdHlwZSAoZm9yIGNyZWF0ZSkgKi8KKwltb2RlX3QJCXZhX21vZGU7CS8qIGZpbGUgYWNjZXNzIG1vZGUgYW5kIHR5cGUgKi8KKwlubGlua190CQl2YV9ubGluazsJLyogbnVtYmVyIG9mIHJlZmVyZW5jZXMgdG8gZmlsZSAqLworCXVpZF90CQl2YV91aWQ7CQkvKiBvd25lciB1c2VyIGlkICovCisJZ2lkX3QJCXZhX2dpZDsJCS8qIG93bmVyIGdyb3VwIGlkICovCisJeGZzX2lub190CXZhX25vZGVpZDsJLyogZmlsZSBpZCAqLworCXhmc19vZmZfdAl2YV9zaXplOwkvKiBmaWxlIHNpemUgaW4gYnl0ZXMgKi8KKwl1X2xvbmcJCXZhX2Jsb2Nrc2l6ZTsJLyogYmxvY2tzaXplIHByZWZlcnJlZCBmb3IgaS9vICovCisJc3RydWN0IHRpbWVzcGVjCXZhX2F0aW1lOwkvKiB0aW1lIG9mIGxhc3QgYWNjZXNzICovCisJc3RydWN0IHRpbWVzcGVjCXZhX210aW1lOwkvKiB0aW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uICovCisJc3RydWN0IHRpbWVzcGVjCXZhX2N0aW1lOwkvKiB0aW1lIGZpbGUgY2hhbmdlZCAqLworCXVfaW50CQl2YV9nZW47CQkvKiBnZW5lcmF0aW9uIG51bWJlciBvZiBmaWxlICovCisJeGZzX2Rldl90CXZhX3JkZXY7CS8qIGRldmljZSB0aGUgc3BlY2lhbCBmaWxlIHJlcHJlc2VudHMgKi8KKwlfX2ludDY0X3QJdmFfbmJsb2NrczsJLyogbnVtYmVyIG9mIGJsb2NrcyBhbGxvY2F0ZWQgKi8KKwl1X2xvbmcJCXZhX3hmbGFnczsJLyogcmFuZG9tIGV4dGVuZGVkIGZpbGUgZmxhZ3MgKi8KKwl1X2xvbmcJCXZhX2V4dHNpemU7CS8qIGZpbGUgZXh0ZW50IHNpemUgKi8KKwl1X2xvbmcJCXZhX25leHRlbnRzOwkvKiBudW1iZXIgb2YgZXh0ZW50cyBpbiBmaWxlICovCisJdV9sb25nCQl2YV9hbmV4dGVudHM7CS8qIG51bWJlciBvZiBhdHRyIGV4dGVudHMgaW4gZmlsZSAqLworCWludAkJdmFfcHJvamlkOwkvKiBwcm9qZWN0IGlkICovCit9IHZhdHRyX3Q7CisKKy8qCisgKiBzZXRhdHRyIG9yIGdldGF0dHIgYXR0cmlidXRlcworICovCisjZGVmaW5lIFhGU19BVF9UWVBFCQkweDAwMDAwMDAxCisjZGVmaW5lIFhGU19BVF9NT0RFCQkweDAwMDAwMDAyCisjZGVmaW5lIFhGU19BVF9VSUQJCTB4MDAwMDAwMDQKKyNkZWZpbmUgWEZTX0FUX0dJRAkJMHgwMDAwMDAwOAorI2RlZmluZSBYRlNfQVRfRlNJRAkJMHgwMDAwMDAxMAorI2RlZmluZSBYRlNfQVRfTk9ERUlECQkweDAwMDAwMDIwCisjZGVmaW5lIFhGU19BVF9OTElOSwkJMHgwMDAwMDA0MAorI2RlZmluZSBYRlNfQVRfU0laRQkJMHgwMDAwMDA4MAorI2RlZmluZSBYRlNfQVRfQVRJTUUJCTB4MDAwMDAxMDAKKyNkZWZpbmUgWEZTX0FUX01USU1FCQkweDAwMDAwMjAwCisjZGVmaW5lIFhGU19BVF9DVElNRQkJMHgwMDAwMDQwMAorI2RlZmluZSBYRlNfQVRfUkRFVgkJMHgwMDAwMDgwMAorI2RlZmluZSBYRlNfQVRfQkxLU0laRQkJMHgwMDAwMTAwMAorI2RlZmluZSBYRlNfQVRfTkJMT0NLUwkJMHgwMDAwMjAwMAorI2RlZmluZSBYRlNfQVRfVkNPREUJCTB4MDAwMDQwMDAKKyNkZWZpbmUgWEZTX0FUX01BQwkJMHgwMDAwODAwMAorI2RlZmluZSBYRlNfQVRfVVBEQVRJTUUJCTB4MDAwMTAwMDAKKyNkZWZpbmUgWEZTX0FUX1VQRE1USU1FCQkweDAwMDIwMDAwCisjZGVmaW5lIFhGU19BVF9VUERDVElNRQkJMHgwMDA0MDAwMAorI2RlZmluZSBYRlNfQVRfQUNMCQkweDAwMDgwMDAwCisjZGVmaW5lIFhGU19BVF9DQVAJCTB4MDAxMDAwMDAKKyNkZWZpbmUgWEZTX0FUX0lORgkJMHgwMDIwMDAwMAorI2RlZmluZSBYRlNfQVRfWEZMQUdTCQkweDAwNDAwMDAwCisjZGVmaW5lIFhGU19BVF9FWFRTSVpFCQkweDAwODAwMDAwCisjZGVmaW5lIFhGU19BVF9ORVhURU5UUwkJMHgwMTAwMDAwMAorI2RlZmluZSBYRlNfQVRfQU5FWFRFTlRTCTB4MDIwMDAwMDAKKyNkZWZpbmUgWEZTX0FUX1BST0pJRAkJMHgwNDAwMDAwMAorI2RlZmluZSBYRlNfQVRfU0laRV9OT1BFUk0JMHgwODAwMDAwMAorI2RlZmluZSBYRlNfQVRfR0VOQ09VTlQJCTB4MTAwMDAwMDAKKworI2RlZmluZSBYRlNfQVRfQUxMCShYRlNfQVRfVFlQRXxYRlNfQVRfTU9ERXxYRlNfQVRfVUlEfFhGU19BVF9HSUR8XAorCQlYRlNfQVRfRlNJRHxYRlNfQVRfTk9ERUlEfFhGU19BVF9OTElOS3xYRlNfQVRfU0laRXxcCisJCVhGU19BVF9BVElNRXxYRlNfQVRfTVRJTUV8WEZTX0FUX0NUSU1FfFhGU19BVF9SREVWfFwKKwkJWEZTX0FUX0JMS1NJWkV8WEZTX0FUX05CTE9DS1N8WEZTX0FUX1ZDT0RFfFhGU19BVF9NQUN8XAorCQlYRlNfQVRfQUNMfFhGU19BVF9DQVB8WEZTX0FUX0lORnxYRlNfQVRfWEZMQUdTfFhGU19BVF9FWFRTSVpFfFwKKwkJWEZTX0FUX05FWFRFTlRTfFhGU19BVF9BTkVYVEVOVFN8WEZTX0FUX1BST0pJRHxYRlNfQVRfR0VOQ09VTlQpCisKKyNkZWZpbmUgWEZTX0FUX1NUQVQJKFhGU19BVF9UWVBFfFhGU19BVF9NT0RFfFhGU19BVF9VSUR8WEZTX0FUX0dJRHxcCisJCVhGU19BVF9GU0lEfFhGU19BVF9OT0RFSUR8WEZTX0FUX05MSU5LfFhGU19BVF9TSVpFfFwKKwkJWEZTX0FUX0FUSU1FfFhGU19BVF9NVElNRXxYRlNfQVRfQ1RJTUV8WEZTX0FUX1JERVZ8XAorCQlYRlNfQVRfQkxLU0laRXxYRlNfQVRfTkJMT0NLU3xYRlNfQVRfUFJPSklEKQorCisjZGVmaW5lIFhGU19BVF9USU1FUwkoWEZTX0FUX0FUSU1FfFhGU19BVF9NVElNRXxYRlNfQVRfQ1RJTUUpCisKKyNkZWZpbmUgWEZTX0FUX1VQRFRJTUVTCShYRlNfQVRfVVBEQVRJTUV8WEZTX0FUX1VQRE1USU1FfFhGU19BVF9VUERDVElNRSkKKworI2RlZmluZSBYRlNfQVRfTk9TRVQJKFhGU19BVF9OTElOS3xYRlNfQVRfUkRFVnxYRlNfQVRfRlNJRHxYRlNfQVRfTk9ERUlEfFwKKwkJWEZTX0FUX1RZUEV8WEZTX0FUX0JMS1NJWkV8WEZTX0FUX05CTE9DS1N8WEZTX0FUX1ZDT0RFfFwKKwkJWEZTX0FUX05FWFRFTlRTfFhGU19BVF9BTkVYVEVOVFN8WEZTX0FUX0dFTkNPVU5UKQorCisvKgorICogIE1vZGVzLgorICovCisjZGVmaW5lIFZTVUlECVNfSVNVSUQJCS8qIHNldCB1c2VyIGlkIG9uIGV4ZWN1dGlvbiAqLworI2RlZmluZSBWU0dJRAlTX0lTR0lECQkvKiBzZXQgZ3JvdXAgaWQgb24gZXhlY3V0aW9uICovCisjZGVmaW5lIFZTVlRYCVNfSVNWVFgJCS8qIHNhdmUgc3dhcHBlZCB0ZXh0IGV2ZW4gYWZ0ZXIgdXNlICovCisjZGVmaW5lIFZSRUFECVNfSVJVU1IJCS8qIHJlYWQsIHdyaXRlLCBleGVjdXRlIHBlcm1pc3Npb25zICovCisjZGVmaW5lIFZXUklURQlTX0lXVVNSCisjZGVmaW5lIFZFWEVDCVNfSVhVU1IKKworI2RlZmluZSBNT0RFTUFTSyBTX0lBTExVR08JLyogbW9kZSBiaXRzIHBsdXMgcGVybWlzc2lvbiBiaXRzICovCisKKy8qCisgKiBDaGVjayB3aGV0aGVyIG1hbmRhdG9yeSBmaWxlIGxvY2tpbmcgaXMgZW5hYmxlZC4KKyAqLworI2RlZmluZSBNQU5ETE9DSyh2cCwgbW9kZSkJXAorCSgodnApLT52X3R5cGUgPT0gVlJFRyAmJiAoKG1vZGUpICYgKFZTR0lEfChWRVhFQz4+MykpKSA9PSBWU0dJRCkKKworZXh0ZXJuIHZvaWQJdm5faW5pdCh2b2lkKTsKK2V4dGVybiBpbnQJdm5fd2FpdChzdHJ1Y3Qgdm5vZGUgKik7CitleHRlcm4gdm5vZGVfdAkqdm5faW5pdGlhbGl6ZShzdHJ1Y3QgaW5vZGUgKik7CisKKy8qCisgKiBBY3F1aXJpbmcgYW5kIGludmFsaWRhdGluZyB2bm9kZXM6CisgKgorICoJaWYgKHZuX2dldCh2cCwgdmVyc2lvbiwgMCkpCisgKgkJLi4uOworICoJdm5fcHVyZ2UodnAsIHZlcnNpb24pOworICoKKyAqIHZuX2dldCBhbmQgdm5fcHVyZ2UgbXVzdCBiZSBjYWxsZWQgd2l0aCB2bWFwX3QgYXJndW1lbnRzLCBzYW1wbGVkCisgKiB3aGlsZSBhIGxvY2sgdGhhdCB0aGUgdm5vZGUncyBWT1BfUkVDTEFJTSBmdW5jdGlvbiBhY3F1aXJlcyBpcworICogaGVsZCwgdG8gZW5zdXJlIHRoYXQgdGhlIHZub2RlIHNhbXBsZWQgd2l0aCB0aGUgbG9jayBoZWxkIGlzbid0CisgKiByZWN5Y2xlZCAoVk9QX1JFQ0xBSU1lZCkgb3IgZGVhbGxvY2F0ZWQgYmV0d2VlbiB0aGUgcmVsZWFzZSBvZiB0aGUgbG9jaworICogYW5kIHRoZSBzdWJzZXF1ZW50IHZuX2dldCBvciB2bl9wdXJnZS4KKyAqLworCisvKgorICogdm5vZGVfbWFwIHN0cnVjdHVyZXMgX211c3RfIG1hdGNoIHZuX2Vwb2NoIGFuZCB2bm9kZSBzdHJ1Y3R1cmUgc2l6ZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHZub2RlX21hcCB7CisJdmZzX3QJCSp2X3Zmc3A7CisJdm51bWJlcl90CXZfbnVtYmVyOwkJLyogaW4tY29yZSB2bm9kZSBudW1iZXIgKi8KKwl4ZnNfaW5vX3QJdl9pbm87CQkJLyogaW5vZGUgIwkqLworfSB2bWFwX3Q7CisKKyNkZWZpbmUgVk1BUCh2cCwgdm1hcCkJeyh2bWFwKS52X3Zmc3AJID0gKHZwKS0+dl92ZnNwLAlcCisJCQkgKHZtYXApLnZfbnVtYmVyID0gKHZwKS0+dl9udW1iZXIsCVwKKwkJCSAodm1hcCkudl9pbm8JID0gKHZwKS0+dl9pbm9kZS5pX2lubzsgfQorCitleHRlcm4gdm9pZAl2bl9wdXJnZShzdHJ1Y3Qgdm5vZGUgKiwgdm1hcF90ICopOworZXh0ZXJuIHZub2RlX3QJKnZuX2dldChzdHJ1Y3Qgdm5vZGUgKiwgdm1hcF90ICopOworZXh0ZXJuIGludAl2bl9yZXZhbGlkYXRlKHN0cnVjdCB2bm9kZSAqKTsKK2V4dGVybiB2b2lkCXZuX3JldmFsaWRhdGVfY29yZShzdHJ1Y3Qgdm5vZGUgKiwgdmF0dHJfdCAqKTsKK2V4dGVybiB2b2lkCXZuX3JlbW92ZShzdHJ1Y3Qgdm5vZGUgKik7CisKK3N0YXRpYyBpbmxpbmUgaW50IHZuX2NvdW50KHN0cnVjdCB2bm9kZSAqdnApCit7CisJcmV0dXJuIGF0b21pY19yZWFkKCZMSU5WRlNfR0VUX0lQKHZwKS0+aV9jb3VudCk7Cit9CisKKy8qCisgKiBWbm9kZSByZWZlcmVuY2UgY291bnRpbmcgZnVuY3Rpb25zIChhbmQgbWFjcm9zIGZvciBjb21wYXRpYmlsaXR5KS4KKyAqLworZXh0ZXJuIHZub2RlX3QJKnZuX2hvbGQoc3RydWN0IHZub2RlICopOworZXh0ZXJuIHZvaWQJdm5fcmVsZShzdHJ1Y3Qgdm5vZGUgKik7CisKKyNpZiBkZWZpbmVkKFhGU19WTk9ERV9UUkFDRSkKKyNkZWZpbmUgVk5fSE9MRCh2cCkJCVwKKwkoKHZvaWQpdm5faG9sZCh2cCksCVwKKwkgIHZuX3RyYWNlX2hvbGQodnAsIF9fRklMRV9fLCBfX0xJTkVfXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpKQorI2RlZmluZSBWTl9SRUxFKHZwKQkJXAorCSAgKHZuX3RyYWNlX3JlbGUodnAsIF9fRklMRV9fLCBfX0xJTkVfXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpLCBcCisJICAgaXB1dChMSU5WRlNfR0VUX0lQKHZwKSkpCisjZWxzZQorI2RlZmluZSBWTl9IT0xEKHZwKQkJKCh2b2lkKXZuX2hvbGQodnApKQorI2RlZmluZSBWTl9SRUxFKHZwKQkJKGlwdXQoTElOVkZTX0dFVF9JUCh2cCkpKQorI2VuZGlmCisKKy8qCisgKiBWbmFtZSBoYW5kbGluZyBtYWNyb3MuCisgKi8KKyNkZWZpbmUgVk5BTUUoZGVudHJ5KQkJKChjaGFyICopIChkZW50cnkpLT5kX25hbWUubmFtZSkKKyNkZWZpbmUgVk5BTUVMRU4oZGVudHJ5KQkoKGRlbnRyeSktPmRfbmFtZS5sZW4pCisjZGVmaW5lIFZOQU1FX1RPX1ZOT0RFKGRlbnRyeSkJKExJTlZGU19HRVRfVlAoKGRlbnRyeSktPmRfaW5vZGUpKQorCisvKgorICogVm5vZGUgc3BpbmxvY2sgbWFuaXB1bGF0aW9uLgorICovCisjZGVmaW5lIFZOX0xPQ0sodnApCQltdXRleF9zcGlubG9jaygmKHZwKS0+dl9sb2NrKQorI2RlZmluZSBWTl9VTkxPQ0sodnAsIHMpCW11dGV4X3NwaW51bmxvY2soJih2cCktPnZfbG9jaywgcykKKyNkZWZpbmUgVk5fRkxBR1NFVCh2cCxiKQl2bl9mbGFnc2V0KHZwLGIpCisjZGVmaW5lIFZOX0ZMQUdDTFIodnAsYikJdm5fZmxhZ2Nscih2cCxiKQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHZuX2ZsYWdzZXQoc3RydWN0IHZub2RlICp2cCwgdWludCBmbGFnKQoreworCXNwaW5fbG9jaygmdnAtPnZfbG9jayk7CisJdnAtPnZfZmxhZyB8PSBmbGFnOworCXNwaW5fdW5sb2NrKCZ2cC0+dl9sb2NrKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCB2bl9mbGFnY2xyKHN0cnVjdCB2bm9kZSAqdnAsIHVpbnQgZmxhZykKK3sKKwlzcGluX2xvY2soJnZwLT52X2xvY2spOworCXZwLT52X2ZsYWcgJj0gfmZsYWc7CisJc3Bpbl91bmxvY2soJnZwLT52X2xvY2spOworfQorCisvKgorICogVXBkYXRlIG1vZGlmeS9hY2Nlc3MvY2hhbmdlIHRpbWVzIG9uIHRoZSB2bm9kZQorICovCisjZGVmaW5lIFZOX01USU1FU0VUKHZwLCB0dnApCShMSU5WRlNfR0VUX0lQKHZwKS0+aV9tdGltZSA9ICoodHZwKSkKKyNkZWZpbmUgVk5fQVRJTUVTRVQodnAsIHR2cCkJKExJTlZGU19HRVRfSVAodnApLT5pX2F0aW1lID0gKih0dnApKQorI2RlZmluZSBWTl9DVElNRVNFVCh2cCwgdHZwKQkoTElOVkZTX0dFVF9JUCh2cCktPmlfY3RpbWUgPSAqKHR2cCkpCisKKy8qCisgKiBEZWFsaW5nIHdpdGggYmFkIGlub2RlcworICovCitzdGF0aWMgaW5saW5lIHZvaWQgdm5fbWFya19iYWQoc3RydWN0IHZub2RlICp2cCkKK3sKKwltYWtlX2JhZF9pbm9kZShMSU5WRlNfR0VUX0lQKHZwKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IFZOX0JBRChzdHJ1Y3Qgdm5vZGUgKnZwKQoreworCXJldHVybiBpc19iYWRfaW5vZGUoTElOVkZTX0dFVF9JUCh2cCkpOworfQorCisvKgorICogU29tZSB1c2VmdWwgcHJlZGljYXRlcy4KKyAqLworI2RlZmluZSBWTl9NQVBQRUQodnApCW1hcHBpbmdfbWFwcGVkKExJTlZGU19HRVRfSVAodnApLT5pX21hcHBpbmcpCisjZGVmaW5lIFZOX0NBQ0hFRCh2cCkJKExJTlZGU19HRVRfSVAodnApLT5pX21hcHBpbmctPm5ycGFnZXMpCisjZGVmaW5lIFZOX0RJUlRZKHZwKQltYXBwaW5nX3RhZ2dlZChMSU5WRlNfR0VUX0lQKHZwKS0+aV9tYXBwaW5nLCBcCisJCQkJCVBBR0VDQUNIRV9UQUdfRElSVFkpCisjZGVmaW5lIFZNT0RJRlkodnApCVZOX0ZMQUdTRVQodnAsIFZNT0RJRklFRCkKKyNkZWZpbmUgVlVOTU9ESUZZKHZwKQlWTl9GTEFHQ0xSKHZwLCBWTU9ESUZJRUQpCisKKy8qCisgKiBGbGFncyB0byBWT1BfU0VUQVRUUi9WT1BfR0VUQVRUUi4KKyAqLworI2RlZmluZQlBVFRSX1VUSU1FCTB4MDEJLyogbm9uLWRlZmF1bHQgdXRpbWUoMikgcmVxdWVzdCAqLworI2RlZmluZQlBVFRSX0RNSQkweDA4CS8qIGludm9jYXRpb24gZnJvbSBhIERNSSBmdW5jdGlvbiAqLworI2RlZmluZQlBVFRSX0xBWlkJMHg4MAkvKiBzZXQvZ2V0IGF0dHJpYnV0ZXMgbGF6aWx5ICovCisjZGVmaW5lCUFUVFJfTk9OQkxPQ0sJMHgxMDAJLyogcmV0dXJuIEVBR0FJTiBpZiBvcGVyYXRpb24gd291bGQgYmxvY2sgKi8KKworLyoKKyAqIEZsYWdzIHRvIFZPUF9GU1lOQyBhbmQgVk9QX1JFQ0xBSU0uCisgKi8KKyNkZWZpbmUgRlNZTkNfTk9XQUlUCTAJLyogYXN5bmNocm9ub3VzIGZsdXNoICovCisjZGVmaW5lIEZTWU5DX1dBSVQJMHgxCS8qIHN5bmNocm9ub3VzIGZzeW5jIG9yIGZvcmNlZCByZWNsYWltICovCisjZGVmaW5lIEZTWU5DX0lOVkFMCTB4MgkvKiBmbHVzaCBhbmQgaW52YWxpZGF0ZSBjYWNoZWQgZGF0YSAqLworI2RlZmluZSBGU1lOQ19EQVRBCTB4NAkvKiBzeW5jaHJvbm91cyBmc3luYyBvZiBkYXRhIG9ubHkgKi8KKworLyoKKyAqIFRyYWNraW5nIHZub2RlIGFjdGl2aXR5LgorICovCisjaWYgZGVmaW5lZChYRlNfVk5PREVfVFJBQ0UpCisKKyNkZWZpbmUJVk5PREVfVFJBQ0VfU0laRQkxNgkJLyogbnVtYmVyIG9mIHRyYWNlIGVudHJpZXMgKi8KKyNkZWZpbmUJVk5PREVfS1RSQUNFX0VOVFJZCTEKKyNkZWZpbmUJVk5PREVfS1RSQUNFX0VYSVQJMgorI2RlZmluZQlWTk9ERV9LVFJBQ0VfSE9MRAkzCisjZGVmaW5lCVZOT0RFX0tUUkFDRV9SRUYJNAorI2RlZmluZQlWTk9ERV9LVFJBQ0VfUkVMRQk1CisKK2V4dGVybiB2b2lkIHZuX3RyYWNlX2VudHJ5KHN0cnVjdCB2bm9kZSAqLCBjaGFyICosIGluc3RfdCAqKTsKK2V4dGVybiB2b2lkIHZuX3RyYWNlX2V4aXQoc3RydWN0IHZub2RlICosIGNoYXIgKiwgaW5zdF90ICopOworZXh0ZXJuIHZvaWQgdm5fdHJhY2VfaG9sZChzdHJ1Y3Qgdm5vZGUgKiwgY2hhciAqLCBpbnQsIGluc3RfdCAqKTsKK2V4dGVybiB2b2lkIHZuX3RyYWNlX3JlZihzdHJ1Y3Qgdm5vZGUgKiwgY2hhciAqLCBpbnQsIGluc3RfdCAqKTsKK2V4dGVybiB2b2lkIHZuX3RyYWNlX3JlbGUoc3RydWN0IHZub2RlICosIGNoYXIgKiwgaW50LCBpbnN0X3QgKik7CisKKyNkZWZpbmUJVk5fVFJBQ0UodnApCQlcCisJdm5fdHJhY2VfcmVmKHZwLCBfX0ZJTEVfXywgX19MSU5FX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKQorI2Vsc2UKKyNkZWZpbmUJdm5fdHJhY2VfZW50cnkoYSxiLGMpCisjZGVmaW5lCXZuX3RyYWNlX2V4aXQoYSxiLGMpCisjZGVmaW5lCXZuX3RyYWNlX2hvbGQoYSxiLGMsZCkKKyNkZWZpbmUJdm5fdHJhY2VfcmVmKGEsYixjLGQpCisjZGVmaW5lCXZuX3RyYWNlX3JlbGUoYSxiLGMsZCkKKyNkZWZpbmUJVk5fVFJBQ0UodnApCisjZW5kaWYKKworI2VuZGlmCS8qIF9fWEZTX1ZOT0RFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5jIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MGQyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmMKQEAgLTAsMCArMSwxNjQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLgkgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX3F1b3RhLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgInhmc19hY2wuaCIKKyNpbmNsdWRlICJ4ZnNfY2FwLmgiCisjaW5jbHVkZSAieGZzX21hYy5oIgorI2luY2x1ZGUgInhmc19hdHRyLmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zX3NwYWNlLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKKworI2luY2x1ZGUgInhmc19xbS5oIgorCisKKy8qCisgICBMT0NLIE9SREVSCisKKyAgIGlub2RlIGxvY2sJCSAgICAoaWxvY2spCisgICBkcXVvdCBoYXNoLWNoYWluIGxvY2sgICAgKGhhc2hsb2NrKQorICAgeHFtIGRxdW90IGZyZWVsaXN0IGxvY2sgIChmcmVlbGlzdGxvY2sKKyAgIG1vdW50J3MgZHF1b3QgbGlzdCBsb2NrICAobXBsaXN0bG9jaykKKyAgIHVzZXIgZHF1b3QgbG9jayAtIGxvY2sgb3JkZXJpbmcgYW1vbmcgZHF1b3RzIGlzIGJhc2VkIG9uIHRoZSB1aWQgb3IgZ2lkCisgICBncm91cCBkcXVvdCBsb2NrIC0gc2ltaWxhciB0byB1ZHF1b3RzLiBCZXR3ZWVuIHRoZSB0d28gZHF1b3RzLCB0aGUgdWRxdW90CisJCSAgICAgIGhhcyB0byBiZSBsb2NrZWQgZmlyc3QuCisgICBwaW4gbG9jayAtIHRoZSBkcXVvdCBsb2NrIG11c3QgYmUgaGVsZCB0byB0YWtlIHRoaXMgbG9jay4KKyAgIGZsdXNoIGxvY2sgLSBkaXR0by4KKyovCisKK1NUQVRJQyB2b2lkCQl4ZnNfcW1fZHFmbHVzaF9kb25lKHhmc19idWZfdCAqLCB4ZnNfZHFfbG9naXRlbV90ICopOworCisjaWZkZWYgREVCVUcKK3hmc19idWZ0YXJnX3QgKnhmc19kcWVycm9yX3RhcmdldDsKK2ludCB4ZnNfZG9fZHFlcnJvcjsKK2ludCB4ZnNfZHFyZXFfbnVtOworaW50IHhmc19kcWVycm9yX21vZCA9IDMzOworI2VuZGlmCisKKy8qCisgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIGRxdW90LiBXZSBkb24ndCBhbHdheXMgYWxsb2NhdGUgZnJlc2ggbWVtb3J5OworICogd2UgdHJ5IHRvIHJlY2xhaW0gYSBmcmVlIGRxdW90IGlmIHRoZSBudW1iZXIgb2YgaW5jb3JlIGRxdW90cyBhcmUgYWJvdmUKKyAqIGEgdGhyZXNob2xkLgorICogVGhlIG9ubHkgZmllbGQgaW5zaWRlIHRoZSBjb3JlIHRoYXQgZ2V0cyBpbml0aWFsaXplZCBhdCB0aGlzIHBvaW50CisgKiBpcyB0aGUgZF9pZCBmaWVsZC4gVGhlIGlkZWEgaXMgdG8gZmlsbCBpbiB0aGUgZW50aXJlIHFfY29yZQorICogd2hlbiB3ZSByZWFkIGluIHRoZSBvbiBkaXNrIGRxdW90LgorICovCit4ZnNfZHF1b3RfdCAqCit4ZnNfcW1fZHFpbml0KAorCXhmc19tb3VudF90ICAqbXAsCisJeGZzX2RxaWRfdCAgIGlkLAorCXVpbnQJICAgICB0eXBlKQoreworCXhmc19kcXVvdF90CSpkcXA7CisJYm9vbGVhbl90CWJyYW5kbmV3ZHF1b3Q7CisKKwlicmFuZG5ld2RxdW90ID0geGZzX3FtX2RxYWxsb2NfaW5jb3JlKCZkcXApOworCWRxcC0+ZHFfZmxhZ3MgPSB0eXBlOworCUlOVF9TRVQoZHFwLT5xX2NvcmUuZF9pZCwgQVJDSF9DT05WRVJULCBpZCk7CisJZHFwLT5xX21vdW50ID0gbXA7CisKKwkvKgorCSAqIE5vIG5lZWQgdG8gcmUtaW5pdGlhbGl6ZSB0aGVzZSBpZiB0aGlzIGlzIGEgcmVjbGFpbWVkIGRxdW90LgorCSAqLworCWlmIChicmFuZG5ld2RxdW90KSB7CisJCWRxcC0+ZHFfZmxuZXh0ID0gZHFwLT5kcV9mbHByZXYgPSBkcXA7CisJCW11dGV4X2luaXQoJmRxcC0+cV9xbG9jaywgIE1VVEVYX0RFRkFVTFQsICJ4ZHEiKTsKKwkJaW5pdG5zZW1hKCZkcXAtPnFfZmxvY2ssIDEsICJmZHEiKTsKKwkJc3ZfaW5pdCgmZHFwLT5xX3BpbndhaXQsIFNWX0RFRkFVTFQsICJwZHEiKTsKKworI2lmZGVmIFhGU19EUVVPVF9UUkFDRQorCQlkcXAtPnFfdHJhY2UgPSBrdHJhY2VfYWxsb2MoRFFVT1RfVFJBQ0VfU0laRSwgS01fU0xFRVApOworCQl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUUlOSVQiKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCS8qCisJCSAqIE9ubHkgdGhlIHFfY29yZSBwb3J0aW9uIHdhcyB6ZXJvZWQgaW4gZHFyZWNsYWltX29uZSgpLgorCQkgKiBTbywgd2UgbmVlZCB0byByZXNldCBvdGhlcnMuCisJCSAqLworCQkgZHFwLT5xX25yZWZzID0gMDsKKwkJIGRxcC0+cV9ibGtubyA9IDA7CisJCSBkcXAtPk1QTF9ORVhUID0gZHFwLT5ITF9ORVhUID0gTlVMTDsKKwkJIGRxcC0+SExfUFJFVlAgPSBkcXAtPk1QTF9QUkVWUCA9IE5VTEw7CisJCSBkcXAtPnFfYnVmb2Zmc2V0ID0gMDsKKwkJIGRxcC0+cV9maWxlb2Zmc2V0ID0gMDsKKwkJIGRxcC0+cV90cmFuc3AgPSBOVUxMOworCQkgZHFwLT5xX2dkcXVvdCA9IE5VTEw7CisJCSBkcXAtPnFfcmVzX2Jjb3VudCA9IDA7CisJCSBkcXAtPnFfcmVzX2ljb3VudCA9IDA7CisJCSBkcXAtPnFfcmVzX3J0YmNvdW50ID0gMDsKKwkJIGRxcC0+cV9waW5jb3VudCA9IDA7CisJCSBkcXAtPnFfaGFzaCA9IE5VTEw7CisJCSBBU1NFUlQoZHFwLT5kcV9mbG5leHQgPT0gZHFwLT5kcV9mbHByZXYpOworCisjaWZkZWYgWEZTX0RRVU9UX1RSQUNFCisJCSBBU1NFUlQoZHFwLT5xX3RyYWNlKTsKKwkJIHhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRUkVDTEFJTUVEX0lOSVQiKTsKKyNlbmRpZgorCSB9CisKKwkvKgorCSAqIGxvZyBpdGVtIGdldHMgaW5pdGlhbGl6ZWQgbGF0ZXIKKwkgKi8KKwlyZXR1cm4gKGRxcCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byBmcmVlIGFsbCB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBhIGRxdW90CisgKi8KK3ZvaWQKK3hmc19xbV9kcWRlc3Ryb3koCisJeGZzX2RxdW90X3QJKmRxcCkKK3sKKwlBU1NFUlQoISBYRlNfRFFfSVNfT05fRlJFRUxJU1QoZHFwKSk7CisKKwltdXRleF9kZXN0cm95KCZkcXAtPnFfcWxvY2spOworCWZyZWVzZW1hKCZkcXAtPnFfZmxvY2spOworCXN2X2Rlc3Ryb3koJmRxcC0+cV9waW53YWl0KTsKKworI2lmZGVmIFhGU19EUVVPVF9UUkFDRQorCWlmIChkcXAtPnFfdHJhY2UpCisJICAgICBrdHJhY2VfZnJlZShkcXAtPnFfdHJhY2UpOworCWRxcC0+cV90cmFjZSA9IE5VTEw7CisjZW5kaWYKKwlrbWVtX3pvbmVfZnJlZSh4ZnNfR3FtLT5xbV9kcXpvbmUsIGRxcCk7CisJYXRvbWljX2RlYygmeGZzX0dxbS0+cW1fdG90YWxkcXVvdHMpOworfQorCisvKgorICogVGhpcyBpcyB3aGF0IGEgJ2ZyZXNoJyBkcXVvdCBpbnNpZGUgYSBkcXVvdCBjaHVuayBsb29rcyBsaWtlIG9uIGRpc2suCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfcW1fZHFpbml0X2NvcmUoCisJeGZzX2RxaWRfdAlpZCwKKwl1aW50CQl0eXBlLAorCXhmc19kcWJsa190CSpkKQoreworCS8qCisJICogQ2FsbGVyIGhhcyB6ZXJvJ2QgdGhlIGVudGlyZSBkcXVvdCAnY2h1bmsnIGFscmVhZHkuCisJICovCisJSU5UX1NFVChkLT5kZF9kaXNrZHEuZF9tYWdpYywgQVJDSF9DT05WRVJULCBYRlNfRFFVT1RfTUFHSUMpOworCUlOVF9TRVQoZC0+ZGRfZGlza2RxLmRfdmVyc2lvbiwgQVJDSF9DT05WRVJULCBYRlNfRFFVT1RfVkVSU0lPTik7CisJSU5UX1NFVChkLT5kZF9kaXNrZHEuZF9pZCwgQVJDSF9DT05WRVJULCBpZCk7CisJSU5UX1NFVChkLT5kZF9kaXNrZHEuZF9mbGFncywgQVJDSF9DT05WRVJULCB0eXBlKTsKK30KKworCisjaWZkZWYgWEZTX0RRVU9UX1RSQUNFCisvKgorICogRHF1b3QgdHJhY2luZyBmb3IgZGVidWdnaW5nLgorICovCisvKiBBUkdTVVNFRCAqLwordm9pZAorX194ZnNfZHF0cmFjZV9lbnRyeSgKKwl4ZnNfZHF1b3RfdAkqZHFwLAorCWNoYXIJCSpmdW5jLAorCXZvaWQJCSpyZXRhZGRyLAorCXhmc19pbm9kZV90CSppcCkKK3sKKwl4ZnNfZHF1b3RfdAkqdWRxcCA9IE5VTEw7CisJeGZzX2lub190CWlubyA9IDA7CisKKwlBU1NFUlQoZHFwLT5xX3RyYWNlKTsKKwlpZiAoaXApIHsKKwkJaW5vID0gaXAtPmlfaW5vOworCQl1ZHFwID0gaXAtPmlfdWRxdW90OworCX0KKwlrdHJhY2VfZW50ZXIoZHFwLT5xX3RyYWNlLAorCQkgICAgICh2b2lkICopKF9fcHNpbnRfdClEUVVPVF9LVFJBQ0VfRU5UUlksCisJCSAgICAgKHZvaWQgKilmdW5jLAorCQkgICAgICh2b2lkICopKF9fcHNpbnRfdClkcXAtPnFfbnJlZnMsCisJCSAgICAgKHZvaWQgKikoX19wc2ludF90KWRxcC0+ZHFfZmxhZ3MsCisJCSAgICAgKHZvaWQgKikoX19wc2ludF90KWRxcC0+cV9yZXNfYmNvdW50LAorCQkgICAgICh2b2lkICopKF9fcHNpbnRfdClJTlRfR0VUKGRxcC0+cV9jb3JlLmRfYmNvdW50LAorCQkJCQkJQVJDSF9DT05WRVJUKSwKKwkJICAgICAodm9pZCAqKShfX3BzaW50X3QpSU5UX0dFVChkcXAtPnFfY29yZS5kX2ljb3VudCwKKwkJCQkJCUFSQ0hfQ09OVkVSVCksCisJCSAgICAgKHZvaWQgKikoX19wc2ludF90KUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9ibGtfaGFyZGxpbWl0LAorCQkJCQkJQVJDSF9DT05WRVJUKSwKKwkJICAgICAodm9pZCAqKShfX3BzaW50X3QpSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jsa19zb2Z0bGltaXQsCisJCQkJCQlBUkNIX0NPTlZFUlQpLAorCQkgICAgICh2b2lkICopKF9fcHNpbnRfdClJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaW5vX2hhcmRsaW1pdCwKKwkJCQkJCUFSQ0hfQ09OVkVSVCksCisJCSAgICAgKHZvaWQgKikoX19wc2ludF90KUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9pbm9fc29mdGxpbWl0LAorCQkJCQkJQVJDSF9DT05WRVJUKSwKKwkJICAgICAodm9pZCAqKShfX3BzaW50X3QpSU5UX0dFVChkcXAtPnFfY29yZS5kX2lkLCBBUkNIX0NPTlZFUlQpLAorCQkgICAgICh2b2lkICopKF9fcHNpbnRfdCljdXJyZW50X3BpZCgpLAorCQkgICAgICh2b2lkICopKF9fcHNpbnRfdClpbm8sCisJCSAgICAgKHZvaWQgKikoX19wc2ludF90KXJldGFkZHIsCisJCSAgICAgKHZvaWQgKikoX19wc2ludF90KXVkcXApOworCXJldHVybjsKK30KKyNlbmRpZgorCisKKy8qCisgKiBJZiBkZWZhdWx0IGxpbWl0cyBhcmUgaW4gZm9yY2UsIHB1c2ggdGhlbSBpbnRvIHRoZSBkcXVvdCBub3cuCisgKiBXZSBvdmVyd3JpdGUgdGhlIGRxdW90IGxpbWl0cyBvbmx5IGlmIHRoZXkgYXJlIHplcm8gYW5kIHRoaXMKKyAqIGlzIG5vdCB0aGUgcm9vdCBkcXVvdC4KKyAqLwordm9pZAoreGZzX3FtX2FkanVzdF9kcWxpbWl0cygKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXhmc19kaXNrX2RxdW90X3QJKmQpCit7CisJeGZzX3F1b3RhaW5mb190CQkqcSA9IG1wLT5tX3F1b3RhaW5mbzsKKworCUFTU0VSVChkLT5kX2lkKTsKKworCWlmIChxLT5xaV9ic29mdGxpbWl0ICYmICFkLT5kX2Jsa19zb2Z0bGltaXQpCisJCUlOVF9TRVQoZC0+ZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQsIHEtPnFpX2Jzb2Z0bGltaXQpOworCWlmIChxLT5xaV9iaGFyZGxpbWl0ICYmICFkLT5kX2Jsa19oYXJkbGltaXQpCisJCUlOVF9TRVQoZC0+ZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQsIHEtPnFpX2JoYXJkbGltaXQpOworCWlmIChxLT5xaV9pc29mdGxpbWl0ICYmICFkLT5kX2lub19zb2Z0bGltaXQpCisJCUlOVF9TRVQoZC0+ZF9pbm9fc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQsIHEtPnFpX2lzb2Z0bGltaXQpOworCWlmIChxLT5xaV9paGFyZGxpbWl0ICYmICFkLT5kX2lub19oYXJkbGltaXQpCisJCUlOVF9TRVQoZC0+ZF9pbm9faGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQsIHEtPnFpX2loYXJkbGltaXQpOworCWlmIChxLT5xaV9ydGJzb2Z0bGltaXQgJiYgIWQtPmRfcnRiX3NvZnRsaW1pdCkKKwkJSU5UX1NFVChkLT5kX3J0Yl9zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCwgcS0+cWlfcnRic29mdGxpbWl0KTsKKwlpZiAocS0+cWlfcnRiaGFyZGxpbWl0ICYmICFkLT5kX3J0Yl9oYXJkbGltaXQpCisJCUlOVF9TRVQoZC0+ZF9ydGJfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQsIHEtPnFpX3J0YmhhcmRsaW1pdCk7Cit9CisKKy8qCisgKiBDaGVjayB0aGUgbGltaXRzIGFuZCB0aW1lcnMgb2YgYSBkcXVvdCBhbmQgc3RhcnQgb3IgcmVzZXQgdGltZXJzCisgKiBpZiBuZWNlc3NhcnkuCisgKiBUaGlzIGdldHMgY2FsbGVkIGV2ZW4gd2hlbiBxdW90YSBlbmZvcmNlbWVudCBpcyBPRkYsIHdoaWNoIG1ha2VzIG91cgorICogbGlmZSBhIGxpdHRsZSBsZXNzIGNvbXBsaWNhdGVkLiAoV2UganVzdCBkb24ndCByZWplY3QgYW55IHF1b3RhCisgKiByZXNlcnZhdGlvbnMgaW4gdGhhdCBjYXNlLCB3aGVuIGVuZm9yY2VtZW50IGlzIG9mZikuCisgKiBXZSBhbHNvIHJldHVybiAwIGFzIHRoZSB2YWx1ZXMgb2YgdGhlIHRpbWVycyBpbiBRX0dFVFFVT1RBIGNhbGxzLCB3aGVuCisgKiBlbmZvcmNlbWVudCdzIG9mZi4KKyAqIEluIGNvbnRyYXN0LCB3YXJuaW5ncyBhcmUgYSBsaXR0bGUgZGlmZmVyZW50IGluIHRoYXQgdGhleSBkb24ndAorICogJ2F1dG9tYXRpY2FsbHknIGdldCBzdGFydGVkIHdoZW4gbGltaXRzIGdldCBleGNlZWRlZC4KKyAqLwordm9pZAoreGZzX3FtX2FkanVzdF9kcXRpbWVycygKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXhmc19kaXNrX2RxdW90X3QJKmQpCit7CisJQVNTRVJUKGQtPmRfaWQpOworCisjaWZkZWYgUVVPVEFERUJVRworCWlmIChJTlRfR0VUKGQtPmRfYmxrX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKSkKKwkJQVNTRVJUKElOVF9HRVQoZC0+ZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpIDw9CisJCQlJTlRfR0VUKGQtPmRfYmxrX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKSk7CisJaWYgKElOVF9HRVQoZC0+ZF9pbm9faGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpKQorCQlBU1NFUlQoSU5UX0dFVChkLT5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkgPD0KKwkJCUlOVF9HRVQoZC0+ZF9pbm9faGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpKTsKKwlpZiAoSU5UX0dFVChkLT5kX3J0Yl9oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkpCisJCUFTU0VSVChJTlRfR0VUKGQtPmRfcnRiX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSA8PQorCQkJSU5UX0dFVChkLT5kX3J0Yl9oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkpOworI2VuZGlmCisJaWYgKCFkLT5kX2J0aW1lcikgeworCQlpZiAoKElOVF9HRVQoZC0+ZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpICYmCisJCSAgICAoSU5UX0dFVChkLT5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSA+PQorCQkJCUlOVF9HRVQoZC0+ZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpKSkgfHwKKwkJICAgIChJTlRfR0VUKGQtPmRfYmxrX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKSAmJgorCQkgICAgKElOVF9HRVQoZC0+ZF9iY291bnQsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQlJTlRfR0VUKGQtPmRfYmxrX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKSkpKSB7CisJCQlJTlRfU0VUKGQtPmRfYnRpbWVyLCBBUkNIX0NPTlZFUlQsCisJCQkJZ2V0X3NlY29uZHMoKSArIFhGU19RSV9CVElNRUxJTUlUKG1wKSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKCFkLT5kX2Jsa19zb2Z0bGltaXQgfHwKKwkJICAgIChJTlRfR0VUKGQtPmRfYmNvdW50LCBBUkNIX0NPTlZFUlQpIDwKKwkJCQlJTlRfR0VUKGQtPmRfYmxrX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSkpICYmCisJCSAgICAoIWQtPmRfYmxrX2hhcmRsaW1pdCB8fAorCQkgICAgKElOVF9HRVQoZC0+ZF9iY291bnQsIEFSQ0hfQ09OVkVSVCkgPAorCQkJCUlOVF9HRVQoZC0+ZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpKSkpIHsKKwkJCWQtPmRfYnRpbWVyID0gMDsKKwkJfQorCX0KKworCWlmICghZC0+ZF9pdGltZXIpIHsKKwkJaWYgKChJTlRfR0VUKGQtPmRfaW5vX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSAmJgorCQkgICAgKElOVF9HRVQoZC0+ZF9pY291bnQsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQlJTlRfR0VUKGQtPmRfaW5vX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSkpIHx8CisJCSAgICAoSU5UX0dFVChkLT5kX2lub19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkgJiYKKwkJICAgIChJTlRfR0VUKGQtPmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpID49CisJCQkJSU5UX0dFVChkLT5kX2lub19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkpKSkgeworCQkJSU5UX1NFVChkLT5kX2l0aW1lciwgQVJDSF9DT05WRVJULAorCQkJCWdldF9zZWNvbmRzKCkgKyBYRlNfUUlfSVRJTUVMSU1JVChtcCkpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCghZC0+ZF9pbm9fc29mdGxpbWl0IHx8CisJCSAgICAoSU5UX0dFVChkLT5kX2ljb3VudCwgQVJDSF9DT05WRVJUKSA8CisJCQkJSU5UX0dFVChkLT5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpKSAgJiYKKwkJICAgICghZC0+ZF9pbm9faGFyZGxpbWl0IHx8CisJCSAgICAoSU5UX0dFVChkLT5kX2ljb3VudCwgQVJDSF9DT05WRVJUKSA8CisJCQkJSU5UX0dFVChkLT5kX2lub19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkpKSkgeworCQkJZC0+ZF9pdGltZXIgPSAwOworCQl9CisJfQorCisJaWYgKCFkLT5kX3J0YnRpbWVyKSB7CisJCWlmICgoSU5UX0dFVChkLT5kX3J0Yl9zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkgJiYKKwkJICAgIChJTlRfR0VUKGQtPmRfcnRiY291bnQsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQlJTlRfR0VUKGQtPmRfcnRiX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSkpIHx8CisJCSAgICAoSU5UX0dFVChkLT5kX3J0Yl9oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkgJiYKKwkJICAgIChJTlRfR0VUKGQtPmRfcnRiY291bnQsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQlJTlRfR0VUKGQtPmRfcnRiX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKSkpKSB7CisJCQlJTlRfU0VUKGQtPmRfcnRidGltZXIsIEFSQ0hfQ09OVkVSVCwKKwkJCQlnZXRfc2Vjb25kcygpICsgWEZTX1FJX1JUQlRJTUVMSU1JVChtcCkpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCghZC0+ZF9ydGJfc29mdGxpbWl0IHx8CisJCSAgICAoSU5UX0dFVChkLT5kX3J0YmNvdW50LCBBUkNIX0NPTlZFUlQpIDwKKwkJCQlJTlRfR0VUKGQtPmRfcnRiX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSkpICYmCisJCSAgICAoIWQtPmRfcnRiX2hhcmRsaW1pdCB8fAorCQkgICAgKElOVF9HRVQoZC0+ZF9ydGJjb3VudCwgQVJDSF9DT05WRVJUKSA8CisJCQkJSU5UX0dFVChkLT5kX3J0Yl9oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkpKSkgeworCQkJZC0+ZF9ydGJ0aW1lciA9IDA7CisJCX0KKwl9Cit9CisKKy8qCisgKiBJbmNyZW1lbnQgb3IgcmVzZXQgd2FybmluZ3Mgb2YgYSBnaXZlbiBkcXVvdC4KKyAqLworaW50Cit4ZnNfcW1fZHF3YXJuKAorCXhmc19kaXNrX2RxdW90X3QJKmQsCisJdWludAkJCWZsYWdzKQoreworCWludAl3YXJuZWQ7CisKKwkvKgorCSAqIHJvb3QncyBsaW1pdHMgYXJlIG5vdCByZWFsIGxpbWl0cy4KKwkgKi8KKwlpZiAoIWQtPmRfaWQpCisJCXJldHVybiAoMCk7CisKKwl3YXJuZWQgPSAwOworCWlmIChJTlRfR0VUKGQtPmRfYmxrX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSAmJgorCSAgICAoSU5UX0dFVChkLT5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSA+PQorCSAgICAgSU5UX0dFVChkLT5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpKSB7CisJCWlmIChmbGFncyAmIFhGU19RTU9QVF9ET1dBUk4pIHsKKwkJCUlOVF9NT0QoZC0+ZF9id2FybnMsIEFSQ0hfQ09OVkVSVCwgKzEpOworCQkJd2FybmVkKys7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIWQtPmRfYmxrX3NvZnRsaW1pdCB8fAorCQkgICAgKElOVF9HRVQoZC0+ZF9iY291bnQsIEFSQ0hfQ09OVkVSVCkgPAorCQkgICAgIElOVF9HRVQoZC0+ZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpKSkgeworCQkJZC0+ZF9id2FybnMgPSAwOworCQl9CisJfQorCisJaWYgKElOVF9HRVQoZC0+ZF9pbm9fc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpID4gMCAmJgorCSAgICAoSU5UX0dFVChkLT5kX2ljb3VudCwgQVJDSF9DT05WRVJUKSA+PQorCSAgICAgSU5UX0dFVChkLT5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpKSB7CisJCWlmIChmbGFncyAmIFhGU19RTU9QVF9ET1dBUk4pIHsKKwkJCUlOVF9NT0QoZC0+ZF9pd2FybnMsIEFSQ0hfQ09OVkVSVCwgKzEpOworCQkJd2FybmVkKys7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIWQtPmRfaW5vX3NvZnRsaW1pdCB8fAorCQkgICAgKElOVF9HRVQoZC0+ZF9pY291bnQsIEFSQ0hfQ09OVkVSVCkgPAorCQkgICAgIElOVF9HRVQoZC0+ZF9pbm9fc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpKSkgeworCQkJZC0+ZF9pd2FybnMgPSAwOworCQl9CisJfQorI2lmZGVmIFFVT1RBREVCVUcKKwlpZiAoSU5UX0dFVChkLT5kX2l3YXJucywgQVJDSF9DT05WRVJUKSkKKwkJY21uX2VycihDRV9ERUJVRywKKwkJCSItLS0tLS0tLUBASW5vZGUgd2FybmluZ3MgcnVubmluZyA6ICVMdSA+PSAlTHUiLAorCQkJSU5UX0dFVChkLT5kX2ljb3VudCwgQVJDSF9DT05WRVJUKSwKKwkJCUlOVF9HRVQoZC0+ZF9pbm9fc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpKTsKKwlpZiAoSU5UX0dFVChkLT5kX2J3YXJucywgQVJDSF9DT05WRVJUKSkKKwkJY21uX2VycihDRV9ERUJVRywKKwkJCSItLS0tLS0tLUBAQmxrcyB3YXJuaW5ncyBydW5uaW5nIDogJUx1ID49ICVMdSIsCisJCQlJTlRfR0VUKGQtPmRfYmNvdW50LCBBUkNIX0NPTlZFUlQpLAorCQkJSU5UX0dFVChkLT5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpOworI2VuZGlmCisJcmV0dXJuICh3YXJuZWQpOworfQorCisKKy8qCisgKiBpbml0aWFsaXplIGEgYnVmZmVyIGZ1bGwgb2YgZHF1b3RzIGFuZCBsb2cgdGhlIHdob2xlIHRoaW5nCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfcW1faW5pdF9kcXVvdF9ibGsoCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19tb3VudF90CSptcCwKKwl4ZnNfZHFpZF90CWlkLAorCXVpbnQJCXR5cGUsCisJeGZzX2J1Zl90CSpicCkKK3sKKwl4ZnNfZHFibGtfdAkqZDsKKwlpbnQJCWN1cmlkLCBpOworCisJQVNTRVJUKHRwKTsKKwlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKKwlBU1NFUlQoWEZTX0JVRl9WQUxVU0VNQShicCkgPD0gMCk7CisKKwlkID0gKHhmc19kcWJsa190ICopWEZTX0JVRl9QVFIoYnApOworCisJLyoKKwkgKiBJRCBvZiB0aGUgZmlyc3QgZHF1b3QgaW4gdGhlIGJsb2NrIC0gaWQncyBhcmUgemVybyBiYXNlZC4KKwkgKi8KKwljdXJpZCA9IGlkIC0gKGlkICUgWEZTX1FNX0RRUEVSQkxLKG1wKSk7CisJQVNTRVJUKGN1cmlkID49IDApOworCW1lbXNldChkLCAwLCBCQlRPQihYRlNfUUlfRFFDSFVOS0xFTihtcCkpKTsKKwlmb3IgKGkgPSAwOyBpIDwgWEZTX1FNX0RRUEVSQkxLKG1wKTsgaSsrLCBkKyssIGN1cmlkKyspCisJCXhmc19xbV9kcWluaXRfY29yZShjdXJpZCwgdHlwZSwgZCk7CisJeGZzX3RyYW5zX2RxdW90X2J1Zih0cCwgYnAsCisJCQkgICAgdHlwZSAmIFhGU19EUV9VU0VSID8KKwkJCSAgICBYRlNfQkxJX1VEUVVPVF9CVUYgOgorCQkJICAgIFhGU19CTElfR0RRVU9UX0JVRik7CisJeGZzX3RyYW5zX2xvZ19idWYodHAsIGJwLCAwLCBCQlRPQihYRlNfUUlfRFFDSFVOS0xFTihtcCkpIC0gMSk7Cit9CisKKworCisvKgorICogQWxsb2NhdGUgYSBibG9jayBhbmQgZmlsbCBpdCB3aXRoIGRxdW90cy4KKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGJtYXBpIGZpbmRzIGEgaG9sZS4KKyAqLworU1RBVElDIGludAoreGZzX3FtX2RxYWxsb2MoCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19tb3VudF90CSptcCwKKwl4ZnNfZHF1b3RfdAkqZHFwLAorCXhmc19pbm9kZV90CSpxdW90aXAsCisJeGZzX2ZpbGVvZmZfdAlvZmZzZXRfZnNiLAorCXhmc19idWZfdAkqKk9fYnBwKQoreworCXhmc19mc2Jsb2NrX3QJZmlyc3RibG9jazsKKwl4ZnNfYm1hcF9mcmVlX3QgZmxpc3Q7CisJeGZzX2JtYnRfaXJlY190IG1hcDsKKwlpbnQJCW5tYXBzLCBlcnJvciwgY29tbWl0dGVkOworCXhmc19idWZfdAkqYnA7CisKKwlBU1NFUlQodHAgIT0gTlVMTCk7CisJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiRFFBTExPQyIpOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBibWFwIGZyZWVsaXN0IHByaW9yIHRvIGNhbGxpbmcgYm1hcGkgY29kZS4KKwkgKi8KKwlYRlNfQk1BUF9JTklUKCZmbGlzdCwgJmZpcnN0YmxvY2spOworCXhmc19pbG9jayhxdW90aXAsIFhGU19JTE9DS19FWENMKTsKKwkvKgorCSAqIFJldHVybiBpZiB0aGlzIHR5cGUgb2YgcXVvdGFzIGlzIHR1cm5lZCBvZmYgd2hpbGUgd2UgZGlkbid0CisJICogaGF2ZSBhbiBpbm9kZSBsb2NrCisJICovCisJaWYgKFhGU19JU19USElTX1FVT1RBX09GRihkcXApKSB7CisJCXhmc19pdW5sb2NrKHF1b3RpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQlyZXR1cm4gKEVTUkNIKTsKKwl9CisKKwkvKgorCSAqIHhmc190cmFuc19jb21taXQgbm9ybWFsbHkgZGVjcmVtZW50cyB0aGUgdm5vZGUgcmVmIGNvdW50CisJICogd2hlbiBpdCB1bmxvY2tzIHRoZSBpbm9kZS4gU2luY2Ugd2Ugd2FudCB0byBrZWVwIHRoZSBxdW90YQorCSAqIGlub2RlIGFyb3VuZCwgd2UgYnVtcCB0aGUgdm5vZGUgcmVmIGNvdW50IG5vdy4KKwkgKi8KKwlWTl9IT0xEKFhGU19JVE9WKHF1b3RpcCkpOworCisJeGZzX3RyYW5zX2lqb2luKHRwLCBxdW90aXAsIFhGU19JTE9DS19FWENMKTsKKwlubWFwcyA9IDE7CisJaWYgKChlcnJvciA9IHhmc19ibWFwaSh0cCwgcXVvdGlwLAorCQkJICAgICAgb2Zmc2V0X2ZzYiwgWEZTX0RRVU9UX0NMVVNURVJfU0laRV9GU0IsCisJCQkgICAgICBYRlNfQk1BUElfTUVUQURBVEEgfCBYRlNfQk1BUElfV1JJVEUsCisJCQkgICAgICAmZmlyc3RibG9jaywKKwkJCSAgICAgIFhGU19RTV9EUUFMTE9DX1NQQUNFX1JFUyhtcCksCisJCQkgICAgICAmbWFwLCAmbm1hcHMsICZmbGlzdCkpKSB7CisJCWdvdG8gZXJyb3IwOworCX0KKwlBU1NFUlQobWFwLmJyX2Jsb2NrY291bnQgPT0gWEZTX0RRVU9UX0NMVVNURVJfU0laRV9GU0IpOworCUFTU0VSVChubWFwcyA9PSAxKTsKKwlBU1NFUlQoKG1hcC5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSykgJiYKKwkgICAgICAgKG1hcC5icl9zdGFydGJsb2NrICE9IEhPTEVTVEFSVEJMT0NLKSk7CisKKwkvKgorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIGJsa25vIHRvIHNhdmUgYSBsb29rdXAgbGF0ZXIKKwkgKi8KKwlkcXAtPnFfYmxrbm8gPSBYRlNfRlNCX1RPX0RBRERSKG1wLCBtYXAuYnJfc3RhcnRibG9jayk7CisKKwkvKiBub3cgd2UgY2FuIGp1c3QgZ2V0IHRoZSBidWZmZXIgKHRoZXJlJ3Mgbm90aGluZyB0byByZWFkIHlldCkgKi8KKwlicCA9IHhmc190cmFuc19nZXRfYnVmKHRwLCBtcC0+bV9kZGV2X3RhcmdwLAorCQkJICAgICAgIGRxcC0+cV9ibGtubywKKwkJCSAgICAgICBYRlNfUUlfRFFDSFVOS0xFTihtcCksCisJCQkgICAgICAgMCk7CisJaWYgKCFicCB8fCAoZXJyb3IgPSBYRlNfQlVGX0dFVEVSUk9SKGJwKSkpCisJCWdvdG8gZXJyb3IxOworCS8qCisJICogTWFrZSBhIGNodW5rIG9mIGRxdW90cyBvdXQgb2YgdGhpcyBidWZmZXIgYW5kIGxvZworCSAqIHRoZSBlbnRpcmUgdGhpbmcuCisJICovCisJeGZzX3FtX2luaXRfZHF1b3RfYmxrKHRwLCBtcCwgSU5UX0dFVChkcXAtPnFfY29yZS5kX2lkLCBBUkNIX0NPTlZFUlQpLAorCQkJICAgICAgZHFwLT5kcV9mbGFncyAmIChYRlNfRFFfVVNFUnxYRlNfRFFfR1JPVVApLAorCQkJICAgICAgYnApOworCisJaWYgKChlcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmdHAsICZmbGlzdCwgZmlyc3RibG9jaywgJmNvbW1pdHRlZCkpKSB7CisJCWdvdG8gZXJyb3IxOworCX0KKworCSpPX2JwcCA9IGJwOworCXJldHVybiAwOworCisgICAgICBlcnJvcjE6CisJeGZzX2JtYXBfY2FuY2VsKCZmbGlzdCk7CisgICAgICBlcnJvcjA6CisJeGZzX2l1bmxvY2socXVvdGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwlyZXR1cm4gKGVycm9yKTsKK30KKworLyoKKyAqIE1hcHMgYSBkcXVvdCB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgaXRzIG9uLWRpc2sgdmVyc2lvbi4KKyAqIFRoaXMgcmV0dXJucyBhIHB0ciB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIG9uLWRpc2sgZHF1b3QKKyAqIGluIHRoZSBicHAgcGFyYW0sIGFuZCBhIHB0ciB0byB0aGUgb24tZGlzayBkcXVvdCB3aXRoaW4gdGhhdCBidWZmZXIKKyAqLworU1RBVElDIGludAoreGZzX3FtX2RxdG9icCgKKwl4ZnNfdHJhbnNfdAkJKnRwLAorCXhmc19kcXVvdF90CQkqZHFwLAorCXhmc19kaXNrX2RxdW90X3QJKipPX2RkcHAsCisJeGZzX2J1Zl90CQkqKk9fYnBwLAorCXVpbnQJCQlmbGFncykKK3sKKwl4ZnNfYm1idF9pcmVjX3QgbWFwOworCWludAkJbm1hcHMsIGVycm9yOworCXhmc19idWZfdAkqYnA7CisJeGZzX2lub2RlX3QJKnF1b3RpcDsKKwl4ZnNfbW91bnRfdAkqbXA7CisJeGZzX2Rpc2tfZHF1b3RfdCAqZGRxOworCXhmc19kcWlkX3QJaWQ7CisJYm9vbGVhbl90CW5ld2RxdW90OworCisJbXAgPSBkcXAtPnFfbW91bnQ7CisJaWQgPSBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCk7CisJbm1hcHMgPSAxOworCW5ld2RxdW90ID0gQl9GQUxTRTsKKworCS8qCisJICogSWYgd2UgZG9uJ3Qga25vdyB3aGVyZSB0aGUgZHF1b3QgbGl2ZXMsIGZpbmQgb3V0LgorCSAqLworCWlmIChkcXAtPnFfYmxrbm8gPT0gKHhmc19kYWRkcl90KSAwKSB7CisJCS8qIFdlIHVzZSB0aGUgaWQgYXMgYW4gaW5kZXggKi8KKwkJZHFwLT5xX2ZpbGVvZmZzZXQgPSAoeGZzX2ZpbGVvZmZfdCkgKCh1aW50KWlkIC8KKwkJCQkJCSAgICAgWEZTX1FNX0RRUEVSQkxLKG1wKSk7CisJCW5tYXBzID0gMTsKKwkJcXVvdGlwID0gWEZTX0RRX1RPX1FJUChkcXApOworCQl4ZnNfaWxvY2socXVvdGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwkJLyoKKwkJICogUmV0dXJuIGlmIHRoaXMgdHlwZSBvZiBxdW90YXMgaXMgdHVybmVkIG9mZiB3aGlsZSB3ZSBkaWRuJ3QKKwkJICogaGF2ZSBhbiBpbm9kZSBsb2NrCisJCSAqLworCQlpZiAoWEZTX0lTX1RISVNfUVVPVEFfT0ZGKGRxcCkpIHsKKwkJCXhmc19pdW5sb2NrKHF1b3RpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJCQlyZXR1cm4gKEVTUkNIKTsKKwkJfQorCQkvKgorCQkgKiBGaW5kIHRoZSBibG9jayBtYXA7IG5vIGFsbG9jYXRpb25zIHlldAorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgcXVvdGlwLCBkcXAtPnFfZmlsZW9mZnNldCwKKwkJCQkgIFhGU19EUVVPVF9DTFVTVEVSX1NJWkVfRlNCLAorCQkJCSAgWEZTX0JNQVBJX01FVEFEQVRBLAorCQkJCSAgTlVMTCwgMCwgJm1hcCwgJm5tYXBzLCBOVUxMKTsKKworCQl4ZnNfaXVubG9jayhxdW90aXAsIFhGU19JTE9DS19TSEFSRUQpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gKGVycm9yKTsKKwkJQVNTRVJUKG5tYXBzID09IDEpOworCQlBU1NFUlQobWFwLmJyX2Jsb2NrY291bnQgPT0gMSk7CisKKwkJLyoKKwkJICogb2Zmc2V0IG9mIGRxdW90IGluIHRoZSAoZml4ZWQgc2l6ZWQpIGRxdW90IGNodW5rLgorCQkgKi8KKwkJZHFwLT5xX2J1Zm9mZnNldCA9IChpZCAlIFhGU19RTV9EUVBFUkJMSyhtcCkpICoKKwkJCXNpemVvZih4ZnNfZHFibGtfdCk7CisJCWlmIChtYXAuYnJfc3RhcnRibG9jayA9PSBIT0xFU1RBUlRCTE9DSykgeworCQkJLyoKKwkJCSAqIFdlIGRvbid0IGFsbG9jYXRlIHVubGVzcyB3ZSdyZSBhc2tlZCB0bworCQkJICovCisJCQlpZiAoIShmbGFncyAmIFhGU19RTU9QVF9EUUFMTE9DKSkKKwkJCQlyZXR1cm4gKEVOT0VOVCk7CisKKwkJCUFTU0VSVCh0cCk7CisJCQlpZiAoKGVycm9yID0geGZzX3FtX2RxYWxsb2ModHAsIG1wLCBkcXAsIHF1b3RpcCwKKwkJCQkJCWRxcC0+cV9maWxlb2Zmc2V0LCAmYnApKSkKKwkJCQlyZXR1cm4gKGVycm9yKTsKKwkJCW5ld2RxdW90ID0gQl9UUlVFOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIHN0b3JlIHRoZSBibGtubyBldGMgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGRvIHRoZQorCQkJICogbWFwcGluZyBhbGwgdGhlIHRpbWUKKwkJCSAqLworCQkJZHFwLT5xX2Jsa25vID0gWEZTX0ZTQl9UT19EQUREUihtcCwgbWFwLmJyX3N0YXJ0YmxvY2spOworCQl9CisJfQorCUFTU0VSVChkcXAtPnFfYmxrbm8gIT0gREVMQVlTVEFSVEJMT0NLKTsKKwlBU1NFUlQoZHFwLT5xX2Jsa25vICE9IEhPTEVTVEFSVEJMT0NLKTsKKworCS8qCisJICogUmVhZCBpbiB0aGUgYnVmZmVyLCB1bmxlc3Mgd2UndmUganVzdCBkb25lIHRoZSBhbGxvY2F0aW9uCisJICogKGluIHdoaWNoIGNhc2Ugd2UgYWxyZWFkeSBoYXZlIHRoZSBidWYpLgorCSAqLworCWlmICghIG5ld2RxdW90KSB7CisJCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRVE9CUCBSRUFEQlVGIik7CisJCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfcmVhZF9idWYobXAsIHRwLCBtcC0+bV9kZGV2X3RhcmdwLAorCQkJCQkgICAgICAgZHFwLT5xX2Jsa25vLAorCQkJCQkgICAgICAgWEZTX1FJX0RRQ0hVTktMRU4obXApLAorCQkJCQkgICAgICAgMCwgJmJwKSkpIHsKKwkJCXJldHVybiAoZXJyb3IpOworCQl9CisJCWlmIChlcnJvciB8fCAhYnApCisJCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKKwl9CisJQVNTRVJUKFhGU19CVUZfSVNCVVNZKGJwKSk7CisJQVNTRVJUKFhGU19CVUZfVkFMVVNFTUEoYnApIDw9IDApOworCisJLyoKKwkgKiBjYWxjdWxhdGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBkcXVvdCBpbnNpZGUgdGhlIGJ1ZmZlci4KKwkgKi8KKwlkZHEgPSAoeGZzX2Rpc2tfZHF1b3RfdCAqKSgoY2hhciAqKVhGU19CVUZfUFRSKGJwKSArIGRxcC0+cV9idWZvZmZzZXQpOworCisJLyoKKwkgKiBBIHNpbXBsZSBzYW5pdHkgY2hlY2sgaW4gY2FzZSB3ZSBnb3QgYSBjb3JydXB0ZWQgZHF1b3QuLi4KKwkgKi8KKwlpZiAoeGZzX3FtX2RxY2hlY2soZGRxLCBpZCwKKwkJCSAgIGRxcC0+ZHFfZmxhZ3MgJiAoWEZTX0RRX1VTRVJ8WEZTX0RRX0dST1VQKSwKKwkJCSAgIGZsYWdzICYgKFhGU19RTU9QVF9EUVJFUEFJUnxYRlNfUU1PUFRfRE9XQVJOKSwKKwkJCSAgICJkcXRvYnAiKSkgeworCQlpZiAoIShmbGFncyAmIFhGU19RTU9QVF9EUVJFUEFJUikpIHsKKwkJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwkJfQorCQlYRlNfQlVGX0JVU1koYnApOyAvKiBXZSBkaXJ0aWVkIHRoaXMgKi8KKwl9CisKKwkqT19icHAgPSBicDsKKwkqT19kZHBwID0gZGRxOworCisJcmV0dXJuICgwKTsKK30KKworCisvKgorICogUmVhZCBpbiB0aGUgb25kaXNrIGRxdW90IHVzaW5nIGRxdG9icCgpIHRoZW4gY29weSBpdCB0byBhbiBpbmNvcmUgdmVyc2lvbiwKKyAqIGFuZCByZWxlYXNlIHRoZSBidWZmZXIgaW1tZWRpYXRlbHkuCisgKgorICovCisvKiBBUkdTVVNFRCAqLworU1RBVElDIGludAoreGZzX3FtX2RxcmVhZCgKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX2RxaWRfdAlpZCwKKwl4ZnNfZHF1b3RfdAkqZHFwLAkvKiBkcXVvdCB0byBnZXQgZmlsbGVkIGluICovCisJdWludAkJZmxhZ3MpCit7CisJeGZzX2Rpc2tfZHF1b3RfdCAqZGRxcDsKKwl4ZnNfYnVmX3QJICpicDsKKwlpbnQJCSBlcnJvcjsKKworCS8qCisJICogZ2V0IGEgcG9pbnRlciB0byB0aGUgb24tZGlzayBkcXVvdCBhbmQgdGhlIGJ1ZmZlciBjb250YWluaW5nIGl0CisJICogZHFwIGFscmVhZHkga25vd3MgaXRzIG93biB0eXBlIChHUk9VUC9VU0VSKS4KKwkgKi8KKwl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUVJFQUQiKTsKKwlpZiAoKGVycm9yID0geGZzX3FtX2RxdG9icCh0cCwgZHFwLCAmZGRxcCwgJmJwLCBmbGFncykpKSB7CisJCXJldHVybiAoZXJyb3IpOworCX0KKworCS8qIGNvcHkgZXZlcnl0aGluZyBmcm9tIGRpc2sgZHF1b3QgdG8gdGhlIGluY29yZSBkcXVvdCAqLworCW1lbWNweSgmZHFwLT5xX2NvcmUsIGRkcXAsIHNpemVvZih4ZnNfZGlza19kcXVvdF90KSk7CisJQVNTRVJUKElOVF9HRVQoZHFwLT5xX2NvcmUuZF9pZCwgQVJDSF9DT05WRVJUKSA9PSBpZCk7CisJeGZzX3FtX2RxdW90X2xvZ2l0ZW1faW5pdChkcXApOworCisJLyoKKwkgKiBSZXNlcnZhdGlvbiBjb3VudGVycyBhcmUgZGVmaW5lZCBhcyByZXNlcnZhdGlvbiBwbHVzIGN1cnJlbnQgdXNhZ2UKKwkgKiB0byBhdm9pZCBoYXZpbmcgdG8gYWRkIGV2ZXJ5dGltZS4KKwkgKi8KKwlkcXAtPnFfcmVzX2Jjb3VudCA9IElOVF9HRVQoZGRxcC0+ZF9iY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJZHFwLT5xX3Jlc19pY291bnQgPSBJTlRfR0VUKGRkcXAtPmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpOworCWRxcC0+cV9yZXNfcnRiY291bnQgPSBJTlRfR0VUKGRkcXAtPmRfcnRiY291bnQsIEFSQ0hfQ09OVkVSVCk7CisKKwkvKiBNYXJrIHRoZSBidWYgc28gdGhhdCB0aGlzIHdpbGwgc3RheSBpbmNvcmUgYSBsaXR0bGUgbG9uZ2VyICovCisJWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCBCX0ZTX0RRVU9ULCBYRlNfRFFVT1RfUkVGKTsKKworCS8qCisJICogV2UgZ290IHRoZSBidWZmZXIgd2l0aCBhIHhmc190cmFuc19yZWFkX2J1ZigpIChpbiBkcXRvYnAoKSkKKwkgKiBTbyB3ZSBuZWVkIHRvIHJlbGVhc2Ugd2l0aCB4ZnNfdHJhbnNfYnJlbHNlKCkuCisJICogVGhlIHN0cmF0ZWd5IGhlcmUgaXMgaWRlbnRpY2FsIHRvIHRoYXQgb2YgaW5vZGVzOyB3ZSBsb2NrCisJICogdGhlIGRxdW90IGluIHhmc19xbV9kcWdldCgpIGJlZm9yZSBtYWtpbmcgaXQgYWNjZXNzaWJsZSB0bworCSAqIG90aGVycy4gVGhpcyBpcyBiZWNhdXNlIGRxdW90cywgbGlrZSBpbm9kZXMsIG5lZWQgYSBnb29kIGxldmVsIG9mCisJICogY29uY3VycmVuY3ksIGFuZCB3ZSBkb24ndCB3YW50IHRvIHRha2UgbG9ja3Mgb24gdGhlIGVudGlyZSBidWZmZXJzCisJICogZm9yIGRxdW90IGFjY2Vzc2VzLgorCSAqIE5vdGUgYWxzbyB0aGF0IHRoZSBkcXVvdCBidWZmZXIgbWF5IGV2ZW4gYmUgZGlydHkgYXQgdGhpcyBwb2ludCwgaWYKKwkgKiB0aGlzIHBhcnRpY3VsYXIgZHF1b3Qgd2FzIHJlcGFpcmVkLiBXZSBzdGlsbCBhcmVuJ3QgYWZyYWlkIHRvCisJICogYnJlbHNlIGl0IGJlY2F1c2Ugd2UgaGF2ZSB0aGUgY2hhbmdlcyBpbmNvcmUuCisJICovCisJQVNTRVJUKFhGU19CVUZfSVNCVVNZKGJwKSk7CisJQVNTRVJUKFhGU19CVUZfVkFMVVNFTUEoYnApIDw9IDApOworCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKworCXJldHVybiAoZXJyb3IpOworfQorCisKKy8qCisgKiBhbGxvY2F0ZSBhbiBpbmNvcmUgZHF1b3QgZnJvbSB0aGUga2VybmVsIGhlYXAsCisgKiBhbmQgZmlsbCBpdHMgY29yZSB3aXRoIHF1b3RhIGluZm9ybWF0aW9uIGtlcHQgb24gZGlzay4KKyAqIElmIFhGU19RTU9QVF9EUUFMTE9DIGlzIHNldCwgaXQnbGwgYWxsb2NhdGUgYSBkcXVvdCBvbiBkaXNrCisgKiBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBhbGxvY2F0ZWQuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19xbV9pZHRvZHEoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19kcWlkX3QJaWQsCSAvKiBnaWQgb3IgdWlkLCBkZXBlbmRpbmcgb24gdHlwZSAqLworCXVpbnQJCXR5cGUsCSAvKiBVRFFVT1Qgb3IgR0RRVU9UICovCisJdWludAkJZmxhZ3MsCSAvKiBEUUFMTE9DLCBEUVJFUEFJUiAqLworCXhmc19kcXVvdF90CSoqT19kcXBwKS8qIE9VVCA6IGluY29yZSBkcXVvdCwgbm90IGxvY2tlZCAqLworeworCXhmc19kcXVvdF90CSpkcXA7CisJaW50CQllcnJvcjsKKwl4ZnNfdHJhbnNfdAkqdHA7CisJaW50CQljYW5jZWxmbGFncz0wOworCisJZHFwID0geGZzX3FtX2RxaW5pdChtcCwgaWQsIHR5cGUpOworCXRwID0gTlVMTDsKKwlpZiAoZmxhZ3MgJiBYRlNfUU1PUFRfRFFBTExPQykgeworCQl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1FNX0RRQUxMT0MpOworCQlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsCisJCQkJICAgICAgIFhGU19RTV9EUUFMTE9DX1NQQUNFX1JFUyhtcCksCisJCQkJICAgICAgIFhGU19XUklURV9MT0dfUkVTKG1wKSArCisJCQkJCSAgICAgIEJCVE9CKFhGU19RSV9EUUNIVU5LTEVOKG1wKSkgLSAxICsKKwkJCQkJICAgICAgMTI4LAorCQkJCSAgICAgICAwLAorCQkJCSAgICAgICBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAorCQkJCSAgICAgICBYRlNfV1JJVEVfTE9HX0NPVU5UKSkpIHsKKwkJCWNhbmNlbGZsYWdzID0gMDsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJCWNhbmNlbGZsYWdzID0gWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUzsKKwl9CisKKwkvKgorCSAqIFJlYWQgaXQgZnJvbSBkaXNrOyB4ZnNfZHFyZWFkKCkgdGFrZXMgY2FyZSBvZgorCSAqIGFsbCB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uIG9mIGRxdW90J3MgZmllbGRzIChsb2NrcywgZXRjKQorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFyZWFkKHRwLCBpZCwgZHFwLCBmbGFncykpKSB7CisJCS8qCisJCSAqIFRoaXMgY2FuIGhhcHBlbiBpZiBxdW90YXMgZ290IHR1cm5lZCBvZmYgKEVTUkNIKSwKKwkJICogb3IgaWYgdGhlIGRxdW90IGRpZG4ndCBleGlzdCBvbiBkaXNrIGFuZCB3ZSBhc2sgdG8KKwkJICogYWxsb2NhdGUgKEVOT0VOVCkuCisJCSAqLworCQl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUVJFQUQgRkFJTCIpOworCQljYW5jZWxmbGFncyB8PSBYRlNfVFJBTlNfQUJPUlQ7CisJCWdvdG8gZXJyb3IwOworCX0KKwlpZiAodHApIHsKKwkJaWYgKChlcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsCisJCQkJCSAgICAgTlVMTCkpKQorCQkJZ290byBlcnJvcjE7CisJfQorCisJKk9fZHFwcCA9IGRxcDsKKwlyZXR1cm4gKDApOworCisgZXJyb3IwOgorCUFTU0VSVChlcnJvcik7CisJaWYgKHRwKQorCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBjYW5jZWxmbGFncyk7CisgZXJyb3IxOgorCXhmc19xbV9kcWRlc3Ryb3koZHFwKTsKKwkqT19kcXBwID0gTlVMTDsKKwlyZXR1cm4gKGVycm9yKTsKK30KKworLyoKKyAqIExvb2t1cCBhIGRxdW90IGluIHRoZSBpbmNvcmUgZHF1b3QgaGFzaHRhYmxlLiBXZSBrZWVwIHR3byBzZXBhcmF0ZQorICogaGFzaHRhYmxlcyBmb3IgdXNlciBhbmQgZ3JvdXAgZHF1b3RzOyBhbmQsIHRoZXNlIGFyZSBnbG9iYWwgdGFibGVzCisgKiBpbnNpZGUgdGhlIFhRTSwgbm90IHBlci1maWxlc3lzdGVtIHRhYmxlcy4KKyAqIFRoZSBoYXNoIGNoYWluIG11c3QgYmUgbG9ja2VkIGJ5IGNhbGxlciwgYW5kIGl0IGlzIGxlZnQgbG9ja2VkCisgKiBvbiByZXR1cm4uIFJldHVybmluZyBkcXVvdCBpcyBsb2NrZWQuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19xbV9kcWxvb2t1cCgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXhmc19kcWlkX3QJCWlkLAorCXhmc19kcWhhc2hfdAkJKnFoLAorCXhmc19kcXVvdF90CQkqKk9fZHFwcCkKK3sKKwl4ZnNfZHF1b3RfdAkJKmRxcDsKKwl1aW50CQkJZmxpc3RfbG9ja2VkOworCXhmc19kcXVvdF90CQkqZDsKKworCUFTU0VSVChYRlNfRFFfSVNfSEFTSF9MT0NLRUQocWgpKTsKKworCWZsaXN0X2xvY2tlZCA9IEJfRkFMU0U7CisKKwkvKgorCSAqIFRyYXZlcnNlIHRoZSBoYXNoY2hhaW4gbG9va2luZyBmb3IgYSBtYXRjaAorCSAqLworCWZvciAoZHFwID0gcWgtPnFoX25leHQ7IGRxcCAhPSBOVUxMOyBkcXAgPSBkcXAtPkhMX05FWFQpIHsKKwkJLyoKKwkJICogV2UgYWxyZWFkeSBoYXZlIHRoZSBoYXNobG9jay4gV2UgZG9uJ3QgbmVlZCB0aGUKKwkJICogZHFsb2NrIHRvIGxvb2sgYXQgdGhlIGlkIGZpZWxkIG9mIHRoZSBkcXVvdCwgc2luY2UgdGhlCisJCSAqIGlkIGNhbid0IGJlIG1vZGlmaWVkIHdpdGhvdXQgdGhlIGhhc2hsb2NrIGFueXdheS4KKwkJICovCisJCWlmIChJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCkgPT0gaWQgJiYgZHFwLT5xX21vdW50ID09IG1wKSB7CisJCQl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUUZPVU5EIEJZIExPT0tVUCIpOworCQkJLyoKKwkJCSAqIEFsbCBpbiBjb3JlIGRxdW90cyBtdXN0IGJlIG9uIHRoZSBkcWxpc3Qgb2YgbXAKKwkJCSAqLworCQkJQVNTRVJUKGRxcC0+TVBMX1BSRVZQICE9IE5VTEwpOworCisJCQl4ZnNfZHFsb2NrKGRxcCk7CisJCQlpZiAoZHFwLT5xX25yZWZzID09IDApIHsKKwkJCQlBU1NFUlQgKFhGU19EUV9JU19PTl9GUkVFTElTVChkcXApKTsKKwkJCQlpZiAoISB4ZnNfcW1fZnJlZWxpc3RfbG9ja19ub3dhaXQoeGZzX0dxbSkpIHsKKwkJCQkJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiRFFMT09LVVA6IFdBTlQiKTsKKworCQkJCQkvKgorCQkJCQkgKiBXZSBtYXkgaGF2ZSByYWNlZCB3aXRoIGRxcmVjbGFpbV9vbmUoKQorCQkJCQkgKiAoYW5kIGxvc3QpLiBTbywgZmxhZyB0aGF0IHdlIGRvbid0CisJCQkJCSAqIHdhbnQgdGhlIGRxdW90IHRvIGJlIHJlY2xhaW1lZC4KKwkJCQkJICovCisJCQkJCWRxcC0+ZHFfZmxhZ3MgfD0gWEZTX0RRX1dBTlQ7CisJCQkJCXhmc19kcXVubG9jayhkcXApOworCQkJCQl4ZnNfcW1fZnJlZWxpc3RfbG9jayh4ZnNfR3FtKTsKKwkJCQkJeGZzX2RxbG9jayhkcXApOworCQkJCQlkcXAtPmRxX2ZsYWdzICY9IH4oWEZTX0RRX1dBTlQpOworCQkJCX0KKwkJCQlmbGlzdF9sb2NrZWQgPSBCX1RSVUU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBpZCBjb3VsZG4ndCBoYXZlIGNoYW5nZWQ7IHdlIGhhZCB0aGUgaGFzaGxvY2sgYWxsCisJCQkgKiBhbG9uZworCQkJICovCisJCQlBU1NFUlQoSU5UX0dFVChkcXAtPnFfY29yZS5kX2lkLCBBUkNIX0NPTlZFUlQpID09IGlkKTsKKworCQkJaWYgKGZsaXN0X2xvY2tlZCkgeworCQkJCWlmIChkcXAtPnFfbnJlZnMgIT0gMCkgeworCQkJCQl4ZnNfcW1fZnJlZWxpc3RfdW5sb2NrKHhmc19HcW0pOworCQkJCQlmbGlzdF9sb2NrZWQgPSBCX0ZBTFNFOworCQkJCX0gZWxzZSB7CisJCQkJCS8qCisJCQkJCSAqIHRha2UgaXQgb2ZmIHRoZSBmcmVlbGlzdAorCQkJCQkgKi8KKwkJCQkJeGZzX2RxdHJhY2VfZW50cnkoZHFwLAorCQkJCQkJCSJEUUxPT0tVUDogVEFLRU9GRiBGTCIpOworCQkJCQlYUU1fRlJFRUxJU1RfUkVNT1ZFKGRxcCk7CisJCQkJCS8qIHhmc19xbV9mcmVlbGlzdF9wcmludCgmKHhmc19HcW0tPgorCQkJCQkJCXFtX2RxZnJlZWxpc3QpLAorCQkJCQkJCSJhZnRlciByZW1vdmFsIik7ICovCisJCQkJfQorCQkJfQorCisJCQkvKgorCQkJICogZ3JhYiBhIHJlZmVyZW5jZQorCQkJICovCisJCQlYRlNfRFFIT0xEKGRxcCk7CisKKwkJCWlmIChmbGlzdF9sb2NrZWQpCisJCQkJeGZzX3FtX2ZyZWVsaXN0X3VubG9jayh4ZnNfR3FtKTsKKwkJCS8qCisJCQkgKiBtb3ZlIHRoZSBkcXVvdCB0byB0aGUgZnJvbnQgb2YgdGhlIGhhc2hjaGFpbgorCQkJICovCisJCQlBU1NFUlQoWEZTX0RRX0lTX0hBU0hfTE9DS0VEKHFoKSk7CisJCQlpZiAoZHFwLT5ITF9QUkVWUCAhPSAmcWgtPnFoX25leHQpIHsKKwkJCQl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsCisJCQkJCQkgICJEUUxPT0tVUDogSEFTSCBNT1ZFVE9GUk9OVCIpOworCQkJCWlmICgoZCA9IGRxcC0+SExfTkVYVCkpCisJCQkJCWQtPkhMX1BSRVZQID0gZHFwLT5ITF9QUkVWUDsKKwkJCQkqKGRxcC0+SExfUFJFVlApID0gZDsKKwkJCQlkID0gcWgtPnFoX25leHQ7CisJCQkJZC0+SExfUFJFVlAgPSAmZHFwLT5ITF9ORVhUOworCQkJCWRxcC0+SExfTkVYVCA9IGQ7CisJCQkJZHFwLT5ITF9QUkVWUCA9ICZxaC0+cWhfbmV4dDsKKwkJCQlxaC0+cWhfbmV4dCA9IGRxcDsKKwkJCX0KKwkJCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkxPT0tVUCBFTkQiKTsKKwkJCSpPX2RxcHAgPSBkcXA7CisJCQlBU1NFUlQoWEZTX0RRX0lTX0hBU0hfTE9DS0VEKHFoKSk7CisJCQlyZXR1cm4gKDApOworCQl9CisJfQorCisJKk9fZHFwcCA9IE5VTEw7CisJQVNTRVJUKFhGU19EUV9JU19IQVNIX0xPQ0tFRChxaCkpOworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBHaXZlbiB0aGUgZmlsZSBzeXN0ZW0sIGlub2RlIE9SIGlkLCBhbmQgdHlwZSAoVURRVU9UL0dEUVVPVCksIHJldHVybiBhCisgKiBhIGxvY2tlZCBkcXVvdCwgZG9pbmcgYW4gYWxsb2NhdGlvbiAoaWYgcmVxdWVzdGVkKSBhcyBuZWVkZWQuCisgKiBXaGVuIGJvdGggYW4gaW5vZGUgYW5kIGFuIGlkIGFyZSBnaXZlbiwgdGhlIGlub2RlJ3MgaWQgdGFrZXMgcHJlY2VkZW5jZS4KKyAqIFRoYXQgaXMsIGlmIHRoZSBpZCBjaGFuZ2VzIHdoaWxlIHdlIGRvbid0IGhvbGQgdGhlIGlsb2NrIGluc2lkZSB0aGlzCisgKiBmdW5jdGlvbiwgdGhlIG5ldyBkcXVvdCBpcyByZXR1cm5lZCwgbm90IG5lY2Vzc2FyaWx5IHRoZSBvbmUgcmVxdWVzdGVkCisgKiBpbiB0aGUgaWQgYXJndW1lbnQuCisgKi8KK2ludAoreGZzX3FtX2RxZ2V0KAorCXhmc19tb3VudF90CSptcCwKKwl4ZnNfaW5vZGVfdAkqaXAsCSAgLyogbG9ja2VkIGlub2RlIChvcHRpb25hbCkgKi8KKwl4ZnNfZHFpZF90CWlkLAkgIC8qIGdpZCBvciB1aWQsIGRlcGVuZGluZyBvbiB0eXBlICovCisJdWludAkJdHlwZSwJICAvKiBVRFFVT1Qgb3IgR0RRVU9UICovCisJdWludAkJZmxhZ3MsCSAgLyogRFFBTExPQywgRFFTVVNFUiwgRFFSRVBBSVIsIERPV0FSTiAqLworCXhmc19kcXVvdF90CSoqT19kcXBwKSAvKiBPVVQgOiBsb2NrZWQgaW5jb3JlIGRxdW90ICovCit7CisJeGZzX2RxdW90X3QJKmRxcDsKKwl4ZnNfZHFoYXNoX3QJKmg7CisJdWludAkJdmVyc2lvbjsKKwlpbnQJCWVycm9yOworCisJQVNTRVJUKFhGU19JU19RVU9UQV9SVU5OSU5HKG1wKSk7CisJaWYgKCghIFhGU19JU19VUVVPVEFfT04obXApICYmIHR5cGUgPT0gWEZTX0RRX1VTRVIpIHx8CisJICAgICghIFhGU19JU19HUVVPVEFfT04obXApICYmIHR5cGUgPT0gWEZTX0RRX0dST1VQKSkgeworCQlyZXR1cm4gKEVTUkNIKTsKKwl9CisJaCA9IFhGU19EUV9IQVNIKG1wLCBpZCwgdHlwZSk7CisKKyNpZmRlZiBERUJVRworCWlmICh4ZnNfZG9fZHFlcnJvcikgeworCQlpZiAoKHhmc19kcWVycm9yX3RhcmdldCA9PSBtcC0+bV9kZGV2X3RhcmdwKSAmJgorCQkgICAgKHhmc19kcXJlcV9udW0rKyAlIHhmc19kcWVycm9yX21vZCkgPT0gMCkgeworCQkJY21uX2VycihDRV9ERUJVRywgIlJldHVybmluZyBlcnJvciBpbiBkcWdldCIpOworCQkJcmV0dXJuIChFSU8pOworCQl9CisJfQorI2VuZGlmCisKKyBhZ2FpbjoKKworI2lmZGVmIERFQlVHCisJQVNTRVJUKHR5cGUgPT0gWEZTX0RRX1VTRVIgfHwgdHlwZSA9PSBYRlNfRFFfR1JPVVApOworCWlmIChpcCkgeworCQlBU1NFUlQoWEZTX0lTTE9DS0VEX0lOT0RFX0VYQ0woaXApKTsKKwkJaWYgKHR5cGUgPT0gWEZTX0RRX1VTRVIpCisJCQlBU1NFUlQoaXAtPmlfdWRxdW90ID09IE5VTEwpOworCQllbHNlCisJCQlBU1NFUlQoaXAtPmlfZ2RxdW90ID09IE5VTEwpOworCX0KKyNlbmRpZgorCVhGU19EUV9IQVNIX0xPQ0soaCk7CisKKwkvKgorCSAqIExvb2sgaW4gdGhlIGNhY2hlIChoYXNodGFibGUpLgorCSAqIFRoZSBjaGFpbiBpcyBrZXB0IGxvY2tlZCBkdXJpbmcgbG9va3VwLgorCSAqLworCWlmICh4ZnNfcW1fZHFsb29rdXAobXAsIGlkLCBoLCBPX2RxcHApID09IDApIHsKKwkJWFFNX1NUQVRTX0lOQyh4cW1zdGF0cy54c19xbV9kcWNhY2hlaGl0cyk7CisJCS8qCisJCSAqIFRoZSBkcXVvdCB3YXMgZm91bmQsIG1vdmVkIHRvIHRoZSBmcm9udCBvZiB0aGUgY2hhaW4sCisJCSAqIHRha2VuIG9mZiB0aGUgZnJlZWxpc3QgaWYgaXQgd2FzIG9uIGl0LCBhbmQgbG9ja2VkCisJCSAqIGF0IHRoaXMgcG9pbnQuIEp1c3QgdW5sb2NrIHRoZSBoYXNoY2hhaW4gYW5kIHJldHVybi4KKwkJICovCisJCUFTU0VSVCgqT19kcXBwKTsKKwkJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQoKk9fZHFwcCkpOworCQlYRlNfRFFfSEFTSF9VTkxPQ0soaCk7CisJCXhmc19kcXRyYWNlX2VudHJ5KCpPX2RxcHAsICJEUUdFVCBET05FIChGUk9NIENBQ0hFKSIpOworCQlyZXR1cm4gKDApOwkvKiBzdWNjZXNzICovCisJfQorCVhRTV9TVEFUU19JTkMoeHFtc3RhdHMueHNfcW1fZHFjYWNoZW1pc3Nlcyk7CisKKwkvKgorCSAqIERxdW90IGNhY2hlIG1pc3MuIFdlIGRvbid0IHdhbnQgdG8ga2VlcCB0aGUgaW5vZGUgbG9jayBhY3Jvc3MKKwkgKiBhIChwb3RlbnRpYWwpIGRpc2sgcmVhZC4gQWxzbyB3ZSBkb24ndCB3YW50IHRvIGRlYWwgd2l0aCB0aGUgbG9jaworCSAqIG9yZGVyaW5nIGJldHdlZW4gcXVvdGFpbm9kZSBhbmQgdGhpcyBpbm9kZS4gT1RPSCwgZHJvcHBpbmcgdGhlIGlub2RlCisJICogbG9jayBoZXJlIG1lYW5zIGRlYWxpbmcgd2l0aCBhIGNob3duIHRoYXQgY2FuIGhhcHBlbiBiZWZvcmUKKwkgKiB3ZSByZS1hY3F1aXJlIHRoZSBsb2NrLgorCSAqLworCWlmIChpcCkKKwkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkvKgorCSAqIFNhdmUgdGhlIGhhc2hjaGFpbiB2ZXJzaW9uIHN0YW1wLCBhbmQgdW5sb2NrIHRoZSBjaGFpbiwgc28gdGhhdAorCSAqIHdlIGRvbid0IGtlZXAgdGhlIGxvY2sgYWNyb3NzIGEgZGlzayByZWFkCisJICovCisJdmVyc2lvbiA9IGgtPnFoX3ZlcnNpb247CisJWEZTX0RRX0hBU0hfVU5MT0NLKGgpOworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgZHF1b3Qgb24gdGhlIGtlcm5lbCBoZWFwLCBhbmQgcmVhZCB0aGUgb25kaXNrCisJICogcG9ydGlvbiBvZmYgdGhlIGRpc2suIEFsc28sIGRvIGFsbCB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uCisJICogVGhpcyBjYW4gcmV0dXJuIEVOT0VOVCBpZiBkcXVvdCBkaWRuJ3QgZXhpc3Qgb24gZGlzayBhbmQgd2UgZGlkbid0CisJICogYXNrIGl0IHRvIGFsbG9jYXRlOyBFU1JDSCBpZiBxdW90YXMgZ290IHR1cm5lZCBvZmYgc3VkZGVubHkuCisJICovCisJaWYgKChlcnJvciA9IHhmc19xbV9pZHRvZHEobXAsIGlkLCB0eXBlLAorCQkJCSAgZmxhZ3MgJiAoWEZTX1FNT1BUX0RRQUxMT0N8WEZTX1FNT1BUX0RRUkVQQUlSfAorCQkJCQkgICBYRlNfUU1PUFRfRE9XQVJOKSwKKwkJCQkgICZkcXApKSkgeworCQlpZiAoaXApCisJCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJcmV0dXJuIChlcnJvcik7CisJfQorCisJLyoKKwkgKiBTZWUgaWYgdGhpcyBpcyBtb3VudCBjb2RlIGNhbGxpbmcgdG8gbG9vayBhdCB0aGUgb3ZlcmFsbCBxdW90YSBsaW1pdHMKKwkgKiB3aGljaCBhcmUgc3RvcmVkIGluIHRoZSBpZCA9PSAwIHVzZXIgb3IgZ3JvdXAncyBkcXVvdC4KKwkgKiBTaW5jZSB3ZSBtYXkgbm90IGhhdmUgZG9uZSBhIHF1b3RhY2hlY2sgYnkgdGhpcyBwb2ludCwganVzdCByZXR1cm4KKwkgKiB0aGUgZHF1b3Qgd2l0aG91dCBhdHRhY2hpbmcgaXQgdG8gYW55IGhhc2h0YWJsZXMsIGxpc3RzLCBldGMsIG9yIGV2ZW4KKwkgKiB0YWtpbmcgYSByZWZlcmVuY2UuCisJICogVGhlIGNhbGxlciBtdXN0IGRxZGVzdHJveSB0aGlzIG9uY2UgZG9uZS4KKwkgKi8KKwlpZiAoZmxhZ3MgJiBYRlNfUU1PUFRfRFFTVVNFUikgeworCQlBU1NFUlQoaWQgPT0gMCk7CisJCUFTU0VSVCghIGlwKTsKKwkJZ290byBkcXJldDsKKwl9CisKKwkvKgorCSAqIERxdW90IGxvY2sgY29tZXMgYWZ0ZXIgaGFzaGxvY2sgaW4gdGhlIGxvY2sgb3JkZXJpbmcKKwkgKi8KKwlpZiAoaXApIHsKKwkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCWlmICghIFhGU19JU19EUVRZUEVfT04obXAsIHR5cGUpKSB7CisJCQkvKiBpbm9kZSBzdGF5cyBsb2NrZWQgb24gcmV0dXJuICovCisJCQl4ZnNfcW1fZHFkZXN0cm95KGRxcCk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVTUkNIKTsKKwkJfQorCQkvKgorCQkgKiBBIGRxdW90IGNvdWxkIGJlIGF0dGFjaGVkIHRvIHRoaXMgaW5vZGUgYnkgbm93LCBzaW5jZQorCQkgKiB3ZSBoYWQgZHJvcHBlZCB0aGUgaWxvY2suCisJCSAqLworCQlpZiAodHlwZSA9PSBYRlNfRFFfVVNFUikgeworCQkJaWYgKGlwLT5pX3VkcXVvdCkgeworCQkJCXhmc19xbV9kcWRlc3Ryb3koZHFwKTsKKwkJCQlkcXAgPSBpcC0+aV91ZHF1b3Q7CisJCQkJeGZzX2RxbG9jayhkcXApOworCQkJCWdvdG8gZHFyZXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoaXAtPmlfZ2RxdW90KSB7CisJCQkJeGZzX3FtX2RxZGVzdHJveShkcXApOworCQkJCWRxcCA9IGlwLT5pX2dkcXVvdDsKKwkJCQl4ZnNfZHFsb2NrKGRxcCk7CisJCQkJZ290byBkcXJldDsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogSGFzaGxvY2sgY29tZXMgYWZ0ZXIgaWxvY2sgaW4gbG9jayBvcmRlcgorCSAqLworCVhGU19EUV9IQVNIX0xPQ0soaCk7CisJaWYgKHZlcnNpb24gIT0gaC0+cWhfdmVyc2lvbikgeworCQl4ZnNfZHF1b3RfdCAqdG1wZHFwOworCQkvKgorCQkgKiBOb3csIHNlZSBpZiBzb21lYm9keSBlbHNlIHB1dCB0aGUgZHF1b3QgaW4gdGhlCisJCSAqIGhhc2h0YWJsZSBiZWZvcmUgdXMuIFRoaXMgY2FuIGhhcHBlbiBiZWNhdXNlIHdlIGRpZG4ndAorCQkgKiBrZWVwIHRoZSBoYXNoY2hhaW4gbG9jay4gV2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dAorCQkgKiBsb2NrIG9yZGVyIGJldHdlZW4gdGhlIHR3byBkcXVvdHMgaGVyZSBzaW5jZSBkcXAgaXNuJ3QKKwkJICogb24gYW55IGZpbmRhYmxlIGxpc3RzIHlldC4KKwkJICovCisJCWlmICh4ZnNfcW1fZHFsb29rdXAobXAsIGlkLCBoLCAmdG1wZHFwKSA9PSAwKSB7CisJCQkvKgorCQkJICogRHVwbGljYXRlIGZvdW5kLiBKdXN0IHRocm93IGF3YXkgdGhlIG5ldyBkcXVvdAorCQkJICogYW5kIHN0YXJ0IG92ZXIuCisJCQkgKi8KKwkJCXhmc19xbV9kcXB1dCh0bXBkcXApOworCQkJWEZTX0RRX0hBU0hfVU5MT0NLKGgpOworCQkJeGZzX3FtX2RxZGVzdHJveShkcXApOworCQkJWFFNX1NUQVRTX0lOQyh4cW1zdGF0cy54c19xbV9kcXVvdF9kdXBzKTsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwl9CisKKwkvKgorCSAqIFB1dCB0aGUgZHF1b3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaGFzaC1jaGFpbiBhbmQgbXAncyBsaXN0CisJICogTE9DSyBPUkRFUjogaGFzaGxvY2ssIGZyZWVsaXN0bG9jaywgbXBsaXN0bG9jaywgdWRxbG9jaywgZ2RxbG9jayAuLgorCSAqLworCUFTU0VSVChYRlNfRFFfSVNfSEFTSF9MT0NLRUQoaCkpOworCWRxcC0+cV9oYXNoID0gaDsKKwlYUU1fSEFTSExJU1RfSU5TRVJUKGgsIGRxcCk7CisKKwkvKgorCSAqIEF0dGFjaCB0aGlzIGRxdW90IHRvIHRoaXMgZmlsZXN5c3RlbSdzIGxpc3Qgb2YgYWxsIGRxdW90cywKKwkgKiBrZXB0IGluc2lkZSB0aGUgbW91bnQgc3RydWN0dXJlIGluIG1fcXVvdGFpbmZvIGZpZWxkCisJICovCisJeGZzX3FtX21wbGlzdF9sb2NrKG1wKTsKKworCS8qCisJICogV2UgcmV0dXJuIGEgbG9ja2VkIGRxdW90IHRvIHRoZSBjYWxsZXIsIHdpdGggYSByZWZlcmVuY2UgdGFrZW4KKwkgKi8KKwl4ZnNfZHFsb2NrKGRxcCk7CisJZHFwLT5xX25yZWZzID0gMTsKKworCVhRTV9NUExJU1RfSU5TRVJUKCYoWEZTX1FJX01QTF9MSVNUKG1wKSksIGRxcCk7CisKKwl4ZnNfcW1fbXBsaXN0X3VubG9jayhtcCk7CisJWEZTX0RRX0hBU0hfVU5MT0NLKGgpOworIGRxcmV0OgorCUFTU0VSVCgoaXAgPT0gTlVMTCkgfHwgWEZTX0lTTE9DS0VEX0lOT0RFX0VYQ0woaXApKTsKKwl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUUdFVCBET05FIik7CisJKk9fZHFwcCA9IGRxcDsKKwlyZXR1cm4gKDApOworfQorCisKKy8qCisgKiBSZWxlYXNlIGEgcmVmZXJlbmNlIHRvIHRoZSBkcXVvdCAoZGVjcmVtZW50IHJlZi1jb3VudCkKKyAqIGFuZCB1bmxvY2sgaXQuIElmIHRoZXJlIGlzIGEgZ3JvdXAgcXVvdGEgYXR0YWNoZWQgdG8gdGhpcworICogZHF1b3QsIGNhcmVmdWxseSByZWxlYXNlIHRoYXQgdG9vIHdpdGhvdXQgdHJpcHBpbmcgb3ZlcgorICogZGVhZGxvY2tzJ24nc3R1ZmYuCisgKi8KK3ZvaWQKK3hmc19xbV9kcXB1dCgKKwl4ZnNfZHF1b3RfdAkqZHFwKQoreworCXhmc19kcXVvdF90CSpnZHFwOworCisJQVNTRVJUKGRxcC0+cV9ucmVmcyA+IDApOworCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKGRxcCkpOworCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRUFVUIik7CisKKwlpZiAoZHFwLT5xX25yZWZzICE9IDEpIHsKKwkJZHFwLT5xX25yZWZzLS07CisJCXhmc19kcXVubG9jayhkcXApOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBkcm9wIHRoZSBkcWxvY2sgYW5kIGFjcXVpcmUgdGhlIGZyZWVsaXN0IGFuZCBkcWxvY2sKKwkgKiBpbiB0aGUgcmlnaHQgb3JkZXI7IGJ1dCB0cnkgdG8gZ2V0IGl0IG91dC1vZi1vcmRlciBmaXJzdAorCSAqLworCWlmICghIHhmc19xbV9mcmVlbGlzdF9sb2NrX25vd2FpdCh4ZnNfR3FtKSkgeworCQl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUVBVVDogRkxMT0NLLVdBSVQiKTsKKwkJeGZzX2RxdW5sb2NrKGRxcCk7CisJCXhmc19xbV9mcmVlbGlzdF9sb2NrKHhmc19HcW0pOworCQl4ZnNfZHFsb2NrKGRxcCk7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJZ2RxcCA9IE5VTEw7CisKKwkJLyogV2UgY2FuJ3QgZGVwZW5kIG9uIG5yZWZzIGJlaW5nID09IDEgaGVyZSAqLworCQlpZiAoLS1kcXAtPnFfbnJlZnMgPT0gMCkgeworCQkJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiRFFQVVQ6IE9OIEZSRUVMSVNUIik7CisJCQkvKgorCQkJICogaW5zZXJ0IGF0IGVuZCBvZiB0aGUgZnJlZWxpc3QuCisJCQkgKi8KKwkJCVhRTV9GUkVFTElTVF9JTlNFUlQoJih4ZnNfR3FtLT5xbV9kcWZyZWVsaXN0KSwgZHFwKTsKKworCQkJLyoKKwkJCSAqIElmIHdlIGp1c3QgYWRkZWQgYSB1ZHF1b3QgdG8gdGhlIGZyZWVsaXN0LCB0aGVuCisJCQkgKiB3ZSB3YW50IHRvIHJlbGVhc2UgdGhlIGdkcXVvdCByZWZlcmVuY2UgdGhhdAorCQkJICogaXQgKHByb2JhYmx5KSBoYXMuIE90aGVyd2lzZSBpdCdsbCBrZWVwIHRoZQorCQkJICogZ2RxdW90IGZyb20gZ2V0dGluZyByZWNsYWltZWQuCisJCQkgKi8KKwkJCWlmICgoZ2RxcCA9IGRxcC0+cV9nZHF1b3QpKSB7CisJCQkJLyoKKwkJCQkgKiBBdm9pZCBhIHJlY3Vyc2l2ZSBkcXB1dCBjYWxsCisJCQkJICovCisJCQkJeGZzX2RxbG9jayhnZHFwKTsKKwkJCQlkcXAtPnFfZ2RxdW90ID0gTlVMTDsKKwkJCX0KKworCQkJLyogeGZzX3FtX2ZyZWVsaXN0X3ByaW50KCYoeGZzX0dxbS0+cW1fZHFmcmVlbGlzdCksCisJCQkgICAiQEBAQEArKyBGcmVlIGxpc3QgKGFmdGVyIGFwcGVuZCkgQEBAQEArIik7CisJCQkgICAqLworCQl9CisJCXhmc19kcXVubG9jayhkcXApOworCisJCS8qCisJCSAqIElmIHdlIGhhZCBhIGdyb3VwIHF1b3RhIGluc2lkZSB0aGUgdXNlciBxdW90YSBhcyBhIGhpbnQsCisJCSAqIHJlbGVhc2UgaXQgbm93LgorCQkgKi8KKwkJaWYgKCEgZ2RxcCkKKwkJCWJyZWFrOworCQlkcXAgPSBnZHFwOworCX0KKwl4ZnNfcW1fZnJlZWxpc3RfdW5sb2NrKHhmc19HcW0pOworfQorCisvKgorICogUmVsZWFzZSBhIGRxdW90LiBGbHVzaCBpdCBpZiBkaXJ0eSwgdGhlbiBkcXB1dCgpIGl0LgorICogZHF1b3QgbXVzdCBub3QgYmUgbG9ja2VkLgorICovCit2b2lkCit4ZnNfcW1fZHFyZWxlKAorCXhmc19kcXVvdF90CSpkcXApCit7CisJQVNTRVJUKGRxcCk7CisJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiRFFSRUxFIik7CisKKwl4ZnNfZHFsb2NrKGRxcCk7CisJLyoKKwkgKiBXZSBkb24ndCBjYXJlIHRvIGZsdXNoIGl0IGlmIHRoZSBkcXVvdCBpcyBkaXJ0eSBoZXJlLgorCSAqIFRoYXQgd2lsbCBjcmVhdGUgc3R1dHRlcnMgdGhhdCB3ZSB3YW50IHRvIGF2b2lkLgorCSAqIEluc3RlYWQgd2UgZG8gYSBkZWxheWVkIHdyaXRlIHdoZW4gd2UgdHJ5IHRvIHJlY2xhaW0KKwkgKiBhIGRpcnR5IGRxdW90LiBBbHNvIHhmc19zeW5jIHdpbGwgdGFrZSBwYXJ0IG9mIHRoZSBidXJkZW4uLi4KKwkgKi8KKwl4ZnNfcW1fZHFwdXQoZHFwKTsKK30KKworCisvKgorICogV3JpdGUgYSBtb2RpZmllZCBkcXVvdCB0byBkaXNrLgorICogVGhlIGRxdW90IG11c3QgYmUgbG9ja2VkIGFuZCB0aGUgZmx1c2ggbG9jayB0b28gdGFrZW4gYnkgY2FsbGVyLgorICogVGhlIGZsdXNoIGxvY2sgd2lsbCBub3QgYmUgdW5sb2NrZWQgdW50aWwgdGhlIGRxdW90IHJlYWNoZXMgdGhlIGRpc2ssCisgKiBidXQgdGhlIGRxdW90IGlzIGZyZWUgdG8gYmUgdW5sb2NrZWQgYW5kIG1vZGlmaWVkIGJ5IHRoZSBjYWxsZXIKKyAqIGluIHRoZSBpbnRlcmltLiBEcXVvdCBpcyBzdGlsbCBsb2NrZWQgb24gcmV0dXJuLiBUaGlzIGJlaGF2aW9yIGlzCisgKiBpZGVudGljYWwgdG8gdGhhdCBvZiBpbm9kZXMuCisgKi8KK2ludAoreGZzX3FtX2RxZmx1c2goCisJeGZzX2RxdW90X3QJCSpkcXAsCisJdWludAkJCWZsYWdzKQoreworCXhmc19tb3VudF90CQkqbXA7CisJeGZzX2J1Zl90CQkqYnA7CisJeGZzX2Rpc2tfZHF1b3RfdAkqZGRxcDsKKwlpbnQJCQllcnJvcjsKKwlTUExERUNMKHMpOworCisJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQoZHFwKSk7CisJQVNTRVJUKFhGU19EUV9JU19GTFVTSF9MT0NLRUQoZHFwKSk7CisJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiRFFGTFVTSCIpOworCisJLyoKKwkgKiBJZiBub3QgZGlydHksIG5hZGEuCisJICovCisJaWYgKCFYRlNfRFFfSVNfRElSVFkoZHFwKSkgeworCQl4ZnNfZHFmdW5sb2NrKGRxcCk7CisJCXJldHVybiAoMCk7CisJfQorCisJLyoKKwkgKiBDYW50IGZsdXNoIGEgcGlubmVkIGRxdW90LiBXYWl0IGZvciBpdC4KKwkgKi8KKwl4ZnNfcW1fZHF1bnBpbl93YWl0KGRxcCk7CisKKwkvKgorCSAqIFRoaXMgbWF5IGhhdmUgYmVlbiB1bnBpbm5lZCBiZWNhdXNlIHRoZSBmaWxlc3lzdGVtIGlzIHNodXR0aW5nCisJICogZG93biBmb3JjaWJseS4gSWYgdGhhdCdzIHRoZSBjYXNlIHdlIG11c3Qgbm90IHdyaXRlIHRoaXMgZHF1b3QKKwkgKiB0byBkaXNrLCBiZWNhdXNlIHRoZSBsb2cgcmVjb3JkIGRpZG4ndCBtYWtlIGl0IHRvIGRpc2shCisJICovCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04oZHFwLT5xX21vdW50KSkgeworCQlkcXAtPmRxX2ZsYWdzICY9IH4oWEZTX0RRX0RJUlRZKTsKKwkJeGZzX2RxZnVubG9jayhkcXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBvbi1kaXNrIGRxdW90CisJICogV2UgZG9uJ3QgbmVlZCBhIHRyYW5zYWN0aW9uIGVudmVsb3BlIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZQorCSAqIHRoZSBvbmRpc2stZHF1b3QgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgZm9yLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHF0b2JwKE5VTEwsIGRxcCwgJmRkcXAsICZicCwgWEZTX1FNT1BUX0RPV0FSTikpKSB7CisJCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRVE9CUCBGQUlMIik7CisJCUFTU0VSVChlcnJvciAhPSBFTk9FTlQpOworCQkvKgorCQkgKiBRdW90YXMgY291bGQgaGF2ZSBnb3R0ZW4gdHVybmVkIG9mZiAoRVNSQ0gpCisJCSAqLworCQl4ZnNfZHFmdW5sb2NrKGRxcCk7CisJCXJldHVybiAoZXJyb3IpOworCX0KKworCWlmICh4ZnNfcW1fZHFjaGVjaygmZHFwLT5xX2NvcmUsIElOVF9HRVQoZGRxcC0+ZF9pZCwgQVJDSF9DT05WRVJUKSwgMCwgWEZTX1FNT1BUX0RPV0FSTiwKKwkJCSAgICJkcWZsdXNoIChpbmNvcmUgY29weSkiKSkgeworCQl4ZnNfZm9yY2Vfc2h1dGRvd24oZHFwLT5xX21vdW50LCBYRlNfQ09SUlVQVF9JTkNPUkUpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCisJLyogVGhpcyBpcyB0aGUgb25seSBwb3J0aW9uIG9mIGRhdGEgdGhhdCBuZWVkcyB0byBwZXJzaXN0ICovCisJbWVtY3B5KGRkcXAsICYoZHFwLT5xX2NvcmUpLCBzaXplb2YoeGZzX2Rpc2tfZHF1b3RfdCkpOworCisJLyoKKwkgKiBDbGVhciB0aGUgZGlydHkgZmllbGQgYW5kIHJlbWVtYmVyIHRoZSBmbHVzaCBsc24gZm9yIGxhdGVyIHVzZS4KKwkgKi8KKwlkcXAtPmRxX2ZsYWdzICY9IH4oWEZTX0RRX0RJUlRZKTsKKwltcCA9IGRxcC0+cV9tb3VudDsKKworCS8qIGxzbiBpcyA2NCBiaXRzICovCisJQUlMX0xPQ0sobXAsIHMpOworCWRxcC0+cV9sb2dpdGVtLnFsaV9mbHVzaF9sc24gPSBkcXAtPnFfbG9naXRlbS5xbGlfaXRlbS5saV9sc247CisJQUlMX1VOTE9DSyhtcCwgcyk7CisKKwkvKgorCSAqIEF0dGFjaCBhbiBpb2RvbmUgcm91dGluZSBzbyB0aGF0IHdlIGNhbiByZW1vdmUgdGhpcyBkcXVvdCBmcm9tIHRoZQorCSAqIEFJTCBhbmQgcmVsZWFzZSB0aGUgZmx1c2ggbG9jayBvbmNlIHRoZSBkcXVvdCBpcyBzeW5jZWQgdG8gZGlzay4KKwkgKi8KKwl4ZnNfYnVmX2F0dGFjaF9pb2RvbmUoYnAsICh2b2lkKCopKHhmc19idWZfdCAqLCB4ZnNfbG9nX2l0ZW1fdCAqKSkKKwkJCSAgICAgIHhmc19xbV9kcWZsdXNoX2RvbmUsICYoZHFwLT5xX2xvZ2l0ZW0ucWxpX2l0ZW0pKTsKKwkvKgorCSAqIElmIHRoZSBidWZmZXIgaXMgcGlubmVkIHRoZW4gcHVzaCBvbiB0aGUgbG9nIHNvIHdlIHdvbid0CisJICogZ2V0IHN0dWNrIHdhaXRpbmcgaW4gdGhlIHdyaXRlIGZvciB0b28gbG9uZy4KKwkgKi8KKwlpZiAoWEZTX0JVRl9JU1BJTk5FRChicCkpIHsKKwkJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiRFFGTFVTSCBMT0cgRk9SQ0UiKTsKKwkJeGZzX2xvZ19mb3JjZShtcCwgKHhmc19sc25fdCkwLCBYRlNfTE9HX0ZPUkNFKTsKKwl9CisKKwlpZiAoZmxhZ3MgJiBYRlNfUU1PUFRfREVMV1JJKSB7CisJCXhmc19iZHdyaXRlKG1wLCBicCk7CisJfSBlbHNlIGlmIChmbGFncyAmIFhGU19RTU9QVF9BU1lOQykgeworCQl4ZnNfYmF3cml0ZShtcCwgYnApOworCX0gZWxzZSB7CisJCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOworCX0KKwl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUUZMVVNIIEVORCIpOworCS8qCisJICogZHFwIGlzIHN0aWxsIGxvY2tlZCwgYnV0IGNhbGxlciBpcyBmcmVlIHRvIHVubG9jayBpdCBub3cuCisJICovCisJcmV0dXJuIChlcnJvcik7CisKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGRxdW90IGZsdXNoaW5nIEkvTyBjb21wbGV0aW9uIHJvdXRpbmUuICBJdCBpcyBjYWxsZWQKKyAqIGZyb20gaW50ZXJydXB0IGxldmVsIHdoZW4gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkcXVvdCBpcworICogZmx1c2hlZCB0byBkaXNrLiAgSXQgaXMgcmVzcG9uc2libGUgZm9yIHJlbW92aW5nIHRoZSBkcXVvdCBsb2dpdGVtCisgKiBmcm9tIHRoZSBBSUwgaWYgaXQgaGFzIG5vdCBiZWVuIHJlLWxvZ2dlZCwgYW5kIHVubG9ja2luZyB0aGUgZHF1b3QncworICogZmx1c2ggbG9jay4gVGhpcyBiZWhhdmlvciBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhhdCBvZiBpbm9kZXMuLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB2b2lkCit4ZnNfcW1fZHFmbHVzaF9kb25lKAorCXhmc19idWZfdAkJKmJwLAorCXhmc19kcV9sb2dpdGVtX3QJKnFpcCkKK3sKKwl4ZnNfZHF1b3RfdAkJKmRxcDsKKwlTUExERUNMKHMpOworCisJZHFwID0gcWlwLT5xbGlfZHF1b3Q7CisKKwkvKgorCSAqIFdlIG9ubHkgd2FudCB0byBwdWxsIHRoZSBpdGVtIGZyb20gdGhlIEFJTCBpZiBpdHMKKwkgKiBsb2NhdGlvbiBpbiB0aGUgbG9nIGhhcyBub3QgY2hhbmdlZCBzaW5jZSB3ZSBzdGFydGVkIHRoZSBmbHVzaC4KKwkgKiBUaHVzLCB3ZSBvbmx5IGJvdGhlciBpZiB0aGUgZHF1b3QncyBsc24gaGFzCisJICogbm90IGNoYW5nZWQuIEZpcnN0IHdlIGNoZWNrIHRoZSBsc24gb3V0c2lkZSB0aGUgbG9jaworCSAqIHNpbmNlIGl0J3MgY2hlYXBlciwgYW5kIHRoZW4gd2UgcmVjaGVjayB3aGlsZQorCSAqIGhvbGRpbmcgdGhlIGxvY2sgYmVmb3JlIHJlbW92aW5nIHRoZSBkcXVvdCBmcm9tIHRoZSBBSUwuCisJICovCisJaWYgKChxaXAtPnFsaV9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkgJiYKKwkgICAgcWlwLT5xbGlfaXRlbS5saV9sc24gPT0gcWlwLT5xbGlfZmx1c2hfbHNuKSB7CisKKwkJQUlMX0xPQ0soZHFwLT5xX21vdW50LCBzKTsKKwkJLyoKKwkJICogeGZzX3RyYW5zX2RlbGV0ZV9haWwoKSBkcm9wcyB0aGUgQUlMIGxvY2suCisJCSAqLworCQlpZiAocWlwLT5xbGlfaXRlbS5saV9sc24gPT0gcWlwLT5xbGlfZmx1c2hfbHNuKQorCQkJeGZzX3RyYW5zX2RlbGV0ZV9haWwoZHFwLT5xX21vdW50LAorCQkJCQkgICAgICh4ZnNfbG9nX2l0ZW1fdCopcWlwLCBzKTsKKwkJZWxzZQorCQkJQUlMX1VOTE9DSyhkcXAtPnFfbW91bnQsIHMpOworCX0KKworCS8qCisJICogUmVsZWFzZSB0aGUgZHEncyBmbHVzaCBsb2NrIHNpbmNlIHdlJ3JlIGRvbmUgd2l0aCBpdC4KKwkgKi8KKwl4ZnNfZHFmdW5sb2NrKGRxcCk7Cit9CisKKworaW50Cit4ZnNfcW1fZHFmbG9ja19ub3dhaXQoCisJeGZzX2RxdW90X3QgKmRxcCkKK3sKKwlpbnQgbG9ja2VkOworCisJbG9ja2VkID0gY3BzZW1hKCYoKGRxcCktPnFfZmxvY2spKTsKKworCS8qIFhYWCBpZmRlZiB0aGVzZSBvdXQgKi8KKwlpZiAobG9ja2VkKQorCQkoZHFwKS0+ZHFfZmxhZ3MgfD0gWEZTX0RRX0ZMT0NLRUQ7CisJcmV0dXJuIChsb2NrZWQpOworfQorCisKK2ludAoreGZzX3FtX2RxbG9ja19ub3dhaXQoCisJeGZzX2RxdW90X3QgKmRxcCkKK3sKKwlyZXR1cm4gKG11dGV4X3RyeWxvY2soJigoZHFwKS0+cV9xbG9jaykpKTsKK30KKwordm9pZAoreGZzX2RxbG9jaygKKwl4ZnNfZHF1b3RfdCAqZHFwKQoreworCW11dGV4X2xvY2soJihkcXAtPnFfcWxvY2spLCBQSU5PRCk7Cit9CisKK3ZvaWQKK3hmc19kcXVubG9jaygKKwl4ZnNfZHF1b3RfdCAqZHFwKQoreworCW11dGV4X3VubG9jaygmKGRxcC0+cV9xbG9jaykpOworCWlmIChkcXAtPnFfbG9naXRlbS5xbGlfZHF1b3QgPT0gZHFwKSB7CisJCS8qIE9uY2Ugd2FzIGRxcC0+cV9tb3VudCwgYnV0IG1pZ2h0IGp1c3QgaGF2ZSBiZWVuIGNsZWFyZWQgKi8KKwkJeGZzX3RyYW5zX3VubG9ja2VkX2l0ZW0oZHFwLT5xX2xvZ2l0ZW0ucWxpX2l0ZW0ubGlfbW91bnRwLAorCQkJCQkoeGZzX2xvZ19pdGVtX3QqKSYoZHFwLT5xX2xvZ2l0ZW0pKTsKKwl9Cit9CisKKwordm9pZAoreGZzX2RxdW5sb2NrX25vbm90aWZ5KAorCXhmc19kcXVvdF90ICpkcXApCit7CisJbXV0ZXhfdW5sb2NrKCYoZHFwLT5xX3Fsb2NrKSk7Cit9CisKK3ZvaWQKK3hmc19kcWxvY2syKAorCXhmc19kcXVvdF90CSpkMSwKKwl4ZnNfZHF1b3RfdAkqZDIpCit7CisJaWYgKGQxICYmIGQyKSB7CisJCUFTU0VSVChkMSAhPSBkMik7CisJCWlmIChJTlRfR0VUKGQxLT5xX2NvcmUuZF9pZCwgQVJDSF9DT05WRVJUKSA+IElOVF9HRVQoZDItPnFfY29yZS5kX2lkLCBBUkNIX0NPTlZFUlQpKSB7CisJCQl4ZnNfZHFsb2NrKGQyKTsKKwkJCXhmc19kcWxvY2soZDEpOworCQl9IGVsc2UgeworCQkJeGZzX2RxbG9jayhkMSk7CisJCQl4ZnNfZHFsb2NrKGQyKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChkMSkgeworCQkJeGZzX2RxbG9jayhkMSk7CisJCX0gZWxzZSBpZiAoZDIpIHsKKwkJCXhmc19kcWxvY2soZDIpOworCQl9CisJfQorfQorCisKKy8qCisgKiBUYWtlIGEgZHF1b3Qgb3V0IG9mIHRoZSBtb3VudCdzIGRxbGlzdCBhcyB3ZWxsIGFzIHRoZSBoYXNobGlzdC4KKyAqIFRoaXMgaXMgY2FsbGVkIHZpYSB1bm1vdW50IGFzIHdlbGwgYXMgcXVvdGFvZmYsIGFuZCB0aGUgcHVyZ2UKKyAqIHdpbGwgYWx3YXlzIHN1Y2NlZWQgdW5sZXNzIHRoZXJlIGFyZSBzb2Z0ICh0ZW1wKSByZWZlcmVuY2VzCisgKiBvdXRzdGFuZGluZy4KKyAqCisgKiBUaGlzIHJldHVybnMgMCBpZiBpdCB3YXMgcHVyZ2VkLCAxIGlmIGl0IHdhc24ndC4gSXQncyBub3QgYW4gZXJyb3IgY29kZQorICogdGhhdCB3ZSdyZSByZXR1cm5pbmchIFhYWHN1cCAtIG5vdCBjb29sLgorICovCisvKiBBUkdTVVNFRCAqLworaW50Cit4ZnNfcW1fZHFwdXJnZSgKKwl4ZnNfZHF1b3RfdAkqZHFwLAorCXVpbnQJCWZsYWdzKQoreworCXhmc19kcWhhc2hfdAkqdGhpc2hhc2g7CisJeGZzX21vdW50X3QJKm1wOworCisJbXAgPSBkcXAtPnFfbW91bnQ7CisKKwlBU1NFUlQoWEZTX1FNX0lTX01QTElTVF9MT0NLRUQobXApKTsKKwlBU1NFUlQoWEZTX0RRX0lTX0hBU0hfTE9DS0VEKGRxcC0+cV9oYXNoKSk7CisKKwl4ZnNfZHFsb2NrKGRxcCk7CisJLyoKKwkgKiBXZSByZWFsbHkgY2FuJ3QgYWZmb3JkIHRvIHB1cmdlIGEgZHF1b3QgdGhhdCBpcworCSAqIHJlZmVyZW5jZWQsIGJlY2F1c2UgdGhlc2UgYXJlIGhhcmQgcmVmcy4KKwkgKiBJdCBzaG91bGRuJ3QgaGFwcGVuIGluIGdlbmVyYWwgYmVjYXVzZSB3ZSB3ZW50IHRocnUgX2FsbF8gaW5vZGVzIGluCisJICogZHFyZWxlX2FsbF9pbm9kZXMgYmVmb3JlIGNhbGxpbmcgdGhpcyBhbmQgZGlkbid0IGxldCB0aGUgbW91bnRsb2NrIGdvLgorCSAqIEhvd2V2ZXIgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBoYXZlIGRxdW90cyB3aXRoIHRlbXBvcmFyeQorCSAqIHJlZmVyZW5jZXMgdGhhdCBhcmUgbm90IGF0dGFjaGVkIHRvIGFuIGlub2RlLiBlLmcuIHNlZSB4ZnNfc2V0YXR0cigpLgorCSAqLworCWlmIChkcXAtPnFfbnJlZnMgIT0gMCkgeworCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJWEZTX0RRX0hBU0hfVU5MT0NLKGRxcC0+cV9oYXNoKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwlBU1NFUlQoWEZTX0RRX0lTX09OX0ZSRUVMSVNUKGRxcCkpOworCisJLyoKKwkgKiBJZiB3ZSdyZSB0dXJuaW5nIG9mZiBxdW90YXMsIHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQsIGZvcgorCSAqIGV4YW1wbGUsIHdlIGRvbid0IGRlbGV0ZSBxdW90YSBkaXNrIGJsb2NrcyB3aGlsZSBkcXVvdHMgYXJlCisJICogaW4gdGhlIHByb2Nlc3Mgb2YgZ2V0dGluZyB3cml0dGVuIHRvIHRob3NlIGRpc2sgYmxvY2tzLgorCSAqIFRoaXMgZHF1b3QgbWlnaHQgd2VsbCBiZSBvbiBBSUwsIGFuZCB3ZSBjYW4ndCBsZWF2ZSBpdCB0aGVyZQorCSAqIGlmIHdlJ3JlIHR1cm5pbmcgb2ZmIHF1b3Rhcy4gQmFzaWNhbGx5LCB3ZSBuZWVkIHRoaXMgZmx1c2gKKwkgKiBsb2NrLCBhbmQgYXJlIHdpbGxpbmcgdG8gYmxvY2sgb24gaXQuCisJICovCisJaWYgKCEgeGZzX3FtX2RxZmxvY2tfbm93YWl0KGRxcCkpIHsKKwkJLyoKKwkJICogQmxvY2sgb24gdGhlIGZsdXNoIGxvY2sgYWZ0ZXIgbnVkZ2luZyBkcXVvdCBidWZmZXIsCisJCSAqIGlmIGl0IGlzIGluY29yZS4KKwkJICovCisJCXhmc19xbV9kcWZsb2NrX3B1c2hidWZfd2FpdChkcXApOworCX0KKworCS8qCisJICogWFhYSWYgd2UncmUgdHVybmluZyB0aGlzIHR5cGUgb2YgcXVvdGFzIG9mZiwgd2UgZG9uJ3QgY2FyZQorCSAqIGFib3V0IHRoZSBkaXJ0eSBtZXRhZGF0YSBzaXR0aW5nIGluIHRoaXMgZHF1b3QuIE9UT0gsIGlmCisJICogd2UncmUgdW5tb3VudGluZywgd2UgZG8gY2FyZSwgc28gd2UgZmx1c2ggaXQgYW5kIHdhaXQuCisJICovCisJaWYgKFhGU19EUV9JU19ESVJUWShkcXApKSB7CisJCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRUFVSR0UgLT5EUUZMVVNIOiBEUURJUlRZIik7CisJCS8qIGRxZmx1c2ggdW5sb2NrcyBkcWZsb2NrICovCisJCS8qCisJCSAqIEdpdmVuIHRoYXQgZHFwdXJnZSBpcyBhIHZlcnkgcmFyZSBvY2N1cnJlbmNlLCBpdCBpcyBPSworCQkgKiB0aGF0IHdlJ3JlIGhvbGRpbmcgdGhlIGhhc2hsaXN0IGFuZCBtcGxpc3QgbG9ja3MKKwkJICogYWNyb3NzIHRoZSBkaXNrIHdyaXRlLiBCdXQsIC4uLiBYWFhzdXAKKwkJICoKKwkJICogV2UgZG9uJ3QgY2FyZSBhYm91dCBnZXR0aW5nIGRpc2sgZXJyb3JzIGhlcmUuIFdlIG5lZWQKKwkJICogdG8gcHVyZ2UgdGhpcyBkcXVvdCBhbnl3YXksIHNvIHdlIGdvIGFoZWFkIHJlZ2FyZGxlc3MuCisJCSAqLworCQkodm9pZCkgeGZzX3FtX2RxZmx1c2goZHFwLCBYRlNfUU1PUFRfU1lOQyk7CisJCXhmc19kcWZsb2NrKGRxcCk7CisJfQorCUFTU0VSVChkcXAtPnFfcGluY291bnQgPT0gMCk7CisJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04obXApIHx8CisJICAgICAgICEoZHFwLT5xX2xvZ2l0ZW0ucWxpX2l0ZW0ubGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSk7CisKKwl0aGlzaGFzaCA9IGRxcC0+cV9oYXNoOworCVhRTV9IQVNITElTVF9SRU1PVkUodGhpc2hhc2gsIGRxcCk7CisJWFFNX01QTElTVF9SRU1PVkUoJihYRlNfUUlfTVBMX0xJU1QobXApKSwgZHFwKTsKKwkvKgorCSAqIFhYWCBNb3ZlIHRoaXMgdG8gdGhlIGZyb250IG9mIHRoZSBmcmVlbGlzdCwgaWYgd2UgY2FuIGdldCB0aGUKKwkgKiBmcmVlbGlzdCBsb2NrLgorCSAqLworCUFTU0VSVChYRlNfRFFfSVNfT05fRlJFRUxJU1QoZHFwKSk7CisKKwlkcXAtPnFfbW91bnQgPSBOVUxMOworCWRxcC0+cV9oYXNoID0gTlVMTDsKKwlkcXAtPmRxX2ZsYWdzID0gWEZTX0RRX0lOQUNUSVZFOworCW1lbXNldCgmZHFwLT5xX2NvcmUsIDAsIHNpemVvZihkcXAtPnFfY29yZSkpOworCXhmc19kcWZ1bmxvY2soZHFwKTsKKwl4ZnNfZHF1bmxvY2soZHFwKTsKKwlYRlNfRFFfSEFTSF9VTkxPQ0sodGhpc2hhc2gpOworCXJldHVybiAoMCk7Cit9CisKKworI2lmZGVmIFFVT1RBREVCVUcKK3ZvaWQKK3hmc19xbV9kcXByaW50KHhmc19kcXVvdF90ICpkcXApCit7CisJY21uX2VycihDRV9ERUJVRywgIi0tLS0tLS0tLS0tS0VSTkVMIERRVU9ULS0tLS0tLS0tLS0tLS0tLSIpOworCWNtbl9lcnIoQ0VfREVCVUcsICItLS0tIGRxdW90SUQgPSAgJWQiLAorCQkoaW50KUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9pZCwgQVJDSF9DT05WRVJUKSk7CisJY21uX2VycihDRV9ERUJVRywgIi0tLS0gdHlwZSAgICA9ICAlcyIsCisJCVhGU19RTV9JU1VEUShkcXApID8gIlVTUiIgOiAiR1JQIik7CisJY21uX2VycihDRV9ERUJVRywgIi0tLS0gZnMgICAgICA9ICAweCVwIiwgZHFwLT5xX21vdW50KTsKKwljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSBibGtubyAgID0gIDB4JXgiLCAoaW50KSBkcXAtPnFfYmxrbm8pOworCWNtbl9lcnIoQ0VfREVCVUcsICItLS0tIGJvZmZzZXQgPSAgMHgleCIsIChpbnQpIGRxcC0+cV9idWZvZmZzZXQpOworCWNtbl9lcnIoQ0VfREVCVUcsICItLS0tIGJsa2hsaW1pdCA9ICAlTHUgKDB4JXgpIiwKKwkJSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jsa19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCksCisJCShpbnQpIElOVF9HRVQoZHFwLT5xX2NvcmUuZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpKTsKKwljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSBibGtzbGltaXQgPSAgJUx1ICgweCV4KSIsCisJCUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpLAorCQkoaW50KUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpKTsKKwljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSBpbm9obGltaXQgPSAgJUx1ICgweCV4KSIsCisJCUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9pbm9faGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpLAorCQkoaW50KUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9pbm9faGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpKTsKKwljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSBpbm9zbGltaXQgPSAgJUx1ICgweCV4KSIsCisJCUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9pbm9fc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpLAorCQkoaW50KUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9pbm9fc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpKTsKKwljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSBiY291bnQgID0gICVMdSAoMHgleCkiLAorCQlJTlRfR0VUKGRxcC0+cV9jb3JlLmRfYmNvdW50LCBBUkNIX0NPTlZFUlQpLAorCQkoaW50KUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9iY291bnQsIEFSQ0hfQ09OVkVSVCkpOworCWNtbl9lcnIoQ0VfREVCVUcsICItLS0tIGljb3VudCAgPSAgJUx1ICgweCV4KSIsCisJCUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9pY291bnQsIEFSQ0hfQ09OVkVSVCksCisJCShpbnQpSU5UX0dFVChkcXAtPnFfY29yZS5kX2ljb3VudCwgQVJDSF9DT05WRVJUKSk7CisJY21uX2VycihDRV9ERUJVRywgIi0tLS0gYnRpbWVyICA9ICAlZCIsCisJCShpbnQpSU5UX0dFVChkcXAtPnFfY29yZS5kX2J0aW1lciwgQVJDSF9DT05WRVJUKSk7CisJY21uX2VycihDRV9ERUJVRywgIi0tLS0gaXRpbWVyICA9ICAlZCIsCisJCShpbnQpSU5UX0dFVChkcXAtPnFfY29yZS5kX2l0aW1lciwgQVJDSF9DT05WRVJUKSk7CisJY21uX2VycihDRV9ERUJVRywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworfQorI2VuZGlmCisKKy8qCisgKiBHaXZlIHRoZSBidWZmZXIgYSBsaXR0bGUgcHVzaCBpZiBpdCBpcyBpbmNvcmUgYW5kCisgKiB3YWl0IG9uIHRoZSBmbHVzaCBsb2NrLgorICovCit2b2lkCit4ZnNfcW1fZHFmbG9ja19wdXNoYnVmX3dhaXQoCisJeGZzX2RxdW90X3QJKmRxcCkKK3sKKwl4ZnNfYnVmX3QJKmJwOworCisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgdGhlIGRxdW90IGhhcyBiZWVuIGZsdXNoZWQgZGVsYXllZAorCSAqIHdyaXRlLiAgSWYgc28sIGdyYWIgaXRzIGJ1ZmZlciBhbmQgc2VuZCBpdAorCSAqIG91dCBpbW1lZGlhdGVseS4gIFdlJ2xsIGJlIGFibGUgdG8gYWNxdWlyZQorCSAqIHRoZSBmbHVzaCBsb2NrIHdoZW4gdGhlIEkvTyBjb21wbGV0ZXMuCisJICovCisJYnAgPSB4ZnNfaW5jb3JlKGRxcC0+cV9tb3VudC0+bV9kZGV2X3RhcmdwLCBkcXAtPnFfYmxrbm8sCisJCSAgICBYRlNfUUlfRFFDSFVOS0xFTihkcXAtPnFfbW91bnQpLAorCQkgICAgWEZTX0lOQ09SRV9UUllMT0NLKTsKKwlpZiAoYnAgIT0gTlVMTCkgeworCQlpZiAoWEZTX0JVRl9JU0RFTEFZV1JJVEUoYnApKSB7CisJCQlpZiAoWEZTX0JVRl9JU1BJTk5FRChicCkpIHsKKwkJCQl4ZnNfbG9nX2ZvcmNlKGRxcC0+cV9tb3VudCwKKwkJCQkJICAgICAgKHhmc19sc25fdCkwLAorCQkJCQkgICAgICBYRlNfTE9HX0ZPUkNFKTsKKwkJCX0KKwkJCXhmc19iYXdyaXRlKGRxcC0+cV9tb3VudCwgYnApOworCQl9IGVsc2UgeworCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCX0KKwl9CisJeGZzX2RxZmxvY2soZHFwKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuaCBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzNmZTMxCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5oCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLgkgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19EUVVPVF9IX18KKyNkZWZpbmUgX19YRlNfRFFVT1RfSF9fCisKKy8qCisgKiBEcXVvdHMgYXJlIHN0cnVjdHVyZXMgdGhhdCBob2xkIHF1b3RhIGluZm9ybWF0aW9uIGFib3V0IGEgdXNlciBvciBhIGdyb3VwLAorICogbXVjaCBsaWtlIGlub2RlcyBhcmUgZm9yIGZpbGVzLiBJbiBmYWN0LCBkcXVvdHMgc2hhcmUgbWFueSBjaGFyYWN0ZXJpc3RpY3MKKyAqIHdpdGggaW5vZGVzLiBIb3dldmVyLCBkcXVvdHMgY2FuIGFsc28gYmUgYSBjZW50cmFsaXplZCByZXNvdXJjZSwgcmVsYXRpdmUKKyAqIHRvIGEgY29sbGVjdGlvbiBvZiBpbm9kZXMuIEluIHRoaXMgcmVzcGVjdCwgZHF1b3RzIHNoYXJlIHNvbWUgY2hhcmFjdGVyaXN0aWNzCisgKiBvZiB0aGUgc3VwZXJibG9jay4KKyAqIFhGUyBkcXVvdHMgZXhwbG9pdCBib3RoIHRob3NlIGluIGl0cyBhbGdvcml0aG1zLiBUaGV5IG1ha2UgZXZlcnkgYXR0ZW1wdAorICogdG8gbm90IGJlIGEgYm90dGxlbmVjayB3aGVuIHF1b3RhcyBhcmUgb24gYW5kIGhhdmUgbWluaW1hbCBpbXBhY3QsIGlmIGFueSwKKyAqIHdoZW4gcXVvdGFzIGFyZSBvZmYuCisgKi8KKworLyoKKyAqIFRoZSBoYXNoIGNoYWluIGhlYWRlcnMgKGhhc2ggYnVja2V0cykKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RxaGFzaCB7CisJc3RydWN0IHhmc19kcXVvdCAqcWhfbmV4dDsKKwltdXRleF90CQkgIHFoX2xvY2s7CisJdWludAkJICBxaF92ZXJzaW9uOwkvKiBldmVyIGluY3JlYXNpbmcgdmVyc2lvbiAqLworCXVpbnQJCSAgcWhfbmVsZW1zOwkvKiBudW1iZXIgb2YgZHF1b3RzIG9uIHRoZSBsaXN0ICovCit9IHhmc19kcWhhc2hfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RxbGluayB7CisJc3RydWN0IHhmc19kcXVvdCAgKnFsX25leHQ7CS8qIGZvcndhcmQgbGluayAqLworCXN0cnVjdCB4ZnNfZHF1b3QgKipxbF9wcmV2cDsJLyogcG9pbnRlciB0byBwcmV2IHFsX25leHQgKi8KK30geGZzX2RxbGlua190OworCitzdHJ1Y3QgeGZzX21vdW50Oworc3RydWN0IHhmc190cmFuczsKKworLyoKKyAqIFRoaXMgaXMgdGhlIG1hcmtlciB3aGljaCBpcyBkZXNpZ25lZCB0byBvY2N1cHkgdGhlIGZpcnN0IGZldworICogYnl0ZXMgb2YgdGhlIHhmc19kcXVvdF90IHN0cnVjdHVyZS4gRXZlbiBpbnNpZGUgdGhpcywgdGhlIGZyZWVsaXN0IHBvaW50ZXJzCisgKiBtdXN0IGNvbWUgZmlyc3QuCisgKiBUaGlzIHNlcnZlcyBhcyB0aGUgbWFya2VyICgic2VudGluZWwiKSB3aGVuIHdlIGhhdmUgdG8gcmVzdGFydCBsaXN0CisgKiBpdGVyYXRpb25zIGJlY2F1c2Ugb2YgbG9ja2luZyBjb25zaWRlcmF0aW9ucy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RxbWFya2VyIHsKKwlzdHJ1Y3QgeGZzX2RxdW90KmRxbV9mbG5leHQ7CS8qIGxpbmsgdG8gZnJlZWxpc3Q6IG11c3QgYmUgZmlyc3QgKi8KKwlzdHJ1Y3QgeGZzX2RxdW90KmRxbV9mbHByZXY7CisJeGZzX2RxbGlua190CSBkcW1fbXBsaXN0OwkvKiBsaW5rIHRvIG1vdW50J3MgbGlzdCBvZiBkcXVvdHMgKi8KKwl4ZnNfZHFsaW5rX3QJIGRxbV9oYXNobGlzdDsJLyogbGluayB0byB0aGUgaGFzaCBjaGFpbiAqLworCXVpbnQJCSBkcW1fZmxhZ3M7CS8qIHZhcmlvdXMgZmxhZ3MgKFhGU19EUV8qKSAqLworfSB4ZnNfZHFtYXJrZXJfdDsKKworLyoKKyAqIFRoZSBpbmNvcmUgZHF1b3Qgc3RydWN0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19kcXVvdCB7CisJeGZzX2RxbWFya2VyX3QJIHFfbGlzdHM7CS8qIGxpc3QgcHRycywgcV9mbGFncyAobWFya2VyKSAqLworCXhmc19kcWhhc2hfdAkqcV9oYXNoOwkvKiB0aGUgaGFzaGNoYWluIGhlYWRlciAqLworCXN0cnVjdCB4ZnNfbW91bnQqcV9tb3VudDsJLyogZmlsZXN5c3RlbSB0aGlzIHJlbGF0ZXMgdG8gKi8KKwlzdHJ1Y3QgeGZzX3RyYW5zKnFfdHJhbnNwOwkvKiB0cmFucyB0aGlzIGJlbG9uZ3MgdG8gY3VycmVudGx5ICovCisJdWludAkJIHFfbnJlZnM7CS8qICMgYWN0aXZlIHJlZnMgZnJvbSBpbm9kZXMgKi8KKwl4ZnNfZGFkZHJfdAkgcV9ibGtubzsJLyogYmxrbm8gb2YgZHF1b3QgYnVmZmVyICovCisJaW50CQkgcV9idWZvZmZzZXQ7CS8qIG9mZiBvZiBkcSBpbiBidWZmZXIgKCMgZHF1b3RzKSAqLworCXhmc19maWxlb2ZmX3QJIHFfZmlsZW9mZnNldDsJLyogb2Zmc2V0IGluIHF1b3RhcyBmaWxlICovCisKKwlzdHJ1Y3QgeGZzX2RxdW90KnFfZ2RxdW90OwkvKiBncm91cCBkcXVvdCwgaGludCBvbmx5ICovCisJeGZzX2Rpc2tfZHF1b3RfdCBxX2NvcmU7CS8qIGFjdHVhbCB1c2FnZSAmIHF1b3RhcyAqLworCXhmc19kcV9sb2dpdGVtX3QgcV9sb2dpdGVtOwkvKiBkcXVvdCBsb2cgaXRlbSAqLworCXhmc19xY250X3QJIHFfcmVzX2Jjb3VudDsJLyogdG90YWwgcmVndWxhciBuYmxrcyB1c2VkK3Jlc2VydmVkICovCisJeGZzX3FjbnRfdAkgcV9yZXNfaWNvdW50OwkvKiB0b3RhbCBpbm9zIGFsbG9jZCtyZXNlcnZlZCAqLworCXhmc19xY250X3QJIHFfcmVzX3J0YmNvdW50Oy8qIHRvdGFsIHJlYWx0aW1lIGJsa3MgdXNlZCtyZXNlcnZlZCAqLworCW11dGV4X3QJCSBxX3Fsb2NrOwkvKiBxdW90YSBsb2NrICovCisJc2VtYV90CQkgcV9mbG9jazsJLyogZmx1c2ggbG9jayAqLworCXVpbnQJCSBxX3BpbmNvdW50OwkvKiBwaW4gY291bnQgZm9yIHRoaXMgZHF1b3QgKi8KKwlzdl90CQkgcV9waW53YWl0OwkvKiBzeW5jIHZhciBmb3IgcGlubmluZyAqLworI2lmZGVmIFhGU19EUVVPVF9UUkFDRQorCXN0cnVjdCBrdHJhY2UJKnFfdHJhY2U7CS8qIHRyYWNlIGhlYWRlciBzdHJ1Y3R1cmUgKi8KKyNlbmRpZgorfSB4ZnNfZHF1b3RfdDsKKworCisjZGVmaW5lIGRxX2ZsbmV4dAlxX2xpc3RzLmRxbV9mbG5leHQKKyNkZWZpbmUgZHFfZmxwcmV2CXFfbGlzdHMuZHFtX2ZscHJldgorI2RlZmluZSBkcV9tcGxpc3QJcV9saXN0cy5kcW1fbXBsaXN0CisjZGVmaW5lIGRxX2hhc2hsaXN0CXFfbGlzdHMuZHFtX2hhc2hsaXN0CisjZGVmaW5lIGRxX2ZsYWdzCXFfbGlzdHMuZHFtX2ZsYWdzCisKKyNkZWZpbmUgWEZTX0RRSE9MRChkcXApCQkoKGRxcCktPnFfbnJlZnMrKykKKworLyoKKyAqIFF1b3RhIEFjY291bnRpbmcgZmxhZ3MKKyAqLworI2RlZmluZSBYRlNfQUxMX1FVT1RBX0FDQ1QJKFhGU19VUVVPVEFfQUNDVCB8IFhGU19HUVVPVEFfQUNDVCkKKyNkZWZpbmUgWEZTX0FMTF9RVU9UQV9FTkZECShYRlNfVVFVT1RBX0VORkQgfCBYRlNfR1FVT1RBX0VORkQpCisjZGVmaW5lIFhGU19BTExfUVVPVEFfQ0hLRAkoWEZTX1VRVU9UQV9DSEtEIHwgWEZTX0dRVU9UQV9DSEtEKQorI2RlZmluZSBYRlNfQUxMX1FVT1RBX0FDVFYJKFhGU19VUVVPVEFfQUNUSVZFIHwgWEZTX0dRVU9UQV9BQ1RJVkUpCisjZGVmaW5lIFhGU19BTExfUVVPVEFfQUNDVF9FTkZEIChYRlNfVVFVT1RBX0FDQ1R8WEZTX1VRVU9UQV9FTkZEfFwKKwkJCQkgWEZTX0dRVU9UQV9BQ0NUfFhGU19HUVVPVEFfRU5GRCkKKworI2RlZmluZSBYRlNfSVNfUVVPVEFfUlVOTklORyhtcCkgICgobXApLT5tX3FmbGFncyAmIFhGU19BTExfUVVPVEFfQUNDVCkKKyNkZWZpbmUgWEZTX0lTX1VRVU9UQV9SVU5OSU5HKG1wKSAoKG1wKS0+bV9xZmxhZ3MgJiBYRlNfVVFVT1RBX0FDQ1QpCisjZGVmaW5lIFhGU19JU19HUVVPVEFfUlVOTklORyhtcCkgKChtcCktPm1fcWZsYWdzICYgWEZTX0dRVU9UQV9BQ0NUKQorCisvKgorICogUXVvdGEgTGltaXQgRW5mb3JjZW1lbnQgZmxhZ3MKKyAqLworI2RlZmluZSBYRlNfSVNfUVVPVEFfRU5GT1JDRUQobXApCSgobXApLT5tX3FmbGFncyAmIFhGU19BTExfUVVPVEFfRU5GRCkKKyNkZWZpbmUgWEZTX0lTX1VRVU9UQV9FTkZPUkNFRChtcCkJKChtcCktPm1fcWZsYWdzICYgWEZTX1VRVU9UQV9FTkZEKQorI2RlZmluZSBYRlNfSVNfR1FVT1RBX0VORk9SQ0VEKG1wKQkoKG1wKS0+bV9xZmxhZ3MgJiBYRlNfR1FVT1RBX0VORkQpCisKKyNpZmRlZiBERUJVRworc3RhdGljIGlubGluZSBpbnQKK1hGU19EUV9JU19MT0NLRUQoeGZzX2RxdW90X3QgKmRxcCkKK3sKKwlpZiAobXV0ZXhfdHJ5bG9jaygmZHFwLT5xX3Fsb2NrKSkgeworCQltdXRleF91bmxvY2soJmRxcC0+cV9xbG9jayk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHRocmVlIHJvdXRpbmVzIHNpbXBseSBtYW5hZ2UgdGhlIHFfZmxvY2sKKyAqIHNlbWFwaG9yZSBlbWJlZGRlZCBpbiB0aGUgZHF1b3QuICBUaGlzIHNlbWFwaG9yZSBzeW5jaHJvbml6ZXMKKyAqIHByb2Nlc3NlcyBhdHRlbXB0aW5nIHRvIGZsdXNoIHRoZSBpbi1jb3JlIGRxdW90IGJhY2sgdG8gZGlzay4KKyAqLworI2RlZmluZSB4ZnNfZHFmbG9jayhkcXApCSB7IHBzZW1hKCYoKGRxcCktPnFfZmxvY2spLCBQSU5PRCB8IFBSRUNBTEMpO1wKKwkJCQkgICAoZHFwKS0+ZHFfZmxhZ3MgfD0gWEZTX0RRX0ZMT0NLRUQ7IH0KKyNkZWZpbmUgeGZzX2RxZnVubG9jayhkcXApCSB7IEFTU0VSVCh2YWx1c2VtYSgmKChkcXApLT5xX2Zsb2NrKSkgPD0gMCk7IFwKKwkJCQkgICB2c2VtYSgmKChkcXApLT5xX2Zsb2NrKSk7IFwKKwkJCQkgICAoZHFwKS0+ZHFfZmxhZ3MgJj0gfihYRlNfRFFfRkxPQ0tFRCk7IH0KKworI2RlZmluZSBYRlNfRFFfUElOTE9DSyhkcXApCSAgIG11dGV4X3NwaW5sb2NrKCBcCisJCQkJICAgICAmKFhGU19EUV9UT19RSU5GKGRxcCktPnFpX3BpbmxvY2spKQorI2RlZmluZSBYRlNfRFFfUElOVU5MT0NLKGRxcCwgcykgICBtdXRleF9zcGludW5sb2NrKCBcCisJCQkJICAgICAmKFhGU19EUV9UT19RSU5GKGRxcCktPnFpX3BpbmxvY2spLCBzKQorCisjZGVmaW5lIFhGU19EUV9JU19GTFVTSF9MT0NLRUQoZHFwKSAodmFsdXNlbWEoJigoZHFwKS0+cV9mbG9jaykpIDw9IDApCisjZGVmaW5lIFhGU19EUV9JU19PTl9GUkVFTElTVChkcXApICAoKGRxcCktPmRxX2ZsbmV4dCAhPSAoZHFwKSkKKyNkZWZpbmUgWEZTX0RRX0lTX0RJUlRZKGRxcCkJKChkcXApLT5kcV9mbGFncyAmIFhGU19EUV9ESVJUWSkKKyNkZWZpbmUgWEZTX1FNX0lTVURRKGRxcCkJKChkcXApLT5kcV9mbGFncyAmIFhGU19EUV9VU0VSKQorI2RlZmluZSBYRlNfRFFfVE9fUUlORihkcXApCSgoZHFwKS0+cV9tb3VudC0+bV9xdW90YWluZm8pCisjZGVmaW5lIFhGU19EUV9UT19RSVAoZHFwKQkoWEZTX1FNX0lTVURRKGRxcCkgPyBcCisJCQkJIFhGU19EUV9UT19RSU5GKGRxcCktPnFpX3VxdW90YWlwIDogXAorCQkJCSBYRlNfRFFfVE9fUUlORihkcXApLT5xaV9ncXVvdGFpcCkKKworI2RlZmluZSBYRlNfSVNfVEhJU19RVU9UQV9PRkYoZCkgKCEgKFhGU19RTV9JU1VEUShkKSA/IFwKKwkJCQkgICAgIChYRlNfSVNfVVFVT1RBX09OKChkKS0+cV9tb3VudCkpIDogXAorCQkJCSAgICAgKFhGU19JU19HUVVPVEFfT04oKGQpLT5xX21vdW50KSkpKQorCisjaWZkZWYgWEZTX0RRVU9UX1RSQUNFCisvKgorICogRHF1b3QgVHJhY2luZyBzdHVmZi4KKyAqLworI2RlZmluZSBEUVVPVF9UUkFDRV9TSVpFCTY0CisjZGVmaW5lIERRVU9UX0tUUkFDRV9FTlRSWQkxCisKK2V4dGVybiB2b2lkCQlfX3hmc19kcXRyYWNlX2VudHJ5KHhmc19kcXVvdF90ICpkcXAsIGNoYXIgKmZ1bmMsCisJCQkJCSAgICB2b2lkICosIHhmc19pbm9kZV90ICopOworI2RlZmluZSB4ZnNfZHF0cmFjZV9lbnRyeV9pbm8oYSxiLGlwKSBcCisJCV9feGZzX2RxdHJhY2VfZW50cnkoKGEpLCAoYiksICh2b2lkKilfX3JldHVybl9hZGRyZXNzLCAoaXApKQorI2RlZmluZSB4ZnNfZHF0cmFjZV9lbnRyeShhLGIpIFwKKwkJX194ZnNfZHF0cmFjZV9lbnRyeSgoYSksIChiKSwgKHZvaWQqKV9fcmV0dXJuX2FkZHJlc3MsIE5VTEwpCisjZWxzZQorI2RlZmluZSB4ZnNfZHF0cmFjZV9lbnRyeShhLGIpCisjZGVmaW5lIHhmc19kcXRyYWNlX2VudHJ5X2lubyhhLGIsaXApCisjZW5kaWYKKworI2lmZGVmIFFVT1RBREVCVUcKK2V4dGVybiB2b2lkCQl4ZnNfcW1fZHFwcmludCh4ZnNfZHF1b3RfdCAqKTsKKyNlbHNlCisjZGVmaW5lIHhmc19xbV9kcXByaW50KGEpCisjZW5kaWYKKworZXh0ZXJuIHZvaWQJCXhmc19xbV9kcWRlc3Ryb3koeGZzX2RxdW90X3QgKik7CitleHRlcm4gaW50CQl4ZnNfcW1fZHFmbHVzaCh4ZnNfZHF1b3RfdCAqLCB1aW50KTsKK2V4dGVybiBpbnQJCXhmc19xbV9kcXB1cmdlKHhmc19kcXVvdF90ICosIHVpbnQpOworZXh0ZXJuIHZvaWQJCXhmc19xbV9kcXVucGluX3dhaXQoeGZzX2RxdW90X3QgKik7CitleHRlcm4gaW50CQl4ZnNfcW1fZHFsb2NrX25vd2FpdCh4ZnNfZHF1b3RfdCAqKTsKK2V4dGVybiBpbnQJCXhmc19xbV9kcWZsb2NrX25vd2FpdCh4ZnNfZHF1b3RfdCAqKTsKK2V4dGVybiB2b2lkCQl4ZnNfcW1fZHFmbG9ja19wdXNoYnVmX3dhaXQoeGZzX2RxdW90X3QgKmRxcCk7CitleHRlcm4gdm9pZAkJeGZzX3FtX2FkanVzdF9kcXRpbWVycyh4ZnNfbW91bnRfdCAqLAorCQkJCQl4ZnNfZGlza19kcXVvdF90ICopOworZXh0ZXJuIHZvaWQJCXhmc19xbV9hZGp1c3RfZHFsaW1pdHMoeGZzX21vdW50X3QgKiwKKwkJCQkJeGZzX2Rpc2tfZHF1b3RfdCAqKTsKK2V4dGVybiBpbnQJCXhmc19xbV9kcXdhcm4oeGZzX2Rpc2tfZHF1b3RfdCAqLCB1aW50KTsKK2V4dGVybiBpbnQJCXhmc19xbV9kcWdldCh4ZnNfbW91bnRfdCAqLCB4ZnNfaW5vZGVfdCAqLAorCQkJCQl4ZnNfZHFpZF90LCB1aW50LCB1aW50LCB4ZnNfZHF1b3RfdCAqKik7CitleHRlcm4gdm9pZAkJeGZzX3FtX2RxcHV0KHhmc19kcXVvdF90ICopOworZXh0ZXJuIHZvaWQJCXhmc19xbV9kcXJlbGUoeGZzX2RxdW90X3QgKik7CitleHRlcm4gdm9pZAkJeGZzX2RxbG9jayh4ZnNfZHF1b3RfdCAqKTsKK2V4dGVybiB2b2lkCQl4ZnNfZHFsb2NrMih4ZnNfZHF1b3RfdCAqLCB4ZnNfZHF1b3RfdCAqKTsKK2V4dGVybiB2b2lkCQl4ZnNfZHF1bmxvY2soeGZzX2RxdW90X3QgKik7CitleHRlcm4gdm9pZAkJeGZzX2RxdW5sb2NrX25vbm90aWZ5KHhmc19kcXVvdF90ICopOworCisjZW5kaWYgLyogX19YRlNfRFFVT1RfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90X2l0ZW0uYyBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3RfaXRlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NDI1ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90X2l0ZW0uYwpAQCAtMCwwICsxLDcxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19mcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19xdW90YS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19pdGFibGUuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKyNpbmNsdWRlICJ4ZnNfYWNsLmgiCisjaW5jbHVkZSAieGZzX2NhcC5oIgorI2luY2x1ZGUgInhmc19tYWMuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0ci5oIgorI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgorI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCisKKyNpbmNsdWRlICJ4ZnNfcW0uaCIKKworCisvKgorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIGlvdmVjcyBuZWVkZWQgdG8gbG9nIHRoZSBnaXZlbiBkcXVvdCBpdGVtLgorICovCisvKiBBUkdTVVNFRCAqLworU1RBVElDIHVpbnQKK3hmc19xbV9kcXVvdF9sb2dpdGVtX3NpemUoCisJeGZzX2RxX2xvZ2l0ZW1fdAkqbG9naXRlbSkKK3sKKwkvKgorCSAqIHdlIG5lZWQgb25seSB0d28gaW92ZWNzLCBvbmUgZm9yIHRoZSBmb3JtYXQsIG9uZSBmb3IgdGhlIHJlYWwgdGhpbmcKKwkgKi8KKwlyZXR1cm4gKDIpOworfQorCisvKgorICogZmlsbHMgaW4gdGhlIHZlY3RvciBvZiBsb2cgaW92ZWNzIGZvciB0aGUgZ2l2ZW4gZHF1b3QgbG9nIGl0ZW0uCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfcW1fZHF1b3RfbG9naXRlbV9mb3JtYXQoCisJeGZzX2RxX2xvZ2l0ZW1fdAkqbG9naXRlbSwKKwl4ZnNfbG9nX2lvdmVjX3QJCSpsb2d2ZWMpCit7CisJQVNTRVJUKGxvZ2l0ZW0pOworCUFTU0VSVChsb2dpdGVtLT5xbGlfZHF1b3QpOworCisJbG9ndmVjLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpJmxvZ2l0ZW0tPnFsaV9mb3JtYXQ7CisJbG9ndmVjLT5pX2xlbiAgPSBzaXplb2YoeGZzX2RxX2xvZ2Zvcm1hdF90KTsKKwlsb2d2ZWMrKzsKKwlsb2d2ZWMtPmlfYWRkciA9ICh4ZnNfY2FkZHJfdCkmbG9naXRlbS0+cWxpX2RxdW90LT5xX2NvcmU7CisJbG9ndmVjLT5pX2xlbiAgPSBzaXplb2YoeGZzX2Rpc2tfZHF1b3RfdCk7CisKKwlBU1NFUlQoMiA9PSBsb2dpdGVtLT5xbGlfaXRlbS5saV9kZXNjLT5saWRfc2l6ZSk7CisJbG9naXRlbS0+cWxpX2Zvcm1hdC5xbGZfc2l6ZSA9IDI7CisKK30KKworLyoKKyAqIEluY3JlbWVudCB0aGUgcGluIGNvdW50IG9mIHRoZSBnaXZlbiBkcXVvdC4KKyAqIFRoaXMgdmFsdWUgaXMgcHJvdGVjdGVkIGJ5IHBpbmxvY2sgc3BpbmxvY2sgaW4gdGhlIHhRTSBzdHJ1Y3R1cmUuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfcW1fZHF1b3RfbG9naXRlbV9waW4oCisJeGZzX2RxX2xvZ2l0ZW1fdCAqbG9naXRlbSkKK3sKKwl1bnNpZ25lZCBsb25nCXM7CisJeGZzX2RxdW90X3QgKmRxcDsKKworCWRxcCA9IGxvZ2l0ZW0tPnFsaV9kcXVvdDsKKwlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChkcXApKTsKKwlzID0gWEZTX0RRX1BJTkxPQ0soZHFwKTsKKwlkcXAtPnFfcGluY291bnQrKzsKKwlYRlNfRFFfUElOVU5MT0NLKGRxcCwgcyk7Cit9CisKKy8qCisgKiBEZWNyZW1lbnQgdGhlIHBpbiBjb3VudCBvZiB0aGUgZ2l2ZW4gZHF1b3QsIGFuZCB3YWtlIHVwCisgKiBhbnlvbmUgaW4geGZzX2Rxd2FpdF91bnBpbigpIGlmIHRoZSBjb3VudCBnb2VzIHRvIDAuCSBUaGUKKyAqIGRxdW90IG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgcGlubmVkIHdpdGggYSBjYWxsIHRvIHhmc19kcXBpbigpLgorICovCisvKiBBUkdTVVNFRCAqLworU1RBVElDIHZvaWQKK3hmc19xbV9kcXVvdF9sb2dpdGVtX3VucGluKAorCXhmc19kcV9sb2dpdGVtX3QgKmxvZ2l0ZW0sCisJaW50CQkgIHN0YWxlKQoreworCXVuc2lnbmVkIGxvbmcJczsKKwl4ZnNfZHF1b3RfdCAqZHFwOworCisJZHFwID0gbG9naXRlbS0+cWxpX2RxdW90OworCUFTU0VSVChkcXAtPnFfcGluY291bnQgPiAwKTsKKwlzID0gWEZTX0RRX1BJTkxPQ0soZHFwKTsKKwlkcXAtPnFfcGluY291bnQtLTsKKwlpZiAoZHFwLT5xX3BpbmNvdW50ID09IDApIHsKKwkJc3ZfYnJvYWRjYXN0KCZkcXAtPnFfcGlud2FpdCk7CisJfQorCVhGU19EUV9QSU5VTkxPQ0soZHFwLCBzKTsKK30KKworLyogQVJHU1VTRUQgKi8KK1NUQVRJQyB2b2lkCit4ZnNfcW1fZHF1b3RfbG9naXRlbV91bnBpbl9yZW1vdmUoCisJeGZzX2RxX2xvZ2l0ZW1fdCAqbG9naXRlbSwKKwl4ZnNfdHJhbnNfdAkgKnRwKQoreworCXhmc19xbV9kcXVvdF9sb2dpdGVtX3VucGluKGxvZ2l0ZW0sIDApOworfQorCisvKgorICogR2l2ZW4gdGhlIGxvZ2l0ZW0sIHRoaXMgd3JpdGVzIHRoZSBjb3JyZXNwb25kaW5nIGRxdW90IGVudHJ5IHRvIGRpc2sKKyAqIGFzeW5jaHJvbm91c2x5LiBUaGlzIGlzIGNhbGxlZCB3aXRoIHRoZSBkcXVvdCBlbnRyeSBzZWN1cmVseSBsb2NrZWQ7CisgKiB3ZSBzaW1wbHkgZ2V0IHhmc19xbV9kcWZsdXNoKCkgdG8gZG8gdGhlIHdvcmssIGFuZCB1bmxvY2sgdGhlIGRxdW90CisgKiBhdCB0aGUgZW5kLgorICovCitTVEFUSUMgdm9pZAoreGZzX3FtX2RxdW90X2xvZ2l0ZW1fcHVzaCgKKwl4ZnNfZHFfbG9naXRlbV90CSpsb2dpdGVtKQoreworCXhmc19kcXVvdF90CSpkcXA7CisKKwlkcXAgPSBsb2dpdGVtLT5xbGlfZHF1b3Q7CisKKwlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChkcXApKTsKKwlBU1NFUlQoWEZTX0RRX0lTX0ZMVVNIX0xPQ0tFRChkcXApKTsKKworCS8qCisJICogU2luY2Ugd2Ugd2VyZSBhYmxlIHRvIGxvY2sgdGhlIGRxdW90J3MgZmx1c2ggbG9jayBhbmQKKwkgKiB3ZSBmb3VuZCBpdCBvbiB0aGUgQUlMLCB0aGUgZHF1b3QgbXVzdCBiZSBkaXJ0eS4gIFRoaXMKKwkgKiBpcyBiZWNhdXNlIHRoZSBkcXVvdCBpcyByZW1vdmVkIGZyb20gdGhlIEFJTCB3aGlsZSBzdGlsbAorCSAqIGhvbGRpbmcgdGhlIGZsdXNoIGxvY2sgaW4geGZzX2RxZmx1c2hfZG9uZSgpLiAgVGh1cywgaWYKKwkgKiB3ZSBmb3VuZCBpdCBpbiB0aGUgQUlMIGFuZCB3ZXJlIGFibGUgdG8gb2J0YWluIHRoZSBmbHVzaAorCSAqIGxvY2sgd2l0aG91dCBzbGVlcGluZywgdGhlbiB0aGVyZSBtdXN0IG5vdCBoYXZlIGJlZW4KKwkgKiBhbnlvbmUgaW4gdGhlIHByb2Nlc3Mgb2YgZmx1c2hpbmcgdGhlIGRxdW90LgorCSAqLworCXhmc19xbV9kcWZsdXNoKGRxcCwgWEZTX0JfREVMV1JJKTsKKwl4ZnNfZHF1bmxvY2soZHFwKTsKK30KKworLypBUkdTVVNFRCovCitTVEFUSUMgeGZzX2xzbl90Cit4ZnNfcW1fZHF1b3RfbG9naXRlbV9jb21taXR0ZWQoCisJeGZzX2RxX2xvZ2l0ZW1fdAkqbCwKKwl4ZnNfbHNuX3QJCWxzbikKK3sKKwkvKgorCSAqIFdlIGFsd2F5cyByZS1sb2cgdGhlIGVudGlyZSBkcXVvdCB3aGVuIGl0IGJlY29tZXMgZGlydHksCisJICogc28sIHRoZSBsYXRlc3QgY29weSBfaXNfIHRoZSBvbmx5IG9uZSB0aGF0IG1hdHRlcnMuCisJICovCisJcmV0dXJuIChsc24pOworfQorCisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byB3YWl0IGZvciB0aGUgZ2l2ZW4gZHF1b3QgdG8gYmUgdW5waW5uZWQuCisgKiBNb3N0IG9mIHRoZXNlIHBpbi91bnBpbiByb3V0aW5lcyBhcmUgcGxhZ2lhcml6ZWQgZnJvbSBpbm9kZSBjb2RlLgorICovCit2b2lkCit4ZnNfcW1fZHF1bnBpbl93YWl0KAorCXhmc19kcXVvdF90CSpkcXApCit7CisJU1BMREVDTChzKTsKKworCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKGRxcCkpOworCWlmIChkcXAtPnFfcGluY291bnQgPT0gMCkgeworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBHaXZlIHRoZSBsb2cgYSBwdXNoIHNvIHdlIGRvbid0IHdhaXQgaGVyZSB0b28gbG9uZy4KKwkgKi8KKwl4ZnNfbG9nX2ZvcmNlKGRxcC0+cV9tb3VudCwgKHhmc19sc25fdCkwLCBYRlNfTE9HX0ZPUkNFKTsKKwlzID0gWEZTX0RRX1BJTkxPQ0soZHFwKTsKKwlpZiAoZHFwLT5xX3BpbmNvdW50ID09IDApIHsKKwkJWEZTX0RRX1BJTlVOTE9DSyhkcXAsIHMpOworCQlyZXR1cm47CisJfQorCXN2X3dhaXQoJihkcXAtPnFfcGlud2FpdCksIFBJTk9ELAorCQkmKFhGU19EUV9UT19RSU5GKGRxcCktPnFpX3BpbmxvY2spLCBzKTsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gSU9QX1RSWUxPQ0sgcmV0dXJucyBYRlNfSVRFTV9QVVNIQlVGIHRvIGluZGljYXRlIHRoYXQKKyAqIHRoZSBkcXVvdCBpcyBsb2NrZWQgYnkgdXMsIGJ1dCB0aGUgZmx1c2ggbG9jayBpc24ndC4gU28sIGhlcmUgd2UgYXJlCisgKiBnb2luZyB0byBzZWUgaWYgdGhlIHJlbGV2YW50IGRxdW90IGJ1ZmZlciBpcyBpbmNvcmUsIHdhaXRpbmcgb24gREVMV1JJLgorICogSWYgc28sIHdlIHdhbnQgdG8gcHVzaCBpdCBvdXQgdG8gaGVscCB1cyB0YWtlIHRoaXMgaXRlbSBvZmYgdGhlIEFJTCBhcyBzb29uCisgKiBhcyBwb3NzaWJsZS4KKyAqCisgKiBXZSBtdXN0IG5vdCBiZSBob2xkaW5nIHRoZSBBSUxfTE9DSyBhdCB0aGlzIHBvaW50LiBDYWxsaW5nIGluY29yZSgpIHRvCisgKiBzZWFyY2ggdGhlIGJ1ZmZlcmNhY2hlIGNhbiBiZSBhIHRpbWUgY29uc3VtaW5nIHRoaW5nLCBhbmQgQUlMX0xPQ0sgaXMgYQorICogc3BpbmxvY2suCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfcW1fZHF1b3RfbG9naXRlbV9wdXNoYnVmKAorCXhmc19kcV9sb2dpdGVtX3QgICAgKnFpcCkKK3sKKwl4ZnNfZHF1b3RfdAkqZHFwOworCXhmc19tb3VudF90CSptcDsKKwl4ZnNfYnVmX3QJKmJwOworCXVpbnQJCWRvcHVzaDsKKworCWRxcCA9IHFpcC0+cWxpX2RxdW90OworCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKGRxcCkpOworCisJLyoKKwkgKiBUaGUgcWxpX3B1c2hidWZfZmxhZyBrZWVwcyBvdGhlcnMgZnJvbQorCSAqIHRyeWluZyB0byBkdXBsaWNhdGUgb3VyIGVmZm9ydC4KKwkgKi8KKwlBU1NFUlQocWlwLT5xbGlfcHVzaGJ1Zl9mbGFnICE9IDApOworCUFTU0VSVChxaXAtPnFsaV9wdXNoX293bmVyID09IGdldF90aHJlYWRfaWQoKSk7CisKKwkvKgorCSAqIElmIGZsdXNobG9jayBpc24ndCBsb2NrZWQgYW55bW9yZSwgY2hhbmNlcyBhcmUgdGhhdCB0aGUKKwkgKiBpbm9kZSBmbHVzaCBjb21wbGV0ZWQgYW5kIHRoZSBpbm9kZSB3YXMgdGFrZW4gb2ZmIHRoZSBBSUwuCisJICogU28sIGp1c3QgZ2V0IG91dC4KKwkgKi8KKwlpZiAoKHZhbHVzZW1hKCYoZHFwLT5xX2Zsb2NrKSkgPiAwKSAgfHwKKwkgICAgKChxaXAtPnFsaV9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkgPT0gMCkpIHsKKwkJcWlwLT5xbGlfcHVzaGJ1Zl9mbGFnID0gMDsKKwkJeGZzX2RxdW5sb2NrKGRxcCk7CisJCXJldHVybjsKKwl9CisJbXAgPSBkcXAtPnFfbW91bnQ7CisJYnAgPSB4ZnNfaW5jb3JlKG1wLT5tX2RkZXZfdGFyZ3AsIHFpcC0+cWxpX2Zvcm1hdC5xbGZfYmxrbm8sCisJCSAgICBYRlNfUUlfRFFDSFVOS0xFTihtcCksCisJCSAgICBYRlNfSU5DT1JFX1RSWUxPQ0spOworCWlmIChicCAhPSBOVUxMKSB7CisJCWlmIChYRlNfQlVGX0lTREVMQVlXUklURShicCkpIHsKKwkJCWRvcHVzaCA9ICgocWlwLT5xbGlfaXRlbS5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpICYmCisJCQkJICAodmFsdXNlbWEoJihkcXAtPnFfZmxvY2spKSA8PSAwKSk7CisJCQlxaXAtPnFsaV9wdXNoYnVmX2ZsYWcgPSAwOworCQkJeGZzX2RxdW5sb2NrKGRxcCk7CisKKwkJCWlmIChYRlNfQlVGX0lTUElOTkVEKGJwKSkgeworCQkJCXhmc19sb2dfZm9yY2UobXAsICh4ZnNfbHNuX3QpMCwKKwkJCQkJICAgICAgWEZTX0xPR19GT1JDRSk7CisJCQl9CisJCQlpZiAoZG9wdXNoKSB7CisjaWZkZWYgWEZTUkFDRURFQlVHCisJCQkJZGVsYXlfZm9yX2ludHIoKTsKKwkJCQlkZWxheSgzMDApOworI2VuZGlmCisJCQkJeGZzX2Jhd3JpdGUobXAsIGJwKTsKKwkJCX0gZWxzZSB7CisJCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlxaXAtPnFsaV9wdXNoYnVmX2ZsYWcgPSAwOworCQkJeGZzX2RxdW5sb2NrKGRxcCk7CisJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJcWlwLT5xbGlfcHVzaGJ1Zl9mbGFnID0gMDsKKwl4ZnNfZHF1bmxvY2soZHFwKTsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIGF0dGVtcHQgdG8gbG9jayB0aGUgZHF1b3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAqIGRxdW90IGxvZyBpdGVtLiAgRG9uJ3Qgc2xlZXAgb24gdGhlIGRxdW90IGxvY2sgb3IgdGhlIGZsdXNoIGxvY2suCisgKiBJZiB0aGUgZmx1c2ggbG9jayBpcyBhbHJlYWR5IGhlbGQsIGluZGljYXRpbmcgdGhhdCB0aGUgZHF1b3QgaGFzCisgKiBiZWVuIG9yIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGZsdXNoZWQsIHRoZW4gc2VlIGlmIHdlIGNhbgorICogZmluZCB0aGUgZHF1b3QncyBidWZmZXIgaW4gdGhlIGJ1ZmZlciBjYWNoZSB3aXRob3V0IHNsZWVwaW5nLiAgSWYKKyAqIHdlIGNhbiBhbmQgaXQgaXMgbWFya2VkIGRlbGF5ZWQgd3JpdGUsIHRoZW4gd2Ugd2FudCB0byBzZW5kIGl0IG91dC4KKyAqIFdlIGRlbGF5IGRvaW5nIHNvIHVudGlsIHRoZSBwdXNoIHJvdXRpbmUsIHRob3VnaCwgdG8gYXZvaWQgc2xlZXBpbmcKKyAqIGluIGFueSBkZXZpY2Ugc3RyYXRlZ3kgcm91dGluZXMuCisgKi8KK1NUQVRJQyB1aW50Cit4ZnNfcW1fZHF1b3RfbG9naXRlbV90cnlsb2NrKAorCXhmc19kcV9sb2dpdGVtX3QJKnFpcCkKK3sKKwl4ZnNfZHF1b3RfdAkJKmRxcDsKKwl1aW50CQkJcmV0dmFsOworCisJZHFwID0gcWlwLT5xbGlfZHF1b3Q7CisJaWYgKGRxcC0+cV9waW5jb3VudCA+IDApCisJCXJldHVybiAoWEZTX0lURU1fUElOTkVEKTsKKworCWlmICghIHhmc19xbV9kcWxvY2tfbm93YWl0KGRxcCkpCisJCXJldHVybiAoWEZTX0lURU1fTE9DS0VEKTsKKworCXJldHZhbCA9IFhGU19JVEVNX1NVQ0NFU1M7CisJaWYgKCEgeGZzX3FtX2RxZmxvY2tfbm93YWl0KGRxcCkpIHsKKwkJLyoKKwkJICogVGhlIGRxdW90IGlzIGFscmVhZHkgYmVpbmcgZmx1c2hlZC4JSXQgbWF5IGhhdmUgYmVlbgorCQkgKiBmbHVzaGVkIGRlbGF5ZWQgd3JpdGUsIGhvd2V2ZXIsIGFuZCB3ZSBkb24ndCB3YW50IHRvCisJCSAqIGdldCBzdHVjayB3YWl0aW5nIGZvciB0aGF0IHRvIGNvbXBsZXRlLiAgU28sIHdlIHdhbnQgdG8gY2hlY2sKKwkJICogdG8gc2VlIGlmIHdlIGNhbiBsb2NrIHRoZSBkcXVvdCdzIGJ1ZmZlciB3aXRob3V0IHNsZWVwaW5nLgorCQkgKiBJZiB3ZSBjYW4gYW5kIGl0IGlzIG1hcmtlZCBmb3IgZGVsYXllZCB3cml0ZSwgdGhlbiB3ZQorCQkgKiBob2xkIGl0IGFuZCBzZW5kIGl0IG91dCBmcm9tIHRoZSBwdXNoIHJvdXRpbmUuICBXZSBkb24ndAorCQkgKiB3YW50IHRvIGRvIHRoYXQgbm93IHNpbmNlIHdlIG1pZ2h0IHNsZWVwIGluIHRoZSBkZXZpY2UKKwkJICogc3RyYXRlZ3kgcm91dGluZS4gIFdlIGFsc28gZG9uJ3Qgd2FudCB0byBncmFiIHRoZSBidWZmZXIgbG9jaworCQkgKiBoZXJlIGJlY2F1c2Ugd2UnZCBsaWtlIG5vdCB0byBjYWxsIGludG8gdGhlIGJ1ZmZlciBjYWNoZQorCQkgKiB3aGlsZSBob2xkaW5nIHRoZSBBSUxfTE9DSy4KKwkJICogTWFrZSBzdXJlIHRvIG9ubHkgcmV0dXJuIFBVU0hCVUYgaWYgd2Ugc2V0IHB1c2hidWZfZmxhZworCQkgKiBvdXJzZWx2ZXMuICBJZiBzb21lb25lIGVsc2UgaXMgZG9pbmcgaXQgdGhlbiB3ZSBkb24ndAorCQkgKiB3YW50IHRvIGdvIHRvIHRoZSBwdXNoIHJvdXRpbmUgYW5kIGR1cGxpY2F0ZSB0aGVpciBlZmZvcnRzLgorCQkgKi8KKwkJaWYgKHFpcC0+cWxpX3B1c2hidWZfZmxhZyA9PSAwKSB7CisJCQlxaXAtPnFsaV9wdXNoYnVmX2ZsYWcgPSAxOworCQkJQVNTRVJUKHFpcC0+cWxpX2Zvcm1hdC5xbGZfYmxrbm8gPT0gZHFwLT5xX2Jsa25vKTsKKyNpZmRlZiBERUJVRworCQkJcWlwLT5xbGlfcHVzaF9vd25lciA9IGdldF90aHJlYWRfaWQoKTsKKyNlbmRpZgorCQkJLyoKKwkJCSAqIFRoZSBkcXVvdCBpcyBsZWZ0IGxvY2tlZC4KKwkJCSAqLworCQkJcmV0dmFsID0gWEZTX0lURU1fUFVTSEJVRjsKKwkJfSBlbHNlIHsKKwkJCXJldHZhbCA9IFhGU19JVEVNX0ZMVVNISU5HOworCQkJeGZzX2RxdW5sb2NrX25vbm90aWZ5KGRxcCk7CisJCX0KKwl9CisKKwlBU1NFUlQocWlwLT5xbGlfaXRlbS5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpOworCXJldHVybiAocmV0dmFsKTsKK30KKworCisvKgorICogVW5sb2NrIHRoZSBkcXVvdCBhc3NvY2lhdGVkIHdpdGggdGhlIGxvZyBpdGVtLgorICogQ2xlYXIgdGhlIGZpZWxkcyBvZiB0aGUgZHF1b3QgYW5kIGRxdW90IGxvZyBpdGVtIHRoYXQKKyAqIGFyZSBzcGVjaWZpYyB0byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIElmIHRoZQorICogaG9sZCBmbGFncyBpcyBzZXQsIGRvIG5vdCB1bmxvY2sgdGhlIGRxdW90LgorICovCitTVEFUSUMgdm9pZAoreGZzX3FtX2RxdW90X2xvZ2l0ZW1fdW5sb2NrKAorCXhmc19kcV9sb2dpdGVtX3QgICAgKnFsKQoreworCXhmc19kcXVvdF90CSpkcXA7CisKKwlBU1NFUlQocWwgIT0gTlVMTCk7CisJZHFwID0gcWwtPnFsaV9kcXVvdDsKKwlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChkcXApKTsKKworCS8qCisJICogQ2xlYXIgdGhlIHRyYW5zYWN0aW9uIHBvaW50ZXIgaW4gdGhlIGRxdW90CisJICovCisJZHFwLT5xX3RyYW5zcCA9IE5VTEw7CisKKwkvKgorCSAqIGRxdW90cyBhcmUgbmV2ZXIgJ2hlbGQnIGZyb20gZ2V0dGluZyB1bmxvY2tlZCBhdCB0aGUgZW5kIG9mCisJICogYSB0cmFuc2FjdGlvbi4gIFRoZWlyIGxvY2tpbmcgYW5kIHVubG9ja2luZyBpcyBoaWRkZW4gaW5zaWRlIHRoZQorCSAqIHRyYW5zYWN0aW9uIGxheWVyLCB3aXRoaW4gdHJhbnNfY29tbWl0LiBIZW5jZSwgbm8gTElfSE9MRCBmbGFnCisJICogZm9yIHRoZSBsb2dpdGVtLgorCSAqLworCXhmc19kcXVubG9jayhkcXApOworfQorCisKKy8qCisgKiBUaGUgdHJhbnNhY3Rpb24gd2l0aCB0aGUgZHF1b3QgbG9ja2VkIGhhcyBhYm9ydGVkLiAgVGhlIGRxdW90CisgKiBtdXN0IG5vdCBiZSBkaXJ0eSB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uLiAgV2Ugc2ltcGx5IHVubG9jayBqdXN0CisgKiBhcyBpZiB0aGUgdHJhbnNhY3Rpb24gaGFkIGJlZW4gY2FuY2VsbGVkLgorICovCitTVEFUSUMgdm9pZAoreGZzX3FtX2RxdW90X2xvZ2l0ZW1fYWJvcnQoCisJeGZzX2RxX2xvZ2l0ZW1fdCAgICAqcWwpCit7CisJeGZzX3FtX2RxdW90X2xvZ2l0ZW1fdW5sb2NrKHFsKTsKK30KKworLyoKKyAqIHRoaXMgbmVlZHMgdG8gc3RhbXAgYW4gbHNuIGludG8gdGhlIGRxdW90LCBJIHRoaW5rLgorICogcnBjJ3MgdGhhdCBsb29rIGF0IHVzZXIgZHF1b3QncyB3b3VsZCB0aGVuIGhhdmUgdG8KKyAqIHB1c2ggb24gdGhlIGRlcGVuZGVuY3kgcmVjb3JkZWQgaW4gdGhlIGRxdW90CisgKi8KKy8qIEFSR1NVU0VEICovCitTVEFUSUMgdm9pZAoreGZzX3FtX2RxdW90X2xvZ2l0ZW1fY29tbWl0dGluZygKKwl4ZnNfZHFfbG9naXRlbV90CSpsLAorCXhmc19sc25fdAkJbHNuKQoreworCXJldHVybjsKK30KKworCisvKgorICogVGhpcyBpcyB0aGUgb3BzIHZlY3RvciBmb3IgZHF1b3RzCisgKi8KK3N0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX2RxdW90X2l0ZW1fb3BzID0geworCS5pb3Bfc2l6ZQk9ICh1aW50KCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX2RxdW90X2xvZ2l0ZW1fc2l6ZSwKKwkuaW9wX2Zvcm1hdAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xvZ19pb3ZlY190KikpCisJCQkJCXhmc19xbV9kcXVvdF9sb2dpdGVtX2Zvcm1hdCwKKwkuaW9wX3Bpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX2RxdW90X2xvZ2l0ZW1fcGluLAorCS5pb3BfdW5waW4JPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIGludCkpCisJCQkJCXhmc19xbV9kcXVvdF9sb2dpdGVtX3VucGluLAorCS5pb3BfdW5waW5fcmVtb3ZlID0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfdHJhbnNfdCopKQorCQkJCQl4ZnNfcW1fZHF1b3RfbG9naXRlbV91bnBpbl9yZW1vdmUsCisJLmlvcF90cnlsb2NrCT0gKHVpbnQoKikoeGZzX2xvZ19pdGVtX3QqKSkKKwkJCQkJeGZzX3FtX2RxdW90X2xvZ2l0ZW1fdHJ5bG9jaywKKwkuaW9wX3VubG9jawk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX2RxdW90X2xvZ2l0ZW1fdW5sb2NrLAorCS5pb3BfY29tbWl0dGVkCT0gKHhmc19sc25fdCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sc25fdCkpCisJCQkJCXhmc19xbV9kcXVvdF9sb2dpdGVtX2NvbW1pdHRlZCwKKwkuaW9wX3B1c2gJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19xbV9kcXVvdF9sb2dpdGVtX3B1c2gsCisJLmlvcF9hYm9ydAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX2RxdW90X2xvZ2l0ZW1fYWJvcnQsCisJLmlvcF9wdXNoYnVmCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSkKKwkJCQkJeGZzX3FtX2RxdW90X2xvZ2l0ZW1fcHVzaGJ1ZiwKKwkuaW9wX2NvbW1pdHRpbmcgPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sc25fdCkpCisJCQkJCXhmc19xbV9kcXVvdF9sb2dpdGVtX2NvbW1pdHRpbmcKK307CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBkcXVvdCBsb2cgaXRlbSBmb3IgYSBuZXdseSBhbGxvY2F0ZWQgZHF1b3QuCisgKiBUaGUgZHF1b3QgaXNuJ3QgbG9ja2VkIGF0IHRoaXMgcG9pbnQsIGJ1dCBpdCBpc24ndCBvbiBhbnkgb2YgdGhlIGxpc3RzCisgKiBlaXRoZXIsIHNvIHdlIGRvbid0IGNhcmUuCisgKi8KK3ZvaWQKK3hmc19xbV9kcXVvdF9sb2dpdGVtX2luaXQoCisJc3RydWN0IHhmc19kcXVvdCAqZHFwKQoreworCXhmc19kcV9sb2dpdGVtX3QgICpscDsKKwlscCA9ICZkcXAtPnFfbG9naXRlbTsKKworCWxwLT5xbGlfaXRlbS5saV90eXBlID0gWEZTX0xJX0RRVU9UOworCWxwLT5xbGlfaXRlbS5saV9vcHMgPSAmeGZzX2RxdW90X2l0ZW1fb3BzOworCWxwLT5xbGlfaXRlbS5saV9tb3VudHAgPSBkcXAtPnFfbW91bnQ7CisJbHAtPnFsaV9kcXVvdCA9IGRxcDsKKwlscC0+cWxpX2Zvcm1hdC5xbGZfdHlwZSA9IFhGU19MSV9EUVVPVDsKKwlscC0+cWxpX2Zvcm1hdC5xbGZfaWQgPSBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCk7CisJbHAtPnFsaV9mb3JtYXQucWxmX2Jsa25vID0gZHFwLT5xX2Jsa25vOworCWxwLT5xbGlfZm9ybWF0LnFsZl9sZW4gPSAxOworCS8qCisJICogVGhpcyBpcyBqdXN0IHRoZSBvZmZzZXQgb2YgdGhpcyBkcXVvdCB3aXRoaW4gaXRzIGJ1ZmZlcgorCSAqICh3aGljaCBpcyBjdXJyZW50bHkgMSBGU0IgYW5kIHByb2JhYmx5IHdvbid0IGNoYW5nZSkuCisJICogSGVuY2UgMzIgYml0cyBmb3IgdGhpcyBvZmZzZXQgc2hvdWxkIGJlIGp1c3QgZmluZS4KKwkgKiBBbHRlcm5hdGl2ZWx5LCB3ZSBjYW4gc3RvcmUgKGJ1Zm9mZnNldCAvIHNpemVvZih4ZnNfZHFibGtfdCkpCisJICogaGVyZSwgYW5kIHJlY29tcHV0ZSBpdCBhdCByZWNvdmVyeSB0aW1lLgorCSAqLworCWxwLT5xbGlfZm9ybWF0LnFsZl9ib2Zmc2V0ID0gKF9fdWludDMyX3QpZHFwLT5xX2J1Zm9mZnNldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0gIFFVT1RBT0ZGIExPRyBJVEVNUyAgLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBUaGlzIHJldHVybnMgdGhlIG51bWJlciBvZiBpb3ZlY3MgbmVlZGVkIHRvIGxvZyB0aGUgZ2l2ZW4gcXVvdGFvZmYgaXRlbS4KKyAqIFdlIG9ubHkgbmVlZCAxIGlvdmVjIGZvciBhbiBxdW90YW9mZiBpdGVtLiAgSXQganVzdCBsb2dzIHRoZQorICogcXVvdGFvZmZfbG9nX2Zvcm1hdCBzdHJ1Y3R1cmUuCisgKi8KKy8qQVJHU1VTRUQqLworU1RBVElDIHVpbnQKK3hmc19xbV9xb2ZmX2xvZ2l0ZW1fc2l6ZSh4ZnNfcW9mZl9sb2dpdGVtX3QgKnFmKQoreworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byBmaWxsIGluIHRoZSB2ZWN0b3Igb2YgbG9nIGlvdmVjcyBmb3IgdGhlCisgKiBnaXZlbiBxdW90YW9mZiBsb2cgaXRlbS4gV2UgdXNlIG9ubHkgMSBpb3ZlYywgYW5kIHdlIHBvaW50IHRoYXQKKyAqIGF0IHRoZSBxdW90YW9mZl9sb2dfZm9ybWF0IHN0cnVjdHVyZSBlbWJlZGRlZCBpbiB0aGUgcXVvdGFvZmYgaXRlbS4KKyAqIEl0IGlzIGF0IHRoaXMgcG9pbnQgdGhhdCB3ZSBhc3NlcnQgdGhhdCBhbGwgb2YgdGhlIGV4dGVudAorICogc2xvdHMgaW4gdGhlIHF1b3Rhb2ZmIGl0ZW0gaGF2ZSBiZWVuIGZpbGxlZC4KKyAqLworU1RBVElDIHZvaWQKK3hmc19xbV9xb2ZmX2xvZ2l0ZW1fZm9ybWF0KHhmc19xb2ZmX2xvZ2l0ZW1fdAkqcWYsCisJCQkgICB4ZnNfbG9nX2lvdmVjX3QJKmxvZ192ZWN0b3IpCit7CisJQVNTRVJUKHFmLT5xcWxfZm9ybWF0LnFmX3R5cGUgPT0gWEZTX0xJX1FVT1RBT0ZGKTsKKworCWxvZ192ZWN0b3ItPmlfYWRkciA9ICh4ZnNfY2FkZHJfdCkmKHFmLT5xcWxfZm9ybWF0KTsKKwlsb2dfdmVjdG9yLT5pX2xlbiA9IHNpemVvZih4ZnNfcW9mZl9sb2dpdGVtX3QpOworCXFmLT5xcWxfZm9ybWF0LnFmX3NpemUgPSAxOworfQorCisKKy8qCisgKiBQaW5uaW5nIGhhcyBubyBtZWFuaW5nIGZvciBhbiBxdW90YW9mZiBpdGVtLCBzbyBqdXN0IHJldHVybi4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgdm9pZAoreGZzX3FtX3FvZmZfbG9naXRlbV9waW4oeGZzX3FvZmZfbG9naXRlbV90ICpxZikKK3sKKwlyZXR1cm47Cit9CisKKworLyoKKyAqIFNpbmNlIHBpbm5pbmcgaGFzIG5vIG1lYW5pbmcgZm9yIGFuIHF1b3Rhb2ZmIGl0ZW0sIHVucGlubmluZyBkb2VzCisgKiBub3QgZWl0aGVyLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB2b2lkCit4ZnNfcW1fcW9mZl9sb2dpdGVtX3VucGluKHhmc19xb2ZmX2xvZ2l0ZW1fdCAqcWYsIGludCBzdGFsZSkKK3sKKwlyZXR1cm47Cit9CisKKy8qQVJHU1VTRUQqLworU1RBVElDIHZvaWQKK3hmc19xbV9xb2ZmX2xvZ2l0ZW1fdW5waW5fcmVtb3ZlKHhmc19xb2ZmX2xvZ2l0ZW1fdCAqcWYsIHhmc190cmFuc190ICp0cCkKK3sKKwlyZXR1cm47Cit9CisKKy8qCisgKiBRdW90YW9mZiBpdGVtcyBoYXZlIG5vIGxvY2tpbmcsIHNvIGp1c3QgcmV0dXJuIHN1Y2Nlc3MuCisgKi8KKy8qQVJHU1VTRUQqLworU1RBVElDIHVpbnQKK3hmc19xbV9xb2ZmX2xvZ2l0ZW1fdHJ5bG9jayh4ZnNfcW9mZl9sb2dpdGVtX3QgKnFmKQoreworCXJldHVybiBYRlNfSVRFTV9MT0NLRUQ7Cit9CisKKy8qCisgKiBRdW90YW9mZiBpdGVtcyBoYXZlIG5vIGxvY2tpbmcgb3IgcHVzaGluZywgc28gcmV0dXJuIGZhaWx1cmUKKyAqIHNvIHRoYXQgdGhlIGNhbGxlciBkb2Vzbid0IGJvdGhlciB3aXRoIHVzLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB2b2lkCit4ZnNfcW1fcW9mZl9sb2dpdGVtX3VubG9jayh4ZnNfcW9mZl9sb2dpdGVtX3QgKnFmKQoreworCXJldHVybjsKK30KKworLyoKKyAqIFRoZSBxdW90YW9mZi1zdGFydC1pdGVtIGlzIGxvZ2dlZCBvbmx5IG9uY2UgYW5kIGNhbm5vdCBiZSBtb3ZlZCBpbiB0aGUgbG9nLAorICogc28gc2ltcGx5IHJldHVybiB0aGUgbHNuIGF0IHdoaWNoIGl0J3MgYmVlbiBsb2dnZWQuCisgKi8KKy8qQVJHU1VTRUQqLworU1RBVElDIHhmc19sc25fdAoreGZzX3FtX3FvZmZfbG9naXRlbV9jb21taXR0ZWQoeGZzX3FvZmZfbG9naXRlbV90ICpxZiwgeGZzX2xzbl90IGxzbikKK3sKKwlyZXR1cm4gKGxzbik7Cit9CisKKy8qCisgKiBUaGUgdHJhbnNhY3Rpb24gb2Ygd2hpY2ggdGhpcyBRVU9UQU9GRiBpcyBhIHBhcnQgaGFzIGJlZW4gYWJvcnRlZC4KKyAqIEp1c3QgY2xlYW4gdXAgYWZ0ZXIgb3Vyc2VsdmVzLgorICogU2hvdWxkbid0IHRoaXMgbmV2ZXIgaGFwcGVuIGluIHRoZSBjYXNlIG9mIHFvZmZlbmQgbG9naXRlbXM/IFhYWAorICovCitTVEFUSUMgdm9pZAoreGZzX3FtX3FvZmZfbG9naXRlbV9hYm9ydCh4ZnNfcW9mZl9sb2dpdGVtX3QgKnFmKQoreworCWttZW1fZnJlZShxZiwgc2l6ZW9mKHhmc19xb2ZmX2xvZ2l0ZW1fdCkpOworfQorCisvKgorICogVGhlcmUgaXNuJ3QgbXVjaCB5b3UgY2FuIGRvIHRvIHB1c2ggb24gYW4gcXVvdGFvZmYgaXRlbS4gIEl0IGlzIHNpbXBseQorICogc3R1Y2sgd2FpdGluZyBmb3IgdGhlIGxvZyB0byBiZSBmbHVzaGVkIHRvIGRpc2suCisgKi8KKy8qQVJHU1VTRUQqLworU1RBVElDIHZvaWQKK3hmc19xbV9xb2ZmX2xvZ2l0ZW1fcHVzaCh4ZnNfcW9mZl9sb2dpdGVtX3QgKnFmKQoreworCXJldHVybjsKK30KKworCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB4ZnNfbHNuX3QKK3hmc19xbV9xb2ZmZW5kX2xvZ2l0ZW1fY29tbWl0dGVkKAorCXhmc19xb2ZmX2xvZ2l0ZW1fdCAqcWZlLAorCXhmc19sc25fdCBsc24pCit7CisJeGZzX3FvZmZfbG9naXRlbV90CSpxZnM7CisJU1BMREVDTChzKTsKKworCXFmcyA9IHFmZS0+cXFsX3N0YXJ0X2xpcDsKKwlBSUxfTE9DSyhxZnMtPnFxbF9pdGVtLmxpX21vdW50cCxzKTsKKwkvKgorCSAqIERlbGV0ZSB0aGUgcW9mZi1zdGFydCBsb2dpdGVtIGZyb20gdGhlIEFJTC4KKwkgKiB4ZnNfdHJhbnNfZGVsZXRlX2FpbCgpIGRyb3BzIHRoZSBBSUwgbG9jay4KKwkgKi8KKwl4ZnNfdHJhbnNfZGVsZXRlX2FpbChxZnMtPnFxbF9pdGVtLmxpX21vdW50cCwgKHhmc19sb2dfaXRlbV90ICopcWZzLCBzKTsKKwlrbWVtX2ZyZWUocWZzLCBzaXplb2YoeGZzX3FvZmZfbG9naXRlbV90KSk7CisJa21lbV9mcmVlKHFmZSwgc2l6ZW9mKHhmc19xb2ZmX2xvZ2l0ZW1fdCkpOworCXJldHVybiAoeGZzX2xzbl90KS0xOworfQorCisvKgorICogWFhYIHJjYyAtIGRvbid0IGtub3cgcXVpdGUgd2hhdCB0byBkbyB3aXRoIHRoaXMuICBJIHRoaW5rIHdlIGNhbgorICoganVzdCBpZ25vcmUgaXQuICBUaGUgb25seSB0aW1lIHRoYXQgaXNuJ3QgdGhlIGNhc2UgaXMgaWYgd2UgYWxsb3cKKyAqIHRoZSBjbGllbnQgdG8gc29tZWhvdyBzZWUgdGhhdCBxdW90YXMgaGF2ZSBiZWVuIHR1cm5lZCBvZmYgaW4gd2hpY2gKKyAqIHdlIGNhbid0IGFsbG93IHRoYXQgdG8gZ2V0IGJhY2sgdW50aWwgdGhlIHF1b3Rhb2ZmIGhpdHMgdGhlIGRpc2suCisgKiBTbyBob3cgd291bGQgdGhhdCBoYXBwZW4/ICBBbHNvLCBkbyB3ZSBuZWVkIGRpZmZlcmVudCByb3V0aW5lcyBmb3IKKyAqIHF1b3Rhb2ZmIHN0YXJ0IGFuZCBxdW90YW9mZiBlbmQ/ICBJIHN1c3BlY3QgdGhlIGFuc3dlciBpcyB5ZXMgYnV0CisgKiB0byBiZSBzdXJlLCBJIG5lZWQgdG8gbG9vayBhdCB0aGUgcmVjb3ZlcnkgY29kZSBhbmQgc2VlIGhvdyBxdW90YSBvZmYKKyAqIHJlY292ZXJ5IGlzIGhhbmRsZWQgKGRvIHdlIHJvbGwgZm9yd2FyZCBvciBiYWNrIG9yIGRvIHNvbWV0aGluZyBlbHNlKS4KKyAqIElmIHdlIHJvbGwgZm9yd2FyZHMgb3IgYmFja3dhcmRzLCB0aGVuIHdlIG5lZWQgdHdvIHNlcGFyYXRlIHJvdXRpbmVzLAorICogb25lIHRoYXQgZG9lcyBub3RoaW5nIGFuZCBvbmUgdGhhdCBzdGFtcHMgaW4gdGhlIGxzbiB0aGF0IG1hdHRlcnMKKyAqICh0cnVseSBtYWtlcyB0aGUgcXVvdGFvZmYgaXJyZXZvY2FibGUpLiAgSWYgd2UgZG8gc29tZXRoaW5nIGVsc2UsCisgKiB0aGVuIG1heWJlIHdlIGRvbid0IG5lZWQgdHdvLgorICovCisvKiBBUkdTVVNFRCAqLworU1RBVElDIHZvaWQKK3hmc19xbV9xb2ZmX2xvZ2l0ZW1fY29tbWl0dGluZyh4ZnNfcW9mZl9sb2dpdGVtX3QgKnFpcCwgeGZzX2xzbl90IGNvbW1pdF9sc24pCit7CisJcmV0dXJuOworfQorCisvKiBBUkdTVVNFRCAqLworU1RBVElDIHZvaWQKK3hmc19xbV9xb2ZmZW5kX2xvZ2l0ZW1fY29tbWl0dGluZyh4ZnNfcW9mZl9sb2dpdGVtX3QgKnFpcCwgeGZzX2xzbl90IGNvbW1pdF9sc24pCit7CisJcmV0dXJuOworfQorCitzdHJ1Y3QgeGZzX2l0ZW1fb3BzIHhmc19xbV9xb2ZmZW5kX2xvZ2l0ZW1fb3BzID0geworCS5pb3Bfc2l6ZQk9ICh1aW50KCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX3FvZmZfbG9naXRlbV9zaXplLAorCS5pb3BfZm9ybWF0CT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfbG9nX2lvdmVjX3QqKSkKKwkJCQkJeGZzX3FtX3FvZmZfbG9naXRlbV9mb3JtYXQsCisJLmlvcF9waW4JPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19xbV9xb2ZmX2xvZ2l0ZW1fcGluLAorCS5pb3BfdW5waW4JPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCogLGludCkpCisJCQkJCXhmc19xbV9xb2ZmX2xvZ2l0ZW1fdW5waW4sCisJLmlvcF91bnBpbl9yZW1vdmUgPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCoseGZzX3RyYW5zX3QqKSkKKwkJCQkJeGZzX3FtX3FvZmZfbG9naXRlbV91bnBpbl9yZW1vdmUsCisJLmlvcF90cnlsb2NrCT0gKHVpbnQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfcW1fcW9mZl9sb2dpdGVtX3RyeWxvY2ssCisJLmlvcF91bmxvY2sJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19xbV9xb2ZmX2xvZ2l0ZW1fdW5sb2NrLAorCS5pb3BfY29tbWl0dGVkCT0gKHhmc19sc25fdCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sc25fdCkpCisJCQkJCXhmc19xbV9xb2ZmZW5kX2xvZ2l0ZW1fY29tbWl0dGVkLAorCS5pb3BfcHVzaAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX3FvZmZfbG9naXRlbV9wdXNoLAorCS5pb3BfYWJvcnQJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19xbV9xb2ZmX2xvZ2l0ZW1fYWJvcnQsCisJLmlvcF9wdXNoYnVmCT0gTlVMTCwKKwkuaW9wX2NvbW1pdHRpbmcgPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sc25fdCkpCisJCQkJCXhmc19xbV9xb2ZmZW5kX2xvZ2l0ZW1fY29tbWl0dGluZworfTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIG9wcyB2ZWN0b3Igc2hhcmVkIGJ5IGFsbCBxdW90YW9mZi1zdGFydCBsb2cgaXRlbXMuCisgKi8KK3N0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX3FtX3FvZmZfbG9naXRlbV9vcHMgPSB7CisJLmlvcF9zaXplCT0gKHVpbnQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfcW1fcW9mZl9sb2dpdGVtX3NpemUsCisJLmlvcF9mb3JtYXQJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sb2dfaW92ZWNfdCopKQorCQkJCQl4ZnNfcW1fcW9mZl9sb2dpdGVtX2Zvcm1hdCwKKwkuaW9wX3Bpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX3FvZmZfbG9naXRlbV9waW4sCisJLmlvcF91bnBpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgaW50KSkKKwkJCQkJeGZzX3FtX3FvZmZfbG9naXRlbV91bnBpbiwKKwkuaW9wX3VucGluX3JlbW92ZSA9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90Kix4ZnNfdHJhbnNfdCopKQorCQkJCQl4ZnNfcW1fcW9mZl9sb2dpdGVtX3VucGluX3JlbW92ZSwKKwkuaW9wX3RyeWxvY2sJPSAodWludCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19xbV9xb2ZmX2xvZ2l0ZW1fdHJ5bG9jaywKKwkuaW9wX3VubG9jawk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX3FvZmZfbG9naXRlbV91bmxvY2ssCisJLmlvcF9jb21taXR0ZWQJPSAoeGZzX2xzbl90KCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xzbl90KSkKKwkJCQkJeGZzX3FtX3FvZmZfbG9naXRlbV9jb21taXR0ZWQsCisJLmlvcF9wdXNoCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfcW1fcW9mZl9sb2dpdGVtX3B1c2gsCisJLmlvcF9hYm9ydAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX3FvZmZfbG9naXRlbV9hYm9ydCwKKwkuaW9wX3B1c2hidWYJPSBOVUxMLAorCS5pb3BfY29tbWl0dGluZyA9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xzbl90KSkKKwkJCQkJeGZzX3FtX3FvZmZfbG9naXRlbV9jb21taXR0aW5nCit9OworCisvKgorICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYW4gcXVvdGFvZmYgaXRlbSBvZiB0aGUgY29ycmVjdCBxdW90YSB0eXBlKHMpLgorICovCit4ZnNfcW9mZl9sb2dpdGVtX3QgKgoreGZzX3FtX3FvZmZfbG9naXRlbV9pbml0KAorCXN0cnVjdCB4ZnNfbW91bnQgKm1wLAorCXhmc19xb2ZmX2xvZ2l0ZW1fdCAqc3RhcnQsCisJdWludCBmbGFncykKK3sKKwl4ZnNfcW9mZl9sb2dpdGVtX3QJKnFmOworCisJcWYgPSAoeGZzX3FvZmZfbG9naXRlbV90Kikga21lbV96YWxsb2Moc2l6ZW9mKHhmc19xb2ZmX2xvZ2l0ZW1fdCksIEtNX1NMRUVQKTsKKworCXFmLT5xcWxfaXRlbS5saV90eXBlID0gWEZTX0xJX1FVT1RBT0ZGOworCWlmIChzdGFydCkKKwkJcWYtPnFxbF9pdGVtLmxpX29wcyA9ICZ4ZnNfcW1fcW9mZmVuZF9sb2dpdGVtX29wczsKKwllbHNlCisJCXFmLT5xcWxfaXRlbS5saV9vcHMgPSAmeGZzX3FtX3FvZmZfbG9naXRlbV9vcHM7CisJcWYtPnFxbF9pdGVtLmxpX21vdW50cCA9IG1wOworCXFmLT5xcWxfZm9ybWF0LnFmX3R5cGUgPSBYRlNfTElfUVVPVEFPRkY7CisJcWYtPnFxbF9mb3JtYXQucWZfZmxhZ3MgPSBmbGFnczsKKwlxZi0+cXFsX3N0YXJ0X2xpcCA9IHN0YXJ0OworCXJldHVybiAocWYpOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdF9pdGVtLmggYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90X2l0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzY1MDBkCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdF9pdGVtLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfRFFVT1RfSVRFTV9IX18KKyNkZWZpbmUgX19YRlNfRFFVT1RfSVRFTV9IX18KKworc3RydWN0IHhmc19kcXVvdDsKK3N0cnVjdCB4ZnNfdHJhbnM7CitzdHJ1Y3QgeGZzX21vdW50Oworc3RydWN0IHhmc19xb2ZmX2xvZ2l0ZW07CisKK3R5cGVkZWYgc3RydWN0IHhmc19kcV9sb2dpdGVtIHsKKwl4ZnNfbG9nX2l0ZW1fdAkJIHFsaV9pdGVtOwkgICAvKiBjb21tb24gcG9ydGlvbiAqLworCXN0cnVjdCB4ZnNfZHF1b3QJKnFsaV9kcXVvdDsJICAgLyogZHF1b3QgcHRyICovCisJeGZzX2xzbl90CQkgcWxpX2ZsdXNoX2xzbjsJICAgLyogbHNuIGF0IGxhc3QgZmx1c2ggKi8KKwl1bnNpZ25lZCBzaG9ydAkJIHFsaV9wdXNoYnVmX2ZsYWc7IC8qIDEgYml0IHVzZWQgaW4gcHVzaF9haWwgKi8KKyNpZmRlZiBERUJVRworCXVpbnQ2NF90CQkgcWxpX3B1c2hfb3duZXI7CisjZW5kaWYKKwl4ZnNfZHFfbG9nZm9ybWF0X3QJIHFsaV9mb3JtYXQ7CSAgIC8qIGxvZ2dlZCBzdHJ1Y3R1cmUgKi8KK30geGZzX2RxX2xvZ2l0ZW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX3FvZmZfbG9naXRlbSB7CisJeGZzX2xvZ19pdGVtX3QJCSBxcWxfaXRlbTsJLyogY29tbW9uIHBvcnRpb24gKi8KKwlzdHJ1Y3QgeGZzX3FvZmZfbG9naXRlbSAqcXFsX3N0YXJ0X2xpcDsgLyogcW9mZi1zdGFydCBsb2dpdGVtLCBpZiBhbnkgKi8KKwl4ZnNfcW9mZl9sb2dmb3JtYXRfdAkgcXFsX2Zvcm1hdDsJLyogbG9nZ2VkIHN0cnVjdHVyZSAqLworfSB4ZnNfcW9mZl9sb2dpdGVtX3Q7CisKKworZXh0ZXJuIHZvaWQJCSAgIHhmc19xbV9kcXVvdF9sb2dpdGVtX2luaXQoc3RydWN0IHhmc19kcXVvdCAqKTsKK2V4dGVybiB4ZnNfcW9mZl9sb2dpdGVtX3QgKnhmc19xbV9xb2ZmX2xvZ2l0ZW1faW5pdChzdHJ1Y3QgeGZzX21vdW50ICosCisJCQkJCXN0cnVjdCB4ZnNfcW9mZl9sb2dpdGVtICosIHVpbnQpOworZXh0ZXJuIHhmc19xb2ZmX2xvZ2l0ZW1fdCAqeGZzX3RyYW5zX2dldF9xb2ZmX2l0ZW0oc3RydWN0IHhmc190cmFucyAqLAorCQkJCQlzdHJ1Y3QgeGZzX3FvZmZfbG9naXRlbSAqLCB1aW50KTsKK2V4dGVybiB2b2lkCQkgICB4ZnNfdHJhbnNfbG9nX3F1b3Rhb2ZmX2l0ZW0oc3RydWN0IHhmc190cmFucyAqLAorCQkJCQlzdHJ1Y3QgeGZzX3FvZmZfbG9naXRlbSAqKTsKKworI2VuZGlmCS8qIF9fWEZTX0RRVU9UX0lURU1fSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX3FtLmMgYi9mcy94ZnMvcXVvdGEveGZzX3FtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmMmNkNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfcW0uYwpAQCAtMCwwICsxLDI4NDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuCSBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfY2xudC5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19xdW90YS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19pdGFibGUuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKyNpbmNsdWRlICJ4ZnNfYWNsLmgiCisjaW5jbHVkZSAieGZzX2NhcC5oIgorI2luY2x1ZGUgInhmc19tYWMuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0ci5oIgorI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgorI2luY2x1ZGUgInhmc190cmFuc19zcGFjZS5oIgorI2luY2x1ZGUgInhmc191dGlscy5oIgorCisjaW5jbHVkZSAieGZzX3FtLmgiCisKKy8qCisgKiBUaGUgZ2xvYmFsIHF1b3RhIG1hbmFnZXIuIFRoZXJlIGlzIG9ubHkgb25lIG9mIHRoZXNlIGZvciB0aGUgZW50aXJlCisgKiBzeXN0ZW0sIF9ub3RfIG9uZSBwZXIgZmlsZSBzeXN0ZW0uIFhRTSBrZWVwcyB0cmFjayBvZiB0aGUgb3ZlcmFsbAorICogcXVvdGEgZnVuY3Rpb25hbGl0eSwgaW5jbHVkaW5nIG1haW50YWluaW5nIHRoZSBmcmVlbGlzdCBhbmQgaGFzaAorICogdGFibGVzIG9mIGRxdW90cy4KKyAqLworbXV0ZXhfdCB4ZnNfR3FtX2xvY2s7CitzdHJ1Y3QgeGZzX3FtCSp4ZnNfR3FtOworCitrbWVtX3pvbmVfdAkqcW1fZHF6b25lOwora21lbV96b25lX3QJKnFtX2RxdHJ4em9uZTsKK2ttZW1fc2hha2VyX3QJeGZzX3FtX3NoYWtlcjsKKworU1RBVElDIHZvaWQJeGZzX3FtX2xpc3RfaW5pdCh4ZnNfZHFsaXN0X3QgKiwgY2hhciAqLCBpbnQpOworU1RBVElDIHZvaWQJeGZzX3FtX2xpc3RfZGVzdHJveSh4ZnNfZHFsaXN0X3QgKik7CisKK1NUQVRJQyBpbnQJeGZzX3FtX2luaXRfcXVvdGFpbm9zKHhmc19tb3VudF90ICopOworU1RBVElDIGludAl4ZnNfcW1fc2hha2UoaW50LCB1bnNpZ25lZCBpbnQpOworCisjaWZkZWYgREVCVUcKK2V4dGVybiBtdXRleF90CXFjaGVja19sb2NrOworI2VuZGlmCisKKyNpZmRlZiBRVU9UQURFQlVHCisjZGVmaW5lIFhRTV9MSVNUX1BSSU5UKGwsIE5YVCwgdGl0bGUpIFwKK3sgXAorCXhmc19kcXVvdF90CSpkcXA7IGludCBpID0gMDsgXAorCWNtbl9lcnIoQ0VfREVCVUcsICIlcyAoIyVkKSIsIHRpdGxlLCAoaW50KSAobCktPnFoX25lbGVtcyk7IFwKKwlmb3IgKGRxcCA9IChsKS0+cWhfbmV4dDsgZHFwICE9IE5VTEw7IGRxcCA9IGRxcC0+TlhUKSB7IFwKKwkJY21uX2VycihDRV9ERUJVRywgIiAgICVkLiAgXCIlZCAoJXMpXCIgICAiIFwKKwkJCQkgICJiY250ID0gJWQsIGljbnQgPSAlZCwgcmVmcyA9ICVkIiwgXAorCQkJKytpLCAoaW50KSBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCksIFwKKwkJCURRRkxBR1RPX1RZUEVTVFIoZHFwKSwJICAgICBcCisJCQkoaW50KSBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfYmNvdW50LCBBUkNIX0NPTlZFUlQpLCBcCisJCQkoaW50KSBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpLCBcCisJCQkoaW50KSBkcXAtPnFfbnJlZnMpOyAgfSBcCit9CisjZWxzZQorI2RlZmluZSBYUU1fTElTVF9QUklOVChsLCBOWFQsIHRpdGxlKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIFhRTSBzdHJ1Y3R1cmUuCisgKiBOb3RlIHRoYXQgdGhlcmUgaXMgbm90IG9uZSBxdW90YSBtYW5hZ2VyIHBlciBmaWxlIHN5c3RlbS4KKyAqLworU1RBVElDIHN0cnVjdCB4ZnNfcW0gKgoreGZzX0dxbV9pbml0KHZvaWQpCit7CisJeGZzX3FtX3QJCSp4cW07CisJaW50CQkJaHNpemUsIGk7CisKKwl4cW0gPSBrbWVtX3phbGxvYyhzaXplb2YoeGZzX3FtX3QpLCBLTV9TTEVFUCk7CisJQVNTRVJUKHhxbSk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGRxdW90IGhhc2ggdGFibGVzLgorCSAqLworCWhzaXplID0gKERRVU9UX0hBU0hfSEVVUklTVElDIDwgWEZTX1FNX05DU0laRV9USFJFU0hPTEQpID8KKwkJWEZTX1FNX0hBU0hTSVpFX0xPVyA6IFhGU19RTV9IQVNIU0laRV9ISUdIOworCXhxbS0+cW1fZHFoYXNobWFzayA9IGhzaXplIC0gMTsKKworCXhxbS0+cW1fdXNyX2RxaHRhYmxlID0gKHhmc19kcWhhc2hfdCAqKWttZW1femFsbG9jKGhzaXplICoKKwkJCQkJCSAgICAgIHNpemVvZih4ZnNfZHFoYXNoX3QpLAorCQkJCQkJICAgICAgS01fU0xFRVApOworCXhxbS0+cW1fZ3JwX2RxaHRhYmxlID0gKHhmc19kcWhhc2hfdCAqKWttZW1femFsbG9jKGhzaXplICoKKwkJCQkJCSAgICAgIHNpemVvZih4ZnNfZHFoYXNoX3QpLAorCQkJCQkJICAgICAgS01fU0xFRVApOworCUFTU0VSVCh4cW0tPnFtX3Vzcl9kcWh0YWJsZSAhPSBOVUxMKTsKKwlBU1NFUlQoeHFtLT5xbV9ncnBfZHFodGFibGUgIT0gTlVMTCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHNpemU7IGkrKykgeworCQl4ZnNfcW1fbGlzdF9pbml0KCYoeHFtLT5xbV91c3JfZHFodGFibGVbaV0pLCAidXhkcWgiLCBpKTsKKwkJeGZzX3FtX2xpc3RfaW5pdCgmKHhxbS0+cW1fZ3JwX2RxaHRhYmxlW2ldKSwgImd4ZHFoIiwgaSk7CisJfQorCisJLyoKKwkgKiBGcmVlbGlzdCBvZiBhbGwgZHF1b3RzIG9mIGFsbCBmaWxlIHN5c3RlbXMKKwkgKi8KKwl4ZnNfcW1fZnJlZWxpc3RfaW5pdCgmKHhxbS0+cW1fZHFmcmVlbGlzdCkpOworCisJLyoKKwkgKiBkcXVvdCB6b25lLiB3ZSByZWdpc3RlciBvdXIgb3duIGxvdy1tZW1vcnkgY2FsbGJhY2suCisJICovCisJaWYgKCFxbV9kcXpvbmUpIHsKKwkJeHFtLT5xbV9kcXpvbmUgPSBrbWVtX3pvbmVfaW5pdChzaXplb2YoeGZzX2RxdW90X3QpLAorCQkJCQkJInhmc19kcXVvdHMiKTsKKwkJcW1fZHF6b25lID0geHFtLT5xbV9kcXpvbmU7CisJfSBlbHNlCisJCXhxbS0+cW1fZHF6b25lID0gcW1fZHF6b25lOworCisJeGZzX3FtX3NoYWtlciA9IGttZW1fc2hha2VfcmVnaXN0ZXIoeGZzX3FtX3NoYWtlKTsKKworCS8qCisJICogVGhlIHRfZHFpbmZvIHBvcnRpb24gb2YgdHJhbnNhY3Rpb25zLgorCSAqLworCWlmICghcW1fZHF0cnh6b25lKSB7CisJCXhxbS0+cW1fZHF0cnh6b25lID0ga21lbV96b25lX2luaXQoc2l6ZW9mKHhmc19kcXVvdF9hY2N0X3QpLAorCQkJCQkJICAgInhmc19kcXRyeCIpOworCQlxbV9kcXRyeHpvbmUgPSB4cW0tPnFtX2RxdHJ4em9uZTsKKwl9IGVsc2UKKwkJeHFtLT5xbV9kcXRyeHpvbmUgPSBxbV9kcXRyeHpvbmU7CisKKwlhdG9taWNfc2V0KCZ4cW0tPnFtX3RvdGFsZHF1b3RzLCAwKTsKKwl4cW0tPnFtX2RxZnJlZV9yYXRpbyA9IFhGU19RTV9EUUZSRUVfUkFUSU87CisJeHFtLT5xbV9ucmVmcyA9IDA7CisjaWZkZWYgREVCVUcKKwltdXRleF9pbml0KCZxY2hlY2tfbG9jaywgTVVURVhfREVGQVVMVCwgInFjaGsiKTsKKyNlbmRpZgorCXJldHVybiB4cW07Cit9CisKKy8qCisgKiBEZXN0cm95IHRoZSBnbG9iYWwgcXVvdGEgbWFuYWdlciB3aGVuIGl0cyByZWZlcmVuY2UgY291bnQgZ29lcyB0byB6ZXJvLgorICovCit2b2lkCit4ZnNfcW1fZGVzdHJveSgKKwlzdHJ1Y3QgeGZzX3FtCSp4cW0pCit7CisJaW50CQloc2l6ZSwgaTsKKworCUFTU0VSVCh4cW0gIT0gTlVMTCk7CisJQVNTRVJUKHhxbS0+cW1fbnJlZnMgPT0gMCk7CisJa21lbV9zaGFrZV9kZXJlZ2lzdGVyKHhmc19xbV9zaGFrZXIpOworCWhzaXplID0geHFtLT5xbV9kcWhhc2htYXNrICsgMTsKKwlmb3IgKGkgPSAwOyBpIDwgaHNpemU7IGkrKykgeworCQl4ZnNfcW1fbGlzdF9kZXN0cm95KCYoeHFtLT5xbV91c3JfZHFodGFibGVbaV0pKTsKKwkJeGZzX3FtX2xpc3RfZGVzdHJveSgmKHhxbS0+cW1fZ3JwX2RxaHRhYmxlW2ldKSk7CisJfQorCWttZW1fZnJlZSh4cW0tPnFtX3Vzcl9kcWh0YWJsZSwgaHNpemUgKiBzaXplb2YoeGZzX2RxaGFzaF90KSk7CisJa21lbV9mcmVlKHhxbS0+cW1fZ3JwX2RxaHRhYmxlLCBoc2l6ZSAqIHNpemVvZih4ZnNfZHFoYXNoX3QpKTsKKwl4cW0tPnFtX3Vzcl9kcWh0YWJsZSA9IE5VTEw7CisJeHFtLT5xbV9ncnBfZHFodGFibGUgPSBOVUxMOworCXhxbS0+cW1fZHFoYXNobWFzayA9IDA7CisJeGZzX3FtX2ZyZWVsaXN0X2Rlc3Ryb3koJih4cW0tPnFtX2RxZnJlZWxpc3QpKTsKKyNpZmRlZiBERUJVRworCW11dGV4X2Rlc3Ryb3koJnFjaGVja19sb2NrKTsKKyNlbmRpZgorCWttZW1fZnJlZSh4cW0sIHNpemVvZih4ZnNfcW1fdCkpOworfQorCisvKgorICogQ2FsbGVkIGF0IG1vdW50IHRpbWUgdG8gbGV0IFhRTSBrbm93IHRoYXQgYW5vdGhlciBmaWxlIHN5c3RlbSBpcworICogc3RhcnRpbmcgcXVvdGFzLiBUaGlzIGlzbid0IGNydWNpYWwgaW5mb3JtYXRpb24gYXMgdGhlIGluZGl2aWR1YWwgbW91bnQKKyAqIHN0cnVjdHVyZXMgYXJlIHByZXR0eSBpbmRlcGVuZGVudCwgYnV0IGl0IGhlbHBzIHRoZSBYUU0ga2VlcCBhCisgKiBnbG9iYWwgdmlldyBvZiB3aGF0J3MgZ29pbmcgb24uCisgKi8KKy8qIEFSR1NVU0VEICovCitTVEFUSUMgaW50Cit4ZnNfcW1faG9sZF9xdW90YWZzX3JlZigKKwlzdHJ1Y3QgeGZzX21vdW50ICptcCkKK3sKKwkvKgorCSAqIE5lZWQgdG8gbG9jayB0aGUgeGZzX0dxbSBzdHJ1Y3R1cmUgZm9yIHRoaW5ncyBsaWtlIHRoaXMuIEZvciBleGFtcGxlLAorCSAqIHRoZSBzdHJ1Y3R1cmUgY291bGQgZGlzYXBwZWFyIGJldHdlZW4gdGhlIGVudHJ5IHRvIHRoaXMgcm91dGluZSBhbmQKKwkgKiBhIEhPTEQgb3BlcmF0aW9uIGlmIG5vdCBsb2NrZWQuCisJICovCisJWEZTX1FNX0xPQ0soeGZzX0dxbSk7CisKKwlpZiAoeGZzX0dxbSA9PSBOVUxMKQorCQl4ZnNfR3FtID0geGZzX0dxbV9pbml0KCk7CisJLyoKKwkgKiBXZSBjYW4ga2VlcCBhIGxpc3Qgb2YgYWxsIGZpbGVzeXN0ZW1zIHdpdGggcXVvdGFzIG1vdW50ZWQgZm9yCisJICogZGVidWdnaW5nIGFuZCBzdGF0aXN0aWNhbCBwdXJwb3NlcywgYnV0IC4uLgorCSAqIEp1c3QgdGFrZSBhIHJlZmVyZW5jZSBhbmQgZ2V0IG91dC4KKwkgKi8KKwlYRlNfUU1fSE9MRCh4ZnNfR3FtKTsKKwlYRlNfUU1fVU5MT0NLKHhmc19HcW0pOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFJlbGVhc2UgdGhlIHJlZmVyZW5jZSB0aGF0IGEgZmlsZXN5c3RlbSB0b29rIGF0IG1vdW50IHRpbWUsCisgKiBzbyB0aGF0IHdlIGtub3cgd2hlbiB3ZSBuZWVkIHRvIGRlc3Ryb3kgdGhlIGVudGlyZSBxdW90YSBtYW5hZ2VyLgorICovCisvKiBBUkdTVVNFRCAqLworU1RBVElDIHZvaWQKK3hmc19xbV9yZWxlX3F1b3RhZnNfcmVmKAorCXN0cnVjdCB4ZnNfbW91bnQgKm1wKQoreworCXhmc19kcXVvdF90CSpkcXAsICpuZXh0ZHFwOworCisJQVNTRVJUKHhmc19HcW0pOworCUFTU0VSVCh4ZnNfR3FtLT5xbV9ucmVmcyA+IDApOworCisJLyoKKwkgKiBHbyB0aHJ1IHRoZSBmcmVlbGlzdCBhbmQgZGVzdHJveSBhbGwgaW5hY3RpdmUgZHF1b3RzLgorCSAqLworCXhmc19xbV9mcmVlbGlzdF9sb2NrKHhmc19HcW0pOworCisJZm9yIChkcXAgPSB4ZnNfR3FtLT5xbV9kcWZyZWVsaXN0LnFoX25leHQ7CisJICAgICBkcXAgIT0gKHhmc19kcXVvdF90ICopJih4ZnNfR3FtLT5xbV9kcWZyZWVsaXN0KTsgKSB7CisJCXhmc19kcWxvY2soZHFwKTsKKwkJbmV4dGRxcCA9IGRxcC0+ZHFfZmxuZXh0OworCQlpZiAoZHFwLT5kcV9mbGFncyAmIFhGU19EUV9JTkFDVElWRSkgeworCQkJQVNTRVJUKGRxcC0+cV9tb3VudCA9PSBOVUxMKTsKKwkJCUFTU0VSVCghIFhGU19EUV9JU19ESVJUWShkcXApKTsKKwkJCUFTU0VSVChkcXAtPkhMX1BSRVZQID09IE5VTEwpOworCQkJQVNTRVJUKGRxcC0+TVBMX1BSRVZQID09IE5VTEwpOworCQkJWFFNX0ZSRUVMSVNUX1JFTU9WRShkcXApOworCQkJeGZzX2RxdW5sb2NrKGRxcCk7CisJCQl4ZnNfcW1fZHFkZXN0cm95KGRxcCk7CisJCX0gZWxzZSB7CisJCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJfQorCQlkcXAgPSBuZXh0ZHFwOworCX0KKwl4ZnNfcW1fZnJlZWxpc3RfdW5sb2NrKHhmc19HcW0pOworCisJLyoKKwkgKiBEZXN0cm95IHRoZSBlbnRpcmUgWFFNLiBJZiBzb21lYm9keSBtb3VudHMgd2l0aCBxdW90YW9uLCB0aGlzJ2xsCisJICogYmUgcmVzdGFydGVkLgorCSAqLworCVhGU19RTV9MT0NLKHhmc19HcW0pOworCVhGU19RTV9SRUxFKHhmc19HcW0pOworCWlmICh4ZnNfR3FtLT5xbV9ucmVmcyA9PSAwKSB7CisJCXhmc19xbV9kZXN0cm95KHhmc19HcW0pOworCQl4ZnNfR3FtID0gTlVMTDsKKwl9CisJWEZTX1FNX1VOTE9DSyh4ZnNfR3FtKTsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGF0IG1vdW50IHRpbWUgZnJvbSB4ZnNfbW91bnRmcyB0byBpbml0aWFsaXplIHRoZSBxdW90YWluZm8KKyAqIHN0cnVjdHVyZSBhbmQgc3RhcnQgdGhlIGdsb2JhbCBxdW90YW1hbmFnZXIgKHhmc19HcW0pIGlmIGl0IGhhc24ndCBkb25lCisgKiBzbyBhbHJlYWR5LglOb3RlIHRoYXQgdGhlIHN1cGVyYmxvY2sgaGFzIG5vdCBiZWVuIHJlYWQgaW4geWV0LgorICovCit2b2lkCit4ZnNfcW1fbW91bnRfcXVvdGFpbml0KAorCXhmc19tb3VudF90CSptcCwKKwl1aW50CQlmbGFncykKK3sKKwkvKgorCSAqIFVzZXIgb3IgZ3JvdXAgcXVvdGFzIGhhcyB0byBiZSBvbi4KKwkgKi8KKwlBU1NFUlQoZmxhZ3MgJiAoWEZTTU5UX1VRVU9UQSB8IFhGU01OVF9HUVVPVEEpKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgZmxhZ3MgaW4gdGhlIG1vdW50IHN0cnVjdHVyZS4gRnJvbSB0aGlzIHBvaW50CisJICogb253YXJkcyB3ZSBsb29rIGF0IG1fcWZsYWdzIHRvIGZpZ3VyZSBvdXQgaWYgcXVvdGFzJ3MgT04vT0ZGLCBldGMuCisJICogTm90ZSB0aGF0IHdlIGVuZm9yY2Ugbm90aGluZyBpZiBhY2NvdW50aW5nIGlzIG9mZi4KKwkgKiBpZS4JWEZTTU5UXypRVU9UQSBtdXN0IGJlIE9OIGZvciBYRlNNTlRfKlFVT1RBRU5GLgorCSAqIEl0IGlzbid0IG5lY2Vzc2FyeSB0byB0YWtlIHRoZSBxdW90YW9mZiBsb2NrIHRvIGRvIHRoaXM7IHRoaXMgaXMKKwkgKiBjYWxsZWQgZnJvbSBtb3VudC4KKwkgKi8KKwlpZiAoZmxhZ3MgJiBYRlNNTlRfVVFVT1RBKSB7CisJCW1wLT5tX3FmbGFncyB8PSAoWEZTX1VRVU9UQV9BQ0NUIHwgWEZTX1VRVU9UQV9BQ1RJVkUpOworCQlpZiAoZmxhZ3MgJiBYRlNNTlRfVVFVT1RBRU5GKQorCQkJbXAtPm1fcWZsYWdzIHw9IFhGU19VUVVPVEFfRU5GRDsKKwl9CisJaWYgKGZsYWdzICYgWEZTTU5UX0dRVU9UQSkgeworCQltcC0+bV9xZmxhZ3MgfD0gKFhGU19HUVVPVEFfQUNDVCB8IFhGU19HUVVPVEFfQUNUSVZFKTsKKwkJaWYgKGZsYWdzICYgWEZTTU5UX0dRVU9UQUVORikKKwkJCW1wLT5tX3FmbGFncyB8PSBYRlNfR1FVT1RBX0VORkQ7CisJfQorfQorCisvKgorICogSnVzdCBkZXN0cm95IHRoZSBxdW90YWluZm8gc3RydWN0dXJlLgorICovCit2b2lkCit4ZnNfcW1fdW5tb3VudF9xdW90YWRlc3Ryb3koCisJeGZzX21vdW50X3QJKm1wKQoreworCWlmIChtcC0+bV9xdW90YWluZm8pCisJCXhmc19xbV9kZXN0cm95X3F1b3RhaW5mbyhtcCk7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20geGZzX21vdW50ZnMgdG8gc3RhcnQgcXVvdGFzIGFuZCBpbml0aWFsaXplIGFsbAorICogbmVjZXNzYXJ5IGRhdGEgc3RydWN0dXJlcyBsaWtlIHF1b3RhaW5mby4gIFRoaXMgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IKKyAqIHJ1bm5pbmcgYSBxdW90YWNoZWNrIGFzIG5lY2Vzc2FyeS4gIFdlIGFyZSBndWFyYW50ZWVkIHRoYXQgdGhlIHN1cGVyYmxvY2sKKyAqIGlzIGNvbnNpc3RlbnRseSByZWFkIGluIGF0IHRoaXMgcG9pbnQuCisgKi8KK2ludAoreGZzX3FtX21vdW50X3F1b3RhcygKKwl4ZnNfbW91bnRfdAkqbXAsCisJaW50CQltZnNpX2ZsYWdzKQoreworCXVuc2lnbmVkIGxvbmcJczsKKwlpbnQJCWVycm9yID0gMDsKKwl1aW50CQlzYmY7CisKKwkvKgorCSAqIElmIGEgZmlsZSBzeXN0ZW0gaGFkIHF1b3RhcyBydW5uaW5nIGVhcmxpZXIsIGJ1dCBkZWNpZGVkIHRvCisJICogbW91bnQgd2l0aG91dCAtbyBxdW90YS91cXVvdGEvZ3F1b3RhIG9wdGlvbnMsIHJldm9rZSB0aGUKKwkgKiBxdW90YWNoZWNrZWQgbGljZW5zZSwgYW5kIGJhaWwgb3V0LgorCSAqLworCWlmICghIFhGU19JU19RVU9UQV9PTihtcCkgJiYKKwkgICAgKG1wLT5tX3NiLnNiX3FmbGFncyAmIChYRlNfVVFVT1RBX0FDQ1R8WEZTX0dRVU9UQV9BQ0NUKSkpIHsKKwkJbXAtPm1fcWZsYWdzID0gMDsKKwkJZ290byB3cml0ZV9jaGFuZ2VzOworCX0KKworCS8qCisJICogSWYgcXVvdGFzIG9uIHJlYWx0aW1lIHZvbHVtZXMgaXMgbm90IHN1cHBvcnRlZCwgd2UgZGlzYWJsZQorCSAqIHF1b3RhcyBpbW1lZGlhdGVseS4KKwkgKi8KKwlpZiAobXAtPm1fc2Iuc2JfcmV4dGVudHMpIHsKKwkJY21uX2VycihDRV9OT1RFLAorCQkJIkNhbm5vdCB0dXJuIG9uIHF1b3RhcyBmb3IgcmVhbHRpbWUgZmlsZXN5c3RlbSAlcyIsCisJCQltcC0+bV9mc25hbWUpOworCQltcC0+bV9xZmxhZ3MgPSAwOworCQlnb3RvIHdyaXRlX2NoYW5nZXM7CisJfQorCisjaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChYRlNfTE9VRF9SRUNPVkVSWSkKKwljbW5fZXJyKENFX05PVEUsICJBdHRlbXB0aW5nIHRvIHR1cm4gb24gZGlzayBxdW90YXMuIik7CisjZW5kaWYKKworCUFTU0VSVChYRlNfSVNfUVVPVEFfUlVOTklORyhtcCkpOworCS8qCisJICogQWxsb2NhdGUgdGhlIHF1b3RhaW5mbyBzdHJ1Y3R1cmUgaW5zaWRlIHRoZSBtb3VudCBzdHJ1Y3QsIGFuZAorCSAqIGNyZWF0ZSBxdW90YWlub2RlKHMpLCBhbmQgY2hhbmdlL3JldiBzdXBlcmJsb2NrIGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX3FtX2luaXRfcXVvdGFpbmZvKG1wKSkpIHsKKwkJLyoKKwkJICogV2UgbXVzdCB0dXJuIG9mZiBxdW90YXMuCisJCSAqLworCQlBU1NFUlQobXAtPm1fcXVvdGFpbmZvID09IE5VTEwpOworCQltcC0+bV9xZmxhZ3MgPSAwOworCQlnb3RvIHdyaXRlX2NoYW5nZXM7CisJfQorCS8qCisJICogSWYgYW55IG9mIHRoZSBxdW90YXMgYXJlIG5vdCBjb25zaXN0ZW50LCBkbyBhIHF1b3RhY2hlY2suCisJICovCisJaWYgKFhGU19RTV9ORUVEX1FVT1RBQ0hFQ0sobXApICYmCisJCSEobWZzaV9mbGFncyAmIFhGU19NRlNJX05PX1FVT1RBQ0hFQ0spKSB7CisjaWZkZWYgREVCVUcKKwkJY21uX2VycihDRV9OT1RFLCAiRG9pbmcgYSBxdW90YWNoZWNrLiBQbGVhc2Ugd2FpdC4iKTsKKyNlbmRpZgorCQlpZiAoKGVycm9yID0geGZzX3FtX3F1b3RhY2hlY2sobXApKSkgeworCQkJLyogUXVvdGFjaGVjayBoYXMgZmFpbGVkIGFuZCBxdW90YXMgaGF2ZQorCQkJICogYmVlbiBkaXNhYmxlZC4KKwkJCSAqLworCQkJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7CisJCX0KKyNpZmRlZiBERUJVRworCQljbW5fZXJyKENFX05PVEUsICJEb25lIHF1b3RhY2hlY2suIik7CisjZW5kaWYKKwl9Cisgd3JpdGVfY2hhbmdlczoKKwkvKgorCSAqIFdlIGFjdHVhbGx5IGRvbid0IGhhdmUgdG8gYWNxdWlyZSB0aGUgU0JfTE9DSyBhdCBhbGwuCisJICogVGhpcyBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBtb3VudCwgYW5kIHRoYXQncyBzaW5nbGUgdGhyZWFkZWQuIFhYWAorCSAqLworCXMgPSBYRlNfU0JfTE9DSyhtcCk7CisJc2JmID0gbXAtPm1fc2Iuc2JfcWZsYWdzOworCW1wLT5tX3NiLnNiX3FmbGFncyA9IG1wLT5tX3FmbGFncyAmIFhGU19NT1VOVF9RVU9UQV9BTEw7CisJWEZTX1NCX1VOTE9DSyhtcCwgcyk7CisKKwlpZiAoc2JmICE9IChtcC0+bV9xZmxhZ3MgJiBYRlNfTU9VTlRfUVVPVEFfQUxMKSkgeworCQlpZiAoeGZzX3FtX3dyaXRlX3NiX2NoYW5nZXMobXAsIFhGU19TQl9RRkxBR1MpKSB7CisJCQkvKgorCQkJICogV2UgY291bGQgb25seSBoYXZlIGJlZW4gdHVybmluZyBxdW90YXMgb2ZmLgorCQkJICogV2UgYXJlbid0IGluIHZlcnkgZ29vZCBzaGFwZSBhY3R1YWxseSBiZWNhdXNlCisJCQkgKiB0aGUgaW5jb3JlIHN0cnVjdHVyZXMgYXJlIGNvbnZpbmNlZCB0aGF0IHF1b3RhcyBhcmUKKwkJCSAqIG9mZiwgYnV0IHRoZSBvbiBkaXNrIHN1cGVyYmxvY2sgZG9lc24ndCBrbm93IHRoYXQgIQorCQkJICovCisJCQlBU1NFUlQoIShYRlNfSVNfUVVPVEFfUlVOTklORyhtcCkpKTsKKwkJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwKKwkJCQkiWEZTIG1vdW50X3F1b3RhczogU3VwZXJibG9jayB1cGRhdGUgZmFpbGVkISIpOworCQl9CisJfQorCisJaWYgKGVycm9yKSB7CisJCXhmc19mc19jbW5fZXJyKENFX1dBUk4sIG1wLAorCQkJIkZhaWxlZCB0byBpbml0aWFsaXplIGRpc2sgcXVvdGFzLiIpOworCX0KKwlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKK30KKworLyoKKyAqIENhbGxlZCBmcm9tIHRoZSB2ZnNvcHMgbGF5ZXIuCisgKi8KK2ludAoreGZzX3FtX3VubW91bnRfcXVvdGFzKAorCXhmc19tb3VudF90CSptcCkKK3sKKwl4ZnNfaW5vZGVfdAkqdXFwLCAqZ3FwOworCWludAkJZXJyb3IgPSAwOworCisJLyoKKwkgKiBSZWxlYXNlIHRoZSBkcXVvdHMgdGhhdCByb290IGlub2RlLCBldCBhbCBtaWdodCBiZSBob2xkaW5nLAorCSAqIGJlZm9yZSB3ZSBmbHVzaCBxdW90YXMgYW5kIGJsb3cgYXdheSB0aGUgcXVvdGFpbmZvIHN0cnVjdHVyZS4KKwkgKi8KKwlBU1NFUlQobXAtPm1fcm9vdGlwKTsKKwl4ZnNfcW1fZHFkZXRhY2gobXAtPm1fcm9vdGlwKTsKKwlpZiAobXAtPm1fcmJtaXApCisJCXhmc19xbV9kcWRldGFjaChtcC0+bV9yYm1pcCk7CisJaWYgKG1wLT5tX3JzdW1pcCkKKwkJeGZzX3FtX2RxZGV0YWNoKG1wLT5tX3JzdW1pcCk7CisKKwkvKgorCSAqIEZsdXNoIG91dCB0aGUgcXVvdGEgaW5vZGVzLgorCSAqLworCXVxcCA9IGdxcCA9IE5VTEw7CisJaWYgKG1wLT5tX3F1b3RhaW5mbykgeworCQlpZiAoKHVxcCA9IG1wLT5tX3F1b3RhaW5mby0+cWlfdXF1b3RhaXApICE9IE5VTEwpIHsKKwkJCXhmc19pbG9jayh1cXAsIFhGU19JTE9DS19FWENMKTsKKwkJCXhmc19pZmxvY2sodXFwKTsKKwkJCWVycm9yID0geGZzX2lmbHVzaCh1cXAsIFhGU19JRkxVU0hfU1lOQyk7CisJCQl4ZnNfaXVubG9jayh1cXAsIFhGU19JTE9DS19FWENMKTsKKwkJCWlmICh1bmxpa2VseShlcnJvciA9PSBFRlNDT1JSVVBURUQpKSB7CisJCQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX3FtX3VubW91bnRfcXVvdGFzKDEpIiwKKwkJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJaWYgKChncXAgPSBtcC0+bV9xdW90YWluZm8tPnFpX2dxdW90YWlwKSAhPSBOVUxMKSB7CisJCQl4ZnNfaWxvY2soZ3FwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCQl4ZnNfaWZsb2NrKGdxcCk7CisJCQllcnJvciA9IHhmc19pZmx1c2goZ3FwLCBYRlNfSUZMVVNIX1NZTkMpOworCQkJeGZzX2l1bmxvY2soZ3FwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCQlpZiAodW5saWtlbHkoZXJyb3IgPT0gRUZTQ09SUlVQVEVEKSkgeworCQkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19xbV91bm1vdW50X3F1b3RhcygyKSIsCisJCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbXApOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorCWlmICh1cXApIHsKKwkJIFhGU19QVVJHRV9JTk9ERSh1cXApOworCQkgbXAtPm1fcXVvdGFpbmZvLT5xaV91cXVvdGFpcCA9IE5VTEw7CisJfQorCWlmIChncXApIHsKKwkJWEZTX1BVUkdFX0lOT0RFKGdxcCk7CisJCW1wLT5tX3F1b3RhaW5mby0+cWlfZ3F1b3RhaXAgPSBOVUxMOworCX0KK291dDoKKwlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKK30KKworLyoKKyAqIEZsdXNoIGFsbCBkcXVvdHMgb2YgdGhlIGdpdmVuIGZpbGUgc3lzdGVtIHRvIGRpc2suIFRoZSBkcXVvdHMgYXJlCisgKiBfbm90XyBwdXJnZWQgZnJvbSBtZW1vcnkgaGVyZSwganVzdCB0aGVpciBkYXRhIHdyaXR0ZW4gdG8gZGlzay4KKyAqLworaW50Cit4ZnNfcW1fZHFmbHVzaF9hbGwoCisJeGZzX21vdW50X3QJKm1wLAorCWludAkJZmxhZ3MpCit7CisJaW50CQlyZWNsOworCXhmc19kcXVvdF90CSpkcXA7CisJaW50CQluaXRlcnM7CisJaW50CQllcnJvcjsKKworCWlmIChtcC0+bV9xdW90YWluZm8gPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsKKwluaXRlcnMgPSAwOworYWdhaW46CisJeGZzX3FtX21wbGlzdF9sb2NrKG1wKTsKKwlGT1JFQUNIX0RRVU9UX0lOX01QKGRxcCwgbXApIHsKKwkJeGZzX2RxbG9jayhkcXApOworCQlpZiAoISBYRlNfRFFfSVNfRElSVFkoZHFwKSkgeworCQkJeGZzX2RxdW5sb2NrKGRxcCk7CisJCQljb250aW51ZTsKKwkJfQorCQl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJGTFVTSEFMTDogRFFESVJUWSIpOworCQkvKiBYWFggYSBzZW50aW5lbCB3b3VsZCBiZSBiZXR0ZXIgKi8KKwkJcmVjbCA9IFhGU19RSV9NUExSRUNMQUlNUyhtcCk7CisJCWlmICghIHhmc19xbV9kcWZsb2NrX25vd2FpdChkcXApKSB7CisJCQkvKgorCQkJICogSWYgd2UgY2FuJ3QgZ3JhYiB0aGUgZmx1c2ggbG9jayB0aGVuIGNoZWNrCisJCQkgKiB0byBzZWUgaWYgdGhlIGRxdW90IGhhcyBiZWVuIGZsdXNoZWQgZGVsYXllZAorCQkJICogd3JpdGUuICBJZiBzbywgZ3JhYiBpdHMgYnVmZmVyIGFuZCBzZW5kIGl0CisJCQkgKiBvdXQgaW1tZWRpYXRlbHkuICBXZSdsbCBiZSBhYmxlIHRvIGFjcXVpcmUKKwkJCSAqIHRoZSBmbHVzaCBsb2NrIHdoZW4gdGhlIEkvTyBjb21wbGV0ZXMuCisJCQkgKi8KKwkJCXhmc19xbV9kcWZsb2NrX3B1c2hidWZfd2FpdChkcXApOworCQl9CisJCS8qCisJCSAqIExldCBnbyBvZiB0aGUgbXBsaXN0IGxvY2suIFdlIGRvbid0IHdhbnQgdG8gaG9sZCBpdAorCQkgKiBhY3Jvc3MgYSBkaXNrIHdyaXRlLgorCQkgKi8KKwkJeGZzX3FtX21wbGlzdF91bmxvY2sobXApOworCQllcnJvciA9IHhmc19xbV9kcWZsdXNoKGRxcCwgZmxhZ3MpOworCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIChlcnJvcik7CisKKwkJeGZzX3FtX21wbGlzdF9sb2NrKG1wKTsKKwkJaWYgKHJlY2wgIT0gWEZTX1FJX01QTFJFQ0xBSU1TKG1wKSkgeworCQkJeGZzX3FtX21wbGlzdF91bmxvY2sobXApOworCQkJLyogWFhYIHJlc3RhcnQgbGltaXQgKi8KKwkJCWdvdG8gYWdhaW47CisJCX0KKwl9CisKKwl4ZnNfcW1fbXBsaXN0X3VubG9jayhtcCk7CisJLyogcmV0dXJuICEgYnVzeSAqLworCXJldHVybiAoMCk7Cit9CisvKgorICogUmVsZWFzZSB0aGUgZ3JvdXAgZHF1b3QgcG9pbnRlcnMgdGhlIHVzZXIgZHF1b3RzIG1heSBiZQorICogY2FycnlpbmcgYXJvdW5kIGFzIGEgaGludC4gbXBsaXN0IGlzIGxvY2tlZCBvbiBlbnRyeSBhbmQgZXhpdC4KKyAqLworU1RBVElDIHZvaWQKK3hmc19xbV9kZXRhY2hfZ2RxdW90cygKKwl4ZnNfbW91bnRfdAkqbXApCit7CisJeGZzX2RxdW90X3QJKmRxcCwgKmdkcXA7CisJaW50CQlucmVjbDsKKworIGFnYWluOgorCUFTU0VSVChYRlNfUU1fSVNfTVBMSVNUX0xPQ0tFRChtcCkpOworCWRxcCA9IFhGU19RSV9NUExORVhUKG1wKTsKKwl3aGlsZSAoZHFwKSB7CisJCXhmc19kcWxvY2soZHFwKTsKKwkJaWYgKChnZHFwID0gZHFwLT5xX2dkcXVvdCkpIHsKKwkJCXhmc19kcWxvY2soZ2RxcCk7CisJCQlkcXAtPnFfZ2RxdW90ID0gTlVMTDsKKwkJfQorCQl4ZnNfZHF1bmxvY2soZHFwKTsKKworCQlpZiAoZ2RxcCkgeworCQkJLyoKKwkJCSAqIENhbid0IGhvbGQgdGhlIG1wbGlzdCBsb2NrIGFjcm9zcyBhIGRxcHV0LgorCQkJICogWFhYbXVzdCBjb252ZXJ0IHRvIG1hcmtlciBiYXNlZCBpdGVyYXRpb25zIGhlcmUuCisJCQkgKi8KKwkJCW5yZWNsID0gWEZTX1FJX01QTFJFQ0xBSU1TKG1wKTsKKwkJCXhmc19xbV9tcGxpc3RfdW5sb2NrKG1wKTsKKwkJCXhmc19xbV9kcXB1dChnZHFwKTsKKworCQkJeGZzX3FtX21wbGlzdF9sb2NrKG1wKTsKKwkJCWlmIChucmVjbCAhPSBYRlNfUUlfTVBMUkVDTEFJTVMobXApKQorCQkJCWdvdG8gYWdhaW47CisJCX0KKwkJZHFwID0gZHFwLT5NUExfTkVYVDsKKwl9Cit9CisKKy8qCisgKiBHbyB0aHJvdWdoIGFsbCB0aGUgaW5jb3JlIGRxdW90cyBvZiB0aGlzIGZpbGUgc3lzdGVtIGFuZCB0YWtlIHRoZW0KKyAqIG9mZiB0aGUgbXBsaXN0IGFuZCBoYXNobGlzdCwgaWYgdGhlIGRxdW90IHR5cGUgbWF0Y2hlcyB0aGUgZHF0eXBlCisgKiBwYXJhbWV0ZXIuIFRoaXMgaXMgdXNlZCB3aGVuIHR1cm5pbmcgb2ZmIHF1b3RhIGFjY291bnRpbmcgZm9yCisgKiB1c2VycyBhbmQvb3IgZ3JvdXBzLCBhcyB3ZWxsIGFzIHdoZW4gdGhlIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGluZy4KKyAqLworU1RBVElDIGludAoreGZzX3FtX2RxcHVyZ2VfaW50KAorCXhmc19tb3VudF90CSptcCwKKwl1aW50CQlmbGFncykgLyogUVVPVEFPRkYvVU1PVU5USU5HL1VRVU9UQS9HUVVPVEEgKi8KK3sKKwl4ZnNfZHF1b3RfdAkqZHFwOworCXVpbnQJCWRxdHlwZTsKKwlpbnQJCW5yZWNsOworCXhmc19kcXVvdF90CSpuZXh0ZHFwOworCWludAkJbm1pc3NlczsKKworCWlmIChtcC0+bV9xdW90YWluZm8gPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsKKworCWRxdHlwZSA9IChmbGFncyAmIFhGU19RTU9QVF9VUVVPVEEpID8gWEZTX0RRX1VTRVIgOiAwOworCWRxdHlwZSB8PSAoZmxhZ3MgJiBYRlNfUU1PUFRfR1FVT1RBKSA/IFhGU19EUV9HUk9VUCA6IDA7CisKKwl4ZnNfcW1fbXBsaXN0X2xvY2sobXApOworCisJLyoKKwkgKiBJbiB0aGUgZmlyc3QgcGFzcyB0aHJvdWdoIGFsbCBpbmNvcmUgZHF1b3RzIG9mIHRoaXMgZmlsZXN5c3RlbSwKKwkgKiB3ZSByZWxlYXNlIHRoZSBncm91cCBkcXVvdCBwb2ludGVycyB0aGUgdXNlciBkcXVvdHMgbWF5IGJlCisJICogY2FycnlpbmcgYXJvdW5kIGFzIGEgaGludC4gV2UgbmVlZCB0byBkbyB0aGlzIGlycmVzcGVjdGl2ZSBvZgorCSAqIHdoYXQncyBiZWluZyB0dXJuZWQgb2ZmLgorCSAqLworCXhmc19xbV9kZXRhY2hfZ2RxdW90cyhtcCk7CisKKyAgICAgIGFnYWluOgorCW5taXNzZXMgPSAwOworCUFTU0VSVChYRlNfUU1fSVNfTVBMSVNUX0xPQ0tFRChtcCkpOworCS8qCisJICogVHJ5IHRvIGdldCByaWQgb2YgYWxsIG9mIHRoZSB1bndhbnRlZCBkcXVvdHMuIFRoZSBpZGVhIGlzIHRvCisJICogZ2V0IHRoZW0gb2ZmIG1wbGlzdCBhbmQgaGFzaGxpc3QsIGJ1dCBsZWF2ZSB0aGVtIG9uIGZyZWVsaXN0LgorCSAqLworCWRxcCA9IFhGU19RSV9NUExORVhUKG1wKTsKKwl3aGlsZSAoZHFwKSB7CisJCS8qCisJCSAqIEl0J3MgT0sgdG8gbG9vayBhdCB0aGUgdHlwZSB3aXRob3V0IHRha2luZyBkcWxvY2sgaGVyZS4KKwkJICogV2UncmUgaG9sZGluZyB0aGUgbXBsaXN0IGxvY2sgaGVyZSwgYW5kIHRoYXQncyBuZWVkZWQgZm9yCisJCSAqIGEgZHFyZWNsYWltLgorCQkgKi8KKwkJaWYgKChkcXAtPmRxX2ZsYWdzICYgZHF0eXBlKSA9PSAwKSB7CisJCQlkcXAgPSBkcXAtPk1QTF9ORVhUOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoISB4ZnNfcW1fZHFoYXNobG9ja19ub3dhaXQoZHFwKSkgeworCQkJbnJlY2wgPSBYRlNfUUlfTVBMUkVDTEFJTVMobXApOworCQkJeGZzX3FtX21wbGlzdF91bmxvY2sobXApOworCQkJWEZTX0RRX0hBU0hfTE9DSyhkcXAtPnFfaGFzaCk7CisJCQl4ZnNfcW1fbXBsaXN0X2xvY2sobXApOworCisJCQkvKgorCQkJICogWFhYVGhlb3JldGljYWxseSwgd2UgY2FuIGdldCBpbnRvIGEgdmVyeSBsb25nCisJCQkgKiBwaW5nIHBvbmcgZ2FtZSBoZXJlLgorCQkJICogTm8gb25lIGNhbiBiZSBhZGRpbmcgZHF1b3RzIHRvIHRoZSBtcGxpc3QgYXQKKwkJCSAqIHRoaXMgcG9pbnQsIGJ1dCBzb21lYm9keSBtaWdodCBiZSB0YWtpbmcgdGhpbmdzIG9mZi4KKwkJCSAqLworCQkJaWYgKG5yZWNsICE9IFhGU19RSV9NUExSRUNMQUlNUyhtcCkpIHsKKwkJCQlYRlNfRFFfSEFTSF9VTkxPQ0soZHFwLT5xX2hhc2gpOworCQkJCWdvdG8gYWdhaW47CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBUYWtlIHRoZSBkcXVvdCBvZmYgdGhlIG1wbGlzdCBhbmQgaGFzaGxpc3QuIEl0IG1heSByZW1haW4gb24KKwkJICogZnJlZWxpc3QgaW4gSU5BQ1RJVkUgc3RhdGUuCisJCSAqLworCQluZXh0ZHFwID0gZHFwLT5NUExfTkVYVDsKKwkJbm1pc3NlcyArPSB4ZnNfcW1fZHFwdXJnZShkcXAsIGZsYWdzKTsKKwkJZHFwID0gbmV4dGRxcDsKKwl9CisJeGZzX3FtX21wbGlzdF91bmxvY2sobXApOworCXJldHVybiBubWlzc2VzOworfQorCitpbnQKK3hmc19xbV9kcXB1cmdlX2FsbCgKKwl4ZnNfbW91bnRfdAkqbXAsCisJdWludAkJZmxhZ3MpCit7CisJaW50CQluZHF1b3RzOworCisJLyoKKwkgKiBQdXJnZSB0aGUgZHF1b3QgY2FjaGUuCisJICogTm9uZSBvZiB0aGUgZHF1b3RzIHNob3VsZCByZWFsbHkgYmUgYnVzeSBhdCB0aGlzIHBvaW50LgorCSAqLworCWlmIChtcC0+bV9xdW90YWluZm8pIHsKKwkJd2hpbGUgKChuZHF1b3RzID0geGZzX3FtX2RxcHVyZ2VfaW50KG1wLCBmbGFncykpKSB7CisJCQlkZWxheShuZHF1b3RzICogMTApOworCQl9CisJfQorCXJldHVybiAwOworfQorCitTVEFUSUMgaW50Cit4ZnNfcW1fZHFhdHRhY2hfb25lKAorCXhmc19pbm9kZV90CSppcCwKKwl4ZnNfZHFpZF90CWlkLAorCXVpbnQJCXR5cGUsCisJdWludAkJZG9hbGxvYywKKwl1aW50CQlkb2xvY2ssCisJeGZzX2RxdW90X3QJKnVkcWhpbnQsIC8qIGhpbnQgKi8KKwl4ZnNfZHF1b3RfdAkqKklPX2lkcXBwKQoreworCXhmc19kcXVvdF90CSpkcXA7CisJaW50CQllcnJvcjsKKworCUFTU0VSVChYRlNfSVNMT0NLRURfSU5PREVfRVhDTChpcCkpOworCWVycm9yID0gMDsKKwkvKgorCSAqIFNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgaXQgaW4gdGhlIGlub2RlIGl0c2VsZi4gSU9faWRxcHAgaXMKKwkgKiAmaV91ZHF1b3Qgb3IgJmlfZ2RxdW90LiBUaGlzIG1hZGUgdGhlIGNvZGUgbG9vayB3ZWlyZCwgYnV0CisJICogbWFkZSB0aGUgbG9naWMgYSBsb3Qgc2ltcGxlci4KKwkgKi8KKwlpZiAoKGRxcCA9ICpJT19pZHFwcCkpIHsKKwkJaWYgKGRvbG9jaykKKwkJCXhmc19kcWxvY2soZHFwKTsKKwkJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiRFFBVFRBQ0g6IGZvdW5kIGluIGlwIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgorCSAqIHVkcWhpbnQgaXMgdGhlIGlfdWRxdW90IGZpZWxkIGluIGlub2RlLCBhbmQgaXMgbm9uLU5VTEwgb25seQorCSAqIHdoZW4gdGhlIHR5cGUgYXJnIGlzIFhGU19EUV9HUk9VUC4gSXRzIHB1cnBvc2UgaXMgdG8gc2F2ZSBhCisJICogbG9va3VwIGJ5IGRxaWQgKHhmc19xbV9kcWdldCkgYnkgY2FjaGluZyBhIGdyb3VwIGRxdW90IGluc2lkZQorCSAqIHRoZSB1c2VyIGRxdW90LgorCSAqLworCUFTU0VSVCghdWRxaGludCB8fCB0eXBlID09IFhGU19EUV9HUk9VUCk7CisJaWYgKHVkcWhpbnQgJiYgIWRvbG9jaykKKwkJeGZzX2RxbG9jayh1ZHFoaW50KTsKKworCS8qCisJICogTm8gbmVlZCB0byB0YWtlIGRxbG9jayB0byBsb29rIGF0IHRoZSBpZC4KKwkgKiBUaGUgSUQgY2FuJ3QgY2hhbmdlIHVudGlsIGl0IGdldHMgcmVjbGFpbWVkLCBhbmQgaXQgd29uJ3QKKwkgKiBiZSByZWNsYWltZWQgYXMgbG9uZyBhcyB3ZSBoYXZlIGEgcmVmIGZyb20gaW5vZGUgYW5kIHdlIGhvbGQKKwkgKiB0aGUgaWxvY2suCisJICovCisJaWYgKHVkcWhpbnQgJiYKKwkgICAgKGRxcCA9IHVkcWhpbnQtPnFfZ2RxdW90KSAmJgorCSAgICAoSU5UX0dFVChkcXAtPnFfY29yZS5kX2lkLCBBUkNIX0NPTlZFUlQpID09IGlkKSkgeworCQlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRCh1ZHFoaW50KSk7CisJCXhmc19kcWxvY2soZHFwKTsKKwkJWEZTX0RRSE9MRChkcXApOworCQlBU1NFUlQoKklPX2lkcXBwID09IE5VTEwpOworCQkqSU9faWRxcHAgPSBkcXA7CisJCWlmICghZG9sb2NrKSB7CisJCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJCXhmc19kcXVubG9jayh1ZHFoaW50KTsKKwkJfQorCQlnb3RvIGRvbmU7CisJfQorCS8qCisJICogV2UgY2FuJ3QgaG9sZCBhIGRxdW90IGxvY2sgd2hlbiB3ZSBjYWxsIHRoZSBkcWdldCBjb2RlLgorCSAqIFdlJ2xsIGRlYWRsb2NrIGluIG5vIHRpbWUsIGJlY2F1c2Ugb2YgKG5vdCBjb25mb3JtaW5nIHRvKQorCSAqIGxvY2sgb3JkZXJpbmcgLSB0aGUgaW5vZGVsb2NrIGNvbWVzIGJlZm9yZSBhbnkgZHF1b3QgbG9jaywKKwkgKiBhbmQgd2UgbWF5IGRyb3AgYW5kIHJlYWNxdWlyZSB0aGUgaWxvY2sgaW4geGZzX3FtX2RxZ2V0KCkuCisJICovCisJaWYgKHVkcWhpbnQpCisJCXhmc19kcXVubG9jayh1ZHFoaW50KTsKKwkvKgorCSAqIEZpbmQgdGhlIGRxdW90IGZyb20gc29tZXdoZXJlLiBUaGlzIGJ1bXBzIHRoZQorCSAqIHJlZmVyZW5jZSBjb3VudCBvZiBkcXVvdCBhbmQgcmV0dXJucyBpdCBsb2NrZWQuCisJICogVGhpcyBjYW4gcmV0dXJuIEVOT0VOVCBpZiBkcXVvdCBkaWRuJ3QgZXhpc3Qgb24KKwkgKiBkaXNrIGFuZCB3ZSBkaWRuJ3QgYXNrIGl0IHRvIGFsbG9jYXRlOworCSAqIEVTUkNIIGlmIHF1b3RhcyBnb3QgdHVybmVkIG9mZiBzdWRkZW5seS4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX3FtX2RxZ2V0KGlwLT5pX21vdW50LCBpcCwgaWQsIHR5cGUsCisJCQkJIGRvYWxsb2N8WEZTX1FNT1BUX0RPV0FSTiwgJmRxcCkpKSB7CisJCWlmICh1ZHFoaW50ICYmIGRvbG9jaykKKwkJCXhmc19kcWxvY2sodWRxaGludCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUUFUVEFDSDogZm91bmQgYnkgZHFnZXQiKTsKKwkvKgorCSAqIGRxZ2V0IG1heSBoYXZlIGRyb3BwZWQgYW5kIHJlLWFjcXVpcmVkIHRoZSBpbG9jaywgYnV0IGl0IGd1YXJhbnRlZXMKKwkgKiB0aGF0IHRoZSBkcXVvdCByZXR1cm5lZCBpcyB0aGUgb25lIHRoYXQgc2hvdWxkIGdvIGluIHRoZSBpbm9kZS4KKwkgKi8KKwkqSU9faWRxcHAgPSBkcXA7CisJQVNTRVJUKGRxcCk7CisJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQoZHFwKSk7CisJaWYgKCEgZG9sb2NrKSB7CisJCXhmc19kcXVubG9jayhkcXApOworCQlnb3RvIGRvbmU7CisJfQorCWlmICghIHVkcWhpbnQpCisJCWdvdG8gZG9uZTsKKworCUFTU0VSVCh1ZHFoaW50KTsKKwlBU1NFUlQoZG9sb2NrKTsKKwlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChkcXApKTsKKwlpZiAoISB4ZnNfcW1fZHFsb2NrX25vd2FpdCh1ZHFoaW50KSkgeworCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJeGZzX2RxbG9jayh1ZHFoaW50KTsKKwkJeGZzX2RxbG9jayhkcXApOworCX0KKyAgICAgIGRvbmU6CisjaWZkZWYgUVVPVEFERUJVRworCWlmICh1ZHFoaW50KSB7CisJCWlmIChkb2xvY2spCisJCQlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRCh1ZHFoaW50KSk7CisJfQorCWlmICghIGVycm9yKSB7CisJCWlmIChkb2xvY2spCisJCQlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChkcXApKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gKGVycm9yKTsKK30KKworCisvKgorICogR2l2ZW4gYSB1ZHF1b3QgYW5kIGdkcXVvdCwgYXR0YWNoIGEgcHRyIHRvIHRoZSBncm91cCBkcXVvdCBpbiB0aGUKKyAqIHVkcXVvdCBhcyBhIGhpbnQgZm9yIGZ1dHVyZSBsb29rdXBzLiBUaGUgaWRlYSBzb3VuZHMgc2ltcGxlLCBidXQgdGhlCisgKiBleGVjdXRpb24gaXNuJ3QsIGJlY2F1c2UgdGhlIHVkcXVvdCBtaWdodCBoYXZlIGEgZ3JvdXAgZHF1b3QgYXR0YWNoZWQKKyAqIGFscmVhZHkgYW5kIGdldHRpbmcgcmlkIG9mIHRoYXQgZ2V0cyB1cyBpbnRvIGxvY2sgb3JkZXJpbmcgY29udHJhaW50cy4KKyAqIFRoZSBwcm9jZXNzIGlzIGNvbXBsaWNhdGVkIG1vcmUgYnkgdGhlIGZhY3QgdGhhdCB0aGUgZHF1b3RzIG1heSBvciBtYXkgbm90CisgKiBiZSBsb2NrZWQgb24gZW50cnkuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfcW1fZHFhdHRhY2hfZ3JvdXBoaW50KAorCXhmc19kcXVvdF90CSp1ZHEsCisJeGZzX2RxdW90X3QJKmdkcSwKKwl1aW50CQlsb2NrZWQpCit7CisJeGZzX2RxdW90X3QJKnRtcDsKKworI2lmZGVmIFFVT1RBREVCVUcKKwlpZiAobG9ja2VkKSB7CisJCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKHVkcSkpOworCQlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChnZHEpKTsKKwl9CisjZW5kaWYKKwlpZiAoISBsb2NrZWQpCisJCXhmc19kcWxvY2sodWRxKTsKKworCWlmICgodG1wID0gdWRxLT5xX2dkcXVvdCkpIHsKKwkJaWYgKHRtcCA9PSBnZHEpIHsKKwkJCWlmICghIGxvY2tlZCkKKwkJCQl4ZnNfZHF1bmxvY2sodWRxKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXVkcS0+cV9nZHF1b3QgPSBOVUxMOworCQkvKgorCQkgKiBXZSBjYW4ndCBrZWVwIGFueSBkcWxvY2tzIHdoZW4gY2FsbGluZyBkcXJlbGUsCisJCSAqIGJlY2F1c2UgdGhlIGZyZWVsaXN0IGxvY2sgY29tZXMgYmVmb3JlIGRxbG9ja3MuCisJCSAqLworCQl4ZnNfZHF1bmxvY2sodWRxKTsKKwkJaWYgKGxvY2tlZCkKKwkJCXhmc19kcXVubG9jayhnZHEpOworCQkvKgorCQkgKiB3ZSB0b29rIGEgaGFyZCByZWZlcmVuY2Ugb25jZSB1cG9uIGEgdGltZSBpbiBkcWdldCwKKwkJICogc28gZ2l2ZSBpdCBiYWNrIHdoZW4gdGhlIHVkcXVvdCBubyBsb25nZXIgcG9pbnRzIGF0IGl0CisJCSAqIGRxcHV0KCkgZG9lcyB0aGUgdW5sb2NraW5nIG9mIHRoZSBkcXVvdC4KKwkJICovCisJCXhmc19xbV9kcXJlbGUodG1wKTsKKworCQl4ZnNfZHFsb2NrKHVkcSk7CisJCXhmc19kcWxvY2soZ2RxKTsKKworCX0gZWxzZSB7CisJCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKHVkcSkpOworCQlpZiAoISBsb2NrZWQpIHsKKwkJCXhmc19kcWxvY2soZ2RxKTsKKwkJfQorCX0KKworCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKHVkcSkpOworCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKGdkcSkpOworCS8qCisJICogU29tZWJvZHkgY291bGQgaGF2ZSBhdHRhY2hlZCBhIGdkcXVvdCBoZXJlLAorCSAqIHdoZW4gd2UgZHJvcHBlZCB0aGUgdXFsb2NrLiBJZiBzbywganVzdCBkbyBub3RoaW5nLgorCSAqLworCWlmICh1ZHEtPnFfZ2RxdW90ID09IE5VTEwpIHsKKwkJWEZTX0RRSE9MRChnZHEpOworCQl1ZHEtPnFfZ2RxdW90ID0gZ2RxOworCX0KKwlpZiAoISBsb2NrZWQpIHsKKwkJeGZzX2RxdW5sb2NrKGdkcSk7CisJCXhmc19kcXVubG9jayh1ZHEpOworCX0KK30KKworCisvKgorICogR2l2ZW4gYSBsb2NrZWQgaW5vZGUsIGF0dGFjaCBkcXVvdChzKSB0byBpdCwgdGFraW5nIFVRVU9UQU9OIC8gR1FVT1RBT04KKyAqIGluIHRvIGFjY291bnQuCisgKiBJZiBYRlNfUU1PUFRfRFFBTExPQywgdGhlIGRxdW90KHMpIHdpbGwgYmUgYWxsb2NhdGVkIGlmIG5lZWRlZC4KKyAqIElmIFhGU19RTU9QVF9EUUxPQ0ssIHRoZSBkcXVvdChzKSB3aWxsIGJlIHJldHVybmVkIGxvY2tlZC4gVGhpcyBvcHRpb24gcHJldHR5CisgKiBtdWNoIG1hZGUgdGhpcyBjb2RlIGEgY29tcGxldGUgbWVzcywgYnV0IGl0IGhhcyBiZWVuIHByZXR0eSB1c2VmdWwuCisgKiBJZiBYRlNfUU1PUFRfSUxPQ0tFRCwgdGhlbiBpbm9kZSBzZW50IGlzIGFscmVhZHkgbG9ja2VkIEVYQ0wuCisgKiBJbm9kZSBtYXkgZ2V0IHVubG9ja2VkIGFuZCByZWxvY2tlZCBpbiBoZXJlLCBhbmQgdGhlIGNhbGxlciBtdXN0IGRlYWwgd2l0aAorICogdGhlIGNvbnNlcXVlbmNlcy4KKyAqLworaW50Cit4ZnNfcW1fZHFhdHRhY2goCisJeGZzX2lub2RlX3QJKmlwLAorCXVpbnQJCWZsYWdzKQoreworCXhmc19tb3VudF90CSptcCA9IGlwLT5pX21vdW50OworCXVpbnQJCW5xdW90YXMgPSAwOworCWludAkJZXJyb3IgPSAwOworCisJaWYgKCghIFhGU19JU19RVU9UQV9PTihtcCkpIHx8CisJICAgICghIFhGU19OT1RfRFFBVFRBQ0hFRChtcCwgaXApKSB8fAorCSAgICAoaXAtPmlfaW5vID09IG1wLT5tX3NiLnNiX3VxdW90aW5vKSB8fAorCSAgICAoaXAtPmlfaW5vID09IG1wLT5tX3NiLnNiX2dxdW90aW5vKSkKKwkJcmV0dXJuICgwKTsKKworCUFTU0VSVCgoZmxhZ3MgJiBYRlNfUU1PUFRfSUxPQ0tFRCkgPT0gMCB8fAorCSAgICAgICBYRlNfSVNMT0NLRURfSU5PREVfRVhDTChpcCkpOworCisJaWYgKCEgKGZsYWdzICYgWEZTX1FNT1BUX0lMT0NLRUQpKQorCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKworCWlmIChYRlNfSVNfVVFVT1RBX09OKG1wKSkgeworCQllcnJvciA9IHhmc19xbV9kcWF0dGFjaF9vbmUoaXAsIGlwLT5pX2QuZGlfdWlkLCBYRlNfRFFfVVNFUiwKKwkJCQkJCWZsYWdzICYgWEZTX1FNT1BUX0RRQUxMT0MsCisJCQkJCQlmbGFncyAmIFhGU19RTU9QVF9EUUxPQ0ssCisJCQkJCQlOVUxMLCAmaXAtPmlfdWRxdW90KTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBkb25lOworCQlucXVvdGFzKys7CisJfQorCUFTU0VSVChYRlNfSVNMT0NLRURfSU5PREVfRVhDTChpcCkpOworCWlmIChYRlNfSVNfR1FVT1RBX09OKG1wKSkgeworCQllcnJvciA9IHhmc19xbV9kcWF0dGFjaF9vbmUoaXAsIGlwLT5pX2QuZGlfZ2lkLCBYRlNfRFFfR1JPVVAsCisJCQkJCQlmbGFncyAmIFhGU19RTU9QVF9EUUFMTE9DLAorCQkJCQkJZmxhZ3MgJiBYRlNfUU1PUFRfRFFMT0NLLAorCQkJCQkJaXAtPmlfdWRxdW90LCAmaXAtPmlfZ2RxdW90KTsKKwkJLyoKKwkJICogRG9uJ3Qgd29ycnkgYWJvdXQgdGhlIHVkcXVvdCB0aGF0IHdlIG1heSBoYXZlCisJCSAqIGF0dGFjaGVkIGFib3ZlLiBJdCdsbCBnZXQgZGV0YWNoZWQsIGlmIG5vdCBhbHJlYWR5LgorCQkgKi8KKwkJaWYgKGVycm9yKQorCQkJZ290byBkb25lOworCQlucXVvdGFzKys7CisJfQorCisJLyoKKwkgKiBBdHRhY2ggdGhpcyBncm91cCBxdW90YSB0byB0aGUgdXNlciBxdW90YSBhcyBhIGhpbnQuCisJICogVGhpcyBXT04nVCwgaW4gZ2VuZXJhbCwgcmVzdWx0IGluIGEgdGhyYXNoLgorCSAqLworCWlmIChucXVvdGFzID09IDIpIHsKKwkJQVNTRVJUKFhGU19JU0xPQ0tFRF9JTk9ERV9FWENMKGlwKSk7CisJCUFTU0VSVChpcC0+aV91ZHF1b3QpOworCQlBU1NFUlQoaXAtPmlfZ2RxdW90KTsKKworCQkvKgorCQkgKiBXZSBtYXkgb3IgbWF5IG5vdCBoYXZlIHRoZSBpX3VkcXVvdCBsb2NrZWQgYXQgdGhpcyBwb2ludCwKKwkJICogYnV0IHRoaXMgY2hlY2sgaXMgT0sgc2luY2Ugd2UgZG9uJ3QgZGVwZW5kIG9uIHRoZSBpX2dkcXVvdCB0bworCQkgKiBiZSBhY2N1cmF0ZSAxMDAlIGFsbCB0aGUgdGltZS4gSXQgaXMganVzdCBhIGhpbnQsIGFuZCB0aGlzCisJCSAqIHdpbGwgc3VjY2VlZCBpbiBnZW5lcmFsLgorCQkgKi8KKwkJaWYgKGlwLT5pX3VkcXVvdC0+cV9nZHF1b3QgPT0gaXAtPmlfZ2RxdW90KQorCQkJZ290byBkb25lOworCQkvKgorCQkgKiBBdHRhY2ggaV9nZHF1b3QgdG8gdGhlIGdkcXVvdCBoaW50IGluc2lkZSB0aGUgaV91ZHF1b3QuCisJCSAqLworCQl4ZnNfcW1fZHFhdHRhY2hfZ3JvdXBoaW50KGlwLT5pX3VkcXVvdCwgaXAtPmlfZ2RxdW90LAorCQkJCQkgZmxhZ3MgJiBYRlNfUU1PUFRfRFFMT0NLKTsKKwl9CisKKyAgICAgIGRvbmU6CisKKyNpZmRlZiBRVU9UQURFQlVHCisJaWYgKCEgZXJyb3IpIHsKKwkJaWYgKGlwLT5pX3VkcXVvdCkgeworCQkJaWYgKGZsYWdzICYgWEZTX1FNT1BUX0RRTE9DSykKKwkJCQlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChpcC0+aV91ZHF1b3QpKTsKKwkJfQorCQlpZiAoaXAtPmlfZ2RxdW90KSB7CisJCQlpZiAoZmxhZ3MgJiBYRlNfUU1PUFRfRFFMT0NLKQorCQkJCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKGlwLT5pX2dkcXVvdCkpOworCQl9CisJCWlmIChYRlNfSVNfVVFVT1RBX09OKG1wKSkKKwkJCUFTU0VSVChpcC0+aV91ZHF1b3QpOworCQlpZiAoWEZTX0lTX0dRVU9UQV9PTihtcCkpCisJCQlBU1NFUlQoaXAtPmlfZ2RxdW90KTsKKwl9CisjZW5kaWYKKworCWlmICghIChmbGFncyAmIFhGU19RTU9QVF9JTE9DS0VEKSkKKwkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKworI2lmZGVmIFFVT1RBREVCVUcKKwllbHNlCisJCUFTU0VSVChYRlNfSVNMT0NLRURfSU5PREVfRVhDTChpcCkpOworI2VuZGlmCisJcmV0dXJuIChlcnJvcik7Cit9CisKKy8qCisgKiBSZWxlYXNlIGRxdW90cyAoYW5kIHRoZWlyIHJlZmVyZW5jZXMpIGlmIGFueS4KKyAqIFRoZSBpbm9kZSBzaG91bGQgYmUgbG9ja2VkIEVYQ0wgZXhjZXB0IHdoZW4gdGhpcydzIGNhbGxlZCBieQorICogeGZzX2lyZWNsYWltLgorICovCit2b2lkCit4ZnNfcW1fZHFkZXRhY2goCisJeGZzX2lub2RlX3QJKmlwKQoreworCWlmICghKGlwLT5pX3VkcXVvdCB8fCBpcC0+aV9nZHF1b3QpKQorCQlyZXR1cm47CisKKwlBU1NFUlQoaXAtPmlfaW5vICE9IGlwLT5pX21vdW50LT5tX3NiLnNiX3VxdW90aW5vKTsKKwlBU1NFUlQoaXAtPmlfaW5vICE9IGlwLT5pX21vdW50LT5tX3NiLnNiX2dxdW90aW5vKTsKKwlpZiAoaXAtPmlfdWRxdW90KQorCQl4ZnNfZHF0cmFjZV9lbnRyeV9pbm8oaXAtPmlfdWRxdW90LCAiRFFERVRUQUNIIiwgaXApOworCWlmIChpcC0+aV91ZHF1b3QpIHsKKwkJeGZzX3FtX2RxcmVsZShpcC0+aV91ZHF1b3QpOworCQlpcC0+aV91ZHF1b3QgPSBOVUxMOworCX0KKwlpZiAoaXAtPmlfZ2RxdW90KSB7CisJCXhmc19xbV9kcXJlbGUoaXAtPmlfZ2RxdW90KTsKKwkJaXAtPmlfZ2RxdW90ID0gTlVMTDsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBieSBWRlNfU1lOQyBhbmQgZmxhZ3MgYXJnIGRldGVybWluZXMgdGhlIGNhbGxlciwKKyAqIGFuZCBpdHMgbW90aXZlcywgYXMgZG9uZSBpbiB4ZnNfc3luYy4KKyAqCisgKiB2ZnNfc3luYzogU1lOQ19GU0RBVEF8U1lOQ19BVFRSfFNZTkNfQkRGTFVTSCAweDMxCisgKiBzeXNjYWxsIHN5bmM6IFNZTkNfRlNEQVRBfFNZTkNfQVRUUnxTWU5DX0RFTFdSSSAweDI1CisgKiB1bW91bnRyb290IDogU1lOQ19XQUlUIHwgU1lOQ19DTE9TRSB8IFNZTkNfQVRUUiB8IFNZTkNfRlNEQVRBCisgKi8KKworaW50Cit4ZnNfcW1fc3luYygKKwl4ZnNfbW91bnRfdAkqbXAsCisJc2hvcnQJCWZsYWdzKQoreworCWludAkJcmVjbCwgcmVzdGFydHM7CisJeGZzX2RxdW90X3QJKmRxcDsKKwl1aW50CQlmbHVzaF9mbGFnczsKKwlib29sZWFuX3QJbm93YWl0OworCWludAkJZXJyb3I7CisKKwlyZXN0YXJ0cyA9IDA7CisJLyoKKwkgKiBXZSB3b24ndCBibG9jayB1bmxlc3Mgd2UgYXJlIGFza2VkIHRvLgorCSAqLworCW5vd2FpdCA9IChib29sZWFuX3QpKGZsYWdzICYgU1lOQ19CREZMVVNIIHx8IChmbGFncyAmIFNZTkNfV0FJVCkgPT0gMCk7CisKKyAgYWdhaW46CisJeGZzX3FtX21wbGlzdF9sb2NrKG1wKTsKKwkvKgorCSAqIGRxcHVyZ2VfYWxsKCkgYWxzbyB0YWtlcyB0aGUgbXBsaXN0IGxvY2sgYW5kIGl0ZXJhdGUgdGhydSBhbGwgZHF1b3RzCisJICogaW4gcXVvdGFvZmYuIEhvd2V2ZXIsIGlmIHRoZSBRVU9UQV9BQ1RJVkUgYml0cyBhcmUgbm90IGNsZWFyZWQKKwkgKiB3aGVuIHdlIGhhdmUgdGhlIG1wbGlzdCBsb2NrLCB3ZSBrbm93IHRoYXQgZHF1b3RzIHdpbGwgYmUgY29uc2lzdGVudAorCSAqIGFzIGxvbmcgYXMgd2UgaGF2ZSBpdCBsb2NrZWQuCisJICovCisJaWYgKCEgWEZTX0lTX1FVT1RBX09OKG1wKSkgeworCQl4ZnNfcW1fbXBsaXN0X3VubG9jayhtcCk7CisJCXJldHVybiAoMCk7CisJfQorCUZPUkVBQ0hfRFFVT1RfSU5fTVAoZHFwLCBtcCkgeworCQkvKgorCQkgKiBJZiB0aGlzIGlzIHZmc19zeW5jIGNhbGxpbmcsIHRoZW4gc2tpcCB0aGUgZHF1b3RzIHRoYXQKKwkJICogZG9uJ3QgJ3NlZW0nIHRvIGJlIGRpcnR5LiBpZS4gZG9uJ3QgYWNxdWlyZSBkcWxvY2suCisJCSAqIFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIHdoYXQgeGZzX3N5bmMgZG9lcyB3aXRoIGlub2Rlcy4KKwkJICovCisJCWlmIChmbGFncyAmIFNZTkNfQkRGTFVTSCkgeworCQkJaWYgKCEgWEZTX0RRX0lTX0RJUlRZKGRxcCkpCisJCQkJY29udGludWU7CisJCX0KKworCQlpZiAobm93YWl0KSB7CisJCQkvKgorCQkJICogVHJ5IHRvIGFjcXVpcmUgdGhlIGRxdW90IGxvY2suIFdlIGFyZSBOT1Qgb3V0IG9mCisJCQkgKiBsb2NrIG9yZGVyLCBidXQgd2UganVzdCBkb24ndCB3YW50IHRvIHdhaXQgZm9yIHRoaXMKKwkJCSAqIGxvY2ssIHVubGVzcyBzb21lYm9keSB3YW50ZWQgdXMgdG8uCisJCQkgKi8KKwkJCWlmICghIHhmc19xbV9kcWxvY2tfbm93YWl0KGRxcCkpCisJCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQl4ZnNfZHFsb2NrKGRxcCk7CisJCX0KKworCQkvKgorCQkgKiBOb3csIGZpbmQgb3V0IGZvciBzdXJlIGlmIHRoaXMgZHF1b3QgaXMgZGlydHkgb3Igbm90LgorCQkgKi8KKwkJaWYgKCEgWEZTX0RRX0lTX0RJUlRZKGRxcCkpIHsKKwkJCXhmc19kcXVubG9jayhkcXApOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBYWFggYSBzZW50aW5lbCB3b3VsZCBiZSBiZXR0ZXIgKi8KKwkJcmVjbCA9IFhGU19RSV9NUExSRUNMQUlNUyhtcCk7CisJCWlmICghIHhmc19xbV9kcWZsb2NrX25vd2FpdChkcXApKSB7CisJCQlpZiAobm93YWl0KSB7CisJCQkJeGZzX2RxdW5sb2NrKGRxcCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKgorCQkJICogSWYgd2UgY2FuJ3QgZ3JhYiB0aGUgZmx1c2ggbG9jayB0aGVuIGlmIHRoZSBjYWxsZXIKKwkJCSAqIHJlYWxseSB3YW50ZWQgdXMgdG8gZ2l2ZSB0aGlzIG91ciBiZXN0IHNob3QsCisJCQkgKiBzZWUgaWYgd2UgY2FuIGdpdmUgYSBwdXNoIHRvIHRoZSBidWZmZXIgYmVmb3JlIHdlIHdhaXQKKwkJCSAqIG9uIHRoZSBmbHVzaCBsb2NrLiBBdCB0aGlzIHBvaW50LCB3ZSBrbm93IHRoYXQKKwkJCSAqIGV2ZW50aG91Z2ggdGhlIGRxdW90IGlzIGJlaW5nIGZsdXNoZWQsCisJCQkgKiBpdCBoYXMgKG5ldykgZGlydHkgZGF0YS4KKwkJCSAqLworCQkJeGZzX3FtX2RxZmxvY2tfcHVzaGJ1Zl93YWl0KGRxcCk7CisJCX0KKwkJLyoKKwkJICogTGV0IGdvIG9mIHRoZSBtcGxpc3QgbG9jay4gV2UgZG9uJ3Qgd2FudCB0byBob2xkIGl0CisJCSAqIGFjcm9zcyBhIGRpc2sgd3JpdGUKKwkJICovCisJCWZsdXNoX2ZsYWdzID0gKG5vd2FpdCkgPyBYRlNfUU1PUFRfREVMV1JJIDogWEZTX1FNT1BUX1NZTkM7CisJCXhmc19xbV9tcGxpc3RfdW5sb2NrKG1wKTsKKwkJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiWFFNX1NZTkM6IERRRkxVU0giKTsKKwkJZXJyb3IgPSB4ZnNfcW1fZHFmbHVzaChkcXAsIGZsdXNoX2ZsYWdzKTsKKwkJeGZzX2RxdW5sb2NrKGRxcCk7CisJCWlmIChlcnJvciAmJiBYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJCXJldHVybigwKTsJLyogTmVlZCB0byBwcmV2ZW50IHVtb3VudCBmYWlsdXJlICovCisJCWVsc2UgaWYgKGVycm9yKQorCQkJcmV0dXJuIChlcnJvcik7CisKKwkJeGZzX3FtX21wbGlzdF9sb2NrKG1wKTsKKwkJaWYgKHJlY2wgIT0gWEZTX1FJX01QTFJFQ0xBSU1TKG1wKSkgeworCQkJaWYgKCsrcmVzdGFydHMgPj0gWEZTX1FNX1NZTkNfTUFYX1JFU1RBUlRTKQorCQkJCWJyZWFrOworCisJCQl4ZnNfcW1fbXBsaXN0X3VubG9jayhtcCk7CisJCQlnb3RvIGFnYWluOworCQl9CisJfQorCisJeGZzX3FtX21wbGlzdF91bmxvY2sobXApOworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqIFRoaXMgaW5pdGlhbGl6ZXMgYWxsIHRoZSBxdW90YSBpbmZvcm1hdGlvbiB0aGF0J3Mga2VwdCBpbiB0aGUKKyAqIG1vdW50IHN0cnVjdHVyZQorICovCitpbnQKK3hmc19xbV9pbml0X3F1b3RhaW5mbygKKwl4ZnNfbW91bnRfdAkqbXApCit7CisJeGZzX3F1b3RhaW5mb190ICpxaW5mOworCWludAkJZXJyb3I7CisJeGZzX2RxdW90X3QJKmRxcDsKKworCUFTU0VSVChYRlNfSVNfUVVPVEFfUlVOTklORyhtcCkpOworCisJLyoKKwkgKiBUZWxsIFhRTSB0aGF0IHdlIGV4aXN0IGFzIHNvb24gYXMgcG9zc2libGUuCisJICovCisJaWYgKChlcnJvciA9IHhmc19xbV9ob2xkX3F1b3RhZnNfcmVmKG1wKSkpIHsKKwkJcmV0dXJuIChlcnJvcik7CisJfQorCisJcWluZiA9IG1wLT5tX3F1b3RhaW5mbyA9IGttZW1femFsbG9jKHNpemVvZih4ZnNfcXVvdGFpbmZvX3QpLCBLTV9TTEVFUCk7CisKKwkvKgorCSAqIFNlZSBpZiBxdW90YWlub2RlcyBhcmUgc2V0dXAsIGFuZCBpZiBub3QsIGFsbG9jYXRlIHRoZW0sCisJICogYW5kIGNoYW5nZSB0aGUgc3VwZXJibG9jayBhY2NvcmRpbmdseS4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX3FtX2luaXRfcXVvdGFpbm9zKG1wKSkpIHsKKwkJa21lbV9mcmVlKHFpbmYsIHNpemVvZih4ZnNfcXVvdGFpbmZvX3QpKTsKKwkJbXAtPm1fcXVvdGFpbmZvID0gTlVMTDsKKwkJcmV0dXJuIChlcnJvcik7CisJfQorCisJc3BpbmxvY2tfaW5pdCgmcWluZi0+cWlfcGlubG9jaywgInhmc19xaW5mX3BpbiIpOworCXhmc19xbV9saXN0X2luaXQoJnFpbmYtPnFpX2RxbGlzdCwgIm1wZHFsaXN0IiwgMCk7CisJcWluZi0+cWlfZHFyZWNsYWltcyA9IDA7CisKKwkvKiBtdXRleCB1c2VkIHRvIHNlcmlhbGl6ZSBxdW90YW9mZnMgKi8KKwltdXRleF9pbml0KCZxaW5mLT5xaV9xdW90YW9mZmxvY2ssIE1VVEVYX0RFRkFVTFQsICJxb2ZmIik7CisKKwkvKiBQcmVjYWxjIHNvbWUgY29uc3RhbnRzICovCisJcWluZi0+cWlfZHFjaHVua2xlbiA9IFhGU19GU0JfVE9fQkIobXAsIFhGU19EUVVPVF9DTFVTVEVSX1NJWkVfRlNCKTsKKwlBU1NFUlQocWluZi0+cWlfZHFjaHVua2xlbik7CisJcWluZi0+cWlfZHFwZXJjaHVuayA9IEJCVE9CKHFpbmYtPnFpX2RxY2h1bmtsZW4pOworCWRvX2RpdihxaW5mLT5xaV9kcXBlcmNodW5rLCBzaXplb2YoeGZzX2RxYmxrX3QpKTsKKworCW1wLT5tX3FmbGFncyB8PSAobXAtPm1fc2Iuc2JfcWZsYWdzICYgWEZTX0FMTF9RVU9UQV9DSEtEKTsKKworCS8qCisJICogV2UgdHJ5IHRvIGdldCB0aGUgbGltaXRzIGZyb20gdGhlIHN1cGVydXNlcidzIGxpbWl0cyBmaWVsZHMuCisJICogVGhpcyBpcyBxdWl0ZSBoYWNreSwgYnV0IGl0IGlzIHN0YW5kYXJkIHF1b3RhIHByYWN0aWNlLgorCSAqIFdlIGxvb2sgYXQgdGhlIFVTUiBkcXVvdCB3aXRoIGlkID09IDAgZmlyc3QsIGJ1dCBpZiB1c2VyIHF1b3RhcworCSAqIGFyZSBub3QgZW5hYmxlZCB3ZSBnb3RvIHRoZSBHUlAgZHF1b3Qgd2l0aCBpZCA9PSAwLgorCSAqIFdlIGRvbid0IHJlYWxseSBjYXJlIHRvIGtlZXAgc2VwYXJhdGUgZGVmYXVsdCBsaW1pdHMgZm9yIHVzZXIKKwkgKiBhbmQgZ3JvdXAgcXVvdGFzLCBhdCBsZWFzdCBub3QgYXQgdGhpcyBwb2ludC4KKwkgKi8KKwllcnJvciA9IHhmc19xbV9kcWdldChtcCwgTlVMTCwgKHhmc19kcWlkX3QpMCwKKwkJCSAgICAgKFhGU19JU19VUVVPVEFfUlVOTklORyhtcCkpID8KKwkJCSAgICAgWEZTX0RRX1VTRVIgOiBYRlNfRFFfR1JPVVAsCisJCQkgICAgIFhGU19RTU9QVF9EUVNVU0VSfFhGU19RTU9QVF9ET1dBUk4sCisJCQkgICAgICZkcXApOworCWlmICghIGVycm9yKSB7CisJCXhmc19kaXNrX2RxdW90X3QJKmRkcXAgPSAmZHFwLT5xX2NvcmU7CisKKwkJLyoKKwkJICogVGhlIHdhcm5pbmdzIGFuZCB0aW1lcnMgc2V0IHRoZSBncmFjZSBwZXJpb2QgZ2l2ZW4gdG8KKwkJICogYSB1c2VyIG9yIGdyb3VwIGJlZm9yZSBoZSBvciBzaGUgY2FuIG5vdCBwZXJmb3JtIGFueQorCQkgKiBtb3JlIHdyaXRpbmcuIElmIGl0IGlzIHplcm8sIGEgZGVmYXVsdCBpcyB1c2VkLgorCQkgKi8KKwkJcWluZi0+cWlfYnRpbWVsaW1pdCA9CisJCQkJSU5UX0dFVChkZHFwLT5kX2J0aW1lciwgQVJDSF9DT05WRVJUKSA/CisJCQkJSU5UX0dFVChkZHFwLT5kX2J0aW1lciwgQVJDSF9DT05WRVJUKSA6CisJCQkJWEZTX1FNX0JUSU1FTElNSVQ7CisJCXFpbmYtPnFpX2l0aW1lbGltaXQgPQorCQkJCUlOVF9HRVQoZGRxcC0+ZF9pdGltZXIsIEFSQ0hfQ09OVkVSVCkgPworCQkJCUlOVF9HRVQoZGRxcC0+ZF9pdGltZXIsIEFSQ0hfQ09OVkVSVCkgOgorCQkJCVhGU19RTV9JVElNRUxJTUlUOworCQlxaW5mLT5xaV9ydGJ0aW1lbGltaXQgPQorCQkJCUlOVF9HRVQoZGRxcC0+ZF9ydGJ0aW1lciwgQVJDSF9DT05WRVJUKSA/CisJCQkJSU5UX0dFVChkZHFwLT5kX3J0YnRpbWVyLCBBUkNIX0NPTlZFUlQpIDoKKwkJCQlYRlNfUU1fUlRCVElNRUxJTUlUOworCQlxaW5mLT5xaV9id2FybmxpbWl0ID0KKwkJCQlJTlRfR0VUKGRkcXAtPmRfYndhcm5zLCBBUkNIX0NPTlZFUlQpID8KKwkJCQlJTlRfR0VUKGRkcXAtPmRfYndhcm5zLCBBUkNIX0NPTlZFUlQpIDoKKwkJCQlYRlNfUU1fQldBUk5MSU1JVDsKKwkJcWluZi0+cWlfaXdhcm5saW1pdCA9CisJCQkJSU5UX0dFVChkZHFwLT5kX2l3YXJucywgQVJDSF9DT05WRVJUKSA/CisJCQkJSU5UX0dFVChkZHFwLT5kX2l3YXJucywgQVJDSF9DT05WRVJUKSA6CisJCQkJWEZTX1FNX0lXQVJOTElNSVQ7CisJCXFpbmYtPnFpX2JoYXJkbGltaXQgPQorCQkJCUlOVF9HRVQoZGRxcC0+ZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpOworCQlxaW5mLT5xaV9ic29mdGxpbWl0ID0KKwkJCQlJTlRfR0VUKGRkcXAtPmRfYmxrX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKTsKKwkJcWluZi0+cWlfaWhhcmRsaW1pdCA9CisJCQkJSU5UX0dFVChkZHFwLT5kX2lub19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCk7CisJCXFpbmYtPnFpX2lzb2Z0bGltaXQgPQorCQkJCUlOVF9HRVQoZGRxcC0+ZF9pbm9fc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpOworCQlxaW5mLT5xaV9ydGJoYXJkbGltaXQgPQorCQkJCUlOVF9HRVQoZGRxcC0+ZF9ydGJfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpOworCQlxaW5mLT5xaV9ydGJzb2Z0bGltaXQgPQorCQkJCUlOVF9HRVQoZGRxcC0+ZF9ydGJfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpOworIAorCQkvKgorCQkgKiBXZSBzZW50IHRoZSBYRlNfUU1PUFRfRFFTVVNFUiBmbGFnIHRvIGRxZ2V0IGJlY2F1c2UKKwkJICogd2UgZG9uJ3Qgd2FudCB0aGlzIGRxdW90IGNhY2hlZC4gV2UgaGF2ZW4ndCBkb25lIGEKKwkJICogcXVvdGFjaGVjayB5ZXQsIGFuZCBxdW90YWNoZWNrIGRvZXNuJ3QgbGlrZSBpbmNvcmUgZHF1b3RzLgorCQkgKi8KKwkJeGZzX3FtX2RxZGVzdHJveShkcXApOworCX0gZWxzZSB7CisJCXFpbmYtPnFpX2J0aW1lbGltaXQgPSBYRlNfUU1fQlRJTUVMSU1JVDsKKwkJcWluZi0+cWlfaXRpbWVsaW1pdCA9IFhGU19RTV9JVElNRUxJTUlUOworCQlxaW5mLT5xaV9ydGJ0aW1lbGltaXQgPSBYRlNfUU1fUlRCVElNRUxJTUlUOworCQlxaW5mLT5xaV9id2FybmxpbWl0ID0gWEZTX1FNX0JXQVJOTElNSVQ7CisJCXFpbmYtPnFpX2l3YXJubGltaXQgPSBYRlNfUU1fSVdBUk5MSU1JVDsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCisKKy8qCisgKiBHZXRzIGNhbGxlZCB3aGVuIHVubW91bnRpbmcgYSBmaWxlc3lzdGVtIG9yIHdoZW4gYWxsIHF1b3RhcyBnZXQKKyAqIHR1cm5lZCBvZmYuCisgKiBUaGlzIHB1cmdlcyB0aGUgcXVvdGEgaW5vZGVzLCBkZXN0cm95cyBsb2NrcyBhbmQgZnJlZXMgaXRzZWxmLgorICovCit2b2lkCit4ZnNfcW1fZGVzdHJveV9xdW90YWluZm8oCisJeGZzX21vdW50X3QJKm1wKQoreworCXhmc19xdW90YWluZm9fdCAqcWk7CisKKwlxaSA9IG1wLT5tX3F1b3RhaW5mbzsKKwlBU1NFUlQocWkgIT0gTlVMTCk7CisJQVNTRVJUKHhmc19HcW0gIT0gTlVMTCk7CisKKwkvKgorCSAqIFJlbGVhc2UgdGhlIHJlZmVyZW5jZSB0aGF0IFhRTSBrZXB0LCBzbyB0aGF0IHdlIGtub3cKKwkgKiB3aGVuIHRoZSBYUU0gc3RydWN0dXJlIHNob3VsZCBiZSBmcmVlZC4gV2UgY2Fubm90IGFzc3VtZQorCSAqIHRoYXQgeGZzX0dxbSBpcyBub24tbnVsbCBhZnRlciB0aGlzIHBvaW50LgorCSAqLworCXhmc19xbV9yZWxlX3F1b3RhZnNfcmVmKG1wKTsKKworCXNwaW5sb2NrX2Rlc3Ryb3koJnFpLT5xaV9waW5sb2NrKTsKKwl4ZnNfcW1fbGlzdF9kZXN0cm95KCZxaS0+cWlfZHFsaXN0KTsKKworCWlmIChxaS0+cWlfdXF1b3RhaXApIHsKKwkJWEZTX1BVUkdFX0lOT0RFKHFpLT5xaV91cXVvdGFpcCk7CisJCXFpLT5xaV91cXVvdGFpcCA9IE5VTEw7IC8qIHBhcmFub2lhICovCisJfQorCWlmIChxaS0+cWlfZ3F1b3RhaXApIHsKKwkJWEZTX1BVUkdFX0lOT0RFKHFpLT5xaV9ncXVvdGFpcCk7CisJCXFpLT5xaV9ncXVvdGFpcCA9IE5VTEw7CisJfQorCW11dGV4X2Rlc3Ryb3koJnFpLT5xaV9xdW90YW9mZmxvY2spOworCWttZW1fZnJlZShxaSwgc2l6ZW9mKHhmc19xdW90YWluZm9fdCkpOworCW1wLT5tX3F1b3RhaW5mbyA9IE5VTEw7Cit9CisKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIFBSSVZBVEUgU1RBVElDIEZVTkNUSU9OUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBBUkdTVVNFRCAqLworU1RBVElDIHZvaWQKK3hmc19xbV9saXN0X2luaXQoCisJeGZzX2RxbGlzdF90CSpsaXN0LAorCWNoYXIJCSpzdHIsCisJaW50CQluKQoreworCW11dGV4X2luaXQoJmxpc3QtPnFoX2xvY2ssIE1VVEVYX0RFRkFVTFQsIHN0cik7CisJbGlzdC0+cWhfbmV4dCA9IE5VTEw7CisJbGlzdC0+cWhfdmVyc2lvbiA9IDA7CisJbGlzdC0+cWhfbmVsZW1zID0gMDsKK30KKworU1RBVElDIHZvaWQKK3hmc19xbV9saXN0X2Rlc3Ryb3koCisJeGZzX2RxbGlzdF90CSpsaXN0KQoreworCW11dGV4X2Rlc3Ryb3koJihsaXN0LT5xaF9sb2NrKSk7Cit9CisKKworLyoKKyAqIFN0cmlwcGVkIGRvd24gdmVyc2lvbiBvZiBkcWF0dGFjaC4gVGhpcyBkb2Vzbid0IGF0dGFjaCwgb3IgZXZlbiBsb29rIGF0IHRoZQorICogZHF1b3RzIGF0dGFjaGVkIHRvIHRoZSBpbm9kZS4gVGhlIHJhdGlvbmFsZSBpcyB0aGF0IHRoZXJlIHdvbid0IGJlIGFueQorICogYXR0YWNoZWQgYXQgdGhlIHRpbWUgdGhpcyBpcyBjYWxsZWQgZnJvbSBxdW90YWNoZWNrLgorICovCitTVEFUSUMgaW50Cit4ZnNfcW1fZHFnZXRfbm9hdHRhY2goCisJeGZzX2lub2RlX3QJKmlwLAorCXhmc19kcXVvdF90CSoqT191ZHFwcCwKKwl4ZnNfZHF1b3RfdAkqKk9fZ2RxcHApCit7CisJaW50CQllcnJvcjsKKwl4ZnNfbW91bnRfdAkqbXA7CisJeGZzX2RxdW90X3QJKnVkcXAsICpnZHFwOworCisJQVNTRVJUKFhGU19JU0xPQ0tFRF9JTk9ERV9FWENMKGlwKSk7CisJbXAgPSBpcC0+aV9tb3VudDsKKwl1ZHFwID0gTlVMTDsKKwlnZHFwID0gTlVMTDsKKworCWlmIChYRlNfSVNfVVFVT1RBX09OKG1wKSkgeworCQlBU1NFUlQoaXAtPmlfdWRxdW90ID09IE5VTEwpOworCQkvKgorCQkgKiBXZSB3YW50IHRoZSBkcXVvdCBhbGxvY2F0ZWQgaWYgaXQgZG9lc24ndCBleGlzdC4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFnZXQobXAsIGlwLCBpcC0+aV9kLmRpX3VpZCwgWEZTX0RRX1VTRVIsCisJCQkJCSBYRlNfUU1PUFRfRFFBTExPQyB8IFhGU19RTU9QVF9ET1dBUk4sCisJCQkJCSAmdWRxcCkpKSB7CisJCQkvKgorCQkJICogU2hvdWxkbid0IGJlIGFibGUgdG8gdHVybiBvZmYgcXVvdGFzIGhlcmUuCisJCQkgKi8KKwkJCUFTU0VSVChlcnJvciAhPSBFU1JDSCk7CisJCQlBU1NFUlQoZXJyb3IgIT0gRU5PRU5UKTsKKwkJCXJldHVybiAoZXJyb3IpOworCQl9CisJCUFTU0VSVCh1ZHFwKTsKKwl9CisKKwlpZiAoWEZTX0lTX0dRVU9UQV9PTihtcCkpIHsKKwkJQVNTRVJUKGlwLT5pX2dkcXVvdCA9PSBOVUxMKTsKKwkJaWYgKHVkcXApCisJCQl4ZnNfZHF1bmxvY2sodWRxcCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFnZXQobXAsIGlwLCBpcC0+aV9kLmRpX2dpZCwgWEZTX0RRX0dST1VQLAorCQkJCQkgWEZTX1FNT1BUX0RRQUxMT0N8WEZTX1FNT1BUX0RPV0FSTiwKKwkJCQkJICZnZHFwKSkpIHsKKwkJCWlmICh1ZHFwKQorCQkJCXhmc19xbV9kcXJlbGUodWRxcCk7CisJCQlBU1NFUlQoZXJyb3IgIT0gRVNSQ0gpOworCQkJQVNTRVJUKGVycm9yICE9IEVOT0VOVCk7CisJCQlyZXR1cm4gKGVycm9yKTsKKwkJfQorCQlBU1NFUlQoZ2RxcCk7CisKKwkJLyogUmVhY3F1aXJlIHRoZSBsb2NrcyBpbiB0aGUgcmlnaHQgb3JkZXIgKi8KKwkJaWYgKHVkcXApIHsKKwkJCWlmICghIHhmc19xbV9kcWxvY2tfbm93YWl0KHVkcXApKSB7CisJCQkJeGZzX2RxdW5sb2NrKGdkcXApOworCQkJCXhmc19kcWxvY2sodWRxcCk7CisJCQkJeGZzX2RxbG9jayhnZHFwKTsKKwkJCX0KKwkJfQorCX0KKworCSpPX3VkcXBwID0gdWRxcDsKKwkqT19nZHFwcCA9IGdkcXA7CisKKyNpZmRlZiBRVU9UQURFQlVHCisJaWYgKHVkcXApIEFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKHVkcXApKTsKKwlpZiAoZ2RxcCkgQVNTRVJUKFhGU19EUV9JU19MT0NLRUQoZ2RxcCkpOworI2VuZGlmCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIENyZWF0ZSBhbiBpbm9kZSBhbmQgcmV0dXJuIHdpdGggYSByZWZlcmVuY2UgYWxyZWFkeSB0YWtlbiwgYnV0IHVubG9ja2VkCisgKiBUaGlzIGlzIGhvdyB3ZSBjcmVhdGUgcXVvdGEgaW5vZGVzCisgKi8KK1NUQVRJQyBpbnQKK3hmc19xbV9xaW5vX2FsbG9jKAorCXhmc19tb3VudF90CSptcCwKKwl4ZnNfaW5vZGVfdAkqKmlwLAorCV9faW50NjRfdAlzYmZpZWxkcywKKwl1aW50CQlmbGFncykKK3sKKwl4ZnNfdHJhbnNfdAkqdHA7CisJaW50CQllcnJvcjsKKwl1bnNpZ25lZCBsb25nIHM7CisJY3JlZF90CQl6ZXJvY3I7CisJaW50CQljb21taXR0ZWQ7CisKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCxYRlNfVFJBTlNfUU1fUUlOT0NSRUFURSk7CisJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLAorCQkJCSAgICAgIFhGU19RTV9RSU5PQ1JFQVRFX1NQQUNFX1JFUyhtcCksCisJCQkJICAgICAgWEZTX0NSRUFURV9MT0dfUkVTKG1wKSwgMCwKKwkJCQkgICAgICBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAorCQkJCSAgICAgIFhGU19DUkVBVEVfTE9HX0NPVU5UKSkpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCXJldHVybiAoZXJyb3IpOworCX0KKwltZW1zZXQoJnplcm9jciwgMCwgc2l6ZW9mKHplcm9jcikpOworCisJaWYgKChlcnJvciA9IHhmc19kaXJfaWFsbG9jKCZ0cCwgbXAtPm1fcm9vdGlwLCBTX0lGUkVHLCAxLCAwLAorCQkJCSAgICZ6ZXJvY3IsIDAsIDEsIGlwLCAmY29tbWl0dGVkKSkpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUyB8CisJCQkJIFhGU19UUkFOU19BQk9SVCk7CisJCXJldHVybiAoZXJyb3IpOworCX0KKworCS8qCisJICogS2VlcCBhbiBleHRyYSByZWZlcmVuY2UgdG8gdGhpcyBxdW90YSBpbm9kZS4gVGhpcyBpbm9kZSBpcworCSAqIGxvY2tlZCBleGNsdXNpdmVseSBhbmQgam9pbmVkIHRvIHRoZSB0cmFuc2FjdGlvbiBhbHJlYWR5LgorCSAqLworCUFTU0VSVChYRlNfSVNMT0NLRURfSU5PREVfRVhDTCgqaXApKTsKKwlWTl9IT0xEKFhGU19JVE9WKCgqaXApKSk7CisKKwkvKgorCSAqIE1ha2UgdGhlIGNoYW5nZXMgaW4gdGhlIHN1cGVyYmxvY2ssIGFuZCBsb2cgdGhvc2UgdG9vLgorCSAqIHNiZmllbGRzIGFyZyBtYXkgY29udGFpbiBmaWVsZHMgb3RoZXIgdGhhbiAqUVVPVElOTzsKKwkgKiBWRVJTSU9OTlVNIGZvciBleGFtcGxlLgorCSAqLworCXMgPSBYRlNfU0JfTE9DSyhtcCk7CisJaWYgKGZsYWdzICYgWEZTX1FNT1BUX1NCVkVSU0lPTikgeworI2lmIGRlZmluZWQoREVCVUcpICYmIGRlZmluZWQoWEZTX0xPVURfUkVDT1ZFUlkpCisJCXVuc2lnbmVkIG9sZHYgPSBtcC0+bV9zYi5zYl92ZXJzaW9ubnVtOworI2VuZGlmCisJCUFTU0VSVCghWEZTX1NCX1ZFUlNJT05fSEFTUVVPVEEoJm1wLT5tX3NiKSk7CisJCUFTU0VSVCgoc2JmaWVsZHMgJiAoWEZTX1NCX1ZFUlNJT05OVU0gfCBYRlNfU0JfVVFVT1RJTk8gfAorCQkJCSAgIFhGU19TQl9HUVVPVElOTyB8IFhGU19TQl9RRkxBR1MpKSA9PQorCQkgICAgICAgKFhGU19TQl9WRVJTSU9OTlVNIHwgWEZTX1NCX1VRVU9USU5PIHwKKwkJCVhGU19TQl9HUVVPVElOTyB8IFhGU19TQl9RRkxBR1MpKTsKKworCQlYRlNfU0JfVkVSU0lPTl9BRERRVU9UQSgmbXAtPm1fc2IpOworCQltcC0+bV9zYi5zYl91cXVvdGlubyA9IE5VTExGU0lOTzsKKwkJbXAtPm1fc2Iuc2JfZ3F1b3Rpbm8gPSBOVUxMRlNJTk87CisKKwkJLyogcWZsYWdzIHdpbGwgZ2V0IHVwZGF0ZWQgX2FmdGVyXyBxdW90YWNoZWNrICovCisJCW1wLT5tX3NiLnNiX3FmbGFncyA9IDA7CisjaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChYRlNfTE9VRF9SRUNPVkVSWSkKKwkJY21uX2VycihDRV9OT1RFLAorCQkJIk9sZCBzdXBlcmJsb2NrIHZlcnNpb24gJXgsIGNvbnZlcnRpbmcgdG8gJXguIiwKKwkJCW9sZHYsIG1wLT5tX3NiLnNiX3ZlcnNpb25udW0pOworI2VuZGlmCisJfQorCWlmIChmbGFncyAmIFhGU19RTU9QVF9VUVVPVEEpCisJCW1wLT5tX3NiLnNiX3VxdW90aW5vID0gKCppcCktPmlfaW5vOworCWVsc2UKKwkJbXAtPm1fc2Iuc2JfZ3F1b3Rpbm8gPSAoKmlwKS0+aV9pbm87CisJWEZTX1NCX1VOTE9DSyhtcCwgcyk7CisJeGZzX21vZF9zYih0cCwgc2JmaWVsZHMpOworCisJaWYgKChlcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsCisJCQkJICAgICBOVUxMKSkpIHsKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLCAiWEZTIHFpbm9fYWxsb2MgZmFpbGVkISIpOworCQlyZXR1cm4gKGVycm9yKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworCitTVEFUSUMgaW50Cit4ZnNfcW1fcmVzZXRfZHFjb3VudHMoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19idWZfdAkqYnAsCisJeGZzX2RxaWRfdAlpZCwKKwl1aW50CQl0eXBlKQoreworCXhmc19kaXNrX2RxdW90X3QJKmRkcTsKKwlpbnQJCQlqOworCisJeGZzX2J1ZnRyYWNlKCJSRVNFVCBEUVVPVFMiLCBicCk7CisJLyoKKwkgKiBSZXNldCBhbGwgY291bnRlcnMgYW5kIHRpbWVycy4gVGhleSdsbCBiZQorCSAqIHN0YXJ0ZWQgYWZyZXNoIGJ5IHhmc19xbV9xdW90YWNoZWNrLgorCSAqLworI2lmZGVmIERFQlVHCisJaiA9IFhGU19GU0JfVE9fQihtcCwgWEZTX0RRVU9UX0NMVVNURVJfU0laRV9GU0IpOworCWRvX2RpdihqLCBzaXplb2YoeGZzX2RxYmxrX3QpKTsKKwlBU1NFUlQoWEZTX1FNX0RRUEVSQkxLKG1wKSA9PSBqKTsKKyNlbmRpZgorCWRkcSA9ICh4ZnNfZGlza19kcXVvdF90ICopWEZTX0JVRl9QVFIoYnApOworCWZvciAoaiA9IDA7IGogPCBYRlNfUU1fRFFQRVJCTEsobXApOyBqKyspIHsKKwkJLyoKKwkJICogRG8gYSBzYW5pdHkgY2hlY2ssIGFuZCBpZiBuZWVkZWQsIHJlcGFpciB0aGUgZHFibGsuIERvbid0CisJCSAqIG91dHB1dCBhbnkgd2FybmluZ3MgYmVjYXVzZSBpdCdzIHBlcmZlY3RseSBwb3NzaWJsZSB0bworCQkgKiBmaW5kIHVuaXRpYWxpemVkIGRxdW90IGJsa3MuIFNlZSBjb21tZW50IGluIHhmc19xbV9kcWNoZWNrLgorCQkgKi8KKwkJKHZvaWQpIHhmc19xbV9kcWNoZWNrKGRkcSwgaWQraiwgdHlwZSwgWEZTX1FNT1BUX0RRUkVQQUlSLAorCQkJCSAgICAgICJ4ZnNfcXVvdGFjaGVjayIpOworCQlJTlRfU0VUKGRkcS0+ZF9iY291bnQsIEFSQ0hfQ09OVkVSVCwgMFVMTCk7CisJCUlOVF9TRVQoZGRxLT5kX2ljb3VudCwgQVJDSF9DT05WRVJULCAwVUxMKTsKKwkJSU5UX1NFVChkZHEtPmRfcnRiY291bnQsIEFSQ0hfQ09OVkVSVCwgMFVMTCk7CisJCUlOVF9TRVQoZGRxLT5kX2J0aW1lciwgQVJDSF9DT05WRVJULCAodGltZV90KTApOworCQlJTlRfU0VUKGRkcS0+ZF9pdGltZXIsIEFSQ0hfQ09OVkVSVCwgKHRpbWVfdCkwKTsKKwkJSU5UX1NFVChkZHEtPmRfYndhcm5zLCBBUkNIX0NPTlZFUlQsIDBVTCk7CisJCUlOVF9TRVQoZGRxLT5kX2l3YXJucywgQVJDSF9DT05WRVJULCAwVUwpOworCQlkZHEgPSAoeGZzX2Rpc2tfZHF1b3RfdCAqKSAoKHhmc19kcWJsa190ICopZGRxICsgMSk7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworU1RBVElDIGludAoreGZzX3FtX2RxaXRlcl9idWZzKAorCXhmc19tb3VudF90CSptcCwKKwl4ZnNfZHFpZF90CWZpcnN0aWQsCisJeGZzX2ZzYmxvY2tfdAlibm8sCisJeGZzX2ZpbGJsa3NfdAlibGtjbnQsCisJdWludAkJZmxhZ3MpCit7CisJeGZzX2J1Zl90CSpicDsKKwlpbnQJCWVycm9yOworCWludAkJbm90Y29tbWl0dGVkOworCWludAkJaW5jcjsKKworCUFTU0VSVChibGtjbnQgPiAwKTsKKwlub3Rjb21taXR0ZWQgPSAwOworCWluY3IgPSAoYmxrY250ID4gWEZTX1FNX01BWF9EUUNMVVNURVJfTE9HU1opID8KKwkJWEZTX1FNX01BWF9EUUNMVVNURVJfTE9HU1ogOiBibGtjbnQ7CisJZXJyb3IgPSAwOworCisJLyoKKwkgKiBCbGtjbnQgYXJnIGNhbiBiZSBhIHZlcnkgYmlnIG51bWJlciwgYW5kIG1pZ2h0IGV2ZW4gYmUKKwkgKiBsYXJnZXIgdGhhbiB0aGUgbG9nIGl0c2VsZi4gU28sIHdlIGhhdmUgdG8gYnJlYWsgaXQgdXAgaW50bworCSAqIG1hbmFnZWFibGUtc2l6ZWQgdHJhbnNhY3Rpb25zLgorCSAqIE5vdGUgdGhhdCB3ZSBkb24ndCBzdGFydCBhIHBlcm1hbmVudCB0cmFuc2FjdGlvbiBoZXJlOyB3ZSBtaWdodAorCSAqIG5vdCBiZSBhYmxlIHRvIGdldCBhIGxvZyByZXNlcnZhdGlvbiBmb3IgdGhlIHdob2xlIHRoaW5nIHVwIGZyb250LAorCSAqIGFuZCB3ZSBkb24ndCByZWFsbHkgY2FyZSB0byBlaXRoZXIsIGJlY2F1c2Ugd2UganVzdCBkaXNjYXJkCisJICogZXZlcnl0aGluZyBpZiB3ZSB3ZXJlIHRvIGNyYXNoIGluIHRoZSBtaWRkbGUgb2YgdGhpcyBsb29wLgorCSAqLworCXdoaWxlIChibGtjbnQtLSkgeworCQllcnJvciA9IHhmc190cmFuc19yZWFkX2J1ZihtcCwgTlVMTCwgbXAtPm1fZGRldl90YXJncCwKKwkJCSAgICAgIFhGU19GU0JfVE9fREFERFIobXAsIGJubyksCisJCQkgICAgICAoaW50KVhGU19RSV9EUUNIVU5LTEVOKG1wKSwgMCwgJmJwKTsKKwkJaWYgKGVycm9yKQorCQkJYnJlYWs7CisKKwkJKHZvaWQpIHhmc19xbV9yZXNldF9kcWNvdW50cyhtcCwgYnAsIGZpcnN0aWQsCisJCQkJCSAgICAgZmxhZ3MgJiBYRlNfUU1PUFRfVVFVT1RBID8KKwkJCQkJICAgICBYRlNfRFFfVVNFUiA6IFhGU19EUV9HUk9VUCk7CisJCXhmc19iZHdyaXRlKG1wLCBicCk7CisJCS8qCisJCSAqIGdvdG8gdGhlIG5leHQgYmxvY2suCisJCSAqLworCQlibm8rKzsKKwkJZmlyc3RpZCArPSBYRlNfUU1fRFFQRVJCTEsobXApOworCX0KKwlyZXR1cm4gKGVycm9yKTsKK30KKworLyoKKyAqIEl0ZXJhdGUgb3ZlciBhbGwgYWxsb2NhdGVkIFVTUi9HUlAgZHF1b3RzIGluIHRoZSBzeXN0ZW0sIGNhbGxpbmcgYQorICogY2FsbGVyIHN1cHBsaWVkIGZ1bmN0aW9uIGZvciBldmVyeSBjaHVuayBvZiBkcXVvdHMgdGhhdCB3ZSBmaW5kLgorICovCitTVEFUSUMgaW50Cit4ZnNfcW1fZHFpdGVyYXRlKAorCXhmc19tb3VudF90CSptcCwKKwl4ZnNfaW5vZGVfdAkqcWlwLAorCXVpbnQJCWZsYWdzKQoreworCXhmc19ibWJ0X2lyZWNfdAkJKm1hcDsKKwlpbnQJCQlpLCBubWFwczsJLyogbnVtYmVyIG9mIG1hcCBlbnRyaWVzICovCisJaW50CQkJZXJyb3I7CQkvKiByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfZmlsZW9mZl90CQlsYmxrbm87CisJeGZzX2ZpbGJsa3NfdAkJbWF4bGJsa2NudDsKKwl4ZnNfZHFpZF90CQlmaXJzdGlkOworCXhmc19mc2Jsb2NrX3QJCXJhYmxrbm87CisJeGZzX2ZpbGJsa3NfdAkJcmFibGtjbnQ7CisKKwllcnJvciA9IDA7CisJLyoKKwkgKiBUaGlzIGxvb2tzIHJhY2V5LCBidXQgd2UgY2FuJ3Qga2VlcCBhbiBpbm9kZSBsb2NrIGFjcm9zcyBhCisJICogdHJhbnNfcmVzZXJ2ZS4gQnV0LCB0aGlzIGdldHMgY2FsbGVkIGR1cmluZyBxdW90YWNoZWNrLCBhbmQgdGhhdAorCSAqIGhhcHBlbnMgb25seSBhdCBtb3VudCB0aW1lIHdoaWNoIGlzIHNpbmdsZSB0aHJlYWRlZC4KKwkgKi8KKwlpZiAocWlwLT5pX2QuZGlfbmJsb2NrcyA9PSAwKQorCQlyZXR1cm4gKDApOworCisJbWFwID0ga21lbV9hbGxvYyhYRlNfRFFJVEVSX01BUF9TSVpFICogc2l6ZW9mKCptYXApLCBLTV9TTEVFUCk7CisKKwlsYmxrbm8gPSAwOworCW1heGxibGtjbnQgPSBYRlNfQl9UT19GU0IobXAsICh4ZnNfdWZzaXplX3QpWEZTX01BWElPRkZTRVQobXApKTsKKwlkbyB7CisJCW5tYXBzID0gWEZTX0RRSVRFUl9NQVBfU0laRTsKKwkJLyoKKwkJICogV2UgYXJlbid0IGNoYW5naW5nIHRoZSBpbm9kZSBpdHNlbGYuIEp1c3QgY2hhbmdpbmcKKwkJICogc29tZSBvZiBpdHMgZGF0YS4gTm8gbmV3IGJsb2NrcyBhcmUgYWRkZWQgaGVyZSwgYW5kCisJCSAqIHRoZSBpbm9kZSBpcyBuZXZlciBhZGRlZCB0byB0aGUgdHJhbnNhY3Rpb24uCisJCSAqLworCQl4ZnNfaWxvY2socWlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgcWlwLCBsYmxrbm8sCisJCQkJICBtYXhsYmxrY250IC0gbGJsa25vLAorCQkJCSAgWEZTX0JNQVBJX01FVEFEQVRBLAorCQkJCSAgTlVMTCwKKwkJCQkgIDAsIG1hcCwgJm5tYXBzLCBOVUxMKTsKKwkJeGZzX2l1bmxvY2socWlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwkJaWYgKGVycm9yKQorCQkJYnJlYWs7CisKKwkJQVNTRVJUKG5tYXBzIDw9IFhGU19EUUlURVJfTUFQX1NJWkUpOworCQlmb3IgKGkgPSAwOyBpIDwgbm1hcHM7IGkrKykgeworCQkJQVNTRVJUKG1hcFtpXS5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSyk7CisJCQlBU1NFUlQobWFwW2ldLmJyX2Jsb2NrY291bnQpOworCisKKwkJCWxibGtubyArPSBtYXBbaV0uYnJfYmxvY2tjb3VudDsKKworCQkJaWYgKG1hcFtpXS5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLKQorCQkJCWNvbnRpbnVlOworCisJCQlmaXJzdGlkID0gKHhmc19kcWlkX3QpIG1hcFtpXS5icl9zdGFydG9mZiAqCisJCQkJWEZTX1FNX0RRUEVSQkxLKG1wKTsKKwkJCS8qCisJCQkgKiBEbyBhIHJlYWQtYWhlYWQgb24gdGhlIG5leHQgZXh0ZW50LgorCQkJICovCisJCQlpZiAoKGkrMSA8IG5tYXBzKSAmJgorCQkJICAgIChtYXBbaSsxXS5icl9zdGFydGJsb2NrICE9IEhPTEVTVEFSVEJMT0NLKSkgeworCQkJCXJhYmxrY250ID0gIG1hcFtpKzFdLmJyX2Jsb2NrY291bnQ7CisJCQkJcmFibGtubyA9IG1hcFtpKzFdLmJyX3N0YXJ0YmxvY2s7CisJCQkJd2hpbGUgKHJhYmxrY250LS0pIHsKKwkJCQkJeGZzX2JhcmVhZChtcC0+bV9kZGV2X3RhcmdwLAorCQkJCQkgICAgICAgWEZTX0ZTQl9UT19EQUREUihtcCwgcmFibGtubyksCisJCQkJCSAgICAgICAoaW50KVhGU19RSV9EUUNIVU5LTEVOKG1wKSk7CisJCQkJCXJhYmxrbm8rKzsKKwkJCQl9CisJCQl9CisJCQkvKgorCQkJICogSXRlcmF0ZSB0aHJ1IGFsbCB0aGUgYmxrcyBpbiB0aGUgZXh0ZW50IGFuZAorCQkJICogcmVzZXQgdGhlIGNvdW50ZXJzIG9mIGFsbCB0aGUgZHF1b3RzIGluc2lkZSB0aGVtLgorCQkJICovCisJCQlpZiAoKGVycm9yID0geGZzX3FtX2RxaXRlcl9idWZzKG1wLAorCQkJCQkJICAgICAgIGZpcnN0aWQsCisJCQkJCQkgICAgICAgbWFwW2ldLmJyX3N0YXJ0YmxvY2ssCisJCQkJCQkgICAgICAgbWFwW2ldLmJyX2Jsb2NrY291bnQsCisJCQkJCQkgICAgICAgZmxhZ3MpKSkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKGVycm9yKQorCQkJYnJlYWs7CisJfSB3aGlsZSAobm1hcHMgPiAwKTsKKworCWttZW1fZnJlZShtYXAsIFhGU19EUUlURVJfTUFQX1NJWkUgKiBzaXplb2YoKm1hcCkpOworCisJcmV0dXJuIChlcnJvcik7Cit9CisKKy8qCisgKiBDYWxsZWQgYnkgZHF1c2FnZV9hZGp1c3QgaW4gZG9pbmcgYSBxdW90YWNoZWNrLgorICogR2l2ZW4gdGhlIGlub2RlLCBhbmQgYSBkcXVvdCAoZWl0aGVyIFVTUiBvciBHUlAsIGRvZXNuJ3QgbWF0dGVyKSwKKyAqIHRoaXMgdXBkYXRlcyBpdHMgaW5jb3JlIGNvcHkgYXMgd2VsbCBhcyB0aGUgYnVmZmVyIGNvcHkuIFRoaXMgaXMKKyAqIHNvIHRoYXQgb25jZSB0aGUgcXVvdGFjaGVjayBpcyBkb25lLCB3ZSBjYW4ganVzdCBsb2cgYWxsIHRoZSBidWZmZXJzLAorICogYXMgb3Bwb3NlZCB0byBsb2dnaW5nIG51bWVyb3VzIHVwZGF0ZXMgdG8gaW5kaXZpZHVhbCBkcXVvdHMuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfcW1fcXVvdGFjaGVja19kcWFkanVzdCgKKwl4ZnNfZHF1b3RfdAkJKmRxcCwKKwl4ZnNfcWNudF90CQluYmxrcywKKwl4ZnNfcWNudF90CQlydGJsa3MpCit7CisJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQoZHFwKSk7CisJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiUUNIRUNLIERRQURKVVNUIik7CisJLyoKKwkgKiBBZGp1c3QgdGhlIGlub2RlIGNvdW50IGFuZCB0aGUgYmxvY2sgY291bnQgdG8gcmVmbGVjdCB0aGlzIGlub2RlJ3MKKwkgKiByZXNvdXJjZSB1c2FnZS4KKwkgKi8KKwlJTlRfTU9EKGRxcC0+cV9jb3JlLmRfaWNvdW50LCBBUkNIX0NPTlZFUlQsICsxKTsKKwlkcXAtPnFfcmVzX2ljb3VudCsrOworCWlmIChuYmxrcykgeworCQlJTlRfTU9EKGRxcC0+cV9jb3JlLmRfYmNvdW50LCBBUkNIX0NPTlZFUlQsIG5ibGtzKTsKKwkJZHFwLT5xX3Jlc19iY291bnQgKz0gbmJsa3M7CisJfQorCWlmIChydGJsa3MpIHsKKwkJSU5UX01PRChkcXAtPnFfY29yZS5kX3J0YmNvdW50LCBBUkNIX0NPTlZFUlQsIHJ0Ymxrcyk7CisJCWRxcC0+cV9yZXNfcnRiY291bnQgKz0gcnRibGtzOworCX0KKworCS8qCisJICogU2V0IGRlZmF1bHQgbGltaXRzLCBhZGp1c3QgdGltZXJzIChzaW5jZSB3ZSBjaGFuZ2VkIHVzYWdlcykKKwkgKi8KKwlpZiAoISBYRlNfSVNfU1VTRVJfRFFVT1QoZHFwKSkgeworCQl4ZnNfcW1fYWRqdXN0X2RxbGltaXRzKGRxcC0+cV9tb3VudCwgJmRxcC0+cV9jb3JlKTsKKwkJeGZzX3FtX2FkanVzdF9kcXRpbWVycyhkcXAtPnFfbW91bnQsICZkcXAtPnFfY29yZSk7CisJfQorCisJZHFwLT5kcV9mbGFncyB8PSBYRlNfRFFfRElSVFk7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19xbV9nZXRfcnRibGtzKAorCXhmc19pbm9kZV90CSppcCwKKwl4ZnNfcWNudF90CSpPX3J0YmxrcykKK3sKKwl4ZnNfZmlsYmxrc190CXJ0YmxrczsJCQkvKiB0b3RhbCBydCBibGtzICovCisJeGZzX2lmb3JrX3QJKmlmcDsJCQkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJbmV4dGVudHM7CQkvKiBudW1iZXIgb2YgZXh0ZW50IGVudHJpZXMgKi8KKwl4ZnNfYm1idF9yZWNfdAkqYmFzZTsJCQkvKiBiYXNlIG9mIGV4dGVudCBhcnJheSAqLworCXhmc19ibWJ0X3JlY190CSplcDsJCQkvKiBwb2ludGVyIHRvIGFuIGV4dGVudCBlbnRyeSAqLworCWludAkJZXJyb3I7CisKKwlBU1NFUlQoWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSk7CisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgWEZTX0RBVEFfRk9SSyk7CisJaWYgKCEoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyhOVUxMLCBpcCwgWEZTX0RBVEFfRk9SSykpKQorCQkJcmV0dXJuIChlcnJvcik7CisJfQorCXJ0YmxrcyA9IDA7CisJbmV4dGVudHMgPSBpZnAtPmlmX2J5dGVzIC8gc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwliYXNlID0gJmlmcC0+aWZfdTEuaWZfZXh0ZW50c1swXTsKKwlmb3IgKGVwID0gYmFzZTsgZXAgPCAmYmFzZVtuZXh0ZW50c107IGVwKyspCisJCXJ0YmxrcyArPSB4ZnNfYm1idF9nZXRfYmxvY2tjb3VudChlcCk7CisJKk9fcnRibGtzID0gKHhmc19xY250X3QpcnRibGtzOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBjYWxsYmFjayByb3V0aW5lIHN1cHBsaWVkIHRvIGJ1bGtzdGF0KCkuIEdpdmVuIGFuIGludW1iZXIsIGZpbmQgaXRzCisgKiBkcXVvdHMgYW5kIHVwZGF0ZSB0aGVtIHRvIGFjY291bnQgZm9yIHJlc291cmNlcyB0YWtlbiBieSB0aGF0IGlub2RlLgorICovCisvKiBBUkdTVVNFRCAqLworU1RBVElDIGludAoreGZzX3FtX2RxdXNhZ2VfYWRqdXN0KAorCXhmc19tb3VudF90CSptcCwJCS8qIG1vdW50IHBvaW50IGZvciBmaWxlc3lzdGVtICovCisJeGZzX2lub190CWlubywJCS8qIGlub2RlIG51bWJlciB0byBnZXQgZGF0YSBmb3IgKi8KKwl2b2lkCQlfX3VzZXIgKmJ1ZmZlciwJLyogbm90IHVzZWQgKi8KKwlpbnQJCXVic2l6ZSwJCS8qIG5vdCB1c2VkICovCisJdm9pZAkJKnByaXZhdGVfZGF0YSwJLyogbm90IHVzZWQgKi8KKwl4ZnNfZGFkZHJfdAlibm8sCQkvKiBzdGFydGluZyBibG9jayBvZiBpbm9kZSBjbHVzdGVyICovCisJaW50CQkqdWJ1c2VkLAkvKiBub3QgdXNlZCAqLworCXZvaWQJCSpkaXAsCQkvKiBvbi1kaXNrIGlub2RlIHBvaW50ZXIgKG5vdCB1c2VkKSAqLworCWludAkJKnJlcykJCS8qIHJlc3VsdCBjb2RlIHZhbHVlICovCit7CisJeGZzX2lub2RlX3QJKmlwOworCXhmc19kcXVvdF90CSp1ZHFwLCAqZ2RxcDsKKwl4ZnNfcWNudF90CW5ibGtzLCBydGJsa3M7CisJaW50CQllcnJvcjsKKworCUFTU0VSVChYRlNfSVNfUVVPVEFfUlVOTklORyhtcCkpOworCisJLyoKKwkgKiByb290aW5vIG11c3QgaGF2ZSBpdHMgcmVzb3VyY2VzIGFjY291bnRlZCBmb3IsIG5vdCBzbyB3aXRoIHRoZSBxdW90YQorCSAqIGlub2Rlcy4KKwkgKi8KKwlpZiAoaW5vID09IG1wLT5tX3NiLnNiX3VxdW90aW5vIHx8IGlubyA9PSBtcC0+bV9zYi5zYl9ncXVvdGlubykgeworCQkqcmVzID0gQlVMS1NUQVRfUlZfTk9USElORzsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKworCS8qCisJICogV2UgZG9uJ3QgX25lZWRfIHRvIHRha2UgdGhlIGlsb2NrIEVYQ0wuIEhvd2V2ZXIsIHRoZSB4ZnNfcW1fZHFnZXQKKwkgKiBpbnRlcmZhY2UgZXhwZWN0cyB0aGUgaW5vZGUgdG8gYmUgZXhjbHVzaXZlbHkgbG9ja2VkIGJlY2F1c2UgdGhhdCdzCisJICogdGhlIGNhc2UgaW4gYWxsIG90aGVyIGluc3RhbmNlcy4gSXQncyBPSyB0aGF0IHdlIGRvIHRoaXMgYmVjYXVzZQorCSAqIHF1b3RhY2hlY2sgaXMgZG9uZSBvbmx5IGF0IG1vdW50IHRpbWUuCisJICovCisJaWYgKChlcnJvciA9IHhmc19pZ2V0KG1wLCBOVUxMLCBpbm8sIDAsIFhGU19JTE9DS19FWENMLCAmaXAsIGJubykpKSB7CisJCSpyZXMgPSBCVUxLU1RBVF9SVl9OT1RISU5HOworCQlyZXR1cm4gKGVycm9yKTsKKwl9CisKKwlpZiAoaXAtPmlfZC5kaV9tb2RlID09IDApIHsKKwkJeGZzX2lwdXRfbmV3KGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCSpyZXMgPSBCVUxLU1RBVF9SVl9OT1RISU5HOworCQlyZXR1cm4gWEZTX0VSUk9SKEVOT0VOVCk7CisJfQorCisJLyoKKwkgKiBPYnRhaW4gdGhlIGxvY2tlZCBkcXVvdHMuIEluIGNhc2Ugb2YgYW4gZXJyb3IgKGVnLiBhbGxvY2F0aW9uCisJICogZmFpbHMgZm9yIEVOT1NQQyksIHdlIHJldHVybiB0aGUgbmVnYXRpdmUgb2YgdGhlIGVycm9yIG51bWJlcgorCSAqIHRvIGJ1bGtzdGF0LCBzbyB0aGF0IGl0IGNhbiBnZXQgcHJvcGFnYXRlZCB0byBxdW90YWNoZWNrKCkgYW5kCisJICogbWFraW5nIHVzIGRpc2FibGUgcXVvdGFzIGZvciB0aGUgZmlsZSBzeXN0ZW0uCisJICovCisJaWYgKChlcnJvciA9IHhmc19xbV9kcWdldF9ub2F0dGFjaChpcCwgJnVkcXAsICZnZHFwKSkpIHsKKwkJeGZzX2lwdXQoaXAsIFhGU19JTE9DS19FWENMKTsKKwkJKnJlcyA9IEJVTEtTVEFUX1JWX0dJVkVVUDsKKwkJcmV0dXJuIChlcnJvcik7CisJfQorCisJcnRibGtzID0gMDsKKwlpZiAoISBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApKSB7CisJCW5ibGtzID0gKHhmc19xY250X3QpaXAtPmlfZC5kaV9uYmxvY2tzOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFdhbGsgdGhydSB0aGUgZXh0ZW50IGxpc3QgYW5kIGNvdW50IHRoZSByZWFsdGltZSBibG9ja3MuCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX3FtX2dldF9ydGJsa3MoaXAsICZydGJsa3MpKSkgeworCQkJeGZzX2lwdXQoaXAsIFhGU19JTE9DS19FWENMKTsKKwkJCWlmICh1ZHFwKQorCQkJCXhmc19xbV9kcXB1dCh1ZHFwKTsKKwkJCWlmIChnZHFwKQorCQkJCXhmc19xbV9kcXB1dChnZHFwKTsKKwkJCSpyZXMgPSBCVUxLU1RBVF9SVl9HSVZFVVA7CisJCQlyZXR1cm4gKGVycm9yKTsKKwkJfQorCQluYmxrcyA9ICh4ZnNfcWNudF90KWlwLT5pX2QuZGlfbmJsb2NrcyAtIHJ0YmxrczsKKwl9CisJQVNTRVJUKGlwLT5pX2RlbGF5ZWRfYmxrcyA9PSAwKTsKKworCS8qCisJICogV2UgY2FuJ3QgcmVsZWFzZSB0aGUgaW5vZGUgd2hpbGUgaG9sZGluZyBpdHMgZHF1b3QgbG9ja3MuCisJICogVGhlIGlub2RlIGNhbiBnbyBpbnRvIGluYWN0aXZlIGFuZCBtaWdodCB0cnkgdG8gYWNxdWlyZSB0aGUgZHF1b3Rsb2Nrcy4KKwkgKiBTbywganVzdCB1bmxvY2sgaGVyZSBhbmQgZG8gYSB2bl9yZWxlIGF0IHRoZSBlbmQuCisJICovCisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKworCS8qCisJICogQWRkIHRoZSAoZGlzayBibG9ja3MgYW5kIGlub2RlKSByZXNvdXJjZXMgb2NjdXBpZWQgYnkgdGhpcworCSAqIGlub2RlIHRvIGl0cyBkcXVvdHMuIFdlIGRvIHRoaXMgYWRqdXN0bWVudCBpbiB0aGUgaW5jb3JlIGRxdW90LAorCSAqIGFuZCBhbHNvIGNvcHkgdGhlIGNoYW5nZXMgdG8gaXRzIGJ1ZmZlci4KKwkgKiBXZSBkb24ndCBjYXJlIGFib3V0IHB1dHRpbmcgdGhlc2UgY2hhbmdlcyBpbiBhIHRyYW5zYWN0aW9uCisJICogZW52ZWxvcGUgYmVjYXVzZSBpZiB3ZSBjcmFzaCBpbiB0aGUgbWlkZGxlIG9mIGEgJ3F1b3RhY2hlY2snCisJICogd2UgaGF2ZSB0byBzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgYW55d2F5LgorCSAqIE9uY2Ugd2UncmUgZG9uZSwgd2UnbGwgbG9nIGFsbCB0aGUgZHF1b3QgYnVmcy4KKwkgKgorCSAqIFRoZSAqUVVPVEFfT04gY2hlY2tzIGJlbG93IG1heSBsb29rIHByZXR0eSByYWNleSwgYnV0IHF1b3RhY2hlY2tzCisJICogYW5kIHF1b3Rhb2ZmcyBkb24ndCByYWNlLiAoUXVvdGFjaGVja3MgaGFwcGVuIGF0IG1vdW50IHRpbWUgb25seSkuCisJICovCisJaWYgKFhGU19JU19VUVVPVEFfT04obXApKSB7CisJCUFTU0VSVCh1ZHFwKTsKKwkJeGZzX3FtX3F1b3RhY2hlY2tfZHFhZGp1c3QodWRxcCwgbmJsa3MsIHJ0Ymxrcyk7CisJCXhmc19xbV9kcXB1dCh1ZHFwKTsKKwl9CisJaWYgKFhGU19JU19HUVVPVEFfT04obXApKSB7CisJCUFTU0VSVChnZHFwKTsKKwkJeGZzX3FtX3F1b3RhY2hlY2tfZHFhZGp1c3QoZ2RxcCwgbmJsa3MsIHJ0Ymxrcyk7CisJCXhmc19xbV9kcXB1dChnZHFwKTsKKwl9CisJLyoKKwkgKiBOb3cgcmVsZWFzZSB0aGUgaW5vZGUuIFRoaXMgd2lsbCBzZW5kIGl0IHRvICdpbmFjdGl2ZScsIGFuZAorCSAqIHBvc3NpYmx5IGV2ZW4gZnJlZSBibG9ja3MuCisJICovCisJVk5fUkVMRShYRlNfSVRPVihpcCkpOworCisJLyoKKwkgKiBHb3RvIG5leHQgaW5vZGUuCisJICovCisJKnJlcyA9IEJVTEtTVEFUX1JWX0RJRE9ORTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogV2FsayB0aHJ1IGFsbCB0aGUgZmlsZXN5c3RlbSBpbm9kZXMgYW5kIGNvbnN0cnVjdCBhIGNvbnNpc3RlbnQgdmlldworICogb2YgdGhlIGRpc2sgcXVvdGEgd29ybGQuIElmIHRoZSBxdW90YWNoZWNrIGZhaWxzLCBkaXNhYmxlIHF1b3Rhcy4KKyAqLworaW50Cit4ZnNfcW1fcXVvdGFjaGVjaygKKwl4ZnNfbW91bnRfdAkqbXApCit7CisJaW50CQlkb25lLCBjb3VudCwgZXJyb3I7CisJeGZzX2lub190CWxhc3Rpbm87CisJc2l6ZV90CQlzdHJ1Y3RzejsKKwl4ZnNfaW5vZGVfdAkqdWlwLCAqZ2lwOworCXVpbnQJCWZsYWdzOworCisJY291bnQgPSBJTlRfTUFYOworCXN0cnVjdHN6ID0gMTsKKwlsYXN0aW5vID0gMDsKKwlmbGFncyA9IDA7CisKKwlBU1NFUlQoWEZTX1FJX1VRSVAobXApIHx8IFhGU19RSV9HUUlQKG1wKSk7CisJQVNTRVJUKFhGU19JU19RVU9UQV9SVU5OSU5HKG1wKSk7CisKKwkvKgorCSAqIFRoZXJlIHNob3VsZCBiZSBubyBjYWNoZWQgZHF1b3RzLiBUaGUgKHNpbXBsaXN0aWMpIHF1b3RhY2hlY2sKKwkgKiBhbGdvcml0aG0gZG9lc24ndCBsaWtlIHRoYXQuCisJICovCisJQVNTRVJUKFhGU19RSV9NUExORFFVT1RTKG1wKSA9PSAwKTsKKworCWNtbl9lcnIoQ0VfTk9URSwgIlhGUyBxdW90YWNoZWNrICVzOiBQbGVhc2Ugd2FpdC4iLCBtcC0+bV9mc25hbWUpOworCisJLyoKKwkgKiBGaXJzdCB3ZSBnbyB0aHJ1IGFsbCB0aGUgZHF1b3RzIG9uIGRpc2ssIFVTUiBhbmQgR1JQLCBhbmQgcmVzZXQKKwkgKiB0aGVpciBjb3VudGVycyB0byB6ZXJvLiBXZSBuZWVkIGEgY2xlYW4gc2xhdGUuCisJICogV2UgZG9uJ3QgbG9nIG91ciBjaGFuZ2VzIHRpbGwgbGF0ZXIuCisJICovCisJaWYgKCh1aXAgPSBYRlNfUUlfVVFJUChtcCkpKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFpdGVyYXRlKG1wLCB1aXAsIFhGU19RTU9QVF9VUVVPVEEpKSkKKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQlmbGFncyB8PSBYRlNfVVFVT1RBX0NIS0Q7CisJfQorCisJaWYgKChnaXAgPSBYRlNfUUlfR1FJUChtcCkpKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFpdGVyYXRlKG1wLCBnaXAsIFhGU19RTU9QVF9HUVVPVEEpKSkKKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQlmbGFncyB8PSBYRlNfR1FVT1RBX0NIS0Q7CisJfQorCisJZG8geworCQkvKgorCQkgKiBJdGVyYXRlIHRocnUgYWxsIHRoZSBpbm9kZXMgaW4gdGhlIGZpbGUgc3lzdGVtLAorCQkgKiBhZGp1c3RpbmcgdGhlIGNvcnJlc3BvbmRpbmcgZHF1b3QgY291bnRlcnMgaW4gY29yZS4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfYnVsa3N0YXQobXAsICZsYXN0aW5vLCAmY291bnQsCisJCQkJICAgICB4ZnNfcW1fZHF1c2FnZV9hZGp1c3QsIE5VTEwsCisJCQkJICAgICBzdHJ1Y3RzeiwgTlVMTCwKKwkJCQkgICAgIEJVTEtTVEFUX0ZHX0lHRVR8QlVMS1NUQVRfRkdfVkZTTE9DS0VELAorCQkJCSAgICAgJmRvbmUpKSkKKwkJCWJyZWFrOworCisJfSB3aGlsZSAoISBkb25lKTsKKworCS8qCisJICogV2UgY2FuIGdldCB0aGlzIGVycm9yIGlmIHdlIGNvdWxkbid0IGRvIGEgZHF1b3QgYWxsb2NhdGlvbiBpbnNpZGUKKwkgKiB4ZnNfcW1fZHF1c2FnZV9hZGp1c3QgKHZpYSBidWxrc3RhdCkuIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlCisJICogZGlydHkgZHF1b3RzIHRoYXQgbWlnaHQgYmUgY2FjaGVkLCB3ZSBqdXN0IHdhbnQgdG8gZ2V0IHJpZCBvZiB0aGVtCisJICogYW5kIHR1cm4gcXVvdGFvZmYuIFRoZSBkcXVvdHMgd29uJ3QgYmUgYXR0YWNoZWQgdG8gYW55IG9mIHRoZSBpbm9kZXMKKwkgKiBhdCB0aGlzIHBvaW50IChiZWNhdXNlIHdlIGludGVudGlvbmFsbHkgZGlkbid0IGluIGRxZ2V0X25vYXR0YWNoKS4KKwkgKi8KKwlpZiAoZXJyb3IpIHsKKwkJeGZzX3FtX2RxcHVyZ2VfYWxsKG1wLAorCQkJCSAgIFhGU19RTU9QVF9VUVVPVEF8WEZTX1FNT1BUX0dRVU9UQXwKKwkJCQkgICBYRlNfUU1PUFRfUVVPVEFPRkYpOworCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisJLyoKKwkgKiBXZSd2ZSBtYWRlIGFsbCB0aGUgY2hhbmdlcyB0aGF0IHdlIG5lZWQgdG8gbWFrZSBpbmNvcmUuCisJICogTm93IGZsdXNoX3RoZW0gZG93biB0byBkaXNrIGJ1ZmZlcnMuCisJICovCisJeGZzX3FtX2RxZmx1c2hfYWxsKG1wLCBYRlNfUU1PUFRfREVMV1JJKTsKKworCS8qCisJICogV2UgZGlkbid0IGxvZyBhbnl0aGluZywgYmVjYXVzZSBpZiB3ZSBjcmFzaGVkLCB3ZSdsbCBoYXZlIHRvCisJICogc3RhcnQgdGhlIHF1b3RhY2hlY2sgZnJvbSBzY3JhdGNoIGFueXdheS4gSG93ZXZlciwgd2UgbXVzdCBtYWtlCisJICogc3VyZSB0aGF0IG91ciBkcXVvdCBjaGFuZ2VzIGFyZSBzZWN1cmUgYmVmb3JlIHdlIHB1dCB0aGUKKwkgKiBxdW90YWNoZWNrJ2Qgc3RhbXAgb24gdGhlIHN1cGVyYmxvY2suIFNvLCBoZXJlIHdlIGRvIGEgc3luY2hyb25vdXMKKwkgKiBmbHVzaC4KKwkgKi8KKwlYRlNfYmZsdXNoKG1wLT5tX2RkZXZfdGFyZ3ApOworCisJLyoKKwkgKiBJZiBvbmUgdHlwZSBvZiBxdW90YXMgaXMgb2ZmLCB0aGVuIGl0IHdpbGwgbG9zZSBpdHMKKwkgKiBxdW90YWNoZWNrZWQgc3RhdHVzLCBzaW5jZSB3ZSB3b24ndCBiZSBkb2luZyBhY2NvdW50aW5nIGZvcgorCSAqIHRoYXQgdHlwZSBhbnltb3JlLgorCSAqLworCW1wLT5tX3FmbGFncyAmPSB+KFhGU19HUVVPVEFfQ0hLRCB8IFhGU19VUVVPVEFfQ0hLRCk7CisJbXAtPm1fcWZsYWdzIHw9IGZsYWdzOworCisJWFFNX0xJU1RfUFJJTlQoJihYRlNfUUlfTVBMX0xJU1QobXApKSwgTVBMX05FWFQsICIrKysrIE1wIGxpc3QgKysrIik7CisKKyBlcnJvcl9yZXR1cm46CisJaWYgKGVycm9yKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwgIlhGUyBxdW90YWNoZWNrICVzOiBVbnN1Y2Nlc3NmdWwgKEVycm9yICVkKTogIgorCQkJIkRpc2FibGluZyBxdW90YXMuIiwKKwkJCW1wLT5tX2ZzbmFtZSwgZXJyb3IpOworCQkvKgorCQkgKiBXZSBtdXN0IHR1cm4gb2ZmIHF1b3Rhcy4KKwkJICovCisJCUFTU0VSVChtcC0+bV9xdW90YWluZm8gIT0gTlVMTCk7CisJCUFTU0VSVCh4ZnNfR3FtICE9IE5VTEwpOworCQl4ZnNfcW1fZGVzdHJveV9xdW90YWluZm8obXApOworCQl4ZnNfbW91bnRfcmVzZXRfc2JxZmxhZ3MobXApOworCX0gZWxzZSB7CisJCWNtbl9lcnIoQ0VfTk9URSwgIlhGUyBxdW90YWNoZWNrICVzOiBEb25lLiIsIG1wLT5tX2ZzbmFtZSk7CisJfQorCXJldHVybiAoZXJyb3IpOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHN1cGVyYmxvY2sgaGFzIGJlZW4gcmVhZCBpbiBhbmQgd2UncmUgcmVhZHkgdG8KKyAqIGlnZXQgdGhlIHF1b3RhIGlub2Rlcy4KKyAqLworU1RBVElDIGludAoreGZzX3FtX2luaXRfcXVvdGFpbm9zKAorCXhmc19tb3VudF90CSptcCkKK3sKKwl4ZnNfaW5vZGVfdAkqdWlwLCAqZ2lwOworCWludAkJZXJyb3I7CisJX19pbnQ2NF90CXNiZmxhZ3M7CisJdWludAkJZmxhZ3M7CisKKwlBU1NFUlQobXAtPm1fcXVvdGFpbmZvKTsKKwl1aXAgPSBnaXAgPSBOVUxMOworCXNiZmxhZ3MgPSAwOworCWZsYWdzID0gMDsKKworCS8qCisJICogR2V0IHRoZSB1cXVvdGEgYW5kIGdxdW90YSBpbm9kZXMKKwkgKi8KKwlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTUVVPVEEoJm1wLT5tX3NiKSkgeworCQlpZiAoWEZTX0lTX1VRVU9UQV9PTihtcCkgJiYKKwkJICAgIG1wLT5tX3NiLnNiX3VxdW90aW5vICE9IE5VTExGU0lOTykgeworCQkJQVNTRVJUKG1wLT5tX3NiLnNiX3VxdW90aW5vID4gMCk7CisJCQlpZiAoKGVycm9yID0geGZzX2lnZXQobXAsIE5VTEwsIG1wLT5tX3NiLnNiX3VxdW90aW5vLAorCQkJCQkgICAgIDAsIDAsICZ1aXAsIDApKSkKKwkJCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKKwkJfQorCQlpZiAoWEZTX0lTX0dRVU9UQV9PTihtcCkgJiYKKwkJICAgIG1wLT5tX3NiLnNiX2dxdW90aW5vICE9IE5VTExGU0lOTykgeworCQkJQVNTRVJUKG1wLT5tX3NiLnNiX2dxdW90aW5vID4gMCk7CisJCQlpZiAoKGVycm9yID0geGZzX2lnZXQobXAsIE5VTEwsIG1wLT5tX3NiLnNiX2dxdW90aW5vLAorCQkJCQkgICAgIDAsIDAsICZnaXAsIDApKSkgeworCQkJCWlmICh1aXApCisJCQkJCVZOX1JFTEUoWEZTX0lUT1YodWlwKSk7CisJCQkJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlmbGFncyB8PSBYRlNfUU1PUFRfU0JWRVJTSU9OOworCQlzYmZsYWdzIHw9IChYRlNfU0JfVkVSU0lPTk5VTSB8IFhGU19TQl9VUVVPVElOTyB8CisJCQkgICAgWEZTX1NCX0dRVU9USU5PIHwgWEZTX1NCX1FGTEFHUyk7CisJfQorCisJLyoKKwkgKiBDcmVhdGUgdGhlIHR3byBpbm9kZXMsIGlmIHRoZXkgZG9uJ3QgZXhpc3QgYWxyZWFkeS4gVGhlIGNoYW5nZXMKKwkgKiBtYWRlIGFib3ZlIHdpbGwgZ2V0IGFkZGVkIHRvIGEgdHJhbnNhY3Rpb24gYW5kIGxvZ2dlZCBpbiBvbmUgb2YKKwkgKiB0aGUgcWlub19hbGxvYyBjYWxscyBiZWxvdy4gIElmIHRoZSBkZXZpY2UgaXMgcmVhZG9ubHksCisJICogdGVtcG9yYXJpbHkgc3dpdGNoIHRvIHJlYWQtd3JpdGUgdG8gZG8gdGhpcy4KKwkgKi8KKwlpZiAoWEZTX0lTX1VRVU9UQV9PTihtcCkgJiYgdWlwID09IE5VTEwpIHsKKwkJaWYgKChlcnJvciA9IHhmc19xbV9xaW5vX2FsbG9jKG1wLCAmdWlwLAorCQkJCQkgICAgICBzYmZsYWdzIHwgWEZTX1NCX1VRVU9USU5PLAorCQkJCQkgICAgICBmbGFncyB8IFhGU19RTU9QVF9VUVVPVEEpKSkKKwkJCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworCisJCWZsYWdzICY9IH5YRlNfUU1PUFRfU0JWRVJTSU9OOworCX0KKwlpZiAoWEZTX0lTX0dRVU9UQV9PTihtcCkgJiYgZ2lwID09IE5VTEwpIHsKKwkJaWYgKChlcnJvciA9IHhmc19xbV9xaW5vX2FsbG9jKG1wLCAmZ2lwLAorCQkJCQkgICAgICBzYmZsYWdzIHwgWEZTX1NCX0dRVU9USU5PLAorCQkJCQkgICAgICBmbGFncyB8IFhGU19RTU9QVF9HUVVPVEEpKSkgeworCQkJaWYgKHVpcCkKKwkJCQlWTl9SRUxFKFhGU19JVE9WKHVpcCkpOworCisJCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKKwkJfQorCX0KKworCVhGU19RSV9VUUlQKG1wKSA9IHVpcDsKKwlYRlNfUUlfR1FJUChtcCkgPSBnaXA7CisKKwlyZXR1cm4gKDApOworfQorCisKKy8qCisgKiBUcmF2ZXJzZSB0aGUgZnJlZWxpc3Qgb2YgZHF1b3RzIGFuZCBhdHRlbXB0IHRvIHJlY2xhaW0gYSBtYXhpbXVtIG9mCisgKiAnaG93bWFueScgZHF1b3RzLiBUaGlzIG9wZXJhdGlvbiByYWNlcyB3aXRoIGRxbG9va3VwKCksIGFuZCBhdHRlbXB0cyB0bworICogZmF2b3IgdGhlIGxvb2t1cCBmdW5jdGlvbiAuLi4KKyAqIFhYWHN1cCBtZXJnZSB0aGlzIHdpdGggcW1fcmVjbGFpbV9vbmUoKS4KKyAqLworU1RBVElDIGludAoreGZzX3FtX3NoYWtlX2ZyZWVsaXN0KAorCWludCBob3dtYW55KQoreworCWludAkJbnJlY2xhaW1lZDsKKwl4ZnNfZHFoYXNoX3QJKmhhc2g7CisJeGZzX2RxdW90X3QJKmRxcCwgKm5leHRkcXA7CisJaW50CQlyZXN0YXJ0czsKKwlpbnQJCW5mbHVzaGVzOworCisJaWYgKGhvd21hbnkgPD0gMCkKKwkJcmV0dXJuICgwKTsKKworCW5yZWNsYWltZWQgPSAwOworCXJlc3RhcnRzID0gMDsKKwluZmx1c2hlcyA9IDA7CisKKyNpZmRlZiBRVU9UQURFQlVHCisJY21uX2VycihDRV9ERUJVRywgIlNoYWtlIGZyZWUgMHgleCIsIGhvd21hbnkpOworI2VuZGlmCisJLyogbG9jayBvcmRlciBpcyA6IGhhc2hjaGFpbmxvY2ssIGZyZWVsaXN0bG9jaywgbXBsaXN0bG9jayAqLworIHRyeWFnYWluOgorCXhmc19xbV9mcmVlbGlzdF9sb2NrKHhmc19HcW0pOworCisJZm9yIChkcXAgPSB4ZnNfR3FtLT5xbV9kcWZyZWVsaXN0LnFoX25leHQ7CisJICAgICAoKGRxcCAhPSAoeGZzX2RxdW90X3QgKikgJnhmc19HcW0tPnFtX2RxZnJlZWxpc3QpICYmCisJICAgICAgbnJlY2xhaW1lZCA8IGhvd21hbnkpOyApIHsKKwkJeGZzX2RxbG9jayhkcXApOworCisJCS8qCisJCSAqIFdlIGFyZSByYWNpbmcgd2l0aCBkcWxvb2t1cCBoZXJlLiBOYXR1cmFsbHkgd2UgZG9uJ3QKKwkJICogd2FudCB0byByZWNsYWltIGEgZHF1b3QgdGhhdCBsb29rdXAgd2FudHMuCisJCSAqLworCQlpZiAoZHFwLT5kcV9mbGFncyAmIFhGU19EUV9XQU5UKSB7CisJCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJCXhmc19xbV9mcmVlbGlzdF91bmxvY2soeGZzX0dxbSk7CisJCQlpZiAoKytyZXN0YXJ0cyA+PSBYRlNfUU1fUkVDTEFJTV9NQVhfUkVTVEFSVFMpCisJCQkJcmV0dXJuIChucmVjbGFpbWVkKTsKKwkJCVhRTV9TVEFUU19JTkMoeHFtc3RhdHMueHNfcW1fZHF3YW50cyk7CisJCQlnb3RvIHRyeWFnYWluOworCQl9CisKKwkJLyoKKwkJICogSWYgdGhlIGRxdW90IGlzIGluYWN0aXZlLCB3ZSBhcmUgYXNzdXJlZCB0aGF0IGl0IGlzCisJCSAqIG5vdCBvbiB0aGUgbXBsaXN0IG9yIHRoZSBoYXNobGlzdCwgYW5kIHRoYXQgbWFrZXMgb3VyCisJCSAqIGxpZmUgZWFzaWVyLgorCQkgKi8KKwkJaWYgKGRxcC0+ZHFfZmxhZ3MgJiBYRlNfRFFfSU5BQ1RJVkUpIHsKKwkJCUFTU0VSVChkcXAtPnFfbW91bnQgPT0gTlVMTCk7CisJCQlBU1NFUlQoISBYRlNfRFFfSVNfRElSVFkoZHFwKSk7CisJCQlBU1NFUlQoZHFwLT5ITF9QUkVWUCA9PSBOVUxMKTsKKwkJCUFTU0VSVChkcXAtPk1QTF9QUkVWUCA9PSBOVUxMKTsKKwkJCVhRTV9TVEFUU19JTkMoeHFtc3RhdHMueHNfcW1fZHFpbmFjdF9yZWNsYWltcyk7CisJCQluZXh0ZHFwID0gZHFwLT5kcV9mbG5leHQ7CisJCQlnb3RvIG9mZl9mcmVlbGlzdDsKKwkJfQorCisJCUFTU0VSVChkcXAtPk1QTF9QUkVWUCk7CisJCS8qCisJCSAqIFRyeSB0byBncmFiIHRoZSBmbHVzaCBsb2NrLiBJZiB0aGlzIGRxdW90IGlzIGluIHRoZSBwcm9jZXNzIG9mCisJCSAqIGdldHRpbmcgZmx1c2hlZCB0byBkaXNrLCB3ZSBkb24ndCB3YW50IHRvIHJlY2xhaW0gaXQuCisJCSAqLworCQlpZiAoISB4ZnNfcW1fZHFmbG9ja19ub3dhaXQoZHFwKSkgeworCQkJeGZzX2RxdW5sb2NrKGRxcCk7CisJCQlkcXAgPSBkcXAtPmRxX2ZsbmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogV2UgaGF2ZSB0aGUgZmx1c2ggbG9jayBzbyB3ZSBrbm93IHRoYXQgdGhpcyBpcyBub3QgaW4gdGhlCisJCSAqIHByb2Nlc3Mgb2YgYmVpbmcgZmx1c2hlZC4gU28sIGlmIHRoaXMgaXMgZGlydHksIGZsdXNoIGl0CisJCSAqIERFTFdSSSBzbyB0aGF0IHdlIGRvbid0IGdldCBhIGZyZWVsaXN0IGluZmVzdGVkIHdpdGgKKwkJICogZGlydHkgZHF1b3RzLgorCQkgKi8KKwkJaWYgKFhGU19EUV9JU19ESVJUWShkcXApKSB7CisJCQl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUVNIQUtFOiBEUURJUlRZIik7CisJCQkvKgorCQkJICogV2UgZmx1c2ggaXQgZGVsYXllZCB3cml0ZSwgc28gZG9uJ3QgYm90aGVyCisJCQkgKiByZWxlYXNpbmcgdGhlIG1wbG9jay4KKwkJCSAqLworCQkJKHZvaWQpIHhmc19xbV9kcWZsdXNoKGRxcCwgWEZTX1FNT1BUX0RFTFdSSSk7CisJCQl4ZnNfZHF1bmxvY2soZHFwKTsgLyogZHFmbHVzaCB1bmxvY2tzIGRxZmxvY2sgKi8KKwkJCWRxcCA9IGRxcC0+ZHFfZmxuZXh0OworCQkJY29udGludWU7CisJCX0KKwkJLyoKKwkJICogV2UncmUgdHJ5aW5nIHRvIGdldCB0aGUgaGFzaGxvY2sgb3V0IG9mIG9yZGVyLiBUaGlzIHJhY2VzCisJCSAqIHdpdGggZHFsb29rdXA7IHNvLCB3ZSBnaXZldXAgYW5kIGdvdG8gdGhlIG5leHQgZHF1b3QgaWYKKwkJICogd2UgY291bGRuJ3QgZ2V0IHRoZSBoYXNobG9jay4gVGhpcyB3YXksIHdlIHdvbid0IHN0YXJ2ZQorCQkgKiBhIGRxbG9va3VwIHByb2Nlc3MgdGhhdCBob2xkcyB0aGUgaGFzaGxvY2sgdGhhdCBpcworCQkgKiB3YWl0aW5nIGZvciB0aGUgZnJlZWxpc3QgbG9jay4KKwkJICovCisJCWlmICghIHhmc19xbV9kcWhhc2hsb2NrX25vd2FpdChkcXApKSB7CisJCQl4ZnNfZHFmdW5sb2NrKGRxcCk7CisJCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJCWRxcCA9IGRxcC0+ZHFfZmxuZXh0OworCQkJY29udGludWU7CisJCX0KKwkJLyoKKwkJICogVGhpcyByYWNlcyB3aXRoIGRxdW90IGFsbG9jYXRpb24gY29kZSBhcyB3ZWxsIGFzIGRxZmx1c2hfYWxsCisJCSAqIGFuZCByZWNsYWltIGNvZGUuIFNvLCBpZiB3ZSBmYWlsZWQgdG8gZ3JhYiB0aGUgbXBsaXN0IGxvY2ssCisJCSAqIGdpdmV1cCBldmVyeXRoaW5nIGFuZCBzdGFydCBvdmVyLgorCQkgKi8KKwkJaGFzaCA9IGRxcC0+cV9oYXNoOworCQlBU1NFUlQoaGFzaCk7CisJCWlmICghIHhmc19xbV9tcGxpc3Rfbm93YWl0KGRxcC0+cV9tb3VudCkpIHsKKwkJCS8qIFhYWCBwdXQgYSBzZW50aW5lbCBzbyB0aGF0IHdlIGNhbiBjb21lIGJhY2sgaGVyZSAqLworCQkJeGZzX2RxZnVubG9jayhkcXApOworCQkJeGZzX2RxdW5sb2NrKGRxcCk7CisJCQlYRlNfRFFfSEFTSF9VTkxPQ0soaGFzaCk7CisJCQl4ZnNfcW1fZnJlZWxpc3RfdW5sb2NrKHhmc19HcW0pOworCQkJaWYgKCsrcmVzdGFydHMgPj0gWEZTX1FNX1JFQ0xBSU1fTUFYX1JFU1RBUlRTKQorCQkJCXJldHVybiAobnJlY2xhaW1lZCk7CisJCQlnb3RvIHRyeWFnYWluOworCQl9CisJCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRU0hBS0U6IFVOTElOS0lORyIpOworI2lmZGVmIFFVT1RBREVCVUcKKwkJY21uX2VycihDRV9ERUJVRywgIlNoYWtlIDB4JXAsIElEIDB4JXhcbiIsCisJCQlkcXAsIElOVF9HRVQoZHFwLT5xX2NvcmUuZF9pZCwgQVJDSF9DT05WRVJUKSk7CisjZW5kaWYKKwkJQVNTRVJUKGRxcC0+cV9ucmVmcyA9PSAwKTsKKwkJbmV4dGRxcCA9IGRxcC0+ZHFfZmxuZXh0OworCQlYUU1fTVBMSVNUX1JFTU9WRSgmKFhGU19RSV9NUExfTElTVChkcXAtPnFfbW91bnQpKSwgZHFwKTsKKwkJWFFNX0hBU0hMSVNUX1JFTU9WRShoYXNoLCBkcXApOworCQl4ZnNfZHFmdW5sb2NrKGRxcCk7CisJCXhmc19xbV9tcGxpc3RfdW5sb2NrKGRxcC0+cV9tb3VudCk7CisJCVhGU19EUV9IQVNIX1VOTE9DSyhoYXNoKTsKKworIG9mZl9mcmVlbGlzdDoKKwkJWFFNX0ZSRUVMSVNUX1JFTU9WRShkcXApOworCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJbnJlY2xhaW1lZCsrOworCQlYUU1fU1RBVFNfSU5DKHhxbXN0YXRzLnhzX3FtX2Rxc2hha2VfcmVjbGFpbXMpOworCQl4ZnNfcW1fZHFkZXN0cm95KGRxcCk7CisJCWRxcCA9IG5leHRkcXA7CisJfQorCXhmc19xbV9mcmVlbGlzdF91bmxvY2soeGZzX0dxbSk7CisJcmV0dXJuIChucmVjbGFpbWVkKTsKK30KKworCisvKgorICogVGhlIGttZW1fc2hha2UgaW50ZXJmYWNlIGlzIGludm9rZWQgd2hlbiBtZW1vcnkgaXMgcnVubmluZyBsb3cuCisgKi8KKy8qIEFSR1NVU0VEICovCitTVEFUSUMgaW50Cit4ZnNfcW1fc2hha2UoaW50IG5yX3RvX3NjYW4sIHVuc2lnbmVkIGludCBnZnBfbWFzaykKK3sKKwlpbnQJbmRxdXNlZCwgbmZyZWUsIG47CisKKwlpZiAoIWttZW1fc2hha2VfYWxsb3coZ2ZwX21hc2spKQorCQlyZXR1cm4gKDApOworCWlmICgheGZzX0dxbSkKKwkJcmV0dXJuICgwKTsKKworCW5mcmVlID0geGZzX0dxbS0+cW1fZHFmcmVlbGlzdC5xaF9uZWxlbXM7IC8qIGZyZWUgZHF1b3RzICovCisJLyogaW5jb3JlIGRxdW90cyBpbiBhbGwgZi9zJ3MgKi8KKwluZHF1c2VkID0gYXRvbWljX3JlYWQoJnhmc19HcW0tPnFtX3RvdGFsZHF1b3RzKSAtIG5mcmVlOworCisJQVNTRVJUKG5kcXVzZWQgPj0gMCk7CisKKwlpZiAobmZyZWUgPD0gbmRxdXNlZCAmJiBuZnJlZSA8IG5kcXVvdCkKKwkJcmV0dXJuICgwKTsKKworCW5kcXVzZWQgKj0geGZzX0dxbS0+cW1fZHFmcmVlX3JhdGlvOwkvKiB0YXJnZXQgIyBvZiBmcmVlIGRxdW90cyAqLworCW4gPSBuZnJlZSAtIG5kcXVzZWQgLSBuZHF1b3Q7CQkvKiAjIG92ZXIgdGFyZ2V0ICovCisKKwlyZXR1cm4geGZzX3FtX3NoYWtlX2ZyZWVsaXN0KE1BWChuZnJlZSwgbikpOworfQorCisKKy8qCisgKiBKdXN0IHBvcCB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBkcXVvdCBvZmYgdGhlIGZyZWVsaXN0IGFuZAorICogcmVjeWNsZSBpdC4gVGhlIHJldHVybmVkIGRxdW90IGlzIGxvY2tlZC4KKyAqLworU1RBVElDIHhmc19kcXVvdF90ICoKK3hmc19xbV9kcXJlY2xhaW1fb25lKHZvaWQpCit7CisJeGZzX2RxdW90X3QJKmRxcG91dDsKKwl4ZnNfZHF1b3RfdAkqZHFwOworCWludAkJcmVzdGFydHM7CisJaW50CQluZmx1c2hlczsKKworCXJlc3RhcnRzID0gMDsKKwlkcXBvdXQgPSBOVUxMOworCW5mbHVzaGVzID0gMDsKKworCS8qIGxvY2tvcmRlcjogaGFzaGNoYWlubG9jaywgZnJlZWxpc3Rsb2NrLCBtcGxpc3Rsb2NrLCBkcWxvY2ssIGRxZmxvY2sgKi8KKyBzdGFydGFnYWluOgorCXhmc19xbV9mcmVlbGlzdF9sb2NrKHhmc19HcW0pOworCisJRk9SRUFDSF9EUVVPVF9JTl9GUkVFTElTVChkcXAsICYoeGZzX0dxbS0+cW1fZHFmcmVlbGlzdCkpIHsKKwkJeGZzX2RxbG9jayhkcXApOworCisJCS8qCisJCSAqIFdlIGFyZSByYWNpbmcgd2l0aCBkcWxvb2t1cCBoZXJlLiBOYXR1cmFsbHkgd2UgZG9uJ3QKKwkJICogd2FudCB0byByZWNsYWltIGEgZHF1b3QgdGhhdCBsb29rdXAgd2FudHMuIFdlIHJlbGVhc2UgdGhlCisJCSAqIGZyZWVsaXN0IGxvY2sgYW5kIHN0YXJ0IG92ZXIsIHNvIHRoYXQgbG9va3VwIHdpbGwgZ3JhYgorCQkgKiBib3RoIHRoZSBkcXVvdCBhbmQgdGhlIGZyZWVsaXN0bG9jay4KKwkJICovCisJCWlmIChkcXAtPmRxX2ZsYWdzICYgWEZTX0RRX1dBTlQpIHsKKwkJCUFTU0VSVCghIChkcXAtPmRxX2ZsYWdzICYgWEZTX0RRX0lOQUNUSVZFKSk7CisJCQl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUVJFQ0xBSU06IERRV0FOVCIpOworCQkJeGZzX2RxdW5sb2NrKGRxcCk7CisJCQl4ZnNfcW1fZnJlZWxpc3RfdW5sb2NrKHhmc19HcW0pOworCQkJaWYgKCsrcmVzdGFydHMgPj0gWEZTX1FNX1JFQ0xBSU1fTUFYX1JFU1RBUlRTKQorCQkJCXJldHVybiAoTlVMTCk7CisJCQlYUU1fU1RBVFNfSU5DKHhxbXN0YXRzLnhzX3FtX2Rxd2FudHMpOworCQkJZ290byBzdGFydGFnYWluOworCQl9CisKKwkJLyoKKwkJICogSWYgdGhlIGRxdW90IGlzIGluYWN0aXZlLCB3ZSBhcmUgYXNzdXJlZCB0aGF0IGl0IGlzCisJCSAqIG5vdCBvbiB0aGUgbXBsaXN0IG9yIHRoZSBoYXNobGlzdCwgYW5kIHRoYXQgbWFrZXMgb3VyCisJCSAqIGxpZmUgZWFzaWVyLgorCQkgKi8KKwkJaWYgKGRxcC0+ZHFfZmxhZ3MgJiBYRlNfRFFfSU5BQ1RJVkUpIHsKKwkJCUFTU0VSVChkcXAtPnFfbW91bnQgPT0gTlVMTCk7CisJCQlBU1NFUlQoISBYRlNfRFFfSVNfRElSVFkoZHFwKSk7CisJCQlBU1NFUlQoZHFwLT5ITF9QUkVWUCA9PSBOVUxMKTsKKwkJCUFTU0VSVChkcXAtPk1QTF9QUkVWUCA9PSBOVUxMKTsKKwkJCVhRTV9GUkVFTElTVF9SRU1PVkUoZHFwKTsKKwkJCXhmc19kcXVubG9jayhkcXApOworCQkJZHFwb3V0ID0gZHFwOworCQkJWFFNX1NUQVRTX0lOQyh4cW1zdGF0cy54c19xbV9kcWluYWN0X3JlY2xhaW1zKTsKKwkJCWJyZWFrOworCQl9CisKKwkJQVNTRVJUKGRxcC0+cV9oYXNoKTsKKwkJQVNTRVJUKGRxcC0+TVBMX1BSRVZQKTsKKworCQkvKgorCQkgKiBUcnkgdG8gZ3JhYiB0aGUgZmx1c2ggbG9jay4gSWYgdGhpcyBkcXVvdCBpcyBpbiB0aGUgcHJvY2VzcyBvZgorCQkgKiBnZXR0aW5nIGZsdXNoZWQgdG8gZGlzaywgd2UgZG9uJ3Qgd2FudCB0byByZWNsYWltIGl0LgorCQkgKi8KKwkJaWYgKCEgeGZzX3FtX2RxZmxvY2tfbm93YWl0KGRxcCkpIHsKKwkJCXhmc19kcXVubG9jayhkcXApOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBXZSBoYXZlIHRoZSBmbHVzaCBsb2NrIHNvIHdlIGtub3cgdGhhdCB0aGlzIGlzIG5vdCBpbiB0aGUKKwkJICogcHJvY2VzcyBvZiBiZWluZyBmbHVzaGVkLiBTbywgaWYgdGhpcyBpcyBkaXJ0eSwgZmx1c2ggaXQKKwkJICogREVMV1JJIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGEgZnJlZWxpc3QgaW5mZXN0ZWQgd2l0aAorCQkgKiBkaXJ0eSBkcXVvdHMuCisJCSAqLworCQlpZiAoWEZTX0RRX0lTX0RJUlRZKGRxcCkpIHsKKwkJCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRUkVDTEFJTTogRFFESVJUWSIpOworCQkJLyoKKwkJCSAqIFdlIGZsdXNoIGl0IGRlbGF5ZWQgd3JpdGUsIHNvIGRvbid0IGJvdGhlcgorCQkJICogcmVsZWFzaW5nIHRoZSBmcmVlbGlzdCBsb2NrLgorCQkJICovCisJCQkodm9pZCkgeGZzX3FtX2RxZmx1c2goZHFwLCBYRlNfUU1PUFRfREVMV1JJKTsKKwkJCXhmc19kcXVubG9jayhkcXApOyAvKiBkcWZsdXNoIHVubG9ja3MgZHFmbG9jayAqLworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoISB4ZnNfcW1fbXBsaXN0X25vd2FpdChkcXAtPnFfbW91bnQpKSB7CisJCQl4ZnNfZHFmdW5sb2NrKGRxcCk7CisJCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCEgeGZzX3FtX2RxaGFzaGxvY2tfbm93YWl0KGRxcCkpCisJCQlnb3RvIG1wbGlzdHVubG9jazsKKworCQlBU1NFUlQoZHFwLT5xX25yZWZzID09IDApOworCQl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUVJFQ0xBSU06IFVOTElOS0lORyIpOworCQlYUU1fTVBMSVNUX1JFTU9WRSgmKFhGU19RSV9NUExfTElTVChkcXAtPnFfbW91bnQpKSwgZHFwKTsKKwkJWFFNX0hBU0hMSVNUX1JFTU9WRShkcXAtPnFfaGFzaCwgZHFwKTsKKwkJWFFNX0ZSRUVMSVNUX1JFTU9WRShkcXApOworCQlkcXBvdXQgPSBkcXA7CisJCVhGU19EUV9IQVNIX1VOTE9DSyhkcXAtPnFfaGFzaCk7CisgbXBsaXN0dW5sb2NrOgorCQl4ZnNfcW1fbXBsaXN0X3VubG9jayhkcXAtPnFfbW91bnQpOworCQl4ZnNfZHFmdW5sb2NrKGRxcCk7CisJCXhmc19kcXVubG9jayhkcXApOworCQlpZiAoZHFwb3V0KQorCQkJYnJlYWs7CisJfQorCisJeGZzX3FtX2ZyZWVsaXN0X3VubG9jayh4ZnNfR3FtKTsKKwlyZXR1cm4gKGRxcG91dCk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogUmV0dXJuIGEgbmV3IGluY29yZSBkcXVvdC4gRGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YKKyAqIGRxdW90cyBpbiB0aGUgc3lzdGVtLCB3ZSBlaXRoZXIgYWxsb2NhdGUgYSBuZXcgb25lIG9uIHRoZSBrZXJuZWwgaGVhcCwKKyAqIG9yIHJlY2xhaW0gYSBmcmVlIG9uZS4KKyAqIFJldHVybiB2YWx1ZSBpcyBCX1RSVUUgaWYgd2UgYWxsb2NhdGVkIGEgbmV3IGRxdW90LCBCX0ZBTFNFIGlmIHdlIG1hbmFnZWQKKyAqIHRvIHJlY2xhaW0gYW4gZXhpc3Rpbmcgb25lIGZyb20gdGhlIGZyZWVsaXN0LgorICovCitib29sZWFuX3QKK3hmc19xbV9kcWFsbG9jX2luY29yZSgKKwl4ZnNfZHF1b3RfdCAqKk9fZHFwcCkKK3sKKwl4ZnNfZHF1b3RfdAkqZHFwOworCisJLyoKKwkgKiBDaGVjayBhZ2FpbnN0IGhpZ2ggd2F0ZXIgbWFyayB0byBzZWUgaWYgd2Ugd2FudCB0byBwb3AKKwkgKiBhIG5pbmNvbXBvb3AgZHF1b3Qgb2ZmIHRoZSBmcmVlbGlzdC4KKwkgKi8KKwlpZiAoYXRvbWljX3JlYWQoJnhmc19HcW0tPnFtX3RvdGFsZHF1b3RzKSA+PSBuZHF1b3QpIHsKKwkJLyoKKwkJICogVHJ5IHRvIHJlY3ljbGUgYSBkcXVvdCBmcm9tIHRoZSBmcmVlbGlzdC4KKwkJICovCisJCWlmICgoZHFwID0geGZzX3FtX2RxcmVjbGFpbV9vbmUoKSkpIHsKKwkJCVhRTV9TVEFUU19JTkMoeHFtc3RhdHMueHNfcW1fZHFyZWNsYWltcyk7CisJCQkvKgorCQkJICogSnVzdCB6ZXJvIHRoZSBjb3JlIGhlcmUuIFRoZSByZXN0IHdpbGwgZ2V0CisJCQkgKiByZWluaXRpYWxpemVkIGJ5IGNhbGxlci4gWFhYIHdlIHNob3VsZG4ndCBldmVuCisJCQkgKiBkbyB0aGlzIHplcm8gLi4uCisJCQkgKi8KKwkJCW1lbXNldCgmZHFwLT5xX2NvcmUsIDAsIHNpemVvZihkcXAtPnFfY29yZSkpOworCQkJKk9fZHFwcCA9IGRxcDsKKwkJCXJldHVybiAoQl9GQUxTRSk7CisJCX0KKwkJWFFNX1NUQVRTX0lOQyh4cW1zdGF0cy54c19xbV9kcXJlY2xhaW1fbWlzc2VzKTsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIGEgYnJhbmQgbmV3IGRxdW90IG9uIHRoZSBrZXJuZWwgaGVhcCBhbmQgcmV0dXJuIGl0CisJICogdG8gdGhlIGNhbGxlciB0byBpbml0aWFsaXplLgorCSAqLworCUFTU0VSVCh4ZnNfR3FtLT5xbV9kcXpvbmUgIT0gTlVMTCk7CisJKk9fZHFwcCA9IGttZW1fem9uZV96YWxsb2MoeGZzX0dxbS0+cW1fZHF6b25lLCBLTV9TTEVFUCk7CisJYXRvbWljX2luYygmeGZzX0dxbS0+cW1fdG90YWxkcXVvdHMpOworCisJcmV0dXJuIChCX1RSVUUpOworfQorCisKKy8qCisgKiBTdGFydCBhIHRyYW5zYWN0aW9uIGFuZCB3cml0ZSB0aGUgaW5jb3JlIHN1cGVyYmxvY2sgY2hhbmdlcyB0bworICogZGlzay4gZmxhZ3MgcGFyYW1ldGVyIGluZGljYXRlcyB3aGljaCBmaWVsZHMgaGF2ZSBjaGFuZ2VkLgorICovCitpbnQKK3hmc19xbV93cml0ZV9zYl9jaGFuZ2VzKAorCXhmc19tb3VudF90CSptcCwKKwlfX2ludDY0X3QJZmxhZ3MpCit7CisJeGZzX3RyYW5zX3QJKnRwOworCWludAkJZXJyb3I7CisKKyNpZmRlZiBRVU9UQURFQlVHCisJY21uX2VycihDRV9OT1RFLCAiV3JpdGluZyBzdXBlcmJsb2NrIHF1b3RhIGNoYW5nZXMgOiVzIiwgbXAtPm1fZnNuYW1lKTsKKyNlbmRpZgorCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfUU1fU0JDSEFOR0UpOworCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwKKwkJCQkgICAgICBtcC0+bV9zYi5zYl9zZWN0c2l6ZSArIDEyOCwgMCwKKwkJCQkgICAgICAwLAorCQkJCSAgICAgIFhGU19ERUZBVUxUX0xPR19DT1VOVCkpKSB7CisJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQlyZXR1cm4gKGVycm9yKTsKKwl9CisKKwl4ZnNfbW9kX3NiKHRwLCBmbGFncyk7CisJKHZvaWQpIHhmc190cmFuc19jb21taXQodHAsIDAsIE5VTEwpOworCisJcmV0dXJuICgwKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0gdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHZub2Rlb3BzIC0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKgorICogR2l2ZW4gYW4gaW5vZGUsIGEgdWlkIGFuZCBnaWQgKGZyb20gY3JlZF90KSBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlCisgKiBhbGxvY2F0ZWQgcmVsZXZhbnQgZHF1b3Qocykgb24gZGlzaywgYW5kIHRoYXQgd2Ugd29uJ3QgZXhjZWVkIGlub2RlCisgKiBxdW90YXMgYnkgY3JlYXRpbmcgdGhpcyBmaWxlLgorICogVGhpcyBhbHNvIGF0dGFjaGVzIGRxdW90KHMpIHRvIHRoZSBnaXZlbiBpbm9kZSBhZnRlciBsb2NraW5nIGl0LAorICogYW5kIHJldHVybnMgdGhlIGRxdW90cyBjb3JyZXNwb25kaW5nIHRvIHRoZSB1aWQgYW5kL29yIGdpZC4KKyAqCisgKiBpbgk6IGlub2RlICh1bmxvY2tlZCkKKyAqIG91dAk6IHVkcXVvdCwgZ2RxdW90IHdpdGggcmVmZXJlbmNlcyB0YWtlbiBhbmQgdW5sb2NrZWQKKyAqLworaW50Cit4ZnNfcW1fdm9wX2RxYWxsb2MoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19pbm9kZV90CSppcCwKKwl1aWRfdAkJdWlkLAorCWdpZF90CQlnaWQsCisJdWludAkJZmxhZ3MsCisJeGZzX2RxdW90X3QJKipPX3VkcXBwLAorCXhmc19kcXVvdF90CSoqT19nZHFwcCkKK3sKKwlpbnQJCWVycm9yOworCXhmc19kcXVvdF90CSp1cSwgKmdxOworCXVpbnQJCWxvY2tmbGFnczsKKworCWlmICghWEZTX0lTX1FVT1RBX09OKG1wKSkKKwkJcmV0dXJuIDA7CisKKwlsb2NrZmxhZ3MgPSBYRlNfSUxPQ0tfRVhDTDsKKwl4ZnNfaWxvY2soaXAsIGxvY2tmbGFncyk7CisKKwlpZiAoKGZsYWdzICYgWEZTX1FNT1BUX0lOSEVSSVQpICYmCisJICAgIFhGU19JTkhFUklUX0dJRChpcCwgWEZTX01UT1ZGUyhtcCkpKQorCQlnaWQgPSBpcC0+aV9kLmRpX2dpZDsKKworCS8qCisJICogQXR0YWNoIHRoZSBkcXVvdChzKSB0byB0aGlzIGlub2RlLCBkb2luZyBhIGRxdW90IGFsbG9jYXRpb24KKwkgKiBpZiBuZWNlc3NhcnkuIFRoZSBkcXVvdChzKSB3aWxsIG5vdCBiZSBsb2NrZWQuCisJICovCisJaWYgKFhGU19OT1RfRFFBVFRBQ0hFRChtcCwgaXApKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFhdHRhY2goaXAsIFhGU19RTU9QVF9EUUFMTE9DIHwKKwkJCQkJICAgIFhGU19RTU9QVF9JTE9DS0VEKSkpIHsKKwkJCXhmc19pdW5sb2NrKGlwLCBsb2NrZmxhZ3MpOworCQkJcmV0dXJuIChlcnJvcik7CisJCX0KKwl9CisKKwl1cSA9IGdxID0gTlVMTDsKKwlpZiAoKGZsYWdzICYgWEZTX1FNT1BUX1VRVU9UQSkgJiYKKwkgICAgWEZTX0lTX1VRVU9UQV9PTihtcCkpIHsKKwkJaWYgKGlwLT5pX2QuZGlfdWlkICE9IHVpZCkgeworCQkJLyoKKwkJCSAqIFdoYXQgd2UgbmVlZCBpcyB0aGUgZHF1b3QgdGhhdCBoYXMgdGhpcyB1aWQsIGFuZAorCQkJICogaWYgd2Ugc2VuZCB0aGUgaW5vZGUgdG8gZHFnZXQsIHRoZSB1aWQgb2YgdGhlIGlub2RlCisJCQkgKiB0YWtlcyBwcmlvcml0eSBvdmVyIHdoYXQncyBzZW50IGluIHRoZSB1aWQgYXJndW1lbnQuCisJCQkgKiBXZSBtdXN0IHVubG9jayBpbm9kZSBoZXJlIGJlZm9yZSBjYWxsaW5nIGRxZ2V0IGlmCisJCQkgKiB3ZSdyZSBub3Qgc2VuZGluZyB0aGUgaW5vZGUsIGJlY2F1c2Ugb3RoZXJ3aXNlCisJCQkgKiB3ZSdsbCBkZWFkbG9jayBieSBkb2luZyB0cmFuc19yZXNlcnZlIHdoaWxlCisJCQkgKiBob2xkaW5nIGlsb2NrLgorCQkJICovCisJCQl4ZnNfaXVubG9jayhpcCwgbG9ja2ZsYWdzKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFnZXQobXAsIE5VTEwsICh4ZnNfZHFpZF90KSB1aWQsCisJCQkJCQkgWEZTX0RRX1VTRVIsCisJCQkJCQkgWEZTX1FNT1BUX0RRQUxMT0MgfAorCQkJCQkJIFhGU19RTU9QVF9ET1dBUk4sCisJCQkJCQkgJnVxKSkpIHsKKwkJCQlBU1NFUlQoZXJyb3IgIT0gRU5PRU5UKTsKKwkJCQlyZXR1cm4gKGVycm9yKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBHZXQgdGhlIGlsb2NrIGluIHRoZSByaWdodCBvcmRlci4KKwkJCSAqLworCQkJeGZzX2RxdW5sb2NrKHVxKTsKKwkJCWxvY2tmbGFncyA9IFhGU19JTE9DS19TSEFSRUQ7CisJCQl4ZnNfaWxvY2soaXAsIGxvY2tmbGFncyk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGFrZSBhbiBleHRyYSByZWZlcmVuY2UsIGJlY2F1c2Ugd2UnbGwgcmV0dXJuCisJCQkgKiB0aGlzIHRvIGNhbGxlcgorCQkJICovCisJCQlBU1NFUlQoaXAtPmlfdWRxdW90KTsKKwkJCXVxID0gaXAtPmlfdWRxdW90OworCQkJeGZzX2RxbG9jayh1cSk7CisJCQlYRlNfRFFIT0xEKHVxKTsKKwkJCXhmc19kcXVubG9jayh1cSk7CisJCX0KKwl9CisJaWYgKChmbGFncyAmIFhGU19RTU9QVF9HUVVPVEEpICYmCisJICAgIFhGU19JU19HUVVPVEFfT04obXApKSB7CisJCWlmIChpcC0+aV9kLmRpX2dpZCAhPSBnaWQpIHsKKwkJCXhmc19pdW5sb2NrKGlwLCBsb2NrZmxhZ3MpOworCQkJaWYgKChlcnJvciA9IHhmc19xbV9kcWdldChtcCwgTlVMTCwgKHhmc19kcWlkX3QpZ2lkLAorCQkJCQkJIFhGU19EUV9HUk9VUCwKKwkJCQkJCSBYRlNfUU1PUFRfRFFBTExPQyB8CisJCQkJCQkgWEZTX1FNT1BUX0RPV0FSTiwKKwkJCQkJCSAmZ3EpKSkgeworCQkJCWlmICh1cSkKKwkJCQkJeGZzX3FtX2RxcmVsZSh1cSk7CisJCQkJQVNTRVJUKGVycm9yICE9IEVOT0VOVCk7CisJCQkJcmV0dXJuIChlcnJvcik7CisJCQl9CisJCQl4ZnNfZHF1bmxvY2soZ3EpOworCQkJbG9ja2ZsYWdzID0gWEZTX0lMT0NLX1NIQVJFRDsKKwkJCXhmc19pbG9jayhpcCwgbG9ja2ZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCUFTU0VSVChpcC0+aV9nZHF1b3QpOworCQkJZ3EgPSBpcC0+aV9nZHF1b3Q7CisJCQl4ZnNfZHFsb2NrKGdxKTsKKwkJCVhGU19EUUhPTEQoZ3EpOworCQkJeGZzX2RxdW5sb2NrKGdxKTsKKwkJfQorCX0KKwlpZiAodXEpCisJCXhmc19kcXRyYWNlX2VudHJ5X2lubyh1cSwgIkRRQUxMT0MiLCBpcCk7CisKKwl4ZnNfaXVubG9jayhpcCwgbG9ja2ZsYWdzKTsKKwlpZiAoT191ZHFwcCkKKwkJKk9fdWRxcHAgPSB1cTsKKwllbHNlIGlmICh1cSkKKwkJeGZzX3FtX2RxcmVsZSh1cSk7CisJaWYgKE9fZ2RxcHApCisJCSpPX2dkcXBwID0gZ3E7CisJZWxzZSBpZiAoZ3EpCisJCXhmc19xbV9kcXJlbGUoZ3EpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBBY3R1YWxseSB0cmFuc2ZlciBvd25lcnNoaXAsIGFuZCBkbyBkcXVvdCBtb2RpZmljYXRpb25zLgorICogVGhlc2Ugd2VyZSBhbHJlYWR5IHJlc2VydmVkLgorICovCit4ZnNfZHF1b3RfdCAqCit4ZnNfcW1fdm9wX2Nob3duKAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfaW5vZGVfdAkqaXAsCisJeGZzX2RxdW90X3QJKipJT19vbGRkcSwKKwl4ZnNfZHF1b3RfdAkqbmV3ZHEpCit7CisJeGZzX2RxdW90X3QJKnByZXZkcTsKKwlBU1NFUlQoWEZTX0lTTE9DS0VEX0lOT0RFX0VYQ0woaXApKTsKKwlBU1NFUlQoWEZTX0lTX1FVT1RBX1JVTk5JTkcoaXAtPmlfbW91bnQpKTsKKworCS8qIG9sZCBkcXVvdCAqLworCXByZXZkcSA9ICpJT19vbGRkcTsKKwlBU1NFUlQocHJldmRxKTsKKwlBU1NFUlQocHJldmRxICE9IG5ld2RxKTsKKworCXhmc190cmFuc19tb2RfZHF1b3QodHAsIHByZXZkcSwKKwkJCSAgICBYRlNfVFJBTlNfRFFfQkNPVU5ULAorCQkJICAgIC0oaXAtPmlfZC5kaV9uYmxvY2tzKSk7CisJeGZzX3RyYW5zX21vZF9kcXVvdCh0cCwgcHJldmRxLAorCQkJICAgIFhGU19UUkFOU19EUV9JQ09VTlQsCisJCQkgICAgLTEpOworCisJLyogdGhlIHNwYXJrbGluZyBuZXcgZHF1b3QgKi8KKwl4ZnNfdHJhbnNfbW9kX2RxdW90KHRwLCBuZXdkcSwKKwkJCSAgICBYRlNfVFJBTlNfRFFfQkNPVU5ULAorCQkJICAgIGlwLT5pX2QuZGlfbmJsb2Nrcyk7CisJeGZzX3RyYW5zX21vZF9kcXVvdCh0cCwgbmV3ZHEsCisJCQkgICAgWEZTX1RSQU5TX0RRX0lDT1VOVCwKKwkJCSAgICAxKTsKKworCS8qCisJICogVGFrZSBhbiBleHRyYSByZWZlcmVuY2UsIGJlY2F1c2UgdGhlIGlub2RlCisJICogaXMgZ29pbmcgdG8ga2VlcCB0aGlzIGRxdW90IHBvaW50ZXIgZXZlbgorCSAqIGFmdGVyIHRoZSB0cmFuc19jb21taXQuCisJICovCisJeGZzX2RxbG9jayhuZXdkcSk7CisJWEZTX0RRSE9MRChuZXdkcSk7CisJeGZzX2RxdW5sb2NrKG5ld2RxKTsKKwkqSU9fb2xkZHEgPSBuZXdkcTsKKworCXJldHVybiAocHJldmRxKTsKK30KKworLyoKKyAqIFF1b3RhIHJlc2VydmF0aW9ucyBmb3Igc2V0YXR0cihBVF9VSUR8QVRfR0lEKS4KKyAqLworaW50Cit4ZnNfcW1fdm9wX2Nob3duX3Jlc2VydmUoCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19pbm9kZV90CSppcCwKKwl4ZnNfZHF1b3RfdAkqdWRxcCwKKwl4ZnNfZHF1b3RfdAkqZ2RxcCwKKwl1aW50CQlmbGFncykKK3sKKwlpbnQJCWVycm9yOworCXhmc19tb3VudF90CSptcDsKKwl1aW50CQlkZWxibGtzOworCXhmc19kcXVvdF90CSp1bnJlc3VkcSwgKnVucmVzZ2RxLCAqZGVsYmxrc3VkcSwgKmRlbGJsa3NnZHE7CisKKwlBU1NFUlQoWEZTX0lTTE9DS0VEX0lOT0RFKGlwKSk7CisJbXAgPSBpcC0+aV9tb3VudDsKKwlBU1NFUlQoWEZTX0lTX1FVT1RBX1JVTk5JTkcobXApKTsKKworCWRlbGJsa3MgPSBpcC0+aV9kZWxheWVkX2Jsa3M7CisJZGVsYmxrc3VkcSA9IGRlbGJsa3NnZHEgPSB1bnJlc3VkcSA9IHVucmVzZ2RxID0gTlVMTDsKKworCWlmIChYRlNfSVNfVVFVT1RBX09OKG1wKSAmJiB1ZHFwICYmCisJICAgIGlwLT5pX2QuZGlfdWlkICE9ICh1aWRfdClJTlRfR0VUKHVkcXAtPnFfY29yZS5kX2lkLCBBUkNIX0NPTlZFUlQpKSB7CisJCWRlbGJsa3N1ZHEgPSB1ZHFwOworCQkvKgorCQkgKiBJZiB0aGVyZSBhcmUgZGVsYXllZCBhbGxvY2F0aW9uIGJsb2NrcywgdGhlbiB3ZSBoYXZlIHRvCisJCSAqIHVucmVzZXJ2ZSB0aG9zZSBmcm9tIHRoZSBvbGQgZHF1b3QsIGFuZCBhZGQgdGhlbSB0byB0aGUKKwkJICogbmV3IGRxdW90LgorCQkgKi8KKwkJaWYgKGRlbGJsa3MpIHsKKwkJCUFTU0VSVChpcC0+aV91ZHF1b3QpOworCQkJdW5yZXN1ZHEgPSBpcC0+aV91ZHF1b3Q7CisJCX0KKwl9CisJaWYgKFhGU19JU19HUVVPVEFfT04oaXAtPmlfbW91bnQpICYmIGdkcXAgJiYKKwkgICAgaXAtPmlfZC5kaV9naWQgIT0gSU5UX0dFVChnZHFwLT5xX2NvcmUuZF9pZCwgQVJDSF9DT05WRVJUKSkgeworCQlkZWxibGtzZ2RxID0gZ2RxcDsKKwkJaWYgKGRlbGJsa3MpIHsKKwkJCUFTU0VSVChpcC0+aV9nZHF1b3QpOworCQkJdW5yZXNnZHEgPSBpcC0+aV9nZHF1b3Q7CisJCX0KKwl9CisKKwlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmVfcXVvdGFfYnlkcXVvdHModHAsIGlwLT5pX21vdW50LAorCQkJCWRlbGJsa3N1ZHEsIGRlbGJsa3NnZHEsIGlwLT5pX2QuZGlfbmJsb2NrcywgMSwKKwkJCQlmbGFncyB8IFhGU19RTU9QVF9SRVNfUkVHQkxLUykpKQorCQlyZXR1cm4gKGVycm9yKTsKKworCS8qCisJICogRG8gdGhlIGRlbGF5ZWQgYmxrcyByZXNlcnZhdGlvbnMvdW5yZXNlcnZhdGlvbnMgbm93LiBTaW5jZSwgdGhlc2UKKwkgKiBhcmUgZG9uZSB3aXRob3V0IHRoZSBoZWxwIG9mIGEgdHJhbnNhY3Rpb24sIGlmIGEgcmVzZXJ2YXRpb24gZmFpbHMKKwkgKiBpdHMgcHJldmlvdXMgcmVzZXJ2YXRpb25zIHdvbid0IGJlIGF1dG9tYXRpY2FsbHkgdW5kb25lIGJ5IHRyYW5zCisJICogY29kZS4gU28sIHdlIGhhdmUgdG8gZG8gaXQgbWFudWFsbHkgaGVyZS4KKwkgKi8KKwlpZiAoZGVsYmxrcykgeworCQkvKgorCQkgKiBEbyB0aGUgcmVzZXJ2YXRpb25zIGZpcnN0LiBVbnJlc2VydmF0aW9uIGNhbid0IGZhaWwuCisJCSAqLworCQlBU1NFUlQoZGVsYmxrc3VkcSB8fCBkZWxibGtzZ2RxKTsKKwkJQVNTRVJUKHVucmVzdWRxIHx8IHVucmVzZ2RxKTsKKwkJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlX3F1b3RhX2J5ZHF1b3RzKE5VTEwsIGlwLT5pX21vdW50LAorCQkJCWRlbGJsa3N1ZHEsIGRlbGJsa3NnZHEsICh4ZnNfcWNudF90KWRlbGJsa3MsIDAsCisJCQkJZmxhZ3MgfCBYRlNfUU1PUFRfUkVTX1JFR0JMS1MpKSkKKwkJCXJldHVybiAoZXJyb3IpOworCQl4ZnNfdHJhbnNfcmVzZXJ2ZV9xdW90YV9ieWRxdW90cyhOVUxMLCBpcC0+aV9tb3VudCwKKwkJCQl1bnJlc3VkcSwgdW5yZXNnZHEsIC0oKHhmc19xY250X3QpZGVsYmxrcyksIDAsCisJCQkJWEZTX1FNT1BUX1JFU19SRUdCTEtTKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCitpbnQKK3hmc19xbV92b3BfcmVuYW1lX2RxYXR0YWNoKAorCXhmc19pbm9kZV90CSoqaV90YWIpCit7CisJeGZzX2lub2RlX3QJKmlwOworCWludAkJaTsKKwlpbnQJCWVycm9yOworCisJaXAgPSBpX3RhYlswXTsKKworCWlmICghIFhGU19JU19RVU9UQV9PTihpcC0+aV9tb3VudCkpCisJCXJldHVybiAoMCk7CisKKwlpZiAoWEZTX05PVF9EUUFUVEFDSEVEKGlwLT5pX21vdW50LCBpcCkpIHsKKwkJZXJyb3IgPSB4ZnNfcW1fZHFhdHRhY2goaXAsIDApOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gKGVycm9yKTsKKwl9CisJZm9yIChpID0gMTsgKGkgPCA0ICYmIGlfdGFiW2ldKTsgaSsrKSB7CisJCS8qCisJCSAqIFdhdGNoIG91dCBmb3IgZHVwbGljYXRlIGVudHJpZXMgaW4gdGhlIHRhYmxlLgorCQkgKi8KKwkJaWYgKChpcCA9IGlfdGFiW2ldKSAhPSBpX3RhYltpLTFdKSB7CisJCQlpZiAoWEZTX05PVF9EUUFUVEFDSEVEKGlwLT5pX21vdW50LCBpcCkpIHsKKwkJCQllcnJvciA9IHhmc19xbV9kcWF0dGFjaChpcCwgMCk7CisJCQkJaWYgKGVycm9yKQorCQkJCQlyZXR1cm4gKGVycm9yKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gKDApOworfQorCit2b2lkCit4ZnNfcW1fdm9wX2RxYXR0YWNoX2FuZF9kcW1vZF9uZXdpbm9kZSgKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX2lub2RlX3QJKmlwLAorCXhmc19kcXVvdF90CSp1ZHFwLAorCXhmc19kcXVvdF90CSpnZHFwKQoreworCWlmICghWEZTX0lTX1FVT1RBX09OKHRwLT50X21vdW50cCkpCisJCXJldHVybjsKKworCUFTU0VSVChYRlNfSVNMT0NLRURfSU5PREVfRVhDTChpcCkpOworCUFTU0VSVChYRlNfSVNfUVVPVEFfUlVOTklORyh0cC0+dF9tb3VudHApKTsKKworCWlmICh1ZHFwKSB7CisJCXhmc19kcWxvY2sodWRxcCk7CisJCVhGU19EUUhPTEQodWRxcCk7CisJCXhmc19kcXVubG9jayh1ZHFwKTsKKwkJQVNTRVJUKGlwLT5pX3VkcXVvdCA9PSBOVUxMKTsKKwkJaXAtPmlfdWRxdW90ID0gdWRxcDsKKwkJQVNTRVJUKGlwLT5pX2QuZGlfdWlkID09IElOVF9HRVQodWRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCkpOworCQl4ZnNfdHJhbnNfbW9kX2RxdW90KHRwLCB1ZHFwLCBYRlNfVFJBTlNfRFFfSUNPVU5ULCAxKTsKKwl9CisJaWYgKGdkcXApIHsKKwkJeGZzX2RxbG9jayhnZHFwKTsKKwkJWEZTX0RRSE9MRChnZHFwKTsKKwkJeGZzX2RxdW5sb2NrKGdkcXApOworCQlBU1NFUlQoaXAtPmlfZ2RxdW90ID09IE5VTEwpOworCQlpcC0+aV9nZHF1b3QgPSBnZHFwOworCQlBU1NFUlQoaXAtPmlfZC5kaV9naWQgPT0gSU5UX0dFVChnZHFwLT5xX2NvcmUuZF9pZCwgQVJDSF9DT05WRVJUKSk7CisJCXhmc190cmFuc19tb2RfZHF1b3QodHAsIGdkcXAsIFhGU19UUkFOU19EUV9JQ09VTlQsIDEpOworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLSBsaXN0IHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQKK3hmc19xbV9mcmVlbGlzdF9pbml0KHhmc19mcmxpc3RfdCAqcWwpCit7CisJcWwtPnFoX25leHQgPSBxbC0+cWhfcHJldiA9ICh4ZnNfZHF1b3RfdCAqKSBxbDsKKwltdXRleF9pbml0KCZxbC0+cWhfbG9jaywgTVVURVhfREVGQVVMVCwgImRxZiIpOworCXFsLT5xaF92ZXJzaW9uID0gMDsKKwlxbC0+cWhfbmVsZW1zID0gMDsKK30KKwordm9pZAoreGZzX3FtX2ZyZWVsaXN0X2Rlc3Ryb3koeGZzX2ZybGlzdF90ICpxbCkKK3sKKwl4ZnNfZHF1b3RfdAkqZHFwLCAqbmV4dGRxcDsKKworCW11dGV4X2xvY2soJnFsLT5xaF9sb2NrLCBQSU5PRCk7CisJZm9yIChkcXAgPSBxbC0+cWhfbmV4dDsKKwkgICAgIGRxcCAhPSAoeGZzX2RxdW90X3QgKilxbDsgKSB7CisJCXhmc19kcWxvY2soZHFwKTsKKwkJbmV4dGRxcCA9IGRxcC0+ZHFfZmxuZXh0OworI2lmZGVmIFFVT1RBREVCVUcKKwkJY21uX2VycihDRV9ERUJVRywgIkZSRUVMSVNUIGRlc3Ryb3kgMHglcCIsIGRxcCk7CisjZW5kaWYKKwkJWFFNX0ZSRUVMSVNUX1JFTU9WRShkcXApOworCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJeGZzX3FtX2RxZGVzdHJveShkcXApOworCQlkcXAgPSBuZXh0ZHFwOworCX0KKwkvKgorCSAqIERvbid0IGJvdGhlciBhYm91dCB1bmxvY2tpbmcuCisJICovCisJbXV0ZXhfZGVzdHJveSgmcWwtPnFoX2xvY2spOworCisJQVNTRVJUKHFsLT5xaF9uZWxlbXMgPT0gMCk7Cit9CisKK3ZvaWQKK3hmc19xbV9mcmVlbGlzdF9pbnNlcnQoeGZzX2ZybGlzdF90ICpxbCwgeGZzX2RxdW90X3QgKmRxKQoreworCWRxLT5kcV9mbG5leHQgPSBxbC0+cWhfbmV4dDsKKwlkcS0+ZHFfZmxwcmV2ID0gKHhmc19kcXVvdF90ICopcWw7CisJcWwtPnFoX25leHQgPSBkcTsKKwlkcS0+ZHFfZmxuZXh0LT5kcV9mbHByZXYgPSBkcTsKKwl4ZnNfR3FtLT5xbV9kcWZyZWVsaXN0LnFoX25lbGVtcysrOworCXhmc19HcW0tPnFtX2RxZnJlZWxpc3QucWhfdmVyc2lvbisrOworfQorCit2b2lkCit4ZnNfcW1fZnJlZWxpc3RfdW5saW5rKHhmc19kcXVvdF90ICpkcSkKK3sKKwl4ZnNfZHF1b3RfdCAqbmV4dCA9IGRxLT5kcV9mbG5leHQ7CisJeGZzX2RxdW90X3QgKnByZXYgPSBkcS0+ZHFfZmxwcmV2OworCisJbmV4dC0+ZHFfZmxwcmV2ID0gcHJldjsKKwlwcmV2LT5kcV9mbG5leHQgPSBuZXh0OworCWRxLT5kcV9mbG5leHQgPSBkcS0+ZHFfZmxwcmV2ID0gZHE7CisJeGZzX0dxbS0+cW1fZHFmcmVlbGlzdC5xaF9uZWxlbXMtLTsKKwl4ZnNfR3FtLT5xbV9kcWZyZWVsaXN0LnFoX3ZlcnNpb24rKzsKK30KKwordm9pZAoreGZzX3FtX2ZyZWVsaXN0X2FwcGVuZCh4ZnNfZnJsaXN0X3QgKnFsLCB4ZnNfZHF1b3RfdCAqZHEpCit7CisJeGZzX3FtX2ZyZWVsaXN0X2luc2VydCgoeGZzX2ZybGlzdF90ICopcWwtPnFoX3ByZXYsIGRxKTsKK30KKworaW50Cit4ZnNfcW1fZHFoYXNobG9ja19ub3dhaXQoCisJeGZzX2RxdW90X3QgKmRxcCkKK3sKKwlpbnQgbG9ja2VkOworCisJbG9ja2VkID0gbXV0ZXhfdHJ5bG9jaygmKChkcXApLT5xX2hhc2gtPnFoX2xvY2spKTsKKwlyZXR1cm4gKGxvY2tlZCk7Cit9CisKK2ludAoreGZzX3FtX2ZyZWVsaXN0X2xvY2tfbm93YWl0KAorCXhmc19xbV90ICp4cW0pCit7CisJaW50IGxvY2tlZDsKKworCWxvY2tlZCA9IG11dGV4X3RyeWxvY2soJih4cW0tPnFtX2RxZnJlZWxpc3QucWhfbG9jaykpOworCXJldHVybiAobG9ja2VkKTsKK30KKworaW50Cit4ZnNfcW1fbXBsaXN0X25vd2FpdCgKKwl4ZnNfbW91bnRfdAkqbXApCit7CisJaW50IGxvY2tlZDsKKworCUFTU0VSVChtcC0+bV9xdW90YWluZm8pOworCWxvY2tlZCA9IG11dGV4X3RyeWxvY2soJihYRlNfUUlfTVBMTE9DSyhtcCkpKTsKKwlyZXR1cm4gKGxvY2tlZCk7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX3FtLmggYi9mcy94ZnMvcXVvdGEveGZzX3FtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNmMWE3YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfcW0uaApAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfUU1fSF9fCisjZGVmaW5lIF9fWEZTX1FNX0hfXworCisjaW5jbHVkZSAieGZzX2RxdW90X2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfZHF1b3QuaCIKKyNpbmNsdWRlICJ4ZnNfcXVvdGFfcHJpdi5oIgorI2luY2x1ZGUgInhmc19xbV9zdGF0cy5oIgorCitzdHJ1Y3QgeGZzX3FtOworc3RydWN0IHhmc19pbm9kZTsKKworZXh0ZXJuIG11dGV4X3QJCXhmc19HcW1fbG9jazsKK2V4dGVybiBzdHJ1Y3QgeGZzX3FtCSp4ZnNfR3FtOworZXh0ZXJuIGttZW1fem9uZV90CSpxbV9kcXpvbmU7CitleHRlcm4ga21lbV96b25lX3QJKnFtX2RxdHJ4em9uZTsKKworLyoKKyAqIFVzZWQgaW4geGZzX3FtX3N5bmMgY2FsbGVkIGJ5IHhmc19zeW5jIHRvIGNvdW50IHRoZSBtYXggdGltZXMgdGhhdCBpdCBjYW4KKyAqIGl0ZXJhdGUgb3ZlciB0aGUgbW91bnRwdCdzIGRxdW90IGxpc3QgaW4gb25lIGNhbGwuCisgKi8KKyNkZWZpbmUgWEZTX1FNX1NZTkNfTUFYX1JFU1RBUlRTCTcKKworLyoKKyAqIERpdHRvLCBmb3IgeGZzX3FtX2RxcmVjbGFpbV9vbmUuCisgKi8KKyNkZWZpbmUgWEZTX1FNX1JFQ0xBSU1fTUFYX1JFU1RBUlRTCTQKKworLyoKKyAqIElkZWFsIHJhdGlvIG9mIGZyZWUgdG8gaW4gdXNlIGRxdW90cy4gUXVvdGEgbWFuYWdlciBtYWtlcyBhbiBhdHRlbXB0CisgKiB0byBrZWVwIHRoaXMgYmFsYW5jZS4KKyAqLworI2RlZmluZSBYRlNfUU1fRFFGUkVFX1JBVElPCQkyCisKKy8qCisgKiBEcXVvdCBoYXNodGFibGUgY29uc3RhbnRzL3RocmVzaG9sZCB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgWEZTX1FNX05DU0laRV9USFJFU0hPTEQJCTUwMDAKKyNkZWZpbmUgWEZTX1FNX0hBU0hTSVpFX0xPVwkJMzIKKyNkZWZpbmUgWEZTX1FNX0hBU0hTSVpFX0hJR0gJCTY0CisKKy8qCisgKiBXZSBvdXRwdXQgYSBjbW5fZXJyIHdoZW4gcXVvdGFjaGVja2luZyBhIHF1b3RhIGZpbGUgd2l0aCBtb3JlIHRoYW4KKyAqIHRoaXMgbWFueSBmc2JzLgorICovCisjZGVmaW5lIFhGU19RTV9CSUdfUUNIRUNLX05CTEtTCQk1MDAKKworLyoKKyAqIFRoaXMgZGVmaW5lcyB0aGUgdW5pdCBvZiBhbGxvY2F0aW9uIG9mIGRxdW90cy4KKyAqIEN1cnJlbnRseSwgaXQgaXMganVzdCBvbmUgZmlsZSBzeXN0ZW0gYmxvY2ssIGFuZCBhIDRLIGJsayBjb250YWlucyAzMAorICogKDEzNiAqIDMwID0gNDA4MCkgZHF1b3RzLiBJdCdzIHByb2JhYmx5IG5vdCB3b3J0aCB0cnlpbmcgdG8gbWFrZQorICogdGhpcyBtb3JlIGR5bmFtaWMuCisgKiBYWFhzdXAgSG93ZXZlciwgaWYgdGhpcyBudW1iZXIgaXMgY2hhbmdlZCwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBkb24ndAorICogaW1wbGljaXRseSBhc3N1bWUgdGhhdCB3ZSBkbyBhbGxvY2F0aW9ucyBpbiBjaHVua3Mgb2YgYSBzaW5nbGUgZmlsZXN5c3RlbQorICogYmxvY2sgaW4gdGhlIGRxdW90L3hxbSBjb2RlLgorICovCisjZGVmaW5lIFhGU19EUVVPVF9DTFVTVEVSX1NJWkVfRlNCCSh4ZnNfZmlsYmxrc190KTEKKy8qCisgKiBXaGVuIGRvaW5nIGEgcXVvdGFjaGVjaywgd2UgbG9nIGRxdW90IGNsdXN0ZXJzIG9mIHRoaXMgbWFueSBGU0JzIGF0IG1vc3QKKyAqIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLiBXZSBkb24ndCB3YW50IHRvIGFzayBmb3IgdG9vIGh1Z2UgYSBsb2cgcmVzZXJ2YXRpb24uCisgKi8KKyNkZWZpbmUgWEZTX1FNX01BWF9EUUNMVVNURVJfTE9HU1oJMworCit0eXBlZGVmIHhmc19kcWhhc2hfdAl4ZnNfZHFsaXN0X3Q7CisvKgorICogVGhlIGZyZWVsaXN0IGhlYWQuIFRoZSBmaXJzdCB0d28gZmllbGRzIG1hdGNoIHRoZSBmaXJzdCB0d28gaW4gdGhlCisgKiB4ZnNfZHF1b3RfdCBzdHJ1Y3R1cmUgKGluIHhmc19kcW1hcmtlcl90KQorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZnJsaXN0IHsKKyAgICAgICBzdHJ1Y3QgeGZzX2RxdW90ICpxaF9uZXh0OworICAgICAgIHN0cnVjdCB4ZnNfZHF1b3QgKnFoX3ByZXY7CisgICAgICAgbXV0ZXhfdAkJIHFoX2xvY2s7CisgICAgICAgdWludAkJIHFoX3ZlcnNpb247CisgICAgICAgdWludAkJIHFoX25lbGVtczsKK30geGZzX2ZybGlzdF90OworCisvKgorICogUXVvdGEgTWFuYWdlciAoZ2xvYmFsKSBzdHJ1Y3R1cmUuIExpdmVzIG9ubHkgaW4gY29yZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX3FtIHsKKwl4ZnNfZHFsaXN0X3QJKnFtX3Vzcl9kcWh0YWJsZTsvKiB1ZHF1b3QgaGFzaCB0YWJsZSAqLworCXhmc19kcWxpc3RfdAkqcW1fZ3JwX2RxaHRhYmxlOy8qIGdkcXVvdCBoYXNoIHRhYmxlICovCisJdWludAkJIHFtX2RxaGFzaG1hc2s7CSAvKiAjIGJ1Y2tldHMgaW4gZHEgaGFzaHRhYiAtIDEgKi8KKwl4ZnNfZnJsaXN0X3QJIHFtX2RxZnJlZWxpc3Q7CSAvKiBmcmVlbGlzdCBvZiBkcXVvdHMgKi8KKwlhdG9taWNfdAkgcW1fdG90YWxkcXVvdHM7IC8qIHRvdGFsIGluY29yZSBkcXVvdHMgKi8KKwl1aW50CQkgcW1fbnJlZnM7CSAvKiBmaWxlIHN5c3RlbXMgd2l0aCBxdW90YSBvbiAqLworCWludAkJIHFtX2RxZnJlZV9yYXRpbzsvKiByYXRpbyBvZiBmcmVlIHRvIGludXNlIGRxdW90cyAqLworCWttZW1fem9uZV90CSpxbV9kcXpvbmU7CSAvKiBkcXVvdCBtZW0tYWxsb2Mgem9uZSAqLworCWttZW1fem9uZV90CSpxbV9kcXRyeHpvbmU7CSAvKiB0X2RxaW5mbyBvZiB0cmFuc2FjdGlvbnMgKi8KK30geGZzX3FtX3Q7CisKKy8qCisgKiBWYXJpb3VzIHF1b3RhIGluZm9ybWF0aW9uIGZvciBpbmRpdmlkdWFsIGZpbGVzeXN0ZW1zLgorICogVGhlIG1vdW50IHN0cnVjdHVyZSBrZWVwcyBhIHBvaW50ZXIgdG8gdGhpcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX3F1b3RhaW5mbyB7CisJeGZzX2lub2RlX3QJKnFpX3VxdW90YWlwOwkgLyogdXNlciBxdW90YSBpbm9kZSAqLworCXhmc19pbm9kZV90CSpxaV9ncXVvdGFpcDsJIC8qIGdyb3VwIHF1b3RhIGlub2RlICovCisJbG9ja190CQkgcWlfcGlubG9jazsJIC8qIGRxdW90IHBpbm5pbmcgbXV0ZXggKi8KKwl4ZnNfZHFsaXN0X3QJIHFpX2RxbGlzdDsJIC8qIGFsbCBkcXVvdHMgaW4gZmlsZXN5cyAqLworCWludAkJIHFpX2RxcmVjbGFpbXM7CSAvKiBhIGNoYW5nZSBoZXJlIGluZGljYXRlcworCQkJCQkgICAgYSByZW1vdmFsIGluIHRoZSBkcWxpc3QgKi8KKwl0aW1lX3QJCSBxaV9idGltZWxpbWl0OwkgLyogbGltaXQgZm9yIGJsa3MgdGltZXIgKi8KKwl0aW1lX3QJCSBxaV9pdGltZWxpbWl0OwkgLyogbGltaXQgZm9yIGlub2RlcyB0aW1lciAqLworCXRpbWVfdAkJIHFpX3J0YnRpbWVsaW1pdDsvKiBsaW1pdCBmb3IgcnQgYmxrcyB0aW1lciAqLworCXhmc19xd2FybmNudF90CSBxaV9id2FybmxpbWl0OwkgLyogbGltaXQgZm9yIG51bSB3YXJuaW5ncyAqLworCXhmc19xd2FybmNudF90CSBxaV9pd2FybmxpbWl0OwkgLyogbGltaXQgZm9yIG51bSB3YXJuaW5ncyAqLworCW11dGV4X3QJCSBxaV9xdW90YW9mZmxvY2s7LyogdG8gc2VyaWFsaXplIHF1b3Rhb2ZmICovCisJeGZzX2ZpbGJsa3NfdAkgcWlfZHFjaHVua2xlbjsJIC8qICMgQkJzIGluIGEgY2h1bmsgb2YgZHFzICovCisJdWludAkJIHFpX2RxcGVyY2h1bms7CSAvKiAjIG9uZGlzayBkcXMgaW4gYWJvdmUgY2h1bmsgKi8KKwl4ZnNfcWNudF90CSBxaV9iaGFyZGxpbWl0OwkgLyogZGVmYXVsdCBkYXRhIGJsayBoYXJkIGxpbWl0ICovCisJeGZzX3FjbnRfdAkgcWlfYnNvZnRsaW1pdDsJIC8qIGRlZmF1bHQgZGF0YSBibGsgc29mdCBsaW1pdCAqLworCXhmc19xY250X3QJIHFpX2loYXJkbGltaXQ7CSAvKiBkZWZhdWx0IGlub2RlIGNvdW50IGhhcmQgbGltaXQgKi8KKwl4ZnNfcWNudF90CSBxaV9pc29mdGxpbWl0OwkgLyogZGVmYXVsdCBpbm9kZSBjb3VudCBzb2Z0IGxpbWl0ICovCisJeGZzX3FjbnRfdAkgcWlfcnRiaGFyZGxpbWl0Oy8qIGRlZmF1bHQgcmVhbHRpbWUgYmxrIGhhcmQgbGltaXQgKi8KKwl4ZnNfcWNudF90CSBxaV9ydGJzb2Z0bGltaXQ7LyogZGVmYXVsdCByZWFsdGltZSBibGsgc29mdCBsaW1pdCAqLworfSB4ZnNfcXVvdGFpbmZvX3Q7CisKKworZXh0ZXJuIHhmc19kcXRyeG9wc190CXhmc190cmFuc19kcXVvdF9vcHM7CisKK2V4dGVybiB2b2lkCXhmc190cmFuc19tb2RfZHF1b3QoeGZzX3RyYW5zX3QgKiwgeGZzX2RxdW90X3QgKiwgdWludCwgbG9uZyk7CitleHRlcm4gaW50CXhmc190cmFuc19yZXNlcnZlX3F1b3RhX2J5ZHF1b3RzKHhmc190cmFuc190ICosIHhmc19tb3VudF90ICosCisJCQl4ZnNfZHF1b3RfdCAqLCB4ZnNfZHF1b3RfdCAqLCBsb25nLCBsb25nLCB1aW50KTsKK2V4dGVybiB2b2lkCXhmc190cmFuc19kcWpvaW4oeGZzX3RyYW5zX3QgKiwgeGZzX2RxdW90X3QgKik7CitleHRlcm4gdm9pZAl4ZnNfdHJhbnNfbG9nX2RxdW90KHhmc190cmFuc190ICosIHhmc19kcXVvdF90ICopOworCisvKgorICogV2Uga2VlcCB0aGUgdXNyIGFuZCBncnAgZHF1b3RzIHNlcGFyYXRlbHkgc28gdGhhdCBsb2NraW5nIHdpbGwgYmUgZWFzaWVyCisgKiB0byBkbyBhdCBjb21taXQgdGltZS4gQWxsIHRyYW5zYWN0aW9ucyB0aGF0IHdlIGtub3cgb2YgYXQgdGhpcyBwb2ludAorICogYWZmZWN0IG5vIG1vcmUgdGhhbiB0d28gZHF1b3RzIG9mIG9uZSB0eXBlLiBIZW5jZSwgdGhlIFRSQU5TX01BWERRUyB2YWx1ZS4KKyAqLworI2RlZmluZSBYRlNfUU1fVFJBTlNfTUFYRFFTCQkyCit0eXBlZGVmIHN0cnVjdCB4ZnNfZHF1b3RfYWNjdCB7CisJeGZzX2RxdHJ4X3QJZHFhX3VzcmRxdW90c1tYRlNfUU1fVFJBTlNfTUFYRFFTXTsKKwl4ZnNfZHF0cnhfdAlkcWFfZ3JwZHF1b3RzW1hGU19RTV9UUkFOU19NQVhEUVNdOworfSB4ZnNfZHF1b3RfYWNjdF90OworCisvKgorICogVXNlcnMgYXJlIGFsbG93ZWQgdG8gaGF2ZSBhIHVzYWdlIGV4Y2VlZGluZyB0aGVpciBzb2Z0bGltaXQgZm9yCisgKiBhIHBlcmlvZCB0aGlzIGxvbmcuCisgKi8KKyNkZWZpbmUgWEZTX1FNX0JUSU1FTElNSVQJKDcgKiAyNCo2MCo2MCkgICAgICAgICAgLyogMSB3ZWVrICovCisjZGVmaW5lIFhGU19RTV9SVEJUSU1FTElNSVQJKDcgKiAyNCo2MCo2MCkgICAgICAgICAgLyogMSB3ZWVrICovCisjZGVmaW5lIFhGU19RTV9JVElNRUxJTUlUCSg3ICogMjQqNjAqNjApICAgICAgICAgIC8qIDEgd2VlayAqLworCisjZGVmaW5lIFhGU19RTV9CV0FSTkxJTUlUCTUKKyNkZWZpbmUgWEZTX1FNX0lXQVJOTElNSVQJNQorCisjZGVmaW5lIFhGU19RTV9MT0NLKHhxbSkJKG11dGV4X2xvY2soJnhxbSMjX2xvY2ssIFBJTk9EKSkKKyNkZWZpbmUgWEZTX1FNX1VOTE9DSyh4cW0pCShtdXRleF91bmxvY2soJnhxbSMjX2xvY2spKQorI2RlZmluZSBYRlNfUU1fSE9MRCh4cW0pCSgoeHFtKS0+cW1fbnJlZnMrKykKKyNkZWZpbmUgWEZTX1FNX1JFTEUoeHFtKQkoKHhxbSktPnFtX25yZWZzLS0pCisKK2V4dGVybiB2b2lkCQl4ZnNfbW91bnRfcmVzZXRfc2JxZmxhZ3MoeGZzX21vdW50X3QgKik7CisKK2V4dGVybiBpbnQJCXhmc19xbV9pbml0X3F1b3RhaW5mbyh4ZnNfbW91bnRfdCAqKTsKK2V4dGVybiB2b2lkCQl4ZnNfcW1fZGVzdHJveV9xdW90YWluZm8oeGZzX21vdW50X3QgKik7CitleHRlcm4gaW50CQl4ZnNfcW1fbW91bnRfcXVvdGFzKHhmc19tb3VudF90ICosIGludCk7CitleHRlcm4gdm9pZAkJeGZzX3FtX21vdW50X3F1b3RhaW5pdCh4ZnNfbW91bnRfdCAqLCB1aW50KTsKK2V4dGVybiBpbnQJCXhmc19xbV9xdW90YWNoZWNrKHhmc19tb3VudF90ICopOworZXh0ZXJuIHZvaWQJCXhmc19xbV91bm1vdW50X3F1b3RhZGVzdHJveSh4ZnNfbW91bnRfdCAqKTsKK2V4dGVybiBpbnQJCXhmc19xbV91bm1vdW50X3F1b3Rhcyh4ZnNfbW91bnRfdCAqKTsKK2V4dGVybiBpbnQJCXhmc19xbV93cml0ZV9zYl9jaGFuZ2VzKHhmc19tb3VudF90ICosIF9faW50NjRfdCk7CitleHRlcm4gaW50CQl4ZnNfcW1fc3luYyh4ZnNfbW91bnRfdCAqLCBzaG9ydCk7CisKKy8qIGRxdW90IHN0dWZmICovCitleHRlcm4gYm9vbGVhbl90CXhmc19xbV9kcWFsbG9jX2luY29yZSh4ZnNfZHF1b3RfdCAqKik7CitleHRlcm4gaW50CQl4ZnNfcW1fZHFhdHRhY2goeGZzX2lub2RlX3QgKiwgdWludCk7CitleHRlcm4gdm9pZAkJeGZzX3FtX2RxZGV0YWNoKHhmc19pbm9kZV90ICopOworZXh0ZXJuIGludAkJeGZzX3FtX2RxcHVyZ2VfYWxsKHhmc19tb3VudF90ICosIHVpbnQpOworZXh0ZXJuIHZvaWQJCXhmc19xbV9kcXJlbGVfYWxsX2lub2Rlcyh4ZnNfbW91bnRfdCAqLCB1aW50KTsKKworLyogdm9wIHN0dWZmICovCitleHRlcm4gaW50CQl4ZnNfcW1fdm9wX2RxYWxsb2MoeGZzX21vdW50X3QgKiwgeGZzX2lub2RlX3QgKiwKKwkJCQkJdWlkX3QsIGdpZF90LCB1aW50LAorCQkJCQl4ZnNfZHF1b3RfdCAqKiwgeGZzX2RxdW90X3QgKiopOworZXh0ZXJuIHZvaWQJCXhmc19xbV92b3BfZHFhdHRhY2hfYW5kX2RxbW9kX25ld2lub2RlKAorCQkJCQl4ZnNfdHJhbnNfdCAqLCB4ZnNfaW5vZGVfdCAqLAorCQkJCQl4ZnNfZHF1b3RfdCAqLCB4ZnNfZHF1b3RfdCAqKTsKK2V4dGVybiBpbnQJCXhmc19xbV92b3BfcmVuYW1lX2RxYXR0YWNoKHhmc19pbm9kZV90ICoqKTsKK2V4dGVybiB4ZnNfZHF1b3RfdCAqCXhmc19xbV92b3BfY2hvd24oeGZzX3RyYW5zX3QgKiwgeGZzX2lub2RlX3QgKiwKKwkJCQkJeGZzX2RxdW90X3QgKiosIHhmc19kcXVvdF90ICopOworZXh0ZXJuIGludAkJeGZzX3FtX3ZvcF9jaG93bl9yZXNlcnZlKHhmc190cmFuc190ICosIHhmc19pbm9kZV90ICosCisJCQkJCXhmc19kcXVvdF90ICosIHhmc19kcXVvdF90ICosIHVpbnQpOworCisvKiBsaXN0IHN0dWZmICovCitleHRlcm4gdm9pZAkJeGZzX3FtX2ZyZWVsaXN0X2luaXQoeGZzX2ZybGlzdF90ICopOworZXh0ZXJuIHZvaWQJCXhmc19xbV9mcmVlbGlzdF9kZXN0cm95KHhmc19mcmxpc3RfdCAqKTsKK2V4dGVybiB2b2lkCQl4ZnNfcW1fZnJlZWxpc3RfaW5zZXJ0KHhmc19mcmxpc3RfdCAqLCB4ZnNfZHF1b3RfdCAqKTsKK2V4dGVybiB2b2lkCQl4ZnNfcW1fZnJlZWxpc3RfYXBwZW5kKHhmc19mcmxpc3RfdCAqLCB4ZnNfZHF1b3RfdCAqKTsKK2V4dGVybiB2b2lkCQl4ZnNfcW1fZnJlZWxpc3RfdW5saW5rKHhmc19kcXVvdF90ICopOworZXh0ZXJuIGludAkJeGZzX3FtX2ZyZWVsaXN0X2xvY2tfbm93YWl0KHhmc19xbV90ICopOworZXh0ZXJuIGludAkJeGZzX3FtX21wbGlzdF9ub3dhaXQoeGZzX21vdW50X3QgKik7CitleHRlcm4gaW50CQl4ZnNfcW1fZHFoYXNobG9ja19ub3dhaXQoeGZzX2RxdW90X3QgKik7CisKKy8qIHN5c3RlbSBjYWxsIGludGVyZmFjZSAqLworZXh0ZXJuIGludAkJeGZzX3FtX3F1b3RhY3RsKGJodl9kZXNjX3QgKiwgaW50LCBpbnQsIHhmc19jYWRkcl90KTsKKworI2lmZGVmIERFQlVHCitleHRlcm4gaW50CQl4ZnNfcW1faW50ZXJuYWxxY2hlY2soeGZzX21vdW50X3QgKik7CisjZWxzZQorI2RlZmluZSB4ZnNfcW1faW50ZXJuYWxxY2hlY2sobXApCSgwKQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1hGU19RTV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfcW1fYmh2LmMgYi9mcy94ZnMvcXVvdGEveGZzX3FtX2Jodi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNjdkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvcXVvdGEveGZzX3FtX2Jodi5jCkBAIC0wLDAgKzEsNDEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLgkgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2NsbnQuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisjaW5jbHVkZSAieGZzX2FjbC5oIgorI2luY2x1ZGUgInhmc19jYXAuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjLmgiCisjaW5jbHVkZSAieGZzX2F0dHIuaCIKKyNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKKworI2luY2x1ZGUgInhmc19xbS5oIgorCisjZGVmaW5lIE1OVE9QVF9RVU9UQQkicXVvdGEiCQkvKiBkaXNrIHF1b3RhcyAodXNlcikgKi8KKyNkZWZpbmUgTU5UT1BUX05PUVVPVEEJIm5vcXVvdGEiCS8qIG5vIHF1b3RhcyAqLworI2RlZmluZSBNTlRPUFRfVVNSUVVPVEEJInVzcnF1b3RhIgkvKiB1c2VyIHF1b3RhIGVuYWJsZWQgKi8KKyNkZWZpbmUgTU5UT1BUX0dSUFFVT1RBCSJncnBxdW90YSIJLyogZ3JvdXAgcXVvdGEgZW5hYmxlZCAqLworI2RlZmluZSBNTlRPUFRfVVFVT1RBCSJ1cXVvdGEiCS8qIHVzZXIgcXVvdGEgKElSSVggdmFyaWFudCkgKi8KKyNkZWZpbmUgTU5UT1BUX0dRVU9UQQkiZ3F1b3RhIgkvKiBncm91cCBxdW90YSAoSVJJWCB2YXJpYW50KSAqLworI2RlZmluZSBNTlRPUFRfVVFVT1RBTk9FTkYgInVxbm9lbmZvcmNlIi8qIHVzZXIgcXVvdGEgbGltaXQgZW5mb3JjZW1lbnQgKi8KKyNkZWZpbmUgTU5UT1BUX0dRVU9UQU5PRU5GICJncW5vZW5mb3JjZSIvKiBncm91cCBxdW90YSBsaW1pdCBlbmZvcmNlbWVudCAqLworI2RlZmluZSBNTlRPUFRfUVVPVEFOT0VORiAgInFub2VuZm9yY2UiCS8qIHNhbWUgYXMgdXFub2VuZm9yY2UgKi8KKworU1RBVElDIGludAoreGZzX3FtX3BhcnNlYXJncygKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpiaHYsCisJY2hhcgkJCSpvcHRpb25zLAorCXN0cnVjdCB4ZnNfbW91bnRfYXJncwkqYXJncywKKwlpbnQJCQl1cGRhdGUpCit7CisJc2l6ZV90CQkJbGVuZ3RoOworCWNoYXIJCQkqbG9jYWxfb3B0aW9ucyA9IG9wdGlvbnM7CisJY2hhcgkJCSp0aGlzX2NoYXI7CisJaW50CQkJZXJyb3I7CisJaW50CQkJcmVmZXJlbmNlZCA9IHVwZGF0ZTsKKworCXdoaWxlICgodGhpc19jaGFyID0gc3Ryc2VwKCZsb2NhbF9vcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CisJCWxlbmd0aCA9IHN0cmxlbih0aGlzX2NoYXIpOworCQlpZiAobG9jYWxfb3B0aW9ucykKKwkJCWxlbmd0aCsrOworCisJCWlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX05PUVVPVEEpKSB7CisJCQlhcmdzLT5mbGFncyAmPSB+KFhGU01OVF9VUVVPVEFFTkZ8WEZTTU5UX1VRVU9UQSk7CisJCQlhcmdzLT5mbGFncyAmPSB+KFhGU01OVF9HUVVPVEFFTkZ8WEZTTU5UX0dRVU9UQSk7CisJCQlyZWZlcmVuY2VkID0gdXBkYXRlOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfUVVPVEEpIHx8CisJCQkgICAhc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1VRVU9UQSkgfHwKKwkJCSAgICFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfVVNSUVVPVEEpKSB7CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfVVFVT1RBIHwgWEZTTU5UX1VRVU9UQUVORjsKKwkJCXJlZmVyZW5jZWQgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfUVVPVEFOT0VORikgfHwKKwkJCSAgICFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfVVFVT1RBTk9FTkYpKSB7CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfVVFVT1RBOworCQkJYXJncy0+ZmxhZ3MgJj0gflhGU01OVF9VUVVPVEFFTkY7CisJCQlyZWZlcmVuY2VkID0gMTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0dRVU9UQSkgfHwKKwkJCSAgICFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfR1JQUVVPVEEpKSB7CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfR1FVT1RBIHwgWEZTTU5UX0dRVU9UQUVORjsKKwkJCXJlZmVyZW5jZWQgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfR1FVT1RBTk9FTkYpKSB7CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfR1FVT1RBOworCQkJYXJncy0+ZmxhZ3MgJj0gflhGU01OVF9HUVVPVEFFTkY7CisJCQlyZWZlcmVuY2VkID0gMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChsb2NhbF9vcHRpb25zKQorCQkJCSoobG9jYWxfb3B0aW9ucy0xKSA9ICcsJzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJd2hpbGUgKGxlbmd0aC0tKQorCQkJKnRoaXNfY2hhcisrID0gJywnOworCX0KKworCVBWRlNfUEFSU0VBUkdTKEJIVl9ORVhUKGJodiksIG9wdGlvbnMsIGFyZ3MsIHVwZGF0ZSwgZXJyb3IpOworCWlmICghZXJyb3IgJiYgIXJlZmVyZW5jZWQpCisJCWJodl9yZW1vdmVfdmZzb3BzKGJodnRvdmZzKGJodiksIFZGU19QT1NJVElPTl9RTSk7CisJcmV0dXJuIGVycm9yOworfQorCitTVEFUSUMgaW50Cit4ZnNfcW1fc2hvd2FyZ3MoCisJc3RydWN0IGJodl9kZXNjCQkqYmh2LAorCXN0cnVjdCBzZXFfZmlsZQkJKm0pCit7CisJc3RydWN0IHZmcwkJKnZmc3AgPSBiaHZ0b3ZmcyhiaHYpOworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gWEZTX1ZGU1RPTSh2ZnNwKTsKKwlpbnQJCQllcnJvcjsKKworCWlmIChtcC0+bV9xZmxhZ3MgJiBYRlNfVVFVT1RBX0FDQ1QpIHsKKwkJKG1wLT5tX3FmbGFncyAmIFhGU19VUVVPVEFfRU5GRCkgPworCQkJc2VxX3B1dHMobSwgIiwiIE1OVE9QVF9VU1JRVU9UQSkgOgorCQkJc2VxX3B1dHMobSwgIiwiIE1OVE9QVF9VUVVPVEFOT0VORik7CisJfQorCisJaWYgKG1wLT5tX3FmbGFncyAmIFhGU19HUVVPVEFfQUNDVCkgeworCQkobXAtPm1fcWZsYWdzICYgWEZTX0dRVU9UQV9FTkZEKSA/CisJCQlzZXFfcHV0cyhtLCAiLCIgTU5UT1BUX0dSUFFVT1RBKSA6CisJCQlzZXFfcHV0cyhtLCAiLCIgTU5UT1BUX0dRVU9UQU5PRU5GKTsKKwl9CisKKwlpZiAoIShtcC0+bV9xZmxhZ3MgJiAoWEZTX1VRVU9UQV9BQ0NUfFhGU19HUVVPVEFfQUNDVCkpKQorCQlzZXFfcHV0cyhtLCAiLCIgTU5UT1BUX05PUVVPVEEpOworCisJUFZGU19TSE9XQVJHUyhCSFZfTkVYVChiaHYpLCBtLCBlcnJvcik7CisJcmV0dXJuIGVycm9yOworfQorCitTVEFUSUMgaW50Cit4ZnNfcW1fbW91bnQoCisJc3RydWN0IGJodl9kZXNjCQkqYmh2LAorCXN0cnVjdCB4ZnNfbW91bnRfYXJncwkqYXJncywKKwlzdHJ1Y3QgY3JlZAkJKmNyKQoreworCXN0cnVjdCB2ZnMJCSp2ZnNwID0gYmh2dG92ZnMoYmh2KTsKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IFhGU19WRlNUT00odmZzcCk7CisJaW50CQkJZXJyb3I7CisKKwlpZiAoYXJncy0+ZmxhZ3MgJiAoWEZTTU5UX1VRVU9UQSB8IFhGU01OVF9HUVVPVEEpKQorCQl4ZnNfcW1fbW91bnRfcXVvdGFpbml0KG1wLCBhcmdzLT5mbGFncyk7CisJUFZGU19NT1VOVChCSFZfTkVYVChiaHYpLCBhcmdzLCBjciwgZXJyb3IpOworCXJldHVybiBlcnJvcjsKK30KKworU1RBVElDIGludAoreGZzX3FtX3N5bmNhbGwoCisJc3RydWN0IGJodl9kZXNjCQkqYmh2LAorCWludAkJCWZsYWdzLAorCWNyZWRfdAkJCSpjcmVkcCkKK3sKKwlzdHJ1Y3QgdmZzCQkqdmZzcCA9IGJodnRvdmZzKGJodik7CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBYRlNfVkZTVE9NKHZmc3ApOworCWludAkJCWVycm9yOworCisJLyoKKwkgKiBHZXQgdGhlIFF1b3RhIE1hbmFnZXIgdG8gZmx1c2ggdGhlIGRxdW90cy4KKwkgKi8KKwlpZiAoWEZTX0lTX1FVT1RBX09OKG1wKSkgeworCQlpZiAoKGVycm9yID0geGZzX3FtX3N5bmMobXAsIGZsYWdzKSkpIHsKKwkJCS8qCisJCQkgKiBJZiB3ZSBnb3QgYW4gSU8gZXJyb3IsIHdlIHdpbGwgYmUgc2h1dHRpbmcgZG93bi4KKwkJCSAqIFNvLCB0aGVyZSdzIG5vdGhpbmcgbW9yZSBmb3IgdXMgdG8gZG8gaGVyZS4KKwkJCSAqLworCQkJQVNTRVJUKGVycm9yICE9IEVJTyB8fCBYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSk7CisJCQlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKKwkJCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKKwkJCX0KKwkJfQorCX0KKwlQVkZTX1NZTkMoQkhWX05FWFQoYmh2KSwgZmxhZ3MsIGNyZWRwLCBlcnJvcik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogQ2xlYXIgdGhlIHF1b3RhZmxhZ3MgaW4gbWVtb3J5IGFuZCBpbiB0aGUgc3VwZXJibG9jay4KKyAqLwordm9pZAoreGZzX21vdW50X3Jlc2V0X3NicWZsYWdzKAorCXhmc19tb3VudF90CQkqbXApCit7CisJeGZzX3RyYW5zX3QJCSp0cDsKKwl1bnNpZ25lZCBsb25nCQlzOworCisJbXAtPm1fcWZsYWdzID0gMDsKKwkvKgorCSAqIEl0IGlzIE9LIHRvIGxvb2sgYXQgc2JfcWZsYWdzIGhlcmUgaW4gbW91bnQgcGF0aCwKKwkgKiB3aXRob3V0IFNCX0xPQ0suCisJICovCisJaWYgKG1wLT5tX3NiLnNiX3FmbGFncyA9PSAwKQorCQlyZXR1cm47CisJcyA9IFhGU19TQl9MT0NLKG1wKTsKKwltcC0+bV9zYi5zYl9xZmxhZ3MgPSAwOworCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCisJLyoKKwkgKiBpZiB0aGUgZnMgaXMgcmVhZG9ubHksIGxldCB0aGUgaW5jb3JlIHN1cGVyYmxvY2sgcnVuCisJICogd2l0aCBxdW90YXMgb2ZmIGJ1dCBkb24ndCBmbHVzaCB0aGUgdXBkYXRlIG91dCB0byBkaXNrCisJICovCisJaWYgKFhGU19NVE9WRlMobXApLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpCisJCXJldHVybjsKKyNpZmRlZiBRVU9UQURFQlVHCisJeGZzX2ZzX2Ntbl9lcnIoQ0VfTk9URSwgbXAsICJXcml0aW5nIHN1cGVyYmxvY2sgcXVvdGEgY2hhbmdlcyIpOworI2VuZGlmCisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19RTV9TQkNIQU5HRSk7CisJaWYgKHhmc190cmFuc19yZXNlcnZlKHRwLCAwLCBtcC0+bV9zYi5zYl9zZWN0c2l6ZSArIDEyOCwgMCwgMCwKKwkJCQkgICAgICBYRlNfREVGQVVMVF9MT0dfQ09VTlQpKSB7CisJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCisJCQkieGZzX21vdW50X3Jlc2V0X3NicWZsYWdzOiBTdXBlcmJsb2NrIHVwZGF0ZSBmYWlsZWQhIik7CisJCXJldHVybjsKKwl9CisJeGZzX21vZF9zYih0cCwgWEZTX1NCX1FGTEFHUyk7CisJeGZzX3RyYW5zX2NvbW1pdCh0cCwgMCwgTlVMTCk7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19xbV9uZXdtb3VudCgKKwl4ZnNfbW91bnRfdAkqbXAsCisJdWludAkJKm5lZWRxdW90YW1vdW50LAorCXVpbnQJCSpxdW90YWZsYWdzKQoreworCXVpbnQJCXF1b3Rhb25kaXNrOworCXVpbnQJCXVxdW90YW9uZGlzayA9IDAsIGdxdW90YW9uZGlzayA9IDA7CisKKwkqcXVvdGFmbGFncyA9IDA7CisJKm5lZWRxdW90YW1vdW50ID0gQl9GQUxTRTsKKworCXF1b3Rhb25kaXNrID0gWEZTX1NCX1ZFUlNJT05fSEFTUVVPVEEoJm1wLT5tX3NiKSAmJgorCQltcC0+bV9zYi5zYl9xZmxhZ3MgJiAoWEZTX1VRVU9UQV9BQ0NUfFhGU19HUVVPVEFfQUNDVCk7CisKKwlpZiAocXVvdGFvbmRpc2spIHsKKwkJdXF1b3Rhb25kaXNrID0gbXAtPm1fc2Iuc2JfcWZsYWdzICYgWEZTX1VRVU9UQV9BQ0NUOworCQlncXVvdGFvbmRpc2sgPSBtcC0+bV9zYi5zYl9xZmxhZ3MgJiBYRlNfR1FVT1RBX0FDQ1Q7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGl0c2VsZiBpcyByZWFkLW9ubHksIHdlIGNhbid0IGFsbG93CisJICogdGhlIHVzZXIgdG8gY2hhbmdlIHRoZSBzdGF0ZSBvZiBxdW90YSBvbiB0aGUgbW91bnQgLQorCSAqIHRoaXMgd291bGQgZ2VuZXJhdGUgYSB0cmFuc2FjdGlvbiBvbiB0aGUgcm8gZGV2aWNlLAorCSAqIHdoaWNoIHdvdWxkIGxlYWQgdG8gYW4gSS9PIGVycm9yIGFuZCBzaHV0ZG93bgorCSAqLworCisJaWYgKCgodXF1b3Rhb25kaXNrICYmICFYRlNfSVNfVVFVT1RBX09OKG1wKSkgfHwKKwkgICAgKCF1cXVvdGFvbmRpc2sgJiYgIFhGU19JU19VUVVPVEFfT04obXApKSB8fAorCSAgICAgKGdxdW90YW9uZGlzayAmJiAhWEZTX0lTX0dRVU9UQV9PTihtcCkpIHx8CisJICAgICghZ3F1b3Rhb25kaXNrICYmICBYRlNfSVNfR1FVT1RBX09OKG1wKSkpICAmJgorCSAgICB4ZnNfZGV2X2lzX3JlYWRfb25seShtcCwgImNoYW5naW5nIHF1b3RhIHN0YXRlIikpIHsKKwkJY21uX2VycihDRV9XQVJOLAorCQkJIlhGUzogcGxlYXNlIG1vdW50IHdpdGglcyVzJXMuIiwKKwkJCSghcXVvdGFvbmRpc2sgPyAib3V0IHF1b3RhIiA6ICIiKSwKKwkJCSh1cXVvdGFvbmRpc2sgPyAiIHVzcnF1b3RhIiA6ICIiKSwKKwkJCShncXVvdGFvbmRpc2sgPyAiIGdycHF1b3RhIiA6ICIiKSk7CisJCXJldHVybiBYRlNfRVJST1IoRVBFUk0pOworCX0KKworCWlmIChYRlNfSVNfUVVPVEFfT04obXApIHx8IHF1b3Rhb25kaXNrKSB7CisJCS8qCisJCSAqIENhbGwgbW91bnRfcXVvdGFzIGF0IHRoaXMgcG9pbnQgb25seSBpZiB3ZSB3b24ndCBoYXZlIHRvIGRvCisJCSAqIGEgcXVvdGFjaGVjay4KKwkJICovCisJCWlmIChxdW90YW9uZGlzayAmJiAhWEZTX1FNX05FRURfUVVPVEFDSEVDSyhtcCkpIHsKKwkJCS8qCisJCQkgKiBJZiBhbiBlcnJvciBvY2N1cmVkLCBxbV9tb3VudF9xdW90YXMgY29kZQorCQkJICogaGFzIGFscmVhZHkgZGlzYWJsZWQgcXVvdGFzLiBTbywganVzdCBmaW5pc2gKKwkJCSAqIG1vdW50aW5nLCBhbmQgZ2V0IG9uIHdpdGggdGhlIGJvcmluZyBsaWZlCisJCQkgKiB3aXRob3V0IGRpc2sgcXVvdGFzLgorCQkJICovCisJCQl4ZnNfcW1fbW91bnRfcXVvdGFzKG1wLCAwKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBDbGVhciB0aGUgcXVvdGEgZmxhZ3MsIGJ1dCByZW1lbWJlciB0aGVtLiBUaGlzCisJCQkgKiBpcyBzbyB0aGF0IHRoZSBxdW90YSBjb2RlIGRvZXNuJ3QgZ2V0IGludm9rZWQKKwkJCSAqIGJlZm9yZSB3ZSdyZSByZWFkeS4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYW4KKwkJCSAqIGlub2RlIGdvZXMgaW5hY3RpdmUgYW5kIHdhbnRzIHRvIGZyZWUgYmxvY2tzLAorCQkJICogb3IgdmlhIHhmc19sb2dfbW91bnRfZmluaXNoLgorCQkJICovCisJCQkqbmVlZHF1b3RhbW91bnQgPSBCX1RSVUU7CisJCQkqcXVvdGFmbGFncyA9IG1wLT5tX3FmbGFnczsKKwkJCW1wLT5tX3FmbGFncyA9IDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIGludAoreGZzX3FtX2VuZG1vdW50KAorCXhmc19tb3VudF90CSptcCwKKwl1aW50CQluZWVkcXVvdGFtb3VudCwKKwl1aW50CQlxdW90YWZsYWdzLAorCWludAkJbWZzaV9mbGFncykKK3sKKwlpZiAobmVlZHF1b3RhbW91bnQpIHsKKwkJQVNTRVJUKG1wLT5tX3FmbGFncyA9PSAwKTsKKwkJbXAtPm1fcWZsYWdzID0gcXVvdGFmbGFnczsKKwkJeGZzX3FtX21vdW50X3F1b3RhcyhtcCwgbWZzaV9mbGFncyk7CisJfQorCisjaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChYRlNfTE9VRF9SRUNPVkVSWSkKKwlpZiAoISAoWEZTX0lTX1FVT1RBX09OKG1wKSkpCisJCXhmc19mc19jbW5fZXJyKENFX05PVEUsIG1wLCAiRGlzayBxdW90YXMgbm90IHR1cm5lZCBvbiIpOworCWVsc2UKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfTk9URSwgbXAsICJEaXNrIHF1b3RhcyB0dXJuZWQgb24iKTsKKyNlbmRpZgorCisjaWZkZWYgUVVPVEFERUJVRworCWlmIChYRlNfSVNfUVVPVEFfT04obXApICYmIHhmc19xbV9pbnRlcm5hbHFjaGVjayhtcCkpCisJCWNtbl9lcnIoQ0VfV0FSTiwgIlhGUzogbW91bnQgaW50ZXJuYWxxY2hlY2sgZmFpbGVkIik7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitTVEFUSUMgdm9pZAoreGZzX3FtX2RxcmVsZV9udWxsKAorCXhmc19kcXVvdF90CSpkcSkKK3sKKwkvKgorCSAqIENhbGxlZCBmcm9tIFhGUywgd2hlcmUgd2UgYWx3YXlzIGNoZWNrIGZpcnN0IGZvciBhIE5VTEwgZHF1b3QuCisJICovCisJaWYgKCFkcSkKKwkJcmV0dXJuOworCXhmc19xbV9kcXJlbGUoZHEpOworfQorCisKK3N0cnVjdCB4ZnNfcW1vcHMgeGZzX3FtY29yZV94ZnMgPSB7CisJLnhmc19xbWluaXQJCT0geGZzX3FtX25ld21vdW50LAorCS54ZnNfcW1kb25lCQk9IHhmc19xbV91bm1vdW50X3F1b3RhZGVzdHJveSwKKwkueGZzX3FtbW91bnQJCT0geGZzX3FtX2VuZG1vdW50LAorCS54ZnNfcW11bm1vdW50CQk9IHhmc19xbV91bm1vdW50X3F1b3RhcywKKwkueGZzX2RxcmVsZQkJPSB4ZnNfcW1fZHFyZWxlX251bGwsCisJLnhmc19kcWF0dGFjaAkJPSB4ZnNfcW1fZHFhdHRhY2gsCisJLnhmc19kcWRldGFjaAkJPSB4ZnNfcW1fZHFkZXRhY2gsCisJLnhmc19kcXB1cmdlYWxsCQk9IHhmc19xbV9kcXB1cmdlX2FsbCwKKwkueGZzX2Rxdm9wYWxsb2MJCT0geGZzX3FtX3ZvcF9kcWFsbG9jLAorCS54ZnNfZHF2b3BjcmVhdGUJPSB4ZnNfcW1fdm9wX2RxYXR0YWNoX2FuZF9kcW1vZF9uZXdpbm9kZSwKKwkueGZzX2Rxdm9wcmVuYW1lCT0geGZzX3FtX3ZvcF9yZW5hbWVfZHFhdHRhY2gsCisJLnhmc19kcXZvcGNob3duCQk9IHhmc19xbV92b3BfY2hvd24sCisJLnhmc19kcXZvcGNob3ducmVzdgk9IHhmc19xbV92b3BfY2hvd25fcmVzZXJ2ZSwKKwkueGZzX2RxdHJ4b3BzCQk9ICZ4ZnNfdHJhbnNfZHF1b3Rfb3BzLAorfTsKKworc3RydWN0IGJodl92ZnNvcHMgeGZzX3Ftb3BzID0geyB7CisJQkhWX0lERU5USVRZX0lOSVQoVkZTX0JIVl9RTSwgVkZTX1BPU0lUSU9OX1FNKSwKKwkudmZzX3BhcnNlYXJncwkJPSB4ZnNfcW1fcGFyc2VhcmdzLAorCS52ZnNfc2hvd2FyZ3MJCT0geGZzX3FtX3Nob3dhcmdzLAorCS52ZnNfbW91bnQJCT0geGZzX3FtX21vdW50LAorCS52ZnNfc3luYwkJPSB4ZnNfcW1fc3luY2FsbCwKKwkudmZzX3F1b3RhY3RsCQk9IHhmc19xbV9xdW90YWN0bCwgfSwKK307CisKKwordm9pZCBfX2luaXQKK3hmc19xbV9pbml0KHZvaWQpCit7CisJc3RhdGljIGNoYXIJbWVzc2FnZVtdIF9faW5pdGRhdGEgPQorCQlLRVJOX0lORk8gIlNHSSBYRlMgUXVvdGEgTWFuYWdlbWVudCBzdWJzeXN0ZW1cbiI7CisKKwlwcmludGsobWVzc2FnZSk7CisJbXV0ZXhfaW5pdCgmeGZzX0dxbV9sb2NrLCBNVVRFWF9ERUZBVUxULCAieGZzX3FtbG9jayIpOworCXZmc19iaHZfc2V0X2N1c3RvbSgmeGZzX3Ftb3BzLCAmeGZzX3FtY29yZV94ZnMpOworCXhmc19xbV9pbml0X3Byb2NmcygpOworfQorCit2b2lkIF9fZXhpdAoreGZzX3FtX2V4aXQodm9pZCkKK3sKKwl2ZnNfYmh2X2Nscl9jdXN0b20oJnhmc19xbW9wcyk7CisJeGZzX3FtX2NsZWFudXBfcHJvY2ZzKCk7CisJaWYgKHFtX2Rxem9uZSkKKwkJa21lbV9jYWNoZV9kZXN0cm95KHFtX2Rxem9uZSk7CisJaWYgKHFtX2RxdHJ4em9uZSkKKwkJa21lbV9jYWNoZV9kZXN0cm95KHFtX2RxdHJ4em9uZSk7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX3FtX3N0YXRzLmMgYi9mcy94ZnMvcXVvdGEveGZzX3FtX3N0YXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5NzhlMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3RhdHMuYwpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19mcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19xdW90YS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19pdGFibGUuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKyNpbmNsdWRlICJ4ZnNfYWNsLmgiCisjaW5jbHVkZSAieGZzX2NhcC5oIgorI2luY2x1ZGUgInhmc19tYWMuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0ci5oIgorI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgorCisjaW5jbHVkZSAieGZzX3FtLmgiCisKK3N0cnVjdCB4cW1zdGF0cyB4cW1zdGF0czsKKworU1RBVElDIGludAoreGZzX3FtX3JlYWRfeGZzcXVvdGEoCisJY2hhcgkJKmJ1ZmZlciwKKwljaGFyCQkqKnN0YXJ0LAorCW9mZl90CQlvZmZzZXQsCisJaW50CQljb3VudCwKKwlpbnQJCSplb2YsCisJdm9pZAkJKmRhdGEpCit7CisJaW50CQlsZW47CisKKwkvKiBtYXhpbXVtOyBpbmNvcmU7IHJhdGlvIGZyZWUgdG8gaW51c2U7IGZyZWVsaXN0ICovCisJbGVuID0gc3ByaW50ZihidWZmZXIsICIlZFx0JWRcdCVkXHQldVxuIiwKKwkJCW5kcXVvdCwKKwkJCXhmc19HcW0/IGF0b21pY19yZWFkKCZ4ZnNfR3FtLT5xbV90b3RhbGRxdW90cykgOiAwLAorCQkJeGZzX0dxbT8geGZzX0dxbS0+cW1fZHFmcmVlX3JhdGlvIDogMCwKKwkJCXhmc19HcW0/IHhmc19HcW0tPnFtX2RxZnJlZWxpc3QucWhfbmVsZW1zIDogMCk7CisKKwlpZiAob2Zmc2V0ID49IGxlbikgeworCQkqc3RhcnQgPSBidWZmZXI7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCWlmICgobGVuIC09IG9mZnNldCkgPiBjb3VudCkKKwkJcmV0dXJuIGNvdW50OworCSplb2YgPSAxOworCisJcmV0dXJuIGxlbjsKK30KKworU1RBVElDIGludAoreGZzX3FtX3JlYWRfc3RhdHMoCisJY2hhcgkJKmJ1ZmZlciwKKwljaGFyCQkqKnN0YXJ0LAorCW9mZl90CQlvZmZzZXQsCisJaW50CQljb3VudCwKKwlpbnQJCSplb2YsCisJdm9pZAkJKmRhdGEpCit7CisJaW50CQlsZW47CisKKwkvKiBxdW90YSBwZXJmb3JtYW5jZSBzdGF0aXN0aWNzICovCisJbGVuID0gc3ByaW50ZihidWZmZXIsICJxbSAldSAldSAldSAldSAldSAldSAldSAldVxuIiwKKwkJCXhxbXN0YXRzLnhzX3FtX2RxcmVjbGFpbXMsCisJCQl4cW1zdGF0cy54c19xbV9kcXJlY2xhaW1fbWlzc2VzLAorCQkJeHFtc3RhdHMueHNfcW1fZHF1b3RfZHVwcywKKwkJCXhxbXN0YXRzLnhzX3FtX2RxY2FjaGVtaXNzZXMsCisJCQl4cW1zdGF0cy54c19xbV9kcWNhY2hlaGl0cywKKwkJCXhxbXN0YXRzLnhzX3FtX2Rxd2FudHMsCisJCQl4cW1zdGF0cy54c19xbV9kcXNoYWtlX3JlY2xhaW1zLAorCQkJeHFtc3RhdHMueHNfcW1fZHFpbmFjdF9yZWNsYWltcyk7CisKKwlpZiAob2Zmc2V0ID49IGxlbikgeworCQkqc3RhcnQgPSBidWZmZXI7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJKnN0YXJ0ID0gYnVmZmVyICsgb2Zmc2V0OworCWlmICgobGVuIC09IG9mZnNldCkgPiBjb3VudCkKKwkJcmV0dXJuIGNvdW50OworCSplb2YgPSAxOworCisJcmV0dXJuIGxlbjsKK30KKwordm9pZAoreGZzX3FtX2luaXRfcHJvY2ZzKHZvaWQpCit7CisJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZnMveGZzL3hxbXN0YXQiLCAwLCBOVUxMLCB4ZnNfcW1fcmVhZF9zdGF0cywgTlVMTCk7CisJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZnMveGZzL3hxbSIsIDAsIE5VTEwsIHhmc19xbV9yZWFkX3hmc3F1b3RhLCBOVUxMKTsKK30KKwordm9pZAoreGZzX3FtX2NsZWFudXBfcHJvY2ZzKHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoImZzL3hmcy94cW0iLCBOVUxMKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiZnMveGZzL3hxbXN0YXQiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3RhdHMuaCBiL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3RhdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDkzYzVjCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3F1b3RhL3hmc19xbV9zdGF0cy5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLgkgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19RTV9TVEFUU19IX18KKyNkZWZpbmUgX19YRlNfUU1fU1RBVFNfSF9fCisKKworI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmICFkZWZpbmVkKFhGU19TVEFUU19PRkYpCisKKy8qCisgKiBYUU0gZ2xvYmFsIHN0YXRpc3RpY3MKKyAqLworc3RydWN0IHhxbXN0YXRzIHsKKwlfX3VpbnQzMl90CQl4c19xbV9kcXJlY2xhaW1zOworCV9fdWludDMyX3QJCXhzX3FtX2RxcmVjbGFpbV9taXNzZXM7CisJX191aW50MzJfdAkJeHNfcW1fZHF1b3RfZHVwczsKKwlfX3VpbnQzMl90CQl4c19xbV9kcWNhY2hlbWlzc2VzOworCV9fdWludDMyX3QJCXhzX3FtX2RxY2FjaGVoaXRzOworCV9fdWludDMyX3QJCXhzX3FtX2Rxd2FudHM7CisJX191aW50MzJfdAkJeHNfcW1fZHFzaGFrZV9yZWNsYWltczsKKwlfX3VpbnQzMl90CQl4c19xbV9kcWluYWN0X3JlY2xhaW1zOworfTsKKworZXh0ZXJuIHN0cnVjdCB4cW1zdGF0cyB4cW1zdGF0czsKKworIyBkZWZpbmUgWFFNX1NUQVRTX0lOQyhjb3VudCkJKCAoY291bnQpKysgKQorCitleHRlcm4gdm9pZCB4ZnNfcW1faW5pdF9wcm9jZnModm9pZCk7CitleHRlcm4gdm9pZCB4ZnNfcW1fY2xlYW51cF9wcm9jZnModm9pZCk7CisKKyNlbHNlCisKKyMgZGVmaW5lIFhRTV9TVEFUU19JTkMoY291bnQpCWRvIHsgfSB3aGlsZSAoMCkKKworc3RhdGljIF9faW5saW5lIHZvaWQgeGZzX3FtX2luaXRfcHJvY2ZzKHZvaWQpIHsgfTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIHhmc19xbV9jbGVhbnVwX3Byb2Nmcyh2b2lkKSB7IH07CisKKyNlbmRpZgorCisjZW5kaWYJLyogX19YRlNfUU1fU1RBVFNfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX3FtX3N5c2NhbGxzLmMgYi9mcy94ZnMvcXVvdGEveGZzX3FtX3N5c2NhbGxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI5ZjViNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3lzY2FsbHMuYwpAQCAtMCwwICsxLDE0NTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuCSBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisjaW5jbHVkZSAieGZzX2FjbC5oIgorI2luY2x1ZGUgInhmc19jYXAuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjLmgiCisjaW5jbHVkZSAieGZzX2F0dHIuaCIKKyNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfdXRpbHMuaCIKKworI2luY2x1ZGUgInhmc19xbS5oIgorCisjaWZkZWYgREVCVUcKKyMgZGVmaW5lIHFkcHJpbnRrKHMsIGFyZ3MuLi4pCWNtbl9lcnIoQ0VfREVCVUcsIHMsICMjIGFyZ3MpCisjZWxzZQorIyBkZWZpbmUgcWRwcmludGsocywgYXJncy4uLikJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKK1NUQVRJQyBpbnQJeGZzX3FtX3NjYWxsX3RydW5jX3FmaWxlcyh4ZnNfbW91bnRfdCAqLCB1aW50KTsKK1NUQVRJQyBpbnQJeGZzX3FtX3NjYWxsX2dldHF1b3RhKHhmc19tb3VudF90ICosIHhmc19kcWlkX3QsIHVpbnQsCisJCQkJCWZzX2Rpc2tfcXVvdGFfdCAqKTsKK1NUQVRJQyBpbnQJeGZzX3FtX3NjYWxsX2dldHFzdGF0KHhmc19tb3VudF90ICosIGZzX3F1b3RhX3N0YXRfdCAqKTsKK1NUQVRJQyBpbnQJeGZzX3FtX3NjYWxsX3NldHFsaW0oeGZzX21vdW50X3QgKiwgeGZzX2RxaWRfdCwgdWludCwKKwkJCQkJZnNfZGlza19xdW90YV90ICopOworU1RBVElDIGludAl4ZnNfcW1fc2NhbGxfcXVvdGFvbih4ZnNfbW91bnRfdCAqLCB1aW50KTsKK1NUQVRJQyBpbnQJeGZzX3FtX3NjYWxsX3F1b3Rhb2ZmKHhmc19tb3VudF90ICosIHVpbnQsIGJvb2xlYW5fdCk7CitTVEFUSUMgaW50CXhmc19xbV9sb2dfcXVvdGFvZmYoeGZzX21vdW50X3QgKiwgeGZzX3FvZmZfbG9naXRlbV90ICoqLCB1aW50KTsKK1NUQVRJQyBpbnQJeGZzX3FtX2xvZ19xdW90YW9mZl9lbmQoeGZzX21vdW50X3QgKiwgeGZzX3FvZmZfbG9naXRlbV90ICosCisJCQkJCXVpbnQpOworU1RBVElDIHVpbnQJeGZzX3FtX2ltcG9ydF9mbGFncyh1aW50KTsKK1NUQVRJQyB1aW50CXhmc19xbV9leHBvcnRfZmxhZ3ModWludCk7CitTVEFUSUMgdWludAl4ZnNfcW1faW1wb3J0X3F0eXBlX2ZsYWdzKHVpbnQpOworU1RBVElDIHVpbnQJeGZzX3FtX2V4cG9ydF9xdHlwZV9mbGFncyh1aW50KTsKK1NUQVRJQyB2b2lkCXhmc19xbV9leHBvcnRfZHF1b3QoeGZzX21vdW50X3QgKiwgeGZzX2Rpc2tfZHF1b3RfdCAqLAorCQkJCQlmc19kaXNrX3F1b3RhX3QgKik7CisKKworLyoKKyAqIFRoZSBtYWluIGRpc3RyaWJ1dGlvbiBzd2l0Y2ggb2YgYWxsIFhGUyBxdW90YWN0bCBzeXN0ZW0gY2FsbHMuCisgKi8KK2ludAoreGZzX3FtX3F1b3RhY3RsKAorCXN0cnVjdCBiaHZfZGVzYyAqYmRwLAorCWludAkJY21kLAorCWludAkJaWQsCisJeGZzX2NhZGRyX3QJYWRkcikKK3sKKwl4ZnNfbW91bnRfdAkqbXA7CisJaW50CQllcnJvcjsKKwlzdHJ1Y3QgdmZzCSp2ZnNwOworCisJdmZzcCA9IGJodnRvdmZzKGJkcCk7CisJbXAgPSBYRlNfVkZTVE9NKHZmc3ApOworCisJaWYgKGFkZHIgPT0gTlVMTCAmJiBjbWQgIT0gUV9TWU5DKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJaWYgKGlkIDwgMCAmJiBjbWQgIT0gUV9TWU5DKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIHZhbGlkIGV2ZW4gd2hlbiBxdW90YW9mZi4KKwkgKi8KKwlzd2l0Y2ggKGNtZCkgeworCQkvKgorCQkgKiB0cnVuY2F0ZSBxdW90YSBmaWxlcy4gcXVvdGEgbXVzdCBiZSBvZmYuCisJCSAqLworCSAgICAgIGNhc2UgUV9YUVVPVEFSTToKKwkJaWYgKFhGU19JU19RVU9UQV9PTihtcCkgfHwgYWRkciA9PSBOVUxMKQorCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCQlpZiAodmZzcC0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKQorCQkJcmV0dXJuIFhGU19FUlJPUihFUk9GUyk7CisJCXJldHVybiAoeGZzX3FtX3NjYWxsX3RydW5jX3FmaWxlcyhtcCwKKwkJCSAgICAgICB4ZnNfcW1faW1wb3J0X3F0eXBlX2ZsYWdzKCoodWludCAqKWFkZHIpKSk7CisJCS8qCisJCSAqIEdldCBxdW90YSBzdGF0dXMgaW5mb3JtYXRpb24uCisJCSAqLworCSAgICAgIGNhc2UgUV9YR0VUUVNUQVQ6CisJCXJldHVybiAoeGZzX3FtX3NjYWxsX2dldHFzdGF0KG1wLCAoZnNfcXVvdGFfc3RhdF90ICopYWRkcikpOworCisJCS8qCisJCSAqIFFVT1RBT04gZm9yIHJvb3QgZi9zIGFuZCBxdW90YSBlbmZvcmNlbWVudCBvbiBvdGhlcnMuLgorCQkgKiBRdW90YSBhY2NvdW50aW5nIGZvciBub24tcm9vdCBmL3MncyBtdXN0IGJlIHR1cm5lZCBvbgorCQkgKiBhdCBtb3VudCB0aW1lLgorCQkgKi8KKwkgICAgICBjYXNlIFFfWFFVT1RBT046CisJCWlmIChhZGRyID09IE5VTEwpCisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJCWlmICh2ZnNwLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpCisJCQlyZXR1cm4gWEZTX0VSUk9SKEVST0ZTKTsKKwkJcmV0dXJuICh4ZnNfcW1fc2NhbGxfcXVvdGFvbihtcCwKKwkJCQkJICB4ZnNfcW1faW1wb3J0X2ZsYWdzKCoodWludCAqKWFkZHIpKSk7CisJICAgICAgY2FzZSBRX1hRVU9UQU9GRjoKKwkJaWYgKHZmc3AtPnZmc19mbGFnICYgVkZTX1JET05MWSkKKwkJCXJldHVybiBYRlNfRVJST1IoRVJPRlMpOworCQlicmVhazsKKworCSAgICAgIGRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmICghIFhGU19JU19RVU9UQV9PTihtcCkpCisJCXJldHVybiBYRlNfRVJST1IoRVNSQ0gpOworCisJc3dpdGNoIChjbWQpIHsKKwkgICAgICBjYXNlIFFfWFFVT1RBT0ZGOgorCQlpZiAodmZzcC0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKQorCQkJcmV0dXJuIFhGU19FUlJPUihFUk9GUyk7CisJCWVycm9yID0geGZzX3FtX3NjYWxsX3F1b3Rhb2ZmKG1wLAorCQkJCQkgICAgeGZzX3FtX2ltcG9ydF9mbGFncygqKHVpbnQgKilhZGRyKSwKKwkJCQkJICAgIEJfRkFMU0UpOworCQlicmVhazsKKworCQkvKgorCQkgKiBEZWZhdWx0cyB0byBYRlNfR0VUVVFVT1RBLgorCQkgKi8KKwkgICAgICBjYXNlIFFfWEdFVFFVT1RBOgorCQllcnJvciA9IHhmc19xbV9zY2FsbF9nZXRxdW90YShtcCwgKHhmc19kcWlkX3QpaWQsIFhGU19EUV9VU0VSLAorCQkJCQkoZnNfZGlza19xdW90YV90ICopYWRkcik7CisJCWJyZWFrOworCQkvKgorCQkgKiBTZXQgbGltaXRzLCBib3RoIGhhcmQgYW5kIHNvZnQuIERlZmF1bHRzIHRvIFFfU0VUVVFMSU0uCisJCSAqLworCSAgICAgIGNhc2UgUV9YU0VUUUxJTToKKwkJaWYgKHZmc3AtPnZmc19mbGFnICYgVkZTX1JET05MWSkKKwkJCXJldHVybiBYRlNfRVJST1IoRVJPRlMpOworCQllcnJvciA9IHhmc19xbV9zY2FsbF9zZXRxbGltKG1wLCAoeGZzX2RxaWRfdClpZCwgWEZTX0RRX1VTRVIsCisJCQkJCSAgICAgKGZzX2Rpc2tfcXVvdGFfdCAqKWFkZHIpOworCQlicmVhazsKKworCSAgICAgICBjYXNlIFFfWFNFVEdRTElNOgorCQlpZiAodmZzcC0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKQorCQkJcmV0dXJuIFhGU19FUlJPUihFUk9GUyk7CisJCWVycm9yID0geGZzX3FtX3NjYWxsX3NldHFsaW0obXAsICh4ZnNfZHFpZF90KWlkLCBYRlNfRFFfR1JPVVAsCisJCQkJCSAgICAgKGZzX2Rpc2tfcXVvdGFfdCAqKWFkZHIpOworCQlicmVhazsKKworCisJICAgICAgY2FzZSBRX1hHRVRHUVVPVEE6CisJCWVycm9yID0geGZzX3FtX3NjYWxsX2dldHF1b3RhKG1wLCAoeGZzX2RxaWRfdClpZCwgWEZTX0RRX0dST1VQLAorCQkJCQkoZnNfZGlza19xdW90YV90ICopYWRkcik7CisJCWJyZWFrOworCisJCS8qCisJCSAqIFF1b3RhcyBhcmUgZW50aXJlbHkgdW5kZWZpbmVkIGFmdGVyIHF1b3Rhb2ZmIGluIFhGUyBxdW90YXMuCisJCSAqIEZvciBpbnN0YW5jZSwgdGhlcmUncyBubyB3YXkgdG8gc2V0IGxpbWl0cyB3aGVuIHF1b3Rhb2ZmLgorCQkgKi8KKworCSAgICAgIGRlZmF1bHQ6CisJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAoZXJyb3IpOworfQorCisvKgorICogVHVybiBvZmYgcXVvdGEgYWNjb3VudGluZyBhbmQvb3IgZW5mb3JjZW1lbnQgZm9yIGFsbCB1ZHF1b3RzIGFuZC9vcgorICogZ2RxdW90cy4gQ2FsbGVkIG9ubHkgYXQgdW5tb3VudCB0aW1lLgorICoKKyAqIFRoaXMgYXNzdW1lcyB0aGF0IHRoZXJlIGFyZSBubyBkcXVvdHMgb2YgdGhpcyBmaWxlIHN5c3RlbSBjYWNoZWQKKyAqIGluY29yZSwgYW5kIG1vZGlmaWVzIHRoZSBvbmRpc2sgZHF1b3QgZGlyZWN0bHkuIFRoZXJlZm9yZSwgZm9yIGV4YW1wbGUsCisgKiBpdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgdHdpY2UsIHdpdGhvdXQgcHVyZ2luZyB0aGUgY2FjaGUuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19xbV9zY2FsbF9xdW90YW9mZigKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXVpbnQJCQlmbGFncywKKwlib29sZWFuX3QJCWZvcmNlKQoreworCXVpbnQJCQlkcXR5cGU7CisJdW5zaWduZWQgbG9uZwlzOworCWludAkJCWVycm9yOworCXVpbnQJCQlpbmFjdGl2YXRlX2ZsYWdzOworCXhmc19xb2ZmX2xvZ2l0ZW1fdAkqcW9mZnN0YXJ0OworCWludAkJCW5jdWxwcml0czsKKworCWlmICghZm9yY2UgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiBYRlNfRVJST1IoRVBFUk0pOworCS8qCisJICogTm8gZmlsZSBzeXN0ZW0gY2FuIGhhdmUgcXVvdGFzIGVuYWJsZWQgb24gZGlzayBidXQgbm90IGluIGNvcmUuCisJICogTm90ZSB0aGF0IHF1b3RhIHV0aWxpdGllcyAobGlrZSBxdW90YW9mZikgX2V4cGVjdF8KKwkgKiBlcnJubyA9PSBFRVhJU1QgaGVyZS4KKwkgKi8KKwlpZiAoKG1wLT5tX3FmbGFncyAmIGZsYWdzKSA9PSAwKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVFWElTVCk7CisJZXJyb3IgPSAwOworCisJZmxhZ3MgJj0gKFhGU19BTExfUVVPVEFfQUNDVCB8IFhGU19BTExfUVVPVEFfRU5GRCk7CisKKwkvKgorCSAqIFdlIGRvbid0IHdhbnQgdG8gZGVhbCB3aXRoIHR3byBxdW90YW9mZnMgbWVzc2luZyB1cCBlYWNoIG90aGVyLAorCSAqIHNvIHdlJ3JlIGdvaW5nIHRvIHNlcmlhbGl6ZSBpdC4gcXVvdGFvZmYgaXNuJ3QgZXhhY3RseSBhIHBlcmZvcm1hbmNlCisJICogY3JpdGljYWwgdGhpbmcuCisJICogSWYgcXVvdGFvZmYsIHRoZW4gd2UgbXVzdCBiZSBkZWFsaW5nIHdpdGggdGhlIHJvb3QgZmlsZXN5c3RlbS4KKwkgKi8KKwlBU1NFUlQobXAtPm1fcXVvdGFpbmZvKTsKKwlpZiAobXAtPm1fcXVvdGFpbmZvKQorCQltdXRleF9sb2NrKCYoWEZTX1FJX1FPRkZMT0NLKG1wKSksIFBJTk9EKTsKKworCUFTU0VSVChtcC0+bV9xdW90YWluZm8pOworCisJLyoKKwkgKiBJZiB3ZSdyZSBqdXN0IHR1cm5pbmcgb2ZmIHF1b3RhIGVuZm9yY2VtZW50LCBjaGFuZ2UgbXAgYW5kIGdvLgorCSAqLworCWlmICgoZmxhZ3MgJiBYRlNfQUxMX1FVT1RBX0FDQ1QpID09IDApIHsKKwkJbXAtPm1fcWZsYWdzICY9IH4oZmxhZ3MpOworCisJCXMgPSBYRlNfU0JfTE9DSyhtcCk7CisJCW1wLT5tX3NiLnNiX3FmbGFncyA9IG1wLT5tX3FmbGFnczsKKwkJWEZTX1NCX1VOTE9DSyhtcCwgcyk7CisJCW11dGV4X3VubG9jaygmKFhGU19RSV9RT0ZGTE9DSyhtcCkpKTsKKworCQkvKiBYWFggd2hhdCB0byBkbyBpZiBlcnJvciA/IFJldmVydCBiYWNrIHRvIG9sZCB2YWxzIGluY29yZSA/ICovCisJCWVycm9yID0geGZzX3FtX3dyaXRlX3NiX2NoYW5nZXMobXAsIFhGU19TQl9RRkxBR1MpOworCQlyZXR1cm4gKGVycm9yKTsKKwl9CisKKwlkcXR5cGUgPSAwOworCWluYWN0aXZhdGVfZmxhZ3MgPSAwOworCS8qCisJICogSWYgYWNjb3VudGluZyBpcyBvZmYsIHdlIG11c3QgdHVybiBlbmZvcmNlbWVudCBvZmYsIGNsZWFyIHRoZQorCSAqIHF1b3RhICdDSEtEJyBjZXJ0aWZpY2F0ZSB0byBtYWtlIGl0IGtub3duIHRoYXQgd2UgaGF2ZSB0bworCSAqIGRvIGEgcXVvdGFjaGVjayB0aGUgbmV4dCB0aW1lIHRoaXMgcXVvdGEgaXMgdHVybmVkIG9uLgorCSAqLworCWlmIChmbGFncyAmIFhGU19VUVVPVEFfQUNDVCkgeworCQlkcXR5cGUgfD0gWEZTX1FNT1BUX1VRVU9UQTsKKwkJZmxhZ3MgfD0gKFhGU19VUVVPVEFfQ0hLRCB8IFhGU19VUVVPVEFfRU5GRCk7CisJCWluYWN0aXZhdGVfZmxhZ3MgfD0gWEZTX1VRVU9UQV9BQ1RJVkU7CisJfQorCWlmIChmbGFncyAmIFhGU19HUVVPVEFfQUNDVCkgeworCQlkcXR5cGUgfD0gWEZTX1FNT1BUX0dRVU9UQTsKKwkJZmxhZ3MgfD0gKFhGU19HUVVPVEFfQ0hLRCB8IFhGU19HUVVPVEFfRU5GRCk7CisJCWluYWN0aXZhdGVfZmxhZ3MgfD0gWEZTX0dRVU9UQV9BQ1RJVkU7CisJfQorCisJLyoKKwkgKiBOb3RoaW5nIHRvIGRvPyAgRG9uJ3QgY29tcGxhaW4uIFRoaXMgaGFwcGVucyB3aGVuIHdlJ3JlIGp1c3QKKwkgKiB0dXJuaW5nIG9mZiBxdW90YSBlbmZvcmNlbWVudC4KKwkgKi8KKwlpZiAoKG1wLT5tX3FmbGFncyAmIGZsYWdzKSA9PSAwKSB7CisJCW11dGV4X3VubG9jaygmKFhGU19RSV9RT0ZGTE9DSyhtcCkpKTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwkvKgorCSAqIFdyaXRlIHRoZSBMSV9RVU9UQU9GRiBsb2cgcmVjb3JkLCBhbmQgZG8gU0IgY2hhbmdlcyBhdG9taWNhbGx5LAorCSAqIGFuZCBzeW5jaHJvbm91c2x5LgorCSAqLworCXhmc19xbV9sb2dfcXVvdGFvZmYobXAsICZxb2Zmc3RhcnQsIGZsYWdzKTsKKworCS8qCisJICogTmV4dCB3ZSBjbGVhciB0aGUgWEZTX01PVU5UXypEUV9BQ1RJVkUgYml0KHMpIGluIHRoZSBtb3VudCBzdHJ1Y3QKKwkgKiB0byB0YWtlIGNhcmUgb2YgdGhlIHJhY2UgYmV0d2VlbiBkcWdldCBhbmQgcXVvdGFvZmYuIFdlIGRvbid0IHRha2UKKwkgKiBhbnkgc3BlY2lhbCBsb2NrcyB0byByZXNldCB0aGVzZSBiaXRzLiBBbGwgcHJvY2Vzc2VzIG5lZWQgdG8gY2hlY2sKKwkgKiB0aGVzZSBiaXRzICphZnRlciogdGFraW5nIGlub2RlIGxvY2socykgdG8gc2VlIGlmIHRoZSBwYXJ0aWN1bGFyCisJICogcXVvdGEgdHlwZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyB0dXJuZWQgb2ZmLiBJZiAqQUNUSVZFLCBpdCBpcworCSAqIGd1YXJhbnRlZWQgdGhhdCBhbGwgZHF1b3Qgc3RydWN0dXJlcyBhbmQgYWxsIHF1b3RhaW5vZGUgcHRycyB3aWxsIGFsbAorCSAqIHN0YXkgdmFsaWQgYXMgbG9uZyBhcyB0aGF0IGlub2RlIGlzIGtlcHQgbG9ja2VkLgorCSAqCisJICogVGhlcmUgaXMgbm8gdHVybmluZyBiYWNrIGFmdGVyIHRoaXMuCisJICovCisJbXAtPm1fcWZsYWdzICY9IH5pbmFjdGl2YXRlX2ZsYWdzOworCisJLyoKKwkgKiBHaXZlIGJhY2sgYWxsIHRoZSBkcXVvdCByZWZlcmVuY2UocykgaGVsZCBieSBpbm9kZXMuCisJICogSGVyZSB3ZSBnbyB0aHJ1IGV2ZXJ5IHNpbmdsZSBpbmNvcmUgaW5vZGUgaW4gdGhpcyBmaWxlIHN5c3RlbSwgYW5kCisJICogZG8gYSBkcXJlbGUgb24gdGhlIGlfdWRxdW90L2lfZ2RxdW90IHRoYXQgaXQgbWF5IGhhdmUuCisJICogRXNzZW50aWFsbHksIGFzIGxvbmcgYXMgc29tZWJvZHkgaGFzIGFuIGlub2RlIGxvY2tlZCwgdGhpcyBndWFyYW50ZWVzCisJICogdGhhdCBxdW90YXMgd2lsbCBub3QgYmUgdHVybmVkIG9mZi4gVGhpcyBpcyBoYW5keSBiZWNhdXNlIGluIGEKKwkgKiB0cmFuc2FjdGlvbiBvbmNlIHdlIGxvY2sgdGhlIGlub2RlKHMpIGFuZCBjaGVjayBmb3IgcXVvdGFvbiwgd2UgY2FuCisJICogZGVwZW5kIG9uIHRoZSBxdW90YSBpbm9kZXMgKGFuZCBvdGhlciB0aGluZ3MpIGJlaW5nIHZhbGlkIGFzIGxvbmcgYXMKKwkgKiB3ZSBrZWVwIHRoZSBsb2NrKHMpLgorCSAqLworCXhmc19xbV9kcXJlbGVfYWxsX2lub2RlcyhtcCwgZmxhZ3MpOworCisJLyoKKwkgKiBOZXh0IHdlIG1ha2UgdGhlIGNoYW5nZXMgaW4gdGhlIHF1b3RhIGZsYWcgaW4gdGhlIG1vdW50IHN0cnVjdC4KKwkgKiBUaGlzIGlzbid0IHByb3RlY3RlZCBieSBhIHBhcnRpY3VsYXIgbG9jayBkaXJlY3RseSwgYmVjYXVzZSB3ZQorCSAqIGRvbid0IHdhbnQgdG8gdGFrZSBhIG1ybG9jayBldmVyeXRpbWUgd2UgZGVwZW5kIG9uIHF1b3RhcyBiZWluZyBvbi4KKwkgKi8KKwltcC0+bV9xZmxhZ3MgJj0gfihmbGFncyk7CisKKwkvKgorCSAqIEdvIHRocm91Z2ggYWxsIHRoZSBkcXVvdHMgb2YgdGhpcyBmaWxlIHN5c3RlbSBhbmQgcHVyZ2UgdGhlbSwKKwkgKiBhY2NvcmRpbmcgdG8gd2hhdCB3YXMgdHVybmVkIG9mZi4gV2UgbWF5IG5vdCBiZSBhYmxlIHRvIGdldCByaWQKKwkgKiBvZiBhbGwgZHF1b3RzLCBiZWNhdXNlIGRxdW90cyBjYW4gaGF2ZSB0ZW1wb3JhcnkgcmVmZXJlbmNlcyB0aGF0CisJICogYXJlIG5vdCBhdHRhY2hlZCB0byBpbm9kZXMuIGVnLiB4ZnNfc2V0YXR0ciwgeGZzX2NyZWF0ZS4KKwkgKiBTbywgaWYgd2UgY291bGRuJ3QgcHVyZ2UgYWxsIHRoZSBkcXVvdHMgZnJvbSB0aGUgZmlsZXN5c3RlbSwKKwkgKiB3ZSBjYW4ndCBnZXQgcmlkIG9mIHRoZSBpbmNvcmUgZGF0YSBzdHJ1Y3R1cmVzLgorCSAqLworCXdoaWxlICgobmN1bHByaXRzID0geGZzX3FtX2RxcHVyZ2VfYWxsKG1wLCBkcXR5cGV8WEZTX1FNT1BUX1FVT1RBT0ZGKSkpCisJCWRlbGF5KDEwICogbmN1bHByaXRzKTsKKworCS8qCisJICogVHJhbnNhY3Rpb25zIHRoYXQgaGFkIHN0YXJ0ZWQgYmVmb3JlIEFDVElWRSBzdGF0ZSBiaXQgd2FzIGNsZWFyZWQKKwkgKiBjb3VsZCBoYXZlIGxvZ2dlZCBtYW55IGRxdW90cywgc28gdGhleSdkIGhhdmUgaGlnaGVyIExTTnMgdGhhbgorCSAqIHRoZSBmaXJzdCBRVU9UQU9GRiBsb2cgcmVjb3JkIGRvZXMuIElmIHdlIGhhcHBlbiB0byBjcmFzaCB3aGVuCisJICogdGhlIHRhaWwgb2YgdGhlIGxvZyBoYXMgZ29uZSBwYXN0IHRoZSBRVU9UQU9GRiByZWNvcmQsIGJ1dAorCSAqIGJlZm9yZSB0aGUgbGFzdCBkcXVvdCBtb2RpZmljYXRpb24sIHRob3NlIGRxdW90cyBfX3dpbGxfXworCSAqIHJlY292ZXIsIGFuZCB0aGF0J3Mgbm90IGdvb2QuCisJICoKKwkgKiBTbywgd2UgaGF2ZSBRVU9UQU9GRiBzdGFydCBhbmQgZW5kIGxvZ2l0ZW1zOyB0aGUgc3RhcnQKKwkgKiBsb2dpdGVtIHdvbid0IGdldCBvdmVyd3JpdHRlbiB1bnRpbCB0aGUgZW5kIGxvZ2l0ZW0gYXBwZWFycy4uLgorCSAqLworCXhmc19xbV9sb2dfcXVvdGFvZmZfZW5kKG1wLCBxb2Zmc3RhcnQsIGZsYWdzKTsKKworCS8qCisJICogSWYgcXVvdGFzIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQsIGNsb3NlIHNob3AuCisJICovCisJaWYgKChmbGFncyAmIFhGU19NT1VOVF9RVU9UQV9BTEwpID09IFhGU19NT1VOVF9RVU9UQV9BTEwpIHsKKwkJbXV0ZXhfdW5sb2NrKCYoWEZTX1FJX1FPRkZMT0NLKG1wKSkpOworCQl4ZnNfcW1fZGVzdHJveV9xdW90YWluZm8obXApOworCQlyZXR1cm4gKDApOworCX0KKworCS8qCisJICogUmVsZWFzZSBvdXIgcXVvdGFpbm9kZSByZWZlcmVuY2VzLCBhbmQgdm5fcHVyZ2UgdGhlbSwKKwkgKiBpZiB3ZSBkb24ndCBuZWVkIHRoZW0gYW55bW9yZS4KKwkgKi8KKwlpZiAoKGRxdHlwZSAmIFhGU19RTU9QVF9VUVVPVEEpICYmIFhGU19RSV9VUUlQKG1wKSkgeworCQlYRlNfUFVSR0VfSU5PREUoWEZTX1FJX1VRSVAobXApKTsKKwkJWEZTX1FJX1VRSVAobXApID0gTlVMTDsKKwl9CisJaWYgKChkcXR5cGUgJiBYRlNfUU1PUFRfR1FVT1RBKSAmJiBYRlNfUUlfR1FJUChtcCkpIHsKKwkJWEZTX1BVUkdFX0lOT0RFKFhGU19RSV9HUUlQKG1wKSk7CisJCVhGU19RSV9HUUlQKG1wKSA9IE5VTEw7CisJfQorCW11dGV4X3VubG9jaygmKFhGU19RSV9RT0ZGTE9DSyhtcCkpKTsKKworCXJldHVybiAoZXJyb3IpOworfQorCitTVEFUSUMgaW50Cit4ZnNfcW1fc2NhbGxfdHJ1bmNfcWZpbGVzKAorCXhmc19tb3VudF90CSptcCwKKwl1aW50CQlmbGFncykKK3sKKwlpbnQJCWVycm9yOworCXhmc19pbm9kZV90CSpxaXA7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiBYRlNfRVJST1IoRVBFUk0pOworCWVycm9yID0gMDsKKwlpZiAoIVhGU19TQl9WRVJTSU9OX0hBU1FVT1RBKCZtcC0+bV9zYikgfHwgZmxhZ3MgPT0gMCkgeworCQlxZHByaW50aygicXRydW5jIGZsYWdzPSV4IG1fcWZsYWdzPSV4XG4iLCBmbGFncywgbXAtPm1fcWZsYWdzKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKworCWlmICgoZmxhZ3MgJiBYRlNfRFFfVVNFUikgJiYgbXAtPm1fc2Iuc2JfdXF1b3Rpbm8gIT0gTlVMTEZTSU5PKSB7CisJCWVycm9yID0geGZzX2lnZXQobXAsIE5VTEwsIG1wLT5tX3NiLnNiX3VxdW90aW5vLCAwLCAwLCAmcWlwLCAwKTsKKwkJaWYgKCEgZXJyb3IpIHsKKwkJCSh2b2lkKSB4ZnNfdHJ1bmNhdGVfZmlsZShtcCwgcWlwKTsKKwkJCVZOX1JFTEUoWEZTX0lUT1YocWlwKSk7CisJCX0KKwl9CisKKwlpZiAoKGZsYWdzICYgWEZTX0RRX0dST1VQKSAmJiBtcC0+bV9zYi5zYl9ncXVvdGlubyAhPSBOVUxMRlNJTk8pIHsKKwkJZXJyb3IgPSB4ZnNfaWdldChtcCwgTlVMTCwgbXAtPm1fc2Iuc2JfZ3F1b3Rpbm8sIDAsIDAsICZxaXAsIDApOworCQlpZiAoISBlcnJvcikgeworCQkJKHZvaWQpIHhmc190cnVuY2F0ZV9maWxlKG1wLCBxaXApOworCQkJVk5fUkVMRShYRlNfSVRPVihxaXApKTsKKwkJfQorCX0KKworCXJldHVybiAoZXJyb3IpOworfQorCisKKy8qCisgKiBTd2l0Y2ggb24gKGEgZ2l2ZW4pIHF1b3RhIGVuZm9yY2VtZW50IGZvciBhIGZpbGVzeXN0ZW0uICBUaGlzIHRha2VzCisgKiBlZmZlY3QgaW1tZWRpYXRlbHkuCisgKiAoU3dpdGNoaW5nIG9uIHF1b3RhIGFjY291bnRpbmcgbXVzdCBiZSBkb25lIGF0IG1vdW50IHRpbWUuKQorICovCitTVEFUSUMgaW50Cit4ZnNfcW1fc2NhbGxfcXVvdGFvbigKKwl4ZnNfbW91bnRfdAkqbXAsCisJdWludAkJZmxhZ3MpCit7CisJaW50CQllcnJvcjsKKwl1bnNpZ25lZCBsb25nIHM7CisJdWludAkJcWY7CisJdWludAkJYWNjZmxhZ3M7CisJX19pbnQ2NF90CXNiZmxhZ3M7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiBYRlNfRVJST1IoRVBFUk0pOworCisJZmxhZ3MgJj0gKFhGU19BTExfUVVPVEFfQUNDVCB8IFhGU19BTExfUVVPVEFfRU5GRCk7CisJLyoKKwkgKiBTd2l0Y2hpbmcgb24gcXVvdGEgYWNjb3VudGluZyBtdXN0IGJlIGRvbmUgYXQgbW91bnQgdGltZS4KKwkgKi8KKwlhY2NmbGFncyA9IGZsYWdzICYgWEZTX0FMTF9RVU9UQV9BQ0NUOworCWZsYWdzICY9IH4oWEZTX0FMTF9RVU9UQV9BQ0NUKTsKKworCXNiZmxhZ3MgPSAwOworCisJaWYgKGZsYWdzID09IDApIHsKKwkJcWRwcmludGsoInF1b3Rhb246IHplcm8gZmxhZ3MsIG1fcWZsYWdzPSV4XG4iLCBtcC0+bV9xZmxhZ3MpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJfQorCisJLyogTm8gZnMgY2FuIHR1cm4gb24gcXVvdGFzIHdpdGggYSBkZWxheWVkIGVmZmVjdCAqLworCUFTU0VSVCgoZmxhZ3MgJiBYRlNfQUxMX1FVT1RBX0FDQ1QpID09IDApOworCisJLyoKKwkgKiBDYW4ndCBlbmZvcmNlIHdpdGhvdXQgYWNjb3VudGluZy4gV2UgY2hlY2sgdGhlIHN1cGVyYmxvY2sKKwkgKiBxZmxhZ3MgaGVyZSBpbnN0ZWFkIG9mIG1fcWZsYWdzIGJlY2F1c2Ugcm9vdGZzIGNhbiBoYXZlCisJICogcXVvdGEgYWNjdCBvbiBvbmRpc2sgd2l0aG91dCBtX3FmbGFncycga25vd2luZy4KKwkgKi8KKwlpZiAoKChmbGFncyAmIFhGU19VUVVPVEFfQUNDVCkgPT0gMCAmJgorCSAgICAobXAtPm1fc2Iuc2JfcWZsYWdzICYgWEZTX1VRVU9UQV9BQ0NUKSA9PSAwICYmCisJICAgIChmbGFncyAmIFhGU19VUVVPVEFfRU5GRCkpCisJICAgIHx8CisJICAgICgoZmxhZ3MgJiBYRlNfR1FVT1RBX0FDQ1QpID09IDAgJiYKKwkgICAgKG1wLT5tX3NiLnNiX3FmbGFncyAmIFhGU19HUVVPVEFfQUNDVCkgPT0gMCAmJgorCSAgICAoZmxhZ3MgJiBYRlNfR1FVT1RBX0VORkQpKSkgeworCQlxZHByaW50aygiQ2FuJ3QgZW5mb3JjZSB3aXRob3V0IGFjY3QsIGZsYWdzPSV4IHNiZmxhZ3M9JXhcbiIsCisJCQlmbGFncywgbXAtPm1fc2Iuc2JfcWZsYWdzKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKwkvKgorCSAqIElmIGV2ZXJ5dGhpbmcncyB1cHRvLWRhdGUgaW5jb3JlLCB0aGVuIGRvbid0IHdhc3RlIHRpbWUuCisJICovCisJaWYgKChtcC0+bV9xZmxhZ3MgJiBmbGFncykgPT0gZmxhZ3MpCisJCXJldHVybiBYRlNfRVJST1IoRUVYSVNUKTsKKworCS8qCisJICogQ2hhbmdlIHNiX3FmbGFncyBvbiBkaXNrIGJ1dCBub3QgaW5jb3JlIG1wLT5xZmxhZ3MKKwkgKiBpZiB0aGlzIGlzIHRoZSByb290IGZpbGVzeXN0ZW0uCisJICovCisJcyA9IFhGU19TQl9MT0NLKG1wKTsKKwlxZiA9IG1wLT5tX3NiLnNiX3FmbGFnczsKKwltcC0+bV9zYi5zYl9xZmxhZ3MgPSBxZiB8IGZsYWdzOworCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCisJLyoKKwkgKiBUaGVyZSdzIG5vdGhpbmcgdG8gY2hhbmdlIGlmIGl0J3MgdGhlIHNhbWUuCisJICovCisJaWYgKChxZiAmIGZsYWdzKSA9PSBmbGFncyAmJiBzYmZsYWdzID09IDApCisJCXJldHVybiBYRlNfRVJST1IoRUVYSVNUKTsKKwlzYmZsYWdzIHw9IFhGU19TQl9RRkxBR1M7CisKKwlpZiAoKGVycm9yID0geGZzX3FtX3dyaXRlX3NiX2NoYW5nZXMobXAsIHNiZmxhZ3MpKSkKKwkJcmV0dXJuIChlcnJvcik7CisJLyoKKwkgKiBJZiB3ZSBhcmVuJ3QgdHJ5aW5nIHRvIHN3aXRjaCBvbiBxdW90YSBlbmZvcmNlbWVudCwgd2UgYXJlIGRvbmUuCisJICovCisJaWYgICgoKG1wLT5tX3NiLnNiX3FmbGFncyAmIFhGU19VUVVPVEFfQUNDVCkgIT0KKwkgICAgIChtcC0+bV9xZmxhZ3MgJiBYRlNfVVFVT1RBX0FDQ1QpKSB8fAorCSAgICAoZmxhZ3MgJiBYRlNfQUxMX1FVT1RBX0VORkQpID09IDApCisJCXJldHVybiAoMCk7CisKKwlpZiAoISBYRlNfSVNfUVVPVEFfUlVOTklORyhtcCkpCisJCXJldHVybiBYRlNfRVJST1IoRVNSQ0gpOworCisJLyoKKwkgKiBTd2l0Y2ggb24gcXVvdGEgZW5mb3JjZW1lbnQgaW4gY29yZS4KKwkgKi8KKwltdXRleF9sb2NrKCYoWEZTX1FJX1FPRkZMT0NLKG1wKSksIFBJTk9EKTsKKwltcC0+bV9xZmxhZ3MgfD0gKGZsYWdzICYgWEZTX0FMTF9RVU9UQV9FTkZEKTsKKwltdXRleF91bmxvY2soJihYRlNfUUlfUU9GRkxPQ0sobXApKSk7CisKKwlyZXR1cm4gKDApOworfQorCisKKworLyoKKyAqIFJldHVybiBxdW90YSBzdGF0dXMgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdXF1b3RhLW9mZiwgZW5mb3JjZW1lbnRzLCBldGMuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19xbV9zY2FsbF9nZXRxc3RhdCgKKwl4ZnNfbW91bnRfdAkqbXAsCisJZnNfcXVvdGFfc3RhdF90ICpvdXQpCit7CisJeGZzX2lub2RlX3QJKnVpcCwgKmdpcDsKKwlib29sZWFuX3QJdGVtcHVxaXAsIHRlbXBncWlwOworCisJdWlwID0gZ2lwID0gTlVMTDsKKwl0ZW1wdXFpcCA9IHRlbXBncWlwID0gQl9GQUxTRTsKKwltZW1zZXQob3V0LCAwLCBzaXplb2YoZnNfcXVvdGFfc3RhdF90KSk7CisKKwlvdXQtPnFzX3ZlcnNpb24gPSBGU19RU1RBVF9WRVJTSU9OOworCWlmICghIFhGU19TQl9WRVJTSU9OX0hBU1FVT1RBKCZtcC0+bV9zYikpIHsKKwkJb3V0LT5xc191cXVvdGEucWZzX2lubyA9IE5VTExGU0lOTzsKKwkJb3V0LT5xc19ncXVvdGEucWZzX2lubyA9IE5VTExGU0lOTzsKKwkJcmV0dXJuICgwKTsKKwl9CisJb3V0LT5xc19mbGFncyA9IChfX3VpbnQxNl90KSB4ZnNfcW1fZXhwb3J0X2ZsYWdzKG1wLT5tX3FmbGFncyAmCisJCQkJCQkJKFhGU19BTExfUVVPVEFfQUNDVHwKKwkJCQkJCQkgWEZTX0FMTF9RVU9UQV9FTkZEKSk7CisJb3V0LT5xc19wYWQgPSAwOworCW91dC0+cXNfdXF1b3RhLnFmc19pbm8gPSBtcC0+bV9zYi5zYl91cXVvdGlubzsKKwlvdXQtPnFzX2dxdW90YS5xZnNfaW5vID0gbXAtPm1fc2Iuc2JfZ3F1b3Rpbm87CisKKwlpZiAobXAtPm1fcXVvdGFpbmZvKSB7CisJCXVpcCA9IG1wLT5tX3F1b3RhaW5mby0+cWlfdXF1b3RhaXA7CisJCWdpcCA9IG1wLT5tX3F1b3RhaW5mby0+cWlfZ3F1b3RhaXA7CisJfQorCWlmICghdWlwICYmIG1wLT5tX3NiLnNiX3VxdW90aW5vICE9IE5VTExGU0lOTykgeworCQlpZiAoeGZzX2lnZXQobXAsIE5VTEwsIG1wLT5tX3NiLnNiX3VxdW90aW5vLAorCQkJCQkwLCAwLCAmdWlwLCAwKSA9PSAwKQorCQkJdGVtcHVxaXAgPSBCX1RSVUU7CisJfQorCWlmICghZ2lwICYmIG1wLT5tX3NiLnNiX2dxdW90aW5vICE9IE5VTExGU0lOTykgeworCQlpZiAoeGZzX2lnZXQobXAsIE5VTEwsIG1wLT5tX3NiLnNiX2dxdW90aW5vLAorCQkJCQkwLCAwLCAmZ2lwLCAwKSA9PSAwKQorCQkJdGVtcGdxaXAgPSBCX1RSVUU7CisJfQorCWlmICh1aXApIHsKKwkJb3V0LT5xc191cXVvdGEucWZzX25ibGtzID0gdWlwLT5pX2QuZGlfbmJsb2NrczsKKwkJb3V0LT5xc191cXVvdGEucWZzX25leHRlbnRzID0gdWlwLT5pX2QuZGlfbmV4dGVudHM7CisJCWlmICh0ZW1wdXFpcCkKKwkJCVZOX1JFTEUoWEZTX0lUT1YodWlwKSk7CisJfQorCWlmIChnaXApIHsKKwkJb3V0LT5xc19ncXVvdGEucWZzX25ibGtzID0gZ2lwLT5pX2QuZGlfbmJsb2NrczsKKwkJb3V0LT5xc19ncXVvdGEucWZzX25leHRlbnRzID0gZ2lwLT5pX2QuZGlfbmV4dGVudHM7CisJCWlmICh0ZW1wZ3FpcCkKKwkJCVZOX1JFTEUoWEZTX0lUT1YoZ2lwKSk7CisJfQorCWlmIChtcC0+bV9xdW90YWluZm8pIHsKKwkJb3V0LT5xc19pbmNvcmVkcXMgPSBYRlNfUUlfTVBMTkRRVU9UUyhtcCk7CisJCW91dC0+cXNfYnRpbWVsaW1pdCA9IFhGU19RSV9CVElNRUxJTUlUKG1wKTsKKwkJb3V0LT5xc19pdGltZWxpbWl0ID0gWEZTX1FJX0lUSU1FTElNSVQobXApOworCQlvdXQtPnFzX3J0YnRpbWVsaW1pdCA9IFhGU19RSV9SVEJUSU1FTElNSVQobXApOworCQlvdXQtPnFzX2J3YXJubGltaXQgPSBYRlNfUUlfQldBUk5MSU1JVChtcCk7CisJCW91dC0+cXNfaXdhcm5saW1pdCA9IFhGU19RSV9JV0FSTkxJTUlUKG1wKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIEFkanVzdCBxdW90YSBsaW1pdHMsIGFuZCBzdGFydC9zdG9wIHRpbWVycyBhY2NvcmRpbmdseS4KKyAqLworU1RBVElDIGludAoreGZzX3FtX3NjYWxsX3NldHFsaW0oCisJeGZzX21vdW50X3QJCSptcCwKKwl4ZnNfZHFpZF90CQlpZCwKKwl1aW50CQkJdHlwZSwKKwlmc19kaXNrX3F1b3RhX3QJCSpuZXdsaW0pCit7CisJeGZzX2Rpc2tfZHF1b3RfdAkqZGRxOworCXhmc19kcXVvdF90CQkqZHFwOworCXhmc190cmFuc190CQkqdHA7CisJaW50CQkJZXJyb3I7CisJeGZzX3FjbnRfdAkJaGFyZCwgc29mdDsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFUEVSTSk7CisKKwlpZiAoKG5ld2xpbS0+ZF9maWVsZG1hc2sgJiAoRlNfRFFfTElNSVRfTUFTS3xGU19EUV9USU1FUl9NQVNLKSkgPT0gMCkKKwkJcmV0dXJuICgwKTsKKworCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfUU1fU0VUUUxJTSk7CisJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLCBzaXplb2YoeGZzX2Rpc2tfZHF1b3RfdCkgKyAxMjgsCisJCQkJICAgICAgMCwgMCwgWEZTX0RFRkFVTFRfTE9HX0NPVU5UKSkpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCXJldHVybiAoZXJyb3IpOworCX0KKworCS8qCisJICogV2UgZG9uJ3Qgd2FudCB0byByYWNlIHdpdGggYSBxdW90YW9mZiBzbyB0YWtlIHRoZSBxdW90YW9mZiBsb2NrLgorCSAqIChXZSBkb24ndCBob2xkIGFuIGlub2RlIGxvY2ssIHNvIHRoZXJlJ3Mgbm90aGluZyBlbHNlIHRvIHN0b3AKKwkgKiBhIHF1b3Rhb2ZmIGZyb20gaGFwcGVuaW5nKS4gKFhYWFRoaXMgZG9lc24ndCBjdXJyZW50bHkgaGFwcGVuCisJICogYmVjYXVzZSB3ZSB0YWtlIHRoZSB2ZnNsb2NrIGJlZm9yZSBjYWxsaW5nIHhmc19xbV9zeXNlbnQpLgorCSAqLworCW11dGV4X2xvY2soJihYRlNfUUlfUU9GRkxPQ0sobXApKSwgUElOT0QpOworCisJLyoKKwkgKiBHZXQgdGhlIGRxdW90IChsb2NrZWQpLCBhbmQgam9pbiBpdCB0byB0aGUgdHJhbnNhY3Rpb24uCisJICogQWxsb2NhdGUgdGhlIGRxdW90IGlmIHRoaXMgZG9lc24ndCBleGlzdC4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX3FtX2RxZ2V0KG1wLCBOVUxMLCBpZCwgdHlwZSwgWEZTX1FNT1BUX0RRQUxMT0MsICZkcXApKSkgeworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBYRlNfVFJBTlNfQUJPUlQpOworCQltdXRleF91bmxvY2soJihYRlNfUUlfUU9GRkxPQ0sobXApKSk7CisJCUFTU0VSVChlcnJvciAhPSBFTk9FTlQpOworCQlyZXR1cm4gKGVycm9yKTsKKwl9CisJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiUV9TRVRRTElNOiBBRlQgRFFHRVQiKTsKKwl4ZnNfdHJhbnNfZHFqb2luKHRwLCBkcXApOworCWRkcSA9ICZkcXAtPnFfY29yZTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgaGFyZGxpbWl0cyBhcmUgPj0gc29mdCBsaW1pdHMgYmVmb3JlIGNoYW5naW5nLgorCSAqLworCWhhcmQgPSAobmV3bGltLT5kX2ZpZWxkbWFzayAmIEZTX0RRX0JIQVJEKSA/CisJCSh4ZnNfcWNudF90KSBYRlNfQkJfVE9fRlNCKG1wLCBuZXdsaW0tPmRfYmxrX2hhcmRsaW1pdCkgOgorCQkJSU5UX0dFVChkZHEtPmRfYmxrX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKTsKKwlzb2Z0ID0gKG5ld2xpbS0+ZF9maWVsZG1hc2sgJiBGU19EUV9CU09GVCkgPworCQkoeGZzX3FjbnRfdCkgWEZTX0JCX1RPX0ZTQihtcCwgbmV3bGltLT5kX2Jsa19zb2Z0bGltaXQpIDoKKwkJCUlOVF9HRVQoZGRxLT5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCk7CisJaWYgKGhhcmQgPT0gMCB8fCBoYXJkID49IHNvZnQpIHsKKwkJSU5UX1NFVChkZHEtPmRfYmxrX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJULCBoYXJkKTsKKwkJSU5UX1NFVChkZHEtPmRfYmxrX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJULCBzb2Z0KTsKKwkJaWYgKGlkID09IDApIHsKKwkJCW1wLT5tX3F1b3RhaW5mby0+cWlfYmhhcmRsaW1pdCA9IGhhcmQ7CisJCQltcC0+bV9xdW90YWluZm8tPnFpX2Jzb2Z0bGltaXQgPSBzb2Z0OworCQl9CisJfSBlbHNlIHsKKwkJcWRwcmludGsoImJsa2hhcmQgJUxkIDwgYmxrc29mdCAlTGRcbiIsIGhhcmQsIHNvZnQpOworCX0KKwloYXJkID0gKG5ld2xpbS0+ZF9maWVsZG1hc2sgJiBGU19EUV9SVEJIQVJEKSA/CisJCSh4ZnNfcWNudF90KSBYRlNfQkJfVE9fRlNCKG1wLCBuZXdsaW0tPmRfcnRiX2hhcmRsaW1pdCkgOgorCQkJSU5UX0dFVChkZHEtPmRfcnRiX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKTsKKwlzb2Z0ID0gKG5ld2xpbS0+ZF9maWVsZG1hc2sgJiBGU19EUV9SVEJTT0ZUKSA/CisJCSh4ZnNfcWNudF90KSBYRlNfQkJfVE9fRlNCKG1wLCBuZXdsaW0tPmRfcnRiX3NvZnRsaW1pdCkgOgorCQkJSU5UX0dFVChkZHEtPmRfcnRiX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKTsKKwlpZiAoaGFyZCA9PSAwIHx8IGhhcmQgPj0gc29mdCkgeworCQlJTlRfU0VUKGRkcS0+ZF9ydGJfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQsIGhhcmQpOworCQlJTlRfU0VUKGRkcS0+ZF9ydGJfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQsIHNvZnQpOworCQlpZiAoaWQgPT0gMCkgeworCQkJbXAtPm1fcXVvdGFpbmZvLT5xaV9ydGJoYXJkbGltaXQgPSBoYXJkOworCQkJbXAtPm1fcXVvdGFpbmZvLT5xaV9ydGJzb2Z0bGltaXQgPSBzb2Z0OworCQl9CisJfSBlbHNlIHsKKwkJcWRwcmludGsoInJ0YmhhcmQgJUxkIDwgcnRic29mdCAlTGRcbiIsIGhhcmQsIHNvZnQpOworCX0KKworCWhhcmQgPSAobmV3bGltLT5kX2ZpZWxkbWFzayAmIEZTX0RRX0lIQVJEKSA/CisJCSh4ZnNfcWNudF90KSBuZXdsaW0tPmRfaW5vX2hhcmRsaW1pdCA6CisJCQlJTlRfR0VUKGRkcS0+ZF9pbm9faGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpOworCXNvZnQgPSAobmV3bGltLT5kX2ZpZWxkbWFzayAmIEZTX0RRX0lTT0ZUKSA/CisJCSh4ZnNfcWNudF90KSBuZXdsaW0tPmRfaW5vX3NvZnRsaW1pdCA6CisJCQlJTlRfR0VUKGRkcS0+ZF9pbm9fc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpOworCWlmIChoYXJkID09IDAgfHwgaGFyZCA+PSBzb2Z0KSB7CisJCUlOVF9TRVQoZGRxLT5kX2lub19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCwgaGFyZCk7CisJCUlOVF9TRVQoZGRxLT5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCwgc29mdCk7CisJCWlmIChpZCA9PSAwKSB7CisJCQltcC0+bV9xdW90YWluZm8tPnFpX2loYXJkbGltaXQgPSBoYXJkOworCQkJbXAtPm1fcXVvdGFpbmZvLT5xaV9pc29mdGxpbWl0ID0gc29mdDsKKwkJfQorCX0gZWxzZSB7CisJCXFkcHJpbnRrKCJpaGFyZCAlTGQgPCBpc29mdCAlTGRcbiIsIGhhcmQsIHNvZnQpOworCX0KKworCWlmIChpZCA9PSAwKSB7CisJCS8qCisJCSAqIFRpbWVsaW1pdHMgZm9yIHRoZSBzdXBlciB1c2VyIHNldCB0aGUgcmVsYXRpdmUgdGltZQorCQkgKiB0aGUgb3RoZXIgdXNlcnMgY2FuIGJlIG92ZXIgcXVvdGEgZm9yIHRoaXMgZmlsZSBzeXN0ZW0uCisJCSAqIElmIGl0IGlzIHplcm8gYSBkZWZhdWx0IGlzIHVzZWQuICBEaXR0byBmb3IgdGhlIGRlZmF1bHQKKwkJICogc29mdCBhbmQgaGFyZCBsaW1pdCB2YWx1ZXMgKGFscmVhZHkgZG9uZSwgYWJvdmUpLgorCQkgKi8KKwkJaWYgKG5ld2xpbS0+ZF9maWVsZG1hc2sgJiBGU19EUV9CVElNRVIpIHsKKwkJCW1wLT5tX3F1b3RhaW5mby0+cWlfYnRpbWVsaW1pdCA9IG5ld2xpbS0+ZF9idGltZXI7CisJCQlJTlRfU0VUKGRkcS0+ZF9idGltZXIsIEFSQ0hfQ09OVkVSVCwgbmV3bGltLT5kX2J0aW1lcik7CisJCX0KKwkJaWYgKG5ld2xpbS0+ZF9maWVsZG1hc2sgJiBGU19EUV9JVElNRVIpIHsKKwkJCW1wLT5tX3F1b3RhaW5mby0+cWlfaXRpbWVsaW1pdCA9IG5ld2xpbS0+ZF9pdGltZXI7CisJCQlJTlRfU0VUKGRkcS0+ZF9pdGltZXIsIEFSQ0hfQ09OVkVSVCwgbmV3bGltLT5kX2l0aW1lcik7CisJCX0KKwkJaWYgKG5ld2xpbS0+ZF9maWVsZG1hc2sgJiBGU19EUV9SVEJUSU1FUikgeworCQkJbXAtPm1fcXVvdGFpbmZvLT5xaV9ydGJ0aW1lbGltaXQgPSBuZXdsaW0tPmRfcnRidGltZXI7CisJCQlJTlRfU0VUKGRkcS0+ZF9ydGJ0aW1lciwgQVJDSF9DT05WRVJULCBuZXdsaW0tPmRfcnRidGltZXIpOworCQl9CisJfSBlbHNlIC8qIGlmIChYRlNfSVNfUVVPVEFfRU5GT1JDRUQobXApKSAqLyB7CisJCS8qCisJCSAqIElmIHRoZSB1c2VyIGlzIG5vdyBvdmVyIHF1b3RhLCBzdGFydCB0aGUgdGltZWxpbWl0LgorCQkgKiBUaGUgdXNlciB3aWxsIG5vdCBiZSAnd2FybmVkJy4KKwkJICogTm90ZSB0aGF0IHdlIGtlZXAgdGhlIHRpbWVycyB0aWNraW5nLCB3aGV0aGVyIGVuZm9yY2VtZW50CisJCSAqIGlzIG9uIG9yIG9mZi4gV2UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gYm90aGVyIHdpdGggaXRlcmF0aW5nCisJCSAqIG92ZXIgYWxsIG9uZGlzayBkcXVvdHMgYW5kIHR1cm5pbmcgdGhlIHRpbWVycyBvbi9vZmYuCisJCSAqLworCQl4ZnNfcW1fYWRqdXN0X2RxdGltZXJzKG1wLCBkZHEpOworCX0KKwlkcXAtPmRxX2ZsYWdzIHw9IFhGU19EUV9ESVJUWTsKKwl4ZnNfdHJhbnNfbG9nX2RxdW90KHRwLCBkcXApOworCisJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiUV9TRVRRTElNOiBDT01NSVQiKTsKKwl4ZnNfdHJhbnNfY29tbWl0KHRwLCAwLCBOVUxMKTsKKwl4ZnNfcW1fZHFwcmludChkcXApOworCXhmc19xbV9kcXJlbGUoZHFwKTsKKwltdXRleF91bmxvY2soJihYRlNfUUlfUU9GRkxPQ0sobXApKSk7CisKKwlyZXR1cm4gKDApOworfQorCitTVEFUSUMgaW50Cit4ZnNfcW1fc2NhbGxfZ2V0cXVvdGEoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19kcWlkX3QJaWQsCisJdWludAkJdHlwZSwKKwlmc19kaXNrX3F1b3RhX3QgKm91dCkKK3sKKwl4ZnNfZHF1b3RfdAkqZHFwOworCWludAkJZXJyb3I7CisKKwkvKgorCSAqIFRyeSB0byBnZXQgdGhlIGRxdW90LiBXZSBkb24ndCB3YW50IGl0IGFsbG9jYXRlZCBvbiBkaXNrLCBzbworCSAqIHdlIGFyZW4ndCBwYXNzaW5nIHRoZSBYRlNfUU1PUFRfRE9BTExPQyBmbGFnLiBJZiBpdCBkb2Vzbid0CisJICogZXhpc3QsIHdlJ2xsIGdldCBFTk9FTlQgYmFjay4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX3FtX2RxZ2V0KG1wLCBOVUxMLCBpZCwgdHlwZSwgMCwgJmRxcCkpKSB7CisJCXJldHVybiAoZXJyb3IpOworCX0KKworCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIlFfR0VUUVVPVEEgU1VDQ0VTUyIpOworCS8qCisJICogSWYgZXZlcnl0aGluZydzIE5VTEwsIHRoaXMgZHF1b3QgZG9lc24ndCBxdWl0ZSBleGlzdCBhcyBmYXIgYXMKKwkgKiBvdXIgdXRpbGl0eSBwcm9ncmFtcyBhcmUgY29uY2VybmVkLgorCSAqLworCWlmIChYRlNfSVNfRFFVT1RfVU5JTklUSUFMSVpFRChkcXApKSB7CisJCXhmc19xbV9kcXB1dChkcXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVOT0VOVCk7CisJfQorCS8qIHhmc19xbV9kcXByaW50KGRxcCk7ICovCisJLyoKKwkgKiBDb252ZXJ0IHRoZSBkaXNrIGRxdW90IHRvIHRoZSBleHBvcnRhYmxlIGZvcm1hdAorCSAqLworCXhmc19xbV9leHBvcnRfZHF1b3QobXAsICZkcXAtPnFfY29yZSwgb3V0KTsKKwl4ZnNfcW1fZHFwdXQoZHFwKTsKKwlyZXR1cm4gKGVycm9yID8gWEZTX0VSUk9SKEVGQVVMVCkgOiAwKTsKK30KKworCitTVEFUSUMgaW50Cit4ZnNfcW1fbG9nX3F1b3Rhb2ZmX2VuZCgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXhmc19xb2ZmX2xvZ2l0ZW1fdAkqc3RhcnRxb2ZmLAorCXVpbnQJCQlmbGFncykKK3sKKwl4ZnNfdHJhbnNfdAkgICAgICAgKnRwOworCWludAkJCWVycm9yOworCXhmc19xb2ZmX2xvZ2l0ZW1fdCAgICAgKnFvZmZpOworCisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19RTV9RVU9UQU9GRl9FTkQpOworCisJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLCBzaXplb2YoeGZzX3FvZmZfbG9naXRlbV90KSAqIDIsCisJCQkJICAgICAgMCwgMCwgWEZTX0RFRkFVTFRfTE9HX0NPVU5UKSkpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCXJldHVybiAoZXJyb3IpOworCX0KKworCXFvZmZpID0geGZzX3RyYW5zX2dldF9xb2ZmX2l0ZW0odHAsIHN0YXJ0cW9mZiwKKwkJCQkJZmxhZ3MgJiBYRlNfQUxMX1FVT1RBX0FDQ1QpOworCXhmc190cmFuc19sb2dfcXVvdGFvZmZfaXRlbSh0cCwgcW9mZmkpOworCisJLyoKKwkgKiBXZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBpcyBzZWN1cmUgb24gZGlzayBiZWZvcmUgd2UKKwkgKiByZXR1cm4gYW5kIGFjdHVhbGx5IHN0b3AgcXVvdGEgYWNjb3VudGluZy4gU28sIG1ha2UgaXQgc3luY2hyb25vdXMuCisJICogV2UgZG9uJ3QgY2FyZSBhYm91dCBxdW90b2ZmJ3MgcGVyZm9ybWFuY2UuCisJICovCisJeGZzX3RyYW5zX3NldF9zeW5jKHRwKTsKKwllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIDAsIE5VTEwpOworCXJldHVybiAoZXJyb3IpOworfQorCisKK1NUQVRJQyBpbnQKK3hmc19xbV9sb2dfcXVvdGFvZmYoCisJeGZzX21vdW50X3QJICAgICAgICptcCwKKwl4ZnNfcW9mZl9sb2dpdGVtX3QgICAgICoqcW9mZnN0YXJ0cCwKKwl1aW50CQkgICAgICAgZmxhZ3MpCit7CisJeGZzX3RyYW5zX3QJICAgICAgICp0cDsKKwlpbnQJCQllcnJvcjsKKwl1bnNpZ25lZCBsb25nCXM7CisJeGZzX3FvZmZfbG9naXRlbV90ICAgICAqcW9mZmk9TlVMTDsKKwl1aW50CQkJb2xkc2JxZmxhZz0wOworCisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19RTV9RVU9UQU9GRik7CisJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLAorCQkJCSAgICAgIHNpemVvZih4ZnNfcW9mZl9sb2dpdGVtX3QpICogMiArCisJCQkJICAgICAgbXAtPm1fc2Iuc2Jfc2VjdHNpemUgKyAxMjgsCisJCQkJICAgICAgMCwKKwkJCQkgICAgICAwLAorCQkJCSAgICAgIFhGU19ERUZBVUxUX0xPR19DT1VOVCkpKSB7CisJCWdvdG8gZXJyb3IwOworCX0KKworCXFvZmZpID0geGZzX3RyYW5zX2dldF9xb2ZmX2l0ZW0odHAsIE5VTEwsIGZsYWdzICYgWEZTX0FMTF9RVU9UQV9BQ0NUKTsKKwl4ZnNfdHJhbnNfbG9nX3F1b3Rhb2ZmX2l0ZW0odHAsIHFvZmZpKTsKKworCXMgPSBYRlNfU0JfTE9DSyhtcCk7CisJb2xkc2JxZmxhZyA9IG1wLT5tX3NiLnNiX3FmbGFnczsKKwltcC0+bV9zYi5zYl9xZmxhZ3MgPSAobXAtPm1fcWZsYWdzICYgfihmbGFncykpICYgWEZTX01PVU5UX1FVT1RBX0FMTDsKKwlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKworCXhmc19tb2Rfc2IodHAsIFhGU19TQl9RRkxBR1MpOworCisJLyoKKwkgKiBXZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBpcyBzZWN1cmUgb24gZGlzayBiZWZvcmUgd2UKKwkgKiByZXR1cm4gYW5kIGFjdHVhbGx5IHN0b3AgcXVvdGEgYWNjb3VudGluZy4gU28sIG1ha2UgaXQgc3luY2hyb25vdXMuCisJICogV2UgZG9uJ3QgY2FyZSBhYm91dCBxdW90b2ZmJ3MgcGVyZm9ybWFuY2UuCisJICovCisJeGZzX3RyYW5zX3NldF9zeW5jKHRwKTsKKwllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIDAsIE5VTEwpOworCitlcnJvcjA6CisJaWYgKGVycm9yKSB7CisJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQkvKgorCQkgKiBObyBvbmUgZWxzZSBpcyBtb2RpZnlpbmcgc2JfcWZsYWdzLCBzbyB0aGlzIGlzIE9LLgorCQkgKiBXZSBzdGlsbCBob2xkIHRoZSBxdW90YW9mZmxvY2suCisJCSAqLworCQlzID0gWEZTX1NCX0xPQ0sobXApOworCQltcC0+bV9zYi5zYl9xZmxhZ3MgPSBvbGRzYnFmbGFnOworCQlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKwl9CisJKnFvZmZzdGFydHAgPSBxb2ZmaTsKKwlyZXR1cm4gKGVycm9yKTsKK30KKworCisvKgorICogVHJhbnNsYXRlIGFuIGludGVybmFsIHN0eWxlIG9uLWRpc2stZHF1b3QgdG8gdGhlIGV4cG9ydGFibGUgZm9ybWF0LgorICogVGhlIG1haW4gZGlmZmVyZW5jZXMgYXJlIHRoYXQgdGhlIGNvdW50ZXJzL2xpbWl0cyBhcmUgYWxsIGluIEJhc2ljCisgKiBCbG9ja3MgKEJCcykgaW5zdGVhZCBvZiB0aGUgaW50ZXJuYWwgRlNCcywgYW5kIGFsbCBvbi1kaXNrIGRhdGEgaGFzCisgKiB0byBiZSBjb252ZXJ0ZWQgdG8gdGhlIG5hdGl2ZSBlbmRpYW5uZXNzLgorICovCitTVEFUSUMgdm9pZAoreGZzX3FtX2V4cG9ydF9kcXVvdCgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXhmc19kaXNrX2RxdW90X3QJKnNyYywKKwlzdHJ1Y3QgZnNfZGlza19xdW90YQkqZHN0KQoreworCW1lbXNldChkc3QsIDAsIHNpemVvZigqZHN0KSk7CisJZHN0LT5kX3ZlcnNpb24gPSBGU19EUVVPVF9WRVJTSU9OOyAgLyogZGlmZmVyZW50IGZyb20gc3JjLT5kX3ZlcnNpb24gKi8KKwlkc3QtPmRfZmxhZ3MgPQorCQl4ZnNfcW1fZXhwb3J0X3F0eXBlX2ZsYWdzKElOVF9HRVQoc3JjLT5kX2ZsYWdzLCBBUkNIX0NPTlZFUlQpKTsKKwlkc3QtPmRfaWQgPSBJTlRfR0VUKHNyYy0+ZF9pZCwgQVJDSF9DT05WRVJUKTsKKwlkc3QtPmRfYmxrX2hhcmRsaW1pdCA9IChfX3VpbnQ2NF90KQorCQlYRlNfRlNCX1RPX0JCKG1wLCBJTlRfR0VUKHNyYy0+ZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpKTsKKwlkc3QtPmRfYmxrX3NvZnRsaW1pdCA9IChfX3VpbnQ2NF90KQorCQlYRlNfRlNCX1RPX0JCKG1wLCBJTlRfR0VUKHNyYy0+ZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpKTsKKwlkc3QtPmRfaW5vX2hhcmRsaW1pdCA9IChfX3VpbnQ2NF90KQorCQlJTlRfR0VUKHNyYy0+ZF9pbm9faGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpOworCWRzdC0+ZF9pbm9fc29mdGxpbWl0ID0gKF9fdWludDY0X3QpCisJCUlOVF9HRVQoc3JjLT5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCk7CisJZHN0LT5kX2Jjb3VudCA9IChfX3VpbnQ2NF90KQorCQlYRlNfRlNCX1RPX0JCKG1wLCBJTlRfR0VUKHNyYy0+ZF9iY291bnQsIEFSQ0hfQ09OVkVSVCkpOworCWRzdC0+ZF9pY291bnQgPSAoX191aW50NjRfdCkgSU5UX0dFVChzcmMtPmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpOworCWRzdC0+ZF9idGltZXIgPSAoX191aW50MzJfdCkgSU5UX0dFVChzcmMtPmRfYnRpbWVyLCBBUkNIX0NPTlZFUlQpOworCWRzdC0+ZF9pdGltZXIgPSAoX191aW50MzJfdCkgSU5UX0dFVChzcmMtPmRfaXRpbWVyLCBBUkNIX0NPTlZFUlQpOworCWRzdC0+ZF9pd2FybnMgPSBJTlRfR0VUKHNyYy0+ZF9pd2FybnMsIEFSQ0hfQ09OVkVSVCk7CisJZHN0LT5kX2J3YXJucyA9IElOVF9HRVQoc3JjLT5kX2J3YXJucywgQVJDSF9DT05WRVJUKTsKKworCWRzdC0+ZF9ydGJfaGFyZGxpbWl0ID0gKF9fdWludDY0X3QpCisJCVhGU19GU0JfVE9fQkIobXAsIElOVF9HRVQoc3JjLT5kX3J0Yl9oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkpOworCWRzdC0+ZF9ydGJfc29mdGxpbWl0ID0gKF9fdWludDY0X3QpCisJCVhGU19GU0JfVE9fQkIobXAsIElOVF9HRVQoc3JjLT5kX3J0Yl9zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpOworCWRzdC0+ZF9ydGJjb3VudCA9IChfX3VpbnQ2NF90KQorCQlYRlNfRlNCX1RPX0JCKG1wLCBJTlRfR0VUKHNyYy0+ZF9ydGJjb3VudCwgQVJDSF9DT05WRVJUKSk7CisJZHN0LT5kX3J0YnRpbWVyID0gKF9fdWludDMyX3QpIElOVF9HRVQoc3JjLT5kX3J0YnRpbWVyLCBBUkNIX0NPTlZFUlQpOworCWRzdC0+ZF9ydGJ3YXJucyA9IElOVF9HRVQoc3JjLT5kX3J0Yndhcm5zLCBBUkNIX0NPTlZFUlQpOworCisJLyoKKwkgKiBJbnRlcm5hbGx5LCB3ZSBkb24ndCByZXNldCBhbGwgdGhlIHRpbWVycyB3aGVuIHF1b3RhIGVuZm9yY2VtZW50CisJICogZ2V0cyB0dXJuZWQgb2ZmLiBObyBuZWVkIHRvIGNvbmZ1c2UgdGhlIHVzZXJsZXZlbCBjb2RlLAorCSAqIHNvIHJldHVybiB6ZXJvZXMgaW4gdGhhdCBjYXNlLgorCSAqLworCWlmICghIFhGU19JU19RVU9UQV9FTkZPUkNFRChtcCkpIHsKKwkJZHN0LT5kX2J0aW1lciA9IDA7CisJCWRzdC0+ZF9pdGltZXIgPSAwOworCQlkc3QtPmRfcnRidGltZXIgPSAwOworCX0KKworI2lmZGVmIERFQlVHCisJaWYgKFhGU19JU19RVU9UQV9FTkZPUkNFRChtcCkgJiYgZHN0LT5kX2lkICE9IDApIHsKKwkJaWYgKCgoaW50KSBkc3QtPmRfYmNvdW50ID49IChpbnQpIGRzdC0+ZF9ibGtfc29mdGxpbWl0KSAmJgorCQkgICAgKGRzdC0+ZF9ibGtfc29mdGxpbWl0ID4gMCkpIHsKKwkJCUFTU0VSVChkc3QtPmRfYnRpbWVyICE9IDApOworCQl9CisJCWlmICgoKGludCkgZHN0LT5kX2ljb3VudCA+PSAoaW50KSBkc3QtPmRfaW5vX3NvZnRsaW1pdCkgJiYKKwkJICAgIChkc3QtPmRfaW5vX3NvZnRsaW1pdCA+IDApKSB7CisJCQlBU1NFUlQoZHN0LT5kX2l0aW1lciAhPSAwKTsKKwkJfQorCX0KKyNlbmRpZgorfQorCitTVEFUSUMgdWludAoreGZzX3FtX2ltcG9ydF9xdHlwZV9mbGFncygKKwl1aW50IHVmbGFncykKK3sKKwkvKgorCSAqIENhbid0IGJlIGJvdGggYXQgdGhlIHNhbWUgdGltZS4KKwkgKi8KKwlpZiAoKCh1ZmxhZ3MgJiAoWEZTX0dST1VQX1FVT1RBIHwgWEZTX1VTRVJfUVVPVEEpKSA9PQorCSAgICAgKFhGU19HUk9VUF9RVU9UQSB8IFhGU19VU0VSX1FVT1RBKSkgfHwKKwkgICAgKCh1ZmxhZ3MgJiAoWEZTX0dST1VQX1FVT1RBIHwgWEZTX1VTRVJfUVVPVEEpKSA9PSAwKSkKKwkJcmV0dXJuICgwKTsKKworCXJldHVybiAodWZsYWdzICYgWEZTX1VTRVJfUVVPVEEpID8KKwkJWEZTX0RRX1VTRVIgOiBYRlNfRFFfR1JPVVA7Cit9CisKK1NUQVRJQyB1aW50Cit4ZnNfcW1fZXhwb3J0X3F0eXBlX2ZsYWdzKAorCXVpbnQgZmxhZ3MpCit7CisJLyoKKwkgKiBDYW4ndCBiZSBib3RoIGF0IHRoZSBzYW1lIHRpbWUuCisJICovCisJQVNTRVJUKChmbGFncyAmIChYRlNfR1JPVVBfUVVPVEEgfCBYRlNfVVNFUl9RVU9UQSkpICE9CisJCShYRlNfR1JPVVBfUVVPVEEgfCBYRlNfVVNFUl9RVU9UQSkpOworCUFTU0VSVCgoZmxhZ3MgJiAoWEZTX0dST1VQX1FVT1RBIHwgWEZTX1VTRVJfUVVPVEEpKSAhPSAwKTsKKworCXJldHVybiAoZmxhZ3MgJiBYRlNfRFFfVVNFUikgPworCQlYRlNfVVNFUl9RVU9UQSA6IFhGU19HUk9VUF9RVU9UQTsKK30KKworU1RBVElDIHVpbnQKK3hmc19xbV9pbXBvcnRfZmxhZ3MoCisJdWludCB1ZmxhZ3MpCit7CisJdWludCBmbGFncyA9IDA7CisKKwlpZiAodWZsYWdzICYgWEZTX1FVT1RBX1VEUV9BQ0NUKQorCQlmbGFncyB8PSBYRlNfVVFVT1RBX0FDQ1Q7CisJaWYgKHVmbGFncyAmIFhGU19RVU9UQV9HRFFfQUNDVCkKKwkJZmxhZ3MgfD0gWEZTX0dRVU9UQV9BQ0NUOworCWlmICh1ZmxhZ3MgJiBYRlNfUVVPVEFfVURRX0VORkQpCisJCWZsYWdzIHw9IFhGU19VUVVPVEFfRU5GRDsKKwlpZiAodWZsYWdzICYgWEZTX1FVT1RBX0dEUV9FTkZEKQorCQlmbGFncyB8PSBYRlNfR1FVT1RBX0VORkQ7CisJcmV0dXJuIChmbGFncyk7Cit9CisKKworU1RBVElDIHVpbnQKK3hmc19xbV9leHBvcnRfZmxhZ3MoCisJdWludCBmbGFncykKK3sKKwl1aW50IHVmbGFnczsKKworCXVmbGFncyA9IDA7CisJaWYgKGZsYWdzICYgWEZTX1VRVU9UQV9BQ0NUKQorCQl1ZmxhZ3MgfD0gWEZTX1FVT1RBX1VEUV9BQ0NUOworCWlmIChmbGFncyAmIFhGU19HUVVPVEFfQUNDVCkKKwkJdWZsYWdzIHw9IFhGU19RVU9UQV9HRFFfQUNDVDsKKwlpZiAoZmxhZ3MgJiBYRlNfVVFVT1RBX0VORkQpCisJCXVmbGFncyB8PSBYRlNfUVVPVEFfVURRX0VORkQ7CisJaWYgKGZsYWdzICYgWEZTX0dRVU9UQV9FTkZEKQorCQl1ZmxhZ3MgfD0gWEZTX1FVT1RBX0dEUV9FTkZEOworCXJldHVybiAodWZsYWdzKTsKK30KKworCisvKgorICogR28gdGhydSBhbGwgdGhlIGlub2RlcyBpbiB0aGUgZmlsZSBzeXN0ZW0sIHJlbGVhc2luZyB0aGVpciBkcXVvdHMuCisgKiBOb3RlIHRoYXQgdGhlIG1vdW50IHN0cnVjdHVyZSBnZXRzIG1vZGlmaWVkIHRvIGluZGljYXRlIHRoYXQgcXVvdGFzIGFyZSBvZmYKKyAqIEFGVEVSIHRoaXMsIGluIHRoZSBjYXNlIG9mIHF1b3Rhb2ZmLiBUaGlzIGFsc28gZ2V0cyBjYWxsZWQgZnJvbQorICogeGZzX3Jvb3R1bW91bnQuCisgKi8KK3ZvaWQKK3hmc19xbV9kcXJlbGVfYWxsX2lub2RlcygKKwlzdHJ1Y3QgeGZzX21vdW50ICptcCwKKwl1aW50CQkgZmxhZ3MpCit7CisJdm1hcF90CQl2bWFwOworCXhmc19pbm9kZV90CSppcCwgKnRvcGlubzsKKwl1aW50CQlpcmVjbGFpbXM7CisJdm5vZGVfdAkJKnZwOworCWJvb2xlYW5fdAl2bm9kZV9yZWZkOworCisJQVNTRVJUKG1wLT5tX3F1b3RhaW5mbyk7CisKK2FnYWluOgorCVhGU19NT1VOVF9JTE9DSyhtcCk7CisJaXAgPSBtcC0+bV9pbm9kZXM7CisJaWYgKGlwID09IE5VTEwpIHsKKwkJWEZTX01PVU5UX0lVTkxPQ0sobXApOworCQlyZXR1cm47CisJfQorCWRvIHsKKwkJLyogU2tpcCBtYXJrZXJzIGluc2VydGVkIGJ5IHhmc19zeW5jICovCisJCWlmIChpcC0+aV9tb3VudCA9PSBOVUxMKSB7CisJCQlpcCA9IGlwLT5pX21uZXh0OworCQkJY29udGludWU7CisJCX0KKwkJLyogUm9vdCBpbm9kZSwgcmJtaXAgYW5kIHJzdW1pcCBoYXZlIGFzc29jaWF0ZWQgYmxvY2tzICovCisJCWlmIChpcCA9PSBYRlNfUUlfVVFJUChtcCkgfHwgaXAgPT0gWEZTX1FJX0dRSVAobXApKSB7CisJCQlBU1NFUlQoaXAtPmlfdWRxdW90ID09IE5VTEwpOworCQkJQVNTRVJUKGlwLT5pX2dkcXVvdCA9PSBOVUxMKTsKKwkJCWlwID0gaXAtPmlfbW5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQl2cCA9IFhGU19JVE9WX05VTEwoaXApOworCQlpZiAoIXZwKSB7CisJCQlBU1NFUlQoaXAtPmlfdWRxdW90ID09IE5VTEwpOworCQkJQVNTRVJUKGlwLT5pX2dkcXVvdCA9PSBOVUxMKTsKKwkJCWlwID0gaXAtPmlfbW5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQl2bm9kZV9yZWZkID0gQl9GQUxTRTsKKwkJaWYgKHhmc19pbG9ja19ub3dhaXQoaXAsIFhGU19JTE9DS19FWENMKSA9PSAwKSB7CisJCQkvKgorCQkJICogU2FtcGxlIHZwIG1hcHBpbmcgd2hpbGUgaG9sZGluZyB0aGUgbXBsb2NrLCBsZXN0CisJCQkgKiB3ZSBjb21lIGFjcm9zcyBhIG5vbi1leGlzdGVudCB2bm9kZS4KKwkJCSAqLworCQkJVk1BUCh2cCwgdm1hcCk7CisJCQlpcmVjbGFpbXMgPSBtcC0+bV9pcmVjbGFpbXM7CisJCQl0b3Bpbm8gPSBtcC0+bV9pbm9kZXM7CisJCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7CisKKwkJCS8qIFhYWCByZXN0YXJ0IGxpbWl0ID8gKi8KKwkJCWlmICggISAodnAgPSB2bl9nZXQodnAsICZ2bWFwKSkpCisJCQkJZ290byBhZ2FpbjsKKwkJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJdm5vZGVfcmVmZCA9IEJfVFJVRTsKKwkJfSBlbHNlIHsKKwkJCWlyZWNsYWltcyA9IG1wLT5tX2lyZWNsYWltczsKKwkJCXRvcGlubyA9IG1wLT5tX2lub2RlczsKKwkJCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKKwkJfQorCisJCS8qCisJCSAqIFdlIGRvbid0IGtlZXAgdGhlIG1vdW50bG9jayBhY3Jvc3MgdGhlIGRxcmVsZSgpIGNhbGwsCisJCSAqIHNpbmNlIGl0IGNhbiB0YWtlIGEgd2hpbGUuLgorCQkgKi8KKwkJaWYgKChmbGFncyAmIFhGU19VUVVPVEFfQUNDVCkgJiYgaXAtPmlfdWRxdW90KSB7CisJCQl4ZnNfcW1fZHFyZWxlKGlwLT5pX3VkcXVvdCk7CisJCQlpcC0+aV91ZHF1b3QgPSBOVUxMOworCQl9CisJCWlmICgoZmxhZ3MgJiBYRlNfR1FVT1RBX0FDQ1QpICYmIGlwLT5pX2dkcXVvdCkgeworCQkJeGZzX3FtX2RxcmVsZShpcC0+aV9nZHF1b3QpOworCQkJaXAtPmlfZ2RxdW90ID0gTlVMTDsKKwkJfQorCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkvKgorCQkgKiBXYWl0IHVudGlsIHdlJ3ZlIGRyb3BwZWQgdGhlIGlsb2NrIGFuZCBtb3VudGxvY2sgdG8KKwkJICogZG8gdGhlIHZuX3JlbGUuIE9yIGJlIGNvbmRlbW5lZCB0byBhbiBldGVybml0eSBpbiB0aGUKKwkJICogaW5hY3RpdmUgY29kZSBpbiBoZWxsLgorCQkgKi8KKwkJaWYgKHZub2RlX3JlZmQpCisJCQlWTl9SRUxFKHZwKTsKKwkJWEZTX01PVU5UX0lMT0NLKG1wKTsKKwkJLyoKKwkJICogSWYgYW4gaW5vZGUgd2FzIGluc2VydGVkIG9yIHJlbW92ZWQsIHdlIGdvdHRhCisJCSAqIHN0YXJ0IG92ZXIgYWdhaW4uCisJCSAqLworCQlpZiAodG9waW5vICE9IG1wLT5tX2lub2RlcyB8fCBtcC0+bV9pcmVjbGFpbXMgIT0gaXJlY2xhaW1zKSB7CisJCQkvKiBYWFggdXNlIGEgc2VudGluZWwgKi8KKwkJCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwkJaXAgPSBpcC0+aV9tbmV4dDsKKwl9IHdoaWxlIChpcCAhPSBtcC0+bV9pbm9kZXMpOworCisJWEZTX01PVU5UX0lVTkxPQ0sobXApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgREVCVUcKKy8qCisgKiBUaGlzIGNvbnRhaW5zIGFsbCB0aGUgdGVzdCBmdW5jdGlvbnMgZm9yIFhGUyBkaXNrIHF1b3Rhcy4KKyAqIEN1cnJlbnRseSBpdCBkb2VzIGEgcXVvdGEgYWNjb3VudGluZyBjaGVjay4gaWUuIGl0IHdhbGtzIHRocm91Z2gKKyAqIGFsbCBpbm9kZXMgaW4gdGhlIGZpbGUgc3lzdGVtLCBjYWxjdWxhdGluZyB0aGUgZHF1b3QgYWNjb3VudGluZyBmaWVsZHMsCisgKiBhbmQgcHJpbnRzIG91dCBhbnkgaW5jb25zaXN0ZW5jaWVzLgorICovCit4ZnNfZHFoYXNoX3QgKnFtdGVzdF91ZHF0YWI7Cit4ZnNfZHFoYXNoX3QgKnFtdGVzdF9nZHF0YWI7CitpbnQJICAgICAgcW10ZXN0X2hhc2htYXNrOworaW50CSAgICAgIHFtdGVzdF9uZmFpbHM7CittdXRleF90CSAgICAgIHFjaGVja19sb2NrOworCisjZGVmaW5lIERRVEVTVF9IQVNIVkFMKG1wLCBpZCkgKCgoX19wc3Vuc2lnbmVkX3QpKG1wKSArIFwKKwkJCQkgKF9fcHN1bnNpZ25lZF90KShpZCkpICYgXAorCQkJCShxbXRlc3RfaGFzaG1hc2sgLSAxKSkKKworI2RlZmluZSBEUVRFU1RfSEFTSChtcCwgaWQsIHR5cGUpICAgKCh0eXBlICYgWEZTX0RRX1VTRVIpID8gXAorCQkJCSAgICAgKHFtdGVzdF91ZHF0YWIgKyBcCisJCQkJICAgICAgRFFURVNUX0hBU0hWQUwobXAsIGlkKSkgOiBcCisJCQkJICAgICAocW10ZXN0X2dkcXRhYiArIFwKKwkJCQkgICAgICBEUVRFU1RfSEFTSFZBTChtcCwgaWQpKSkKKworI2RlZmluZSBEUVRFU1RfTElTVF9QUklOVChsLCBOWFQsIHRpdGxlKSBcCit7IFwKKwkgIHhmc19kcXRlc3RfdAkqZHFwOyBpbnQgaSA9IDA7XAorCSAgY21uX2VycihDRV9ERUJVRywgIiVzICgjJWQpIiwgdGl0bGUsIChpbnQpIChsKS0+cWhfbmVsZW1zKTsgXAorCSAgZm9yIChkcXAgPSAoeGZzX2RxdGVzdF90ICopKGwpLT5xaF9uZXh0OyBkcXAgIT0gTlVMTDsgXAorCSAgICAgICBkcXAgPSAoeGZzX2RxdGVzdF90ICopZHFwLT5OWFQpIHsgXAorCQljbW5fZXJyKENFX0RFQlVHLCAiICAlZC4gXCIlZCAoJXMpXCIgIGJjbnQgPSAlZCwgaWNudCA9ICVkIiwgXAorCQkJICsraSwgZHFwLT5kX2lkLCBEUUZMQUdUT19UWVBFU1RSKGRxcCksCSAgICAgXAorCQkJIGRxcC0+ZF9iY291bnQsIGRxcC0+ZF9pY291bnQpOyB9IFwKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHF0ZXN0IHsKKwl4ZnNfZHFtYXJrZXJfdAlxX2xpc3RzOworCXhmc19kcWhhc2hfdAkqcV9oYXNoOwkvKiB0aGUgaGFzaGNoYWluIGhlYWRlciAqLworCXhmc19tb3VudF90CSpxX21vdW50OwkvKiBmaWxlc3lzdGVtIHRoaXMgcmVsYXRlcyB0byAqLworCXhmc19kcWlkX3QJZF9pZDsJCS8qIHVzZXIgaWQgb3IgZ3JvdXAgaWQgKi8KKwl4ZnNfcWNudF90CWRfYmNvdW50OwkvKiAjIGRpc2sgYmxvY2tzIG93bmVkIGJ5IHRoZSB1c2VyICovCisJeGZzX3FjbnRfdAlkX2ljb3VudDsJLyogIyBpbm9kZXMgb3duZWQgYnkgdGhlIHVzZXIgKi8KK30geGZzX2RxdGVzdF90OworCitTVEFUSUMgdm9pZAoreGZzX3FtX2hhc2hpbnNlcnQoeGZzX2RxaGFzaF90ICpoLCB4ZnNfZHF0ZXN0X3QgKmRxcCkKK3sKKwl4ZnNfZHF1b3RfdCAqZDsKKwlpZiAoKChkKSA9IChoKS0+cWhfbmV4dCkpCisJCShkKS0+SExfUFJFVlAgPSAmKChkcXApLT5ITF9ORVhUKTsKKwkoZHFwKS0+SExfTkVYVCA9IGQ7CisJKGRxcCktPkhMX1BSRVZQID0gJigoaCktPnFoX25leHQpOworCShoKS0+cWhfbmV4dCA9ICh4ZnNfZHF1b3RfdCAqKWRxcDsKKwkoaCktPnFoX3ZlcnNpb24rKzsKKwkoaCktPnFoX25lbGVtcysrOworfQorU1RBVElDIHZvaWQKK3hmc19xbV9kcXRlc3RfcHJpbnQoCisJeGZzX2RxdGVzdF90CSpkKQoreworCWNtbl9lcnIoQ0VfREVCVUcsICItLS0tLS0tLS0tLURRVEVTVCBEUVVPVC0tLS0tLS0tLS0tLS0tLS0iKTsKKwljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSBkcXVvdCBJRCA9ICVkIiwgZC0+ZF9pZCk7CisJY21uX2VycihDRV9ERUJVRywgIi0tLS0gdHlwZSAgICAgPSAlcyIsIFhGU19RTV9JU1VEUShkKT8gIlVTUiIgOiAiR1JQIik7CisJY21uX2VycihDRV9ERUJVRywgIi0tLS0gZnMgICAgICAgPSAweCVwIiwgZC0+cV9tb3VudCk7CisJY21uX2VycihDRV9ERUJVRywgIi0tLS0gYmNvdW50ICAgPSAlTHUgKDB4JXgpIiwKKwkJZC0+ZF9iY291bnQsIChpbnQpZC0+ZF9iY291bnQpOworCWNtbl9lcnIoQ0VfREVCVUcsICItLS0tIGljb3VudCAgID0gJUx1ICgweCV4KSIsCisJCWQtPmRfaWNvdW50LCAoaW50KWQtPmRfaWNvdW50KTsKKwljbW5fZXJyKENFX0RFQlVHLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfcW1fZHF0ZXN0X2ZhaWxlZCgKKwl4ZnNfZHF0ZXN0X3QJKmQsCisJeGZzX2RxdW90X3QJKmRxcCwKKwljaGFyCQkqcmVhc29uLAorCXhmc19xY250X3QJYSwKKwl4ZnNfcWNudF90CWIsCisJaW50CQllcnJvcikKK3sKKwlxbXRlc3RfbmZhaWxzKys7CisJaWYgKGVycm9yKQorCQljbW5fZXJyKENFX0RFQlVHLCAicXVvdGFjaGVjayBmYWlsZWQgaWQ9JWQsIGVycj0lZFxucmVhc29uOiAlcyIsCisJCSAgICAgICBJTlRfR0VUKGQtPmRfaWQsIEFSQ0hfQ09OVkVSVCksIGVycm9yLCByZWFzb24pOworCWVsc2UKKwkJY21uX2VycihDRV9ERUJVRywgInF1b3RhY2hlY2sgZmFpbGVkIGlkPSVkICglcykgWyVkICE9ICVkXSIsCisJCSAgICAgICBJTlRfR0VUKGQtPmRfaWQsIEFSQ0hfQ09OVkVSVCksIHJlYXNvbiwgKGludClhLCAoaW50KWIpOworCXhmc19xbV9kcXRlc3RfcHJpbnQoZCk7CisJaWYgKGRxcCkKKwkJeGZzX3FtX2RxcHJpbnQoZHFwKTsKK30KKworU1RBVElDIGludAoreGZzX2RxdGVzdF9jbXAyKAorCXhmc19kcXRlc3RfdAkqZCwKKwl4ZnNfZHF1b3RfdAkqZHFwKQoreworCWludCBlcnIgPSAwOworCWlmIChJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpICE9IGQtPmRfaWNvdW50KSB7CisJCXhmc19xbV9kcXRlc3RfZmFpbGVkKGQsIGRxcCwgImljb3VudCBtaXNtYXRjaCIsCisJCQlJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpLAorCQkJZC0+ZF9pY291bnQsIDApOworCQllcnIrKzsKKwl9CisJaWYgKElOVF9HRVQoZHFwLT5xX2NvcmUuZF9iY291bnQsIEFSQ0hfQ09OVkVSVCkgIT0gZC0+ZF9iY291bnQpIHsKKwkJeGZzX3FtX2RxdGVzdF9mYWlsZWQoZCwgZHFwLCAiYmNvdW50IG1pc21hdGNoIiwKKwkJCUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9iY291bnQsIEFSQ0hfQ09OVkVSVCksCisJCQlkLT5kX2Jjb3VudCwgMCk7CisJCWVycisrOworCX0KKwlpZiAoSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkgJiYKKwkgICAgSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSA+PQorCSAgICBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfYmxrX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSkgeworCQlpZiAoIWRxcC0+cV9jb3JlLmRfYnRpbWVyICYmIGRxcC0+cV9jb3JlLmRfaWQpIHsKKwkJCWNtbl9lcnIoQ0VfREVCVUcsCisJCQkJIiVkIFslc10gWzB4JXBdIEJMSyBUSU1FUiBOT1QgU1RBUlRFRCIsCisJCQkJZC0+ZF9pZCwgRFFGTEFHVE9fVFlQRVNUUihkKSwgZC0+cV9tb3VudCk7CisJCQllcnIrKzsKKwkJfQorCX0KKwlpZiAoSU5UX0dFVChkcXAtPnFfY29yZS5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkgJiYKKwkgICAgSU5UX0dFVChkcXAtPnFfY29yZS5kX2ljb3VudCwgQVJDSF9DT05WRVJUKSA+PQorCSAgICBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaW5vX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSkgeworCQlpZiAoIWRxcC0+cV9jb3JlLmRfaXRpbWVyICYmIGRxcC0+cV9jb3JlLmRfaWQpIHsKKwkJCWNtbl9lcnIoQ0VfREVCVUcsCisJCQkJIiVkIFslc10gWzB4JXBdIElOTyBUSU1FUiBOT1QgU1RBUlRFRCIsCisJCQkJZC0+ZF9pZCwgRFFGTEFHVE9fVFlQRVNUUihkKSwgZC0+cV9tb3VudCk7CisJCQllcnIrKzsKKwkJfQorCX0KKyNpZmRlZiBRVU9UQURFQlVHCisJaWYgKCFlcnIpIHsKKwkJY21uX2VycihDRV9ERUJVRywgIiVkIFslc10gWzB4JXBdIHFjaGVja2VkIiwKKwkJCWQtPmRfaWQsIFhGU19RTV9JU1VEUShkKSA/ICJVU1IiIDogIkdSUCIsIGQtPnFfbW91bnQpOworCX0KKyNlbmRpZgorCXJldHVybiAoZXJyKTsKK30KKworU1RBVElDIHZvaWQKK3hmc19kcXRlc3RfY21wKAorCXhmc19kcXRlc3RfdAkqZCkKK3sKKwl4ZnNfZHF1b3RfdAkqZHFwOworCWludAkJZXJyb3I7CisKKwkvKiB4ZnNfcW1fZHF0ZXN0X3ByaW50KGQpOyAqLworCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFnZXQoZC0+cV9tb3VudCwgTlVMTCwgZC0+ZF9pZCwgZC0+ZHFfZmxhZ3MsIDAsCisJCQkJICZkcXApKSkgeworCQl4ZnNfcW1fZHF0ZXN0X2ZhaWxlZChkLCBOVUxMLCAiZHFnZXQgZmFpbGVkIiwgMCwgMCwgZXJyb3IpOworCQlyZXR1cm47CisJfQorCXhmc19kcXRlc3RfY21wMihkLCBkcXApOworCXhmc19xbV9kcXB1dChkcXApOworfQorCitTVEFUSUMgaW50Cit4ZnNfcW1faW50ZXJuYWxxY2hlY2tfZHFnZXQoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19kcWlkX3QJaWQsCisJdWludAkJdHlwZSwKKwl4ZnNfZHF0ZXN0X3QJKipPX2RxKQoreworCXhmc19kcXRlc3RfdAkqZDsKKwl4ZnNfZHFoYXNoX3QJKmg7CisKKwloID0gRFFURVNUX0hBU0gobXAsIGlkLCB0eXBlKTsKKwlmb3IgKGQgPSAoeGZzX2RxdGVzdF90ICopIGgtPnFoX25leHQ7IGQgIT0gTlVMTDsKKwkgICAgIGQgPSAoeGZzX2RxdGVzdF90ICopIGQtPkhMX05FWFQpIHsKKwkJLyogRFFURVNUX0xJU1RfUFJJTlQoaCwgSExfTkVYVCwgIkBAQEBAIGRxdGVzdGxpc3QgQEBAQEAiKTsgKi8KKwkJaWYgKGQtPmRfaWQgPT0gaWQgJiYgbXAgPT0gZC0+cV9tb3VudCkgeworCQkJKk9fZHEgPSBkOworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0KKwlkID0ga21lbV96YWxsb2Moc2l6ZW9mKHhmc19kcXRlc3RfdCksIEtNX1NMRUVQKTsKKwlkLT5kcV9mbGFncyA9IHR5cGU7CisJZC0+ZF9pZCA9IGlkOworCWQtPnFfbW91bnQgPSBtcDsKKwlkLT5xX2hhc2ggPSBoOworCXhmc19xbV9oYXNoaW5zZXJ0KGgsIGQpOworCSpPX2RxID0gZDsKKwlyZXR1cm4gKDApOworfQorCitTVEFUSUMgdm9pZAoreGZzX3FtX2ludGVybmFscWNoZWNrX2dldF9kcXVvdHMoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19kcWlkX3QJdWlkLAorCXhmc19kcWlkX3QJZ2lkLAorCXhmc19kcXRlc3RfdAkqKnVkLAorCXhmc19kcXRlc3RfdAkqKmdkKQoreworCWlmIChYRlNfSVNfVVFVT1RBX09OKG1wKSkKKwkJeGZzX3FtX2ludGVybmFscWNoZWNrX2RxZ2V0KG1wLCB1aWQsIFhGU19EUV9VU0VSLCB1ZCk7CisJaWYgKFhGU19JU19HUVVPVEFfT04obXApKQorCQl4ZnNfcW1faW50ZXJuYWxxY2hlY2tfZHFnZXQobXAsIGdpZCwgWEZTX0RRX0dST1VQLCBnZCk7Cit9CisKKworU1RBVElDIHZvaWQKK3hmc19xbV9pbnRlcm5hbHFjaGVja19kcWFkanVzdCgKKwl4ZnNfaW5vZGVfdAkJKmlwLAorCXhmc19kcXRlc3RfdAkJKmQpCit7CisJZC0+ZF9pY291bnQrKzsKKwlkLT5kX2Jjb3VudCArPSAoeGZzX3FjbnRfdClpcC0+aV9kLmRpX25ibG9ja3M7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19xbV9pbnRlcm5hbHFjaGVja19hZGp1c3QoCisJeGZzX21vdW50X3QJKm1wLAkJLyogbW91bnQgcG9pbnQgZm9yIGZpbGVzeXN0ZW0gKi8KKwl4ZnNfaW5vX3QJaW5vLAkJLyogaW5vZGUgbnVtYmVyIHRvIGdldCBkYXRhIGZvciAqLworCXZvaWQJCV9fdXNlciAqYnVmZmVyLAkvKiBub3QgdXNlZCAqLworCWludAkJdWJzaXplLAkJLyogbm90IHVzZWQgKi8KKwl2b2lkCQkqcHJpdmF0ZV9kYXRhLAkvKiBub3QgdXNlZCAqLworCXhmc19kYWRkcl90CWJubywJCS8qIHN0YXJ0aW5nIGJsb2NrIG9mIGlub2RlIGNsdXN0ZXIgKi8KKwlpbnQJCSp1YnVzZWQsCS8qIG5vdCB1c2VkICovCisJdm9pZAkJKmRpcCwJCS8qIG5vdCB1c2VkICovCisJaW50CQkqcmVzKQkJLyogYnVsa3N0YXQgcmVzdWx0IGNvZGUgKi8KK3sKKwl4ZnNfaW5vZGVfdAkJKmlwOworCXhmc19kcXRlc3RfdAkJKnVkLCAqZ2Q7CisJdWludAkJCWxvY2tfZmxhZ3M7CisJYm9vbGVhbl90CQlpcHJlbGVhc2VkOworCWludAkJCWVycm9yOworCisJQVNTRVJUKFhGU19JU19RVU9UQV9SVU5OSU5HKG1wKSk7CisKKwlpZiAoaW5vID09IG1wLT5tX3NiLnNiX3VxdW90aW5vIHx8IGlubyA9PSBtcC0+bV9zYi5zYl9ncXVvdGlubykgeworCQkqcmVzID0gQlVMS1NUQVRfUlZfTk9USElORzsKKwkJcWRwcmludGsoImludGVybmFscWNoZWNrOiBpbm89JWxsdSwgdXFpbm89JWxsdSwgZ3Fpbm89JWxsdVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGlubywKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIG1wLT5tX3NiLnNiX3VxdW90aW5vLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgbXAtPm1fc2Iuc2JfZ3F1b3Rpbm8pOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJfQorCWlwcmVsZWFzZWQgPSBCX0ZBTFNFOworIGFnYWluOgorCWxvY2tfZmxhZ3MgPSBYRlNfSUxPQ0tfU0hBUkVEOworCWlmICgoZXJyb3IgPSB4ZnNfaWdldChtcCwgTlVMTCwgaW5vLCAwLCBsb2NrX2ZsYWdzLCAmaXAsIGJubykpKSB7CisJCSpyZXMgPSBCVUxLU1RBVF9SVl9OT1RISU5HOworCQlyZXR1cm4gKGVycm9yKTsKKwl9CisKKwlpZiAoaXAtPmlfZC5kaV9tb2RlID09IDApIHsKKwkJeGZzX2lwdXRfbmV3KGlwLCBsb2NrX2ZsYWdzKTsKKwkJKnJlcyA9IEJVTEtTVEFUX1JWX05PVEhJTkc7CisJCXJldHVybiBYRlNfRVJST1IoRU5PRU5UKTsKKwl9CisKKwkvKgorCSAqIFRoaXMgaW5vZGUgY2FuIGhhdmUgYmxvY2tzIGFmdGVyIGVvZiB3aGljaCBjYW4gZ2V0IHJlbGVhc2VkCisJICogd2hlbiB3ZSBzZW5kIGl0IHRvIGluYWN0aXZlLiBTaW5jZSB3ZSBkb24ndCBjaGVjayB0aGUgZHF1b3QKKwkgKiB1bnRpbCB0aGUgYWZ0ZXIgYWxsIG91ciBjYWxjdWxhdGlvbnMgYXJlIGRvbmUsIHdlIG11c3QgZ2V0IHJpZAorCSAqIG9mIHRob3NlIG5vdy4KKwkgKi8KKwlpZiAoISBpcHJlbGVhc2VkKSB7CisJCXhmc19pcHV0KGlwLCBsb2NrX2ZsYWdzKTsKKwkJaXByZWxlYXNlZCA9IEJfVFJVRTsKKwkJZ290byBhZ2FpbjsKKwl9CisJeGZzX3FtX2ludGVybmFscWNoZWNrX2dldF9kcXVvdHMobXAsCisJCQkJCSh4ZnNfZHFpZF90KSBpcC0+aV9kLmRpX3VpZCwKKwkJCQkJKHhmc19kcWlkX3QpIGlwLT5pX2QuZGlfZ2lkLAorCQkJCQkmdWQsICZnZCk7CisJaWYgKFhGU19JU19VUVVPVEFfT04obXApKSB7CisJCUFTU0VSVCh1ZCk7CisJCXhmc19xbV9pbnRlcm5hbHFjaGVja19kcWFkanVzdChpcCwgdWQpOworCX0KKwlpZiAoWEZTX0lTX0dRVU9UQV9PTihtcCkpIHsKKwkJQVNTRVJUKGdkKTsKKwkJeGZzX3FtX2ludGVybmFscWNoZWNrX2RxYWRqdXN0KGlwLCBnZCk7CisJfQorCXhmc19pcHV0KGlwLCBsb2NrX2ZsYWdzKTsKKwkqcmVzID0gQlVMS1NUQVRfUlZfRElET05FOworCXJldHVybiAoMCk7Cit9CisKKworLyogUFJJVkFURSwgZGVidWdnaW5nICovCitpbnQKK3hmc19xbV9pbnRlcm5hbHFjaGVjaygKKwl4ZnNfbW91bnRfdAkqbXApCit7CisJeGZzX2lub190CWxhc3Rpbm87CisJaW50CQlkb25lLCBjb3VudDsKKwlpbnQJCWk7CisJeGZzX2RxdGVzdF90CSpkLCAqZTsKKwl4ZnNfZHFoYXNoX3QJKmgxOworCWludAkJZXJyb3I7CisKKwlsYXN0aW5vID0gMDsKKwlxbXRlc3RfaGFzaG1hc2sgPSAzMjsKKwljb3VudCA9IDU7CisJZG9uZSA9IDA7CisJcW10ZXN0X25mYWlscyA9IDA7CisKKwlpZiAoISBYRlNfSVNfUVVPVEFfT04obXApKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVTUkNIKTsKKworCXhmc19sb2dfZm9yY2UobXAsICh4ZnNfbHNuX3QpMCwgWEZTX0xPR19GT1JDRSB8IFhGU19MT0dfU1lOQyk7CisJWEZTX2JmbHVzaChtcC0+bV9kZGV2X3RhcmdwKTsKKwl4ZnNfbG9nX2ZvcmNlKG1wLCAoeGZzX2xzbl90KTAsIFhGU19MT0dfRk9SQ0UgfCBYRlNfTE9HX1NZTkMpOworCVhGU19iZmx1c2gobXAtPm1fZGRldl90YXJncCk7CisKKwltdXRleF9sb2NrKCZxY2hlY2tfbG9jaywgUElOT0QpOworCS8qIFRoZXJlIHNob3VsZCBiZSBhYnNvbHV0ZWx5IG5vIHF1b3RhIGFjdGl2aXR5IHdoaWxlIHRoaXMKKwkgICBpcyBnb2luZyBvbi4gKi8KKwlxbXRlc3RfdWRxdGFiID0ga21lbV96YWxsb2MocW10ZXN0X2hhc2htYXNrICoKKwkJCQkgICAgc2l6ZW9mKHhmc19kcWhhc2hfdCksIEtNX1NMRUVQKTsKKwlxbXRlc3RfZ2RxdGFiID0ga21lbV96YWxsb2MocW10ZXN0X2hhc2htYXNrICoKKwkJCQkgICAgc2l6ZW9mKHhmc19kcWhhc2hfdCksIEtNX1NMRUVQKTsKKwlkbyB7CisJCS8qCisJCSAqIEl0ZXJhdGUgdGhydSBhbGwgdGhlIGlub2RlcyBpbiB0aGUgZmlsZSBzeXN0ZW0sCisJCSAqIGFkanVzdGluZyB0aGUgY29ycmVzcG9uZGluZyBkcXVvdCBjb3VudGVycworCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19idWxrc3RhdChtcCwgJmxhc3Rpbm8sICZjb3VudCwKKwkJCQkgeGZzX3FtX2ludGVybmFscWNoZWNrX2FkanVzdCwgTlVMTCwKKwkJCQkgMCwgTlVMTCwgQlVMS1NUQVRfRkdfSUdFVCwgJmRvbmUpKSkgeworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICghIGRvbmUpOworCWlmIChlcnJvcikgeworCQljbW5fZXJyKENFX0RFQlVHLCAiQnVsa3N0YXQgcmV0dXJuZWQgZXJyb3IgMHgleCIsIGVycm9yKTsKKwl9CisJY21uX2VycihDRV9ERUJVRywgIkNoZWNraW5nIHJlc3VsdHMgYWdhaW5zdCBzeXN0ZW0gZHF1b3RzIik7CisJZm9yIChpID0gMDsgaSA8IHFtdGVzdF9oYXNobWFzazsgaSsrKSB7CisJCWgxID0gJnFtdGVzdF91ZHF0YWJbaV07CisJCWZvciAoZCA9ICh4ZnNfZHF0ZXN0X3QgKikgaDEtPnFoX25leHQ7IGQgIT0gTlVMTDsgKSB7CisJCQl4ZnNfZHF0ZXN0X2NtcChkKTsKKwkJCWUgPSAoeGZzX2RxdGVzdF90ICopIGQtPkhMX05FWFQ7CisJCQlrbWVtX2ZyZWUoZCwgc2l6ZW9mKHhmc19kcXRlc3RfdCkpOworCQkJZCA9IGU7CisJCX0KKwkJaDEgPSAmcW10ZXN0X2dkcXRhYltpXTsKKwkJZm9yIChkID0gKHhmc19kcXRlc3RfdCAqKSBoMS0+cWhfbmV4dDsgZCAhPSBOVUxMOyApIHsKKwkJCXhmc19kcXRlc3RfY21wKGQpOworCQkJZSA9ICh4ZnNfZHF0ZXN0X3QgKikgZC0+SExfTkVYVDsKKwkJCWttZW1fZnJlZShkLCBzaXplb2YoeGZzX2RxdGVzdF90KSk7CisJCQlkID0gZTsKKwkJfQorCX0KKworCWlmIChxbXRlc3RfbmZhaWxzKSB7CisJCWNtbl9lcnIoQ0VfREVCVUcsICIqKioqKioqKiBxdW90YWNoZWNrIGZhaWxlZCAgKioqKioqKioiKTsKKwkJY21uX2VycihDRV9ERUJVRywgImZhaWx1cmVzID0gJWQiLCBxbXRlc3RfbmZhaWxzKTsKKwl9IGVsc2UgeworCQljbW5fZXJyKENFX0RFQlVHLCAiKioqKioqKiogcXVvdGFjaGVjayBzdWNjZXNzZnVsISAqKioqKioqKiIpOworCX0KKwlrbWVtX2ZyZWUocW10ZXN0X3VkcXRhYiwgcW10ZXN0X2hhc2htYXNrICogc2l6ZW9mKHhmc19kcWhhc2hfdCkpOworCWttZW1fZnJlZShxbXRlc3RfZ2RxdGFiLCBxbXRlc3RfaGFzaG1hc2sgKiBzaXplb2YoeGZzX2RxaGFzaF90KSk7CisJbXV0ZXhfdW5sb2NrKCZxY2hlY2tfbG9jayk7CisJcmV0dXJuIChxbXRlc3RfbmZhaWxzKTsKK30KKworI2VuZGlmIC8qIERFQlVHICovCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX3F1b3RhX3ByaXYuaCBiL2ZzL3hmcy9xdW90YS94ZnNfcXVvdGFfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNGI2MDAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvcXVvdGEveGZzX3F1b3RhX3ByaXYuaApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfUVVPVEFfUFJJVl9IX18KKyNkZWZpbmUgX19YRlNfUVVPVEFfUFJJVl9IX18KKworLyoKKyAqIE51bWJlciBvZiBibWFwcyB0aGF0IHdlIGFzayBmcm9tIGJtYXBpIHdoZW4gZG9pbmcgYSBxdW90YWNoZWNrLgorICogV2UgbWFrZSB0aGlzIHJlc3RyaWN0aW9uIHRvIGtlZXAgdGhlIG1lbW9yeSB1c2FnZSB0byBhIG1pbmltdW0uCisgKi8KKyNkZWZpbmUgWEZTX0RRSVRFUl9NQVBfU0laRQkxMAorCisvKiBOdW1iZXIgb2YgZHF1b3RzIHRoYXQgZml0IGluIHRvIGEgZHF1b3QgYmxvY2sgKi8KKyNkZWZpbmUgWEZTX1FNX0RRUEVSQkxLKG1wKQkoKG1wKS0+bV9xdW90YWluZm8tPnFpX2RxcGVyY2h1bmspCisKKyNkZWZpbmUgWEZTX0lTTE9DS0VEX0lOT0RFKGlwKQkJKGlzbXJsb2NrZWQoJihpcCktPmlfbG9jaywgXAorCQkJCQkgICAgTVJfVVBEQVRFIHwgTVJfQUNDRVNTKSAhPSAwKQorI2RlZmluZSBYRlNfSVNMT0NLRURfSU5PREVfRVhDTChpcCkJKGlzbXJsb2NrZWQoJihpcCktPmlfbG9jaywgXAorCQkJCQkgICAgTVJfVVBEQVRFKSAhPSAwKQorCisjZGVmaW5lIFhGU19EUV9JU19BRERFRFRPX1RSWCh0LCBkKQkoKGQpLT5xX3RyYW5zcCA9PSAodCkpCisKKyNkZWZpbmUgWEZTX1FJX01QTFJFQ0xBSU1TKG1wKQkoKG1wKS0+bV9xdW90YWluZm8tPnFpX2RxcmVjbGFpbXMpCisjZGVmaW5lIFhGU19RSV9VUUlQKG1wKQkJKChtcCktPm1fcXVvdGFpbmZvLT5xaV91cXVvdGFpcCkKKyNkZWZpbmUgWEZTX1FJX0dRSVAobXApCQkoKG1wKS0+bV9xdW90YWluZm8tPnFpX2dxdW90YWlwKQorI2RlZmluZSBYRlNfUUlfRFFDSFVOS0xFTihtcCkJKChtcCktPm1fcXVvdGFpbmZvLT5xaV9kcWNodW5rbGVuKQorI2RlZmluZSBYRlNfUUlfQlRJTUVMSU1JVChtcCkJKChtcCktPm1fcXVvdGFpbmZvLT5xaV9idGltZWxpbWl0KQorI2RlZmluZSBYRlNfUUlfUlRCVElNRUxJTUlUKG1wKSAoKG1wKS0+bV9xdW90YWluZm8tPnFpX3J0YnRpbWVsaW1pdCkKKyNkZWZpbmUgWEZTX1FJX0lUSU1FTElNSVQobXApCSgobXApLT5tX3F1b3RhaW5mby0+cWlfaXRpbWVsaW1pdCkKKyNkZWZpbmUgWEZTX1FJX0JXQVJOTElNSVQobXApCSgobXApLT5tX3F1b3RhaW5mby0+cWlfYndhcm5saW1pdCkKKyNkZWZpbmUgWEZTX1FJX0lXQVJOTElNSVQobXApCSgobXApLT5tX3F1b3RhaW5mby0+cWlfaXdhcm5saW1pdCkKKyNkZWZpbmUgWEZTX1FJX1FPRkZMT0NLKG1wKQkoKG1wKS0+bV9xdW90YWluZm8tPnFpX3F1b3Rhb2ZmbG9jaykKKworI2RlZmluZSBYRlNfUUlfTVBMX0xJU1QobXApCSgobXApLT5tX3F1b3RhaW5mby0+cWlfZHFsaXN0KQorI2RlZmluZSBYRlNfUUlfTVBMTE9DSyhtcCkJKChtcCktPm1fcXVvdGFpbmZvLT5xaV9kcWxpc3QucWhfbG9jaykKKyNkZWZpbmUgWEZTX1FJX01QTE5FWFQobXApCSgobXApLT5tX3F1b3RhaW5mby0+cWlfZHFsaXN0LnFoX25leHQpCisjZGVmaW5lIFhGU19RSV9NUExORFFVT1RTKG1wKQkoKG1wKS0+bV9xdW90YWluZm8tPnFpX2RxbGlzdC5xaF9uZWxlbXMpCisKKyNkZWZpbmUgWFFNTENLKGgpCQkJKG11dGV4X2xvY2soJigoaCktPnFoX2xvY2spLCBQSU5PRCkpCisjZGVmaW5lIFhRTVVOTENLKGgpCQkJKG11dGV4X3VubG9jaygmKChoKS0+cWhfbG9jaykpKQorI2lmZGVmIERFQlVHCitzdHJ1Y3QgeGZzX2RxaGFzaDsKK3N0YXRpYyBpbmxpbmUgaW50IFhRTUlTTENLRChzdHJ1Y3QgeGZzX2RxaGFzaCAqaCkKK3sKKwlpZiAobXV0ZXhfdHJ5bG9jaygmaC0+cWhfbG9jaykpIHsKKwkJbXV0ZXhfdW5sb2NrKCZoLT5xaF9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorI2VuZGlmCisKKyNkZWZpbmUgWEZTX0RRX0hBU0hfTE9DSyhoKQkJWFFNTENLKGgpCisjZGVmaW5lIFhGU19EUV9IQVNIX1VOTE9DSyhoKQkJWFFNVU5MQ0soaCkKKyNkZWZpbmUgWEZTX0RRX0lTX0hBU0hfTE9DS0VEKGgpCVhRTUlTTENLRChoKQorCisjZGVmaW5lIHhmc19xbV9tcGxpc3RfbG9jayhtcCkJCVhRTUxDSygmKFhGU19RSV9NUExfTElTVChtcCkpKQorI2RlZmluZSB4ZnNfcW1fbXBsaXN0X3VubG9jayhtcCkJWFFNVU5MQ0soJihYRlNfUUlfTVBMX0xJU1QobXApKSkKKyNkZWZpbmUgWEZTX1FNX0lTX01QTElTVF9MT0NLRUQobXApCVhRTUlTTENLRCgmKFhGU19RSV9NUExfTElTVChtcCkpKQorCisjZGVmaW5lIHhmc19xbV9mcmVlbGlzdF9sb2NrKHFtKQlYUU1MQ0soJigocW0pLT5xbV9kcWZyZWVsaXN0KSkKKyNkZWZpbmUgeGZzX3FtX2ZyZWVsaXN0X3VubG9jayhxbSkJWFFNVU5MQ0soJigocW0pLT5xbV9kcWZyZWVsaXN0KSkKKyNkZWZpbmUgWEZTX1FNX0lTX0ZSRUVMSVNUX0xPQ0tFRChxbSkJWFFNSVNMQ0tEKCYoKHFtKS0+cW1fZHFmcmVlbGlzdCkpCisKKy8qCisgKiBIYXNoIGludG8gYSBidWNrZXQgaW4gdGhlIGRxdW90IGhhc2ggdGFibGUsIGJhc2VkIG9uIDxtcCwgaWQ+LgorICovCisjZGVmaW5lIFhGU19EUV9IQVNIVkFMKG1wLCBpZCkgKCgoX19wc3Vuc2lnbmVkX3QpKG1wKSArIFwKKwkJCQkgKF9fcHN1bnNpZ25lZF90KShpZCkpICYgXAorCQkJCSh4ZnNfR3FtLT5xbV9kcWhhc2htYXNrIC0gMSkpCisjZGVmaW5lIFhGU19EUV9IQVNIKG1wLCBpZCwgdHlwZSkgICAodHlwZSA9PSBYRlNfRFFfVVNFUiA/IFwKKwkJCQkgICAgICh4ZnNfR3FtLT5xbV91c3JfZHFodGFibGUgKyBcCisJCQkJICAgICAgWEZTX0RRX0hBU0hWQUwobXAsIGlkKSkgOiBcCisJCQkJICAgICAoeGZzX0dxbS0+cW1fZ3JwX2RxaHRhYmxlICsgXAorCQkJCSAgICAgIFhGU19EUV9IQVNIVkFMKG1wLCBpZCkpKQorI2RlZmluZSBYRlNfSVNfRFFUWVBFX09OKG1wLCB0eXBlKSAgICh0eXBlID09IFhGU19EUV9VU0VSID8gXAorCQkJCSAgICAgIFhGU19JU19VUVVPVEFfT04obXApOlhGU19JU19HUVVPVEFfT04obXApKQorI2RlZmluZSBYRlNfSVNfRFFVT1RfVU5JTklUSUFMSVpFRChkcXApICggXAorCSFkcXAtPnFfY29yZS5kX2Jsa19oYXJkbGltaXQgJiYgXAorCSFkcXAtPnFfY29yZS5kX2Jsa19zb2Z0bGltaXQgJiYgXAorCSFkcXAtPnFfY29yZS5kX3J0Yl9oYXJkbGltaXQgJiYgXAorCSFkcXAtPnFfY29yZS5kX3J0Yl9zb2Z0bGltaXQgJiYgXAorCSFkcXAtPnFfY29yZS5kX2lub19oYXJkbGltaXQgJiYgXAorCSFkcXAtPnFfY29yZS5kX2lub19zb2Z0bGltaXQgJiYgXAorCSFkcXAtPnFfY29yZS5kX2Jjb3VudCAmJiBcCisJIWRxcC0+cV9jb3JlLmRfcnRiY291bnQgJiYgXAorCSFkcXAtPnFfY29yZS5kX2ljb3VudCkKKworI2RlZmluZSBITF9QUkVWUAlkcV9oYXNobGlzdC5xbF9wcmV2cAorI2RlZmluZSBITF9ORVhUCQlkcV9oYXNobGlzdC5xbF9uZXh0CisjZGVmaW5lIE1QTF9QUkVWUAlkcV9tcGxpc3QucWxfcHJldnAKKyNkZWZpbmUgTVBMX05FWFQJZHFfbXBsaXN0LnFsX25leHQKKworCisjZGVmaW5lIF9MSVNUX1JFTU9WRShoLCBkcXAsIFBWUCwgTlhUKQkJCQlcCisJewkJCQkJCQlcCisJCSB4ZnNfZHF1b3RfdCAqZDsJCQkJXAorCQkgaWYgKCgoZCkgPSAoZHFwKS0+TlhUKSkJCQkJXAorCQkJIChkKS0+UFZQID0gKGRxcCktPlBWUDsJCQlcCisJCSAqKChkcXApLT5QVlApID0gZDsJCQkJXAorCQkgKGRxcCktPk5YVCA9IE5VTEw7CQkJCVwKKwkJIChkcXApLT5QVlAgPSBOVUxMOwkJCQlcCisJCSAoaCktPnFoX3ZlcnNpb24rKzsJCQkJXAorCQkgKGgpLT5xaF9uZWxlbXMtLTsJCQkJXAorCX0KKworI2RlZmluZSBfTElTVF9JTlNFUlQoaCwgZHFwLCBQVlAsIE5YVCkJCQkJXAorCXsJCQkJCQkJXAorCQkgeGZzX2RxdW90X3QgKmQ7CQkJCVwKKwkJIGlmICgoKGQpID0gKGgpLT5xaF9uZXh0KSkJCQlcCisJCQkgKGQpLT5QVlAgPSAmKChkcXApLT5OWFQpOwkJXAorCQkgKGRxcCktPk5YVCA9IGQ7CQkJCVwKKwkJIChkcXApLT5QVlAgPSAmKChoKS0+cWhfbmV4dCk7CQkJXAorCQkgKGgpLT5xaF9uZXh0ID0gZHFwOwkJCQlcCisJCSAoaCktPnFoX3ZlcnNpb24rKzsJCQkJXAorCQkgKGgpLT5xaF9uZWxlbXMrKzsJCQkJXAorCSB9CisKKyNkZWZpbmUgRk9SRUFDSF9EUVVPVF9JTl9NUChkcXAsIG1wKSBcCisJZm9yICgoZHFwKSA9IFhGU19RSV9NUExORVhUKG1wKTsgKGRxcCkgIT0gTlVMTDsgKGRxcCkgPSAoZHFwKS0+TVBMX05FWFQpCisKKyNkZWZpbmUgRk9SRUFDSF9EUVVPVF9JTl9GUkVFTElTVChkcXAsIHFsaXN0KQlcCitmb3IgKChkcXApID0gKHFsaXN0KS0+cWhfbmV4dDsgKGRxcCkgIT0gKHhmc19kcXVvdF90ICopKHFsaXN0KTsgXAorICAgICAoZHFwKSA9IChkcXApLT5kcV9mbG5leHQpCisKKyNkZWZpbmUgWFFNX0hBU0hMSVNUX0lOU0VSVChoLCBkcXApCVwKKwkgX0xJU1RfSU5TRVJUKGgsIGRxcCwgSExfUFJFVlAsIEhMX05FWFQpCisKKyNkZWZpbmUgWFFNX0ZSRUVMSVNUX0lOU0VSVChoLCBkcXApCVwKKwkgeGZzX3FtX2ZyZWVsaXN0X2FwcGVuZChoLCBkcXApCisKKyNkZWZpbmUgWFFNX01QTElTVF9JTlNFUlQoaCwgZHFwKQlcCisJIF9MSVNUX0lOU0VSVChoLCBkcXAsIE1QTF9QUkVWUCwgTVBMX05FWFQpCisKKyNkZWZpbmUgWFFNX0hBU0hMSVNUX1JFTU9WRShoLCBkcXApCVwKKwkgX0xJU1RfUkVNT1ZFKGgsIGRxcCwgSExfUFJFVlAsIEhMX05FWFQpCisjZGVmaW5lIFhRTV9GUkVFTElTVF9SRU1PVkUoZHFwKQlcCisJIHhmc19xbV9mcmVlbGlzdF91bmxpbmsoZHFwKQorI2RlZmluZSBYUU1fTVBMSVNUX1JFTU9WRShoLCBkcXApCVwKKwl7IF9MSVNUX1JFTU9WRShoLCBkcXAsIE1QTF9QUkVWUCwgTVBMX05FWFQpOyBcCisJICBYRlNfUUlfTVBMUkVDTEFJTVMoKGRxcCktPnFfbW91bnQpKys7IH0KKworI2RlZmluZSBYRlNfRFFfSVNfTE9HSVRFTV9JTklURChkcXApCSgoZHFwKS0+cV9sb2dpdGVtLnFsaV9kcXVvdCA9PSAoZHFwKSkKKworI2RlZmluZSBYRlNfUU1fRFFQX1RPX0RRQUNDVCh0cCwgZHFwKQkoWEZTX1FNX0lTVURRKGRxcCkgPyBcCisJCQkJCSAodHApLT50X2RxaW5mby0+ZHFhX3VzcmRxdW90cyA6IFwKKwkJCQkJICh0cCktPnRfZHFpbmZvLT5kcWFfZ3JwZHF1b3RzKQorI2RlZmluZSBYRlNfSVNfU1VTRVJfRFFVT1QoZHFwKQkJXAorCSghKChkcXApLT5xX2NvcmUuZF9pZCkpCisKKyNkZWZpbmUgWEZTX1BVUkdFX0lOT0RFKGlwKQkJXAorCXsJCQkJXAorCSAgdm1hcF90IGRxdm1hcDsJCVwKKwkgIHZub2RlX3QgKmRxdnA7CQlcCisJICBkcXZwID0gWEZTX0lUT1YoaXApOwkJXAorCSAgVk1BUChkcXZwLCBkcXZtYXApOwkJXAorCSAgVk5fUkVMRShkcXZwKTsJCVwKKwl9CisKKyNkZWZpbmUgRFFGTEFHVE9fVFlQRVNUUihkKQkoKChkKS0+ZHFfZmxhZ3MgJiBYRlNfRFFfVVNFUikgPyAiVVNSIiA6IFwKKwkJCQkgKCgoZCktPmRxX2ZsYWdzICYgWEZTX0RRX0dST1VQKSA/ICJHUlAiIDogIj8/PyIpKQorI2RlZmluZSBEUUZMQUdUT19ESVJUWVNUUihkKQkoWEZTX0RRX0lTX0RJUlRZKGQpID8gIkRJUlRZIiA6ICJOT1RESVJUWSIpCisKKyNlbmRpZgkvKiBfX1hGU19RVU9UQV9QUklWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc190cmFuc19kcXVvdC5jIGIvZnMveGZzL3F1b3RhL3hmc190cmFuc19kcXVvdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OWIyYTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvcXVvdGEveGZzX3RyYW5zX2RxdW90LmMKQEAgLTAsMCArMSw5NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuCSBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisjaW5jbHVkZSAieGZzX2FjbC5oIgorI2luY2x1ZGUgInhmc19jYXAuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjLmgiCisjaW5jbHVkZSAieGZzX2F0dHIuaCIKKyNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnNfcHJpdi5oIgorCisjaW5jbHVkZSAieGZzX3FtLmgiCisKK1NUQVRJQyB2b2lkCXhmc190cmFuc19hbGxvY19kcWluZm8oeGZzX3RyYW5zX3QgKik7CisKKy8qCisgKiBBZGQgdGhlIGxvY2tlZCBkcXVvdCB0byB0aGUgdHJhbnNhY3Rpb24uCisgKiBUaGUgZHF1b3QgbXVzdCBiZSBsb2NrZWQsIGFuZCBpdCBjYW5ub3QgYmUgYXNzb2NpYXRlZCB3aXRoIGFueQorICogdHJhbnNhY3Rpb24uCisgKi8KK3ZvaWQKK3hmc190cmFuc19kcWpvaW4oCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19kcXVvdF90CSpkcXApCit7CisJeGZzX2RxX2xvZ2l0ZW1fdCAgICAqbHA7CisKKwlBU1NFUlQoISBYRlNfRFFfSVNfQURERURUT19UUlgodHAsIGRxcCkpOworCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKGRxcCkpOworCUFTU0VSVChYRlNfRFFfSVNfTE9HSVRFTV9JTklURChkcXApKTsKKwlscCA9ICZkcXAtPnFfbG9naXRlbTsKKworCS8qCisJICogR2V0IGEgbG9nX2l0ZW1fZGVzYyB0byBwb2ludCBhdCB0aGUgbmV3IGl0ZW0uCisJICovCisJKHZvaWQpIHhmc190cmFuc19hZGRfaXRlbSh0cCwgKHhmc19sb2dfaXRlbV90KikobHApKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBpX3RyYW5zcCBzbyB3ZSBjYW4gbGF0ZXIgZGV0ZXJtaW5lIGlmIHRoaXMgZHF1b3QgaXMKKwkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbi4KKwkgKi8KKwlkcXAtPnFfdHJhbnNwID0gdHA7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIG1hcmsgdGhlIGRxdW90IGFzIG5lZWRpbmcKKyAqIHRvIGJlIGxvZ2dlZCB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQuICBUaGUgZHF1b3QgbXVzdAorICogYWxyZWFkeSBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHRyYW5zYWN0aW9uLgorICogTm90ZSB0aGF0IGl0IG1hcmtzIHRoZSBlbnRpcmUgdHJhbnNhY3Rpb24gYXMgZGlydHkuIEluIHRoZSBvcmRpbmFyeQorICogY2FzZSwgdGhpcyBnZXRzIGNhbGxlZCB2aWEgeGZzX3RyYW5zX2NvbW1pdCwgYWZ0ZXIgdGhlIHRyYW5zYWN0aW9uCisgKiBpcyBhbHJlYWR5IGRpcnR5LiBIb3dldmVyLCB0aGVyZSdzIG5vdGhpbmcgc3RvcCB0aGlzIGZyb20gZ2V0dGluZworICogY2FsbGVkIGRpcmVjdGx5LCBhcyBkb25lIGJ5IHhmc19xbV9zY2FsbF9zZXRxbGltLiBIZW5jZSwgdGhlIFRSQU5TX0RJUlRZCisgKiBmbGFnLgorICovCit2b2lkCit4ZnNfdHJhbnNfbG9nX2RxdW90KAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfZHF1b3RfdAkqZHFwKQoreworCXhmc19sb2dfaXRlbV9kZXNjX3QJKmxpZHA7CisKKwlBU1NFUlQoWEZTX0RRX0lTX0FEREVEVE9fVFJYKHRwLCBkcXApKTsKKwlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChkcXApKTsKKworCWxpZHAgPSB4ZnNfdHJhbnNfZmluZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QqKSgmZHFwLT5xX2xvZ2l0ZW0pKTsKKwlBU1NFUlQobGlkcCAhPSBOVUxMKTsKKworCXRwLT50X2ZsYWdzIHw9IFhGU19UUkFOU19ESVJUWTsKKwlsaWRwLT5saWRfZmxhZ3MgfD0gWEZTX0xJRF9ESVJUWTsKK30KKworLyoKKyAqIENhcnJ5IGZvcndhcmQgd2hhdGV2ZXIgaXMgbGVmdCBvZiB0aGUgcXVvdGEgYmxrIHJlc2VydmF0aW9uIHRvCisgKiB0aGUgc3Bhbmt5IG5ldyB0cmFuc2FjdGlvbgorICovCitTVEFUSUMgdm9pZAoreGZzX3RyYW5zX2R1cF9kcWluZm8oCisJeGZzX3RyYW5zX3QJKm90cCwKKwl4ZnNfdHJhbnNfdAkqbnRwKQoreworCXhmc19kcXRyeF90CSpvcSwgKm5xOworCWludAkJaSxqOworCXhmc19kcXRyeF90CSpvcWEsICpucWE7CisKKwlpZiAoIW90cC0+dF9kcWluZm8pCisJCXJldHVybjsKKworCXhmc190cmFuc19hbGxvY19kcWluZm8obnRwKTsKKwlvcWEgPSBvdHAtPnRfZHFpbmZvLT5kcWFfdXNyZHF1b3RzOworCW5xYSA9IG50cC0+dF9kcWluZm8tPmRxYV91c3JkcXVvdHM7CisKKwkvKgorCSAqIEJlY2F1c2UgdGhlIHF1b3RhIGJsayByZXNlcnZhdGlvbiBpcyBjYXJyaWVkIGZvcndhcmQsCisJICogaXQgaXMgYWxzbyBuZWNlc3NhcnkgdG8gY2FycnkgZm9yd2FyZCB0aGUgRFFfRElSVFkgZmxhZy4KKwkgKi8KKwlpZihvdHAtPnRfZmxhZ3MgJiBYRlNfVFJBTlNfRFFfRElSVFkpCisJCW50cC0+dF9mbGFncyB8PSBYRlNfVFJBTlNfRFFfRElSVFk7CisKKwlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBYRlNfUU1fVFJBTlNfTUFYRFFTOyBpKyspIHsKKwkJCWlmIChvcWFbaV0ucXRfZHF1b3QgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCW9xID0gJm9xYVtpXTsKKwkJCW5xID0gJm5xYVtpXTsKKworCQkJbnEtPnF0X2RxdW90ID0gb3EtPnF0X2RxdW90OworCQkJbnEtPnF0X2Jjb3VudF9kZWx0YSA9IG5xLT5xdF9pY291bnRfZGVsdGEgPSAwOworCQkJbnEtPnF0X3J0YmNvdW50X2RlbHRhID0gMDsKKworCQkJLyoKKwkJCSAqIFRyYW5zZmVyIHdoYXRldmVyIGlzIGxlZnQgb2YgdGhlIHJlc2VydmF0aW9ucy4KKwkJCSAqLworCQkJbnEtPnF0X2Jsa19yZXMgPSBvcS0+cXRfYmxrX3JlcyAtIG9xLT5xdF9ibGtfcmVzX3VzZWQ7CisJCQlvcS0+cXRfYmxrX3JlcyA9IG9xLT5xdF9ibGtfcmVzX3VzZWQ7CisKKwkJCW5xLT5xdF9ydGJsa19yZXMgPSBvcS0+cXRfcnRibGtfcmVzIC0KKwkJCQlvcS0+cXRfcnRibGtfcmVzX3VzZWQ7CisJCQlvcS0+cXRfcnRibGtfcmVzID0gb3EtPnF0X3J0YmxrX3Jlc191c2VkOworCisJCQlucS0+cXRfaW5vX3JlcyA9IG9xLT5xdF9pbm9fcmVzIC0gb3EtPnF0X2lub19yZXNfdXNlZDsKKwkJCW9xLT5xdF9pbm9fcmVzID0gb3EtPnF0X2lub19yZXNfdXNlZDsKKworCQl9CisJCW9xYSA9IG90cC0+dF9kcWluZm8tPmRxYV9ncnBkcXVvdHM7CisJCW5xYSA9IG50cC0+dF9kcWluZm8tPmRxYV9ncnBkcXVvdHM7CisJfQorfQorCisvKgorICogV3JhcCBhcm91bmQgbW9kX2RxdW90IHRvIGFjY291bnQgZm9yIGJvdGggdXNlciBhbmQgZ3JvdXAgcXVvdGFzLgorICovCit2b2lkCit4ZnNfdHJhbnNfbW9kX2RxdW90X2J5aW5vKAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfaW5vZGVfdAkqaXAsCisJdWludAkJZmllbGQsCisJbG9uZwkJZGVsdGEpCit7CisJeGZzX21vdW50X3QJKm1wOworCisJQVNTRVJUKHRwKTsKKwltcCA9IHRwLT50X21vdW50cDsKKworCWlmICghWEZTX0lTX1FVT1RBX09OKG1wKSB8fAorCSAgICBpcC0+aV9pbm8gPT0gbXAtPm1fc2Iuc2JfdXF1b3Rpbm8gfHwKKwkgICAgaXAtPmlfaW5vID09IG1wLT5tX3NiLnNiX2dxdW90aW5vKQorCQlyZXR1cm47CisKKwlpZiAodHAtPnRfZHFpbmZvID09IE5VTEwpCisJCXhmc190cmFuc19hbGxvY19kcWluZm8odHApOworCisJaWYgKFhGU19JU19VUVVPVEFfT04obXApICYmIGlwLT5pX3VkcXVvdCkgeworCQkodm9pZCkgeGZzX3RyYW5zX21vZF9kcXVvdCh0cCwgaXAtPmlfdWRxdW90LCBmaWVsZCwgZGVsdGEpOworCX0KKwlpZiAoWEZTX0lTX0dRVU9UQV9PTihtcCkgJiYgaXAtPmlfZ2RxdW90KSB7CisJCSh2b2lkKSB4ZnNfdHJhbnNfbW9kX2RxdW90KHRwLCBpcC0+aV9nZHF1b3QsIGZpZWxkLCBkZWx0YSk7CisJfQorfQorCitTVEFUSUMgeGZzX2RxdHJ4X3QgKgoreGZzX3RyYW5zX2dldF9kcXRyeCgKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX2RxdW90X3QJKmRxcCkKK3sKKwlpbnQJCWk7CisJeGZzX2RxdHJ4X3QJKnFhOworCisJZm9yIChpID0gMDsgaSA8IFhGU19RTV9UUkFOU19NQVhEUVM7IGkrKykgeworCQlxYSA9IFhGU19RTV9EUVBfVE9fRFFBQ0NUKHRwLCBkcXApOworCisJCWlmIChxYVtpXS5xdF9kcXVvdCA9PSBOVUxMIHx8CisJCSAgICBxYVtpXS5xdF9kcXVvdCA9PSBkcXApIHsKKwkJCXJldHVybiAoJnFhW2ldKTsKKwkJfQorCX0KKworCXJldHVybiAoTlVMTCk7Cit9CisKKy8qCisgKiBNYWtlIHRoZSBjaGFuZ2VzIGluIHRoZSB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUuCisgKiBUaGUgbW9yYWwgZXF1aXZhbGVudCB0byB4ZnNfdHJhbnNfbW9kX3NiKCkuCisgKiBXZSBkb24ndCB0b3VjaCBhbnkgZmllbGRzIGluIHRoZSBkcXVvdCwgc28gd2UgZG9uJ3QgY2FyZQorICogaWYgaXQncyBsb2NrZWQgb3Igbm90IChtb3N0IG9mIHRoZSB0aW1lIGl0IHdvbid0IGJlKS4KKyAqLwordm9pZAoreGZzX3RyYW5zX21vZF9kcXVvdCgKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX2RxdW90X3QJKmRxcCwKKwl1aW50CQlmaWVsZCwKKwlsb25nCQlkZWx0YSkKK3sKKwl4ZnNfZHF0cnhfdAkqcXRyeDsKKworCUFTU0VSVCh0cCk7CisJcXRyeCA9IE5VTEw7CisKKwlpZiAodHAtPnRfZHFpbmZvID09IE5VTEwpCisJCXhmc190cmFuc19hbGxvY19kcWluZm8odHApOworCS8qCisJICogRmluZCBlaXRoZXIgdGhlIGZpcnN0IGZyZWUgc2xvdCBvciB0aGUgc2xvdCB0aGF0IGJlbG9uZ3MKKwkgKiB0byB0aGlzIGRxdW90LgorCSAqLworCXF0cnggPSB4ZnNfdHJhbnNfZ2V0X2RxdHJ4KHRwLCBkcXApOworCUFTU0VSVChxdHJ4KTsKKwlpZiAocXRyeC0+cXRfZHF1b3QgPT0gTlVMTCkKKwkJcXRyeC0+cXRfZHF1b3QgPSBkcXA7CisKKwlzd2l0Y2ggKGZpZWxkKSB7CisKKwkJLyoKKwkJICogcmVndWxhciBkaXNrIGJsayByZXNlcnZhdGlvbgorCQkgKi8KKwkgICAgICBjYXNlIFhGU19UUkFOU19EUV9SRVNfQkxLUzoKKwkJcXRyeC0+cXRfYmxrX3JlcyArPSAodWxvbmcpZGVsdGE7CisJCWJyZWFrOworCisJCS8qCisJCSAqIGlub2RlIHJlc2VydmF0aW9uCisJCSAqLworCSAgICAgIGNhc2UgWEZTX1RSQU5TX0RRX1JFU19JTk9TOgorCQlxdHJ4LT5xdF9pbm9fcmVzICs9ICh1bG9uZylkZWx0YTsKKwkJYnJlYWs7CisKKwkJLyoKKwkJICogZGlzayBibG9ja3MgdXNlZC4KKwkJICovCisJICAgICAgY2FzZSBYRlNfVFJBTlNfRFFfQkNPVU5UOgorCQlpZiAocXRyeC0+cXRfYmxrX3JlcyAmJiBkZWx0YSA+IDApIHsKKwkJCXF0cngtPnF0X2Jsa19yZXNfdXNlZCArPSAodWxvbmcpZGVsdGE7CisJCQlBU1NFUlQocXRyeC0+cXRfYmxrX3JlcyA+PSBxdHJ4LT5xdF9ibGtfcmVzX3VzZWQpOworCQl9CisJCXF0cngtPnF0X2Jjb3VudF9kZWx0YSArPSBkZWx0YTsKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlIFhGU19UUkFOU19EUV9ERUxCQ09VTlQ6CisJCXF0cngtPnF0X2RlbGJjbnRfZGVsdGEgKz0gZGVsdGE7CisJCWJyZWFrOworCisJCS8qCisJCSAqIElub2RlIENvdW50CisJCSAqLworCSAgICAgIGNhc2UgWEZTX1RSQU5TX0RRX0lDT1VOVDoKKwkJaWYgKHF0cngtPnF0X2lub19yZXMgJiYgZGVsdGEgPiAwKSB7CisJCQlxdHJ4LT5xdF9pbm9fcmVzX3VzZWQgKz0gKHVsb25nKWRlbHRhOworCQkJQVNTRVJUKHF0cngtPnF0X2lub19yZXMgPj0gcXRyeC0+cXRfaW5vX3Jlc191c2VkKTsKKwkJfQorCQlxdHJ4LT5xdF9pY291bnRfZGVsdGEgKz0gZGVsdGE7CisJCWJyZWFrOworCisJCS8qCisJCSAqIHJ0YmxrIHJlc2VydmF0aW9uCisJCSAqLworCSAgICAgIGNhc2UgWEZTX1RSQU5TX0RRX1JFU19SVEJMS1M6CisJCXF0cngtPnF0X3J0YmxrX3JlcyArPSAodWxvbmcpZGVsdGE7CisJCWJyZWFrOworCisJCS8qCisJCSAqIHJ0YmxrIGNvdW50CisJCSAqLworCSAgICAgIGNhc2UgWEZTX1RSQU5TX0RRX1JUQkNPVU5UOgorCQlpZiAocXRyeC0+cXRfcnRibGtfcmVzICYmIGRlbHRhID4gMCkgeworCQkJcXRyeC0+cXRfcnRibGtfcmVzX3VzZWQgKz0gKHVsb25nKWRlbHRhOworCQkJQVNTRVJUKHF0cngtPnF0X3J0YmxrX3JlcyA+PSBxdHJ4LT5xdF9ydGJsa19yZXNfdXNlZCk7CisJCX0KKwkJcXRyeC0+cXRfcnRiY291bnRfZGVsdGEgKz0gZGVsdGE7CisJCWJyZWFrOworCisJICAgICAgY2FzZSBYRlNfVFJBTlNfRFFfREVMUlRCQ09VTlQ6CisJCXF0cngtPnF0X2RlbHJ0Yl9kZWx0YSArPSBkZWx0YTsKKwkJYnJlYWs7CisKKwkgICAgICBkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJfQorCXRwLT50X2ZsYWdzIHw9IFhGU19UUkFOU19EUV9ESVJUWTsKK30KKworCisvKgorICogR2l2ZW4gYW4gYXJyYXkgb2YgZHF0cnggc3RydWN0dXJlcywgbG9jayBhbGwgdGhlIGRxdW90cyBhc3NvY2lhdGVkCisgKiBhbmQgam9pbiB0aGVtIHRvIHRoZSB0cmFuc2FjdGlvbiwgcHJvdmlkZWQgdGhleSBoYXZlIGJlZW4gbW9kaWZpZWQuCisgKiBXZSBrbm93IHRoYXQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGRxdW90cyAob2Ygb25lIHR5cGUgLSB1c3IgT1IgZ3JwKSwKKyAqIGludm9sdmVkIGluIGEgdHJhbnNhY3Rpb24gaXMgMiBhbmQgdGhhdCBib3RoIHVzciBhbmQgZ3JwIGNvbWJpbmVkIC0gMy4KKyAqIFNvLCB3ZSBkb24ndCBhdHRlbXB0IHRvIG1ha2UgdGhpcyB2ZXJ5IGdlbmVyaWMuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfdHJhbnNfZHFsb2NrZWRqb2luKAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfZHF0cnhfdAkqcSkKK3sKKwlBU1NFUlQocVswXS5xdF9kcXVvdCAhPSBOVUxMKTsKKwlpZiAocVsxXS5xdF9kcXVvdCA9PSBOVUxMKSB7CisJCXhmc19kcWxvY2socVswXS5xdF9kcXVvdCk7CisJCXhmc190cmFuc19kcWpvaW4odHAsIHFbMF0ucXRfZHF1b3QpOworCX0gZWxzZSB7CisJCUFTU0VSVChYRlNfUU1fVFJBTlNfTUFYRFFTID09IDIpOworCQl4ZnNfZHFsb2NrMihxWzBdLnF0X2RxdW90LCBxWzFdLnF0X2RxdW90KTsKKwkJeGZzX3RyYW5zX2Rxam9pbih0cCwgcVswXS5xdF9kcXVvdCk7CisJCXhmc190cmFuc19kcWpvaW4odHAsIHFbMV0ucXRfZHF1b3QpOworCX0KK30KKworCisvKgorICogQ2FsbGVkIGJ5IHhmc190cmFuc19jb21taXQoKSBhbmQgc2ltaWxhciBpbiBzcGlyaXQgdG8KKyAqIHhmc190cmFuc19hcHBseV9zYl9kZWx0YXMoKS4KKyAqIEdvIHRocnUgYWxsIHRoZSBkcXVvdHMgYmVsb25naW5nIHRvIHRoaXMgdHJhbnNhY3Rpb24gYW5kIG1vZGlmeSB0aGUKKyAqIElOQ09SRSBkcXVvdCB0byByZWZsZWN0IHRoZSBhY3R1YWwgdXNhZ2VzLgorICogVW5yZXNlcnZlIGp1c3QgdGhlIHJlc2VydmF0aW9ucyBkb25lIGJ5IHRoaXMgdHJhbnNhY3Rpb24uCisgKiBkcXVvdCBpcyBzdGlsbCBsZWZ0IGxvY2tlZCBhdCBleGl0LgorICovCit2b2lkCit4ZnNfdHJhbnNfYXBwbHlfZHF1b3RfZGVsdGFzKAorCXhmc190cmFuc190CQkqdHApCit7CisJaW50CQkJaSwgajsKKwl4ZnNfZHF1b3RfdAkJKmRxcDsKKwl4ZnNfZHF0cnhfdAkJKnF0cngsICpxYTsKKwl4ZnNfZGlza19kcXVvdF90CSpkOworCWxvbmcJCQl0b3RhbGJkZWx0YTsKKwlsb25nCQkJdG90YWxydGJkZWx0YTsKKworCWlmICghICh0cC0+dF9mbGFncyAmIFhGU19UUkFOU19EUV9ESVJUWSkpCisJCXJldHVybjsKKworCUFTU0VSVCh0cC0+dF9kcWluZm8pOworCXFhID0gdHAtPnRfZHFpbmZvLT5kcWFfdXNyZHF1b3RzOworCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJaWYgKHFhWzBdLnF0X2RxdW90ID09IE5VTEwpIHsKKwkJCXFhID0gdHAtPnRfZHFpbmZvLT5kcWFfZ3JwZHF1b3RzOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBMb2NrIGFsbCBvZiB0aGUgZHF1b3RzIGFuZCBqb2luIHRoZW0gdG8gdGhlIHRyYW5zYWN0aW9uLgorCQkgKi8KKwkJeGZzX3RyYW5zX2RxbG9ja2Vkam9pbih0cCwgcWEpOworCisJCWZvciAoaSA9IDA7IGkgPCBYRlNfUU1fVFJBTlNfTUFYRFFTOyBpKyspIHsKKwkJCXF0cnggPSAmcWFbaV07CisJCQkvKgorCQkJICogVGhlIGFycmF5IG9mIGRxdW90cyBpcyBmaWxsZWQKKwkJCSAqIHNlcXVlbnRpYWxseSwgbm90IHNwYXJzZWx5LgorCQkJICovCisJCQlpZiAoKGRxcCA9IHF0cngtPnF0X2RxdW90KSA9PSBOVUxMKQorCQkJCWJyZWFrOworCisJCQlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChkcXApKTsKKwkJCUFTU0VSVChYRlNfRFFfSVNfQURERURUT19UUlgodHAsIGRxcCkpOworCisJCQkvKgorCQkJICogYWRqdXN0IHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJsb2NrcyB1c2VkCisJCQkgKi8KKwkJCWQgPSAmZHFwLT5xX2NvcmU7CisKKwkJCS8qCisJCQkgKiBUaGUgaXNzdWUgaGVyZSBpcyAtIHNvbWV0aW1lcyB3ZSBkb24ndCBtYWtlIGEgYmxrcXVvdGEKKwkJCSAqIHJlc2VydmF0aW9uIGludGVudGlvbmFsbHkgdG8gYmUgZmFpciB0byB1c2VycworCQkJICogKHdoZW4gdGhlIGFtb3VudCBpcyBzbWFsbCkuIE9uIHRoZSBvdGhlciBoYW5kLAorCQkJICogZGVsYXllZCBhbGxvY3MgZG8gbWFrZSByZXNlcnZhdGlvbnMsIGJ1dCB0aGF0J3MKKwkJCSAqIG91dHNpZGUgb2YgYSB0cmFuc2FjdGlvbiwgc28gd2UgaGF2ZSBubworCQkJICogaWRlYSBob3cgbXVjaCB3YXMgcmVhbGx5IHJlc2VydmVkLgorCQkJICogU28sIGhlcmUgd2UndmUgYWNjdW11bGF0ZWQgZGVsYXllZCBhbGxvY2F0aW9uIGJsa3MgYW5kCisJCQkgKiBub24tZGVsYXkgYmxrcy4gVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGUKKwkJCSAqIGRlbGF5ZWQgb25lcyBhcmUgYWx3YXlzIHJlc2VydmVkIChvdXRzaWRlIG9mIGEKKwkJCSAqIHRyYW5zYWN0aW9uKSwgYW5kIHRoZSBvdGhlcnMgbWF5IG9yIG1heSBub3QgaGF2ZQorCQkJICogcXVvdGEgcmVzZXJ2YXRpb25zLgorCQkJICovCisJCQl0b3RhbGJkZWx0YSA9IHF0cngtPnF0X2Jjb3VudF9kZWx0YSArCisJCQkJcXRyeC0+cXRfZGVsYmNudF9kZWx0YTsKKwkJCXRvdGFscnRiZGVsdGEgPSBxdHJ4LT5xdF9ydGJjb3VudF9kZWx0YSArCisJCQkJcXRyeC0+cXRfZGVscnRiX2RlbHRhOworI2lmZGVmIFFVT1RBREVCVUcKKwkJCWlmICh0b3RhbGJkZWx0YSA8IDApCisJCQkJQVNTRVJUKElOVF9HRVQoZC0+ZF9iY291bnQsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQkgICAgICAgKHhmc19xY250X3QpIC10b3RhbGJkZWx0YSk7CisKKwkJCWlmICh0b3RhbHJ0YmRlbHRhIDwgMCkKKwkJCQlBU1NFUlQoSU5UX0dFVChkLT5kX3J0YmNvdW50LCBBUkNIX0NPTlZFUlQpID49CisJCQkJICAgICAgICh4ZnNfcWNudF90KSAtdG90YWxydGJkZWx0YSk7CisKKwkJCWlmIChxdHJ4LT5xdF9pY291bnRfZGVsdGEgPCAwKQorCQkJCUFTU0VSVChJTlRfR0VUKGQtPmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpID49CisJCQkJICAgICAgICh4ZnNfcWNudF90KSAtcXRyeC0+cXRfaWNvdW50X2RlbHRhKTsKKyNlbmRpZgorCQkJaWYgKHRvdGFsYmRlbHRhKQorCQkJCUlOVF9NT0QoZC0+ZF9iY291bnQsIEFSQ0hfQ09OVkVSVCwgKHhmc19xY250X3QpdG90YWxiZGVsdGEpOworCisJCQlpZiAocXRyeC0+cXRfaWNvdW50X2RlbHRhKQorCQkJCUlOVF9NT0QoZC0+ZF9pY291bnQsIEFSQ0hfQ09OVkVSVCwgKHhmc19xY250X3QpcXRyeC0+cXRfaWNvdW50X2RlbHRhKTsKKworCQkJaWYgKHRvdGFscnRiZGVsdGEpCisJCQkJSU5UX01PRChkLT5kX3J0YmNvdW50LCBBUkNIX0NPTlZFUlQsICh4ZnNfcWNudF90KXRvdGFscnRiZGVsdGEpOworCisJCQkvKgorCQkJICogR2V0IGFueSBkZWZhdWx0IGxpbWl0cyBpbiB1c2UuCisJCQkgKiBTdGFydC9yZXNldCB0aGUgdGltZXIocykgaWYgbmVlZGVkLgorCQkJICovCisJCQlpZiAoZC0+ZF9pZCkgeworCQkJCXhmc19xbV9hZGp1c3RfZHFsaW1pdHModHAtPnRfbW91bnRwLCBkKTsKKwkJCQl4ZnNfcW1fYWRqdXN0X2RxdGltZXJzKHRwLT50X21vdW50cCwgZCk7CisJCQl9CisKKwkJCWRxcC0+ZHFfZmxhZ3MgfD0gWEZTX0RRX0RJUlRZOworCQkJLyoKKwkJCSAqIGFkZCB0aGlzIHRvIHRoZSBsaXN0IG9mIGl0ZW1zIHRvIGdldCBsb2dnZWQKKwkJCSAqLworCQkJeGZzX3RyYW5zX2xvZ19kcXVvdCh0cCwgZHFwKTsKKwkJCS8qCisJCQkgKiBUYWtlIG9mZiB3aGF0J3MgbGVmdCBvZiB0aGUgb3JpZ2luYWwgcmVzZXJ2YXRpb24uCisJCQkgKiBJbiBjYXNlIG9mIGRlbGF5ZWQgYWxsb2NhdGlvbnMsIHRoZXJlJ3Mgbm8KKwkJCSAqIHJlc2VydmF0aW9uIHRoYXQgYSB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUga25vd3Mgb2YuCisJCQkgKi8KKwkJCWlmIChxdHJ4LT5xdF9ibGtfcmVzICE9IDApIHsKKwkJCQlpZiAocXRyeC0+cXRfYmxrX3JlcyAhPSBxdHJ4LT5xdF9ibGtfcmVzX3VzZWQpIHsKKwkJCQkJaWYgKHF0cngtPnF0X2Jsa19yZXMgPgorCQkJCQkgICAgcXRyeC0+cXRfYmxrX3Jlc191c2VkKQorCQkJCQkJZHFwLT5xX3Jlc19iY291bnQgLT0gKHhmc19xY250X3QpCisJCQkJCQkJKHF0cngtPnF0X2Jsa19yZXMgLQorCQkJCQkJCSBxdHJ4LT5xdF9ibGtfcmVzX3VzZWQpOworCQkJCQllbHNlCisJCQkJCQlkcXAtPnFfcmVzX2Jjb3VudCAtPSAoeGZzX3FjbnRfdCkKKwkJCQkJCQkocXRyeC0+cXRfYmxrX3Jlc191c2VkIC0KKwkJCQkJCQkgcXRyeC0+cXRfYmxrX3Jlcyk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFRoZXNlIGJsa3Mgd2VyZSBuZXZlciByZXNlcnZlZCwgZWl0aGVyIGluc2lkZQorCQkJCSAqIGEgdHJhbnNhY3Rpb24gb3Igb3V0c2lkZSBvbmUgKGluIGEgZGVsYXllZAorCQkJCSAqIGFsbG9jYXRpb24pLiBBbHNvLCB0aGlzIGlzbid0IGFsd2F5cyBhCisJCQkJICogbmVnYXRpdmUgbnVtYmVyIHNpbmNlIHdlIHNvbWV0aW1lcworCQkJCSAqIGRlbGliZXJhdGVseSBza2lwIHF1b3RhIHJlc2VydmF0aW9ucy4KKwkJCQkgKi8KKwkJCQlpZiAocXRyeC0+cXRfYmNvdW50X2RlbHRhKSB7CisJCQkJCWRxcC0+cV9yZXNfYmNvdW50ICs9CisJCQkJCSAgICAgICh4ZnNfcWNudF90KXF0cngtPnF0X2Jjb3VudF9kZWx0YTsKKwkJCQl9CisJCQl9CisJCQkvKgorCQkJICogQWRqdXN0IHRoZSBSVCByZXNlcnZhdGlvbi4KKwkJCSAqLworCQkJaWYgKHF0cngtPnF0X3J0YmxrX3JlcyAhPSAwKSB7CisJCQkJaWYgKHF0cngtPnF0X2Jsa19yZXMgIT0gcXRyeC0+cXRfYmxrX3Jlc191c2VkKSB7CisJCQkJCWlmIChxdHJ4LT5xdF9ydGJsa19yZXMgPgorCQkJCQkgICAgcXRyeC0+cXRfcnRibGtfcmVzX3VzZWQpCisJCQkJCSAgICAgICBkcXAtPnFfcmVzX3J0YmNvdW50IC09ICh4ZnNfcWNudF90KQorCQkJCQkJICAgICAgIChxdHJ4LT5xdF9ydGJsa19yZXMgLQorCQkJCQkJCXF0cngtPnF0X3J0YmxrX3Jlc191c2VkKTsKKwkJCQkJZWxzZQorCQkJCQkgICAgICAgZHFwLT5xX3Jlc19ydGJjb3VudCAtPSAoeGZzX3FjbnRfdCkKKwkJCQkJCSAgICAgICAocXRyeC0+cXRfcnRibGtfcmVzX3VzZWQgLQorCQkJCQkJCXF0cngtPnF0X3J0YmxrX3Jlcyk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAocXRyeC0+cXRfcnRiY291bnRfZGVsdGEpCisJCQkJCWRxcC0+cV9yZXNfcnRiY291bnQgKz0KKwkJCQkJICAgICh4ZnNfcWNudF90KXF0cngtPnF0X3J0YmNvdW50X2RlbHRhOworCQkJfQorCisJCQkvKgorCQkJICogQWRqdXN0IHRoZSBpbm9kZSByZXNlcnZhdGlvbi4KKwkJCSAqLworCQkJaWYgKHF0cngtPnF0X2lub19yZXMgIT0gMCkgeworCQkJCUFTU0VSVChxdHJ4LT5xdF9pbm9fcmVzID49CisJCQkJICAgICAgIHF0cngtPnF0X2lub19yZXNfdXNlZCk7CisJCQkJaWYgKHF0cngtPnF0X2lub19yZXMgPiBxdHJ4LT5xdF9pbm9fcmVzX3VzZWQpCisJCQkJCWRxcC0+cV9yZXNfaWNvdW50IC09ICh4ZnNfcWNudF90KQorCQkJCQkJKHF0cngtPnF0X2lub19yZXMgLQorCQkJCQkJIHF0cngtPnF0X2lub19yZXNfdXNlZCk7CisJCQl9IGVsc2UgeworCQkJCWlmIChxdHJ4LT5xdF9pY291bnRfZGVsdGEpCisJCQkJCWRxcC0+cV9yZXNfaWNvdW50ICs9CisJCQkJCSAgICAoeGZzX3FjbnRfdClxdHJ4LT5xdF9pY291bnRfZGVsdGE7CisJCQl9CisKKworI2lmZGVmIFFVT1RBREVCVUcKKwkJCWlmIChxdHJ4LT5xdF9ydGJsa19yZXMgIT0gMCkKKwkJCQljbW5fZXJyKENFX0RFQlVHLCAiUlQgcmVzICVkIGZvciAweCVwXG4iLAorCQkJCQkoaW50KSBxdHJ4LT5xdF9ydGJsa19yZXMsIGRxcCk7CisjZW5kaWYKKwkJCUFTU0VSVChkcXAtPnFfcmVzX2Jjb3VudCA+PQorCQkJCUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9iY291bnQsIEFSQ0hfQ09OVkVSVCkpOworCQkJQVNTRVJUKGRxcC0+cV9yZXNfaWNvdW50ID49CisJCQkJSU5UX0dFVChkcXAtPnFfY29yZS5kX2ljb3VudCwgQVJDSF9DT05WRVJUKSk7CisJCQlBU1NFUlQoZHFwLT5xX3Jlc19ydGJjb3VudCA+PQorCQkJCUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9ydGJjb3VudCwgQVJDSF9DT05WRVJUKSk7CisJCX0KKwkJLyoKKwkJICogRG8gdGhlIGdyb3VwIHF1b3RhcyBuZXh0CisJCSAqLworCQlxYSA9IHRwLT50X2RxaW5mby0+ZHFhX2dycGRxdW90czsKKwl9Cit9CisKKy8qCisgKiBSZWxlYXNlIHRoZSByZXNlcnZhdGlvbnMsIGFuZCBhZGp1c3QgdGhlIGRxdW90cyBhY2NvcmRpbmdseS4KKyAqIFRoaXMgaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgYmVpbmcgYWJvcnRlZC4gSWYgYnkKKyAqIGFueSBjaGFuY2Ugd2UgaGF2ZSBkb25lIGRxdW90IG1vZGlmaWNhdGlvbnMgaW5jb3JlIChpZS4gZGVsdGFzKSBhbHJlYWR5LAorICogd2Ugc2ltcGx5IHRocm93IHRob3NlIGF3YXksIHNpbmNlIHRoYXQncyB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IKKyAqIHdoZW4gYSB0cmFuc2FjdGlvbiBpcyBjdXJ0YWlsZWQgd2l0aG91dCBhIGNvbW1pdC4KKyAqLworU1RBVElDIHZvaWQKK3hmc190cmFuc191bnJlc2VydmVfYW5kX21vZF9kcXVvdHMoCisJeGZzX3RyYW5zX3QJCSp0cCkKK3sKKwlpbnQJCQlpLCBqOworCXhmc19kcXVvdF90CQkqZHFwOworCXhmc19kcXRyeF90CQkqcXRyeCwgKnFhOworCWJvb2xlYW5fdAkJbG9ja2VkOworCisJaWYgKCF0cC0+dF9kcWluZm8gfHwgISh0cC0+dF9mbGFncyAmIFhGU19UUkFOU19EUV9ESVJUWSkpCisJCXJldHVybjsKKworCXFhID0gdHAtPnRfZHFpbmZvLT5kcWFfdXNyZHF1b3RzOworCisJZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworCQlmb3IgKGkgPSAwOyBpIDwgWEZTX1FNX1RSQU5TX01BWERRUzsgaSsrKSB7CisJCQlxdHJ4ID0gJnFhW2ldOworCQkJLyoKKwkJCSAqIFdlIGFzc3VtZSB0aGF0IHRoZSBhcnJheSBvZiBkcXVvdHMgaXMgZmlsbGVkCisJCQkgKiBzZXF1ZW50aWFsbHksIG5vdCBzcGFyc2VseS4KKwkJCSAqLworCQkJaWYgKChkcXAgPSBxdHJ4LT5xdF9kcXVvdCkgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCS8qCisJCQkgKiBVbnJlc2VydmUgdGhlIG9yaWdpbmFsIHJlc2VydmF0aW9uLiBXZSBkb24ndCBjYXJlCisJCQkgKiBhYm91dCB0aGUgbnVtYmVyIG9mIGJsb2NrcyB1c2VkIGZpZWxkLCBvciBkZWx0YXMuCisJCQkgKiBBbHNvIHdlIGRvbid0IGJvdGhlciB0byB6ZXJvIHRoZSBmaWVsZHMuCisJCQkgKi8KKwkJCWxvY2tlZCA9IEJfRkFMU0U7CisJCQlpZiAocXRyeC0+cXRfYmxrX3JlcykgeworCQkJCXhmc19kcWxvY2soZHFwKTsKKwkJCQlsb2NrZWQgPSBCX1RSVUU7CisJCQkJZHFwLT5xX3Jlc19iY291bnQgLT0KKwkJCQkJKHhmc19xY250X3QpcXRyeC0+cXRfYmxrX3JlczsKKwkJCX0KKwkJCWlmIChxdHJ4LT5xdF9pbm9fcmVzKSB7CisJCQkJaWYgKCFsb2NrZWQpIHsKKwkJCQkJeGZzX2RxbG9jayhkcXApOworCQkJCQlsb2NrZWQgPSBCX1RSVUU7CisJCQkJfQorCQkJCWRxcC0+cV9yZXNfaWNvdW50IC09CisJCQkJCSh4ZnNfcWNudF90KXF0cngtPnF0X2lub19yZXM7CisJCQl9CisKKwkJCWlmIChxdHJ4LT5xdF9ydGJsa19yZXMpIHsKKwkJCQlpZiAoIWxvY2tlZCkgeworCQkJCQl4ZnNfZHFsb2NrKGRxcCk7CisJCQkJCWxvY2tlZCA9IEJfVFJVRTsKKwkJCQl9CisJCQkJZHFwLT5xX3Jlc19ydGJjb3VudCAtPQorCQkJCQkoeGZzX3FjbnRfdClxdHJ4LT5xdF9ydGJsa19yZXM7CisJCQl9CisJCQlpZiAobG9ja2VkKQorCQkJCXhmc19kcXVubG9jayhkcXApOworCisJCX0KKwkJcWEgPSB0cC0+dF9kcWluZm8tPmRxYV9ncnBkcXVvdHM7CisJfQorfQorCisvKgorICogVGhpcyByZXNlcnZlcyBkaXNrIGJsb2NrcyBhbmQgaW5vZGVzIGFnYWluc3QgYSBkcXVvdC4KKyAqIEZsYWdzIGluZGljYXRlIGlmIHRoZSBkcXVvdCBpcyB0byBiZSBsb2NrZWQgaGVyZSBhbmQgYWxzbworICogaWYgdGhlIGJsayByZXNlcnZhdGlvbiBpcyBmb3IgUlQgb3IgcmVndWxhciBibG9ja3MuCisgKiBTZW5kaW5nIGluIFhGU19RTU9QVF9GT1JDRV9SRVMgZmxhZyBza2lwcyB0aGUgcXVvdGEgY2hlY2suCisgKiBSZXR1cm5zIEVEUVVPVCBpZiBxdW90YSBpcyBleGNlZWRlZC4KKyAqLworU1RBVElDIGludAoreGZzX3RyYW5zX2RxcmVzdigKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19kcXVvdF90CSpkcXAsCisJbG9uZwkJbmJsa3MsCisJbG9uZwkJbmlub3MsCisJdWludAkJZmxhZ3MpCit7CisJaW50CQllcnJvcjsKKwl4ZnNfcWNudF90CWhhcmRsaW1pdDsKKwl4ZnNfcWNudF90CXNvZnRsaW1pdDsKKwl0aW1lX3QJCWJ0aW1lcjsKKwl4ZnNfcWNudF90CSpyZXNiY291bnRwOworCXhmc19xdW90YWluZm9fdAkqcSA9IG1wLT5tX3F1b3RhaW5mbzsKKworCWlmICghIChmbGFncyAmIFhGU19RTU9QVF9EUUxPQ0spKSB7CisJCXhmc19kcWxvY2soZHFwKTsKKwl9CisJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQoZHFwKSk7CisJaWYgKGZsYWdzICYgWEZTX1RSQU5TX0RRX1JFU19CTEtTKSB7CisJCWhhcmRsaW1pdCA9IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpOworCQlpZiAoIWhhcmRsaW1pdCkKKwkJCWhhcmRsaW1pdCA9IHEtPnFpX2JoYXJkbGltaXQ7CisJCXNvZnRsaW1pdCA9IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpOworCQlpZiAoIXNvZnRsaW1pdCkKKwkJCXNvZnRsaW1pdCA9IHEtPnFpX2Jzb2Z0bGltaXQ7CisJCWJ0aW1lciA9IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9idGltZXIsIEFSQ0hfQ09OVkVSVCk7CisJCXJlc2Jjb3VudHAgPSAmZHFwLT5xX3Jlc19iY291bnQ7CisJfSBlbHNlIHsKKwkJQVNTRVJUKGZsYWdzICYgWEZTX1RSQU5TX0RRX1JFU19SVEJMS1MpOworCQloYXJkbGltaXQgPSBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfcnRiX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKTsKKwkJaWYgKCFoYXJkbGltaXQpCisJCQloYXJkbGltaXQgPSBxLT5xaV9ydGJoYXJkbGltaXQ7CisJCXNvZnRsaW1pdCA9IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9ydGJfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpOworCQlpZiAoIXNvZnRsaW1pdCkKKwkJCXNvZnRsaW1pdCA9IHEtPnFpX3J0YnNvZnRsaW1pdDsKKwkJYnRpbWVyID0gSU5UX0dFVChkcXAtPnFfY29yZS5kX3J0YnRpbWVyLCBBUkNIX0NPTlZFUlQpOworCQlyZXNiY291bnRwID0gJmRxcC0+cV9yZXNfcnRiY291bnQ7CisJfQorCWVycm9yID0gMDsKKworCWlmICgoZmxhZ3MgJiBYRlNfUU1PUFRfRk9SQ0VfUkVTKSA9PSAwICYmCisJICAgIGRxcC0+cV9jb3JlLmRfaWQgJiYKKwkgICAgWEZTX0lTX1FVT1RBX0VORk9SQ0VEKGRxcC0+cV9tb3VudCkpIHsKKyNpZmRlZiBRVU9UQURFQlVHCisJCWNtbl9lcnIoQ0VfREVCVUcsICJCTEsgUmVzOiBuYmxrcz0lbGQgKyByZXNiY291bnQ9JUxkIgorCQkJICAiID4gaGFyZGxpbWl0PSVMZD8iLCBuYmxrcywgKnJlc2Jjb3VudHAsIGhhcmRsaW1pdCk7CisjZW5kaWYKKwkJaWYgKG5ibGtzID4gMCkgeworCQkJLyoKKwkJCSAqIGRxdW90IGlzIGxvY2tlZCBhbHJlYWR5LiBTZWUgaWYgd2UnZCBnbyBvdmVyIHRoZQorCQkJICogaGFyZGxpbWl0IG9yIGV4Y2VlZCB0aGUgdGltZWxpbWl0IGlmIHdlIGFsbG9jYXRlCisJCQkgKiBuYmxrcy4KKwkJCSAqLworCQkJaWYgKGhhcmRsaW1pdCA+IDBVTEwgJiYKKwkJCSAgICAgKGhhcmRsaW1pdCA8PSBuYmxrcyArICpyZXNiY291bnRwKSkgeworCQkJCWVycm9yID0gRURRVU9UOworCQkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQkJfQorCisJCQlpZiAoc29mdGxpbWl0ID4gMFVMTCAmJgorCQkJICAgICAoc29mdGxpbWl0IDw9IG5ibGtzICsgKnJlc2Jjb3VudHApKSB7CisJCQkJLyoKKwkJCQkgKiBJZiB0aW1lciBvciB3YXJuaW5ncyBoYXMgZXhwaXJlZCwKKwkJCQkgKiByZXR1cm4gRURRVU9UCisJCQkJICovCisJCQkJaWYgKChidGltZXIgIT0gMCAmJiBnZXRfc2Vjb25kcygpID4gYnRpbWVyKSB8fAorCQkJCSAgICAoZHFwLT5xX2NvcmUuZF9id2FybnMgJiYKKwkJCQkgICAgIElOVF9HRVQoZHFwLT5xX2NvcmUuZF9id2FybnMsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQkgICAgIFhGU19RSV9CV0FSTkxJTUlUKGRxcC0+cV9tb3VudCkpKSB7CisJCQkJCWVycm9yID0gRURRVU9UOworCQkJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG5pbm9zID4gMCkgeworCQkJaGFyZGxpbWl0ID0gSU5UX0dFVChkcXAtPnFfY29yZS5kX2lub19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCk7CisJCQlpZiAoIWhhcmRsaW1pdCkKKwkJCQloYXJkbGltaXQgPSBxLT5xaV9paGFyZGxpbWl0OworCQkJc29mdGxpbWl0ID0gSU5UX0dFVChkcXAtPnFfY29yZS5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCk7CisJCQlpZiAoIXNvZnRsaW1pdCkKKwkJCQlzb2Z0bGltaXQgPSBxLT5xaV9pc29mdGxpbWl0OworCQkJaWYgKGhhcmRsaW1pdCA+IDBVTEwgJiYKKwkJCSAgICBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpID49IGhhcmRsaW1pdCkgeworCQkJCWVycm9yID0gRURRVU9UOworCQkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQkJfSBlbHNlIGlmIChzb2Z0bGltaXQgPiAwVUxMICYmCisJCQkJICAgSU5UX0dFVChkcXAtPnFfY29yZS5kX2ljb3VudCwgQVJDSF9DT05WRVJUKSA+PSBzb2Z0bGltaXQpIHsKKwkJCQkvKgorCQkJCSAqIElmIHRpbWVyIG9yIHdhcm5pbmdzIGhhcyBleHBpcmVkLAorCQkJCSAqIHJldHVybiBFRFFVT1QKKwkJCQkgKi8KKwkJCQlpZiAoKGRxcC0+cV9jb3JlLmRfaXRpbWVyICYmCisJCQkJICAgICBnZXRfc2Vjb25kcygpID4gSU5UX0dFVChkcXAtPnFfY29yZS5kX2l0aW1lciwgQVJDSF9DT05WRVJUKSkgfHwKKwkJCQkgICAgKGRxcC0+cV9jb3JlLmRfaXdhcm5zICYmCisJCQkJICAgICBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaXdhcm5zLCBBUkNIX0NPTlZFUlQpID49CisJCQkJICAgICBYRlNfUUlfSVdBUk5MSU1JVChkcXAtPnFfbW91bnQpKSkgeworCQkJCQllcnJvciA9IEVEUVVPVDsKKwkJCQkJZ290byBlcnJvcl9yZXR1cm47CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBDaGFuZ2UgdGhlIHJlc2VydmF0aW9uLCBidXQgbm90IHRoZSBhY3R1YWwgdXNhZ2UuCisJICogTm90ZSB0aGF0IHFfcmVzX2Jjb3VudCA9IHFfY29yZS5kX2Jjb3VudCArIHJlc3YKKwkgKi8KKwkoKnJlc2Jjb3VudHApICs9ICh4ZnNfcWNudF90KW5ibGtzOworCWlmIChuaW5vcyAhPSAwKQorCQlkcXAtPnFfcmVzX2ljb3VudCArPSAoeGZzX3FjbnRfdCluaW5vczsKKworCS8qCisJICogbm90ZSB0aGUgcmVzZXJ2YXRpb24gYW10IGluIHRoZSB0cmFucyBzdHJ1Y3QgdG9vLAorCSAqIHNvIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGtub3dzIGhvdyBtdWNoIHdhcyByZXNlcnZlZCBieQorCSAqIGl0IGFnYWluc3QgdGhpcyBwYXJ0aWN1bGFyIGRxdW90LgorCSAqIFdlIGRvbid0IGRvIHRoaXMgd2hlbiB3ZSBhcmUgcmVzZXJ2aW5nIGZvciBhIGRlbGF5ZWQgYWxsb2NhdGlvbiwKKwkgKiBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhlIGx1eHVyeSBvZiBhIHRyYW5zYWN0aW9uIGVudmVsb3BlIHRoZW4uCisJICovCisJaWYgKHRwKSB7CisJCUFTU0VSVCh0cC0+dF9kcWluZm8pOworCQlBU1NFUlQoZmxhZ3MgJiBYRlNfUU1PUFRfUkVTQkxLX01BU0spOworCQlpZiAobmJsa3MgIT0gMCkKKwkJCXhmc190cmFuc19tb2RfZHF1b3QodHAsIGRxcCwKKwkJCQkJICAgIGZsYWdzICYgWEZTX1FNT1BUX1JFU0JMS19NQVNLLAorCQkJCQkgICAgbmJsa3MpOworCQlpZiAobmlub3MgIT0gMCkKKwkJCXhmc190cmFuc19tb2RfZHF1b3QodHAsIGRxcCwKKwkJCQkJICAgIFhGU19UUkFOU19EUV9SRVNfSU5PUywKKwkJCQkJICAgIG5pbm9zKTsKKwl9CisJQVNTRVJUKGRxcC0+cV9yZXNfYmNvdW50ID49IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9iY291bnQsIEFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVChkcXAtPnFfcmVzX3J0YmNvdW50ID49IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9ydGJjb3VudCwgQVJDSF9DT05WRVJUKSk7CisJQVNTRVJUKGRxcC0+cV9yZXNfaWNvdW50ID49IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9pY291bnQsIEFSQ0hfQ09OVkVSVCkpOworCitlcnJvcl9yZXR1cm46CisJaWYgKCEgKGZsYWdzICYgWEZTX1FNT1BUX0RRTE9DSykpIHsKKwkJeGZzX2RxdW5sb2NrKGRxcCk7CisJfQorCXJldHVybiAoZXJyb3IpOworfQorCisKKy8qCisgKiBHaXZlbiBhIGRxdW90KHMpLCBtYWtlIGRpc2sgYmxvY2sgYW5kL29yIGlub2RlIHJlc2VydmF0aW9ucyBhZ2FpbnN0IHRoZW0uCisgKiBUaGUgZmFjdCB0aGF0IHRoaXMgZG9lcyB0aGUgcmVzZXJ2YXRpb24gYWdhaW5zdCBib3RoIHRoZSB1c3IgYW5kCisgKiBncnAgcXVvdGFzIGlzIGltcG9ydGFudCwgYmVjYXVzZSB0aGlzIGZvbGxvd3MgYSBib3RoLW9yLW5vdGhpbmcKKyAqIGFwcHJvYWNoLgorICoKKyAqIGZsYWdzID0gWEZTX1FNT1BUX0RRTE9DSyBpbmRpY2F0ZSBpZiBkcXVvdChzKSBuZWVkIHRvIGJlIGxvY2tlZC4KKyAqCSAgIFhGU19RTU9QVF9GT1JDRV9SRVMgZXZhZGVzIGxpbWl0IGVuZm9yY2VtZW50LiBVc2VkIGJ5IGNob3duLgorICoJICAgWEZTX1RSQU5TX0RRX1JFU19CTEtTIHJlc2VydmVzIHJlZ3VsYXIgZGlzayBibG9ja3MKKyAqCSAgIFhGU19UUkFOU19EUV9SRVNfUlRCTEtTIHJlc2VydmVzIHJlYWx0aW1lIGRpc2sgYmxvY2tzCisgKiBkcXVvdHMgYXJlIHVubG9ja2VkIG9uIHJldHVybiwgaWYgdGhleSB3ZXJlIG5vdCBsb2NrZWQgYnkgY2FsbGVyLgorICovCitpbnQKK3hmc190cmFuc19yZXNlcnZlX3F1b3RhX2J5ZHF1b3RzKAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2RxdW90X3QJKnVkcXAsCisJeGZzX2RxdW90X3QJKmdkcXAsCisJbG9uZwkJbmJsa3MsCisJbG9uZwkJbmlub3MsCisJdWludAkJZmxhZ3MpCit7CisJaW50CQlyZXN2ZDsKKworCWlmICghIFhGU19JU19RVU9UQV9PTihtcCkpCisJCXJldHVybiAoMCk7CisKKwlpZiAodHAgJiYgdHAtPnRfZHFpbmZvID09IE5VTEwpCisJCXhmc190cmFuc19hbGxvY19kcWluZm8odHApOworCisJQVNTRVJUKGZsYWdzICYgWEZTX1FNT1BUX1JFU0JMS19NQVNLKTsKKwlyZXN2ZCA9IDA7CisKKwlpZiAodWRxcCkgeworCQlpZiAoeGZzX3RyYW5zX2RxcmVzdih0cCwgbXAsIHVkcXAsIG5ibGtzLCBuaW5vcywgZmxhZ3MpKQorCQkJcmV0dXJuIChFRFFVT1QpOworCQlyZXN2ZCA9IDE7CisJfQorCisJaWYgKGdkcXApIHsKKwkJaWYgKHhmc190cmFuc19kcXJlc3YodHAsIG1wLCBnZHFwLCBuYmxrcywgbmlub3MsIGZsYWdzKSkgeworCQkJLyoKKwkJCSAqIGNhbid0IGRvIGl0LCBzbyBiYWNrb3V0IHByZXZpb3VzIHJlc2VydmF0aW9uCisJCQkgKi8KKwkJCWlmIChyZXN2ZCkgeworCQkJCWZsYWdzIHw9IFhGU19RTU9QVF9GT1JDRV9SRVM7CisJCQkJeGZzX3RyYW5zX2RxcmVzdih0cCwgbXAsIHVkcXAsCisJCQkJCQkgLW5ibGtzLCAtbmlub3MsIGZsYWdzKTsKKwkJCX0KKwkJCXJldHVybiAoRURRVU9UKTsKKwkJfQorCX0KKworCS8qCisJICogRGlkbnQgY2hhbmdlIGFueXRoaW5nIGNyaXRpY2FsLCBzbywgbm8gbmVlZCB0byBsb2cKKwkgKi8KKwlyZXR1cm4gKDApOworfQorCisKKy8qCisgKiBMb2NrIHRoZSBkcXVvdCBhbmQgY2hhbmdlIHRoZSByZXNlcnZhdGlvbiBpZiB3ZSBjYW4uCisgKiBUaGlzIGRvZXNuJ3QgY2hhbmdlIHRoZSBhY3R1YWwgdXNhZ2UsIGp1c3QgdGhlIHJlc2VydmF0aW9uLgorICogVGhlIGlub2RlIHNlbnQgaW4gaXMgbG9ja2VkLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBFRFFVT1Qgb3Igb3RoZXIgZXJyb3JzIG90aGVyd2lzZQorICovCitTVEFUSUMgaW50Cit4ZnNfdHJhbnNfcmVzZXJ2ZV9xdW90YV9uYmxrcygKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19pbm9kZV90CSppcCwKKwlsb25nCQluYmxrcywKKwlsb25nCQluaW5vcywKKwl1aW50CQl0eXBlKQoreworCWludAkJZXJyb3I7CisKKwlpZiAoIVhGU19JU19RVU9UQV9PTihtcCkpCisJCXJldHVybiAoMCk7CisKKwlBU1NFUlQoaXAtPmlfaW5vICE9IG1wLT5tX3NiLnNiX3VxdW90aW5vKTsKKwlBU1NFUlQoaXAtPmlfaW5vICE9IG1wLT5tX3NiLnNiX2dxdW90aW5vKTsKKworCUFTU0VSVChYRlNfSVNMT0NLRURfSU5PREVfRVhDTChpcCkpOworCUFTU0VSVChYRlNfSVNfUVVPVEFfUlVOTklORyhpcC0+aV9tb3VudCkpOworCUFTU0VSVCgodHlwZSAmIH5YRlNfUU1PUFRfRk9SQ0VfUkVTKSA9PSBYRlNfVFJBTlNfRFFfUkVTX1JUQkxLUyB8fAorCSAgICAgICAodHlwZSAmIH5YRlNfUU1PUFRfRk9SQ0VfUkVTKSA9PSBYRlNfVFJBTlNfRFFfUkVTX0JMS1MpOworCisJLyoKKwkgKiBSZXNlcnZlIG5ibGtzIGFnYWluc3QgdGhlc2UgZHF1b3RzLCB3aXRoIHRyYW5zIGFzIHRoZSBtZWRpYXRvci4KKwkgKi8KKwllcnJvciA9IHhmc190cmFuc19yZXNlcnZlX3F1b3RhX2J5ZHF1b3RzKHRwLCBtcCwKKwkJCQkJCSBpcC0+aV91ZHF1b3QsIGlwLT5pX2dkcXVvdCwKKwkJCQkJCSBuYmxrcywgbmlub3MsCisJCQkJCQkgdHlwZSk7CisJcmV0dXJuIChlcnJvcik7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGFsbG9jYXRlIGEgcXVvdGFvZmYgbG9nIGl0ZW0uCisgKi8KK3hmc19xb2ZmX2xvZ2l0ZW1fdCAqCit4ZnNfdHJhbnNfZ2V0X3FvZmZfaXRlbSgKKwl4ZnNfdHJhbnNfdAkJKnRwLAorCXhmc19xb2ZmX2xvZ2l0ZW1fdAkqc3RhcnRxb2ZmLAorCXVpbnQJCQlmbGFncykKK3sKKwl4ZnNfcW9mZl9sb2dpdGVtX3QJKnE7CisKKwlBU1NFUlQodHAgIT0gTlVMTCk7CisKKwlxID0geGZzX3FtX3FvZmZfbG9naXRlbV9pbml0KHRwLT50X21vdW50cCwgc3RhcnRxb2ZmLCBmbGFncyk7CisJQVNTRVJUKHEgIT0gTlVMTCk7CisKKwkvKgorCSAqIEdldCBhIGxvZ19pdGVtX2Rlc2MgdG8gcG9pbnQgYXQgdGhlIG5ldyBpdGVtLgorCSAqLworCSh2b2lkKSB4ZnNfdHJhbnNfYWRkX2l0ZW0odHAsICh4ZnNfbG9nX2l0ZW1fdCopcSk7CisKKwlyZXR1cm4gKHEpOworfQorCisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byBtYXJrIHRoZSBxdW90YW9mZiBsb2dpdGVtIGFzIG5lZWRpbmcKKyAqIHRvIGJlIGxvZ2dlZCB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQuICBUaGUgbG9naXRlbSBtdXN0CisgKiBhbHJlYWR5IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24uCisgKi8KK3ZvaWQKK3hmc190cmFuc19sb2dfcXVvdGFvZmZfaXRlbSgKKwl4ZnNfdHJhbnNfdAkJKnRwLAorCXhmc19xb2ZmX2xvZ2l0ZW1fdAkqcWxwKQoreworCXhmc19sb2dfaXRlbV9kZXNjX3QJKmxpZHA7CisKKwlsaWRwID0geGZzX3RyYW5zX2ZpbmRfaXRlbSh0cCwgKHhmc19sb2dfaXRlbV90ICopcWxwKTsKKwlBU1NFUlQobGlkcCAhPSBOVUxMKTsKKworCXRwLT50X2ZsYWdzIHw9IFhGU19UUkFOU19ESVJUWTsKKwlsaWRwLT5saWRfZmxhZ3MgfD0gWEZTX0xJRF9ESVJUWTsKK30KKworU1RBVElDIHZvaWQKK3hmc190cmFuc19hbGxvY19kcWluZm8oCisJeGZzX3RyYW5zX3QJKnRwKQoreworCSh0cCktPnRfZHFpbmZvID0ga21lbV96b25lX3phbGxvYyh4ZnNfR3FtLT5xbV9kcXRyeHpvbmUsIEtNX1NMRUVQKTsKK30KKworU1RBVElDIHZvaWQKK3hmc190cmFuc19mcmVlX2RxaW5mbygKKwl4ZnNfdHJhbnNfdAkqdHApCit7CisJaWYgKCF0cC0+dF9kcWluZm8pCisJCXJldHVybjsKKwlrbWVtX3pvbmVfZnJlZSh4ZnNfR3FtLT5xbV9kcXRyeHpvbmUsICh0cCktPnRfZHFpbmZvKTsKKwkodHApLT50X2RxaW5mbyA9IE5VTEw7Cit9CisKK3hmc19kcXRyeG9wc190CXhmc190cmFuc19kcXVvdF9vcHMgPSB7CisJLnFvX2R1cF9kcWluZm8JCQk9IHhmc190cmFuc19kdXBfZHFpbmZvLAorCS5xb19mcmVlX2RxaW5mbwkJCT0geGZzX3RyYW5zX2ZyZWVfZHFpbmZvLAorCS5xb19tb2RfZHF1b3RfYnlpbm8JCT0geGZzX3RyYW5zX21vZF9kcXVvdF9ieWlubywKKwkucW9fYXBwbHlfZHF1b3RfZGVsdGFzCQk9IHhmc190cmFuc19hcHBseV9kcXVvdF9kZWx0YXMsCisJLnFvX3Jlc2VydmVfcXVvdGFfbmJsa3MJCT0geGZzX3RyYW5zX3Jlc2VydmVfcXVvdGFfbmJsa3MsCisJLnFvX3Jlc2VydmVfcXVvdGFfYnlkcXVvdHMJPSB4ZnNfdHJhbnNfcmVzZXJ2ZV9xdW90YV9ieWRxdW90cywKKwkucW9fdW5yZXNlcnZlX2FuZF9tb2RfZHF1b3RzCT0geGZzX3RyYW5zX3VucmVzZXJ2ZV9hbmRfbW9kX2RxdW90cywKK307CmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jIGIvZnMveGZzL3N1cHBvcnQvZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDZlMWYzCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3N1cHBvcnQvZGVidWcuYwpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgImRlYnVnLmgiCisKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKK2ludAkJCWRvYXNzID0gMTsKK3N0YXRpYyBjaGFyCQltZXNzYWdlWzI1Nl07CS8qIGtlZXAgaXQgb2ZmIHRoZSBzdGFjayAqLworc3RhdGljIERFRklORV9TUElOTE9DSyh4ZnNfZXJyX2xvY2spOworCisvKiBUcmFuc2xhdGUgZnJvbSBDRV9GT08gdG8gS0VSTl9GT08sIGVycl9sZXZlbChDRV9GT08pID09IEtFUk5fRk9PICovCisjZGVmaW5lIFhGU19NQVhfRVJSX0xFVkVMCTcKKyNkZWZpbmUgWEZTX0VSUl9NQVNLCQkoKDEgPDwgMykgLSAxKQorc3RhdGljIGNoYXIJCSplcnJfbGV2ZWxbWEZTX01BWF9FUlJfTEVWRUwrMV0gPQorCQkJCQl7S0VSTl9FTUVSRywgS0VSTl9BTEVSVCwgS0VSTl9DUklULAorCQkJCQkgS0VSTl9FUlIsIEtFUk5fV0FSTklORywgS0VSTl9OT1RJQ0UsCisJCQkJCSBLRVJOX0lORk8sIEtFUk5fREVCVUd9OworCit2b2lkCithc3NmYWlsKGNoYXIgKmEsIGNoYXIgKmYsIGludCBsKQoreworICAgIHByaW50aygiWEZTIGFzc2VydGlvbiBmYWlsZWQ6ICVzLCBmaWxlOiAlcywgbGluZTogJWRcbiIsIGEsIGYsIGwpOworICAgIEJVRygpOworfQorCisjaWYgKChkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKElORFVDRV9JT19FUlJST1IpKSAmJiAhZGVmaW5lZChOT19XQU5UX1JBTkRPTSkpCisKK3Vuc2lnbmVkIGxvbmcKK3JhbmRvbSh2b2lkKQoreworCXN0YXRpYyB1bnNpZ25lZCBsb25nCVJhbmRvbVZhbHVlID0gMTsKKwkvKiBjeWNsZXMgcHNldWRvLXJhbmRvbWx5IHRocm91Z2ggYWxsIHZhbHVlcyBiZXR3ZWVuIDEgYW5kIDJeMzEgLSAyICovCisJcmVnaXN0ZXIgbG9uZwlydiA9IFJhbmRvbVZhbHVlOworCXJlZ2lzdGVyIGxvbmcJbG87CisJcmVnaXN0ZXIgbG9uZwloaTsKKworCWhpID0gcnYgLyAxMjc3NzM7CisJbG8gPSBydiAlIDEyNzc3MzsKKwlydiA9IDE2ODA3ICogbG8gLSAyODM2ICogaGk7CisJaWYoIHJ2IDw9IDAgKSBydiArPSAyMTQ3NDgzNjQ3OworCXJldHVybiggUmFuZG9tVmFsdWUgPSBydiApOworfQorCitpbnQKK2dldF90aHJlYWRfaWQodm9pZCkKK3sKKwlyZXR1cm4gY3VycmVudC0+cGlkOworfQorCisjZW5kaWYgLyogREVCVUcgfHwgSU5EVUNFX0lPX0VSUlJPUiB8fCAhTk9fV0FOVF9SQU5ET00gKi8KKwordm9pZAorY21uX2VycihyZWdpc3RlciBpbnQgbGV2ZWwsIGNoYXIgKmZtdCwgLi4uKQoreworCWNoYXIJKmZwID0gZm10OworCWludAlsZW47CisJdWxvbmcJZmxhZ3M7CisJdmFfbGlzdAlhcDsKKworCWxldmVsICY9IFhGU19FUlJfTUFTSzsKKwlpZiAobGV2ZWwgPiBYRlNfTUFYX0VSUl9MRVZFTCkKKwkJbGV2ZWwgPSBYRlNfTUFYX0VSUl9MRVZFTDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeGZzX2Vycl9sb2NrLGZsYWdzKTsKKwl2YV9zdGFydChhcCwgZm10KTsKKwlpZiAoKmZtdCA9PSAnIScpIGZwKys7CisJbGVuID0gdnNwcmludGYobWVzc2FnZSwgZnAsIGFwKTsKKwlpZiAobWVzc2FnZVtsZW4tMV0gIT0gJ1xuJykKKwkJc3RyY2F0KG1lc3NhZ2UsICJcbiIpOworCXByaW50aygiJXMlcyIsIGVycl9sZXZlbFtsZXZlbF0sIG1lc3NhZ2UpOworCXZhX2VuZChhcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGZzX2Vycl9sb2NrLGZsYWdzKTsKKworCWlmIChsZXZlbCA9PSBDRV9QQU5JQykKKwkJQlVHKCk7Cit9CisKKwordm9pZAoraWNtbl9lcnIocmVnaXN0ZXIgaW50IGxldmVsLCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisJdWxvbmcJZmxhZ3M7CisJaW50CWxlbjsKKworCWxldmVsICY9IFhGU19FUlJfTUFTSzsKKwlpZihsZXZlbCA+IFhGU19NQVhfRVJSX0xFVkVMKQorCQlsZXZlbCA9IFhGU19NQVhfRVJSX0xFVkVMOworCXNwaW5fbG9ja19pcnFzYXZlKCZ4ZnNfZXJyX2xvY2ssZmxhZ3MpOworCWxlbiA9IHZzcHJpbnRmKG1lc3NhZ2UsIGZtdCwgYXApOworCWlmIChtZXNzYWdlW2xlbi0xXSAhPSAnXG4nKQorCQlzdHJjYXQobWVzc2FnZSwgIlxuIik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGZzX2Vycl9sb2NrLGZsYWdzKTsKKwlwcmludGsoIiVzJXMiLCBlcnJfbGV2ZWxbbGV2ZWxdLCBtZXNzYWdlKTsKKwlpZiAobGV2ZWwgPT0gQ0VfUEFOSUMpCisJCUJVRygpOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3N1cHBvcnQvZGVidWcuaCBiL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBiMGY0YwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYJX19YRlNfU1VQUE9SVF9ERUJVR19IX18KKyNkZWZpbmUJX19YRlNfU1VQUE9SVF9ERUJVR19IX18KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjZGVmaW5lIENFX0RFQlVHICAgICAgICA3ICAgICAgICAgICAgICAgLyogZGVidWcgICAgICAgICovCisjZGVmaW5lIENFX0NPTlQgICAgICAgICA2ICAgICAgICAgICAgICAgLyogY29udGludWF0aW9uICovCisjZGVmaW5lIENFX05PVEUgICAgICAgICA1ICAgICAgICAgICAgICAgLyogbm90aWNlICAgICAgICovCisjZGVmaW5lIENFX1dBUk4gICAgICAgICA0ICAgICAgICAgICAgICAgLyogd2FybmluZyAgICAgICovCisjZGVmaW5lIENFX0FMRVJUICAgICAgICAxICAgICAgICAgICAgICAgLyogYWxlcnQgICAgICAgICovCisjZGVmaW5lIENFX1BBTklDICAgICAgICAwICAgICAgICAgICAgICAgLyogcGFuaWMgICAgICAgICovCisKK2V4dGVybiB2b2lkIGljbW5fZXJyKGludCwgY2hhciAqLCB2YV9saXN0KTsKKy8qIFBSSU5URkxJS0UyICovCitleHRlcm4gdm9pZCBjbW5fZXJyKGludCwgY2hhciAqLCAuLi4pOworCisjaWZuZGVmIFNUQVRJQworIyBkZWZpbmUgU1RBVElDIHN0YXRpYworI2VuZGlmCisKKyNpZmRlZiBERUJVRworIyBpZmRlZiBsaW50CisjICBkZWZpbmUgQVNTRVJUKEVYKQkoKHZvaWQpMCkgLyogYXZvaWQgImNvbnN0YW50IGluIGNvbmRpdGlvbmFsIiBiYWJibGUgKi8KKyMgZWxzZQorIyAgZGVmaW5lIEFTU0VSVChFWCkgKCghZG9hc3N8fChFWCkpPygodm9pZCkwKTphc3NmYWlsKCNFWCwgX19GSUxFX18sIF9fTElORV9fKSkKKyMgZW5kaWYJLyogbGludCAqLworI2Vsc2UKKyMgZGVmaW5lIEFTU0VSVCh4KQkoKHZvaWQpMCkKKyNlbmRpZgorCitleHRlcm4gaW50IGRvYXNzOwkJLyogZHluYW1pY2FsbHkgdHVybiBvZmYgYXNzZXJ0cyAqLworZXh0ZXJuIHZvaWQgYXNzZmFpbChjaGFyICosIGNoYXIgKiwgaW50KTsKKyNpZmRlZiBERUJVRworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcmFuZG9tKHZvaWQpOworZXh0ZXJuIGludCBnZXRfdGhyZWFkX2lkKHZvaWQpOworI2VuZGlmCisKKyNkZWZpbmUgQVNTRVJUX0FMV0FZUyhFWCkgICgoRVgpPygodm9pZCkwKTphc3NmYWlsKCNFWCwgX19GSUxFX18sIF9fTElORV9fKSkKKyNkZWZpbmUJZGVidWdfc3RvcF9hbGxfY3B1cyhwYXJhbSkJLyogcGFyYW0gaXMgImNwdW1hc2tfdCAqIiAqLworCisjZW5kaWYgIC8qIF9fWEZTX1NVUFBPUlRfREVCVUdfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9rdHJhY2UuYyBiL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYWUxNGMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvc3VwcG9ydC9rdHJhY2UuYwpAQCAtMCwwICsxLDM0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgPHhmcy5oPgorCitzdGF0aWMga21lbV96b25lX3QgKmt0cmFjZV9oZHJfem9uZTsKK3N0YXRpYyBrbWVtX3pvbmVfdCAqa3RyYWNlX2VudF96b25lOworc3RhdGljIGludCAgICAgICAgICBrdHJhY2VfemVudHJpZXM7CisKK3ZvaWQKK2t0cmFjZV9pbml0KGludCB6ZW50cmllcykKK3sKKwlrdHJhY2VfemVudHJpZXMgPSB6ZW50cmllczsKKworCWt0cmFjZV9oZHJfem9uZSA9IGttZW1fem9uZV9pbml0KHNpemVvZihrdHJhY2VfdCksCisJCQkJCSJrdHJhY2VfaGRyIik7CisJQVNTRVJUKGt0cmFjZV9oZHJfem9uZSk7CisKKwlrdHJhY2VfZW50X3pvbmUgPSBrbWVtX3pvbmVfaW5pdChrdHJhY2VfemVudHJpZXMKKwkJCQkJKiBzaXplb2Yoa3RyYWNlX2VudHJ5X3QpLAorCQkJCQkia3RyYWNlX2VudCIpOworCUFTU0VSVChrdHJhY2VfZW50X3pvbmUpOworfQorCit2b2lkCitrdHJhY2VfdW5pbml0KHZvaWQpCit7CisJa21lbV9jYWNoZV9kZXN0cm95KGt0cmFjZV9oZHJfem9uZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KGt0cmFjZV9lbnRfem9uZSk7Cit9CisKKy8qCisgKiBrdHJhY2VfYWxsb2MoKQorICoKKyAqIEFsbG9jYXRlIGEga3RyYWNlIGhlYWRlciBhbmQgZW5vdWdoIGJ1ZmZlcmluZyBmb3IgdGhlIGdpdmVuCisgKiBudW1iZXIgb2YgZW50cmllcy4KKyAqLwora3RyYWNlX3QgKgora3RyYWNlX2FsbG9jKGludCBuZW50cmllcywgaW50IHNsZWVwKQoreworCWt0cmFjZV90ICAgICAgICAqa3RwOworCWt0cmFjZV9lbnRyeV90ICAqa3RlcDsKKworCWt0cCA9IChrdHJhY2VfdCopa21lbV96b25lX2FsbG9jKGt0cmFjZV9oZHJfem9uZSwgc2xlZXApOworCisJaWYgKGt0cCA9PSAoa3RyYWNlX3QqKU5VTEwpIHsKKwkJLyoKKwkJICogS01fU0xFRVAgY2FsbGVycyBkb24ndCBleHBlY3QgZmFpbHVyZS4KKwkJICovCisJCWlmIChzbGVlcCAmIEtNX1NMRUVQKQorCQkJcGFuaWMoImt0cmFjZV9hbGxvYzogTlVMTCBtZW1vcnkgb24gS01fU0xFRVAgcmVxdWVzdCEiKTsKKworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKgorCSAqIFNwZWNpYWwgdHJlYXRtZW50IGZvciBidWZmZXJzIHdpdGggdGhlIGt0cmFjZV96ZW50cmllcyBlbnRyaWVzCisJICovCisJaWYgKG5lbnRyaWVzID09IGt0cmFjZV96ZW50cmllcykgeworCQlrdGVwID0gKGt0cmFjZV9lbnRyeV90KilrbWVtX3pvbmVfemFsbG9jKGt0cmFjZV9lbnRfem9uZSwKKwkJCQkJCQkgICAgc2xlZXApOworCX0gZWxzZSB7CisJCWt0ZXAgPSAoa3RyYWNlX2VudHJ5X3QqKWttZW1femFsbG9jKChuZW50cmllcyAqIHNpemVvZigqa3RlcCkpLAorCQkJCQkJCSAgICBzbGVlcCk7CisJfQorCisJaWYgKGt0ZXAgPT0gTlVMTCkgeworCQkvKgorCQkgKiBLTV9TTEVFUCBjYWxsZXJzIGRvbid0IGV4cGVjdCBmYWlsdXJlLgorCQkgKi8KKwkJaWYgKHNsZWVwICYgS01fU0xFRVApCisJCQlwYW5pYygia3RyYWNlX2FsbG9jOiBOVUxMIG1lbW9yeSBvbiBLTV9TTEVFUCByZXF1ZXN0ISIpOworCisJCWttZW1fZnJlZShrdHAsIHNpemVvZigqa3RwKSk7CisKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3BpbmxvY2tfaW5pdCgmKGt0cC0+a3RfbG9jayksICJrdF9sb2NrIik7CisKKwlrdHAtPmt0X2VudHJpZXMgID0ga3RlcDsKKwlrdHAtPmt0X25lbnRyaWVzID0gbmVudHJpZXM7CisJa3RwLT5rdF9pbmRleCAgICA9IDA7CisJa3RwLT5rdF9yb2xsb3ZlciA9IDA7CisJcmV0dXJuIGt0cDsKK30KKworCisvKgorICoga3RyYWNlX2ZyZWUoKQorICoKKyAqIEZyZWUgdXAgdGhlIGt0cmFjZSBoZWFkZXIgYW5kIGJ1ZmZlci4gIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIKKyAqIHRvIGVuc3VyZSB0aGF0IG5vLW9uZSBpcyByZWZlcmVuY2luZyBpdC4KKyAqLwordm9pZAora3RyYWNlX2ZyZWUoa3RyYWNlX3QgKmt0cCkKK3sKKwlpbnQgICAgIGVudHJpZXNfc2l6ZTsKKworCWlmIChrdHAgPT0gKGt0cmFjZV90ICopTlVMTCkKKwkJcmV0dXJuOworCisJc3BpbmxvY2tfZGVzdHJveSgma3RwLT5rdF9sb2NrKTsKKworCS8qCisJICogU3BlY2lhbCB0cmVhdG1lbnQgZm9yIHRoZSBWbm9kZSB0cmFjZSBidWZmZXIuCisJICovCisJaWYgKGt0cC0+a3RfbmVudHJpZXMgPT0ga3RyYWNlX3plbnRyaWVzKSB7CisJCWttZW1fem9uZV9mcmVlKGt0cmFjZV9lbnRfem9uZSwga3RwLT5rdF9lbnRyaWVzKTsKKwl9IGVsc2UgeworCQllbnRyaWVzX3NpemUgPSAoaW50KShrdHAtPmt0X25lbnRyaWVzICogc2l6ZW9mKGt0cmFjZV9lbnRyeV90KSk7CisKKwkJa21lbV9mcmVlKGt0cC0+a3RfZW50cmllcywgZW50cmllc19zaXplKTsKKwl9CisKKwlrbWVtX3pvbmVfZnJlZShrdHJhY2VfaGRyX3pvbmUsIGt0cCk7Cit9CisKKworLyoKKyAqIEVudGVyIHRoZSBnaXZlbiB2YWx1ZXMgaW50byB0aGUgIm5leHQiIGVudHJ5IGluIHRoZSB0cmFjZSBidWZmZXIuCisgKiBrdF9pbmRleCBpcyBhbHdheXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGVudHJ5IHRvIGJlIGZpbGxlZC4KKyAqLwordm9pZAora3RyYWNlX2VudGVyKAorCWt0cmFjZV90ICAgICAgICAqa3RwLAorCXZvaWQgICAgICAgICAgICAqdmFsMCwKKwl2b2lkICAgICAgICAgICAgKnZhbDEsCisJdm9pZCAgICAgICAgICAgICp2YWwyLAorCXZvaWQgICAgICAgICAgICAqdmFsMywKKwl2b2lkICAgICAgICAgICAgKnZhbDQsCisJdm9pZCAgICAgICAgICAgICp2YWw1LAorCXZvaWQgICAgICAgICAgICAqdmFsNiwKKwl2b2lkICAgICAgICAgICAgKnZhbDcsCisJdm9pZCAgICAgICAgICAgICp2YWw4LAorCXZvaWQgICAgICAgICAgICAqdmFsOSwKKwl2b2lkICAgICAgICAgICAgKnZhbDEwLAorCXZvaWQgICAgICAgICAgICAqdmFsMTEsCisJdm9pZCAgICAgICAgICAgICp2YWwxMiwKKwl2b2lkICAgICAgICAgICAgKnZhbDEzLAorCXZvaWQgICAgICAgICAgICAqdmFsMTQsCisJdm9pZCAgICAgICAgICAgICp2YWwxNSkKK3sKKwlzdGF0aWMgbG9ja190ICAgd3JhcF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJaW50ICAgICAgICAgICAgIGluZGV4OworCWt0cmFjZV9lbnRyeV90ICAqa3RlcDsKKworCUFTU0VSVChrdHAgIT0gTlVMTCk7CisKKwkvKgorCSAqIEdyYWIgYW4gZW50cnkgYnkgcHVzaGluZyB0aGUgaW5kZXggdXAgdG8gdGhlIG5leHQgb25lLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ3cmFwX2xvY2ssIGZsYWdzKTsKKwlpbmRleCA9IGt0cC0+a3RfaW5kZXg7CisJaWYgKCsra3RwLT5rdF9pbmRleCA9PSBrdHAtPmt0X25lbnRyaWVzKQorCQlrdHAtPmt0X2luZGV4ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cmFwX2xvY2ssIGZsYWdzKTsKKworCWlmICgha3RwLT5rdF9yb2xsb3ZlciAmJiBpbmRleCA9PSBrdHAtPmt0X25lbnRyaWVzIC0gMSkKKwkJa3RwLT5rdF9yb2xsb3ZlciA9IDE7CisKKwlBU1NFUlQoKGluZGV4ID49IDApICYmIChpbmRleCA8IGt0cC0+a3RfbmVudHJpZXMpKTsKKworCWt0ZXAgPSAmKGt0cC0+a3RfZW50cmllc1tpbmRleF0pOworCisJa3RlcC0+dmFsWzBdICA9IHZhbDA7CisJa3RlcC0+dmFsWzFdICA9IHZhbDE7CisJa3RlcC0+dmFsWzJdICA9IHZhbDI7CisJa3RlcC0+dmFsWzNdICA9IHZhbDM7CisJa3RlcC0+dmFsWzRdICA9IHZhbDQ7CisJa3RlcC0+dmFsWzVdICA9IHZhbDU7CisJa3RlcC0+dmFsWzZdICA9IHZhbDY7CisJa3RlcC0+dmFsWzddICA9IHZhbDc7CisJa3RlcC0+dmFsWzhdICA9IHZhbDg7CisJa3RlcC0+dmFsWzldICA9IHZhbDk7CisJa3RlcC0+dmFsWzEwXSA9IHZhbDEwOworCWt0ZXAtPnZhbFsxMV0gPSB2YWwxMTsKKwlrdGVwLT52YWxbMTJdID0gdmFsMTI7CisJa3RlcC0+dmFsWzEzXSA9IHZhbDEzOworCWt0ZXAtPnZhbFsxNF0gPSB2YWwxNDsKKwlrdGVwLT52YWxbMTVdID0gdmFsMTU7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSB0cmFjZSBidWZmZXIuCisgKi8KK2ludAora3RyYWNlX25lbnRyaWVzKAorCWt0cmFjZV90ICAgICAgICAqa3RwKQoreworCWlmIChrdHAgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gKGt0cC0+a3Rfcm9sbG92ZXIgPyBrdHAtPmt0X25lbnRyaWVzIDoga3RwLT5rdF9pbmRleCk7Cit9CisKKy8qCisgKiBrdHJhY2VfZmlyc3QoKQorICoKKyAqIFRoaXMgaXMgdXNlZCB0byBmaW5kIHRoZSBzdGFydCBvZiB0aGUgdHJhY2UgYnVmZmVyLgorICogSW4gY29uanVuY3Rpb24gd2l0aCBrdHJhY2VfbmV4dCgpIGl0IGNhbiBiZSB1c2VkIHRvCisgKiBpdGVyYXRlIHRocm91Z2ggdGhlIGVudGlyZSB0cmFjZSBidWZmZXIuICBUaGlzIGNvZGUgZG9lcworICogbm90IGRvIGFueSBsb2NraW5nIGJlY2F1c2UgaXQgaXMgYXNzdW1lZCB0aGF0IGl0IGlzIGNhbGxlZAorICogZnJvbSB0aGUgZGVidWdnZXIuCisgKgorICogVGhlIGNhbGxlciBtdXN0IHBhc3MgaW4gYSBwb2ludGVyIHRvIGEga3RyYWNlX3NuYXAKKyAqIHN0cnVjdHVyZSBpbiB3aGljaCB3ZSB3aWxsIGtlZXAgc29tZSBzdGF0ZSB1c2VkIHRvCisgKiBpdGVyYXRlIHRocm91Z2ggdGhlIGJ1ZmZlci4gIFRoaXMgc3RhdGUgbXVzdCBub3QgdG91Y2hlZAorICogYnkgYW55IGNvZGUgb3V0c2lkZSBvZiB0aGlzIG1vZHVsZS4KKyAqLwora3RyYWNlX2VudHJ5X3QgKgora3RyYWNlX2ZpcnN0KGt0cmFjZV90ICAgKmt0cCwga3RyYWNlX3NuYXBfdCAgICAgKmt0c3ApCit7CisJa3RyYWNlX2VudHJ5X3QgICprdGVwOworCWludCAgICAgICAgICAgICBpbmRleDsKKwlpbnQgICAgICAgICAgICAgbmVudHJpZXM7CisKKwlpZiAoa3RwLT5rdF9yb2xsb3ZlcikKKwkJaW5kZXggPSBrdHAtPmt0X2luZGV4OworCWVsc2UKKwkJaW5kZXggPSAwOworCisJa3RzcC0+a3Nfc3RhcnQgPSBpbmRleDsKKwlrdGVwID0gJihrdHAtPmt0X2VudHJpZXNbaW5kZXhdKTsKKworCW5lbnRyaWVzID0ga3RyYWNlX25lbnRyaWVzKGt0cCk7CisJaW5kZXgrKzsKKwlpZiAoaW5kZXggPCBuZW50cmllcykgeworCQlrdHNwLT5rc19pbmRleCA9IGluZGV4OworCX0gZWxzZSB7CisJCWt0c3AtPmtzX2luZGV4ID0gMDsKKwkJaWYgKGluZGV4ID4gbmVudHJpZXMpCisJCQlrdGVwID0gTlVMTDsKKwl9CisJcmV0dXJuIGt0ZXA7Cit9CisKKy8qCisgKiBrdHJhY2VfbmV4dCgpCisgKgorICogVGhpcyBpcyB1c2VkIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgZW50cmllcyBvZiB0aGUgZ2l2ZW4KKyAqIHRyYWNlIGJ1ZmZlci4gIFRoZSBjYWxsZXIgbXVzdCBwYXNzIGluIHRoZSBrdHJhY2Vfc25hcF90CisgKiBzdHJ1Y3R1cmUgaW5pdGlhbGl6ZWQgYnkga3RyYWNlX2ZpcnN0KCkuICBUaGUgcmV0dXJuIHZhbHVlCisgKiB3aWxsIGJlIGVpdGhlciBhIHBvaW50ZXIgdG8gdGhlIG5leHQga3RyYWNlX2VudHJ5IG9yIE5VTEwKKyAqIGlmIGFsbCBvZiB0aGUgZW50cmllcyBoYXZlIGJlZW4gdHJhdmVyc2VkLgorICovCitrdHJhY2VfZW50cnlfdCAqCitrdHJhY2VfbmV4dCgKKwlrdHJhY2VfdCAgICAgICAgKmt0cCwKKwlrdHJhY2Vfc25hcF90ICAgKmt0c3ApCit7CisJaW50ICAgICAgICAgICAgIGluZGV4OworCWt0cmFjZV9lbnRyeV90ICAqa3RlcDsKKworCWluZGV4ID0ga3RzcC0+a3NfaW5kZXg7CisJaWYgKGluZGV4ID09IGt0c3AtPmtzX3N0YXJ0KSB7CisJCWt0ZXAgPSBOVUxMOworCX0gZWxzZSB7CisJCWt0ZXAgPSAma3RwLT5rdF9lbnRyaWVzW2luZGV4XTsKKwl9CisKKwlpbmRleCsrOworCWlmIChpbmRleCA9PSBrdHJhY2VfbmVudHJpZXMoa3RwKSkgeworCQlrdHNwLT5rc19pbmRleCA9IDA7CisJfSBlbHNlIHsKKwkJa3RzcC0+a3NfaW5kZXggPSBpbmRleDsKKwl9CisKKwlyZXR1cm4ga3RlcDsKK30KKworLyoKKyAqIGt0cmFjZV9za2lwKCkKKyAqCisgKiBTa2lwIHRoZSBuZXh0ICJjb3VudCIgZW50cmllcyBhbmQgcmV0dXJuIHRoZSBlbnRyeSBhZnRlciB0aGF0LgorICogUmV0dXJuIE5VTEwgaWYgdGhpcyBjYXVzZXMgdXMgdG8gaXRlcmF0ZSBwYXN0IHRoZSBiZWdpbm5pbmcgYWdhaW4uCisgKi8KK2t0cmFjZV9lbnRyeV90ICoKK2t0cmFjZV9za2lwKAorCWt0cmFjZV90ICAgICAgICAqa3RwLAorCWludCAgICAgICAgICAgICBjb3VudCwKKwlrdHJhY2Vfc25hcF90ICAgKmt0c3ApCit7CisJaW50ICAgICAgICAgICAgIGluZGV4OworCWludCAgICAgICAgICAgICBuZXdfaW5kZXg7CisJa3RyYWNlX2VudHJ5X3QgICprdGVwOworCWludCAgICAgICAgICAgICBuZW50cmllcyA9IGt0cmFjZV9uZW50cmllcyhrdHApOworCisJaW5kZXggPSBrdHNwLT5rc19pbmRleDsKKwluZXdfaW5kZXggPSBpbmRleCArIGNvdW50OworCXdoaWxlIChuZXdfaW5kZXggPj0gbmVudHJpZXMpIHsKKwkJbmV3X2luZGV4IC09IG5lbnRyaWVzOworCX0KKwlpZiAoaW5kZXggPT0ga3RzcC0+a3Nfc3RhcnQpIHsKKwkJLyoKKwkJICogV2UndmUgaXRlcmF0ZWQgYXJvdW5kIHRvIHRoZSBzdGFydCwgc28gd2UncmUgZG9uZS4KKwkJICovCisJCWt0ZXAgPSBOVUxMOworCX0gZWxzZSBpZiAoKG5ld19pbmRleCA8IGluZGV4KSAmJiAoaW5kZXggPCBrdHNwLT5rc19pbmRleCkpIHsKKwkJLyoKKwkJICogV2UndmUgc2tpcHBlZCBwYXN0IHRoZSBzdGFydCBhZ2Fpbiwgc28gd2UncmUgZG9uZS4KKwkJICovCisJCWt0ZXAgPSBOVUxMOworCQlrdHNwLT5rc19pbmRleCA9IGt0c3AtPmtzX3N0YXJ0OworCX0gZWxzZSB7CisJCWt0ZXAgPSAmKGt0cC0+a3RfZW50cmllc1tuZXdfaW5kZXhdKTsKKwkJbmV3X2luZGV4Kys7CisJCWlmIChuZXdfaW5kZXggPT0gbmVudHJpZXMpIHsKKwkJCWt0c3AtPmtzX2luZGV4ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWt0c3AtPmtzX2luZGV4ID0gbmV3X2luZGV4OworCQl9CisJfQorCXJldHVybiBrdGVwOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3N1cHBvcnQva3RyYWNlLmggYi9mcy94ZnMvc3VwcG9ydC9rdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmQxYTFhCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3N1cHBvcnQva3RyYWNlLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX1NVUFBPUlRfS1RSQUNFX0hfXworI2RlZmluZSBfX1hGU19TVVBQT1JUX0tUUkFDRV9IX18KKworI2luY2x1ZGUgPHNwaW4uaD4KKworLyoKKyAqIFRyYWNlIGJ1ZmZlciBlbnRyeSBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGt0cmFjZV9lbnRyeSB7CisJdm9pZAkqdmFsWzE2XTsKK30ga3RyYWNlX2VudHJ5X3Q7CisKKy8qCisgKiBUcmFjZSBidWZmZXIgaGVhZGVyIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qga3RyYWNlIHsKKwlsb2NrX3QJCWt0X2xvY2s7CS8qIG11dGV4IHRvIGd1YXJkIGNvdW50ZXJzICovCisJaW50CQlrdF9uZW50cmllczsJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdHJhY2UgYnVmICovCisJaW50CQlrdF9pbmRleDsJLyogY3VycmVudCBpbmRleCBpbiBlbnRyaWVzICovCisJaW50CQlrdF9yb2xsb3ZlcjsKKwlrdHJhY2VfZW50cnlfdAkqa3RfZW50cmllczsJLyogYnVmZmVyIG9mIGVudHJpZXMgKi8KK30ga3RyYWNlX3Q7CisKKy8qCisgKiBUcmFjZSBidWZmZXIgc25hcHNob3Qgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBrdHJhY2Vfc25hcCB7CisJaW50CQlrc19zdGFydDsJLyoga3RfaW5kZXggYXQgdGltZSBvZiBzbmFwICovCisJaW50CQlrc19pbmRleDsJLyogY3VycmVudCBpbmRleCAqLworfSBrdHJhY2Vfc25hcF90OworCisKKyNpZmRlZiBDT05GSUdfWEZTX1RSQUNFCisKK2V4dGVybiB2b2lkIGt0cmFjZV9pbml0KGludCB6ZW50cmllcyk7CitleHRlcm4gdm9pZCBrdHJhY2VfdW5pbml0KHZvaWQpOworCitleHRlcm4ga3RyYWNlX3QgKmt0cmFjZV9hbGxvYyhpbnQsIGludCk7CitleHRlcm4gdm9pZCBrdHJhY2VfZnJlZShrdHJhY2VfdCAqKTsKKworZXh0ZXJuIHZvaWQga3RyYWNlX2VudGVyKAorCWt0cmFjZV90CSosCisJdm9pZAkJKiwKKwl2b2lkCQkqLAorCXZvaWQJCSosCisJdm9pZAkJKiwKKwl2b2lkCQkqLAorCXZvaWQJCSosCisJdm9pZAkJKiwKKwl2b2lkCQkqLAorCXZvaWQJCSosCisJdm9pZAkJKiwKKwl2b2lkCQkqLAorCXZvaWQJCSosCisJdm9pZAkJKiwKKwl2b2lkCQkqLAorCXZvaWQJCSosCisJdm9pZAkJKik7CisKK2V4dGVybiBrdHJhY2VfZW50cnlfdCAgICprdHJhY2VfZmlyc3Qoa3RyYWNlX3QgKiwga3RyYWNlX3NuYXBfdCAqKTsKK2V4dGVybiBpbnQgICAgICAgICAgICAgIGt0cmFjZV9uZW50cmllcyhrdHJhY2VfdCAqKTsKK2V4dGVybiBrdHJhY2VfZW50cnlfdCAgICprdHJhY2VfbmV4dChrdHJhY2VfdCAqLCBrdHJhY2Vfc25hcF90ICopOworZXh0ZXJuIGt0cmFjZV9lbnRyeV90ICAgKmt0cmFjZV9za2lwKGt0cmFjZV90ICosIGludCwga3RyYWNlX3NuYXBfdCAqKTsKKworI2Vsc2UKKyNkZWZpbmUga3RyYWNlX2luaXQoeCkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBrdHJhY2VfdW5pbml0KCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCS8qIENPTkZJR19YRlNfVFJBQ0UgKi8KKworI2VuZGlmCS8qIF9fWEZTX1NVUFBPUlRfS1RSQUNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3N1cHBvcnQvbW92ZS5jIGIvZnMveGZzL3N1cHBvcnQvbW92ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YjUxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvc3VwcG9ydC9tb3ZlLmMKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgPHhmcy5oPgorCisvKiBSZWFkIGZyb20ga2VybmVsIGJ1ZmZlciBhdCBzcmMgdG8gdXNlci9rZXJuZWwgYnVmZmVyIGRlZmluZWQKKyAqIGJ5IHRoZSB1aW8gc3RydWN0dXJlLiBBZHZhbmNlIHRoZSBwb2ludGVyIGluIHRoZSB1aW8gc3RydWN0CisgKiBhcyB3ZSBnby4KKyAqLworaW50Cit1aW9fcmVhZChjYWRkcl90IHNyYywgc2l6ZV90IGxlbiwgc3RydWN0IHVpbyAqdWlvKQoreworCXNpemVfdAljb3VudDsKKworCWlmICghbGVuIHx8ICF1aW8tPnVpb19yZXNpZCkKKwkJcmV0dXJuIDA7CisKKwljb3VudCA9IHVpby0+dWlvX2lvdi0+aW92X2xlbjsKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gMDsKKwlpZiAoY291bnQgPiBsZW4pCisJCWNvdW50ID0gbGVuOworCisJaWYgKHVpby0+dWlvX3NlZ2ZsZyA9PSBVSU9fVVNFUlNQQUNFKSB7CisJCWlmIChjb3B5X3RvX3VzZXIodWlvLT51aW9faW92LT5pb3ZfYmFzZSwgc3JjLCBjb3VudCkpCisJCQlyZXR1cm4gRUZBVUxUOworCX0gZWxzZSB7CisJCUFTU0VSVCh1aW8tPnVpb19zZWdmbGcgPT0gVUlPX1NZU1NQQUNFKTsKKwkJbWVtY3B5KHVpby0+dWlvX2lvdi0+aW92X2Jhc2UsIHNyYywgY291bnQpOworCX0KKworCXVpby0+dWlvX2lvdi0+aW92X2Jhc2UgPSAodm9pZCopKChjaGFyKil1aW8tPnVpb19pb3YtPmlvdl9iYXNlICsgY291bnQpOworCXVpby0+dWlvX2lvdi0+aW92X2xlbiAtPSBjb3VudDsKKwl1aW8tPnVpb19vZmZzZXQgKz0gY291bnQ7CisJdWlvLT51aW9fcmVzaWQgLT0gY291bnQ7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9tb3ZlLmggYi9mcy94ZnMvc3VwcG9ydC9tb3ZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0MDZkYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9zdXBwb3J0L21vdmUuaApAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqIAorICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzLCAxOTk0CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgX19YRlNfU1VQUE9SVF9NT1ZFX0hfXworI2RlZmluZSBfX1hGU19TVVBQT1JUX01PVkVfSF9fCisKKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKiBTZWdtZW50IGZsYWcgdmFsdWVzLiAqLworZW51bSB1aW9fc2VnIHsKKwlVSU9fVVNFUlNQQUNFLCAgICAgICAgICAvKiBmcm9tIHVzZXIgZGF0YSBzcGFjZSAqLworCVVJT19TWVNTUEFDRSwgICAgICAgICAgIC8qIGZyb20gc3lzdGVtIHNwYWNlICovCit9OworCitzdHJ1Y3QgdWlvIHsKKwlzdHJ1Y3QgaW92ZWMJKnVpb19pb3Y7ICAgLyogcG9pbnRlciB0byBhcnJheSBvZiBpb3ZlY3MgKi8KKwlpbnQJCXVpb19pb3ZjbnQ7IC8qIG51bWJlciBvZiBpb3ZlY3MgaW4gYXJyYXkgKi8KKwl4ZnNfb2ZmX3QJdWlvX29mZnNldDsgLyogb2Zmc2V0IGluIGZpbGUgdGhpcyB1aW8gY29ycmVzcG9uZHMgdG8gKi8KKwlpbnQJCXVpb19yZXNpZDsgIC8qIHJlc2lkdWFsIGkvbyBjb3VudCAqLworCWVudW0gdWlvX3NlZwl1aW9fc2VnZmxnOyAvKiBzZWUgYWJvdmUgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IHVpbyB1aW9fdDsKK3R5cGVkZWYgc3RydWN0IGlvdmVjIGlvdmVjX3Q7CisKK2V4dGVybiBpbnQJdWlvX3JlYWQgKGNhZGRyX3QsIHNpemVfdCwgdWlvX3QgKik7CisKKyNlbmRpZiAgLyogX19YRlNfU1VQUE9SVF9NT1ZFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3N1cHBvcnQvcXNvcnQuYyBiL2ZzL3hmcy9zdXBwb3J0L3Fzb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjODI0MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9zdXBwb3J0L3Fzb3J0LmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKy8qCisgKiBRc29ydCByb3V0aW5lIGZyb20gQmVudGxleSAmIE1jSWxyb3kncyAiRW5naW5lZXJpbmcgYSBTb3J0IEZ1bmN0aW9uIi4KKyAqLworI2RlZmluZSBzd2FwY29kZShUWVBFLCBwYXJtaSwgcGFybWosIG4pIHsgCQlcCisJbG9uZyBpID0gKG4pIC8gc2l6ZW9mIChUWVBFKTsgCQkJXAorCXJlZ2lzdGVyIFRZUEUgKnBpID0gKFRZUEUgKikgKHBhcm1pKTsgCQlcCisJcmVnaXN0ZXIgVFlQRSAqcGogPSAoVFlQRSAqKSAocGFybWopOyAJCVwKKwlkbyB7IAkJCQkJCVwKKwkJcmVnaXN0ZXIgVFlQRQl0ID0gKnBpOwkJXAorCQkqcGkrKyA9ICpwajsJCQkJXAorCQkqcGorKyA9IHQ7CQkJCVwKKyAgICAgICAgfSB3aGlsZSAoLS1pID4gMCk7CQkJCVwKK30KKworI2RlZmluZSBTV0FQSU5JVChhLCBlcykgc3dhcHR5cGUgPSAoKGNoYXIgKilhIC0gKGNoYXIgKikwKSAlIHNpemVvZihsb25nKSB8fCBcCisJZXMgJSBzaXplb2YobG9uZykgPyAyIDogZXMgPT0gc2l6ZW9mKGxvbmcpPyAwIDogMTsKKworc3RhdGljIF9faW5saW5lIHZvaWQKK3N3YXBmdW5jKGNoYXIgKmEsIGNoYXIgKmIsIGludCBuLCBpbnQgc3dhcHR5cGUpCit7CisJaWYgKHN3YXB0eXBlIDw9IDEpIAorCQlzd2FwY29kZShsb25nLCBhLCBiLCBuKQorCWVsc2UKKwkJc3dhcGNvZGUoY2hhciwgYSwgYiwgbikKK30KKworI2RlZmluZSBzd2FwKGEsIGIpCQkJCQlcCisJaWYgKHN3YXB0eXBlID09IDApIHsJCQkJXAorCQlsb25nIHQgPSAqKGxvbmcgKikoYSk7CQkJXAorCQkqKGxvbmcgKikoYSkgPSAqKGxvbmcgKikoYik7CQlcCisJCSoobG9uZyAqKShiKSA9IHQ7CQkJXAorCX0gZWxzZQkJCQkJCVwKKwkJc3dhcGZ1bmMoYSwgYiwgZXMsIHN3YXB0eXBlKQorCisjZGVmaW5lIHZlY3N3YXAoYSwgYiwgbikgCWlmICgobikgPiAwKSBzd2FwZnVuYyhhLCBiLCBuLCBzd2FwdHlwZSkKKworc3RhdGljIF9faW5saW5lIGNoYXIgKgorbWVkMyhjaGFyICphLCBjaGFyICpiLCBjaGFyICpjLCBpbnQgKCpjbXApKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkKK3sKKwlyZXR1cm4gY21wKGEsIGIpIDwgMCA/CisJICAgICAgIChjbXAoYiwgYykgPCAwID8gYiA6IChjbXAoYSwgYykgPCAwID8gYyA6IGEgKSkKKyAgICAgICAgICAgICAgOihjbXAoYiwgYykgPiAwID8gYiA6IChjbXAoYSwgYykgPCAwID8gYSA6IGMgKSk7Cit9CisKK3ZvaWQKK3Fzb3J0KHZvaWQgKmFhLCBzaXplX3Qgbiwgc2l6ZV90IGVzLCBpbnQgKCpjbXApKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkKK3sKKwljaGFyICpwYSwgKnBiLCAqcGMsICpwZCwgKnBsLCAqcG0sICpwbjsKKwlpbnQgZCwgciwgc3dhcHR5cGUsIHN3YXBfY250OworCXJlZ2lzdGVyIGNoYXIgKmEgPSBhYTsKKworbG9vcDoJU1dBUElOSVQoYSwgZXMpOworCXN3YXBfY250ID0gMDsKKwlpZiAobiA8IDcpIHsKKwkJZm9yIChwbSA9IChjaGFyICopYSArIGVzOyBwbSA8IChjaGFyICopIGEgKyBuICogZXM7IHBtICs9IGVzKQorCQkJZm9yIChwbCA9IHBtOyBwbCA+IChjaGFyICopIGEgJiYgY21wKHBsIC0gZXMsIHBsKSA+IDA7CisJCQkgICAgIHBsIC09IGVzKQorCQkJCXN3YXAocGwsIHBsIC0gZXMpOworCQlyZXR1cm47CisJfQorCXBtID0gKGNoYXIgKilhICsgKG4gLyAyKSAqIGVzOworCWlmIChuID4gNykgeworCQlwbCA9IChjaGFyICopYTsKKwkJcG4gPSAoY2hhciAqKWEgKyAobiAtIDEpICogZXM7CisJCWlmIChuID4gNDApIHsKKwkJCWQgPSAobiAvIDgpICogZXM7CisJCQlwbCA9IG1lZDMocGwsIHBsICsgZCwgcGwgKyAyICogZCwgY21wKTsKKwkJCXBtID0gbWVkMyhwbSAtIGQsIHBtLCBwbSArIGQsIGNtcCk7CisJCQlwbiA9IG1lZDMocG4gLSAyICogZCwgcG4gLSBkLCBwbiwgY21wKTsKKwkJfQorCQlwbSA9IG1lZDMocGwsIHBtLCBwbiwgY21wKTsKKwl9CisJc3dhcChhLCBwbSk7CisJcGEgPSBwYiA9IChjaGFyICopYSArIGVzOworCisJcGMgPSBwZCA9IChjaGFyICopYSArIChuIC0gMSkgKiBlczsKKwlmb3IgKDs7KSB7CisJCXdoaWxlIChwYiA8PSBwYyAmJiAociA9IGNtcChwYiwgYSkpIDw9IDApIHsKKwkJCWlmIChyID09IDApIHsKKwkJCQlzd2FwX2NudCA9IDE7CisJCQkJc3dhcChwYSwgcGIpOworCQkJCXBhICs9IGVzOworCQkJfQorCQkJcGIgKz0gZXM7CisJCX0KKwkJd2hpbGUgKHBiIDw9IHBjICYmIChyID0gY21wKHBjLCBhKSkgPj0gMCkgeworCQkJaWYgKHIgPT0gMCkgeworCQkJCXN3YXBfY250ID0gMTsKKwkJCQlzd2FwKHBjLCBwZCk7CisJCQkJcGQgLT0gZXM7CisJCQl9CisJCQlwYyAtPSBlczsKKwkJfQorCQlpZiAocGIgPiBwYykKKwkJCWJyZWFrOworCQlzd2FwKHBiLCBwYyk7CisJCXN3YXBfY250ID0gMTsKKwkJcGIgKz0gZXM7CisJCXBjIC09IGVzOworCX0KKwlpZiAoc3dhcF9jbnQgPT0gMCkgeyAgLyogU3dpdGNoIHRvIGluc2VydGlvbiBzb3J0ICovCisJCWZvciAocG0gPSAoY2hhciAqKSBhICsgZXM7IHBtIDwgKGNoYXIgKikgYSArIG4gKiBlczsgcG0gKz0gZXMpCisJCQlmb3IgKHBsID0gcG07IHBsID4gKGNoYXIgKikgYSAmJiBjbXAocGwgLSBlcywgcGwpID4gMDsgCisJCQkgICAgIHBsIC09IGVzKQorCQkJCXN3YXAocGwsIHBsIC0gZXMpOworCQlyZXR1cm47CisJfQorCisJcG4gPSAoY2hhciAqKWEgKyBuICogZXM7CisJciA9IG1pbihwYSAtIChjaGFyICopYSwgcGIgLSBwYSk7CisJdmVjc3dhcChhLCBwYiAtIHIsIHIpOworCXIgPSBtaW4oKGxvbmcpKHBkIC0gcGMpLCAobG9uZykocG4gLSBwZCAtIGVzKSk7CisJdmVjc3dhcChwYiwgcG4gLSByLCByKTsKKwlpZiAoKHIgPSBwYiAtIHBhKSA+IGVzKQorCQlxc29ydChhLCByIC8gZXMsIGVzLCBjbXApOworCWlmICgociA9IHBkIC0gcGMpID4gZXMpIHsgCisJCS8qIEl0ZXJhdGUgcmF0aGVyIHRoYW4gcmVjdXJzZSB0byBzYXZlIHN0YWNrIHNwYWNlICovCisJCWEgPSBwbiAtIHI7CisJCW4gPSByIC8gZXM7CisJCWdvdG8gbG9vcDsKKwl9CisvKgkJcXNvcnQocG4gLSByLCByIC8gZXMsIGVzLCBjbXApOyovCit9CmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9xc29ydC5oIGIvZnMveGZzL3N1cHBvcnQvcXNvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDI2MzEwCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3N1cHBvcnQvcXNvcnQuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaWZuZGVmIFFTT1JUX0gKKyNkZWZpbmUgUVNPUlRfSAorCitleHRlcm4gdm9pZCBxc29ydCAodm9pZCAqY29uc3QgcGJhc2UsCisJCSAgICBzaXplX3QgdG90YWxfZWxlbXMsCisJCSAgICBzaXplX3Qgc2l6ZSwKKwkJICAgIGludCAoKmNtcCkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC91dWlkLmMgYi9mcy94ZnMvc3VwcG9ydC91dWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmNDBjZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9zdXBwb3J0L3V1aWQuYwpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgPHhmcy5oPgorCitzdGF0aWMgbXV0ZXhfdAl1dWlkX21vbml0b3I7CitzdGF0aWMgaW50CXV1aWRfdGFibGVfc2l6ZTsKK3N0YXRpYyB1dWlkX3QJKnV1aWRfdGFibGU7CisKK3ZvaWQKK3V1aWRfaW5pdCh2b2lkKQoreworCW11dGV4X2luaXQoJnV1aWRfbW9uaXRvciwgTVVURVhfREVGQVVMVCwgInV1aWRfbW9uaXRvciIpOworfQorCisvKgorICogdXVpZF9nZXRub2RldW5pcSAtIG9idGFpbiB0aGUgbm9kZSB1bmlxdWUgZmllbGRzIG9mIGEgVVVJRC4KKyAqCisgKiBUaGlzIGlzIG5vdCBpbiBhbnkgd2F5IGEgc3RhbmRhcmQgb3IgY29uZG9uZWQgVVVJRCBmdW5jdGlvbjsKKyAqIGl0IGp1c3Qgc29tZXRoaW5nIHRoYXQncyBuZWVkZWQgZm9yIHVzZXItbGV2ZWwgZmlsZSBoYW5kbGVzLgorICovCit2b2lkCit1dWlkX2dldG5vZGV1bmlxKHV1aWRfdCAqdXVpZCwgaW50IGZzaWQgWzJdKQoreworCWNoYXIJKnV1ID0gKGNoYXIgKil1dWlkOworCisJLyogb24gSVJJWCwgdGhpcyBmdW5jdGlvbiBhc3N1bWVzIGJpZy1lbmRpYW4gZmllbGRzIHdpdGhpbgorCSAqIHRoZSB1dWlkLCBzbyB3ZSB1c2UgSU5UX0dFVCB0byBnZXQgdGhlIHNhbWUgcmVzdWx0IG9uCisJICogbGl0dGxlLWVuZGlhbiBzeXN0ZW1zCisJICovCisKKwlmc2lkWzBdID0gKElOVF9HRVQoKih1X2ludDE2X3QqKSh1dSs4KSwgQVJDSF9DT05WRVJUKSA8PCAxNikgKworCQkgICBJTlRfR0VUKCoodV9pbnQxNl90KikodXUrNCksIEFSQ0hfQ09OVkVSVCk7CisJZnNpZFsxXSA9ICBJTlRfR0VUKCoodV9pbnQzMl90KikodXUgICksIEFSQ0hfQ09OVkVSVCk7Cit9CisKK3ZvaWQKK3V1aWRfY3JlYXRlX25pbCh1dWlkX3QgKnV1aWQpCit7CisJbWVtc2V0KHV1aWQsIDAsIHNpemVvZigqdXVpZCkpOworfQorCitpbnQKK3V1aWRfaXNfbmlsKHV1aWRfdCAqdXVpZCkKK3sKKwlpbnQJaTsKKwljaGFyCSpjcCA9IChjaGFyICopdXVpZDsKKworCWlmICh1dWlkID09IE5VTEwpCisJCXJldHVybiAwOworCS8qIGltcGxpZWQgY2hlY2sgb2YgdmVyc2lvbiBudW1iZXIgaGVyZS4uLiAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKnV1aWQ7IGkrKykKKwkJaWYgKCpjcCsrKSByZXR1cm4gMDsJLyogbm90IG5pbCAqLworCXJldHVybiAxOwkvKiBpcyBuaWwgKi8KK30KKworaW50Cit1dWlkX2VxdWFsKHV1aWRfdCAqdXVpZDEsIHV1aWRfdCAqdXVpZDIpCit7CisJcmV0dXJuIG1lbWNtcCh1dWlkMSwgdXVpZDIsIHNpemVvZih1dWlkX3QpKSA/IDAgOiAxOworfQorCisvKgorICogR2l2ZW4gYSAxMjgtYml0IHV1aWQsIHJldHVybiBhIDY0LWJpdCB2YWx1ZSBieSBhZGRpbmcgdGhlIHRvcCBhbmQgYm90dG9tCisgKiA2NC1iaXQgd29yZHMuICBOT1RFOiBUaGlzIGZ1bmN0aW9uIGNhbiBub3QgYmUgY2hhbmdlZCBFVkVSLiAgQWx0aG91Z2gKKyAqIGJyYWluLWRlYWQsIHNvbWUgYXBwbGljYXRpb25zIGRlcGVuZCBvbiB0aGlzIDY0LWJpdCB2YWx1ZSByZW1haW5pbmcKKyAqIHBlcnNpc3RlbnQuICBTcGVjaWZpY2FsbHksIERNSSB2ZW5kb3JzIHN0b3JlIHRoZSB2YWx1ZSBhcyBhIHBlcnNpc3RlbnQKKyAqIGZpbGVoYW5kbGUuCisgKi8KK19fdWludDY0X3QKK3V1aWRfaGFzaDY0KHV1aWRfdCAqdXVpZCkKK3sKKwlfX3VpbnQ2NF90CSpzcCA9IChfX3VpbnQ2NF90ICopdXVpZDsKKworCXJldHVybiBzcFswXSArIHNwWzFdOworfQorCitpbnQKK3V1aWRfdGFibGVfaW5zZXJ0KHV1aWRfdCAqdXVpZCkKK3sKKwlpbnQJaSwgaG9sZTsKKworCW11dGV4X2xvY2soJnV1aWRfbW9uaXRvciwgUFZGUyk7CisJZm9yIChpID0gMCwgaG9sZSA9IC0xOyBpIDwgdXVpZF90YWJsZV9zaXplOyBpKyspIHsKKwkJaWYgKHV1aWRfaXNfbmlsKCZ1dWlkX3RhYmxlW2ldKSkgeworCQkJaG9sZSA9IGk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAodXVpZF9lcXVhbCh1dWlkLCAmdXVpZF90YWJsZVtpXSkpIHsKKwkJCW11dGV4X3VubG9jaygmdXVpZF9tb25pdG9yKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWlmIChob2xlIDwgMCkgeworCQl1dWlkX3RhYmxlID0ga21lbV9yZWFsbG9jKHV1aWRfdGFibGUsCisJCQkodXVpZF90YWJsZV9zaXplICsgMSkgKiBzaXplb2YoKnV1aWRfdGFibGUpLAorCQkJdXVpZF90YWJsZV9zaXplICAqIHNpemVvZigqdXVpZF90YWJsZSksCisJCQlLTV9TTEVFUCk7CisJCWhvbGUgPSB1dWlkX3RhYmxlX3NpemUrKzsKKwl9CisJdXVpZF90YWJsZVtob2xlXSA9ICp1dWlkOworCW11dGV4X3VubG9jaygmdXVpZF9tb25pdG9yKTsKKwlyZXR1cm4gMTsKK30KKwordm9pZAordXVpZF90YWJsZV9yZW1vdmUodXVpZF90ICp1dWlkKQoreworCWludAlpOworCisJbXV0ZXhfbG9jaygmdXVpZF9tb25pdG9yLCBQVkZTKTsKKwlmb3IgKGkgPSAwOyBpIDwgdXVpZF90YWJsZV9zaXplOyBpKyspIHsKKwkJaWYgKHV1aWRfaXNfbmlsKCZ1dWlkX3RhYmxlW2ldKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXV1aWRfZXF1YWwodXVpZCwgJnV1aWRfdGFibGVbaV0pKQorCQkJY29udGludWU7CisJCXV1aWRfY3JlYXRlX25pbCgmdXVpZF90YWJsZVtpXSk7CisJCWJyZWFrOworCX0KKwlBU1NFUlQoaSA8IHV1aWRfdGFibGVfc2l6ZSk7CisJbXV0ZXhfdW5sb2NrKCZ1dWlkX21vbml0b3IpOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3N1cHBvcnQvdXVpZC5oIGIvZnMveGZzL3N1cHBvcnQvdXVpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMjBlYTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvc3VwcG9ydC91dWlkLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfU1VQUE9SVF9VVUlEX0hfXworI2RlZmluZSBfX1hGU19TVVBQT1JUX1VVSURfSF9fCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyCV9fdV9iaXRzWzE2XTsKK30gdXVpZF90OworCit2b2lkIHV1aWRfaW5pdCh2b2lkKTsKK3ZvaWQgdXVpZF9jcmVhdGVfbmlsKHV1aWRfdCAqdXVpZCk7CitpbnQgdXVpZF9pc19uaWwodXVpZF90ICp1dWlkKTsKK2ludCB1dWlkX2VxdWFsKHV1aWRfdCAqdXVpZDEsIHV1aWRfdCAqdXVpZDIpOwordm9pZCB1dWlkX2dldG5vZGV1bmlxKHV1aWRfdCAqdXVpZCwgaW50IGZzaWQgWzJdKTsKK19fdWludDY0X3QgdXVpZF9oYXNoNjQodXVpZF90ICp1dWlkKTsKK2ludCB1dWlkX3RhYmxlX2luc2VydCh1dWlkX3QgKnV1aWQpOwordm9pZCB1dWlkX3RhYmxlX3JlbW92ZSh1dWlkX3QgKnV1aWQpOworCisjZW5kaWYJLyogX19YRlNfU1VQUE9SVF9VVUlEX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmcy5oIGIvZnMveGZzL3hmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMjc2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfSF9fCisjZGVmaW5lIF9fWEZTX0hfXworCisjaW5jbHVkZSA8bGludXgtMi42L3hmc19saW51eC5oPgorCisjaW5jbHVkZSA8eGZzX2ZzLmg+IAorI2luY2x1ZGUgPHhmc19tYWNyb3MuaD4KKworI2VuZGlmCS8qIF9fWEZTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hY2wuYyBiL2ZzL3hmcy94ZnNfYWNsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwMWRjZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfYWNsLmMKQEAgLTAsMCArMSw5MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKworI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2FjbC5oIgorI2luY2x1ZGUgInhmc19tYWMuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0ci5oIgorCisjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsX3hhdHRyLmg+CisKK1NUQVRJQyBpbnQJeGZzX2FjbF9zZXRtb2RlKHZub2RlX3QgKiwgeGZzX2FjbF90ICosIGludCAqKTsKK1NUQVRJQyB2b2lkICAgICB4ZnNfYWNsX2ZpbHRlcl9tb2RlKG1vZGVfdCwgeGZzX2FjbF90ICopOworU1RBVElDIHZvaWQJeGZzX2FjbF9nZXRfZW5kaWFuKHhmc19hY2xfdCAqKTsKK1NUQVRJQyBpbnQJeGZzX2FjbF9hY2Nlc3ModWlkX3QsIGdpZF90LCB4ZnNfYWNsX3QgKiwgbW9kZV90LCBjcmVkX3QgKik7CitTVEFUSUMgaW50CXhmc19hY2xfaW52YWxpZCh4ZnNfYWNsX3QgKik7CitTVEFUSUMgdm9pZAl4ZnNfYWNsX3N5bmNfbW9kZShtb2RlX3QsIHhmc19hY2xfdCAqKTsKK1NUQVRJQyB2b2lkCXhmc19hY2xfZ2V0X2F0dHIodm5vZGVfdCAqLCB4ZnNfYWNsX3QgKiwgaW50LCBpbnQsIGludCAqKTsKK1NUQVRJQyB2b2lkCXhmc19hY2xfc2V0X2F0dHIodm5vZGVfdCAqLCB4ZnNfYWNsX3QgKiwgaW50LCBpbnQgKik7CitTVEFUSUMgaW50CXhmc19hY2xfYWxsb3dfc2V0KHZub2RlX3QgKiwgaW50KTsKKwora21lbV96b25lX3QgKnhmc19hY2xfem9uZTsKKworCisvKgorICogVGVzdCBmb3IgZXhpc3RlbmNlIG9mIGFjY2VzcyBBQ0wgYXR0cmlidXRlIGFzIGVmZmljaWVudGx5IGFzIHBvc3NpYmxlLgorICovCitpbnQKK3hmc19hY2xfdmhhc2FjbF9hY2Nlc3MoCisJdm5vZGVfdAkJKnZwKQoreworCWludAkJZXJyb3I7CisKKwl4ZnNfYWNsX2dldF9hdHRyKHZwLCBOVUxMLCBfQUNMX1RZUEVfQUNDRVNTLCBBVFRSX0tFUk5PVkFMLCAmZXJyb3IpOworCXJldHVybiAoZXJyb3IgPT0gMCk7Cit9CisKKy8qCisgKiBUZXN0IGZvciBleGlzdGVuY2Ugb2YgZGVmYXVsdCBBQ0wgYXR0cmlidXRlIGFzIGVmZmljaWVudGx5IGFzIHBvc3NpYmxlLgorICovCitpbnQKK3hmc19hY2xfdmhhc2FjbF9kZWZhdWx0KAorCXZub2RlX3QJCSp2cCkKK3sKKwlpbnQJCWVycm9yOworCisJaWYgKHZwLT52X3R5cGUgIT0gVkRJUikKKwkJcmV0dXJuIDA7CisJeGZzX2FjbF9nZXRfYXR0cih2cCwgTlVMTCwgX0FDTF9UWVBFX0RFRkFVTFQsIEFUVFJfS0VSTk9WQUwsICZlcnJvcik7CisJcmV0dXJuIChlcnJvciA9PSAwKTsKK30KKworLyoKKyAqIENvbnZlcnQgZnJvbSBleHRlbmRlZCBhdHRyaWJ1dGUgcmVwcmVzZW50YXRpb24gdG8gaW4tbWVtb3J5IGZvciBYRlMuCisgKi8KK1NUQVRJQyBpbnQKK3Bvc2l4X2FjbF94YXR0cl90b194ZnMoCisJcG9zaXhfYWNsX3hhdHRyX2hlYWRlcgkqc3JjLAorCXNpemVfdAkJCXNpemUsCisJeGZzX2FjbF90CQkqZGVzdCkKK3sKKwlwb3NpeF9hY2xfeGF0dHJfZW50cnkJKnNyY19lbnRyeTsKKwl4ZnNfYWNsX2VudHJ5X3QJCSpkZXN0X2VudHJ5OworCWludAkJCW47CisKKwlpZiAoIXNyYyB8fCAhZGVzdCkKKwkJcmV0dXJuIEVJTlZBTDsKKworCWlmIChzaXplIDwgc2l6ZW9mKHBvc2l4X2FjbF94YXR0cl9oZWFkZXIpKQorCQlyZXR1cm4gRUlOVkFMOworCisJaWYgKHNyYy0+YV92ZXJzaW9uICE9IGNwdV90b19sZTMyKFBPU0lYX0FDTF9YQVRUUl9WRVJTSU9OKSkKKwkJcmV0dXJuIEVPUE5PVFNVUFA7CisKKwltZW1zZXQoZGVzdCwgMCwgc2l6ZW9mKHhmc19hY2xfdCkpOworCWRlc3QtPmFjbF9jbnQgPSBwb3NpeF9hY2xfeGF0dHJfY291bnQoc2l6ZSk7CisJaWYgKGRlc3QtPmFjbF9jbnQgPCAwIHx8IGRlc3QtPmFjbF9jbnQgPiBYRlNfQUNMX01BWF9FTlRSSUVTKQorCQlyZXR1cm4gRUlOVkFMOworCisJLyoKKwkgKiBhY2xfc2V0X2ZpbGUoMykgbWF5IHJlcXVlc3QgdGhhdCB3ZSBzZXQgZGVmYXVsdCBBQ0xzIHdpdGgKKwkgKiB6ZXJvIGxlbmd0aCAtLSBkZWZlbmQgKGdyYWNlZnVsbHkpIGFnYWluc3QgdGhhdCBoZXJlLgorCSAqLworCWlmICghZGVzdC0+YWNsX2NudCkKKwkJcmV0dXJuIDA7CisKKwlzcmNfZW50cnkgPSAocG9zaXhfYWNsX3hhdHRyX2VudHJ5ICopKChjaGFyICopc3JjICsgc2l6ZW9mKCpzcmMpKTsKKwlkZXN0X2VudHJ5ID0gJmRlc3QtPmFjbF9lbnRyeVswXTsKKworCWZvciAobiA9IDA7IG4gPCBkZXN0LT5hY2xfY250OyBuKyssIHNyY19lbnRyeSsrLCBkZXN0X2VudHJ5KyspIHsKKwkJZGVzdF9lbnRyeS0+YWVfcGVybSA9IGxlMTZfdG9fY3B1KHNyY19lbnRyeS0+ZV9wZXJtKTsKKwkJaWYgKF9BQ0xfUEVSTV9JTlZBTElEKGRlc3RfZW50cnktPmFlX3Blcm0pKQorCQkJcmV0dXJuIEVJTlZBTDsKKwkJZGVzdF9lbnRyeS0+YWVfdGFnICA9IGxlMTZfdG9fY3B1KHNyY19lbnRyeS0+ZV90YWcpOworCQlzd2l0Y2goZGVzdF9lbnRyeS0+YWVfdGFnKSB7CisJCWNhc2UgQUNMX1VTRVI6CisJCWNhc2UgQUNMX0dST1VQOgorCQkJZGVzdF9lbnRyeS0+YWVfaWQgPSBsZTMyX3RvX2NwdShzcmNfZW50cnktPmVfaWQpOworCQkJYnJlYWs7CisJCWNhc2UgQUNMX1VTRVJfT0JKOgorCQljYXNlIEFDTF9HUk9VUF9PQko6CisJCWNhc2UgQUNMX01BU0s6CisJCWNhc2UgQUNMX09USEVSOgorCQkJZGVzdF9lbnRyeS0+YWVfaWQgPSBBQ0xfVU5ERUZJTkVEX0lEOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRUlOVkFMOworCQl9CisJfQorCWlmICh4ZnNfYWNsX2ludmFsaWQoZGVzdCkpCisJCXJldHVybiBFSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvbXBhcmlzb24gZnVuY3Rpb24gY2FsbGVkIGZyb20gcXNvcnQoKS4KKyAqIFByaW1hcnkga2V5IGlzIGFlX3RhZywgc2Vjb25kYXJ5IGtleSBpcyBhZV9pZC4KKyAqLworU1RBVElDIGludAoreGZzX2FjbF9lbnRyeV9jb21wYXJlKAorCWNvbnN0IHZvaWQJKnZhLAorCWNvbnN0IHZvaWQJKnZiKQoreworCXhmc19hY2xfZW50cnlfdAkqYSA9ICh4ZnNfYWNsX2VudHJ5X3QgKil2YSwKKwkJCSpiID0gKHhmc19hY2xfZW50cnlfdCAqKXZiOworCisJaWYgKGEtPmFlX3RhZyA9PSBiLT5hZV90YWcpCisJCXJldHVybiAoYS0+YWVfaWQgLSBiLT5hZV9pZCk7CisJcmV0dXJuIChhLT5hZV90YWcgLSBiLT5hZV90YWcpOworfQorCisvKgorICogQ29udmVydCBmcm9tIGluLW1lbW9yeSBYRlMgdG8gZXh0ZW5kZWQgYXR0cmlidXRlIHJlcHJlc2VudGF0aW9uLgorICovCitTVEFUSUMgaW50Citwb3NpeF9hY2xfeGZzX3RvX3hhdHRyKAorCXhmc19hY2xfdAkJKnNyYywKKwlwb3NpeF9hY2xfeGF0dHJfaGVhZGVyCSpkZXN0LAorCXNpemVfdAkJCXNpemUpCit7CisJaW50CQkJbjsKKwlzaXplX3QJCQluZXdfc2l6ZSA9IHBvc2l4X2FjbF94YXR0cl9zaXplKHNyYy0+YWNsX2NudCk7CisJcG9zaXhfYWNsX3hhdHRyX2VudHJ5CSpkZXN0X2VudHJ5OworCXhmc19hY2xfZW50cnlfdAkJKnNyY19lbnRyeTsKKworCWlmIChzaXplIDwgbmV3X3NpemUpCisJCXJldHVybiAtRVJBTkdFOworCisJLyogTmVlZCB0byBzb3J0IHNyYyBYRlMgQUNMIGJ5IDxhZV90YWcsYWVfaWQ+ICovCisJcXNvcnQoc3JjLT5hY2xfZW50cnksIHNyYy0+YWNsX2NudCwgc2l6ZW9mKHNyYy0+YWNsX2VudHJ5WzBdKSwKKwkJeGZzX2FjbF9lbnRyeV9jb21wYXJlKTsKKworCWRlc3QtPmFfdmVyc2lvbiA9IGNwdV90b19sZTMyKFBPU0lYX0FDTF9YQVRUUl9WRVJTSU9OKTsKKwlkZXN0X2VudHJ5ID0gJmRlc3QtPmFfZW50cmllc1swXTsKKwlzcmNfZW50cnkgPSAmc3JjLT5hY2xfZW50cnlbMF07CisJZm9yIChuID0gMDsgbiA8IHNyYy0+YWNsX2NudDsgbisrLCBkZXN0X2VudHJ5KyssIHNyY19lbnRyeSsrKSB7CisJCWRlc3RfZW50cnktPmVfcGVybSA9IGNwdV90b19sZTE2KHNyY19lbnRyeS0+YWVfcGVybSk7CisJCWlmIChfQUNMX1BFUk1fSU5WQUxJRChzcmNfZW50cnktPmFlX3Blcm0pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWRlc3RfZW50cnktPmVfdGFnICA9IGNwdV90b19sZTE2KHNyY19lbnRyeS0+YWVfdGFnKTsKKwkJc3dpdGNoIChzcmNfZW50cnktPmFlX3RhZykgeworCQljYXNlIEFDTF9VU0VSOgorCQljYXNlIEFDTF9HUk9VUDoKKwkJCWRlc3RfZW50cnktPmVfaWQgPSBjcHVfdG9fbGUzMihzcmNfZW50cnktPmFlX2lkKTsKKwkJCQlicmVhazsKKwkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCWNhc2UgQUNMX0dST1VQX09CSjoKKwkJY2FzZSBBQ0xfTUFTSzoKKwkJY2FzZSBBQ0xfT1RIRVI6CisJCQlkZXN0X2VudHJ5LT5lX2lkID0gY3B1X3RvX2xlMzIoQUNMX1VOREVGSU5FRF9JRCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXJldHVybiBuZXdfc2l6ZTsKK30KKworaW50Cit4ZnNfYWNsX3ZnZXQoCisJdm5vZGVfdAkJKnZwLAorCXZvaWQJCSphY2wsCisJc2l6ZV90CQlzaXplLAorCWludAkJa2luZCkKK3sKKwlpbnQJCQllcnJvcjsKKwl4ZnNfYWNsX3QJCSp4ZnNfYWNsID0gTlVMTDsKKwlwb3NpeF9hY2xfeGF0dHJfaGVhZGVyCSpleHRfYWNsID0gYWNsOworCWludAkJCWZsYWdzID0gMDsKKworCVZOX0hPTEQodnApOworCWlmKHNpemUpIHsKKwkJaWYgKCEoX0FDTF9BTExPQyh4ZnNfYWNsKSkpIHsKKwkJCWVycm9yID0gRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJbWVtc2V0KHhmc19hY2wsIDAsIHNpemVvZih4ZnNfYWNsX3QpKTsKKwl9IGVsc2UKKwkJZmxhZ3MgPSBBVFRSX0tFUk5PVkFMOworCisJeGZzX2FjbF9nZXRfYXR0cih2cCwgeGZzX2FjbCwga2luZCwgZmxhZ3MsICZlcnJvcik7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCWlmICghc2l6ZSkgeworCQllcnJvciA9IC1wb3NpeF9hY2xfeGF0dHJfc2l6ZShYRlNfQUNMX01BWF9FTlRSSUVTKTsKKwl9IGVsc2UgeworCQlpZiAoeGZzX2FjbF9pbnZhbGlkKHhmc19hY2wpKSB7CisJCQllcnJvciA9IEVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChraW5kID09IF9BQ0xfVFlQRV9BQ0NFU1MpIHsKKwkJCXZhdHRyX3QJdmE7CisKKwkJCXZhLnZhX21hc2sgPSBYRlNfQVRfTU9ERTsKKwkJCVZPUF9HRVRBVFRSKHZwLCAmdmEsIDAsIHN5c19jcmVkLCBlcnJvcik7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBvdXQ7CisJCQl4ZnNfYWNsX3N5bmNfbW9kZSh2YS52YV9tb2RlLCB4ZnNfYWNsKTsKKwkJfQorCQllcnJvciA9IC1wb3NpeF9hY2xfeGZzX3RvX3hhdHRyKHhmc19hY2wsIGV4dF9hY2wsIHNpemUpOworCX0KK291dDoKKwlWTl9SRUxFKHZwKTsKKwlpZih4ZnNfYWNsKQorCQlfQUNMX0ZSRUUoeGZzX2FjbCk7CisJcmV0dXJuIC1lcnJvcjsKK30KKworaW50Cit4ZnNfYWNsX3ZyZW1vdmUoCisJdm5vZGVfdAkJKnZwLAorCWludAkJa2luZCkKK3sKKwlpbnQJCWVycm9yOworCisJVk5fSE9MRCh2cCk7CisJZXJyb3IgPSB4ZnNfYWNsX2FsbG93X3NldCh2cCwga2luZCk7CisJaWYgKCFlcnJvcikgeworCQlWT1BfQVRUUl9SRU1PVkUodnAsIGtpbmQgPT0gX0FDTF9UWVBFX0RFRkFVTFQ/CisJCQkJU0dJX0FDTF9ERUZBVUxUOiBTR0lfQUNMX0ZJTEUsCisJCQkJQVRUUl9ST09ULCBzeXNfY3JlZCwgZXJyb3IpOworCQlpZiAoZXJyb3IgPT0gRU5PQVRUUikKKwkJCWVycm9yID0gMDsJLyogJ3Njb29sICovCisJfQorCVZOX1JFTEUodnApOworCXJldHVybiAtZXJyb3I7Cit9CisKK2ludAoreGZzX2FjbF92c2V0KAorCXZub2RlX3QJCQkqdnAsCisJdm9pZAkJCSphY2wsCisJc2l6ZV90CQkJc2l6ZSwKKwlpbnQJCQlraW5kKQoreworCXBvc2l4X2FjbF94YXR0cl9oZWFkZXIJKmV4dF9hY2wgPSBhY2w7CisJeGZzX2FjbF90CQkqeGZzX2FjbDsKKwlpbnQJCQllcnJvcjsKKwlpbnQJCQliYXNpY3Blcm1zID0gMDsgLyogbW9yZSB0aGFuIHN0ZCB1bml4IHBlcm1zPyAqLworCisJaWYgKCFhY2wpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEoX0FDTF9BTExPQyh4ZnNfYWNsKSkpCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyb3IgPSBwb3NpeF9hY2xfeGF0dHJfdG9feGZzKGV4dF9hY2wsIHNpemUsIHhmc19hY2wpOworCWlmIChlcnJvcikgeworCQlfQUNMX0ZSRUUoeGZzX2FjbCk7CisJCXJldHVybiAtZXJyb3I7CisJfQorCWlmICgheGZzX2FjbC0+YWNsX2NudCkgeworCQlfQUNMX0ZSRUUoeGZzX2FjbCk7CisJCXJldHVybiAwOworCX0KKworCVZOX0hPTEQodnApOworCWVycm9yID0geGZzX2FjbF9hbGxvd19zZXQodnAsIGtpbmQpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwkvKiBJbmNvbWluZyBBQ0wgZXhpc3RzLCBzZXQgZmlsZSBtb2RlIGJhc2VkIG9uIGl0cyB2YWx1ZSAqLworCWlmIChraW5kID09IF9BQ0xfVFlQRV9BQ0NFU1MpCisJCXhmc19hY2xfc2V0bW9kZSh2cCwgeGZzX2FjbCwgJmJhc2ljcGVybXMpOworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIG1vcmUgdGhhbiBzdGQgdW5peCBwZXJtaXNzaW9ucywgc2V0IHVwIHRoZSBhY3R1YWwgYXR0ci4KKwkgKiBPdGhlcndpc2UsIGRlbGV0ZSBhbnkgZXhpc3RpbmcgYXR0ci4gIFRoaXMgcHJldmVudHMgdXMgZnJvbQorCSAqIGhhdmluZyBhY3R1YWwgYXR0cnMgZm9yIHBlcm1pc3Npb25zIHRoYXQgY2FuIGJlIHN0b3JlZCBpbiB0aGUKKwkgKiBzdGFuZGFyZCBwZXJtaXNzaW9uIGJpdHMuCisJICovCisJaWYgKCFiYXNpY3Blcm1zKSB7CisJCXhmc19hY2xfc2V0X2F0dHIodnAsIHhmc19hY2wsIGtpbmQsICZlcnJvcik7CisJfSBlbHNlIHsKKwkJeGZzX2FjbF92cmVtb3ZlKHZwLCBfQUNMX1RZUEVfQUNDRVNTKTsKKwl9CisKK291dDoKKwlWTl9SRUxFKHZwKTsKKwlfQUNMX0ZSRUUoeGZzX2FjbCk7CisJcmV0dXJuIC1lcnJvcjsKK30KKworaW50Cit4ZnNfYWNsX2lhY2Nlc3MoCisJeGZzX2lub2RlX3QJKmlwLAorCW1vZGVfdAkJbW9kZSwKKwljcmVkX3QJCSpjcikKK3sKKwl4ZnNfYWNsX3QJKmFjbDsKKwlpbnQJCXJ2YWw7CisKKwlpZiAoIShfQUNMX0FMTE9DKGFjbCkpKQorCQlyZXR1cm4gLTE7CisKKwkvKiBJZiB0aGUgZmlsZSBoYXMgbm8gQUNMIHJldHVybiAtMS4gKi8KKwlydmFsID0gc2l6ZW9mKHhmc19hY2xfdCk7CisJaWYgKHhmc19hdHRyX2ZldGNoKGlwLCBTR0lfQUNMX0ZJTEUsIFNHSV9BQ0xfRklMRV9TSVpFLAorCQkJKGNoYXIgKilhY2wsICZydmFsLCBBVFRSX1JPT1QgfCBBVFRSX0tFUk5BQ0NFU1MsIGNyKSkgeworCQlfQUNMX0ZSRUUoYWNsKTsKKwkJcmV0dXJuIC0xOworCX0KKwl4ZnNfYWNsX2dldF9lbmRpYW4oYWNsKTsKKworCS8qIElmIHRoZSBmaWxlIGhhcyBhbiBlbXB0eSBBQ0wgcmV0dXJuIC0xLiAqLworCWlmIChhY2wtPmFjbF9jbnQgPT0gWEZTX0FDTF9OT1RfUFJFU0VOVCkgeworCQlfQUNMX0ZSRUUoYWNsKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFN5bmNocm9uaXplIEFDTCB3aXRoIG1vZGUgYml0cyAqLworCXhmc19hY2xfc3luY19tb2RlKGlwLT5pX2QuZGlfbW9kZSwgYWNsKTsKKworCXJ2YWwgPSB4ZnNfYWNsX2FjY2VzcyhpcC0+aV9kLmRpX3VpZCwgaXAtPmlfZC5kaV9naWQsIGFjbCwgbW9kZSwgY3IpOworCV9BQ0xfRlJFRShhY2wpOworCXJldHVybiBydmFsOworfQorCitTVEFUSUMgaW50Cit4ZnNfYWNsX2FsbG93X3NldCgKKwl2bm9kZV90CQkqdnAsCisJaW50CQlraW5kKQoreworCXZhdHRyX3QJCXZhOworCWludAkJZXJyb3I7CisKKwlpZiAodnAtPnZfaW5vZGUuaV9mbGFncyAmIChTX0lNTVVUQUJMRXxTX0FQUEVORCkpCisJCXJldHVybiBFUEVSTTsKKwlpZiAoa2luZCA9PSBfQUNMX1RZUEVfREVGQVVMVCAmJiB2cC0+dl90eXBlICE9IFZESVIpCisJCXJldHVybiBFTk9URElSOworCWlmICh2cC0+dl92ZnNwLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpCisJCXJldHVybiBFUk9GUzsKKwl2YS52YV9tYXNrID0gWEZTX0FUX1VJRDsKKwlWT1BfR0VUQVRUUih2cCwgJnZhLCAwLCBOVUxMLCBlcnJvcik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJaWYgKHZhLnZhX3VpZCAhPSBjdXJyZW50LT5mc3VpZCAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKKwkJcmV0dXJuIEVQRVJNOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFRoZSBhY2Nlc3MgY29udHJvbCBwcm9jZXNzIHRvIGRldGVybWluZSB0aGUgYWNjZXNzIHBlcm1pc3Npb246CisgKglpZiB1aWQgPT0gZmlsZSBvd25lciBpZCwgdXNlIHRoZSBmaWxlIG93bmVyIGJpdHMuCisgKglpZiBnaWQgPT0gZmlsZSBvd25lciBncm91cCBpZCwgdXNlIHRoZSBmaWxlIGdyb3VwIGJpdHMuCisgKglzY2FuIEFDTCBmb3IgYSBtYWNoaW5nIHVzZXIgb3IgZ3JvdXAsIGFuZCB1c2UgbWF0Y2hlZCBlbnRyeQorICoJcGVybWlzc2lvbi4gVXNlIHRvdGFsIHBlcm1pc3Npb25zIG9mIGFsbCBtYXRjaGluZyBncm91cCBlbnRyaWVzLAorICoJdW50aWwgYWxsIGFjbCBlbnRyaWVzIGFyZSBleGhhdXN0ZWQuIFRoZSBmaW5hbCBwZXJtaXNzaW9uIHByb2R1Y2VkCisgKglieSBtYXRjaGluZyBhY2wgZW50cnkgb3IgZW50cmllcyBuZWVkcyB0byBiZSAmIHdpdGggZ3JvdXAgcGVybWlzc2lvbi4KKyAqCWlmIG5vdCBvd25lciwgb3duaW5nIGdyb3VwLCBvciBtYXRjaGluZyBlbnRyeSBpbiBBQ0wsIHVzZSBmaWxlCisgKglvdGhlciBiaXRzLiAgCisgKi8KK1NUQVRJQyBpbnQKK3hmc19hY2xfY2FwYWJpbGl0eV9jaGVjaygKKwltb2RlX3QJCW1vZGUsCisJY3JlZF90CQkqY3IpCit7CisJaWYgKChtb2RlICYgQUNMX1JFQUQpICYmICFjYXBhYmxlX2NyZWQoY3IsIENBUF9EQUNfUkVBRF9TRUFSQ0gpKQorCQlyZXR1cm4gRUFDQ0VTOworCWlmICgobW9kZSAmIEFDTF9XUklURSkgJiYgIWNhcGFibGVfY3JlZChjciwgQ0FQX0RBQ19PVkVSUklERSkpCisJCXJldHVybiBFQUNDRVM7CisJaWYgKChtb2RlICYgQUNMX0VYRUNVVEUpICYmICFjYXBhYmxlX2NyZWQoY3IsIENBUF9EQUNfT1ZFUlJJREUpKQorCQlyZXR1cm4gRUFDQ0VTOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBOb3RlOiBjciBpcyBvbmx5IHVzZWQgaGVyZSBmb3IgdGhlIGNhcGFiaWxpdHkgY2hlY2sgaWYgdGhlIEFDTCB0ZXN0IGZhaWxzLgorICogICAgICAgSXQgaXMgbm90IHVzZWQgdG8gZmluZCBvdXQgdGhlIGNyZWRlbnRpYWxzIHVpZCBvciBncm91cHMgZXRjLCBhcyB3YXMKKyAqICAgICAgIGRvbmUgaW4gSVJJWC4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSB1aWQgYW5kIGdyb3VwcyBmb3IgdGhlIGN1cnJlbnQKKyAqICAgICAgIHRocmVhZCBhcmUgdGFrZW4gZnJvbSAiY3VycmVudCIgaW5zdGVhZCBvZiB0aGUgY3IgcGFyYW1ldGVyLgorICovCitTVEFUSUMgaW50Cit4ZnNfYWNsX2FjY2VzcygKKwl1aWRfdAkJZnVpZCwKKwlnaWRfdAkJZmdpZCwKKwl4ZnNfYWNsX3QJKmZhcCwKKwltb2RlX3QJCW1kLAorCWNyZWRfdAkJKmNyKQoreworCXhmc19hY2xfZW50cnlfdAltYXRjaGVkOworCWludAkJaSwgYWxsb3dzOworCWludAkJbWFza2FsbG93cyA9IC0xOwkvKiB0cnVlLCBidXQgbm90IDEsIGVpdGhlciAqLworCWludAkJc2Vlbl91c2Vyb2JqID0gMDsKKworCW1hdGNoZWQuYWVfdGFnID0gMDsJLyogSW52YWxpZCB0eXBlICovCisJbWQgPj49IDY7CS8qIE5vcm1hbGl6ZSB0aGUgYml0cyBmb3IgY29tcGFyaXNvbiAqLworCisJZm9yIChpID0gMDsgaSA8IGZhcC0+YWNsX2NudDsgaSsrKSB7CisJCS8qCisJCSAqIEJyZWFrIG91dCBpZiB3ZSd2ZSBnb3QgYSB1c2VyX29iaiBlbnRyeSBvcgorCQkgKiBhIHVzZXIgZW50cnkgYW5kIHRoZSBtYXNrIChhbmQgaGF2ZSBwcm9jZXNzZWQgVVNFUl9PQkopCisJCSAqLworCQlpZiAobWF0Y2hlZC5hZV90YWcgPT0gQUNMX1VTRVJfT0JKKQorCQkJYnJlYWs7CisJCWlmIChtYXRjaGVkLmFlX3RhZyA9PSBBQ0xfVVNFUikgeworCQkJaWYgKG1hc2thbGxvd3MgIT0gLTEgJiYgc2Vlbl91c2Vyb2JqKQorCQkJCWJyZWFrOworCQkJaWYgKGZhcC0+YWNsX2VudHJ5W2ldLmFlX3RhZyAhPSBBQ0xfTUFTSyAmJgorCQkJICAgIGZhcC0+YWNsX2VudHJ5W2ldLmFlX3RhZyAhPSBBQ0xfVVNFUl9PQkopCisJCQkJY29udGludWU7CisJCX0KKwkJLyogVHJ1ZSBpZiB0aGlzIGVudHJ5IGFsbG93cyB0aGUgcmVxdWVzdGVkIGFjY2VzcyAqLworCQlhbGxvd3MgPSAoKGZhcC0+YWNsX2VudHJ5W2ldLmFlX3Blcm0gJiBtZCkgPT0gbWQpOworCisJCXN3aXRjaCAoZmFwLT5hY2xfZW50cnlbaV0uYWVfdGFnKSB7CisJCWNhc2UgQUNMX1VTRVJfT0JKOgorCQkJc2Vlbl91c2Vyb2JqID0gMTsKKwkJCWlmIChmdWlkICE9IGN1cnJlbnQtPmZzdWlkKQorCQkJCWNvbnRpbnVlOworCQkJbWF0Y2hlZC5hZV90YWcgPSBBQ0xfVVNFUl9PQko7CisJCQltYXRjaGVkLmFlX3Blcm0gPSBhbGxvd3M7CisJCQlicmVhazsKKwkJY2FzZSBBQ0xfVVNFUjoKKwkJCWlmIChmYXAtPmFjbF9lbnRyeVtpXS5hZV9pZCAhPSBjdXJyZW50LT5mc3VpZCkKKwkJCQljb250aW51ZTsKKwkJCW1hdGNoZWQuYWVfdGFnID0gQUNMX1VTRVI7CisJCQltYXRjaGVkLmFlX3Blcm0gPSBhbGxvd3M7CisJCQlicmVhazsKKwkJY2FzZSBBQ0xfR1JPVVBfT0JKOgorCQkJaWYgKChtYXRjaGVkLmFlX3RhZyA9PSBBQ0xfR1JPVVBfT0JKIHx8CisJCQkgICAgbWF0Y2hlZC5hZV90YWcgPT0gQUNMX0dST1VQKSAmJiAhYWxsb3dzKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFpbl9ncm91cF9wKGZnaWQpKQorCQkJCWNvbnRpbnVlOworCQkJbWF0Y2hlZC5hZV90YWcgPSBBQ0xfR1JPVVBfT0JKOworCQkJbWF0Y2hlZC5hZV9wZXJtID0gYWxsb3dzOworCQkJYnJlYWs7CisJCWNhc2UgQUNMX0dST1VQOgorCQkJaWYgKChtYXRjaGVkLmFlX3RhZyA9PSBBQ0xfR1JPVVBfT0JKIHx8CisJCQkgICAgbWF0Y2hlZC5hZV90YWcgPT0gQUNMX0dST1VQKSAmJiAhYWxsb3dzKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFpbl9ncm91cF9wKGZhcC0+YWNsX2VudHJ5W2ldLmFlX2lkKSkKKwkJCQljb250aW51ZTsKKwkJCW1hdGNoZWQuYWVfdGFnID0gQUNMX0dST1VQOworCQkJbWF0Y2hlZC5hZV9wZXJtID0gYWxsb3dzOworCQkJYnJlYWs7CisJCWNhc2UgQUNMX01BU0s6CisJCQltYXNrYWxsb3dzID0gYWxsb3dzOworCQkJYnJlYWs7CisJCWNhc2UgQUNMX09USEVSOgorCQkJaWYgKG1hdGNoZWQuYWVfdGFnICE9IDApCisJCQkJY29udGludWU7CisJCQltYXRjaGVkLmFlX3RhZyA9IEFDTF9PVEhFUjsKKwkJCW1hdGNoZWQuYWVfcGVybSA9IGFsbG93czsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qCisJICogRmlyc3QgcG9zc2liaWxpdHkgaXMgdGhhdCBubyBtYXRjaGVkIGVudHJ5IGFsbG93cyBhY2Nlc3MuCisJICogVGhlIGNhcGFiaWxpdHkgdG8gb3ZlcnJpZGUgREFDIG1heSBleGlzdCwgc28gY2hlY2sgZm9yIGl0LgorCSAqLworCXN3aXRjaCAobWF0Y2hlZC5hZV90YWcpIHsKKwljYXNlIEFDTF9PVEhFUjoKKwljYXNlIEFDTF9VU0VSX09CSjoKKwkJaWYgKG1hdGNoZWQuYWVfcGVybSkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIEFDTF9VU0VSOgorCWNhc2UgQUNMX0dST1VQX09CSjoKKwljYXNlIEFDTF9HUk9VUDoKKwkJaWYgKG1hc2thbGxvd3MgJiYgbWF0Y2hlZC5hZV9wZXJtKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHhmc19hY2xfY2FwYWJpbGl0eV9jaGVjayhtZCwgY3IpOworfQorCisvKgorICogQUNMIHZhbGlkaXR5IGNoZWNrZXIuCisgKiAgIFRoaXMgYWNsIHZhbGlkYXRpb24gcm91dGluZSBjaGVja3MgZWFjaCBBQ0wgZW50cnkgcmVhZCBpbiBtYWtlcyBzZW5zZS4KKyAqLworU1RBVElDIGludAoreGZzX2FjbF9pbnZhbGlkKAorCXhmc19hY2xfdAkqYWNscCkKK3sKKwl4ZnNfYWNsX2VudHJ5X3QJKmVudHJ5LCAqZTsKKwlpbnQJCXVzZXIgPSAwLCBncm91cCA9IDAsIG90aGVyID0gMCwgbWFzayA9IDA7CisJaW50CQltYXNrX3JlcXVpcmVkID0gMDsKKwlpbnQJCWksIGo7CisKKwlpZiAoIWFjbHApCisJCWdvdG8gYWNsX2ludmFsaWQ7CisKKwlpZiAoYWNscC0+YWNsX2NudCA+IFhGU19BQ0xfTUFYX0VOVFJJRVMpCisJCWdvdG8gYWNsX2ludmFsaWQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWNscC0+YWNsX2NudDsgaSsrKSB7CisJCWVudHJ5ID0gJmFjbHAtPmFjbF9lbnRyeVtpXTsKKwkJc3dpdGNoIChlbnRyeS0+YWVfdGFnKSB7CisJCWNhc2UgQUNMX1VTRVJfT0JKOgorCQkJaWYgKHVzZXIrKykKKwkJCQlnb3RvIGFjbF9pbnZhbGlkOworCQkJYnJlYWs7CisJCWNhc2UgQUNMX0dST1VQX09CSjoKKwkJCWlmIChncm91cCsrKQorCQkJCWdvdG8gYWNsX2ludmFsaWQ7CisJCQlicmVhazsKKwkJY2FzZSBBQ0xfT1RIRVI6CisJCQlpZiAob3RoZXIrKykKKwkJCQlnb3RvIGFjbF9pbnZhbGlkOworCQkJYnJlYWs7CisJCWNhc2UgQUNMX1VTRVI6CisJCWNhc2UgQUNMX0dST1VQOgorCQkJZm9yIChqID0gaSArIDE7IGogPCBhY2xwLT5hY2xfY250OyBqKyspIHsKKwkJCQllID0gJmFjbHAtPmFjbF9lbnRyeVtqXTsKKwkJCQlpZiAoZS0+YWVfaWQgPT0gZW50cnktPmFlX2lkICYmCisJCQkJICAgIGUtPmFlX3RhZyA9PSBlbnRyeS0+YWVfdGFnKQorCQkJCQlnb3RvIGFjbF9pbnZhbGlkOworCQkJfQorCQkJbWFza19yZXF1aXJlZCsrOworCQkJYnJlYWs7CisJCWNhc2UgQUNMX01BU0s6CisJCQlpZiAobWFzaysrKQorCQkJCWdvdG8gYWNsX2ludmFsaWQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gYWNsX2ludmFsaWQ7CisJCX0KKwl9CisJaWYgKCF1c2VyIHx8ICFncm91cCB8fCAhb3RoZXIgfHwgKG1hc2tfcmVxdWlyZWQgJiYgIW1hc2spKQorCQlnb3RvIGFjbF9pbnZhbGlkOworCWVsc2UKKwkJcmV0dXJuIDA7CithY2xfaW52YWxpZDoKKwlyZXR1cm4gRUlOVkFMOworfQorCisvKgorICogRG8gQUNMIGVuZGlhbiBjb252ZXJzaW9uLgorICovCitTVEFUSUMgdm9pZAoreGZzX2FjbF9nZXRfZW5kaWFuKAorCXhmc19hY2xfdAkqYWNscCkKK3sKKwl4ZnNfYWNsX2VudHJ5X3QJKmFjZSwgKmVuZDsKKworCUlOVF9TRVQoYWNscC0+YWNsX2NudCwgQVJDSF9DT05WRVJULCBhY2xwLT5hY2xfY250KTsKKwllbmQgPSAmYWNscC0+YWNsX2VudHJ5WzBdK2FjbHAtPmFjbF9jbnQ7CisJZm9yIChhY2UgPSAmYWNscC0+YWNsX2VudHJ5WzBdOyBhY2UgPCBlbmQ7IGFjZSsrKSB7CisJCUlOVF9TRVQoYWNlLT5hZV90YWcsIEFSQ0hfQ09OVkVSVCwgYWNlLT5hZV90YWcpOworCQlJTlRfU0VUKGFjZS0+YWVfaWQsIEFSQ0hfQ09OVkVSVCwgYWNlLT5hZV9pZCk7CisJCUlOVF9TRVQoYWNlLT5hZV9wZXJtLCBBUkNIX0NPTlZFUlQsIGFjZS0+YWVfcGVybSk7CisJfQorfQorCisvKgorICogR2V0IHRoZSBBQ0wgZnJvbSB0aGUgRUEgYW5kIGRvIGVuZGlhbiBjb252ZXJzaW9uLgorICovCitTVEFUSUMgdm9pZAoreGZzX2FjbF9nZXRfYXR0cigKKwl2bm9kZV90CQkqdnAsCisJeGZzX2FjbF90CSphY2xwLAorCWludAkJa2luZCwKKwlpbnQJCWZsYWdzLAorCWludAkJKmVycm9yKQoreworCWludAkJbGVuID0gc2l6ZW9mKHhmc19hY2xfdCk7CisKKwlBU1NFUlQoKGZsYWdzICYgQVRUUl9LRVJOT1ZBTCkgPyAoYWNscCA9PSBOVUxMKSA6IDEpOworCWZsYWdzIHw9IEFUVFJfUk9PVDsKKwlWT1BfQVRUUl9HRVQodnAsCisJCWtpbmQgPT0gX0FDTF9UWVBFX0FDQ0VTUyA/IFNHSV9BQ0xfRklMRSA6IFNHSV9BQ0xfREVGQVVMVCwKKwkJKGNoYXIgKilhY2xwLCAmbGVuLCBmbGFncywgc3lzX2NyZWQsICplcnJvcik7CisJaWYgKCplcnJvciB8fCAoZmxhZ3MgJiBBVFRSX0tFUk5PVkFMKSkKKwkJcmV0dXJuOworCXhmc19hY2xfZ2V0X2VuZGlhbihhY2xwKTsKK30KKworLyoKKyAqIFNldCB0aGUgRUEgd2l0aCB0aGUgQUNMIGFuZCBkbyBlbmRpYW4gY29udmVyc2lvbi4KKyAqLworU1RBVElDIHZvaWQKK3hmc19hY2xfc2V0X2F0dHIoCisJdm5vZGVfdAkJKnZwLAorCXhmc19hY2xfdAkqYWNscCwKKwlpbnQJCWtpbmQsCisJaW50CQkqZXJyb3IpCit7CisJeGZzX2FjbF9lbnRyeV90CSphY2UsICpuZXdhY2UsICplbmQ7CisJeGZzX2FjbF90CSpuZXdhY2w7CisJaW50CQlsZW47CisKKwlpZiAoIShfQUNMX0FMTE9DKG5ld2FjbCkpKSB7CisJCSplcnJvciA9IEVOT01FTTsKKwkJcmV0dXJuOworCX0KKworCWxlbiA9IHNpemVvZih4ZnNfYWNsX3QpIC0KKwkgICAgICAoc2l6ZW9mKHhmc19hY2xfZW50cnlfdCkgKiAoWEZTX0FDTF9NQVhfRU5UUklFUyAtIGFjbHAtPmFjbF9jbnQpKTsKKwllbmQgPSAmYWNscC0+YWNsX2VudHJ5WzBdK2FjbHAtPmFjbF9jbnQ7CisJZm9yIChhY2UgPSAmYWNscC0+YWNsX2VudHJ5WzBdLCBuZXdhY2UgPSAmbmV3YWNsLT5hY2xfZW50cnlbMF07CisJICAgICBhY2UgPCBlbmQ7CisJICAgICBhY2UrKywgbmV3YWNlKyspIHsKKwkJSU5UX1NFVChuZXdhY2UtPmFlX3RhZywgQVJDSF9DT05WRVJULCBhY2UtPmFlX3RhZyk7CisJCUlOVF9TRVQobmV3YWNlLT5hZV9pZCwgQVJDSF9DT05WRVJULCBhY2UtPmFlX2lkKTsKKwkJSU5UX1NFVChuZXdhY2UtPmFlX3Blcm0sIEFSQ0hfQ09OVkVSVCwgYWNlLT5hZV9wZXJtKTsKKwl9CisJSU5UX1NFVChuZXdhY2wtPmFjbF9jbnQsIEFSQ0hfQ09OVkVSVCwgYWNscC0+YWNsX2NudCk7CisJVk9QX0FUVFJfU0VUKHZwLAorCQlraW5kID09IF9BQ0xfVFlQRV9BQ0NFU1MgPyBTR0lfQUNMX0ZJTEU6IFNHSV9BQ0xfREVGQVVMVCwKKwkJKGNoYXIgKiluZXdhY2wsIGxlbiwgQVRUUl9ST09ULCBzeXNfY3JlZCwgKmVycm9yKTsKKwlfQUNMX0ZSRUUobmV3YWNsKTsKK30KKworaW50Cit4ZnNfYWNsX3Z0b2FjbCgKKwl2bm9kZV90CQkqdnAsCisJeGZzX2FjbF90CSphY2Nlc3NfYWNsLAorCXhmc19hY2xfdAkqZGVmYXVsdF9hY2wpCit7CisJdmF0dHJfdAkJdmE7CisJaW50CQllcnJvciA9IDA7CisKKwlpZiAoYWNjZXNzX2FjbCkgeworCQkvKgorCQkgKiBHZXQgdGhlIEFjY2VzcyBBQ0wgYW5kIHRoZSBtb2RlLiAgSWYgZWl0aGVyIGNhbm5vdAorCQkgKiBiZSBvYnRhaW5lZCBmb3Igc29tZSByZWFzb24sIGludmFsaWRhdGUgdGhlIGFjY2VzcyBBQ0wuCisJCSAqLworCQl4ZnNfYWNsX2dldF9hdHRyKHZwLCBhY2Nlc3NfYWNsLCBfQUNMX1RZUEVfQUNDRVNTLCAwLCAmZXJyb3IpOworCQlpZiAoIWVycm9yKSB7CisJCQkvKiBHb3QgdGhlIEFDTCwgbmVlZCB0aGUgbW9kZS4uLiAqLworCQkJdmEudmFfbWFzayA9IFhGU19BVF9NT0RFOworCQkJVk9QX0dFVEFUVFIodnAsICZ2YSwgMCwgc3lzX2NyZWQsIGVycm9yKTsKKwkJfQorCisJCWlmIChlcnJvcikKKwkJCWFjY2Vzc19hY2wtPmFjbF9jbnQgPSBYRlNfQUNMX05PVF9QUkVTRU5UOworCQllbHNlIC8qIFdlIGhhdmUgYSBnb29kIEFDTCBhbmQgdGhlIGZpbGUgbW9kZSwgc3luY2hyb25pemUuICovCisJCQl4ZnNfYWNsX3N5bmNfbW9kZSh2YS52YV9tb2RlLCBhY2Nlc3NfYWNsKTsKKwl9CisKKwlpZiAoZGVmYXVsdF9hY2wpIHsKKwkJeGZzX2FjbF9nZXRfYXR0cih2cCwgZGVmYXVsdF9hY2wsIF9BQ0xfVFlQRV9ERUZBVUxULCAwLCAmZXJyb3IpOworCQlpZiAoZXJyb3IpCisJCQlkZWZhdWx0X2FjbC0+YWNsX2NudCA9IFhGU19BQ0xfTk9UX1BSRVNFTlQ7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBwYXJlbnQgZGlyZWN0b3J5J3MgYWNsLCBwcm9jZXNzZXMgaXQKKyAqIGFuZCBsZXRzIHRoZSBjaGlsZCBpbmhlcml0IHRoZSBhY2wocykgdGhhdCBpdCBzaG91bGQuCisgKi8KK2ludAoreGZzX2FjbF9pbmhlcml0KAorCXZub2RlX3QJCSp2cCwKKwl2YXR0cl90CQkqdmFwLAorCXhmc19hY2xfdAkqcGRhY2xwKQoreworCXhmc19hY2xfdAkqY2FjbDsKKwlpbnQJCWVycm9yID0gMDsKKwlpbnQJCWJhc2ljcGVybXMgPSAwOworCisJLyoKKwkgKiBJZiB0aGUgcGFyZW50IGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IEFDTCwgb3IgaXQncyBhbgorCSAqIGludmFsaWQgQUNMLCB3ZSdyZSBkb25lLgorCSAqLworCWlmICghdnApCisJCXJldHVybiAwOworCWlmICghcGRhY2xwIHx8IHhmc19hY2xfaW52YWxpZChwZGFjbHApKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogQ29weSB0aGUgZGVmYXVsdCBBQ0wgb2YgdGhlIGNvbnRhaW5pbmcgZGlyZWN0b3J5IHRvCisJICogdGhlIGFjY2VzcyBBQ0wgb2YgdGhlIG5ldyBmaWxlIGFuZCB1c2UgdGhlIG1vZGUgdGhhdAorCSAqIHdhcyBwYXNzZWQgaW4gdG8gc2V0IHVwIHRoZSBjb3JyZWN0IGluaXRpYWwgdmFsdWVzIGZvcgorCSAqIHRoZSB1OjosZzo6W206Ol0sIGFuZCBvOjogZW50cmllcy4gIFRoaXMgaXMgd2hhdCBtYWtlcworCSAqIHVtYXNrKCkgIndvcmsiIHdpdGggQUNMJ3MuCisJICovCisKKwlpZiAoIShfQUNMX0FMTE9DKGNhY2wpKSkKKwkJcmV0dXJuIEVOT01FTTsKKworCW1lbWNweShjYWNsLCBwZGFjbHAsIHNpemVvZih4ZnNfYWNsX3QpKTsKKwl4ZnNfYWNsX2ZpbHRlcl9tb2RlKHZhcC0+dmFfbW9kZSwgY2FjbCk7CisJeGZzX2FjbF9zZXRtb2RlKHZwLCBjYWNsLCAmYmFzaWNwZXJtcyk7CisKKwkvKgorCSAqIFNldCB0aGUgRGVmYXVsdCBhbmQgQWNjZXNzIEFDTCBvbiB0aGUgZmlsZS4gIFRoZSBtb2RlIGlzIGFscmVhZHkKKwkgKiBzZXQgb24gdGhlIGZpbGUsIHNvIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhhdC4KKwkgKgorCSAqIElmIHRoZSBuZXcgZmlsZSBpcyBhIGRpcmVjdG9yeSwgaXRzIGRlZmF1bHQgQUNMIGlzIGEgY29weSBvZgorCSAqIHRoZSBjb250YWluaW5nIGRpcmVjdG9yeSdzIGRlZmF1bHQgQUNMLgorCSAqLworCWlmICh2cC0+dl90eXBlID09IFZESVIpCisJCXhmc19hY2xfc2V0X2F0dHIodnAsIHBkYWNscCwgX0FDTF9UWVBFX0RFRkFVTFQsICZlcnJvcik7CisJaWYgKCFlcnJvciAmJiAhYmFzaWNwZXJtcykKKwkJeGZzX2FjbF9zZXRfYXR0cih2cCwgY2FjbCwgX0FDTF9UWVBFX0FDQ0VTUywgJmVycm9yKTsKKwlfQUNMX0ZSRUUoY2FjbCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogU2V0IHVwIHRoZSBjb3JyZWN0IG1vZGUgb24gdGhlIGZpbGUgYmFzZWQgb24gdGhlIHN1cHBsaWVkIEFDTC4gIFRoaXMKKyAqIG1ha2VzIHN1cmUgdGhhdCB0aGUgbW9kZSBvbiB0aGUgZmlsZSByZWZsZWN0cyB0aGUgc3RhdGUgb2YgdGhlCisgKiB1OjosZzo6W206Ol0sIGFuZCBvOjogZW50cmllcyBpbiB0aGUgQUNMLiAgU2luY2UgdGhlIG1vZGUgaXMgd2hlcmUKKyAqIHRoZSBBQ0wgaXMgZ29pbmcgdG8gZ2V0IHRoZSBwZXJtaXNzaW9ucyBmb3IgdGhlc2UgZW50cmllcywgd2UgbXVzdAorICogc3luY2hyb25pemUgdGhlIG1vZGUgd2hlbmV2ZXIgd2Ugc2V0IHRoZSBBQ0wgb24gYSBmaWxlLgorICovCitTVEFUSUMgaW50Cit4ZnNfYWNsX3NldG1vZGUoCisJdm5vZGVfdAkJKnZwLAorCXhmc19hY2xfdAkqYWNsLAorCWludAkJKmJhc2ljcGVybXMpCit7CisJdmF0dHJfdAkJdmE7CisJeGZzX2FjbF9lbnRyeV90CSphcDsKKwl4ZnNfYWNsX2VudHJ5X3QJKmdhcCA9IE5VTEw7CisJaW50CQlpLCBlcnJvciwgbm9tYXNrID0gMTsKKworCSpiYXNpY3Blcm1zID0gMTsKKworCWlmIChhY2wtPmFjbF9jbnQgPT0gWEZTX0FDTF9OT1RfUFJFU0VOVCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIENvcHkgdGhlIHU6OiwgZzo6LCBvOjosIGFuZCBtOjogYml0cyBmcm9tIHRoZSBBQ0wgaW50byB0aGUKKwkgKiBtb2RlLiAgVGhlIG06OiBiaXRzIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSBnOjogYml0cy4KKwkgKi8KKwl2YS52YV9tYXNrID0gWEZTX0FUX01PREU7CisJVk9QX0dFVEFUVFIodnAsICZ2YSwgMCwgc3lzX2NyZWQsIGVycm9yKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXZhLnZhX21hc2sgPSBYRlNfQVRfTU9ERTsKKwl2YS52YV9tb2RlICY9IH4oU19JUldYVXxTX0lSV1hHfFNfSVJXWE8pOworCWFwID0gYWNsLT5hY2xfZW50cnk7CisJZm9yIChpID0gMDsgaSA8IGFjbC0+YWNsX2NudDsgKytpKSB7CisJCXN3aXRjaCAoYXAtPmFlX3RhZykgeworCQljYXNlIEFDTF9VU0VSX09CSjoKKwkJCXZhLnZhX21vZGUgfD0gYXAtPmFlX3Blcm0gPDwgNjsKKwkJCWJyZWFrOworCQljYXNlIEFDTF9HUk9VUF9PQko6CisJCQlnYXAgPSBhcDsKKwkJCWJyZWFrOworCQljYXNlIEFDTF9NQVNLOgkvKiBtb3JlIHRoYW4ganVzdCBzdGFuZGFyZCBtb2RlcyAqLworCQkJbm9tYXNrID0gMDsKKwkJCXZhLnZhX21vZGUgfD0gYXAtPmFlX3Blcm0gPDwgMzsKKwkJCSpiYXNpY3Blcm1zID0gMDsKKwkJCWJyZWFrOworCQljYXNlIEFDTF9PVEhFUjoKKwkJCXZhLnZhX21vZGUgfD0gYXAtPmFlX3Blcm07CisJCQlicmVhazsKKwkJZGVmYXVsdDoJLyogbW9yZSB0aGFuIGp1c3Qgc3RhbmRhcmQgbW9kZXMgKi8KKwkJCSpiYXNpY3Blcm1zID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWFwKys7CisJfQorCisJLyogU2V0IHRoZSBncm91cCBiaXRzIGZyb20gQUNMX0dST1VQX09CSiBpZiB0aGVyZSdzIG5vIEFDTF9NQVNLICovCisJaWYgKGdhcCAmJiBub21hc2spCisJCXZhLnZhX21vZGUgfD0gZ2FwLT5hZV9wZXJtIDw8IDM7CisKKwlWT1BfU0VUQVRUUih2cCwgJnZhLCAwLCBzeXNfY3JlZCwgZXJyb3IpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFRoZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHNwZWNpYWwgQUNMIGVudHJpZXMgKHU6OiwgZzo6W206Ol0sIG86OikgYXJlCisgKiBhY3R1YWxseSBzdG9yZWQgaW4gdGhlIGZpbGUgbW9kZSAoaWYgdGhlcmUgaXMgYm90aCBhIGdyb3VwIGFuZCBhIG1hc2ssCisgKiB0aGUgZ3JvdXAgaXMgc3RvcmVkIGluIHRoZSBBQ0wgZW50cnkgYW5kIHRoZSBtYXNrIGlzIHN0b3JlZCBvbiB0aGUgZmlsZSkuCisgKiBUaGlzIGFsbG93cyB0aGUgbW9kZSB0byByZW1haW4gYXV0b21hdGljYWxseSBpbiBzeW5jIHdpdGggdGhlIEFDTCB3aXRob3V0CisgKiB0aGUgbmVlZCBmb3IgYSBjYWxsLWJhY2sgdG8gdGhlIEFDTCBzeXN0ZW0gYXQgZXZlcnkgcG9pbnQgd2hlcmUgdGhlIG1vZGUKKyAqIGNvdWxkIGNoYW5nZS4gIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHBlcm1pc3Npb25zIGZyb20gdGhlIHNwZWNpZmllZCBtb2RlCisgKiBhbmQgcGxhY2VzIGl0IGluIHRoZSBzdXBwbGllZCBBQ0wuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBkcmF3cyBpdHMgdmFsaWRpdHkgZnJvbSB0aGUgZmFjdCB0aGF0LCB3aGVuIHRoZSBBQ0wKKyAqIHdhcyBhc3NpZ25lZCwgdGhlIG1vZGUgd2FzIGNvcGllZCBmcm9tIHRoZSBBQ0wuCisgKiBJZiB0aGUgbW9kZSBkaWQgbm90IGNoYW5nZSwgdGhlcmVmb3JlLCB0aGUgbW9kZSByZW1haW5zIGV4YWN0bHkgd2hhdCB3YXMKKyAqIHRha2VuIGZyb20gdGhlIHNwZWNpYWwgQUNMIGVudHJpZXMgYXQgYXNzaWdubWVudC4KKyAqIElmIGEgc3Vic2VxdWVudCBjaG1vZCgpIHdhcyBkb25lLCB0aGUgUE9TSVggc3BlYyBzYXlzIHRoYXQgdGhlIGNoYW5nZSBpbgorICogbW9kZSBtdXN0IGNhdXNlIGFuIHVwZGF0ZSB0byB0aGUgQUNMIHNlZW4gYXQgdXNlciBsZXZlbCBhbmQgdXNlZCBmb3IKKyAqIGFjY2VzcyBjaGVja3MuICBCZWZvcmUgYW5kIGFmdGVyIGEgbW9kZSBjaGFuZ2UsIHRoZXJlZm9yZSwgdGhlIGZpbGUgbW9kZQorICogbW9zdCBhY2N1cmF0ZWx5IHJlZmxlY3RzIHdoYXQgdGhlIHNwZWNpYWwgQUNMIGVudHJpZXMgc2hvdWxkIHBlcm1pdC9kZW55LgorICoKKyAqIENBVkVBVDogSWYgc29tZW9uZSBzZXRzIHRoZSBTR0lfQUNMX0ZJTEUgYXR0cmlidXRlIGRpcmVjdGx5LAorICogICAgICAgICB0aGUgZXhpc3RpbmcgbW9kZSBiaXRzIHdpbGwgb3ZlcnJpZGUgd2hhdGV2ZXIgaXMgaW4gdGhlCisgKiAgICAgICAgIEFDTC4gU2ltaWxhcmx5LCBpZiB0aGVyZSBpcyBhIHByZS1leGlzdGluZyBBQ0wgdGhhdCB3YXMKKyAqICAgICAgICAgbmV2ZXIgaW4gc3luYyB3aXRoIGl0cyBtb2RlIChvd2luZyB0byBhIGJ1ZyBpbiA2LjUgYW5kCisgKiAgICAgICAgIGJlZm9yZSksIGl0IHdpbGwgbm93IG1hZ2ljYWxseSAob3IgbXlzdGljYWxseSkgYmUKKyAqICAgICAgICAgc3luY2hyb25pemVkLiAgVGhpcyBjb3VsZCBjYXVzZSBzbGlnaHQgYXN0b25pc2htZW50LCBidXQKKyAqICAgICAgICAgaXQgaXMgYmV0dGVyIHRoYW4gaW5jb25zaXN0ZW50IHBlcm1pc3Npb25zLgorICoKKyAqIFRoZSBzdXBwbGllZCBBQ0wgaXMgYSB0ZW1wbGF0ZSB0aGF0IG1heSBjb250YWluIGFueSBjb21iaW5hdGlvbgorICogb2Ygc3BlY2lhbCBlbnRyaWVzLiAgVGhlc2UgYXJlIHRyZWF0ZWQgYXMgcGxhY2UgaG9sZGVycyB3aGVuIHdlIGZpbGwKKyAqIG91dCB0aGUgQUNMLiAgVGhpcyByb3V0aW5lIGRvZXMgbm90IGFkZCBvciByZW1vdmUgc3BlY2lhbCBlbnRyaWVzLCBpdAorICogc2ltcGx5IHVuaXRlcyBlYWNoIHNwZWNpYWwgZW50cnkgd2l0aCBpdHMgYXNzb2NpYXRlZCBzZXQgb2YgcGVybWlzc2lvbnMuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYWNsX3N5bmNfbW9kZSgKKwltb2RlX3QJCW1vZGUsCisJeGZzX2FjbF90CSphY2wpCit7CisJaW50CQlpLCBub21hc2sgPSAxOworCXhmc19hY2xfZW50cnlfdAkqYXA7CisJeGZzX2FjbF9lbnRyeV90CSpnYXAgPSBOVUxMOworCisJLyoKKwkgKiBTZXQgQUNMIGVudHJpZXMuIFBPU0lYMTAwMy4xZUQxNiByZXF1aXJlcyB0aGF0IHRoZSBNQVNLCisJICogYmUgc2V0IGluc3RlYWQgb2YgdGhlIEdST1VQIGVudHJ5LCBpZiB0aGVyZSBpcyBhIE1BU0suCisJICovCisJZm9yIChhcCA9IGFjbC0+YWNsX2VudHJ5LCBpID0gMDsgaSA8IGFjbC0+YWNsX2NudDsgYXArKywgaSsrKSB7CisJCXN3aXRjaCAoYXAtPmFlX3RhZykgeworCQljYXNlIEFDTF9VU0VSX09CSjoKKwkJCWFwLT5hZV9wZXJtID0gKG1vZGUgPj4gNikgJiAweDc7CisJCQlicmVhazsKKwkJY2FzZSBBQ0xfR1JPVVBfT0JKOgorCQkJZ2FwID0gYXA7CisJCQlicmVhazsKKwkJY2FzZSBBQ0xfTUFTSzoKKwkJCW5vbWFzayA9IDA7CisJCQlhcC0+YWVfcGVybSA9IChtb2RlID4+IDMpICYgMHg3OworCQkJYnJlYWs7CisJCWNhc2UgQUNMX09USEVSOgorCQkJYXAtPmFlX3Blcm0gPSBtb2RlICYgMHg3OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBTZXQgdGhlIEFDTF9HUk9VUF9PQkogaWYgdGhlcmUncyBubyBBQ0xfTUFTSyAqLworCWlmIChnYXAgJiYgbm9tYXNrKQorCQlnYXAtPmFlX3Blcm0gPSAobW9kZSA+PiAzKSAmIDB4NzsKK30KKworLyoKKyAqIFdoZW4gaW5oZXJpdGluZyBhbiBBY2Nlc3MgQUNMIGZyb20gYSBkaXJlY3RvcnkgRGVmYXVsdCBBQ0wsCisgKiB0aGUgQUNMIGJpdHMgYXJlIHNldCB0byB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBBQ0wgZGVmYXVsdAorICogcGVybWlzc2lvbiBiaXRzIGFuZCB0aGUgZmlsZSBwZXJtaXNzaW9uIGJpdHMgaW4gbW9kZS4gSWYgdGhlcmUKKyAqIGFyZSBubyBwZXJtaXNzaW9uIGJpdHMgb24gdGhlIGZpbGUgdGhlbiB3ZSBtdXN0IG5vdCBnaXZlIHRoZW0KKyAqIHRoZSBBQ0wuIFRoaXMgaXMgd2hhdCB3aGF0IG1ha2VzIHVtYXNrKCkgd29yayB3aXRoIEFDTHMuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYWNsX2ZpbHRlcl9tb2RlKAorCW1vZGVfdAkJbW9kZSwKKwl4ZnNfYWNsX3QJKmFjbCkKK3sKKwlpbnQJCWksIG5vbWFzayA9IDE7CisJeGZzX2FjbF9lbnRyeV90CSphcDsKKwl4ZnNfYWNsX2VudHJ5X3QJKmdhcCA9IE5VTEw7CisKKwkvKgorCSAqIFNldCBBQ0wgZW50cmllcy4gUE9TSVgxMDAzLjFlRDE2IHJlcXVpcmVzIHRoYXQgdGhlIE1BU0sKKwkgKiBiZSBtZXJnZWQgd2l0aCBHUk9VUCBlbnRyeSwgaWYgdGhlcmUgaXMgYSBNQVNLLgorCSAqLworCWZvciAoYXAgPSBhY2wtPmFjbF9lbnRyeSwgaSA9IDA7IGkgPCBhY2wtPmFjbF9jbnQ7IGFwKyssIGkrKykgeworCQlzd2l0Y2ggKGFwLT5hZV90YWcpIHsKKwkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCQlhcC0+YWVfcGVybSAmPSAobW9kZSA+PiA2KSAmIDB4NzsKKwkJCWJyZWFrOworCQljYXNlIEFDTF9HUk9VUF9PQko6CisJCQlnYXAgPSBhcDsKKwkJCWJyZWFrOworCQljYXNlIEFDTF9NQVNLOgorCQkJbm9tYXNrID0gMDsKKwkJCWFwLT5hZV9wZXJtICY9IChtb2RlID4+IDMpICYgMHg3OworCQkJYnJlYWs7CisJCWNhc2UgQUNMX09USEVSOgorCQkJYXAtPmFlX3Blcm0gJj0gbW9kZSAmIDB4NzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJLyogU2V0IHRoZSBBQ0xfR1JPVVBfT0JKIGlmIHRoZXJlJ3Mgbm8gQUNMX01BU0sgKi8KKwlpZiAoZ2FwICYmIG5vbWFzaykKKwkJZ2FwLT5hZV9wZXJtICY9IChtb2RlID4+IDMpICYgMHg3OworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hY2wuaCBiL2ZzL3hmcy94ZnNfYWNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM2M2ViNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfYWNsLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0FDTF9IX18KKyNkZWZpbmUgX19YRlNfQUNMX0hfXworCisvKgorICogQWNjZXNzIENvbnRyb2wgTGlzdHMKKyAqLwordHlwZWRlZiBfX3VpbnQxNl90CXhmc19hY2xfcGVybV90OwordHlwZWRlZiBfX2ludDMyX3QJeGZzX2FjbF90eXBlX3Q7Cit0eXBlZGVmIF9faW50MzJfdAl4ZnNfYWNsX3RhZ190OwordHlwZWRlZiBfX2ludDMyX3QJeGZzX2FjbF9pZF90OworCisjZGVmaW5lIFhGU19BQ0xfTUFYX0VOVFJJRVMgMjUKKyNkZWZpbmUgWEZTX0FDTF9OT1RfUFJFU0VOVCAoLTEpCisKK3R5cGVkZWYgc3RydWN0IHhmc19hY2xfZW50cnkgeworCXhmc19hY2xfdGFnX3QJYWVfdGFnOworCXhmc19hY2xfaWRfdAlhZV9pZDsKKwl4ZnNfYWNsX3Blcm1fdAlhZV9wZXJtOworfSB4ZnNfYWNsX2VudHJ5X3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19hY2wgeworCV9faW50MzJfdAlhY2xfY250OworCXhmc19hY2xfZW50cnlfdAlhY2xfZW50cnlbWEZTX0FDTF9NQVhfRU5UUklFU107Cit9IHhmc19hY2xfdDsKKworLyogT24tZGlzayBYRlMgZXh0ZW5kZWQgYXR0cmlidXRlIG5hbWVzICovCisjZGVmaW5lIFNHSV9BQ0xfRklMRQkiU0dJX0FDTF9GSUxFIgorI2RlZmluZSBTR0lfQUNMX0RFRkFVTFQJIlNHSV9BQ0xfREVGQVVMVCIKKyNkZWZpbmUgU0dJX0FDTF9GSUxFX1NJWkUJKHNpemVvZihTR0lfQUNMX0ZJTEUpLTEpCisjZGVmaW5lIFNHSV9BQ0xfREVGQVVMVF9TSVpFCShzaXplb2YoU0dJX0FDTF9ERUZBVUxUKS0xKQorCisKKyNpZmRlZiBDT05GSUdfWEZTX1BPU0lYX0FDTAorCitzdHJ1Y3QgdmF0dHI7CitzdHJ1Y3Qgdm5vZGU7CitzdHJ1Y3QgeGZzX2lub2RlOworCitleHRlcm4gc3RydWN0IGttZW1fem9uZSAqeGZzX2FjbF96b25lOworI2RlZmluZSB4ZnNfYWNsX3pvbmVfaW5pdCh6b25lLCBuYW1lKQlcCisJCSh6b25lKSA9IGttZW1fem9uZV9pbml0KHNpemVvZih4ZnNfYWNsX3QpLCBuYW1lKQorI2RlZmluZSB4ZnNfYWNsX3pvbmVfZGVzdHJveSh6b25lKQlrbWVtX2NhY2hlX2Rlc3Ryb3koem9uZSkKKworZXh0ZXJuIGludCB4ZnNfYWNsX2luaGVyaXQoc3RydWN0IHZub2RlICosIHN0cnVjdCB2YXR0ciAqLCB4ZnNfYWNsX3QgKik7CitleHRlcm4gaW50IHhmc19hY2xfaWFjY2VzcyhzdHJ1Y3QgeGZzX2lub2RlICosIG1vZGVfdCwgY3JlZF90ICopOworZXh0ZXJuIGludCB4ZnNfYWNsX3Z0b2FjbChzdHJ1Y3Qgdm5vZGUgKiwgeGZzX2FjbF90ICosIHhmc19hY2xfdCAqKTsKK2V4dGVybiBpbnQgeGZzX2FjbF92aGFzYWNsX2FjY2VzcyhzdHJ1Y3Qgdm5vZGUgKik7CitleHRlcm4gaW50IHhmc19hY2xfdmhhc2FjbF9kZWZhdWx0KHN0cnVjdCB2bm9kZSAqKTsKK2V4dGVybiBpbnQgeGZzX2FjbF92c2V0KHN0cnVjdCB2bm9kZSAqLCB2b2lkICosIHNpemVfdCwgaW50KTsKK2V4dGVybiBpbnQgeGZzX2FjbF92Z2V0KHN0cnVjdCB2bm9kZSAqLCB2b2lkICosIHNpemVfdCwgaW50KTsKK2V4dGVybiBpbnQgeGZzX2FjbF92cmVtb3ZlKHN0cnVjdCB2bm9kZSAqdnAsIGludCk7CisKKyNkZWZpbmUgX0FDTF9UWVBFX0FDQ0VTUwkxCisjZGVmaW5lIF9BQ0xfVFlQRV9ERUZBVUxUCTIKKyNkZWZpbmUgX0FDTF9QRVJNX0lOVkFMSUQocGVybSkJKChwZXJtKSAmIH4oQUNMX1JFQUR8QUNMX1dSSVRFfEFDTF9FWEVDVVRFKSkKKworI2RlZmluZSBfQUNMX0lOSEVSSVQoYyx2LGQpCSh4ZnNfYWNsX2luaGVyaXQoYyx2LGQpKQorI2RlZmluZSBfQUNMX0dFVF9BQ0NFU1MocHYscGEpCSh4ZnNfYWNsX3Z0b2FjbChwdixwYSxOVUxMKSA9PSAwKQorI2RlZmluZSBfQUNMX0dFVF9ERUZBVUxUKHB2LHBkKQkoeGZzX2FjbF92dG9hY2wocHYsTlVMTCxwZCkgPT0gMCkKKyNkZWZpbmUgX0FDTF9BQ0NFU1NfRVhJU1RTCXhmc19hY2xfdmhhc2FjbF9hY2Nlc3MKKyNkZWZpbmUgX0FDTF9ERUZBVUxUX0VYSVNUUwl4ZnNfYWNsX3ZoYXNhY2xfZGVmYXVsdAorI2RlZmluZSBfQUNMX1hGU19JQUNDRVNTKGksbSxjKSAoWEZTX0lGT1JLX1EoaSkgPyB4ZnNfYWNsX2lhY2Nlc3MoaSxtLGMpIDogLTEpCisKKyNkZWZpbmUgX0FDTF9BTExPQyhhKQkJKChhKSA9IGttZW1fem9uZV9hbGxvYyh4ZnNfYWNsX3pvbmUsIEtNX1NMRUVQKSkKKyNkZWZpbmUgX0FDTF9GUkVFKGEpCQkoKGEpPyBrbWVtX3pvbmVfZnJlZSh4ZnNfYWNsX3pvbmUsIChhKSk6KHZvaWQpMCkKKworI2Vsc2UKKyNkZWZpbmUgeGZzX2FjbF96b25lX2luaXQoem9uZSxuYW1lKQorI2RlZmluZSB4ZnNfYWNsX3pvbmVfZGVzdHJveSh6b25lKQorI2RlZmluZSB4ZnNfYWNsX3ZzZXQodixwLHN6LHQpCSgtRU9QTk9UU1VQUCkKKyNkZWZpbmUgeGZzX2FjbF92Z2V0KHYscCxzeix0KQkoLUVPUE5PVFNVUFApCisjZGVmaW5lIHhmc19hY2xfdnJlbW92ZSh2LHQpCSgtRU9QTk9UU1VQUCkKKyNkZWZpbmUgeGZzX2FjbF92aGFzYWNsX2FjY2Vzcyh2KQkoMCkKKyNkZWZpbmUgeGZzX2FjbF92aGFzYWNsX2RlZmF1bHQodikJKDApCisjZGVmaW5lIF9BQ0xfQUxMT0MoYSkJCSgxKQkvKiBzdWNjZXNzZnVsbHkgYWxsb2NhdGUgbm90aGluZyAqLworI2RlZmluZSBfQUNMX0ZSRUUoYSkJCSgodm9pZCkwKQorI2RlZmluZSBfQUNMX0lOSEVSSVQoYyx2LGQpCSgwKQorI2RlZmluZSBfQUNMX0dFVF9BQ0NFU1MocHYscGEpCSgwKQorI2RlZmluZSBfQUNMX0dFVF9ERUZBVUxUKHB2LHBkKQkoMCkKKyNkZWZpbmUgX0FDTF9BQ0NFU1NfRVhJU1RTCShOVUxMKQorI2RlZmluZSBfQUNMX0RFRkFVTFRfRVhJU1RTCShOVUxMKQorI2RlZmluZSBfQUNMX1hGU19JQUNDRVNTKGksbSxjKSAoLTEpCisjZW5kaWYKKworI2VuZGlmCS8qIF9fWEZTX0FDTF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYWcuaCBiL2ZzL3hmcy94ZnNfYWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmI3MGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19hZy5oCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19BR19IX18KKyNkZWZpbmUJX19YRlNfQUdfSF9fCisKKy8qCisgKiBBbGxvY2F0aW9uIGdyb3VwIGhlYWRlcgorICogVGhpcyBpcyBkaXZpZGVkIGludG8gdGhyZWUgc3RydWN0dXJlcywgcGxhY2VkIGluIHNlcXVlbnRpYWwgNTEyLWJ5dGUKKyAqIGJ1ZmZlcnMgYWZ0ZXIgYSBjb3B5IG9mIHRoZSBzdXBlcmJsb2NrIChhbHNvIGluIGEgNTEyLWJ5dGUgYnVmZmVyKS4KKyAqLworCitzdHJ1Y3QgeGZzX2J1ZjsKK3N0cnVjdCB4ZnNfbW91bnQ7CitzdHJ1Y3QgeGZzX3RyYW5zOworCisjZGVmaW5lCVhGU19BR0ZfTUFHSUMJMHg1ODQxNDc0NgkvKiAnWEFHRicgKi8KKyNkZWZpbmUJWEZTX0FHSV9NQUdJQwkweDU4NDE0NzQ5CS8qICdYQUdJJyAqLworI2RlZmluZQlYRlNfQUdGX1ZFUlNJT04JMQorI2RlZmluZQlYRlNfQUdJX1ZFUlNJT04JMQorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUdGX0dPT0RfVkVSU0lPTikKK2ludCB4ZnNfYWdmX2dvb2RfdmVyc2lvbih1bnNpZ25lZCB2KTsKKyNkZWZpbmUJWEZTX0FHRl9HT09EX1ZFUlNJT04odikJeGZzX2FnZl9nb29kX3ZlcnNpb24odikKKyNlbHNlCisjZGVmaW5lIFhGU19BR0ZfR09PRF9WRVJTSU9OKHYpCQkoKHYpID09IFhGU19BR0ZfVkVSU0lPTikKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUdJX0dPT0RfVkVSU0lPTikKK2ludCB4ZnNfYWdpX2dvb2RfdmVyc2lvbih1bnNpZ25lZCB2KTsKKyNkZWZpbmUJWEZTX0FHSV9HT09EX1ZFUlNJT04odikJeGZzX2FnaV9nb29kX3ZlcnNpb24odikKKyNlbHNlCisjZGVmaW5lIFhGU19BR0lfR09PRF9WRVJTSU9OKHYpCQkoKHYpID09IFhGU19BR0lfVkVSU0lPTikKKyNlbmRpZgorCisvKgorICogQnRyZWUgbnVtYmVyIDAgaXMgYm5vLCAxIGlzIGNudC4gIFRoaXMgdmFsdWUgZ2l2ZXMgdGhlIHNpemUgb2YgdGhlCisgKiBhcnJheXMgYmVsb3cuCisgKi8KKyNkZWZpbmUJWEZTX0JUTlVNX0FHRgkoKGludClYRlNfQlROVU1fQ05UaSArIDEpCisKKy8qCisgKiBUaGUgc2Vjb25kIHdvcmQgb2YgYWdmX2xldmVscyBpbiB0aGUgZmlyc3QgYS5nLiBvdmVybGFwcyB0aGUgRUZTCisgKiBzdXBlcmJsb2NrJ3MgbWFnaWMgbnVtYmVyLiAgU2luY2UgdGhlIG1hZ2ljIG51bWJlcnMgdmFsaWQgZm9yIEVGUworICogYXJlID4gNjRrLCBvdXIgdmFsdWUgY2Fubm90IGJlIGNvbmZ1c2VkIGZvciBhbiBFRlMgc3VwZXJibG9jaydzLgorICovCisKK3R5cGVkZWYgc3RydWN0IHhmc19hZ2YKK3sKKwkvKgorCSAqIENvbW1vbiBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciBpbmZvcm1hdGlvbgorCSAqLworCV9fdWludDMyX3QJYWdmX21hZ2ljbnVtOwkvKiBtYWdpYyBudW1iZXIgPT0gWEZTX0FHRl9NQUdJQyAqLworCV9fdWludDMyX3QJYWdmX3ZlcnNpb25udW07CS8qIGhlYWRlciB2ZXJzaW9uID09IFhGU19BR0ZfVkVSU0lPTiAqLworCXhmc19hZ251bWJlcl90CWFnZl9zZXFubzsJLyogc2VxdWVuY2UgIyBzdGFydGluZyBmcm9tIDAgKi8KKwl4ZnNfYWdibG9ja190CWFnZl9sZW5ndGg7CS8qIHNpemUgaW4gYmxvY2tzIG9mIGEuZy4gKi8KKwkvKgorCSAqIEZyZWVzcGFjZSBpbmZvcm1hdGlvbgorCSAqLworCXhmc19hZ2Jsb2NrX3QJYWdmX3Jvb3RzW1hGU19CVE5VTV9BR0ZdOwkvKiByb290IGJsb2NrcyAqLworCV9fdWludDMyX3QJYWdmX3NwYXJlMDsJLyogc3BhcmUgZmllbGQgKi8KKwlfX3VpbnQzMl90CWFnZl9sZXZlbHNbWEZTX0JUTlVNX0FHRl07CS8qIGJ0cmVlIGxldmVscyAqLworCV9fdWludDMyX3QJYWdmX3NwYXJlMTsJLyogc3BhcmUgZmllbGQgKi8KKwlfX3VpbnQzMl90CWFnZl9mbGZpcnN0OwkvKiBmaXJzdCBmcmVlbGlzdCBibG9jaydzIGluZGV4ICovCisJX191aW50MzJfdAlhZ2ZfZmxsYXN0OwkvKiBsYXN0IGZyZWVsaXN0IGJsb2NrJ3MgaW5kZXggKi8KKwlfX3VpbnQzMl90CWFnZl9mbGNvdW50OwkvKiBjb3VudCBvZiBibG9ja3MgaW4gZnJlZWxpc3QgKi8KKwl4ZnNfZXh0bGVuX3QJYWdmX2ZyZWVibGtzOwkvKiB0b3RhbCBmcmVlIGJsb2NrcyAqLworCXhmc19leHRsZW5fdAlhZ2ZfbG9uZ2VzdDsJLyogbG9uZ2VzdCBmcmVlIHNwYWNlICovCit9IHhmc19hZ2ZfdDsKKworI2RlZmluZQlYRlNfQUdGX01BR0lDTlVNCTB4MDAwMDAwMDEKKyNkZWZpbmUJWEZTX0FHRl9WRVJTSU9OTlVNCTB4MDAwMDAwMDIKKyNkZWZpbmUJWEZTX0FHRl9TRVFOTwkJMHgwMDAwMDAwNAorI2RlZmluZQlYRlNfQUdGX0xFTkdUSAkJMHgwMDAwMDAwOAorI2RlZmluZQlYRlNfQUdGX1JPT1RTCQkweDAwMDAwMDEwCisjZGVmaW5lCVhGU19BR0ZfTEVWRUxTCQkweDAwMDAwMDIwCisjZGVmaW5lCVhGU19BR0ZfRkxGSVJTVAkJMHgwMDAwMDA0MAorI2RlZmluZQlYRlNfQUdGX0ZMTEFTVAkJMHgwMDAwMDA4MAorI2RlZmluZQlYRlNfQUdGX0ZMQ09VTlQJCTB4MDAwMDAxMDAKKyNkZWZpbmUJWEZTX0FHRl9GUkVFQkxLUwkweDAwMDAwMjAwCisjZGVmaW5lCVhGU19BR0ZfTE9OR0VTVAkJMHgwMDAwMDQwMAorI2RlZmluZQlYRlNfQUdGX05VTV9CSVRTCTExCisjZGVmaW5lCVhGU19BR0ZfQUxMX0JJVFMJKCgxIDw8IFhGU19BR0ZfTlVNX0JJVFMpIC0gMSkKKworLyogZGlzayBibG9jayAoeGZzX2RhZGRyX3QpIGluIHRoZSBBRyAqLworI2RlZmluZSBYRlNfQUdGX0RBRERSKG1wKQkoKHhmc19kYWRkcl90KSgxIDw8IChtcCktPm1fc2VjdGJiX2xvZykpCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BR0ZfQkxPQ0spCit4ZnNfYWdibG9ja190IHhmc19hZ2ZfYmxvY2soc3RydWN0IHhmc19tb3VudCAqbXApOworI2RlZmluZQlYRlNfQUdGX0JMT0NLKG1wKQl4ZnNfYWdmX2Jsb2NrKG1wKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0FHRl9CTE9DSyhtcCkJWEZTX0hEUl9CTE9DSyhtcCwgWEZTX0FHRl9EQUREUihtcCkpCisjZW5kaWYKKworLyoKKyAqIFNpemUgb2YgdGhlIHVubGlua2VkIGlub2RlIGhhc2ggdGFibGUgaW4gdGhlIGFnaS4KKyAqLworI2RlZmluZQlYRlNfQUdJX1VOTElOS0VEX0JVQ0tFVFMJNjQKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2FnaQoreworCS8qCisJICogQ29tbW9uIGFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyIGluZm9ybWF0aW9uCisJICovCisJX191aW50MzJfdAlhZ2lfbWFnaWNudW07CS8qIG1hZ2ljIG51bWJlciA9PSBYRlNfQUdJX01BR0lDICovCisJX191aW50MzJfdAlhZ2lfdmVyc2lvbm51bTsJLyogaGVhZGVyIHZlcnNpb24gPT0gWEZTX0FHSV9WRVJTSU9OICovCisJeGZzX2FnbnVtYmVyX3QJYWdpX3NlcW5vOwkvKiBzZXF1ZW5jZSAjIHN0YXJ0aW5nIGZyb20gMCAqLworCXhmc19hZ2Jsb2NrX3QJYWdpX2xlbmd0aDsJLyogc2l6ZSBpbiBibG9ja3Mgb2YgYS5nLiAqLworCS8qCisJICogSW5vZGUgaW5mb3JtYXRpb24KKwkgKiBJbm9kZXMgYXJlIG1hcHBlZCBieSBpbnRlcnByZXRpbmcgdGhlIGlub2RlIG51bWJlciwgc28gbm8KKwkgKiBtYXBwaW5nIGRhdGEgaXMgbmVlZGVkIGhlcmUuCisJICovCisJeGZzX2FnaW5vX3QJYWdpX2NvdW50OwkvKiBjb3VudCBvZiBhbGxvY2F0ZWQgaW5vZGVzICovCisJeGZzX2FnYmxvY2tfdAlhZ2lfcm9vdDsJLyogcm9vdCBvZiBpbm9kZSBidHJlZSAqLworCV9fdWludDMyX3QJYWdpX2xldmVsOwkvKiBsZXZlbHMgaW4gaW5vZGUgYnRyZWUgKi8KKwl4ZnNfYWdpbm9fdAlhZ2lfZnJlZWNvdW50OwkvKiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgKi8KKwl4ZnNfYWdpbm9fdAlhZ2lfbmV3aW5vOwkvKiBuZXcgaW5vZGUganVzdCBhbGxvY2F0ZWQgKi8KKwl4ZnNfYWdpbm9fdAlhZ2lfZGlyaW5vOwkvKiBsYXN0IGRpcmVjdG9yeSBpbm9kZSBjaHVuayAqLworCS8qCisJICogSGFzaCB0YWJsZSBvZiBpbm9kZXMgd2hpY2ggaGF2ZSBiZWVuIHVubGlua2VkIGJ1dCBhcmUKKwkgKiBzdGlsbCBiZWluZyByZWZlcmVuY2VkLgorCSAqLworCXhmc19hZ2lub190CWFnaV91bmxpbmtlZFtYRlNfQUdJX1VOTElOS0VEX0JVQ0tFVFNdOworfSB4ZnNfYWdpX3Q7CisKKyNkZWZpbmUJWEZTX0FHSV9NQUdJQ05VTQkweDAwMDAwMDAxCisjZGVmaW5lCVhGU19BR0lfVkVSU0lPTk5VTQkweDAwMDAwMDAyCisjZGVmaW5lCVhGU19BR0lfU0VRTk8JCTB4MDAwMDAwMDQKKyNkZWZpbmUJWEZTX0FHSV9MRU5HVEgJCTB4MDAwMDAwMDgKKyNkZWZpbmUJWEZTX0FHSV9DT1VOVAkJMHgwMDAwMDAxMAorI2RlZmluZQlYRlNfQUdJX1JPT1QJCTB4MDAwMDAwMjAKKyNkZWZpbmUJWEZTX0FHSV9MRVZFTAkJMHgwMDAwMDA0MAorI2RlZmluZQlYRlNfQUdJX0ZSRUVDT1VOVAkweDAwMDAwMDgwCisjZGVmaW5lCVhGU19BR0lfTkVXSU5PCQkweDAwMDAwMTAwCisjZGVmaW5lCVhGU19BR0lfRElSSU5PCQkweDAwMDAwMjAwCisjZGVmaW5lCVhGU19BR0lfVU5MSU5LRUQJMHgwMDAwMDQwMAorI2RlZmluZQlYRlNfQUdJX05VTV9CSVRTCTExCisjZGVmaW5lCVhGU19BR0lfQUxMX0JJVFMJKCgxIDw8IFhGU19BR0lfTlVNX0JJVFMpIC0gMSkKKworLyogZGlzayBibG9jayAoeGZzX2RhZGRyX3QpIGluIHRoZSBBRyAqLworI2RlZmluZSBYRlNfQUdJX0RBRERSKG1wKQkoKHhmc19kYWRkcl90KSgyIDw8IChtcCktPm1fc2VjdGJiX2xvZykpCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BR0lfQkxPQ0spCit4ZnNfYWdibG9ja190IHhmc19hZ2lfYmxvY2soc3RydWN0IHhmc19tb3VudCAqbXApOworI2RlZmluZQlYRlNfQUdJX0JMT0NLKG1wKQl4ZnNfYWdpX2Jsb2NrKG1wKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0FHSV9CTE9DSyhtcCkJWEZTX0hEUl9CTE9DSyhtcCwgWEZTX0FHSV9EQUREUihtcCkpCisjZW5kaWYKKworLyoKKyAqIFRoZSB0aGlyZCBhLmcuIGJsb2NrIGNvbnRhaW5zIHRoZSBhLmcuIGZyZWVsaXN0LCBhbiBhcnJheQorICogb2YgYmxvY2sgcG9pbnRlcnMgdG8gYmxvY2tzIG93bmVkIGJ5IHRoZSBhbGxvY2F0aW9uIGJ0cmVlIGNvZGUuCisgKi8KKyNkZWZpbmUgWEZTX0FHRkxfREFERFIobXApCSgoeGZzX2RhZGRyX3QpKDMgPDwgKG1wKS0+bV9zZWN0YmJfbG9nKSkKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FHRkxfQkxPQ0spCit4ZnNfYWdibG9ja190IHhmc19hZ2ZsX2Jsb2NrKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX0FHRkxfQkxPQ0sobXApCXhmc19hZ2ZsX2Jsb2NrKG1wKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0FHRkxfQkxPQ0sobXApCVhGU19IRFJfQkxPQ0sobXAsIFhGU19BR0ZMX0RBRERSKG1wKSkKKyNlbmRpZgorI2RlZmluZSBYRlNfQUdGTF9TSVpFKG1wKQkoKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSAvIHNpemVvZih4ZnNfYWdibG9ja190KSkKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2FnZmwgeworCXhmc19hZ2Jsb2NrX3QJYWdmbF9ibm9bMV07CS8qIGFjdHVhbGx5IFhGU19BR0ZMX1NJWkUobXApICovCit9IHhmc19hZ2ZsX3Q7CisKKy8qCisgKiBCdXN5IGJsb2NrL2V4dGVudCBlbnRyeS4gIFVzZWQgaW4gcGVyYWcgdG8gbWFyayBibG9ja3MgdGhhdCBoYXZlIGJlZW4gZnJlZWQKKyAqIGJ1dCB3aG9zZSB0cmFuc2FjdGlvbnMgYXJlbid0IGNvbW1pdHRlZCB0byBkaXNrIHlldC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX3BlcmFnX2J1c3kgeworCXhmc19hZ2Jsb2NrX3QJYnVzeV9zdGFydDsKKwl4ZnNfZXh0bGVuX3QJYnVzeV9sZW5ndGg7CisJc3RydWN0IHhmc190cmFucyAqYnVzeV90cDsJLyogdHJhbnNhY3Rpb24gdGhhdCBkaWQgdGhlIGZyZWUgKi8KK30geGZzX3BlcmFnX2J1c3lfdDsKKworLyoKKyAqIFBlci1hZyBpbmNvcmUgc3RydWN0dXJlLCBjb3BpZXMgb2YgaW5mb3JtYXRpb24gaW4gYWdmIGFuZCBhZ2ksCisgKiB0byBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiBhbGxvY2F0aW9uIGdyb3VwIHNlbGVjdGlvbi4KKyAqCisgKiBwaWNrIHNpemVzIHdoaWNoIGZpdCBpbiBhbGxvY2F0aW9uIGJ1Y2tldHMgd2VsbAorICovCisjaWYgKEJJVFNfUEVSX0xPTkcgPT0gMzIpCisjZGVmaW5lIFhGU19QQUdCX05VTV9TTE9UUwk4NAorI2VsaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQpCisjZGVmaW5lIFhGU19QQUdCX05VTV9TTE9UUwkxMjgKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB4ZnNfcGVyYWcKK3sKKwljaGFyCQlwYWdmX2luaXQ7CS8qIHRoaXMgYWdmJ3MgZW50cnkgaXMgaW5pdGlhbGl6ZWQgKi8KKwljaGFyCQlwYWdpX2luaXQ7CS8qIHRoaXMgYWdpJ3MgZW50cnkgaXMgaW5pdGlhbGl6ZWQgKi8KKwljaGFyCQlwYWdmX21ldGFkYXRhOwkvKiB0aGUgYWdmIGlzIHByZWZlcmVkIHRvIGJlIG1ldGFkYXRhICovCisJY2hhcgkJcGFnaV9pbm9kZW9rOwkvKiBUaGUgYWdpIGlzIG9rIGZvciBpbm9kZXMgKi8KKwlfX3VpbnQ4X3QJcGFnZl9sZXZlbHNbWEZTX0JUTlVNX0FHRl07CisJCQkJCS8qICMgb2YgbGV2ZWxzIGluIGJubyAmIGNudCBidHJlZSAqLworCV9fdWludDMyX3QJcGFnZl9mbGNvdW50OwkvKiBjb3VudCBvZiBibG9ja3MgaW4gZnJlZWxpc3QgKi8KKwl4ZnNfZXh0bGVuX3QJcGFnZl9mcmVlYmxrczsJLyogdG90YWwgZnJlZSBibG9ja3MgKi8KKwl4ZnNfZXh0bGVuX3QJcGFnZl9sb25nZXN0OwkvKiBsb25nZXN0IGZyZWUgc3BhY2UgKi8KKwl4ZnNfYWdpbm9fdAlwYWdpX2ZyZWVjb3VudDsJLyogbnVtYmVyIG9mIGZyZWUgaW5vZGVzICovCisjaWZkZWYgX19LRVJORUxfXworCWxvY2tfdAkJcGFnYl9sb2NrOwkvKiBsb2NrIGZvciBwYWdiX2xpc3QgKi8KKyNlbmRpZgorCWludAkJcGFnYl9jb3VudDsJLyogcGFnYiBzbG90cyBpbiB1c2UgKi8KKwl4ZnNfcGVyYWdfYnVzeV90ICpwYWdiX2xpc3Q7CS8qIHVuc3RhYmxlIGJsb2NrcyAqLworfSB4ZnNfcGVyYWdfdDsKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUdfTUFYTEVWRUxTKQoraW50IHhmc19hZ19tYXhsZXZlbHMoc3RydWN0IHhmc19tb3VudCAqbXApOworI2RlZmluZQlYRlNfQUdfTUFYTEVWRUxTKG1wKQkJeGZzX2FnX21heGxldmVscyhtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19BR19NQVhMRVZFTFMobXApCSgobXApLT5tX2FnX21heGxldmVscykKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTUlOX0ZSRUVMSVNUKQoraW50IHhmc19taW5fZnJlZWxpc3QoeGZzX2FnZl90ICphLCBzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19NSU5fRlJFRUxJU1QoYSxtcCkJCXhmc19taW5fZnJlZWxpc3QoYSxtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19NSU5fRlJFRUxJU1QoYSxtcCkJXAorCVhGU19NSU5fRlJFRUxJU1RfUkFXKAlcCisJCUlOVF9HRVQoKGEpLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9CTk9pXSwgQVJDSF9DT05WRVJUKSwgXAorCQlJTlRfR0VUKChhKS0+YWdmX2xldmVsc1tYRlNfQlROVU1fQ05UaV0sIEFSQ0hfQ09OVkVSVCksIG1wKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19NSU5fRlJFRUxJU1RfUEFHKQoraW50IHhmc19taW5fZnJlZWxpc3RfcGFnKHhmc19wZXJhZ190ICpwYWcsIHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX01JTl9GUkVFTElTVF9QQUcocGFnLG1wKQl4ZnNfbWluX2ZyZWVsaXN0X3BhZyhwYWcsbXApCisjZWxzZQorI2RlZmluZQlYRlNfTUlOX0ZSRUVMSVNUX1BBRyhwYWcsbXApCVwKKwlYRlNfTUlOX0ZSRUVMSVNUX1JBVygodWludF90KShwYWcpLT5wYWdmX2xldmVsc1tYRlNfQlROVU1fQk5PaV0sIFwKKwkJCSAgICAgKHVpbnRfdCkocGFnKS0+cGFnZl9sZXZlbHNbWEZTX0JUTlVNX0NOVGldLCBtcCkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTUlOX0ZSRUVMSVNUX1JBVykKK2ludCB4ZnNfbWluX2ZyZWVsaXN0X3JhdyhpbnQgYmwsIGludCBjbCwgc3RydWN0IHhmc19tb3VudCAqbXApOworI2RlZmluZQlYRlNfTUlOX0ZSRUVMSVNUX1JBVyhibCxjbCxtcCkJeGZzX21pbl9mcmVlbGlzdF9yYXcoYmwsY2wsbXApCisjZWxzZQorI2RlZmluZQlYRlNfTUlOX0ZSRUVMSVNUX1JBVyhibCxjbCxtcCkJXAorCShNSU4oYmwgKyAxLCBYRlNfQUdfTUFYTEVWRUxTKG1wKSkgKyBcCisJIE1JTihjbCArIDEsIFhGU19BR19NQVhMRVZFTFMobXApKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BR0JfVE9fRlNCKQoreGZzX2ZzYmxvY2tfdCB4ZnNfYWdiX3RvX2ZzYihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2FnbnVtYmVyX3QgYWdubywKKwkJCSAgICAgeGZzX2FnYmxvY2tfdCBhZ2Jubyk7CisjZGVmaW5lIFhGU19BR0JfVE9fRlNCKG1wLGFnbm8sYWdibm8pCXhmc19hZ2JfdG9fZnNiKG1wLGFnbm8sYWdibm8pCisjZWxzZQorI2RlZmluZQlYRlNfQUdCX1RPX0ZTQihtcCxhZ25vLGFnYm5vKSBcCisJKCgoeGZzX2ZzYmxvY2tfdCkoYWdubykgPDwgKG1wKS0+bV9zYi5zYl9hZ2Jsa2xvZykgfCAoYWdibm8pKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19GU0JfVE9fQUdOTykKK3hmc19hZ251bWJlcl90IHhmc19mc2JfdG9fYWdubyhzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2ZzYmxvY2tfdCBmc2Jubyk7CisjZGVmaW5lCVhGU19GU0JfVE9fQUdOTyhtcCxmc2JubykJeGZzX2ZzYl90b19hZ25vKG1wLGZzYm5vKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0ZTQl9UT19BR05PKG1wLGZzYm5vKSBcCisJKCh4ZnNfYWdudW1iZXJfdCkoKGZzYm5vKSA+PiAobXApLT5tX3NiLnNiX2FnYmxrbG9nKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRlNCX1RPX0FHQk5PKQoreGZzX2FnYmxvY2tfdCB4ZnNfZnNiX3RvX2FnYm5vKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZnNibG9ja190IGZzYm5vKTsKKyNkZWZpbmUJWEZTX0ZTQl9UT19BR0JOTyhtcCxmc2JubykJeGZzX2ZzYl90b19hZ2JubyhtcCxmc2JubykKKyNlbHNlCisjZGVmaW5lCVhGU19GU0JfVE9fQUdCTk8obXAsZnNibm8pIFwKKwkoKHhmc19hZ2Jsb2NrX3QpKChmc2JubykgJiBYRlNfTUFTSzMyTE8oKG1wKS0+bV9zYi5zYl9hZ2Jsa2xvZykpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FHQl9UT19EQUREUikKK3hmc19kYWRkcl90IHhmc19hZ2JfdG9fZGFkZHIoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19hZ251bWJlcl90IGFnbm8sCisJCQkJeGZzX2FnYmxvY2tfdCBhZ2Jubyk7CisjZGVmaW5lCVhGU19BR0JfVE9fREFERFIobXAsYWdubyxhZ2JubykJeGZzX2FnYl90b19kYWRkcihtcCxhZ25vLGFnYm5vKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0FHQl9UT19EQUREUihtcCxhZ25vLGFnYm5vKSBcCisJKCh4ZnNfZGFkZHJfdCkoWEZTX0ZTQl9UT19CQihtcCwgXAorCQkoeGZzX2ZzYmxvY2tfdCkoYWdubykgKiAobXApLT5tX3NiLnNiX2FnYmxvY2tzICsgKGFnYm5vKSkpKQorI2VuZGlmCisvKgorICogWEZTX0RBRERSX1RPX0FHTk8gYW5kIFhGU19EQUREUl9UT19BR0JOTyBtb3ZlZCB0byB4ZnNfbW91bnQuaAorICogdG8gYXZvaWQgaGVhZGVyIGZpbGUgb3JkZXJpbmcgY2hhbmdlCisgKi8KKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUdfREFERFIpCit4ZnNfZGFkZHJfdCB4ZnNfYWdfZGFkZHIoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19hZ251bWJlcl90IGFnbm8sCisJCQkJeGZzX2RhZGRyX3QgZCk7CisjZGVmaW5lCVhGU19BR19EQUREUihtcCxhZ25vLGQpCQl4ZnNfYWdfZGFkZHIobXAsYWdubyxkKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0FHX0RBRERSKG1wLGFnbm8sZCkJKFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIDApICsgKGQpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JVRl9UT19BR0YpCit4ZnNfYWdmX3QgKnhmc19idWZfdG9fYWdmKHN0cnVjdCB4ZnNfYnVmICpicCk7CisjZGVmaW5lCVhGU19CVUZfVE9fQUdGKGJwKQkJeGZzX2J1Zl90b19hZ2YoYnApCisjZWxzZQorI2RlZmluZQlYRlNfQlVGX1RPX0FHRihicCkJKCh4ZnNfYWdmX3QgKilYRlNfQlVGX1BUUihicCkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JVRl9UT19BR0kpCit4ZnNfYWdpX3QgKnhmc19idWZfdG9fYWdpKHN0cnVjdCB4ZnNfYnVmICpicCk7CisjZGVmaW5lCVhGU19CVUZfVE9fQUdJKGJwKQkJeGZzX2J1Zl90b19hZ2koYnApCisjZWxzZQorI2RlZmluZQlYRlNfQlVGX1RPX0FHSShicCkJKCh4ZnNfYWdpX3QgKilYRlNfQlVGX1BUUihicCkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JVRl9UT19BR0ZMKQoreGZzX2FnZmxfdCAqeGZzX2J1Zl90b19hZ2ZsKHN0cnVjdCB4ZnNfYnVmICpicCk7CisjZGVmaW5lCVhGU19CVUZfVE9fQUdGTChicCkJCXhmc19idWZfdG9fYWdmbChicCkKKyNlbHNlCisjZGVmaW5lCVhGU19CVUZfVE9fQUdGTChicCkJKCh4ZnNfYWdmbF90ICopWEZTX0JVRl9QVFIoYnApKQorI2VuZGlmCisKKy8qCisgKiBGb3IgY2hlY2tpbmcgZm9yIGJhZCByYW5nZXMgb2YgeGZzX2RhZGRyX3QncywgY292ZXJpbmcgbXVsdGlwbGUKKyAqIGFsbG9jYXRpb24gZ3JvdXBzIG9yIGEgc2luZ2xlIHhmc19kYWRkcl90IHRoYXQncyBhIHN1cGVyYmxvY2sgY29weS4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUdfQ0hFQ0tfREFERFIpCit2b2lkIHhmc19hZ19jaGVja19kYWRkcihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RhZGRyX3QgZCwgeGZzX2V4dGxlbl90IGxlbik7CisjZGVmaW5lCVhGU19BR19DSEVDS19EQUREUihtcCxkLGxlbikJeGZzX2FnX2NoZWNrX2RhZGRyKG1wLGQsbGVuKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0FHX0NIRUNLX0RBRERSKG1wLGQsbGVuKQlcCisJKChsZW4pID09IDEgPyBcCisJICAgIEFTU0VSVCgoZCkgPT0gWEZTX1NCX0RBRERSIHx8IFwKKwkJICAgWEZTX0RBRERSX1RPX0FHQk5PKG1wLCBkKSAhPSBYRlNfU0JfREFERFIpIDogXAorCSAgICBBU1NFUlQoWEZTX0RBRERSX1RPX0FHTk8obXAsIGQpID09IFwKKwkJICAgWEZTX0RBRERSX1RPX0FHTk8obXAsIChkKSArIChsZW4pIC0gMSkpKQorI2VuZGlmCisKKyNlbmRpZgkvKiBfX1hGU19BR19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYWxsb2MuYyBiL2ZzL3hmcy94ZnNfYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjYwM2RiCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19hbGxvYy5jCkBAIC0wLDAgKzEsMjYyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworLyoKKyAqIEZyZWUgc3BhY2UgYWxsb2NhdGlvbiBmb3IgWEZTLgorICovCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorCisKKyNkZWZpbmUgWEZTX0FCU0RJRkYoYSxiKQkoKChhKSA8PSAoYikpID8gKChiKSAtIChhKSkgOiAoKGEpIC0gKGIpKSkKKworI2RlZmluZQlYRlNBX0ZJWFVQX0JOT19PSwkxCisjZGVmaW5lCVhGU0FfRklYVVBfQ05UX09LCTIKKworaW50Cit4ZnNfYWxsb2Nfc2VhcmNoX2J1c3koeGZzX3RyYW5zX3QgKnRwLAorCQkgICAgeGZzX2FnbnVtYmVyX3QgYWdubywKKwkJICAgIHhmc19hZ2Jsb2NrX3QgYm5vLAorCQkgICAgeGZzX2V4dGxlbl90IGxlbik7CisKKyNpZiBkZWZpbmVkKFhGU19BTExPQ19UUkFDRSkKK2t0cmFjZV90ICp4ZnNfYWxsb2NfdHJhY2VfYnVmOworCisjZGVmaW5lCVRSQUNFX0FMTE9DKHMsYSkJXAorCXhmc19hbGxvY190cmFjZV9hbGxvYyhmbmFtZSwgcywgYSwgX19MSU5FX18pCisjZGVmaW5lCVRSQUNFX0ZSRUUocyxhLGIseCxmKQlcCisJeGZzX2FsbG9jX3RyYWNlX2ZyZWUoZm5hbWUsIHMsIG1wLCBhLCBiLCB4LCBmLCBfX0xJTkVfXykKKyNkZWZpbmUJVFJBQ0VfTU9EQUdGKHMsYSxmKQlcCisJeGZzX2FsbG9jX3RyYWNlX21vZGFnZihmbmFtZSwgcywgbXAsIGEsIGYsIF9fTElORV9fKQorI2RlZmluZQlUUkFDRV9CVVNZKGZuYW1lLHMsYWcsYWdiLGwsc2wsdHApCVwKKwl4ZnNfYWxsb2NfdHJhY2VfYnVzeShmbmFtZSwgcywgbXAsIGFnLCBhZ2IsIGwsIHNsLCB0cCwgWEZTX0FMTE9DX0tUUkFDRV9CVVNZLCBfX0xJTkVfXykKKyNkZWZpbmUJVFJBQ0VfVU5CVVNZKGZuYW1lLHMsYWcsc2wsdHApCVwKKwl4ZnNfYWxsb2NfdHJhY2VfYnVzeShmbmFtZSwgcywgbXAsIGFnLCAtMSwgLTEsIHNsLCB0cCwgWEZTX0FMTE9DX0tUUkFDRV9VTkJVU1ksIF9fTElORV9fKQorI2RlZmluZQlUUkFDRV9CVVNZU0VBUkNIKGZuYW1lLHMsYWcsYWdiLGwsc2wsdHApCVwKKwl4ZnNfYWxsb2NfdHJhY2VfYnVzeShmbmFtZSwgcywgbXAsIGFnLCBhZ2IsIGwsIHNsLCB0cCwgWEZTX0FMTE9DX0tUUkFDRV9CVVNZU0VBUkNILCBfX0xJTkVfXykKKyNlbHNlCisjZGVmaW5lCVRSQUNFX0FMTE9DKHMsYSkKKyNkZWZpbmUJVFJBQ0VfRlJFRShzLGEsYix4LGYpCisjZGVmaW5lCVRSQUNFX01PREFHRihzLGEsZikKKyNkZWZpbmUJVFJBQ0VfQlVTWShzLGEsYWcsYWdiLGwsc2wsdHApCisjZGVmaW5lCVRSQUNFX1VOQlVTWShmbmFtZSxzLGFnLHNsLHRwKQorI2RlZmluZQlUUkFDRV9CVVNZU0VBUkNIKGZuYW1lLHMsYWcsYWdiLGwsc2wsdHApCisjZW5kaWYJLyogWEZTX0FMTE9DX1RSQUNFICovCisKKy8qCisgKiBQcm90b3R5cGVzIGZvciBwZXItYWcgYWxsb2NhdGlvbiByb3V0aW5lcworICovCisKK1NUQVRJQyBpbnQgeGZzX2FsbG9jX2FnX3ZleHRlbnRfZXhhY3QoeGZzX2FsbG9jX2FyZ190ICopOworU1RBVElDIGludCB4ZnNfYWxsb2NfYWdfdmV4dGVudF9uZWFyKHhmc19hbGxvY19hcmdfdCAqKTsKK1NUQVRJQyBpbnQgeGZzX2FsbG9jX2FnX3ZleHRlbnRfc2l6ZSh4ZnNfYWxsb2NfYXJnX3QgKik7CitTVEFUSUMgaW50IHhmc19hbGxvY19hZ192ZXh0ZW50X3NtYWxsKHhmc19hbGxvY19hcmdfdCAqLAorCXhmc19idHJlZV9jdXJfdCAqLCB4ZnNfYWdibG9ja190ICosIHhmc19leHRsZW5fdCAqLCBpbnQgKik7CisKKy8qCisgKiBJbnRlcm5hbCBmdW5jdGlvbnMuCisgKi8KKworLyoKKyAqIENvbXB1dGUgYWxpZ25lZCB2ZXJzaW9uIG9mIHRoZSBmb3VuZCBleHRlbnQuCisgKiBUYWtlcyBhbGlnbm1lbnQgYW5kIG1pbiBsZW5ndGggaW50byBhY2NvdW50LgorICovCitTVEFUSUMgaW50CQkJCS8qIHN1Y2Nlc3MgKD49IG1pbmxlbikgKi8KK3hmc19hbGxvY19jb21wdXRlX2FsaWduZWQoCisJeGZzX2FnYmxvY2tfdAlmb3VuZGJubywJLyogc3RhcnRpbmcgYmxvY2sgaW4gZm91bmQgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CWZvdW5kbGVuLAkvKiBsZW5ndGggaW4gZm91bmQgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CWFsaWdubWVudCwJLyogYWxpZ25tZW50IGZvciBhbGxvY2F0aW9uICovCisJeGZzX2V4dGxlbl90CW1pbmxlbiwJCS8qIG1pbmltdW0gbGVuZ3RoIGZvciBhbGxvY2F0aW9uICovCisJeGZzX2FnYmxvY2tfdAkqcmVzYm5vLAkvKiByZXN1bHQgYmxvY2sgbnVtYmVyICovCisJeGZzX2V4dGxlbl90CSpyZXNsZW4pCS8qIHJlc3VsdCBsZW5ndGggKi8KK3sKKwl4ZnNfYWdibG9ja190CWJubzsKKwl4ZnNfZXh0bGVuX3QJZGlmZjsKKwl4ZnNfZXh0bGVuX3QJbGVuOworCisJaWYgKGFsaWdubWVudCA+IDEgJiYgZm91bmRsZW4gPj0gbWlubGVuKSB7CisJCWJubyA9IHJvdW5kdXAoZm91bmRibm8sIGFsaWdubWVudCk7CisJCWRpZmYgPSBibm8gLSBmb3VuZGJubzsKKwkJbGVuID0gZGlmZiA+PSBmb3VuZGxlbiA/IDAgOiBmb3VuZGxlbiAtIGRpZmY7CisJfSBlbHNlIHsKKwkJYm5vID0gZm91bmRibm87CisJCWxlbiA9IGZvdW5kbGVuOworCX0KKwkqcmVzYm5vID0gYm5vOworCSpyZXNsZW4gPSBsZW47CisJcmV0dXJuIGxlbiA+PSBtaW5sZW47Cit9CisKKy8qCisgKiBDb21wdXRlIGJlc3Qgc3RhcnQgYmxvY2sgYW5kIGRpZmYgZm9yICJuZWFyIiBhbGxvY2F0aW9ucy4KKyAqIGZyZWVsZW4gPj0gd2FudGxlbiBhbHJlYWR5IGNoZWNrZWQgYnkgY2FsbGVyLgorICovCitTVEFUSUMgeGZzX2V4dGxlbl90CQkJLyogZGlmZmVyZW5jZSB2YWx1ZSAoYWJzb2x1dGUpICovCit4ZnNfYWxsb2NfY29tcHV0ZV9kaWZmKAorCXhmc19hZ2Jsb2NrX3QJd2FudGJubywJLyogdGFyZ2V0IHN0YXJ0aW5nIGJsb2NrICovCisJeGZzX2V4dGxlbl90CXdhbnRsZW4sCS8qIHRhcmdldCBsZW5ndGggKi8KKwl4ZnNfZXh0bGVuX3QJYWxpZ25tZW50LAkvKiB0YXJnZXQgYWxpZ25tZW50ICovCisJeGZzX2FnYmxvY2tfdAlmcmVlYm5vLAkvKiBmcmVlc3BhY2UncyBzdGFydGluZyBibG9jayAqLworCXhmc19leHRsZW5fdAlmcmVlbGVuLAkvKiBmcmVlc3BhY2UncyBsZW5ndGggKi8KKwl4ZnNfYWdibG9ja190CSpuZXdibm9wKQkvKiByZXN1bHQ6IGJlc3Qgc3RhcnQgYmxvY2sgZnJvbSBmcmVlICovCit7CisJeGZzX2FnYmxvY2tfdAlmcmVlZW5kOwkvKiBlbmQgb2YgZnJlZXNwYWNlIGV4dGVudCAqLworCXhmc19hZ2Jsb2NrX3QJbmV3Ym5vMTsJLyogcmV0dXJuIGJsb2NrIG51bWJlciAqLworCXhmc19hZ2Jsb2NrX3QJbmV3Ym5vMjsJLyogb3RoZXIgbmV3IGJsb2NrIG51bWJlciAqLworCXhmc19leHRsZW5fdAluZXdsZW4xPTA7CS8qIGxlbmd0aCB3aXRoIG5ld2JubzEgKi8KKwl4ZnNfZXh0bGVuX3QJbmV3bGVuMj0wOwkvKiBsZW5ndGggd2l0aCBuZXdibm8yICovCisJeGZzX2FnYmxvY2tfdAl3YW50ZW5kOwkvKiBlbmQgb2YgdGFyZ2V0IGV4dGVudCAqLworCisJQVNTRVJUKGZyZWVsZW4gPj0gd2FudGxlbik7CisJZnJlZWVuZCA9IGZyZWVibm8gKyBmcmVlbGVuOworCXdhbnRlbmQgPSB3YW50Ym5vICsgd2FudGxlbjsKKwlpZiAoZnJlZWJubyA+PSB3YW50Ym5vKSB7CisJCWlmICgobmV3Ym5vMSA9IHJvdW5kdXAoZnJlZWJubywgYWxpZ25tZW50KSkgPj0gZnJlZWVuZCkKKwkJCW5ld2JubzEgPSBOVUxMQUdCTE9DSzsKKwl9IGVsc2UgaWYgKGZyZWVlbmQgPj0gd2FudGVuZCAmJiBhbGlnbm1lbnQgPiAxKSB7CisJCW5ld2JubzEgPSByb3VuZHVwKHdhbnRibm8sIGFsaWdubWVudCk7CisJCW5ld2JubzIgPSBuZXdibm8xIC0gYWxpZ25tZW50OworCQlpZiAobmV3Ym5vMSA+PSBmcmVlZW5kKQorCQkJbmV3Ym5vMSA9IE5VTExBR0JMT0NLOworCQllbHNlCisJCQluZXdsZW4xID0gWEZTX0VYVExFTl9NSU4od2FudGxlbiwgZnJlZWVuZCAtIG5ld2JubzEpOworCQlpZiAobmV3Ym5vMiA8IGZyZWVibm8pCisJCQluZXdibm8yID0gTlVMTEFHQkxPQ0s7CisJCWVsc2UKKwkJCW5ld2xlbjIgPSBYRlNfRVhUTEVOX01JTih3YW50bGVuLCBmcmVlZW5kIC0gbmV3Ym5vMik7CisJCWlmIChuZXdibm8xICE9IE5VTExBR0JMT0NLICYmIG5ld2JubzIgIT0gTlVMTEFHQkxPQ0spIHsKKwkJCWlmIChuZXdsZW4xIDwgbmV3bGVuMiB8fAorCQkJICAgIChuZXdsZW4xID09IG5ld2xlbjIgJiYKKwkJCSAgICAgWEZTX0FCU0RJRkYobmV3Ym5vMSwgd2FudGJubykgPgorCQkJICAgICBYRlNfQUJTRElGRihuZXdibm8yLCB3YW50Ym5vKSkpCisJCQkJbmV3Ym5vMSA9IG5ld2JubzI7CisJCX0gZWxzZSBpZiAobmV3Ym5vMiAhPSBOVUxMQUdCTE9DSykKKwkJCW5ld2JubzEgPSBuZXdibm8yOworCX0gZWxzZSBpZiAoZnJlZWVuZCA+PSB3YW50ZW5kKSB7CisJCW5ld2JubzEgPSB3YW50Ym5vOworCX0gZWxzZSBpZiAoYWxpZ25tZW50ID4gMSkgeworCQluZXdibm8xID0gcm91bmR1cChmcmVlZW5kIC0gd2FudGxlbiwgYWxpZ25tZW50KTsKKwkJaWYgKG5ld2JubzEgPiBmcmVlZW5kIC0gd2FudGxlbiAmJgorCQkgICAgbmV3Ym5vMSAtIGFsaWdubWVudCA+PSBmcmVlYm5vKQorCQkJbmV3Ym5vMSAtPSBhbGlnbm1lbnQ7CisJCWVsc2UgaWYgKG5ld2JubzEgPj0gZnJlZWVuZCkKKwkJCW5ld2JubzEgPSBOVUxMQUdCTE9DSzsKKwl9IGVsc2UKKwkJbmV3Ym5vMSA9IGZyZWVlbmQgLSB3YW50bGVuOworCSpuZXdibm9wID0gbmV3Ym5vMTsKKwlyZXR1cm4gbmV3Ym5vMSA9PSBOVUxMQUdCTE9DSyA/IDAgOiBYRlNfQUJTRElGRihuZXdibm8xLCB3YW50Ym5vKTsKK30KKworLyoKKyAqIEZpeCB1cCB0aGUgbGVuZ3RoLCBiYXNlZCBvbiBtb2QgYW5kIHByb2QuCisgKiBsZW4gc2hvdWxkIGJlIGsgKiBwcm9kICsgbW9kIGZvciBzb21lIGsuCisgKiBJZiBsZW4gaXMgdG9vIHNtYWxsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KKyAqIElmIGxlbiBoaXRzIG1heGxlbiBpdCBpcyBsZWZ0IGFsb25lLgorICovCitTVEFUSUMgdm9pZAoreGZzX2FsbG9jX2ZpeF9sZW4oCisJeGZzX2FsbG9jX2FyZ190CSphcmdzKQkJLyogYWxsb2NhdGlvbiBhcmd1bWVudCBzdHJ1Y3R1cmUgKi8KK3sKKwl4ZnNfZXh0bGVuX3QJazsKKwl4ZnNfZXh0bGVuX3QJcmxlbjsKKworCUFTU0VSVChhcmdzLT5tb2QgPCBhcmdzLT5wcm9kKTsKKwlybGVuID0gYXJncy0+bGVuOworCUFTU0VSVChybGVuID49IGFyZ3MtPm1pbmxlbik7CisJQVNTRVJUKHJsZW4gPD0gYXJncy0+bWF4bGVuKTsKKwlpZiAoYXJncy0+cHJvZCA8PSAxIHx8IHJsZW4gPCBhcmdzLT5tb2QgfHwgcmxlbiA9PSBhcmdzLT5tYXhsZW4gfHwKKwkgICAgKGFyZ3MtPm1vZCA9PSAwICYmIHJsZW4gPCBhcmdzLT5wcm9kKSkKKwkJcmV0dXJuOworCWsgPSBybGVuICUgYXJncy0+cHJvZDsKKwlpZiAoayA9PSBhcmdzLT5tb2QpCisJCXJldHVybjsKKwlpZiAoayA+IGFyZ3MtPm1vZCkgeworCQlpZiAoKGludCkocmxlbiA9IHJsZW4gLSBrIC0gYXJncy0+bW9kKSA8IChpbnQpYXJncy0+bWlubGVuKQorCQkJcmV0dXJuOworCX0gZWxzZSB7CisJCWlmICgoaW50KShybGVuID0gcmxlbiAtIGFyZ3MtPnByb2QgLSAoYXJncy0+bW9kIC0gaykpIDwKKwkJICAgIChpbnQpYXJncy0+bWlubGVuKQorCQkJcmV0dXJuOworCX0KKwlBU1NFUlQocmxlbiA+PSBhcmdzLT5taW5sZW4pOworCUFTU0VSVChybGVuIDw9IGFyZ3MtPm1heGxlbik7CisJYXJncy0+bGVuID0gcmxlbjsKK30KKworLyoKKyAqIEZpeCB1cCBsZW5ndGggaWYgdGhlcmUgaXMgdG9vIGxpdHRsZSBzcGFjZSBsZWZ0IGluIHRoZSBhLmcuCisgKiBSZXR1cm4gMSBpZiBvaywgMCBpZiB0b28gbGl0dGxlLCBzaG91bGQgZ2l2ZSB1cC4KKyAqLworU1RBVElDIGludAoreGZzX2FsbG9jX2ZpeF9taW5sZWZ0KAorCXhmc19hbGxvY19hcmdfdAkqYXJncykJCS8qIGFsbG9jYXRpb24gYXJndW1lbnQgc3RydWN0dXJlICovCit7CisJeGZzX2FnZl90CSphZ2Y7CQkvKiBhLmcuIGZyZWVsaXN0IGhlYWRlciAqLworCWludAkJZGlmZjsJCS8qIGZyZWUgc3BhY2UgZGlmZmVyZW5jZSAqLworCisJaWYgKGFyZ3MtPm1pbmxlZnQgPT0gMCkKKwkJcmV0dXJuIDE7CisJYWdmID0gWEZTX0JVRl9UT19BR0YoYXJncy0+YWdicCk7CisJZGlmZiA9IElOVF9HRVQoYWdmLT5hZ2ZfZnJlZWJsa3MsIEFSQ0hfQ09OVkVSVCkKKwkJKyBJTlRfR0VUKGFnZi0+YWdmX2ZsY291bnQsIEFSQ0hfQ09OVkVSVCkKKwkJLSBhcmdzLT5sZW4gLSBhcmdzLT5taW5sZWZ0OworCWlmIChkaWZmID49IDApCisJCXJldHVybiAxOworCWFyZ3MtPmxlbiArPSBkaWZmOwkJLyogc2hyaW5rIHRoZSBhbGxvY2F0ZWQgc3BhY2UgKi8KKwlpZiAoYXJncy0+bGVuID49IGFyZ3MtPm1pbmxlbikKKwkJcmV0dXJuIDE7CisJYXJncy0+YWdibm8gPSBOVUxMQUdCTE9DSzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFVwZGF0ZSB0aGUgdHdvIGJ0cmVlcywgbG9naWNhbGx5IHJlbW92aW5nIGZyb20gZnJlZXNwYWNlIHRoZSBleHRlbnQKKyAqIHN0YXJ0aW5nIGF0IHJibm8sIHJsZW4gYmxvY2tzLiAgVGhlIGV4dGVudCBpcyBjb250YWluZWQgd2l0aGluIHRoZQorICogYWN0dWFsIChjdXJyZW50KSBmcmVlIGV4dGVudCBmYm5vIGZvciBmbGVuIGJsb2Nrcy4KKyAqIEZsYWdzIGFyZSBwYXNzZWQgaW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjdXJzb3JzIGFyZSBzZXQgdG8gdGhlCisgKiByZWxldmFudCByZWNvcmRzLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yIGNvZGUgKi8KK3hmc19hbGxvY19maXh1cF90cmVlcygKKwl4ZnNfYnRyZWVfY3VyX3QJKmNudF9jdXIsCS8qIGN1cnNvciBmb3IgYnktc2l6ZSBidHJlZSAqLworCXhmc19idHJlZV9jdXJfdAkqYm5vX2N1ciwJLyogY3Vyc29yIGZvciBieS1ibG9jayBidHJlZSAqLworCXhmc19hZ2Jsb2NrX3QJZmJubywJCS8qIHN0YXJ0aW5nIGJsb2NrIG9mIGZyZWUgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CWZsZW4sCQkvKiBsZW5ndGggb2YgZnJlZSBleHRlbnQgKi8KKwl4ZnNfYWdibG9ja190CXJibm8sCQkvKiBzdGFydGluZyBibG9jayBvZiByZXR1cm5lZCBleHRlbnQgKi8KKwl4ZnNfZXh0bGVuX3QJcmxlbiwJCS8qIGxlbmd0aCBvZiByZXR1cm5lZCBleHRlbnQgKi8KKwlpbnQJCWZsYWdzKQkJLyogZmxhZ3MsIFhGU0FfRklYVVBfLi4uICovCit7CisJaW50CQllcnJvcjsJCS8qIGVycm9yIGNvZGUgKi8KKwlpbnQJCWk7CQkvKiBvcGVyYXRpb24gcmVzdWx0cyAqLworCXhmc19hZ2Jsb2NrX3QJbmZibm8xOwkJLyogZmlyc3QgbmV3IGZyZWUgc3RhcnRibG9jayAqLworCXhmc19hZ2Jsb2NrX3QJbmZibm8yOwkJLyogc2Vjb25kIG5ldyBmcmVlIHN0YXJ0YmxvY2sgKi8KKwl4ZnNfZXh0bGVuX3QJbmZsZW4xPTA7CS8qIGZpcnN0IG5ldyBmcmVlIGxlbmd0aCAqLworCXhmc19leHRsZW5fdAluZmxlbjI9MDsJLyogc2Vjb25kIG5ldyBmcmVlIGxlbmd0aCAqLworCisJLyoKKwkgKiBMb29rIHVwIHRoZSByZWNvcmQgaW4gdGhlIGJ5LXNpemUgdHJlZSBpZiBuZWNlc3NhcnkuCisJICovCisJaWYgKGZsYWdzICYgWEZTQV9GSVhVUF9DTlRfT0spIHsKKyNpZmRlZiBERUJVRworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2dldF9yZWMoY250X2N1ciwgJm5mYm5vMSwgJm5mbGVuMSwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTigKKwkJCWkgPT0gMSAmJiBuZmJubzEgPT0gZmJubyAmJiBuZmxlbjEgPT0gZmxlbik7CisjZW5kaWYKKwl9IGVsc2UgeworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2xvb2t1cF9lcShjbnRfY3VyLCBmYm5vLCBmbGVuLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKGkgPT0gMSk7CisJfQorCS8qCisJICogTG9vayB1cCB0aGUgcmVjb3JkIGluIHRoZSBieS1ibG9jayB0cmVlIGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwlpZiAoZmxhZ3MgJiBYRlNBX0ZJWFVQX0JOT19PSykgeworI2lmZGVmIERFQlVHCisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZ2V0X3JlYyhibm9fY3VyLCAmbmZibm8xLCAmbmZsZW4xLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKAorCQkJaSA9PSAxICYmIG5mYm5vMSA9PSBmYm5vICYmIG5mbGVuMSA9PSBmbGVuKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfbG9va3VwX2VxKGJub19jdXIsIGZibm8sIGZsZW4sICZpKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oaSA9PSAxKTsKKwl9CisjaWZkZWYgREVCVUcKKwl7CisJCXhmc19hbGxvY19ibG9ja190CSpibm9ibG9jazsKKwkJeGZzX2FsbG9jX2Jsb2NrX3QJKmNudGJsb2NrOworCisJCWlmIChibm9fY3VyLT5iY19ubGV2ZWxzID09IDEgJiYKKwkJICAgIGNudF9jdXItPmJjX25sZXZlbHMgPT0gMSkgeworCQkJYm5vYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGJub19jdXItPmJjX2J1ZnNbMF0pOworCQkJY250YmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGNudF9jdXItPmJjX2J1ZnNbMF0pOworCQkJWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTigKKwkJCQlJTlRfR0VUKGJub2Jsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID09IElOVF9HRVQoY250YmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCQl9CisJfQorI2VuZGlmCisJLyoKKwkgKiBEZWFsIHdpdGggYWxsIGZvdXIgY2FzZXM6IHRoZSBhbGxvY2F0ZWQgcmVjb3JkIGlzIGNvbnRhaW5lZAorCSAqIHdpdGhpbiB0aGUgZnJlZXNwYWNlIHJlY29yZCwgc28gd2UgY2FuIGhhdmUgbmV3IGZyZWVzcGFjZQorCSAqIGF0IGVpdGhlciAob3IgYm90aCkgZW5kLCBvciBubyBmcmVlc3BhY2UgcmVtYWluaW5nLgorCSAqLworCWlmIChyYm5vID09IGZibm8gJiYgcmxlbiA9PSBmbGVuKQorCQluZmJubzEgPSBuZmJubzIgPSBOVUxMQUdCTE9DSzsKKwllbHNlIGlmIChyYm5vID09IGZibm8pIHsKKwkJbmZibm8xID0gcmJubyArIHJsZW47CisJCW5mbGVuMSA9IGZsZW4gLSBybGVuOworCQluZmJubzIgPSBOVUxMQUdCTE9DSzsKKwl9IGVsc2UgaWYgKHJibm8gKyBybGVuID09IGZibm8gKyBmbGVuKSB7CisJCW5mYm5vMSA9IGZibm87CisJCW5mbGVuMSA9IGZsZW4gLSBybGVuOworCQluZmJubzIgPSBOVUxMQUdCTE9DSzsKKwl9IGVsc2UgeworCQluZmJubzEgPSBmYm5vOworCQluZmxlbjEgPSByYm5vIC0gZmJubzsKKwkJbmZibm8yID0gcmJubyArIHJsZW47CisJCW5mbGVuMiA9IChmYm5vICsgZmxlbikgLSBuZmJubzI7CisJfQorCS8qCisJICogRGVsZXRlIHRoZSBlbnRyeSBmcm9tIHRoZSBieS1zaXplIGJ0cmVlLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZGVsZXRlKGNudF9jdXIsICZpKSkpCisJCXJldHVybiBlcnJvcjsKKwlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKGkgPT0gMSk7CisJLyoKKwkgKiBBZGQgbmV3IGJ5LXNpemUgYnRyZWUgZW50cnkocykuCisJICovCisJaWYgKG5mYm5vMSAhPSBOVUxMQUdCTE9DSykgeworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2xvb2t1cF9lcShjbnRfY3VyLCBuZmJubzEsIG5mbGVuMSwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTihpID09IDApOworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2luc2VydChjbnRfY3VyLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKGkgPT0gMSk7CisJfQorCWlmIChuZmJubzIgIT0gTlVMTEFHQkxPQ0spIHsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19sb29rdXBfZXEoY250X2N1ciwgbmZibm8yLCBuZmxlbjIsICZpKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oaSA9PSAwKTsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19pbnNlcnQoY250X2N1ciwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTihpID09IDEpOworCX0KKwkvKgorCSAqIEZpeCB1cCB0aGUgYnktYmxvY2sgYnRyZWUgZW50cnkocykuCisJICovCisJaWYgKG5mYm5vMSA9PSBOVUxMQUdCTE9DSykgeworCQkvKgorCQkgKiBObyByZW1haW5pbmcgZnJlZXNwYWNlLCBqdXN0IGRlbGV0ZSB0aGUgYnktYmxvY2sgdHJlZSBlbnRyeS4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZGVsZXRlKGJub19jdXIsICZpKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oaSA9PSAxKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBVcGRhdGUgdGhlIGJ5LWJsb2NrIGVudHJ5IHRvIHN0YXJ0IGxhdGVyfGJlIHNob3J0ZXIuCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX3VwZGF0ZShibm9fY3VyLCBuZmJubzEsIG5mbGVuMSkpKQorCQkJcmV0dXJuIGVycm9yOworCX0KKwlpZiAobmZibm8yICE9IE5VTExBR0JMT0NLKSB7CisJCS8qCisJCSAqIDIgcmVzdWx0aW5nIGZyZWUgZW50cmllcywgbmVlZCB0byBhZGQgb25lLgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19sb29rdXBfZXEoYm5vX2N1ciwgbmZibm8yLCBuZmxlbjIsICZpKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oaSA9PSAwKTsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19pbnNlcnQoYm5vX2N1ciwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTihpID09IDEpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgaW4gdGhlIGFsbG9jYXRpb24gZ3JvdXAgZnJlZSBibG9jayBhcnJheS4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX3JlYWRfYWdmbCgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBtb3VudCBwb2ludCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2FnbnVtYmVyX3QJYWdubywJCS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCisJeGZzX2J1Zl90CSoqYnBwKQkJLyogYnVmZmVyIGZvciB0aGUgYWcgZnJlZSBibG9jayBhcnJheSAqLworeworCXhmc19idWZfdAkqYnA7CQkvKiByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCWVycm9yOworCisJQVNTRVJUKGFnbm8gIT0gTlVMTEFHTlVNQkVSKTsKKwllcnJvciA9IHhmc190cmFuc19yZWFkX2J1ZigKKwkJCW1wLCB0cCwgbXAtPm1fZGRldl90YXJncCwKKwkJCVhGU19BR19EQUREUihtcCwgYWdubywgWEZTX0FHRkxfREFERFIobXApKSwKKwkJCVhGU19GU1NfVE9fQkIobXAsIDEpLCAwLCAmYnApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCUFTU0VSVChicCk7CisJQVNTRVJUKCFYRlNfQlVGX0dFVEVSUk9SKGJwKSk7CisJWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCBCX0ZTX0FHRkwsIFhGU19BR0ZMX1JFRik7CisJKmJwcCA9IGJwOworCXJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChYRlNfQUxMT0NfVFJBQ0UpCisvKgorICogQWRkIGFuIGFsbG9jYXRpb24gdHJhY2UgZW50cnkgZm9yIGFuIGFsbG9jIGNhbGwuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYWxsb2NfdHJhY2VfYWxsb2MoCisJY2hhcgkJKm5hbWUsCQkvKiBmdW5jdGlvbiB0YWcgc3RyaW5nICovCisJY2hhcgkJKnN0ciwJCS8qIGFkZGl0aW9uYWwgc3RyaW5nICovCisJeGZzX2FsbG9jX2FyZ190CSphcmdzLAkJLyogYWxsb2NhdGlvbiBhcmd1bWVudCBzdHJ1Y3R1cmUgKi8KKwlpbnQJCWxpbmUpCQkvKiBzb3VyY2UgbGluZSBudW1iZXIgKi8KK3sKKwlrdHJhY2VfZW50ZXIoeGZzX2FsbG9jX3RyYWNlX2J1ZiwKKwkJKHZvaWQgKikoX19wc2ludF90KShYRlNfQUxMT0NfS1RSQUNFX0FMTE9DIHwgKGxpbmUgPDwgMTYpKSwKKwkJKHZvaWQgKiluYW1lLAorCQkodm9pZCAqKXN0ciwKKwkJKHZvaWQgKilhcmdzLT5tcCwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpYXJncy0+YWdubywKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpYXJncy0+YWdibm8sCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KWFyZ3MtPm1pbmxlbiwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpYXJncy0+bWF4bGVuLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClhcmdzLT5tb2QsCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KWFyZ3MtPnByb2QsCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KWFyZ3MtPm1pbmxlZnQsCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KWFyZ3MtPnRvdGFsLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClhcmdzLT5hbGlnbm1lbnQsCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KWFyZ3MtPmxlbiwKKwkJKHZvaWQgKikoKCgoX19wc2ludF90KWFyZ3MtPnR5cGUpIDw8IDE2KSB8CisJCQkgKF9fcHNpbnRfdClhcmdzLT5vdHlwZSksCisJCSh2b2lkICopKF9fcHNpbnRfdCkoKGFyZ3MtPndhc2RlbCA8PCAzKSB8CisJCQkJICAgIChhcmdzLT53YXNmcm9tZmwgPDwgMikgfAorCQkJCSAgICAoYXJncy0+aXNmbCA8PCAxKSB8CisJCQkJICAgIChhcmdzLT51c2VyZGF0YSA8PCAwKSkpOworfQorCisvKgorICogQWRkIGFuIGFsbG9jYXRpb24gdHJhY2UgZW50cnkgZm9yIGEgZnJlZSBjYWxsLgorICovCitTVEFUSUMgdm9pZAoreGZzX2FsbG9jX3RyYWNlX2ZyZWUoCisJY2hhcgkJKm5hbWUsCQkvKiBmdW5jdGlvbiB0YWcgc3RyaW5nICovCisJY2hhcgkJKnN0ciwJCS8qIGFkZGl0aW9uYWwgc3RyaW5nICovCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfYWdudW1iZXJfdAlhZ25vLAkJLyogYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwl4ZnNfYWdibG9ja190CWFnYm5vLAkJLyogYS5nLiByZWxhdGl2ZSBibG9jayBudW1iZXIgKi8KKwl4ZnNfZXh0bGVuX3QJbGVuLAkJLyogbGVuZ3RoIG9mIGV4dGVudCAqLworCWludAkJaXNmbCwJCS8qIHNldCBpZiBpcyBmcmVlbGlzdCBhbGxvY2F0aW9uL2ZyZWUgKi8KKwlpbnQJCWxpbmUpCQkvKiBzb3VyY2UgbGluZSBudW1iZXIgKi8KK3sKKwlrdHJhY2VfZW50ZXIoeGZzX2FsbG9jX3RyYWNlX2J1ZiwKKwkJKHZvaWQgKikoX19wc2ludF90KShYRlNfQUxMT0NfS1RSQUNFX0ZSRUUgfCAobGluZSA8PCAxNikpLAorCQkodm9pZCAqKW5hbWUsCisJCSh2b2lkICopc3RyLAorCQkodm9pZCAqKW1wLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClhZ25vLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClhZ2JubywKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpbGVuLAorCQkodm9pZCAqKShfX3BzaW50X3QpaXNmbCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qCisgKiBBZGQgYW4gYWxsb2NhdGlvbiB0cmFjZSBlbnRyeSBmb3IgbW9kaWZ5aW5nIGFuIGFnZi4KKyAqLworU1RBVElDIHZvaWQKK3hmc19hbGxvY190cmFjZV9tb2RhZ2YoCisJY2hhcgkJKm5hbWUsCQkvKiBmdW5jdGlvbiB0YWcgc3RyaW5nICovCisJY2hhcgkJKnN0ciwJCS8qIGFkZGl0aW9uYWwgc3RyaW5nICovCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfYWdmX3QJKmFnZiwJCS8qIG5ldyBhZ2YgdmFsdWUgKi8KKwlpbnQJCWZsYWdzLAkJLyogbG9nZ2luZyBmbGFncyBmb3IgYWdmICovCisJaW50CQlsaW5lKQkJLyogc291cmNlIGxpbmUgbnVtYmVyICovCit7CisJa3RyYWNlX2VudGVyKHhmc19hbGxvY190cmFjZV9idWYsCisJCSh2b2lkICopKF9fcHNpbnRfdCkoWEZTX0FMTE9DX0tUUkFDRV9NT0RBR0YgfCAobGluZSA8PCAxNikpLAorCQkodm9pZCAqKW5hbWUsCisJCSh2b2lkICopc3RyLAorCQkodm9pZCAqKW1wLAorCQkodm9pZCAqKShfX3BzaW50X3QpZmxhZ3MsCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KUlOVF9HRVQoYWdmLT5hZ2Zfc2Vxbm8sIEFSQ0hfQ09OVkVSVCksCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KUlOVF9HRVQoYWdmLT5hZ2ZfbGVuZ3RoLCBBUkNIX0NPTlZFUlQpLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClJTlRfR0VUKGFnZi0+YWdmX3Jvb3RzW1hGU19CVE5VTV9CTk9dLAorCQkJCQkJQVJDSF9DT05WRVJUKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpSU5UX0dFVChhZ2YtPmFnZl9yb290c1tYRlNfQlROVU1fQ05UXSwKKwkJCQkJCUFSQ0hfQ09OVkVSVCksCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KUlOVF9HRVQoYWdmLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9CTk9dLAorCQkJCQkJQVJDSF9DT05WRVJUKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpSU5UX0dFVChhZ2YtPmFnZl9sZXZlbHNbWEZTX0JUTlVNX0NOVF0sCisJCQkJCQlBUkNIX0NPTlZFUlQpLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClJTlRfR0VUKGFnZi0+YWdmX2ZsZmlyc3QsIEFSQ0hfQ09OVkVSVCksCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KUlOVF9HRVQoYWdmLT5hZ2ZfZmxsYXN0LCBBUkNIX0NPTlZFUlQpLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClJTlRfR0VUKGFnZi0+YWdmX2ZsY291bnQsIEFSQ0hfQ09OVkVSVCksCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KUlOVF9HRVQoYWdmLT5hZ2ZfZnJlZWJsa3MsIEFSQ0hfQ09OVkVSVCksCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KUlOVF9HRVQoYWdmLT5hZ2ZfbG9uZ2VzdCwgQVJDSF9DT05WRVJUKSk7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfYWxsb2NfdHJhY2VfYnVzeSgKKwljaGFyCQkqbmFtZSwJCS8qIGZ1bmN0aW9uIHRhZyBzdHJpbmcgKi8KKwljaGFyCQkqc3RyLAkJLyogYWRkaXRpb25hbCBzdHJpbmcgKi8KKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2luZyAqLworCXhmc19hZ251bWJlcl90CWFnbm8sCQkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCXhmc19hZ2Jsb2NrX3QJYWdibm8sCQkvKiBhLmcuIHJlbGF0aXZlIGJsb2NrIG51bWJlciAqLworCXhmc19leHRsZW5fdAlsZW4sCQkvKiBsZW5ndGggb2YgZXh0ZW50ICovCisJaW50CQlzbG90LAkJLyogcGVyYWcgQnVzeSBzbG90ICovCisJeGZzX3RyYW5zX3QJKnRwLAorCWludAkJdHJ0eXBlLAkJLyogdHlwZTogYWRkLCBkZWxldGUsIHNlYXJjaCAqLworCWludAkJbGluZSkJCS8qIHNvdXJjZSBsaW5lIG51bWJlciAqLworeworCWt0cmFjZV9lbnRlcih4ZnNfYWxsb2NfdHJhY2VfYnVmLAorCQkodm9pZCAqKShfX3BzaW50X3QpKHRydHlwZSB8IChsaW5lIDw8IDE2KSksCisJCSh2b2lkICopbmFtZSwKKwkJKHZvaWQgKilzdHIsCisJCSh2b2lkICopbXAsCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KWFnbm8sCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KWFnYm5vLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClsZW4sCisJCSh2b2lkICopKF9fcHNpbnRfdClzbG90LAorCQkodm9pZCAqKXRwLAorCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKyNlbmRpZgkvKiBYRlNfQUxMT0NfVFJBQ0UgKi8KKworLyoKKyAqIEFsbG9jYXRpb24gZ3JvdXAgbGV2ZWwgZnVuY3Rpb25zLgorICovCisKKy8qCisgKiBBbGxvY2F0ZSBhIHZhcmlhYmxlIGV4dGVudCBpbiB0aGUgYWxsb2NhdGlvbiBncm91cCBhZ25vLgorICogVHlwZSBhbmQgYm5vIGFyZSB1c2VkIHRvIGRldGVybWluZSB3aGVyZSBpbiB0aGUgYWxsb2NhdGlvbiBncm91cCB0aGUKKyAqIGV4dGVudCB3aWxsIHN0YXJ0LgorICogRXh0ZW50J3MgbGVuZ3RoIChyZXR1cm5lZCBpbiAqbGVuKSB3aWxsIGJlIGJldHdlZW4gbWlubGVuIGFuZCBtYXhsZW4sCisgKiBhbmQgb2YgdGhlIGZvcm0gayAqIHByb2QgKyBtb2QgdW5sZXNzIHRoZXJlJ3Mgbm90aGluZyB0aGF0IGxhcmdlLgorICogUmV0dXJuIHRoZSBzdGFydGluZyBhLmcuIGJsb2NrLCBvciBOVUxMQUdCTE9DSyBpZiB3ZSBjYW4ndCBkbyBpdC4KKyAqLworU1RBVElDIGludAkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfYWdfdmV4dGVudCgKKwl4ZnNfYWxsb2NfYXJnX3QJKmFyZ3MpCS8qIGFyZ3VtZW50IHN0cnVjdHVyZSBmb3IgYWxsb2NhdGlvbiAqLworeworCWludAkJZXJyb3I9MDsKKyNpZmRlZiBYRlNfQUxMT0NfVFJBQ0UKKwlzdGF0aWMgY2hhcglmbmFtZVtdID0gInhmc19hbGxvY19hZ192ZXh0ZW50IjsKKyNlbmRpZgorCisJQVNTRVJUKGFyZ3MtPm1pbmxlbiA+IDApOworCUFTU0VSVChhcmdzLT5tYXhsZW4gPiAwKTsKKwlBU1NFUlQoYXJncy0+bWlubGVuIDw9IGFyZ3MtPm1heGxlbik7CisJQVNTRVJUKGFyZ3MtPm1vZCA8IGFyZ3MtPnByb2QpOworCUFTU0VSVChhcmdzLT5hbGlnbm1lbnQgPiAwKTsKKwkvKgorCSAqIEJyYW5jaCB0byBjb3JyZWN0IHJvdXRpbmUgYmFzZWQgb24gdGhlIHR5cGUuCisJICovCisJYXJncy0+d2FzZnJvbWZsID0gMDsKKwlzd2l0Y2ggKGFyZ3MtPnR5cGUpIHsKKwljYXNlIFhGU19BTExPQ1RZUEVfVEhJU19BRzoKKwkJZXJyb3IgPSB4ZnNfYWxsb2NfYWdfdmV4dGVudF9zaXplKGFyZ3MpOworCQlicmVhazsKKwljYXNlIFhGU19BTExPQ1RZUEVfTkVBUl9CTk86CisJCWVycm9yID0geGZzX2FsbG9jX2FnX3ZleHRlbnRfbmVhcihhcmdzKTsKKwkJYnJlYWs7CisJY2FzZSBYRlNfQUxMT0NUWVBFX1RISVNfQk5POgorCQllcnJvciA9IHhmc19hbGxvY19hZ192ZXh0ZW50X2V4YWN0KGFyZ3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJLyoKKwkgKiBJZiB0aGUgYWxsb2NhdGlvbiB3b3JrZWQsIG5lZWQgdG8gY2hhbmdlIHRoZSBhZ2Ygc3RydWN0dXJlCisJICogKGFuZCBsb2cgaXQpLCBhbmQgdGhlIHN1cGVyYmxvY2suCisJICovCisJaWYgKGFyZ3MtPmFnYm5vICE9IE5VTExBR0JMT0NLKSB7CisJCXhmc19hZ2ZfdAkqYWdmOwkvKiBhbGxvY2F0aW9uIGdyb3VwIGZyZWVsaXN0IGhlYWRlciAqLworI2lmZGVmIFhGU19BTExPQ19UUkFDRQorCQl4ZnNfbW91bnRfdAkqbXAgPSBhcmdzLT5tcDsKKyNlbmRpZgorCQlsb25nCQlzbGVuID0gKGxvbmcpYXJncy0+bGVuOworCisJCUFTU0VSVChhcmdzLT5sZW4gPj0gYXJncy0+bWlubGVuICYmIGFyZ3MtPmxlbiA8PSBhcmdzLT5tYXhsZW4pOworCQlBU1NFUlQoIShhcmdzLT53YXNmcm9tZmwpIHx8ICFhcmdzLT5pc2ZsKTsKKwkJQVNTRVJUKGFyZ3MtPmFnYm5vICUgYXJncy0+YWxpZ25tZW50ID09IDApOworCQlpZiAoIShhcmdzLT53YXNmcm9tZmwpKSB7CisKKwkJCWFnZiA9IFhGU19CVUZfVE9fQUdGKGFyZ3MtPmFnYnApOworCQkJSU5UX01PRChhZ2YtPmFnZl9mcmVlYmxrcywgQVJDSF9DT05WRVJULCAtKGFyZ3MtPmxlbikpOworCQkJeGZzX3RyYW5zX2FnYmxvY2tzX2RlbHRhKGFyZ3MtPnRwLAorCQkJCQkJIC0oKGxvbmcpKGFyZ3MtPmxlbikpKTsKKwkJCWFyZ3MtPnBhZy0+cGFnZl9mcmVlYmxrcyAtPSBhcmdzLT5sZW47CisJCQlBU1NFUlQoSU5UX0dFVChhZ2YtPmFnZl9mcmVlYmxrcywgQVJDSF9DT05WRVJUKQorCQkJCTw9IElOVF9HRVQoYWdmLT5hZ2ZfbGVuZ3RoLCBBUkNIX0NPTlZFUlQpKTsKKwkJCVRSQUNFX01PREFHRihOVUxMLCBhZ2YsIFhGU19BR0ZfRlJFRUJMS1MpOworCQkJeGZzX2FsbG9jX2xvZ19hZ2YoYXJncy0+dHAsIGFyZ3MtPmFnYnAsCisJCQkJCQlYRlNfQUdGX0ZSRUVCTEtTKTsKKwkJCS8qIHNlYXJjaCB0aGUgYnVzeWxpc3QgZm9yIHRoZXNlIGJsb2NrcyAqLworCQkJeGZzX2FsbG9jX3NlYXJjaF9idXN5KGFyZ3MtPnRwLCBhcmdzLT5hZ25vLAorCQkJCQlhcmdzLT5hZ2JubywgYXJncy0+bGVuKTsKKwkJfQorCQlpZiAoIWFyZ3MtPmlzZmwpCisJCQl4ZnNfdHJhbnNfbW9kX3NiKGFyZ3MtPnRwLAorCQkJCWFyZ3MtPndhc2RlbCA/IFhGU19UUkFOU19TQl9SRVNfRkRCTE9DS1MgOgorCQkJCQlYRlNfVFJBTlNfU0JfRkRCTE9DS1MsIC1zbGVuKTsKKwkJWEZTX1NUQVRTX0lOQyh4c19hbGxvY3gpOworCQlYRlNfU1RBVFNfQUREKHhzX2FsbG9jYiwgYXJncy0+bGVuKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIHZhcmlhYmxlIGV4dGVudCBhdCBleGFjdGx5IGFnbm8vYm5vLgorICogRXh0ZW50J3MgbGVuZ3RoIChyZXR1cm5lZCBpbiAqbGVuKSB3aWxsIGJlIGJldHdlZW4gbWlubGVuIGFuZCBtYXhsZW4sCisgKiBhbmQgb2YgdGhlIGZvcm0gayAqIHByb2QgKyBtb2QgdW5sZXNzIHRoZXJlJ3Mgbm90aGluZyB0aGF0IGxhcmdlLgorICogUmV0dXJuIHRoZSBzdGFydGluZyBhLmcuIGJsb2NrIChibm8pLCBvciBOVUxMQUdCTE9DSyBpZiB3ZSBjYW4ndCBkbyBpdC4KKyAqLworU1RBVElDIGludAkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfYWdfdmV4dGVudF9leGFjdCgKKwl4ZnNfYWxsb2NfYXJnX3QJKmFyZ3MpCS8qIGFsbG9jYXRpb24gYXJndW1lbnQgc3RydWN0dXJlICovCit7CisJeGZzX2J0cmVlX2N1cl90CSpibm9fY3VyOy8qIGJ5IGJsb2NrLW51bWJlciBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJKmNudF9jdXI7LyogYnkgY291bnQgYnRyZWUgY3Vyc29yICovCisJeGZzX2FnYmxvY2tfdAllbmQ7CS8qIGVuZCBvZiBhbGxvY2F0ZWQgZXh0ZW50ICovCisJaW50CQllcnJvcjsKKwl4ZnNfYWdibG9ja190CWZibm87CS8qIHN0YXJ0IGJsb2NrIG9mIGZvdW5kIGV4dGVudCAqLworCXhmc19hZ2Jsb2NrX3QJZmVuZDsJLyogZW5kIGJsb2NrIG9mIGZvdW5kIGV4dGVudCAqLworCXhmc19leHRsZW5fdAlmbGVuOwkvKiBsZW5ndGggb2YgZm91bmQgZXh0ZW50ICovCisjaWZkZWYgWEZTX0FMTE9DX1RSQUNFCisJc3RhdGljIGNoYXIJZm5hbWVbXSA9ICJ4ZnNfYWxsb2NfYWdfdmV4dGVudF9leGFjdCI7CisjZW5kaWYKKwlpbnQJCWk7CS8qIHN1Y2Nlc3MvZmFpbHVyZSBvZiBvcGVyYXRpb24gKi8KKwl4ZnNfYWdibG9ja190CW1heGVuZDsJLyogZW5kIG9mIG1heGltYWwgZXh0ZW50ICovCisJeGZzX2FnYmxvY2tfdAltaW5lbmQ7CS8qIGVuZCBvZiBtaW5pbWFsIGV4dGVudCAqLworCXhmc19leHRsZW5fdAlybGVuOwkvKiBsZW5ndGggb2YgcmV0dXJuZWQgZXh0ZW50ICovCisKKwlBU1NFUlQoYXJncy0+YWxpZ25tZW50ID09IDEpOworCS8qCisJICogQWxsb2NhdGUvaW5pdGlhbGl6ZSBhIGN1cnNvciBmb3IgdGhlIGJ5LW51bWJlciBmcmVlc3BhY2UgYnRyZWUuCisJICovCisJYm5vX2N1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihhcmdzLT5tcCwgYXJncy0+dHAsIGFyZ3MtPmFnYnAsCisJCWFyZ3MtPmFnbm8sIFhGU19CVE5VTV9CTk8sIE5VTEwsIDApOworCS8qCisJICogTG9va3VwIGJubyBhbmQgbWlubGVuIGluIHRoZSBidHJlZSAobWlubGVuIGlzIGlycmVsZXZhbnQsIHJlYWxseSkuCisJICogTG9vayBmb3IgdGhlIGNsb3Nlc3QgZnJlZSBibG9jayA8PSBibm8sIGl0IG11c3QgY29udGFpbiBibm8KKwkgKiBpZiBhbnkgZnJlZSBibG9jayBkb2VzLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfbG9va3VwX2xlKGJub19jdXIsIGFyZ3MtPmFnYm5vLCBhcmdzLT5taW5sZW4sICZpKSkpCisJCWdvdG8gZXJyb3IwOworCWlmICghaSkgeworCQkvKgorCQkgKiBEaWRuJ3QgZmluZCBpdCwgcmV0dXJuIG51bGwuCisJCSAqLworCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJCWFyZ3MtPmFnYm5vID0gTlVMTEFHQkxPQ0s7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIEdyYWIgdGhlIGZyZWVzcGFjZSByZWNvcmQuCisJICovCisJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfcmVjKGJub19jdXIsICZmYm5vLCAmZmxlbiwgJmkpKSkKKwkJZ290byBlcnJvcjA7CisJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCUFTU0VSVChmYm5vIDw9IGFyZ3MtPmFnYm5vKTsKKwltaW5lbmQgPSBhcmdzLT5hZ2JubyArIGFyZ3MtPm1pbmxlbjsKKwltYXhlbmQgPSBhcmdzLT5hZ2JubyArIGFyZ3MtPm1heGxlbjsKKwlmZW5kID0gZmJubyArIGZsZW47CisJLyoKKwkgKiBHaXZlIHVwIGlmIHRoZSBmcmVlc3BhY2UgaXNuJ3QgbG9uZyBlbm91Z2ggZm9yIHRoZSBtaW5pbXVtIHJlcXVlc3QuCisJICovCisJaWYgKGZlbmQgPCBtaW5lbmQpIHsKKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoYm5vX2N1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCQlhcmdzLT5hZ2JubyA9IE5VTExBR0JMT0NLOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBFbmQgb2YgZXh0ZW50IHdpbGwgYmUgc21hbGxlciBvZiB0aGUgZnJlZXNwYWNlIGVuZCBhbmQgdGhlCisJICogbWF4aW1hbCByZXF1ZXN0ZWQgZW5kLgorCSAqLworCWVuZCA9IFhGU19BR0JMT0NLX01JTihmZW5kLCBtYXhlbmQpOworCS8qCisJICogRml4IHRoZSBsZW5ndGggYWNjb3JkaW5nIHRvIG1vZCBhbmQgcHJvZCBpZiBnaXZlbi4KKwkgKi8KKwlhcmdzLT5sZW4gPSBlbmQgLSBhcmdzLT5hZ2JubzsKKwl4ZnNfYWxsb2NfZml4X2xlbihhcmdzKTsKKwlpZiAoIXhmc19hbGxvY19maXhfbWlubGVmdChhcmdzKSkgeworCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJCXJldHVybiAwOworCX0KKwlybGVuID0gYXJncy0+bGVuOworCUFTU0VSVChhcmdzLT5hZ2JubyArIHJsZW4gPD0gZmVuZCk7CisJZW5kID0gYXJncy0+YWdibm8gKyBybGVuOworCS8qCisJICogV2UgYXJlIGFsbG9jYXRpbmcgYWdibm8gZm9yIHJsZW4gW2FnYm5vIC4uIGVuZF0KKwkgKiBBbGxvY2F0ZS9pbml0aWFsaXplIGEgY3Vyc29yIGZvciB0aGUgYnktc2l6ZSBidHJlZS4KKwkgKi8KKwljbnRfY3VyID0geGZzX2J0cmVlX2luaXRfY3Vyc29yKGFyZ3MtPm1wLCBhcmdzLT50cCwgYXJncy0+YWdicCwKKwkJYXJncy0+YWdubywgWEZTX0JUTlVNX0NOVCwgTlVMTCwgMCk7CisJQVNTRVJUKGFyZ3MtPmFnYm5vICsgYXJncy0+bGVuIDw9CisJCUlOVF9HRVQoWEZTX0JVRl9UT19BR0YoYXJncy0+YWdicCktPmFnZl9sZW5ndGgsCisJCQlBUkNIX0NPTlZFUlQpKTsKKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX2ZpeHVwX3RyZWVzKGNudF9jdXIsIGJub19jdXIsIGZibm8sIGZsZW4sCisJCQlhcmdzLT5hZ2JubywgYXJncy0+bGVuLCBYRlNBX0ZJWFVQX0JOT19PSykpKSB7CisJCXhmc19idHJlZV9kZWxfY3Vyc29yKGNudF9jdXIsIFhGU19CVFJFRV9FUlJPUik7CisJCWdvdG8gZXJyb3IwOworCX0KKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY250X2N1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCVRSQUNFX0FMTE9DKCJub3JtYWwiLCBhcmdzKTsKKwlhcmdzLT53YXNmcm9tZmwgPSAwOworCXJldHVybiAwOworCitlcnJvcjA6CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IoYm5vX2N1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwlUUkFDRV9BTExPQygiZXJyb3IiLCBhcmdzKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIHZhcmlhYmxlIGV4dGVudCBuZWFyIGJubyBpbiB0aGUgYWxsb2NhdGlvbiBncm91cCBhZ25vLgorICogRXh0ZW50J3MgbGVuZ3RoIChyZXR1cm5lZCBpbiBsZW4pIHdpbGwgYmUgYmV0d2VlbiBtaW5sZW4gYW5kIG1heGxlbiwKKyAqIGFuZCBvZiB0aGUgZm9ybSBrICogcHJvZCArIG1vZCB1bmxlc3MgdGhlcmUncyBub3RoaW5nIHRoYXQgbGFyZ2UuCisgKiBSZXR1cm4gdGhlIHN0YXJ0aW5nIGEuZy4gYmxvY2ssIG9yIE5VTExBR0JMT0NLIGlmIHdlIGNhbid0IGRvIGl0LgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfYWdfdmV4dGVudF9uZWFyKAorCXhmc19hbGxvY19hcmdfdAkqYXJncykJCS8qIGFsbG9jYXRpb24gYXJndW1lbnQgc3RydWN0dXJlICovCit7CisJeGZzX2J0cmVlX2N1cl90CSpibm9fY3VyX2d0OwkvKiBjdXJzb3IgZm9yIGJubyBidHJlZSwgcmlnaHQgc2lkZSAqLworCXhmc19idHJlZV9jdXJfdAkqYm5vX2N1cl9sdDsJLyogY3Vyc29yIGZvciBibm8gYnRyZWUsIGxlZnQgc2lkZSAqLworCXhmc19idHJlZV9jdXJfdAkqY250X2N1cjsJLyogY3Vyc29yIGZvciBjb3VudCBidHJlZSAqLworI2lmZGVmIFhGU19BTExPQ19UUkFDRQorCXN0YXRpYyBjaGFyCWZuYW1lW10gPSAieGZzX2FsbG9jX2FnX3ZleHRlbnRfbmVhciI7CisjZW5kaWYKKwl4ZnNfYWdibG9ja190CWd0Ym5vOwkJLyogc3RhcnQgYm5vIG9mIHJpZ2h0IHNpZGUgZW50cnkgKi8KKwl4ZnNfYWdibG9ja190CWd0Ym5vYTsJCS8qIGFsaWduZWQgLi4uICovCisJeGZzX2V4dGxlbl90CWd0ZGlmZjsJCS8qIGRpZmZlcmVuY2UgdG8gcmlnaHQgc2lkZSBlbnRyeSAqLworCXhmc19leHRsZW5fdAlndGxlbjsJCS8qIGxlbmd0aCBvZiByaWdodCBzaWRlIGVudHJ5ICovCisJeGZzX2V4dGxlbl90CWd0bGVuYTsJCS8qIGFsaWduZWQgLi4uICovCisJeGZzX2FnYmxvY2tfdAlndG5ldzsJCS8qIHVzZWZ1bCBzdGFydCBibm8gb2YgcmlnaHQgc2lkZSAqLworCWludAkJZXJyb3I7CQkvKiBlcnJvciBjb2RlICovCisJaW50CQlpOwkJLyogcmVzdWx0IGNvZGUsIHRlbXBvcmFyeSAqLworCWludAkJajsJCS8qIHJlc3VsdCBjb2RlLCB0ZW1wb3JhcnkgKi8KKwl4ZnNfYWdibG9ja190CWx0Ym5vOwkJLyogc3RhcnQgYm5vIG9mIGxlZnQgc2lkZSBlbnRyeSAqLworCXhmc19hZ2Jsb2NrX3QJbHRibm9hOwkJLyogYWxpZ25lZCAuLi4gKi8KKwl4ZnNfZXh0bGVuX3QJbHRkaWZmOwkJLyogZGlmZmVyZW5jZSB0byBsZWZ0IHNpZGUgZW50cnkgKi8KKwkvKlJFRkVSRU5DRUQqLworCXhmc19hZ2Jsb2NrX3QJbHRlbmQ7CQkvKiBlbmQgYm5vIG9mIGxlZnQgc2lkZSBlbnRyeSAqLworCXhmc19leHRsZW5fdAlsdGxlbjsJCS8qIGxlbmd0aCBvZiBsZWZ0IHNpZGUgZW50cnkgKi8KKwl4ZnNfZXh0bGVuX3QJbHRsZW5hOwkJLyogYWxpZ25lZCAuLi4gKi8KKwl4ZnNfYWdibG9ja190CWx0bmV3OwkJLyogdXNlZnVsIHN0YXJ0IGJubyBvZiBsZWZ0IHNpZGUgKi8KKwl4ZnNfZXh0bGVuX3QJcmxlbjsJCS8qIGxlbmd0aCBvZiByZXR1cm5lZCBleHRlbnQgKi8KKyNpZiBkZWZpbmVkKERFQlVHKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisJLyoKKwkgKiBSYW5kb21seSBkb24ndCBleGVjdXRlIHRoZSBmaXJzdCBhbGdvcml0aG0uCisJICovCisJaW50CQlkb2ZpcnN0OwkvKiBzZXQgdG8gZG8gZmlyc3QgYWxnb3JpdGhtICovCisKKwlkb2ZpcnN0ID0gcmFuZG9tKCkgJiAxOworI2VuZGlmCisJLyoKKwkgKiBHZXQgYSBjdXJzb3IgZm9yIHRoZSBieS1zaXplIGJ0cmVlLgorCSAqLworCWNudF9jdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IoYXJncy0+bXAsIGFyZ3MtPnRwLCBhcmdzLT5hZ2JwLAorCQlhcmdzLT5hZ25vLCBYRlNfQlROVU1fQ05ULCBOVUxMLCAwKTsKKwlsdGxlbiA9IDA7CisJYm5vX2N1cl9sdCA9IGJub19jdXJfZ3QgPSBOVUxMOworCS8qCisJICogU2VlIGlmIHRoZXJlIGFyZSBhbnkgZnJlZSBleHRlbnRzIGFzIGJpZyBhcyBtYXhsZW4uCisJICovCisJaWYgKChlcnJvciA9IHhmc19hbGxvY19sb29rdXBfZ2UoY250X2N1ciwgMCwgYXJncy0+bWF4bGVuLCAmaSkpKQorCQlnb3RvIGVycm9yMDsKKwkvKgorCSAqIElmIG5vbmUsIHRoZW4gcGljayB1cCB0aGUgbGFzdCBlbnRyeSBpbiB0aGUgdHJlZSB1bmxlc3MgdGhlCisJICogdHJlZSBpcyBlbXB0eS4KKwkgKi8KKwlpZiAoIWkpIHsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19hZ192ZXh0ZW50X3NtYWxsKGFyZ3MsIGNudF9jdXIsICZsdGJubywKKwkJCQkmbHRsZW4sICZpKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJaWYgKGkgPT0gMCB8fCBsdGxlbiA9PSAwKSB7CisJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjbnRfY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlBU1NFUlQoaSA9PSAxKTsKKwl9CisJYXJncy0+d2FzZnJvbWZsID0gMDsKKwkvKgorCSAqIEZpcnN0IGFsZ29yaXRobS4KKwkgKiBJZiB0aGUgcmVxdWVzdGVkIGV4dGVudCBpcyBsYXJnZSB3cnQgdGhlIGZyZWVzcGFjZXMgYXZhaWxhYmxlCisJICogaW4gdGhpcyBhLmcuLCB0aGVuIHRoZSBjdXJzb3Igd2lsbCBiZSBwb2ludGluZyB0byBhIGJ0cmVlIGVudHJ5CisJICogbmVhciB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgdHJlZS4gIElmIGl0J3MgaW4gdGhlIGxhc3QgYnRyZWUgbGVhZgorCSAqIGJsb2NrLCB0aGVuIHdlIGp1c3QgZXhhbWluZSBhbGwgdGhlIGVudHJpZXMgaW4gdGhhdCBibG9jaworCSAqIHRoYXQgYXJlIGJpZyBlbm91Z2gsIGFuZCBwaWNrIHRoZSBiZXN0IG9uZS4KKwkgKiBUaGlzIGlzIHdyaXR0ZW4gYXMgYSB3aGlsZSBsb29wIHNvIHdlIGNhbiBicmVhayBvdXQgb2YgaXQsCisJICogYnV0IHdlIG5ldmVyIGxvb3AgYmFjayB0byB0aGUgdG9wLgorCSAqLworCXdoaWxlICh4ZnNfYnRyZWVfaXNsYXN0YmxvY2soY250X2N1ciwgMCkpIHsKKwkJeGZzX2V4dGxlbl90CWJkaWZmOworCQlpbnQJCWJlc3RpPTA7CisJCXhmc19leHRsZW5fdAlibGVuPTA7CisJCXhmc19hZ2Jsb2NrX3QJYm5ldz0wOworCisjaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorCQlpZiAoIWRvZmlyc3QpCisJCQlicmVhazsKKyNlbmRpZgorCQkvKgorCQkgKiBTdGFydCBmcm9tIHRoZSBlbnRyeSB0aGF0IGxvb2t1cCBmb3VuZCwgc2VxdWVuY2UgdGhyb3VnaAorCQkgKiBhbGwgbGFyZ2VyIGZyZWUgYmxvY2tzLiAgSWYgd2UncmUgYWN0dWFsbHkgcG9pbnRpbmcgYXQgYQorCQkgKiByZWNvcmQgc21hbGxlciB0aGFuIG1heGxlbiwgZ28gdG8gdGhlIHN0YXJ0IG9mIHRoaXMgYmxvY2ssCisJCSAqIGFuZCBza2lwIGFsbCB0aG9zZSBzbWFsbGVyIHRoYW4gbWlubGVuLgorCQkgKi8KKwkJaWYgKGx0bGVuIHx8IGFyZ3MtPmFsaWdubWVudCA+IDEpIHsKKwkJCWNudF9jdXItPmJjX3B0cnNbMF0gPSAxOworCQkJZG8geworCQkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZ2V0X3JlYyhjbnRfY3VyLCAmbHRibm8sCisJCQkJCQkmbHRsZW4sICZpKSkpCisJCQkJCWdvdG8gZXJyb3IwOworCQkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJCQlpZiAobHRsZW4gPj0gYXJncy0+bWlubGVuKQorCQkJCQlicmVhazsKKwkJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2luY3JlbWVudChjbnRfY3VyLCAwLCAmaSkpKQorCQkJCQlnb3RvIGVycm9yMDsKKwkJCX0gd2hpbGUgKGkpOworCQkJQVNTRVJUKGx0bGVuID49IGFyZ3MtPm1pbmxlbik7CisJCQlpZiAoIWkpCisJCQkJYnJlYWs7CisJCX0KKwkJaSA9IGNudF9jdXItPmJjX3B0cnNbMF07CisJCWZvciAoaiA9IDEsIGJsZW4gPSAwLCBiZGlmZiA9IDA7CisJCSAgICAgIWVycm9yICYmIGogJiYgKGJsZW4gPCBhcmdzLT5tYXhsZW4gfHwgYmRpZmYgPiAwKTsKKwkJICAgICBlcnJvciA9IHhmc19hbGxvY19pbmNyZW1lbnQoY250X2N1ciwgMCwgJmopKSB7CisJCQkvKgorCQkJICogRm9yIGVhY2ggZW50cnksIGRlY2lkZSBpZiBpdCdzIGJldHRlciB0aGFuCisJCQkgKiB0aGUgcHJldmlvdXMgYmVzdCBlbnRyeS4KKwkJCSAqLworCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfcmVjKGNudF9jdXIsICZsdGJubywgJmx0bGVuLCAmaSkpKQorCQkJCWdvdG8gZXJyb3IwOworCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQkJaWYgKCF4ZnNfYWxsb2NfY29tcHV0ZV9hbGlnbmVkKGx0Ym5vLCBsdGxlbiwKKwkJCQkJYXJncy0+YWxpZ25tZW50LCBhcmdzLT5taW5sZW4sCisJCQkJCSZsdGJub2EsICZsdGxlbmEpKQorCQkJCWNvbnRpbnVlOworCQkJYXJncy0+bGVuID0gWEZTX0VYVExFTl9NSU4obHRsZW5hLCBhcmdzLT5tYXhsZW4pOworCQkJeGZzX2FsbG9jX2ZpeF9sZW4oYXJncyk7CisJCQlBU1NFUlQoYXJncy0+bGVuID49IGFyZ3MtPm1pbmxlbik7CisJCQlpZiAoYXJncy0+bGVuIDwgYmxlbikKKwkJCQljb250aW51ZTsKKwkJCWx0ZGlmZiA9IHhmc19hbGxvY19jb21wdXRlX2RpZmYoYXJncy0+YWdibm8sIGFyZ3MtPmxlbiwKKwkJCQlhcmdzLT5hbGlnbm1lbnQsIGx0Ym5vLCBsdGxlbiwgJmx0bmV3KTsKKwkJCWlmIChsdG5ldyAhPSBOVUxMQUdCTE9DSyAmJgorCQkJICAgIChhcmdzLT5sZW4gPiBibGVuIHx8IGx0ZGlmZiA8IGJkaWZmKSkgeworCQkJCWJkaWZmID0gbHRkaWZmOworCQkJCWJuZXcgPSBsdG5ldzsKKwkJCQlibGVuID0gYXJncy0+bGVuOworCQkJCWJlc3RpID0gY250X2N1ci0+YmNfcHRyc1swXTsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiBJdCBkaWRuJ3Qgd29yay4gIFdlIENPVUxEIGJlIGluIGEgY2FzZSB3aGVyZQorCQkgKiB0aGVyZSdzIGEgZ29vZCByZWNvcmQgc29tZXdoZXJlLCBzbyB0cnkgYWdhaW4uCisJCSAqLworCQlpZiAoYmxlbiA9PSAwKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIFBvaW50IGF0IHRoZSBiZXN0IGVudHJ5LCBhbmQgcmV0cmlldmUgaXQgYWdhaW4uCisJCSAqLworCQljbnRfY3VyLT5iY19wdHJzWzBdID0gYmVzdGk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZ2V0X3JlYyhjbnRfY3VyLCAmbHRibm8sICZsdGxlbiwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCWx0ZW5kID0gbHRibm8gKyBsdGxlbjsKKwkJQVNTRVJUKGx0ZW5kIDw9IElOVF9HRVQoWEZTX0JVRl9UT19BR0YoYXJncy0+YWdicCktPmFnZl9sZW5ndGgsCisJCQkJQVJDSF9DT05WRVJUKSk7CisJCWFyZ3MtPmxlbiA9IGJsZW47CisJCWlmICgheGZzX2FsbG9jX2ZpeF9taW5sZWZ0KGFyZ3MpKSB7CisJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjbnRfY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJCQlUUkFDRV9BTExPQygibm9taW5sZWZ0IiwgYXJncyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlibGVuID0gYXJncy0+bGVuOworCQkvKgorCQkgKiBXZSBhcmUgYWxsb2NhdGluZyBzdGFydGluZyBhdCBibmV3IGZvciBibGVuIGJsb2Nrcy4KKwkJICovCisJCWFyZ3MtPmFnYm5vID0gYm5ldzsKKwkJQVNTRVJUKGJuZXcgPj0gbHRibm8pOworCQlBU1NFUlQoYm5ldyArIGJsZW4gPD0gbHRlbmQpOworCQkvKgorCQkgKiBTZXQgdXAgYSBjdXJzb3IgZm9yIHRoZSBieS1ibm8gdHJlZS4KKwkJICovCisJCWJub19jdXJfbHQgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IoYXJncy0+bXAsIGFyZ3MtPnRwLAorCQkJYXJncy0+YWdicCwgYXJncy0+YWdubywgWEZTX0JUTlVNX0JOTywgTlVMTCwgMCk7CisJCS8qCisJCSAqIEZpeCB1cCB0aGUgYnRyZWUgZW50cmllcy4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZml4dXBfdHJlZXMoY250X2N1ciwgYm5vX2N1cl9sdCwgbHRibm8sCisJCQkJbHRsZW4sIGJuZXcsIGJsZW4sIFhGU0FfRklYVVBfQ05UX09LKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY250X2N1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyX2x0LCBYRlNfQlRSRUVfTk9FUlJPUik7CisJCVRSQUNFX0FMTE9DKCJmaXJzdCIsIGFyZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBTZWNvbmQgYWxnb3JpdGhtLgorCSAqIFNlYXJjaCBpbiB0aGUgYnktYm5vIHRyZWUgdG8gdGhlIGxlZnQgYW5kIHRvIHRoZSByaWdodAorCSAqIHNpbXVsdGFuZW91c2x5LCB1bnRpbCBpbiBlYWNoIGNhc2Ugd2UgZmluZCBhIHNwYWNlIGJpZyBlbm91Z2gsCisJICogb3IgcnVuIGludG8gdGhlIGVkZ2Ugb2YgdGhlIHRyZWUuICBXaGVuIHdlIHJ1biBpbnRvIHRoZSBlZGdlLAorCSAqIHdlIGRlYWxsb2NhdGUgdGhhdCBjdXJzb3IuCisJICogSWYgYm90aCBzZWFyY2hlcyBzdWNjZWVkLCB3ZSBjb21wYXJlIHRoZSB0d28gc3BhY2VzIGFuZCBwaWNrCisJICogdGhlIGJldHRlciBvbmUuCisJICogV2l0aCBhbGlnbm1lbnQsIGl0J3MgcG9zc2libGUgZm9yIGJvdGggdG8gZmFpbDsgdGhlIHVwcGVyCisJICogbGV2ZWwgYWxnb3JpdGhtIHRoYXQgcGlja3MgYWxsb2NhdGlvbiBncm91cHMgZm9yIGFsbG9jYXRpb25zCisJICogaXMgbm90IHN1cHBvc2VkIHRvIGRvIHRoaXMuCisJICovCisJLyoKKwkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgY3Vyc29yIGZvciB0aGUgbGVmdHdhcmQgc2VhcmNoLgorCSAqLworCWJub19jdXJfbHQgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IoYXJncy0+bXAsIGFyZ3MtPnRwLCBhcmdzLT5hZ2JwLAorCQlhcmdzLT5hZ25vLCBYRlNfQlROVU1fQk5PLCBOVUxMLCAwKTsKKwkvKgorCSAqIExvb2t1cCA8PSBibm8gdG8gZmluZCB0aGUgbGVmdHdhcmQgc2VhcmNoJ3Mgc3RhcnRpbmcgcG9pbnQuCisJICovCisJaWYgKChlcnJvciA9IHhmc19hbGxvY19sb29rdXBfbGUoYm5vX2N1cl9sdCwgYXJncy0+YWdibm8sIGFyZ3MtPm1heGxlbiwgJmkpKSkKKwkJZ290byBlcnJvcjA7CisJaWYgKCFpKSB7CisJCS8qCisJCSAqIERpZG4ndCBmaW5kIGFueXRoaW5nOyB1c2UgdGhpcyBjdXJzb3IgZm9yIHRoZSByaWdodHdhcmQKKwkJICogc2VhcmNoLgorCQkgKi8KKwkJYm5vX2N1cl9ndCA9IGJub19jdXJfbHQ7CisJCWJub19jdXJfbHQgPSBOVUxMOworCX0KKwkvKgorCSAqIEZvdW5kIHNvbWV0aGluZy4gIER1cGxpY2F0ZSB0aGUgY3Vyc29yIGZvciB0aGUgcmlnaHR3YXJkIHNlYXJjaC4KKwkgKi8KKwllbHNlIGlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZHVwX2N1cnNvcihibm9fY3VyX2x0LCAmYm5vX2N1cl9ndCkpKQorCQlnb3RvIGVycm9yMDsKKwkvKgorCSAqIEluY3JlbWVudCB0aGUgY3Vyc29yLCBzbyB3ZSB3aWxsIHBvaW50IGF0IHRoZSBlbnRyeSBqdXN0IHJpZ2h0CisJICogb2YgdGhlIGxlZnR3YXJkIGVudHJ5IGlmIGFueSwgb3IgdG8gdGhlIGxlZnRtb3N0IGVudHJ5LgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfaW5jcmVtZW50KGJub19jdXJfZ3QsIDAsICZpKSkpCisJCWdvdG8gZXJyb3IwOworCWlmICghaSkgeworCQkvKgorCQkgKiBJdCBmYWlsZWQsIHRoZXJlIGFyZSBubyByaWdodHdhcmQgZW50cmllcy4KKwkJICovCisJCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXJfZ3QsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJYm5vX2N1cl9ndCA9IE5VTEw7CisJfQorCS8qCisJICogTG9vcCBnb2luZyBsZWZ0IHdpdGggdGhlIGxlZnR3YXJkIGN1cnNvciwgcmlnaHQgd2l0aCB0aGUKKwkgKiByaWdodHdhcmQgY3Vyc29yLCB1bnRpbCBlaXRoZXIgYm90aCBkaXJlY3Rpb25zIGdpdmUgdXAgb3IKKwkgKiB3ZSBmaW5kIGFuIGVudHJ5IGF0IGxlYXN0IGFzIGJpZyBhcyBtaW5sZW4uCisJICovCisJZG8geworCQlpZiAoYm5vX2N1cl9sdCkgeworCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfcmVjKGJub19jdXJfbHQsICZsdGJubywgJmx0bGVuLCAmaSkpKQorCQkJCWdvdG8gZXJyb3IwOworCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQkJaWYgKHhmc19hbGxvY19jb21wdXRlX2FsaWduZWQobHRibm8sIGx0bGVuLAorCQkJCQlhcmdzLT5hbGlnbm1lbnQsIGFyZ3MtPm1pbmxlbiwKKwkJCQkJJmx0Ym5vYSwgJmx0bGVuYSkpCisJCQkJYnJlYWs7CisJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2RlY3JlbWVudChibm9fY3VyX2x0LCAwLCAmaSkpKQorCQkJCWdvdG8gZXJyb3IwOworCQkJaWYgKCFpKSB7CisJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoYm5vX2N1cl9sdCwKKwkJCQkJCSAgICAgWEZTX0JUUkVFX05PRVJST1IpOworCQkJCWJub19jdXJfbHQgPSBOVUxMOworCQkJfQorCQl9CisJCWlmIChibm9fY3VyX2d0KSB7CisJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2dldF9yZWMoYm5vX2N1cl9ndCwgJmd0Ym5vLCAmZ3RsZW4sICZpKSkpCisJCQkJZ290byBlcnJvcjA7CisJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCQlpZiAoeGZzX2FsbG9jX2NvbXB1dGVfYWxpZ25lZChndGJubywgZ3RsZW4sCisJCQkJCWFyZ3MtPmFsaWdubWVudCwgYXJncy0+bWlubGVuLAorCQkJCQkmZ3Ribm9hLCAmZ3RsZW5hKSkKKwkJCQlicmVhazsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfaW5jcmVtZW50KGJub19jdXJfZ3QsIDAsICZpKSkpCisJCQkJZ290byBlcnJvcjA7CisJCQlpZiAoIWkpIHsKKwkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyX2d0LAorCQkJCQkJICAgICBYRlNfQlRSRUVfTk9FUlJPUik7CisJCQkJYm5vX2N1cl9ndCA9IE5VTEw7CisJCQl9CisJCX0KKwl9IHdoaWxlIChibm9fY3VyX2x0IHx8IGJub19jdXJfZ3QpOworCS8qCisJICogR290IGJvdGggY3Vyc29ycyBzdGlsbCBhY3RpdmUsIG5lZWQgdG8gZmluZCBiZXR0ZXIgZW50cnkuCisJICovCisJaWYgKGJub19jdXJfbHQgJiYgYm5vX2N1cl9ndCkgeworCQkvKgorCQkgKiBMZWZ0IHNpZGUgaXMgbG9uZyBlbm91Z2gsIGxvb2sgZm9yIGEgcmlnaHQgc2lkZSBlbnRyeS4KKwkJICovCisJCWlmIChsdGxlbmEgPj0gYXJncy0+bWlubGVuKSB7CisJCQkvKgorCQkJICogRml4IHVwIHRoZSBsZW5ndGguCisJCQkgKi8KKwkJCWFyZ3MtPmxlbiA9IFhGU19FWFRMRU5fTUlOKGx0bGVuYSwgYXJncy0+bWF4bGVuKTsKKwkJCXhmc19hbGxvY19maXhfbGVuKGFyZ3MpOworCQkJcmxlbiA9IGFyZ3MtPmxlbjsKKwkJCWx0ZGlmZiA9IHhmc19hbGxvY19jb21wdXRlX2RpZmYoYXJncy0+YWdibm8sIHJsZW4sCisJCQkJYXJncy0+YWxpZ25tZW50LCBsdGJubywgbHRsZW4sICZsdG5ldyk7CisJCQkvKgorCQkJICogTm90IHBlcmZlY3QuCisJCQkgKi8KKwkJCWlmIChsdGRpZmYpIHsKKwkJCQkvKgorCQkJCSAqIExvb2sgdW50aWwgd2UgZmluZCBhIGJldHRlciBvbmUsIHJ1biBvdXQgb2YKKwkJCQkgKiBzcGFjZSwgb3IgcnVuIG9mZiB0aGUgZW5kLgorCQkJCSAqLworCQkJCXdoaWxlIChibm9fY3VyX2x0ICYmIGJub19jdXJfZ3QpIHsKKwkJCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfcmVjKAorCQkJCQkJCWJub19jdXJfZ3QsICZndGJubywKKwkJCQkJCQkmZ3RsZW4sICZpKSkpCisJCQkJCQlnb3RvIGVycm9yMDsKKwkJCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQkJCQl4ZnNfYWxsb2NfY29tcHV0ZV9hbGlnbmVkKGd0Ym5vLCBndGxlbiwKKwkJCQkJCWFyZ3MtPmFsaWdubWVudCwgYXJncy0+bWlubGVuLAorCQkJCQkJJmd0Ym5vYSwgJmd0bGVuYSk7CisJCQkJCS8qCisJCQkJCSAqIFRoZSBsZWZ0IG9uZSBpcyBjbGVhcmx5IGJldHRlci4KKwkJCQkJICovCisJCQkJCWlmIChndGJub2EgPj0gYXJncy0+YWdibm8gKyBsdGRpZmYpIHsKKwkJCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKAorCQkJCQkJCWJub19jdXJfZ3QsCisJCQkJCQkJWEZTX0JUUkVFX05PRVJST1IpOworCQkJCQkJYm5vX2N1cl9ndCA9IE5VTEw7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkvKgorCQkJCQkgKiBJZiB3ZSByZWFjaCBhIGJpZyBlbm91Z2ggZW50cnksCisJCQkJCSAqIGNvbXBhcmUgdGhlIHR3byBhbmQgcGljayB0aGUgYmVzdC4KKwkJCQkJICovCisJCQkJCWlmIChndGxlbmEgPj0gYXJncy0+bWlubGVuKSB7CisJCQkJCQlhcmdzLT5sZW4gPQorCQkJCQkJCVhGU19FWFRMRU5fTUlOKGd0bGVuYSwKKwkJCQkJCQkJYXJncy0+bWF4bGVuKTsKKwkJCQkJCXhmc19hbGxvY19maXhfbGVuKGFyZ3MpOworCQkJCQkJcmxlbiA9IGFyZ3MtPmxlbjsKKwkJCQkJCWd0ZGlmZiA9IHhmc19hbGxvY19jb21wdXRlX2RpZmYoCisJCQkJCQkJYXJncy0+YWdibm8sIHJsZW4sCisJCQkJCQkJYXJncy0+YWxpZ25tZW50LAorCQkJCQkJCWd0Ym5vLCBndGxlbiwgJmd0bmV3KTsKKwkJCQkJCS8qCisJCQkJCQkgKiBSaWdodCBzaWRlIGlzIGJldHRlci4KKwkJCQkJCSAqLworCQkJCQkJaWYgKGd0ZGlmZiA8IGx0ZGlmZikgeworCQkJCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKAorCQkJCQkJCQlibm9fY3VyX2x0LAorCQkJCQkJCQlYRlNfQlRSRUVfTk9FUlJPUik7CisJCQkJCQkJYm5vX2N1cl9sdCA9IE5VTEw7CisJCQkJCQl9CisJCQkJCQkvKgorCQkJCQkJICogTGVmdCBzaWRlIGlzIGJldHRlci4KKwkJCQkJCSAqLworCQkJCQkJZWxzZSB7CisJCQkJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoCisJCQkJCQkJCWJub19jdXJfZ3QsCisJCQkJCQkJCVhGU19CVFJFRV9OT0VSUk9SKTsKKwkJCQkJCQlibm9fY3VyX2d0ID0gTlVMTDsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS8qCisJCQkJCSAqIEZlbGwgb2ZmIHRoZSByaWdodCBlbmQuCisJCQkJCSAqLworCQkJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2luY3JlbWVudCgKKwkJCQkJCQlibm9fY3VyX2d0LCAwLCAmaSkpKQorCQkJCQkJZ290byBlcnJvcjA7CisJCQkJCWlmICghaSkgeworCQkJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoCisJCQkJCQkJYm5vX2N1cl9ndCwKKwkJCQkJCQlYRlNfQlRSRUVfTk9FUlJPUik7CisJCQkJCQlibm9fY3VyX2d0ID0gTlVMTDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJLyoKKwkJCSAqIFRoZSBsZWZ0IHNpZGUgaXMgcGVyZmVjdCwgdHJhc2ggdGhlIHJpZ2h0IHNpZGUuCisJCQkgKi8KKwkJCWVsc2UgeworCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXJfZ3QsCisJCQkJCQkgICAgIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJCQlibm9fY3VyX2d0ID0gTlVMTDsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiBJdCdzIHRoZSByaWdodCBzaWRlIHRoYXQgd2FzIGZvdW5kIGZpcnN0LCBsb29rIGxlZnQuCisJCSAqLworCQllbHNlIHsKKwkJCS8qCisJCQkgKiBGaXggdXAgdGhlIGxlbmd0aC4KKwkJCSAqLworCQkJYXJncy0+bGVuID0gWEZTX0VYVExFTl9NSU4oZ3RsZW5hLCBhcmdzLT5tYXhsZW4pOworCQkJeGZzX2FsbG9jX2ZpeF9sZW4oYXJncyk7CisJCQlybGVuID0gYXJncy0+bGVuOworCQkJZ3RkaWZmID0geGZzX2FsbG9jX2NvbXB1dGVfZGlmZihhcmdzLT5hZ2JubywgcmxlbiwKKwkJCQlhcmdzLT5hbGlnbm1lbnQsIGd0Ym5vLCBndGxlbiwgJmd0bmV3KTsKKwkJCS8qCisJCQkgKiBSaWdodCBzaWRlIGVudHJ5IGlzbid0IHBlcmZlY3QuCisJCQkgKi8KKwkJCWlmIChndGRpZmYpIHsKKwkJCQkvKgorCQkJCSAqIExvb2sgdW50aWwgd2UgZmluZCBhIGJldHRlciBvbmUsIHJ1biBvdXQgb2YKKwkJCQkgKiBzcGFjZSwgb3IgcnVuIG9mZiB0aGUgZW5kLgorCQkJCSAqLworCQkJCXdoaWxlIChibm9fY3VyX2x0ICYmIGJub19jdXJfZ3QpIHsKKwkJCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfcmVjKAorCQkJCQkJCWJub19jdXJfbHQsICZsdGJubywKKwkJCQkJCQkmbHRsZW4sICZpKSkpCisJCQkJCQlnb3RvIGVycm9yMDsKKwkJCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQkJCQl4ZnNfYWxsb2NfY29tcHV0ZV9hbGlnbmVkKGx0Ym5vLCBsdGxlbiwKKwkJCQkJCWFyZ3MtPmFsaWdubWVudCwgYXJncy0+bWlubGVuLAorCQkJCQkJJmx0Ym5vYSwgJmx0bGVuYSk7CisJCQkJCS8qCisJCQkJCSAqIFRoZSByaWdodCBvbmUgaXMgY2xlYXJseSBiZXR0ZXIuCisJCQkJCSAqLworCQkJCQlpZiAobHRibm9hIDw9IGFyZ3MtPmFnYm5vIC0gZ3RkaWZmKSB7CisJCQkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcigKKwkJCQkJCQlibm9fY3VyX2x0LAorCQkJCQkJCVhGU19CVFJFRV9OT0VSUk9SKTsKKwkJCQkJCWJub19jdXJfbHQgPSBOVUxMOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLyoKKwkJCQkJICogSWYgd2UgcmVhY2ggYSBiaWcgZW5vdWdoIGVudHJ5LAorCQkJCQkgKiBjb21wYXJlIHRoZSB0d28gYW5kIHBpY2sgdGhlIGJlc3QuCisJCQkJCSAqLworCQkJCQlpZiAobHRsZW5hID49IGFyZ3MtPm1pbmxlbikgeworCQkJCQkJYXJncy0+bGVuID0gWEZTX0VYVExFTl9NSU4oCisJCQkJCQkJbHRsZW5hLCBhcmdzLT5tYXhsZW4pOworCQkJCQkJeGZzX2FsbG9jX2ZpeF9sZW4oYXJncyk7CisJCQkJCQlybGVuID0gYXJncy0+bGVuOworCQkJCQkJbHRkaWZmID0geGZzX2FsbG9jX2NvbXB1dGVfZGlmZigKKwkJCQkJCQlhcmdzLT5hZ2JubywgcmxlbiwKKwkJCQkJCQlhcmdzLT5hbGlnbm1lbnQsCisJCQkJCQkJbHRibm8sIGx0bGVuLCAmbHRuZXcpOworCQkJCQkJLyoKKwkJCQkJCSAqIExlZnQgc2lkZSBpcyBiZXR0ZXIuCisJCQkJCQkgKi8KKwkJCQkJCWlmIChsdGRpZmYgPCBndGRpZmYpIHsKKwkJCQkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcigKKwkJCQkJCQkJYm5vX2N1cl9ndCwKKwkJCQkJCQkJWEZTX0JUUkVFX05PRVJST1IpOworCQkJCQkJCWJub19jdXJfZ3QgPSBOVUxMOworCQkJCQkJfQorCQkJCQkJLyoKKwkJCQkJCSAqIFJpZ2h0IHNpZGUgaXMgYmV0dGVyLgorCQkJCQkJICovCisJCQkJCQllbHNlIHsKKwkJCQkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcigKKwkJCQkJCQkJYm5vX2N1cl9sdCwKKwkJCQkJCQkJWEZTX0JUUkVFX05PRVJST1IpOworCQkJCQkJCWJub19jdXJfbHQgPSBOVUxMOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLyoKKwkJCQkJICogRmVsbCBvZmYgdGhlIGxlZnQgZW5kLgorCQkJCQkgKi8KKwkJCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19kZWNyZW1lbnQoCisJCQkJCQkJYm5vX2N1cl9sdCwgMCwgJmkpKSkKKwkJCQkJCWdvdG8gZXJyb3IwOworCQkJCQlpZiAoIWkpIHsKKwkJCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXJfbHQsCisJCQkJCQkJWEZTX0JUUkVFX05PRVJST1IpOworCQkJCQkJYm5vX2N1cl9sdCA9IE5VTEw7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8qCisJCQkgKiBUaGUgcmlnaHQgc2lkZSBpcyBwZXJmZWN0LCB0cmFzaCB0aGUgbGVmdCBzaWRlLgorCQkJICovCisJCQllbHNlIHsKKwkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyX2x0LAorCQkJCQlYRlNfQlRSRUVfTk9FUlJPUik7CisJCQkJYm5vX2N1cl9sdCA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisJLyoKKwkgKiBJZiB3ZSBjb3VsZG4ndCBnZXQgYW55dGhpbmcsIGdpdmUgdXAuCisJICovCisJaWYgKGJub19jdXJfbHQgPT0gTlVMTCAmJiBibm9fY3VyX2d0ID09IE5VTEwpIHsKKwkJVFJBQ0VfQUxMT0MoIm5laXRoZXIiLCBhcmdzKTsKKwkJYXJncy0+YWdibm8gPSBOVUxMQUdCTE9DSzsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIHNlbGVjdGVkIGEgZnJlZXNwYWNlIGVudHJ5LCBlaXRoZXIgdG8gdGhlCisJICogbGVmdCBvciB0byB0aGUgcmlnaHQuICBJZiBpdCdzIG9uIHRoZSByaWdodCwgY29weSBhbGwgdGhlCisJICogdXNlZnVsIHZhcmlhYmxlcyB0byB0aGUgImxlZnQiIHNldCBzbyB3ZSBvbmx5IGhhdmUgb25lCisJICogY29weSBvZiB0aGlzIGNvZGUuCisJICovCisJaWYgKGJub19jdXJfZ3QpIHsKKwkJYm5vX2N1cl9sdCA9IGJub19jdXJfZ3Q7CisJCWJub19jdXJfZ3QgPSBOVUxMOworCQlsdGJubyA9IGd0Ym5vOworCQlsdGJub2EgPSBndGJub2E7CisJCWx0bGVuID0gZ3RsZW47CisJCWx0bGVuYSA9IGd0bGVuYTsKKwkJaiA9IDE7CisJfSBlbHNlCisJCWogPSAwOworCS8qCisJICogRml4IHVwIHRoZSBsZW5ndGggYW5kIGNvbXB1dGUgdGhlIHVzZWZ1bCBhZGRyZXNzLgorCSAqLworCWx0ZW5kID0gbHRibm8gKyBsdGxlbjsKKwlhcmdzLT5sZW4gPSBYRlNfRVhUTEVOX01JTihsdGxlbmEsIGFyZ3MtPm1heGxlbik7CisJeGZzX2FsbG9jX2ZpeF9sZW4oYXJncyk7CisJaWYgKCF4ZnNfYWxsb2NfZml4X21pbmxlZnQoYXJncykpIHsKKwkJVFJBQ0VfQUxMT0MoIm5vbWlubGVmdCIsIGFyZ3MpOworCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyX2x0LCBYRlNfQlRSRUVfTk9FUlJPUik7CisJCXhmc19idHJlZV9kZWxfY3Vyc29yKGNudF9jdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJcmV0dXJuIDA7CisJfQorCXJsZW4gPSBhcmdzLT5sZW47CisJKHZvaWQpeGZzX2FsbG9jX2NvbXB1dGVfZGlmZihhcmdzLT5hZ2JubywgcmxlbiwgYXJncy0+YWxpZ25tZW50LCBsdGJubywKKwkJbHRsZW4sICZsdG5ldyk7CisJQVNTRVJUKGx0bmV3ID49IGx0Ym5vKTsKKwlBU1NFUlQobHRuZXcgKyBybGVuIDw9IGx0ZW5kKTsKKwlBU1NFUlQobHRuZXcgKyBybGVuIDw9IElOVF9HRVQoWEZTX0JVRl9UT19BR0YoYXJncy0+YWdicCktPmFnZl9sZW5ndGgsCisJCUFSQ0hfQ09OVkVSVCkpOworCWFyZ3MtPmFnYm5vID0gbHRuZXc7CisJaWYgKChlcnJvciA9IHhmc19hbGxvY19maXh1cF90cmVlcyhjbnRfY3VyLCBibm9fY3VyX2x0LCBsdGJubywgbHRsZW4sCisJCQlsdG5ldywgcmxlbiwgWEZTQV9GSVhVUF9CTk9fT0spKSkKKwkJZ290byBlcnJvcjA7CisJVFJBQ0VfQUxMT0MoaiA/ICJndCIgOiAibHQiLCBhcmdzKTsKKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjbnRfY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IoYm5vX2N1cl9sdCwgWEZTX0JUUkVFX05PRVJST1IpOworCXJldHVybiAwOworCisgZXJyb3IwOgorCVRSQUNFX0FMTE9DKCJlcnJvciIsIGFyZ3MpOworCWlmIChjbnRfY3VyICE9IE5VTEwpCisJCXhmc19idHJlZV9kZWxfY3Vyc29yKGNudF9jdXIsIFhGU19CVFJFRV9FUlJPUik7CisJaWYgKGJub19jdXJfbHQgIT0gTlVMTCkKKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoYm5vX2N1cl9sdCwgWEZTX0JUUkVFX0VSUk9SKTsKKwlpZiAoYm5vX2N1cl9ndCAhPSBOVUxMKQorCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyX2d0LCBYRlNfQlRSRUVfRVJST1IpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgdmFyaWFibGUgZXh0ZW50IGFueXdoZXJlIGluIHRoZSBhbGxvY2F0aW9uIGdyb3VwIGFnbm8uCisgKiBFeHRlbnQncyBsZW5ndGggKHJldHVybmVkIGluIGxlbikgd2lsbCBiZSBiZXR3ZWVuIG1pbmxlbiBhbmQgbWF4bGVuLAorICogYW5kIG9mIHRoZSBmb3JtIGsgKiBwcm9kICsgbW9kIHVubGVzcyB0aGVyZSdzIG5vdGhpbmcgdGhhdCBsYXJnZS4KKyAqIFJldHVybiB0aGUgc3RhcnRpbmcgYS5nLiBibG9jaywgb3IgTlVMTEFHQkxPQ0sgaWYgd2UgY2FuJ3QgZG8gaXQuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19hZ192ZXh0ZW50X3NpemUoCisJeGZzX2FsbG9jX2FyZ190CSphcmdzKQkJLyogYWxsb2NhdGlvbiBhcmd1bWVudCBzdHJ1Y3R1cmUgKi8KK3sKKwl4ZnNfYnRyZWVfY3VyX3QJKmJub19jdXI7CS8qIGN1cnNvciBmb3IgYm5vIGJ0cmVlICovCisJeGZzX2J0cmVlX2N1cl90CSpjbnRfY3VyOwkvKiBjdXJzb3IgZm9yIGNudCBidHJlZSAqLworCWludAkJZXJyb3I7CQkvKiBlcnJvciByZXN1bHQgKi8KKwl4ZnNfYWdibG9ja190CWZibm87CQkvKiBzdGFydCBvZiBmb3VuZCBmcmVlc3BhY2UgKi8KKwl4ZnNfZXh0bGVuX3QJZmxlbjsJCS8qIGxlbmd0aCBvZiBmb3VuZCBmcmVlc3BhY2UgKi8KKyNpZmRlZiBYRlNfQUxMT0NfVFJBQ0UKKwlzdGF0aWMgY2hhcglmbmFtZVtdID0gInhmc19hbGxvY19hZ192ZXh0ZW50X3NpemUiOworI2VuZGlmCisJaW50CQlpOwkJLyogdGVtcCBzdGF0dXMgdmFyaWFibGUgKi8KKwl4ZnNfYWdibG9ja190CXJibm87CQkvKiByZXR1cm5lZCBibG9jayBudW1iZXIgKi8KKwl4ZnNfZXh0bGVuX3QJcmxlbjsJCS8qIGxlbmd0aCBvZiByZXR1cm5lZCBleHRlbnQgKi8KKworCS8qCisJICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBjdXJzb3IgZm9yIHRoZSBieS1zaXplIGJ0cmVlLgorCSAqLworCWNudF9jdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IoYXJncy0+bXAsIGFyZ3MtPnRwLCBhcmdzLT5hZ2JwLAorCQlhcmdzLT5hZ25vLCBYRlNfQlROVU1fQ05ULCBOVUxMLCAwKTsKKwlibm9fY3VyID0gTlVMTDsKKwkvKgorCSAqIExvb2sgZm9yIGFuIGVudHJ5ID49IG1heGxlbithbGlnbm1lbnQtMSBibG9ja3MuCisJICovCisJaWYgKChlcnJvciA9IHhmc19hbGxvY19sb29rdXBfZ2UoY250X2N1ciwgMCwKKwkJCWFyZ3MtPm1heGxlbiArIGFyZ3MtPmFsaWdubWVudCAtIDEsICZpKSkpCisJCWdvdG8gZXJyb3IwOworCS8qCisJICogSWYgbm9uZSwgdGhlbiBwaWNrIHVwIHRoZSBsYXN0IGVudHJ5IGluIHRoZSB0cmVlIHVubGVzcyB0aGUKKwkgKiB0cmVlIGlzIGVtcHR5LgorCSAqLworCWlmICghaSkgeworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2FnX3ZleHRlbnRfc21hbGwoYXJncywgY250X2N1ciwgJmZibm8sCisJCQkJJmZsZW4sICZpKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJaWYgKGkgPT0gMCB8fCBmbGVuID09IDApIHsKKwkJCXhmc19idHJlZV9kZWxfY3Vyc29yKGNudF9jdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJCVRSQUNFX0FMTE9DKCJub2VudHJ5IiwgYXJncyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlBU1NFUlQoaSA9PSAxKTsKKwl9CisJLyoKKwkgKiBUaGVyZSdzIGEgZnJlZXNwYWNlIGFzIGJpZyBhcyBtYXhsZW4rYWxpZ25tZW50LTEsIGdldCBpdC4KKwkgKi8KKwllbHNlIHsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfcmVjKGNudF9jdXIsICZmYm5vLCAmZmxlbiwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJfQorCS8qCisJICogSW4gdGhlIGZpcnN0IGNhc2UgYWJvdmUsIHdlIGdvdCB0aGUgbGFzdCBlbnRyeSBpbiB0aGUKKwkgKiBieS1zaXplIGJ0cmVlLiAgTm93IHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgc3BhY2UgaGl0cyBtYXhsZW4KKwkgKiBvbmNlIGFsaWduZWQ7IGlmIG5vdCwgd2Ugc2VhcmNoIGxlZnQgZm9yIHNvbWV0aGluZyBiZXR0ZXIuCisJICogVGhpcyBjYW4ndCBoYXBwZW4gaW4gdGhlIHNlY29uZCBjYXNlIGFib3ZlLgorCSAqLworCXhmc19hbGxvY19jb21wdXRlX2FsaWduZWQoZmJubywgZmxlbiwgYXJncy0+YWxpZ25tZW50LCBhcmdzLT5taW5sZW4sCisJCSZyYm5vLCAmcmxlbik7CisJcmxlbiA9IFhGU19FWFRMRU5fTUlOKGFyZ3MtPm1heGxlbiwgcmxlbik7CisJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8ocmxlbiA9PSAwIHx8CisJCQkocmxlbiA8PSBmbGVuICYmIHJibm8gKyBybGVuIDw9IGZibm8gKyBmbGVuKSwgZXJyb3IwKTsKKwlpZiAocmxlbiA8IGFyZ3MtPm1heGxlbikgeworCQl4ZnNfYWdibG9ja190CWJlc3RmYm5vOworCQl4ZnNfZXh0bGVuX3QJYmVzdGZsZW47CisJCXhmc19hZ2Jsb2NrX3QJYmVzdHJibm87CisJCXhmc19leHRsZW5fdAliZXN0cmxlbjsKKworCQliZXN0cmxlbiA9IHJsZW47CisJCWJlc3RyYm5vID0gcmJubzsKKwkJYmVzdGZsZW4gPSBmbGVuOworCQliZXN0ZmJubyA9IGZibm87CisJCWZvciAoOzspIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZGVjcmVtZW50KGNudF9jdXIsIDAsICZpKSkpCisJCQkJZ290byBlcnJvcjA7CisJCQlpZiAoaSA9PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfcmVjKGNudF9jdXIsICZmYm5vLCAmZmxlbiwKKwkJCQkJJmkpKSkKKwkJCQlnb3RvIGVycm9yMDsKKwkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJCWlmIChmbGVuIDwgYmVzdHJsZW4pCisJCQkJYnJlYWs7CisJCQl4ZnNfYWxsb2NfY29tcHV0ZV9hbGlnbmVkKGZibm8sIGZsZW4sIGFyZ3MtPmFsaWdubWVudCwKKwkJCQlhcmdzLT5taW5sZW4sICZyYm5vLCAmcmxlbik7CisJCQlybGVuID0gWEZTX0VYVExFTl9NSU4oYXJncy0+bWF4bGVuLCBybGVuKTsKKwkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKHJsZW4gPT0gMCB8fAorCQkJCShybGVuIDw9IGZsZW4gJiYgcmJubyArIHJsZW4gPD0gZmJubyArIGZsZW4pLAorCQkJCWVycm9yMCk7CisJCQlpZiAocmxlbiA+IGJlc3RybGVuKSB7CisJCQkJYmVzdHJsZW4gPSBybGVuOworCQkJCWJlc3RyYm5vID0gcmJubzsKKwkJCQliZXN0ZmxlbiA9IGZsZW47CisJCQkJYmVzdGZibm8gPSBmYm5vOworCQkJCWlmIChybGVuID09IGFyZ3MtPm1heGxlbikKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19sb29rdXBfZXEoY250X2N1ciwgYmVzdGZibm8sIGJlc3RmbGVuLAorCQkJCSZpKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQlybGVuID0gYmVzdHJsZW47CisJCXJibm8gPSBiZXN0cmJubzsKKwkJZmxlbiA9IGJlc3RmbGVuOworCQlmYm5vID0gYmVzdGZibm87CisJfQorCWFyZ3MtPndhc2Zyb21mbCA9IDA7CisJLyoKKwkgKiBGaXggdXAgdGhlIGxlbmd0aC4KKwkgKi8KKwlhcmdzLT5sZW4gPSBybGVuOworCXhmc19hbGxvY19maXhfbGVuKGFyZ3MpOworCWlmIChybGVuIDwgYXJncy0+bWlubGVuIHx8ICF4ZnNfYWxsb2NfZml4X21pbmxlZnQoYXJncykpIHsKKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY250X2N1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCQlUUkFDRV9BTExPQygibm9taW5sZWZ0IiwgYXJncyk7CisJCWFyZ3MtPmFnYm5vID0gTlVMTEFHQkxPQ0s7CisJCXJldHVybiAwOworCX0KKwlybGVuID0gYXJncy0+bGVuOworCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKHJsZW4gPD0gZmxlbiwgZXJyb3IwKTsKKwkvKgorCSAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgY3Vyc29yIGZvciB0aGUgYnktYmxvY2sgdHJlZS4KKwkgKi8KKwlibm9fY3VyID0geGZzX2J0cmVlX2luaXRfY3Vyc29yKGFyZ3MtPm1wLCBhcmdzLT50cCwgYXJncy0+YWdicCwKKwkJYXJncy0+YWdubywgWEZTX0JUTlVNX0JOTywgTlVMTCwgMCk7CisJaWYgKChlcnJvciA9IHhmc19hbGxvY19maXh1cF90cmVlcyhjbnRfY3VyLCBibm9fY3VyLCBmYm5vLCBmbGVuLAorCQkJcmJubywgcmxlbiwgWEZTQV9GSVhVUF9DTlRfT0spKSkKKwkJZ290byBlcnJvcjA7CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY250X2N1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwljbnRfY3VyID0gYm5vX2N1ciA9IE5VTEw7CisJYXJncy0+bGVuID0gcmxlbjsKKwlhcmdzLT5hZ2JubyA9IHJibm87CisJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oCisJCWFyZ3MtPmFnYm5vICsgYXJncy0+bGVuIDw9CisJCQlJTlRfR0VUKFhGU19CVUZfVE9fQUdGKGFyZ3MtPmFnYnApLT5hZ2ZfbGVuZ3RoLAorCQkJQVJDSF9DT05WRVJUKSwKKwkJZXJyb3IwKTsKKwlUUkFDRV9BTExPQygibm9ybWFsIiwgYXJncyk7CisJcmV0dXJuIDA7CisKK2Vycm9yMDoKKwlUUkFDRV9BTExPQygiZXJyb3IiLCBhcmdzKTsKKwlpZiAoY250X2N1cikKKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY250X2N1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwlpZiAoYm5vX2N1cikKKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoYm5vX2N1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBEZWFsIHdpdGggdGhlIGNhc2Ugd2hlcmUgb25seSBzbWFsbCBmcmVlc3BhY2VzIHJlbWFpbi4KKyAqIEVpdGhlciByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBsYXN0IGZyZWVzcGFjZSByZWNvcmQsCisgKiBvciBhbGxvY2F0ZSBzcGFjZSBmcm9tIHRoZSBmcmVlbGlzdCBpZiB0aGVyZSBpcyBub3RoaW5nIGluIHRoZSB0cmVlLgorICovCitTVEFUSUMgaW50CQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19hZ192ZXh0ZW50X3NtYWxsKAorCXhmc19hbGxvY19hcmdfdAkqYXJncywJLyogYWxsb2NhdGlvbiBhcmd1bWVudCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJKmNjdXIsCS8qIGJ5LXNpemUgY3Vyc29yICovCisJeGZzX2FnYmxvY2tfdAkqZmJub3AsCS8qIHJlc3VsdCBibG9jayBudW1iZXIgKi8KKwl4ZnNfZXh0bGVuX3QJKmZsZW5wLAkvKiByZXN1bHQgbGVuZ3RoICovCisJaW50CQkqc3RhdCkJLyogc3RhdHVzOiAwLWZyZWVsaXN0LCAxLW5vcm1hbC9ub25lICovCit7CisJaW50CQllcnJvcjsKKwl4ZnNfYWdibG9ja190CWZibm87CisJeGZzX2V4dGxlbl90CWZsZW47CisjaWZkZWYgWEZTX0FMTE9DX1RSQUNFCisJc3RhdGljIGNoYXIJZm5hbWVbXSA9ICJ4ZnNfYWxsb2NfYWdfdmV4dGVudF9zbWFsbCI7CisjZW5kaWYKKwlpbnQJCWk7CisKKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX2RlY3JlbWVudChjY3VyLCAwLCAmaSkpKQorCQlnb3RvIGVycm9yMDsKKwlpZiAoaSkgeworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2dldF9yZWMoY2N1ciwgJmZibm8sICZmbGVuLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwl9CisJLyoKKwkgKiBOb3RoaW5nIGluIHRoZSBidHJlZSwgdHJ5IHRoZSBmcmVlbGlzdC4gIE1ha2Ugc3VyZQorCSAqIHRvIHJlc3BlY3QgbWlubGVmdCBldmVuIHdoZW4gcHVsbGluZyBmcm9tIHRoZQorCSAqIGZyZWVsaXN0LgorCSAqLworCWVsc2UgaWYgKGFyZ3MtPm1pbmxlbiA9PSAxICYmIGFyZ3MtPmFsaWdubWVudCA9PSAxICYmICFhcmdzLT5pc2ZsICYmCisJCSAoSU5UX0dFVChYRlNfQlVGX1RPX0FHRihhcmdzLT5hZ2JwKS0+YWdmX2ZsY291bnQsCisJCQlBUkNIX0NPTlZFUlQpID4gYXJncy0+bWlubGVmdCkpIHsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfZnJlZWxpc3QoYXJncy0+dHAsIGFyZ3MtPmFnYnAsICZmYm5vKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJaWYgKGZibm8gIT0gTlVMTEFHQkxPQ0spIHsKKwkJCWlmIChhcmdzLT51c2VyZGF0YSkgeworCQkJCXhmc19idWZfdAkqYnA7CisKKwkJCQlicCA9IHhmc19idHJlZV9nZXRfYnVmcyhhcmdzLT5tcCwgYXJncy0+dHAsCisJCQkJCWFyZ3MtPmFnbm8sIGZibm8sIDApOworCQkJCXhmc190cmFuc19iaW52YWwoYXJncy0+dHAsIGJwKTsKKwkJCX0KKwkJCWFyZ3MtPmxlbiA9IDE7CisJCQlhcmdzLT5hZ2JubyA9IGZibm87CisJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTygKKwkJCQlhcmdzLT5hZ2JubyArIGFyZ3MtPmxlbiA8PQorCQkJCUlOVF9HRVQoWEZTX0JVRl9UT19BR0YoYXJncy0+YWdicCktPmFnZl9sZW5ndGgsCisJCQkJCUFSQ0hfQ09OVkVSVCksCisJCQkJZXJyb3IwKTsKKwkJCWFyZ3MtPndhc2Zyb21mbCA9IDE7CisJCQlUUkFDRV9BTExPQygiZnJlZWxpc3QiLCBhcmdzKTsKKwkJCSpzdGF0ID0gMDsKKwkJCXJldHVybiAwOworCQl9CisJCS8qCisJCSAqIE5vdGhpbmcgaW4gdGhlIGZyZWVsaXN0LgorCQkgKi8KKwkJZWxzZQorCQkJZmxlbiA9IDA7CisJfQorCS8qCisJICogQ2FuJ3QgYWxsb2NhdGUgZnJvbSB0aGUgZnJlZWxpc3QgZm9yIHNvbWUgcmVhc29uLgorCSAqLworCWVsc2UKKwkJZmxlbiA9IDA7CisJLyoKKwkgKiBDYW4ndCBkbyB0aGUgYWxsb2NhdGlvbiwgZ2l2ZSB1cC4KKwkgKi8KKwlpZiAoZmxlbiA8IGFyZ3MtPm1pbmxlbikgeworCQlhcmdzLT5hZ2JubyA9IE5VTExBR0JMT0NLOworCQlUUkFDRV9BTExPQygibm90ZW5vdWdoIiwgYXJncyk7CisJCWZsZW4gPSAwOworCX0KKwkqZmJub3AgPSBmYm5vOworCSpmbGVucCA9IGZsZW47CisJKnN0YXQgPSAxOworCVRSQUNFX0FMTE9DKCJub3JtYWwiLCBhcmdzKTsKKwlyZXR1cm4gMDsKKworZXJyb3IwOgorCVRSQUNFX0FMTE9DKCJlcnJvciIsIGFyZ3MpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEZyZWUgdGhlIGV4dGVudCBzdGFydGluZyBhdCBhZ25vL2JubyBmb3IgbGVuZ3RoLgorICovCitTVEFUSUMgaW50CQkJLyogZXJyb3IgKi8KK3hmc19mcmVlX2FnX2V4dGVudCgKKwl4ZnNfdHJhbnNfdAkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfYnVmX3QJKmFnYnAsCS8qIGJ1ZmZlciBmb3IgYS5nLiBmcmVlbGlzdCBoZWFkZXIgKi8KKwl4ZnNfYWdudW1iZXJfdAlhZ25vLAkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCXhmc19hZ2Jsb2NrX3QJYm5vLAkvKiBzdGFydGluZyBibG9jayBudW1iZXIgKi8KKwl4ZnNfZXh0bGVuX3QJbGVuLAkvKiBsZW5ndGggb2YgZXh0ZW50ICovCisJaW50CQlpc2ZsKQkvKiBzZXQgaWYgaXMgZnJlZWxpc3QgYmxvY2tzIC0gbm8gc2IgYWNjdGcgKi8KK3sKKwl4ZnNfYnRyZWVfY3VyX3QJKmJub19jdXI7CS8qIGN1cnNvciBmb3IgYnktYmxvY2sgYnRyZWUgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJKmNudF9jdXI7CS8qIGN1cnNvciBmb3IgYnktc2l6ZSBidHJlZSAqLworCWludAkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKyNpZmRlZiBYRlNfQUxMT0NfVFJBQ0UKKwlzdGF0aWMgY2hhcglmbmFtZVtdID0gInhmc19mcmVlX2FnX2V4dGVudCI7CisjZW5kaWYKKwl4ZnNfYWdibG9ja190CWd0Ym5vOwkJLyogc3RhcnQgb2YgcmlnaHQgbmVpZ2hib3IgYmxvY2sgKi8KKwl4ZnNfZXh0bGVuX3QJZ3RsZW47CQkvKiBsZW5ndGggb2YgcmlnaHQgbmVpZ2hib3IgYmxvY2sgKi8KKwlpbnQJCWhhdmVsZWZ0OwkvKiBoYXZlIGEgbGVmdCBuZWlnaGJvciBibG9jayAqLworCWludAkJaGF2ZXJpZ2h0OwkvKiBoYXZlIGEgcmlnaHQgbmVpZ2hib3IgYmxvY2sgKi8KKwlpbnQJCWk7CQkvKiB0ZW1wLCByZXN1bHQgY29kZSAqLworCXhmc19hZ2Jsb2NrX3QJbHRibm87CQkvKiBzdGFydCBvZiBsZWZ0IG5laWdoYm9yIGJsb2NrICovCisJeGZzX2V4dGxlbl90CWx0bGVuOwkJLyogbGVuZ3RoIG9mIGxlZnQgbmVpZ2hib3IgYmxvY2sgKi8KKwl4ZnNfbW91bnRfdAkqbXA7CQkvKiBtb3VudCBwb2ludCBzdHJ1Y3QgZm9yIGZpbGVzeXN0ZW0gKi8KKwl4ZnNfYWdibG9ja190CW5ibm87CQkvKiBuZXcgc3RhcnRpbmcgYmxvY2sgb2YgZnJlZXNwYWNlICovCisJeGZzX2V4dGxlbl90CW5sZW47CQkvKiBuZXcgbGVuZ3RoIG9mIGZyZWVzcGFjZSAqLworCisJbXAgPSB0cC0+dF9tb3VudHA7CisJLyoKKwkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIGN1cnNvciBmb3IgdGhlIGJ5LWJsb2NrIGJ0cmVlLgorCSAqLworCWJub19jdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IobXAsIHRwLCBhZ2JwLCBhZ25vLCBYRlNfQlROVU1fQk5PLCBOVUxMLAorCQkwKTsKKwljbnRfY3VyID0gTlVMTDsKKwkvKgorCSAqIExvb2sgZm9yIGEgbmVpZ2hib3JpbmcgYmxvY2sgb24gdGhlIGxlZnQgKGxvd2VyIGJsb2NrIG51bWJlcnMpCisJICogdGhhdCBpcyBjb250aWd1b3VzIHdpdGggdGhpcyBzcGFjZS4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX2xvb2t1cF9sZShibm9fY3VyLCBibm8sIGxlbiwgJmhhdmVsZWZ0KSkpCisJCWdvdG8gZXJyb3IwOworCWlmIChoYXZlbGVmdCkgeworCQkvKgorCQkgKiBUaGVyZSBpcyBhIGJsb2NrIHRvIG91ciBsZWZ0LgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfcmVjKGJub19jdXIsICZsdGJubywgJmx0bGVuLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJLyoKKwkJICogSXQncyBub3QgY29udGlndW91cywgdGhvdWdoLgorCQkgKi8KKwkJaWYgKGx0Ym5vICsgbHRsZW4gPCBibm8pCisJCQloYXZlbGVmdCA9IDA7CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIElmIHRoaXMgZmFpbHVyZSBoYXBwZW5zIHRoZSByZXF1ZXN0IHRvIGZyZWUgdGhpcworCQkJICogc3BhY2Ugd2FzIGludmFsaWQsIGl0J3MgKHBhcnRseSkgYWxyZWFkeSBmcmVlLgorCQkJICogVmVyeSBiYWQuCisJCQkgKi8KKwkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGx0Ym5vICsgbHRsZW4gPD0gYm5vLCBlcnJvcjApOworCQl9CisJfQorCS8qCisJICogTG9vayBmb3IgYSBuZWlnaGJvcmluZyBibG9jayBvbiB0aGUgcmlnaHQgKGhpZ2hlciBibG9jayBudW1iZXJzKQorCSAqIHRoYXQgaXMgY29udGlndW91cyB3aXRoIHRoaXMgc3BhY2UuCisJICovCisJaWYgKChlcnJvciA9IHhmc19hbGxvY19pbmNyZW1lbnQoYm5vX2N1ciwgMCwgJmhhdmVyaWdodCkpKQorCQlnb3RvIGVycm9yMDsKKwlpZiAoaGF2ZXJpZ2h0KSB7CisJCS8qCisJCSAqIFRoZXJlIGlzIGEgYmxvY2sgdG8gb3VyIHJpZ2h0LgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfcmVjKGJub19jdXIsICZndGJubywgJmd0bGVuLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJLyoKKwkJICogSXQncyBub3QgY29udGlndW91cywgdGhvdWdoLgorCQkgKi8KKwkJaWYgKGJubyArIGxlbiA8IGd0Ym5vKQorCQkJaGF2ZXJpZ2h0ID0gMDsKKwkJZWxzZSB7CisJCQkvKgorCQkJICogSWYgdGhpcyBmYWlsdXJlIGhhcHBlbnMgdGhlIHJlcXVlc3QgdG8gZnJlZSB0aGlzCisJCQkgKiBzcGFjZSB3YXMgaW52YWxpZCwgaXQncyAocGFydGx5KSBhbHJlYWR5IGZyZWUuCisJCQkgKiBWZXJ5IGJhZC4KKwkJCSAqLworCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oZ3Ribm8gPj0gYm5vICsgbGVuLCBlcnJvcjApOworCQl9CisJfQorCS8qCisJICogTm93IGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgY3Vyc29yIGZvciB0aGUgYnktc2l6ZSB0cmVlLgorCSAqLworCWNudF9jdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IobXAsIHRwLCBhZ2JwLCBhZ25vLCBYRlNfQlROVU1fQ05ULCBOVUxMLAorCQkwKTsKKwkvKgorCSAqIEhhdmUgYm90aCBsZWZ0IGFuZCByaWdodCBjb250aWd1b3VzIG5laWdoYm9ycy4KKwkgKiBNZXJnZSBhbGwgdGhyZWUgaW50byBhIHNpbmdsZSBmcmVlIGJsb2NrLgorCSAqLworCWlmIChoYXZlbGVmdCAmJiBoYXZlcmlnaHQpIHsKKwkJLyoKKwkJICogRGVsZXRlIHRoZSBvbGQgYnktc2l6ZSBlbnRyeSBvbiB0aGUgbGVmdC4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfbG9va3VwX2VxKGNudF9jdXIsIGx0Ym5vLCBsdGxlbiwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZGVsZXRlKGNudF9jdXIsICZpKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQkvKgorCQkgKiBEZWxldGUgdGhlIG9sZCBieS1zaXplIGVudHJ5IG9uIHRoZSByaWdodC4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfbG9va3VwX2VxKGNudF9jdXIsIGd0Ym5vLCBndGxlbiwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZGVsZXRlKGNudF9jdXIsICZpKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQkvKgorCQkgKiBEZWxldGUgdGhlIG9sZCBieS1ibG9jayBlbnRyeSBmb3IgdGhlIHJpZ2h0IGJsb2NrLgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19kZWxldGUoYm5vX2N1ciwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCS8qCisJCSAqIE1vdmUgdGhlIGJ5LWJsb2NrIGN1cnNvciBiYWNrIHRvIHRoZSBsZWZ0IG5laWdoYm9yLgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19kZWNyZW1lbnQoYm5vX2N1ciwgMCwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisjaWZkZWYgREVCVUcKKwkJLyoKKwkJICogQ2hlY2sgdGhhdCB0aGlzIGlzIHRoZSByaWdodCByZWNvcmQ6IGRlbGV0ZSBkaWRuJ3QKKwkJICogbWFuZ2xlIHRoZSBjdXJzb3IuCisJCSAqLworCQl7CisJCQl4ZnNfYWdibG9ja190CXh4Ym5vOworCQkJeGZzX2V4dGxlbl90CXh4bGVuOworCisJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2dldF9yZWMoYm5vX2N1ciwgJnh4Ym5vLCAmeHhsZW4sCisJCQkJCSZpKSkpCisJCQkJZ290byBlcnJvcjA7CisJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTygKKwkJCQlpID09IDEgJiYgeHhibm8gPT0gbHRibm8gJiYgeHhsZW4gPT0gbHRsZW4sCisJCQkJZXJyb3IwKTsKKwkJfQorI2VuZGlmCisJCS8qCisJCSAqIFVwZGF0ZSByZW1haW5pbmcgYnktYmxvY2sgZW50cnkgdG8gdGhlIG5ldywgam9pbmVkIGJsb2NrLgorCQkgKi8KKwkJbmJubyA9IGx0Ym5vOworCQlubGVuID0gbGVuICsgbHRsZW4gKyBndGxlbjsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY191cGRhdGUoYm5vX2N1ciwgbmJubywgbmxlbikpKQorCQkJZ290byBlcnJvcjA7CisJfQorCS8qCisJICogSGF2ZSBvbmx5IGEgbGVmdCBjb250aWd1b3VzIG5laWdoYm9yLgorCSAqIE1lcmdlIGl0IHRvZ2V0aGVyIHdpdGggdGhlIG5ldyBmcmVlc3BhY2UuCisJICovCisJZWxzZSBpZiAoaGF2ZWxlZnQpIHsKKwkJLyoKKwkJICogRGVsZXRlIHRoZSBvbGQgYnktc2l6ZSBlbnRyeSBvbiB0aGUgbGVmdC4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfbG9va3VwX2VxKGNudF9jdXIsIGx0Ym5vLCBsdGxlbiwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZGVsZXRlKGNudF9jdXIsICZpKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQkvKgorCQkgKiBCYWNrIHVwIHRoZSBieS1ibG9jayBjdXJzb3IgdG8gdGhlIGxlZnQgbmVpZ2hib3IsIGFuZAorCQkgKiB1cGRhdGUgaXRzIGxlbmd0aC4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZGVjcmVtZW50KGJub19jdXIsIDAsICZpKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQluYm5vID0gbHRibm87CisJCW5sZW4gPSBsZW4gKyBsdGxlbjsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY191cGRhdGUoYm5vX2N1ciwgbmJubywgbmxlbikpKQorCQkJZ290byBlcnJvcjA7CisJfQorCS8qCisJICogSGF2ZSBvbmx5IGEgcmlnaHQgY29udGlndW91cyBuZWlnaGJvci4KKwkgKiBNZXJnZSBpdCB0b2dldGhlciB3aXRoIHRoZSBuZXcgZnJlZXNwYWNlLgorCSAqLworCWVsc2UgaWYgKGhhdmVyaWdodCkgeworCQkvKgorCQkgKiBEZWxldGUgdGhlIG9sZCBieS1zaXplIGVudHJ5IG9uIHRoZSByaWdodC4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfbG9va3VwX2VxKGNudF9jdXIsIGd0Ym5vLCBndGxlbiwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZGVsZXRlKGNudF9jdXIsICZpKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQkvKgorCQkgKiBVcGRhdGUgdGhlIHN0YXJ0aW5nIGJsb2NrIGFuZCBsZW5ndGggb2YgdGhlIHJpZ2h0CisJCSAqIG5laWdoYm9yIGluIHRoZSBieS1ibG9jayB0cmVlLgorCQkgKi8KKwkJbmJubyA9IGJubzsKKwkJbmxlbiA9IGxlbiArIGd0bGVuOworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX3VwZGF0ZShibm9fY3VyLCBuYm5vLCBubGVuKSkpCisJCQlnb3RvIGVycm9yMDsKKwl9CisJLyoKKwkgKiBObyBjb250aWd1b3VzIG5laWdoYm9ycy4KKwkgKiBJbnNlcnQgdGhlIG5ldyBmcmVlc3BhY2UgaW50byB0aGUgYnktYmxvY2sgdHJlZS4KKwkgKi8KKwllbHNlIHsKKwkJbmJubyA9IGJubzsKKwkJbmxlbiA9IGxlbjsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19pbnNlcnQoYm5vX2N1ciwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJfQorCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwlibm9fY3VyID0gTlVMTDsKKwkvKgorCSAqIEluIGFsbCBjYXNlcyB3ZSBuZWVkIHRvIGluc2VydCB0aGUgbmV3IGZyZWVzcGFjZSBpbiB0aGUgYnktc2l6ZSB0cmVlLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfbG9va3VwX2VxKGNudF9jdXIsIG5ibm8sIG5sZW4sICZpKSkpCisJCWdvdG8gZXJyb3IwOworCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMCwgZXJyb3IwKTsKKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX2luc2VydChjbnRfY3VyLCAmaSkpKQorCQlnb3RvIGVycm9yMDsKKwlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY250X2N1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCWNudF9jdXIgPSBOVUxMOworCS8qCisJICogVXBkYXRlIHRoZSBmcmVlc3BhY2UgdG90YWxzIGluIHRoZSBhZyBhbmQgc3VwZXJibG9jay4KKwkgKi8KKwl7CisJCXhmc19hZ2ZfdAkqYWdmOworCQl4ZnNfcGVyYWdfdAkqcGFnOwkJLyogcGVyIGFsbG9jYXRpb24gZ3JvdXAgZGF0YSAqLworCisJCWFnZiA9IFhGU19CVUZfVE9fQUdGKGFnYnApOworCQlwYWcgPSAmbXAtPm1fcGVyYWdbYWdub107CisJCUlOVF9NT0QoYWdmLT5hZ2ZfZnJlZWJsa3MsIEFSQ0hfQ09OVkVSVCwgbGVuKTsKKwkJeGZzX3RyYW5zX2FnYmxvY2tzX2RlbHRhKHRwLCBsZW4pOworCQlwYWctPnBhZ2ZfZnJlZWJsa3MgKz0gbGVuOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTygKKwkJCUlOVF9HRVQoYWdmLT5hZ2ZfZnJlZWJsa3MsIEFSQ0hfQ09OVkVSVCkKKwkJCQk8PSBJTlRfR0VUKGFnZi0+YWdmX2xlbmd0aCwgQVJDSF9DT05WRVJUKSwKKwkJCWVycm9yMCk7CisJCVRSQUNFX01PREFHRihOVUxMLCBhZ2YsIFhGU19BR0ZfRlJFRUJMS1MpOworCQl4ZnNfYWxsb2NfbG9nX2FnZih0cCwgYWdicCwgWEZTX0FHRl9GUkVFQkxLUyk7CisJCWlmICghaXNmbCkKKwkJCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9GREJMT0NLUywgKGxvbmcpbGVuKTsKKwkJWEZTX1NUQVRTX0lOQyh4c19mcmVleCk7CisJCVhGU19TVEFUU19BREQoeHNfZnJlZWIsIGxlbik7CisJfQorCVRSQUNFX0ZSRUUoaGF2ZWxlZnQgPworCQkJKGhhdmVyaWdodCA/ICJib3RoIiA6ICJsZWZ0IikgOgorCQkJKGhhdmVyaWdodCA/ICJyaWdodCIgOiAibm9uZSIpLAorCQlhZ25vLCBibm8sIGxlbiwgaXNmbCk7CisKKwkvKgorCSAqIFNpbmNlIGJsb2NrcyBtb3ZlIHRvIHRoZSBmcmVlIGxpc3Qgd2l0aG91dCB0aGUgY29vcmRpbmF0aW9uCisJICogdXNlZCBpbiB4ZnNfYm1hcF9maW5pc2gsIHdlIGNhbid0IGFsbG93IGJsb2NrIHRvIGJlIGF2YWlsYWJsZQorCSAqIGZvciByZWFsbG9jYXRpb24gYW5kIG5vbi10cmFuc2FjdGlvbiB3cml0aW5nICh1c2VyIGRhdGEpCisJICogdW50aWwgd2Uga25vdyB0aGF0IHRoZSB0cmFuc2FjdGlvbiB0aGF0IG1vdmVkIGl0IHRvIHRoZSBmcmVlCisJICogbGlzdCBpcyBwZXJtYW5lbnRseSBvbiBkaXNrLiAgV2UgdHJhY2sgdGhlIGJsb2NrcyBieSBkZWNsYXJpbmcKKwkgKiB0aGVzZSBibG9ja3MgYXMgImJ1c3kiOyB0aGUgYnVzeSBsaXN0IGlzIG1haW50YWluZWQgb24gYSBwZXItYWcKKwkgKiBiYXNpcyBhbmQgZWFjaCB0cmFuc2FjdGlvbiByZWNvcmRzIHdoaWNoIGVudHJpZXMgc2hvdWxkIGJlIHJlbW92ZWQKKwkgKiB3aGVuIHRoZSBpY2xvZyBjb21taXRzIHRvIGRpc2suICBJZiBhIGJ1c3kgYmxvY2sgaXMgYWxsb2NhdGVkLAorCSAqIHRoZSBpY2xvZyBpcyBwdXNoZWQgdXAgdG8gdGhlIExTTiB0aGF0IGZyZWVkIHRoZSBibG9jay4KKwkgKi8KKwl4ZnNfYWxsb2NfbWFya19idXN5KHRwLCBhZ25vLCBibm8sIGxlbik7CisJcmV0dXJuIDA7CisKKyBlcnJvcjA6CisJVFJBQ0VfRlJFRSgiZXJyb3IiLCBhZ25vLCBibm8sIGxlbiwgaXNmbCk7CisJaWYgKGJub19jdXIpCisJCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXIsIFhGU19CVFJFRV9FUlJPUik7CisJaWYgKGNudF9jdXIpCisJCXhmc19idHJlZV9kZWxfY3Vyc29yKGNudF9jdXIsIFhGU19CVFJFRV9FUlJPUik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogVmlzaWJsZSAoZXhwb3J0ZWQpIGFsbG9jYXRpb24vZnJlZSBmdW5jdGlvbnMuCisgKiBTb21lIG9mIHRoZXNlIGFyZSB1c2VkIGp1c3QgYnkgeGZzX2FsbG9jX2J0cmVlLmMgYW5kIHRoaXMgZmlsZS4KKyAqLworCisvKgorICogQ29tcHV0ZSBhbmQgZmlsbCBpbiB2YWx1ZSBvZiBtX2FnX21heGxldmVscy4KKyAqLwordm9pZAoreGZzX2FsbG9jX2NvbXB1dGVfbWF4bGV2ZWxzKAorCXhmc19tb3VudF90CSptcCkJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCit7CisJaW50CQlsZXZlbDsKKwl1aW50CQltYXhibG9ja3M7CisJdWludAkJbWF4bGVhZmVudHM7CisJaW50CQltaW5sZWFmcmVjczsKKwlpbnQJCW1pbm5vZGVyZWNzOworCisJbWF4bGVhZmVudHMgPSAobXAtPm1fc2Iuc2JfYWdibG9ja3MgKyAxKSAvIDI7CisJbWlubGVhZnJlY3MgPSBtcC0+bV9hbGxvY19tbnJbMF07CisJbWlubm9kZXJlY3MgPSBtcC0+bV9hbGxvY19tbnJbMV07CisJbWF4YmxvY2tzID0gKG1heGxlYWZlbnRzICsgbWlubGVhZnJlY3MgLSAxKSAvIG1pbmxlYWZyZWNzOworCWZvciAobGV2ZWwgPSAxOyBtYXhibG9ja3MgPiAxOyBsZXZlbCsrKQorCQltYXhibG9ja3MgPSAobWF4YmxvY2tzICsgbWlubm9kZXJlY3MgLSAxKSAvIG1pbm5vZGVyZWNzOworCW1wLT5tX2FnX21heGxldmVscyA9IGxldmVsOworfQorCisvKgorICogRGVjaWRlIHdoZXRoZXIgdG8gdXNlIHRoaXMgYWxsb2NhdGlvbiBncm91cCBmb3IgdGhpcyBhbGxvY2F0aW9uLgorICogSWYgc28sIGZpeCB1cCB0aGUgYnRyZWUgZnJlZWxpc3QncyBzaXplLgorICovCitTVEFUSUMgaW50CQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19maXhfZnJlZWxpc3QoCisJeGZzX2FsbG9jX2FyZ190CSphcmdzLAkvKiBhbGxvY2F0aW9uIGFyZ3VtZW50IHN0cnVjdHVyZSAqLworCWludAkJZmxhZ3MpCS8qIFhGU19BTExPQ19GTEFHXy4uLiAqLworeworCXhmc19idWZfdAkqYWdicDsJLyogYWdmIGJ1ZmZlciBwb2ludGVyICovCisJeGZzX2FnZl90CSphZ2Y7CS8qIGEuZy4gZnJlZXNwYWNlIHN0cnVjdHVyZSBwb2ludGVyICovCisJeGZzX2J1Zl90CSphZ2ZsYnA7LyogYWdmbCBidWZmZXIgcG9pbnRlciAqLworCXhmc19hZ2Jsb2NrX3QJYm5vOwkvKiBmcmVlbGlzdCBibG9jayAqLworCXhmc19leHRsZW5fdAlkZWx0YTsJLyogbmV3IGJsb2NrcyBuZWVkZWQgaW4gZnJlZWxpc3QgKi8KKwlpbnQJCWVycm9yOwkvKiBlcnJvciByZXN1bHQgY29kZSAqLworCXhmc19leHRsZW5fdAlsb25nZXN0Oy8qIGxvbmdlc3QgZXh0ZW50IGluIGFsbG9jYXRpb24gZ3JvdXAgKi8KKwl4ZnNfbW91bnRfdAkqbXA7CS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50IHN0cnVjdHVyZSAqLworCXhmc19leHRsZW5fdAluZWVkOwkvKiB0b3RhbCBibG9ja3MgbmVlZGVkIGluIGZyZWVsaXN0ICovCisJeGZzX3BlcmFnX3QJKnBhZzsJLyogcGVyLWFnIGluZm9ybWF0aW9uIHN0cnVjdHVyZSAqLworCXhmc19hbGxvY19hcmdfdAl0YXJnczsJLyogbG9jYWwgYWxsb2NhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfdHJhbnNfdAkqdHA7CS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCW1wID0gYXJncy0+bXA7CisKKwlwYWcgPSBhcmdzLT5wYWc7CisJdHAgPSBhcmdzLT50cDsKKwlpZiAoIXBhZy0+cGFnZl9pbml0KSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfcmVhZF9hZ2YobXAsIHRwLCBhcmdzLT5hZ25vLCBmbGFncywKKwkJCQkmYWdicCkpKQorCQkJcmV0dXJuIGVycm9yOworCQlpZiAoIXBhZy0+cGFnZl9pbml0KSB7CisJCQlhcmdzLT5hZ2JwID0gTlVMTDsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlCisJCWFnYnAgPSBOVUxMOworCisJLyogSWYgdGhpcyBpcyBhIG1ldGFkYXRhIHByZWZlcmVkIHBhZyBhbmQgd2UgYXJlIHVzZXIgZGF0YQorCSAqIHRoZW4gdHJ5IHNvbWV3aGVyZSBlbHNlIGlmIHdlIGFyZSBub3QgYmVpbmcgYXNrZWQgdG8KKwkgKiB0cnkgaGFyZGVyIGF0IHRoaXMgcG9pbnQKKwkgKi8KKwlpZiAocGFnLT5wYWdmX21ldGFkYXRhICYmIGFyZ3MtPnVzZXJkYXRhICYmIGZsYWdzKSB7CisJCWFyZ3MtPmFnYnAgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisKKwluZWVkID0gWEZTX01JTl9GUkVFTElTVF9QQUcocGFnLCBtcCk7CisJZGVsdGEgPSBuZWVkID4gcGFnLT5wYWdmX2ZsY291bnQgPyBuZWVkIC0gcGFnLT5wYWdmX2ZsY291bnQgOiAwOworCS8qCisJICogSWYgaXQgbG9va3MgbGlrZSB0aGVyZSBpc24ndCBhIGxvbmcgZW5vdWdoIGV4dGVudCwgb3IgZW5vdWdoCisJICogdG90YWwgYmxvY2tzLCByZWplY3QgaXQuCisJICovCisJbG9uZ2VzdCA9IChwYWctPnBhZ2ZfbG9uZ2VzdCA+IGRlbHRhKSA/CisJCShwYWctPnBhZ2ZfbG9uZ2VzdCAtIGRlbHRhKSA6CisJCShwYWctPnBhZ2ZfZmxjb3VudCA+IDAgfHwgcGFnLT5wYWdmX2xvbmdlc3QgPiAwKTsKKwlpZiAoYXJncy0+bWlubGVuICsgYXJncy0+YWxpZ25tZW50ICsgYXJncy0+bWluYWxpZ25zbG9wIC0gMSA+IGxvbmdlc3QgfHwKKwkgICAgKGFyZ3MtPm1pbmxlZnQgJiYKKwkgICAgIChpbnQpKHBhZy0+cGFnZl9mcmVlYmxrcyArIHBhZy0+cGFnZl9mbGNvdW50IC0KKwkJICAgbmVlZCAtIGFyZ3MtPnRvdGFsKSA8CisJICAgICAoaW50KWFyZ3MtPm1pbmxlZnQpKSB7CisJCWlmIChhZ2JwKQorCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYWdicCk7CisJCWFyZ3MtPmFnYnAgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBHZXQgdGhlIGEuZy4gZnJlZXNwYWNlIGJ1ZmZlci4KKwkgKiBDYW4gZmFpbCBpZiB3ZSdyZSBub3QgYmxvY2tpbmcgb24gbG9ja3MsIGFuZCBpdCdzIGhlbGQuCisJICovCisJaWYgKGFnYnAgPT0gTlVMTCkgeworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX3JlYWRfYWdmKG1wLCB0cCwgYXJncy0+YWdubywgZmxhZ3MsCisJCQkJJmFnYnApKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJaWYgKGFnYnAgPT0gTlVMTCkgeworCQkJYXJncy0+YWdicCA9IE5VTEw7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwkvKgorCSAqIEZpZ3VyZSBvdXQgaG93IG1hbnkgYmxvY2tzIHdlIHNob3VsZCBoYXZlIGluIHRoZSBmcmVlbGlzdC4KKwkgKi8KKwlhZ2YgPSBYRlNfQlVGX1RPX0FHRihhZ2JwKTsKKwluZWVkID0gWEZTX01JTl9GUkVFTElTVChhZ2YsIG1wKTsKKwlkZWx0YSA9IG5lZWQgPiBJTlRfR0VUKGFnZi0+YWdmX2ZsY291bnQsIEFSQ0hfQ09OVkVSVCkgPworCQkobmVlZCAtIElOVF9HRVQoYWdmLT5hZ2ZfZmxjb3VudCwgQVJDSF9DT05WRVJUKSkgOiAwOworCS8qCisJICogSWYgdGhlcmUgaXNuJ3QgZW5vdWdoIHRvdGFsIG9yIHNpbmdsZS1leHRlbnQsIHJlamVjdCBpdC4KKwkgKi8KKwlsb25nZXN0ID0gSU5UX0dFVChhZ2YtPmFnZl9sb25nZXN0LCBBUkNIX0NPTlZFUlQpOworCWxvbmdlc3QgPSAobG9uZ2VzdCA+IGRlbHRhKSA/IChsb25nZXN0IC0gZGVsdGEpIDoKKwkJKElOVF9HRVQoYWdmLT5hZ2ZfZmxjb3VudCwgQVJDSF9DT05WRVJUKSA+IDAgfHwgbG9uZ2VzdCA+IDApOworCWlmIChhcmdzLT5taW5sZW4gKyBhcmdzLT5hbGlnbm1lbnQgKyBhcmdzLT5taW5hbGlnbnNsb3AgLSAxID4gbG9uZ2VzdCB8fAorCSAgICAgKGFyZ3MtPm1pbmxlZnQgJiYKKwkJKGludCkoSU5UX0dFVChhZ2YtPmFnZl9mcmVlYmxrcywgQVJDSF9DT05WRVJUKSArCisJCSAgIElOVF9HRVQoYWdmLT5hZ2ZfZmxjb3VudCwgQVJDSF9DT05WRVJUKSAtIG5lZWQgLSBhcmdzLT50b3RhbCkgPAorCSAgICAgKGludClhcmdzLT5taW5sZWZ0KSkgeworCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBhZ2JwKTsKKwkJYXJncy0+YWdicCA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIE1ha2UgdGhlIGZyZWVsaXN0IHNob3J0ZXIgaWYgaXQncyB0b28gbG9uZy4KKwkgKi8KKwl3aGlsZSAoSU5UX0dFVChhZ2YtPmFnZl9mbGNvdW50LCBBUkNIX0NPTlZFUlQpID4gbmVlZCkgeworCQl4ZnNfYnVmX3QJKmJwOworCisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZ2V0X2ZyZWVsaXN0KHRwLCBhZ2JwLCAmYm5vKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCWlmICgoZXJyb3IgPSB4ZnNfZnJlZV9hZ19leHRlbnQodHAsIGFnYnAsIGFyZ3MtPmFnbm8sIGJubywgMSwgMSkpKQorCQkJcmV0dXJuIGVycm9yOworCQlicCA9IHhmc19idHJlZV9nZXRfYnVmcyhtcCwgdHAsIGFyZ3MtPmFnbm8sIGJubywgMCk7CisJCXhmc190cmFuc19iaW52YWwodHAsIGJwKTsKKwl9CisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBhcmdzIHN0cnVjdHVyZS4KKwkgKi8KKwl0YXJncy50cCA9IHRwOworCXRhcmdzLm1wID0gbXA7CisJdGFyZ3MuYWdicCA9IGFnYnA7CisJdGFyZ3MuYWdubyA9IGFyZ3MtPmFnbm87CisJdGFyZ3MubW9kID0gdGFyZ3MubWlubGVmdCA9IHRhcmdzLndhc2RlbCA9IHRhcmdzLnVzZXJkYXRhID0KKwkJdGFyZ3MubWluYWxpZ25zbG9wID0gMDsKKwl0YXJncy5hbGlnbm1lbnQgPSB0YXJncy5taW5sZW4gPSB0YXJncy5wcm9kID0gdGFyZ3MuaXNmbCA9IDE7CisJdGFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfVEhJU19BRzsKKwl0YXJncy5wYWcgPSBwYWc7CisJaWYgKChlcnJvciA9IHhmc19hbGxvY19yZWFkX2FnZmwobXAsIHRwLCB0YXJncy5hZ25vLCAmYWdmbGJwKSkpCisJCXJldHVybiBlcnJvcjsKKwkvKgorCSAqIE1ha2UgdGhlIGZyZWVsaXN0IGxvbmdlciBpZiBpdCdzIHRvbyBzaG9ydC4KKwkgKi8KKwl3aGlsZSAoSU5UX0dFVChhZ2YtPmFnZl9mbGNvdW50LCBBUkNIX0NPTlZFUlQpIDwgbmVlZCkgeworCQl0YXJncy5hZ2JubyA9IDA7CisJCXRhcmdzLm1heGxlbiA9IG5lZWQgLSBJTlRfR0VUKGFnZi0+YWdmX2ZsY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCS8qCisJCSAqIEFsbG9jYXRlIGFzIG1hbnkgYmxvY2tzIGFzIHBvc3NpYmxlIGF0IG9uY2UuCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2FnX3ZleHRlbnQoJnRhcmdzKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCS8qCisJCSAqIFN0b3AgaWYgd2UgcnVuIG91dC4gIFdvbid0IGhhcHBlbiBpZiBjYWxsZXJzIGFyZSBvYmV5aW5nCisJCSAqIHRoZSByZXN0cmljdGlvbnMgY29ycmVjdGx5LiAgQ2FuIGhhcHBlbiBmb3IgZnJlZSBjYWxscworCQkgKiBvbiBhIGNvbXBsZXRlbHkgZnVsbCBhZy4KKwkJICovCisJCWlmICh0YXJncy5hZ2JubyA9PSBOVUxMQUdCTE9DSykKKwkJCWJyZWFrOworCQkvKgorCQkgKiBQdXQgZWFjaCBhbGxvY2F0ZWQgYmxvY2sgb24gdGhlIGxpc3QuCisJCSAqLworCQlmb3IgKGJubyA9IHRhcmdzLmFnYm5vOyBibm8gPCB0YXJncy5hZ2JubyArIHRhcmdzLmxlbjsgYm5vKyspIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfcHV0X2ZyZWVsaXN0KHRwLCBhZ2JwLCBhZ2ZsYnAsCisJCQkJCWJubykpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJfQorCX0KKwlhcmdzLT5hZ2JwID0gYWdicDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdldCBhIGJsb2NrIGZyb20gdGhlIGZyZWVsaXN0LgorICogUmV0dXJucyB3aXRoIHRoZSBidWZmZXIgZm9yIHRoZSBibG9jayBnb3R0ZW4uCisgKi8KK2ludAkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX2dldF9mcmVlbGlzdCgKKwl4ZnNfdHJhbnNfdAkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfYnVmX3QJKmFnYnAsCS8qIGJ1ZmZlciBjb250YWluaW5nIHRoZSBhZ2Ygc3RydWN0dXJlICovCisJeGZzX2FnYmxvY2tfdAkqYm5vcCkJLyogYmxvY2sgYWRkcmVzcyByZXRyaWV2ZWQgZnJvbSBmcmVlbGlzdCAqLworeworCXhmc19hZ2ZfdAkqYWdmOwkvKiBhLmcuIGZyZWVzcGFjZSBzdHJ1Y3R1cmUgKi8KKwl4ZnNfYWdmbF90CSphZ2ZsOwkvKiBhLmcuIGZyZWVsaXN0IHN0cnVjdHVyZSAqLworCXhmc19idWZfdAkqYWdmbGJwOy8qIGJ1ZmZlciBmb3IgYS5nLiBmcmVlbGlzdCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfYWdibG9ja190CWJubzsJLyogYmxvY2sgbnVtYmVyIHJldHVybmVkICovCisJaW50CQllcnJvcjsKKyNpZmRlZiBYRlNfQUxMT0NfVFJBQ0UKKwlzdGF0aWMgY2hhcglmbmFtZVtdID0gInhmc19hbGxvY19nZXRfZnJlZWxpc3QiOworI2VuZGlmCisJeGZzX21vdW50X3QJKm1wOwkvKiBtb3VudCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfcGVyYWdfdAkqcGFnOwkvKiBwZXIgYWxsb2NhdGlvbiBncm91cCBkYXRhICovCisKKwlhZ2YgPSBYRlNfQlVGX1RPX0FHRihhZ2JwKTsKKwkvKgorCSAqIEZyZWVsaXN0IGlzIGVtcHR5LCBnaXZlIHVwLgorCSAqLworCWlmICghYWdmLT5hZ2ZfZmxjb3VudCkgeworCQkqYm5vcCA9IE5VTExBR0JMT0NLOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBSZWFkIHRoZSBhcnJheSBvZiBmcmVlIGJsb2Nrcy4KKwkgKi8KKwltcCA9IHRwLT50X21vdW50cDsKKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX3JlYWRfYWdmbChtcCwgdHAsCisJCQlJTlRfR0VUKGFnZi0+YWdmX3NlcW5vLCBBUkNIX0NPTlZFUlQpLCAmYWdmbGJwKSkpCisJCXJldHVybiBlcnJvcjsKKwlhZ2ZsID0gWEZTX0JVRl9UT19BR0ZMKGFnZmxicCk7CisJLyoKKwkgKiBHZXQgdGhlIGJsb2NrIG51bWJlciBhbmQgdXBkYXRlIHRoZSBkYXRhIHN0cnVjdHVyZXMuCisJICovCisJYm5vID0gSU5UX0dFVChhZ2ZsLT5hZ2ZsX2Jub1tJTlRfR0VUKGFnZi0+YWdmX2ZsZmlyc3QsIEFSQ0hfQ09OVkVSVCldLCBBUkNIX0NPTlZFUlQpOworCUlOVF9NT0QoYWdmLT5hZ2ZfZmxmaXJzdCwgQVJDSF9DT05WRVJULCAxKTsKKwl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBhZ2ZsYnApOworCWlmIChJTlRfR0VUKGFnZi0+YWdmX2ZsZmlyc3QsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FHRkxfU0laRShtcCkpCisJCWFnZi0+YWdmX2ZsZmlyc3QgPSAwOworCXBhZyA9ICZtcC0+bV9wZXJhZ1tJTlRfR0VUKGFnZi0+YWdmX3NlcW5vLCBBUkNIX0NPTlZFUlQpXTsKKwlJTlRfTU9EKGFnZi0+YWdmX2ZsY291bnQsIEFSQ0hfQ09OVkVSVCwgLTEpOworCXhmc190cmFuc19hZ2ZsaXN0X2RlbHRhKHRwLCAtMSk7CisJcGFnLT5wYWdmX2ZsY291bnQtLTsKKwlUUkFDRV9NT0RBR0YoTlVMTCwgYWdmLCBYRlNfQUdGX0ZMRklSU1QgfCBYRlNfQUdGX0ZMQ09VTlQpOworCXhmc19hbGxvY19sb2dfYWdmKHRwLCBhZ2JwLCBYRlNfQUdGX0ZMRklSU1QgfCBYRlNfQUdGX0ZMQ09VTlQpOworCSpibm9wID0gYm5vOworCisJLyoKKwkgKiBBcyBibG9ja3MgYXJlIGZyZWVkLCB0aGV5IGFyZSBhZGRlZCB0byB0aGUgcGVyLWFnIGJ1c3kgbGlzdAorCSAqIGFuZCByZW1haW4gdGhlcmUgdW50aWwgdGhlIGZyZWVpbmcgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkIHRvCisJICogZGlzay4gIE5vdyB0aGF0IHdlIGhhdmUgYWxsb2NhdGVkIGJsb2NrcywgdGhpcyBsaXN0IG11c3QgYmUKKwkgKiBzZWFyY2hlZCB0byBzZWUgaWYgYSBibG9jayBpcyBiZWluZyByZXVzZWQuICBJZiBvbmUgaXMsIHRoZW4KKwkgKiB0aGUgZnJlZWluZyB0cmFuc2FjdGlvbiBtdXN0IGJlIHB1c2hlZCB0byBkaXNrIE5PVyBieSBmb3JjaW5nCisJICogdG8gZGlzayBhbGwgaWNsb2dzIHVwIHRoYXQgdHJhbnNhY3Rpb24ncyBMU04uCisJICovCisJeGZzX2FsbG9jX3NlYXJjaF9idXN5KHRwLCBJTlRfR0VUKGFnZi0+YWdmX3NlcW5vLCBBUkNIX0NPTlZFUlQpLCBibm8sIDEpOworCXJldHVybiAwOworfQorCisvKgorICogTG9nIHRoZSBnaXZlbiBmaWVsZHMgZnJvbSB0aGUgYWdmIHN0cnVjdHVyZS4KKyAqLwordm9pZAoreGZzX2FsbG9jX2xvZ19hZ2YoCisJeGZzX3RyYW5zX3QJKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2J1Zl90CSpicCwJLyogYnVmZmVyIGZvciBhLmcuIGZyZWVsaXN0IGhlYWRlciAqLworCWludAkJZmllbGRzKQkvKiBtYXNrIG9mIGZpZWxkcyB0byBiZSBsb2dnZWQgKFhGU19BR0ZfLi4uKSAqLworeworCWludAlmaXJzdDsJCS8qIGZpcnN0IGJ5dGUgb2Zmc2V0ICovCisJaW50CWxhc3Q7CQkvKiBsYXN0IGJ5dGUgb2Zmc2V0ICovCisJc3RhdGljIGNvbnN0IHNob3J0CW9mZnNldHNbXSA9IHsKKwkJb2Zmc2V0b2YoeGZzX2FnZl90LCBhZ2ZfbWFnaWNudW0pLAorCQlvZmZzZXRvZih4ZnNfYWdmX3QsIGFnZl92ZXJzaW9ubnVtKSwKKwkJb2Zmc2V0b2YoeGZzX2FnZl90LCBhZ2Zfc2Vxbm8pLAorCQlvZmZzZXRvZih4ZnNfYWdmX3QsIGFnZl9sZW5ndGgpLAorCQlvZmZzZXRvZih4ZnNfYWdmX3QsIGFnZl9yb290c1swXSksCisJCW9mZnNldG9mKHhmc19hZ2ZfdCwgYWdmX2xldmVsc1swXSksCisJCW9mZnNldG9mKHhmc19hZ2ZfdCwgYWdmX2ZsZmlyc3QpLAorCQlvZmZzZXRvZih4ZnNfYWdmX3QsIGFnZl9mbGxhc3QpLAorCQlvZmZzZXRvZih4ZnNfYWdmX3QsIGFnZl9mbGNvdW50KSwKKwkJb2Zmc2V0b2YoeGZzX2FnZl90LCBhZ2ZfZnJlZWJsa3MpLAorCQlvZmZzZXRvZih4ZnNfYWdmX3QsIGFnZl9sb25nZXN0KSwKKwkJc2l6ZW9mKHhmc19hZ2ZfdCkKKwl9OworCisJeGZzX2J0cmVlX29mZnNldHMoZmllbGRzLCBvZmZzZXRzLCBYRlNfQUdGX05VTV9CSVRTLCAmZmlyc3QsICZsYXN0KTsKKwl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYnAsICh1aW50KWZpcnN0LCAodWludClsYXN0KTsKK30KKworLyoKKyAqIEludGVyZmFjZSBmb3IgaW5vZGUgYWxsb2NhdGlvbiB0byBmb3JjZSB0aGUgcGFnIGRhdGEgdG8gYmUgaW5pdGlhbGl6ZWQuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19wYWdmX2luaXQoCisJeGZzX21vdW50X3QJCSptcCwJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCisJeGZzX3RyYW5zX3QJCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19hZ251bWJlcl90CQlhZ25vLAkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCWludAkJCWZsYWdzKQkvKiBYRlNfQUxMT0NfRkxBR1NfLi4uICovCit7CisJeGZzX2J1Zl90CQkqYnA7CisJaW50CQkJZXJyb3I7CisKKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX3JlYWRfYWdmKG1wLCB0cCwgYWdubywgZmxhZ3MsICZicCkpKQorCQlyZXR1cm4gZXJyb3I7CisJaWYgKGJwKQorCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQdXQgdGhlIGJsb2NrIG9uIHRoZSBmcmVlbGlzdCBmb3IgdGhlIGFsbG9jYXRpb24gZ3JvdXAuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19wdXRfZnJlZWxpc3QoCisJeGZzX3RyYW5zX3QJCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19idWZfdAkJKmFnYnAsCS8qIGJ1ZmZlciBmb3IgYS5nLiBmcmVlbGlzdCBoZWFkZXIgKi8KKwl4ZnNfYnVmX3QJCSphZ2ZsYnAsLyogYnVmZmVyIGZvciBhLmcuIGZyZWUgYmxvY2sgYXJyYXkgKi8KKwl4ZnNfYWdibG9ja190CQlibm8pCS8qIGJsb2NrIGJlaW5nIGZyZWVkICovCit7CisJeGZzX2FnZl90CQkqYWdmOwkvKiBhLmcuIGZyZWVzcGFjZSBzdHJ1Y3R1cmUgKi8KKwl4ZnNfYWdmbF90CQkqYWdmbDsJLyogYS5nLiBmcmVlIGJsb2NrIGFycmF5ICovCisJeGZzX2FnYmxvY2tfdAkJKmJsb2NrcDsvKiBwb2ludGVyIHRvIGFycmF5IGVudHJ5ICovCisJaW50CQkJZXJyb3I7CisjaWZkZWYgWEZTX0FMTE9DX1RSQUNFCisJc3RhdGljIGNoYXIJCWZuYW1lW10gPSAieGZzX2FsbG9jX3B1dF9mcmVlbGlzdCI7CisjZW5kaWYKKwl4ZnNfbW91bnRfdAkJKm1wOwkvKiBtb3VudCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfcGVyYWdfdAkJKnBhZzsJLyogcGVyIGFsbG9jYXRpb24gZ3JvdXAgZGF0YSAqLworCisJYWdmID0gWEZTX0JVRl9UT19BR0YoYWdicCk7CisJbXAgPSB0cC0+dF9tb3VudHA7CisKKwlpZiAoIWFnZmxicCAmJiAoZXJyb3IgPSB4ZnNfYWxsb2NfcmVhZF9hZ2ZsKG1wLCB0cCwKKwkJCUlOVF9HRVQoYWdmLT5hZ2Zfc2Vxbm8sIEFSQ0hfQ09OVkVSVCksICZhZ2ZsYnApKSkKKwkJcmV0dXJuIGVycm9yOworCWFnZmwgPSBYRlNfQlVGX1RPX0FHRkwoYWdmbGJwKTsKKwlJTlRfTU9EKGFnZi0+YWdmX2ZsbGFzdCwgQVJDSF9DT05WRVJULCAxKTsKKwlpZiAoSU5UX0dFVChhZ2YtPmFnZl9mbGxhc3QsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FHRkxfU0laRShtcCkpCisJCWFnZi0+YWdmX2ZsbGFzdCA9IDA7CisJcGFnID0gJm1wLT5tX3BlcmFnW0lOVF9HRVQoYWdmLT5hZ2Zfc2Vxbm8sIEFSQ0hfQ09OVkVSVCldOworCUlOVF9NT0QoYWdmLT5hZ2ZfZmxjb3VudCwgQVJDSF9DT05WRVJULCAxKTsKKwl4ZnNfdHJhbnNfYWdmbGlzdF9kZWx0YSh0cCwgMSk7CisJcGFnLT5wYWdmX2ZsY291bnQrKzsKKwlBU1NFUlQoSU5UX0dFVChhZ2YtPmFnZl9mbGNvdW50LCBBUkNIX0NPTlZFUlQpIDw9IFhGU19BR0ZMX1NJWkUobXApKTsKKwlibG9ja3AgPSAmYWdmbC0+YWdmbF9ibm9bSU5UX0dFVChhZ2YtPmFnZl9mbGxhc3QsIEFSQ0hfQ09OVkVSVCldOworCUlOVF9TRVQoKmJsb2NrcCwgQVJDSF9DT05WRVJULCBibm8pOworCVRSQUNFX01PREFHRihOVUxMLCBhZ2YsIFhGU19BR0ZfRkxMQVNUIHwgWEZTX0FHRl9GTENPVU5UKTsKKwl4ZnNfYWxsb2NfbG9nX2FnZih0cCwgYWdicCwgWEZTX0FHRl9GTExBU1QgfCBYRlNfQUdGX0ZMQ09VTlQpOworCXhmc190cmFuc19sb2dfYnVmKHRwLCBhZ2ZsYnAsCisJCShpbnQpKCh4ZnNfY2FkZHJfdClibG9ja3AgLSAoeGZzX2NhZGRyX3QpYWdmbCksCisJCShpbnQpKCh4ZnNfY2FkZHJfdClibG9ja3AgLSAoeGZzX2NhZGRyX3QpYWdmbCArCisJCQlzaXplb2YoeGZzX2FnYmxvY2tfdCkgLSAxKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIGluIHRoZSBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciAoZnJlZS9hbGxvYyBzZWN0aW9uKS4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX3JlYWRfYWdmKAorCXhmc19tb3VudF90CSptcCwJCS8qIG1vdW50IHBvaW50IHN0cnVjdHVyZSAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfYWdudW1iZXJfdAlhZ25vLAkJLyogYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwlpbnQJCWZsYWdzLAkJLyogWEZTX0FMTE9DX0ZMQUdfLi4uICovCisJeGZzX2J1Zl90CSoqYnBwKQkJLyogYnVmZmVyIGZvciB0aGUgYWcgZnJlZWxpc3QgaGVhZGVyICovCit7CisJeGZzX2FnZl90CSphZ2Y7CQkvKiBhZyBmcmVlbGlzdCBoZWFkZXIgKi8KKwlpbnQJCWFnZl9vazsJCS8qIHNldCBpZiBhZ2YgaXMgY29uc2lzdGVudCAqLworCXhmc19idWZfdAkqYnA7CQkvKiByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfcGVyYWdfdAkqcGFnOwkJLyogcGVyIGFsbG9jYXRpb24gZ3JvdXAgZGF0YSAqLworCWludAkJZXJyb3I7CisKKwlBU1NFUlQoYWdubyAhPSBOVUxMQUdOVU1CRVIpOworCWVycm9yID0geGZzX3RyYW5zX3JlYWRfYnVmKAorCQkJbXAsIHRwLCBtcC0+bV9kZGV2X3RhcmdwLAorCQkJWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBYRlNfQUdGX0RBRERSKG1wKSksCisJCQlYRlNfRlNTX1RPX0JCKG1wLCAxKSwKKwkJCShmbGFncyAmIFhGU19BTExPQ19GTEFHX1RSWUxPQ0spID8gWEZTX0JVRl9UUllMT0NLIDogMFUsCisJCQkmYnApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCUFTU0VSVCghYnAgfHwgIVhGU19CVUZfR0VURVJST1IoYnApKTsKKwlpZiAoIWJwKSB7CisJCSpicHAgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBWYWxpZGF0ZSB0aGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBhZ2YgYmxvY2suCisJICovCisJYWdmID0gWEZTX0JVRl9UT19BR0YoYnApOworCWFnZl9vayA9CisJCUlOVF9HRVQoYWdmLT5hZ2ZfbWFnaWNudW0sIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FHRl9NQUdJQyAmJgorCQlYRlNfQUdGX0dPT0RfVkVSU0lPTigKKwkJCUlOVF9HRVQoYWdmLT5hZ2ZfdmVyc2lvbm51bSwgQVJDSF9DT05WRVJUKSkgJiYKKwkJSU5UX0dFVChhZ2YtPmFnZl9mcmVlYmxrcywgQVJDSF9DT05WRVJUKSA8PQorCQkJCUlOVF9HRVQoYWdmLT5hZ2ZfbGVuZ3RoLCBBUkNIX0NPTlZFUlQpICYmCisJCUlOVF9HRVQoYWdmLT5hZ2ZfZmxmaXJzdCwgQVJDSF9DT05WRVJUKSA8IFhGU19BR0ZMX1NJWkUobXApICYmCisJCUlOVF9HRVQoYWdmLT5hZ2ZfZmxsYXN0LCAgQVJDSF9DT05WRVJUKSA8IFhGU19BR0ZMX1NJWkUobXApICYmCisJCUlOVF9HRVQoYWdmLT5hZ2ZfZmxjb3VudCwgQVJDSF9DT05WRVJUKSA8PSBYRlNfQUdGTF9TSVpFKG1wKTsKKwlpZiAodW5saWtlbHkoWEZTX1RFU1RfRVJST1IoIWFnZl9vaywgbXAsIFhGU19FUlJUQUdfQUxMT0NfUkVBRF9BR0YsCisJCQlYRlNfUkFORE9NX0FMTE9DX1JFQURfQUdGKSkpIHsKKwkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19hbGxvY19yZWFkX2FnZiIsCisJCQkJICAgICBYRlNfRVJSTEVWRUxfTE9XLCBtcCwgYWdmKTsKKwkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCXBhZyA9ICZtcC0+bV9wZXJhZ1thZ25vXTsKKwlpZiAoIXBhZy0+cGFnZl9pbml0KSB7CisJCXBhZy0+cGFnZl9mcmVlYmxrcyA9IElOVF9HRVQoYWdmLT5hZ2ZfZnJlZWJsa3MsIEFSQ0hfQ09OVkVSVCk7CisJCXBhZy0+cGFnZl9mbGNvdW50ID0gSU5UX0dFVChhZ2YtPmFnZl9mbGNvdW50LCBBUkNIX0NPTlZFUlQpOworCQlwYWctPnBhZ2ZfbG9uZ2VzdCA9IElOVF9HRVQoYWdmLT5hZ2ZfbG9uZ2VzdCwgQVJDSF9DT05WRVJUKTsKKwkJcGFnLT5wYWdmX2xldmVsc1tYRlNfQlROVU1fQk5PaV0gPQorCQkJSU5UX0dFVChhZ2YtPmFnZl9sZXZlbHNbWEZTX0JUTlVNX0JOT2ldLCBBUkNIX0NPTlZFUlQpOworCQlwYWctPnBhZ2ZfbGV2ZWxzW1hGU19CVE5VTV9DTlRpXSA9CisJCQlJTlRfR0VUKGFnZi0+YWdmX2xldmVsc1tYRlNfQlROVU1fQ05UaV0sIEFSQ0hfQ09OVkVSVCk7CisJCXNwaW5sb2NrX2luaXQoJnBhZy0+cGFnYl9sb2NrLCAieGZzcGFnYiIpOworCQlwYWctPnBhZ2JfbGlzdCA9IGttZW1femFsbG9jKFhGU19QQUdCX05VTV9TTE9UUyAqCisJCQkJCXNpemVvZih4ZnNfcGVyYWdfYnVzeV90KSwgS01fU0xFRVApOworCQlwYWctPnBhZ2ZfaW5pdCA9IDE7CisJfQorI2lmZGVmIERFQlVHCisJZWxzZSBpZiAoIVhGU19GT1JDRURfU0hVVERPV04obXApKSB7CisJCUFTU0VSVChwYWctPnBhZ2ZfZnJlZWJsa3MgPT0gSU5UX0dFVChhZ2YtPmFnZl9mcmVlYmxrcywgQVJDSF9DT05WRVJUKSk7CisJCUFTU0VSVChwYWctPnBhZ2ZfZmxjb3VudCA9PSBJTlRfR0VUKGFnZi0+YWdmX2ZsY291bnQsIEFSQ0hfQ09OVkVSVCkpOworCQlBU1NFUlQocGFnLT5wYWdmX2xvbmdlc3QgPT0gSU5UX0dFVChhZ2YtPmFnZl9sb25nZXN0LCBBUkNIX0NPTlZFUlQpKTsKKwkJQVNTRVJUKHBhZy0+cGFnZl9sZXZlbHNbWEZTX0JUTlVNX0JOT2ldID09CisJCSAgICAgICBJTlRfR0VUKGFnZi0+YWdmX2xldmVsc1tYRlNfQlROVU1fQk5PaV0sIEFSQ0hfQ09OVkVSVCkpOworCQlBU1NFUlQocGFnLT5wYWdmX2xldmVsc1tYRlNfQlROVU1fQ05UaV0gPT0KKwkJICAgICAgIElOVF9HRVQoYWdmLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9DTlRpXSwgQVJDSF9DT05WRVJUKSk7CisJfQorI2VuZGlmCisJWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCBCX0ZTX0FHRiwgWEZTX0FHRl9SRUYpOworCSpicHAgPSBicDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFsbG9jYXRlIGFuIGV4dGVudCAodmFyaWFibGUtc2l6ZSkuCisgKiBEZXBlbmRpbmcgb24gdGhlIGFsbG9jYXRpb24gdHlwZSwgd2UgZWl0aGVyIGxvb2sgaW4gYSBzaW5nbGUgYWxsb2NhdGlvbgorICogZ3JvdXAgb3IgbG9vcCBvdmVyIHRoZSBhbGxvY2F0aW9uIGdyb3VwcyB0byBmaW5kIHRoZSByZXN1bHQuCisgKi8KK2ludAkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX3ZleHRlbnQoCisJeGZzX2FsbG9jX2FyZ190CSphcmdzKQkvKiBhbGxvY2F0aW9uIGFyZ3VtZW50IHN0cnVjdHVyZSAqLworeworCXhmc19hZ2Jsb2NrX3QJYWdzaXplOwkvKiBhbGxvY2F0aW9uIGdyb3VwIHNpemUgKi8KKwlpbnQJCWVycm9yOworCWludAkJZmxhZ3M7CS8qIFhGU19BTExPQ19GTEFHXy4uLiBsb2NraW5nIGZsYWdzICovCisjaWZkZWYgWEZTX0FMTE9DX1RSQUNFCisJc3RhdGljIGNoYXIJZm5hbWVbXSA9ICJ4ZnNfYWxsb2NfdmV4dGVudCI7CisjZW5kaWYKKwl4ZnNfZXh0bGVuX3QJbWlubGVmdDsvKiBtaW5pbXVtIGxlZnQgdmFsdWUsIHRlbXAgY29weSAqLworCXhmc19tb3VudF90CSptcDsJLyogbW91bnQgc3RydWN0dXJlIHBvaW50ZXIgKi8KKwl4ZnNfYWdudW1iZXJfdAlzYWdubzsJLyogc3RhcnRpbmcgYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwl4ZnNfYWxsb2N0eXBlX3QJdHlwZTsJLyogaW5wdXQgYWxsb2NhdGlvbiB0eXBlICovCisJaW50CQlidW1wX3JvdG9yID0gMDsKKwlpbnQJCW5vX21pbiA9IDA7CisJeGZzX2FnbnVtYmVyX3QJcm90b3JzdGVwID0geGZzX3JvdG9yc3RlcDsgLyogaW5vZGUzMiBhZ2Ygc3RlcHBlciAqLworCisJbXAgPSBhcmdzLT5tcDsKKwl0eXBlID0gYXJncy0+b3R5cGUgPSBhcmdzLT50eXBlOworCWFyZ3MtPmFnYm5vID0gTlVMTEFHQkxPQ0s7CisJLyoKKwkgKiBKdXN0IGZpeCB0aGlzIHVwLCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGxhc3QgYS5nLiBpcyBzaG9ydGVyCisJICogKG9yIHRoZXJlJ3Mgb25seSBvbmUgYS5nLikgYW5kIHRoZSBjYWxsZXIgY291bGRuJ3QgZWFzaWx5IGZpZ3VyZQorCSAqIHRoYXQgb3V0ICh4ZnNfYm1hcF9hbGxvYykuCisJICovCisJYWdzaXplID0gbXAtPm1fc2Iuc2JfYWdibG9ja3M7CisJaWYgKGFyZ3MtPm1heGxlbiA+IGFnc2l6ZSkKKwkJYXJncy0+bWF4bGVuID0gYWdzaXplOworCWlmIChhcmdzLT5hbGlnbm1lbnQgPT0gMCkKKwkJYXJncy0+YWxpZ25tZW50ID0gMTsKKwlBU1NFUlQoWEZTX0ZTQl9UT19BR05PKG1wLCBhcmdzLT5mc2JubykgPCBtcC0+bV9zYi5zYl9hZ2NvdW50KTsKKwlBU1NFUlQoWEZTX0ZTQl9UT19BR0JOTyhtcCwgYXJncy0+ZnNibm8pIDwgYWdzaXplKTsKKwlBU1NFUlQoYXJncy0+bWlubGVuIDw9IGFyZ3MtPm1heGxlbik7CisJQVNTRVJUKGFyZ3MtPm1pbmxlbiA8PSBhZ3NpemUpOworCUFTU0VSVChhcmdzLT5tb2QgPCBhcmdzLT5wcm9kKTsKKwlpZiAoWEZTX0ZTQl9UT19BR05PKG1wLCBhcmdzLT5mc2JubykgPj0gbXAtPm1fc2Iuc2JfYWdjb3VudCB8fAorCSAgICBYRlNfRlNCX1RPX0FHQk5PKG1wLCBhcmdzLT5mc2JubykgPj0gYWdzaXplIHx8CisJICAgIGFyZ3MtPm1pbmxlbiA+IGFyZ3MtPm1heGxlbiB8fCBhcmdzLT5taW5sZW4gPiBhZ3NpemUgfHwKKwkgICAgYXJncy0+bW9kID49IGFyZ3MtPnByb2QpIHsKKwkJYXJncy0+ZnNibm8gPSBOVUxMRlNCTE9DSzsKKwkJVFJBQ0VfQUxMT0MoImJhZGFyZ3MiLCBhcmdzKTsKKwkJcmV0dXJuIDA7CisJfQorCW1pbmxlZnQgPSBhcmdzLT5taW5sZWZ0OworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBYRlNfQUxMT0NUWVBFX1RISVNfQUc6CisJY2FzZSBYRlNfQUxMT0NUWVBFX05FQVJfQk5POgorCWNhc2UgWEZTX0FMTE9DVFlQRV9USElTX0JOTzoKKwkJLyoKKwkJICogVGhlc2UgdGhyZWUgZm9yY2UgdXMgaW50byBhIHNpbmdsZSBhLmcuCisJCSAqLworCQlhcmdzLT5hZ25vID0gWEZTX0ZTQl9UT19BR05PKG1wLCBhcmdzLT5mc2Jubyk7CisJCWRvd25fcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwkJYXJncy0+cGFnID0gJm1wLT5tX3BlcmFnW2FyZ3MtPmFnbm9dOworCQlhcmdzLT5taW5sZWZ0ID0gMDsKKwkJZXJyb3IgPSB4ZnNfYWxsb2NfZml4X2ZyZWVsaXN0KGFyZ3MsIDApOworCQlhcmdzLT5taW5sZWZ0ID0gbWlubGVmdDsKKwkJaWYgKGVycm9yKSB7CisJCQlUUkFDRV9BTExPQygibm9maXgiLCBhcmdzKTsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJCWlmICghYXJncy0+YWdicCkgeworCQkJdXBfcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwkJCVRSQUNFX0FMTE9DKCJub2FnYnAiLCBhcmdzKTsKKwkJCWJyZWFrOworCQl9CisJCWFyZ3MtPmFnYm5vID0gWEZTX0ZTQl9UT19BR0JOTyhtcCwgYXJncy0+ZnNibm8pOworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2FnX3ZleHRlbnQoYXJncykpKQorCQkJZ290byBlcnJvcjA7CisJCXVwX3JlYWQoJm1wLT5tX3BlcmFnbG9jayk7CisJCWJyZWFrOworCWNhc2UgWEZTX0FMTE9DVFlQRV9TVEFSVF9CTk86CisJCS8qCisJCSAqIFRyeSBuZWFyIGFsbG9jYXRpb24gZmlyc3QsIHRoZW4gYW55d2hlcmUtaW4tYWcgYWZ0ZXIKKwkJICogdGhlIGZpcnN0IGEuZy4gZmFpbHMuCisJCSAqLworCQlpZiAoKGFyZ3MtPnVzZXJkYXRhICA9PSBYRlNfQUxMT0NfSU5JVElBTF9VU0VSX0RBVEEpICYmCisJCSAgICAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfMzJCSVRJTk9ERVMpKSB7CisJCQlhcmdzLT5mc2JubyA9IFhGU19BR0JfVE9fRlNCKG1wLAorCQkJCQkoKG1wLT5tX2FnZnJvdG9yIC8gcm90b3JzdGVwKSAlCisJCQkJCW1wLT5tX3NiLnNiX2FnY291bnQpLCAwKTsKKwkJCWJ1bXBfcm90b3IgPSAxOworCQl9CisJCWFyZ3MtPmFnYm5vID0gWEZTX0ZTQl9UT19BR0JOTyhtcCwgYXJncy0+ZnNibm8pOworCQlhcmdzLT50eXBlID0gWEZTX0FMTE9DVFlQRV9ORUFSX0JOTzsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIFhGU19BTExPQ1RZUEVfQU5ZX0FHOgorCWNhc2UgWEZTX0FMTE9DVFlQRV9TVEFSVF9BRzoKKwljYXNlIFhGU19BTExPQ1RZUEVfRklSU1RfQUc6CisJCS8qCisJCSAqIFJvdGF0ZSB0aHJvdWdoIHRoZSBhbGxvY2F0aW9uIGdyb3VwcyBsb29raW5nIGZvciBhIHdpbm5lci4KKwkJICovCisJCWlmICh0eXBlID09IFhGU19BTExPQ1RZUEVfQU5ZX0FHKSB7CisJCQkvKgorCQkJICogU3RhcnQgd2l0aCB0aGUgbGFzdCBwbGFjZSB3ZSBsZWZ0IG9mZi4KKwkJCSAqLworCQkJYXJncy0+YWdubyA9IHNhZ25vID0gKG1wLT5tX2FnZnJvdG9yIC8gcm90b3JzdGVwKSAlCisJCQkJCW1wLT5tX3NiLnNiX2FnY291bnQ7CisJCQlhcmdzLT50eXBlID0gWEZTX0FMTE9DVFlQRV9USElTX0FHOworCQkJZmxhZ3MgPSBYRlNfQUxMT0NfRkxBR19UUllMT0NLOworCQl9IGVsc2UgaWYgKHR5cGUgPT0gWEZTX0FMTE9DVFlQRV9GSVJTVF9BRykgeworCQkJLyoKKwkJCSAqIFN0YXJ0IHdpdGggYWxsb2NhdGlvbiBncm91cCBnaXZlbiBieSBibm8uCisJCQkgKi8KKwkJCWFyZ3MtPmFnbm8gPSBYRlNfRlNCX1RPX0FHTk8obXAsIGFyZ3MtPmZzYm5vKTsKKwkJCWFyZ3MtPnR5cGUgPSBYRlNfQUxMT0NUWVBFX1RISVNfQUc7CisJCQlzYWdubyA9IDA7CisJCQlmbGFncyA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAodHlwZSA9PSBYRlNfQUxMT0NUWVBFX1NUQVJUX0FHKQorCQkJCWFyZ3MtPnR5cGUgPSBYRlNfQUxMT0NUWVBFX1RISVNfQUc7CisJCQkvKgorCQkJICogU3RhcnQgd2l0aCB0aGUgZ2l2ZW4gYWxsb2NhdGlvbiBncm91cC4KKwkJCSAqLworCQkJYXJncy0+YWdubyA9IHNhZ25vID0gWEZTX0ZTQl9UT19BR05PKG1wLCBhcmdzLT5mc2Jubyk7CisJCQlmbGFncyA9IFhGU19BTExPQ19GTEFHX1RSWUxPQ0s7CisJCX0KKwkJLyoKKwkJICogTG9vcCBvdmVyIGFsbG9jYXRpb24gZ3JvdXBzIHR3aWNlOyBmaXJzdCB0aW1lIHdpdGgKKwkJICogdHJ5bG9jayBzZXQsIHNlY29uZCB0aW1lIHdpdGhvdXQuCisJCSAqLworCQlkb3duX3JlYWQoJm1wLT5tX3BlcmFnbG9jayk7CisJCWZvciAoOzspIHsKKwkJCWFyZ3MtPnBhZyA9ICZtcC0+bV9wZXJhZ1thcmdzLT5hZ25vXTsKKwkJCWlmIChub19taW4pIGFyZ3MtPm1pbmxlZnQgPSAwOworCQkJZXJyb3IgPSB4ZnNfYWxsb2NfZml4X2ZyZWVsaXN0KGFyZ3MsIGZsYWdzKTsKKwkJCWFyZ3MtPm1pbmxlZnQgPSBtaW5sZWZ0OworCQkJaWYgKGVycm9yKSB7CisJCQkJVFJBQ0VfQUxMT0MoIm5vZml4IiwgYXJncyk7CisJCQkJZ290byBlcnJvcjA7CisJCQl9CisJCQkvKgorCQkJICogSWYgd2UgZ2V0IGEgYnVmZmVyIGJhY2sgdGhlbiB0aGUgYWxsb2NhdGlvbiB3aWxsIGZseS4KKwkJCSAqLworCQkJaWYgKGFyZ3MtPmFnYnApIHsKKwkJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2FnX3ZleHRlbnQoYXJncykpKQorCQkJCQlnb3RvIGVycm9yMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCVRSQUNFX0FMTE9DKCJsb29wZmFpbGVkIiwgYXJncyk7CisJCQkvKgorCQkJICogRGlkbid0IHdvcmssIGZpZ3VyZSBvdXQgdGhlIG5leHQgaXRlcmF0aW9uLgorCQkJICovCisJCQlpZiAoYXJncy0+YWdubyA9PSBzYWdubyAmJgorCQkJICAgIHR5cGUgPT0gWEZTX0FMTE9DVFlQRV9TVEFSVF9CTk8pCisJCQkJYXJncy0+dHlwZSA9IFhGU19BTExPQ1RZUEVfVEhJU19BRzsKKwkJCWlmICgrKyhhcmdzLT5hZ25vKSA9PSBtcC0+bV9zYi5zYl9hZ2NvdW50KQorCQkJCWFyZ3MtPmFnbm8gPSAwOworCQkJLyoKKwkJCSAqIFJlYWNoZWQgdGhlIHN0YXJ0aW5nIGEuZy4sIG11c3QgZWl0aGVyIGJlIGRvbmUKKwkJCSAqIG9yIHN3aXRjaCB0byBub24tdHJ5bG9jayBtb2RlLgorCQkJICovCisJCQlpZiAoYXJncy0+YWdubyA9PSBzYWdubykgeworCQkJCWlmIChub19taW4gPT0gMSkgeworCQkJCQlhcmdzLT5hZ2JubyA9IE5VTExBR0JMT0NLOworCQkJCQlUUkFDRV9BTExPQygiYWxsZmFpbGVkIiwgYXJncyk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoZmxhZ3MgPT0gMCkgeworCQkJCQlub19taW4gPSAxOworCQkJCX0gZWxzZSB7CisJCQkJCWZsYWdzID0gMDsKKwkJCQkJaWYgKHR5cGUgPT0gWEZTX0FMTE9DVFlQRV9TVEFSVF9CTk8pIHsKKwkJCQkJCWFyZ3MtPmFnYm5vID0gWEZTX0ZTQl9UT19BR0JOTyhtcCwKKwkJCQkJCQlhcmdzLT5mc2Jubyk7CisJCQkJCQlhcmdzLT50eXBlID0gWEZTX0FMTE9DVFlQRV9ORUFSX0JOTzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQl1cF9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCQlpZiAoYnVtcF9yb3RvciB8fCAodHlwZSA9PSBYRlNfQUxMT0NUWVBFX0FOWV9BRykpIHsKKwkJCWlmIChhcmdzLT5hZ25vID09IHNhZ25vKQorCQkJCW1wLT5tX2FnZnJvdG9yID0gKG1wLT5tX2FnZnJvdG9yICsgMSkgJQorCQkJCQkobXAtPm1fc2Iuc2JfYWdjb3VudCAqIHJvdG9yc3RlcCk7CisJCQllbHNlCisJCQkJbXAtPm1fYWdmcm90b3IgPSAoYXJncy0+YWdubyAqIHJvdG9yc3RlcCArIDEpICUKKwkJCQkJKG1wLT5tX3NiLnNiX2FnY291bnQgKiByb3RvcnN0ZXApOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKwlpZiAoYXJncy0+YWdibm8gPT0gTlVMTEFHQkxPQ0spCisJCWFyZ3MtPmZzYm5vID0gTlVMTEZTQkxPQ0s7CisJZWxzZSB7CisJCWFyZ3MtPmZzYm5vID0gWEZTX0FHQl9UT19GU0IobXAsIGFyZ3MtPmFnbm8sIGFyZ3MtPmFnYm5vKTsKKyNpZmRlZiBERUJVRworCQlBU1NFUlQoYXJncy0+bGVuID49IGFyZ3MtPm1pbmxlbik7CisJCUFTU0VSVChhcmdzLT5sZW4gPD0gYXJncy0+bWF4bGVuKTsKKwkJQVNTRVJUKGFyZ3MtPmFnYm5vICUgYXJncy0+YWxpZ25tZW50ID09IDApOworCQlYRlNfQUdfQ0hFQ0tfREFERFIobXAsIFhGU19GU0JfVE9fREFERFIobXAsIGFyZ3MtPmZzYm5vKSwKKwkJCWFyZ3MtPmxlbik7CisjZW5kaWYKKwl9CisJcmV0dXJuIDA7CitlcnJvcjA6CisJdXBfcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBGcmVlIGFuIGV4dGVudC4KKyAqIEp1c3QgYnJlYWsgdXAgdGhlIGV4dGVudCBhZGRyZXNzIGFuZCBoYW5kIG9mZiB0byB4ZnNfZnJlZV9hZ19leHRlbnQKKyAqIGFmdGVyIGZpeGluZyB1cCB0aGUgZnJlZWxpc3QuCisgKi8KK2ludAkJCQkvKiBlcnJvciAqLworeGZzX2ZyZWVfZXh0ZW50KAorCXhmc190cmFuc190CSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19mc2Jsb2NrX3QJYm5vLAkvKiBzdGFydGluZyBibG9jayBudW1iZXIgb2YgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CWxlbikJLyogbGVuZ3RoIG9mIGV4dGVudCAqLworeworI2lmZGVmIERFQlVHCisJeGZzX2FnZl90CSphZ2Y7CS8qIGEuZy4gZnJlZXNwYWNlIGhlYWRlciAqLworI2VuZGlmCisJeGZzX2FsbG9jX2FyZ190CWFyZ3M7CS8qIGFsbG9jYXRpb24gYXJndW1lbnQgc3RydWN0dXJlICovCisJaW50CQllcnJvcjsKKworCUFTU0VSVChsZW4gIT0gMCk7CisJYXJncy50cCA9IHRwOworCWFyZ3MubXAgPSB0cC0+dF9tb3VudHA7CisJYXJncy5hZ25vID0gWEZTX0ZTQl9UT19BR05PKGFyZ3MubXAsIGJubyk7CisJQVNTRVJUKGFyZ3MuYWdubyA8IGFyZ3MubXAtPm1fc2Iuc2JfYWdjb3VudCk7CisJYXJncy5hZ2JubyA9IFhGU19GU0JfVE9fQUdCTk8oYXJncy5tcCwgYm5vKTsKKwlhcmdzLmFsaWdubWVudCA9IDE7CisJYXJncy5taW5sZW4gPSBhcmdzLm1pbmxlZnQgPSBhcmdzLm1pbmFsaWduc2xvcCA9IDA7CisJZG93bl9yZWFkKCZhcmdzLm1wLT5tX3BlcmFnbG9jayk7CisJYXJncy5wYWcgPSAmYXJncy5tcC0+bV9wZXJhZ1thcmdzLmFnbm9dOworCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZml4X2ZyZWVsaXN0KCZhcmdzLCAwKSkpCisJCWdvdG8gZXJyb3IwOworI2lmZGVmIERFQlVHCisJQVNTRVJUKGFyZ3MuYWdicCAhPSBOVUxMKTsKKwlhZ2YgPSBYRlNfQlVGX1RPX0FHRihhcmdzLmFnYnApOworCUFTU0VSVChhcmdzLmFnYm5vICsgbGVuIDw9IElOVF9HRVQoYWdmLT5hZ2ZfbGVuZ3RoLCBBUkNIX0NPTlZFUlQpKTsKKyNlbmRpZgorCWVycm9yID0geGZzX2ZyZWVfYWdfZXh0ZW50KHRwLCBhcmdzLmFnYnAsIGFyZ3MuYWdubywgYXJncy5hZ2JubywKKwkJbGVuLCAwKTsKK2Vycm9yMDoKKwl1cF9yZWFkKCZhcmdzLm1wLT5tX3BlcmFnbG9jayk7CisJcmV0dXJuIGVycm9yOworfQorCisKKy8qCisgKiBBRyBCdXN5IGxpc3QgbWFuYWdlbWVudAorICogVGhlIGJ1c3kgbGlzdCBjb250YWlucyBibG9jayByYW5nZXMgdGhhdCBoYXZlIGJlZW4gZnJlZWQgYnV0IHdob3NlCisgKiB0cmFuc2FjYXRpb25zIGhhdmUgbm90IHlldCBoaXQgZGlzay4gIElmIGFueSBibG9jayBsaXN0ZWQgaW4gYSBidXN5CisgKiBsaXN0IGlzIHJldXNlZCwgdGhlIHRyYW5zYWN0aW9uIHRoYXQgZnJlZWQgaXQgbXVzdCBiZSBmb3JjZWQgdG8gZGlzaworICogYmVmb3JlIGNvbnRpbnVpbmcgdG8gdXNlIHRoZSBibG9jay4KKyAqCisgKiB4ZnNfYWxsb2NfbWFya19idXN5IC0gYWRkIHRvIHRoZSBwZXItYWcgYnVzeSBsaXN0CisgKiB4ZnNfYWxsb2NfY2xlYXJfYnVzeSAtIHJlbW92ZSBhbiBpdGVtIGZyb20gdGhlIHBlci1hZyBidXN5IGxpc3QKKyAqLwordm9pZAoreGZzX2FsbG9jX21hcmtfYnVzeSh4ZnNfdHJhbnNfdCAqdHAsCisJCSAgICB4ZnNfYWdudW1iZXJfdCBhZ25vLAorCQkgICAgeGZzX2FnYmxvY2tfdCBibm8sCisJCSAgICB4ZnNfZXh0bGVuX3QgbGVuKQoreworCXhmc19tb3VudF90CQkqbXA7CisJeGZzX3BlcmFnX2J1c3lfdAkqYnN5OworCWludAkJCW47CisJU1BMREVDTChzKTsKKworCW1wID0gdHAtPnRfbW91bnRwOworCXMgPSBtdXRleF9zcGlubG9jaygmbXAtPm1fcGVyYWdbYWdub10ucGFnYl9sb2NrKTsKKworCS8qIHNlYXJjaCBwYWdiX2xpc3QgZm9yIGFuIG9wZW4gc2xvdCAqLworCWZvciAoYnN5ID0gbXAtPm1fcGVyYWdbYWdub10ucGFnYl9saXN0LCBuID0gMDsKKwkgICAgIG4gPCBYRlNfUEFHQl9OVU1fU0xPVFM7CisJICAgICBic3krKywgbisrKSB7CisJCWlmIChic3ktPmJ1c3lfdHAgPT0gTlVMTCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAobiA8IFhGU19QQUdCX05VTV9TTE9UUykgeworCQlic3kgPSAmbXAtPm1fcGVyYWdbYWdub10ucGFnYl9saXN0W25dOworCQltcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2NvdW50Kys7CisJCVRSQUNFX0JVU1koInhmc19hbGxvY19tYXJrX2J1c3kiLCAiZ290IiwgYWdubywgYm5vLCBsZW4sIG4sIHRwKTsKKwkJYnN5LT5idXN5X3N0YXJ0ID0gYm5vOworCQlic3ktPmJ1c3lfbGVuZ3RoID0gbGVuOworCQlic3ktPmJ1c3lfdHAgPSB0cDsKKwkJeGZzX3RyYW5zX2FkZF9idXN5KHRwLCBhZ25vLCBuKTsKKwl9IGVsc2UgeworCQlUUkFDRV9CVVNZKCJ4ZnNfYWxsb2NfbWFya19idXN5IiwgIkZVTEwiLCBhZ25vLCBibm8sIGxlbiwgLTEsIHRwKTsKKwkJLyoKKwkJICogVGhlIGJ1c3kgbGlzdCBpcyBmdWxsISAgU2luY2UgaXQgaXMgbm93IG5vdCBwb3NzaWJsZSB0bworCQkgKiB0cmFjayB0aGUgZnJlZSBibG9jaywgbWFrZSB0aGlzIGEgc3luY2hyb25vdXMgdHJhbnNhY3Rpb24KKwkJICogdG8gaW5zdXJlIHRoYXQgdGhlIGJsb2NrIGlzIG5vdCByZXVzZWQgYmVmb3JlIHRoaXMKKwkJICogdHJhbnNhY3Rpb24gY29tbWl0cy4KKwkJICovCisJCXhmc190cmFuc19zZXRfc3luYyh0cCk7CisJfQorCisJbXV0ZXhfc3BpbnVubG9jaygmbXAtPm1fcGVyYWdbYWdub10ucGFnYl9sb2NrLCBzKTsKK30KKwordm9pZAoreGZzX2FsbG9jX2NsZWFyX2J1c3koeGZzX3RyYW5zX3QgKnRwLAorCQkgICAgIHhmc19hZ251bWJlcl90IGFnbm8sCisJCSAgICAgaW50IGlkeCkKK3sKKwl4ZnNfbW91bnRfdAkJKm1wOworCXhmc19wZXJhZ19idXN5X3QJKmxpc3Q7CisJU1BMREVDTChzKTsKKworCW1wID0gdHAtPnRfbW91bnRwOworCisJcyA9IG11dGV4X3NwaW5sb2NrKCZtcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2xvY2spOworCWxpc3QgPSBtcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2xpc3Q7CisKKwlBU1NFUlQoaWR4IDwgWEZTX1BBR0JfTlVNX1NMT1RTKTsKKwlpZiAobGlzdFtpZHhdLmJ1c3lfdHAgPT0gdHApIHsKKwkJVFJBQ0VfVU5CVVNZKCJ4ZnNfYWxsb2NfY2xlYXJfYnVzeSIsICJmb3VuZCIsIGFnbm8sIGlkeCwgdHApOworCQlsaXN0W2lkeF0uYnVzeV90cCA9IE5VTEw7CisJCW1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2JfY291bnQtLTsKKwl9IGVsc2UgeworCQlUUkFDRV9VTkJVU1koInhmc19hbGxvY19jbGVhcl9idXN5IiwgIm1pc3NpbmciLCBhZ25vLCBpZHgsIHRwKTsKKwl9CisKKwltdXRleF9zcGludW5sb2NrKCZtcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2xvY2ssIHMpOworfQorCisKKy8qCisgKiByZXR1cm5zIG5vbi16ZXJvIGlmIGFueSBvZiAoYWdubyxibm8pOmxlbiBpcyBpbiBhIGJ1c3kgbGlzdAorICovCitpbnQKK3hmc19hbGxvY19zZWFyY2hfYnVzeSh4ZnNfdHJhbnNfdCAqdHAsCisJCSAgICB4ZnNfYWdudW1iZXJfdCBhZ25vLAorCQkgICAgeGZzX2FnYmxvY2tfdCBibm8sCisJCSAgICB4ZnNfZXh0bGVuX3QgbGVuKQoreworCXhmc19tb3VudF90CQkqbXA7CisJeGZzX3BlcmFnX2J1c3lfdAkqYnN5OworCWludAkJCW47CisJeGZzX2FnYmxvY2tfdAkJdWVuZCwgYmVuZDsKKwl4ZnNfbHNuX3QJCWxzbjsKKwlpbnQJCQljbnQ7CisJU1BMREVDTChzKTsKKworCW1wID0gdHAtPnRfbW91bnRwOworCisJcyA9IG11dGV4X3NwaW5sb2NrKCZtcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2xvY2spOworCWNudCA9IG1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2JfY291bnQ7CisKKwl1ZW5kID0gYm5vICsgbGVuIC0gMTsKKworCS8qIHNlYXJjaCBwYWdiX2xpc3QgZm9yIHRoaXMgc2xvdCwgc2tpcHBpbmcgb3BlbiBzbG90cyAqLworCWZvciAoYnN5ID0gbXAtPm1fcGVyYWdbYWdub10ucGFnYl9saXN0LCBuID0gMDsKKwkgICAgIGNudDsgYnN5KyssIG4rKykgeworCisJCS8qCisJCSAqIChzdGFydDEsbGVuZ3RoMSkgd2l0aGluIChzdGFydDIsIGxlbmd0aDIpCisJCSAqLworCQlpZiAoYnN5LT5idXN5X3RwICE9IE5VTEwpIHsKKwkJCWJlbmQgPSBic3ktPmJ1c3lfc3RhcnQgKyBic3ktPmJ1c3lfbGVuZ3RoIC0gMTsKKwkJCWlmICgoYm5vID4gYmVuZCkgfHwKKwkJCSAgICAodWVuZCA8IGJzeS0+YnVzeV9zdGFydCkpIHsKKwkJCQljbnQtLTsKKwkJCX0gZWxzZSB7CisJCQkJVFJBQ0VfQlVTWVNFQVJDSCgieGZzX2FsbG9jX3NlYXJjaF9idXN5IiwKKwkJCQkJCSAiZm91bmQxIiwgYWdubywgYm5vLCBsZW4sIG4sCisJCQkJCQkgdHApOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBJZiBhIGJsb2NrIHdhcyBmb3VuZCwgZm9yY2UgdGhlIGxvZyB0aHJvdWdoIHRoZSBMU04gb2YgdGhlCisJICogdHJhbnNhY3Rpb24gdGhhdCBmcmVlZCB0aGUgYmxvY2sKKwkgKi8KKwlpZiAoY250KSB7CisJCVRSQUNFX0JVU1lTRUFSQ0goInhmc19hbGxvY19zZWFyY2hfYnVzeSIsICJmb3VuZCIsIGFnbm8sIGJubywgbGVuLCBuLCB0cCk7CisJCWxzbiA9IGJzeS0+YnVzeV90cC0+dF9jb21taXRfbHNuOworCQltdXRleF9zcGludW5sb2NrKCZtcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2xvY2ssIHMpOworCQl4ZnNfbG9nX2ZvcmNlKG1wLCBsc24sIFhGU19MT0dfRk9SQ0V8WEZTX0xPR19TWU5DKTsKKwl9IGVsc2UgeworCQlUUkFDRV9CVVNZU0VBUkNIKCJ4ZnNfYWxsb2Nfc2VhcmNoX2J1c3kiLCAibm90LWZvdW5kIiwgYWdubywgYm5vLCBsZW4sIG4sIHRwKTsKKwkJbiA9IC0xOworCQltdXRleF9zcGludW5sb2NrKCZtcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2xvY2ssIHMpOworCX0KKworCXJldHVybiBuOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hbGxvYy5oIGIvZnMveGZzL3hmc19hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMzI5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2FsbG9jLmgKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0FMTE9DX0hfXworI2RlZmluZQlfX1hGU19BTExPQ19IX18KKworc3RydWN0IHhmc19idWY7CitzdHJ1Y3QgeGZzX21vdW50Oworc3RydWN0IHhmc19wZXJhZzsKK3N0cnVjdCB4ZnNfdHJhbnM7CisKKy8qCisgKiBGcmVlc3BhY2UgYWxsb2NhdGlvbiB0eXBlcy4gIEFyZ3VtZW50IHRvIHhmc19hbGxvY19bdl1leHRlbnQuCisgKi8KK3R5cGVkZWYgZW51bSB4ZnNfYWxsb2N0eXBlCit7CisJWEZTX0FMTE9DVFlQRV9BTllfQUcsCQkvKiBhbGxvY2F0ZSBhbnl3aGVyZSwgdXNlIHJvdG9yICovCisJWEZTX0FMTE9DVFlQRV9GSVJTVF9BRywJCS8qIC4uLiBzdGFydCBhdCBhZyAwICovCisJWEZTX0FMTE9DVFlQRV9TVEFSVF9BRywJCS8qIGFueXdoZXJlLCBzdGFydCBpbiB0aGlzIGEuZy4gKi8KKwlYRlNfQUxMT0NUWVBFX1RISVNfQUcsCQkvKiBhbnl3aGVyZSBpbiB0aGlzIGEuZy4gKi8KKwlYRlNfQUxMT0NUWVBFX1NUQVJUX0JOTywJLyogbmVhciB0aGlzIGJsb2NrIGVsc2UgYW55d2hlcmUgKi8KKwlYRlNfQUxMT0NUWVBFX05FQVJfQk5PLAkJLyogaW4gdGhpcyBhLmcuIGFuZCBuZWFyIHRoaXMgYmxvY2sgKi8KKwlYRlNfQUxMT0NUWVBFX1RISVNfQk5PCQkvKiBhdCBleGFjdGx5IHRoaXMgYmxvY2sgKi8KK30geGZzX2FsbG9jdHlwZV90OworCisvKgorICogRmxhZ3MgZm9yIHhmc19hbGxvY19maXhfZnJlZWxpc3QuCisgKi8KKyNkZWZpbmUJWEZTX0FMTE9DX0ZMQUdfVFJZTE9DSwkweDAwMDAwMDAxICAvKiB1c2UgdHJ5bG9jayBmb3IgYnVmZmVyIGxvY2tpbmcgKi8KKworLyoKKyAqIEFyZ3VtZW50IHN0cnVjdHVyZSBmb3IgeGZzX2FsbG9jIHJvdXRpbmVzLgorICogVGhpcyBpcyB0dXJuZWQgaW50byBhIHN0cnVjdHVyZSB0byBhdm9pZCBoYXZpbmcgMjAgYXJndW1lbnRzIHBhc3NlZAorICogZG93biBzZXZlcmFsIGxldmVscyBvZiB0aGUgc3RhY2suCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19hbGxvY19hcmcgeworCXN0cnVjdCB4ZnNfdHJhbnMgKnRwOwkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfbW91bnQgKm1wOwkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkqYWdicDsJCS8qIGJ1ZmZlciBmb3IgYS5nLiBmcmVlbGlzdCBoZWFkZXIgKi8KKwlzdHJ1Y3QgeGZzX3BlcmFnICpwYWc7CQkvKiBwZXItYWcgc3RydWN0IGZvciB0aGlzIGFnbm8gKi8KKwl4ZnNfZnNibG9ja190CWZzYm5vOwkJLyogZmlsZSBzeXN0ZW0gYmxvY2sgbnVtYmVyICovCisJeGZzX2FnbnVtYmVyX3QJYWdubzsJCS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCisJeGZzX2FnYmxvY2tfdAlhZ2JubzsJCS8qIGFsbG9jYXRpb24gZ3JvdXAtcmVsYXRpdmUgYmxvY2sgIyAqLworCXhmc19leHRsZW5fdAltaW5sZW47CQkvKiBtaW5pbXVtIHNpemUgb2YgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CW1heGxlbjsJCS8qIG1heGltdW0gc2l6ZSBvZiBleHRlbnQgKi8KKwl4ZnNfZXh0bGVuX3QJbW9kOwkJLyogbW9kIHZhbHVlIGZvciBleHRlbnQgc2l6ZSAqLworCXhmc19leHRsZW5fdAlwcm9kOwkJLyogcHJvZCB2YWx1ZSBmb3IgZXh0ZW50IHNpemUgKi8KKwl4ZnNfZXh0bGVuX3QJbWlubGVmdDsJLyogbWluIGJsb2NrcyBtdXN0IGJlIGxlZnQgYWZ0ZXIgdXMgKi8KKwl4ZnNfZXh0bGVuX3QJdG90YWw7CQkvKiB0b3RhbCBibG9ja3MgbmVlZGVkIGluIHhhY3Rpb24gKi8KKwl4ZnNfZXh0bGVuX3QJYWxpZ25tZW50OwkvKiBhbGlnbiBhbnN3ZXIgdG8gbXVsdGlwbGUgb2YgdGhpcyAqLworCXhmc19leHRsZW5fdAltaW5hbGlnbnNsb3A7CS8qIHNsb3AgZm9yIG1pbmxlbithbGlnbm1lbnQgY2FsY3MgKi8KKwl4ZnNfZXh0bGVuX3QJbGVuOwkJLyogb3V0cHV0OiBhY3R1YWwgc2l6ZSBvZiBleHRlbnQgKi8KKwl4ZnNfYWxsb2N0eXBlX3QJdHlwZTsJCS8qIGFsbG9jYXRpb24gdHlwZSBYRlNfQUxMT0NUWVBFXy4uLiAqLworCXhmc19hbGxvY3R5cGVfdAlvdHlwZTsJCS8qIG9yaWdpbmFsIGFsbG9jYXRpb24gdHlwZSAqLworCWNoYXIJCXdhc2RlbDsJCS8qIHNldCBpZiBhbGxvY2F0aW9uIHdhcyBwcmV2IGRlbGF5ZWQgKi8KKwljaGFyCQl3YXNmcm9tZmw7CS8qIHNldCBpZiBhbGxvY2F0aW9uIGlzIGZyb20gZnJlZWxpc3QgKi8KKwljaGFyCQlpc2ZsOwkJLyogc2V0IGlmIGlzIGZyZWVsaXN0IGJsb2NrcyAtICFhY3RnICovCisJY2hhcgkJdXNlcmRhdGE7CS8qIHNldCBpZiB0aGlzIGlzIHVzZXIgZGF0YSAqLworfSB4ZnNfYWxsb2NfYXJnX3Q7CisKKy8qCisgKiBEZWZpbmVzIGZvciB1c2VyZGF0YQorICovCisjZGVmaW5lIFhGU19BTExPQ19VU0VSREFUQQkJMQkvKiBhbGxvY2F0aW9uIGlzIGZvciB1c2VyIGRhdGEqLworI2RlZmluZSBYRlNfQUxMT0NfSU5JVElBTF9VU0VSX0RBVEEJMgkvKiBzcGVjaWFsIGNhc2Ugc3RhcnQgb2YgZmlsZSAqLworCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpZiBkZWZpbmVkKFhGU19BTExPQ19UUkFDRSkKKy8qCisgKiBBbGxvY2F0aW9uIHRyYWNpbmcgYnVmZmVyIHNpemUuCisgKi8KKyNkZWZpbmUJWEZTX0FMTE9DX1RSQUNFX1NJWkUJNDA5NgorZXh0ZXJuIGt0cmFjZV90ICp4ZnNfYWxsb2NfdHJhY2VfYnVmOworCisvKgorICogVHlwZXMgZm9yIGFsbG9jIHRyYWNpbmcuCisgKi8KKyNkZWZpbmUJWEZTX0FMTE9DX0tUUkFDRV9BTExPQwkxCisjZGVmaW5lCVhGU19BTExPQ19LVFJBQ0VfRlJFRQkyCisjZGVmaW5lCVhGU19BTExPQ19LVFJBQ0VfTU9EQUdGCTMKKyNkZWZpbmUJWEZTX0FMTE9DX0tUUkFDRV9CVVNZCTQKKyNkZWZpbmUJWEZTX0FMTE9DX0tUUkFDRV9VTkJVU1kJNQorI2RlZmluZQlYRlNfQUxMT0NfS1RSQUNFX0JVU1lTRUFSQ0gJNgorI2VuZGlmCisKKy8qCisgKiBDb21wdXRlIGFuZCBmaWxsIGluIHZhbHVlIG9mIG1fYWdfbWF4bGV2ZWxzLgorICovCit2b2lkCit4ZnNfYWxsb2NfY29tcHV0ZV9tYXhsZXZlbHMoCisJc3RydWN0IHhmc19tb3VudAkqbXApOwkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKworLyoKKyAqIEdldCBhIGJsb2NrIGZyb20gdGhlIGZyZWVsaXN0LgorICogUmV0dXJucyB3aXRoIHRoZSBidWZmZXIgZm9yIHRoZSBibG9jayBnb3R0ZW4uCisgKi8KK2ludAkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX2dldF9mcmVlbGlzdCgKKwlzdHJ1Y3QgeGZzX3RyYW5zICp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfYnVmCSphZ2JwLAkvKiBidWZmZXIgY29udGFpbmluZyB0aGUgYWdmIHN0cnVjdHVyZSAqLworCXhmc19hZ2Jsb2NrX3QJKmJub3ApOwkvKiBibG9jayBhZGRyZXNzIHJldHJpZXZlZCBmcm9tIGZyZWVsaXN0ICovCisKKy8qCisgKiBMb2cgdGhlIGdpdmVuIGZpZWxkcyBmcm9tIHRoZSBhZ2Ygc3RydWN0dXJlLgorICovCit2b2lkCit4ZnNfYWxsb2NfbG9nX2FnZigKKwlzdHJ1Y3QgeGZzX3RyYW5zICp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfYnVmCSpicCwJLyogYnVmZmVyIGZvciBhLmcuIGZyZWVsaXN0IGhlYWRlciAqLworCWludAkJZmllbGRzKTsvKiBtYXNrIG9mIGZpZWxkcyB0byBiZSBsb2dnZWQgKFhGU19BR0ZfLi4uKSAqLworCisvKgorICogSW50ZXJmYWNlIGZvciBpbm9kZSBhbGxvY2F0aW9uIHRvIGZvcmNlIHRoZSBwYWcgZGF0YSB0byBiZSBpbml0aWFsaXplZC4KKyAqLworaW50CQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfcGFnZl9pbml0KAorCXN0cnVjdCB4ZnNfbW91bnQgKm1wLAkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgeGZzX3RyYW5zICp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19hZ251bWJlcl90CWFnbm8sCS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCisJaW50CQlmbGFncyk7CS8qIFhGU19BTExPQ19GTEFHU18uLi4gKi8KKworLyoKKyAqIFB1dCB0aGUgYmxvY2sgb24gdGhlIGZyZWVsaXN0IGZvciB0aGUgYWxsb2NhdGlvbiBncm91cC4KKyAqLworaW50CQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfcHV0X2ZyZWVsaXN0KAorCXN0cnVjdCB4ZnNfdHJhbnMgKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJc3RydWN0IHhmc19idWYJKmFnYnAsCS8qIGJ1ZmZlciBmb3IgYS5nLiBmcmVlbGlzdCBoZWFkZXIgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkqYWdmbGJwLC8qIGJ1ZmZlciBmb3IgYS5nLiBmcmVlIGJsb2NrIGFycmF5ICovCisJeGZzX2FnYmxvY2tfdAlibm8pOwkvKiBibG9jayBiZWluZyBmcmVlZCAqLworCisvKgorICogUmVhZCBpbiB0aGUgYWxsb2NhdGlvbiBncm91cCBoZWFkZXIgKGZyZWUvYWxsb2Mgc2VjdGlvbikuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgICovCit4ZnNfYWxsb2NfcmVhZF9hZ2YoCisJc3RydWN0IHhmc19tb3VudCAqbXAsCQkvKiBtb3VudCBwb2ludCBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgeGZzX3RyYW5zICp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfYWdudW1iZXJfdAlhZ25vLAkJLyogYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwlpbnQJCWZsYWdzLAkJLyogWEZTX0FMTE9DX0ZMQUdfLi4uICovCisJc3RydWN0IHhmc19idWYJKipicHApOwkJLyogYnVmZmVyIGZvciB0aGUgYWcgZnJlZWxpc3QgaGVhZGVyICovCisKKy8qCisgKiBBbGxvY2F0ZSBhbiBleHRlbnQgKHZhcmlhYmxlLXNpemUpLgorICovCitpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY192ZXh0ZW50KAorCXhmc19hbGxvY19hcmdfdAkqYXJncyk7CS8qIGFsbG9jYXRpb24gYXJndW1lbnQgc3RydWN0dXJlICovCisKKy8qCisgKiBGcmVlIGFuIGV4dGVudC4KKyAqLworaW50CQkJCS8qIGVycm9yICovCit4ZnNfZnJlZV9leHRlbnQoCisJc3RydWN0IHhmc190cmFucyAqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfZnNibG9ja190CWJubywJLyogc3RhcnRpbmcgYmxvY2sgbnVtYmVyIG9mIGV4dGVudCAqLworCXhmc19leHRsZW5fdAlsZW4pOwkvKiBsZW5ndGggb2YgZXh0ZW50ICovCisKK3ZvaWQKK3hmc19hbGxvY19tYXJrX2J1c3koeGZzX3RyYW5zX3QgKnRwLAorCQl4ZnNfYWdudW1iZXJfdCBhZ25vLAorCQl4ZnNfYWdibG9ja190IGJubywKKwkJeGZzX2V4dGxlbl90IGxlbik7CisKK3ZvaWQKK3hmc19hbGxvY19jbGVhcl9idXN5KHhmc190cmFuc190ICp0cCwKKwkJeGZzX2FnbnVtYmVyX3QgYWcsCisJCWludCBpZHgpOworCisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgkvKiBfX1hGU19BTExPQ19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYWxsb2NfYnRyZWUuYyBiL2ZzL3hmcy94ZnNfYWxsb2NfYnRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDM1NWExCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19hbGxvY19idHJlZS5jCkBAIC0wLDAgKzEsMjIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworLyoKKyAqIEZyZWUgc3BhY2UgYWxsb2NhdGlvbiBmb3IgWEZTLgorICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIGludGVybmFsIGZ1bmN0aW9ucy4KKyAqLworCitTVEFUSUMgdm9pZCB4ZnNfYWxsb2NfbG9nX2Jsb2NrKHhmc190cmFuc190ICosIHhmc19idWZfdCAqLCBpbnQpOworU1RBVElDIHZvaWQgeGZzX2FsbG9jX2xvZ19rZXlzKHhmc19idHJlZV9jdXJfdCAqLCB4ZnNfYnVmX3QgKiwgaW50LCBpbnQpOworU1RBVElDIHZvaWQgeGZzX2FsbG9jX2xvZ19wdHJzKHhmc19idHJlZV9jdXJfdCAqLCB4ZnNfYnVmX3QgKiwgaW50LCBpbnQpOworU1RBVElDIHZvaWQgeGZzX2FsbG9jX2xvZ19yZWNzKHhmc19idHJlZV9jdXJfdCAqLCB4ZnNfYnVmX3QgKiwgaW50LCBpbnQpOworU1RBVElDIGludCB4ZnNfYWxsb2NfbHNoaWZ0KHhmc19idHJlZV9jdXJfdCAqLCBpbnQsIGludCAqKTsKK1NUQVRJQyBpbnQgeGZzX2FsbG9jX25ld3Jvb3QoeGZzX2J0cmVlX2N1cl90ICosIGludCAqKTsKK1NUQVRJQyBpbnQgeGZzX2FsbG9jX3JzaGlmdCh4ZnNfYnRyZWVfY3VyX3QgKiwgaW50LCBpbnQgKik7CitTVEFUSUMgaW50IHhmc19hbGxvY19zcGxpdCh4ZnNfYnRyZWVfY3VyX3QgKiwgaW50LCB4ZnNfYWdibG9ja190ICosCisJCXhmc19hbGxvY19rZXlfdCAqLCB4ZnNfYnRyZWVfY3VyX3QgKiosIGludCAqKTsKK1NUQVRJQyBpbnQgeGZzX2FsbG9jX3VwZGtleSh4ZnNfYnRyZWVfY3VyX3QgKiwgeGZzX2FsbG9jX2tleV90ICosIGludCk7CisKKy8qCisgKiBJbnRlcm5hbCBmdW5jdGlvbnMuCisgKi8KKworLyoKKyAqIFNpbmdsZSBsZXZlbCBvZiB0aGUgeGZzX2FsbG9jX2RlbGV0ZSByZWNvcmQgZGVsZXRpb24gcm91dGluZS4KKyAqIERlbGV0ZSByZWNvcmQgcG9pbnRlZCB0byBieSBjdXIvbGV2ZWwuCisgKiBSZW1vdmUgdGhlIHJlY29yZCBmcm9tIGl0cyBibG9jayB0aGVuIHJlYmFsYW5jZSB0aGUgdHJlZS4KKyAqIFJldHVybiAwIGZvciBlcnJvciwgMSBmb3IgZG9uZSwgMiB0byBnbyBvbiB0byB0aGUgbmV4dCBsZXZlbC4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX2RlbHJlYygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldmVsLAkvKiBsZXZlbCByZW1vdmluZyByZWNvcmQgZnJvbSAqLworCWludAkJCSpzdGF0KQkvKiBmYWlsL2RvbmUvZ28tb24gKi8KK3sKKwl4ZnNfYWdmX3QJCSphZ2Y7CS8qIGFsbG9jYXRpb24gZ3JvdXAgZnJlZWxpc3QgaGVhZGVyICovCisJeGZzX2FsbG9jX2Jsb2NrX3QJKmJsb2NrOwkvKiBidHJlZSBibG9jayByZWNvcmQva2V5IGxpdmVzIGluICovCisJeGZzX2FnYmxvY2tfdAkJYm5vOwkvKiBidHJlZSBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJCSpicDsJLyogYnVmZmVyIGZvciBibG9jayAqLworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlpOwkvKiBsb29wIGluZGV4ICovCisJeGZzX2FsbG9jX2tleV90CQlrZXk7CS8qIGtwIHBvaW50cyBoZXJlIGlmIGJsb2NrIGlzIGxldmVsIDAgKi8KKwl4ZnNfYWdibG9ja190CQlsYm5vOwkvKiBsZWZ0IGJsb2NrJ3MgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CQkqbGJwOwkvKiBsZWZ0IGJsb2NrJ3MgYnVmZmVyIHBvaW50ZXIgKi8KKwl4ZnNfYWxsb2NfYmxvY2tfdAkqbGVmdDsJLyogbGVmdCBidHJlZSBibG9jayAqLworCXhmc19hbGxvY19rZXlfdAkJKmxrcD1OVUxMOwkvKiBsZWZ0IGJsb2NrIGtleSBwb2ludGVyICovCisJeGZzX2FsbG9jX3B0cl90CQkqbHBwPU5VTEw7CS8qIGxlZnQgYmxvY2sgYWRkcmVzcyBwb2ludGVyICovCisJaW50CQkJbHJlY3M9MDsJLyogbnVtYmVyIG9mIHJlY29yZHMgaW4gbGVmdCBibG9jayAqLworCXhmc19hbGxvY19yZWNfdAkJKmxycDsJLyogbGVmdCBibG9jayByZWNvcmQgcG9pbnRlciAqLworCXhmc19tb3VudF90CQkqbXA7CS8qIG1vdW50IHN0cnVjdHVyZSAqLworCWludAkJCXB0cjsJLyogaW5kZXggaW4gYnRyZWUgYmxvY2sgZm9yIHRoaXMgcmVjICovCisJeGZzX2FnYmxvY2tfdAkJcmJubzsJLyogcmlnaHQgYmxvY2sncyBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJCSpyYnA7CS8qIHJpZ2h0IGJsb2NrJ3MgYnVmZmVyIHBvaW50ZXIgKi8KKwl4ZnNfYWxsb2NfYmxvY2tfdAkqcmlnaHQ7CS8qIHJpZ2h0IGJ0cmVlIGJsb2NrICovCisJeGZzX2FsbG9jX2tleV90CQkqcmtwOwkvKiByaWdodCBibG9jayBrZXkgcG9pbnRlciAqLworCXhmc19hbGxvY19wdHJfdAkJKnJwcDsJLyogcmlnaHQgYmxvY2sgYWRkcmVzcyBwb2ludGVyICovCisJaW50CQkJcnJlY3M9MDsJLyogbnVtYmVyIG9mIHJlY29yZHMgaW4gcmlnaHQgYmxvY2sgKi8KKwl4ZnNfYWxsb2NfcmVjX3QJCSpycnA7CS8qIHJpZ2h0IGJsb2NrIHJlY29yZCBwb2ludGVyICovCisJeGZzX2J0cmVlX2N1cl90CQkqdGN1cjsJLyogdGVtcG9yYXJ5IGJ0cmVlIGN1cnNvciAqLworCisJLyoKKwkgKiBHZXQgdGhlIGluZGV4IG9mIHRoZSBlbnRyeSBiZWluZyBkZWxldGVkLCBjaGVjayBmb3Igbm90aGluZyB0aGVyZS4KKwkgKi8KKwlwdHIgPSBjdXItPmJjX3B0cnNbbGV2ZWxdOworCWlmIChwdHIgPT0gMCkgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIEdldCB0aGUgYnVmZmVyICYgYmxvY2sgY29udGFpbmluZyB0aGUgcmVjb3JkIG9yIGtleS9wdHIuCisJICovCisJYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOworCWJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhicCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApKSkKKwkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJLyoKKwkgKiBGYWlsIGlmIHdlJ3JlIG9mZiB0aGUgZW5kIG9mIHRoZSBibG9jay4KKwkgKi8KKwlpZiAocHRyID4gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwlYRlNfU1RBVFNfSU5DKHhzX2FidF9kZWxyZWMpOworCS8qCisJICogSXQncyBhIG5vbmxlYWYuICBFeGNpc2UgdGhlIGtleSBhbmQgcHRyIGJlaW5nIGRlbGV0ZWQsIGJ5CisJICogc2xpZGluZyB0aGUgZW50cmllcyBwYXN0IHRoZW0gZG93biBvbmUuCisJICogTG9nIHRoZSBjaGFuZ2VkIGFyZWFzIG9mIHRoZSBibG9jay4KKwkgKi8KKwlpZiAobGV2ZWwgPiAwKSB7CisJCWxrcCA9IFhGU19BTExPQ19LRVlfQUREUihibG9jaywgMSwgY3VyKTsKKwkJbHBwID0gWEZTX0FMTE9DX1BUUl9BRERSKGJsb2NrLCAxLCBjdXIpOworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IHB0cjsgaSA8IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7IGkrKykgeworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgSU5UX0dFVChscHBbaV0sIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpCisJCQkJcmV0dXJuIGVycm9yOworCQl9CisjZW5kaWYKKwkJaWYgKHB0ciA8IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCW1lbW1vdmUoJmxrcFtwdHIgLSAxXSwgJmxrcFtwdHJdLAorCQkJCShJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gcHRyKSAqIHNpemVvZigqbGtwKSk7IC8qIElOVF86IG1lbSBjb3B5ICovCisJCQltZW1tb3ZlKCZscHBbcHRyIC0gMV0sICZscHBbcHRyXSwKKwkJCQkoSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAtIHB0cikgKiBzaXplb2YoKmxwcCkpOyAvKiBJTlRfOiBtZW0gY29weSAqLworCQkJeGZzX2FsbG9jX2xvZ19wdHJzKGN1ciwgYnAsIHB0ciwgSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAtIDEpOworCQkJeGZzX2FsbG9jX2xvZ19rZXlzKGN1ciwgYnAsIHB0ciwgSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAtIDEpOworCQl9CisJfQorCS8qCisJICogSXQncyBhIGxlYWYuICBFeGNpc2UgdGhlIHJlY29yZCBiZWluZyBkZWxldGVkLCBieSBzbGlkaW5nIHRoZQorCSAqIGVudHJpZXMgcGFzdCBpdCBkb3duIG9uZS4gIExvZyB0aGUgY2hhbmdlZCBhcmVhcyBvZiB0aGUgYmxvY2suCisJICovCisJZWxzZSB7CisJCWxycCA9IFhGU19BTExPQ19SRUNfQUREUihibG9jaywgMSwgY3VyKTsKKwkJaWYgKHB0ciA8IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCW1lbW1vdmUoJmxycFtwdHIgLSAxXSwgJmxycFtwdHJdLAorCQkJCShJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gcHRyKSAqIHNpemVvZigqbHJwKSk7CisJCQl4ZnNfYWxsb2NfbG9nX3JlY3MoY3VyLCBicCwgcHRyLCBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gMSk7CisJCX0KKwkJLyoKKwkJICogSWYgaXQncyB0aGUgZmlyc3QgcmVjb3JkIGluIHRoZSBibG9jaywgd2UnbGwgbmVlZCBhIGtleQorCQkgKiBzdHJ1Y3R1cmUgdG8gcGFzcyB1cCB0byB0aGUgbmV4dCBsZXZlbCAodXBka2V5KS4KKwkJICovCisJCWlmIChwdHIgPT0gMSkgeworCQkJa2V5LmFyX3N0YXJ0YmxvY2sgPSBscnAtPmFyX3N0YXJ0YmxvY2s7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCQlrZXkuYXJfYmxvY2tjb3VudCA9IGxycC0+YXJfYmxvY2tjb3VudDsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJCWxrcCA9ICZrZXk7CisJCX0KKwl9CisJLyoKKwkgKiBEZWNyZW1lbnQgYW5kIGxvZyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGJsb2NrLgorCSAqLworCUlOVF9NT0QoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgLTEpOworCXhmc19hbGxvY19sb2dfYmxvY2soY3VyLT5iY190cCwgYnAsIFhGU19CQl9OVU1SRUNTKTsKKwkvKgorCSAqIFNlZSBpZiB0aGUgbG9uZ2VzdCBmcmVlIGV4dGVudCBpbiB0aGUgYWxsb2NhdGlvbiBncm91cCB3YXMKKwkgKiBjaGFuZ2VkIGJ5IHRoaXMgb3BlcmF0aW9uLiAgVHJ1ZSBpZiBpdCdzIHRoZSBieS1zaXplIGJ0cmVlLCBhbmQKKwkgKiB0aGlzIGlzIHRoZSBsZWFmIGxldmVsLCBhbmQgdGhlcmUgaXMgbm8gcmlnaHQgc2libGluZyBibG9jaywKKwkgKiBhbmQgdGhpcyB3YXMgdGhlIGxhc3QgcmVjb3JkLgorCSAqLworCWFnZiA9IFhGU19CVUZfVE9fQUdGKGN1ci0+YmNfcHJpdmF0ZS5hLmFnYnApOworCW1wID0gY3VyLT5iY19tcDsKKworCWlmIChsZXZlbCA9PSAwICYmCisJICAgIGN1ci0+YmNfYnRudW0gPT0gWEZTX0JUTlVNX0NOVCAmJgorCSAgICBJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMQUdCTE9DSyAmJgorCSAgICBwdHIgPiBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKSB7CisJCUFTU0VSVChwdHIgPT0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEpOworCQkvKgorCQkgKiBUaGVyZSBhcmUgc3RpbGwgcmVjb3JkcyBpbiB0aGUgYmxvY2suICBHcmFiIHRoZSBzaXplCisJCSAqIGZyb20gdGhlIGxhc3Qgb25lLgorCQkgKi8KKwkJaWYgKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCXJycCA9IFhGU19BTExPQ19SRUNfQUREUihibG9jaywgSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSwgY3VyKTsKKwkJCUlOVF9DT1BZKGFnZi0+YWdmX2xvbmdlc3QsIHJycC0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJfQorCQkvKgorCQkgKiBObyBmcmVlIGV4dGVudHMgbGVmdC4KKwkJICovCisJCWVsc2UKKwkJCWFnZi0+YWdmX2xvbmdlc3QgPSAwOworCQltcC0+bV9wZXJhZ1tJTlRfR0VUKGFnZi0+YWdmX3NlcW5vLCBBUkNIX0NPTlZFUlQpXS5wYWdmX2xvbmdlc3QgPQorCQkJSU5UX0dFVChhZ2YtPmFnZl9sb25nZXN0LCBBUkNIX0NPTlZFUlQpOworCQl4ZnNfYWxsb2NfbG9nX2FnZihjdXItPmJjX3RwLCBjdXItPmJjX3ByaXZhdGUuYS5hZ2JwLAorCQkJWEZTX0FHRl9MT05HRVNUKTsKKwl9CisJLyoKKwkgKiBJcyB0aGlzIHRoZSByb290IGxldmVsPyAgSWYgc28sIHdlJ3JlIGFsbW9zdCBkb25lLgorCSAqLworCWlmIChsZXZlbCA9PSBjdXItPmJjX25sZXZlbHMgLSAxKSB7CisJCS8qCisJCSAqIElmIHRoaXMgaXMgdGhlIHJvb3QgbGV2ZWwsCisJCSAqIGFuZCB0aGVyZSdzIG9ubHkgb25lIGVudHJ5IGxlZnQsCisJCSAqIGFuZCBpdCdzIE5PVCB0aGUgbGVhZiBsZXZlbCwKKwkJICogdGhlbiB3ZSBjYW4gZ2V0IHJpZCBvZiB0aGlzIGxldmVsLgorCQkgKi8KKwkJaWYgKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPT0gMSAmJiBsZXZlbCA+IDApIHsKKwkJCS8qCisJCQkgKiBscHAgaXMgc3RpbGwgc2V0IHRvIHRoZSBmaXJzdCBwb2ludGVyIGluIHRoZSBibG9jay4KKwkJCSAqIE1ha2UgaXQgdGhlIG5ldyByb290IG9mIHRoZSBidHJlZS4KKwkJCSAqLworCQkJYm5vID0gSU5UX0dFVChhZ2YtPmFnZl9yb290c1tjdXItPmJjX2J0bnVtXSwgQVJDSF9DT05WRVJUKTsKKwkJCUlOVF9DT1BZKGFnZi0+YWdmX3Jvb3RzW2N1ci0+YmNfYnRudW1dLCAqbHBwLCBBUkNIX0NPTlZFUlQpOworCQkJSU5UX01PRChhZ2YtPmFnZl9sZXZlbHNbY3VyLT5iY19idG51bV0sIEFSQ0hfQ09OVkVSVCwgLTEpOworCQkJbXAtPm1fcGVyYWdbSU5UX0dFVChhZ2YtPmFnZl9zZXFubywgQVJDSF9DT05WRVJUKV0ucGFnZl9sZXZlbHNbY3VyLT5iY19idG51bV0tLTsKKwkJCS8qCisJCQkgKiBQdXQgdGhpcyBidWZmZXIvYmxvY2sgb24gdGhlIGFnJ3MgZnJlZWxpc3QuCisJCQkgKi8KKwkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfcHV0X2ZyZWVsaXN0KGN1ci0+YmNfdHAsCisJCQkJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnYnAsIE5VTEwsIGJubykpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJCS8qCisJCQkgKiBTaW5jZSBibG9ja3MgbW92ZSB0byB0aGUgZnJlZSBsaXN0IHdpdGhvdXQgdGhlCisJCQkgKiBjb29yZGluYXRpb24gdXNlZCBpbiB4ZnNfYm1hcF9maW5pc2gsIHdlIGNhbid0IGFsbG93CisJCQkgKiBibG9jayB0byBiZSBhdmFpbGFibGUgZm9yIHJlYWxsb2NhdGlvbiBhbmQKKwkJCSAqIG5vbi10cmFuc2FjdGlvbiB3cml0aW5nICh1c2VyIGRhdGEpIHVudGlsIHdlIGtub3cKKwkJCSAqIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHRoYXQgbW92ZWQgaXQgdG8gdGhlIGZyZWUgbGlzdAorCQkJICogaXMgcGVybWFuZW50bHkgb24gZGlzay4gV2UgdHJhY2sgdGhlIGJsb2NrcyBieQorCQkJICogZGVjbGFyaW5nIHRoZXNlIGJsb2NrcyBhcyAiYnVzeSI7IHRoZSBidXN5IGxpc3QgaXMKKwkJCSAqIG1haW50YWluZWQgb24gYSBwZXItYWcgYmFzaXMgYW5kIGVhY2ggdHJhbnNhY3Rpb24KKwkJCSAqIHJlY29yZHMgd2hpY2ggZW50cmllcyBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHRoZQorCQkJICogaWNsb2cgY29tbWl0cyB0byBkaXNrLiBJZiBhIGJ1c3kgYmxvY2sgaXMKKwkJCSAqIGFsbG9jYXRlZCwgdGhlIGljbG9nIGlzIHB1c2hlZCB1cCB0byB0aGUgTFNOCisJCQkgKiB0aGF0IGZyZWVkIHRoZSBibG9jay4KKwkJCSAqLworCQkJeGZzX2FsbG9jX21hcmtfYnVzeShjdXItPmJjX3RwLAorCQkJCUlOVF9HRVQoYWdmLT5hZ2Zfc2Vxbm8sIEFSQ0hfQ09OVkVSVCksIGJubywgMSk7CisKKwkJCXhmc190cmFuc19hZ2J0cmVlX2RlbHRhKGN1ci0+YmNfdHAsIC0xKTsKKwkJCXhmc19hbGxvY19sb2dfYWdmKGN1ci0+YmNfdHAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnYnAsCisJCQkJWEZTX0FHRl9ST09UUyB8IFhGU19BR0ZfTEVWRUxTKTsKKwkJCS8qCisJCQkgKiBVcGRhdGUgdGhlIGN1cnNvciBzbyB0aGVyZSdzIG9uZSBmZXdlciBsZXZlbC4KKwkJCSAqLworCQkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldmVsLCBOVUxMKTsKKwkJCWN1ci0+YmNfbmxldmVscy0tOworCQl9IGVsc2UgaWYgKGxldmVsID4gMCAmJgorCQkJICAgKGVycm9yID0geGZzX2FsbG9jX2RlY3JlbWVudChjdXIsIGxldmVsLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQkqc3RhdCA9IDE7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIElmIHdlIGRlbGV0ZWQgdGhlIGxlZnRtb3N0IGVudHJ5IGluIHRoZSBibG9jaywgdXBkYXRlIHRoZQorCSAqIGtleSB2YWx1ZXMgYWJvdmUgdXMgaW4gdGhlIHRyZWUuCisJICovCisJaWYgKHB0ciA9PSAxICYmIChlcnJvciA9IHhmc19hbGxvY191cGRrZXkoY3VyLCBsa3AsIGxldmVsICsgMSkpKQorCQlyZXR1cm4gZXJyb3I7CisJLyoKKwkgKiBJZiB0aGUgbnVtYmVyIG9mIHJlY29yZHMgcmVtYWluaW5nIGluIHRoZSBibG9jayBpcyBhdCBsZWFzdAorCSAqIHRoZSBtaW5pbXVtLCB3ZSdyZSBkb25lLgorCSAqLworCWlmIChJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID49IFhGU19BTExPQ19CTE9DS19NSU5SRUNTKGxldmVsLCBjdXIpKSB7CisJCWlmIChsZXZlbCA+IDAgJiYgKGVycm9yID0geGZzX2FsbG9jX2RlY3JlbWVudChjdXIsIGxldmVsLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQkqc3RhdCA9IDE7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBtb3ZlIHNvbWUgcmVjb3JkcyBhcm91bmQgdG8ga2VlcCB0aGUKKwkgKiB0cmVlIGJhbGFuY2VkLiAgTG9vayBhdCB0aGUgbGVmdCBhbmQgcmlnaHQgc2libGluZyBibG9ja3MgdG8KKwkgKiBzZWUgaWYgd2UgY2FuIHJlLWJhbGFuY2UgYnkgbW92aW5nIG9ubHkgb25lIHJlY29yZC4KKwkgKi8KKwlyYm5vID0gSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCk7CisJbGJubyA9IElOVF9HRVQoYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCk7CisJYm5vID0gTlVMTEFHQkxPQ0s7CisJQVNTRVJUKHJibm8gIT0gTlVMTEFHQkxPQ0sgfHwgbGJubyAhPSBOVUxMQUdCTE9DSyk7CisJLyoKKwkgKiBEdXBsaWNhdGUgdGhlIGN1cnNvciBzbyBvdXIgYnRyZWUgbWFuaXB1bGF0aW9ucyBoZXJlIHdvbid0CisJICogZGlzcnVwdCB0aGUgbmV4dCBsZXZlbCB1cC4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2R1cF9jdXJzb3IoY3VyLCAmdGN1cikpKQorCQlyZXR1cm4gZXJyb3I7CisJLyoKKwkgKiBJZiB0aGVyZSdzIGEgcmlnaHQgc2libGluZywgc2VlIGlmIGl0J3Mgb2sgdG8gc2hpZnQgYW4gZW50cnkKKwkgKiBvdXQgb2YgaXQuCisJICovCisJaWYgKHJibm8gIT0gTlVMTEFHQkxPQ0spIHsKKwkJLyoKKwkJICogTW92ZSB0aGUgdGVtcCBjdXJzb3IgdG8gdGhlIGxhc3QgZW50cnkgaW4gdGhlIG5leHQgYmxvY2suCisJCSAqIEFjdHVhbGx5IGFueSBlbnRyeSBidXQgdGhlIGZpcnN0IHdvdWxkIHN1ZmZpY2UuCisJCSAqLworCQlpID0geGZzX2J0cmVlX2xhc3RyZWModGN1ciwgbGV2ZWwpOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfaW5jcmVtZW50KHRjdXIsIGxldmVsLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJaSA9IHhmc19idHJlZV9sYXN0cmVjKHRjdXIsIGxldmVsKTsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQkvKgorCQkgKiBHcmFiIGEgcG9pbnRlciB0byB0aGUgYmxvY2suCisJCSAqLworCQlyYnAgPSB0Y3VyLT5iY19idWZzW2xldmVsXTsKKwkJcmlnaHQgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKHJicCk7CisjaWZkZWYgREVCVUcKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCByaWdodCwgbGV2ZWwsIHJicCkpKQorCQkJZ290byBlcnJvcjA7CisjZW5kaWYKKwkJLyoKKwkJICogR3JhYiB0aGUgY3VycmVudCBibG9jayBudW1iZXIsIGZvciBmdXR1cmUgdXNlLgorCQkgKi8KKwkJYm5vID0gSU5UX0dFVChyaWdodC0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKTsKKwkJLyoKKwkJICogSWYgcmlnaHQgYmxvY2sgaXMgZnVsbCBlbm91Z2ggc28gdGhhdCByZW1vdmluZyBvbmUgZW50cnkKKwkJICogd29uJ3QgbWFrZSBpdCB0b28gZW1wdHksIGFuZCBsZWZ0LXNoaWZ0aW5nIGFuIGVudHJ5IG91dAorCQkgKiBvZiByaWdodCB0byB1cyB3b3Jrcywgd2UncmUgZG9uZS4KKwkJICovCisJCWlmIChJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gMSA+PQorCQkgICAgIFhGU19BTExPQ19CTE9DS19NSU5SRUNTKGxldmVsLCBjdXIpKSB7CisJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2xzaGlmdCh0Y3VyLCBsZXZlbCwgJmkpKSkKKwkJCQlnb3RvIGVycm9yMDsKKwkJCWlmIChpKSB7CisJCQkJQVNTRVJUKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQkgICAgICAgWEZTX0FMTE9DX0JMT0NLX01JTlJFQ1MobGV2ZWwsIGN1cikpOworCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsCisJCQkJCQkgICAgIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJCQlpZiAobGV2ZWwgPiAwICYmCisJCQkJICAgIChlcnJvciA9IHhmc19hbGxvY19kZWNyZW1lbnQoY3VyLCBsZXZlbCwKKwkJCQkJICAgICZpKSkpCisJCQkJCXJldHVybiBlcnJvcjsKKwkJCQkqc3RhdCA9IDE7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJLyoKKwkJICogT3RoZXJ3aXNlLCBncmFiIHRoZSBudW1iZXIgb2YgcmVjb3JkcyBpbiByaWdodCBmb3IKKwkJICogZnV0dXJlIHJlZmVyZW5jZSwgYW5kIGZpeCB1cCB0aGUgdGVtcCBjdXJzb3IgdG8gcG9pbnQKKwkJICogdG8gb3VyIGJsb2NrIGFnYWluIChsYXN0IHJlY29yZCkuCisJCSAqLworCQlycmVjcyA9IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJCWlmIChsYm5vICE9IE5VTExBR0JMT0NLKSB7CisJCQlpID0geGZzX2J0cmVlX2ZpcnN0cmVjKHRjdXIsIGxldmVsKTsKKwkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZGVjcmVtZW50KHRjdXIsIGxldmVsLCAmaSkpKQorCQkJCWdvdG8gZXJyb3IwOworCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQl9CisJfQorCS8qCisJICogSWYgdGhlcmUncyBhIGxlZnQgc2libGluZywgc2VlIGlmIGl0J3Mgb2sgdG8gc2hpZnQgYW4gZW50cnkKKwkgKiBvdXQgb2YgaXQuCisJICovCisJaWYgKGxibm8gIT0gTlVMTEFHQkxPQ0spIHsKKwkJLyoKKwkJICogTW92ZSB0aGUgdGVtcCBjdXJzb3IgdG8gdGhlIGZpcnN0IGVudHJ5IGluIHRoZQorCQkgKiBwcmV2aW91cyBibG9jay4KKwkJICovCisJCWkgPSB4ZnNfYnRyZWVfZmlyc3RyZWModGN1ciwgbGV2ZWwpOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZGVjcmVtZW50KHRjdXIsIGxldmVsLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJeGZzX2J0cmVlX2ZpcnN0cmVjKHRjdXIsIGxldmVsKTsKKwkJLyoKKwkJICogR3JhYiBhIHBvaW50ZXIgdG8gdGhlIGJsb2NrLgorCQkgKi8KKwkJbGJwID0gdGN1ci0+YmNfYnVmc1tsZXZlbF07CisJCWxlZnQgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGxicCk7CisjaWZkZWYgREVCVUcKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBsZWZ0LCBsZXZlbCwgbGJwKSkpCisJCQlnb3RvIGVycm9yMDsKKyNlbmRpZgorCQkvKgorCQkgKiBHcmFiIHRoZSBjdXJyZW50IGJsb2NrIG51bWJlciwgZm9yIGZ1dHVyZSB1c2UuCisJCSAqLworCQlibm8gPSBJTlRfR0VUKGxlZnQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpOworCQkvKgorCQkgKiBJZiBsZWZ0IGJsb2NrIGlzIGZ1bGwgZW5vdWdoIHNvIHRoYXQgcmVtb3Zpbmcgb25lIGVudHJ5CisJCSAqIHdvbid0IG1ha2UgaXQgdG9vIGVtcHR5LCBhbmQgcmlnaHQtc2hpZnRpbmcgYW4gZW50cnkgb3V0CisJCSAqIG9mIGxlZnQgdG8gdXMgd29ya3MsIHdlJ3JlIGRvbmUuCisJCSAqLworCQlpZiAoSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gMSA+PQorCQkgICAgIFhGU19BTExPQ19CTE9DS19NSU5SRUNTKGxldmVsLCBjdXIpKSB7CisJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX3JzaGlmdCh0Y3VyLCBsZXZlbCwgJmkpKSkKKwkJCQlnb3RvIGVycm9yMDsKKwkJCWlmIChpKSB7CisJCQkJQVNTRVJUKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQkgICAgICAgWEZTX0FMTE9DX0JMT0NLX01JTlJFQ1MobGV2ZWwsIGN1cikpOworCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsCisJCQkJCQkgICAgIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJCQlpZiAobGV2ZWwgPT0gMCkKKwkJCQkJY3VyLT5iY19wdHJzWzBdKys7CisJCQkJKnN0YXQgPSAxOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCS8qCisJCSAqIE90aGVyd2lzZSwgZ3JhYiB0aGUgbnVtYmVyIG9mIHJlY29yZHMgaW4gcmlnaHQgZm9yCisJCSAqIGZ1dHVyZSByZWZlcmVuY2UuCisJCSAqLworCQlscmVjcyA9IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwl9CisJLyoKKwkgKiBEZWxldGUgdGhlIHRlbXAgY3Vyc29yLCB3ZSdyZSBkb25lIHdpdGggaXQuCisJICovCisJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCS8qCisJICogSWYgaGVyZSwgd2UgbmVlZCB0byBkbyBhIGpvaW4gdG8ga2VlcCB0aGUgdHJlZSBiYWxhbmNlZC4KKwkgKi8KKwlBU1NFUlQoYm5vICE9IE5VTExBR0JMT0NLKTsKKwkvKgorCSAqIFNlZSBpZiB3ZSBjYW4gam9pbiB3aXRoIHRoZSBsZWZ0IG5laWdoYm9yIGJsb2NrLgorCSAqLworCWlmIChsYm5vICE9IE5VTExBR0JMT0NLICYmCisJICAgIGxyZWNzICsgSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA8PSBYRlNfQUxMT0NfQkxPQ0tfTUFYUkVDUyhsZXZlbCwgY3VyKSkgeworCQkvKgorCQkgKiBTZXQgInJpZ2h0IiB0byBiZSB0aGUgc3RhcnRpbmcgYmxvY2ssCisJCSAqICJsZWZ0IiB0byBiZSB0aGUgbGVmdCBuZWlnaGJvci4KKwkJICovCisJCXJibm8gPSBibm87CisJCXJpZ2h0ID0gYmxvY2s7CisJCXJicCA9IGJwOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhtcCwgY3VyLT5iY190cCwKKwkJCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCBsYm5vLCAwLCAmbGJwLAorCQkJCVhGU19BTExPQ19CVFJFRV9SRUYpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJbGVmdCA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0sobGJwKTsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBsZWZ0LCBsZXZlbCwgbGJwKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qCisJICogSWYgdGhhdCB3b24ndCB3b3JrLCBzZWUgaWYgd2UgY2FuIGpvaW4gd2l0aCB0aGUgcmlnaHQgbmVpZ2hib3IgYmxvY2suCisJICovCisJZWxzZSBpZiAocmJubyAhPSBOVUxMQUdCTE9DSyAmJgorCQkgcnJlY3MgKyBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIDw9CisJCSAgWEZTX0FMTE9DX0JMT0NLX01BWFJFQ1MobGV2ZWwsIGN1cikpIHsKKwkJLyoKKwkJICogU2V0ICJsZWZ0IiB0byBiZSB0aGUgc3RhcnRpbmcgYmxvY2ssCisJCSAqICJyaWdodCIgdG8gYmUgdGhlIHJpZ2h0IG5laWdoYm9yLgorCQkgKi8KKwkJbGJubyA9IGJubzsKKwkJbGVmdCA9IGJsb2NrOworCQlsYnAgPSBicDsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMobXAsIGN1ci0+YmNfdHAsCisJCQkJY3VyLT5iY19wcml2YXRlLmEuYWdubywgcmJubywgMCwgJnJicCwKKwkJCQlYRlNfQUxMT0NfQlRSRUVfUkVGKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCXJpZ2h0ID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhyYnApOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIHJpZ2h0LCBsZXZlbCwgcmJwKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qCisJICogT3RoZXJ3aXNlLCB3ZSBjYW4ndCBmaXggdGhlIGltYmFsYW5jZS4KKwkgKiBKdXN0IHJldHVybi4gIFRoaXMgaXMgcHJvYmFibHkgYSBsb2dpYyBlcnJvciwgYnV0IGl0J3Mgbm90IGZhdGFsLgorCSAqLworCWVsc2UgeworCQlpZiAobGV2ZWwgPiAwICYmIChlcnJvciA9IHhmc19hbGxvY19kZWNyZW1lbnQoY3VyLCBsZXZlbCwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJKnN0YXQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBXZSdyZSBub3cgZ29pbmcgdG8gam9pbiAibGVmdCIgYW5kICJyaWdodCIgYnkgbW92aW5nIGFsbCB0aGUgc3R1ZmYKKwkgKiBpbiAicmlnaHQiIHRvICJsZWZ0IiBhbmQgZGVsZXRpbmcgInJpZ2h0Ii4KKwkgKi8KKwlpZiAobGV2ZWwgPiAwKSB7CisJCS8qCisJCSAqIEl0J3MgYSBub24tbGVhZi4gIE1vdmUga2V5cyBhbmQgcG9pbnRlcnMuCisJCSAqLworCQlsa3AgPSBYRlNfQUxMT0NfS0VZX0FERFIobGVmdCwgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSwgY3VyKTsKKwkJbHBwID0gWEZTX0FMTE9DX1BUUl9BRERSKGxlZnQsIElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEsIGN1cik7CisJCXJrcCA9IFhGU19BTExPQ19LRVlfQUREUihyaWdodCwgMSwgY3VyKTsKKwkJcnBwID0gWEZTX0FMTE9DX1BUUl9BRERSKHJpZ2h0LCAxLCBjdXIpOworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOyBpKyspIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIElOVF9HRVQocnBwW2ldLCBBUkNIX0NPTlZFUlQpLCBsZXZlbCkpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJfQorI2VuZGlmCisJCW1lbWNweShsa3AsIHJrcCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqbGtwKSk7IC8qIElOVF86IHN0cnVjdHVyZSBjb3B5ICovCisJCW1lbWNweShscHAsIHJwcCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqbHBwKSk7IC8qIElOVF86IHN0cnVjdHVyZSBjb3B5ICovCisJCXhmc19hbGxvY19sb2dfa2V5cyhjdXIsIGxicCwgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSwKKwkJCQkgICBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJeGZzX2FsbG9jX2xvZ19wdHJzKGN1ciwgbGJwLCBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxLAorCQkJCSAgIElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEl0J3MgYSBsZWFmLiAgTW92ZSByZWNvcmRzLgorCQkgKi8KKwkJbHJwID0gWEZTX0FMTE9DX1JFQ19BRERSKGxlZnQsIElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEsIGN1cik7CisJCXJycCA9IFhGU19BTExPQ19SRUNfQUREUihyaWdodCwgMSwgY3VyKTsKKwkJbWVtY3B5KGxycCwgcnJwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpscnApKTsKKwkJeGZzX2FsbG9jX2xvZ19yZWNzKGN1ciwgbGJwLCBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxLAorCQkJCSAgIElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCX0KKwkvKgorCSAqIElmIHdlIGpvaW5lZCB3aXRoIHRoZSBsZWZ0IG5laWdoYm9yLCBzZXQgdGhlIGJ1ZmZlciBpbiB0aGUKKwkgKiBjdXJzb3IgdG8gdGhlIGxlZnQgYmxvY2ssIGFuZCBmaXggdXAgdGhlIGluZGV4LgorCSAqLworCWlmIChicCAhPSBsYnApIHsKKwkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldmVsLCBsYnApOworCQljdXItPmJjX3B0cnNbbGV2ZWxdICs9IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwl9CisJLyoKKwkgKiBJZiB3ZSBqb2luZWQgd2l0aCB0aGUgcmlnaHQgbmVpZ2hib3IgYW5kIHRoZXJlJ3MgYSBsZXZlbCBhYm92ZQorCSAqIHVzLCBpbmNyZW1lbnQgdGhlIGN1cnNvciBhdCB0aGF0IGxldmVsLgorCSAqLworCWVsc2UgaWYgKGxldmVsICsgMSA8IGN1ci0+YmNfbmxldmVscyAmJgorCQkgKGVycm9yID0geGZzX2FsbG9jX2luY3JlbWVudChjdXIsIGxldmVsICsgMSwgJmkpKSkKKwkJcmV0dXJuIGVycm9yOworCS8qCisJICogRml4IHVwIHRoZSBudW1iZXIgb2YgcmVjb3JkcyBpbiB0aGUgc3Vydml2aW5nIGJsb2NrLgorCSAqLworCUlOVF9NT0QobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkvKgorCSAqIEZpeCB1cCB0aGUgcmlnaHQgYmxvY2sgcG9pbnRlciBpbiB0aGUgc3Vydml2aW5nIGJsb2NrLCBhbmQgbG9nIGl0LgorCSAqLworCWxlZnQtPmJiX3JpZ2h0c2liID0gcmlnaHQtPmJiX3JpZ2h0c2liOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCXhmc19hbGxvY19sb2dfYmxvY2soY3VyLT5iY190cCwgbGJwLCBYRlNfQkJfTlVNUkVDUyB8IFhGU19CQl9SSUdIVFNJQik7CisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIHJpZ2h0IHNpYmxpbmcgbm93LCBtYWtlIGl0IHBvaW50IHRvIHRoZQorCSAqIHJlbWFpbmluZyBibG9jay4KKwkgKi8KKwlpZiAoSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSAhPSBOVUxMQUdCTE9DSykgeworCQl4ZnNfYWxsb2NfYmxvY2tfdAkqcnJibG9jazsKKwkJeGZzX2J1Zl90CQkqcnJicDsKKworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhtcCwgY3VyLT5iY190cCwKKwkJCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCBJTlRfR0VUKGxlZnQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpLCAwLAorCQkJCSZycmJwLCBYRlNfQUxMT0NfQlRSRUVfUkVGKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCXJyYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKHJyYnApOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIHJyYmxvY2ssIGxldmVsLCBycmJwKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCUlOVF9TRVQocnJibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJULCBsYm5vKTsKKwkJeGZzX2FsbG9jX2xvZ19ibG9jayhjdXItPmJjX3RwLCBycmJwLCBYRlNfQkJfTEVGVFNJQik7CisJfQorCS8qCisJICogRnJlZSB0aGUgZGVsZXRpbmcgYmxvY2sgYnkgcHV0dGluZyBpdCBvbiB0aGUgZnJlZWxpc3QuCisJICovCisJaWYgKChlcnJvciA9IHhmc19hbGxvY19wdXRfZnJlZWxpc3QoY3VyLT5iY190cCwgY3VyLT5iY19wcml2YXRlLmEuYWdicCwKKwkJCU5VTEwsIHJibm8pKSkKKwkJcmV0dXJuIGVycm9yOworCS8qCisJICogU2luY2UgYmxvY2tzIG1vdmUgdG8gdGhlIGZyZWUgbGlzdCB3aXRob3V0IHRoZSBjb29yZGluYXRpb24KKwkgKiB1c2VkIGluIHhmc19ibWFwX2ZpbmlzaCwgd2UgY2FuJ3QgYWxsb3cgYmxvY2sgdG8gYmUgYXZhaWxhYmxlCisJICogZm9yIHJlYWxsb2NhdGlvbiBhbmQgbm9uLXRyYW5zYWN0aW9uIHdyaXRpbmcgKHVzZXIgZGF0YSkKKwkgKiB1bnRpbCB3ZSBrbm93IHRoYXQgdGhlIHRyYW5zYWN0aW9uIHRoYXQgbW92ZWQgaXQgdG8gdGhlIGZyZWUKKwkgKiBsaXN0IGlzIHBlcm1hbmVudGx5IG9uIGRpc2suIFdlIHRyYWNrIHRoZSBibG9ja3MgYnkgZGVjbGFyaW5nCisJICogdGhlc2UgYmxvY2tzIGFzICJidXN5IjsgdGhlIGJ1c3kgbGlzdCBpcyBtYWludGFpbmVkIG9uIGEKKwkgKiBwZXItYWcgYmFzaXMgYW5kIGVhY2ggdHJhbnNhY3Rpb24gcmVjb3JkcyB3aGljaCBlbnRyaWVzCisJICogc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiB0aGUgaWNsb2cgY29tbWl0cyB0byBkaXNrLiBJZiBhCisJICogYnVzeSBibG9jayBpcyBhbGxvY2F0ZWQsIHRoZSBpY2xvZyBpcyBwdXNoZWQgdXAgdG8gdGhlCisJICogTFNOIHRoYXQgZnJlZWQgdGhlIGJsb2NrLgorCSAqLworCXhmc19hbGxvY19tYXJrX2J1c3koY3VyLT5iY190cCwKKwkJSU5UX0dFVChhZ2YtPmFnZl9zZXFubywgQVJDSF9DT05WRVJUKSwgYm5vLCAxKTsKKworCXhmc190cmFuc19hZ2J0cmVlX2RlbHRhKGN1ci0+YmNfdHAsIC0xKTsKKwkvKgorCSAqIEFkanVzdCB0aGUgY3VycmVudCBsZXZlbCdzIGN1cnNvciBzbyB0aGF0IHdlJ3JlIGxlZnQgcmVmZXJyaW5nCisJICogdG8gdGhlIHJpZ2h0IG5vZGUsIGFmdGVyIHdlJ3JlIGRvbmUuCisJICogSWYgdGhpcyBsZWF2ZXMgdGhlIHB0ciB2YWx1ZSAwIG91ciBjYWxsZXIgd2lsbCBmaXggaXQgdXAuCisJICovCisJaWYgKGxldmVsID4gMCkKKwkJY3VyLT5iY19wdHJzW2xldmVsXS0tOworCS8qCisJICogUmV0dXJuIHZhbHVlIG1lYW5zIHRoZSBuZXh0IGxldmVsIHVwIGhhcyBzb21ldGhpbmcgdG8gZG8uCisJICovCisJKnN0YXQgPSAyOworCXJldHVybiAwOworCitlcnJvcjA6CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBJbnNlcnQgb25lIHJlY29yZC9sZXZlbC4gIFJldHVybiBpbmZvcm1hdGlvbiB0byB0aGUgY2FsbGVyCisgKiBhbGxvd2luZyB0aGUgbmV4dCBsZXZlbCB1cCB0byBwcm9jZWVkIGlmIG5lY2Vzc2FyeS4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX2luc3JlYygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldmVsLAkvKiBsZXZlbCB0byBpbnNlcnQgcmVjb3JkIGF0ICovCisJeGZzX2FnYmxvY2tfdAkJKmJub3AsCS8qIGkvbzogYmxvY2sgbnVtYmVyIGluc2VydGVkICovCisJeGZzX2FsbG9jX3JlY190CQkqcmVjcCwJLyogaS9vOiByZWNvcmQgZGF0YSBpbnNlcnRlZCAqLworCXhmc19idHJlZV9jdXJfdAkJKipjdXJwLAkvKiBvdXRwdXQ6IG5ldyBjdXJzb3IgcmVwbGFjaW5nIGN1ciAqLworCWludAkJCSpzdGF0KQkvKiBvdXRwdXQ6IHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCXhmc19hZ2ZfdAkJKmFnZjsJLyogYWxsb2NhdGlvbiBncm91cCBmcmVlbGlzdCBoZWFkZXIgKi8KKwl4ZnNfYWxsb2NfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrIHJlY29yZC9rZXkgbGl2ZXMgaW4gKi8KKwl4ZnNfYnVmX3QJCSpicDsJLyogYnVmZmVyIGZvciBibG9jayAqLworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlpOwkvKiBsb29wIGluZGV4ICovCisJeGZzX2FsbG9jX2tleV90CQlrZXk7CS8qIGtleSB2YWx1ZSBiZWluZyBpbnNlcnRlZCAqLworCXhmc19hbGxvY19rZXlfdAkJKmtwOwkvKiBwb2ludGVyIHRvIGJ0cmVlIGtleXMgKi8KKwl4ZnNfYWdibG9ja190CQluYm5vOwkvKiBibG9jayBudW1iZXIgb2YgYWxsb2NhdGVkIGJsb2NrICovCisJeGZzX2J0cmVlX2N1cl90CQkqbmN1cjsJLyogbmV3IGN1cnNvciB0byBiZSB1c2VkIGF0IG5leHQgbHZsICovCisJeGZzX2FsbG9jX2tleV90CQlua2V5OwkvKiBuZXcga2V5IHZhbHVlLCBmcm9tIHNwbGl0ICovCisJeGZzX2FsbG9jX3JlY190CQlucmVjOwkvKiBuZXcgcmVjb3JkIHZhbHVlLCBmb3IgY2FsbGVyICovCisJaW50CQkJb3B0cjsJLyogb2xkIHB0ciB2YWx1ZSAqLworCXhmc19hbGxvY19wdHJfdAkJKnBwOwkvKiBwb2ludGVyIHRvIGJ0cmVlIGFkZHJlc3NlcyAqLworCWludAkJCXB0cjsJLyogaW5kZXggaW4gYnRyZWUgYmxvY2sgZm9yIHRoaXMgcmVjICovCisJeGZzX2FsbG9jX3JlY190CQkqcnA7CS8qIHBvaW50ZXIgdG8gYnRyZWUgcmVjb3JkcyAqLworCisJQVNTRVJUKElOVF9HRVQocmVjcC0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKSA+IDApOworCS8qCisJICogSWYgd2UgbWFkZSBpdCB0byB0aGUgcm9vdCBsZXZlbCwgYWxsb2NhdGUgYSBuZXcgcm9vdCBibG9jaworCSAqIGFuZCB3ZSdyZSBkb25lLgorCSAqLworCWlmIChsZXZlbCA+PSBjdXItPmJjX25sZXZlbHMpIHsKKwkJWEZTX1NUQVRTX0lOQyh4c19hYnRfaW5zcmVjKTsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19uZXdyb290KGN1ciwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJKmJub3AgPSBOVUxMQUdCTE9DSzsKKwkJKnN0YXQgPSBpOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBNYWtlIGEga2V5IG91dCBvZiB0aGUgcmVjb3JkIGRhdGEgdG8gYmUgaW5zZXJ0ZWQsIGFuZCBzYXZlIGl0LgorCSAqLworCWtleS5hcl9zdGFydGJsb2NrID0gcmVjcC0+YXJfc3RhcnRibG9jazsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwlrZXkuYXJfYmxvY2tjb3VudCA9IHJlY3AtPmFyX2Jsb2NrY291bnQ7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJb3B0ciA9IHB0ciA9IGN1ci0+YmNfcHRyc1tsZXZlbF07CisJLyoKKwkgKiBJZiB3ZSdyZSBvZmYgdGhlIGxlZnQgZWRnZSwgcmV0dXJuIGZhaWx1cmUuCisJICovCisJaWYgKHB0ciA9PSAwKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCVhGU19TVEFUU19JTkMoeHNfYWJ0X2luc3JlYyk7CisJLyoKKwkgKiBHZXQgcG9pbnRlcnMgdG8gdGhlIGJ0cmVlIGJ1ZmZlciBhbmQgYmxvY2suCisJICovCisJYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOworCWJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhicCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApKSkKKwkJcmV0dXJuIGVycm9yOworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgbmV3IGVudHJ5IGlzIGJlaW5nIGluc2VydGVkIGluIHRoZSByaWdodCBwbGFjZS4KKwkgKi8KKwlpZiAocHRyIDw9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJaWYgKGxldmVsID09IDApIHsKKwkJCXJwID0gWEZTX0FMTE9DX1JFQ19BRERSKGJsb2NrLCBwdHIsIGN1cik7CisJCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKGN1ci0+YmNfYnRudW0sIHJlY3AsIHJwKTsKKwkJfSBlbHNlIHsKKwkJCWtwID0gWEZTX0FMTE9DX0tFWV9BRERSKGJsb2NrLCBwdHIsIGN1cik7CisJCQl4ZnNfYnRyZWVfY2hlY2tfa2V5KGN1ci0+YmNfYnRudW0sICZrZXksIGtwKTsKKwkJfQorCX0KKyNlbmRpZgorCW5ibm8gPSBOVUxMQUdCTE9DSzsKKwluY3VyID0gKHhmc19idHJlZV9jdXJfdCAqKTA7CisJLyoKKwkgKiBJZiB0aGUgYmxvY2sgaXMgZnVsbCwgd2UgY2FuJ3QgaW5zZXJ0IHRoZSBuZXcgZW50cnkgdW50aWwgd2UKKwkgKiBtYWtlIHRoZSBibG9jayB1bi1mdWxsLgorCSAqLworCWlmIChJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19BTExPQ19CTE9DS19NQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJCS8qCisJCSAqIEZpcnN0LCB0cnkgc2hpZnRpbmcgYW4gZW50cnkgdG8gdGhlIHJpZ2h0IG5laWdoYm9yLgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19yc2hpZnQoY3VyLCBsZXZlbCwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJaWYgKGkpIHsKKwkJCS8qIG5vdGhpbmcgKi8KKwkJfQorCQkvKgorCQkgKiBOZXh0LCB0cnkgc2hpZnRpbmcgYW4gZW50cnkgdG8gdGhlIGxlZnQgbmVpZ2hib3IuCisJCSAqLworCQllbHNlIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfbHNoaWZ0KGN1ciwgbGV2ZWwsICZpKSkpCisJCQkJcmV0dXJuIGVycm9yOworCQkJaWYgKGkpCisJCQkJb3B0ciA9IHB0ciA9IGN1ci0+YmNfcHRyc1tsZXZlbF07CisJCQllbHNlIHsKKwkJCQkvKgorCQkJCSAqIE5leHQsIHRyeSBzcGxpdHRpbmcgdGhlIGN1cnJlbnQgYmxvY2sgaW4KKwkJCQkgKiBoYWxmLiBJZiB0aGlzIHdvcmtzIHdlIGhhdmUgdG8gcmUtc2V0IG91cgorCQkJCSAqIHZhcmlhYmxlcyBiZWNhdXNlIHdlIGNvdWxkIGJlIGluIGEKKwkJCQkgKiBkaWZmZXJlbnQgYmxvY2sgbm93LgorCQkJCSAqLworCQkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2Nfc3BsaXQoY3VyLCBsZXZlbCwgJm5ibm8sCisJCQkJCQkmbmtleSwgJm5jdXIsICZpKSkpCisJCQkJCXJldHVybiBlcnJvcjsKKwkJCQlpZiAoaSkgeworCQkJCQlicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CisJCQkJCWJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhicCk7CisjaWZkZWYgREVCVUcKKwkJCQkJaWYgKChlcnJvciA9CisJCQkJCQl4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwKKwkJCQkJCQlibG9jaywgbGV2ZWwsIGJwKSkpCisJCQkJCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkJCQkJcHRyID0gY3VyLT5iY19wdHJzW2xldmVsXTsKKwkJCQkJbnJlYy5hcl9zdGFydGJsb2NrID0gbmtleS5hcl9zdGFydGJsb2NrOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCQkJCQlucmVjLmFyX2Jsb2NrY291bnQgPSBua2V5LmFyX2Jsb2NrY291bnQ7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCQkJfQorCQkJCS8qCisJCQkJICogT3RoZXJ3aXNlIHRoZSBpbnNlcnQgZmFpbHMuCisJCQkJICovCisJCQkJZWxzZSB7CisJCQkJCSpzdGF0ID0gMDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQl9CisJfQorCS8qCisJICogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZXJlJ3Mgcm9vbSBmb3Igb3VyIG5ldyBlbnRyeSBpbiB0aGUgYmxvY2sKKwkgKiB3ZSdyZSBwb2ludGluZyBhdC4KKwkgKi8KKwlpZiAobGV2ZWwgPiAwKSB7CisJCS8qCisJCSAqIEl0J3MgYSBub24tbGVhZiBlbnRyeS4gIE1ha2UgYSBob2xlIGZvciB0aGUgbmV3IGRhdGEKKwkJICogaW4gdGhlIGtleSBhbmQgcHRyIHJlZ2lvbnMgb2YgdGhlIGJsb2NrLgorCQkgKi8KKwkJa3AgPSBYRlNfQUxMT0NfS0VZX0FERFIoYmxvY2ssIDEsIGN1cik7CisJCXBwID0gWEZTX0FMTE9DX1BUUl9BRERSKGJsb2NrLCAxLCBjdXIpOworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7IGkgPj0gcHRyOyBpLS0pIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIElOVF9HRVQocHBbaSAtIDFdLCBBUkNIX0NPTlZFUlQpLCBsZXZlbCkpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJfQorI2VuZGlmCisJCW1lbW1vdmUoJmtwW3B0cl0sICZrcFtwdHIgLSAxXSwKKwkJCShJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gcHRyICsgMSkgKiBzaXplb2YoKmtwKSk7IC8qIElOVF86IGNvcHkgKi8KKwkJbWVtbW92ZSgmcHBbcHRyXSwgJnBwW3B0ciAtIDFdLAorCQkJKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSBwdHIgKyAxKSAqIHNpemVvZigqcHApKTsgLyogSU5UXzogY29weSAqLworI2lmZGVmIERFQlVHCisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsICpibm9wLCBsZXZlbCkpKQorCQkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJCS8qCisJCSAqIE5vdyBzdHVmZiB0aGUgbmV3IGRhdGEgaW4sIGJ1bXAgbnVtcmVjcyBhbmQgbG9nIHRoZSBuZXcgZGF0YS4KKwkJICovCisJCWtwW3B0ciAtIDFdID0ga2V5OworCQlJTlRfU0VUKHBwW3B0ciAtIDFdLCBBUkNIX0NPTlZFUlQsICpibm9wKTsKKwkJSU5UX01PRChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCArMSk7CisJCXhmc19hbGxvY19sb2dfa2V5cyhjdXIsIGJwLCBwdHIsIElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCQl4ZnNfYWxsb2NfbG9nX3B0cnMoY3VyLCBicCwgcHRyLCBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKyNpZmRlZiBERUJVRworCQlpZiAocHRyIDwgSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkKKwkJCXhmc19idHJlZV9jaGVja19rZXkoY3VyLT5iY19idG51bSwga3AgKyBwdHIgLSAxLAorCQkJCWtwICsgcHRyKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCS8qCisJCSAqIEl0J3MgYSBsZWFmIGVudHJ5LiAgTWFrZSBhIGhvbGUgZm9yIHRoZSBuZXcgcmVjb3JkLgorCQkgKi8KKwkJcnAgPSBYRlNfQUxMT0NfUkVDX0FERFIoYmxvY2ssIDEsIGN1cik7CisJCW1lbW1vdmUoJnJwW3B0cl0sICZycFtwdHIgLSAxXSwKKwkJCShJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gcHRyICsgMSkgKiBzaXplb2YoKnJwKSk7CisJCS8qCisJCSAqIE5vdyBzdHVmZiB0aGUgbmV3IHJlY29yZCBpbiwgYnVtcCBudW1yZWNzCisJCSAqIGFuZCBsb2cgdGhlIG5ldyBkYXRhLgorCQkgKi8KKwkJcnBbcHRyIC0gMV0gPSAqcmVjcDsgLyogSU5UXzogc3RydWN0IGNvcHkgKi8KKwkJSU5UX01PRChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCArMSk7CisJCXhmc19hbGxvY19sb2dfcmVjcyhjdXIsIGJwLCBwdHIsIElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworI2lmZGVmIERFQlVHCisJCWlmIChwdHIgPCBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKQorCQkJeGZzX2J0cmVlX2NoZWNrX3JlYyhjdXItPmJjX2J0bnVtLCBycCArIHB0ciAtIDEsCisJCQkJcnAgKyBwdHIpOworI2VuZGlmCisJfQorCS8qCisJICogTG9nIHRoZSBuZXcgbnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIGJ0cmVlIGhlYWRlci4KKwkgKi8KKwl4ZnNfYWxsb2NfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIGJwLCBYRlNfQkJfTlVNUkVDUyk7CisJLyoKKwkgKiBJZiB3ZSBpbnNlcnRlZCBhdCB0aGUgc3RhcnQgb2YgYSBibG9jaywgdXBkYXRlIHRoZSBwYXJlbnRzJyBrZXlzLgorCSAqLworCWlmIChvcHRyID09IDEgJiYgKGVycm9yID0geGZzX2FsbG9jX3VwZGtleShjdXIsICZrZXksIGxldmVsICsgMSkpKQorCQlyZXR1cm4gZXJyb3I7CisJLyoKKwkgKiBMb29rIHRvIHNlZSBpZiB0aGUgbG9uZ2VzdCBleHRlbnQgaW4gdGhlIGFsbG9jYXRpb24gZ3JvdXAKKwkgKiBuZWVkcyB0byBiZSB1cGRhdGVkLgorCSAqLworCisJYWdmID0gWEZTX0JVRl9UT19BR0YoY3VyLT5iY19wcml2YXRlLmEuYWdicCk7CisJaWYgKGxldmVsID09IDAgJiYKKwkgICAgY3VyLT5iY19idG51bSA9PSBYRlNfQlROVU1fQ05UICYmCisJICAgIElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExBR0JMT0NLICYmCisJICAgIElOVF9HRVQocmVjcC0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKSA+IElOVF9HRVQoYWdmLT5hZ2ZfbG9uZ2VzdCwgQVJDSF9DT05WRVJUKSkgeworCQkvKgorCQkgKiBJZiB0aGlzIGlzIGEgbGVhZiBpbiB0aGUgYnktc2l6ZSBidHJlZSBhbmQgdGhlcmUKKwkJICogaXMgbm8gcmlnaHQgc2libGluZyBibG9jayBhbmQgdGhpcyBibG9jayBpcyBiaWdnZXIKKwkJICogdGhhbiB0aGUgcHJldmlvdXMgbG9uZ2VzdCBibG9jaywgdXBkYXRlIGl0LgorCQkgKi8KKwkJSU5UX0NPUFkoYWdmLT5hZ2ZfbG9uZ2VzdCwgcmVjcC0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJY3VyLT5iY19tcC0+bV9wZXJhZ1tJTlRfR0VUKGFnZi0+YWdmX3NlcW5vLCBBUkNIX0NPTlZFUlQpXS5wYWdmX2xvbmdlc3QKKwkJCT0gSU5UX0dFVChyZWNwLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpOworCQl4ZnNfYWxsb2NfbG9nX2FnZihjdXItPmJjX3RwLCBjdXItPmJjX3ByaXZhdGUuYS5hZ2JwLAorCQkJWEZTX0FHRl9MT05HRVNUKTsKKwl9CisJLyoKKwkgKiBSZXR1cm4gdGhlIG5ldyBibG9jayBudW1iZXIsIGlmIGFueS4KKwkgKiBJZiB0aGVyZSBpcyBvbmUsIGdpdmUgYmFjayBhIHJlY29yZCB2YWx1ZSBhbmQgYSBjdXJzb3IgdG9vLgorCSAqLworCSpibm9wID0gbmJubzsKKwlpZiAobmJubyAhPSBOVUxMQUdCTE9DSykgeworCQkqcmVjcCA9IG5yZWM7IC8qIElOVF86IHN0cnVjdCBjb3B5ICovCisJCSpjdXJwID0gbmN1cjsgLyogSU5UXzogc3RydWN0IGNvcHkgKi8KKwl9CisJKnN0YXQgPSAxOworCXJldHVybiAwOworfQorCisvKgorICogTG9nIGhlYWRlciBmaWVsZHMgZnJvbSBhIGJ0cmVlIGJsb2NrLgorICovCitTVEFUSUMgdm9pZAoreGZzX2FsbG9jX2xvZ19ibG9jaygKKwl4ZnNfdHJhbnNfdAkJKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2J1Zl90CQkqYnAsCS8qIGJ1ZmZlciBjb250YWluaW5nIGJ0cmVlIGJsb2NrICovCisJaW50CQkJZmllbGRzKQkvKiBtYXNrIG9mIGZpZWxkczogWEZTX0JCXy4uLiAqLworeworCWludAkJCWZpcnN0OwkvKiBmaXJzdCBieXRlIG9mZnNldCBsb2dnZWQgKi8KKwlpbnQJCQlsYXN0OwkvKiBsYXN0IGJ5dGUgb2Zmc2V0IGxvZ2dlZCAqLworCXN0YXRpYyBjb25zdCBzaG9ydAlvZmZzZXRzW10gPSB7CS8qIHRhYmxlIG9mIG9mZnNldHMgKi8KKwkJb2Zmc2V0b2YoeGZzX2FsbG9jX2Jsb2NrX3QsIGJiX21hZ2ljKSwKKwkJb2Zmc2V0b2YoeGZzX2FsbG9jX2Jsb2NrX3QsIGJiX2xldmVsKSwKKwkJb2Zmc2V0b2YoeGZzX2FsbG9jX2Jsb2NrX3QsIGJiX251bXJlY3MpLAorCQlvZmZzZXRvZih4ZnNfYWxsb2NfYmxvY2tfdCwgYmJfbGVmdHNpYiksCisJCW9mZnNldG9mKHhmc19hbGxvY19ibG9ja190LCBiYl9yaWdodHNpYiksCisJCXNpemVvZih4ZnNfYWxsb2NfYmxvY2tfdCkKKwl9OworCisJeGZzX2J0cmVlX29mZnNldHMoZmllbGRzLCBvZmZzZXRzLCBYRlNfQkJfTlVNX0JJVFMsICZmaXJzdCwgJmxhc3QpOworCXhmc190cmFuc19sb2dfYnVmKHRwLCBicCwgZmlyc3QsIGxhc3QpOworfQorCisvKgorICogTG9nIGtleXMgZnJvbSBhIGJ0cmVlIGJsb2NrIChub25sZWFmKS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19hbGxvY19sb2dfa2V5cygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19idWZfdAkJKmJwLAkvKiBidWZmZXIgY29udGFpbmluZyBidHJlZSBibG9jayAqLworCWludAkJCWtmaXJzdCwJLyogaW5kZXggb2YgZmlyc3Qga2V5IHRvIGxvZyAqLworCWludAkJCWtsYXN0KQkvKiBpbmRleCBvZiBsYXN0IGtleSB0byBsb2cgKi8KK3sKKwl4ZnNfYWxsb2NfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrIHRvIGxvZyBmcm9tICovCisJaW50CQkJZmlyc3Q7CS8qIGZpcnN0IGJ5dGUgb2Zmc2V0IGxvZ2dlZCAqLworCXhmc19hbGxvY19rZXlfdAkJKmtwOwkvKiBrZXkgcG9pbnRlciBpbiBidHJlZSBibG9jayAqLworCWludAkJCWxhc3Q7CS8qIGxhc3QgYnl0ZSBvZmZzZXQgbG9nZ2VkICovCisKKwlibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0soYnApOworCWtwID0gWEZTX0FMTE9DX0tFWV9BRERSKGJsb2NrLCAxLCBjdXIpOworCWZpcnN0ID0gKGludCkoKHhmc19jYWRkcl90KSZrcFtrZmlyc3QgLSAxXSAtICh4ZnNfY2FkZHJfdClibG9jayk7CisJbGFzdCA9IChpbnQpKCgoeGZzX2NhZGRyX3QpJmtwW2tsYXN0XSAtIDEpIC0gKHhmc19jYWRkcl90KWJsb2NrKTsKKwl4ZnNfdHJhbnNfbG9nX2J1ZihjdXItPmJjX3RwLCBicCwgZmlyc3QsIGxhc3QpOworfQorCisvKgorICogTG9nIGJsb2NrIHBvaW50ZXIgZmllbGRzIGZyb20gYSBidHJlZSBibG9jayAobm9ubGVhZikuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYWxsb2NfbG9nX3B0cnMoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYnVmX3QJCSpicCwJLyogYnVmZmVyIGNvbnRhaW5pbmcgYnRyZWUgYmxvY2sgKi8KKwlpbnQJCQlwZmlyc3QsCS8qIGluZGV4IG9mIGZpcnN0IHBvaW50ZXIgdG8gbG9nICovCisJaW50CQkJcGxhc3QpCS8qIGluZGV4IG9mIGxhc3QgcG9pbnRlciB0byBsb2cgKi8KK3sKKwl4ZnNfYWxsb2NfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrIHRvIGxvZyBmcm9tICovCisJaW50CQkJZmlyc3Q7CS8qIGZpcnN0IGJ5dGUgb2Zmc2V0IGxvZ2dlZCAqLworCWludAkJCWxhc3Q7CS8qIGxhc3QgYnl0ZSBvZmZzZXQgbG9nZ2VkICovCisJeGZzX2FsbG9jX3B0cl90CQkqcHA7CS8qIGJsb2NrLXBvaW50ZXIgcG9pbnRlciBpbiBidHJlZSBibGsgKi8KKworCWJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhicCk7CisJcHAgPSBYRlNfQUxMT0NfUFRSX0FERFIoYmxvY2ssIDEsIGN1cik7CisJZmlyc3QgPSAoaW50KSgoeGZzX2NhZGRyX3QpJnBwW3BmaXJzdCAtIDFdIC0gKHhmc19jYWRkcl90KWJsb2NrKTsKKwlsYXN0ID0gKGludCkoKCh4ZnNfY2FkZHJfdCkmcHBbcGxhc3RdIC0gMSkgLSAoeGZzX2NhZGRyX3QpYmxvY2spOworCXhmc190cmFuc19sb2dfYnVmKGN1ci0+YmNfdHAsIGJwLCBmaXJzdCwgbGFzdCk7Cit9CisKKy8qCisgKiBMb2cgcmVjb3JkcyBmcm9tIGEgYnRyZWUgYmxvY2sgKGxlYWYpLgorICovCitTVEFUSUMgdm9pZAoreGZzX2FsbG9jX2xvZ19yZWNzKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2J1Zl90CQkqYnAsCS8qIGJ1ZmZlciBjb250YWluaW5nIGJ0cmVlIGJsb2NrICovCisJaW50CQkJcmZpcnN0LAkvKiBpbmRleCBvZiBmaXJzdCByZWNvcmQgdG8gbG9nICovCisJaW50CQkJcmxhc3QpCS8qIGluZGV4IG9mIGxhc3QgcmVjb3JkIHRvIGxvZyAqLworeworCXhmc19hbGxvY19ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgdG8gbG9nIGZyb20gKi8KKwlpbnQJCQlmaXJzdDsJLyogZmlyc3QgYnl0ZSBvZmZzZXQgbG9nZ2VkICovCisJaW50CQkJbGFzdDsJLyogbGFzdCBieXRlIG9mZnNldCBsb2dnZWQgKi8KKwl4ZnNfYWxsb2NfcmVjX3QJCSpycDsJLyogcmVjb3JkIHBvaW50ZXIgZm9yIGJ0cmVlIGJsb2NrICovCisKKworCWJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhicCk7CisJcnAgPSBYRlNfQUxMT0NfUkVDX0FERFIoYmxvY2ssIDEsIGN1cik7CisjaWZkZWYgREVCVUcKKwl7CisJCXhmc19hZ2ZfdAkqYWdmOworCQl4ZnNfYWxsb2NfcmVjX3QJKnA7CisKKwkJYWdmID0gWEZTX0JVRl9UT19BR0YoY3VyLT5iY19wcml2YXRlLmEuYWdicCk7CisJCWZvciAocCA9ICZycFtyZmlyc3QgLSAxXTsgcCA8PSAmcnBbcmxhc3QgLSAxXTsgcCsrKQorCQkJQVNTRVJUKElOVF9HRVQocC0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJUKSArIElOVF9HRVQocC0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKSA8PQorCQkJICAgICAgIElOVF9HRVQoYWdmLT5hZ2ZfbGVuZ3RoLCBBUkNIX0NPTlZFUlQpKTsKKwl9CisjZW5kaWYKKwlmaXJzdCA9IChpbnQpKCh4ZnNfY2FkZHJfdCkmcnBbcmZpcnN0IC0gMV0gLSAoeGZzX2NhZGRyX3QpYmxvY2spOworCWxhc3QgPSAoaW50KSgoKHhmc19jYWRkcl90KSZycFtybGFzdF0gLSAxKSAtICh4ZnNfY2FkZHJfdClibG9jayk7CisJeGZzX3RyYW5zX2xvZ19idWYoY3VyLT5iY190cCwgYnAsIGZpcnN0LCBsYXN0KTsKK30KKworLyoKKyAqIExvb2t1cCB0aGUgcmVjb3JkLiAgVGhlIGN1cnNvciBpcyBtYWRlIHRvIHBvaW50IHRvIGl0LCBiYXNlZCBvbiBkaXIuCisgKiBSZXR1cm4gMCBpZiBjYW4ndCBmaW5kIGFueSBzdWNoIHJlY29yZCwgMSBmb3Igc3VjY2Vzcy4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX2xvb2t1cCgKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19sb29rdXBfdAkJZGlyLAkvKiA8PSwgPT0sIG9yID49ICovCisJaW50CQkJKnN0YXQpCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCXhmc19hZ2Jsb2NrX3QJCWFnYm5vOwkvKiBhLmcuIHJlbGF0aXZlIGJ0cmVlIGJsb2NrIG51bWJlciAqLworCXhmc19hZ251bWJlcl90CQlhZ25vOwkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCXhmc19hbGxvY19ibG9ja190CSpibG9jaz1OVUxMOwkvKiBjdXJyZW50IGJ0cmVlIGJsb2NrICovCisJaW50CQkJZGlmZjsJLyogZGlmZmVyZW5jZSBmb3IgdGhlIGN1cnJlbnQga2V5ICovCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWtleW5vPTA7CS8qIGN1cnJlbnQga2V5IG51bWJlciAqLworCWludAkJCWxldmVsOwkvKiBsZXZlbCBpbiB0aGUgYnRyZWUgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCisJWEZTX1NUQVRTX0lOQyh4c19hYnRfbG9va3VwKTsKKwkvKgorCSAqIEdldCB0aGUgYWxsb2NhdGlvbiBncm91cCBoZWFkZXIsIGFuZCB0aGUgcm9vdCBibG9jayBudW1iZXIuCisJICovCisJbXAgPSBjdXItPmJjX21wOworCisJeworCQl4ZnNfYWdmX3QJKmFnZjsJLyogYS5nLiBmcmVlc3BhY2UgaGVhZGVyICovCisKKwkJYWdmID0gWEZTX0JVRl9UT19BR0YoY3VyLT5iY19wcml2YXRlLmEuYWdicCk7CisJCWFnbm8gPSBJTlRfR0VUKGFnZi0+YWdmX3NlcW5vLCBBUkNIX0NPTlZFUlQpOworCQlhZ2JubyA9IElOVF9HRVQoYWdmLT5hZ2Zfcm9vdHNbY3VyLT5iY19idG51bV0sIEFSQ0hfQ09OVkVSVCk7CisJfQorCS8qCisJICogSXRlcmF0ZSBvdmVyIGVhY2ggbGV2ZWwgaW4gdGhlIGJ0cmVlLCBzdGFydGluZyBhdCB0aGUgcm9vdC4KKwkgKiBGb3IgZWFjaCBsZXZlbCBhYm92ZSB0aGUgbGVhdmVzLCBmaW5kIHRoZSBrZXkgd2UgbmVlZCwgYmFzZWQKKwkgKiBvbiB0aGUgbG9va3VwIHJlY29yZCwgdGhlbiBmb2xsb3cgdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sKKwkgKiBwb2ludGVyIGRvd24gdG8gdGhlIG5leHQgbGV2ZWwuCisJICovCisJZm9yIChsZXZlbCA9IGN1ci0+YmNfbmxldmVscyAtIDEsIGRpZmYgPSAxOyBsZXZlbCA+PSAwOyBsZXZlbC0tKSB7CisJCXhmc19idWZfdAkqYnA7CS8qIGJ1ZmZlciBwb2ludGVyIGZvciBidHJlZSBibG9jayAqLworCQl4ZnNfZGFkZHJfdAlkOwkvKiBkaXNrIGFkZHJlc3Mgb2YgYnRyZWUgYmxvY2sgKi8KKworCQkvKgorCQkgKiBHZXQgdGhlIGRpc2sgYWRkcmVzcyB3ZSdyZSBsb29raW5nIGZvci4KKwkJICovCisJCWQgPSBYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLCBhZ2Jubyk7CisJCS8qCisJCSAqIElmIHRoZSBvbGQgYnVmZmVyIGF0IHRoaXMgbGV2ZWwgaXMgZm9yIGEgZGlmZmVyZW50IGJsb2NrLAorCQkgKiB0aHJvdyBpdCBhd2F5LCBvdGhlcndpc2UganVzdCB1c2UgaXQuCisJCSAqLworCQlicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CisJCWlmIChicCAmJiBYRlNfQlVGX0FERFIoYnApICE9IGQpCisJCQlicCA9ICh4ZnNfYnVmX3QgKikwOworCQlpZiAoIWJwKSB7CisJCQkvKgorCQkJICogTmVlZCB0byBnZXQgYSBuZXcgYnVmZmVyLiAgUmVhZCBpdCwgdGhlbgorCQkJICogc2V0IGl0IGluIHRoZSBjdXJzb3IsIHJlbGVhc2luZyB0aGUgb2xkIG9uZS4KKwkJCSAqLworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMobXAsIGN1ci0+YmNfdHAsIGFnbm8sCisJCQkJCWFnYm5vLCAwLCAmYnAsIFhGU19BTExPQ19CVFJFRV9SRUYpKSkKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl4ZnNfYnRyZWVfc2V0YnVmKGN1ciwgbGV2ZWwsIGJwKTsKKwkJCS8qCisJCQkgKiBQb2ludCB0byB0aGUgYnRyZWUgYmxvY2ssIG5vdyB0aGF0IHdlIGhhdmUgdGhlIGJ1ZmZlcgorCQkJICovCisJCQlibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0soYnApOworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsCisJCQkJCWJwKSkpCisJCQkJcmV0dXJuIGVycm9yOworCQl9IGVsc2UKKwkJCWJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhicCk7CisJCS8qCisJCSAqIElmIHdlIGFscmVhZHkgaGFkIGEga2V5IG1hdGNoIGF0IGEgaGlnaGVyIGxldmVsLCB3ZSBrbm93CisJCSAqIHdlIG5lZWQgdG8gdXNlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGlzIGJsb2NrLgorCQkgKi8KKwkJaWYgKGRpZmYgPT0gMCkKKwkJCWtleW5vID0gMTsKKwkJLyoKKwkJICogT3RoZXJ3aXNlIHdlIG5lZWQgdG8gc2VhcmNoIHRoaXMgYmxvY2suICBEbyBhIGJpbmFyeSBzZWFyY2guCisJCSAqLworCQllbHNlIHsKKwkJCWludAkJaGlnaDsJLyogaGlnaCBlbnRyeSBudW1iZXIgKi8KKwkJCXhmc19hbGxvY19rZXlfdAkqa2tiYXNlPU5VTEw7LyogYmFzZSBvZiBrZXlzIGluIGJsb2NrICovCisJCQl4ZnNfYWxsb2NfcmVjX3QJKmtyYmFzZT1OVUxMOy8qIGJhc2Ugb2YgcmVjb3JkcyBpbiBibG9jayAqLworCQkJaW50CQlsb3c7CS8qIGxvdyBlbnRyeSBudW1iZXIgKi8KKworCQkJLyoKKwkJCSAqIEdldCBhIHBvaW50ZXIgdG8ga2V5cyBvciByZWNvcmRzLgorCQkJICovCisJCQlpZiAobGV2ZWwgPiAwKQorCQkJCWtrYmFzZSA9IFhGU19BTExPQ19LRVlfQUREUihibG9jaywgMSwgY3VyKTsKKwkJCWVsc2UKKwkJCQlrcmJhc2UgPSBYRlNfQUxMT0NfUkVDX0FERFIoYmxvY2ssIDEsIGN1cik7CisJCQkvKgorCQkJICogU2V0IGxvdyBhbmQgaGlnaCBlbnRyeSBudW1iZXJzLCAxLWJhc2VkLgorCQkJICovCisJCQlsb3cgPSAxOworCQkJaWYgKCEoaGlnaCA9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpKSB7CisJCQkJLyoKKwkJCQkgKiBJZiB0aGUgYmxvY2sgaXMgZW1wdHksIHRoZSB0cmVlIG11c3QKKwkJCQkgKiBiZSBhbiBlbXB0eSBsZWFmLgorCQkJCSAqLworCQkJCUFTU0VSVChsZXZlbCA9PSAwICYmIGN1ci0+YmNfbmxldmVscyA9PSAxKTsKKwkJCQljdXItPmJjX3B0cnNbMF0gPSBkaXIgIT0gWEZTX0xPT0tVUF9MRTsKKwkJCQkqc3RhdCA9IDA7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkvKgorCQkJICogQmluYXJ5IHNlYXJjaCB0aGUgYmxvY2suCisJCQkgKi8KKwkJCXdoaWxlIChsb3cgPD0gaGlnaCkgeworCQkJCXhmc19leHRsZW5fdAlibG9ja2NvdW50OwkvKiBrZXkgdmFsdWUgKi8KKwkJCQl4ZnNfYWdibG9ja190CXN0YXJ0YmxvY2s7CS8qIGtleSB2YWx1ZSAqLworCisJCQkJWEZTX1NUQVRTX0lOQyh4c19hYnRfY29tcGFyZSk7CisJCQkJLyoKKwkJCQkgKiBrZXlubyBpcyBhdmVyYWdlIG9mIGxvdyBhbmQgaGlnaC4KKwkJCQkgKi8KKwkJCQlrZXlubyA9IChsb3cgKyBoaWdoKSA+PiAxOworCQkJCS8qCisJCQkJICogR2V0IHN0YXJ0YmxvY2sgJiBibG9ja2NvdW50LgorCQkJCSAqLworCQkJCWlmIChsZXZlbCA+IDApIHsKKwkJCQkJeGZzX2FsbG9jX2tleV90CSpra3A7CisKKwkJCQkJa2twID0ga2tiYXNlICsga2V5bm8gLSAxOworCQkJCQlzdGFydGJsb2NrID0gSU5UX0dFVChra3AtPmFyX3N0YXJ0YmxvY2ssIEFSQ0hfQ09OVkVSVCk7CisJCQkJCWJsb2NrY291bnQgPSBJTlRfR0VUKGtrcC0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJCQl9IGVsc2UgeworCQkJCQl4ZnNfYWxsb2NfcmVjX3QJKmtycDsKKworCQkJCQlrcnAgPSBrcmJhc2UgKyBrZXlubyAtIDE7CisJCQkJCXN0YXJ0YmxvY2sgPSBJTlRfR0VUKGtycC0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJUKTsKKwkJCQkJYmxvY2tjb3VudCA9IElOVF9HRVQoa3JwLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIENvbXB1dGUgZGlmZmVyZW5jZSB0byBnZXQgbmV4dCBkaXJlY3Rpb24uCisJCQkJICovCisJCQkJaWYgKGN1ci0+YmNfYnRudW0gPT0gWEZTX0JUTlVNX0JOTykKKwkJCQkJZGlmZiA9IChpbnQpc3RhcnRibG9jayAtCisJCQkJCSAgICAgICAoaW50KWN1ci0+YmNfcmVjLmEuYXJfc3RhcnRibG9jazsKKwkJCQllbHNlIGlmICghKGRpZmYgPSAoaW50KWJsb2NrY291bnQgLQorCQkJCQkgICAgKGludCljdXItPmJjX3JlYy5hLmFyX2Jsb2NrY291bnQpKQorCQkJCQlkaWZmID0gKGludClzdGFydGJsb2NrIC0KKwkJCQkJICAgIChpbnQpY3VyLT5iY19yZWMuYS5hcl9zdGFydGJsb2NrOworCQkJCS8qCisJCQkJICogTGVzcyB0aGFuLCBtb3ZlIHJpZ2h0LgorCQkJCSAqLworCQkJCWlmIChkaWZmIDwgMCkKKwkJCQkJbG93ID0ga2V5bm8gKyAxOworCQkJCS8qCisJCQkJICogR3JlYXRlciB0aGFuLCBtb3ZlIGxlZnQuCisJCQkJICovCisJCQkJZWxzZSBpZiAoZGlmZiA+IDApCisJCQkJCWhpZ2ggPSBrZXlubyAtIDE7CisJCQkJLyoKKwkJCQkgKiBFcXVhbCwgd2UncmUgZG9uZS4KKwkJCQkgKi8KKwkJCQllbHNlCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qCisJCSAqIElmIHRoZXJlIGFyZSBtb3JlIGxldmVscywgc2V0IHVwIGZvciB0aGUgbmV4dCBsZXZlbAorCQkgKiBieSBnZXR0aW5nIHRoZSBibG9jayBudW1iZXIgYW5kIGZpbGxpbmcgaW4gdGhlIGN1cnNvci4KKwkJICovCisJCWlmIChsZXZlbCA+IDApIHsKKwkJCS8qCisJCQkgKiBJZiB3ZSBtb3ZlZCBsZWZ0LCBuZWVkIHRoZSBwcmV2aW91cyBrZXkgbnVtYmVyLAorCQkJICogdW5sZXNzIHRoZXJlIGlzbid0IG9uZS4KKwkJCSAqLworCQkJaWYgKGRpZmYgPiAwICYmIC0ta2V5bm8gPCAxKQorCQkJCWtleW5vID0gMTsKKwkJCWFnYm5vID0gSU5UX0dFVCgqWEZTX0FMTE9DX1BUUl9BRERSKGJsb2NrLCBrZXlubywgY3VyKSwgQVJDSF9DT05WRVJUKTsKKyNpZmRlZiBERUJVRworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgYWdibm8sIGxldmVsKSkpCisJCQkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJCQljdXItPmJjX3B0cnNbbGV2ZWxdID0ga2V5bm87CisJCX0KKwl9CisJLyoKKwkgKiBEb25lIHdpdGggdGhlIHNlYXJjaC4KKwkgKiBTZWUgaWYgd2UgbmVlZCB0byBhZGp1c3QgdGhlIHJlc3VsdHMuCisJICovCisJaWYgKGRpciAhPSBYRlNfTE9PS1VQX0xFICYmIGRpZmYgPCAwKSB7CisJCWtleW5vKys7CisJCS8qCisJCSAqIElmIGdlIHNlYXJjaCBhbmQgd2Ugd2VudCBvZmYgdGhlIGVuZCBvZiB0aGUgYmxvY2ssIGJ1dCBpdCdzCisJCSAqIG5vdCB0aGUgbGFzdCBibG9jaywgd2UncmUgaW4gdGhlIHdyb25nIGJsb2NrLgorCQkgKi8KKwkJaWYgKGRpciA9PSBYRlNfTE9PS1VQX0dFICYmCisJCSAgICBrZXlubyA+IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgJiYKKwkJICAgIElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpICE9IE5VTExBR0JMT0NLKSB7CisJCQlpbnQJaTsKKworCQkJY3VyLT5iY19wdHJzWzBdID0ga2V5bm87CisJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2luY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQkJcmV0dXJuIGVycm9yOworCQkJWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTihpID09IDEpOworCQkJKnN0YXQgPSAxOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJZWxzZSBpZiAoZGlyID09IFhGU19MT09LVVBfTEUgJiYgZGlmZiA+IDApCisJCWtleW5vLS07CisJY3VyLT5iY19wdHJzWzBdID0ga2V5bm87CisJLyoKKwkgKiBSZXR1cm4gaWYgd2Ugc3VjY2VlZGVkIG9yIG5vdC4KKwkgKi8KKwlpZiAoa2V5bm8gPT0gMCB8fCBrZXlubyA+IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpCisJCSpzdGF0ID0gMDsKKwllbHNlCisJCSpzdGF0ID0gKChkaXIgIT0gWEZTX0xPT0tVUF9FUSkgfHwgKGRpZmYgPT0gMCkpOworCXJldHVybiAwOworfQorCisvKgorICogTW92ZSAxIHJlY29yZCBsZWZ0IGZyb20gY3VyL2xldmVsIGlmIHBvc3NpYmxlLgorICogVXBkYXRlIGN1ciB0byByZWZsZWN0IHRoZSBuZXcgcGF0aC4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX2xzaGlmdCgKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldmVsLAkvKiBsZXZlbCB0byBzaGlmdCByZWNvcmQgb24gKi8KKwlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworI2lmZGVmIERFQlVHCisJaW50CQkJaTsJLyogbG9vcCBpbmRleCAqLworI2VuZGlmCisJeGZzX2FsbG9jX2tleV90CQlrZXk7CS8qIGtleSB2YWx1ZSBmb3IgbGVhZiBsZXZlbCB1cHdhcmQgKi8KKwl4ZnNfYnVmX3QJCSpsYnA7CS8qIGJ1ZmZlciBmb3IgbGVmdCBuZWlnaGJvciBibG9jayAqLworCXhmc19hbGxvY19ibG9ja190CSpsZWZ0OwkvKiBsZWZ0IG5laWdoYm9yIGJ0cmVlIGJsb2NrICovCisJaW50CQkJbnJlYzsJLyogbmV3IG51bWJlciBvZiBsZWZ0IGJsb2NrIGVudHJpZXMgKi8KKwl4ZnNfYnVmX3QJCSpyYnA7CS8qIGJ1ZmZlciBmb3IgcmlnaHQgKGN1cnJlbnQpIGJsb2NrICovCisJeGZzX2FsbG9jX2Jsb2NrX3QJKnJpZ2h0OwkvKiByaWdodCAoY3VycmVudCkgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfYWxsb2Nfa2V5X3QJCSpya3A9TlVMTDsJLyoga2V5IHBvaW50ZXIgZm9yIHJpZ2h0IGJsb2NrICovCisJeGZzX2FsbG9jX3B0cl90CQkqcnBwPU5VTEw7CS8qIGFkZHJlc3MgcG9pbnRlciBmb3IgcmlnaHQgYmxvY2sgKi8KKwl4ZnNfYWxsb2NfcmVjX3QJCSpycnA9TlVMTDsJLyogcmVjb3JkIHBvaW50ZXIgZm9yIHJpZ2h0IGJsb2NrICovCisKKwkvKgorCSAqIFNldCB1cCB2YXJpYWJsZXMgZm9yIHRoaXMgYmxvY2sgYXMgInJpZ2h0Ii4KKwkgKi8KKwlyYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOworCXJpZ2h0ID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhyYnApOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCByaWdodCwgbGV2ZWwsIHJicCkpKQorCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkvKgorCSAqIElmIHdlJ3ZlIGdvdCBubyBsZWZ0IHNpYmxpbmcgdGhlbiB3ZSBjYW4ndCBzaGlmdCBhbiBlbnRyeSBsZWZ0LgorCSAqLworCWlmIChJTlRfR0VUKHJpZ2h0LT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExBR0JMT0NLKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogSWYgdGhlIGN1cnNvciBlbnRyeSBpcyB0aGUgb25lIHRoYXQgd291bGQgYmUgbW92ZWQsIGRvbid0CisJICogZG8gaXQuLi4gaXQncyB0b28gY29tcGxpY2F0ZWQuCisJICovCisJaWYgKGN1ci0+YmNfcHRyc1tsZXZlbF0gPD0gMSkgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIFNldCB1cCB0aGUgbGVmdCBuZWlnaGJvciBhcyAibGVmdCIuCisJICovCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY190cCwKKwkJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIElOVF9HRVQocmlnaHQtPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCksIDAsICZsYnAsCisJCQlYRlNfQUxMT0NfQlRSRUVfUkVGKSkpCisJCXJldHVybiBlcnJvcjsKKwlsZWZ0ID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhsYnApOworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKQorCQlyZXR1cm4gZXJyb3I7CisJLyoKKwkgKiBJZiBpdCdzIGZ1bGwsIGl0IGNhbid0IHRha2UgYW5vdGhlciBlbnRyeS4KKwkgKi8KKwlpZiAoSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19BTExPQ19CTE9DS19NQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCW5yZWMgPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxOworCS8qCisJICogSWYgbm9uLWxlYWYsIGNvcHkgYSBrZXkgYW5kIGEgcHRyIHRvIHRoZSBsZWZ0IGJsb2NrLgorCSAqLworCWlmIChsZXZlbCA+IDApIHsKKwkJeGZzX2FsbG9jX2tleV90CSpsa3A7CS8qIGtleSBwb2ludGVyIGZvciBsZWZ0IGJsb2NrICovCisJCXhmc19hbGxvY19wdHJfdAkqbHBwOwkvKiBhZGRyZXNzIHBvaW50ZXIgZm9yIGxlZnQgYmxvY2sgKi8KKworCQlsa3AgPSBYRlNfQUxMT0NfS0VZX0FERFIobGVmdCwgbnJlYywgY3VyKTsKKwkJcmtwID0gWEZTX0FMTE9DX0tFWV9BRERSKHJpZ2h0LCAxLCBjdXIpOworCQkqbGtwID0gKnJrcDsKKwkJeGZzX2FsbG9jX2xvZ19rZXlzKGN1ciwgbGJwLCBucmVjLCBucmVjKTsKKwkJbHBwID0gWEZTX0FMTE9DX1BUUl9BRERSKGxlZnQsIG5yZWMsIGN1cik7CisJCXJwcCA9IFhGU19BTExPQ19QVFJfQUREUihyaWdodCwgMSwgY3VyKTsKKyNpZmRlZiBERUJVRworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCBJTlRfR0VUKCpycHAsIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpCisJCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkJKmxwcCA9ICpycHA7IC8qIElOVF86IGNvcHkgKi8KKwkJeGZzX2FsbG9jX2xvZ19wdHJzKGN1ciwgbGJwLCBucmVjLCBucmVjKTsKKwkJeGZzX2J0cmVlX2NoZWNrX2tleShjdXItPmJjX2J0bnVtLCBsa3AgLSAxLCBsa3ApOworCX0KKwkvKgorCSAqIElmIGxlYWYsIGNvcHkgYSByZWNvcmQgdG8gdGhlIGxlZnQgYmxvY2suCisJICovCisJZWxzZSB7CisJCXhmc19hbGxvY19yZWNfdAkqbHJwOwkvKiByZWNvcmQgcG9pbnRlciBmb3IgbGVmdCBibG9jayAqLworCisJCWxycCA9IFhGU19BTExPQ19SRUNfQUREUihsZWZ0LCBucmVjLCBjdXIpOworCQlycnAgPSBYRlNfQUxMT0NfUkVDX0FERFIocmlnaHQsIDEsIGN1cik7CisJCSpscnAgPSAqcnJwOworCQl4ZnNfYWxsb2NfbG9nX3JlY3MoY3VyLCBsYnAsIG5yZWMsIG5yZWMpOworCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKGN1ci0+YmNfYnRudW0sIGxycCAtIDEsIGxycCk7CisJfQorCS8qCisJICogQnVtcCBhbmQgbG9nIGxlZnQncyBudW1yZWNzLCBkZWNyZW1lbnQgYW5kIGxvZyByaWdodCdzIG51bXJlY3MuCisJICovCisJSU5UX01PRChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsICsxKTsKKwl4ZnNfYWxsb2NfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIGxicCwgWEZTX0JCX05VTVJFQ1MpOworCUlOVF9NT0QocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgLTEpOworCXhmc19hbGxvY19sb2dfYmxvY2soY3VyLT5iY190cCwgcmJwLCBYRlNfQkJfTlVNUkVDUyk7CisJLyoKKwkgKiBTbGlkZSB0aGUgY29udGVudHMgb2YgcmlnaHQgZG93biBvbmUgZW50cnkuCisJICovCisJaWYgKGxldmVsID4gMCkgeworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOyBpKyspIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIElOVF9HRVQocnBwW2kgKyAxXSwgQVJDSF9DT05WRVJUKSwKKwkJCQkJbGV2ZWwpKSkKKwkJCQlyZXR1cm4gZXJyb3I7CisJCX0KKyNlbmRpZgorCQltZW1tb3ZlKHJrcCwgcmtwICsgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcmtwKSk7CisJCW1lbW1vdmUocnBwLCBycHAgKyAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycHApKTsKKwkJeGZzX2FsbG9jX2xvZ19rZXlzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJeGZzX2FsbG9jX2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwl9IGVsc2UgeworCQltZW1tb3ZlKHJycCwgcnJwICsgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcnJwKSk7CisJCXhmc19hbGxvY19sb2dfcmVjcyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJCWtleS5hcl9zdGFydGJsb2NrID0gcnJwLT5hcl9zdGFydGJsb2NrOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCQlrZXkuYXJfYmxvY2tjb3VudCA9IHJycC0+YXJfYmxvY2tjb3VudDsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJcmtwID0gJmtleTsKKwl9CisJLyoKKwkgKiBVcGRhdGUgdGhlIHBhcmVudCBrZXkgdmFsdWVzIG9mIHJpZ2h0LgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfdXBka2V5KGN1ciwgcmtwLCBsZXZlbCArIDEpKSkKKwkJcmV0dXJuIGVycm9yOworCS8qCisJICogU2xpZGUgdGhlIGN1cnNvciB2YWx1ZSBsZWZ0IG9uZS4KKwkgKi8KKwljdXItPmJjX3B0cnNbbGV2ZWxdLS07CisJKnN0YXQgPSAxOworCXJldHVybiAwOworfQorCisvKgorICogQWxsb2NhdGUgYSBuZXcgcm9vdCBibG9jaywgZmlsbCBpdCBpbi4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX25ld3Jvb3QoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19hZ2Jsb2NrX3QJCWxibm87CS8qIGxlZnQgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CQkqbGJwOwkvKiBsZWZ0IGJ0cmVlIGJ1ZmZlciAqLworCXhmc19hbGxvY19ibG9ja190CSpsZWZ0OwkvKiBsZWZ0IGJ0cmVlIGJsb2NrICovCisJeGZzX21vdW50X3QJCSptcDsJLyogbW91bnQgc3RydWN0dXJlICovCisJeGZzX2FnYmxvY2tfdAkJbmJubzsJLyogbmV3IGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkJKm5icDsJLyogbmV3IChyb290KSBidWZmZXIgKi8KKwl4ZnNfYWxsb2NfYmxvY2tfdAkqbmV3OwkvKiBuZXcgKHJvb3QpIGJ0cmVlIGJsb2NrICovCisJaW50CQkJbnB0cjsJLyogbmV3IHZhbHVlIGZvciBrZXkgaW5kZXgsIDEgb3IgMiAqLworCXhmc19hZ2Jsb2NrX3QJCXJibm87CS8qIHJpZ2h0IGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkJKnJicDsJLyogcmlnaHQgYnRyZWUgYnVmZmVyICovCisJeGZzX2FsbG9jX2Jsb2NrX3QJKnJpZ2h0OwkvKiByaWdodCBidHJlZSBibG9jayAqLworCisJbXAgPSBjdXItPmJjX21wOworCisJQVNTRVJUKGN1ci0+YmNfbmxldmVscyA8IFhGU19BR19NQVhMRVZFTFMobXApKTsKKwkvKgorCSAqIEdldCBhIGJ1ZmZlciBmcm9tIHRoZSBmcmVlbGlzdCBibG9ja3MsIGZvciB0aGUgbmV3IHJvb3QuCisJICovCisJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfZnJlZWxpc3QoY3VyLT5iY190cCwgY3VyLT5iY19wcml2YXRlLmEuYWdicCwKKwkJCSZuYm5vKSkpCisJCXJldHVybiBlcnJvcjsKKwkvKgorCSAqIE5vbmUgYXZhaWxhYmxlLCB3ZSBmYWlsLgorCSAqLworCWlmIChuYm5vID09IE5VTExBR0JMT0NLKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCXhmc190cmFuc19hZ2J0cmVlX2RlbHRhKGN1ci0+YmNfdHAsIDEpOworCW5icCA9IHhmc19idHJlZV9nZXRfYnVmcyhtcCwgY3VyLT5iY190cCwgY3VyLT5iY19wcml2YXRlLmEuYWdubywgbmJubywKKwkJMCk7CisJbmV3ID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhuYnApOworCS8qCisJICogU2V0IHRoZSByb290IGRhdGEgaW4gdGhlIGEuZy4gZnJlZXNwYWNlIHN0cnVjdHVyZS4KKwkgKi8KKwl7CisJCXhmc19hZ2ZfdAkqYWdmOwkvKiBhLmcuIGZyZWVzcGFjZSBoZWFkZXIgKi8KKwkJeGZzX2FnbnVtYmVyX3QJc2Vxbm87CisKKwkJYWdmID0gWEZTX0JVRl9UT19BR0YoY3VyLT5iY19wcml2YXRlLmEuYWdicCk7CisJCUlOVF9TRVQoYWdmLT5hZ2Zfcm9vdHNbY3VyLT5iY19idG51bV0sIEFSQ0hfQ09OVkVSVCwgbmJubyk7CisJCUlOVF9NT0QoYWdmLT5hZ2ZfbGV2ZWxzW2N1ci0+YmNfYnRudW1dLCBBUkNIX0NPTlZFUlQsIDEpOworCQlzZXFubyA9IElOVF9HRVQoYWdmLT5hZ2Zfc2Vxbm8sIEFSQ0hfQ09OVkVSVCk7CisJCW1wLT5tX3BlcmFnW3NlcW5vXS5wYWdmX2xldmVsc1tjdXItPmJjX2J0bnVtXSsrOworCQl4ZnNfYWxsb2NfbG9nX2FnZihjdXItPmJjX3RwLCBjdXItPmJjX3ByaXZhdGUuYS5hZ2JwLAorCQkJWEZTX0FHRl9ST09UUyB8IFhGU19BR0ZfTEVWRUxTKTsKKwl9CisJLyoKKwkgKiBBdCB0aGUgcHJldmlvdXMgcm9vdCBsZXZlbCB0aGVyZSBhcmUgbm93IHR3byBibG9ja3M6IHRoZSBvbGQKKwkgKiByb290LCBhbmQgdGhlIG5ldyBibG9jayBnZW5lcmF0ZWQgd2hlbiBpdCB3YXMgc3BsaXQuCisJICogV2UgZG9uJ3Qga25vdyB3aGljaCBvbmUgdGhlIGN1cnNvciBpcyBwb2ludGluZyBhdCwgc28gd2UKKwkgKiBzZXQgdXAgdmFyaWFibGVzICJsZWZ0IiBhbmQgInJpZ2h0IiBmb3IgZWFjaCBjYXNlLgorCSAqLworCWxicCA9IGN1ci0+YmNfYnVmc1tjdXItPmJjX25sZXZlbHMgLSAxXTsKKwlsZWZ0ID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhsYnApOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBsZWZ0LCBjdXItPmJjX25sZXZlbHMgLSAxLCBsYnApKSkKKwkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJaWYgKElOVF9HRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTEFHQkxPQ0spIHsKKwkJLyoKKwkJICogT3VyIGJsb2NrIGlzIGxlZnQsIHBpY2sgdXAgdGhlIHJpZ2h0IGJsb2NrLgorCQkgKi8KKwkJbGJubyA9IFhGU19EQUREUl9UT19BR0JOTyhtcCwgWEZTX0JVRl9BRERSKGxicCkpOworCQlyYm5vID0gSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKTsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMobXAsIGN1ci0+YmNfdHAsCisJCQkJY3VyLT5iY19wcml2YXRlLmEuYWdubywgcmJubywgMCwgJnJicCwKKwkJCQlYRlNfQUxMT0NfQlRSRUVfUkVGKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCXJpZ2h0ID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhyYnApOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIHJpZ2h0LAorCQkJCWN1ci0+YmNfbmxldmVscyAtIDEsIHJicCkpKQorCQkJcmV0dXJuIGVycm9yOworCQlucHRyID0gMTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBPdXIgYmxvY2sgaXMgcmlnaHQsIHBpY2sgdXAgdGhlIGxlZnQgYmxvY2suCisJCSAqLworCQlyYnAgPSBsYnA7CisJCXJpZ2h0ID0gbGVmdDsKKwkJcmJubyA9IFhGU19EQUREUl9UT19BR0JOTyhtcCwgWEZTX0JVRl9BRERSKHJicCkpOworCQlsYm5vID0gSU5UX0dFVChyaWdodC0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKTsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMobXAsIGN1ci0+YmNfdHAsCisJCQkJY3VyLT5iY19wcml2YXRlLmEuYWdubywgbGJubywgMCwgJmxicCwKKwkJCQlYRlNfQUxMT0NfQlRSRUVfUkVGKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCWxlZnQgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGxicCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwKKwkJCQljdXItPmJjX25sZXZlbHMgLSAxLCBsYnApKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJbnB0ciA9IDI7CisJfQorCS8qCisJICogRmlsbCBpbiB0aGUgbmV3IGJsb2NrJ3MgYnRyZWUgaGVhZGVyIGFuZCBsb2cgaXQuCisJICovCisJSU5UX1NFVChuZXctPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQsIHhmc19tYWdpY3NbY3VyLT5iY19idG51bV0pOworCUlOVF9TRVQobmV3LT5iYl9sZXZlbCwgQVJDSF9DT05WRVJULCAoX191aW50MTZfdCljdXItPmJjX25sZXZlbHMpOworCUlOVF9TRVQobmV3LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIDIpOworCUlOVF9TRVQobmV3LT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExBR0JMT0NLKTsKKwlJTlRfU0VUKG5ldy0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCwgTlVMTEFHQkxPQ0spOworCXhmc19hbGxvY19sb2dfYmxvY2soY3VyLT5iY190cCwgbmJwLCBYRlNfQkJfQUxMX0JJVFMpOworCUFTU0VSVChsYm5vICE9IE5VTExBR0JMT0NLICYmIHJibm8gIT0gTlVMTEFHQkxPQ0spOworCS8qCisJICogRmlsbCBpbiB0aGUga2V5IGRhdGEgaW4gdGhlIG5ldyByb290LgorCSAqLworCXsKKwkJeGZzX2FsbG9jX2tleV90CQkqa3A7CS8qIGJ0cmVlIGtleSBwb2ludGVyICovCisKKwkJa3AgPSBYRlNfQUxMT0NfS0VZX0FERFIobmV3LCAxLCBjdXIpOworCQlpZiAoSU5UX0dFVChsZWZ0LT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSA+IDApIHsKKwkJCWtwWzBdID0gKlhGU19BTExPQ19LRVlfQUREUihsZWZ0LCAxLCBjdXIpOyAvKiBJTlRfOiBzdHJ1Y3R1cmUgY29weSAqLworCQkJa3BbMV0gPSAqWEZTX0FMTE9DX0tFWV9BRERSKHJpZ2h0LCAxLCBjdXIpOy8qIElOVF86IHN0cnVjdHVyZSBjb3B5ICovCisJCX0gZWxzZSB7CisJCQl4ZnNfYWxsb2NfcmVjX3QJKnJwOwkvKiBidHJlZSByZWNvcmQgcG9pbnRlciAqLworCisJCQlycCA9IFhGU19BTExPQ19SRUNfQUREUihsZWZ0LCAxLCBjdXIpOworCQkJa3BbMF0uYXJfc3RhcnRibG9jayA9IHJwLT5hcl9zdGFydGJsb2NrOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCQkJa3BbMF0uYXJfYmxvY2tjb3VudCA9IHJwLT5hcl9ibG9ja2NvdW50OyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCQkJcnAgPSBYRlNfQUxMT0NfUkVDX0FERFIocmlnaHQsIDEsIGN1cik7CisJCQlrcFsxXS5hcl9zdGFydGJsb2NrID0gcnAtPmFyX3N0YXJ0YmxvY2s7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCQlrcFsxXS5hcl9ibG9ja2NvdW50ID0gcnAtPmFyX2Jsb2NrY291bnQ7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCX0KKwl9CisJeGZzX2FsbG9jX2xvZ19rZXlzKGN1ciwgbmJwLCAxLCAyKTsKKwkvKgorCSAqIEZpbGwgaW4gdGhlIHBvaW50ZXIgZGF0YSBpbiB0aGUgbmV3IHJvb3QuCisJICovCisJeworCQl4ZnNfYWxsb2NfcHRyX3QJCSpwcDsJLyogYnRyZWUgYWRkcmVzcyBwb2ludGVyICovCisKKwkJcHAgPSBYRlNfQUxMT0NfUFRSX0FERFIobmV3LCAxLCBjdXIpOworCQlJTlRfU0VUKHBwWzBdLCBBUkNIX0NPTlZFUlQsIGxibm8pOworCQlJTlRfU0VUKHBwWzFdLCBBUkNIX0NPTlZFUlQsIHJibm8pOworCX0KKwl4ZnNfYWxsb2NfbG9nX3B0cnMoY3VyLCBuYnAsIDEsIDIpOworCS8qCisJICogRml4IHVwIHRoZSBjdXJzb3IuCisJICovCisJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGN1ci0+YmNfbmxldmVscywgbmJwKTsKKwljdXItPmJjX3B0cnNbY3VyLT5iY19ubGV2ZWxzXSA9IG5wdHI7CisJY3VyLT5iY19ubGV2ZWxzKys7CisJKnN0YXQgPSAxOworCXJldHVybiAwOworfQorCisvKgorICogTW92ZSAxIHJlY29yZCByaWdodCBmcm9tIGN1ci9sZXZlbCBpZiBwb3NzaWJsZS4KKyAqIFVwZGF0ZSBjdXIgdG8gcmVmbGVjdCB0aGUgbmV3IHBhdGguCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19yc2hpZnQoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgdG8gc2hpZnQgcmVjb3JkIG9uICovCisJaW50CQkJKnN0YXQpCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlpOwkvKiBsb29wIGluZGV4ICovCisJeGZzX2FsbG9jX2tleV90CQlrZXk7CS8qIGtleSB2YWx1ZSBmb3IgbGVhZiBsZXZlbCB1cHdhcmQgKi8KKwl4ZnNfYnVmX3QJCSpsYnA7CS8qIGJ1ZmZlciBmb3IgbGVmdCAoY3VycmVudCkgYmxvY2sgKi8KKwl4ZnNfYWxsb2NfYmxvY2tfdAkqbGVmdDsJLyogbGVmdCAoY3VycmVudCkgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfYnVmX3QJCSpyYnA7CS8qIGJ1ZmZlciBmb3IgcmlnaHQgbmVpZ2hib3IgYmxvY2sgKi8KKwl4ZnNfYWxsb2NfYmxvY2tfdAkqcmlnaHQ7CS8qIHJpZ2h0IG5laWdoYm9yIGJ0cmVlIGJsb2NrICovCisJeGZzX2FsbG9jX2tleV90CQkqcmtwOwkvKiBrZXkgcG9pbnRlciBmb3IgcmlnaHQgYmxvY2sgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJCSp0Y3VyOwkvKiB0ZW1wb3JhcnkgY3Vyc29yICovCisKKwkvKgorCSAqIFNldCB1cCB2YXJpYWJsZXMgZm9yIHRoaXMgYmxvY2sgYXMgImxlZnQiLgorCSAqLworCWxicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CisJbGVmdCA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0sobGJwKTsKKyNpZmRlZiBERUJVRworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKQorCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkvKgorCSAqIElmIHdlJ3ZlIGdvdCBubyByaWdodCBzaWJsaW5nIHRoZW4gd2UgY2FuJ3Qgc2hpZnQgYW4gZW50cnkgcmlnaHQuCisJICovCisJaWYgKElOVF9HRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTEFHQkxPQ0spIHsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBJZiB0aGUgY3Vyc29yIGVudHJ5IGlzIHRoZSBvbmUgdGhhdCB3b3VsZCBiZSBtb3ZlZCwgZG9uJ3QKKwkgKiBkbyBpdC4uLiBpdCdzIHRvbyBjb21wbGljYXRlZC4KKwkgKi8KKwlpZiAoY3VyLT5iY19wdHJzW2xldmVsXSA+PSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBTZXQgdXAgdGhlIHJpZ2h0IG5laWdoYm9yIGFzICJyaWdodCIuCisJICovCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY190cCwKKwkJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIElOVF9HRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCksIDAsICZyYnAsCisJCQlYRlNfQUxMT0NfQlRSRUVfUkVGKSkpCisJCXJldHVybiBlcnJvcjsKKwlyaWdodCA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0socmJwKTsKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIHJpZ2h0LCBsZXZlbCwgcmJwKSkpCisJCXJldHVybiBlcnJvcjsKKwkvKgorCSAqIElmIGl0J3MgZnVsbCwgaXQgY2FuJ3QgdGFrZSBhbm90aGVyIGVudHJ5LgorCSAqLworCWlmIChJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19BTExPQ19CTE9DS19NQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogTWFrZSBhIGhvbGUgYXQgdGhlIHN0YXJ0IG9mIHRoZSByaWdodCBuZWlnaGJvciBibG9jaywgdGhlbgorCSAqIGNvcHkgdGhlIGxhc3QgbGVmdCBibG9jayBlbnRyeSB0byB0aGUgaG9sZS4KKwkgKi8KKwlpZiAobGV2ZWwgPiAwKSB7CisJCXhmc19hbGxvY19rZXlfdAkqbGtwOwkvKiBrZXkgcG9pbnRlciBmb3IgbGVmdCBibG9jayAqLworCQl4ZnNfYWxsb2NfcHRyX3QJKmxwcDsJLyogYWRkcmVzcyBwb2ludGVyIGZvciBsZWZ0IGJsb2NrICovCisJCXhmc19hbGxvY19wdHJfdAkqcnBwOwkvKiBhZGRyZXNzIHBvaW50ZXIgZm9yIHJpZ2h0IGJsb2NrICovCisKKwkJbGtwID0gWEZTX0FMTE9DX0tFWV9BRERSKGxlZnQsIElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSwgY3VyKTsKKwkJbHBwID0gWEZTX0FMTE9DX1BUUl9BRERSKGxlZnQsIElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSwgY3VyKTsKKwkJcmtwID0gWEZTX0FMTE9DX0tFWV9BRERSKHJpZ2h0LCAxLCBjdXIpOworCQlycHAgPSBYRlNfQUxMT0NfUFRSX0FERFIocmlnaHQsIDEsIGN1cik7CisjaWZkZWYgREVCVUcKKwkJZm9yIChpID0gSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCBJTlRfR0VUKHJwcFtpXSwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkKKwkJCQlyZXR1cm4gZXJyb3I7CisJCX0KKyNlbmRpZgorCQltZW1tb3ZlKHJrcCArIDEsIHJrcCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcmtwKSk7CisJCW1lbW1vdmUocnBwICsgMSwgcnBwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycHApKTsKKyNpZmRlZiBERUJVRworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCBJTlRfR0VUKCpscHAsIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpCisJCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkJKnJrcCA9ICpsa3A7IC8qIElOVF86IGNvcHkgKi8KKwkJKnJwcCA9ICpscHA7IC8qIElOVF86IGNvcHkgKi8KKwkJeGZzX2FsbG9jX2xvZ19rZXlzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSk7CisJCXhmc19hbGxvY19sb2dfcHRycyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEpOworCQl4ZnNfYnRyZWVfY2hlY2tfa2V5KGN1ci0+YmNfYnRudW0sIHJrcCwgcmtwICsgMSk7CisJfSBlbHNlIHsKKwkJeGZzX2FsbG9jX3JlY190CSpscnA7CS8qIHJlY29yZCBwb2ludGVyIGZvciBsZWZ0IGJsb2NrICovCisJCXhmc19hbGxvY19yZWNfdAkqcnJwOwkvKiByZWNvcmQgcG9pbnRlciBmb3IgcmlnaHQgYmxvY2sgKi8KKworCQlscnAgPSBYRlNfQUxMT0NfUkVDX0FERFIobGVmdCwgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpLCBjdXIpOworCQlycnAgPSBYRlNfQUxMT0NfUkVDX0FERFIocmlnaHQsIDEsIGN1cik7CisJCW1lbW1vdmUocnJwICsgMSwgcnJwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycnApKTsKKwkJKnJycCA9ICpscnA7CisJCXhmc19hbGxvY19sb2dfcmVjcyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEpOworCQlrZXkuYXJfc3RhcnRibG9jayA9IHJycC0+YXJfc3RhcnRibG9jazsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJa2V5LmFyX2Jsb2NrY291bnQgPSBycnAtPmFyX2Jsb2NrY291bnQ7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCXJrcCA9ICZrZXk7CisJCXhmc19idHJlZV9jaGVja19yZWMoY3VyLT5iY19idG51bSwgcnJwLCBycnAgKyAxKTsKKwl9CisJLyoKKwkgKiBEZWNyZW1lbnQgYW5kIGxvZyBsZWZ0J3MgbnVtcmVjcywgYnVtcCBhbmQgbG9nIHJpZ2h0J3MgbnVtcmVjcy4KKwkgKi8KKwlJTlRfTU9EKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgLTEpOworCXhmc19hbGxvY19sb2dfYmxvY2soY3VyLT5iY190cCwgbGJwLCBYRlNfQkJfTlVNUkVDUyk7CisJSU5UX01PRChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCArMSk7CisJeGZzX2FsbG9jX2xvZ19ibG9jayhjdXItPmJjX3RwLCByYnAsIFhGU19CQl9OVU1SRUNTKTsKKwkvKgorCSAqIFVzaW5nIGEgdGVtcG9yYXJ5IGN1cnNvciwgdXBkYXRlIHRoZSBwYXJlbnQga2V5IHZhbHVlcyBvZiB0aGUKKwkgKiBibG9jayBvbiB0aGUgcmlnaHQuCisJICovCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9kdXBfY3Vyc29yKGN1ciwgJnRjdXIpKSkKKwkJcmV0dXJuIGVycm9yOworCWkgPSB4ZnNfYnRyZWVfbGFzdHJlYyh0Y3VyLCBsZXZlbCk7CisJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfaW5jcmVtZW50KHRjdXIsIGxldmVsLCAmaSkpIHx8CisJICAgIChlcnJvciA9IHhmc19hbGxvY191cGRrZXkodGN1ciwgcmtwLCBsZXZlbCArIDEpKSkKKwkJZ290byBlcnJvcjA7CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK2Vycm9yMDoKKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcih0Y3VyLCBYRlNfQlRSRUVfRVJST1IpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFNwbGl0IGN1ci9sZXZlbCBibG9jayBpbiBoYWxmLgorICogUmV0dXJuIG5ldyBibG9jayBudW1iZXIgYW5kIGl0cyBmaXJzdCByZWNvcmQgKHRvIGJlIGluc2VydGVkIGludG8gcGFyZW50KS4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX3NwbGl0KAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIHRvIHNwbGl0ICovCisJeGZzX2FnYmxvY2tfdAkJKmJub3AsCS8qIG91dHB1dDogYmxvY2sgbnVtYmVyIGFsbG9jYXRlZCAqLworCXhmc19hbGxvY19rZXlfdAkJKmtleXAsCS8qIG91dHB1dDogZmlyc3Qga2V5IG9mIG5ldyBibG9jayAqLworCXhmc19idHJlZV9jdXJfdAkJKipjdXJwLAkvKiBvdXRwdXQ6IG5ldyBjdXJzb3IgKi8KKwlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWk7CS8qIGxvb3AgaW5kZXgvcmVjb3JkIG51bWJlciAqLworCXhmc19hZ2Jsb2NrX3QJCWxibm87CS8qIGxlZnQgKGN1cnJlbnQpIGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkJKmxicDsJLyogYnVmZmVyIGZvciBsZWZ0IGJsb2NrICovCisJeGZzX2FsbG9jX2Jsb2NrX3QJKmxlZnQ7CS8qIGxlZnQgKGN1cnJlbnQpIGJ0cmVlIGJsb2NrICovCisJeGZzX2FnYmxvY2tfdAkJcmJubzsJLyogcmlnaHQgKG5ldykgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CQkqcmJwOwkvKiBidWZmZXIgZm9yIHJpZ2h0IGJsb2NrICovCisJeGZzX2FsbG9jX2Jsb2NrX3QJKnJpZ2h0OwkvKiByaWdodCAobmV3KSBidHJlZSBibG9jayAqLworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgbmV3IGJsb2NrIGZyb20gdGhlIGZyZWVsaXN0LgorCSAqIElmIHdlIGNhbid0IGRvIGl0LCB3ZSdyZSB0b2FzdC4gIEdpdmUgdXAuCisJICovCisJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfZnJlZWxpc3QoY3VyLT5iY190cCwgY3VyLT5iY19wcml2YXRlLmEuYWdicCwKKwkJCSZyYm5vKSkpCisJCXJldHVybiBlcnJvcjsKKwlpZiAocmJubyA9PSBOVUxMQUdCTE9DSykgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwl4ZnNfdHJhbnNfYWdidHJlZV9kZWx0YShjdXItPmJjX3RwLCAxKTsKKwlyYnAgPSB4ZnNfYnRyZWVfZ2V0X2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY190cCwgY3VyLT5iY19wcml2YXRlLmEuYWdubywKKwkJcmJubywgMCk7CisJLyoKKwkgKiBTZXQgdXAgdGhlIG5ldyBibG9jayBhcyAicmlnaHQiLgorCSAqLworCXJpZ2h0ID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhyYnApOworCS8qCisJICogIkxlZnQiIGlzIHRoZSBjdXJyZW50IChhY2NvcmRpbmcgdG8gdGhlIGN1cnNvcikgYmxvY2suCisJICovCisJbGJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKKwlsZWZ0ID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhsYnApOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBsZWZ0LCBsZXZlbCwgbGJwKSkpCisJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCS8qCisJICogRmlsbCBpbiB0aGUgYnRyZWUgaGVhZGVyIGZvciB0aGUgbmV3IGJsb2NrLgorCSAqLworCUlOVF9TRVQocmlnaHQtPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQsIHhmc19tYWdpY3NbY3VyLT5iY19idG51bV0pOworCXJpZ2h0LT5iYl9sZXZlbCA9IGxlZnQtPmJiX2xldmVsOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCUlOVF9TRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgKF9fdWludDE2X3QpKElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAvIDIpKTsKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IGlmIHRoZXJlJ3MgYW4gb2RkIG51bWJlciBvZiBlbnRyaWVzIG5vdywgdGhhdAorCSAqIGVhY2ggbmV3IGJsb2NrIHdpbGwgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZW50cmllcy4KKwkgKi8KKwlpZiAoKElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAmIDEpICYmCisJICAgIGN1ci0+YmNfcHRyc1tsZXZlbF0gPD0gSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEpCisJCUlOVF9NT0QocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgKzEpOworCWkgPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMTsKKwkvKgorCSAqIEZvciBub24tbGVhZiBibG9ja3MsIGNvcHkga2V5cyBhbmQgYWRkcmVzc2VzIG92ZXIgdG8gdGhlIG5ldyBibG9jay4KKwkgKi8KKwlpZiAobGV2ZWwgPiAwKSB7CisJCXhmc19hbGxvY19rZXlfdAkqbGtwOwkvKiBsZWZ0IGJ0cmVlIGtleSBwb2ludGVyICovCisJCXhmc19hbGxvY19wdHJfdAkqbHBwOwkvKiBsZWZ0IGJ0cmVlIGFkZHJlc3MgcG9pbnRlciAqLworCQl4ZnNfYWxsb2Nfa2V5X3QJKnJrcDsJLyogcmlnaHQgYnRyZWUga2V5IHBvaW50ZXIgKi8KKwkJeGZzX2FsbG9jX3B0cl90CSpycHA7CS8qIHJpZ2h0IGJ0cmVlIGFkZHJlc3MgcG9pbnRlciAqLworCisJCWxrcCA9IFhGU19BTExPQ19LRVlfQUREUihsZWZ0LCBpLCBjdXIpOworCQlscHAgPSBYRlNfQUxMT0NfUFRSX0FERFIobGVmdCwgaSwgY3VyKTsKKwkJcmtwID0gWEZTX0FMTE9DX0tFWV9BRERSKHJpZ2h0LCAxLCBjdXIpOworCQlycHAgPSBYRlNfQUxMT0NfUFRSX0FERFIocmlnaHQsIDEsIGN1cik7CisjaWZkZWYgREVCVUcKKwkJZm9yIChpID0gMDsgaSA8IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7IGkrKykgeworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgSU5UX0dFVChscHBbaV0sIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpCisJCQkJcmV0dXJuIGVycm9yOworCQl9CisjZW5kaWYKKwkJbWVtY3B5KHJrcCwgbGtwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpya3ApKTsgLyogSU5UXzogY29weSAqLworCQltZW1jcHkocnBwLCBscHAsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKnJwcCkpOyAvKiBJTlRfOiBjb3B5ICovCisJCXhmc19hbGxvY19sb2dfa2V5cyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJCXhmc19hbGxvY19sb2dfcHRycyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJCSprZXlwID0gKnJrcDsKKwl9CisJLyoKKwkgKiBGb3IgbGVhZiBibG9ja3MsIGNvcHkgcmVjb3JkcyBvdmVyIHRvIHRoZSBuZXcgYmxvY2suCisJICovCisJZWxzZSB7CisJCXhmc19hbGxvY19yZWNfdAkqbHJwOwkvKiBsZWZ0IGJ0cmVlIHJlY29yZCBwb2ludGVyICovCisJCXhmc19hbGxvY19yZWNfdAkqcnJwOwkvKiByaWdodCBidHJlZSByZWNvcmQgcG9pbnRlciAqLworCisJCWxycCA9IFhGU19BTExPQ19SRUNfQUREUihsZWZ0LCBpLCBjdXIpOworCQlycnAgPSBYRlNfQUxMT0NfUkVDX0FERFIocmlnaHQsIDEsIGN1cik7CisJCW1lbWNweShycnAsIGxycCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcnJwKSk7CisJCXhmc19hbGxvY19sb2dfcmVjcyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJCWtleXAtPmFyX3N0YXJ0YmxvY2sgPSBycnAtPmFyX3N0YXJ0YmxvY2s7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCWtleXAtPmFyX2Jsb2NrY291bnQgPSBycnAtPmFyX2Jsb2NrY291bnQ7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJfQorCS8qCisJICogRmluZCB0aGUgbGVmdCBibG9jayBudW1iZXIgYnkgbG9va2luZyBpbiB0aGUgYnVmZmVyLgorCSAqIEFkanVzdCBudW1yZWNzLCBzaWJsaW5nIHBvaW50ZXJzLgorCSAqLworCWxibm8gPSBYRlNfREFERFJfVE9fQUdCTk8oY3VyLT5iY19tcCwgWEZTX0JVRl9BRERSKGxicCkpOworCUlOVF9NT0QobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAtKElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpKTsKKwlyaWdodC0+YmJfcmlnaHRzaWIgPSBsZWZ0LT5iYl9yaWdodHNpYjsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwlJTlRfU0VUKGxlZnQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQsIHJibm8pOworCUlOVF9TRVQocmlnaHQtPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCwgbGJubyk7CisJeGZzX2FsbG9jX2xvZ19ibG9jayhjdXItPmJjX3RwLCByYnAsIFhGU19CQl9BTExfQklUUyk7CisJeGZzX2FsbG9jX2xvZ19ibG9jayhjdXItPmJjX3RwLCBsYnAsIFhGU19CQl9OVU1SRUNTIHwgWEZTX0JCX1JJR0hUU0lCKTsKKwkvKgorCSAqIElmIHRoZXJlJ3MgYSBibG9jayB0byB0aGUgbmV3IGJsb2NrJ3MgcmlnaHQsIG1ha2UgdGhhdCBibG9jaworCSAqIHBvaW50IGJhY2sgdG8gcmlnaHQgaW5zdGVhZCBvZiB0byBsZWZ0LgorCSAqLworCWlmIChJTlRfR0VUKHJpZ2h0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSAhPSBOVUxMQUdCTE9DSykgeworCQl4ZnNfYWxsb2NfYmxvY2tfdAkqcnJibG9jazsJLyogcnIgYnRyZWUgYmxvY2sgKi8KKwkJeGZzX2J1Zl90CQkqcnJicDsJCS8qIGJ1ZmZlciBmb3IgcnJibG9jayAqLworCisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfdHAsCisJCQkJY3VyLT5iY19wcml2YXRlLmEuYWdubywgSU5UX0dFVChyaWdodC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCksIDAsCisJCQkJJnJyYnAsIFhGU19BTExPQ19CVFJFRV9SRUYpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJcnJibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0socnJicCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgcnJibG9jaywgbGV2ZWwsIHJyYnApKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJSU5UX1NFVChycmJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQsIHJibm8pOworCQl4ZnNfYWxsb2NfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIHJyYnAsIFhGU19CQl9MRUZUU0lCKTsKKwl9CisJLyoKKwkgKiBJZiB0aGUgY3Vyc29yIGlzIHJlYWxseSBpbiB0aGUgcmlnaHQgYmxvY2ssIG1vdmUgaXQgdGhlcmUuCisJICogSWYgaXQncyBqdXN0IHBvaW50aW5nIHBhc3QgdGhlIGxhc3QgZW50cnkgaW4gbGVmdCwgdGhlbiB3ZSdsbAorCSAqIGluc2VydCB0aGVyZSwgc28gZG9uJ3QgY2hhbmdlIGFueXRoaW5nIGluIHRoYXQgY2FzZS4KKwkgKi8KKwlpZiAoY3VyLT5iY19wdHJzW2xldmVsXSA+IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEpIHsKKwkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldmVsLCByYnApOworCQljdXItPmJjX3B0cnNbbGV2ZWxdIC09IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwl9CisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgbW9yZSBsZXZlbHMsIHdlJ2xsIG5lZWQgYW5vdGhlciBjdXJzb3Igd2hpY2ggcmVmZXJzIHRvCisJICogdGhlIHJpZ2h0IGJsb2NrLCBubyBtYXR0ZXIgd2hlcmUgdGhpcyBjdXJzb3Igd2FzLgorCSAqLworCWlmIChsZXZlbCArIDEgPCBjdXItPmJjX25sZXZlbHMpIHsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9kdXBfY3Vyc29yKGN1ciwgY3VycCkpKQorCQkJcmV0dXJuIGVycm9yOworCQkoKmN1cnApLT5iY19wdHJzW2xldmVsICsgMV0rKzsKKwl9CisJKmJub3AgPSByYm5vOworCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFVwZGF0ZSBrZXlzIGF0IGFsbCBsZXZlbHMgZnJvbSBoZXJlIHRvIHRoZSByb290IGFsb25nIHRoZSBjdXJzb3IncyBwYXRoLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfdXBka2V5KAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2FsbG9jX2tleV90CQkqa2V5cCwJLyogbmV3IGtleSB2YWx1ZSB0byB1cGRhdGUgdG8gKi8KKwlpbnQJCQlsZXZlbCkJLyogc3RhcnRpbmcgbGV2ZWwgZm9yIHVwZGF0ZSAqLworeworCWludAkJCXB0cjsJLyogaW5kZXggb2Yga2V5IGluIGJsb2NrICovCisKKwkvKgorCSAqIEdvIHVwIHRoZSB0cmVlIGZyb20gdGhpcyBsZXZlbCB0b3dhcmQgdGhlIHJvb3QuCisJICogQXQgZWFjaCBsZXZlbCwgdXBkYXRlIHRoZSBrZXkgdmFsdWUgdG8gdGhlIHZhbHVlIGlucHV0LgorCSAqIFN0b3Agd2hlbiB3ZSByZWFjaCBhIGxldmVsIHdoZXJlIHRoZSBjdXJzb3IgaXNuJ3QgcG9pbnRpbmcKKwkgKiBhdCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGJsb2NrLgorCSAqLworCWZvciAocHRyID0gMTsgcHRyID09IDEgJiYgbGV2ZWwgPCBjdXItPmJjX25sZXZlbHM7IGxldmVsKyspIHsKKwkJeGZzX2FsbG9jX2Jsb2NrX3QJKmJsb2NrOwkvKiBidHJlZSBibG9jayAqLworCQl4ZnNfYnVmX3QJCSpicDsJLyogYnVmZmVyIGZvciBibG9jayAqLworI2lmZGVmIERFQlVHCisJCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKyNlbmRpZgorCQl4ZnNfYWxsb2Nfa2V5X3QJCSprcDsJLyogcHRyIHRvIGJ0cmVlIGJsb2NrIGtleXMgKi8KKworCQlicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CisJCWJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhicCk7CisjaWZkZWYgREVCVUcKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsIGJwKSkpCisJCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkJcHRyID0gY3VyLT5iY19wdHJzW2xldmVsXTsKKwkJa3AgPSBYRlNfQUxMT0NfS0VZX0FERFIoYmxvY2ssIHB0ciwgY3VyKTsKKwkJKmtwID0gKmtleXA7CisJCXhmc19hbGxvY19sb2dfa2V5cyhjdXIsIGJwLCBwdHIsIHB0cik7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogRXh0ZXJuYWxseSB2aXNpYmxlIHJvdXRpbmVzLgorICovCisKKy8qCisgKiBEZWNyZW1lbnQgY3Vyc29yIGJ5IG9uZSByZWNvcmQgYXQgdGhlIGxldmVsLgorICogRm9yIG5vbnplcm8gbGV2ZWxzIHRoZSBsZWFmLXdhcmQgaW5mb3JtYXRpb24gaXMgdW50b3VjaGVkLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfZGVjcmVtZW50KAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIGluIGJ0cmVlLCAwIGlzIGxlYWYgKi8KKwlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJeGZzX2FsbG9jX2Jsb2NrX3QJKmJsb2NrOwkvKiBidHJlZSBibG9jayAqLworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlsZXY7CS8qIGJ0cmVlIGxldmVsICovCisKKwlBU1NFUlQobGV2ZWwgPCBjdXItPmJjX25sZXZlbHMpOworCS8qCisJICogUmVhZC1haGVhZCB0byB0aGUgbGVmdCBhdCB0aGlzIGxldmVsLgorCSAqLworCXhmc19idHJlZV9yZWFkYWhlYWQoY3VyLCBsZXZlbCwgWEZTX0JUQ1VSX0xFRlRSQSk7CisJLyoKKwkgKiBEZWNyZW1lbnQgdGhlIHB0ciBhdCB0aGlzIGxldmVsLiAgSWYgd2UncmUgc3RpbGwgaW4gdGhlIGJsb2NrCisJICogdGhlbiB3ZSdyZSBkb25lLgorCSAqLworCWlmICgtLWN1ci0+YmNfcHRyc1tsZXZlbF0gPiAwKSB7CisJCSpzdGF0ID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogR2V0IGEgcG9pbnRlciB0byB0aGUgYnRyZWUgYmxvY2suCisJICovCisJYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGN1ci0+YmNfYnVmc1tsZXZlbF0pOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsCisJCQljdXItPmJjX2J1ZnNbbGV2ZWxdKSkpCisJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCS8qCisJICogSWYgd2UganVzdCB3ZW50IG9mZiB0aGUgbGVmdCBlZGdlIG9mIHRoZSB0cmVlLCByZXR1cm4gZmFpbHVyZS4KKwkgKi8KKwlpZiAoSU5UX0dFVChibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMQUdCTE9DSykgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIE1hcmNoIHVwIHRoZSB0cmVlIGRlY3JlbWVudGluZyBwb2ludGVycy4KKwkgKiBTdG9wIHdoZW4gd2UgZG9uJ3QgZ28gb2ZmIHRoZSBsZWZ0IGVkZ2Ugb2YgYSBibG9jay4KKwkgKi8KKwlmb3IgKGxldiA9IGxldmVsICsgMTsgbGV2IDwgY3VyLT5iY19ubGV2ZWxzOyBsZXYrKykgeworCQlpZiAoLS1jdXItPmJjX3B0cnNbbGV2XSA+IDApCisJCQlicmVhazsKKwkJLyoKKwkJICogUmVhZC1haGVhZCB0aGUgbGVmdCBibG9jaywgd2UncmUgZ29pbmcgdG8gcmVhZCBpdAorCQkgKiBpbiB0aGUgbmV4dCBsb29wLgorCQkgKi8KKwkJeGZzX2J0cmVlX3JlYWRhaGVhZChjdXIsIGxldiwgWEZTX0JUQ1VSX0xFRlRSQSk7CisJfQorCS8qCisJICogSWYgd2Ugd2VudCBvZmYgdGhlIHJvb3QgdGhlbiB3ZSBhcmUgc2VyaW91c2x5IGNvbmZ1c2VkLgorCSAqLworCUFTU0VSVChsZXYgPCBjdXItPmJjX25sZXZlbHMpOworCS8qCisJICogTm93IHdhbGsgYmFjayBkb3duIHRoZSB0cmVlLCBmaXhpbmcgdXAgdGhlIGN1cnNvcidzIGJ1ZmZlcgorCSAqIHBvaW50ZXJzIGFuZCBrZXkgbnVtYmVycy4KKwkgKi8KKwlmb3IgKGJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhjdXItPmJjX2J1ZnNbbGV2XSk7IGxldiA+IGxldmVsOyApIHsKKwkJeGZzX2FnYmxvY2tfdAlhZ2JubzsJLyogYmxvY2sgbnVtYmVyIG9mIGJ0cmVlIGJsb2NrICovCisJCXhmc19idWZfdAkqYnA7CS8qIGJ1ZmZlciBwb2ludGVyIGZvciBibG9jayAqLworCisJCWFnYm5vID0gSU5UX0dFVCgqWEZTX0FMTE9DX1BUUl9BRERSKGJsb2NrLCBjdXItPmJjX3B0cnNbbGV2XSwgY3VyKSwgQVJDSF9DT05WRVJUKTsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY190cCwKKwkJCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCBhZ2JubywgMCwgJmJwLAorCQkJCVhGU19BTExPQ19CVFJFRV9SRUYpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJbGV2LS07CisJCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXYsIGJwKTsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGJwKTsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgbGV2LCBicCkpKQorCQkJcmV0dXJuIGVycm9yOworCQljdXItPmJjX3B0cnNbbGV2XSA9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJfQorCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlbGV0ZSB0aGUgcmVjb3JkIHBvaW50ZWQgdG8gYnkgY3VyLgorICogVGhlIGN1cnNvciByZWZlcnMgdG8gdGhlIHBsYWNlIHdoZXJlIHRoZSByZWNvcmQgd2FzIChjb3VsZCBiZSBpbnNlcnRlZCkKKyAqIHdoZW4gdGhlIG9wZXJhdGlvbiByZXR1cm5zLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfZGVsZXRlKAorCXhmc19idHJlZV9jdXJfdAkqY3VyLAkJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCWludAkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCWk7CQkvKiByZXN1bHQgY29kZSAqLworCWludAkJbGV2ZWw7CQkvKiBidHJlZSBsZXZlbCAqLworCisJLyoKKwkgKiBHbyB1cCB0aGUgdHJlZSwgc3RhcnRpbmcgYXQgbGVhZiBsZXZlbC4KKwkgKiBJZiAyIGlzIHJldHVybmVkIHRoZW4gYSBqb2luIHdhcyBkb25lOyBnbyB0byB0aGUgbmV4dCBsZXZlbC4KKwkgKiBPdGhlcndpc2Ugd2UgYXJlIGRvbmUuCisJICovCisJZm9yIChsZXZlbCA9IDAsIGkgPSAyOyBpID09IDI7IGxldmVsKyspIHsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19kZWxyZWMoY3VyLCBsZXZlbCwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwl9CisJaWYgKGkgPT0gMCkgeworCQlmb3IgKGxldmVsID0gMTsgbGV2ZWwgPCBjdXItPmJjX25sZXZlbHM7IGxldmVsKyspIHsKKwkJCWlmIChjdXItPmJjX3B0cnNbbGV2ZWxdID09IDApIHsKKwkJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2RlY3JlbWVudChjdXIsIGxldmVsLCAmaSkpKQorCQkJCQlyZXR1cm4gZXJyb3I7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJKnN0YXQgPSBpOworCXJldHVybiAwOworfQorCisvKgorICogR2V0IHRoZSBkYXRhIGZyb20gdGhlIHBvaW50ZWQtdG8gcmVjb3JkLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfZ2V0X3JlYygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19hZ2Jsb2NrX3QJCSpibm8sCS8qIG91dHB1dDogc3RhcnRpbmcgYmxvY2sgb2YgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CQkqbGVuLAkvKiBvdXRwdXQ6IGxlbmd0aCBvZiBleHRlbnQgKi8KKwlpbnQJCQkqc3RhdCkJLyogb3V0cHV0OiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwl4ZnNfYWxsb2NfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrICovCisjaWZkZWYgREVCVUcKKwlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisjZW5kaWYKKwlpbnQJCQlwdHI7CS8qIHJlY29yZCBudW1iZXIgKi8KKworCXB0ciA9IGN1ci0+YmNfcHRyc1swXTsKKwlibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0soY3VyLT5iY19idWZzWzBdKTsKKyNpZmRlZiBERUJVRworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgYmxvY2ssIDAsIGN1ci0+YmNfYnVmc1swXSkpKQorCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkvKgorCSAqIE9mZiB0aGUgcmlnaHQgZW5kIG9yIGxlZnQgZW5kLCByZXR1cm4gZmFpbHVyZS4KKwkgKi8KKwlpZiAocHRyID4gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSB8fCBwdHIgPD0gMCkgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIFBvaW50IHRvIHRoZSByZWNvcmQgYW5kIGV4dHJhY3QgaXRzIGRhdGEuCisJICovCisJeworCQl4ZnNfYWxsb2NfcmVjX3QJCSpyZWM7CS8qIHJlY29yZCBkYXRhICovCisKKwkJcmVjID0gWEZTX0FMTE9DX1JFQ19BRERSKGJsb2NrLCBwdHIsIGN1cik7CisJCSpibm8gPSBJTlRfR0VUKHJlYy0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJUKTsKKwkJKmxlbiA9IElOVF9HRVQocmVjLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpOworCX0KKwkqc3RhdCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbmNyZW1lbnQgY3Vyc29yIGJ5IG9uZSByZWNvcmQgYXQgdGhlIGxldmVsLgorICogRm9yIG5vbnplcm8gbGV2ZWxzIHRoZSBsZWFmLXdhcmQgaW5mb3JtYXRpb24gaXMgdW50b3VjaGVkLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfaW5jcmVtZW50KAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIGluIGJ0cmVlLCAwIGlzIGxlYWYgKi8KKwlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJeGZzX2FsbG9jX2Jsb2NrX3QJKmJsb2NrOwkvKiBidHJlZSBibG9jayAqLworCXhmc19idWZfdAkJKmJwOwkvKiB0cmVlIGJsb2NrIGJ1ZmZlciAqLworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlsZXY7CS8qIGJ0cmVlIGxldmVsICovCisKKwlBU1NFUlQobGV2ZWwgPCBjdXItPmJjX25sZXZlbHMpOworCS8qCisJICogUmVhZC1haGVhZCB0byB0aGUgcmlnaHQgYXQgdGhpcyBsZXZlbC4KKwkgKi8KKwl4ZnNfYnRyZWVfcmVhZGFoZWFkKGN1ciwgbGV2ZWwsIFhGU19CVENVUl9SSUdIVFJBKTsKKwkvKgorCSAqIEdldCBhIHBvaW50ZXIgdG8gdGhlIGJ0cmVlIGJsb2NrLgorCSAqLworCWJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKKwlibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0soYnApOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsIGJwKSkpCisJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCS8qCisJICogSW5jcmVtZW50IHRoZSBwdHIgYXQgdGhpcyBsZXZlbC4gIElmIHdlJ3JlIHN0aWxsIGluIHRoZSBibG9jaworCSAqIHRoZW4gd2UncmUgZG9uZS4KKwkgKi8KKwlpZiAoKytjdXItPmJjX3B0cnNbbGV2ZWxdIDw9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJKnN0YXQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBJZiB3ZSBqdXN0IHdlbnQgb2ZmIHRoZSByaWdodCBlZGdlIG9mIHRoZSB0cmVlLCByZXR1cm4gZmFpbHVyZS4KKwkgKi8KKwlpZiAoSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTEFHQkxPQ0spIHsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBNYXJjaCB1cCB0aGUgdHJlZSBpbmNyZW1lbnRpbmcgcG9pbnRlcnMuCisJICogU3RvcCB3aGVuIHdlIGRvbid0IGdvIG9mZiB0aGUgcmlnaHQgZWRnZSBvZiBhIGJsb2NrLgorCSAqLworCWZvciAobGV2ID0gbGV2ZWwgKyAxOyBsZXYgPCBjdXItPmJjX25sZXZlbHM7IGxldisrKSB7CisJCWJwID0gY3VyLT5iY19idWZzW2xldl07CisJCWJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhicCk7CisjaWZkZWYgREVCVUcKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgbGV2LCBicCkpKQorCQkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJCWlmICgrK2N1ci0+YmNfcHRyc1tsZXZdIDw9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpCisJCQlicmVhazsKKwkJLyoKKwkJICogUmVhZC1haGVhZCB0aGUgcmlnaHQgYmxvY2ssIHdlJ3JlIGdvaW5nIHRvIHJlYWQgaXQKKwkJICogaW4gdGhlIG5leHQgbG9vcC4KKwkJICovCisJCXhmc19idHJlZV9yZWFkYWhlYWQoY3VyLCBsZXYsIFhGU19CVENVUl9SSUdIVFJBKTsKKwl9CisJLyoKKwkgKiBJZiB3ZSB3ZW50IG9mZiB0aGUgcm9vdCB0aGVuIHdlIGFyZSBzZXJpb3VzbHkgY29uZnVzZWQuCisJICovCisJQVNTRVJUKGxldiA8IGN1ci0+YmNfbmxldmVscyk7CisJLyoKKwkgKiBOb3cgd2FsayBiYWNrIGRvd24gdGhlIHRyZWUsIGZpeGluZyB1cCB0aGUgY3Vyc29yJ3MgYnVmZmVyCisJICogcG9pbnRlcnMgYW5kIGtleSBudW1iZXJzLgorCSAqLworCWZvciAoYnAgPSBjdXItPmJjX2J1ZnNbbGV2XSwgYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGJwKTsKKwkgICAgIGxldiA+IGxldmVsOyApIHsKKwkJeGZzX2FnYmxvY2tfdAlhZ2JubzsJLyogYmxvY2sgbnVtYmVyIG9mIGJ0cmVlIGJsb2NrICovCisKKwkJYWdibm8gPSBJTlRfR0VUKCpYRlNfQUxMT0NfUFRSX0FERFIoYmxvY2ssIGN1ci0+YmNfcHRyc1tsZXZdLCBjdXIpLCBBUkNIX0NPTlZFUlQpOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhjdXItPmJjX21wLCBjdXItPmJjX3RwLAorCQkJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIGFnYm5vLCAwLCAmYnAsCisJCQkJWEZTX0FMTE9DX0JUUkVFX1JFRikpKQorCQkJcmV0dXJuIGVycm9yOworCQlsZXYtLTsKKwkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldiwgYnApOworCQlibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0soYnApOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXYsIGJwKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCWN1ci0+YmNfcHRyc1tsZXZdID0gMTsKKwl9CisJKnN0YXQgPSAxOworCXJldHVybiAwOworfQorCisvKgorICogSW5zZXJ0IHRoZSBjdXJyZW50IHJlY29yZCBhdCB0aGUgcG9pbnQgcmVmZXJlbmNlZCBieSBjdXIuCisgKiBUaGUgY3Vyc29yIG1heSBiZSBpbmNvbnNpc3RlbnQgb24gcmV0dXJuIGlmIHNwbGl0cyBoYXZlIGJlZW4gZG9uZS4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX2luc2VydCgKKwl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwJCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQlpOwkJLyogcmVzdWx0IHZhbHVlLCAwIGZvciBmYWlsdXJlICovCisJaW50CQlsZXZlbDsJCS8qIGN1cnJlbnQgbGV2ZWwgbnVtYmVyIGluIGJ0cmVlICovCisJeGZzX2FnYmxvY2tfdAluYm5vOwkJLyogbmV3IGJsb2NrIG51bWJlciAoc3BsaXQgcmVzdWx0KSAqLworCXhmc19idHJlZV9jdXJfdAkqbmN1cjsJCS8qIG5ldyBjdXJzb3IgKHNwbGl0IHJlc3VsdCkgKi8KKwl4ZnNfYWxsb2NfcmVjX3QJbnJlYzsJCS8qIHJlY29yZCBiZWluZyBpbnNlcnRlZCB0aGlzIGxldmVsICovCisJeGZzX2J0cmVlX2N1cl90CSpwY3VyOwkJLyogcHJldmlvdXMgbGV2ZWwncyBjdXJzb3IgKi8KKworCWxldmVsID0gMDsKKwluYm5vID0gTlVMTEFHQkxPQ0s7CisJSU5UX1NFVChucmVjLmFyX3N0YXJ0YmxvY2ssIEFSQ0hfQ09OVkVSVCwgY3VyLT5iY19yZWMuYS5hcl9zdGFydGJsb2NrKTsKKwlJTlRfU0VUKG5yZWMuYXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJULCBjdXItPmJjX3JlYy5hLmFyX2Jsb2NrY291bnQpOworCW5jdXIgPSAoeGZzX2J0cmVlX2N1cl90ICopMDsKKwlwY3VyID0gY3VyOworCS8qCisJICogTG9vcCBnb2luZyB1cCB0aGUgdHJlZSwgc3RhcnRpbmcgYXQgdGhlIGxlYWYgbGV2ZWwuCisJICogU3RvcCB3aGVuIHdlIGRvbid0IGdldCBhIHNwbGl0IGJsb2NrLCB0aGF0IG11c3QgbWVhbiB0aGF0CisJICogdGhlIGluc2VydCBpcyBmaW5pc2hlZCB3aXRoIHRoaXMgbGV2ZWwuCisJICovCisJZG8geworCQkvKgorCQkgKiBJbnNlcnQgbnJlYy9uYm5vIGludG8gdGhpcyBsZXZlbCBvZiB0aGUgdHJlZS4KKwkJICogTm90ZSBpZiB3ZSBmYWlsLCBuYm5vIHdpbGwgYmUgbnVsbC4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfaW5zcmVjKHBjdXIsIGxldmVsKyssICZuYm5vLCAmbnJlYywgJm5jdXIsCisJCQkJJmkpKSkgeworCQkJaWYgKHBjdXIgIT0gY3VyKQorCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKHBjdXIsIFhGU19CVFJFRV9FUlJPUik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJLyoKKwkJICogU2VlIGlmIHRoZSBjdXJzb3Igd2UganVzdCB1c2VkIGlzIHRyYXNoLgorCQkgKiBDYW4ndCB0cmFzaCB0aGUgY2FsbGVyJ3MgY3Vyc29yLCBidXQgb3RoZXJ3aXNlIHdlIHNob3VsZAorCQkgKiBpZiBuY3VyIGlzIGEgbmV3IGN1cnNvciBvciB3ZSdyZSBhYm91dCB0byBiZSBkb25lLgorCQkgKi8KKwkJaWYgKHBjdXIgIT0gY3VyICYmIChuY3VyIHx8IG5ibm8gPT0gTlVMTEFHQkxPQ0spKSB7CisJCQljdXItPmJjX25sZXZlbHMgPSBwY3VyLT5iY19ubGV2ZWxzOworCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IocGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCQl9CisJCS8qCisJCSAqIElmIHdlIGdvdCBhIG5ldyBjdXJzb3IsIHN3aXRjaCB0byBpdC4KKwkJICovCisJCWlmIChuY3VyKSB7CisJCQlwY3VyID0gbmN1cjsKKwkJCW5jdXIgPSAoeGZzX2J0cmVlX2N1cl90ICopMDsKKwkJfQorCX0gd2hpbGUgKG5ibm8gIT0gTlVMTEFHQkxPQ0spOworCSpzdGF0ID0gaTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExvb2t1cCB0aGUgcmVjb3JkIGVxdWFsIHRvIFtibm8sIGxlbl0gaW4gdGhlIGJ0cmVlIGdpdmVuIGJ5IGN1ci4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX2xvb2t1cF9lcSgKKwl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwJCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19hZ2Jsb2NrX3QJYm5vLAkJLyogc3RhcnRpbmcgYmxvY2sgb2YgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CWxlbiwJCS8qIGxlbmd0aCBvZiBleHRlbnQgKi8KKwlpbnQJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJY3VyLT5iY19yZWMuYS5hcl9zdGFydGJsb2NrID0gYm5vOworCWN1ci0+YmNfcmVjLmEuYXJfYmxvY2tjb3VudCA9IGxlbjsKKwlyZXR1cm4geGZzX2FsbG9jX2xvb2t1cChjdXIsIFhGU19MT09LVVBfRVEsIHN0YXQpOworfQorCisvKgorICogTG9va3VwIHRoZSBmaXJzdCByZWNvcmQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFtibm8sIGxlbl0KKyAqIGluIHRoZSBidHJlZSBnaXZlbiBieSBjdXIuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19sb29rdXBfZ2UoCisJeGZzX2J0cmVlX2N1cl90CSpjdXIsCQkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdibG9ja190CWJubywJCS8qIHN0YXJ0aW5nIGJsb2NrIG9mIGV4dGVudCAqLworCXhmc19leHRsZW5fdAlsZW4sCQkvKiBsZW5ndGggb2YgZXh0ZW50ICovCisJaW50CQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCWN1ci0+YmNfcmVjLmEuYXJfc3RhcnRibG9jayA9IGJubzsKKwljdXItPmJjX3JlYy5hLmFyX2Jsb2NrY291bnQgPSBsZW47CisJcmV0dXJuIHhmc19hbGxvY19sb29rdXAoY3VyLCBYRlNfTE9PS1VQX0dFLCBzdGF0KTsKK30KKworLyoKKyAqIExvb2t1cCB0aGUgZmlyc3QgcmVjb3JkIGxlc3MgdGhhbiBvciBlcXVhbCB0byBbYm5vLCBsZW5dCisgKiBpbiB0aGUgYnRyZWUgZ2l2ZW4gYnkgY3VyLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfbG9va3VwX2xlKAorCXhmc19idHJlZV9jdXJfdAkqY3VyLAkJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2FnYmxvY2tfdAlibm8sCQkvKiBzdGFydGluZyBibG9jayBvZiBleHRlbnQgKi8KKwl4ZnNfZXh0bGVuX3QJbGVuLAkJLyogbGVuZ3RoIG9mIGV4dGVudCAqLworCWludAkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwljdXItPmJjX3JlYy5hLmFyX3N0YXJ0YmxvY2sgPSBibm87CisJY3VyLT5iY19yZWMuYS5hcl9ibG9ja2NvdW50ID0gbGVuOworCXJldHVybiB4ZnNfYWxsb2NfbG9va3VwKGN1ciwgWEZTX0xPT0tVUF9MRSwgc3RhdCk7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIHJlY29yZCByZWZlcnJlZCB0byBieSBjdXIsIHRvIHRoZSB2YWx1ZSBnaXZlbiBieSBbYm5vLCBsZW5dLgorICogVGhpcyBlaXRoZXIgd29ya3MgKHJldHVybiAwKSBvciBnZXRzIGFuIEVGU0NPUlJVUFRFRCBlcnJvci4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX3VwZGF0ZSgKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19hZ2Jsb2NrX3QJCWJubywJLyogc3RhcnRpbmcgYmxvY2sgb2YgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CQlsZW4pCS8qIGxlbmd0aCBvZiBleHRlbnQgKi8KK3sKKwl4ZnNfYWxsb2NfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrIHRvIHVwZGF0ZSAqLworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlwdHI7CS8qIGN1cnJlbnQgcmVjb3JkIG51bWJlciAodXBkYXRpbmcpICovCisKKwlBU1NFUlQobGVuID4gMCk7CisJLyoKKwkgKiBQaWNrIHVwIHRoZSBhLmcuIGZyZWVsaXN0IHN0cnVjdCBhbmQgdGhlIGN1cnJlbnQgYmxvY2suCisJICovCisJYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGN1ci0+YmNfYnVmc1swXSk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCAwLCBjdXItPmJjX2J1ZnNbMF0pKSkKKwkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJLyoKKwkgKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlYyB0byBiZSB1cGRhdGVkLgorCSAqLworCXB0ciA9IGN1ci0+YmNfcHRyc1swXTsKKwl7CisJCXhmc19hbGxvY19yZWNfdAkJKnJwOwkvKiBwb2ludGVyIHRvIHVwZGF0ZWQgcmVjb3JkICovCisKKwkJcnAgPSBYRlNfQUxMT0NfUkVDX0FERFIoYmxvY2ssIHB0ciwgY3VyKTsKKwkJLyoKKwkJICogRmlsbCBpbiB0aGUgbmV3IGNvbnRlbnRzIGFuZCBsb2cgdGhlbS4KKwkJICovCisJCUlOVF9TRVQocnAtPmFyX3N0YXJ0YmxvY2ssIEFSQ0hfQ09OVkVSVCwgYm5vKTsKKwkJSU5UX1NFVChycC0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJULCBsZW4pOworCQl4ZnNfYWxsb2NfbG9nX3JlY3MoY3VyLCBjdXItPmJjX2J1ZnNbMF0sIHB0ciwgcHRyKTsKKwl9CisJLyoKKwkgKiBJZiBpdCdzIHRoZSBieS1zaXplIGJ0cmVlIGFuZCBpdCdzIHRoZSBsYXN0IGxlYWYgYmxvY2sgYW5kCisJICogaXQncyB0aGUgbGFzdCByZWNvcmQuLi4gdGhlbiB1cGRhdGUgdGhlIHNpemUgb2YgdGhlIGxvbmdlc3QKKwkgKiBleHRlbnQgaW4gdGhlIGEuZy4sIHdoaWNoIHdlIGNhY2hlIGluIHRoZSBhLmcuIGZyZWVsaXN0IGhlYWRlci4KKwkgKi8KKwlpZiAoY3VyLT5iY19idG51bSA9PSBYRlNfQlROVU1fQ05UICYmCisJICAgIElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExBR0JMT0NLICYmCisJICAgIHB0ciA9PSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKSB7CisJCXhmc19hZ2ZfdAkqYWdmOwkvKiBhLmcuIGZyZWVzcGFjZSBoZWFkZXIgKi8KKwkJeGZzX2FnbnVtYmVyX3QJc2Vxbm87CisKKwkJYWdmID0gWEZTX0JVRl9UT19BR0YoY3VyLT5iY19wcml2YXRlLmEuYWdicCk7CisJCXNlcW5vID0gSU5UX0dFVChhZ2YtPmFnZl9zZXFubywgQVJDSF9DT05WRVJUKTsKKwkJY3VyLT5iY19tcC0+bV9wZXJhZ1tzZXFub10ucGFnZl9sb25nZXN0ID0gbGVuOworCQlJTlRfU0VUKGFnZi0+YWdmX2xvbmdlc3QsIEFSQ0hfQ09OVkVSVCwgbGVuKTsKKwkJeGZzX2FsbG9jX2xvZ19hZ2YoY3VyLT5iY190cCwgY3VyLT5iY19wcml2YXRlLmEuYWdicCwKKwkJCVhGU19BR0ZfTE9OR0VTVCk7CisJfQorCS8qCisJICogVXBkYXRpbmcgZmlyc3QgcmVjb3JkIGluIGxlYWYuIFBhc3MgbmV3IGtleSB2YWx1ZSB1cCB0byBvdXIgcGFyZW50LgorCSAqLworCWlmIChwdHIgPT0gMSkgeworCQl4ZnNfYWxsb2Nfa2V5X3QJa2V5OwkvKiBrZXkgY29udGFpbmluZyBbYm5vLCBsZW5dICovCisKKwkJSU5UX1NFVChrZXkuYXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJULCBibm8pOworCQlJTlRfU0VUKGtleS5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQsIGxlbik7CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfdXBka2V5KGN1ciwgJmtleSwgMSkpKQorCQkJcmV0dXJuIGVycm9yOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYWxsb2NfYnRyZWUuaCBiL2ZzL3hmcy94ZnNfYWxsb2NfYnRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDUxNjFhCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19hbGxvY19idHJlZS5oCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfQUxMT0NfQlRSRUVfSF9fCisjZGVmaW5lCV9fWEZTX0FMTE9DX0JUUkVFX0hfXworCisvKgorICogRnJlZXNwYWNlIG9uLWRpc2sgc3RydWN0dXJlcworICovCisKK3N0cnVjdCB4ZnNfYnVmOworc3RydWN0IHhmc19idHJlZV9jdXI7CitzdHJ1Y3QgeGZzX2J0cmVlX3NibG9jazsKK3N0cnVjdCB4ZnNfbW91bnQ7CisKKy8qCisgKiBUaGVyZSBhcmUgdHdvIG9uLWRpc2sgYnRyZWVzLCBvbmUgc29ydGVkIGJ5IGJsb2Nrbm8gYW5kIG9uZSBzb3J0ZWQKKyAqIGJ5IGJsb2NrY291bnQgYW5kIGJsb2Nrbm8uICBBbGwgYmxvY2tzIGxvb2sgdGhlIHNhbWUgdG8gbWFrZSB0aGUgY29kZQorICogc2ltcGxlcjsgaWYgd2UgaGF2ZSB0aW1lIGxhdGVyLCB3ZSdsbCBtYWtlIHRoZSBvcHRpbWl6YXRpb25zLgorICovCisjZGVmaW5lCVhGU19BQlRCX01BR0lDCTB4NDE0MjU0NDIJLyogJ0FCVEInIGZvciBibm8gdHJlZSAqLworI2RlZmluZQlYRlNfQUJUQ19NQUdJQwkweDQxNDI1NDQzCS8qICdBQlRDJyBmb3IgY250IHRyZWUgKi8KKworLyoKKyAqIERhdGEgcmVjb3JkL2tleSBzdHJ1Y3R1cmUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2FsbG9jX3JlYworeworCXhmc19hZ2Jsb2NrX3QJYXJfc3RhcnRibG9jazsJLyogc3RhcnRpbmcgYmxvY2sgbnVtYmVyICovCisJeGZzX2V4dGxlbl90CWFyX2Jsb2NrY291bnQ7CS8qIGNvdW50IG9mIGZyZWUgYmxvY2tzICovCit9IHhmc19hbGxvY19yZWNfdCwgeGZzX2FsbG9jX2tleV90OworCit0eXBlZGVmIHhmc19hZ2Jsb2NrX3QgeGZzX2FsbG9jX3B0cl90OwkvKiBidHJlZSBwb2ludGVyIHR5cGUgKi8KKwkJCQkJLyogYnRyZWUgYmxvY2sgaGVhZGVyIHR5cGUgKi8KK3R5cGVkZWYJc3RydWN0IHhmc19idHJlZV9zYmxvY2sgeGZzX2FsbG9jX2Jsb2NrX3Q7CisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JVRl9UT19BTExPQ19CTE9DSykKK3hmc19hbGxvY19ibG9ja190ICp4ZnNfYnVmX3RvX2FsbG9jX2Jsb2NrKHN0cnVjdCB4ZnNfYnVmICpicCk7CisjZGVmaW5lCVhGU19CVUZfVE9fQUxMT0NfQkxPQ0soYnApCXhmc19idWZfdG9fYWxsb2NfYmxvY2soYnApCisjZWxzZQorI2RlZmluZQlYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGJwKSAoKHhmc19hbGxvY19ibG9ja190ICopKFhGU19CVUZfUFRSKGJwKSkpCisjZW5kaWYKKworLyoKKyAqIFJlYWwgYmxvY2sgc3RydWN0dXJlcyBoYXZlIGEgc2l6ZSBlcXVhbCB0byB0aGUgZGlzayBibG9jayBzaXplLgorICovCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FMTE9DX0JMT0NLX1NJWkUpCitpbnQgeGZzX2FsbG9jX2Jsb2NrX3NpemUoaW50IGxldiwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7CisjZGVmaW5lCVhGU19BTExPQ19CTE9DS19TSVpFKGxldixjdXIpCXhmc19hbGxvY19ibG9ja19zaXplKGxldixjdXIpCisjZWxzZQorI2RlZmluZQlYRlNfQUxMT0NfQkxPQ0tfU0laRShsZXYsY3VyKQkoMSA8PCAoY3VyKS0+YmNfYmxvY2tsb2cpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUxMT0NfQkxPQ0tfTUFYUkVDUykKK2ludCB4ZnNfYWxsb2NfYmxvY2tfbWF4cmVjcyhpbnQgbGV2LCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUJWEZTX0FMTE9DX0JMT0NLX01BWFJFQ1MobGV2LGN1cikJeGZzX2FsbG9jX2Jsb2NrX21heHJlY3MobGV2LGN1cikKKyNlbHNlCisjZGVmaW5lCVhGU19BTExPQ19CTE9DS19NQVhSRUNTKGxldixjdXIpCVwKKwkoKGN1ciktPmJjX21wLT5tX2FsbG9jX214cltsZXYgIT0gMF0pCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FMTE9DX0JMT0NLX01JTlJFQ1MpCitpbnQgeGZzX2FsbG9jX2Jsb2NrX21pbnJlY3MoaW50IGxldiwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7CisjZGVmaW5lCVhGU19BTExPQ19CTE9DS19NSU5SRUNTKGxldixjdXIpCXhmc19hbGxvY19ibG9ja19taW5yZWNzKGxldixjdXIpCisjZWxzZQorI2RlZmluZQlYRlNfQUxMT0NfQkxPQ0tfTUlOUkVDUyhsZXYsY3VyKQlcCisJKChjdXIpLT5iY19tcC0+bV9hbGxvY19tbnJbbGV2ICE9IDBdKQorI2VuZGlmCisKKy8qCisgKiBNaW5pbXVtIGFuZCBtYXhpbXVtIGJsb2Nrc2l6ZSBhbmQgc2VjdG9yc2l6ZS4KKyAqIFRoZSBibG9ja3NpemUgdXBwZXIgbGltaXQgaXMgcHJldHR5IG11Y2ggYXJiaXRyYXJ5LgorICogVGhlIHNlY3RvcnNpemUgdXBwZXIgbGltaXQgaXMgZHVlIHRvIHNpemVvZihzYl9zZWN0c2l6ZSkuCisgKi8KKyNkZWZpbmUgWEZTX01JTl9CTE9DS1NJWkVfTE9HCTkJLyogaS5lLiA1MTIgYnl0ZXMgKi8KKyNkZWZpbmUgWEZTX01BWF9CTE9DS1NJWkVfTE9HCTE2CS8qIGkuZS4gNjU1MzYgYnl0ZXMgKi8KKyNkZWZpbmUgWEZTX01JTl9CTE9DS1NJWkUJKDEgPDwgWEZTX01JTl9CTE9DS1NJWkVfTE9HKQorI2RlZmluZSBYRlNfTUFYX0JMT0NLU0laRQkoMSA8PCBYRlNfTUFYX0JMT0NLU0laRV9MT0cpCisjZGVmaW5lIFhGU19NSU5fU0VDVE9SU0laRV9MT0cJOQkvKiBpLmUuIDUxMiBieXRlcyAqLworI2RlZmluZSBYRlNfTUFYX1NFQ1RPUlNJWkVfTE9HCTE1CS8qIGkuZS4gMzI3NjggYnl0ZXMgKi8KKyNkZWZpbmUgWEZTX01JTl9TRUNUT1JTSVpFCSgxIDw8IFhGU19NSU5fU0VDVE9SU0laRV9MT0cpCisjZGVmaW5lIFhGU19NQVhfU0VDVE9SU0laRQkoMSA8PCBYRlNfTUFYX1NFQ1RPUlNJWkVfTE9HKQorCisvKgorICogQmxvY2sgbnVtYmVycyBpbiB0aGUgQUc6CisgKiBTQiBpcyBzZWN0b3IgMCwgQUdGIGlzIHNlY3RvciAxLCBBR0kgaXMgc2VjdG9yIDIsIEFHRkwgaXMgc2VjdG9yIDMuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JOT19CTE9DSykKK3hmc19hZ2Jsb2NrX3QgeGZzX2Jub19ibG9jayhzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19CTk9fQkxPQ0sobXApCXhmc19ibm9fYmxvY2sobXApCisjZWxzZQorI2RlZmluZQlYRlNfQk5PX0JMT0NLKG1wKQkoKHhmc19hZ2Jsb2NrX3QpKFhGU19BR0ZMX0JMT0NLKG1wKSArIDEpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19DTlRfQkxPQ0spCit4ZnNfYWdibG9ja190IHhmc19jbnRfYmxvY2soc3RydWN0IHhmc19tb3VudCAqbXApOworI2RlZmluZQlYRlNfQ05UX0JMT0NLKG1wKQl4ZnNfY250X2Jsb2NrKG1wKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0NOVF9CTE9DSyhtcCkJKCh4ZnNfYWdibG9ja190KShYRlNfQk5PX0JMT0NLKG1wKSArIDEpKQorI2VuZGlmCisKKy8qCisgKiBSZWNvcmQsIGtleSwgYW5kIHBvaW50ZXIgYWRkcmVzcyBtYWNyb3MgZm9yIGJ0cmVlIGJsb2Nrcy4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUxMT0NfUkVDX0FERFIpCit4ZnNfYWxsb2NfcmVjX3QgKnhmc19hbGxvY19yZWNfYWRkcih4ZnNfYWxsb2NfYmxvY2tfdCAqYmIsIGludCBpLAorCQkJCSAgICBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUJWEZTX0FMTE9DX1JFQ19BRERSKGJiLGksY3VyKQl4ZnNfYWxsb2NfcmVjX2FkZHIoYmIsaSxjdXIpCisjZWxzZQorI2RlZmluZQlYRlNfQUxMT0NfUkVDX0FERFIoYmIsaSxjdXIpCVwKKwlYRlNfQlRSRUVfUkVDX0FERFIoWEZTX0FMTE9DX0JMT0NLX1NJWkUoMCxjdXIpLCB4ZnNfYWxsb2MsIGJiLCBpLCBcCisJCVhGU19BTExPQ19CTE9DS19NQVhSRUNTKDAsIGN1cikpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUxMT0NfS0VZX0FERFIpCit4ZnNfYWxsb2Nfa2V5X3QgKnhmc19hbGxvY19rZXlfYWRkcih4ZnNfYWxsb2NfYmxvY2tfdCAqYmIsIGludCBpLAorCQkJCSAgICBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUJWEZTX0FMTE9DX0tFWV9BRERSKGJiLGksY3VyKQl4ZnNfYWxsb2Nfa2V5X2FkZHIoYmIsaSxjdXIpCisjZWxzZQorI2RlZmluZQlYRlNfQUxMT0NfS0VZX0FERFIoYmIsaSxjdXIpCVwKKwlYRlNfQlRSRUVfS0VZX0FERFIoWEZTX0FMTE9DX0JMT0NLX1NJWkUoMSxjdXIpLCB4ZnNfYWxsb2MsIGJiLCBpLCBcCisJCVhGU19BTExPQ19CTE9DS19NQVhSRUNTKDEsIGN1cikpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUxMT0NfUFRSX0FERFIpCit4ZnNfYWxsb2NfcHRyX3QgKnhmc19hbGxvY19wdHJfYWRkcih4ZnNfYWxsb2NfYmxvY2tfdCAqYmIsIGludCBpLAorCQkJCSAgICBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUJWEZTX0FMTE9DX1BUUl9BRERSKGJiLGksY3VyKQl4ZnNfYWxsb2NfcHRyX2FkZHIoYmIsaSxjdXIpCisjZWxzZQorI2RlZmluZQlYRlNfQUxMT0NfUFRSX0FERFIoYmIsaSxjdXIpCVwKKwlYRlNfQlRSRUVfUFRSX0FERFIoWEZTX0FMTE9DX0JMT0NLX1NJWkUoMSxjdXIpLCB4ZnNfYWxsb2MsIGJiLCBpLCBcCisJCVhGU19BTExPQ19CTE9DS19NQVhSRUNTKDEsIGN1cikpCisjZW5kaWYKKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIGV4dGVybmFsbHkgdmlzaWJsZSByb3V0aW5lcy4KKyAqLworCisvKgorICogRGVjcmVtZW50IGN1cnNvciBieSBvbmUgcmVjb3JkIGF0IHRoZSBsZXZlbC4KKyAqIEZvciBub256ZXJvIGxldmVscyB0aGUgbGVhZi13YXJkIGluZm9ybWF0aW9uIGlzIHVudG91Y2hlZC4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX2RlY3JlbWVudCgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgaW4gYnRyZWUsIDAgaXMgbGVhZiAqLworCWludAkJCSpzdGF0KTsJLyogc3VjY2Vzcy9mYWlsdXJlICovCisKKy8qCisgKiBEZWxldGUgdGhlIHJlY29yZCBwb2ludGVkIHRvIGJ5IGN1ci4KKyAqIFRoZSBjdXJzb3IgcmVmZXJzIHRvIHRoZSBwbGFjZSB3aGVyZSB0aGUgcmVjb3JkIHdhcyAoY291bGQgYmUgaW5zZXJ0ZWQpCisgKiB3aGVuIHRoZSBvcGVyYXRpb24gcmV0dXJucy4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX2RlbGV0ZSgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQkqc3RhdCk7CS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworCisvKgorICogR2V0IHRoZSBkYXRhIGZyb20gdGhlIHBvaW50ZWQtdG8gcmVjb3JkLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfZ2V0X3JlYygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdibG9ja190CQkqYm5vLAkvKiBvdXRwdXQ6IHN0YXJ0aW5nIGJsb2NrIG9mIGV4dGVudCAqLworCXhmc19leHRsZW5fdAkJKmxlbiwJLyogb3V0cHV0OiBsZW5ndGggb2YgZXh0ZW50ICovCisJaW50CQkJKnN0YXQpOwkvKiBvdXRwdXQ6IHN1Y2Nlc3MvZmFpbHVyZSAqLworCisvKgorICogSW5jcmVtZW50IGN1cnNvciBieSBvbmUgcmVjb3JkIGF0IHRoZSBsZXZlbC4KKyAqIEZvciBub256ZXJvIGxldmVscyB0aGUgbGVhZi13YXJkIGluZm9ybWF0aW9uIGlzIHVudG91Y2hlZC4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX2luY3JlbWVudCgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgaW4gYnRyZWUsIDAgaXMgbGVhZiAqLworCWludAkJCSpzdGF0KTsJLyogc3VjY2Vzcy9mYWlsdXJlICovCisKKy8qCisgKiBJbnNlcnQgdGhlIGN1cnJlbnQgcmVjb3JkIGF0IHRoZSBwb2ludCByZWZlcmVuY2VkIGJ5IGN1ci4KKyAqIFRoZSBjdXJzb3IgbWF5IGJlIGluY29uc2lzdGVudCBvbiByZXR1cm4gaWYgc3BsaXRzIGhhdmUgYmVlbiBkb25lLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfaW5zZXJ0KAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCSpzdGF0KTsJLyogc3VjY2Vzcy9mYWlsdXJlICovCisKKy8qCisgKiBMb29rdXAgdGhlIHJlY29yZCBlcXVhbCB0byBbYm5vLCBsZW5dIGluIHRoZSBidHJlZSBnaXZlbiBieSBjdXIuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19sb29rdXBfZXEoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2FnYmxvY2tfdAkJYm5vLAkvKiBzdGFydGluZyBibG9jayBvZiBleHRlbnQgKi8KKwl4ZnNfZXh0bGVuX3QJCWxlbiwJLyogbGVuZ3RoIG9mIGV4dGVudCAqLworCWludAkJCSpzdGF0KTsJLyogc3VjY2Vzcy9mYWlsdXJlICovCisKKy8qCisgKiBMb29rdXAgdGhlIGZpcnN0IHJlY29yZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gW2JubywgbGVuXQorICogaW4gdGhlIGJ0cmVlIGdpdmVuIGJ5IGN1ci4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX2xvb2t1cF9nZSgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdibG9ja190CQlibm8sCS8qIHN0YXJ0aW5nIGJsb2NrIG9mIGV4dGVudCAqLworCXhmc19leHRsZW5fdAkJbGVuLAkvKiBsZW5ndGggb2YgZXh0ZW50ICovCisJaW50CQkJKnN0YXQpOwkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KKworLyoKKyAqIExvb2t1cCB0aGUgZmlyc3QgcmVjb3JkIGxlc3MgdGhhbiBvciBlcXVhbCB0byBbYm5vLCBsZW5dCisgKiBpbiB0aGUgYnRyZWUgZ2l2ZW4gYnkgY3VyLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfbG9va3VwX2xlKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19hZ2Jsb2NrX3QJCWJubywJLyogc3RhcnRpbmcgYmxvY2sgb2YgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CQlsZW4sCS8qIGxlbmd0aCBvZiBleHRlbnQgKi8KKwlpbnQJCQkqc3RhdCk7CS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworCisvKgorICogVXBkYXRlIHRoZSByZWNvcmQgcmVmZXJyZWQgdG8gYnkgY3VyLCB0byB0aGUgdmFsdWUgZ2l2ZW4gYnkgW2JubywgbGVuXS4KKyAqIFRoaXMgZWl0aGVyIHdvcmtzIChyZXR1cm4gMCkgb3IgZ2V0cyBhbiBFRlNDT1JSVVBURUQgZXJyb3IuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY191cGRhdGUoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2FnYmxvY2tfdAkJYm5vLAkvKiBzdGFydGluZyBibG9jayBvZiBleHRlbnQgKi8KKwl4ZnNfZXh0bGVuX3QJCWxlbik7CS8qIGxlbmd0aCBvZiBleHRlbnQgKi8KKworI2VuZGlmCS8qIF9fWEZTX0FMTE9DX0JUUkVFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hcmNoLmggYi9mcy94ZnMveGZzX2FyY2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTM1MTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19hcmNoLmgKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0FSQ0hfSF9fCisjZGVmaW5lIF9fWEZTX0FSQ0hfSF9fCisKKyNpZm5kZWYgWEZTX0JJR19JTlVNUworIyBlcnJvciBYRlNfQklHX0lOVU1TIG11c3QgYmUgZGVmaW5lZCB0cnVlIG9yIGZhbHNlCisjZW5kaWYKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2lmZGVmIF9fTElUVExFX0VORElBTgorIyBkZWZpbmUgX19CWVRFX09SREVSCV9fTElUVExFX0VORElBTgorI2VuZGlmCisjaWZkZWYgX19CSUdfRU5ESUFOCisjIGRlZmluZSBfX0JZVEVfT1JERVIJX19CSUdfRU5ESUFOCisjZW5kaWYKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworLyogZG8gd2UgbmVlZCBjb252ZXJzaW9uPyAqLworCisjZGVmaW5lIEFSQ0hfTk9DT05WRVJUIDEKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjIGRlZmluZSBBUkNIX0NPTlZFUlQJMAorI2Vsc2UKKyMgZGVmaW5lIEFSQ0hfQ09OVkVSVAlBUkNIX05PQ09OVkVSVAorI2VuZGlmCisKKy8qIGdlbmVyaWMgc3dhcHBpbmcgbWFjcm9zICovCisKKyNpZm5kZWYgSEFWRV9TV0FCTUFDUk9TCisjZGVmaW5lIElOVF9TV0FQMTYodHlwZSx2YXIpICgodHlwZW9mKHR5cGUpKShfX3N3YWIxNigoX191MTYpKHZhcikpKSkKKyNkZWZpbmUgSU5UX1NXQVAzMih0eXBlLHZhcikgKCh0eXBlb2YodHlwZSkpKF9fc3dhYjMyKChfX3UzMikodmFyKSkpKQorI2RlZmluZSBJTlRfU1dBUDY0KHR5cGUsdmFyKSAoKHR5cGVvZih0eXBlKSkoX19zd2FiNjQoKF9fdTY0KSh2YXIpKSkpCisjZW5kaWYKKworI2RlZmluZSBJTlRfU1dBUCh0eXBlLCB2YXIpIFwKKyAgICAoKHNpemVvZih0eXBlKSA9PSA4KSA/IElOVF9TV0FQNjQodHlwZSx2YXIpIDogXAorICAgICgoc2l6ZW9mKHR5cGUpID09IDQpID8gSU5UX1NXQVAzMih0eXBlLHZhcikgOiBcCisgICAgKChzaXplb2YodHlwZSkgPT0gMikgPyBJTlRfU1dBUDE2KHR5cGUsdmFyKSA6IFwKKyAgICAodmFyKSkpKQorCisvKgorICogZ2V0IGFuZCBzZXQgaW50ZWdlcnMgZnJvbSBwb3RlbnRpYWxseSB1bmFsaWduZWQgbG9jYXRpb25zCisgKi8KKworI2RlZmluZSBJTlRfR0VUX1VOQUxJR05FRF8xNl9CRShwb2ludGVyKSBcCisgICAoKF9fdTE2KSgoKChfX3U4KikocG9pbnRlcikpWzBdIDw8IDgpIHwgKCgoX191OCopKHBvaW50ZXIpKVsxXSkpKQorI2RlZmluZSBJTlRfU0VUX1VOQUxJR05FRF8xNl9CRShwb2ludGVyLHZhbHVlKSBcCisgICAgeyBcCisJKChfX3U4KikocG9pbnRlcikpWzBdID0gKCgodmFsdWUpID4+IDgpICYgMHhmZik7IFwKKwkoKF9fdTgqKShwb2ludGVyKSlbMV0gPSAoKCh2YWx1ZSkgICAgICkgJiAweGZmKTsgXAorICAgIH0KKworLyogZGVmaW5lIGdlbmVyaWMgSU5UXyBtYWNyb3MgKi8KKworI2RlZmluZSBJTlRfR0VUKHJlZmVyZW5jZSxhcmNoKSBcCisgICAgKCgoYXJjaCkgPT0gQVJDSF9OT0NPTlZFUlQpIFwKKwk/IFwKKwkgICAgKHJlZmVyZW5jZSkgXAorCTogXAorCSAgICBJTlRfU1dBUCgocmVmZXJlbmNlKSwocmVmZXJlbmNlKSkgXAorICAgICkKKworLyogZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUgKi8KKyNkZWZpbmUgSU5UX1NFVChyZWZlcmVuY2UsYXJjaCx2YWx1ZXJlZikgXAorICAgIChfX2J1aWx0aW5fY29uc3RhbnRfcCh2YWx1ZXJlZikgPyBcCisJKHZvaWQpKCAocmVmZXJlbmNlKSA9ICggKChhcmNoKSAhPSBBUkNIX05PQ09OVkVSVCkgPyAoSU5UX1NXQVAoKHJlZmVyZW5jZSksKHZhbHVlcmVmKSkpIDogKHZhbHVlcmVmKSkgKSA6IFwKKwkodm9pZCkoIFwKKwkgICAgKChyZWZlcmVuY2UpID0gKHZhbHVlcmVmKSksIFwKKwkgICAgKCAoKGFyY2gpICE9IEFSQ0hfTk9DT05WRVJUKSA/IChyZWZlcmVuY2UpID0gSU5UX1NXQVAoKHJlZmVyZW5jZSksKHJlZmVyZW5jZSkpIDogMCApIFwKKwkpIFwKKyAgICApCisKKy8qIGRvZXMgbm90IHJldHVybiBhIHZhbHVlICovCisjZGVmaW5lIElOVF9NT0RfRVhQUihyZWZlcmVuY2UsYXJjaCxjb2RlKSBcCisgICAgKCgoYXJjaCkgPT0gQVJDSF9OT0NPTlZFUlQpIFwKKwk/IFwKKwkgICAgKHZvaWQpKChyZWZlcmVuY2UpIGNvZGUpIFwKKwk6IFwKKwkgICAgKHZvaWQpKCBcCisJCShyZWZlcmVuY2UpID0gSU5UX0dFVCgocmVmZXJlbmNlKSxhcmNoKSAsIFwKKwkJKChyZWZlcmVuY2UpIGNvZGUpLCBcCisJCUlOVF9TRVQocmVmZXJlbmNlLCBhcmNoLCByZWZlcmVuY2UpIFwKKwkgICAgKSBcCisgICAgKQorCisvKiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZSAqLworI2RlZmluZSBJTlRfTU9EKHJlZmVyZW5jZSxhcmNoLGRlbHRhKSBcCisgICAgKHZvaWQpKCBcCisJSU5UX01PRF9FWFBSKHJlZmVyZW5jZSxhcmNoLCs9KGRlbHRhKSkgXAorICAgICkKKworLyoKKyAqIElOVF9DT1BZIC0gY29weSBhIHZhbHVlIGJldHdlZW4gdHdvIGxvY2F0aW9ucyB3aXRoIHRoZQorICoJICAgICAgX3NhbWUgYXJjaGl0ZWN0dXJlXyBidXQgX3BvdGVudGlhbGx5IGRpZmZlcmVudCBzaXplc18KKyAqCisgKgkgICAgaWYgdGhlIHR5cGVzIG9mIHRoZSB0d28gcGFyYW1ldGVycyBhcmUgZXF1YWwgb3IgdGhleSBhcmUKKyAqCQlpbiBuYXRpdmUgYXJjaGl0ZWN0dXJlLCBhIHNpbXBsZSBjb3B5IGlzIGRvbmUKKyAqCisgKgkgICAgb3RoZXJ3aXNlLCBhcmNoaXRlY3R1cmUgY29udmVyc2lvbnMgYXJlIGRvbmUKKyAqCisgKi8KKworLyogZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUgKi8KKyNkZWZpbmUgSU5UX0NPUFkoZHN0LHNyYyxhcmNoKSBcCisgICAgKCBcCisJKChzaXplb2YoZHN0KSA9PSBzaXplb2Yoc3JjKSkgfHwgKChhcmNoKSA9PSBBUkNIX05PQ09OVkVSVCkpIFwKKwkgICAgPyBcCisJCSh2b2lkKSgoZHN0KSA9IChzcmMpKSBcCisJICAgIDogXAorCQlJTlRfU0VUKGRzdCwgYXJjaCwgSU5UX0dFVChzcmMsIGFyY2gpKSBcCisgICAgKQorCisvKgorICogSU5UX1hMQVRFIC0gY29weSBhIHZhbHVlIGluIGVpdGhlciBkaXJlY3Rpb24gYmV0d2VlbiB0d28gbG9jYXRpb25zCisgKgkgICAgICAgd2l0aCBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcworICoKKyAqCQkgICAgZGlyIDwgMAktIGNvcHkgZnJvbSBtZW1vcnkgdG8gYnVmZmVyIChuYXRpdmUgdG8gYXJjaCkKKyAqCQkgICAgZGlyID4gMAktIGNvcHkgZnJvbSBidWZmZXIgdG8gbWVtb3J5IChhcmNoIHRvIG5hdGl2ZSkKKyAqLworCisvKiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZSAqLworI2RlZmluZSBJTlRfWExBVEUoYnVmLG1lbSxkaXIsYXJjaCkge1wKKyAgICBBU1NFUlQoZGlyKTsgXAorICAgIGlmIChkaXI+MCkgeyBcCisJKG1lbSk9SU5UX0dFVChidWYsIGFyY2gpOyBcCisgICAgfSBlbHNlIHsgXAorCUlOVF9TRVQoYnVmLCBhcmNoLCBtZW0pOyBcCisgICAgfSBcCit9CisKKy8qCisgKiBJbiBkaXJlY3RvcmllcyBpbm9kZSBudW1iZXJzIGFyZSBzdG9yZWQgYXMgdW5hbGlnbmVkIGFycmF5cyBvZiB1bnNpZ25lZAorICogOGJpdCBpbnRlZ2VycyBvbiBkaXNrLgorICoKKyAqIEZvciB2MSBkaXJlY3RvcmllcyBvciB2MiBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gaW5vZGUgbnVtYmVycyB0aGF0CisgKiBkbyBub3QgZml0IGludG8gMzJiaXQgdGhlIGFycmF5IGhhcyBlaWdodCBtZW1iZXJzLCBidXQgdGhlIGZpcnN0IG1lbWJlcgorICogaXMgYWx3YXlzIHplcm86CisgKgorICogIHx1bnVzZWR8NDgtNTV8NDAtNDd8MzItMzl8MjQtMzF8MTYtMjN8IDgtMTV8IDAtIDd8CisgKgorICogRm9yIHYyIGRpcmVjdG9yaWVzIHRoYXQgb25seSBjb250YWluIGVudHJpZXMgd2l0aCBpbm9kZSBudW1iZXJzIHRoYXQgZml0CisgKiBpbnRvIDMyYml0cyBhIGZvdXItbWVtYmVyIGFycmF5IGlzIHVzZWQ6CisgKgorICogIHwyNC0zMXwxNi0yM3wgOC0xNXwgMC0gN3wKKyAqLyAKKworI2RlZmluZSBYRlNfR0VUX0RJUl9JTk80KGRpKSBcCisJKCgodTMyKShkaSkuaVswXSA8PCAyNCkgfCAoKGRpKS5pWzFdIDw8IDE2KSB8ICgoZGkpLmlbMl0gPDwgOCkgfCAoKGRpKS5pWzNdKSkKKworI2RlZmluZSBYRlNfUFVUX0RJUl9JTk80KGZyb20sIGRpKSBcCitkbyB7IFwKKwkoZGkpLmlbMF0gPSAoKChmcm9tKSAmIDB4ZmYwMDAwMDBVTEwpID4+IDI0KTsgXAorCShkaSkuaVsxXSA9ICgoKGZyb20pICYgMHgwMGZmMDAwMFVMTCkgPj4gMTYpOyBcCisJKGRpKS5pWzJdID0gKCgoZnJvbSkgJiAweDAwMDBmZjAwVUxMKSA+PiA4KTsgXAorCShkaSkuaVszXSA9ICgoZnJvbSkgJiAweDAwMDAwMGZmVUxMKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBYRlNfRElfSEkoZGkpIFwKKwkoKCh1MzIpKGRpKS5pWzFdIDw8IDE2KSB8ICgoZGkpLmlbMl0gPDwgOCkgfCAoKGRpKS5pWzNdKSkKKyNkZWZpbmUgWEZTX0RJX0xPKGRpKSBcCisJKCgodTMyKShkaSkuaVs0XSA8PCAyNCkgfCAoKGRpKS5pWzVdIDw8IDE2KSB8ICgoZGkpLmlbNl0gPDwgOCkgfCAoKGRpKS5pWzddKSkKKworI2RlZmluZSBYRlNfR0VUX0RJUl9JTk84KGRpKSAgICAgICAgXAorCSgoKHhmc19pbm9fdClYRlNfRElfTE8oZGkpICYgMHhmZmZmZmZmZlVMTCkgfCBcCisJICgoeGZzX2lub190KVhGU19ESV9ISShkaSkgPDwgMzIpKQorCisjZGVmaW5lIFhGU19QVVRfRElSX0lOTzgoZnJvbSwgZGkpIFwKK2RvIHsgXAorCShkaSkuaVswXSA9IDA7IFwKKwkoZGkpLmlbMV0gPSAoKChmcm9tKSAmIDB4MDBmZjAwMDAwMDAwMDAwMFVMTCkgPj4gNDgpOyBcCisJKGRpKS5pWzJdID0gKCgoZnJvbSkgJiAweDAwMDBmZjAwMDAwMDAwMDBVTEwpID4+IDQwKTsgXAorCShkaSkuaVszXSA9ICgoKGZyb20pICYgMHgwMDAwMDBmZjAwMDAwMDAwVUxMKSA+PiAzMik7IFwKKwkoZGkpLmlbNF0gPSAoKChmcm9tKSAmIDB4MDAwMDAwMDBmZjAwMDAwMFVMTCkgPj4gMjQpOyBcCisJKGRpKS5pWzVdID0gKCgoZnJvbSkgJiAweDAwMDAwMDAwMDBmZjAwMDBVTEwpID4+IDE2KTsgXAorCShkaSkuaVs2XSA9ICgoKGZyb20pICYgMHgwMDAwMDAwMDAwMDBmZjAwVUxMKSA+PiA4KTsgXAorCShkaSkuaVs3XSA9ICgoZnJvbSkgJiAweDAwMDAwMDAwMDAwMDAwZmZVTEwpOyBcCit9IHdoaWxlICgwKQorCQorI2VuZGlmCS8qIF9fWEZTX0FSQ0hfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2F0dHIuYyBiL2ZzL3hmcy94ZnNfYXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOGI1OTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2F0dHIuYwpAQCAtMCwwICsxLDI2NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKworI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2F0dHIuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9sZWFmLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19xdW90YS5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgInhmc190cmFuc19zcGFjZS5oIgorI2luY2x1ZGUgInhmc19hY2wuaCIKKworLyoKKyAqIHhmc19hdHRyLmMKKyAqCisgKiBQcm92aWRlIHRoZSBleHRlcm5hbCBpbnRlcmZhY2VzIHRvIG1hbmFnZSBhdHRyaWJ1dGUgbGlzdHMuCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHRoZSBrZXJuZWwuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBJbnRlcm5hbCByb3V0aW5lcyB3aGVuIGF0dHJpYnV0ZSBsaXN0IGZpdHMgaW5zaWRlIHRoZSBpbm9kZS4KKyAqLworU1RBVElDIGludCB4ZnNfYXR0cl9zaG9ydGZvcm1fYWRkbmFtZSh4ZnNfZGFfYXJnc190ICphcmdzKTsKKworLyoKKyAqIEludGVybmFsIHJvdXRpbmVzIHdoZW4gYXR0cmlidXRlIGxpc3QgaXMgb25lIGJsb2NrLgorICovCitTVEFUSUMgaW50IHhmc19hdHRyX2xlYWZfYWRkbmFtZSh4ZnNfZGFfYXJnc190ICphcmdzKTsKK1NUQVRJQyBpbnQgeGZzX2F0dHJfbGVhZl9yZW1vdmVuYW1lKHhmc19kYV9hcmdzX3QgKmFyZ3MpOworU1RBVElDIGludCB4ZnNfYXR0cl9sZWFmX2xpc3QoeGZzX2F0dHJfbGlzdF9jb250ZXh0X3QgKmNvbnRleHQpOworCisvKgorICogSW50ZXJuYWwgcm91dGluZXMgd2hlbiBhdHRyaWJ1dGUgbGlzdCBpcyBtb3JlIHRoYW4gb25lIGJsb2NrLgorICovCitTVEFUSUMgaW50IHhmc19hdHRyX25vZGVfYWRkbmFtZSh4ZnNfZGFfYXJnc190ICphcmdzKTsKK1NUQVRJQyBpbnQgeGZzX2F0dHJfbm9kZV9yZW1vdmVuYW1lKHhmc19kYV9hcmdzX3QgKmFyZ3MpOworU1RBVElDIGludCB4ZnNfYXR0cl9ub2RlX2xpc3QoeGZzX2F0dHJfbGlzdF9jb250ZXh0X3QgKmNvbnRleHQpOworU1RBVElDIGludCB4ZnNfYXR0cl9maWxsc3RhdGUoeGZzX2RhX3N0YXRlX3QgKnN0YXRlKTsKK1NUQVRJQyBpbnQgeGZzX2F0dHJfcmVmaWxsc3RhdGUoeGZzX2RhX3N0YXRlX3QgKnN0YXRlKTsKKworLyoKKyAqIFJvdXRpbmVzIHRvIG1hbmlwdWxhdGUgb3V0LW9mLWxpbmUgYXR0cmlidXRlIHZhbHVlcy4KKyAqLworU1RBVElDIGludCB4ZnNfYXR0cl9ybXR2YWxfZ2V0KHhmc19kYV9hcmdzX3QgKmFyZ3MpOworU1RBVElDIGludCB4ZnNfYXR0cl9ybXR2YWxfc2V0KHhmc19kYV9hcmdzX3QgKmFyZ3MpOworU1RBVElDIGludCB4ZnNfYXR0cl9ybXR2YWxfcmVtb3ZlKHhmc19kYV9hcmdzX3QgKmFyZ3MpOworCisjZGVmaW5lIEFUVFJfUk1UVkFMVUVfTUFQU0laRQkxCS8qICMgb2YgbWFwIGVudHJpZXMgYXQgb25jZSAqLworCisjaWYgZGVmaW5lZChYRlNfQVRUUl9UUkFDRSkKK2t0cmFjZV90ICp4ZnNfYXR0cl90cmFjZV9idWY7CisjZW5kaWYKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogT3ZlcmFsbCBleHRlcm5hbCBpbnRlcmZhY2Ugcm91dGluZXMuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK2ludAoreGZzX2F0dHJfZmV0Y2goeGZzX2lub2RlX3QgKmlwLCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkgICAgICAgY2hhciAqdmFsdWUsIGludCAqdmFsdWVsZW5wLCBpbnQgZmxhZ3MsIHN0cnVjdCBjcmVkICpjcmVkKQoreworCXhmc19kYV9hcmdzX3QgICBhcmdzOworCWludCAgICAgICAgICAgICBlcnJvcjsKKworCWlmICgoWEZTX0lGT1JLX1EoaXApID09IDApIHx8CisJICAgIChpcC0+aV9kLmRpX2Fmb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCSAgICAgaXAtPmlfZC5kaV9hbmV4dGVudHMgPT0gMCkpCisJCXJldHVybihFTk9BVFRSKTsKKworCWlmICghKGZsYWdzICYgKEFUVFJfS0VSTkFDQ0VTU3xBVFRSX1NFQ1VSRSkpKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfaWFjY2VzcyhpcCwgU19JUlVTUiwgY3JlZCkpKQorCQkJcmV0dXJuKFhGU19FUlJPUihlcnJvcikpOworCX0KKworCS8qCisJICogRmlsbCBpbiB0aGUgYXJnIHN0cnVjdHVyZSBmb3IgdGhpcyByZXF1ZXN0LgorCSAqLworCW1lbXNldCgoY2hhciAqKSZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCWFyZ3MubmFtZSA9IG5hbWU7CisJYXJncy5uYW1lbGVuID0gbmFtZWxlbjsKKwlhcmdzLnZhbHVlID0gdmFsdWU7CisJYXJncy52YWx1ZWxlbiA9ICp2YWx1ZWxlbnA7CisJYXJncy5mbGFncyA9IGZsYWdzOworCWFyZ3MuaGFzaHZhbCA9IHhmc19kYV9oYXNobmFtZShhcmdzLm5hbWUsIGFyZ3MubmFtZWxlbik7CisJYXJncy5kcCA9IGlwOworCWFyZ3Mud2hpY2hmb3JrID0gWEZTX0FUVFJfRk9SSzsKKworCS8qCisJICogRGVjaWRlIG9uIHdoYXQgd29yayByb3V0aW5lcyB0byBjYWxsIGJhc2VkIG9uIHRoZSBpbm9kZSBzaXplLgorCSAqLworCWlmIChYRlNfSUZPUktfUShpcCkgPT0gMCB8fAorCSAgICAoaXAtPmlfZC5kaV9hZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKKwkgICAgIGlwLT5pX2QuZGlfYW5leHRlbnRzID09IDApKSB7CisJCWVycm9yID0gWEZTX0VSUk9SKEVOT0FUVFIpOworCX0gZWxzZSBpZiAoaXAtPmlfZC5kaV9hZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKSB7CisJCWVycm9yID0geGZzX2F0dHJfc2hvcnRmb3JtX2dldHZhbHVlKCZhcmdzKTsKKwl9IGVsc2UgaWYgKHhmc19ibWFwX29uZV9ibG9jayhpcCwgWEZTX0FUVFJfRk9SSykpIHsKKwkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX2dldCgmYXJncyk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSB4ZnNfYXR0cl9ub2RlX2dldCgmYXJncyk7CisJfQorCisJLyoKKwkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgdmFsdWUgdG8gdGhlIGNhbGxlci4KKwkgKi8KKwkqdmFsdWVsZW5wID0gYXJncy52YWx1ZWxlbjsKKworCWlmIChlcnJvciA9PSBFRVhJU1QpCisJCWVycm9yID0gMDsKKwlyZXR1cm4oZXJyb3IpOworfQorCitpbnQKK3hmc19hdHRyX2dldChiaHZfZGVzY190ICpiZHAsIGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlLCBpbnQgKnZhbHVlbGVucCwKKwkgICAgIGludCBmbGFncywgc3RydWN0IGNyZWQgKmNyZWQpCit7CisJeGZzX2lub2RlX3QJKmlwID0gWEZTX0JIVlRPSShiZHApOworCWludAkJZXJyb3IsIG5hbWVsZW47CisKKwlYRlNfU1RBVFNfSU5DKHhzX2F0dHJfZ2V0KTsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuKEVJTlZBTCk7CisJbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwlpZiAobmFtZWxlbiA+PSBNQVhOQU1FTEVOKQorCQlyZXR1cm4oRUZBVUxUKTsJCS8qIG1hdGNoIElSSVggYmVoYXZpb3VyICovCisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkpCisJCXJldHVybihFSU8pOworCisJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwllcnJvciA9IHhmc19hdHRyX2ZldGNoKGlwLCBuYW1lLCBuYW1lbGVuLCB2YWx1ZSwgdmFsdWVsZW5wLCBmbGFncywgY3JlZCk7CisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCXJldHVybihlcnJvcik7Cit9CisKKy8qQVJHU1VTRUQqLworaW50CQkJCQkJCQkvKiBlcnJvciAqLworeGZzX2F0dHJfc2V0KGJodl9kZXNjX3QgKmJkcCwgY2hhciAqbmFtZSwgY2hhciAqdmFsdWUsIGludCB2YWx1ZWxlbiwgaW50IGZsYWdzLAorCQkgICAgIHN0cnVjdCBjcmVkICpjcmVkKQoreworCXhmc19kYV9hcmdzX3QJYXJnczsKKwl4ZnNfaW5vZGVfdAkqZHA7CisJeGZzX2ZzYmxvY2tfdAlmaXJzdGJsb2NrOworCXhmc19ibWFwX2ZyZWVfdCBmbGlzdDsKKwlpbnQJCWVycm9yLCBlcnIyLCBjb21taXR0ZWQ7CisJaW50CQlsb2NhbCwgc2l6ZTsKKwl1aW50CQluYmxrczsKKwl4ZnNfbW91bnRfdAkqbXA7CisJaW50ICAgICAgICAgICAgIHJzdmQgPSAoZmxhZ3MgJiBBVFRSX1JPT1QpICE9IDA7CisJaW50ICAgICAgICAgICAgIG5hbWVsZW47CisKKwluYW1lbGVuID0gc3RybGVuKG5hbWUpOworCWlmIChuYW1lbGVuID49IE1BWE5BTUVMRU4pCisJCXJldHVybiBFRkFVTFQ7CQkvKiBtYXRjaCBJUklYIGJlaGF2aW91ciAqLworCisJWEZTX1NUQVRTX0lOQyh4c19hdHRyX3NldCk7CisKKwlkcCA9IFhGU19CSFZUT0koYmRwKTsKKwltcCA9IGRwLT5pX21vdW50OworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJcmV0dXJuIChFSU8pOworCisJeGZzX2lsb2NrKGRwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwlpZiAoIShmbGFncyAmIEFUVFJfU0VDVVJFKSAmJgorCSAgICAgKGVycm9yID0geGZzX2lhY2Nlc3MoZHAsIFNfSVdVU1IsIGNyZWQpKSkgeworCQl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJCXJldHVybihYRlNfRVJST1IoZXJyb3IpKTsKKwl9CisJeGZzX2l1bmxvY2soZHAsIFhGU19JTE9DS19TSEFSRUQpOworCisJLyoKKwkgKiBBdHRhY2ggdGhlIGRxdW90cyB0byB0aGUgaW5vZGUuCisJICovCisJaWYgKChlcnJvciA9IFhGU19RTV9EUUFUVEFDSChtcCwgZHAsIDApKSkKKwkJcmV0dXJuIChlcnJvcik7CisKKwkvKgorCSAqIElmIHRoZSBpbm9kZSBkb2Vzbid0IGhhdmUgYW4gYXR0cmlidXRlIGZvcmssIGFkZCBvbmUuCisJICogKGlub2RlIG11c3Qgbm90IGJlIGxvY2tlZCB3aGVuIHdlIGNhbGwgdGhpcyByb3V0aW5lKQorCSAqLworCWlmIChYRlNfSUZPUktfUShkcCkgPT0gMCkgeworCQllcnJvciA9IHhmc19ibWFwX2FkZF9hdHRyZm9yayhkcCwgcnN2ZCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybihlcnJvcik7CisJfQorCisJLyoKKwkgKiBGaWxsIGluIHRoZSBhcmcgc3RydWN0dXJlIGZvciB0aGlzIHJlcXVlc3QuCisJICovCisJbWVtc2V0KChjaGFyICopJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisJYXJncy5uYW1lID0gbmFtZTsKKwlhcmdzLm5hbWVsZW4gPSBuYW1lbGVuOworCWFyZ3MudmFsdWUgPSB2YWx1ZTsKKwlhcmdzLnZhbHVlbGVuID0gdmFsdWVsZW47CisJYXJncy5mbGFncyA9IGZsYWdzOworCWFyZ3MuaGFzaHZhbCA9IHhmc19kYV9oYXNobmFtZShhcmdzLm5hbWUsIGFyZ3MubmFtZWxlbik7CisJYXJncy5kcCA9IGRwOworCWFyZ3MuZmlyc3RibG9jayA9ICZmaXJzdGJsb2NrOworCWFyZ3MuZmxpc3QgPSAmZmxpc3Q7CisJYXJncy53aGljaGZvcmsgPSBYRlNfQVRUUl9GT1JLOworCWFyZ3Mub2tub2VudCA9IDE7CisKKwkvKiBEZXRlcm1pbmUgc3BhY2UgbmV3IGF0dHJpYnV0ZSB3aWxsIHVzZSwgYW5kIGlmIGl0IHdpbGwgYmUgaW5saW5lCisJICogb3Igb3V0IG9mIGxpbmUuCisJICovCisJc2l6ZSA9IHhmc19hdHRyX2xlYWZfbmV3ZW50c2l6ZSgmYXJncywgbXAtPm1fc2Iuc2JfYmxvY2tzaXplLCAmbG9jYWwpOworCisJbmJsa3MgPSBYRlNfREFFTlRFUl9TUEFDRV9SRVMobXAsIFhGU19BVFRSX0ZPUkspOworCWlmIChsb2NhbCkgeworCQlpZiAoc2l6ZSA+IChtcC0+bV9zYi5zYl9ibG9ja3NpemUgPj4gMSkpIHsKKwkJCS8qIERvdWJsZSBzcGxpdCBwb3NzaWJsZSAqLworCQkJbmJsa3MgPDw9IDE7CisJCX0KKwl9IGVsc2UgeworCQl1aW50CWRibG9ja3MgPSBYRlNfQl9UT19GU0IobXAsIHZhbHVlbGVuKTsKKwkJLyogT3V0IG9mIGxpbmUgYXR0cmlidXRlLCBjYW5ub3QgZG91YmxlIHNwbGl0LCBidXQgbWFrZQorCQkgKiByb29tIGZvciB0aGUgYXR0cmlidXRlIHZhbHVlIGl0c2VsZi4KKwkJICovCisJCW5ibGtzICs9IGRibG9ja3M7CisJCW5ibGtzICs9IFhGU19ORVhURU5UQUREX1NQQUNFX1JFUyhtcCwgZGJsb2NrcywgWEZTX0FUVFJfRk9SSyk7CisJfQorCisJLyogU2l6ZSBpcyBub3cgYmxvY2tzIGZvciBhdHRyaWJ1dGUgZGF0YSAqLworCWFyZ3MudG90YWwgPSBuYmxrczsKKworCS8qCisJICogU3RhcnQgb3VyIGZpcnN0IHRyYW5zYWN0aW9uIG9mIHRoZSBkYXkuCisJICoKKwkgKiBBbGwgZnV0dXJlIHRyYW5zYWN0aW9ucyBkdXJpbmcgdGhpcyBjb2RlIG11c3QgYmUgImNoYWluZWQiIG9mZgorCSAqIHRoaXMgb25lIHZpYSB0aGUgdHJhbnNfZHVwKCkgY2FsbC4gIEFsbCB0cmFuc2FjdGlvbnMgd2lsbCBjb250YWluCisJICogdGhlIGlub2RlLCBhbmQgdGhlIGlub2RlIHdpbGwgYWx3YXlzIGJlIG1hcmtlZCB3aXRoIHRyYW5zX2lob2xkKCkuCisJICogU2luY2UgdGhlIGlub2RlIHdpbGwgYmUgbG9ja2VkIGluIGFsbCB0cmFuc2FjdGlvbnMsIHdlIG11c3QgbG9nCisJICogdGhlIGlub2RlIGluIGV2ZXJ5IHRyYW5zYWN0aW9uIHRvIGxldCBpdCBmbG9hdCB1cHdhcmQgdGhyb3VnaAorCSAqIHRoZSBsb2cuCisJICovCisJYXJncy50cmFucyA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX0FUVFJfU0VUKTsKKworCS8qCisJICogUm9vdCBmb3JrIGF0dHJpYnV0ZXMgY2FuIHVzZSByZXNlcnZlZCBkYXRhIGJsb2NrcyBmb3IgdGhpcworCSAqIG9wZXJhdGlvbiBpZiBuZWNlc3NhcnkKKwkgKi8KKworCWlmIChyc3ZkKQorCQlhcmdzLnRyYW5zLT50X2ZsYWdzIHw9IFhGU19UUkFOU19SRVNFUlZFOworCisJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKGFyZ3MudHJhbnMsICh1aW50KSBuYmxrcywKKwkJCQkgICAgICBYRlNfQVRUUlNFVF9MT0dfUkVTKG1wLCBuYmxrcyksCisJCQkJICAgICAgMCwgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKKwkJCQkgICAgICBYRlNfQVRUUlNFVF9MT0dfQ09VTlQpKSkgeworCQl4ZnNfdHJhbnNfY2FuY2VsKGFyZ3MudHJhbnMsIDApOworCQlyZXR1cm4oZXJyb3IpOworCX0KKwl4ZnNfaWxvY2soZHAsIFhGU19JTE9DS19FWENMKTsKKworCWVycm9yID0gWEZTX1RSQU5TX1JFU0VSVkVfUVVPVEFfTkJMS1MobXAsIGFyZ3MudHJhbnMsIGRwLCBuYmxrcywgMCwKKwkJCSByc3ZkID8gWEZTX1FNT1BUX1JFU19SRUdCTEtTIHwgWEZTX1FNT1BUX0ZPUkNFX1JFUyA6CisJCQkJWEZTX1FNT1BUX1JFU19SRUdCTEtTKTsKKwlpZiAoZXJyb3IpIHsKKwkJeGZzX2l1bmxvY2soZHAsIFhGU19JTE9DS19FWENMKTsKKwkJeGZzX3RyYW5zX2NhbmNlbChhcmdzLnRyYW5zLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTKTsKKwkJcmV0dXJuIChlcnJvcik7CisJfQorCisJeGZzX3RyYW5zX2lqb2luKGFyZ3MudHJhbnMsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lob2xkKGFyZ3MudHJhbnMsIGRwKTsKKworCS8qCisJICogSWYgdGhlIGF0dHJpYnV0ZSBsaXN0IGlzIG5vbi1leGlzdGFudCBvciBhIHNob3J0Zm9ybSBsaXN0LAorCSAqIHVwZ3JhZGUgaXQgdG8gYSBzaW5nbGUtbGVhZi1ibG9jayBhdHRyaWJ1dGUgbGlzdC4KKwkgKi8KKwlpZiAoKGRwLT5pX2QuZGlfYWZvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkgfHwKKwkgICAgKChkcC0+aV9kLmRpX2Fmb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUykgJiYKKwkgICAgIChkcC0+aV9kLmRpX2FuZXh0ZW50cyA9PSAwKSkpIHsKKworCQkvKgorCQkgKiBCdWlsZCBpbml0aWFsIGF0dHJpYnV0ZSBsaXN0IChpZiByZXF1aXJlZCkuCisJCSAqLworCQlpZiAoZHAtPmlfZC5kaV9hZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMpCisJCQkodm9pZCl4ZnNfYXR0cl9zaG9ydGZvcm1fY3JlYXRlKCZhcmdzKTsKKworCQkvKgorCQkgKiBUcnkgdG8gYWRkIHRoZSBhdHRyIHRvIHRoZSBhdHRyaWJ1dGUgbGlzdCBpbgorCQkgKiB0aGUgaW5vZGUuCisJCSAqLworCQllcnJvciA9IHhmc19hdHRyX3Nob3J0Zm9ybV9hZGRuYW1lKCZhcmdzKTsKKwkJaWYgKGVycm9yICE9IEVOT1NQQykgeworCQkJLyoKKwkJCSAqIENvbW1pdCB0aGUgc2hvcnRmb3JtIG1vZHMsIGFuZCB3ZSdyZSBkb25lLgorCQkJICogTk9URTogdGhpcyBpcyBhbHNvIHRoZSBlcnJvciBwYXRoIChFRVhJU1QsIGV0YykuCisJCQkgKi8KKwkJCUFTU0VSVChhcmdzLnRyYW5zICE9IE5VTEwpOworCisJCQkvKgorCQkJICogSWYgdGhpcyBpcyBhIHN5bmNocm9ub3VzIG1vdW50LCBtYWtlIHN1cmUgdGhhdAorCQkJICogdGhlIHRyYW5zYWN0aW9uIGdvZXMgdG8gZGlzayBiZWZvcmUgcmV0dXJuaW5nCisJCQkgKiB0byB0aGUgdXNlci4KKwkJCSAqLworCQkJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1dTWU5DKSB7CisJCQkJeGZzX3RyYW5zX3NldF9zeW5jKGFyZ3MudHJhbnMpOworCQkJfQorCQkJZXJyMiA9IHhmc190cmFuc19jb21taXQoYXJncy50cmFucywKKwkJCQkJCSBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTLAorCQkJCQkJIE5VTEwpOworCQkJeGZzX2l1bmxvY2soZHAsIFhGU19JTE9DS19FWENMKTsKKworCQkJLyoKKwkJCSAqIEhpdCB0aGUgaW5vZGUgY2hhbmdlIHRpbWUuCisJCQkgKi8KKwkJCWlmICghZXJyb3IgJiYgKGZsYWdzICYgQVRUUl9LRVJOT1RJTUUpID09IDApIHsKKwkJCQl4ZnNfaWNoZ3RpbWUoZHAsIFhGU19JQ0hHVElNRV9DSEcpOworCQkJfQorCQkJcmV0dXJuKGVycm9yID09IDAgPyBlcnIyIDogZXJyb3IpOworCQl9CisKKwkJLyoKKwkJICogSXQgd29uJ3QgZml0IGluIHRoZSBzaG9ydGZvcm0sIHRyYW5zZm9ybSB0byBhIGxlYWYgYmxvY2suCisJCSAqIEdST1Q6IGFub3RoZXIgcG9zc2libGUgcmVxJ210IGZvciBhIGRvdWJsZS1zcGxpdCBidHJlZSBvcC4KKwkJICovCisJCVhGU19CTUFQX0lOSVQoYXJncy5mbGlzdCwgYXJncy5maXJzdGJsb2NrKTsKKwkJZXJyb3IgPSB4ZnNfYXR0cl9zaG9ydGZvcm1fdG9fbGVhZigmYXJncyk7CisJCWlmICghZXJyb3IpIHsKKwkJCWVycm9yID0geGZzX2JtYXBfZmluaXNoKCZhcmdzLnRyYW5zLCBhcmdzLmZsaXN0LAorCQkJCQkJKmFyZ3MuZmlyc3RibG9jaywgJmNvbW1pdHRlZCk7CisJCX0KKwkJaWYgKGVycm9yKSB7CisJCQlBU1NFUlQoY29tbWl0dGVkKTsKKwkJCWFyZ3MudHJhbnMgPSBOVUxMOworCQkJeGZzX2JtYXBfY2FuY2VsKCZmbGlzdCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qCisJCSAqIGJtYXBfZmluaXNoKCkgbWF5IGhhdmUgY29tbWl0dGVkIHRoZSBsYXN0IHRyYW5zIGFuZCBzdGFydGVkCisJCSAqIGEgbmV3IG9uZS4gIFdlIG5lZWQgdGhlIGlub2RlIHRvIGJlIGluIGFsbCB0cmFuc2FjdGlvbnMuCisJCSAqLworCQlpZiAoY29tbWl0dGVkKSB7CisJCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy50cmFucywgZHAsIFhGU19JTE9DS19FWENMKTsKKwkJCXhmc190cmFuc19paG9sZChhcmdzLnRyYW5zLCBkcCk7CisJCX0KKworCQkvKgorCQkgKiBDb21taXQgdGhlIGxlYWYgdHJhbnNmb3JtYXRpb24uICBXZSdsbCBuZWVkIGFub3RoZXIgKGxpbmtlZCkKKwkJICogdHJhbnNhY3Rpb24gdG8gYWRkIHRoZSBuZXcgYXR0cmlidXRlIHRvIHRoZSBsZWFmLgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19hdHRyX3JvbGx0cmFucygmYXJncy50cmFucywgZHApKSkKKwkJCWdvdG8gb3V0OworCisJfQorCisJaWYgKHhmc19ibWFwX29uZV9ibG9jayhkcCwgWEZTX0FUVFJfRk9SSykpIHsKKwkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX2FkZG5hbWUoJmFyZ3MpOworCX0gZWxzZSB7CisJCWVycm9yID0geGZzX2F0dHJfbm9kZV9hZGRuYW1lKCZhcmdzKTsKKwl9CisJaWYgKGVycm9yKSB7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogSWYgdGhpcyBpcyBhIHN5bmNocm9ub3VzIG1vdW50LCBtYWtlIHN1cmUgdGhhdCB0aGUKKwkgKiB0cmFuc2FjdGlvbiBnb2VzIHRvIGRpc2sgYmVmb3JlIHJldHVybmluZyB0byB0aGUgdXNlci4KKwkgKi8KKwlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfV1NZTkMpIHsKKwkJeGZzX3RyYW5zX3NldF9zeW5jKGFyZ3MudHJhbnMpOworCX0KKworCS8qCisJICogQ29tbWl0IHRoZSBsYXN0IGluIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbnMuCisJICovCisJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLnRyYW5zLCBkcCwgWEZTX0lMT0dfQ09SRSk7CisJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KGFyZ3MudHJhbnMsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsCisJCQkJIE5VTEwpOworCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwkvKgorCSAqIEhpdCB0aGUgaW5vZGUgY2hhbmdlIHRpbWUuCisJICovCisJaWYgKCFlcnJvciAmJiAoZmxhZ3MgJiBBVFRSX0tFUk5PVElNRSkgPT0gMCkgeworCQl4ZnNfaWNoZ3RpbWUoZHAsIFhGU19JQ0hHVElNRV9DSEcpOworCX0KKworCXJldHVybihlcnJvcik7CisKK291dDoKKwlpZiAoYXJncy50cmFucykKKwkJeGZzX3RyYW5zX2NhbmNlbChhcmdzLnRyYW5zLAorCQkJWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFU3xYRlNfVFJBTlNfQUJPUlQpOworCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJcmV0dXJuKGVycm9yKTsKK30KKworLyoKKyAqIEdlbmVyaWMgaGFuZGxlciByb3V0aW5lIHRvIHJlbW92ZSBhIG5hbWUgZnJvbSBhbiBhdHRyaWJ1dGUgbGlzdC4KKyAqIFRyYW5zaXRpb25zIGF0dHJpYnV0ZSBsaXN0IGZyb20gQnRyZWUgdG8gc2hvcnRmb3JtIGFzIG5lY2Vzc2FyeS4KKyAqLworLypBUkdTVVNFRCovCitpbnQJCQkJCQkJCS8qIGVycm9yICovCit4ZnNfYXR0cl9yZW1vdmUoYmh2X2Rlc2NfdCAqYmRwLCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MsIHN0cnVjdCBjcmVkICpjcmVkKQoreworCXhmc19kYV9hcmdzX3QgICAgICAgYXJnczsKKwl4ZnNfaW5vZGVfdCAgICAgICAgICpkcDsKKwl4ZnNfZnNibG9ja190ICAgICAgIGZpcnN0YmxvY2s7CisJeGZzX2JtYXBfZnJlZV90ICAgICBmbGlzdDsKKwlpbnQgICAgICAgICAgICAgICAgIGVycm9yOworCXhmc19tb3VudF90ICAgICAgICAgKm1wOworCWludCAgICAgICAgICAgICAgICAgbmFtZWxlbjsKKworCUFTU0VSVChNQVhOQU1FTEVOLTE8PTB4ZmYpOyAvKiBsZW5ndGggaXMgc3RvcmVkIGluIHVpbnQ4ICovCisJbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwlpZiAobmFtZWxlbj49TUFYTkFNRUxFTikKKwkJcmV0dXJuIEVGQVVMVDsgLyogbWF0Y2ggaXJpeCBiZWhhdmlvdXIgKi8KKworCVhGU19TVEFUU19JTkMoeHNfYXR0cl9yZW1vdmUpOworCisJZHAgPSBYRlNfQkhWVE9JKGJkcCk7CisJbXAgPSBkcC0+aV9tb3VudDsKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCXJldHVybiAoRUlPKTsKKworCXhmc19pbG9jayhkcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJaWYgKCEoZmxhZ3MgJiBBVFRSX1NFQ1VSRSkgJiYKKwkgICAgIChlcnJvciA9IHhmc19pYWNjZXNzKGRwLCBTX0lXVVNSLCBjcmVkKSkpIHsKKwkJeGZzX2l1bmxvY2soZHAsIFhGU19JTE9DS19TSEFSRUQpOworCQlyZXR1cm4oWEZTX0VSUk9SKGVycm9yKSk7CisJfSBlbHNlIGlmIChYRlNfSUZPUktfUShkcCkgPT0gMCB8fAorCQkgICAoZHAtPmlfZC5kaV9hZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKKwkJICAgIGRwLT5pX2QuZGlfYW5leHRlbnRzID09IDApKSB7CisJCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwkJcmV0dXJuKFhGU19FUlJPUihFTk9BVFRSKSk7CisJfQorCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKworCS8qCisJICogRmlsbCBpbiB0aGUgYXJnIHN0cnVjdHVyZSBmb3IgdGhpcyByZXF1ZXN0LgorCSAqLworCW1lbXNldCgoY2hhciAqKSZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCWFyZ3MubmFtZSA9IG5hbWU7CisJYXJncy5uYW1lbGVuID0gbmFtZWxlbjsKKwlhcmdzLmZsYWdzID0gZmxhZ3M7CisJYXJncy5oYXNodmFsID0geGZzX2RhX2hhc2huYW1lKGFyZ3MubmFtZSwgYXJncy5uYW1lbGVuKTsKKwlhcmdzLmRwID0gZHA7CisJYXJncy5maXJzdGJsb2NrID0gJmZpcnN0YmxvY2s7CisJYXJncy5mbGlzdCA9ICZmbGlzdDsKKwlhcmdzLnRvdGFsID0gMDsKKwlhcmdzLndoaWNoZm9yayA9IFhGU19BVFRSX0ZPUks7CisKKwkvKgorCSAqIEF0dGFjaCB0aGUgZHF1b3RzIHRvIHRoZSBpbm9kZS4KKwkgKi8KKwlpZiAoKGVycm9yID0gWEZTX1FNX0RRQVRUQUNIKG1wLCBkcCwgMCkpKQorCQlyZXR1cm4gKGVycm9yKTsKKworCS8qCisJICogU3RhcnQgb3VyIGZpcnN0IHRyYW5zYWN0aW9uIG9mIHRoZSBkYXkuCisJICoKKwkgKiBBbGwgZnV0dXJlIHRyYW5zYWN0aW9ucyBkdXJpbmcgdGhpcyBjb2RlIG11c3QgYmUgImNoYWluZWQiIG9mZgorCSAqIHRoaXMgb25lIHZpYSB0aGUgdHJhbnNfZHVwKCkgY2FsbC4gIEFsbCB0cmFuc2FjdGlvbnMgd2lsbCBjb250YWluCisJICogdGhlIGlub2RlLCBhbmQgdGhlIGlub2RlIHdpbGwgYWx3YXlzIGJlIG1hcmtlZCB3aXRoIHRyYW5zX2lob2xkKCkuCisJICogU2luY2UgdGhlIGlub2RlIHdpbGwgYmUgbG9ja2VkIGluIGFsbCB0cmFuc2FjdGlvbnMsIHdlIG11c3QgbG9nCisJICogdGhlIGlub2RlIGluIGV2ZXJ5IHRyYW5zYWN0aW9uIHRvIGxldCBpdCBmbG9hdCB1cHdhcmQgdGhyb3VnaAorCSAqIHRoZSBsb2cuCisJICovCisJYXJncy50cmFucyA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX0FUVFJfUk0pOworCisJLyoKKwkgKiBSb290IGZvcmsgYXR0cmlidXRlcyBjYW4gdXNlIHJlc2VydmVkIGRhdGEgYmxvY2tzIGZvciB0aGlzCisJICogb3BlcmF0aW9uIGlmIG5lY2Vzc2FyeQorCSAqLworCisJaWYgKGZsYWdzICYgQVRUUl9ST09UKQorCQlhcmdzLnRyYW5zLT50X2ZsYWdzIHw9IFhGU19UUkFOU19SRVNFUlZFOworCisJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKGFyZ3MudHJhbnMsCisJCQkJICAgICAgWEZTX0FUVFJSTV9TUEFDRV9SRVMobXApLAorCQkJCSAgICAgIFhGU19BVFRSUk1fTE9HX1JFUyhtcCksCisJCQkJICAgICAgMCwgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKKwkJCQkgICAgICBYRlNfQVRUUlJNX0xPR19DT1VOVCkpKSB7CisJCXhmc190cmFuc19jYW5jZWwoYXJncy50cmFucywgMCk7CisJCXJldHVybihlcnJvcik7CisKKwl9CisKKwl4ZnNfaWxvY2soZHAsIFhGU19JTE9DS19FWENMKTsKKwkvKgorCSAqIE5vIG5lZWQgdG8gbWFrZSBxdW90YSByZXNlcnZhdGlvbnMgaGVyZS4gV2UgZXhwZWN0IHRvIHJlbGVhc2Ugc29tZQorCSAqIGJsb2NrcyBub3QgYWxsb2NhdGUgaW4gdGhlIGNvbW1vbiBjYXNlLgorCSAqLworCXhmc190cmFuc19pam9pbihhcmdzLnRyYW5zLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19paG9sZChhcmdzLnRyYW5zLCBkcCk7CisKKwkvKgorCSAqIERlY2lkZSBvbiB3aGF0IHdvcmsgcm91dGluZXMgdG8gY2FsbCBiYXNlZCBvbiB0aGUgaW5vZGUgc2l6ZS4KKwkgKi8KKwlpZiAoWEZTX0lGT1JLX1EoZHApID09IDAgfHwKKwkgICAgKGRwLT5pX2QuZGlfYWZvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJICAgICBkcC0+aV9kLmRpX2FuZXh0ZW50cyA9PSAwKSkgeworCQllcnJvciA9IFhGU19FUlJPUihFTk9BVFRSKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChkcC0+aV9kLmRpX2Fmb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpIHsKKwkJQVNTRVJUKGRwLT5pX2FmcC0+aWZfZmxhZ3MgJiBYRlNfSUZJTkxJTkUpOworCQllcnJvciA9IHhmc19hdHRyX3Nob3J0Zm9ybV9yZW1vdmUoJmFyZ3MpOworCQlpZiAoZXJyb3IpIHsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIGlmICh4ZnNfYm1hcF9vbmVfYmxvY2soZHAsIFhGU19BVFRSX0ZPUkspKSB7CisJCWVycm9yID0geGZzX2F0dHJfbGVhZl9yZW1vdmVuYW1lKCZhcmdzKTsKKwl9IGVsc2UgeworCQllcnJvciA9IHhmc19hdHRyX25vZGVfcmVtb3ZlbmFtZSgmYXJncyk7CisJfQorCWlmIChlcnJvcikgeworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBzeW5jaHJvbm91cyBtb3VudCwgbWFrZSBzdXJlIHRoYXQgdGhlCisJICogdHJhbnNhY3Rpb24gZ29lcyB0byBkaXNrIGJlZm9yZSByZXR1cm5pbmcgdG8gdGhlIHVzZXIuCisJICovCisJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1dTWU5DKSB7CisJCXhmc190cmFuc19zZXRfc3luYyhhcmdzLnRyYW5zKTsKKwl9CisKKwkvKgorCSAqIENvbW1pdCB0aGUgbGFzdCBpbiB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb25zLgorCSAqLworCXhmc190cmFuc19sb2dfaW5vZGUoYXJncy50cmFucywgZHAsIFhGU19JTE9HX0NPUkUpOworCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdChhcmdzLnRyYW5zLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTLAorCQkJCSBOVUxMKTsKKwl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJLyoKKwkgKiBIaXQgdGhlIGlub2RlIGNoYW5nZSB0aW1lLgorCSAqLworCWlmICghZXJyb3IgJiYgKGZsYWdzICYgQVRUUl9LRVJOT1RJTUUpID09IDApIHsKKwkJeGZzX2ljaGd0aW1lKGRwLCBYRlNfSUNIR1RJTUVfQ0hHKTsKKwl9CisKKwlyZXR1cm4oZXJyb3IpOworCitvdXQ6CisJaWYgKGFyZ3MudHJhbnMpCisJCXhmc190cmFuc19jYW5jZWwoYXJncy50cmFucywKKwkJCVhGU19UUkFOU19SRUxFQVNFX0xPR19SRVN8WEZTX1RSQU5TX0FCT1JUKTsKKwl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX0VYQ0wpOworCXJldHVybihlcnJvcik7Cit9CisKKy8qCisgKiBHZW5lcmF0ZSBhIGxpc3Qgb2YgZXh0ZW5kZWQgYXR0cmlidXRlIG5hbWVzIGFuZCBvcHRpb25hbGx5CisgKiBhbHNvIHZhbHVlIGxlbmd0aHMuICBQb3NpdGl2ZSByZXR1cm4gdmFsdWUgZm9sbG93cyB0aGUgWEZTCisgKiBjb252ZW50aW9uIG9mIGJlaW5nIGFuIGVycm9yLCB6ZXJvIG9yIG5lZ2F0aXZlIHJldHVybiBjb2RlCisgKiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgcmV0dXJuZWQgKG5lZ2F0ZWQpLCBpbmRpY2F0aW5nCisgKiBzdWNjZXNzLgorICovCitpbnQKK3hmc19hdHRyX2xpc3QoYmh2X2Rlc2NfdCAqYmRwLCBjaGFyICpidWZmZXIsIGludCBidWZzaXplLCBpbnQgZmxhZ3MsCisJCSAgICAgIGF0dHJsaXN0X2N1cnNvcl9rZXJuX3QgKmN1cnNvciwgc3RydWN0IGNyZWQgKmNyZWQpCit7CisJeGZzX2F0dHJfbGlzdF9jb250ZXh0X3QgY29udGV4dDsKKwl4ZnNfaW5vZGVfdCAqZHA7CisJaW50IGVycm9yOworCisJWEZTX1NUQVRTX0lOQyh4c19hdHRyX2xpc3QpOworCisJLyoKKwkgKiBWYWxpZGF0ZSB0aGUgY3Vyc29yLgorCSAqLworCWlmIChjdXJzb3ItPnBhZDEgfHwgY3Vyc29yLT5wYWQyKQorCQlyZXR1cm4oWEZTX0VSUk9SKEVJTlZBTCkpOworCWlmICgoY3Vyc29yLT5pbml0dGVkID09IDApICYmCisJICAgIChjdXJzb3ItPmhhc2h2YWwgfHwgY3Vyc29yLT5ibGtubyB8fCBjdXJzb3ItPm9mZnNldCkpCisJCXJldHVybihYRlNfRVJST1IoRUlOVkFMKSk7CisKKwkvKgorCSAqIENoZWNrIGZvciBhIHByb3Blcmx5IGFsaWduZWQgYnVmZmVyLgorCSAqLworCWlmICgoKGxvbmcpYnVmZmVyKSAmIChzaXplb2YoaW50KS0xKSkKKwkJcmV0dXJuKFhGU19FUlJPUihFRkFVTFQpKTsKKwlpZiAoZmxhZ3MgJiBBVFRSX0tFUk5PVkFMKQorCQlidWZzaXplID0gMDsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgb3V0cHV0IGJ1ZmZlci4KKwkgKi8KKwljb250ZXh0LmRwID0gZHAgPSBYRlNfQkhWVE9JKGJkcCk7CisJY29udGV4dC5jdXJzb3IgPSBjdXJzb3I7CisJY29udGV4dC5jb3VudCA9IDA7CisJY29udGV4dC5kdXBjbnQgPSAwOworCWNvbnRleHQucmVzeW5jaCA9IDE7CisJY29udGV4dC5mbGFncyA9IGZsYWdzOworCWlmICghKGZsYWdzICYgQVRUUl9LRVJOQU1FTFMpKSB7CisJCWNvbnRleHQuYnVmc2l6ZSA9IChidWZzaXplICYgfihzaXplb2YoaW50KS0xKSk7ICAvKiBhbGlnbiAqLworCQljb250ZXh0LmZpcnN0dSA9IGNvbnRleHQuYnVmc2l6ZTsKKwkJY29udGV4dC5hbGlzdCA9IChhdHRybGlzdF90ICopYnVmZmVyOworCQljb250ZXh0LmFsaXN0LT5hbF9jb3VudCA9IDA7CisJCWNvbnRleHQuYWxpc3QtPmFsX21vcmUgPSAwOworCQljb250ZXh0LmFsaXN0LT5hbF9vZmZzZXRbMF0gPSBjb250ZXh0LmJ1ZnNpemU7CisJfQorCWVsc2UgeworCQljb250ZXh0LmJ1ZnNpemUgPSBidWZzaXplOworCQljb250ZXh0LmZpcnN0dSA9IGNvbnRleHQuYnVmc2l6ZTsKKwkJY29udGV4dC5hbGlzdCA9IChhdHRybGlzdF90ICopYnVmZmVyOworCX0KKworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGRwLT5pX21vdW50KSkKKwkJcmV0dXJuIChFSU8pOworCisJeGZzX2lsb2NrKGRwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwlpZiAoIShmbGFncyAmIEFUVFJfU0VDVVJFKSAmJgorCSAgICAgKGVycm9yID0geGZzX2lhY2Nlc3MoZHAsIFNfSVJVU1IsIGNyZWQpKSkgeworCQl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJCXJldHVybihYRlNfRVJST1IoZXJyb3IpKTsKKwl9CisKKwkvKgorCSAqIERlY2lkZSBvbiB3aGF0IHdvcmsgcm91dGluZXMgdG8gY2FsbCBiYXNlZCBvbiB0aGUgaW5vZGUgc2l6ZS4KKwkgKi8KKwl4ZnNfYXR0cl90cmFjZV9sX2MoInN5c2NhbGwgc3RhcnQiLCAmY29udGV4dCk7CisJaWYgKFhGU19JRk9SS19RKGRwKSA9PSAwIHx8CisJICAgIChkcC0+aV9kLmRpX2Fmb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCSAgICAgZHAtPmlfZC5kaV9hbmV4dGVudHMgPT0gMCkpIHsKKwkJZXJyb3IgPSAwOworCX0gZWxzZSBpZiAoZHAtPmlfZC5kaV9hZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKSB7CisJCWVycm9yID0geGZzX2F0dHJfc2hvcnRmb3JtX2xpc3QoJmNvbnRleHQpOworCX0gZWxzZSBpZiAoeGZzX2JtYXBfb25lX2Jsb2NrKGRwLCBYRlNfQVRUUl9GT1JLKSkgeworCQllcnJvciA9IHhmc19hdHRyX2xlYWZfbGlzdCgmY29udGV4dCk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSB4ZnNfYXR0cl9ub2RlX2xpc3QoJmNvbnRleHQpOworCX0KKwl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJeGZzX2F0dHJfdHJhY2VfbF9jKCJzeXNjYWxsIGVuZCIsICZjb250ZXh0KTsKKworCWlmICghKGNvbnRleHQuZmxhZ3MgJiAoQVRUUl9LRVJOT1ZBTHxBVFRSX0tFUk5BTUVMUykpKSB7CisJCUFTU0VSVChlcnJvciA+PSAwKTsKKwl9CisJZWxzZSB7CS8qIG11c3QgcmV0dXJuIG5lZ2F0ZWQgYnVmZmVyIHNpemUgb3IgdGhlIGVycm9yICovCisJCWlmIChjb250ZXh0LmNvdW50IDwgMCkKKwkJCWVycm9yID0gWEZTX0VSUk9SKEVSQU5HRSk7CisJCWVsc2UKKwkJCWVycm9yID0gLWNvbnRleHQuY291bnQ7CisJfQorCisJcmV0dXJuKGVycm9yKTsKK30KKworaW50CQkJCQkJCQkvKiBlcnJvciAqLworeGZzX2F0dHJfaW5hY3RpdmUoeGZzX2lub2RlX3QgKmRwKQoreworCXhmc190cmFuc190ICp0cmFuczsKKwl4ZnNfbW91bnRfdCAqbXA7CisJaW50IGVycm9yOworCisJbXAgPSBkcC0+aV9tb3VudDsKKwlBU1NFUlQoISBYRlNfTk9UX0RRQVRUQUNIRUQobXAsIGRwKSk7CisKKwl4ZnNfaWxvY2soZHAsIFhGU19JTE9DS19TSEFSRUQpOworCWlmICgoWEZTX0lGT1JLX1EoZHApID09IDApIHx8CisJICAgIChkcC0+aV9kLmRpX2Fmb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpIHx8CisJICAgIChkcC0+aV9kLmRpX2Fmb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCSAgICAgZHAtPmlfZC5kaV9hbmV4dGVudHMgPT0gMCkpIHsKKwkJeGZzX2l1bmxvY2soZHAsIFhGU19JTE9DS19TSEFSRUQpOworCQlyZXR1cm4oMCk7CisJfQorCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKworCS8qCisJICogU3RhcnQgb3VyIGZpcnN0IHRyYW5zYWN0aW9uIG9mIHRoZSBkYXkuCisJICoKKwkgKiBBbGwgZnV0dXJlIHRyYW5zYWN0aW9ucyBkdXJpbmcgdGhpcyBjb2RlIG11c3QgYmUgImNoYWluZWQiIG9mZgorCSAqIHRoaXMgb25lIHZpYSB0aGUgdHJhbnNfZHVwKCkgY2FsbC4gIEFsbCB0cmFuc2FjdGlvbnMgd2lsbCBjb250YWluCisJICogdGhlIGlub2RlLCBhbmQgdGhlIGlub2RlIHdpbGwgYWx3YXlzIGJlIG1hcmtlZCB3aXRoIHRyYW5zX2lob2xkKCkuCisJICogU2luY2UgdGhlIGlub2RlIHdpbGwgYmUgbG9ja2VkIGluIGFsbCB0cmFuc2FjdGlvbnMsIHdlIG11c3QgbG9nCisJICogdGhlIGlub2RlIGluIGV2ZXJ5IHRyYW5zYWN0aW9uIHRvIGxldCBpdCBmbG9hdCB1cHdhcmQgdGhyb3VnaAorCSAqIHRoZSBsb2cuCisJICovCisJdHJhbnMgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19BVFRSSU5WQUwpOworCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cmFucywgMCwgWEZTX0FUVFJJTlZBTF9MT0dfUkVTKG1wKSwgMCwKKwkJCQkgICAgICBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAorCQkJCSAgICAgIFhGU19BVFRSSU5WQUxfTE9HX0NPVU5UKSkpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cmFucywgMCk7CisJCXJldHVybihlcnJvcik7CisJfQorCXhmc19pbG9jayhkcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJLyoKKwkgKiBObyBuZWVkIHRvIG1ha2UgcXVvdGEgcmVzZXJ2YXRpb25zIGhlcmUuIFdlIGV4cGVjdCB0byByZWxlYXNlIHNvbWUKKwkgKiBibG9ja3MsIG5vdCBhbGxvY2F0ZSwgaW4gdGhlIGNvbW1vbiBjYXNlLgorCSAqLworCXhmc190cmFuc19pam9pbih0cmFucywgZHAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWhvbGQodHJhbnMsIGRwKTsKKworCS8qCisJICogRGVjaWRlIG9uIHdoYXQgd29yayByb3V0aW5lcyB0byBjYWxsIGJhc2VkIG9uIHRoZSBpbm9kZSBzaXplLgorCSAqLworCWlmICgoWEZTX0lGT1JLX1EoZHApID09IDApIHx8CisJICAgIChkcC0+aV9kLmRpX2Fmb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpIHx8CisJICAgIChkcC0+aV9kLmRpX2Fmb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCSAgICAgZHAtPmlfZC5kaV9hbmV4dGVudHMgPT0gMCkpIHsKKwkJZXJyb3IgPSAwOworCQlnb3RvIG91dDsKKwl9CisJZXJyb3IgPSB4ZnNfYXR0cl9yb290X2luYWN0aXZlKCZ0cmFucywgZHApOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisJLyoKKwkgKiBzaWduYWwgc3luY2hyb25vdXMgaW5hY3RpdmUgdHJhbnNhY3Rpb25zIHVubGVzcyB0aGlzCisJICogaXMgYSBzeW5jaHJvbm91cyBtb3VudCBmaWxlc3lzdGVtIGluIHdoaWNoIGNhc2Ugd2UKKwkgKiBrbm93IHRoYXQgd2UncmUgaGVyZSBiZWNhdXNlIHdlJ3ZlIGJlZW4gY2FsbGVkIG91dCBvZgorCSAqIHhmc19pbmFjdGl2ZSB3aGljaCBtZWFucyB0aGF0IHRoZSBsYXN0IHJlZmVyZW5jZSBpcyBnb25lCisJICogYW5kIHRoZSB1bmxpbmsgdHJhbnNhY3Rpb24gaGFzIGFscmVhZHkgaGl0IHRoZSBkaXNrIHNvCisJICogYXN5bmMgaW5hY3RpdmUgdHJhbnNhY3Rpb25zIGFyZSBzYWZlLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfaXRydW5jYXRlX2ZpbmlzaCgmdHJhbnMsIGRwLCAwTEwsIFhGU19BVFRSX0ZPUkssCisJCQkJKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfV1NZTkMpCisJCQkJID8gMSA6IDApKSkpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBDb21taXQgdGhlIGxhc3QgaW4gdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9ucy4KKwkgKi8KKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRyYW5zLCBkcCwgWEZTX0lMT0dfQ09SRSk7CisJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRyYW5zLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTLAorCQkJCSBOVUxMKTsKKwl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJcmV0dXJuKGVycm9yKTsKKworb3V0OgorCXhmc190cmFuc19jYW5jZWwodHJhbnMsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVN8WEZTX1RSQU5TX0FCT1JUKTsKKwl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX0VYQ0wpOworCXJldHVybihlcnJvcik7Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRXh0ZXJuYWwgcm91dGluZXMgd2hlbiBhdHRyaWJ1dGUgbGlzdCBpcyBpbnNpZGUgdGhlIGlub2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBBZGQgYSBuYW1lIHRvIHRoZSBzaG9ydGZvcm0gYXR0cmlidXRlIGxpc3Qgc3RydWN0dXJlCisgKiBUaGlzIGlzIHRoZSBleHRlcm5hbCByb3V0aW5lLgorICovCitTVEFUSUMgaW50Cit4ZnNfYXR0cl9zaG9ydGZvcm1fYWRkbmFtZSh4ZnNfZGFfYXJnc190ICphcmdzKQoreworCWludCBuZXdzaXplLCByZXR2YWw7CisKKwlyZXR2YWwgPSB4ZnNfYXR0cl9zaG9ydGZvcm1fbG9va3VwKGFyZ3MpOworCWlmICgoYXJncy0+ZmxhZ3MgJiBBVFRSX1JFUExBQ0UpICYmIChyZXR2YWwgPT0gRU5PQVRUUikpIHsKKwkJcmV0dXJuKHJldHZhbCk7CisJfSBlbHNlIGlmIChyZXR2YWwgPT0gRUVYSVNUKSB7CisJCWlmIChhcmdzLT5mbGFncyAmIEFUVFJfQ1JFQVRFKQorCQkJcmV0dXJuKHJldHZhbCk7CisJCXJldHZhbCA9IHhmc19hdHRyX3Nob3J0Zm9ybV9yZW1vdmUoYXJncyk7CisJCUFTU0VSVChyZXR2YWwgPT0gMCk7CisJfQorCisJbmV3c2l6ZSA9IFhGU19BVFRSX1NGX1RPVFNJWkUoYXJncy0+ZHApOworCW5ld3NpemUgKz0gWEZTX0FUVFJfU0ZfRU5UU0laRV9CWU5BTUUoYXJncy0+bmFtZWxlbiwgYXJncy0+dmFsdWVsZW4pOworCWlmICgobmV3c2l6ZSA8PSBYRlNfSUZPUktfQVNJWkUoYXJncy0+ZHApKSAmJgorCSAgICAoYXJncy0+bmFtZWxlbiA8IFhGU19BVFRSX1NGX0VOVFNJWkVfTUFYKSAmJgorCSAgICAoYXJncy0+dmFsdWVsZW4gPCBYRlNfQVRUUl9TRl9FTlRTSVpFX01BWCkpIHsKKwkJcmV0dmFsID0geGZzX2F0dHJfc2hvcnRmb3JtX2FkZChhcmdzKTsKKwkJQVNTRVJUKHJldHZhbCA9PSAwKTsKKwl9IGVsc2UgeworCQlyZXR1cm4oWEZTX0VSUk9SKEVOT1NQQykpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEV4dGVybmFsIHJvdXRpbmVzIHdoZW4gYXR0cmlidXRlIGxpc3QgaXMgb25lIGJsb2NrCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBBZGQgYSBuYW1lIHRvIHRoZSBsZWFmIGF0dHJpYnV0ZSBsaXN0IHN0cnVjdHVyZQorICoKKyAqIFRoaXMgbGVhZiBibG9jayBjYW5ub3QgaGF2ZSBhICJyZW1vdGUiIHZhbHVlLCB3ZSBvbmx5IGNhbGwgdGhpcyByb3V0aW5lCisgKiBpZiBibWFwX29uZV9ibG9jaygpIHNheXMgdGhlcmUgaXMgb25seSBvbmUgYmxvY2sgKGllOiBubyByZW1vdGUgYmxrcykuCisgKi8KK2ludAoreGZzX2F0dHJfbGVhZl9hZGRuYW1lKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2lub2RlX3QgKmRwOworCXhmc19kYWJ1Zl90ICpicDsKKwlpbnQgcmV0dmFsLCBlcnJvciwgY29tbWl0dGVkOworCisJLyoKKwkgKiBSZWFkIHRoZSAob25seSkgYmxvY2sgaW4gdGhlIGF0dHJpYnV0ZSBsaXN0IGluLgorCSAqLworCWRwID0gYXJncy0+ZHA7CisJYXJncy0+Ymxrbm8gPSAwOworCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgYXJncy0+Ymxrbm8sIC0xLCAmYnAsCisJCQkJCSAgICAgWEZTX0FUVFJfRk9SSyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4oZXJyb3IpOworCUFTU0VSVChicCAhPSBOVUxMKTsKKworCS8qCisJICogTG9vayB1cCB0aGUgZ2l2ZW4gYXR0cmlidXRlIGluIHRoZSBsZWFmIGJsb2NrLiAgRmlndXJlIG91dCBpZgorCSAqIHRoZSBnaXZlbiBmbGFncyBwcm9kdWNlIGFuIGVycm9yIG9yIGNhbGwgZm9yIGFuIGF0b21pYyByZW5hbWUuCisJICovCisJcmV0dmFsID0geGZzX2F0dHJfbGVhZl9sb29rdXBfaW50KGJwLCBhcmdzKTsKKwlpZiAoKGFyZ3MtPmZsYWdzICYgQVRUUl9SRVBMQUNFKSAmJiAocmV0dmFsID09IEVOT0FUVFIpKSB7CisJCXhmc19kYV9icmVsc2UoYXJncy0+dHJhbnMsIGJwKTsKKwkJcmV0dXJuKHJldHZhbCk7CisJfSBlbHNlIGlmIChyZXR2YWwgPT0gRUVYSVNUKSB7CisJCWlmIChhcmdzLT5mbGFncyAmIEFUVFJfQ1JFQVRFKSB7CS8qIHB1cmUgY3JlYXRlIG9wICovCisJCQl4ZnNfZGFfYnJlbHNlKGFyZ3MtPnRyYW5zLCBicCk7CisJCQlyZXR1cm4ocmV0dmFsKTsKKwkJfQorCQlhcmdzLT5yZW5hbWUgPSAxOwkJCS8qIGFuIGF0b21pYyByZW5hbWUgKi8KKwkJYXJncy0+Ymxrbm8yID0gYXJncy0+Ymxrbm87CQkvKiBzZXQgMm5kIGVudHJ5IGluZm8qLworCQlhcmdzLT5pbmRleDIgPSBhcmdzLT5pbmRleDsKKwkJYXJncy0+cm10Ymxrbm8yID0gYXJncy0+cm10Ymxrbm87CisJCWFyZ3MtPnJtdGJsa2NudDIgPSBhcmdzLT5ybXRibGtjbnQ7CisJfQorCisJLyoKKwkgKiBBZGQgdGhlIGF0dHJpYnV0ZSB0byB0aGUgbGVhZiBibG9jaywgdHJhbnNpdGlvbmluZyB0byBhIEJ0cmVlCisJICogaWYgcmVxdWlyZWQuCisJICovCisJcmV0dmFsID0geGZzX2F0dHJfbGVhZl9hZGQoYnAsIGFyZ3MpOworCXhmc19kYV9idWZfZG9uZShicCk7CisJaWYgKHJldHZhbCA9PSBFTk9TUEMpIHsKKwkJLyoKKwkJICogUHJvbW90ZSB0aGUgYXR0cmlidXRlIGxpc3QgdG8gdGhlIEJ0cmVlIGZvcm1hdCwgdGhlbgorCQkgKiBDb21taXQgdGhhdCB0cmFuc2FjdGlvbiBzbyB0aGF0IHRoZSBub2RlX2FkZG5hbWUoKSBjYWxsCisJCSAqIGNhbiBtYW5hZ2UgaXRzIG93biB0cmFuc2FjdGlvbnMuCisJCSAqLworCQlYRlNfQk1BUF9JTklUKGFyZ3MtPmZsaXN0LCBhcmdzLT5maXJzdGJsb2NrKTsKKwkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX3RvX25vZGUoYXJncyk7CisJCWlmICghZXJyb3IpIHsKKwkJCWVycm9yID0geGZzX2JtYXBfZmluaXNoKCZhcmdzLT50cmFucywgYXJncy0+Zmxpc3QsCisJCQkJCQkqYXJncy0+Zmlyc3RibG9jaywgJmNvbW1pdHRlZCk7CisJCX0KKwkJaWYgKGVycm9yKSB7CisJCQlBU1NFUlQoY29tbWl0dGVkKTsKKwkJCWFyZ3MtPnRyYW5zID0gTlVMTDsKKwkJCXhmc19ibWFwX2NhbmNlbChhcmdzLT5mbGlzdCk7CisJCQlyZXR1cm4oZXJyb3IpOworCQl9CisKKwkJLyoKKwkJICogYm1hcF9maW5pc2goKSBtYXkgaGF2ZSBjb21taXR0ZWQgdGhlIGxhc3QgdHJhbnMgYW5kIHN0YXJ0ZWQKKwkJICogYSBuZXcgb25lLiAgV2UgbmVlZCB0aGUgaW5vZGUgdG8gYmUgaW4gYWxsIHRyYW5zYWN0aW9ucy4KKwkJICovCisJCWlmIChjb21taXR0ZWQpIHsKKwkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIFhGU19JTE9DS19FWENMKTsKKwkJCXhmc190cmFuc19paG9sZChhcmdzLT50cmFucywgZHApOworCQl9CisKKwkJLyoKKwkJICogQ29tbWl0IHRoZSBjdXJyZW50IHRyYW5zIChpbmNsdWRpbmcgdGhlIGlub2RlKSBhbmQgc3RhcnQKKwkJICogYSBuZXcgb25lLgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19hdHRyX3JvbGx0cmFucygmYXJncy0+dHJhbnMsIGRwKSkpCisJCQlyZXR1cm4gKGVycm9yKTsKKworCQkvKgorCQkgKiBGb2IgdGhlIHdob2xlIHJlc3Qgb2YgdGhlIHByb2JsZW0gb2ZmIG9uIHRoZSBCdHJlZSBjb2RlLgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfYXR0cl9ub2RlX2FkZG5hbWUoYXJncyk7CisJCXJldHVybihlcnJvcik7CisJfQorCisJLyoKKwkgKiBDb21taXQgdGhlIHRyYW5zYWN0aW9uIHRoYXQgYWRkZWQgdGhlIGF0dHIgbmFtZSBzbyB0aGF0CisJICogbGF0ZXIgcm91dGluZXMgY2FuIG1hbmFnZSB0aGVpciBvd24gdHJhbnNhY3Rpb25zLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfYXR0cl9yb2xsdHJhbnMoJmFyZ3MtPnRyYW5zLCBkcCkpKQorCQlyZXR1cm4gKGVycm9yKTsKKworCS8qCisJICogSWYgdGhlcmUgd2FzIGFuIG91dC1vZi1saW5lIHZhbHVlLCBhbGxvY2F0ZSB0aGUgYmxvY2tzIHdlCisJICogaWRlbnRpZmllZCBmb3IgaXRzIHN0b3JhZ2UgYW5kIGNvcHkgdGhlIHZhbHVlLiAgVGhpcyBpcyBkb25lCisJICogYWZ0ZXIgd2UgY3JlYXRlIHRoZSBhdHRyaWJ1dGUgc28gdGhhdCB3ZSBkb24ndCBvdmVyZmxvdyB0aGUKKwkgKiBtYXhpbXVtIHNpemUgb2YgYSB0cmFuc2FjdGlvbiBhbmQvb3IgaGl0IGEgZGVhZGxvY2suCisJICovCisJaWYgKGFyZ3MtPnJtdGJsa25vID4gMCkgeworCQllcnJvciA9IHhmc19hdHRyX3JtdHZhbF9zZXQoYXJncyk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybihlcnJvcik7CisJfQorCisJLyoKKwkgKiBJZiB0aGlzIGlzIGFuIGF0b21pYyByZW5hbWUgb3BlcmF0aW9uLCB3ZSBtdXN0ICJmbGlwIiB0aGUKKwkgKiBpbmNvbXBsZXRlIGZsYWdzIG9uIHRoZSAibmV3IiBhbmQgIm9sZCIgYXR0cmlidXRlL3ZhbHVlIHBhaXJzCisJICogc28gdGhhdCBvbmUgZGlzYXBwZWFycyBhbmQgb25lIGFwcGVhcnMgYXRvbWljYWxseS4gIFRoZW4gd2UKKwkgKiBtdXN0IHJlbW92ZSB0aGUgIm9sZCIgYXR0cmlidXRlL3ZhbHVlIHBhaXIuCisJICovCisJaWYgKGFyZ3MtPnJlbmFtZSkgeworCQkvKgorCQkgKiBJbiBhIHNlcGFyYXRlIHRyYW5zYWN0aW9uLCBzZXQgdGhlIGluY29tcGxldGUgZmxhZyBvbiB0aGUKKwkJICogIm9sZCIgYXR0ciBhbmQgY2xlYXIgdGhlIGluY29tcGxldGUgZmxhZyBvbiB0aGUgIm5ldyIgYXR0ci4KKwkJICovCisJCWVycm9yID0geGZzX2F0dHJfbGVhZl9mbGlwZmxhZ3MoYXJncyk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybihlcnJvcik7CisKKwkJLyoKKwkJICogRGlzbWFudGxlIHRoZSAib2xkIiBhdHRyaWJ1dGUvdmFsdWUgcGFpciBieSByZW1vdmluZworCQkgKiBhICJyZW1vdGUiIHZhbHVlIChpZiBpdCBleGlzdHMpLgorCQkgKi8KKwkJYXJncy0+aW5kZXggPSBhcmdzLT5pbmRleDI7CisJCWFyZ3MtPmJsa25vID0gYXJncy0+Ymxrbm8yOworCQlhcmdzLT5ybXRibGtubyA9IGFyZ3MtPnJtdGJsa25vMjsKKwkJYXJncy0+cm10YmxrY250ID0gYXJncy0+cm10YmxrY250MjsKKwkJaWYgKGFyZ3MtPnJtdGJsa25vKSB7CisJCQllcnJvciA9IHhmc19hdHRyX3JtdHZhbF9yZW1vdmUoYXJncyk7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuKGVycm9yKTsKKwkJfQorCisJCS8qCisJCSAqIFJlYWQgaW4gdGhlIGJsb2NrIGNvbnRhaW5pbmcgdGhlICJvbGQiIGF0dHIsIHRoZW4KKwkJICogcmVtb3ZlIHRoZSAib2xkIiBhdHRyIGZyb20gdGhhdCBibG9jayAobmVhdCwgaHVoISkKKwkJICovCisJCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgYXJncy0+Ymxrbm8sIC0xLAorCQkJCQkJICAgICAmYnAsIFhGU19BVFRSX0ZPUkspOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4oZXJyb3IpOworCQlBU1NFUlQoYnAgIT0gTlVMTCk7CisJCSh2b2lkKXhmc19hdHRyX2xlYWZfcmVtb3ZlKGJwLCBhcmdzKTsKKworCQkvKgorCQkgKiBJZiB0aGUgcmVzdWx0IGlzIHNtYWxsIGVub3VnaCwgc2hyaW5rIGl0IGFsbCBpbnRvIHRoZSBpbm9kZS4KKwkJICovCisJCWlmICh4ZnNfYXR0cl9zaG9ydGZvcm1fYWxsZml0KGJwLCBkcCkpIHsKKwkJCVhGU19CTUFQX0lOSVQoYXJncy0+Zmxpc3QsIGFyZ3MtPmZpcnN0YmxvY2spOworCQkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX3RvX3Nob3J0Zm9ybShicCwgYXJncyk7CisJCQkvKiBicCBpcyBnb25lIGR1ZSB0byB4ZnNfZGFfc2hyaW5rX2lub2RlICovCisJCQlpZiAoIWVycm9yKSB7CisJCQkJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJmFyZ3MtPnRyYW5zLAorCQkJCQkJCWFyZ3MtPmZsaXN0LAorCQkJCQkJCSphcmdzLT5maXJzdGJsb2NrLAorCQkJCQkJCSZjb21taXR0ZWQpOworCQkJfQorCQkJaWYgKGVycm9yKSB7CisJCQkJQVNTRVJUKGNvbW1pdHRlZCk7CisJCQkJYXJncy0+dHJhbnMgPSBOVUxMOworCQkJCXhmc19ibWFwX2NhbmNlbChhcmdzLT5mbGlzdCk7CisJCQkJcmV0dXJuKGVycm9yKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIGJtYXBfZmluaXNoKCkgbWF5IGhhdmUgY29tbWl0dGVkIHRoZSBsYXN0IHRyYW5zCisJCQkgKiBhbmQgc3RhcnRlZCBhIG5ldyBvbmUuICBXZSBuZWVkIHRoZSBpbm9kZSB0byBiZQorCQkJICogaW4gYWxsIHRyYW5zYWN0aW9ucy4KKwkJCSAqLworCQkJaWYgKGNvbW1pdHRlZCkgeworCQkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIFhGU19JTE9DS19FWENMKTsKKwkJCQl4ZnNfdHJhbnNfaWhvbGQoYXJncy0+dHJhbnMsIGRwKTsKKwkJCX0KKwkJfSBlbHNlCisJCQl4ZnNfZGFfYnVmX2RvbmUoYnApOworCisJCS8qCisJCSAqIENvbW1pdCB0aGUgcmVtb3ZlIGFuZCBzdGFydCB0aGUgbmV4dCB0cmFucyBpbiBzZXJpZXMuCisJCSAqLworCQllcnJvciA9IHhmc19hdHRyX3JvbGx0cmFucygmYXJncy0+dHJhbnMsIGRwKTsKKworCX0gZWxzZSBpZiAoYXJncy0+cm10Ymxrbm8gPiAwKSB7CisJCS8qCisJCSAqIEFkZGVkIGEgInJlbW90ZSIgdmFsdWUsIGp1c3QgY2xlYXIgdGhlIGluY29tcGxldGUgZmxhZy4KKwkJICovCisJCWVycm9yID0geGZzX2F0dHJfbGVhZl9jbGVhcmZsYWcoYXJncyk7CisJfQorCXJldHVybihlcnJvcik7Cit9CisKKy8qCisgKiBSZW1vdmUgYSBuYW1lIGZyb20gdGhlIGxlYWYgYXR0cmlidXRlIGxpc3Qgc3RydWN0dXJlCisgKgorICogVGhpcyBsZWFmIGJsb2NrIGNhbm5vdCBoYXZlIGEgInJlbW90ZSIgdmFsdWUsIHdlIG9ubHkgY2FsbCB0aGlzIHJvdXRpbmUKKyAqIGlmIGJtYXBfb25lX2Jsb2NrKCkgc2F5cyB0aGVyZSBpcyBvbmx5IG9uZSBibG9jayAoaWU6IG5vIHJlbW90ZSBibGtzKS4KKyAqLworU1RBVElDIGludAoreGZzX2F0dHJfbGVhZl9yZW1vdmVuYW1lKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2lub2RlX3QgKmRwOworCXhmc19kYWJ1Zl90ICpicDsKKwlpbnQgY29tbWl0dGVkOworCWludCBlcnJvcjsKKworCS8qCisJICogUmVtb3ZlIHRoZSBhdHRyaWJ1dGUuCisJICovCisJZHAgPSBhcmdzLT5kcDsKKwlhcmdzLT5ibGtubyA9IDA7CisJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCBhcmdzLT5ibGtubywgLTEsICZicCwKKwkJCQkJICAgICBYRlNfQVRUUl9GT1JLKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuKGVycm9yKTsKKwl9CisKKwlBU1NFUlQoYnAgIT0gTlVMTCk7CisJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX2xvb2t1cF9pbnQoYnAsIGFyZ3MpOworCWlmIChlcnJvciA9PSBFTk9BVFRSKSB7CisJCXhmc19kYV9icmVsc2UoYXJncy0+dHJhbnMsIGJwKTsKKwkJcmV0dXJuKGVycm9yKTsKKwl9CisKKwkodm9pZCl4ZnNfYXR0cl9sZWFmX3JlbW92ZShicCwgYXJncyk7CisKKwkvKgorCSAqIElmIHRoZSByZXN1bHQgaXMgc21hbGwgZW5vdWdoLCBzaHJpbmsgaXQgYWxsIGludG8gdGhlIGlub2RlLgorCSAqLworCWlmICh4ZnNfYXR0cl9zaG9ydGZvcm1fYWxsZml0KGJwLCBkcCkpIHsKKwkJWEZTX0JNQVBfSU5JVChhcmdzLT5mbGlzdCwgYXJncy0+Zmlyc3RibG9jayk7CisJCWVycm9yID0geGZzX2F0dHJfbGVhZl90b19zaG9ydGZvcm0oYnAsIGFyZ3MpOworCQkvKiBicCBpcyBnb25lIGR1ZSB0byB4ZnNfZGFfc2hyaW5rX2lub2RlICovCisJCWlmICghZXJyb3IpIHsKKwkJCWVycm9yID0geGZzX2JtYXBfZmluaXNoKCZhcmdzLT50cmFucywgYXJncy0+Zmxpc3QsCisJCQkJCQkqYXJncy0+Zmlyc3RibG9jaywgJmNvbW1pdHRlZCk7CisJCX0KKwkJaWYgKGVycm9yKSB7CisJCQlBU1NFUlQoY29tbWl0dGVkKTsKKwkJCWFyZ3MtPnRyYW5zID0gTlVMTDsKKwkJCXhmc19ibWFwX2NhbmNlbChhcmdzLT5mbGlzdCk7CisJCQlyZXR1cm4oZXJyb3IpOworCQl9CisKKwkJLyoKKwkJICogYm1hcF9maW5pc2goKSBtYXkgaGF2ZSBjb21taXR0ZWQgdGhlIGxhc3QgdHJhbnMgYW5kIHN0YXJ0ZWQKKwkJICogYSBuZXcgb25lLiAgV2UgbmVlZCB0aGUgaW5vZGUgdG8gYmUgaW4gYWxsIHRyYW5zYWN0aW9ucy4KKwkJICovCisJCWlmIChjb21taXR0ZWQpIHsKKwkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIFhGU19JTE9DS19FWENMKTsKKwkJCXhmc190cmFuc19paG9sZChhcmdzLT50cmFucywgZHApOworCQl9CisJfSBlbHNlCisJCXhmc19kYV9idWZfZG9uZShicCk7CisJcmV0dXJuKDApOworfQorCisvKgorICogTG9vayB1cCBhIG5hbWUgaW4gYSBsZWFmIGF0dHJpYnV0ZSBsaXN0IHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIGxlYWYgYmxvY2sgY2Fubm90IGhhdmUgYSAicmVtb3RlIiB2YWx1ZSwgd2Ugb25seSBjYWxsIHRoaXMgcm91dGluZQorICogaWYgYm1hcF9vbmVfYmxvY2soKSBzYXlzIHRoZXJlIGlzIG9ubHkgb25lIGJsb2NrIChpZTogbm8gcmVtb3RlIGJsa3MpLgorICovCitpbnQKK3hmc19hdHRyX2xlYWZfZ2V0KHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2RhYnVmX3QgKmJwOworCWludCBlcnJvcjsKKworCWFyZ3MtPmJsa25vID0gMDsKKwllcnJvciA9IHhmc19kYV9yZWFkX2J1ZihhcmdzLT50cmFucywgYXJncy0+ZHAsIGFyZ3MtPmJsa25vLCAtMSwgJmJwLAorCQkJCQkgICAgIFhGU19BVFRSX0ZPUkspOworCWlmIChlcnJvcikKKwkJcmV0dXJuKGVycm9yKTsKKwlBU1NFUlQoYnAgIT0gTlVMTCk7CisKKwllcnJvciA9IHhmc19hdHRyX2xlYWZfbG9va3VwX2ludChicCwgYXJncyk7CisJaWYgKGVycm9yICE9IEVFWElTVCkgIHsKKwkJeGZzX2RhX2JyZWxzZShhcmdzLT50cmFucywgYnApOworCQlyZXR1cm4oZXJyb3IpOworCX0KKwllcnJvciA9IHhmc19hdHRyX2xlYWZfZ2V0dmFsdWUoYnAsIGFyZ3MpOworCXhmc19kYV9icmVsc2UoYXJncy0+dHJhbnMsIGJwKTsKKwlpZiAoIWVycm9yICYmIChhcmdzLT5ybXRibGtubyA+IDApICYmICEoYXJncy0+ZmxhZ3MgJiBBVFRSX0tFUk5PVkFMKSkgeworCQllcnJvciA9IHhmc19hdHRyX3JtdHZhbF9nZXQoYXJncyk7CisJfQorCXJldHVybihlcnJvcik7Cit9CisKKy8qCisgKiBDb3B5IG91dCBhdHRyaWJ1dGUgZW50cmllcyBmb3IgYXR0cl9saXN0KCksIGZvciBsZWFmIGF0dHJpYnV0ZSBsaXN0cy4KKyAqLworU1RBVElDIGludAoreGZzX2F0dHJfbGVhZl9saXN0KHhmc19hdHRyX2xpc3RfY29udGV4dF90ICpjb250ZXh0KQoreworCXhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmOworCWludCBlcnJvcjsKKwl4ZnNfZGFidWZfdCAqYnA7CisKKwljb250ZXh0LT5jdXJzb3ItPmJsa25vID0gMDsKKwllcnJvciA9IHhmc19kYV9yZWFkX2J1ZihOVUxMLCBjb250ZXh0LT5kcCwgMCwgLTEsICZicCwgWEZTX0FUVFJfRk9SSyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4oZXJyb3IpOworCUFTU0VSVChicCAhPSBOVUxMKTsKKwlsZWFmID0gYnAtPmRhdGE7CisJaWYgKHVubGlrZWx5KElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCSE9IFhGU19BVFRSX0xFQUZfTUFHSUMpKSB7CisJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfYXR0cl9sZWFmX2xpc3QiLCBYRlNfRVJSTEVWRUxfTE9XLAorCQkJCSAgICAgY29udGV4dC0+ZHAtPmlfbW91bnQsIGxlYWYpOworCQl4ZnNfZGFfYnJlbHNlKE5VTEwsIGJwKTsKKwkJcmV0dXJuKFhGU19FUlJPUihFRlNDT1JSVVBURUQpKTsKKwl9CisKKwkodm9pZCl4ZnNfYXR0cl9sZWFmX2xpc3RfaW50KGJwLCBjb250ZXh0KTsKKwl4ZnNfZGFfYnJlbHNlKE5VTEwsIGJwKTsKKwlyZXR1cm4oMCk7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEV4dGVybmFsIHJvdXRpbmVzIHdoZW4gYXR0cmlidXRlIGxpc3Qgc2l6ZSA+IFhGU19MQlNJWkUobXApLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogQWRkIGEgbmFtZSB0byBhIEJ0cmVlLWZvcm1hdCBhdHRyaWJ1dGUgbGlzdC4KKyAqCisgKiBUaGlzIHdpbGwgaW52b2x2ZSB3YWxraW5nIGRvd24gdGhlIEJ0cmVlLCBhbmQgbWF5IGludm9sdmUgc3BsaXR0aW5nCisgKiBsZWFmIG5vZGVzIGFuZCBldmVuIHNwbGl0dGluZyBpbnRlcm1lZGlhdGUgbm9kZXMgdXAgdG8gYW5kIGluY2x1ZGluZworICogdGhlIHJvb3Qgbm9kZSAoYSBzcGVjaWFsIGNhc2Ugb2YgYW4gaW50ZXJtZWRpYXRlIG5vZGUpLgorICoKKyAqICJSZW1vdGUiIGF0dHJpYnV0ZSB2YWx1ZXMgY29uZnVzZSB0aGUgaXNzdWUgYW5kIGF0b21pYyByZW5hbWUgb3BlcmF0aW9ucworICogYWRkIGEgd2hvbGUgZXh0cmEgbGF5ZXIgb2YgY29uZnVzaW9uIG9uIHRvcCBvZiB0aGF0LgorICovCitTVEFUSUMgaW50Cit4ZnNfYXR0cl9ub2RlX2FkZG5hbWUoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwl4ZnNfZGFfc3RhdGVfdCAqc3RhdGU7CisJeGZzX2RhX3N0YXRlX2Jsa190ICpibGs7CisJeGZzX2lub2RlX3QgKmRwOworCXhmc19tb3VudF90ICptcDsKKwlpbnQgY29tbWl0dGVkLCByZXR2YWwsIGVycm9yOworCisJLyoKKwkgKiBGaWxsIGluIGJ1Y2tldCBvZiBhcmd1bWVudHMvcmVzdWx0cy9jb250ZXh0IHRvIGNhcnJ5IGFyb3VuZC4KKwkgKi8KKwlkcCA9IGFyZ3MtPmRwOworCW1wID0gZHAtPmlfbW91bnQ7CityZXN0YXJ0OgorCXN0YXRlID0geGZzX2RhX3N0YXRlX2FsbG9jKCk7CisJc3RhdGUtPmFyZ3MgPSBhcmdzOworCXN0YXRlLT5tcCA9IG1wOworCXN0YXRlLT5ibG9ja3NpemUgPSBzdGF0ZS0+bXAtPm1fc2Iuc2JfYmxvY2tzaXplOworCXN0YXRlLT5ub2RlX2VudHMgPSBzdGF0ZS0+bXAtPm1fYXR0cl9ub2RlX2VudHM7CisKKwkvKgorCSAqIFNlYXJjaCB0byBzZWUgaWYgbmFtZSBhbHJlYWR5IGV4aXN0cywgYW5kIGdldCBiYWNrIGEgcG9pbnRlcgorCSAqIHRvIHdoZXJlIGl0IHNob3VsZCBnby4KKwkgKi8KKwllcnJvciA9IHhmc19kYV9ub2RlX2xvb2t1cF9pbnQoc3RhdGUsICZyZXR2YWwpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisJYmxrID0gJnN0YXRlLT5wYXRoLmJsa1sgc3RhdGUtPnBhdGguYWN0aXZlLTEgXTsKKwlBU1NFUlQoYmxrLT5tYWdpYyA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlpZiAoKGFyZ3MtPmZsYWdzICYgQVRUUl9SRVBMQUNFKSAmJiAocmV0dmFsID09IEVOT0FUVFIpKSB7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAocmV0dmFsID09IEVFWElTVCkgeworCQlpZiAoYXJncy0+ZmxhZ3MgJiBBVFRSX0NSRUFURSkKKwkJCWdvdG8gb3V0OworCQlhcmdzLT5yZW5hbWUgPSAxOwkJCS8qIGF0b21pYyByZW5hbWUgb3AgKi8KKwkJYXJncy0+Ymxrbm8yID0gYXJncy0+Ymxrbm87CQkvKiBzZXQgMm5kIGVudHJ5IGluZm8qLworCQlhcmdzLT5pbmRleDIgPSBhcmdzLT5pbmRleDsKKwkJYXJncy0+cm10Ymxrbm8yID0gYXJncy0+cm10Ymxrbm87CisJCWFyZ3MtPnJtdGJsa2NudDIgPSBhcmdzLT5ybXRibGtjbnQ7CisJCWFyZ3MtPnJtdGJsa25vID0gMDsKKwkJYXJncy0+cm10YmxrY250ID0gMDsKKwl9CisKKwlyZXR2YWwgPSB4ZnNfYXR0cl9sZWFmX2FkZChibGstPmJwLCBzdGF0ZS0+YXJncyk7CisJaWYgKHJldHZhbCA9PSBFTk9TUEMpIHsKKwkJaWYgKHN0YXRlLT5wYXRoLmFjdGl2ZSA9PSAxKSB7CisJCQkvKgorCQkJICogSXRzIHJlYWxseSBhIHNpbmdsZSBsZWFmIG5vZGUsIGJ1dCBpdCBoYWQKKwkJCSAqIG91dC1vZi1saW5lIHZhbHVlcyBzbyBpdCBsb29rZWQgbGlrZSBpdCAqbWlnaHQqCisJCQkgKiBoYXZlIGJlZW4gYSBiLXRyZWUuCisJCQkgKi8KKwkJCXhmc19kYV9zdGF0ZV9mcmVlKHN0YXRlKTsKKwkJCVhGU19CTUFQX0lOSVQoYXJncy0+Zmxpc3QsIGFyZ3MtPmZpcnN0YmxvY2spOworCQkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX3RvX25vZGUoYXJncyk7CisJCQlpZiAoIWVycm9yKSB7CisJCQkJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJmFyZ3MtPnRyYW5zLAorCQkJCQkJCWFyZ3MtPmZsaXN0LAorCQkJCQkJCSphcmdzLT5maXJzdGJsb2NrLAorCQkJCQkJCSZjb21taXR0ZWQpOworCQkJfQorCQkJaWYgKGVycm9yKSB7CisJCQkJQVNTRVJUKGNvbW1pdHRlZCk7CisJCQkJYXJncy0+dHJhbnMgPSBOVUxMOworCQkJCXhmc19ibWFwX2NhbmNlbChhcmdzLT5mbGlzdCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCS8qCisJCQkgKiBibWFwX2ZpbmlzaCgpIG1heSBoYXZlIGNvbW1pdHRlZCB0aGUgbGFzdCB0cmFucworCQkJICogYW5kIHN0YXJ0ZWQgYSBuZXcgb25lLiAgV2UgbmVlZCB0aGUgaW5vZGUgdG8gYmUKKwkJCSAqIGluIGFsbCB0cmFuc2FjdGlvbnMuCisJCQkgKi8KKwkJCWlmIChjb21taXR0ZWQpIHsKKwkJCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCQkJeGZzX3RyYW5zX2lob2xkKGFyZ3MtPnRyYW5zLCBkcCk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBDb21taXQgdGhlIG5vZGUgY29udmVyc2lvbiBhbmQgc3RhcnQgdGhlIG5leHQKKwkJCSAqIHRyYW5zIGluIHRoZSBjaGFpbi4KKwkJCSAqLworCQkJaWYgKChlcnJvciA9IHhmc19hdHRyX3JvbGx0cmFucygmYXJncy0+dHJhbnMsIGRwKSkpCisJCQkJZ290byBvdXQ7CisKKwkJCWdvdG8gcmVzdGFydDsKKwkJfQorCisJCS8qCisJCSAqIFNwbGl0IGFzIG1hbnkgQnRyZWUgZWxlbWVudHMgYXMgcmVxdWlyZWQuCisJCSAqIFRoaXMgY29kZSB0cmFja3MgdGhlIG5ldyBhbmQgb2xkIGF0dHIncyBsb2NhdGlvbgorCQkgKiBpbiB0aGUgaW5kZXgvYmxrbm8vcm10Ymxrbm8vcm10YmxrY250IGZpZWxkcyBhbmQKKwkJICogaW4gdGhlIGluZGV4Mi9ibGtubzIvcm10Ymxrbm8yL3JtdGJsa2NudDIgZmllbGRzLgorCQkgKi8KKwkJWEZTX0JNQVBfSU5JVChhcmdzLT5mbGlzdCwgYXJncy0+Zmlyc3RibG9jayk7CisJCWVycm9yID0geGZzX2RhX3NwbGl0KHN0YXRlKTsKKwkJaWYgKCFlcnJvcikgeworCQkJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJmFyZ3MtPnRyYW5zLCBhcmdzLT5mbGlzdCwKKwkJCQkJCSphcmdzLT5maXJzdGJsb2NrLCAmY29tbWl0dGVkKTsKKwkJfQorCQlpZiAoZXJyb3IpIHsKKwkJCUFTU0VSVChjb21taXR0ZWQpOworCQkJYXJncy0+dHJhbnMgPSBOVUxMOworCQkJeGZzX2JtYXBfY2FuY2VsKGFyZ3MtPmZsaXN0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogYm1hcF9maW5pc2goKSBtYXkgaGF2ZSBjb21taXR0ZWQgdGhlIGxhc3QgdHJhbnMgYW5kIHN0YXJ0ZWQKKwkJICogYSBuZXcgb25lLiAgV2UgbmVlZCB0aGUgaW5vZGUgdG8gYmUgaW4gYWxsIHRyYW5zYWN0aW9ucy4KKwkJICovCisJCWlmIChjb21taXR0ZWQpIHsKKwkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIFhGU19JTE9DS19FWENMKTsKKwkJCXhmc190cmFuc19paG9sZChhcmdzLT50cmFucywgZHApOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQWRkaXRpb24gc3VjY2VlZGVkLCB1cGRhdGUgQnRyZWUgaGFzaHZhbHMuCisJCSAqLworCQl4ZnNfZGFfZml4aGFzaHBhdGgoc3RhdGUsICZzdGF0ZS0+cGF0aCk7CisJfQorCisJLyoKKwkgKiBLaWxsIHRoZSBzdGF0ZSBzdHJ1Y3R1cmUsIHdlJ3JlIGRvbmUgd2l0aCBpdCBhbmQgbmVlZCB0bworCSAqIGFsbG93IHRoZSBidWZmZXJzIHRvIGNvbWUgYmFjayBsYXRlci4KKwkgKi8KKwl4ZnNfZGFfc3RhdGVfZnJlZShzdGF0ZSk7CisJc3RhdGUgPSBOVUxMOworCisJLyoKKwkgKiBDb21taXQgdGhlIGxlYWYgYWRkaXRpb24gb3IgYnRyZWUgc3BsaXQgYW5kIHN0YXJ0IHRoZSBuZXh0CisJICogdHJhbnMgaW4gdGhlIGNoYWluLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfYXR0cl9yb2xsdHJhbnMoJmFyZ3MtPnRyYW5zLCBkcCkpKQorCQlnb3RvIG91dDsKKworCS8qCisJICogSWYgdGhlcmUgd2FzIGFuIG91dC1vZi1saW5lIHZhbHVlLCBhbGxvY2F0ZSB0aGUgYmxvY2tzIHdlCisJICogaWRlbnRpZmllZCBmb3IgaXRzIHN0b3JhZ2UgYW5kIGNvcHkgdGhlIHZhbHVlLiAgVGhpcyBpcyBkb25lCisJICogYWZ0ZXIgd2UgY3JlYXRlIHRoZSBhdHRyaWJ1dGUgc28gdGhhdCB3ZSBkb24ndCBvdmVyZmxvdyB0aGUKKwkgKiBtYXhpbXVtIHNpemUgb2YgYSB0cmFuc2FjdGlvbiBhbmQvb3IgaGl0IGEgZGVhZGxvY2suCisJICovCisJaWYgKGFyZ3MtPnJtdGJsa25vID4gMCkgeworCQllcnJvciA9IHhmc19hdHRyX3JtdHZhbF9zZXQoYXJncyk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybihlcnJvcik7CisJfQorCisJLyoKKwkgKiBJZiB0aGlzIGlzIGFuIGF0b21pYyByZW5hbWUgb3BlcmF0aW9uLCB3ZSBtdXN0ICJmbGlwIiB0aGUKKwkgKiBpbmNvbXBsZXRlIGZsYWdzIG9uIHRoZSAibmV3IiBhbmQgIm9sZCIgYXR0cmlidXRlL3ZhbHVlIHBhaXJzCisJICogc28gdGhhdCBvbmUgZGlzYXBwZWFycyBhbmQgb25lIGFwcGVhcnMgYXRvbWljYWxseS4gIFRoZW4gd2UKKwkgKiBtdXN0IHJlbW92ZSB0aGUgIm9sZCIgYXR0cmlidXRlL3ZhbHVlIHBhaXIuCisJICovCisJaWYgKGFyZ3MtPnJlbmFtZSkgeworCQkvKgorCQkgKiBJbiBhIHNlcGFyYXRlIHRyYW5zYWN0aW9uLCBzZXQgdGhlIGluY29tcGxldGUgZmxhZyBvbiB0aGUKKwkJICogIm9sZCIgYXR0ciBhbmQgY2xlYXIgdGhlIGluY29tcGxldGUgZmxhZyBvbiB0aGUgIm5ldyIgYXR0ci4KKwkJICovCisJCWVycm9yID0geGZzX2F0dHJfbGVhZl9mbGlwZmxhZ3MoYXJncyk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCisJCS8qCisJCSAqIERpc21hbnRsZSB0aGUgIm9sZCIgYXR0cmlidXRlL3ZhbHVlIHBhaXIgYnkgcmVtb3ZpbmcKKwkJICogYSAicmVtb3RlIiB2YWx1ZSAoaWYgaXQgZXhpc3RzKS4KKwkJICovCisJCWFyZ3MtPmluZGV4ID0gYXJncy0+aW5kZXgyOworCQlhcmdzLT5ibGtubyA9IGFyZ3MtPmJsa25vMjsKKwkJYXJncy0+cm10Ymxrbm8gPSBhcmdzLT5ybXRibGtubzI7CisJCWFyZ3MtPnJtdGJsa2NudCA9IGFyZ3MtPnJtdGJsa2NudDI7CisJCWlmIChhcmdzLT5ybXRibGtubykgeworCQkJZXJyb3IgPSB4ZnNfYXR0cl9ybXR2YWxfcmVtb3ZlKGFyZ3MpOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybihlcnJvcik7CisJCX0KKworCQkvKgorCQkgKiBSZS1maW5kIHRoZSAib2xkIiBhdHRyaWJ1dGUgZW50cnkgYWZ0ZXIgYW55IHNwbGl0IG9wcy4KKwkJICogVGhlIElOQ09NUExFVEUgZmxhZyBtZWFucyB0aGF0IHdlIHdpbGwgZmluZCB0aGUgIm9sZCIKKwkJICogYXR0ciwgbm90IHRoZSAibmV3IiBvbmUuCisJCSAqLworCQlhcmdzLT5mbGFncyB8PSBYRlNfQVRUUl9JTkNPTVBMRVRFOworCQlzdGF0ZSA9IHhmc19kYV9zdGF0ZV9hbGxvYygpOworCQlzdGF0ZS0+YXJncyA9IGFyZ3M7CisJCXN0YXRlLT5tcCA9IG1wOworCQlzdGF0ZS0+YmxvY2tzaXplID0gc3RhdGUtPm1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZTsKKwkJc3RhdGUtPm5vZGVfZW50cyA9IHN0YXRlLT5tcC0+bV9hdHRyX25vZGVfZW50czsKKwkJc3RhdGUtPmlubGVhZiA9IDA7CisJCWVycm9yID0geGZzX2RhX25vZGVfbG9va3VwX2ludChzdGF0ZSwgJnJldHZhbCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCisJCS8qCisJCSAqIFJlbW92ZSB0aGUgbmFtZSBhbmQgdXBkYXRlIHRoZSBoYXNodmFscyBpbiB0aGUgdHJlZS4KKwkJICovCisJCWJsayA9ICZzdGF0ZS0+cGF0aC5ibGtbIHN0YXRlLT5wYXRoLmFjdGl2ZS0xIF07CisJCUFTU0VSVChibGstPm1hZ2ljID09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCQllcnJvciA9IHhmc19hdHRyX2xlYWZfcmVtb3ZlKGJsay0+YnAsIGFyZ3MpOworCQl4ZnNfZGFfZml4aGFzaHBhdGgoc3RhdGUsICZzdGF0ZS0+cGF0aCk7CisKKwkJLyoKKwkJICogQ2hlY2sgdG8gc2VlIGlmIHRoZSB0cmVlIG5lZWRzIHRvIGJlIGNvbGxhcHNlZC4KKwkJICovCisJCWlmIChyZXR2YWwgJiYgKHN0YXRlLT5wYXRoLmFjdGl2ZSA+IDEpKSB7CisJCQlYRlNfQk1BUF9JTklUKGFyZ3MtPmZsaXN0LCBhcmdzLT5maXJzdGJsb2NrKTsKKwkJCWVycm9yID0geGZzX2RhX2pvaW4oc3RhdGUpOworCQkJaWYgKCFlcnJvcikgeworCQkJCWVycm9yID0geGZzX2JtYXBfZmluaXNoKCZhcmdzLT50cmFucywKKwkJCQkJCQlhcmdzLT5mbGlzdCwKKwkJCQkJCQkqYXJncy0+Zmlyc3RibG9jaywKKwkJCQkJCQkmY29tbWl0dGVkKTsKKwkJCX0KKwkJCWlmIChlcnJvcikgeworCQkJCUFTU0VSVChjb21taXR0ZWQpOworCQkJCWFyZ3MtPnRyYW5zID0gTlVMTDsKKwkJCQl4ZnNfYm1hcF9jYW5jZWwoYXJncy0+Zmxpc3QpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQkvKgorCQkJICogYm1hcF9maW5pc2goKSBtYXkgaGF2ZSBjb21taXR0ZWQgdGhlIGxhc3QgdHJhbnMKKwkJCSAqIGFuZCBzdGFydGVkIGEgbmV3IG9uZS4gIFdlIG5lZWQgdGhlIGlub2RlIHRvIGJlCisJCQkgKiBpbiBhbGwgdHJhbnNhY3Rpb25zLgorCQkJICovCisJCQlpZiAoY29tbWl0dGVkKSB7CisJCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJCXhmc190cmFuc19paG9sZChhcmdzLT50cmFucywgZHApOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogQ29tbWl0IGFuZCBzdGFydCB0aGUgbmV4dCB0cmFucyBpbiB0aGUgY2hhaW4uCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX2F0dHJfcm9sbHRyYW5zKCZhcmdzLT50cmFucywgZHApKSkKKwkJCWdvdG8gb3V0OworCisJfSBlbHNlIGlmIChhcmdzLT5ybXRibGtubyA+IDApIHsKKwkJLyoKKwkJICogQWRkZWQgYSAicmVtb3RlIiB2YWx1ZSwganVzdCBjbGVhciB0aGUgaW5jb21wbGV0ZSBmbGFnLgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX2NsZWFyZmxhZyhhcmdzKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJfQorCXJldHZhbCA9IGVycm9yID0gMDsKKworb3V0OgorCWlmIChzdGF0ZSkKKwkJeGZzX2RhX3N0YXRlX2ZyZWUoc3RhdGUpOworCWlmIChlcnJvcikKKwkJcmV0dXJuKGVycm9yKTsKKwlyZXR1cm4ocmV0dmFsKTsKK30KKworLyoKKyAqIFJlbW92ZSBhIG5hbWUgZnJvbSBhIEItdHJlZSBhdHRyaWJ1dGUgbGlzdC4KKyAqCisgKiBUaGlzIHdpbGwgaW52b2x2ZSB3YWxraW5nIGRvd24gdGhlIEJ0cmVlLCBhbmQgbWF5IGludm9sdmUgam9pbmluZworICogbGVhZiBub2RlcyBhbmQgZXZlbiBqb2luaW5nIGludGVybWVkaWF0ZSBub2RlcyB1cCB0byBhbmQgaW5jbHVkaW5nCisgKiB0aGUgcm9vdCBub2RlIChhIHNwZWNpYWwgY2FzZSBvZiBhbiBpbnRlcm1lZGlhdGUgbm9kZSkuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19hdHRyX25vZGVfcmVtb3ZlbmFtZSh4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19kYV9zdGF0ZV90ICpzdGF0ZTsKKwl4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazsKKwl4ZnNfaW5vZGVfdCAqZHA7CisJeGZzX2RhYnVmX3QgKmJwOworCWludCByZXR2YWwsIGVycm9yLCBjb21taXR0ZWQ7CisKKwkvKgorCSAqIFRpZSBhIHN0cmluZyBhcm91bmQgb3VyIGZpbmdlciB0byByZW1pbmQgdXMgd2hlcmUgd2UgYXJlLgorCSAqLworCWRwID0gYXJncy0+ZHA7CisJc3RhdGUgPSB4ZnNfZGFfc3RhdGVfYWxsb2MoKTsKKwlzdGF0ZS0+YXJncyA9IGFyZ3M7CisJc3RhdGUtPm1wID0gZHAtPmlfbW91bnQ7CisJc3RhdGUtPmJsb2Nrc2l6ZSA9IHN0YXRlLT5tcC0+bV9zYi5zYl9ibG9ja3NpemU7CisJc3RhdGUtPm5vZGVfZW50cyA9IHN0YXRlLT5tcC0+bV9hdHRyX25vZGVfZW50czsKKworCS8qCisJICogU2VhcmNoIHRvIHNlZSBpZiBuYW1lIGV4aXN0cywgYW5kIGdldCBiYWNrIGEgcG9pbnRlciB0byBpdC4KKwkgKi8KKwllcnJvciA9IHhmc19kYV9ub2RlX2xvb2t1cF9pbnQoc3RhdGUsICZyZXR2YWwpOworCWlmIChlcnJvciB8fCAocmV0dmFsICE9IEVFWElTVCkpIHsKKwkJaWYgKGVycm9yID09IDApCisJCQllcnJvciA9IHJldHZhbDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhbiBvdXQtb2YtbGluZSB2YWx1ZSwgZGUtYWxsb2NhdGUgdGhlIGJsb2Nrcy4KKwkgKiBUaGlzIGlzIGRvbmUgYmVmb3JlIHdlIHJlbW92ZSB0aGUgYXR0cmlidXRlIHNvIHRoYXQgd2UgZG9uJ3QKKwkgKiBvdmVyZmxvdyB0aGUgbWF4aW11bSBzaXplIG9mIGEgdHJhbnNhY3Rpb24gYW5kL29yIGhpdCBhIGRlYWRsb2NrLgorCSAqLworCWJsayA9ICZzdGF0ZS0+cGF0aC5ibGtbIHN0YXRlLT5wYXRoLmFjdGl2ZS0xIF07CisJQVNTRVJUKGJsay0+YnAgIT0gTlVMTCk7CisJQVNTRVJUKGJsay0+bWFnaWMgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJaWYgKGFyZ3MtPnJtdGJsa25vID4gMCkgeworCQkvKgorCQkgKiBGaWxsIGluIGRpc2sgYmxvY2sgbnVtYmVycyBpbiB0aGUgc3RhdGUgc3RydWN0dXJlCisJCSAqIHNvIHRoYXQgd2UgY2FuIGdldCB0aGUgYnVmZmVycyBiYWNrIGFmdGVyIHdlIGNvbW1pdAorCQkgKiBzZXZlcmFsIHRyYW5zYWN0aW9ucyBpbiB0aGUgZm9sbG93aW5nIGNhbGxzLgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfYXR0cl9maWxsc3RhdGUoc3RhdGUpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKKworCQkvKgorCQkgKiBNYXJrIHRoZSBhdHRyaWJ1dGUgYXMgSU5DT01QTEVURSwgdGhlbiBidW5tYXBpKCkgdGhlCisJCSAqIHJlbW90ZSB2YWx1ZS4KKwkJICovCisJCWVycm9yID0geGZzX2F0dHJfbGVhZl9zZXRmbGFnKGFyZ3MpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKKwkJZXJyb3IgPSB4ZnNfYXR0cl9ybXR2YWxfcmVtb3ZlKGFyZ3MpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKKworCQkvKgorCQkgKiBSZWZpbGwgdGhlIHN0YXRlIHN0cnVjdHVyZSB3aXRoIGJ1ZmZlcnMsIHRoZSBwcmlvciBjYWxscworCQkgKiByZWxlYXNlZCBvdXIgYnVmZmVycy4KKwkJICovCisJCWVycm9yID0geGZzX2F0dHJfcmVmaWxsc3RhdGUoc3RhdGUpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFJlbW92ZSB0aGUgbmFtZSBhbmQgdXBkYXRlIHRoZSBoYXNodmFscyBpbiB0aGUgdHJlZS4KKwkgKi8KKwlibGsgPSAmc3RhdGUtPnBhdGguYmxrWyBzdGF0ZS0+cGF0aC5hY3RpdmUtMSBdOworCUFTU0VSVChibGstPm1hZ2ljID09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCXJldHZhbCA9IHhmc19hdHRyX2xlYWZfcmVtb3ZlKGJsay0+YnAsIGFyZ3MpOworCXhmc19kYV9maXhoYXNocGF0aChzdGF0ZSwgJnN0YXRlLT5wYXRoKTsKKworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHRoZSB0cmVlIG5lZWRzIHRvIGJlIGNvbGxhcHNlZC4KKwkgKi8KKwlpZiAocmV0dmFsICYmIChzdGF0ZS0+cGF0aC5hY3RpdmUgPiAxKSkgeworCQlYRlNfQk1BUF9JTklUKGFyZ3MtPmZsaXN0LCBhcmdzLT5maXJzdGJsb2NrKTsKKwkJZXJyb3IgPSB4ZnNfZGFfam9pbihzdGF0ZSk7CisJCWlmICghZXJyb3IpIHsKKwkJCWVycm9yID0geGZzX2JtYXBfZmluaXNoKCZhcmdzLT50cmFucywgYXJncy0+Zmxpc3QsCisJCQkJCQkqYXJncy0+Zmlyc3RibG9jaywgJmNvbW1pdHRlZCk7CisJCX0KKwkJaWYgKGVycm9yKSB7CisJCQlBU1NFUlQoY29tbWl0dGVkKTsKKwkJCWFyZ3MtPnRyYW5zID0gTlVMTDsKKwkJCXhmc19ibWFwX2NhbmNlbChhcmdzLT5mbGlzdCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qCisJCSAqIGJtYXBfZmluaXNoKCkgbWF5IGhhdmUgY29tbWl0dGVkIHRoZSBsYXN0IHRyYW5zIGFuZCBzdGFydGVkCisJCSAqIGEgbmV3IG9uZS4gIFdlIG5lZWQgdGhlIGlub2RlIHRvIGJlIGluIGFsbCB0cmFuc2FjdGlvbnMuCisJCSAqLworCQlpZiAoY29tbWl0dGVkKSB7CisJCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCQl4ZnNfdHJhbnNfaWhvbGQoYXJncy0+dHJhbnMsIGRwKTsKKwkJfQorCisJCS8qCisJCSAqIENvbW1pdCB0aGUgQnRyZWUgam9pbiBvcGVyYXRpb24gYW5kIHN0YXJ0IGEgbmV3IHRyYW5zLgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19hdHRyX3JvbGx0cmFucygmYXJncy0+dHJhbnMsIGRwKSkpCisJCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIElmIHRoZSByZXN1bHQgaXMgc21hbGwgZW5vdWdoLCBwdXNoIGl0IGFsbCBpbnRvIHRoZSBpbm9kZS4KKwkgKi8KKwlpZiAoeGZzX2JtYXBfb25lX2Jsb2NrKGRwLCBYRlNfQVRUUl9GT1JLKSkgeworCQkvKgorCQkgKiBIYXZlIHRvIGdldCByaWQgb2YgdGhlIGNvcHkgb2YgdGhpcyBkYWJ1ZiBpbiB0aGUgc3RhdGUuCisJCSAqLworCQlBU1NFUlQoc3RhdGUtPnBhdGguYWN0aXZlID09IDEpOworCQlBU1NFUlQoc3RhdGUtPnBhdGguYmxrWzBdLmJwKTsKKwkJeGZzX2RhX2J1Zl9kb25lKHN0YXRlLT5wYXRoLmJsa1swXS5icCk7CisJCXN0YXRlLT5wYXRoLmJsa1swXS5icCA9IE5VTEw7CisKKwkJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCAwLCAtMSwgJmJwLAorCQkJCQkJICAgICBYRlNfQVRUUl9GT1JLKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJCUFTU0VSVChJTlRfR0VUKCgoeGZzX2F0dHJfbGVhZmJsb2NrX3QgKikKKwkJCQkgICAgICBicC0+ZGF0YSktPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQkgICAgICAgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisKKwkJaWYgKHhmc19hdHRyX3Nob3J0Zm9ybV9hbGxmaXQoYnAsIGRwKSkgeworCQkJWEZTX0JNQVBfSU5JVChhcmdzLT5mbGlzdCwgYXJncy0+Zmlyc3RibG9jayk7CisJCQllcnJvciA9IHhmc19hdHRyX2xlYWZfdG9fc2hvcnRmb3JtKGJwLCBhcmdzKTsKKwkJCS8qIGJwIGlzIGdvbmUgZHVlIHRvIHhmc19kYV9zaHJpbmtfaW5vZGUgKi8KKwkJCWlmICghZXJyb3IpIHsKKwkJCQllcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmYXJncy0+dHJhbnMsCisJCQkJCQkJYXJncy0+Zmxpc3QsCisJCQkJCQkJKmFyZ3MtPmZpcnN0YmxvY2ssCisJCQkJCQkJJmNvbW1pdHRlZCk7CisJCQl9CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlBU1NFUlQoY29tbWl0dGVkKTsKKwkJCQlhcmdzLT50cmFucyA9IE5VTEw7CisJCQkJeGZzX2JtYXBfY2FuY2VsKGFyZ3MtPmZsaXN0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJLyoKKwkJCSAqIGJtYXBfZmluaXNoKCkgbWF5IGhhdmUgY29tbWl0dGVkIHRoZSBsYXN0IHRyYW5zCisJCQkgKiBhbmQgc3RhcnRlZCBhIG5ldyBvbmUuICBXZSBuZWVkIHRoZSBpbm9kZSB0byBiZQorCQkJICogaW4gYWxsIHRyYW5zYWN0aW9ucy4KKwkJCSAqLworCQkJaWYgKGNvbW1pdHRlZCkgeworCQkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIFhGU19JTE9DS19FWENMKTsKKwkJCQl4ZnNfdHJhbnNfaWhvbGQoYXJncy0+dHJhbnMsIGRwKTsKKwkJCX0KKwkJfSBlbHNlCisJCQl4ZnNfZGFfYnJlbHNlKGFyZ3MtPnRyYW5zLCBicCk7CisJfQorCWVycm9yID0gMDsKKworb3V0OgorCXhmc19kYV9zdGF0ZV9mcmVlKHN0YXRlKTsKKwlyZXR1cm4oZXJyb3IpOworfQorCisvKgorICogRmlsbCBpbiB0aGUgZGlzayBibG9jayBudW1iZXJzIGluIHRoZSBzdGF0ZSBzdHJ1Y3R1cmUgZm9yIHRoZSBidWZmZXJzCisgKiB0aGF0IGFyZSBhdHRhY2hlZCB0byB0aGUgc3RhdGUgc3RydWN0dXJlLgorICogVGhpcyBpcyBkb25lIHNvIHRoYXQgd2UgY2FuIHF1aWNrbHkgcmVhdHRhY2ggb3Vyc2VsdmVzIHRvIHRob3NlIGJ1ZmZlcnMKKyAqIGFmdGVyIHNvbWUgc2V0IG9mIHRyYW5zYWN0aW9uIGNvbW1pdCdzIGhhcyByZWxlYXNlZCB0aGVzZSBidWZmZXJzLgorICovCitTVEFUSUMgaW50Cit4ZnNfYXR0cl9maWxsc3RhdGUoeGZzX2RhX3N0YXRlX3QgKnN0YXRlKQoreworCXhmc19kYV9zdGF0ZV9wYXRoX3QgKnBhdGg7CisJeGZzX2RhX3N0YXRlX2Jsa190ICpibGs7CisJaW50IGxldmVsOworCisJLyoKKwkgKiBSb2xsIGRvd24gdGhlICJwYXRoIiBpbiB0aGUgc3RhdGUgc3RydWN0dXJlLCBzdG9yaW5nIHRoZSBvbi1kaXNrCisJICogYmxvY2sgbnVtYmVyIGZvciB0aG9zZSBidWZmZXJzIGluIHRoZSAicGF0aCIuCisJICovCisJcGF0aCA9ICZzdGF0ZS0+cGF0aDsKKwlBU1NFUlQoKHBhdGgtPmFjdGl2ZSA+PSAwKSAmJiAocGF0aC0+YWN0aXZlIDwgWEZTX0RBX05PREVfTUFYREVQVEgpKTsKKwlmb3IgKGJsayA9IHBhdGgtPmJsaywgbGV2ZWwgPSAwOyBsZXZlbCA8IHBhdGgtPmFjdGl2ZTsgYmxrKyssIGxldmVsKyspIHsKKwkJaWYgKGJsay0+YnApIHsKKwkJCWJsay0+ZGlza19ibGtubyA9IHhmc19kYV9ibGtubyhibGstPmJwKTsKKwkJCXhmc19kYV9idWZfZG9uZShibGstPmJwKTsKKwkJCWJsay0+YnAgPSBOVUxMOworCQl9IGVsc2UgeworCQkJYmxrLT5kaXNrX2Jsa25vID0gMDsKKwkJfQorCX0KKworCS8qCisJICogUm9sbCBkb3duIHRoZSAiYWx0cGF0aCIgaW4gdGhlIHN0YXRlIHN0cnVjdHVyZSwgc3RvcmluZyB0aGUgb24tZGlzaworCSAqIGJsb2NrIG51bWJlciBmb3IgdGhvc2UgYnVmZmVycyBpbiB0aGUgImFsdHBhdGgiLgorCSAqLworCXBhdGggPSAmc3RhdGUtPmFsdHBhdGg7CisJQVNTRVJUKChwYXRoLT5hY3RpdmUgPj0gMCkgJiYgKHBhdGgtPmFjdGl2ZSA8IFhGU19EQV9OT0RFX01BWERFUFRIKSk7CisJZm9yIChibGsgPSBwYXRoLT5ibGssIGxldmVsID0gMDsgbGV2ZWwgPCBwYXRoLT5hY3RpdmU7IGJsaysrLCBsZXZlbCsrKSB7CisJCWlmIChibGstPmJwKSB7CisJCQlibGstPmRpc2tfYmxrbm8gPSB4ZnNfZGFfYmxrbm8oYmxrLT5icCk7CisJCQl4ZnNfZGFfYnVmX2RvbmUoYmxrLT5icCk7CisJCQlibGstPmJwID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWJsay0+ZGlza19ibGtubyA9IDA7CisJCX0KKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBSZWF0dGFjaCB0aGUgYnVmZmVycyB0byB0aGUgc3RhdGUgc3RydWN0dXJlIGJhc2VkIG9uIHRoZSBkaXNrIGJsb2NrCisgKiBudW1iZXJzIHN0b3JlZCBpbiB0aGUgc3RhdGUgc3RydWN0dXJlLgorICogVGhpcyBpcyBkb25lIGFmdGVyIHNvbWUgc2V0IG9mIHRyYW5zYWN0aW9uIGNvbW1pdCdzIGhhcyByZWxlYXNlZCB0aG9zZQorICogYnVmZmVycyBmcm9tIG91ciBncmlwLgorICovCitTVEFUSUMgaW50Cit4ZnNfYXR0cl9yZWZpbGxzdGF0ZSh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUpCit7CisJeGZzX2RhX3N0YXRlX3BhdGhfdCAqcGF0aDsKKwl4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazsKKwlpbnQgbGV2ZWwsIGVycm9yOworCisJLyoKKwkgKiBSb2xsIGRvd24gdGhlICJwYXRoIiBpbiB0aGUgc3RhdGUgc3RydWN0dXJlLCBzdG9yaW5nIHRoZSBvbi1kaXNrCisJICogYmxvY2sgbnVtYmVyIGZvciB0aG9zZSBidWZmZXJzIGluIHRoZSAicGF0aCIuCisJICovCisJcGF0aCA9ICZzdGF0ZS0+cGF0aDsKKwlBU1NFUlQoKHBhdGgtPmFjdGl2ZSA+PSAwKSAmJiAocGF0aC0+YWN0aXZlIDwgWEZTX0RBX05PREVfTUFYREVQVEgpKTsKKwlmb3IgKGJsayA9IHBhdGgtPmJsaywgbGV2ZWwgPSAwOyBsZXZlbCA8IHBhdGgtPmFjdGl2ZTsgYmxrKyssIGxldmVsKyspIHsKKwkJaWYgKGJsay0+ZGlza19ibGtubykgeworCQkJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoc3RhdGUtPmFyZ3MtPnRyYW5zLAorCQkJCQkJc3RhdGUtPmFyZ3MtPmRwLAorCQkJCQkJYmxrLT5ibGtubywgYmxrLT5kaXNrX2Jsa25vLAorCQkJCQkJJmJsay0+YnAsIFhGU19BVFRSX0ZPUkspOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybihlcnJvcik7CisJCX0gZWxzZSB7CisJCQlibGstPmJwID0gTlVMTDsKKwkJfQorCX0KKworCS8qCisJICogUm9sbCBkb3duIHRoZSAiYWx0cGF0aCIgaW4gdGhlIHN0YXRlIHN0cnVjdHVyZSwgc3RvcmluZyB0aGUgb24tZGlzaworCSAqIGJsb2NrIG51bWJlciBmb3IgdGhvc2UgYnVmZmVycyBpbiB0aGUgImFsdHBhdGgiLgorCSAqLworCXBhdGggPSAmc3RhdGUtPmFsdHBhdGg7CisJQVNTRVJUKChwYXRoLT5hY3RpdmUgPj0gMCkgJiYgKHBhdGgtPmFjdGl2ZSA8IFhGU19EQV9OT0RFX01BWERFUFRIKSk7CisJZm9yIChibGsgPSBwYXRoLT5ibGssIGxldmVsID0gMDsgbGV2ZWwgPCBwYXRoLT5hY3RpdmU7IGJsaysrLCBsZXZlbCsrKSB7CisJCWlmIChibGstPmRpc2tfYmxrbm8pIHsKKwkJCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKHN0YXRlLT5hcmdzLT50cmFucywKKwkJCQkJCXN0YXRlLT5hcmdzLT5kcCwKKwkJCQkJCWJsay0+Ymxrbm8sIGJsay0+ZGlza19ibGtubywKKwkJCQkJCSZibGstPmJwLCBYRlNfQVRUUl9GT1JLKTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4oZXJyb3IpOworCQl9IGVsc2UgeworCQkJYmxrLT5icCA9IE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBMb29rIHVwIGEgZmlsZW5hbWUgaW4gYSBub2RlIGF0dHJpYnV0ZSBsaXN0LgorICoKKyAqIFRoaXMgcm91dGluZSBnZXRzIGNhbGxlZCBmb3IgYW55IGF0dHJpYnV0ZSBmb3JrIHRoYXQgaGFzIG1vcmUgdGhhbiBvbmUKKyAqIGJsb2NrLCBpZTogYm90aCB0cnVlIEJ0cmVlIGF0dHIgbGlzdHMgYW5kIGZvciBzaW5nbGUtbGVhZi1ibG9ja3Mgd2l0aAorICogInJlbW90ZSIgdmFsdWVzIHRha2luZyB1cCBtb3JlIGJsb2Nrcy4KKyAqLworaW50Cit4ZnNfYXR0cl9ub2RlX2dldCh4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19kYV9zdGF0ZV90ICpzdGF0ZTsKKwl4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazsKKwlpbnQgZXJyb3IsIHJldHZhbDsKKwlpbnQgaTsKKworCXN0YXRlID0geGZzX2RhX3N0YXRlX2FsbG9jKCk7CisJc3RhdGUtPmFyZ3MgPSBhcmdzOworCXN0YXRlLT5tcCA9IGFyZ3MtPmRwLT5pX21vdW50OworCXN0YXRlLT5ibG9ja3NpemUgPSBzdGF0ZS0+bXAtPm1fc2Iuc2JfYmxvY2tzaXplOworCXN0YXRlLT5ub2RlX2VudHMgPSBzdGF0ZS0+bXAtPm1fYXR0cl9ub2RlX2VudHM7CisKKwkvKgorCSAqIFNlYXJjaCB0byBzZWUgaWYgbmFtZSBleGlzdHMsIGFuZCBnZXQgYmFjayBhIHBvaW50ZXIgdG8gaXQuCisJICovCisJZXJyb3IgPSB4ZnNfZGFfbm9kZV9sb29rdXBfaW50KHN0YXRlLCAmcmV0dmFsKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dmFsID0gZXJyb3I7CisJfSBlbHNlIGlmIChyZXR2YWwgPT0gRUVYSVNUKSB7CisJCWJsayA9ICZzdGF0ZS0+cGF0aC5ibGtbIHN0YXRlLT5wYXRoLmFjdGl2ZS0xIF07CisJCUFTU0VSVChibGstPmJwICE9IE5VTEwpOworCQlBU1NFUlQoYmxrLT5tYWdpYyA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKworCQkvKgorCQkgKiBHZXQgdGhlIHZhbHVlLCBsb2NhbCBvciAicmVtb3RlIgorCQkgKi8KKwkJcmV0dmFsID0geGZzX2F0dHJfbGVhZl9nZXR2YWx1ZShibGstPmJwLCBhcmdzKTsKKwkJaWYgKCFyZXR2YWwgJiYgKGFyZ3MtPnJtdGJsa25vID4gMCkKKwkJICAgICYmICEoYXJncy0+ZmxhZ3MgJiBBVFRSX0tFUk5PVkFMKSkgeworCQkJcmV0dmFsID0geGZzX2F0dHJfcm10dmFsX2dldChhcmdzKTsKKwkJfQorCX0KKworCS8qCisJICogSWYgbm90IGluIGEgdHJhbnNhY3Rpb24sIHdlIGhhdmUgdG8gcmVsZWFzZSBhbGwgdGhlIGJ1ZmZlcnMuCisJICovCisJZm9yIChpID0gMDsgaSA8IHN0YXRlLT5wYXRoLmFjdGl2ZTsgaSsrKSB7CisJCXhmc19kYV9icmVsc2UoYXJncy0+dHJhbnMsIHN0YXRlLT5wYXRoLmJsa1tpXS5icCk7CisJCXN0YXRlLT5wYXRoLmJsa1tpXS5icCA9IE5VTEw7CisJfQorCisJeGZzX2RhX3N0YXRlX2ZyZWUoc3RhdGUpOworCXJldHVybihyZXR2YWwpOworfQorCitTVEFUSUMgaW50CQkJCQkJCS8qIGVycm9yICovCit4ZnNfYXR0cl9ub2RlX2xpc3QoeGZzX2F0dHJfbGlzdF9jb250ZXh0X3QgKmNvbnRleHQpCit7CisJYXR0cmxpc3RfY3Vyc29yX2tlcm5fdCAqY3Vyc29yOworCXhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmOworCXhmc19kYV9pbnRub2RlX3QgKm5vZGU7CisJeGZzX2RhX25vZGVfZW50cnlfdCAqYnRyZWU7CisJaW50IGVycm9yLCBpOworCXhmc19kYWJ1Zl90ICpicDsKKworCWN1cnNvciA9IGNvbnRleHQtPmN1cnNvcjsKKwljdXJzb3ItPmluaXR0ZWQgPSAxOworCisJLyoKKwkgKiBEbyBhbGwgc29ydHMgb2YgdmFsaWRhdGlvbiBvbiB0aGUgcGFzc2VkLWluIGN1cnNvciBzdHJ1Y3R1cmUuCisJICogSWYgYW55dGhpbmcgaXMgYW1pc3MsIGlnbm9yZSB0aGUgY3Vyc29yIGFuZCBsb29rIHVwIHRoZSBoYXNodmFsCisJICogc3RhcnRpbmcgZnJvbSB0aGUgYnRyZWUgcm9vdC4KKwkgKi8KKwlicCA9IE5VTEw7CisJaWYgKGN1cnNvci0+Ymxrbm8gPiAwKSB7CisJCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKE5VTEwsIGNvbnRleHQtPmRwLCBjdXJzb3ItPmJsa25vLCAtMSwKKwkJCQkJICAgICAgJmJwLCBYRlNfQVRUUl9GT1JLKTsKKwkJaWYgKChlcnJvciAhPSAwKSAmJiAoZXJyb3IgIT0gRUZTQ09SUlVQVEVEKSkKKwkJCXJldHVybihlcnJvcik7CisJCWlmIChicCkgeworCQkJbm9kZSA9IGJwLT5kYXRhOworCQkJc3dpdGNoIChJTlRfR0VUKG5vZGUtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpKSB7CisJCQljYXNlIFhGU19EQV9OT0RFX01BR0lDOgorCQkJCXhmc19hdHRyX3RyYWNlX2xfY24oIndyb25nIGJsayIsIGNvbnRleHQsIG5vZGUpOworCQkJCXhmc19kYV9icmVsc2UoTlVMTCwgYnApOworCQkJCWJwID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgWEZTX0FUVFJfTEVBRl9NQUdJQzoKKwkJCQlsZWFmID0gYnAtPmRhdGE7CisJCQkJaWYgKGN1cnNvci0+aGFzaHZhbCA+CisJCQkJICAgIElOVF9HRVQobGVhZi0+ZW50cmllc1sKKwkJCQkJIElOVF9HRVQobGVhZi0+aGRyLmNvdW50LAorCQkJCQkJQVJDSF9DT05WRVJUKS0xXS5oYXNodmFsLAorCQkJCQkJCUFSQ0hfQ09OVkVSVCkpIHsKKwkJCQkJeGZzX2F0dHJfdHJhY2VfbF9jbCgid3JvbmcgYmxrIiwKKwkJCQkJCQkgICBjb250ZXh0LCBsZWFmKTsKKwkJCQkJeGZzX2RhX2JyZWxzZShOVUxMLCBicCk7CisJCQkJCWJwID0gTlVMTDsKKwkJCQl9IGVsc2UgaWYgKGN1cnNvci0+aGFzaHZhbCA8PQorCQkJCQkgICAgIElOVF9HRVQobGVhZi0+ZW50cmllc1swXS5oYXNodmFsLAorCQkJCQkJCUFSQ0hfQ09OVkVSVCkpIHsKKwkJCQkJeGZzX2F0dHJfdHJhY2VfbF9jbCgibWF5YmUgd3JvbmcgYmxrIiwKKwkJCQkJCQkgICBjb250ZXh0LCBsZWFmKTsKKwkJCQkJeGZzX2RhX2JyZWxzZShOVUxMLCBicCk7CisJCQkJCWJwID0gTlVMTDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXhmc19hdHRyX3RyYWNlX2xfYygid3JvbmcgYmxrIC0gPz8iLCBjb250ZXh0KTsKKwkJCQl4ZnNfZGFfYnJlbHNlKE5VTEwsIGJwKTsKKwkJCQlicCA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIFdlIGRpZCBub3QgZmluZCB3aGF0IHdlIGV4cGVjdGVkIGdpdmVuIHRoZSBjdXJzb3IncyBjb250ZW50cywKKwkgKiBzbyB3ZSBzdGFydCBmcm9tIHRoZSB0b3AgYW5kIHdvcmsgZG93biBiYXNlZCBvbiB0aGUgaGFzaCB2YWx1ZS4KKwkgKiBOb3RlIHRoYXQgc3RhcnQgb2Ygbm9kZSBibG9jayBpcyBzYW1lIGFzIHN0YXJ0IG9mIGxlYWYgYmxvY2suCisJICovCisJaWYgKGJwID09IE5VTEwpIHsKKwkJY3Vyc29yLT5ibGtubyA9IDA7CisJCWZvciAoOzspIHsKKwkJCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKE5VTEwsIGNvbnRleHQtPmRwLAorCQkJCQkJICAgICAgY3Vyc29yLT5ibGtubywgLTEsICZicCwKKwkJCQkJCSAgICAgIFhGU19BVFRSX0ZPUkspOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybihlcnJvcik7CisJCQlpZiAodW5saWtlbHkoYnAgPT0gTlVMTCkpIHsKKwkJCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfYXR0cl9ub2RlX2xpc3QoMikiLAorCQkJCQkJIFhGU19FUlJMRVZFTF9MT1csCisJCQkJCQkgY29udGV4dC0+ZHAtPmlfbW91bnQpOworCQkJCXJldHVybihYRlNfRVJST1IoRUZTQ09SUlVQVEVEKSk7CisJCQl9CisJCQlub2RlID0gYnAtPmRhdGE7CisJCQlpZiAoSU5UX0dFVChub2RlLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJCT09IFhGU19BVFRSX0xFQUZfTUFHSUMpCisJCQkJYnJlYWs7CisJCQlpZiAodW5saWtlbHkoSU5UX0dFVChub2RlLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJCSE9IFhGU19EQV9OT0RFX01BR0lDKSkgeworCQkJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfYXR0cl9ub2RlX2xpc3QoMykiLAorCQkJCQkJICAgICBYRlNfRVJSTEVWRUxfTE9XLAorCQkJCQkJICAgICBjb250ZXh0LT5kcC0+aV9tb3VudCwKKwkJCQkJCSAgICAgbm9kZSk7CisJCQkJeGZzX2RhX2JyZWxzZShOVUxMLCBicCk7CisJCQkJcmV0dXJuKFhGU19FUlJPUihFRlNDT1JSVVBURUQpKTsKKwkJCX0KKwkJCWJ0cmVlID0gbm9kZS0+YnRyZWU7CisJCQlmb3IgKGkgPSAwOworCQkJCWkgPCBJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJCQkJCQkJYnRyZWUrKywgaSsrKSB7CisJCQkJaWYgKGN1cnNvci0+aGFzaHZhbAorCQkJCQkJPD0gSU5UX0dFVChidHJlZS0+aGFzaHZhbCwKKwkJCQkJCQkgICAgQVJDSF9DT05WRVJUKSkgeworCQkJCQljdXJzb3ItPmJsa25vID0gSU5UX0dFVChidHJlZS0+YmVmb3JlLCBBUkNIX0NPTlZFUlQpOworCQkJCQl4ZnNfYXR0cl90cmFjZV9sX2NiKCJkZXNjZW5kaW5nIiwKKwkJCQkJCQkgICAgY29udGV4dCwgYnRyZWUpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoaSA9PSBJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkgeworCQkJCXhmc19kYV9icmVsc2UoTlVMTCwgYnApOworCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCXhmc19kYV9icmVsc2UoTlVMTCwgYnApOworCQl9CisJfQorCUFTU0VSVChicCAhPSBOVUxMKTsKKworCS8qCisJICogUm9sbCB1cHdhcmQgdGhyb3VnaCB0aGUgYmxvY2tzLCBwcm9jZXNzaW5nIGVhY2ggbGVhZiBibG9jayBpbgorCSAqIG9yZGVyLiAgQXMgbG9uZyBhcyB0aGVyZSBpcyBzcGFjZSBpbiB0aGUgcmVzdWx0IGJ1ZmZlciwga2VlcAorCSAqIGFkZGluZyB0aGUgaW5mb3JtYXRpb24uCisJICovCisJZm9yICg7OykgeworCQlsZWFmID0gYnAtPmRhdGE7CisJCWlmICh1bmxpa2VseShJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQkhPSBYRlNfQVRUUl9MRUFGX01BR0lDKSkgeworCQkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19hdHRyX25vZGVfbGlzdCg0KSIsCisJCQkJCSAgICAgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkJICAgICBjb250ZXh0LT5kcC0+aV9tb3VudCwgbGVhZik7CisJCQl4ZnNfZGFfYnJlbHNlKE5VTEwsIGJwKTsKKwkJCXJldHVybihYRlNfRVJST1IoRUZTQ09SUlVQVEVEKSk7CisJCX0KKwkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX2xpc3RfaW50KGJwLCBjb250ZXh0KTsKKwkJaWYgKGVycm9yIHx8ICFsZWFmLT5oZHIuaW5mby5mb3J3KQorCQkJYnJlYWs7CS8qIG5vdCByZWFsbHkgYW4gZXJyb3IsIGJ1ZmZlciBmdWxsIG9yIEVPRiAqLworCQljdXJzb3ItPmJsa25vID0gSU5UX0dFVChsZWFmLT5oZHIuaW5mby5mb3J3LCBBUkNIX0NPTlZFUlQpOworCQl4ZnNfZGFfYnJlbHNlKE5VTEwsIGJwKTsKKwkJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoTlVMTCwgY29udGV4dC0+ZHAsIGN1cnNvci0+Ymxrbm8sIC0xLAorCQkJCQkgICAgICAmYnAsIFhGU19BVFRSX0ZPUkspOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4oZXJyb3IpOworCQlpZiAodW5saWtlbHkoKGJwID09IE5VTEwpKSkgeworCQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2F0dHJfbm9kZV9saXN0KDUpIiwKKwkJCQkJIFhGU19FUlJMRVZFTF9MT1csCisJCQkJCSBjb250ZXh0LT5kcC0+aV9tb3VudCk7CisJCQlyZXR1cm4oWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCkpOworCQl9CisJfQorCXhmc19kYV9icmVsc2UoTlVMTCwgYnApOworCXJldHVybigwKTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRXh0ZXJuYWwgcm91dGluZXMgZm9yIG1hbmlwdWxhdGluZyBvdXQtb2YtbGluZSBhdHRyaWJ1dGUgdmFsdWVzLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogUmVhZCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGFuIGF0dHJpYnV0ZSBmcm9tIHRoZSBvdXQtb2YtbGluZSBidWZmZXIKKyAqIHRoYXQgd2Ugc3RvcmVkIGl0IGluLgorICovCitTVEFUSUMgaW50Cit4ZnNfYXR0cl9ybXR2YWxfZ2V0KHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2JtYnRfaXJlY190IG1hcFtBVFRSX1JNVFZBTFVFX01BUFNJWkVdOworCXhmc19tb3VudF90ICptcDsKKwl4ZnNfZGFkZHJfdCBkYmxrbm87CisJeGZzX2NhZGRyX3QgZHN0OworCXhmc19idWZfdCAqYnA7CisJaW50IG5tYXAsIGVycm9yLCB0bXAsIHZhbHVlbGVuLCBibGtjbnQsIGk7CisJeGZzX2RhYmxrX3QgbGJsa25vOworCisJQVNTRVJUKCEoYXJncy0+ZmxhZ3MgJiBBVFRSX0tFUk5PVkFMKSk7CisKKwltcCA9IGFyZ3MtPmRwLT5pX21vdW50OworCWRzdCA9IGFyZ3MtPnZhbHVlOworCXZhbHVlbGVuID0gYXJncy0+dmFsdWVsZW47CisJbGJsa25vID0gYXJncy0+cm10Ymxrbm87CisJd2hpbGUgKHZhbHVlbGVuID4gMCkgeworCQlubWFwID0gQVRUUl9STVRWQUxVRV9NQVBTSVpFOworCQllcnJvciA9IHhmc19ibWFwaShhcmdzLT50cmFucywgYXJncy0+ZHAsICh4ZnNfZmlsZW9mZl90KWxibGtubywKKwkJCQkgIGFyZ3MtPnJtdGJsa2NudCwKKwkJCQkgIFhGU19CTUFQSV9BVFRSRk9SSyB8IFhGU19CTUFQSV9NRVRBREFUQSwKKwkJCQkgIE5VTEwsIDAsIG1hcCwgJm5tYXAsIE5VTEwpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4oZXJyb3IpOworCQlBU1NFUlQobm1hcCA+PSAxKTsKKworCQlmb3IgKGkgPSAwOyAoaSA8IG5tYXApICYmICh2YWx1ZWxlbiA+IDApOyBpKyspIHsKKwkJCUFTU0VSVCgobWFwW2ldLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKSAmJgorCQkJICAgICAgIChtYXBbaV0uYnJfc3RhcnRibG9jayAhPSBIT0xFU1RBUlRCTE9DSykpOworCQkJZGJsa25vID0gWEZTX0ZTQl9UT19EQUREUihtcCwgbWFwW2ldLmJyX3N0YXJ0YmxvY2spOworCQkJYmxrY250ID0gWEZTX0ZTQl9UT19CQihtcCwgbWFwW2ldLmJyX2Jsb2NrY291bnQpOworCQkJZXJyb3IgPSB4ZnNfcmVhZF9idWYobXAsIG1wLT5tX2RkZXZfdGFyZ3AsIGRibGtubywKKwkJCQkJICAgICBibGtjbnQsIFhGU19CVUZfTE9DSywgJmJwKTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4oZXJyb3IpOworCisJCQl0bXAgPSAodmFsdWVsZW4gPCBYRlNfQlVGX1NJWkUoYnApKQorCQkJCT8gdmFsdWVsZW4gOiBYRlNfQlVGX1NJWkUoYnApOworCQkJeGZzX2Jpb21vdmUoYnAsIDAsIHRtcCwgZHN0LCBYRlNfQl9SRUFEKTsKKwkJCXhmc19idWZfcmVsc2UoYnApOworCQkJZHN0ICs9IHRtcDsKKwkJCXZhbHVlbGVuIC09IHRtcDsKKworCQkJbGJsa25vICs9IG1hcFtpXS5icl9ibG9ja2NvdW50OworCQl9CisJfQorCUFTU0VSVCh2YWx1ZWxlbiA9PSAwKTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBXcml0ZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGFuIGF0dHJpYnV0ZSBpbnRvIHRoZSBvdXQtb2YtbGluZSBidWZmZXIKKyAqIHRoYXQgd2UgaGF2ZSBkZWZpbmVkIGZvciBpdC4KKyAqLworU1RBVElDIGludAoreGZzX2F0dHJfcm10dmFsX3NldCh4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19tb3VudF90ICptcDsKKwl4ZnNfZmlsZW9mZl90IGxmaWxlb2ZmOworCXhmc19pbm9kZV90ICpkcDsKKwl4ZnNfYm1idF9pcmVjX3QgbWFwOworCXhmc19kYWRkcl90IGRibGtubzsKKwl4ZnNfY2FkZHJfdCBzcmM7CisJeGZzX2J1Zl90ICpicDsKKwl4ZnNfZGFibGtfdCBsYmxrbm87CisJaW50IGJsa2NudCwgdmFsdWVsZW4sIG5tYXAsIGVycm9yLCB0bXAsIGNvbW1pdHRlZDsKKworCWRwID0gYXJncy0+ZHA7CisJbXAgPSBkcC0+aV9tb3VudDsKKwlzcmMgPSBhcmdzLT52YWx1ZTsKKworCS8qCisJICogRmluZCBhICJob2xlIiBpbiB0aGUgYXR0cmlidXRlIGFkZHJlc3Mgc3BhY2UgbGFyZ2UgZW5vdWdoIGZvcgorCSAqIHVzIHRvIGRyb3AgdGhlIG5ldyBhdHRyaWJ1dGUncyB2YWx1ZSBpbnRvLgorCSAqLworCWJsa2NudCA9IFhGU19CX1RPX0ZTQihtcCwgYXJncy0+dmFsdWVsZW4pOworCWxmaWxlb2ZmID0gMDsKKwllcnJvciA9IHhmc19ibWFwX2ZpcnN0X3VudXNlZChhcmdzLT50cmFucywgYXJncy0+ZHAsIGJsa2NudCwgJmxmaWxlb2ZmLAorCQkJCQkJICAgWEZTX0FUVFJfRk9SSyk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybihlcnJvcik7CisJfQorCWFyZ3MtPnJtdGJsa25vID0gbGJsa25vID0gKHhmc19kYWJsa190KWxmaWxlb2ZmOworCWFyZ3MtPnJtdGJsa2NudCA9IGJsa2NudDsKKworCS8qCisJICogUm9sbCB0aHJvdWdoIHRoZSAidmFsdWUiLCBhbGxvY2F0aW5nIGJsb2NrcyBvbiBkaXNrIGFzIHJlcXVpcmVkLgorCSAqLworCXdoaWxlIChibGtjbnQgPiAwKSB7CisJCS8qCisJCSAqIEFsbG9jYXRlIGEgc2luZ2xlIGV4dGVudCwgdXAgdG8gdGhlIHNpemUgb2YgdGhlIHZhbHVlLgorCQkgKi8KKwkJWEZTX0JNQVBfSU5JVChhcmdzLT5mbGlzdCwgYXJncy0+Zmlyc3RibG9jayk7CisJCW5tYXAgPSAxOworCQllcnJvciA9IHhmc19ibWFwaShhcmdzLT50cmFucywgZHAsICh4ZnNfZmlsZW9mZl90KWxibGtubywKKwkJCQkgIGJsa2NudCwKKwkJCQkgIFhGU19CTUFQSV9BVFRSRk9SSyB8IFhGU19CTUFQSV9NRVRBREFUQSB8CisJCQkJCQkJWEZTX0JNQVBJX1dSSVRFLAorCQkJCSAgYXJncy0+Zmlyc3RibG9jaywgYXJncy0+dG90YWwsICZtYXAsICZubWFwLAorCQkJCSAgYXJncy0+Zmxpc3QpOworCQlpZiAoIWVycm9yKSB7CisJCQllcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmYXJncy0+dHJhbnMsIGFyZ3MtPmZsaXN0LAorCQkJCQkJKmFyZ3MtPmZpcnN0YmxvY2ssICZjb21taXR0ZWQpOworCQl9CisJCWlmIChlcnJvcikgeworCQkJQVNTRVJUKGNvbW1pdHRlZCk7CisJCQlhcmdzLT50cmFucyA9IE5VTEw7CisJCQl4ZnNfYm1hcF9jYW5jZWwoYXJncy0+Zmxpc3QpOworCQkJcmV0dXJuKGVycm9yKTsKKwkJfQorCisJCS8qCisJCSAqIGJtYXBfZmluaXNoKCkgbWF5IGhhdmUgY29tbWl0dGVkIHRoZSBsYXN0IHRyYW5zIGFuZCBzdGFydGVkCisJCSAqIGEgbmV3IG9uZS4gIFdlIG5lZWQgdGhlIGlub2RlIHRvIGJlIGluIGFsbCB0cmFuc2FjdGlvbnMuCisJCSAqLworCQlpZiAoY29tbWl0dGVkKSB7CisJCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCQl4ZnNfdHJhbnNfaWhvbGQoYXJncy0+dHJhbnMsIGRwKTsKKwkJfQorCisJCUFTU0VSVChubWFwID09IDEpOworCQlBU1NFUlQoKG1hcC5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSykgJiYKKwkJICAgICAgIChtYXAuYnJfc3RhcnRibG9jayAhPSBIT0xFU1RBUlRCTE9DSykpOworCQlsYmxrbm8gKz0gbWFwLmJyX2Jsb2NrY291bnQ7CisJCWJsa2NudCAtPSBtYXAuYnJfYmxvY2tjb3VudDsKKworCQkvKgorCQkgKiBTdGFydCB0aGUgbmV4dCB0cmFucyBpbiB0aGUgY2hhaW4uCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX2F0dHJfcm9sbHRyYW5zKCZhcmdzLT50cmFucywgZHApKSkKKwkJCXJldHVybiAoZXJyb3IpOworCX0KKworCS8qCisJICogUm9sbCB0aHJvdWdoIHRoZSAidmFsdWUiLCBjb3B5aW5nIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gdGhlCisJICogYWxyZWFkeS1hbGxvY2F0ZWQgYmxvY2tzLiAgQmxvY2tzIGFyZSB3cml0dGVuIHN5bmNocm9ub3VzbHkKKwkgKiBzbyB0aGF0IHdlIGNhbiBrbm93IHRoZXkgYXJlIGFsbCBvbiBkaXNrIGJlZm9yZSB3ZSB0dXJuIG9mZgorCSAqIHRoZSBJTkNPTVBMRVRFIGZsYWcuCisJICovCisJbGJsa25vID0gYXJncy0+cm10Ymxrbm87CisJdmFsdWVsZW4gPSBhcmdzLT52YWx1ZWxlbjsKKwl3aGlsZSAodmFsdWVsZW4gPiAwKSB7CisJCS8qCisJCSAqIFRyeSB0byByZW1lbWJlciB3aGVyZSB3ZSBkZWNpZGVkIHRvIHB1dCB0aGUgdmFsdWUuCisJCSAqLworCQlYRlNfQk1BUF9JTklUKGFyZ3MtPmZsaXN0LCBhcmdzLT5maXJzdGJsb2NrKTsKKwkJbm1hcCA9IDE7CisJCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIGRwLCAoeGZzX2ZpbGVvZmZfdClsYmxrbm8sCisJCQkJICBhcmdzLT5ybXRibGtjbnQsCisJCQkJICBYRlNfQk1BUElfQVRUUkZPUksgfCBYRlNfQk1BUElfTUVUQURBVEEsCisJCQkJICBhcmdzLT5maXJzdGJsb2NrLCAwLCAmbWFwLCAmbm1hcCwgTlVMTCk7CisJCWlmIChlcnJvcikgeworCQkJcmV0dXJuKGVycm9yKTsKKwkJfQorCQlBU1NFUlQobm1hcCA9PSAxKTsKKwkJQVNTRVJUKChtYXAuYnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0spICYmCisJCSAgICAgICAobWFwLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spKTsKKworCQlkYmxrbm8gPSBYRlNfRlNCX1RPX0RBRERSKG1wLCBtYXAuYnJfc3RhcnRibG9jayksCisJCWJsa2NudCA9IFhGU19GU0JfVE9fQkIobXAsIG1hcC5icl9ibG9ja2NvdW50KTsKKworCQlicCA9IHhmc19idWZfZ2V0X2ZsYWdzKG1wLT5tX2RkZXZfdGFyZ3AsIGRibGtubywKKwkJCQkJCQlibGtjbnQsIFhGU19CVUZfTE9DSyk7CisJCUFTU0VSVChicCk7CisJCUFTU0VSVCghWEZTX0JVRl9HRVRFUlJPUihicCkpOworCisJCXRtcCA9ICh2YWx1ZWxlbiA8IFhGU19CVUZfU0laRShicCkpID8gdmFsdWVsZW4gOgorCQkJCQkJCVhGU19CVUZfU0laRShicCk7CisJCXhmc19iaW9tb3ZlKGJwLCAwLCB0bXAsIHNyYywgWEZTX0JfV1JJVEUpOworCQlpZiAodG1wIDwgWEZTX0JVRl9TSVpFKGJwKSkKKwkJCXhmc19iaW96ZXJvKGJwLCB0bXAsIFhGU19CVUZfU0laRShicCkgLSB0bXApOworCQlpZiAoKGVycm9yID0geGZzX2J3cml0ZShtcCwgYnApKSkgey8qIEdST1Q6IE5PVEU6IHN5bmNocm9ub3VzIHdyaXRlICovCisJCQlyZXR1cm4gKGVycm9yKTsKKwkJfQorCQlzcmMgKz0gdG1wOworCQl2YWx1ZWxlbiAtPSB0bXA7CisKKwkJbGJsa25vICs9IG1hcC5icl9ibG9ja2NvdW50OworCX0KKwlBU1NFUlQodmFsdWVsZW4gPT0gMCk7CisJcmV0dXJuKDApOworfQorCisvKgorICogUmVtb3ZlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYW4gYXR0cmlidXRlIGJ5IGRlbGV0aW5nIHRoZQorICogb3V0LW9mLWxpbmUgYnVmZmVyIHRoYXQgaXQgaXMgc3RvcmVkIG9uLgorICovCitTVEFUSUMgaW50Cit4ZnNfYXR0cl9ybXR2YWxfcmVtb3ZlKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX21vdW50X3QgKm1wOworCXhmc19ibWJ0X2lyZWNfdCBtYXA7CisJeGZzX2J1Zl90ICpicDsKKwl4ZnNfZGFkZHJfdCBkYmxrbm87CisJeGZzX2RhYmxrX3QgbGJsa25vOworCWludCB2YWx1ZWxlbiwgYmxrY250LCBubWFwLCBlcnJvciwgZG9uZSwgY29tbWl0dGVkOworCisJbXAgPSBhcmdzLT5kcC0+aV9tb3VudDsKKworCS8qCisJICogUm9sbCB0aHJvdWdoIHRoZSAidmFsdWUiLCBpbnZhbGlkYXRpbmcgdGhlIGF0dHJpYnV0ZSB2YWx1ZSdzCisJICogYmxvY2tzLgorCSAqLworCWxibGtubyA9IGFyZ3MtPnJtdGJsa25vOworCXZhbHVlbGVuID0gYXJncy0+cm10YmxrY250OworCXdoaWxlICh2YWx1ZWxlbiA+IDApIHsKKwkJLyoKKwkJICogVHJ5IHRvIHJlbWVtYmVyIHdoZXJlIHdlIGRlY2lkZWQgdG8gcHV0IHRoZSB2YWx1ZS4KKwkJICovCisJCVhGU19CTUFQX0lOSVQoYXJncy0+Zmxpc3QsIGFyZ3MtPmZpcnN0YmxvY2spOworCQlubWFwID0gMTsKKwkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgYXJncy0+ZHAsICh4ZnNfZmlsZW9mZl90KWxibGtubywKKwkJCQkJYXJncy0+cm10YmxrY250LAorCQkJCQlYRlNfQk1BUElfQVRUUkZPUksgfCBYRlNfQk1BUElfTUVUQURBVEEsCisJCQkJCWFyZ3MtPmZpcnN0YmxvY2ssIDAsICZtYXAsICZubWFwLAorCQkJCQlhcmdzLT5mbGlzdCk7CisJCWlmIChlcnJvcikgeworCQkJcmV0dXJuKGVycm9yKTsKKwkJfQorCQlBU1NFUlQobm1hcCA9PSAxKTsKKwkJQVNTRVJUKChtYXAuYnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0spICYmCisJCSAgICAgICAobWFwLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spKTsKKworCQlkYmxrbm8gPSBYRlNfRlNCX1RPX0RBRERSKG1wLCBtYXAuYnJfc3RhcnRibG9jayksCisJCWJsa2NudCA9IFhGU19GU0JfVE9fQkIobXAsIG1hcC5icl9ibG9ja2NvdW50KTsKKworCQkvKgorCQkgKiBJZiB0aGUgInJlbW90ZSIgdmFsdWUgaXMgaW4gdGhlIGNhY2hlLCByZW1vdmUgaXQuCisJCSAqLworCQlicCA9IHhmc19pbmNvcmUobXAtPm1fZGRldl90YXJncCwgZGJsa25vLCBibGtjbnQsCisJCQkJWEZTX0lOQ09SRV9UUllMT0NLKTsKKwkJaWYgKGJwKSB7CisJCQlYRlNfQlVGX1NUQUxFKGJwKTsKKwkJCVhGU19CVUZfVU5ERUxBWVdSSVRFKGJwKTsKKwkJCXhmc19idWZfcmVsc2UoYnApOworCQkJYnAgPSBOVUxMOworCQl9CisKKwkJdmFsdWVsZW4gLT0gbWFwLmJyX2Jsb2NrY291bnQ7CisKKwkJbGJsa25vICs9IG1hcC5icl9ibG9ja2NvdW50OworCX0KKworCS8qCisJICogS2VlcCBkZS1hbGxvY2F0aW5nIGV4dGVudHMgdW50aWwgdGhlIHJlbW90ZS12YWx1ZSByZWdpb24gaXMgZ29uZS4KKwkgKi8KKwlsYmxrbm8gPSBhcmdzLT5ybXRibGtubzsKKwlibGtjbnQgPSBhcmdzLT5ybXRibGtjbnQ7CisJZG9uZSA9IDA7CisJd2hpbGUgKCFkb25lKSB7CisJCVhGU19CTUFQX0lOSVQoYXJncy0+Zmxpc3QsIGFyZ3MtPmZpcnN0YmxvY2spOworCQllcnJvciA9IHhmc19idW5tYXBpKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgbGJsa25vLCBibGtjbnQsCisJCQkJICAgIFhGU19CTUFQSV9BVFRSRk9SSyB8IFhGU19CTUFQSV9NRVRBREFUQSwKKwkJCQkgICAgMSwgYXJncy0+Zmlyc3RibG9jaywgYXJncy0+Zmxpc3QsICZkb25lKTsKKwkJaWYgKCFlcnJvcikgeworCQkJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJmFyZ3MtPnRyYW5zLCBhcmdzLT5mbGlzdCwKKwkJCQkJCSphcmdzLT5maXJzdGJsb2NrLCAmY29tbWl0dGVkKTsKKwkJfQorCQlpZiAoZXJyb3IpIHsKKwkJCUFTU0VSVChjb21taXR0ZWQpOworCQkJYXJncy0+dHJhbnMgPSBOVUxMOworCQkJeGZzX2JtYXBfY2FuY2VsKGFyZ3MtPmZsaXN0KTsKKwkJCXJldHVybihlcnJvcik7CisJCX0KKworCQkvKgorCQkgKiBibWFwX2ZpbmlzaCgpIG1heSBoYXZlIGNvbW1pdHRlZCB0aGUgbGFzdCB0cmFucyBhbmQgc3RhcnRlZAorCQkgKiBhIG5ldyBvbmUuICBXZSBuZWVkIHRoZSBpbm9kZSB0byBiZSBpbiBhbGwgdHJhbnNhY3Rpb25zLgorCQkgKi8KKwkJaWYgKGNvbW1pdHRlZCkgeworCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJeGZzX3RyYW5zX2lob2xkKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCk7CisJCX0KKworCQkvKgorCQkgKiBDbG9zZSBvdXQgdHJhbnMgYW5kIHN0YXJ0IHRoZSBuZXh0IG9uZSBpbiB0aGUgY2hhaW4uCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX2F0dHJfcm9sbHRyYW5zKCZhcmdzLT50cmFucywgYXJncy0+ZHApKSkKKwkJCXJldHVybiAoZXJyb3IpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKKyNpZiBkZWZpbmVkKFhGU19BVFRSX1RSQUNFKQorLyoKKyAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgYW4gYXR0cl9saXN0IGNvbnRleHQgc3RydWN0dXJlLgorICovCit2b2lkCit4ZnNfYXR0cl90cmFjZV9sX2MoY2hhciAqd2hlcmUsIHN0cnVjdCB4ZnNfYXR0cl9saXN0X2NvbnRleHQgKmNvbnRleHQpCit7CisJeGZzX2F0dHJfdHJhY2VfZW50ZXIoWEZTX0FUVFJfS1RSQUNFX0xfQywgd2hlcmUsCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5kcCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmN1cnNvci0+aGFzaHZhbCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmN1cnNvci0+Ymxrbm8sCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5jdXJzb3ItPm9mZnNldCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmFsaXN0LAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+YnVmc2l6ZSwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmNvdW50LAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+Zmlyc3R1LAorCQkoX19wc3Vuc2lnbmVkX3QpCisJCQkoKGNvbnRleHQtPmNvdW50ID4gMCkgJiYKKwkJCSEoY29udGV4dC0+ZmxhZ3MgJiAoQVRUUl9LRVJOQU1FTFN8QVRUUl9LRVJOT1ZBTCkpKQorCQkJCT8gKEFUVFJfRU5UUlkoY29udGV4dC0+YWxpc3QsCisJCQkJCSAgICAgIGNvbnRleHQtPmNvdW50LTEpLT5hX3ZhbHVlbGVuKQorCQkJCTogMCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmR1cGNudCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmZsYWdzLAorCQkoX19wc3Vuc2lnbmVkX3QpTlVMTCwKKwkJKF9fcHN1bnNpZ25lZF90KU5VTEwsCisJCShfX3BzdW5zaWduZWRfdClOVUxMKTsKK30KKworLyoKKyAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgYSBjb250ZXh0IHN0cnVjdHVyZSBhbmQgYSBCdHJlZSBub2RlLgorICovCit2b2lkCit4ZnNfYXR0cl90cmFjZV9sX2NuKGNoYXIgKndoZXJlLCBzdHJ1Y3QgeGZzX2F0dHJfbGlzdF9jb250ZXh0ICpjb250ZXh0LAorCQkJIHN0cnVjdCB4ZnNfZGFfaW50bm9kZSAqbm9kZSkKK3sKKwl4ZnNfYXR0cl90cmFjZV9lbnRlcihYRlNfQVRUUl9LVFJBQ0VfTF9DTiwgd2hlcmUsCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5kcCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmN1cnNvci0+aGFzaHZhbCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmN1cnNvci0+Ymxrbm8sCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5jdXJzb3ItPm9mZnNldCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmFsaXN0LAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+YnVmc2l6ZSwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmNvdW50LAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+Zmlyc3R1LAorCQkoX19wc3Vuc2lnbmVkX3QpCisJCQkoKGNvbnRleHQtPmNvdW50ID4gMCkgJiYKKwkJCSEoY29udGV4dC0+ZmxhZ3MgJiAoQVRUUl9LRVJOQU1FTFN8QVRUUl9LRVJOT1ZBTCkpKQorCQkJCT8gKEFUVFJfRU5UUlkoY29udGV4dC0+YWxpc3QsCisJCQkJCSAgICAgIGNvbnRleHQtPmNvdW50LTEpLT5hX3ZhbHVlbGVuKQorCQkJCTogMCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmR1cGNudCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmZsYWdzLAorCQkoX19wc3Vuc2lnbmVkX3QpSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCksCisJCShfX3BzdW5zaWduZWRfdClJTlRfR0VUKG5vZGUtPmJ0cmVlWzBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCksCisJCShfX3BzdW5zaWduZWRfdClJTlRfR0VUKG5vZGUtPmJ0cmVlW0lOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTFdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkpOworfQorCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhIGNvbnRleHQgc3RydWN0dXJlIGFuZCBhIEJ0cmVlIGVsZW1lbnQuCisgKi8KK3ZvaWQKK3hmc19hdHRyX3RyYWNlX2xfY2IoY2hhciAqd2hlcmUsIHN0cnVjdCB4ZnNfYXR0cl9saXN0X2NvbnRleHQgKmNvbnRleHQsCisJCQkgIHN0cnVjdCB4ZnNfZGFfbm9kZV9lbnRyeSAqYnRyZWUpCit7CisJeGZzX2F0dHJfdHJhY2VfZW50ZXIoWEZTX0FUVFJfS1RSQUNFX0xfQ0IsIHdoZXJlLAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+ZHAsCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5jdXJzb3ItPmhhc2h2YWwsCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5jdXJzb3ItPmJsa25vLAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+Y3Vyc29yLT5vZmZzZXQsCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5hbGlzdCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmJ1ZnNpemUsCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5jb3VudCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmZpcnN0dSwKKwkJKF9fcHN1bnNpZ25lZF90KQorCQkJKChjb250ZXh0LT5jb3VudCA+IDApICYmCisJCQkhKGNvbnRleHQtPmZsYWdzICYgKEFUVFJfS0VSTkFNRUxTfEFUVFJfS0VSTk9WQUwpKSkKKwkJCQk/IChBVFRSX0VOVFJZKGNvbnRleHQtPmFsaXN0LAorCQkJCQkgICAgICBjb250ZXh0LT5jb3VudC0xKS0+YV92YWx1ZWxlbikKKwkJCQk6IDAsCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5kdXBjbnQsCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5mbGFncywKKwkJKF9fcHN1bnNpZ25lZF90KUlOVF9HRVQoYnRyZWUtPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCksCisJCShfX3BzdW5zaWduZWRfdClJTlRfR0VUKGJ0cmVlLT5iZWZvcmUsIEFSQ0hfQ09OVkVSVCksCisJCShfX3BzdW5zaWduZWRfdClOVUxMKTsKK30KKworLyoKKyAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgYSBjb250ZXh0IHN0cnVjdHVyZSBhbmQgYSBsZWFmIGJsb2NrLgorICovCit2b2lkCit4ZnNfYXR0cl90cmFjZV9sX2NsKGNoYXIgKndoZXJlLCBzdHJ1Y3QgeGZzX2F0dHJfbGlzdF9jb250ZXh0ICpjb250ZXh0LAorCQkJICAgICAgc3RydWN0IHhmc19hdHRyX2xlYWZibG9jayAqbGVhZikKK3sKKwl4ZnNfYXR0cl90cmFjZV9lbnRlcihYRlNfQVRUUl9LVFJBQ0VfTF9DTCwgd2hlcmUsCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5kcCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmN1cnNvci0+aGFzaHZhbCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmN1cnNvci0+Ymxrbm8sCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5jdXJzb3ItPm9mZnNldCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmFsaXN0LAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+YnVmc2l6ZSwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmNvdW50LAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+Zmlyc3R1LAorCQkoX19wc3Vuc2lnbmVkX3QpCisJCQkoKGNvbnRleHQtPmNvdW50ID4gMCkgJiYKKwkJCSEoY29udGV4dC0+ZmxhZ3MgJiAoQVRUUl9LRVJOQU1FTFN8QVRUUl9LRVJOT1ZBTCkpKQorCQkJCT8gKEFUVFJfRU5UUlkoY29udGV4dC0+YWxpc3QsCisJCQkJCSAgICAgIGNvbnRleHQtPmNvdW50LTEpLT5hX3ZhbHVlbGVuKQorCQkJCTogMCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmR1cGNudCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmZsYWdzLAorCQkoX19wc3Vuc2lnbmVkX3QpSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCksCisJCShfX3BzdW5zaWduZWRfdClJTlRfR0VUKGxlYWYtPmVudHJpZXNbMF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSwKKwkJKF9fcHN1bnNpZ25lZF90KUlOVF9HRVQobGVhZi0+ZW50cmllc1tJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpKTsKK30KKworLyoKKyAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgdGhlIGFyZ3VtZW50cyBnaXZlbiB0byB0aGUgcm91dGluZSwKKyAqIGdlbmVyaWMgZm9ybS4KKyAqLwordm9pZAoreGZzX2F0dHJfdHJhY2VfZW50ZXIoaW50IHR5cGUsIGNoYXIgKndoZXJlLAorCQkJIF9fcHN1bnNpZ25lZF90IGEyLCBfX3BzdW5zaWduZWRfdCBhMywKKwkJCSBfX3BzdW5zaWduZWRfdCBhNCwgX19wc3Vuc2lnbmVkX3QgYTUsCisJCQkgX19wc3Vuc2lnbmVkX3QgYTYsIF9fcHN1bnNpZ25lZF90IGE3LAorCQkJIF9fcHN1bnNpZ25lZF90IGE4LCBfX3BzdW5zaWduZWRfdCBhOSwKKwkJCSBfX3BzdW5zaWduZWRfdCBhMTAsIF9fcHN1bnNpZ25lZF90IGExMSwKKwkJCSBfX3BzdW5zaWduZWRfdCBhMTIsIF9fcHN1bnNpZ25lZF90IGExMywKKwkJCSBfX3BzdW5zaWduZWRfdCBhMTQsIF9fcHN1bnNpZ25lZF90IGExNSkKK3sKKwlBU1NFUlQoeGZzX2F0dHJfdHJhY2VfYnVmKTsKKwlrdHJhY2VfZW50ZXIoeGZzX2F0dHJfdHJhY2VfYnVmLCAodm9pZCAqKSgoX19wc3Vuc2lnbmVkX3QpdHlwZSksCisJCQkJCSAodm9pZCAqKXdoZXJlLAorCQkJCQkgKHZvaWQgKilhMiwgICh2b2lkICopYTMsICAodm9pZCAqKWE0LAorCQkJCQkgKHZvaWQgKilhNSwgICh2b2lkICopYTYsICAodm9pZCAqKWE3LAorCQkJCQkgKHZvaWQgKilhOCwgICh2b2lkICopYTksICAodm9pZCAqKWExMCwKKwkJCQkJICh2b2lkICopYTExLCAodm9pZCAqKWExMiwgKHZvaWQgKilhMTMsCisJCQkJCSAodm9pZCAqKWExNCwgKHZvaWQgKilhMTUpOworfQorI2VuZGlmCS8qIFhGU19BVFRSX1RSQUNFICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN5c3RlbSAocHNldWRvKSBuYW1lc3BhY2UgYXR0cmlidXRlIGludGVyZmFjZSByb3V0aW5lcy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworU1RBVElDIGludAorcG9zaXhfYWNsX2FjY2Vzc19zZXQoCisJdm5vZGVfdAkqdnAsIGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQgeGZsYWdzKQoreworCXJldHVybiB4ZnNfYWNsX3ZzZXQodnAsIGRhdGEsIHNpemUsIF9BQ0xfVFlQRV9BQ0NFU1MpOworfQorCitTVEFUSUMgaW50Citwb3NpeF9hY2xfYWNjZXNzX3JlbW92ZSgKKwlzdHJ1Y3Qgdm5vZGUgKnZwLCBjaGFyICpuYW1lLCBpbnQgeGZsYWdzKQoreworCXJldHVybiB4ZnNfYWNsX3ZyZW1vdmUodnAsIF9BQ0xfVFlQRV9BQ0NFU1MpOworfQorCitTVEFUSUMgaW50Citwb3NpeF9hY2xfYWNjZXNzX2dldCgKKwl2bm9kZV90ICp2cCwgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGludCB4ZmxhZ3MpCit7CisJcmV0dXJuIHhmc19hY2xfdmdldCh2cCwgZGF0YSwgc2l6ZSwgX0FDTF9UWVBFX0FDQ0VTUyk7Cit9CisKK1NUQVRJQyBpbnQKK3Bvc2l4X2FjbF9hY2Nlc3NfZXhpc3RzKAorCXZub2RlX3QgKnZwKQoreworCXJldHVybiB4ZnNfYWNsX3ZoYXNhY2xfYWNjZXNzKHZwKTsKK30KKworU1RBVElDIGludAorcG9zaXhfYWNsX2RlZmF1bHRfc2V0KAorCXZub2RlX3QJKnZwLCBjaGFyICpuYW1lLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50IHhmbGFncykKK3sKKwlyZXR1cm4geGZzX2FjbF92c2V0KHZwLCBkYXRhLCBzaXplLCBfQUNMX1RZUEVfREVGQVVMVCk7Cit9CisKK1NUQVRJQyBpbnQKK3Bvc2l4X2FjbF9kZWZhdWx0X2dldCgKKwl2bm9kZV90ICp2cCwgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGludCB4ZmxhZ3MpCit7CisJcmV0dXJuIHhmc19hY2xfdmdldCh2cCwgZGF0YSwgc2l6ZSwgX0FDTF9UWVBFX0RFRkFVTFQpOworfQorCitTVEFUSUMgaW50Citwb3NpeF9hY2xfZGVmYXVsdF9yZW1vdmUoCisJc3RydWN0IHZub2RlICp2cCwgY2hhciAqbmFtZSwgaW50IHhmbGFncykKK3sKKwlyZXR1cm4geGZzX2FjbF92cmVtb3ZlKHZwLCBfQUNMX1RZUEVfREVGQVVMVCk7Cit9CisKK1NUQVRJQyBpbnQKK3Bvc2l4X2FjbF9kZWZhdWx0X2V4aXN0cygKKwl2bm9kZV90ICp2cCkKK3sKKwlyZXR1cm4geGZzX2FjbF92aGFzYWNsX2RlZmF1bHQodnApOworfQorCitzdHJ1Y3QgYXR0cm5hbWVzIHBvc2l4X2FjbF9hY2Nlc3MgPSB7CisJLmF0dHJfbmFtZQk9ICJwb3NpeF9hY2xfYWNjZXNzIiwKKwkuYXR0cl9uYW1lbGVuCT0gc2l6ZW9mKCJwb3NpeF9hY2xfYWNjZXNzIikgLSAxLAorCS5hdHRyX2dldAk9IHBvc2l4X2FjbF9hY2Nlc3NfZ2V0LAorCS5hdHRyX3NldAk9IHBvc2l4X2FjbF9hY2Nlc3Nfc2V0LAorCS5hdHRyX3JlbW92ZQk9IHBvc2l4X2FjbF9hY2Nlc3NfcmVtb3ZlLAorCS5hdHRyX2V4aXN0cwk9IHBvc2l4X2FjbF9hY2Nlc3NfZXhpc3RzLAorfTsKKworc3RydWN0IGF0dHJuYW1lcyBwb3NpeF9hY2xfZGVmYXVsdCA9IHsKKwkuYXR0cl9uYW1lCT0gInBvc2l4X2FjbF9kZWZhdWx0IiwKKwkuYXR0cl9uYW1lbGVuCT0gc2l6ZW9mKCJwb3NpeF9hY2xfZGVmYXVsdCIpIC0gMSwKKwkuYXR0cl9nZXQJPSBwb3NpeF9hY2xfZGVmYXVsdF9nZXQsCisJLmF0dHJfc2V0CT0gcG9zaXhfYWNsX2RlZmF1bHRfc2V0LAorCS5hdHRyX3JlbW92ZQk9IHBvc2l4X2FjbF9kZWZhdWx0X3JlbW92ZSwKKwkuYXR0cl9leGlzdHMJPSBwb3NpeF9hY2xfZGVmYXVsdF9leGlzdHMsCit9OworCitzdHJ1Y3QgYXR0cm5hbWVzICphdHRyX3N5c3RlbV9uYW1lc1tdID0KKwl7ICZwb3NpeF9hY2xfYWNjZXNzLCAmcG9zaXhfYWNsX2RlZmF1bHQgfTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTmFtZXNwYWNlLXByZWZpeC1zdHlsZSBhdHRyaWJ1dGUgbmFtZSBpbnRlcmZhY2Ugcm91dGluZXMuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK1NUQVRJQyBpbnQKK2F0dHJfZ2VuZXJpY19zZXQoCisJc3RydWN0IHZub2RlICp2cCwgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGludCB4ZmxhZ3MpCit7CisJaW50IAllcnJvcjsKKworCVZPUF9BVFRSX1NFVCh2cCwgbmFtZSwgZGF0YSwgc2l6ZSwgeGZsYWdzLCBOVUxMLCBlcnJvcik7CisJcmV0dXJuIC1lcnJvcjsKK30KKworU1RBVElDIGludAorYXR0cl9nZW5lcmljX2dldCgKKwlzdHJ1Y3Qgdm5vZGUgKnZwLCBjaGFyICpuYW1lLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50IHhmbGFncykKK3sKKwlpbnQJZXJyb3IsIGFzaXplID0gc2l6ZTsKKworCVZPUF9BVFRSX0dFVCh2cCwgbmFtZSwgZGF0YSwgJmFzaXplLCB4ZmxhZ3MsIE5VTEwsIGVycm9yKTsKKwlpZiAoIWVycm9yKQorCQlyZXR1cm4gYXNpemU7CisJcmV0dXJuIC1lcnJvcjsKK30KKworU1RBVElDIGludAorYXR0cl9nZW5lcmljX3JlbW92ZSgKKwlzdHJ1Y3Qgdm5vZGUgKnZwLCBjaGFyICpuYW1lLCBpbnQgeGZsYWdzKQoreworCWludAllcnJvcjsKKworCVZPUF9BVFRSX1JFTU9WRSh2cCwgbmFtZSwgeGZsYWdzLCBOVUxMLCBlcnJvcik7CisJcmV0dXJuIC1lcnJvcjsKK30KKworU1RBVElDIGludAorYXR0cl9nZW5lcmljX2xpc3RhZGQoCisJYXR0cm5hbWVzX3QJCSpwcmVmaXgsCisJYXR0cm5hbWVzX3QJCSpuYW1lc3AsCisJdm9pZAkJCSpkYXRhLAorCXNpemVfdAkJCXNpemUsCisJc3NpemVfdAkJCSpyZXN1bHQpCit7CisJY2hhcgkJCSpwID0gZGF0YSArICpyZXN1bHQ7CisKKwkqcmVzdWx0ICs9IHByZWZpeC0+YXR0cl9uYW1lbGVuOworCSpyZXN1bHQgKz0gbmFtZXNwLT5hdHRyX25hbWVsZW4gKyAxOworCWlmICghc2l6ZSkKKwkJcmV0dXJuIDA7CisJaWYgKCpyZXN1bHQgPiBzaXplKQorCQlyZXR1cm4gLUVSQU5HRTsKKwlzdHJjcHkocCwgcHJlZml4LT5hdHRyX25hbWUpOworCXAgKz0gcHJlZml4LT5hdHRyX25hbWVsZW47CisJc3RyY3B5KHAsIG5hbWVzcC0+YXR0cl9uYW1lKTsKKwlwICs9IG5hbWVzcC0+YXR0cl9uYW1lbGVuICsgMTsKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIGludAorYXR0cl9zeXN0ZW1fbGlzdCgKKwlzdHJ1Y3Qgdm5vZGUJCSp2cCwKKwl2b2lkCQkJKmRhdGEsCisJc2l6ZV90CQkJc2l6ZSwKKwlzc2l6ZV90CQkJKnJlc3VsdCkKK3sKKwlhdHRybmFtZXNfdAkJKm5hbWVzcDsKKwlpbnQJCQlpLCBlcnJvciA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVRUUl9TWVNDT1VOVDsgaSsrKSB7CisJCW5hbWVzcCA9IGF0dHJfc3lzdGVtX25hbWVzW2ldOworCQlpZiAoIW5hbWVzcC0+YXR0cl9leGlzdHMgfHwgIW5hbWVzcC0+YXR0cl9leGlzdHModnApKQorCQkJY29udGludWU7CisJCWVycm9yID0gYXR0cl9nZW5lcmljX2xpc3RhZGQoJmF0dHJfc3lzdGVtLCBuYW1lc3AsCisJCQkJCQlkYXRhLCBzaXplLCByZXN1bHQpOworCQlpZiAoZXJyb3IpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCitpbnQKK2F0dHJfZ2VuZXJpY19saXN0KAorCXN0cnVjdCB2bm9kZSAqdnAsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQgeGZsYWdzLCBzc2l6ZV90ICpyZXN1bHQpCit7CisJYXR0cmxpc3RfY3Vyc29yX2tlcm5fdAljdXJzb3IgPSB7IDAgfTsKKwlpbnQJCQllcnJvcjsKKworCVZPUF9BVFRSX0xJU1QodnAsIGRhdGEsIHNpemUsIHhmbGFncywgJmN1cnNvciwgTlVMTCwgZXJyb3IpOworCWlmIChlcnJvciA+IDApCisJCXJldHVybiAtZXJyb3I7CisJKnJlc3VsdCA9IC1lcnJvcjsKKwlyZXR1cm4gYXR0cl9zeXN0ZW1fbGlzdCh2cCwgZGF0YSwgc2l6ZSwgcmVzdWx0KTsKK30KKworYXR0cm5hbWVzX3QgKgorYXR0cl9sb29rdXBfbmFtZXNwYWNlKAorCWNoYXIJCQkqbmFtZSwKKwlzdHJ1Y3QgYXR0cm5hbWVzCSoqbmFtZXMsCisJaW50CQkJbm5hbWVzKQoreworCWludAkJCWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbm5hbWVzOyBpKyspCisJCWlmICghc3RybmNtcChuYW1lLCBuYW1lc1tpXS0+YXR0cl9uYW1lLCBuYW1lc1tpXS0+YXR0cl9uYW1lbGVuKSkKKwkJCXJldHVybiBuYW1lc1tpXTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFNvbWUgY2hlY2tzIHRvIHByZXZlbnQgcGVvcGxlIGFidXNpbmcgRUFzIHRvIGdldCBvdmVyIHF1b3RhOgorICogLSBEb24ndCBhbGxvdyBtb2RpZnlpbmcgdXNlciBFQXMgb24gZGV2aWNlcy9zeW1saW5rczsKKyAqIC0gRG9uJ3QgYWxsb3cgbW9kaWZ5aW5nIHVzZXIgRUFzIGlmIHN0aWNreSBiaXQgc2V0OworICovCitTVEFUSUMgaW50CithdHRyX3VzZXJfY2FwYWJsZSgKKwlzdHJ1Y3Qgdm5vZGUJKnZwLAorCWNyZWRfdAkJKmNyZWQpCit7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IExJTlZGU19HRVRfSVAodnApOworCisJaWYgKElTX0lNTVVUQUJMRShpbm9kZSkgfHwgSVNfQVBQRU5EKGlub2RlKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYKKwkgICAgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgKGlub2RlLT5pX21vZGUgJiBTX0lTVlRYKSAmJgorCSAgICAoY3VycmVudF9mc3VpZChjcmVkKSAhPSBpbm9kZS0+aV91aWQpICYmICFjYXBhYmxlKENBUF9GT1dORVIpKQorCQlyZXR1cm4gLUVQRVJNOworCXJldHVybiAwOworfQorCitTVEFUSUMgaW50CithdHRyX3RydXN0ZWRfY2FwYWJsZSgKKwlzdHJ1Y3Qgdm5vZGUJKnZwLAorCWNyZWRfdAkJKmNyZWQpCit7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IExJTlZGU19HRVRfSVAodnApOworCisJaWYgKElTX0lNTVVUQUJMRShpbm9kZSkgfHwgSVNfQVBQRU5EKGlub2RlKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBpbnQKK2F0dHJfc2VjdXJlX2NhcGFibGUoCisJc3RydWN0IHZub2RlCSp2cCwKKwljcmVkX3QJCSpjcmVkKQoreworCXJldHVybiAtRU5PU0VDVVJJVFk7Cit9CisKK1NUQVRJQyBpbnQKK2F0dHJfc3lzdGVtX3NldCgKKwlzdHJ1Y3Qgdm5vZGUgKnZwLCBjaGFyICpuYW1lLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50IHhmbGFncykKK3sKKwlhdHRybmFtZXNfdAkqbmFtZXNwOworCWludAkJZXJyb3I7CisKKwlpZiAoeGZsYWdzICYgQVRUUl9DUkVBVEUpCisJCXJldHVybiAtRUlOVkFMOworCisJbmFtZXNwID0gYXR0cl9sb29rdXBfbmFtZXNwYWNlKG5hbWUsIGF0dHJfc3lzdGVtX25hbWVzLCBBVFRSX1NZU0NPVU5UKTsKKwlpZiAoIW5hbWVzcCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWVycm9yID0gbmFtZXNwLT5hdHRyX3NldCh2cCwgbmFtZSwgZGF0YSwgc2l6ZSwgeGZsYWdzKTsKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IHZuX3JldmFsaWRhdGUodnApOworCXJldHVybiBlcnJvcjsKK30KKworU1RBVElDIGludAorYXR0cl9zeXN0ZW1fZ2V0KAorCXN0cnVjdCB2bm9kZSAqdnAsIGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQgeGZsYWdzKQoreworCWF0dHJuYW1lc190CSpuYW1lc3A7CisKKwluYW1lc3AgPSBhdHRyX2xvb2t1cF9uYW1lc3BhY2UobmFtZSwgYXR0cl9zeXN0ZW1fbmFtZXMsIEFUVFJfU1lTQ09VTlQpOworCWlmICghbmFtZXNwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJcmV0dXJuIG5hbWVzcC0+YXR0cl9nZXQodnAsIG5hbWUsIGRhdGEsIHNpemUsIHhmbGFncyk7Cit9CisKK1NUQVRJQyBpbnQKK2F0dHJfc3lzdGVtX3JlbW92ZSgKKwlzdHJ1Y3Qgdm5vZGUgKnZwLCBjaGFyICpuYW1lLCBpbnQgeGZsYWdzKQoreworCWF0dHJuYW1lc190CSpuYW1lc3A7CisKKwluYW1lc3AgPSBhdHRyX2xvb2t1cF9uYW1lc3BhY2UobmFtZSwgYXR0cl9zeXN0ZW1fbmFtZXMsIEFUVFJfU1lTQ09VTlQpOworCWlmICghbmFtZXNwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJcmV0dXJuIG5hbWVzcC0+YXR0cl9yZW1vdmUodnAsIG5hbWUsIHhmbGFncyk7Cit9CisKK3N0cnVjdCBhdHRybmFtZXMgYXR0cl9zeXN0ZW0gPSB7CisJLmF0dHJfbmFtZQk9ICJzeXN0ZW0uIiwKKwkuYXR0cl9uYW1lbGVuCT0gc2l6ZW9mKCJzeXN0ZW0uIikgLSAxLAorCS5hdHRyX2ZsYWcJPSBBVFRSX1NZU1RFTSwKKwkuYXR0cl9nZXQJPSBhdHRyX3N5c3RlbV9nZXQsCisJLmF0dHJfc2V0CT0gYXR0cl9zeXN0ZW1fc2V0LAorCS5hdHRyX3JlbW92ZQk9IGF0dHJfc3lzdGVtX3JlbW92ZSwKKwkuYXR0cl9jYXBhYmxlCT0gKGF0dHJjYXBhYmxlX3QpZnNfbm9lcnIsCit9OworCitzdHJ1Y3QgYXR0cm5hbWVzIGF0dHJfdHJ1c3RlZCA9IHsKKwkuYXR0cl9uYW1lCT0gInRydXN0ZWQuIiwKKwkuYXR0cl9uYW1lbGVuCT0gc2l6ZW9mKCJ0cnVzdGVkLiIpIC0gMSwKKwkuYXR0cl9mbGFnCT0gQVRUUl9ST09ULAorCS5hdHRyX2dldAk9IGF0dHJfZ2VuZXJpY19nZXQsCisJLmF0dHJfc2V0CT0gYXR0cl9nZW5lcmljX3NldCwKKwkuYXR0cl9yZW1vdmUJPSBhdHRyX2dlbmVyaWNfcmVtb3ZlLAorCS5hdHRyX2NhcGFibGUJPSBhdHRyX3RydXN0ZWRfY2FwYWJsZSwKK307CisKK3N0cnVjdCBhdHRybmFtZXMgYXR0cl9zZWN1cmUgPSB7CisJLmF0dHJfbmFtZQk9ICJzZWN1cml0eS4iLAorCS5hdHRyX25hbWVsZW4JPSBzaXplb2YoInNlY3VyaXR5LiIpIC0gMSwKKwkuYXR0cl9mbGFnCT0gQVRUUl9TRUNVUkUsCisJLmF0dHJfZ2V0CT0gYXR0cl9nZW5lcmljX2dldCwKKwkuYXR0cl9zZXQJPSBhdHRyX2dlbmVyaWNfc2V0LAorCS5hdHRyX3JlbW92ZQk9IGF0dHJfZ2VuZXJpY19yZW1vdmUsCisJLmF0dHJfY2FwYWJsZQk9IGF0dHJfc2VjdXJlX2NhcGFibGUsCit9OworCitzdHJ1Y3QgYXR0cm5hbWVzIGF0dHJfdXNlciA9IHsKKwkuYXR0cl9uYW1lCT0gInVzZXIuIiwKKwkuYXR0cl9uYW1lbGVuCT0gc2l6ZW9mKCJ1c2VyLiIpIC0gMSwKKwkuYXR0cl9nZXQJPSBhdHRyX2dlbmVyaWNfZ2V0LAorCS5hdHRyX3NldAk9IGF0dHJfZ2VuZXJpY19zZXQsCisJLmF0dHJfcmVtb3ZlCT0gYXR0cl9nZW5lcmljX3JlbW92ZSwKKwkuYXR0cl9jYXBhYmxlCT0gYXR0cl91c2VyX2NhcGFibGUsCit9OworCitzdHJ1Y3QgYXR0cm5hbWVzICphdHRyX25hbWVzcGFjZXNbXSA9CisJeyAmYXR0cl9zeXN0ZW0sICZhdHRyX3RydXN0ZWQsICZhdHRyX3NlY3VyZSwgJmF0dHJfdXNlciB9OwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hdHRyLmggYi9mcy94ZnMveGZzX2F0dHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2NkMGY1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19hdHRyLmgKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDItMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0FUVFJfSF9fCisjZGVmaW5lCV9fWEZTX0FUVFJfSF9fCisKKy8qCisgKiB4ZnNfYXR0ci5oCisgKgorICogTGFyZ2UgYXR0cmlidXRlIGxpc3RzIGFyZSBzdHJ1Y3R1cmVkIGFyb3VuZCBCdHJlZXMgd2hlcmUgYWxsIHRoZSBkYXRhCisgKiBlbGVtZW50cyBhcmUgaW4gdGhlIGxlYWYgbm9kZXMuICBBdHRyaWJ1dGUgbmFtZXMgYXJlIGhhc2hlZCBpbnRvIGFuIGludCwKKyAqIHRoZW4gdGhhdCBpbnQgaXMgdXNlZCBhcyB0aGUgaW5kZXggaW50byB0aGUgQnRyZWUuICBTaW5jZSB0aGUgaGFzaHZhbAorICogb2YgYW4gYXR0cmlidXRlIG5hbWUgbWF5IG5vdCBiZSB1bmlxdWUsIHdlIG1heSBoYXZlIGR1cGxpY2F0ZSBrZXlzLgorICogVGhlIGludGVybmFsIGxpbmtzIGluIHRoZSBCdHJlZSBhcmUgbG9naWNhbCBibG9jayBvZmZzZXRzIGludG8gdGhlIGZpbGUuCisgKgorICogU21hbGwgYXR0cmlidXRlIGxpc3RzIHVzZSBhIGRpZmZlcmVudCBmb3JtYXQgYW5kIGFyZSBwYWNrZWQgYXMgdGlnaHRseQorICogYXMgcG9zc2libGUgc28gYXMgdG8gZml0IGludG8gdGhlIGxpdGVyYWwgYXJlYSBvZiB0aGUgaW5vZGUuCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEV4dGVybmFsIGludGVyZmFjZXMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RydWN0IGNyZWQ7CitzdHJ1Y3Qgdm5vZGU7CisKK3R5cGVkZWYgaW50ICgqYXR0cnNldF90KShzdHJ1Y3Qgdm5vZGUgKiwgY2hhciAqLCB2b2lkICosIHNpemVfdCwgaW50KTsKK3R5cGVkZWYgaW50ICgqYXR0cmdldF90KShzdHJ1Y3Qgdm5vZGUgKiwgY2hhciAqLCB2b2lkICosIHNpemVfdCwgaW50KTsKK3R5cGVkZWYgaW50ICgqYXR0cnJlbW92ZV90KShzdHJ1Y3Qgdm5vZGUgKiwgY2hhciAqLCBpbnQpOwordHlwZWRlZiBpbnQgKCphdHRyZXhpc3RzX3QpKHN0cnVjdCB2bm9kZSAqKTsKK3R5cGVkZWYgaW50ICgqYXR0cmNhcGFibGVfdCkoc3RydWN0IHZub2RlICosIHN0cnVjdCBjcmVkICopOworCit0eXBlZGVmIHN0cnVjdCBhdHRybmFtZXMgeworCWNoYXIgKgkJYXR0cl9uYW1lOworCXVuc2lnbmVkIGludAlhdHRyX25hbWVsZW47CisJdW5zaWduZWQgaW50CWF0dHJfZmxhZzsKKwlhdHRyZ2V0X3QJYXR0cl9nZXQ7CisJYXR0cnNldF90CWF0dHJfc2V0OworCWF0dHJyZW1vdmVfdAlhdHRyX3JlbW92ZTsKKwlhdHRyZXhpc3RzX3QJYXR0cl9leGlzdHM7CisJYXR0cmNhcGFibGVfdAlhdHRyX2NhcGFibGU7Cit9IGF0dHJuYW1lc190OworCisjZGVmaW5lIEFUVFJfTkFNRUNPVU5UCTQKK2V4dGVybiBzdHJ1Y3QgYXR0cm5hbWVzIGF0dHJfdXNlcjsKK2V4dGVybiBzdHJ1Y3QgYXR0cm5hbWVzIGF0dHJfc2VjdXJlOworZXh0ZXJuIHN0cnVjdCBhdHRybmFtZXMgYXR0cl9zeXN0ZW07CitleHRlcm4gc3RydWN0IGF0dHJuYW1lcyBhdHRyX3RydXN0ZWQ7CitleHRlcm4gc3RydWN0IGF0dHJuYW1lcyAqYXR0cl9uYW1lc3BhY2VzW0FUVFJfTkFNRUNPVU5UXTsKKworI2RlZmluZSBBVFRSX1NZU0NPVU5UCTIKK2V4dGVybiBzdHJ1Y3QgYXR0cm5hbWVzIHBvc2l4X2FjbF9hY2Nlc3M7CitleHRlcm4gc3RydWN0IGF0dHJuYW1lcyBwb3NpeF9hY2xfZGVmYXVsdDsKK2V4dGVybiBzdHJ1Y3QgYXR0cm5hbWVzICphdHRyX3N5c3RlbV9uYW1lc1tBVFRSX1NZU0NPVU5UXTsKKworZXh0ZXJuIGF0dHJuYW1lc190ICphdHRyX2xvb2t1cF9uYW1lc3BhY2UoY2hhciAqLCBhdHRybmFtZXNfdCAqKiwgaW50KTsKK2V4dGVybiBpbnQgYXR0cl9nZW5lcmljX2xpc3Qoc3RydWN0IHZub2RlICosIHZvaWQgKiwgc2l6ZV90LCBpbnQsIHNzaXplX3QgKik7CisKKyNkZWZpbmUgQVRUUl9ET05URk9MTE9XCTB4MDAwMQkvKiAtLSB1bnVzZWQsIGZyb20gSVJJWCAtLSAqLworI2RlZmluZSBBVFRSX1JPT1QJMHgwMDAyCS8qIHVzZSBhdHRycyBpbiByb290ICh0cnVzdGVkKSBuYW1lc3BhY2UgKi8KKyNkZWZpbmUgQVRUUl9UUlVTVAkweDAwMDQJLyogLS0gdW51c2VkLCBmcm9tIElSSVggLS0gKi8KKyNkZWZpbmUgQVRUUl9TRUNVUkUJMHgwMDA4CS8qIHVzZSBhdHRycyBpbiBzZWN1cml0eSBuYW1lc3BhY2UgKi8KKyNkZWZpbmUgQVRUUl9DUkVBVEUJMHgwMDEwCS8qIHB1cmUgY3JlYXRlOiBmYWlsIGlmIGF0dHIgYWxyZWFkeSBleGlzdHMgKi8KKyNkZWZpbmUgQVRUUl9SRVBMQUNFCTB4MDAyMAkvKiBwdXJlIHNldDogZmFpbCBpZiBhdHRyIGRvZXMgbm90IGV4aXN0ICovCisjZGVmaW5lIEFUVFJfU1lTVEVNCTB4MDEwMAkvKiB1c2UgYXR0cnMgaW4gc3lzdGVtIChwc2V1ZG8pIG5hbWVzcGFjZSAqLworCisjZGVmaW5lIEFUVFJfS0VSTkFDQ0VTUwkweDA0MDAJLyogW2tlcm5lbF0gaWFjY2VzcywgaW5vZGUgaGVsZCBpby1sb2NrZWQgKi8KKyNkZWZpbmUgQVRUUl9LRVJOT1RJTUUJMHgxMDAwCS8qIFtrZXJuZWxdIGRvbid0IHVwZGF0ZSBpbm9kZSB0aW1lc3RhbXBzICovCisjZGVmaW5lIEFUVFJfS0VSTk9WQUwJMHgyMDAwCS8qIFtrZXJuZWxdIGdldCBhdHRyIHNpemUgb25seSwgbm90IHZhbHVlICovCisjZGVmaW5lIEFUVFJfS0VSTkFNRUxTCTB4NDAwMAkvKiBba2VybmVsXSBsaXN0IGF0dHIgbmFtZXMgKHNpbXBsZSBsaXN0KSAqLworCisjZGVmaW5lIEFUVFJfS0VSTk9STUFMUwkweDA4MDAJLyogW2tlcm5lbF0gbm9ybWFsIGF0dHIgbGlzdDogdXNlcitzZWN1cmUgKi8KKyNkZWZpbmUgQVRUUl9LRVJOUk9PVExTCTB4ODAwMAkvKiBba2VybmVsXSBpbmNsdWRlIHJvb3QgaW4gdGhlIGF0dHIgbGlzdCAqLworI2RlZmluZSBBVFRSX0tFUk5GVUxMUwkoQVRUUl9LRVJOT1JNQUxTfEFUVFJfS0VSTlJPT1RMUykKKworLyoKKyAqIFRoZSBtYXhpbXVtIHNpemUgKGludG8gdGhlIGtlcm5lbCBvciByZXR1cm5lZCBmcm9tIHRoZSBrZXJuZWwpIG9mIGFuCisgKiBhdHRyaWJ1dGUgdmFsdWUgb3IgdGhlIGJ1ZmZlciB1c2VkIGZvciBhbiBhdHRyX2xpc3QoKSBjYWxsLiAgTGFyZ2VyCisgKiBzaXplcyB3aWxsIHJlc3VsdCBpbiBhbiBFUkFOR0UgcmV0dXJuIGNvZGUuCisgKi8KKyNkZWZpbmUJQVRUUl9NQVhfVkFMVUVMRU4JKDY0KjEwMjQpCS8qIG1heCBsZW5ndGggb2YgYSB2YWx1ZSAqLworCisvKgorICogRGVmaW5lIGhvdyBsaXN0cyBvZiBhdHRyaWJ1dGUgbmFtZXMgYXJlIHJldHVybmVkIHRvIHRoZSB1c2VyIGZyb20KKyAqIHRoZSBhdHRyX2xpc3QoKSBjYWxsLiAgQSBsYXJnZSwgMzJiaXQgYWxpZ25lZCwgYnVmZmVyIGlzIHBhc3NlZCBpbgorICogYWxvbmcgd2l0aCBpdHMgc2l6ZS4gIFdlIHB1dCBhbiBhcnJheSBvZiBvZmZzZXRzIGF0IHRoZSB0b3AgdGhhdCBlYWNoCisgKiByZWZlcmVuY2UgYW4gYXR0cmxpc3RfZW50X3QgYW5kIHBhY2sgdGhlIGF0dHJsaXN0X2VudF90J3MgYXQgdGhlIGJvdHRvbS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXR0cmxpc3QgeworCV9fczMyCWFsX2NvdW50OwkvKiBudW1iZXIgb2YgZW50cmllcyBpbiBhdHRybGlzdCAqLworCV9fczMyCWFsX21vcmU7CS8qIFQvRjogbW9yZSBhdHRycyAoZG8gY2FsbCBhZ2FpbikgKi8KKwlfX3MzMglhbF9vZmZzZXRbMV07CS8qIGJ5dGUgb2Zmc2V0cyBvZiBhdHRycyBbdmFyLXNpemVkXSAqLworfSBhdHRybGlzdF90OworCisvKgorICogU2hvdyB0aGUgaW50ZXJlc3RpbmcgaW5mbyBhYm91dCBvbmUgYXR0cmlidXRlLiAgVGhpcyBpcyB3aGF0IHRoZQorICogYWxfb2Zmc2V0W2ldIGVudHJ5IHBvaW50cyB0by4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXR0cmxpc3RfZW50IHsJLyogZGF0YSBmcm9tIGF0dHJfbGlzdCgpICovCisJX191MzIJYV92YWx1ZWxlbjsJLyogbnVtYmVyIGJ5dGVzIGluIHZhbHVlIG9mIGF0dHIgKi8KKwljaGFyCWFfbmFtZVsxXTsJLyogYXR0ciBuYW1lIChOVUxMIHRlcm1pbmF0ZWQpICovCit9IGF0dHJsaXN0X2VudF90OworCisvKgorICogR2l2ZW4gYSBwb2ludGVyIHRvIHRoZSAoY2hhciopIGJ1ZmZlciBjb250YWluaW5nIHRoZSBhdHRyX2xpc3QoKSByZXN1bHQsCisgKiBhbmQgYW4gaW5kZXgsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGluZGljYXRlZCBhdHRyaWJ1dGUgaW4gdGhlIGJ1ZmZlci4KKyAqLworI2RlZmluZQlBVFRSX0VOVFJZKGJ1ZmZlciwgaW5kZXgpCQlcCisJKChhdHRybGlzdF9lbnRfdCAqKQkJCVwKKwkgJigoY2hhciAqKWJ1ZmZlcilbICgoYXR0cmxpc3RfdCAqKShidWZmZXIpKS0+YWxfb2Zmc2V0W2luZGV4XSBdKQorCisvKgorICogTXVsdGktYXR0cmlidXRlIG9wZXJhdGlvbiB2ZWN0b3IuCisgKi8KK3R5cGVkZWYgc3RydWN0IGF0dHJfbXVsdGlvcCB7CisJaW50CWFtX29wY29kZTsJLyogb3BlcmF0aW9uIHRvIHBlcmZvcm0gKEFUVFJfT1BfR0VULCBldGMuKSAqLworCWludAlhbV9lcnJvcjsJLyogW291dCBhcmddIHJlc3VsdCBvZiB0aGlzIHN1Yi1vcCAoYW4gZXJybm8pICovCisJY2hhcgkqYW1fYXR0cm5hbWU7CS8qIGF0dHJpYnV0ZSBuYW1lIHRvIHdvcmsgd2l0aCAqLworCWNoYXIJKmFtX2F0dHJ2YWx1ZTsJLyogW2luL291dCBhcmddIGF0dHJpYnV0ZSB2YWx1ZSAocmF3IGJ5dGVzKSAqLworCWludAlhbV9sZW5ndGg7CS8qIFtpbi9vdXQgYXJnXSBsZW5ndGggb2YgdmFsdWUgKi8KKwlpbnQJYW1fZmxhZ3M7CS8qIGJpdHdpc2UgT1Igb2YgYXR0ciBBUEkgZmxhZ3MgZGVmaW5lZCBhYm92ZSAqLworfSBhdHRyX211bHRpb3BfdDsKKworI2RlZmluZSBBVFRSX09QX0dFVAkxCS8qIHJldHVybiB0aGUgaW5kaWNhdGVkIGF0dHIncyB2YWx1ZSAqLworI2RlZmluZSBBVFRSX09QX1NFVAkyCS8qIHNldC9jcmVhdGUgdGhlIGluZGljYXRlZCBhdHRyL3ZhbHVlIHBhaXIgKi8KKyNkZWZpbmUgQVRUUl9PUF9SRU1PVkUJMwkvKiByZW1vdmUgdGhlIGluZGljYXRlZCBhdHRyICovCisKKy8qCisgKiBLZXJuZWwtaW50ZXJuYWwgdmVyc2lvbiBvZiB0aGUgYXR0cmxpc3QgY3Vyc29yLgorICovCit0eXBlZGVmIHN0cnVjdCBhdHRybGlzdF9jdXJzb3Jfa2VybiB7CisJX191MzIJaGFzaHZhbDsJLyogaGFzaCB2YWx1ZSBvZiBuZXh0IGVudHJ5IHRvIGFkZCAqLworCV9fdTMyCWJsa25vOwkJLyogYmxvY2sgY29udGFpbmluZyBlbnRyeSAoc3VnZ2VzdGlvbikgKi8KKwlfX3UzMglvZmZzZXQ7CQkvKiBvZmZzZXQgaW4gbGlzdCBvZiBlcXVhbC1oYXNodmFscyAqLworCV9fdTE2CXBhZDE7CQkvKiBwYWRkaW5nIHRvIG1hdGNoIHVzZXItbGV2ZWwgKi8KKwlfX3U4CXBhZDI7CQkvKiBwYWRkaW5nIHRvIG1hdGNoIHVzZXItbGV2ZWwgKi8KKwlfX3U4CWluaXR0ZWQ7CS8qIFQvRjogY3Vyc29yIGhhcyBiZWVuIGluaXRpYWxpemVkICovCit9IGF0dHJsaXN0X2N1cnNvcl9rZXJuX3Q7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHRoZSBrZXJuZWwuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0cnVjdCB4ZnNfaW5vZGU7CitzdHJ1Y3QgYXR0cmxpc3RfY3Vyc29yX2tlcm47CitzdHJ1Y3QgeGZzX2RhX2FyZ3M7CisKKy8qCisgKiBPdmVyYWxsIGV4dGVybmFsIGludGVyZmFjZSByb3V0aW5lcy4KKyAqLworaW50IHhmc19hdHRyX2dldChiaHZfZGVzY190ICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50LCBzdHJ1Y3QgY3JlZCAqKTsKK2ludCB4ZnNfYXR0cl9zZXQoYmh2X2Rlc2NfdCAqLCBjaGFyICosIGNoYXIgKiwgaW50LCBpbnQsIHN0cnVjdCBjcmVkICopOworaW50IHhmc19hdHRyX3JlbW92ZShiaHZfZGVzY190ICosIGNoYXIgKiwgaW50LCBzdHJ1Y3QgY3JlZCAqKTsKK2ludCB4ZnNfYXR0cl9saXN0KGJodl9kZXNjX3QgKiwgY2hhciAqLCBpbnQsIGludCwKKwkJCSBzdHJ1Y3QgYXR0cmxpc3RfY3Vyc29yX2tlcm4gKiwgc3RydWN0IGNyZWQgKik7CitpbnQgeGZzX2F0dHJfaW5hY3RpdmUoc3RydWN0IHhmc19pbm9kZSAqZHApOworCitpbnQgeGZzX2F0dHJfbm9kZV9nZXQoc3RydWN0IHhmc19kYV9hcmdzICopOworaW50IHhmc19hdHRyX2xlYWZfZ2V0KHN0cnVjdCB4ZnNfZGFfYXJncyAqKTsKK2ludCB4ZnNfYXR0cl9zaG9ydGZvcm1fZ2V0dmFsdWUoc3RydWN0IHhmc19kYV9hcmdzICopOworaW50IHhmc19hdHRyX2ZldGNoKHN0cnVjdCB4ZnNfaW5vZGUgKiwgY2hhciAqLCBpbnQsCisJCQljaGFyICosIGludCAqLCBpbnQsIHN0cnVjdCBjcmVkICopOworCisjZW5kaWYJLyogX19YRlNfQVRUUl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMgYi9mcy94ZnMveGZzX2F0dHJfbGVhZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTI1NmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2F0dHJfbGVhZi5jCkBAIC0wLDAgKzEsMzA1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKy8qCisgKiB4ZnNfYXR0cl9sZWFmLmMKKyAqCisgKiBHUk9UOiBmaWd1cmUgb3V0IGhvdyB0byByZWNvdmVyIGdyYWNlZnVsbHkgd2hlbiBibWFwIHJldHVybnMgRU5PU1BDLgorICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKworI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2F0dHIuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9sZWFmLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorCisvKgorICogeGZzX2F0dHJfbGVhZi5jCisgKgorICogUm91dGluZXMgdG8gaW1wbGVtZW50IGxlYWYgYmxvY2tzIG9mIGF0dHJpYnV0ZXMgYXMgQnRyZWVzIG9mIGhhc2hlZCBuYW1lcy4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgdGhlIGtlcm5lbC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIFJvdXRpbmVzIHVzZWQgZm9yIGdyb3dpbmcgdGhlIEJ0cmVlLgorICovCitTVEFUSUMgaW50IHhmc19hdHRyX2xlYWZfYWRkX3dvcmsoeGZzX2RhYnVmX3QgKmxlYWZfYnVmZmVyLCB4ZnNfZGFfYXJnc190ICphcmdzLAorCQkJCQkgICAgICBpbnQgZnJlZW1hcF9pbmRleCk7CitTVEFUSUMgdm9pZCB4ZnNfYXR0cl9sZWFmX2NvbXBhY3QoeGZzX3RyYW5zX3QgKnRyYW5zLCB4ZnNfZGFidWZfdCAqbGVhZl9idWZmZXIpOworU1RBVElDIHZvaWQgeGZzX2F0dHJfbGVhZl9yZWJhbGFuY2UoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLAorCQkJCQkJICAgeGZzX2RhX3N0YXRlX2Jsa190ICpibGsxLAorCQkJCQkJICAgeGZzX2RhX3N0YXRlX2Jsa190ICpibGsyKTsKK1NUQVRJQyBpbnQgeGZzX2F0dHJfbGVhZl9maWd1cmVfYmFsYW5jZSh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsCisJCQkJCSAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqbGVhZl9ibGtfMSwKKwkJCQkJICAgeGZzX2RhX3N0YXRlX2Jsa190ICpsZWFmX2Jsa18yLAorCQkJCQkgICBpbnQgKm51bWJlcl9lbnRyaWVzX2luX2JsazEsCisJCQkJCSAgIGludCAqbnVtYmVyX3VzZWRieXRlc19pbl9ibGsxKTsKKworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKi8KK1NUQVRJQyB2b2lkIHhmc19hdHRyX2xlYWZfbW92ZWVudHMoeGZzX2F0dHJfbGVhZmJsb2NrX3QgKnNyY19sZWFmLAorCQkJCQkgaW50IHNyY19zdGFydCwKKwkJCQkJIHhmc19hdHRyX2xlYWZibG9ja190ICpkc3RfbGVhZiwKKwkJCQkJIGludCBkc3Rfc3RhcnQsIGludCBtb3ZlX2NvdW50LAorCQkJCQkgeGZzX21vdW50X3QgKm1wKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRXh0ZXJuYWwgcm91dGluZXMgd2hlbiBkaXJzaXplIDwgWEZTX0xJVElOTyhtcCkuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBDcmVhdGUgdGhlIGluaXRpYWwgY29udGVudHMgb2YgYSBzaG9ydGZvcm0gYXR0cmlidXRlIGxpc3QuCisgKi8KK2ludAoreGZzX2F0dHJfc2hvcnRmb3JtX2NyZWF0ZSh4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19hdHRyX3NmX2hkcl90ICpoZHI7CisJeGZzX2lub2RlX3QgKmRwOworCXhmc19pZm9ya190ICppZnA7CisKKwlkcCA9IGFyZ3MtPmRwOworCUFTU0VSVChkcCAhPSBOVUxMKTsKKwlpZnAgPSBkcC0+aV9hZnA7CisJQVNTRVJUKGlmcCAhPSBOVUxMKTsKKwlBU1NFUlQoaWZwLT5pZl9ieXRlcyA9PSAwKTsKKwlpZiAoZHAtPmlfZC5kaV9hZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMpIHsKKwkJaWZwLT5pZl9mbGFncyAmPSB+WEZTX0lGRVhURU5UUzsJLyoganVzdCBpbiBjYXNlICovCisJCWRwLT5pX2QuZGlfYWZvcm1hdCA9IFhGU19ESU5PREVfRk1UX0xPQ0FMOworCQlpZnAtPmlmX2ZsYWdzIHw9IFhGU19JRklOTElORTsKKwl9IGVsc2UgeworCQlBU1NFUlQoaWZwLT5pZl9mbGFncyAmIFhGU19JRklOTElORSk7CisJfQorCXhmc19pZGF0YV9yZWFsbG9jKGRwLCBzaXplb2YoKmhkciksIFhGU19BVFRSX0ZPUkspOworCWhkciA9ICh4ZnNfYXR0cl9zZl9oZHJfdCAqKWlmcC0+aWZfdTEuaWZfZGF0YTsKKwloZHItPmNvdW50ID0gMDsKKwlJTlRfU0VUKGhkci0+dG90c2l6ZSwgQVJDSF9DT05WRVJULCBzaXplb2YoKmhkcikpOworCXhmc190cmFuc19sb2dfaW5vZGUoYXJncy0+dHJhbnMsIGRwLCBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfQURBVEEpOworCXJldHVybigwKTsKK30KKworLyoKKyAqIEFkZCBhIG5hbWUvdmFsdWUgcGFpciB0byB0aGUgc2hvcnRmb3JtIGF0dHJpYnV0ZSBsaXN0LgorICogT3ZlcmZsb3cgZnJvbSB0aGUgaW5vZGUgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGZvci4KKyAqLworaW50Cit4ZnNfYXR0cl9zaG9ydGZvcm1fYWRkKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2F0dHJfc2hvcnRmb3JtX3QgKnNmOworCXhmc19hdHRyX3NmX2VudHJ5X3QgKnNmZTsKKwlpbnQgaSwgb2Zmc2V0LCBzaXplOworCXhmc19pbm9kZV90ICpkcDsKKwl4ZnNfaWZvcmtfdCAqaWZwOworCisJZHAgPSBhcmdzLT5kcDsKKwlpZnAgPSBkcC0+aV9hZnA7CisJQVNTRVJUKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZJTkxJTkUpOworCXNmID0gKHhmc19hdHRyX3Nob3J0Zm9ybV90ICopaWZwLT5pZl91MS5pZl9kYXRhOworCXNmZSA9ICZzZi0+bGlzdFswXTsKKwlmb3IgKGkgPSAwOyBpIDwgSU5UX0dFVChzZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQkJCXNmZSA9IFhGU19BVFRSX1NGX05FWFRFTlRSWShzZmUpLCBpKyspIHsKKwkJaWYgKHNmZS0+bmFtZWxlbiAhPSBhcmdzLT5uYW1lbGVuKQorCQkJY29udGludWU7CisJCWlmIChtZW1jbXAoYXJncy0+bmFtZSwgc2ZlLT5uYW1ldmFsLCBhcmdzLT5uYW1lbGVuKSAhPSAwKQorCQkJY29udGludWU7CisJCWlmICgoKGFyZ3MtPmZsYWdzICYgQVRUUl9TRUNVUkUpICE9IDApICE9CisJCSAgICAoKHNmZS0+ZmxhZ3MgJiBYRlNfQVRUUl9TRUNVUkUpICE9IDApKQorCQkJY29udGludWU7CisJCWlmICgoKGFyZ3MtPmZsYWdzICYgQVRUUl9ST09UKSAhPSAwKSAhPQorCQkgICAgKChzZmUtPmZsYWdzICYgWEZTX0FUVFJfUk9PVCkgIT0gMCkpCisJCQljb250aW51ZTsKKwkJcmV0dXJuKFhGU19FUlJPUihFRVhJU1QpKTsKKwl9CisKKwlvZmZzZXQgPSAoY2hhciAqKXNmZSAtIChjaGFyICopc2Y7CisJc2l6ZSA9IFhGU19BVFRSX1NGX0VOVFNJWkVfQllOQU1FKGFyZ3MtPm5hbWVsZW4sIGFyZ3MtPnZhbHVlbGVuKTsKKwl4ZnNfaWRhdGFfcmVhbGxvYyhkcCwgc2l6ZSwgWEZTX0FUVFJfRk9SSyk7CisJc2YgPSAoeGZzX2F0dHJfc2hvcnRmb3JtX3QgKilpZnAtPmlmX3UxLmlmX2RhdGE7CisJc2ZlID0gKHhmc19hdHRyX3NmX2VudHJ5X3QgKikoKGNoYXIgKilzZiArIG9mZnNldCk7CisKKwlzZmUtPm5hbWVsZW4gPSBhcmdzLT5uYW1lbGVuOworCUlOVF9TRVQoc2ZlLT52YWx1ZWxlbiwgQVJDSF9DT05WRVJULCBhcmdzLT52YWx1ZWxlbik7CisJc2ZlLT5mbGFncyA9IChhcmdzLT5mbGFncyAmIEFUVFJfU0VDVVJFKSA/IFhGU19BVFRSX1NFQ1VSRSA6CisJCQkoKGFyZ3MtPmZsYWdzICYgQVRUUl9ST09UKSA/IFhGU19BVFRSX1JPT1QgOiAwKTsKKwltZW1jcHkoc2ZlLT5uYW1ldmFsLCBhcmdzLT5uYW1lLCBhcmdzLT5uYW1lbGVuKTsKKwltZW1jcHkoJnNmZS0+bmFtZXZhbFthcmdzLT5uYW1lbGVuXSwgYXJncy0+dmFsdWUsIGFyZ3MtPnZhbHVlbGVuKTsKKwlJTlRfTU9EKHNmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCwgMSk7CisJSU5UX01PRChzZi0+aGRyLnRvdHNpemUsIEFSQ0hfQ09OVkVSVCwgc2l6ZSk7CisJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19BREFUQSk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBSZW1vdmUgYSBuYW1lIGZyb20gdGhlIHNob3J0Zm9ybSBhdHRyaWJ1dGUgbGlzdCBzdHJ1Y3R1cmUuCisgKi8KK2ludAoreGZzX2F0dHJfc2hvcnRmb3JtX3JlbW92ZSh4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19hdHRyX3Nob3J0Zm9ybV90ICpzZjsKKwl4ZnNfYXR0cl9zZl9lbnRyeV90ICpzZmU7CisJaW50IGJhc2UsIHNpemU9MCwgZW5kLCB0b3RzaXplLCBpOworCXhmc19pbm9kZV90ICpkcDsKKworCS8qCisJICogUmVtb3ZlIHRoZSBhdHRyaWJ1dGUuCisJICovCisJZHAgPSBhcmdzLT5kcDsKKwliYXNlID0gc2l6ZW9mKHhmc19hdHRyX3NmX2hkcl90KTsKKwlzZiA9ICh4ZnNfYXR0cl9zaG9ydGZvcm1fdCAqKWRwLT5pX2FmcC0+aWZfdTEuaWZfZGF0YTsKKwlzZmUgPSAmc2YtPmxpc3RbMF07CisJZm9yIChpID0gMDsgaSA8IElOVF9HRVQoc2YtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJCQlzZmUgPSBYRlNfQVRUUl9TRl9ORVhURU5UUlkoc2ZlKSwKKwkJCQkJYmFzZSArPSBzaXplLCBpKyspIHsKKwkJc2l6ZSA9IFhGU19BVFRSX1NGX0VOVFNJWkUoc2ZlKTsKKwkJaWYgKHNmZS0+bmFtZWxlbiAhPSBhcmdzLT5uYW1lbGVuKQorCQkJY29udGludWU7CisJCWlmIChtZW1jbXAoc2ZlLT5uYW1ldmFsLCBhcmdzLT5uYW1lLCBhcmdzLT5uYW1lbGVuKSAhPSAwKQorCQkJY29udGludWU7CisJCWlmICgoKGFyZ3MtPmZsYWdzICYgQVRUUl9TRUNVUkUpICE9IDApICE9CisJCSAgICAoKHNmZS0+ZmxhZ3MgJiBYRlNfQVRUUl9TRUNVUkUpICE9IDApKQorCQkJY29udGludWU7CisJCWlmICgoKGFyZ3MtPmZsYWdzICYgQVRUUl9ST09UKSAhPSAwKSAhPQorCQkgICAgKChzZmUtPmZsYWdzICYgWEZTX0FUVFJfUk9PVCkgIT0gMCkpCisJCQljb250aW51ZTsKKwkJYnJlYWs7CisJfQorCWlmIChpID09IElOVF9HRVQoc2YtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkKKwkJcmV0dXJuKFhGU19FUlJPUihFTk9BVFRSKSk7CisKKwllbmQgPSBiYXNlICsgc2l6ZTsKKwl0b3RzaXplID0gSU5UX0dFVChzZi0+aGRyLnRvdHNpemUsIEFSQ0hfQ09OVkVSVCk7CisJaWYgKGVuZCAhPSB0b3RzaXplKSB7CisJCW1lbW1vdmUoJigoY2hhciAqKXNmKVtiYXNlXSwgJigoY2hhciAqKXNmKVtlbmRdLAorCQkJCQkJCXRvdHNpemUgLSBlbmQpOworCX0KKwlJTlRfTU9EKHNmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCwgLTEpOworCUlOVF9NT0Qoc2YtPmhkci50b3RzaXplLCBBUkNIX0NPTlZFUlQsIC1zaXplKTsKKwl4ZnNfaWRhdGFfcmVhbGxvYyhkcCwgLXNpemUsIFhGU19BVFRSX0ZPUkspOworCXhmc190cmFuc19sb2dfaW5vZGUoYXJncy0+dHJhbnMsIGRwLCBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfQURBVEEpOworCisJcmV0dXJuKDApOworfQorCisvKgorICogTG9vayB1cCBhIG5hbWUgaW4gYSBzaG9ydGZvcm0gYXR0cmlidXRlIGxpc3Qgc3RydWN0dXJlLgorICovCisvKkFSR1NVU0VEKi8KK2ludAoreGZzX2F0dHJfc2hvcnRmb3JtX2xvb2t1cCh4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19hdHRyX3Nob3J0Zm9ybV90ICpzZjsKKwl4ZnNfYXR0cl9zZl9lbnRyeV90ICpzZmU7CisJaW50IGk7CisJeGZzX2lmb3JrX3QgKmlmcDsKKworCWlmcCA9IGFyZ3MtPmRwLT5pX2FmcDsKKwlBU1NFUlQoaWZwLT5pZl9mbGFncyAmIFhGU19JRklOTElORSk7CisJc2YgPSAoeGZzX2F0dHJfc2hvcnRmb3JtX3QgKilpZnAtPmlmX3UxLmlmX2RhdGE7CisJc2ZlID0gJnNmLT5saXN0WzBdOworCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKHNmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCQkJc2ZlID0gWEZTX0FUVFJfU0ZfTkVYVEVOVFJZKHNmZSksIGkrKykgeworCQlpZiAoc2ZlLT5uYW1lbGVuICE9IGFyZ3MtPm5hbWVsZW4pCisJCQljb250aW51ZTsKKwkJaWYgKG1lbWNtcChhcmdzLT5uYW1lLCBzZmUtPm5hbWV2YWwsIGFyZ3MtPm5hbWVsZW4pICE9IDApCisJCQljb250aW51ZTsKKwkJaWYgKCgoYXJncy0+ZmxhZ3MgJiBBVFRSX1NFQ1VSRSkgIT0gMCkgIT0KKwkJICAgICgoc2ZlLT5mbGFncyAmIFhGU19BVFRSX1NFQ1VSRSkgIT0gMCkpCisJCQljb250aW51ZTsKKwkJaWYgKCgoYXJncy0+ZmxhZ3MgJiBBVFRSX1JPT1QpICE9IDApICE9CisJCSAgICAoKHNmZS0+ZmxhZ3MgJiBYRlNfQVRUUl9ST09UKSAhPSAwKSkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4oWEZTX0VSUk9SKEVFWElTVCkpOworCX0KKwlyZXR1cm4oWEZTX0VSUk9SKEVOT0FUVFIpKTsKK30KKworLyoKKyAqIExvb2sgdXAgYSBuYW1lIGluIGEgc2hvcnRmb3JtIGF0dHJpYnV0ZSBsaXN0IHN0cnVjdHVyZS4KKyAqLworLypBUkdTVVNFRCovCitpbnQKK3hmc19hdHRyX3Nob3J0Zm9ybV9nZXR2YWx1ZSh4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19hdHRyX3Nob3J0Zm9ybV90ICpzZjsKKwl4ZnNfYXR0cl9zZl9lbnRyeV90ICpzZmU7CisJaW50IGk7CisKKwlBU1NFUlQoYXJncy0+ZHAtPmlfZC5kaV9hZm9ybWF0ID09IFhGU19JRklOTElORSk7CisJc2YgPSAoeGZzX2F0dHJfc2hvcnRmb3JtX3QgKilhcmdzLT5kcC0+aV9hZnAtPmlmX3UxLmlmX2RhdGE7CisJc2ZlID0gJnNmLT5saXN0WzBdOworCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKHNmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCQkJc2ZlID0gWEZTX0FUVFJfU0ZfTkVYVEVOVFJZKHNmZSksIGkrKykgeworCQlpZiAoc2ZlLT5uYW1lbGVuICE9IGFyZ3MtPm5hbWVsZW4pCisJCQljb250aW51ZTsKKwkJaWYgKG1lbWNtcChhcmdzLT5uYW1lLCBzZmUtPm5hbWV2YWwsIGFyZ3MtPm5hbWVsZW4pICE9IDApCisJCQljb250aW51ZTsKKwkJaWYgKCgoYXJncy0+ZmxhZ3MgJiBBVFRSX1NFQ1VSRSkgIT0gMCkgIT0KKwkJICAgICgoc2ZlLT5mbGFncyAmIFhGU19BVFRSX1NFQ1VSRSkgIT0gMCkpCisJCQljb250aW51ZTsKKwkJaWYgKCgoYXJncy0+ZmxhZ3MgJiBBVFRSX1JPT1QpICE9IDApICE9CisJCSAgICAoKHNmZS0+ZmxhZ3MgJiBYRlNfQVRUUl9ST09UKSAhPSAwKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoYXJncy0+ZmxhZ3MgJiBBVFRSX0tFUk5PVkFMKSB7CisJCQlhcmdzLT52YWx1ZWxlbiA9IElOVF9HRVQoc2ZlLT52YWx1ZWxlbiwgQVJDSF9DT05WRVJUKTsKKwkJCXJldHVybihYRlNfRVJST1IoRUVYSVNUKSk7CisJCX0KKwkJaWYgKGFyZ3MtPnZhbHVlbGVuIDwgSU5UX0dFVChzZmUtPnZhbHVlbGVuLCBBUkNIX0NPTlZFUlQpKSB7CisJCQlhcmdzLT52YWx1ZWxlbiA9IElOVF9HRVQoc2ZlLT52YWx1ZWxlbiwgQVJDSF9DT05WRVJUKTsKKwkJCXJldHVybihYRlNfRVJST1IoRVJBTkdFKSk7CisJCX0KKwkJYXJncy0+dmFsdWVsZW4gPSBJTlRfR0VUKHNmZS0+dmFsdWVsZW4sIEFSQ0hfQ09OVkVSVCk7CisJCW1lbWNweShhcmdzLT52YWx1ZSwgJnNmZS0+bmFtZXZhbFthcmdzLT5uYW1lbGVuXSwKKwkJCQkJCSAgICBhcmdzLT52YWx1ZWxlbik7CisJCXJldHVybihYRlNfRVJST1IoRUVYSVNUKSk7CisJfQorCXJldHVybihYRlNfRVJST1IoRU5PQVRUUikpOworfQorCisvKgorICogQ29udmVydCBmcm9tIHVzaW5nIHRoZSBzaG9ydGZvcm0gdG8gdGhlIGxlYWYuCisgKi8KK2ludAoreGZzX2F0dHJfc2hvcnRmb3JtX3RvX2xlYWYoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwl4ZnNfaW5vZGVfdCAqZHA7CisJeGZzX2F0dHJfc2hvcnRmb3JtX3QgKnNmOworCXhmc19hdHRyX3NmX2VudHJ5X3QgKnNmZTsKKwl4ZnNfZGFfYXJnc190IG5hcmdzOworCWNoYXIgKnRtcGJ1ZmZlcjsKKwlpbnQgZXJyb3IsIGksIHNpemU7CisJeGZzX2RhYmxrX3QgYmxrbm87CisJeGZzX2RhYnVmX3QgKmJwOworCXhmc19pZm9ya190ICppZnA7CisKKwlkcCA9IGFyZ3MtPmRwOworCWlmcCA9IGRwLT5pX2FmcDsKKwlzZiA9ICh4ZnNfYXR0cl9zaG9ydGZvcm1fdCAqKWlmcC0+aWZfdTEuaWZfZGF0YTsKKwlzaXplID0gSU5UX0dFVChzZi0+aGRyLnRvdHNpemUsIEFSQ0hfQ09OVkVSVCk7CisJdG1wYnVmZmVyID0ga21lbV9hbGxvYyhzaXplLCBLTV9TTEVFUCk7CisJQVNTRVJUKHRtcGJ1ZmZlciAhPSBOVUxMKTsKKwltZW1jcHkodG1wYnVmZmVyLCBpZnAtPmlmX3UxLmlmX2RhdGEsIHNpemUpOworCXNmID0gKHhmc19hdHRyX3Nob3J0Zm9ybV90ICopdG1wYnVmZmVyOworCisJeGZzX2lkYXRhX3JlYWxsb2MoZHAsIC1zaXplLCBYRlNfQVRUUl9GT1JLKTsKKwlicCA9IE5VTEw7CisJZXJyb3IgPSB4ZnNfZGFfZ3Jvd19pbm9kZShhcmdzLCAmYmxrbm8pOworCWlmIChlcnJvcikgeworCQkvKgorCQkgKiBJZiB3ZSBoaXQgYW4gSU8gZXJyb3IgbWlkZGxlIG9mIHRoZSB0cmFuc2FjdGlvbiBpbnNpZGUKKwkJICogZ3Jvd19pbm9kZSgpLCB3ZSBtYXkgaGF2ZSBpbmNvbnNpc3RlbnQgZGF0YS4gQmFpbCBvdXQuCisJCSAqLworCQlpZiAoZXJyb3IgPT0gRUlPKQorCQkJZ290byBvdXQ7CisJCXhmc19pZGF0YV9yZWFsbG9jKGRwLCBzaXplLCBYRlNfQVRUUl9GT1JLKTsJLyogdHJ5IHRvIHB1dCAqLworCQltZW1jcHkoaWZwLT5pZl91MS5pZl9kYXRhLCB0bXBidWZmZXIsIHNpemUpOwkvKiBpdCBiYWNrICovCisJCWdvdG8gb3V0OworCX0KKworCUFTU0VSVChibGtubyA9PSAwKTsKKwllcnJvciA9IHhmc19hdHRyX2xlYWZfY3JlYXRlKGFyZ3MsIGJsa25vLCAmYnApOworCWlmIChlcnJvcikgeworCQllcnJvciA9IHhmc19kYV9zaHJpbmtfaW5vZGUoYXJncywgMCwgYnApOworCQlicCA9IE5VTEw7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCQl4ZnNfaWRhdGFfcmVhbGxvYyhkcCwgc2l6ZSwgWEZTX0FUVFJfRk9SSyk7CS8qIHRyeSB0byBwdXQgKi8KKwkJbWVtY3B5KGlmcC0+aWZfdTEuaWZfZGF0YSwgdG1wYnVmZmVyLCBzaXplKTsJLyogaXQgYmFjayAqLworCQlnb3RvIG91dDsKKwl9CisKKwltZW1zZXQoKGNoYXIgKikmbmFyZ3MsIDAsIHNpemVvZihuYXJncykpOworCW5hcmdzLmRwID0gZHA7CisJbmFyZ3MuZmlyc3RibG9jayA9IGFyZ3MtPmZpcnN0YmxvY2s7CisJbmFyZ3MuZmxpc3QgPSBhcmdzLT5mbGlzdDsKKwluYXJncy50b3RhbCA9IGFyZ3MtPnRvdGFsOworCW5hcmdzLndoaWNoZm9yayA9IFhGU19BVFRSX0ZPUks7CisJbmFyZ3MudHJhbnMgPSBhcmdzLT50cmFuczsKKwluYXJncy5va25vZW50ID0gMTsKKworCXNmZSA9ICZzZi0+bGlzdFswXTsKKwlmb3IgKGkgPSAwOyBpIDwgSU5UX0dFVChzZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOyBpKyspIHsKKwkJbmFyZ3MubmFtZSA9IChjaGFyICopc2ZlLT5uYW1ldmFsOworCQluYXJncy5uYW1lbGVuID0gc2ZlLT5uYW1lbGVuOworCQluYXJncy52YWx1ZSA9IChjaGFyICopJnNmZS0+bmFtZXZhbFtuYXJncy5uYW1lbGVuXTsKKwkJbmFyZ3MudmFsdWVsZW4gPSBJTlRfR0VUKHNmZS0+dmFsdWVsZW4sIEFSQ0hfQ09OVkVSVCk7CisJCW5hcmdzLmhhc2h2YWwgPSB4ZnNfZGFfaGFzaG5hbWUoKGNoYXIgKilzZmUtPm5hbWV2YWwsCisJCQkJCQlzZmUtPm5hbWVsZW4pOworCQluYXJncy5mbGFncyA9IChzZmUtPmZsYWdzICYgWEZTX0FUVFJfU0VDVVJFKSA/IEFUVFJfU0VDVVJFIDoKKwkJCQkoKHNmZS0+ZmxhZ3MgJiBYRlNfQVRUUl9ST09UKSA/IEFUVFJfUk9PVCA6IDApOworCQllcnJvciA9IHhmc19hdHRyX2xlYWZfbG9va3VwX2ludChicCwgJm5hcmdzKTsgLyogc2V0IGEtPmluZGV4ICovCisJCUFTU0VSVChlcnJvciA9PSBFTk9BVFRSKTsKKwkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX2FkZChicCwgJm5hcmdzKTsKKwkJQVNTRVJUKGVycm9yICE9IEVOT1NQQyk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCQlzZmUgPSBYRlNfQVRUUl9TRl9ORVhURU5UUlkoc2ZlKTsKKwl9CisJZXJyb3IgPSAwOworCitvdXQ6CisJaWYoYnApCisJCXhmc19kYV9idWZfZG9uZShicCk7CisJa21lbV9mcmVlKHRtcGJ1ZmZlciwgc2l6ZSk7CisJcmV0dXJuKGVycm9yKTsKK30KKworU1RBVElDIGludAoreGZzX2F0dHJfc2hvcnRmb3JtX2NvbXBhcmUoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwl4ZnNfYXR0cl9zZl9zb3J0X3QgKnNhLCAqc2I7CisKKwlzYSA9ICh4ZnNfYXR0cl9zZl9zb3J0X3QgKilhOworCXNiID0gKHhmc19hdHRyX3NmX3NvcnRfdCAqKWI7CisJaWYgKElOVF9HRVQoc2EtPmhhc2gsIEFSQ0hfQ09OVkVSVCkKKwkJCQk8IElOVF9HRVQoc2ItPmhhc2gsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJcmV0dXJuKC0xKTsKKwl9IGVsc2UgaWYgKElOVF9HRVQoc2EtPmhhc2gsIEFSQ0hfQ09OVkVSVCkKKwkJCQk+IElOVF9HRVQoc2ItPmhhc2gsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJcmV0dXJuKDEpOworCX0gZWxzZSB7CisJCXJldHVybihzYS0+ZW50bm8gLSBzYi0+ZW50bm8pOworCX0KK30KKworLyoKKyAqIENvcHkgb3V0IGVudHJpZXMgb2Ygc2hvcnRmb3JtIGF0dHJpYnV0ZSBsaXN0cyBmb3IgYXR0cl9saXN0KCkuCisgKiBTaG9ydGZvcm0gYXRydHJpYnV0ZSBsaXN0cyBhcmUgbm90IHN0b3JlZCBpbiBoYXNodmFsIHNvcnRlZCBvcmRlci4KKyAqIElmIHRoZSBvdXRwdXQgYnVmZmVyIGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGVtIGFsbCwgdGhlbiB3ZQorICogd2UgaGF2ZSB0byBjYWxjdWxhdGUgZWFjaCBlbnRyaWVzJyBoYXNodmFsdWUgYW5kIHNvcnQgdGhlbSBiZWZvcmUKKyAqIHdlIGNhbiBiZWdpbiByZXR1cm5pbmcgdGhlbSB0byB0aGUgdXNlci4KKyAqLworLypBUkdTVVNFRCovCitpbnQKK3hmc19hdHRyX3Nob3J0Zm9ybV9saXN0KHhmc19hdHRyX2xpc3RfY29udGV4dF90ICpjb250ZXh0KQoreworCWF0dHJsaXN0X2N1cnNvcl9rZXJuX3QgKmN1cnNvcjsKKwl4ZnNfYXR0cl9zZl9zb3J0X3QgKnNidWYsICpzYnA7CisJeGZzX2F0dHJfc2hvcnRmb3JtX3QgKnNmOworCXhmc19hdHRyX3NmX2VudHJ5X3QgKnNmZTsKKwl4ZnNfaW5vZGVfdCAqZHA7CisJaW50IHNic2l6ZSwgbnNidWYsIGNvdW50LCBpOworCisJQVNTRVJUKGNvbnRleHQgIT0gTlVMTCk7CisJZHAgPSBjb250ZXh0LT5kcDsKKwlBU1NFUlQoZHAgIT0gTlVMTCk7CisJQVNTRVJUKGRwLT5pX2FmcCAhPSBOVUxMKTsKKwlzZiA9ICh4ZnNfYXR0cl9zaG9ydGZvcm1fdCAqKWRwLT5pX2FmcC0+aWZfdTEuaWZfZGF0YTsKKwlBU1NFUlQoc2YgIT0gTlVMTCk7CisJaWYgKCFzZi0+aGRyLmNvdW50KQorCQlyZXR1cm4oMCk7CisJY3Vyc29yID0gY29udGV4dC0+Y3Vyc29yOworCUFTU0VSVChjdXJzb3IgIT0gTlVMTCk7CisKKwl4ZnNfYXR0cl90cmFjZV9sX2MoInNmIHN0YXJ0IiwgY29udGV4dCk7CisKKwkvKgorCSAqIElmIHRoZSBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoLCBkbyBub3QgYm90aGVyIHdpdGggc29ydGluZy4KKwkgKiBOb3RlIHRoZSBnZW5lcm91cyBmdWRnZSBmYWN0b3Igb2YgMTYgb3ZlcmhlYWQgYnl0ZXMgcGVyIGVudHJ5LgorCSAqLworCWlmICgoZHAtPmlfYWZwLT5pZl9ieXRlcyArIElOVF9HRVQoc2YtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAqIDE2KQorCQkJCQkJCTwgY29udGV4dC0+YnVmc2l6ZSkgeworCQlmb3IgKGkgPSAwLCBzZmUgPSAmc2YtPmxpc3RbMF07CisJCQkJaSA8IElOVF9HRVQoc2YtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsgaSsrKSB7CisJCQlhdHRybmFtZXNfdAkqbmFtZXNwOworCisJCQlpZiAoKChjb250ZXh0LT5mbGFncyAmIEFUVFJfU0VDVVJFKSAhPSAwKSAhPQorCQkJICAgICgoc2ZlLT5mbGFncyAmIFhGU19BVFRSX1NFQ1VSRSkgIT0gMCkgJiYKKwkJCSAgICAhKGNvbnRleHQtPmZsYWdzICYgQVRUUl9LRVJOT1JNQUxTKSkgeworCQkJCXNmZSA9IFhGU19BVFRSX1NGX05FWFRFTlRSWShzZmUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCgoY29udGV4dC0+ZmxhZ3MgJiBBVFRSX1JPT1QpICE9IDApICE9CisJCQkgICAgKChzZmUtPmZsYWdzICYgWEZTX0FUVFJfUk9PVCkgIT0gMCkgJiYKKwkJCSAgICAhKGNvbnRleHQtPmZsYWdzICYgQVRUUl9LRVJOUk9PVExTKSkgeworCQkJCXNmZSA9IFhGU19BVFRSX1NGX05FWFRFTlRSWShzZmUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbmFtZXNwID0gKHNmZS0+ZmxhZ3MgJiBYRlNfQVRUUl9TRUNVUkUpID8gJmF0dHJfc2VjdXJlOgorCQkJCSgoc2ZlLT5mbGFncyAmIFhGU19BVFRSX1JPT1QpID8gJmF0dHJfdHJ1c3RlZCA6CisJCQkJICAmYXR0cl91c2VyKTsKKwkJCWlmIChjb250ZXh0LT5mbGFncyAmIEFUVFJfS0VSTk9WQUwpIHsKKwkJCQlBU1NFUlQoY29udGV4dC0+ZmxhZ3MgJiBBVFRSX0tFUk5BTUVMUyk7CisJCQkJY29udGV4dC0+Y291bnQgKz0gbmFtZXNwLT5hdHRyX25hbWVsZW4gKworCQkJCQlJTlRfR0VUKHNmZS0+bmFtZWxlbiwgQVJDSF9DT05WRVJUKSArIDE7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAoeGZzX2F0dHJfcHV0X2xpc3RlbnQoY29udGV4dCwgbmFtZXNwLAorCQkJCQkJICAgKGNoYXIgKilzZmUtPm5hbWV2YWwsCisJCQkJCQkgICAoaW50KXNmZS0+bmFtZWxlbiwKKwkJCQkJCSAgIChpbnQpSU5UX0dFVChzZmUtPnZhbHVlbGVuLAorCQkJCQkJCQlBUkNIX0NPTlZFUlQpKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlzZmUgPSBYRlNfQVRUUl9TRl9ORVhURU5UUlkoc2ZlKTsKKwkJfQorCQl4ZnNfYXR0cl90cmFjZV9sX2MoInNmIGJpZy1ndWxwIiwgY29udGV4dCk7CisJCXJldHVybigwKTsKKwl9CisKKwkvKgorCSAqIEl0IGRpZG4ndCBhbGwgZml0LCBzbyB3ZSBoYXZlIHRvIHNvcnQgZXZlcnl0aGluZyBvbiBoYXNodmFsLgorCSAqLworCXNic2l6ZSA9IElOVF9HRVQoc2YtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqc2J1Zik7CisJc2JwID0gc2J1ZiA9IGttZW1fYWxsb2Moc2JzaXplLCBLTV9TTEVFUCk7CisKKwkvKgorCSAqIFNjYW4gdGhlIGF0dHJpYnV0ZSBsaXN0IGZvciB0aGUgcmVzdCBvZiB0aGUgZW50cmllcywgc3RvcmluZworCSAqIHRoZSByZWxldmFudCBpbmZvIGZyb20gb25seSB0aG9zZSB0aGF0IG1hdGNoIGludG8gYSBidWZmZXIuCisJICovCisJbnNidWYgPSAwOworCWZvciAoaSA9IDAsIHNmZSA9ICZzZi0+bGlzdFswXTsKKwkJCWkgPCBJTlRfR0VUKHNmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7IGkrKykgeworCQlpZiAodW5saWtlbHkoCisJCSAgICAoKGNoYXIgKilzZmUgPCAoY2hhciAqKXNmKSB8fAorCQkgICAgKChjaGFyICopc2ZlID49ICgoY2hhciAqKXNmICsgZHAtPmlfYWZwLT5pZl9ieXRlcykpKSkgeworCQkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19hdHRyX3Nob3J0Zm9ybV9saXN0IiwKKwkJCQkJICAgICBYRlNfRVJSTEVWRUxfTE9XLAorCQkJCQkgICAgIGNvbnRleHQtPmRwLT5pX21vdW50LCBzZmUpOworCQkJeGZzX2F0dHJfdHJhY2VfbF9jKCJzZiBjb3JydXB0ZWQiLCBjb250ZXh0KTsKKwkJCWttZW1fZnJlZShzYnVmLCBzYnNpemUpOworCQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQl9CisJCWlmICgoKGNvbnRleHQtPmZsYWdzICYgQVRUUl9TRUNVUkUpICE9IDApICE9CisJCSAgICAoKHNmZS0+ZmxhZ3MgJiBYRlNfQVRUUl9TRUNVUkUpICE9IDApICYmCisJCSAgICAhKGNvbnRleHQtPmZsYWdzICYgQVRUUl9LRVJOT1JNQUxTKSkgeworCQkJc2ZlID0gWEZTX0FUVFJfU0ZfTkVYVEVOVFJZKHNmZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKChjb250ZXh0LT5mbGFncyAmIEFUVFJfUk9PVCkgIT0gMCkgIT0KKwkJICAgICgoc2ZlLT5mbGFncyAmIFhGU19BVFRSX1JPT1QpICE9IDApICYmCisJCSAgICAhKGNvbnRleHQtPmZsYWdzICYgQVRUUl9LRVJOUk9PVExTKSkgeworCQkJc2ZlID0gWEZTX0FUVFJfU0ZfTkVYVEVOVFJZKHNmZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlzYnAtPmVudG5vID0gaTsKKwkJSU5UX1NFVChzYnAtPmhhc2gsIEFSQ0hfQ09OVkVSVCwKKwkJCXhmc19kYV9oYXNobmFtZSgoY2hhciAqKXNmZS0+bmFtZXZhbCwgc2ZlLT5uYW1lbGVuKSk7CisJCXNicC0+bmFtZSA9IChjaGFyICopc2ZlLT5uYW1ldmFsOworCQlzYnAtPm5hbWVsZW4gPSBzZmUtPm5hbWVsZW47CisJCS8qIFRoZXNlIGFyZSBieXRlcywgYW5kIGJvdGggb24tZGlzaywgZG9uJ3QgZW5kaWFuLWZsaXAgKi8KKwkJc2JwLT52YWx1ZWxlbiA9IHNmZS0+dmFsdWVsZW47CisJCXNicC0+ZmxhZ3MgPSBzZmUtPmZsYWdzOworCQlzZmUgPSBYRlNfQVRUUl9TRl9ORVhURU5UUlkoc2ZlKTsKKwkJc2JwKys7CisJCW5zYnVmKys7CisJfQorCisJLyoKKwkgKiBTb3J0IHRoZSBlbnRyaWVzIG9uIGhhc2ggdGhlbiBlbnRuby4KKwkgKi8KKwlxc29ydChzYnVmLCBuc2J1Ziwgc2l6ZW9mKCpzYnVmKSwgeGZzX2F0dHJfc2hvcnRmb3JtX2NvbXBhcmUpOworCisJLyoKKwkgKiBSZS1maW5kIG91ciBwbGFjZSBJTiBUSEUgU09SVEVEIExJU1QuCisJICovCisJY291bnQgPSAwOworCWN1cnNvci0+aW5pdHRlZCA9IDE7CisJY3Vyc29yLT5ibGtubyA9IDA7CisJZm9yIChzYnAgPSBzYnVmLCBpID0gMDsgaSA8IG5zYnVmOyBpKyssIHNicCsrKSB7CisJCWlmIChJTlRfR0VUKHNicC0+aGFzaCwgQVJDSF9DT05WRVJUKSA9PSBjdXJzb3ItPmhhc2h2YWwpIHsKKwkJCWlmIChjdXJzb3ItPm9mZnNldCA9PSBjb3VudCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJY291bnQrKzsKKwkJfSBlbHNlIGlmIChJTlRfR0VUKHNicC0+aGFzaCwgQVJDSF9DT05WRVJUKSA+IGN1cnNvci0+aGFzaHZhbCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGkgPT0gbnNidWYpIHsKKwkJa21lbV9mcmVlKHNidWYsIHNic2l6ZSk7CisJCXhmc19hdHRyX3RyYWNlX2xfYygiYmxrIGVuZCIsIGNvbnRleHQpOworCQlyZXR1cm4oMCk7CisJfQorCisJLyoKKwkgKiBMb29wIHB1dHRpbmcgZW50cmllcyBpbnRvIHRoZSB1c2VyIGJ1ZmZlci4KKwkgKi8KKwlmb3IgKCA7IGkgPCBuc2J1ZjsgaSsrLCBzYnArKykgeworCQlhdHRybmFtZXNfdAkqbmFtZXNwOworCisJCW5hbWVzcCA9IChzYnAtPmZsYWdzICYgWEZTX0FUVFJfU0VDVVJFKSA/ICZhdHRyX3NlY3VyZSA6CisJCQkoKHNicC0+ZmxhZ3MgJiBYRlNfQVRUUl9ST09UKSA/ICZhdHRyX3RydXN0ZWQgOgorCQkJICAmYXR0cl91c2VyKTsKKworCQlpZiAoY3Vyc29yLT5oYXNodmFsICE9IElOVF9HRVQoc2JwLT5oYXNoLCBBUkNIX0NPTlZFUlQpKSB7CisJCQljdXJzb3ItPmhhc2h2YWwgPSBJTlRfR0VUKHNicC0+aGFzaCwgQVJDSF9DT05WRVJUKTsKKwkJCWN1cnNvci0+b2Zmc2V0ID0gMDsKKwkJfQorCQlpZiAoY29udGV4dC0+ZmxhZ3MgJiBBVFRSX0tFUk5PVkFMKSB7CisJCQlBU1NFUlQoY29udGV4dC0+ZmxhZ3MgJiBBVFRSX0tFUk5BTUVMUyk7CisJCQljb250ZXh0LT5jb3VudCArPSBuYW1lc3AtPmF0dHJfbmFtZWxlbiArCisJCQkJCQlzYnAtPm5hbWVsZW4gKyAxOworCQl9IGVsc2UgeworCQkJaWYgKHhmc19hdHRyX3B1dF9saXN0ZW50KGNvbnRleHQsIG5hbWVzcCwKKwkJCQkJc2JwLT5uYW1lLCBzYnAtPm5hbWVsZW4sCisJCQkJCUlOVF9HRVQoc2JwLT52YWx1ZWxlbiwgQVJDSF9DT05WRVJUKSkpCisJCQkJYnJlYWs7CisJCX0KKwkJY3Vyc29yLT5vZmZzZXQrKzsKKwl9CisKKwlrbWVtX2ZyZWUoc2J1Ziwgc2JzaXplKTsKKwl4ZnNfYXR0cl90cmFjZV9sX2MoInNmIEUtTy1GIiwgY29udGV4dCk7CisJcmV0dXJuKDApOworfQorCisvKgorICogQ2hlY2sgYSBsZWFmIGF0dHJpYnV0ZSBibG9jayB0byBzZWUgaWYgYWxsIHRoZSBlbnRyaWVzIHdvdWxkIGZpdCBpbnRvCisgKiBhIHNob3J0Zm9ybSBhdHRyaWJ1dGUgbGlzdC4KKyAqLworaW50Cit4ZnNfYXR0cl9zaG9ydGZvcm1fYWxsZml0KHhmc19kYWJ1Zl90ICpicCwgeGZzX2lub2RlX3QgKmRwKQoreworCXhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmOworCXhmc19hdHRyX2xlYWZfZW50cnlfdCAqZW50cnk7CisJeGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsX3QgKm5hbWVfbG9jOworCWludCBieXRlcywgaTsKKworCWxlYWYgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisKKwllbnRyeSA9ICZsZWFmLT5lbnRyaWVzWzBdOworCWJ5dGVzID0gc2l6ZW9mKHN0cnVjdCB4ZnNfYXR0cl9zZl9oZHIpOworCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsgZW50cnkrKywgaSsrKSB7CisJCWlmIChlbnRyeS0+ZmxhZ3MgJiBYRlNfQVRUUl9JTkNPTVBMRVRFKQorCQkJY29udGludWU7CQkvKiBkb24ndCBjb3B5IHBhcnRpYWwgZW50cmllcyAqLworCQlpZiAoIShlbnRyeS0+ZmxhZ3MgJiBYRlNfQVRUUl9MT0NBTCkpCisJCQlyZXR1cm4oMCk7CisJCW5hbWVfbG9jID0gWEZTX0FUVFJfTEVBRl9OQU1FX0xPQ0FMKGxlYWYsIGkpOworCQlpZiAobmFtZV9sb2MtPm5hbWVsZW4gPj0gWEZTX0FUVFJfU0ZfRU5UU0laRV9NQVgpCisJCQlyZXR1cm4oMCk7CisJCWlmIChJTlRfR0VUKG5hbWVfbG9jLT52YWx1ZWxlbiwgQVJDSF9DT05WRVJUKSA+PSBYRlNfQVRUUl9TRl9FTlRTSVpFX01BWCkKKwkJCXJldHVybigwKTsKKwkJYnl0ZXMgKz0gc2l6ZW9mKHN0cnVjdCB4ZnNfYXR0cl9zZl9lbnRyeSktMQorCQkJCSsgbmFtZV9sb2MtPm5hbWVsZW4KKwkJCQkrIElOVF9HRVQobmFtZV9sb2MtPnZhbHVlbGVuLCBBUkNIX0NPTlZFUlQpOworCX0KKwlyZXR1cm4oIGJ5dGVzIDwgWEZTX0lGT1JLX0FTSVpFKGRwKSApOworfQorCisvKgorICogQ29udmVydCBhIGxlYWYgYXR0cmlidXRlIGxpc3QgdG8gc2hvcnRmb3JtIGF0dHJpYnV0ZSBsaXN0CisgKi8KK2ludAoreGZzX2F0dHJfbGVhZl90b19zaG9ydGZvcm0oeGZzX2RhYnVmX3QgKmJwLCB4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmOworCXhmc19hdHRyX2xlYWZfZW50cnlfdCAqZW50cnk7CisJeGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsX3QgKm5hbWVfbG9jOworCXhmc19kYV9hcmdzX3QgbmFyZ3M7CisJeGZzX2lub2RlX3QgKmRwOworCWNoYXIgKnRtcGJ1ZmZlcjsKKwlpbnQgZXJyb3IsIGk7CisKKwlkcCA9IGFyZ3MtPmRwOworCXRtcGJ1ZmZlciA9IGttZW1fYWxsb2MoWEZTX0xCU0laRShkcC0+aV9tb3VudCksIEtNX1NMRUVQKTsKKwlBU1NFUlQodG1wYnVmZmVyICE9IE5VTEwpOworCisJQVNTRVJUKGJwICE9IE5VTEwpOworCW1lbWNweSh0bXBidWZmZXIsIGJwLT5kYXRhLCBYRlNfTEJTSVpFKGRwLT5pX21vdW50KSk7CisJbGVhZiA9ICh4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqKXRtcGJ1ZmZlcjsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJbWVtc2V0KGJwLT5kYXRhLCAwLCBYRlNfTEJTSVpFKGRwLT5pX21vdW50KSk7CisKKwkvKgorCSAqIENsZWFuIG91dCB0aGUgcHJpb3IgY29udGVudHMgb2YgdGhlIGF0dHJpYnV0ZSBsaXN0LgorCSAqLworCWVycm9yID0geGZzX2RhX3Nocmlua19pbm9kZShhcmdzLCAwLCBicCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKwllcnJvciA9IHhmc19hdHRyX3Nob3J0Zm9ybV9jcmVhdGUoYXJncyk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCS8qCisJICogQ29weSB0aGUgYXR0cmlidXRlcworCSAqLworCW1lbXNldCgoY2hhciAqKSZuYXJncywgMCwgc2l6ZW9mKG5hcmdzKSk7CisJbmFyZ3MuZHAgPSBkcDsKKwluYXJncy5maXJzdGJsb2NrID0gYXJncy0+Zmlyc3RibG9jazsKKwluYXJncy5mbGlzdCA9IGFyZ3MtPmZsaXN0OworCW5hcmdzLnRvdGFsID0gYXJncy0+dG90YWw7CisJbmFyZ3Mud2hpY2hmb3JrID0gWEZTX0FUVFJfRk9SSzsKKwluYXJncy50cmFucyA9IGFyZ3MtPnRyYW5zOworCW5hcmdzLm9rbm9lbnQgPSAxOworCWVudHJ5ID0gJmxlYWYtPmVudHJpZXNbMF07CisJZm9yIChpID0gMDsgaSA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOyBlbnRyeSsrLCBpKyspIHsKKwkJaWYgKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX0lOQ09NUExFVEUpCisJCQljb250aW51ZTsJLyogZG9uJ3QgY29weSBwYXJ0aWFsIGVudHJpZXMgKi8KKwkJaWYgKCFlbnRyeS0+bmFtZWlkeCkKKwkJCWNvbnRpbnVlOworCQlBU1NFUlQoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfTE9DQUwpOworCQluYW1lX2xvYyA9IFhGU19BVFRSX0xFQUZfTkFNRV9MT0NBTChsZWFmLCBpKTsKKwkJbmFyZ3MubmFtZSA9IChjaGFyICopbmFtZV9sb2MtPm5hbWV2YWw7CisJCW5hcmdzLm5hbWVsZW4gPSBuYW1lX2xvYy0+bmFtZWxlbjsKKwkJbmFyZ3MudmFsdWUgPSAoY2hhciAqKSZuYW1lX2xvYy0+bmFtZXZhbFtuYXJncy5uYW1lbGVuXTsKKwkJbmFyZ3MudmFsdWVsZW4gPSBJTlRfR0VUKG5hbWVfbG9jLT52YWx1ZWxlbiwgQVJDSF9DT05WRVJUKTsKKwkJbmFyZ3MuaGFzaHZhbCA9IElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisJCW5hcmdzLmZsYWdzID0gKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX1NFQ1VSRSkgPyBBVFRSX1NFQ1VSRSA6CisJCQkgICAgICAoKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX1JPT1QpID8gQVRUUl9ST09UIDogMCk7CisJCXhmc19hdHRyX3Nob3J0Zm9ybV9hZGQoJm5hcmdzKTsKKwl9CisJZXJyb3IgPSAwOworCitvdXQ6CisJa21lbV9mcmVlKHRtcGJ1ZmZlciwgWEZTX0xCU0laRShkcC0+aV9tb3VudCkpOworCXJldHVybihlcnJvcik7Cit9CisKKy8qCisgKiBDb252ZXJ0IGZyb20gdXNpbmcgYSBzaW5nbGUgbGVhZiB0byBhIHJvb3Qgbm9kZSBhbmQgYSBsZWFmLgorICovCitpbnQKK3hmc19hdHRyX2xlYWZfdG9fbm9kZSh4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmOworCXhmc19kYV9pbnRub2RlX3QgKm5vZGU7CisJeGZzX2lub2RlX3QgKmRwOworCXhmc19kYWJ1Zl90ICpicDEsICpicDI7CisJeGZzX2RhYmxrX3QgYmxrbm87CisJaW50IGVycm9yOworCisJZHAgPSBhcmdzLT5kcDsKKwlicDEgPSBicDIgPSBOVUxMOworCWVycm9yID0geGZzX2RhX2dyb3dfaW5vZGUoYXJncywgJmJsa25vKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgMCwgLTEsICZicDEsCisJCQkJCSAgICAgWEZTX0FUVFJfRk9SSyk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKwlBU1NFUlQoYnAxICE9IE5VTEwpOworCWJwMiA9IE5VTEw7CisJZXJyb3IgPSB4ZnNfZGFfZ2V0X2J1ZihhcmdzLT50cmFucywgYXJncy0+ZHAsIGJsa25vLCAtMSwgJmJwMiwKKwkJCQkJICAgIFhGU19BVFRSX0ZPUkspOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisJQVNTRVJUKGJwMiAhPSBOVUxMKTsKKwltZW1jcHkoYnAyLT5kYXRhLCBicDEtPmRhdGEsIFhGU19MQlNJWkUoZHAtPmlfbW91bnQpKTsKKwl4ZnNfZGFfYnVmX2RvbmUoYnAxKTsKKwlicDEgPSBOVUxMOworCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicDIsIDAsIFhGU19MQlNJWkUoZHAtPmlfbW91bnQpIC0gMSk7CisKKwkvKgorCSAqIFNldCB1cCB0aGUgbmV3IHJvb3Qgbm9kZS4KKwkgKi8KKwllcnJvciA9IHhmc19kYV9ub2RlX2NyZWF0ZShhcmdzLCAwLCAxLCAmYnAxLCBYRlNfQVRUUl9GT1JLKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCW5vZGUgPSBicDEtPmRhdGE7CisJbGVhZiA9IGJwMi0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJLyogYm90aCBvbi1kaXNrLCBkb24ndCBlbmRpYW4tZmxpcCB0d2ljZSAqLworCW5vZGUtPmJ0cmVlWzBdLmhhc2h2YWwgPQorCQlsZWFmLT5lbnRyaWVzW0lOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTEgXS5oYXNodmFsOworCUlOVF9TRVQobm9kZS0+YnRyZWVbMF0uYmVmb3JlLCBBUkNIX0NPTlZFUlQsIGJsa25vKTsKKwlJTlRfU0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJULCAxKTsKKwl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAxLCAwLCBYRlNfTEJTSVpFKGRwLT5pX21vdW50KSAtIDEpOworCWVycm9yID0gMDsKK291dDoKKwlpZiAoYnAxKQorCQl4ZnNfZGFfYnVmX2RvbmUoYnAxKTsKKwlpZiAoYnAyKQorCQl4ZnNfZGFfYnVmX2RvbmUoYnAyKTsKKwlyZXR1cm4oZXJyb3IpOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSb3V0aW5lcyB1c2VkIGZvciBncm93aW5nIHRoZSBCdHJlZS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIENyZWF0ZSB0aGUgaW5pdGlhbCBjb250ZW50cyBvZiBhIGxlYWYgYXR0cmlidXRlIGxpc3QKKyAqIG9yIGEgbGVhZiBpbiBhIG5vZGUgYXR0cmlidXRlIGxpc3QuCisgKi8KK2ludAoreGZzX2F0dHJfbGVhZl9jcmVhdGUoeGZzX2RhX2FyZ3NfdCAqYXJncywgeGZzX2RhYmxrX3QgYmxrbm8sIHhmc19kYWJ1Zl90ICoqYnBwKQoreworCXhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmOworCXhmc19hdHRyX2xlYWZfaGRyX3QgKmhkcjsKKwl4ZnNfaW5vZGVfdCAqZHA7CisJeGZzX2RhYnVmX3QgKmJwOworCWludCBlcnJvcjsKKworCWRwID0gYXJncy0+ZHA7CisJQVNTRVJUKGRwICE9IE5VTEwpOworCWVycm9yID0geGZzX2RhX2dldF9idWYoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCBibGtubywgLTEsICZicCwKKwkJCQkJICAgIFhGU19BVFRSX0ZPUkspOworCWlmIChlcnJvcikKKwkJcmV0dXJuKGVycm9yKTsKKwlBU1NFUlQoYnAgIT0gTlVMTCk7CisJbGVhZiA9IGJwLT5kYXRhOworCW1lbXNldCgoY2hhciAqKWxlYWYsIDAsIFhGU19MQlNJWkUoZHAtPmlfbW91bnQpKTsKKwloZHIgPSAmbGVhZi0+aGRyOworCUlOVF9TRVQoaGRyLT5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19BVFRSX0xFQUZfTUFHSUMpOworCUlOVF9TRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCwgWEZTX0xCU0laRShkcC0+aV9tb3VudCkpOworCWlmICghaGRyLT5maXJzdHVzZWQpIHsKKwkJSU5UX1NFVChoZHItPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJULAorCQkJWEZTX0xCU0laRShkcC0+aV9tb3VudCkgLSBYRlNfQVRUUl9MRUFGX05BTUVfQUxJR04pOworCX0KKworCUlOVF9TRVQoaGRyLT5mcmVlbWFwWzBdLmJhc2UsIEFSQ0hfQ09OVkVSVCwKKwkJCQkJCXNpemVvZih4ZnNfYXR0cl9sZWFmX2hkcl90KSk7CisJSU5UX1NFVChoZHItPmZyZWVtYXBbMF0uc2l6ZSwgQVJDSF9DT05WRVJULAorCQkJCQkgIElOVF9HRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJLSBJTlRfR0VUKGhkci0+ZnJlZW1hcFswXS5iYXNlLAorCQkJCQkJCQlBUkNIX0NPTlZFUlQpKTsKKworCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicCwgMCwgWEZTX0xCU0laRShkcC0+aV9tb3VudCkgLSAxKTsKKworCSpicHAgPSBicDsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBTcGxpdCB0aGUgbGVhZiBub2RlLCByZWJhbGFuY2UsIHRoZW4gYWRkIHRoZSBuZXcgZW50cnkuCisgKi8KK2ludAoreGZzX2F0dHJfbGVhZl9zcGxpdCh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIHhmc19kYV9zdGF0ZV9ibGtfdCAqb2xkYmxrLAorCQkJCSAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqbmV3YmxrKQoreworCXhmc19kYWJsa190IGJsa25vOworCWludCBlcnJvcjsKKworCS8qCisJICogQWxsb2NhdGUgc3BhY2UgZm9yIGEgbmV3IGxlYWYgbm9kZS4KKwkgKi8KKwlBU1NFUlQob2xkYmxrLT5tYWdpYyA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwllcnJvciA9IHhmc19kYV9ncm93X2lub2RlKHN0YXRlLT5hcmdzLCAmYmxrbm8pOworCWlmIChlcnJvcikKKwkJcmV0dXJuKGVycm9yKTsKKwllcnJvciA9IHhmc19hdHRyX2xlYWZfY3JlYXRlKHN0YXRlLT5hcmdzLCBibGtubywgJm5ld2Jsay0+YnApOworCWlmIChlcnJvcikKKwkJcmV0dXJuKGVycm9yKTsKKwluZXdibGstPmJsa25vID0gYmxrbm87CisJbmV3YmxrLT5tYWdpYyA9IFhGU19BVFRSX0xFQUZfTUFHSUM7CisKKwkvKgorCSAqIFJlYmFsYW5jZSB0aGUgZW50cmllcyBhY3Jvc3MgdGhlIHR3byBsZWF2ZXMuCisJICogTk9URTogcmViYWxhbmNlKCkgY3VycmVudGx5IGRlcGVuZHMgb24gdGhlIDJuZCBibG9jayBiZWluZyBlbXB0eS4KKwkgKi8KKwl4ZnNfYXR0cl9sZWFmX3JlYmFsYW5jZShzdGF0ZSwgb2xkYmxrLCBuZXdibGspOworCWVycm9yID0geGZzX2RhX2Jsa19saW5rKHN0YXRlLCBvbGRibGssIG5ld2Jsayk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4oZXJyb3IpOworCisJLyoKKwkgKiBTYXZlIGluZm8gb24gIm9sZCIgYXR0cmlidXRlIGZvciAiYXRvbWljIHJlbmFtZSIgb3BzLCBsZWFmX2FkZCgpCisJICogbW9kaWZpZXMgdGhlIGluZGV4L2Jsa25vL3JtdGJsay9ybXRibGtjbnQgZmllbGRzIHRvIHNob3cgdGhlCisJICogIm5ldyIgYXR0cnMgaW5mby4gIFdpbGwgbmVlZCB0aGUgIm9sZCIgaW5mbyB0byByZW1vdmUgaXQgbGF0ZXIuCisJICoKKwkgKiBJbnNlcnQgdGhlICJuZXciIGVudHJ5IGluIHRoZSBjb3JyZWN0IGJsb2NrLgorCSAqLworCWlmIChzdGF0ZS0+aW5sZWFmKQorCQllcnJvciA9IHhmc19hdHRyX2xlYWZfYWRkKG9sZGJsay0+YnAsIHN0YXRlLT5hcmdzKTsKKwllbHNlCisJCWVycm9yID0geGZzX2F0dHJfbGVhZl9hZGQobmV3YmxrLT5icCwgc3RhdGUtPmFyZ3MpOworCisJLyoKKwkgKiBVcGRhdGUgbGFzdCBoYXNodmFsIGluIGVhY2ggYmxvY2sgc2luY2Ugd2UgYWRkZWQgdGhlIG5hbWUuCisJICovCisJb2xkYmxrLT5oYXNodmFsID0geGZzX2F0dHJfbGVhZl9sYXN0aGFzaChvbGRibGstPmJwLCBOVUxMKTsKKwluZXdibGstPmhhc2h2YWwgPSB4ZnNfYXR0cl9sZWFmX2xhc3RoYXNoKG5ld2Jsay0+YnAsIE5VTEwpOworCXJldHVybihlcnJvcik7Cit9CisKKy8qCisgKiBBZGQgYSBuYW1lIHRvIHRoZSBsZWFmIGF0dHJpYnV0ZSBsaXN0IHN0cnVjdHVyZS4KKyAqLworaW50Cit4ZnNfYXR0cl9sZWFmX2FkZCh4ZnNfZGFidWZfdCAqYnAsIHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWY7CisJeGZzX2F0dHJfbGVhZl9oZHJfdCAqaGRyOworCXhmc19hdHRyX2xlYWZfbWFwX3QgKm1hcDsKKwlpbnQgdGFibGVzaXplLCBlbnRzaXplLCBzdW0sIHRtcCwgaTsKKworCWxlYWYgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKChhcmdzLT5pbmRleCA+PSAwKQorCQkmJiAoYXJncy0+aW5kZXggPD0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpKTsKKwloZHIgPSAmbGVhZi0+aGRyOworCWVudHNpemUgPSB4ZnNfYXR0cl9sZWFmX25ld2VudHNpemUoYXJncywKKwkJCSAgIGFyZ3MtPnRyYW5zLT50X21vdW50cC0+bV9zYi5zYl9ibG9ja3NpemUsIE5VTEwpOworCisJLyoKKwkgKiBTZWFyY2ggdGhyb3VnaCBmcmVlbWFwIGZvciBmaXJzdC1maXQgb24gbmV3IG5hbWUgbGVuZ3RoLgorCSAqIChtYXkgbmVlZCB0byBmaWd1cmUgaW4gc2l6ZSBvZiBlbnRyeSBzdHJ1Y3QgdG9vKQorCSAqLworCXRhYmxlc2l6ZSA9IChJTlRfR0VUKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgKyAxKQorCQkJCQkqIHNpemVvZih4ZnNfYXR0cl9sZWFmX2VudHJ5X3QpCisJCQkJCSsgc2l6ZW9mKHhmc19hdHRyX2xlYWZfaGRyX3QpOworCW1hcCA9ICZoZHItPmZyZWVtYXBbWEZTX0FUVFJfTEVBRl9NQVBTSVpFLTFdOworCWZvciAoc3VtID0gMCwgaSA9IFhGU19BVFRSX0xFQUZfTUFQU0laRS0xOyBpID49IDA7IG1hcC0tLCBpLS0pIHsKKwkJaWYgKHRhYmxlc2l6ZSA+IElOVF9HRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCXN1bSArPSBJTlRfR0VUKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJUKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghbWFwLT5zaXplKQorCQkJY29udGludWU7CS8qIG5vIHNwYWNlIGluIHRoaXMgbWFwICovCisJCXRtcCA9IGVudHNpemU7CisJCWlmIChJTlRfR0VUKG1hcC0+YmFzZSwgQVJDSF9DT05WRVJUKQorCQkJCTwgSU5UX0dFVChoZHItPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKSkKKwkJCXRtcCArPSBzaXplb2YoeGZzX2F0dHJfbGVhZl9lbnRyeV90KTsKKwkJaWYgKElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpID49IHRtcCkgeworCQkJdG1wID0geGZzX2F0dHJfbGVhZl9hZGRfd29yayhicCwgYXJncywgaSk7CisJCQlyZXR1cm4odG1wKTsKKwkJfQorCQlzdW0gKz0gSU5UX0dFVChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCk7CisJfQorCisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgbm8gaG9sZXMgaW4gdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIGJsb2NrLAorCSAqIGFuZCB3ZSBkb24ndCBoYXZlIGVub3VnaCBmcmVlc3BhY2UsIHRoZW4gY29tcGFjdGlvbiB3aWxsIGRvIHVzCisJICogbm8gZ29vZCBhbmQgd2Ugc2hvdWxkIGp1c3QgZ2l2ZSB1cC4KKwkgKi8KKwlpZiAoIWhkci0+aG9sZXMgJiYgKHN1bSA8IGVudHNpemUpKQorCQlyZXR1cm4oWEZTX0VSUk9SKEVOT1NQQykpOworCisJLyoKKwkgKiBDb21wYWN0IHRoZSBlbnRyaWVzIHRvIGNvYWxlc2NlIGZyZWUgc3BhY2UuCisJICogVGhpcyBtYXkgY2hhbmdlIHRoZSBoZHItPmNvdW50IHZpYSBkcm9wcGluZyBJTkNPTVBMRVRFIGVudHJpZXMuCisJICovCisJeGZzX2F0dHJfbGVhZl9jb21wYWN0KGFyZ3MtPnRyYW5zLCBicCk7CisKKwkvKgorCSAqIEFmdGVyIGNvbXBhY3Rpb24sIHRoZSBibG9jayBpcyBndWFyYW50ZWVkIHRvIGhhdmUgb25seSBvbmUKKwkgKiBmcmVlIHJlZ2lvbiwgaW4gZnJlZW1hcFswXS4gIElmIGl0IGlzIG5vdCBiaWcgZW5vdWdoLCBnaXZlIHVwLgorCSAqLworCWlmIChJTlRfR0VUKGhkci0+ZnJlZW1hcFswXS5zaXplLCBBUkNIX0NPTlZFUlQpCisJCQkJPCAoZW50c2l6ZSArIHNpemVvZih4ZnNfYXR0cl9sZWFmX2VudHJ5X3QpKSkKKwkJcmV0dXJuKFhGU19FUlJPUihFTk9TUEMpKTsKKworCXJldHVybih4ZnNfYXR0cl9sZWFmX2FkZF93b3JrKGJwLCBhcmdzLCAwKSk7Cit9CisKKy8qCisgKiBBZGQgYSBuYW1lIHRvIGEgbGVhZiBhdHRyaWJ1dGUgbGlzdCBzdHJ1Y3R1cmUuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19hdHRyX2xlYWZfYWRkX3dvcmsoeGZzX2RhYnVmX3QgKmJwLCB4ZnNfZGFfYXJnc190ICphcmdzLCBpbnQgbWFwaW5kZXgpCit7CisJeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWY7CisJeGZzX2F0dHJfbGVhZl9oZHJfdCAqaGRyOworCXhmc19hdHRyX2xlYWZfZW50cnlfdCAqZW50cnk7CisJeGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsX3QgKm5hbWVfbG9jOworCXhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGVfdCAqbmFtZV9ybXQ7CisJeGZzX2F0dHJfbGVhZl9tYXBfdCAqbWFwOworCXhmc19tb3VudF90ICptcDsKKwlpbnQgdG1wLCBpOworCisJbGVhZiA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwloZHIgPSAmbGVhZi0+aGRyOworCUFTU0VSVCgobWFwaW5kZXggPj0gMCkgJiYgKG1hcGluZGV4IDwgWEZTX0FUVFJfTEVBRl9NQVBTSVpFKSk7CisJQVNTRVJUKChhcmdzLT5pbmRleCA+PSAwKQorCQkmJiAoYXJncy0+aW5kZXggPD0gSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpKSk7CisKKwkvKgorCSAqIEZvcmNlIG9wZW4gc29tZSBzcGFjZSBpbiB0aGUgZW50cnkgYXJyYXkgYW5kIGZpbGwgaXQgaW4uCisJICovCisJZW50cnkgPSAmbGVhZi0+ZW50cmllc1thcmdzLT5pbmRleF07CisJaWYgKGFyZ3MtPmluZGV4IDwgSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpKSB7CisJCXRtcCAgPSBJTlRfR0VUKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgLSBhcmdzLT5pbmRleDsKKwkJdG1wICo9IHNpemVvZih4ZnNfYXR0cl9sZWFmX2VudHJ5X3QpOworCQltZW1tb3ZlKChjaGFyICopKGVudHJ5KzEpLCAoY2hhciAqKWVudHJ5LCB0bXApOworCQl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAsCisJCSAgICBYRlNfREFfTE9HUkFOR0UobGVhZiwgZW50cnksIHRtcCArIHNpemVvZigqZW50cnkpKSk7CisJfQorCUlOVF9NT0QoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJULCAxKTsKKworCS8qCisJICogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBuZXcgc3RyaW5nIChhdCB0aGUgZW5kIG9mIHRoZSBydW4pLgorCSAqLworCW1hcCA9ICZoZHItPmZyZWVtYXBbbWFwaW5kZXhdOworCW1wID0gYXJncy0+dHJhbnMtPnRfbW91bnRwOworCUFTU0VSVChJTlRfR0VUKG1hcC0+YmFzZSwgQVJDSF9DT05WRVJUKSA8IFhGU19MQlNJWkUobXApKTsKKwlBU1NFUlQoKElOVF9HRVQobWFwLT5iYXNlLCBBUkNIX0NPTlZFUlQpICYgMHgzKSA9PSAwKTsKKwlBU1NFUlQoSU5UX0dFVChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCkKKwkJCQk+PSB4ZnNfYXR0cl9sZWFmX25ld2VudHNpemUoYXJncywKKwkJCQkJICAgICBtcC0+bV9zYi5zYl9ibG9ja3NpemUsIE5VTEwpKTsKKwlBU1NFUlQoSU5UX0dFVChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCkgPCBYRlNfTEJTSVpFKG1wKSk7CisJQVNTRVJUKChJTlRfR0VUKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJUKSAmIDB4MykgPT0gMCk7CisJSU5UX01PRChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCwKKwkJLXhmc19hdHRyX2xlYWZfbmV3ZW50c2l6ZShhcmdzLCBtcC0+bV9zYi5zYl9ibG9ja3NpemUsICZ0bXApKTsKKwlJTlRfU0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQsCisJCQkJCUlOVF9HRVQobWFwLT5iYXNlLCBBUkNIX0NPTlZFUlQpCisJCQkJICAgICAgKyBJTlRfR0VUKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJUKSk7CisJSU5UX1NFVChlbnRyeS0+aGFzaHZhbCwgQVJDSF9DT05WRVJULCBhcmdzLT5oYXNodmFsKTsKKwllbnRyeS0+ZmxhZ3MgPSB0bXAgPyBYRlNfQVRUUl9MT0NBTCA6IDA7CisJZW50cnktPmZsYWdzIHw9IChhcmdzLT5mbGFncyAmIEFUVFJfU0VDVVJFKSA/IFhGU19BVFRSX1NFQ1VSRSA6CisJCQkoKGFyZ3MtPmZsYWdzICYgQVRUUl9ST09UKSA/IFhGU19BVFRSX1JPT1QgOiAwKTsKKwlpZiAoYXJncy0+cmVuYW1lKSB7CisJCWVudHJ5LT5mbGFncyB8PSBYRlNfQVRUUl9JTkNPTVBMRVRFOworCQlpZiAoKGFyZ3MtPmJsa25vMiA9PSBhcmdzLT5ibGtubykgJiYKKwkJICAgIChhcmdzLT5pbmRleDIgPD0gYXJncy0+aW5kZXgpKSB7CisJCQlhcmdzLT5pbmRleDIrKzsKKwkJfQorCX0KKwl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAsCisJCQkgIFhGU19EQV9MT0dSQU5HRShsZWFmLCBlbnRyeSwgc2l6ZW9mKCplbnRyeSkpKTsKKwlBU1NFUlQoKGFyZ3MtPmluZGV4ID09IDApIHx8IChJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk+PSBJTlRfR0VUKChlbnRyeS0xKS0+aGFzaHZhbCwKKwkJCQkJCQkgICAgQVJDSF9DT05WRVJUKSkpOworCUFTU0VSVCgoYXJncy0+aW5kZXggPT0gSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpLTEpIHx8CisJICAgICAgIChJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpCisJCQkgICAgPD0gKElOVF9HRVQoKGVudHJ5KzEpLT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpKSkpOworCisJLyoKKwkgKiBDb3B5IHRoZSBhdHRyaWJ1dGUgbmFtZSBhbmQgdmFsdWUgaW50byB0aGUgbmV3IHNwYWNlLgorCSAqCisJICogRm9yICJyZW1vdGUiIGF0dHJpYnV0ZSB2YWx1ZXMsIHNpbXBseSBub3RlIHRoYXQgd2UgbmVlZCB0bworCSAqIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgInJlbW90ZSIgdmFsdWUuICBXZSBjYW4ndCBhY3R1YWxseQorCSAqIGFsbG9jYXRlIHRoZSBleHRlbnRzIGluIHRoaXMgdHJhbnNhY3Rpb24sIGFuZCB3ZSBjYW4ndCBkZWNpZGUKKwkgKiB3aGljaCBibG9ja3MgdGhleSBzaG91bGQgYmUgYXMgd2UgbWlnaHQgYWxsb2NhdGUgbW9yZSBibG9ja3MKKwkgKiBhcyBwYXJ0IG9mIHRoaXMgdHJhbnNhY3Rpb24gKGEgc3BsaXQgb3BlcmF0aW9uIGZvciBleGFtcGxlKS4KKwkgKi8KKwlpZiAoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfTE9DQUwpIHsKKwkJbmFtZV9sb2MgPSBYRlNfQVRUUl9MRUFGX05BTUVfTE9DQUwobGVhZiwgYXJncy0+aW5kZXgpOworCQluYW1lX2xvYy0+bmFtZWxlbiA9IGFyZ3MtPm5hbWVsZW47CisJCUlOVF9TRVQobmFtZV9sb2MtPnZhbHVlbGVuLCBBUkNIX0NPTlZFUlQsIGFyZ3MtPnZhbHVlbGVuKTsKKwkJbWVtY3B5KChjaGFyICopbmFtZV9sb2MtPm5hbWV2YWwsIGFyZ3MtPm5hbWUsIGFyZ3MtPm5hbWVsZW4pOworCQltZW1jcHkoKGNoYXIgKikmbmFtZV9sb2MtPm5hbWV2YWxbYXJncy0+bmFtZWxlbl0sIGFyZ3MtPnZhbHVlLAorCQkJCSAgIElOVF9HRVQobmFtZV9sb2MtPnZhbHVlbGVuLCBBUkNIX0NPTlZFUlQpKTsKKwl9IGVsc2UgeworCQluYW1lX3JtdCA9IFhGU19BVFRSX0xFQUZfTkFNRV9SRU1PVEUobGVhZiwgYXJncy0+aW5kZXgpOworCQluYW1lX3JtdC0+bmFtZWxlbiA9IGFyZ3MtPm5hbWVsZW47CisJCW1lbWNweSgoY2hhciAqKW5hbWVfcm10LT5uYW1lLCBhcmdzLT5uYW1lLCBhcmdzLT5uYW1lbGVuKTsKKwkJZW50cnktPmZsYWdzIHw9IFhGU19BVFRSX0lOQ09NUExFVEU7CisJCS8qIGp1c3QgaW4gY2FzZSAqLworCQluYW1lX3JtdC0+dmFsdWVsZW4gPSAwOworCQluYW1lX3JtdC0+dmFsdWVibGsgPSAwOworCQlhcmdzLT5ybXRibGtubyA9IDE7CisJCWFyZ3MtPnJtdGJsa2NudCA9IFhGU19CX1RPX0ZTQihtcCwgYXJncy0+dmFsdWVsZW4pOworCX0KKwl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAsCisJICAgICBYRlNfREFfTE9HUkFOR0UobGVhZiwgWEZTX0FUVFJfTEVBRl9OQU1FKGxlYWYsIGFyZ3MtPmluZGV4KSwKKwkJCQkgICB4ZnNfYXR0cl9sZWFmX2VudHNpemUobGVhZiwgYXJncy0+aW5kZXgpKSk7CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgY29udHJvbCBpbmZvIGZvciB0aGlzIGxlYWYgbm9kZQorCSAqLworCWlmIChJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpCisJCQkJPCBJTlRfR0VUKGhkci0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpKSB7CisJCS8qIGJvdGggb24tZGlzaywgZG9uJ3QgZW5kaWFuLWZsaXAgdHdpY2UgKi8KKwkJaGRyLT5maXJzdHVzZWQgPSBlbnRyeS0+bmFtZWlkeDsKKwl9CisJQVNTRVJUKElOVF9HRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkKKwkJCQk+PSAoKElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKQorCQkJCQkqIHNpemVvZigqZW50cnkpKStzaXplb2YoKmhkcikpKTsKKwl0bXAgPSAoSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpLTEpCisJCQkJCSogc2l6ZW9mKHhmc19hdHRyX2xlYWZfZW50cnlfdCkKKwkJCQkJKyBzaXplb2YoeGZzX2F0dHJfbGVhZl9oZHJfdCk7CisJbWFwID0gJmhkci0+ZnJlZW1hcFswXTsKKwlmb3IgKGkgPSAwOyBpIDwgWEZTX0FUVFJfTEVBRl9NQVBTSVpFOyBtYXArKywgaSsrKSB7CisJCWlmIChJTlRfR0VUKG1hcC0+YmFzZSwgQVJDSF9DT05WRVJUKSA9PSB0bXApIHsKKwkJCUlOVF9NT0QobWFwLT5iYXNlLCBBUkNIX0NPTlZFUlQsCisJCQkJCXNpemVvZih4ZnNfYXR0cl9sZWFmX2VudHJ5X3QpKTsKKwkJCUlOVF9NT0QobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQsCisJCQkJCS1zaXplb2YoeGZzX2F0dHJfbGVhZl9lbnRyeV90KSk7CisJCX0KKwl9CisJSU5UX01PRChoZHItPnVzZWRieXRlcywgQVJDSF9DT05WRVJULAorCQkJCXhmc19hdHRyX2xlYWZfZW50c2l6ZShsZWFmLCBhcmdzLT5pbmRleCkpOworCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicCwKKwkJWEZTX0RBX0xPR1JBTkdFKGxlYWYsIGhkciwgc2l6ZW9mKCpoZHIpKSk7CisJcmV0dXJuKDApOworfQorCisvKgorICogR2FyYmFnZSBjb2xsZWN0IGEgbGVhZiBhdHRyaWJ1dGUgbGlzdCBibG9jayBieSBjb3B5aW5nIGl0IHRvIGEgbmV3IGJ1ZmZlci4KKyAqLworU1RBVElDIHZvaWQKK3hmc19hdHRyX2xlYWZfY29tcGFjdCh4ZnNfdHJhbnNfdCAqdHJhbnMsIHhmc19kYWJ1Zl90ICpicCkKK3sKKwl4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZl9zLCAqbGVhZl9kOworCXhmc19hdHRyX2xlYWZfaGRyX3QgKmhkcl9zLCAqaGRyX2Q7CisJeGZzX21vdW50X3QgKm1wOworCWNoYXIgKnRtcGJ1ZmZlcjsKKworCW1wID0gdHJhbnMtPnRfbW91bnRwOworCXRtcGJ1ZmZlciA9IGttZW1fYWxsb2MoWEZTX0xCU0laRShtcCksIEtNX1NMRUVQKTsKKwlBU1NFUlQodG1wYnVmZmVyICE9IE5VTEwpOworCW1lbWNweSh0bXBidWZmZXIsIGJwLT5kYXRhLCBYRlNfTEJTSVpFKG1wKSk7CisJbWVtc2V0KGJwLT5kYXRhLCAwLCBYRlNfTEJTSVpFKG1wKSk7CisKKwkvKgorCSAqIENvcHkgYmFzaWMgaW5mb3JtYXRpb24KKwkgKi8KKwlsZWFmX3MgPSAoeGZzX2F0dHJfbGVhZmJsb2NrX3QgKil0bXBidWZmZXI7CisJbGVhZl9kID0gYnAtPmRhdGE7CisJaGRyX3MgPSAmbGVhZl9zLT5oZHI7CisJaGRyX2QgPSAmbGVhZl9kLT5oZHI7CisJaGRyX2QtPmluZm8gPSBoZHJfcy0+aW5mbzsJLyogc3RydWN0IGNvcHkgKi8KKwlJTlRfU0VUKGhkcl9kLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCwgWEZTX0xCU0laRShtcCkpOworCS8qIGhhbmRsZSB0cnVuY2F0aW9uIGdyYWNlZnVsbHkgKi8KKwlpZiAoIWhkcl9kLT5maXJzdHVzZWQpIHsKKwkJSU5UX1NFVChoZHJfZC0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQsCisJCQkJWEZTX0xCU0laRShtcCkgLSBYRlNfQVRUUl9MRUFGX05BTUVfQUxJR04pOworCX0KKwloZHJfZC0+dXNlZGJ5dGVzID0gMDsKKwloZHJfZC0+Y291bnQgPSAwOworCWhkcl9kLT5ob2xlcyA9IDA7CisJSU5UX1NFVChoZHJfZC0+ZnJlZW1hcFswXS5iYXNlLCBBUkNIX0NPTlZFUlQsCisJCQkJCXNpemVvZih4ZnNfYXR0cl9sZWFmX2hkcl90KSk7CisJSU5UX1NFVChoZHJfZC0+ZnJlZW1hcFswXS5zaXplLCBBUkNIX0NPTlZFUlQsCisJCQkJSU5UX0dFVChoZHJfZC0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpCisJCQkgICAgICAtIElOVF9HRVQoaGRyX2QtPmZyZWVtYXBbMF0uYmFzZSwgQVJDSF9DT05WRVJUKSk7CisKKwkvKgorCSAqIENvcHkgYWxsIGVudHJ5J3MgaW4gdGhlIHNhbWUgKHNvcnRlZCkgb3JkZXIsCisJICogYnV0IGFsbG9jYXRlIG5hbWUvdmFsdWUgcGFpcnMgcGFja2VkIGFuZCBpbiBzZXF1ZW5jZS4KKwkgKi8KKwl4ZnNfYXR0cl9sZWFmX21vdmVlbnRzKGxlYWZfcywgMCwgbGVhZl9kLCAwLAorCQkJCShpbnQpSU5UX0dFVChoZHJfcy0+Y291bnQsIEFSQ0hfQ09OVkVSVCksIG1wKTsKKworCXhmc19kYV9sb2dfYnVmKHRyYW5zLCBicCwgMCwgWEZTX0xCU0laRShtcCkgLSAxKTsKKworCWttZW1fZnJlZSh0bXBidWZmZXIsIFhGU19MQlNJWkUobXApKTsKK30KKworLyoKKyAqIFJlZGlzdHJpYnV0ZSB0aGUgYXR0cmlidXRlIGxpc3QgZW50cmllcyBiZXR3ZWVuIHR3byBsZWFmIG5vZGVzLAorICogdGFraW5nIGludG8gYWNjb3VudCB0aGUgc2l6ZSBvZiB0aGUgbmV3IGVudHJ5LgorICoKKyAqIE5PVEU6IGlmIG5ldyBibG9jayBpcyBlbXB0eSwgdGhlbiBpdCB3aWxsIGdldCB0aGUgdXBwZXIgaGFsZiBvZiB0aGUKKyAqIG9sZCBibG9jay4gIEF0IHByZXNlbnQsIGFsbCAob25lKSBjYWxsZXJzIHBhc3MgaW4gYW4gZW1wdHkgc2Vjb25kIGJsb2NrLgorICoKKyAqIFRoaXMgY29kZSBhZGp1c3RzIHRoZSBhcmdzLT5pbmRleC9ibGtubyBhbmQgYXJncy0+aW5kZXgyL2Jsa25vMiBmaWVsZHMKKyAqIHRvIG1hdGNoIHdoYXQgaXQgaXMgZG9pbmcgaW4gc3BsaXR0aW5nIHRoZSBhdHRyaWJ1dGUgbGVhZiBibG9jay4gIFRob3NlCisgKiB2YWx1ZXMgYXJlIHVzZWQgaW4gImF0b21pYyByZW5hbWUiIG9wZXJhdGlvbnMgb24gYXR0cmlidXRlcy4gIE5vdGUgdGhhdAorICogdGhlICJuZXciIGFuZCAib2xkIiB2YWx1ZXMgY2FuIGVuZCB1cCBpbiBkaWZmZXJlbnQgYmxvY2tzLgorICovCitTVEFUSUMgdm9pZAoreGZzX2F0dHJfbGVhZl9yZWJhbGFuY2UoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLCB4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazEsCisJCQkJICAgICAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrMikKK3sKKwl4ZnNfZGFfYXJnc190ICphcmdzOworCXhmc19kYV9zdGF0ZV9ibGtfdCAqdG1wX2JsazsKKwl4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZjEsICpsZWFmMjsKKwl4ZnNfYXR0cl9sZWFmX2hkcl90ICpoZHIxLCAqaGRyMjsKKwlpbnQgY291bnQsIHRvdGFsbGVuLCBtYXgsIHNwYWNlLCBzd2FwOworCisJLyoKKwkgKiBTZXQgdXAgZW52aXJvbm1lbnQuCisJICovCisJQVNTRVJUKGJsazEtPm1hZ2ljID09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCUFTU0VSVChibGsyLT5tYWdpYyA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlsZWFmMSA9IGJsazEtPmJwLT5kYXRhOworCWxlYWYyID0gYmxrMi0+YnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZjEtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmMi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCT09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCWFyZ3MgPSBzdGF0ZS0+YXJnczsKKworCS8qCisJICogQ2hlY2sgb3JkZXJpbmcgb2YgYmxvY2tzLCByZXZlcnNlIGlmIGl0IG1ha2VzIHRoaW5ncyBzaW1wbGVyLgorCSAqCisJICogTk9URTogR2l2ZW4gdGhhdCBhbGwgKGN1cnJlbnQpIGNhbGxlcnMgcGFzcyBpbiBhbiBlbXB0eQorCSAqIHNlY29uZCBibG9jaywgdGhpcyBjb2RlIHNob3VsZCBuZXZlciBzZXQgInN3YXAiLgorCSAqLworCXN3YXAgPSAwOworCWlmICh4ZnNfYXR0cl9sZWFmX29yZGVyKGJsazEtPmJwLCBibGsyLT5icCkpIHsKKwkJdG1wX2JsayA9IGJsazE7CisJCWJsazEgPSBibGsyOworCQlibGsyID0gdG1wX2JsazsKKwkJbGVhZjEgPSBibGsxLT5icC0+ZGF0YTsKKwkJbGVhZjIgPSBibGsyLT5icC0+ZGF0YTsKKwkJc3dhcCA9IDE7CisJfQorCWhkcjEgPSAmbGVhZjEtPmhkcjsKKwloZHIyID0gJmxlYWYyLT5oZHI7CisKKwkvKgorCSAqIEV4YW1pbmUgZW50cmllcyB1bnRpbCB3ZSByZWR1Y2UgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgaW4KKwkgKiBieXRlIHVzYWdlIGJldHdlZW4gdGhlIHR3byBibG9ja3MgdG8gYSBtaW5pbXVtLiAgVGhlbiBnZXQKKwkgKiB0aGUgZGlyZWN0aW9uIHRvIGNvcHkgYW5kIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gbW92ZS4KKwkgKgorCSAqICJpbmxlYWYiIGlzIHRydWUgaWYgdGhlIG5ldyBlbnRyeSBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBibGsxLgorCSAqIElmICJzd2FwIiBpcyBhbHNvIHRydWUsIHRoZW4gcmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgImlubGVhZiIuCisJICovCisJc3RhdGUtPmlubGVhZiA9IHhmc19hdHRyX2xlYWZfZmlndXJlX2JhbGFuY2Uoc3RhdGUsIGJsazEsIGJsazIsCisJCQkJCQkJICAgICZjb3VudCwgJnRvdGFsbGVuKTsKKwlpZiAoc3dhcCkKKwkJc3RhdGUtPmlubGVhZiA9ICFzdGF0ZS0+aW5sZWFmOworCisJLyoKKwkgKiBNb3ZlIGFueSBlbnRyaWVzIHJlcXVpcmVkIGZyb20gbGVhZiB0byBsZWFmOgorCSAqLworCWlmIChjb3VudCA8IElOVF9HRVQoaGRyMS0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJLyoKKwkJICogRmlndXJlIHRoZSB0b3RhbCBieXRlcyB0byBiZSBhZGRlZCB0byB0aGUgZGVzdGluYXRpb24gbGVhZi4KKwkJICovCisJCS8qIG51bWJlciBlbnRyaWVzIGJlaW5nIG1vdmVkICovCisJCWNvdW50ID0gSU5UX0dFVChoZHIxLT5jb3VudCwgQVJDSF9DT05WRVJUKSAtIGNvdW50OworCQlzcGFjZSAgPSBJTlRfR0VUKGhkcjEtPnVzZWRieXRlcywgQVJDSF9DT05WRVJUKSAtIHRvdGFsbGVuOworCQlzcGFjZSArPSBjb3VudCAqIHNpemVvZih4ZnNfYXR0cl9sZWFmX2VudHJ5X3QpOworCisJCS8qCisJCSAqIGxlYWYyIGlzIHRoZSBkZXN0aW5hdGlvbiwgY29tcGFjdCBpdCBpZiBpdCBsb29rcyB0aWdodC4KKwkJICovCisJCW1heCAgPSBJTlRfR0VUKGhkcjItPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKQorCQkJCQkJLSBzaXplb2YoeGZzX2F0dHJfbGVhZl9oZHJfdCk7CisJCW1heCAtPSBJTlRfR0VUKGhkcjItPmNvdW50LCBBUkNIX0NPTlZFUlQpCisJCQkJCSogc2l6ZW9mKHhmc19hdHRyX2xlYWZfZW50cnlfdCk7CisJCWlmIChzcGFjZSA+IG1heCkgeworCQkJeGZzX2F0dHJfbGVhZl9jb21wYWN0KGFyZ3MtPnRyYW5zLCBibGsyLT5icCk7CisJCX0KKworCQkvKgorCQkgKiBNb3ZlIGhpZ2ggZW50cmllcyBmcm9tIGxlYWYxIHRvIGxvdyBlbmQgb2YgbGVhZjIuCisJCSAqLworCQl4ZnNfYXR0cl9sZWFmX21vdmVlbnRzKGxlYWYxLAorCQkJCUlOVF9HRVQoaGRyMS0+Y291bnQsIEFSQ0hfQ09OVkVSVCktY291bnQsCisJCQkJbGVhZjIsIDAsIGNvdW50LCBzdGF0ZS0+bXApOworCisJCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBibGsxLT5icCwgMCwgc3RhdGUtPmJsb2Nrc2l6ZS0xKTsKKwkJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJsazItPmJwLCAwLCBzdGF0ZS0+YmxvY2tzaXplLTEpOworCX0gZWxzZSBpZiAoY291bnQgPiBJTlRfR0VUKGhkcjEtPmNvdW50LCBBUkNIX0NPTlZFUlQpKSB7CisJCS8qCisJCSAqIEkgYXNzZXJ0IHRoYXQgc2luY2UgYWxsIGNhbGxlcnMgcGFzcyBpbiBhbiBlbXB0eQorCQkgKiBzZWNvbmQgYnVmZmVyLCB0aGlzIGNvZGUgc2hvdWxkIG5ldmVyIGV4ZWN1dGUuCisJCSAqLworCisJCS8qCisJCSAqIEZpZ3VyZSB0aGUgdG90YWwgYnl0ZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGRlc3RpbmF0aW9uIGxlYWYuCisJCSAqLworCQkvKiBudW1iZXIgZW50cmllcyBiZWluZyBtb3ZlZCAqLworCQljb3VudCAtPSBJTlRfR0VUKGhkcjEtPmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQlzcGFjZSAgPSB0b3RhbGxlbiAtIElOVF9HRVQoaGRyMS0+dXNlZGJ5dGVzLCBBUkNIX0NPTlZFUlQpOworCQlzcGFjZSArPSBjb3VudCAqIHNpemVvZih4ZnNfYXR0cl9sZWFmX2VudHJ5X3QpOworCisJCS8qCisJCSAqIGxlYWYxIGlzIHRoZSBkZXN0aW5hdGlvbiwgY29tcGFjdCBpdCBpZiBpdCBsb29rcyB0aWdodC4KKwkJICovCisJCW1heCAgPSBJTlRfR0VUKGhkcjEtPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKQorCQkJCQkJLSBzaXplb2YoeGZzX2F0dHJfbGVhZl9oZHJfdCk7CisJCW1heCAtPSBJTlRfR0VUKGhkcjEtPmNvdW50LCBBUkNIX0NPTlZFUlQpCisJCQkJCSogc2l6ZW9mKHhmc19hdHRyX2xlYWZfZW50cnlfdCk7CisJCWlmIChzcGFjZSA+IG1heCkgeworCQkJeGZzX2F0dHJfbGVhZl9jb21wYWN0KGFyZ3MtPnRyYW5zLCBibGsxLT5icCk7CisJCX0KKworCQkvKgorCQkgKiBNb3ZlIGxvdyBlbnRyaWVzIGZyb20gbGVhZjIgdG8gaGlnaCBlbmQgb2YgbGVhZjEuCisJCSAqLworCQl4ZnNfYXR0cl9sZWFmX21vdmVlbnRzKGxlYWYyLCAwLCBsZWFmMSwKKwkJCQkoaW50KUlOVF9HRVQoaGRyMS0+Y291bnQsIEFSQ0hfQ09OVkVSVCksIGNvdW50LAorCQkJCXN0YXRlLT5tcCk7CisKKwkJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJsazEtPmJwLCAwLCBzdGF0ZS0+YmxvY2tzaXplLTEpOworCQl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYmxrMi0+YnAsIDAsIHN0YXRlLT5ibG9ja3NpemUtMSk7CisJfQorCisJLyoKKwkgKiBDb3B5IG91dCBsYXN0IGhhc2h2YWwgaW4gZWFjaCBibG9jayBmb3IgQi10cmVlIGNvZGUuCisJICovCisJYmxrMS0+aGFzaHZhbCA9CisJICAgIElOVF9HRVQobGVhZjEtPmVudHJpZXNbSU5UX0dFVChsZWFmMS0+aGRyLmNvdW50LAorCQkJCSAgICBBUkNIX0NPTlZFUlQpLTFdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisJYmxrMi0+aGFzaHZhbCA9CisJICAgIElOVF9HRVQobGVhZjItPmVudHJpZXNbSU5UX0dFVChsZWFmMi0+aGRyLmNvdW50LAorCQkJCSAgICBBUkNIX0NPTlZFUlQpLTFdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisKKwkvKgorCSAqIEFkanVzdCB0aGUgZXhwZWN0ZWQgaW5kZXggZm9yIGluc2VydGlvbi4KKwkgKiBOT1RFOiB0aGlzIGNvZGUgZGVwZW5kcyBvbiB0aGUgKGN1cnJlbnQpIHNpdHVhdGlvbiB0aGF0IHRoZQorCSAqIHNlY29uZCBibG9jayB3YXMgb3JpZ2luYWxseSBlbXB0eS4KKwkgKgorCSAqIElmIHRoZSBpbnNlcnRpb24gcG9pbnQgbW92ZWQgdG8gdGhlIDJuZCBibG9jaywgd2UgbXVzdCBhZGp1c3QKKwkgKiB0aGUgaW5kZXguICBXZSBtdXN0IGFsc28gdHJhY2sgdGhlIGVudHJ5IGp1c3QgZm9sbG93aW5nIHRoZQorCSAqIG5ldyBlbnRyeSBmb3IgdXNlIGluIGFuICJhdG9taWMgcmVuYW1lIiBvcGVyYXRpb24sIHRoYXQgZW50cnkKKwkgKiBpcyBhbHdheXMgdGhlICJvbGQiIGVudHJ5IGFuZCB0aGUgIm5ldyIgZW50cnkgaXMgd2hhdCB3ZSBhcmUKKwkgKiBpbnNlcnRpbmcuICBUaGUgaW5kZXgvYmxrbm8gZmllbGRzIHJlZmVyIHRvIHRoZSAib2xkIiBlbnRyeSwKKwkgKiB3aGlsZSB0aGUgaW5kZXgyL2Jsa25vMiBmaWVsZHMgcmVmZXIgdG8gdGhlICJuZXciIGVudHJ5LgorCSAqLworCWlmIChibGsxLT5pbmRleCA+IElOVF9HRVQobGVhZjEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkgeworCQlBU1NFUlQoc3RhdGUtPmlubGVhZiA9PSAwKTsKKwkJYmxrMi0+aW5kZXggPSBibGsxLT5pbmRleAorCQkJCS0gSU5UX0dFVChsZWFmMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQlhcmdzLT5pbmRleCA9IGFyZ3MtPmluZGV4MiA9IGJsazItPmluZGV4OworCQlhcmdzLT5ibGtubyA9IGFyZ3MtPmJsa25vMiA9IGJsazItPmJsa25vOworCX0gZWxzZSBpZiAoYmxrMS0+aW5kZXggPT0gSU5UX0dFVChsZWFmMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKSB7CisJCWlmIChzdGF0ZS0+aW5sZWFmKSB7CisJCQlhcmdzLT5pbmRleCA9IGJsazEtPmluZGV4OworCQkJYXJncy0+Ymxrbm8gPSBibGsxLT5ibGtubzsKKwkJCWFyZ3MtPmluZGV4MiA9IDA7CisJCQlhcmdzLT5ibGtubzIgPSBibGsyLT5ibGtubzsKKwkJfSBlbHNlIHsKKwkJCWJsazItPmluZGV4ID0gYmxrMS0+aW5kZXgKKwkJCQkgICAgLSBJTlRfR0VUKGxlYWYxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCQlhcmdzLT5pbmRleCA9IGFyZ3MtPmluZGV4MiA9IGJsazItPmluZGV4OworCQkJYXJncy0+Ymxrbm8gPSBhcmdzLT5ibGtubzIgPSBibGsyLT5ibGtubzsKKwkJfQorCX0gZWxzZSB7CisJCUFTU0VSVChzdGF0ZS0+aW5sZWFmID09IDEpOworCQlhcmdzLT5pbmRleCA9IGFyZ3MtPmluZGV4MiA9IGJsazEtPmluZGV4OworCQlhcmdzLT5ibGtubyA9IGFyZ3MtPmJsa25vMiA9IGJsazEtPmJsa25vOworCX0KK30KKworLyoKKyAqIEV4YW1pbmUgZW50cmllcyB1bnRpbCB3ZSByZWR1Y2UgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgaW4KKyAqIGJ5dGUgdXNhZ2UgYmV0d2VlbiB0aGUgdHdvIGJsb2NrcyB0byBhIG1pbmltdW0uCisgKiBHUk9UOiBJcyB0aGlzIHJlYWxseSBuZWNlc3Nhcnk/ICBXaXRoIG90aGVyIHRoYW4gYSA1MTIgYnl0ZSBibG9ja3NpemUsCisgKiBHUk9UOiB0aGVyZSB3aWxsIGFsd2F5cyBiZSBlbm91Z2ggcm9vbSBpbiBlaXRoZXIgYmxvY2sgZm9yIGEgbmV3IGVudHJ5LgorICogR1JPVDogRG8gYSBkb3VibGUtc3BsaXQgZm9yIHRoaXMgY2FzZT8KKyAqLworU1RBVElDIGludAoreGZzX2F0dHJfbGVhZl9maWd1cmVfYmFsYW5jZSh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsCisJCQkJICAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrMSwKKwkJCQkgICAgeGZzX2RhX3N0YXRlX2Jsa190ICpibGsyLAorCQkJCSAgICBpbnQgKmNvdW50YXJnLCBpbnQgKnVzZWRieXRlc2FyZykKK3sKKwl4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZjEsICpsZWFmMjsKKwl4ZnNfYXR0cl9sZWFmX2hkcl90ICpoZHIxLCAqaGRyMjsKKwl4ZnNfYXR0cl9sZWFmX2VudHJ5X3QgKmVudHJ5OworCWludCBjb3VudCwgbWF4LCBpbmRleCwgdG90YWxsZW4sIGhhbGY7CisJaW50IGxhc3RkZWx0YSwgZm91bmRpdCwgdG1wOworCisJLyoKKwkgKiBTZXQgdXAgZW52aXJvbm1lbnQuCisJICovCisJbGVhZjEgPSBibGsxLT5icC0+ZGF0YTsKKwlsZWFmMiA9IGJsazItPmJwLT5kYXRhOworCWhkcjEgPSAmbGVhZjEtPmhkcjsKKwloZHIyID0gJmxlYWYyLT5oZHI7CisJZm91bmRpdCA9IDA7CisJdG90YWxsZW4gPSAwOworCisJLyoKKwkgKiBFeGFtaW5lIGVudHJpZXMgdW50aWwgd2UgcmVkdWNlIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGluCisJICogYnl0ZSB1c2FnZSBiZXR3ZWVuIHRoZSB0d28gYmxvY2tzIHRvIGEgbWluaW11bS4KKwkgKi8KKwltYXggPSBJTlRfR0VUKGhkcjEtPmNvdW50LCBBUkNIX0NPTlZFUlQpCisJCQkrIElOVF9HRVQoaGRyMi0+Y291bnQsIEFSQ0hfQ09OVkVSVCk7CisJaGFsZiAgPSAobWF4KzEpICogc2l6ZW9mKCplbnRyeSk7CisJaGFsZiArPSBJTlRfR0VUKGhkcjEtPnVzZWRieXRlcywgQVJDSF9DT05WRVJUKQorCQkJCSsgSU5UX0dFVChoZHIyLT51c2VkYnl0ZXMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkrIHhmc19hdHRyX2xlYWZfbmV3ZW50c2l6ZShzdGF0ZS0+YXJncywKKwkJCQkJCSAgICAgc3RhdGUtPmJsb2Nrc2l6ZSwgTlVMTCk7CisJaGFsZiAvPSAyOworCWxhc3RkZWx0YSA9IHN0YXRlLT5ibG9ja3NpemU7CisJZW50cnkgPSAmbGVhZjEtPmVudHJpZXNbMF07CisJZm9yIChjb3VudCA9IGluZGV4ID0gMDsgY291bnQgPCBtYXg7IGVudHJ5KyssIGluZGV4KyssIGNvdW50KyspIHsKKworI2RlZmluZSBYRlNfQVRUUl9BQlMoQSkJKCgoQSkgPCAwKSA/IC0oQSkgOiAoQSkpCisJCS8qCisJCSAqIFRoZSBuZXcgZW50cnkgaXMgaW4gdGhlIGZpcnN0IGJsb2NrLCBhY2NvdW50IGZvciBpdC4KKwkJICovCisJCWlmIChjb3VudCA9PSBibGsxLT5pbmRleCkgeworCQkJdG1wID0gdG90YWxsZW4gKyBzaXplb2YoKmVudHJ5KSArCisJCQkJeGZzX2F0dHJfbGVhZl9uZXdlbnRzaXplKHN0YXRlLT5hcmdzLAorCQkJCQkJCSBzdGF0ZS0+YmxvY2tzaXplLAorCQkJCQkJCSBOVUxMKTsKKwkJCWlmIChYRlNfQVRUUl9BQlMoaGFsZiAtIHRtcCkgPiBsYXN0ZGVsdGEpCisJCQkJYnJlYWs7CisJCQlsYXN0ZGVsdGEgPSBYRlNfQVRUUl9BQlMoaGFsZiAtIHRtcCk7CisJCQl0b3RhbGxlbiA9IHRtcDsKKwkJCWZvdW5kaXQgPSAxOworCQl9CisKKwkJLyoKKwkJICogV3JhcCBhcm91bmQgaW50byB0aGUgc2Vjb25kIGJsb2NrIGlmIG5lY2Vzc2FyeS4KKwkJICovCisJCWlmIChjb3VudCA9PSBJTlRfR0VUKGhkcjEtPmNvdW50LCBBUkNIX0NPTlZFUlQpKSB7CisJCQlsZWFmMSA9IGxlYWYyOworCQkJZW50cnkgPSAmbGVhZjEtPmVudHJpZXNbMF07CisJCQlpbmRleCA9IDA7CisJCX0KKworCQkvKgorCQkgKiBGaWd1cmUgb3V0IGlmIG5leHQgbGVhZiBlbnRyeSB3b3VsZCBiZSB0b28gbXVjaC4KKwkJICovCisJCXRtcCA9IHRvdGFsbGVuICsgc2l6ZW9mKCplbnRyeSkgKyB4ZnNfYXR0cl9sZWFmX2VudHNpemUobGVhZjEsCisJCQkJCQkJCQlpbmRleCk7CisJCWlmIChYRlNfQVRUUl9BQlMoaGFsZiAtIHRtcCkgPiBsYXN0ZGVsdGEpCisJCQlicmVhazsKKwkJbGFzdGRlbHRhID0gWEZTX0FUVFJfQUJTKGhhbGYgLSB0bXApOworCQl0b3RhbGxlbiA9IHRtcDsKKyN1bmRlZiBYRlNfQVRUUl9BQlMKKwl9CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHVzZWRieXRlcyB0aGF0IHdpbGwgZW5kIHVwIGluIGxvd2VyIGJsb2NrLgorCSAqIElmIG5ldyBlbnRyeSBub3QgaW4gbG93ZXIgYmxvY2ssIGZpeCB1cCB0aGUgY291bnQuCisJICovCisJdG90YWxsZW4gLT0gY291bnQgKiBzaXplb2YoKmVudHJ5KTsKKwlpZiAoZm91bmRpdCkgeworCQl0b3RhbGxlbiAtPSBzaXplb2YoKmVudHJ5KSArCisJCQkJeGZzX2F0dHJfbGVhZl9uZXdlbnRzaXplKHN0YXRlLT5hcmdzLAorCQkJCQkJCSBzdGF0ZS0+YmxvY2tzaXplLAorCQkJCQkJCSBOVUxMKTsKKwl9CisKKwkqY291bnRhcmcgPSBjb3VudDsKKwkqdXNlZGJ5dGVzYXJnID0gdG90YWxsZW47CisJcmV0dXJuKGZvdW5kaXQpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUm91dGluZXMgdXNlZCBmb3Igc2hyaW5raW5nIHRoZSBCdHJlZS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIENoZWNrIGEgbGVhZiBibG9jayBhbmQgaXRzIG5laWdoYm9ycyB0byBzZWUgaWYgdGhlIGJsb2NrIHNob3VsZCBiZQorICogY29sbGFwc2VkIGludG8gb25lIG9yIHRoZSBvdGhlciBuZWlnaGJvci4gIEFsd2F5cyBrZWVwIHRoZSBibG9jaworICogd2l0aCB0aGUgc21hbGxlciBibG9jayBudW1iZXIuCisgKiBJZiB0aGUgY3VycmVudCBibG9jayBpcyBvdmVyIDUwJSBmdWxsLCBkb24ndCB0cnkgdG8gam9pbiBpdCwgcmV0dXJuIDAuCisgKiBJZiB0aGUgYmxvY2sgaXMgZW1wdHksIGZpbGwgaW4gdGhlIHN0YXRlIHN0cnVjdHVyZSBhbmQgcmV0dXJuIDIuCisgKiBJZiBpdCBjYW4gYmUgY29sbGFwc2VkLCBmaWxsIGluIHRoZSBzdGF0ZSBzdHJ1Y3R1cmUgYW5kIHJldHVybiAxLgorICogSWYgbm90aGluZyBjYW4gYmUgZG9uZSwgcmV0dXJuIDAuCisgKgorICogR1JPVDogYWxsb3cgZm9yIElOQ09NUExFVEUgZW50cmllcyBpbiBjYWxjdWxhdGlvbi4KKyAqLworaW50Cit4ZnNfYXR0cl9sZWFmX3Rvb3NtYWxsKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwgaW50ICphY3Rpb24pCit7CisJeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWY7CisJeGZzX2RhX3N0YXRlX2Jsa190ICpibGs7CisJeGZzX2RhX2Jsa2luZm9fdCAqaW5mbzsKKwlpbnQgY291bnQsIGJ5dGVzLCBmb3J3YXJkLCBlcnJvciwgcmV0dmFsLCBpOworCXhmc19kYWJsa190IGJsa25vOworCXhmc19kYWJ1Zl90ICpicDsKKworCS8qCisJICogQ2hlY2sgZm9yIHRoZSBkZWdlbmVyYXRlIGNhc2Ugb2YgdGhlIGJsb2NrIGJlaW5nIG92ZXIgNTAlIGZ1bGwuCisJICogSWYgc28sIGl0J3Mgbm90IHdvcnRoIGV2ZW4gbG9va2luZyB0byBzZWUgaWYgd2UgbWlnaHQgYmUgYWJsZQorCSAqIHRvIGNvYWxlc2NlIHdpdGggYSBzaWJsaW5nLgorCSAqLworCWJsayA9ICZzdGF0ZS0+cGF0aC5ibGtbIHN0YXRlLT5wYXRoLmFjdGl2ZS0xIF07CisJaW5mbyA9IGJsay0+YnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQoaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJbGVhZiA9ICh4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqKWluZm87CisJY291bnQgPSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwlieXRlcyA9IHNpemVvZih4ZnNfYXR0cl9sZWFmX2hkcl90KSArCisJCWNvdW50ICogc2l6ZW9mKHhmc19hdHRyX2xlYWZfZW50cnlfdCkgKworCQlJTlRfR0VUKGxlYWYtPmhkci51c2VkYnl0ZXMsIEFSQ0hfQ09OVkVSVCk7CisJaWYgKGJ5dGVzID4gKHN0YXRlLT5ibG9ja3NpemUgPj4gMSkpIHsKKwkJKmFjdGlvbiA9IDA7CS8qIGJsayBvdmVyIDUwJSwgZG9uJ3QgdHJ5IHRvIGpvaW4gKi8KKwkJcmV0dXJuKDApOworCX0KKworCS8qCisJICogQ2hlY2sgZm9yIHRoZSBkZWdlbmVyYXRlIGNhc2Ugb2YgdGhlIGJsb2NrIGJlaW5nIGVtcHR5LgorCSAqIElmIHRoZSBibG9jayBpcyBlbXB0eSwgd2UnbGwgc2ltcGx5IGRlbGV0ZSBpdCwgbm8gbmVlZCB0bworCSAqIGNvYWxlc2NlIGl0IHdpdGggYSBzaWJsaW5nIGJsb2NrLiAgV2UgY2hvb3NlIChhcmlidHJhcmlseSkKKwkgKiB0byBtZXJnZSB3aXRoIHRoZSBmb3J3YXJkIGJsb2NrIHVubGVzcyBpdCBpcyBOVUxMLgorCSAqLworCWlmIChjb3VudCA9PSAwKSB7CisJCS8qCisJCSAqIE1ha2UgYWx0cGF0aCBwb2ludCB0byB0aGUgYmxvY2sgd2Ugd2FudCB0byBrZWVwIGFuZAorCQkgKiBwYXRoIHBvaW50IHRvIHRoZSBibG9jayB3ZSB3YW50IHRvIGRyb3AgKHRoaXMgb25lKS4KKwkJICovCisJCWZvcndhcmQgPSBpbmZvLT5mb3J3OworCQltZW1jcHkoJnN0YXRlLT5hbHRwYXRoLCAmc3RhdGUtPnBhdGgsIHNpemVvZihzdGF0ZS0+cGF0aCkpOworCQllcnJvciA9IHhmc19kYV9wYXRoX3NoaWZ0KHN0YXRlLCAmc3RhdGUtPmFsdHBhdGgsIGZvcndhcmQsCisJCQkJCQkgMCwgJnJldHZhbCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybihlcnJvcik7CisJCWlmIChyZXR2YWwpIHsKKwkJCSphY3Rpb24gPSAwOworCQl9IGVsc2UgeworCQkJKmFjdGlvbiA9IDI7CisJCX0KKwkJcmV0dXJuKDApOworCX0KKworCS8qCisJICogRXhhbWluZSBlYWNoIHNpYmxpbmcgYmxvY2sgdG8gc2VlIGlmIHdlIGNhbiBjb2FsZXNjZSB3aXRoCisJICogYXQgbGVhc3QgMjUlIGZyZWUgc3BhY2UgdG8gc3BhcmUuICBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQKKwkgKiB3aGV0aGVyIHRvIG1lcmdlIHdpdGggdGhlIGZvcndhcmQgb3IgdGhlIGJhY2t3YXJkIGJsb2NrLgorCSAqIFdlIHByZWZlciBjb2FsZXNjaW5nIHdpdGggdGhlIGxvd2VyIG51bWJlcmVkIHNpYmxpbmcgc28gYXMKKwkgKiB0byBzaHJpbmsgYW4gYXR0cmlidXRlIGxpc3Qgb3ZlciB0aW1lLgorCSAqLworCS8qIHN0YXJ0IHdpdGggc21hbGxlciBibGsgbnVtICovCisJZm9yd2FyZCA9IChJTlRfR0VUKGluZm8tPmZvcncsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJPCBJTlRfR0VUKGluZm8tPmJhY2ssIEFSQ0hfQ09OVkVSVCkpOworCWZvciAoaSA9IDA7IGkgPCAyOyBmb3J3YXJkID0gIWZvcndhcmQsIGkrKykgeworCQlpZiAoZm9yd2FyZCkKKwkJCWJsa25vID0gSU5UX0dFVChpbmZvLT5mb3J3LCBBUkNIX0NPTlZFUlQpOworCQllbHNlCisJCQlibGtubyA9IElOVF9HRVQoaW5mby0+YmFjaywgQVJDSF9DT05WRVJUKTsKKwkJaWYgKGJsa25vID09IDApCisJCQljb250aW51ZTsKKwkJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoc3RhdGUtPmFyZ3MtPnRyYW5zLCBzdGF0ZS0+YXJncy0+ZHAsCisJCQkJCWJsa25vLCAtMSwgJmJwLCBYRlNfQVRUUl9GT1JLKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuKGVycm9yKTsKKwkJQVNTRVJUKGJwICE9IE5VTEwpOworCisJCWxlYWYgPSAoeGZzX2F0dHJfbGVhZmJsb2NrX3QgKilpbmZvOworCQljb3VudCAgPSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJYnl0ZXMgID0gc3RhdGUtPmJsb2Nrc2l6ZSAtIChzdGF0ZS0+YmxvY2tzaXplPj4yKTsKKwkJYnl0ZXMgLT0gSU5UX0dFVChsZWFmLT5oZHIudXNlZGJ5dGVzLCBBUkNIX0NPTlZFUlQpOworCQlsZWFmID0gYnAtPmRhdGE7CisJCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwkJY291bnQgKz0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCWJ5dGVzIC09IElOVF9HRVQobGVhZi0+aGRyLnVzZWRieXRlcywgQVJDSF9DT05WRVJUKTsKKwkJYnl0ZXMgLT0gY291bnQgKiBzaXplb2YoeGZzX2F0dHJfbGVhZl9lbnRyeV90KTsKKwkJYnl0ZXMgLT0gc2l6ZW9mKHhmc19hdHRyX2xlYWZfaGRyX3QpOworCQl4ZnNfZGFfYnJlbHNlKHN0YXRlLT5hcmdzLT50cmFucywgYnApOworCQlpZiAoYnl0ZXMgPj0gMCkKKwkJCWJyZWFrOwkvKiBmaXRzIHdpdGggYXQgbGVhc3QgMjUlIHRvIHNwYXJlICovCisJfQorCWlmIChpID49IDIpIHsKKwkJKmFjdGlvbiA9IDA7CisJCXJldHVybigwKTsKKwl9CisKKwkvKgorCSAqIE1ha2UgYWx0cGF0aCBwb2ludCB0byB0aGUgYmxvY2sgd2Ugd2FudCB0byBrZWVwICh0aGUgbG93ZXIKKwkgKiBudW1iZXJlZCBibG9jaykgYW5kIHBhdGggcG9pbnQgdG8gdGhlIGJsb2NrIHdlIHdhbnQgdG8gZHJvcC4KKwkgKi8KKwltZW1jcHkoJnN0YXRlLT5hbHRwYXRoLCAmc3RhdGUtPnBhdGgsIHNpemVvZihzdGF0ZS0+cGF0aCkpOworCWlmIChibGtubyA8IGJsay0+Ymxrbm8pIHsKKwkJZXJyb3IgPSB4ZnNfZGFfcGF0aF9zaGlmdChzdGF0ZSwgJnN0YXRlLT5hbHRwYXRoLCBmb3J3YXJkLAorCQkJCQkJIDAsICZyZXR2YWwpOworCX0gZWxzZSB7CisJCWVycm9yID0geGZzX2RhX3BhdGhfc2hpZnQoc3RhdGUsICZzdGF0ZS0+cGF0aCwgZm9yd2FyZCwKKwkJCQkJCSAwLCAmcmV0dmFsKTsKKwl9CisJaWYgKGVycm9yKQorCQlyZXR1cm4oZXJyb3IpOworCWlmIChyZXR2YWwpIHsKKwkJKmFjdGlvbiA9IDA7CisJfSBlbHNlIHsKKwkJKmFjdGlvbiA9IDE7CisJfQorCXJldHVybigwKTsKK30KKworLyoKKyAqIFJlbW92ZSBhIG5hbWUgZnJvbSB0aGUgbGVhZiBhdHRyaWJ1dGUgbGlzdCBzdHJ1Y3R1cmUuCisgKgorICogUmV0dXJuIDEgaWYgbGVhZiBpcyBsZXNzIHRoYW4gMzclIGZ1bGwsIDAgaWYgPj0gMzclIGZ1bGwuCisgKiBJZiB0d28gbGVhdmVzIGFyZSAzNyUgZnVsbCwgd2hlbiBjb21iaW5lZCB0aGV5IHdpbGwgbGVhdmUgMjUlIGZyZWUuCisgKi8KK2ludAoreGZzX2F0dHJfbGVhZl9yZW1vdmUoeGZzX2RhYnVmX3QgKmJwLCB4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmOworCXhmc19hdHRyX2xlYWZfaGRyX3QgKmhkcjsKKwl4ZnNfYXR0cl9sZWFmX21hcF90ICptYXA7CisJeGZzX2F0dHJfbGVhZl9lbnRyeV90ICplbnRyeTsKKwlpbnQgYmVmb3JlLCBhZnRlciwgc21hbGxlc3QsIGVudHNpemU7CisJaW50IHRhYmxlc2l6ZSwgdG1wLCBpOworCXhmc19tb3VudF90ICptcDsKKworCWxlYWYgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJaGRyID0gJmxlYWYtPmhkcjsKKwltcCA9IGFyZ3MtPnRyYW5zLT50X21vdW50cDsKKwlBU1NFUlQoKElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSA+IDApCisJCSYmIChJTlRfR0VUKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgPCAoWEZTX0xCU0laRShtcCkvOCkpKTsKKwlBU1NFUlQoKGFyZ3MtPmluZGV4ID49IDApCisJCSYmIChhcmdzLT5pbmRleCA8IElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSkpOworCUFTU0VSVChJTlRfR0VUKGhkci0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpCisJCQkJPj0gKChJTlRfR0VUKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJKiBzaXplb2YoKmVudHJ5KSkrc2l6ZW9mKCpoZHIpKSk7CisJZW50cnkgPSAmbGVhZi0+ZW50cmllc1thcmdzLT5pbmRleF07CisJQVNTRVJUKElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkKKwkJCQk+PSBJTlRfR0VUKGhkci0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpKTsKKwlBU1NFUlQoSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKSA8IFhGU19MQlNJWkUobXApKTsKKworCS8qCisJICogU2NhbiB0aHJvdWdoIGZyZWUgcmVnaW9uIHRhYmxlOgorCSAqICAgIGNoZWNrIGZvciBhZGphY2VuY3kgb2YgZnJlZSdkIGVudHJ5IHdpdGggYW4gZXhpc3Rpbmcgb25lLAorCSAqICAgIGZpbmQgc21hbGxlc3QgZnJlZSByZWdpb24gaW4gY2FzZSB3ZSBuZWVkIHRvIHJlcGxhY2UgaXQsCisJICogICAgYWRqdXN0IGFueSBtYXAgdGhhdCBib3JkZXJzIHRoZSBlbnRyeSB0YWJsZSwKKwkgKi8KKwl0YWJsZXNpemUgPSBJTlRfR0VUKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJKiBzaXplb2YoeGZzX2F0dHJfbGVhZl9lbnRyeV90KQorCQkJCQkrIHNpemVvZih4ZnNfYXR0cl9sZWFmX2hkcl90KTsKKwltYXAgPSAmaGRyLT5mcmVlbWFwWzBdOworCXRtcCA9IElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpOworCWJlZm9yZSA9IGFmdGVyID0gLTE7CisJc21hbGxlc3QgPSBYRlNfQVRUUl9MRUFGX01BUFNJWkUgLSAxOworCWVudHNpemUgPSB4ZnNfYXR0cl9sZWFmX2VudHNpemUobGVhZiwgYXJncy0+aW5kZXgpOworCWZvciAoaSA9IDA7IGkgPCBYRlNfQVRUUl9MRUFGX01BUFNJWkU7IG1hcCsrLCBpKyspIHsKKwkJQVNTRVJUKElOVF9HRVQobWFwLT5iYXNlLCBBUkNIX0NPTlZFUlQpIDwgWEZTX0xCU0laRShtcCkpOworCQlBU1NFUlQoSU5UX0dFVChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCkgPCBYRlNfTEJTSVpFKG1wKSk7CisJCWlmIChJTlRfR0VUKG1hcC0+YmFzZSwgQVJDSF9DT05WRVJUKSA9PSB0YWJsZXNpemUpIHsKKwkJCUlOVF9NT0QobWFwLT5iYXNlLCBBUkNIX0NPTlZFUlQsCisJCQkJCS1zaXplb2YoeGZzX2F0dHJfbGVhZl9lbnRyeV90KSk7CisJCQlJTlRfTU9EKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJULAorCQkJCQlzaXplb2YoeGZzX2F0dHJfbGVhZl9lbnRyeV90KSk7CisJCX0KKworCQlpZiAoKElOVF9HRVQobWFwLT5iYXNlLCBBUkNIX0NPTlZFUlQpCisJCQkJCSsgSU5UX0dFVChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCkpCisJCQkJPT0gSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKSkgeworCQkJYmVmb3JlID0gaTsKKwkJfSBlbHNlIGlmIChJTlRfR0VUKG1hcC0+YmFzZSwgQVJDSF9DT05WRVJUKQorCQkJPT0gKElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkgKyBlbnRzaXplKSkgeworCQkJYWZ0ZXIgPSBpOworCQl9IGVsc2UgaWYgKElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpIDwgdG1wKSB7CisJCQl0bXAgPSBJTlRfR0VUKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJUKTsKKwkJCXNtYWxsZXN0ID0gaTsKKwkJfQorCX0KKworCS8qCisJICogQ29hbGVzY2UgYWRqYWNlbnQgZnJlZW1hcCByZWdpb25zLAorCSAqIG9yIHJlcGxhY2UgdGhlIHNtYWxsZXN0IHJlZ2lvbi4KKwkgKi8KKwlpZiAoKGJlZm9yZSA+PSAwKSB8fCAoYWZ0ZXIgPj0gMCkpIHsKKwkJaWYgKChiZWZvcmUgPj0gMCkgJiYgKGFmdGVyID49IDApKSB7CisJCQltYXAgPSAmaGRyLT5mcmVlbWFwW2JlZm9yZV07CisJCQlJTlRfTU9EKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJULCBlbnRzaXplKTsKKwkJCUlOVF9NT0QobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQsCisJCQkJSU5UX0dFVChoZHItPmZyZWVtYXBbYWZ0ZXJdLnNpemUsCisJCQkJCQkJQVJDSF9DT05WRVJUKSk7CisJCQloZHItPmZyZWVtYXBbYWZ0ZXJdLmJhc2UgPSAwOworCQkJaGRyLT5mcmVlbWFwW2FmdGVyXS5zaXplID0gMDsKKwkJfSBlbHNlIGlmIChiZWZvcmUgPj0gMCkgeworCQkJbWFwID0gJmhkci0+ZnJlZW1hcFtiZWZvcmVdOworCQkJSU5UX01PRChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCwgZW50c2l6ZSk7CisJCX0gZWxzZSB7CisJCQltYXAgPSAmaGRyLT5mcmVlbWFwW2FmdGVyXTsKKwkJCS8qIGJvdGggb24tZGlzaywgZG9uJ3QgZW5kaWFuIGZsaXAgdHdpY2UgKi8KKwkJCW1hcC0+YmFzZSA9IGVudHJ5LT5uYW1laWR4OworCQkJSU5UX01PRChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCwgZW50c2l6ZSk7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBSZXBsYWNlIHNtYWxsZXN0IHJlZ2lvbiAoaWYgaXQgaXMgc21hbGxlciB0aGFuIGZyZWUnZCBlbnRyeSkKKwkJICovCisJCW1hcCA9ICZoZHItPmZyZWVtYXBbc21hbGxlc3RdOworCQlpZiAoSU5UX0dFVChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCkgPCBlbnRzaXplKSB7CisJCQlJTlRfU0VUKG1hcC0+YmFzZSwgQVJDSF9DT05WRVJULAorCQkJCQlJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpKTsKKwkJCUlOVF9TRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQsIGVudHNpemUpOworCQl9CisJfQorCisJLyoKKwkgKiBEaWQgd2UgcmVtb3ZlIHRoZSBmaXJzdCBlbnRyeT8KKwkgKi8KKwlpZiAoSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKQorCQkJCT09IElOVF9HRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkpCisJCXNtYWxsZXN0ID0gMTsKKwllbHNlCisJCXNtYWxsZXN0ID0gMDsKKworCS8qCisJICogQ29tcHJlc3MgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGFuZCB6ZXJvIG91dCB0aGUgcmVtb3ZlZCBzdHVmZi4KKwkgKi8KKwltZW1zZXQoWEZTX0FUVFJfTEVBRl9OQU1FKGxlYWYsIGFyZ3MtPmluZGV4KSwgMCwgZW50c2l6ZSk7CisJSU5UX01PRChoZHItPnVzZWRieXRlcywgQVJDSF9DT05WRVJULCAtZW50c2l6ZSk7CisJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwLAorCSAgICAgWEZTX0RBX0xPR1JBTkdFKGxlYWYsIFhGU19BVFRSX0xFQUZfTkFNRShsZWFmLCBhcmdzLT5pbmRleCksCisJCQkJICAgZW50c2l6ZSkpOworCisJdG1wID0gKElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSAtIGFyZ3MtPmluZGV4KQorCQkJCQkqIHNpemVvZih4ZnNfYXR0cl9sZWFmX2VudHJ5X3QpOworCW1lbW1vdmUoKGNoYXIgKillbnRyeSwgKGNoYXIgKikoZW50cnkrMSksIHRtcCk7CisJSU5UX01PRChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQsIC0xKTsKKwl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAsCisJICAgIFhGU19EQV9MT0dSQU5HRShsZWFmLCBlbnRyeSwgdG1wICsgc2l6ZW9mKCplbnRyeSkpKTsKKwllbnRyeSA9ICZsZWFmLT5lbnRyaWVzW0lOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKV07CisJbWVtc2V0KChjaGFyICopZW50cnksIDAsIHNpemVvZih4ZnNfYXR0cl9sZWFmX2VudHJ5X3QpKTsKKworCS8qCisJICogSWYgd2UgcmVtb3ZlZCB0aGUgZmlyc3QgZW50cnksIHJlLWZpbmQgdGhlIGZpcnN0IHVzZWQgYnl0ZQorCSAqIGluIHRoZSBuYW1lIGFyZWEuICBOb3RlIHRoYXQgaWYgdGhlIGVudHJ5IHdhcyB0aGUgImZpcnN0dXNlZCIsCisJICogdGhlbiB3ZSBkb24ndCBoYXZlIGEgImhvbGUiIGluIG91ciBibG9jayByZXN1bHRpbmcgZnJvbQorCSAqIHJlbW92aW5nIHRoZSBuYW1lLgorCSAqLworCWlmIChzbWFsbGVzdCkgeworCQl0bXAgPSBYRlNfTEJTSVpFKG1wKTsKKwkJZW50cnkgPSAmbGVhZi0+ZW50cmllc1swXTsKKwkJZm9yIChpID0gSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpLTE7CisJCQkJCQlpID49IDA7IGVudHJ5KyssIGktLSkgeworCQkJQVNTRVJUKElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkKKwkJCQk+PSBJTlRfR0VUKGhkci0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpKTsKKwkJCUFTU0VSVChJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpCisJCQkJCQkJPCBYRlNfTEJTSVpFKG1wKSk7CisJCQlpZiAoSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKSA8IHRtcCkKKwkJCQl0bXAgPSBJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpOworCQl9CisJCUlOVF9TRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCwgdG1wKTsKKwkJaWYgKCFoZHItPmZpcnN0dXNlZCkgeworCQkJSU5UX1NFVChoZHItPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJULAorCQkJCQl0bXAgLSBYRlNfQVRUUl9MRUFGX05BTUVfQUxJR04pOworCQl9CisJfSBlbHNlIHsKKwkJaGRyLT5ob2xlcyA9IDE7CQkvKiBtYXJrIGFzIG5lZWRpbmcgY29tcGFjdGlvbiAqLworCX0KKwl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAsCisJCQkgIFhGU19EQV9MT0dSQU5HRShsZWFmLCBoZHIsIHNpemVvZigqaGRyKSkpOworCisJLyoKKwkgKiBDaGVjayBpZiBsZWFmIGlzIGxlc3MgdGhhbiA1MCUgZnVsbCwgY2FsbGVyIG1heSB3YW50IHRvCisJICogImpvaW4iIHRoZSBsZWFmIHdpdGggYSBzaWJsaW5nIGlmIHNvLgorCSAqLworCXRtcCAgPSBzaXplb2YoeGZzX2F0dHJfbGVhZl9oZHJfdCk7CisJdG1wICs9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpCisJCQkJCSogc2l6ZW9mKHhmc19hdHRyX2xlYWZfZW50cnlfdCk7CisJdG1wICs9IElOVF9HRVQobGVhZi0+aGRyLnVzZWRieXRlcywgQVJDSF9DT05WRVJUKTsKKwlyZXR1cm4odG1wIDwgbXAtPm1fYXR0cl9tYWdpY3BjdCk7IC8qIGxlYWYgaXMgPCAzNyUgZnVsbCAqLworfQorCisvKgorICogTW92ZSBhbGwgdGhlIGF0dHJpYnV0ZSBsaXN0IGVudHJpZXMgZnJvbSBkcm9wX2xlYWYgaW50byBzYXZlX2xlYWYuCisgKi8KK3ZvaWQKK3hmc19hdHRyX2xlYWZfdW5iYWxhbmNlKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwgeGZzX2RhX3N0YXRlX2Jsa190ICpkcm9wX2JsaywKKwkJCQkgICAgICAgeGZzX2RhX3N0YXRlX2Jsa190ICpzYXZlX2JsaykKK3sKKwl4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqZHJvcF9sZWFmLCAqc2F2ZV9sZWFmLCAqdG1wX2xlYWY7CisJeGZzX2F0dHJfbGVhZl9oZHJfdCAqZHJvcF9oZHIsICpzYXZlX2hkciwgKnRtcF9oZHI7CisJeGZzX21vdW50X3QgKm1wOworCWNoYXIgKnRtcGJ1ZmZlcjsKKworCS8qCisJICogU2V0IHVwIGVudmlyb25tZW50LgorCSAqLworCW1wID0gc3RhdGUtPm1wOworCUFTU0VSVChkcm9wX2Jsay0+bWFnaWMgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKHNhdmVfYmxrLT5tYWdpYyA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlkcm9wX2xlYWYgPSBkcm9wX2Jsay0+YnAtPmRhdGE7CisJc2F2ZV9sZWFmID0gc2F2ZV9ibGstPmJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGRyb3BfbGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCT09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCUFTU0VSVChJTlRfR0VUKHNhdmVfbGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCT09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCWRyb3BfaGRyID0gJmRyb3BfbGVhZi0+aGRyOworCXNhdmVfaGRyID0gJnNhdmVfbGVhZi0+aGRyOworCisJLyoKKwkgKiBTYXZlIGxhc3QgaGFzaHZhbCBmcm9tIGR5aW5nIGJsb2NrIGZvciBsYXRlciBCdHJlZSBmaXh1cC4KKwkgKi8KKwlkcm9wX2Jsay0+aGFzaHZhbCA9CisJCUlOVF9HRVQoZHJvcF9sZWFmLT5lbnRyaWVzW0lOVF9HRVQoZHJvcF9sZWFmLT5oZHIuY291bnQsCisJCQkJCQlBUkNIX0NPTlZFUlQpLTFdLmhhc2h2YWwsCisJCQkJCQkJCUFSQ0hfQ09OVkVSVCk7CisKKwkvKgorCSAqIENoZWNrIGlmIHdlIG5lZWQgYSB0ZW1wIGJ1ZmZlciwgb3IgY2FuIHdlIGRvIGl0IGluIHBsYWNlLgorCSAqIE5vdGUgdGhhdCB3ZSBkb24ndCBjaGVjayAibGVhZiIgZm9yIGhvbGVzIGJlY2F1c2Ugd2Ugd2lsbAorCSAqIGFsd2F5cyBiZSBkcm9wcGluZyBpdCwgdG9vc21hbGwoKSBkZWNpZGVkIHRoYXQgZm9yIHVzIGFscmVhZHkuCisJICovCisJaWYgKHNhdmVfaGRyLT5ob2xlcyA9PSAwKSB7CisJCS8qCisJCSAqIGRlc3QgbGVhZiBoYXMgbm8gaG9sZXMsIHNvIHdlIGFkZCB0aGVyZS4gIE1heSBuZWVkCisJCSAqIHRvIG1ha2Ugc29tZSByb29tIGluIHRoZSBlbnRyeSBhcnJheS4KKwkJICovCisJCWlmICh4ZnNfYXR0cl9sZWFmX29yZGVyKHNhdmVfYmxrLT5icCwgZHJvcF9ibGstPmJwKSkgeworCQkJeGZzX2F0dHJfbGVhZl9tb3ZlZW50cyhkcm9wX2xlYWYsIDAsIHNhdmVfbGVhZiwgMCwKKwkJCSAgICAgKGludClJTlRfR0VUKGRyb3BfaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSwgbXApOworCQl9IGVsc2UgeworCQkJeGZzX2F0dHJfbGVhZl9tb3ZlZW50cyhkcm9wX2xlYWYsIDAsIHNhdmVfbGVhZiwKKwkJCQkgIElOVF9HRVQoc2F2ZV9oZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpLAorCQkJCSAgKGludClJTlRfR0VUKGRyb3BfaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSwKKwkJCQkgIG1wKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIERlc3RpbmF0aW9uIGhhcyBob2xlcywgc28gd2UgbWFrZSBhIHRlbXBvcmFyeSBjb3B5CisJCSAqIG9mIHRoZSBsZWFmIGFuZCBhZGQgdGhlbSBib3RoIHRvIHRoYXQuCisJCSAqLworCQl0bXBidWZmZXIgPSBrbWVtX2FsbG9jKHN0YXRlLT5ibG9ja3NpemUsIEtNX1NMRUVQKTsKKwkJQVNTRVJUKHRtcGJ1ZmZlciAhPSBOVUxMKTsKKwkJbWVtc2V0KHRtcGJ1ZmZlciwgMCwgc3RhdGUtPmJsb2Nrc2l6ZSk7CisJCXRtcF9sZWFmID0gKHhmc19hdHRyX2xlYWZibG9ja190ICopdG1wYnVmZmVyOworCQl0bXBfaGRyID0gJnRtcF9sZWFmLT5oZHI7CisJCXRtcF9oZHItPmluZm8gPSBzYXZlX2hkci0+aW5mbzsJLyogc3RydWN0IGNvcHkgKi8KKwkJdG1wX2hkci0+Y291bnQgPSAwOworCQlJTlRfU0VUKHRtcF9oZHItPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJULCBzdGF0ZS0+YmxvY2tzaXplKTsKKwkJaWYgKCF0bXBfaGRyLT5maXJzdHVzZWQpIHsKKwkJCUlOVF9TRVQodG1wX2hkci0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQsCisJCQkJc3RhdGUtPmJsb2Nrc2l6ZSAtIFhGU19BVFRSX0xFQUZfTkFNRV9BTElHTik7CisJCX0KKwkJdG1wX2hkci0+dXNlZGJ5dGVzID0gMDsKKwkJaWYgKHhmc19hdHRyX2xlYWZfb3JkZXIoc2F2ZV9ibGstPmJwLCBkcm9wX2Jsay0+YnApKSB7CisJCQl4ZnNfYXR0cl9sZWFmX21vdmVlbnRzKGRyb3BfbGVhZiwgMCwgdG1wX2xlYWYsIDAsCisJCQkJKGludClJTlRfR0VUKGRyb3BfaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSwKKwkJCQltcCk7CisJCQl4ZnNfYXR0cl9sZWFmX21vdmVlbnRzKHNhdmVfbGVhZiwgMCwgdG1wX2xlYWYsCisJCQkJICBJTlRfR0VUKHRtcF9sZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCksCisJCQkJIChpbnQpSU5UX0dFVChzYXZlX2hkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCksCisJCQkJIG1wKTsKKwkJfSBlbHNlIHsKKwkJCXhmc19hdHRyX2xlYWZfbW92ZWVudHMoc2F2ZV9sZWFmLCAwLCB0bXBfbGVhZiwgMCwKKwkJCQkoaW50KUlOVF9HRVQoc2F2ZV9oZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpLAorCQkJCW1wKTsKKwkJCXhmc19hdHRyX2xlYWZfbW92ZWVudHMoZHJvcF9sZWFmLCAwLCB0bXBfbGVhZiwKKwkJCQlJTlRfR0VUKHRtcF9sZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCksCisJCQkJKGludClJTlRfR0VUKGRyb3BfaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSwKKwkJCQltcCk7CisJCX0KKwkJbWVtY3B5KChjaGFyICopc2F2ZV9sZWFmLCAoY2hhciAqKXRtcF9sZWFmLCBzdGF0ZS0+YmxvY2tzaXplKTsKKwkJa21lbV9mcmVlKHRtcGJ1ZmZlciwgc3RhdGUtPmJsb2Nrc2l6ZSk7CisJfQorCisJeGZzX2RhX2xvZ19idWYoc3RhdGUtPmFyZ3MtPnRyYW5zLCBzYXZlX2Jsay0+YnAsIDAsCisJCQkJCSAgIHN0YXRlLT5ibG9ja3NpemUgLSAxKTsKKworCS8qCisJICogQ29weSBvdXQgbGFzdCBoYXNodmFsIGluIGVhY2ggYmxvY2sgZm9yIEItdHJlZSBjb2RlLgorCSAqLworCXNhdmVfYmxrLT5oYXNodmFsID0KKwkJSU5UX0dFVChzYXZlX2xlYWYtPmVudHJpZXNbSU5UX0dFVChzYXZlX2xlYWYtPmhkci5jb3VudCwKKwkJCQkJCUFSQ0hfQ09OVkVSVCktMV0uaGFzaHZhbCwKKwkJCQkJCQkJQVJDSF9DT05WRVJUKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJvdXRpbmVzIHVzZWQgZm9yIGZpbmRpbmcgdGhpbmdzIGluIHRoZSBCdHJlZS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIExvb2sgdXAgYSBuYW1lIGluIGEgbGVhZiBhdHRyaWJ1dGUgbGlzdCBzdHJ1Y3R1cmUuCisgKiBUaGlzIGlzIHRoZSBpbnRlcm5hbCByb3V0aW5lLCBpdCB1c2VzIHRoZSBjYWxsZXIncyBidWZmZXIuCisgKgorICogTm90ZSB0aGF0IGR1cGxpY2F0ZSBrZXlzIGFyZSBhbGxvd2VkLCBidXQgb25seSBjaGVjayB3aXRoaW4gdGhlCisgKiBjdXJyZW50IGxlYWYgbm9kZS4gIFRoZSBCdHJlZSBjb2RlIG11c3QgY2hlY2sgaW4gYWRqYWNlbnQgbGVhZiBub2Rlcy4KKyAqCisgKiBSZXR1cm4gaW4gYXJncy0+aW5kZXggdGhlIGluZGV4IGludG8gdGhlIGVudHJ5W10gYXJyYXkgb2YgZWl0aGVyCisgKiB0aGUgZm91bmQgZW50cnksIG9yIHdoZXJlIHRoZSBlbnRyeSBzaG91bGQgaGF2ZSBiZWVuIChpbnNlcnQgYmVmb3JlCisgKiB0aGF0IGVudHJ5KS4KKyAqCisgKiBEb24ndCBjaGFuZ2UgdGhlIGFyZ3MtPnZhbHVlIHVubGVzcyB3ZSBmaW5kIHRoZSBhdHRyaWJ1dGUuCisgKi8KK2ludAoreGZzX2F0dHJfbGVhZl9sb29rdXBfaW50KHhmc19kYWJ1Zl90ICpicCwgeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwl4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZjsKKwl4ZnNfYXR0cl9sZWFmX2VudHJ5X3QgKmVudHJ5OworCXhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbF90ICpuYW1lX2xvYzsKKwl4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlX3QgKm5hbWVfcm10OworCWludCBwcm9iZSwgc3BhbjsKKwl4ZnNfZGFoYXNoX3QgaGFzaHZhbDsKKworCWxlYWYgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpCisJCQkJCTwgKFhGU19MQlNJWkUoYXJncy0+ZHAtPmlfbW91bnQpLzgpKTsKKworCS8qCisJICogQmluYXJ5IHNlYXJjaC4gIChub3RlOiBzbWFsbCBibG9ja3Mgd2lsbCBza2lwIHRoaXMgbG9vcCkKKwkgKi8KKwloYXNodmFsID0gYXJncy0+aGFzaHZhbDsKKwlwcm9iZSA9IHNwYW4gPSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAvIDI7CisJZm9yIChlbnRyeSA9ICZsZWFmLT5lbnRyaWVzW3Byb2JlXTsgc3BhbiA+IDQ7CisJCSAgIGVudHJ5ID0gJmxlYWYtPmVudHJpZXNbcHJvYmVdKSB7CisJCXNwYW4gLz0gMjsKKwkJaWYgKElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPCBoYXNodmFsKQorCQkJcHJvYmUgKz0gc3BhbjsKKwkJZWxzZSBpZiAoSU5UX0dFVChlbnRyeS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA+IGhhc2h2YWwpCisJCQlwcm9iZSAtPSBzcGFuOworCQllbHNlCisJCQlicmVhazsKKwl9CisJQVNTRVJUKChwcm9iZSA+PSAwKSAmJiAKKwkgICAgICAgKCFsZWFmLT5oZHIuY291bnQKKwkgICAgICAgfHwgKHByb2JlIDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpKSk7CisJQVNTRVJUKChzcGFuIDw9IDQpIHx8IChJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpCisJCQkJCQkJPT0gaGFzaHZhbCkpOworCisJLyoKKwkgKiBTaW5jZSB3ZSBtYXkgaGF2ZSBkdXBsaWNhdGUgaGFzaHZhbCdzLCBmaW5kIHRoZSBmaXJzdCBtYXRjaGluZworCSAqIGhhc2h2YWwgaW4gdGhlIGxlYWYuCisJICovCisJd2hpbGUgKChwcm9iZSA+IDApICYmIChJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpCisJCQkJCQkJPj0gaGFzaHZhbCkpIHsKKwkJZW50cnktLTsKKwkJcHJvYmUtLTsKKwl9CisJd2hpbGUgKChwcm9iZSA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKQorCQkmJiAoSU5UX0dFVChlbnRyeS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA8IGhhc2h2YWwpKSB7CisJCWVudHJ5Kys7CisJCXByb2JlKys7CisJfQorCWlmICgocHJvYmUgPT0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpCisJCSAgICB8fCAoSU5UX0dFVChlbnRyeS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSAhPSBoYXNodmFsKSkgeworCQlhcmdzLT5pbmRleCA9IHByb2JlOworCQlyZXR1cm4oWEZTX0VSUk9SKEVOT0FUVFIpKTsKKwl9CisKKwkvKgorCSAqIER1cGxpY2F0ZSBrZXlzIG1heSBiZSBwcmVzZW50LCBzbyBzZWFyY2ggYWxsIG9mIHRoZW0gZm9yIGEgbWF0Y2guCisJICovCisJZm9yICggIDsgKHByb2JlIDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpCisJCQkmJiAoSU5UX0dFVChlbnRyeS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA9PSBoYXNodmFsKTsKKwkJCWVudHJ5KyssIHByb2JlKyspIHsKKy8qCisgKiBHUk9UOiBBZGQgY29kZSB0byByZW1vdmUgaW5jb21wbGV0ZSBlbnRyaWVzLgorICovCisJCS8qCisJCSAqIElmIHdlIGFyZSBsb29raW5nIGZvciBJTkNPTVBMRVRFIGVudHJpZXMsIHNob3cgb25seSB0aG9zZS4KKwkJICogSWYgd2UgYXJlIGxvb2tpbmcgZm9yIGNvbXBsZXRlIGVudHJpZXMsIHNob3cgb25seSB0aG9zZS4KKwkJICovCisJCWlmICgoYXJncy0+ZmxhZ3MgJiBYRlNfQVRUUl9JTkNPTVBMRVRFKSAhPQorCQkgICAgKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX0lOQ09NUExFVEUpKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfTE9DQUwpIHsKKwkJCW5hbWVfbG9jID0gWEZTX0FUVFJfTEVBRl9OQU1FX0xPQ0FMKGxlYWYsIHByb2JlKTsKKwkJCWlmIChuYW1lX2xvYy0+bmFtZWxlbiAhPSBhcmdzLT5uYW1lbGVuKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKG1lbWNtcChhcmdzLT5uYW1lLCAoY2hhciAqKW5hbWVfbG9jLT5uYW1ldmFsLAorCQkJCQkgICAgIGFyZ3MtPm5hbWVsZW4pICE9IDApCisJCQkJY29udGludWU7CisJCQlpZiAoKChhcmdzLT5mbGFncyAmIEFUVFJfU0VDVVJFKSAhPSAwKSAhPQorCQkJICAgICgoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfU0VDVVJFKSAhPSAwKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICgoKGFyZ3MtPmZsYWdzICYgQVRUUl9ST09UKSAhPSAwKSAhPQorCQkJICAgICgoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfUk9PVCkgIT0gMCkpCisJCQkJY29udGludWU7CisJCQlhcmdzLT5pbmRleCA9IHByb2JlOworCQkJcmV0dXJuKFhGU19FUlJPUihFRVhJU1QpKTsKKwkJfSBlbHNlIHsKKwkJCW5hbWVfcm10ID0gWEZTX0FUVFJfTEVBRl9OQU1FX1JFTU9URShsZWFmLCBwcm9iZSk7CisJCQlpZiAobmFtZV9ybXQtPm5hbWVsZW4gIT0gYXJncy0+bmFtZWxlbikKKwkJCQljb250aW51ZTsKKwkJCWlmIChtZW1jbXAoYXJncy0+bmFtZSwgKGNoYXIgKiluYW1lX3JtdC0+bmFtZSwKKwkJCQkJICAgICBhcmdzLT5uYW1lbGVuKSAhPSAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCgoYXJncy0+ZmxhZ3MgJiBBVFRSX1NFQ1VSRSkgIT0gMCkgIT0KKwkJCSAgICAoKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX1NFQ1VSRSkgIT0gMCkpCisJCQkJY29udGludWU7CisJCQlpZiAoKChhcmdzLT5mbGFncyAmIEFUVFJfUk9PVCkgIT0gMCkgIT0KKwkJCSAgICAoKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX1JPT1QpICE9IDApKQorCQkJCWNvbnRpbnVlOworCQkJYXJncy0+aW5kZXggPSBwcm9iZTsKKwkJCWFyZ3MtPnJtdGJsa25vCisJCQkJICA9IElOVF9HRVQobmFtZV9ybXQtPnZhbHVlYmxrLCBBUkNIX0NPTlZFUlQpOworCQkJYXJncy0+cm10YmxrY250ID0gWEZTX0JfVE9fRlNCKGFyZ3MtPmRwLT5pX21vdW50LAorCQkJCQkJICAgSU5UX0dFVChuYW1lX3JtdC0+dmFsdWVsZW4sCisJCQkJCQkJCUFSQ0hfQ09OVkVSVCkpOworCQkJcmV0dXJuKFhGU19FUlJPUihFRVhJU1QpKTsKKwkJfQorCX0KKwlhcmdzLT5pbmRleCA9IHByb2JlOworCXJldHVybihYRlNfRVJST1IoRU5PQVRUUikpOworfQorCisvKgorICogR2V0IHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYW4gYXR0cmlidXRlIG5hbWUgZnJvbSBhIGxlYWYgYXR0cmlidXRlCisgKiBsaXN0IHN0cnVjdHVyZS4KKyAqLworaW50Cit4ZnNfYXR0cl9sZWFmX2dldHZhbHVlKHhmc19kYWJ1Zl90ICpicCwgeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwlpbnQgdmFsdWVsZW47CisJeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWY7CisJeGZzX2F0dHJfbGVhZl9lbnRyeV90ICplbnRyeTsKKwl4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWxfdCAqbmFtZV9sb2M7CisJeGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZV90ICpuYW1lX3JtdDsKKworCWxlYWYgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpCisJCQkJCTwgKFhGU19MQlNJWkUoYXJncy0+ZHAtPmlfbW91bnQpLzgpKTsKKwlBU1NFUlQoYXJncy0+aW5kZXggPCAoKGludClJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkpOworCisJZW50cnkgPSAmbGVhZi0+ZW50cmllc1thcmdzLT5pbmRleF07CisJaWYgKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX0xPQ0FMKSB7CisJCW5hbWVfbG9jID0gWEZTX0FUVFJfTEVBRl9OQU1FX0xPQ0FMKGxlYWYsIGFyZ3MtPmluZGV4KTsKKwkJQVNTRVJUKG5hbWVfbG9jLT5uYW1lbGVuID09IGFyZ3MtPm5hbWVsZW4pOworCQlBU1NFUlQobWVtY21wKGFyZ3MtPm5hbWUsIG5hbWVfbG9jLT5uYW1ldmFsLCBhcmdzLT5uYW1lbGVuKSA9PSAwKTsKKwkJdmFsdWVsZW4gPSBJTlRfR0VUKG5hbWVfbG9jLT52YWx1ZWxlbiwgQVJDSF9DT05WRVJUKTsKKwkJaWYgKGFyZ3MtPmZsYWdzICYgQVRUUl9LRVJOT1ZBTCkgeworCQkJYXJncy0+dmFsdWVsZW4gPSB2YWx1ZWxlbjsKKwkJCXJldHVybigwKTsKKwkJfQorCQlpZiAoYXJncy0+dmFsdWVsZW4gPCB2YWx1ZWxlbikgeworCQkJYXJncy0+dmFsdWVsZW4gPSB2YWx1ZWxlbjsKKwkJCXJldHVybihYRlNfRVJST1IoRVJBTkdFKSk7CisJCX0KKwkJYXJncy0+dmFsdWVsZW4gPSB2YWx1ZWxlbjsKKwkJbWVtY3B5KGFyZ3MtPnZhbHVlLCAmbmFtZV9sb2MtPm5hbWV2YWxbYXJncy0+bmFtZWxlbl0sIHZhbHVlbGVuKTsKKwl9IGVsc2UgeworCQluYW1lX3JtdCA9IFhGU19BVFRSX0xFQUZfTkFNRV9SRU1PVEUobGVhZiwgYXJncy0+aW5kZXgpOworCQlBU1NFUlQobmFtZV9ybXQtPm5hbWVsZW4gPT0gYXJncy0+bmFtZWxlbik7CisJCUFTU0VSVChtZW1jbXAoYXJncy0+bmFtZSwgbmFtZV9ybXQtPm5hbWUsIGFyZ3MtPm5hbWVsZW4pID09IDApOworCQl2YWx1ZWxlbiA9IElOVF9HRVQobmFtZV9ybXQtPnZhbHVlbGVuLCBBUkNIX0NPTlZFUlQpOworCQlhcmdzLT5ybXRibGtubyA9IElOVF9HRVQobmFtZV9ybXQtPnZhbHVlYmxrLCBBUkNIX0NPTlZFUlQpOworCQlhcmdzLT5ybXRibGtjbnQgPSBYRlNfQl9UT19GU0IoYXJncy0+ZHAtPmlfbW91bnQsIHZhbHVlbGVuKTsKKwkJaWYgKGFyZ3MtPmZsYWdzICYgQVRUUl9LRVJOT1ZBTCkgeworCQkJYXJncy0+dmFsdWVsZW4gPSB2YWx1ZWxlbjsKKwkJCXJldHVybigwKTsKKwkJfQorCQlpZiAoYXJncy0+dmFsdWVsZW4gPCB2YWx1ZWxlbikgeworCQkJYXJncy0+dmFsdWVsZW4gPSB2YWx1ZWxlbjsKKwkJCXJldHVybihYRlNfRVJST1IoRVJBTkdFKSk7CisJCX0KKwkJYXJncy0+dmFsdWVsZW4gPSB2YWx1ZWxlbjsKKwl9CisJcmV0dXJuKDApOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIE1vdmUgdGhlIGluZGljYXRlZCBlbnRyaWVzIGZyb20gb25lIGxlYWYgdG8gYW5vdGhlci4KKyAqIE5PVEU6IHRoaXMgcm91dGluZSBtb2RpZmllcyBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbGVhdmVzLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB2b2lkCit4ZnNfYXR0cl9sZWFmX21vdmVlbnRzKHhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmX3MsIGludCBzdGFydF9zLAorCQkJeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWZfZCwgaW50IHN0YXJ0X2QsCisJCQlpbnQgY291bnQsIHhmc19tb3VudF90ICptcCkKK3sKKwl4ZnNfYXR0cl9sZWFmX2hkcl90ICpoZHJfcywgKmhkcl9kOworCXhmc19hdHRyX2xlYWZfZW50cnlfdCAqZW50cnlfcywgKmVudHJ5X2Q7CisJaW50IGRlc3RpLCB0bXAsIGk7CisKKwkvKgorCSAqIENoZWNrIGZvciBub3RoaW5nIHRvIGRvLgorCSAqLworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFNldCB1cCBlbnZpcm9ubWVudC4KKwkgKi8KKwlBU1NFUlQoSU5UX0dFVChsZWFmX3MtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmX2QtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwloZHJfcyA9ICZsZWFmX3MtPmhkcjsKKwloZHJfZCA9ICZsZWFmX2QtPmhkcjsKKwlBU1NFUlQoKElOVF9HRVQoaGRyX3MtPmNvdW50LCBBUkNIX0NPTlZFUlQpID4gMCkKKwkJCQkmJiAoSU5UX0dFVChoZHJfcy0+Y291bnQsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCTwgKFhGU19MQlNJWkUobXApLzgpKSk7CisJQVNTRVJUKElOVF9HRVQoaGRyX3MtPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKSA+PQorCQkoKElOVF9HRVQoaGRyX3MtPmNvdW50LCBBUkNIX0NPTlZFUlQpCisJCQkJCSogc2l6ZW9mKCplbnRyeV9zKSkrc2l6ZW9mKCpoZHJfcykpKTsKKwlBU1NFUlQoSU5UX0dFVChoZHJfZC0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgPCAoWEZTX0xCU0laRShtcCkvOCkpOworCUFTU0VSVChJTlRfR0VUKGhkcl9kLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJKChJTlRfR0VUKGhkcl9kLT5jb3VudCwgQVJDSF9DT05WRVJUKQorCQkJCQkqIHNpemVvZigqZW50cnlfZCkpK3NpemVvZigqaGRyX2QpKSk7CisKKwlBU1NFUlQoc3RhcnRfcyA8IElOVF9HRVQoaGRyX3MtPmNvdW50LCBBUkNIX0NPTlZFUlQpKTsKKwlBU1NFUlQoc3RhcnRfZCA8PSBJTlRfR0VUKGhkcl9kLT5jb3VudCwgQVJDSF9DT05WRVJUKSk7CisJQVNTRVJUKGNvdW50IDw9IElOVF9HRVQoaGRyX3MtPmNvdW50LCBBUkNIX0NPTlZFUlQpKTsKKworCS8qCisJICogTW92ZSB0aGUgZW50cmllcyBpbiB0aGUgZGVzdGluYXRpb24gbGVhZiB1cCB0byBtYWtlIGEgaG9sZT8KKwkgKi8KKwlpZiAoc3RhcnRfZCA8IElOVF9HRVQoaGRyX2QtPmNvdW50LCBBUkNIX0NPTlZFUlQpKSB7CisJCXRtcCAgPSBJTlRfR0VUKGhkcl9kLT5jb3VudCwgQVJDSF9DT05WRVJUKSAtIHN0YXJ0X2Q7CisJCXRtcCAqPSBzaXplb2YoeGZzX2F0dHJfbGVhZl9lbnRyeV90KTsKKwkJZW50cnlfcyA9ICZsZWFmX2QtPmVudHJpZXNbc3RhcnRfZF07CisJCWVudHJ5X2QgPSAmbGVhZl9kLT5lbnRyaWVzW3N0YXJ0X2QgKyBjb3VudF07CisJCW1lbW1vdmUoKGNoYXIgKillbnRyeV9kLCAoY2hhciAqKWVudHJ5X3MsIHRtcCk7CisJfQorCisJLyoKKwkgKiBDb3B5IGFsbCBlbnRyeSdzIGluIHRoZSBzYW1lIChzb3J0ZWQpIG9yZGVyLAorCSAqIGJ1dCBhbGxvY2F0ZSBhdHRyaWJ1dGUgaW5mbyBwYWNrZWQgYW5kIGluIHNlcXVlbmNlLgorCSAqLworCWVudHJ5X3MgPSAmbGVhZl9zLT5lbnRyaWVzW3N0YXJ0X3NdOworCWVudHJ5X2QgPSAmbGVhZl9kLT5lbnRyaWVzW3N0YXJ0X2RdOworCWRlc3RpID0gc3RhcnRfZDsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGVudHJ5X3MrKywgZW50cnlfZCsrLCBkZXN0aSsrLCBpKyspIHsKKwkJQVNTRVJUKElOVF9HRVQoZW50cnlfcy0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKQorCQkJCT49IElOVF9HRVQoaGRyX3MtPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKSk7CisJCXRtcCA9IHhmc19hdHRyX2xlYWZfZW50c2l6ZShsZWFmX3MsIHN0YXJ0X3MgKyBpKTsKKyNpZmRlZiBHUk9UCisJCS8qCisJCSAqIENvZGUgdG8gZHJvcCBJTkNPTVBMRVRFIGVudHJpZXMuICBEaWZmaWN1bHQgdG8gdXNlIGFzIHdlCisJCSAqIG1heSBhbHNvIG5lZWQgdG8gY2hhbmdlIHRoZSBpbnNlcnRpb24gaW5kZXguICBDb2RlIHR1cm5lZAorCQkgKiBvZmYgZm9yIDYuMiwgc2hvdWxkIGJlIHJldmlzaXRlZCBsYXRlci4KKwkJICovCisJCWlmIChlbnRyeV9zLT5mbGFncyAmIFhGU19BVFRSX0lOQ09NUExFVEUpIHsgLyogc2tpcCBwYXJ0aWFscz8gKi8KKwkJCW1lbXNldChYRlNfQVRUUl9MRUFGX05BTUUobGVhZl9zLCBzdGFydF9zICsgaSksIDAsIHRtcCk7CisJCQlJTlRfTU9EKGhkcl9zLT51c2VkYnl0ZXMsIEFSQ0hfQ09OVkVSVCwgLXRtcCk7CisJCQlJTlRfTU9EKGhkcl9zLT5jb3VudCwgQVJDSF9DT05WRVJULCAtMSk7CisJCQllbnRyeV9kLS07CS8qIHRvIGNvbXBlbnNhdGUgZm9yICsrIGluIGxvb3AgaGRyICovCisJCQlkZXN0aS0tOworCQkJaWYgKChzdGFydF9zICsgaSkgPCBvZmZzZXQpCisJCQkJcmVzdWx0Kys7CS8qIGluc2VydGlvbiBpbmRleCBhZGp1c3RtZW50ICovCisJCX0gZWxzZSB7CisjZW5kaWYgLyogR1JPVCAqLworCQkJSU5UX01PRChoZHJfZC0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQsIC10bXApOworCQkJLyogYm90aCBvbi1kaXNrLCBkb24ndCBlbmRpYW4gZmxpcCB0d2ljZSAqLworCQkJZW50cnlfZC0+aGFzaHZhbCA9IGVudHJ5X3MtPmhhc2h2YWw7CisJCQkvKiBib3RoIG9uLWRpc2ssIGRvbid0IGVuZGlhbiBmbGlwIHR3aWNlICovCisJCQllbnRyeV9kLT5uYW1laWR4ID0gaGRyX2QtPmZpcnN0dXNlZDsKKwkJCWVudHJ5X2QtPmZsYWdzID0gZW50cnlfcy0+ZmxhZ3M7CisJCQlBU1NFUlQoSU5UX0dFVChlbnRyeV9kLT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpICsgdG1wCisJCQkJCQkJPD0gWEZTX0xCU0laRShtcCkpOworCQkJbWVtbW92ZShYRlNfQVRUUl9MRUFGX05BTUUobGVhZl9kLCBkZXN0aSksCisJCQkJWEZTX0FUVFJfTEVBRl9OQU1FKGxlYWZfcywgc3RhcnRfcyArIGkpLCB0bXApOworCQkJQVNTRVJUKElOVF9HRVQoZW50cnlfcy0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKSArIHRtcAorCQkJCQkJCTw9IFhGU19MQlNJWkUobXApKTsKKwkJCW1lbXNldChYRlNfQVRUUl9MRUFGX05BTUUobGVhZl9zLCBzdGFydF9zICsgaSksIDAsIHRtcCk7CisJCQlJTlRfTU9EKGhkcl9zLT51c2VkYnl0ZXMsIEFSQ0hfQ09OVkVSVCwgLXRtcCk7CisJCQlJTlRfTU9EKGhkcl9kLT51c2VkYnl0ZXMsIEFSQ0hfQ09OVkVSVCwgdG1wKTsKKwkJCUlOVF9NT0QoaGRyX3MtPmNvdW50LCBBUkNIX0NPTlZFUlQsIC0xKTsKKwkJCUlOVF9NT0QoaGRyX2QtPmNvdW50LCBBUkNIX0NPTlZFUlQsIDEpOworCQkJdG1wID0gSU5UX0dFVChoZHJfZC0+Y291bnQsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCSogc2l6ZW9mKHhmc19hdHRyX2xlYWZfZW50cnlfdCkKKwkJCQkJCSsgc2l6ZW9mKHhmc19hdHRyX2xlYWZfaGRyX3QpOworCQkJQVNTRVJUKElOVF9HRVQoaGRyX2QtPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKSA+PSB0bXApOworI2lmZGVmIEdST1QKKwkJfQorI2VuZGlmIC8qIEdST1QgKi8KKwl9CisKKwkvKgorCSAqIFplcm8gb3V0IHRoZSBlbnRyaWVzIHdlIGp1c3QgY29waWVkLgorCSAqLworCWlmIChzdGFydF9zID09IElOVF9HRVQoaGRyX3MtPmNvdW50LCBBUkNIX0NPTlZFUlQpKSB7CisJCXRtcCA9IGNvdW50ICogc2l6ZW9mKHhmc19hdHRyX2xlYWZfZW50cnlfdCk7CisJCWVudHJ5X3MgPSAmbGVhZl9zLT5lbnRyaWVzW3N0YXJ0X3NdOworCQlBU1NFUlQoKChjaGFyICopZW50cnlfcyArIHRtcCkgPD0KKwkJICAgICAgICgoY2hhciAqKWxlYWZfcyArIFhGU19MQlNJWkUobXApKSk7CisJCW1lbXNldCgoY2hhciAqKWVudHJ5X3MsIDAsIHRtcCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTW92ZSB0aGUgcmVtYWluaW5nIGVudHJpZXMgZG93biB0byBmaWxsIHRoZSBob2xlLAorCQkgKiB0aGVuIHplcm8gdGhlIGVudHJpZXMgYXQgdGhlIHRvcC4KKwkJICovCisJCXRtcCAgPSBJTlRfR0VUKGhkcl9zLT5jb3VudCwgQVJDSF9DT05WRVJUKSAtIGNvdW50OworCQl0bXAgKj0gc2l6ZW9mKHhmc19hdHRyX2xlYWZfZW50cnlfdCk7CisJCWVudHJ5X3MgPSAmbGVhZl9zLT5lbnRyaWVzW3N0YXJ0X3MgKyBjb3VudF07CisJCWVudHJ5X2QgPSAmbGVhZl9zLT5lbnRyaWVzW3N0YXJ0X3NdOworCQltZW1tb3ZlKChjaGFyICopZW50cnlfZCwgKGNoYXIgKillbnRyeV9zLCB0bXApOworCisJCXRtcCA9IGNvdW50ICogc2l6ZW9mKHhmc19hdHRyX2xlYWZfZW50cnlfdCk7CisJCWVudHJ5X3MgPSAmbGVhZl9zLT5lbnRyaWVzW0lOVF9HRVQoaGRyX3MtPmNvdW50LAorCQkJCQkJCUFSQ0hfQ09OVkVSVCldOworCQlBU1NFUlQoKChjaGFyICopZW50cnlfcyArIHRtcCkgPD0KKwkJICAgICAgICgoY2hhciAqKWxlYWZfcyArIFhGU19MQlNJWkUobXApKSk7CisJCW1lbXNldCgoY2hhciAqKWVudHJ5X3MsIDAsIHRtcCk7CisJfQorCisJLyoKKwkgKiBGaWxsIGluIHRoZSBmcmVlbWFwIGluZm9ybWF0aW9uCisJICovCisJSU5UX1NFVChoZHJfZC0+ZnJlZW1hcFswXS5iYXNlLCBBUkNIX0NPTlZFUlQsCisJCQkJCXNpemVvZih4ZnNfYXR0cl9sZWFmX2hkcl90KSk7CisJSU5UX01PRChoZHJfZC0+ZnJlZW1hcFswXS5iYXNlLCBBUkNIX0NPTlZFUlQsCisJCQkJSU5UX0dFVChoZHJfZC0+Y291bnQsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJKiBzaXplb2YoeGZzX2F0dHJfbGVhZl9lbnRyeV90KSk7CisJSU5UX1NFVChoZHJfZC0+ZnJlZW1hcFswXS5zaXplLCBBUkNIX0NPTlZFUlQsCisJCQkJSU5UX0dFVChoZHJfZC0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpCisJCQkgICAgICAtIElOVF9HRVQoaGRyX2QtPmZyZWVtYXBbMF0uYmFzZSwgQVJDSF9DT05WRVJUKSk7CisJaGRyX2QtPmZyZWVtYXBbMV0uYmFzZSA9IDA7CisJaGRyX2QtPmZyZWVtYXBbMl0uYmFzZSA9IDA7CisJaGRyX2QtPmZyZWVtYXBbMV0uc2l6ZSA9IDA7CisJaGRyX2QtPmZyZWVtYXBbMl0uc2l6ZSA9IDA7CisJaGRyX3MtPmhvbGVzID0gMTsJLyogbGVhZiBtYXkgbm90IGJlIGNvbXBhY3QgKi8KK30KKworLyoKKyAqIENvbXBhcmUgdHdvIGxlYWYgYmxvY2tzICJvcmRlciIuCisgKiBSZXR1cm4gMCB1bmxlc3MgbGVhZjIgc2hvdWxkIGdvIGJlZm9yZSBsZWFmMS4KKyAqLworaW50Cit4ZnNfYXR0cl9sZWFmX29yZGVyKHhmc19kYWJ1Zl90ICpsZWFmMV9icCwgeGZzX2RhYnVmX3QgKmxlYWYyX2JwKQoreworCXhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmMSwgKmxlYWYyOworCisJbGVhZjEgPSBsZWFmMV9icC0+ZGF0YTsKKwlsZWFmMiA9IGxlYWYyX2JwLT5kYXRhOworCUFTU0VSVCgoSU5UX0dFVChsZWFmMS0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCT09IFhGU19BVFRSX0xFQUZfTUFHSUMpICYmCisJICAgICAgIChJTlRfR0VUKGxlYWYyLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJPT0gWEZTX0FUVFJfTEVBRl9NQUdJQykpOworCWlmICggICAoSU5UX0dFVChsZWFmMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpID4gMCkKKwkgICAgJiYgKElOVF9HRVQobGVhZjItPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSA+IDApCisJICAgICYmICggICAoSU5UX0dFVChsZWFmMi0+ZW50cmllc1sgMCBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPAorCQkgICAgICBJTlRfR0VUKGxlYWYxLT5lbnRyaWVzWyAwIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSkKKwkJfHwgKElOVF9HRVQobGVhZjItPmVudHJpZXNbSU5UX0dFVChsZWFmMi0+aGRyLmNvdW50LAorCQkJCUFSQ0hfQ09OVkVSVCktMV0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSA8CisJCSAgICAgIElOVF9HRVQobGVhZjEtPmVudHJpZXNbSU5UX0dFVChsZWFmMS0+aGRyLmNvdW50LAorCQkJCUFSQ0hfQ09OVkVSVCktMV0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSkpICkgeworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybigwKTsKK30KKworLyoKKyAqIFBpY2sgdXAgdGhlIGxhc3QgaGFzaHZhbHVlIGZyb20gYSBsZWFmIGJsb2NrLgorICovCit4ZnNfZGFoYXNoX3QKK3hmc19hdHRyX2xlYWZfbGFzdGhhc2goeGZzX2RhYnVmX3QgKmJwLCBpbnQgKmNvdW50KQoreworCXhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmOworCisJbGVhZiA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlpZiAoY291bnQpCisJCSpjb3VudCA9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCWlmICghbGVhZi0+aGRyLmNvdW50KQorCQlyZXR1cm4oMCk7CisJcmV0dXJuKElOVF9HRVQobGVhZi0+ZW50cmllc1tJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwKKwkJCQlBUkNIX0NPTlZFUlQpLTFdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkpOworfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCB0byBzdG9yZSB0aGUgaW5kaWNhdGVkIGF0dHJpYnV0ZQorICogKHdoZXRoZXIgbG9jYWwgb3IgcmVtb3RlIG9ubHkgY2FsY3VsYXRlIGJ5dGVzIGluIHRoaXMgYmxvY2spLgorICovCitpbnQKK3hmc19hdHRyX2xlYWZfZW50c2l6ZSh4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZiwgaW50IGluZGV4KQoreworCXhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbF90ICpuYW1lX2xvYzsKKwl4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlX3QgKm5hbWVfcm10OworCWludCBzaXplOworCisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCT09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCWlmIChsZWFmLT5lbnRyaWVzW2luZGV4XS5mbGFncyAmIFhGU19BVFRSX0xPQ0FMKSB7CisJCW5hbWVfbG9jID0gWEZTX0FUVFJfTEVBRl9OQU1FX0xPQ0FMKGxlYWYsIGluZGV4KTsKKwkJc2l6ZSA9IFhGU19BVFRSX0xFQUZfRU5UU0laRV9MT0NBTChuYW1lX2xvYy0+bmFtZWxlbiwKKwkJCQkJCSAgIElOVF9HRVQobmFtZV9sb2MtPnZhbHVlbGVuLAorCQkJCQkJCQlBUkNIX0NPTlZFUlQpKTsKKwl9IGVsc2UgeworCQluYW1lX3JtdCA9IFhGU19BVFRSX0xFQUZfTkFNRV9SRU1PVEUobGVhZiwgaW5kZXgpOworCQlzaXplID0gWEZTX0FUVFJfTEVBRl9FTlRTSVpFX1JFTU9URShuYW1lX3JtdC0+bmFtZWxlbik7CisJfQorCXJldHVybihzaXplKTsKK30KKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIG5ldworICogYXR0cmlidXRlICh3aGV0aGVyIGxvY2FsIG9yIHJlbW90ZSBvbmx5IGNhbGN1bGF0ZSBieXRlcyBpbiB0aGlzIGJsb2NrKS4KKyAqIFRoaXMgcm91dGluZSBkZWNpZGVzIGFzIGEgc2lkZSBlZmZlY3Qgd2hldGhlciB0aGUgYXR0cmlidXRlIHdpbGwgYmUKKyAqIGEgImxvY2FsIiBvciBhICJyZW1vdGUiIGF0dHJpYnV0ZS4KKyAqLworaW50Cit4ZnNfYXR0cl9sZWFmX25ld2VudHNpemUoeGZzX2RhX2FyZ3NfdCAqYXJncywgaW50IGJsb2Nrc2l6ZSwgaW50ICpsb2NhbCkKK3sKKwlpbnQgc2l6ZTsKKworCXNpemUgPSBYRlNfQVRUUl9MRUFGX0VOVFNJWkVfTE9DQUwoYXJncy0+bmFtZWxlbiwgYXJncy0+dmFsdWVsZW4pOworCWlmIChzaXplIDwgWEZTX0FUVFJfTEVBRl9FTlRTSVpFX0xPQ0FMX01BWChibG9ja3NpemUpKSB7CisJCWlmIChsb2NhbCkgeworCQkJKmxvY2FsID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCXNpemUgPSBYRlNfQVRUUl9MRUFGX0VOVFNJWkVfUkVNT1RFKGFyZ3MtPm5hbWVsZW4pOworCQlpZiAobG9jYWwpIHsKKwkJCSpsb2NhbCA9IDA7CisJCX0KKwl9CisJcmV0dXJuKHNpemUpOworfQorCisvKgorICogQ29weSBvdXQgYXR0cmlidXRlIGxpc3QgZW50cmllcyBmb3IgYXR0cl9saXN0KCksIGZvciBsZWFmIGF0dHJpYnV0ZSBsaXN0cy4KKyAqLworaW50Cit4ZnNfYXR0cl9sZWFmX2xpc3RfaW50KHhmc19kYWJ1Zl90ICpicCwgeGZzX2F0dHJfbGlzdF9jb250ZXh0X3QgKmNvbnRleHQpCit7CisJYXR0cmxpc3RfY3Vyc29yX2tlcm5fdCAqY3Vyc29yOworCXhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmOworCXhmc19hdHRyX2xlYWZfZW50cnlfdCAqZW50cnk7CisJeGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsX3QgKm5hbWVfbG9jOworCXhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGVfdCAqbmFtZV9ybXQ7CisJaW50IHJldHZhbCwgaTsKKworCUFTU0VSVChicCAhPSBOVUxMKTsKKwlsZWFmID0gYnAtPmRhdGE7CisJY3Vyc29yID0gY29udGV4dC0+Y3Vyc29yOworCWN1cnNvci0+aW5pdHRlZCA9IDE7CisKKwl4ZnNfYXR0cl90cmFjZV9sX2NsKCJibGsgc3RhcnQiLCBjb250ZXh0LCBsZWFmKTsKKworCS8qCisJICogUmUtZmluZCBvdXIgcGxhY2UgaW4gdGhlIGxlYWYgYmxvY2sgaWYgdGhpcyBpcyBhIG5ldyBzeXNjYWxsLgorCSAqLworCWlmIChjb250ZXh0LT5yZXN5bmNoKSB7CisJCWVudHJ5ID0gJmxlYWYtPmVudHJpZXNbMF07CisJCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJCQkJCQllbnRyeSsrLCBpKyspIHsKKwkJCWlmIChJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpCisJCQkJCQkJPT0gY3Vyc29yLT5oYXNodmFsKSB7CisJCQkJaWYgKGN1cnNvci0+b2Zmc2V0ID09IGNvbnRleHQtPmR1cGNudCkgeworCQkJCQljb250ZXh0LT5kdXBjbnQgPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY29udGV4dC0+ZHVwY250Kys7CisJCQl9IGVsc2UgaWYgKElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCQk+IGN1cnNvci0+aGFzaHZhbCkgeworCQkJCWNvbnRleHQtPmR1cGNudCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGkgPT0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCXhmc19hdHRyX3RyYWNlX2xfYygibm90IGZvdW5kIiwgY29udGV4dCk7CisJCQlyZXR1cm4oMCk7CisJCX0KKwl9IGVsc2UgeworCQllbnRyeSA9ICZsZWFmLT5lbnRyaWVzWzBdOworCQlpID0gMDsKKwl9CisJY29udGV4dC0+cmVzeW5jaCA9IDA7CisKKwkvKgorCSAqIFdlIGhhdmUgZm91bmQgb3VyIHBsYWNlLCBzdGFydCBjb3B5aW5nIG91dCB0aGUgbmV3IGF0dHJpYnV0ZXMuCisJICovCisJcmV0dmFsID0gMDsKKwlmb3IgKCAgOyAoaSA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKQorCSAgICAgJiYgKHJldHZhbCA9PSAwKTsgZW50cnkrKywgaSsrKSB7CisJCWF0dHJuYW1lc190CSpuYW1lc3A7CisKKwkJaWYgKElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgIT0gY3Vyc29yLT5oYXNodmFsKSB7CisJCQljdXJzb3ItPmhhc2h2YWwgPSBJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpOworCQkJY3Vyc29yLT5vZmZzZXQgPSAwOworCQl9CisKKwkJaWYgKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX0lOQ09NUExFVEUpCisJCQljb250aW51ZTsJCS8qIHNraXAgaW5jb21wbGV0ZSBlbnRyaWVzICovCisJCWlmICgoKGNvbnRleHQtPmZsYWdzICYgQVRUUl9TRUNVUkUpICE9IDApICE9CisJCSAgICAoKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX1NFQ1VSRSkgIT0gMCkgJiYKKwkJICAgICEoY29udGV4dC0+ZmxhZ3MgJiBBVFRSX0tFUk5PUk1BTFMpKQorCQkJY29udGludWU7CQkvKiBza2lwIG5vbi1tYXRjaGluZyBlbnRyaWVzICovCisJCWlmICgoKGNvbnRleHQtPmZsYWdzICYgQVRUUl9ST09UKSAhPSAwKSAhPQorCQkgICAgKChlbnRyeS0+ZmxhZ3MgJiBYRlNfQVRUUl9ST09UKSAhPSAwKSAmJgorCQkgICAgIShjb250ZXh0LT5mbGFncyAmIEFUVFJfS0VSTlJPT1RMUykpCisJCQljb250aW51ZTsJCS8qIHNraXAgbm9uLW1hdGNoaW5nIGVudHJpZXMgKi8KKworCQluYW1lc3AgPSAoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfU0VDVVJFKSA/ICZhdHRyX3NlY3VyZSA6CisJCQkoKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX1JPT1QpID8gJmF0dHJfdHJ1c3RlZCA6CisJCQkgICZhdHRyX3VzZXIpOworCisJCWlmIChlbnRyeS0+ZmxhZ3MgJiBYRlNfQVRUUl9MT0NBTCkgeworCQkJbmFtZV9sb2MgPSBYRlNfQVRUUl9MRUFGX05BTUVfTE9DQUwobGVhZiwgaSk7CisJCQlpZiAoY29udGV4dC0+ZmxhZ3MgJiBBVFRSX0tFUk5PVkFMKSB7CisJCQkJQVNTRVJUKGNvbnRleHQtPmZsYWdzICYgQVRUUl9LRVJOQU1FTFMpOworCQkJCWNvbnRleHQtPmNvdW50ICs9IG5hbWVzcC0+YXR0cl9uYW1lbGVuICsKKwkJCQkJCShpbnQpbmFtZV9sb2MtPm5hbWVsZW4gKyAxOworCQkJfSBlbHNlIHsKKwkJCQlyZXR2YWwgPSB4ZnNfYXR0cl9wdXRfbGlzdGVudChjb250ZXh0LCBuYW1lc3AsCisJCQkJCShjaGFyICopbmFtZV9sb2MtPm5hbWV2YWwsCisJCQkJCShpbnQpbmFtZV9sb2MtPm5hbWVsZW4sCisJCQkJCShpbnQpSU5UX0dFVChuYW1lX2xvYy0+dmFsdWVsZW4sCisJCQkJCQkJCUFSQ0hfQ09OVkVSVCkpOworCQkJfQorCQl9IGVsc2UgeworCQkJbmFtZV9ybXQgPSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWYsIGkpOworCQkJaWYgKGNvbnRleHQtPmZsYWdzICYgQVRUUl9LRVJOT1ZBTCkgeworCQkJCUFTU0VSVChjb250ZXh0LT5mbGFncyAmIEFUVFJfS0VSTkFNRUxTKTsKKwkJCQljb250ZXh0LT5jb3VudCArPSBuYW1lc3AtPmF0dHJfbmFtZWxlbiArCisJCQkJCQkoaW50KW5hbWVfcm10LT5uYW1lbGVuICsgMTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dmFsID0geGZzX2F0dHJfcHV0X2xpc3RlbnQoY29udGV4dCwgbmFtZXNwLAorCQkJCQkoY2hhciAqKW5hbWVfcm10LT5uYW1lLAorCQkJCQkoaW50KW5hbWVfcm10LT5uYW1lbGVuLAorCQkJCQkoaW50KUlOVF9HRVQobmFtZV9ybXQtPnZhbHVlbGVuLAorCQkJCQkJCQlBUkNIX0NPTlZFUlQpKTsKKwkJCX0KKwkJfQorCQlpZiAocmV0dmFsID09IDApIHsKKwkJCWN1cnNvci0+b2Zmc2V0Kys7CisJCX0KKwl9CisJeGZzX2F0dHJfdHJhY2VfbF9jbCgiYmxrIGVuZCIsIGNvbnRleHQsIGxlYWYpOworCXJldHVybihyZXR2YWwpOworfQorCisjZGVmaW5lCUFUVFJfRU5UQkFTRVNJWkUJCS8qIG1pbmltdW0gYnl0ZXMgdXNlZCBieSBhbiBhdHRyICovIFwKKwkoKChzdHJ1Y3QgYXR0cmxpc3RfZW50ICopIDApLT5hX25hbWUgLSAoY2hhciAqKSAwKQorI2RlZmluZQlBVFRSX0VOVFNJWkUobmFtZWxlbikJCS8qIGFjdHVhbCBieXRlcyB1c2VkIGJ5IGFuIGF0dHIgKi8gXAorCSgoQVRUUl9FTlRCQVNFU0laRSArIChuYW1lbGVuKSArIDEgKyBzaXplb2YodV9pbnQzMl90KS0xKSBcCisJICYgfihzaXplb2YodV9pbnQzMl90KS0xKSkKKworLyoKKyAqIEZvcm1hdCBhbiBhdHRyaWJ1dGUgYW5kIGNvcHkgaXQgb3V0IHRvIHRoZSB1c2VyJ3MgYnVmZmVyLgorICogVGFrZSBjYXJlIHRvIGNoZWNrIHZhbHVlcyBhbmQgcHJvdGVjdCBhZ2FpbnN0IHRoZW0gY2hhbmdpbmcgbGF0ZXIsCisgKiB3ZSBtYXkgYmUgcmVhZGluZyB0aGVtIGRpcmVjdGx5IG91dCBvZiBhIHVzZXIgYnVmZmVyLgorICovCisvKkFSR1NVU0VEKi8KK2ludAoreGZzX2F0dHJfcHV0X2xpc3RlbnQoeGZzX2F0dHJfbGlzdF9jb250ZXh0X3QgKmNvbnRleHQsCisJCSAgICAgYXR0cm5hbWVzX3QgKm5hbWVzcCwgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGludCB2YWx1ZWxlbikKK3sKKwlhdHRybGlzdF9lbnRfdCAqYWVwOworCWludCBhcnJheXRvcDsKKworCUFTU0VSVCghKGNvbnRleHQtPmZsYWdzICYgQVRUUl9LRVJOT1ZBTCkpOworCWlmIChjb250ZXh0LT5mbGFncyAmIEFUVFJfS0VSTkFNRUxTKSB7CisJCWNoYXIgKm9mZnNldDsKKworCQlBU1NFUlQoY29udGV4dC0+Y291bnQgPj0gMCk7CisKKwkJYXJyYXl0b3AgPSBjb250ZXh0LT5jb3VudCArIG5hbWVzcC0+YXR0cl9uYW1lbGVuICsgbmFtZWxlbiArIDE7CisJCWlmIChhcnJheXRvcCA+IGNvbnRleHQtPmZpcnN0dSkgeworCQkJY29udGV4dC0+Y291bnQgPSAtMTsJLyogaW5zdWZmaWNpZW50IHNwYWNlICovCisJCQlyZXR1cm4oMSk7CisJCX0KKwkJb2Zmc2V0ID0gKGNoYXIgKiljb250ZXh0LT5hbGlzdCArIGNvbnRleHQtPmNvdW50OworCQlzdHJuY3B5KG9mZnNldCwgbmFtZXNwLT5hdHRyX25hbWUsIG5hbWVzcC0+YXR0cl9uYW1lbGVuKTsKKwkJb2Zmc2V0ICs9IG5hbWVzcC0+YXR0cl9uYW1lbGVuOworCQlzdHJuY3B5KG9mZnNldCwgbmFtZSwgbmFtZWxlbik7CQkJLyogcmVhbCBuYW1lICovCisJCW9mZnNldCArPSBuYW1lbGVuOworCQkqb2Zmc2V0ID0gJ1wwJzsKKwkJY29udGV4dC0+Y291bnQgKz0gbmFtZXNwLT5hdHRyX25hbWVsZW4gKyBuYW1lbGVuICsgMTsKKwkJcmV0dXJuKDApOworCX0KKworCUFTU0VSVChjb250ZXh0LT5jb3VudCA+PSAwKTsKKwlBU1NFUlQoY29udGV4dC0+Y291bnQgPCAoQVRUUl9NQVhfVkFMVUVMRU4vOCkpOworCUFTU0VSVChjb250ZXh0LT5maXJzdHUgPj0gc2l6ZW9mKCpjb250ZXh0LT5hbGlzdCkpOworCUFTU0VSVChjb250ZXh0LT5maXJzdHUgPD0gY29udGV4dC0+YnVmc2l6ZSk7CisKKwlhcnJheXRvcCA9IHNpemVvZigqY29udGV4dC0+YWxpc3QpICsKKwkJCWNvbnRleHQtPmNvdW50ICogc2l6ZW9mKGNvbnRleHQtPmFsaXN0LT5hbF9vZmZzZXRbMF0pOworCWNvbnRleHQtPmZpcnN0dSAtPSBBVFRSX0VOVFNJWkUobmFtZWxlbik7CisJaWYgKGNvbnRleHQtPmZpcnN0dSA8IGFycmF5dG9wKSB7CisJCXhmc19hdHRyX3RyYWNlX2xfYygiYnVmZmVyIGZ1bGwiLCBjb250ZXh0KTsKKwkJY29udGV4dC0+YWxpc3QtPmFsX21vcmUgPSAxOworCQlyZXR1cm4oMSk7CisJfQorCisJYWVwID0gKGF0dHJsaXN0X2VudF90ICopJigoKGNoYXIgKiljb250ZXh0LT5hbGlzdClbIGNvbnRleHQtPmZpcnN0dSBdKTsKKwlhZXAtPmFfdmFsdWVsZW4gPSB2YWx1ZWxlbjsKKwltZW1jcHkoYWVwLT5hX25hbWUsIG5hbWUsIG5hbWVsZW4pOworCWFlcC0+YV9uYW1lWyBuYW1lbGVuIF0gPSAwOworCWNvbnRleHQtPmFsaXN0LT5hbF9vZmZzZXRbIGNvbnRleHQtPmNvdW50KysgXSA9IGNvbnRleHQtPmZpcnN0dTsKKwljb250ZXh0LT5hbGlzdC0+YWxfY291bnQgPSBjb250ZXh0LT5jb3VudDsKKwl4ZnNfYXR0cl90cmFjZV9sX2MoImFkZCIsIGNvbnRleHQpOworCXJldHVybigwKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE1hbmFnZSB0aGUgSU5DT01QTEVURSBmbGFnIGluIGEgbGVhZiBlbnRyeQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogQ2xlYXIgdGhlIElOQ09NUExFVEUgZmxhZyBvbiBhbiBlbnRyeSBpbiBhIGxlYWYgYmxvY2suCisgKi8KK2ludAoreGZzX2F0dHJfbGVhZl9jbGVhcmZsYWcoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwl4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZjsKKwl4ZnNfYXR0cl9sZWFmX2VudHJ5X3QgKmVudHJ5OworCXhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGVfdCAqbmFtZV9ybXQ7CisJeGZzX2RhYnVmX3QgKmJwOworCWludCBlcnJvcjsKKyNpZmRlZiBERUJVRworCXhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbF90ICpuYW1lX2xvYzsKKwlpbnQgbmFtZWxlbjsKKwljaGFyICpuYW1lOworI2VuZGlmIC8qIERFQlVHICovCisKKwkvKgorCSAqIFNldCB1cCB0aGUgb3BlcmF0aW9uLgorCSAqLworCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgYXJncy0+Ymxrbm8sIC0xLCAmYnAsCisJCQkJCSAgICAgWEZTX0FUVFJfRk9SSyk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybihlcnJvcik7CisJfQorCUFTU0VSVChicCAhPSBOVUxMKTsKKworCWxlYWYgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKGFyZ3MtPmluZGV4IDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVChhcmdzLT5pbmRleCA+PSAwKTsKKwllbnRyeSA9ICZsZWFmLT5lbnRyaWVzWyBhcmdzLT5pbmRleCBdOworCUFTU0VSVChlbnRyeS0+ZmxhZ3MgJiBYRlNfQVRUUl9JTkNPTVBMRVRFKTsKKworI2lmZGVmIERFQlVHCisJaWYgKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX0xPQ0FMKSB7CisJCW5hbWVfbG9jID0gWEZTX0FUVFJfTEVBRl9OQU1FX0xPQ0FMKGxlYWYsIGFyZ3MtPmluZGV4KTsKKwkJbmFtZWxlbiA9IG5hbWVfbG9jLT5uYW1lbGVuOworCQluYW1lID0gKGNoYXIgKiluYW1lX2xvYy0+bmFtZXZhbDsKKwl9IGVsc2UgeworCQluYW1lX3JtdCA9IFhGU19BVFRSX0xFQUZfTkFNRV9SRU1PVEUobGVhZiwgYXJncy0+aW5kZXgpOworCQluYW1lbGVuID0gbmFtZV9ybXQtPm5hbWVsZW47CisJCW5hbWUgPSAoY2hhciAqKW5hbWVfcm10LT5uYW1lOworCX0KKwlBU1NFUlQoSU5UX0dFVChlbnRyeS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA9PSBhcmdzLT5oYXNodmFsKTsKKwlBU1NFUlQobmFtZWxlbiA9PSBhcmdzLT5uYW1lbGVuKTsKKwlBU1NFUlQobWVtY21wKG5hbWUsIGFyZ3MtPm5hbWUsIG5hbWVsZW4pID09IDApOworI2VuZGlmIC8qIERFQlVHICovCisKKwllbnRyeS0+ZmxhZ3MgJj0gflhGU19BVFRSX0lOQ09NUExFVEU7CisJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwLAorCQkJIFhGU19EQV9MT0dSQU5HRShsZWFmLCBlbnRyeSwgc2l6ZW9mKCplbnRyeSkpKTsKKworCWlmIChhcmdzLT5ybXRibGtubykgeworCQlBU1NFUlQoKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX0xPQ0FMKSA9PSAwKTsKKwkJbmFtZV9ybXQgPSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWYsIGFyZ3MtPmluZGV4KTsKKwkJSU5UX1NFVChuYW1lX3JtdC0+dmFsdWVibGssIEFSQ0hfQ09OVkVSVCwgYXJncy0+cm10Ymxrbm8pOworCQlJTlRfU0VUKG5hbWVfcm10LT52YWx1ZWxlbiwgQVJDSF9DT05WRVJULCBhcmdzLT52YWx1ZWxlbik7CisJCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicCwKKwkJCSBYRlNfREFfTE9HUkFOR0UobGVhZiwgbmFtZV9ybXQsIHNpemVvZigqbmFtZV9ybXQpKSk7CisJfQorCXhmc19kYV9idWZfZG9uZShicCk7CisKKwkvKgorCSAqIENvbW1pdCB0aGUgZmxhZyB2YWx1ZSBjaGFuZ2UgYW5kIHN0YXJ0IHRoZSBuZXh0IHRyYW5zIGluIHNlcmllcy4KKwkgKi8KKwllcnJvciA9IHhmc19hdHRyX3JvbGx0cmFucygmYXJncy0+dHJhbnMsIGFyZ3MtPmRwKTsKKworCXJldHVybihlcnJvcik7Cit9CisKKy8qCisgKiBTZXQgdGhlIElOQ09NUExFVEUgZmxhZyBvbiBhbiBlbnRyeSBpbiBhIGxlYWYgYmxvY2suCisgKi8KK2ludAoreGZzX2F0dHJfbGVhZl9zZXRmbGFnKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWY7CisJeGZzX2F0dHJfbGVhZl9lbnRyeV90ICplbnRyeTsKKwl4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlX3QgKm5hbWVfcm10OworCXhmc19kYWJ1Zl90ICpicDsKKwlpbnQgZXJyb3I7CisKKwkvKgorCSAqIFNldCB1cCB0aGUgb3BlcmF0aW9uLgorCSAqLworCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgYXJncy0+Ymxrbm8sIC0xLCAmYnAsCisJCQkJCSAgICAgWEZTX0FUVFJfRk9SSyk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybihlcnJvcik7CisJfQorCUFTU0VSVChicCAhPSBOVUxMKTsKKworCWxlYWYgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKGFyZ3MtPmluZGV4IDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVChhcmdzLT5pbmRleCA+PSAwKTsKKwllbnRyeSA9ICZsZWFmLT5lbnRyaWVzWyBhcmdzLT5pbmRleCBdOworCisJQVNTRVJUKChlbnRyeS0+ZmxhZ3MgJiBYRlNfQVRUUl9JTkNPTVBMRVRFKSA9PSAwKTsKKwllbnRyeS0+ZmxhZ3MgfD0gWEZTX0FUVFJfSU5DT01QTEVURTsKKwl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAsCisJCQlYRlNfREFfTE9HUkFOR0UobGVhZiwgZW50cnksIHNpemVvZigqZW50cnkpKSk7CisJaWYgKChlbnRyeS0+ZmxhZ3MgJiBYRlNfQVRUUl9MT0NBTCkgPT0gMCkgeworCQluYW1lX3JtdCA9IFhGU19BVFRSX0xFQUZfTkFNRV9SRU1PVEUobGVhZiwgYXJncy0+aW5kZXgpOworCQluYW1lX3JtdC0+dmFsdWVibGsgPSAwOworCQluYW1lX3JtdC0+dmFsdWVsZW4gPSAwOworCQl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAsCisJCQkgWEZTX0RBX0xPR1JBTkdFKGxlYWYsIG5hbWVfcm10LCBzaXplb2YoKm5hbWVfcm10KSkpOworCX0KKwl4ZnNfZGFfYnVmX2RvbmUoYnApOworCisJLyoKKwkgKiBDb21taXQgdGhlIGZsYWcgdmFsdWUgY2hhbmdlIGFuZCBzdGFydCB0aGUgbmV4dCB0cmFucyBpbiBzZXJpZXMuCisJICovCisJZXJyb3IgPSB4ZnNfYXR0cl9yb2xsdHJhbnMoJmFyZ3MtPnRyYW5zLCBhcmdzLT5kcCk7CisKKwlyZXR1cm4oZXJyb3IpOworfQorCisvKgorICogSW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24sIGNsZWFyIHRoZSBJTkNPTVBMRVRFIGZsYWcgb24gdGhlIGxlYWYgZW50cnkKKyAqIGdpdmVuIGJ5IGFyZ3MtPmJsa25vL2luZGV4IGFuZCBzZXQgdGhlIElOQ09NUExFVEUgZmxhZyBvbiB0aGUgbGVhZgorICogZW50cnkgZ2l2ZW4gYnkgYXJncy0+Ymxrbm8yL2luZGV4Mi4KKyAqCisgKiBOb3RlIHRoYXQgdGhleSBjb3VsZCBiZSBpbiBkaWZmZXJlbnQgYmxvY2tzLCBvciBpbiB0aGUgc2FtZSBibG9jay4KKyAqLworaW50Cit4ZnNfYXR0cl9sZWFmX2ZsaXBmbGFncyh4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmMSwgKmxlYWYyOworCXhmc19hdHRyX2xlYWZfZW50cnlfdCAqZW50cnkxLCAqZW50cnkyOworCXhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGVfdCAqbmFtZV9ybXQ7CisJeGZzX2RhYnVmX3QgKmJwMSwgKmJwMjsKKwlpbnQgZXJyb3I7CisjaWZkZWYgREVCVUcKKwl4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWxfdCAqbmFtZV9sb2M7CisJaW50IG5hbWVsZW4xLCBuYW1lbGVuMjsKKwljaGFyICpuYW1lMSwgKm5hbWUyOworI2VuZGlmIC8qIERFQlVHICovCisKKwkvKgorCSAqIFJlYWQgdGhlIGJsb2NrIGNvbnRhaW5pbmcgdGhlICJvbGQiIGF0dHIKKwkgKi8KKwllcnJvciA9IHhmc19kYV9yZWFkX2J1ZihhcmdzLT50cmFucywgYXJncy0+ZHAsIGFyZ3MtPmJsa25vLCAtMSwgJmJwMSwKKwkJCQkJICAgICBYRlNfQVRUUl9GT1JLKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuKGVycm9yKTsKKwl9CisJQVNTRVJUKGJwMSAhPSBOVUxMKTsKKworCS8qCisJICogUmVhZCB0aGUgYmxvY2sgY29udGFpbmluZyB0aGUgIm5ldyIgYXR0ciwgaWYgaXQgaXMgZGlmZmVyZW50CisJICovCisJaWYgKGFyZ3MtPmJsa25vMiAhPSBhcmdzLT5ibGtubykgeworCQllcnJvciA9IHhmc19kYV9yZWFkX2J1ZihhcmdzLT50cmFucywgYXJncy0+ZHAsIGFyZ3MtPmJsa25vMiwKKwkJCQkJLTEsICZicDIsIFhGU19BVFRSX0ZPUkspOworCQlpZiAoZXJyb3IpIHsKKwkJCXJldHVybihlcnJvcik7CisJCX0KKwkJQVNTRVJUKGJwMiAhPSBOVUxMKTsKKwl9IGVsc2UgeworCQlicDIgPSBicDE7CisJfQorCisJbGVhZjEgPSBicDEtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZjEtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQoYXJncy0+aW5kZXggPCBJTlRfR0VUKGxlYWYxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVChhcmdzLT5pbmRleCA+PSAwKTsKKwllbnRyeTEgPSAmbGVhZjEtPmVudHJpZXNbIGFyZ3MtPmluZGV4IF07CisKKwlsZWFmMiA9IGJwMi0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmMi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCT09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCUFTU0VSVChhcmdzLT5pbmRleDIgPCBJTlRfR0VUKGxlYWYyLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVChhcmdzLT5pbmRleDIgPj0gMCk7CisJZW50cnkyID0gJmxlYWYyLT5lbnRyaWVzWyBhcmdzLT5pbmRleDIgXTsKKworI2lmZGVmIERFQlVHCisJaWYgKGVudHJ5MS0+ZmxhZ3MgJiBYRlNfQVRUUl9MT0NBTCkgeworCQluYW1lX2xvYyA9IFhGU19BVFRSX0xFQUZfTkFNRV9MT0NBTChsZWFmMSwgYXJncy0+aW5kZXgpOworCQluYW1lbGVuMSA9IG5hbWVfbG9jLT5uYW1lbGVuOworCQluYW1lMSA9IChjaGFyICopbmFtZV9sb2MtPm5hbWV2YWw7CisJfSBlbHNlIHsKKwkJbmFtZV9ybXQgPSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWYxLCBhcmdzLT5pbmRleCk7CisJCW5hbWVsZW4xID0gbmFtZV9ybXQtPm5hbWVsZW47CisJCW5hbWUxID0gKGNoYXIgKiluYW1lX3JtdC0+bmFtZTsKKwl9CisJaWYgKGVudHJ5Mi0+ZmxhZ3MgJiBYRlNfQVRUUl9MT0NBTCkgeworCQluYW1lX2xvYyA9IFhGU19BVFRSX0xFQUZfTkFNRV9MT0NBTChsZWFmMiwgYXJncy0+aW5kZXgyKTsKKwkJbmFtZWxlbjIgPSBuYW1lX2xvYy0+bmFtZWxlbjsKKwkJbmFtZTIgPSAoY2hhciAqKW5hbWVfbG9jLT5uYW1ldmFsOworCX0gZWxzZSB7CisJCW5hbWVfcm10ID0gWEZTX0FUVFJfTEVBRl9OQU1FX1JFTU9URShsZWFmMiwgYXJncy0+aW5kZXgyKTsKKwkJbmFtZWxlbjIgPSBuYW1lX3JtdC0+bmFtZWxlbjsKKwkJbmFtZTIgPSAoY2hhciAqKW5hbWVfcm10LT5uYW1lOworCX0KKwlBU1NFUlQoSU5UX0dFVChlbnRyeTEtPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPT0gSU5UX0dFVChlbnRyeTItPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVChuYW1lbGVuMSA9PSBuYW1lbGVuMik7CisJQVNTRVJUKG1lbWNtcChuYW1lMSwgbmFtZTIsIG5hbWVsZW4xKSA9PSAwKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisJQVNTRVJUKGVudHJ5MS0+ZmxhZ3MgJiBYRlNfQVRUUl9JTkNPTVBMRVRFKTsKKwlBU1NFUlQoKGVudHJ5Mi0+ZmxhZ3MgJiBYRlNfQVRUUl9JTkNPTVBMRVRFKSA9PSAwKTsKKworCWVudHJ5MS0+ZmxhZ3MgJj0gflhGU19BVFRSX0lOQ09NUExFVEU7CisJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwMSwKKwkJCSAgWEZTX0RBX0xPR1JBTkdFKGxlYWYxLCBlbnRyeTEsIHNpemVvZigqZW50cnkxKSkpOworCWlmIChhcmdzLT5ybXRibGtubykgeworCQlBU1NFUlQoKGVudHJ5MS0+ZmxhZ3MgJiBYRlNfQVRUUl9MT0NBTCkgPT0gMCk7CisJCW5hbWVfcm10ID0gWEZTX0FUVFJfTEVBRl9OQU1FX1JFTU9URShsZWFmMSwgYXJncy0+aW5kZXgpOworCQlJTlRfU0VUKG5hbWVfcm10LT52YWx1ZWJsaywgQVJDSF9DT05WRVJULCBhcmdzLT5ybXRibGtubyk7CisJCUlOVF9TRVQobmFtZV9ybXQtPnZhbHVlbGVuLCBBUkNIX0NPTlZFUlQsIGFyZ3MtPnZhbHVlbGVuKTsKKwkJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwMSwKKwkJCSBYRlNfREFfTE9HUkFOR0UobGVhZjEsIG5hbWVfcm10LCBzaXplb2YoKm5hbWVfcm10KSkpOworCX0KKworCWVudHJ5Mi0+ZmxhZ3MgfD0gWEZTX0FUVFJfSU5DT01QTEVURTsKKwl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAyLAorCQkJICBYRlNfREFfTE9HUkFOR0UobGVhZjIsIGVudHJ5Miwgc2l6ZW9mKCplbnRyeTIpKSk7CisJaWYgKChlbnRyeTItPmZsYWdzICYgWEZTX0FUVFJfTE9DQUwpID09IDApIHsKKwkJbmFtZV9ybXQgPSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWYyLCBhcmdzLT5pbmRleDIpOworCQluYW1lX3JtdC0+dmFsdWVibGsgPSAwOworCQluYW1lX3JtdC0+dmFsdWVsZW4gPSAwOworCQl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAyLAorCQkJIFhGU19EQV9MT0dSQU5HRShsZWFmMiwgbmFtZV9ybXQsIHNpemVvZigqbmFtZV9ybXQpKSk7CisJfQorCXhmc19kYV9idWZfZG9uZShicDEpOworCWlmIChicDEgIT0gYnAyKQorCQl4ZnNfZGFfYnVmX2RvbmUoYnAyKTsKKworCS8qCisJICogQ29tbWl0IHRoZSBmbGFnIHZhbHVlIGNoYW5nZSBhbmQgc3RhcnQgdGhlIG5leHQgdHJhbnMgaW4gc2VyaWVzLgorCSAqLworCWVycm9yID0geGZzX2F0dHJfcm9sbHRyYW5zKCZhcmdzLT50cmFucywgYXJncy0+ZHApOworCisJcmV0dXJuKGVycm9yKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluZGlzY3JpbWluYXRlbHkgZGVsZXRlIHRoZSBlbnRpcmUgYXR0cmlidXRlIGZvcmsKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIFJlY3Vyc2UgKGdhc3AhKSB0aHJvdWdoIHRoZSBhdHRyaWJ1dGUgbm9kZXMgdW50aWwgd2UgZmluZCBsZWF2ZXMuCisgKiBXZSdyZSBkb2luZyBhIGRlcHRoLWZpcnN0IHRyYXZlcnNhbCBpbiBvcmRlciB0byBpbnZhbGlkYXRlIGV2ZXJ5dGhpbmcuCisgKi8KK2ludAoreGZzX2F0dHJfcm9vdF9pbmFjdGl2ZSh4ZnNfdHJhbnNfdCAqKnRyYW5zLCB4ZnNfaW5vZGVfdCAqZHApCit7CisJeGZzX2RhX2Jsa2luZm9fdCAqaW5mbzsKKwl4ZnNfZGFkZHJfdCBibGtubzsKKwl4ZnNfZGFidWZfdCAqYnA7CisJaW50IGVycm9yOworCisJLyoKKwkgKiBSZWFkIGJsb2NrIDAgdG8gc2VlIHdoYXQgd2UgaGF2ZSB0byB3b3JrIHdpdGguCisJICogV2Ugb25seSBnZXQgaGVyZSBpZiB3ZSBoYXZlIGV4dGVudHMsIHNpbmNlIHdlIHJlbW92ZQorCSAqIHRoZSBleHRlbnRzIGluIHJldmVyc2Ugb3JkZXIgdGhlIGV4dGVudCBjb250YWluaW5nCisJICogYmxvY2sgMCBtdXN0IHN0aWxsIGJlIHRoZXJlLgorCSAqLworCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKCp0cmFucywgZHAsIDAsIC0xLCAmYnAsIFhGU19BVFRSX0ZPUkspOworCWlmIChlcnJvcikKKwkJcmV0dXJuKGVycm9yKTsKKwlibGtubyA9IHhmc19kYV9ibGtubyhicCk7CisKKwkvKgorCSAqIEludmFsaWRhdGUgdGhlIHRyZWUsIGV2ZW4gaWYgdGhlICJ0cmVlIiBpcyBvbmx5IGEgc2luZ2xlIGxlYWYgYmxvY2suCisJICogVGhpcyBpcyBhIGRlcHRoLWZpcnN0IHRyYXZlcnNhbCEKKwkgKi8KKwlpbmZvID0gYnAtPmRhdGE7CisJaWYgKElOVF9HRVQoaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RBX05PREVfTUFHSUMpIHsKKwkJZXJyb3IgPSB4ZnNfYXR0cl9ub2RlX2luYWN0aXZlKHRyYW5zLCBkcCwgYnAsIDEpOworCX0gZWxzZSBpZiAoSU5UX0dFVChpbmZvLT5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKSB7CisJCWVycm9yID0geGZzX2F0dHJfbGVhZl9pbmFjdGl2ZSh0cmFucywgZHAsIGJwKTsKKwl9IGVsc2UgeworCQllcnJvciA9IFhGU19FUlJPUihFSU8pOworCQl4ZnNfZGFfYnJlbHNlKCp0cmFucywgYnApOworCX0KKwlpZiAoZXJyb3IpCisJCXJldHVybihlcnJvcik7CisKKwkvKgorCSAqIEludmFsaWRhdGUgdGhlIGluY29yZSBjb3B5IG9mIHRoZSByb290IGJsb2NrLgorCSAqLworCWVycm9yID0geGZzX2RhX2dldF9idWYoKnRyYW5zLCBkcCwgMCwgYmxrbm8sICZicCwgWEZTX0FUVFJfRk9SSyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4oZXJyb3IpOworCXhmc19kYV9iaW52YWwoKnRyYW5zLCBicCk7CS8qIHJlbW92ZSBmcm9tIGNhY2hlICovCisJLyoKKwkgKiBDb21taXQgdGhlIGludmFsaWRhdGUgYW5kIHN0YXJ0IHRoZSBuZXh0IHRyYW5zYWN0aW9uLgorCSAqLworCWVycm9yID0geGZzX2F0dHJfcm9sbHRyYW5zKHRyYW5zLCBkcCk7CisKKwlyZXR1cm4gKGVycm9yKTsKK30KKworLyoKKyAqIFJlY3Vyc2UgKGdhc3AhKSB0aHJvdWdoIHRoZSBhdHRyaWJ1dGUgbm9kZXMgdW50aWwgd2UgZmluZCBsZWF2ZXMuCisgKiBXZSdyZSBkb2luZyBhIGRlcHRoLWZpcnN0IHRyYXZlcnNhbCBpbiBvcmRlciB0byBpbnZhbGlkYXRlIGV2ZXJ5dGhpbmcuCisgKi8KK2ludAoreGZzX2F0dHJfbm9kZV9pbmFjdGl2ZSh4ZnNfdHJhbnNfdCAqKnRyYW5zLCB4ZnNfaW5vZGVfdCAqZHAsIHhmc19kYWJ1Zl90ICpicCwKKwkJCQkgICBpbnQgbGV2ZWwpCit7CisJeGZzX2RhX2Jsa2luZm9fdCAqaW5mbzsKKwl4ZnNfZGFfaW50bm9kZV90ICpub2RlOworCXhmc19kYWJsa190IGNoaWxkX2ZzYjsKKwl4ZnNfZGFkZHJfdCBwYXJlbnRfYmxrbm8sIGNoaWxkX2Jsa25vOworCWludCBlcnJvciwgY291bnQsIGk7CisJeGZzX2RhYnVmX3QgKmNoaWxkX2JwOworCisJLyoKKwkgKiBTaW5jZSB0aGlzIGNvZGUgaXMgcmVjdXJzaXZlIChnYXNwISkgd2UgbXVzdCBwcm90ZWN0IG91cnNlbHZlcy4KKwkgKi8KKwlpZiAobGV2ZWwgPiBYRlNfREFfTk9ERV9NQVhERVBUSCkgeworCQl4ZnNfZGFfYnJlbHNlKCp0cmFucywgYnApOwkvKiBubyBsb2NrcyBmb3IgbGF0ZXIgdHJhbnMgKi8KKwkJcmV0dXJuKFhGU19FUlJPUihFSU8pKTsKKwl9CisKKwlub2RlID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobm9kZS0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCT09IFhGU19EQV9OT0RFX01BR0lDKTsKKwlwYXJlbnRfYmxrbm8gPSB4ZnNfZGFfYmxrbm8oYnApOwkvKiBzYXZlIGZvciByZS1yZWFkIGxhdGVyICovCisJY291bnQgPSBJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwlpZiAoIWNvdW50KSB7CisJCXhmc19kYV9icmVsc2UoKnRyYW5zLCBicCk7CisJCXJldHVybigwKTsKKwl9CisJY2hpbGRfZnNiID0gSU5UX0dFVChub2RlLT5idHJlZVswXS5iZWZvcmUsIEFSQ0hfQ09OVkVSVCk7CisJeGZzX2RhX2JyZWxzZSgqdHJhbnMsIGJwKTsJLyogbm8gbG9ja3MgZm9yIGxhdGVyIHRyYW5zICovCisKKwkvKgorCSAqIElmIHRoaXMgaXMgdGhlIG5vZGUgbGV2ZWwganVzdCBhYm92ZSB0aGUgbGVhdmVzLCBzaW1wbHkgbG9vcAorCSAqIG92ZXIgdGhlIGxlYXZlcyByZW1vdmluZyBhbGwgb2YgdGhlbS4gIElmIHRoaXMgaXMgaGlnaGVyIHVwCisJICogaW4gdGhlIHRyZWUsIHJlY3Vyc2UgZG93bndhcmQuCisJICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJLyoKKwkJICogUmVhZCB0aGUgc3Vic2lkaWFyeSBibG9jayB0byBzZWUgd2hhdCB3ZSBoYXZlIHRvIHdvcmsgd2l0aC4KKwkJICogRG9uJ3QgZG8gdGhpcyBpbiBhIHRyYW5zYWN0aW9uLiAgVGhpcyBpcyBhIGRlcHRoLWZpcnN0CisJCSAqIHRyYXZlcnNhbCBvZiB0aGUgdHJlZSBzbyB3ZSBtYXkgZGVhbCB3aXRoIG1hbnkgYmxvY2tzCisJCSAqIGJlZm9yZSB3ZSBjb21lIGJhY2sgdG8gdGhpcyBvbmUuCisJCSAqLworCQllcnJvciA9IHhmc19kYV9yZWFkX2J1ZigqdHJhbnMsIGRwLCBjaGlsZF9mc2IsIC0yLCAmY2hpbGRfYnAsCisJCQkJCQlYRlNfQVRUUl9GT1JLKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuKGVycm9yKTsKKwkJaWYgKGNoaWxkX2JwKSB7CisJCQkJCQkvKiBzYXZlIGZvciByZS1yZWFkIGxhdGVyICovCisJCQljaGlsZF9ibGtubyA9IHhmc19kYV9ibGtubyhjaGlsZF9icCk7CisKKwkJCS8qCisJCQkgKiBJbnZhbGlkYXRlIHRoZSBzdWJ0cmVlLCBob3dldmVyIHdlIGhhdmUgdG8uCisJCQkgKi8KKwkJCWluZm8gPSBjaGlsZF9icC0+ZGF0YTsKKwkJCWlmIChJTlRfR0VUKGluZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQkJPT0gWEZTX0RBX05PREVfTUFHSUMpIHsKKwkJCQllcnJvciA9IHhmc19hdHRyX25vZGVfaW5hY3RpdmUodHJhbnMsIGRwLAorCQkJCQkJY2hpbGRfYnAsIGxldmVsKzEpOworCQkJfSBlbHNlIGlmIChJTlRfR0VUKGluZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfQVRUUl9MRUFGX01BR0lDKSB7CisJCQkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX2luYWN0aXZlKHRyYW5zLCBkcCwKKwkJCQkJCWNoaWxkX2JwKTsKKwkJCX0gZWxzZSB7CisJCQkJZXJyb3IgPSBYRlNfRVJST1IoRUlPKTsKKwkJCQl4ZnNfZGFfYnJlbHNlKCp0cmFucywgY2hpbGRfYnApOworCQkJfQorCQkJaWYgKGVycm9yKQorCQkJCXJldHVybihlcnJvcik7CisKKwkJCS8qCisJCQkgKiBSZW1vdmUgdGhlIHN1YnNpZGlhcnkgYmxvY2sgZnJvbSB0aGUgY2FjaGUKKwkJCSAqIGFuZCBmcm9tIHRoZSBsb2cuCisJCQkgKi8KKwkJCWVycm9yID0geGZzX2RhX2dldF9idWYoKnRyYW5zLCBkcCwgMCwgY2hpbGRfYmxrbm8sCisJCQkJJmNoaWxkX2JwLCBYRlNfQVRUUl9GT1JLKTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4oZXJyb3IpOworCQkJeGZzX2RhX2JpbnZhbCgqdHJhbnMsIGNoaWxkX2JwKTsKKwkJfQorCisJCS8qCisJCSAqIElmIHdlJ3JlIG5vdCBkb25lLCByZS1yZWFkIHRoZSBwYXJlbnQgdG8gZ2V0IHRoZSBuZXh0CisJCSAqIGNoaWxkIGJsb2NrIG51bWJlci4KKwkJICovCisJCWlmICgoaSsxKSA8IGNvdW50KSB7CisJCQllcnJvciA9IHhmc19kYV9yZWFkX2J1ZigqdHJhbnMsIGRwLCAwLCBwYXJlbnRfYmxrbm8sCisJCQkJJmJwLCBYRlNfQVRUUl9GT1JLKTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4oZXJyb3IpOworCQkJY2hpbGRfZnNiID0gSU5UX0dFVChub2RlLT5idHJlZVtpKzFdLmJlZm9yZSwgQVJDSF9DT05WRVJUKTsKKwkJCXhmc19kYV9icmVsc2UoKnRyYW5zLCBicCk7CisJCX0KKwkJLyoKKwkJICogQXRvbWljYWxseSBjb21taXQgdGhlIHdob2xlIGludmFsaWRhdGUgc3R1ZmYuCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX2F0dHJfcm9sbHRyYW5zKHRyYW5zLCBkcCkpKQorCQkJcmV0dXJuIChlcnJvcik7CisJfQorCisJcmV0dXJuKDApOworfQorCisvKgorICogSW52YWxpZGF0ZSBhbGwgb2YgdGhlICJyZW1vdGUiIHZhbHVlIHJlZ2lvbnMgcG9pbnRlZCB0byBieSBhIHBhcnRpY3VsYXIKKyAqIGxlYWYgYmxvY2suCisgKiBOb3RlIHRoYXQgd2UgbXVzdCByZWxlYXNlIHRoZSBsb2NrIG9uIHRoZSBidWZmZXIgc28gdGhhdCB3ZSBhcmUgbm90CisgKiBjYXVnaHQgaG9sZGluZyBzb21ldGhpbmcgdGhhdCB0aGUgbG9nZ2luZyBjb2RlIHdhbnRzIHRvIGZsdXNoIHRvIGRpc2suCisgKi8KK2ludAoreGZzX2F0dHJfbGVhZl9pbmFjdGl2ZSh4ZnNfdHJhbnNfdCAqKnRyYW5zLCB4ZnNfaW5vZGVfdCAqZHAsIHhmc19kYWJ1Zl90ICpicCkKK3sKKwl4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZjsKKwl4ZnNfYXR0cl9sZWFmX2VudHJ5X3QgKmVudHJ5OworCXhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGVfdCAqbmFtZV9ybXQ7CisJeGZzX2F0dHJfaW5hY3RpdmVfbGlzdF90ICpsaXN0LCAqbHA7CisJaW50IGVycm9yLCBjb3VudCwgc2l6ZSwgdG1wLCBpOworCisJbGVhZiA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKworCS8qCisJICogQ291bnQgdGhlIG51bWJlciBvZiAicmVtb3RlIiB2YWx1ZSBleHRlbnRzLgorCSAqLworCWNvdW50ID0gMDsKKwllbnRyeSA9ICZsZWFmLT5lbnRyaWVzWzBdOworCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsgZW50cnkrKywgaSsrKSB7CisJCWlmICggICBJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpCisJCSAgICAmJiAoKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX0xPQ0FMKSA9PSAwKSkgeworCQkJbmFtZV9ybXQgPSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWYsIGkpOworCQkJaWYgKG5hbWVfcm10LT52YWx1ZWJsaykKKwkJCQljb3VudCsrOworCQl9CisJfQorCisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgbm8gInJlbW90ZSIgdmFsdWVzLCB3ZSdyZSBkb25lLgorCSAqLworCWlmIChjb3VudCA9PSAwKSB7CisJCXhmc19kYV9icmVsc2UoKnRyYW5zLCBicCk7CisJCXJldHVybigwKTsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIHN0b3JhZ2UgZm9yIGEgbGlzdCBvZiBhbGwgdGhlICJyZW1vdGUiIHZhbHVlIGV4dGVudHMuCisJICovCisJc2l6ZSA9IGNvdW50ICogc2l6ZW9mKHhmc19hdHRyX2luYWN0aXZlX2xpc3RfdCk7CisJbGlzdCA9ICh4ZnNfYXR0cl9pbmFjdGl2ZV9saXN0X3QgKilrbWVtX2FsbG9jKHNpemUsIEtNX1NMRUVQKTsKKworCS8qCisJICogSWRlbnRpZnkgZWFjaCBvZiB0aGUgInJlbW90ZSIgdmFsdWUgZXh0ZW50cy4KKwkgKi8KKwlscCA9IGxpc3Q7CisJZW50cnkgPSAmbGVhZi0+ZW50cmllc1swXTsKKwlmb3IgKGkgPSAwOyBpIDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7IGVudHJ5KyssIGkrKykgeworCQlpZiAoICAgSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKQorCQkgICAgJiYgKChlbnRyeS0+ZmxhZ3MgJiBYRlNfQVRUUl9MT0NBTCkgPT0gMCkpIHsKKwkJCW5hbWVfcm10ID0gWEZTX0FUVFJfTEVBRl9OQU1FX1JFTU9URShsZWFmLCBpKTsKKwkJCWlmIChuYW1lX3JtdC0+dmFsdWVibGspIHsKKwkJCQkvKiBib3RoIG9uLWRpc2ssIGRvbid0IGVuZGlhbiBmbGlwIHR3aWNlICovCisJCQkJbHAtPnZhbHVlYmxrID0gbmFtZV9ybXQtPnZhbHVlYmxrOworCQkJCUlOVF9TRVQobHAtPnZhbHVlbGVuLCBBUkNIX0NPTlZFUlQsCisJCQkJCQlYRlNfQl9UT19GU0IoZHAtPmlfbW91bnQsCisJCQkJCQkgICAgSU5UX0dFVChuYW1lX3JtdC0+dmFsdWVsZW4sCisJCQkJCQkJICAgICAgQVJDSF9DT05WRVJUKSkpOworCQkJCWxwKys7CisJCQl9CisJCX0KKwl9CisJeGZzX2RhX2JyZWxzZSgqdHJhbnMsIGJwKTsJLyogdW5sb2NrIGZvciB0cmFucy4gaW4gZnJlZXh0ZW50KCkgKi8KKworCS8qCisJICogSW52YWxpZGF0ZSBlYWNoIG9mIHRoZSAicmVtb3RlIiB2YWx1ZSBleHRlbnRzLgorCSAqLworCWVycm9yID0gMDsKKwlmb3IgKGxwID0gbGlzdCwgaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBscCsrKSB7CisJCXRtcCA9IHhmc19hdHRyX2xlYWZfZnJlZXh0ZW50KHRyYW5zLCBkcCwKKwkJCQkJCSAgICAgSU5UX0dFVChscC0+dmFsdWVibGssCisJCQkJCQkJCUFSQ0hfQ09OVkVSVCksCisJCQkJCQkgICAgIElOVF9HRVQobHAtPnZhbHVlbGVuLAorCQkJCQkJCQlBUkNIX0NPTlZFUlQpKTsKKwkJaWYgKGVycm9yID09IDApCisJCQllcnJvciA9IHRtcDsJLyogc2F2ZSBvbmx5IHRoZSAxc3QgZXJybm8gKi8KKwl9CisKKwlrbWVtX2ZyZWUoKHhmc19jYWRkcl90KWxpc3QsIHNpemUpOworCXJldHVybihlcnJvcik7Cit9CisKKy8qCisgKiBMb29rIGF0IGFsbCB0aGUgZXh0ZW50cyBmb3IgdGhpcyBsb2dpY2FsIHJlZ2lvbiwKKyAqIGludmFsaWRhdGUgYW55IGJ1ZmZlcnMgdGhhdCBhcmUgaW5jb3JlL2luIHRyYW5zYWN0aW9ucy4KKyAqLworaW50Cit4ZnNfYXR0cl9sZWFmX2ZyZWV4dGVudCh4ZnNfdHJhbnNfdCAqKnRyYW5zLCB4ZnNfaW5vZGVfdCAqZHAsCisJCQkJICAgIHhmc19kYWJsa190IGJsa25vLCBpbnQgYmxrY250KQoreworCXhmc19ibWJ0X2lyZWNfdCBtYXA7CisJeGZzX2RhYmxrX3QgdGJsa25vOworCWludCB0YmxrY250LCBkYmxrY250LCBubWFwLCBlcnJvcjsKKwl4ZnNfZGFkZHJfdCBkYmxrbm87CisJeGZzX2J1Zl90ICpicDsKKworCS8qCisJICogUm9sbCB0aHJvdWdoIHRoZSAidmFsdWUiLCBpbnZhbGlkYXRpbmcgdGhlIGF0dHJpYnV0ZSB2YWx1ZSdzCisJICogYmxvY2tzLgorCSAqLworCXRibGtubyA9IGJsa25vOworCXRibGtjbnQgPSBibGtjbnQ7CisJd2hpbGUgKHRibGtjbnQgPiAwKSB7CisJCS8qCisJCSAqIFRyeSB0byByZW1lbWJlciB3aGVyZSB3ZSBkZWNpZGVkIHRvIHB1dCB0aGUgdmFsdWUuCisJCSAqLworCQlubWFwID0gMTsKKwkJZXJyb3IgPSB4ZnNfYm1hcGkoKnRyYW5zLCBkcCwgKHhmc19maWxlb2ZmX3QpdGJsa25vLCB0YmxrY250LAorCQkJCQlYRlNfQk1BUElfQVRUUkZPUksgfCBYRlNfQk1BUElfTUVUQURBVEEsCisJCQkJCU5VTEwsIDAsICZtYXAsICZubWFwLCBOVUxMKTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZXR1cm4oZXJyb3IpOworCQl9CisJCUFTU0VSVChubWFwID09IDEpOworCQlBU1NFUlQobWFwLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKTsKKworCQkvKgorCQkgKiBJZiBpdCdzIGEgaG9sZSwgdGhlc2UgYXJlIGFscmVhZHkgdW5tYXBwZWQKKwkJICogc28gdGhlcmUncyBub3RoaW5nIHRvIGludmFsaWRhdGUuCisJCSAqLworCQlpZiAobWFwLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spIHsKKworCQkJZGJsa25vID0gWEZTX0ZTQl9UT19EQUREUihkcC0+aV9tb3VudCwKKwkJCQkJCSAgbWFwLmJyX3N0YXJ0YmxvY2spOworCQkJZGJsa2NudCA9IFhGU19GU0JfVE9fQkIoZHAtPmlfbW91bnQsCisJCQkJCQltYXAuYnJfYmxvY2tjb3VudCk7CisJCQlicCA9IHhmc190cmFuc19nZXRfYnVmKCp0cmFucywKKwkJCQkJZHAtPmlfbW91bnQtPm1fZGRldl90YXJncCwKKwkJCQkJZGJsa25vLCBkYmxrY250LCBYRlNfQlVGX0xPQ0spOworCQkJeGZzX3RyYW5zX2JpbnZhbCgqdHJhbnMsIGJwKTsKKwkJCS8qCisJCQkgKiBSb2xsIHRvIG5leHQgdHJhbnNhY3Rpb24uCisJCQkgKi8KKwkJCWlmICgoZXJyb3IgPSB4ZnNfYXR0cl9yb2xsdHJhbnModHJhbnMsIGRwKSkpCisJCQkJcmV0dXJuIChlcnJvcik7CisJCX0KKworCQl0Ymxrbm8gKz0gbWFwLmJyX2Jsb2NrY291bnQ7CisJCXRibGtjbnQgLT0gbWFwLmJyX2Jsb2NrY291bnQ7CisJfQorCisJcmV0dXJuKDApOworfQorCisKKy8qCisgKiBSb2xsIGZyb20gb25lIHRyYW5zIGluIHRoZSBzZXF1ZW5jZSBvZiBQRVJNQU5FTlQgdHJhbnNhY3Rpb25zIHRvIHRoZSBuZXh0LgorICovCitpbnQKK3hmc19hdHRyX3JvbGx0cmFucyh4ZnNfdHJhbnNfdCAqKnRyYW5zcCwgeGZzX2lub2RlX3QgKmRwKQoreworCXhmc190cmFuc190ICp0cmFuczsKKwl1bnNpZ25lZCBpbnQgbG9ncmVzLCBjb3VudDsKKwlpbnQJZXJyb3I7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IHRoZSBpbm9kZSBpcyBhbHdheXMgbG9nZ2VkLgorCSAqLworCXRyYW5zID0gKnRyYW5zcDsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRyYW5zLCBkcCwgWEZTX0lMT0dfQ09SRSk7CisKKwkvKgorCSAqIENvcHkgdGhlIGNyaXRpY2FsIHBhcmFtZXRlcnMgZnJvbSBvbmUgdHJhbnMgdG8gdGhlIG5leHQuCisJICovCisJbG9ncmVzID0gdHJhbnMtPnRfbG9nX3JlczsKKwljb3VudCA9IHRyYW5zLT50X2xvZ19jb3VudDsKKwkqdHJhbnNwID0geGZzX3RyYW5zX2R1cCh0cmFucyk7CisKKwkvKgorCSAqIENvbW1pdCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKwkgKiBJZiB0aGlzIGNvbW1pdCBmYWlsZWQsIHRoZW4gaXQnZCBqdXN0IHVubG9jayB0aG9zZSBpdGVtcyB0aGF0CisJICogYXJlIG5vdCBtYXJrZWQgaWhvbGQuIFRoYXQgYWxzbyBtZWFucyB0aGF0IGEgZmlsZXN5c3RlbSBzaHV0ZG93bgorCSAqIGlzIGluIHByb2dyZXNzLiBUaGUgY2FsbGVyIHRha2VzIHRoZSByZXNwb25zaWJpbGl0eSB0byBjYW5jZWwKKwkgKiB0aGUgZHVwbGljYXRlIHRyYW5zYWN0aW9uIHRoYXQgZ2V0cyByZXR1cm5lZC4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cmFucywgMCwgTlVMTCkpKQorCQlyZXR1cm4gKGVycm9yKTsKKworCXRyYW5zID0gKnRyYW5zcDsKKworCS8qCisJICogUmVzZXJ2ZSBzcGFjZSBpbiB0aGUgbG9nIGZvciB0aCBuZXh0IHRyYW5zYWN0aW9uLgorCSAqIFRoaXMgYWxzbyBwdXNoZXMgaXRlbXMgaW4gdGhlICJBSUwiLCB0aGUgbGlzdCBvZiBsb2dnZWQgaXRlbXMsCisJICogb3V0IHRvIGRpc2sgaWYgdGhleSBhcmUgdGFraW5nIHVwIHNwYWNlIGF0IHRoZSB0YWlsIG9mIHRoZSBsb2cKKwkgKiB0aGF0IHdlIHdhbnQgdG8gdXNlLiAgVGhpcyByZXF1aXJlcyB0aGF0IGVpdGhlciBub3RoaW5nIGJlIGxvY2tlZAorCSAqIGFjcm9zcyB0aGlzIGNhbGwsIG9yIHRoYXQgYW55dGhpbmcgdGhhdCBpcyBsb2NrZWQgYmUgbG9nZ2VkIGluCisJICogdGhlIHByaW9yIGFuZCB0aGUgbmV4dCB0cmFuc2FjdGlvbnMuCisJICovCisJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cmFucywgMCwgbG9ncmVzLCAwLAorCQkJCSAgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywgY291bnQpOworCS8qCisJICogIEVuc3VyZSB0aGF0IHRoZSBpbm9kZSBpcyBpbiB0aGUgbmV3IHRyYW5zYWN0aW9uIGFuZCBsb2NrZWQuCisJICovCisJaWYgKCFlcnJvcikgeworCQl4ZnNfdHJhbnNfaWpvaW4odHJhbnMsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCXhmc190cmFuc19paG9sZCh0cmFucywgZHApOworCX0KKwlyZXR1cm4gKGVycm9yKTsKKworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hdHRyX2xlYWYuaCBiL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE0ODBlMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmgKQEAgLTAsMCArMSwzMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDItMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0FUVFJfTEVBRl9IX18KKyNkZWZpbmUJX19YRlNfQVRUUl9MRUFGX0hfXworCisvKgorICogQXR0cmlidXRlIHN0b3JhZ2UgbGF5b3V0LCBpbnRlcm5hbCBzdHJ1Y3R1cmUsIGFjY2VzcyBtYWNyb3MsIGV0Yy4KKyAqCisgKiBBdHRyaWJ1dGUgbGlzdHMgYXJlIHN0cnVjdHVyZWQgYXJvdW5kIEJ0cmVlcyB3aGVyZSBhbGwgdGhlIGRhdGEKKyAqIGVsZW1lbnRzIGFyZSBpbiB0aGUgbGVhZiBub2Rlcy4gIEF0dHJpYnV0ZSBuYW1lcyBhcmUgaGFzaGVkIGludG8gYW4gaW50LAorICogdGhlbiB0aGF0IGludCBpcyB1c2VkIGFzIHRoZSBpbmRleCBpbnRvIHRoZSBCdHJlZS4gIFNpbmNlIHRoZSBoYXNodmFsCisgKiBvZiBhbiBhdHRyaWJ1dGUgbmFtZSBtYXkgbm90IGJlIHVuaXF1ZSwgd2UgbWF5IGhhdmUgZHVwbGljYXRlIGtleXMuICBUaGUKKyAqIGludGVybmFsIGxpbmtzIGluIHRoZSBCdHJlZSBhcmUgbG9naWNhbCBibG9jayBvZmZzZXRzIGludG8gdGhlIGZpbGUuCisgKi8KKworc3RydWN0IGF0dHJsaXN0Oworc3RydWN0IGF0dHJsaXN0X2N1cnNvcl9rZXJuOworc3RydWN0IGF0dHJuYW1lczsKK3N0cnVjdCB4ZnNfZGFidWY7CitzdHJ1Y3QgeGZzX2RhX2FyZ3M7CitzdHJ1Y3QgeGZzX2RhX3N0YXRlOworc3RydWN0IHhmc19kYV9zdGF0ZV9ibGs7CitzdHJ1Y3QgeGZzX2lub2RlOworc3RydWN0IHhmc190cmFuczsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEF0dHJpYnV0ZSBzdHJ1Y3R1cmUgd2hlbiBlcXVhbCB0byBYRlNfTEJTSVpFKG1wKSBieXRlcy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbGVhZiBub2RlcyBpbiB0aGUgQnRyZWUuCisgKgorICogU3RydWN0IGxlYWZfZW50cnkncyBhcmUgcGFja2VkIGZyb20gdGhlIHRvcC4gIE5hbWUvdmFsdWVzIGdyb3cgZnJvbSB0aGUKKyAqIGJvdHRvbSBidXQgYXJlIG5vdCBwYWNrZWQuICBUaGUgZnJlZW1hcCBjb250YWlucyBydW4tbGVuZ3RoLWVuY29kZWQgZW50cmllcworICogZm9yIHRoZSBmcmVlIGJ5dGVzIGFmdGVyIHRoZSBsZWFmX2VudHJ5J3MsIGJ1dCBvbmx5IHRoZSBOIGxhcmdlc3Qgc3VjaCwKKyAqIHNtYWxsZXIgcnVucyBhcmUgZHJvcHBlZC4gIFdoZW4gdGhlIGZyZWVtYXAgZG9lc24ndCBzaG93IGVub3VnaCBzcGFjZQorICogZm9yIGFuIGFsbG9jYXRpb24sIHdlIGNvbXBhY3QgdGhlIG5hbWUvdmFsdWUgYXJlYSBhbmQgdHJ5IGFnYWluLiAgSWYgd2UKKyAqIHN0aWxsIGRvbid0IGhhdmUgZW5vdWdoIHNwYWNlLCB0aGVuIHdlIGhhdmUgdG8gc3BsaXQgdGhlIGJsb2NrLiAgVGhlCisgKiBuYW1lL3ZhbHVlIHN0cnVjdHMgKGJvdGggbG9jYWwgYW5kIHJlbW90ZSB2ZXJzaW9ucykgbXVzdCBiZSAzMmJpdCBhbGlnbmVkLgorICoKKyAqIFNpbmNlIHdlIGhhdmUgZHVwbGljYXRlIGhhc2gga2V5cywgZm9yIGVhY2gga2V5IHRoYXQgbWF0Y2hlcywgY29tcGFyZQorICogdGhlIGFjdHVhbCBuYW1lIHN0cmluZy4gIFRoZSByb290IGFuZCBpbnRlcm1lZGlhdGUgbm9kZSBzZWFyY2ggYWx3YXlzCisgKiB0YWtlcyB0aGUgZmlyc3QtaW4tdGhlLWJsb2NrIGtleSBtYXRjaCBmb3VuZCwgc28gd2Ugc2hvdWxkIG9ubHkgaGF2ZQorICogdG8gd29yayAiZm9ydyJhcmQuICBJZiBub25lIG1hdGNoZXMsIGNvbnRpbnVlIHdpdGggdGhlICJmb3J3ImFyZCBsZWFmCisgKiBub2RlcyB1bnRpbCB0aGUgaGFzaCBrZXkgY2hhbmdlcyBvciB0aGUgYXR0cmlidXRlIG5hbWUgaXMgZm91bmQuCisgKgorICogV2Ugc3RvcmUgdGhlIGZhY3QgdGhhdCBhbiBhdHRyaWJ1dGUgaXMgYSBST09UL1VTRVIvU0VDVVJFIGF0dHJpYnV0ZSBpbgorICogdGhlIGxlYWZfZW50cnkuICBUaGUgbmFtZXNwYWNlcyBhcmUgaW5kZXBlbmRlbnQgb25seSBiZWNhdXNlIHdlIGFsc28gbG9vaworICogYXQgdGhlIG5hbWVzcGFjZSBiaXQgd2hlbiB3ZSBhcmUgbG9va2luZyBmb3IgYSBtYXRjaGluZyBhdHRyaWJ1dGUgbmFtZS4KKyAqCisgKiBXZSBhbHNvIHN0b3JlIGEgImluY29tcGxldGUiIGJpdCBpbiB0aGUgbGVhZl9lbnRyeS4gIEl0IHNob3dzIHRoYXQgYW4KKyAqIGF0dHJpYnV0ZSBpcyBpbiB0aGUgbWlkZGxlIG9mIGJlaW5nIGNyZWF0ZWQgYW5kIHNob3VsZCBub3QgYmUgc2hvd24gdG8KKyAqIHRoZSB1c2VyIGlmIHdlIGNyYXNoIGR1cmluZyB0aGUgdGltZSB0aGF0IHRoZSBiaXQgaXMgc2V0LiAgV2UgY2xlYXIgdGhlCisgKiBiaXQgd2hlbiB3ZSBoYXZlIGZpbmlzaGVkIHNldHRpbmcgdXAgdGhlIGF0dHJpYnV0ZS4gIFdlIGRvIHRoaXMgYmVjYXVzZQorICogd2UgY2Fubm90IGNyZWF0ZSBzb21lIGxhcmdlIGF0dHJpYnV0ZXMgaW5zaWRlIGEgc2luZ2xlIHRyYW5zYWN0aW9uLCBhbmQgd2UKKyAqIG5lZWQgc29tZSBpbmRpY2F0aW9uIHRoYXQgd2Ugd2VyZW4ndCBmaW5pc2hlZCBpZiB3ZSBjcmFzaCBpbiB0aGUgbWlkZGxlLgorICovCisjZGVmaW5lIFhGU19BVFRSX0xFQUZfTUFQU0laRQkzCS8qIGhvdyBtYW55IGZyZWVzcGFjZSBzbG90cyAqLworCit0eXBlZGVmIHN0cnVjdCB4ZnNfYXR0cl9sZWFmYmxvY2sgeworCXN0cnVjdCB4ZnNfYXR0cl9sZWFmX2hkciB7CS8qIGNvbnN0YW50LXN0cnVjdHVyZSBoZWFkZXIgYmxvY2sgKi8KKwkJeGZzX2RhX2Jsa2luZm9fdCBpbmZvOwkvKiBibG9jayB0eXBlLCBsaW5rcywgZXRjLiAqLworCQlfX3VpbnQxNl90IGNvdW50OwkvKiBjb3VudCBvZiBhY3RpdmUgbGVhZl9lbnRyeSdzICovCisJCV9fdWludDE2X3QgdXNlZGJ5dGVzOwkvKiBudW0gYnl0ZXMgb2YgbmFtZXMvdmFsdWVzIHN0b3JlZCAqLworCQlfX3VpbnQxNl90IGZpcnN0dXNlZDsJLyogZmlyc3QgdXNlZCBieXRlIGluIG5hbWUgYXJlYSAqLworCQlfX3VpbnQ4X3QgIGhvbGVzOwkvKiAhPSAwIGlmIGJsayBuZWVkcyBjb21wYWN0aW9uICovCisJCV9fdWludDhfdCAgcGFkMTsKKwkJc3RydWN0IHhmc19hdHRyX2xlYWZfbWFwIHsJICAvKiBSTEUgbWFwIG9mIGZyZWUgYnl0ZXMgKi8KKwkJCV9fdWludDE2X3QgYmFzZTsJICAvKiBiYXNlIG9mIGZyZWUgcmVnaW9uICovCisJCQlfX3VpbnQxNl90IHNpemU7CSAgLyogbGVuZ3RoIG9mIGZyZWUgcmVnaW9uICovCisJCX0gZnJlZW1hcFtYRlNfQVRUUl9MRUFGX01BUFNJWkVdOyAvKiBOIGxhcmdlc3QgZnJlZSByZWdpb25zICovCisJfSBoZHI7CisJc3RydWN0IHhmc19hdHRyX2xlYWZfZW50cnkgewkvKiBzb3J0ZWQgb24ga2V5LCBub3QgbmFtZSAqLworCQl4ZnNfZGFoYXNoX3QgaGFzaHZhbDsJLyogaGFzaCB2YWx1ZSBvZiBuYW1lICovCisJCV9fdWludDE2X3QgbmFtZWlkeDsJLyogaW5kZXggaW50byBidWZmZXIgb2YgbmFtZS92YWx1ZSAqLworCQlfX3VpbnQ4X3QgZmxhZ3M7CS8qIExPQ0FML1JPT1QvU0VDVVJFL0lOQ09NUExFVEUgZmxhZyAqLworCQlfX3VpbnQ4X3QgcGFkMjsJCS8qIHVudXNlZCBwYWQgYnl0ZSAqLworCX0gZW50cmllc1sxXTsJCQkvKiB2YXJpYWJsZSBzaXplZCBhcnJheSAqLworCXN0cnVjdCB4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWwgeworCQlfX3VpbnQxNl90IHZhbHVlbGVuOwkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gdmFsdWUgKi8KKwkJX191aW50OF90IG5hbWVsZW47CS8qIGxlbmd0aCBvZiBuYW1lIGJ5dGVzICovCisJCV9fdWludDhfdCBuYW1ldmFsWzFdOwkvKiBuYW1lL3ZhbHVlIGJ5dGVzICovCisJfSBuYW1lbGlzdDsJCQkvKiBncm93cyBmcm9tIGJvdHRvbSBvZiBidWYgKi8KKwlzdHJ1Y3QgeGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZSB7CisJCXhmc19kYWJsa190IHZhbHVlYmxrOwkvKiBibG9jayBudW1iZXIgb2YgdmFsdWUgYnl0ZXMgKi8KKwkJX191aW50MzJfdCB2YWx1ZWxlbjsJLyogbnVtYmVyIG9mIGJ5dGVzIGluIHZhbHVlICovCisJCV9fdWludDhfdCBuYW1lbGVuOwkvKiBsZW5ndGggb2YgbmFtZSBieXRlcyAqLworCQlfX3VpbnQ4X3QgbmFtZVsxXTsJLyogbmFtZSBieXRlcyAqLworCX0gdmFsdWVsaXN0OwkJCS8qIGdyb3dzIGZyb20gYm90dG9tIG9mIGJ1ZiAqLworfSB4ZnNfYXR0cl9sZWFmYmxvY2tfdDsKK3R5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xlYWZfaGRyIHhmc19hdHRyX2xlYWZfaGRyX3Q7Cit0eXBlZGVmIHN0cnVjdCB4ZnNfYXR0cl9sZWFmX21hcCB4ZnNfYXR0cl9sZWFmX21hcF90OwordHlwZWRlZiBzdHJ1Y3QgeGZzX2F0dHJfbGVhZl9lbnRyeSB4ZnNfYXR0cl9sZWFmX2VudHJ5X3Q7Cit0eXBlZGVmIHN0cnVjdCB4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWwgeGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsX3Q7Cit0eXBlZGVmIHN0cnVjdCB4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlIHhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGVfdDsKKworLyoKKyAqIEZsYWdzIHVzZWQgaW4gdGhlIGxlYWZfZW50cnlbaV0uZmxhZ3MgZmllbGQuCisgKiBOT1RFOiB0aGUgSU5DT01QTEVURSBiaXQgbXVzdCBub3QgY29sbGlkZSB3aXRoIHRoZSBmbGFncyBiaXRzIHNwZWNpZmllZAorICogb24gdGhlIHN5c3RlbSBjYWxsLCB0aGV5IGFyZSAib3IiZWQgdG9nZXRoZXIgZm9yIHZhcmlvdXMgb3BlcmF0aW9ucy4KKyAqLworI2RlZmluZQlYRlNfQVRUUl9MT0NBTF9CSVQJMAkvKiBhdHRyIGlzIHN0b3JlZCBsb2NhbGx5ICovCisjZGVmaW5lCVhGU19BVFRSX1JPT1RfQklUCTEJLyogbGltaXQgYWNjZXNzIHRvIHRydXN0ZWQgYXR0cnMgKi8KKyNkZWZpbmUJWEZTX0FUVFJfU0VDVVJFX0JJVAkyCS8qIGxpbWl0IGFjY2VzcyB0byBzZWN1cmUgYXR0cnMgKi8KKyNkZWZpbmUJWEZTX0FUVFJfSU5DT01QTEVURV9CSVQJNwkvKiBhdHRyIGluIG1pZGRsZSBvZiBjcmVhdGUvZGVsZXRlICovCisjZGVmaW5lIFhGU19BVFRSX0xPQ0FMCQkoMSA8PCBYRlNfQVRUUl9MT0NBTF9CSVQpCisjZGVmaW5lIFhGU19BVFRSX1JPT1QJCSgxIDw8IFhGU19BVFRSX1JPT1RfQklUKQorI2RlZmluZSBYRlNfQVRUUl9TRUNVUkUJCSgxIDw8IFhGU19BVFRSX1NFQ1VSRV9CSVQpCisjZGVmaW5lIFhGU19BVFRSX0lOQ09NUExFVEUJKDEgPDwgWEZTX0FUVFJfSU5DT01QTEVURV9CSVQpCisKKy8qCisgKiBBbGlnbm1lbnQgZm9yIG5hbWVsaXN0IGFuZCB2YWx1ZWxpc3QgZW50cmllcyAoc2luY2UgdGhleSBhcmUgbWl4ZWQKKyAqIHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBhbGlnbm1lbnQgdmFsdWUpCisgKi8KKyNkZWZpbmUJWEZTX0FUVFJfTEVBRl9OQU1FX0FMSUdOCSgodWludClzaXplb2YoeGZzX2RhYmxrX3QpKQorCisvKgorICogQ2FzdCB0eXBlZCBwb2ludGVycyBmb3IgImxvY2FsIiBhbmQgInJlbW90ZSIgbmFtZS92YWx1ZSBzdHJ1Y3RzLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BVFRSX0xFQUZfTkFNRV9SRU1PVEUpCit4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlX3QgKgoreGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZSh4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZnAsIGludCBpZHgpOworI2RlZmluZSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWZwLGlkeCkJXAorCXhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGUobGVhZnAsaWR4KQorI2Vsc2UKKyNkZWZpbmUgWEZTX0FUVFJfTEVBRl9OQU1FX1JFTU9URShsZWFmcCxpZHgpCS8qIHJlbW90ZSBuYW1lIHN0cnVjdCBwdHIgKi8gXAorCSgoeGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZV90ICopCQlcCisJICYoKGNoYXIgKikobGVhZnApKVsgSU5UX0dFVCgobGVhZnApLT5lbnRyaWVzW2lkeF0ubmFtZWlkeCwgQVJDSF9DT05WRVJUKSBdKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BVFRSX0xFQUZfTkFNRV9MT0NBTCkKK3hmc19hdHRyX2xlYWZfbmFtZV9sb2NhbF90ICoKK3hmc19hdHRyX2xlYWZfbmFtZV9sb2NhbCh4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZnAsIGludCBpZHgpOworI2RlZmluZSBYRlNfQVRUUl9MRUFGX05BTUVfTE9DQUwobGVhZnAsaWR4KQlcCisJeGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsKGxlYWZwLGlkeCkKKyNlbHNlCisjZGVmaW5lIFhGU19BVFRSX0xFQUZfTkFNRV9MT0NBTChsZWFmcCxpZHgpCS8qIGxvY2FsIG5hbWUgc3RydWN0IHB0ciAqLyBcCisJKCh4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWxfdCAqKQkJXAorCSAmKChjaGFyICopKGxlYWZwKSlbIElOVF9HRVQoKGxlYWZwKS0+ZW50cmllc1tpZHhdLm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkgXSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQVRUUl9MRUFGX05BTUUpCitjaGFyICp4ZnNfYXR0cl9sZWFmX25hbWUoeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWZwLCBpbnQgaWR4KTsKKyNkZWZpbmUgWEZTX0FUVFJfTEVBRl9OQU1FKGxlYWZwLGlkeCkJCXhmc19hdHRyX2xlYWZfbmFtZShsZWFmcCxpZHgpCisjZWxzZQorI2RlZmluZSBYRlNfQVRUUl9MRUFGX05BTUUobGVhZnAsaWR4KQkJLyogZ2VuZXJpYyBuYW1lIHN0cnVjdCBwdHIgKi8gXAorCSgmKChjaGFyICopKGxlYWZwKSlbIElOVF9HRVQoKGxlYWZwKS0+ZW50cmllc1tpZHhdLm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkgXSkKKyNlbmRpZgorCisvKgorICogQ2FsY3VsYXRlIHRvdGFsIGJ5dGVzIHVzZWQgKGluY2x1ZGluZyB0cmFpbGluZyBwYWQgZm9yIGFsaWdubWVudCkgZm9yCisgKiBhICJsb2NhbCIgbmFtZS92YWx1ZSBzdHJ1Y3R1cmUsIGEgInJlbW90ZSIgbmFtZS92YWx1ZSBzdHJ1Y3R1cmUsIGFuZAorICogYSBwb2ludGVyIHdoaWNoIG1pZ2h0IGJlIGVpdGhlci4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQVRUUl9MRUFGX0VOVFNJWkVfUkVNT1RFKQoraW50IHhmc19hdHRyX2xlYWZfZW50c2l6ZV9yZW1vdGUoaW50IG5sZW4pOworI2RlZmluZSBYRlNfQVRUUl9MRUFGX0VOVFNJWkVfUkVNT1RFKG5sZW4pCVwKKwl4ZnNfYXR0cl9sZWFmX2VudHNpemVfcmVtb3RlKG5sZW4pCisjZWxzZQorI2RlZmluZSBYRlNfQVRUUl9MRUFGX0VOVFNJWkVfUkVNT1RFKG5sZW4pCS8qIHNwYWNlIGZvciByZW1vdGUgc3RydWN0ICovIFwKKwkoKCh1aW50KXNpemVvZih4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlX3QpIC0gMSArIChubGVuKSArIFwKKwkgIFhGU19BVFRSX0xFQUZfTkFNRV9BTElHTiAtIDEpICYgfihYRlNfQVRUUl9MRUFGX05BTUVfQUxJR04gLSAxKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQVRUUl9MRUFGX0VOVFNJWkVfTE9DQUwpCitpbnQgeGZzX2F0dHJfbGVhZl9lbnRzaXplX2xvY2FsKGludCBubGVuLCBpbnQgdmxlbik7CisjZGVmaW5lIFhGU19BVFRSX0xFQUZfRU5UU0laRV9MT0NBTChubGVuLHZsZW4pCVwKKwl4ZnNfYXR0cl9sZWFmX2VudHNpemVfbG9jYWwobmxlbix2bGVuKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0FUVFJfTEVBRl9FTlRTSVpFX0xPQ0FMKG5sZW4sdmxlbikJLyogc3BhY2UgZm9yIGxvY2FsIHN0cnVjdCAqLyBcCisJKCgodWludClzaXplb2YoeGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsX3QpIC0gMSArIChubGVuKSArICh2bGVuKSArIFwKKwkgIFhGU19BVFRSX0xFQUZfTkFNRV9BTElHTiAtIDEpICYgfihYRlNfQVRUUl9MRUFGX05BTUVfQUxJR04gLSAxKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQVRUUl9MRUFGX0VOVFNJWkVfTE9DQUxfTUFYKQoraW50IHhmc19hdHRyX2xlYWZfZW50c2l6ZV9sb2NhbF9tYXgoaW50IGJzaXplKTsKKyNkZWZpbmUgWEZTX0FUVFJfTEVBRl9FTlRTSVpFX0xPQ0FMX01BWChic2l6ZSkJXAorCXhmc19hdHRyX2xlYWZfZW50c2l6ZV9sb2NhbF9tYXgoYnNpemUpCisjZWxzZQorI2RlZmluZSBYRlNfQVRUUl9MRUFGX0VOVFNJWkVfTE9DQUxfTUFYKGJzaXplKQkvKiBtYXggbG9jYWwgc3RydWN0IHNpemUgKi8gXAorCSgoKGJzaXplKSA+PiAxKSArICgoYnNpemUpID4+IDIpKQorI2VuZGlmCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0cnVjdHVyZSB1c2VkIHRvIHBhc3MgY29udGV4dCBhcm91bmQgYW1vbmcgdGhlIHJvdXRpbmVzLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit0eXBlZGVmIHN0cnVjdCB4ZnNfYXR0cl9saXN0X2NvbnRleHQgeworCXN0cnVjdCB4ZnNfaW5vZGUJCSpkcDsJLyogaW5vZGUgKi8KKwlzdHJ1Y3QgYXR0cmxpc3RfY3Vyc29yX2tlcm4JKmN1cnNvcjsvKiBwb3NpdGlvbiBpbiBsaXN0ICovCisJc3RydWN0IGF0dHJsaXN0CQkJKmFsaXN0OwkvKiBvdXRwdXQgYnVmZmVyICovCisJaW50CQkJCWNvdW50OwkvKiBudW0gdXNlZCBlbnRyaWVzICovCisJaW50CQkJCWR1cGNudDsJLyogY291bnQgZHVwIGhhc2h2YWxzIHNlZW4gKi8KKwlpbnQJCQkJYnVmc2l6ZTsvKiB0b3RhbCBidWZmZXIgc2l6ZSAqLworCWludAkJCQlmaXJzdHU7CS8qIGZpcnN0IHVzZWQgYnl0ZSBpbiBidWZmZXIgKi8KKwlpbnQJCQkJZmxhZ3M7CS8qIGZyb20gVk9QIGNhbGwgKi8KKwlpbnQJCQkJcmVzeW5jaDsvKiBUL0Y6IHJlc3luY2ggd2l0aCBjdXJzb3IgKi8KK30geGZzX2F0dHJfbGlzdF9jb250ZXh0X3Q7CisKKy8qCisgKiBVc2VkIHRvIGtlZXAgYSBsaXN0IG9mICJyZW1vdGUgdmFsdWUiIGV4dGVudHMgd2hlbiB1bmxpbmtpbmcgYW4gaW5vZGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19hdHRyX2luYWN0aXZlX2xpc3QgeworCXhmc19kYWJsa190CXZhbHVlYmxrOwkvKiBibG9jayBudW1iZXIgb2YgdmFsdWUgYnl0ZXMgKi8KKwlpbnQJCXZhbHVlbGVuOwkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gdmFsdWUgKi8KK30geGZzX2F0dHJfaW5hY3RpdmVfbGlzdF90OworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZvciB0aGUga2VybmVsLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogSW50ZXJuYWwgcm91dGluZXMgd2hlbiBkaXJzaXplIDwgWEZTX0xJVElOTyhtcCkuCisgKi8KK2ludAl4ZnNfYXR0cl9zaG9ydGZvcm1fY3JlYXRlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitpbnQJeGZzX2F0dHJfc2hvcnRmb3JtX2FkZChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFkZCk7CitpbnQJeGZzX2F0dHJfc2hvcnRmb3JtX2xvb2t1cChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworaW50CXhmc19hdHRyX3Nob3J0Zm9ybV9nZXR2YWx1ZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworaW50CXhmc19hdHRyX3Nob3J0Zm9ybV90b19sZWFmKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitpbnQJeGZzX2F0dHJfc2hvcnRmb3JtX3JlbW92ZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKnJlbW92ZSk7CitpbnQJeGZzX2F0dHJfc2hvcnRmb3JtX2xpc3Qoc3RydWN0IHhmc19hdHRyX2xpc3RfY29udGV4dCAqY29udGV4dCk7CitpbnQJeGZzX2F0dHJfc2hvcnRmb3JtX2FsbGZpdChzdHJ1Y3QgeGZzX2RhYnVmICpicCwgc3RydWN0IHhmc19pbm9kZSAqZHApOworCisvKgorICogSW50ZXJuYWwgcm91dGluZXMgd2hlbiBkaXJzaXplID09IFhGU19MQlNJWkUobXApLgorICovCitpbnQJeGZzX2F0dHJfbGVhZl90b19ub2RlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitpbnQJeGZzX2F0dHJfbGVhZl90b19zaG9ydGZvcm0oc3RydWN0IHhmc19kYWJ1ZiAqYnAsCisJCQkJCSAgc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2ludAl4ZnNfYXR0cl9sZWFmX2NsZWFyZmxhZyhzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworaW50CXhmc19hdHRyX2xlYWZfc2V0ZmxhZyhzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworaW50CXhmc19hdHRyX2xlYWZfZmxpcGZsYWdzKHhmc19kYV9hcmdzX3QgKmFyZ3MpOworCisvKgorICogUm91dGluZXMgdXNlZCBmb3IgZ3Jvd2luZyB0aGUgQnRyZWUuCisgKi8KK2ludAl4ZnNfYXR0cl9sZWFmX2NyZWF0ZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIHhmc19kYWJsa190IHdoaWNoX2Jsb2NrLAorCQkJCSAgICBzdHJ1Y3QgeGZzX2RhYnVmICoqYnBwKTsKK2ludAl4ZnNfYXR0cl9sZWFmX3NwbGl0KHN0cnVjdCB4ZnNfZGFfc3RhdGUgKnN0YXRlLAorCQkJCSAgIHN0cnVjdCB4ZnNfZGFfc3RhdGVfYmxrICpvbGRibGssCisJCQkJICAgc3RydWN0IHhmc19kYV9zdGF0ZV9ibGsgKm5ld2Jsayk7CitpbnQJeGZzX2F0dHJfbGVhZl9sb29rdXBfaW50KHN0cnVjdCB4ZnNfZGFidWYgKmxlYWYsCisJCQkJCXN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitpbnQJeGZzX2F0dHJfbGVhZl9nZXR2YWx1ZShzdHJ1Y3QgeGZzX2RhYnVmICpicCwgc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2ludAl4ZnNfYXR0cl9sZWFmX2FkZChzdHJ1Y3QgeGZzX2RhYnVmICpsZWFmX2J1ZmZlciwKKwkJCQkgc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2ludAl4ZnNfYXR0cl9sZWFmX3JlbW92ZShzdHJ1Y3QgeGZzX2RhYnVmICpsZWFmX2J1ZmZlciwKKwkJCQkgICAgc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2ludAl4ZnNfYXR0cl9sZWFmX2xpc3RfaW50KHN0cnVjdCB4ZnNfZGFidWYgKmJwLAorCQkJCSAgICAgIHN0cnVjdCB4ZnNfYXR0cl9saXN0X2NvbnRleHQgKmNvbnRleHQpOworCisvKgorICogUm91dGluZXMgdXNlZCBmb3Igc2hyaW5raW5nIHRoZSBCdHJlZS4KKyAqLworaW50CXhmc19hdHRyX2xlYWZfdG9vc21hbGwoc3RydWN0IHhmc19kYV9zdGF0ZSAqc3RhdGUsIGludCAqcmV0dmFsKTsKK3ZvaWQJeGZzX2F0dHJfbGVhZl91bmJhbGFuY2Uoc3RydWN0IHhmc19kYV9zdGF0ZSAqc3RhdGUsCisJCQkJICAgICAgIHN0cnVjdCB4ZnNfZGFfc3RhdGVfYmxrICpkcm9wX2JsaywKKwkJCQkgICAgICAgc3RydWN0IHhmc19kYV9zdGF0ZV9ibGsgKnNhdmVfYmxrKTsKK2ludAl4ZnNfYXR0cl9yb290X2luYWN0aXZlKHN0cnVjdCB4ZnNfdHJhbnMgKip0cmFucywgc3RydWN0IHhmc19pbm9kZSAqZHApOworaW50CXhmc19hdHRyX25vZGVfaW5hY3RpdmUoc3RydWN0IHhmc190cmFucyAqKnRyYW5zLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKKwkJCQkgICAgICBzdHJ1Y3QgeGZzX2RhYnVmICpicCwgaW50IGxldmVsKTsKK2ludAl4ZnNfYXR0cl9sZWFmX2luYWN0aXZlKHN0cnVjdCB4ZnNfdHJhbnMgKip0cmFucywgc3RydWN0IHhmc19pbm9kZSAqZHAsCisJCQkJICAgICAgc3RydWN0IHhmc19kYWJ1ZiAqYnApOworaW50CXhmc19hdHRyX2xlYWZfZnJlZXh0ZW50KHN0cnVjdCB4ZnNfdHJhbnMgKip0cmFucywgc3RydWN0IHhmc19pbm9kZSAqZHAsCisJCQkJICAgICAgIHhmc19kYWJsa190IGJsa25vLCBpbnQgYmxrY250KTsKKworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKi8KK3hmc19kYWhhc2hfdAl4ZnNfYXR0cl9sZWFmX2xhc3RoYXNoKHN0cnVjdCB4ZnNfZGFidWYgKmJwLCBpbnQgKmNvdW50KTsKK2ludAl4ZnNfYXR0cl9sZWFmX29yZGVyKHN0cnVjdCB4ZnNfZGFidWYgKmxlYWYxX2JwLAorCQkJCSAgIHN0cnVjdCB4ZnNfZGFidWYgKmxlYWYyX2JwKTsKK2ludAl4ZnNfYXR0cl9sZWFmX25ld2VudHNpemUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCBpbnQgYmxvY2tzaXplLAorCQkJCQlpbnQgKmxvY2FsKTsKK2ludAl4ZnNfYXR0cl9sZWFmX2VudHNpemUoc3RydWN0IHhmc19hdHRyX2xlYWZibG9jayAqbGVhZiwgaW50IGluZGV4KTsKK2ludAl4ZnNfYXR0cl9wdXRfbGlzdGVudChzdHJ1Y3QgeGZzX2F0dHJfbGlzdF9jb250ZXh0ICpjb250ZXh0LAorCQkJICAgICBzdHJ1Y3QgYXR0cm5hbWVzICosIGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAorCQkJICAgICBpbnQgdmFsdWVsZW4pOworaW50CXhmc19hdHRyX3JvbGx0cmFucyhzdHJ1Y3QgeGZzX3RyYW5zICoqdHJhbnNwLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCk7CisKKyNlbmRpZgkvKiBfX1hGU19BVFRSX0xFQUZfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2F0dHJfc2YuaCBiL2ZzL3hmcy94ZnNfYXR0cl9zZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmN2QyOTQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2F0dHJfc2YuaApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0FUVFJfU0ZfSF9fCisjZGVmaW5lCV9fWEZTX0FUVFJfU0ZfSF9fCisKKy8qCisgKiBBdHRyaWJ1dGUgc3RvcmFnZSB3aGVuIHN0b3JlZCBpbnNpZGUgdGhlIGlub2RlLgorICoKKyAqIFNtYWxsIGF0dHJpYnV0ZSBsaXN0cyBhcmUgcGFja2VkIGFzIHRpZ2h0bHkgYXMgcG9zc2libGUgc28gYXMKKyAqIHRvIGZpdCBpbnRvIHRoZSBsaXRlcmFsIGFyZWEgb2YgdGhlIGlub2RlLgorICovCisKK3N0cnVjdCB4ZnNfaW5vZGU7CisKKy8qCisgKiBFbnRyaWVzIGFyZSBwYWNrZWQgdG93YXJkIHRoZSB0b3AgYXMgdGlnaHQgYXMgcG9zc2libGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19hdHRyX3Nob3J0Zm9ybSB7CisJc3RydWN0IHhmc19hdHRyX3NmX2hkciB7CS8qIGNvbnN0YW50LXN0cnVjdHVyZSBoZWFkZXIgYmxvY2sgKi8KKwkJX191aW50MTZfdCB0b3RzaXplOwkvKiB0b3RhbCBieXRlcyBpbiBzaG9ydGZvcm0gbGlzdCAqLworCQlfX3VpbnQ4X3QgY291bnQ7CS8qIGNvdW50IG9mIGFjdGl2ZSBlbnRyaWVzICovCisJfSBoZHI7CisJc3RydWN0IHhmc19hdHRyX3NmX2VudHJ5IHsKKwkJX191aW50OF90IG5hbWVsZW47CS8qIGFjdHVhbCBsZW5ndGggb2YgbmFtZSAobm8gTlVMTCkgKi8KKwkJX191aW50OF90IHZhbHVlbGVuOwkvKiBhY3R1YWwgbGVuZ3RoIG9mIHZhbHVlIChubyBOVUxMKSAqLworCQlfX3VpbnQ4X3QgZmxhZ3M7CS8qIGZsYWdzIGJpdHMgKHNlZSB4ZnNfYXR0cl9sZWFmLmgpICovCisJCV9fdWludDhfdCBuYW1ldmFsWzFdOwkvKiBuYW1lICYgdmFsdWUgYnl0ZXMgY29uY2F0ZW5hdGVkICovCisJfSBsaXN0WzFdOwkJCS8qIHZhcmlhYmxlIHNpemVkIGFycmF5ICovCit9IHhmc19hdHRyX3Nob3J0Zm9ybV90OwordHlwZWRlZiBzdHJ1Y3QgeGZzX2F0dHJfc2ZfaGRyIHhmc19hdHRyX3NmX2hkcl90OwordHlwZWRlZiBzdHJ1Y3QgeGZzX2F0dHJfc2ZfZW50cnkgeGZzX2F0dHJfc2ZfZW50cnlfdDsKKworLyoKKyAqIFdlIGdlbmVyYXRlIHRoaXMgdGhlbiBzb3J0IGl0LCBhdHRyX2xpc3QoKSBtdXN0IHJldHVybiB0aGluZ3MgaW4gaGFzaC1vcmRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2F0dHJfc2Zfc29ydCB7CisJX191aW50OF90CWVudG5vOwkJLyogZW50cnkgbnVtYmVyIGluIG9yaWdpbmFsIGxpc3QgKi8KKwlfX3VpbnQ4X3QJbmFtZWxlbjsJLyogbGVuZ3RoIG9mIG5hbWUgdmFsdWUgKG5vIG51bGwpICovCisJX191aW50OF90CXZhbHVlbGVuOwkvKiBsZW5ndGggb2YgdmFsdWUgKi8KKwlfX3VpbnQ4X3QJZmxhZ3M7CQkvKiBmbGFncyBiaXRzIChzZWUgeGZzX2F0dHJfbGVhZi5oKSAqLworCXhmc19kYWhhc2hfdAloYXNoOwkJLyogdGhpcyBlbnRyeSdzIGhhc2ggdmFsdWUgKi8KKwljaGFyCQkqbmFtZTsJCS8qIG5hbWUgdmFsdWUsIHBvaW50ZXIgaW50byBidWZmZXIgKi8KK30geGZzX2F0dHJfc2Zfc29ydF90OworCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BVFRSX1NGX0VOVFNJWkVfQllOQU1FKQoraW50IHhmc19hdHRyX3NmX2VudHNpemVfYnluYW1lKGludCBubGVuLCBpbnQgdmxlbik7CisjZGVmaW5lIFhGU19BVFRSX1NGX0VOVFNJWkVfQllOQU1FKG5sZW4sdmxlbikJXAorCXhmc19hdHRyX3NmX2VudHNpemVfYnluYW1lKG5sZW4sdmxlbikKKyNlbHNlCisjZGVmaW5lIFhGU19BVFRSX1NGX0VOVFNJWkVfQllOQU1FKG5sZW4sdmxlbikJLyogc3BhY2UgbmFtZS92YWx1ZSB1c2VzICovIFwKKwkoKGludClzaXplb2YoeGZzX2F0dHJfc2ZfZW50cnlfdCktMSArIChubGVuKSsodmxlbikpCisjZW5kaWYKKyNkZWZpbmUgWEZTX0FUVFJfU0ZfRU5UU0laRV9NQVgJCQkvKiBtYXggc3BhY2UgZm9yIG5hbWUmdmFsdWUgKi8gXAorCSgoMSA8PCAoTkJCWSooaW50KXNpemVvZihfX3VpbnQ4X3QpKSkgLSAxKQorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQVRUUl9TRl9FTlRTSVpFKQoraW50IHhmc19hdHRyX3NmX2VudHNpemUoeGZzX2F0dHJfc2ZfZW50cnlfdCAqc2ZlcCk7CisjZGVmaW5lIFhGU19BVFRSX1NGX0VOVFNJWkUoc2ZlcCkJeGZzX2F0dHJfc2ZfZW50c2l6ZShzZmVwKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0FUVFJfU0ZfRU5UU0laRShzZmVwKQkJLyogc3BhY2UgYW4gZW50cnkgdXNlcyAqLyBcCisJKChpbnQpc2l6ZW9mKHhmc19hdHRyX3NmX2VudHJ5X3QpLTEgKyAoc2ZlcCktPm5hbWVsZW4rKHNmZXApLT52YWx1ZWxlbikKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQVRUUl9TRl9ORVhURU5UUlkpCit4ZnNfYXR0cl9zZl9lbnRyeV90ICp4ZnNfYXR0cl9zZl9uZXh0ZW50cnkoeGZzX2F0dHJfc2ZfZW50cnlfdCAqc2ZlcCk7CisjZGVmaW5lIFhGU19BVFRSX1NGX05FWFRFTlRSWShzZmVwKQl4ZnNfYXR0cl9zZl9uZXh0ZW50cnkoc2ZlcCkKKyNlbHNlCisjZGVmaW5lIFhGU19BVFRSX1NGX05FWFRFTlRSWShzZmVwKQkJLyogbmV4dCBlbnRyeSBpbiBzdHJ1Y3QgKi8gXAorCSgoeGZzX2F0dHJfc2ZfZW50cnlfdCAqKSBcCisJCSgoY2hhciAqKShzZmVwKSArIFhGU19BVFRSX1NGX0VOVFNJWkUoc2ZlcCkpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BVFRSX1NGX1RPVFNJWkUpCitpbnQgeGZzX2F0dHJfc2ZfdG90c2l6ZShzdHJ1Y3QgeGZzX2lub2RlICpkcCk7CisjZGVmaW5lIFhGU19BVFRSX1NGX1RPVFNJWkUoZHApCQl4ZnNfYXR0cl9zZl90b3RzaXplKGRwKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0FUVFJfU0ZfVE9UU0laRShkcCkJCQkvKiB0b3RhbCBzcGFjZSBpbiB1c2UgKi8gXAorCShJTlRfR0VUKCgoeGZzX2F0dHJfc2hvcnRmb3JtX3QgKikoKGRwKS0+aV9hZnAtPmlmX3UxLmlmX2RhdGEpKS0+aGRyLnRvdHNpemUsIEFSQ0hfQ09OVkVSVCkpCisjZW5kaWYKKworI2lmIGRlZmluZWQoWEZTX0FUVFJfVFJBQ0UpCisvKgorICogS2VybmVsIHRyYWNpbmcgc3VwcG9ydCBmb3IgYXR0cmlidXRlIGxpc3RzCisgKi8KK3N0cnVjdCB4ZnNfYXR0cl9saXN0X2NvbnRleHQ7CitzdHJ1Y3QgeGZzX2RhX2ludG5vZGU7CitzdHJ1Y3QgeGZzX2RhX25vZGVfZW50cnk7CitzdHJ1Y3QgeGZzX2F0dHJfbGVhZmJsb2NrOworCisjZGVmaW5lCVhGU19BVFRSX1RSQUNFX1NJWkUJNDA5NgkvKiBzaXplIG9mIGdsb2JhbCB0cmFjZSBidWZmZXIgKi8KK2V4dGVybiBrdHJhY2VfdAkqeGZzX2F0dHJfdHJhY2VfYnVmOworCisvKgorICogVHJhY2UgcmVjb3JkIHR5cGVzLgorICovCisjZGVmaW5lCVhGU19BVFRSX0tUUkFDRV9MX0MJMQkvKiBjb250ZXh0ICovCisjZGVmaW5lCVhGU19BVFRSX0tUUkFDRV9MX0NOCTIJLyogY29udGV4dCwgbm9kZSAqLworI2RlZmluZQlYRlNfQVRUUl9LVFJBQ0VfTF9DQgkzCS8qIGNvbnRleHQsIGJ0cmVlICovCisjZGVmaW5lCVhGU19BVFRSX0tUUkFDRV9MX0NMCTQJLyogY29udGV4dCwgbGVhZiAqLworCit2b2lkIHhmc19hdHRyX3RyYWNlX2xfYyhjaGFyICp3aGVyZSwgc3RydWN0IHhmc19hdHRyX2xpc3RfY29udGV4dCAqY29udGV4dCk7Cit2b2lkIHhmc19hdHRyX3RyYWNlX2xfY24oY2hhciAqd2hlcmUsIHN0cnVjdCB4ZnNfYXR0cl9saXN0X2NvbnRleHQgKmNvbnRleHQsCisJCQkgICAgICBzdHJ1Y3QgeGZzX2RhX2ludG5vZGUgKm5vZGUpOwordm9pZCB4ZnNfYXR0cl90cmFjZV9sX2NiKGNoYXIgKndoZXJlLCBzdHJ1Y3QgeGZzX2F0dHJfbGlzdF9jb250ZXh0ICpjb250ZXh0LAorCQkJICAgICAgc3RydWN0IHhmc19kYV9ub2RlX2VudHJ5ICpidHJlZSk7Cit2b2lkIHhmc19hdHRyX3RyYWNlX2xfY2woY2hhciAqd2hlcmUsIHN0cnVjdCB4ZnNfYXR0cl9saXN0X2NvbnRleHQgKmNvbnRleHQsCisJCQkgICAgICBzdHJ1Y3QgeGZzX2F0dHJfbGVhZmJsb2NrICpsZWFmKTsKK3ZvaWQgeGZzX2F0dHJfdHJhY2VfZW50ZXIoaW50IHR5cGUsIGNoYXIgKndoZXJlLAorCQkJICAgICBfX3BzdW5zaWduZWRfdCBhMiwgX19wc3Vuc2lnbmVkX3QgYTMsCisJCQkgICAgIF9fcHN1bnNpZ25lZF90IGE0LCBfX3BzdW5zaWduZWRfdCBhNSwKKwkJCSAgICAgX19wc3Vuc2lnbmVkX3QgYTYsIF9fcHN1bnNpZ25lZF90IGE3LAorCQkJICAgICBfX3BzdW5zaWduZWRfdCBhOCwgX19wc3Vuc2lnbmVkX3QgYTksCisJCQkgICAgIF9fcHN1bnNpZ25lZF90IGExMCwgX19wc3Vuc2lnbmVkX3QgYTExLAorCQkJICAgICBfX3BzdW5zaWduZWRfdCBhMTIsIF9fcHN1bnNpZ25lZF90IGExMywKKwkJCSAgICAgX19wc3Vuc2lnbmVkX3QgYTE0LCBfX3BzdW5zaWduZWRfdCBhMTUpOworI2Vsc2UKKyNkZWZpbmUJeGZzX2F0dHJfdHJhY2VfbF9jKHcsYykKKyNkZWZpbmUJeGZzX2F0dHJfdHJhY2VfbF9jbih3LGMsbikKKyNkZWZpbmUJeGZzX2F0dHJfdHJhY2VfbF9jYih3LGMsYikKKyNkZWZpbmUJeGZzX2F0dHJfdHJhY2VfbF9jbCh3LGMsbCkKKyNlbmRpZiAvKiBYRlNfQVRUUl9UUkFDRSAqLworCisjZW5kaWYJLyogX19YRlNfQVRUUl9TRl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYmVoYXZpb3IuYyBiL2ZzL3hmcy94ZnNfYmVoYXZpb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjA4OGUxCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19iZWhhdmlvci5jCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqCisgKi8KKyNpbmNsdWRlICJ4ZnMuaCIKKworLyoKKyAqIFNvdXJjZSBmaWxlIHVzZWQgdG8gYXNzb2NpYXRlL2Rpc2Fzc29jaWF0ZSBiZWhhdmlvcnMgd2l0aCB2aXJ0dWFsaXplZAorICogb2JqZWN0cy4gIFNlZSB4ZnNfYmVoYXZpb3IuaCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBiZWhhdmlvcnMsIGV0Yy4KKyAqCisgKiBUaGUgaW1wbGVtZW50YXRpb24gaXMgc3BsaXQgYmV0d2VlbiBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGFuZCBtYWNyb3MKKyAqIGluIHhmc19iZWhhdmlvci5oLgorICovCisKKy8qCisgKiBJbnNlcnQgYSBuZXcgYmVoYXZpb3IgZGVzY3JpcHRvciBpbnRvIGEgYmVoYXZpb3IgY2hhaW4uCisgKgorICogVGhlIGJlaGF2aW9yIGNoYWluIGlzIG9yZGVyZWQgYmFzZWQgb24gdGhlICdwb3NpdGlvbicgbnVtYmVyIHdoaWNoCisgKiBsaXZlcyBpbiB0aGUgZmlyc3QgZmllbGQgb2YgdGhlIG9wcyB2ZWN0b3IgKGhpZ2hlciBudW1iZXJzIGZpcnN0KS4KKyAqCisgKiBBdHRlbXBzIHRvIGluc2VydCBkdXBsaWNhdGUgb3BzIHJlc3VsdCBpbiBhbiBFSU5WQUwgcmV0dXJuIGNvZGUuCisgKiBPdGhlcndpc2UsIHJldHVybiAwIHRvIGluZGljYXRlIHN1Y2Nlc3MuCisgKi8KK2ludAorYmh2X2luc2VydChiaHZfaGVhZF90ICpiaHAsIGJodl9kZXNjX3QgKmJkcCkKK3sKKwliaHZfZGVzY190CSpjdXJkZXNjLCAqcHJldjsKKwlpbnQJCXBvc2l0aW9uOworCisJLyoKKwkgKiBWYWxpZGF0ZSB0aGUgcG9zaXRpb24gdmFsdWUgb2YgdGhlIG5ldyBiZWhhdmlvci4KKwkgKi8KKwlwb3NpdGlvbiA9IEJIVl9QT1NJVElPTihiZHApOworCUFTU0VSVChwb3NpdGlvbiA+PSBCSFZfUE9TSVRJT05fQkFTRSAmJiBwb3NpdGlvbiA8PSBCSFZfUE9TSVRJT05fVE9QKTsKKworCS8qCisJICogRmluZCBsb2NhdGlvbiB0byBpbnNlcnQgYmVoYXZpb3IuICBDaGVjayBmb3IgZHVwbGljYXRlcy4KKwkgKi8KKwlwcmV2ID0gTlVMTDsKKwlmb3IgKGN1cmRlc2MgPSBiaHAtPmJoX2ZpcnN0OworCSAgICAgY3VyZGVzYyAhPSBOVUxMOworCSAgICAgY3VyZGVzYyA9IGN1cmRlc2MtPmJkX25leHQpIHsKKworCQkvKiBDaGVjayBmb3IgZHVwbGljYXRpb24uICovCisJCWlmIChjdXJkZXNjLT5iZF9vcHMgPT0gYmRwLT5iZF9vcHMpIHsKKwkJCUFTU0VSVCgwKTsKKwkJCXJldHVybiBFSU5WQUw7CisJCX0KKworCQkvKiBGaW5kIGNvcnJlY3QgcG9zaXRpb24gKi8KKwkJaWYgKHBvc2l0aW9uID49IEJIVl9QT1NJVElPTihjdXJkZXNjKSkgeworCQkJQVNTRVJUKHBvc2l0aW9uICE9IEJIVl9QT1NJVElPTihjdXJkZXNjKSk7CisJCQlicmVhazsJCS8qIGZvdW5kIGl0ICovCisJCX0KKworCQlwcmV2ID0gY3VyZGVzYzsKKwl9CisKKwlpZiAocHJldiA9PSBOVUxMKSB7CisJCS8qIGluc2VydCBhdCBmcm9udCBvZiBjaGFpbiAqLworCQliZHAtPmJkX25leHQgPSBiaHAtPmJoX2ZpcnN0OworCQliaHAtPmJoX2ZpcnN0ID0gYmRwOworCX0gZWxzZSB7CisJCS8qIGluc2VydCBhZnRlciBwcmV2ICovCisJCWJkcC0+YmRfbmV4dCA9IHByZXYtPmJkX25leHQ7CisJCXByZXYtPmJkX25leHQgPSBiZHA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZW1vdmUgYSBiZWhhdmlvciBkZXNjcmlwdG9yIGZyb20gYSBwb3NpdGlvbiBpbiBhIGJlaGF2aW9yIGNoYWluOworICogdGhlIHBvc3RpdGlvbiBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSB0aGUgZmlyc3QgcG9zaXRpb24uCisgKiBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlIGJodl9yZW1vdmUoKSBtYWNyby4KKyAqLwordm9pZAorYmh2X3JlbW92ZV9ub3RfZmlyc3QoYmh2X2hlYWRfdCAqYmhwLCBiaHZfZGVzY190ICpiZHApCit7CisJYmh2X2Rlc2NfdAkqY3VyZGVzYywgKnByZXY7CisKKwlBU1NFUlQoYmhwLT5iaF9maXJzdCAhPSBOVUxMKTsKKwlBU1NFUlQoYmhwLT5iaF9maXJzdC0+YmRfbmV4dCAhPSBOVUxMKTsKKworCXByZXYgPSBiaHAtPmJoX2ZpcnN0OworCWZvciAoY3VyZGVzYyA9IGJocC0+YmhfZmlyc3QtPmJkX25leHQ7CisJICAgICBjdXJkZXNjICE9IE5VTEw7CisJICAgICBjdXJkZXNjID0gY3VyZGVzYy0+YmRfbmV4dCkgeworCisJCWlmIChjdXJkZXNjID09IGJkcCkKKwkJCWJyZWFrOwkJLyogZm91bmQgaXQgKi8KKwkJcHJldiA9IGN1cmRlc2M7CisJfQorCisJQVNTRVJUKGN1cmRlc2MgPT0gYmRwKTsKKwlwcmV2LT5iZF9uZXh0ID0gYmRwLT5iZF9uZXh0OwkvKiByZW1vdmUgZnJvbSBhZnRlciBwcmV2ICovCit9CisKKy8qCisgKiBMb29rIGZvciBhIHNwZWNpZmljIG9wcyB2ZWN0b3Igb24gdGhlIHNwZWNpZmllZCBiZWhhdmlvciBjaGFpbi4KKyAqIFJldHVybiB0aGUgYXNzb2NpYXRlZCBiZWhhdmlvciBkZXNjcmlwdG9yLiAgT3IgTlVMTCwgaWYgbm90IGZvdW5kLgorICovCitiaHZfZGVzY190ICoKK2Jodl9sb29rdXAoYmh2X2hlYWRfdCAqYmhwLCB2b2lkICpvcHMpCit7CisJYmh2X2Rlc2NfdAkqY3VyZGVzYzsKKworCWZvciAoY3VyZGVzYyA9IGJocC0+YmhfZmlyc3Q7CisJICAgICBjdXJkZXNjICE9IE5VTEw7CisJICAgICBjdXJkZXNjID0gY3VyZGVzYy0+YmRfbmV4dCkgeworCisJCWlmIChjdXJkZXNjLT5iZF9vcHMgPT0gb3BzKQorCQkJcmV0dXJuIGN1cmRlc2M7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBMb29rcyBmb3IgdGhlIGZpcnN0IGJlaGF2aW9yIHdpdGhpbiBhIHNwZWNpZmllZCByYW5nZSBvZiBwb3NpdGlvbnMuCisgKiBSZXR1cm4gdGhlIGFzc29jaWF0ZWQgYmVoYXZpb3IgZGVzY3JpcHRvci4gIE9yIE5VTEwsIGlmIG5vbmUgZm91bmQuCisgKi8KK2Jodl9kZXNjX3QgKgorYmh2X2xvb2t1cF9yYW5nZShiaHZfaGVhZF90ICpiaHAsIGludCBsb3csIGludCBoaWdoKQoreworCWJodl9kZXNjX3QJKmN1cmRlc2M7CisKKwlmb3IgKGN1cmRlc2MgPSBiaHAtPmJoX2ZpcnN0OworCSAgICAgY3VyZGVzYyAhPSBOVUxMOworCSAgICAgY3VyZGVzYyA9IGN1cmRlc2MtPmJkX25leHQpIHsKKworCQlpbnQJcG9zaXRpb24gPSBCSFZfUE9TSVRJT04oY3VyZGVzYyk7CisKKwkJaWYgKHBvc2l0aW9uIDw9IGhpZ2gpIHsKKwkJCWlmIChwb3NpdGlvbiA+PSBsb3cpCisJCQkJcmV0dXJuIGN1cmRlc2M7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCisvKgorICogUmV0dXJuIHRoZSBiYXNlIGJlaGF2aW9yIGluIHRoZSBjaGFpbiwgb3IgTlVMTCBpZiB0aGUgY2hhaW4KKyAqIGlzIGVtcHR5LgorICoKKyAqIFRoZSBjYWxsZXIgaGFzIG5vdCByZWFkIGxvY2tlZCB0aGUgYmVoYXZpb3IgY2hhaW4sIHNvIGFjcXVpcmUgdGhlCisgKiBsb2NrIGJlZm9yZSB0cmF2ZXJzaW5nIHRoZSBjaGFpbi4KKyAqLworYmh2X2Rlc2NfdCAqCitiaHZfYmFzZShiaHZfaGVhZF90ICpiaHApCit7CisJYmh2X2Rlc2NfdAkqY3VyZGVzYzsKKworCWZvciAoY3VyZGVzYyA9IGJocC0+YmhfZmlyc3Q7CisJICAgICBjdXJkZXNjICE9IE5VTEw7CisJICAgICBjdXJkZXNjID0gY3VyZGVzYy0+YmRfbmV4dCkgeworCisJCWlmIChjdXJkZXNjLT5iZF9uZXh0ID09IE5VTEwpIHsKKwkJCXJldHVybiBjdXJkZXNjOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQKK2Jodl9oZWFkX2luaXQoCisJYmh2X2hlYWRfdCAqYmhwLAorCWNoYXIgKm5hbWUpCit7CisJYmhwLT5iaF9maXJzdCA9IE5VTEw7Cit9CisKK3ZvaWQKK2Jodl9pbnNlcnRfaW5pdGlhbCgKKwliaHZfaGVhZF90ICpiaHAsCisJYmh2X2Rlc2NfdCAqYmRwKQoreworCUFTU0VSVChiaHAtPmJoX2ZpcnN0ID09IE5VTEwpOworCShiaHApLT5iaF9maXJzdCA9IGJkcDsKK30KKwordm9pZAorYmh2X2hlYWRfZGVzdHJveSgKKwliaHZfaGVhZF90ICpiaHApCit7CisJQVNTRVJUKGJocC0+YmhfZmlyc3QgPT0gTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2JlaGF2aW9yLmggYi9mcy94ZnMveGZzX2JlaGF2aW9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVlZDVhOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfYmVoYXZpb3IuaApAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfQkVIQVZJT1JfSF9fCisjZGVmaW5lIF9fWEZTX0JFSEFWSU9SX0hfXworCisvKgorICogSGVhZGVyIGZpbGUgdXNlZCB0byBhc3NvY2lhdGUgYmVoYXZpb3JzIHdpdGggdmlydHVhbGl6ZWQgb2JqZWN0cy4KKyAqCisgKiBBIHZpcnR1YWxpemVkIG9iamVjdCBpcyBhbiBpbnRlcm5hbCwgdmlydHVhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YKKyAqIE9TIGVudGl0aWVzIHN1Y2ggYXMgcGVyc2lzdGVudCBmaWxlcywgcHJvY2Vzc2VzLCBvciBzb2NrZXRzLiAgRXhhbXBsZXMKKyAqIG9mIHZpcnR1YWxpemVkIG9iamVjdHMgaW5jbHVkZSB2bm9kZXMsIHZwcm9jcywgYW5kIHZzb2NrZXRzLiAgT2Z0ZW4KKyAqIGEgdmlydHVhbGl6ZWQgb2JqZWN0IGlzIHJlZmVycmVkIHRvIHNpbXBseSBhcyBhbiAib2JqZWN0LiIKKyAqCisgKiBBIGJlaGF2aW9yIGlzIGVzc2VudGlhbGx5IGFuIGltcGxlbWVudGF0aW9uIGxheWVyIGFzc29jaWF0ZWQgd2l0aAorICogYW4gb2JqZWN0LiAgTXVsdGlwbGUgYmVoYXZpb3JzIGZvciBhbiBvYmplY3QgYXJlIGNoYWluZWQgdG9nZXRoZXIsCisgKiB0aGUgb3JkZXIgb2YgY2hhaW5pbmcgZGV0ZXJtaW5pbmcgdGhlIG9yZGVyIG9mIGludm9jYXRpb24uICBFYWNoCisgKiBiZWhhdmlvciBvZiBhIGdpdmVuIG9iamVjdCBpbXBsZW1lbnRzIHRoZSBzYW1lIHNldCBvZiBpbnRlcmZhY2VzCisgKiAoZS5nLiwgdGhlIFZPUCBpbnRlcmZhY2VzKS4KKyAqCisgKiBCZWhhdmlvcnMgbWF5IGJlIGR5bmFtaWNhbGx5IGluc2VydGVkIGludG8gYW4gb2JqZWN0J3MgYmVoYXZpb3IgY2hhaW4sCisgKiBzdWNoIHRoYXQgdGhlIGFkZGl0aW9uIGlzIHRyYW5zcGFyZW50IHRvIGNvbnN1bWVycyB0aGF0IGFscmVhZHkgaGF2ZQorICogcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0LiAgVHlwaWNhbGx5LCBhIGdpdmVuIGJlaGF2aW9yIHdpbGwgYmUgaW5zZXJ0ZWQKKyAqIGF0IGEgcGFydGljdWxhciBsb2NhdGlvbiBpbiB0aGUgYmVoYXZpb3IgY2hhaW4uICBJbnNlcnRpb24gb2YgbmV3CisgKiBiZWhhdmlvcnMgaXMgc3luY2hyb25pemVkIHdpdGggb3BlcmF0aW9ucy1pbi1wcm9ncmVzcyAob2lwJ3MpIHNvIHRoYXQKKyAqIHRoZSBvaXAncyBhbHdheXMgc2VlIGEgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBjaGFpbi4KKyAqCisgKiBUaGUgdGVybSAiaW50ZXJwb3N0aW9uIiBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBhY3Qgb2YgaW5zZXJ0aW5nCisgKiBhIGJlaGF2aW9yIHN1Y2ggdGhhdCBpdCBpbnRlcnBvc2VzIG9uIChpLmUuLCBpcyBpbnNlcnRlZCBpbiBmcm9udAorICogb2YpIGEgcGFydGljdWxhciBvdGhlciBiZWhhdmlvci4gIEEga2V5IGV4YW1wbGUgb2YgdGhpcyBpcyB3aGVuIGEKKyAqIHN5c3RlbSBpbXBsZW1lbnRpbmcgZGlzdHJpYnV0ZWQgc2luZ2xlIHN5c3RlbSBpbWFnZSB3aXNoZXMgdG8KKyAqIGludGVycG9zZSBhIGRpc3RyaWJ1dGlvbiBsYXllciAocHJvdmlkaW5nIGRpc3RyaWJ1dGVkIGNvaGVyZW5jeSkKKyAqIGluIGZyb250IG9mIGFuIG9iamVjdCB0aGF0IGlzIG90aGVyd2lzZSBvbmx5IGFjY2Vzc2VkIGxvY2FsbHkuCisgKgorICogTm90ZSB0aGF0IHRoZSB0cmFkaXRpb25hbCB2bm9kZS9pbm9kZSBjb21iaW5hdGlvbiBpcyBzaW1wbHkgYSB2aXJ0dWFsaXplZAorICogb2JqZWN0IHRoYXQgaGFzIGV4YWN0bHkgb25lIGFzc29jaWF0ZWQgYmVoYXZpb3IuCisgKgorICogQmVoYXZpb3Igc3luY2hyb25pemF0aW9uIGlzIGxvZ2ljIHdoaWNoIGlzIG5lY2Vzc2FyeSB1bmRlciBjZXJ0YWluCisgKiBjaXJjdW1zdGFuY2VzIHRoYXQgdGhlcmUgaXMgbm8gY29uZmxpY3QgYmV0d2VlbiBvbmdvaW5nIG9wZXJhdGlvbnMKKyAqIHRyYXZlcnNpbmcgdGhlIGJlaGF2aW9yIGNoYWluIGFuZCB0aG9zZSBkdW5hbWljYWxseSBtb2RpZnlpbmcgdGhlCisgKiBiZWhhdmlvciBjaGFpbi4gIEJlY2F1c2UgYmVoYXZpb3Igc3luY2hyb25pemF0aW9uIGFkZHMgZXh0cmEgb3ZlcmhlYWQKKyAqIHRvIHZpcnR1YWwgb3BlcmF0aW9uIGludm9jYXRpb24sIHdlIHdhbnQgdG8gcmVzdHJpY3QsIGFzIG11Y2ggYXMKKyAqIHdlIGNhbiwgdGhlIHJlcXVpcmVtZW50IGZvciB0aGlzIGV4dHJhIGNvZGUsIHRvIHRob3NlIHNpdHVhdGlvbnMKKyAqIGluIHdoaWNoIGl0IGlzIHRydWx5IG5lY2Vzc2FyeS4KKyAqCisgKiBCZWhhdmlvciBzeW5jaHJvbml6YXRpb24gaXMgbmVlZGVkIHdoZW5ldmVyIHRoZXJlJ3MgYXQgbGVhc3Qgb25lIGNsYXNzCisgKiBvZiBvYmplY3QgaW4gdGhlIHN5c3RlbSBmb3Igd2hpY2g6CisgKiAxKSBtdWx0aXBsZSBiZWhhdmlvcnMgZm9yIGEgZ2l2ZW4gb2JqZWN0IGFyZSBzdXBwb3J0ZWQsCisgKiAtLSBBTkQgLS0KKyAqIDJhKSBpbnNlcnRpb24gb2YgYSBuZXcgYmVoYXZpb3IgY2FuIGhhcHBlbiBkeW5hbWljYWxseSBhdCBhbnkgdGltZSBkdXJpbmcKKyAqICAgICB0aGUgbGlmZSBvZiBhbiBhY3RpdmUgb2JqZWN0LAorICoJLS0gQU5EIC0tCisgKgkzYSkgaW5zZXJ0aW9uIG9mIGEgbmV3IGJlaGF2aW9yIG5lZWRzIHRvIHN5bmNocm9uaXplIHdpdGggZXhpc3RpbmcKKyAqCSAgICBvcHMtaW4tcHJvZ3Jlc3MuCisgKgktLSBPUiAtLQorICoJM2IpIG11bHRpcGxlIGRpZmZlcmVudCBiZWhhdmlvcnMgY2FuIGJlIGR5bmFtaWNhbGx5IGluc2VydGVkIGF0CisgKgkgICAgYW55IHRpbWUgZHVyaW5nIHRoZSBsaWZlIG9mIGFuIGFjdGl2ZSBvYmplY3QKKyAqCS0tIE9SIC0tCisgKgkzYykgcmVtb3ZhbCBvZiBhIGJlaGF2aW9yIGNhbiBvY2N1ciBhdCBhbnkgdGltZSBkdXJpbmcgdGhlIGxpZmUgb2YKKyAqCSAgICBhbiBhY3RpdmUgb2JqZWN0LgorICogLS0gT1IgLS0KKyAqIDJiKSByZW1vdmFsIG9mIGEgYmVoYXZpb3IgY2FuIG9jY3VyIGF0IGFueSB0aW1lIGR1cmluZyB0aGUgbGlmZSBvZiBhbgorICogICAgIGFjdGl2ZSBvYmplY3QKKyAqCisgKi8KKworc3RydWN0IGJodl9oZWFkX2xvY2s7CisKKy8qCisgKiBCZWhhdmlvciBoZWFkLiAgSGVhZCBvZiB0aGUgY2hhaW4gb2YgYmVoYXZpb3JzLgorICogQ29udGFpbmVkIHdpdGhpbiBlYWNoIHZpcnR1YWxpemVkIG9iamVjdCBkYXRhIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmh2X2hlYWQgeworCXN0cnVjdCBiaHZfZGVzYyAqYmhfZmlyc3Q7CS8qIGZpcnN0IGJlaGF2aW9yIGluIGNoYWluICovCisJc3RydWN0IGJodl9oZWFkX2xvY2sgKmJoX2xvY2twOwkvKiBwb2ludGVyIHRvIGxvY2sgaW5mbyBzdHJ1Y3QgKi8KK30gYmh2X2hlYWRfdDsKKworLyoKKyAqIEJlaGF2aW9yIGRlc2NyaXB0b3IuCSBEZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGJlaGF2aW9yLgorICogQ29udGFpbmVkIHdpdGhpbiB0aGUgYmVoYXZpb3IncyBwcml2YXRlIGRhdGEgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBiaHZfZGVzYyB7CisJdm9pZAkJKmJkX3BkYXRhOwkvKiBwcml2YXRlIGRhdGEgZm9yIHRoaXMgYmVoYXZpb3IgKi8KKwl2b2lkCQkqYmRfdm9iajsJLyogdmlydHVhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoICovCisJdm9pZAkJKmJkX29wczsJLyogb3BzIGZvciB0aGlzIGJlaGF2aW9yICovCisJc3RydWN0IGJodl9kZXNjICpiZF9uZXh0OwkvKiBuZXh0IGJlaGF2aW9yIGluIGNoYWluICovCit9IGJodl9kZXNjX3Q7CisKKy8qCisgKiBCZWhhdmlvciBpZGVudGl0eSBmaWVsZC4gIEEgYmVoYXZpb3IncyBpZGVudGl0eSBkZXRlcm1pbmVzIHRoZSBwb3NpdGlvbgorICogd2hlcmUgaXQgbGl2ZXMgd2l0aGluIGEgYmVoYXZpb3IgY2hhaW4sIGFuZCBpdCdzIGFsd2F5cyB0aGUgZmlyc3QgZmllbGQKKyAqIG9mIHRoZSBiZWhhdmlvcidzIG9wcyB2ZWN0b3IuIFRoZSBvcHRpb25hbCBpZCBmaWVsZCBmdXJ0aGVyIGlkZW50aWZpZXMgdGhlCisgKiBzdWJzeXN0ZW0gcmVzcG9uc2libGUgZm9yIHRoZSBiZWhhdmlvci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmh2X2lkZW50aXR5IHsKKwlfX3UxNgliaV9pZDsJCS8qIG93bmluZyBzdWJzeXN0ZW0gaWQgKi8KKwlfX3UxNgliaV9wb3NpdGlvbjsJLyogcG9zaXRpb24gaW4gY2hhaW4gKi8KK30gYmh2X2lkZW50aXR5X3Q7CisKK3R5cGVkZWYgYmh2X2lkZW50aXR5X3QgYmh2X3Bvc2l0aW9uX3Q7CisKKyNkZWZpbmUgQkhWX0lERU5USVRZX0lOSVQoaWQscG9zKQl7aWQsIHBvc30KKyNkZWZpbmUgQkhWX0lERU5USVRZX0lOSVRfUE9TSVRJT04ocG9zKSBCSFZfSURFTlRJVFlfSU5JVCgwLCBwb3MpCisKKy8qCisgKiBEZWZpbmUgYm91bmRhcmllcyBvZiBwb3NpdGlvbiB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgQkhWX1BPU0lUSU9OX0lOVkFMSUQJMAkvKiBpbnZhbGlkIHBvc2l0aW9uIG51bWJlciAqLworI2RlZmluZSBCSFZfUE9TSVRJT05fQkFTRQkxCS8qIGJhc2UgKGxhc3QpIGltcGxlbWVudGF0aW9uIGxheWVyICovCisjZGVmaW5lIEJIVl9QT1NJVElPTl9UT1AJNjMJLyogdG9wIChmaXJzdCkgaW1wbGVtZW50YXRpb24gbGF5ZXIgKi8KKworLyoKKyAqIFBsdW1iaW5nIG1hY3Jvcy4KKyAqLworI2RlZmluZSBCSFZfSEVBRF9GSVJTVChiaHApCShBU1NFUlQoKGJocCktPmJoX2ZpcnN0KSwgKGJocCktPmJoX2ZpcnN0KQorI2RlZmluZSBCSFZfTkVYVChiZHApCQkoQVNTRVJUKChiZHApLT5iZF9uZXh0KSwgKGJkcCktPmJkX25leHQpCisjZGVmaW5lIEJIVl9ORVhUTlVMTChiZHApCSgoYmRwKS0+YmRfbmV4dCkKKyNkZWZpbmUgQkhWX1ZPQkooYmRwKQkJKEFTU0VSVCgoYmRwKS0+YmRfdm9iaiksIChiZHApLT5iZF92b2JqKQorI2RlZmluZSBCSFZfVk9CSk5VTEwoYmRwKQkoKGJkcCktPmJkX3ZvYmopCisjZGVmaW5lIEJIVl9QREFUQShiZHApCQkoYmRwKS0+YmRfcGRhdGEKKyNkZWZpbmUgQkhWX09QUyhiZHApCQkoYmRwKS0+YmRfb3BzCisjZGVmaW5lIEJIVl9JREVOVElUWShiZHApCSgoYmh2X2lkZW50aXR5X3QgKikoYmRwKS0+YmRfb3BzKQorI2RlZmluZSBCSFZfUE9TSVRJT04oYmRwKQkoQkhWX0lERU5USVRZKGJkcCktPmJpX3Bvc2l0aW9uKQorCitleHRlcm4gdm9pZCBiaHZfaGVhZF9pbml0KGJodl9oZWFkX3QgKiwgY2hhciAqKTsKK2V4dGVybiB2b2lkIGJodl9oZWFkX2Rlc3Ryb3koYmh2X2hlYWRfdCAqKTsKK2V4dGVybiBpbnQgIGJodl9pbnNlcnQoYmh2X2hlYWRfdCAqLCBiaHZfZGVzY190ICopOworZXh0ZXJuIHZvaWQgYmh2X2luc2VydF9pbml0aWFsKGJodl9oZWFkX3QgKiwgYmh2X2Rlc2NfdCAqKTsKKworLyoKKyAqIEluaXRpYWxpemUgYSBuZXcgYmVoYXZpb3IgZGVzY3JpcHRvci4KKyAqIEFyZ3VtZW50czoKKyAqICAgYmRwIC0gcG9pbnRlciB0byBiZWhhdmlvciBkZXNjcmlwdG9yCisgKiAgIHBkYXRhIC0gcG9pbnRlciB0byBiZWhhdmlvcidzIHByaXZhdGUgZGF0YQorICogICB2b2JqIC0gcG9pbnRlciB0byBhc3NvY2lhdGVkIHZpcnR1YWwgb2JqZWN0CisgKiAgIG9wcyAtIHBvaW50ZXIgdG8gb3BzIGZvciB0aGlzIGJlaGF2aW9yCisgKi8KKyNkZWZpbmUgYmh2X2Rlc2NfaW5pdChiZHAsIHBkYXRhLCB2b2JqLCBvcHMpCQlcCisgewkJCQkJCQlcCisJKGJkcCktPmJkX3BkYXRhID0gcGRhdGE7CQkJXAorCShiZHApLT5iZF92b2JqID0gdm9iajsJCQkJXAorCShiZHApLT5iZF9vcHMgPSBvcHM7CQkJCVwKKwkoYmRwKS0+YmRfbmV4dCA9IE5VTEw7CQkJCVwKKyB9CisKKy8qCisgKiBSZW1vdmUgYSBiZWhhdmlvciBkZXNjcmlwdG9yIGZyb20gYSBiZWhhdmlvciBjaGFpbi4KKyAqLworI2RlZmluZSBiaHZfcmVtb3ZlKGJocCwgYmRwKQkJCQlcCisgewkJCQkJCQlcCisJaWYgKChiaHApLT5iaF9maXJzdCA9PSAoYmRwKSkgewkJCVwKKwkJLyoJCQkJCVwKKwkJKiBSZW1vdmUgZnJvbSBmcm9udCBvZiBjaGFpbi4JCVwKKwkJKiBBdG9taWMgd3J0IG9pcCdzLgkJCVwKKwkJKi8JCQkJCVwKKwkgICAgICAgKGJocCktPmJoX2ZpcnN0ID0gKGJkcCktPmJkX25leHQ7CVwKKwl9IGVsc2UgewkJCQkJXAorCSAgICAgICAvKiByZW1vdmUgZnJvbSBub24tZnJvbnQgb2YgY2hhaW4gKi8JXAorCSAgICAgICBiaHZfcmVtb3ZlX25vdF9maXJzdChiaHAsIGJkcCk7CQlcCisJfQkJCQkJCVwKKwkoYmRwKS0+YmRfdm9iaiA9IE5VTEw7CQkJCVwKKyB9CisKKy8qCisgKiBCZWhhdmlvciBtb2R1bGUgcHJvdG90eXBlcy4KKyAqLworZXh0ZXJuIHZvaWQJCWJodl9yZW1vdmVfbm90X2ZpcnN0KGJodl9oZWFkX3QgKmJocCwgYmh2X2Rlc2NfdCAqYmRwKTsKK2V4dGVybiBiaHZfZGVzY190ICoJYmh2X2xvb2t1cChiaHZfaGVhZF90ICpiaHAsIHZvaWQgKm9wcyk7CitleHRlcm4gYmh2X2Rlc2NfdCAqCWJodl9sb29rdXBfcmFuZ2UoYmh2X2hlYWRfdCAqYmhwLCBpbnQgbG93LCBpbnQgaGlnaCk7CitleHRlcm4gYmh2X2Rlc2NfdCAqCWJodl9iYXNlKGJodl9oZWFkX3QgKmJocCk7CisKKy8qIE5vIGJodiBsb2NraW5nIG9uIExpbnV4ICovCisjZGVmaW5lIGJodl9sb29rdXBfdW5sb2NrZWQJYmh2X2xvb2t1cAorI2RlZmluZSBiaHZfYmFzZV91bmxvY2tlZAliaHZfYmFzZQorCisjZW5kaWYgLyogX19YRlNfQkVIQVZJT1JfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2JpdC5jIGIvZnMveGZzL3hmc19iaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjBhNmMzCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19iaXQuYwpAQCAtMCwwICsxLDMxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworLyoKKyAqIFhGUyBiaXQgbWFuaXB1bGF0aW9uIHJvdXRpbmVzLCB1c2VkIGluIG5vbi1yZWFsdGltZSBjb2RlLgorICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgorCisKKyNpZm5kZWYgSEFWRV9BUkNIX0hJR0hCSVQKKy8qCisgKiBJbmRleCBvZiBoaWdoIGJpdCBudW1iZXIgaW4gYnl0ZSwgLTEgZm9yIG5vbmUgc2V0LCAwLi43IG90aGVyd2lzZS4KKyAqLworY29uc3QgY2hhciB4ZnNfaGlnaGJpdFsyNTZdID0geworICAgICAgIC0xLCAwLCAxLCAxLCAyLCAyLCAyLCAyLAkJCS8qIDAwIC4uIDA3ICovCisJMywgMywgMywgMywgMywgMywgMywgMywJCQkvKiAwOCAuLiAwZiAqLworCTQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCQkJLyogMTAgLi4gMTcgKi8KKwk0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAkJCS8qIDE4IC4uIDFmICovCisJNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwJCQkvKiAyMCAuLiAyNyAqLworCTUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCQkJLyogMjggLi4gMmYgKi8KKwk1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAkJCS8qIDMwIC4uIDM3ICovCisJNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwJCQkvKiAzOCAuLiAzZiAqLworCTYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCQkJLyogNDAgLi4gNDcgKi8KKwk2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAkJCS8qIDQ4IC4uIDRmICovCisJNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwJCQkvKiA1MCAuLiA1NyAqLworCTYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCQkJLyogNTggLi4gNWYgKi8KKwk2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAkJCS8qIDYwIC4uIDY3ICovCisJNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwJCQkvKiA2OCAuLiA2ZiAqLworCTYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCQkJLyogNzAgLi4gNzcgKi8KKwk2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAkJCS8qIDc4IC4uIDdmICovCisJNywgNywgNywgNywgNywgNywgNywgNywJCQkvKiA4MCAuLiA4NyAqLworCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCQkJLyogODggLi4gOGYgKi8KKwk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAkJCS8qIDkwIC4uIDk3ICovCisJNywgNywgNywgNywgNywgNywgNywgNywJCQkvKiA5OCAuLiA5ZiAqLworCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCQkJLyogYTAgLi4gYTcgKi8KKwk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAkJCS8qIGE4IC4uIGFmICovCisJNywgNywgNywgNywgNywgNywgNywgNywJCQkvKiBiMCAuLiBiNyAqLworCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCQkJLyogYjggLi4gYmYgKi8KKwk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAkJCS8qIGMwIC4uIGM3ICovCisJNywgNywgNywgNywgNywgNywgNywgNywJCQkvKiBjOCAuLiBjZiAqLworCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCQkJLyogZDAgLi4gZDcgKi8KKwk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAkJCS8qIGQ4IC4uIGRmICovCisJNywgNywgNywgNywgNywgNywgNywgNywJCQkvKiBlMCAuLiBlNyAqLworCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCQkJLyogZTggLi4gZWYgKi8KKwk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAkJCS8qIGYwIC4uIGY3ICovCisJNywgNywgNywgNywgNywgNywgNywgNywJCQkvKiBmOCAuLiBmZiAqLworfTsKKyNlbmRpZgorCisvKgorICogQ291bnQgb2YgYml0cyBzZXQgaW4gYnl0ZSwgMC4uOC4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgeGZzX2NvdW50Yml0WzI1Nl0gPSB7CisJMCwgMSwgMSwgMiwgMSwgMiwgMiwgMywJCQkvKiAwMCAuLiAwNyAqLworCTEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsCQkJLyogMDggLi4gMGYgKi8KKwkxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LAkJCS8qIDEwIC4uIDE3ICovCisJMiwgMywgMywgNCwgMywgNCwgNCwgNSwJCQkvKiAxOCAuLiAxZiAqLworCTEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsCQkJLyogMjAgLi4gMjcgKi8KKwkyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LAkJCS8qIDI4IC4uIDJmICovCisJMiwgMywgMywgNCwgMywgNCwgNCwgNSwJCQkvKiAzMCAuLiAzNyAqLworCTMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsCQkJLyogMzggLi4gM2YgKi8KKwkxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LAkJCS8qIDQwIC4uIDQ3ICovCisJMiwgMywgMywgNCwgMywgNCwgNCwgNSwJCQkvKiA0OCAuLiA0ZiAqLworCTIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsCQkJLyogNTAgLi4gNTcgKi8KKwkzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LAkJCS8qIDU4IC4uIDVmICovCisJMiwgMywgMywgNCwgMywgNCwgNCwgNSwJCQkvKiA2MCAuLiA2NyAqLworCTMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsCQkJLyogNjggLi4gNmYgKi8KKwkzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LAkJCS8qIDcwIC4uIDc3ICovCisJNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywJCQkvKiA3OCAuLiA3ZiAqLworCTEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsCQkJLyogODAgLi4gODcgKi8KKwkyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LAkJCS8qIDg4IC4uIDhmICovCisJMiwgMywgMywgNCwgMywgNCwgNCwgNSwJCQkvKiA5MCAuLiA5NyAqLworCTMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsCQkJLyogOTggLi4gOWYgKi8KKwkyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LAkJCS8qIGEwIC4uIGE3ICovCisJMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwJCQkvKiBhOCAuLiBhZiAqLworCTMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsCQkJLyogYjAgLi4gYjcgKi8KKwk0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LAkJCS8qIGI4IC4uIGJmICovCisJMiwgMywgMywgNCwgMywgNCwgNCwgNSwJCQkvKiBjMCAuLiBjNyAqLworCTMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsCQkJLyogYzggLi4gY2YgKi8KKwkzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LAkJCS8qIGQwIC4uIGQ3ICovCisJNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywJCQkvKiBkOCAuLiBkZiAqLworCTMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsCQkJLyogZTAgLi4gZTcgKi8KKwk0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LAkJCS8qIGU4IC4uIGVmICovCisJNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywJCQkvKiBmMCAuLiBmNyAqLworCTUsIDYsIDYsIDcsIDYsIDcsIDcsIDgsCQkJLyogZjggLi4gZmYgKi8KK307CisKKy8qCisgKiB4ZnNfaGlnaGJpdDMyOiBnZXQgaGlnaCBiaXQgc2V0IG91dCBvZiAzMi1iaXQgYXJndW1lbnQsIC0xIGlmIG5vbmUgc2V0LgorICovCitpbmxpbmUgaW50Cit4ZnNfaGlnaGJpdDMyKAorCV9fdWludDMyX3QJdikKK3sKKyNpZmRlZiBIQVZFX0FSQ0hfSElHSEJJVAorCXJldHVybiBoaWdoYml0MzIodik7CisjZWxzZQorCWludAkJaTsKKworCWlmICh2ICYgMHhmZmZmMDAwMCkKKwkJaWYgKHYgJiAweGZmMDAwMDAwKQorCQkJaSA9IDI0OworCQllbHNlCisJCQlpID0gMTY7CisJZWxzZSBpZiAodiAmIDB4MDAwMGZmZmYpCisJCWlmICh2ICYgMHgwMDAwZmYwMCkKKwkJCWkgPSA4OworCQllbHNlCisJCQlpID0gMDsKKwllbHNlCisJCXJldHVybiAtMTsKKwlyZXR1cm4gaSArIHhmc19oaWdoYml0Wyh2ID4+IGkpICYgMHhmZl07CisjZW5kaWYKK30KKworLyoKKyAqIHhmc19sb3diaXQ2NDogZ2V0IGxvdyBiaXQgc2V0IG91dCBvZiA2NC1iaXQgYXJndW1lbnQsIC0xIGlmIG5vbmUgc2V0LgorICovCitpbnQKK3hmc19sb3diaXQ2NCgKKwlfX3VpbnQ2NF90CXYpCit7CisJX191aW50MzJfdAl3ID0gKF9fdWludDMyX3QpdjsKKwlpbnQJCW4gPSAwOworCisJaWYgKHcpIHsJLyogbG93ZXIgYml0cyAqLworCQluID0gZmZzKHcpOworCX0gZWxzZSB7CS8qIHVwcGVyIGJpdHMgKi8KKwkJdyA9IChfX3VpbnQzMl90KSh2ID4+IDMyKTsKKwkJaWYgKHcgJiYgKG4gPSBmZnModykpKQorCQkJbiArPSAzMjsKKwl9CisJcmV0dXJuIG4gLSAxOworfQorCisvKgorICogeGZzX2hpZ2hiaXQ2NDogZ2V0IGhpZ2ggYml0IHNldCBvdXQgb2YgNjQtYml0IGFyZ3VtZW50LCAtMSBpZiBub25lIHNldC4KKyAqLworaW50Cit4ZnNfaGlnaGJpdDY0KAorCV9fdWludDY0X3QJdikKK3sKKwlfX3VpbnQzMl90CWggPSAoX191aW50MzJfdCkodiA+PiAzMik7CisKKwlpZiAoaCkKKwkJcmV0dXJuIHhmc19oaWdoYml0MzIoaCkgKyAzMjsKKwlyZXR1cm4geGZzX2hpZ2hiaXQzMigoX191aW50MzJfdCl2KTsKK30KKworCisvKgorICogQ291bnQgdGhlIG51bWJlciBvZiBiaXRzIHNldCBpbiB0aGUgYml0bWFwIHN0YXJ0aW5nIHdpdGggYml0CisgKiBzdGFydF9iaXQuICBTaXplIGlzIHRoZSBzaXplIG9mIHRoZSBiaXRtYXAgaW4gd29yZHMuCisgKgorICogRG8gdGhlIGNvdW50aW5nIGJ5IG1hcHBpbmcgYSBieXRlIHZhbHVlIHRvIHRoZSBudW1iZXIgb2Ygc2V0CisgKiBiaXRzIGZvciB0aGF0IHZhbHVlIHVzaW5nIHRoZSB4ZnNfY291bnRiaXQgYXJyYXksIGkuZS4KKyAqIHhmc19jb3VudGJpdFswXSA9PSAwLCB4ZnNfY291bnRiaXRbMV0gPT0gMSwgeGZzX2NvdW50Yml0WzJdID09IDEsCisgKiB4ZnNfY291bnRiaXRbM10gPT0gMiwgZXRjLgorICovCitpbnQKK3hmc19jb3VudF9iaXRzKHVpbnQgKm1hcCwgdWludCBzaXplLCB1aW50IHN0YXJ0X2JpdCkKK3sKKwlyZWdpc3RlciBpbnQJYml0czsKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyCSpieXRlcDsKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyCSplbmRfbWFwOworCWludAkJYnl0ZV9iaXQ7CisKKwliaXRzID0gMDsKKwllbmRfbWFwID0gKGNoYXIqKShtYXAgKyBzaXplKTsKKwlieXRlcCA9IChjaGFyKikobWFwICsgKHN0YXJ0X2JpdCAmIH4weDcpKTsKKwlieXRlX2JpdCA9IHN0YXJ0X2JpdCAmIDB4NzsKKworCS8qCisJICogSWYgdGhlIGNhbGxlciBmZWxsIG9mZiB0aGUgZW5kIG9mIHRoZSBtYXAsIHJldHVybiAwLgorCSAqLworCWlmIChieXRlcCA+PSBlbmRfbWFwKSB7CisJCXJldHVybiAoMCk7CisJfQorCisJLyoKKwkgKiBJZiBzdGFydF9iaXQgaXMgbm90IGJ5dGUgYWxpZ25lZCwgdGhlbiBwcm9jZXNzIHRoZQorCSAqIGZpcnN0IGJ5dGUgc2VwYXJhdGVseS4KKwkgKi8KKwlpZiAoYnl0ZV9iaXQgIT0gMCkgeworCQkvKgorCQkgKiBTaGlmdCBvZmYgdGhlIGJpdHMgd2UgZG9uJ3Qgd2FudCB0byBsb29rIGF0LAorCQkgKiBiZWZvcmUgaW5kZXhpbmcgaW50byB4ZnNfY291bnRiaXQuCisJCSAqLworCQliaXRzICs9IHhmc19jb3VudGJpdFsoKmJ5dGVwID4+IGJ5dGVfYml0KV07CisJCWJ5dGVwKys7CisJfQorCisJLyoKKwkgKiBDb3VudCB0aGUgYml0cyBpbiBlYWNoIGJ5dGUgdW50aWwgdGhlIGVuZCBvZiB0aGUgYml0bWFwLgorCSAqLworCXdoaWxlIChieXRlcCA8IGVuZF9tYXApIHsKKwkJYml0cyArPSB4ZnNfY291bnRiaXRbKmJ5dGVwXTsKKwkJYnl0ZXArKzsKKwl9CisKKwlyZXR1cm4gKGJpdHMpOworfQorCisvKgorICogQ291bnQgdGhlIG51bWJlciBvZiBjb250aWd1b3VzIGJpdHMgc2V0IGluIHRoZSBiaXRtYXAgc3RhcnRpbmcgd2l0aCBiaXQKKyAqIHN0YXJ0X2JpdC4gIFNpemUgaXMgdGhlIHNpemUgb2YgdGhlIGJpdG1hcCBpbiB3b3Jkcy4KKyAqLworaW50Cit4ZnNfY29udGlnX2JpdHModWludCAqbWFwLCB1aW50CXNpemUsIHVpbnQgc3RhcnRfYml0KQoreworCXVpbnQgKiBwID0gKCh1bnNpZ25lZCBpbnQgKikgbWFwKSArIChzdGFydF9iaXQgPj4gQklUX1RPX1dPUkRfU0hJRlQpOworCXVpbnQgcmVzdWx0ID0gMDsKKwl1aW50IHRtcDsKKworCXNpemUgPDw9IEJJVF9UT19XT1JEX1NISUZUOworCisJQVNTRVJUKHN0YXJ0X2JpdCA8IHNpemUpOworCXNpemUgLT0gc3RhcnRfYml0ICYgfihOQldPUkQgLSAxKTsKKwlzdGFydF9iaXQgJj0gKE5CV09SRCAtIDEpOworCWlmIChzdGFydF9iaXQpIHsKKwkJdG1wID0gKnArKzsKKwkJLyogc2V0IHRvIG9uZSBmaXJzdCBvZmZzZXQgYml0cyBwcmlvciB0byBzdGFydCAqLworCQl0bXAgfD0gKH4wVSA+PiAoTkJXT1JELXN0YXJ0X2JpdCkpOworCQlpZiAodG1wICE9IH4wVSkKKwkJCWdvdG8gZm91bmQ7CisJCXJlc3VsdCArPSBOQldPUkQ7CisJCXNpemUgLT0gTkJXT1JEOworCX0KKwl3aGlsZSAoc2l6ZSkgeworCQlpZiAoKHRtcCA9ICpwKyspICE9IH4wVSkKKwkJCWdvdG8gZm91bmQ7CisJCXJlc3VsdCArPSBOQldPUkQ7CisJCXNpemUgLT0gTkJXT1JEOworCX0KKwlyZXR1cm4gcmVzdWx0IC0gc3RhcnRfYml0OworZm91bmQ6CisJcmV0dXJuIHJlc3VsdCArIGZmeih0bXApIC0gc3RhcnRfYml0OworfQorCisvKgorICogVGhpcyB0YWtlcyB0aGUgYml0IG51bWJlciB0byBzdGFydCBsb29raW5nIGZyb20gYW5kCisgKiByZXR1cm5zIHRoZSBuZXh0IHNldCBiaXQgZnJvbSB0aGVyZS4gIEl0IHJldHVybnMgLTEKKyAqIGlmIHRoZXJlIGFyZSBubyBtb3JlIGJpdHMgc2V0IG9yIHRoZSBzdGFydCBiaXQgaXMKKyAqIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBiaXRtYXAuCisgKgorICogU2l6ZSBpcyB0aGUgbnVtYmVyIG9mIHdvcmRzLCBub3QgYnl0ZXMsIGluIHRoZSBiaXRtYXAuCisgKi8KK2ludCB4ZnNfbmV4dF9iaXQodWludCAqbWFwLCB1aW50IHNpemUsIHVpbnQgc3RhcnRfYml0KQoreworCXVpbnQgKiBwID0gKCh1bnNpZ25lZCBpbnQgKikgbWFwKSArIChzdGFydF9iaXQgPj4gQklUX1RPX1dPUkRfU0hJRlQpOworCXVpbnQgcmVzdWx0ID0gc3RhcnRfYml0ICYgfihOQldPUkQgLSAxKTsKKwl1aW50IHRtcDsKKworCXNpemUgPDw9IEJJVF9UT19XT1JEX1NISUZUOworCisJaWYgKHN0YXJ0X2JpdCA+PSBzaXplKQorCQlyZXR1cm4gLTE7CisJc2l6ZSAtPSByZXN1bHQ7CisJc3RhcnRfYml0ICY9IChOQldPUkQgLSAxKTsKKwlpZiAoc3RhcnRfYml0KSB7CisJCXRtcCA9ICpwKys7CisJCS8qIHNldCB0byB6ZXJvIGZpcnN0IG9mZnNldCBiaXRzIHByaW9yIHRvIHN0YXJ0ICovCisJCXRtcCAmPSAofjBVIDw8IHN0YXJ0X2JpdCk7CisJCWlmICh0bXAgIT0gMFUpCisJCQlnb3RvIGZvdW5kOworCQlyZXN1bHQgKz0gTkJXT1JEOworCQlzaXplIC09IE5CV09SRDsKKwl9CisJd2hpbGUgKHNpemUpIHsKKwkJaWYgKCh0bXAgPSAqcCsrKSAhPSAwVSkKKwkJCWdvdG8gZm91bmQ7CisJCXJlc3VsdCArPSBOQldPUkQ7CisJCXNpemUgLT0gTkJXT1JEOworCX0KKwlyZXR1cm4gLTE7Citmb3VuZDoKKwlyZXR1cm4gcmVzdWx0ICsgZmZzKHRtcCkgLSAxOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19iaXQuaCBiL2ZzL3hmcy94ZnNfYml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3ZjU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfYml0LmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0JJVF9IX18KKyNkZWZpbmUJX19YRlNfQklUX0hfXworCisvKgorICogWEZTIGJpdCBtYW5pcHVsYXRpb24gcm91dGluZXMuCisgKi8KKworLyoKKyAqIG1hc2tzIHdpdGggbiBoaWdoL2xvdyBiaXRzIHNldCwgMzItYml0IHZhbHVlcyAmIDY0LWJpdCB2YWx1ZXMKKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTUFTSzMySEkpCitfX3VpbnQzMl90IHhmc19tYXNrMzJoaShpbnQgbik7CisjZGVmaW5lCVhGU19NQVNLMzJISShuKQkJeGZzX21hc2szMmhpKG4pCisjZWxzZQorI2RlZmluZQlYRlNfTUFTSzMySEkobikJCSgoX191aW50MzJfdCktMSA8PCAoMzIgLSAobikpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19NQVNLNjRISSkKK19fdWludDY0X3QgeGZzX21hc2s2NGhpKGludCBuKTsKKyNkZWZpbmUJWEZTX01BU0s2NEhJKG4pCQl4ZnNfbWFzazY0aGkobikKKyNlbHNlCisjZGVmaW5lCVhGU19NQVNLNjRISShuKQkJKChfX3VpbnQ2NF90KS0xIDw8ICg2NCAtIChuKSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX01BU0szMkxPKQorX191aW50MzJfdCB4ZnNfbWFzazMybG8oaW50IG4pOworI2RlZmluZQlYRlNfTUFTSzMyTE8obikJCXhmc19tYXNrMzJsbyhuKQorI2Vsc2UKKyNkZWZpbmUJWEZTX01BU0szMkxPKG4pCQkoKChfX3VpbnQzMl90KTEgPDwgKG4pKSAtIDEpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX01BU0s2NExPKQorX191aW50NjRfdCB4ZnNfbWFzazY0bG8oaW50IG4pOworI2RlZmluZQlYRlNfTUFTSzY0TE8obikJCXhmc19tYXNrNjRsbyhuKQorI2Vsc2UKKyNkZWZpbmUJWEZTX01BU0s2NExPKG4pCQkoKChfX3VpbnQ2NF90KTEgPDwgKG4pKSAtIDEpCisjZW5kaWYKKworLyogR2V0IGhpZ2ggYml0IHNldCBvdXQgb2YgMzItYml0IGFyZ3VtZW50LCAtMSBpZiBub25lIHNldCAqLworZXh0ZXJuIGludCB4ZnNfaGlnaGJpdDMyKF9fdWludDMyX3Qgdik7CisKKy8qIEdldCBsb3cgYml0IHNldCBvdXQgb2YgNjQtYml0IGFyZ3VtZW50LCAtMSBpZiBub25lIHNldCAqLworZXh0ZXJuIGludCB4ZnNfbG93Yml0NjQoX191aW50NjRfdCB2KTsKKworLyogR2V0IGhpZ2ggYml0IHNldCBvdXQgb2YgNjQtYml0IGFyZ3VtZW50LCAtMSBpZiBub25lIHNldCAqLworZXh0ZXJuIGludCB4ZnNfaGlnaGJpdDY0KF9fdWludDY0X3QpOworCisvKiBDb3VudCBzZXQgYml0cyBpbiBtYXAgc3RhcnRpbmcgd2l0aCBzdGFydF9iaXQgKi8KK2V4dGVybiBpbnQgeGZzX2NvdW50X2JpdHModWludCAqbWFwLCB1aW50IHNpemUsIHVpbnQgc3RhcnRfYml0KTsKKworLyogQ291bnQgY29udGludW91cyBvbmUgYml0cyBpbiBtYXAgc3RhcnRpbmcgd2l0aCBzdGFydF9iaXQgKi8KK2V4dGVybiBpbnQgeGZzX2NvbnRpZ19iaXRzKHVpbnQgKm1hcCwgdWludCBzaXplLCB1aW50IHN0YXJ0X2JpdCk7CisKKy8qIEZpbmQgbmV4dCBzZXQgYml0IGluIG1hcCAqLworZXh0ZXJuIGludCB4ZnNfbmV4dF9iaXQodWludCAqbWFwLCB1aW50IHNpemUsIHVpbnQgc3RhcnRfYml0KTsKKworI2VuZGlmCS8qIF9fWEZTX0JJVF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcC5jIGIvZnMveGZzL3hmc19ibWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUzMTYyNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfYm1hcC5jCkBAIC0wLDAgKzEsNjI0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19pdGFibGUuaCIKKyNpbmNsdWRlICJ4ZnNfZXh0ZnJlZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgorI2luY2x1ZGUgInhmc19kaXJfbGVhZi5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKyNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnNfc3BhY2UuaCIKKyNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKKworCisjaWZkZWYgREVCVUcKK1NUQVRJQyB2b2lkCit4ZnNfYm1hcF9jaGVja19sZWFmX2V4dGVudHMoeGZzX2J0cmVlX2N1cl90ICpjdXIsIHhmc19pbm9kZV90ICppcCwgaW50IHdoaWNoZm9yayk7CisjZW5kaWYKKwora21lbV96b25lX3QJCSp4ZnNfYm1hcF9mcmVlX2l0ZW1fem9uZTsKKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIGludGVybmFsIGJtYXAgcm91dGluZXMuCisgKi8KKworCisvKgorICogQ2FsbGVkIGZyb20geGZzX2JtYXBfYWRkX2F0dHJmb3JrIHRvIGhhbmRsZSBleHRlbnRzIGZvcm1hdCBmaWxlcy4KKyAqLworU1RBVElDIGludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2FkZF9hdHRyZm9ya19leHRlbnRzKAorCXhmc190cmFuc190CQkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub2RlX3QJCSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2ZzYmxvY2tfdAkJKmZpcnN0YmxvY2ssCS8qIGZpcnN0IGJsb2NrIGFsbG9jYXRlZCAqLworCXhmc19ibWFwX2ZyZWVfdAkJKmZsaXN0LAkJLyogYmxvY2tzIHRvIGZyZWUgYXQgY29tbWl0ICovCisJaW50CQkJKmZsYWdzKTsJLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLworCisvKgorICogQ2FsbGVkIGZyb20geGZzX2JtYXBfYWRkX2F0dHJmb3JrIHRvIGhhbmRsZSBsb2NhbCBmb3JtYXQgZmlsZXMuCisgKi8KK1NUQVRJQyBpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9hZGRfYXR0cmZvcmtfbG9jYWwoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZnNibG9ja190CQkqZmlyc3RibG9jaywJLyogZmlyc3QgYmxvY2sgYWxsb2NhdGVkICovCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCQkvKiBibG9ja3MgdG8gZnJlZSBhdCBjb21taXQgKi8KKwlpbnQJCQkqZmxhZ3MpOwkvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCisKKy8qCisgKiBDYWxsZWQgYnkgeGZzX2JtYXBpIHRvIHVwZGF0ZSBleHRlbnQgbGlzdCBzdHJ1Y3R1cmUgYW5kIHRoZSBidHJlZQorICogYWZ0ZXIgYWxsb2NhdGluZyBzcGFjZSAob3IgZG9pbmcgYSBkZWxheWVkIGFsbG9jYXRpb24pLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9hZGRfZXh0ZW50KAorCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CQlpZHgsCS8qIGV4dGVudCBudW1iZXIgdG8gdXBkYXRlL2luc2VydCAqLworCXhmc19idHJlZV9jdXJfdAkJKipjdXJwLAkvKiBpZiAqY3VycCBpcyBudWxsLCBub3QgYSBidHJlZSAqLworCXhmc19ibWJ0X2lyZWNfdAkJKm5ldywJLyogbmV3IGRhdGEgdG8gcHV0IGluIGV4dGVudCBsaXN0ICovCisJeGZzX2ZzYmxvY2tfdAkJKmZpcnN0LAkvKiBwb2ludGVyIHRvIGZpcnN0YmxvY2sgdmFyaWFibGUgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJLyogbGlzdCBvZiBleHRlbnRzIHRvIGJlIGZyZWVkICovCisJaW50CQkJKmxvZ2ZsYWdzcCwgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLworCWludAkJCXdoaWNoZm9yaywgLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKwlpbnQJCQlyc3ZkKTsJLyogT0sgdG8gYWxsb2NhdGUgcmVzZXJ2ZWQgYmxvY2tzICovCisKKy8qCisgKiBDYWxsZWQgYnkgeGZzX2JtYXBfYWRkX2V4dGVudCB0byBoYW5kbGUgY2FzZXMgY29udmVydGluZyBhIGRlbGF5ZWQKKyAqIGFsbG9jYXRpb24gdG8gYSByZWFsIGFsbG9jYXRpb24uCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2FkZF9leHRlbnRfZGVsYXlfcmVhbCgKKwl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19leHRudW1fdAkJaWR4LAkvKiBleHRlbnQgbnVtYmVyIHRvIHVwZGF0ZS9pbnNlcnQgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJCSoqY3VycCwJLyogaWYgKmN1cnAgaXMgbnVsbCwgbm90IGEgYnRyZWUgKi8KKwl4ZnNfYm1idF9pcmVjX3QJCSpuZXcsCS8qIG5ldyBkYXRhIHRvIHB1dCBpbiBleHRlbnQgbGlzdCAqLworCXhmc19maWxibGtzX3QJCSpkbmV3LAkvKiBuZXcgZGVsYXllZC1hbGxvYyBpbmRpcmVjdCBibG9ja3MgKi8KKwl4ZnNfZnNibG9ja190CQkqZmlyc3QsCS8qIHBvaW50ZXIgdG8gZmlyc3RibG9jayB2YXJpYWJsZSAqLworCXhmc19ibWFwX2ZyZWVfdAkJKmZsaXN0LAkvKiBsaXN0IG9mIGV4dGVudHMgdG8gYmUgZnJlZWQgKi8KKwlpbnQJCQkqbG9nZmxhZ3NwLCAvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCisJaW50CQkJcnN2ZCk7CS8qIE9LIHRvIGFsbG9jYXRlIHJlc2VydmVkIGJsb2NrcyAqLworCisvKgorICogQ2FsbGVkIGJ5IHhmc19ibWFwX2FkZF9leHRlbnQgdG8gaGFuZGxlIGNhc2VzIGNvbnZlcnRpbmcgYSBob2xlCisgKiB0byBhIGRlbGF5ZWQgYWxsb2NhdGlvbi4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfYWRkX2V4dGVudF9ob2xlX2RlbGF5KAorCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CQlpZHgsCS8qIGV4dGVudCBudW1iZXIgdG8gdXBkYXRlL2luc2VydCAqLworCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogaWYgbnVsbCwgbm90IGEgYnRyZWUgKi8KKwl4ZnNfYm1idF9pcmVjX3QJCSpuZXcsCS8qIG5ldyBkYXRhIHRvIHB1dCBpbiBleHRlbnQgbGlzdCAqLworCWludAkJCSpsb2dmbGFnc3AsLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLworCWludAkJCXJzdmQpOwkvKiBPSyB0byBhbGxvY2F0ZSByZXNlcnZlZCBibG9ja3MgKi8KKworLyoKKyAqIENhbGxlZCBieSB4ZnNfYm1hcF9hZGRfZXh0ZW50IHRvIGhhbmRsZSBjYXNlcyBjb252ZXJ0aW5nIGEgaG9sZQorICogdG8gYSByZWFsIGFsbG9jYXRpb24uCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9yZWFsKAorCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CQlpZHgsCS8qIGV4dGVudCBudW1iZXIgdG8gdXBkYXRlL2luc2VydCAqLworCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogaWYgbnVsbCwgbm90IGEgYnRyZWUgKi8KKwl4ZnNfYm1idF9pcmVjX3QJCSpuZXcsCS8qIG5ldyBkYXRhIHRvIHB1dCBpbiBleHRlbnQgbGlzdCAqLworCWludAkJCSpsb2dmbGFnc3AsIC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KKwlpbnQJCQl3aGljaGZvcmspOyAvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCisvKgorICogQ2FsbGVkIGJ5IHhmc19ibWFwX2FkZF9leHRlbnQgdG8gaGFuZGxlIGNhc2VzIGNvbnZlcnRpbmcgYW4gdW53cml0dGVuCisgKiBhbGxvY2F0aW9uIHRvIGEgcmVhbCBhbGxvY2F0aW9uIG9yIHZpY2UgdmVyc2EuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2FkZF9leHRlbnRfdW53cml0dGVuX3JlYWwoCisJeGZzX2lub2RlX3QJCSppcCwJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJCWlkeCwJLyogZXh0ZW50IG51bWJlciB0byB1cGRhdGUvaW5zZXJ0ICovCisJeGZzX2J0cmVlX2N1cl90CQkqKmN1cnAsCS8qIGlmICpjdXJwIGlzIG51bGwsIG5vdCBhIGJ0cmVlICovCisJeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBwdXQgaW4gZXh0ZW50IGxpc3QgKi8KKwlpbnQJCQkqbG9nZmxhZ3NwKTsgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLworCisvKgorICogeGZzX2JtYXBfYWxsb2MgaXMgY2FsbGVkIGJ5IHhmc19ibWFwaSB0byBhbGxvY2F0ZSBhbiBleHRlbnQgZm9yIGEgZmlsZS4KKyAqIEl0IGZpZ3VyZXMgb3V0IHdoZXJlIHRvIGFzayB0aGUgdW5kZXJseWluZyBhbGxvY2F0b3IgdG8gcHV0IHRoZSBuZXcgZXh0ZW50LgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9hbGxvYygKKwl4ZnNfYm1hbGxvY2FfdAkJKmFwKTsJLyogYm1hcCBhbGxvYyBhcmd1bWVudCBzdHJ1Y3QgKi8KKworLyoKKyAqIFRyYW5zZm9ybSBhIGJ0cmVlIGZvcm1hdCBmaWxlIHdpdGggb25seSBvbmUgbGVhZiBub2RlLCB3aGVyZSB0aGUKKyAqIGV4dGVudHMgbGlzdCB3aWxsIGZpdCBpbiB0aGUgaW5vZGUsIGludG8gYW4gZXh0ZW50cyBmb3JtYXQgZmlsZS4KKyAqIFNpbmNlIHRoZSBleHRlbnQgbGlzdCBpcyBhbHJlYWR5IGluLWNvcmUsIGFsbCB3ZSBoYXZlIHRvIGRvIGlzCisgKiBnaXZlIHVwIHRoZSBzcGFjZSBmb3IgdGhlIGJ0cmVlIHJvb3QgYW5kIHBpdGNoIHRoZSBsZWFmIGJsb2NrLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9idHJlZV90b19leHRlbnRzKAorCXhmc190cmFuc190CQkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJKmxvZ2ZsYWdzcCwgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLworCWludAkJCXdoaWNoZm9yayk7IC8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisKKyNpZmRlZiBERUJVRworLyoKKyAqIENoZWNrIHRoYXQgdGhlIGV4dGVudHMgbGlzdCBmb3IgdGhlIGlub2RlIGlwIGlzIGluIHRoZSByaWdodCBvcmRlci4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWFwX2NoZWNrX2V4dGVudHMoCisJeGZzX2lub2RlX3QJCSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJaW50CQkJd2hpY2hmb3JrKTsJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKyNlbmRpZgorCisvKgorICogQ2FsbGVkIGJ5IHhmc19ibWFwaSB0byB1cGRhdGUgZXh0ZW50IGxpc3Qgc3RydWN0dXJlIGFuZCB0aGUgYnRyZWUKKyAqIGFmdGVyIHJlbW92aW5nIHNwYWNlIChvciB1bmRvaW5nIGEgZGVsYXllZCBhbGxvY2F0aW9uKS4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfZGVsX2V4dGVudCgKKwl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc190cmFuc190CQkqdHAsCS8qIGN1cnJlbnQgdHJhbnMgcG9pbnRlciAqLworCXhmc19leHRudW1fdAkJaWR4LAkvKiBleHRlbnQgbnVtYmVyIHRvIHVwZGF0ZS9pbnNlcnQgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJLyogbGlzdCBvZiBleHRlbnRzIHRvIGJlIGZyZWVkICovCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBpZiBudWxsLCBub3QgYSBidHJlZSAqLworCXhmc19ibWJ0X2lyZWNfdAkJKm5ldywJLyogbmV3IGRhdGEgdG8gcHV0IGluIGV4dGVudCBsaXN0ICovCisJaW50CQkJKmxvZ2ZsYWdzcCwvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCisJaW50CQkJd2hpY2hmb3JrLCAvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCWludAkJCXJzdmQpOwkgLyogT0sgdG8gYWxsb2NhdGUgcmVzZXJ2ZWQgYmxvY2tzICovCisKKy8qCisgKiBSZW1vdmUgdGhlIGVudHJ5ICJmcmVlIiBmcm9tIHRoZSBmcmVlIGl0ZW0gbGlzdC4gIFByZXYgcG9pbnRzIHRvIHRoZQorICogcHJldmlvdXMgZW50cnksIHVubGVzcyAiZnJlZSIgaXMgdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1hcF9kZWxfZnJlZSgKKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJLyogZnJlZSBpdGVtIGxpc3QgaGVhZGVyICovCisJeGZzX2JtYXBfZnJlZV9pdGVtX3QJKnByZXYsCS8qIHByZXZpb3VzIGl0ZW0gb24gbGlzdCwgaWYgYW55ICovCisJeGZzX2JtYXBfZnJlZV9pdGVtX3QJKmZyZWUpOwkvKiBsaXN0IGl0ZW0gdG8gYmUgZnJlZWQgKi8KKworLyoKKyAqIFJlbW92ZSBjb3VudCBlbnRyaWVzIGZyb20gdGhlIGV4dGVudHMgYXJyYXkgZm9yIGlub2RlICJpcCIsIHN0YXJ0aW5nCisgKiBhdCBpbmRleCAiaWR4Ii4gIENvcGllcyB0aGUgcmVtYWluaW5nIGl0ZW1zIGRvd24gb3ZlciB0aGUgZGVsZXRlZCBvbmVzLAorICogYW5kIGdpdmVzIGJhY2sgdGhlIGV4Y2VzcyBtZW1vcnkuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1hcF9kZWxldGVfZXhsaXN0KAorCXhmc19pbm9kZV90CSppcCwJCS8qIGluY29kZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CWlkeCwJCS8qIHN0YXJ0aW5nIGRlbGV0ZSBpbmRleCAqLworCXhmc19leHRudW1fdAljb3VudCwJCS8qIGNvdW50IG9mIGl0ZW1zIHRvIGRlbGV0ZSAqLworCWludAkJd2hpY2hmb3JrKTsJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKworLyoKKyAqIENvbnZlcnQgYW4gZXh0ZW50cy1mb3JtYXQgZmlsZSBpbnRvIGEgYnRyZWUtZm9ybWF0IGZpbGUuCisgKiBUaGUgbmV3IGZpbGUgd2lsbCBoYXZlIGEgcm9vdCBibG9jayAoaW4gdGhlIGlub2RlKSBhbmQgYSBzaW5nbGUgY2hpbGQgYmxvY2suCisgKi8KK1NUQVRJQyBpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9leHRlbnRzX3RvX2J0cmVlKAorCXhmc190cmFuc190CQkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub2RlX3QJCSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2ZzYmxvY2tfdAkJKmZpcnN0YmxvY2ssCS8qIGZpcnN0LWJsb2NrLWFsbG9jYXRlZCAqLworCXhmc19ibWFwX2ZyZWVfdAkJKmZsaXN0LAkJLyogYmxvY2tzIGZyZWVkIGluIHhhY3Rpb24gKi8KKwl4ZnNfYnRyZWVfY3VyX3QJCSoqY3VycCwJCS8qIGN1cnNvciByZXR1cm5lZCB0byBjYWxsZXIgKi8KKwlpbnQJCQl3YXNkZWwsCQkvKiBjb252ZXJ0aW5nIGEgZGVsYXllZCBhbGxvYyAqLworCWludAkJCSpsb2dmbGFnc3AsCS8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KKwlpbnQJCQl3aGljaGZvcmspOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCisvKgorICogSW5zZXJ0IG5ldyBpdGVtKHMpIGluIHRoZSBleHRlbnQgbGlzdCBmb3IgaW5vZGUgImlwIi4KKyAqIENvdW50IG5ldyBpdGVtcyBhcmUgaW5zZXJ0ZWQgYXQgb2Zmc2V0IGlkeC4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWFwX2luc2VydF9leGxpc3QoCisJeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJaWR4LAkJLyogc3RhcnRpbmcgaW5kZXggb2YgbmV3IGl0ZW1zICovCisJeGZzX2V4dG51bV90CWNvdW50LAkJLyogbnVtYmVyIG9mIGluc2VydGVkIGl0ZW1zICovCisJeGZzX2JtYnRfaXJlY190CSpuZXcsCQkvKiBpdGVtcyB0byBpbnNlcnQgKi8KKwlpbnQJCXdoaWNoZm9yayk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisKKy8qCisgKiBDb252ZXJ0IGEgbG9jYWwgZmlsZSB0byBhbiBleHRlbnRzIGZpbGUuCisgKiBUaGlzIGNvZGUgaXMgc29ydCBvZiBib2d1cywgc2luY2UgdGhlIGZpbGUgZGF0YSBuZWVkcyB0byBnZXQKKyAqIGxvZ2dlZCBzbyBpdCB3b24ndCBiZSBsb3N0LiAgVGhlIGJtYXAtbGV2ZWwgbWFuaXB1bGF0aW9ucyBhcmUgb2ssIHRob3VnaC4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfbG9jYWxfdG9fZXh0ZW50cygKKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZnNibG9ja190CSpmaXJzdGJsb2NrLAkvKiBmaXJzdCBibG9jayBhbGxvY2F0ZWQgaW4geGFjdGlvbiAqLworCXhmc19leHRsZW5fdAl0b3RhbCwJCS8qIHRvdGFsIGJsb2NrcyBuZWVkZWQgYnkgdHJhbnNhY3Rpb24gKi8KKwlpbnQJCSpsb2dmbGFnc3AsCS8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KKwlpbnQJCXdoaWNoZm9yayk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisKKy8qCisgKiBTZWFyY2ggdGhlIGV4dGVudHMgbGlzdCBmb3IgdGhlIGlub2RlLCBmb3IgdGhlIGV4dGVudCBjb250YWluaW5nIGJuby4KKyAqIElmIGJubyBsaWVzIGluIGEgaG9sZSwgcG9pbnQgdG8gdGhlIG5leHQgZW50cnkuICBJZiBibm8gbGllcyBwYXN0IGVvZiwKKyAqICplb2ZwIHdpbGwgYmUgc2V0LCBhbmQgKnByZXZwIHdpbGwgY29udGFpbiB0aGUgbGFzdCBlbnRyeSAobnVsbCBpZiBub25lKS4KKyAqIEVsc2UsICpsYXN0eHAgd2lsbCBiZSBzZXQgdG8gdGhlIGluZGV4IG9mIHRoZSBmb3VuZAorICogZW50cnk7ICpnb3RwIHdpbGwgY29udGFpbiB0aGUgZW50cnkuCisgKi8KK1NUQVRJQyB4ZnNfYm1idF9yZWNfdCAqCQkJLyogcG9pbnRlciB0byBmb3VuZCBleHRlbnQgZW50cnkgKi8KK3hmc19ibWFwX3NlYXJjaF9leHRlbnRzKAorCXhmc19pbm9kZV90CSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2ZpbGVvZmZfdAlibm8sCQkvKiBibG9jayBudW1iZXIgc2VhcmNoZWQgZm9yICovCisJaW50CQl3aGljaGZvcmssCS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisJaW50CQkqZW9mcCwJCS8qIG91dDogZW5kIG9mIGZpbGUgZm91bmQgKi8KKwl4ZnNfZXh0bnVtX3QJKmxhc3R4cCwJLyogb3V0OiBsYXN0IGV4dGVudCBpbmRleCAqLworCXhmc19ibWJ0X2lyZWNfdAkqZ290cCwJCS8qIG91dDogZXh0ZW50IGVudHJ5IGZvdW5kICovCisJeGZzX2JtYnRfaXJlY190CSpwcmV2cCk7CS8qIG91dDogcHJldmlvdXMgZXh0ZW50IGVudHJ5IGZvdW5kICovCisKKyNpZmRlZiBYRlNfQk1BUF9UUkFDRQorLyoKKyAqIEFkZCBhIGJtYXAgdHJhY2UgYnVmZmVyIGVudHJ5LiAgQmFzZSByb3V0aW5lIGZvciB0aGUgb3RoZXJzLgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYXBfdHJhY2VfYWRkZW50cnkoCisJaW50CQlvcGNvZGUsCQkvKiBvcGVyYXRpb24gKi8KKwljaGFyCQkqZm5hbWUsCQkvKiBmdW5jdGlvbiBuYW1lICovCisJY2hhcgkJKmRlc2MsCQkvKiBvcGVyYXRpb24gZGVzY3JpcHRpb24gKi8KKwl4ZnNfaW5vZGVfdAkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19leHRudW1fdAlpZHgsCQkvKiBpbmRleCBvZiBlbnRyeShpZXMpICovCisJeGZzX2V4dG51bV90CWNudCwJCS8qIGNvdW50IG9mIGVudHJpZXMsIDEgb3IgMiAqLworCXhmc19ibWJ0X3JlY190CSpyMSwJCS8qIGZpcnN0IHJlY29yZCAqLworCXhmc19ibWJ0X3JlY190CSpyMiwJCS8qIHNlY29uZCByZWNvcmQgb3IgbnVsbCAqLworCWludAkJd2hpY2hmb3JrKTsJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKworLyoKKyAqIEFkZCBibWFwIHRyYWNlIGVudHJ5IHByaW9yIHRvIGEgY2FsbCB0byB4ZnNfYm1hcF9kZWxldGVfZXhsaXN0LgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYXBfdHJhY2VfZGVsZXRlKAorCWNoYXIJCSpmbmFtZSwJCS8qIGZ1bmN0aW9uIG5hbWUgKi8KKwljaGFyCQkqZGVzYywJCS8qIG9wZXJhdGlvbiBkZXNjcmlwdGlvbiAqLworCXhmc19pbm9kZV90CSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CWlkeCwJCS8qIGluZGV4IG9mIGVudHJ5KGVudHJpZXMpIGRlbGV0ZWQgKi8KKwl4ZnNfZXh0bnVtX3QJY250LAkJLyogY291bnQgb2YgZW50cmllcyBkZWxldGVkLCAxIG9yIDIgKi8KKwlpbnQJCXdoaWNoZm9yayk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisKKy8qCisgKiBBZGQgYm1hcCB0cmFjZSBlbnRyeSBwcmlvciB0byBhIGNhbGwgdG8geGZzX2JtYXBfaW5zZXJ0X2V4bGlzdCwgb3IKKyAqIHJlYWRpbmcgaW4gdGhlIGV4dGVudHMgbGlzdCBmcm9tIHRoZSBkaXNrIChpbiB0aGUgYnRyZWUpLgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYXBfdHJhY2VfaW5zZXJ0KAorCWNoYXIJCSpmbmFtZSwJCS8qIGZ1bmN0aW9uIG5hbWUgKi8KKwljaGFyCQkqZGVzYywJCS8qIG9wZXJhdGlvbiBkZXNjcmlwdGlvbiAqLworCXhmc19pbm9kZV90CSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CWlkeCwJCS8qIGluZGV4IG9mIGVudHJ5KGVudHJpZXMpIGluc2VydGVkICovCisJeGZzX2V4dG51bV90CWNudCwJCS8qIGNvdW50IG9mIGVudHJpZXMgaW5zZXJ0ZWQsIDEgb3IgMiAqLworCXhmc19ibWJ0X2lyZWNfdAkqcjEsCQkvKiBpbnNlcnRlZCByZWNvcmQgMSAqLworCXhmc19ibWJ0X2lyZWNfdAkqcjIsCQkvKiBpbnNlcnRlZCByZWNvcmQgMiBvciBudWxsICovCisJaW50CQl3aGljaGZvcmspOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCisvKgorICogQWRkIGJtYXAgdHJhY2UgZW50cnkgYWZ0ZXIgdXBkYXRpbmcgYW4gZXh0ZW50IGxpc3QgZW50cnkgaW4gcGxhY2UuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZSgKKwljaGFyCQkqZm5hbWUsCQkvKiBmdW5jdGlvbiBuYW1lICovCisJY2hhcgkJKmRlc2MsCQkvKiBvcGVyYXRpb24gZGVzY3JpcHRpb24gKi8KKwl4ZnNfaW5vZGVfdAkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19leHRudW1fdAlpZHgsCQkvKiBpbmRleCBvZiBlbnRyeSB1cGRhdGVkICovCisJaW50CQl3aGljaGZvcmspOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCisvKgorICogQWRkIGJtYXAgdHJhY2UgZW50cnkgcHJpb3IgdG8gdXBkYXRpbmcgYW4gZXh0ZW50IGxpc3QgZW50cnkgaW4gcGxhY2UuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKAorCWNoYXIJCSpmbmFtZSwJCS8qIGZ1bmN0aW9uIG5hbWUgKi8KKwljaGFyCQkqZGVzYywJCS8qIG9wZXJhdGlvbiBkZXNjcmlwdGlvbiAqLworCXhmc19pbm9kZV90CSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CWlkeCwJCS8qIGluZGV4IG9mIGVudHJ5IHRvIGJlIHVwZGF0ZWQgKi8KKwlpbnQJCXdoaWNoZm9yayk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisKKyNlbHNlCisjZGVmaW5lCXhmc19ibWFwX3RyYWNlX2RlbGV0ZShmLGQsaXAsaSxjLHcpCisjZGVmaW5lCXhmc19ibWFwX3RyYWNlX2luc2VydChmLGQsaXAsaSxjLHIxLHIyLHcpCisjZGVmaW5lCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGYsZCxpcCxpLHcpCisjZGVmaW5lCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZixkLGlwLGksdykKKyNlbmRpZgkvKiBYRlNfQk1BUF9UUkFDRSAqLworCisvKgorICogQ29tcHV0ZSB0aGUgd29yc3QtY2FzZSBudW1iZXIgb2YgaW5kaXJlY3QgYmxvY2tzIHRoYXQgd2lsbCBiZSB1c2VkCisgKiBmb3IgaXAncyBkZWxheWVkIGV4dGVudCBvZiBsZW5ndGggImxlbiIuCisgKi8KK1NUQVRJQyB4ZnNfZmlsYmxrc190Cit4ZnNfYm1hcF93b3JzdF9pbmRsZW4oCisJeGZzX2lub2RlX3QJCSppcCwJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZmlsYmxrc190CQlsZW4pOwkvKiBkZWxheWVkIGV4dGVudCBsZW5ndGggKi8KKworI2lmZGVmIERFQlVHCisvKgorICogUGVyZm9ybSB2YXJpb3VzIHZhbGlkYXRpb24gY2hlY2tzIG9uIHRoZSB2YWx1ZXMgYmVpbmcgcmV0dXJuZWQKKyAqIGZyb20geGZzX2JtYXBpKCkuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1hcF92YWxpZGF0ZV9yZXQoCisJeGZzX2ZpbGVvZmZfdAkJYm5vLAorCXhmc19maWxibGtzX3QJCWxlbiwKKwlpbnQJCQlmbGFncywKKwl4ZnNfYm1idF9pcmVjX3QJCSptdmFsLAorCWludAkJCW5tYXAsCisJaW50CQkJcmV0X25tYXApOworI2Vsc2UKKyNkZWZpbmUJeGZzX2JtYXBfdmFsaWRhdGVfcmV0KGJubyxsZW4sZmxhZ3MsbXZhbCxvbm1hcCxubWFwKQorI2VuZGlmIC8qIERFQlVHICovCisKKyNpZiBkZWZpbmVkKFhGU19SV19UUkFDRSkKK1NUQVRJQyB2b2lkCit4ZnNfYnVubWFwX3RyYWNlKAorCXhmc19pbm9kZV90CQkqaXAsCisJeGZzX2ZpbGVvZmZfdAkJYm5vLAorCXhmc19maWxibGtzX3QJCWxlbiwKKwlpbnQJCQlmbGFncywKKwlpbnN0X3QJCQkqcmEpOworI2Vsc2UKKyNkZWZpbmUJeGZzX2J1bm1hcF90cmFjZShpcCwgYm5vLCBsZW4sIGZsYWdzLCByYSkKKyNlbmRpZgkvKiBYRlNfUldfVFJBQ0UgKi8KKworU1RBVElDIGludAoreGZzX2JtYXBfY291bnRfdHJlZSgKKwl4ZnNfbW91bnRfdCAgICAgKm1wLAorCXhmc190cmFuc190ICAgICAqdHAsCisJeGZzX2ZzYmxvY2tfdCAgIGJsb2Nrbm8sCisJaW50ICAgICAgICAgICAgIGxldmVsaW4sCisJaW50CQkqY291bnQpOworCitTVEFUSUMgaW50Cit4ZnNfYm1hcF9jb3VudF9sZWF2ZXMoCisJeGZzX2JtYnRfcmVjX3QJCSpmcnAsCisJaW50CQkJbnVtcmVjcywKKwlpbnQJCQkqY291bnQpOworCisvKgorICogQm1hcCBpbnRlcm5hbCByb3V0aW5lcy4KKyAqLworCisvKgorICogQ2FsbGVkIGZyb20geGZzX2JtYXBfYWRkX2F0dHJmb3JrIHRvIGhhbmRsZSBidHJlZSBmb3JtYXQgZmlsZXMuCisgKi8KK1NUQVRJQyBpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9hZGRfYXR0cmZvcmtfYnRyZWUoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZnNibG9ja190CQkqZmlyc3RibG9jaywJLyogZmlyc3QgYmxvY2sgYWxsb2NhdGVkICovCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCQkvKiBibG9ja3MgdG8gZnJlZSBhdCBjb21taXQgKi8KKwlpbnQJCQkqZmxhZ3MpCQkvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCit7CisJeGZzX2J0cmVlX2N1cl90CQkqY3VyOwkJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0ICovCisJaW50CQkJc3RhdDsJCS8qIG5ld3Jvb3Qgc3RhdHVzICovCisKKwltcCA9IGlwLT5pX21vdW50OworCWlmIChpcC0+aV9kZi5pZl9icm9vdF9ieXRlcyA8PSBYRlNfSUZPUktfRFNJWkUoaXApKQorCQkqZmxhZ3MgfD0gWEZTX0lMT0dfREJST09UOworCWVsc2UgeworCQljdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IobXAsIHRwLCBOVUxMLCAwLCBYRlNfQlROVU1fQk1BUCwgaXAsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJY3VyLT5iY19wcml2YXRlLmIuZmxpc3QgPSBmbGlzdDsKKwkJY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jayA9ICpmaXJzdGJsb2NrOworCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2dlKGN1ciwgMCwgMCwgMCwgJnN0YXQpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlBU1NFUlQoc3RhdCA9PSAxKTsJLyogbXVzdCBiZSBhdCBsZWFzdCBvbmUgZW50cnkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19ibWJ0X25ld3Jvb3QoY3VyLCBmbGFncywgJnN0YXQpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlpZiAoc3RhdCA9PSAwKSB7CisJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRU5PU1BDKTsKKwkJfQorCQkqZmlyc3RibG9jayA9IGN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2s7CisJCWN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZCA9IDA7CisJCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCX0KKwlyZXR1cm4gMDsKK2Vycm9yMDoKKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjdXIsIFhGU19CVFJFRV9FUlJPUik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogQ2FsbGVkIGZyb20geGZzX2JtYXBfYWRkX2F0dHJmb3JrIHRvIGhhbmRsZSBleHRlbnRzIGZvcm1hdCBmaWxlcy4KKyAqLworU1RBVElDIGludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2FkZF9hdHRyZm9ya19leHRlbnRzKAorCXhmc190cmFuc190CQkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub2RlX3QJCSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2ZzYmxvY2tfdAkJKmZpcnN0YmxvY2ssCS8qIGZpcnN0IGJsb2NrIGFsbG9jYXRlZCAqLworCXhmc19ibWFwX2ZyZWVfdAkJKmZsaXN0LAkJLyogYmxvY2tzIHRvIGZyZWUgYXQgY29tbWl0ICovCisJaW50CQkJKmZsYWdzKQkJLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLworeworCXhmc19idHJlZV9jdXJfdAkJKmN1cjsJCS8qIGJtYXAgYnRyZWUgY3Vyc29yICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKworCWlmIChpcC0+aV9kLmRpX25leHRlbnRzICogc2l6ZW9mKHhmc19ibWJ0X3JlY190KSA8PSBYRlNfSUZPUktfRFNJWkUoaXApKQorCQlyZXR1cm4gMDsKKwljdXIgPSBOVUxMOworCWVycm9yID0geGZzX2JtYXBfZXh0ZW50c190b19idHJlZSh0cCwgaXAsIGZpcnN0YmxvY2ssIGZsaXN0LCAmY3VyLCAwLAorCQlmbGFncywgWEZTX0RBVEFfRk9SSyk7CisJaWYgKGN1cikgeworCQljdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQgPSAwOworCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjdXIsCisJCQllcnJvciA/IFhGU19CVFJFRV9FUlJPUiA6IFhGU19CVFJFRV9OT0VSUk9SKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogQ2FsbGVkIGZyb20geGZzX2JtYXBfYWRkX2F0dHJmb3JrIHRvIGhhbmRsZSBsb2NhbCBmb3JtYXQgZmlsZXMuCisgKi8KK1NUQVRJQyBpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9hZGRfYXR0cmZvcmtfbG9jYWwoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZnNibG9ja190CQkqZmlyc3RibG9jaywJLyogZmlyc3QgYmxvY2sgYWxsb2NhdGVkICovCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCQkvKiBibG9ja3MgdG8gZnJlZSBhdCBjb21taXQgKi8KKwlpbnQJCQkqZmxhZ3MpCQkvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCit7CisJeGZzX2RhX2FyZ3NfdAkJZGFyZ3M7CQkvKiBhcmdzIGZvciBkaXIvYXR0ciBjb2RlICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogbW91bnQgc3RydWN0dXJlIHBvaW50ZXIgKi8KKworCWlmIChpcC0+aV9kZi5pZl9ieXRlcyA8PSBYRlNfSUZPUktfRFNJWkUoaXApKQorCQlyZXR1cm4gMDsKKwlpZiAoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUikgeworCQltcCA9IGlwLT5pX21vdW50OworCQltZW1zZXQoJmRhcmdzLCAwLCBzaXplb2YoZGFyZ3MpKTsKKwkJZGFyZ3MuZHAgPSBpcDsKKwkJZGFyZ3MuZmlyc3RibG9jayA9IGZpcnN0YmxvY2s7CisJCWRhcmdzLmZsaXN0ID0gZmxpc3Q7CisJCWRhcmdzLnRvdGFsID0gbXAtPm1fZGlyYmxrZnNiczsKKwkJZGFyZ3Mud2hpY2hmb3JrID0gWEZTX0RBVEFfRk9SSzsKKwkJZGFyZ3MudHJhbnMgPSB0cDsKKwkJZXJyb3IgPSBYRlNfRElSX1NIT1JURk9STV9UT19TSU5HTEUobXAsICZkYXJncyk7CisJfSBlbHNlCisJCWVycm9yID0geGZzX2JtYXBfbG9jYWxfdG9fZXh0ZW50cyh0cCwgaXAsIGZpcnN0YmxvY2ssIDEsIGZsYWdzLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogQ2FsbGVkIGJ5IHhmc19ibWFwaSB0byB1cGRhdGUgZXh0ZW50IGxpc3Qgc3RydWN0dXJlIGFuZCB0aGUgYnRyZWUKKyAqIGFmdGVyIGFsbG9jYXRpbmcgc3BhY2UgKG9yIGRvaW5nIGEgZGVsYXllZCBhbGxvY2F0aW9uKS4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfYWRkX2V4dGVudCgKKwl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19leHRudW1fdAkJaWR4LAkvKiBleHRlbnQgbnVtYmVyIHRvIHVwZGF0ZS9pbnNlcnQgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJCSoqY3VycCwJLyogaWYgKmN1cnAgaXMgbnVsbCwgbm90IGEgYnRyZWUgKi8KKwl4ZnNfYm1idF9pcmVjX3QJCSpuZXcsCS8qIG5ldyBkYXRhIHRvIHB1dCBpbiBleHRlbnQgbGlzdCAqLworCXhmc19mc2Jsb2NrX3QJCSpmaXJzdCwJLyogcG9pbnRlciB0byBmaXJzdGJsb2NrIHZhcmlhYmxlICovCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCS8qIGxpc3Qgb2YgZXh0ZW50cyB0byBiZSBmcmVlZCAqLworCWludAkJCSpsb2dmbGFnc3AsIC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KKwlpbnQJCQl3aGljaGZvcmssIC8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisJaW50CQkJcnN2ZCkJLyogT0sgdG8gdXNlIHJlc2VydmVkIGRhdGEgYmxvY2tzICovCit7CisJeGZzX2J0cmVlX2N1cl90CQkqY3VyOwkvKiBidHJlZSBjdXJzb3Igb3IgbnVsbCAqLworCXhmc19maWxibGtzX3QJCWRhX25ldzsgLyogbmV3IGNvdW50IGRlbCBhbGxvYyBibG9ja3MgdXNlZCAqLworCXhmc19maWxibGtzX3QJCWRhX29sZDsgLyogb2xkIGNvdW50IGRlbCBhbGxvYyBibG9ja3MgdXNlZCAqLworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKyNpZmRlZiBYRlNfQk1BUF9UUkFDRQorCXN0YXRpYyBjaGFyCQlmbmFtZVtdID0gInhmc19ibWFwX2FkZF9leHRlbnQiOworI2VuZGlmCisJeGZzX2lmb3JrX3QJCSppZnA7CS8qIGlub2RlIGZvcmsgcHRyICovCisJaW50CQkJbG9nZmxhZ3M7IC8qIHJldHVybmVkIHZhbHVlICovCisJeGZzX2V4dG51bV90CQluZXh0ZW50czsgLyogbnVtYmVyIG9mIGV4dGVudHMgaW4gZmlsZSBub3cgKi8KKworCVhGU19TVEFUU19JTkMoeHNfYWRkX2V4bGlzdCk7CisJY3VyID0gKmN1cnA7CisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCUFTU0VSVChpZHggPD0gbmV4dGVudHMpOworCWRhX29sZCA9IGRhX25ldyA9IDA7CisJZXJyb3IgPSAwOworCS8qCisJICogVGhpcyBpcyB0aGUgZmlyc3QgZXh0ZW50IGFkZGVkIHRvIGEgbmV3L2VtcHR5IGZpbGUuCisJICogU3BlY2lhbCBjYXNlIHRoaXMgb25lLCBzbyBvdGhlciByb3V0aW5lcyBnZXQgdG8gYXNzdW1lIHRoZXJlIGFyZQorCSAqIGFscmVhZHkgZXh0ZW50cyBpbiB0aGUgbGlzdC4KKwkgKi8KKwlpZiAobmV4dGVudHMgPT0gMCkgeworCQl4ZnNfYm1hcF90cmFjZV9pbnNlcnQoZm5hbWUsICJpbnNlcnQgZW1wdHkiLCBpcCwgMCwgMSwgbmV3LAorCQkJTlVMTCwgd2hpY2hmb3JrKTsKKwkJeGZzX2JtYXBfaW5zZXJ0X2V4bGlzdChpcCwgMCwgMSwgbmV3LCB3aGljaGZvcmspOworCQlBU1NFUlQoY3VyID09IE5VTEwpOworCQlpZnAtPmlmX2xhc3RleCA9IDA7CisJCWlmICghSVNOVUxMU1RBUlRCTE9DSyhuZXctPmJyX3N0YXJ0YmxvY2spKSB7CisJCQlYRlNfSUZPUktfTkVYVF9TRVQoaXAsIHdoaWNoZm9yaywgMSk7CisJCQlsb2dmbGFncyA9IFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19GRVhUKHdoaWNoZm9yayk7CisJCX0gZWxzZQorCQkJbG9nZmxhZ3MgPSAwOworCX0KKwkvKgorCSAqIEFueSBraW5kIG9mIG5ldyBkZWxheWVkIGFsbG9jYXRpb24gZ29lcyBoZXJlLgorCSAqLworCWVsc2UgaWYgKElTTlVMTFNUQVJUQkxPQ0sobmV3LT5icl9zdGFydGJsb2NrKSkgeworCQlpZiAoY3VyKQorCQkJQVNTRVJUKChjdXItPmJjX3ByaXZhdGUuYi5mbGFncyAmCisJCQkJWEZTX0JUQ1VSX0JQUlZfV0FTREVMKSA9PSAwKTsKKwkJaWYgKChlcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9kZWxheShpcCwgaWR4LCBjdXIsIG5ldywKKwkJCQkmbG9nZmxhZ3MsIHJzdmQpKSkKKwkJCWdvdG8gZG9uZTsKKwl9CisJLyoKKwkgKiBSZWFsIGFsbG9jYXRpb24gb2ZmIHRoZSBlbmQgb2YgdGhlIGZpbGUuCisJICovCisJZWxzZSBpZiAoaWR4ID09IG5leHRlbnRzKSB7CisJCWlmIChjdXIpCisJCQlBU1NFUlQoKGN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzICYKKwkJCQlYRlNfQlRDVVJfQlBSVl9XQVNERUwpID09IDApOworCQlpZiAoKGVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudF9ob2xlX3JlYWwoaXAsIGlkeCwgY3VyLCBuZXcsCisJCQkJJmxvZ2ZsYWdzLCB3aGljaGZvcmspKSkKKwkJCWdvdG8gZG9uZTsKKwl9IGVsc2UgeworCQl4ZnNfYm1idF9pcmVjX3QJcHJldjsJLyogb2xkIGV4dGVudCBhdCBvZmZzZXQgaWR4ICovCisKKwkJLyoKKwkJICogR2V0IHRoZSByZWNvcmQgcmVmZXJyZWQgdG8gYnkgaWR4LgorCQkgKi8KKwkJeGZzX2JtYnRfZ2V0X2FsbCgmaWZwLT5pZl91MS5pZl9leHRlbnRzW2lkeF0sICZwcmV2KTsKKwkJLyoKKwkJICogSWYgaXQncyBhIHJlYWwgYWxsb2NhdGlvbiByZWNvcmQsIGFuZCB0aGUgbmV3IGFsbG9jYXRpb24gZW5kcworCQkgKiBhZnRlciB0aGUgc3RhcnQgb2YgdGhlIHJlZmVycmVkIHRvIHJlY29yZCwgdGhlbiB3ZSdyZSBmaWxsaW5nCisJCSAqIGluIGEgZGVsYXllZCBvciB1bndyaXR0ZW4gYWxsb2NhdGlvbiB3aXRoIGEgcmVhbCBvbmUsIG9yCisJCSAqIGNvbnZlcnRpbmcgcmVhbCBiYWNrIHRvIHVud3JpdHRlbi4KKwkJICovCisJCWlmICghSVNOVUxMU1RBUlRCTE9DSyhuZXctPmJyX3N0YXJ0YmxvY2spICYmCisJCSAgICBuZXctPmJyX3N0YXJ0b2ZmICsgbmV3LT5icl9ibG9ja2NvdW50ID4gcHJldi5icl9zdGFydG9mZikgeworCQkJaWYgKHByZXYuYnJfc3RhdGUgIT0gWEZTX0VYVF9VTldSSVRURU4gJiYKKwkJCSAgICBJU05VTExTVEFSVEJMT0NLKHByZXYuYnJfc3RhcnRibG9jaykpIHsKKwkJCQlkYV9vbGQgPSBTVEFSVEJMT0NLVkFMKHByZXYuYnJfc3RhcnRibG9jayk7CisJCQkJaWYgKGN1cikKKwkJCQkJQVNTRVJUKGN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzICYKKwkJCQkJCVhGU19CVENVUl9CUFJWX1dBU0RFTCk7CisJCQkJaWYgKChlcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnRfZGVsYXlfcmVhbChpcCwKKwkJCQkJaWR4LCAmY3VyLCBuZXcsICZkYV9uZXcsIGZpcnN0LCBmbGlzdCwKKwkJCQkJJmxvZ2ZsYWdzLCByc3ZkKSkpCisJCQkJCWdvdG8gZG9uZTsKKwkJCX0gZWxzZSBpZiAobmV3LT5icl9zdGF0ZSA9PSBYRlNfRVhUX05PUk0pIHsKKwkJCQlBU1NFUlQobmV3LT5icl9zdGF0ZSA9PSBYRlNfRVhUX05PUk0pOworCQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50X3Vud3JpdHRlbl9yZWFsKAorCQkJCQlpcCwgaWR4LCAmY3VyLCBuZXcsICZsb2dmbGFncykpKQorCQkJCQlnb3RvIGRvbmU7CisJCQl9IGVsc2UgeworCQkJCUFTU0VSVChuZXctPmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOKTsKKwkJCQlpZiAoKGVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudF91bndyaXR0ZW5fcmVhbCgKKwkJCQkJaXAsIGlkeCwgJmN1ciwgbmV3LCAmbG9nZmxhZ3MpKSkKKwkJCQkJZ290byBkb25lOworCQkJfQorCQkJQVNTRVJUKCpjdXJwID09IGN1ciB8fCAqY3VycCA9PSBOVUxMKTsKKwkJfQorCQkvKgorCQkgKiBPdGhlcndpc2Ugd2UncmUgZmlsbGluZyBpbiBhIGhvbGUgd2l0aCBhbiBhbGxvY2F0aW9uLgorCQkgKi8KKwkJZWxzZSB7CisJCQlpZiAoY3VyKQorCQkJCUFTU0VSVCgoY3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgJgorCQkJCQlYRlNfQlRDVVJfQlBSVl9XQVNERUwpID09IDApOworCQkJaWYgKChlcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9yZWFsKGlwLCBpZHgsIGN1ciwKKwkJCQkJbmV3LCAmbG9nZmxhZ3MsIHdoaWNoZm9yaykpKQorCQkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCUFTU0VSVCgqY3VycCA9PSBjdXIgfHwgKmN1cnAgPT0gTlVMTCk7CisJLyoKKwkgKiBDb252ZXJ0IHRvIGEgYnRyZWUgaWYgbmVjZXNzYXJ5LgorCSAqLworCWlmIChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKKwkgICAgWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspID4gaWZwLT5pZl9leHRfbWF4KSB7CisJCWludAl0bXBfbG9nZmxhZ3M7CS8qIHBhcnRpYWwgbG9nIGZsYWcgcmV0dXJuIHZhbCAqLworCisJCUFTU0VSVChjdXIgPT0gTlVMTCk7CisJCWVycm9yID0geGZzX2JtYXBfZXh0ZW50c190b19idHJlZShpcC0+aV90cmFuc3AsIGlwLCBmaXJzdCwKKwkJCWZsaXN0LCAmY3VyLCBkYV9vbGQgPiAwLCAmdG1wX2xvZ2ZsYWdzLCB3aGljaGZvcmspOworCQlsb2dmbGFncyB8PSB0bXBfbG9nZmxhZ3M7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZG9uZTsKKwl9CisJLyoKKwkgKiBBZGp1c3QgZm9yIGNoYW5nZXMgaW4gcmVzZXJ2ZWQgZGVsYXllZCBpbmRpcmVjdCBibG9ja3MuCisJICogTm90aGluZyB0byBkbyBmb3IgZGlzayBxdW90YXMgaGVyZS4KKwkgKi8KKwlpZiAoZGFfb2xkIHx8IGRhX25ldykgeworCQl4ZnNfZmlsYmxrc190CW5ibGtzOworCisJCW5ibGtzID0gZGFfbmV3OworCQlpZiAoY3VyKQorCQkJbmJsa3MgKz0gY3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkOworCQlBU1NFUlQobmJsa3MgPD0gZGFfb2xkKTsKKwkJaWYgKG5ibGtzIDwgZGFfb2xkKQorCQkJeGZzX21vZF9pbmNvcmVfc2IoaXAtPmlfbW91bnQsIFhGU19TQlNfRkRCTE9DS1MsCisJCQkJKGludCkoZGFfb2xkIC0gbmJsa3MpLCByc3ZkKTsKKwl9CisJLyoKKwkgKiBDbGVhciBvdXQgdGhlIGFsbG9jYXRlZCBmaWVsZCwgZG9uZSB3aXRoIGl0IG5vdyBpbiBhbnkgY2FzZS4KKwkgKi8KKwlpZiAoY3VyKSB7CisJCWN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZCA9IDA7CisJCSpjdXJwID0gY3VyOworCX0KK2RvbmU6CisjaWZkZWYgREVCVUcKKwlpZiAoIWVycm9yKQorCQl4ZnNfYm1hcF9jaGVja19sZWFmX2V4dGVudHMoKmN1cnAsIGlwLCB3aGljaGZvcmspOworI2VuZGlmCisJKmxvZ2ZsYWdzcCA9IGxvZ2ZsYWdzOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIENhbGxlZCBieSB4ZnNfYm1hcF9hZGRfZXh0ZW50IHRvIGhhbmRsZSBjYXNlcyBjb252ZXJ0aW5nIGEgZGVsYXllZAorICogYWxsb2NhdGlvbiB0byBhIHJlYWwgYWxsb2NhdGlvbi4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfYWRkX2V4dGVudF9kZWxheV9yZWFsKAorCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CQlpZHgsCS8qIGV4dGVudCBudW1iZXIgdG8gdXBkYXRlL2luc2VydCAqLworCXhmc19idHJlZV9jdXJfdAkJKipjdXJwLAkvKiBpZiAqY3VycCBpcyBudWxsLCBub3QgYSBidHJlZSAqLworCXhmc19ibWJ0X2lyZWNfdAkJKm5ldywJLyogbmV3IGRhdGEgdG8gcHV0IGluIGV4dGVudCBsaXN0ICovCisJeGZzX2ZpbGJsa3NfdAkJKmRuZXcsCS8qIG5ldyBkZWxheWVkLWFsbG9jIGluZGlyZWN0IGJsb2NrcyAqLworCXhmc19mc2Jsb2NrX3QJCSpmaXJzdCwJLyogcG9pbnRlciB0byBmaXJzdGJsb2NrIHZhcmlhYmxlICovCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCS8qIGxpc3Qgb2YgZXh0ZW50cyB0byBiZSBmcmVlZCAqLworCWludAkJCSpsb2dmbGFnc3AsIC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KKwlpbnQJCQlyc3ZkKQkvKiBPSyB0byB1c2UgcmVzZXJ2ZWQgZGF0YSBibG9jayBhbGxvY2F0aW9uICovCit7CisJeGZzX2JtYnRfcmVjX3QJCSpiYXNlOwkvKiBiYXNlIG9mIGV4dGVudCBlbnRyeSBsaXN0ICovCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyOwkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlkaWZmOwkvKiB0ZW1wIHZhbHVlICovCisJeGZzX2JtYnRfcmVjX3QJCSplcDsJLyogZXh0ZW50IGVudHJ5IGZvciBpZHggKi8KKwlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisjaWZkZWYgWEZTX0JNQVBfVFJBQ0UKKwlzdGF0aWMgY2hhcgkJZm5hbWVbXSA9ICJ4ZnNfYm1hcF9hZGRfZXh0ZW50X2RlbGF5X3JlYWwiOworI2VuZGlmCisJaW50CQkJaTsJLyogdGVtcCBzdGF0ZSAqLworCXhmc19maWxlb2ZmX3QJCW5ld19lbmRvZmY7CS8qIGVuZCBvZmZzZXQgb2YgbmV3IGVudHJ5ICovCisJeGZzX2JtYnRfaXJlY190CQlyWzNdOwkvKiBuZWlnaGJvciBleHRlbnQgZW50cmllcyAqLworCQkJCQkvKiBsZWZ0IGlzIDAsIHJpZ2h0IGlzIDEsIHByZXYgaXMgMiAqLworCWludAkJCXJ2YWw9MDsJLyogcmV0dXJuIHZhbHVlIChsb2dnaW5nIGZsYWdzKSAqLworCWludAkJCXN0YXRlID0gMDsvKiBzdGF0ZSBiaXRzLCBhY2Nlc3NlZCB0aHJ1IG1hY3JvcyAqLworCXhmc19maWxibGtzX3QJCXRlbXA7CS8qIHZhbHVlIGZvciBkbmV3IGNhbGN1bGF0aW9ucyAqLworCXhmc19maWxibGtzX3QJCXRlbXAyOwkvKiB2YWx1ZSBmb3IgZG5ldyBjYWxjdWxhdGlvbnMgKi8KKwlpbnQJCQl0bXBfcnZhbDsJLyogcGFydGlhbCBsb2dnaW5nIGZsYWdzICovCisJZW51bSB7CQkJCS8qIGJpdCBudW1iZXIgZGVmaW5pdGlvbnMgZm9yIHN0YXRlICovCisJCUxFRlRfQ09OVElHLAlSSUdIVF9DT05USUcsCisJCUxFRlRfRklMTElORywJUklHSFRfRklMTElORywKKwkJTEVGVF9ERUxBWSwJUklHSFRfREVMQVksCisJCUxFRlRfVkFMSUQsCVJJR0hUX1ZBTElECisJfTsKKworI2RlZmluZQlMRUZUCQlyWzBdCisjZGVmaW5lCVJJR0hUCQlyWzFdCisjZGVmaW5lCVBSRVYJCXJbMl0KKyNkZWZpbmUJTUFTSyhiKQkJKDEgPDwgKGIpKQorI2RlZmluZQlNQVNLMihhLGIpCShNQVNLKGEpIHwgTUFTSyhiKSkKKyNkZWZpbmUJTUFTSzMoYSxiLGMpCShNQVNLMihhLGIpIHwgTUFTSyhjKSkKKyNkZWZpbmUJTUFTSzQoYSxiLGMsZCkJKE1BU0szKGEsYixjKSB8IE1BU0soZCkpCisjZGVmaW5lCVNUQVRFX1NFVChiLHYpCSgodikgPyAoc3RhdGUgfD0gTUFTSyhiKSkgOiAoc3RhdGUgJj0gfk1BU0soYikpKQorI2RlZmluZQlTVEFURV9URVNUKGIpCShzdGF0ZSAmIE1BU0soYikpCisjZGVmaW5lCVNUQVRFX1NFVF9URVNUKGIsdikJKCh2KSA/ICgoc3RhdGUgfD0gTUFTSyhiKSksIDEpIDogXAorCQkJCSAgICAgICAoKHN0YXRlICY9IH5NQVNLKGIpKSwgMCkpCisjZGVmaW5lCVNXSVRDSF9TVEFURQkJXAorCShzdGF0ZSAmIE1BU0s0KExFRlRfRklMTElORywgUklHSFRfRklMTElORywgTEVGVF9DT05USUcsIFJJR0hUX0NPTlRJRykpCisKKwkvKgorCSAqIFNldCB1cCBhIGJ1bmNoIG9mIHZhcmlhYmxlcyB0byBtYWtlIHRoZSB0ZXN0cyBzaW1wbGVyLgorCSAqLworCWN1ciA9ICpjdXJwOworCWJhc2UgPSBpcC0+aV9kZi5pZl91MS5pZl9leHRlbnRzOworCWVwID0gJmJhc2VbaWR4XTsKKwl4ZnNfYm1idF9nZXRfYWxsKGVwLCAmUFJFVik7CisJbmV3X2VuZG9mZiA9IG5ldy0+YnJfc3RhcnRvZmYgKyBuZXctPmJyX2Jsb2NrY291bnQ7CisJQVNTRVJUKFBSRVYuYnJfc3RhcnRvZmYgPD0gbmV3LT5icl9zdGFydG9mZik7CisJQVNTRVJUKFBSRVYuYnJfc3RhcnRvZmYgKyBQUkVWLmJyX2Jsb2NrY291bnQgPj0gbmV3X2VuZG9mZik7CisJLyoKKwkgKiBTZXQgZmxhZ3MgZGV0ZXJtaW5pbmcgd2hhdCBwYXJ0IG9mIHRoZSBwcmV2aW91cyBkZWxheWVkIGFsbG9jYXRpb24KKwkgKiBleHRlbnQgaXMgYmVpbmcgcmVwbGFjZWQgYnkgYSByZWFsIGFsbG9jYXRpb24uCisJICovCisJU1RBVEVfU0VUKExFRlRfRklMTElORywgUFJFVi5icl9zdGFydG9mZiA9PSBuZXctPmJyX3N0YXJ0b2ZmKTsKKwlTVEFURV9TRVQoUklHSFRfRklMTElORywKKwkJUFJFVi5icl9zdGFydG9mZiArIFBSRVYuYnJfYmxvY2tjb3VudCA9PSBuZXdfZW5kb2ZmKTsKKwkvKgorCSAqIENoZWNrIGFuZCBzZXQgZmxhZ3MgaWYgdGhpcyBzZWdtZW50IGhhcyBhIGxlZnQgbmVpZ2hib3IuCisJICogRG9uJ3Qgc2V0IGNvbnRpZ3VvdXMgaWYgdGhlIGNvbWJpbmVkIGV4dGVudCB3b3VsZCBiZSB0b28gbGFyZ2UuCisJICovCisJaWYgKFNUQVRFX1NFVF9URVNUKExFRlRfVkFMSUQsIGlkeCA+IDApKSB7CisJCXhmc19ibWJ0X2dldF9hbGwoZXAgLSAxLCAmTEVGVCk7CisJCVNUQVRFX1NFVChMRUZUX0RFTEFZLCBJU05VTExTVEFSVEJMT0NLKExFRlQuYnJfc3RhcnRibG9jaykpOworCX0KKwlTVEFURV9TRVQoTEVGVF9DT05USUcsCisJCVNUQVRFX1RFU1QoTEVGVF9WQUxJRCkgJiYgIVNUQVRFX1RFU1QoTEVGVF9ERUxBWSkgJiYKKwkJTEVGVC5icl9zdGFydG9mZiArIExFRlQuYnJfYmxvY2tjb3VudCA9PSBuZXctPmJyX3N0YXJ0b2ZmICYmCisJCUxFRlQuYnJfc3RhcnRibG9jayArIExFRlQuYnJfYmxvY2tjb3VudCA9PSBuZXctPmJyX3N0YXJ0YmxvY2sgJiYKKwkJTEVGVC5icl9zdGF0ZSA9PSBuZXctPmJyX3N0YXRlICYmCisJCUxFRlQuYnJfYmxvY2tjb3VudCArIG5ldy0+YnJfYmxvY2tjb3VudCA8PSBNQVhFWFRMRU4pOworCS8qCisJICogQ2hlY2sgYW5kIHNldCBmbGFncyBpZiB0aGlzIHNlZ21lbnQgaGFzIGEgcmlnaHQgbmVpZ2hib3IuCisJICogRG9uJ3Qgc2V0IGNvbnRpZ3VvdXMgaWYgdGhlIGNvbWJpbmVkIGV4dGVudCB3b3VsZCBiZSB0b28gbGFyZ2UuCisJICogQWxzbyBjaGVjayBmb3IgYWxsLXRocmVlLWNvbnRpZ3VvdXMgYmVpbmcgdG9vIGxhcmdlLgorCSAqLworCWlmIChTVEFURV9TRVRfVEVTVChSSUdIVF9WQUxJRCwKKwkJCWlkeCA8CisJCQlpcC0+aV9kZi5pZl9ieXRlcyAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkgLSAxKSkgeworCQl4ZnNfYm1idF9nZXRfYWxsKGVwICsgMSwgJlJJR0hUKTsKKwkJU1RBVEVfU0VUKFJJR0hUX0RFTEFZLCBJU05VTExTVEFSVEJMT0NLKFJJR0hULmJyX3N0YXJ0YmxvY2spKTsKKwl9CisJU1RBVEVfU0VUKFJJR0hUX0NPTlRJRywKKwkJU1RBVEVfVEVTVChSSUdIVF9WQUxJRCkgJiYgIVNUQVRFX1RFU1QoUklHSFRfREVMQVkpICYmCisJCW5ld19lbmRvZmYgPT0gUklHSFQuYnJfc3RhcnRvZmYgJiYKKwkJbmV3LT5icl9zdGFydGJsb2NrICsgbmV3LT5icl9ibG9ja2NvdW50ID09CisJCSAgICBSSUdIVC5icl9zdGFydGJsb2NrICYmCisJCW5ldy0+YnJfc3RhdGUgPT0gUklHSFQuYnJfc3RhdGUgJiYKKwkJbmV3LT5icl9ibG9ja2NvdW50ICsgUklHSFQuYnJfYmxvY2tjb3VudCA8PSBNQVhFWFRMRU4gJiYKKwkJKChzdGF0ZSAmIE1BU0szKExFRlRfQ09OVElHLCBMRUZUX0ZJTExJTkcsIFJJR0hUX0ZJTExJTkcpKSAhPQorCQkgIE1BU0szKExFRlRfQ09OVElHLCBMRUZUX0ZJTExJTkcsIFJJR0hUX0ZJTExJTkcpIHx8CisJCSBMRUZULmJyX2Jsb2NrY291bnQgKyBuZXctPmJyX2Jsb2NrY291bnQgKyBSSUdIVC5icl9ibG9ja2NvdW50CisJCSAgICAgPD0gTUFYRVhUTEVOKSk7CisJZXJyb3IgPSAwOworCS8qCisJICogU3dpdGNoIG91dCBiYXNlZCBvbiB0aGUgRklMTElORyBhbmQgQ09OVElHIHN0YXRlIGJpdHMuCisJICovCisJc3dpdGNoIChTV0lUQ0hfU1RBVEUpIHsKKworCWNhc2UgTUFTSzQoTEVGVF9GSUxMSU5HLCBSSUdIVF9GSUxMSU5HLCBMRUZUX0NPTlRJRywgUklHSFRfQ09OVElHKToKKwkJLyoKKwkJICogRmlsbGluZyBpbiBhbGwgb2YgYSBwcmV2aW91c2x5IGRlbGF5ZWQgYWxsb2NhdGlvbiBleHRlbnQuCisJCSAqIFRoZSBsZWZ0IGFuZCByaWdodCBuZWlnaGJvcnMgYXJlIGJvdGggY29udGlndW91cyB3aXRoIG5ldy4KKwkJICovCisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJMRnxSRnxMQ3xSQyIsIGlwLCBpZHggLSAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwIC0gMSwKKwkJCUxFRlQuYnJfYmxvY2tjb3VudCArIFBSRVYuYnJfYmxvY2tjb3VudCArCisJCQlSSUdIVC5icl9ibG9ja2NvdW50KTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJMRnxSRnxMQ3xSQyIsIGlwLCBpZHggLSAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWFwX3RyYWNlX2RlbGV0ZShmbmFtZSwgIkxGfFJGfExDfFJDIiwgaXAsIGlkeCwgMiwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1hcF9kZWxldGVfZXhsaXN0KGlwLCBpZHgsIDIsIFhGU19EQVRBX0ZPUkspOworCQlpcC0+aV9kZi5pZl9sYXN0ZXggPSBpZHggLSAxOworCQlpcC0+aV9kLmRpX25leHRlbnRzLS07CisJCWlmIChjdXIgPT0gTlVMTCkKKwkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfREVYVDsKKwkJZWxzZSB7CisJCQlydmFsID0gWEZTX0lMT0dfQ09SRTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBSSUdIVC5icl9zdGFydG9mZiwKKwkJCQkJUklHSFQuYnJfc3RhcnRibG9jaywKKwkJCQkJUklHSFQuYnJfYmxvY2tjb3VudCwgJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9kZWxldGUoY3VyLCAmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgTEVGVC5icl9zdGFydG9mZiwKKwkJCQkJTEVGVC5icl9zdGFydGJsb2NrLAorCQkJCQlMRUZULmJyX2Jsb2NrY291bnQgKworCQkJCQlQUkVWLmJyX2Jsb2NrY291bnQgKworCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCBMRUZULmJyX3N0YXRlKSkpCisJCQkJZ290byBkb25lOworCQl9CisJCSpkbmV3ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIE1BU0szKExFRlRfRklMTElORywgUklHSFRfRklMTElORywgTEVGVF9DT05USUcpOgorCQkvKgorCQkgKiBGaWxsaW5nIGluIGFsbCBvZiBhIHByZXZpb3VzbHkgZGVsYXllZCBhbGxvY2F0aW9uIGV4dGVudC4KKwkJICogVGhlIGxlZnQgbmVpZ2hib3IgaXMgY29udGlndW91cywgdGhlIHJpZ2h0IGlzIG5vdC4KKwkJICovCisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJMRnxSRnxMQyIsIGlwLCBpZHggLSAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwIC0gMSwKKwkJCUxFRlQuYnJfYmxvY2tjb3VudCArIFBSRVYuYnJfYmxvY2tjb3VudCk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiTEZ8UkZ8TEMiLCBpcCwgaWR4IC0gMSwKKwkJCVhGU19EQVRBX0ZPUkspOworCQlpcC0+aV9kZi5pZl9sYXN0ZXggPSBpZHggLSAxOworCQl4ZnNfYm1hcF90cmFjZV9kZWxldGUoZm5hbWUsICJMRnxSRnxMQyIsIGlwLCBpZHgsIDEsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYXBfZGVsZXRlX2V4bGlzdChpcCwgaWR4LCAxLCBYRlNfREFUQV9GT1JLKTsKKwkJaWYgKGN1ciA9PSBOVUxMKQorCQkJcnZhbCA9IFhGU19JTE9HX0RFWFQ7CisJCWVsc2UgeworCQkJcnZhbCA9IDA7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgTEVGVC5icl9zdGFydG9mZiwKKwkJCQkJTEVGVC5icl9zdGFydGJsb2NrLCBMRUZULmJyX2Jsb2NrY291bnQsCisJCQkJCSZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgTEVGVC5icl9zdGFydG9mZiwKKwkJCQkJTEVGVC5icl9zdGFydGJsb2NrLAorCQkJCQlMRUZULmJyX2Jsb2NrY291bnQgKworCQkJCQlQUkVWLmJyX2Jsb2NrY291bnQsIExFRlQuYnJfc3RhdGUpKSkKKwkJCQlnb3RvIGRvbmU7CisJCX0KKwkJKmRuZXcgPSAwOworCQlicmVhazsKKworCWNhc2UgTUFTSzMoTEVGVF9GSUxMSU5HLCBSSUdIVF9GSUxMSU5HLCBSSUdIVF9DT05USUcpOgorCQkvKgorCQkgKiBGaWxsaW5nIGluIGFsbCBvZiBhIHByZXZpb3VzbHkgZGVsYXllZCBhbGxvY2F0aW9uIGV4dGVudC4KKwkJICogVGhlIHJpZ2h0IG5laWdoYm9yIGlzIGNvbnRpZ3VvdXMsIHRoZSBsZWZ0IGlzIG5vdC4KKwkJICovCisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJMRnxSRnxSQyIsIGlwLCBpZHgsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIG5ldy0+YnJfc3RhcnRibG9jayk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwLAorCQkJUFJFVi5icl9ibG9ja2NvdW50ICsgUklHSFQuYnJfYmxvY2tjb3VudCk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiTEZ8UkZ8UkMiLCBpcCwgaWR4LAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeDsKKwkJeGZzX2JtYXBfdHJhY2VfZGVsZXRlKGZuYW1lLCAiTEZ8UkZ8UkMiLCBpcCwgaWR4ICsgMSwgMSwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1hcF9kZWxldGVfZXhsaXN0KGlwLCBpZHggKyAxLCAxLCBYRlNfREFUQV9GT1JLKTsKKwkJaWYgKGN1ciA9PSBOVUxMKQorCQkJcnZhbCA9IFhGU19JTE9HX0RFWFQ7CisJCWVsc2UgeworCQkJcnZhbCA9IDA7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgUklHSFQuYnJfc3RhcnRvZmYsCisJCQkJCVJJR0hULmJyX3N0YXJ0YmxvY2ssCisJCQkJCVJJR0hULmJyX2Jsb2NrY291bnQsICZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgUFJFVi5icl9zdGFydG9mZiwKKwkJCQkJbmV3LT5icl9zdGFydGJsb2NrLAorCQkJCQlQUkVWLmJyX2Jsb2NrY291bnQgKworCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCBQUkVWLmJyX3N0YXRlKSkpCisJCQkJZ290byBkb25lOworCQl9CisJCSpkbmV3ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIE1BU0syKExFRlRfRklMTElORywgUklHSFRfRklMTElORyk6CisJCS8qCisJCSAqIEZpbGxpbmcgaW4gYWxsIG9mIGEgcHJldmlvdXNseSBkZWxheWVkIGFsbG9jYXRpb24gZXh0ZW50LgorCQkgKiBOZWl0aGVyIHRoZSBsZWZ0IG5vciByaWdodCBuZWlnaGJvcnMgYXJlIGNvbnRpZ3VvdXMgd2l0aAorCQkgKiB0aGUgbmV3IG9uZS4KKwkJICovCisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJMRnxSRiIsIGlwLCBpZHgsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIG5ldy0+YnJfc3RhcnRibG9jayk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiTEZ8UkYiLCBpcCwgaWR4LAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeDsKKwkJaXAtPmlfZC5kaV9uZXh0ZW50cysrOworCQlpZiAoY3VyID09IE5VTEwpCisJCQlydmFsID0gWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0RFWFQ7CisJCWVsc2UgeworCQkJcnZhbCA9IFhGU19JTE9HX0NPUkU7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgbmV3LT5icl9zdGFydG9mZiwKKwkJCQkJbmV3LT5icl9zdGFydGJsb2NrLCBuZXctPmJyX2Jsb2NrY291bnQsCisJCQkJCSZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMCk7CisJCQljdXItPmJjX3JlYy5iLmJyX3N0YXRlID0gWEZTX0VYVF9OT1JNOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2luc2VydChjdXIsICZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCX0KKwkJKmRuZXcgPSAwOworCQlicmVhazsKKworCWNhc2UgTUFTSzIoTEVGVF9GSUxMSU5HLCBMRUZUX0NPTlRJRyk6CisJCS8qCisJCSAqIEZpbGxpbmcgaW4gdGhlIGZpcnN0IHBhcnQgb2YgYSBwcmV2aW91cyBkZWxheWVkIGFsbG9jYXRpb24uCisJCSAqIFRoZSBsZWZ0IG5laWdoYm9yIGlzIGNvbnRpZ3VvdXMuCisJCSAqLworCQl4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKGZuYW1lLCAiTEZ8TEMiLCBpcCwgaWR4IC0gMSwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCAtIDEsCisJCQlMRUZULmJyX2Jsb2NrY291bnQgKyBuZXctPmJyX2Jsb2NrY291bnQpOworCQl4ZnNfYm1idF9zZXRfc3RhcnRvZmYoZXAsCisJCQlQUkVWLmJyX3N0YXJ0b2ZmICsgbmV3LT5icl9ibG9ja2NvdW50KTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJMRnxMQyIsIGlwLCBpZHggLSAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXRlbXAgPSBQUkVWLmJyX2Jsb2NrY291bnQgLSBuZXctPmJyX2Jsb2NrY291bnQ7CisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJMRnxMQyIsIGlwLCBpZHgsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAsIHRlbXApOworCQlpcC0+aV9kZi5pZl9sYXN0ZXggPSBpZHggLSAxOworCQlpZiAoY3VyID09IE5VTEwpCisJCQlydmFsID0gWEZTX0lMT0dfREVYVDsKKwkJZWxzZSB7CisJCQlydmFsID0gMDsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAorCQkJCQlMRUZULmJyX3N0YXJ0YmxvY2ssIExFRlQuYnJfYmxvY2tjb3VudCwKKwkJCQkJJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAorCQkJCQlMRUZULmJyX3N0YXJ0YmxvY2ssCisJCQkJCUxFRlQuYnJfYmxvY2tjb3VudCArCisJCQkJCW5ldy0+YnJfYmxvY2tjb3VudCwKKwkJCQkJTEVGVC5icl9zdGF0ZSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJfQorCQl0ZW1wID0gWEZTX0ZJTEJMS1NfTUlOKHhmc19ibWFwX3dvcnN0X2luZGxlbihpcCwgdGVtcCksCisJCQlTVEFSVEJMT0NLVkFMKFBSRVYuYnJfc3RhcnRibG9jaykpOworCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCwgTlVMTFNUQVJUQkxPQ0soKGludCl0ZW1wKSk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiTEZ8TEMiLCBpcCwgaWR4LAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCSpkbmV3ID0gdGVtcDsKKwkJYnJlYWs7CisKKwljYXNlIE1BU0soTEVGVF9GSUxMSU5HKToKKwkJLyoKKwkJICogRmlsbGluZyBpbiB0aGUgZmlyc3QgcGFydCBvZiBhIHByZXZpb3VzIGRlbGF5ZWQgYWxsb2NhdGlvbi4KKwkJICogVGhlIGxlZnQgbmVpZ2hib3IgaXMgbm90IGNvbnRpZ3VvdXMuCisJCSAqLworCQl4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKGZuYW1lLCAiTEYiLCBpcCwgaWR4LCBYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYnRfc2V0X3N0YXJ0b2ZmKGVwLCBuZXdfZW5kb2ZmKTsKKwkJdGVtcCA9IFBSRVYuYnJfYmxvY2tjb3VudCAtIG5ldy0+YnJfYmxvY2tjb3VudDsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAsIHRlbXApOworCQl4ZnNfYm1hcF90cmFjZV9pbnNlcnQoZm5hbWUsICJMRiIsIGlwLCBpZHgsIDEsIG5ldywgTlVMTCwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1hcF9pbnNlcnRfZXhsaXN0KGlwLCBpZHgsIDEsIG5ldywgWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeDsKKwkJaXAtPmlfZC5kaV9uZXh0ZW50cysrOworCQlpZiAoY3VyID09IE5VTEwpCisJCQlydmFsID0gWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0RFWFQ7CisJCWVsc2UgeworCQkJcnZhbCA9IFhGU19JTE9HX0NPUkU7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgbmV3LT5icl9zdGFydG9mZiwKKwkJCQkJbmV3LT5icl9zdGFydGJsb2NrLCBuZXctPmJyX2Jsb2NrY291bnQsCisJCQkJCSZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMCk7CisJCQljdXItPmJjX3JlYy5iLmJyX3N0YXRlID0gWEZTX0VYVF9OT1JNOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2luc2VydChjdXIsICZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCX0KKwkJaWYgKGlwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKKwkJICAgIGlwLT5pX2QuZGlfbmV4dGVudHMgPiBpcC0+aV9kZi5pZl9leHRfbWF4KSB7CisJCQllcnJvciA9IHhmc19ibWFwX2V4dGVudHNfdG9fYnRyZWUoaXAtPmlfdHJhbnNwLCBpcCwKKwkJCQkJZmlyc3QsIGZsaXN0LCAmY3VyLCAxLCAmdG1wX3J2YWwsCisJCQkJCVhGU19EQVRBX0ZPUkspOworCQkJcnZhbCB8PSB0bXBfcnZhbDsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGRvbmU7CisJCX0KKwkJdGVtcCA9IFhGU19GSUxCTEtTX01JTih4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIHRlbXApLAorCQkJU1RBUlRCTE9DS1ZBTChQUkVWLmJyX3N0YXJ0YmxvY2spIC0KKwkJCShjdXIgPyBjdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQgOiAwKSk7CisJCWJhc2UgPSBpcC0+aV9kZi5pZl91MS5pZl9leHRlbnRzOworCQllcCA9ICZiYXNlW2lkeCArIDFdOworCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCwgTlVMTFNUQVJUQkxPQ0soKGludCl0ZW1wKSk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiTEYiLCBpcCwgaWR4ICsgMSwKKwkJCVhGU19EQVRBX0ZPUkspOworCQkqZG5ldyA9IHRlbXA7CisJCWJyZWFrOworCisJY2FzZSBNQVNLMihSSUdIVF9GSUxMSU5HLCBSSUdIVF9DT05USUcpOgorCQkvKgorCQkgKiBGaWxsaW5nIGluIHRoZSBsYXN0IHBhcnQgb2YgYSBwcmV2aW91cyBkZWxheWVkIGFsbG9jYXRpb24uCisJCSAqIFRoZSByaWdodCBuZWlnaGJvciBpcyBjb250aWd1b3VzIHdpdGggdGhlIG5ldyBhbGxvY2F0aW9uLgorCQkgKi8KKwkJdGVtcCA9IFBSRVYuYnJfYmxvY2tjb3VudCAtIG5ldy0+YnJfYmxvY2tjb3VudDsKKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIlJGfFJDIiwgaXAsIGlkeCwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKGZuYW1lLCAiUkZ8UkMiLCBpcCwgaWR4ICsgMSwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCwgdGVtcCk7CisJCXhmc19ibWJ0X3NldF9hbGxmKGVwICsgMSwgbmV3LT5icl9zdGFydG9mZiwgbmV3LT5icl9zdGFydGJsb2NrLAorCQkJbmV3LT5icl9ibG9ja2NvdW50ICsgUklHSFQuYnJfYmxvY2tjb3VudCwKKwkJCVJJR0hULmJyX3N0YXRlKTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJSRnxSQyIsIGlwLCBpZHggKyAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeCArIDE7CisJCWlmIChjdXIgPT0gTlVMTCkKKwkJCXJ2YWwgPSBYRlNfSUxPR19ERVhUOworCQllbHNlIHsKKwkJCXJ2YWwgPSAwOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIFJJR0hULmJyX3N0YXJ0b2ZmLAorCQkJCQlSSUdIVC5icl9zdGFydGJsb2NrLAorCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCAmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShjdXIsIG5ldy0+YnJfc3RhcnRvZmYsCisJCQkJCW5ldy0+YnJfc3RhcnRibG9jaywKKwkJCQkJbmV3LT5icl9ibG9ja2NvdW50ICsKKwkJCQkJUklHSFQuYnJfYmxvY2tjb3VudCwKKwkJCQkJUklHSFQuYnJfc3RhdGUpKSkKKwkJCQlnb3RvIGRvbmU7CisJCX0KKwkJdGVtcCA9IFhGU19GSUxCTEtTX01JTih4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIHRlbXApLAorCQkJU1RBUlRCTE9DS1ZBTChQUkVWLmJyX3N0YXJ0YmxvY2spKTsKKwkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIE5VTExTVEFSVEJMT0NLKChpbnQpdGVtcCkpOworCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIlJGfFJDIiwgaXAsIGlkeCwKKwkJCVhGU19EQVRBX0ZPUkspOworCQkqZG5ldyA9IHRlbXA7CisJCWJyZWFrOworCisJY2FzZSBNQVNLKFJJR0hUX0ZJTExJTkcpOgorCQkvKgorCQkgKiBGaWxsaW5nIGluIHRoZSBsYXN0IHBhcnQgb2YgYSBwcmV2aW91cyBkZWxheWVkIGFsbG9jYXRpb24uCisJCSAqIFRoZSByaWdodCBuZWlnaGJvciBpcyBub3QgY29udGlndW91cy4KKwkJICovCisJCXRlbXAgPSBQUkVWLmJyX2Jsb2NrY291bnQgLSBuZXctPmJyX2Jsb2NrY291bnQ7CisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJSRiIsIGlwLCBpZHgsIFhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCwgdGVtcCk7CisJCXhmc19ibWFwX3RyYWNlX2luc2VydChmbmFtZSwgIlJGIiwgaXAsIGlkeCArIDEsIDEsCisJCQluZXcsIE5VTEwsIFhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1hcF9pbnNlcnRfZXhsaXN0KGlwLCBpZHggKyAxLCAxLCBuZXcsIFhGU19EQVRBX0ZPUkspOworCQlpcC0+aV9kZi5pZl9sYXN0ZXggPSBpZHggKyAxOworCQlpcC0+aV9kLmRpX25leHRlbnRzKys7CisJCWlmIChjdXIgPT0gTlVMTCkKKwkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfREVYVDsKKwkJZWxzZSB7CisJCQlydmFsID0gWEZTX0lMT0dfQ09SRTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBuZXctPmJyX3N0YXJ0b2ZmLAorCQkJCQluZXctPmJyX3N0YXJ0YmxvY2ssIG5ldy0+YnJfYmxvY2tjb3VudCwKKwkJCQkJJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAwKTsKKwkJCWN1ci0+YmNfcmVjLmIuYnJfc3RhdGUgPSBYRlNfRVhUX05PUk07CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfaW5zZXJ0KGN1ciwgJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJfQorCQlpZiAoaXAtPmlfZC5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCQkgICAgaXAtPmlfZC5kaV9uZXh0ZW50cyA+IGlwLT5pX2RmLmlmX2V4dF9tYXgpIHsKKwkJCWVycm9yID0geGZzX2JtYXBfZXh0ZW50c190b19idHJlZShpcC0+aV90cmFuc3AsIGlwLAorCQkJCWZpcnN0LCBmbGlzdCwgJmN1ciwgMSwgJnRtcF9ydmFsLAorCQkJCVhGU19EQVRBX0ZPUkspOworCQkJcnZhbCB8PSB0bXBfcnZhbDsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGRvbmU7CisJCX0KKwkJdGVtcCA9IFhGU19GSUxCTEtTX01JTih4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIHRlbXApLAorCQkJU1RBUlRCTE9DS1ZBTChQUkVWLmJyX3N0YXJ0YmxvY2spIC0KKwkJCShjdXIgPyBjdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQgOiAwKSk7CisJCWJhc2UgPSBpcC0+aV9kZi5pZl91MS5pZl9leHRlbnRzOworCQllcCA9ICZiYXNlW2lkeF07CisJCXhmc19ibWJ0X3NldF9zdGFydGJsb2NrKGVwLCBOVUxMU1RBUlRCTE9DSygoaW50KXRlbXApKTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJSRiIsIGlwLCBpZHgsIFhGU19EQVRBX0ZPUkspOworCQkqZG5ldyA9IHRlbXA7CisJCWJyZWFrOworCisJY2FzZSAwOgorCQkvKgorCQkgKiBGaWxsaW5nIGluIHRoZSBtaWRkbGUgcGFydCBvZiBhIHByZXZpb3VzIGRlbGF5ZWQgYWxsb2NhdGlvbi4KKwkJICogQ29udGlndWl0eSBpcyBpbXBvc3NpYmxlIGhlcmUuCisJCSAqIFRoaXMgY2FzZSBpcyBhdm9pZGVkIGFsbW9zdCBhbGwgdGhlIHRpbWUuCisJCSAqLworCQl0ZW1wID0gbmV3LT5icl9zdGFydG9mZiAtIFBSRVYuYnJfc3RhcnRvZmY7CisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICIwIiwgaXAsIGlkeCwgWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwLCB0ZW1wKTsKKwkJclswXSA9ICpuZXc7CisJCXJbMV0uYnJfc3RhcnRvZmYgPSBuZXdfZW5kb2ZmOworCQl0ZW1wMiA9IFBSRVYuYnJfc3RhcnRvZmYgKyBQUkVWLmJyX2Jsb2NrY291bnQgLSBuZXdfZW5kb2ZmOworCQlyWzFdLmJyX2Jsb2NrY291bnQgPSB0ZW1wMjsKKwkJeGZzX2JtYXBfdHJhY2VfaW5zZXJ0KGZuYW1lLCAiMCIsIGlwLCBpZHggKyAxLCAyLCAmclswXSwgJnJbMV0sCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYXBfaW5zZXJ0X2V4bGlzdChpcCwgaWR4ICsgMSwgMiwgJnJbMF0sIFhGU19EQVRBX0ZPUkspOworCQlpcC0+aV9kZi5pZl9sYXN0ZXggPSBpZHggKyAxOworCQlpcC0+aV9kLmRpX25leHRlbnRzKys7CisJCWlmIChjdXIgPT0gTlVMTCkKKwkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfREVYVDsKKwkJZWxzZSB7CisJCQlydmFsID0gWEZTX0lMT0dfQ09SRTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBuZXctPmJyX3N0YXJ0b2ZmLAorCQkJCQluZXctPmJyX3N0YXJ0YmxvY2ssIG5ldy0+YnJfYmxvY2tjb3VudCwKKwkJCQkJJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAwKTsKKwkJCWN1ci0+YmNfcmVjLmIuYnJfc3RhdGUgPSBYRlNfRVhUX05PUk07CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfaW5zZXJ0KGN1ciwgJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJfQorCQlpZiAoaXAtPmlfZC5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCQkgICAgaXAtPmlfZC5kaV9uZXh0ZW50cyA+IGlwLT5pX2RmLmlmX2V4dF9tYXgpIHsKKwkJCWVycm9yID0geGZzX2JtYXBfZXh0ZW50c190b19idHJlZShpcC0+aV90cmFuc3AsIGlwLAorCQkJCQlmaXJzdCwgZmxpc3QsICZjdXIsIDEsICZ0bXBfcnZhbCwKKwkJCQkJWEZTX0RBVEFfRk9SSyk7CisJCQlydmFsIHw9IHRtcF9ydmFsOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gZG9uZTsKKwkJfQorCQl0ZW1wID0geGZzX2JtYXBfd29yc3RfaW5kbGVuKGlwLCB0ZW1wKTsKKwkJdGVtcDIgPSB4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIHRlbXAyKTsKKwkJZGlmZiA9IChpbnQpKHRlbXAgKyB0ZW1wMiAtIFNUQVJUQkxPQ0tWQUwoUFJFVi5icl9zdGFydGJsb2NrKSAtCisJCQkoY3VyID8gY3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkIDogMCkpOworCQlpZiAoZGlmZiA+IDAgJiYKKwkJICAgIHhmc19tb2RfaW5jb3JlX3NiKGlwLT5pX21vdW50LCBYRlNfU0JTX0ZEQkxPQ0tTLCAtZGlmZiwgcnN2ZCkpIHsKKwkJCS8qCisJCQkgKiBJY2sgZ3Jvc3MgZ2FnIG1lIHdpdGggYSBzcG9vbi4KKwkJCSAqLworCQkJQVNTRVJUKDApOwkvKiB3YW50IHRvIHNlZSBpZiB0aGlzIGV2ZXIgaGFwcGVucyEgKi8KKwkJCXdoaWxlIChkaWZmID4gMCkgeworCQkJCWlmICh0ZW1wKSB7CisJCQkJCXRlbXAtLTsKKwkJCQkJZGlmZi0tOworCQkJCQlpZiAoIWRpZmYgfHwKKwkJCQkJICAgICF4ZnNfbW9kX2luY29yZV9zYihpcC0+aV9tb3VudCwKKwkJCQkJCSAgICBYRlNfU0JTX0ZEQkxPQ0tTLCAtZGlmZiwgcnN2ZCkpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKHRlbXAyKSB7CisJCQkJCXRlbXAyLS07CisJCQkJCWRpZmYtLTsKKwkJCQkJaWYgKCFkaWZmIHx8CisJCQkJCSAgICAheGZzX21vZF9pbmNvcmVfc2IoaXAtPmlfbW91bnQsCisJCQkJCQkgICAgWEZTX1NCU19GREJMT0NLUywgLWRpZmYsIHJzdmQpKQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWJhc2UgPSBpcC0+aV9kZi5pZl91MS5pZl9leHRlbnRzOworCQllcCA9ICZiYXNlW2lkeF07CisJCXhmc19ibWJ0X3NldF9zdGFydGJsb2NrKGVwLCBOVUxMU1RBUlRCTE9DSygoaW50KXRlbXApKTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICIwIiwgaXAsIGlkeCwgWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICIwIiwgaXAsIGlkeCArIDIsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAgKyAyLCBOVUxMU1RBUlRCTE9DSygoaW50KXRlbXAyKSk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiMCIsIGlwLCBpZHggKyAyLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCSpkbmV3ID0gdGVtcCArIHRlbXAyOworCQlicmVhazsKKworCWNhc2UgTUFTSzMoTEVGVF9GSUxMSU5HLCBMRUZUX0NPTlRJRywgUklHSFRfQ09OVElHKToKKwljYXNlIE1BU0szKFJJR0hUX0ZJTExJTkcsIExFRlRfQ09OVElHLCBSSUdIVF9DT05USUcpOgorCWNhc2UgTUFTSzIoTEVGVF9GSUxMSU5HLCBSSUdIVF9DT05USUcpOgorCWNhc2UgTUFTSzIoUklHSFRfRklMTElORywgTEVGVF9DT05USUcpOgorCWNhc2UgTUFTSzIoTEVGVF9DT05USUcsIFJJR0hUX0NPTlRJRyk6CisJY2FzZSBNQVNLKExFRlRfQ09OVElHKToKKwljYXNlIE1BU0soUklHSFRfQ09OVElHKToKKwkJLyoKKwkJICogVGhlc2UgY2FzZXMgYXJlIGFsbCBpbXBvc3NpYmxlLgorCQkgKi8KKwkJQVNTRVJUKDApOworCX0KKwkqY3VycCA9IGN1cjsKK2RvbmU6CisJKmxvZ2ZsYWdzcCA9IHJ2YWw7CisJcmV0dXJuIGVycm9yOworI3VuZGVmCUxFRlQKKyN1bmRlZglSSUdIVAorI3VuZGVmCVBSRVYKKyN1bmRlZglNQVNLCisjdW5kZWYJTUFTSzIKKyN1bmRlZglNQVNLMworI3VuZGVmCU1BU0s0CisjdW5kZWYJU1RBVEVfU0VUCisjdW5kZWYJU1RBVEVfVEVTVAorI3VuZGVmCVNUQVRFX1NFVF9URVNUCisjdW5kZWYJU1dJVENIX1NUQVRFCit9CisKKy8qCisgKiBDYWxsZWQgYnkgeGZzX2JtYXBfYWRkX2V4dGVudCB0byBoYW5kbGUgY2FzZXMgY29udmVydGluZyBhbiB1bndyaXR0ZW4KKyAqIGFsbG9jYXRpb24gdG8gYSByZWFsIGFsbG9jYXRpb24gb3IgdmljZSB2ZXJzYS4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfYWRkX2V4dGVudF91bndyaXR0ZW5fcmVhbCgKKwl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19leHRudW1fdAkJaWR4LAkvKiBleHRlbnQgbnVtYmVyIHRvIHVwZGF0ZS9pbnNlcnQgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJCSoqY3VycCwJLyogaWYgKmN1cnAgaXMgbnVsbCwgbm90IGEgYnRyZWUgKi8KKwl4ZnNfYm1idF9pcmVjX3QJCSpuZXcsCS8qIG5ldyBkYXRhIHRvIHB1dCBpbiBleHRlbnQgbGlzdCAqLworCWludAkJCSpsb2dmbGFnc3ApIC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KK3sKKwl4ZnNfYm1idF9yZWNfdAkJKmJhc2U7CS8qIGJhc2Ugb2YgZXh0ZW50IGVudHJ5IGxpc3QgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXI7CS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19ibWJ0X3JlY190CQkqZXA7CS8qIGV4dGVudCBlbnRyeSBmb3IgaWR4ICovCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworI2lmZGVmIFhGU19CTUFQX1RSQUNFCisJc3RhdGljIGNoYXIJCWZuYW1lW10gPSAieGZzX2JtYXBfYWRkX2V4dGVudF91bndyaXR0ZW5fcmVhbCI7CisjZW5kaWYKKwlpbnQJCQlpOwkvKiB0ZW1wIHN0YXRlICovCisJeGZzX2ZpbGVvZmZfdAkJbmV3X2VuZG9mZjsJLyogZW5kIG9mZnNldCBvZiBuZXcgZW50cnkgKi8KKwl4ZnNfZXhudHN0X3QJCW5ld2V4dDsJLyogbmV3IGV4dGVudCBzdGF0ZSAqLworCXhmc19leG50c3RfdAkJb2xkZXh0OwkvKiBvbGQgZXh0ZW50IHN0YXRlICovCisJeGZzX2JtYnRfaXJlY190CQlyWzNdOwkvKiBuZWlnaGJvciBleHRlbnQgZW50cmllcyAqLworCQkJCQkvKiBsZWZ0IGlzIDAsIHJpZ2h0IGlzIDEsIHByZXYgaXMgMiAqLworCWludAkJCXJ2YWw9MDsJLyogcmV0dXJuIHZhbHVlIChsb2dnaW5nIGZsYWdzKSAqLworCWludAkJCXN0YXRlID0gMDsvKiBzdGF0ZSBiaXRzLCBhY2Nlc3NlZCB0aHJ1IG1hY3JvcyAqLworCWVudW0gewkJCQkvKiBiaXQgbnVtYmVyIGRlZmluaXRpb25zIGZvciBzdGF0ZSAqLworCQlMRUZUX0NPTlRJRywJUklHSFRfQ09OVElHLAorCQlMRUZUX0ZJTExJTkcsCVJJR0hUX0ZJTExJTkcsCisJCUxFRlRfREVMQVksCVJJR0hUX0RFTEFZLAorCQlMRUZUX1ZBTElELAlSSUdIVF9WQUxJRAorCX07CisKKyNkZWZpbmUJTEVGVAkJclswXQorI2RlZmluZQlSSUdIVAkJclsxXQorI2RlZmluZQlQUkVWCQlyWzJdCisjZGVmaW5lCU1BU0soYikJCSgxIDw8IChiKSkKKyNkZWZpbmUJTUFTSzIoYSxiKQkoTUFTSyhhKSB8IE1BU0soYikpCisjZGVmaW5lCU1BU0szKGEsYixjKQkoTUFTSzIoYSxiKSB8IE1BU0soYykpCisjZGVmaW5lCU1BU0s0KGEsYixjLGQpCShNQVNLMyhhLGIsYykgfCBNQVNLKGQpKQorI2RlZmluZQlTVEFURV9TRVQoYix2KQkoKHYpID8gKHN0YXRlIHw9IE1BU0soYikpIDogKHN0YXRlICY9IH5NQVNLKGIpKSkKKyNkZWZpbmUJU1RBVEVfVEVTVChiKQkoc3RhdGUgJiBNQVNLKGIpKQorI2RlZmluZQlTVEFURV9TRVRfVEVTVChiLHYpCSgodikgPyAoKHN0YXRlIHw9IE1BU0soYikpLCAxKSA6IFwKKwkJCQkgICAgICAgKChzdGF0ZSAmPSB+TUFTSyhiKSksIDApKQorI2RlZmluZQlTV0lUQ0hfU1RBVEUJCVwKKwkoc3RhdGUgJiBNQVNLNChMRUZUX0ZJTExJTkcsIFJJR0hUX0ZJTExJTkcsIExFRlRfQ09OVElHLCBSSUdIVF9DT05USUcpKQorCisJLyoKKwkgKiBTZXQgdXAgYSBidW5jaCBvZiB2YXJpYWJsZXMgdG8gbWFrZSB0aGUgdGVzdHMgc2ltcGxlci4KKwkgKi8KKwllcnJvciA9IDA7CisJY3VyID0gKmN1cnA7CisJYmFzZSA9IGlwLT5pX2RmLmlmX3UxLmlmX2V4dGVudHM7CisJZXAgPSAmYmFzZVtpZHhdOworCXhmc19ibWJ0X2dldF9hbGwoZXAsICZQUkVWKTsKKwluZXdleHQgPSBuZXctPmJyX3N0YXRlOworCW9sZGV4dCA9IChuZXdleHQgPT0gWEZTX0VYVF9VTldSSVRURU4pID8KKwkJWEZTX0VYVF9OT1JNIDogWEZTX0VYVF9VTldSSVRURU47CisJQVNTRVJUKFBSRVYuYnJfc3RhdGUgPT0gb2xkZXh0KTsKKwluZXdfZW5kb2ZmID0gbmV3LT5icl9zdGFydG9mZiArIG5ldy0+YnJfYmxvY2tjb3VudDsKKwlBU1NFUlQoUFJFVi5icl9zdGFydG9mZiA8PSBuZXctPmJyX3N0YXJ0b2ZmKTsKKwlBU1NFUlQoUFJFVi5icl9zdGFydG9mZiArIFBSRVYuYnJfYmxvY2tjb3VudCA+PSBuZXdfZW5kb2ZmKTsKKwkvKgorCSAqIFNldCBmbGFncyBkZXRlcm1pbmluZyB3aGF0IHBhcnQgb2YgdGhlIHByZXZpb3VzIG9sZGV4dCBhbGxvY2F0aW9uCisJICogZXh0ZW50IGlzIGJlaW5nIHJlcGxhY2VkIGJ5IGEgbmV3ZXh0IGFsbG9jYXRpb24uCisJICovCisJU1RBVEVfU0VUKExFRlRfRklMTElORywgUFJFVi5icl9zdGFydG9mZiA9PSBuZXctPmJyX3N0YXJ0b2ZmKTsKKwlTVEFURV9TRVQoUklHSFRfRklMTElORywKKwkJUFJFVi5icl9zdGFydG9mZiArIFBSRVYuYnJfYmxvY2tjb3VudCA9PSBuZXdfZW5kb2ZmKTsKKwkvKgorCSAqIENoZWNrIGFuZCBzZXQgZmxhZ3MgaWYgdGhpcyBzZWdtZW50IGhhcyBhIGxlZnQgbmVpZ2hib3IuCisJICogRG9uJ3Qgc2V0IGNvbnRpZ3VvdXMgaWYgdGhlIGNvbWJpbmVkIGV4dGVudCB3b3VsZCBiZSB0b28gbGFyZ2UuCisJICovCisJaWYgKFNUQVRFX1NFVF9URVNUKExFRlRfVkFMSUQsIGlkeCA+IDApKSB7CisJCXhmc19ibWJ0X2dldF9hbGwoZXAgLSAxLCAmTEVGVCk7CisJCVNUQVRFX1NFVChMRUZUX0RFTEFZLCBJU05VTExTVEFSVEJMT0NLKExFRlQuYnJfc3RhcnRibG9jaykpOworCX0KKwlTVEFURV9TRVQoTEVGVF9DT05USUcsCisJCVNUQVRFX1RFU1QoTEVGVF9WQUxJRCkgJiYgIVNUQVRFX1RFU1QoTEVGVF9ERUxBWSkgJiYKKwkJTEVGVC5icl9zdGFydG9mZiArIExFRlQuYnJfYmxvY2tjb3VudCA9PSBuZXctPmJyX3N0YXJ0b2ZmICYmCisJCUxFRlQuYnJfc3RhcnRibG9jayArIExFRlQuYnJfYmxvY2tjb3VudCA9PSBuZXctPmJyX3N0YXJ0YmxvY2sgJiYKKwkJTEVGVC5icl9zdGF0ZSA9PSBuZXdleHQgJiYKKwkJTEVGVC5icl9ibG9ja2NvdW50ICsgbmV3LT5icl9ibG9ja2NvdW50IDw9IE1BWEVYVExFTik7CisJLyoKKwkgKiBDaGVjayBhbmQgc2V0IGZsYWdzIGlmIHRoaXMgc2VnbWVudCBoYXMgYSByaWdodCBuZWlnaGJvci4KKwkgKiBEb24ndCBzZXQgY29udGlndW91cyBpZiB0aGUgY29tYmluZWQgZXh0ZW50IHdvdWxkIGJlIHRvbyBsYXJnZS4KKwkgKiBBbHNvIGNoZWNrIGZvciBhbGwtdGhyZWUtY29udGlndW91cyBiZWluZyB0b28gbGFyZ2UuCisJICovCisJaWYgKFNUQVRFX1NFVF9URVNUKFJJR0hUX1ZBTElELAorCQkJaWR4IDwKKwkJCWlwLT5pX2RmLmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KSAtIDEpKSB7CisJCXhmc19ibWJ0X2dldF9hbGwoZXAgKyAxLCAmUklHSFQpOworCQlTVEFURV9TRVQoUklHSFRfREVMQVksIElTTlVMTFNUQVJUQkxPQ0soUklHSFQuYnJfc3RhcnRibG9jaykpOworCX0KKwlTVEFURV9TRVQoUklHSFRfQ09OVElHLAorCQlTVEFURV9URVNUKFJJR0hUX1ZBTElEKSAmJiAhU1RBVEVfVEVTVChSSUdIVF9ERUxBWSkgJiYKKwkJbmV3X2VuZG9mZiA9PSBSSUdIVC5icl9zdGFydG9mZiAmJgorCQluZXctPmJyX3N0YXJ0YmxvY2sgKyBuZXctPmJyX2Jsb2NrY291bnQgPT0KKwkJICAgIFJJR0hULmJyX3N0YXJ0YmxvY2sgJiYKKwkJbmV3ZXh0ID09IFJJR0hULmJyX3N0YXRlICYmCisJCW5ldy0+YnJfYmxvY2tjb3VudCArIFJJR0hULmJyX2Jsb2NrY291bnQgPD0gTUFYRVhUTEVOICYmCisJCSgoc3RhdGUgJiBNQVNLMyhMRUZUX0NPTlRJRywgTEVGVF9GSUxMSU5HLCBSSUdIVF9GSUxMSU5HKSkgIT0KKwkJICBNQVNLMyhMRUZUX0NPTlRJRywgTEVGVF9GSUxMSU5HLCBSSUdIVF9GSUxMSU5HKSB8fAorCQkgTEVGVC5icl9ibG9ja2NvdW50ICsgbmV3LT5icl9ibG9ja2NvdW50ICsgUklHSFQuYnJfYmxvY2tjb3VudAorCQkgICAgIDw9IE1BWEVYVExFTikpOworCS8qCisJICogU3dpdGNoIG91dCBiYXNlZCBvbiB0aGUgRklMTElORyBhbmQgQ09OVElHIHN0YXRlIGJpdHMuCisJICovCisJc3dpdGNoIChTV0lUQ0hfU1RBVEUpIHsKKworCWNhc2UgTUFTSzQoTEVGVF9GSUxMSU5HLCBSSUdIVF9GSUxMSU5HLCBMRUZUX0NPTlRJRywgUklHSFRfQ09OVElHKToKKwkJLyoKKwkJICogU2V0dGluZyBhbGwgb2YgYSBwcmV2aW91cyBvbGRleHQgZXh0ZW50IHRvIG5ld2V4dC4KKwkJICogVGhlIGxlZnQgYW5kIHJpZ2h0IG5laWdoYm9ycyBhcmUgYm90aCBjb250aWd1b3VzIHdpdGggbmV3LgorCQkgKi8KKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIkxGfFJGfExDfFJDIiwgaXAsIGlkeCAtIDEsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAgLSAxLAorCQkJTEVGVC5icl9ibG9ja2NvdW50ICsgUFJFVi5icl9ibG9ja2NvdW50ICsKKwkJCVJJR0hULmJyX2Jsb2NrY291bnQpOworCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIkxGfFJGfExDfFJDIiwgaXAsIGlkeCAtIDEsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYXBfdHJhY2VfZGVsZXRlKGZuYW1lLCAiTEZ8UkZ8TEN8UkMiLCBpcCwgaWR4LCAyLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWFwX2RlbGV0ZV9leGxpc3QoaXAsIGlkeCwgMiwgWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeCAtIDE7CisJCWlwLT5pX2QuZGlfbmV4dGVudHMgLT0gMjsKKwkJaWYgKGN1ciA9PSBOVUxMKQorCQkJcnZhbCA9IFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19ERVhUOworCQllbHNlIHsKKwkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIFJJR0hULmJyX3N0YXJ0b2ZmLAorCQkJCQlSSUdIVC5icl9zdGFydGJsb2NrLAorCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCAmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlbGV0ZShjdXIsICZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfZGVjcmVtZW50KGN1ciwgMCwgJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9kZWxldGUoY3VyLCAmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgTEVGVC5icl9zdGFydG9mZiwKKwkJCQlMRUZULmJyX3N0YXJ0YmxvY2ssCisJCQkJTEVGVC5icl9ibG9ja2NvdW50ICsgUFJFVi5icl9ibG9ja2NvdW50ICsKKwkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCBMRUZULmJyX3N0YXRlKSkpCisJCQkJZ290byBkb25lOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNQVNLMyhMRUZUX0ZJTExJTkcsIFJJR0hUX0ZJTExJTkcsIExFRlRfQ09OVElHKToKKwkJLyoKKwkJICogU2V0dGluZyBhbGwgb2YgYSBwcmV2aW91cyBvbGRleHQgZXh0ZW50IHRvIG5ld2V4dC4KKwkJICogVGhlIGxlZnQgbmVpZ2hib3IgaXMgY29udGlndW91cywgdGhlIHJpZ2h0IGlzIG5vdC4KKwkJICovCisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJMRnxSRnxMQyIsIGlwLCBpZHggLSAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwIC0gMSwKKwkJCUxFRlQuYnJfYmxvY2tjb3VudCArIFBSRVYuYnJfYmxvY2tjb3VudCk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiTEZ8UkZ8TEMiLCBpcCwgaWR4IC0gMSwKKwkJCVhGU19EQVRBX0ZPUkspOworCQlpcC0+aV9kZi5pZl9sYXN0ZXggPSBpZHggLSAxOworCQl4ZnNfYm1hcF90cmFjZV9kZWxldGUoZm5hbWUsICJMRnxSRnxMQyIsIGlwLCBpZHgsIDEsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYXBfZGVsZXRlX2V4bGlzdChpcCwgaWR4LCAxLCBYRlNfREFUQV9GT1JLKTsKKwkJaXAtPmlfZC5kaV9uZXh0ZW50cy0tOworCQlpZiAoY3VyID09IE5VTEwpCisJCQlydmFsID0gWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0RFWFQ7CisJCWVsc2UgeworCQkJcnZhbCA9IFhGU19JTE9HX0NPUkU7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgUFJFVi5icl9zdGFydG9mZiwKKwkJCQkJUFJFVi5icl9zdGFydGJsb2NrLCBQUkVWLmJyX2Jsb2NrY291bnQsCisJCQkJCSZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfZGVsZXRlKGN1ciwgJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9kZWNyZW1lbnQoY3VyLCAwLCAmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShjdXIsIExFRlQuYnJfc3RhcnRvZmYsCisJCQkJTEVGVC5icl9zdGFydGJsb2NrLAorCQkJCUxFRlQuYnJfYmxvY2tjb3VudCArIFBSRVYuYnJfYmxvY2tjb3VudCwKKwkJCQlMRUZULmJyX3N0YXRlKSkpCisJCQkJZ290byBkb25lOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNQVNLMyhMRUZUX0ZJTExJTkcsIFJJR0hUX0ZJTExJTkcsIFJJR0hUX0NPTlRJRyk6CisJCS8qCisJCSAqIFNldHRpbmcgYWxsIG9mIGEgcHJldmlvdXMgb2xkZXh0IGV4dGVudCB0byBuZXdleHQuCisJCSAqIFRoZSByaWdodCBuZWlnaGJvciBpcyBjb250aWd1b3VzLCB0aGUgbGVmdCBpcyBub3QuCisJCSAqLworCQl4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKGZuYW1lLCAiTEZ8UkZ8UkMiLCBpcCwgaWR4LAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwLAorCQkJUFJFVi5icl9ibG9ja2NvdW50ICsgUklHSFQuYnJfYmxvY2tjb3VudCk7CisJCXhmc19ibWJ0X3NldF9zdGF0ZShlcCwgbmV3ZXh0KTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJMRnxSRnxSQyIsIGlwLCBpZHgsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJaXAtPmlfZGYuaWZfbGFzdGV4ID0gaWR4OworCQl4ZnNfYm1hcF90cmFjZV9kZWxldGUoZm5hbWUsICJMRnxSRnxSQyIsIGlwLCBpZHggKyAxLCAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWFwX2RlbGV0ZV9leGxpc3QoaXAsIGlkeCArIDEsIDEsIFhGU19EQVRBX0ZPUkspOworCQlpcC0+aV9kLmRpX25leHRlbnRzLS07CisJCWlmIChjdXIgPT0gTlVMTCkKKwkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfREVYVDsKKwkJZWxzZSB7CisJCQlydmFsID0gWEZTX0lMT0dfQ09SRTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBSSUdIVC5icl9zdGFydG9mZiwKKwkJCQkJUklHSFQuYnJfc3RhcnRibG9jaywKKwkJCQkJUklHSFQuYnJfYmxvY2tjb3VudCwgJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9kZWxldGUoY3VyLCAmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgbmV3LT5icl9zdGFydG9mZiwKKwkJCQluZXctPmJyX3N0YXJ0YmxvY2ssCisJCQkJbmV3LT5icl9ibG9ja2NvdW50ICsgUklHSFQuYnJfYmxvY2tjb3VudCwKKwkJCQluZXdleHQpKSkKKwkJCQlnb3RvIGRvbmU7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1BU0syKExFRlRfRklMTElORywgUklHSFRfRklMTElORyk6CisJCS8qCisJCSAqIFNldHRpbmcgYWxsIG9mIGEgcHJldmlvdXMgb2xkZXh0IGV4dGVudCB0byBuZXdleHQuCisJCSAqIE5laXRoZXIgdGhlIGxlZnQgbm9yIHJpZ2h0IG5laWdoYm9ycyBhcmUgY29udGlndW91cyB3aXRoCisJCSAqIHRoZSBuZXcgb25lLgorCQkgKi8KKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIkxGfFJGIiwgaXAsIGlkeCwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1idF9zZXRfc3RhdGUoZXAsIG5ld2V4dCk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiTEZ8UkYiLCBpcCwgaWR4LAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeDsKKwkJaWYgKGN1ciA9PSBOVUxMKQorCQkJcnZhbCA9IFhGU19JTE9HX0RFWFQ7CisJCWVsc2UgeworCQkJcnZhbCA9IDA7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgbmV3LT5icl9zdGFydG9mZiwKKwkJCQkJbmV3LT5icl9zdGFydGJsb2NrLCBuZXctPmJyX2Jsb2NrY291bnQsCisJCQkJCSZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgbmV3LT5icl9zdGFydG9mZiwKKwkJCQluZXctPmJyX3N0YXJ0YmxvY2ssIG5ldy0+YnJfYmxvY2tjb3VudCwKKwkJCQluZXdleHQpKSkKKwkJCQlnb3RvIGRvbmU7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1BU0syKExFRlRfRklMTElORywgTEVGVF9DT05USUcpOgorCQkvKgorCQkgKiBTZXR0aW5nIHRoZSBmaXJzdCBwYXJ0IG9mIGEgcHJldmlvdXMgb2xkZXh0IGV4dGVudCB0byBuZXdleHQuCisJCSAqIFRoZSBsZWZ0IG5laWdoYm9yIGlzIGNvbnRpZ3VvdXMuCisJCSAqLworCQl4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKGZuYW1lLCAiTEZ8TEMiLCBpcCwgaWR4IC0gMSwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCAtIDEsCisJCQlMRUZULmJyX2Jsb2NrY291bnQgKyBuZXctPmJyX2Jsb2NrY291bnQpOworCQl4ZnNfYm1idF9zZXRfc3RhcnRvZmYoZXAsCisJCQlQUkVWLmJyX3N0YXJ0b2ZmICsgbmV3LT5icl9ibG9ja2NvdW50KTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJMRnxMQyIsIGlwLCBpZHggLSAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJMRnxMQyIsIGlwLCBpZHgsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsCisJCQluZXctPmJyX3N0YXJ0YmxvY2sgKyBuZXctPmJyX2Jsb2NrY291bnQpOworCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCwKKwkJCVBSRVYuYnJfYmxvY2tjb3VudCAtIG5ldy0+YnJfYmxvY2tjb3VudCk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiTEZ8TEMiLCBpcCwgaWR4LAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeCAtIDE7CisJCWlmIChjdXIgPT0gTlVMTCkKKwkJCXJ2YWwgPSBYRlNfSUxPR19ERVhUOworCQllbHNlIHsKKwkJCXJ2YWwgPSAwOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIFBSRVYuYnJfc3RhcnRvZmYsCisJCQkJCVBSRVYuYnJfc3RhcnRibG9jaywgUFJFVi5icl9ibG9ja2NvdW50LAorCQkJCQkmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShjdXIsCisJCQkJUFJFVi5icl9zdGFydG9mZiArIG5ldy0+YnJfYmxvY2tjb3VudCwKKwkJCQlQUkVWLmJyX3N0YXJ0YmxvY2sgKyBuZXctPmJyX2Jsb2NrY291bnQsCisJCQkJUFJFVi5icl9ibG9ja2NvdW50IC0gbmV3LT5icl9ibG9ja2NvdW50LAorCQkJCW9sZGV4dCkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9kZWNyZW1lbnQoY3VyLCAwLCAmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCWlmICh4ZnNfYm1idF91cGRhdGUoY3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAorCQkJCUxFRlQuYnJfc3RhcnRibG9jaywKKwkJCQlMRUZULmJyX2Jsb2NrY291bnQgKyBuZXctPmJyX2Jsb2NrY291bnQsCisJCQkJTEVGVC5icl9zdGF0ZSkpCisJCQkJZ290byBkb25lOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNQVNLKExFRlRfRklMTElORyk6CisJCS8qCisJCSAqIFNldHRpbmcgdGhlIGZpcnN0IHBhcnQgb2YgYSBwcmV2aW91cyBvbGRleHQgZXh0ZW50IHRvIG5ld2V4dC4KKwkJICogVGhlIGxlZnQgbmVpZ2hib3IgaXMgbm90IGNvbnRpZ3VvdXMuCisJCSAqLworCQl4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKGZuYW1lLCAiTEYiLCBpcCwgaWR4LCBYRlNfREFUQV9GT1JLKTsKKwkJQVNTRVJUKGVwICYmIHhmc19ibWJ0X2dldF9zdGF0ZShlcCkgPT0gb2xkZXh0KTsKKwkJeGZzX2JtYnRfc2V0X3N0YXJ0b2ZmKGVwLCBuZXdfZW5kb2ZmKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAsCisJCQlQUkVWLmJyX2Jsb2NrY291bnQgLSBuZXctPmJyX2Jsb2NrY291bnQpOworCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCwKKwkJCW5ldy0+YnJfc3RhcnRibG9jayArIG5ldy0+YnJfYmxvY2tjb3VudCk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiTEYiLCBpcCwgaWR4LCBYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYXBfdHJhY2VfaW5zZXJ0KGZuYW1lLCAiTEYiLCBpcCwgaWR4LCAxLCBuZXcsIE5VTEwsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYXBfaW5zZXJ0X2V4bGlzdChpcCwgaWR4LCAxLCBuZXcsIFhGU19EQVRBX0ZPUkspOworCQlpcC0+aV9kZi5pZl9sYXN0ZXggPSBpZHg7CisJCWlwLT5pX2QuZGlfbmV4dGVudHMrKzsKKwkJaWYgKGN1ciA9PSBOVUxMKQorCQkJcnZhbCA9IFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19ERVhUOworCQllbHNlIHsKKwkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIFBSRVYuYnJfc3RhcnRvZmYsCisJCQkJCVBSRVYuYnJfc3RhcnRibG9jaywgUFJFVi5icl9ibG9ja2NvdW50LAorCQkJCQkmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShjdXIsCisJCQkJUFJFVi5icl9zdGFydG9mZiArIG5ldy0+YnJfYmxvY2tjb3VudCwKKwkJCQlQUkVWLmJyX3N0YXJ0YmxvY2sgKyBuZXctPmJyX2Jsb2NrY291bnQsCisJCQkJUFJFVi5icl9ibG9ja2NvdW50IC0gbmV3LT5icl9ibG9ja2NvdW50LAorCQkJCW9sZGV4dCkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCWN1ci0+YmNfcmVjLmIgPSAqbmV3OworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2luc2VydChjdXIsICZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1BU0syKFJJR0hUX0ZJTExJTkcsIFJJR0hUX0NPTlRJRyk6CisJCS8qCisJCSAqIFNldHRpbmcgdGhlIGxhc3QgcGFydCBvZiBhIHByZXZpb3VzIG9sZGV4dCBleHRlbnQgdG8gbmV3ZXh0LgorCQkgKiBUaGUgcmlnaHQgbmVpZ2hib3IgaXMgY29udGlndW91cyB3aXRoIHRoZSBuZXcgYWxsb2NhdGlvbi4KKwkJICovCisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJSRnxSQyIsIGlwLCBpZHgsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIlJGfFJDIiwgaXAsIGlkeCArIDEsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAsCisJCQlQUkVWLmJyX2Jsb2NrY291bnQgLSBuZXctPmJyX2Jsb2NrY291bnQpOworCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIlJGfFJDIiwgaXAsIGlkeCwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1idF9zZXRfYWxsZihlcCArIDEsIG5ldy0+YnJfc3RhcnRvZmYsIG5ldy0+YnJfc3RhcnRibG9jaywKKwkJCW5ldy0+YnJfYmxvY2tjb3VudCArIFJJR0hULmJyX2Jsb2NrY291bnQsIG5ld2V4dCk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiUkZ8UkMiLCBpcCwgaWR4ICsgMSwKKwkJCVhGU19EQVRBX0ZPUkspOworCQlpcC0+aV9kZi5pZl9sYXN0ZXggPSBpZHggKyAxOworCQlpZiAoY3VyID09IE5VTEwpCisJCQlydmFsID0gWEZTX0lMT0dfREVYVDsKKwkJZWxzZSB7CisJCQlydmFsID0gMDsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBQUkVWLmJyX3N0YXJ0b2ZmLAorCQkJCQlQUkVWLmJyX3N0YXJ0YmxvY2ssCisJCQkJCVBSRVYuYnJfYmxvY2tjb3VudCwgJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBQUkVWLmJyX3N0YXJ0b2ZmLAorCQkJCVBSRVYuYnJfc3RhcnRibG9jaywKKwkJCQlQUkVWLmJyX2Jsb2NrY291bnQgLSBuZXctPmJyX2Jsb2NrY291bnQsCisJCQkJb2xkZXh0KSkpCisJCQkJZ290byBkb25lOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2luY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQkJZ290byBkb25lOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShjdXIsIG5ldy0+YnJfc3RhcnRvZmYsCisJCQkJbmV3LT5icl9zdGFydGJsb2NrLAorCQkJCW5ldy0+YnJfYmxvY2tjb3VudCArIFJJR0hULmJyX2Jsb2NrY291bnQsCisJCQkJbmV3ZXh0KSkpCisJCQkJZ290byBkb25lOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNQVNLKFJJR0hUX0ZJTExJTkcpOgorCQkvKgorCQkgKiBTZXR0aW5nIHRoZSBsYXN0IHBhcnQgb2YgYSBwcmV2aW91cyBvbGRleHQgZXh0ZW50IHRvIG5ld2V4dC4KKwkJICogVGhlIHJpZ2h0IG5laWdoYm9yIGlzIG5vdCBjb250aWd1b3VzLgorCQkgKi8KKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIlJGIiwgaXAsIGlkeCwgWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwLAorCQkJUFJFVi5icl9ibG9ja2NvdW50IC0gbmV3LT5icl9ibG9ja2NvdW50KTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJSRiIsIGlwLCBpZHgsIFhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1hcF90cmFjZV9pbnNlcnQoZm5hbWUsICJSRiIsIGlwLCBpZHggKyAxLCAxLAorCQkJbmV3LCBOVUxMLCBYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYXBfaW5zZXJ0X2V4bGlzdChpcCwgaWR4ICsgMSwgMSwgbmV3LCBYRlNfREFUQV9GT1JLKTsKKwkJaXAtPmlfZGYuaWZfbGFzdGV4ID0gaWR4ICsgMTsKKwkJaXAtPmlfZC5kaV9uZXh0ZW50cysrOworCQlpZiAoY3VyID09IE5VTEwpCisJCQlydmFsID0gWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0RFWFQ7CisJCWVsc2UgeworCQkJcnZhbCA9IFhGU19JTE9HX0NPUkU7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgUFJFVi5icl9zdGFydG9mZiwKKwkJCQkJUFJFVi5icl9zdGFydGJsb2NrLCBQUkVWLmJyX2Jsb2NrY291bnQsCisJCQkJCSZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgUFJFVi5icl9zdGFydG9mZiwKKwkJCQlQUkVWLmJyX3N0YXJ0YmxvY2ssCisJCQkJUFJFVi5icl9ibG9ja2NvdW50IC0gbmV3LT5icl9ibG9ja2NvdW50LAorCQkJCW9sZGV4dCkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBuZXctPmJyX3N0YXJ0b2ZmLAorCQkJCQluZXctPmJyX3N0YXJ0YmxvY2ssIG5ldy0+YnJfYmxvY2tjb3VudCwKKwkJCQkJJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAwKTsKKwkJCWN1ci0+YmNfcmVjLmIuYnJfc3RhdGUgPSBYRlNfRVhUX05PUk07CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfaW5zZXJ0KGN1ciwgJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMDoKKwkJLyoKKwkJICogU2V0dGluZyB0aGUgbWlkZGxlIHBhcnQgb2YgYSBwcmV2aW91cyBvbGRleHQgZXh0ZW50IHRvCisJCSAqIG5ld2V4dC4gIENvbnRpZ3VpdHkgaXMgaW1wb3NzaWJsZSBoZXJlLgorCQkgKiBPbmUgZXh0ZW50IGJlY29tZXMgdGhyZWUgZXh0ZW50cy4KKwkJICovCisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICIwIiwgaXAsIGlkeCwgWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwLAorCQkJbmV3LT5icl9zdGFydG9mZiAtIFBSRVYuYnJfc3RhcnRvZmYpOworCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIjAiLCBpcCwgaWR4LCBYRlNfREFUQV9GT1JLKTsKKwkJclswXSA9ICpuZXc7CisJCXJbMV0uYnJfc3RhcnRvZmYgPSBuZXdfZW5kb2ZmOworCQlyWzFdLmJyX2Jsb2NrY291bnQgPQorCQkJUFJFVi5icl9zdGFydG9mZiArIFBSRVYuYnJfYmxvY2tjb3VudCAtIG5ld19lbmRvZmY7CisJCXJbMV0uYnJfc3RhcnRibG9jayA9IG5ldy0+YnJfc3RhcnRibG9jayArIG5ldy0+YnJfYmxvY2tjb3VudDsKKwkJclsxXS5icl9zdGF0ZSA9IG9sZGV4dDsKKwkJeGZzX2JtYXBfdHJhY2VfaW5zZXJ0KGZuYW1lLCAiMCIsIGlwLCBpZHggKyAxLCAyLCAmclswXSwgJnJbMV0sCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYXBfaW5zZXJ0X2V4bGlzdChpcCwgaWR4ICsgMSwgMiwgJnJbMF0sIFhGU19EQVRBX0ZPUkspOworCQlpcC0+aV9kZi5pZl9sYXN0ZXggPSBpZHggKyAxOworCQlpcC0+aV9kLmRpX25leHRlbnRzICs9IDI7CisJCWlmIChjdXIgPT0gTlVMTCkKKwkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfREVYVDsKKwkJZWxzZSB7CisJCQlydmFsID0gWEZTX0lMT0dfQ09SRTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBQUkVWLmJyX3N0YXJ0b2ZmLAorCQkJCQlQUkVWLmJyX3N0YXJ0YmxvY2ssIFBSRVYuYnJfYmxvY2tjb3VudCwKKwkJCQkJJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJCS8qIG5ldyByaWdodCBleHRlbnQgLSBvbGRleHQgKi8KKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCByWzFdLmJyX3N0YXJ0b2ZmLAorCQkJCXJbMV0uYnJfc3RhcnRibG9jaywgclsxXS5icl9ibG9ja2NvdW50LAorCQkJCXJbMV0uYnJfc3RhdGUpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQkvKiBuZXcgbGVmdCBleHRlbnQgLSBvbGRleHQgKi8KKwkJCVBSRVYuYnJfYmxvY2tjb3VudCA9CisJCQkJbmV3LT5icl9zdGFydG9mZiAtIFBSRVYuYnJfc3RhcnRvZmY7CisJCQljdXItPmJjX3JlYy5iID0gUFJFVjsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9pbnNlcnQoY3VyLCAmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2luY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQkvKiBuZXcgbWlkZGxlIGV4dGVudCAtIG5ld2V4dCAqLworCQkJY3VyLT5iY19yZWMuYiA9ICpuZXc7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfaW5zZXJ0KGN1ciwgJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUFTSzMoTEVGVF9GSUxMSU5HLCBMRUZUX0NPTlRJRywgUklHSFRfQ09OVElHKToKKwljYXNlIE1BU0szKFJJR0hUX0ZJTExJTkcsIExFRlRfQ09OVElHLCBSSUdIVF9DT05USUcpOgorCWNhc2UgTUFTSzIoTEVGVF9GSUxMSU5HLCBSSUdIVF9DT05USUcpOgorCWNhc2UgTUFTSzIoUklHSFRfRklMTElORywgTEVGVF9DT05USUcpOgorCWNhc2UgTUFTSzIoTEVGVF9DT05USUcsIFJJR0hUX0NPTlRJRyk6CisJY2FzZSBNQVNLKExFRlRfQ09OVElHKToKKwljYXNlIE1BU0soUklHSFRfQ09OVElHKToKKwkJLyoKKwkJICogVGhlc2UgY2FzZXMgYXJlIGFsbCBpbXBvc3NpYmxlLgorCQkgKi8KKwkJQVNTRVJUKDApOworCX0KKwkqY3VycCA9IGN1cjsKK2RvbmU6CisJKmxvZ2ZsYWdzcCA9IHJ2YWw7CisJcmV0dXJuIGVycm9yOworI3VuZGVmCUxFRlQKKyN1bmRlZglSSUdIVAorI3VuZGVmCVBSRVYKKyN1bmRlZglNQVNLCisjdW5kZWYJTUFTSzIKKyN1bmRlZglNQVNLMworI3VuZGVmCU1BU0s0CisjdW5kZWYJU1RBVEVfU0VUCisjdW5kZWYJU1RBVEVfVEVTVAorI3VuZGVmCVNUQVRFX1NFVF9URVNUCisjdW5kZWYJU1dJVENIX1NUQVRFCit9CisKKy8qCisgKiBDYWxsZWQgYnkgeGZzX2JtYXBfYWRkX2V4dGVudCB0byBoYW5kbGUgY2FzZXMgY29udmVydGluZyBhIGhvbGUKKyAqIHRvIGEgZGVsYXllZCBhbGxvY2F0aW9uLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9kZWxheSgKKwl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19leHRudW1fdAkJaWR4LAkvKiBleHRlbnQgbnVtYmVyIHRvIHVwZGF0ZS9pbnNlcnQgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGlmIG51bGwsIG5vdCBhIGJ0cmVlICovCisJeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBwdXQgaW4gZXh0ZW50IGxpc3QgKi8KKwlpbnQJCQkqbG9nZmxhZ3NwLCAvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCisJaW50CQkJcnN2ZCkJCS8qIE9LIHRvIGFsbG9jYXRlIHJlc2VydmVkIGJsb2NrcyAqLworeworCXhmc19ibWJ0X3JlY190CQkqYmFzZTsJLyogYmFzZSBvZiBleHRlbnQgZW50cnkgbGlzdCAqLworCXhmc19ibWJ0X3JlY190CQkqZXA7CS8qIGV4dGVudCBsaXN0IGVudHJ5IGZvciBpZHggKi8KKyNpZmRlZiBYRlNfQk1BUF9UUkFDRQorCXN0YXRpYyBjaGFyCQlmbmFtZVtdID0gInhmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9kZWxheSI7CisjZW5kaWYKKwl4ZnNfYm1idF9pcmVjX3QJCWxlZnQ7CS8qIGxlZnQgbmVpZ2hib3IgZXh0ZW50IGVudHJ5ICovCisJeGZzX2ZpbGJsa3NfdAkJbmV3bGVuPTA7CS8qIG5ldyBpbmRpcmVjdCBzaXplICovCisJeGZzX2ZpbGJsa3NfdAkJb2xkbGVuPTA7CS8qIG9sZCBpbmRpcmVjdCBzaXplICovCisJeGZzX2JtYnRfaXJlY190CQlyaWdodDsJLyogcmlnaHQgbmVpZ2hib3IgZXh0ZW50IGVudHJ5ICovCisJaW50CQkJc3RhdGU7ICAvKiBzdGF0ZSBiaXRzLCBhY2Nlc3NlZCB0aHJ1IG1hY3JvcyAqLworCXhmc19maWxibGtzX3QJCXRlbXA7CS8qIHRlbXAgZm9yIGluZGlyZWN0IGNhbGN1bGF0aW9ucyAqLworCWVudW0gewkJCQkvKiBiaXQgbnVtYmVyIGRlZmluaXRpb25zIGZvciBzdGF0ZSAqLworCQlMRUZUX0NPTlRJRywJUklHSFRfQ09OVElHLAorCQlMRUZUX0RFTEFZLAlSSUdIVF9ERUxBWSwKKwkJTEVGVF9WQUxJRCwJUklHSFRfVkFMSUQKKwl9OworCisjZGVmaW5lCU1BU0soYikJCQkoMSA8PCAoYikpCisjZGVmaW5lCU1BU0syKGEsYikJCShNQVNLKGEpIHwgTUFTSyhiKSkKKyNkZWZpbmUJU1RBVEVfU0VUKGIsdikJCSgodikgPyAoc3RhdGUgfD0gTUFTSyhiKSkgOiAoc3RhdGUgJj0gfk1BU0soYikpKQorI2RlZmluZQlTVEFURV9URVNUKGIpCQkoc3RhdGUgJiBNQVNLKGIpKQorI2RlZmluZQlTVEFURV9TRVRfVEVTVChiLHYpCSgodikgPyAoKHN0YXRlIHw9IE1BU0soYikpLCAxKSA6IFwKKwkJCQkgICAgICAgKChzdGF0ZSAmPSB+TUFTSyhiKSksIDApKQorI2RlZmluZQlTV0lUQ0hfU1RBVEUJCShzdGF0ZSAmIE1BU0syKExFRlRfQ09OVElHLCBSSUdIVF9DT05USUcpKQorCisJYmFzZSA9IGlwLT5pX2RmLmlmX3UxLmlmX2V4dGVudHM7CisJZXAgPSAmYmFzZVtpZHhdOworCXN0YXRlID0gMDsKKwlBU1NFUlQoSVNOVUxMU1RBUlRCTE9DSyhuZXctPmJyX3N0YXJ0YmxvY2spKTsKKwkvKgorCSAqIENoZWNrIGFuZCBzZXQgZmxhZ3MgaWYgdGhpcyBzZWdtZW50IGhhcyBhIGxlZnQgbmVpZ2hib3IKKwkgKi8KKwlpZiAoU1RBVEVfU0VUX1RFU1QoTEVGVF9WQUxJRCwgaWR4ID4gMCkpIHsKKwkJeGZzX2JtYnRfZ2V0X2FsbChlcCAtIDEsICZsZWZ0KTsKKwkJU1RBVEVfU0VUKExFRlRfREVMQVksIElTTlVMTFNUQVJUQkxPQ0sobGVmdC5icl9zdGFydGJsb2NrKSk7CisJfQorCS8qCisJICogQ2hlY2sgYW5kIHNldCBmbGFncyBpZiB0aGUgY3VycmVudCAocmlnaHQpIHNlZ21lbnQgZXhpc3RzLgorCSAqIElmIGl0IGRvZXNuJ3QgZXhpc3QsIHdlJ3JlIGNvbnZlcnRpbmcgdGhlIGhvbGUgYXQgZW5kLW9mLWZpbGUuCisJICovCisJaWYgKFNUQVRFX1NFVF9URVNUKFJJR0hUX1ZBTElELAorCQkJICAgaWR4IDwKKwkJCSAgIGlwLT5pX2RmLmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KSkpIHsKKwkJeGZzX2JtYnRfZ2V0X2FsbChlcCwgJnJpZ2h0KTsKKwkJU1RBVEVfU0VUKFJJR0hUX0RFTEFZLCBJU05VTExTVEFSVEJMT0NLKHJpZ2h0LmJyX3N0YXJ0YmxvY2spKTsKKwl9CisJLyoKKwkgKiBTZXQgY29udGlndWl0eSBmbGFncyBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgbmVpZ2hib3JzLgorCSAqIERvbid0IGxldCBleHRlbnRzIGdldCB0b28gbGFyZ2UsIGV2ZW4gaWYgdGhlIHBpZWNlcyBhcmUgY29udGlndW91cy4KKwkgKi8KKwlTVEFURV9TRVQoTEVGVF9DT05USUcsCisJCVNUQVRFX1RFU1QoTEVGVF9WQUxJRCkgJiYgU1RBVEVfVEVTVChMRUZUX0RFTEFZKSAmJgorCQlsZWZ0LmJyX3N0YXJ0b2ZmICsgbGVmdC5icl9ibG9ja2NvdW50ID09IG5ldy0+YnJfc3RhcnRvZmYgJiYKKwkJbGVmdC5icl9ibG9ja2NvdW50ICsgbmV3LT5icl9ibG9ja2NvdW50IDw9IE1BWEVYVExFTik7CisJU1RBVEVfU0VUKFJJR0hUX0NPTlRJRywKKwkJU1RBVEVfVEVTVChSSUdIVF9WQUxJRCkgJiYgU1RBVEVfVEVTVChSSUdIVF9ERUxBWSkgJiYKKwkJbmV3LT5icl9zdGFydG9mZiArIG5ldy0+YnJfYmxvY2tjb3VudCA9PSByaWdodC5icl9zdGFydG9mZiAmJgorCQluZXctPmJyX2Jsb2NrY291bnQgKyByaWdodC5icl9ibG9ja2NvdW50IDw9IE1BWEVYVExFTiAmJgorCQkoIVNUQVRFX1RFU1QoTEVGVF9DT05USUcpIHx8CisJCSAobGVmdC5icl9ibG9ja2NvdW50ICsgbmV3LT5icl9ibG9ja2NvdW50ICsKKwkJICAgICByaWdodC5icl9ibG9ja2NvdW50IDw9IE1BWEVYVExFTikpKTsKKwkvKgorCSAqIFN3aXRjaCBvdXQgYmFzZWQgb24gdGhlIGNvbnRpZ3VpdHkgZmxhZ3MuCisJICovCisJc3dpdGNoIChTV0lUQ0hfU1RBVEUpIHsKKworCWNhc2UgTUFTSzIoTEVGVF9DT05USUcsIFJJR0hUX0NPTlRJRyk6CisJCS8qCisJCSAqIE5ldyBhbGxvY2F0aW9uIGlzIGNvbnRpZ3VvdXMgd2l0aCBkZWxheWVkIGFsbG9jYXRpb25zCisJCSAqIG9uIHRoZSBsZWZ0IGFuZCBvbiB0aGUgcmlnaHQuCisJCSAqIE1lcmdlIGFsbCB0aHJlZSBpbnRvIGEgc2luZ2xlIGV4dGVudCBsaXN0IGVudHJ5LgorCQkgKi8KKwkJdGVtcCA9IGxlZnQuYnJfYmxvY2tjb3VudCArIG5ldy0+YnJfYmxvY2tjb3VudCArCisJCQlyaWdodC5icl9ibG9ja2NvdW50OworCQl4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKGZuYW1lLCAiTEN8UkMiLCBpcCwgaWR4IC0gMSwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCAtIDEsIHRlbXApOworCQlvbGRsZW4gPSBTVEFSVEJMT0NLVkFMKGxlZnQuYnJfc3RhcnRibG9jaykgKworCQkJU1RBUlRCTE9DS1ZBTChuZXctPmJyX3N0YXJ0YmxvY2spICsKKwkJCVNUQVJUQkxPQ0tWQUwocmlnaHQuYnJfc3RhcnRibG9jayk7CisJCW5ld2xlbiA9IHhmc19ibWFwX3dvcnN0X2luZGxlbihpcCwgdGVtcCk7CisJCXhmc19ibWJ0X3NldF9zdGFydGJsb2NrKGVwIC0gMSwgTlVMTFNUQVJUQkxPQ0soKGludCluZXdsZW4pKTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJMQ3xSQyIsIGlwLCBpZHggLSAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWFwX3RyYWNlX2RlbGV0ZShmbmFtZSwgIkxDfFJDIiwgaXAsIGlkeCwgMSwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1hcF9kZWxldGVfZXhsaXN0KGlwLCBpZHgsIDEsIFhGU19EQVRBX0ZPUkspOworCQlpcC0+aV9kZi5pZl9sYXN0ZXggPSBpZHggLSAxOworCQlicmVhazsKKworCWNhc2UgTUFTSyhMRUZUX0NPTlRJRyk6CisJCS8qCisJCSAqIE5ldyBhbGxvY2F0aW9uIGlzIGNvbnRpZ3VvdXMgd2l0aCBhIGRlbGF5ZWQgYWxsb2NhdGlvbgorCQkgKiBvbiB0aGUgbGVmdC4KKwkJICogTWVyZ2UgdGhlIG5ldyBhbGxvY2F0aW9uIHdpdGggdGhlIGxlZnQgbmVpZ2hib3IuCisJCSAqLworCQl0ZW1wID0gbGVmdC5icl9ibG9ja2NvdW50ICsgbmV3LT5icl9ibG9ja2NvdW50OworCQl4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKGZuYW1lLCAiTEMiLCBpcCwgaWR4IC0gMSwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCAtIDEsIHRlbXApOworCQlvbGRsZW4gPSBTVEFSVEJMT0NLVkFMKGxlZnQuYnJfc3RhcnRibG9jaykgKworCQkJU1RBUlRCTE9DS1ZBTChuZXctPmJyX3N0YXJ0YmxvY2spOworCQluZXdsZW4gPSB4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIHRlbXApOworCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCAtIDEsIE5VTExTVEFSVEJMT0NLKChpbnQpbmV3bGVuKSk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiTEMiLCBpcCwgaWR4IC0gMSwKKwkJCVhGU19EQVRBX0ZPUkspOworCQlpcC0+aV9kZi5pZl9sYXN0ZXggPSBpZHggLSAxOworCQlicmVhazsKKworCWNhc2UgTUFTSyhSSUdIVF9DT05USUcpOgorCQkvKgorCQkgKiBOZXcgYWxsb2NhdGlvbiBpcyBjb250aWd1b3VzIHdpdGggYSBkZWxheWVkIGFsbG9jYXRpb24KKwkJICogb24gdGhlIHJpZ2h0LgorCQkgKiBNZXJnZSB0aGUgbmV3IGFsbG9jYXRpb24gd2l0aCB0aGUgcmlnaHQgbmVpZ2hib3IuCisJCSAqLworCQl4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKGZuYW1lLCAiUkMiLCBpcCwgaWR4LCBYRlNfREFUQV9GT1JLKTsKKwkJdGVtcCA9IG5ldy0+YnJfYmxvY2tjb3VudCArIHJpZ2h0LmJyX2Jsb2NrY291bnQ7CisJCW9sZGxlbiA9IFNUQVJUQkxPQ0tWQUwobmV3LT5icl9zdGFydGJsb2NrKSArCisJCQlTVEFSVEJMT0NLVkFMKHJpZ2h0LmJyX3N0YXJ0YmxvY2spOworCQluZXdsZW4gPSB4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIHRlbXApOworCQl4ZnNfYm1idF9zZXRfYWxsZihlcCwgbmV3LT5icl9zdGFydG9mZiwKKwkJCU5VTExTVEFSVEJMT0NLKChpbnQpbmV3bGVuKSwgdGVtcCwgcmlnaHQuYnJfc3RhdGUpOworCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIlJDIiwgaXAsIGlkeCwgWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeDsKKwkJYnJlYWs7CisKKwljYXNlIDA6CisJCS8qCisJCSAqIE5ldyBhbGxvY2F0aW9uIGlzIG5vdCBjb250aWd1b3VzIHdpdGggYW5vdGhlcgorCQkgKiBkZWxheWVkIGFsbG9jYXRpb24uCisJCSAqIEluc2VydCBhIG5ldyBlbnRyeS4KKwkJICovCisJCW9sZGxlbiA9IG5ld2xlbiA9IDA7CisJCXhmc19ibWFwX3RyYWNlX2luc2VydChmbmFtZSwgIjAiLCBpcCwgaWR4LCAxLCBuZXcsIE5VTEwsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYXBfaW5zZXJ0X2V4bGlzdChpcCwgaWR4LCAxLCBuZXcsIFhGU19EQVRBX0ZPUkspOworCQlpcC0+aV9kZi5pZl9sYXN0ZXggPSBpZHg7CisJCWJyZWFrOworCX0KKwlpZiAob2xkbGVuICE9IG5ld2xlbikgeworCQlBU1NFUlQob2xkbGVuID4gbmV3bGVuKTsKKwkJeGZzX21vZF9pbmNvcmVfc2IoaXAtPmlfbW91bnQsIFhGU19TQlNfRkRCTE9DS1MsCisJCQkoaW50KShvbGRsZW4gLSBuZXdsZW4pLCByc3ZkKTsKKwkJLyoKKwkJICogTm90aGluZyB0byBkbyBmb3IgZGlzayBxdW90YSBhY2NvdW50aW5nIGhlcmUuCisJCSAqLworCX0KKwkqbG9nZmxhZ3NwID0gMDsKKwlyZXR1cm4gMDsKKyN1bmRlZglNQVNLCisjdW5kZWYJTUFTSzIKKyN1bmRlZglTVEFURV9TRVQKKyN1bmRlZglTVEFURV9URVNUCisjdW5kZWYJU1RBVEVfU0VUX1RFU1QKKyN1bmRlZglTV0lUQ0hfU1RBVEUKK30KKworLyoKKyAqIENhbGxlZCBieSB4ZnNfYm1hcF9hZGRfZXh0ZW50IHRvIGhhbmRsZSBjYXNlcyBjb252ZXJ0aW5nIGEgaG9sZQorICogdG8gYSByZWFsIGFsbG9jYXRpb24uCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9yZWFsKAorCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CQlpZHgsCS8qIGV4dGVudCBudW1iZXIgdG8gdXBkYXRlL2luc2VydCAqLworCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogaWYgbnVsbCwgbm90IGEgYnRyZWUgKi8KKwl4ZnNfYm1idF9pcmVjX3QJCSpuZXcsCS8qIG5ldyBkYXRhIHRvIHB1dCBpbiBleHRlbnQgbGlzdCAqLworCWludAkJCSpsb2dmbGFnc3AsIC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KKwlpbnQJCQl3aGljaGZvcmspIC8qIGRhdGEgb3IgYXR0ciBmb3JrICovCit7CisJeGZzX2JtYnRfcmVjX3QJCSplcDsJLyogcG9pbnRlciB0byBleHRlbnQgZW50cnkgaW5zLiBwb2ludCAqLworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKyNpZmRlZiBYRlNfQk1BUF9UUkFDRQorCXN0YXRpYyBjaGFyCQlmbmFtZVtdID0gInhmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9yZWFsIjsKKyNlbmRpZgorCWludAkJCWk7CS8qIHRlbXAgc3RhdGUgKi8KKwl4ZnNfaWZvcmtfdAkJKmlmcDsJLyogaW5vZGUgZm9yayBwb2ludGVyICovCisJeGZzX2JtYnRfaXJlY190CQlsZWZ0OwkvKiBsZWZ0IG5laWdoYm9yIGV4dGVudCBlbnRyeSAqLworCXhmc19ibWJ0X2lyZWNfdAkJcmlnaHQ7CS8qIHJpZ2h0IG5laWdoYm9yIGV4dGVudCBlbnRyeSAqLworCWludAkJCXN0YXRlOwkvKiBzdGF0ZSBiaXRzLCBhY2Nlc3NlZCB0aHJ1IG1hY3JvcyAqLworCWVudW0gewkJCQkvKiBiaXQgbnVtYmVyIGRlZmluaXRpb25zIGZvciBzdGF0ZSAqLworCQlMRUZUX0NPTlRJRywJUklHSFRfQ09OVElHLAorCQlMRUZUX0RFTEFZLAlSSUdIVF9ERUxBWSwKKwkJTEVGVF9WQUxJRCwJUklHSFRfVkFMSUQKKwl9OworCisjZGVmaW5lCU1BU0soYikJCQkoMSA8PCAoYikpCisjZGVmaW5lCU1BU0syKGEsYikJCShNQVNLKGEpIHwgTUFTSyhiKSkKKyNkZWZpbmUJU1RBVEVfU0VUKGIsdikJCSgodikgPyAoc3RhdGUgfD0gTUFTSyhiKSkgOiAoc3RhdGUgJj0gfk1BU0soYikpKQorI2RlZmluZQlTVEFURV9URVNUKGIpCQkoc3RhdGUgJiBNQVNLKGIpKQorI2RlZmluZQlTVEFURV9TRVRfVEVTVChiLHYpCSgodikgPyAoKHN0YXRlIHw9IE1BU0soYikpLCAxKSA6IFwKKwkJCQkgICAgICAgKChzdGF0ZSAmPSB+TUFTSyhiKSksIDApKQorI2RlZmluZQlTV0lUQ0hfU1RBVEUJCShzdGF0ZSAmIE1BU0syKExFRlRfQ09OVElHLCBSSUdIVF9DT05USUcpKQorCisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwlBU1NFUlQoaWR4IDw9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpKTsKKwllcCA9ICZpZnAtPmlmX3UxLmlmX2V4dGVudHNbaWR4XTsKKwlzdGF0ZSA9IDA7CisJLyoKKwkgKiBDaGVjayBhbmQgc2V0IGZsYWdzIGlmIHRoaXMgc2VnbWVudCBoYXMgYSBsZWZ0IG5laWdoYm9yLgorCSAqLworCWlmIChTVEFURV9TRVRfVEVTVChMRUZUX1ZBTElELCBpZHggPiAwKSkgeworCQl4ZnNfYm1idF9nZXRfYWxsKGVwIC0gMSwgJmxlZnQpOworCQlTVEFURV9TRVQoTEVGVF9ERUxBWSwgSVNOVUxMU1RBUlRCTE9DSyhsZWZ0LmJyX3N0YXJ0YmxvY2spKTsKKwl9CisJLyoKKwkgKiBDaGVjayBhbmQgc2V0IGZsYWdzIGlmIHRoaXMgc2VnbWVudCBoYXMgYSBjdXJyZW50IHZhbHVlLgorCSAqIE5vdCB0cnVlIGlmIHdlJ3JlIGluc2VydGluZyBpbnRvIHRoZSAiaG9sZSIgYXQgZW9mLgorCSAqLworCWlmIChTVEFURV9TRVRfVEVTVChSSUdIVF9WQUxJRCwKKwkJCSAgIGlkeCA8CisJCQkgICBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KSkpIHsKKwkJeGZzX2JtYnRfZ2V0X2FsbChlcCwgJnJpZ2h0KTsKKwkJU1RBVEVfU0VUKFJJR0hUX0RFTEFZLCBJU05VTExTVEFSVEJMT0NLKHJpZ2h0LmJyX3N0YXJ0YmxvY2spKTsKKwl9CisJLyoKKwkgKiBXZSdyZSBpbnNlcnRpbmcgYSByZWFsIGFsbG9jYXRpb24gYmV0d2VlbiAibGVmdCIgYW5kICJyaWdodCIuCisJICogU2V0IHRoZSBjb250aWd1aXR5IGZsYWdzLiAgRG9uJ3QgbGV0IGV4dGVudHMgZ2V0IHRvbyBsYXJnZS4KKwkgKi8KKwlTVEFURV9TRVQoTEVGVF9DT05USUcsCisJCVNUQVRFX1RFU1QoTEVGVF9WQUxJRCkgJiYgIVNUQVRFX1RFU1QoTEVGVF9ERUxBWSkgJiYKKwkJbGVmdC5icl9zdGFydG9mZiArIGxlZnQuYnJfYmxvY2tjb3VudCA9PSBuZXctPmJyX3N0YXJ0b2ZmICYmCisJCWxlZnQuYnJfc3RhcnRibG9jayArIGxlZnQuYnJfYmxvY2tjb3VudCA9PSBuZXctPmJyX3N0YXJ0YmxvY2sgJiYKKwkJbGVmdC5icl9zdGF0ZSA9PSBuZXctPmJyX3N0YXRlICYmCisJCWxlZnQuYnJfYmxvY2tjb3VudCArIG5ldy0+YnJfYmxvY2tjb3VudCA8PSBNQVhFWFRMRU4pOworCVNUQVRFX1NFVChSSUdIVF9DT05USUcsCisJCVNUQVRFX1RFU1QoUklHSFRfVkFMSUQpICYmICFTVEFURV9URVNUKFJJR0hUX0RFTEFZKSAmJgorCQluZXctPmJyX3N0YXJ0b2ZmICsgbmV3LT5icl9ibG9ja2NvdW50ID09IHJpZ2h0LmJyX3N0YXJ0b2ZmICYmCisJCW5ldy0+YnJfc3RhcnRibG9jayArIG5ldy0+YnJfYmxvY2tjb3VudCA9PQorCQkgICAgcmlnaHQuYnJfc3RhcnRibG9jayAmJgorCQluZXctPmJyX3N0YXRlID09IHJpZ2h0LmJyX3N0YXRlICYmCisJCW5ldy0+YnJfYmxvY2tjb3VudCArIHJpZ2h0LmJyX2Jsb2NrY291bnQgPD0gTUFYRVhUTEVOICYmCisJCSghU1RBVEVfVEVTVChMRUZUX0NPTlRJRykgfHwKKwkJIGxlZnQuYnJfYmxvY2tjb3VudCArIG5ldy0+YnJfYmxvY2tjb3VudCArCisJCSAgICAgcmlnaHQuYnJfYmxvY2tjb3VudCA8PSBNQVhFWFRMRU4pKTsKKworCS8qCisJICogU2VsZWN0IHdoaWNoIGNhc2Ugd2UncmUgaW4gaGVyZSwgYW5kIGltcGxlbWVudCBpdC4KKwkgKi8KKwlzd2l0Y2ggKFNXSVRDSF9TVEFURSkgeworCisJY2FzZSBNQVNLMihMRUZUX0NPTlRJRywgUklHSFRfQ09OVElHKToKKwkJLyoKKwkJICogTmV3IGFsbG9jYXRpb24gaXMgY29udGlndW91cyB3aXRoIHJlYWwgYWxsb2NhdGlvbnMgb24gdGhlCisJCSAqIGxlZnQgYW5kIG9uIHRoZSByaWdodC4KKwkJICogTWVyZ2UgYWxsIHRocmVlIGludG8gYSBzaW5nbGUgZXh0ZW50IGxpc3QgZW50cnkuCisJCSAqLworCQl4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKGZuYW1lLCAiTEN8UkMiLCBpcCwgaWR4IC0gMSwKKwkJCXdoaWNoZm9yayk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwIC0gMSwKKwkJCWxlZnQuYnJfYmxvY2tjb3VudCArIG5ldy0+YnJfYmxvY2tjb3VudCArCisJCQlyaWdodC5icl9ibG9ja2NvdW50KTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJMQ3xSQyIsIGlwLCBpZHggLSAxLAorCQkJd2hpY2hmb3JrKTsKKwkJeGZzX2JtYXBfdHJhY2VfZGVsZXRlKGZuYW1lLCAiTEN8UkMiLCBpcCwKKwkJCWlkeCwgMSwgd2hpY2hmb3JrKTsKKwkJeGZzX2JtYXBfZGVsZXRlX2V4bGlzdChpcCwgaWR4LCAxLCB3aGljaGZvcmspOworCQlpZnAtPmlmX2xhc3RleCA9IGlkeCAtIDE7CisJCVhGU19JRk9SS19ORVhUX1NFVChpcCwgd2hpY2hmb3JrLAorCQkJWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspIC0gMSk7CisJCWlmIChjdXIgPT0gTlVMTCkgeworCQkJKmxvZ2ZsYWdzcCA9IFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19GRVhUKHdoaWNoZm9yayk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkqbG9nZmxhZ3NwID0gWEZTX0lMT0dfQ09SRTsKKwkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIHJpZ2h0LmJyX3N0YXJ0b2ZmLAorCQkJCXJpZ2h0LmJyX3N0YXJ0YmxvY2ssIHJpZ2h0LmJyX2Jsb2NrY291bnQsICZpKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCUFTU0VSVChpID09IDEpOworCQlpZiAoKGVycm9yID0geGZzX2JtYnRfZGVsZXRlKGN1ciwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJQVNTRVJUKGkgPT0gMSk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9kZWNyZW1lbnQoY3VyLCAwLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQlBU1NFUlQoaSA9PSAxKTsKKwkJZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBsZWZ0LmJyX3N0YXJ0b2ZmLAorCQkJCWxlZnQuYnJfc3RhcnRibG9jaywKKwkJCQlsZWZ0LmJyX2Jsb2NrY291bnQgKyBuZXctPmJyX2Jsb2NrY291bnQgKworCQkJCXJpZ2h0LmJyX2Jsb2NrY291bnQsIGxlZnQuYnJfc3RhdGUpOworCQlyZXR1cm4gZXJyb3I7CisKKwljYXNlIE1BU0soTEVGVF9DT05USUcpOgorCQkvKgorCQkgKiBOZXcgYWxsb2NhdGlvbiBpcyBjb250aWd1b3VzIHdpdGggYSByZWFsIGFsbG9jYXRpb24KKwkJICogb24gdGhlIGxlZnQuCisJCSAqIE1lcmdlIHRoZSBuZXcgYWxsb2NhdGlvbiB3aXRoIHRoZSBsZWZ0IG5laWdoYm9yLgorCQkgKi8KKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIkxDIiwgaXAsIGlkeCAtIDEsIHdoaWNoZm9yayk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwIC0gMSwKKwkJCWxlZnQuYnJfYmxvY2tjb3VudCArIG5ldy0+YnJfYmxvY2tjb3VudCk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiTEMiLCBpcCwgaWR4IC0gMSwgd2hpY2hmb3JrKTsKKwkJaWZwLT5pZl9sYXN0ZXggPSBpZHggLSAxOworCQlpZiAoY3VyID09IE5VTEwpIHsKKwkJCSpsb2dmbGFnc3AgPSBYRlNfSUxPR19GRVhUKHdoaWNoZm9yayk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkqbG9nZmxhZ3NwID0gMDsKKwkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIGxlZnQuYnJfc3RhcnRvZmYsCisJCQkJbGVmdC5icl9zdGFydGJsb2NrLCBsZWZ0LmJyX2Jsb2NrY291bnQsICZpKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCUFTU0VSVChpID09IDEpOworCQllcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShjdXIsIGxlZnQuYnJfc3RhcnRvZmYsCisJCQkJbGVmdC5icl9zdGFydGJsb2NrLAorCQkJCWxlZnQuYnJfYmxvY2tjb3VudCArIG5ldy0+YnJfYmxvY2tjb3VudCwKKwkJCQlsZWZ0LmJyX3N0YXRlKTsKKwkJcmV0dXJuIGVycm9yOworCisJY2FzZSBNQVNLKFJJR0hUX0NPTlRJRyk6CisJCS8qCisJCSAqIE5ldyBhbGxvY2F0aW9uIGlzIGNvbnRpZ3VvdXMgd2l0aCBhIHJlYWwgYWxsb2NhdGlvbgorCQkgKiBvbiB0aGUgcmlnaHQuCisJCSAqIE1lcmdlIHRoZSBuZXcgYWxsb2NhdGlvbiB3aXRoIHRoZSByaWdodCBuZWlnaGJvci4KKwkJICovCisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJSQyIsIGlwLCBpZHgsIHdoaWNoZm9yayk7CisJCXhmc19ibWJ0X3NldF9hbGxmKGVwLCBuZXctPmJyX3N0YXJ0b2ZmLCBuZXctPmJyX3N0YXJ0YmxvY2ssCisJCQluZXctPmJyX2Jsb2NrY291bnQgKyByaWdodC5icl9ibG9ja2NvdW50LAorCQkJcmlnaHQuYnJfc3RhdGUpOworCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIlJDIiwgaXAsIGlkeCwgd2hpY2hmb3JrKTsKKwkJaWZwLT5pZl9sYXN0ZXggPSBpZHg7CisJCWlmIChjdXIgPT0gTlVMTCkgeworCQkJKmxvZ2ZsYWdzcCA9IFhGU19JTE9HX0ZFWFQod2hpY2hmb3JrKTsKKwkJCXJldHVybiAwOworCQl9CisJCSpsb2dmbGFnc3AgPSAwOworCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgcmlnaHQuYnJfc3RhcnRvZmYsCisJCQkJcmlnaHQuYnJfc3RhcnRibG9jaywgcmlnaHQuYnJfYmxvY2tjb3VudCwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJQVNTRVJUKGkgPT0gMSk7CisJCWVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgbmV3LT5icl9zdGFydG9mZiwKKwkJCQluZXctPmJyX3N0YXJ0YmxvY2ssCisJCQkJbmV3LT5icl9ibG9ja2NvdW50ICsgcmlnaHQuYnJfYmxvY2tjb3VudCwKKwkJCQlyaWdodC5icl9zdGF0ZSk7CisJCXJldHVybiBlcnJvcjsKKworCWNhc2UgMDoKKwkJLyoKKwkJICogTmV3IGFsbG9jYXRpb24gaXMgbm90IGNvbnRpZ3VvdXMgd2l0aCBhbm90aGVyCisJCSAqIHJlYWwgYWxsb2NhdGlvbi4KKwkJICogSW5zZXJ0IGEgbmV3IGVudHJ5LgorCQkgKi8KKwkJeGZzX2JtYXBfdHJhY2VfaW5zZXJ0KGZuYW1lLCAiMCIsIGlwLCBpZHgsIDEsIG5ldywgTlVMTCwKKwkJCXdoaWNoZm9yayk7CisJCXhmc19ibWFwX2luc2VydF9leGxpc3QoaXAsIGlkeCwgMSwgbmV3LCB3aGljaGZvcmspOworCQlpZnAtPmlmX2xhc3RleCA9IGlkeDsKKwkJWEZTX0lGT1JLX05FWFRfU0VUKGlwLCB3aGljaGZvcmssCisJCQlYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgKyAxKTsKKwkJaWYgKGN1ciA9PSBOVUxMKSB7CisJCQkqbG9nZmxhZ3NwID0gWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0ZFWFQod2hpY2hmb3JrKTsKKwkJCXJldHVybiAwOworCQl9CisJCSpsb2dmbGFnc3AgPSBYRlNfSUxPR19DT1JFOworCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgbmV3LT5icl9zdGFydG9mZiwKKwkJCQluZXctPmJyX3N0YXJ0YmxvY2ssIG5ldy0+YnJfYmxvY2tjb3VudCwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJQVNTRVJUKGkgPT0gMCk7CisJCWN1ci0+YmNfcmVjLmIuYnJfc3RhdGUgPSBuZXctPmJyX3N0YXRlOworCQlpZiAoKGVycm9yID0geGZzX2JtYnRfaW5zZXJ0KGN1ciwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJQVNTRVJUKGkgPT0gMSk7CisJCXJldHVybiAwOworCX0KKyN1bmRlZglNQVNLCisjdW5kZWYJTUFTSzIKKyN1bmRlZglTVEFURV9TRVQKKyN1bmRlZglTVEFURV9URVNUCisjdW5kZWYJU1RBVEVfU0VUX1RFU1QKKyN1bmRlZglTV0lUQ0hfU1RBVEUKKwkvKiBOT1RSRUFDSEVEICovCisJQVNTRVJUKDApOworCXJldHVybiAwOyAvKiBrZWVwIGdjYyBxdWl0ZSAqLworfQorCisjZGVmaW5lIFhGU19BTExPQ19HQVBfVU5JVFMJNAorCisvKgorICogeGZzX2JtYXBfYWxsb2MgaXMgY2FsbGVkIGJ5IHhmc19ibWFwaSB0byBhbGxvY2F0ZSBhbiBleHRlbnQgZm9yIGEgZmlsZS4KKyAqIEl0IGZpZ3VyZXMgb3V0IHdoZXJlIHRvIGFzayB0aGUgdW5kZXJseWluZyBhbGxvY2F0b3IgdG8gcHV0IHRoZSBuZXcgZXh0ZW50LgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9hbGxvYygKKwl4ZnNfYm1hbGxvY2FfdAkqYXApCQkvKiBibWFwIGFsbG9jIGFyZ3VtZW50IHN0cnVjdCAqLworeworCXhmc19mc2Jsb2NrX3QJYWRqdXN0OwkJLyogYWRqdXN0bWVudCB0byBibG9jayBudW1iZXJzICovCisJeGZzX2FsbG9jdHlwZV90CWF0eXBlPTA7CS8qIHR5cGUgZm9yIGFsbG9jYXRpb24gcm91dGluZXMgKi8KKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX2FnbnVtYmVyX3QJZmJfYWdubzsJLyogYWcgbnVtYmVyIG9mIGFwLT5maXJzdGJsb2NrICovCisJeGZzX21vdW50X3QJKm1wOwkJLyogbW91bnQgcG9pbnQgc3RydWN0dXJlICovCisJaW50CQludWxsZmI7CQkvKiB0cnVlIGlmIGFwLT5maXJzdGJsb2NrIGlzbid0IHNldCAqLworCWludAkJcnQ7CQkvKiB0cnVlIGlmIGlub2RlIGlzIHJlYWx0aW1lICovCisjaWZkZWYgX19LRVJORUxfXworCXhmc19leHRsZW5fdAlwcm9kPTA7CQkvKiBwcm9kdWN0IGZhY3RvciBmb3IgYWxsb2NhdG9ycyAqLworCXhmc19leHRsZW5fdAlyYWxlbj0wOwkvKiByZWFsdGltZSBhbGxvY2F0aW9uIGxlbmd0aCAqLworI2VuZGlmCisKKyNkZWZpbmUJSVNWQUxJRCh4LHkpCVwKKwkocnQgPyBcCisJCSh4KSA8IG1wLT5tX3NiLnNiX3JibG9ja3MgOiBcCisJCVhGU19GU0JfVE9fQUdOTyhtcCwgeCkgPT0gWEZTX0ZTQl9UT19BR05PKG1wLCB5KSAmJiBcCisJCVhGU19GU0JfVE9fQUdOTyhtcCwgeCkgPCBtcC0+bV9zYi5zYl9hZ2NvdW50ICYmIFwKKwkJWEZTX0ZTQl9UT19BR0JOTyhtcCwgeCkgPCBtcC0+bV9zYi5zYl9hZ2Jsb2NrcykKKworCS8qCisJICogU2V0IHVwIHZhcmlhYmxlcy4KKwkgKi8KKwltcCA9IGFwLT5pcC0+aV9tb3VudDsKKwludWxsZmIgPSBhcC0+Zmlyc3RibG9jayA9PSBOVUxMRlNCTE9DSzsKKwlydCA9IFhGU19JU19SRUFMVElNRV9JTk9ERShhcC0+aXApICYmIGFwLT51c2VyZGF0YTsKKwlmYl9hZ25vID0gbnVsbGZiID8gTlVMTEFHTlVNQkVSIDogWEZTX0ZTQl9UT19BR05PKG1wLCBhcC0+Zmlyc3RibG9jayk7CisjaWZkZWYgX19LRVJORUxfXworCWlmIChydCkgeworCQl4ZnNfZXh0bGVuX3QJZXh0c3o7CQkvKiBmaWxlIGV4dGVudCBzaXplIGZvciBydCAqLworCQl4ZnNfZmlsZW9mZl90CW5leHRvOwkJLyogbmV4dCBmaWxlIG9mZnNldCAqLworCQl4ZnNfZXh0bGVuX3QJb3JpZ19hbGVuOwkvKiBvcmlnaW5hbCBhcC0+YWxlbiAqLworCQl4ZnNfZmlsZW9mZl90CW9yaWdfZW5kOwkvKiBvcmlnaW5hbCBvZmYrbGVuICovCisJCXhmc19maWxlb2ZmX3QJb3JpZ19vZmY7CS8qIG9yaWdpbmFsIGFwLT5vZmYgKi8KKwkJeGZzX2V4dGxlbl90CW1vZF9vZmY7CS8qIG1vZHVsdXMgY2FsY3VsYXRpb25zICovCisJCXhmc19maWxlb2ZmX3QJcHJldm87CQkvKiBwcmV2aW91cyBmaWxlIG9mZnNldCAqLworCQl4ZnNfcnRibG9ja190CXJ0eDsJCS8qIHJlYWx0aW1lIGV4dGVudCBudW1iZXIgKi8KKwkJeGZzX2V4dGxlbl90CXRlbXA7CQkvKiB0ZW1wIGZvciBydCBjYWxjdWxhdGlvbnMgKi8KKworCQkvKgorCQkgKiBTZXQgcHJvZCB0byBtYXRjaCB0aGUgcmVhbHRpbWUgZXh0ZW50IHNpemUuCisJCSAqLworCQlpZiAoIShleHRzeiA9IGFwLT5pcC0+aV9kLmRpX2V4dHNpemUpKQorCQkJZXh0c3ogPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKKwkJcHJvZCA9IGV4dHN6IC8gbXAtPm1fc2Iuc2JfcmV4dHNpemU7CisJCW9yaWdfb2ZmID0gYXAtPm9mZjsKKwkJb3JpZ19hbGVuID0gYXAtPmFsZW47CisJCW9yaWdfZW5kID0gb3JpZ19vZmYgKyBvcmlnX2FsZW47CisJCS8qCisJCSAqIElmIHRoZSBmaWxlIG9mZnNldCBpcyB1bmFsaWduZWQgdnMuIHRoZSBleHRlbnQgc2l6ZQorCQkgKiB3ZSBuZWVkIHRvIGFsaWduIGl0LiAgVGhpcyB3aWxsIGJlIHBvc3NpYmxlIHVubGVzcworCQkgKiB0aGUgZmlsZSB3YXMgcHJldmlvdXNseSB3cml0dGVuIHdpdGggYSBrZXJuZWwgdGhhdCBkaWRuJ3QKKwkJICogcGVyZm9ybSB0aGlzIGFsaWdubWVudC4KKwkJICovCisJCW1vZF9vZmYgPSBkb19tb2Qob3JpZ19vZmYsIGV4dHN6KTsKKwkJaWYgKG1vZF9vZmYpIHsKKwkJCWFwLT5hbGVuICs9IG1vZF9vZmY7CisJCQlhcC0+b2ZmIC09IG1vZF9vZmY7CisJCX0KKwkJLyoKKwkJICogU2FtZSBhZGp1c3RtZW50IGZvciB0aGUgZW5kIG9mIHRoZSByZXF1ZXN0ZWQgYXJlYS4KKwkJICovCisJCWlmICgodGVtcCA9IChhcC0+YWxlbiAlIGV4dHN6KSkpCisJCQlhcC0+YWxlbiArPSBleHRzeiAtIHRlbXA7CisJCS8qCisJCSAqIElmIHRoZSBwcmV2aW91cyBibG9jayBvdmVybGFwcyB3aXRoIHRoaXMgcHJvcG9zZWQgYWxsb2NhdGlvbgorCQkgKiB0aGVuIG1vdmUgdGhlIHN0YXJ0IGZvcndhcmQgd2l0aG91dCBhZGp1c3RpbmcgdGhlIGxlbmd0aC4KKwkJICovCisJCXByZXZvID0KKwkJCWFwLT5wcmV2cC0+YnJfc3RhcnRvZmYgPT0gTlVMTEZJTEVPRkYgPworCQkJCTAgOgorCQkJCShhcC0+cHJldnAtPmJyX3N0YXJ0b2ZmICsKKwkJCQkgYXAtPnByZXZwLT5icl9ibG9ja2NvdW50KTsKKwkJaWYgKGFwLT5vZmYgIT0gb3JpZ19vZmYgJiYgYXAtPm9mZiA8IHByZXZvKQorCQkJYXAtPm9mZiA9IHByZXZvOworCQkvKgorCQkgKiBJZiB0aGUgbmV4dCBibG9jayBvdmVybGFwcyB3aXRoIHRoaXMgcHJvcG9zZWQgYWxsb2NhdGlvbgorCQkgKiB0aGVuIG1vdmUgdGhlIHN0YXJ0IGJhY2sgd2l0aG91dCBhZGp1c3RpbmcgdGhlIGxlbmd0aCwKKwkJICogYnV0IG5vdCBiZWZvcmUgb2Zmc2V0IDAuCisJCSAqIFRoaXMgbWF5IG9mIGNvdXJzZSBtYWtlIHRoZSBzdGFydCBvdmVybGFwIHByZXZpb3VzIGJsb2NrLAorCQkgKiBhbmQgaWYgd2UgaGl0IHRoZSBvZmZzZXQgMCBsaW1pdCB0aGVuIHRoZSBuZXh0IGJsb2NrCisJCSAqIGNhbiBzdGlsbCBvdmVybGFwIHRvby4KKwkJICovCisJCW5leHRvID0gKGFwLT5lb2YgfHwgYXAtPmdvdHAtPmJyX3N0YXJ0b2ZmID09IE5VTExGSUxFT0ZGKSA/CisJCQlOVUxMRklMRU9GRiA6IGFwLT5nb3RwLT5icl9zdGFydG9mZjsKKwkJaWYgKCFhcC0+ZW9mICYmCisJCSAgICBhcC0+b2ZmICsgYXAtPmFsZW4gIT0gb3JpZ19lbmQgJiYKKwkJICAgIGFwLT5vZmYgKyBhcC0+YWxlbiA+IG5leHRvKQorCQkJYXAtPm9mZiA9IG5leHRvID4gYXAtPmFsZW4gPyBuZXh0byAtIGFwLT5hbGVuIDogMDsKKwkJLyoKKwkJICogSWYgd2UncmUgbm93IG92ZXJsYXBwaW5nIHRoZSBuZXh0IG9yIHByZXZpb3VzIGV4dGVudCB0aGF0CisJCSAqIG1lYW5zIHdlIGNhbid0IGZpdCBhbiBleHRzeiBwaWVjZSBpbiB0aGlzIGhvbGUuICBKdXN0IG1vdmUKKwkJICogdGhlIHN0YXJ0IGZvcndhcmQgdG8gdGhlIGZpcnN0IHZhbGlkIHNwb3QgYW5kIHNldAorCQkgKiB0aGUgbGVuZ3RoIHNvIHdlIGhpdCB0aGUgZW5kLgorCQkgKi8KKwkJaWYgKChhcC0+b2ZmICE9IG9yaWdfb2ZmICYmIGFwLT5vZmYgPCBwcmV2bykgfHwKKwkJICAgIChhcC0+b2ZmICsgYXAtPmFsZW4gIT0gb3JpZ19lbmQgJiYKKwkJICAgICBhcC0+b2ZmICsgYXAtPmFsZW4gPiBuZXh0bykpIHsKKwkJCWFwLT5vZmYgPSBwcmV2bzsKKwkJCWFwLT5hbGVuID0gbmV4dG8gLSBwcmV2bzsKKwkJfQorCQkvKgorCQkgKiBJZiB0aGUgcmVzdWx0IGlzbid0IGEgbXVsdGlwbGUgb2YgcnRleHRlbnRzIHdlIG5lZWQgdG8KKwkJICogcmVtb3ZlIGJsb2NrcyB1bnRpbCBpdCBpcy4KKwkJICovCisJCWlmICgodGVtcCA9IChhcC0+YWxlbiAlIG1wLT5tX3NiLnNiX3JleHRzaXplKSkpIHsKKwkJCS8qCisJCQkgKiBXZSdyZSBub3QgY292ZXJpbmcgdGhlIG9yaWdpbmFsIHJlcXVlc3QsIG9yCisJCQkgKiB3ZSB3b24ndCBiZSBhYmxlIHRvIG9uY2Ugd2UgZml4IHRoZSBsZW5ndGguCisJCQkgKi8KKwkJCWlmIChvcmlnX29mZiA8IGFwLT5vZmYgfHwKKwkJCSAgICBvcmlnX2VuZCA+IGFwLT5vZmYgKyBhcC0+YWxlbiB8fAorCQkJICAgIGFwLT5hbGVuIC0gdGVtcCA8IG9yaWdfYWxlbikKKwkJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJCQkvKgorCQkJICogVHJ5IHRvIGZpeCBpdCBieSBtb3ZpbmcgdGhlIHN0YXJ0IHVwLgorCQkJICovCisJCQlpZiAoYXAtPm9mZiArIHRlbXAgPD0gb3JpZ19vZmYpIHsKKwkJCQlhcC0+YWxlbiAtPSB0ZW1wOworCQkJCWFwLT5vZmYgKz0gdGVtcDsKKwkJCX0KKwkJCS8qCisJCQkgKiBUcnkgdG8gZml4IGl0IGJ5IG1vdmluZyB0aGUgZW5kIGluLgorCQkJICovCisJCQllbHNlIGlmIChhcC0+b2ZmICsgYXAtPmFsZW4gLSB0ZW1wID49IG9yaWdfZW5kKQorCQkJCWFwLT5hbGVuIC09IHRlbXA7CisJCQkvKgorCQkJICogU2V0IHRoZSBzdGFydCB0byB0aGUgbWluaW11bSB0aGVuIHRyaW0gdGhlIGxlbmd0aC4KKwkJCSAqLworCQkJZWxzZSB7CisJCQkJYXAtPmFsZW4gLT0gb3JpZ19vZmYgLSBhcC0+b2ZmOworCQkJCWFwLT5vZmYgPSBvcmlnX29mZjsKKwkJCQlhcC0+YWxlbiAtPSBhcC0+YWxlbiAlIG1wLT5tX3NiLnNiX3JleHRzaXplOworCQkJfQorCQkJLyoKKwkJCSAqIFJlc3VsdCBkb2Vzbid0IGNvdmVyIHRoZSByZXF1ZXN0LCBmYWlsIGl0LgorCQkJICovCisJCQlpZiAob3JpZ19vZmYgPCBhcC0+b2ZmIHx8IG9yaWdfZW5kID4gYXAtPm9mZiArIGFwLT5hbGVuKQorCQkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwkJfQorCQlBU1NFUlQoYXAtPmFsZW4gJSBtcC0+bV9zYi5zYl9yZXh0c2l6ZSA9PSAwKTsKKwkJLyoKKwkJICogSWYgdGhlIG9mZnNldCAmIGxlbmd0aCBhcmUgbm90IHBlcmZlY3RseSBhbGlnbmVkCisJCSAqIHRoZW4ga2lsbCBwcm9kLCBpdCB3aWxsIGp1c3QgZ2V0IHVzIGluIHRyb3VibGUuCisJCSAqLworCQlpZiAoZG9fbW9kKGFwLT5vZmYsIGV4dHN6KSB8fCBhcC0+YWxlbiAlIGV4dHN6KQorCQkJcHJvZCA9IDE7CisJCS8qCisJCSAqIFNldCByYWxlbiB0byBiZSB0aGUgYWN0dWFsIHJlcXVlc3RlZCBsZW5ndGggaW4gcnRleHRlbnRzLgorCQkgKi8KKwkJcmFsZW4gPSBhcC0+YWxlbiAvIG1wLT5tX3NiLnNiX3JleHRzaXplOworCQkvKgorCQkgKiBJZiB0aGUgb2xkIHZhbHVlIHdhcyBjbG9zZSBlbm91Z2ggdG8gTUFYRVhUTEVOIHRoYXQKKwkJICogd2Ugcm91bmRlZCB1cCB0byBpdCwgY3V0IGl0IGJhY2sgc28gaXQncyB2YWxpZCBhZ2Fpbi4KKwkJICogTm90ZSB0aGF0IGlmIGl0J3MgYSByZWFsbHkgbGFyZ2UgcmVxdWVzdCAoYmlnZ2VyIHRoYW4KKwkJICogTUFYRVhUTEVOKSwgd2UgZG9uJ3QgaGVhciBhYm91dCB0aGF0IG51bWJlciwgYW5kIGNhbid0CisJCSAqIGFkanVzdCB0aGUgc3RhcnRpbmcgcG9pbnQgdG8gbWF0Y2ggaXQuCisJCSAqLworCQlpZiAocmFsZW4gKiBtcC0+bV9zYi5zYl9yZXh0c2l6ZSA+PSBNQVhFWFRMRU4pCisJCQlyYWxlbiA9IE1BWEVYVExFTiAvIG1wLT5tX3NiLnNiX3JleHRzaXplOworCQkvKgorCQkgKiBJZiBpdCdzIGFuIGFsbG9jYXRpb24gdG8gYW4gZW1wdHkgZmlsZSBhdCBvZmZzZXQgMCwKKwkJICogcGljayBhbiBleHRlbnQgdGhhdCB3aWxsIHNwYWNlIHRoaW5ncyBvdXQgaW4gdGhlIHJ0IGFyZWEuCisJCSAqLworCQlpZiAoYXAtPmVvZiAmJiBhcC0+b2ZmID09IDApIHsKKwkJCWVycm9yID0geGZzX3J0cGlja19leHRlbnQobXAsIGFwLT50cCwgcmFsZW4sICZydHgpOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybiBlcnJvcjsKKwkJCWFwLT5ydmFsID0gcnR4ICogbXAtPm1fc2Iuc2JfcmV4dHNpemU7CisJCX0gZWxzZQorCQkJYXAtPnJ2YWwgPSAwOworCX0KKyNlbHNlCisJaWYgKHJ0KQorCQlhcC0+cnZhbCA9IDA7CisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCWVsc2UgaWYgKG51bGxmYikKKwkJYXAtPnJ2YWwgPSBYRlNfSU5PX1RPX0ZTQihtcCwgYXAtPmlwLT5pX2lubyk7CisJZWxzZQorCQlhcC0+cnZhbCA9IGFwLT5maXJzdGJsb2NrOworCS8qCisJICogSWYgYWxsb2NhdGluZyBhdCBlb2YsIGFuZCB0aGVyZSdzIGEgcHJldmlvdXMgcmVhbCBibG9jaywKKwkgKiB0cnkgdG8gdXNlIGl0J3MgbGFzdCBibG9jayBhcyBvdXIgc3RhcnRpbmcgcG9pbnQuCisJICovCisJaWYgKGFwLT5lb2YgJiYgYXAtPnByZXZwLT5icl9zdGFydG9mZiAhPSBOVUxMRklMRU9GRiAmJgorCSAgICAhSVNOVUxMU1RBUlRCTE9DSyhhcC0+cHJldnAtPmJyX3N0YXJ0YmxvY2spICYmCisJICAgIElTVkFMSUQoYXAtPnByZXZwLT5icl9zdGFydGJsb2NrICsgYXAtPnByZXZwLT5icl9ibG9ja2NvdW50LAorCQkgICAgYXAtPnByZXZwLT5icl9zdGFydGJsb2NrKSkgeworCQlhcC0+cnZhbCA9IGFwLT5wcmV2cC0+YnJfc3RhcnRibG9jayArIGFwLT5wcmV2cC0+YnJfYmxvY2tjb3VudDsKKwkJLyoKKwkJICogQWRqdXN0IGZvciB0aGUgZ2FwIGJldHdlZW4gcHJldnAgYW5kIHVzLgorCQkgKi8KKwkJYWRqdXN0ID0gYXAtPm9mZiAtCisJCQkoYXAtPnByZXZwLT5icl9zdGFydG9mZiArIGFwLT5wcmV2cC0+YnJfYmxvY2tjb3VudCk7CisJCWlmIChhZGp1c3QgJiYKKwkJICAgIElTVkFMSUQoYXAtPnJ2YWwgKyBhZGp1c3QsIGFwLT5wcmV2cC0+YnJfc3RhcnRibG9jaykpCisJCQlhcC0+cnZhbCArPSBhZGp1c3Q7CisJfQorCS8qCisJICogSWYgbm90IGF0IGVvZiwgdGhlbiBjb21wYXJlIHRoZSB0d28gbmVpZ2hib3IgYmxvY2tzLgorCSAqIEZpZ3VyZSBvdXQgd2hldGhlciBlaXRoZXIgb25lIGdpdmVzIHVzIGEgZ29vZCBzdGFydGluZyBwb2ludCwKKwkgKiBhbmQgcGljayB0aGUgYmV0dGVyIG9uZS4KKwkgKi8KKwllbHNlIGlmICghYXAtPmVvZikgeworCQl4ZnNfZnNibG9ja190CWdvdGJubzsJCS8qIHJpZ2h0IHNpZGUgYmxvY2sgbnVtYmVyICovCisJCXhmc19mc2Jsb2NrX3QJZ290ZGlmZj0wOwkvKiByaWdodCBzaWRlIGRpZmZlcmVuY2UgKi8KKwkJeGZzX2ZzYmxvY2tfdAlwcmV2Ym5vOwkvKiBsZWZ0IHNpZGUgYmxvY2sgbnVtYmVyICovCisJCXhmc19mc2Jsb2NrX3QJcHJldmRpZmY9MDsJLyogbGVmdCBzaWRlIGRpZmZlcmVuY2UgKi8KKworCQkvKgorCQkgKiBJZiB0aGVyZSdzIGEgcHJldmlvdXMgKGxlZnQpIGJsb2NrLCBzZWxlY3QgYSByZXF1ZXN0ZWQKKwkJICogc3RhcnQgYmxvY2sgYmFzZWQgb24gaXQuCisJCSAqLworCQlpZiAoYXAtPnByZXZwLT5icl9zdGFydG9mZiAhPSBOVUxMRklMRU9GRiAmJgorCQkgICAgIUlTTlVMTFNUQVJUQkxPQ0soYXAtPnByZXZwLT5icl9zdGFydGJsb2NrKSAmJgorCQkgICAgKHByZXZibm8gPSBhcC0+cHJldnAtPmJyX3N0YXJ0YmxvY2sgKworCQkJICAgICAgIGFwLT5wcmV2cC0+YnJfYmxvY2tjb3VudCkgJiYKKwkJICAgIElTVkFMSUQocHJldmJubywgYXAtPnByZXZwLT5icl9zdGFydGJsb2NrKSkgeworCQkJLyoKKwkJCSAqIENhbGN1bGF0ZSBnYXAgdG8gZW5kIG9mIHByZXZpb3VzIGJsb2NrLgorCQkJICovCisJCQlhZGp1c3QgPSBwcmV2ZGlmZiA9IGFwLT5vZmYgLQorCQkJCShhcC0+cHJldnAtPmJyX3N0YXJ0b2ZmICsKKwkJCQkgYXAtPnByZXZwLT5icl9ibG9ja2NvdW50KTsKKwkJCS8qCisJCQkgKiBGaWd1cmUgdGhlIHN0YXJ0YmxvY2sgYmFzZWQgb24gdGhlIHByZXZpb3VzIGJsb2NrJ3MKKwkJCSAqIGVuZCBhbmQgdGhlIGdhcCBzaXplLgorCQkJICogSGV1cmlzdGljIQorCQkJICogSWYgdGhlIGdhcCBpcyBsYXJnZSByZWxhdGl2ZSB0byB0aGUgcGllY2Ugd2UncmUKKwkJCSAqIGFsbG9jYXRpbmcsIG9yIHVzaW5nIGl0IGdpdmVzIHVzIGFuIGludmFsaWQgYmxvY2sKKwkJCSAqIG51bWJlciwgdGhlbiBqdXN0IHVzZSB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyBibG9jay4KKwkJCSAqLworCQkJaWYgKHByZXZkaWZmIDw9IFhGU19BTExPQ19HQVBfVU5JVFMgKiBhcC0+YWxlbiAmJgorCQkJICAgIElTVkFMSUQocHJldmJubyArIHByZXZkaWZmLAorCQkJCSAgICBhcC0+cHJldnAtPmJyX3N0YXJ0YmxvY2spKQorCQkJCXByZXZibm8gKz0gYWRqdXN0OworCQkJZWxzZQorCQkJCXByZXZkaWZmICs9IGFkanVzdDsKKwkJCS8qCisJCQkgKiBJZiB0aGUgZmlyc3RibG9jayBmb3JiaWRzIGl0LCBjYW4ndCB1c2UgaXQsCisJCQkgKiBtdXN0IHVzZSBkZWZhdWx0LgorCQkJICovCisJCQlpZiAoIXJ0ICYmICFudWxsZmIgJiYKKwkJCSAgICBYRlNfRlNCX1RPX0FHTk8obXAsIHByZXZibm8pICE9IGZiX2Fnbm8pCisJCQkJcHJldmJubyA9IE5VTExGU0JMT0NLOworCQl9CisJCS8qCisJCSAqIE5vIHByZXZpb3VzIGJsb2NrIG9yIGNhbid0IGZvbGxvdyBpdCwganVzdCBkZWZhdWx0LgorCQkgKi8KKwkJZWxzZQorCQkJcHJldmJubyA9IE5VTExGU0JMT0NLOworCQkvKgorCQkgKiBJZiB0aGVyZSdzIGEgZm9sbG93aW5nIChyaWdodCkgYmxvY2ssIHNlbGVjdCBhIHJlcXVlc3RlZAorCQkgKiBzdGFydCBibG9jayBiYXNlZCBvbiBpdC4KKwkJICovCisJCWlmICghSVNOVUxMU1RBUlRCTE9DSyhhcC0+Z290cC0+YnJfc3RhcnRibG9jaykpIHsKKwkJCS8qCisJCQkgKiBDYWxjdWxhdGUgZ2FwIHRvIHN0YXJ0IG9mIG5leHQgYmxvY2suCisJCQkgKi8KKwkJCWFkanVzdCA9IGdvdGRpZmYgPSBhcC0+Z290cC0+YnJfc3RhcnRvZmYgLSBhcC0+b2ZmOworCQkJLyoKKwkJCSAqIEZpZ3VyZSB0aGUgc3RhcnRibG9jayBiYXNlZCBvbiB0aGUgbmV4dCBibG9jaydzCisJCQkgKiBzdGFydCBhbmQgdGhlIGdhcCBzaXplLgorCQkJICovCisJCQlnb3Ribm8gPSBhcC0+Z290cC0+YnJfc3RhcnRibG9jazsKKwkJCS8qCisJCQkgKiBIZXVyaXN0aWMhCisJCQkgKiBJZiB0aGUgZ2FwIGlzIGxhcmdlIHJlbGF0aXZlIHRvIHRoZSBwaWVjZSB3ZSdyZQorCQkJICogYWxsb2NhdGluZywgb3IgdXNpbmcgaXQgZ2l2ZXMgdXMgYW4gaW52YWxpZCBibG9jaworCQkJICogbnVtYmVyLCB0aGVuIGp1c3QgdXNlIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBibG9jaworCQkJICogb2Zmc2V0IGJ5IG91ciBsZW5ndGguCisJCQkgKi8KKwkJCWlmIChnb3RkaWZmIDw9IFhGU19BTExPQ19HQVBfVU5JVFMgKiBhcC0+YWxlbiAmJgorCQkJICAgIElTVkFMSUQoZ290Ym5vIC0gZ290ZGlmZiwgZ290Ym5vKSkKKwkJCQlnb3Ribm8gLT0gYWRqdXN0OworCQkJZWxzZSBpZiAoSVNWQUxJRChnb3Ribm8gLSBhcC0+YWxlbiwgZ290Ym5vKSkgeworCQkJCWdvdGJubyAtPSBhcC0+YWxlbjsKKwkJCQlnb3RkaWZmICs9IGFkanVzdCAtIGFwLT5hbGVuOworCQkJfSBlbHNlCisJCQkJZ290ZGlmZiArPSBhZGp1c3Q7CisJCQkvKgorCQkJICogSWYgdGhlIGZpcnN0YmxvY2sgZm9yYmlkcyBpdCwgY2FuJ3QgdXNlIGl0LAorCQkJICogbXVzdCB1c2UgZGVmYXVsdC4KKwkJCSAqLworCQkJaWYgKCFydCAmJiAhbnVsbGZiICYmCisJCQkgICAgWEZTX0ZTQl9UT19BR05PKG1wLCBnb3Ribm8pICE9IGZiX2Fnbm8pCisJCQkJZ290Ym5vID0gTlVMTEZTQkxPQ0s7CisJCX0KKwkJLyoKKwkJICogTm8gbmV4dCBibG9jaywganVzdCBkZWZhdWx0LgorCQkgKi8KKwkJZWxzZQorCQkJZ290Ym5vID0gTlVMTEZTQkxPQ0s7CisJCS8qCisJCSAqIElmIGJvdGggdmFsaWQsIHBpY2sgdGhlIGJldHRlciBvbmUsIGVsc2UgdGhlIG9ubHkgZ29vZAorCQkgKiBvbmUsIGVsc2UgYXAtPnJ2YWwgaXMgYWxyZWFkeSBzZXQgKHRvIDAgb3IgdGhlIGlub2RlIGJsb2NrKS4KKwkJICovCisJCWlmIChwcmV2Ym5vICE9IE5VTExGU0JMT0NLICYmIGdvdGJubyAhPSBOVUxMRlNCTE9DSykKKwkJCWFwLT5ydmFsID0gcHJldmRpZmYgPD0gZ290ZGlmZiA/IHByZXZibm8gOiBnb3Ribm87CisJCWVsc2UgaWYgKHByZXZibm8gIT0gTlVMTEZTQkxPQ0spCisJCQlhcC0+cnZhbCA9IHByZXZibm87CisJCWVsc2UgaWYgKGdvdGJubyAhPSBOVUxMRlNCTE9DSykKKwkJCWFwLT5ydmFsID0gZ290Ym5vOworCX0KKwkvKgorCSAqIElmIGFsbG93ZWQsIHVzZSBhcC0+cnZhbDsgb3RoZXJ3aXNlIG11c3QgdXNlIGZpcnN0YmxvY2sgc2luY2UKKwkgKiBpdCdzIGluIHRoZSByaWdodCBhbGxvY2F0aW9uIGdyb3VwLgorCSAqLworCWlmIChudWxsZmIgfHwgcnQgfHwgWEZTX0ZTQl9UT19BR05PKG1wLCBhcC0+cnZhbCkgPT0gZmJfYWdubykKKwkJOworCWVsc2UKKwkJYXAtPnJ2YWwgPSBhcC0+Zmlyc3RibG9jazsKKwkvKgorCSAqIFJlYWx0aW1lIGFsbG9jYXRpb24sIGRvbmUgdGhyb3VnaCB4ZnNfcnRhbGxvY2F0ZV9leHRlbnQuCisJICovCisJaWYgKHJ0KSB7CisjaWZuZGVmIF9fS0VSTkVMX18KKwkJQVNTRVJUKDApOworI2Vsc2UKKwkJeGZzX3J0YmxvY2tfdAlydGI7CisKKwkJYXR5cGUgPSBhcC0+cnZhbCA9PSAwID8KKwkJCVhGU19BTExPQ1RZUEVfQU5ZX0FHIDogWEZTX0FMTE9DVFlQRV9ORUFSX0JOTzsKKwkJZG9fZGl2KGFwLT5ydmFsLCBtcC0+bV9zYi5zYl9yZXh0c2l6ZSk7CisJCXJ0YiA9IGFwLT5ydmFsOworCQlhcC0+YWxlbiA9IHJhbGVuOworCQlpZiAoKGVycm9yID0geGZzX3J0YWxsb2NhdGVfZXh0ZW50KGFwLT50cCwgYXAtPnJ2YWwsIDEsIGFwLT5hbGVuLAorCQkJCSZyYWxlbiwgYXR5cGUsIGFwLT53YXNkZWwsIHByb2QsICZydGIpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJaWYgKHJ0YiA9PSBOVUxMRlNCTE9DSyAmJiBwcm9kID4gMSAmJgorCQkgICAgKGVycm9yID0geGZzX3J0YWxsb2NhdGVfZXh0ZW50KGFwLT50cCwgYXAtPnJ2YWwsIDEsCisJCQkJCQkgICBhcC0+YWxlbiwgJnJhbGVuLCBhdHlwZSwKKwkJCQkJCSAgIGFwLT53YXNkZWwsIDEsICZydGIpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJYXAtPnJ2YWwgPSBydGI7CisJCWlmIChhcC0+cnZhbCAhPSBOVUxMRlNCTE9DSykgeworCQkJYXAtPnJ2YWwgKj0gbXAtPm1fc2Iuc2JfcmV4dHNpemU7CisJCQlyYWxlbiAqPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKKwkJCWFwLT5hbGVuID0gcmFsZW47CisJCQlhcC0+aXAtPmlfZC5kaV9uYmxvY2tzICs9IHJhbGVuOworCQkJeGZzX3RyYW5zX2xvZ19pbm9kZShhcC0+dHAsIGFwLT5pcCwgWEZTX0lMT0dfQ09SRSk7CisJCQlpZiAoYXAtPndhc2RlbCkKKwkJCQlhcC0+aXAtPmlfZGVsYXllZF9ibGtzIC09IHJhbGVuOworCQkJLyoKKwkJCSAqIEFkanVzdCB0aGUgZGlzayBxdW90YSBhbHNvLiBUaGlzIHdhcyByZXNlcnZlZAorCQkJICogZWFybGllci4KKwkJCSAqLworCQkJWEZTX1RSQU5TX01PRF9EUVVPVF9CWUlOTyhtcCwgYXAtPnRwLCBhcC0+aXAsCisJCQkJYXAtPndhc2RlbCA/IFhGU19UUkFOU19EUV9ERUxSVEJDT1VOVCA6CisJCQkJCQlYRlNfVFJBTlNfRFFfUlRCQ09VTlQsCisJCQkJKGxvbmcpIHJhbGVuKTsKKwkJfSBlbHNlCisJCQlhcC0+YWxlbiA9IDA7CisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCX0KKwkvKgorCSAqIE5vcm1hbCBhbGxvY2F0aW9uLCBkb25lIHRocm91Z2ggeGZzX2FsbG9jX3ZleHRlbnQuCisJICovCisJZWxzZSB7CisJCXhmc19hZ251bWJlcl90CWFnOworCQl4ZnNfYWxsb2NfYXJnX3QJYXJnczsKKwkJeGZzX2V4dGxlbl90CWJsZW47CisJCXhmc19leHRsZW5fdAlkZWx0YTsKKwkJaW50CQlpc2FsaWduZWQ7CisJCXhmc19leHRsZW5fdAlsb25nZXN0OworCQl4ZnNfZXh0bGVuX3QJbmVlZDsKKwkJeGZzX2V4dGxlbl90CW5leHRtaW5sZW49MDsKKwkJaW50CQlub3Rpbml0OworCQl4ZnNfcGVyYWdfdAkqcGFnOworCQl4ZnNfYWdudW1iZXJfdAlzdGFydGFnOworCQlpbnQJCXRyeWFnYWluOworCisJCXRyeWFnYWluID0gaXNhbGlnbmVkID0gMDsKKwkJYXJncy50cCA9IGFwLT50cDsKKwkJYXJncy5tcCA9IG1wOworCQlhcmdzLmZzYm5vID0gYXAtPnJ2YWw7CisJCWFyZ3MubWF4bGVuID0gTUlOKGFwLT5hbGVuLCBtcC0+bV9zYi5zYl9hZ2Jsb2Nrcyk7CisJCWJsZW4gPSAwOworCQlpZiAobnVsbGZiKSB7CisJCQlhcmdzLnR5cGUgPSBYRlNfQUxMT0NUWVBFX1NUQVJUX0JOTzsKKwkJCWFyZ3MudG90YWwgPSBhcC0+dG90YWw7CisJCQkvKgorCQkJICogRmluZCB0aGUgbG9uZ2VzdCBhdmFpbGFibGUgc3BhY2UuCisJCQkgKiBXZSdyZSBnb2luZyB0byB0cnkgZm9yIHRoZSB3aG9sZSBhbGxvY2F0aW9uIGF0IG9uY2UuCisJCQkgKi8KKwkJCXN0YXJ0YWcgPSBhZyA9IFhGU19GU0JfVE9fQUdOTyhtcCwgYXJncy5mc2Jubyk7CisJCQlub3Rpbml0ID0gMDsKKwkJCWRvd25fcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwkJCXdoaWxlIChibGVuIDwgYXAtPmFsZW4pIHsKKwkJCQlwYWcgPSAmbXAtPm1fcGVyYWdbYWddOworCQkJCWlmICghcGFnLT5wYWdmX2luaXQgJiYKKwkJCQkgICAgKGVycm9yID0geGZzX2FsbG9jX3BhZ2ZfaW5pdChtcCwgYXJncy50cCwKKwkJCQkJICAgIGFnLCBYRlNfQUxMT0NfRkxBR19UUllMT0NLKSkpIHsKKwkJCQkJdXBfcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwkJCQkJcmV0dXJuIGVycm9yOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIFNlZSB4ZnNfYWxsb2NfZml4X2ZyZWVsaXN0Li4uCisJCQkJICovCisJCQkJaWYgKHBhZy0+cGFnZl9pbml0KSB7CisJCQkJCW5lZWQgPSBYRlNfTUlOX0ZSRUVMSVNUX1BBRyhwYWcsIG1wKTsKKwkJCQkJZGVsdGEgPSBuZWVkID4gcGFnLT5wYWdmX2ZsY291bnQgPworCQkJCQkJbmVlZCAtIHBhZy0+cGFnZl9mbGNvdW50IDogMDsKKwkJCQkJbG9uZ2VzdCA9IChwYWctPnBhZ2ZfbG9uZ2VzdCA+IGRlbHRhKSA/CisJCQkJCQkocGFnLT5wYWdmX2xvbmdlc3QgLSBkZWx0YSkgOgorCQkJCQkJKHBhZy0+cGFnZl9mbGNvdW50ID4gMCB8fAorCQkJCQkJIHBhZy0+cGFnZl9sb25nZXN0ID4gMCk7CisJCQkJCWlmIChibGVuIDwgbG9uZ2VzdCkKKwkJCQkJCWJsZW4gPSBsb25nZXN0OworCQkJCX0gZWxzZQorCQkJCQlub3Rpbml0ID0gMTsKKwkJCQlpZiAoKythZyA9PSBtcC0+bV9zYi5zYl9hZ2NvdW50KQorCQkJCQlhZyA9IDA7CisJCQkJaWYgKGFnID09IHN0YXJ0YWcpCisJCQkJCWJyZWFrOworCQkJfQorCQkJdXBfcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwkJCS8qCisJCQkgKiBTaW5jZSB0aGUgYWJvdmUgbG9vcCBkaWQgYSBCVUZfVFJZTE9DSywgaXQgaXMKKwkJCSAqIHBvc3NpYmxlIHRoYXQgdGhlcmUgaXMgc3BhY2UgZm9yIHRoaXMgcmVxdWVzdC4KKwkJCSAqLworCQkJaWYgKG5vdGluaXQgfHwgYmxlbiA8IGFwLT5taW5sZW4pCisJCQkJYXJncy5taW5sZW4gPSBhcC0+bWlubGVuOworCQkJLyoKKwkJCSAqIElmIHRoZSBiZXN0IHNlZW4gbGVuZ3RoIGlzIGxlc3MgdGhhbiB0aGUgcmVxdWVzdAorCQkJICogbGVuZ3RoLCB1c2UgdGhlIGJlc3QgYXMgdGhlIG1pbmltdW0uCisJCQkgKi8KKwkJCWVsc2UgaWYgKGJsZW4gPCBhcC0+YWxlbikKKwkJCQlhcmdzLm1pbmxlbiA9IGJsZW47CisJCQkvKgorCQkJICogT3RoZXJ3aXNlIHdlJ3ZlIHNlZW4gYW4gZXh0ZW50IGFzIGJpZyBhcyBhbGVuLAorCQkJICogdXNlIHRoYXQgYXMgdGhlIG1pbmltdW0uCisJCQkgKi8KKwkJCWVsc2UKKwkJCQlhcmdzLm1pbmxlbiA9IGFwLT5hbGVuOworCQl9IGVsc2UgaWYgKGFwLT5sb3cpIHsKKwkJCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfRklSU1RfQUc7CisJCQlhcmdzLnRvdGFsID0gYXJncy5taW5sZW4gPSBhcC0+bWlubGVuOworCQl9IGVsc2UgeworCQkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9ORUFSX0JOTzsKKwkJCWFyZ3MudG90YWwgPSBhcC0+dG90YWw7CisJCQlhcmdzLm1pbmxlbiA9IGFwLT5taW5sZW47CisJCX0KKwkJaWYgKGFwLT5pcC0+aV9kLmRpX2V4dHNpemUpIHsKKwkJCWFyZ3MucHJvZCA9IGFwLT5pcC0+aV9kLmRpX2V4dHNpemU7CisJCQlpZiAoKGFyZ3MubW9kID0gKHhmc19leHRsZW5fdClkb19tb2QoYXAtPm9mZiwgYXJncy5wcm9kKSkpCisJCQkJYXJncy5tb2QgPSAoeGZzX2V4dGxlbl90KShhcmdzLnByb2QgLSBhcmdzLm1vZCk7CisJCX0gZWxzZSBpZiAobXAtPm1fc2Iuc2JfYmxvY2tzaXplID49IE5CUFApIHsKKwkJCWFyZ3MucHJvZCA9IDE7CisJCQlhcmdzLm1vZCA9IDA7CisJCX0gZWxzZSB7CisJCQlhcmdzLnByb2QgPSBOQlBQID4+IG1wLT5tX3NiLnNiX2Jsb2NrbG9nOworCQkJaWYgKChhcmdzLm1vZCA9ICh4ZnNfZXh0bGVuX3QpKGRvX21vZChhcC0+b2ZmLCBhcmdzLnByb2QpKSkpCisJCQkJYXJncy5tb2QgPSAoeGZzX2V4dGxlbl90KShhcmdzLnByb2QgLSBhcmdzLm1vZCk7CisJCX0KKwkJLyoKKwkJICogSWYgd2UgYXJlIG5vdCBsb3cgb24gYXZhaWxhYmxlIGRhdGEgYmxvY2tzLCBhbmQgdGhlCisJCSAqIHVuZGVybHlpbmcgbG9naWNhbCB2b2x1bWUgbWFuYWdlciBpcyBhIHN0cmlwZSwgYW5kCisJCSAqIHRoZSBmaWxlIG9mZnNldCBpcyB6ZXJvIHRoZW4gdHJ5IHRvIGFsbG9jYXRlIGRhdGEKKwkJICogYmxvY2tzIG9uIHN0cmlwZSB1bml0IGJvdW5kYXJ5LgorCQkgKiBOT1RFOiBhcC0+YWVvZiBpcyBvbmx5IHNldCBpZiB0aGUgYWxsb2NhdGlvbiBsZW5ndGgKKwkJICogaXMgPj0gdGhlIHN0cmlwZSB1bml0IGFuZCB0aGUgYWxsb2NhdGlvbiBvZmZzZXQgaXMKKwkJICogYXQgdGhlIGVuZCBvZiBmaWxlLgorCQkgKi8KKwkJaWYgKCFhcC0+bG93ICYmIGFwLT5hZW9mKSB7CisJCQlpZiAoIWFwLT5vZmYpIHsKKwkJCQlhcmdzLmFsaWdubWVudCA9IG1wLT5tX2RhbGlnbjsKKwkJCQlhdHlwZSA9IGFyZ3MudHlwZTsKKwkJCQlpc2FsaWduZWQgPSAxOworCQkJCS8qCisJCQkJICogQWRqdXN0IGZvciBhbGlnbm1lbnQKKwkJCQkgKi8KKwkJCQlpZiAoYmxlbiA+IGFyZ3MuYWxpZ25tZW50ICYmIGJsZW4gPD0gYXAtPmFsZW4pCisJCQkJCWFyZ3MubWlubGVuID0gYmxlbiAtIGFyZ3MuYWxpZ25tZW50OworCQkJCWFyZ3MubWluYWxpZ25zbG9wID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBGaXJzdCB0cnkgYW4gZXhhY3QgYm5vIGFsbG9jYXRpb24uCisJCQkJICogSWYgaXQgZmFpbHMgdGhlbiBkbyBhIG5lYXIgb3Igc3RhcnQgYm5vCisJCQkJICogYWxsb2NhdGlvbiB3aXRoIGFsaWdubWVudCB0dXJuZWQgb24uCisJCQkJICovCisJCQkJYXR5cGUgPSBhcmdzLnR5cGU7CisJCQkJdHJ5YWdhaW4gPSAxOworCQkJCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfVEhJU19CTk87CisJCQkJYXJncy5hbGlnbm1lbnQgPSAxOworCQkJCS8qCisJCQkJICogQ29tcHV0ZSB0aGUgbWlubGVuK2FsaWdubWVudCBmb3IgdGhlCisJCQkJICogbmV4dCBjYXNlLiAgU2V0IHNsb3Agc28gdGhhdCB0aGUgdmFsdWUKKwkJCQkgKiBvZiBtaW5sZW4rYWxpZ25tZW50K3Nsb3AgZG9lc24ndCBnbyB1cAorCQkJCSAqIGJldHdlZW4gdGhlIGNhbGxzLgorCQkJCSAqLworCQkJCWlmIChibGVuID4gbXAtPm1fZGFsaWduICYmIGJsZW4gPD0gYXAtPmFsZW4pCisJCQkJCW5leHRtaW5sZW4gPSBibGVuIC0gbXAtPm1fZGFsaWduOworCQkJCWVsc2UKKwkJCQkJbmV4dG1pbmxlbiA9IGFyZ3MubWlubGVuOworCQkJCWlmIChuZXh0bWlubGVuICsgbXAtPm1fZGFsaWduID4gYXJncy5taW5sZW4gKyAxKQorCQkJCQlhcmdzLm1pbmFsaWduc2xvcCA9CisJCQkJCQluZXh0bWlubGVuICsgbXAtPm1fZGFsaWduIC0KKwkJCQkJCWFyZ3MubWlubGVuIC0gMTsKKwkJCQllbHNlCisJCQkJCWFyZ3MubWluYWxpZ25zbG9wID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWFyZ3MuYWxpZ25tZW50ID0gMTsKKwkJCWFyZ3MubWluYWxpZ25zbG9wID0gMDsKKwkJfQorCQlhcmdzLm1pbmxlZnQgPSBhcC0+bWlubGVmdDsKKwkJYXJncy53YXNkZWwgPSBhcC0+d2FzZGVsOworCQlhcmdzLmlzZmwgPSAwOworCQlhcmdzLnVzZXJkYXRhID0gYXAtPnVzZXJkYXRhOworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX3ZleHRlbnQoJmFyZ3MpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJaWYgKHRyeWFnYWluICYmIGFyZ3MuZnNibm8gPT0gTlVMTEZTQkxPQ0spIHsKKwkJCS8qCisJCQkgKiBFeGFjdCBhbGxvY2F0aW9uIGZhaWxlZC4gTm93IHRyeSB3aXRoIGFsaWdubWVudAorCQkJICogdHVybmVkIG9uLgorCQkJICovCisJCQlhcmdzLnR5cGUgPSBhdHlwZTsKKwkJCWFyZ3MuZnNibm8gPSBhcC0+cnZhbDsKKwkJCWFyZ3MuYWxpZ25tZW50ID0gbXAtPm1fZGFsaWduOworCQkJYXJncy5taW5sZW4gPSBuZXh0bWlubGVuOworCQkJYXJncy5taW5hbGlnbnNsb3AgPSAwOworCQkJaXNhbGlnbmVkID0gMTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfdmV4dGVudCgmYXJncykpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlpZiAoaXNhbGlnbmVkICYmIGFyZ3MuZnNibm8gPT0gTlVMTEZTQkxPQ0spIHsKKwkJCS8qCisJCQkgKiBhbGxvY2F0aW9uIGZhaWxlZCwgc28gdHVybiBvZmYgYWxpZ25tZW50IGFuZAorCQkJICogdHJ5IGFnYWluLgorCQkJICovCisJCQlhcmdzLnR5cGUgPSBhdHlwZTsKKwkJCWFyZ3MuZnNibm8gPSBhcC0+cnZhbDsKKwkJCWFyZ3MuYWxpZ25tZW50ID0gMDsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfdmV4dGVudCgmYXJncykpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlpZiAoYXJncy5mc2JubyA9PSBOVUxMRlNCTE9DSyAmJiBudWxsZmIgJiYKKwkJICAgIGFyZ3MubWlubGVuID4gYXAtPm1pbmxlbikgeworCQkJYXJncy5taW5sZW4gPSBhcC0+bWlubGVuOworCQkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9TVEFSVF9CTk87CisJCQlhcmdzLmZzYm5vID0gYXAtPnJ2YWw7CisJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX3ZleHRlbnQoJmFyZ3MpKSkKKwkJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJaWYgKGFyZ3MuZnNibm8gPT0gTlVMTEZTQkxPQ0sgJiYgbnVsbGZiKSB7CisJCQlhcmdzLmZzYm5vID0gMDsKKwkJCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfRklSU1RfQUc7CisJCQlhcmdzLnRvdGFsID0gYXAtPm1pbmxlbjsKKwkJCWFyZ3MubWlubGVmdCA9IDA7CisJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX3ZleHRlbnQoJmFyZ3MpKSkKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQlhcC0+bG93ID0gMTsKKwkJfQorCQlpZiAoYXJncy5mc2JubyAhPSBOVUxMRlNCTE9DSykgeworCQkJYXAtPmZpcnN0YmxvY2sgPSBhcC0+cnZhbCA9IGFyZ3MuZnNibm87CisJCQlBU1NFUlQobnVsbGZiIHx8IGZiX2Fnbm8gPT0gYXJncy5hZ25vIHx8CisJCQkgICAgICAgKGFwLT5sb3cgJiYgZmJfYWdubyA8IGFyZ3MuYWdubykpOworCQkJYXAtPmFsZW4gPSBhcmdzLmxlbjsKKwkJCWFwLT5pcC0+aV9kLmRpX25ibG9ja3MgKz0gYXJncy5sZW47CisJCQl4ZnNfdHJhbnNfbG9nX2lub2RlKGFwLT50cCwgYXAtPmlwLCBYRlNfSUxPR19DT1JFKTsKKwkJCWlmIChhcC0+d2FzZGVsKQorCQkJCWFwLT5pcC0+aV9kZWxheWVkX2Jsa3MgLT0gYXJncy5sZW47CisJCQkvKgorCQkJICogQWRqdXN0IHRoZSBkaXNrIHF1b3RhIGFsc28uIFRoaXMgd2FzIHJlc2VydmVkCisJCQkgKiBlYXJsaWVyLgorCQkJICovCisJCQlYRlNfVFJBTlNfTU9EX0RRVU9UX0JZSU5PKG1wLCBhcC0+dHAsIGFwLT5pcCwKKwkJCQlhcC0+d2FzZGVsID8gWEZTX1RSQU5TX0RRX0RFTEJDT1VOVCA6CisJCQkJCQlYRlNfVFJBTlNfRFFfQkNPVU5ULAorCQkJCShsb25nKSBhcmdzLmxlbik7CisJCX0gZWxzZSB7CisJCQlhcC0+cnZhbCA9IE5VTExGU0JMT0NLOworCQkJYXAtPmFsZW4gPSAwOworCQl9CisJfQorCXJldHVybiAwOworI3VuZGVmCUlTVkFMSUQKK30KKworLyoKKyAqIFRyYW5zZm9ybSBhIGJ0cmVlIGZvcm1hdCBmaWxlIHdpdGggb25seSBvbmUgbGVhZiBub2RlLCB3aGVyZSB0aGUKKyAqIGV4dGVudHMgbGlzdCB3aWxsIGZpdCBpbiB0aGUgaW5vZGUsIGludG8gYW4gZXh0ZW50cyBmb3JtYXQgZmlsZS4KKyAqIFNpbmNlIHRoZSBleHRlbnQgbGlzdCBpcyBhbHJlYWR5IGluLWNvcmUsIGFsbCB3ZSBoYXZlIHRvIGRvIGlzCisgKiBnaXZlIHVwIHRoZSBzcGFjZSBmb3IgdGhlIGJ0cmVlIHJvb3QgYW5kIHBpdGNoIHRoZSBsZWFmIGJsb2NrLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9idHJlZV90b19leHRlbnRzKAorCXhmc190cmFuc190CQkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJKmxvZ2ZsYWdzcCwgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLworCWludAkJCXdoaWNoZm9yaykgIC8qIGRhdGEgb3IgYXR0ciBmb3JrICovCit7CisJLyogUkVGRVJFTkNFRCAqLworCXhmc19ibWJ0X2Jsb2NrX3QJKmNibG9jazsvKiBjaGlsZCBidHJlZSBibG9jayAqLworCXhmc19mc2Jsb2NrX3QJCWNibm87CS8qIGNoaWxkIGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkJKmNicDsJLyogY2hpbGQgYmxvY2sncyBidWZmZXIgKi8KKwlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX2lmb3JrX3QJCSppZnA7CS8qIGlub2RlIGZvcmsgZGF0YSAqLworCXhmc19tb3VudF90CQkqbXA7CS8qIG1vdW50IHBvaW50IHN0cnVjdHVyZSAqLworCXhmc19ibWJ0X3B0cl90CQkqcHA7CS8qIHB0ciB0byBibG9jayBhZGRyZXNzICovCisJeGZzX2JtYnRfYmxvY2tfdAkqcmJsb2NrOy8qIHJvb3QgYnRyZWUgYmxvY2sgKi8KKworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJQVNTRVJUKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKTsKKwlBU1NFUlQoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSA9PSBYRlNfRElOT0RFX0ZNVF9CVFJFRSk7CisJcmJsb2NrID0gaWZwLT5pZl9icm9vdDsKKwlBU1NFUlQoSU5UX0dFVChyYmxvY2stPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpID09IDEpOworCUFTU0VSVChJTlRfR0VUKHJibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA9PSAxKTsKKwlBU1NFUlQoWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhpZnAtPmlmX2Jyb290X2J5dGVzKSA9PSAxKTsKKwltcCA9IGlwLT5pX21vdW50OworCXBwID0gWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIocmJsb2NrLCAxLCBpZnAtPmlmX2Jyb290X2J5dGVzKTsKKwkqbG9nZmxhZ3NwID0gMDsKKyNpZmRlZiBERUJVRworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbHB0cihjdXIsIElOVF9HRVQoKnBwLCBBUkNIX0NPTlZFUlQpLCAxKSkpCisJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCWNibm8gPSBJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKTsKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChtcCwgdHAsIGNibm8sIDAsICZjYnAsCisJCQlYRlNfQk1BUF9CVFJFRV9SRUYpKSkKKwkJcmV0dXJuIGVycm9yOworCWNibG9jayA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhjYnApOworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgY2Jsb2NrLCAwLCBjYnApKSkKKwkJcmV0dXJuIGVycm9yOworCXhmc19ibWFwX2FkZF9mcmVlKGNibm8sIDEsIGN1ci0+YmNfcHJpdmF0ZS5iLmZsaXN0LCBtcCk7CisJaXAtPmlfZC5kaV9uYmxvY2tzLS07CisJWEZTX1RSQU5TX01PRF9EUVVPVF9CWUlOTyhtcCwgdHAsIGlwLCBYRlNfVFJBTlNfRFFfQkNPVU5ULCAtMUwpOworCXhmc190cmFuc19iaW52YWwodHAsIGNicCk7CisJaWYgKGN1ci0+YmNfYnVmc1swXSA9PSBjYnApCisJCWN1ci0+YmNfYnVmc1swXSA9IE5VTEw7CisJeGZzX2lyb290X3JlYWxsb2MoaXAsIC0xLCB3aGljaGZvcmspOworCUFTU0VSVChpZnAtPmlmX2Jyb290ID09IE5VTEwpOworCUFTU0VSVCgoaWZwLT5pZl9mbGFncyAmIFhGU19JRkJST09UKSA9PSAwKTsKKwlYRlNfSUZPUktfRk1UX1NFVChpcCwgd2hpY2hmb3JrLCBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTKTsKKwkqbG9nZmxhZ3NwID0gWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0ZFWFQod2hpY2hmb3JrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGxlZCBieSB4ZnNfYm1hcGkgdG8gdXBkYXRlIGV4dGVudCBsaXN0IHN0cnVjdHVyZSBhbmQgdGhlIGJ0cmVlCisgKiBhZnRlciByZW1vdmluZyBzcGFjZSAob3IgdW5kb2luZyBhIGRlbGF5ZWQgYWxsb2NhdGlvbikuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2RlbF9leHRlbnQoCisJeGZzX2lub2RlX3QJCSppcCwJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfdHJhbnNfdAkJKnRwLAkvKiBjdXJyZW50IHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJCWlkeCwJLyogZXh0ZW50IG51bWJlciB0byB1cGRhdGUvZGVsZXRlICovCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCS8qIGxpc3Qgb2YgZXh0ZW50cyB0byBiZSBmcmVlZCAqLworCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogaWYgbnVsbCwgbm90IGEgYnRyZWUgKi8KKwl4ZnNfYm1idF9pcmVjX3QJCSpkZWwsCS8qIGRhdGEgdG8gcmVtb3ZlIGZyb20gZXh0ZW50IGxpc3QgKi8KKwlpbnQJCQkqbG9nZmxhZ3NwLCAvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCisJaW50CQkJd2hpY2hmb3JrLCAvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCWludAkJCXJzdmQpCS8qIE9LIHRvIGFsbG9jYXRlIHJlc2VydmVkIGJsb2NrcyAqLworeworCXhmc19maWxibGtzX3QJCWRhX25ldzsJLyogbmV3IGRlbGF5LWFsbG9jIGluZGlyZWN0IGJsb2NrcyAqLworCXhmc19maWxibGtzX3QJCWRhX29sZDsJLyogb2xkIGRlbGF5LWFsbG9jIGluZGlyZWN0IGJsb2NrcyAqLworCXhmc19mc2Jsb2NrX3QJCWRlbF9lbmRibG9jaz0wOwkvKiBmaXJzdCBibG9jayBwYXN0IGRlbCAqLworCXhmc19maWxlb2ZmX3QJCWRlbF9lbmRvZmY7CS8qIGZpcnN0IG9mZnNldCBwYXN0IGRlbCAqLworCWludAkJCWRlbGF5OwkvKiBjdXJyZW50IGJsb2NrIGlzIGRlbGF5ZWQgYWxsb2NhdGVkICovCisJaW50CQkJZG9fZng7CS8qIGZyZWUgZXh0ZW50IGF0IGVuZCBvZiByb3V0aW5lICovCisJeGZzX2JtYnRfcmVjX3QJCSplcDsJLyogY3VycmVudCBleHRlbnQgZW50cnkgcG9pbnRlciAqLworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlmbGFnczsJLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLworI2lmZGVmIFhGU19CTUFQX1RSQUNFCisJc3RhdGljIGNoYXIJCWZuYW1lW10gPSAieGZzX2JtYXBfZGVsX2V4dGVudCI7CisjZW5kaWYKKwl4ZnNfYm1idF9pcmVjX3QJCWdvdDsJLyogY3VycmVudCBleHRlbnQgZW50cnkgKi8KKwl4ZnNfZmlsZW9mZl90CQlnb3RfZW5kb2ZmOwkvKiBmaXJzdCBvZmZzZXQgcGFzdCBnb3QgKi8KKwlpbnQJCQlpOwkvKiB0ZW1wIHN0YXRlICovCisJeGZzX2lmb3JrX3QJCSppZnA7CS8qIGlub2RlIGZvcmsgcG9pbnRlciAqLworCXhmc19tb3VudF90CQkqbXA7CS8qIG1vdW50IHN0cnVjdHVyZSAqLworCXhmc19maWxibGtzX3QJCW5ibGtzOwkvKiBxdW90YS9zYiBibG9jayBjb3VudCAqLworCXhmc19ibWJ0X2lyZWNfdAkJbmV3OwkvKiBuZXcgcmVjb3JkIHRvIGJlIGluc2VydGVkICovCisJLyogUkVGRVJFTkNFRCAqLworCXhmc19leHRudW1fdAkJbmV4dGVudHM7CS8qIG51bWJlciBvZiBleHRlbnRzIGluIGxpc3QgKi8KKwl1aW50CQkJcWZpZWxkOwkvKiBxdW90YSBmaWVsZCB0byB1cGRhdGUgKi8KKwl4ZnNfZmlsYmxrc190CQl0ZW1wOwkvKiBmb3IgaW5kaXJlY3QgbGVuZ3RoIGNhbGN1bGF0aW9ucyAqLworCXhmc19maWxibGtzX3QJCXRlbXAyOwkvKiBmb3IgaW5kaXJlY3QgbGVuZ3RoIGNhbGN1bGF0aW9ucyAqLworCisJWEZTX1NUQVRTX0lOQyh4c19kZWxfZXhsaXN0KTsKKwltcCA9IGlwLT5pX21vdW50OworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJbmV4dGVudHMgPSBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwlBU1NFUlQoaWR4ID49IDAgJiYgaWR4IDwgbmV4dGVudHMpOworCUFTU0VSVChkZWwtPmJyX2Jsb2NrY291bnQgPiAwKTsKKwllcCA9ICZpZnAtPmlmX3UxLmlmX2V4dGVudHNbaWR4XTsKKwl4ZnNfYm1idF9nZXRfYWxsKGVwLCAmZ290KTsKKwlBU1NFUlQoZ290LmJyX3N0YXJ0b2ZmIDw9IGRlbC0+YnJfc3RhcnRvZmYpOworCWRlbF9lbmRvZmYgPSBkZWwtPmJyX3N0YXJ0b2ZmICsgZGVsLT5icl9ibG9ja2NvdW50OworCWdvdF9lbmRvZmYgPSBnb3QuYnJfc3RhcnRvZmYgKyBnb3QuYnJfYmxvY2tjb3VudDsKKwlBU1NFUlQoZ290X2VuZG9mZiA+PSBkZWxfZW5kb2ZmKTsKKwlkZWxheSA9IElTTlVMTFNUQVJUQkxPQ0soZ290LmJyX3N0YXJ0YmxvY2spOworCUFTU0VSVChJU05VTExTVEFSVEJMT0NLKGRlbC0+YnJfc3RhcnRibG9jaykgPT0gZGVsYXkpOworCWZsYWdzID0gMDsKKwlxZmllbGQgPSAwOworCWVycm9yID0gMDsKKwkvKgorCSAqIElmIGRlbGV0aW5nIGEgcmVhbCBhbGxvY2F0aW9uLCBtdXN0IGZyZWUgdXAgdGhlIGRpc2sgc3BhY2UuCisJICovCisJaWYgKCFkZWxheSkgeworCQlmbGFncyA9IFhGU19JTE9HX0NPUkU7CisJCS8qCisJCSAqIFJlYWx0aW1lIGFsbG9jYXRpb24uICBGcmVlIGl0IGFuZCByZWNvcmQgZGlfbmJsb2NrcyB1cGRhdGUuCisJCSAqLworCQlpZiAod2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUksgJiYKKwkJICAgIChpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkpIHsKKwkJCXhmc19mc2Jsb2NrX3QJYm5vOworCQkJeGZzX2ZpbGJsa3NfdAlsZW47CisKKwkJCUFTU0VSVChkb19tb2QoZGVsLT5icl9ibG9ja2NvdW50LAorCQkJCSAgICAgIG1wLT5tX3NiLnNiX3JleHRzaXplKSA9PSAwKTsKKwkJCUFTU0VSVChkb19tb2QoZGVsLT5icl9zdGFydGJsb2NrLAorCQkJCSAgICAgIG1wLT5tX3NiLnNiX3JleHRzaXplKSA9PSAwKTsKKwkJCWJubyA9IGRlbC0+YnJfc3RhcnRibG9jazsKKwkJCWxlbiA9IGRlbC0+YnJfYmxvY2tjb3VudDsKKwkJCWRvX2Rpdihibm8sIG1wLT5tX3NiLnNiX3JleHRzaXplKTsKKwkJCWRvX2RpdihsZW4sIG1wLT5tX3NiLnNiX3JleHRzaXplKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfcnRmcmVlX2V4dGVudChpcC0+aV90cmFuc3AsIGJubywKKwkJCQkJKHhmc19leHRsZW5fdClsZW4pKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlkb19meCA9IDA7CisJCQluYmxrcyA9IGxlbiAqIG1wLT5tX3NiLnNiX3JleHRzaXplOworCQkJcWZpZWxkID0gWEZTX1RSQU5TX0RRX1JUQkNPVU5UOworCQl9CisJCS8qCisJCSAqIE9yZGluYXJ5IGFsbG9jYXRpb24uCisJCSAqLworCQllbHNlIHsKKwkJCWRvX2Z4ID0gMTsKKwkJCW5ibGtzID0gZGVsLT5icl9ibG9ja2NvdW50OworCQkJcWZpZWxkID0gWEZTX1RSQU5TX0RRX0JDT1VOVDsKKwkJfQorCQkvKgorCQkgKiBTZXQgdXAgZGVsX2VuZGJsb2NrIGFuZCBjdXIgZm9yIGxhdGVyLgorCQkgKi8KKwkJZGVsX2VuZGJsb2NrID0gZGVsLT5icl9zdGFydGJsb2NrICsgZGVsLT5icl9ibG9ja2NvdW50OworCQlpZiAoY3VyKSB7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgZ290LmJyX3N0YXJ0b2ZmLAorCQkJCQlnb3QuYnJfc3RhcnRibG9jaywgZ290LmJyX2Jsb2NrY291bnQsCisJCQkJCSZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCX0KKwkJZGFfb2xkID0gZGFfbmV3ID0gMDsKKwl9IGVsc2UgeworCQlkYV9vbGQgPSBTVEFSVEJMT0NLVkFMKGdvdC5icl9zdGFydGJsb2NrKTsKKwkJZGFfbmV3ID0gMDsKKwkJbmJsa3MgPSAwOworCQlkb19meCA9IDA7CisJfQorCS8qCisJICogU2V0IGZsYWcgdmFsdWUgdG8gdXNlIGluIHN3aXRjaCBzdGF0ZW1lbnQuCisJICogTGVmdC1jb250aWcgaXMgMiwgcmlnaHQtY29udGlnIGlzIDEuCisJICovCisJc3dpdGNoICgoKGdvdC5icl9zdGFydG9mZiA9PSBkZWwtPmJyX3N0YXJ0b2ZmKSA8PCAxKSB8CisJCShnb3RfZW5kb2ZmID09IGRlbF9lbmRvZmYpKSB7CisJY2FzZSAzOgorCQkvKgorCQkgKiBNYXRjaGVzIHRoZSB3aG9sZSBleHRlbnQuICBEZWxldGUgdGhlIGVudHJ5LgorCQkgKi8KKwkJeGZzX2JtYXBfdHJhY2VfZGVsZXRlKGZuYW1lLCAiMyIsIGlwLCBpZHgsIDEsIHdoaWNoZm9yayk7CisJCXhmc19ibWFwX2RlbGV0ZV9leGxpc3QoaXAsIGlkeCwgMSwgd2hpY2hmb3JrKTsKKwkJaWZwLT5pZl9sYXN0ZXggPSBpZHg7CisJCWlmIChkZWxheSkKKwkJCWJyZWFrOworCQlYRlNfSUZPUktfTkVYVF9TRVQoaXAsIHdoaWNoZm9yaywKKwkJCVhGU19JRk9SS19ORVhURU5UUyhpcCwgd2hpY2hmb3JrKSAtIDEpOworCQlmbGFncyB8PSBYRlNfSUxPR19DT1JFOworCQlpZiAoIWN1cikgeworCQkJZmxhZ3MgfD0gWEZTX0lMT0dfRkVYVCh3aGljaGZvcmspOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlbGV0ZShjdXIsICZpKSkpCisJCQlnb3RvIGRvbmU7CisJCUFTU0VSVChpID09IDEpOworCQlicmVhazsKKworCWNhc2UgMjoKKwkJLyoKKwkJICogRGVsZXRpbmcgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGV4dGVudC4KKwkJICovCisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICIyIiwgaXAsIGlkeCwgd2hpY2hmb3JrKTsKKwkJeGZzX2JtYnRfc2V0X3N0YXJ0b2ZmKGVwLCBkZWxfZW5kb2ZmKTsKKwkJdGVtcCA9IGdvdC5icl9ibG9ja2NvdW50IC0gZGVsLT5icl9ibG9ja2NvdW50OworCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCwgdGVtcCk7CisJCWlmcC0+aWZfbGFzdGV4ID0gaWR4OworCQlpZiAoZGVsYXkpIHsKKwkJCXRlbXAgPSBYRlNfRklMQkxLU19NSU4oeGZzX2JtYXBfd29yc3RfaW5kbGVuKGlwLCB0ZW1wKSwKKwkJCQlkYV9vbGQpOworCQkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIE5VTExTVEFSVEJMT0NLKChpbnQpdGVtcCkpOworCQkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICIyIiwgaXAsIGlkeCwKKwkJCQl3aGljaGZvcmspOworCQkJZGFfbmV3ID0gdGVtcDsKKwkJCWJyZWFrOworCQl9CisJCXhmc19ibWJ0X3NldF9zdGFydGJsb2NrKGVwLCBkZWxfZW5kYmxvY2spOworCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIjIiLCBpcCwgaWR4LCB3aGljaGZvcmspOworCQlpZiAoIWN1cikgeworCQkJZmxhZ3MgfD0gWEZTX0lMT0dfRkVYVCh3aGljaGZvcmspOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShjdXIsIGRlbF9lbmRvZmYsIGRlbF9lbmRibG9jaywKKwkJCQlnb3QuYnJfYmxvY2tjb3VudCAtIGRlbC0+YnJfYmxvY2tjb3VudCwKKwkJCQlnb3QuYnJfc3RhdGUpKSkKKwkJCWdvdG8gZG9uZTsKKwkJYnJlYWs7CisKKwljYXNlIDE6CisJCS8qCisJCSAqIERlbGV0aW5nIHRoZSBsYXN0IHBhcnQgb2YgdGhlIGV4dGVudC4KKwkJICovCisJCXRlbXAgPSBnb3QuYnJfYmxvY2tjb3VudCAtIGRlbC0+YnJfYmxvY2tjb3VudDsKKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIjEiLCBpcCwgaWR4LCB3aGljaGZvcmspOworCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCwgdGVtcCk7CisJCWlmcC0+aWZfbGFzdGV4ID0gaWR4OworCQlpZiAoZGVsYXkpIHsKKwkJCXRlbXAgPSBYRlNfRklMQkxLU19NSU4oeGZzX2JtYXBfd29yc3RfaW5kbGVuKGlwLCB0ZW1wKSwKKwkJCQlkYV9vbGQpOworCQkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIE5VTExTVEFSVEJMT0NLKChpbnQpdGVtcCkpOworCQkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICIxIiwgaXAsIGlkeCwKKwkJCQl3aGljaGZvcmspOworCQkJZGFfbmV3ID0gdGVtcDsKKwkJCWJyZWFrOworCQl9CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiMSIsIGlwLCBpZHgsIHdoaWNoZm9yayk7CisJCWlmICghY3VyKSB7CisJCQlmbGFncyB8PSBYRlNfSUxPR19GRVhUKHdoaWNoZm9yayk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgZ290LmJyX3N0YXJ0b2ZmLAorCQkJCWdvdC5icl9zdGFydGJsb2NrLAorCQkJCWdvdC5icl9ibG9ja2NvdW50IC0gZGVsLT5icl9ibG9ja2NvdW50LAorCQkJCWdvdC5icl9zdGF0ZSkpKQorCQkJZ290byBkb25lOworCQlicmVhazsKKworCWNhc2UgMDoKKwkJLyoKKwkJICogRGVsZXRpbmcgdGhlIG1pZGRsZSBvZiB0aGUgZXh0ZW50LgorCQkgKi8KKwkJdGVtcCA9IGRlbC0+YnJfc3RhcnRvZmYgLSBnb3QuYnJfc3RhcnRvZmY7CisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICIwIiwgaXAsIGlkeCwgd2hpY2hmb3JrKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAsIHRlbXApOworCQluZXcuYnJfc3RhcnRvZmYgPSBkZWxfZW5kb2ZmOworCQl0ZW1wMiA9IGdvdF9lbmRvZmYgLSBkZWxfZW5kb2ZmOworCQluZXcuYnJfYmxvY2tjb3VudCA9IHRlbXAyOworCQluZXcuYnJfc3RhdGUgPSBnb3QuYnJfc3RhdGU7CisJCWlmICghZGVsYXkpIHsKKwkJCW5ldy5icl9zdGFydGJsb2NrID0gZGVsX2VuZGJsb2NrOworCQkJZmxhZ3MgfD0gWEZTX0lMT0dfQ09SRTsKKwkJCWlmIChjdXIpIHsKKwkJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwKKwkJCQkJCWdvdC5icl9zdGFydG9mZiwKKwkJCQkJCWdvdC5icl9zdGFydGJsb2NrLCB0ZW1wLAorCQkJCQkJZ290LmJyX3N0YXRlKSkpCisJCQkJCWdvdG8gZG9uZTsKKwkJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfaW5jcmVtZW50KGN1ciwgMCwgJmkpKSkKKwkJCQkJZ290byBkb25lOworCQkJCWN1ci0+YmNfcmVjLmIgPSBuZXc7CisJCQkJZXJyb3IgPSB4ZnNfYm1idF9pbnNlcnQoY3VyLCAmaSk7CisJCQkJaWYgKGVycm9yICYmIGVycm9yICE9IEVOT1NQQykKKwkJCQkJZ290byBkb25lOworCQkJCS8qCisJCQkJICogSWYgZ2V0IG5vLXNwYWNlIGJhY2sgZnJvbSBidHJlZSBpbnNlcnQsCisJCQkJICogaXQgdHJpZWQgYSBzcGxpdCwgYW5kIHdlIGhhdmUgYSB6ZXJvCisJCQkJICogYmxvY2sgcmVzZXJ2YXRpb24uCisJCQkJICogRml4IHVwIG91ciBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBlcnJvci4KKwkJCQkgKi8KKwkJCQlpZiAoZXJyb3IgPT0gRU5PU1BDKSB7CisJCQkJCS8qCisJCQkJCSAqIFJlc2V0IHRoZSBjdXJzb3IsIGRvbid0IHRydXN0CisJCQkJCSAqIGl0IGFmdGVyIGFueSBpbnNlcnQgb3BlcmF0aW9uLgorCQkJCQkgKi8KKwkJCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsCisJCQkJCQkJZ290LmJyX3N0YXJ0b2ZmLAorCQkJCQkJCWdvdC5icl9zdGFydGJsb2NrLAorCQkJCQkJCXRlbXAsICZpKSkpCisJCQkJCQlnb3RvIGRvbmU7CisJCQkJCUFTU0VSVChpID09IDEpOworCQkJCQkvKgorCQkJCQkgKiBVcGRhdGUgdGhlIGJ0cmVlIHJlY29yZCBiYWNrCisJCQkJCSAqIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZS4KKwkJCQkJICovCisJCQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLAorCQkJCQkJCWdvdC5icl9zdGFydG9mZiwKKwkJCQkJCQlnb3QuYnJfc3RhcnRibG9jaywKKwkJCQkJCQlnb3QuYnJfYmxvY2tjb3VudCwKKwkJCQkJCQlnb3QuYnJfc3RhdGUpKSkKKwkJCQkJCWdvdG8gZG9uZTsKKwkJCQkJLyoKKwkJCQkJICogUmVzZXQgdGhlIGV4dGVudCByZWNvcmQgYmFjaworCQkJCQkgKiB0byB0aGUgb3JpZ2luYWwgdmFsdWUuCisJCQkJCSAqLworCQkJCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCwKKwkJCQkJCWdvdC5icl9ibG9ja2NvdW50KTsKKwkJCQkJZmxhZ3MgPSAwOworCQkJCQllcnJvciA9IFhGU19FUlJPUihFTk9TUEMpOworCQkJCQlnb3RvIGRvbmU7CisJCQkJfQorCQkJCUFTU0VSVChpID09IDEpOworCQkJfSBlbHNlCisJCQkJZmxhZ3MgfD0gWEZTX0lMT0dfRkVYVCh3aGljaGZvcmspOworCQkJWEZTX0lGT1JLX05FWFRfU0VUKGlwLCB3aGljaGZvcmssCisJCQkJWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspICsgMSk7CisJCX0gZWxzZSB7CisJCQlBU1NFUlQod2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUkspOworCQkJdGVtcCA9IHhmc19ibWFwX3dvcnN0X2luZGxlbihpcCwgdGVtcCk7CisJCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCwgTlVMTFNUQVJUQkxPQ0soKGludCl0ZW1wKSk7CisJCQl0ZW1wMiA9IHhmc19ibWFwX3dvcnN0X2luZGxlbihpcCwgdGVtcDIpOworCQkJbmV3LmJyX3N0YXJ0YmxvY2sgPSBOVUxMU1RBUlRCTE9DSygoaW50KXRlbXAyKTsKKwkJCWRhX25ldyA9IHRlbXAgKyB0ZW1wMjsKKwkJCXdoaWxlIChkYV9uZXcgPiBkYV9vbGQpIHsKKwkJCQlpZiAodGVtcCkgeworCQkJCQl0ZW1wLS07CisJCQkJCWRhX25ldy0tOworCQkJCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCwKKwkJCQkJCU5VTExTVEFSVEJMT0NLKChpbnQpdGVtcCkpOworCQkJCX0KKwkJCQlpZiAoZGFfbmV3ID09IGRhX29sZCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKHRlbXAyKSB7CisJCQkJCXRlbXAyLS07CisJCQkJCWRhX25ldy0tOworCQkJCQluZXcuYnJfc3RhcnRibG9jayA9CisJCQkJCQlOVUxMU1RBUlRCTE9DSygoaW50KXRlbXAyKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICIwIiwgaXAsIGlkeCwgd2hpY2hmb3JrKTsKKwkJeGZzX2JtYXBfdHJhY2VfaW5zZXJ0KGZuYW1lLCAiMCIsIGlwLCBpZHggKyAxLCAxLCAmbmV3LCBOVUxMLAorCQkJd2hpY2hmb3JrKTsKKwkJeGZzX2JtYXBfaW5zZXJ0X2V4bGlzdChpcCwgaWR4ICsgMSwgMSwgJm5ldywgd2hpY2hmb3JrKTsKKwkJaWZwLT5pZl9sYXN0ZXggPSBpZHggKyAxOworCQlicmVhazsKKwl9CisJLyoKKwkgKiBJZiB3ZSBuZWVkIHRvLCBhZGQgdG8gbGlzdCBvZiBleHRlbnRzIHRvIGRlbGV0ZS4KKwkgKi8KKwlpZiAoZG9fZngpCisJCXhmc19ibWFwX2FkZF9mcmVlKGRlbC0+YnJfc3RhcnRibG9jaywgZGVsLT5icl9ibG9ja2NvdW50LCBmbGlzdCwKKwkJCW1wKTsKKwkvKgorCSAqIEFkanVzdCBpbm9kZSAjIGJsb2NrcyBpbiB0aGUgZmlsZS4KKwkgKi8KKwlpZiAobmJsa3MpCisJCWlwLT5pX2QuZGlfbmJsb2NrcyAtPSBuYmxrczsKKwkvKgorCSAqIEFkanVzdCBxdW90YSBkYXRhLgorCSAqLworCWlmIChxZmllbGQpCisJCVhGU19UUkFOU19NT0RfRFFVT1RfQllJTk8obXAsIHRwLCBpcCwgcWZpZWxkLCAobG9uZyktbmJsa3MpOworCisJLyoKKwkgKiBBY2NvdW50IGZvciBjaGFuZ2UgaW4gZGVsYXllZCBpbmRpcmVjdCBibG9ja3MuCisJICogTm90aGluZyB0byBkbyBmb3IgZGlzayBxdW90YSBhY2NvdW50aW5nIGhlcmUuCisJICovCisJQVNTRVJUKGRhX29sZCA+PSBkYV9uZXcpOworCWlmIChkYV9vbGQgPiBkYV9uZXcpCisJCXhmc19tb2RfaW5jb3JlX3NiKG1wLCBYRlNfU0JTX0ZEQkxPQ0tTLCAoaW50KShkYV9vbGQgLSBkYV9uZXcpLAorCQkJcnN2ZCk7Citkb25lOgorCSpsb2dmbGFnc3AgPSBmbGFnczsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBSZW1vdmUgdGhlIGVudHJ5ICJmcmVlIiBmcm9tIHRoZSBmcmVlIGl0ZW0gbGlzdC4gIFByZXYgcG9pbnRzIHRvIHRoZQorICogcHJldmlvdXMgZW50cnksIHVubGVzcyAiZnJlZSIgaXMgdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1hcF9kZWxfZnJlZSgKKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJLyogZnJlZSBpdGVtIGxpc3QgaGVhZGVyICovCisJeGZzX2JtYXBfZnJlZV9pdGVtX3QJKnByZXYsCS8qIHByZXZpb3VzIGl0ZW0gb24gbGlzdCwgaWYgYW55ICovCisJeGZzX2JtYXBfZnJlZV9pdGVtX3QJKmZyZWUpCS8qIGxpc3QgaXRlbSB0byBiZSBmcmVlZCAqLworeworCWlmIChwcmV2KQorCQlwcmV2LT54YmZpX25leHQgPSBmcmVlLT54YmZpX25leHQ7CisJZWxzZQorCQlmbGlzdC0+eGJmX2ZpcnN0ID0gZnJlZS0+eGJmaV9uZXh0OworCWZsaXN0LT54YmZfY291bnQtLTsKKwlrbWVtX3pvbmVfZnJlZSh4ZnNfYm1hcF9mcmVlX2l0ZW1fem9uZSwgZnJlZSk7Cit9CisKKy8qCisgKiBSZW1vdmUgY291bnQgZW50cmllcyBmcm9tIHRoZSBleHRlbnRzIGFycmF5IGZvciBpbm9kZSAiaXAiLCBzdGFydGluZworICogYXQgaW5kZXggImlkeCIuICBDb3BpZXMgdGhlIHJlbWFpbmluZyBpdGVtcyBkb3duIG92ZXIgdGhlIGRlbGV0ZWQgb25lcywKKyAqIGFuZCBnaXZlcyBiYWNrIHRoZSBleGNlc3MgbWVtb3J5LgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYXBfZGVsZXRlX2V4bGlzdCgKKwl4ZnNfaW5vZGVfdAkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19leHRudW1fdAlpZHgsCQkvKiBzdGFydGluZyBkZWxldGUgaW5kZXggKi8KKwl4ZnNfZXh0bnVtX3QJY291bnQsCQkvKiBjb3VudCBvZiBpdGVtcyB0byBkZWxldGUgKi8KKwlpbnQJCXdoaWNoZm9yaykJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KK3sKKwl4ZnNfYm1idF9yZWNfdAkqYmFzZTsJCS8qIGJhc2Ugb2YgZXh0ZW50IGxpc3QgKi8KKwl4ZnNfaWZvcmtfdAkqaWZwOwkJLyogaW5vZGUgZm9yayBwb2ludGVyICovCisJeGZzX2V4dG51bV90CW5leHRlbnRzOwkvKiBudW1iZXIgb2YgZXh0ZW50cyBpbiBsaXN0IGFmdGVyICovCisKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCUFTU0VSVChpZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUyk7CisJYmFzZSA9IGlmcC0+aWZfdTEuaWZfZXh0ZW50czsKKwluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpIC0gY291bnQ7CisJbWVtbW92ZSgmYmFzZVtpZHhdLCAmYmFzZVtpZHggKyBjb3VudF0sCisJCShuZXh0ZW50cyAtIGlkeCkgKiBzaXplb2YoKmJhc2UpKTsKKwl4ZnNfaWV4dF9yZWFsbG9jKGlwLCAtY291bnQsIHdoaWNoZm9yayk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGFuIGV4dGVudHMtZm9ybWF0IGZpbGUgaW50byBhIGJ0cmVlLWZvcm1hdCBmaWxlLgorICogVGhlIG5ldyBmaWxlIHdpbGwgaGF2ZSBhIHJvb3QgYmxvY2sgKGluIHRoZSBpbm9kZSkgYW5kIGEgc2luZ2xlIGNoaWxkIGJsb2NrLgorICovCitTVEFUSUMgaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfZXh0ZW50c190b19idHJlZSgKKwl4ZnNfdHJhbnNfdAkJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9kZV90CQkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19mc2Jsb2NrX3QJCSpmaXJzdGJsb2NrLAkvKiBmaXJzdC1ibG9jay1hbGxvY2F0ZWQgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJCS8qIGJsb2NrcyBmcmVlZCBpbiB4YWN0aW9uICovCisJeGZzX2J0cmVlX2N1cl90CQkqKmN1cnAsCQkvKiBjdXJzb3IgcmV0dXJuZWQgdG8gY2FsbGVyICovCisJaW50CQkJd2FzZGVsLAkJLyogY29udmVydGluZyBhIGRlbGF5ZWQgYWxsb2MgKi8KKwlpbnQJCQkqbG9nZmxhZ3NwLAkvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCisJaW50CQkJd2hpY2hmb3JrKQkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworeworCXhmc19ibWJ0X2Jsb2NrX3QJKmFibG9jazsJLyogYWxsb2NhdGVkIChjaGlsZCkgYnQgYmxvY2sgKi8KKwl4ZnNfYnVmX3QJCSphYnA7CQkvKiBidWZmZXIgZm9yIGFibG9jayAqLworCXhmc19hbGxvY19hcmdfdAkJYXJnczsJCS8qIGFsbG9jYXRpb24gYXJndW1lbnRzICovCisJeGZzX2JtYnRfcmVjX3QJCSphcnA7CQkvKiBjaGlsZCByZWNvcmQgcG9pbnRlciAqLworCXhmc19ibWJ0X2Jsb2NrX3QJKmJsb2NrOwkJLyogYnRyZWUgcm9vdCBibG9jayAqLworCXhmc19idHJlZV9jdXJfdAkJKmN1cjsJCS8qIGJtYXAgYnRyZWUgY3Vyc29yICovCisJeGZzX2JtYnRfcmVjX3QJCSplcDsJCS8qIGV4dGVudCBsaXN0IHBvaW50ZXIgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19leHRudW1fdAkJaSwgY250OwkJLyogZXh0ZW50IGxpc3QgaW5kZXggKi8KKwl4ZnNfaWZvcmtfdAkJKmlmcDsJCS8qIGlub2RlIGZvcmsgcG9pbnRlciAqLworCXhmc19ibWJ0X2tleV90CQkqa3A7CQkvKiByb290IGJsb2NrIGtleSBwb2ludGVyICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIG1vdW50IHN0cnVjdHVyZSAqLworCXhmc19leHRudW1fdAkJbmV4dGVudHM7CS8qIGV4dGVudCBsaXN0IHNpemUgKi8KKwl4ZnNfYm1idF9wdHJfdAkJKnBwOwkJLyogcm9vdCBibG9jayBhZGRyZXNzIHBvaW50ZXIgKi8KKworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJQVNTRVJUKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyk7CisJQVNTRVJUKGlmcC0+aWZfZXh0X21heCA9PQorCSAgICAgICBYRlNfSUZPUktfU0laRShpcCwgd2hpY2hmb3JrKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkpOworCS8qCisJICogTWFrZSBzcGFjZSBpbiB0aGUgaW5vZGUgaW5jb3JlLgorCSAqLworCXhmc19pcm9vdF9yZWFsbG9jKGlwLCAxLCB3aGljaGZvcmspOworCWlmcC0+aWZfZmxhZ3MgfD0gWEZTX0lGQlJPT1Q7CisJLyoKKwkgKiBGaWxsIGluIHRoZSByb290LgorCSAqLworCWJsb2NrID0gaWZwLT5pZl9icm9vdDsKKwlJTlRfU0VUKGJsb2NrLT5iYl9tYWdpYywgQVJDSF9DT05WRVJULCBYRlNfQk1BUF9NQUdJQyk7CisJSU5UX1NFVChibG9jay0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCwgMSk7CisJSU5UX1NFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAxKTsKKwlJTlRfU0VUKGJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExERlNCTk8pOworCUlOVF9TRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExERlNCTk8pOworCS8qCisJICogTmVlZCBhIGN1cnNvci4gIENhbid0IGFsbG9jYXRlIHVudGlsIGJiX2xldmVsIGlzIGZpbGxlZCBpbi4KKwkgKi8KKwltcCA9IGlwLT5pX21vdW50OworCWN1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihtcCwgdHAsIE5VTEwsIDAsIFhGU19CVE5VTV9CTUFQLCBpcCwKKwkJd2hpY2hmb3JrKTsKKwljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0gKmZpcnN0YmxvY2s7CisJY3VyLT5iY19wcml2YXRlLmIuZmxpc3QgPSBmbGlzdDsKKwljdXItPmJjX3ByaXZhdGUuYi5mbGFncyA9IHdhc2RlbCA/IFhGU19CVENVUl9CUFJWX1dBU0RFTCA6IDA7CisJLyoKKwkgKiBDb252ZXJ0IHRvIGEgYnRyZWUgd2l0aCB0d28gbGV2ZWxzLCBvbmUgcmVjb3JkIGluIHJvb3QuCisJICovCisJWEZTX0lGT1JLX0ZNVF9TRVQoaXAsIHdoaWNoZm9yaywgWEZTX0RJTk9ERV9GTVRfQlRSRUUpOworCWFyZ3MudHAgPSB0cDsKKwlhcmdzLm1wID0gbXA7CisJaWYgKCpmaXJzdGJsb2NrID09IE5VTExGU0JMT0NLKSB7CisJCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfU1RBUlRfQk5POworCQlhcmdzLmZzYm5vID0gWEZTX0lOT19UT19GU0IobXAsIGlwLT5pX2lubyk7CisJfSBlbHNlIGlmIChmbGlzdC0+eGJmX2xvdykgeworCQlhcmdzLnR5cGUgPSBYRlNfQUxMT0NUWVBFX1NUQVJUX0JOTzsKKwkJYXJncy5mc2JubyA9ICpmaXJzdGJsb2NrOworCX0gZWxzZSB7CisJCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfTkVBUl9CTk87CisJCWFyZ3MuZnNibm8gPSAqZmlyc3RibG9jazsKKwl9CisJYXJncy5taW5sZW4gPSBhcmdzLm1heGxlbiA9IGFyZ3MucHJvZCA9IDE7CisJYXJncy50b3RhbCA9IGFyZ3MubWlubGVmdCA9IGFyZ3MuYWxpZ25tZW50ID0gYXJncy5tb2QgPSBhcmdzLmlzZmwgPQorCQlhcmdzLm1pbmFsaWduc2xvcCA9IDA7CisJYXJncy53YXNkZWwgPSB3YXNkZWw7CisJKmxvZ2ZsYWdzcCA9IDA7CisJaWYgKChlcnJvciA9IHhmc19hbGxvY192ZXh0ZW50KCZhcmdzKSkpIHsKKwkJeGZzX2lyb290X3JlYWxsb2MoaXAsIC0xLCB3aGljaGZvcmspOworCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjdXIsIFhGU19CVFJFRV9FUlJPUik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBBbGxvY2F0aW9uIGNhbid0IGZhaWwsIHRoZSBzcGFjZSB3YXMgcmVzZXJ2ZWQuCisJICovCisJQVNTRVJUKGFyZ3MuZnNibm8gIT0gTlVMTEZTQkxPQ0spOworCUFTU0VSVCgqZmlyc3RibG9jayA9PSBOVUxMRlNCTE9DSyB8fAorCSAgICAgICBhcmdzLmFnbm8gPT0gWEZTX0ZTQl9UT19BR05PKG1wLCAqZmlyc3RibG9jaykgfHwKKwkgICAgICAgKGZsaXN0LT54YmZfbG93ICYmCisJCWFyZ3MuYWdubyA+IFhGU19GU0JfVE9fQUdOTyhtcCwgKmZpcnN0YmxvY2spKSk7CisJKmZpcnN0YmxvY2sgPSBjdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0gYXJncy5mc2JubzsKKwljdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQrKzsKKwlpcC0+aV9kLmRpX25ibG9ja3MrKzsKKwlYRlNfVFJBTlNfTU9EX0RRVU9UX0JZSU5PKG1wLCB0cCwgaXAsIFhGU19UUkFOU19EUV9CQ09VTlQsIDFMKTsKKwlhYnAgPSB4ZnNfYnRyZWVfZ2V0X2J1ZmwobXAsIHRwLCBhcmdzLmZzYm5vLCAwKTsKKwkvKgorCSAqIEZpbGwgaW4gdGhlIGNoaWxkIGJsb2NrLgorCSAqLworCWFibG9jayA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhhYnApOworCUlOVF9TRVQoYWJsb2NrLT5iYl9tYWdpYywgQVJDSF9DT05WRVJULCBYRlNfQk1BUF9NQUdJQyk7CisJYWJsb2NrLT5iYl9sZXZlbCA9IDA7CisJSU5UX1NFVChhYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCwgTlVMTERGU0JOTyk7CisJSU5UX1NFVChhYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExERlNCTk8pOworCWFycCA9IFhGU19CTUFQX1JFQ19JQUREUihhYmxvY2ssIDEsIGN1cik7CisJbmV4dGVudHMgPSBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwlmb3IgKGVwID0gaWZwLT5pZl91MS5pZl9leHRlbnRzLCBjbnQgPSBpID0gMDsgaSA8IG5leHRlbnRzOyBpKyssIGVwKyspIHsKKwkJaWYgKCFJU05VTExTVEFSVEJMT0NLKHhmc19ibWJ0X2dldF9zdGFydGJsb2NrKGVwKSkpIHsKKwkJCWFycC0+bDAgPSBJTlRfR0VUKGVwLT5sMCwgQVJDSF9DT05WRVJUKTsKKwkJCWFycC0+bDEgPSBJTlRfR0VUKGVwLT5sMSwgQVJDSF9DT05WRVJUKTsKKwkJCWFycCsrOyBjbnQrKzsKKwkJfQorCX0KKwlJTlRfU0VUKGFibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCBjbnQpOworCUFTU0VSVChJTlRfR0VUKGFibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA9PSBYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykpOworCS8qCisJICogRmlsbCBpbiB0aGUgcm9vdCBrZXkgYW5kIHBvaW50ZXIuCisJICovCisJa3AgPSBYRlNfQk1BUF9LRVlfSUFERFIoYmxvY2ssIDEsIGN1cik7CisJYXJwID0gWEZTX0JNQVBfUkVDX0lBRERSKGFibG9jaywgMSwgY3VyKTsKKwlJTlRfU0VUKGtwLT5icl9zdGFydG9mZiwgQVJDSF9DT05WRVJULCB4ZnNfYm1idF9kaXNrX2dldF9zdGFydG9mZihhcnApKTsKKwlwcCA9IFhGU19CTUFQX1BUUl9JQUREUihibG9jaywgMSwgY3VyKTsKKwlJTlRfU0VUKCpwcCwgQVJDSF9DT05WRVJULCBhcmdzLmZzYm5vKTsKKwkvKgorCSAqIERvIGFsbCB0aGlzIGxvZ2dpbmcgYXQgdGhlIGVuZCBzbyB0aGF0CisJICogdGhlIHJvb3QgaXMgYXQgdGhlIHJpZ2h0IGxldmVsLgorCSAqLworCXhmc19ibWJ0X2xvZ19ibG9jayhjdXIsIGFicCwgWEZTX0JCX0FMTF9CSVRTKTsKKwl4ZnNfYm1idF9sb2dfcmVjcyhjdXIsIGFicCwgMSwgSU5UX0dFVChhYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVCgqY3VycCA9PSBOVUxMKTsKKwkqY3VycCA9IGN1cjsKKwkqbG9nZmxhZ3NwID0gWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0ZCUk9PVCh3aGljaGZvcmspOworCXJldHVybiAwOworfQorCisvKgorICogSW5zZXJ0IG5ldyBpdGVtKHMpIGluIHRoZSBleHRlbnQgbGlzdCBmb3IgaW5vZGUgImlwIi4KKyAqIENvdW50IG5ldyBpdGVtcyBhcmUgaW5zZXJ0ZWQgYXQgb2Zmc2V0IGlkeC4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWFwX2luc2VydF9leGxpc3QoCisJeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJaWR4LAkJLyogc3RhcnRpbmcgaW5kZXggb2YgbmV3IGl0ZW1zICovCisJeGZzX2V4dG51bV90CWNvdW50LAkJLyogbnVtYmVyIG9mIGluc2VydGVkIGl0ZW1zICovCisJeGZzX2JtYnRfaXJlY190CSpuZXcsCQkvKiBpdGVtcyB0byBpbnNlcnQgKi8KKwlpbnQJCXdoaWNoZm9yaykJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KK3sKKwl4ZnNfYm1idF9yZWNfdAkqYmFzZTsJCS8qIGV4dGVudCBsaXN0IGJhc2UgKi8KKwl4ZnNfaWZvcmtfdAkqaWZwOwkJLyogaW5vZGUgZm9yayBwb2ludGVyICovCisJeGZzX2V4dG51bV90CW5leHRlbnRzOwkvKiBleHRlbnQgbGlzdCBzaXplICovCisJeGZzX2V4dG51bV90CXRvOwkJLyogZXh0ZW50IGxpc3QgaW5kZXggKi8KKworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJQVNTRVJUKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKTsKKwl4ZnNfaWV4dF9yZWFsbG9jKGlwLCBjb3VudCwgd2hpY2hmb3JrKTsKKwliYXNlID0gaWZwLT5pZl91MS5pZl9leHRlbnRzOworCW5leHRlbnRzID0gaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJbWVtbW92ZSgmYmFzZVtpZHggKyBjb3VudF0sICZiYXNlW2lkeF0sCisJCShuZXh0ZW50cyAtIChpZHggKyBjb3VudCkpICogc2l6ZW9mKCpiYXNlKSk7CisJZm9yICh0byA9IGlkeDsgdG8gPCBpZHggKyBjb3VudDsgdG8rKywgbmV3KyspCisJCXhmc19ibWJ0X3NldF9hbGwoJmJhc2VbdG9dLCBuZXcpOworfQorCisvKgorICogQ29udmVydCBhIGxvY2FsIGZpbGUgdG8gYW4gZXh0ZW50cyBmaWxlLgorICogVGhpcyBjb2RlIGlzIG91dCBvZiBib3VuZHMgZm9yIGRhdGEgZm9ya3Mgb2YgcmVndWxhciBmaWxlcywKKyAqIHNpbmNlIHRoZSBmaWxlIGRhdGEgbmVlZHMgdG8gZ2V0IGxvZ2dlZCBzbyB0aGluZ3Mgd2lsbCBzdGF5IGNvbnNpc3RlbnQuCisgKiAoVGhlIGJtYXAtbGV2ZWwgbWFuaXB1bGF0aW9ucyBhcmUgb2ssIHRob3VnaCkuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2xvY2FsX3RvX2V4dGVudHMoCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9kZV90CSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2ZzYmxvY2tfdAkqZmlyc3RibG9jaywJLyogZmlyc3QgYmxvY2sgYWxsb2NhdGVkIGluIHhhY3Rpb24gKi8KKwl4ZnNfZXh0bGVuX3QJdG90YWwsCQkvKiB0b3RhbCBibG9ja3MgbmVlZGVkIGJ5IHRyYW5zYWN0aW9uICovCisJaW50CQkqbG9nZmxhZ3NwLAkvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCisJaW50CQl3aGljaGZvcmspCS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCit7CisJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJZmxhZ3M7CQkvKiBsb2dnaW5nIGZsYWdzIHJldHVybmVkICovCisjaWZkZWYgWEZTX0JNQVBfVFJBQ0UKKwlzdGF0aWMgY2hhcglmbmFtZVtdID0gInhmc19ibWFwX2xvY2FsX3RvX2V4dGVudHMiOworI2VuZGlmCisJeGZzX2lmb3JrX3QJKmlmcDsJCS8qIGlub2RlIGZvcmsgcG9pbnRlciAqLworCisJLyoKKwkgKiBXZSBkb24ndCB3YW50IHRvIGRlYWwgd2l0aCB0aGUgY2FzZSBvZiBrZWVwaW5nIGlub2RlIGRhdGEgaW5saW5lIHlldC4KKwkgKiBTbyBzZW5kaW5nIHRoZSBkYXRhIGZvcmsgb2YgYSByZWd1bGFyIGlub2RlIGlzIGludmFsaWQuCisJICovCisJQVNTRVJUKCEoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRlJFRyAmJgorCQkgd2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUkspKTsKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCUFTU0VSVChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKTsKKwlmbGFncyA9IDA7CisJZXJyb3IgPSAwOworCWlmIChpZnAtPmlmX2J5dGVzKSB7CisJCXhmc19hbGxvY19hcmdfdAlhcmdzOwkvKiBhbGxvY2F0aW9uIGFyZ3VtZW50cyAqLworCQl4ZnNfYnVmX3QJKmJwOwkvKiBidWZmZXIgZm9yIGV4dGVudCBsaXN0IGJsb2NrICovCisJCXhmc19ibWJ0X3JlY190CSplcDsJLyogZXh0ZW50IGxpc3QgcG9pbnRlciAqLworCisJCWFyZ3MudHAgPSB0cDsKKwkJYXJncy5tcCA9IGlwLT5pX21vdW50OworCQlBU1NFUlQoaWZwLT5pZl9mbGFncyAmIFhGU19JRklOTElORSk7CisJCS8qCisJCSAqIEFsbG9jYXRlIGEgYmxvY2suICBXZSBrbm93IHdlIG5lZWQgb25seSBvbmUsIHNpbmNlIHRoZQorCQkgKiBmaWxlIGN1cnJlbnRseSBmaXRzIGluIGFuIGlub2RlLgorCQkgKi8KKwkJaWYgKCpmaXJzdGJsb2NrID09IE5VTExGU0JMT0NLKSB7CisJCQlhcmdzLmZzYm5vID0gWEZTX0lOT19UT19GU0IoYXJncy5tcCwgaXAtPmlfaW5vKTsKKwkJCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfU1RBUlRfQk5POworCQl9IGVsc2UgeworCQkJYXJncy5mc2JubyA9ICpmaXJzdGJsb2NrOworCQkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9ORUFSX0JOTzsKKwkJfQorCQlhcmdzLnRvdGFsID0gdG90YWw7CisJCWFyZ3MubW9kID0gYXJncy5taW5sZWZ0ID0gYXJncy5hbGlnbm1lbnQgPSBhcmdzLndhc2RlbCA9CisJCQlhcmdzLmlzZmwgPSBhcmdzLm1pbmFsaWduc2xvcCA9IDA7CisJCWFyZ3MubWlubGVuID0gYXJncy5tYXhsZW4gPSBhcmdzLnByb2QgPSAxOworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX3ZleHRlbnQoJmFyZ3MpKSkKKwkJCWdvdG8gZG9uZTsKKwkJLyoKKwkJICogQ2FuJ3QgZmFpbCwgdGhlIHNwYWNlIHdhcyByZXNlcnZlZC4KKwkJICovCisJCUFTU0VSVChhcmdzLmZzYm5vICE9IE5VTExGU0JMT0NLKTsKKwkJQVNTRVJUKGFyZ3MubGVuID09IDEpOworCQkqZmlyc3RibG9jayA9IGFyZ3MuZnNibm87CisJCWJwID0geGZzX2J0cmVlX2dldF9idWZsKGFyZ3MubXAsIHRwLCBhcmdzLmZzYm5vLCAwKTsKKwkJbWVtY3B5KChjaGFyICopWEZTX0JVRl9QVFIoYnApLCBpZnAtPmlmX3UxLmlmX2RhdGEsCisJCQlpZnAtPmlmX2J5dGVzKTsKKwkJeGZzX3RyYW5zX2xvZ19idWYodHAsIGJwLCAwLCBpZnAtPmlmX2J5dGVzIC0gMSk7CisJCXhmc19pZGF0YV9yZWFsbG9jKGlwLCAtaWZwLT5pZl9ieXRlcywgd2hpY2hmb3JrKTsKKwkJeGZzX2lleHRfcmVhbGxvYyhpcCwgMSwgd2hpY2hmb3JrKTsKKwkJZXAgPSBpZnAtPmlmX3UxLmlmX2V4dGVudHM7CisJCXhmc19ibWJ0X3NldF9hbGxmKGVwLCAwLCBhcmdzLmZzYm5vLCAxLCBYRlNfRVhUX05PUk0pOworCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIm5ldyIsIGlwLCAwLCB3aGljaGZvcmspOworCQlYRlNfSUZPUktfTkVYVF9TRVQoaXAsIHdoaWNoZm9yaywgMSk7CisJCWlwLT5pX2QuZGlfbmJsb2NrcyA9IDE7CisJCVhGU19UUkFOU19NT0RfRFFVT1RfQllJTk8oYXJncy5tcCwgdHAsIGlwLAorCQkJWEZTX1RSQU5TX0RRX0JDT1VOVCwgMUwpOworCQlmbGFncyB8PSBYRlNfSUxPR19GRVhUKHdoaWNoZm9yayk7CisJfSBlbHNlCisJCUFTU0VSVChYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgPT0gMCk7CisJaWZwLT5pZl9mbGFncyAmPSB+WEZTX0lGSU5MSU5FOworCWlmcC0+aWZfZmxhZ3MgfD0gWEZTX0lGRVhURU5UUzsKKwlYRlNfSUZPUktfRk1UX1NFVChpcCwgd2hpY2hmb3JrLCBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTKTsKKwlmbGFncyB8PSBYRlNfSUxPR19DT1JFOworZG9uZToKKwkqbG9nZmxhZ3NwID0gZmxhZ3M7CisJcmV0dXJuIGVycm9yOworfQorCit4ZnNfYm1idF9yZWNfdCAqCQkJLyogcG9pbnRlciB0byBmb3VuZCBleHRlbnQgZW50cnkgKi8KK3hmc19ibWFwX2RvX3NlYXJjaF9leHRlbnRzKAorCXhmc19ibWJ0X3JlY190CSpiYXNlLAkJLyogYmFzZSBvZiBleHRlbnQgbGlzdCAqLworCXhmc19leHRudW1fdAlsYXN0eCwJCS8qIGxhc3QgZXh0ZW50IGluZGV4IHVzZWQgKi8KKwl4ZnNfZXh0bnVtX3QJbmV4dGVudHMsCS8qIGV4dGVudCBsaXN0IHNpemUgKi8KKwl4ZnNfZmlsZW9mZl90CWJubywJCS8qIGJsb2NrIG51bWJlciBzZWFyY2hlZCBmb3IgKi8KKwlpbnQJCSplb2ZwLAkJLyogb3V0OiBlbmQgb2YgZmlsZSBmb3VuZCAqLworCXhmc19leHRudW1fdAkqbGFzdHhwLAkvKiBvdXQ6IGxhc3QgZXh0ZW50IGluZGV4ICovCisJeGZzX2JtYnRfaXJlY190CSpnb3RwLAkJLyogb3V0OiBleHRlbnQgZW50cnkgZm91bmQgKi8KKwl4ZnNfYm1idF9pcmVjX3QJKnByZXZwKQkJLyogb3V0OiBwcmV2aW91cyBleHRlbnQgZW50cnkgZm91bmQgKi8KK3sKKwl4ZnNfYm1idF9yZWNfdAkqZXA7CQkvKiBleHRlbnQgbGlzdCBlbnRyeSBwb2ludGVyICovCisJeGZzX2JtYnRfaXJlY190CWdvdDsJCS8qIGV4dGVudCBsaXN0IGVudHJ5LCBkZWNvZGVkICovCisJaW50CQloaWdoOwkJLyogaGlnaCBpbmRleCBvZiBiaW5hcnkgc2VhcmNoICovCisJaW50CQlsb3c7CQkvKiBsb3cgaW5kZXggb2YgYmluYXJ5IHNlYXJjaCAqLworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBleHRlbnQgZW50cnkgc3RydWN0dXJlIHRvIGNhdGNoIGFjY2VzcyB0bworCSAqIHVuaW5pdGlhbGl6ZWQgYnJfc3RhcnRibG9jayBmaWVsZC4KKwkgKi8KKwlnb3QuYnJfc3RhcnRvZmYgPSAweGZmYTVhNWE1YTVhNWE1YTVMTDsKKwlnb3QuYnJfYmxvY2tjb3VudCA9IDB4YTU1YTVhNWE1YTVhNWE1YUxMOworCWdvdC5icl9zdGF0ZSA9IFhGU19FWFRfSU5WQUxJRDsKKworI2lmIFhGU19CSUdfQkxLTk9TCisJZ290LmJyX3N0YXJ0YmxvY2sgPSAweGZmZmZhNWE1YTVhNWE1YTVMTDsKKyNlbHNlCisJZ290LmJyX3N0YXJ0YmxvY2sgPSAweGZmZmZhNWE1OworI2VuZGlmCisKKwlpZiAobGFzdHggIT0gTlVMTEVYVE5VTSAmJiBsYXN0eCA8IG5leHRlbnRzKQorCQllcCA9IGJhc2UgKyBsYXN0eDsKKwllbHNlCisJCWVwID0gTlVMTDsKKwlwcmV2cC0+YnJfc3RhcnRvZmYgPSBOVUxMRklMRU9GRjsKKwlpZiAoZXAgJiYgYm5vID49IChnb3QuYnJfc3RhcnRvZmYgPSB4ZnNfYm1idF9nZXRfc3RhcnRvZmYoZXApKSAmJgorCSAgICBibm8gPCBnb3QuYnJfc3RhcnRvZmYgKworCQkgIChnb3QuYnJfYmxvY2tjb3VudCA9IHhmc19ibWJ0X2dldF9ibG9ja2NvdW50KGVwKSkpCisJCSplb2ZwID0gMDsKKwllbHNlIGlmIChlcCAmJiBsYXN0eCA8IG5leHRlbnRzIC0gMSAmJgorCQkgYm5vID49IChnb3QuYnJfc3RhcnRvZmYgPSB4ZnNfYm1idF9nZXRfc3RhcnRvZmYoZXAgKyAxKSkgJiYKKwkJIGJubyA8IGdvdC5icl9zdGFydG9mZiArCisJCSAgICAgICAoZ290LmJyX2Jsb2NrY291bnQgPSB4ZnNfYm1idF9nZXRfYmxvY2tjb3VudChlcCArIDEpKSkgeworCQlsYXN0eCsrOworCQllcCsrOworCQkqZW9mcCA9IDA7CisJfSBlbHNlIGlmIChuZXh0ZW50cyA9PSAwKQorCQkqZW9mcCA9IDE7CisJZWxzZSBpZiAoYm5vID09IDAgJiYKKwkJIChnb3QuYnJfc3RhcnRvZmYgPSB4ZnNfYm1idF9nZXRfc3RhcnRvZmYoYmFzZSkpID09IDApIHsKKwkJZXAgPSBiYXNlOworCQlsYXN0eCA9IDA7CisJCWdvdC5icl9ibG9ja2NvdW50ID0geGZzX2JtYnRfZ2V0X2Jsb2NrY291bnQoZXApOworCQkqZW9mcCA9IDA7CisJfSBlbHNlIHsKKwkJLyogYmluYXJ5IHNlYXJjaCB0aGUgZXh0ZW50cyBhcnJheSAqLworCQlsb3cgPSAwOworCQloaWdoID0gbmV4dGVudHMgLSAxOworCQl3aGlsZSAobG93IDw9IGhpZ2gpIHsKKwkJCVhGU19TVEFUU19JTkMoeHNfY21wX2V4bGlzdCk7CisJCQlsYXN0eCA9IChsb3cgKyBoaWdoKSA+PiAxOworCQkJZXAgPSBiYXNlICsgbGFzdHg7CisJCQlnb3QuYnJfc3RhcnRvZmYgPSB4ZnNfYm1idF9nZXRfc3RhcnRvZmYoZXApOworCQkJZ290LmJyX2Jsb2NrY291bnQgPSB4ZnNfYm1idF9nZXRfYmxvY2tjb3VudChlcCk7CisJCQlpZiAoYm5vIDwgZ290LmJyX3N0YXJ0b2ZmKQorCQkJCWhpZ2ggPSBsYXN0eCAtIDE7CisJCQllbHNlIGlmIChibm8gPj0gZ290LmJyX3N0YXJ0b2ZmICsgZ290LmJyX2Jsb2NrY291bnQpCisJCQkJbG93ID0gbGFzdHggKyAxOworCQkJZWxzZSB7CisJCQkJZ290LmJyX3N0YXJ0YmxvY2sgPSB4ZnNfYm1idF9nZXRfc3RhcnRibG9jayhlcCk7CisJCQkJZ290LmJyX3N0YXRlID0geGZzX2JtYnRfZ2V0X3N0YXRlKGVwKTsKKwkJCQkqZW9mcCA9IDA7CisJCQkJKmxhc3R4cCA9IGxhc3R4OworCQkJCSpnb3RwID0gZ290OworCQkJCXJldHVybiBlcDsKKwkJCX0KKwkJfQorCQlpZiAoYm5vID49IGdvdC5icl9zdGFydG9mZiArIGdvdC5icl9ibG9ja2NvdW50KSB7CisJCQlsYXN0eCsrOworCQkJaWYgKGxhc3R4ID09IG5leHRlbnRzKSB7CisJCQkJKmVvZnAgPSAxOworCQkJCWdvdC5icl9zdGFydGJsb2NrID0geGZzX2JtYnRfZ2V0X3N0YXJ0YmxvY2soZXApOworCQkJCWdvdC5icl9zdGF0ZSA9IHhmc19ibWJ0X2dldF9zdGF0ZShlcCk7CisJCQkJKnByZXZwID0gZ290OworCQkJCWVwID0gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJKmVvZnAgPSAwOworCQkJCXhmc19ibWJ0X2dldF9hbGwoZXAsIHByZXZwKTsKKwkJCQllcCsrOworCQkJCWdvdC5icl9zdGFydG9mZiA9IHhmc19ibWJ0X2dldF9zdGFydG9mZihlcCk7CisJCQkJZ290LmJyX2Jsb2NrY291bnQgPSB4ZnNfYm1idF9nZXRfYmxvY2tjb3VudChlcCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkqZW9mcCA9IDA7CisJCQlpZiAoZXAgPiBiYXNlKQorCQkJCXhmc19ibWJ0X2dldF9hbGwoZXAgLSAxLCBwcmV2cCk7CisJCX0KKwl9CisJaWYgKGVwKSB7CisJCWdvdC5icl9zdGFydGJsb2NrID0geGZzX2JtYnRfZ2V0X3N0YXJ0YmxvY2soZXApOworCQlnb3QuYnJfc3RhdGUgPSB4ZnNfYm1idF9nZXRfc3RhdGUoZXApOworCX0KKwkqbGFzdHhwID0gbGFzdHg7CisJKmdvdHAgPSBnb3Q7CisJcmV0dXJuIGVwOworfQorCisvKgorICogU2VhcmNoIHRoZSBleHRlbnRzIGxpc3QgZm9yIHRoZSBpbm9kZSwgZm9yIHRoZSBleHRlbnQgY29udGFpbmluZyBibm8uCisgKiBJZiBibm8gbGllcyBpbiBhIGhvbGUsIHBvaW50IHRvIHRoZSBuZXh0IGVudHJ5LiAgSWYgYm5vIGxpZXMgcGFzdCBlb2YsCisgKiAqZW9mcCB3aWxsIGJlIHNldCwgYW5kICpwcmV2cCB3aWxsIGNvbnRhaW4gdGhlIGxhc3QgZW50cnkgKG51bGwgaWYgbm9uZSkuCisgKiBFbHNlLCAqbGFzdHhwIHdpbGwgYmUgc2V0IHRvIHRoZSBpbmRleCBvZiB0aGUgZm91bmQKKyAqIGVudHJ5OyAqZ290cCB3aWxsIGNvbnRhaW4gdGhlIGVudHJ5LgorICovCitTVEFUSUMgeGZzX2JtYnRfcmVjX3QgKiAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBmb3VuZCBleHRlbnQgZW50cnkgKi8KK3hmc19ibWFwX3NlYXJjaF9leHRlbnRzKAorCXhmc19pbm9kZV90ICAgICAqaXAsICAgICAgICAgICAgLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZmlsZW9mZl90ICAgYm5vLCAgICAgICAgICAgIC8qIGJsb2NrIG51bWJlciBzZWFyY2hlZCBmb3IgKi8KKwlpbnQgICAgICAgICAgICAgd2hpY2hmb3JrLCAgICAgIC8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisJaW50ICAgICAgICAgICAgICplb2ZwLCAgICAgICAgICAvKiBvdXQ6IGVuZCBvZiBmaWxlIGZvdW5kICovCisJeGZzX2V4dG51bV90ICAgICpsYXN0eHAsICAgICAgICAvKiBvdXQ6IGxhc3QgZXh0ZW50IGluZGV4ICovCisJeGZzX2JtYnRfaXJlY190ICpnb3RwLCAgICAgICAgICAvKiBvdXQ6IGV4dGVudCBlbnRyeSBmb3VuZCAqLworCXhmc19ibWJ0X2lyZWNfdCAqcHJldnApICAgICAgICAgLyogb3V0OiBwcmV2aW91cyBleHRlbnQgZW50cnkgZm91bmQgKi8KK3sKKwl4ZnNfaWZvcmtfdAkqaWZwOwkJLyogaW5vZGUgZm9yayBwb2ludGVyICovCisJeGZzX2JtYnRfcmVjX3QgICpiYXNlOyAgICAgICAgICAvKiBiYXNlIG9mIGV4dGVudCBsaXN0ICovCisJeGZzX2V4dG51bV90ICAgIGxhc3R4OyAgICAgICAgICAvKiBsYXN0IGV4dGVudCBpbmRleCB1c2VkICovCisJeGZzX2V4dG51bV90ICAgIG5leHRlbnRzOyAgICAgICAvKiBleHRlbnQgbGlzdCBzaXplICovCisJeGZzX2JtYnRfcmVjX3QgICplcDsgICAgICAgICAgICAvKiBleHRlbnQgbGlzdCBlbnRyeSBwb2ludGVyICovCisJaW50CQlydDsJCS8qIHJlYWx0aW1lIGZsYWcgICAgKi8KKworCVhGU19TVEFUU19JTkMoeHNfbG9va19leGxpc3QpOworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJbGFzdHggPSBpZnAtPmlmX2xhc3RleDsKKwluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCWJhc2UgPSAmaWZwLT5pZl91MS5pZl9leHRlbnRzWzBdOworCisJZXAgPSB4ZnNfYm1hcF9kb19zZWFyY2hfZXh0ZW50cyhiYXNlLCBsYXN0eCwgbmV4dGVudHMsIGJubywgZW9mcCwKKwkJCQkJICBsYXN0eHAsIGdvdHAsIHByZXZwKTsKKwlydCA9IGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FOworCWlmKCFydCAmJiAhZ290cC0+YnJfc3RhcnRibG9jayAmJiAoKmxhc3R4cCAhPSBOVUxMRVhUTlVNKSkgeworICAgICAgICAgICAgICAgIGNtbl9lcnIoQ0VfUEFOSUMsIkFjY2VzcyB0byBibG9jayB6ZXJvOiBmczogPCVzPiBpbm9kZTogJWxsZCAiCisJCQkic3RhcnRfYmxvY2sgOiAlbGx4IHN0YXJ0X29mZiA6ICVsbHggYmxrY250IDogJWxseCAiCisJCQkiZXh0ZW50LXN0YXRlIDogJXggXG4iLAorCQkJKGlwLT5pX21vdW50KS0+bV9mc25hbWUsKGxvbmcgbG9uZylpcC0+aV9pbm8sCisJCQlnb3RwLT5icl9zdGFydGJsb2NrLCBnb3RwLT5icl9zdGFydG9mZiwKKwkJCWdvdHAtPmJyX2Jsb2NrY291bnQsZ290cC0+YnJfc3RhdGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcDsKK30KKworCisjaWZkZWYgWEZTX0JNQVBfVFJBQ0UKK2t0cmFjZV90CSp4ZnNfYm1hcF90cmFjZV9idWY7CisKKy8qCisgKiBBZGQgYSBibWFwIHRyYWNlIGJ1ZmZlciBlbnRyeS4gIEJhc2Ugcm91dGluZSBmb3IgdGhlIG90aGVycy4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWFwX3RyYWNlX2FkZGVudHJ5KAorCWludAkJb3Bjb2RlLAkJLyogb3BlcmF0aW9uICovCisJY2hhcgkJKmZuYW1lLAkJLyogZnVuY3Rpb24gbmFtZSAqLworCWNoYXIJCSpkZXNjLAkJLyogb3BlcmF0aW9uIGRlc2NyaXB0aW9uICovCisJeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJaWR4LAkJLyogaW5kZXggb2YgZW50cnkoaWVzKSAqLworCXhmc19leHRudW1fdAljbnQsCQkvKiBjb3VudCBvZiBlbnRyaWVzLCAxIG9yIDIgKi8KKwl4ZnNfYm1idF9yZWNfdAkqcjEsCQkvKiBmaXJzdCByZWNvcmQgKi8KKwl4ZnNfYm1idF9yZWNfdAkqcjIsCQkvKiBzZWNvbmQgcmVjb3JkIG9yIG51bGwgKi8KKwlpbnQJCXdoaWNoZm9yaykJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KK3sKKwl4ZnNfYm1idF9yZWNfdAl0cjI7CisKKwlBU1NFUlQoY250ID09IDEgfHwgY250ID09IDIpOworCUFTU0VSVChyMSAhPSBOVUxMKTsKKwlpZiAoY250ID09IDEpIHsKKwkJQVNTRVJUKHIyID09IE5VTEwpOworCQlyMiA9ICZ0cjI7CisJCW1lbXNldCgmdHIyLCAwLCBzaXplb2YodHIyKSk7CisJfSBlbHNlCisJCUFTU0VSVChyMiAhPSBOVUxMKTsKKwlrdHJhY2VfZW50ZXIoeGZzX2JtYXBfdHJhY2VfYnVmLAorCQkodm9pZCAqKShfX3BzaW50X3QpKG9wY29kZSB8ICh3aGljaGZvcmsgPDwgMTYpKSwKKwkJKHZvaWQgKilmbmFtZSwgKHZvaWQgKilkZXNjLCAodm9pZCAqKWlwLAorCQkodm9pZCAqKShfX3BzaW50X3QpaWR4LAorCQkodm9pZCAqKShfX3BzaW50X3QpY250LAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCkoaXAtPmlfaW5vID4+IDMyKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpKHVuc2lnbmVkKWlwLT5pX2lubywKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpKHIxLT5sMCA+PiAzMiksCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KSh1bnNpZ25lZCkocjEtPmwwKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpKHIxLT5sMSA+PiAzMiksCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KSh1bnNpZ25lZCkocjEtPmwxKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpKHIyLT5sMCA+PiAzMiksCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KSh1bnNpZ25lZCkocjItPmwwKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpKHIyLT5sMSA+PiAzMiksCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KSh1bnNpZ25lZCkocjItPmwxKQorCQkpOworCUFTU0VSVChpcC0+aV94dHJhY2UpOworCWt0cmFjZV9lbnRlcihpcC0+aV94dHJhY2UsCisJCSh2b2lkICopKF9fcHNpbnRfdCkob3Bjb2RlIHwgKHdoaWNoZm9yayA8PCAxNikpLAorCQkodm9pZCAqKWZuYW1lLCAodm9pZCAqKWRlc2MsICh2b2lkICopaXAsCisJCSh2b2lkICopKF9fcHNpbnRfdClpZHgsCisJCSh2b2lkICopKF9fcHNpbnRfdCljbnQsCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KShpcC0+aV9pbm8gPj4gMzIpLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCkodW5zaWduZWQpaXAtPmlfaW5vLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCkocjEtPmwwID4+IDMyKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpKHVuc2lnbmVkKShyMS0+bDApLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCkocjEtPmwxID4+IDMyKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpKHVuc2lnbmVkKShyMS0+bDEpLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCkocjItPmwwID4+IDMyKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpKHVuc2lnbmVkKShyMi0+bDApLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCkocjItPmwxID4+IDMyKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpKHVuc2lnbmVkKShyMi0+bDEpCisJCSk7Cit9CisKKy8qCisgKiBBZGQgYm1hcCB0cmFjZSBlbnRyeSBwcmlvciB0byBhIGNhbGwgdG8geGZzX2JtYXBfZGVsZXRlX2V4bGlzdC4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWFwX3RyYWNlX2RlbGV0ZSgKKwljaGFyCQkqZm5hbWUsCQkvKiBmdW5jdGlvbiBuYW1lICovCisJY2hhcgkJKmRlc2MsCQkvKiBvcGVyYXRpb24gZGVzY3JpcHRpb24gKi8KKwl4ZnNfaW5vZGVfdAkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19leHRudW1fdAlpZHgsCQkvKiBpbmRleCBvZiBlbnRyeShlbnRyaWVzKSBkZWxldGVkICovCisJeGZzX2V4dG51bV90CWNudCwJCS8qIGNvdW50IG9mIGVudHJpZXMgZGVsZXRlZCwgMSBvciAyICovCisJaW50CQl3aGljaGZvcmspCS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCit7CisJeGZzX2lmb3JrX3QJKmlmcDsJCS8qIGlub2RlIGZvcmsgcG9pbnRlciAqLworCisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwl4ZnNfYm1hcF90cmFjZV9hZGRlbnRyeShYRlNfQk1BUF9LVFJBQ0VfREVMRVRFLCBmbmFtZSwgZGVzYywgaXAsIGlkeCwKKwkJY250LCAmaWZwLT5pZl91MS5pZl9leHRlbnRzW2lkeF0sCisJCWNudCA9PSAyID8gJmlmcC0+aWZfdTEuaWZfZXh0ZW50c1tpZHggKyAxXSA6IE5VTEwsCisJCXdoaWNoZm9yayk7Cit9CisKKy8qCisgKiBBZGQgYm1hcCB0cmFjZSBlbnRyeSBwcmlvciB0byBhIGNhbGwgdG8geGZzX2JtYXBfaW5zZXJ0X2V4bGlzdCwgb3IKKyAqIHJlYWRpbmcgaW4gdGhlIGV4dGVudHMgbGlzdCBmcm9tIHRoZSBkaXNrIChpbiB0aGUgYnRyZWUpLgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYXBfdHJhY2VfaW5zZXJ0KAorCWNoYXIJCSpmbmFtZSwJCS8qIGZ1bmN0aW9uIG5hbWUgKi8KKwljaGFyCQkqZGVzYywJCS8qIG9wZXJhdGlvbiBkZXNjcmlwdGlvbiAqLworCXhmc19pbm9kZV90CSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CWlkeCwJCS8qIGluZGV4IG9mIGVudHJ5KGVudHJpZXMpIGluc2VydGVkICovCisJeGZzX2V4dG51bV90CWNudCwJCS8qIGNvdW50IG9mIGVudHJpZXMgaW5zZXJ0ZWQsIDEgb3IgMiAqLworCXhmc19ibWJ0X2lyZWNfdAkqcjEsCQkvKiBpbnNlcnRlZCByZWNvcmQgMSAqLworCXhmc19ibWJ0X2lyZWNfdAkqcjIsCQkvKiBpbnNlcnRlZCByZWNvcmQgMiBvciBudWxsICovCisJaW50CQl3aGljaGZvcmspCS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCit7CisJeGZzX2JtYnRfcmVjX3QJdHIxOwkJLyogY29tcHJlc3NlZCByZWNvcmQgMSAqLworCXhmc19ibWJ0X3JlY190CXRyMjsJCS8qIGNvbXByZXNzZWQgcmVjb3JkIDIgaWYgbmVlZGVkICovCisKKwl4ZnNfYm1idF9zZXRfYWxsKCZ0cjEsIHIxKTsKKwlpZiAoY250ID09IDIpIHsKKwkJQVNTRVJUKHIyICE9IE5VTEwpOworCQl4ZnNfYm1idF9zZXRfYWxsKCZ0cjIsIHIyKTsKKwl9IGVsc2UgeworCQlBU1NFUlQoY250ID09IDEpOworCQlBU1NFUlQocjIgPT0gTlVMTCk7CisJfQorCXhmc19ibWFwX3RyYWNlX2FkZGVudHJ5KFhGU19CTUFQX0tUUkFDRV9JTlNFUlQsIGZuYW1lLCBkZXNjLCBpcCwgaWR4LAorCQljbnQsICZ0cjEsIGNudCA9PSAyID8gJnRyMiA6IE5VTEwsIHdoaWNoZm9yayk7Cit9CisKKy8qCisgKiBBZGQgYm1hcCB0cmFjZSBlbnRyeSBhZnRlciB1cGRhdGluZyBhbiBleHRlbnQgbGlzdCBlbnRyeSBpbiBwbGFjZS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKAorCWNoYXIJCSpmbmFtZSwJCS8qIGZ1bmN0aW9uIG5hbWUgKi8KKwljaGFyCQkqZGVzYywJCS8qIG9wZXJhdGlvbiBkZXNjcmlwdGlvbiAqLworCXhmc19pbm9kZV90CSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CWlkeCwJCS8qIGluZGV4IG9mIGVudHJ5IHVwZGF0ZWQgKi8KKwlpbnQJCXdoaWNoZm9yaykJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KK3sKKwl4ZnNfaWZvcmtfdAkqaWZwOwkJLyogaW5vZGUgZm9yayBwb2ludGVyICovCisKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCXhmc19ibWFwX3RyYWNlX2FkZGVudHJ5KFhGU19CTUFQX0tUUkFDRV9QT1NUX1VQLCBmbmFtZSwgZGVzYywgaXAsIGlkeCwKKwkJMSwgJmlmcC0+aWZfdTEuaWZfZXh0ZW50c1tpZHhdLCBOVUxMLCB3aGljaGZvcmspOworfQorCisvKgorICogQWRkIGJtYXAgdHJhY2UgZW50cnkgcHJpb3IgdG8gdXBkYXRpbmcgYW4gZXh0ZW50IGxpc3QgZW50cnkgaW4gcGxhY2UuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKAorCWNoYXIJCSpmbmFtZSwJCS8qIGZ1bmN0aW9uIG5hbWUgKi8KKwljaGFyCQkqZGVzYywJCS8qIG9wZXJhdGlvbiBkZXNjcmlwdGlvbiAqLworCXhmc19pbm9kZV90CSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CWlkeCwJCS8qIGluZGV4IG9mIGVudHJ5IHRvIGJlIHVwZGF0ZWQgKi8KKwlpbnQJCXdoaWNoZm9yaykJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KK3sKKwl4ZnNfaWZvcmtfdAkqaWZwOwkJLyogaW5vZGUgZm9yayBwb2ludGVyICovCisKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCXhmc19ibWFwX3RyYWNlX2FkZGVudHJ5KFhGU19CTUFQX0tUUkFDRV9QUkVfVVAsIGZuYW1lLCBkZXNjLCBpcCwgaWR4LCAxLAorCQkmaWZwLT5pZl91MS5pZl9leHRlbnRzW2lkeF0sIE5VTEwsIHdoaWNoZm9yayk7Cit9CisjZW5kaWYJLyogWEZTX0JNQVBfVFJBQ0UgKi8KKworLyoKKyAqIENvbXB1dGUgdGhlIHdvcnN0LWNhc2UgbnVtYmVyIG9mIGluZGlyZWN0IGJsb2NrcyB0aGF0IHdpbGwgYmUgdXNlZAorICogZm9yIGlwJ3MgZGVsYXllZCBleHRlbnQgb2YgbGVuZ3RoICJsZW4iLgorICovCitTVEFUSUMgeGZzX2ZpbGJsa3NfdAoreGZzX2JtYXBfd29yc3RfaW5kbGVuKAorCXhmc19pbm9kZV90CSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2ZpbGJsa3NfdAlsZW4pCQkvKiBkZWxheWVkIGV4dGVudCBsZW5ndGggKi8KK3sKKwlpbnQJCWxldmVsOwkJLyogYnRyZWUgbGV2ZWwgbnVtYmVyICovCisJaW50CQltYXhyZWNzOwkvKiBtYXhpbXVtIHJlY29yZCBjb3VudCBhdCB0aGlzIGxldmVsICovCisJeGZzX21vdW50X3QJKm1wOwkJLyogbW91bnQgc3RydWN0dXJlICovCisJeGZzX2ZpbGJsa3NfdAlydmFsOwkJLyogcmV0dXJuIHZhbHVlICovCisKKwltcCA9IGlwLT5pX21vdW50OworCW1heHJlY3MgPSBtcC0+bV9ibWFwX2RteHJbMF07CisJZm9yIChsZXZlbCA9IDAsIHJ2YWwgPSAwOworCSAgICAgbGV2ZWwgPCBYRlNfQk1fTUFYTEVWRUxTKG1wLCBYRlNfREFUQV9GT1JLKTsKKwkgICAgIGxldmVsKyspIHsKKwkJbGVuICs9IG1heHJlY3MgLSAxOworCQlkb19kaXYobGVuLCBtYXhyZWNzKTsKKwkJcnZhbCArPSBsZW47CisJCWlmIChsZW4gPT0gMSkKKwkJCXJldHVybiBydmFsICsgWEZTX0JNX01BWExFVkVMUyhtcCwgWEZTX0RBVEFfRk9SSykgLQorCQkJCWxldmVsIC0gMTsKKwkJaWYgKGxldmVsID09IDApCisJCQltYXhyZWNzID0gbXAtPm1fYm1hcF9kbXhyWzFdOworCX0KKwlyZXR1cm4gcnZhbDsKK30KKworI2lmIGRlZmluZWQoWEZTX1JXX1RSQUNFKQorU1RBVElDIHZvaWQKK3hmc19idW5tYXBfdHJhY2UoCisJeGZzX2lub2RlX3QJCSppcCwKKwl4ZnNfZmlsZW9mZl90CQlibm8sCisJeGZzX2ZpbGJsa3NfdAkJbGVuLAorCWludAkJCWZsYWdzLAorCWluc3RfdAkJCSpyYSkKK3sKKwlpZiAoaXAtPmlfcnd0cmFjZSA9PSBOVUxMKQorCQlyZXR1cm47CisJa3RyYWNlX2VudGVyKGlwLT5pX3J3dHJhY2UsCisJCSh2b2lkICopKF9fcHNpbnRfdClYRlNfQlVOTUFQSSwKKwkJKHZvaWQgKilpcCwKKwkJKHZvaWQgKikoX19wc2ludF90KSgoaXAtPmlfZC5kaV9zaXplID4+IDMyKSAmIDB4ZmZmZmZmZmYpLAorCQkodm9pZCAqKShfX3BzaW50X3QpKGlwLT5pX2QuZGlfc2l6ZSAmIDB4ZmZmZmZmZmYpLAorCQkodm9pZCAqKShfX3BzaW50X3QpKCgoeGZzX2RmaWxvZmZfdClibm8gPj4gMzIpICYgMHhmZmZmZmZmZiksCisJCSh2b2lkICopKF9fcHNpbnRfdCkoKHhmc19kZmlsb2ZmX3QpYm5vICYgMHhmZmZmZmZmZiksCisJCSh2b2lkICopKF9fcHNpbnRfdClsZW4sCisJCSh2b2lkICopKF9fcHNpbnRfdClmbGFncywKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZyljdXJyZW50X2NwdSgpLAorCQkodm9pZCAqKXJhLAorCQkodm9pZCAqKTAsCisJCSh2b2lkICopMCwKKwkJKHZvaWQgKikwLAorCQkodm9pZCAqKTAsCisJCSh2b2lkICopMCwKKwkJKHZvaWQgKikwKTsKK30KKyNlbmRpZgorCisvKgorICogQ29udmVydCBpbm9kZSBmcm9tIG5vbi1hdHRyaWJ1dGVkIHRvIGF0dHJpYnV0ZWQuCisgKiBNdXN0IG5vdCBiZSBpbiBhIHRyYW5zYWN0aW9uLCBpcCBtdXN0IG5vdCBiZSBsb2NrZWQuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yIGNvZGUgKi8KK3hmc19ibWFwX2FkZF9hdHRyZm9yaygKKwl4ZnNfaW5vZGVfdAkJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwlpbnQJCQlyc3ZkKQkJLyogT0sgdG8gYWxsb2NhdGVkIHJlc2VydmVkIGJsb2NrcyBpbiB0cmFucyAqLworeworCWludAkJCWJsa3M7CQkvKiBzcGFjZSByZXNlcnZhdGlvbiAqLworCWludAkJCWNvbW1pdHRlZDsJLyogeGFjdGlvbiB3YXMgY29tbWl0dGVkICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfZnNibG9ja190CQlmaXJzdGJsb2NrOwkvKiAxc3QgYmxvY2svYWcgYWxsb2NhdGVkICovCisJeGZzX2JtYXBfZnJlZV90CQlmbGlzdDsJCS8qIGZyZWVkIGV4dGVudCBsaXN0ICovCisJaW50CQkJbG9nZmxhZ3M7CS8qIGxvZ2dpbmcgZmxhZ3MgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogbW91bnQgc3RydWN0dXJlICovCisJdW5zaWduZWQgbG9uZwkJczsJCS8qIHNwaW5sb2NrIHNwbCB2YWx1ZSAqLworCXhmc190cmFuc190CQkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisKKwlBU1NFUlQoaXAtPmlfZGYuaWZfZXh0X21heCA9PQorCSAgICAgICBYRlNfSUZPUktfRFNJWkUoaXApIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KSk7CisJaWYgKFhGU19JRk9SS19RKGlwKSkKKwkJcmV0dXJuIDA7CisJbXAgPSBpcC0+aV9tb3VudDsKKwlBU1NFUlQoIVhGU19OT1RfRFFBVFRBQ0hFRChtcCwgaXApKTsKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX0FEREFGT1JLKTsKKwlibGtzID0gWEZTX0FEREFGT1JLX1NQQUNFX1JFUyhtcCk7CisJaWYgKHJzdmQpCisJCXRwLT50X2ZsYWdzIHw9IFhGU19UUkFOU19SRVNFUlZFOworCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgYmxrcywgWEZTX0FEREFGT1JLX0xPR19SRVMobXApLCAwLAorCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywgWEZTX0FEREFGT1JLX0xPR19DT1VOVCkpKQorCQlnb3RvIGVycm9yMDsKKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwllcnJvciA9IFhGU19UUkFOU19SRVNFUlZFX1FVT1RBX05CTEtTKG1wLCB0cCwgaXAsIGJsa3MsIDAsIHJzdmQgPworCQkJWEZTX1FNT1BUX1JFU19SRUdCTEtTIHwgWEZTX1FNT1BUX0ZPUkNFX1JFUyA6CisJCQlYRlNfUU1PUFRfUkVTX1JFR0JMS1MpOworCWlmIChlcnJvcikgeworCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlpZiAoWEZTX0lGT1JLX1EoaXApKQorCQlnb3RvIGVycm9yMTsKKwlpZiAoaXAtPmlfZC5kaV9hZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0VYVEVOVFMpIHsKKwkJLyoKKwkJICogRm9yIGlub2RlcyBjb21pbmcgZnJvbSBwcmUtNi4yIGZpbGVzeXN0ZW1zLgorCQkgKi8KKwkJQVNTRVJUKGlwLT5pX2QuZGlfYWZvcm1hdCA9PSAwKTsKKwkJaXAtPmlfZC5kaV9hZm9ybWF0ID0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUzsKKwl9CisJQVNTRVJUKGlwLT5pX2QuZGlfYW5leHRlbnRzID09IDApOworCVZOX0hPTEQoWEZTX0lUT1YoaXApKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOworCXN3aXRjaCAoaXAtPmlfZC5kaV9mb3JtYXQpIHsKKwljYXNlIFhGU19ESU5PREVfRk1UX0RFVjoKKwkJaXAtPmlfZC5kaV9mb3Jrb2ZmID0gcm91bmR1cChzaXplb2YoeGZzX2Rldl90KSwgOCkgPj4gMzsKKwkJYnJlYWs7CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9VVUlEOgorCQlpcC0+aV9kLmRpX2ZvcmtvZmYgPSByb3VuZHVwKHNpemVvZih1dWlkX3QpLCA4KSA+PiAzOworCQlicmVhazsKKwljYXNlIFhGU19ESU5PREVfRk1UX0xPQ0FMOgorCWNhc2UgWEZTX0RJTk9ERV9GTVRfRVhURU5UUzoKKwljYXNlIFhGU19ESU5PREVfRk1UX0JUUkVFOgorCQlpcC0+aV9kLmRpX2ZvcmtvZmYgPSBtcC0+bV9hdHRyb2Zmc2V0ID4+IDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwkJZXJyb3IgPSBYRlNfRVJST1IoRUlOVkFMKTsKKwkJZ290byBlcnJvcjE7CisJfQorCWlwLT5pX2RmLmlmX2V4dF9tYXggPQorCQlYRlNfSUZPUktfRFNJWkUoaXApIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwlBU1NFUlQoaXAtPmlfYWZwID09IE5VTEwpOworCWlwLT5pX2FmcCA9IGttZW1fem9uZV96YWxsb2MoeGZzX2lmb3JrX3pvbmUsIEtNX1NMRUVQKTsKKwlpcC0+aV9hZnAtPmlmX2V4dF9tYXggPQorCQlYRlNfSUZPUktfQVNJWkUoaXApIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwlpcC0+aV9hZnAtPmlmX2ZsYWdzID0gWEZTX0lGRVhURU5UUzsKKwlsb2dmbGFncyA9IDA7CisJWEZTX0JNQVBfSU5JVCgmZmxpc3QsICZmaXJzdGJsb2NrKTsKKwlzd2l0Y2ggKGlwLT5pX2QuZGlfZm9ybWF0KSB7CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9MT0NBTDoKKwkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfYXR0cmZvcmtfbG9jYWwodHAsIGlwLCAmZmlyc3RibG9jaywgJmZsaXN0LAorCQkJJmxvZ2ZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTOgorCQllcnJvciA9IHhmc19ibWFwX2FkZF9hdHRyZm9ya19leHRlbnRzKHRwLCBpcCwgJmZpcnN0YmxvY2ssCisJCQkmZmxpc3QsICZsb2dmbGFncyk7CisJCWJyZWFrOworCWNhc2UgWEZTX0RJTk9ERV9GTVRfQlRSRUU6CisJCWVycm9yID0geGZzX2JtYXBfYWRkX2F0dHJmb3JrX2J0cmVlKHRwLCBpcCwgJmZpcnN0YmxvY2ssICZmbGlzdCwKKwkJCSZsb2dmbGFncyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycm9yID0gMDsKKwkJYnJlYWs7CisJfQorCWlmIChsb2dmbGFncykKKwkJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIGxvZ2ZsYWdzKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3IyOworCWlmICghWEZTX1NCX1ZFUlNJT05fSEFTQVRUUigmbXAtPm1fc2IpKSB7CisJCXMgPSBYRlNfU0JfTE9DSyhtcCk7CisJCWlmICghWEZTX1NCX1ZFUlNJT05fSEFTQVRUUigmbXAtPm1fc2IpKSB7CisJCQlYRlNfU0JfVkVSU0lPTl9BRERBVFRSKCZtcC0+bV9zYik7CisJCQlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKwkJCXhmc19tb2Rfc2IodHAsIFhGU19TQl9WRVJTSU9OTlVNKTsKKwkJfSBlbHNlCisJCQlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKwl9CisJaWYgKChlcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmdHAsICZmbGlzdCwgZmlyc3RibG9jaywgJmNvbW1pdHRlZCkpKQorCQlnb3RvIGVycm9yMjsKKwllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19QRVJNX0xPR19SRVMsIE5VTEwpOworCUFTU0VSVChpcC0+aV9kZi5pZl9leHRfbWF4ID09CisJICAgICAgIFhGU19JRk9SS19EU0laRShpcCkgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpKTsKKwlyZXR1cm4gZXJyb3I7CitlcnJvcjI6CisJeGZzX2JtYXBfY2FuY2VsKCZmbGlzdCk7CitlcnJvcjE6CisJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2xvY2ssTVJfVVBEQVRFKSk7CisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKK2Vycm9yMDoKKwl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTfFhGU19UUkFOU19BQk9SVCk7CisJQVNTRVJUKGlwLT5pX2RmLmlmX2V4dF9tYXggPT0KKwkgICAgICAgWEZTX0lGT1JLX0RTSVpFKGlwKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEFkZCB0aGUgZXh0ZW50IHRvIHRoZSBsaXN0IG9mIGV4dGVudHMgdG8gYmUgZnJlZSBhdCB0cmFuc2FjdGlvbiBlbmQuCisgKiBUaGUgbGlzdCBpcyBtYWludGFpbmVkIHNvcnRlZCAoYnkgYmxvY2sgbnVtYmVyKS4KKyAqLworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK3hmc19ibWFwX2FkZF9mcmVlKAorCXhmc19mc2Jsb2NrX3QJCWJubywJCS8qIGZzIGJsb2NrIG51bWJlciBvZiBleHRlbnQgKi8KKwl4ZnNfZmlsYmxrc190CQlsZW4sCQkvKiBsZW5ndGggb2YgZXh0ZW50ICovCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCQkvKiBsaXN0IG9mIGV4dGVudHMgKi8KKwl4ZnNfbW91bnRfdAkJKm1wKQkJLyogbW91bnQgcG9pbnQgc3RydWN0dXJlICovCit7CisJeGZzX2JtYXBfZnJlZV9pdGVtX3QJKmN1cjsJCS8qIGN1cnJlbnQgKG5leHQpIGVsZW1lbnQgKi8KKwl4ZnNfYm1hcF9mcmVlX2l0ZW1fdAkqbmV3OwkJLyogbmV3IGVsZW1lbnQgKi8KKwl4ZnNfYm1hcF9mcmVlX2l0ZW1fdAkqcHJldjsJCS8qIHByZXZpb3VzIGVsZW1lbnQgKi8KKyNpZmRlZiBERUJVRworCXhmc19hZ251bWJlcl90CQlhZ25vOworCXhmc19hZ2Jsb2NrX3QJCWFnYm5vOworCisJQVNTRVJUKGJubyAhPSBOVUxMRlNCTE9DSyk7CisJQVNTRVJUKGxlbiA+IDApOworCUFTU0VSVChsZW4gPD0gTUFYRVhUTEVOKTsKKwlBU1NFUlQoIUlTTlVMTFNUQVJUQkxPQ0soYm5vKSk7CisJYWdubyA9IFhGU19GU0JfVE9fQUdOTyhtcCwgYm5vKTsKKwlhZ2JubyA9IFhGU19GU0JfVE9fQUdCTk8obXAsIGJubyk7CisJQVNTRVJUKGFnbm8gPCBtcC0+bV9zYi5zYl9hZ2NvdW50KTsKKwlBU1NFUlQoYWdibm8gPCBtcC0+bV9zYi5zYl9hZ2Jsb2Nrcyk7CisJQVNTRVJUKGxlbiA8IG1wLT5tX3NiLnNiX2FnYmxvY2tzKTsKKwlBU1NFUlQoYWdibm8gKyBsZW4gPD0gbXAtPm1fc2Iuc2JfYWdibG9ja3MpOworI2VuZGlmCisJQVNTRVJUKHhmc19ibWFwX2ZyZWVfaXRlbV96b25lICE9IE5VTEwpOworCW5ldyA9IGttZW1fem9uZV9hbGxvYyh4ZnNfYm1hcF9mcmVlX2l0ZW1fem9uZSwgS01fU0xFRVApOworCW5ldy0+eGJmaV9zdGFydGJsb2NrID0gYm5vOworCW5ldy0+eGJmaV9ibG9ja2NvdW50ID0gKHhmc19leHRsZW5fdClsZW47CisJZm9yIChwcmV2ID0gTlVMTCwgY3VyID0gZmxpc3QtPnhiZl9maXJzdDsKKwkgICAgIGN1ciAhPSBOVUxMOworCSAgICAgcHJldiA9IGN1ciwgY3VyID0gY3VyLT54YmZpX25leHQpIHsKKwkJaWYgKGN1ci0+eGJmaV9zdGFydGJsb2NrID49IGJubykKKwkJCWJyZWFrOworCX0KKwlpZiAocHJldikKKwkJcHJldi0+eGJmaV9uZXh0ID0gbmV3OworCWVsc2UKKwkJZmxpc3QtPnhiZl9maXJzdCA9IG5ldzsKKwluZXctPnhiZmlfbmV4dCA9IGN1cjsKKwlmbGlzdC0+eGJmX2NvdW50Kys7Cit9CisKKy8qCisgKiBDb21wdXRlIGFuZCBmaWxsIGluIHRoZSB2YWx1ZSBvZiB0aGUgbWF4aW11bSBkZXB0aCBvZiBhIGJtYXAgYnRyZWUKKyAqIGluIHRoaXMgZmlsZXN5c3RlbS4gIERvbmUgb25jZSwgZHVyaW5nIG1vdW50LgorICovCit2b2lkCit4ZnNfYm1hcF9jb21wdXRlX21heGxldmVscygKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwlpbnQJCXdoaWNoZm9yaykJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KK3sKKwlpbnQJCWxldmVsOwkJLyogYnRyZWUgbGV2ZWwgKi8KKwl1aW50CQltYXhibG9ja3M7CS8qIG1heCBibG9ja3MgYXQgdGhpcyBsZXZlbCAqLworCXVpbnQJCW1heGxlYWZlbnRzOwkvKiBtYXggbGVhZiBlbnRyaWVzIHBvc3NpYmxlICovCisJaW50CQltYXhyb290cmVjczsJLyogbWF4IHJlY29yZHMgaW4gcm9vdCBibG9jayAqLworCWludAkJbWlubGVhZnJlY3M7CS8qIG1pbiByZWNvcmRzIGluIGxlYWYgYmxvY2sgKi8KKwlpbnQJCW1pbm5vZGVyZWNzOwkvKiBtaW4gcmVjb3JkcyBpbiBub2RlIGJsb2NrICovCisJaW50CQlzejsJCS8qIHJvb3QgYmxvY2sgc2l6ZSAqLworCisJLyoKKwkgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZXh0ZW50cyBpbiBhIGZpbGUsIGhlbmNlIHRoZSBtYXhpbXVtCisJICogbnVtYmVyIG9mIGxlYWYgZW50cmllcywgaXMgY29udHJvbGxlZCBieSB0aGUgdHlwZSBvZiBkaV9uZXh0ZW50cworCSAqIChhIHNpZ25lZCAzMi1iaXQgbnVtYmVyLCB4ZnNfZXh0bnVtX3QpLCBvciBieSBkaV9hbmV4dGVudHMKKwkgKiAoYSBzaWduZWQgMTYtYml0IG51bWJlciwgeGZzX2FleHRudW1fdCkuCisJICovCisJbWF4bGVhZmVudHMgPSAod2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUkspID8gTUFYRVhUTlVNIDogTUFYQUVYVE5VTTsKKwltaW5sZWFmcmVjcyA9IG1wLT5tX2JtYXBfZG1uclswXTsKKwltaW5ub2RlcmVjcyA9IG1wLT5tX2JtYXBfZG1uclsxXTsKKwlzeiA9ICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgPworCQltcC0+bV9hdHRyb2Zmc2V0IDoKKwkJbXAtPm1fc2Iuc2JfaW5vZGVzaXplIC0gbXAtPm1fYXR0cm9mZnNldDsKKwltYXhyb290cmVjcyA9IChpbnQpWEZTX0JUUkVFX0JMT0NLX01BWFJFQ1Moc3osIHhmc19ibWRyLCAwKTsKKwltYXhibG9ja3MgPSAobWF4bGVhZmVudHMgKyBtaW5sZWFmcmVjcyAtIDEpIC8gbWlubGVhZnJlY3M7CisJZm9yIChsZXZlbCA9IDE7IG1heGJsb2NrcyA+IDE7IGxldmVsKyspIHsKKwkJaWYgKG1heGJsb2NrcyA8PSBtYXhyb290cmVjcykKKwkJCW1heGJsb2NrcyA9IDE7CisJCWVsc2UKKwkJCW1heGJsb2NrcyA9IChtYXhibG9ja3MgKyBtaW5ub2RlcmVjcyAtIDEpIC8gbWlubm9kZXJlY3M7CisJfQorCW1wLT5tX2JtX21heGxldmVsc1t3aGljaGZvcmtdID0gbGV2ZWw7Cit9CisKKy8qCisgKiBSb3V0aW5lIHRvIGJlIGNhbGxlZCBhdCB0cmFuc2FjdGlvbidzIGVuZCBieSB4ZnNfYm1hcGksIHhmc19idW5tYXBpCisgKiBjYWxsZXIuICBGcmVlcyBhbGwgdGhlIGV4dGVudHMgdGhhdCBuZWVkIGZyZWVpbmcsIHdoaWNoIG11c3QgYmUgZG9uZQorICogbGFzdCBkdWUgdG8gbG9ja2luZyBjb25zaWRlcmF0aW9ucy4gIFdlIG5ldmVyIGZyZWUgYW55IGV4dGVudHMgaW4KKyAqIHRoZSBmaXJzdCB0cmFuc2FjdGlvbi4gIFRoaXMgaXMgdG8gYWxsb3cgdGhlIGNhbGxlciB0byBtYWtlIHRoZSBmaXJzdAorICogdHJhbnNhY3Rpb24gYSBzeW5jaHJvbm91cyBvbmUgc28gdGhhdCB0aGUgcG9pbnRlcnMgdG8gdGhlIGRhdGEgYmVpbmcKKyAqIGJyb2tlbiBpbiB0aGlzIHRyYW5zYWN0aW9uIHdpbGwgYmUgcGVybWFuZW50IGJlZm9yZSB0aGUgZGF0YSBpcyBhY3R1YWxseQorICogZnJlZWQuICBUaGlzIGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGJsb2NrcyBmcm9tIGJlaW5nIHJlYWxsb2NhdGVkCisgKiBhbmQgd3JpdHRlbiB0byBiZWZvcmUgdGhlIGZyZWUgYW5kIHJlYWxsb2NhdGlvbiBhcmUgYWN0dWFsbHkgcGVybWFuZW50LgorICogV2UgZG8gbm90IGp1c3QgbWFrZSB0aGUgZmlyc3QgdHJhbnNhY3Rpb24gc3luY2hyb25vdXMgaGVyZSwgYmVjYXVzZQorICogdGhlcmUgYXJlIG1vcmUgZWZmaWNpZW50IHdheXMgdG8gZ2FpbiB0aGUgc2FtZSBwcm90ZWN0aW9uIGluIHNvbWUgY2FzZXMKKyAqIChzZWUgdGhlIGZpbGUgdHJ1bmNhdGlvbiBjb2RlKS4KKyAqCisgKiBSZXR1cm4gMSBpZiB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24gd2FzIGNvbW1pdHRlZCBhbmQgYSBuZXcgb25lCisgKiBzdGFydGVkLCBhbmQgMCBvdGhlcndpc2UgaW4gdGhlIGNvbW1pdHRlZCBwYXJhbWV0ZXIuCisgKi8KKy8qQVJHU1VTRUQqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2ZpbmlzaCgKKwl4ZnNfdHJhbnNfdAkJKip0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgYWRkciAqLworCXhmc19ibWFwX2ZyZWVfdAkJKmZsaXN0LAkJLyogaS9vOiBsaXN0IGV4dGVudHMgdG8gZnJlZSAqLworCXhmc19mc2Jsb2NrX3QJCWZpcnN0YmxvY2ssCS8qIGNvbnRyb2xsZWQgYWcgZm9yIGFsbG9jcyAqLworCWludAkJCSpjb21taXR0ZWQpCS8qIHhhY3QgY29tbWl0dGVkIG9yIG5vdCAqLworeworCXhmc19lZmRfbG9nX2l0ZW1fdAkqZWZkOwkJLyogZXh0ZW50IGZyZWUgZGF0YSAqLworCXhmc19lZmlfbG9nX2l0ZW1fdAkqZWZpOwkJLyogZXh0ZW50IGZyZWUgaW50ZW50aW9uICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfYm1hcF9mcmVlX2l0ZW1fdAkqZnJlZTsJCS8qIGZyZWUgZXh0ZW50IGxpc3QgaXRlbSAqLworCXVuc2lnbmVkIGludAkJbG9ncmVzOwkJLyogbmV3IGxvZyByZXNlcnZhdGlvbiAqLworCXVuc2lnbmVkIGludAkJbG9nY291bnQ7CS8qIG5ldyBsb2cgY291bnQgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfYm1hcF9mcmVlX2l0ZW1fdAkqbmV4dDsJCS8qIG5leHQgaXRlbSBvbiBmcmVlIGxpc3QgKi8KKwl4ZnNfdHJhbnNfdAkJKm50cDsJCS8qIG5ldyB0cmFuc2FjdGlvbiBwb2ludGVyICovCisKKwlBU1NFUlQoKCp0cCktPnRfZmxhZ3MgJiBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTKTsKKwlpZiAoZmxpc3QtPnhiZl9jb3VudCA9PSAwKSB7CisJCSpjb21taXR0ZWQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJbnRwID0gKnRwOworCWVmaSA9IHhmc190cmFuc19nZXRfZWZpKG50cCwgZmxpc3QtPnhiZl9jb3VudCk7CisJZm9yIChmcmVlID0gZmxpc3QtPnhiZl9maXJzdDsgZnJlZTsgZnJlZSA9IGZyZWUtPnhiZmlfbmV4dCkKKwkJeGZzX3RyYW5zX2xvZ19lZmlfZXh0ZW50KG50cCwgZWZpLCBmcmVlLT54YmZpX3N0YXJ0YmxvY2ssCisJCQlmcmVlLT54YmZpX2Jsb2NrY291bnQpOworCWxvZ3JlcyA9IG50cC0+dF9sb2dfcmVzOworCWxvZ2NvdW50ID0gbnRwLT50X2xvZ19jb3VudDsKKwludHAgPSB4ZnNfdHJhbnNfZHVwKCp0cCk7CisJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KCp0cCwgMCwgTlVMTCk7CisJKnRwID0gbnRwOworCSpjb21taXR0ZWQgPSAxOworCS8qCisJICogV2UgaGF2ZSBhIG5ldyB0cmFuc2FjdGlvbiwgc28gd2Ugc2hvdWxkIHJldHVybiBjb21taXR0ZWQ9MSwKKwkgKiBldmVuIHRob3VnaCB3ZSdyZSByZXR1cm5pbmcgYW4gZXJyb3IuCisJICovCisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKG50cCwgMCwgbG9ncmVzLCAwLCBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAorCQkJbG9nY291bnQpKSkKKwkJcmV0dXJuIGVycm9yOworCWVmZCA9IHhmc190cmFuc19nZXRfZWZkKG50cCwgZWZpLCBmbGlzdC0+eGJmX2NvdW50KTsKKwlmb3IgKGZyZWUgPSBmbGlzdC0+eGJmX2ZpcnN0OyBmcmVlICE9IE5VTEw7IGZyZWUgPSBuZXh0KSB7CisJCW5leHQgPSBmcmVlLT54YmZpX25leHQ7CisJCWlmICgoZXJyb3IgPSB4ZnNfZnJlZV9leHRlbnQobnRwLCBmcmVlLT54YmZpX3N0YXJ0YmxvY2ssCisJCQkJZnJlZS0+eGJmaV9ibG9ja2NvdW50KSkpIHsKKwkJCS8qCisJCQkgKiBUaGUgYm1hcCBmcmVlIGxpc3Qgd2lsbCBiZSBjbGVhbmVkIHVwIGF0IGEKKwkJCSAqIGhpZ2hlciBsZXZlbC4gIFRoZSBFRkkgd2lsbCBiZSBjYW5jZWxlZCB3aGVuCisJCQkgKiB0aGlzIHRyYW5zYWN0aW9uIGlzIGFib3J0ZWQuCisJCQkgKiBOZWVkIHRvIGZvcmNlIHNodXRkb3duIGhlcmUgdG8gbWFrZSBzdXJlIGl0CisJCQkgKiBoYXBwZW5zLCBzaW5jZSB0aGlzIHRyYW5zYWN0aW9uIG1heSBub3QgYmUKKwkJCSAqIGRpcnR5IHlldC4KKwkJCSAqLworCQkJbXAgPSBudHAtPnRfbW91bnRwOworCQkJaWYgKCFYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJCQl4ZnNfZm9yY2Vfc2h1dGRvd24obXAsCisJCQkJCQkgICAoZXJyb3IgPT0gRUZTQ09SUlVQVEVEKSA/CisJCQkJCQkgICBYRlNfQ09SUlVQVF9JTkNPUkUgOgorCQkJCQkJICAgWEZTX01FVEFEQVRBX0lPX0VSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQl4ZnNfdHJhbnNfbG9nX2VmZF9leHRlbnQobnRwLCBlZmQsIGZyZWUtPnhiZmlfc3RhcnRibG9jaywKKwkJCWZyZWUtPnhiZmlfYmxvY2tjb3VudCk7CisJCXhmc19ibWFwX2RlbF9mcmVlKGZsaXN0LCBOVUxMLCBmcmVlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGcmVlIHVwIGFueSBpdGVtcyBsZWZ0IGluIHRoZSBsaXN0LgorICovCit2b2lkCit4ZnNfYm1hcF9jYW5jZWwoCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QpCS8qIGxpc3Qgb2YgYm1hcF9mcmVlX2l0ZW1zICovCit7CisJeGZzX2JtYXBfZnJlZV9pdGVtX3QJKmZyZWU7CS8qIGZyZWUgbGlzdCBpdGVtICovCisJeGZzX2JtYXBfZnJlZV9pdGVtX3QJKm5leHQ7CisKKwlpZiAoZmxpc3QtPnhiZl9jb3VudCA9PSAwKQorCQlyZXR1cm47CisJQVNTRVJUKGZsaXN0LT54YmZfZmlyc3QgIT0gTlVMTCk7CisJZm9yIChmcmVlID0gZmxpc3QtPnhiZl9maXJzdDsgZnJlZTsgZnJlZSA9IG5leHQpIHsKKwkJbmV4dCA9IGZyZWUtPnhiZmlfbmV4dDsKKwkJeGZzX2JtYXBfZGVsX2ZyZWUoZmxpc3QsIE5VTEwsIGZyZWUpOworCX0KKwlBU1NFUlQoZmxpc3QtPnhiZl9jb3VudCA9PSAwKTsKK30KKworLyoKKyAqIFJldHVybnMgdGhlIGZpbGUtcmVsYXRpdmUgYmxvY2sgbnVtYmVyIG9mIHRoZSBmaXJzdCB1bnVzZWQgYmxvY2socykKKyAqIGluIHRoZSBmaWxlIHdpdGggYXQgbGVhc3QgImxlbiIgbG9naWNhbGx5IGNvbnRpZ3VvdXMgYmxvY2tzIGZyZWUuCisgKiBUaGlzIGlzIHRoZSBsb3dlc3QtYWRkcmVzcyBob2xlIGlmIHRoZSBmaWxlIGhhcyBob2xlcywgZWxzZSB0aGUgZmlyc3QgYmxvY2sKKyAqIHBhc3QgdGhlIGVuZCBvZiBmaWxlLgorICogUmV0dXJuIDAgaWYgdGhlIGZpbGUgaXMgY3VycmVudGx5IGxvY2FsIChpbi1pbm9kZSkuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9maXJzdF91bnVzZWQoCisJeGZzX3RyYW5zX3QJKnRwLAkJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkqaXAsCQkJLyogaW5jb3JlIGlub2RlICovCisJeGZzX2V4dGxlbl90CWxlbiwJCQkvKiBzaXplIG9mIGhvbGUgdG8gZmluZCAqLworCXhmc19maWxlb2ZmX3QJKmZpcnN0X3VudXNlZCwJCS8qIHVudXNlZCBibG9jayAqLworCWludAkJd2hpY2hmb3JrKQkJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KK3sKKwl4ZnNfYm1idF9yZWNfdAkqYmFzZTsJCQkvKiBiYXNlIG9mIGV4dGVudCBhcnJheSAqLworCXhmc19ibWJ0X3JlY190CSplcDsJCQkvKiBwb2ludGVyIHRvIGFuIGV4dGVudCBlbnRyeSAqLworCWludAkJZXJyb3I7CQkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX2lmb3JrX3QJKmlmcDsJCQkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KKwl4ZnNfZmlsZW9mZl90CWxhc3RhZGRyOwkJLyogbGFzdCBibG9jayBudW1iZXIgc2VlbiAqLworCXhmc19maWxlb2ZmX3QJbG93ZXN0OwkJCS8qIGxvd2VzdCB1c2VmdWwgYmxvY2sgKi8KKwl4ZnNfZmlsZW9mZl90CW1heDsJCQkvKiBzdGFydGluZyB1c2VmdWwgYmxvY2sgKi8KKwl4ZnNfZmlsZW9mZl90CW9mZjsJCQkvKiBvZmZzZXQgZm9yIHRoaXMgYmxvY2sgKi8KKwl4ZnNfZXh0bnVtX3QJbmV4dGVudHM7CQkvKiBudW1iZXIgb2YgZXh0ZW50IGVudHJpZXMgKi8KKworCUFTU0VSVChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspID09IFhGU19ESU5PREVfRk1UX0JUUkVFIHx8CisJICAgICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyB8fAorCSAgICAgICBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKTsKKwlpZiAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSA9PSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkgeworCQkqZmlyc3RfdW51c2VkID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJaWYgKCEoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpICYmCisJICAgIChlcnJvciA9IHhmc19pcmVhZF9leHRlbnRzKHRwLCBpcCwgd2hpY2hmb3JrKSkpCisJCXJldHVybiBlcnJvcjsKKwlsb3dlc3QgPSAqZmlyc3RfdW51c2VkOworCW5leHRlbnRzID0gaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJYmFzZSA9ICZpZnAtPmlmX3UxLmlmX2V4dGVudHNbMF07CisJZm9yIChsYXN0YWRkciA9IDAsIG1heCA9IGxvd2VzdCwgZXAgPSBiYXNlOworCSAgICAgZXAgPCAmYmFzZVtuZXh0ZW50c107CisJICAgICBlcCsrKSB7CisJCW9mZiA9IHhmc19ibWJ0X2dldF9zdGFydG9mZihlcCk7CisJCS8qCisJCSAqIFNlZSBpZiB0aGUgaG9sZSBiZWZvcmUgdGhpcyBleHRlbnQgd2lsbCB3b3JrLgorCQkgKi8KKwkJaWYgKG9mZiA+PSBsb3dlc3QgKyBsZW4gJiYgb2ZmIC0gbWF4ID49IGxlbikgeworCQkJKmZpcnN0X3VudXNlZCA9IG1heDsKKwkJCXJldHVybiAwOworCQl9CisJCWxhc3RhZGRyID0gb2ZmICsgeGZzX2JtYnRfZ2V0X2Jsb2NrY291bnQoZXApOworCQltYXggPSBYRlNfRklMRU9GRl9NQVgobGFzdGFkZHIsIGxvd2VzdCk7CisJfQorCSpmaXJzdF91bnVzZWQgPSBtYXg7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBmaWxlLXJlbGF0aXZlIGJsb2NrIG51bWJlciBvZiB0aGUgbGFzdCBibG9jayArIDEgYmVmb3JlCisgKiBsYXN0X2Jsb2NrIChpbnB1dCB2YWx1ZSkgaW4gdGhlIGZpbGUuCisgKiBUaGlzIGlzIG5vdCBiYXNlZCBvbiBpX3NpemUsIGl0IGlzIGJhc2VkIG9uIHRoZSBleHRlbnQgbGlzdC4KKyAqIFJldHVybnMgMCBmb3IgbG9jYWwgZmlsZXMsIGFzIHRoZXkgZG8gbm90IGhhdmUgYW4gZXh0ZW50IGxpc3QuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9sYXN0X2JlZm9yZSgKKwl4ZnNfdHJhbnNfdAkqdHAsCQkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9kZV90CSppcCwJCQkvKiBpbmNvcmUgaW5vZGUgKi8KKwl4ZnNfZmlsZW9mZl90CSpsYXN0X2Jsb2NrLAkJLyogbGFzdCBibG9jayAqLworCWludAkJd2hpY2hmb3JrKQkJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KK3sKKwl4ZnNfZmlsZW9mZl90CWJubzsJCQkvKiBpbnB1dCBmaWxlIG9mZnNldCAqLworCWludAkJZW9mOwkJCS8qIGhpdCBlbmQgb2YgZmlsZSAqLworCXhmc19ibWJ0X3JlY190CSplcDsJCQkvKiBwb2ludGVyIHRvIGxhc3QgZXh0ZW50ICovCisJaW50CQllcnJvcjsJCQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfYm1idF9pcmVjX3QJZ290OwkJCS8qIGN1cnJlbnQgZXh0ZW50IHZhbHVlICovCisJeGZzX2lmb3JrX3QJKmlmcDsJCQkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJbGFzdHg7CQkJLyogbGFzdCBleHRlbnQgdXNlZCAqLworCXhmc19ibWJ0X2lyZWNfdAlwcmV2OwkJCS8qIHByZXZpb3VzIGV4dGVudCB2YWx1ZSAqLworCisJaWYgKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUgJiYKKwkgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpCisJICAgICAgIHJldHVybiBYRlNfRVJST1IoRUlPKTsKKwlpZiAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSA9PSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkgeworCQkqbGFzdF9ibG9jayA9IDA7CisJCXJldHVybiAwOworCX0KKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCWlmICghKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSAmJgorCSAgICAoZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyh0cCwgaXAsIHdoaWNoZm9yaykpKQorCQlyZXR1cm4gZXJyb3I7CisJYm5vID0gKmxhc3RfYmxvY2sgLSAxOworCWVwID0geGZzX2JtYXBfc2VhcmNoX2V4dGVudHMoaXAsIGJubywgd2hpY2hmb3JrLCAmZW9mLCAmbGFzdHgsICZnb3QsCisJCSZwcmV2KTsKKwlpZiAoZW9mIHx8IHhmc19ibWJ0X2dldF9zdGFydG9mZihlcCkgPiBibm8pIHsKKwkJaWYgKHByZXYuYnJfc3RhcnRvZmYgPT0gTlVMTEZJTEVPRkYpCisJCQkqbGFzdF9ibG9jayA9IDA7CisJCWVsc2UKKwkJCSpsYXN0X2Jsb2NrID0gcHJldi5icl9zdGFydG9mZiArIHByZXYuYnJfYmxvY2tjb3VudDsKKwl9CisJLyoKKwkgKiBPdGhlcndpc2UgKmxhc3RfYmxvY2sgaXMgYWxyZWFkeSB0aGUgcmlnaHQgYW5zd2VyLgorCSAqLworCXJldHVybiAwOworfQorCisvKgorICogUmV0dXJucyB0aGUgZmlsZS1yZWxhdGl2ZSBibG9jayBudW1iZXIgb2YgdGhlIGZpcnN0IGJsb2NrIHBhc3QgZW9mIGluCisgKiB0aGUgZmlsZS4gIFRoaXMgaXMgbm90IGJhc2VkIG9uIGlfc2l6ZSwgaXQgaXMgYmFzZWQgb24gdGhlIGV4dGVudCBsaXN0LgorICogUmV0dXJucyAwIGZvciBsb2NhbCBmaWxlcywgYXMgdGhleSBkbyBub3QgaGF2ZSBhbiBleHRlbnQgbGlzdC4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2xhc3Rfb2Zmc2V0KAorCXhmc190cmFuc190CSp0cCwJCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub2RlX3QJKmlwLAkJCS8qIGluY29yZSBpbm9kZSAqLworCXhmc19maWxlb2ZmX3QJKmxhc3RfYmxvY2ssCQkvKiBsYXN0IGJsb2NrICovCisJaW50CQl3aGljaGZvcmspCQkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworeworCXhmc19ibWJ0X3JlY190CSpiYXNlOwkJCS8qIGJhc2Ugb2YgZXh0ZW50IGFycmF5ICovCisJeGZzX2JtYnRfcmVjX3QJKmVwOwkJCS8qIHBvaW50ZXIgdG8gbGFzdCBleHRlbnQgKi8KKwlpbnQJCWVycm9yOwkJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19pZm9ya190CSppZnA7CQkJLyogaW5vZGUgZm9yayBwb2ludGVyICovCisJeGZzX2V4dG51bV90CW5leHRlbnRzOwkJLyogbnVtYmVyIG9mIGV4dGVudCBlbnRyaWVzICovCisKKwlpZiAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSAmJgorCSAgICBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKKwkgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkKKwkgICAgICAgcmV0dXJuIFhGU19FUlJPUihFSU8pOworCWlmIChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKSB7CisJCSpsYXN0X2Jsb2NrID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJaWYgKCEoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpICYmCisJICAgIChlcnJvciA9IHhmc19pcmVhZF9leHRlbnRzKHRwLCBpcCwgd2hpY2hmb3JrKSkpCisJCXJldHVybiBlcnJvcjsKKwluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCWlmICghbmV4dGVudHMpIHsKKwkJKmxhc3RfYmxvY2sgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJYmFzZSA9ICZpZnAtPmlmX3UxLmlmX2V4dGVudHNbMF07CisJQVNTRVJUKGJhc2UgIT0gTlVMTCk7CisJZXAgPSAmYmFzZVtuZXh0ZW50cyAtIDFdOworCSpsYXN0X2Jsb2NrID0geGZzX2JtYnRfZ2V0X3N0YXJ0b2ZmKGVwKSArIHhmc19ibWJ0X2dldF9ibG9ja2NvdW50KGVwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJldHVybnMgd2hldGhlciB0aGUgc2VsZWN0ZWQgZm9yayBvZiB0aGUgaW5vZGUgaGFzIGV4YWN0bHkgb25lCisgKiBibG9jayBvciBub3QuICBGb3IgdGhlIGRhdGEgZm9yayB3ZSBjaGVjayB0aGlzIG1hdGNoZXMgZGlfc2l6ZSwKKyAqIGltcGx5aW5nIHRoZSBmaWxlJ3MgcmFuZ2UgaXMgMC4uYnNpemUtMS4KKyAqLworaW50CQkJCQkvKiAxPT4xIGJsb2NrLCAwPT5vdGhlcndpc2UgKi8KK3hmc19ibWFwX29uZV9ibG9jaygKKwl4ZnNfaW5vZGVfdAkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgKi8KKwlpbnQJCXdoaWNoZm9yaykJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KK3sKKwl4ZnNfYm1idF9yZWNfdAkqZXA7CQkvKiBwdHIgdG8gZm9yaydzIGV4dGVudCAqLworCXhmc19pZm9ya190CSppZnA7CQkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KKwlpbnQJCXJ2YWw7CQkvKiByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfYm1idF9pcmVjX3QJczsJCS8qIGludGVybmFsIHZlcnNpb24gb2YgZXh0ZW50ICovCisKKyNpZm5kZWYgREVCVUcKKwlpZiAod2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUkspCisJCXJldHVybiBpcC0+aV9kLmRpX3NpemUgPT0gaXAtPmlfbW91bnQtPm1fc2Iuc2JfYmxvY2tzaXplOworI2VuZGlmCS8qICFERUJVRyAqLworCWlmIChYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgIT0gMSkKKwkJcmV0dXJuIDA7CisJaWYgKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUykKKwkJcmV0dXJuIDA7CisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwlBU1NFUlQoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpOworCWVwID0gaWZwLT5pZl91MS5pZl9leHRlbnRzOworCXhmc19ibWJ0X2dldF9hbGwoZXAsICZzKTsKKwlydmFsID0gcy5icl9zdGFydG9mZiA9PSAwICYmIHMuYnJfYmxvY2tjb3VudCA9PSAxOworCWlmIChydmFsICYmIHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKQorCQlBU1NFUlQoaXAtPmlfZC5kaV9zaXplID09IGlwLT5pX21vdW50LT5tX3NiLnNiX2Jsb2Nrc2l6ZSk7CisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBSZWFkIGluIHRoZSBleHRlbnRzIHRvIGlmX2V4dGVudHMuCisgKiBBbGwgaW5vZGUgZmllbGRzIGFyZSBzZXQgdXAgYnkgY2FsbGVyLCB3ZSBqdXN0IHRyYXZlcnNlIHRoZSBidHJlZQorICogYW5kIGNvcHkgdGhlIHJlY29yZHMgaW4uIElmIHRoZSBmaWxlIHN5c3RlbSBjYW5ub3QgY29udGFpbiB1bndyaXR0ZW4KKyAqIGV4dGVudHMsIHRoZSByZWNvcmRzIGFyZSBjaGVja2VkIGZvciBubyAic3RhdGUiIGZsYWdzLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9yZWFkX2V4dGVudHMoCisJeGZzX3RyYW5zX3QJCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSAqLworCWludAkJCXdoaWNoZm9yaykgLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KK3sKKwl4ZnNfYm1idF9ibG9ja190CSpibG9jazsJLyogY3VycmVudCBidHJlZSBibG9jayAqLworCXhmc19mc2Jsb2NrX3QJCWJubzsJLyogYmxvY2sgIyBvZiAiYmxvY2siICovCisJeGZzX2J1Zl90CQkqYnA7CS8qIGJ1ZmZlciBmb3IgImJsb2NrIiAqLworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfZXhudGZtdF90CQlleG50ZjsJLyogWEZTX0VYVEZNVF9OT1NUQVRFLCBpZiBjaGVja2luZyAqLworI2lmZGVmIFhGU19CTUFQX1RSQUNFCisJc3RhdGljIGNoYXIJCWZuYW1lW10gPSAieGZzX2JtYXBfcmVhZF9leHRlbnRzIjsKKyNlbmRpZgorCXhmc19leHRudW1fdAkJaSwgajsJLyogaW5kZXggaW50byB0aGUgZXh0ZW50cyBsaXN0ICovCisJeGZzX2lmb3JrX3QJCSppZnA7CS8qIGZvcmsgc3RydWN0dXJlICovCisJaW50CQkJbGV2ZWw7CS8qIGJ0cmVlIGxldmVsLCBmb3IgY2hlY2tpbmcgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfYm1idF9wdHJfdAkJKnBwOwkvKiBwb2ludGVyIHRvIGJsb2NrIGFkZHJlc3MgKi8KKwkvKiBSRUZFUkVOQ0VEICovCisJeGZzX2V4dG51bV90CQlyb29tOwkvKiBudW1iZXIgb2YgZW50cmllcyB0aGVyZSdzIHJvb20gZm9yICovCisJeGZzX2JtYnRfcmVjX3QJCSp0cnA7CS8qIHRhcmdldCByZWNvcmQgcG9pbnRlciAqLworCisJYm5vID0gTlVMTEZTQkxPQ0s7CisJbXAgPSBpcC0+aV9tb3VudDsKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCWV4bnRmID0gKHdoaWNoZm9yayAhPSBYRlNfREFUQV9GT1JLKSA/IFhGU19FWFRGTVRfTk9TVEFURSA6CisJCQkJCVhGU19FWFRGTVRfSU5PREUoaXApOworCWJsb2NrID0gaWZwLT5pZl9icm9vdDsKKwkvKgorCSAqIFJvb3QgbGV2ZWwgbXVzdCB1c2UgQk1BUF9CUk9PVF9QVFJfQUREUiBtYWNybyB0byBnZXQgcHRyIG91dC4KKwkgKi8KKwlBU1NFUlQoSU5UX0dFVChibG9jay0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCkgPiAwKTsKKwlsZXZlbCA9IElOVF9HRVQoYmxvY2stPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpOworCXBwID0gWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIoYmxvY2ssIDEsIGlmcC0+aWZfYnJvb3RfYnl0ZXMpOworCUFTU0VSVChJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKSAhPSBOVUxMREZTQk5PKTsKKwlBU1NFUlQoWEZTX0ZTQl9UT19BR05PKG1wLCBJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKSkgPCBtcC0+bV9zYi5zYl9hZ2NvdW50KTsKKwlBU1NFUlQoWEZTX0ZTQl9UT19BR0JOTyhtcCwgSU5UX0dFVCgqcHAsIEFSQ0hfQ09OVkVSVCkpIDwgbXAtPm1fc2Iuc2JfYWdibG9ja3MpOworCWJubyA9IElOVF9HRVQoKnBwLCBBUkNIX0NPTlZFUlQpOworCS8qCisJICogR28gZG93biB0aGUgdHJlZSB1bnRpbCBsZWFmIGxldmVsIGlzIHJlYWNoZWQsIGZvbGxvd2luZyB0aGUgZmlyc3QKKwkgKiBwb2ludGVyIChsZWZ0bW9zdCkgYXQgZWFjaCBsZXZlbC4KKwkgKi8KKwl3aGlsZSAobGV2ZWwtLSA+IDApIHsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZmwobXAsIHRwLCBibm8sIDAsICZicCwKKwkJCQlYRlNfQk1BUF9CVFJFRV9SRUYpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soYnApOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTygKKwkJCVhGU19CTUFQX1NBTklUWV9DSEVDSyhtcCwgYmxvY2ssIGxldmVsKSwKKwkJCWVycm9yMCk7CisJCWlmIChsZXZlbCA9PSAwKQorCQkJYnJlYWs7CisJCXBwID0gWEZTX0JUUkVFX1BUUl9BRERSKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwgeGZzX2JtYnQsIGJsb2NrLAorCQkJMSwgbXAtPm1fYm1hcF9kbXhyWzFdKTsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oCisJCQlYRlNfRlNCX1NBTklUWV9DSEVDSyhtcCwgSU5UX0dFVCgqcHAsIEFSQ0hfQ09OVkVSVCkpLAorCQkJZXJyb3IwKTsKKwkJYm5vID0gSU5UX0dFVCgqcHAsIEFSQ0hfQ09OVkVSVCk7CisJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwl9CisJLyoKKwkgKiBIZXJlIHdpdGggYnAgYW5kIGJsb2NrIHNldCB0byB0aGUgbGVmdG1vc3QgbGVhZiBub2RlIGluIHRoZSB0cmVlLgorCSAqLworCXJvb20gPSBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKCp0cnApOworCXRycCA9IGlmcC0+aWZfdTEuaWZfZXh0ZW50czsKKwlpID0gMDsKKwkvKgorCSAqIExvb3Agb3ZlciBhbGwgbGVhZiBub2Rlcy4gIENvcHkgaW5mb3JtYXRpb24gdG8gdGhlIGV4dGVudCBsaXN0LgorCSAqLworCWZvciAoOzspIHsKKwkJeGZzX2JtYnRfcmVjX3QJKmZycCwgKnRlbXA7CisJCXhmc19mc2Jsb2NrX3QJbmV4dGJubzsKKwkJeGZzX2V4dG51bV90CW51bV9yZWNzOworCisKKwkJbnVtX3JlY3MgPSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCQlpZiAodW5saWtlbHkoaSArIG51bV9yZWNzID4gcm9vbSkpIHsKKwkJCUFTU0VSVChpICsgbnVtX3JlY3MgPD0gcm9vbSk7CisJCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKKwkJCQkiY29ycnVwdCBkaW5vZGUgJUx1LCAoYnRyZWUgZXh0ZW50cykuICBVbm1vdW50IGFuZCBydW4geGZzX3JlcGFpci4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGlwLT5pX2lubyk7CisJCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfYm1hcF9yZWFkX2V4dGVudHMoMSkiLAorCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkJaXAtPmlfbW91bnQpOworCQkJZ290byBlcnJvcjA7CisJCX0KKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oCisJCQlYRlNfQk1BUF9TQU5JVFlfQ0hFQ0sobXAsIGJsb2NrLCAwKSwKKwkJCWVycm9yMCk7CisJCS8qCisJCSAqIFJlYWQtYWhlYWQgdGhlIG5leHQgbGVhZiBibG9jaywgaWYgYW55LgorCQkgKi8KKwkJbmV4dGJubyA9IElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpOworCQlpZiAobmV4dGJubyAhPSBOVUxMRlNCTE9DSykKKwkJCXhmc19idHJlZV9yZWFkYV9idWZsKG1wLCBuZXh0Ym5vLCAxKTsKKwkJLyoKKwkJICogQ29weSByZWNvcmRzIGludG8gdGhlIGV4dGVudCBsaXN0LgorCQkgKi8KKwkJZnJwID0gWEZTX0JUUkVFX1JFQ19BRERSKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwgeGZzX2JtYnQsCisJCQlibG9jaywgMSwgbXAtPm1fYm1hcF9kbXhyWzBdKTsKKwkJdGVtcCA9IHRycDsKKwkJZm9yIChqID0gMDsgaiA8IG51bV9yZWNzOyBqKyssIGZycCsrLCB0cnArKykgeworCQkJdHJwLT5sMCA9IElOVF9HRVQoZnJwLT5sMCwgQVJDSF9DT05WRVJUKTsKKwkJCXRycC0+bDEgPSBJTlRfR0VUKGZycC0+bDEsIEFSQ0hfQ09OVkVSVCk7CisJCX0KKwkJaWYgKGV4bnRmID09IFhGU19FWFRGTVRfTk9TVEFURSkgeworCQkJLyoKKwkJCSAqIENoZWNrIGFsbCBhdHRyaWJ1dGUgYm1hcCBidHJlZSByZWNvcmRzIGFuZAorCQkJICogYW55ICJvbGRlciIgZGF0YSBibWFwIGJ0cmVlIHJlY29yZHMgZm9yIGEKKwkJCSAqIHNldCBiaXQgaW4gdGhlICJleHRlbnQgZmxhZyIgcG9zaXRpb24uCisJCQkgKi8KKwkJCWlmICh1bmxpa2VseSh4ZnNfY2hlY2tfbm9zdGF0ZV9leHRlbnRzKHRlbXAsIG51bV9yZWNzKSkpIHsKKwkJCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfYm1hcF9yZWFkX2V4dGVudHMoMikiLAorCQkJCQkJIFhGU19FUlJMRVZFTF9MT1csCisJCQkJCQkgaXAtPmlfbW91bnQpOworCQkJCWdvdG8gZXJyb3IwOworCQkJfQorCQl9CisJCWkgKz0gbnVtX3JlY3M7CisJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkJYm5vID0gbmV4dGJubzsKKwkJLyoKKwkJICogSWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kLCBzdG9wLgorCQkgKi8KKwkJaWYgKGJubyA9PSBOVUxMRlNCTE9DSykKKwkJCWJyZWFrOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChtcCwgdHAsIGJubywgMCwgJmJwLAorCQkJCVhGU19CTUFQX0JUUkVFX1JFRikpKQorCQkJcmV0dXJuIGVycm9yOworCQlibG9jayA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhicCk7CisJfQorCUFTU0VSVChpID09IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoKnRycCkpOworCUFTU0VSVChpID09IFhGU19JRk9SS19ORVhURU5UUyhpcCwgd2hpY2hmb3JrKSk7CisJeGZzX2JtYXBfdHJhY2VfZXhsaXN0KGZuYW1lLCBpcCwgaSwgd2hpY2hmb3JrKTsKKwlyZXR1cm4gMDsKK2Vycm9yMDoKKwl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworfQorCisjaWZkZWYgWEZTX0JNQVBfVFJBQ0UKKy8qCisgKiBBZGQgYm1hcCB0cmFjZSBpbnNlcnQgZW50cmllcyBmb3IgYWxsIHRoZSBjb250ZW50cyBvZiB0aGUgZXh0ZW50IGxpc3QuCisgKi8KK3ZvaWQKK3hmc19ibWFwX3RyYWNlX2V4bGlzdCgKKwljaGFyCQkqZm5hbWUsCQkvKiBmdW5jdGlvbiBuYW1lICovCisJeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJY250LAkJLyogY291bnQgb2YgZW50cmllcyBpbiB0aGUgbGlzdCAqLworCWludAkJd2hpY2hmb3JrKQkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworeworCXhmc19ibWJ0X3JlY190CSpiYXNlOwkJLyogYmFzZSBvZiBleHRlbnQgbGlzdCAqLworCXhmc19ibWJ0X3JlY190CSplcDsJCS8qIGN1cnJlbnQgZW50cnkgaW4gZXh0ZW50IGxpc3QgKi8KKwl4ZnNfZXh0bnVtX3QJaWR4OwkJLyogZXh0ZW50IGxpc3QgZW50cnkgbnVtYmVyICovCisJeGZzX2lmb3JrX3QJKmlmcDsJCS8qIGlub2RlIGZvcmsgcG9pbnRlciAqLworCXhmc19ibWJ0X2lyZWNfdAlzOwkJLyogZXh0ZW50IGxpc3QgcmVjb3JkICovCisKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCUFTU0VSVChjbnQgPT0gaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZigqYmFzZSkpOworCWJhc2UgPSBpZnAtPmlmX3UxLmlmX2V4dGVudHM7CisJZm9yIChpZHggPSAwLCBlcCA9IGJhc2U7IGlkeCA8IGNudDsgaWR4KyssIGVwKyspIHsKKwkJeGZzX2JtYnRfZ2V0X2FsbChlcCwgJnMpOworCQl4ZnNfYm1hcF90cmFjZV9pbnNlcnQoZm5hbWUsICJleGxpc3QiLCBpcCwgaWR4LCAxLCAmcywgTlVMTCwKKwkJCXdoaWNoZm9yayk7CisJfQorfQorI2VuZGlmCisKKyNpZmRlZiBERUJVRworLyoKKyAqIFZhbGlkYXRlIHRoYXQgdGhlIGJtYnRfaXJlY3MgYmVpbmcgcmV0dXJuZWQgZnJvbSBibWFwaSBhcmUgdmFsaWQKKyAqIGdpdmVuIHRoZSBjYWxsZXJzIG9yaWdpbmFsIHBhcmFtZXRlcnMuICBTcGVjaWZpY2FsbHkgY2hlY2sgdGhlCisgKiByYW5nZXMgb2YgdGhlIHJldHVybmVkIGlyZWNzIHRvIGVuc3VyZSB0aGF0IHRoZXkgb25seSBleHRlbnQgYmV5b25kCisgKiB0aGUgZ2l2ZW4gcGFyYW1ldGVycyBpZiB0aGUgWEZTX0JNQVBJX0VOVElSRSBmbGFnIHdhcyBzZXQuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1hcF92YWxpZGF0ZV9yZXQoCisJeGZzX2ZpbGVvZmZfdAkJYm5vLAorCXhmc19maWxibGtzX3QJCWxlbiwKKwlpbnQJCQlmbGFncywKKwl4ZnNfYm1idF9pcmVjX3QJCSptdmFsLAorCWludAkJCW5tYXAsCisJaW50CQkJcmV0X25tYXApCit7CisJaW50CQkJaTsJCS8qIGluZGV4IHRvIG1hcCB2YWx1ZXMgKi8KKworCUFTU0VSVChyZXRfbm1hcCA8PSBubWFwKTsKKworCWZvciAoaSA9IDA7IGkgPCByZXRfbm1hcDsgaSsrKSB7CisJCUFTU0VSVChtdmFsW2ldLmJyX2Jsb2NrY291bnQgPiAwKTsKKwkJaWYgKCEoZmxhZ3MgJiBYRlNfQk1BUElfRU5USVJFKSkgeworCQkJQVNTRVJUKG12YWxbaV0uYnJfc3RhcnRvZmYgPj0gYm5vKTsKKwkJCUFTU0VSVChtdmFsW2ldLmJyX2Jsb2NrY291bnQgPD0gbGVuKTsKKwkJCUFTU0VSVChtdmFsW2ldLmJyX3N0YXJ0b2ZmICsgbXZhbFtpXS5icl9ibG9ja2NvdW50IDw9CisJCQkgICAgICAgYm5vICsgbGVuKTsKKwkJfSBlbHNlIHsKKwkJCUFTU0VSVChtdmFsW2ldLmJyX3N0YXJ0b2ZmIDwgYm5vICsgbGVuKTsKKwkJCUFTU0VSVChtdmFsW2ldLmJyX3N0YXJ0b2ZmICsgbXZhbFtpXS5icl9ibG9ja2NvdW50ID4KKwkJCSAgICAgICBibm8pOworCQl9CisJCUFTU0VSVChpID09IDAgfHwKKwkJICAgICAgIG12YWxbaSAtIDFdLmJyX3N0YXJ0b2ZmICsgbXZhbFtpIC0gMV0uYnJfYmxvY2tjb3VudCA9PQorCQkgICAgICAgbXZhbFtpXS5icl9zdGFydG9mZik7CisJCWlmICgoZmxhZ3MgJiBYRlNfQk1BUElfV1JJVEUpICYmICEoZmxhZ3MgJiBYRlNfQk1BUElfREVMQVkpKQorCQkJQVNTRVJUKG12YWxbaV0uYnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0sgJiYKKwkJCSAgICAgICBtdmFsW2ldLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spOworCQlBU1NFUlQobXZhbFtpXS5icl9zdGF0ZSA9PSBYRlNfRVhUX05PUk0gfHwKKwkJICAgICAgIG12YWxbaV0uYnJfc3RhdGUgPT0gWEZTX0VYVF9VTldSSVRURU4pOworCX0KK30KKyNlbmRpZiAvKiBERUJVRyAqLworCisKKy8qCisgKiBNYXAgZmlsZSBibG9ja3MgdG8gZmlsZXN5c3RlbSBibG9ja3MuCisgKiBGaWxlIHJhbmdlIGlzIGdpdmVuIGJ5IHRoZSBibm8vbGVuIHBhaXIuCisgKiBBZGRzIGJsb2NrcyB0byBmaWxlIGlmIGEgd3JpdGUgKCJmbGFncyAmIFhGU19CTUFQSV9XUklURSIgc2V0KQorICogaW50byBhIGhvbGUgb3IgcGFzdCBlb2YuCisgKiBPbmx5IGFsbG9jYXRlcyBibG9ja3MgZnJvbSBhIHNpbmdsZSBhbGxvY2F0aW9uIGdyb3VwLAorICogdG8gYXZvaWQgbG9ja2luZyBwcm9ibGVtcy4KKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpbiAiZmlyc3RibG9jayIgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiBhIHRyYW5zYWN0aW9uCisgKiBtdXN0IGJlIHJlbWVtYmVyZWQgYW5kIHByZXNlbnRlZCB0byBzdWJzZXF1ZW50IGNhbGxzIGluICJmaXJzdGJsb2NrIi4KKyAqIEFuIHVwcGVyIGJvdW5kIGZvciB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0byBiZSBhbGxvY2F0ZWQgaXMgc3VwcGxpZWQgdG8KKyAqIHRoZSBmaXJzdCBjYWxsIGluICJ0b3RhbCI7IGlmIG5vIGFsbG9jYXRpb24gZ3JvdXAgaGFzIHRoYXQgbWFueSBmcmVlCisgKiBibG9ja3MgdGhlbiB0aGUgY2FsbCB3aWxsIGZhaWwgKHJldHVybiBOVUxMRlNCTE9DSyBpbiAiZmlyc3RibG9jayIpLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYm1hcGkoCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9kZV90CSppcCwJCS8qIGluY29yZSBpbm9kZSAqLworCXhmc19maWxlb2ZmX3QJYm5vLAkJLyogc3RhcnRpbmcgZmlsZSBvZmZzLiBtYXBwZWQgKi8KKwl4ZnNfZmlsYmxrc190CWxlbiwJCS8qIGxlbmd0aCB0byBtYXAgaW4gZmlsZSAqLworCWludAkJZmxhZ3MsCQkvKiBYRlNfQk1BUElfLi4uICovCisJeGZzX2ZzYmxvY2tfdAkqZmlyc3RibG9jaywJLyogZmlyc3QgYWxsb2NhdGVkIGJsb2NrCisJCQkJCSAgIGNvbnRyb2xzIGEuZy4gZm9yIGFsbG9jcyAqLworCXhmc19leHRsZW5fdAl0b3RhbCwJCS8qIHRvdGFsIGJsb2NrcyBuZWVkZWQgKi8KKwl4ZnNfYm1idF9pcmVjX3QJKm12YWwsCQkvKiBvdXRwdXQ6IG1hcCB2YWx1ZXMgKi8KKwlpbnQJCSpubWFwLAkJLyogaS9vOiBtdmFsIHNpemUvY291bnQgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJKmZsaXN0KQkJLyogaS9vOiBsaXN0IGV4dGVudHMgdG8gZnJlZSAqLworeworCXhmc19mc2Jsb2NrX3QJYWJubzsJCS8qIGFsbG9jYXRlZCBibG9jayBudW1iZXIgKi8KKwl4ZnNfZXh0bGVuX3QJYWxlbjsJCS8qIGFsbG9jYXRlZCBleHRlbnQgbGVuZ3RoICovCisJeGZzX2ZpbGVvZmZfdAlhb2ZmOwkJLyogYWxsb2NhdGVkIGZpbGUgb2Zmc2V0ICovCisJeGZzX2JtYWxsb2NhX3QJYm1hOwkJLyogYXJncyBmb3IgeGZzX2JtYXBfYWxsb2MgKi8KKwljaGFyCQljb250aWc7CQkvKiBhbGxvY2F0aW9uIG11c3QgYmUgb25lIGV4dGVudCAqLworCXhmc19idHJlZV9jdXJfdAkqY3VyOwkJLyogYm1hcCBidHJlZSBjdXJzb3IgKi8KKwljaGFyCQlkZWxheTsJCS8qIHRoaXMgcmVxdWVzdCBpcyBmb3IgZGVsYXllZCBhbGxvYyAqLworCXhmc19maWxlb2ZmX3QJZW5kOwkJLyogZW5kIG9mIG1hcHBlZCBmaWxlIHJlZ2lvbiAqLworCWludAkJZW9mOwkJLyogd2UndmUgaGl0IHRoZSBlbmQgb2YgZXh0ZW50IGxpc3QgKi8KKwl4ZnNfYm1idF9yZWNfdAkqZXA7CQkvKiBleHRlbnQgbGlzdCBlbnRyeSBwb2ludGVyICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiAqLworCWNoYXIJCWV4YWN0OwkJLyogZG9uJ3QgZG8gYWxsIG9mIHdhc2RlbGF5ZWQgZXh0ZW50ICovCisJeGZzX2JtYnRfaXJlY190CWdvdDsJCS8qIGN1cnJlbnQgZXh0ZW50IGxpc3QgcmVjb3JkICovCisJeGZzX2lmb3JrX3QJKmlmcDsJCS8qIGlub2RlIGZvcmsgcG9pbnRlciAqLworCXhmc19leHRsZW5fdAlpbmRsZW47CQkvKiBpbmRpcmVjdCBibG9ja3MgbGVuZ3RoICovCisJY2hhcgkJaW5ob2xlOwkJLyogY3VycmVudCBsb2NhdGlvbiBpcyBob2xlIGluIGZpbGUgKi8KKwl4ZnNfZXh0bnVtX3QJbGFzdHg7CQkvKiBsYXN0IHVzZWZ1bCBleHRlbnQgbnVtYmVyICovCisJaW50CQlsb2dmbGFnczsJLyogZmxhZ3MgZm9yIHRyYW5zYWN0aW9uIGxvZ2dpbmcgKi8KKwl4ZnNfZXh0bGVuX3QJbWlubGVmdDsJLyogbWluIGJsb2NrcyBsZWZ0IGFmdGVyIGFsbG9jYXRpb24gKi8KKwl4ZnNfZXh0bGVuX3QJbWlubGVuOwkJLyogbWluIGFsbG9jYXRpb24gc2l6ZSAqLworCXhmc19tb3VudF90CSptcDsJCS8qIHhmcyBtb3VudCBzdHJ1Y3R1cmUgKi8KKwlpbnQJCW47CQkvKiBjdXJyZW50IGV4dGVudCBpbmRleCAqLworCWludAkJbmFsbG9jczsJLyogbnVtYmVyIG9mIGV4dGVudHMgYWxsb2NcJ2QgKi8KKwl4ZnNfZXh0bnVtX3QJbmV4dGVudHM7CS8qIG51bWJlciBvZiBleHRlbnRzIGluIGZpbGUgKi8KKwl4ZnNfZmlsZW9mZl90CW9ibm87CQkvKiBvbGQgYmxvY2sgbnVtYmVyIChvZmZzZXQpICovCisJeGZzX2JtYnRfaXJlY190CXByZXY7CQkvKiBwcmV2aW91cyBleHRlbnQgbGlzdCByZWNvcmQgKi8KKwljaGFyCQlzdGF0ZWxlc3M7CS8qIGlnbm9yZSBzdGF0ZSBmbGFnIHNldCAqLworCWludAkJdG1wX2xvZ2ZsYWdzOwkvKiB0ZW1wIGZsYWdzIGhvbGRlciAqLworCWNoYXIJCXRyaW07CQkvKiBvdXRwdXQgdHJpbW1lZCB0byBtYXRjaCByYW5nZSAqLworCWNoYXIJCXVzZXJkYXRhOwkvKiBhbGxvY2F0aW5nIG5vbi1tZXRhZGF0YSAqLworCWNoYXIJCXdhc2RlbGF5OwkvKiBvbGQgZXh0ZW50IHdhcyBkZWxheWVkICovCisJaW50CQl3aGljaGZvcms7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisJY2hhcgkJd3I7CQkvKiB0aGlzIGlzIGEgd3JpdGUgcmVxdWVzdCAqLworCWNoYXIJCXJzdmQ7CQkvKiBPSyB0byBhbGxvY2F0ZSByZXNlcnZlZCBibG9ja3MgKi8KKyNpZmRlZiBERUJVRworCXhmc19maWxlb2ZmX3QJb3JpZ19ibm87CS8qIG9yaWdpbmFsIGJsb2NrIG51bWJlciB2YWx1ZSAqLworCWludAkJb3JpZ19mbGFnczsJLyogb3JpZ2luYWwgZmxhZ3MgYXJnIHZhbHVlICovCisJeGZzX2ZpbGJsa3NfdAlvcmlnX2xlbjsJLyogb3JpZ2luYWwgdmFsdWUgb2YgbGVuIGFyZyAqLworCXhmc19ibWJ0X2lyZWNfdAkqb3JpZ19tdmFsOwkvKiBvcmlnaW5hbCB2YWx1ZSBvZiBtdmFsICovCisJaW50CQlvcmlnX25tYXA7CS8qIG9yaWdpbmFsIHZhbHVlIG9mICpubWFwICovCisKKwlvcmlnX2JubyA9IGJubzsKKwlvcmlnX2xlbiA9IGxlbjsKKwlvcmlnX2ZsYWdzID0gZmxhZ3M7CisJb3JpZ19tdmFsID0gbXZhbDsKKwlvcmlnX25tYXAgPSAqbm1hcDsKKyNlbmRpZgorCUFTU0VSVCgqbm1hcCA+PSAxKTsKKwlBU1NFUlQoKm5tYXAgPD0gWEZTX0JNQVBfTUFYX05NQVAgfHwgIShmbGFncyAmIFhGU19CTUFQSV9XUklURSkpOworCXdoaWNoZm9yayA9IChmbGFncyAmIFhGU19CTUFQSV9BVFRSRk9SSykgPworCQlYRlNfQVRUUl9GT1JLIDogWEZTX0RBVEFfRk9SSzsKKwltcCA9IGlwLT5pX21vdW50OworCWlmICh1bmxpa2VseShYRlNfVEVTVF9FUlJPUigKKwkgICAgKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCSAgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSAmJgorCSAgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9MT0NBTCksCisJICAgICBtcCwgWEZTX0VSUlRBR19CTUFQSUZPUk1BVCwgWEZTX1JBTkRPTV9CTUFQSUZPUk1BVCkpKSB7CisJCVhGU19FUlJPUl9SRVBPUlQoInhmc19ibWFwaSIsIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCUFTU0VSVChpZnAtPmlmX2V4dF9tYXggPT0KKwkgICAgICAgWEZTX0lGT1JLX1NJWkUoaXAsIHdoaWNoZm9yaykgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpKTsKKwlpZiAoKHdyID0gKGZsYWdzICYgWEZTX0JNQVBJX1dSSVRFKSkgIT0gMCkKKwkJWEZTX1NUQVRTX0lOQyh4c19ibGtfbWFwdyk7CisJZWxzZQorCQlYRlNfU1RBVFNfSU5DKHhzX2Jsa19tYXByKTsKKwlkZWxheSA9IChmbGFncyAmIFhGU19CTUFQSV9ERUxBWSkgIT0gMDsKKwl0cmltID0gKGZsYWdzICYgWEZTX0JNQVBJX0VOVElSRSkgPT0gMDsKKwl1c2VyZGF0YSA9IChmbGFncyAmIFhGU19CTUFQSV9NRVRBREFUQSkgPT0gMDsKKwlleGFjdCA9IChmbGFncyAmIFhGU19CTUFQSV9FWEFDVCkgIT0gMDsKKwlyc3ZkID0gKGZsYWdzICYgWEZTX0JNQVBJX1JTVkJMT0NLUykgIT0gMDsKKwljb250aWcgPSAoZmxhZ3MgJiBYRlNfQk1BUElfQ09OVElHKSAhPSAwOworCS8qCisJICogc3RhdGVsZXNzIGlzIHVzZWQgdG8gY29tYmluZSBleHRlbnRzIHdoaWNoCisJICogZGlmZmVyIG9ubHkgZHVlIHRvIHRoZSBzdGF0ZSBvZiB0aGUgZXh0ZW50cy4KKwkgKiBUaGlzIHRlY2huaXF1ZSBpcyB1c2VkIGZyb20geGZzX2dldGJtYXAoKQorCSAqIHdoZW4gdGhlIGNhbGxlciBkb2VzIG5vdCB3aXNoIHRvIHNlZSB0aGUKKwkgKiBzZXBhcmF0aW9uICh3aGljaCBpcyB0aGUgZGVmYXVsdCkuCisJICoKKwkgKiBUaGlzIHRlY2huaXF1ZSBpcyBhbHNvIHVzZWQgd2hlbiB3cml0aW5nIGEKKwkgKiBidWZmZXIgd2hpY2ggaGFzIGJlZW4gcGFydGlhbGx5IHdyaXR0ZW4sCisJICogKHVzdWFsbHkgYnkgYmVpbmcgZmx1c2hlZCBkdXJpbmcgYSBjaHVua3JlYWQpLAorCSAqIHRvIGVuc3VyZSBvbmUgd3JpdGUgdGFrZXMgcGxhY2UuIFRoaXMgYWxzbworCSAqIHByZXZlbnRzIGEgY2hhbmdlIGluIHRoZSB4ZnMgaW5vZGUgZXh0ZW50cyBhdAorCSAqIHRoaXMgdGltZSwgaW50ZW50aW9uYWxseS4gVGhpcyBjaGFuZ2Ugb2NjdXJzCisJICogb24gY29tcGxldGlvbiBvZiB0aGUgd3JpdGUgb3BlcmF0aW9uLCBpbgorCSAqIHhmc19zdHJhdF9jb21wKCksIHdoZXJlIHRoZSB4ZnNfYm1hcGkoKSBjYWxsCisJICogaXMgdHJhbnNhY3Rpb25lZCwgYW5kIHRoZSBleHRlbnRzIGNvbWJpbmVkLgorCSAqLworCXN0YXRlbGVzcyA9IChmbGFncyAmIFhGU19CTUFQSV9JR1NUQVRFKSAhPSAwOworCWlmIChzdGF0ZWxlc3MgJiYgd3IpCS8qIGlmIHdyaXRpbmcgdW53cml0dGVuIHNwYWNlLCBubyAqLworCQl3ciA9IDA7CQkvKiBhbGxvY2F0aW9ucyBhcmUgYWxsb3dlZCAqLworCUFTU0VSVCh3ciB8fCAhZGVsYXkpOworCWxvZ2ZsYWdzID0gMDsKKwluYWxsb2NzID0gMDsKKwljdXIgPSBOVUxMOworCWlmIChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKSB7CisJCUFTU0VSVCh3ciAmJiB0cCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYm1hcF9sb2NhbF90b19leHRlbnRzKHRwLCBpcCwKKwkJCQlmaXJzdGJsb2NrLCB0b3RhbCwgJmxvZ2ZsYWdzLCB3aGljaGZvcmspKSkKKwkJCWdvdG8gZXJyb3IwOworCX0KKwlpZiAod3IgJiYgKmZpcnN0YmxvY2sgPT0gTlVMTEZTQkxPQ0spIHsKKwkJaWYgKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpCisJCQltaW5sZWZ0ID0gSU5UX0dFVChpZnAtPmlmX2Jyb290LT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSArIDE7CisJCWVsc2UKKwkJCW1pbmxlZnQgPSAxOworCX0gZWxzZQorCQltaW5sZWZ0ID0gMDsKKwlpZiAoIShpZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykgJiYKKwkgICAgKGVycm9yID0geGZzX2lyZWFkX2V4dGVudHModHAsIGlwLCB3aGljaGZvcmspKSkKKwkJZ290byBlcnJvcjA7CisJZXAgPSB4ZnNfYm1hcF9zZWFyY2hfZXh0ZW50cyhpcCwgYm5vLCB3aGljaGZvcmssICZlb2YsICZsYXN0eCwgJmdvdCwKKwkJJnByZXYpOworCW5leHRlbnRzID0gaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJbiA9IDA7CisJZW5kID0gYm5vICsgbGVuOworCW9ibm8gPSBibm87CisJYm1hLmlwID0gTlVMTDsKKwl3aGlsZSAoYm5vIDwgZW5kICYmIG4gPCAqbm1hcCkgeworCQkvKgorCQkgKiBSZWFkaW5nIHBhc3QgZW9mLCBhY3QgYXMgdGhvdWdoIHRoZXJlJ3MgYSBob2xlCisJCSAqIHVwIHRvIGVuZC4KKwkJICovCisJCWlmIChlb2YgJiYgIXdyKQorCQkJZ290LmJyX3N0YXJ0b2ZmID0gZW5kOworCQlpbmhvbGUgPSBlb2YgfHwgZ290LmJyX3N0YXJ0b2ZmID4gYm5vOworCQl3YXNkZWxheSA9IHdyICYmICFpbmhvbGUgJiYgIWRlbGF5ICYmCisJCQlJU05VTExTVEFSVEJMT0NLKGdvdC5icl9zdGFydGJsb2NrKTsKKwkJLyoKKwkJICogRmlyc3QsIGRlYWwgd2l0aCB0aGUgaG9sZSBiZWZvcmUgdGhlIGFsbG9jYXRlZCBzcGFjZQorCQkgKiB0aGF0IHdlIGZvdW5kLCBpZiBhbnkuCisJCSAqLworCQlpZiAod3IgJiYgKGluaG9sZSB8fCB3YXNkZWxheSkpIHsKKwkJCS8qCisJCQkgKiBGb3IgdGhlIHdhc2RlbGF5IGNhc2UsIHdlIGNvdWxkIGFsc28ganVzdAorCQkJICogYWxsb2NhdGUgdGhlIHN0dWZmIGFza2VkIGZvciBpbiB0aGlzIGJtYXAgY2FsbAorCQkJICogYnV0IHRoYXQgd291bGRuJ3QgYmUgYXMgZ29vZC4KKwkJCSAqLworCQkJaWYgKHdhc2RlbGF5ICYmICFleGFjdCkgeworCQkJCWFsZW4gPSAoeGZzX2V4dGxlbl90KWdvdC5icl9ibG9ja2NvdW50OworCQkJCWFvZmYgPSBnb3QuYnJfc3RhcnRvZmY7CisJCQkJaWYgKGxhc3R4ICE9IE5VTExFWFROVU0gJiYgbGFzdHgpIHsKKwkJCQkJZXAgPSAmaWZwLT5pZl91MS5pZl9leHRlbnRzW2xhc3R4IC0gMV07CisJCQkJCXhmc19ibWJ0X2dldF9hbGwoZXAsICZwcmV2KTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHdhc2RlbGF5KSB7CisJCQkJYWxlbiA9ICh4ZnNfZXh0bGVuX3QpCisJCQkJCVhGU19GSUxCTEtTX01JTihsZW4sCisJCQkJCQkoZ290LmJyX3N0YXJ0b2ZmICsKKwkJCQkJCSBnb3QuYnJfYmxvY2tjb3VudCkgLSBibm8pOworCQkJCWFvZmYgPSBibm87CisJCQl9IGVsc2UgeworCQkJCWFsZW4gPSAoeGZzX2V4dGxlbl90KQorCQkJCQlYRlNfRklMQkxLU19NSU4obGVuLCBNQVhFWFRMRU4pOworCQkJCWlmICghZW9mKQorCQkJCQlhbGVuID0gKHhmc19leHRsZW5fdCkKKwkJCQkJCVhGU19GSUxCTEtTX01JTihhbGVuLAorCQkJCQkJCWdvdC5icl9zdGFydG9mZiAtIGJubyk7CisJCQkJYW9mZiA9IGJubzsKKwkJCX0KKwkJCW1pbmxlbiA9IGNvbnRpZyA/IGFsZW4gOiAxOworCQkJaWYgKGRlbGF5KSB7CisJCQkJaW5kbGVuID0gKHhmc19leHRsZW5fdCkKKwkJCQkJeGZzX2JtYXBfd29yc3RfaW5kbGVuKGlwLCBhbGVuKTsKKwkJCQlBU1NFUlQoaW5kbGVuID4gMCk7CisJCQkJLyoKKwkJCQkgKiBNYWtlIGEgdHJhbnNhY3Rpb24tbGVzcyBxdW90YSByZXNlcnZhdGlvbiBmb3IKKwkJCQkgKiBkZWxheWVkIGFsbG9jYXRpb24gYmxvY2tzLiBUaGlzIG51bWJlciBnZXRzCisJCQkJICogYWRqdXN0ZWQgbGF0ZXIuCisJCQkJICogV2UgcmV0dXJuIEVEUVVPVCBpZiB3ZSBoYXZlbid0IGFsbG9jYXRlZAorCQkJCSAqIGJsa3MgYWxyZWFkeSBpbnNpZGUgdGhpcyBsb29wOworCQkJCSAqLworCQkJCWlmIChYRlNfVFJBTlNfUkVTRVJWRV9CTEtRVU9UQSgKKwkJCQkJCW1wLCBOVUxMLCBpcCwgKGxvbmcpYWxlbikpIHsKKwkJCQkJaWYgKG4gPT0gMCkgeworCQkJCQkJKm5tYXAgPSAwOworCQkJCQkJQVNTRVJUKGN1ciA9PSBOVUxMKTsKKwkJCQkJCXJldHVybiBYRlNfRVJST1IoRURRVU9UKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIFNwbGl0IGNoYW5naW5nIHNiIGZvciBhbGVuIGFuZCBpbmRsZW4gc2luY2UKKwkJCQkgKiB0aGV5IGNvdWxkIGJlIGNvbWluZyBmcm9tIGRpZmZlcmVudCBwbGFjZXMuCisJCQkJICovCisJCQkJaWYgKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSB7CisJCQkJCXhmc19leHRsZW5fdAlleHRzejsKKwkJCQkJeGZzX2V4dGxlbl90CXJhbGVuOworCQkJCQlpZiAoIShleHRzeiA9IGlwLT5pX2QuZGlfZXh0c2l6ZSkpCisJCQkJCQlleHRzeiA9IG1wLT5tX3NiLnNiX3JleHRzaXplOworCQkJCQlyYWxlbiA9IHJvdW5kdXAoYWxlbiwgZXh0c3opOworCQkJCQlyYWxlbiA9IHJhbGVuIC8gbXAtPm1fc2Iuc2JfcmV4dHNpemU7CisJCQkJCWlmICh4ZnNfbW9kX2luY29yZV9zYihtcCwKKwkJCQkJCVhGU19TQlNfRlJFWFRFTlRTLAorCQkJCQkJLShyYWxlbiksIHJzdmQpKSB7CisJCQkJCQlpZiAoWEZTX0lTX1FVT1RBX09OKGlwLT5pX21vdW50KSkKKwkJCQkJCQlYRlNfVFJBTlNfVU5SRVNFUlZFX0JMS1FVT1RBKAorCQkJCQkJICAgICAJCW1wLCBOVUxMLCBpcCwKKwkJCQkJCQkJKGxvbmcpYWxlbik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmICh4ZnNfbW9kX2luY29yZV9zYihtcCwKKwkJCQkJCQkgICAgICBYRlNfU0JTX0ZEQkxPQ0tTLAorCQkJCQkJCSAgICAgIC0oYWxlbiksIHJzdmQpKSB7CisJCQkJCQlpZiAoWEZTX0lTX1FVT1RBX09OKGlwLT5pX21vdW50KSkKKwkJCQkJCQlYRlNfVFJBTlNfVU5SRVNFUlZFX0JMS1FVT1RBKAorCQkJCQkJCQltcCwgTlVMTCwgaXAsCisJCQkJCQkJCShsb25nKWFsZW4pOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoeGZzX21vZF9pbmNvcmVfc2IobXAsIFhGU19TQlNfRkRCTE9DS1MsCisJCQkJCQktKGluZGxlbiksIHJzdmQpKSB7CisJCQkJCVhGU19UUkFOU19VTlJFU0VSVkVfQkxLUVVPVEEoCisJCQkJCQltcCwgTlVMTCwgaXAsIChsb25nKWFsZW4pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaXAtPmlfZGVsYXllZF9ibGtzICs9IGFsZW47CisJCQkJYWJubyA9IE5VTExTVEFSVEJMT0NLKGluZGxlbik7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogSWYgZmlyc3QgdGltZSwgYWxsb2NhdGUgYW5kIGZpbGwgaW4KKwkJCQkgKiBvbmNlLW9ubHkgYm1hIGZpZWxkcy4KKwkJCQkgKi8KKwkJCQlpZiAoYm1hLmlwID09IE5VTEwpIHsKKwkJCQkJYm1hLnRwID0gdHA7CisJCQkJCWJtYS5pcCA9IGlwOworCQkJCQlibWEucHJldnAgPSAmcHJldjsKKwkJCQkJYm1hLmdvdHAgPSAmZ290OworCQkJCQlibWEudG90YWwgPSB0b3RhbDsKKwkJCQkJYm1hLnVzZXJkYXRhID0gMDsKKwkJCQl9CisJCQkJLyogSW5kaWNhdGUgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdXNlciBkYXRhCisJCQkJICogaW4gdGhlIGZpbGUsIG9yIGp1c3QgYW55IHVzZXIgZGF0YS4KKwkJCQkgKi8KKwkJCQlpZiAodXNlcmRhdGEpIHsKKwkJCQkJYm1hLnVzZXJkYXRhID0gKGFvZmYgPT0gMCkgPworCQkJCQkJWEZTX0FMTE9DX0lOSVRJQUxfVVNFUl9EQVRBIDoKKwkJCQkJCVhGU19BTExPQ19VU0VSREFUQTsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBGaWxsIGluIGNoYW5nZWFibGUgYm1hIGZpZWxkcy4KKwkJCQkgKi8KKwkJCQlibWEuZW9mID0gZW9mOworCQkJCWJtYS5maXJzdGJsb2NrID0gKmZpcnN0YmxvY2s7CisJCQkJYm1hLmFsZW4gPSBhbGVuOworCQkJCWJtYS5vZmYgPSBhb2ZmOworCQkJCWJtYS53YXNkZWwgPSB3YXNkZWxheTsKKwkJCQlibWEubWlubGVuID0gbWlubGVuOworCQkJCWJtYS5sb3cgPSBmbGlzdC0+eGJmX2xvdzsKKwkJCQlibWEubWlubGVmdCA9IG1pbmxlZnQ7CisJCQkJLyoKKwkJCQkgKiBPbmx5IHdhbnQgdG8gZG8gdGhlIGFsaWdubWVudCBhdCB0aGUKKwkJCQkgKiBlb2YgaWYgaXQgaXMgdXNlcmRhdGEgYW5kIGFsbG9jYXRpb24gbGVuZ3RoCisJCQkJICogaXMgbGFyZ2VyIHRoYW4gYSBzdHJpcGUgdW5pdC4KKwkJCQkgKi8KKwkJCQlpZiAobXAtPm1fZGFsaWduICYmIGFsZW4gPj0gbXAtPm1fZGFsaWduICYmCisJCQkJICAgIHVzZXJkYXRhICYmIHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKSB7CisJCQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1hcF9pc2Flb2YoaXAsIGFvZmYsCisJCQkJCQkJd2hpY2hmb3JrLCAmYm1hLmFlb2YpKSkKKwkJCQkJCWdvdG8gZXJyb3IwOworCQkJCX0gZWxzZQorCQkJCQlibWEuYWVvZiA9IDA7CisJCQkJLyoKKwkJCQkgKiBDYWxsIGFsbG9jYXRvci4KKwkJCQkgKi8KKwkJCQlpZiAoKGVycm9yID0geGZzX2JtYXBfYWxsb2MoJmJtYSkpKQorCQkJCQlnb3RvIGVycm9yMDsKKwkJCQkvKgorCQkJCSAqIENvcHkgb3V0IHJlc3VsdCBmaWVsZHMuCisJCQkJICovCisJCQkJYWJubyA9IGJtYS5ydmFsOworCQkJCWlmICgoZmxpc3QtPnhiZl9sb3cgPSBibWEubG93KSkKKwkJCQkJbWlubGVmdCA9IDA7CisJCQkJYWxlbiA9IGJtYS5hbGVuOworCQkJCWFvZmYgPSBibWEub2ZmOworCQkJCUFTU0VSVCgqZmlyc3RibG9jayA9PSBOVUxMRlNCTE9DSyB8fAorCQkJCSAgICAgICBYRlNfRlNCX1RPX0FHTk8obXAsICpmaXJzdGJsb2NrKSA9PQorCQkJCSAgICAgICBYRlNfRlNCX1RPX0FHTk8obXAsIGJtYS5maXJzdGJsb2NrKSB8fAorCQkJCSAgICAgICAoZmxpc3QtPnhiZl9sb3cgJiYKKwkJCQkJWEZTX0ZTQl9UT19BR05PKG1wLCAqZmlyc3RibG9jaykgPAorCQkJCQlYRlNfRlNCX1RPX0FHTk8obXAsIGJtYS5maXJzdGJsb2NrKSkpOworCQkJCSpmaXJzdGJsb2NrID0gYm1hLmZpcnN0YmxvY2s7CisJCQkJaWYgKGN1cikKKwkJCQkJY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jayA9CisJCQkJCQkqZmlyc3RibG9jazsKKwkJCQlpZiAoYWJubyA9PSBOVUxMRlNCTE9DSykKKwkJCQkJYnJlYWs7CisJCQkJaWYgKChpZnAtPmlmX2ZsYWdzICYgWEZTX0lGQlJPT1QpICYmICFjdXIpIHsKKwkJCQkJY3VyID0geGZzX2J0cmVlX2luaXRfY3Vyc29yKG1wLAorCQkJCQkJdHAsIE5VTEwsIDAsIFhGU19CVE5VTV9CTUFQLAorCQkJCQkJaXAsIHdoaWNoZm9yayk7CisJCQkJCWN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2sgPQorCQkJCQkJKmZpcnN0YmxvY2s7CisJCQkJCWN1ci0+YmNfcHJpdmF0ZS5iLmZsaXN0ID0gZmxpc3Q7CisJCQkJfQorCQkJCS8qCisJCQkJICogQnVtcCB0aGUgbnVtYmVyIG9mIGV4dGVudHMgd2UndmUgYWxsb2NhdGVkCisJCQkJICogaW4gdGhpcyBjYWxsLgorCQkJCSAqLworCQkJCW5hbGxvY3MrKzsKKwkJCX0KKwkJCWlmIChjdXIpCisJCQkJY3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgPQorCQkJCQl3YXNkZWxheSA/IFhGU19CVENVUl9CUFJWX1dBU0RFTCA6IDA7CisJCQlnb3QuYnJfc3RhcnRvZmYgPSBhb2ZmOworCQkJZ290LmJyX3N0YXJ0YmxvY2sgPSBhYm5vOworCQkJZ290LmJyX2Jsb2NrY291bnQgPSBhbGVuOworCQkJZ290LmJyX3N0YXRlID0gWEZTX0VYVF9OT1JNOwkvKiBhc3N1bWUgbm9ybWFsICovCisJCQkvKgorCQkJICogRGV0ZXJtaW5lIHN0YXRlIG9mIGV4dGVudCwgYW5kIHRoZSBmaWxlc3lzdGVtLgorCQkJICogQSB3YXNkZWxheSBleHRlbnQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIHNvCisJCQkgKiBzaG91bGRuJ3QgYmUgZmxhZ2dlZCBhcyB1bndyaXR0ZW4uCisJCQkgKi8KKwkJCWlmICh3ciAmJiBYRlNfU0JfVkVSU0lPTl9IQVNFWFRGTEdCSVQoJm1wLT5tX3NiKSkgeworCQkJCWlmICghd2FzZGVsYXkgJiYgKGZsYWdzICYgWEZTX0JNQVBJX1BSRUFMTE9DKSkKKwkJCQkJZ290LmJyX3N0YXRlID0gWEZTX0VYVF9VTldSSVRURU47CisJCQl9CisJCQllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnQoaXAsIGxhc3R4LCAmY3VyLCAmZ290LAorCQkJCWZpcnN0YmxvY2ssIGZsaXN0LCAmdG1wX2xvZ2ZsYWdzLCB3aGljaGZvcmssCisJCQkJcnN2ZCk7CisJCQlsb2dmbGFncyB8PSB0bXBfbG9nZmxhZ3M7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBlcnJvcjA7CisJCQlsYXN0eCA9IGlmcC0+aWZfbGFzdGV4OworCQkJZXAgPSAmaWZwLT5pZl91MS5pZl9leHRlbnRzW2xhc3R4XTsKKwkJCW5leHRlbnRzID0gaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJCQl4ZnNfYm1idF9nZXRfYWxsKGVwLCAmZ290KTsKKwkJCUFTU0VSVChnb3QuYnJfc3RhcnRvZmYgPD0gYW9mZik7CisJCQlBU1NFUlQoZ290LmJyX3N0YXJ0b2ZmICsgZ290LmJyX2Jsb2NrY291bnQgPj0KKwkJCQlhb2ZmICsgYWxlbik7CisjaWZkZWYgREVCVUcKKwkJCWlmIChkZWxheSkgeworCQkJCUFTU0VSVChJU05VTExTVEFSVEJMT0NLKGdvdC5icl9zdGFydGJsb2NrKSk7CisJCQkJQVNTRVJUKFNUQVJUQkxPQ0tWQUwoZ290LmJyX3N0YXJ0YmxvY2spID4gMCk7CisJCQl9CisJCQlBU1NFUlQoZ290LmJyX3N0YXRlID09IFhGU19FWFRfTk9STSB8fAorCQkJICAgICAgIGdvdC5icl9zdGF0ZSA9PSBYRlNfRVhUX1VOV1JJVFRFTik7CisjZW5kaWYKKwkJCS8qCisJCQkgKiBGYWxsIGRvd24gaW50byB0aGUgZm91bmQgYWxsb2NhdGVkIHNwYWNlIGNhc2UuCisJCQkgKi8KKwkJfSBlbHNlIGlmIChpbmhvbGUpIHsKKwkJCS8qCisJCQkgKiBSZWFkaW5nIGluIGEgaG9sZS4KKwkJCSAqLworCQkJbXZhbC0+YnJfc3RhcnRvZmYgPSBibm87CisJCQltdmFsLT5icl9zdGFydGJsb2NrID0gSE9MRVNUQVJUQkxPQ0s7CisJCQltdmFsLT5icl9ibG9ja2NvdW50ID0KKwkJCQlYRlNfRklMQkxLU19NSU4obGVuLCBnb3QuYnJfc3RhcnRvZmYgLSBibm8pOworCQkJbXZhbC0+YnJfc3RhdGUgPSBYRlNfRVhUX05PUk07CisJCQlibm8gKz0gbXZhbC0+YnJfYmxvY2tjb3VudDsKKwkJCWxlbiAtPSBtdmFsLT5icl9ibG9ja2NvdW50OworCQkJbXZhbCsrOworCQkJbisrOworCQkJY29udGludWU7CisJCX0KKwkJLyoKKwkJICogVGhlbiBkZWFsIHdpdGggdGhlIGFsbG9jYXRlZCBzcGFjZSB3ZSBmb3VuZC4KKwkJICovCisJCUFTU0VSVChlcCAhPSBOVUxMKTsKKwkJaWYgKHRyaW0gJiYgKGdvdC5icl9zdGFydG9mZiArIGdvdC5icl9ibG9ja2NvdW50ID4gb2JubykpIHsKKwkJCWlmIChvYm5vID4gYm5vKQorCQkJCWJubyA9IG9ibm87CisJCQlBU1NFUlQoKGJubyA+PSBvYm5vKSB8fCAobiA9PSAwKSk7CisJCQlBU1NFUlQoYm5vIDwgZW5kKTsKKwkJCW12YWwtPmJyX3N0YXJ0b2ZmID0gYm5vOworCQkJaWYgKElTTlVMTFNUQVJUQkxPQ0soZ290LmJyX3N0YXJ0YmxvY2spKSB7CisJCQkJQVNTRVJUKCF3ciB8fCBkZWxheSk7CisJCQkJbXZhbC0+YnJfc3RhcnRibG9jayA9IERFTEFZU1RBUlRCTE9DSzsKKwkJCX0gZWxzZQorCQkJCW12YWwtPmJyX3N0YXJ0YmxvY2sgPQorCQkJCQlnb3QuYnJfc3RhcnRibG9jayArCisJCQkJCShibm8gLSBnb3QuYnJfc3RhcnRvZmYpOworCQkJLyoKKwkJCSAqIFJldHVybiB0aGUgbWluaW11bSBvZiB3aGF0IHdlIGdvdCBhbmQgd2hhdCB3ZQorCQkJICogYXNrZWQgZm9yIGZvciB0aGUgbGVuZ3RoLiAgV2UgY2FuIHVzZSB0aGUgbGVuCisJCQkgKiB2YXJpYWJsZSBoZXJlIGJlY2F1c2UgaXQgaXMgbW9kaWZpZWQgYmVsb3cKKwkJCSAqIGFuZCB3ZSBjb3VsZCBoYXZlIGJlZW4gdGhlcmUgYmVmb3JlIGNvbWluZworCQkJICogaGVyZSBpZiB0aGUgZmlyc3QgcGFydCBvZiB0aGUgYWxsb2NhdGlvbgorCQkJICogZGlkbid0IG92ZXJsYXAgd2hhdCB3YXMgYXNrZWQgZm9yLgorCQkJICovCisJCQltdmFsLT5icl9ibG9ja2NvdW50ID0KKwkJCQlYRlNfRklMQkxLU19NSU4oZW5kIC0gYm5vLCBnb3QuYnJfYmxvY2tjb3VudCAtCisJCQkJCShibm8gLSBnb3QuYnJfc3RhcnRvZmYpKTsKKwkJCW12YWwtPmJyX3N0YXRlID0gZ290LmJyX3N0YXRlOworCQkJQVNTRVJUKG12YWwtPmJyX2Jsb2NrY291bnQgPD0gbGVuKTsKKwkJfSBlbHNlIHsKKwkJCSptdmFsID0gZ290OworCQkJaWYgKElTTlVMTFNUQVJUQkxPQ0sobXZhbC0+YnJfc3RhcnRibG9jaykpIHsKKwkJCQlBU1NFUlQoIXdyIHx8IGRlbGF5KTsKKwkJCQltdmFsLT5icl9zdGFydGJsb2NrID0gREVMQVlTVEFSVEJMT0NLOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogQ2hlY2sgaWYgd3JpdGluZyBwcmV2aW91c2x5IGFsbG9jYXRlZCBidXQKKwkJICogdW53cml0dGVuIGV4dGVudHMuCisJCSAqLworCQlpZiAod3IgJiYgbXZhbC0+YnJfc3RhdGUgPT0gWEZTX0VYVF9VTldSSVRURU4gJiYKKwkJICAgICgoZmxhZ3MgJiAoWEZTX0JNQVBJX1BSRUFMTE9DfFhGU19CTUFQSV9ERUxBWSkpID09IDApKSB7CisJCQkvKgorCQkJICogTW9kaWZ5IChieSBhZGRpbmcpIHRoZSBzdGF0ZSBmbGFnLCBpZiB3cml0aW5nLgorCQkJICovCisJCQlBU1NFUlQobXZhbC0+YnJfYmxvY2tjb3VudCA8PSBsZW4pOworCQkJaWYgKChpZnAtPmlmX2ZsYWdzICYgWEZTX0lGQlJPT1QpICYmICFjdXIpIHsKKwkJCQljdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IobXAsCisJCQkJCXRwLCBOVUxMLCAwLCBYRlNfQlROVU1fQk1BUCwKKwkJCQkJaXAsIHdoaWNoZm9yayk7CisJCQkJY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jayA9CisJCQkJCSpmaXJzdGJsb2NrOworCQkJCWN1ci0+YmNfcHJpdmF0ZS5iLmZsaXN0ID0gZmxpc3Q7CisJCQl9CisJCQltdmFsLT5icl9zdGF0ZSA9IFhGU19FWFRfTk9STTsKKwkJCWVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudChpcCwgbGFzdHgsICZjdXIsIG12YWwsCisJCQkJZmlyc3RibG9jaywgZmxpc3QsICZ0bXBfbG9nZmxhZ3MsIHdoaWNoZm9yaywKKwkJCQlyc3ZkKTsKKwkJCWxvZ2ZsYWdzIHw9IHRtcF9sb2dmbGFnczsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGVycm9yMDsKKwkJCWxhc3R4ID0gaWZwLT5pZl9sYXN0ZXg7CisJCQllcCA9ICZpZnAtPmlmX3UxLmlmX2V4dGVudHNbbGFzdHhdOworCQkJbmV4dGVudHMgPSBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwkJCXhmc19ibWJ0X2dldF9hbGwoZXAsICZnb3QpOworCQkJLyoKKwkJCSAqIFdlIG1heSBoYXZlIGNvbWJpbmVkIHByZXZpb3VzbHkgdW53cml0dGVuCisJCQkgKiBzcGFjZSB3aXRoIHdyaXR0ZW4gc3BhY2UsIHNvIGdlbmVyYXRlCisJCQkgKiBhbm90aGVyIHJlcXVlc3QuCisJCQkgKi8KKwkJCWlmIChtdmFsLT5icl9ibG9ja2NvdW50IDwgbGVuKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJQVNTRVJUKCF0cmltIHx8CisJCSAgICAgICAoKG12YWwtPmJyX3N0YXJ0b2ZmICsgbXZhbC0+YnJfYmxvY2tjb3VudCkgPD0gZW5kKSk7CisJCUFTU0VSVCghdHJpbSB8fCAobXZhbC0+YnJfYmxvY2tjb3VudCA8PSBsZW4pIHx8CisJCSAgICAgICAobXZhbC0+YnJfc3RhcnRvZmYgPCBvYm5vKSk7CisJCWJubyA9IG12YWwtPmJyX3N0YXJ0b2ZmICsgbXZhbC0+YnJfYmxvY2tjb3VudDsKKwkJbGVuID0gZW5kIC0gYm5vOworCQlpZiAobiA+IDAgJiYgbXZhbC0+YnJfc3RhcnRvZmYgPT0gbXZhbFstMV0uYnJfc3RhcnRvZmYpIHsKKwkJCUFTU0VSVChtdmFsLT5icl9zdGFydGJsb2NrID09IG12YWxbLTFdLmJyX3N0YXJ0YmxvY2spOworCQkJQVNTRVJUKG12YWwtPmJyX2Jsb2NrY291bnQgPiBtdmFsWy0xXS5icl9ibG9ja2NvdW50KTsKKwkJCUFTU0VSVChtdmFsLT5icl9zdGF0ZSA9PSBtdmFsWy0xXS5icl9zdGF0ZSk7CisJCQltdmFsWy0xXS5icl9ibG9ja2NvdW50ID0gbXZhbC0+YnJfYmxvY2tjb3VudDsKKwkJCW12YWxbLTFdLmJyX3N0YXRlID0gbXZhbC0+YnJfc3RhdGU7CisJCX0gZWxzZSBpZiAobiA+IDAgJiYgbXZhbC0+YnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0sgJiYKKwkJCSAgIG12YWxbLTFdLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLICYmCisJCQkgICBtdmFsWy0xXS5icl9zdGFydGJsb2NrICE9IEhPTEVTVEFSVEJMT0NLICYmCisJCQkgICBtdmFsLT5icl9zdGFydGJsb2NrID09CisJCQkgICBtdmFsWy0xXS5icl9zdGFydGJsb2NrICsgbXZhbFstMV0uYnJfYmxvY2tjb3VudCAmJgorCQkJICAgKHN0YXRlbGVzcyB8fCBtdmFsWy0xXS5icl9zdGF0ZSA9PSBtdmFsLT5icl9zdGF0ZSkpIHsKKwkJCUFTU0VSVChtdmFsLT5icl9zdGFydG9mZiA9PQorCQkJICAgICAgIG12YWxbLTFdLmJyX3N0YXJ0b2ZmICsgbXZhbFstMV0uYnJfYmxvY2tjb3VudCk7CisJCQltdmFsWy0xXS5icl9ibG9ja2NvdW50ICs9IG12YWwtPmJyX2Jsb2NrY291bnQ7CisJCX0gZWxzZSBpZiAobiA+IDAgJiYKKwkJCSAgIG12YWwtPmJyX3N0YXJ0YmxvY2sgPT0gREVMQVlTVEFSVEJMT0NLICYmCisJCQkgICBtdmFsWy0xXS5icl9zdGFydGJsb2NrID09IERFTEFZU1RBUlRCTE9DSyAmJgorCQkJICAgbXZhbC0+YnJfc3RhcnRvZmYgPT0KKwkJCSAgIG12YWxbLTFdLmJyX3N0YXJ0b2ZmICsgbXZhbFstMV0uYnJfYmxvY2tjb3VudCkgeworCQkJbXZhbFstMV0uYnJfYmxvY2tjb3VudCArPSBtdmFsLT5icl9ibG9ja2NvdW50OworCQkJbXZhbFstMV0uYnJfc3RhdGUgPSBtdmFsLT5icl9zdGF0ZTsKKwkJfSBlbHNlIGlmICghKChuID09IDApICYmCisJCQkgICAgICgobXZhbC0+YnJfc3RhcnRvZmYgKyBtdmFsLT5icl9ibG9ja2NvdW50KSA8PQorCQkJICAgICAgb2JubykpKSB7CisJCQltdmFsKys7CisJCQluKys7CisJCX0KKwkJLyoKKwkJICogSWYgd2UncmUgZG9uZSwgc3RvcCBub3cuICBTdG9wIHdoZW4gd2UndmUgYWxsb2NhdGVkCisJCSAqIFhGU19CTUFQX01BWF9OTUFQIGV4dGVudHMgbm8gbWF0dGVyIHdoYXQuICBPdGhlcndpc2UKKwkJICogdGhlIHRyYW5zYWN0aW9uIG1heSBnZXQgdG9vIGJpZy4KKwkJICovCisJCWlmIChibm8gPj0gZW5kIHx8IG4gPj0gKm5tYXAgfHwgbmFsbG9jcyA+PSAqbm1hcCkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBFbHNlIGdvIG9uIHRvIHRoZSBuZXh0IHJlY29yZC4KKwkJICovCisJCWVwKys7CisJCWxhc3R4Kys7CisJCWlmIChsYXN0eCA+PSBuZXh0ZW50cykgeworCQkJZW9mID0gMTsKKwkJCXByZXYgPSBnb3Q7CisJCX0gZWxzZQorCQkJeGZzX2JtYnRfZ2V0X2FsbChlcCwgJmdvdCk7CisJfQorCWlmcC0+aWZfbGFzdGV4ID0gbGFzdHg7CisJKm5tYXAgPSBuOworCS8qCisJICogVHJhbnNmb3JtIGZyb20gYnRyZWUgdG8gZXh0ZW50cywgZ2l2ZSBpdCBjdXIuCisJICovCisJaWYgKHRwICYmIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUgJiYKKwkgICAgWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspIDw9IGlmcC0+aWZfZXh0X21heCkgeworCQlBU1NFUlQod3IgJiYgY3VyKTsKKwkJZXJyb3IgPSB4ZnNfYm1hcF9idHJlZV90b19leHRlbnRzKHRwLCBpcCwgY3VyLAorCQkJJnRtcF9sb2dmbGFncywgd2hpY2hmb3JrKTsKKwkJbG9nZmxhZ3MgfD0gdG1wX2xvZ2ZsYWdzOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMDsKKwl9CisJQVNTRVJUKGlmcC0+aWZfZXh0X21heCA9PQorCSAgICAgICBYRlNfSUZPUktfU0laRShpcCwgd2hpY2hmb3JrKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkpOworCUFTU0VSVChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0JUUkVFIHx8CisJICAgICAgIFhGU19JRk9SS19ORVhURU5UUyhpcCwgd2hpY2hmb3JrKSA+IGlmcC0+aWZfZXh0X21heCk7CisJZXJyb3IgPSAwOworCitlcnJvcjA6CisJLyoKKwkgKiBMb2cgZXZlcnl0aGluZy4gIERvIHRoaXMgYWZ0ZXIgY29udmVyc2lvbiwgdGhlcmUncyBubyBwb2ludCBpbgorCSAqIGxvZ2dpbmcgdGhlIGV4dGVudCBsaXN0IGlmIHdlJ3ZlIGNvbnZlcnRlZCB0byBidHJlZSBmb3JtYXQuCisJICovCisJaWYgKChsb2dmbGFncyAmIFhGU19JTE9HX0ZFWFQod2hpY2hmb3JrKSkgJiYKKwkgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTKQorCQlsb2dmbGFncyAmPSB+WEZTX0lMT0dfRkVYVCh3aGljaGZvcmspOworCWVsc2UgaWYgKChsb2dmbGFncyAmIFhGU19JTE9HX0ZCUk9PVCh3aGljaGZvcmspKSAmJgorCQkgWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSkKKwkJbG9nZmxhZ3MgJj0gflhGU19JTE9HX0ZCUk9PVCh3aGljaGZvcmspOworCS8qCisJICogTG9nIHdoYXRldmVyIHRoZSBmbGFncyBzYXksIGV2ZW4gaWYgZXJyb3IuICBPdGhlcndpc2Ugd2UgbWlnaHQgbWlzcworCSAqIGRldGVjdGluZyBhIGNhc2Ugd2hlcmUgdGhlIGRhdGEgaXMgY2hhbmdlZCwgdGhlcmUncyBhbiBlcnJvciwKKwkgKiBhbmQgaXQncyBub3QgbG9nZ2VkIHNvIHdlIGRvbid0IHNodXRkb3duIHdoZW4gd2Ugc2hvdWxkLgorCSAqLworCWlmIChsb2dmbGFncykgeworCQlBU1NFUlQodHAgJiYgd3IpOworCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgbG9nZmxhZ3MpOworCX0KKwlpZiAoY3VyKSB7CisJCWlmICghZXJyb3IpIHsKKwkJCUFTU0VSVCgqZmlyc3RibG9jayA9PSBOVUxMRlNCTE9DSyB8fAorCQkJICAgICAgIFhGU19GU0JfVE9fQUdOTyhtcCwgKmZpcnN0YmxvY2spID09CisJCQkgICAgICAgWEZTX0ZTQl9UT19BR05PKG1wLAorCQkJCSAgICAgICBjdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrKSB8fAorCQkJICAgICAgIChmbGlzdC0+eGJmX2xvdyAmJgorCQkJCVhGU19GU0JfVE9fQUdOTyhtcCwgKmZpcnN0YmxvY2spIDwKKwkJCQlYRlNfRlNCX1RPX0FHTk8obXAsCisJCQkJCWN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2spKSk7CisJCQkqZmlyc3RibG9jayA9IGN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2s7CisJCX0KKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLAorCQkJZXJyb3IgPyBYRlNfQlRSRUVfRVJST1IgOiBYRlNfQlRSRUVfTk9FUlJPUik7CisJfQorCWlmICghZXJyb3IpCisJCXhmc19ibWFwX3ZhbGlkYXRlX3JldChvcmlnX2Jubywgb3JpZ19sZW4sIG9yaWdfZmxhZ3MsIG9yaWdfbXZhbCwKKwkJCW9yaWdfbm1hcCwgKm5tYXApOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIE1hcCBmaWxlIGJsb2NrcyB0byBmaWxlc3lzdGVtIGJsb2Nrcywgc2ltcGxlIHZlcnNpb24uCisgKiBPbmUgYmxvY2sgKGV4dGVudCkgb25seSwgcmVhZC1vbmx5LgorICogRm9yIGZsYWdzLCBvbmx5IHRoZSBYRlNfQk1BUElfQVRUUkZPUksgZmxhZyBpcyBleGFtaW5lZC4KKyAqIEZvciB0aGUgb3RoZXIgZmxhZyB2YWx1ZXMsIHRoZSBlZmZlY3QgaXMgYXMgaWYgWEZTX0JNQVBJX01FVEFEQVRBCisgKiB3YXMgc2V0IGFuZCBhbGwgdGhlIG90aGVycyB3ZXJlIGNsZWFyLgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBpX3NpbmdsZSgKKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCisJaW50CQl3aGljaGZvcmssCS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisJeGZzX2ZzYmxvY2tfdAkqZnNiLAkJLyogb3V0cHV0OiBtYXBwZWQgYmxvY2sgKi8KKwl4ZnNfZmlsZW9mZl90CWJubykJCS8qIHN0YXJ0aW5nIGZpbGUgb2Zmcy4gbWFwcGVkICovCit7CisJaW50CQllb2Y7CQkvKiB3ZSd2ZSBoaXQgdGhlIGVuZCBvZiBleHRlbnQgbGlzdCAqLworCWludAkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gKi8KKwl4ZnNfYm1idF9pcmVjX3QJZ290OwkJLyogY3VycmVudCBleHRlbnQgbGlzdCByZWNvcmQgKi8KKwl4ZnNfaWZvcmtfdAkqaWZwOwkJLyogaW5vZGUgZm9yayBwb2ludGVyICovCisJeGZzX2V4dG51bV90CWxhc3R4OwkJLyogbGFzdCB1c2VmdWwgZXh0ZW50IG51bWJlciAqLworCXhmc19ibWJ0X2lyZWNfdAlwcmV2OwkJLyogcHJldmlvdXMgZXh0ZW50IGxpc3QgcmVjb3JkICovCisKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCWlmICh1bmxpa2VseSgKKwkgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSAmJgorCSAgICBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0VYVEVOVFMpKSB7CisJICAgICAgIFhGU19FUlJPUl9SRVBPUlQoInhmc19ibWFwaV9zaW5nbGUiLCBYRlNfRVJSTEVWRUxfTE9XLAorCQkJCWlwLT5pX21vdW50KTsKKwkgICAgICAgcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkpCisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwlYRlNfU1RBVFNfSU5DKHhzX2Jsa19tYXByKTsKKwlpZiAoIShpZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykgJiYKKwkgICAgKGVycm9yID0geGZzX2lyZWFkX2V4dGVudHModHAsIGlwLCB3aGljaGZvcmspKSkKKwkJcmV0dXJuIGVycm9yOworCSh2b2lkKXhmc19ibWFwX3NlYXJjaF9leHRlbnRzKGlwLCBibm8sIHdoaWNoZm9yaywgJmVvZiwgJmxhc3R4LCAmZ290LAorCQkmcHJldik7CisJLyoKKwkgKiBSZWFkaW5nIHBhc3QgZW9mLCBhY3QgYXMgdGhvdWdoIHRoZXJlJ3MgYSBob2xlCisJICogdXAgdG8gZW5kLgorCSAqLworCWlmIChlb2YgfHwgZ290LmJyX3N0YXJ0b2ZmID4gYm5vKSB7CisJCSpmc2IgPSBOVUxMRlNCTE9DSzsKKwkJcmV0dXJuIDA7CisJfQorCUFTU0VSVCghSVNOVUxMU1RBUlRCTE9DSyhnb3QuYnJfc3RhcnRibG9jaykpOworCUFTU0VSVChibm8gPCBnb3QuYnJfc3RhcnRvZmYgKyBnb3QuYnJfYmxvY2tjb3VudCk7CisJKmZzYiA9IGdvdC5icl9zdGFydGJsb2NrICsgKGJubyAtIGdvdC5icl9zdGFydG9mZik7CisJaWZwLT5pZl9sYXN0ZXggPSBsYXN0eDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFVubWFwIChyZW1vdmUpIGJsb2NrcyBmcm9tIGEgZmlsZS4KKyAqIElmIG5leHRzIGlzIG5vbnplcm8gdGhlbiB0aGUgbnVtYmVyIG9mIGV4dGVudHMgdG8gcmVtb3ZlIGlzIGxpbWl0ZWQgdG8KKyAqIHRoYXQgdmFsdWUuICBJZiBub3QgYWxsIGV4dGVudHMgaW4gdGhlIGJsb2NrIHJhbmdlIGNhbiBiZSByZW1vdmVkIHRoZW4KKyAqICpkb25lIGlzIHNldC4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19idW5tYXBpKAorCXhmc190cmFuc190CQkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgKi8KKwl4ZnNfZmlsZW9mZl90CQlibm8sCQkvKiBzdGFydGluZyBvZmZzZXQgdG8gdW5tYXAgKi8KKwl4ZnNfZmlsYmxrc190CQlsZW4sCQkvKiBsZW5ndGggdG8gdW5tYXAgaW4gZmlsZSAqLworCWludAkJCWZsYWdzLAkJLyogbWlzYyBmbGFncyAqLworCXhmc19leHRudW1fdAkJbmV4dHMsCQkvKiBudW1iZXIgb2YgZXh0ZW50cyBtYXggKi8KKwl4ZnNfZnNibG9ja190CQkqZmlyc3RibG9jaywJLyogZmlyc3QgYWxsb2NhdGVkIGJsb2NrCisJCQkJCQkgICBjb250cm9scyBhLmcuIGZvciBhbGxvY3MgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJCS8qIGkvbzogbGlzdCBleHRlbnRzIHRvIGZyZWUgKi8KKwlpbnQJCQkqZG9uZSkJCS8qIHNldCBpZiBub3QgZG9uZSB5ZXQgKi8KK3sKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXI7CQkvKiBibWFwIGJ0cmVlIGN1cnNvciAqLworCXhmc19ibWJ0X2lyZWNfdAkJZGVsOwkJLyogZXh0ZW50IGJlaW5nIGRlbGV0ZWQgKi8KKwlpbnQJCQllb2Y7CQkvKiBpcyBkZWxldGluZyBhdCBlb2YgKi8KKwl4ZnNfYm1idF9yZWNfdAkJKmVwOwkJLyogZXh0ZW50IGxpc3QgZW50cnkgcG9pbnRlciAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX2V4dG51bV90CQlleHRubzsJCS8qIGV4dGVudCBudW1iZXIgaW4gbGlzdCAqLworCXhmc19ibWJ0X2lyZWNfdAkJZ290OwkJLyogY3VycmVudCBleHRlbnQgbGlzdCBlbnRyeSAqLworCXhmc19pZm9ya190CQkqaWZwOwkJLyogaW5vZGUgZm9yayBwb2ludGVyICovCisJaW50CQkJaXNydDsJCS8qIGZyZWVpbmcgaW4gcnQgYXJlYSAqLworCXhmc19leHRudW1fdAkJbGFzdHg7CQkvKiBsYXN0IGV4dGVudCBpbmRleCB1c2VkICovCisJaW50CQkJbG9nZmxhZ3M7CS8qIHRyYW5zYWN0aW9uIGxvZ2dpbmcgZmxhZ3MgKi8KKwl4ZnNfZXh0bGVuX3QJCW1vZDsJCS8qIHJ0IGV4dGVudCBvZmZzZXQgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogbW91bnQgc3RydWN0dXJlICovCisJeGZzX2V4dG51bV90CQluZXh0ZW50czsJLyogc2l6ZSBvZiBleHRlbnQgbGlzdCAqLworCXhmc19ibWJ0X2lyZWNfdAkJcHJldjsJCS8qIHByZXZpb3VzIGV4dGVudCBsaXN0IGVudHJ5ICovCisJeGZzX2ZpbGVvZmZfdAkJc3RhcnQ7CQkvKiBmaXJzdCBmaWxlIG9mZnNldCBkZWxldGVkICovCisJaW50CQkJdG1wX2xvZ2ZsYWdzOwkvKiBwYXJ0aWFsIGxvZ2dpbmcgZmxhZ3MgKi8KKwlpbnQJCQl3YXNkZWw7CQkvKiB3YXMgYSBkZWxheWVkIGFsbG9jIGV4dGVudCAqLworCWludAkJCXdoaWNoZm9yazsJLyogZGF0YSBvciBhdHRyaWJ1dGUgZm9yayAqLworCWludAkJCXJzdmQ7CQkvKiBPSyB0byBhbGxvY2F0ZSByZXNlcnZlZCBibG9ja3MgKi8KKwl4ZnNfZnNibG9ja190CQlzdW07CisKKwl4ZnNfYnVubWFwX3RyYWNlKGlwLCBibm8sIGxlbiwgZmxhZ3MsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwl3aGljaGZvcmsgPSAoZmxhZ3MgJiBYRlNfQk1BUElfQVRUUkZPUkspID8KKwkJWEZTX0FUVFJfRk9SSyA6IFhGU19EQVRBX0ZPUks7CisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwlpZiAodW5saWtlbHkoCisJICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCSAgICBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0JUUkVFKSkgeworCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfYnVubWFwaSIsIFhGU19FUlJMRVZFTF9MT1csCisJCQkJIGlwLT5pX21vdW50KTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKwltcCA9IGlwLT5pX21vdW50OworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCXJzdmQgPSAoZmxhZ3MgJiBYRlNfQk1BUElfUlNWQkxPQ0tTKSAhPSAwOworCUFTU0VSVChsZW4gPiAwKTsKKwlBU1NFUlQobmV4dHMgPj0gMCk7CisJQVNTRVJUKGlmcC0+aWZfZXh0X21heCA9PQorCSAgICAgICBYRlNfSUZPUktfU0laRShpcCwgd2hpY2hmb3JrKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkpOworCWlmICghKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSAmJgorCSAgICAoZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyh0cCwgaXAsIHdoaWNoZm9yaykpKQorCQlyZXR1cm4gZXJyb3I7CisJbmV4dGVudHMgPSBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwlpZiAobmV4dGVudHMgPT0gMCkgeworCQkqZG9uZSA9IDE7CisJCXJldHVybiAwOworCX0KKwlYRlNfU1RBVFNfSU5DKHhzX2Jsa191bm1hcCk7CisJaXNydCA9ICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgJiYKKwkgICAgICAgKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKTsKKwlzdGFydCA9IGJubzsKKwlibm8gPSBzdGFydCArIGxlbiAtIDE7CisJZXAgPSB4ZnNfYm1hcF9zZWFyY2hfZXh0ZW50cyhpcCwgYm5vLCB3aGljaGZvcmssICZlb2YsICZsYXN0eCwgJmdvdCwKKwkJJnByZXYpOworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBnaXZlbiBibG9jayBudW1iZXIgaXMgcGFzdCB0aGUgZW5kIG9mIHRoZQorCSAqIGZpbGUsIGJhY2sgdXAgdG8gdGhlIGxhc3QgYmxvY2sgaWYgc28uLi4KKwkgKi8KKwlpZiAoZW9mKSB7CisJCWVwID0gJmlmcC0+aWZfdTEuaWZfZXh0ZW50c1stLWxhc3R4XTsKKwkJeGZzX2JtYnRfZ2V0X2FsbChlcCwgJmdvdCk7CisJCWJubyA9IGdvdC5icl9zdGFydG9mZiArIGdvdC5icl9ibG9ja2NvdW50IC0gMTsKKwl9CisJbG9nZmxhZ3MgPSAwOworCWlmIChpZnAtPmlmX2ZsYWdzICYgWEZTX0lGQlJPT1QpIHsKKwkJQVNTRVJUKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpOworCQljdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IobXAsIHRwLCBOVUxMLCAwLCBYRlNfQlROVU1fQk1BUCwgaXAsCisJCQl3aGljaGZvcmspOworCQljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0gKmZpcnN0YmxvY2s7CisJCWN1ci0+YmNfcHJpdmF0ZS5iLmZsaXN0ID0gZmxpc3Q7CisJCWN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzID0gMDsKKwl9IGVsc2UKKwkJY3VyID0gTlVMTDsKKwlleHRubyA9IDA7CisJd2hpbGUgKGJubyAhPSAoeGZzX2ZpbGVvZmZfdCktMSAmJiBibm8gPj0gc3RhcnQgJiYgbGFzdHggPj0gMCAmJgorCSAgICAgICAobmV4dHMgPT0gMCB8fCBleHRubyA8IG5leHRzKSkgeworCQkvKgorCQkgKiBJcyB0aGUgZm91bmQgZXh0ZW50IGFmdGVyIGEgaG9sZSBpbiB3aGljaCBibm8gbGl2ZXM/CisJCSAqIEp1c3QgYmFjayB1cCB0byB0aGUgcHJldmlvdXMgZXh0ZW50LCBpZiBzby4KKwkJICovCisJCWlmIChnb3QuYnJfc3RhcnRvZmYgPiBibm8pIHsKKwkJCWlmICgtLWxhc3R4IDwgMCkKKwkJCQlicmVhazsKKwkJCWVwLS07CisJCQl4ZnNfYm1idF9nZXRfYWxsKGVwLCAmZ290KTsKKwkJfQorCQkvKgorCQkgKiBJcyB0aGUgbGFzdCBibG9jayBvZiB0aGlzIGV4dGVudCBiZWZvcmUgdGhlIHJhbmdlCisJCSAqIHdlJ3JlIHN1cHBvc2VkIHRvIGRlbGV0ZT8gIElmIHNvLCB3ZSdyZSBkb25lLgorCQkgKi8KKwkJYm5vID0gWEZTX0ZJTEVPRkZfTUlOKGJubywKKwkJCWdvdC5icl9zdGFydG9mZiArIGdvdC5icl9ibG9ja2NvdW50IC0gMSk7CisJCWlmIChibm8gPCBzdGFydCkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBUaGVuIGRlYWwgd2l0aCB0aGUgKHBvc3NpYmx5IGRlbGF5ZWQpIGFsbG9jYXRlZCBzcGFjZQorCQkgKiB3ZSBmb3VuZC4KKwkJICovCisJCUFTU0VSVChlcCAhPSBOVUxMKTsKKwkJZGVsID0gZ290OworCQl3YXNkZWwgPSBJU05VTExTVEFSVEJMT0NLKGRlbC5icl9zdGFydGJsb2NrKTsKKwkJaWYgKGdvdC5icl9zdGFydG9mZiA8IHN0YXJ0KSB7CisJCQlkZWwuYnJfc3RhcnRvZmYgPSBzdGFydDsKKwkJCWRlbC5icl9ibG9ja2NvdW50IC09IHN0YXJ0IC0gZ290LmJyX3N0YXJ0b2ZmOworCQkJaWYgKCF3YXNkZWwpCisJCQkJZGVsLmJyX3N0YXJ0YmxvY2sgKz0gc3RhcnQgLSBnb3QuYnJfc3RhcnRvZmY7CisJCX0KKwkJaWYgKGRlbC5icl9zdGFydG9mZiArIGRlbC5icl9ibG9ja2NvdW50ID4gYm5vICsgMSkKKwkJCWRlbC5icl9ibG9ja2NvdW50ID0gYm5vICsgMSAtIGRlbC5icl9zdGFydG9mZjsKKwkJc3VtID0gZGVsLmJyX3N0YXJ0YmxvY2sgKyBkZWwuYnJfYmxvY2tjb3VudDsKKwkJaWYgKGlzcnQgJiYKKwkJICAgIChtb2QgPSBkb19tb2Qoc3VtLCBtcC0+bV9zYi5zYl9yZXh0c2l6ZSkpKSB7CisJCQkvKgorCQkJICogUmVhbHRpbWUgZXh0ZW50IG5vdCBsaW5lZCB1cCBhdCB0aGUgZW5kLgorCQkJICogVGhlIGV4dGVudCBjb3VsZCBoYXZlIGJlZW4gc3BsaXQgaW50byB3cml0dGVuCisJCQkgKiBhbmQgdW53cml0dGVuIHBpZWNlcywgb3Igd2UgY291bGQganVzdCBiZQorCQkJICogdW5tYXBwaW5nIHBhcnQgb2YgaXQuICBCdXQgd2UgY2FuJ3QgcmVhbGx5CisJCQkgKiBnZXQgcmlkIG9mIHBhcnQgb2YgYSByZWFsdGltZSBleHRlbnQuCisJCQkgKi8KKwkJCWlmIChkZWwuYnJfc3RhdGUgPT0gWEZTX0VYVF9VTldSSVRURU4gfHwKKwkJCSAgICAhWEZTX1NCX1ZFUlNJT05fSEFTRVhURkxHQklUKCZtcC0+bV9zYikpIHsKKwkJCQkvKgorCQkJCSAqIFRoaXMgcGllY2UgaXMgdW53cml0dGVuLCBvciB3ZSdyZSBub3QKKwkJCQkgKiB1c2luZyB1bndyaXR0ZW4gZXh0ZW50cy4gIFNraXAgb3ZlciBpdC4KKwkJCQkgKi8KKwkJCQlBU1NFUlQoYm5vID49IG1vZCk7CisJCQkJYm5vIC09IG1vZCA+IGRlbC5icl9ibG9ja2NvdW50ID8KKwkJCQkJZGVsLmJyX2Jsb2NrY291bnQgOiBtb2Q7CisJCQkJaWYgKGJubyA8IGdvdC5icl9zdGFydG9mZikgeworCQkJCQlpZiAoLS1sYXN0eCA+PSAwKQorCQkJCQkJeGZzX2JtYnRfZ2V0X2FsbCgtLWVwLCAmZ290KTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKgorCQkJICogSXQncyB3cml0dGVuLCB0dXJuIGl0IHVud3JpdHRlbi4KKwkJCSAqIFRoaXMgaXMgYmV0dGVyIHRoYW4gemVyb2luZyBpdC4KKwkJCSAqLworCQkJQVNTRVJUKGRlbC5icl9zdGF0ZSA9PSBYRlNfRVhUX05PUk0pOworCQkJQVNTRVJUKHhmc190cmFuc19nZXRfYmxvY2tfcmVzKHRwKSA+IDApOworCQkJLyoKKwkJCSAqIElmIHRoaXMgc3BhbnMgYSByZWFsdGltZSBleHRlbnQgYm91bmRhcnksCisJCQkgKiBjaG9wIGl0IGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBvbmUgd2UgZW5kIGF0LgorCQkJICovCisJCQlpZiAoZGVsLmJyX2Jsb2NrY291bnQgPiBtb2QpIHsKKwkJCQlkZWwuYnJfc3RhcnRvZmYgKz0gZGVsLmJyX2Jsb2NrY291bnQgLSBtb2Q7CisJCQkJZGVsLmJyX3N0YXJ0YmxvY2sgKz0gZGVsLmJyX2Jsb2NrY291bnQgLSBtb2Q7CisJCQkJZGVsLmJyX2Jsb2NrY291bnQgPSBtb2Q7CisJCQl9CisJCQlkZWwuYnJfc3RhdGUgPSBYRlNfRVhUX1VOV1JJVFRFTjsKKwkJCWVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudChpcCwgbGFzdHgsICZjdXIsICZkZWwsCisJCQkJZmlyc3RibG9jaywgZmxpc3QsICZsb2dmbGFncywgWEZTX0RBVEFfRk9SSywgMCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBlcnJvcjA7CisJCQlnb3RvIG5vZGVsZXRlOworCQl9CisJCWlmIChpc3J0ICYmIChtb2QgPSBkb19tb2QoZGVsLmJyX3N0YXJ0YmxvY2ssIG1wLT5tX3NiLnNiX3JleHRzaXplKSkpIHsKKwkJCS8qCisJCQkgKiBSZWFsdGltZSBleHRlbnQgaXMgbGluZWQgdXAgYXQgdGhlIGVuZCBidXQgbm90CisJCQkgKiBhdCB0aGUgZnJvbnQuICBXZSdsbCBnZXQgcmlkIG9mIGZ1bGwgZXh0ZW50cyBpZgorCQkJICogd2UgY2FuLgorCQkJICovCisJCQltb2QgPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZSAtIG1vZDsKKwkJCWlmIChkZWwuYnJfYmxvY2tjb3VudCA+IG1vZCkgeworCQkJCWRlbC5icl9ibG9ja2NvdW50IC09IG1vZDsKKwkJCQlkZWwuYnJfc3RhcnRvZmYgKz0gbW9kOworCQkJCWRlbC5icl9zdGFydGJsb2NrICs9IG1vZDsKKwkJCX0gZWxzZSBpZiAoKGRlbC5icl9zdGFydG9mZiA9PSBzdGFydCAmJgorCQkJCSAgICAoZGVsLmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOIHx8CisJCQkJICAgICB4ZnNfdHJhbnNfZ2V0X2Jsb2NrX3Jlcyh0cCkgPT0gMCkpIHx8CisJCQkJICAgIVhGU19TQl9WRVJTSU9OX0hBU0VYVEZMR0JJVCgmbXAtPm1fc2IpKSB7CisJCQkJLyoKKwkJCQkgKiBDYW4ndCBtYWtlIGl0IHVud3JpdHRlbi4gIFRoZXJlIGlzbid0CisJCQkJICogYSBmdWxsIGV4dGVudCBoZXJlIHNvIGp1c3Qgc2tpcCBpdC4KKwkJCQkgKi8KKwkJCQlBU1NFUlQoYm5vID49IGRlbC5icl9ibG9ja2NvdW50KTsKKwkJCQlibm8gLT0gZGVsLmJyX2Jsb2NrY291bnQ7CisJCQkJaWYgKGJubyA8IGdvdC5icl9zdGFydG9mZikgeworCQkJCQlpZiAoLS1sYXN0eCA+PSAwKQorCQkJCQkJeGZzX2JtYnRfZ2V0X2FsbCgtLWVwLCAmZ290KTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKGRlbC5icl9zdGF0ZSA9PSBYRlNfRVhUX1VOV1JJVFRFTikgeworCQkJCS8qCisJCQkJICogVGhpcyBvbmUgaXMgYWxyZWFkeSB1bndyaXR0ZW4uCisJCQkJICogSXQgbXVzdCBoYXZlIGEgd3JpdHRlbiBsZWZ0IG5laWdoYm9yLgorCQkJCSAqIFVud3JpdGUgdGhlIGtpbGxlZCBwYXJ0IG9mIHRoYXQgb25lIGFuZAorCQkJCSAqIHRyeSBhZ2Fpbi4KKwkJCQkgKi8KKwkJCQlBU1NFUlQobGFzdHggPiAwKTsKKwkJCQl4ZnNfYm1idF9nZXRfYWxsKGVwIC0gMSwgJnByZXYpOworCQkJCUFTU0VSVChwcmV2LmJyX3N0YXRlID09IFhGU19FWFRfTk9STSk7CisJCQkJQVNTRVJUKCFJU05VTExTVEFSVEJMT0NLKHByZXYuYnJfc3RhcnRibG9jaykpOworCQkJCUFTU0VSVChkZWwuYnJfc3RhcnRibG9jayA9PQorCQkJCSAgICAgICBwcmV2LmJyX3N0YXJ0YmxvY2sgKyBwcmV2LmJyX2Jsb2NrY291bnQpOworCQkJCWlmIChwcmV2LmJyX3N0YXJ0b2ZmIDwgc3RhcnQpIHsKKwkJCQkJbW9kID0gc3RhcnQgLSBwcmV2LmJyX3N0YXJ0b2ZmOworCQkJCQlwcmV2LmJyX2Jsb2NrY291bnQgLT0gbW9kOworCQkJCQlwcmV2LmJyX3N0YXJ0YmxvY2sgKz0gbW9kOworCQkJCQlwcmV2LmJyX3N0YXJ0b2ZmID0gc3RhcnQ7CisJCQkJfQorCQkJCXByZXYuYnJfc3RhdGUgPSBYRlNfRVhUX1VOV1JJVFRFTjsKKwkJCQllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnQoaXAsIGxhc3R4IC0gMSwgJmN1ciwKKwkJCQkJJnByZXYsIGZpcnN0YmxvY2ssIGZsaXN0LCAmbG9nZmxhZ3MsCisJCQkJCVhGU19EQVRBX0ZPUkssIDApOworCQkJCWlmIChlcnJvcikKKwkJCQkJZ290byBlcnJvcjA7CisJCQkJZ290byBub2RlbGV0ZTsKKwkJCX0gZWxzZSB7CisJCQkJQVNTRVJUKGRlbC5icl9zdGF0ZSA9PSBYRlNfRVhUX05PUk0pOworCQkJCWRlbC5icl9zdGF0ZSA9IFhGU19FWFRfVU5XUklUVEVOOworCQkJCWVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudChpcCwgbGFzdHgsICZjdXIsCisJCQkJCSZkZWwsIGZpcnN0YmxvY2ssIGZsaXN0LCAmbG9nZmxhZ3MsCisJCQkJCVhGU19EQVRBX0ZPUkssIDApOworCQkJCWlmIChlcnJvcikKKwkJCQkJZ290byBlcnJvcjA7CisJCQkJZ290byBub2RlbGV0ZTsKKwkJCX0KKwkJfQorCQlpZiAod2FzZGVsKSB7CisJCQlBU1NFUlQoU1RBUlRCTE9DS1ZBTChkZWwuYnJfc3RhcnRibG9jaykgPiAwKTsKKwkJCXhmc19tb2RfaW5jb3JlX3NiKG1wLCBYRlNfU0JTX0ZEQkxPQ0tTLAorCQkJCShpbnQpZGVsLmJyX2Jsb2NrY291bnQsIHJzdmQpOworCQkJLyogVW5yZXNlcnZlIG91ciBxdW90YSBzcGFjZSAqLworCQkJWEZTX1RSQU5TX1JFU0VSVkVfUVVPVEFfTkJMS1MoCisJCQkJbXAsIE5VTEwsIGlwLCAtKChsb25nKWRlbC5icl9ibG9ja2NvdW50KSwgMCwKKwkJCQlpc3J0ID8JWEZTX1FNT1BUX1JFU19SVEJMS1MgOgorCQkJCQlYRlNfUU1PUFRfUkVTX1JFR0JMS1MpOworCQkJaXAtPmlfZGVsYXllZF9ibGtzIC09IGRlbC5icl9ibG9ja2NvdW50OworCQkJaWYgKGN1cikKKwkJCQljdXItPmJjX3ByaXZhdGUuYi5mbGFncyB8PQorCQkJCQlYRlNfQlRDVVJfQlBSVl9XQVNERUw7CisJCX0gZWxzZSBpZiAoY3VyKQorCQkJY3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgJj0gflhGU19CVENVUl9CUFJWX1dBU0RFTDsKKwkJLyoKKwkJICogSWYgaXQncyB0aGUgY2FzZSB3aGVyZSB0aGUgZGlyZWN0b3J5IGNvZGUgaXMgcnVubmluZworCQkgKiB3aXRoIG5vIGJsb2NrIHJlc2VydmF0aW9uLCBhbmQgdGhlIGRlbGV0ZWQgYmxvY2sgaXMgaW4KKwkJICogdGhlIG1pZGRsZSBvZiBpdHMgZXh0ZW50LCBhbmQgdGhlIHJlc3VsdGluZyBpbnNlcnQKKwkJICogb2YgYW4gZXh0ZW50IHdvdWxkIGNhdXNlIHRyYW5zZm9ybWF0aW9uIHRvIGJ0cmVlIGZvcm1hdCwKKwkJICogdGhlbiByZWplY3QgaXQuICBUaGUgY2FsbGluZyBjb2RlIHdpbGwgdGhlbiBzd2FwCisJCSAqIGJsb2NrcyBhcm91bmQgaW5zdGVhZC4KKwkJICogV2UgaGF2ZSB0byBkbyB0aGlzIG5vdywgcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgdGhlCisJCSAqIGNvbnZlcnNpb24gdG8gYnRyZWUgZm9ybWF0LCBzaW5jZSB0aGUgdHJhbnNhY3Rpb24KKwkJICogd2lsbCBiZSBkaXJ0eS4KKwkJICovCisJCWlmICghd2FzZGVsICYmIHhmc190cmFuc19nZXRfYmxvY2tfcmVzKHRwKSA9PSAwICYmCisJCSAgICBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKKwkJICAgIFhGU19JRk9SS19ORVhURU5UUyhpcCwgd2hpY2hmb3JrKSA+PSBpZnAtPmlmX2V4dF9tYXggJiYKKwkJICAgIGRlbC5icl9zdGFydG9mZiA+IGdvdC5icl9zdGFydG9mZiAmJgorCQkgICAgZGVsLmJyX3N0YXJ0b2ZmICsgZGVsLmJyX2Jsb2NrY291bnQgPAorCQkgICAgZ290LmJyX3N0YXJ0b2ZmICsgZ290LmJyX2Jsb2NrY291bnQpIHsKKwkJCWVycm9yID0gWEZTX0VSUk9SKEVOT1NQQyk7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQllcnJvciA9IHhmc19ibWFwX2RlbF9leHRlbnQoaXAsIHRwLCBsYXN0eCwgZmxpc3QsIGN1ciwgJmRlbCwKKwkJCSZ0bXBfbG9nZmxhZ3MsIHdoaWNoZm9yaywgcnN2ZCk7CisJCWxvZ2ZsYWdzIHw9IHRtcF9sb2dmbGFnczsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcjA7CisJCWJubyA9IGRlbC5icl9zdGFydG9mZiAtIDE7Citub2RlbGV0ZToKKwkJbGFzdHggPSBpZnAtPmlmX2xhc3RleDsKKwkJLyoKKwkJICogSWYgbm90IGRvbmUgZ28gb24gdG8gdGhlIG5leHQgKHByZXZpb3VzKSByZWNvcmQuCisJCSAqIFJlc2V0IGVwIGluIGNhc2UgdGhlIGV4dGVudHMgYXJyYXkgd2FzIHJlLWFsbG9jZWQuCisJCSAqLworCQllcCA9ICZpZnAtPmlmX3UxLmlmX2V4dGVudHNbbGFzdHhdOworCQlpZiAoYm5vICE9ICh4ZnNfZmlsZW9mZl90KS0xICYmIGJubyA+PSBzdGFydCkgeworCQkJaWYgKGxhc3R4ID49IFhGU19JRk9SS19ORVhURU5UUyhpcCwgd2hpY2hmb3JrKSB8fAorCQkJICAgIHhmc19ibWJ0X2dldF9zdGFydG9mZihlcCkgPiBibm8pIHsKKwkJCQlsYXN0eC0tOworCQkJCWVwLS07CisJCQl9CisJCQlpZiAobGFzdHggPj0gMCkKKwkJCQl4ZnNfYm1idF9nZXRfYWxsKGVwLCAmZ290KTsKKwkJCWV4dG5vKys7CisJCX0KKwl9CisJaWZwLT5pZl9sYXN0ZXggPSBsYXN0eDsKKwkqZG9uZSA9IGJubyA9PSAoeGZzX2ZpbGVvZmZfdCktMSB8fCBibm8gPCBzdGFydCB8fCBsYXN0eCA8IDA7CisJQVNTRVJUKGlmcC0+aWZfZXh0X21heCA9PQorCSAgICAgICBYRlNfSUZPUktfU0laRShpcCwgd2hpY2hmb3JrKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkpOworCS8qCisJICogQ29udmVydCB0byBhIGJ0cmVlIGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwlpZiAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJICAgIFhGU19JRk9SS19ORVhURU5UUyhpcCwgd2hpY2hmb3JrKSA+IGlmcC0+aWZfZXh0X21heCkgeworCQlBU1NFUlQoY3VyID09IE5VTEwpOworCQllcnJvciA9IHhmc19ibWFwX2V4dGVudHNfdG9fYnRyZWUodHAsIGlwLCBmaXJzdGJsb2NrLCBmbGlzdCwKKwkJCSZjdXIsIDAsICZ0bXBfbG9nZmxhZ3MsIHdoaWNoZm9yayk7CisJCWxvZ2ZsYWdzIHw9IHRtcF9sb2dmbGFnczsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcjA7CisJfQorCS8qCisJICogdHJhbnNmb3JtIGZyb20gYnRyZWUgdG8gZXh0ZW50cywgZ2l2ZSBpdCBjdXIKKwkgKi8KKwllbHNlIGlmIChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspID09IFhGU19ESU5PREVfRk1UX0JUUkVFICYmCisJCSBYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgPD0gaWZwLT5pZl9leHRfbWF4KSB7CisJCUFTU0VSVChjdXIgIT0gTlVMTCk7CisJCWVycm9yID0geGZzX2JtYXBfYnRyZWVfdG9fZXh0ZW50cyh0cCwgaXAsIGN1ciwgJnRtcF9sb2dmbGFncywKKwkJCXdoaWNoZm9yayk7CisJCWxvZ2ZsYWdzIHw9IHRtcF9sb2dmbGFnczsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcjA7CisJfQorCS8qCisJICogdHJhbnNmb3JtIGZyb20gZXh0ZW50cyB0byBsb2NhbD8KKwkgKi8KKwlBU1NFUlQoaWZwLT5pZl9leHRfbWF4ID09CisJICAgICAgIFhGU19JRk9SS19TSVpFKGlwLCB3aGljaGZvcmspIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KSk7CisJZXJyb3IgPSAwOworZXJyb3IwOgorCS8qCisJICogTG9nIGV2ZXJ5dGhpbmcuICBEbyB0aGlzIGFmdGVyIGNvbnZlcnNpb24sIHRoZXJlJ3Mgbm8gcG9pbnQgaW4KKwkgKiBsb2dnaW5nIHRoZSBleHRlbnQgbGlzdCBpZiB3ZSd2ZSBjb252ZXJ0ZWQgdG8gYnRyZWUgZm9ybWF0LgorCSAqLworCWlmICgobG9nZmxhZ3MgJiBYRlNfSUxPR19GRVhUKHdoaWNoZm9yaykpICYmCisJICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUykKKwkJbG9nZmxhZ3MgJj0gflhGU19JTE9HX0ZFWFQod2hpY2hmb3JrKTsKKwllbHNlIGlmICgobG9nZmxhZ3MgJiBYRlNfSUxPR19GQlJPT1Qod2hpY2hmb3JrKSkgJiYKKwkJIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpCisJCWxvZ2ZsYWdzICY9IH5YRlNfSUxPR19GQlJPT1Qod2hpY2hmb3JrKTsKKwkvKgorCSAqIExvZyBpbm9kZSBldmVuIGluIHRoZSBlcnJvciBjYXNlLCBpZiB0aGUgdHJhbnNhY3Rpb24KKwkgKiBpcyBkaXJ0eSB3ZSdsbCBuZWVkIHRvIHNodXQgZG93biB0aGUgZmlsZXN5c3RlbS4KKwkgKi8KKwlpZiAobG9nZmxhZ3MpCisJCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBsb2dmbGFncyk7CisJaWYgKGN1cikgeworCQlpZiAoIWVycm9yKSB7CisJCQkqZmlyc3RibG9jayA9IGN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2s7CisJCQljdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQgPSAwOworCQl9CisJCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwKKwkJCWVycm9yID8gWEZTX0JUUkVFX0VSUk9SIDogWEZTX0JUUkVFX05PRVJST1IpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBGY250bCBpbnRlcmZhY2UgdG8geGZzX2JtYXBpLgorICovCitpbnQJCQkJCQkvKiBlcnJvciBjb2RlICovCit4ZnNfZ2V0Ym1hcCgKKwliaHZfZGVzY190CQkqYmRwLAkJLyogWEZTIGJlaGF2aW9yIGRlc2NyaXB0b3IqLworCXN0cnVjdCBnZXRibWFwCQkqYm12LAkJLyogdXNlciBibWFwIHN0cnVjdHVyZSAqLworCXZvaWQJCQlfX3VzZXIgKmFwLAkvKiBwb2ludGVyIHRvIHVzZXIncyBhcnJheSAqLworCWludAkJCWludGVyZmFjZSkJLyogaW50ZXJmYWNlIGZsYWdzICovCit7CisJX19pbnQ2NF90CQlibXZlbmQ7CQkvKiBsYXN0IGJsb2NrIHJlcXVlc3RlZCAqLworCWludAkJCWVycm9yOwkJLyogcmV0dXJuIHZhbHVlICovCisJX19pbnQ2NF90CQlmaXhsZW47CQkvKiBsZW5ndGggZm9yIC0xIGNhc2UgKi8KKwlpbnQJCQlpOwkJLyogZXh0ZW50IG51bWJlciAqLworCXhmc19pbm9kZV90CQkqaXA7CQkvKiB4ZnMgaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl2bm9kZV90CQkJKnZwOwkJLyogY29ycmVzcG9uZGluZyB2bm9kZSAqLworCWludAkJCWxvY2s7CQkvKiBsb2NrIHN0YXRlICovCisJeGZzX2JtYnRfaXJlY190CQkqbWFwOwkJLyogYnVmZmVyIGZvciB1c2VyJ3MgZGF0YSAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCWludAkJCW5leDsJCS8qICMgb2YgdXNlciBleHRlbnRzIGNhbiBkbyAqLworCWludAkJCW5leGxlZnQ7CS8qICMgb2YgdXNlciBleHRlbnRzIGxlZnQgKi8KKwlpbnQJCQlzdWJuZXg7CQkvKiAjIG9mIGJtYXBpJ3MgY2FuIGRvICovCisJaW50CQkJbm1hcDsJCS8qIG51bWJlciBvZiBtYXAgZW50cmllcyAqLworCXN0cnVjdCBnZXRibWFwCQlvdXQ7CQkvKiBvdXRwdXQgc3RydWN0dXJlICovCisJaW50CQkJd2hpY2hmb3JrOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCWludAkJCXByZWFsbG9jZWQ7CS8qIHRoaXMgaXMgYSBmaWxlIHdpdGgKKwkJCQkJCSAqIHByZWFsbG9jYXRlZCBkYXRhIHNwYWNlICovCisJaW50CQkJc2hfdW53cml0dGVuOwkvKiB0cnVlLCBpZiB1bndyaXR0ZW4gKi8KKwkJCQkJCS8qIGV4dGVudHMgbGlzdGVkIHNlcGFyYXRlbHkgKi8KKwlpbnQJCQlibWFwaV9mbGFnczsJLyogZmxhZ3MgZm9yIHhmc19ibWFwaSAqLworCV9faW50MzJfdAkJb2ZsYWdzOwkJLyogZ2V0Ym1hcHggYm12X29mbGFncyBmaWVsZCAqLworCisJdnAgPSBCSFZfVE9fVk5PREUoYmRwKTsKKwlpcCA9IFhGU19CSFZUT0koYmRwKTsKKwltcCA9IGlwLT5pX21vdW50OworCisJd2hpY2hmb3JrID0gaW50ZXJmYWNlICYgQk1WX0lGX0FUVFJGT1JLID8gWEZTX0FUVFJfRk9SSyA6IFhGU19EQVRBX0ZPUks7CisJc2hfdW53cml0dGVuID0gKGludGVyZmFjZSAmIEJNVl9JRl9QUkVBTExPQykgIT0gMDsKKworCS8qCUlmIHRoZSBCTVZfSUZfTk9fRE1BUElfUkVBRCBpbnRlcmZhY2UgYml0IHNwZWNpZmllZCwgZG8gbm90CisJICoJZ2VuZXJhdGUgYSBETUFQSSByZWFkIGV2ZW50LiAgT3RoZXJ3aXNlLCBpZiB0aGUgRE1fRVZFTlRfUkVBRAorCSAqCWJpdCBpcyBzZXQgZm9yIHRoZSBmaWxlLCBnZW5lcmF0ZSBhIHJlYWQgZXZlbnQgaW4gb3JkZXIKKwkgKgl0aGF0IHRoZSBETUFQSSBhcHBsaWNhdGlvbiBtYXkgZG8gaXRzIHRoaW5nIGJlZm9yZSB3ZSByZXR1cm4KKwkgKgl0aGUgZXh0ZW50cy4gIFVzdWFsbHkgdGhpcyBtZWFucyByZXN0b3JpbmcgdXNlciBmaWxlIGRhdGEgdG8KKwkgKglyZWdpb25zIG9mIHRoZSBmaWxlIHRoYXQgbG9vayBsaWtlIGhvbGVzLgorCSAqCisJICoJVGhlICJvbGQgYmVoYXZpb3IiIChmcm9tIFhGU19JT0NfR0VUQk1BUCkgaXMgdG8gbm90IHNwZWNpZnkKKwkgKglCTVZfSUZfTk9fRE1BUElfUkVBRCBzbyB0aGF0IHJlYWQgZXZlbnRzIGFyZSBnZW5lcmF0ZWQuCisJICoJSWYgdGhpcyB3ZXJlIG5vdCB0cnVlLCBjYWxsZXJzIG9mIGlvY3RsKCBYRlNfSU9DX0dFVEJNQVAgKQorCSAqCWNvdWxkIG1pc2ludGVycHJldCBob2xlcyBpbiBhIERNQVBJIGZpbGUgYXMgdHJ1ZSBob2xlcywKKwkgKgl3aGVuIGluIGZhY3QgdGhleSBtYXkgcmVwcmVzZW50IG9mZmxpbmUgdXNlciBkYXRhLgorCSAqLworCWlmICggICAoaW50ZXJmYWNlICYgQk1WX0lGX05PX0RNQVBJX1JFQUQpID09IDAKKwkgICAgJiYgRE1fRVZFTlRfRU5BQkxFRCh2cC0+dl92ZnNwLCBpcCwgRE1fRVZFTlRfUkVBRCkKKwkgICAgJiYgd2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUkspIHsKKworCQllcnJvciA9IFhGU19TRU5EX0RBVEEobXAsIERNX0VWRU5UX1JFQUQsIHZwLCAwLCAwLCAwLCBOVUxMKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7CisJfQorCisJaWYgKHdoaWNoZm9yayA9PSBYRlNfQVRUUl9GT1JLKSB7CisJCWlmIChYRlNfSUZPUktfUShpcCkpIHsKKwkJCWlmIChpcC0+aV9kLmRpX2Fmb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCQkJICAgIGlwLT5pX2QuZGlfYWZvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSAmJgorCQkJICAgIGlwLT5pX2QuZGlfYWZvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkKKwkJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJCX0gZWxzZSBpZiAodW5saWtlbHkoCisJCQkgICBpcC0+aV9kLmRpX2Fmb3JtYXQgIT0gMCAmJgorCQkJICAgaXAtPmlfZC5kaV9hZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0VYVEVOVFMpKSB7CisJCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfZ2V0Ym1hcCIsIFhGU19FUlJMRVZFTF9MT1csCisJCQkJCSBpcC0+aV9tb3VudCk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCX0KKwl9IGVsc2UgaWYgKGlwLT5pX2QuZGlfZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKKwkJICAgaXAtPmlfZC5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUgJiYKKwkJICAgaXAtPmlfZC5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpCisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwlpZiAod2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUkspIHsKKwkJaWYgKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1BSRUFMTE9DKSB7CisJCQlwcmVhbGxvY2VkID0gMTsKKwkJCWZpeGxlbiA9IFhGU19NQVhJT0ZGU0VUKG1wKTsKKwkJfSBlbHNlIHsKKwkJCXByZWFsbG9jZWQgPSAwOworCQkJZml4bGVuID0gaXAtPmlfZC5kaV9zaXplOworCQl9CisJfSBlbHNlIHsKKwkJcHJlYWxsb2NlZCA9IDA7CisJCWZpeGxlbiA9IDFMTCA8PCAzMjsKKwl9CisKKwlpZiAoYm12LT5ibXZfbGVuZ3RoID09IC0xKSB7CisJCWZpeGxlbiA9IFhGU19GU0JfVE9fQkIobXAsIFhGU19CX1RPX0ZTQihtcCwgZml4bGVuKSk7CisJCWJtdi0+Ym12X2xlbmd0aCA9IE1BWCggKF9faW50NjRfdCkoZml4bGVuIC0gYm12LT5ibXZfb2Zmc2V0KSwKKwkJCQkJKF9faW50NjRfdCkwKTsKKwl9IGVsc2UgaWYgKGJtdi0+Ym12X2xlbmd0aCA8IDApCisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwlpZiAoYm12LT5ibXZfbGVuZ3RoID09IDApIHsKKwkJYm12LT5ibXZfZW50cmllcyA9IDA7CisJCXJldHVybiAwOworCX0KKwluZXggPSBibXYtPmJtdl9jb3VudCAtIDE7CisJaWYgKG5leCA8PSAwKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJYm12ZW5kID0gYm12LT5ibXZfb2Zmc2V0ICsgYm12LT5ibXZfbGVuZ3RoOworCisJeGZzX2lsb2NrKGlwLCBYRlNfSU9MT0NLX1NIQVJFRCk7CisKKwlpZiAod2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUksgJiYgaXAtPmlfZGVsYXllZF9ibGtzKSB7CisJCS8qIHhmc19mc2l6ZV90IGxhc3RfYnl0ZSA9IHhmc19maWxlX2xhc3RfYnl0ZShpcCk7ICovCisJCVZPUF9GTFVTSF9QQUdFUyh2cCwgKHhmc19vZmZfdCkwLCAtMSwgMCwgRklfUkVNQVBGLCBlcnJvcik7CisJfQorCisJQVNTRVJUKHdoaWNoZm9yayA9PSBYRlNfQVRUUl9GT1JLIHx8IGlwLT5pX2RlbGF5ZWRfYmxrcyA9PSAwKTsKKworCWxvY2sgPSB4ZnNfaWxvY2tfbWFwX3NoYXJlZChpcCk7CisKKwkvKgorCSAqIERvbid0IGxldCBuZXggYmUgYmlnZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBleHRlbnRzCisJICogd2UgY2FuIGhhdmUgYXNzdW1pbmcgYWx0ZXJuYXRpbmcgaG9sZXMgYW5kIHJlYWwgZXh0ZW50cy4KKwkgKi8KKwlpZiAobmV4ID4gWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspICogMiArIDEpCisJCW5leCA9IFhGU19JRk9SS19ORVhURU5UUyhpcCwgd2hpY2hmb3JrKSAqIDIgKyAxOworCisJYm1hcGlfZmxhZ3MgPSBYRlNfQk1BUElfQUZMQUcod2hpY2hmb3JrKSB8CisJCQkoKHNoX3Vud3JpdHRlbikgPyAwIDogWEZTX0JNQVBJX0lHU1RBVEUpOworCisJLyoKKwkgKiBBbGxvY2F0ZSBlbm91Z2ggc3BhY2UgdG8gaGFuZGxlICJzdWJuZXgiIG1hcHMgYXQgYSB0aW1lLgorCSAqLworCXN1Ym5leCA9IDE2OworCW1hcCA9IGttZW1fYWxsb2Moc3VibmV4ICogc2l6ZW9mKCptYXApLCBLTV9TTEVFUCk7CisKKwlibXYtPmJtdl9lbnRyaWVzID0gMDsKKworCWlmIChYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgPT0gMCkgeworCQllcnJvciA9IDA7CisJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CisJfQorCisJbmV4bGVmdCA9IG5leDsKKworCWRvIHsKKwkJbm1hcCA9IChuZXhsZWZ0ID4gc3VibmV4KSA/IHN1Ym5leCA6IG5leGxlZnQ7CisJCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIGlwLCBYRlNfQkJfVE9fRlNCVChtcCwgYm12LT5ibXZfb2Zmc2V0KSwKKwkJCQkgIFhGU19CQl9UT19GU0IobXAsIGJtdi0+Ym12X2xlbmd0aCksCisJCQkJICBibWFwaV9mbGFncywgTlVMTCwgMCwgbWFwLCAmbm1hcCwgTlVMTCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CisJCUFTU0VSVChubWFwIDw9IHN1Ym5leCk7CisKKwkJZm9yIChpID0gMDsgaSA8IG5tYXAgJiYgbmV4bGVmdCAmJiBibXYtPmJtdl9sZW5ndGg7IGkrKykgeworCQkJbmV4bGVmdC0tOworCQkJb2ZsYWdzID0gKG1hcFtpXS5icl9zdGF0ZSA9PSBYRlNfRVhUX1VOV1JJVFRFTikgPworCQkJCQlCTVZfT0ZfUFJFQUxMT0MgOiAwOworCQkJb3V0LmJtdl9vZmZzZXQgPSBYRlNfRlNCX1RPX0JCKG1wLCBtYXBbaV0uYnJfc3RhcnRvZmYpOworCQkJb3V0LmJtdl9sZW5ndGggPSBYRlNfRlNCX1RPX0JCKG1wLCBtYXBbaV0uYnJfYmxvY2tjb3VudCk7CisJCQlBU1NFUlQobWFwW2ldLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKTsKKwkJCWlmIChwcmVhbGxvY2VkICYmCisJCQkgICAgbWFwW2ldLmJyX3N0YXJ0YmxvY2sgPT0gSE9MRVNUQVJUQkxPQ0sgJiYKKwkJCSAgICBvdXQuYm12X29mZnNldCArIG91dC5ibXZfbGVuZ3RoID09IGJtdmVuZCkgeworCQkJCS8qCisJCQkJICogY2FtZSB0byBob2xlIGF0IGVuZCBvZiBmaWxlCisJCQkJICovCisJCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKKwkJCX0gZWxzZSB7CisJCQkJb3V0LmJtdl9ibG9jayA9CisJCQkJICAgIChtYXBbaV0uYnJfc3RhcnRibG9jayA9PSBIT0xFU1RBUlRCTE9DSykgPworCQkJCQktMSA6CisJCQkJCVhGU19GU0JfVE9fREIoaXAsIG1hcFtpXS5icl9zdGFydGJsb2NrKTsKKworCQkJCS8qIHJldHVybiBlaXRoZXIgZ2V0Ym1hcC9nZXRibWFweCBzdHJ1Y3R1cmUuICovCisJCQkJaWYgKGludGVyZmFjZSAmIEJNVl9JRl9FWFRFTkRFRCkgeworCQkJCQlzdHJ1Y3QJZ2V0Ym1hcHgJb3V0eDsKKworCQkJCQlHRVRCTUFQX0NPTlZFUlQob3V0LG91dHgpOworCQkJCQlvdXR4LmJtdl9vZmxhZ3MgPSBvZmxhZ3M7CisJCQkJCW91dHguYm12X3VudXNlZDEgPSBvdXR4LmJtdl91bnVzZWQyID0gMDsKKwkJCQkJaWYgKGNvcHlfdG9fdXNlcihhcCwgJm91dHgsCisJCQkJCQkJc2l6ZW9mKG91dHgpKSkgeworCQkJCQkJZXJyb3IgPSBYRlNfRVJST1IoRUZBVUxUKTsKKwkJCQkJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoY29weV90b191c2VyKGFwLCAmb3V0LAorCQkJCQkJCXNpemVvZihvdXQpKSkgeworCQkJCQkJZXJyb3IgPSBYRlNfRVJST1IoRUZBVUxUKTsKKwkJCQkJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CisJCQkJCX0KKwkJCQl9CisJCQkJYm12LT5ibXZfb2Zmc2V0ID0KKwkJCQkJb3V0LmJtdl9vZmZzZXQgKyBvdXQuYm12X2xlbmd0aDsKKwkJCQlibXYtPmJtdl9sZW5ndGggPSBNQVgoKF9faW50NjRfdCkwLAorCQkJCQkoX19pbnQ2NF90KShibXZlbmQgLSBibXYtPmJtdl9vZmZzZXQpKTsKKwkJCQlibXYtPmJtdl9lbnRyaWVzKys7CisJCQkJYXAgPSAoaW50ZXJmYWNlICYgQk1WX0lGX0VYVEVOREVEKSA/CisJCQkJCQkodm9pZCBfX3VzZXIgKikKKwkJCQkJKChzdHJ1Y3QgZ2V0Ym1hcHggX191c2VyICopYXAgKyAxKSA6CisJCQkJCQkodm9pZCBfX3VzZXIgKikKKwkJCQkJKChzdHJ1Y3QgZ2V0Ym1hcCBfX3VzZXIgKilhcCArIDEpOworCQkJfQorCQl9CisJfSB3aGlsZSAobm1hcCAmJiBuZXhsZWZ0ICYmIGJtdi0+Ym12X2xlbmd0aCk7CisKK3VubG9ja19hbmRfcmV0dXJuOgorCXhmc19pdW5sb2NrX21hcF9zaGFyZWQoaXAsIGxvY2spOworCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX1NIQVJFRCk7CisKKwlrbWVtX2ZyZWUobWFwLCBzdWJuZXggKiBzaXplb2YoKm1hcCkpOworCisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogQ2hlY2sgdGhlIGxhc3QgaW5vZGUgZXh0ZW50IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgYWxsb2NhdGlvbiB3aWxsIHJlc3VsdAorICogaW4gYmxvY2tzIGJlaW5nIGFsbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBXaGVuIHdlIGFsbG9jYXRlIG5ldyBkYXRhCisgKiBibG9ja3MgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB3aGljaCBkbyBub3Qgc3RhcnQgYXQgdGhlIHByZXZpb3VzIGRhdGEgYmxvY2ssCisgKiB3ZSB3aWxsIHRyeSB0byBhbGlnbiB0aGUgbmV3IGJsb2NrcyBhdCBzdHJpcGUgdW5pdCBib3VuZGFyaWVzLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9pc2Flb2YoCisJeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZmlsZW9mZl90ICAgb2ZmLAkJLyogZmlsZSBvZmZzZXQgaW4gZnNibG9ja3MgKi8KKwlpbnQgICAgICAgICAgICAgd2hpY2hmb3JrLAkvKiBkYXRhIG9yIGF0dHJpYnV0ZSBmb3JrICovCisJY2hhcgkJKmFlb2YpCQkvKiByZXR1cm4gdmFsdWUgKi8KK3sKKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX2lmb3JrX3QJKmlmcDsJCS8qIGlub2RlIGZvcmsgcG9pbnRlciAqLworCXhmc19ibWJ0X3JlY190CSpsYXN0cmVjOwkvKiBleHRlbnQgbGlzdCBlbnRyeSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CW5leHRlbnRzOwkvKiBzaXplIG9mIGV4dGVudCBsaXN0ICovCisJeGZzX2JtYnRfaXJlY190CXM7CQkvKiBleHBhbmRlZCBleHRlbnQgbGlzdCBlbnRyeSAqLworCisJQVNTRVJUKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKTsKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCWlmICghKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSAmJgorCSAgICAoZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyhOVUxMLCBpcCwgd2hpY2hmb3JrKSkpCisJCXJldHVybiBlcnJvcjsKKwluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCWlmIChuZXh0ZW50cyA9PSAwKSB7CisJCSphZW9mID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogR28gdG8gdGhlIGxhc3QgZXh0ZW50CisJICovCisJbGFzdHJlYyA9ICZpZnAtPmlmX3UxLmlmX2V4dGVudHNbbmV4dGVudHMgLSAxXTsKKwl4ZnNfYm1idF9nZXRfYWxsKGxhc3RyZWMsICZzKTsKKwkvKgorCSAqIENoZWNrIHdlIGFyZSBhbGxvY2F0aW5nIGluIHRoZSBsYXN0IGV4dGVudCAoZm9yIGRlbGF5ZWQgYWxsb2NhdGlvbnMpCisJICogb3IgcGFzdCB0aGUgbGFzdCBleHRlbnQgZm9yIG5vbi1kZWxheWVkIGFsbG9jYXRpb25zLgorCSAqLworCSphZW9mID0gKG9mZiA+PSBzLmJyX3N0YXJ0b2ZmICYmCisJCSBvZmYgPCBzLmJyX3N0YXJ0b2ZmICsgcy5icl9ibG9ja2NvdW50ICYmCisJCSBJU05VTExTVEFSVEJMT0NLKHMuYnJfc3RhcnRibG9jaykpIHx8CisJCW9mZiA+PSBzLmJyX3N0YXJ0b2ZmICsgcy5icl9ibG9ja2NvdW50OworCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2sgaWYgdGhlIGVuZG9mZiBpcyBvdXRzaWRlIHRoZSBsYXN0IGV4dGVudC4gSWYgc28gdGhlIGNhbGxlciB3aWxsIGdyb3cKKyAqIHRoZSBhbGxvY2F0aW9uIHRvIGEgc3RyaXBlIHVuaXQgYm91bmRhcnkuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2VvZigKKwl4ZnNfaW5vZGVfdAkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19maWxlb2ZmX3QJZW5kb2ZmLAkJLyogZmlsZSBvZmZzZXQgaW4gZnNibG9ja3MgKi8KKwlpbnQJCXdoaWNoZm9yaywJLyogZGF0YSBvciBhdHRyaWJ1dGUgZm9yayAqLworCWludAkJKmVvZikJCS8qIHJlc3VsdCB2YWx1ZSAqLworeworCXhmc19mc2Jsb2NrX3QJYmxvY2tjb3VudDsJLyogZXh0ZW50IGJsb2NrIGNvdW50ICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19pZm9ya190CSppZnA7CQkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KKwl4ZnNfYm1idF9yZWNfdAkqbGFzdHJlYzsJLyogZXh0ZW50IGxpc3QgZW50cnkgcG9pbnRlciAqLworCXhmc19leHRudW1fdAluZXh0ZW50czsJLyogc2l6ZSBvZiBleHRlbnQgbGlzdCAqLworCXhmc19maWxlb2ZmX3QJc3RhcnRvZmY7CS8qIGV4dGVudCBzdGFydGluZyBmaWxlIG9mZnNldCAqLworCisJQVNTRVJUKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKTsKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCWlmICghKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSAmJgorCSAgICAoZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyhOVUxMLCBpcCwgd2hpY2hmb3JrKSkpCisJCXJldHVybiBlcnJvcjsKKwluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCWlmIChuZXh0ZW50cyA9PSAwKSB7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBHbyB0byB0aGUgbGFzdCBleHRlbnQKKwkgKi8KKwlsYXN0cmVjID0gJmlmcC0+aWZfdTEuaWZfZXh0ZW50c1tuZXh0ZW50cyAtIDFdOworCXN0YXJ0b2ZmID0geGZzX2JtYnRfZ2V0X3N0YXJ0b2ZmKGxhc3RyZWMpOworCWJsb2NrY291bnQgPSB4ZnNfYm1idF9nZXRfYmxvY2tjb3VudChsYXN0cmVjKTsKKwkqZW9mID0gZW5kb2ZmID49IHN0YXJ0b2ZmICsgYmxvY2tjb3VudDsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIERFQlVHCisvKgorICogQ2hlY2sgdGhhdCB0aGUgZXh0ZW50cyBsaXN0IGZvciB0aGUgaW5vZGUgaXAgaXMgaW4gdGhlIHJpZ2h0IG9yZGVyLgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYXBfY2hlY2tfZXh0ZW50cygKKwl4ZnNfaW5vZGVfdAkJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwlpbnQJCQl3aGljaGZvcmspCS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCit7CisJeGZzX2JtYnRfcmVjX3QJCSpiYXNlOwkJLyogYmFzZSBvZiBleHRlbnRzIGxpc3QgKi8KKwl4ZnNfYm1idF9yZWNfdAkJKmVwOwkJLyogY3VycmVudCBleHRlbnQgZW50cnkgKi8KKwl4ZnNfaWZvcmtfdAkJKmlmcDsJCS8qIGlub2RlIGZvcmsgcG9pbnRlciAqLworCXhmc19leHRudW1fdAkJbmV4dGVudHM7CS8qIG51bWJlciBvZiBleHRlbnRzIGluIGxpc3QgKi8KKworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJQVNTRVJUKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKTsKKwliYXNlID0gaWZwLT5pZl91MS5pZl9leHRlbnRzOworCW5leHRlbnRzID0gaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJZm9yIChlcCA9IGJhc2U7IGVwIDwgJmJhc2VbbmV4dGVudHMgLSAxXTsgZXArKykgeworCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKFhGU19CVE5VTV9CTUFQLCAodm9pZCAqKWVwLAorCQkJKHZvaWQgKikoZXAgKyAxKSk7CisJfQorfQorCitTVEFUSUMKK3hmc19idWZfdCAqCit4ZnNfYm1hcF9nZXRfYnAoCisJeGZzX2J0cmVlX2N1cl90ICAgICAgICAgKmN1ciwKKwl4ZnNfZnNibG9ja190CQlibm8pCit7CisJaW50IGk7CisJeGZzX2J1Zl90ICpicDsKKworCWlmICghY3VyKQorCQlyZXR1cm4oTlVMTCk7CisKKwlicCA9IE5VTEw7CisJZm9yKGkgPSAwOyBpIDwgWEZTX0JUUkVFX01BWExFVkVMUzsgaSsrKSB7CisJCWJwID0gY3VyLT5iY19idWZzW2ldOworCQlpZiAoIWJwKSBicmVhazsKKwkJaWYgKFhGU19CVUZfQUREUihicCkgPT0gYm5vKQorCQkJYnJlYWs7CS8qIEZvdW5kIGl0ICovCisJfQorCWlmIChpID09IFhGU19CVFJFRV9NQVhMRVZFTFMpCisJCWJwID0gTlVMTDsKKworCWlmICghYnApIHsgLyogQ2hhc2UgZG93biBhbGwgdGhlIGxvZyBpdGVtcyB0byBzZWUgaWYgdGhlIGJwIGlzIHRoZXJlICovCisJCXhmc19sb2dfaXRlbV9jaHVua190ICAgICpsaWNwOworCQl4ZnNfdHJhbnNfdAkJKnRwOworCisJCXRwID0gY3VyLT5iY190cDsKKwkJbGljcCA9ICZ0cC0+dF9pdGVtczsKKwkJd2hpbGUgKCFicCAmJiBsaWNwICE9IE5VTEwpIHsKKwkJCWlmIChYRlNfTElDX0FSRV9BTExfRlJFRShsaWNwKSkgeworCQkJCWxpY3AgPSBsaWNwLT5saWNfbmV4dDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCBsaWNwLT5saWNfdW51c2VkOyBpKyspIHsKKwkJCQl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOworCQkJCXhmc19sb2dfaXRlbV90CQkqbGlwOworCQkJCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwOworCQkJCXhmc19idWZfdAkJKmxicDsKKworCQkJCWlmIChYRlNfTElDX0lTRlJFRShsaWNwLCBpKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlsaWRwID0gWEZTX0xJQ19TTE9UKGxpY3AsIGkpOworCQkJCWxpcCA9IGxpZHAtPmxpZF9pdGVtOworCQkJCWlmIChsaXAtPmxpX3R5cGUgIT0gWEZTX0xJX0JVRikKKwkJCQkJY29udGludWU7CisKKwkJCQliaXAgPSAoeGZzX2J1Zl9sb2dfaXRlbV90ICopbGlwOworCQkJCWxicCA9IGJpcC0+YmxpX2J1ZjsKKworCQkJCWlmIChYRlNfQlVGX0FERFIobGJwKSA9PSBibm8pIHsKKwkJCQkJYnAgPSBsYnA7CisJCQkJCWJyZWFrOyAvKiBGb3VuZCBpdCAqLworCQkJCX0KKwkJCX0KKwkJCWxpY3AgPSBsaWNwLT5saWNfbmV4dDsKKwkJfQorCX0KKwlyZXR1cm4oYnApOworfQorCit2b2lkCit4ZnNfY2hlY2tfYmxvY2soCisJeGZzX2JtYnRfYmxvY2tfdCAgICAgICAgKmJsb2NrLAorCXhmc19tb3VudF90CQkqbXAsCisJaW50CQkJcm9vdCwKKwlzaG9ydAkJCXN6KQoreworCWludAkJCWksIGosIGRteHI7CisJeGZzX2JtYnRfcHRyX3QJCSpwcCwgKnRoaXNwYTsJLyogcG9pbnRlciB0byBibG9jayBhZGRyZXNzICovCisJeGZzX2JtYnRfa2V5X3QJCSpwcmV2cCwgKmtleXA7CisKKwlBU1NFUlQoSU5UX0dFVChibG9jay0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCkgPiAwKTsKKworCXByZXZwID0gTlVMTDsKKwlmb3IoIGkgPSAxOyBpIDw9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7aSsrKSB7CisJCWRteHIgPSBtcC0+bV9ibWFwX2RteHJbMF07CisKKwkJaWYgKHJvb3QpIHsKKwkJCWtleXAgPSBYRlNfQk1BUF9CUk9PVF9LRVlfQUREUihibG9jaywgaSwgc3opOworCQl9IGVsc2UgeworCQkJa2V5cCA9IFhGU19CVFJFRV9LRVlfQUREUihtcC0+bV9zYi5zYl9ibG9ja3NpemUsCisJCQkJeGZzX2JtYnQsIGJsb2NrLCBpLCBkbXhyKTsKKwkJfQorCisJCWlmIChwcmV2cCkgeworCQkJeGZzX2J0cmVlX2NoZWNrX2tleShYRlNfQlROVU1fQk1BUCwgcHJldnAsIGtleXApOworCQl9CisJCXByZXZwID0ga2V5cDsKKworCQkvKgorCQkgKiBDb21wYXJlIHRoZSBibG9jayBudW1iZXJzIHRvIHNlZSBpZiB0aGVyZSBhcmUgZHVwcy4KKwkJICovCisKKwkJaWYgKHJvb3QpIHsKKwkJCXBwID0gWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIoYmxvY2ssIGksIHN6KTsKKwkJfSBlbHNlIHsKKwkJCXBwID0gWEZTX0JUUkVFX1BUUl9BRERSKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwKKwkJCQl4ZnNfYm1idCwgYmxvY2ssIGksIGRteHIpOworCQl9CisJCWZvciAoaiA9IGkrMTsgaiA8PSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOyBqKyspIHsKKwkJCWlmIChyb290KSB7CisJCQkJdGhpc3BhID0gWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIoYmxvY2ssIGosIHN6KTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpc3BhID0gWEZTX0JUUkVFX1BUUl9BRERSKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwKKwkJCQkJeGZzX2JtYnQsIGJsb2NrLCBqLCBkbXhyKTsKKwkJCX0KKwkJCWlmIChJTlRfR0VUKCp0aGlzcGEsIEFSQ0hfQ09OVkVSVCkgPT0KKwkJCSAgICBJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKSkgeworCQkJCWNtbl9lcnIoQ0VfV0FSTiwgIiVzOiB0aGlzcGEoJWQpID09IHBwKCVkKSAlTGQiLAorCQkJCQlfX0ZVTkNUSU9OX18sIGosIGksCisJCQkJCUlOVF9HRVQoKnRoaXNwYSwgQVJDSF9DT05WRVJUKSk7CisJCQkJcGFuaWMoIiVzOiBwdHJzIGFyZSBlcXVhbCBpbiBub2RlXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18pOworCQkJfQorCQl9CisJfQorfQorCisvKgorICogQ2hlY2sgdGhhdCB0aGUgZXh0ZW50cyBmb3IgdGhlIGlub2RlIGlwIGFyZSBpbiB0aGUgcmlnaHQgb3JkZXIgaW4gYWxsCisgKiBidHJlZSBsZWF2ZXMuCisgKi8KKworU1RBVElDIHZvaWQKK3hmc19ibWFwX2NoZWNrX2xlYWZfZXh0ZW50cygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciBvciBudWxsICovCisJeGZzX2lub2RlX3QJCSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJaW50CQkJd2hpY2hmb3JrKQkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworeworCXhmc19ibWJ0X2Jsb2NrX3QJKmJsb2NrOwkvKiBjdXJyZW50IGJ0cmVlIGJsb2NrICovCisJeGZzX2ZzYmxvY2tfdAkJYm5vOwkvKiBibG9jayAjIG9mICJibG9jayIgKi8KKwl4ZnNfYnVmX3QJCSpicDsJLyogYnVmZmVyIGZvciAiYmxvY2siICovCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19leHRudW1fdAkJaT0wOwkvKiBpbmRleCBpbnRvIHRoZSBleHRlbnRzIGxpc3QgKi8KKwl4ZnNfaWZvcmtfdAkJKmlmcDsJLyogZm9yayBzdHJ1Y3R1cmUgKi8KKwlpbnQJCQlsZXZlbDsJLyogYnRyZWUgbGV2ZWwsIGZvciBjaGVja2luZyAqLworCXhmc19tb3VudF90CQkqbXA7CS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCXhmc19ibWJ0X3B0cl90CQkqcHA7CS8qIHBvaW50ZXIgdG8gYmxvY2sgYWRkcmVzcyAqLworCXhmc19ibWJ0X3JlY190CQkqZXAsICpsYXN0cDsJLyogZXh0ZW50IHBvaW50ZXJzIGluIGJsb2NrIGVudHJ5ICovCisJaW50CQkJYnBfcmVsZWFzZSA9IDA7CisKKwlpZiAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSkgeworCQlyZXR1cm47CisJfQorCisJYm5vID0gTlVMTEZTQkxPQ0s7CisJbXAgPSBpcC0+aV9tb3VudDsKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCWJsb2NrID0gaWZwLT5pZl9icm9vdDsKKwkvKgorCSAqIFJvb3QgbGV2ZWwgbXVzdCB1c2UgQk1BUF9CUk9PVF9QVFJfQUREUiBtYWNybyB0byBnZXQgcHRyIG91dC4KKwkgKi8KKwlBU1NFUlQoSU5UX0dFVChibG9jay0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCkgPiAwKTsKKwlsZXZlbCA9IElOVF9HRVQoYmxvY2stPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpOworCXhmc19jaGVja19ibG9jayhibG9jaywgbXAsIDEsIGlmcC0+aWZfYnJvb3RfYnl0ZXMpOworCXBwID0gWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIoYmxvY2ssIDEsIGlmcC0+aWZfYnJvb3RfYnl0ZXMpOworCUFTU0VSVChJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKSAhPSBOVUxMREZTQk5PKTsKKwlBU1NFUlQoWEZTX0ZTQl9UT19BR05PKG1wLCBJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKSkgPCBtcC0+bV9zYi5zYl9hZ2NvdW50KTsKKwlBU1NFUlQoWEZTX0ZTQl9UT19BR0JOTyhtcCwgSU5UX0dFVCgqcHAsIEFSQ0hfQ09OVkVSVCkpIDwgbXAtPm1fc2Iuc2JfYWdibG9ja3MpOworCWJubyA9IElOVF9HRVQoKnBwLCBBUkNIX0NPTlZFUlQpOworCS8qCisJICogR28gZG93biB0aGUgdHJlZSB1bnRpbCBsZWFmIGxldmVsIGlzIHJlYWNoZWQsIGZvbGxvd2luZyB0aGUgZmlyc3QKKwkgKiBwb2ludGVyIChsZWZ0bW9zdCkgYXQgZWFjaCBsZXZlbC4KKwkgKi8KKwl3aGlsZSAobGV2ZWwtLSA+IDApIHsKKwkJLyogU2VlIGlmIGJ1ZiBpcyBpbiBjdXIgZmlyc3QgKi8KKwkJYnAgPSB4ZnNfYm1hcF9nZXRfYnAoY3VyLCBYRlNfRlNCX1RPX0RBRERSKG1wLCBibm8pKTsKKwkJaWYgKGJwKSB7CisJCQlicF9yZWxlYXNlID0gMDsKKwkJfSBlbHNlIHsKKwkJCWJwX3JlbGVhc2UgPSAxOworCQl9CisJCWlmICghYnAgJiYgKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChtcCwgTlVMTCwgYm5vLCAwLCAmYnAsCisJCQkJWEZTX0JNQVBfQlRSRUVfUkVGKSkpCisJCQlnb3RvIGVycm9yX25vcmVsc2U7CisJCWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oCisJCQlYRlNfQk1BUF9TQU5JVFlfQ0hFQ0sobXAsIGJsb2NrLCBsZXZlbCksCisJCQllcnJvcjApOworCQlpZiAobGV2ZWwgPT0gMCkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIENoZWNrIHRoaXMgYmxvY2sgZm9yIGJhc2ljIHNhbml0eSAoaW5jcmVhc2luZyBrZXlzIGFuZAorCQkgKiBubyBkdXBsaWNhdGUgYmxvY2tzKS4KKwkJICovCisKKwkJeGZzX2NoZWNrX2Jsb2NrKGJsb2NrLCBtcCwgMCwgMCk7CisJCXBwID0gWEZTX0JUUkVFX1BUUl9BRERSKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwgeGZzX2JtYnQsIGJsb2NrLAorCQkJMSwgbXAtPm1fYm1hcF9kbXhyWzFdKTsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oWEZTX0ZTQl9TQU5JVFlfQ0hFQ0sobXAsIElOVF9HRVQoKnBwLCBBUkNIX0NPTlZFUlQpKSwgZXJyb3IwKTsKKwkJYm5vID0gSU5UX0dFVCgqcHAsIEFSQ0hfQ09OVkVSVCk7CisJCWlmIChicF9yZWxlYXNlKSB7CisJCQlicF9yZWxlYXNlID0gMDsKKwkJCXhmc190cmFuc19icmVsc2UoTlVMTCwgYnApOworCQl9CisJfQorCisJLyoKKwkgKiBIZXJlIHdpdGggYnAgYW5kIGJsb2NrIHNldCB0byB0aGUgbGVmdG1vc3QgbGVhZiBub2RlIGluIHRoZSB0cmVlLgorCSAqLworCWkgPSAwOworCisJLyoKKwkgKiBMb29wIG92ZXIgYWxsIGxlYWYgbm9kZXMgY2hlY2tpbmcgdGhhdCBhbGwgZXh0ZW50cyBhcmUgaW4gdGhlIHJpZ2h0IG9yZGVyLgorCSAqLworCWxhc3RwID0gTlVMTDsKKwlmb3IgKDs7KSB7CisJCXhmc19ibWJ0X3JlY190CSpmcnA7CisJCXhmc19mc2Jsb2NrX3QJbmV4dGJubzsKKwkJeGZzX2V4dG51bV90CW51bV9yZWNzOworCisKKwkJbnVtX3JlY3MgPSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCisJCS8qCisJCSAqIFJlYWQtYWhlYWQgdGhlIG5leHQgbGVhZiBibG9jaywgaWYgYW55LgorCQkgKi8KKworCQluZXh0Ym5vID0gSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCk7CisKKwkJLyoKKwkJICogQ2hlY2sgYWxsIHRoZSBleHRlbnRzIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBPSy4KKwkJICogSWYgd2UgaGFkIGEgcHJldmlvdXMgYmxvY2ssIHRoZSBsYXN0IGVudHJ5IHNob3VsZAorCQkgKiBjb25mb3JtIHdpdGggdGhlIGZpcnN0IGVudHJ5IGluIHRoaXMgb25lLgorCQkgKi8KKworCQlmcnAgPSBYRlNfQlRSRUVfUkVDX0FERFIobXAtPm1fc2Iuc2JfYmxvY2tzaXplLCB4ZnNfYm1idCwKKwkJCWJsb2NrLCAxLCBtcC0+bV9ibWFwX2RteHJbMF0pOworCisJCWZvciAoZXAgPSBmcnA7ZXAgPCBmcnAgKyAobnVtX3JlY3MgLSAxKTsgZXArKykgeworCQkJaWYgKGxhc3RwKSB7CisJCQkJeGZzX2J0cmVlX2NoZWNrX3JlYyhYRlNfQlROVU1fQk1BUCwKKwkJCQkJKHZvaWQgKilsYXN0cCwgKHZvaWQgKillcCk7CisJCQl9CisJCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKFhGU19CVE5VTV9CTUFQLCAodm9pZCAqKWVwLAorCQkJCSh2b2lkICopKGVwICsgMSkpOworCQl9CisJCWxhc3RwID0gZnJwICsgbnVtX3JlY3MgLSAxOyAvKiBGb3IgdGhlIG5leHQgaXRlcmF0aW9uICovCisKKwkJaSArPSBudW1fcmVjczsKKwkJaWYgKGJwX3JlbGVhc2UpIHsKKwkJCWJwX3JlbGVhc2UgPSAwOworCQkJeGZzX3RyYW5zX2JyZWxzZShOVUxMLCBicCk7CisJCX0KKwkJYm5vID0gbmV4dGJubzsKKwkJLyoKKwkJICogSWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kLCBzdG9wLgorCQkgKi8KKwkJaWYgKGJubyA9PSBOVUxMRlNCTE9DSykKKwkJCWJyZWFrOworCisJCWJwID0geGZzX2JtYXBfZ2V0X2JwKGN1ciwgWEZTX0ZTQl9UT19EQUREUihtcCwgYm5vKSk7CisJCWlmIChicCkgeworCQkJYnBfcmVsZWFzZSA9IDA7CisJCX0gZWxzZSB7CisJCQlicF9yZWxlYXNlID0gMTsKKwkJfQorCQlpZiAoIWJwICYmIChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZmwobXAsIE5VTEwsIGJubywgMCwgJmJwLAorCQkJCVhGU19CTUFQX0JUUkVFX1JFRikpKQorCQkJZ290byBlcnJvcl9ub3JlbHNlOworCQlibG9jayA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhicCk7CisJfQorCWlmIChicF9yZWxlYXNlKSB7CisJCWJwX3JlbGVhc2UgPSAwOworCQl4ZnNfdHJhbnNfYnJlbHNlKE5VTEwsIGJwKTsKKwl9CisJcmV0dXJuOworCitlcnJvcjA6CisJY21uX2VycihDRV9XQVJOLCAiJXM6IGF0IGVycm9yMCIsIF9fRlVOQ1RJT05fXyk7CisJaWYgKGJwX3JlbGVhc2UpCisJCXhmc190cmFuc19icmVsc2UoTlVMTCwgYnApOworZXJyb3Jfbm9yZWxzZToKKwljbW5fZXJyKENFX1dBUk4sICIlczogQkFEIGFmdGVyIGJ0cmVlIGxlYXZlcyBmb3IgJWQgZXh0ZW50cyIsCisJCWksIF9fRlVOQ1RJT05fXyk7CisJcGFuaWMoIiVzOiBDT1JSVVBURUQgQlRSRUUgT1IgU09NRVRISU5HIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm47Cit9CisjZW5kaWYKKworLyoKKyAqIENvdW50IGZzYmxvY2tzIG9mIHRoZSBnaXZlbiBmb3JrLgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfY291bnRfYmxvY2tzKAorCXhmc190cmFuc190CQkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub2RlX3QJCSppcCwJCS8qIGluY29yZSBpbm9kZSAqLworCWludAkJCXdoaWNoZm9yaywJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKwlpbnQJCQkqY291bnQpCQkvKiBvdXQ6IGNvdW50IG9mIGJsb2NrcyAqLworeworCXhmc19ibWJ0X2Jsb2NrX3QJKmJsb2NrOwkvKiBjdXJyZW50IGJ0cmVlIGJsb2NrICovCisJeGZzX2ZzYmxvY2tfdAkJYm5vOwkvKiBibG9jayAjIG9mICJibG9jayIgKi8KKwl4ZnNfaWZvcmtfdAkJKmlmcDsJLyogZm9yayBzdHJ1Y3R1cmUgKi8KKwlpbnQJCQlsZXZlbDsJLyogYnRyZWUgbGV2ZWwsIGZvciBjaGVja2luZyAqLworCXhmc19tb3VudF90CQkqbXA7CS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCXhmc19ibWJ0X3B0cl90CQkqcHA7CS8qIHBvaW50ZXIgdG8gYmxvY2sgYWRkcmVzcyAqLworCisJYm5vID0gTlVMTEZTQkxPQ0s7CisJbXAgPSBpcC0+aV9tb3VudDsKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCWlmICggWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICkgeworCQlpZiAodW5saWtlbHkoeGZzX2JtYXBfY291bnRfbGVhdmVzKGlmcC0+aWZfdTEuaWZfZXh0ZW50cywKKwkJCWlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpLAorCQkJY291bnQpIDwgMCkpIHsKKwkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19ibWFwX2NvdW50X2Jsb2NrcygxKSIsCisJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBSb290IGxldmVsIG11c3QgdXNlIEJNQVBfQlJPT1RfUFRSX0FERFIgbWFjcm8gdG8gZ2V0IHB0ciBvdXQuCisJICovCisJYmxvY2sgPSBpZnAtPmlmX2Jyb290OworCUFTU0VSVChJTlRfR0VUKGJsb2NrLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSA+IDApOworCWxldmVsID0gSU5UX0dFVChibG9jay0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCk7CisJcHAgPSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihibG9jaywgMSwgaWZwLT5pZl9icm9vdF9ieXRlcyk7CisJQVNTRVJUKElOVF9HRVQoKnBwLCBBUkNIX0NPTlZFUlQpICE9IE5VTExERlNCTk8pOworCUFTU0VSVChYRlNfRlNCX1RPX0FHTk8obXAsIElOVF9HRVQoKnBwLCBBUkNIX0NPTlZFUlQpKSA8IG1wLT5tX3NiLnNiX2FnY291bnQpOworCUFTU0VSVChYRlNfRlNCX1RPX0FHQk5PKG1wLCBJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKSkgPCBtcC0+bV9zYi5zYl9hZ2Jsb2Nrcyk7CisJYm5vID0gSU5UX0dFVCgqcHAsIEFSQ0hfQ09OVkVSVCk7CisKKwlpZiAodW5saWtlbHkoeGZzX2JtYXBfY291bnRfdHJlZShtcCwgdHAsIGJubywgbGV2ZWwsIGNvdW50KSA8IDApKSB7CisJCVhGU19FUlJPUl9SRVBPUlQoInhmc19ibWFwX2NvdW50X2Jsb2NrcygyKSIsIFhGU19FUlJMRVZFTF9MT1csCisJCQkJIG1wKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogUmVjdXJzaXZlbHkgd2Fsa3MgZWFjaCBsZXZlbCBvZiBhIGJ0cmVlCisgKiB0byBjb3VudCB0b3RhbCBmc2Jsb2NrcyBpcyB1c2UuCisgKi8KK2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlcnJvciAqLworeGZzX2JtYXBfY291bnRfdHJlZSgKKwl4ZnNfbW91bnRfdCAgICAgKm1wLCAgICAgICAgICAgIC8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX3RyYW5zX3QgICAgICp0cCwgICAgICAgICAgICAvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2ZzYmxvY2tfdCAgIGJsb2Nrbm8sCS8qIGZpbGUgc3lzdGVtIGJsb2NrIG51bWJlciAqLworCWludCAgICAgICAgICAgICBsZXZlbGluLAkvKiBsZXZlbCBpbiBidHJlZSAqLworCWludAkJKmNvdW50KQkJLyogQ291bnQgb2YgYmxvY2tzICovCit7CisJaW50CQkJZXJyb3I7CisJeGZzX2J1Zl90CQkqYnAsICpuYnA7CisJaW50CQkJbGV2ZWwgPSBsZXZlbGluOworCXhmc19ibWJ0X3B0cl90ICAgICAgICAgICpwcDsKKwl4ZnNfZnNibG9ja190ICAgICAgICAgICBibm8gPSBibG9ja25vOworCXhmc19mc2Jsb2NrX3QJCW5leHRibm87CisJeGZzX2JtYnRfYmxvY2tfdCAgICAgICAgKmJsb2NrLCAqbmV4dGJsb2NrOworCWludAkJCW51bXJlY3M7CisJeGZzX2JtYnRfcmVjX3QJCSpmcnA7CisKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChtcCwgdHAsIGJubywgMCwgJmJwLCBYRlNfQk1BUF9CVFJFRV9SRUYpKSkKKwkJcmV0dXJuIGVycm9yOworCSpjb3VudCArPSAxOworCWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKKworCWlmICgtLWxldmVsKSB7CisJCS8qIE5vdCBhdCBub2RlIGFib3ZlIGxlYWZzLCBjb3VudCB0aGlzIGxldmVsIG9mIG5vZGVzICovCisJCW5leHRibm8gPSBJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKTsKKwkJd2hpbGUgKG5leHRibm8gIT0gTlVMTEZTQkxPQ0spIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCB0cCwgbmV4dGJubywKKwkJCQkwLCAmbmJwLCBYRlNfQk1BUF9CVFJFRV9SRUYpKSkKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQkqY291bnQgKz0gMTsKKwkJCW5leHRibG9jayA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhuYnApOworCQkJbmV4dGJubyA9IElOVF9HRVQobmV4dGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKTsKKwkJCXhmc190cmFuc19icmVsc2UodHAsIG5icCk7CisJCX0KKworCQkvKiBEaXZlIHRvIHRoZSBuZXh0IGxldmVsICovCisJCXBwID0gWEZTX0JUUkVFX1BUUl9BRERSKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwKKwkJCXhmc19ibWJ0LCBibG9jaywgMSwgbXAtPm1fYm1hcF9kbXhyWzFdKTsKKwkJYm5vID0gSU5UX0dFVCgqcHAsIEFSQ0hfQ09OVkVSVCk7CisJCWlmICh1bmxpa2VseSgoZXJyb3IgPQorCQkgICAgIHhmc19ibWFwX2NvdW50X3RyZWUobXAsIHRwLCBibm8sIGxldmVsLCBjb3VudCkpIDwgMCkpIHsKKwkJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19ibWFwX2NvdW50X3RyZWUoMSkiLAorCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbXApOworCQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQl9CisJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwl9IGVsc2UgeworCQkvKiBjb3VudCBhbGwgbGV2ZWwgMSBub2RlcyBhbmQgdGhlaXIgbGVhdmVzICovCisJCWZvciAoOzspIHsKKwkJCW5leHRibm8gPSBJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKTsKKwkJCW51bXJlY3MgPSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCQkJZnJwID0gWEZTX0JUUkVFX1JFQ19BRERSKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwKKwkJCQl4ZnNfYm1idCwgYmxvY2ssIDEsIG1wLT5tX2JtYXBfZG14clswXSk7CisJCQlpZiAodW5saWtlbHkoeGZzX2JtYXBfY291bnRfbGVhdmVzKGZycCwgbnVtcmVjcywgY291bnQpIDwgMCkpIHsKKwkJCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisJCQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2JtYXBfY291bnRfdHJlZSgyKSIsCisJCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbXApOworCQkJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJCX0KKwkJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkJCWlmIChuZXh0Ym5vID09IE5VTExGU0JMT0NLKQorCQkJCWJyZWFrOworCQkJYm5vID0gbmV4dGJubzsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCB0cCwgYm5vLCAwLCAmYnAsCisJCQkJWEZTX0JNQVBfQlRSRUVfUkVGKSkpCisJCQkJcmV0dXJuIGVycm9yOworCQkJKmNvdW50ICs9IDE7CisJCQlibG9jayA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhicCk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb3VudCBsZWFmIGJsb2NrcyBnaXZlbiBhIHBvaW50ZXIgdG8gYW4gZXh0ZW50IGxpc3QuCisgKi8KK2ludAoreGZzX2JtYXBfY291bnRfbGVhdmVzKAorCXhmc19ibWJ0X3JlY190CQkqZnJwLAorCWludAkJCW51bXJlY3MsCisJaW50CQkJKmNvdW50KQoreworCWludAkJYjsKKworCWZvciAoIGIgPSAxOyBiIDw9IG51bXJlY3M7IGIrKywgZnJwKyspCisJCSpjb3VudCArPSB4ZnNfYm1idF9kaXNrX2dldF9ibG9ja2NvdW50KGZycCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2JtYXAuaCBiL2ZzL3hmcy94ZnNfYm1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYmMyMmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2JtYXAuaApAQCAtMCwwICsxLDM3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfQk1BUF9IX18KKyNkZWZpbmUJX19YRlNfQk1BUF9IX18KKworc3RydWN0IGdldGJtYXA7CitzdHJ1Y3QgeGZzX2JtYnRfaXJlYzsKK3N0cnVjdCB4ZnNfaW5vZGU7CitzdHJ1Y3QgeGZzX21vdW50Oworc3RydWN0IHhmc190cmFuczsKKworLyoKKyAqIExpc3Qgb2YgZXh0ZW50cyB0byBiZSBmcmVlICJsYXRlciIuCisgKiBUaGUgbGlzdCBpcyBrZXB0IHNvcnRlZCBvbiB4YmZfc3RhcnRibG9jay4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2JtYXBfZnJlZV9pdGVtCit7CisJeGZzX2ZzYmxvY2tfdAkJeGJmaV9zdGFydGJsb2NrOy8qIHN0YXJ0aW5nIGZzIGJsb2NrIG51bWJlciAqLworCXhmc19leHRsZW5fdAkJeGJmaV9ibG9ja2NvdW50Oy8qIG51bWJlciBvZiBibG9ja3MgaW4gZXh0ZW50ICovCisJc3RydWN0IHhmc19ibWFwX2ZyZWVfaXRlbSAqeGJmaV9uZXh0OwkvKiBsaW5rIHRvIG5leHQgZW50cnkgKi8KK30geGZzX2JtYXBfZnJlZV9pdGVtX3Q7CisKKy8qCisgKiBIZWFkZXIgZm9yIGZyZWUgZXh0ZW50IGxpc3QuCisgKi8KK3R5cGVkZWYJc3RydWN0IHhmc19ibWFwX2ZyZWUKK3sKKwl4ZnNfYm1hcF9mcmVlX2l0ZW1fdAkqeGJmX2ZpcnN0OwkvKiBsaXN0IG9mIHRvLWJlLWZyZWUgZXh0ZW50cyAqLworCWludAkJCXhiZl9jb3VudDsJLyogY291bnQgb2YgaXRlbXMgb24gbGlzdCAqLworCWludAkJCXhiZl9sb3c7CS8qIGtsdWRnZTogYWxsb2MgaW4gbG93IG1vZGUgKi8KK30geGZzX2JtYXBfZnJlZV90OworCisjZGVmaW5lCVhGU19CTUFQX01BWF9OTUFQCTQKKworLyoKKyAqIEZsYWdzIGZvciB4ZnNfYm1hcGkKKyAqLworI2RlZmluZQlYRlNfQk1BUElfV1JJVEUJCTB4MDAxCS8qIHdyaXRlIG9wZXJhdGlvbjogYWxsb2NhdGUgc3BhY2UgKi8KKyNkZWZpbmUgWEZTX0JNQVBJX0RFTEFZCQkweDAwMgkvKiBkZWxheWVkIHdyaXRlIG9wZXJhdGlvbiAqLworI2RlZmluZSBYRlNfQk1BUElfRU5USVJFCTB4MDA0CS8qIHJldHVybiBlbnRpcmUgZXh0ZW50LCBub3QgdHJpbW1lZCAqLworI2RlZmluZSBYRlNfQk1BUElfTUVUQURBVEEJMHgwMDgJLyogbWFwcGluZyBtZXRhZGF0YSBub3QgdXNlciBkYXRhICovCisjZGVmaW5lIFhGU19CTUFQSV9FWEFDVAkJMHgwMTAJLyogYWxsb2NhdGUgb25seSB0byBzcGVjJ2QgYm91bmRzICovCisjZGVmaW5lIFhGU19CTUFQSV9BVFRSRk9SSwkweDAyMAkvKiB1c2UgYXR0cmlidXRlIGZvcmsgbm90IGRhdGEgKi8KKyNkZWZpbmUgWEZTX0JNQVBJX0FTWU5DCQkweDA0MAkvKiBidW5tYXBpIHhhY3Rpb25zIGNhbiBiZSBhc3luYyAqLworI2RlZmluZSBYRlNfQk1BUElfUlNWQkxPQ0tTCTB4MDgwCS8qIE9LIHRvIGFsbG9jLiByZXNlcnZlZCBkYXRhIGJsb2NrcyAqLworI2RlZmluZQlYRlNfQk1BUElfUFJFQUxMT0MJMHgxMDAJLyogcHJlYWxsb2NhdGlvbiBvcDogdW53cml0dGVuIHNwYWNlICovCisjZGVmaW5lCVhGU19CTUFQSV9JR1NUQVRFCTB4MjAwCS8qIElnbm9yZSBzdGF0ZSAtICovCisJCQkJCS8qIGNvbWJpbmUgY29udGlnLiBzcGFjZSAqLworI2RlZmluZQlYRlNfQk1BUElfQ09OVElHCTB4NDAwCS8qIG11c3QgYWxsb2NhdGUgb25seSBvbmUgZXh0ZW50ICovCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBJX0FGTEFHKQoraW50IHhmc19ibWFwaV9hZmxhZyhpbnQgdyk7CisjZGVmaW5lCVhGU19CTUFQSV9BRkxBRyh3KQl4ZnNfYm1hcGlfYWZsYWcodykKKyNlbHNlCisjZGVmaW5lCVhGU19CTUFQSV9BRkxBRyh3KQkoKHcpID09IFhGU19BVFRSX0ZPUksgPyBYRlNfQk1BUElfQVRUUkZPUksgOiAwKQorI2VuZGlmCisKKy8qCisgKiBTcGVjaWFsIHZhbHVlcyBmb3IgeGZzX2JtYnRfaXJlY190IGJyX3N0YXJ0YmxvY2sgZmllbGQuCisgKi8KKyNkZWZpbmUJREVMQVlTVEFSVEJMT0NLCQkoKHhmc19mc2Jsb2NrX3QpLTFMTCkKKyNkZWZpbmUJSE9MRVNUQVJUQkxPQ0sJCSgoeGZzX2ZzYmxvY2tfdCktMkxMKQorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX0lOSVQpCit2b2lkIHhmc19ibWFwX2luaXQoeGZzX2JtYXBfZnJlZV90ICpmbHAsIHhmc19mc2Jsb2NrX3QgKmZicCk7CisjZGVmaW5lCVhGU19CTUFQX0lOSVQoZmxwLGZicCkJeGZzX2JtYXBfaW5pdChmbHAsZmJwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0JNQVBfSU5JVChmbHAsZmJwKQlcCisJKChmbHApLT54YmZfZmlyc3QgPSBOVUxMLCAoZmxwKS0+eGJmX2NvdW50ID0gMCwgXAorCSAoZmxwKS0+eGJmX2xvdyA9IDAsICooZmJwKSA9IE5VTExGU0JMT0NLKQorI2VuZGlmCisKKy8qCisgKiBBcmd1bWVudCBzdHJ1Y3R1cmUgZm9yIHhmc19ibWFwX2FsbG9jLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfYm1hbGxvY2EgeworCXhmc19mc2Jsb2NrX3QJCWZpcnN0YmxvY2s7IC8qIGkvbyBmaXJzdCBibG9jayBhbGxvY2F0ZWQgKi8KKwl4ZnNfZnNibG9ja190CQlydmFsOwkvKiBzdGFydGluZyBibG9jayBvZiBuZXcgZXh0ZW50ICovCisJeGZzX2ZpbGVvZmZfdAkJb2ZmOwkvKiBvZmZzZXQgaW4gZmlsZSBmaWxsaW5nIGluICovCisJc3RydWN0IHhmc190cmFucwkqdHA7CS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSppcDsJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqcHJldnA7CS8qIGV4dGVudCBiZWZvcmUgdGhlIG5ldyBvbmUgKi8KKwlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqZ290cDsJLyogZXh0ZW50IGFmdGVyLCBvciBkZWxheWVkICovCisJeGZzX2V4dGxlbl90CQlhbGVuOwkvKiBpL28gbGVuZ3RoIGFza2VkL2FsbG9jYXRlZCAqLworCXhmc19leHRsZW5fdAkJdG90YWw7CS8qIHRvdGFsIGJsb2NrcyBuZWVkZWQgZm9yIHhhY3Rpb24gKi8KKwl4ZnNfZXh0bGVuX3QJCW1pbmxlbjsJLyogbWluaW51bSBhbGxvY2F0aW9uIHNpemUgKGJsb2NrcykgKi8KKwl4ZnNfZXh0bGVuX3QJCW1pbmxlZnQ7IC8qIGFtb3VudCBtdXN0IGJlIGxlZnQgYWZ0ZXIgYWxsb2MgKi8KKwljaGFyCQkJZW9mOwkvKiBzZXQgaWYgYWxsb2NhdGluZyBwYXN0IGxhc3QgZXh0ZW50ICovCisJY2hhcgkJCXdhc2RlbDsJLyogcmVwbGFjaW5nIGEgZGVsYXllZCBhbGxvY2F0aW9uICovCisJY2hhcgkJCXVzZXJkYXRhOy8qIHNldCBpZiBpcyB1c2VyIGRhdGEgKi8KKwljaGFyCQkJbG93OwkvKiBsb3cgb24gc3BhY2UsIHVzaW5nIHNlcSdsIGFncyAqLworCWNoYXIJCQlhZW9mOyAgIC8qIGFsbG9jYXRlZCBzcGFjZSBhdCBlb2YgKi8KK30geGZzX2JtYWxsb2NhX3Q7CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpZiBkZWZpbmVkKFhGU19CTUFQX1RSQUNFKQorLyoKKyAqIFRyYWNlIG9wZXJhdGlvbnMgZm9yIGJtYXAgZXh0ZW50IHRyYWNpbmcKKyAqLworI2RlZmluZQlYRlNfQk1BUF9LVFJBQ0VfREVMRVRFCTEKKyNkZWZpbmUJWEZTX0JNQVBfS1RSQUNFX0lOU0VSVAkyCisjZGVmaW5lCVhGU19CTUFQX0tUUkFDRV9QUkVfVVAJMworI2RlZmluZQlYRlNfQk1BUF9LVFJBQ0VfUE9TVF9VUAk0CisKKyNkZWZpbmUJWEZTX0JNQVBfVFJBQ0VfU0laRQk0MDk2CS8qIHNpemUgb2YgZ2xvYmFsIHRyYWNlIGJ1ZmZlciAqLworI2RlZmluZQlYRlNfQk1BUF9LVFJBQ0VfU0laRQkzMgkvKiBzaXplIG9mIHBlci1pbm9kZSB0cmFjZSBidWZmZXIgKi8KK2V4dGVybiBrdHJhY2VfdAkqeGZzX2JtYXBfdHJhY2VfYnVmOworCisvKgorICogQWRkIGJtYXAgdHJhY2UgaW5zZXJ0IGVudHJpZXMgZm9yIGFsbCB0aGUgY29udGVudHMgb2YgdGhlIGV4dGVudCBsaXN0LgorICovCit2b2lkCit4ZnNfYm1hcF90cmFjZV9leGxpc3QoCisJY2hhcgkJCSpmbmFtZSwJCS8qIGZ1bmN0aW9uIG5hbWUgKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CQljbnQsCQkvKiBjb3VudCBvZiBlbnRyaWVzIGluIGxpc3QgKi8KKwlpbnQJCQl3aGljaGZvcmspOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworI2Vsc2UKKyNkZWZpbmUJeGZzX2JtYXBfdHJhY2VfZXhsaXN0KGYsaXAsYyx3KQorI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IGlub2RlIGZyb20gbm9uLWF0dHJpYnV0ZWQgdG8gYXR0cmlidXRlZC4KKyAqIE11c3Qgbm90IGJlIGluIGEgdHJhbnNhY3Rpb24sIGlwIG11c3Qgbm90IGJlIGxvY2tlZC4KKyAqLworaW50CQkJCQkvKiBlcnJvciBjb2RlICovCit4ZnNfYm1hcF9hZGRfYXR0cmZvcmsoCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJaW50CQkJCQlyc3ZkKTsJLyogZmxhZyBmb3IgcmVzZXJ2ZWQgYmxvY2sgYWxsb2NhdGlvbiAqLworCisvKgorICogQWRkIHRoZSBleHRlbnQgdG8gdGhlIGxpc3Qgb2YgZXh0ZW50cyB0byBiZSBmcmVlIGF0IHRyYW5zYWN0aW9uIGVuZC4KKyAqIFRoZSBsaXN0IGlzIG1haW50YWluZWQgc29ydGVkIChieSBibG9jayBudW1iZXIpLgorICovCit2b2lkCit4ZnNfYm1hcF9hZGRfZnJlZSgKKwl4ZnNfZnNibG9ja190CQlibm8sCQkvKiBmcyBibG9jayBudW1iZXIgb2YgZXh0ZW50ICovCisJeGZzX2ZpbGJsa3NfdAkJbGVuLAkJLyogbGVuZ3RoIG9mIGV4dGVudCAqLworCXhmc19ibWFwX2ZyZWVfdAkJKmZsaXN0LAkJLyogbGlzdCBvZiBleHRlbnRzICovCisJc3RydWN0IHhmc19tb3VudAkqbXApOwkJLyogbW91bnQgcG9pbnQgc3RydWN0dXJlICovCisKKy8qCisgKiBSb3V0aW5lIHRvIGNsZWFuIHVwIHRoZSBmcmVlIGxpc3QgZGF0YSBzdHJ1Y3R1cmUgd2hlbgorICogYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBhIHRyYW5zYWN0aW9uLgorICovCit2b2lkCit4ZnNfYm1hcF9jYW5jZWwoCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QpOwkvKiBmcmVlIGxpc3QgdG8gY2xlYW4gdXAgKi8KKworLyoKKyAqIENvbXB1dGUgYW5kIGZpbGwgaW4gdGhlIHZhbHVlIG9mIHRoZSBtYXhpbXVtIGRlcHRoIG9mIGEgYm1hcCBidHJlZQorICogaW4gdGhpcyBmaWxlc3lzdGVtLiAgRG9uZSBvbmNlLCBkdXJpbmcgbW91bnQuCisgKi8KK3ZvaWQKK3hmc19ibWFwX2NvbXB1dGVfbWF4bGV2ZWxzKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwlpbnQJCQl3aGljaGZvcmspOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCisvKgorICogUm91dGluZSB0byBiZSBjYWxsZWQgYXQgdHJhbnNhY3Rpb24ncyBlbmQgYnkgeGZzX2JtYXBpLCB4ZnNfYnVubWFwaQorICogY2FsbGVyLiAgRnJlZXMgYWxsIHRoZSBleHRlbnRzIHRoYXQgbmVlZCBmcmVlaW5nLCB3aGljaCBtdXN0IGJlIGRvbmUKKyAqIGxhc3QgZHVlIHRvIGxvY2tpbmcgY29uc2lkZXJhdGlvbnMuCisgKgorICogUmV0dXJuIDEgaWYgdGhlIGdpdmVuIHRyYW5zYWN0aW9uIHdhcyBjb21taXR0ZWQgYW5kIGEgbmV3IG9uZSBhbGxvY2F0ZWQsCisgKiBhbmQgMCBvdGhlcndpc2UuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9maW5pc2goCisJc3RydWN0IHhmc190cmFucwkqKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciBhZGRyICovCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCQkvKiBpL286IGxpc3QgZXh0ZW50cyB0byBmcmVlICovCisJeGZzX2ZzYmxvY2tfdAkJZmlyc3RibG9jaywJLyogY29udHJvbGxlZCBhLmcuIGZvciBhbGxvY3MgKi8KKwlpbnQJCQkqY29tbWl0dGVkKTsJLyogeGFjdCBjb21taXR0ZWQgb3Igbm90ICovCisKKy8qCisgKiBSZXR1cm5zIHRoZSBmaWxlLXJlbGF0aXZlIGJsb2NrIG51bWJlciBvZiB0aGUgZmlyc3QgdW51c2VkIGJsb2NrIGluIHRoZSBmaWxlLgorICogVGhpcyBpcyB0aGUgbG93ZXN0LWFkZHJlc3MgaG9sZSBpZiB0aGUgZmlsZSBoYXMgaG9sZXMsIGVsc2UgdGhlIGZpcnN0IGJsb2NrCisgKiBwYXN0IHRoZSBlbmQgb2YgZmlsZS4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2ZpcnN0X3VudXNlZCgKKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwJCS8qIGluY29yZSBpbm9kZSAqLworCXhmc19leHRsZW5fdAkJbGVuLAkJLyogc2l6ZSBvZiBob2xlIHRvIGZpbmQgKi8KKwl4ZnNfZmlsZW9mZl90CQkqdW51c2VkLAkvKiB1bnVzZWQgYmxvY2sgbnVtICovCisJaW50CQkJd2hpY2hmb3JrKTsJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKworLyoKKyAqIFJldHVybnMgdGhlIGZpbGUtcmVsYXRpdmUgYmxvY2sgbnVtYmVyIG9mIHRoZSBsYXN0IGJsb2NrICsgMSBiZWZvcmUKKyAqIGxhc3RfYmxvY2sgKGlucHV0IHZhbHVlKSBpbiB0aGUgZmlsZS4KKyAqIFRoaXMgaXMgbm90IGJhc2VkIG9uIGlfc2l6ZSwgaXQgaXMgYmFzZWQgb24gdGhlIGV4dGVudCBsaXN0LgorICogUmV0dXJucyAwIGZvciBsb2NhbCBmaWxlcywgYXMgdGhleSBkbyBub3QgaGF2ZSBhbiBleHRlbnQgbGlzdC4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2xhc3RfYmVmb3JlKAorCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCisJeGZzX2ZpbGVvZmZfdAkJKmxhc3RfYmxvY2ssCS8qIGxhc3QgYmxvY2sgKi8KKwlpbnQJCQl3aGljaGZvcmspOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCisvKgorICogUmV0dXJucyB0aGUgZmlsZS1yZWxhdGl2ZSBibG9jayBudW1iZXIgb2YgdGhlIGZpcnN0IGJsb2NrIHBhc3QgZW9mIGluCisgKiB0aGUgZmlsZS4gIFRoaXMgaXMgbm90IGJhc2VkIG9uIGlfc2l6ZSwgaXQgaXMgYmFzZWQgb24gdGhlIGV4dGVudCBsaXN0LgorICogUmV0dXJucyAwIGZvciBsb2NhbCBmaWxlcywgYXMgdGhleSBkbyBub3QgaGF2ZSBhbiBleHRlbnQgbGlzdC4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2xhc3Rfb2Zmc2V0KAorCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCisJeGZzX2ZpbGVvZmZfdAkJKnVudXNlZCwJLyogbGFzdCBibG9jayBudW0gKi8KKwlpbnQJCQl3aGljaGZvcmspOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCisvKgorICogUmV0dXJucyB3aGV0aGVyIHRoZSBzZWxlY3RlZCBmb3JrIG9mIHRoZSBpbm9kZSBoYXMgZXhhY3RseSBvbmUKKyAqIGJsb2NrIG9yIG5vdC4gIEZvciB0aGUgZGF0YSBmb3JrIHdlIGNoZWNrIHRoaXMgbWF0Y2hlcyBkaV9zaXplLAorICogaW1wbHlpbmcgdGhlIGZpbGUncyByYW5nZSBpcyAwLi5ic2l6ZS0xLgorICovCitpbnQKK3hmc19ibWFwX29uZV9ibG9jaygKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwJCS8qIGluY29yZSBpbm9kZSAqLworCWludAkJCXdoaWNoZm9yayk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisKKy8qCisgKiBSZWFkIGluIHRoZSBleHRlbnRzIHRvIGl1X2V4dGVudHMuCisgKiBBbGwgaW5vZGUgZmllbGRzIGFyZSBzZXQgdXAgYnkgY2FsbGVyLCB3ZSBqdXN0IHRyYXZlcnNlIHRoZSBidHJlZQorICogYW5kIGNvcHkgdGhlIHJlY29yZHMgaW4uCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9yZWFkX2V4dGVudHMoCisJc3RydWN0IHhmc190cmFucwkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgKi8KKwlpbnQJCQl3aGljaGZvcmspOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCisvKgorICogTWFwIGZpbGUgYmxvY2tzIHRvIGZpbGVzeXN0ZW0gYmxvY2tzLgorICogRmlsZSByYW5nZSBpcyBnaXZlbiBieSB0aGUgYm5vL2xlbiBwYWlyLgorICogQWRkcyBibG9ja3MgdG8gZmlsZSBpZiBhIHdyaXRlICgiZmxhZ3MgJiBYRlNfQk1BUElfV1JJVEUiIHNldCkKKyAqIGludG8gYSBob2xlIG9yIHBhc3QgZW9mLgorICogT25seSBhbGxvY2F0ZXMgYmxvY2tzIGZyb20gYSBzaW5nbGUgYWxsb2NhdGlvbiBncm91cCwKKyAqIHRvIGF2b2lkIGxvY2tpbmcgcHJvYmxlbXMuCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgaW4gImZpcnN0YmxvY2siIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gYSB0cmFuc2FjdGlvbgorICogbXVzdCBiZSByZW1lbWJlcmVkIGFuZCBwcmVzZW50ZWQgdG8gc3Vic2VxdWVudCBjYWxscyBpbiAiZmlyc3RibG9jayIuCisgKiBBbiB1cHBlciBib3VuZCBmb3IgdGhlIG51bWJlciBvZiBibG9ja3MgdG8gYmUgYWxsb2NhdGVkIGlzIHN1cHBsaWVkIHRvCisgKiB0aGUgZmlyc3QgY2FsbCBpbiAidG90YWwiOyBpZiBubyBhbGxvY2F0aW9uIGdyb3VwIGhhcyB0aGF0IG1hbnkgZnJlZQorICogYmxvY2tzIHRoZW4gdGhlIGNhbGwgd2lsbCBmYWlsIChyZXR1cm4gTlVMTEZTQkxPQ0sgaW4gImZpcnN0YmxvY2siKS4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwaSgKKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwJCS8qIGluY29yZSBpbm9kZSAqLworCXhmc19maWxlb2ZmX3QJCWJubywJCS8qIHN0YXJ0aW5nIGZpbGUgb2Zmcy4gbWFwcGVkICovCisJeGZzX2ZpbGJsa3NfdAkJbGVuLAkJLyogbGVuZ3RoIHRvIG1hcCBpbiBmaWxlICovCisJaW50CQkJZmxhZ3MsCQkvKiBYRlNfQk1BUElfLi4uICovCisJeGZzX2ZzYmxvY2tfdAkJKmZpcnN0YmxvY2ssCS8qIGZpcnN0IGFsbG9jYXRlZCBibG9jaworCQkJCQkJICAgY29udHJvbHMgYS5nLiBmb3IgYWxsb2NzICovCisJeGZzX2V4dGxlbl90CQl0b3RhbCwJCS8qIHRvdGFsIGJsb2NrcyBuZWVkZWQgKi8KKwlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqbXZhbCwJCS8qIG91dHB1dDogbWFwIHZhbHVlcyAqLworCWludAkJCSpubWFwLAkJLyogaS9vOiBtdmFsIHNpemUvY291bnQgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCk7CS8qIGkvbzogbGlzdCBleHRlbnRzIHRvIGZyZWUgKi8KKworLyoKKyAqIE1hcCBmaWxlIGJsb2NrcyB0byBmaWxlc3lzdGVtIGJsb2Nrcywgc2ltcGxlIHZlcnNpb24uCisgKiBPbmUgYmxvY2sgb25seSwgcmVhZC1vbmx5LgorICogRm9yIGZsYWdzLCBvbmx5IHRoZSBYRlNfQk1BUElfQVRUUkZPUksgZmxhZyBpcyBleGFtaW5lZC4KKyAqIEZvciB0aGUgb3RoZXIgZmxhZyB2YWx1ZXMsIHRoZSBlZmZlY3QgaXMgYXMgaWYgWEZTX0JNQVBJX01FVEFEQVRBCisgKiB3YXMgc2V0IGFuZCBhbGwgdGhlIG90aGVycyB3ZXJlIGNsZWFyLgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBpX3NpbmdsZSgKKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwJCS8qIGluY29yZSBpbm9kZSAqLworCWludAkJCXdoaWNoZm9yaywJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKwl4ZnNfZnNibG9ja190CQkqZnNiLAkJLyogb3V0cHV0OiBtYXBwZWQgYmxvY2sgKi8KKwl4ZnNfZmlsZW9mZl90CQlibm8pOwkJLyogc3RhcnRpbmcgZmlsZSBvZmZzLiBtYXBwZWQgKi8KKworLyoKKyAqIFVubWFwIChyZW1vdmUpIGJsb2NrcyBmcm9tIGEgZmlsZS4KKyAqIElmIG5leHRzIGlzIG5vbnplcm8gdGhlbiB0aGUgbnVtYmVyIG9mIGV4dGVudHMgdG8gcmVtb3ZlIGlzIGxpbWl0ZWQgdG8KKyAqIHRoYXQgdmFsdWUuICBJZiBub3QgYWxsIGV4dGVudHMgaW4gdGhlIGJsb2NrIHJhbmdlIGNhbiBiZSByZW1vdmVkIHRoZW4KKyAqICpkb25lIGlzIHNldC4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19idW5tYXBpKAorCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCisJeGZzX2ZpbGVvZmZfdAkJYm5vLAkJLyogc3RhcnRpbmcgb2Zmc2V0IHRvIHVubWFwICovCisJeGZzX2ZpbGJsa3NfdAkJbGVuLAkJLyogbGVuZ3RoIHRvIHVubWFwIGluIGZpbGUgKi8KKwlpbnQJCQlmbGFncywJCS8qIFhGU19CTUFQSV8uLi4gKi8KKwl4ZnNfZXh0bnVtX3QJCW5leHRzLAkJLyogbnVtYmVyIG9mIGV4dGVudHMgbWF4ICovCisJeGZzX2ZzYmxvY2tfdAkJKmZpcnN0YmxvY2ssCS8qIGZpcnN0IGFsbG9jYXRlZCBibG9jaworCQkJCQkJICAgY29udHJvbHMgYS5nLiBmb3IgYWxsb2NzICovCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCQkvKiBpL286IGxpc3QgZXh0ZW50cyB0byBmcmVlICovCisJaW50CQkJKmRvbmUpOwkJLyogc2V0IGlmIG5vdCBkb25lIHlldCAqLworCisvKgorICogRmNudGwgaW50ZXJmYWNlIHRvIHhmc19ibWFwaS4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgY29kZSAqLworeGZzX2dldGJtYXAoCisJYmh2X2Rlc2NfdAkJKmJkcCwJCS8qIFhGUyBiZWhhdmlvciBkZXNjcmlwdG9yKi8KKwlzdHJ1Y3QgZ2V0Ym1hcAkJKmJtdiwJCS8qIHVzZXIgYm1hcCBzdHJ1Y3R1cmUgKi8KKwl2b2lkCQkJX191c2VyICphcCwJLyogcG9pbnRlciB0byB1c2VyJ3MgYXJyYXkgKi8KKwlpbnQJCQlpZmxhZ3MpOwkvKiBpbnRlcmZhY2UgZmxhZ3MgKi8KKworLyoKKyAqIENoZWNrIHRoZSBsYXN0IGlub2RlIGV4dGVudCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGFsbG9jYXRpb24gd2lsbCByZXN1bHQKKyAqIGluIGJsb2NrcyBiZWluZyBhbGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gV2hlbiB3ZSBhbGxvY2F0ZSBuZXcgZGF0YQorICogYmxvY2tzIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgd2hpY2ggZG8gbm90IHN0YXJ0IGF0IHRoZSBwcmV2aW91cyBkYXRhIGJsb2NrLAorICogd2Ugd2lsbCB0cnkgdG8gYWxpZ24gdGhlIG5ldyBibG9ja3MgYXQgc3RyaXBlIHVuaXQgYm91bmRhcmllcy4KKyAqLworaW50Cit4ZnNfYm1hcF9pc2Flb2YoCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCisJeGZzX2ZpbGVvZmZfdAkJb2ZmLAorCWludAkJCXdoaWNoZm9yaywKKwljaGFyCQkJKmFlb2YpOworCisvKgorICogQ2hlY2sgaWYgdGhlIGVuZG9mZiBpcyBvdXRzaWRlIHRoZSBsYXN0IGV4dGVudC4gSWYgc28gdGhlIGNhbGxlciB3aWxsIGdyb3cKKyAqIHRoZSBhbGxvY2F0aW9uIHRvIGEgc3RyaXBlIHVuaXQgYm91bmRhcnkKKyAqLworaW50Cit4ZnNfYm1hcF9lb2YoCisJc3RydWN0IHhmc19pbm9kZSAgICAgICAgKmlwLAorCXhmc19maWxlb2ZmX3QgICAgICAgICAgIGVuZG9mZiwKKwlpbnQgICAgICAgICAgICAgICAgICAgICB3aGljaGZvcmssCisJaW50ICAgICAgICAgICAgICAgICAgICAgKmVvZik7CisKKy8qCisgKiBDb3VudCBmc2Jsb2NrcyBvZiB0aGUgZ2l2ZW4gZm9yay4KKyAqLworaW50Cit4ZnNfYm1hcF9jb3VudF9ibG9ja3MoCisJeGZzX3RyYW5zX3QJCSp0cCwKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKKwlpbnQJCQl3aGljaGZvcmssCisJaW50CQkJKmNvdW50KTsKKworLyoKKyAqIENoZWNrIGFuIGV4dGVudCBsaXN0LCB3aGljaCBoYXMganVzdCBiZWVuIHJlYWQsIGZvcgorICogYW55IGJpdCBpbiB0aGUgZXh0ZW50IGZsYWcgZmllbGQuCisgKi8KK2ludAoreGZzX2NoZWNrX25vc3RhdGVfZXh0ZW50cygKKwl4ZnNfYm1idF9yZWNfdAkJKmVwLAorCXhmc19leHRudW1fdAkJbnVtKTsKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCS8qIF9fWEZTX0JNQVBfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2JtYXBfYnRyZWUuYyBiL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MzMwNWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2JtYXBfYnRyZWUuYwpAQCAtMCwwICsxLDI4MDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKworI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX3F1b3RhLmgiCisKKyNpZiBkZWZpbmVkKFhGU19CTUJUX1RSQUNFKQora3RyYWNlX3QJKnhmc19ibWJ0X3RyYWNlX2J1ZjsKKyNlbmRpZgorCisvKgorICogUHJvdG90eXBlcyBmb3IgaW50ZXJuYWwgYnRyZWUgZnVuY3Rpb25zLgorICovCisKKworU1RBVElDIGludCB4ZnNfYm1idF9raWxscm9vdCh4ZnNfYnRyZWVfY3VyX3QgKik7CitTVEFUSUMgdm9pZCB4ZnNfYm1idF9sb2dfa2V5cyh4ZnNfYnRyZWVfY3VyX3QgKiwgeGZzX2J1Zl90ICosIGludCwgaW50KTsKK1NUQVRJQyB2b2lkIHhmc19ibWJ0X2xvZ19wdHJzKHhmc19idHJlZV9jdXJfdCAqLCB4ZnNfYnVmX3QgKiwgaW50LCBpbnQpOworU1RBVElDIGludCB4ZnNfYm1idF9sc2hpZnQoeGZzX2J0cmVlX2N1cl90ICosIGludCwgaW50ICopOworU1RBVElDIGludCB4ZnNfYm1idF9yc2hpZnQoeGZzX2J0cmVlX2N1cl90ICosIGludCwgaW50ICopOworU1RBVElDIGludCB4ZnNfYm1idF9zcGxpdCh4ZnNfYnRyZWVfY3VyX3QgKiwgaW50LCB4ZnNfZnNibG9ja190ICosCisJCXhmc19ibWJ0X2tleV90ICosIHhmc19idHJlZV9jdXJfdCAqKiwgaW50ICopOworU1RBVElDIGludCB4ZnNfYm1idF91cGRrZXkoeGZzX2J0cmVlX2N1cl90ICosIHhmc19ibWJ0X2tleV90ICosIGludCk7CisKKworI2lmIGRlZmluZWQoWEZTX0JNQlRfVFJBQ0UpCisKK3N0YXRpYyBjaGFyCUFSR1NbXSA9ICJhcmdzIjsKK3N0YXRpYyBjaGFyCUVOVFJZW10gPSAiZW50cnkiOworc3RhdGljIGNoYXIJRVJST1JbXSA9ICJlcnJvciI7CisjdW5kZWYgRVhJVAorc3RhdGljIGNoYXIJRVhJVFtdID0gImV4aXQiOworCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciB0aGUgYXJndW1lbnRzIGdpdmVuIHRvIHRoZSByb3V0aW5lLAorICogZ2VuZXJpYyBmb3JtLgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYnRfdHJhY2VfZW50ZXIoCisJY2hhcgkJKmZ1bmMsCisJeGZzX2J0cmVlX2N1cl90CSpjdXIsCisJY2hhcgkJKnMsCisJaW50CQl0eXBlLAorCWludAkJbGluZSwKKwlfX3BzdW5zaWduZWRfdAlhMCwKKwlfX3BzdW5zaWduZWRfdAlhMSwKKwlfX3BzdW5zaWduZWRfdAlhMiwKKwlfX3BzdW5zaWduZWRfdAlhMywKKwlfX3BzdW5zaWduZWRfdAlhNCwKKwlfX3BzdW5zaWduZWRfdAlhNSwKKwlfX3BzdW5zaWduZWRfdAlhNiwKKwlfX3BzdW5zaWduZWRfdAlhNywKKwlfX3BzdW5zaWduZWRfdAlhOCwKKwlfX3BzdW5zaWduZWRfdAlhOSwKKwlfX3BzdW5zaWduZWRfdAlhMTApCit7CisJeGZzX2lub2RlX3QJKmlwOworCWludAkJd2hpY2hmb3JrOworCisJaXAgPSBjdXItPmJjX3ByaXZhdGUuYi5pcDsKKwl3aGljaGZvcmsgPSBjdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcms7CisJa3RyYWNlX2VudGVyKHhmc19ibWJ0X3RyYWNlX2J1ZiwKKwkJKHZvaWQgKikoKF9fcHNpbnRfdCl0eXBlIHwgKHdoaWNoZm9yayA8PCA4KSB8IChsaW5lIDw8IDE2KSksCisJCSh2b2lkICopZnVuYywgKHZvaWQgKilzLCAodm9pZCAqKWlwLCAodm9pZCAqKWN1ciwKKwkJKHZvaWQgKilhMCwgKHZvaWQgKilhMSwgKHZvaWQgKilhMiwgKHZvaWQgKilhMywKKwkJKHZvaWQgKilhNCwgKHZvaWQgKilhNSwgKHZvaWQgKilhNiwgKHZvaWQgKilhNywKKwkJKHZvaWQgKilhOCwgKHZvaWQgKilhOSwgKHZvaWQgKilhMTApOworCUFTU0VSVChpcC0+aV9idHJhY2UpOworCWt0cmFjZV9lbnRlcihpcC0+aV9idHJhY2UsCisJCSh2b2lkICopKChfX3BzaW50X3QpdHlwZSB8ICh3aGljaGZvcmsgPDwgOCkgfCAobGluZSA8PCAxNikpLAorCQkodm9pZCAqKWZ1bmMsICh2b2lkICopcywgKHZvaWQgKilpcCwgKHZvaWQgKiljdXIsCisJCSh2b2lkICopYTAsICh2b2lkICopYTEsICh2b2lkICopYTIsICh2b2lkICopYTMsCisJCSh2b2lkICopYTQsICh2b2lkICopYTUsICh2b2lkICopYTYsICh2b2lkICopYTcsCisJCSh2b2lkICopYTgsICh2b2lkICopYTksICh2b2lkICopYTEwKTsKK30KKy8qCisgKiBBZGQgYSB0cmFjZSBidWZmZXIgZW50cnkgZm9yIGFyZ3VtZW50cywgZm9yIGEgYnVmZmVyICYgMSBpbnRlZ2VyIGFyZy4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWJ0X3RyYWNlX2FyZ2JpKAorCWNoYXIJCSpmdW5jLAorCXhmc19idHJlZV9jdXJfdAkqY3VyLAorCXhmc19idWZfdAkqYiwKKwlpbnQJCWksCisJaW50CQlsaW5lKQoreworCXhmc19ibWJ0X3RyYWNlX2VudGVyKGZ1bmMsIGN1ciwgQVJHUywgWEZTX0JNQlRfS1RSQUNFX0FSR0JJLCBsaW5lLAorCQkoX19wc3Vuc2lnbmVkX3QpYiwgaSwgMCwgMCwKKwkJMCwgMCwgMCwgMCwKKwkJMCwgMCwgMCk7Cit9CisKKy8qCisgKiBBZGQgYSB0cmFjZSBidWZmZXIgZW50cnkgZm9yIGFyZ3VtZW50cywgZm9yIGEgYnVmZmVyICYgMiBpbnRlZ2VyIGFyZ3MuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1idF90cmFjZV9hcmdiaWkoCisJY2hhcgkJKmZ1bmMsCisJeGZzX2J0cmVlX2N1cl90CSpjdXIsCisJeGZzX2J1Zl90CSpiLAorCWludAkJaTAsCisJaW50CQlpMSwKKwlpbnQJCWxpbmUpCit7CisJeGZzX2JtYnRfdHJhY2VfZW50ZXIoZnVuYywgY3VyLCBBUkdTLCBYRlNfQk1CVF9LVFJBQ0VfQVJHQklJLCBsaW5lLAorCQkoX19wc3Vuc2lnbmVkX3QpYiwgaTAsIGkxLCAwLAorCQkwLCAwLCAwLCAwLAorCQkwLCAwLCAwKTsKK30KKworLyoKKyAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgYXJndW1lbnRzLCBmb3IgMyBibG9jay1sZW5ndGggYXJncworICogYW5kIGFuIGludGVnZXIgYXJnLgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYnRfdHJhY2VfYXJnZmZmaSgKKwljaGFyCQkJKmZ1bmMsCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAorCXhmc19kZmlsb2ZmX3QJCW8sCisJeGZzX2Rmc2Jub190CQliLAorCXhmc19kZmlsYmxrc190CQlpLAorCWludAkJCWosCisJaW50CQkJbGluZSkKK3sKKwl4ZnNfYm1idF90cmFjZV9lbnRlcihmdW5jLCBjdXIsIEFSR1MsIFhGU19CTUJUX0tUUkFDRV9BUkdGRkZJLCBsaW5lLAorCQlvID4+IDMyLCAoaW50KW8sIGIgPj4gMzIsIChpbnQpYiwKKwkJaSA+PiAzMiwgKGludClpLCAoaW50KWosIDAsCisJCTAsIDAsIDApOworfQorCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhcmd1bWVudHMsIGZvciBvbmUgaW50ZWdlciBhcmcuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1idF90cmFjZV9hcmdpKAorCWNoYXIJCSpmdW5jLAorCXhmc19idHJlZV9jdXJfdAkqY3VyLAorCWludAkJaSwKKwlpbnQJCWxpbmUpCit7CisJeGZzX2JtYnRfdHJhY2VfZW50ZXIoZnVuYywgY3VyLCBBUkdTLCBYRlNfQk1CVF9LVFJBQ0VfQVJHSSwgbGluZSwKKwkJaSwgMCwgMCwgMCwKKwkJMCwgMCwgMCwgMCwKKwkJMCwgMCwgMCk7Cit9CisKKy8qCisgKiBBZGQgYSB0cmFjZSBidWZmZXIgZW50cnkgZm9yIGFyZ3VtZW50cywgZm9yIGludCwgZnNibG9jaywga2V5LgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYnRfdHJhY2VfYXJnaWZrKAorCWNoYXIJCQkqZnVuYywKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCisJaW50CQkJaSwKKwl4ZnNfZnNibG9ja190CQlmLAorCXhmc19ibWJ0X2tleV90CQkqaywKKwlpbnQJCQlsaW5lKQoreworCXhmc19kZnNibm9fdAkJZDsKKwl4ZnNfZGZpbG9mZl90CQlvOworCisJZCA9ICh4ZnNfZGZzYm5vX3QpZjsKKwlvID0gSU5UX0dFVChrLT5icl9zdGFydG9mZiwgQVJDSF9DT05WRVJUKTsKKwl4ZnNfYm1idF90cmFjZV9lbnRlcihmdW5jLCBjdXIsIEFSR1MsIFhGU19CTUJUX0tUUkFDRV9BUkdJRkssIGxpbmUsCisJCWksIGQgPj4gMzIsIChpbnQpZCwgbyA+PiAzMiwKKwkJKGludClvLCAwLCAwLCAwLAorCQkwLCAwLCAwKTsKK30KKworLyoKKyAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgYXJndW1lbnRzLCBmb3IgaW50LCBmc2Jsb2NrLCByZWMuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1idF90cmFjZV9hcmdpZnIoCisJY2hhcgkJCSpmdW5jLAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwKKwlpbnQJCQlpLAorCXhmc19mc2Jsb2NrX3QJCWYsCisJeGZzX2JtYnRfcmVjX3QJCSpyLAorCWludAkJCWxpbmUpCit7CisJeGZzX2Rmc2Jub190CQliOworCXhmc19kZmlsYmxrc190CQljOworCXhmc19kZnNibm9fdAkJZDsKKwl4ZnNfZGZpbG9mZl90CQlvOworCXhmc19ibWJ0X2lyZWNfdAkJczsKKworCWQgPSAoeGZzX2Rmc2Jub190KWY7CisJeGZzX2JtYnRfZGlza19nZXRfYWxsKHIsICZzKTsKKwlvID0gKHhmc19kZmlsb2ZmX3Qpcy5icl9zdGFydG9mZjsKKwliID0gKHhmc19kZnNibm9fdClzLmJyX3N0YXJ0YmxvY2s7CisJYyA9IHMuYnJfYmxvY2tjb3VudDsKKwl4ZnNfYm1idF90cmFjZV9lbnRlcihmdW5jLCBjdXIsIEFSR1MsIFhGU19CTUJUX0tUUkFDRV9BUkdJRlIsIGxpbmUsCisJCWksIGQgPj4gMzIsIChpbnQpZCwgbyA+PiAzMiwKKwkJKGludClvLCBiID4+IDMyLCAoaW50KWIsIGMgPj4gMzIsCisJCShpbnQpYywgMCwgMCk7Cit9CisKKy8qCisgKiBBZGQgYSB0cmFjZSBidWZmZXIgZW50cnkgZm9yIGFyZ3VtZW50cywgZm9yIGludCwga2V5LgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYnRfdHJhY2VfYXJnaWsoCisJY2hhcgkJCSpmdW5jLAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwKKwlpbnQJCQlpLAorCXhmc19ibWJ0X2tleV90CQkqaywKKwlpbnQJCQlsaW5lKQoreworCXhmc19kZmlsb2ZmX3QJCW87CisKKwlvID0gSU5UX0dFVChrLT5icl9zdGFydG9mZiwgQVJDSF9DT05WRVJUKTsKKwl4ZnNfYm1idF90cmFjZV9lbnRlcihmdW5jLCBjdXIsIEFSR1MsIFhGU19CTUJUX0tUUkFDRV9BUkdJRkssIGxpbmUsCisJCWksIG8gPj4gMzIsIChpbnQpbywgMCwKKwkJMCwgMCwgMCwgMCwKKwkJMCwgMCwgMCk7Cit9CisKKy8qCisgKiBBZGQgYSB0cmFjZSBidWZmZXIgZW50cnkgZm9yIHRoZSBjdXJzb3Ivb3BlcmF0aW9uLgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYnRfdHJhY2VfY3Vyc29yKAorCWNoYXIJCSpmdW5jLAorCXhmc19idHJlZV9jdXJfdAkqY3VyLAorCWNoYXIJCSpzLAorCWludAkJbGluZSkKK3sKKwl4ZnNfYm1idF9yZWNfdAlyOworCisJeGZzX2JtYnRfc2V0X2FsbCgmciwgJmN1ci0+YmNfcmVjLmIpOworCXhmc19ibWJ0X3RyYWNlX2VudGVyKGZ1bmMsIGN1ciwgcywgWEZTX0JNQlRfS1RSQUNFX0NVUiwgbGluZSwKKwkJKGN1ci0+YmNfbmxldmVscyA8PCAyNCkgfCAoY3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgPDwgMTYpIHwKKwkJY3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkLAorCQlJTlRfR0VUKHIubDAsIEFSQ0hfQ09OVkVSVCkgPj4gMzIsIChpbnQpSU5UX0dFVChyLmwwLCBBUkNIX0NPTlZFUlQpLCBJTlRfR0VUKHIubDEsIEFSQ0hfQ09OVkVSVCkgPj4gMzIsIChpbnQpSU5UX0dFVChyLmwxLCBBUkNIX0NPTlZFUlQpLAorCQkodW5zaWduZWQgbG9uZyljdXItPmJjX2J1ZnNbMF0sICh1bnNpZ25lZCBsb25nKWN1ci0+YmNfYnVmc1sxXSwKKwkJKHVuc2lnbmVkIGxvbmcpY3VyLT5iY19idWZzWzJdLCAodW5zaWduZWQgbG9uZyljdXItPmJjX2J1ZnNbM10sCisJCShjdXItPmJjX3B0cnNbMF0gPDwgMTYpIHwgY3VyLT5iY19wdHJzWzFdLAorCQkoY3VyLT5iY19wdHJzWzJdIDw8IDE2KSB8IGN1ci0+YmNfcHRyc1szXSk7Cit9CisKKyNkZWZpbmUJWEZTX0JNQlRfVFJBQ0VfQVJHQkkoYyxiLGkpCVwKKwl4ZnNfYm1idF90cmFjZV9hcmdiaShmbmFtZSwgYywgYiwgaSwgX19MSU5FX18pCisjZGVmaW5lCVhGU19CTUJUX1RSQUNFX0FSR0JJSShjLGIsaSxqKQlcCisJeGZzX2JtYnRfdHJhY2VfYXJnYmlpKGZuYW1lLCBjLCBiLCBpLCBqLCBfX0xJTkVfXykKKyNkZWZpbmUJWEZTX0JNQlRfVFJBQ0VfQVJHRkZGSShjLG8sYixpLGopCVwKKwl4ZnNfYm1idF90cmFjZV9hcmdmZmZpKGZuYW1lLCBjLCBvLCBiLCBpLCBqLCBfX0xJTkVfXykKKyNkZWZpbmUJWEZTX0JNQlRfVFJBQ0VfQVJHSShjLGkpCVwKKwl4ZnNfYm1idF90cmFjZV9hcmdpKGZuYW1lLCBjLCBpLCBfX0xJTkVfXykKKyNkZWZpbmUJWEZTX0JNQlRfVFJBQ0VfQVJHSUZLKGMsaSxmLGspCVwKKwl4ZnNfYm1idF90cmFjZV9hcmdpZmsoZm5hbWUsIGMsIGksIGYsIGssIF9fTElORV9fKQorI2RlZmluZQlYRlNfQk1CVF9UUkFDRV9BUkdJRlIoYyxpLGYscikJXAorCXhmc19ibWJ0X3RyYWNlX2FyZ2lmcihmbmFtZSwgYywgaSwgZiwgciwgX19MSU5FX18pCisjZGVmaW5lCVhGU19CTUJUX1RSQUNFX0FSR0lLKGMsaSxrKQlcCisJeGZzX2JtYnRfdHJhY2VfYXJnaWsoZm5hbWUsIGMsIGksIGssIF9fTElORV9fKQorI2RlZmluZQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoYyxzKQlcCisJeGZzX2JtYnRfdHJhY2VfY3Vyc29yKGZuYW1lLCBjLCBzLCBfX0xJTkVfXykKKyNlbHNlCisjZGVmaW5lCVhGU19CTUJUX1RSQUNFX0FSR0JJKGMsYixpKQorI2RlZmluZQlYRlNfQk1CVF9UUkFDRV9BUkdCSUkoYyxiLGksaikKKyNkZWZpbmUJWEZTX0JNQlRfVFJBQ0VfQVJHRkZGSShjLG8sYixpLGopCisjZGVmaW5lCVhGU19CTUJUX1RSQUNFX0FSR0koYyxpKQorI2RlZmluZQlYRlNfQk1CVF9UUkFDRV9BUkdJRksoYyxpLGYsaykKKyNkZWZpbmUJWEZTX0JNQlRfVFJBQ0VfQVJHSUZSKGMsaSxmLHIpCisjZGVmaW5lCVhGU19CTUJUX1RSQUNFX0FSR0lLKGMsaSxrKQorI2RlZmluZQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoYyxzKQorI2VuZGlmCS8qIFhGU19CTUJUX1RSQUNFICovCisKKworLyoKKyAqIEludGVybmFsIGZ1bmN0aW9ucy4KKyAqLworCisvKgorICogRGVsZXRlIHJlY29yZCBwb2ludGVkIHRvIGJ5IGN1ci9sZXZlbC4KKyAqLworU1RBVElDIGludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWJ0X2RlbHJlYygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCisJaW50CQkJbGV2ZWwsCisJaW50CQkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwl4ZnNfYm1idF9ibG9ja190CSpibG9jazsJCS8qIGJtYXAgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfZnNibG9ja190CQlibm87CQkvKiBmcy1yZWxhdGl2ZSBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJCSpicDsJCS8qIGJ1ZmZlciBmb3IgYmxvY2sgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworI2lmZGVmIFhGU19CTUJUX1RSQUNFCisJc3RhdGljIGNoYXIJCWZuYW1lW10gPSAieGZzX2JtYnRfZGVscmVjIjsKKyNlbmRpZgorCWludAkJCWk7CQkvKiBsb29wIGNvdW50ZXIgKi8KKwlpbnQJCQlqOwkJLyogdGVtcCBzdGF0ZSAqLworCXhmc19ibWJ0X2tleV90CQlrZXk7CQkvKiBibWFwIGJ0cmVlIGtleSAqLworCXhmc19ibWJ0X2tleV90CQkqa3A9TlVMTDsJLyogcG9pbnRlciB0byBibWFwIGJ0cmVlIGtleSAqLworCXhmc19mc2Jsb2NrX3QJCWxibm87CQkvKiBsZWZ0IHNpYmxpbmcgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CQkqbGJwOwkJLyogbGVmdCBidWZmZXIgcG9pbnRlciAqLworCXhmc19ibWJ0X2Jsb2NrX3QJKmxlZnQ7CQkvKiBsZWZ0IGJ0cmVlIGJsb2NrICovCisJeGZzX2JtYnRfa2V5X3QJCSpsa3A7CQkvKiBsZWZ0IGJ0cmVlIGtleSAqLworCXhmc19ibWJ0X3B0cl90CQkqbHBwOwkJLyogbGVmdCBhZGRyZXNzIHBvaW50ZXIgKi8KKwlpbnQJCQlscmVjcz0wOwkvKiBsZWZ0IHJlY29yZCBjb3VudCAqLworCXhmc19ibWJ0X3JlY190CQkqbHJwOwkJLyogbGVmdCByZWNvcmQgcG9pbnRlciAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc19ibWJ0X3B0cl90CQkqcHA7CQkvKiBwb2ludGVyIHRvIGJtYXAgYmxvY2sgYWRkciAqLworCWludAkJCXB0cjsJCS8qIGtleS9yZWNvcmQgaW5kZXggKi8KKwl4ZnNfZnNibG9ja190CQlyYm5vOwkJLyogcmlnaHQgc2libGluZyBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJCSpyYnA7CQkvKiByaWdodCBidWZmZXIgcG9pbnRlciAqLworCXhmc19ibWJ0X2Jsb2NrX3QJKnJpZ2h0OwkJLyogcmlnaHQgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfYm1idF9rZXlfdAkJKnJrcDsJCS8qIHJpZ2h0IGJ0cmVlIGtleSAqLworCXhmc19ibWJ0X3JlY190CQkqcnA7CQkvKiBwb2ludGVyIHRvIGJtYXAgYnRyZWUgcmVjICovCisJeGZzX2JtYnRfcHRyX3QJCSpycHA7CQkvKiByaWdodCBhZGRyZXNzIHBvaW50ZXIgKi8KKwl4ZnNfYm1idF9ibG9ja190CSpycmJsb2NrOwkvKiByaWdodC1yaWdodCBidHJlZSBibG9jayAqLworCXhmc19idWZfdAkJKnJyYnA7CQkvKiByaWdodC1yaWdodCBidWZmZXIgcG9pbnRlciAqLworCWludAkJCXJyZWNzPTA7CS8qIHJpZ2h0IHJlY29yZCBjb3VudCAqLworCXhmc19ibWJ0X3JlY190CQkqcnJwOwkJLyogcmlnaHQgcmVjb3JkIHBvaW50ZXIgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJCSp0Y3VyOwkJLyogdGVtcG9yYXJ5IGJ0cmVlIGN1cnNvciAqLworCWludAkJCW51bXJlY3M7CS8qIHRlbXBvcmFyeSBudW1yZWMgY291bnQgKi8KKwlpbnQJCQludW1scmVjcywgbnVtcnJlY3M7CisKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7CisJWEZTX0JNQlRfVFJBQ0VfQVJHSShjdXIsIGxldmVsKTsKKwlwdHIgPSBjdXItPmJjX3B0cnNbbGV2ZWxdOworCXRjdXIgPSAoeGZzX2J0cmVlX2N1cl90ICopMDsKKwlpZiAocHRyID09IDApIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWJsb2NrID0geGZzX2JtYnRfZ2V0X2Jsb2NrKGN1ciwgbGV2ZWwsICZicCk7CisJbnVtcmVjcyA9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCWdvdG8gZXJyb3IwOworCX0KKyNlbmRpZgorCWlmIChwdHIgPiBudW1yZWNzKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwlYRlNfU1RBVFNfSU5DKHhzX2JtYnRfZGVscmVjKTsKKwlpZiAobGV2ZWwgPiAwKSB7CisJCWtwID0gWEZTX0JNQVBfS0VZX0lBRERSKGJsb2NrLCAxLCBjdXIpOworCQlwcCA9IFhGU19CTUFQX1BUUl9JQUREUihibG9jaywgMSwgY3VyKTsKKyNpZmRlZiBERUJVRworCQlmb3IgKGkgPSBwdHI7IGkgPCBudW1yZWNzOyBpKyspIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbHB0cihjdXIsIElOVF9HRVQocHBbaV0sIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpIHsKKwkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQkJZ290byBlcnJvcjA7CisJCQl9CisJCX0KKyNlbmRpZgorCQlpZiAocHRyIDwgbnVtcmVjcykgeworCQkJbWVtbW92ZSgma3BbcHRyIC0gMV0sICZrcFtwdHJdLAorCQkJCShudW1yZWNzIC0gcHRyKSAqIHNpemVvZigqa3ApKTsKKwkJCW1lbW1vdmUoJnBwW3B0ciAtIDFdLCAmcHBbcHRyXSwgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJCQkobnVtcmVjcyAtIHB0cikgKiBzaXplb2YoKnBwKSk7CisJCQl4ZnNfYm1idF9sb2dfcHRycyhjdXIsIGJwLCBwdHIsIG51bXJlY3MgLSAxKTsKKwkJCXhmc19ibWJ0X2xvZ19rZXlzKGN1ciwgYnAsIHB0ciwgbnVtcmVjcyAtIDEpOworCQl9CisJfSBlbHNlIHsKKwkJcnAgPSBYRlNfQk1BUF9SRUNfSUFERFIoYmxvY2ssIDEsIGN1cik7CisJCWlmIChwdHIgPCBudW1yZWNzKSB7CisJCQltZW1tb3ZlKCZycFtwdHIgLSAxXSwgJnJwW3B0cl0sCisJCQkJKG51bXJlY3MgLSBwdHIpICogc2l6ZW9mKCpycCkpOworCQkJeGZzX2JtYnRfbG9nX3JlY3MoY3VyLCBicCwgcHRyLCBudW1yZWNzIC0gMSk7CisJCX0KKwkJaWYgKHB0ciA9PSAxKSB7CisJCQlJTlRfU0VUKGtleS5icl9zdGFydG9mZiwgQVJDSF9DT05WRVJULCB4ZnNfYm1idF9kaXNrX2dldF9zdGFydG9mZihycCkpOworCQkJa3AgPSAma2V5OworCQl9CisJfQorCW51bXJlY3MtLTsKKwlJTlRfU0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIG51bXJlY3MpOworCXhmc19ibWJ0X2xvZ19ibG9jayhjdXIsIGJwLCBYRlNfQkJfTlVNUkVDUyk7CisJLyoKKwkgKiBXZSdyZSBhdCB0aGUgcm9vdCBsZXZlbC4KKwkgKiBGaXJzdCwgc2hyaW5rIHRoZSByb290IGJsb2NrIGluLW1lbW9yeS4KKwkgKiBUcnkgdG8gZ2V0IHJpZCBvZiB0aGUgbmV4dCBsZXZlbCBkb3duLgorCSAqIElmIHdlIGNhbid0IHRoZW4gdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZG8uCisJICovCisJaWYgKGxldmVsID09IGN1ci0+YmNfbmxldmVscyAtIDEpIHsKKwkJeGZzX2lyb290X3JlYWxsb2MoY3VyLT5iY19wcml2YXRlLmIuaXAsIC0xLAorCQkJY3VyLT5iY19wcml2YXRlLmIud2hpY2hmb3JrKTsKKwkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2tpbGxyb290KGN1cikpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQlpZiAobGV2ZWwgPiAwICYmIChlcnJvciA9IHhmc19ibWJ0X2RlY3JlbWVudChjdXIsIGxldmVsLCAmaikpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJKnN0YXQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHB0ciA9PSAxICYmIChlcnJvciA9IHhmc19ibWJ0X3VwZGtleShjdXIsIGtwLCBsZXZlbCArIDEpKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCWdvdG8gZXJyb3IwOworCX0KKwlpZiAobnVtcmVjcyA+PSBYRlNfQk1BUF9CTE9DS19JTUlOUkVDUyhsZXZlbCwgY3VyKSkgeworCQlpZiAobGV2ZWwgPiAwICYmIChlcnJvciA9IHhmc19ibWJ0X2RlY3JlbWVudChjdXIsIGxldmVsLCAmaikpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJKnN0YXQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJcmJubyA9IElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpOworCWxibm8gPSBJTlRfR0VUKGJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpOworCS8qCisJICogT25lIGNoaWxkIG9mIHJvb3QsIG5lZWQgdG8gZ2V0IGEgY2hhbmNlIHRvIGNvcHkgaXRzIGNvbnRlbnRzCisJICogaW50byB0aGUgcm9vdCBhbmQgZGVsZXRlIGl0LiBDYW4ndCBnbyB1cCB0byBuZXh0IGxldmVsLAorCSAqIHRoZXJlJ3Mgbm90aGluZyB0byBkZWxldGUgdGhlcmUuCisJICovCisJaWYgKGxibm8gPT0gTlVMTEZTQkxPQ0sgJiYgcmJubyA9PSBOVUxMRlNCTE9DSyAmJgorCSAgICBsZXZlbCA9PSBjdXItPmJjX25sZXZlbHMgLSAyKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9raWxscm9vdChjdXIpKSkgeworCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJZ290byBlcnJvcjA7CisJCX0KKwkJaWYgKGxldmVsID4gMCAmJiAoZXJyb3IgPSB4ZnNfYm1idF9kZWNyZW1lbnQoY3VyLCBsZXZlbCwgJmkpKSkgeworCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJZ290byBlcnJvcjA7CisJCX0KKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJCSpzdGF0ID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCUFTU0VSVChyYm5vICE9IE5VTExGU0JMT0NLIHx8IGxibm8gIT0gTlVMTEZTQkxPQ0spOworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZHVwX2N1cnNvcihjdXIsICZ0Y3VyKSkpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQlnb3RvIGVycm9yMDsKKwl9CisJYm5vID0gTlVMTEZTQkxPQ0s7CisJaWYgKHJibm8gIT0gTlVMTEZTQkxPQ0spIHsKKwkJaSA9IHhmc19idHJlZV9sYXN0cmVjKHRjdXIsIGxldmVsKTsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQlpZiAoKGVycm9yID0geGZzX2JtYnRfaW5jcmVtZW50KHRjdXIsIGxldmVsLCAmaSkpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCWkgPSB4ZnNfYnRyZWVfbGFzdHJlYyh0Y3VyLCBsZXZlbCk7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJcmJwID0gdGN1ci0+YmNfYnVmc1tsZXZlbF07CisJCXJpZ2h0ID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKHJicCk7CisjaWZkZWYgREVCVUcKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCByaWdodCwgbGV2ZWwsIHJicCkpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorI2VuZGlmCisJCWJubyA9IElOVF9HRVQocmlnaHQtPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCk7CisJCWlmIChJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gMSA+PQorCQkgICAgWEZTX0JNQVBfQkxPQ0tfSU1JTlJFQ1MobGV2ZWwsIGN1cikpIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sc2hpZnQodGN1ciwgbGV2ZWwsICZpKSkpIHsKKwkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQkJZ290byBlcnJvcjA7CisJCQl9CisJCQlpZiAoaSkgeworCQkJCUFTU0VSVChJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID49CisJCQkJICAgICAgIFhGU19CTUFQX0JMT0NLX0lNSU5SRUNTKGxldmVsLCB0Y3VyKSk7CisJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCQkJCXRjdXIgPSBOVUxMOworCQkJCWlmIChsZXZlbCA+IDApIHsKKwkJCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlY3JlbWVudChjdXIsCisJCQkJCQkJbGV2ZWwsICZpKSkpIHsKKwkJCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsCisJCQkJCQkJRVJST1IpOworCQkJCQkJZ290byBlcnJvcjA7CisJCQkJCX0KKwkJCQl9CisJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJCQkJKnN0YXQgPSAxOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCXJyZWNzID0gSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwkJaWYgKGxibm8gIT0gTlVMTEZTQkxPQ0spIHsKKwkJCWkgPSB4ZnNfYnRyZWVfZmlyc3RyZWModGN1ciwgbGV2ZWwpOworCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlY3JlbWVudCh0Y3VyLCBsZXZlbCwgJmkpKSkgeworCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCQlnb3RvIGVycm9yMDsKKwkJCX0KKwkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJfQorCX0KKwlpZiAobGJubyAhPSBOVUxMRlNCTE9DSykgeworCQlpID0geGZzX2J0cmVlX2ZpcnN0cmVjKHRjdXIsIGxldmVsKTsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQkvKgorCQkgKiBkZWNyZW1lbnQgdG8gbGFzdCBpbiBibG9jaworCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlY3JlbWVudCh0Y3VyLCBsZXZlbCwgJmkpKSkgeworCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJZ290byBlcnJvcjA7CisJCX0KKwkJaSA9IHhmc19idHJlZV9maXJzdHJlYyh0Y3VyLCBsZXZlbCk7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJbGJwID0gdGN1ci0+YmNfYnVmc1tsZXZlbF07CisJCWxlZnQgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0sobGJwKTsKKyNpZmRlZiBERUJVRworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIGxlZnQsIGxldmVsLCBsYnApKSkgeworCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJZ290byBlcnJvcjA7CisJCX0KKyNlbmRpZgorCQlibm8gPSBJTlRfR0VUKGxlZnQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpOworCQlpZiAoSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gMSA+PQorCQkgICAgWEZTX0JNQVBfQkxPQ0tfSU1JTlJFQ1MobGV2ZWwsIGN1cikpIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9yc2hpZnQodGN1ciwgbGV2ZWwsICZpKSkpIHsKKwkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQkJZ290byBlcnJvcjA7CisJCQl9CisJCQlpZiAoaSkgeworCQkJCUFTU0VSVChJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID49CisJCQkJICAgICAgIFhGU19CTUFQX0JMT0NLX0lNSU5SRUNTKGxldmVsLCB0Y3VyKSk7CisJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCQkJCXRjdXIgPSBOVUxMOworCQkJCWlmIChsZXZlbCA9PSAwKQorCQkJCQljdXItPmJjX3B0cnNbMF0rKzsKKwkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJCQkqc3RhdCA9IDE7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJbHJlY3MgPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJfQorCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwl0Y3VyID0gTlVMTDsKKwltcCA9IGN1ci0+YmNfbXA7CisJQVNTRVJUKGJubyAhPSBOVUxMRlNCTE9DSyk7CisJaWYgKGxibm8gIT0gTlVMTEZTQkxPQ0sgJiYKKwkgICAgbHJlY3MgKyBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIDw9IFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJCXJibm8gPSBibm87CisJCXJpZ2h0ID0gYmxvY2s7CisJCXJicCA9IGJwOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChtcCwgY3VyLT5iY190cCwgbGJubywgMCwgJmxicCwKKwkJCQlYRlNfQk1BUF9CVFJFRV9SRUYpKSkgeworCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJZ290byBlcnJvcjA7CisJCX0KKwkJbGVmdCA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhsYnApOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIGxlZnQsIGxldmVsLCBsYnApKSkgeworCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJZ290byBlcnJvcjA7CisJCX0KKwl9IGVsc2UgaWYgKHJibm8gIT0gTlVMTEZTQkxPQ0sgJiYKKwkJICAgcnJlY3MgKyBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIDw9CisJCSAgIFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJCWxibm8gPSBibm87CisJCWxlZnQgPSBibG9jazsKKwkJbGJwID0gYnA7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCBjdXItPmJjX3RwLCByYm5vLCAwLCAmcmJwLAorCQkJCVhGU19CTUFQX0JUUkVFX1JFRikpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQlyaWdodCA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhyYnApOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIHJpZ2h0LCBsZXZlbCwgcmJwKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJCWxyZWNzID0gSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCX0gZWxzZSB7CisJCWlmIChsZXZlbCA+IDAgJiYgKGVycm9yID0geGZzX2JtYnRfZGVjcmVtZW50KGN1ciwgbGV2ZWwsICZpKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9IDE7CisJCXJldHVybiAwOworCX0KKwludW1scmVjcyA9IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwludW1ycmVjcyA9IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJaWYgKGxldmVsID4gMCkgeworCQlsa3AgPSBYRlNfQk1BUF9LRVlfSUFERFIobGVmdCwgbnVtbHJlY3MgKyAxLCBjdXIpOworCQlscHAgPSBYRlNfQk1BUF9QVFJfSUFERFIobGVmdCwgbnVtbHJlY3MgKyAxLCBjdXIpOworCQlya3AgPSBYRlNfQk1BUF9LRVlfSUFERFIocmlnaHQsIDEsIGN1cik7CisJCXJwcCA9IFhGU19CTUFQX1BUUl9JQUREUihyaWdodCwgMSwgY3VyKTsKKyNpZmRlZiBERUJVRworCQlmb3IgKGkgPSAwOyBpIDwgbnVtcnJlY3M7IGkrKykgeworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19scHRyKGN1ciwgSU5UX0dFVChycHBbaV0sIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpIHsKKwkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQkJZ290byBlcnJvcjA7CisJCQl9CisJCX0KKyNlbmRpZgorCQltZW1jcHkobGtwLCBya3AsIG51bXJyZWNzICogc2l6ZW9mKCpsa3ApKTsKKwkJbWVtY3B5KGxwcCwgcnBwLCBudW1ycmVjcyAqIHNpemVvZigqbHBwKSk7CisJCXhmc19ibWJ0X2xvZ19rZXlzKGN1ciwgbGJwLCBudW1scmVjcyArIDEsIG51bWxyZWNzICsgbnVtcnJlY3MpOworCQl4ZnNfYm1idF9sb2dfcHRycyhjdXIsIGxicCwgbnVtbHJlY3MgKyAxLCBudW1scmVjcyArIG51bXJyZWNzKTsKKwl9IGVsc2UgeworCQlscnAgPSBYRlNfQk1BUF9SRUNfSUFERFIobGVmdCwgbnVtbHJlY3MgKyAxLCBjdXIpOworCQlycnAgPSBYRlNfQk1BUF9SRUNfSUFERFIocmlnaHQsIDEsIGN1cik7CisJCW1lbWNweShscnAsIHJycCwgbnVtcnJlY3MgKiBzaXplb2YoKmxycCkpOworCQl4ZnNfYm1idF9sb2dfcmVjcyhjdXIsIGxicCwgbnVtbHJlY3MgKyAxLCBudW1scmVjcyArIG51bXJyZWNzKTsKKwl9CisJSU5UX01PRChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIG51bXJyZWNzKTsKKwlsZWZ0LT5iYl9yaWdodHNpYiA9IHJpZ2h0LT5iYl9yaWdodHNpYjsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCBsYnAsIFhGU19CQl9SSUdIVFNJQiB8IFhGU19CQl9OVU1SRUNTKTsKKwlpZiAoSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSAhPSBOVUxMREZTQk5PKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCBjdXItPmJjX3RwLAorCQkJCUlOVF9HRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCksCisJCQkJMCwgJnJyYnAsIFhGU19CTUFQX0JUUkVFX1JFRikpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQlycmJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKHJyYnApOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIHJyYmxvY2ssIGxldmVsLCBycmJwKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJCUlOVF9TRVQocnJibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJULCBsYm5vKTsKKwkJeGZzX2JtYnRfbG9nX2Jsb2NrKGN1ciwgcnJicCwgWEZTX0JCX0xFRlRTSUIpOworCX0KKwl4ZnNfYm1hcF9hZGRfZnJlZShYRlNfREFERFJfVE9fRlNCKG1wLCBYRlNfQlVGX0FERFIocmJwKSksIDEsCisJCWN1ci0+YmNfcHJpdmF0ZS5iLmZsaXN0LCBtcCk7CisJY3VyLT5iY19wcml2YXRlLmIuaXAtPmlfZC5kaV9uYmxvY2tzLS07CisJeGZzX3RyYW5zX2xvZ19pbm9kZShjdXItPmJjX3RwLCBjdXItPmJjX3ByaXZhdGUuYi5pcCwgWEZTX0lMT0dfQ09SRSk7CisJWEZTX1RSQU5TX01PRF9EUVVPVF9CWUlOTyhtcCwgY3VyLT5iY190cCwgY3VyLT5iY19wcml2YXRlLmIuaXAsCisJCQlYRlNfVFJBTlNfRFFfQkNPVU5ULCAtMUwpOworCXhmc190cmFuc19iaW52YWwoY3VyLT5iY190cCwgcmJwKTsKKwlpZiAoYnAgIT0gbGJwKSB7CisJCWN1ci0+YmNfYnVmc1tsZXZlbF0gPSBsYnA7CisJCWN1ci0+YmNfcHRyc1tsZXZlbF0gKz0gbHJlY3M7CisJCWN1ci0+YmNfcmFbbGV2ZWxdID0gMDsKKwl9IGVsc2UgaWYgKChlcnJvciA9IHhmc19ibWJ0X2luY3JlbWVudChjdXIsIGxldmVsICsgMSwgJmkpKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCWdvdG8gZXJyb3IwOworCX0KKwlpZiAobGV2ZWwgPiAwKQorCQljdXItPmJjX3B0cnNbbGV2ZWxdLS07CisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJKnN0YXQgPSAyOworCXJldHVybiAwOworCitlcnJvcjA6CisJaWYgKHRjdXIpCisJCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsIFhGU19CVFJFRV9FUlJPUik7CisJcmV0dXJuIGVycm9yOworfQorCisjaWZkZWYgREVCVUcKKy8qCisgKiBHZXQgdGhlIGRhdGEgZnJvbSB0aGUgcG9pbnRlZC10byByZWNvcmQuCisgKi8KK2ludAoreGZzX2JtYnRfZ2V0X3JlYygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCisJeGZzX2ZpbGVvZmZfdAkJKm9mZiwKKwl4ZnNfZnNibG9ja190CQkqYm5vLAorCXhmc19maWxibGtzX3QJCSpsZW4sCisJeGZzX2V4bnRzdF90CQkqc3RhdGUsCisJaW50CQkJKnN0YXQpCit7CisJeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7CisJeGZzX2J1Zl90CQkqYnA7CisjaWZkZWYgREVCVUcKKwlpbnQJCQllcnJvcjsKKyNlbmRpZgorCWludAkJCXB0cjsKKwl4ZnNfYm1idF9yZWNfdAkJKnJwOworCisJYmxvY2sgPSB4ZnNfYm1idF9nZXRfYmxvY2soY3VyLCAwLCAmYnApOworCXB0ciA9IGN1ci0+YmNfcHRyc1swXTsKKyNpZmRlZiBERUJVRworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgYmxvY2ssIDAsIGJwKSkpCisJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCWlmIChwdHIgPiBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIHx8IHB0ciA8PSAwKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCXJwID0gWEZTX0JNQVBfUkVDX0lBRERSKGJsb2NrLCBwdHIsIGN1cik7CisJKm9mZiA9IHhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0b2ZmKHJwKTsKKwkqYm5vID0geGZzX2JtYnRfZGlza19nZXRfc3RhcnRibG9jayhycCk7CisJKmxlbiA9IHhmc19ibWJ0X2Rpc2tfZ2V0X2Jsb2NrY291bnQocnApOworCSpzdGF0ZSA9IHhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXRlKHJwKTsKKwkqc3RhdCA9IDE7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyoKKyAqIEluc2VydCBvbmUgcmVjb3JkL2xldmVsLiAgUmV0dXJuIGluZm9ybWF0aW9uIHRvIHRoZSBjYWxsZXIKKyAqIGFsbG93aW5nIHRoZSBuZXh0IGxldmVsIHVwIHRvIHByb2NlZWQgaWYgbmVjZXNzYXJ5LgorICovCitTVEFUSUMgaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2JtYnRfaW5zcmVjKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwKKwlpbnQJCQlsZXZlbCwKKwl4ZnNfZnNibG9ja190CQkqYm5vcCwKKwl4ZnNfYm1idF9yZWNfdAkJKnJlY3AsCisJeGZzX2J0cmVlX2N1cl90CQkqKmN1cnAsCisJaW50CQkJKnN0YXQpCQkvKiBuby1nby9kb25lL2NvbnRpbnVlICovCit7CisJeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7CQkvKiBibWFwIGJ0cmVlIGJsb2NrICovCisJeGZzX2J1Zl90CQkqYnA7CQkvKiBidWZmZXIgZm9yIGJsb2NrICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKyNpZmRlZiBYRlNfQk1CVF9UUkFDRQorCXN0YXRpYyBjaGFyCQlmbmFtZVtdID0gInhmc19ibWJ0X2luc3JlYyI7CisjZW5kaWYKKwlpbnQJCQlpOwkJLyogbG9vcCBpbmRleCAqLworCXhmc19ibWJ0X2tleV90CQlrZXk7CQkvKiBibWFwIGJ0cmVlIGtleSAqLworCXhmc19ibWJ0X2tleV90CQkqa3A9TlVMTDsJLyogcG9pbnRlciB0byBibWFwIGJ0cmVlIGtleSAqLworCWludAkJCWxvZ2ZsYWdzOwkvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCisJeGZzX2ZzYmxvY2tfdAkJbmJubzsJCS8qIG5ldyBibG9jayBudW1iZXIgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqbmN1cjsJCS8qIG5ldyBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYm1idF9rZXlfdAkJbmtleTsJCS8qIG5ldyBidHJlZSBrZXkgdmFsdWUgKi8KKwl4ZnNfYm1idF9yZWNfdAkJbnJlYzsJCS8qIG5ldyByZWNvcmQgY291bnQgKi8KKwlpbnQJCQlvcHRyOwkJLyogb2xkIGtleS9yZWNvcmQgaW5kZXggKi8KKwl4ZnNfYm1idF9wdHJfdAkJKnBwOwkJLyogcG9pbnRlciB0byBibWFwIGJsb2NrIGFkZHIgKi8KKwlpbnQJCQlwdHI7CQkvKiBrZXkvcmVjb3JkIGluZGV4ICovCisJeGZzX2JtYnRfcmVjX3QJCSpycD1OVUxMOwkvKiBwb2ludGVyIHRvIGJtYXAgYnRyZWUgcmVjICovCisJaW50CQkJbnVtcmVjczsKKworCUFTU0VSVChsZXZlbCA8IGN1ci0+YmNfbmxldmVscyk7CisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRU5UUlkpOworCVhGU19CTUJUX1RSQUNFX0FSR0lGUihjdXIsIGxldmVsLCAqYm5vcCwgcmVjcCk7CisJbmN1ciA9ICh4ZnNfYnRyZWVfY3VyX3QgKikwOworCUlOVF9TRVQoa2V5LmJyX3N0YXJ0b2ZmLCBBUkNIX0NPTlZFUlQsCisJCXhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0b2ZmKHJlY3ApKTsKKwlvcHRyID0gcHRyID0gY3VyLT5iY19wdHJzW2xldmVsXTsKKwlpZiAocHRyID09IDApIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCVhGU19TVEFUU19JTkMoeHNfYm1idF9pbnNyZWMpOworCWJsb2NrID0geGZzX2JtYnRfZ2V0X2Jsb2NrKGN1ciwgbGV2ZWwsICZicCk7CisJbnVtcmVjcyA9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJaWYgKHB0ciA8PSBudW1yZWNzKSB7CisJCWlmIChsZXZlbCA9PSAwKSB7CisJCQlycCA9IFhGU19CTUFQX1JFQ19JQUREUihibG9jaywgcHRyLCBjdXIpOworCQkJeGZzX2J0cmVlX2NoZWNrX3JlYyhYRlNfQlROVU1fQk1BUCwgcmVjcCwgcnApOworCQl9IGVsc2UgeworCQkJa3AgPSBYRlNfQk1BUF9LRVlfSUFERFIoYmxvY2ssIHB0ciwgY3VyKTsKKwkJCXhmc19idHJlZV9jaGVja19rZXkoWEZTX0JUTlVNX0JNQVAsICZrZXksIGtwKTsKKwkJfQorCX0KKyNlbmRpZgorCW5ibm8gPSBOVUxMRlNCTE9DSzsKKwlpZiAobnVtcmVjcyA9PSBYRlNfQk1BUF9CTE9DS19JTUFYUkVDUyhsZXZlbCwgY3VyKSkgeworCQlpZiAobnVtcmVjcyA8IFhGU19CTUFQX0JMT0NLX0RNQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJCQkvKgorCQkJICogQSByb290IGJsb2NrLCB0aGF0IGNhbiBiZSBtYWRlIGJpZ2dlci4KKwkJCSAqLworCQkJeGZzX2lyb290X3JlYWxsb2MoY3VyLT5iY19wcml2YXRlLmIuaXAsIDEsCisJCQkJY3VyLT5iY19wcml2YXRlLmIud2hpY2hmb3JrKTsKKwkJCWJsb2NrID0geGZzX2JtYnRfZ2V0X2Jsb2NrKGN1ciwgbGV2ZWwsICZicCk7CisJCX0gZWxzZSBpZiAobGV2ZWwgPT0gY3VyLT5iY19ubGV2ZWxzIC0gMSkgeworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X25ld3Jvb3QoY3VyLCAmbG9nZmxhZ3MsIHN0YXQpKSB8fAorCQkJICAgICpzdGF0ID09IDApIHsKKwkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQkJeGZzX3RyYW5zX2xvZ19pbm9kZShjdXItPmJjX3RwLCBjdXItPmJjX3ByaXZhdGUuYi5pcCwKKwkJCQlsb2dmbGFncyk7CisJCQlibG9jayA9IHhmc19ibWJ0X2dldF9ibG9jayhjdXIsIGxldmVsLCAmYnApOworCQl9IGVsc2UgeworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3JzaGlmdChjdXIsIGxldmVsLCAmaSkpKSB7CisJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCWlmIChpKSB7CisJCQkJLyogbm90aGluZyAqLworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbHNoaWZ0KGN1ciwgbGV2ZWwsICZpKSkpIHsKKwkJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJCQlyZXR1cm4gZXJyb3I7CisJCQkJfQorCQkJCWlmIChpKSB7CisJCQkJCW9wdHIgPSBwdHIgPSBjdXItPmJjX3B0cnNbbGV2ZWxdOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9zcGxpdChjdXIsIGxldmVsLAorCQkJCQkJCSZuYm5vLCAmbmtleSwgJm5jdXIsCisJCQkJCQkJJmkpKSkgeworCQkJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwKKwkJCQkJCQlFUlJPUik7CisJCQkJCQlyZXR1cm4gZXJyb3I7CisJCQkJCX0KKwkJCQkJaWYgKGkpIHsKKwkJCQkJCWJsb2NrID0geGZzX2JtYnRfZ2V0X2Jsb2NrKAorCQkJCQkJCSAgICBjdXIsIGxldmVsLCAmYnApOworI2lmZGVmIERFQlVHCisJCQkJCQlpZiAoKGVycm9yID0KKwkJCQkJCSAgICB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwKKwkJCQkJCQkgICAgYmxvY2ssIGxldmVsLCBicCkpKSB7CisJCQkJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKAorCQkJCQkJCQljdXIsIEVSUk9SKTsKKwkJCQkJCQlyZXR1cm4gZXJyb3I7CisJCQkJCQl9CisjZW5kaWYKKwkJCQkJCXB0ciA9IGN1ci0+YmNfcHRyc1tsZXZlbF07CisJCQkJCQl4ZnNfYm1idF9kaXNrX3NldF9hbGxmKCZucmVjLAorCQkJCQkJCW5rZXkuYnJfc3RhcnRvZmYsIDAsIDAsCisJCQkJCQkJWEZTX0VYVF9OT1JNKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsCisJCQkJCQkJRVhJVCk7CisJCQkJCQkqc3RhdCA9IDA7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwludW1yZWNzID0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwlpZiAobGV2ZWwgPiAwKSB7CisJCWtwID0gWEZTX0JNQVBfS0VZX0lBRERSKGJsb2NrLCAxLCBjdXIpOworCQlwcCA9IFhGU19CTUFQX1BUUl9JQUREUihibG9jaywgMSwgY3VyKTsKKyNpZmRlZiBERUJVRworCQlmb3IgKGkgPSBudW1yZWNzOyBpID49IHB0cjsgaS0tKSB7CisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xwdHIoY3VyLCBJTlRfR0VUKHBwW2kgLSAxXSwgQVJDSF9DT05WRVJUKSwKKwkJCQkJbGV2ZWwpKSkgeworCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCX0KKyNlbmRpZgorCQltZW1tb3ZlKCZrcFtwdHJdLCAma3BbcHRyIC0gMV0sCisJCQkobnVtcmVjcyAtIHB0ciArIDEpICogc2l6ZW9mKCprcCkpOworCQltZW1tb3ZlKCZwcFtwdHJdLCAmcHBbcHRyIC0gMV0sIC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCQkobnVtcmVjcyAtIHB0ciArIDEpICogc2l6ZW9mKCpwcCkpOworI2lmZGVmIERFQlVHCisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbHB0cihjdXIsICh4ZnNfYm1idF9wdHJfdCkqYm5vcCwKKwkJCQlsZXZlbCkpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKyNlbmRpZgorCQlrcFtwdHIgLSAxXSA9IGtleTsKKwkJSU5UX1NFVChwcFtwdHIgLSAxXSwgQVJDSF9DT05WRVJULCAqYm5vcCk7CisJCW51bXJlY3MrKzsKKwkJSU5UX1NFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCBudW1yZWNzKTsKKwkJeGZzX2JtYnRfbG9nX2tleXMoY3VyLCBicCwgcHRyLCBudW1yZWNzKTsKKwkJeGZzX2JtYnRfbG9nX3B0cnMoY3VyLCBicCwgcHRyLCBudW1yZWNzKTsKKwl9IGVsc2UgeworCQlycCA9IFhGU19CTUFQX1JFQ19JQUREUihibG9jaywgMSwgY3VyKTsKKwkJbWVtbW92ZSgmcnBbcHRyXSwgJnJwW3B0ciAtIDFdLAorCQkJKG51bXJlY3MgLSBwdHIgKyAxKSAqIHNpemVvZigqcnApKTsKKwkJcnBbcHRyIC0gMV0gPSAqcmVjcDsKKwkJbnVtcmVjcysrOworCQlJTlRfU0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIG51bXJlY3MpOworCQl4ZnNfYm1idF9sb2dfcmVjcyhjdXIsIGJwLCBwdHIsIG51bXJlY3MpOworCX0KKwl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCBicCwgWEZTX0JCX05VTVJFQ1MpOworI2lmZGVmIERFQlVHCisJaWYgKHB0ciA8IG51bXJlY3MpIHsKKwkJaWYgKGxldmVsID09IDApCisJCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKFhGU19CVE5VTV9CTUFQLCBycCArIHB0ciAtIDEsCisJCQkJcnAgKyBwdHIpOworCQllbHNlCisJCQl4ZnNfYnRyZWVfY2hlY2tfa2V5KFhGU19CVE5VTV9CTUFQLCBrcCArIHB0ciAtIDEsCisJCQkJa3AgKyBwdHIpOworCX0KKyNlbmRpZgorCWlmIChvcHRyID09IDEgJiYgKGVycm9yID0geGZzX2JtYnRfdXBka2V5KGN1ciwgJmtleSwgbGV2ZWwgKyAxKSkpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCSpibm9wID0gbmJubzsKKwlpZiAobmJubyAhPSBOVUxMRlNCTE9DSykgeworCQkqcmVjcCA9IG5yZWM7CisJCSpjdXJwID0gbmN1cjsKKwl9CisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJKnN0YXQgPSAxOworCXJldHVybiAwOworfQorCitTVEFUSUMgaW50Cit4ZnNfYm1idF9raWxscm9vdCgKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIpCit7CisJeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7CisJeGZzX2JtYnRfYmxvY2tfdAkqY2Jsb2NrOworCXhmc19idWZfdAkJKmNicDsKKwl4ZnNfYm1idF9rZXlfdAkJKmNrcDsKKwl4ZnNfYm1idF9wdHJfdAkJKmNwcDsKKyNpZmRlZiBERUJVRworCWludAkJCWVycm9yOworI2VuZGlmCisjaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKwlzdGF0aWMgY2hhcgkJZm5hbWVbXSA9ICJ4ZnNfYm1idF9raWxscm9vdCI7CisjZW5kaWYKKwlpbnQJCQlpOworCXhmc19ibWJ0X2tleV90CQkqa3A7CisJeGZzX2lub2RlX3QJCSppcDsKKwl4ZnNfaWZvcmtfdAkJKmlmcDsKKwlpbnQJCQlsZXZlbDsKKwl4ZnNfYm1idF9wdHJfdAkJKnBwOworCisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRU5UUlkpOworCWxldmVsID0gY3VyLT5iY19ubGV2ZWxzIC0gMTsKKwlBU1NFUlQobGV2ZWwgPj0gMSk7CisJLyoKKwkgKiBEb24ndCBkZWFsIHdpdGggdGhlIHJvb3QgYmxvY2sgbmVlZHMgdG8gYmUgYSBsZWFmIGNhc2UuCisJICogV2UncmUganVzdCBnb2luZyB0byB0dXJuIHRoZSB0aGluZyBiYWNrIGludG8gZXh0ZW50cyBhbnl3YXkuCisJICovCisJaWYgKGxldmVsID09IDEpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJCXJldHVybiAwOworCX0KKwlibG9jayA9IHhmc19ibWJ0X2dldF9ibG9jayhjdXIsIGxldmVsLCAmY2JwKTsKKwkvKgorCSAqIEdpdmUgdXAgaWYgdGhlIHJvb3QgaGFzIG11bHRpcGxlIGNoaWxkcmVuLgorCSAqLworCWlmIChJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICE9IDEpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIE9ubHkgZG8gdGhpcyBpZiB0aGUgbmV4dCBsZXZlbCB3aWxsIGZpdC4KKwkgKiBUaGVuIHRoZSBkYXRhIG11c3QgYmUgY29waWVkIHVwIHRvIHRoZSBpbm9kZSwKKwkgKiBpbnN0ZWFkIG9mIGZyZWVpbmcgdGhlIHJvb3QgeW91IGZyZWUgdGhlIG5leHQgbGV2ZWwuCisJICovCisJY2JwID0gY3VyLT5iY19idWZzW2xldmVsIC0gMV07CisJY2Jsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGNicCk7CisJaWYgKElOVF9HRVQoY2Jsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID4gWEZTX0JNQVBfQkxPQ0tfRE1BWFJFQ1MobGV2ZWwsIGN1cikpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJCXJldHVybiAwOworCX0KKwlBU1NFUlQoSU5UX0dFVChjYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTERGU0JOTyk7CisJQVNTRVJUKElOVF9HRVQoY2Jsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREZTQk5PKTsKKwlpcCA9IGN1ci0+YmNfcHJpdmF0ZS5iLmlwOworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayk7CisJQVNTRVJUKFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKGxldmVsLCBjdXIpID09CisJICAgICAgIFhGU19CTUFQX0JST09UX01BWFJFQ1MoaWZwLT5pZl9icm9vdF9ieXRlcykpOworCWkgPSAoaW50KShJTlRfR0VUKGNibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAtIFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKGxldmVsLCBjdXIpKTsKKwlpZiAoaSkgeworCQl4ZnNfaXJvb3RfcmVhbGxvYyhpcCwgaSwgY3VyLT5iY19wcml2YXRlLmIud2hpY2hmb3JrKTsKKwkJYmxvY2sgPSBpZnAtPmlmX2Jyb290OworCX0KKwlJTlRfTU9EKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIGkpOworCUFTU0VSVChJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID09IElOVF9HRVQoY2Jsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwlrcCA9IFhGU19CTUFQX0tFWV9JQUREUihibG9jaywgMSwgY3VyKTsKKwlja3AgPSBYRlNfQk1BUF9LRVlfSUFERFIoY2Jsb2NrLCAxLCBjdXIpOworCW1lbWNweShrcCwgY2twLCBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCprcCkpOworCXBwID0gWEZTX0JNQVBfUFRSX0lBRERSKGJsb2NrLCAxLCBjdXIpOworCWNwcCA9IFhGU19CTUFQX1BUUl9JQUREUihjYmxvY2ssIDEsIGN1cik7CisjaWZkZWYgREVCVUcKKwlmb3IgKGkgPSAwOyBpIDwgSU5UX0dFVChjYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7IGkrKykgeworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xwdHIoY3VyLCBJTlRfR0VUKGNwcFtpXSwgQVJDSF9DT05WRVJUKSwgbGV2ZWwgLSAxKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCX0KKyNlbmRpZgorCW1lbWNweShwcCwgY3BwLCBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpwcCkpOworCXhmc19ibWFwX2FkZF9mcmVlKFhGU19EQUREUl9UT19GU0IoY3VyLT5iY19tcCwgWEZTX0JVRl9BRERSKGNicCkpLCAxLAorCQkJY3VyLT5iY19wcml2YXRlLmIuZmxpc3QsIGN1ci0+YmNfbXApOworCWlwLT5pX2QuZGlfbmJsb2Nrcy0tOworCVhGU19UUkFOU19NT0RfRFFVT1RfQllJTk8oY3VyLT5iY19tcCwgY3VyLT5iY190cCwgaXAsCisJCQlYRlNfVFJBTlNfRFFfQkNPVU5ULCAtMUwpOworCXhmc190cmFuc19iaW52YWwoY3VyLT5iY190cCwgY2JwKTsKKwljdXItPmJjX2J1ZnNbbGV2ZWwgLSAxXSA9IE5VTEw7CisJSU5UX01PRChibG9jay0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCwgLTEpOworCXhmc190cmFuc19sb2dfaW5vZGUoY3VyLT5iY190cCwgaXAsCisJCVhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19GQlJPT1QoY3VyLT5iY19wcml2YXRlLmIud2hpY2hmb3JrKSk7CisJY3VyLT5iY19ubGV2ZWxzLS07CisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMb2cga2V5IHZhbHVlcyBmcm9tIHRoZSBidHJlZSBibG9jay4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWJ0X2xvZ19rZXlzKAorCXhmc19idHJlZV9jdXJfdAkqY3VyLAorCXhmc19idWZfdAkqYnAsCisJaW50CQlrZmlyc3QsCisJaW50CQlrbGFzdCkKK3sKKyNpZmRlZiBYRlNfQk1CVF9UUkFDRQorCXN0YXRpYyBjaGFyCWZuYW1lW10gPSAieGZzX2JtYnRfbG9nX2tleXMiOworI2VuZGlmCisJeGZzX3RyYW5zX3QJKnRwOworCisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRU5UUlkpOworCVhGU19CTUJUX1RSQUNFX0FSR0JJSShjdXIsIGJwLCBrZmlyc3QsIGtsYXN0KTsKKwl0cCA9IGN1ci0+YmNfdHA7CisJaWYgKGJwKSB7CisJCXhmc19ibWJ0X2Jsb2NrX3QJKmJsb2NrOworCQlpbnQJCQlmaXJzdDsKKwkJeGZzX2JtYnRfa2V5X3QJCSprcDsKKwkJaW50CQkJbGFzdDsKKworCQlibG9jayA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhicCk7CisJCWtwID0gWEZTX0JNQVBfS0VZX0RBRERSKGJsb2NrLCAxLCBjdXIpOworCQlmaXJzdCA9IChpbnQpKCh4ZnNfY2FkZHJfdCkma3Bba2ZpcnN0IC0gMV0gLSAoeGZzX2NhZGRyX3QpYmxvY2spOworCQlsYXN0ID0gKGludCkoKCh4ZnNfY2FkZHJfdCkma3Bba2xhc3RdIC0gMSkgLSAoeGZzX2NhZGRyX3QpYmxvY2spOworCQl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYnAsIGZpcnN0LCBsYXN0KTsKKwl9IGVsc2UgeworCQl4ZnNfaW5vZGVfdAkJICppcDsKKworCQlpcCA9IGN1ci0+YmNfcHJpdmF0ZS5iLmlwOworCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwKKwkJCVhGU19JTE9HX0ZCUk9PVChjdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspKTsKKwl9CisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Cit9CisKKy8qCisgKiBMb2cgcG9pbnRlciB2YWx1ZXMgZnJvbSB0aGUgYnRyZWUgYmxvY2suCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1idF9sb2dfcHRycygKKwl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwKKwl4ZnNfYnVmX3QJKmJwLAorCWludAkJcGZpcnN0LAorCWludAkJcGxhc3QpCit7CisjaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKwlzdGF0aWMgY2hhcglmbmFtZVtdID0gInhmc19ibWJ0X2xvZ19wdHJzIjsKKyNlbmRpZgorCXhmc190cmFuc190CSp0cDsKKworCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVOVFJZKTsKKwlYRlNfQk1CVF9UUkFDRV9BUkdCSUkoY3VyLCBicCwgcGZpcnN0LCBwbGFzdCk7CisJdHAgPSBjdXItPmJjX3RwOworCWlmIChicCkgeworCQl4ZnNfYm1idF9ibG9ja190CSpibG9jazsKKwkJaW50CQkJZmlyc3Q7CisJCWludAkJCWxhc3Q7CisJCXhmc19ibWJ0X3B0cl90CQkqcHA7CisKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soYnApOworCQlwcCA9IFhGU19CTUFQX1BUUl9EQUREUihibG9jaywgMSwgY3VyKTsKKwkJZmlyc3QgPSAoaW50KSgoeGZzX2NhZGRyX3QpJnBwW3BmaXJzdCAtIDFdIC0gKHhmc19jYWRkcl90KWJsb2NrKTsKKwkJbGFzdCA9IChpbnQpKCgoeGZzX2NhZGRyX3QpJnBwW3BsYXN0XSAtIDEpIC0gKHhmc19jYWRkcl90KWJsb2NrKTsKKwkJeGZzX3RyYW5zX2xvZ19idWYodHAsIGJwLCBmaXJzdCwgbGFzdCk7CisJfSBlbHNlIHsKKwkJeGZzX2lub2RlX3QJCSppcDsKKworCQlpcCA9IGN1ci0+YmNfcHJpdmF0ZS5iLmlwOworCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwKKwkJCVhGU19JTE9HX0ZCUk9PVChjdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspKTsKKwl9CisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Cit9CisKKy8qCisgKiBMb29rdXAgdGhlIHJlY29yZC4gIFRoZSBjdXJzb3IgaXMgbWFkZSB0byBwb2ludCB0byBpdCwgYmFzZWQgb24gZGlyLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYm1idF9sb29rdXAoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAorCXhmc19sb29rdXBfdAkJZGlyLAorCWludAkJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s9TlVMTDsKKwl4ZnNfYnVmX3QJCSpicDsKKwl4ZnNfZGFkZHJfdAkJZDsKKwl4ZnNfc2ZpbG9mZl90CQlkaWZmOworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisjaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKwlzdGF0aWMgY2hhcglmbmFtZVtdID0gInhmc19ibWJ0X2xvb2t1cCI7CisjZW5kaWYKKwl4ZnNfZnNibG9ja190CQlmc2Jubz0wOworCWludAkJCWhpZ2g7CisJaW50CQkJaTsKKwlpbnQJCQlrZXlubz0wOworCXhmc19ibWJ0X2tleV90CQkqa2tiYXNlPU5VTEw7CisJeGZzX2JtYnRfa2V5X3QJCSpra3A7CisJeGZzX2JtYnRfcmVjX3QJCSprcmJhc2U9TlVMTDsKKwl4ZnNfYm1idF9yZWNfdAkJKmtycDsKKwlpbnQJCQlsZXZlbDsKKwlpbnQJCQlsb3c7CisJeGZzX21vdW50X3QJCSptcDsKKwl4ZnNfYm1idF9wdHJfdAkJKnBwOworCXhmc19ibWJ0X2lyZWNfdAkJKnJwOworCXhmc19maWxlb2ZmX3QJCXN0YXJ0b2ZmOworCXhmc190cmFuc190CQkqdHA7CisKKwlYRlNfU1RBVFNfSU5DKHhzX2JtYnRfbG9va3VwKTsKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7CisJWEZTX0JNQlRfVFJBQ0VfQVJHSShjdXIsIChpbnQpZGlyKTsKKwl0cCA9IGN1ci0+YmNfdHA7CisJbXAgPSBjdXItPmJjX21wOworCXJwID0gJmN1ci0+YmNfcmVjLmI7CisJZm9yIChsZXZlbCA9IGN1ci0+YmNfbmxldmVscyAtIDEsIGRpZmYgPSAxOyBsZXZlbCA+PSAwOyBsZXZlbC0tKSB7CisJCWlmIChsZXZlbCA8IGN1ci0+YmNfbmxldmVscyAtIDEpIHsKKwkJCWQgPSBYRlNfRlNCX1RPX0RBRERSKG1wLCBmc2Jubyk7CisJCQlicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CisJCQlpZiAoYnAgJiYgWEZTX0JVRl9BRERSKGJwKSAhPSBkKQorCQkJCWJwID0gKHhmc19idWZfdCAqKTA7CisJCQlpZiAoIWJwKSB7CisJCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZmwobXAsIHRwLCBmc2JubywKKwkJCQkJCTAsICZicCwgWEZTX0JNQVBfQlRSRUVfUkVGKSkpIHsKKwkJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJCQlyZXR1cm4gZXJyb3I7CisJCQkJfQorCQkJCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXZlbCwgYnApOworCQkJCWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKKwkJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIGJsb2NrLAorCQkJCQkJbGV2ZWwsIGJwKSkpIHsKKwkJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJCQlyZXR1cm4gZXJyb3I7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJYmxvY2sgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soYnApOworCQl9IGVsc2UKKwkJCWJsb2NrID0geGZzX2JtYnRfZ2V0X2Jsb2NrKGN1ciwgbGV2ZWwsICZicCk7CisJCWlmIChkaWZmID09IDApCisJCQlrZXlubyA9IDE7CisJCWVsc2UgeworCQkJaWYgKGxldmVsID4gMCkKKwkJCQlra2Jhc2UgPSBYRlNfQk1BUF9LRVlfSUFERFIoYmxvY2ssIDEsIGN1cik7CisJCQllbHNlCisJCQkJa3JiYXNlID0gWEZTX0JNQVBfUkVDX0lBRERSKGJsb2NrLCAxLCBjdXIpOworCQkJbG93ID0gMTsKKwkJCWlmICghKGhpZ2ggPSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKSkgeworCQkJCUFTU0VSVChsZXZlbCA9PSAwKTsKKwkJCQljdXItPmJjX3B0cnNbMF0gPSBkaXIgIT0gWEZTX0xPT0tVUF9MRTsKKwkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJCQkqc3RhdCA9IDA7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQl3aGlsZSAobG93IDw9IGhpZ2gpIHsKKwkJCQlYRlNfU1RBVFNfSU5DKHhzX2JtYnRfY29tcGFyZSk7CisJCQkJa2V5bm8gPSAobG93ICsgaGlnaCkgPj4gMTsKKwkJCQlpZiAobGV2ZWwgPiAwKSB7CisJCQkJCWtrcCA9IGtrYmFzZSArIGtleW5vIC0gMTsKKwkJCQkJc3RhcnRvZmYgPSBJTlRfR0VUKGtrcC0+YnJfc3RhcnRvZmYsIEFSQ0hfQ09OVkVSVCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJa3JwID0ga3JiYXNlICsga2V5bm8gLSAxOworCQkJCQlzdGFydG9mZiA9IHhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0b2ZmKGtycCk7CisJCQkJfQorCQkJCWRpZmYgPSAoeGZzX3NmaWxvZmZfdCkKKwkJCQkJCShzdGFydG9mZiAtIHJwLT5icl9zdGFydG9mZik7CisJCQkJaWYgKGRpZmYgPCAwKQorCQkJCQlsb3cgPSBrZXlubyArIDE7CisJCQkJZWxzZSBpZiAoZGlmZiA+IDApCisJCQkJCWhpZ2ggPSBrZXlubyAtIDE7CisJCQkJZWxzZQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAobGV2ZWwgPiAwKSB7CisJCQlpZiAoZGlmZiA+IDAgJiYgLS1rZXlubyA8IDEpCisJCQkJa2V5bm8gPSAxOworCQkJcHAgPSBYRlNfQk1BUF9QVFJfSUFERFIoYmxvY2ssIGtleW5vLCBjdXIpOworI2lmZGVmIERFQlVHCisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xwdHIoY3VyLCBJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkgeworCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisjZW5kaWYKKwkJCWZzYm5vID0gSU5UX0dFVCgqcHAsIEFSQ0hfQ09OVkVSVCk7CisJCQljdXItPmJjX3B0cnNbbGV2ZWxdID0ga2V5bm87CisJCX0KKwl9CisJaWYgKGRpciAhPSBYRlNfTE9PS1VQX0xFICYmIGRpZmYgPCAwKSB7CisJCWtleW5vKys7CisJCS8qCisJCSAqIElmIGdlIHNlYXJjaCBhbmQgd2Ugd2VudCBvZmYgdGhlIGVuZCBvZiB0aGUgYmxvY2ssIGJ1dCBpdCdzCisJCSAqIG5vdCB0aGUgbGFzdCBibG9jaywgd2UncmUgaW4gdGhlIHdyb25nIGJsb2NrLgorCQkgKi8KKwkJaWYgKGRpciA9PSBYRlNfTE9PS1VQX0dFICYmIGtleW5vID4gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAmJgorCQkgICAgSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTERGU0JOTykgeworCQkJY3VyLT5iY19wdHJzWzBdID0ga2V5bm87CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfaW5jcmVtZW50KGN1ciwgMCwgJmkpKSkgeworCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKGkgPT0gMSk7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJCSpzdGF0ID0gMTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWVsc2UgaWYgKGRpciA9PSBYRlNfTE9PS1VQX0xFICYmIGRpZmYgPiAwKQorCQlrZXluby0tOworCWN1ci0+YmNfcHRyc1swXSA9IGtleW5vOworCWlmIChrZXlubyA9PSAwIHx8IGtleW5vID4gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJKnN0YXQgPSAwOworCX0gZWxzZSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9ICgoZGlyICE9IFhGU19MT09LVVBfRVEpIHx8IChkaWZmID09IDApKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNb3ZlIDEgcmVjb3JkIGxlZnQgZnJvbSBjdXIvbGV2ZWwgaWYgcG9zc2libGUuCisgKiBVcGRhdGUgY3VyIHRvIHJlZmxlY3QgdGhlIG5ldyBwYXRoLgorICovCitTVEFUSUMgaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2JtYnRfbHNoaWZ0KAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwKKwlpbnQJCQlsZXZlbCwKKwlpbnQJCQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisjaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKwlzdGF0aWMgY2hhcgkJZm5hbWVbXSA9ICJ4ZnNfYm1idF9sc2hpZnQiOworI2VuZGlmCisjaWZkZWYgREVCVUcKKwlpbnQJCQlpOwkJLyogbG9vcCBjb3VudGVyICovCisjZW5kaWYKKwl4ZnNfYm1idF9rZXlfdAkJa2V5OwkJLyogYm1hcCBidHJlZSBrZXkgKi8KKwl4ZnNfYnVmX3QJCSpsYnA7CQkvKiBsZWZ0IGJ1ZmZlciBwb2ludGVyICovCisJeGZzX2JtYnRfYmxvY2tfdAkqbGVmdDsJCS8qIGxlZnQgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfYm1idF9rZXlfdAkJKmxrcD1OVUxMOwkvKiBsZWZ0IGJ0cmVlIGtleSAqLworCXhmc19ibWJ0X3B0cl90CQkqbHBwOwkJLyogbGVmdCBhZGRyZXNzIHBvaW50ZXIgKi8KKwlpbnQJCQlscmVjczsJCS8qIGxlZnQgcmVjb3JkIGNvdW50ICovCisJeGZzX2JtYnRfcmVjX3QJCSpscnA9TlVMTDsJLyogbGVmdCByZWNvcmQgcG9pbnRlciAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc19idWZfdAkJKnJicDsJCS8qIHJpZ2h0IGJ1ZmZlciBwb2ludGVyICovCisJeGZzX2JtYnRfYmxvY2tfdAkqcmlnaHQ7CQkvKiByaWdodCBidHJlZSBibG9jayAqLworCXhmc19ibWJ0X2tleV90CQkqcmtwPU5VTEw7CS8qIHJpZ2h0IGJ0cmVlIGtleSAqLworCXhmc19ibWJ0X3B0cl90CQkqcnBwPU5VTEw7CS8qIHJpZ2h0IGFkZHJlc3MgcG9pbnRlciAqLworCXhmc19ibWJ0X3JlY190CQkqcnJwPU5VTEw7CS8qIHJpZ2h0IHJlY29yZCBwb2ludGVyICovCisJaW50CQkJcnJlY3M7CQkvKiByaWdodCByZWNvcmQgY291bnQgKi8KKworCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVOVFJZKTsKKwlYRlNfQk1CVF9UUkFDRV9BUkdJKGN1ciwgbGV2ZWwpOworCWlmIChsZXZlbCA9PSBjdXItPmJjX25sZXZlbHMgLSAxKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwlyYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOworCXJpZ2h0ID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKHJicCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIHJpZ2h0LCBsZXZlbCwgcmJwKSkpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorI2VuZGlmCisJaWYgKElOVF9HRVQocmlnaHQtPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTERGU0JOTykgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGN1ci0+YmNfcHRyc1tsZXZlbF0gPD0gMSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJbXAgPSBjdXItPmJjX21wOworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCBjdXItPmJjX3RwLCBJTlRfR0VUKHJpZ2h0LT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpLCAwLAorCQkJJmxicCwgWEZTX0JNQVBfQlRSRUVfUkVGKSkpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCWxlZnQgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0sobGJwKTsKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIGxlZnQsIGxldmVsLCBsYnApKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJaWYgKElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA9PSBYRlNfQk1BUF9CTE9DS19JTUFYUkVDUyhsZXZlbCwgY3VyKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJbHJlY3MgPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxOworCWlmIChsZXZlbCA+IDApIHsKKwkJbGtwID0gWEZTX0JNQVBfS0VZX0lBRERSKGxlZnQsIGxyZWNzLCBjdXIpOworCQlya3AgPSBYRlNfQk1BUF9LRVlfSUFERFIocmlnaHQsIDEsIGN1cik7CisJCSpsa3AgPSAqcmtwOworCQl4ZnNfYm1idF9sb2dfa2V5cyhjdXIsIGxicCwgbHJlY3MsIGxyZWNzKTsKKwkJbHBwID0gWEZTX0JNQVBfUFRSX0lBRERSKGxlZnQsIGxyZWNzLCBjdXIpOworCQlycHAgPSBYRlNfQk1BUF9QVFJfSUFERFIocmlnaHQsIDEsIGN1cik7CisjaWZkZWYgREVCVUcKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19scHRyKGN1ciwgSU5UX0dFVCgqcnBwLCBBUkNIX0NPTlZFUlQpLCBsZXZlbCkpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKyNlbmRpZgorCQkqbHBwID0gKnJwcDsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJeGZzX2JtYnRfbG9nX3B0cnMoY3VyLCBsYnAsIGxyZWNzLCBscmVjcyk7CisJfSBlbHNlIHsKKwkJbHJwID0gWEZTX0JNQVBfUkVDX0lBRERSKGxlZnQsIGxyZWNzLCBjdXIpOworCQlycnAgPSBYRlNfQk1BUF9SRUNfSUFERFIocmlnaHQsIDEsIGN1cik7CisJCSpscnAgPSAqcnJwOworCQl4ZnNfYm1idF9sb2dfcmVjcyhjdXIsIGxicCwgbHJlY3MsIGxyZWNzKTsKKwl9CisJSU5UX1NFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIGxyZWNzKTsKKwl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCBsYnAsIFhGU19CQl9OVU1SRUNTKTsKKyNpZmRlZiBERUJVRworCWlmIChsZXZlbCA+IDApCisJCXhmc19idHJlZV9jaGVja19rZXkoWEZTX0JUTlVNX0JNQVAsIGxrcCAtIDEsIGxrcCk7CisJZWxzZQorCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKFhGU19CVE5VTV9CTUFQLCBscnAgLSAxLCBscnApOworI2VuZGlmCisJcnJlY3MgPSBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gMTsKKwlJTlRfU0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIHJyZWNzKTsKKwl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCByYnAsIFhGU19CQl9OVU1SRUNTKTsKKwlpZiAobGV2ZWwgPiAwKSB7CisjaWZkZWYgREVCVUcKKwkJZm9yIChpID0gMDsgaSA8IHJyZWNzOyBpKyspIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbHB0cihjdXIsIElOVF9HRVQocnBwW2kgKyAxXSwgQVJDSF9DT05WRVJUKSwKKwkJCQkJbGV2ZWwpKSkgeworCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCX0KKyNlbmRpZgorCQltZW1tb3ZlKHJrcCwgcmtwICsgMSwgcnJlY3MgKiBzaXplb2YoKnJrcCkpOworCQltZW1tb3ZlKHJwcCwgcnBwICsgMSwgcnJlY3MgKiBzaXplb2YoKnJwcCkpOworCQl4ZnNfYm1idF9sb2dfa2V5cyhjdXIsIHJicCwgMSwgcnJlY3MpOworCQl4ZnNfYm1idF9sb2dfcHRycyhjdXIsIHJicCwgMSwgcnJlY3MpOworCX0gZWxzZSB7CisJCW1lbW1vdmUocnJwLCBycnAgKyAxLCBycmVjcyAqIHNpemVvZigqcnJwKSk7CisJCXhmc19ibWJ0X2xvZ19yZWNzKGN1ciwgcmJwLCAxLCBycmVjcyk7CisJCUlOVF9TRVQoa2V5LmJyX3N0YXJ0b2ZmLCBBUkNIX0NPTlZFUlQsCisJCQl4ZnNfYm1idF9kaXNrX2dldF9zdGFydG9mZihycnApKTsKKwkJcmtwID0gJmtleTsKKwl9CisJaWYgKChlcnJvciA9IHhmc19ibWJ0X3VwZGtleShjdXIsIHJrcCwgbGV2ZWwgKyAxKSkpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCWN1ci0+YmNfcHRyc1tsZXZlbF0tLTsKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkqc3RhdCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNb3ZlIDEgcmVjb3JkIHJpZ2h0IGZyb20gY3VyL2xldmVsIGlmIHBvc3NpYmxlLgorICogVXBkYXRlIGN1ciB0byByZWZsZWN0IHRoZSBuZXcgcGF0aC4KKyAqLworU1RBVElDIGludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWJ0X3JzaGlmdCgKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCisJaW50CQkJbGV2ZWwsCisJaW50CQkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworI2lmZGVmIFhGU19CTUJUX1RSQUNFCisJc3RhdGljIGNoYXIJCWZuYW1lW10gPSAieGZzX2JtYnRfcnNoaWZ0IjsKKyNlbmRpZgorCWludAkJCWk7CQkvKiBsb29wIGNvdW50ZXIgKi8KKwl4ZnNfYm1idF9rZXlfdAkJa2V5OwkJLyogYm1hcCBidHJlZSBrZXkgKi8KKwl4ZnNfYnVmX3QJCSpsYnA7CQkvKiBsZWZ0IGJ1ZmZlciBwb2ludGVyICovCisJeGZzX2JtYnRfYmxvY2tfdAkqbGVmdDsJCS8qIGxlZnQgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfYm1idF9rZXlfdAkJKmxrcDsJCS8qIGxlZnQgYnRyZWUga2V5ICovCisJeGZzX2JtYnRfcHRyX3QJCSpscHA7CQkvKiBsZWZ0IGFkZHJlc3MgcG9pbnRlciAqLworCXhmc19ibWJ0X3JlY190CQkqbHJwOwkJLyogbGVmdCByZWNvcmQgcG9pbnRlciAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc19idWZfdAkJKnJicDsJCS8qIHJpZ2h0IGJ1ZmZlciBwb2ludGVyICovCisJeGZzX2JtYnRfYmxvY2tfdAkqcmlnaHQ7CQkvKiByaWdodCBidHJlZSBibG9jayAqLworCXhmc19ibWJ0X2tleV90CQkqcmtwOwkJLyogcmlnaHQgYnRyZWUga2V5ICovCisJeGZzX2JtYnRfcHRyX3QJCSpycHA7CQkvKiByaWdodCBhZGRyZXNzIHBvaW50ZXIgKi8KKwl4ZnNfYm1idF9yZWNfdAkJKnJycD1OVUxMOwkvKiByaWdodCByZWNvcmQgcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSp0Y3VyOwkJLyogdGVtcG9yYXJ5IGJ0cmVlIGN1cnNvciAqLworCisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRU5UUlkpOworCVhGU19CTUJUX1RSQUNFX0FSR0koY3VyLCBsZXZlbCk7CisJaWYgKGxldmVsID09IGN1ci0+YmNfbmxldmVscyAtIDEpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWxicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CisJbGVmdCA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhsYnApOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCBsZWZ0LCBsZXZlbCwgbGJwKSkpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorI2VuZGlmCisJaWYgKElOVF9HRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTERGU0JOTykgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGN1ci0+YmNfcHRyc1tsZXZlbF0gPj0gSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwltcCA9IGN1ci0+YmNfbXA7CisJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZmwobXAsIGN1ci0+YmNfdHAsIElOVF9HRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCksIDAsCisJCQkmcmJwLCBYRlNfQk1BUF9CVFJFRV9SRUYpKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJcmlnaHQgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0socmJwKTsKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIHJpZ2h0LCBsZXZlbCwgcmJwKSkpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCWlmIChJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwlpZiAobGV2ZWwgPiAwKSB7CisJCWxrcCA9IFhGU19CTUFQX0tFWV9JQUREUihsZWZ0LCBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCksIGN1cik7CisJCWxwcCA9IFhGU19CTUFQX1BUUl9JQUREUihsZWZ0LCBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCksIGN1cik7CisJCXJrcCA9IFhGU19CTUFQX0tFWV9JQUREUihyaWdodCwgMSwgY3VyKTsKKwkJcnBwID0gWEZTX0JNQVBfUFRSX0lBRERSKHJpZ2h0LCAxLCBjdXIpOworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSAxOyBpID49IDA7IGktLSkgeworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19scHRyKGN1ciwgSU5UX0dFVChycHBbaV0sIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpIHsKKwkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQl9CisjZW5kaWYKKwkJbWVtbW92ZShya3AgKyAxLCBya3AsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKnJrcCkpOworCQltZW1tb3ZlKHJwcCArIDEsIHJwcCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcnBwKSk7CisjaWZkZWYgREVCVUcKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19scHRyKGN1ciwgSU5UX0dFVCgqbHBwLCBBUkNIX0NPTlZFUlQpLCBsZXZlbCkpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKyNlbmRpZgorCQkqcmtwID0gKmxrcDsKKwkJKnJwcCA9ICpscHA7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCXhmc19ibWJ0X2xvZ19rZXlzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSk7CisJCXhmc19ibWJ0X2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSk7CisJfSBlbHNlIHsKKwkJbHJwID0gWEZTX0JNQVBfUkVDX0lBRERSKGxlZnQsIElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSwgY3VyKTsKKwkJcnJwID0gWEZTX0JNQVBfUkVDX0lBRERSKHJpZ2h0LCAxLCBjdXIpOworCQltZW1tb3ZlKHJycCArIDEsIHJycCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcnJwKSk7CisJCSpycnAgPSAqbHJwOworCQl4ZnNfYm1idF9sb2dfcmVjcyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEpOworCQlJTlRfU0VUKGtleS5icl9zdGFydG9mZiwgQVJDSF9DT05WRVJULAorCQkJeGZzX2JtYnRfZGlza19nZXRfc3RhcnRvZmYocnJwKSk7CisJCXJrcCA9ICZrZXk7CisJfQorCUlOVF9NT0QobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAtMSk7CisJeGZzX2JtYnRfbG9nX2Jsb2NrKGN1ciwgbGJwLCBYRlNfQkJfTlVNUkVDUyk7CisJSU5UX01PRChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCArMSk7CisjaWZkZWYgREVCVUcKKwlpZiAobGV2ZWwgPiAwKQorCQl4ZnNfYnRyZWVfY2hlY2tfa2V5KFhGU19CVE5VTV9CTUFQLCBya3AsIHJrcCArIDEpOworCWVsc2UKKwkJeGZzX2J0cmVlX2NoZWNrX3JlYyhYRlNfQlROVU1fQk1BUCwgcnJwLCBycnAgKyAxKTsKKyNlbmRpZgorCXhmc19ibWJ0X2xvZ19ibG9jayhjdXIsIHJicCwgWEZTX0JCX05VTVJFQ1MpOworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZHVwX2N1cnNvcihjdXIsICZ0Y3VyKSkpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCWkgPSB4ZnNfYnRyZWVfbGFzdHJlYyh0Y3VyLCBsZXZlbCk7CisJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9pbmNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKSkpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKHRjdXIsIEVSUk9SKTsKKwkJZ290byBlcnJvcjE7CisJfQorCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBka2V5KHRjdXIsIHJrcCwgbGV2ZWwgKyAxKSkpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKHRjdXIsIEVSUk9SKTsKKwkJZ290byBlcnJvcjE7CisJfQorCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkqc3RhdCA9IDE7CisJcmV0dXJuIDA7CitlcnJvcjA6CisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworZXJyb3IxOgorCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsIFhGU19CVFJFRV9FUlJPUik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogRGV0ZXJtaW5lIHRoZSBleHRlbnQgc3RhdGUuCisgKi8KKy8qIEFSR1NVU0VEICovCitTVEFUSUMgeGZzX2V4bnRzdF90Cit4ZnNfZXh0ZW50X3N0YXRlKAorCXhmc19maWxibGtzX3QJCWJsa3MsCisJaW50CQkJZXh0ZW50X2ZsYWcpCit7CisJaWYgKGV4dGVudF9mbGFnKSB7CisJCUFTU0VSVChibGtzICE9IDApOwkvKiBzYXZlZCBmb3IgRE1JRyAqLworCQlyZXR1cm4gWEZTX0VYVF9VTldSSVRURU47CisJfQorCXJldHVybiBYRlNfRVhUX05PUk07Cit9CisKKworLyoKKyAqIFNwbGl0IGN1ci9sZXZlbCBibG9jayBpbiBoYWxmLgorICogUmV0dXJuIG5ldyBibG9jayBudW1iZXIgYW5kIGl0cyBmaXJzdCByZWNvcmQgKHRvIGJlIGluc2VydGVkIGludG8gcGFyZW50KS4KKyAqLworU1RBVElDIGludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWJ0X3NwbGl0KAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwKKwlpbnQJCQlsZXZlbCwKKwl4ZnNfZnNibG9ja190CQkqYm5vcCwKKwl4ZnNfYm1idF9rZXlfdAkJKmtleXAsCisJeGZzX2J0cmVlX2N1cl90CQkqKmN1cnAsCisJaW50CQkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwl4ZnNfYWxsb2NfYXJnX3QJCWFyZ3M7CQkvKiBibG9jayBhbGxvY2F0aW9uIGFyZ3MgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworI2lmZGVmIFhGU19CTUJUX1RSQUNFCisJc3RhdGljIGNoYXIJCWZuYW1lW10gPSAieGZzX2JtYnRfc3BsaXQiOworI2VuZGlmCisJaW50CQkJaTsJCS8qIGxvb3AgY291bnRlciAqLworCXhmc19mc2Jsb2NrX3QJCWxibm87CQkvKiBsZWZ0IHNpYmxpbmcgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CQkqbGJwOwkJLyogbGVmdCBidWZmZXIgcG9pbnRlciAqLworCXhmc19ibWJ0X2Jsb2NrX3QJKmxlZnQ7CQkvKiBsZWZ0IGJ0cmVlIGJsb2NrICovCisJeGZzX2JtYnRfa2V5X3QJCSpsa3A7CQkvKiBsZWZ0IGJ0cmVlIGtleSAqLworCXhmc19ibWJ0X3B0cl90CQkqbHBwOwkJLyogbGVmdCBhZGRyZXNzIHBvaW50ZXIgKi8KKwl4ZnNfYm1idF9yZWNfdAkJKmxycDsJCS8qIGxlZnQgcmVjb3JkIHBvaW50ZXIgKi8KKwl4ZnNfYnVmX3QJCSpyYnA7CQkvKiByaWdodCBidWZmZXIgcG9pbnRlciAqLworCXhmc19ibWJ0X2Jsb2NrX3QJKnJpZ2h0OwkJLyogcmlnaHQgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfYm1idF9rZXlfdAkJKnJrcDsJCS8qIHJpZ2h0IGJ0cmVlIGtleSAqLworCXhmc19ibWJ0X3B0cl90CQkqcnBwOwkJLyogcmlnaHQgYWRkcmVzcyBwb2ludGVyICovCisJeGZzX2JtYnRfYmxvY2tfdAkqcnJibG9jazsJLyogcmlnaHQtcmlnaHQgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfYnVmX3QJCSpycmJwOwkJLyogcmlnaHQtcmlnaHQgYnVmZmVyIHBvaW50ZXIgKi8KKwl4ZnNfYm1idF9yZWNfdAkJKnJycDsJCS8qIHJpZ2h0IHJlY29yZCBwb2ludGVyICovCisKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7CisJWEZTX0JNQlRfVFJBQ0VfQVJHSUZLKGN1ciwgbGV2ZWwsICpibm9wLCBrZXlwKTsKKwlhcmdzLnRwID0gY3VyLT5iY190cDsKKwlhcmdzLm1wID0gY3VyLT5iY19tcDsKKwlsYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOworCWxibm8gPSBYRlNfREFERFJfVE9fRlNCKGFyZ3MubXAsIFhGU19CVUZfQUREUihsYnApKTsKKwlsZWZ0ID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGxicCk7CisJYXJncy5mc2JubyA9IGN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2s7CisJaWYgKGFyZ3MuZnNibm8gPT0gTlVMTEZTQkxPQ0spIHsKKwkJYXJncy5mc2JubyA9IGxibm87CisJCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfU1RBUlRfQk5POworCX0gZWxzZSBpZiAoY3VyLT5iY19wcml2YXRlLmIuZmxpc3QtPnhiZl9sb3cpCisJCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfRklSU1RfQUc7CisJZWxzZQorCQlhcmdzLnR5cGUgPSBYRlNfQUxMT0NUWVBFX05FQVJfQk5POworCWFyZ3MubW9kID0gYXJncy5taW5sZWZ0ID0gYXJncy5hbGlnbm1lbnQgPSBhcmdzLnRvdGFsID0gYXJncy5pc2ZsID0KKwkJYXJncy51c2VyZGF0YSA9IGFyZ3MubWluYWxpZ25zbG9wID0gMDsKKwlhcmdzLm1pbmxlbiA9IGFyZ3MubWF4bGVuID0gYXJncy5wcm9kID0gMTsKKwlhcmdzLndhc2RlbCA9IGN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzICYgWEZTX0JUQ1VSX0JQUlZfV0FTREVMOworCWlmICghYXJncy53YXNkZWwgJiYgeGZzX3RyYW5zX2dldF9ibG9ja19yZXMoYXJncy50cCkgPT0gMCkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCXJldHVybiBYRlNfRVJST1IoRU5PU1BDKTsKKwl9CisJaWYgKChlcnJvciA9IHhmc19hbGxvY192ZXh0ZW50KCZhcmdzKSkpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCWlmIChhcmdzLmZzYm5vID09IE5VTExGU0JMT0NLKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwlBU1NFUlQoYXJncy5sZW4gPT0gMSk7CisJY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jayA9IGFyZ3MuZnNibm87CisJY3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkKys7CisJY3VyLT5iY19wcml2YXRlLmIuaXAtPmlfZC5kaV9uYmxvY2tzKys7CisJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLnRwLCBjdXItPmJjX3ByaXZhdGUuYi5pcCwgWEZTX0lMT0dfQ09SRSk7CisJWEZTX1RSQU5TX01PRF9EUVVPVF9CWUlOTyhhcmdzLm1wLCBhcmdzLnRwLCBjdXItPmJjX3ByaXZhdGUuYi5pcCwKKwkJCVhGU19UUkFOU19EUV9CQ09VTlQsIDFMKTsKKwlyYnAgPSB4ZnNfYnRyZWVfZ2V0X2J1ZmwoYXJncy5tcCwgYXJncy50cCwgYXJncy5mc2JubywgMCk7CisJcmlnaHQgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0socmJwKTsKKyNpZmRlZiBERUJVRworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIHJicCkpKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKyNlbmRpZgorCUlOVF9TRVQocmlnaHQtPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19CTUFQX01BR0lDKTsKKwlyaWdodC0+YmJfbGV2ZWwgPSBsZWZ0LT5iYl9sZXZlbDsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwlJTlRfU0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIChfX3VpbnQxNl90KShJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLyAyKSk7CisJaWYgKChJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgJiAxKSAmJgorCSAgICBjdXItPmJjX3B0cnNbbGV2ZWxdIDw9IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxKQorCQlJTlRfTU9EKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsICsxKTsKKwlpID0gSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDE7CisJaWYgKGxldmVsID4gMCkgeworCQlsa3AgPSBYRlNfQk1BUF9LRVlfSUFERFIobGVmdCwgaSwgY3VyKTsKKwkJbHBwID0gWEZTX0JNQVBfUFRSX0lBRERSKGxlZnQsIGksIGN1cik7CisJCXJrcCA9IFhGU19CTUFQX0tFWV9JQUREUihyaWdodCwgMSwgY3VyKTsKKwkJcnBwID0gWEZTX0JNQVBfUFRSX0lBRERSKHJpZ2h0LCAxLCBjdXIpOworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOyBpKyspIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbHB0cihjdXIsIElOVF9HRVQobHBwW2ldLCBBUkNIX0NPTlZFUlQpLCBsZXZlbCkpKSB7CisJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJfQorI2VuZGlmCisJCW1lbWNweShya3AsIGxrcCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcmtwKSk7CisJCW1lbWNweShycHAsIGxwcCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcnBwKSk7CisJCXhmc19ibWJ0X2xvZ19rZXlzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJeGZzX2JtYnRfbG9nX3B0cnMoY3VyLCByYnAsIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCQlrZXlwLT5icl9zdGFydG9mZiA9IElOVF9HRVQocmtwLT5icl9zdGFydG9mZiwgQVJDSF9DT05WRVJUKTsKKwl9IGVsc2UgeworCQlscnAgPSBYRlNfQk1BUF9SRUNfSUFERFIobGVmdCwgaSwgY3VyKTsKKwkJcnJwID0gWEZTX0JNQVBfUkVDX0lBRERSKHJpZ2h0LCAxLCBjdXIpOworCQltZW1jcHkocnJwLCBscnAsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKnJycCkpOworCQl4ZnNfYm1idF9sb2dfcmVjcyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJCWtleXAtPmJyX3N0YXJ0b2ZmID0geGZzX2JtYnRfZGlza19nZXRfc3RhcnRvZmYocnJwKTsKKwl9CisJSU5UX01PRChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIC0oSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkpOworCXJpZ2h0LT5iYl9yaWdodHNpYiA9IGxlZnQtPmJiX3JpZ2h0c2liOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCUlOVF9TRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCwgYXJncy5mc2Jubyk7CisJSU5UX1NFVChyaWdodC0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJULCBsYm5vKTsKKwl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCByYnAsIFhGU19CQl9BTExfQklUUyk7CisJeGZzX2JtYnRfbG9nX2Jsb2NrKGN1ciwgbGJwLCBYRlNfQkJfTlVNUkVDUyB8IFhGU19CQl9SSUdIVFNJQik7CisJaWYgKElOVF9HRVQocmlnaHQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpICE9IE5VTExERlNCTk8pIHsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZmwoYXJncy5tcCwgYXJncy50cCwKKwkJCQlJTlRfR0VUKHJpZ2h0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSwgMCwgJnJyYnAsCisJCQkJWEZTX0JNQVBfQlRSRUVfUkVGKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlycmJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKHJyYnApOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIHJyYmxvY2ssIGxldmVsLCBycmJwKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlJTlRfU0VUKHJyYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCwgYXJncy5mc2Jubyk7CisJCXhmc19ibWJ0X2xvZ19ibG9jayhjdXIsIHJyYnAsIFhGU19CQl9MRUZUU0lCKTsKKwl9CisJaWYgKGN1ci0+YmNfcHRyc1tsZXZlbF0gPiBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxKSB7CisJCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXZlbCwgcmJwKTsKKwkJY3VyLT5iY19wdHJzW2xldmVsXSAtPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJfQorCWlmIChsZXZlbCArIDEgPCBjdXItPmJjX25sZXZlbHMpIHsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9kdXBfY3Vyc29yKGN1ciwgY3VycCkpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJKCpjdXJwKS0+YmNfcHRyc1tsZXZlbCArIDFdKys7CisJfQorCSpibm9wID0gYXJncy5mc2JubzsKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkqc3RhdCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFVwZGF0ZSBrZXlzIGZvciB0aGUgcmVjb3JkLgorICovCitTVEFUSUMgaW50Cit4ZnNfYm1idF91cGRrZXkoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAorCXhmc19ibWJ0X2tleV90CQkqa2V5cCwJLyogb24tZGlzayBmb3JtYXQgKi8KKwlpbnQJCQlsZXZlbCkKK3sKKwl4ZnNfYm1idF9ibG9ja190CSpibG9jazsKKwl4ZnNfYnVmX3QJCSpicDsKKyNpZmRlZiBERUJVRworCWludAkJCWVycm9yOworI2VuZGlmCisjaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKwlzdGF0aWMgY2hhcgkJZm5hbWVbXSA9ICJ4ZnNfYm1idF91cGRrZXkiOworI2VuZGlmCisJeGZzX2JtYnRfa2V5X3QJCSprcDsKKwlpbnQJCQlwdHI7CisKKwlBU1NFUlQobGV2ZWwgPj0gMSk7CisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRU5UUlkpOworCVhGU19CTUJUX1RSQUNFX0FSR0lLKGN1ciwgbGV2ZWwsIGtleXApOworCWZvciAocHRyID0gMTsgcHRyID09IDEgJiYgbGV2ZWwgPCBjdXItPmJjX25sZXZlbHM7IGxldmVsKyspIHsKKwkJYmxvY2sgPSB4ZnNfYm1idF9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJmJwKTsKKyNpZmRlZiBERUJVRworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApKSkgeworCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisjZW5kaWYKKwkJcHRyID0gY3VyLT5iY19wdHJzW2xldmVsXTsKKwkJa3AgPSBYRlNfQk1BUF9LRVlfSUFERFIoYmxvY2ssIHB0ciwgY3VyKTsKKwkJKmtwID0gKmtleXA7CisJCXhmc19ibWJ0X2xvZ19rZXlzKGN1ciwgYnAsIHB0ciwgcHRyKTsKKwl9CisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb252ZXJ0IG9uLWRpc2sgZm9ybSBvZiBidHJlZSByb290IHRvIGluLW1lbW9yeSBmb3JtLgorICovCit2b2lkCit4ZnNfYm1kcl90b19ibWJ0KAorCXhmc19ibWRyX2Jsb2NrX3QJKmRibG9jaywKKwlpbnQJCQlkYmxvY2tsZW4sCisJeGZzX2JtYnRfYmxvY2tfdAkqcmJsb2NrLAorCWludAkJCXJibG9ja2xlbikKK3sKKwlpbnQJCQlkbXhyOworCXhmc19ibWJ0X2tleV90CQkqZmtwOworCXhmc19ibWJ0X3B0cl90CQkqZnBwOworCXhmc19ibWJ0X2tleV90CQkqdGtwOworCXhmc19ibWJ0X3B0cl90CQkqdHBwOworCisJSU5UX1NFVChyYmxvY2stPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19CTUFQX01BR0lDKTsKKwlyYmxvY2stPmJiX2xldmVsID0gZGJsb2NrLT5iYl9sZXZlbDsJLyogYm90aCBpbiBvbi1kaXNrIGZvcm1hdCAqLworCUFTU0VSVChJTlRfR0VUKHJibG9jay0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCkgPiAwKTsKKwlyYmxvY2stPmJiX251bXJlY3MgPSBkYmxvY2stPmJiX251bXJlY3M7LyogYm90aCBpbiBvbi1kaXNrIGZvcm1hdCAqLworCUlOVF9TRVQocmJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExERlNCTk8pOworCUlOVF9TRVQocmJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJULCBOVUxMREZTQk5PKTsKKwlkbXhyID0gKGludClYRlNfQlRSRUVfQkxPQ0tfTUFYUkVDUyhkYmxvY2tsZW4sIHhmc19ibWRyLCAwKTsKKwlma3AgPSBYRlNfQlRSRUVfS0VZX0FERFIoZGJsb2NrbGVuLCB4ZnNfYm1kciwgZGJsb2NrLCAxLCBkbXhyKTsKKwl0a3AgPSBYRlNfQk1BUF9CUk9PVF9LRVlfQUREUihyYmxvY2ssIDEsIHJibG9ja2xlbik7CisJZnBwID0gWEZTX0JUUkVFX1BUUl9BRERSKGRibG9ja2xlbiwgeGZzX2JtZHIsIGRibG9jaywgMSwgZG14cik7CisJdHBwID0gWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIocmJsb2NrLCAxLCByYmxvY2tsZW4pOworCWRteHIgPSBJTlRfR0VUKGRibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwltZW1jcHkodGtwLCBma3AsIHNpemVvZigqZmtwKSAqIGRteHIpOworCW1lbWNweSh0cHAsIGZwcCwgc2l6ZW9mKCpmcHApICogZG14cik7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCit9CisKKy8qCisgKiBEZWNyZW1lbnQgY3Vyc29yIGJ5IG9uZSByZWNvcmQgYXQgdGhlIGxldmVsLgorICogRm9yIG5vbnplcm8gbGV2ZWxzIHRoZSBsZWFmLXdhcmQgaW5mb3JtYXRpb24gaXMgdW50b3VjaGVkLgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2JtYnRfZGVjcmVtZW50KAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwKKwlpbnQJCQlsZXZlbCwKKwlpbnQJCQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCXhmc19ibWJ0X2Jsb2NrX3QJKmJsb2NrOworCXhmc19idWZfdAkJKmJwOworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisjaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKwlzdGF0aWMgY2hhcgkJZm5hbWVbXSA9ICJ4ZnNfYm1idF9kZWNyZW1lbnQiOworI2VuZGlmCisJeGZzX2ZzYmxvY2tfdAkJZnNibm87CisJaW50CQkJbGV2OworCXhmc19tb3VudF90CQkqbXA7CisJeGZzX3RyYW5zX3QJCSp0cDsKKworCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVOVFJZKTsKKwlYRlNfQk1CVF9UUkFDRV9BUkdJKGN1ciwgbGV2ZWwpOworCUFTU0VSVChsZXZlbCA8IGN1ci0+YmNfbmxldmVscyk7CisJaWYgKGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzIC0gMSkKKwkJeGZzX2J0cmVlX3JlYWRhaGVhZChjdXIsIGxldmVsLCBYRlNfQlRDVVJfTEVGVFJBKTsKKwlpZiAoLS1jdXItPmJjX3B0cnNbbGV2ZWxdID4gMCkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJKnN0YXQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJYmxvY2sgPSB4ZnNfYm1idF9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJmJwKTsKKyNpZmRlZiBERUJVRworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCkpKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKyNlbmRpZgorCWlmIChJTlRfR0VUKGJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExERlNCTk8pIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWZvciAobGV2ID0gbGV2ZWwgKyAxOyBsZXYgPCBjdXItPmJjX25sZXZlbHM7IGxldisrKSB7CisJCWlmICgtLWN1ci0+YmNfcHRyc1tsZXZdID4gMCkKKwkJCWJyZWFrOworCQlpZiAobGV2IDwgY3VyLT5iY19ubGV2ZWxzIC0gMSkKKwkJCXhmc19idHJlZV9yZWFkYWhlYWQoY3VyLCBsZXYsIFhGU19CVENVUl9MRUZUUkEpOworCX0KKwlpZiAobGV2ID09IGN1ci0+YmNfbmxldmVscykgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJdHAgPSBjdXItPmJjX3RwOworCW1wID0gY3VyLT5iY19tcDsKKwlmb3IgKGJsb2NrID0geGZzX2JtYnRfZ2V0X2Jsb2NrKGN1ciwgbGV2LCAmYnApOyBsZXYgPiBsZXZlbDsgKSB7CisJCWZzYm5vID0gSU5UX0dFVCgqWEZTX0JNQVBfUFRSX0lBRERSKGJsb2NrLCBjdXItPmJjX3B0cnNbbGV2XSwgY3VyKSwgQVJDSF9DT05WRVJUKTsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZmwobXAsIHRwLCBmc2JubywgMCwgJmJwLAorCQkJCVhGU19CTUFQX0JUUkVFX1JFRikpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJbGV2LS07CisJCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXYsIGJwKTsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soYnApOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIGJsb2NrLCBsZXYsIGJwKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQljdXItPmJjX3B0cnNbbGV2XSA9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJfQorCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlbGV0ZSB0aGUgcmVjb3JkIHBvaW50ZWQgdG8gYnkgY3VyLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYm1idF9kZWxldGUoCisJeGZzX2J0cmVlX2N1cl90CSpjdXIsCisJaW50CQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCWludAkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKyNpZmRlZiBYRlNfQk1CVF9UUkFDRQorCXN0YXRpYyBjaGFyCWZuYW1lW10gPSAieGZzX2JtYnRfZGVsZXRlIjsKKyNlbmRpZgorCWludAkJaTsKKwlpbnQJCWxldmVsOworCisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRU5UUlkpOworCWZvciAobGV2ZWwgPSAwLCBpID0gMjsgaSA9PSAyOyBsZXZlbCsrKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9kZWxyZWMoY3VyLCBsZXZlbCwgJmkpKSkgeworCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJfQorCWlmIChpID09IDApIHsKKwkJZm9yIChsZXZlbCA9IDE7IGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzOyBsZXZlbCsrKSB7CisJCQlpZiAoY3VyLT5iY19wdHJzW2xldmVsXSA9PSAwKSB7CisJCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlY3JlbWVudChjdXIsIGxldmVsLAorCQkJCQkJJmkpKSkgeworCQkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQkJCXJldHVybiBlcnJvcjsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJKnN0YXQgPSBpOworCXJldHVybiAwOworfQorCisvKgorICogQ29udmVydCBhIGNvbXByZXNzZWQgYm1hcCBleHRlbnQgcmVjb3JkIHRvIGFuIHVuY29tcHJlc3NlZCBmb3JtLgorICogVGhpcyBjb2RlIG11c3QgYmUgaW4gc3luYyB3aXRoIHRoZSByb3V0aW5lcyB4ZnNfYm1idF9nZXRfc3RhcnRvZmYsCisgKiB4ZnNfYm1idF9nZXRfc3RhcnRibG9jaywgeGZzX2JtYnRfZ2V0X2Jsb2NrY291bnQgYW5kIHhmc19ibWJ0X2dldF9zdGF0ZS4KKyAqLworCitTVEFUSUMgX19pbmxpbmVfXyB2b2lkCitfX3hmc19ibWJ0X2dldF9hbGwoCisJCV9fdWludDY0X3QgbDAsCisJCV9fdWludDY0X3QgbDEsCisJCXhmc19ibWJ0X2lyZWNfdCAqcykKK3sKKwlpbnQJZXh0X2ZsYWc7CisJeGZzX2V4bnRzdF90IHN0OworCisJZXh0X2ZsYWcgPSAoaW50KShsMCA+PiAoNjQgLSBCTUJUX0VYTlRGTEFHX0JJVExFTikpOworCXMtPmJyX3N0YXJ0b2ZmID0gKCh4ZnNfZmlsZW9mZl90KWwwICYKKwkJCSAgIFhGU19NQVNLNjRMTyg2NCAtIEJNQlRfRVhOVEZMQUdfQklUTEVOKSkgPj4gOTsKKyNpZiBYRlNfQklHX0JMS05PUworCXMtPmJyX3N0YXJ0YmxvY2sgPSAoKCh4ZnNfZnNibG9ja190KWwwICYgWEZTX01BU0s2NExPKDkpKSA8PCA0MykgfAorCQkJICAgKCgoeGZzX2ZzYmxvY2tfdClsMSkgPj4gMjEpOworI2Vsc2UKKyNpZmRlZiBERUJVRworCXsKKwkJeGZzX2Rmc2Jub190CWI7CisKKwkJYiA9ICgoKHhmc19kZnNibm9fdClsMCAmIFhGU19NQVNLNjRMTyg5KSkgPDwgNDMpIHwKKwkJICAgICgoKHhmc19kZnNibm9fdClsMSkgPj4gMjEpOworCQlBU1NFUlQoKGIgPj4gMzIpID09IDAgfHwgSVNOVUxMRFNUQVJUQkxPQ0soYikpOworCQlzLT5icl9zdGFydGJsb2NrID0gKHhmc19mc2Jsb2NrX3QpYjsKKwl9CisjZWxzZQkvKiAhREVCVUcgKi8KKwlzLT5icl9zdGFydGJsb2NrID0gKHhmc19mc2Jsb2NrX3QpKCgoeGZzX2Rmc2Jub190KWwxKSA+PiAyMSk7CisjZW5kaWYJLyogREVCVUcgKi8KKyNlbmRpZgkvKiBYRlNfQklHX0JMS05PUyAqLworCXMtPmJyX2Jsb2NrY291bnQgPSAoeGZzX2ZpbGJsa3NfdCkobDEgJiBYRlNfTUFTSzY0TE8oMjEpKTsKKwkvKiBUaGlzIGlzIHhmc19leHRlbnRfc3RhdGUoKSBpbi1saW5lICovCisJaWYgKGV4dF9mbGFnKSB7CisJCUFTU0VSVChzLT5icl9ibG9ja2NvdW50ICE9IDApOwkvKiBzYXZlZCBmb3IgRE1JRyAqLworCQlzdCA9IFhGU19FWFRfVU5XUklUVEVOOworCX0gZWxzZQorCQlzdCA9IFhGU19FWFRfTk9STTsKKwlzLT5icl9zdGF0ZSA9IHN0OworfQorCit2b2lkCit4ZnNfYm1idF9nZXRfYWxsKAorCXhmc19ibWJ0X3JlY190CSpyLAorCXhmc19ibWJ0X2lyZWNfdCAqcykKK3sKKwlfX3hmc19ibWJ0X2dldF9hbGwoci0+bDAsIHItPmwxLCBzKTsKK30KKworLyoKKyAqIEdldCB0aGUgYmxvY2sgcG9pbnRlciBmb3IgdGhlIGdpdmVuIGxldmVsIG9mIHRoZSBjdXJzb3IuCisgKiBGaWxsIGluIHRoZSBidWZmZXIgcG9pbnRlciwgaWYgYXBwbGljYWJsZS4KKyAqLworeGZzX2JtYnRfYmxvY2tfdCAqCit4ZnNfYm1idF9nZXRfYmxvY2soCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAorCWludAkJCWxldmVsLAorCXhmc19idWZfdAkJKipicHApCit7CisJeGZzX2lmb3JrX3QJCSppZnA7CisJeGZzX2JtYnRfYmxvY2tfdAkqcnZhbDsKKworCWlmIChsZXZlbCA8IGN1ci0+YmNfbmxldmVscyAtIDEpIHsKKwkJKmJwcCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CisJCXJ2YWwgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soKmJwcCk7CisJfSBlbHNlIHsKKwkJKmJwcCA9IE5VTEw7CisJCWlmcCA9IFhGU19JRk9SS19QVFIoY3VyLT5iY19wcml2YXRlLmIuaXAsCisJCQljdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspOworCQlydmFsID0gaWZwLT5pZl9icm9vdDsKKwl9CisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBFeHRyYWN0IHRoZSBibG9ja2NvdW50IGZpZWxkIGZyb20gYW4gaW4gbWVtb3J5IGJtYXAgZXh0ZW50IHJlY29yZC4KKyAqLworeGZzX2ZpbGJsa3NfdAoreGZzX2JtYnRfZ2V0X2Jsb2NrY291bnQoCisJeGZzX2JtYnRfcmVjX3QJKnIpCit7CisJcmV0dXJuICh4ZnNfZmlsYmxrc190KShyLT5sMSAmIFhGU19NQVNLNjRMTygyMSkpOworfQorCisvKgorICogRXh0cmFjdCB0aGUgc3RhcnRibG9jayBmaWVsZCBmcm9tIGFuIGluIG1lbW9yeSBibWFwIGV4dGVudCByZWNvcmQuCisgKi8KK3hmc19mc2Jsb2NrX3QKK3hmc19ibWJ0X2dldF9zdGFydGJsb2NrKAorCXhmc19ibWJ0X3JlY190CSpyKQoreworI2lmIFhGU19CSUdfQkxLTk9TCisJcmV0dXJuICgoKHhmc19mc2Jsb2NrX3Qpci0+bDAgJiBYRlNfTUFTSzY0TE8oOSkpIDw8IDQzKSB8CisJICAgICAgICgoKHhmc19mc2Jsb2NrX3Qpci0+bDEpID4+IDIxKTsKKyNlbHNlCisjaWZkZWYgREVCVUcKKwl4ZnNfZGZzYm5vX3QJYjsKKworCWIgPSAoKCh4ZnNfZGZzYm5vX3Qpci0+bDAgJiBYRlNfTUFTSzY0TE8oOSkpIDw8IDQzKSB8CisJICAgICgoKHhmc19kZnNibm9fdClyLT5sMSkgPj4gMjEpOworCUFTU0VSVCgoYiA+PiAzMikgPT0gMCB8fCBJU05VTExEU1RBUlRCTE9DSyhiKSk7CisJcmV0dXJuICh4ZnNfZnNibG9ja190KWI7CisjZWxzZQkvKiAhREVCVUcgKi8KKwlyZXR1cm4gKHhmc19mc2Jsb2NrX3QpKCgoeGZzX2Rmc2Jub190KXItPmwxKSA+PiAyMSk7CisjZW5kaWYJLyogREVCVUcgKi8KKyNlbmRpZgkvKiBYRlNfQklHX0JMS05PUyAqLworfQorCisvKgorICogRXh0cmFjdCB0aGUgc3RhcnRvZmYgZmllbGQgZnJvbSBhbiBpbiBtZW1vcnkgYm1hcCBleHRlbnQgcmVjb3JkLgorICovCit4ZnNfZmlsZW9mZl90Cit4ZnNfYm1idF9nZXRfc3RhcnRvZmYoCisJeGZzX2JtYnRfcmVjX3QJKnIpCit7CisJcmV0dXJuICgoeGZzX2ZpbGVvZmZfdClyLT5sMCAmCisJCSBYRlNfTUFTSzY0TE8oNjQgLSBCTUJUX0VYTlRGTEFHX0JJVExFTikpID4+IDk7Cit9CisKK3hmc19leG50c3RfdAoreGZzX2JtYnRfZ2V0X3N0YXRlKAorCXhmc19ibWJ0X3JlY190CSpyKQoreworCWludAlleHRfZmxhZzsKKworCWV4dF9mbGFnID0gKGludCkoKHItPmwwKSA+PiAoNjQgLSBCTUJUX0VYTlRGTEFHX0JJVExFTikpOworCXJldHVybiB4ZnNfZXh0ZW50X3N0YXRlKHhmc19ibWJ0X2dldF9ibG9ja2NvdW50KHIpLAorCQkJCWV4dF9mbGFnKTsKK30KKworI2lmIF9fQllURV9PUkRFUiAhPSBfX0JJR19FTkRJQU4KKy8qIEVuZGlhbiBmbGlwcGluZyB2ZXJzaW9ucyBvZiB0aGUgYm1idCBleHRyYWN0aW9uIGZ1bmN0aW9ucyAqLwordm9pZAoreGZzX2JtYnRfZGlza19nZXRfYWxsKAorCXhmc19ibWJ0X3JlY190CSpyLAorCXhmc19ibWJ0X2lyZWNfdCAqcykKK3sKKwlfX3VpbnQ2NF90CWwwLCBsMTsKKworCWwwID0gSU5UX0dFVChyLT5sMCwgQVJDSF9DT05WRVJUKTsKKwlsMSA9IElOVF9HRVQoci0+bDEsIEFSQ0hfQ09OVkVSVCk7CisKKwlfX3hmc19ibWJ0X2dldF9hbGwobDAsIGwxLCBzKTsKK30KKworLyoKKyAqIEV4dHJhY3QgdGhlIGJsb2NrY291bnQgZmllbGQgZnJvbSBhbiBvbiBkaXNrIGJtYXAgZXh0ZW50IHJlY29yZC4KKyAqLworeGZzX2ZpbGJsa3NfdAoreGZzX2JtYnRfZGlza19nZXRfYmxvY2tjb3VudCgKKwl4ZnNfYm1idF9yZWNfdAkqcikKK3sKKwlyZXR1cm4gKHhmc19maWxibGtzX3QpKElOVF9HRVQoci0+bDEsIEFSQ0hfQ09OVkVSVCkgJiBYRlNfTUFTSzY0TE8oMjEpKTsKK30KKworLyoKKyAqIEV4dHJhY3QgdGhlIHN0YXJ0YmxvY2sgZmllbGQgZnJvbSBhbiBvbiBkaXNrIGJtYXAgZXh0ZW50IHJlY29yZC4KKyAqLworeGZzX2ZzYmxvY2tfdAoreGZzX2JtYnRfZGlza19nZXRfc3RhcnRibG9jaygKKwl4ZnNfYm1idF9yZWNfdAkqcikKK3sKKyNpZiBYRlNfQklHX0JMS05PUworCXJldHVybiAoKCh4ZnNfZnNibG9ja190KUlOVF9HRVQoci0+bDAsIEFSQ0hfQ09OVkVSVCkgJiBYRlNfTUFTSzY0TE8oOSkpIDw8IDQzKSB8CisJICAgICAgICgoKHhmc19mc2Jsb2NrX3QpSU5UX0dFVChyLT5sMSwgQVJDSF9DT05WRVJUKSkgPj4gMjEpOworI2Vsc2UKKyNpZmRlZiBERUJVRworCXhmc19kZnNibm9fdAliOworCisJYiA9ICgoKHhmc19kZnNibm9fdClJTlRfR0VUKHItPmwwLCBBUkNIX0NPTlZFUlQpICYgWEZTX01BU0s2NExPKDkpKSA8PCA0MykgfAorCSAgICAoKCh4ZnNfZGZzYm5vX3QpSU5UX0dFVChyLT5sMSwgQVJDSF9DT05WRVJUKSkgPj4gMjEpOworCUFTU0VSVCgoYiA+PiAzMikgPT0gMCB8fCBJU05VTExEU1RBUlRCTE9DSyhiKSk7CisJcmV0dXJuICh4ZnNfZnNibG9ja190KWI7CisjZWxzZQkvKiAhREVCVUcgKi8KKwlyZXR1cm4gKHhmc19mc2Jsb2NrX3QpKCgoeGZzX2Rmc2Jub190KUlOVF9HRVQoci0+bDEsIEFSQ0hfQ09OVkVSVCkpID4+IDIxKTsKKyNlbmRpZgkvKiBERUJVRyAqLworI2VuZGlmCS8qIFhGU19CSUdfQkxLTk9TICovCit9CisKKy8qCisgKiBFeHRyYWN0IHRoZSBzdGFydG9mZiBmaWVsZCBmcm9tIGEgZGlzayBmb3JtYXQgYm1hcCBleHRlbnQgcmVjb3JkLgorICovCit4ZnNfZmlsZW9mZl90Cit4ZnNfYm1idF9kaXNrX2dldF9zdGFydG9mZigKKwl4ZnNfYm1idF9yZWNfdAkqcikKK3sKKwlyZXR1cm4gKCh4ZnNfZmlsZW9mZl90KUlOVF9HRVQoci0+bDAsIEFSQ0hfQ09OVkVSVCkgJgorCQkgWEZTX01BU0s2NExPKDY0IC0gQk1CVF9FWE5URkxBR19CSVRMRU4pKSA+PiA5OworfQorCit4ZnNfZXhudHN0X3QKK3hmc19ibWJ0X2Rpc2tfZ2V0X3N0YXRlKAorCXhmc19ibWJ0X3JlY190ICAqcikKK3sKKwlpbnQJZXh0X2ZsYWc7CisKKwlleHRfZmxhZyA9IChpbnQpKChJTlRfR0VUKHItPmwwLCBBUkNIX0NPTlZFUlQpKSA+PiAoNjQgLSBCTUJUX0VYTlRGTEFHX0JJVExFTikpOworCXJldHVybiB4ZnNfZXh0ZW50X3N0YXRlKHhmc19ibWJ0X2Rpc2tfZ2V0X2Jsb2NrY291bnQociksCisJCQkJZXh0X2ZsYWcpOworfQorI2VuZGlmCisKKworLyoKKyAqIEluY3JlbWVudCBjdXJzb3IgYnkgb25lIHJlY29yZCBhdCB0aGUgbGV2ZWwuCisgKiBGb3Igbm9uemVybyBsZXZlbHMgdGhlIGxlYWYtd2FyZCBpbmZvcm1hdGlvbiBpcyB1bnRvdWNoZWQuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfYm1idF9pbmNyZW1lbnQoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAorCWludAkJCWxldmVsLAorCWludAkJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7CisJeGZzX2J1Zl90CQkqYnA7CisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKyNpZmRlZiBYRlNfQk1CVF9UUkFDRQorCXN0YXRpYyBjaGFyCQlmbmFtZVtdID0gInhmc19ibWJ0X2luY3JlbWVudCI7CisjZW5kaWYKKwl4ZnNfZnNibG9ja190CQlmc2JubzsKKwlpbnQJCQlsZXY7CisJeGZzX21vdW50X3QJCSptcDsKKwl4ZnNfdHJhbnNfdAkJKnRwOworCisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRU5UUlkpOworCVhGU19CTUJUX1RSQUNFX0FSR0koY3VyLCBsZXZlbCk7CisJQVNTRVJUKGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzKTsKKwlpZiAobGV2ZWwgPCBjdXItPmJjX25sZXZlbHMgLSAxKQorCQl4ZnNfYnRyZWVfcmVhZGFoZWFkKGN1ciwgbGV2ZWwsIFhGU19CVENVUl9SSUdIVFJBKTsKKwlibG9jayA9IHhmc19ibWJ0X2dldF9ibG9jayhjdXIsIGxldmVsLCAmYnApOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsIGJwKSkpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorI2VuZGlmCisJaWYgKCsrY3VyLT5iY19wdHJzW2xldmVsXSA8PSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9IDE7CisJCXJldHVybiAwOworCX0KKwlpZiAoSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTERGU0JOTykgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJZm9yIChsZXYgPSBsZXZlbCArIDE7IGxldiA8IGN1ci0+YmNfbmxldmVsczsgbGV2KyspIHsKKwkJYmxvY2sgPSB4ZnNfYm1idF9nZXRfYmxvY2soY3VyLCBsZXYsICZicCk7CisjaWZkZWYgREVCVUcKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCBibG9jaywgbGV2LCBicCkpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKyNlbmRpZgorCQlpZiAoKytjdXItPmJjX3B0cnNbbGV2XSA8PSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKQorCQkJYnJlYWs7CisJCWlmIChsZXYgPCBjdXItPmJjX25sZXZlbHMgLSAxKQorCQkJeGZzX2J0cmVlX3JlYWRhaGVhZChjdXIsIGxldiwgWEZTX0JUQ1VSX1JJR0hUUkEpOworCX0KKwlpZiAobGV2ID09IGN1ci0+YmNfbmxldmVscykgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJdHAgPSBjdXItPmJjX3RwOworCW1wID0gY3VyLT5iY19tcDsKKwlmb3IgKGJsb2NrID0geGZzX2JtYnRfZ2V0X2Jsb2NrKGN1ciwgbGV2LCAmYnApOyBsZXYgPiBsZXZlbDsgKSB7CisJCWZzYm5vID0gSU5UX0dFVCgqWEZTX0JNQVBfUFRSX0lBRERSKGJsb2NrLCBjdXItPmJjX3B0cnNbbGV2XSwgY3VyKSwgQVJDSF9DT05WRVJUKTsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZmwobXAsIHRwLCBmc2JubywgMCwgJmJwLAorCQkJCVhGU19CTUFQX0JUUkVFX1JFRikpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJbGV2LS07CisJCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXYsIGJwKTsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soYnApOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIGJsb2NrLCBsZXYsIGJwKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQljdXItPmJjX3B0cnNbbGV2XSA9IDE7CisJfQorCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluc2VydCB0aGUgY3VycmVudCByZWNvcmQgYXQgdGhlIHBvaW50IHJlZmVyZW5jZWQgYnkgY3VyLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYm1idF9pbnNlcnQoCisJeGZzX2J0cmVlX2N1cl90CSpjdXIsCisJaW50CQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCWludAkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKyNpZmRlZiBYRlNfQk1CVF9UUkFDRQorCXN0YXRpYyBjaGFyCWZuYW1lW10gPSAieGZzX2JtYnRfaW5zZXJ0IjsKKyNlbmRpZgorCWludAkJaTsKKwlpbnQJCWxldmVsOworCXhmc19mc2Jsb2NrX3QJbmJubzsKKwl4ZnNfYnRyZWVfY3VyX3QJKm5jdXI7CisJeGZzX2JtYnRfcmVjX3QJbnJlYzsKKwl4ZnNfYnRyZWVfY3VyX3QJKnBjdXI7CisKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7CisJbGV2ZWwgPSAwOworCW5ibm8gPSBOVUxMRlNCTE9DSzsKKwl4ZnNfYm1idF9kaXNrX3NldF9hbGwoJm5yZWMsICZjdXItPmJjX3JlYy5iKTsKKwluY3VyID0gKHhmc19idHJlZV9jdXJfdCAqKTA7CisJcGN1ciA9IGN1cjsKKwlkbyB7CisJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9pbnNyZWMocGN1ciwgbGV2ZWwrKywgJm5ibm8sICZucmVjLCAmbmN1ciwKKwkJCQkmaSkpKSB7CisJCQlpZiAocGN1ciAhPSBjdXIpCisJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IocGN1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCWlmIChwY3VyICE9IGN1ciAmJiAobmN1ciB8fCBuYm5vID09IE5VTExGU0JMT0NLKSkgeworCQkJY3VyLT5iY19ubGV2ZWxzID0gcGN1ci0+YmNfbmxldmVsczsKKwkJCWN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZCArPQorCQkJCXBjdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQ7CisJCQlwY3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkID0gMDsKKwkJCUFTU0VSVCgoY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jayAhPSBOVUxMRlNCTE9DSykgfHwKKwkJCSAgICAgICAoY3VyLT5iY19wcml2YXRlLmIuaXAtPmlfZC5kaV9mbGFncyAmCisJCQkJWEZTX0RJRkxBR19SRUFMVElNRSkpOworCQkJY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jayA9CisJCQkJcGN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2s7CisJCQlBU1NFUlQoY3VyLT5iY19wcml2YXRlLmIuZmxpc3QgPT0KKwkJCSAgICAgICBwY3VyLT5iY19wcml2YXRlLmIuZmxpc3QpOworCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IocGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCQl9CisJCWlmIChuY3VyKSB7CisJCQlwY3VyID0gbmN1cjsKKwkJCW5jdXIgPSAoeGZzX2J0cmVlX2N1cl90ICopMDsKKwkJfQorCX0gd2hpbGUgKG5ibm8gIT0gTlVMTEZTQkxPQ0spOworCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCSpzdGF0ID0gaTsKKwlyZXR1cm4gMDsKK2Vycm9yMDoKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogTG9nIGZpZWxkcyBmcm9tIHRoZSBidHJlZSBibG9jayBoZWFkZXIuCisgKi8KK3ZvaWQKK3hmc19ibWJ0X2xvZ19ibG9jaygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCisJeGZzX2J1Zl90CQkqYnAsCisJaW50CQkJZmllbGRzKQoreworCWludAkJCWZpcnN0OworI2lmZGVmIFhGU19CTUJUX1RSQUNFCisJc3RhdGljIGNoYXIJCWZuYW1lW10gPSAieGZzX2JtYnRfbG9nX2Jsb2NrIjsKKyNlbmRpZgorCWludAkJCWxhc3Q7CisJeGZzX3RyYW5zX3QJCSp0cDsKKwlzdGF0aWMgY29uc3Qgc2hvcnQJb2Zmc2V0c1tdID0geworCQlvZmZzZXRvZih4ZnNfYm1idF9ibG9ja190LCBiYl9tYWdpYyksCisJCW9mZnNldG9mKHhmc19ibWJ0X2Jsb2NrX3QsIGJiX2xldmVsKSwKKwkJb2Zmc2V0b2YoeGZzX2JtYnRfYmxvY2tfdCwgYmJfbnVtcmVjcyksCisJCW9mZnNldG9mKHhmc19ibWJ0X2Jsb2NrX3QsIGJiX2xlZnRzaWIpLAorCQlvZmZzZXRvZih4ZnNfYm1idF9ibG9ja190LCBiYl9yaWdodHNpYiksCisJCXNpemVvZih4ZnNfYm1idF9ibG9ja190KQorCX07CisKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7CisJWEZTX0JNQlRfVFJBQ0VfQVJHQkkoY3VyLCBicCwgZmllbGRzKTsKKwl0cCA9IGN1ci0+YmNfdHA7CisJaWYgKGJwKSB7CisJCXhmc19idHJlZV9vZmZzZXRzKGZpZWxkcywgb2Zmc2V0cywgWEZTX0JCX05VTV9CSVRTLCAmZmlyc3QsCisJCQkJICAmbGFzdCk7CisJCXhmc190cmFuc19sb2dfYnVmKHRwLCBicCwgZmlyc3QsIGxhc3QpOworCX0gZWxzZQorCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBjdXItPmJjX3ByaXZhdGUuYi5pcCwKKwkJCVhGU19JTE9HX0ZCUk9PVChjdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspKTsKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKK30KKworLyoKKyAqIExvZyByZWNvcmQgdmFsdWVzIGZyb20gdGhlIGJ0cmVlIGJsb2NrLgorICovCit2b2lkCit4ZnNfYm1idF9sb2dfcmVjcygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCisJeGZzX2J1Zl90CQkqYnAsCisJaW50CQkJcmZpcnN0LAorCWludAkJCXJsYXN0KQoreworCXhmc19ibWJ0X2Jsb2NrX3QJKmJsb2NrOworCWludAkJCWZpcnN0OworI2lmZGVmIFhGU19CTUJUX1RSQUNFCisJc3RhdGljIGNoYXIJCWZuYW1lW10gPSAieGZzX2JtYnRfbG9nX3JlY3MiOworI2VuZGlmCisJaW50CQkJbGFzdDsKKwl4ZnNfYm1idF9yZWNfdAkJKnJwOworCXhmc190cmFuc190CQkqdHA7CisKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7CisJWEZTX0JNQlRfVFJBQ0VfQVJHQklJKGN1ciwgYnAsIHJmaXJzdCwgcmxhc3QpOworCUFTU0VSVChicCk7CisJdHAgPSBjdXItPmJjX3RwOworCWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKKwlycCA9IFhGU19CTUFQX1JFQ19EQUREUihibG9jaywgMSwgY3VyKTsKKwlmaXJzdCA9IChpbnQpKCh4ZnNfY2FkZHJfdCkmcnBbcmZpcnN0IC0gMV0gLSAoeGZzX2NhZGRyX3QpYmxvY2spOworCWxhc3QgPSAoaW50KSgoKHhmc19jYWRkcl90KSZycFtybGFzdF0gLSAxKSAtICh4ZnNfY2FkZHJfdClibG9jayk7CisJeGZzX3RyYW5zX2xvZ19idWYodHAsIGJwLCBmaXJzdCwgbGFzdCk7CisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7Cit9CisKK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWJ0X2xvb2t1cF9lcSgKKwl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwKKwl4ZnNfZmlsZW9mZl90CW9mZiwKKwl4ZnNfZnNibG9ja190CWJubywKKwl4ZnNfZmlsYmxrc190CWxlbiwKKwlpbnQJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJY3VyLT5iY19yZWMuYi5icl9zdGFydG9mZiA9IG9mZjsKKwljdXItPmJjX3JlYy5iLmJyX3N0YXJ0YmxvY2sgPSBibm87CisJY3VyLT5iY19yZWMuYi5icl9ibG9ja2NvdW50ID0gbGVuOworCXJldHVybiB4ZnNfYm1idF9sb29rdXAoY3VyLCBYRlNfTE9PS1VQX0VRLCBzdGF0KTsKK30KKworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2JtYnRfbG9va3VwX2dlKAorCXhmc19idHJlZV9jdXJfdAkqY3VyLAorCXhmc19maWxlb2ZmX3QJb2ZmLAorCXhmc19mc2Jsb2NrX3QJYm5vLAorCXhmc19maWxibGtzX3QJbGVuLAorCWludAkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwljdXItPmJjX3JlYy5iLmJyX3N0YXJ0b2ZmID0gb2ZmOworCWN1ci0+YmNfcmVjLmIuYnJfc3RhcnRibG9jayA9IGJubzsKKwljdXItPmJjX3JlYy5iLmJyX2Jsb2NrY291bnQgPSBsZW47CisJcmV0dXJuIHhmc19ibWJ0X2xvb2t1cChjdXIsIFhGU19MT09LVVBfR0UsIHN0YXQpOworfQorCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYm1idF9sb29rdXBfbGUoCisJeGZzX2J0cmVlX2N1cl90CSpjdXIsCisJeGZzX2ZpbGVvZmZfdAlvZmYsCisJeGZzX2ZzYmxvY2tfdAlibm8sCisJeGZzX2ZpbGJsa3NfdAlsZW4sCisJaW50CQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCWN1ci0+YmNfcmVjLmIuYnJfc3RhcnRvZmYgPSBvZmY7CisJY3VyLT5iY19yZWMuYi5icl9zdGFydGJsb2NrID0gYm5vOworCWN1ci0+YmNfcmVjLmIuYnJfYmxvY2tjb3VudCA9IGxlbjsKKwlyZXR1cm4geGZzX2JtYnRfbG9va3VwKGN1ciwgWEZTX0xPT0tVUF9MRSwgc3RhdCk7Cit9CisKKy8qCisgKiBHaXZlIHRoZSBibWFwIGJ0cmVlIGEgbmV3IHJvb3QgYmxvY2suICBDb3B5IHRoZSBvbGQgYnJvb3QgY29udGVudHMKKyAqIGRvd24gaW50byBhIHJlYWwgYmxvY2sgYW5kIG1ha2UgdGhlIGJyb290IHBvaW50IHRvIGl0LgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2JtYnRfbmV3cm9vdCgKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCQkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQkqbG9nZmxhZ3MsCS8qIGxvZ2dpbmcgZmxhZ3MgZm9yIGlub2RlICovCisJaW50CQkJKnN0YXQpCQkvKiByZXR1cm4gc3RhdHVzIC0gMCBmYWlsICovCit7CisJeGZzX2FsbG9jX2FyZ190CQlhcmdzOwkJLyogYWxsb2NhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfYm1idF9ibG9ja190CSpibG9jazsJCS8qIGJtYXAgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfYnVmX3QJCSpicDsJCS8qIGJ1ZmZlciBmb3IgYmxvY2sgKi8KKwl4ZnNfYm1idF9ibG9ja190CSpjYmxvY2s7CS8qIGNoaWxkIGJ0cmVlIGJsb2NrICovCisJeGZzX2JtYnRfa2V5X3QJCSpja3A7CQkvKiBjaGlsZCBrZXkgcG9pbnRlciAqLworCXhmc19ibWJ0X3B0cl90CQkqY3BwOwkJLyogY2hpbGQgcHRyIHBvaW50ZXIgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiBjb2RlICovCisjaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKwlzdGF0aWMgY2hhcgkJZm5hbWVbXSA9ICJ4ZnNfYm1idF9uZXdyb290IjsKKyNlbmRpZgorI2lmZGVmIERFQlVHCisJaW50CQkJaTsJCS8qIGxvb3AgY291bnRlciAqLworI2VuZGlmCisJeGZzX2JtYnRfa2V5X3QJCSprcDsJCS8qIHBvaW50ZXIgdG8gYm1hcCBidHJlZSBrZXkgKi8KKwlpbnQJCQlsZXZlbDsJCS8qIGJ0cmVlIGxldmVsICovCisJeGZzX2JtYnRfcHRyX3QJCSpwcDsJCS8qIHBvaW50ZXIgdG8gYm1hcCBibG9jayBhZGRyICovCisKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7CisJbGV2ZWwgPSBjdXItPmJjX25sZXZlbHMgLSAxOworCWJsb2NrID0geGZzX2JtYnRfZ2V0X2Jsb2NrKGN1ciwgbGV2ZWwsICZicCk7CisJLyoKKwkgKiBDb3B5IHRoZSByb290IGludG8gYSByZWFsIGJsb2NrLgorCSAqLworCWFyZ3MubXAgPSBjdXItPmJjX21wOworCXBwID0gWEZTX0JNQVBfUFRSX0lBRERSKGJsb2NrLCAxLCBjdXIpOworCWFyZ3MudHAgPSBjdXItPmJjX3RwOworCWFyZ3MuZnNibm8gPSBjdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrOworCWFyZ3MubW9kID0gYXJncy5taW5sZWZ0ID0gYXJncy5hbGlnbm1lbnQgPSBhcmdzLnRvdGFsID0gYXJncy5pc2ZsID0KKwkJYXJncy51c2VyZGF0YSA9IGFyZ3MubWluYWxpZ25zbG9wID0gMDsKKwlhcmdzLm1pbmxlbiA9IGFyZ3MubWF4bGVuID0gYXJncy5wcm9kID0gMTsKKwlhcmdzLndhc2RlbCA9IGN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzICYgWEZTX0JUQ1VSX0JQUlZfV0FTREVMOworCWlmIChhcmdzLmZzYm5vID09IE5VTExGU0JMT0NLKSB7CisjaWZkZWYgREVCVUcKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19scHRyKGN1ciwgSU5UX0dFVCgqcHAsIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorI2VuZGlmCisJCWFyZ3MuZnNibm8gPSBJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKTsKKwkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9TVEFSVF9CTk87CisJfSBlbHNlIGlmIChhcmdzLndhc2RlbCkKKwkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9GSVJTVF9BRzsKKwllbHNlCisJCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfTkVBUl9CTk87CisJaWYgKChlcnJvciA9IHhmc19hbGxvY192ZXh0ZW50KCZhcmdzKSkpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCWlmIChhcmdzLmZzYm5vID09IE5VTExGU0JMT0NLKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwlBU1NFUlQoYXJncy5sZW4gPT0gMSk7CisJY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jayA9IGFyZ3MuZnNibm87CisJY3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkKys7CisJY3VyLT5iY19wcml2YXRlLmIuaXAtPmlfZC5kaV9uYmxvY2tzKys7CisJWEZTX1RSQU5TX01PRF9EUVVPVF9CWUlOTyhhcmdzLm1wLCBhcmdzLnRwLCBjdXItPmJjX3ByaXZhdGUuYi5pcCwKKwkJCSAgWEZTX1RSQU5TX0RRX0JDT1VOVCwgMUwpOworCWJwID0geGZzX2J0cmVlX2dldF9idWZsKGFyZ3MubXAsIGN1ci0+YmNfdHAsIGFyZ3MuZnNibm8sIDApOworCWNibG9jayA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhicCk7CisJKmNibG9jayA9ICpibG9jazsKKwlJTlRfTU9EKGJsb2NrLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJULCArMSk7CisJSU5UX1NFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAxKTsKKwljdXItPmJjX25sZXZlbHMrKzsKKwljdXItPmJjX3B0cnNbbGV2ZWwgKyAxXSA9IDE7CisJa3AgPSBYRlNfQk1BUF9LRVlfSUFERFIoYmxvY2ssIDEsIGN1cik7CisJY2twID0gWEZTX0JNQVBfS0VZX0lBRERSKGNibG9jaywgMSwgY3VyKTsKKwltZW1jcHkoY2twLCBrcCwgSU5UX0dFVChjYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKmtwKSk7CisJY3BwID0gWEZTX0JNQVBfUFRSX0lBRERSKGNibG9jaywgMSwgY3VyKTsKKyNpZmRlZiBERUJVRworCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKGNibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsgaSsrKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbHB0cihjdXIsIElOVF9HRVQocHBbaV0sIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCX0KKyNlbmRpZgorCW1lbWNweShjcHAsIHBwLCBJTlRfR0VUKGNibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcHApKTsKKyNpZmRlZiBERUJVRworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbHB0cihjdXIsICh4ZnNfYm1idF9wdHJfdClhcmdzLmZzYm5vLAorCQkJbGV2ZWwpKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCXJldHVybiBlcnJvcjsKKwl9CisjZW5kaWYKKwlJTlRfU0VUKCpwcCwgQVJDSF9DT05WRVJULCBhcmdzLmZzYm5vKTsKKwl4ZnNfaXJvb3RfcmVhbGxvYyhjdXItPmJjX3ByaXZhdGUuYi5pcCwgMSAtIElOVF9HRVQoY2Jsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpLAorCQljdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspOworCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXZlbCwgYnApOworCS8qCisJICogRG8gYWxsIHRoaXMgbG9nZ2luZyBhdCB0aGUgZW5kIHNvIHRoYXQKKwkgKiB0aGUgcm9vdCBpcyBhdCB0aGUgcmlnaHQgbGV2ZWwuCisJICovCisJeGZzX2JtYnRfbG9nX2Jsb2NrKGN1ciwgYnAsIFhGU19CQl9BTExfQklUUyk7CisJeGZzX2JtYnRfbG9nX2tleXMoY3VyLCBicCwgMSwgSU5UX0dFVChjYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCXhmc19ibWJ0X2xvZ19wdHJzKGN1ciwgYnAsIDEsIElOVF9HRVQoY2Jsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkqbG9nZmxhZ3MgfD0KKwkJWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0ZCUk9PVChjdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspOworCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCBhbGwgdGhlIGZpZWxkcyBpbiBhIGJtYXAgZXh0ZW50IHJlY29yZCBmcm9tIHRoZSB1bmNvbXByZXNzZWQgZm9ybS4KKyAqLwordm9pZAoreGZzX2JtYnRfc2V0X2FsbCgKKwl4ZnNfYm1idF9yZWNfdAkqciwKKwl4ZnNfYm1idF9pcmVjX3QJKnMpCit7CisJaW50CWV4dGVudF9mbGFnOworCisJQVNTRVJUKChzLT5icl9zdGF0ZSA9PSBYRlNfRVhUX05PUk0pIHx8CisJCShzLT5icl9zdGF0ZSA9PSBYRlNfRVhUX1VOV1JJVFRFTikpOworCWV4dGVudF9mbGFnID0gKHMtPmJyX3N0YXRlID09IFhGU19FWFRfTk9STSkgPyAwIDogMTsKKwlBU1NFUlQoKHMtPmJyX3N0YXJ0b2ZmICYgWEZTX01BU0s2NEhJKDkpKSA9PSAwKTsKKwlBU1NFUlQoKHMtPmJyX2Jsb2NrY291bnQgJiBYRlNfTUFTSzY0SEkoNDMpKSA9PSAwKTsKKyNpZiBYRlNfQklHX0JMS05PUworCUFTU0VSVCgocy0+YnJfc3RhcnRibG9jayAmIFhGU19NQVNLNjRISSgxMikpID09IDApOworCXItPmwwID0gKCh4ZnNfYm1idF9yZWNfYmFzZV90KWV4dGVudF9mbGFnIDw8IDYzKSB8CisJCSAoKHhmc19ibWJ0X3JlY19iYXNlX3Qpcy0+YnJfc3RhcnRvZmYgPDwgOSkgfAorCQkgKCh4ZnNfYm1idF9yZWNfYmFzZV90KXMtPmJyX3N0YXJ0YmxvY2sgPj4gNDMpOworCXItPmwxID0gKCh4ZnNfYm1idF9yZWNfYmFzZV90KXMtPmJyX3N0YXJ0YmxvY2sgPDwgMjEpIHwKKwkJICgoeGZzX2JtYnRfcmVjX2Jhc2VfdClzLT5icl9ibG9ja2NvdW50ICYKKwkJICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTygyMSkpOworI2Vsc2UJLyogIVhGU19CSUdfQkxLTk9TICovCisJaWYgKElTTlVMTFNUQVJUQkxPQ0socy0+YnJfc3RhcnRibG9jaykpIHsKKwkJci0+bDAgPSAoKHhmc19ibWJ0X3JlY19iYXNlX3QpZXh0ZW50X2ZsYWcgPDwgNjMpIHwKKwkJCSgoeGZzX2JtYnRfcmVjX2Jhc2VfdClzLT5icl9zdGFydG9mZiA8PCA5KSB8CisJCQkgICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTyg5KTsKKwkJci0+bDEgPSBYRlNfTUFTSzY0SEkoMTEpIHwKKwkJCSAgKCh4ZnNfYm1idF9yZWNfYmFzZV90KXMtPmJyX3N0YXJ0YmxvY2sgPDwgMjEpIHwKKwkJCSAgKCh4ZnNfYm1idF9yZWNfYmFzZV90KXMtPmJyX2Jsb2NrY291bnQgJgorCQkJICAgKHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDIxKSk7CisJfSBlbHNlIHsKKwkJci0+bDAgPSAoKHhmc19ibWJ0X3JlY19iYXNlX3QpZXh0ZW50X2ZsYWcgPDwgNjMpIHwKKwkJCSgoeGZzX2JtYnRfcmVjX2Jhc2VfdClzLT5icl9zdGFydG9mZiA8PCA5KTsKKwkJci0+bDEgPSAoKHhmc19ibWJ0X3JlY19iYXNlX3Qpcy0+YnJfc3RhcnRibG9jayA8PCAyMSkgfAorCQkJICAoKHhmc19ibWJ0X3JlY19iYXNlX3Qpcy0+YnJfYmxvY2tjb3VudCAmCisJCQkgICAoeGZzX2JtYnRfcmVjX2Jhc2VfdClYRlNfTUFTSzY0TE8oMjEpKTsKKwl9CisjZW5kaWYJLyogWEZTX0JJR19CTEtOT1MgKi8KK30KKworLyoKKyAqIFNldCBhbGwgdGhlIGZpZWxkcyBpbiBhIGJtYXAgZXh0ZW50IHJlY29yZCBmcm9tIHRoZSBhcmd1bWVudHMuCisgKi8KK3ZvaWQKK3hmc19ibWJ0X3NldF9hbGxmKAorCXhmc19ibWJ0X3JlY190CSpyLAorCXhmc19maWxlb2ZmX3QJbywKKwl4ZnNfZnNibG9ja190CWIsCisJeGZzX2ZpbGJsa3NfdAljLAorCXhmc19leG50c3RfdAl2KQoreworCWludAlleHRlbnRfZmxhZzsKKworCUFTU0VSVCgodiA9PSBYRlNfRVhUX05PUk0pIHx8ICh2ID09IFhGU19FWFRfVU5XUklUVEVOKSk7CisJZXh0ZW50X2ZsYWcgPSAodiA9PSBYRlNfRVhUX05PUk0pID8gMCA6IDE7CisJQVNTRVJUKChvICYgWEZTX01BU0s2NEhJKDY0LUJNQlRfU1RBUlRPRkZfQklUTEVOKSkgPT0gMCk7CisJQVNTRVJUKChjICYgWEZTX01BU0s2NEhJKDY0LUJNQlRfQkxPQ0tDT1VOVF9CSVRMRU4pKSA9PSAwKTsKKyNpZiBYRlNfQklHX0JMS05PUworCUFTU0VSVCgoYiAmIFhGU19NQVNLNjRISSg2NC1CTUJUX1NUQVJUQkxPQ0tfQklUTEVOKSkgPT0gMCk7CisJci0+bDAgPSAoKHhmc19ibWJ0X3JlY19iYXNlX3QpZXh0ZW50X2ZsYWcgPDwgNjMpIHwKKwkJKCh4ZnNfYm1idF9yZWNfYmFzZV90KW8gPDwgOSkgfAorCQkoKHhmc19ibWJ0X3JlY19iYXNlX3QpYiA+PiA0Myk7CisJci0+bDEgPSAoKHhmc19ibWJ0X3JlY19iYXNlX3QpYiA8PCAyMSkgfAorCQkoKHhmc19ibWJ0X3JlY19iYXNlX3QpYyAmCisJCSh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTygyMSkpOworI2Vsc2UJLyogIVhGU19CSUdfQkxLTk9TICovCisJaWYgKElTTlVMTFNUQVJUQkxPQ0soYikpIHsKKwkJci0+bDAgPSAoKHhmc19ibWJ0X3JlY19iYXNlX3QpZXh0ZW50X2ZsYWcgPDwgNjMpIHwKKwkJCSgoeGZzX2JtYnRfcmVjX2Jhc2VfdClvIDw8IDkpIHwKKwkJCSAoeGZzX2JtYnRfcmVjX2Jhc2VfdClYRlNfTUFTSzY0TE8oOSk7CisJCXItPmwxID0gWEZTX01BU0s2NEhJKDExKSB8CisJCQkgICgoeGZzX2JtYnRfcmVjX2Jhc2VfdCliIDw8IDIxKSB8CisJCQkgICgoeGZzX2JtYnRfcmVjX2Jhc2VfdCljICYKKwkJCSAgICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTygyMSkpOworCX0gZWxzZSB7CisJCXItPmwwID0gKCh4ZnNfYm1idF9yZWNfYmFzZV90KWV4dGVudF9mbGFnIDw8IDYzKSB8CisJCQkoKHhmc19ibWJ0X3JlY19iYXNlX3QpbyA8PCA5KTsKKwkJci0+bDEgPSAoKHhmc19ibWJ0X3JlY19iYXNlX3QpYiA8PCAyMSkgfAorCQkJICgoeGZzX2JtYnRfcmVjX2Jhc2VfdCljICYKKwkJCSAoeGZzX2JtYnRfcmVjX2Jhc2VfdClYRlNfTUFTSzY0TE8oMjEpKTsKKwl9CisjZW5kaWYJLyogWEZTX0JJR19CTEtOT1MgKi8KK30KKworI2lmIF9fQllURV9PUkRFUiAhPSBfX0JJR19FTkRJQU4KKy8qCisgKiBTZXQgYWxsIHRoZSBmaWVsZHMgaW4gYSBibWFwIGV4dGVudCByZWNvcmQgZnJvbSB0aGUgdW5jb21wcmVzc2VkIGZvcm0uCisgKi8KK3ZvaWQKK3hmc19ibWJ0X2Rpc2tfc2V0X2FsbCgKKwl4ZnNfYm1idF9yZWNfdAkqciwKKwl4ZnNfYm1idF9pcmVjX3QgKnMpCit7CisJaW50CWV4dGVudF9mbGFnOworCisJQVNTRVJUKChzLT5icl9zdGF0ZSA9PSBYRlNfRVhUX05PUk0pIHx8CisJCShzLT5icl9zdGF0ZSA9PSBYRlNfRVhUX1VOV1JJVFRFTikpOworCWV4dGVudF9mbGFnID0gKHMtPmJyX3N0YXRlID09IFhGU19FWFRfTk9STSkgPyAwIDogMTsKKwlBU1NFUlQoKHMtPmJyX3N0YXJ0b2ZmICYgWEZTX01BU0s2NEhJKDkpKSA9PSAwKTsKKwlBU1NFUlQoKHMtPmJyX2Jsb2NrY291bnQgJiBYRlNfTUFTSzY0SEkoNDMpKSA9PSAwKTsKKyNpZiBYRlNfQklHX0JMS05PUworCUFTU0VSVCgocy0+YnJfc3RhcnRibG9jayAmIFhGU19NQVNLNjRISSgxMikpID09IDApOworCUlOVF9TRVQoci0+bDAsIEFSQ0hfQ09OVkVSVCwgKCh4ZnNfYm1idF9yZWNfYmFzZV90KWV4dGVudF9mbGFnIDw8IDYzKSB8CisJCSAgKCh4ZnNfYm1idF9yZWNfYmFzZV90KXMtPmJyX3N0YXJ0b2ZmIDw8IDkpIHwKKwkJICAoKHhmc19ibWJ0X3JlY19iYXNlX3Qpcy0+YnJfc3RhcnRibG9jayA+PiA0MykpOworCUlOVF9TRVQoci0+bDEsIEFSQ0hfQ09OVkVSVCwgKCh4ZnNfYm1idF9yZWNfYmFzZV90KXMtPmJyX3N0YXJ0YmxvY2sgPDwgMjEpIHwKKwkJICAoKHhmc19ibWJ0X3JlY19iYXNlX3Qpcy0+YnJfYmxvY2tjb3VudCAmCisJCSAgICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTygyMSkpKTsKKyNlbHNlCS8qICFYRlNfQklHX0JMS05PUyAqLworCWlmIChJU05VTExTVEFSVEJMT0NLKHMtPmJyX3N0YXJ0YmxvY2spKSB7CisJCUlOVF9TRVQoci0+bDAsIEFSQ0hfQ09OVkVSVCwgKCh4ZnNfYm1idF9yZWNfYmFzZV90KWV4dGVudF9mbGFnIDw8IDYzKSB8CisJCQkoKHhmc19ibWJ0X3JlY19iYXNlX3Qpcy0+YnJfc3RhcnRvZmYgPDwgOSkgfAorCQkJICAoeGZzX2JtYnRfcmVjX2Jhc2VfdClYRlNfTUFTSzY0TE8oOSkpOworCQlJTlRfU0VUKHItPmwxLCBBUkNIX0NPTlZFUlQsIFhGU19NQVNLNjRISSgxMSkgfAorCQkJICAoKHhmc19ibWJ0X3JlY19iYXNlX3Qpcy0+YnJfc3RhcnRibG9jayA8PCAyMSkgfAorCQkJICAoKHhmc19ibWJ0X3JlY19iYXNlX3Qpcy0+YnJfYmxvY2tjb3VudCAmCisJCQkgICAoeGZzX2JtYnRfcmVjX2Jhc2VfdClYRlNfTUFTSzY0TE8oMjEpKSk7CisJfSBlbHNlIHsKKwkJSU5UX1NFVChyLT5sMCwgQVJDSF9DT05WRVJULCAoKHhmc19ibWJ0X3JlY19iYXNlX3QpZXh0ZW50X2ZsYWcgPDwgNjMpIHwKKwkJCSgoeGZzX2JtYnRfcmVjX2Jhc2VfdClzLT5icl9zdGFydG9mZiA8PCA5KSk7CisJCUlOVF9TRVQoci0+bDEsIEFSQ0hfQ09OVkVSVCwgKCh4ZnNfYm1idF9yZWNfYmFzZV90KXMtPmJyX3N0YXJ0YmxvY2sgPDwgMjEpIHwKKwkJCSAgKCh4ZnNfYm1idF9yZWNfYmFzZV90KXMtPmJyX2Jsb2NrY291bnQgJgorCQkJICAgKHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDIxKSkpOworCX0KKyNlbmRpZgkvKiBYRlNfQklHX0JMS05PUyAqLworfQorCisvKgorICogU2V0IGFsbCB0aGUgZmllbGRzIGluIGEgZGlzayBmb3JtYXQgYm1hcCBleHRlbnQgcmVjb3JkIGZyb20gdGhlIGFyZ3VtZW50cy4KKyAqLwordm9pZAoreGZzX2JtYnRfZGlza19zZXRfYWxsZigKKwl4ZnNfYm1idF9yZWNfdAkqciwKKwl4ZnNfZmlsZW9mZl90CW8sCisJeGZzX2ZzYmxvY2tfdAliLAorCXhmc19maWxibGtzX3QJYywKKwl4ZnNfZXhudHN0X3QJdikKK3sKKwlpbnQJZXh0ZW50X2ZsYWc7CisKKwlBU1NFUlQoKHYgPT0gWEZTX0VYVF9OT1JNKSB8fCAodiA9PSBYRlNfRVhUX1VOV1JJVFRFTikpOworCWV4dGVudF9mbGFnID0gKHYgPT0gWEZTX0VYVF9OT1JNKSA/IDAgOiAxOworCUFTU0VSVCgobyAmIFhGU19NQVNLNjRISSg2NC1CTUJUX1NUQVJUT0ZGX0JJVExFTikpID09IDApOworCUFTU0VSVCgoYyAmIFhGU19NQVNLNjRISSg2NC1CTUJUX0JMT0NLQ09VTlRfQklUTEVOKSkgPT0gMCk7CisjaWYgWEZTX0JJR19CTEtOT1MKKwlBU1NFUlQoKGIgJiBYRlNfTUFTSzY0SEkoNjQtQk1CVF9TVEFSVEJMT0NLX0JJVExFTikpID09IDApOworCUlOVF9TRVQoci0+bDAsIEFSQ0hfQ09OVkVSVCwgKCh4ZnNfYm1idF9yZWNfYmFzZV90KWV4dGVudF9mbGFnIDw8IDYzKSB8CisJCSgoeGZzX2JtYnRfcmVjX2Jhc2VfdClvIDw8IDkpIHwKKwkJKCh4ZnNfYm1idF9yZWNfYmFzZV90KWIgPj4gNDMpKTsKKwlJTlRfU0VUKHItPmwxLCBBUkNIX0NPTlZFUlQsICgoeGZzX2JtYnRfcmVjX2Jhc2VfdCliIDw8IDIxKSB8CisJCSAgKCh4ZnNfYm1idF9yZWNfYmFzZV90KWMgJgorCQkgICAoeGZzX2JtYnRfcmVjX2Jhc2VfdClYRlNfTUFTSzY0TE8oMjEpKSk7CisjZWxzZQkvKiAhWEZTX0JJR19CTEtOT1MgKi8KKwlpZiAoSVNOVUxMU1RBUlRCTE9DSyhiKSkgeworCQlJTlRfU0VUKHItPmwwLCBBUkNIX0NPTlZFUlQsICgoeGZzX2JtYnRfcmVjX2Jhc2VfdClleHRlbnRfZmxhZyA8PCA2MykgfAorCQkJKCh4ZnNfYm1idF9yZWNfYmFzZV90KW8gPDwgOSkgfAorCQkJICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTyg5KSk7CisJCUlOVF9TRVQoci0+bDEsIEFSQ0hfQ09OVkVSVCwgWEZTX01BU0s2NEhJKDExKSB8CisJCQkgICgoeGZzX2JtYnRfcmVjX2Jhc2VfdCliIDw8IDIxKSB8CisJCQkgICgoeGZzX2JtYnRfcmVjX2Jhc2VfdCljICYKKwkJCSAgICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTygyMSkpKTsKKwl9IGVsc2UgeworCQlJTlRfU0VUKHItPmwwLCBBUkNIX0NPTlZFUlQsICgoeGZzX2JtYnRfcmVjX2Jhc2VfdClleHRlbnRfZmxhZyA8PCA2MykgfAorCQkJKCh4ZnNfYm1idF9yZWNfYmFzZV90KW8gPDwgOSkpOworCQlJTlRfU0VUKHItPmwxLCBBUkNIX0NPTlZFUlQsICgoeGZzX2JtYnRfcmVjX2Jhc2VfdCliIDw8IDIxKSB8CisJCQkgICgoeGZzX2JtYnRfcmVjX2Jhc2VfdCljICYKKwkJCSAgICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTygyMSkpKTsKKwl9CisjZW5kaWYJLyogWEZTX0JJR19CTEtOT1MgKi8KK30KKyNlbmRpZgorCisvKgorICogU2V0IHRoZSBibG9ja2NvdW50IGZpZWxkIGluIGEgYm1hcCBleHRlbnQgcmVjb3JkLgorICovCit2b2lkCit4ZnNfYm1idF9zZXRfYmxvY2tjb3VudCgKKwl4ZnNfYm1idF9yZWNfdAkqciwKKwl4ZnNfZmlsYmxrc190CXYpCit7CisJQVNTRVJUKCh2ICYgWEZTX01BU0s2NEhJKDQzKSkgPT0gMCk7CisJci0+bDEgPSAoci0+bDEgJiAoeGZzX2JtYnRfcmVjX2Jhc2VfdClYRlNfTUFTSzY0SEkoNDMpKSB8CisJCSAgKHhmc19ibWJ0X3JlY19iYXNlX3QpKHYgJiBYRlNfTUFTSzY0TE8oMjEpKTsKK30KKworLyoKKyAqIFNldCB0aGUgc3RhcnRibG9jayBmaWVsZCBpbiBhIGJtYXAgZXh0ZW50IHJlY29yZC4KKyAqLwordm9pZAoreGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soCisJeGZzX2JtYnRfcmVjX3QJKnIsCisJeGZzX2ZzYmxvY2tfdAl2KQoreworI2lmIFhGU19CSUdfQkxLTk9TCisJQVNTRVJUKCh2ICYgWEZTX01BU0s2NEhJKDEyKSkgPT0gMCk7CisJci0+bDAgPSAoci0+bDAgJiAoeGZzX2JtYnRfcmVjX2Jhc2VfdClYRlNfTUFTSzY0SEkoNTUpKSB8CisJCSAgKHhmc19ibWJ0X3JlY19iYXNlX3QpKHYgPj4gNDMpOworCXItPmwxID0gKHItPmwxICYgKHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDIxKSkgfAorCQkgICh4ZnNfYm1idF9yZWNfYmFzZV90KSh2IDw8IDIxKTsKKyNlbHNlCS8qICFYRlNfQklHX0JMS05PUyAqLworCWlmIChJU05VTExTVEFSVEJMT0NLKHYpKSB7CisJCXItPmwwIHw9ICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTyg5KTsKKwkJci0+bDEgPSAoeGZzX2JtYnRfcmVjX2Jhc2VfdClYRlNfTUFTSzY0SEkoMTEpIHwKKwkJCSAgKCh4ZnNfYm1idF9yZWNfYmFzZV90KXYgPDwgMjEpIHwKKwkJCSAgKHItPmwxICYgKHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDIxKSk7CisJfSBlbHNlIHsKKwkJci0+bDAgJj0gfih4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTyg5KTsKKwkJci0+bDEgPSAoKHhmc19ibWJ0X3JlY19iYXNlX3QpdiA8PCAyMSkgfAorCQkJICAoci0+bDEgJiAoeGZzX2JtYnRfcmVjX2Jhc2VfdClYRlNfTUFTSzY0TE8oMjEpKTsKKwl9CisjZW5kaWYJLyogWEZTX0JJR19CTEtOT1MgKi8KK30KKworLyoKKyAqIFNldCB0aGUgc3RhcnRvZmYgZmllbGQgaW4gYSBibWFwIGV4dGVudCByZWNvcmQuCisgKi8KK3ZvaWQKK3hmc19ibWJ0X3NldF9zdGFydG9mZigKKwl4ZnNfYm1idF9yZWNfdAkqciwKKwl4ZnNfZmlsZW9mZl90CXYpCit7CisJQVNTRVJUKCh2ICYgWEZTX01BU0s2NEhJKDkpKSA9PSAwKTsKKwlyLT5sMCA9IChyLT5sMCAmICh4ZnNfYm1idF9yZWNfYmFzZV90KSBYRlNfTUFTSzY0SEkoMSkpIHwKKwkJKCh4ZnNfYm1idF9yZWNfYmFzZV90KXYgPDwgOSkgfAorCQkgIChyLT5sMCAmICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTyg5KSk7Cit9CisKKy8qCisgKiBTZXQgdGhlIGV4dGVudCBzdGF0ZSBmaWVsZCBpbiBhIGJtYXAgZXh0ZW50IHJlY29yZC4KKyAqLwordm9pZAoreGZzX2JtYnRfc2V0X3N0YXRlKAorCXhmc19ibWJ0X3JlY190CSpyLAorCXhmc19leG50c3RfdAl2KQoreworCUFTU0VSVCh2ID09IFhGU19FWFRfTk9STSB8fCB2ID09IFhGU19FWFRfVU5XUklUVEVOKTsKKwlpZiAodiA9PSBYRlNfRVhUX05PUk0pCisJCXItPmwwICY9IFhGU19NQVNLNjRMTyg2NCAtIEJNQlRfRVhOVEZMQUdfQklUTEVOKTsKKwllbHNlCisJCXItPmwwIHw9IFhGU19NQVNLNjRISShCTUJUX0VYTlRGTEFHX0JJVExFTik7Cit9CisKKy8qCisgKiBDb252ZXJ0IGluLW1lbW9yeSBmb3JtIG9mIGJ0cmVlIHJvb3QgdG8gb24tZGlzayBmb3JtLgorICovCit2b2lkCit4ZnNfYm1idF90b19ibWRyKAorCXhmc19ibWJ0X2Jsb2NrX3QJKnJibG9jaywKKwlpbnQJCQlyYmxvY2tsZW4sCisJeGZzX2JtZHJfYmxvY2tfdAkqZGJsb2NrLAorCWludAkJCWRibG9ja2xlbikKK3sKKwlpbnQJCQlkbXhyOworCXhmc19ibWJ0X2tleV90CQkqZmtwOworCXhmc19ibWJ0X3B0cl90CQkqZnBwOworCXhmc19ibWJ0X2tleV90CQkqdGtwOworCXhmc19ibWJ0X3B0cl90CQkqdHBwOworCisJQVNTRVJUKElOVF9HRVQocmJsb2NrLT5iYl9tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfQk1BUF9NQUdJQyk7CisJQVNTRVJUKElOVF9HRVQocmJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExERlNCTk8pOworCUFTU0VSVChJTlRfR0VUKHJibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTERGU0JOTyk7CisJQVNTRVJUKElOVF9HRVQocmJsb2NrLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSA+IDApOworCWRibG9jay0+YmJfbGV2ZWwgPSByYmxvY2stPmJiX2xldmVsOwkvKiBib3RoIGluIG9uLWRpc2sgZm9ybWF0ICovCisJZGJsb2NrLT5iYl9udW1yZWNzID0gcmJsb2NrLT5iYl9udW1yZWNzOy8qIGJvdGggaW4gb24tZGlzayBmb3JtYXQgKi8KKwlkbXhyID0gKGludClYRlNfQlRSRUVfQkxPQ0tfTUFYUkVDUyhkYmxvY2tsZW4sIHhmc19ibWRyLCAwKTsKKwlma3AgPSBYRlNfQk1BUF9CUk9PVF9LRVlfQUREUihyYmxvY2ssIDEsIHJibG9ja2xlbik7CisJdGtwID0gWEZTX0JUUkVFX0tFWV9BRERSKGRibG9ja2xlbiwgeGZzX2JtZHIsIGRibG9jaywgMSwgZG14cik7CisJZnBwID0gWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIocmJsb2NrLCAxLCByYmxvY2tsZW4pOworCXRwcCA9IFhGU19CVFJFRV9QVFJfQUREUihkYmxvY2tsZW4sIHhmc19ibWRyLCBkYmxvY2ssIDEsIGRteHIpOworCWRteHIgPSBJTlRfR0VUKGRibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwltZW1jcHkodGtwLCBma3AsIHNpemVvZigqZmtwKSAqIGRteHIpOworCW1lbWNweSh0cHAsIGZwcCwgc2l6ZW9mKCpmcHApICogZG14cik7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCit9CisKKy8qCisgKiBVcGRhdGUgdGhlIHJlY29yZCB0byB0aGUgcGFzc2VkIHZhbHVlcy4KKyAqLworaW50Cit4ZnNfYm1idF91cGRhdGUoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAorCXhmc19maWxlb2ZmX3QJCW9mZiwKKwl4ZnNfZnNibG9ja190CQlibm8sCisJeGZzX2ZpbGJsa3NfdAkJbGVuLAorCXhmc19leG50c3RfdAkJc3RhdGUpCit7CisJeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7CisJeGZzX2J1Zl90CQkqYnA7CisJaW50CQkJZXJyb3I7CisjaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKwlzdGF0aWMgY2hhcgkJZm5hbWVbXSA9ICJ4ZnNfYm1idF91cGRhdGUiOworI2VuZGlmCisJeGZzX2JtYnRfa2V5X3QJCWtleTsKKwlpbnQJCQlwdHI7CisJeGZzX2JtYnRfcmVjX3QJCSpycDsKKworCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVOVFJZKTsKKwlYRlNfQk1CVF9UUkFDRV9BUkdGRkZJKGN1ciwgKHhmc19kZmlsb2ZmX3Qpb2ZmLCAoeGZzX2Rmc2Jub190KWJubywKKwkJKHhmc19kZmlsYmxrc190KWxlbiwgKGludClzdGF0ZSk7CisJYmxvY2sgPSB4ZnNfYm1idF9nZXRfYmxvY2soY3VyLCAwLCAmYnApOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCBibG9jaywgMCwgYnApKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCXJldHVybiBlcnJvcjsKKwl9CisjZW5kaWYKKwlwdHIgPSBjdXItPmJjX3B0cnNbMF07CisJcnAgPSBYRlNfQk1BUF9SRUNfSUFERFIoYmxvY2ssIHB0ciwgY3VyKTsKKwl4ZnNfYm1idF9kaXNrX3NldF9hbGxmKHJwLCBvZmYsIGJubywgbGVuLCBzdGF0ZSk7CisJeGZzX2JtYnRfbG9nX3JlY3MoY3VyLCBicCwgcHRyLCBwdHIpOworCWlmIChwdHIgPiAxKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQlyZXR1cm4gMDsKKwl9CisJSU5UX1NFVChrZXkuYnJfc3RhcnRvZmYsIEFSQ0hfQ09OVkVSVCwgb2ZmKTsKKwlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBka2V5KGN1ciwgJmtleSwgMSkpKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoZWNrIGFuIGV4dGVudCBsaXN0LCB3aGljaCBoYXMganVzdCBiZWVuIHJlYWQsIGZvcgorICogYW55IGJpdCBpbiB0aGUgZXh0ZW50IGZsYWcgZmllbGQuIEFTU0VSVCBvbiBkZWJ1ZworICoga2VybmVscywgYXMgdGhpcyBjb25kaXRpb24gc2hvdWxkIG5vdCBvY2N1ci4KKyAqIFJldHVybiBhbiBlcnJvciBjb25kaXRpb24gKDEpIGlmIGFueSBmbGFncyBmb3VuZCwKKyAqIG90aGVyd2lzZSByZXR1cm4gMC4KKyAqLworCitpbnQKK3hmc19jaGVja19ub3N0YXRlX2V4dGVudHMoCisJeGZzX2JtYnRfcmVjX3QJCSplcCwKKwl4ZnNfZXh0bnVtX3QJCW51bSkKK3sKKwlmb3IgKDsgbnVtID4gMDsgbnVtLS0sIGVwKyspIHsKKwkJaWYgKChlcC0+bDAgPj4KKwkJICAgICAoNjQgLSBCTUJUX0VYTlRGTEFHX0JJVExFTikpICE9IDApIHsKKwkJCUFTU0VSVCgwKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ibWFwX2J0cmVlLmggYi9mcy94ZnMveGZzX2JtYXBfYnRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDNmZjEyCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19ibWFwX2J0cmVlLmgKQEAgLTAsMCArMSw3MDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMi0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfQk1BUF9CVFJFRV9IX18KKyNkZWZpbmUgX19YRlNfQk1BUF9CVFJFRV9IX18KKworI2RlZmluZSBYRlNfQk1BUF9NQUdJQwkweDQyNGQ0MTUwCS8qICdCTUFQJyAqLworCitzdHJ1Y3QgeGZzX2J0cmVlX2N1cjsKK3N0cnVjdCB4ZnNfYnRyZWVfbGJsb2NrOworc3RydWN0IHhmc19tb3VudDsKK3N0cnVjdCB4ZnNfaW5vZGU7CisKKy8qCisgKiBCbWFwIHJvb3QgaGVhZGVyLCBvbi1kaXNrIGZvcm0gb25seS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2JtZHJfYmxvY2sKK3sKKwlfX3VpbnQxNl90CWJiX2xldmVsOwkvKiAwIGlzIGEgbGVhZiAqLworCV9fdWludDE2X3QJYmJfbnVtcmVjczsJLyogY3VycmVudCAjIG9mIGRhdGEgcmVjb3JkcyAqLworfSB4ZnNfYm1kcl9ibG9ja190OworCisvKgorICogQm1hcCBidHJlZSByZWNvcmQgYW5kIGV4dGVudCBkZXNjcmlwdG9yLgorICogRm9yIDMyLWJpdCBrZXJuZWxzLAorICogIGwwOjMxIGlzIGFuIGV4dGVudCBmbGFnICh2YWx1ZSAxIGluZGljYXRlcyBub24tbm9ybWFsKS4KKyAqICBsMDowLTMwIGFuZCBsMTo5LTMxIGFyZSBzdGFydG9mZi4KKyAqICBsMTowLTgsIGwyOjAtMzEsIGFuZCBsMzoyMS0zMSBhcmUgc3RhcnRibG9jay4KKyAqICBsMzowLTIwIGFyZSBibG9ja2NvdW50LgorICogRm9yIDY0LWJpdCBrZXJuZWxzLAorICogIGwwOjYzIGlzIGFuIGV4dGVudCBmbGFnICh2YWx1ZSAxIGluZGljYXRlcyBub24tbm9ybWFsKS4KKyAqICBsMDo5LTYyIGFyZSBzdGFydG9mZi4KKyAqICBsMDowLTggYW5kIGwxOjIxLTYzIGFyZSBzdGFydGJsb2NrLgorICogIGwxOjAtMjAgYXJlIGJsb2NrY291bnQuCisgKi8KKworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKworI2RlZmluZSBCTUJUX1RPVEFMX0JJVExFTgkxMjgJLyogMTI4IGJpdHMsIDE2IGJ5dGVzICovCisjZGVmaW5lIEJNQlRfRVhOVEZMQUdfQklUT0ZGCTAKKyNkZWZpbmUgQk1CVF9FWE5URkxBR19CSVRMRU4JMQorI2RlZmluZSBCTUJUX1NUQVJUT0ZGX0JJVE9GRgkoQk1CVF9FWE5URkxBR19CSVRPRkYgKyBCTUJUX0VYTlRGTEFHX0JJVExFTikKKyNkZWZpbmUgQk1CVF9TVEFSVE9GRl9CSVRMRU4JNTQKKyNkZWZpbmUgQk1CVF9TVEFSVEJMT0NLX0JJVE9GRgkoQk1CVF9TVEFSVE9GRl9CSVRPRkYgKyBCTUJUX1NUQVJUT0ZGX0JJVExFTikKKyNkZWZpbmUgQk1CVF9TVEFSVEJMT0NLX0JJVExFTgk1MgorI2RlZmluZSBCTUJUX0JMT0NLQ09VTlRfQklUT0ZGCVwKKwkoQk1CVF9TVEFSVEJMT0NLX0JJVE9GRiArIEJNQlRfU1RBUlRCTE9DS19CSVRMRU4pCisjZGVmaW5lIEJNQlRfQkxPQ0tDT1VOVF9CSVRMRU4JKEJNQlRfVE9UQUxfQklUTEVOIC0gQk1CVF9CTE9DS0NPVU5UX0JJVE9GRikKKworI2Vsc2UKKworI2RlZmluZSBCTUJUX1RPVEFMX0JJVExFTgkxMjgJLyogMTI4IGJpdHMsIDE2IGJ5dGVzICovCisjZGVmaW5lIEJNQlRfRVhOVEZMQUdfQklUT0ZGCTYzCisjZGVmaW5lIEJNQlRfRVhOVEZMQUdfQklUTEVOCTEKKyNkZWZpbmUgQk1CVF9TVEFSVE9GRl9CSVRPRkYJKEJNQlRfRVhOVEZMQUdfQklUT0ZGIC0gQk1CVF9TVEFSVE9GRl9CSVRMRU4pCisjZGVmaW5lIEJNQlRfU1RBUlRPRkZfQklUTEVOCTU0CisjZGVmaW5lIEJNQlRfU1RBUlRCTE9DS19CSVRPRkYJODUgLyogMTI4IC0gNDMgKG90aGVyIDkgaXMgaW4gZmlyc3Qgd29yZCkgKi8KKyNkZWZpbmUgQk1CVF9TVEFSVEJMT0NLX0JJVExFTgk1MgorI2RlZmluZSBCTUJUX0JMT0NLQ09VTlRfQklUT0ZGCTY0IC8qIFN0YXJ0IG9mIHNlY29uZCA2NCBiaXQgY29udGFpbmVyICovCisjZGVmaW5lIEJNQlRfQkxPQ0tDT1VOVF9CSVRMRU4JMjEKKworI2VuZGlmCisKKworI2RlZmluZSBCTUJUX1VTRV82NAkxCisKK3R5cGVkZWYgc3RydWN0IHhmc19ibWJ0X3JlY18zMgoreworCV9fdWludDMyX3QJCWwwLCBsMSwgbDIsIGwzOworfSB4ZnNfYm1idF9yZWNfMzJfdDsKK3R5cGVkZWYgc3RydWN0IHhmc19ibWJ0X3JlY182NAoreworCV9fdWludDY0X3QJCWwwLCBsMTsKK30geGZzX2JtYnRfcmVjXzY0X3Q7CisKK3R5cGVkZWYgX191aW50NjRfdAl4ZnNfYm1idF9yZWNfYmFzZV90OwkvKiB1c2UgdGhpcyBmb3IgY2FzdHMgKi8KK3R5cGVkZWYgeGZzX2JtYnRfcmVjXzY0X3QgeGZzX2JtYnRfcmVjX3QsIHhmc19ibWRyX3JlY190OworCisvKgorICogVmFsdWVzIGFuZCBtYWNyb3MgZm9yIGRlbGF5ZWQtYWxsb2NhdGlvbiBzdGFydGJsb2NrIGZpZWxkcy4KKyAqLworI2RlZmluZSBTVEFSVEJMT0NLVkFMQklUUwkxNworI2RlZmluZSBTVEFSVEJMT0NLTUFTS0JJVFMJKDE1ICsgWEZTX0JJR19CTEtOT1MgKiAyMCkKKyNkZWZpbmUgRFNUQVJUQkxPQ0tNQVNLQklUUwkoMTUgKyAyMCkKKyNkZWZpbmUgU1RBUlRCTE9DS01BU0sJCVwKKwkoKCgoKHhmc19mc2Jsb2NrX3QpMSkgPDwgU1RBUlRCTE9DS01BU0tCSVRTKSAtIDEpIDw8IFNUQVJUQkxPQ0tWQUxCSVRTKQorI2RlZmluZSBEU1RBUlRCTE9DS01BU0sJCVwKKwkoKCgoKHhmc19kZnNibm9fdCkxKSA8PCBEU1RBUlRCTE9DS01BU0tCSVRTKSAtIDEpIDw8IFNUQVJUQkxPQ0tWQUxCSVRTKQorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19JU05VTExTVEFSVEJMT0NLKQoraW50IGlzbnVsbHN0YXJ0YmxvY2soeGZzX2ZzYmxvY2tfdCB4KTsKKyNkZWZpbmUgSVNOVUxMU1RBUlRCTE9DSyh4KQlpc251bGxzdGFydGJsb2NrKHgpCisjZWxzZQorI2RlZmluZSBJU05VTExTVEFSVEJMT0NLKHgpCSgoKHgpICYgU1RBUlRCTE9DS01BU0spID09IFNUQVJUQkxPQ0tNQVNLKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX0lTTlVMTERTVEFSVEJMT0NLKQoraW50IGlzbnVsbGRzdGFydGJsb2NrKHhmc19kZnNibm9fdCB4KTsKKyNkZWZpbmUgSVNOVUxMRFNUQVJUQkxPQ0soeCkJaXNudWxsZHN0YXJ0YmxvY2soeCkKKyNlbHNlCisjZGVmaW5lIElTTlVMTERTVEFSVEJMT0NLKHgpCSgoKHgpICYgRFNUQVJUQkxPQ0tNQVNLKSA9PSBEU1RBUlRCTE9DS01BU0spCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fTlVMTFNUQVJUQkxPQ0spCit4ZnNfZnNibG9ja190IG51bGxzdGFydGJsb2NrKGludCBrKTsKKyNkZWZpbmUgTlVMTFNUQVJUQkxPQ0soaykJbnVsbHN0YXJ0YmxvY2soaykKKyNlbHNlCisjZGVmaW5lIE5VTExTVEFSVEJMT0NLKGspCVwKKwkoKEFTU0VSVChrIDwgKDEgPDwgU1RBUlRCTE9DS1ZBTEJJVFMpKSksIChTVEFSVEJMT0NLTUFTSyB8IChrKSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fU1RBUlRCTE9DS1ZBTCkKK3hmc19maWxibGtzX3Qgc3RhcnRibG9ja3ZhbCh4ZnNfZnNibG9ja190IHgpOworI2RlZmluZSBTVEFSVEJMT0NLVkFMKHgpCXN0YXJ0YmxvY2t2YWwoeCkKKyNlbHNlCisjZGVmaW5lIFNUQVJUQkxPQ0tWQUwoeCkJKCh4ZnNfZmlsYmxrc190KSgoeCkgJiB+U1RBUlRCTE9DS01BU0spKQorI2VuZGlmCisKKy8qCisgKiBQb3NzaWJsZSBleHRlbnQgZm9ybWF0cy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlYRlNfRVhURk1UX05PU1RBVEUgPSAwLAorCVhGU19FWFRGTVRfSEFTU1RBVEUKK30geGZzX2V4bnRmbXRfdDsKKworLyoKKyAqIFBvc3NpYmxlIGV4dGVudCBzdGF0ZXMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJWEZTX0VYVF9OT1JNLCBYRlNfRVhUX1VOV1JJVFRFTiwKKwlYRlNfRVhUX0RNQVBJX09GRkxJTkUsIFhGU19FWFRfSU5WQUxJRAorfSB4ZnNfZXhudHN0X3Q7CisKKy8qCisgKiBFeHRlbnQgc3RhdGUgYW5kIGV4dGVudCBmb3JtYXQgbWFjcm9zLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19FWFRGTVRfSU5PREUgKQoreGZzX2V4bnRmbXRfdCB4ZnNfZXh0Zm10X2lub2RlKHN0cnVjdCB4ZnNfaW5vZGUgKmlwKTsKKyNkZWZpbmUgWEZTX0VYVEZNVF9JTk9ERSh4KQl4ZnNfZXh0Zm10X2lub2RlKHgpCisjZWxzZQorI2RlZmluZSBYRlNfRVhURk1UX0lOT0RFKHgpIFwKKyAgKFhGU19TQl9WRVJTSU9OX0hBU0VYVEZMR0JJVCgmKCh4KS0+aV9tb3VudC0+bV9zYikpID8gXAorCVhGU19FWFRGTVRfSEFTU1RBVEUgOiBYRlNfRVhURk1UX05PU1RBVEUpCisjZW5kaWYKKyNkZWZpbmUgSVNVTldSSVRURU4oeCkJKCh4KS0+YnJfc3RhdGUgPT0gWEZTX0VYVF9VTldSSVRURU4pCisKKy8qCisgKiBJbmNvcmUgdmVyc2lvbiBvZiBhYm92ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2JtYnRfaXJlYworeworCXhmc19maWxlb2ZmX3QJYnJfc3RhcnRvZmY7CS8qIHN0YXJ0aW5nIGZpbGUgb2Zmc2V0ICovCisJeGZzX2ZzYmxvY2tfdAlicl9zdGFydGJsb2NrOwkvKiBzdGFydGluZyBibG9jayBudW1iZXIgKi8KKwl4ZnNfZmlsYmxrc190CWJyX2Jsb2NrY291bnQ7CS8qIG51bWJlciBvZiBibG9ja3MgKi8KKwl4ZnNfZXhudHN0X3QJYnJfc3RhdGU7CS8qIGV4dGVudCBzdGF0ZSAqLworfSB4ZnNfYm1idF9pcmVjX3Q7CisKKy8qCisgKiBLZXkgc3RydWN0dXJlIGZvciBub24tbGVhZiBsZXZlbHMgb2YgdGhlIHRyZWUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19ibWJ0X2tleQoreworCXhmc19kZmlsb2ZmX3QJYnJfc3RhcnRvZmY7CS8qIHN0YXJ0aW5nIGZpbGUgb2Zmc2V0ICovCit9IHhmc19ibWJ0X2tleV90LCB4ZnNfYm1kcl9rZXlfdDsKKwordHlwZWRlZiB4ZnNfZGZzYm5vX3QgeGZzX2JtYnRfcHRyX3QsIHhmc19ibWRyX3B0cl90OwkvKiBidHJlZSBwb2ludGVyIHR5cGUgKi8KKwkJCQkJLyogYnRyZWUgYmxvY2sgaGVhZGVyIHR5cGUgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19idHJlZV9sYmxvY2sgeGZzX2JtYnRfYmxvY2tfdDsKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQlVGX1RPX0JNQlRfQkxPQ0spCit4ZnNfYm1idF9ibG9ja190ICp4ZnNfYnVmX3RvX2JtYnRfYmxvY2soc3RydWN0IHhmc19idWYgKmJwKTsKKyNkZWZpbmUgWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKQkJeGZzX2J1Zl90b19ibWJ0X2Jsb2NrKGJwKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKSAoKHhmc19ibWJ0X2Jsb2NrX3QgKikoWEZTX0JVRl9QVFIoYnApKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX1JCTE9DS19EU0laRSkKK2ludCB4ZnNfYm1hcF9yYmxvY2tfZHNpemUoaW50IGxldiwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7CisjZGVmaW5lIFhGU19CTUFQX1JCTE9DS19EU0laRShsZXYsY3VyKQkJeGZzX2JtYXBfcmJsb2NrX2RzaXplKGxldixjdXIpCisjZWxzZQorI2RlZmluZSBYRlNfQk1BUF9SQkxPQ0tfRFNJWkUobGV2LGN1cikgKChjdXIpLT5iY19wcml2YXRlLmIuZm9ya3NpemUpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfUkJMT0NLX0lTSVpFKQoraW50IHhmc19ibWFwX3JibG9ja19pc2l6ZShpbnQgbGV2LCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUgWEZTX0JNQVBfUkJMT0NLX0lTSVpFKGxldixjdXIpCQl4ZnNfYm1hcF9yYmxvY2tfaXNpemUobGV2LGN1cikKKyNlbHNlCisjZGVmaW5lIFhGU19CTUFQX1JCTE9DS19JU0laRShsZXYsY3VyKSBcCisJKChpbnQpWEZTX0lGT1JLX1BUUigoY3VyKS0+YmNfcHJpdmF0ZS5iLmlwLCBcCisJCQkgICAgKGN1ciktPmJjX3ByaXZhdGUuYi53aGljaGZvcmspLT5pZl9icm9vdF9ieXRlcykKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9JQkxPQ0tfU0laRSkKK2ludCB4ZnNfYm1hcF9pYmxvY2tfc2l6ZShpbnQgbGV2LCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUgWEZTX0JNQVBfSUJMT0NLX1NJWkUobGV2LGN1cikJCXhmc19ibWFwX2libG9ja19zaXplKGxldixjdXIpCisjZWxzZQorI2RlZmluZSBYRlNfQk1BUF9JQkxPQ0tfU0laRShsZXYsY3VyKSAoMSA8PCAoY3VyKS0+YmNfYmxvY2tsb2cpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9CTE9DS19EU0laRSkKK2ludCB4ZnNfYm1hcF9ibG9ja19kc2l6ZShpbnQgbGV2LCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUgWEZTX0JNQVBfQkxPQ0tfRFNJWkUobGV2LGN1cikJCXhmc19ibWFwX2Jsb2NrX2RzaXplKGxldixjdXIpCisjZWxzZQorI2RlZmluZSBYRlNfQk1BUF9CTE9DS19EU0laRShsZXYsY3VyKSBcCisJKChsZXYpID09IChjdXIpLT5iY19ubGV2ZWxzIC0gMSA/IFwKKwkJWEZTX0JNQVBfUkJMT0NLX0RTSVpFKGxldixjdXIpIDogXAorCQlYRlNfQk1BUF9JQkxPQ0tfU0laRShsZXYsY3VyKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9CTE9DS19JU0laRSkKK2ludCB4ZnNfYm1hcF9ibG9ja19pc2l6ZShpbnQgbGV2LCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUgWEZTX0JNQVBfQkxPQ0tfSVNJWkUobGV2LGN1cikJCXhmc19ibWFwX2Jsb2NrX2lzaXplKGxldixjdXIpCisjZWxzZQorI2RlZmluZSBYRlNfQk1BUF9CTE9DS19JU0laRShsZXYsY3VyKSBcCisJKChsZXYpID09IChjdXIpLT5iY19ubGV2ZWxzIC0gMSA/IFwKKwkJWEZTX0JNQVBfUkJMT0NLX0lTSVpFKGxldixjdXIpIDogXAorCQlYRlNfQk1BUF9JQkxPQ0tfU0laRShsZXYsY3VyKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX0JMT0NLX0RNQVhSRUNTKQoraW50IHhmc19ibWFwX2Jsb2NrX2RtYXhyZWNzKGludCBsZXYsIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZSBYRlNfQk1BUF9CTE9DS19ETUFYUkVDUyhsZXYsY3VyKQl4ZnNfYm1hcF9ibG9ja19kbWF4cmVjcyhsZXYsY3VyKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0JNQVBfQkxPQ0tfRE1BWFJFQ1MobGV2LGN1cikgXAorCSgobGV2KSA9PSAoY3VyKS0+YmNfbmxldmVscyAtIDEgPyBcCisJCVhGU19CVFJFRV9CTE9DS19NQVhSRUNTKFhGU19CTUFQX1JCTE9DS19EU0laRShsZXYsY3VyKSwgXAorCQkJeGZzX2JtZHIsIChsZXYpID09IDApIDogXAorCQkoKGN1ciktPmJjX21wLT5tX2JtYXBfZG14clsobGV2KSAhPSAwXSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MpCitpbnQgeGZzX2JtYXBfYmxvY2tfaW1heHJlY3MoaW50IGxldiwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7CisjZGVmaW5lIFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKGxldixjdXIpCXhmc19ibWFwX2Jsb2NrX2ltYXhyZWNzKGxldixjdXIpCisjZWxzZQorI2RlZmluZSBYRlNfQk1BUF9CTE9DS19JTUFYUkVDUyhsZXYsY3VyKSBcCisJKChsZXYpID09IChjdXIpLT5iY19ubGV2ZWxzIC0gMSA/IFwKKwkJWEZTX0JUUkVFX0JMT0NLX01BWFJFQ1MoWEZTX0JNQVBfUkJMT0NLX0lTSVpFKGxldixjdXIpLCBcCisJCQl4ZnNfYm1idCwgKGxldikgPT0gMCkgOiBcCisJCSgoY3VyKS0+YmNfbXAtPm1fYm1hcF9kbXhyWyhsZXYpICE9IDBdKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX0JMT0NLX0RNSU5SRUNTKQoraW50IHhmc19ibWFwX2Jsb2NrX2RtaW5yZWNzKGludCBsZXYsIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZSBYRlNfQk1BUF9CTE9DS19ETUlOUkVDUyhsZXYsY3VyKQl4ZnNfYm1hcF9ibG9ja19kbWlucmVjcyhsZXYsY3VyKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0JNQVBfQkxPQ0tfRE1JTlJFQ1MobGV2LGN1cikgXAorCSgobGV2KSA9PSAoY3VyKS0+YmNfbmxldmVscyAtIDEgPyBcCisJCVhGU19CVFJFRV9CTE9DS19NSU5SRUNTKFhGU19CTUFQX1JCTE9DS19EU0laRShsZXYsY3VyKSwgXAorCQkJeGZzX2JtZHIsIChsZXYpID09IDApIDogXAorCQkoKGN1ciktPmJjX21wLT5tX2JtYXBfZG1uclsobGV2KSAhPSAwXSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfQkxPQ0tfSU1JTlJFQ1MpCitpbnQgeGZzX2JtYXBfYmxvY2tfaW1pbnJlY3MoaW50IGxldiwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7CisjZGVmaW5lIFhGU19CTUFQX0JMT0NLX0lNSU5SRUNTKGxldixjdXIpCXhmc19ibWFwX2Jsb2NrX2ltaW5yZWNzKGxldixjdXIpCisjZWxzZQorI2RlZmluZSBYRlNfQk1BUF9CTE9DS19JTUlOUkVDUyhsZXYsY3VyKSBcCisJKChsZXYpID09IChjdXIpLT5iY19ubGV2ZWxzIC0gMSA/IFwKKwkJWEZTX0JUUkVFX0JMT0NLX01JTlJFQ1MoWEZTX0JNQVBfUkJMT0NLX0lTSVpFKGxldixjdXIpLCBcCisJCQl4ZnNfYm1idCwgKGxldikgPT0gMCkgOiBcCisJCSgoY3VyKS0+YmNfbXAtPm1fYm1hcF9kbW5yWyhsZXYpICE9IDBdKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX1JFQ19EQUREUikKK3hmc19ibWJ0X3JlY190ICoKK3hmc19ibWFwX3JlY19kYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZSBYRlNfQk1BUF9SRUNfREFERFIoYmIsaSxjdXIpCQl4ZnNfYm1hcF9yZWNfZGFkZHIoYmIsaSxjdXIpCisjZWxzZQorI2RlZmluZSBYRlNfQk1BUF9SRUNfREFERFIoYmIsaSxjdXIpIFwKKwlYRlNfQlRSRUVfUkVDX0FERFIoWEZTX0JNQVBfQkxPQ0tfRFNJWkUoCQlcCisJCUlOVF9HRVQoKGJiKS0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCksIGN1ciksCVwKKwkJeGZzX2JtYnQsIGJiLCBpLCBYRlNfQk1BUF9CTE9DS19ETUFYUkVDUygJXAorCQkJSU5UX0dFVCgoYmIpLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSwgY3VyKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9SRUNfSUFERFIpCit4ZnNfYm1idF9yZWNfdCAqCit4ZnNfYm1hcF9yZWNfaWFkZHIoeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBpLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUgWEZTX0JNQVBfUkVDX0lBRERSKGJiLGksY3VyKQkJeGZzX2JtYXBfcmVjX2lhZGRyKGJiLGksY3VyKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0JNQVBfUkVDX0lBRERSKGJiLGksY3VyKSBcCisJWEZTX0JUUkVFX1JFQ19BRERSKFhGU19CTUFQX0JMT0NLX0lTSVpFKAkJXAorCQlJTlRfR0VUKChiYiktPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpLCBjdXIpLAlcCisJCXhmc19ibWJ0LCBiYiwgaSwgWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MoCVwKKwkJCUlOVF9HRVQoKGJiKS0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCksIGN1cikpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9LRVlfREFERFIpCit4ZnNfYm1idF9rZXlfdCAqCit4ZnNfYm1hcF9rZXlfZGFkZHIoeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBpLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUgWEZTX0JNQVBfS0VZX0RBRERSKGJiLGksY3VyKQkJeGZzX2JtYXBfa2V5X2RhZGRyKGJiLGksY3VyKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0JNQVBfS0VZX0RBRERSKGJiLGksY3VyKSBcCisJWEZTX0JUUkVFX0tFWV9BRERSKFhGU19CTUFQX0JMT0NLX0RTSVpFKAkJXAorCQlJTlRfR0VUKChiYiktPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpLCBjdXIpLAlcCisJCXhmc19ibWJ0LCBiYiwgaSwgWEZTX0JNQVBfQkxPQ0tfRE1BWFJFQ1MoCVwKKwkJCUlOVF9HRVQoKGJiKS0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCksIGN1cikpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfS0VZX0lBRERSKQoreGZzX2JtYnRfa2V5X3QgKgoreGZzX2JtYXBfa2V5X2lhZGRyKHhmc19ibWJ0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7CisjZGVmaW5lIFhGU19CTUFQX0tFWV9JQUREUihiYixpLGN1cikJCXhmc19ibWFwX2tleV9pYWRkcihiYixpLGN1cikKKyNlbHNlCisjZGVmaW5lIFhGU19CTUFQX0tFWV9JQUREUihiYixpLGN1cikgXAorCVhGU19CVFJFRV9LRVlfQUREUihYRlNfQk1BUF9CTE9DS19JU0laRSgJCVwKKwkJSU5UX0dFVCgoYmIpLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSwgY3VyKSwJXAorCQl4ZnNfYm1idCwgYmIsIGksIFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKAlcCisJCQlJTlRfR0VUKChiYiktPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpLCBjdXIpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfUFRSX0RBRERSKQoreGZzX2JtYnRfcHRyX3QgKgoreGZzX2JtYXBfcHRyX2RhZGRyKHhmc19ibWJ0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7CisjZGVmaW5lIFhGU19CTUFQX1BUUl9EQUREUihiYixpLGN1cikJCXhmc19ibWFwX3B0cl9kYWRkcihiYixpLGN1cikKKyNlbHNlCisjZGVmaW5lIFhGU19CTUFQX1BUUl9EQUREUihiYixpLGN1cikgXAorCVhGU19CVFJFRV9QVFJfQUREUihYRlNfQk1BUF9CTE9DS19EU0laRSgJCVwKKwkJSU5UX0dFVCgoYmIpLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSwgY3VyKSwJXAorCQl4ZnNfYm1idCwgYmIsIGksIFhGU19CTUFQX0JMT0NLX0RNQVhSRUNTKAlcCisJCQlJTlRfR0VUKChiYiktPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpLCBjdXIpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX1BUUl9JQUREUikKK3hmc19ibWJ0X3B0cl90ICoKK3hmc19ibWFwX3B0cl9pYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZSBYRlNfQk1BUF9QVFJfSUFERFIoYmIsaSxjdXIpCQl4ZnNfYm1hcF9wdHJfaWFkZHIoYmIsaSxjdXIpCisjZWxzZQorI2RlZmluZSBYRlNfQk1BUF9QVFJfSUFERFIoYmIsaSxjdXIpIFwKKwlYRlNfQlRSRUVfUFRSX0FERFIoWEZTX0JNQVBfQkxPQ0tfSVNJWkUoCQlcCisJCUlOVF9HRVQoKGJiKS0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCksIGN1ciksCVwKKwkJeGZzX2JtYnQsIGJiLCBpLCBYRlNfQk1BUF9CTE9DS19JTUFYUkVDUygJXAorCQkJSU5UX0dFVCgoYmIpLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSwgY3VyKSkKKyNlbmRpZgorCisvKgorICogVGhlc2UgYXJlIHRvIGJlIHVzZWQgd2hlbiB3ZSBrbm93IHRoZSBzaXplIG9mIHRoZSBibG9jayBhbmQKKyAqIHdlIGRvbid0IGhhdmUgYSBjdXJzb3IuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfQlJPT1RfUkVDX0FERFIpCit4ZnNfYm1idF9yZWNfdCAqeGZzX2JtYXBfYnJvb3RfcmVjX2FkZHIoeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBpLCBpbnQgc3opOworI2RlZmluZSBYRlNfQk1BUF9CUk9PVF9SRUNfQUREUihiYixpLHN6KQl4ZnNfYm1hcF9icm9vdF9yZWNfYWRkcihiYixpLHN6KQorI2Vsc2UKKyNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfUkVDX0FERFIoYmIsaSxzeikgXAorCVhGU19CVFJFRV9SRUNfQUREUihzeix4ZnNfYm1idCxiYixpLFhGU19CTUFQX0JST09UX01BWFJFQ1Moc3opKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX0JST09UX0tFWV9BRERSKQoreGZzX2JtYnRfa2V5X3QgKnhmc19ibWFwX2Jyb290X2tleV9hZGRyKHhmc19ibWJ0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgaW50IHN6KTsKKyNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfS0VZX0FERFIoYmIsaSxzeikJeGZzX2JtYXBfYnJvb3Rfa2V5X2FkZHIoYmIsaSxzeikKKyNlbHNlCisjZGVmaW5lIFhGU19CTUFQX0JST09UX0tFWV9BRERSKGJiLGksc3opIFwKKwlYRlNfQlRSRUVfS0VZX0FERFIoc3oseGZzX2JtYnQsYmIsaSxYRlNfQk1BUF9CUk9PVF9NQVhSRUNTKHN6KSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9CUk9PVF9QVFJfQUREUikKK3hmc19ibWJ0X3B0cl90ICp4ZnNfYm1hcF9icm9vdF9wdHJfYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIGludCBzeik7CisjZGVmaW5lIFhGU19CTUFQX0JST09UX1BUUl9BRERSKGJiLGksc3opCXhmc19ibWFwX2Jyb290X3B0cl9hZGRyKGJiLGksc3opCisjZWxzZQorI2RlZmluZSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihiYixpLHN6KSBcCisJWEZTX0JUUkVFX1BUUl9BRERSKHN6LHhmc19ibWJ0LGJiLGksWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhzeikpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9CUk9PVF9OVU1SRUNTKQoraW50IHhmc19ibWFwX2Jyb290X251bXJlY3MoeGZzX2JtZHJfYmxvY2tfdCAqYmIpOworI2RlZmluZSBYRlNfQk1BUF9CUk9PVF9OVU1SRUNTKGJiKQkJeGZzX2JtYXBfYnJvb3RfbnVtcmVjcyhiYikKKyNlbHNlCisjZGVmaW5lIFhGU19CTUFQX0JST09UX05VTVJFQ1MoYmIpIChJTlRfR0VUKChiYiktPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfQlJPT1RfTUFYUkVDUykKK2ludCB4ZnNfYm1hcF9icm9vdF9tYXhyZWNzKGludCBzeik7CisjZGVmaW5lIFhGU19CTUFQX0JST09UX01BWFJFQ1Moc3opCQl4ZnNfYm1hcF9icm9vdF9tYXhyZWNzKHN6KQorI2Vsc2UKKyNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhzeikgWEZTX0JUUkVFX0JMT0NLX01BWFJFQ1Moc3oseGZzX2JtYnQsMCkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9CUk9PVF9TUEFDRV9DQUxDKQoraW50IHhmc19ibWFwX2Jyb290X3NwYWNlX2NhbGMoaW50IG5yZWNzKTsKKyNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfU1BBQ0VfQ0FMQyhucmVjcykJeGZzX2JtYXBfYnJvb3Rfc3BhY2VfY2FsYyhucmVjcykKKyNlbHNlCisjZGVmaW5lIFhGU19CTUFQX0JST09UX1NQQUNFX0NBTEMobnJlY3MpIFwKKwkoKGludCkoc2l6ZW9mKHhmc19ibWJ0X2Jsb2NrX3QpICsgXAorCSAgICAgICAoKG5yZWNzKSAqIChzaXplb2YoeGZzX2JtYnRfa2V5X3QpICsgc2l6ZW9mKHhmc19ibWJ0X3B0cl90KSkpKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9CUk9PVF9TUEFDRSkKK2ludCB4ZnNfYm1hcF9icm9vdF9zcGFjZSh4ZnNfYm1kcl9ibG9ja190ICpiYik7CisjZGVmaW5lIFhGU19CTUFQX0JST09UX1NQQUNFKGJiKQkJeGZzX2JtYXBfYnJvb3Rfc3BhY2UoYmIpCisjZWxzZQorI2RlZmluZSBYRlNfQk1BUF9CUk9PVF9TUEFDRShiYikgXAorCVhGU19CTUFQX0JST09UX1NQQUNFX0NBTEMoSU5UX0dFVCgoYmIpLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTURSX1NQQUNFX0NBTEMpCitpbnQgeGZzX2JtZHJfc3BhY2VfY2FsYyhpbnQgbnJlY3MpOworI2RlZmluZSBYRlNfQk1EUl9TUEFDRV9DQUxDKG5yZWNzKQkJeGZzX2JtZHJfc3BhY2VfY2FsYyhucmVjcykKKyNlbHNlCisjZGVmaW5lIFhGU19CTURSX1NQQUNFX0NBTEMobnJlY3MpCVwKKwkoKGludCkoc2l6ZW9mKHhmc19ibWRyX2Jsb2NrX3QpICsgXAorCSAgICAgICAoKG5yZWNzKSAqIChzaXplb2YoeGZzX2JtYnRfa2V5X3QpICsgc2l6ZW9mKHhmc19ibWJ0X3B0cl90KSkpKSkKKyNlbmRpZgorCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgYm1hcCBidHJlZSBsZXZlbHMuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNX01BWExFVkVMUykKK2ludCB4ZnNfYm1fbWF4bGV2ZWxzKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBpbnQgdyk7CisjZGVmaW5lIFhGU19CTV9NQVhMRVZFTFMobXAsdykJCQl4ZnNfYm1fbWF4bGV2ZWxzKG1wLHcpCisjZWxzZQorI2RlZmluZSBYRlNfQk1fTUFYTEVWRUxTKG1wLHcpCQkoKG1wKS0+bV9ibV9tYXhsZXZlbHNbd10pCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9TQU5JVFlfQ0hFQ0spCitpbnQgeGZzX2JtYXBfc2FuaXR5X2NoZWNrKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfYm1idF9ibG9ja190ICpiYiwKKwlpbnQgbGV2ZWwpOworI2RlZmluZSBYRlNfQk1BUF9TQU5JVFlfQ0hFQ0sobXAsYmIsbGV2ZWwpCVwKKwl4ZnNfYm1hcF9zYW5pdHlfY2hlY2sobXAsYmIsbGV2ZWwpCisjZWxzZQorI2RlZmluZSBYRlNfQk1BUF9TQU5JVFlfQ0hFQ0sobXAsYmIsbGV2ZWwpCVwKKwkoSU5UX0dFVCgoYmIpLT5iYl9tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfQk1BUF9NQUdJQyAmJiBcCisJIElOVF9HRVQoKGJiKS0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCkgPT0gbGV2ZWwgJiYgXAorCSBJTlRfR0VUKChiYiktPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPiAwICYmIFwKKwkgSU5UX0dFVCgoYmIpLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIDw9IChtcCktPm1fYm1hcF9kbXhyWyhsZXZlbCkgIT0gMF0pCisjZW5kaWYKKworCisjaWZkZWYgX19LRVJORUxfXworCisjaWYgZGVmaW5lZChYRlNfQk1CVF9UUkFDRSkKKy8qCisgKiBUcmFjZSBidWZmZXIgZW50cnkgdHlwZXMuCisgKi8KKyNkZWZpbmUgWEZTX0JNQlRfS1RSQUNFX0FSR0JJCTEKKyNkZWZpbmUgWEZTX0JNQlRfS1RSQUNFX0FSR0JJSQkyCisjZGVmaW5lIFhGU19CTUJUX0tUUkFDRV9BUkdGRkZJIDMKKyNkZWZpbmUgWEZTX0JNQlRfS1RSQUNFX0FSR0kJNAorI2RlZmluZSBYRlNfQk1CVF9LVFJBQ0VfQVJHSUZLCTUKKyNkZWZpbmUgWEZTX0JNQlRfS1RSQUNFX0FSR0lGUgk2CisjZGVmaW5lIFhGU19CTUJUX0tUUkFDRV9BUkdJSwk3CisjZGVmaW5lIFhGU19CTUJUX0tUUkFDRV9DVVIJOAorCisjZGVmaW5lIFhGU19CTUJUX1RSQUNFX1NJWkUJNDA5NgkvKiBzaXplIG9mIGdsb2JhbCB0cmFjZSBidWZmZXIgKi8KKyNkZWZpbmUgWEZTX0JNQlRfS1RSQUNFX1NJWkUJMzIJLyogc2l6ZSBvZiBwZXItaW5vZGUgdHJhY2UgYnVmZmVyICovCitleHRlcm4ga3RyYWNlX3QJKnhmc19ibWJ0X3RyYWNlX2J1ZjsKKyNlbmRpZgorCisvKgorICogUHJvdG90eXBlcyBmb3IgeGZzX2JtYXAuYyB0byBjYWxsLgorICovCisKK3ZvaWQKK3hmc19ibWRyX3RvX2JtYnQoCisJeGZzX2JtZHJfYmxvY2tfdCAqLAorCWludCwKKwl4ZnNfYm1idF9ibG9ja190ICosCisJaW50KTsKKworaW50Cit4ZnNfYm1idF9kZWNyZW1lbnQoCisJc3RydWN0IHhmc19idHJlZV9jdXIgKiwKKwlpbnQsCisJaW50ICopOworCitpbnQKK3hmc19ibWJ0X2RlbGV0ZSgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLAorCWludCAqKTsKKwordm9pZAoreGZzX2JtYnRfZ2V0X2FsbCgKKwl4ZnNfYm1idF9yZWNfdAkqciwKKwl4ZnNfYm1idF9pcmVjX3QgKnMpOworCit4ZnNfYm1idF9ibG9ja190ICoKK3hmc19ibWJ0X2dldF9ibG9jaygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCWludAkJCWxldmVsLAorCXN0cnVjdCB4ZnNfYnVmCQkqKmJwcCk7CisKK3hmc19maWxibGtzX3QKK3hmc19ibWJ0X2dldF9ibG9ja2NvdW50KAorCXhmc19ibWJ0X3JlY190CSpyKTsKKworeGZzX2ZzYmxvY2tfdAoreGZzX2JtYnRfZ2V0X3N0YXJ0YmxvY2soCisJeGZzX2JtYnRfcmVjX3QJKnIpOworCit4ZnNfZmlsZW9mZl90Cit4ZnNfYm1idF9nZXRfc3RhcnRvZmYoCisJeGZzX2JtYnRfcmVjX3QJKnIpOworCit4ZnNfZXhudHN0X3QKK3hmc19ibWJ0X2dldF9zdGF0ZSgKKwl4ZnNfYm1idF9yZWNfdAkqcik7CisKKyNpZiBfX0JZVEVfT1JERVIgIT0gX19CSUdfRU5ESUFOCit2b2lkCit4ZnNfYm1idF9kaXNrX2dldF9hbGwoCisJeGZzX2JtYnRfcmVjX3QJKnIsCisJeGZzX2JtYnRfaXJlY190ICpzKTsKKworeGZzX2V4bnRzdF90Cit4ZnNfYm1idF9kaXNrX2dldF9zdGF0ZSgKKwl4ZnNfYm1idF9yZWNfdAkqcik7CisKK3hmc19maWxibGtzX3QKK3hmc19ibWJ0X2Rpc2tfZ2V0X2Jsb2NrY291bnQoCisJeGZzX2JtYnRfcmVjX3QJKnIpOworCit4ZnNfZnNibG9ja190Cit4ZnNfYm1idF9kaXNrX2dldF9zdGFydGJsb2NrKAorCXhmc19ibWJ0X3JlY190CSpyKTsKKworeGZzX2ZpbGVvZmZfdAoreGZzX2JtYnRfZGlza19nZXRfc3RhcnRvZmYoCisJeGZzX2JtYnRfcmVjX3QJKnIpOworCisjZWxzZQorI2RlZmluZSB4ZnNfYm1idF9kaXNrX2dldF9hbGwociwgcykgXAorCXhmc19ibWJ0X2dldF9hbGwociwgcykKKyNkZWZpbmUgeGZzX2JtYnRfZGlza19nZXRfc3RhdGUocikgXAorCXhmc19ibWJ0X2dldF9zdGF0ZShyKQorI2RlZmluZSB4ZnNfYm1idF9kaXNrX2dldF9ibG9ja2NvdW50KHIpIFwKKwl4ZnNfYm1idF9nZXRfYmxvY2tjb3VudChyKQorI2RlZmluZSB4ZnNfYm1idF9kaXNrX2dldF9zdGFydGJsb2NrKHIpIFwKKwl4ZnNfYm1idF9nZXRfYmxvY2tjb3VudChyKQorI2RlZmluZSB4ZnNfYm1idF9kaXNrX2dldF9zdGFydG9mZihyKSBcCisJeGZzX2JtYnRfZ2V0X3N0YXJ0b2ZmKHIpCisjZW5kaWYKKworaW50Cit4ZnNfYm1idF9pbmNyZW1lbnQoCisJc3RydWN0IHhmc19idHJlZV9jdXIgKiwKKwlpbnQsCisJaW50ICopOworCitpbnQKK3hmc19ibWJ0X2luc2VydCgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLAorCWludCAqKTsKKwordm9pZAoreGZzX2JtYnRfbG9nX2Jsb2NrKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyICosCisJc3RydWN0IHhmc19idWYgKiwKKwlpbnQpOworCit2b2lkCit4ZnNfYm1idF9sb2dfcmVjcygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLAorCXN0cnVjdCB4ZnNfYnVmICosCisJaW50LAorCWludCk7CisKK2ludAoreGZzX2JtYnRfbG9va3VwX2VxKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyICosCisJeGZzX2ZpbGVvZmZfdCwKKwl4ZnNfZnNibG9ja190LAorCXhmc19maWxibGtzX3QsCisJaW50ICopOworCitpbnQKK3hmc19ibWJ0X2xvb2t1cF9nZSgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLAorCXhmc19maWxlb2ZmX3QsCisJeGZzX2ZzYmxvY2tfdCwKKwl4ZnNfZmlsYmxrc190LAorCWludCAqKTsKKworaW50Cit4ZnNfYm1idF9sb29rdXBfbGUoCisJc3RydWN0IHhmc19idHJlZV9jdXIgKiwKKwl4ZnNfZmlsZW9mZl90LAorCXhmc19mc2Jsb2NrX3QsCisJeGZzX2ZpbGJsa3NfdCwKKwlpbnQgKik7CisKKy8qCisgKiBHaXZlIHRoZSBibWFwIGJ0cmVlIGEgbmV3IHJvb3QgYmxvY2suICBDb3B5IHRoZSBvbGQgYnJvb3QgY29udGVudHMKKyAqIGRvd24gaW50byBhIHJlYWwgYmxvY2sgYW5kIG1ha2UgdGhlIGJyb290IHBvaW50IHRvIGl0LgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2JtYnRfbmV3cm9vdCgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJKmxvZ2ZsYWdzLAkvKiBsb2dnaW5nIGZsYWdzIGZvciBpbm9kZSAqLworCWludAkJCSpzdGF0KTsJCS8qIHJldHVybiBzdGF0dXMgLSAwIGZhaWwgKi8KKwordm9pZAoreGZzX2JtYnRfc2V0X2FsbCgKKwl4ZnNfYm1idF9yZWNfdAkqciwKKwl4ZnNfYm1idF9pcmVjX3QgKnMpOworCit2b2lkCit4ZnNfYm1idF9zZXRfYWxsZigKKwl4ZnNfYm1idF9yZWNfdAkqciwKKwl4ZnNfZmlsZW9mZl90CW8sCisJeGZzX2ZzYmxvY2tfdAliLAorCXhmc19maWxibGtzX3QJYywKKwl4ZnNfZXhudHN0X3QJdik7CisKK3ZvaWQKK3hmc19ibWJ0X3NldF9ibG9ja2NvdW50KAorCXhmc19ibWJ0X3JlY190CSpyLAorCXhmc19maWxibGtzX3QJdik7CisKK3ZvaWQKK3hmc19ibWJ0X3NldF9zdGFydGJsb2NrKAorCXhmc19ibWJ0X3JlY190CSpyLAorCXhmc19mc2Jsb2NrX3QJdik7CisKK3ZvaWQKK3hmc19ibWJ0X3NldF9zdGFydG9mZigKKwl4ZnNfYm1idF9yZWNfdAkqciwKKwl4ZnNfZmlsZW9mZl90CXYpOworCit2b2lkCit4ZnNfYm1idF9zZXRfc3RhdGUoCisJeGZzX2JtYnRfcmVjX3QJKnIsCisJeGZzX2V4bnRzdF90CXYpOworCisjaWYgX19CWVRFX09SREVSICE9IF9fQklHX0VORElBTgordm9pZAoreGZzX2JtYnRfZGlza19zZXRfYWxsKAorCXhmc19ibWJ0X3JlY190CSpyLAorCXhmc19ibWJ0X2lyZWNfdCAqcyk7CisKK3ZvaWQKK3hmc19ibWJ0X2Rpc2tfc2V0X2FsbGYoCisJeGZzX2JtYnRfcmVjX3QJKnIsCisJeGZzX2ZpbGVvZmZfdAlvLAorCXhmc19mc2Jsb2NrX3QJYiwKKwl4ZnNfZmlsYmxrc190CWMsCisJeGZzX2V4bnRzdF90CXYpOworI2Vsc2UKKyNkZWZpbmUgeGZzX2JtYnRfZGlza19zZXRfYWxsKHIsIHMpIFwKKwl4ZnNfYm1idF9zZXRfYWxsKHIsIHMpCisjZGVmaW5lIHhmc19ibWJ0X2Rpc2tfc2V0X2FsbGYociwgbywgYiwgYywgdikgXAorCXhmc19ibWJ0X3NldF9hbGxmKHIsIG8sIGIsIGMsIHYpCisjZW5kaWYKKwordm9pZAoreGZzX2JtYnRfdG9fYm1kcigKKwl4ZnNfYm1idF9ibG9ja190ICosCisJaW50LAorCXhmc19ibWRyX2Jsb2NrX3QgKiwKKwlpbnQpOworCitpbnQKK3hmc19ibWJ0X3VwZGF0ZSgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLAorCXhmc19maWxlb2ZmX3QsCisJeGZzX2ZzYmxvY2tfdCwKKwl4ZnNfZmlsYmxrc190LAorCXhmc19leG50c3RfdCk7CisKKyNpZmRlZiBERUJVRworLyoKKyAqIEdldCB0aGUgZGF0YSBmcm9tIHRoZSBwb2ludGVkLXRvIHJlY29yZC4KKyAqLworaW50Cit4ZnNfYm1idF9nZXRfcmVjKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyICosCisJeGZzX2ZpbGVvZmZfdCAqLAorCXhmc19mc2Jsb2NrX3QgKiwKKwl4ZnNfZmlsYmxrc190ICosCisJeGZzX2V4bnRzdF90ICosCisJaW50ICopOworI2VuZGlmCisKKworLyoKKyAqIFNlYXJjaCBhbiBleHRlbnQgbGlzdCBmb3IgdGhlIGV4dGVudCB3aGljaCBpbmNsdWRlcyBibG9jaworICogYm5vLgorICovCit4ZnNfYm1idF9yZWNfdCAqCit4ZnNfYm1hcF9kb19zZWFyY2hfZXh0ZW50cygKKwl4ZnNfYm1idF9yZWNfdCAqLAorCXhmc19leHRudW1fdCwKKwl4ZnNfZXh0bnVtX3QsCisJeGZzX2ZpbGVvZmZfdCwKKwlpbnQgKiwKKwl4ZnNfZXh0bnVtX3QgKiwKKwl4ZnNfYm1idF9pcmVjX3QgKiwKKwl4ZnNfYm1idF9pcmVjX3QgKik7CisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgkvKiBfX1hGU19CTUFQX0JUUkVFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idHJlZS5jIGIvZnMveGZzL3hmc19idHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZDIyZGQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2J0cmVlLmMKQEAgLTAsMCArMSw5NDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgY29tbW9uIGNvZGUgZm9yIHRoZSBzcGFjZSBtYW5hZ2VyJ3MgYnRyZWUgaW1wbGVtZW50YXRpb25zLgorICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKworI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorCisvKgorICogQ3Vyc29yIGFsbG9jYXRpb24gem9uZS4KKyAqLwora21lbV96b25lX3QJKnhmc19idHJlZV9jdXJfem9uZTsKKworLyoKKyAqIEJ0cmVlIG1hZ2ljIG51bWJlcnMuCisgKi8KK2NvbnN0IF9fdWludDMyX3QgeGZzX21hZ2ljc1tYRlNfQlROVU1fTUFYXSA9Cit7CisJWEZTX0FCVEJfTUFHSUMsIFhGU19BQlRDX01BR0lDLCBYRlNfQk1BUF9NQUdJQywgWEZTX0lCVF9NQUdJQworfTsKKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIGludGVybmFsIHJvdXRpbmVzLgorICovCisKKy8qCisgKiBDaGVja2luZyByb3V0aW5lOiByZXR1cm4gbWF4cmVjcyBmb3IgdGhlIGJsb2NrLgorICovCitTVEFUSUMgaW50CQkJCS8qIG51bWJlciBvZiByZWNvcmRzIGZpdHRpbmcgaW4gYmxvY2sgKi8KK3hmc19idHJlZV9tYXhyZWNzKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2J0cmVlX2Jsb2NrX3QJKmJsb2NrKTsvKiBnZW5lcmljIGJ0cmVlIGJsb2NrIHBvaW50ZXIgKi8KKworLyoKKyAqIEludGVybmFsIHJvdXRpbmVzLgorICovCisKKy8qCisgKiBDaGVja2luZyByb3V0aW5lOiByZXR1cm4gbWF4cmVjcyBmb3IgdGhlIGJsb2NrLgorICovCitTVEFUSUMgaW50CQkJCS8qIG51bWJlciBvZiByZWNvcmRzIGZpdHRpbmcgaW4gYmxvY2sgKi8KK3hmc19idHJlZV9tYXhyZWNzKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2J0cmVlX2Jsb2NrX3QJKmJsb2NrKQkvKiBnZW5lcmljIGJ0cmVlIGJsb2NrIHBvaW50ZXIgKi8KK3sKKwlzd2l0Y2ggKGN1ci0+YmNfYnRudW0pIHsKKwljYXNlIFhGU19CVE5VTV9CTk86CisJY2FzZSBYRlNfQlROVU1fQ05UOgorCQlyZXR1cm4gKGludClYRlNfQUxMT0NfQkxPQ0tfTUFYUkVDUyhJTlRfR0VUKGJsb2NrLT5iYl9oLmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpLCBjdXIpOworCWNhc2UgWEZTX0JUTlVNX0JNQVA6CisJCXJldHVybiAoaW50KVhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKElOVF9HRVQoYmxvY2stPmJiX2guYmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCksIGN1cik7CisJY2FzZSBYRlNfQlROVU1fSU5POgorCQlyZXR1cm4gKGludClYRlNfSU5PQlRfQkxPQ0tfTUFYUkVDUyhJTlRfR0VUKGJsb2NrLT5iYl9oLmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpLCBjdXIpOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKgorICogRXh0ZXJuYWwgcm91dGluZXMuCisgKi8KKworI2lmZGVmIERFQlVHCisvKgorICogRGVidWcgcm91dGluZTogY2hlY2sgdGhhdCBibG9jayBoZWFkZXIgaXMgb2suCisgKi8KK3ZvaWQKK3hmc19idHJlZV9jaGVja19ibG9jaygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19idHJlZV9ibG9ja190CSpibG9jaywJLyogZ2VuZXJpYyBidHJlZSBibG9jayBwb2ludGVyICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIG9mIHRoZSBidHJlZSBibG9jayAqLworCXhmc19idWZfdAkJKmJwKQkvKiBidWZmZXIgY29udGFpbmluZyBibG9jaywgaWYgYW55ICovCit7CisJaWYgKFhGU19CVFJFRV9MT05HX1BUUlMoY3VyLT5iY19idG51bSkpCisJCXhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCAoeGZzX2J0cmVlX2xibG9ja190ICopYmxvY2ssIGxldmVsLAorCQkJYnApOworCWVsc2UKKwkJeGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsICh4ZnNfYnRyZWVfc2Jsb2NrX3QgKilibG9jaywgbGV2ZWwsCisJCQlicCk7Cit9CisKKy8qCisgKiBEZWJ1ZyByb3V0aW5lOiBjaGVjayB0aGF0IGtleXMgYXJlIGluIHRoZSByaWdodCBvcmRlci4KKyAqLwordm9pZAoreGZzX2J0cmVlX2NoZWNrX2tleSgKKwl4ZnNfYnRudW1fdAlidG51bSwJCS8qIGJ0cmVlIGlkZW50aWZpZXIgKi8KKwl2b2lkCQkqYWsxLAkJLyogcG9pbnRlciB0byBsZWZ0IChsb3dlcikga2V5ICovCisJdm9pZAkJKmFrMikJCS8qIHBvaW50ZXIgdG8gcmlnaHQgKGhpZ2hlcikga2V5ICovCit7CisJc3dpdGNoIChidG51bSkgeworCWNhc2UgWEZTX0JUTlVNX0JOTzogeworCQl4ZnNfYWxsb2Nfa2V5X3QJKmsxOworCQl4ZnNfYWxsb2Nfa2V5X3QJKmsyOworCisJCWsxID0gYWsxOworCQlrMiA9IGFrMjsKKwkJQVNTRVJUKElOVF9HRVQoazEtPmFyX3N0YXJ0YmxvY2ssIEFSQ0hfQ09OVkVSVCkgPCBJTlRfR0VUKGsyLT5hcl9zdGFydGJsb2NrLCBBUkNIX0NPTlZFUlQpKTsKKwkJYnJlYWs7CisJICAgIH0KKwljYXNlIFhGU19CVE5VTV9DTlQ6IHsKKwkJeGZzX2FsbG9jX2tleV90CSprMTsKKwkJeGZzX2FsbG9jX2tleV90CSprMjsKKworCQlrMSA9IGFrMTsKKwkJazIgPSBhazI7CisJCUFTU0VSVChJTlRfR0VUKGsxLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpIDwgSU5UX0dFVChrMi0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKSB8fAorCQkgICAgICAgKElOVF9HRVQoazEtPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCkgPT0gSU5UX0dFVChrMi0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKSAmJgorCQkJSU5UX0dFVChrMS0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJUKSA8IElOVF9HRVQoazItPmFyX3N0YXJ0YmxvY2ssIEFSQ0hfQ09OVkVSVCkpKTsKKwkJYnJlYWs7CisJICAgIH0KKwljYXNlIFhGU19CVE5VTV9CTUFQOiB7CisJCXhmc19ibWJ0X2tleV90CSprMTsKKwkJeGZzX2JtYnRfa2V5X3QJKmsyOworCisJCWsxID0gYWsxOworCQlrMiA9IGFrMjsKKwkJQVNTRVJUKElOVF9HRVQoazEtPmJyX3N0YXJ0b2ZmLCBBUkNIX0NPTlZFUlQpIDwgSU5UX0dFVChrMi0+YnJfc3RhcnRvZmYsIEFSQ0hfQ09OVkVSVCkpOworCQlicmVhazsKKwkgICAgfQorCWNhc2UgWEZTX0JUTlVNX0lOTzogeworCQl4ZnNfaW5vYnRfa2V5X3QJKmsxOworCQl4ZnNfaW5vYnRfa2V5X3QJKmsyOworCisJCWsxID0gYWsxOworCQlrMiA9IGFrMjsKKwkJQVNTRVJUKElOVF9HRVQoazEtPmlyX3N0YXJ0aW5vLCBBUkNIX0NPTlZFUlQpIDwgSU5UX0dFVChrMi0+aXJfc3RhcnRpbm8sIEFSQ0hfQ09OVkVSVCkpOworCQlicmVhazsKKwkgICAgfQorCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwl9Cit9CisjZW5kaWYJLyogREVCVUcgKi8KKworLyoKKyAqIENoZWNraW5nIHJvdXRpbmU6IGNoZWNrIHRoYXQgbG9uZyBmb3JtIGJsb2NrIGhlYWRlciBpcyBvay4KKyAqLworLyogQVJHU1VTRUQgKi8KK2ludAkJCQkJLyogZXJyb3IgKDAgb3IgRUZTQ09SUlVQVEVEKSAqLworeGZzX2J0cmVlX2NoZWNrX2xibG9jaygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19idHJlZV9sYmxvY2tfdAkqYmxvY2ssCS8qIGJ0cmVlIGxvbmcgZm9ybSBibG9jayBwb2ludGVyICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIG9mIHRoZSBidHJlZSBibG9jayAqLworCXhmc19idWZfdAkJKmJwKQkvKiBidWZmZXIgZm9yIGJsb2NrLCBpZiBhbnkgKi8KK3sKKwlpbnQJCQlsYmxvY2tfb2s7IC8qIGJsb2NrIHBhc3NlcyBjaGVja3MgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCisJbXAgPSBjdXItPmJjX21wOworCWxibG9ja19vayA9CisJCUlOVF9HRVQoYmxvY2stPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQpID09IHhmc19tYWdpY3NbY3VyLT5iY19idG51bV0gJiYKKwkJSU5UX0dFVChibG9jay0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCkgPT0gbGV2ZWwgJiYKKwkJSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA8PQorCQkJeGZzX2J0cmVlX21heHJlY3MoY3VyLCAoeGZzX2J0cmVlX2Jsb2NrX3QgKilibG9jaykgJiYKKwkJYmxvY2stPmJiX2xlZnRzaWIgJiYKKwkJKElOVF9HRVQoYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTERGU0JOTyB8fAorCQkgWEZTX0ZTQl9TQU5JVFlfQ0hFQ0sobXAsIElOVF9HRVQoYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkpKSAmJgorCQlibG9jay0+YmJfcmlnaHRzaWIgJiYKKwkJKElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExERlNCTk8gfHwKKwkJIFhGU19GU0JfU0FOSVRZX0NIRUNLKG1wLCBJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSkpOworCWlmICh1bmxpa2VseShYRlNfVEVTVF9FUlJPUighbGJsb2NrX29rLCBtcCwgWEZTX0VSUlRBR19CVFJFRV9DSEVDS19MQkxPQ0ssCisJCQlYRlNfUkFORE9NX0JUUkVFX0NIRUNLX0xCTE9DSykpKSB7CisJCWlmIChicCkKKwkJCXhmc19idWZ0cmFjZSgiTEJUUkVFIEVSUk9SIiwgYnApOworCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrIiwgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkgbXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2tpbmcgcm91dGluZTogY2hlY2sgdGhhdCAobG9uZykgcG9pbnRlciBpcyBvay4KKyAqLworaW50CQkJCQkvKiBlcnJvciAoMCBvciBFRlNDT1JSVVBURUQpICovCit4ZnNfYnRyZWVfY2hlY2tfbHB0cigKKwl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwJCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19kZnNibm9fdAlwdHIsCQkvKiBidHJlZSBibG9jayBkaXNrIGFkZHJlc3MgKi8KKwlpbnQJCWxldmVsKQkJLyogYnRyZWUgYmxvY2sgbGV2ZWwgKi8KK3sKKwl4ZnNfbW91bnRfdAkqbXA7CQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCisJbXAgPSBjdXItPmJjX21wOworCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oCisJCWxldmVsID4gMCAmJgorCQlwdHIgIT0gTlVMTERGU0JOTyAmJgorCQlYRlNfRlNCX1NBTklUWV9DSEVDSyhtcCwgcHRyKSk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBERUJVRworLyoKKyAqIERlYnVnIHJvdXRpbmU6IGNoZWNrIHRoYXQgcmVjb3JkcyBhcmUgaW4gdGhlIHJpZ2h0IG9yZGVyLgorICovCit2b2lkCit4ZnNfYnRyZWVfY2hlY2tfcmVjKAorCXhmc19idG51bV90CWJ0bnVtLAkJLyogYnRyZWUgaWRlbnRpZmllciAqLworCXZvaWQJCSphcjEsCQkvKiBwb2ludGVyIHRvIGxlZnQgKGxvd2VyKSByZWNvcmQgKi8KKwl2b2lkCQkqYXIyKQkJLyogcG9pbnRlciB0byByaWdodCAoaGlnaGVyKSByZWNvcmQgKi8KK3sKKwlzd2l0Y2ggKGJ0bnVtKSB7CisJY2FzZSBYRlNfQlROVU1fQk5POiB7CisJCXhmc19hbGxvY19yZWNfdAkqcjE7CisJCXhmc19hbGxvY19yZWNfdAkqcjI7CisKKwkJcjEgPSBhcjE7CisJCXIyID0gYXIyOworCQlBU1NFUlQoSU5UX0dFVChyMS0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJUKSArIElOVF9HRVQocjEtPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCkgPD0KKwkJICAgICAgIElOVF9HRVQocjItPmFyX3N0YXJ0YmxvY2ssIEFSQ0hfQ09OVkVSVCkpOworCQlicmVhazsKKwkgICAgfQorCWNhc2UgWEZTX0JUTlVNX0NOVDogeworCQl4ZnNfYWxsb2NfcmVjX3QJKnIxOworCQl4ZnNfYWxsb2NfcmVjX3QJKnIyOworCisJCXIxID0gYXIxOworCQlyMiA9IGFyMjsKKwkJQVNTRVJUKElOVF9HRVQocjEtPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCkgPCBJTlRfR0VUKHIyLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpIHx8CisJCSAgICAgICAoSU5UX0dFVChyMS0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKSA9PSBJTlRfR0VUKHIyLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpICYmCisJCQlJTlRfR0VUKHIxLT5hcl9zdGFydGJsb2NrLCBBUkNIX0NPTlZFUlQpIDwgSU5UX0dFVChyMi0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJUKSkpOworCQlicmVhazsKKwkgICAgfQorCWNhc2UgWEZTX0JUTlVNX0JNQVA6IHsKKwkJeGZzX2JtYnRfcmVjX3QJKnIxOworCQl4ZnNfYm1idF9yZWNfdAkqcjI7CisKKwkJcjEgPSBhcjE7CisJCXIyID0gYXIyOworCQlBU1NFUlQoeGZzX2JtYnRfZGlza19nZXRfc3RhcnRvZmYocjEpICsKKwkJICAgICAgIHhmc19ibWJ0X2Rpc2tfZ2V0X2Jsb2NrY291bnQocjEpIDw9CisJCSAgICAgICB4ZnNfYm1idF9kaXNrX2dldF9zdGFydG9mZihyMikpOworCQlicmVhazsKKwkgICAgfQorCWNhc2UgWEZTX0JUTlVNX0lOTzogeworCQl4ZnNfaW5vYnRfcmVjX3QJKnIxOworCQl4ZnNfaW5vYnRfcmVjX3QJKnIyOworCisJCXIxID0gYXIxOworCQlyMiA9IGFyMjsKKwkJQVNTRVJUKElOVF9HRVQocjEtPmlyX3N0YXJ0aW5vLCBBUkNIX0NPTlZFUlQpICsgWEZTX0lOT0RFU19QRVJfQ0hVTksgPD0KKwkJICAgICAgIElOVF9HRVQocjItPmlyX3N0YXJ0aW5vLCBBUkNIX0NPTlZFUlQpKTsKKwkJYnJlYWs7CisJICAgIH0KKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJfQorfQorI2VuZGlmCS8qIERFQlVHICovCisKKy8qCisgKiBDaGVja2luZyByb3V0aW5lOiBjaGVjayB0aGF0IGJsb2NrIGhlYWRlciBpcyBvay4KKyAqLworLyogQVJHU1VTRUQgKi8KK2ludAkJCQkJLyogZXJyb3IgKDAgb3IgRUZTQ09SUlVQVEVEKSAqLworeGZzX2J0cmVlX2NoZWNrX3NibG9jaygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19idHJlZV9zYmxvY2tfdAkqYmxvY2ssCS8qIGJ0cmVlIHNob3J0IGZvcm0gYmxvY2sgcG9pbnRlciAqLworCWludAkJCWxldmVsLAkvKiBsZXZlbCBvZiB0aGUgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfYnVmX3QJCSpicCkJLyogYnVmZmVyIGNvbnRhaW5pbmcgYmxvY2sgKi8KK3sKKwl4ZnNfYnVmX3QJCSphZ2JwOwkvKiBidWZmZXIgZm9yIGFnLiBmcmVlc3BhY2Ugc3RydWN0ICovCisJeGZzX2FnZl90CQkqYWdmOwkvKiBhZy4gZnJlZXNwYWNlIHN0cnVjdHVyZSAqLworCXhmc19hZ2Jsb2NrX3QJCWFnZmxlbjsJLyogbmF0aXZlIGFnLiBmcmVlc3BhY2UgbGVuZ3RoICovCisJaW50CQkJc2Jsb2NrX29rOyAvKiBibG9jayBwYXNzZXMgY2hlY2tzICovCisKKwlhZ2JwID0gY3VyLT5iY19wcml2YXRlLmEuYWdicDsKKwlhZ2YgPSBYRlNfQlVGX1RPX0FHRihhZ2JwKTsKKwlhZ2ZsZW4gPSBJTlRfR0VUKGFnZi0+YWdmX2xlbmd0aCwgQVJDSF9DT05WRVJUKTsKKwlzYmxvY2tfb2sgPQorCQlJTlRfR0VUKGJsb2NrLT5iYl9tYWdpYywgQVJDSF9DT05WRVJUKSA9PSB4ZnNfbWFnaWNzW2N1ci0+YmNfYnRudW1dICYmCisJCUlOVF9HRVQoYmxvY2stPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpID09IGxldmVsICYmCisJCUlOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPD0KKwkJCXhmc19idHJlZV9tYXhyZWNzKGN1ciwgKHhmc19idHJlZV9ibG9ja190ICopYmxvY2spICYmCisJCShJTlRfR0VUKGJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExBR0JMT0NLIHx8CisJCSBJTlRfR0VUKGJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpIDwgYWdmbGVuKSAmJgorCQlibG9jay0+YmJfbGVmdHNpYiAmJgorCQkoSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTEFHQkxPQ0sgfHwKKwkJIElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpIDwgYWdmbGVuKSAmJgorCQlibG9jay0+YmJfcmlnaHRzaWI7CisJaWYgKHVubGlrZWx5KFhGU19URVNUX0VSUk9SKCFzYmxvY2tfb2ssIGN1ci0+YmNfbXAsCisJCQlYRlNfRVJSVEFHX0JUUkVFX0NIRUNLX1NCTE9DSywKKwkJCVhGU19SQU5ET01fQlRSRUVfQ0hFQ0tfU0JMT0NLKSkpIHsKKwkJaWYgKGJwKQorCQkJeGZzX2J1ZnRyYWNlKCJTQlRSRUUgRVJST1IiLCBicCk7CisJCVhGU19FUlJPUl9SRVBPUlQoInhmc19idHJlZV9jaGVja19zYmxvY2siLCBYRlNfRVJSTEVWRUxfTE9XLAorCQkJCSBjdXItPmJjX21wKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoZWNraW5nIHJvdXRpbmU6IGNoZWNrIHRoYXQgKHNob3J0KSBwb2ludGVyIGlzIG9rLgorICovCitpbnQJCQkJCS8qIGVycm9yICgwIG9yIEVGU0NPUlJVUFRFRCkgKi8KK3hmc19idHJlZV9jaGVja19zcHRyKAorCXhmc19idHJlZV9jdXJfdAkqY3VyLAkJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2FnYmxvY2tfdAlwdHIsCQkvKiBidHJlZSBibG9jayBkaXNrIGFkZHJlc3MgKi8KKwlpbnQJCWxldmVsKQkJLyogYnRyZWUgYmxvY2sgbGV2ZWwgKi8KK3sKKwl4ZnNfYnVmX3QJKmFnYnA7CQkvKiBidWZmZXIgZm9yIGFnLiBmcmVlc3BhY2Ugc3RydWN0ICovCisJeGZzX2FnZl90CSphZ2Y7CQkvKiBhZy4gZnJlZXNwYWNlIHN0cnVjdHVyZSAqLworCisJYWdicCA9IGN1ci0+YmNfcHJpdmF0ZS5hLmFnYnA7CisJYWdmID0gWEZTX0JVRl9UT19BR0YoYWdicCk7CisJWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTigKKwkJbGV2ZWwgPiAwICYmCisJCXB0ciAhPSBOVUxMQUdCTE9DSyAmJiBwdHIgIT0gMCAmJgorCQlwdHIgPCBJTlRfR0VUKGFnZi0+YWdmX2xlbmd0aCwgQVJDSF9DT05WRVJUKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWxldGUgdGhlIGJ0cmVlIGN1cnNvci4KKyAqLwordm9pZAoreGZzX2J0cmVlX2RlbF9jdXJzb3IoCisJeGZzX2J0cmVlX2N1cl90CSpjdXIsCQkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCWVycm9yKQkJLyogZGVsIGJlY2F1c2Ugb2YgZXJyb3IgKi8KK3sKKwlpbnQJCWk7CQkvKiBidHJlZSBsZXZlbCAqLworCisJLyoKKwkgKiBDbGVhciB0aGUgYnVmZmVyIHBvaW50ZXJzLCBhbmQgcmVsZWFzZSB0aGUgYnVmZmVycy4KKwkgKiBJZiB3ZSdyZSBkb2luZyB0aGlzIGluIHRoZSBmYWNlIG9mIGFuIGVycm9yLCB3ZQorCSAqIG5lZWQgdG8gbWFrZSBzdXJlIHRvIGluc3BlY3QgYWxsIG9mIHRoZSBlbnRyaWVzCisJICogaW4gdGhlIGJjX2J1ZnMgYXJyYXkgZm9yIGJ1ZmZlcnMgdG8gYmUgdW5sb2NrZWQuCisJICogVGhpcyBpcyBiZWNhdXNlIHNvbWUgb2YgdGhlIGJ0cmVlIGNvZGUgd29ya3MgZnJvbQorCSAqIGxldmVsIG4gZG93biB0byAwLCBhbmQgaWYgd2UgZ2V0IGFuIGVycm9yIGFsb25nCisJICogdGhlIHdheSB3ZSB3b24ndCBoYXZlIGluaXRpYWxpemVkIGFsbCB0aGUgZW50cmllcworCSAqIGRvd24gdG8gMC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3VyLT5iY19ubGV2ZWxzOyBpKyspIHsKKwkJaWYgKGN1ci0+YmNfYnVmc1tpXSkKKwkJCXhmc19idHJlZV9zZXRidWYoY3VyLCBpLCBOVUxMKTsKKwkJZWxzZSBpZiAoIWVycm9yKQorCQkJYnJlYWs7CisJfQorCS8qCisJICogQ2FuJ3QgZnJlZSBhIGJtYXAgY3Vyc29yIHdpdGhvdXQgaGF2aW5nIGRlYWx0IHdpdGggdGhlCisJICogYWxsb2NhdGVkIGluZGlyZWN0IGJsb2NrcycgYWNjb3VudGluZy4KKwkgKi8KKwlBU1NFUlQoY3VyLT5iY19idG51bSAhPSBYRlNfQlROVU1fQk1BUCB8fAorCSAgICAgICBjdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQgPT0gMCk7CisJLyoKKwkgKiBGcmVlIHRoZSBjdXJzb3IuCisJICovCisJa21lbV96b25lX2ZyZWUoeGZzX2J0cmVlX2N1cl96b25lLCBjdXIpOworfQorCisvKgorICogRHVwbGljYXRlIHRoZSBidHJlZSBjdXJzb3IuCisgKiBBbGxvY2F0ZSBhIG5ldyBvbmUsIGNvcHkgdGhlIHJlY29yZCwgcmUtZ2V0IHRoZSBidWZmZXJzLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYnRyZWVfZHVwX2N1cnNvcigKKwl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwJCS8qIGlucHV0IGN1cnNvciAqLworCXhmc19idHJlZV9jdXJfdAkqKm5jdXIpCQkvKiBvdXRwdXQgY3Vyc29yICovCit7CisJeGZzX2J1Zl90CSpicDsJCS8qIGJ0cmVlIGJsb2NrJ3MgYnVmZmVyIHBvaW50ZXIgKi8KKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQlpOwkJLyogbGV2ZWwgbnVtYmVyIG9mIGJ0cmVlIGJsb2NrICovCisJeGZzX21vdW50X3QJKm1wOwkJLyogbW91bnQgc3RydWN0dXJlIGZvciBmaWxlc3lzdGVtICovCisJeGZzX2J0cmVlX2N1cl90CSpuZXc7CQkvKiBuZXcgY3Vyc29yIHZhbHVlICovCisJeGZzX3RyYW5zX3QJKnRwOwkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciwgY2FuIGJlIE5VTEwgKi8KKworCXRwID0gY3VyLT5iY190cDsKKwltcCA9IGN1ci0+YmNfbXA7CisJLyoKKwkgKiBBbGxvY2F0ZSBhIG5ldyBjdXJzb3IgbGlrZSB0aGUgb2xkIG9uZS4KKwkgKi8KKwluZXcgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IobXAsIHRwLCBjdXItPmJjX3ByaXZhdGUuYS5hZ2JwLAorCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCBjdXItPmJjX2J0bnVtLCBjdXItPmJjX3ByaXZhdGUuYi5pcCwKKwkJY3VyLT5iY19wcml2YXRlLmIud2hpY2hmb3JrKTsKKwkvKgorCSAqIENvcHkgdGhlIHJlY29yZCBjdXJyZW50bHkgaW4gdGhlIGN1cnNvci4KKwkgKi8KKwluZXctPmJjX3JlYyA9IGN1ci0+YmNfcmVjOworCS8qCisJICogRm9yIGVhY2ggbGV2ZWwgY3VycmVudCwgcmUtZ2V0IHRoZSBidWZmZXIgYW5kIGNvcHkgdGhlIHB0ciB2YWx1ZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbmV3LT5iY19ubGV2ZWxzOyBpKyspIHsKKwkJbmV3LT5iY19wdHJzW2ldID0gY3VyLT5iY19wdHJzW2ldOworCQluZXctPmJjX3JhW2ldID0gY3VyLT5iY19yYVtpXTsKKwkJaWYgKChicCA9IGN1ci0+YmNfYnVmc1tpXSkpIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfcmVhZF9idWYobXAsIHRwLCBtcC0+bV9kZGV2X3RhcmdwLAorCQkJCVhGU19CVUZfQUREUihicCksIG1wLT5tX2JzaXplLCAwLCAmYnApKSkgeworCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKG5ldywgZXJyb3IpOworCQkJCSpuY3VyID0gTlVMTDsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQluZXctPmJjX2J1ZnNbaV0gPSBicDsKKwkJCUFTU0VSVChicCk7CisJCQlBU1NFUlQoIVhGU19CVUZfR0VURVJST1IoYnApKTsKKwkJfSBlbHNlCisJCQluZXctPmJjX2J1ZnNbaV0gPSBOVUxMOworCX0KKwkvKgorCSAqIEZvciBibWFwIGJ0cmVlcywgY29weSB0aGUgZmlyc3RibG9jaywgZmxpc3QsIGFuZCBmbGFncyB2YWx1ZXMsCisJICogc2luY2UgaW5pdCBjdXJzb3IgZG9lc24ndCBnZXQgdGhlbS4KKwkgKi8KKwlpZiAobmV3LT5iY19idG51bSA9PSBYRlNfQlROVU1fQk1BUCkgeworCQluZXctPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0gY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jazsKKwkJbmV3LT5iY19wcml2YXRlLmIuZmxpc3QgPSBjdXItPmJjX3ByaXZhdGUuYi5mbGlzdDsKKwkJbmV3LT5iY19wcml2YXRlLmIuZmxhZ3MgPSBjdXItPmJjX3ByaXZhdGUuYi5mbGFnczsKKwl9CisJKm5jdXIgPSBuZXc7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGFuZ2UgdGhlIGN1cnNvciB0byBwb2ludCB0byB0aGUgZmlyc3QgcmVjb3JkIGF0IHRoZSBnaXZlbiBsZXZlbC4KKyAqIE90aGVyIGxldmVscyBhcmUgdW5hZmZlY3RlZC4KKyAqLworaW50CQkJCQkvKiBzdWNjZXNzPTEsIGZhaWx1cmU9MCAqLworeGZzX2J0cmVlX2ZpcnN0cmVjKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2ZWwpCS8qIGxldmVsIHRvIGNoYW5nZSAqLworeworCXhmc19idHJlZV9ibG9ja190CSpibG9jazsJLyogZ2VuZXJpYyBidHJlZSBibG9jayBwb2ludGVyICovCisJeGZzX2J1Zl90CQkqYnA7CS8qIGJ1ZmZlciBjb250YWluaW5nIGJsb2NrICovCisKKwkvKgorCSAqIEdldCB0aGUgYmxvY2sgcG9pbnRlciBmb3IgdGhpcyBsZXZlbC4KKwkgKi8KKwlibG9jayA9IHhmc19idHJlZV9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJmJwKTsKKwl4ZnNfYnRyZWVfY2hlY2tfYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsIGJwKTsKKwkvKgorCSAqIEl0J3MgZW1wdHksIHRoZXJlIGlzIG5vIHN1Y2ggcmVjb3JkLgorCSAqLworCWlmICghYmxvY2stPmJiX2guYmJfbnVtcmVjcykKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBTZXQgdGhlIHB0ciB2YWx1ZSB0byAxLCB0aGF0J3MgdGhlIGZpcnN0IHJlY29yZC9rZXkuCisJICovCisJY3VyLT5iY19wdHJzW2xldmVsXSA9IDE7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZXRyaWV2ZSB0aGUgYmxvY2sgcG9pbnRlciBmcm9tIHRoZSBjdXJzb3IgYXQgdGhlIGdpdmVuIGxldmVsLgorICogVGhpcyBtYXkgYmUgYSBibWFwIGJ0cmVlIHJvb3Qgb3IgZnJvbSBhIGJ1ZmZlci4KKyAqLworeGZzX2J0cmVlX2Jsb2NrX3QgKgkJCS8qIGdlbmVyaWMgYnRyZWUgYmxvY2sgcG9pbnRlciAqLworeGZzX2J0cmVlX2dldF9ibG9jaygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldmVsLAkvKiBsZXZlbCBpbiBidHJlZSAqLworCXhmc19idWZfdAkJKipicHApCS8qIGJ1ZmZlciBjb250YWluaW5nIHRoZSBibG9jayAqLworeworCXhmc19idHJlZV9ibG9ja190CSpibG9jazsJLyogcmV0dXJuIHZhbHVlICovCisJeGZzX2J1Zl90CQkqYnA7CS8qIHJldHVybiBidWZmZXIgKi8KKwl4ZnNfaWZvcmtfdAkJKmlmcDsJLyogaW5vZGUgZm9yayBwb2ludGVyICovCisJaW50CQkJd2hpY2hmb3JrOyAvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCisJaWYgKGN1ci0+YmNfYnRudW0gPT0gWEZTX0JUTlVNX0JNQVAgJiYgbGV2ZWwgPT0gY3VyLT5iY19ubGV2ZWxzIC0gMSkgeworCQl3aGljaGZvcmsgPSBjdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcms7CisJCWlmcCA9IFhGU19JRk9SS19QVFIoY3VyLT5iY19wcml2YXRlLmIuaXAsIHdoaWNoZm9yayk7CisJCWJsb2NrID0gKHhmc19idHJlZV9ibG9ja190ICopaWZwLT5pZl9icm9vdDsKKwkJYnAgPSBOVUxMOworCX0gZWxzZSB7CisJCWJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX0JMT0NLKGJwKTsKKwl9CisJQVNTRVJUKGJsb2NrICE9IE5VTEwpOworCSpicHAgPSBicDsKKwlyZXR1cm4gYmxvY2s7Cit9CisKKy8qCisgKiBHZXQgYSBidWZmZXIgZm9yIHRoZSBibG9jaywgcmV0dXJuIGl0IHdpdGggbm8gZGF0YSByZWFkLgorICogTG9uZy1mb3JtIGFkZHJlc3NpbmcuCisgKi8KK3hmc19idWZfdCAqCQkJCS8qIGJ1ZmZlciBmb3IgZnNibm8gKi8KK3hmc19idHJlZV9nZXRfYnVmbCgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfZnNibG9ja190CWZzYm5vLAkJLyogZmlsZSBzeXN0ZW0gYmxvY2sgbnVtYmVyICovCisJdWludAkJbG9jaykJCS8qIGxvY2sgZmxhZ3MgZm9yIGdldF9idWYgKi8KK3sKKwl4ZnNfYnVmX3QJKmJwOwkJLyogYnVmZmVyIHBvaW50ZXIgKHJldHVybiB2YWx1ZSkgKi8KKwl4ZnNfZGFkZHJfdAkJZDsJCS8qIHJlYWwgZGlzayBibG9jayBhZGRyZXNzICovCisKKwlBU1NFUlQoZnNibm8gIT0gTlVMTEZTQkxPQ0spOworCWQgPSBYRlNfRlNCX1RPX0RBRERSKG1wLCBmc2Jubyk7CisJYnAgPSB4ZnNfdHJhbnNfZ2V0X2J1Zih0cCwgbXAtPm1fZGRldl90YXJncCwgZCwgbXAtPm1fYnNpemUsIGxvY2spOworCUFTU0VSVChicCk7CisJQVNTRVJUKCFYRlNfQlVGX0dFVEVSUk9SKGJwKSk7CisJcmV0dXJuIGJwOworfQorCisvKgorICogR2V0IGEgYnVmZmVyIGZvciB0aGUgYmxvY2ssIHJldHVybiBpdCB3aXRoIG5vIGRhdGEgcmVhZC4KKyAqIFNob3J0LWZvcm0gYWRkcmVzc2luZy4KKyAqLworeGZzX2J1Zl90ICoJCQkJLyogYnVmZmVyIGZvciBhZ25vL2FnYm5vICovCit4ZnNfYnRyZWVfZ2V0X2J1ZnMoCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2FnbnVtYmVyX3QJYWdubywJCS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCisJeGZzX2FnYmxvY2tfdAlhZ2JubywJCS8qIGFsbG9jYXRpb24gZ3JvdXAgYmxvY2sgbnVtYmVyICovCisJdWludAkJbG9jaykJCS8qIGxvY2sgZmxhZ3MgZm9yIGdldF9idWYgKi8KK3sKKwl4ZnNfYnVmX3QJKmJwOwkJLyogYnVmZmVyIHBvaW50ZXIgKHJldHVybiB2YWx1ZSkgKi8KKwl4ZnNfZGFkZHJfdAkJZDsJCS8qIHJlYWwgZGlzayBibG9jayBhZGRyZXNzICovCisKKwlBU1NFUlQoYWdubyAhPSBOVUxMQUdOVU1CRVIpOworCUFTU0VSVChhZ2JubyAhPSBOVUxMQUdCTE9DSyk7CisJZCA9IFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIGFnYm5vKTsKKwlicCA9IHhmc190cmFuc19nZXRfYnVmKHRwLCBtcC0+bV9kZGV2X3RhcmdwLCBkLCBtcC0+bV9ic2l6ZSwgbG9jayk7CisJQVNTRVJUKGJwKTsKKwlBU1NFUlQoIVhGU19CVUZfR0VURVJST1IoYnApKTsKKwlyZXR1cm4gYnA7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIG5ldyBidHJlZSBjdXJzb3IuCisgKiBUaGUgY3Vyc29yIGlzIGVpdGhlciBmb3IgYWxsb2NhdGlvbiAoQSkgb3IgYm1hcCAoQikgb3IgaW5vZGVzIChJKS4KKyAqLworeGZzX2J0cmVlX2N1cl90ICoJCQkvKiBuZXcgYnRyZWUgY3Vyc29yICovCit4ZnNfYnRyZWVfaW5pdF9jdXJzb3IoCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2J1Zl90CSphZ2JwLAkJLyogKEEgb25seSkgYnVmZmVyIGZvciBhZ2Ygc3RydWN0dXJlICovCisJCQkJCS8qIChJIG9ubHkpIGJ1ZmZlciBmb3IgYWdpIHN0cnVjdHVyZSAqLworCXhmc19hZ251bWJlcl90CWFnbm8sCQkvKiAoQUkgb25seSkgYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwl4ZnNfYnRudW1fdAlidG51bSwJCS8qIGJ0cmVlIGlkZW50aWZpZXIgKi8KKwl4ZnNfaW5vZGVfdAkqaXAsCQkvKiAoQiBvbmx5KSBpbm9kZSBvd25pbmcgdGhlIGJ0cmVlICovCisJaW50CQl3aGljaGZvcmspCS8qIChCIG9ubHkpIGRhdGEgb3IgYXR0ciBmb3JrICovCit7CisJeGZzX2FnZl90CSphZ2Y7CQkvKiAoQSkgYWxsb2NhdGlvbiBncm91cCBmcmVlc3BhY2UgKi8KKwl4ZnNfYWdpX3QJKmFnaTsJCS8qIChJKSBhbGxvY2F0aW9uIGdyb3VwIGlub2Rlc3BhY2UgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJKmN1cjsJCS8qIHJldHVybiB2YWx1ZSAqLworCXhmc19pZm9ya190CSppZnA7CQkvKiAoSSkgaW5vZGUgZm9yayBwb2ludGVyICovCisJaW50CQlubGV2ZWxzPTA7CS8qIG51bWJlciBvZiBsZXZlbHMgaW4gdGhlIGJ0cmVlICovCisKKwlBU1NFUlQoeGZzX2J0cmVlX2N1cl96b25lICE9IE5VTEwpOworCS8qCisJICogQWxsb2NhdGUgYSBuZXcgY3Vyc29yLgorCSAqLworCWN1ciA9IGttZW1fem9uZV96YWxsb2MoeGZzX2J0cmVlX2N1cl96b25lLCBLTV9TTEVFUCk7CisJLyoKKwkgKiBEZWR1Y2UgdGhlIG51bWJlciBvZiBidHJlZSBsZXZlbHMgZnJvbSB0aGUgYXJndW1lbnRzLgorCSAqLworCXN3aXRjaCAoYnRudW0pIHsKKwljYXNlIFhGU19CVE5VTV9CTk86CisJY2FzZSBYRlNfQlROVU1fQ05UOgorCQlhZ2YgPSBYRlNfQlVGX1RPX0FHRihhZ2JwKTsKKwkJbmxldmVscyA9IElOVF9HRVQoYWdmLT5hZ2ZfbGV2ZWxzW2J0bnVtXSwgQVJDSF9DT05WRVJUKTsKKwkJYnJlYWs7CisJY2FzZSBYRlNfQlROVU1fQk1BUDoKKwkJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwkJbmxldmVscyA9IElOVF9HRVQoaWZwLT5pZl9icm9vdC0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCkgKyAxOworCQlicmVhazsKKwljYXNlIFhGU19CVE5VTV9JTk86CisJCWFnaSA9IFhGU19CVUZfVE9fQUdJKGFnYnApOworCQlubGV2ZWxzID0gSU5UX0dFVChhZ2ktPmFnaV9sZXZlbCwgQVJDSF9DT05WRVJUKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCX0KKwkvKgorCSAqIEZpbGwgaW4gdGhlIGNvbW1vbiBmaWVsZHMuCisJICovCisJY3VyLT5iY190cCA9IHRwOworCWN1ci0+YmNfbXAgPSBtcDsKKwljdXItPmJjX25sZXZlbHMgPSBubGV2ZWxzOworCWN1ci0+YmNfYnRudW0gPSBidG51bTsKKwljdXItPmJjX2Jsb2NrbG9nID0gbXAtPm1fc2Iuc2JfYmxvY2tsb2c7CisJLyoKKwkgKiBGaWxsIGluIHByaXZhdGUgZmllbGRzLgorCSAqLworCXN3aXRjaCAoYnRudW0pIHsKKwljYXNlIFhGU19CVE5VTV9CTk86CisJY2FzZSBYRlNfQlROVU1fQ05UOgorCQkvKgorCQkgKiBBbGxvY2F0aW9uIGJ0cmVlIGZpZWxkcy4KKwkJICovCisJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnYnAgPSBhZ2JwOworCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vID0gYWdubzsKKwkJYnJlYWs7CisJY2FzZSBYRlNfQlROVU1fQk1BUDoKKwkJLyoKKwkJICogQm1hcCBidHJlZSBmaWVsZHMuCisJCSAqLworCQljdXItPmJjX3ByaXZhdGUuYi5mb3Jrc2l6ZSA9IFhGU19JRk9SS19TSVpFKGlwLCB3aGljaGZvcmspOworCQljdXItPmJjX3ByaXZhdGUuYi5pcCA9IGlwOworCQljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0gTlVMTEZTQkxPQ0s7CisJCWN1ci0+YmNfcHJpdmF0ZS5iLmZsaXN0ID0gTlVMTDsKKwkJY3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkID0gMDsKKwkJY3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgPSAwOworCQljdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmsgPSB3aGljaGZvcms7CisJCWJyZWFrOworCWNhc2UgWEZTX0JUTlVNX0lOTzoKKwkJLyoKKwkJICogSW5vZGUgYWxsb2NhdGlvbiBidHJlZSBmaWVsZHMuCisJCSAqLworCQljdXItPmJjX3ByaXZhdGUuaS5hZ2JwID0gYWdicDsKKwkJY3VyLT5iY19wcml2YXRlLmkuYWdubyA9IGFnbm87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwl9CisJcmV0dXJuIGN1cjsKK30KKworLyoKKyAqIENoZWNrIGZvciB0aGUgY3Vyc29yIHJlZmVycmluZyB0byB0aGUgbGFzdCBibG9jayBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCisgKi8KK2ludAkJCQkJLyogMT1pcyBsYXN0IGJsb2NrLCAwPW5vdCBsYXN0IGJsb2NrICovCit4ZnNfYnRyZWVfaXNsYXN0YmxvY2soCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCkJLyogbGV2ZWwgdG8gY2hlY2sgKi8KK3sKKwl4ZnNfYnRyZWVfYmxvY2tfdAkqYmxvY2s7CS8qIGdlbmVyaWMgYnRyZWUgYmxvY2sgcG9pbnRlciAqLworCXhmc19idWZfdAkJKmJwOwkvKiBidWZmZXIgY29udGFpbmluZyBibG9jayAqLworCisJYmxvY2sgPSB4ZnNfYnRyZWVfZ2V0X2Jsb2NrKGN1ciwgbGV2ZWwsICZicCk7CisJeGZzX2J0cmVlX2NoZWNrX2Jsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCk7CisJaWYgKFhGU19CVFJFRV9MT05HX1BUUlMoY3VyLT5iY19idG51bSkpCisJCXJldHVybiBJTlRfR0VUKGJsb2NrLT5iYl91LmwuYmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTERGU0JOTzsKKwllbHNlCisJCXJldHVybiBJTlRfR0VUKGJsb2NrLT5iYl91LnMuYmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTEFHQkxPQ0s7Cit9CisKKy8qCisgKiBDaGFuZ2UgdGhlIGN1cnNvciB0byBwb2ludCB0byB0aGUgbGFzdCByZWNvcmQgaW4gdGhlIGN1cnJlbnQgYmxvY2sKKyAqIGF0IHRoZSBnaXZlbiBsZXZlbC4gIE90aGVyIGxldmVscyBhcmUgdW5hZmZlY3RlZC4KKyAqLworaW50CQkJCQkvKiBzdWNjZXNzPTEsIGZhaWx1cmU9MCAqLworeGZzX2J0cmVlX2xhc3RyZWMoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCkJLyogbGV2ZWwgdG8gY2hhbmdlICovCit7CisJeGZzX2J0cmVlX2Jsb2NrX3QJKmJsb2NrOwkvKiBnZW5lcmljIGJ0cmVlIGJsb2NrIHBvaW50ZXIgKi8KKwl4ZnNfYnVmX3QJCSpicDsJLyogYnVmZmVyIGNvbnRhaW5pbmcgYmxvY2sgKi8KKworCS8qCisJICogR2V0IHRoZSBibG9jayBwb2ludGVyIGZvciB0aGlzIGxldmVsLgorCSAqLworCWJsb2NrID0geGZzX2J0cmVlX2dldF9ibG9jayhjdXIsIGxldmVsLCAmYnApOworCXhmc19idHJlZV9jaGVja19ibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApOworCS8qCisJICogSXQncyBlbXB0eSwgdGhlcmUgaXMgbm8gc3VjaCByZWNvcmQuCisJICovCisJaWYgKCFibG9jay0+YmJfaC5iYl9udW1yZWNzKQorCQlyZXR1cm4gMDsKKwkvKgorCSAqIFNldCB0aGUgcHRyIHZhbHVlIHRvIG51bXJlY3MsIHRoYXQncyB0aGUgbGFzdCByZWNvcmQva2V5LgorCSAqLworCWN1ci0+YmNfcHRyc1tsZXZlbF0gPSBJTlRfR0VUKGJsb2NrLT5iYl9oLmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBDb21wdXRlIGZpcnN0IGFuZCBsYXN0IGJ5dGUgb2Zmc2V0cyBmb3IgdGhlIGZpZWxkcyBnaXZlbi4KKyAqIEludGVycHJldHMgdGhlIG9mZnNldHMgdGFibGUsIHdoaWNoIGNvbnRhaW5zIHN0cnVjdCBmaWVsZCBvZmZzZXRzLgorICovCit2b2lkCit4ZnNfYnRyZWVfb2Zmc2V0cygKKwlfX2ludDY0X3QJZmllbGRzLAkJLyogYml0bWFzayBvZiBmaWVsZHMgKi8KKwljb25zdCBzaG9ydAkqb2Zmc2V0cywJLyogdGFibGUgb2YgZmllbGQgb2Zmc2V0cyAqLworCWludAkJbmJpdHMsCQkvKiBudW1iZXIgb2YgYml0cyB0byBpbnNwZWN0ICovCisJaW50CQkqZmlyc3QsCQkvKiBvdXRwdXQ6IGZpcnN0IGJ5dGUgb2Zmc2V0ICovCisJaW50CQkqbGFzdCkJCS8qIG91dHB1dDogbGFzdCBieXRlIG9mZnNldCAqLworeworCWludAkJaTsJCS8qIGN1cnJlbnQgYml0IG51bWJlciAqLworCV9faW50NjRfdAlpbWFzazsJCS8qIG1hc2sgZm9yIGN1cnJlbnQgYml0IG51bWJlciAqLworCisJQVNTRVJUKGZpZWxkcyAhPSAwKTsKKwkvKgorCSAqIEZpbmQgdGhlIGxvd2VzdCBiaXQsIHNvIHRoZSBmaXJzdCBieXRlIG9mZnNldC4KKwkgKi8KKwlmb3IgKGkgPSAwLCBpbWFzayA9IDFMTDsgOyBpKyssIGltYXNrIDw8PSAxKSB7CisJCWlmIChpbWFzayAmIGZpZWxkcykgeworCQkJKmZpcnN0ID0gb2Zmc2V0c1tpXTsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qCisJICogRmluZCB0aGUgaGlnaGVzdCBiaXQsIHNvIHRoZSBsYXN0IGJ5dGUgb2Zmc2V0LgorCSAqLworCWZvciAoaSA9IG5iaXRzIC0gMSwgaW1hc2sgPSAxTEwgPDwgaTsgOyBpLS0sIGltYXNrID4+PSAxKSB7CisJCWlmIChpbWFzayAmIGZpZWxkcykgeworCQkJKmxhc3QgPSBvZmZzZXRzW2kgKyAxXSAtIDE7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoKKyAqIEdldCBhIGJ1ZmZlciBmb3IgdGhlIGJsb2NrLCByZXR1cm4gaXQgcmVhZCBpbi4KKyAqIExvbmctZm9ybSBhZGRyZXNzaW5nLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYnRyZWVfcmVhZF9idWZsKAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19mc2Jsb2NrX3QJZnNibm8sCQkvKiBmaWxlIHN5c3RlbSBibG9jayBudW1iZXIgKi8KKwl1aW50CQlsb2NrLAkJLyogbG9jayBmbGFncyBmb3IgcmVhZF9idWYgKi8KKwl4ZnNfYnVmX3QJKipicHAsCQkvKiBidWZmZXIgZm9yIGZzYm5vICovCisJaW50CQlyZWZ2YWwpCQkvKiByZWYgY291bnQgdmFsdWUgZm9yIGJ1ZmZlciAqLworeworCXhmc19idWZfdAkqYnA7CQkvKiByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfZGFkZHJfdAkJZDsJCS8qIHJlYWwgZGlzayBibG9jayBhZGRyZXNzICovCisJaW50CQllcnJvcjsKKworCUFTU0VSVChmc2JubyAhPSBOVUxMRlNCTE9DSyk7CisJZCA9IFhGU19GU0JfVE9fREFERFIobXAsIGZzYm5vKTsKKwlpZiAoKGVycm9yID0geGZzX3RyYW5zX3JlYWRfYnVmKG1wLCB0cCwgbXAtPm1fZGRldl90YXJncCwgZCwKKwkJCW1wLT5tX2JzaXplLCBsb2NrLCAmYnApKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCUFTU0VSVCghYnAgfHwgIVhGU19CVUZfR0VURVJST1IoYnApKTsKKwlpZiAoYnAgIT0gTlVMTCkgeworCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfTUFQLCByZWZ2YWwpOworCX0KKwkqYnBwID0gYnA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgYSBidWZmZXIgZm9yIHRoZSBibG9jaywgcmV0dXJuIGl0IHJlYWQgaW4uCisgKiBTaG9ydC1mb3JtIGFkZHJlc3NpbmcuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19idHJlZV9yZWFkX2J1ZnMoCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2FnbnVtYmVyX3QJYWdubywJCS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCisJeGZzX2FnYmxvY2tfdAlhZ2JubywJCS8qIGFsbG9jYXRpb24gZ3JvdXAgYmxvY2sgbnVtYmVyICovCisJdWludAkJbG9jaywJCS8qIGxvY2sgZmxhZ3MgZm9yIHJlYWRfYnVmICovCisJeGZzX2J1Zl90CSoqYnBwLAkJLyogYnVmZmVyIGZvciBhZ25vL2FnYm5vICovCisJaW50CQlyZWZ2YWwpCQkvKiByZWYgY291bnQgdmFsdWUgZm9yIGJ1ZmZlciAqLworeworCXhmc19idWZfdAkqYnA7CQkvKiByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfZGFkZHJfdAlkOwkJLyogcmVhbCBkaXNrIGJsb2NrIGFkZHJlc3MgKi8KKwlpbnQJCWVycm9yOworCisJQVNTRVJUKGFnbm8gIT0gTlVMTEFHTlVNQkVSKTsKKwlBU1NFUlQoYWdibm8gIT0gTlVMTEFHQkxPQ0spOworCWQgPSBYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLCBhZ2Jubyk7CisJaWYgKChlcnJvciA9IHhmc190cmFuc19yZWFkX2J1ZihtcCwgdHAsIG1wLT5tX2RkZXZfdGFyZ3AsIGQsCisJCQkJCW1wLT5tX2JzaXplLCBsb2NrLCAmYnApKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCUFTU0VSVCghYnAgfHwgIVhGU19CVUZfR0VURVJST1IoYnApKTsKKwlpZiAoYnAgIT0gTlVMTCkgeworCQlzd2l0Y2ggKHJlZnZhbCkgeworCQljYXNlIFhGU19BTExPQ19CVFJFRV9SRUY6CisJCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfTUFQLCByZWZ2YWwpOworCQkJYnJlYWs7CisJCWNhc2UgWEZTX0lOT19CVFJFRV9SRUY6CisJCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfSU5PTUFQLCByZWZ2YWwpOworCQkJYnJlYWs7CisJCX0KKwl9CisJKmJwcCA9IGJwOworCXJldHVybiAwOworfQorCisvKgorICogUmVhZC1haGVhZCB0aGUgYmxvY2ssIGRvbid0IHdhaXQgZm9yIGl0LCBkb24ndCByZXR1cm4gYSBidWZmZXIuCisgKiBMb25nLWZvcm0gYWRkcmVzc2luZy4KKyAqLworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK3hmc19idHJlZV9yZWFkYV9idWZsKAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX2ZzYmxvY2tfdAlmc2JubywJCS8qIGZpbGUgc3lzdGVtIGJsb2NrIG51bWJlciAqLworCXhmc19leHRsZW5fdAljb3VudCkJCS8qIGNvdW50IG9mIGZpbGVzeXN0ZW0gYmxvY2tzICovCit7CisJeGZzX2RhZGRyX3QJCWQ7CisKKwlBU1NFUlQoZnNibm8gIT0gTlVMTEZTQkxPQ0spOworCWQgPSBYRlNfRlNCX1RPX0RBRERSKG1wLCBmc2Jubyk7CisJeGZzX2JhcmVhZChtcC0+bV9kZGV2X3RhcmdwLCBkLCBtcC0+bV9ic2l6ZSAqIGNvdW50KTsKK30KKworLyoKKyAqIFJlYWQtYWhlYWQgdGhlIGJsb2NrLCBkb24ndCB3YWl0IGZvciBpdCwgZG9uJ3QgcmV0dXJuIGEgYnVmZmVyLgorICogU2hvcnQtZm9ybSBhZGRyZXNzaW5nLgorICovCisvKiBBUkdTVVNFRCAqLwordm9pZAoreGZzX2J0cmVlX3JlYWRhX2J1ZnMoCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfYWdudW1iZXJfdAlhZ25vLAkJLyogYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwl4ZnNfYWdibG9ja190CWFnYm5vLAkJLyogYWxsb2NhdGlvbiBncm91cCBibG9jayBudW1iZXIgKi8KKwl4ZnNfZXh0bGVuX3QJY291bnQpCQkvKiBjb3VudCBvZiBmaWxlc3lzdGVtIGJsb2NrcyAqLworeworCXhmc19kYWRkcl90CQlkOworCisJQVNTRVJUKGFnbm8gIT0gTlVMTEFHTlVNQkVSKTsKKwlBU1NFUlQoYWdibm8gIT0gTlVMTEFHQkxPQ0spOworCWQgPSBYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLCBhZ2Jubyk7CisJeGZzX2JhcmVhZChtcC0+bV9kZGV2X3RhcmdwLCBkLCBtcC0+bV9ic2l6ZSAqIGNvdW50KTsKK30KKworLyoKKyAqIFJlYWQtYWhlYWQgYnRyZWUgYmxvY2tzLCBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCisgKiBCaXRzIGluIGxyIGFyZSBzZXQgZnJvbSBYRlNfQlRDVVJfe0xFRlQsUklHSFR9UkEuCisgKi8KK2ludAoreGZzX2J0cmVlX3JlYWRhaGVhZF9jb3JlKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldiwJCS8qIGxldmVsIGluIGJ0cmVlICovCisJaW50CQkJbHIpCQkvKiBsZWZ0L3JpZ2h0IGJpdHMgKi8KK3sKKwl4ZnNfYWxsb2NfYmxvY2tfdAkqYTsKKwl4ZnNfYm1idF9ibG9ja190CSpiOworCXhmc19pbm9idF9ibG9ja190CSppOworCWludAkJCXJ2YWwgPSAwOworCisJQVNTRVJUKGN1ci0+YmNfYnVmc1tsZXZdICE9IE5VTEwpOworCWN1ci0+YmNfcmFbbGV2XSB8PSBscjsKKwlzd2l0Y2ggKGN1ci0+YmNfYnRudW0pIHsKKwljYXNlIFhGU19CVE5VTV9CTk86CisJY2FzZSBYRlNfQlROVU1fQ05UOgorCQlhID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhjdXItPmJjX2J1ZnNbbGV2XSk7CisJCWlmICgobHIgJiBYRlNfQlRDVVJfTEVGVFJBKSAmJiBJTlRfR0VUKGEtPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTEFHQkxPQ0spIHsKKwkJCXhmc19idHJlZV9yZWFkYV9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sCisJCQkJSU5UX0dFVChhLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpLCAxKTsKKwkJCXJ2YWwrKzsKKwkJfQorCQlpZiAoKGxyICYgWEZTX0JUQ1VSX1JJR0hUUkEpICYmIElOVF9HRVQoYS0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTEFHQkxPQ0spIHsKKwkJCXhmc19idHJlZV9yZWFkYV9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sCisJCQkJSU5UX0dFVChhLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSwgMSk7CisJCQlydmFsKys7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBYRlNfQlROVU1fQk1BUDoKKwkJYiA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhjdXItPmJjX2J1ZnNbbGV2XSk7CisJCWlmICgobHIgJiBYRlNfQlRDVVJfTEVGVFJBKSAmJiBJTlRfR0VUKGItPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTERGU0JOTykgeworCQkJeGZzX2J0cmVlX3JlYWRhX2J1ZmwoY3VyLT5iY19tcCwgSU5UX0dFVChiLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpLCAxKTsKKwkJCXJ2YWwrKzsKKwkJfQorCQlpZiAoKGxyICYgWEZTX0JUQ1VSX1JJR0hUUkEpICYmIElOVF9HRVQoYi0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTERGU0JOTykgeworCQkJeGZzX2J0cmVlX3JlYWRhX2J1ZmwoY3VyLT5iY19tcCwgSU5UX0dFVChiLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSwgMSk7CisJCQlydmFsKys7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBYRlNfQlROVU1fSU5POgorCQlpID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhjdXItPmJjX2J1ZnNbbGV2XSk7CisJCWlmICgobHIgJiBYRlNfQlRDVVJfTEVGVFJBKSAmJiBJTlRfR0VUKGktPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTEFHQkxPQ0spIHsKKwkJCXhmc19idHJlZV9yZWFkYV9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfcHJpdmF0ZS5pLmFnbm8sCisJCQkJSU5UX0dFVChpLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpLCAxKTsKKwkJCXJ2YWwrKzsKKwkJfQorCQlpZiAoKGxyICYgWEZTX0JUQ1VSX1JJR0hUUkEpICYmIElOVF9HRVQoaS0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTEFHQkxPQ0spIHsKKwkJCXhmc19idHJlZV9yZWFkYV9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfcHJpdmF0ZS5pLmFnbm8sCisJCQkJSU5UX0dFVChpLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSwgMSk7CisJCQlydmFsKys7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCX0KKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIFNldCB0aGUgYnVmZmVyIGZvciBsZXZlbCAibGV2IiBpbiB0aGUgY3Vyc29yIHRvIGJwLCByZWxlYXNpbmcKKyAqIGFueSBwcmV2aW91cyBidWZmZXIuCisgKi8KK3ZvaWQKK3hmc19idHJlZV9zZXRidWYoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXYsCS8qIGxldmVsIGluIGJ0cmVlICovCisJeGZzX2J1Zl90CQkqYnApCS8qIG5ldyBidWZmZXIgdG8gc2V0ICovCit7CisJeGZzX2J0cmVlX2Jsb2NrX3QJKmI7CS8qIGJ0cmVlIGJsb2NrICovCisJeGZzX2J1Zl90CQkqb2JwOwkvKiBvbGQgYnVmZmVyIHBvaW50ZXIgKi8KKworCW9icCA9IGN1ci0+YmNfYnVmc1tsZXZdOworCWlmIChvYnApCisJCXhmc190cmFuc19icmVsc2UoY3VyLT5iY190cCwgb2JwKTsKKwljdXItPmJjX2J1ZnNbbGV2XSA9IGJwOworCWN1ci0+YmNfcmFbbGV2XSA9IDA7CisJaWYgKCFicCkKKwkJcmV0dXJuOworCWIgPSBYRlNfQlVGX1RPX0JMT0NLKGJwKTsKKwlpZiAoWEZTX0JUUkVFX0xPTkdfUFRSUyhjdXItPmJjX2J0bnVtKSkgeworCQlpZiAoSU5UX0dFVChiLT5iYl91LmwuYmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREZTQk5PKQorCQkJY3VyLT5iY19yYVtsZXZdIHw9IFhGU19CVENVUl9MRUZUUkE7CisJCWlmIChJTlRfR0VUKGItPmJiX3UubC5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREZTQk5PKQorCQkJY3VyLT5iY19yYVtsZXZdIHw9IFhGU19CVENVUl9SSUdIVFJBOworCX0gZWxzZSB7CisJCWlmIChJTlRfR0VUKGItPmJiX3Uucy5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExBR0JMT0NLKQorCQkJY3VyLT5iY19yYVtsZXZdIHw9IFhGU19CVENVUl9MRUZUUkE7CisJCWlmIChJTlRfR0VUKGItPmJiX3Uucy5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMQUdCTE9DSykKKwkJCWN1ci0+YmNfcmFbbGV2XSB8PSBYRlNfQlRDVVJfUklHSFRSQTsKKwl9Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2J0cmVlLmggYi9mcy94ZnMveGZzX2J0cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4NzJiYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfYnRyZWUuaApAQCAtMCwwICsxLDU5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfQlRSRUVfSF9fCisjZGVmaW5lCV9fWEZTX0JUUkVFX0hfXworCitzdHJ1Y3QgeGZzX2J1ZjsKK3N0cnVjdCB4ZnNfYm1hcF9mcmVlOworc3RydWN0IHhmc19pbm9kZTsKK3N0cnVjdCB4ZnNfbW91bnQ7CitzdHJ1Y3QgeGZzX3RyYW5zOworCisvKgorICogVGhpcyBub25zZW5zZSBpcyB0byBtYWtlIC13bGludCBoYXBweS4KKyAqLworI2RlZmluZQlYRlNfTE9PS1VQX0VRCSgoeGZzX2xvb2t1cF90KVhGU19MT09LVVBfRVFpKQorI2RlZmluZQlYRlNfTE9PS1VQX0xFCSgoeGZzX2xvb2t1cF90KVhGU19MT09LVVBfTEVpKQorI2RlZmluZQlYRlNfTE9PS1VQX0dFCSgoeGZzX2xvb2t1cF90KVhGU19MT09LVVBfR0VpKQorCisjZGVmaW5lCVhGU19CVE5VTV9CTk8JKCh4ZnNfYnRudW1fdClYRlNfQlROVU1fQk5PaSkKKyNkZWZpbmUJWEZTX0JUTlVNX0NOVAkoKHhmc19idG51bV90KVhGU19CVE5VTV9DTlRpKQorI2RlZmluZQlYRlNfQlROVU1fQk1BUAkoKHhmc19idG51bV90KVhGU19CVE5VTV9CTUFQaSkKKyNkZWZpbmUJWEZTX0JUTlVNX0lOTwkoKHhmc19idG51bV90KVhGU19CVE5VTV9JTk9pKQorCisvKgorICogU2hvcnQgZm9ybSBoZWFkZXI6IHNwYWNlIGFsbG9jYXRpb24gYnRyZWVzLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfYnRyZWVfc2Jsb2NrCit7CisJX191aW50MzJfdAliYl9tYWdpYzsJLyogbWFnaWMgbnVtYmVyIGZvciBibG9jayB0eXBlICovCisJX191aW50MTZfdAliYl9sZXZlbDsJLyogMCBpcyBhIGxlYWYgKi8KKwlfX3VpbnQxNl90CWJiX251bXJlY3M7CS8qIGN1cnJlbnQgIyBvZiBkYXRhIHJlY29yZHMgKi8KKwl4ZnNfYWdibG9ja190CWJiX2xlZnRzaWI7CS8qIGxlZnQgc2libGluZyBibG9jayBvciBOVUxMQUdCTE9DSyAqLworCXhmc19hZ2Jsb2NrX3QJYmJfcmlnaHRzaWI7CS8qIHJpZ2h0IHNpYmxpbmcgYmxvY2sgb3IgTlVMTEFHQkxPQ0sgKi8KK30geGZzX2J0cmVlX3NibG9ja190OworCisvKgorICogTG9uZyBmb3JtIGhlYWRlcjogYm1hcCBidHJlZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19idHJlZV9sYmxvY2sKK3sKKwlfX3VpbnQzMl90CWJiX21hZ2ljOwkvKiBtYWdpYyBudW1iZXIgZm9yIGJsb2NrIHR5cGUgKi8KKwlfX3VpbnQxNl90CWJiX2xldmVsOwkvKiAwIGlzIGEgbGVhZiAqLworCV9fdWludDE2X3QJYmJfbnVtcmVjczsJLyogY3VycmVudCAjIG9mIGRhdGEgcmVjb3JkcyAqLworCXhmc19kZnNibm9fdAliYl9sZWZ0c2liOwkvKiBsZWZ0IHNpYmxpbmcgYmxvY2sgb3IgTlVMTERGU0JOTyAqLworCXhmc19kZnNibm9fdAliYl9yaWdodHNpYjsJLyogcmlnaHQgc2libGluZyBibG9jayBvciBOVUxMREZTQk5PICovCit9IHhmc19idHJlZV9sYmxvY2tfdDsKKworLyoKKyAqIENvbWJpbmVkIGhlYWRlciBhbmQgc3RydWN0dXJlLCB1c2VkIGJ5IGNvbW1vbiBjb2RlLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfYnRyZWVfaGRyCit7CisJX191aW50MzJfdAliYl9tYWdpYzsJLyogbWFnaWMgbnVtYmVyIGZvciBibG9jayB0eXBlICovCisJX191aW50MTZfdAliYl9sZXZlbDsJLyogMCBpcyBhIGxlYWYgKi8KKwlfX3VpbnQxNl90CWJiX251bXJlY3M7CS8qIGN1cnJlbnQgIyBvZiBkYXRhIHJlY29yZHMgKi8KK30geGZzX2J0cmVlX2hkcl90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sKK3sKKwl4ZnNfYnRyZWVfaGRyX3QJYmJfaDsJCS8qIGhlYWRlciAqLworCXVuaW9uCQl7CisJCXN0cnVjdAl7CisJCQl4ZnNfYWdibG9ja190CWJiX2xlZnRzaWI7CisJCQl4ZnNfYWdibG9ja190CWJiX3JpZ2h0c2liOworCQl9CXM7CQkvKiBzaG9ydCBmb3JtIHBvaW50ZXJzICovCisJCXN0cnVjdAl7CisJCQl4ZnNfZGZzYm5vX3QJYmJfbGVmdHNpYjsKKwkJCXhmc19kZnNibm9fdAliYl9yaWdodHNpYjsKKwkJfQlsOwkJLyogbG9uZyBmb3JtIHBvaW50ZXJzICovCisJfQkJYmJfdTsJCS8qIHJlc3QgKi8KK30geGZzX2J0cmVlX2Jsb2NrX3Q7CisKKy8qCisgKiBGb3IgbG9nZ2luZyByZWNvcmQgZmllbGRzLgorICovCisjZGVmaW5lCVhGU19CQl9NQUdJQwkJMHgwMQorI2RlZmluZQlYRlNfQkJfTEVWRUwJCTB4MDIKKyNkZWZpbmUJWEZTX0JCX05VTVJFQ1MJCTB4MDQKKyNkZWZpbmUJWEZTX0JCX0xFRlRTSUIJCTB4MDgKKyNkZWZpbmUJWEZTX0JCX1JJR0hUU0lCCQkweDEwCisjZGVmaW5lCVhGU19CQl9OVU1fQklUUwkJNQorI2RlZmluZQlYRlNfQkJfQUxMX0JJVFMJCSgoMSA8PCBYRlNfQkJfTlVNX0JJVFMpIC0gMSkKKworLyoKKyAqIEJvb2xlYW4gdG8gc2VsZWN0IHdoaWNoIGZvcm0gb2YgeGZzX2J0cmVlX2Jsb2NrX3QuYmJfdSB0byB1c2UuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JUUkVFX0xPTkdfUFRSUykKK2ludCB4ZnNfYnRyZWVfbG9uZ19wdHJzKHhmc19idG51bV90IGJ0bnVtKTsKKyNkZWZpbmUJWEZTX0JUUkVFX0xPTkdfUFRSUyhidG51bSkJKChidG51bSkgPT0gWEZTX0JUTlVNX0JNQVApCisjZWxzZQorI2RlZmluZQlYRlNfQlRSRUVfTE9OR19QVFJTKGJ0bnVtKQkoKGJ0bnVtKSA9PSBYRlNfQlROVU1fQk1BUCkKKyNlbmRpZgorCisvKgorICogTWFnaWMgbnVtYmVycyBmb3IgYnRyZWUgYmxvY2tzLgorICovCitleHRlcm4gY29uc3QgX191aW50MzJfdAl4ZnNfbWFnaWNzW107CisKKy8qCisgKiBNYXhpbXVtIGFuZCBtaW5pbXVtIHJlY29yZHMgaW4gYSBidHJlZSBibG9jay4KKyAqIEdpdmVuIGJsb2NrIHNpemUsIHR5cGUgcHJlZml4LCBhbmQgbGVhZiBmbGFnICgwIG9yIDEpLgorICogVGhlIGRpdmlzb3IgYmVsb3cgaXMgZXF1aXZhbGVudCB0byBsZiA/IChlMSkgOiAoZTIpIGJ1dCB0aGF0IHByb2R1Y2VzCisgKiBjb21waWxlciB3YXJuaW5ncy4KKyAqLworI2RlZmluZQlYRlNfQlRSRUVfQkxPQ0tfTUFYUkVDUyhic3osdCxsZikJXAorCSgoaW50KSgoKGJzeikgLSAodWludClzaXplb2YodCAjIyBfYmxvY2tfdCkpIC8gXAorCSAoKChsZikgKiAodWludClzaXplb2YodCAjIyBfcmVjX3QpKSArIFwKKwkgICgoMSAtIChsZikpICogXAorCSAgICgodWludClzaXplb2YodCAjIyBfa2V5X3QpICsgKHVpbnQpc2l6ZW9mKHQgIyMgX3B0cl90KSkpKSkpCisjZGVmaW5lCVhGU19CVFJFRV9CTE9DS19NSU5SRUNTKGJzeix0LGxmKQlcCisJKFhGU19CVFJFRV9CTE9DS19NQVhSRUNTKGJzeix0LGxmKSAvIDIpCisKKy8qCisgKiBSZWNvcmQsIGtleSwgYW5kIHBvaW50ZXIgYWRkcmVzcyBjYWxjdWxhdGlvbiBtYWNyb3MuCisgKiBHaXZlbiBibG9jayBzaXplLCB0eXBlIHByZWZpeCwgYmxvY2sgcG9pbnRlciwgYW5kIGluZGV4IG9mIHJlcXVlc3RlZCBlbnRyeQorICogKGZpcnN0IGVudHJ5IG51bWJlcmVkIDEpLgorICovCisjZGVmaW5lCVhGU19CVFJFRV9SRUNfQUREUihic3osdCxiYixpLG14cikJXAorCSgodCAjIyBfcmVjX3QgKikoKGNoYXIgKikoYmIpICsgc2l6ZW9mKHQgIyMgX2Jsb2NrX3QpICsgXAorCSAoKGkpIC0gMSkgKiBzaXplb2YodCAjIyBfcmVjX3QpKSkKKyNkZWZpbmUJWEZTX0JUUkVFX0tFWV9BRERSKGJzeix0LGJiLGksbXhyKQlcCisJKCh0ICMjIF9rZXlfdCAqKSgoY2hhciAqKShiYikgKyBzaXplb2YodCAjIyBfYmxvY2tfdCkgKyBcCisJICgoaSkgLSAxKSAqIHNpemVvZih0ICMjIF9rZXlfdCkpKQorI2RlZmluZQlYRlNfQlRSRUVfUFRSX0FERFIoYnN6LHQsYmIsaSxteHIpCVwKKwkoKHQgIyMgX3B0cl90ICopKChjaGFyICopKGJiKSArIHNpemVvZih0ICMjIF9ibG9ja190KSArIFwKKwkgKG14cikgKiBzaXplb2YodCAjIyBfa2V5X3QpICsgKChpKSAtIDEpICogc2l6ZW9mKHQgIyMgX3B0cl90KSkpCisKKyNkZWZpbmUJWEZTX0JUUkVFX01BWExFVkVMUwk4CS8qIG1heCBvZiBhbGwgYnRyZWVzICovCisKKy8qCisgKiBCdHJlZSBjdXJzb3Igc3RydWN0dXJlLgorICogVGhpcyBjb2xsZWN0cyBhbGwgaW5mb3JtYXRpb24gbmVlZGVkIGJ5IHRoZSBidHJlZSBjb2RlIGluIG9uZSBwbGFjZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2J0cmVlX2N1cgoreworCXN0cnVjdCB4ZnNfdHJhbnMJKmJjX3RwOwkvKiB0cmFuc2FjdGlvbiB3ZSdyZSBpbiwgaWYgYW55ICovCisJc3RydWN0IHhmc19tb3VudAkqYmNfbXA7CS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdCAqLworCXVuaW9uIHsKKwkJeGZzX2FsbG9jX3JlY190CQlhOworCQl4ZnNfYm1idF9pcmVjX3QJCWI7CisJCXhmc19pbm9idF9yZWNfdAkJaTsKKwl9CQliY19yZWM7CQkvKiBjdXJyZW50IGluc2VydC9zZWFyY2ggcmVjb3JkIHZhbHVlICovCisJc3RydWN0IHhmc19idWYJKmJjX2J1ZnNbWEZTX0JUUkVFX01BWExFVkVMU107CS8qIGJ1ZiBwdHIgcGVyIGxldmVsICovCisJaW50CQliY19wdHJzW1hGU19CVFJFRV9NQVhMRVZFTFNdOwkvKiBrZXkvcmVjb3JkICMgKi8KKwlfX3VpbnQ4X3QJYmNfcmFbWEZTX0JUUkVFX01BWExFVkVMU107CS8qIHJlYWRhaGVhZCBiaXRzICovCisjZGVmaW5lCVhGU19CVENVUl9MRUZUUkEJMQkvKiBsZWZ0IHNpYmxpbmcgaGFzIGJlZW4gcmVhZC1haGVhZCAqLworI2RlZmluZQlYRlNfQlRDVVJfUklHSFRSQQkyCS8qIHJpZ2h0IHNpYmxpbmcgaGFzIGJlZW4gcmVhZC1haGVhZCAqLworCV9fdWludDhfdAliY19ubGV2ZWxzOwkvKiBudW1iZXIgb2YgbGV2ZWxzIGluIHRoZSB0cmVlICovCisJX191aW50OF90CWJjX2Jsb2NrbG9nOwkvKiBsb2cyKGJsb2Nrc2l6ZSkgb2YgYnRyZWUgYmxvY2tzICovCisJeGZzX2J0bnVtX3QJYmNfYnRudW07CS8qIGlkZW50aWZpZXMgd2hpY2ggYnRyZWUgdHlwZSAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsJCQkvKiBuZWVkZWQgZm9yIEJOTywgQ05UICovCisJCQlzdHJ1Y3QgeGZzX2J1ZgkqYWdicDsJLyogYWdmIGJ1ZmZlciBwb2ludGVyICovCisJCQl4ZnNfYWdudW1iZXJfdAlhZ25vOwkvKiBhZyBudW1iZXIgKi8KKwkJfSBhOworCQlzdHJ1Y3QgewkJCS8qIG5lZWRlZCBmb3IgQk1BUCAqLworCQkJc3RydWN0IHhmc19pbm9kZSAqaXA7CS8qIHBvaW50ZXIgdG8gb3VyIGlub2RlICovCisJCQlzdHJ1Y3QgeGZzX2JtYXBfZnJlZSAqZmxpc3Q7CS8qIGxpc3QgdG8gZnJlZSBhZnRlciAqLworCQkJeGZzX2ZzYmxvY2tfdAlmaXJzdGJsb2NrOwkvKiAxc3QgYmxrIGFsbG9jYXRlZCAqLworCQkJaW50CQlhbGxvY2F0ZWQ7CS8qIGNvdW50IG9mIGFsbG9jZWQgKi8KKwkJCXNob3J0CQlmb3Jrc2l6ZTsJLyogZm9yaydzIGlub2RlIHNwYWNlICovCisJCQljaGFyCQl3aGljaGZvcms7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisJCQljaGFyCQlmbGFnczsJCS8qIGZsYWdzICovCisjZGVmaW5lCVhGU19CVENVUl9CUFJWX1dBU0RFTAkxCQkJLyogd2FzIGRlbGF5ZWQgKi8KKwkJfSBiOworCQlzdHJ1Y3QgewkJCS8qIG5lZWRlZCBmb3IgSU5PICovCisJCQlzdHJ1Y3QgeGZzX2J1ZgkqYWdicDsJLyogYWdpIGJ1ZmZlciBwb2ludGVyICovCisJCQl4ZnNfYWdudW1iZXJfdAlhZ25vOwkvKiBhZyBudW1iZXIgKi8KKwkJfSBpOworCX0JCWJjX3ByaXZhdGU7CS8qIHBlci1idHJlZSB0eXBlIGRhdGEgKi8KK30geGZzX2J0cmVlX2N1cl90OworCisjZGVmaW5lCVhGU19CVFJFRV9OT0VSUk9SCTAKKyNkZWZpbmUJWEZTX0JUUkVFX0VSUk9SCQkxCisKKy8qCisgKiBDb252ZXJ0IGZyb20gYnVmZmVyIHRvIGJ0cmVlIGJsb2NrIGhlYWRlci4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQlVGX1RPX0JMT0NLKQoreGZzX2J0cmVlX2Jsb2NrX3QgKnhmc19idWZfdG9fYmxvY2soc3RydWN0IHhmc19idWYgKmJwKTsKKyNkZWZpbmUJWEZTX0JVRl9UT19CTE9DSyhicCkJeGZzX2J1Zl90b19ibG9jayhicCkKKyNlbHNlCisjZGVmaW5lCVhGU19CVUZfVE9fQkxPQ0soYnApCSgoeGZzX2J0cmVlX2Jsb2NrX3QgKikoWEZTX0JVRl9QVFIoYnApKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQlVGX1RPX0xCTE9DSykKK3hmc19idHJlZV9sYmxvY2tfdCAqeGZzX2J1Zl90b19sYmxvY2soc3RydWN0IHhmc19idWYgKmJwKTsKKyNkZWZpbmUJWEZTX0JVRl9UT19MQkxPQ0soYnApCXhmc19idWZfdG9fbGJsb2NrKGJwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0JVRl9UT19MQkxPQ0soYnApCSgoeGZzX2J0cmVlX2xibG9ja190ICopKFhGU19CVUZfUFRSKGJwKSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JVRl9UT19TQkxPQ0spCit4ZnNfYnRyZWVfc2Jsb2NrX3QgKnhmc19idWZfdG9fc2Jsb2NrKHN0cnVjdCB4ZnNfYnVmICpicCk7CisjZGVmaW5lCVhGU19CVUZfVE9fU0JMT0NLKGJwKQl4ZnNfYnVmX3RvX3NibG9jayhicCkKKyNlbHNlCisjZGVmaW5lCVhGU19CVUZfVE9fU0JMT0NLKGJwKQkoKHhmc19idHJlZV9zYmxvY2tfdCAqKShYRlNfQlVGX1BUUihicCkpKQorI2VuZGlmCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpZmRlZiBERUJVRworLyoKKyAqIERlYnVnIHJvdXRpbmU6IGNoZWNrIHRoYXQgYmxvY2sgaGVhZGVyIGlzIG9rLgorICovCit2b2lkCit4ZnNfYnRyZWVfY2hlY2tfYmxvY2soCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYnRyZWVfYmxvY2tfdAkqYmxvY2ssCS8qIGdlbmVyaWMgYnRyZWUgYmxvY2sgcG9pbnRlciAqLworCWludAkJCWxldmVsLAkvKiBsZXZlbCBvZiB0aGUgYnRyZWUgYmxvY2sgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwKTsJLyogYnVmZmVyIGNvbnRhaW5pbmcgYmxvY2ssIGlmIGFueSAqLworCisvKgorICogRGVidWcgcm91dGluZTogY2hlY2sgdGhhdCBrZXlzIGFyZSBpbiB0aGUgcmlnaHQgb3JkZXIuCisgKi8KK3ZvaWQKK3hmc19idHJlZV9jaGVja19rZXkoCisJeGZzX2J0bnVtX3QJCWJ0bnVtLAkvKiBidHJlZSBpZGVudGlmaWVyICovCisJdm9pZAkJCSphazEsCS8qIHBvaW50ZXIgdG8gbGVmdCAobG93ZXIpIGtleSAqLworCXZvaWQJCQkqYWsyKTsJLyogcG9pbnRlciB0byByaWdodCAoaGlnaGVyKSBrZXkgKi8KKworLyoKKyAqIERlYnVnIHJvdXRpbmU6IGNoZWNrIHRoYXQgcmVjb3JkcyBhcmUgaW4gdGhlIHJpZ2h0IG9yZGVyLgorICovCit2b2lkCit4ZnNfYnRyZWVfY2hlY2tfcmVjKAorCXhmc19idG51bV90CQlidG51bSwJLyogYnRyZWUgaWRlbnRpZmllciAqLworCXZvaWQJCQkqYXIxLAkvKiBwb2ludGVyIHRvIGxlZnQgKGxvd2VyKSByZWNvcmQgKi8KKwl2b2lkCQkJKmFyMik7CS8qIHBvaW50ZXIgdG8gcmlnaHQgKGhpZ2hlcikgcmVjb3JkICovCisjZWxzZQorI2RlZmluZQl4ZnNfYnRyZWVfY2hlY2tfYmxvY2soYSxiLGMsZCkKKyNkZWZpbmUJeGZzX2J0cmVlX2NoZWNrX2tleShhLGIsYykKKyNkZWZpbmUJeGZzX2J0cmVlX2NoZWNrX3JlYyhhLGIsYykKKyNlbmRpZgkvKiBERUJVRyAqLworCisvKgorICogQ2hlY2tpbmcgcm91dGluZTogY2hlY2sgdGhhdCBsb25nIGZvcm0gYmxvY2sgaGVhZGVyIGlzIG9rLgorICovCitpbnQJCQkJCS8qIGVycm9yICgwIG9yIEVGU0NPUlJVUFRFRCkgKi8KK3hmc19idHJlZV9jaGVja19sYmxvY2soCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYnRyZWVfbGJsb2NrX3QJKmJsb2NrLAkvKiBidHJlZSBsb25nIGZvcm0gYmxvY2sgcG9pbnRlciAqLworCWludAkJCWxldmVsLAkvKiBsZXZlbCBvZiB0aGUgYnRyZWUgYmxvY2sgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwKTsJLyogYnVmZmVyIGNvbnRhaW5pbmcgYmxvY2ssIGlmIGFueSAqLworCisvKgorICogQ2hlY2tpbmcgcm91dGluZTogY2hlY2sgdGhhdCAobG9uZykgcG9pbnRlciBpcyBvay4KKyAqLworaW50CQkJCQkvKiBlcnJvciAoMCBvciBFRlNDT1JSVVBURUQpICovCit4ZnNfYnRyZWVfY2hlY2tfbHB0cigKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19kZnNibm9fdAkJcHRyLAkvKiBidHJlZSBibG9jayBkaXNrIGFkZHJlc3MgKi8KKwlpbnQJCQlsZXZlbCk7CS8qIGJ0cmVlIGJsb2NrIGxldmVsICovCisKKy8qCisgKiBDaGVja2luZyByb3V0aW5lOiBjaGVjayB0aGF0IHNob3J0IGZvcm0gYmxvY2sgaGVhZGVyIGlzIG9rLgorICovCitpbnQJCQkJCS8qIGVycm9yICgwIG9yIEVGU0NPUlJVUFRFRCkgKi8KK3hmc19idHJlZV9jaGVja19zYmxvY2soCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYnRyZWVfc2Jsb2NrX3QJKmJsb2NrLAkvKiBidHJlZSBzaG9ydCBmb3JtIGJsb2NrIHBvaW50ZXIgKi8KKwlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgb2YgdGhlIGJ0cmVlIGJsb2NrICovCisJc3RydWN0IHhmc19idWYJCSpicCk7CS8qIGJ1ZmZlciBjb250YWluaW5nIGJsb2NrICovCisKKy8qCisgKiBDaGVja2luZyByb3V0aW5lOiBjaGVjayB0aGF0IChzaG9ydCkgcG9pbnRlciBpcyBvay4KKyAqLworaW50CQkJCQkvKiBlcnJvciAoMCBvciBFRlNDT1JSVVBURUQpICovCit4ZnNfYnRyZWVfY2hlY2tfc3B0cigKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19hZ2Jsb2NrX3QJCXB0ciwJLyogYnRyZWUgYmxvY2sgZGlzayBhZGRyZXNzICovCisJaW50CQkJbGV2ZWwpOwkvKiBidHJlZSBibG9jayBsZXZlbCAqLworCisvKgorICogRGVsZXRlIHRoZSBidHJlZSBjdXJzb3IuCisgKi8KK3ZvaWQKK3hmc19idHJlZV9kZWxfY3Vyc29yKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJZXJyb3IpOwkvKiBkZWwgYmVjYXVzZSBvZiBlcnJvciAqLworCisvKgorICogRHVwbGljYXRlIHRoZSBidHJlZSBjdXJzb3IuCisgKiBBbGxvY2F0ZSBhIG5ldyBvbmUsIGNvcHkgdGhlIHJlY29yZCwgcmUtZ2V0IHRoZSBidWZmZXJzLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYnRyZWVfZHVwX2N1cnNvcigKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGlucHV0IGN1cnNvciAqLworCXhmc19idHJlZV9jdXJfdAkJKipuY3VyKTsvKiBvdXRwdXQgY3Vyc29yICovCisKKy8qCisgKiBDaGFuZ2UgdGhlIGN1cnNvciB0byBwb2ludCB0byB0aGUgZmlyc3QgcmVjb3JkIGluIHRoZSBjdXJyZW50IGJsb2NrCisgKiBhdCB0aGUgZ2l2ZW4gbGV2ZWwuICBPdGhlciBsZXZlbHMgYXJlIHVuYWZmZWN0ZWQuCisgKi8KK2ludAkJCQkJLyogc3VjY2Vzcz0xLCBmYWlsdXJlPTAgKi8KK3hmc19idHJlZV9maXJzdHJlYygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldmVsKTsJLyogbGV2ZWwgdG8gY2hhbmdlICovCisKKy8qCisgKiBSZXRyaWV2ZSB0aGUgYmxvY2sgcG9pbnRlciBmcm9tIHRoZSBjdXJzb3IgYXQgdGhlIGdpdmVuIGxldmVsLgorICogVGhpcyBtYXkgYmUgYSBibWFwIGJ0cmVlIHJvb3Qgb3IgZnJvbSBhIGJ1ZmZlci4KKyAqLworeGZzX2J0cmVlX2Jsb2NrX3QgKgkJCS8qIGdlbmVyaWMgYnRyZWUgYmxvY2sgcG9pbnRlciAqLworeGZzX2J0cmVlX2dldF9ibG9jaygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldmVsLAkvKiBsZXZlbCBpbiBidHJlZSAqLworCXN0cnVjdCB4ZnNfYnVmCQkqKmJwcCk7CS8qIGJ1ZmZlciBjb250YWluaW5nIHRoZSBibG9jayAqLworCisvKgorICogR2V0IGEgYnVmZmVyIGZvciB0aGUgYmxvY2ssIHJldHVybiBpdCB3aXRoIG5vIGRhdGEgcmVhZC4KKyAqIExvbmctZm9ybSBhZGRyZXNzaW5nLgorICovCitzdHJ1Y3QgeGZzX2J1ZiAqCQkJCS8qIGJ1ZmZlciBmb3IgZnNibm8gKi8KK3hmc19idHJlZV9nZXRfYnVmbCgKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19mc2Jsb2NrX3QJCWZzYm5vLAkvKiBmaWxlIHN5c3RlbSBibG9jayBudW1iZXIgKi8KKwl1aW50CQkJbG9jayk7CS8qIGxvY2sgZmxhZ3MgZm9yIGdldF9idWYgKi8KKworLyoKKyAqIEdldCBhIGJ1ZmZlciBmb3IgdGhlIGJsb2NrLCByZXR1cm4gaXQgd2l0aCBubyBkYXRhIHJlYWQuCisgKiBTaG9ydC1mb3JtIGFkZHJlc3NpbmcuCisgKi8KK3N0cnVjdCB4ZnNfYnVmICoJCQkJLyogYnVmZmVyIGZvciBhZ25vL2FnYm5vICovCit4ZnNfYnRyZWVfZ2V0X2J1ZnMoCisJc3RydWN0IHhmc19tb3VudAkqbXAsCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJc3RydWN0IHhmc190cmFucwkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfYWdudW1iZXJfdAkJYWdubywJLyogYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwl4ZnNfYWdibG9ja190CQlhZ2JubywJLyogYWxsb2NhdGlvbiBncm91cCBibG9jayBudW1iZXIgKi8KKwl1aW50CQkJbG9jayk7CS8qIGxvY2sgZmxhZ3MgZm9yIGdldF9idWYgKi8KKworLyoKKyAqIEFsbG9jYXRlIGEgbmV3IGJ0cmVlIGN1cnNvci4KKyAqIFRoZSBjdXJzb3IgaXMgZWl0aGVyIGZvciBhbGxvY2F0aW9uIChBKSBvciBibWFwIChCKS4KKyAqLworeGZzX2J0cmVlX2N1cl90ICoJCQkvKiBuZXcgYnRyZWUgY3Vyc29yICovCit4ZnNfYnRyZWVfaW5pdF9jdXJzb3IoCisJc3RydWN0IHhmc19tb3VudAkqbXAsCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJc3RydWN0IHhmc190cmFucwkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkJKmFnYnAsCS8qIChBIG9ubHkpIGJ1ZmZlciBmb3IgYWdmIHN0cnVjdHVyZSAqLworCXhmc19hZ251bWJlcl90CQlhZ25vLAkvKiAoQSBvbmx5KSBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCXhmc19idG51bV90CQlidG51bSwJLyogYnRyZWUgaWRlbnRpZmllciAqLworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkvKiAoQiBvbmx5KSBpbm9kZSBvd25pbmcgdGhlIGJ0cmVlICovCisJaW50CQkJd2hpY2hmb3JrKTsgLyogKEIgb25seSkgZGF0YS9hdHRyIGZvcmsgKi8KKworLyoKKyAqIENoZWNrIGZvciB0aGUgY3Vyc29yIHJlZmVycmluZyB0byB0aGUgbGFzdCBibG9jayBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCisgKi8KK2ludAkJCQkJLyogMT1pcyBsYXN0IGJsb2NrLCAwPW5vdCBsYXN0IGJsb2NrICovCit4ZnNfYnRyZWVfaXNsYXN0YmxvY2soCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCk7CS8qIGxldmVsIHRvIGNoZWNrICovCisKKy8qCisgKiBDaGFuZ2UgdGhlIGN1cnNvciB0byBwb2ludCB0byB0aGUgbGFzdCByZWNvcmQgaW4gdGhlIGN1cnJlbnQgYmxvY2sKKyAqIGF0IHRoZSBnaXZlbiBsZXZlbC4gIE90aGVyIGxldmVscyBhcmUgdW5hZmZlY3RlZC4KKyAqLworaW50CQkJCQkvKiBzdWNjZXNzPTEsIGZhaWx1cmU9MCAqLworeGZzX2J0cmVlX2xhc3RyZWMoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCk7CS8qIGxldmVsIHRvIGNoYW5nZSAqLworCisvKgorICogQ29tcHV0ZSBmaXJzdCBhbmQgbGFzdCBieXRlIG9mZnNldHMgZm9yIHRoZSBmaWVsZHMgZ2l2ZW4uCisgKiBJbnRlcnByZXRzIHRoZSBvZmZzZXRzIHRhYmxlLCB3aGljaCBjb250YWlucyBzdHJ1Y3QgZmllbGQgb2Zmc2V0cy4KKyAqLwordm9pZAoreGZzX2J0cmVlX29mZnNldHMoCisJX19pbnQ2NF90CQlmaWVsZHMsCS8qIGJpdG1hc2sgb2YgZmllbGRzICovCisJY29uc3Qgc2hvcnQJCSpvZmZzZXRzLC8qIHRhYmxlIG9mIGZpZWxkIG9mZnNldHMgKi8KKwlpbnQJCQluYml0cywJLyogbnVtYmVyIG9mIGJpdHMgdG8gaW5zcGVjdCAqLworCWludAkJCSpmaXJzdCwJLyogb3V0cHV0OiBmaXJzdCBieXRlIG9mZnNldCAqLworCWludAkJCSpsYXN0KTsJLyogb3V0cHV0OiBsYXN0IGJ5dGUgb2Zmc2V0ICovCisKKy8qCisgKiBHZXQgYSBidWZmZXIgZm9yIHRoZSBibG9jaywgcmV0dXJuIGl0IHJlYWQgaW4uCisgKiBMb25nLWZvcm0gYWRkcmVzc2luZy4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2J0cmVlX3JlYWRfYnVmbCgKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19mc2Jsb2NrX3QJCWZzYm5vLAkvKiBmaWxlIHN5c3RlbSBibG9jayBudW1iZXIgKi8KKwl1aW50CQkJbG9jaywJLyogbG9jayBmbGFncyBmb3IgcmVhZF9idWYgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkJKipicHAsCS8qIGJ1ZmZlciBmb3IgZnNibm8gKi8KKwlpbnQJCQlyZWZ2YWwpOy8qIHJlZiBjb3VudCB2YWx1ZSBmb3IgYnVmZmVyICovCisKKy8qCisgKiBHZXQgYSBidWZmZXIgZm9yIHRoZSBibG9jaywgcmV0dXJuIGl0IHJlYWQgaW4uCisgKiBTaG9ydC1mb3JtIGFkZHJlc3NpbmcuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19idHJlZV9yZWFkX2J1ZnMoCisJc3RydWN0IHhmc19tb3VudAkqbXAsCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJc3RydWN0IHhmc190cmFucwkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfYWdudW1iZXJfdAkJYWdubywJLyogYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwl4ZnNfYWdibG9ja190CQlhZ2JubywJLyogYWxsb2NhdGlvbiBncm91cCBibG9jayBudW1iZXIgKi8KKwl1aW50CQkJbG9jaywJLyogbG9jayBmbGFncyBmb3IgcmVhZF9idWYgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkJKipicHAsCS8qIGJ1ZmZlciBmb3IgYWduby9hZ2JubyAqLworCWludAkJCXJlZnZhbCk7LyogcmVmIGNvdW50IHZhbHVlIGZvciBidWZmZXIgKi8KKworLyoKKyAqIFJlYWQtYWhlYWQgdGhlIGJsb2NrLCBkb24ndCB3YWl0IGZvciBpdCwgZG9uJ3QgcmV0dXJuIGEgYnVmZmVyLgorICogTG9uZy1mb3JtIGFkZHJlc3NpbmcuCisgKi8KK3ZvaWQJCQkJCS8qIGVycm9yICovCit4ZnNfYnRyZWVfcmVhZGFfYnVmbCgKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfZnNibG9ja190CQlmc2JubywJLyogZmlsZSBzeXN0ZW0gYmxvY2sgbnVtYmVyICovCisJeGZzX2V4dGxlbl90CQljb3VudCk7CS8qIGNvdW50IG9mIGZpbGVzeXN0ZW0gYmxvY2tzICovCisKKy8qCisgKiBSZWFkLWFoZWFkIHRoZSBibG9jaywgZG9uJ3Qgd2FpdCBmb3IgaXQsIGRvbid0IHJldHVybiBhIGJ1ZmZlci4KKyAqIFNob3J0LWZvcm0gYWRkcmVzc2luZy4KKyAqLwordm9pZAkJCQkJLyogZXJyb3IgKi8KK3hmc19idHJlZV9yZWFkYV9idWZzKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc19hZ251bWJlcl90CQlhZ25vLAkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCXhmc19hZ2Jsb2NrX3QJCWFnYm5vLAkvKiBhbGxvY2F0aW9uIGdyb3VwIGJsb2NrIG51bWJlciAqLworCXhmc19leHRsZW5fdAkJY291bnQpOwkvKiBjb3VudCBvZiBmaWxlc3lzdGVtIGJsb2NrcyAqLworCisvKgorICogUmVhZC1haGVhZCBidHJlZSBibG9ja3MsIGF0IHRoZSBnaXZlbiBsZXZlbC4KKyAqIEJpdHMgaW4gbHIgYXJlIHNldCBmcm9tIFhGU19CVENVUl97TEVGVCxSSUdIVH1SQS4KKyAqLworaW50CQkJCQkvKiByZWFkYWhlYWQgYmxvY2sgY291bnQgKi8KK3hmc19idHJlZV9yZWFkYWhlYWRfY29yZSgKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldiwJLyogbGV2ZWwgaW4gYnRyZWUgKi8KKwlpbnQJCQlscik7CS8qIGxlZnQvcmlnaHQgYml0cyAqLworCitzdGF0aWMgaW5saW5lIGludAkJCS8qIHJlYWRhaGVhZCBibG9jayBjb3VudCAqLworeGZzX2J0cmVlX3JlYWRhaGVhZCgKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldiwJLyogbGV2ZWwgaW4gYnRyZWUgKi8KKwlpbnQJCQlscikJLyogbGVmdC9yaWdodCBiaXRzICovCit7CisJaWYgKChjdXItPmJjX3JhW2xldl0gfCBscikgPT0gY3VyLT5iY19yYVtsZXZdKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB4ZnNfYnRyZWVfcmVhZGFoZWFkX2NvcmUoY3VyLCBsZXYsIGxyKTsKK30KKworCisvKgorICogU2V0IHRoZSBidWZmZXIgZm9yIGxldmVsICJsZXYiIGluIHRoZSBjdXJzb3IgdG8gYnAsIHJlbGVhc2luZworICogYW55IHByZXZpb3VzIGJ1ZmZlci4KKyAqLwordm9pZAoreGZzX2J0cmVlX3NldGJ1ZigKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldiwJLyogbGV2ZWwgaW4gYnRyZWUgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwKTsJLyogbmV3IGJ1ZmZlciB0byBzZXQgKi8KKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworCisvKgorICogTWluIGFuZCBtYXggZnVuY3Rpb25zIGZvciBleHRsZW4sIGFnYmxvY2ssIGZpbGVvZmYsIGFuZCBmaWxibGtzIHR5cGVzLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19FWFRMRU5fTUlOKQoreGZzX2V4dGxlbl90IHhmc19leHRsZW5fbWluKHhmc19leHRsZW5fdCBhLCB4ZnNfZXh0bGVuX3QgYik7CisjZGVmaW5lCVhGU19FWFRMRU5fTUlOKGEsYikJeGZzX2V4dGxlbl9taW4oYSxiKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0VYVExFTl9NSU4oYSxiKQlcCisJKCh4ZnNfZXh0bGVuX3QpKGEpIDwgKHhmc19leHRsZW5fdCkoYikgPyBcCisJICh4ZnNfZXh0bGVuX3QpKGEpIDogKHhmc19leHRsZW5fdCkoYikpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0VYVExFTl9NQVgpCit4ZnNfZXh0bGVuX3QgeGZzX2V4dGxlbl9tYXgoeGZzX2V4dGxlbl90IGEsIHhmc19leHRsZW5fdCBiKTsKKyNkZWZpbmUJWEZTX0VYVExFTl9NQVgoYSxiKQl4ZnNfZXh0bGVuX21heChhLGIpCisjZWxzZQorI2RlZmluZQlYRlNfRVhUTEVOX01BWChhLGIpCVwKKwkoKHhmc19leHRsZW5fdCkoYSkgPiAoeGZzX2V4dGxlbl90KShiKSA/IFwKKwkgKHhmc19leHRsZW5fdCkoYSkgOiAoeGZzX2V4dGxlbl90KShiKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BR0JMT0NLX01JTikKK3hmc19hZ2Jsb2NrX3QgeGZzX2FnYmxvY2tfbWluKHhmc19hZ2Jsb2NrX3QgYSwgeGZzX2FnYmxvY2tfdCBiKTsKKyNkZWZpbmUJWEZTX0FHQkxPQ0tfTUlOKGEsYikJeGZzX2FnYmxvY2tfbWluKGEsYikKKyNlbHNlCisjZGVmaW5lCVhGU19BR0JMT0NLX01JTihhLGIpCVwKKwkoKHhmc19hZ2Jsb2NrX3QpKGEpIDwgKHhmc19hZ2Jsb2NrX3QpKGIpID8gXAorCSAoeGZzX2FnYmxvY2tfdCkoYSkgOiAoeGZzX2FnYmxvY2tfdCkoYikpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FHQkxPQ0tfTUFYKQoreGZzX2FnYmxvY2tfdCB4ZnNfYWdibG9ja19tYXgoeGZzX2FnYmxvY2tfdCBhLCB4ZnNfYWdibG9ja190IGIpOworI2RlZmluZQlYRlNfQUdCTE9DS19NQVgoYSxiKQl4ZnNfYWdibG9ja19tYXgoYSxiKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0FHQkxPQ0tfTUFYKGEsYikJXAorCSgoeGZzX2FnYmxvY2tfdCkoYSkgPiAoeGZzX2FnYmxvY2tfdCkoYikgPyBcCisJICh4ZnNfYWdibG9ja190KShhKSA6ICh4ZnNfYWdibG9ja190KShiKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19GSUxFT0ZGX01JTikKK3hmc19maWxlb2ZmX3QgeGZzX2ZpbGVvZmZfbWluKHhmc19maWxlb2ZmX3QgYSwgeGZzX2ZpbGVvZmZfdCBiKTsKKyNkZWZpbmUJWEZTX0ZJTEVPRkZfTUlOKGEsYikJeGZzX2ZpbGVvZmZfbWluKGEsYikKKyNlbHNlCisjZGVmaW5lCVhGU19GSUxFT0ZGX01JTihhLGIpCVwKKwkoKHhmc19maWxlb2ZmX3QpKGEpIDwgKHhmc19maWxlb2ZmX3QpKGIpID8gXAorCSAoeGZzX2ZpbGVvZmZfdCkoYSkgOiAoeGZzX2ZpbGVvZmZfdCkoYikpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0ZJTEVPRkZfTUFYKQoreGZzX2ZpbGVvZmZfdCB4ZnNfZmlsZW9mZl9tYXgoeGZzX2ZpbGVvZmZfdCBhLCB4ZnNfZmlsZW9mZl90IGIpOworI2RlZmluZQlYRlNfRklMRU9GRl9NQVgoYSxiKQl4ZnNfZmlsZW9mZl9tYXgoYSxiKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0ZJTEVPRkZfTUFYKGEsYikJXAorCSgoeGZzX2ZpbGVvZmZfdCkoYSkgPiAoeGZzX2ZpbGVvZmZfdCkoYikgPyBcCisJICh4ZnNfZmlsZW9mZl90KShhKSA6ICh4ZnNfZmlsZW9mZl90KShiKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19GSUxCTEtTX01JTikKK3hmc19maWxibGtzX3QgeGZzX2ZpbGJsa3NfbWluKHhmc19maWxibGtzX3QgYSwgeGZzX2ZpbGJsa3NfdCBiKTsKKyNkZWZpbmUJWEZTX0ZJTEJMS1NfTUlOKGEsYikJeGZzX2ZpbGJsa3NfbWluKGEsYikKKyNlbHNlCisjZGVmaW5lCVhGU19GSUxCTEtTX01JTihhLGIpCVwKKwkoKHhmc19maWxibGtzX3QpKGEpIDwgKHhmc19maWxibGtzX3QpKGIpID8gXAorCSAoeGZzX2ZpbGJsa3NfdCkoYSkgOiAoeGZzX2ZpbGJsa3NfdCkoYikpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0ZJTEJMS1NfTUFYKQoreGZzX2ZpbGJsa3NfdCB4ZnNfZmlsYmxrc19tYXgoeGZzX2ZpbGJsa3NfdCBhLCB4ZnNfZmlsYmxrc190IGIpOworI2RlZmluZQlYRlNfRklMQkxLU19NQVgoYSxiKQl4ZnNfZmlsYmxrc19tYXgoYSxiKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0ZJTEJMS1NfTUFYKGEsYikJXAorCSgoeGZzX2ZpbGJsa3NfdCkoYSkgPiAoeGZzX2ZpbGJsa3NfdCkoYikgPyBcCisJICh4ZnNfZmlsYmxrc190KShhKSA6ICh4ZnNfZmlsYmxrc190KShiKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRlNCX1NBTklUWV9DSEVDSykKK2ludCB4ZnNfZnNiX3Nhbml0eV9jaGVjayhzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2ZzYmxvY2tfdCBmc2IpOworI2RlZmluZQlYRlNfRlNCX1NBTklUWV9DSEVDSyhtcCxmc2IpCXhmc19mc2Jfc2FuaXR5X2NoZWNrKG1wLGZzYikKKyNlbHNlCisjZGVmaW5lCVhGU19GU0JfU0FOSVRZX0NIRUNLKG1wLGZzYikJXAorCShYRlNfRlNCX1RPX0FHTk8obXAsIGZzYikgPCBtcC0+bV9zYi5zYl9hZ2NvdW50ICYmIFwKKwkgWEZTX0ZTQl9UT19BR0JOTyhtcCwgZnNiKSA8IG1wLT5tX3NiLnNiX2FnYmxvY2tzKQorI2VuZGlmCisKKy8qCisgKiBNYWNyb3MgdG8gc2V0IEVGU0NPUlJVUFRFRCAmIHJldHVybi9icmFuY2guCisgKi8KKyNkZWZpbmUJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oeCxsKQlcCisJeyBcCisJCWludCBmc19pc19vayA9ICh4KTsgXAorCQlBU1NFUlQoZnNfaXNfb2spOyBcCisJCWlmICh1bmxpa2VseSghZnNfaXNfb2spKSB7IFwKKwkJCVhGU19FUlJPUl9SRVBPUlQoIlhGU19XQU5UX0NPUlJVUFRFRF9HT1RPIiwgXAorCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywgTlVMTCk7IFwKKwkJCWVycm9yID0gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7IFwKKwkJCWdvdG8gbDsgXAorCQl9IFwKKwl9CisKKyNkZWZpbmUJWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTih4KQlcCisJeyBcCisJCWludCBmc19pc19vayA9ICh4KTsgXAorCQlBU1NFUlQoZnNfaXNfb2spOyBcCisJCWlmICh1bmxpa2VseSghZnNfaXNfb2spKSB7IFwKKwkJCVhGU19FUlJPUl9SRVBPUlQoIlhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4iLCBcCisJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBOVUxMKTsgXAorCQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOyBcCisJCX0gXAorCX0KKworI2VuZGlmCS8qIF9fWEZTX0JUUkVFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idWZfaXRlbS5jIGIvZnMveGZzL3hmc19idWZfaXRlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYjAwMzkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2J1Zl9pdGVtLmMKQEAgLTAsMCArMSwxMjIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgeGZzX2J1Zl9sb2dfaXRlbS4KKyAqIEl0IGNvbnRhaW5zIHRoZSBpdGVtIG9wZXJhdGlvbnMgdXNlZCB0byBtYW5pcHVsYXRlIHRoZSBidWYgbG9nCisgKiBpdGVtcyBhcyB3ZWxsIGFzIHV0aWxpdHkgcm91dGluZXMgdXNlZCBieSB0aGUgYnVmZmVyIHNwZWNpZmljCisgKiB0cmFuc2FjdGlvbiByb3V0aW5lcy4KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorCisKK2ttZW1fem9uZV90CSp4ZnNfYnVmX2l0ZW1fem9uZTsKKworI2lmZGVmIFhGU19UUkFOU19ERUJVRworLyoKKyAqIFRoaXMgZnVuY3Rpb24gdXNlcyBhbiBhbHRlcm5hdGUgc3RyYXRlZ3kgZm9yIHRyYWNraW5nIHRoZSBieXRlcworICogdGhhdCB0aGUgdXNlciByZXF1ZXN0cyB0byBiZSBsb2dnZWQuICBUaGlzIGNhbiB0aGVuIGJlIHVzZWQKKyAqIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGJsaV9vcmlnIGFycmF5IGluIHRoZSBidWYgbG9nIGl0ZW0gdG8KKyAqIGNhdGNoIGJ1Z3MgaW4gb3VyIGNhbGxlcnMnIGNvZGUuCisgKgorICogV2UgYWxzbyBkb3VibGUgY2hlY2sgdGhlIGJpdHMgc2V0IGluIHhmc19idWZfaXRlbV9sb2cgdXNpbmcgYQorICogc2ltcGxlIGFsZ29yaXRobSB0byBjaGVjayB0aGF0IGV2ZXJ5IGJ5dGUgaXMgYWNjb3VudGVkIGZvci4KKyAqLworU1RBVElDIHZvaWQKK3hmc19idWZfaXRlbV9sb2dfZGVidWcoCisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXAsCisJdWludAkJCWZpcnN0LAorCXVpbnQJCQlsYXN0KQoreworCXVpbnQJeDsKKwl1aW50CWJ5dGU7CisJdWludAluYnl0ZXM7CisJdWludAljaHVua19udW07CisJdWludAl3b3JkX251bTsKKwl1aW50CWJpdF9udW07CisJdWludAliaXRfc2V0OworCXVpbnQJKndvcmRwOworCisJQVNTRVJUKGJpcC0+YmxpX2xvZ2dlZCAhPSBOVUxMKTsKKwlieXRlID0gZmlyc3Q7CisJbmJ5dGVzID0gbGFzdCAtIGZpcnN0ICsgMTsKKwliZnNldChiaXAtPmJsaV9sb2dnZWQsIGZpcnN0LCBuYnl0ZXMpOworCWZvciAoeCA9IDA7IHggPCBuYnl0ZXM7IHgrKykgeworCQljaHVua19udW0gPSBieXRlID4+IFhGU19CTElfU0hJRlQ7CisJCXdvcmRfbnVtID0gY2h1bmtfbnVtID4+IEJJVF9UT19XT1JEX1NISUZUOworCQliaXRfbnVtID0gY2h1bmtfbnVtICYgKE5CV09SRCAtIDEpOworCQl3b3JkcCA9ICYoYmlwLT5ibGlfZm9ybWF0LmJsZl9kYXRhX21hcFt3b3JkX251bV0pOworCQliaXRfc2V0ID0gKndvcmRwICYgKDEgPDwgYml0X251bSk7CisJCUFTU0VSVChiaXRfc2V0KTsKKwkJYnl0ZSsrOworCX0KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgZmx1c2ggc29tZXRoaW5nIGludG8gYSBidWZmZXIgd2l0aG91dAorICogbG9nZ2luZyBpdC4gIFRoaXMgaGFwcGVucyBmb3IgdGhpbmdzIGxpa2UgaW5vZGVzIHdoaWNoIGFyZSBsb2dnZWQKKyAqIHNlcGFyYXRlbHkgZnJvbSB0aGUgYnVmZmVyLgorICovCit2b2lkCit4ZnNfYnVmX2l0ZW1fZmx1c2hfbG9nX2RlYnVnKAorCXhmc19idWZfdAkqYnAsCisJdWludAkJZmlyc3QsCisJdWludAkJbGFzdCkKK3sKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKKwl1aW50CQkJbmJ5dGVzOworCisJYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19idWZfbG9nX2l0ZW1fdCopOworCWlmICgoYmlwID09IE5VTEwpIHx8IChiaXAtPmJsaV9pdGVtLmxpX3R5cGUgIT0gWEZTX0xJX0JVRikpIHsKKwkJcmV0dXJuOworCX0KKworCUFTU0VSVChiaXAtPmJsaV9sb2dnZWQgIT0gTlVMTCk7CisJbmJ5dGVzID0gbGFzdCAtIGZpcnN0ICsgMTsKKwliZnNldChiaXAtPmJsaV9sb2dnZWQsIGZpcnN0LCBuYnl0ZXMpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdmVyaWZ5IHRoYXQgb3VyIGNhbGxlcidzIGhhdmUgbG9nZ2VkCisgKiBhbGwgdGhlIGJ5dGVzIHRoYXQgdGhleSBjaGFuZ2VkLgorICoKKyAqIEl0IGRvZXMgdGhpcyBieSBjb21wYXJpbmcgdGhlIG9yaWdpbmFsIGNvcHkgb2YgdGhlIGJ1ZmZlciBzdG9yZWQgaW4KKyAqIHRoZSBidWYgbG9nIGl0ZW0ncyBibGlfb3JpZyBhcnJheSB0byB0aGUgY3VycmVudCBjb3B5IG9mIHRoZSBidWZmZXIKKyAqIGFuZCBlbnN1cmluZyB0aGF0IGFsbCBieXRlcyB3aGljaCBtaXNjb21wYXJlIGFyZSBzZXQgaW4gdGhlIGJsaV9sb2dnZWQKKyAqIGFycmF5IG9mIHRoZSBidWYgbG9nIGl0ZW0uCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYnVmX2l0ZW1fbG9nX2NoZWNrKAorCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwKQoreworCWNoYXIJCSpvcmlnOworCWNoYXIJCSpidWZmZXI7CisJaW50CQl4OworCXhmc19idWZfdAkqYnA7CisKKwlBU1NFUlQoYmlwLT5ibGlfb3JpZyAhPSBOVUxMKTsKKwlBU1NFUlQoYmlwLT5ibGlfbG9nZ2VkICE9IE5VTEwpOworCisJYnAgPSBiaXAtPmJsaV9idWY7CisJQVNTRVJUKFhGU19CVUZfQ09VTlQoYnApID4gMCk7CisJQVNTRVJUKFhGU19CVUZfUFRSKGJwKSAhPSBOVUxMKTsKKwlvcmlnID0gYmlwLT5ibGlfb3JpZzsKKwlidWZmZXIgPSBYRlNfQlVGX1BUUihicCk7CisJZm9yICh4ID0gMDsgeCA8IFhGU19CVUZfQ09VTlQoYnApOyB4KyspIHsKKwkJaWYgKG9yaWdbeF0gIT0gYnVmZmVyW3hdICYmICFidHN0KGJpcC0+YmxpX2xvZ2dlZCwgeCkpCisJCQljbW5fZXJyKENFX1BBTklDLAorCSJ4ZnNfYnVmX2l0ZW1fbG9nX2NoZWNrIGJpcCAleCBidWZmZXIgJXggb3JpZyAleCBpbmRleCAlZCIsCisJCQkJYmlwLCBicCwgb3JpZywgeCk7CisJfQorfQorI2Vsc2UKKyNkZWZpbmUJCXhmc19idWZfaXRlbV9sb2dfZGVidWcoeCx5LHopCisjZGVmaW5lCQl4ZnNfYnVmX2l0ZW1fbG9nX2NoZWNrKHgpCisjZW5kaWYKKworU1RBVElDIHZvaWQJeGZzX2J1Zl9lcnJvcl9yZWxzZSh4ZnNfYnVmX3QgKmJwKTsKK1NUQVRJQyB2b2lkCXhmc19idWZfZG9fY2FsbGJhY2tzKHhmc19idWZfdCAqYnAsIHhmc19sb2dfaXRlbV90ICpsaXApOworCisvKgorICogVGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgbG9nIGlvdmVjcyBuZWVkZWQgdG8gbG9nIHRoZQorICogZ2l2ZW4gYnVmIGxvZyBpdGVtLgorICoKKyAqIEl0IGNhbGN1bGF0ZXMgdGhpcyBhcyAxIGlvdmVjIGZvciB0aGUgYnVmIGxvZyBmb3JtYXQgc3RydWN0dXJlCisgKiBhbmQgMSBmb3IgZWFjaCBzdHJldGNoIG9mIG5vbi1jb250aWd1b3VzIGNodW5rcyB0byBiZSBsb2dnZWQuCisgKiBDb250aWd1b3VzIGNodW5rcyBhcmUgbG9nZ2VkIGluIGEgc2luZ2xlIGlvdmVjLgorICoKKyAqIElmIHRoZSBYRlNfQkxJX1NUQUxFIGZsYWcgaGFzIGJlZW4gc2V0LCB0aGVuIGxvZyBub3RoaW5nLgorICovCit1aW50Cit4ZnNfYnVmX2l0ZW1fc2l6ZSgKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCkKK3sKKwl1aW50CQludmVjczsKKwlpbnQJCW5leHRfYml0OworCWludAkJbGFzdF9iaXQ7CisJeGZzX2J1Zl90CSpicDsKKworCUFTU0VSVChhdG9taWNfcmVhZCgmYmlwLT5ibGlfcmVmY291bnQpID4gMCk7CisJaWYgKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9TVEFMRSkgeworCQkvKgorCQkgKiBUaGUgYnVmZmVyIGlzIHN0YWxlLCBzbyBhbGwgd2UgbmVlZCB0byBsb2cKKwkJICogaXMgdGhlIGJ1ZiBsb2cgZm9ybWF0IHN0cnVjdHVyZSB3aXRoIHRoZQorCQkgKiBjYW5jZWwgZmxhZyBpbiBpdC4KKwkJICovCisJCXhmc19idWZfaXRlbV90cmFjZSgiU0laRSBTVEFMRSIsIGJpcCk7CisJCUFTU0VSVChiaXAtPmJsaV9mb3JtYXQuYmxmX2ZsYWdzICYgWEZTX0JMSV9DQU5DRUwpOworCQlyZXR1cm4gMTsKKwl9CisKKwlicCA9IGJpcC0+YmxpX2J1ZjsKKwlBU1NFUlQoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX0xPR0dFRCk7CisJbnZlY3MgPSAxOworCWxhc3RfYml0ID0geGZzX25leHRfYml0KGJpcC0+YmxpX2Zvcm1hdC5ibGZfZGF0YV9tYXAsCisJCQkJCSBiaXAtPmJsaV9mb3JtYXQuYmxmX21hcF9zaXplLCAwKTsKKwlBU1NFUlQobGFzdF9iaXQgIT0gLTEpOworCW52ZWNzKys7CisJd2hpbGUgKGxhc3RfYml0ICE9IC0xKSB7CisJCS8qCisJCSAqIFRoaXMgdGFrZXMgdGhlIGJpdCBudW1iZXIgdG8gc3RhcnQgbG9va2luZyBmcm9tIGFuZAorCQkgKiByZXR1cm5zIHRoZSBuZXh0IHNldCBiaXQgZnJvbSB0aGVyZS4gIEl0IHJldHVybnMgLTEKKwkJICogaWYgdGhlcmUgYXJlIG5vIG1vcmUgYml0cyBzZXQgb3IgdGhlIHN0YXJ0IGJpdCBpcworCQkgKiBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgYml0bWFwLgorCQkgKi8KKwkJbmV4dF9iaXQgPSB4ZnNfbmV4dF9iaXQoYmlwLT5ibGlfZm9ybWF0LmJsZl9kYXRhX21hcCwKKwkJCQkJCSBiaXAtPmJsaV9mb3JtYXQuYmxmX21hcF9zaXplLAorCQkJCQkJIGxhc3RfYml0ICsgMSk7CisJCS8qCisJCSAqIElmIHdlIHJ1biBvdXQgb2YgYml0cywgbGVhdmUgdGhlIGxvb3AsCisJCSAqIGVsc2UgaWYgd2UgZmluZCBhIG5ldyBzZXQgb2YgYml0cyBidW1wIHRoZSBudW1iZXIgb2YgdmVjcywKKwkJICogZWxzZSBrZWVwIHNjYW5uaW5nIHRoZSBjdXJyZW50IHNldCBvZiBiaXRzLgorCQkgKi8KKwkJaWYgKG5leHRfYml0ID09IC0xKSB7CisJCQlsYXN0X2JpdCA9IC0xOworCQl9IGVsc2UgaWYgKG5leHRfYml0ICE9IGxhc3RfYml0ICsgMSkgeworCQkJbGFzdF9iaXQgPSBuZXh0X2JpdDsKKwkJCW52ZWNzKys7CisJCX0gZWxzZSBpZiAoeGZzX2J1Zl9vZmZzZXQoYnAsIG5leHRfYml0ICogWEZTX0JMSV9DSFVOSykgIT0KKwkJCSAgICh4ZnNfYnVmX29mZnNldChicCwgbGFzdF9iaXQgKiBYRlNfQkxJX0NIVU5LKSArCisJCQkgICAgWEZTX0JMSV9DSFVOSykpIHsKKwkJCWxhc3RfYml0ID0gbmV4dF9iaXQ7CisJCQludmVjcysrOworCQl9IGVsc2UgeworCQkJbGFzdF9iaXQrKzsKKwkJfQorCX0KKworCXhmc19idWZfaXRlbV90cmFjZSgiU0laRSBOT1JNIiwgYmlwKTsKKwlyZXR1cm4gbnZlY3M7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byBmaWxsIGluIHRoZSB2ZWN0b3Igb2YgbG9nIGlvdmVjcyBmb3IgdGhlCisgKiBnaXZlbiBsb2cgYnVmIGl0ZW0uICBJdCBmaWxscyB0aGUgZmlyc3QgZW50cnkgd2l0aCBhIGJ1ZiBsb2cKKyAqIGZvcm1hdCBzdHJ1Y3R1cmUsIGFuZCB0aGUgcmVzdCBwb2ludCB0byBjb250aWd1b3VzIGNodW5rcworICogd2l0aGluIHRoZSBidWZmZXIuCisgKi8KK3ZvaWQKK3hmc19idWZfaXRlbV9mb3JtYXQoCisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXAsCisJeGZzX2xvZ19pb3ZlY190CQkqbG9nX3ZlY3RvcikKK3sKKwl1aW50CQliYXNlX3NpemU7CisJdWludAkJbnZlY3M7CisJeGZzX2xvZ19pb3ZlY190CSp2ZWNwOworCXhmc19idWZfdAkqYnA7CisJaW50CQlmaXJzdF9iaXQ7CisJaW50CQlsYXN0X2JpdDsKKwlpbnQJCW5leHRfYml0OworCXVpbnQJCW5iaXRzOworCXVpbnQJCWJ1ZmZlcl9vZmZzZXQ7CisKKwlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOworCUFTU0VSVCgoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX0xPR0dFRCkgfHwKKwkgICAgICAgKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9TVEFMRSkpOworCWJwID0gYmlwLT5ibGlfYnVmOworCUFTU0VSVChYRlNfQlVGX0JQX0lTTUFQUEVEKGJwKSk7CisJdmVjcCA9IGxvZ192ZWN0b3I7CisKKwkvKgorCSAqIFRoZSBzaXplIG9mIHRoZSBiYXNlIHN0cnVjdHVyZSBpcyB0aGUgc2l6ZSBvZiB0aGUKKwkgKiBkZWNsYXJlZCBzdHJ1Y3R1cmUgcGx1cyB0aGUgc3BhY2UgZm9yIHRoZSBleHRyYSB3b3JkcworCSAqIG9mIHRoZSBiaXRtYXAuICBXZSBzdWJ0cmFjdCBvbmUgZnJvbSB0aGUgbWFwIHNpemUsIGJlY2F1c2UKKwkgKiB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYml0bWFwIGlzIGFjY291bnRlZCBmb3IgaW4gdGhlCisJICogc2l6ZSBvZiB0aGUgYmFzZSBzdHJ1Y3R1cmUuCisJICovCisJYmFzZV9zaXplID0KKwkJKHVpbnQpKHNpemVvZih4ZnNfYnVmX2xvZ19mb3JtYXRfdCkgKworCQkgICAgICAgKChiaXAtPmJsaV9mb3JtYXQuYmxmX21hcF9zaXplIC0gMSkgKiBzaXplb2YodWludCkpKTsKKwl2ZWNwLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpJmJpcC0+YmxpX2Zvcm1hdDsKKwl2ZWNwLT5pX2xlbiA9IGJhc2Vfc2l6ZTsKKwl2ZWNwKys7CisJbnZlY3MgPSAxOworCisJaWYgKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9TVEFMRSkgeworCQkvKgorCQkgKiBUaGUgYnVmZmVyIGlzIHN0YWxlLCBzbyBhbGwgd2UgbmVlZCB0byBsb2cKKwkJICogaXMgdGhlIGJ1ZiBsb2cgZm9ybWF0IHN0cnVjdHVyZSB3aXRoIHRoZQorCQkgKiBjYW5jZWwgZmxhZyBpbiBpdC4KKwkJICovCisJCXhmc19idWZfaXRlbV90cmFjZSgiRk9STUFUIFNUQUxFIiwgYmlwKTsKKwkJQVNTRVJUKGJpcC0+YmxpX2Zvcm1hdC5ibGZfZmxhZ3MgJiBYRlNfQkxJX0NBTkNFTCk7CisJCWJpcC0+YmxpX2Zvcm1hdC5ibGZfc2l6ZSA9IG52ZWNzOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBGaWxsIGluIGFuIGlvdmVjIGZvciBlYWNoIHNldCBvZiBjb250aWd1b3VzIGNodW5rcy4KKwkgKi8KKwlmaXJzdF9iaXQgPSB4ZnNfbmV4dF9iaXQoYmlwLT5ibGlfZm9ybWF0LmJsZl9kYXRhX21hcCwKKwkJCQkJIGJpcC0+YmxpX2Zvcm1hdC5ibGZfbWFwX3NpemUsIDApOworCUFTU0VSVChmaXJzdF9iaXQgIT0gLTEpOworCWxhc3RfYml0ID0gZmlyc3RfYml0OworCW5iaXRzID0gMTsKKwlmb3IgKDs7KSB7CisJCS8qCisJCSAqIFRoaXMgdGFrZXMgdGhlIGJpdCBudW1iZXIgdG8gc3RhcnQgbG9va2luZyBmcm9tIGFuZAorCQkgKiByZXR1cm5zIHRoZSBuZXh0IHNldCBiaXQgZnJvbSB0aGVyZS4gIEl0IHJldHVybnMgLTEKKwkJICogaWYgdGhlcmUgYXJlIG5vIG1vcmUgYml0cyBzZXQgb3IgdGhlIHN0YXJ0IGJpdCBpcworCQkgKiBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgYml0bWFwLgorCQkgKi8KKwkJbmV4dF9iaXQgPSB4ZnNfbmV4dF9iaXQoYmlwLT5ibGlfZm9ybWF0LmJsZl9kYXRhX21hcCwKKwkJCQkJCSBiaXAtPmJsaV9mb3JtYXQuYmxmX21hcF9zaXplLAorCQkJCQkJICh1aW50KWxhc3RfYml0ICsgMSk7CisJCS8qCisJCSAqIElmIHdlIHJ1biBvdXQgb2YgYml0cyBmaWxsIGluIHRoZSBsYXN0IGlvdmVjIGFuZCBnZXQKKwkJICogb3V0IG9mIHRoZSBsb29wLgorCQkgKiBFbHNlIGlmIHdlIHN0YXJ0IGEgbmV3IHNldCBvZiBiaXRzIHRoZW4gZmlsbCBpbiB0aGUKKwkJICogaW92ZWMgZm9yIHRoZSBzZXJpZXMgd2Ugd2VyZSBsb29raW5nIGF0IGFuZCBzdGFydAorCQkgKiBjb3VudGluZyB0aGUgYml0cyBpbiB0aGUgbmV3IG9uZS4KKwkJICogRWxzZSB3ZSdyZSBzdGlsbCBpbiB0aGUgc2FtZSBzZXQgb2YgYml0cyBzbyBqdXN0CisJCSAqIGtlZXAgY291bnRpbmcgYW5kIHNjYW5uaW5nLgorCQkgKi8KKwkJaWYgKG5leHRfYml0ID09IC0xKSB7CisJCQlidWZmZXJfb2Zmc2V0ID0gZmlyc3RfYml0ICogWEZTX0JMSV9DSFVOSzsKKwkJCXZlY3AtPmlfYWRkciA9IHhmc19idWZfb2Zmc2V0KGJwLCBidWZmZXJfb2Zmc2V0KTsKKwkJCXZlY3AtPmlfbGVuID0gbmJpdHMgKiBYRlNfQkxJX0NIVU5LOworCQkJbnZlY3MrKzsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKG5leHRfYml0ICE9IGxhc3RfYml0ICsgMSkgeworCQkJYnVmZmVyX29mZnNldCA9IGZpcnN0X2JpdCAqIFhGU19CTElfQ0hVTks7CisJCQl2ZWNwLT5pX2FkZHIgPSB4ZnNfYnVmX29mZnNldChicCwgYnVmZmVyX29mZnNldCk7CisJCQl2ZWNwLT5pX2xlbiA9IG5iaXRzICogWEZTX0JMSV9DSFVOSzsKKwkJCW52ZWNzKys7CisJCQl2ZWNwKys7CisJCQlmaXJzdF9iaXQgPSBuZXh0X2JpdDsKKwkJCWxhc3RfYml0ID0gbmV4dF9iaXQ7CisJCQluYml0cyA9IDE7CisJCX0gZWxzZSBpZiAoeGZzX2J1Zl9vZmZzZXQoYnAsIG5leHRfYml0IDw8IFhGU19CTElfU0hJRlQpICE9CisJCQkgICAoeGZzX2J1Zl9vZmZzZXQoYnAsIGxhc3RfYml0IDw8IFhGU19CTElfU0hJRlQpICsKKwkJCSAgICBYRlNfQkxJX0NIVU5LKSkgeworCQkJYnVmZmVyX29mZnNldCA9IGZpcnN0X2JpdCAqIFhGU19CTElfQ0hVTks7CisJCQl2ZWNwLT5pX2FkZHIgPSB4ZnNfYnVmX29mZnNldChicCwgYnVmZmVyX29mZnNldCk7CisJCQl2ZWNwLT5pX2xlbiA9IG5iaXRzICogWEZTX0JMSV9DSFVOSzsKKy8qIFlvdSB3b3VsZCB0aGluayB3ZSBuZWVkIHRvIGJ1bXAgdGhlIG52ZWNzIGhlcmUgdG9vLCBidXQgd2UgZG8gbm90CisgKiB0aGlzIG51bWJlciBpcyB1c2VkIGJ5IHJlY292ZXJ5LCBhbmQgaXQgZ2V0cyBjb25mdXNlZCBieSB0aGUgYm91bmRhcnkKKyAqIHNwbGl0IGhlcmUKKyAqCQkJbnZlY3MrKzsKKyAqLworCQkJdmVjcCsrOworCQkJZmlyc3RfYml0ID0gbmV4dF9iaXQ7CisJCQlsYXN0X2JpdCA9IG5leHRfYml0OworCQkJbmJpdHMgPSAxOworCQl9IGVsc2UgeworCQkJbGFzdF9iaXQrKzsKKwkJCW5iaXRzKys7CisJCX0KKwl9CisJYmlwLT5ibGlfZm9ybWF0LmJsZl9zaXplID0gbnZlY3M7CisKKwkvKgorCSAqIENoZWNrIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIGNvbnNpc3RlbnQuCisJICovCisJeGZzX2J1Zl9pdGVtX3RyYWNlKCJGT1JNQVQgTk9STSIsIGJpcCk7CisJeGZzX2J1Zl9pdGVtX2xvZ19jaGVjayhiaXApOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gcGluIHRoZSBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBidWYgbG9nCisgKiBpdGVtIGluIG1lbW9yeSBzbyBpdCBjYW5ub3QgYmUgd3JpdHRlbiBvdXQuICBTaW1wbHkgY2FsbCBicGluKCkKKyAqIG9uIHRoZSBidWZmZXIgdG8gZG8gdGhpcy4KKyAqLwordm9pZAoreGZzX2J1Zl9pdGVtX3BpbigKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCkKK3sKKwl4ZnNfYnVmX3QJKmJwOworCisJYnAgPSBiaXAtPmJsaV9idWY7CisJQVNTRVJUKFhGU19CVUZfSVNCVVNZKGJwKSk7CisJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKKwlBU1NFUlQoKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9MT0dHRUQpIHx8CisJICAgICAgIChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfU1RBTEUpKTsKKwl4ZnNfYnVmX2l0ZW1fdHJhY2UoIlBJTiIsIGJpcCk7CisJeGZzX2J1ZnRyYWNlKCJYRlNfUElOIiwgYnApOworCXhmc19icGluKGJwKTsKK30KKworCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gdW5waW4gdGhlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZiBsb2cKKyAqIGl0ZW0gd2hpY2ggd2FzIHByZXZpb3VzbHkgcGlubmVkIHdpdGggYSBjYWxsIHRvIHhmc19idWZfaXRlbV9waW4oKS4KKyAqIEp1c3QgY2FsbCBidW5waW4oKSBvbiB0aGUgYnVmZmVyIHRvIGRvIHRoaXMuCisgKgorICogQWxzbyBkcm9wIHRoZSByZWZlcmVuY2UgdG8gdGhlIGJ1ZiBpdGVtIGZvciB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAqIElmIHRoZSBYRlNfQkxJX1NUQUxFIGZsYWcgaXMgc2V0IGFuZCB3ZSBhcmUgdGhlIGxhc3QgcmVmZXJlbmNlLAorICogdGhlbiBmcmVlIHVwIHRoZSBidWYgbG9nIGl0ZW0gYW5kIHVubG9jayB0aGUgYnVmZmVyLgorICovCit2b2lkCit4ZnNfYnVmX2l0ZW1fdW5waW4oCisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXAsCisJaW50CQkJc3RhbGUpCit7CisJeGZzX21vdW50X3QJKm1wOworCXhmc19idWZfdAkqYnA7CisJaW50CQlmcmVlZDsKKwlTUExERUNMKHMpOworCisJYnAgPSBiaXAtPmJsaV9idWY7CisJQVNTRVJUKGJwICE9IE5VTEwpOworCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2J1Zl9sb2dfaXRlbV90ICopID09IGJpcCk7CisJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKKwl4ZnNfYnVmX2l0ZW1fdHJhY2UoIlVOUElOIiwgYmlwKTsKKwl4ZnNfYnVmdHJhY2UoIlhGU19VTlBJTiIsIGJwKTsKKworCWZyZWVkID0gYXRvbWljX2RlY19hbmRfdGVzdCgmYmlwLT5ibGlfcmVmY291bnQpOworCW1wID0gYmlwLT5ibGlfaXRlbS5saV9tb3VudHA7CisJeGZzX2J1bnBpbihicCk7CisJaWYgKGZyZWVkICYmIHN0YWxlKSB7CisJCUFTU0VSVChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfU1RBTEUpOworCQlBU1NFUlQoWEZTX0JVRl9WQUxVU0VNQShicCkgPD0gMCk7CisJCUFTU0VSVCghKFhGU19CVUZfSVNERUxBWVdSSVRFKGJwKSkpOworCQlBU1NFUlQoWEZTX0JVRl9JU1NUQUxFKGJwKSk7CisJCUFTU0VSVChiaXAtPmJsaV9mb3JtYXQuYmxmX2ZsYWdzICYgWEZTX0JMSV9DQU5DRUwpOworCQl4ZnNfYnVmX2l0ZW1fdHJhY2UoIlVOUElOIFNUQUxFIiwgYmlwKTsKKwkJeGZzX2J1ZnRyYWNlKCJYRlNfVU5QSU4gU1RBTEUiLCBicCk7CisJCS8qCisJCSAqIElmIHdlIGdldCBjYWxsZWQgaGVyZSBiZWNhdXNlIG9mIGFuIElPIGVycm9yLCB3ZSBtYXkKKwkJICogb3IgbWF5IG5vdCBoYXZlIHRoZSBpdGVtIG9uIHRoZSBBSUwuIHhmc190cmFuc19kZWxldGVfYWlsKCkKKwkJICogd2lsbCB0YWtlIGNhcmUgb2YgdGhhdCBzaXR1YXRpb24uCisJCSAqIHhmc190cmFuc19kZWxldGVfYWlsKCkgZHJvcHMgdGhlIEFJTCBsb2NrLgorCQkgKi8KKwkJaWYgKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9TVEFMRV9JTk9ERSkgeworCQkJeGZzX2J1Zl9kb19jYWxsYmFja3MoYnAsICh4ZnNfbG9nX2l0ZW1fdCAqKWJpcCk7CisJCQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIE5VTEwpOworCQkJWEZTX0JVRl9DTFJfSU9ET05FX0ZVTkMoYnApOworCQl9IGVsc2UgeworCQkJQUlMX0xPQ0sobXAscyk7CisJCQl4ZnNfdHJhbnNfZGVsZXRlX2FpbChtcCwgKHhmc19sb2dfaXRlbV90ICopYmlwLCBzKTsKKwkJCXhmc19idWZfaXRlbV9yZWxzZShicCk7CisJCQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgPT0gTlVMTCk7CisJCX0KKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJfQorfQorCisvKgorICogdGhpcyBpcyBjYWxsZWQgZnJvbSB1bmNvbW1pdCBpbiB0aGUgZm9yY2VkLXNodXRkb3duIHBhdGguCisgKiB3ZSBuZWVkIHRvIGNoZWNrIHRvIHNlZSBpZiB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSBsb2cgaXRlbQorICogaXMgZ29pbmcgdG8gZHJvcCB0byB6ZXJvLiAgSWYgc28sIHVucGluIHdpbGwgZnJlZSB0aGUgbG9nIGl0ZW0KKyAqIHNvIHdlIG5lZWQgdG8gZnJlZSB0aGUgaXRlbSdzIGRlc2NyaXB0b3IgKHRoYXQgcG9pbnRzIHRvIHRoZSBpdGVtKQorICogaW4gdGhlIHRyYW5zYWN0aW9uLgorICovCit2b2lkCit4ZnNfYnVmX2l0ZW1fdW5waW5fcmVtb3ZlKAorCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwLAorCXhmc190cmFuc190CQkqdHApCit7CisJeGZzX2J1Zl90CQkqYnA7CisJeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKKwlpbnQJCQlzdGFsZSA9IDA7CisKKwlicCA9IGJpcC0+YmxpX2J1ZjsKKwkvKgorCSAqIHdpbGwgeGZzX2J1Zl9pdGVtX3VucGluKCkgY2FsbCB4ZnNfYnVmX2l0ZW1fcmVsc2UoKT8KKwkgKi8KKwlpZiAoKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPT0gMSkgJiYKKwkgICAgKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9TVEFMRSkpIHsKKwkJQVNTRVJUKFhGU19CVUZfVkFMVVNFTUEoYmlwLT5ibGlfYnVmKSA8PSAwKTsKKwkJeGZzX2J1Zl9pdGVtX3RyYWNlKCJVTlBJTiBSRU1PVkUiLCBiaXApOworCQl4ZnNfYnVmdHJhY2UoIlhGU19VTlBJTl9SRU1PVkUiLCBicCk7CisJCS8qCisJCSAqIHllcyAtLSBjbGVhciB0aGUgeGFjdGlvbiBkZXNjcmlwdG9yIGluLXVzZSBmbGFnCisJCSAqIGFuZCBmcmVlIHRoZSBjaHVuayBpZiByZXF1aXJlZC4gIFdlIGNhbiBzYWZlbHkKKwkJICogZG8gc29tZSB3b3JrIGhlcmUgYW5kIHRoZW4gY2FsbCBidWZfaXRlbV91bnBpbgorCQkgKiB0byBkbyB0aGUgcmVzdCBiZWNhdXNlIGlmIHRoZSBpZiBpcyB0cnVlLCB0aGVuCisJCSAqIHdlIGFyZSBob2xkaW5nIHRoZSBidWZmZXIgbG9ja2VkIHNvIG5vIG9uZSBlbHNlCisJCSAqIHdpbGwgYmUgYWJsZSB0byBidW1wIHVwIHRoZSByZWZjb3VudC4KKwkJICovCisJCWxpZHAgPSB4ZnNfdHJhbnNfZmluZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QgKikgYmlwKTsKKwkJc3RhbGUgPSBsaWRwLT5saWRfZmxhZ3MgJiBYRlNfTElEX0JVRl9TVEFMRTsKKwkJeGZzX3RyYW5zX2ZyZWVfaXRlbSh0cCwgbGlkcCk7CisJCS8qCisJCSAqIFNpbmNlIHRoZSB0cmFuc2FjdGlvbiBubyBsb25nZXIgcmVmZXJzIHRvIHRoZSBidWZmZXIsCisJCSAqIHRoZSBidWZmZXIgc2hvdWxkIG5vIGxvbmdlciByZWZlciB0byB0aGUgdHJhbnNhY3Rpb24uCisJCSAqLworCQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUyKGJwLCBOVUxMKTsKKwl9CisKKwl4ZnNfYnVmX2l0ZW1fdW5waW4oYmlwLCBzdGFsZSk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byBhdHRlbXB0IHRvIGxvY2sgdGhlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhpcworICogYnVmIGxvZyBpdGVtLiAgRG9uJ3Qgc2xlZXAgb24gdGhlIGJ1ZmZlciBsb2NrLiAgSWYgd2UgY2FuJ3QgZ2V0CisgKiB0aGUgbG9jayByaWdodCBhd2F5LCByZXR1cm4gMC4gIElmIHdlIGNhbiBnZXQgdGhlIGxvY2ssIHB1bGwgdGhlCisgKiBidWZmZXIgZnJvbSB0aGUgZnJlZSBsaXN0LCBtYXJrIGl0IGJ1c3ksIGFuZCByZXR1cm4gMS4KKyAqLwordWludAoreGZzX2J1Zl9pdGVtX3RyeWxvY2soCisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXApCit7CisJeGZzX2J1Zl90CSpicDsKKworCWJwID0gYmlwLT5ibGlfYnVmOworCisJaWYgKFhGU19CVUZfSVNQSU5ORUQoYnApKSB7CisJCXJldHVybiBYRlNfSVRFTV9QSU5ORUQ7CisJfQorCisJaWYgKCFYRlNfQlVGX0NQU0VNQShicCkpIHsKKwkJcmV0dXJuIFhGU19JVEVNX0xPQ0tFRDsKKwl9CisKKwkvKgorCSAqIFJlbW92ZSB0aGUgYnVmZmVyIGZyb20gdGhlIGZyZWUgbGlzdC4gIE9ubHkgZG8gdGhpcworCSAqIGlmIGl0J3Mgb24gdGhlIGZyZWUgbGlzdC4gIFByaXZhdGUgYnVmZmVycyBsaWtlIHRoZQorCSAqIHN1cGVyYmxvY2sgYnVmZmVyIGFyZSBub3QuCisJICovCisJWEZTX0JVRl9IT0xEKGJwKTsKKworCUFTU0VSVCghKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9TVEFMRSkpOworCXhmc19idWZfaXRlbV90cmFjZSgiVFJZTE9DSyBTVUNDRVNTIiwgYmlwKTsKKwlyZXR1cm4gWEZTX0lURU1fU1VDQ0VTUzsKK30KKworLyoKKyAqIFJlbGVhc2UgdGhlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZiBsb2cgaXRlbS4KKyAqIElmIHRoZXJlIGlzIG5vIGRpcnR5IGxvZ2dlZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAqIGJ1ZmZlciByZWNvcmRlZCBpbiB0aGUgYnVmIGxvZyBpdGVtLCB0aGVuIGZyZWUgdGhlCisgKiBidWYgbG9nIGl0ZW0gYW5kIHJlbW92ZSB0aGUgcmVmZXJlbmNlIHRvIGl0IGluIHRoZQorICogYnVmZmVyLgorICoKKyAqIFRoaXMgY2FsbCBpZ25vcmVzIHRoZSByZWN1cnNpb24gY291bnQuICBJdCBpcyBvbmx5IGNhbGxlZAorICogd2hlbiB0aGUgYnVmZmVyIHNob3VsZCBSRUFMTFkgYmUgdW5sb2NrZWQsIHJlZ2FyZGxlc3MKKyAqIG9mIHRoZSByZWN1cnNpb24gY291bnQuCisgKgorICogSWYgdGhlIFhGU19CTElfSE9MRCBmbGFnIGlzIHNldCBpbiB0aGUgYnVmIGxvZyBpdGVtLCB0aGVuCisgKiBmcmVlIHRoZSBsb2cgaXRlbSBpZiBuZWNlc3NhcnkgYnV0IGRvIG5vdCB1bmxvY2sgdGhlIGJ1ZmZlci4KKyAqIFRoaXMgaXMgZm9yIHN1cHBvcnQgb2YgeGZzX3RyYW5zX2Job2xkKCkuIE1ha2Ugc3VyZSB0aGUKKyAqIFhGU19CTElfSE9MRCBmaWVsZCBpcyBjbGVhcmVkIGlmIHdlIGRvbid0IGZyZWUgdGhlIGl0ZW0uCisgKi8KK3ZvaWQKK3hmc19idWZfaXRlbV91bmxvY2soCisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXApCit7CisJaW50CQlhYm9ydGVkOworCXhmc19idWZfdAkqYnA7CisJdWludAkJaG9sZDsKKworCWJwID0gYmlwLT5ibGlfYnVmOworCXhmc19idWZ0cmFjZSgiWEZTX1VOTE9DSyIsIGJwKTsKKworCS8qCisJICogQ2xlYXIgdGhlIGJ1ZmZlcidzIGFzc29jaWF0aW9uIHdpdGggdGhpcyB0cmFuc2FjdGlvbi4KKwkgKi8KKwlYRlNfQlVGX1NFVF9GU1BSSVZBVEUyKGJwLCBOVUxMKTsKKworCS8qCisJICogSWYgdGhpcyBpcyBhIHRyYW5zYWN0aW9uIGFib3J0LCBkb24ndCByZXR1cm4gZWFybHkuCisJICogSW5zdGVhZCwgYWxsb3cgdGhlIGJyZWxzZSB0byBoYXBwZW4uCisJICogTm9ybWFsbHkgaXQgd291bGQgYmUgZG9uZSBmb3Igc3RhbGUgKGNhbmNlbGxlZCkgYnVmZmVycworCSAqIGF0IHVucGluIHRpbWUsIGJ1dCB3ZSdsbCBuZXZlciBnbyB0aHJvdWdoIHRoZSBwaW4vdW5waW4KKwkgKiBjeWNsZSBpZiB3ZSBhYm9ydCBpbnNpZGUgY29tbWl0LgorCSAqLworCWFib3J0ZWQgPSAoYmlwLT5ibGlfaXRlbS5saV9mbGFncyAmIFhGU19MSV9BQk9SVEVEKSAhPSAwOworCisJLyoKKwkgKiBJZiB0aGUgYnVmIGl0ZW0gaXMgbWFya2VkIHN0YWxlLCB0aGVuIGRvbid0IGRvIGFueXRoaW5nLgorCSAqIFdlJ2xsIHVubG9jayB0aGUgYnVmZmVyIGFuZCBmcmVlIHRoZSBidWYgaXRlbSB3aGVuIHRoZQorCSAqIGJ1ZmZlciBpcyB1bnBpbm5lZCBmb3IgdGhlIGxhc3QgdGltZS4KKwkgKi8KKwlpZiAoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSB7CisJCWJpcC0+YmxpX2ZsYWdzICY9IH5YRlNfQkxJX0xPR0dFRDsKKwkJeGZzX2J1Zl9pdGVtX3RyYWNlKCJVTkxPQ0sgU1RBTEUiLCBiaXApOworCQlBU1NFUlQoYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyAmIFhGU19CTElfQ0FOQ0VMKTsKKwkJaWYgKCFhYm9ydGVkKQorCQkJcmV0dXJuOworCX0KKworCS8qCisJICogRHJvcCB0aGUgdHJhbnNhY3Rpb24ncyByZWZlcmVuY2UgdG8gdGhlIGxvZyBpdGVtIGlmCisJICogaXQgd2FzIG5vdCBsb2dnZWQgYXMgcGFydCBvZiB0aGUgdHJhbnNhY3Rpb24uICBPdGhlcndpc2UKKwkgKiB3ZSdsbCBkcm9wIHRoZSByZWZlcmVuY2UgaW4geGZzX2J1Zl9pdGVtX3VucGluKCkgd2hlbgorCSAqIHRoZSB0cmFuc2FjdGlvbiBpcyByZWFsbHkgdGhyb3VnaCB3aXRoIHRoZSBidWZmZXIuCisJICovCisJaWYgKCEoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX0xPR0dFRCkpIHsKKwkJYXRvbWljX2RlYygmYmlwLT5ibGlfcmVmY291bnQpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIENsZWFyIHRoZSBsb2dnZWQgZmxhZyBzaW5jZSB0aGlzIGlzIHBlcgorCQkgKiB0cmFuc2FjdGlvbiBzdGF0ZS4KKwkJICovCisJCWJpcC0+YmxpX2ZsYWdzICY9IH5YRlNfQkxJX0xPR0dFRDsKKwl9CisKKwkvKgorCSAqIEJlZm9yZSBwb3NzaWJseSBmcmVlaW5nIHRoZSBidWYgaXRlbSwgZGV0ZXJtaW5lIGlmIHdlIHNob3VsZAorCSAqIHJlbGVhc2UgdGhlIGJ1ZmZlciBhdCB0aGUgZW5kIG9mIHRoaXMgcm91dGluZS4KKwkgKi8KKwlob2xkID0gYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX0hPTEQ7CisJeGZzX2J1Zl9pdGVtX3RyYWNlKCJVTkxPQ0siLCBiaXApOworCisJLyoKKwkgKiBJZiB0aGUgYnVmIGl0ZW0gaXNuJ3QgdHJhY2tpbmcgYW55IGRhdGEsIGZyZWUgaXQuCisJICogT3RoZXJ3aXNlLCBpZiBYRlNfQkxJX0hPTEQgaXMgc2V0IGNsZWFyIGl0LgorCSAqLworCWlmICh4ZnNfY291bnRfYml0cyhiaXAtPmJsaV9mb3JtYXQuYmxmX2RhdGFfbWFwLAorCQkJICAgICAgYmlwLT5ibGlfZm9ybWF0LmJsZl9tYXBfc2l6ZSwgMCkgPT0gMCkgeworCQl4ZnNfYnVmX2l0ZW1fcmVsc2UoYnApOworCX0gZWxzZSBpZiAoaG9sZCkgeworCQliaXAtPmJsaV9mbGFncyAmPSB+WEZTX0JMSV9IT0xEOworCX0KKworCS8qCisJICogUmVsZWFzZSB0aGUgYnVmZmVyIGlmIFhGU19CTElfSE9MRCB3YXMgbm90IHNldC4KKwkgKi8KKwlpZiAoIWhvbGQpIHsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJfQorfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gZmluZCBvdXQgd2hlcmUgdGhlIG9sZGVzdCBhY3RpdmUgY29weSBvZiB0aGUKKyAqIGJ1ZiBsb2cgaXRlbSBpbiB0aGUgb24gZGlzayBsb2cgcmVzaWRlcyBub3cgdGhhdCB0aGUgbGFzdCBsb2cKKyAqIHdyaXRlIG9mIGl0IGNvbXBsZXRlZCBhdCB0aGUgZ2l2ZW4gbHNuLgorICogV2UgYWx3YXlzIHJlLWxvZyBhbGwgdGhlIGRpcnR5IGRhdGEgaW4gYSBidWZmZXIsIHNvIHVzdWFsbHkgdGhlCisgKiBsYXRlc3QgY29weSBpbiB0aGUgb24gZGlzayBsb2cgaXMgdGhlIG9ubHkgb25lIHRoYXQgbWF0dGVycy4gIEZvcgorICogdGhvc2UgY2FzZXMgd2Ugc2ltcGx5IHJldHVybiB0aGUgZ2l2ZW4gbHNuLgorICoKKyAqIFRoZSBvbmUgZXhjZXB0aW9uIHRvIHRoaXMgaXMgZm9yIGJ1ZmZlcnMgZnVsbCBvZiBuZXdseSBhbGxvY2F0ZWQKKyAqIGlub2Rlcy4gIFRoZXNlIGJ1ZmZlcnMgYXJlIG9ubHkgcmVsb2dnZWQgd2l0aCB0aGUgWEZTX0JMSV9JTk9ERV9CVUYKKyAqIGZsYWcgc2V0LCBpbmRpY2F0aW5nIHRoYXQgb25seSB0aGUgZGlfbmV4dF91bmxpbmtlZCBmaWVsZHMgZnJvbSB0aGUKKyAqIGlub2RlcyBpbiB0aGUgYnVmZmVycyB3aWxsIGJlIHJlcGxheWVkIGR1cmluZyByZWNvdmVyeS4gIElmIHRoZQorICogb3JpZ2luYWwgbmV3bHkgYWxsb2NhdGVkIGlub2RlIGltYWdlcyBoYXZlIG5vdCB5ZXQgYmVlbiBmbHVzaGVkCisgKiB3aGVuIHRoZSBidWZmZXIgaXMgc28gcmVsb2dnZWQsIHRoZW4gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB3ZQorICoga2VlcCB0aGUgb2xkIGltYWdlcyBpbiB0aGUgJ2FjdGl2ZScgcG9ydGlvbiBvZiB0aGUgbG9nLiAgV2UgZG8gdGhpcworICogYnkgcmV0dXJuaW5nIHRoZSBvcmlnaW5hbCBsc24gb2YgdGhhdCB0cmFuc2FjdGlvbiBoZXJlIHJhdGhlciB0aGFuCisgKiB0aGUgY3VycmVudCBvbmUuCisgKi8KK3hmc19sc25fdAoreGZzX2J1Zl9pdGVtX2NvbW1pdHRlZCgKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCwKKwl4ZnNfbHNuX3QJCWxzbikKK3sKKwl4ZnNfYnVmX2l0ZW1fdHJhY2UoIkNPTU1JVFRFRCIsIGJpcCk7CisJaWYgKChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfSU5PREVfQUxMT0NfQlVGKSAmJgorCSAgICAoYmlwLT5ibGlfaXRlbS5saV9sc24gIT0gMCkpIHsKKwkJcmV0dXJuIGJpcC0+YmxpX2l0ZW0ubGlfbHNuOworCX0KKwlyZXR1cm4gKGxzbik7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSB0cmFuc2FjdGlvbiBob2xkaW5nIHRoZSBidWZmZXIgaXMgYWJvcnRlZC4KKyAqIEp1c3QgYmVoYXZlIGFzIGlmIHRoZSB0cmFuc2FjdGlvbiBoYWQgYmVlbiBjYW5jZWxsZWQuIElmIHdlJ3JlIHNodXR0aW5nIGRvd24KKyAqIGFuZCBoYXZlIGFib3J0ZWQgdGhpcyB0cmFuc2FjdGlvbiwgd2UnbGwgdHJhcCB0aGlzIGJ1ZmZlciB3aGVuIGl0IHRyaWVzIHRvCisgKiBnZXQgd3JpdHRlbiBvdXQuCisgKi8KK3ZvaWQKK3hmc19idWZfaXRlbV9hYm9ydCgKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCkKK3sKKwl4ZnNfYnVmX3QJKmJwOworCisJYnAgPSBiaXAtPmJsaV9idWY7CisJeGZzX2J1ZnRyYWNlKCJYRlNfQUJPUlQiLCBicCk7CisJWEZTX0JVRl9TVVBFUl9TVEFMRShicCk7CisJeGZzX2J1Zl9pdGVtX3VubG9jayhiaXApOworCXJldHVybjsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIGFzeW5jaHJvbm91c2x5IHdyaXRlIHRoZSBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAqIGJ1ZiBsb2cgaXRlbSBvdXQgdG8gZGlzay4gVGhlIGJ1ZmZlciB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIGxvY2tlZCBieQorICogYSBzdWNjZXNzZnVsIGNhbGwgdG8geGZzX2J1Zl9pdGVtX3RyeWxvY2soKS4gIElmIHRoZSBidWZmZXIgc3RpbGwgaGFzCisgKiBCX0RFTFdSSSBzZXQsIHRoZW4gZ2V0IGl0IGdvaW5nIG91dCB0byBkaXNrIHdpdGggYSBjYWxsIHRvIGJhd3JpdGUoKS4KKyAqIElmIG5vdCwgdGhlbiBqdXN0IHJlbGVhc2UgdGhlIGJ1ZmZlci4KKyAqLwordm9pZAoreGZzX2J1Zl9pdGVtX3B1c2goCisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXApCit7CisJeGZzX2J1Zl90CSpicDsKKworCUFTU0VSVCghKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9TVEFMRSkpOworCXhmc19idWZfaXRlbV90cmFjZSgiUFVTSCIsIGJpcCk7CisKKwlicCA9IGJpcC0+YmxpX2J1ZjsKKworCWlmIChYRlNfQlVGX0lTREVMQVlXUklURShicCkpIHsKKwkJeGZzX2Jhd3JpdGUoYmlwLT5ibGlfaXRlbS5saV9tb3VudHAsIGJwKTsKKwl9IGVsc2UgeworCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwl9Cit9CisKKy8qIEFSR1NVU0VEICovCit2b2lkCit4ZnNfYnVmX2l0ZW1fY29tbWl0dGluZyh4ZnNfYnVmX2xvZ19pdGVtX3QgKmJpcCwgeGZzX2xzbl90IGNvbW1pdF9sc24pCit7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBvcHMgdmVjdG9yIHNoYXJlZCBieSBhbGwgYnVmIGxvZyBpdGVtcy4KKyAqLworc3RydWN0IHhmc19pdGVtX29wcyB4ZnNfYnVmX2l0ZW1fb3BzID0geworCS5pb3Bfc2l6ZQk9ICh1aW50KCopKHhmc19sb2dfaXRlbV90KikpeGZzX2J1Zl9pdGVtX3NpemUsCisJLmlvcF9mb3JtYXQJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sb2dfaW92ZWNfdCopKQorCQkJCQl4ZnNfYnVmX2l0ZW1fZm9ybWF0LAorCS5pb3BfcGluCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfYnVmX2l0ZW1fcGluLAorCS5pb3BfdW5waW4JPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIGludCkpeGZzX2J1Zl9pdGVtX3VucGluLAorCS5pb3BfdW5waW5fcmVtb3ZlID0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfdHJhbnNfdCAqKSkKKwkJCQkJeGZzX2J1Zl9pdGVtX3VucGluX3JlbW92ZSwKKwkuaW9wX3RyeWxvY2sJPSAodWludCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19idWZfaXRlbV90cnlsb2NrLAorCS5pb3BfdW5sb2NrCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfYnVmX2l0ZW1fdW5sb2NrLAorCS5pb3BfY29tbWl0dGVkCT0gKHhmc19sc25fdCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sc25fdCkpCisJCQkJCXhmc19idWZfaXRlbV9jb21taXR0ZWQsCisJLmlvcF9wdXNoCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfYnVmX2l0ZW1fcHVzaCwKKwkuaW9wX2Fib3J0CT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfYnVmX2l0ZW1fYWJvcnQsCisJLmlvcF9wdXNoYnVmCT0gTlVMTCwKKwkuaW9wX2NvbW1pdHRpbmcgPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sc25fdCkpCisJCQkJCXhmc19idWZfaXRlbV9jb21taXR0aW5nCit9OworCisKKy8qCisgKiBBbGxvY2F0ZSBhIG5ldyBidWYgbG9nIGl0ZW0gdG8gZ28gd2l0aCB0aGUgZ2l2ZW4gYnVmZmVyLgorICogU2V0IHRoZSBidWZmZXIncyBiX2ZzcHJpdmF0ZSBmaWVsZCB0byBwb2ludCB0byB0aGUgbmV3CisgKiBidWYgbG9nIGl0ZW0uICBJZiB0aGVyZSBhcmUgb3RoZXIgaXRlbSdzIGF0dGFjaGVkIHRvIHRoZQorICogYnVmZmVyIChzZWUgeGZzX2J1Zl9hdHRhY2hfaW9kb25lKCkgYmVsb3cpLCB0aGVuIHB1dCB0aGUKKyAqIGJ1ZiBsb2cgaXRlbSBhdCB0aGUgZnJvbnQuCisgKi8KK3ZvaWQKK3hmc19idWZfaXRlbV9pbml0KAorCXhmc19idWZfdAkqYnAsCisJeGZzX21vdW50X3QJKm1wKQoreworCXhmc19sb2dfaXRlbV90CQkqbGlwOworCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwOworCWludAkJCWNodW5rczsKKwlpbnQJCQltYXBfc2l6ZTsKKworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGFscmVhZHkgYSBidWYgbG9nIGl0ZW0gZm9yCisJICogdGhpcyBidWZmZXIuICBJZiB0aGVyZSBpcywgaXQgaXMgZ3VhcmFudGVlZCB0byBiZQorCSAqIHRoZSBmaXJzdC4gIElmIHdlIGRvIGFscmVhZHkgaGF2ZSBvbmUsIHRoZXJlIGlzCisJICogbm90aGluZyB0byBkbyBoZXJlIHNvIHJldHVybi4KKwkgKi8KKwlpZiAoWEZTX0JVRl9GU1BSSVZBVEUzKGJwLCB4ZnNfbW91bnRfdCAqKSAhPSBtcCkKKwkJWEZTX0JVRl9TRVRfRlNQUklWQVRFMyhicCwgbXApOworCVhGU19CVUZfU0VUX0JEU1RSQVRfRlVOQyhicCwgeGZzX2Jkc3RyYXRfY2IpOworCWlmIChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSAhPSBOVUxMKSB7CisJCWxpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfbG9nX2l0ZW1fdCAqKTsKKwkJaWYgKGxpcC0+bGlfdHlwZSA9PSBYRlNfTElfQlVGKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKgorCSAqIGNodW5rcyBpcyB0aGUgbnVtYmVyIG9mIFhGU19CTElfQ0hVTksgc2l6ZSBwaWVjZXMKKwkgKiB0aGUgYnVmZmVyIGNhbiBiZSBkaXZpZGVkIGludG8uIE1ha2Ugc3VyZSBub3QgdG8KKwkgKiB0cnVuY2F0ZSBhbnkgcGllY2VzLiAgbWFwX3NpemUgaXMgdGhlIHNpemUgb2YgdGhlCisJICogYml0bWFwIG5lZWRlZCB0byBkZXNjcmliZSB0aGUgY2h1bmtzIG9mIHRoZSBidWZmZXIuCisJICovCisJY2h1bmtzID0gKGludCkoKFhGU19CVUZfQ09VTlQoYnApICsgKFhGU19CTElfQ0hVTksgLSAxKSkgPj4gWEZTX0JMSV9TSElGVCk7CisJbWFwX3NpemUgPSAoaW50KSgoY2h1bmtzICsgTkJXT1JEKSA+PiBCSVRfVE9fV09SRF9TSElGVCk7CisKKwliaXAgPSAoeGZzX2J1Zl9sb2dfaXRlbV90KilrbWVtX3pvbmVfemFsbG9jKHhmc19idWZfaXRlbV96b25lLAorCQkJCQkJICAgIEtNX1NMRUVQKTsKKwliaXAtPmJsaV9pdGVtLmxpX3R5cGUgPSBYRlNfTElfQlVGOworCWJpcC0+YmxpX2l0ZW0ubGlfb3BzID0gJnhmc19idWZfaXRlbV9vcHM7CisJYmlwLT5ibGlfaXRlbS5saV9tb3VudHAgPSBtcDsKKwliaXAtPmJsaV9idWYgPSBicDsKKwliaXAtPmJsaV9mb3JtYXQuYmxmX3R5cGUgPSBYRlNfTElfQlVGOworCWJpcC0+YmxpX2Zvcm1hdC5ibGZfYmxrbm8gPSAoX19pbnQ2NF90KVhGU19CVUZfQUREUihicCk7CisJYmlwLT5ibGlfZm9ybWF0LmJsZl9sZW4gPSAodXNob3J0KUJUT0JCKFhGU19CVUZfQ09VTlQoYnApKTsKKwliaXAtPmJsaV9mb3JtYXQuYmxmX21hcF9zaXplID0gbWFwX3NpemU7CisjaWZkZWYgWEZTX0JMSV9UUkFDRQorCWJpcC0+YmxpX3RyYWNlID0ga3RyYWNlX2FsbG9jKFhGU19CTElfVFJBQ0VfU0laRSwgS01fU0xFRVApOworI2VuZGlmCisKKyNpZmRlZiBYRlNfVFJBTlNfREVCVUcKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBhcnJheXMgZm9yIHRyYWNraW5nIHdoYXQgbmVlZHMgdG8gYmUgbG9nZ2VkCisJICogYW5kIHdoYXQgb3VyIGNhbGxlcnMgcmVxdWVzdCB0byBiZSBsb2dnZWQuICBibGlfb3JpZworCSAqIGhvbGRzIGEgY29weSBvZiB0aGUgb3JpZ2luYWwsIGNsZWFuIGJ1ZmZlciBmb3IgY29tcGFyaXNvbgorCSAqIGFnYWluc3QsIGFuZCBibGlfbG9nZ2VkIGtlZXBzIGEgMSBiaXQgZmxhZyBwZXIgYnl0ZSBpbgorCSAqIHRoZSBidWZmZXIgdG8gaW5kaWNhdGUgd2hpY2ggYnl0ZXMgdGhlIGNhbGxlcnMgaGF2ZSBhc2tlZAorCSAqIHRvIGhhdmUgbG9nZ2VkLgorCSAqLworCWJpcC0+YmxpX29yaWcgPSAoY2hhciAqKWttZW1fYWxsb2MoWEZTX0JVRl9DT1VOVChicCksIEtNX1NMRUVQKTsKKwltZW1jcHkoYmlwLT5ibGlfb3JpZywgWEZTX0JVRl9QVFIoYnApLCBYRlNfQlVGX0NPVU5UKGJwKSk7CisJYmlwLT5ibGlfbG9nZ2VkID0gKGNoYXIgKilrbWVtX3phbGxvYyhYRlNfQlVGX0NPVU5UKGJwKSAvIE5CQlksIEtNX1NMRUVQKTsKKyNlbmRpZgorCisJLyoKKwkgKiBQdXQgdGhlIGJ1ZiBpdGVtIGludG8gdGhlIGxpc3Qgb2YgaXRlbXMgYXR0YWNoZWQgdG8gdGhlCisJICogYnVmZmVyIGF0IHRoZSBmcm9udC4KKwkgKi8KKwlpZiAoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgIT0gTlVMTCkgeworCQliaXAtPmJsaV9pdGVtLmxpX2Jpb19saXN0ID0KKwkJCQlYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2xvZ19pdGVtX3QgKik7CisJfQorCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgYmlwKTsKK30KKworCisvKgorICogTWFyayBieXRlcyBmaXJzdCB0aHJvdWdoIGxhc3QgaW5jbHVzaXZlIGFzIGRpcnR5IGluIHRoZSBidWYKKyAqIGl0ZW0ncyBiaXRtYXAuCisgKi8KK3ZvaWQKK3hmc19idWZfaXRlbV9sb2coCisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXAsCisJdWludAkJCWZpcnN0LAorCXVpbnQJCQlsYXN0KQoreworCXVpbnQJCWZpcnN0X2JpdDsKKwl1aW50CQlsYXN0X2JpdDsKKwl1aW50CQliaXRzX3RvX3NldDsKKwl1aW50CQliaXRzX3NldDsKKwl1aW50CQl3b3JkX251bTsKKwl1aW50CQkqd29yZHA7CisJdWludAkJYml0OworCXVpbnQJCWVuZF9iaXQ7CisJdWludAkJbWFzazsKKworCS8qCisJICogTWFyayB0aGUgaXRlbSBhcyBoYXZpbmcgc29tZSBkaXJ0eSBkYXRhIGZvcgorCSAqIHF1aWNrIHJlZmVyZW5jZSBpbiB4ZnNfYnVmX2l0ZW1fZGlydHkuCisJICovCisJYmlwLT5ibGlfZmxhZ3MgfD0gWEZTX0JMSV9ESVJUWTsKKworCS8qCisJICogQ29udmVydCBieXRlIG9mZnNldHMgdG8gYml0IG51bWJlcnMuCisJICovCisJZmlyc3RfYml0ID0gZmlyc3QgPj4gWEZTX0JMSV9TSElGVDsKKwlsYXN0X2JpdCA9IGxhc3QgPj4gWEZTX0JMSV9TSElGVDsKKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgYml0cyB0byBiZSBzZXQuCisJICovCisJYml0c190b19zZXQgPSBsYXN0X2JpdCAtIGZpcnN0X2JpdCArIDE7CisKKwkvKgorCSAqIEdldCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHdvcmQgaW4gdGhlIGJpdG1hcAorCSAqIHRvIHNldCBhIGJpdCBpbi4KKwkgKi8KKwl3b3JkX251bSA9IGZpcnN0X2JpdCA+PiBCSVRfVE9fV09SRF9TSElGVDsKKwl3b3JkcCA9ICYoYmlwLT5ibGlfZm9ybWF0LmJsZl9kYXRhX21hcFt3b3JkX251bV0pOworCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHN0YXJ0aW5nIGJpdCBpbiB0aGUgZmlyc3Qgd29yZC4KKwkgKi8KKwliaXQgPSBmaXJzdF9iaXQgJiAodWludCkoTkJXT1JEIC0gMSk7CisKKwkvKgorCSAqIEZpcnN0IHNldCBhbnkgYml0cyBpbiB0aGUgZmlyc3Qgd29yZCBvZiBvdXIgcmFuZ2UuCisJICogSWYgaXQgc3RhcnRzIGF0IGJpdCAwIG9mIHRoZSB3b3JkLCBpdCB3aWxsIGJlCisJICogc2V0IGJlbG93IHJhdGhlciB0aGFuIGhlcmUuICBUaGF0IGlzIHdoYXQgdGhlIHZhcmlhYmxlCisJICogYml0IHRlbGxzIHVzLiBUaGUgdmFyaWFibGUgYml0c19zZXQgdHJhY2tzIHRoZSBudW1iZXIKKwkgKiBvZiBiaXRzIHRoYXQgaGF2ZSBiZWVuIHNldCBzbyBmYXIuICBFbmRfYml0IGlzIHRoZSBudW1iZXIKKwkgKiBvZiB0aGUgbGFzdCBiaXQgdG8gYmUgc2V0IGluIHRoaXMgd29yZCBwbHVzIG9uZS4KKwkgKi8KKwlpZiAoYml0KSB7CisJCWVuZF9iaXQgPSBNSU4oYml0ICsgYml0c190b19zZXQsICh1aW50KU5CV09SRCk7CisJCW1hc2sgPSAoKDEgPDwgKGVuZF9iaXQgLSBiaXQpKSAtIDEpIDw8IGJpdDsKKwkJKndvcmRwIHw9IG1hc2s7CisJCXdvcmRwKys7CisJCWJpdHNfc2V0ID0gZW5kX2JpdCAtIGJpdDsKKwl9IGVsc2UgeworCQliaXRzX3NldCA9IDA7CisJfQorCisJLyoKKwkgKiBOb3cgc2V0IGJpdHMgYSB3aG9sZSB3b3JkIGF0IGEgdGltZSB0aGF0IGFyZSBiZXR3ZWVuCisJICogZmlyc3RfYml0IGFuZCBsYXN0X2JpdC4KKwkgKi8KKwl3aGlsZSAoKGJpdHNfdG9fc2V0IC0gYml0c19zZXQpID49IE5CV09SRCkgeworCQkqd29yZHAgfD0gMHhmZmZmZmZmZjsKKwkJYml0c19zZXQgKz0gTkJXT1JEOworCQl3b3JkcCsrOworCX0KKworCS8qCisJICogRmluYWxseSwgc2V0IGFueSBiaXRzIGxlZnQgdG8gYmUgc2V0IGluIG9uZSBsYXN0IHBhcnRpYWwgd29yZC4KKwkgKi8KKwllbmRfYml0ID0gYml0c190b19zZXQgLSBiaXRzX3NldDsKKwlpZiAoZW5kX2JpdCkgeworCQltYXNrID0gKDEgPDwgZW5kX2JpdCkgLSAxOworCQkqd29yZHAgfD0gbWFzazsKKwl9CisKKwl4ZnNfYnVmX2l0ZW1fbG9nX2RlYnVnKGJpcCwgZmlyc3QsIGxhc3QpOworfQorCisKKy8qCisgKiBSZXR1cm4gMSBpZiB0aGUgYnVmZmVyIGhhcyBzb21lIGRhdGEgdGhhdCBoYXMgYmVlbiBsb2dnZWQgKGF0IGFueQorICogcG9pbnQsIG5vdCBqdXN0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uKSBhbmQgMCBpZiBub3QuCisgKi8KK3VpbnQKK3hmc19idWZfaXRlbV9kaXJ0eSgKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCkKK3sKKwlyZXR1cm4gKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9ESVJUWSk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBidWYgbG9nIGl0ZW0gaXMgbm8gbG9uZ2VyIG5lZWRlZC4gIEl0IHNob3VsZAorICogZnJlZSB0aGUgYnVmIGxvZyBpdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYnVmZmVyIGFuZCBjbGVhcgorICogdGhlIGJ1ZmZlcidzIHBvaW50ZXIgdG8gdGhlIGJ1ZiBsb2cgaXRlbS4gIElmIHRoZXJlIGFyZSBubyBtb3JlCisgKiBpdGVtcyBpbiB0aGUgbGlzdCwgY2xlYXIgdGhlIGJfaW9kb25lIGZpZWxkIG9mIHRoZSBidWZmZXIgKHNlZQorICogeGZzX2J1Zl9hdHRhY2hfaW9kb25lKCkgYmVsb3cpLgorICovCit2b2lkCit4ZnNfYnVmX2l0ZW1fcmVsc2UoCisJeGZzX2J1Zl90CSpicCkKK3sKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKKworCXhmc19idWZ0cmFjZSgiWEZTX1JFTFNFIiwgYnApOworCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QqKTsKKwlYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIGJpcC0+YmxpX2l0ZW0ubGlfYmlvX2xpc3QpOworCWlmICgoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgPT0gTlVMTCkgJiYKKwkgICAgKFhGU19CVUZfSU9ET05FX0ZVTkMoYnApICE9IE5VTEwpKSB7CisJCUFTU0VSVCgoWEZTX0JVRl9JU1VOSU5JVElBTChicCkpID09IDApOworCQlYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhicCk7CisJfQorCisjaWZkZWYgWEZTX1RSQU5TX0RFQlVHCisJa21lbV9mcmVlKGJpcC0+YmxpX29yaWcsIFhGU19CVUZfQ09VTlQoYnApKTsKKwliaXAtPmJsaV9vcmlnID0gTlVMTDsKKwlrbWVtX2ZyZWUoYmlwLT5ibGlfbG9nZ2VkLCBYRlNfQlVGX0NPVU5UKGJwKSAvIE5CQlkpOworCWJpcC0+YmxpX2xvZ2dlZCA9IE5VTEw7CisjZW5kaWYgLyogWEZTX1RSQU5TX0RFQlVHICovCisKKyNpZmRlZiBYRlNfQkxJX1RSQUNFCisJa3RyYWNlX2ZyZWUoYmlwLT5ibGlfdHJhY2UpOworI2VuZGlmCisJa21lbV96b25lX2ZyZWUoeGZzX2J1Zl9pdGVtX3pvbmUsIGJpcCk7Cit9CisKKworLyoKKyAqIEFkZCB0aGUgZ2l2ZW4gbG9nIGl0ZW0gd2l0aCBpdHMgY2FsbGJhY2sgdG8gdGhlIGxpc3Qgb2YgY2FsbGJhY2tzCisgKiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgYnVmZmVyJ3MgSS9PIGNvbXBsZXRlcy4gIElmIGl0IGlzIG5vdCBzZXQKKyAqIGFscmVhZHksIHNldCB0aGUgYnVmZmVyJ3MgYl9pb2RvbmUoKSByb3V0aW5lIHRvIGJlCisgKiB4ZnNfYnVmX2lvZG9uZV9jYWxsYmFja3MoKSBhbmQgbGluayB0aGUgbG9nIGl0ZW0gaW50byB0aGUgbGlzdCBvZgorICogaXRlbXMgcm9vdGVkIGF0IGJfZnNwcml2YXRlLiAgSXRlbXMgYXJlIGFsd2F5cyBhZGRlZCBhcyB0aGUgc2Vjb25kCisgKiBlbnRyeSBpbiB0aGUgbGlzdCBpZiB0aGVyZSBpcyBhIGZpcnN0LCBiZWNhdXNlIHRoZSBidWYgaXRlbSBjb2RlCisgKiBhc3N1bWVzIHRoYXQgdGhlIGJ1ZiBsb2cgaXRlbSBpcyBmaXJzdC4KKyAqLwordm9pZAoreGZzX2J1Zl9hdHRhY2hfaW9kb25lKAorCXhmc19idWZfdAkqYnAsCisJdm9pZAkJKCpjYikoeGZzX2J1Zl90ICosIHhmc19sb2dfaXRlbV90ICopLAorCXhmc19sb2dfaXRlbV90CSpsaXApCit7CisJeGZzX2xvZ19pdGVtX3QJKmhlYWRfbGlwOworCisJQVNTRVJUKFhGU19CVUZfSVNCVVNZKGJwKSk7CisJQVNTRVJUKFhGU19CVUZfVkFMVVNFTUEoYnApIDw9IDApOworCisJbGlwLT5saV9jYiA9IGNiOworCWlmIChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSAhPSBOVUxMKSB7CisJCWhlYWRfbGlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19sb2dfaXRlbV90ICopOworCQlsaXAtPmxpX2Jpb19saXN0ID0gaGVhZF9saXAtPmxpX2Jpb19saXN0OworCQloZWFkX2xpcC0+bGlfYmlvX2xpc3QgPSBsaXA7CisJfSBlbHNlIHsKKwkJWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCBsaXApOworCX0KKworCUFTU0VSVCgoWEZTX0JVRl9JT0RPTkVfRlVOQyhicCkgPT0geGZzX2J1Zl9pb2RvbmVfY2FsbGJhY2tzKSB8fAorCSAgICAgICAoWEZTX0JVRl9JT0RPTkVfRlVOQyhicCkgPT0gTlVMTCkpOworCVhGU19CVUZfU0VUX0lPRE9ORV9GVU5DKGJwLCB4ZnNfYnVmX2lvZG9uZV9jYWxsYmFja3MpOworfQorCitTVEFUSUMgdm9pZAoreGZzX2J1Zl9kb19jYWxsYmFja3MoCisJeGZzX2J1Zl90CSpicCwKKwl4ZnNfbG9nX2l0ZW1fdAkqbGlwKQoreworCXhmc19sb2dfaXRlbV90CSpubGlwOworCisJd2hpbGUgKGxpcCAhPSBOVUxMKSB7CisJCW5saXAgPSBsaXAtPmxpX2Jpb19saXN0OworCQlBU1NFUlQobGlwLT5saV9jYiAhPSBOVUxMKTsKKwkJLyoKKwkJICogQ2xlYXIgdGhlIG5leHQgcG9pbnRlciBzbyB3ZSBkb24ndCBoYXZlIGFueQorCQkgKiBjb25mdXNpb24gaWYgdGhlIGl0ZW0gaXMgYWRkZWQgdG8gYW5vdGhlciBidWYuCisJCSAqIERvbid0IHRvdWNoIHRoZSBsb2cgaXRlbSBhZnRlciBjYWxsaW5nIGl0cworCQkgKiBjYWxsYmFjaywgYmVjYXVzZSBpdCBjb3VsZCBoYXZlIGZyZWVkIGl0c2VsZi4KKwkJICovCisJCWxpcC0+bGlfYmlvX2xpc3QgPSBOVUxMOworCQlsaXAtPmxpX2NiKGJwLCBsaXApOworCQlsaXAgPSBubGlwOworCX0KK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGlvZG9uZSgpIGZ1bmN0aW9uIGZvciBidWZmZXJzIHdoaWNoIGhhdmUgaGFkIGNhbGxiYWNrcworICogYXR0YWNoZWQgdG8gdGhlbSBieSB4ZnNfYnVmX2F0dGFjaF9pb2RvbmUoKS4gIEl0IHNob3VsZCByZW1vdmUgZWFjaAorICogbG9nIGl0ZW0gZnJvbSB0aGUgYnVmZmVyJ3MgbGlzdCBhbmQgY2FsbCB0aGUgY2FsbGJhY2sgb2YgZWFjaCBpbiB0dXJuLgorICogV2hlbiBkb25lLCB0aGUgYnVmZmVyJ3MgZnNwcml2YXRlIGZpZWxkIGlzIHNldCB0byBOVUxMIGFuZCB0aGUgYnVmZmVyCisgKiBpcyB1bmxvY2tlZCB3aXRoIGEgY2FsbCB0byBpb2RvbmUoKS4KKyAqLwordm9pZAoreGZzX2J1Zl9pb2RvbmVfY2FsbGJhY2tzKAorCXhmc19idWZfdAkqYnApCit7CisJeGZzX2xvZ19pdGVtX3QJKmxpcDsKKwlzdGF0aWMgdWxvbmcJbGFzdHRpbWU7CisJc3RhdGljIHhmc19idWZ0YXJnX3QgKmxhc3R0YXJnOworCXhmc19tb3VudF90CSptcDsKKworCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSAhPSBOVUxMKTsKKwlsaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2xvZ19pdGVtX3QgKik7CisKKwlpZiAoWEZTX0JVRl9HRVRFUlJPUihicCkgIT0gMCkgeworCQkvKgorCQkgKiBJZiB3ZSd2ZSBhbHJlYWR5IGRlY2lkZWQgdG8gc2h1dGRvd24gdGhlIGZpbGVzeXN0ZW0KKwkJICogYmVjYXVzZSBvZiBJTyBlcnJvcnMsIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gZ2l2aW5nIHRoaXMKKwkJICogYSByZXRyeS4KKwkJICovCisJCW1wID0gbGlwLT5saV9tb3VudHA7CisJCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgeworCQkJQVNTRVJUKFhGU19CVUZfVEFSR0VUKGJwKSA9PSBtcC0+bV9kZGV2X3RhcmdwKTsKKwkJCVhGU19CVUZfU1VQRVJfU1RBTEUoYnApOworCQkJeGZzX2J1ZnRyYWNlKCJCVUZfSU9ET05FX0NCIiwgYnApOworCQkJeGZzX2J1Zl9kb19jYWxsYmFja3MoYnAsIGxpcCk7CisJCQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIE5VTEwpOworCQkJWEZTX0JVRl9DTFJfSU9ET05FX0ZVTkMoYnApOworCisJCQkvKgorCQkJICogWEZTX1NIVVQgZmxhZyBnZXRzIHNldCB3aGVuIHdlIGdvIHRocnUgdGhlCisJCQkgKiBlbnRpcmUgYnVmZmVyIGNhY2hlIGFuZCBkZWxpYmVyYXRlbHkgc3RhcnQKKwkJCSAqIHRocm93aW5nIGF3YXkgZGVsYXllZCB3cml0ZSBidWZmZXJzLgorCQkJICogU2luY2UgdGhlcmUncyBubyBiaW93YWl0IGRvbmUgb24gdGhvc2UsCisJCQkgKiB3ZSBzaG91bGQganVzdCBicmVsc2UgdGhlbS4KKwkJCSAqLworCQkJaWYgKFhGU19CVUZfSVNTSFVUKGJwKSkgeworCQkJICAgIFhGU19CVUZfVU5TSFVUKGJwKTsKKwkJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJCX0gZWxzZSB7CisJCQkJeGZzX2Jpb2RvbmUoYnApOworCQkJfQorCisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoKFhGU19CVUZfVEFSR0VUKGJwKSAhPSBsYXN0dGFyZykgfHwKKwkJICAgICh0aW1lX2FmdGVyKGppZmZpZXMsIChsYXN0dGltZSArIDUqSFopKSkpIHsKKwkJCWxhc3R0aW1lID0gamlmZmllczsKKwkJCXByZGV2KCJYRlMgd3JpdGUgZXJyb3IgaW4gZmlsZSBzeXN0ZW0gbWV0YS1kYXRhICIKKwkJCSAgICAgICJibG9jayAweCVsbHggaW4gJXMiLAorCQkJICAgICAgWEZTX0JVRl9UQVJHRVQoYnApLAorCQkJICAgICAgKF9fdWludDY0X3QpWEZTX0JVRl9BRERSKGJwKSwgbXAtPm1fZnNuYW1lKTsKKwkJfQorCQlsYXN0dGFyZyA9IFhGU19CVUZfVEFSR0VUKGJwKTsKKworCQlpZiAoWEZTX0JVRl9JU0FTWU5DKGJwKSkgeworCQkJLyoKKwkJCSAqIElmIHRoZSB3cml0ZSB3YXMgYXN5bmNocm9ub3VzIHRoZW4gbm9vbmUgd2lsbCBiZQorCQkJICogbG9va2luZyBmb3IgdGhlIGVycm9yLiAgQ2xlYXIgdGhlIGVycm9yIHN0YXRlCisJCQkgKiBhbmQgd3JpdGUgdGhlIGJ1ZmZlciBvdXQgYWdhaW4gZGVsYXllZCB3cml0ZS4KKwkJCSAqCisJCQkgKiBYWFhzdXAgVGhpcyBpcyBPSywgc28gbG9uZyBhcyB3ZSBjYXRjaCB0aGVzZQorCQkJICogYmVmb3JlIHdlIHN0YXJ0IHRoZSB1bW91bnQ7IHdlIGRvbid0IHdhbnQgdGhlc2UKKwkJCSAqIERFTFdSSSBtZXRhZGF0YSBidWZzIHRvIGJlIGhhbmdpbmcgYXJvdW5kLgorCQkJICovCisJCQlYRlNfQlVGX0VSUk9SKGJwLDApOyAvKiBlcnJubyBvZiAwIHVuc2V0cyB0aGUgZmxhZyAqLworCisJCQlpZiAoIShYRlNfQlVGX0lTU1RBTEUoYnApKSkgeworCQkJCVhGU19CVUZfREVMQVlXUklURShicCk7CisJCQkJWEZTX0JVRl9ET05FKGJwKTsKKwkJCQlYRlNfQlVGX1NFVF9TVEFSVChicCk7CisJCQl9CisJCQlBU1NFUlQoWEZTX0JVRl9JT0RPTkVfRlVOQyhicCkpOworCQkJeGZzX2J1ZnRyYWNlKCJCVUZfSU9ET05FIEFTWU5DIiwgYnApOworCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogSWYgdGhlIHdyaXRlIG9mIHRoZSBidWZmZXIgd2FzIG5vdCBhc3luY2hyb25vdXMsCisJCQkgKiB0aGVuIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRvIHJldHVybiB0aGUgZXJyb3IKKwkJCSAqIHRvIHRoZSBjYWxsZXIgb2YgYndyaXRlKCkuICBCZWNhdXNlIG9mIHRoaXMgd2UKKwkJCSAqIGNhbm5vdCBjbGVhciB0aGUgQl9FUlJPUiBzdGF0ZSBhdCB0aGlzIHBvaW50LgorCQkJICogSW5zdGVhZCB3ZSBpbnN0YWxsIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdAorCQkJICogd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgYnVmZmVyIGlzIHJlbGVhc2VkLCBhbmQKKwkJCSAqIHRoYXQgcm91dGluZSB3aWxsIGNsZWFyIHRoZSBlcnJvciBzdGF0ZSBhbmQKKwkJCSAqIHNldCB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gb3V0IGFnYWluIGFmdGVyCisJCQkgKiBzb21lIGRlbGF5LgorCQkJICovCisJCQkvKiBXZSBhY3R1YWxseSBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGItcmVsc2UKKwkJCSAgIGZ1bmN0aW9uIGF0IHRpbWVzLCBidXQgd2UncmUgZ29ubmEgYmUgc2h1dHRpbmcgZG93bgorCQkJICAgYW55d2F5LiAqLworCQkJWEZTX0JVRl9TRVRfQlJFTFNFX0ZVTkMoYnAseGZzX2J1Zl9lcnJvcl9yZWxzZSk7CisJCQlYRlNfQlVGX0RPTkUoYnApOworCQkJWEZTX0JVRl9WX0lPRE9ORVNFTUEoYnApOworCQl9CisJCXJldHVybjsKKwl9CisjaWZkZWYgWEZTRVJST1JERUJVRworCXhmc19idWZ0cmFjZSgiWEZTIEJVRkNCIE5PRVJSIiwgYnApOworI2VuZGlmCisJeGZzX2J1Zl9kb19jYWxsYmFja3MoYnAsIGxpcCk7CisJWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCBOVUxMKTsKKwlYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhicCk7CisJeGZzX2Jpb2RvbmUoYnApOworfQorCisvKgorICogVGhpcyBpcyBhIGNhbGxiYWNrIHJvdXRpbmUgYXR0YWNoZWQgdG8gYSBidWZmZXIgd2hpY2ggZ2V0cyBhbiBlcnJvcgorICogd2hlbiBiZWluZyB3cml0dGVuIG91dCBzeW5jaHJvbm91c2x5LgorICovCitTVEFUSUMgdm9pZAoreGZzX2J1Zl9lcnJvcl9yZWxzZSgKKwl4ZnNfYnVmX3QJKmJwKQoreworCXhmc19sb2dfaXRlbV90CSpsaXA7CisJeGZzX21vdW50X3QJKm1wOworCisJbGlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19sb2dfaXRlbV90ICopOworCW1wID0gKHhmc19tb3VudF90ICopbGlwLT5saV9tb3VudHA7CisJQVNTRVJUKFhGU19CVUZfVEFSR0VUKGJwKSA9PSBtcC0+bV9kZGV2X3RhcmdwKTsKKworCVhGU19CVUZfU1RBTEUoYnApOworCVhGU19CVUZfRE9ORShicCk7CisJWEZTX0JVRl9VTkRFTEFZV1JJVEUoYnApOworCVhGU19CVUZfRVJST1IoYnAsMCk7CisJeGZzX2J1ZnRyYWNlKCJCVUZfRVJST1JfUkVMU0UiLCBicCk7CisJaWYgKCEgWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgWEZTX01FVEFEQVRBX0lPX0VSUk9SKTsKKwkvKgorCSAqIFdlIGhhdmUgdG8gdW5waW4gdGhlIHBpbm5lZCBidWZmZXJzIHNvIGRvIHRoZQorCSAqIGNhbGxiYWNrcy4KKwkgKi8KKwl4ZnNfYnVmX2RvX2NhbGxiYWNrcyhicCwgbGlwKTsKKwlYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIE5VTEwpOworCVhGU19CVUZfQ0xSX0lPRE9ORV9GVU5DKGJwKTsKKwlYRlNfQlVGX1NFVF9CUkVMU0VfRlVOQyhicCxOVUxMKTsKKwl4ZnNfYnVmX3JlbHNlKGJwKTsKK30KKworCisvKgorICogVGhpcyBpcyB0aGUgaW9kb25lKCkgZnVuY3Rpb24gZm9yIGJ1ZmZlcnMgd2hpY2ggaGF2ZSBiZWVuCisgKiBsb2dnZWQuICBJdCBpcyBjYWxsZWQgd2hlbiB0aGV5IGFyZSBldmVudHVhbGx5IGZsdXNoZWQgb3V0LgorICogSXQgc2hvdWxkIHJlbW92ZSB0aGUgYnVmIGl0ZW0gZnJvbSB0aGUgQUlMLCBhbmQgZnJlZSB0aGUgYnVmIGl0ZW0uCisgKiBJdCBpcyBjYWxsZWQgYnkgeGZzX2J1Zl9pb2RvbmVfY2FsbGJhY2tzKCkgYWJvdmUgd2hpY2ggd2lsbCB0YWtlCisgKiBjYXJlIG9mIGNsZWFuaW5nIHVwIHRoZSBidWZmZXIgaXRzZWxmLgorICovCisvKiBBUkdTVVNFRCAqLwordm9pZAoreGZzX2J1Zl9pb2RvbmUoCisJeGZzX2J1Zl90CQkqYnAsCisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXApCit7CisJc3RydWN0IHhmc19tb3VudAkqbXA7CisJU1BMREVDTChzKTsKKworCUFTU0VSVChiaXAtPmJsaV9idWYgPT0gYnApOworCisJbXAgPSBiaXAtPmJsaV9pdGVtLmxpX21vdW50cDsKKworCS8qCisJICogSWYgd2UgYXJlIGZvcmNpYmx5IHNodXR0aW5nIGRvd24sIHRoaXMgbWF5IHdlbGwgYmUKKwkgKiBvZmYgdGhlIEFJTCBhbHJlYWR5LiBUaGF0J3MgYmVjYXVzZSB3ZSBzaW11bGF0ZSB0aGUKKwkgKiBsb2ctY29tbWl0dGVkIGNhbGxiYWNrcyB0byB1bnBpbiB0aGVzZSBidWZmZXJzLiBPciB3ZSBtYXkgbmV2ZXIKKwkgKiBoYXZlIHB1dCB0aGlzIGl0ZW0gb24gQUlMIGJlY2F1c2Ugb2YgdGhlIHRyYW5zYWN0aW9uIHdhcworCSAqIGFib3J0ZWQgZm9yY2libHkuIHhmc190cmFuc19kZWxldGVfYWlsKCkgdGFrZXMgY2FyZSBvZiB0aGVzZS4KKwkgKgorCSAqIEVpdGhlciB3YXksIEFJTCBpcyB1c2VsZXNzIGlmIHdlJ3JlIGZvcmNpbmcgYSBzaHV0ZG93bi4KKwkgKi8KKwlBSUxfTE9DSyhtcCxzKTsKKwkvKgorCSAqIHhmc190cmFuc19kZWxldGVfYWlsKCkgZHJvcHMgdGhlIEFJTCBsb2NrLgorCSAqLworCXhmc190cmFuc19kZWxldGVfYWlsKG1wLCAoeGZzX2xvZ19pdGVtX3QgKiliaXAsIHMpOworCisjaWZkZWYgWEZTX1RSQU5TX0RFQlVHCisJa21lbV9mcmVlKGJpcC0+YmxpX29yaWcsIFhGU19CVUZfQ09VTlQoYnApKTsKKwliaXAtPmJsaV9vcmlnID0gTlVMTDsKKwlrbWVtX2ZyZWUoYmlwLT5ibGlfbG9nZ2VkLCBYRlNfQlVGX0NPVU5UKGJwKSAvIE5CQlkpOworCWJpcC0+YmxpX2xvZ2dlZCA9IE5VTEw7CisjZW5kaWYgLyogWEZTX1RSQU5TX0RFQlVHICovCisKKyNpZmRlZiBYRlNfQkxJX1RSQUNFCisJa3RyYWNlX2ZyZWUoYmlwLT5ibGlfdHJhY2UpOworI2VuZGlmCisJa21lbV96b25lX2ZyZWUoeGZzX2J1Zl9pdGVtX3pvbmUsIGJpcCk7Cit9CisKKyNpZiBkZWZpbmVkKFhGU19CTElfVFJBQ0UpCit2b2lkCit4ZnNfYnVmX2l0ZW1fdHJhY2UoCisJY2hhcgkJCSppZCwKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCkKK3sKKwl4ZnNfYnVmX3QJCSpicDsKKwlBU1NFUlQoYmlwLT5ibGlfdHJhY2UgIT0gTlVMTCk7CisKKwlicCA9IGJpcC0+YmxpX2J1ZjsKKwlrdHJhY2VfZW50ZXIoYmlwLT5ibGlfdHJhY2UsCisJCSAgICAgKHZvaWQgKilpZCwKKwkJICAgICAodm9pZCAqKWJpcC0+YmxpX2J1ZiwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZyliaXAtPmJsaV9mbGFncyksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpYmlwLT5ibGlfcmVjdXIpLAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkpLAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKQorCQkJCSgweEZGRkZGRkZGICYgWEZTX0JVRl9BRERSKGJwKSA+PiAzMikpLAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKSgweEZGRkZGRkZGICYgWEZTX0JVRl9BRERSKGJwKSkpLAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKVhGU19CVUZfQ09VTlQoYnApKSwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZylYRlNfQlVGX0JGTEFHUyhicCkpLAorCQkgICAgIFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopLAorCQkgICAgIFhGU19CVUZfRlNQUklWQVRFMihicCwgdm9pZCAqKSwKKwkJICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKVhGU19CVUZfSVNQSU5ORUQoYnApLAorCQkgICAgICh2b2lkICopWEZTX0JVRl9JT0RPTkVfRlVOQyhicCksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKFhGU19CVUZfVkFMVVNFTUEoYnApKSksCisJCSAgICAgKHZvaWQgKiliaXAtPmJsaV9pdGVtLmxpX2Rlc2MsCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpYmlwLT5ibGlfaXRlbS5saV9mbGFncykpOworfQorI2VuZGlmIC8qIFhGU19CTElfVFJBQ0UgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uaCBiL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjFiMGM5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19idWZfaXRlbS5oCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZglfX1hGU19CVUZfSVRFTV9IX18KKyNkZWZpbmUJX19YRlNfQlVGX0lURU1fSF9fCisKKy8qCisgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBsYXkgb3V0IGEgYnVmIGxvZyBpdGVtIGluIHRoZQorICogbG9nLiAgVGhlIGRhdGEgbWFwIGRlc2NyaWJlcyB3aGljaCAxMjggYnl0ZSBjaHVua3Mgb2YgdGhlIGJ1ZmZlcgorICogaGF2ZSBiZWVuIGxvZ2dlZC4gIFRoaXMgc3RydWN0dXJlIHdvcmtzIG9ubHkgb24gYnVmZmVycyB0aGF0CisgKiByZXNpZGUgdXAgdG8gdGhlIGZpcnN0IFRCIGluIHRoZSBmaWxlc3lzdGVtLiAgVGhlc2UgYnVmZmVycyBhcmUKKyAqIGdlbmVyYXRlZCBvbmx5IGJ5IHByZS02LjIgc3lzdGVtcyBhbmQgYXJlIGtub3duIGFzIFhGU19MSV82XzFfQlVGLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfYnVmX2xvZ19mb3JtYXRfdjEgeworCXVuc2lnbmVkIHNob3J0CWJsZl90eXBlOwkvKiBidWYgbG9nIGl0ZW0gdHlwZSBpbmRpY2F0b3IgKi8KKwl1bnNpZ25lZCBzaG9ydAlibGZfc2l6ZTsJLyogc2l6ZSBvZiB0aGlzIGl0ZW0gKi8KKwlfX2ludDMyX3QJYmxmX2Jsa25vOwkvKiBzdGFydGluZyBibGtubyBvZiB0aGlzIGJ1ZiAqLworCXVzaG9ydAkJYmxmX2ZsYWdzOwkvKiBtaXNjIHN0YXRlICovCisJdXNob3J0CQlibGZfbGVuOwkvKiBudW1iZXIgb2YgYmxvY2tzIGluIHRoaXMgYnVmICovCisJdW5zaWduZWQgaW50CWJsZl9tYXBfc2l6ZTsJLyogc2l6ZSBvZiBkYXRhIGJpdG1hcCBpbiB3b3JkcyAqLworCXVuc2lnbmVkIGludAlibGZfZGF0YV9tYXBbMV07LyogdmFyaWFibGUgc2l6ZSBiaXRtYXAgb2YgKi8KKwkJCQkJLyogICByZWdpb25zIG9mIGJ1ZmZlciBpbiB0aGlzIGl0ZW0gKi8KK30geGZzX2J1Zl9sb2dfZm9ybWF0X3YxX3Q7CisKKy8qCisgKiBUaGlzIGlzIGEgZm9ybSBvZiB0aGUgYWJvdmUgc3RydWN0dXJlIHdpdGggYSA2NCBiaXQgYmxrbm8gZmllbGQuCisgKiBGb3IgNi4yIGFuZCBiZXlvbmQsIHRoaXMgaXMgWEZTX0xJX0JVRi4gIFdlIHVzZSB0aGlzIHRvIGxvZyBldmVyeXRoaW5nLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfYnVmX2xvZ19mb3JtYXRfdCB7CisJdW5zaWduZWQgc2hvcnQJYmxmX3R5cGU7CS8qIGJ1ZiBsb2cgaXRlbSB0eXBlIGluZGljYXRvciAqLworCXVuc2lnbmVkIHNob3J0CWJsZl9zaXplOwkvKiBzaXplIG9mIHRoaXMgaXRlbSAqLworCXVzaG9ydAkJYmxmX2ZsYWdzOwkvKiBtaXNjIHN0YXRlICovCisJdXNob3J0CQlibGZfbGVuOwkvKiBudW1iZXIgb2YgYmxvY2tzIGluIHRoaXMgYnVmICovCisJX19pbnQ2NF90CWJsZl9ibGtubzsJLyogc3RhcnRpbmcgYmxrbm8gb2YgdGhpcyBidWYgKi8KKwl1bnNpZ25lZCBpbnQJYmxmX21hcF9zaXplOwkvKiBzaXplIG9mIGRhdGEgYml0bWFwIGluIHdvcmRzICovCisJdW5zaWduZWQgaW50CWJsZl9kYXRhX21hcFsxXTsvKiB2YXJpYWJsZSBzaXplIGJpdG1hcCBvZiAqLworCQkJCQkvKiAgIHJlZ2lvbnMgb2YgYnVmZmVyIGluIHRoaXMgaXRlbSAqLworfSB4ZnNfYnVmX2xvZ19mb3JtYXRfdDsKKworLyoKKyAqIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgYnVmZmVyIGNvbnRhaW5zIG9uIGRpc2sgaW5vZGVzCisgKiBhbmQgcmVxdWlyZXMgc3BlY2lhbCByZWNvdmVyeSBoYW5kbGluZy4KKyAqLworI2RlZmluZQlYRlNfQkxJX0lOT0RFX0JVRgkweDEKKy8qCisgKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIGJ1ZmZlciBzaG91bGQgbm90IGJlIHJlcGxheWVkCisgKiBkdXJpbmcgcmVjb3ZlcnkgYmVjYXVzZSBpdHMgYmxvY2tzIGFyZSBiZWluZyBmcmVlZC4KKyAqLworI2RlZmluZQlYRlNfQkxJX0NBTkNFTAkJMHgyCisvKgorICogVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBidWZmZXIgY29udGFpbnMgb24gZGlzaworICogdXNlciBvciBncm91cCBkcXVvdHMgYW5kIG1heSByZXF1aXJlIHNwZWNpYWwgcmVjb3ZlcnkgaGFuZGxpbmcuCisgKi8KKyNkZWZpbmUJWEZTX0JMSV9VRFFVT1RfQlVGCTB4NAorLyogI2RlZmluZSBYRlNfQkxJX1BEUVVPVF9CVUYJMHg4ICovCisjZGVmaW5lCVhGU19CTElfR0RRVU9UX0JVRgkweDEwCisKKyNkZWZpbmUJWEZTX0JMSV9DSFVOSwkJMTI4CisjZGVmaW5lCVhGU19CTElfU0hJRlQJCTcKKyNkZWZpbmUJQklUX1RPX1dPUkRfU0hJRlQJNQorI2RlZmluZQlOQldPUkQJCQkoTkJCWSAqIHNpemVvZih1bnNpZ25lZCBpbnQpKQorCisvKgorICogYnVmIGxvZyBpdGVtIGZsYWdzCisgKi8KKyNkZWZpbmUJWEZTX0JMSV9IT0xECQkweDAxCisjZGVmaW5lCVhGU19CTElfRElSVFkJCTB4MDIKKyNkZWZpbmUJWEZTX0JMSV9TVEFMRQkJMHgwNAorI2RlZmluZQlYRlNfQkxJX0xPR0dFRAkJMHgwOAorI2RlZmluZQlYRlNfQkxJX0lOT0RFX0FMTE9DX0JVRgkweDEwCisjZGVmaW5lIFhGU19CTElfU1RBTEVfSU5PREUJMHgyMAorCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKK3N0cnVjdCB4ZnNfYnVmOworc3RydWN0IGt0cmFjZTsKK3N0cnVjdCB4ZnNfbW91bnQ7CitzdHJ1Y3QgeGZzX2J1Zl9sb2dfaXRlbTsKKworI2lmIGRlZmluZWQoWEZTX0JMSV9UUkFDRSkKKyNkZWZpbmUJWEZTX0JMSV9UUkFDRV9TSVpFCTMyCisKK3ZvaWQJeGZzX2J1Zl9pdGVtX3RyYWNlKGNoYXIgKiwgc3RydWN0IHhmc19idWZfbG9nX2l0ZW0gKik7CisjZWxzZQorI2RlZmluZQl4ZnNfYnVmX2l0ZW1fdHJhY2UoaWQsIGJpcCkKKyNlbmRpZgorCisvKgorICogVGhpcyBpcyB0aGUgaW4gY29yZSBsb2cgaXRlbSBzdHJ1Y3R1cmUgdXNlZCB0byB0cmFjayBpbmZvcm1hdGlvbgorICogbmVlZGVkIHRvIGxvZyBidWZmZXJzLiAgSXQgdHJhY2tzIGhvdyBtYW55IHRpbWVzIHRoZSBsb2NrIGhhcyBiZWVuCisgKiBsb2NrZWQsIGFuZCB3aGljaCAxMjggYnl0ZSBjaHVua3Mgb2YgdGhlIGJ1ZmZlciBhcmUgZGlydHkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19idWZfbG9nX2l0ZW0geworCXhmc19sb2dfaXRlbV90CQlibGlfaXRlbTsJLyogY29tbW9uIGl0ZW0gc3RydWN0dXJlICovCisJc3RydWN0IHhmc19idWYJCSpibGlfYnVmOwkvKiByZWFsIGJ1ZmZlciBwb2ludGVyICovCisJdW5zaWduZWQgaW50CQlibGlfZmxhZ3M7CS8qIG1pc2MgZmxhZ3MgKi8KKwl1bnNpZ25lZCBpbnQJCWJsaV9yZWN1cjsJLyogbG9jayByZWN1cnNpb24gY291bnQgKi8KKwlhdG9taWNfdAkJYmxpX3JlZmNvdW50OwkvKiBjbnQgb2YgdHAgcmVmcyAqLworI2lmZGVmIFhGU19CTElfVFJBQ0UKKwlzdHJ1Y3Qga3RyYWNlCQkqYmxpX3RyYWNlOwkvKiBldmVudCB0cmFjZSBidWYgKi8KKyNlbmRpZgorI2lmZGVmIFhGU19UUkFOU19ERUJVRworCWNoYXIJCQkqYmxpX29yaWc7CS8qIG9yaWdpbmFsIGJ1ZmZlciBjb3B5ICovCisJY2hhcgkJCSpibGlfbG9nZ2VkOwkvKiBieXRlcyBsb2dnZWQgKGJpdG1hcCkgKi8KKyNlbmRpZgorCXhmc19idWZfbG9nX2Zvcm1hdF90CWJsaV9mb3JtYXQ7CS8qIGluLWxvZyBoZWFkZXIgKi8KK30geGZzX2J1Zl9sb2dfaXRlbV90OworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBkdXJpbmcgcmVjb3ZlcnkgdG8gcmVjb3JkIHRoZSBidWYgbG9nCisgKiBpdGVtcyB3aGljaCBoYXZlIGJlZW4gY2FuY2VsZWQgYW5kIHNob3VsZCBub3QgYmUgcmVwbGF5ZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19idWZfY2FuY2VsIHsKKwl4ZnNfZGFkZHJfdAkJYmNfYmxrbm87CisJdWludAkJCWJjX2xlbjsKKwlpbnQJCQliY19yZWZjb3VudDsKKwlzdHJ1Y3QgeGZzX2J1Zl9jYW5jZWwJKmJjX25leHQ7Cit9IHhmc19idWZfY2FuY2VsX3Q7CisKK3ZvaWQJeGZzX2J1Zl9pdGVtX2luaXQoc3RydWN0IHhmc19idWYgKiwgc3RydWN0IHhmc19tb3VudCAqKTsKK3ZvaWQJeGZzX2J1Zl9pdGVtX3JlbHNlKHN0cnVjdCB4ZnNfYnVmICopOwordm9pZAl4ZnNfYnVmX2l0ZW1fbG9nKHhmc19idWZfbG9nX2l0ZW1fdCAqLCB1aW50LCB1aW50KTsKK3VpbnQJeGZzX2J1Zl9pdGVtX2RpcnR5KHhmc19idWZfbG9nX2l0ZW1fdCAqKTsKK3ZvaWQJeGZzX2J1Zl9hdHRhY2hfaW9kb25lKHN0cnVjdCB4ZnNfYnVmICosCisJCQkgICAgICB2b2lkKCopKHN0cnVjdCB4ZnNfYnVmICosIHhmc19sb2dfaXRlbV90ICopLAorCQkJICAgICAgeGZzX2xvZ19pdGVtX3QgKik7Cit2b2lkCXhmc19idWZfaW9kb25lX2NhbGxiYWNrcyhzdHJ1Y3QgeGZzX2J1ZiAqKTsKK3ZvaWQJeGZzX2J1Zl9pb2RvbmUoc3RydWN0IHhmc19idWYgKiwgeGZzX2J1Zl9sb2dfaXRlbV90ICopOworCisjaWZkZWYgWEZTX1RSQU5TX0RFQlVHCit2b2lkCit4ZnNfYnVmX2l0ZW1fZmx1c2hfbG9nX2RlYnVnKAorCXN0cnVjdCB4ZnNfYnVmICpicCwKKwl1aW50CWZpcnN0LAorCXVpbnQJbGFzdCk7CisjZWxzZQorI2RlZmluZQl4ZnNfYnVmX2l0ZW1fZmx1c2hfbG9nX2RlYnVnKGJwLCBmaXJzdCwgbGFzdCkKKyNlbmRpZgorCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisjZW5kaWYJLyogX19YRlNfQlVGX0lURU1fSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2NhcC5oIGIvZnMveGZzL3hmc19jYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGVhYzczCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19jYXAuaApAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19DQVBfSF9fCisjZGVmaW5lIF9fWEZTX0NBUF9IX18KKworLyoKKyAqIENhcGFiaWxpdGllcworICovCit0eXBlZGVmIF9fdWludDY0X3QgeGZzX2NhcF92YWx1ZV90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfY2FwX3NldCB7CisJeGZzX2NhcF92YWx1ZV90CWNhcF9lZmZlY3RpdmU7CS8qIHVzZSBpbiBjYXBhYmlsaXR5IGNoZWNrcyAqLworCXhmc19jYXBfdmFsdWVfdAljYXBfcGVybWl0dGVkOwkvKiBjb21iaW5lZCB3aXRoIGZpbGUgYXR0cnMgKi8KKwl4ZnNfY2FwX3ZhbHVlX3QJY2FwX2luaGVyaXRhYmxlOy8qIHBhc3MgdGhyb3VnaCBleGVjICovCit9IHhmc19jYXBfc2V0X3Q7CisKKy8qIE9uLWRpc2sgWEZTIGV4dGVuZGVkIGF0dHJpYnV0ZSBuYW1lcyAqLworI2RlZmluZSBTR0lfQ0FQX0ZJTEUJIlNHSV9DQVBfRklMRSIKKyNkZWZpbmUgU0dJX0NBUF9GSUxFX1NJWkUJKHNpemVvZihTR0lfQ0FQX0ZJTEUpLTEpCisjZGVmaW5lIFNHSV9DQVBfTElOVVgJIlNHSV9DQVBfTElOVVgiCisjZGVmaW5lIFNHSV9DQVBfTElOVVhfU0laRQkoc2l6ZW9mKFNHSV9DQVBfTElOVVgpLTEpCisKKy8qCisgKiBGb3IgTGludXgsIHdlIHRha2UgdGhlIGJpdGZpZWxkcyBkaXJlY3RseSBmcm9tIGNhcGFiaWxpdHkuaAorICogYW5kIG5vIGxvbmdlciBhdHRlbXB0IHRvIGtlZXAgdGhpcyBhdHRyaWJ1dGUgb25kaXNrIGNvbXBhdGlibGUKKyAqIHdpdGggSVJJWC4gIFNpbmNlIHRoaXMgYXR0cmlidXRlIGlzIG9ubHkgc2V0IG9uIGV4ZWN0dWFibGVzLAorICogaXQganVzdCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSB0byB0cnkuICBXZSBkbyB1c2UgYSBkaWZmZXJlbnQKKyAqIG5hbWVkIGF0dHJpYnV0ZSB0aG91Z2gsIHRvIGF2b2lkIGNvbmZ1c2lvbi4KKyAqLworCisjaWZkZWYgX19LRVJORUxfXworCisjaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0NBUAorCisjaW5jbHVkZSA8bGludXgvcG9zaXhfY2FwX3hhdHRyLmg+CisKK3N0cnVjdCB2bm9kZTsKKworZXh0ZXJuIGludCB4ZnNfY2FwX3ZoYXNjYXAoc3RydWN0IHZub2RlICopOworZXh0ZXJuIGludCB4ZnNfY2FwX3ZzZXQoc3RydWN0IHZub2RlICosIHZvaWQgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQgeGZzX2NhcF92Z2V0KHN0cnVjdCB2bm9kZSAqLCB2b2lkICosIHNpemVfdCk7CitleHRlcm4gaW50IHhmc19jYXBfdnJlbW92ZShzdHJ1Y3Qgdm5vZGUgKnZwKTsKKworI2RlZmluZSBfQ0FQX0VYSVNUUwkJeGZzX2NhcF92aGFzY2FwCisKKyNlbHNlCisjZGVmaW5lIHhmc19jYXBfdnNldCh2LHAsc3opCSgtRU9QTk9UU1VQUCkKKyNkZWZpbmUgeGZzX2NhcF92Z2V0KHYscCxzeikJKC1FT1BOT1RTVVBQKQorI2RlZmluZSB4ZnNfY2FwX3ZyZW1vdmUodikJKC1FT1BOT1RTVVBQKQorI2RlZmluZSBfQ0FQX0VYSVNUUwkJKE5VTEwpCisjZW5kaWYKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmICAvKiBfX1hGU19DQVBfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2NsbnQuaCBiL2ZzL3hmcy94ZnNfY2xudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMjE1ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2NsbnQuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfQ0xOVF9IX18KKyNkZWZpbmUgX19YRlNfQ0xOVF9IX18KKworLyoKKyAqIFhGUyBhcmd1bWVudHMgc3RydWN0dXJlLCBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBhcmd1bWVudHMgd2UKKyAqIGFyZSBwYXNzZWQgdmlhIHRoZSBtb3VudCBzeXN0ZW0gY2FsbC4KKyAqCisgKiBOT1RFOiBUaGUgbW91bnQgc3lzdGVtIGNhbGwgaXMgaGFuZGxlZCBkaWZmZXJlbnRseSBiZXR3ZWVuCisgKiBMaW51eCBhbmQgSVJJWC4gIEluIElSSVggd2Ugd29ya2VkIHdvcmsgd2l0aCBhIGJpbmFyeSBkYXRhCisgKiBzdHJ1Y3R1cmUgY29taW5nIGluIGFjcm9zcyB0aGUgc3lzY2FsbCBpbnRlcmZhY2UgZnJvbSB1c2VyCisgKiBzcGFjZSAodGhlIG1vdW50IHVzZXJzcGFjZSBrbm93cyBhYm91dCBlYWNoIGZpbGVzeXN0ZW0gdHlwZQorICogYW5kIHRoZSBzZXQgb2YgdmFsaWQgb3B0aW9ucyBmb3IgaXQsIGFuZCBjb252ZXJ0cyB0aGUgdXNlcnMKKyAqIGFyZ3VtZW50IHN0cmluZyBpbnRvIGEgYmluYXJ5IHN0cnVjdHVyZSBfYmVmb3JlXyBtYWtpbmcgdGhlCisgKiBzeXN0ZW0gY2FsbCksIGFuZCB0aGUgQUJJIGlzc3VlcyB0aGF0IHRoaXMgaW1wbGllcy4KKyAqCisgKiBJbiBMaW51eCwgd2UgYXJlIHBhc3NlZCBhIGNvbW1hIHNlcGFyYXRlZCBzZXQgb2Ygb3B0aW9uczsKKyAqIGllLiBhIE5VTEwgdGVybWluYXRlZCBzdHJpbmcgb2YgY2hhcmFjdGVycy4gIFVzZXJzcGFjZSBtb3VudAorICogY29kZSBkb2VzIG5vdCBoYXZlIGFueSBrbm93bGVkZ2Ugb2YgbW91bnQgb3B0aW9ucyBleHBlY3RlZCBieQorICogZWFjaCBmaWxlc3lzdGVtIHR5cGUgYW5kIHNvIGVhY2ggZmlsZXN5c3RlbSBwYXJzZXMgaXRzIG1vdW50CisgKiBvcHRpb25zIGluIGtlcm5lbCBzcGFjZS4KKyAqCisgKiBGb3IgdGhlIExpbnV4IHBvcnQsIHdlIGtlcHQgdGhpcyBzdHJ1Y3R1cmUgcHJldHR5IG11Y2ggaW50YWN0CisgKiBhbmQgdXNlIGl0IGludGVybmFsbHkgKGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvZGUgZ3Jva3MgaXQpLgorICovCitzdHJ1Y3QgeGZzX21vdW50X2FyZ3MgeworCWludAlmbGFnczsJCS8qIGZsYWdzIC0+IHNlZSBYRlNNTlRfLi4uIG1hY3JvcyBiZWxvdyAqLworCWludAlsb2didWZzOwkvKiBOdW1iZXIgb2YgbG9nIGJ1ZmZlcnMsIC0xIHRvIGRlZmF1bHQgKi8KKwlpbnQJbG9nYnVmc2l6ZTsJLyogU2l6ZSBvZiBsb2cgYnVmZmVycywgLTEgdG8gZGVmYXVsdCAqLworCWNoYXIJZnNuYW1lW01BWE5BTUVMRU4rMV07CS8qIGRhdGEgZGV2aWNlIG5hbWUgKi8KKwljaGFyCXJ0bmFtZVtNQVhOQU1FTEVOKzFdOwkvKiByZWFsdGltZSBkZXZpY2UgZmlsZW5hbWUgKi8KKwljaGFyCWxvZ25hbWVbTUFYTkFNRUxFTisxXTsJLyogam91cm5hbCBkZXZpY2UgZmlsZW5hbWUgKi8KKwljaGFyCW10cHRbTUFYTkFNRUxFTisxXTsJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCWludAlzdW5pdDsJCS8qIHN0cmlwZSB1bml0IChCQnMpICovCisJaW50CXN3aWR0aDsJCS8qIHN0cmlwZSB3aWR0aCAoQkJzKSwgbXVsdGlwbGUgb2Ygc3VuaXQgKi8KKwl1Y2hhcl90IGlvc2l6ZWxvZzsJLyogbG9nMiBvZiB0aGUgcHJlZmVycmVkIEkvTyBzaXplICovCisJaW50CWloYXNoc2l6ZTsJLyogaW5vZGUgaGFzaCB0YWJsZSBzaXplIChidWNrZXRzKSAqLworfTsKKworLyoKKyAqIFhGUyBtb3VudCBvcHRpb24gZmxhZ3MKKyAqLworI2RlZmluZQlYRlNNTlRfQ0hLTE9HCQkweDAwMDAwMDAxCS8qIGNoZWNrIGxvZyAqLworI2RlZmluZQlYRlNNTlRfV1NZTkMJCTB4MDAwMDAwMDIJLyogc2FmZSBtb2RlIG5mcyBtb3VudAorCQkJCQkJICogY29tcGF0aWJsZSAqLworI2RlZmluZQlYRlNNTlRfSU5PNjQJCTB4MDAwMDAwMDQJLyogbW92ZSBpbm9kZSBudW1iZXJzIHVwCisJCQkJCQkgKiBwYXN0IDJeMzIgKi8KKyNkZWZpbmUgWEZTTU5UX1VRVU9UQQkJMHgwMDAwMDAwOAkvKiB1c2VyIHF1b3RhIGFjY291bnRpbmcgKi8KKyNkZWZpbmUgWEZTTU5UX1BRVU9UQQkJMHgwMDAwMDAxMAkvKiBJUklYIHByaiBxdW90YSBhY2NvdW50aW5nICovCisjZGVmaW5lIFhGU01OVF9VUVVPVEFFTkYJMHgwMDAwMDAyMAkvKiB1c2VyIHF1b3RhIGxpbWl0CisJCQkJCQkgKiBlbmZvcmNlbWVudCAqLworI2RlZmluZSBYRlNNTlRfUFFVT1RBRU5GCTB4MDAwMDAwNDAJLyogSVJJWCBwcm9qZWN0IHF1b3RhIGxpbWl0CisJCQkJCQkgKiBlbmZvcmNlbWVudCAqLworI2RlZmluZSBYRlNNTlRfTk9BVElNRQkJMHgwMDAwMDEwMAkvKiBkb24ndCBtb2RpZnkgYWNjZXNzCisJCQkJCQkgKiB0aW1lcyBvbiByZWFkcyAqLworI2RlZmluZSBYRlNNTlRfTk9BTElHTgkJMHgwMDAwMDIwMAkvKiBkb24ndCBhbGxvY2F0ZSBhdAorCQkJCQkJICogc3RyaXBlIGJvdW5kYXJpZXMqLworI2RlZmluZSBYRlNNTlRfUkVURVJSCQkweDAwMDAwNDAwCS8qIHJldHVybiBlcnJvciB0byB1c2VyICovCisjZGVmaW5lIFhGU01OVF9OT1JFQ09WRVJZCTB4MDAwMDA4MDAJLyogbm8gcmVjb3ZlcnksIGltcGxpZXMKKwkJCQkJCSAqIHJlYWQtb25seSBtb3VudCAqLworI2RlZmluZSBYRlNNTlRfU0hBUkVECQkweDAwMDAxMDAwCS8qIHNoYXJlZCBYRlMgbW91bnQgKi8KKyNkZWZpbmUgWEZTTU5UX0lPU0laRQkJMHgwMDAwMjAwMAkvKiBvcHRpbWl6ZSBmb3IgSS9PIHNpemUgKi8KKyNkZWZpbmUgWEZTTU5UX09TWU5DSVNPU1lOQwkweDAwMDA0MDAwCS8qIG9fc3luYyBpcyBSRUFMTFkgb19zeW5jICovCisJCQkJCQkvKiAob3N5bmNpc2RzeW5jIGlzIG5vdyBkZWZhdWx0KSAqLworI2RlZmluZSBYRlNNTlRfMzJCSVRJTk9ERVMJMHgwMDIwMDAwMAkvKiByZXN0cmljdCBpbm9kZXMgdG8gMzIKKwkJCQkJCSAqIGJpdHMgb2YgYWRkcmVzcyBzcGFjZSAqLworI2RlZmluZSBYRlNNTlRfR1FVT1RBCQkweDAwNDAwMDAwCS8qIGdyb3VwIHF1b3RhIGFjY291bnRpbmcgKi8KKyNkZWZpbmUgWEZTTU5UX0dRVU9UQUVORgkweDAwODAwMDAwCS8qIGdyb3VwIHF1b3RhIGxpbWl0CisJCQkJCQkgKiBlbmZvcmNlbWVudCAqLworI2RlZmluZSBYRlNNTlRfTk9VVUlECQkweDAxMDAwMDAwCS8qIElnbm9yZSBmcyB1dWlkICovCisjZGVmaW5lIFhGU01OVF9ETUFQSQkJMHgwMjAwMDAwMAkvKiBlbmFibGUgZG1hcGkveGRzbSAqLworI2RlZmluZSBYRlNNTlRfTk9MT0dGTFVTSAkweDA0MDAwMDAwCS8qIERvbid0IGZsdXNoIGZvciBsb2cgYmxvY2tzICovCisjZGVmaW5lIFhGU01OVF9JREVMRVRFCQkweDA4MDAwMDAwCS8qIGlub2RlIGNsdXN0ZXIgZGVsZXRlICovCisjZGVmaW5lIFhGU01OVF9TV0FMTE9DCQkweDEwMDAwMDAwCS8qIHR1cm4gb24gc3RyaXBlIHdpZHRoCisJCQkJCQkgKiBhbGxvY2F0aW9uICovCisjZGVmaW5lIFhGU01OVF9JSEFTSFNJWkUJMHgyMDAwMDAwMAkvKiBpbm9kZSBoYXNoIHRhYmxlIHNpemUgKi8KKyNkZWZpbmUgWEZTTU5UX0RJUlNZTkMJCTB4NDAwMDAwMDAJLyogc3luYyBjcmVhdCxsaW5rLHVubGluayxyZW5hbWUKKwkJCQkJCSAqIHN5bWxpbmssbWtkaXIscm1kaXIsbWtub2QgKi8KKworI2VuZGlmCS8qIF9fWEZTX0NMTlRfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RhX2J0cmVlLmMgYi9mcy94ZnMveGZzX2RhX2J0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmZTI4ODYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2RhX2J0cmVlLmMKQEAgLTAsMCArMSwyNjQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hdHRyLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfbGVhZi5oIgorI2luY2x1ZGUgInhmc19kaXJfbGVhZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX2RhdGEuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9sZWFmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfYmxvY2suaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9ub2RlLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorCisvKgorICogeGZzX2RhX2J0cmVlLmMKKyAqCisgKiBSb3V0aW5lcyB0byBpbXBsZW1lbnQgZGlyZWN0b3JpZXMgYXMgQnRyZWVzIG9mIGhhc2hlZCBuYW1lcy4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgdGhlIGtlcm5lbC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIFJvdXRpbmVzIHVzZWQgZm9yIGdyb3dpbmcgdGhlIEJ0cmVlLgorICovCitTVEFUSUMgaW50IHhmc19kYV9yb290X3NwbGl0KHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwKKwkJCQkJICAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqZXhpc3Rpbmdfcm9vdCwKKwkJCQkJICAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqbmV3X2NoaWxkKTsKK1NUQVRJQyBpbnQgeGZzX2RhX25vZGVfc3BsaXQoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLAorCQkJCQkgICAgeGZzX2RhX3N0YXRlX2Jsa190ICpleGlzdGluZ19ibGssCisJCQkJCSAgICB4ZnNfZGFfc3RhdGVfYmxrX3QgKnNwbGl0X2JsaywKKwkJCQkJICAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrX3RvX2FkZCwKKwkJCQkJICAgIGludCB0cmVlbGV2ZWwsCisJCQkJCSAgICBpbnQgKnJlc3VsdCk7CitTVEFUSUMgdm9pZCB4ZnNfZGFfbm9kZV9yZWJhbGFuY2UoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLAorCQkJCQkgeGZzX2RhX3N0YXRlX2Jsa190ICpub2RlX2Jsa18xLAorCQkJCQkgeGZzX2RhX3N0YXRlX2Jsa190ICpub2RlX2Jsa18yKTsKK1NUQVRJQyB2b2lkIHhmc19kYV9ub2RlX2FkZCh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsCisJCQkJICAgeGZzX2RhX3N0YXRlX2Jsa190ICpvbGRfbm9kZV9ibGssCisJCQkJICAgeGZzX2RhX3N0YXRlX2Jsa190ICpuZXdfbm9kZV9ibGspOworCisvKgorICogUm91dGluZXMgdXNlZCBmb3Igc2hyaW5raW5nIHRoZSBCdHJlZS4KKyAqLworU1RBVElDIGludCB4ZnNfZGFfcm9vdF9qb2luKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwKKwkJCQkJICAgeGZzX2RhX3N0YXRlX2Jsa190ICpyb290X2Jsayk7CitTVEFUSUMgaW50IHhmc19kYV9ub2RlX3Rvb3NtYWxsKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwgaW50ICpyZXR2YWwpOworU1RBVElDIHZvaWQgeGZzX2RhX25vZGVfcmVtb3ZlKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwKKwkJCQkJICAgICAgeGZzX2RhX3N0YXRlX2Jsa190ICpkcm9wX2Jsayk7CitTVEFUSUMgdm9pZCB4ZnNfZGFfbm9kZV91bmJhbGFuY2UoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLAorCQkJCQkgeGZzX2RhX3N0YXRlX2Jsa190ICpzcmNfbm9kZV9ibGssCisJCQkJCSB4ZnNfZGFfc3RhdGVfYmxrX3QgKmRzdF9ub2RlX2Jsayk7CisKKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICovCitTVEFUSUMgdWludAl4ZnNfZGFfbm9kZV9sYXN0aGFzaCh4ZnNfZGFidWZfdCAqYnAsIGludCAqY291bnQpOworU1RBVElDIGludAl4ZnNfZGFfbm9kZV9vcmRlcih4ZnNfZGFidWZfdCAqbm9kZTFfYnAsIHhmc19kYWJ1Zl90ICpub2RlMl9icCk7CitTVEFUSUMgeGZzX2RhYnVmX3QgKnhmc19kYV9idWZfbWFrZShpbnQgbmJ1ZiwgeGZzX2J1Zl90ICoqYnBzLCBpbnN0X3QgKnJhKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUm91dGluZXMgdXNlZCBmb3IgZ3Jvd2luZyB0aGUgQnRyZWUuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBDcmVhdGUgdGhlIGluaXRpYWwgY29udGVudHMgb2YgYW4gaW50ZXJtZWRpYXRlIG5vZGUuCisgKi8KK2ludAoreGZzX2RhX25vZGVfY3JlYXRlKHhmc19kYV9hcmdzX3QgKmFyZ3MsIHhmc19kYWJsa190IGJsa25vLCBpbnQgbGV2ZWwsCisJCQkJIHhmc19kYWJ1Zl90ICoqYnBwLCBpbnQgd2hpY2hmb3JrKQoreworCXhmc19kYV9pbnRub2RlX3QgKm5vZGU7CisJeGZzX2RhYnVmX3QgKmJwOworCWludCBlcnJvcjsKKwl4ZnNfdHJhbnNfdCAqdHA7CisKKwl0cCA9IGFyZ3MtPnRyYW5zOworCWVycm9yID0geGZzX2RhX2dldF9idWYodHAsIGFyZ3MtPmRwLCBibGtubywgLTEsICZicCwgd2hpY2hmb3JrKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybihlcnJvcik7CisJQVNTRVJUKGJwICE9IE5VTEwpOworCW5vZGUgPSBicC0+ZGF0YTsKKwlub2RlLT5oZHIuaW5mby5mb3J3ID0gMDsKKwlub2RlLT5oZHIuaW5mby5iYWNrID0gMDsKKwlJTlRfU0VUKG5vZGUtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19EQV9OT0RFX01BR0lDKTsKKwlub2RlLT5oZHIuaW5mby5wYWQgPSAwOworCW5vZGUtPmhkci5jb3VudCA9IDA7CisJSU5UX1NFVChub2RlLT5oZHIubGV2ZWwsIEFSQ0hfQ09OVkVSVCwgbGV2ZWwpOworCisJeGZzX2RhX2xvZ19idWYodHAsIGJwLAorCQlYRlNfREFfTE9HUkFOR0Uobm9kZSwgJm5vZGUtPmhkciwgc2l6ZW9mKG5vZGUtPmhkcikpKTsKKworCSpicHAgPSBicDsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBTcGxpdCBhIGxlYWYgbm9kZSwgcmViYWxhbmNlLCB0aGVuIHBvc3NpYmx5IHNwbGl0CisgKiBpbnRlcm1lZGlhdGUgbm9kZXMsIHJlYmFsYW5jZSwgZXRjLgorICovCitpbnQJCQkJCQkJLyogZXJyb3IgKi8KK3hmc19kYV9zcGxpdCh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUpCit7CisJeGZzX2RhX3N0YXRlX2Jsa190ICpvbGRibGssICpuZXdibGssICphZGRibGs7CisJeGZzX2RhX2ludG5vZGVfdCAqbm9kZTsKKwl4ZnNfZGFidWZfdCAqYnA7CisJaW50IG1heCwgYWN0aW9uLCBlcnJvciwgaTsKKworCS8qCisJICogV2FsayBiYWNrIHVwIHRoZSB0cmVlIHNwbGl0dGluZy9pbnNlcnRpbmcvYWRqdXN0aW5nIGFzIG5lY2Vzc2FyeS4KKwkgKiBJZiB3ZSBuZWVkIHRvIGluc2VydCBhbmQgdGhlcmUgaXNuJ3Qgcm9vbSwgc3BsaXQgdGhlIG5vZGUsIHRoZW4KKwkgKiBkZWNpZGUgd2hpY2ggZnJhZ21lbnQgdG8gaW5zZXJ0IHRoZSBuZXcgYmxvY2sgZnJvbSBiZWxvdyBpbnRvLgorCSAqIE5vdGUgdGhhdCB3ZSBtYXkgc3BsaXQgdGhlIHJvb3QgdGhpcyB3YXksIGJ1dCB3ZSBuZWVkIG1vcmUgZml4dXAuCisJICovCisJbWF4ID0gc3RhdGUtPnBhdGguYWN0aXZlIC0gMTsKKwlBU1NFUlQoKG1heCA+PSAwKSAmJiAobWF4IDwgWEZTX0RBX05PREVfTUFYREVQVEgpKTsKKwlBU1NFUlQoc3RhdGUtPnBhdGguYmxrW21heF0ubWFnaWMgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyB8fAorCSAgICAgICBzdGF0ZS0+cGF0aC5ibGtbbWF4XS5tYWdpYyA9PSBYRlNfRElSWF9MRUFGX01BR0lDKHN0YXRlLT5tcCkpOworCisJYWRkYmxrID0gJnN0YXRlLT5wYXRoLmJsa1ttYXhdOwkJLyogaW5pdGlhbCBkdW1teSB2YWx1ZSAqLworCWZvciAoaSA9IG1heDsgKGkgPj0gMCkgJiYgYWRkYmxrOyBzdGF0ZS0+cGF0aC5hY3RpdmUtLSwgaS0tKSB7CisJCW9sZGJsayA9ICZzdGF0ZS0+cGF0aC5ibGtbaV07CisJCW5ld2JsayA9ICZzdGF0ZS0+YWx0cGF0aC5ibGtbaV07CisKKwkJLyoKKwkJICogSWYgYSBsZWFmIG5vZGUgdGhlbgorCQkgKiAgICAgQWxsb2NhdGUgYSBuZXcgbGVhZiBub2RlLCB0aGVuIHJlYmFsYW5jZSBhY3Jvc3MgdGhlbS4KKwkJICogZWxzZSBpZiBhbiBpbnRlcm1lZGlhdGUgbm9kZSB0aGVuCisJCSAqICAgICBXZSBzcGxpdCBvbiB0aGUgbGFzdCBsYXllciwgbXVzdCB3ZSBzcGxpdCB0aGUgbm9kZT8KKwkJICovCisJCXN3aXRjaCAob2xkYmxrLT5tYWdpYykgeworCQljYXNlIFhGU19BVFRSX0xFQUZfTUFHSUM6CisjaWZuZGVmIF9fS0VSTkVMX18KKwkJCXJldHVybihFTk9UVFkpOworI2Vsc2UKKwkJCWVycm9yID0geGZzX2F0dHJfbGVhZl9zcGxpdChzdGF0ZSwgb2xkYmxrLCBuZXdibGspOworCQkJaWYgKChlcnJvciAhPSAwKSAmJiAoZXJyb3IgIT0gRU5PU1BDKSkgeworCQkJCXJldHVybihlcnJvcik7CS8qIEdST1Q6IGF0dHIgaXMgaW5jb25zaXN0ZW50ICovCisJCQl9CisJCQlpZiAoIWVycm9yKSB7CisJCQkJYWRkYmxrID0gbmV3YmxrOworCQkJCWJyZWFrOworCQkJfQorCQkJLyoKKwkJCSAqIEVudHJ5IHdvdWxkbid0IGZpdCwgc3BsaXQgdGhlIGxlYWYgYWdhaW4uCisJCQkgKi8KKwkJCXN0YXRlLT5leHRyYXZhbGlkID0gMTsKKwkJCWlmIChzdGF0ZS0+aW5sZWFmKSB7CisJCQkJc3RhdGUtPmV4dHJhYWZ0ZXIgPSAwOwkvKiBiZWZvcmUgbmV3YmxrICovCisJCQkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX3NwbGl0KHN0YXRlLCBvbGRibGssCisJCQkJCQkJICAgICZzdGF0ZS0+ZXh0cmFibGspOworCQkJfSBlbHNlIHsKKwkJCQlzdGF0ZS0+ZXh0cmFhZnRlciA9IDE7CS8qIGFmdGVyIG5ld2JsayAqLworCQkJCWVycm9yID0geGZzX2F0dHJfbGVhZl9zcGxpdChzdGF0ZSwgbmV3YmxrLAorCQkJCQkJCSAgICAmc3RhdGUtPmV4dHJhYmxrKTsKKwkJCX0KKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4oZXJyb3IpOwkvKiBHUk9UOiBhdHRyIGluY29uc2lzdGVudCAqLworCQkJYWRkYmxrID0gbmV3YmxrOworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSBYRlNfRElSX0xFQUZfTUFHSUM6CisJCQlBU1NFUlQoWEZTX0RJUl9JU19WMShzdGF0ZS0+bXApKTsKKwkJCWVycm9yID0geGZzX2Rpcl9sZWFmX3NwbGl0KHN0YXRlLCBvbGRibGssIG5ld2Jsayk7CisJCQlpZiAoKGVycm9yICE9IDApICYmIChlcnJvciAhPSBFTk9TUEMpKSB7CisJCQkJcmV0dXJuKGVycm9yKTsJLyogR1JPVDogZGlyIGlzIGluY29uc2lzdGVudCAqLworCQkJfQorCQkJaWYgKCFlcnJvcikgeworCQkJCWFkZGJsayA9IG5ld2JsazsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qCisJCQkgKiBFbnRyeSB3b3VsZG4ndCBmaXQsIHNwbGl0IHRoZSBsZWFmIGFnYWluLgorCQkJICovCisJCQlzdGF0ZS0+ZXh0cmF2YWxpZCA9IDE7CisJCQlpZiAoc3RhdGUtPmlubGVhZikgeworCQkJCXN0YXRlLT5leHRyYWFmdGVyID0gMDsJLyogYmVmb3JlIG5ld2JsayAqLworCQkJCWVycm9yID0geGZzX2Rpcl9sZWFmX3NwbGl0KHN0YXRlLCBvbGRibGssCisJCQkJCQkJICAgJnN0YXRlLT5leHRyYWJsayk7CisJCQkJaWYgKGVycm9yKQorCQkJCQlyZXR1cm4oZXJyb3IpOwkvKiBHUk9UOiBkaXIgaW5jb24uICovCisJCQkJYWRkYmxrID0gbmV3YmxrOworCQkJfSBlbHNlIHsKKwkJCQlzdGF0ZS0+ZXh0cmFhZnRlciA9IDE7CS8qIGFmdGVyIG5ld2JsayAqLworCQkJCWVycm9yID0geGZzX2Rpcl9sZWFmX3NwbGl0KHN0YXRlLCBuZXdibGssCisJCQkJCQkJICAgJnN0YXRlLT5leHRyYWJsayk7CisJCQkJaWYgKGVycm9yKQorCQkJCQlyZXR1cm4oZXJyb3IpOwkvKiBHUk9UOiBkaXIgaW5jb24uICovCisJCQkJYWRkYmxrID0gbmV3YmxrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgWEZTX0RJUjJfTEVBRk5fTUFHSUM6CisJCQlBU1NFUlQoWEZTX0RJUl9JU19WMihzdGF0ZS0+bXApKTsKKwkJCWVycm9yID0geGZzX2RpcjJfbGVhZm5fc3BsaXQoc3RhdGUsIG9sZGJsaywgbmV3YmxrKTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQlhZGRibGsgPSBuZXdibGs7CisJCQlicmVhazsKKwkJY2FzZSBYRlNfREFfTk9ERV9NQUdJQzoKKwkJCWVycm9yID0geGZzX2RhX25vZGVfc3BsaXQoc3RhdGUsIG9sZGJsaywgbmV3YmxrLCBhZGRibGssCisJCQkJCQkJIG1heCAtIGksICZhY3Rpb24pOworCQkJeGZzX2RhX2J1Zl9kb25lKGFkZGJsay0+YnApOworCQkJYWRkYmxrLT5icCA9IE5VTEw7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuKGVycm9yKTsJLyogR1JPVDogZGlyIGlzIGluY29uc2lzdGVudCAqLworCQkJLyoKKwkJCSAqIFJlY29yZCB0aGUgbmV3bHkgc3BsaXQgYmxvY2sgZm9yIHRoZSBuZXh0IHRpbWUgdGhydT8KKwkJCSAqLworCQkJaWYgKGFjdGlvbikKKwkJCQlhZGRibGsgPSBuZXdibGs7CisJCQllbHNlCisJCQkJYWRkYmxrID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogVXBkYXRlIHRoZSBidHJlZSB0byBzaG93IHRoZSBuZXcgaGFzaHZhbCBmb3IgdGhpcyBjaGlsZC4KKwkJICovCisJCXhmc19kYV9maXhoYXNocGF0aChzdGF0ZSwgJnN0YXRlLT5wYXRoKTsKKwkJLyoKKwkJICogSWYgd2Ugd29uJ3QgbmVlZCB0aGlzIGJsb2NrIGFnYWluLCBpdCdzIGdldHRpbmcgZHJvcHBlZAorCQkgKiBmcm9tIHRoZSBhY3RpdmUgcGF0aCBieSB0aGUgbG9vcCBjb250cm9sLCBzbyB3ZSBuZWVkCisJCSAqIHRvIG1hcmsgaXQgZG9uZSBub3cuCisJCSAqLworCQlpZiAoaSA+IDAgfHwgIWFkZGJsaykKKwkJCXhmc19kYV9idWZfZG9uZShvbGRibGstPmJwKTsKKwl9CisJaWYgKCFhZGRibGspCisJCXJldHVybigwKTsKKworCS8qCisJICogU3BsaXQgdGhlIHJvb3Qgbm9kZS4KKwkgKi8KKwlBU1NFUlQoc3RhdGUtPnBhdGguYWN0aXZlID09IDApOworCW9sZGJsayA9ICZzdGF0ZS0+cGF0aC5ibGtbMF07CisJZXJyb3IgPSB4ZnNfZGFfcm9vdF9zcGxpdChzdGF0ZSwgb2xkYmxrLCBhZGRibGspOworCWlmIChlcnJvcikgeworCQl4ZnNfZGFfYnVmX2RvbmUob2xkYmxrLT5icCk7CisJCXhmc19kYV9idWZfZG9uZShhZGRibGstPmJwKTsKKwkJYWRkYmxrLT5icCA9IE5VTEw7CisJCXJldHVybihlcnJvcik7CS8qIEdST1Q6IGRpciBpcyBpbmNvbnNpc3RlbnQgKi8KKwl9CisKKwkvKgorCSAqIFVwZGF0ZSBwb2ludGVycyB0byB0aGUgbm9kZSB3aGljaCB1c2VkIHRvIGJlIGJsb2NrIDAgYW5kCisJICoganVzdCBnb3QgYnVtcGVkIGJlY2F1c2Ugb2YgdGhlIGFkZGl0aW9uIG9mIGEgbmV3IHJvb3Qgbm9kZS4KKwkgKiBUaGVyZSBtaWdodCBiZSB0aHJlZSBibG9ja3MgaW52b2x2ZWQgaWYgYSBkb3VibGUgc3BsaXQgb2NjdXJyZWQsCisJICogYW5kIHRoZSBvcmlnaW5hbCBibG9jayAwIGNvdWxkIGJlIGF0IGFueSBwb3NpdGlvbiBpbiB0aGUgbGlzdC4KKwkgKi8KKworCW5vZGUgPSBvbGRibGstPmJwLT5kYXRhOworCWlmIChub2RlLT5oZHIuaW5mby5mb3J3KSB7CisJCWlmIChJTlRfR0VUKG5vZGUtPmhkci5pbmZvLmZvcncsIEFSQ0hfQ09OVkVSVCkgPT0gYWRkYmxrLT5ibGtubykgeworCQkJYnAgPSBhZGRibGstPmJwOworCQl9IGVsc2UgeworCQkJQVNTRVJUKHN0YXRlLT5leHRyYXZhbGlkKTsKKwkJCWJwID0gc3RhdGUtPmV4dHJhYmxrLmJwOworCQl9CisJCW5vZGUgPSBicC0+ZGF0YTsKKwkJSU5UX1NFVChub2RlLT5oZHIuaW5mby5iYWNrLCBBUkNIX0NPTlZFUlQsIG9sZGJsay0+Ymxrbm8pOworCQl4ZnNfZGFfbG9nX2J1ZihzdGF0ZS0+YXJncy0+dHJhbnMsIGJwLAorCQkgICAgWEZTX0RBX0xPR1JBTkdFKG5vZGUsICZub2RlLT5oZHIuaW5mbywKKwkJICAgIHNpemVvZihub2RlLT5oZHIuaW5mbykpKTsKKwl9CisJbm9kZSA9IG9sZGJsay0+YnAtPmRhdGE7CisJaWYgKElOVF9HRVQobm9kZS0+aGRyLmluZm8uYmFjaywgQVJDSF9DT05WRVJUKSkgeworCQlpZiAoSU5UX0dFVChub2RlLT5oZHIuaW5mby5iYWNrLCBBUkNIX0NPTlZFUlQpID09IGFkZGJsay0+Ymxrbm8pIHsKKwkJCWJwID0gYWRkYmxrLT5icDsKKwkJfSBlbHNlIHsKKwkJCUFTU0VSVChzdGF0ZS0+ZXh0cmF2YWxpZCk7CisJCQlicCA9IHN0YXRlLT5leHRyYWJsay5icDsKKwkJfQorCQlub2RlID0gYnAtPmRhdGE7CisJCUlOVF9TRVQobm9kZS0+aGRyLmluZm8uZm9ydywgQVJDSF9DT05WRVJULCBvbGRibGstPmJsa25vKTsKKwkJeGZzX2RhX2xvZ19idWYoc3RhdGUtPmFyZ3MtPnRyYW5zLCBicCwKKwkJICAgIFhGU19EQV9MT0dSQU5HRShub2RlLCAmbm9kZS0+aGRyLmluZm8sCisJCSAgICBzaXplb2Yobm9kZS0+aGRyLmluZm8pKSk7CisJfQorCXhmc19kYV9idWZfZG9uZShvbGRibGstPmJwKTsKKwl4ZnNfZGFfYnVmX2RvbmUoYWRkYmxrLT5icCk7CisJYWRkYmxrLT5icCA9IE5VTEw7CisJcmV0dXJuKDApOworfQorCisvKgorICogU3BsaXQgdGhlIHJvb3QuICBXZSBoYXZlIHRvIGNyZWF0ZSBhIG5ldyByb290IGFuZCBwb2ludCB0byB0aGUgdHdvCisgKiBwYXJ0cyAodGhlIHNwbGl0IG9sZCByb290KSB0aGF0IHdlIGp1c3QgY3JlYXRlZC4gIENvcHkgYmxvY2sgemVybyB0bworICogdGhlIEVPRiwgZXh0ZW5kaW5nIHRoZSBpbm9kZSBpbiBwcm9jZXNzLgorICovCitTVEFUSUMgaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19kYV9yb290X3NwbGl0KHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwgeGZzX2RhX3N0YXRlX2Jsa190ICpibGsxLAorCQkJCSB4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazIpCit7CisJeGZzX2RhX2ludG5vZGVfdCAqbm9kZSwgKm9sZHJvb3Q7CisJeGZzX2RhX2FyZ3NfdCAqYXJnczsKKwl4ZnNfZGFibGtfdCBibGtubzsKKwl4ZnNfZGFidWZfdCAqYnA7CisJaW50IGVycm9yLCBzaXplOworCXhmc19pbm9kZV90ICpkcDsKKwl4ZnNfdHJhbnNfdCAqdHA7CisJeGZzX21vdW50X3QgKm1wOworCXhmc19kaXIyX2xlYWZfdCAqbGVhZjsKKworCS8qCisJICogQ29weSB0aGUgZXhpc3RpbmcgKGluY29ycmVjdCkgYmxvY2sgZnJvbSB0aGUgcm9vdCBub2RlIHBvc2l0aW9uCisJICogdG8gYSBmcmVlIHNwYWNlIHNvbWV3aGVyZS4KKwkgKi8KKwlhcmdzID0gc3RhdGUtPmFyZ3M7CisJQVNTRVJUKGFyZ3MgIT0gTlVMTCk7CisJZXJyb3IgPSB4ZnNfZGFfZ3Jvd19pbm9kZShhcmdzLCAmYmxrbm8pOworCWlmIChlcnJvcikKKwkJcmV0dXJuKGVycm9yKTsKKwlkcCA9IGFyZ3MtPmRwOworCXRwID0gYXJncy0+dHJhbnM7CisJbXAgPSBzdGF0ZS0+bXA7CisJZXJyb3IgPSB4ZnNfZGFfZ2V0X2J1Zih0cCwgZHAsIGJsa25vLCAtMSwgJmJwLCBhcmdzLT53aGljaGZvcmspOworCWlmIChlcnJvcikKKwkJcmV0dXJuKGVycm9yKTsKKwlBU1NFUlQoYnAgIT0gTlVMTCk7CisJbm9kZSA9IGJwLT5kYXRhOworCW9sZHJvb3QgPSBibGsxLT5icC0+ZGF0YTsKKwlpZiAoSU5UX0dFVChvbGRyb290LT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfREFfTk9ERV9NQUdJQykgeworCQlzaXplID0gKGludCkoKGNoYXIgKikmb2xkcm9vdC0+YnRyZWVbSU5UX0dFVChvbGRyb290LT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCldIC0KKwkJCSAgICAgKGNoYXIgKilvbGRyb290KTsKKwl9IGVsc2UgeworCQlBU1NFUlQoWEZTX0RJUl9JU19WMihtcCkpOworCQlBU1NFUlQoSU5UX0dFVChvbGRyb290LT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQyk7CisJCWxlYWYgPSAoeGZzX2RpcjJfbGVhZl90ICopb2xkcm9vdDsKKwkJc2l6ZSA9IChpbnQpKChjaGFyICopJmxlYWYtPmVudHNbSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCldIC0KKwkJCSAgICAgKGNoYXIgKilsZWFmKTsKKwl9CisJbWVtY3B5KG5vZGUsIG9sZHJvb3QsIHNpemUpOworCXhmc19kYV9sb2dfYnVmKHRwLCBicCwgMCwgc2l6ZSAtIDEpOworCXhmc19kYV9idWZfZG9uZShibGsxLT5icCk7CisJYmxrMS0+YnAgPSBicDsKKwlibGsxLT5ibGtubyA9IGJsa25vOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIG5ldyByb290IG5vZGUuCisJICovCisJZXJyb3IgPSB4ZnNfZGFfbm9kZV9jcmVhdGUoYXJncywKKwkJYXJncy0+d2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUksgJiYKKwkJWEZTX0RJUl9JU19WMihtcCkgPyBtcC0+bV9kaXJsZWFmYmxrIDogMCwKKwkJSU5UX0dFVChub2RlLT5oZHIubGV2ZWwsIEFSQ0hfQ09OVkVSVCkgKyAxLCAmYnAsIGFyZ3MtPndoaWNoZm9yayk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4oZXJyb3IpOworCW5vZGUgPSBicC0+ZGF0YTsKKwlJTlRfU0VUKG5vZGUtPmJ0cmVlWzBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCwgYmxrMS0+aGFzaHZhbCk7CisJSU5UX1NFVChub2RlLT5idHJlZVswXS5iZWZvcmUsIEFSQ0hfQ09OVkVSVCwgYmxrMS0+Ymxrbm8pOworCUlOVF9TRVQobm9kZS0+YnRyZWVbMV0uaGFzaHZhbCwgQVJDSF9DT05WRVJULCBibGsyLT5oYXNodmFsKTsKKwlJTlRfU0VUKG5vZGUtPmJ0cmVlWzFdLmJlZm9yZSwgQVJDSF9DT05WRVJULCBibGsyLT5ibGtubyk7CisJSU5UX1NFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCwgMik7CisKKyNpZmRlZiBERUJVRworCWlmIChJTlRfR0VUKG9sZHJvb3QtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0xFQUZOX01BR0lDKSB7CisJCUFTU0VSVChibGsxLT5ibGtubyA+PSBtcC0+bV9kaXJsZWFmYmxrICYmCisJCSAgICAgICBibGsxLT5ibGtubyA8IG1wLT5tX2RpcmZyZWVibGspOworCQlBU1NFUlQoYmxrMi0+Ymxrbm8gPj0gbXAtPm1fZGlybGVhZmJsayAmJgorCQkgICAgICAgYmxrMi0+Ymxrbm8gPCBtcC0+bV9kaXJmcmVlYmxrKTsKKwl9CisjZW5kaWYKKworCS8qIEhlYWRlciBpcyBhbHJlYWR5IGxvZ2dlZCBieSB4ZnNfZGFfbm9kZV9jcmVhdGUgKi8KKwl4ZnNfZGFfbG9nX2J1Zih0cCwgYnAsCisJCVhGU19EQV9MT0dSQU5HRShub2RlLCBub2RlLT5idHJlZSwKKwkJCXNpemVvZih4ZnNfZGFfbm9kZV9lbnRyeV90KSAqIDIpKTsKKwl4ZnNfZGFfYnVmX2RvbmUoYnApOworCisJcmV0dXJuKDApOworfQorCisvKgorICogU3BsaXQgdGhlIG5vZGUsIHJlYmFsYW5jZSwgdGhlbiBhZGQgdGhlIG5ldyBlbnRyeS4KKyAqLworU1RBVElDIGludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGFfbm9kZV9zcGxpdCh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIHhmc19kYV9zdGF0ZV9ibGtfdCAqb2xkYmxrLAorCQkJCSB4ZnNfZGFfc3RhdGVfYmxrX3QgKm5ld2JsaywKKwkJCQkgeGZzX2RhX3N0YXRlX2Jsa190ICphZGRibGssCisJCQkJIGludCB0cmVlbGV2ZWwsIGludCAqcmVzdWx0KQoreworCXhmc19kYV9pbnRub2RlX3QgKm5vZGU7CisJeGZzX2RhYmxrX3QgYmxrbm87CisJaW50IG5ld2NvdW50LCBlcnJvcjsKKwlpbnQgdXNlZXh0cmE7CisKKwlub2RlID0gb2xkYmxrLT5icC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChub2RlLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisKKwkvKgorCSAqIFdpdGggVjIgdGhlIGV4dHJhIGJsb2NrIGlzIGRhdGEgb3IgZnJlZXNwYWNlLgorCSAqLworCXVzZWV4dHJhID0gc3RhdGUtPmV4dHJhdmFsaWQgJiYgWEZTX0RJUl9JU19WMShzdGF0ZS0+bXApOworCW5ld2NvdW50ID0gMSArIHVzZWV4dHJhOworCS8qCisJICogRG8gd2UgaGF2ZSB0byBzcGxpdCB0aGUgbm9kZT8KKwkgKi8KKwlpZiAoKElOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpICsgbmV3Y291bnQpID4gc3RhdGUtPm5vZGVfZW50cykgeworCQkvKgorCQkgKiBBbGxvY2F0ZSBhIG5ldyBub2RlLCBhZGQgdG8gdGhlIGRvdWJseSBsaW5rZWQgY2hhaW4gb2YKKwkJICogbm9kZXMsIHRoZW4gbW92ZSBzb21lIG9mIG91ciBleGNlc3MgZW50cmllcyBpbnRvIGl0LgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfZGFfZ3Jvd19pbm9kZShzdGF0ZS0+YXJncywgJmJsa25vKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuKGVycm9yKTsJLyogR1JPVDogZGlyIGlzIGluY29uc2lzdGVudCAqLworCisJCWVycm9yID0geGZzX2RhX25vZGVfY3JlYXRlKHN0YXRlLT5hcmdzLCBibGtubywgdHJlZWxldmVsLAorCQkJCQkgICAmbmV3YmxrLT5icCwgc3RhdGUtPmFyZ3MtPndoaWNoZm9yayk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybihlcnJvcik7CS8qIEdST1Q6IGRpciBpcyBpbmNvbnNpc3RlbnQgKi8KKwkJbmV3YmxrLT5ibGtubyA9IGJsa25vOworCQluZXdibGstPm1hZ2ljID0gWEZTX0RBX05PREVfTUFHSUM7CisJCXhmc19kYV9ub2RlX3JlYmFsYW5jZShzdGF0ZSwgb2xkYmxrLCBuZXdibGspOworCQllcnJvciA9IHhmc19kYV9ibGtfbGluayhzdGF0ZSwgb2xkYmxrLCBuZXdibGspOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4oZXJyb3IpOworCQkqcmVzdWx0ID0gMTsKKwl9IGVsc2UgeworCQkqcmVzdWx0ID0gMDsKKwl9CisKKwkvKgorCSAqIEluc2VydCB0aGUgbmV3IGVudHJ5KHMpIGludG8gdGhlIGNvcnJlY3QgYmxvY2sKKwkgKiAodXBkYXRpbmcgbGFzdCBoYXNodmFsIGluIHRoZSBwcm9jZXNzKS4KKwkgKgorCSAqIHhmc19kYV9ub2RlX2FkZCgpIGluc2VydHMgQkVGT1JFIHRoZSBnaXZlbiBpbmRleCwKKwkgKiBhbmQgYXMgYSByZXN1bHQgb2YgdXNpbmcgbm9kZV9sb29rdXBfaW50KCkgd2UgYWx3YXlzCisJICogcG9pbnQgdG8gYSB2YWxpZCBlbnRyeSAobm90IGFmdGVyIG9uZSksIGJ1dCBhIHNwbGl0CisJICogb3BlcmF0aW9uIGFsd2F5cyByZXN1bHRzIGluIGEgbmV3IGJsb2NrIHdob3NlIGhhc2h2YWxzCisJICogRk9MTE9XIHRoZSBjdXJyZW50IGJsb2NrLgorCSAqCisJICogSWYgd2UgaGFkIGRvdWJsZS1zcGxpdCBvcCBiZWxvdyB1cywgdGhlbiBhZGQgdGhlIGV4dHJhIGJsb2NrIHRvby4KKwkgKi8KKwlub2RlID0gb2xkYmxrLT5icC0+ZGF0YTsKKwlpZiAob2xkYmxrLT5pbmRleCA8PSBJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkgeworCQlvbGRibGstPmluZGV4Kys7CisJCXhmc19kYV9ub2RlX2FkZChzdGF0ZSwgb2xkYmxrLCBhZGRibGspOworCQlpZiAodXNlZXh0cmEpIHsKKwkJCWlmIChzdGF0ZS0+ZXh0cmFhZnRlcikKKwkJCQlvbGRibGstPmluZGV4Kys7CisJCQl4ZnNfZGFfbm9kZV9hZGQoc3RhdGUsIG9sZGJsaywgJnN0YXRlLT5leHRyYWJsayk7CisJCQlzdGF0ZS0+ZXh0cmF2YWxpZCA9IDA7CisJCX0KKwl9IGVsc2UgeworCQluZXdibGstPmluZGV4Kys7CisJCXhmc19kYV9ub2RlX2FkZChzdGF0ZSwgbmV3YmxrLCBhZGRibGspOworCQlpZiAodXNlZXh0cmEpIHsKKwkJCWlmIChzdGF0ZS0+ZXh0cmFhZnRlcikKKwkJCQluZXdibGstPmluZGV4Kys7CisJCQl4ZnNfZGFfbm9kZV9hZGQoc3RhdGUsIG5ld2JsaywgJnN0YXRlLT5leHRyYWJsayk7CisJCQlzdGF0ZS0+ZXh0cmF2YWxpZCA9IDA7CisJCX0KKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBCYWxhbmNlIHRoZSBidHJlZSBlbGVtZW50cyBiZXR3ZWVuIHR3byBpbnRlcm1lZGlhdGUgbm9kZXMsCisgKiB1c3VhbGx5IG9uZSBmdWxsIGFuZCBvbmUgZW1wdHkuCisgKgorICogTk9URTogaWYgYmxrMiBpcyBlbXB0eSwgdGhlbiBpdCB3aWxsIGdldCB0aGUgdXBwZXIgaGFsZiBvZiBibGsxLgorICovCitTVEFUSUMgdm9pZAoreGZzX2RhX25vZGVfcmViYWxhbmNlKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwgeGZzX2RhX3N0YXRlX2Jsa190ICpibGsxLAorCQkJCSAgICAgeGZzX2RhX3N0YXRlX2Jsa190ICpibGsyKQoreworCXhmc19kYV9pbnRub2RlX3QgKm5vZGUxLCAqbm9kZTIsICp0bXBub2RlOworCXhmc19kYV9ub2RlX2VudHJ5X3QgKmJ0cmVlX3MsICpidHJlZV9kOworCWludCBjb3VudCwgdG1wOworCXhmc190cmFuc190ICp0cDsKKworCW5vZGUxID0gYmxrMS0+YnAtPmRhdGE7CisJbm9kZTIgPSBibGsyLT5icC0+ZGF0YTsKKwkvKgorCSAqIEZpZ3VyZSBvdXQgaG93IG1hbnkgZW50cmllcyBuZWVkIHRvIG1vdmUsIGFuZCBpbiB3aGljaCBkaXJlY3Rpb24uCisJICogU3dhcCB0aGUgbm9kZXMgYXJvdW5kIGlmIHRoYXQgbWFrZXMgaXQgc2ltcGxlci4KKwkgKi8KKwlpZiAoKElOVF9HRVQobm9kZTEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSA+IDApICYmIChJTlRfR0VUKG5vZGUyLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgPiAwKSAmJgorCSAgICAoKElOVF9HRVQobm9kZTItPmJ0cmVlWyAwIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSA8IElOVF9HRVQobm9kZTEtPmJ0cmVlWyAwIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSkgfHwKKwkgICAgIChJTlRfR0VUKG5vZGUyLT5idHJlZVsgSU5UX0dFVChub2RlMi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTEgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpIDwKKwkgICAgICBJTlRfR0VUKG5vZGUxLT5idHJlZVsgSU5UX0dFVChub2RlMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTEgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpKSkpIHsKKwkJdG1wbm9kZSA9IG5vZGUxOworCQlub2RlMSA9IG5vZGUyOworCQlub2RlMiA9IHRtcG5vZGU7CisJfQorCUFTU0VSVChJTlRfR0VUKG5vZGUxLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisJQVNTRVJUKElOVF9HRVQobm9kZTItPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19EQV9OT0RFX01BR0lDKTsKKwljb3VudCA9IChJTlRfR0VUKG5vZGUxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgLSBJTlRfR0VUKG5vZGUyLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpIC8gMjsKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuOworCXRwID0gc3RhdGUtPmFyZ3MtPnRyYW5zOworCS8qCisJICogVHdvIGNhc2VzOiBoaWdoLXRvLWxvdyBhbmQgbG93LXRvLWhpZ2guCisJICovCisJaWYgKGNvdW50ID4gMCkgeworCQkvKgorCQkgKiBNb3ZlIGVsZW1lbnRzIGluIG5vZGUyIHVwIHRvIG1ha2UgYSBob2xlLgorCQkgKi8KKwkJaWYgKCh0bXAgPSBJTlRfR0VUKG5vZGUyLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpID4gMCkgeworCQkJdG1wICo9ICh1aW50KXNpemVvZih4ZnNfZGFfbm9kZV9lbnRyeV90KTsKKwkJCWJ0cmVlX3MgPSAmbm9kZTItPmJ0cmVlWzBdOworCQkJYnRyZWVfZCA9ICZub2RlMi0+YnRyZWVbY291bnRdOworCQkJbWVtbW92ZShidHJlZV9kLCBidHJlZV9zLCB0bXApOworCQl9CisKKwkJLyoKKwkJICogTW92ZSB0aGUgcmVxJ2QgQi10cmVlIGVsZW1lbnRzIGZyb20gaGlnaCBpbiBub2RlMSB0bworCQkgKiBsb3cgaW4gbm9kZTIuCisJCSAqLworCQlJTlRfTU9EKG5vZGUyLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCwgY291bnQpOworCQl0bXAgPSBjb3VudCAqICh1aW50KXNpemVvZih4ZnNfZGFfbm9kZV9lbnRyeV90KTsKKwkJYnRyZWVfcyA9ICZub2RlMS0+YnRyZWVbSU5UX0dFVChub2RlMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gY291bnRdOworCQlidHJlZV9kID0gJm5vZGUyLT5idHJlZVswXTsKKwkJbWVtY3B5KGJ0cmVlX2QsIGJ0cmVlX3MsIHRtcCk7CisJCUlOVF9NT0Qobm9kZTEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJULCAtKGNvdW50KSk7CisKKwl9IGVsc2UgeworCQkvKgorCQkgKiBNb3ZlIHRoZSByZXEnZCBCLXRyZWUgZWxlbWVudHMgZnJvbSBsb3cgaW4gbm9kZTIgdG8KKwkJICogaGlnaCBpbiBub2RlMS4KKwkJICovCisJCWNvdW50ID0gLWNvdW50OworCQl0bXAgPSBjb3VudCAqICh1aW50KXNpemVvZih4ZnNfZGFfbm9kZV9lbnRyeV90KTsKKwkJYnRyZWVfcyA9ICZub2RlMi0+YnRyZWVbMF07CisJCWJ0cmVlX2QgPSAmbm9kZTEtPmJ0cmVlW0lOVF9HRVQobm9kZTEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKV07CisJCW1lbWNweShidHJlZV9kLCBidHJlZV9zLCB0bXApOworCQlJTlRfTU9EKG5vZGUxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCwgY291bnQpOworCQl4ZnNfZGFfbG9nX2J1Zih0cCwgYmxrMS0+YnAsCisJCQlYRlNfREFfTE9HUkFOR0Uobm9kZTEsIGJ0cmVlX2QsIHRtcCkpOworCisJCS8qCisJCSAqIE1vdmUgZWxlbWVudHMgaW4gbm9kZTIgZG93biB0byBmaWxsIHRoZSBob2xlLgorCQkgKi8KKwkJdG1wICA9IElOVF9HRVQobm9kZTItPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIGNvdW50OworCQl0bXAgKj0gKHVpbnQpc2l6ZW9mKHhmc19kYV9ub2RlX2VudHJ5X3QpOworCQlidHJlZV9zID0gJm5vZGUyLT5idHJlZVtjb3VudF07CisJCWJ0cmVlX2QgPSAmbm9kZTItPmJ0cmVlWzBdOworCQltZW1tb3ZlKGJ0cmVlX2QsIGJ0cmVlX3MsIHRtcCk7CisJCUlOVF9NT0Qobm9kZTItPmhkci5jb3VudCwgQVJDSF9DT05WRVJULCAtKGNvdW50KSk7CisJfQorCisJLyoKKwkgKiBMb2cgaGVhZGVyIG9mIG5vZGUgMSBhbmQgYWxsIGN1cnJlbnQgYml0cyBvZiBub2RlIDIuCisJICovCisJeGZzX2RhX2xvZ19idWYodHAsIGJsazEtPmJwLAorCQlYRlNfREFfTE9HUkFOR0Uobm9kZTEsICZub2RlMS0+aGRyLCBzaXplb2Yobm9kZTEtPmhkcikpKTsKKwl4ZnNfZGFfbG9nX2J1Zih0cCwgYmxrMi0+YnAsCisJCVhGU19EQV9MT0dSQU5HRShub2RlMiwgJm5vZGUyLT5oZHIsCisJCQlzaXplb2Yobm9kZTItPmhkcikgKworCQkJc2l6ZW9mKG5vZGUyLT5idHJlZVswXSkgKiBJTlRfR0VUKG5vZGUyLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpKTsKKworCS8qCisJICogUmVjb3JkIHRoZSBsYXN0IGhhc2h2YWwgZnJvbSBlYWNoIGJsb2NrIGZvciB1cHdhcmQgcHJvcGFnYXRpb24uCisJICogKG5vdGU6IGRvbid0IHVzZSB0aGUgc3dhcHBlZCBub2RlIHBvaW50ZXJzKQorCSAqLworCW5vZGUxID0gYmxrMS0+YnAtPmRhdGE7CisJbm9kZTIgPSBibGsyLT5icC0+ZGF0YTsKKwlibGsxLT5oYXNodmFsID0gSU5UX0dFVChub2RlMS0+YnRyZWVbIElOVF9HRVQobm9kZTEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKTsKKwlibGsyLT5oYXNodmFsID0gSU5UX0dFVChub2RlMi0+YnRyZWVbIElOVF9HRVQobm9kZTItPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKTsKKworCS8qCisJICogQWRqdXN0IHRoZSBleHBlY3RlZCBpbmRleCBmb3IgaW5zZXJ0aW9uLgorCSAqLworCWlmIChibGsxLT5pbmRleCA+PSBJTlRfR0VUKG5vZGUxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJYmxrMi0+aW5kZXggPSBibGsxLT5pbmRleCAtIElOVF9HRVQobm9kZTEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJYmxrMS0+aW5kZXggPSBJTlRfR0VUKG5vZGUxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgKyAxOwkvKiBtYWtlIGl0IGludmFsaWQgKi8KKwl9Cit9CisKKy8qCisgKiBBZGQgYSBuZXcgZW50cnkgdG8gYW4gaW50ZXJtZWRpYXRlIG5vZGUuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfZGFfbm9kZV9hZGQoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLCB4ZnNfZGFfc3RhdGVfYmxrX3QgKm9sZGJsaywKKwkJCSAgICAgICB4ZnNfZGFfc3RhdGVfYmxrX3QgKm5ld2JsaykKK3sKKwl4ZnNfZGFfaW50bm9kZV90ICpub2RlOworCXhmc19kYV9ub2RlX2VudHJ5X3QgKmJ0cmVlOworCWludCB0bXA7CisJeGZzX21vdW50X3QgKm1wOworCisJbm9kZSA9IG9sZGJsay0+YnAtPmRhdGE7CisJbXAgPSBzdGF0ZS0+bXA7CisJQVNTRVJUKElOVF9HRVQobm9kZS0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RBX05PREVfTUFHSUMpOworCUFTU0VSVCgob2xkYmxrLT5pbmRleCA+PSAwKSAmJiAob2xkYmxrLT5pbmRleCA8PSBJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkpOworCUFTU0VSVChuZXdibGstPmJsa25vICE9IDApOworCWlmIChzdGF0ZS0+YXJncy0+d2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUksgJiYgWEZTX0RJUl9JU19WMihtcCkpCisJCUFTU0VSVChuZXdibGstPmJsa25vID49IG1wLT5tX2RpcmxlYWZibGsgJiYKKwkJICAgICAgIG5ld2Jsay0+Ymxrbm8gPCBtcC0+bV9kaXJmcmVlYmxrKTsKKworCS8qCisJICogV2UgbWF5IG5lZWQgdG8gbWFrZSBzb21lIHJvb20gYmVmb3JlIHdlIGluc2VydCB0aGUgbmV3IG5vZGUuCisJICovCisJdG1wID0gMDsKKwlidHJlZSA9ICZub2RlLT5idHJlZVsgb2xkYmxrLT5pbmRleCBdOworCWlmIChvbGRibGstPmluZGV4IDwgSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJdG1wID0gKElOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gb2xkYmxrLT5pbmRleCkgKiAodWludClzaXplb2YoKmJ0cmVlKTsKKwkJbWVtbW92ZShidHJlZSArIDEsIGJ0cmVlLCB0bXApOworCX0KKwlJTlRfU0VUKGJ0cmVlLT5oYXNodmFsLCBBUkNIX0NPTlZFUlQsIG5ld2Jsay0+aGFzaHZhbCk7CisJSU5UX1NFVChidHJlZS0+YmVmb3JlLCBBUkNIX0NPTlZFUlQsIG5ld2Jsay0+Ymxrbm8pOworCXhmc19kYV9sb2dfYnVmKHN0YXRlLT5hcmdzLT50cmFucywgb2xkYmxrLT5icCwKKwkJWEZTX0RBX0xPR1JBTkdFKG5vZGUsIGJ0cmVlLCB0bXAgKyBzaXplb2YoKmJ0cmVlKSkpOworCUlOVF9NT0Qobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQsICsxKTsKKwl4ZnNfZGFfbG9nX2J1ZihzdGF0ZS0+YXJncy0+dHJhbnMsIG9sZGJsay0+YnAsCisJCVhGU19EQV9MT0dSQU5HRShub2RlLCAmbm9kZS0+aGRyLCBzaXplb2Yobm9kZS0+aGRyKSkpOworCisJLyoKKwkgKiBDb3B5IHRoZSBsYXN0IGhhc2ggdmFsdWUgZnJvbSB0aGUgb2xkYmxrIHRvIHByb3BhZ2F0ZSB1cHdhcmRzLgorCSAqLworCW9sZGJsay0+aGFzaHZhbCA9IElOVF9HRVQobm9kZS0+YnRyZWVbIElOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTEgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUm91dGluZXMgdXNlZCBmb3Igc2hyaW5raW5nIHRoZSBCdHJlZS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIERlYWxsb2NhdGUgYW4gZW1wdHkgbGVhZiBub2RlLCByZW1vdmUgaXQgZnJvbSBpdHMgcGFyZW50LAorICogcG9zc2libHkgZGVhbGxvY2F0aW5nIHRoYXQgYmxvY2ssIGV0Yy4uLgorICovCitpbnQKK3hmc19kYV9qb2luKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSkKK3sKKwl4ZnNfZGFfc3RhdGVfYmxrX3QgKmRyb3BfYmxrLCAqc2F2ZV9ibGs7CisJaW50IGFjdGlvbiwgZXJyb3I7CisKKwlhY3Rpb24gPSAwOworCWRyb3BfYmxrID0gJnN0YXRlLT5wYXRoLmJsa1sgc3RhdGUtPnBhdGguYWN0aXZlLTEgXTsKKwlzYXZlX2JsayA9ICZzdGF0ZS0+YWx0cGF0aC5ibGtbIHN0YXRlLT5wYXRoLmFjdGl2ZS0xIF07CisJQVNTRVJUKHN0YXRlLT5wYXRoLmJsa1swXS5tYWdpYyA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisJQVNTRVJUKGRyb3BfYmxrLT5tYWdpYyA9PSBYRlNfQVRUUl9MRUFGX01BR0lDIHx8CisJICAgICAgIGRyb3BfYmxrLT5tYWdpYyA9PSBYRlNfRElSWF9MRUFGX01BR0lDKHN0YXRlLT5tcCkpOworCisJLyoKKwkgKiBXYWxrIGJhY2sgdXAgdGhlIHRyZWUgam9pbmluZy9kZWFsbG9jYXRpbmcgYXMgbmVjZXNzYXJ5LgorCSAqIFdoZW4gd2Ugc3RvcCBkcm9wcGluZyBibG9ja3MsIGJyZWFrIG91dC4KKwkgKi8KKwlmb3IgKCAgOyBzdGF0ZS0+cGF0aC5hY3RpdmUgPj0gMjsgZHJvcF9ibGstLSwgc2F2ZV9ibGstLSwKKwkJIHN0YXRlLT5wYXRoLmFjdGl2ZS0tKSB7CisJCS8qCisJCSAqIFNlZSBpZiB3ZSBjYW4gY29tYmluZSB0aGUgYmxvY2sgd2l0aCBhIG5laWdoYm9yLgorCQkgKiAgIChhY3Rpb24gPT0gMCkgPT4gbm8gb3B0aW9ucywganVzdCBsZWF2ZQorCQkgKiAgIChhY3Rpb24gPT0gMSkgPT4gY29hbGVzY2UsIHRoZW4gdW5saW5rCisJCSAqICAgKGFjdGlvbiA9PSAyKSA9PiBibG9jayBlbXB0eSwgdW5saW5rIGl0CisJCSAqLworCQlzd2l0Y2ggKGRyb3BfYmxrLT5tYWdpYykgeworCQljYXNlIFhGU19BVFRSX0xFQUZfTUFHSUM6CisjaWZuZGVmIF9fS0VSTkVMX18KKwkJCWVycm9yID0gRU5PVFRZOworI2Vsc2UKKwkJCWVycm9yID0geGZzX2F0dHJfbGVhZl90b29zbWFsbChzdGF0ZSwgJmFjdGlvbik7CisjZW5kaWYKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4oZXJyb3IpOworCQkJaWYgKGFjdGlvbiA9PSAwKQorCQkJCXJldHVybigwKTsKKyNpZmRlZiBfX0tFUk5FTF9fCisJCQl4ZnNfYXR0cl9sZWFmX3VuYmFsYW5jZShzdGF0ZSwgZHJvcF9ibGssIHNhdmVfYmxrKTsKKyNlbmRpZgorCQkJYnJlYWs7CisJCWNhc2UgWEZTX0RJUl9MRUFGX01BR0lDOgorCQkJQVNTRVJUKFhGU19ESVJfSVNfVjEoc3RhdGUtPm1wKSk7CisJCQllcnJvciA9IHhmc19kaXJfbGVhZl90b29zbWFsbChzdGF0ZSwgJmFjdGlvbik7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuKGVycm9yKTsKKwkJCWlmIChhY3Rpb24gPT0gMCkKKwkJCQlyZXR1cm4oMCk7CisJCQl4ZnNfZGlyX2xlYWZfdW5iYWxhbmNlKHN0YXRlLCBkcm9wX2Jsaywgc2F2ZV9ibGspOworCQkJYnJlYWs7CisJCWNhc2UgWEZTX0RJUjJfTEVBRk5fTUFHSUM6CisJCQlBU1NFUlQoWEZTX0RJUl9JU19WMihzdGF0ZS0+bXApKTsKKwkJCWVycm9yID0geGZzX2RpcjJfbGVhZm5fdG9vc21hbGwoc3RhdGUsICZhY3Rpb24pOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybiBlcnJvcjsKKwkJCWlmIChhY3Rpb24gPT0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCXhmc19kaXIyX2xlYWZuX3VuYmFsYW5jZShzdGF0ZSwgZHJvcF9ibGssIHNhdmVfYmxrKTsKKwkJCWJyZWFrOworCQljYXNlIFhGU19EQV9OT0RFX01BR0lDOgorCQkJLyoKKwkJCSAqIFJlbW92ZSB0aGUgb2ZmZW5kaW5nIG5vZGUsIGZpeHVwIGhhc2h2YWxzLAorCQkJICogY2hlY2sgZm9yIGEgdG9vc21hbGwgbmVpZ2hib3IuCisJCQkgKi8KKwkJCXhmc19kYV9ub2RlX3JlbW92ZShzdGF0ZSwgZHJvcF9ibGspOworCQkJeGZzX2RhX2ZpeGhhc2hwYXRoKHN0YXRlLCAmc3RhdGUtPnBhdGgpOworCQkJZXJyb3IgPSB4ZnNfZGFfbm9kZV90b29zbWFsbChzdGF0ZSwgJmFjdGlvbik7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuKGVycm9yKTsKKwkJCWlmIChhY3Rpb24gPT0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCXhmc19kYV9ub2RlX3VuYmFsYW5jZShzdGF0ZSwgZHJvcF9ibGssIHNhdmVfYmxrKTsKKwkJCWJyZWFrOworCQl9CisJCXhmc19kYV9maXhoYXNocGF0aChzdGF0ZSwgJnN0YXRlLT5hbHRwYXRoKTsKKwkJZXJyb3IgPSB4ZnNfZGFfYmxrX3VubGluayhzdGF0ZSwgZHJvcF9ibGssIHNhdmVfYmxrKTsKKwkJeGZzX2RhX3N0YXRlX2tpbGxfYWx0cGF0aChzdGF0ZSk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybihlcnJvcik7CisJCWVycm9yID0geGZzX2RhX3Nocmlua19pbm9kZShzdGF0ZS0+YXJncywgZHJvcF9ibGstPmJsa25vLAorCQkJCQkJCSBkcm9wX2Jsay0+YnApOworCQlkcm9wX2Jsay0+YnAgPSBOVUxMOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4oZXJyb3IpOworCX0KKwkvKgorCSAqIFdlIGpvaW5lZCBhbGwgdGhlIHdheSB0byB0aGUgdG9wLiAgSWYgaXQgdHVybnMgb3V0IHRoYXQKKwkgKiB3ZSBvbmx5IGhhdmUgb25lIGVudHJ5IGluIHRoZSByb290LCBtYWtlIHRoZSBjaGlsZCBibG9jaworCSAqIHRoZSBuZXcgcm9vdC4KKwkgKi8KKwl4ZnNfZGFfbm9kZV9yZW1vdmUoc3RhdGUsIGRyb3BfYmxrKTsKKwl4ZnNfZGFfZml4aGFzaHBhdGgoc3RhdGUsICZzdGF0ZS0+cGF0aCk7CisJZXJyb3IgPSB4ZnNfZGFfcm9vdF9qb2luKHN0YXRlLCAmc3RhdGUtPnBhdGguYmxrWzBdKTsKKwlyZXR1cm4oZXJyb3IpOworfQorCisvKgorICogV2UgaGF2ZSBvbmx5IG9uZSBlbnRyeSBpbiB0aGUgcm9vdC4gIENvcHkgdGhlIG9ubHkgcmVtYWluaW5nIGNoaWxkIG9mCisgKiB0aGUgb2xkIHJvb3QgdG8gYmxvY2sgMCBhcyB0aGUgbmV3IHJvb3Qgbm9kZS4KKyAqLworU1RBVElDIGludAoreGZzX2RhX3Jvb3Rfam9pbih4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIHhmc19kYV9zdGF0ZV9ibGtfdCAqcm9vdF9ibGspCit7CisJeGZzX2RhX2ludG5vZGVfdCAqb2xkcm9vdDsKKwkvKiBSRUZFUkVOQ0VEICovCisJeGZzX2RhX2Jsa2luZm9fdCAqYmxraW5mbzsKKwl4ZnNfZGFfYXJnc190ICphcmdzOworCXhmc19kYWJsa190IGNoaWxkOworCXhmc19kYWJ1Zl90ICpicDsKKwlpbnQgZXJyb3I7CisKKwlhcmdzID0gc3RhdGUtPmFyZ3M7CisJQVNTRVJUKGFyZ3MgIT0gTlVMTCk7CisJQVNTRVJUKHJvb3RfYmxrLT5tYWdpYyA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisJb2xkcm9vdCA9IHJvb3RfYmxrLT5icC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChvbGRyb290LT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisJQVNTRVJUKCFvbGRyb290LT5oZHIuaW5mby5mb3J3KTsKKwlBU1NFUlQoIW9sZHJvb3QtPmhkci5pbmZvLmJhY2spOworCisJLyoKKwkgKiBJZiB0aGUgcm9vdCBoYXMgbW9yZSB0aGFuIG9uZSBjaGlsZCwgdGhlbiBkb24ndCBkbyBhbnl0aGluZy4KKwkgKi8KKwlpZiAoSU5UX0dFVChvbGRyb290LT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgPiAxKQorCQlyZXR1cm4oMCk7CisKKwkvKgorCSAqIFJlYWQgaW4gdGhlIChvbmx5KSBjaGlsZCBibG9jaywgdGhlbiBjb3B5IHRob3NlIGJ5dGVzIGludG8KKwkgKiB0aGUgcm9vdCBibG9jaydzIGJ1ZmZlciBhbmQgZnJlZSB0aGUgb3JpZ2luYWwgY2hpbGQgYmxvY2suCisJICovCisJY2hpbGQgPSBJTlRfR0VUKG9sZHJvb3QtPmJ0cmVlWyAwIF0uYmVmb3JlLCBBUkNIX0NPTlZFUlQpOworCUFTU0VSVChjaGlsZCAhPSAwKTsKKwllcnJvciA9IHhmc19kYV9yZWFkX2J1ZihhcmdzLT50cmFucywgYXJncy0+ZHAsIGNoaWxkLCAtMSwgJmJwLAorCQkJCQkgICAgIGFyZ3MtPndoaWNoZm9yayk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4oZXJyb3IpOworCUFTU0VSVChicCAhPSBOVUxMKTsKKwlibGtpbmZvID0gYnAtPmRhdGE7CisJaWYgKElOVF9HRVQob2xkcm9vdC0+aGRyLmxldmVsLCBBUkNIX0NPTlZFUlQpID09IDEpIHsKKwkJQVNTRVJUKElOVF9HRVQoYmxraW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUlhfTEVBRl9NQUdJQyhzdGF0ZS0+bXApIHx8CisJCSAgICAgICBJTlRfR0VUKGJsa2luZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCX0gZWxzZSB7CisJCUFTU0VSVChJTlRfR0VUKGJsa2luZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19EQV9OT0RFX01BR0lDKTsKKwl9CisJQVNTRVJUKCFibGtpbmZvLT5mb3J3KTsKKwlBU1NFUlQoIWJsa2luZm8tPmJhY2spOworCW1lbWNweShyb290X2Jsay0+YnAtPmRhdGEsIGJwLT5kYXRhLCBzdGF0ZS0+YmxvY2tzaXplKTsKKwl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgcm9vdF9ibGstPmJwLCAwLCBzdGF0ZS0+YmxvY2tzaXplIC0gMSk7CisJZXJyb3IgPSB4ZnNfZGFfc2hyaW5rX2lub2RlKGFyZ3MsIGNoaWxkLCBicCk7CisJcmV0dXJuKGVycm9yKTsKK30KKworLyoKKyAqIENoZWNrIGEgbm9kZSBibG9jayBhbmQgaXRzIG5laWdoYm9ycyB0byBzZWUgaWYgdGhlIGJsb2NrIHNob3VsZCBiZQorICogY29sbGFwc2VkIGludG8gb25lIG9yIHRoZSBvdGhlciBuZWlnaGJvci4gIEFsd2F5cyBrZWVwIHRoZSBibG9jaworICogd2l0aCB0aGUgc21hbGxlciBibG9jayBudW1iZXIuCisgKiBJZiB0aGUgY3VycmVudCBibG9jayBpcyBvdmVyIDUwJSBmdWxsLCBkb24ndCB0cnkgdG8gam9pbiBpdCwgcmV0dXJuIDAuCisgKiBJZiB0aGUgYmxvY2sgaXMgZW1wdHksIGZpbGwgaW4gdGhlIHN0YXRlIHN0cnVjdHVyZSBhbmQgcmV0dXJuIDIuCisgKiBJZiBpdCBjYW4gYmUgY29sbGFwc2VkLCBmaWxsIGluIHRoZSBzdGF0ZSBzdHJ1Y3R1cmUgYW5kIHJldHVybiAxLgorICogSWYgbm90aGluZyBjYW4gYmUgZG9uZSwgcmV0dXJuIDAuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19kYV9ub2RlX3Rvb3NtYWxsKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwgaW50ICphY3Rpb24pCit7CisJeGZzX2RhX2ludG5vZGVfdCAqbm9kZTsKKwl4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazsKKwl4ZnNfZGFfYmxraW5mb190ICppbmZvOworCWludCBjb3VudCwgZm9yd2FyZCwgZXJyb3IsIHJldHZhbCwgaTsKKwl4ZnNfZGFibGtfdCBibGtubzsKKwl4ZnNfZGFidWZfdCAqYnA7CisKKwkvKgorCSAqIENoZWNrIGZvciB0aGUgZGVnZW5lcmF0ZSBjYXNlIG9mIHRoZSBibG9jayBiZWluZyBvdmVyIDUwJSBmdWxsLgorCSAqIElmIHNvLCBpdCdzIG5vdCB3b3J0aCBldmVuIGxvb2tpbmcgdG8gc2VlIGlmIHdlIG1pZ2h0IGJlIGFibGUKKwkgKiB0byBjb2FsZXNjZSB3aXRoIGEgc2libGluZy4KKwkgKi8KKwlibGsgPSAmc3RhdGUtPnBhdGguYmxrWyBzdGF0ZS0+cGF0aC5hY3RpdmUtMSBdOworCWluZm8gPSBibGstPmJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGluZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19EQV9OT0RFX01BR0lDKTsKKwlub2RlID0gKHhmc19kYV9pbnRub2RlX3QgKilpbmZvOworCWNvdW50ID0gSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJaWYgKGNvdW50ID4gKHN0YXRlLT5ub2RlX2VudHMgPj4gMSkpIHsKKwkJKmFjdGlvbiA9IDA7CS8qIGJsayBvdmVyIDUwJSwgZG9uJ3QgdHJ5IHRvIGpvaW4gKi8KKwkJcmV0dXJuKDApOwkvKiBibGsgb3ZlciA1MCUsIGRvbid0IHRyeSB0byBqb2luICovCisJfQorCisJLyoKKwkgKiBDaGVjayBmb3IgdGhlIGRlZ2VuZXJhdGUgY2FzZSBvZiB0aGUgYmxvY2sgYmVpbmcgZW1wdHkuCisJICogSWYgdGhlIGJsb2NrIGlzIGVtcHR5LCB3ZSdsbCBzaW1wbHkgZGVsZXRlIGl0LCBubyBuZWVkIHRvCisJICogY29hbGVzY2UgaXQgd2l0aCBhIHNpYmxpbmcgYmxvY2suICBXZSBjaG9vc2UgKGFyaWJ0cmFyaWx5KQorCSAqIHRvIG1lcmdlIHdpdGggdGhlIGZvcndhcmQgYmxvY2sgdW5sZXNzIGl0IGlzIE5VTEwuCisJICovCisJaWYgKGNvdW50ID09IDApIHsKKwkJLyoKKwkJICogTWFrZSBhbHRwYXRoIHBvaW50IHRvIHRoZSBibG9jayB3ZSB3YW50IHRvIGtlZXAgYW5kCisJCSAqIHBhdGggcG9pbnQgdG8gdGhlIGJsb2NrIHdlIHdhbnQgdG8gZHJvcCAodGhpcyBvbmUpLgorCQkgKi8KKwkJZm9yd2FyZCA9IGluZm8tPmZvcnc7CisJCW1lbWNweSgmc3RhdGUtPmFsdHBhdGgsICZzdGF0ZS0+cGF0aCwgc2l6ZW9mKHN0YXRlLT5wYXRoKSk7CisJCWVycm9yID0geGZzX2RhX3BhdGhfc2hpZnQoc3RhdGUsICZzdGF0ZS0+YWx0cGF0aCwgZm9yd2FyZCwKKwkJCQkJCSAwLCAmcmV0dmFsKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuKGVycm9yKTsKKwkJaWYgKHJldHZhbCkgeworCQkJKmFjdGlvbiA9IDA7CisJCX0gZWxzZSB7CisJCQkqYWN0aW9uID0gMjsKKwkJfQorCQlyZXR1cm4oMCk7CisJfQorCisJLyoKKwkgKiBFeGFtaW5lIGVhY2ggc2libGluZyBibG9jayB0byBzZWUgaWYgd2UgY2FuIGNvYWxlc2NlIHdpdGgKKwkgKiBhdCBsZWFzdCAyNSUgZnJlZSBzcGFjZSB0byBzcGFyZS4gIFdlIG5lZWQgdG8gZmlndXJlIG91dAorCSAqIHdoZXRoZXIgdG8gbWVyZ2Ugd2l0aCB0aGUgZm9yd2FyZCBvciB0aGUgYmFja3dhcmQgYmxvY2suCisJICogV2UgcHJlZmVyIGNvYWxlc2Npbmcgd2l0aCB0aGUgbG93ZXIgbnVtYmVyZWQgc2libGluZyBzbyBhcworCSAqIHRvIHNocmluayBhIGRpcmVjdG9yeSBvdmVyIHRpbWUuCisJICovCisJLyogc3RhcnQgd2l0aCBzbWFsbGVyIGJsayBudW0gKi8KKwlmb3J3YXJkID0gKElOVF9HRVQoaW5mby0+Zm9ydywgQVJDSF9DT05WRVJUKQorCQkJCTwgSU5UX0dFVChpbmZvLT5iYWNrLCBBUkNIX0NPTlZFUlQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgZm9yd2FyZCA9ICFmb3J3YXJkLCBpKyspIHsKKwkJaWYgKGZvcndhcmQpCisJCQlibGtubyA9IElOVF9HRVQoaW5mby0+Zm9ydywgQVJDSF9DT05WRVJUKTsKKwkJZWxzZQorCQkJYmxrbm8gPSBJTlRfR0VUKGluZm8tPmJhY2ssIEFSQ0hfQ09OVkVSVCk7CisJCWlmIChibGtubyA9PSAwKQorCQkJY29udGludWU7CisJCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKHN0YXRlLT5hcmdzLT50cmFucywgc3RhdGUtPmFyZ3MtPmRwLAorCQkJCQlibGtubywgLTEsICZicCwgc3RhdGUtPmFyZ3MtPndoaWNoZm9yayk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybihlcnJvcik7CisJCUFTU0VSVChicCAhPSBOVUxMKTsKKworCQlub2RlID0gKHhmc19kYV9pbnRub2RlX3QgKilpbmZvOworCQljb3VudCAgPSBzdGF0ZS0+bm9kZV9lbnRzOworCQljb3VudCAtPSBzdGF0ZS0+bm9kZV9lbnRzID4+IDI7CisJCWNvdW50IC09IElOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQlub2RlID0gYnAtPmRhdGE7CisJCUFTU0VSVChJTlRfR0VUKG5vZGUtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19EQV9OT0RFX01BR0lDKTsKKwkJY291bnQgLT0gSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCXhmc19kYV9icmVsc2Uoc3RhdGUtPmFyZ3MtPnRyYW5zLCBicCk7CisJCWlmIChjb3VudCA+PSAwKQorCQkJYnJlYWs7CS8qIGZpdHMgd2l0aCBhdCBsZWFzdCAyNSUgdG8gc3BhcmUgKi8KKwl9CisJaWYgKGkgPj0gMikgeworCQkqYWN0aW9uID0gMDsKKwkJcmV0dXJuKDApOworCX0KKworCS8qCisJICogTWFrZSBhbHRwYXRoIHBvaW50IHRvIHRoZSBibG9jayB3ZSB3YW50IHRvIGtlZXAgKHRoZSBsb3dlcgorCSAqIG51bWJlcmVkIGJsb2NrKSBhbmQgcGF0aCBwb2ludCB0byB0aGUgYmxvY2sgd2Ugd2FudCB0byBkcm9wLgorCSAqLworCW1lbWNweSgmc3RhdGUtPmFsdHBhdGgsICZzdGF0ZS0+cGF0aCwgc2l6ZW9mKHN0YXRlLT5wYXRoKSk7CisJaWYgKGJsa25vIDwgYmxrLT5ibGtubykgeworCQllcnJvciA9IHhmc19kYV9wYXRoX3NoaWZ0KHN0YXRlLCAmc3RhdGUtPmFsdHBhdGgsIGZvcndhcmQsCisJCQkJCQkgMCwgJnJldHZhbCk7CisJCWlmIChlcnJvcikgeworCQkJcmV0dXJuKGVycm9yKTsKKwkJfQorCQlpZiAocmV0dmFsKSB7CisJCQkqYWN0aW9uID0gMDsKKwkJCXJldHVybigwKTsKKwkJfQorCX0gZWxzZSB7CisJCWVycm9yID0geGZzX2RhX3BhdGhfc2hpZnQoc3RhdGUsICZzdGF0ZS0+cGF0aCwgZm9yd2FyZCwKKwkJCQkJCSAwLCAmcmV0dmFsKTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZXR1cm4oZXJyb3IpOworCQl9CisJCWlmIChyZXR2YWwpIHsKKwkJCSphY3Rpb24gPSAwOworCQkJcmV0dXJuKDApOworCQl9CisJfQorCSphY3Rpb24gPSAxOworCXJldHVybigwKTsKK30KKworLyoKKyAqIFdhbGsgYmFjayB1cCB0aGUgdHJlZSBhZGp1c3RpbmcgaGFzaCB2YWx1ZXMgYXMgbmVjZXNzYXJ5LAorICogd2hlbiB3ZSBzdG9wIG1ha2luZyBjaGFuZ2VzLCByZXR1cm4uCisgKi8KK3ZvaWQKK3hmc19kYV9maXhoYXNocGF0aCh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIHhmc19kYV9zdGF0ZV9wYXRoX3QgKnBhdGgpCit7CisJeGZzX2RhX3N0YXRlX2Jsa190ICpibGs7CisJeGZzX2RhX2ludG5vZGVfdCAqbm9kZTsKKwl4ZnNfZGFfbm9kZV9lbnRyeV90ICpidHJlZTsKKwl4ZnNfZGFoYXNoX3QgbGFzdGhhc2g9MDsKKwlpbnQgbGV2ZWwsIGNvdW50OworCisJbGV2ZWwgPSBwYXRoLT5hY3RpdmUtMTsKKwlibGsgPSAmcGF0aC0+YmxrWyBsZXZlbCBdOworCXN3aXRjaCAoYmxrLT5tYWdpYykgeworI2lmZGVmIF9fS0VSTkVMX18KKwljYXNlIFhGU19BVFRSX0xFQUZfTUFHSUM6CisJCWxhc3RoYXNoID0geGZzX2F0dHJfbGVhZl9sYXN0aGFzaChibGstPmJwLCAmY291bnQpOworCQlpZiAoY291bnQgPT0gMCkKKwkJCXJldHVybjsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFhGU19ESVJfTEVBRl9NQUdJQzoKKwkJQVNTRVJUKFhGU19ESVJfSVNfVjEoc3RhdGUtPm1wKSk7CisJCWxhc3RoYXNoID0geGZzX2Rpcl9sZWFmX2xhc3RoYXNoKGJsay0+YnAsICZjb3VudCk7CisJCWlmIChjb3VudCA9PSAwKQorCQkJcmV0dXJuOworCQlicmVhazsKKwljYXNlIFhGU19ESVIyX0xFQUZOX01BR0lDOgorCQlBU1NFUlQoWEZTX0RJUl9JU19WMihzdGF0ZS0+bXApKTsKKwkJbGFzdGhhc2ggPSB4ZnNfZGlyMl9sZWFmbl9sYXN0aGFzaChibGstPmJwLCAmY291bnQpOworCQlpZiAoY291bnQgPT0gMCkKKwkJCXJldHVybjsKKwkJYnJlYWs7CisJY2FzZSBYRlNfREFfTk9ERV9NQUdJQzoKKwkJbGFzdGhhc2ggPSB4ZnNfZGFfbm9kZV9sYXN0aGFzaChibGstPmJwLCAmY291bnQpOworCQlpZiAoY291bnQgPT0gMCkKKwkJCXJldHVybjsKKwkJYnJlYWs7CisJfQorCWZvciAoYmxrLS0sIGxldmVsLS07IGxldmVsID49IDA7IGJsay0tLCBsZXZlbC0tKSB7CisJCW5vZGUgPSBibGstPmJwLT5kYXRhOworCQlBU1NFUlQoSU5UX0dFVChub2RlLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisJCWJ0cmVlID0gJm5vZGUtPmJ0cmVlWyBibGstPmluZGV4IF07CisJCWlmIChJTlRfR0VUKGJ0cmVlLT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpID09IGxhc3RoYXNoKQorCQkJYnJlYWs7CisJCWJsay0+aGFzaHZhbCA9IGxhc3RoYXNoOworCQlJTlRfU0VUKGJ0cmVlLT5oYXNodmFsLCBBUkNIX0NPTlZFUlQsIGxhc3RoYXNoKTsKKwkJeGZzX2RhX2xvZ19idWYoc3RhdGUtPmFyZ3MtPnRyYW5zLCBibGstPmJwLAorCQkJCSAgWEZTX0RBX0xPR1JBTkdFKG5vZGUsIGJ0cmVlLCBzaXplb2YoKmJ0cmVlKSkpOworCisJCWxhc3RoYXNoID0gSU5UX0dFVChub2RlLT5idHJlZVsgSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMSBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisJfQorfQorCisvKgorICogUmVtb3ZlIGFuIGVudHJ5IGZyb20gYW4gaW50ZXJtZWRpYXRlIG5vZGUuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfZGFfbm9kZV9yZW1vdmUoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLCB4ZnNfZGFfc3RhdGVfYmxrX3QgKmRyb3BfYmxrKQoreworCXhmc19kYV9pbnRub2RlX3QgKm5vZGU7CisJeGZzX2RhX25vZGVfZW50cnlfdCAqYnRyZWU7CisJaW50IHRtcDsKKworCW5vZGUgPSBkcm9wX2Jsay0+YnAtPmRhdGE7CisJQVNTRVJUKGRyb3BfYmxrLT5pbmRleCA8IElOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKTsKKwlBU1NFUlQoZHJvcF9ibGstPmluZGV4ID49IDApOworCisJLyoKKwkgKiBDb3B5IG92ZXIgdGhlIG9mZmVuZGluZyBlbnRyeSwgb3IganVzdCB6ZXJvIGl0IG91dC4KKwkgKi8KKwlidHJlZSA9ICZub2RlLT5idHJlZVtkcm9wX2Jsay0+aW5kZXhdOworCWlmIChkcm9wX2Jsay0+aW5kZXggPCAoSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMSkpIHsKKwkJdG1wICA9IElOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gZHJvcF9ibGstPmluZGV4IC0gMTsKKwkJdG1wICo9ICh1aW50KXNpemVvZih4ZnNfZGFfbm9kZV9lbnRyeV90KTsKKwkJbWVtbW92ZShidHJlZSwgYnRyZWUgKyAxLCB0bXApOworCQl4ZnNfZGFfbG9nX2J1ZihzdGF0ZS0+YXJncy0+dHJhbnMsIGRyb3BfYmxrLT5icCwKKwkJICAgIFhGU19EQV9MT0dSQU5HRShub2RlLCBidHJlZSwgdG1wKSk7CisJCWJ0cmVlID0gJm5vZGUtPmJ0cmVlWyBJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xIF07CisJfQorCW1lbXNldCgoY2hhciAqKWJ0cmVlLCAwLCBzaXplb2YoeGZzX2RhX25vZGVfZW50cnlfdCkpOworCXhmc19kYV9sb2dfYnVmKHN0YXRlLT5hcmdzLT50cmFucywgZHJvcF9ibGstPmJwLAorCSAgICBYRlNfREFfTE9HUkFOR0Uobm9kZSwgYnRyZWUsIHNpemVvZigqYnRyZWUpKSk7CisJSU5UX01PRChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCwgLTEpOworCXhmc19kYV9sb2dfYnVmKHN0YXRlLT5hcmdzLT50cmFucywgZHJvcF9ibGstPmJwLAorCSAgICBYRlNfREFfTE9HUkFOR0Uobm9kZSwgJm5vZGUtPmhkciwgc2l6ZW9mKG5vZGUtPmhkcikpKTsKKworCS8qCisJICogQ29weSB0aGUgbGFzdCBoYXNoIHZhbHVlIGZyb20gdGhlIGJsb2NrIHRvIHByb3BhZ2F0ZSB1cHdhcmRzLgorCSAqLworCWJ0cmVlLS07CisJZHJvcF9ibGstPmhhc2h2YWwgPSBJTlRfR0VUKGJ0cmVlLT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpOworfQorCisvKgorICogVW5iYWxhbmNlIHRoZSBidHJlZSBlbGVtZW50cyBiZXR3ZWVuIHR3byBpbnRlcm1lZGlhdGUgbm9kZXMsCisgKiBtb3ZlIGFsbCBCdHJlZSBlbGVtZW50cyBmcm9tIG9uZSBub2RlIGludG8gYW5vdGhlci4KKyAqLworU1RBVElDIHZvaWQKK3hmc19kYV9ub2RlX3VuYmFsYW5jZSh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIHhmc19kYV9zdGF0ZV9ibGtfdCAqZHJvcF9ibGssCisJCQkJICAgICB4ZnNfZGFfc3RhdGVfYmxrX3QgKnNhdmVfYmxrKQoreworCXhmc19kYV9pbnRub2RlX3QgKmRyb3Bfbm9kZSwgKnNhdmVfbm9kZTsKKwl4ZnNfZGFfbm9kZV9lbnRyeV90ICpidHJlZTsKKwlpbnQgdG1wOworCXhmc190cmFuc190ICp0cDsKKworCWRyb3Bfbm9kZSA9IGRyb3BfYmxrLT5icC0+ZGF0YTsKKwlzYXZlX25vZGUgPSBzYXZlX2Jsay0+YnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQoZHJvcF9ub2RlLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisJQVNTRVJUKElOVF9HRVQoc2F2ZV9ub2RlLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisJdHAgPSBzdGF0ZS0+YXJncy0+dHJhbnM7CisKKwkvKgorCSAqIElmIHRoZSBkeWluZyBibG9jayBoYXMgbG93ZXIgaGFzaHZhbHMsIHRoZW4gbW92ZSBhbGwgdGhlCisJICogZWxlbWVudHMgaW4gdGhlIHJlbWFpbmluZyBibG9jayB1cCB0byBtYWtlIGEgaG9sZS4KKwkgKi8KKwlpZiAoKElOVF9HRVQoZHJvcF9ub2RlLT5idHJlZVsgMCBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPCBJTlRfR0VUKHNhdmVfbm9kZS0+YnRyZWVbIDAgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpKSB8fAorCSAgICAoSU5UX0dFVChkcm9wX25vZGUtPmJ0cmVlWyBJTlRfR0VUKGRyb3Bfbm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTEgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpIDwKKwkgICAgIElOVF9HRVQoc2F2ZV9ub2RlLT5idHJlZVsgSU5UX0dFVChzYXZlX25vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSkpCisJeworCQlidHJlZSA9ICZzYXZlX25vZGUtPmJ0cmVlWyBJTlRfR0VUKGRyb3Bfbm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIF07CisJCXRtcCA9IElOVF9HRVQoc2F2ZV9ub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgKiAodWludClzaXplb2YoeGZzX2RhX25vZGVfZW50cnlfdCk7CisJCW1lbW1vdmUoYnRyZWUsICZzYXZlX25vZGUtPmJ0cmVlWzBdLCB0bXApOworCQlidHJlZSA9ICZzYXZlX25vZGUtPmJ0cmVlWzBdOworCQl4ZnNfZGFfbG9nX2J1Zih0cCwgc2F2ZV9ibGstPmJwLAorCQkJWEZTX0RBX0xPR1JBTkdFKHNhdmVfbm9kZSwgYnRyZWUsCisJCQkJKElOVF9HRVQoc2F2ZV9ub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgKyBJTlRfR0VUKGRyb3Bfbm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKSAqCisJCQkJc2l6ZW9mKHhmc19kYV9ub2RlX2VudHJ5X3QpKSk7CisJfSBlbHNlIHsKKwkJYnRyZWUgPSAmc2F2ZV9ub2RlLT5idHJlZVsgSU5UX0dFVChzYXZlX25vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSBdOworCQl4ZnNfZGFfbG9nX2J1Zih0cCwgc2F2ZV9ibGstPmJwLAorCQkJWEZTX0RBX0xPR1JBTkdFKHNhdmVfbm9kZSwgYnRyZWUsCisJCQkJSU5UX0dFVChkcm9wX25vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAqCisJCQkJc2l6ZW9mKHhmc19kYV9ub2RlX2VudHJ5X3QpKSk7CisJfQorCisJLyoKKwkgKiBNb3ZlIGFsbCB0aGUgQi10cmVlIGVsZW1lbnRzIGZyb20gZHJvcF9ibGsgdG8gc2F2ZV9ibGsuCisJICovCisJdG1wID0gSU5UX0dFVChkcm9wX25vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAqICh1aW50KXNpemVvZih4ZnNfZGFfbm9kZV9lbnRyeV90KTsKKwltZW1jcHkoYnRyZWUsICZkcm9wX25vZGUtPmJ0cmVlWzBdLCB0bXApOworCUlOVF9NT0Qoc2F2ZV9ub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCwgSU5UX0dFVChkcm9wX25vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSk7CisKKwl4ZnNfZGFfbG9nX2J1Zih0cCwgc2F2ZV9ibGstPmJwLAorCQlYRlNfREFfTE9HUkFOR0Uoc2F2ZV9ub2RlLCAmc2F2ZV9ub2RlLT5oZHIsCisJCQlzaXplb2Yoc2F2ZV9ub2RlLT5oZHIpKSk7CisKKwkvKgorCSAqIFNhdmUgdGhlIGxhc3QgaGFzaHZhbCBpbiB0aGUgcmVtYWluaW5nIGJsb2NrIGZvciB1cHdhcmQgcHJvcGFnYXRpb24uCisJICovCisJc2F2ZV9ibGstPmhhc2h2YWwgPSBJTlRfR0VUKHNhdmVfbm9kZS0+YnRyZWVbIElOVF9HRVQoc2F2ZV9ub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMSBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSb3V0aW5lcyB1c2VkIGZvciBmaW5kaW5nIHRoaW5ncyBpbiB0aGUgQnRyZWUuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBXYWxrIGRvd24gdGhlIEJ0cmVlIGxvb2tpbmcgZm9yIGEgcGFydGljdWxhciBmaWxlbmFtZSwgZmlsbGluZworICogaW4gdGhlIHN0YXRlIHN0cnVjdHVyZSBhcyB3ZSBnby4KKyAqCisgKiBXZSB3aWxsIHNldCB0aGUgc3RhdGUgc3RydWN0dXJlIHRvIHBvaW50IHRvIGVhY2ggb2YgdGhlIGVsZW1lbnRzCisgKiBpbiBlYWNoIG9mIHRoZSBub2RlcyB3aGVyZSBlaXRoZXIgdGhlIGhhc2h2YWwgaXMgb3Igc2hvdWxkIGJlLgorICoKKyAqIFdlIHN1cHBvcnQgZHVwbGljYXRlIGhhc2h2YWwncyBzbyBmb3IgZWFjaCBlbnRyeSBpbiB0aGUgY3VycmVudAorICogbm9kZSB0aGF0IGNvdWxkIGNvbnRhaW4gdGhlIGRlc2lyZWQgaGFzaHZhbCwgZGVzY2VuZC4gIFRoaXMgaXMgYQorICogcHJ1bmVkIGRlcHRoLWZpcnN0IHRyZWUgc2VhcmNoLgorICovCitpbnQJCQkJCQkJLyogZXJyb3IgKi8KK3hmc19kYV9ub2RlX2xvb2t1cF9pbnQoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLCBpbnQgKnJlc3VsdCkKK3sKKwl4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazsKKwl4ZnNfZGFfYmxraW5mb190ICpjdXJyOworCXhmc19kYV9pbnRub2RlX3QgKm5vZGU7CisJeGZzX2RhX25vZGVfZW50cnlfdCAqYnRyZWU7CisJeGZzX2RhYmxrX3QgYmxrbm87CisJaW50IHByb2JlLCBzcGFuLCBtYXgsIGVycm9yLCByZXR2YWw7CisJeGZzX2RhaGFzaF90IGhhc2h2YWw7CisJeGZzX2RhX2FyZ3NfdCAqYXJnczsKKworCWFyZ3MgPSBzdGF0ZS0+YXJnczsKKworCS8qCisJICogRGVzY2VuZCB0aHJ1IHRoZSBCLXRyZWUgc2VhcmNoaW5nIGVhY2ggbGV2ZWwgZm9yIHRoZSByaWdodAorCSAqIG5vZGUgdG8gdXNlLCB1bnRpbCB0aGUgcmlnaHQgaGFzaHZhbCBpcyBmb3VuZC4KKwkgKi8KKwlpZiAoYXJncy0+d2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUksgJiYgWEZTX0RJUl9JU19WMihzdGF0ZS0+bXApKQorCQlibGtubyA9IHN0YXRlLT5tcC0+bV9kaXJsZWFmYmxrOworCWVsc2UKKwkJYmxrbm8gPSAwOworCWZvciAoYmxrID0gJnN0YXRlLT5wYXRoLmJsa1swXSwgc3RhdGUtPnBhdGguYWN0aXZlID0gMTsKKwkJCSBzdGF0ZS0+cGF0aC5hY3RpdmUgPD0gWEZTX0RBX05PREVfTUFYREVQVEg7CisJCQkgYmxrKyssIHN0YXRlLT5wYXRoLmFjdGl2ZSsrKSB7CisJCS8qCisJCSAqIFJlYWQgdGhlIG5leHQgbm9kZSBkb3duIGluIHRoZSB0cmVlLgorCQkgKi8KKwkJYmxrLT5ibGtubyA9IGJsa25vOworCQllcnJvciA9IHhmc19kYV9yZWFkX2J1ZihhcmdzLT50cmFucywgYXJncy0+ZHAsIGJsa25vLAorCQkJCQktMSwgJmJsay0+YnAsIGFyZ3MtPndoaWNoZm9yayk7CisJCWlmIChlcnJvcikgeworCQkJYmxrLT5ibGtubyA9IDA7CisJCQlzdGF0ZS0+cGF0aC5hY3RpdmUtLTsKKwkJCXJldHVybihlcnJvcik7CisJCX0KKwkJY3VyciA9IGJsay0+YnAtPmRhdGE7CisJCUFTU0VSVChJTlRfR0VUKGN1cnItPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19EQV9OT0RFX01BR0lDIHx8CisJCSAgICAgICBJTlRfR0VUKGN1cnItPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVJYX0xFQUZfTUFHSUMoc3RhdGUtPm1wKSB8fAorCQkgICAgICAgSU5UX0dFVChjdXJyLT5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKworCQkvKgorCQkgKiBTZWFyY2ggYW4gaW50ZXJtZWRpYXRlIG5vZGUgZm9yIGEgbWF0Y2guCisJCSAqLworCQlibGstPm1hZ2ljID0gSU5UX0dFVChjdXJyLT5tYWdpYywgQVJDSF9DT05WRVJUKTsKKwkJaWYgKElOVF9HRVQoY3Vyci0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RBX05PREVfTUFHSUMpIHsKKwkJCW5vZGUgPSBibGstPmJwLT5kYXRhOworCQkJYmxrLT5oYXNodmFsID0gSU5UX0dFVChub2RlLT5idHJlZVsgSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMSBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisKKwkJCS8qCisJCQkgKiBCaW5hcnkgc2VhcmNoLiAgKG5vdGU6IHNtYWxsIGJsb2NrcyB3aWxsIHNraXAgbG9vcCkKKwkJCSAqLworCQkJbWF4ID0gSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCQlwcm9iZSA9IHNwYW4gPSBtYXggLyAyOworCQkJaGFzaHZhbCA9IGFyZ3MtPmhhc2h2YWw7CisJCQlmb3IgKGJ0cmVlID0gJm5vZGUtPmJ0cmVlW3Byb2JlXTsgc3BhbiA+IDQ7CisJCQkJICAgYnRyZWUgPSAmbm9kZS0+YnRyZWVbcHJvYmVdKSB7CisJCQkJc3BhbiAvPSAyOworCQkJCWlmIChJTlRfR0VUKGJ0cmVlLT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpIDwgaGFzaHZhbCkKKwkJCQkJcHJvYmUgKz0gc3BhbjsKKwkJCQllbHNlIGlmIChJTlRfR0VUKGJ0cmVlLT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpID4gaGFzaHZhbCkKKwkJCQkJcHJvYmUgLT0gc3BhbjsKKwkJCQllbHNlCisJCQkJCWJyZWFrOworCQkJfQorCQkJQVNTRVJUKChwcm9iZSA+PSAwKSAmJiAocHJvYmUgPCBtYXgpKTsKKwkJCUFTU0VSVCgoc3BhbiA8PSA0KSB8fCAoSU5UX0dFVChidHJlZS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA9PSBoYXNodmFsKSk7CisKKwkJCS8qCisJCQkgKiBTaW5jZSB3ZSBtYXkgaGF2ZSBkdXBsaWNhdGUgaGFzaHZhbCdzLCBmaW5kIHRoZSBmaXJzdAorCQkJICogbWF0Y2hpbmcgaGFzaHZhbCBpbiB0aGUgbm9kZS4KKwkJCSAqLworCQkJd2hpbGUgKChwcm9iZSA+IDApICYmIChJTlRfR0VUKGJ0cmVlLT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpID49IGhhc2h2YWwpKSB7CisJCQkJYnRyZWUtLTsKKwkJCQlwcm9iZS0tOworCQkJfQorCQkJd2hpbGUgKChwcm9iZSA8IG1heCkgJiYgKElOVF9HRVQoYnRyZWUtPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPCBoYXNodmFsKSkgeworCQkJCWJ0cmVlKys7CisJCQkJcHJvYmUrKzsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFBpY2sgdGhlIHJpZ2h0IGJsb2NrIHRvIGRlc2NlbmQgb24uCisJCQkgKi8KKwkJCWlmIChwcm9iZSA9PSBtYXgpIHsKKwkJCQlibGstPmluZGV4ID0gbWF4LTE7CisJCQkJYmxrbm8gPSBJTlRfR0VUKG5vZGUtPmJ0cmVlWyBtYXgtMSBdLmJlZm9yZSwgQVJDSF9DT05WRVJUKTsKKwkJCX0gZWxzZSB7CisJCQkJYmxrLT5pbmRleCA9IHByb2JlOworCQkJCWJsa25vID0gSU5UX0dFVChidHJlZS0+YmVmb3JlLCBBUkNIX0NPTlZFUlQpOworCQkJfQorCQl9CisjaWZkZWYgX19LRVJORUxfXworCQllbHNlIGlmIChJTlRfR0VUKGN1cnItPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19BVFRSX0xFQUZfTUFHSUMpIHsKKwkJCWJsay0+aGFzaHZhbCA9IHhmc19hdHRyX2xlYWZfbGFzdGhhc2goYmxrLT5icCwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCWVsc2UgaWYgKElOVF9HRVQoY3Vyci0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUl9MRUFGX01BR0lDKSB7CisJCQlibGstPmhhc2h2YWwgPSB4ZnNfZGlyX2xlYWZfbGFzdGhhc2goYmxrLT5icCwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQllbHNlIGlmIChJTlRfR0VUKGN1cnItPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0xFQUZOX01BR0lDKSB7CisJCQlibGstPmhhc2h2YWwgPSB4ZnNfZGlyMl9sZWFmbl9sYXN0aGFzaChibGstPmJwLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBBIGxlYWYgYmxvY2sgdGhhdCBlbmRzIGluIHRoZSBoYXNodmFsIHRoYXQgd2UgYXJlIGludGVyZXN0ZWQgaW4KKwkgKiAoZmluYWwgaGFzaHZhbCA9PSBzZWFyY2ggaGFzaHZhbCkgbWVhbnMgdGhhdCB0aGUgbmV4dCBibG9jayBtYXkKKwkgKiBjb250YWluIG1vcmUgZW50cmllcyB3aXRoIHRoZSBzYW1lIGhhc2h2YWwsIHNoaWZ0IHVwd2FyZCB0byB0aGUKKwkgKiBuZXh0IGxlYWYgYW5kIGtlZXAgc2VhcmNoaW5nLgorCSAqLworCWZvciAoOzspIHsKKwkJaWYgKGJsay0+bWFnaWMgPT0gWEZTX0RJUl9MRUFGX01BR0lDKSB7CisJCQlBU1NFUlQoWEZTX0RJUl9JU19WMShzdGF0ZS0+bXApKTsKKwkJCXJldHZhbCA9IHhmc19kaXJfbGVhZl9sb29rdXBfaW50KGJsay0+YnAsIGFyZ3MsCisJCQkJCQkJCSAgJmJsay0+aW5kZXgpOworCQl9IGVsc2UgaWYgKGJsay0+bWFnaWMgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpIHsKKwkJCUFTU0VSVChYRlNfRElSX0lTX1YyKHN0YXRlLT5tcCkpOworCQkJcmV0dmFsID0geGZzX2RpcjJfbGVhZm5fbG9va3VwX2ludChibGstPmJwLCBhcmdzLAorCQkJCQkJCSZibGstPmluZGV4LCBzdGF0ZSk7CisJCX0KKyNpZmRlZiBfX0tFUk5FTF9fCisJCWVsc2UgaWYgKGJsay0+bWFnaWMgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQykgeworCQkJcmV0dmFsID0geGZzX2F0dHJfbGVhZl9sb29rdXBfaW50KGJsay0+YnAsIGFyZ3MpOworCQkJYmxrLT5pbmRleCA9IGFyZ3MtPmluZGV4OworCQkJYXJncy0+Ymxrbm8gPSBibGstPmJsa25vOworCQl9CisjZW5kaWYKKwkJaWYgKCgocmV0dmFsID09IEVOT0VOVCkgfHwgKHJldHZhbCA9PSBFTk9BVFRSKSkgJiYKKwkJICAgIChibGstPmhhc2h2YWwgPT0gYXJncy0+aGFzaHZhbCkpIHsKKwkJCWVycm9yID0geGZzX2RhX3BhdGhfc2hpZnQoc3RhdGUsICZzdGF0ZS0+cGF0aCwgMSwgMSwKKwkJCQkJCQkgJnJldHZhbCk7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuKGVycm9yKTsKKwkJCWlmIChyZXR2YWwgPT0gMCkgeworCQkJCWNvbnRpbnVlOworCQkJfQorI2lmZGVmIF9fS0VSTkVMX18KKwkJCWVsc2UgaWYgKGJsay0+bWFnaWMgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQykgeworCQkJCS8qIHBhdGhfc2hpZnQoKSBnaXZlcyBFTk9FTlQgKi8KKwkJCQlyZXR2YWwgPSBYRlNfRVJST1IoRU5PQVRUUik7CisJCQl9CisjZW5kaWYKKwkJfQorCQlicmVhazsKKwl9CisJKnJlc3VsdCA9IHJldHZhbDsKKwlyZXR1cm4oMCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogTGluayBhIG5ldyBibG9jayBpbnRvIGEgZG91Ymx5IGxpbmtlZCBsaXN0IG9mIGJsb2NrcyAob2Ygd2hhdGV2ZXIgdHlwZSkuCisgKi8KK2ludAkJCQkJCQkvKiBlcnJvciAqLworeGZzX2RhX2Jsa19saW5rKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwgeGZzX2RhX3N0YXRlX2Jsa190ICpvbGRfYmxrLAorCQkJICAgICAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqbmV3X2JsaykKK3sKKwl4ZnNfZGFfYmxraW5mb190ICpvbGRfaW5mbywgKm5ld19pbmZvLCAqdG1wX2luZm87CisJeGZzX2RhX2FyZ3NfdCAqYXJnczsKKwlpbnQgYmVmb3JlPTAsIGVycm9yOworCXhmc19kYWJ1Zl90ICpicDsKKworCS8qCisJICogU2V0IHVwIGVudmlyb25tZW50LgorCSAqLworCWFyZ3MgPSBzdGF0ZS0+YXJnczsKKwlBU1NFUlQoYXJncyAhPSBOVUxMKTsKKwlvbGRfaW5mbyA9IG9sZF9ibGstPmJwLT5kYXRhOworCW5ld19pbmZvID0gbmV3X2Jsay0+YnAtPmRhdGE7CisJQVNTRVJUKG9sZF9ibGstPm1hZ2ljID09IFhGU19EQV9OT0RFX01BR0lDIHx8CisJICAgICAgIG9sZF9ibGstPm1hZ2ljID09IFhGU19ESVJYX0xFQUZfTUFHSUMoc3RhdGUtPm1wKSB8fAorCSAgICAgICBvbGRfYmxrLT5tYWdpYyA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQob2xkX2Jsay0+bWFnaWMgPT0gSU5UX0dFVChvbGRfaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVChuZXdfYmxrLT5tYWdpYyA9PSBJTlRfR0VUKG5ld19pbmZvLT5tYWdpYywgQVJDSF9DT05WRVJUKSk7CisJQVNTRVJUKG9sZF9ibGstPm1hZ2ljID09IG5ld19ibGstPm1hZ2ljKTsKKworCXN3aXRjaCAob2xkX2Jsay0+bWFnaWMpIHsKKyNpZmRlZiBfX0tFUk5FTF9fCisJY2FzZSBYRlNfQVRUUl9MRUFGX01BR0lDOgorCQliZWZvcmUgPSB4ZnNfYXR0cl9sZWFmX29yZGVyKG9sZF9ibGstPmJwLCBuZXdfYmxrLT5icCk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBYRlNfRElSX0xFQUZfTUFHSUM6CisJCUFTU0VSVChYRlNfRElSX0lTX1YxKHN0YXRlLT5tcCkpOworCQliZWZvcmUgPSB4ZnNfZGlyX2xlYWZfb3JkZXIob2xkX2Jsay0+YnAsIG5ld19ibGstPmJwKTsKKwkJYnJlYWs7CisJY2FzZSBYRlNfRElSMl9MRUFGTl9NQUdJQzoKKwkJQVNTRVJUKFhGU19ESVJfSVNfVjIoc3RhdGUtPm1wKSk7CisJCWJlZm9yZSA9IHhmc19kaXIyX2xlYWZuX29yZGVyKG9sZF9ibGstPmJwLCBuZXdfYmxrLT5icCk7CisJCWJyZWFrOworCWNhc2UgWEZTX0RBX05PREVfTUFHSUM6CisJCWJlZm9yZSA9IHhmc19kYV9ub2RlX29yZGVyKG9sZF9ibGstPmJwLCBuZXdfYmxrLT5icCk7CisJCWJyZWFrOworCX0KKworCS8qCisJICogTGluayBibG9ja3MgaW4gYXBwcm9wcmlhdGUgb3JkZXIuCisJICovCisJaWYgKGJlZm9yZSkgeworCQkvKgorCQkgKiBMaW5rIG5ldyBibG9jayBpbiBiZWZvcmUgZXhpc3RpbmcgYmxvY2suCisJCSAqLworCQlJTlRfU0VUKG5ld19pbmZvLT5mb3J3LCBBUkNIX0NPTlZFUlQsIG9sZF9ibGstPmJsa25vKTsKKwkJbmV3X2luZm8tPmJhY2sgPSBvbGRfaW5mby0+YmFjazsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJaWYgKElOVF9HRVQob2xkX2luZm8tPmJhY2ssIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwKKwkJCQkJCUlOVF9HRVQob2xkX2luZm8tPmJhY2ssCisJCQkJCQkJQVJDSF9DT05WRVJUKSwgLTEsICZicCwKKwkJCQkJCWFyZ3MtPndoaWNoZm9yayk7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuKGVycm9yKTsKKwkJCUFTU0VSVChicCAhPSBOVUxMKTsKKwkJCXRtcF9pbmZvID0gYnAtPmRhdGE7CisJCQlBU1NFUlQoSU5UX0dFVCh0bXBfaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gSU5UX0dFVChvbGRfaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkpOworCQkJQVNTRVJUKElOVF9HRVQodG1wX2luZm8tPmZvcncsIEFSQ0hfQ09OVkVSVCkgPT0gb2xkX2Jsay0+Ymxrbm8pOworCQkJSU5UX1NFVCh0bXBfaW5mby0+Zm9ydywgQVJDSF9DT05WRVJULCBuZXdfYmxrLT5ibGtubyk7CisJCQl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAsIDAsIHNpemVvZigqdG1wX2luZm8pLTEpOworCQkJeGZzX2RhX2J1Zl9kb25lKGJwKTsKKwkJfQorCQlJTlRfU0VUKG9sZF9pbmZvLT5iYWNrLCBBUkNIX0NPTlZFUlQsIG5ld19ibGstPmJsa25vKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBMaW5rIG5ldyBibG9jayBpbiBhZnRlciBleGlzdGluZyBibG9jay4KKwkJICovCisJCW5ld19pbmZvLT5mb3J3ID0gb2xkX2luZm8tPmZvcnc7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCUlOVF9TRVQobmV3X2luZm8tPmJhY2ssIEFSQ0hfQ09OVkVSVCwgb2xkX2Jsay0+Ymxrbm8pOworCQlpZiAoSU5UX0dFVChvbGRfaW5mby0+Zm9ydywgQVJDSF9DT05WRVJUKSkgeworCQkJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLAorCQkJCQkJSU5UX0dFVChvbGRfaW5mby0+Zm9ydywgQVJDSF9DT05WRVJUKSwgLTEsICZicCwKKwkJCQkJCWFyZ3MtPndoaWNoZm9yayk7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuKGVycm9yKTsKKwkJCUFTU0VSVChicCAhPSBOVUxMKTsKKwkJCXRtcF9pbmZvID0gYnAtPmRhdGE7CisJCQlBU1NFUlQoSU5UX0dFVCh0bXBfaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkgICAgPT0gSU5UX0dFVChvbGRfaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkpOworCQkJQVNTRVJUKElOVF9HRVQodG1wX2luZm8tPmJhY2ssIEFSQ0hfQ09OVkVSVCkKKwkJCQkgICAgPT0gb2xkX2Jsay0+Ymxrbm8pOworCQkJSU5UX1NFVCh0bXBfaW5mby0+YmFjaywgQVJDSF9DT05WRVJULCBuZXdfYmxrLT5ibGtubyk7CisJCQl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAsIDAsIHNpemVvZigqdG1wX2luZm8pLTEpOworCQkJeGZzX2RhX2J1Zl9kb25lKGJwKTsKKwkJfQorCQlJTlRfU0VUKG9sZF9pbmZvLT5mb3J3LCBBUkNIX0NPTlZFUlQsIG5ld19ibGstPmJsa25vKTsKKwl9CisKKwl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgb2xkX2Jsay0+YnAsIDAsIHNpemVvZigqdG1wX2luZm8pIC0gMSk7CisJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIG5ld19ibGstPmJwLCAwLCBzaXplb2YoKnRtcF9pbmZvKSAtIDEpOworCXJldHVybigwKTsKK30KKworLyoKKyAqIENvbXBhcmUgdHdvIGludGVybWVkaWF0ZSBub2RlcyBmb3IgIm9yZGVyIi4KKyAqLworU1RBVElDIGludAoreGZzX2RhX25vZGVfb3JkZXIoeGZzX2RhYnVmX3QgKm5vZGUxX2JwLCB4ZnNfZGFidWZfdCAqbm9kZTJfYnApCit7CisJeGZzX2RhX2ludG5vZGVfdCAqbm9kZTEsICpub2RlMjsKKworCW5vZGUxID0gbm9kZTFfYnAtPmRhdGE7CisJbm9kZTIgPSBub2RlMl9icC0+ZGF0YTsKKwlBU1NFUlQoKElOVF9HRVQobm9kZTEtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19EQV9OT0RFX01BR0lDKSAmJgorCSAgICAgICAoSU5UX0dFVChub2RlMi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RBX05PREVfTUFHSUMpKTsKKwlpZiAoKElOVF9HRVQobm9kZTEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSA+IDApICYmIChJTlRfR0VUKG5vZGUyLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgPiAwKSAmJgorCSAgICAoKElOVF9HRVQobm9kZTItPmJ0cmVlWyAwIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSA8CisJICAgICAgSU5UX0dFVChub2RlMS0+YnRyZWVbIDAgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpKSB8fAorCSAgICAgKElOVF9HRVQobm9kZTItPmJ0cmVlWyBJTlRfR0VUKG5vZGUyLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMSBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPAorCSAgICAgIElOVF9HRVQobm9kZTEtPmJ0cmVlWyBJTlRfR0VUKG5vZGUxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMSBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkpKSkgeworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybigwKTsKK30KKworLyoKKyAqIFBpY2sgdXAgdGhlIGxhc3QgaGFzaHZhbHVlIGZyb20gYW4gaW50ZXJtZWRpYXRlIG5vZGUuCisgKi8KK1NUQVRJQyB1aW50Cit4ZnNfZGFfbm9kZV9sYXN0aGFzaCh4ZnNfZGFidWZfdCAqYnAsIGludCAqY291bnQpCit7CisJeGZzX2RhX2ludG5vZGVfdCAqbm9kZTsKKworCW5vZGUgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChub2RlLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisJaWYgKGNvdW50KQorCQkqY291bnQgPSBJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwlpZiAoIW5vZGUtPmhkci5jb3VudCkKKwkJcmV0dXJuKDApOworCXJldHVybihJTlRfR0VUKG5vZGUtPmJ0cmVlWyBJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSk7Cit9CisKKy8qCisgKiBVbmxpbmsgYSBibG9jayBmcm9tIGEgZG91Ymx5IGxpbmtlZCBsaXN0IG9mIGJsb2Nrcy4KKyAqLworaW50CQkJCQkJCS8qIGVycm9yICovCit4ZnNfZGFfYmxrX3VubGluayh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIHhmc19kYV9zdGF0ZV9ibGtfdCAqZHJvcF9ibGssCisJCQkJIHhmc19kYV9zdGF0ZV9ibGtfdCAqc2F2ZV9ibGspCit7CisJeGZzX2RhX2Jsa2luZm9fdCAqZHJvcF9pbmZvLCAqc2F2ZV9pbmZvLCAqdG1wX2luZm87CisJeGZzX2RhX2FyZ3NfdCAqYXJnczsKKwl4ZnNfZGFidWZfdCAqYnA7CisJaW50IGVycm9yOworCisJLyoKKwkgKiBTZXQgdXAgZW52aXJvbm1lbnQuCisJICovCisJYXJncyA9IHN0YXRlLT5hcmdzOworCUFTU0VSVChhcmdzICE9IE5VTEwpOworCXNhdmVfaW5mbyA9IHNhdmVfYmxrLT5icC0+ZGF0YTsKKwlkcm9wX2luZm8gPSBkcm9wX2Jsay0+YnAtPmRhdGE7CisJQVNTRVJUKHNhdmVfYmxrLT5tYWdpYyA9PSBYRlNfREFfTk9ERV9NQUdJQyB8fAorCSAgICAgICBzYXZlX2Jsay0+bWFnaWMgPT0gWEZTX0RJUlhfTEVBRl9NQUdJQyhzdGF0ZS0+bXApIHx8CisJICAgICAgIHNhdmVfYmxrLT5tYWdpYyA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQoc2F2ZV9ibGstPm1hZ2ljID09IElOVF9HRVQoc2F2ZV9pbmZvLT5tYWdpYywgQVJDSF9DT05WRVJUKSk7CisJQVNTRVJUKGRyb3BfYmxrLT5tYWdpYyA9PSBJTlRfR0VUKGRyb3BfaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVChzYXZlX2Jsay0+bWFnaWMgPT0gZHJvcF9ibGstPm1hZ2ljKTsKKwlBU1NFUlQoKElOVF9HRVQoc2F2ZV9pbmZvLT5mb3J3LCBBUkNIX0NPTlZFUlQpID09IGRyb3BfYmxrLT5ibGtubykgfHwKKwkgICAgICAgKElOVF9HRVQoc2F2ZV9pbmZvLT5iYWNrLCBBUkNIX0NPTlZFUlQpID09IGRyb3BfYmxrLT5ibGtubykpOworCUFTU0VSVCgoSU5UX0dFVChkcm9wX2luZm8tPmZvcncsIEFSQ0hfQ09OVkVSVCkgPT0gc2F2ZV9ibGstPmJsa25vKSB8fAorCSAgICAgICAoSU5UX0dFVChkcm9wX2luZm8tPmJhY2ssIEFSQ0hfQ09OVkVSVCkgPT0gc2F2ZV9ibGstPmJsa25vKSk7CisKKwkvKgorCSAqIFVubGluayB0aGUgbGVhZiBibG9jayBmcm9tIHRoZSBkb3VibHkgbGlua2VkIGNoYWluIG9mIGxlYXZlcy4KKwkgKi8KKwlpZiAoSU5UX0dFVChzYXZlX2luZm8tPmJhY2ssIEFSQ0hfQ09OVkVSVCkgPT0gZHJvcF9ibGstPmJsa25vKSB7CisJCXNhdmVfaW5mby0+YmFjayA9IGRyb3BfaW5mby0+YmFjazsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJaWYgKElOVF9HRVQoZHJvcF9pbmZvLT5iYWNrLCBBUkNIX0NPTlZFUlQpKSB7CisJCQllcnJvciA9IHhmc19kYV9yZWFkX2J1ZihhcmdzLT50cmFucywgYXJncy0+ZHAsCisJCQkJCQlJTlRfR0VUKGRyb3BfaW5mby0+YmFjaywKKwkJCQkJCQlBUkNIX0NPTlZFUlQpLCAtMSwgJmJwLAorCQkJCQkJYXJncy0+d2hpY2hmb3JrKTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4oZXJyb3IpOworCQkJQVNTRVJUKGJwICE9IE5VTEwpOworCQkJdG1wX2luZm8gPSBicC0+ZGF0YTsKKwkJCUFTU0VSVChJTlRfR0VUKHRtcF9pbmZvLT5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBJTlRfR0VUKHNhdmVfaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkpOworCQkJQVNTRVJUKElOVF9HRVQodG1wX2luZm8tPmZvcncsIEFSQ0hfQ09OVkVSVCkgPT0gZHJvcF9ibGstPmJsa25vKTsKKwkJCUlOVF9TRVQodG1wX2luZm8tPmZvcncsIEFSQ0hfQ09OVkVSVCwgc2F2ZV9ibGstPmJsa25vKTsKKwkJCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicCwgMCwKKwkJCQkJCSAgICBzaXplb2YoKnRtcF9pbmZvKSAtIDEpOworCQkJeGZzX2RhX2J1Zl9kb25lKGJwKTsKKwkJfQorCX0gZWxzZSB7CisJCXNhdmVfaW5mby0+Zm9ydyA9IGRyb3BfaW5mby0+Zm9ydzsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJaWYgKElOVF9HRVQoZHJvcF9pbmZvLT5mb3J3LCBBUkNIX0NPTlZFUlQpKSB7CisJCQllcnJvciA9IHhmc19kYV9yZWFkX2J1ZihhcmdzLT50cmFucywgYXJncy0+ZHAsCisJCQkJCQlJTlRfR0VUKGRyb3BfaW5mby0+Zm9ydywgQVJDSF9DT05WRVJUKSwgLTEsICZicCwKKwkJCQkJCWFyZ3MtPndoaWNoZm9yayk7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuKGVycm9yKTsKKwkJCUFTU0VSVChicCAhPSBOVUxMKTsKKwkJCXRtcF9pbmZvID0gYnAtPmRhdGE7CisJCQlBU1NFUlQoSU5UX0dFVCh0bXBfaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkgICAgPT0gSU5UX0dFVChzYXZlX2luZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpKTsKKwkJCUFTU0VSVChJTlRfR0VUKHRtcF9pbmZvLT5iYWNrLCBBUkNIX0NPTlZFUlQpCisJCQkJICAgID09IGRyb3BfYmxrLT5ibGtubyk7CisJCQlJTlRfU0VUKHRtcF9pbmZvLT5iYWNrLCBBUkNIX0NPTlZFUlQsIHNhdmVfYmxrLT5ibGtubyk7CisJCQl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAsIDAsCisJCQkJCQkgICAgc2l6ZW9mKCp0bXBfaW5mbykgLSAxKTsKKwkJCXhmc19kYV9idWZfZG9uZShicCk7CisJCX0KKwl9CisKKwl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgc2F2ZV9ibGstPmJwLCAwLCBzaXplb2YoKnNhdmVfaW5mbykgLSAxKTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBNb3ZlIGEgcGF0aCAiZm9yd2FyZCIgb3IgIiFmb3J3YXJkIiBvbmUgYmxvY2sgYXQgdGhlIGN1cnJlbnQgbGV2ZWwuCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgYWRqdXN0IGEgInBhdGgiIHRvIHBvaW50IHRvIHRoZSBuZXh0IGJsb2NrCisgKiAiZm9yd2FyZCIgKGhpZ2hlciBoYXNodmFsdWVzKSBvciAiIWZvcndhcmQiIChsb3dlciBoYXNodmFscykgaW4gdGhlCisgKiBCdHJlZSwgaW5jbHVkaW5nIHVwZGF0aW5nIHBvaW50ZXJzIHRvIHRoZSBpbnRlcm1lZGlhdGUgbm9kZXMgYmV0d2VlbgorICogdGhlIG5ldyBib3R0b20gYW5kIHRoZSByb290LgorICovCitpbnQJCQkJCQkJLyogZXJyb3IgKi8KK3hmc19kYV9wYXRoX3NoaWZ0KHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwgeGZzX2RhX3N0YXRlX3BhdGhfdCAqcGF0aCwKKwkJCQkgaW50IGZvcndhcmQsIGludCByZWxlYXNlLCBpbnQgKnJlc3VsdCkKK3sKKwl4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazsKKwl4ZnNfZGFfYmxraW5mb190ICppbmZvOworCXhmc19kYV9pbnRub2RlX3QgKm5vZGU7CisJeGZzX2RhX2FyZ3NfdCAqYXJnczsKKwl4ZnNfZGFibGtfdCBibGtubz0wOworCWludCBsZXZlbCwgZXJyb3I7CisKKwkvKgorCSAqIFJvbGwgdXAgdGhlIEJ0cmVlIGxvb2tpbmcgZm9yIHRoZSBmaXJzdCBibG9jayB3aGVyZSBvdXIKKwkgKiBjdXJyZW50IGluZGV4IGlzIG5vdCBhdCB0aGUgZWRnZSBvZiB0aGUgYmxvY2suICBOb3RlIHRoYXQKKwkgKiB3ZSBza2lwIHRoZSBib3R0b20gbGF5ZXIgYmVjYXVzZSB3ZSB3YW50IHRoZSBzaWJsaW5nIGJsb2NrLgorCSAqLworCWFyZ3MgPSBzdGF0ZS0+YXJnczsKKwlBU1NFUlQoYXJncyAhPSBOVUxMKTsKKwlBU1NFUlQocGF0aCAhPSBOVUxMKTsKKwlBU1NFUlQoKHBhdGgtPmFjdGl2ZSA+IDApICYmIChwYXRoLT5hY3RpdmUgPCBYRlNfREFfTk9ERV9NQVhERVBUSCkpOworCWxldmVsID0gKHBhdGgtPmFjdGl2ZS0xKSAtIDE7CS8qIHNraXAgYm90dG9tIGxheWVyIGluIHBhdGggKi8KKwlmb3IgKGJsayA9ICZwYXRoLT5ibGtbbGV2ZWxdOyBsZXZlbCA+PSAwOyBibGstLSwgbGV2ZWwtLSkgeworCQlBU1NFUlQoYmxrLT5icCAhPSBOVUxMKTsKKwkJbm9kZSA9IGJsay0+YnAtPmRhdGE7CisJCUFTU0VSVChJTlRfR0VUKG5vZGUtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19EQV9OT0RFX01BR0lDKTsKKwkJaWYgKGZvcndhcmQgJiYgKGJsay0+aW5kZXggPCBJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xKSkgeworCQkJYmxrLT5pbmRleCsrOworCQkJYmxrbm8gPSBJTlRfR0VUKG5vZGUtPmJ0cmVlWyBibGstPmluZGV4IF0uYmVmb3JlLCBBUkNIX0NPTlZFUlQpOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoIWZvcndhcmQgJiYgKGJsay0+aW5kZXggPiAwKSkgeworCQkJYmxrLT5pbmRleC0tOworCQkJYmxrbm8gPSBJTlRfR0VUKG5vZGUtPmJ0cmVlWyBibGstPmluZGV4IF0uYmVmb3JlLCBBUkNIX0NPTlZFUlQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGxldmVsIDwgMCkgeworCQkqcmVzdWx0ID0gWEZTX0VSUk9SKEVOT0VOVCk7CS8qIHdlJ3JlIG91dCBvZiBvdXIgdHJlZSAqLworCQlBU1NFUlQoYXJncy0+b2tub2VudCk7CisJCXJldHVybigwKTsKKwl9CisKKwkvKgorCSAqIFJvbGwgZG93biB0aGUgZWRnZSBvZiB0aGUgc3VidHJlZSB1bnRpbCB3ZSByZWFjaCB0aGUKKwkgKiBzYW1lIGRlcHRoIHdlIHdlcmUgYXQgb3JpZ2luYWxseS4KKwkgKi8KKwlmb3IgKGJsaysrLCBsZXZlbCsrOyBsZXZlbCA8IHBhdGgtPmFjdGl2ZTsgYmxrKyssIGxldmVsKyspIHsKKwkJLyoKKwkJICogUmVsZWFzZSB0aGUgb2xkIGJsb2NrLgorCQkgKiAoaWYgaXQncyBkaXJ0eSwgdHJhbnMgd29uJ3QgYWN0dWFsbHkgbGV0IGdvKQorCQkgKi8KKwkJaWYgKHJlbGVhc2UpCisJCQl4ZnNfZGFfYnJlbHNlKGFyZ3MtPnRyYW5zLCBibGstPmJwKTsKKworCQkvKgorCQkgKiBSZWFkIHRoZSBuZXh0IGNoaWxkIGJsb2NrLgorCQkgKi8KKwkJYmxrLT5ibGtubyA9IGJsa25vOworCQllcnJvciA9IHhmc19kYV9yZWFkX2J1ZihhcmdzLT50cmFucywgYXJncy0+ZHAsIGJsa25vLCAtMSwKKwkJCQkJCSAgICAgJmJsay0+YnAsIGFyZ3MtPndoaWNoZm9yayk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybihlcnJvcik7CisJCUFTU0VSVChibGstPmJwICE9IE5VTEwpOworCQlpbmZvID0gYmxrLT5icC0+ZGF0YTsKKwkJQVNTRVJUKElOVF9HRVQoaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RBX05PREVfTUFHSUMgfHwKKwkJICAgICAgIElOVF9HRVQoaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUlhfTEVBRl9NQUdJQyhzdGF0ZS0+bXApIHx8CisJCSAgICAgICBJTlRfR0VUKGluZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCQlibGstPm1hZ2ljID0gSU5UX0dFVChpbmZvLT5tYWdpYywgQVJDSF9DT05WRVJUKTsKKwkJaWYgKElOVF9HRVQoaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RBX05PREVfTUFHSUMpIHsKKwkJCW5vZGUgPSAoeGZzX2RhX2ludG5vZGVfdCAqKWluZm87CisJCQlibGstPmhhc2h2YWwgPSBJTlRfR0VUKG5vZGUtPmJ0cmVlWyBJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKTsKKwkJCWlmIChmb3J3YXJkKQorCQkJCWJsay0+aW5kZXggPSAwOworCQkJZWxzZQorCQkJCWJsay0+aW5kZXggPSBJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xOworCQkJYmxrbm8gPSBJTlRfR0VUKG5vZGUtPmJ0cmVlWyBibGstPmluZGV4IF0uYmVmb3JlLCBBUkNIX0NPTlZFUlQpOworCQl9IGVsc2UgeworCQkJQVNTRVJUKGxldmVsID09IHBhdGgtPmFjdGl2ZS0xKTsKKwkJCWJsay0+aW5kZXggPSAwOworCQkJc3dpdGNoKGJsay0+bWFnaWMpIHsKKyNpZmRlZiBfX0tFUk5FTF9fCisJCQljYXNlIFhGU19BVFRSX0xFQUZfTUFHSUM6CisJCQkJYmxrLT5oYXNodmFsID0geGZzX2F0dHJfbGVhZl9sYXN0aGFzaChibGstPmJwLAorCQkJCQkJCQkgICAgICBOVUxMKTsKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJY2FzZSBYRlNfRElSX0xFQUZfTUFHSUM6CisJCQkJQVNTRVJUKFhGU19ESVJfSVNfVjEoc3RhdGUtPm1wKSk7CisJCQkJYmxrLT5oYXNodmFsID0geGZzX2Rpcl9sZWFmX2xhc3RoYXNoKGJsay0+YnAsCisJCQkJCQkJCSAgICAgTlVMTCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFhGU19ESVIyX0xFQUZOX01BR0lDOgorCQkJCUFTU0VSVChYRlNfRElSX0lTX1YyKHN0YXRlLT5tcCkpOworCQkJCWJsay0+aGFzaHZhbCA9IHhmc19kaXIyX2xlYWZuX2xhc3RoYXNoKGJsay0+YnAsCisJCQkJCQkJCSAgICAgICBOVUxMKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQVNTRVJUKGJsay0+bWFnaWMgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyB8fAorCQkJCSAgICAgICBibGstPm1hZ2ljID09CisJCQkJICAgICAgIFhGU19ESVJYX0xFQUZfTUFHSUMoc3RhdGUtPm1wKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJKnJlc3VsdCA9IDA7CisJcmV0dXJuKDApOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogSW1wbGVtZW50IGEgc2ltcGxlIGhhc2ggb24gYSBjaGFyYWN0ZXIgc3RyaW5nLgorICogUm90YXRlIHRoZSBoYXNoIHZhbHVlIGJ5IDcgYml0cywgdGhlbiBYT1IgZWFjaCBjaGFyYWN0ZXIgaW4uCisgKiBUaGlzIGlzIGltcGxlbWVudGVkIHdpdGggc29tZSBzb3VyY2UtbGV2ZWwgbG9vcCB1bnJvbGxpbmcuCisgKi8KK3hmc19kYWhhc2hfdAoreGZzX2RhX2hhc2huYW1lKHVjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKQoreworCXhmc19kYWhhc2hfdCBoYXNoOworCisjaWZkZWYgU0xPV1ZFUlNJT04KKwkvKgorCSAqIFRoaXMgaXMgdGhlIG9sZCBvbmUtYnl0ZS1hdC1hLXRpbWUgdmVyc2lvbi4KKwkgKi8KKwlmb3IgKGhhc2ggPSAwOyBuYW1lbGVuID4gMDsgbmFtZWxlbi0tKQorCQloYXNoID0gKm5hbWUrKyBeIHJvbDMyKGhhc2gsIDcpOworCisJcmV0dXJuKGhhc2gpOworI2Vsc2UKKwkvKgorCSAqIERvIGZvdXIgY2hhcmFjdGVycyBhdCBhIHRpbWUgYXMgbG9uZyBhcyB3ZSBjYW4uCisJICovCisJZm9yIChoYXNoID0gMDsgbmFtZWxlbiA+PSA0OyBuYW1lbGVuIC09IDQsIG5hbWUgKz0gNCkKKwkJaGFzaCA9IChuYW1lWzBdIDw8IDIxKSBeIChuYW1lWzFdIDw8IDE0KSBeIChuYW1lWzJdIDw8IDcpIF4KKwkJICAgICAgIChuYW1lWzNdIDw8IDApIF4gcm9sMzIoaGFzaCwgNyAqIDQpOworCisJLyoKKwkgKiBOb3cgZG8gdGhlIHJlc3Qgb2YgdGhlIGNoYXJhY3RlcnMuCisJICovCisJc3dpdGNoIChuYW1lbGVuKSB7CisJY2FzZSAzOgorCQlyZXR1cm4gKG5hbWVbMF0gPDwgMTQpIF4gKG5hbWVbMV0gPDwgNykgXiAobmFtZVsyXSA8PCAwKSBeCisJCSAgICAgICByb2wzMihoYXNoLCA3ICogMyk7CisJY2FzZSAyOgorCQlyZXR1cm4gKG5hbWVbMF0gPDwgNykgXiAobmFtZVsxXSA8PCAwKSBeIHJvbDMyKGhhc2gsIDcgKiAyKTsKKwljYXNlIDE6CisJCXJldHVybiAobmFtZVswXSA8PCAwKSBeIHJvbDMyKGhhc2gsIDcgKiAxKTsKKwljYXNlIDA6CisJCXJldHVybiBoYXNoOworCX0KKwkvKiBOT1RSRUFDSEVEICovCisjZW5kaWYKKwlyZXR1cm4gMDsgLyoga2VlcCBnY2MgaGFwcHkgKi8KK30KKworLyoKKyAqIEFkZCBhIGJsb2NrIHRvIHRoZSBidHJlZSBhaGVhZCBvZiB0aGUgZmlsZS4KKyAqIFJldHVybiB0aGUgbmV3IGJsb2NrIG51bWJlciB0byB0aGUgY2FsbGVyLgorICovCitpbnQKK3hmc19kYV9ncm93X2lub2RlKHhmc19kYV9hcmdzX3QgKmFyZ3MsIHhmc19kYWJsa190ICpuZXdfYmxrbm8pCit7CisJeGZzX2ZpbGVvZmZfdCBibm8sIGI7CisJeGZzX2JtYnRfaXJlY190IG1hcDsKKwl4ZnNfYm1idF9pcmVjX3QJKm1hcHA7CisJeGZzX2lub2RlX3QgKmRwOworCWludCBubWFwLCBlcnJvciwgdywgY291bnQsIGMsIGdvdCwgaSwgbWFwaTsKKwl4ZnNfZnNpemVfdCBzaXplOworCXhmc190cmFuc190ICp0cDsKKwl4ZnNfbW91bnRfdCAqbXA7CisKKwlkcCA9IGFyZ3MtPmRwOworCW1wID0gZHAtPmlfbW91bnQ7CisJdyA9IGFyZ3MtPndoaWNoZm9yazsKKwl0cCA9IGFyZ3MtPnRyYW5zOworCS8qCisJICogRm9yIG5ldyBkaXJlY3RvcmllcyBhZGp1c3QgdGhlIGZpbGUgb2Zmc2V0IGFuZCBibG9jayBjb3VudC4KKwkgKi8KKwlpZiAodyA9PSBYRlNfREFUQV9GT1JLICYmIFhGU19ESVJfSVNfVjIobXApKSB7CisJCWJubyA9IG1wLT5tX2RpcmxlYWZibGs7CisJCWNvdW50ID0gbXAtPm1fZGlyYmxrZnNiczsKKwl9IGVsc2UgeworCQlibm8gPSAwOworCQljb3VudCA9IDE7CisJfQorCS8qCisJICogRmluZCBhIHNwb3QgaW4gdGhlIGZpbGUgc3BhY2UgdG8gcHV0IHRoZSBuZXcgYmxvY2suCisJICovCisJaWYgKChlcnJvciA9IHhmc19ibWFwX2ZpcnN0X3VudXNlZCh0cCwgZHAsIGNvdW50LCAmYm5vLCB3KSkpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlpZiAodyA9PSBYRlNfREFUQV9GT1JLICYmIFhGU19ESVJfSVNfVjIobXApKQorCQlBU1NFUlQoYm5vID49IG1wLT5tX2RpcmxlYWZibGsgJiYgYm5vIDwgbXAtPm1fZGlyZnJlZWJsayk7CisJLyoKKwkgKiBUcnkgbWFwcGluZyBpdCBpbiBvbmUgZmlsZXN5c3RlbSBibG9jay4KKwkgKi8KKwlubWFwID0gMTsKKwlBU1NFUlQoYXJncy0+Zmlyc3RibG9jayAhPSBOVUxMKTsKKwlpZiAoKGVycm9yID0geGZzX2JtYXBpKHRwLCBkcCwgYm5vLCBjb3VudCwKKwkJCVhGU19CTUFQSV9BRkxBRyh3KXxYRlNfQk1BUElfV1JJVEV8WEZTX0JNQVBJX01FVEFEQVRBfAorCQkJWEZTX0JNQVBJX0NPTlRJRywKKwkJCWFyZ3MtPmZpcnN0YmxvY2ssIGFyZ3MtPnRvdGFsLCAmbWFwLCAmbm1hcCwKKwkJCWFyZ3MtPmZsaXN0KSkpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlBU1NFUlQobm1hcCA8PSAxKTsKKwlpZiAobm1hcCA9PSAxKSB7CisJCW1hcHAgPSAmbWFwOworCQltYXBpID0gMTsKKwl9CisJLyoKKwkgKiBJZiB3ZSBkaWRuJ3QgZ2V0IGl0IGFuZCB0aGUgYmxvY2sgbWlnaHQgd29yayBpZiBmcmFnbWVudGVkLAorCSAqIHRyeSB3aXRob3V0IHRoZSBDT05USUcgZmxhZy4gIExvb3AgdW50aWwgd2UgZ2V0IGl0IGFsbC4KKwkgKi8KKwllbHNlIGlmIChubWFwID09IDAgJiYgY291bnQgPiAxKSB7CisJCW1hcHAgPSBrbWVtX2FsbG9jKHNpemVvZigqbWFwcCkgKiBjb3VudCwgS01fU0xFRVApOworCQlmb3IgKGIgPSBibm8sIG1hcGkgPSAwOyBiIDwgYm5vICsgY291bnQ7ICkgeworCQkJbm1hcCA9IE1JTihYRlNfQk1BUF9NQVhfTk1BUCwgY291bnQpOworCQkJYyA9IChpbnQpKGJubyArIGNvdW50IC0gYik7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYXBpKHRwLCBkcCwgYiwgYywKKwkJCQkJWEZTX0JNQVBJX0FGTEFHKHcpfFhGU19CTUFQSV9XUklURXwKKwkJCQkJWEZTX0JNQVBJX01FVEFEQVRBLAorCQkJCQlhcmdzLT5maXJzdGJsb2NrLCBhcmdzLT50b3RhbCwKKwkJCQkJJm1hcHBbbWFwaV0sICZubWFwLCBhcmdzLT5mbGlzdCkpKSB7CisJCQkJa21lbV9mcmVlKG1hcHAsIHNpemVvZigqbWFwcCkgKiBjb3VudCk7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQkJaWYgKG5tYXAgPCAxKQorCQkJCWJyZWFrOworCQkJbWFwaSArPSBubWFwOworCQkJYiA9IG1hcHBbbWFwaSAtIDFdLmJyX3N0YXJ0b2ZmICsKKwkJCSAgICBtYXBwW21hcGkgLSAxXS5icl9ibG9ja2NvdW50OworCQl9CisJfSBlbHNlIHsKKwkJbWFwaSA9IDA7CisJCW1hcHAgPSBOVUxMOworCX0KKwkvKgorCSAqIENvdW50IHRoZSBibG9ja3Mgd2UgZ290LCBtYWtlIHN1cmUgaXQgbWF0Y2hlcyB0aGUgdG90YWwuCisJICovCisJZm9yIChpID0gMCwgZ290ID0gMDsgaSA8IG1hcGk7IGkrKykKKwkJZ290ICs9IG1hcHBbaV0uYnJfYmxvY2tjb3VudDsKKwlpZiAoZ290ICE9IGNvdW50IHx8IG1hcHBbMF0uYnJfc3RhcnRvZmYgIT0gYm5vIHx8CisJICAgIG1hcHBbbWFwaSAtIDFdLmJyX3N0YXJ0b2ZmICsgbWFwcFttYXBpIC0gMV0uYnJfYmxvY2tjb3VudCAhPQorCSAgICBibm8gKyBjb3VudCkgeworCQlpZiAobWFwcCAhPSAmbWFwKQorCQkJa21lbV9mcmVlKG1hcHAsIHNpemVvZigqbWFwcCkgKiBjb3VudCk7CisJCXJldHVybiBYRlNfRVJST1IoRU5PU1BDKTsKKwl9CisJaWYgKG1hcHAgIT0gJm1hcCkKKwkJa21lbV9mcmVlKG1hcHAsIHNpemVvZigqbWFwcCkgKiBjb3VudCk7CisJKm5ld19ibGtubyA9ICh4ZnNfZGFibGtfdClibm87CisJLyoKKwkgKiBGb3IgdmVyc2lvbiAxIGRpcmVjdG9yaWVzLCBhZGp1c3QgdGhlIGZpbGUgc2l6ZSBpZiBpdCBjaGFuZ2VkLgorCSAqLworCWlmICh3ID09IFhGU19EQVRBX0ZPUksgJiYgWEZTX0RJUl9JU19WMShtcCkpIHsKKwkJQVNTRVJUKG1hcGkgPT0gMSk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYm1hcF9sYXN0X29mZnNldCh0cCwgZHAsICZibm8sIHcpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJc2l6ZSA9IFhGU19GU0JfVE9fQihtcCwgYm5vKTsKKwkJaWYgKHNpemUgIT0gZHAtPmlfZC5kaV9zaXplKSB7CisJCQlkcC0+aV9kLmRpX3NpemUgPSBzaXplOworCQkJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgZHAsIFhGU19JTE9HX0NPUkUpOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKgorICogSWNrLiAgV2UgbmVlZCB0byBhbHdheXMgYmUgYWJsZSB0byByZW1vdmUgYSBidHJlZSBibG9jaywgZXZlbgorICogaWYgdGhlcmUncyBubyBzcGFjZSByZXNlcnZhdGlvbiBiZWNhdXNlIHRoZSBmaWxlc3lzdGVtIGlzIGZ1bGwuCisgKiBUaGlzIGlzIGNhbGxlZCBpZiB4ZnNfYnVubWFwaSBvbiBhIGJ0cmVlIGJsb2NrIGZhaWxzIGR1ZSB0byBFTk9TUEMuCisgKiBJdCBzd2FwcyB0aGUgdGFyZ2V0IGJsb2NrIHdpdGggdGhlIGxhc3QgYmxvY2sgaW4gdGhlIGZpbGUuICBUaGUKKyAqIGxhc3QgYmxvY2sgaW4gdGhlIGZpbGUgY2FuIGFsd2F5cyBiZSByZW1vdmVkIHNpbmNlIGl0IGNhbid0IGNhdXNlCisgKiBhIGJtYXAgYnRyZWUgc3BsaXQgdG8gZG8gdGhhdC4KKyAqLworU1RBVElDIGludAoreGZzX2RhX3N3YXBfbGFzdGJsb2NrKHhmc19kYV9hcmdzX3QgKmFyZ3MsIHhmc19kYWJsa190ICpkZWFkX2Jsa25vcCwKKwkJICAgICAgeGZzX2RhYnVmX3QgKipkZWFkX2J1ZnApCit7CisJeGZzX2RhYmxrX3QgZGVhZF9ibGtubywgbGFzdF9ibGtubywgc2liX2Jsa25vLCBwYXJfYmxrbm87CisJeGZzX2RhYnVmX3QgKmRlYWRfYnVmLCAqbGFzdF9idWYsICpzaWJfYnVmLCAqcGFyX2J1ZjsKKwl4ZnNfZmlsZW9mZl90IGxhc3RvZmY7CisJeGZzX2lub2RlX3QgKmlwOworCXhmc190cmFuc190ICp0cDsKKwl4ZnNfbW91bnRfdCAqbXA7CisJaW50IGVycm9yLCB3LCBlbnRubywgbGV2ZWwsIGRlYWRfbGV2ZWw7CisJeGZzX2RhX2Jsa2luZm9fdCAqZGVhZF9pbmZvLCAqc2liX2luZm87CisJeGZzX2RhX2ludG5vZGVfdCAqcGFyX25vZGUsICpkZWFkX25vZGU7CisJeGZzX2Rpcl9sZWFmYmxvY2tfdCAqZGVhZF9sZWFmOworCXhmc19kaXIyX2xlYWZfdCAqZGVhZF9sZWFmMjsKKwl4ZnNfZGFoYXNoX3QgZGVhZF9oYXNoOworCisJZGVhZF9idWYgPSAqZGVhZF9idWZwOworCWRlYWRfYmxrbm8gPSAqZGVhZF9ibGtub3A7CisJdHAgPSBhcmdzLT50cmFuczsKKwlpcCA9IGFyZ3MtPmRwOworCXcgPSBhcmdzLT53aGljaGZvcms7CisJQVNTRVJUKHcgPT0gWEZTX0RBVEFfRk9SSyk7CisJbXAgPSBpcC0+aV9tb3VudDsKKwlpZiAoWEZTX0RJUl9JU19WMihtcCkpIHsKKwkJbGFzdG9mZiA9IG1wLT5tX2RpcmZyZWVibGs7CisJCWVycm9yID0geGZzX2JtYXBfbGFzdF9iZWZvcmUodHAsIGlwLCAmbGFzdG9mZiwgdyk7CisJfSBlbHNlCisJCWVycm9yID0geGZzX2JtYXBfbGFzdF9vZmZzZXQodHAsIGlwLCAmbGFzdG9mZiwgdyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJaWYgKHVubGlrZWx5KGxhc3RvZmYgPT0gMCkpIHsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2RhX3N3YXBfbGFzdGJsb2NrKDEpIiwgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkgbXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCS8qCisJICogUmVhZCB0aGUgbGFzdCBibG9jayBpbiB0aGUgYnRyZWUgc3BhY2UuCisJICovCisJbGFzdF9ibGtubyA9ICh4ZnNfZGFibGtfdClsYXN0b2ZmIC0gbXAtPm1fZGlyYmxrZnNiczsKKwlpZiAoKGVycm9yID0geGZzX2RhX3JlYWRfYnVmKHRwLCBpcCwgbGFzdF9ibGtubywgLTEsICZsYXN0X2J1ZiwgdykpKQorCQlyZXR1cm4gZXJyb3I7CisJLyoKKwkgKiBDb3B5IHRoZSBsYXN0IGJsb2NrIGludG8gdGhlIGRlYWQgYnVmZmVyIGFuZCBsb2cgaXQuCisJICovCisJbWVtY3B5KGRlYWRfYnVmLT5kYXRhLCBsYXN0X2J1Zi0+ZGF0YSwgbXAtPm1fZGlyYmxrc2l6ZSk7CisJeGZzX2RhX2xvZ19idWYodHAsIGRlYWRfYnVmLCAwLCBtcC0+bV9kaXJibGtzaXplIC0gMSk7CisJZGVhZF9pbmZvID0gZGVhZF9idWYtPmRhdGE7CisJLyoKKwkgKiBHZXQgdmFsdWVzIGZyb20gdGhlIG1vdmVkIGJsb2NrLgorCSAqLworCWlmIChJTlRfR0VUKGRlYWRfaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUl9MRUFGX01BR0lDKSB7CisJCUFTU0VSVChYRlNfRElSX0lTX1YxKG1wKSk7CisJCWRlYWRfbGVhZiA9ICh4ZnNfZGlyX2xlYWZibG9ja190ICopZGVhZF9pbmZvOworCQlkZWFkX2xldmVsID0gMDsKKwkJZGVhZF9oYXNoID0KKwkJCUlOVF9HRVQoZGVhZF9sZWFmLT5lbnRyaWVzW0lOVF9HRVQoZGVhZF9sZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpOworCX0gZWxzZSBpZiAoSU5UX0dFVChkZWFkX2luZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0xFQUZOX01BR0lDKSB7CisJCUFTU0VSVChYRlNfRElSX0lTX1YyKG1wKSk7CisJCWRlYWRfbGVhZjIgPSAoeGZzX2RpcjJfbGVhZl90ICopZGVhZF9pbmZvOworCQlkZWFkX2xldmVsID0gMDsKKwkJZGVhZF9oYXNoID0gSU5UX0dFVChkZWFkX2xlYWYyLT5lbnRzW0lOVF9HRVQoZGVhZF9sZWFmMi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gMV0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKTsKKwl9IGVsc2UgeworCQlBU1NFUlQoSU5UX0dFVChkZWFkX2luZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19EQV9OT0RFX01BR0lDKTsKKwkJZGVhZF9ub2RlID0gKHhmc19kYV9pbnRub2RlX3QgKilkZWFkX2luZm87CisJCWRlYWRfbGV2ZWwgPSBJTlRfR0VUKGRlYWRfbm9kZS0+aGRyLmxldmVsLCBBUkNIX0NPTlZFUlQpOworCQlkZWFkX2hhc2ggPSBJTlRfR0VUKGRlYWRfbm9kZS0+YnRyZWVbSU5UX0dFVChkZWFkX25vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIDFdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisJfQorCXNpYl9idWYgPSBwYXJfYnVmID0gTlVMTDsKKwkvKgorCSAqIElmIHRoZSBtb3ZlZCBibG9jayBoYXMgYSBsZWZ0IHNpYmxpbmcsIGZpeCB1cCB0aGUgcG9pbnRlcnMuCisJICovCisJaWYgKChzaWJfYmxrbm8gPSBJTlRfR0VUKGRlYWRfaW5mby0+YmFjaywgQVJDSF9DT05WRVJUKSkpIHsKKwkJaWYgKChlcnJvciA9IHhmc19kYV9yZWFkX2J1Zih0cCwgaXAsIHNpYl9ibGtubywgLTEsICZzaWJfYnVmLCB3KSkpCisJCQlnb3RvIGRvbmU7CisJCXNpYl9pbmZvID0gc2liX2J1Zi0+ZGF0YTsKKwkJaWYgKHVubGlrZWx5KAorCQkgICAgSU5UX0dFVChzaWJfaW5mby0+Zm9ydywgQVJDSF9DT05WRVJUKSAhPSBsYXN0X2Jsa25vIHx8CisJCSAgICBJTlRfR0VUKHNpYl9pbmZvLT5tYWdpYywgQVJDSF9DT05WRVJUKSAhPSBJTlRfR0VUKGRlYWRfaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkpKSB7CisJCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfZGFfc3dhcF9sYXN0YmxvY2soMikiLAorCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbXApOworCQkJZXJyb3IgPSBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlJTlRfU0VUKHNpYl9pbmZvLT5mb3J3LCBBUkNIX0NPTlZFUlQsIGRlYWRfYmxrbm8pOworCQl4ZnNfZGFfbG9nX2J1Zih0cCwgc2liX2J1ZiwKKwkJCVhGU19EQV9MT0dSQU5HRShzaWJfaW5mbywgJnNpYl9pbmZvLT5mb3J3LAorCQkJCQlzaXplb2Yoc2liX2luZm8tPmZvcncpKSk7CisJCXhmc19kYV9idWZfZG9uZShzaWJfYnVmKTsKKwkJc2liX2J1ZiA9IE5VTEw7CisJfQorCS8qCisJICogSWYgdGhlIG1vdmVkIGJsb2NrIGhhcyBhIHJpZ2h0IHNpYmxpbmcsIGZpeCB1cCB0aGUgcG9pbnRlcnMuCisJICovCisJaWYgKChzaWJfYmxrbm8gPSBJTlRfR0VUKGRlYWRfaW5mby0+Zm9ydywgQVJDSF9DT05WRVJUKSkpIHsKKwkJaWYgKChlcnJvciA9IHhmc19kYV9yZWFkX2J1Zih0cCwgaXAsIHNpYl9ibGtubywgLTEsICZzaWJfYnVmLCB3KSkpCisJCQlnb3RvIGRvbmU7CisJCXNpYl9pbmZvID0gc2liX2J1Zi0+ZGF0YTsKKwkJaWYgKHVubGlrZWx5KAorCQkgICAgICAgSU5UX0dFVChzaWJfaW5mby0+YmFjaywgQVJDSF9DT05WRVJUKSAhPSBsYXN0X2Jsa25vCisJCSAgICB8fCBJTlRfR0VUKHNpYl9pbmZvLT5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCSE9IElOVF9HRVQoZGVhZF9pbmZvLT5tYWdpYywgQVJDSF9DT05WRVJUKSkpIHsKKwkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19kYV9zd2FwX2xhc3RibG9jaygzKSIsCisJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCQllcnJvciA9IFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQkJZ290byBkb25lOworCQl9CisJCUlOVF9TRVQoc2liX2luZm8tPmJhY2ssIEFSQ0hfQ09OVkVSVCwgZGVhZF9ibGtubyk7CisJCXhmc19kYV9sb2dfYnVmKHRwLCBzaWJfYnVmLAorCQkJWEZTX0RBX0xPR1JBTkdFKHNpYl9pbmZvLCAmc2liX2luZm8tPmJhY2ssCisJCQkJCXNpemVvZihzaWJfaW5mby0+YmFjaykpKTsKKwkJeGZzX2RhX2J1Zl9kb25lKHNpYl9idWYpOworCQlzaWJfYnVmID0gTlVMTDsKKwl9CisJcGFyX2Jsa25vID0gWEZTX0RJUl9JU19WMShtcCkgPyAwIDogbXAtPm1fZGlybGVhZmJsazsKKwlsZXZlbCA9IC0xOworCS8qCisJICogV2FsayBkb3duIHRoZSB0cmVlIGxvb2tpbmcgZm9yIHRoZSBwYXJlbnQgb2YgdGhlIG1vdmVkIGJsb2NrLgorCSAqLworCWZvciAoOzspIHsKKwkJaWYgKChlcnJvciA9IHhmc19kYV9yZWFkX2J1Zih0cCwgaXAsIHBhcl9ibGtubywgLTEsICZwYXJfYnVmLCB3KSkpCisJCQlnb3RvIGRvbmU7CisJCXBhcl9ub2RlID0gcGFyX2J1Zi0+ZGF0YTsKKwkJaWYgKHVubGlrZWx5KAorCQkgICAgSU5UX0dFVChwYXJfbm9kZS0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RBX05PREVfTUFHSUMgfHwKKwkJICAgIChsZXZlbCA+PSAwICYmIGxldmVsICE9IElOVF9HRVQocGFyX25vZGUtPmhkci5sZXZlbCwgQVJDSF9DT05WRVJUKSArIDEpKSkgeworCQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2RhX3N3YXBfbGFzdGJsb2NrKDQpIiwKKwkJCQkJIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKKwkJCWVycm9yID0gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJbGV2ZWwgPSBJTlRfR0VUKHBhcl9ub2RlLT5oZHIubGV2ZWwsIEFSQ0hfQ09OVkVSVCk7CisJCWZvciAoZW50bm8gPSAwOworCQkgICAgIGVudG5vIDwgSU5UX0dFVChwYXJfbm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpICYmCisJCSAgICAgSU5UX0dFVChwYXJfbm9kZS0+YnRyZWVbZW50bm9dLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPCBkZWFkX2hhc2g7CisJCSAgICAgZW50bm8rKykKKwkJCWNvbnRpbnVlOworCQlpZiAodW5saWtlbHkoZW50bm8gPT0gSU5UX0dFVChwYXJfbm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKSkgeworCQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2RhX3N3YXBfbGFzdGJsb2NrKDUpIiwKKwkJCQkJIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKKwkJCWVycm9yID0gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJcGFyX2Jsa25vID0gSU5UX0dFVChwYXJfbm9kZS0+YnRyZWVbZW50bm9dLmJlZm9yZSwgQVJDSF9DT05WRVJUKTsKKwkJaWYgKGxldmVsID09IGRlYWRfbGV2ZWwgKyAxKQorCQkJYnJlYWs7CisJCXhmc19kYV9icmVsc2UodHAsIHBhcl9idWYpOworCQlwYXJfYnVmID0gTlVMTDsKKwl9CisJLyoKKwkgKiBXZSdyZSBpbiB0aGUgcmlnaHQgcGFyZW50IGJsb2NrLgorCSAqIExvb2sgZm9yIHRoZSByaWdodCBlbnRyeS4KKwkgKi8KKwlmb3IgKDs7KSB7CisJCWZvciAoOworCQkgICAgIGVudG5vIDwgSU5UX0dFVChwYXJfbm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpICYmCisJCSAgICAgSU5UX0dFVChwYXJfbm9kZS0+YnRyZWVbZW50bm9dLmJlZm9yZSwgQVJDSF9DT05WRVJUKSAhPSBsYXN0X2Jsa25vOworCQkgICAgIGVudG5vKyspCisJCQljb250aW51ZTsKKwkJaWYgKGVudG5vIDwgSU5UX0dFVChwYXJfbm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKQorCQkJYnJlYWs7CisJCXBhcl9ibGtubyA9IElOVF9HRVQocGFyX25vZGUtPmhkci5pbmZvLmZvcncsIEFSQ0hfQ09OVkVSVCk7CisJCXhmc19kYV9icmVsc2UodHAsIHBhcl9idWYpOworCQlwYXJfYnVmID0gTlVMTDsKKwkJaWYgKHVubGlrZWx5KHBhcl9ibGtubyA9PSAwKSkgeworCQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2RhX3N3YXBfbGFzdGJsb2NrKDYpIiwKKwkJCQkJIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKKwkJCWVycm9yID0gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJaWYgKChlcnJvciA9IHhmc19kYV9yZWFkX2J1Zih0cCwgaXAsIHBhcl9ibGtubywgLTEsICZwYXJfYnVmLCB3KSkpCisJCQlnb3RvIGRvbmU7CisJCXBhcl9ub2RlID0gcGFyX2J1Zi0+ZGF0YTsKKwkJaWYgKHVubGlrZWx5KAorCQkgICAgSU5UX0dFVChwYXJfbm9kZS0+aGRyLmxldmVsLCBBUkNIX0NPTlZFUlQpICE9IGxldmVsIHx8CisJCSAgICBJTlRfR0VUKHBhcl9ub2RlLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSAhPSBYRlNfREFfTk9ERV9NQUdJQykpIHsKKwkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19kYV9zd2FwX2xhc3RibG9jayg3KSIsCisJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCQllcnJvciA9IFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQkJZ290byBkb25lOworCQl9CisJCWVudG5vID0gMDsKKwl9CisJLyoKKwkgKiBVcGRhdGUgdGhlIHBhcmVudCBlbnRyeSBwb2ludGluZyB0byB0aGUgbW92ZWQgYmxvY2suCisJICovCisJSU5UX1NFVChwYXJfbm9kZS0+YnRyZWVbZW50bm9dLmJlZm9yZSwgQVJDSF9DT05WRVJULCBkZWFkX2Jsa25vKTsKKwl4ZnNfZGFfbG9nX2J1Zih0cCwgcGFyX2J1ZiwKKwkJWEZTX0RBX0xPR1JBTkdFKHBhcl9ub2RlLCAmcGFyX25vZGUtPmJ0cmVlW2VudG5vXS5iZWZvcmUsCisJCQkJc2l6ZW9mKHBhcl9ub2RlLT5idHJlZVtlbnRub10uYmVmb3JlKSkpOworCXhmc19kYV9idWZfZG9uZShwYXJfYnVmKTsKKwl4ZnNfZGFfYnVmX2RvbmUoZGVhZF9idWYpOworCSpkZWFkX2Jsa25vcCA9IGxhc3RfYmxrbm87CisJKmRlYWRfYnVmcCA9IGxhc3RfYnVmOworCXJldHVybiAwOworZG9uZToKKwlpZiAocGFyX2J1ZikKKwkJeGZzX2RhX2JyZWxzZSh0cCwgcGFyX2J1Zik7CisJaWYgKHNpYl9idWYpCisJCXhmc19kYV9icmVsc2UodHAsIHNpYl9idWYpOworCXhmc19kYV9icmVsc2UodHAsIGxhc3RfYnVmKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBSZW1vdmUgYSBidHJlZSBibG9jayBmcm9tIGEgZGlyZWN0b3J5IG9yIGF0dHJpYnV0ZS4KKyAqLworaW50Cit4ZnNfZGFfc2hyaW5rX2lub2RlKHhmc19kYV9hcmdzX3QgKmFyZ3MsIHhmc19kYWJsa190IGRlYWRfYmxrbm8sCisJCSAgICB4ZnNfZGFidWZfdCAqZGVhZF9idWYpCit7CisJeGZzX2lub2RlX3QgKmRwOworCWludCBkb25lLCBlcnJvciwgdywgY291bnQ7CisJeGZzX2ZpbGVvZmZfdCBibm87CisJeGZzX2ZzaXplX3Qgc2l6ZTsKKwl4ZnNfdHJhbnNfdCAqdHA7CisJeGZzX21vdW50X3QgKm1wOworCisJZHAgPSBhcmdzLT5kcDsKKwl3ID0gYXJncy0+d2hpY2hmb3JrOworCXRwID0gYXJncy0+dHJhbnM7CisJbXAgPSBkcC0+aV9tb3VudDsKKwlpZiAodyA9PSBYRlNfREFUQV9GT1JLICYmIFhGU19ESVJfSVNfVjIobXApKQorCQljb3VudCA9IG1wLT5tX2RpcmJsa2ZzYnM7CisJZWxzZQorCQljb3VudCA9IDE7CisJZm9yICg7OykgeworCQkvKgorCQkgKiBSZW1vdmUgZXh0ZW50cy4gIElmIHdlIGdldCBFTk9TUEMgZm9yIGEgZGlyIHdlIGhhdmUgdG8gbW92ZQorCQkgKiB0aGUgbGFzdCBibG9jayB0byB0aGUgcGxhY2Ugd2Ugd2FudCB0byBraWxsLgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19idW5tYXBpKHRwLCBkcCwgZGVhZF9ibGtubywgY291bnQsCisJCQkJWEZTX0JNQVBJX0FGTEFHKHcpfFhGU19CTUFQSV9NRVRBREFUQSwKKwkJCQkwLCBhcmdzLT5maXJzdGJsb2NrLCBhcmdzLT5mbGlzdCwKKwkJCQkmZG9uZSkpID09IEVOT1NQQykgeworCQkJaWYgKHcgIT0gWEZTX0RBVEFfRk9SSykKKwkJCQlnb3RvIGRvbmU7CisJCQlpZiAoKGVycm9yID0geGZzX2RhX3N3YXBfbGFzdGJsb2NrKGFyZ3MsICZkZWFkX2Jsa25vLAorCQkJCQkmZGVhZF9idWYpKSkKKwkJCQlnb3RvIGRvbmU7CisJCX0gZWxzZSBpZiAoZXJyb3IpCisJCQlnb3RvIGRvbmU7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwlBU1NFUlQoZG9uZSk7CisJeGZzX2RhX2JpbnZhbCh0cCwgZGVhZF9idWYpOworCS8qCisJICogQWRqdXN0IHRoZSBkaXJlY3Rvcnkgc2l6ZSBmb3IgdmVyc2lvbiAxLgorCSAqLworCWlmICh3ID09IFhGU19EQVRBX0ZPUksgJiYgWEZTX0RJUl9JU19WMShtcCkpIHsKKwkJaWYgKChlcnJvciA9IHhmc19ibWFwX2xhc3Rfb2Zmc2V0KHRwLCBkcCwgJmJubywgdykpKQorCQkJcmV0dXJuIGVycm9yOworCQlzaXplID0gWEZTX0ZTQl9UT19CKGRwLT5pX21vdW50LCBibm8pOworCQlpZiAoc2l6ZSAhPSBkcC0+aV9kLmRpX3NpemUpIHsKKwkJCWRwLT5pX2QuZGlfc2l6ZSA9IHNpemU7CisJCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBkcCwgWEZTX0lMT0dfQ09SRSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Citkb25lOgorCXhmc19kYV9iaW52YWwodHAsIGRlYWRfYnVmKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBTZWUgaWYgdGhlIG1hcHBpbmcocykgZm9yIHRoaXMgYnRyZWUgYmxvY2sgYXJlIHZhbGlkLCBpLmUuCisgKiBkb24ndCBjb250YWluIGhvbGVzLCBhcmUgbG9naWNhbGx5IGNvbnRpZ3VvdXMsIGFuZCBjb3ZlciB0aGUgd2hvbGUgcmFuZ2UuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19kYV9tYXBfY292ZXJzX2Jsb2NrcygKKwlpbnQJCW5tYXAsCisJeGZzX2JtYnRfaXJlY190CSptYXBwLAorCXhmc19kYWJsa190CWJubywKKwlpbnQJCWNvdW50KQoreworCWludAkJaTsKKwl4ZnNfZmlsZW9mZl90CW9mZjsKKworCWZvciAoaSA9IDAsIG9mZiA9IGJubzsgaSA8IG5tYXA7IGkrKykgeworCQlpZiAobWFwcFtpXS5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLIHx8CisJCSAgICBtYXBwW2ldLmJyX3N0YXJ0YmxvY2sgPT0gREVMQVlTVEFSVEJMT0NLKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAob2ZmICE9IG1hcHBbaV0uYnJfc3RhcnRvZmYpIHsKKwkJCXJldHVybiAwOworCQl9CisJCW9mZiArPSBtYXBwW2ldLmJyX2Jsb2NrY291bnQ7CisJfQorCXJldHVybiBvZmYgPT0gYm5vICsgY291bnQ7Cit9CisKKy8qCisgKiBNYWtlIGEgZGFidWYuCisgKiBVc2VkIGZvciBnZXRfYnVmLCByZWFkX2J1ZiwgcmVhZF9idWZyLCBhbmQgcmVhZGFfYnVmLgorICovCitTVEFUSUMgaW50Cit4ZnNfZGFfZG9fYnVmKAorCXhmc190cmFuc190CSp0cmFucywKKwl4ZnNfaW5vZGVfdAkqZHAsCisJeGZzX2RhYmxrX3QJYm5vLAorCXhmc19kYWRkcl90CSptYXBwZWRibm9wLAorCXhmc19kYWJ1Zl90CSoqYnBwLAorCWludAkJd2hpY2hmb3JrLAorCWludAkJY2FsbGVyLAorCWluc3RfdAkJKnJhKQoreworCXhmc19idWZfdAkqYnAgPSBOVUxMOworCXhmc19idWZfdAkqKmJwbGlzdDsKKwlpbnQJCWVycm9yPTA7CisJaW50CQlpOworCXhmc19ibWJ0X2lyZWNfdAltYXA7CisJeGZzX2JtYnRfaXJlY190CSptYXBwOworCXhmc19kYWRkcl90CW1hcHBlZGJubzsKKwl4ZnNfbW91bnRfdAkqbXA7CisJaW50CQluYnBsaXN0PTA7CisJaW50CQluZnNiOworCWludAkJbm1hcDsKKwl4ZnNfZGFidWZfdAkqcmJwOworCisJbXAgPSBkcC0+aV9tb3VudDsKKwlpZiAod2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUksgJiYgWEZTX0RJUl9JU19WMihtcCkpCisJCW5mc2IgPSBtcC0+bV9kaXJibGtmc2JzOworCWVsc2UKKwkJbmZzYiA9IDE7CisJbWFwcGVkYm5vID0gKm1hcHBlZGJub3A7CisJLyoKKwkgKiBDYWxsZXIgZG9lc24ndCBoYXZlIGEgbWFwcGluZy4gIC0yIG1lYW5zIGRvbid0IGNvbXBsYWluCisJICogaWYgd2UgbGFuZCBpbiBhIGhvbGUuCisJICovCisJaWYgKG1hcHBlZGJubyA9PSAtMSB8fCBtYXBwZWRibm8gPT0gLTIpIHsKKwkJLyoKKwkJICogT3B0aW1pemUgdGhlIG9uZS1ibG9jayBjYXNlLgorCQkgKi8KKwkJaWYgKG5mc2IgPT0gMSkgeworCQkJeGZzX2ZzYmxvY2tfdAlmc2I7CisKKwkJCWlmICgoZXJyb3IgPQorCQkJICAgIHhmc19ibWFwaV9zaW5nbGUodHJhbnMsIGRwLCB3aGljaGZvcmssICZmc2IsCisJCQkJICAgICh4ZnNfZmlsZW9mZl90KWJubykpKSB7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQkJbWFwcCA9ICZtYXA7CisJCQlpZiAoZnNiID09IE5VTExGU0JMT0NLKSB7CisJCQkJbm1hcCA9IDA7CisJCQl9IGVsc2UgeworCQkJCW1hcC5icl9zdGFydGJsb2NrID0gZnNiOworCQkJCW1hcC5icl9zdGFydG9mZiA9ICh4ZnNfZmlsZW9mZl90KWJubzsKKwkJCQltYXAuYnJfYmxvY2tjb3VudCA9IDE7CisJCQkJbm1hcCA9IDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQltYXBwID0ga21lbV9hbGxvYyhzaXplb2YoKm1hcHApICogbmZzYiwgS01fU0xFRVApOworCQkJbm1hcCA9IG5mc2I7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYXBpKHRyYW5zLCBkcCwgKHhmc19maWxlb2ZmX3QpYm5vLAorCQkJCQluZnNiLAorCQkJCQlYRlNfQk1BUElfTUVUQURBVEEgfAorCQkJCQkJWEZTX0JNQVBJX0FGTEFHKHdoaWNoZm9yayksCisJCQkJCU5VTEwsIDAsIG1hcHAsICZubWFwLCBOVUxMKSkpCisJCQkJZ290byBleGl0MDsKKwkJfQorCX0gZWxzZSB7CisJCW1hcC5icl9zdGFydGJsb2NrID0gWEZTX0RBRERSX1RPX0ZTQihtcCwgbWFwcGVkYm5vKTsKKwkJbWFwLmJyX3N0YXJ0b2ZmID0gKHhmc19maWxlb2ZmX3QpYm5vOworCQltYXAuYnJfYmxvY2tjb3VudCA9IG5mc2I7CisJCW1hcHAgPSAmbWFwOworCQlubWFwID0gMTsKKwl9CisJaWYgKCF4ZnNfZGFfbWFwX2NvdmVyc19ibG9ja3Mobm1hcCwgbWFwcCwgYm5vLCBuZnNiKSkgeworCQllcnJvciA9IG1hcHBlZGJubyA9PSAtMiA/IDAgOiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJaWYgKHVubGlrZWx5KGVycm9yID09IEVGU0NPUlJVUFRFRCkpIHsKKwkJCWlmICh4ZnNfZXJyb3JfbGV2ZWwgPj0gWEZTX0VSUkxFVkVMX0xPVykgeworCQkJCWludAlpOworCQkJCWNtbl9lcnIoQ0VfQUxFUlQsICJ4ZnNfZGFfZG9fYnVmOiBibm8gJWxsZFxuIiwKKwkJCQkJKGxvbmcgbG9uZylibm8pOworCQkJCWNtbl9lcnIoQ0VfQUxFUlQsICJkaXI6IGlub2RlICVsbGRcbiIsCisJCQkJCShsb25nIGxvbmcpZHAtPmlfaW5vKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgbm1hcDsgaSsrKSB7CisJCQkJCWNtbl9lcnIoQ0VfQUxFUlQsCisJCQkJCQkiWyUwMmRdIGJyX3N0YXJ0b2ZmICVsbGQgYnJfc3RhcnRibG9jayAlbGxkIGJyX2Jsb2NrY291bnQgJWxsZCBicl9zdGF0ZSAlZFxuIiwKKwkJCQkJCWksCisJCQkJCQkobG9uZyBsb25nKW1hcHBbaV0uYnJfc3RhcnRvZmYsCisJCQkJCQkobG9uZyBsb25nKW1hcHBbaV0uYnJfc3RhcnRibG9jaywKKwkJCQkJCShsb25nIGxvbmcpbWFwcFtpXS5icl9ibG9ja2NvdW50LAorCQkJCQkJbWFwcFtpXS5icl9zdGF0ZSk7CisJCQkJfQorCQkJfQorCQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2RhX2RvX2J1ZigxKSIsCisJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCX0KKwkJZ290byBleGl0MDsKKwl9CisJaWYgKGNhbGxlciAhPSAzICYmIG5tYXAgPiAxKSB7CisJCWJwbGlzdCA9IGttZW1fYWxsb2Moc2l6ZW9mKCpicGxpc3QpICogbm1hcCwgS01fU0xFRVApOworCQluYnBsaXN0ID0gMDsKKwl9IGVsc2UKKwkJYnBsaXN0ID0gTlVMTDsKKwkvKgorCSAqIFR1cm4gdGhlIG1hcHBpbmcocykgaW50byBidWZmZXIocykuCisJICovCisJZm9yIChpID0gMDsgaSA8IG5tYXA7IGkrKykgeworCQlpbnQJbm1hcHBlZDsKKworCQltYXBwZWRibm8gPSBYRlNfRlNCX1RPX0RBRERSKG1wLCBtYXBwW2ldLmJyX3N0YXJ0YmxvY2spOworCQlpZiAoaSA9PSAwKQorCQkJKm1hcHBlZGJub3AgPSBtYXBwZWRibm87CisJCW5tYXBwZWQgPSAoaW50KVhGU19GU0JfVE9fQkIobXAsIG1hcHBbaV0uYnJfYmxvY2tjb3VudCk7CisJCXN3aXRjaCAoY2FsbGVyKSB7CisJCWNhc2UgMDoKKwkJCWJwID0geGZzX3RyYW5zX2dldF9idWYodHJhbnMsIG1wLT5tX2RkZXZfdGFyZ3AsCisJCQkJbWFwcGVkYm5vLCBubWFwcGVkLCAwKTsKKwkJCWVycm9yID0gYnAgPyBYRlNfQlVGX0dFVEVSUk9SKGJwKSA6IFhGU19FUlJPUihFSU8pOworCQkJYnJlYWs7CisJCWNhc2UgMToKKyNpZm5kZWYgX19LRVJORUxfXworCQljYXNlIDI6CisjZW5kaWYKKwkJCWJwID0gTlVMTDsKKwkJCWVycm9yID0geGZzX3RyYW5zX3JlYWRfYnVmKG1wLCB0cmFucywgbXAtPm1fZGRldl90YXJncCwKKwkJCQltYXBwZWRibm8sIG5tYXBwZWQsIDAsICZicCk7CisJCQlicmVhazsKKyNpZmRlZiBfX0tFUk5FTF9fCisJCWNhc2UgMzoKKwkJCXhmc19iYXJlYWQobXAtPm1fZGRldl90YXJncCwgbWFwcGVkYm5vLCBubWFwcGVkKTsKKwkJCWVycm9yID0gMDsKKwkJCWJwID0gTlVMTDsKKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKwkJaWYgKGVycm9yKSB7CisJCQlpZiAoYnApCisJCQkJeGZzX3RyYW5zX2JyZWxzZSh0cmFucywgYnApOworCQkJZ290byBleGl0MTsKKwkJfQorCQlpZiAoIWJwKQorCQkJY29udGludWU7CisJCWlmIChjYWxsZXIgPT0gMSkgeworCQkJaWYgKHdoaWNoZm9yayA9PSBYRlNfQVRUUl9GT1JLKSB7CisJCQkJWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCBCX0ZTX0FUVFJfQlRSRUUsCisJCQkJCQlYRlNfQVRUUl9CVFJFRV9SRUYpOworCQkJfSBlbHNlIHsKKwkJCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfRElSX0JUUkVFLAorCQkJCQkJWEZTX0RJUl9CVFJFRV9SRUYpOworCQkJfQorCQl9CisJCWlmIChicGxpc3QpIHsKKwkJCWJwbGlzdFtuYnBsaXN0KytdID0gYnA7CisJCX0KKwl9CisJLyoKKwkgKiBCdWlsZCBhIGRhYnVmIHN0cnVjdHVyZS4KKwkgKi8KKwlpZiAoYnBsaXN0KSB7CisJCXJicCA9IHhmc19kYV9idWZfbWFrZShuYnBsaXN0LCBicGxpc3QsIHJhKTsKKwl9IGVsc2UgaWYgKGJwKQorCQlyYnAgPSB4ZnNfZGFfYnVmX21ha2UoMSwgJmJwLCByYSk7CisJZWxzZQorCQlyYnAgPSBOVUxMOworCS8qCisJICogRm9yIHJlYWRfYnVmLCBjaGVjayB0aGUgbWFnaWMgbnVtYmVyLgorCSAqLworCWlmIChjYWxsZXIgPT0gMSkgeworCQl4ZnNfZGlyMl9kYXRhX3QJCSpkYXRhOworCQl4ZnNfZGlyMl9mcmVlX3QJCSpmcmVlOworCQl4ZnNfZGFfYmxraW5mb190CSppbmZvOworCQl1aW50CQkJbWFnaWMsIG1hZ2ljMTsKKworCQlpbmZvID0gcmJwLT5kYXRhOworCQlkYXRhID0gcmJwLT5kYXRhOworCQlmcmVlID0gcmJwLT5kYXRhOworCQltYWdpYyA9IElOVF9HRVQoaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCk7CisJCW1hZ2ljMSA9IElOVF9HRVQoZGF0YS0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpOworCQlpZiAodW5saWtlbHkoCisJCSAgICBYRlNfVEVTVF9FUlJPUigobWFnaWMgIT0gWEZTX0RBX05PREVfTUFHSUMpICYmCisJCQkJICAgKG1hZ2ljICE9IFhGU19ESVJfTEVBRl9NQUdJQykgJiYKKwkJCQkgICAobWFnaWMgIT0gWEZTX0FUVFJfTEVBRl9NQUdJQykgJiYKKwkJCQkgICAobWFnaWMgIT0gWEZTX0RJUjJfTEVBRjFfTUFHSUMpICYmCisJCQkJICAgKG1hZ2ljICE9IFhGU19ESVIyX0xFQUZOX01BR0lDKSAmJgorCQkJCSAgIChtYWdpYzEgIT0gWEZTX0RJUjJfQkxPQ0tfTUFHSUMpICYmCisJCQkJICAgKG1hZ2ljMSAhPSBYRlNfRElSMl9EQVRBX01BR0lDKSAmJgorCQkJCSAgIChJTlRfR0VUKGZyZWUtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSAhPSBYRlNfRElSMl9GUkVFX01BR0lDKSwKKwkJCQltcCwgWEZTX0VSUlRBR19EQV9SRUFEX0JVRiwKKwkJCQlYRlNfUkFORE9NX0RBX1JFQURfQlVGKSkpIHsKKwkJCXhmc19idWZ0cmFjZSgiREEgUkVBRCBFUlJPUiIsIHJicC0+YnBzWzBdKTsKKwkJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfZGFfZG9fYnVmKDIpIiwKKwkJCQkJICAgICBYRlNfRVJSTEVWRUxfTE9XLCBtcCwgaW5mbyk7CisJCQllcnJvciA9IFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQkJeGZzX2RhX2JyZWxzZSh0cmFucywgcmJwKTsKKwkJCW5icGxpc3QgPSAwOworCQkJZ290byBleGl0MTsKKwkJfQorCX0KKwlpZiAoYnBsaXN0KSB7CisJCWttZW1fZnJlZShicGxpc3QsIHNpemVvZigqYnBsaXN0KSAqIG5tYXApOworCX0KKwlpZiAobWFwcCAhPSAmbWFwKSB7CisJCWttZW1fZnJlZShtYXBwLCBzaXplb2YoKm1hcHApICogbmZzYik7CisJfQorCWlmIChicHApCisJCSpicHAgPSByYnA7CisJcmV0dXJuIDA7CitleGl0MToKKwlpZiAoYnBsaXN0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBuYnBsaXN0OyBpKyspCisJCQl4ZnNfdHJhbnNfYnJlbHNlKHRyYW5zLCBicGxpc3RbaV0pOworCQlrbWVtX2ZyZWUoYnBsaXN0LCBzaXplb2YoKmJwbGlzdCkgKiBubWFwKTsKKwl9CitleGl0MDoKKwlpZiAobWFwcCAhPSAmbWFwKQorCQlrbWVtX2ZyZWUobWFwcCwgc2l6ZW9mKCptYXBwKSAqIG5mc2IpOworCWlmIChicHApCisJCSpicHAgPSBOVUxMOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEdldCBhIGJ1ZmZlciBmb3IgdGhlIGRpci9hdHRyIGJsb2NrLgorICovCitpbnQKK3hmc19kYV9nZXRfYnVmKAorCXhmc190cmFuc190CSp0cmFucywKKwl4ZnNfaW5vZGVfdAkqZHAsCisJeGZzX2RhYmxrX3QJYm5vLAorCXhmc19kYWRkcl90CQltYXBwZWRibm8sCisJeGZzX2RhYnVmX3QJKipicHAsCisJaW50CQl3aGljaGZvcmspCit7CisJcmV0dXJuIHhmc19kYV9kb19idWYodHJhbnMsIGRwLCBibm8sICZtYXBwZWRibm8sIGJwcCwgd2hpY2hmb3JrLCAwLAorCQkJCQkJIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKK30KKworLyoKKyAqIEdldCBhIGJ1ZmZlciBmb3IgdGhlIGRpci9hdHRyIGJsb2NrLCBmaWxsIGluIHRoZSBjb250ZW50cy4KKyAqLworaW50Cit4ZnNfZGFfcmVhZF9idWYoCisJeGZzX3RyYW5zX3QJKnRyYW5zLAorCXhmc19pbm9kZV90CSpkcCwKKwl4ZnNfZGFibGtfdAlibm8sCisJeGZzX2RhZGRyX3QJCW1hcHBlZGJubywKKwl4ZnNfZGFidWZfdAkqKmJwcCwKKwlpbnQJCXdoaWNoZm9yaykKK3sKKwlyZXR1cm4geGZzX2RhX2RvX2J1Zih0cmFucywgZHAsIGJubywgJm1hcHBlZGJubywgYnBwLCB3aGljaGZvcmssIDEsCisJCShpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKK30KKworLyoKKyAqIFJlYWRhaGVhZCB0aGUgZGlyL2F0dHIgYmxvY2suCisgKi8KK3hmc19kYWRkcl90Cit4ZnNfZGFfcmVhZGFfYnVmKAorCXhmc190cmFuc190CSp0cmFucywKKwl4ZnNfaW5vZGVfdAkqZHAsCisJeGZzX2RhYmxrX3QJYm5vLAorCWludAkJd2hpY2hmb3JrKQoreworCXhmc19kYWRkcl90CQlydmFsOworCisJcnZhbCA9IC0xOworCWlmICh4ZnNfZGFfZG9fYnVmKHRyYW5zLCBkcCwgYm5vLCAmcnZhbCwgTlVMTCwgd2hpY2hmb3JrLCAzLAorCQkJKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpKQorCQlyZXR1cm4gLTE7CisJZWxzZQorCQlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIGhvbGQgaSBkaWZmZXJlbnQgdmFsdWVzLgorICovCit1aW50Cit4ZnNfZGFfbG9nMl9yb3VuZHVwKHVpbnQgaSkKK3sKKwl1aW50IHJ2YWw7CisKKwlmb3IgKHJ2YWwgPSAwOyBydmFsIDwgTkJCWSAqIHNpemVvZihpKTsgcnZhbCsrKSB7CisJCWlmICgoMSA8PCBydmFsKSA+PSBpKQorCQkJYnJlYWs7CisJfQorCXJldHVybihydmFsKTsKK30KKwora21lbV96b25lX3QgKnhmc19kYV9zdGF0ZV96b25lOwkvKiBhbmNob3IgZm9yIHN0YXRlIHN0cnVjdCB6b25lICovCitrbWVtX3pvbmVfdCAqeGZzX2RhYnVmX3pvbmU7CQkvKiBkYWJ1ZiB6b25lICovCisKKy8qCisgKiBBbGxvY2F0ZSBhIGRpci1zdGF0ZSBzdHJ1Y3R1cmUuCisgKiBXZSBkb24ndCBwdXQgdGhlbSBvbiB0aGUgc3RhY2sgc2luY2UgdGhleSdyZSBsYXJnZS4KKyAqLworeGZzX2RhX3N0YXRlX3QgKgoreGZzX2RhX3N0YXRlX2FsbG9jKHZvaWQpCit7CisJcmV0dXJuIGttZW1fem9uZV96YWxsb2MoeGZzX2RhX3N0YXRlX3pvbmUsIEtNX1NMRUVQKTsKK30KKworLyoKKyAqIEtpbGwgdGhlIGFsdHBhdGggY29udGVudHMgb2YgYSBkYS1zdGF0ZSBzdHJ1Y3R1cmUuCisgKi8KK3ZvaWQKK3hmc19kYV9zdGF0ZV9raWxsX2FsdHBhdGgoeGZzX2RhX3N0YXRlX3QgKnN0YXRlKQoreworCWludAlpOworCisJZm9yIChpID0gMDsgaSA8IHN0YXRlLT5hbHRwYXRoLmFjdGl2ZTsgaSsrKSB7CisJCWlmIChzdGF0ZS0+YWx0cGF0aC5ibGtbaV0uYnApIHsKKwkJCWlmIChzdGF0ZS0+YWx0cGF0aC5ibGtbaV0uYnAgIT0gc3RhdGUtPnBhdGguYmxrW2ldLmJwKQorCQkJCXhmc19kYV9idWZfZG9uZShzdGF0ZS0+YWx0cGF0aC5ibGtbaV0uYnApOworCQkJc3RhdGUtPmFsdHBhdGguYmxrW2ldLmJwID0gTlVMTDsKKwkJfQorCX0KKwlzdGF0ZS0+YWx0cGF0aC5hY3RpdmUgPSAwOworfQorCisvKgorICogRnJlZSBhIGRhLXN0YXRlIHN0cnVjdHVyZS4KKyAqLwordm9pZAoreGZzX2RhX3N0YXRlX2ZyZWUoeGZzX2RhX3N0YXRlX3QgKnN0YXRlKQoreworCWludAlpOworCisJeGZzX2RhX3N0YXRlX2tpbGxfYWx0cGF0aChzdGF0ZSk7CisJZm9yIChpID0gMDsgaSA8IHN0YXRlLT5wYXRoLmFjdGl2ZTsgaSsrKSB7CisJCWlmIChzdGF0ZS0+cGF0aC5ibGtbaV0uYnApCisJCQl4ZnNfZGFfYnVmX2RvbmUoc3RhdGUtPnBhdGguYmxrW2ldLmJwKTsKKwl9CisJaWYgKHN0YXRlLT5leHRyYXZhbGlkICYmIHN0YXRlLT5leHRyYWJsay5icCkKKwkJeGZzX2RhX2J1Zl9kb25lKHN0YXRlLT5leHRyYWJsay5icCk7CisjaWZkZWYgREVCVUcKKwltZW1zZXQoKGNoYXIgKilzdGF0ZSwgMCwgc2l6ZW9mKCpzdGF0ZSkpOworI2VuZGlmIC8qIERFQlVHICovCisJa21lbV96b25lX2ZyZWUoeGZzX2RhX3N0YXRlX3pvbmUsIHN0YXRlKTsKK30KKworI2lmZGVmIFhGU19EQUJVRl9ERUJVRworeGZzX2RhYnVmX3QJKnhmc19kYWJ1Zl9nbG9iYWxfbGlzdDsKK2xvY2tfdAkJeGZzX2RhYnVmX2dsb2JhbF9sb2NrOworI2VuZGlmCisKKy8qCisgKiBDcmVhdGUgYSBkYWJ1Zi4KKyAqLworLyogQVJHU1VTRUQgKi8KK1NUQVRJQyB4ZnNfZGFidWZfdCAqCit4ZnNfZGFfYnVmX21ha2UoaW50IG5idWYsIHhmc19idWZfdCAqKmJwcywgaW5zdF90ICpyYSkKK3sKKwl4ZnNfYnVmX3QJKmJwOworCXhmc19kYWJ1Zl90CSpkYWJ1ZjsKKwlpbnQJCWk7CisJaW50CQlvZmY7CisKKwlpZiAobmJ1ZiA9PSAxKQorCQlkYWJ1ZiA9IGttZW1fem9uZV9hbGxvYyh4ZnNfZGFidWZfem9uZSwgS01fU0xFRVApOworCWVsc2UKKwkJZGFidWYgPSBrbWVtX2FsbG9jKFhGU19EQV9CVUZfU0laRShuYnVmKSwgS01fU0xFRVApOworCWRhYnVmLT5kaXJ0eSA9IDA7CisjaWZkZWYgWEZTX0RBQlVGX0RFQlVHCisJZGFidWYtPnJhID0gcmE7CisJZGFidWYtPnRhcmdldCA9IFhGU19CVUZfVEFSR0VUKGJwc1swXSk7CisJZGFidWYtPmJsa25vID0gWEZTX0JVRl9BRERSKGJwc1swXSk7CisjZW5kaWYKKwlpZiAobmJ1ZiA9PSAxKSB7CisJCWRhYnVmLT5uYnVmID0gMTsKKwkJYnAgPSBicHNbMF07CisJCWRhYnVmLT5iYmNvdW50ID0gKHNob3J0KUJUT0JCKFhGU19CVUZfQ09VTlQoYnApKTsKKwkJZGFidWYtPmRhdGEgPSBYRlNfQlVGX1BUUihicCk7CisJCWRhYnVmLT5icHNbMF0gPSBicDsKKwl9IGVsc2UgeworCQlkYWJ1Zi0+bmJ1ZiA9IG5idWY7CisJCWZvciAoaSA9IDAsIGRhYnVmLT5iYmNvdW50ID0gMDsgaSA8IG5idWY7IGkrKykgeworCQkJZGFidWYtPmJwc1tpXSA9IGJwID0gYnBzW2ldOworCQkJZGFidWYtPmJiY291bnQgKz0gQlRPQkIoWEZTX0JVRl9DT1VOVChicCkpOworCQl9CisJCWRhYnVmLT5kYXRhID0ga21lbV9hbGxvYyhCQlRPQihkYWJ1Zi0+YmJjb3VudCksIEtNX1NMRUVQKTsKKwkJZm9yIChpID0gb2ZmID0gMDsgaSA8IG5idWY7IGkrKywgb2ZmICs9IFhGU19CVUZfQ09VTlQoYnApKSB7CisJCQlicCA9IGJwc1tpXTsKKwkJCW1lbWNweSgoY2hhciAqKWRhYnVmLT5kYXRhICsgb2ZmLCBYRlNfQlVGX1BUUihicCksCisJCQkJWEZTX0JVRl9DT1VOVChicCkpOworCQl9CisJfQorI2lmZGVmIFhGU19EQUJVRl9ERUJVRworCXsKKwkJU1BMREVDTChzKTsKKwkJeGZzX2RhYnVmX3QJKnA7CisKKwkJcyA9IG11dGV4X3NwaW5sb2NrKCZ4ZnNfZGFidWZfZ2xvYmFsX2xvY2spOworCQlmb3IgKHAgPSB4ZnNfZGFidWZfZ2xvYmFsX2xpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CisJCQlBU1NFUlQocC0+Ymxrbm8gIT0gZGFidWYtPmJsa25vIHx8CisJCQkgICAgICAgcC0+dGFyZ2V0ICE9IGRhYnVmLT50YXJnZXQpOworCQl9CisJCWRhYnVmLT5wcmV2ID0gTlVMTDsKKwkJaWYgKHhmc19kYWJ1Zl9nbG9iYWxfbGlzdCkKKwkJCXhmc19kYWJ1Zl9nbG9iYWxfbGlzdC0+cHJldiA9IGRhYnVmOworCQlkYWJ1Zi0+bmV4dCA9IHhmc19kYWJ1Zl9nbG9iYWxfbGlzdDsKKwkJeGZzX2RhYnVmX2dsb2JhbF9saXN0ID0gZGFidWY7CisJCW11dGV4X3NwaW51bmxvY2soJnhmc19kYWJ1Zl9nbG9iYWxfbG9jaywgcyk7CisJfQorI2VuZGlmCisJcmV0dXJuIGRhYnVmOworfQorCisvKgorICogVW4tZGlydHkgYSBkYWJ1Zi4KKyAqLworU1RBVElDIHZvaWQKK3hmc19kYV9idWZfY2xlYW4oeGZzX2RhYnVmX3QgKmRhYnVmKQoreworCXhmc19idWZfdAkqYnA7CisJaW50CQlpOworCWludAkJb2ZmOworCisJaWYgKGRhYnVmLT5kaXJ0eSkgeworCQlBU1NFUlQoZGFidWYtPm5idWYgPiAxKTsKKwkJZGFidWYtPmRpcnR5ID0gMDsKKwkJZm9yIChpID0gb2ZmID0gMDsgaSA8IGRhYnVmLT5uYnVmOworCQkJCWkrKywgb2ZmICs9IFhGU19CVUZfQ09VTlQoYnApKSB7CisJCQlicCA9IGRhYnVmLT5icHNbaV07CisJCQltZW1jcHkoWEZTX0JVRl9QVFIoYnApLCAoY2hhciAqKWRhYnVmLT5kYXRhICsgb2ZmLAorCQkJCVhGU19CVUZfQ09VTlQoYnApKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFJlbGVhc2UgYSBkYWJ1Zi4KKyAqLwordm9pZAoreGZzX2RhX2J1Zl9kb25lKHhmc19kYWJ1Zl90ICpkYWJ1ZikKK3sKKwlBU1NFUlQoZGFidWYpOworCUFTU0VSVChkYWJ1Zi0+bmJ1ZiAmJiBkYWJ1Zi0+ZGF0YSAmJiBkYWJ1Zi0+YmJjb3VudCAmJiBkYWJ1Zi0+YnBzWzBdKTsKKwlpZiAoZGFidWYtPmRpcnR5KQorCQl4ZnNfZGFfYnVmX2NsZWFuKGRhYnVmKTsKKwlpZiAoZGFidWYtPm5idWYgPiAxKQorCQlrbWVtX2ZyZWUoZGFidWYtPmRhdGEsIEJCVE9CKGRhYnVmLT5iYmNvdW50KSk7CisjaWZkZWYgWEZTX0RBQlVGX0RFQlVHCisJeworCQlTUExERUNMKHMpOworCisJCXMgPSBtdXRleF9zcGlubG9jaygmeGZzX2RhYnVmX2dsb2JhbF9sb2NrKTsKKwkJaWYgKGRhYnVmLT5wcmV2KQorCQkJZGFidWYtPnByZXYtPm5leHQgPSBkYWJ1Zi0+bmV4dDsKKwkJZWxzZQorCQkJeGZzX2RhYnVmX2dsb2JhbF9saXN0ID0gZGFidWYtPm5leHQ7CisJCWlmIChkYWJ1Zi0+bmV4dCkKKwkJCWRhYnVmLT5uZXh0LT5wcmV2ID0gZGFidWYtPnByZXY7CisJCW11dGV4X3NwaW51bmxvY2soJnhmc19kYWJ1Zl9nbG9iYWxfbG9jaywgcyk7CisJfQorCW1lbXNldChkYWJ1ZiwgMCwgWEZTX0RBX0JVRl9TSVpFKGRhYnVmLT5uYnVmKSk7CisjZW5kaWYKKwlpZiAoZGFidWYtPm5idWYgPT0gMSkKKwkJa21lbV96b25lX2ZyZWUoeGZzX2RhYnVmX3pvbmUsIGRhYnVmKTsKKwllbHNlCisJCWttZW1fZnJlZShkYWJ1ZiwgWEZTX0RBX0JVRl9TSVpFKGRhYnVmLT5uYnVmKSk7Cit9CisKKy8qCisgKiBMb2cgdHJhbnNhY3Rpb24gZnJvbSBhIGRhYnVmLgorICovCit2b2lkCit4ZnNfZGFfbG9nX2J1Zih4ZnNfdHJhbnNfdCAqdHAsIHhmc19kYWJ1Zl90ICpkYWJ1ZiwgdWludCBmaXJzdCwgdWludCBsYXN0KQoreworCXhmc19idWZfdAkqYnA7CisJdWludAkJZjsKKwlpbnQJCWk7CisJdWludAkJbDsKKwlpbnQJCW9mZjsKKworCUFTU0VSVChkYWJ1Zi0+bmJ1ZiAmJiBkYWJ1Zi0+ZGF0YSAmJiBkYWJ1Zi0+YmJjb3VudCAmJiBkYWJ1Zi0+YnBzWzBdKTsKKwlpZiAoZGFidWYtPm5idWYgPT0gMSkgeworCQlBU1NFUlQoZGFidWYtPmRhdGEgPT0gKHZvaWQgKilYRlNfQlVGX1BUUihkYWJ1Zi0+YnBzWzBdKSk7CisJCXhmc190cmFuc19sb2dfYnVmKHRwLCBkYWJ1Zi0+YnBzWzBdLCBmaXJzdCwgbGFzdCk7CisJCXJldHVybjsKKwl9CisJZGFidWYtPmRpcnR5ID0gMTsKKwlBU1NFUlQoZmlyc3QgPD0gbGFzdCk7CisJZm9yIChpID0gb2ZmID0gMDsgaSA8IGRhYnVmLT5uYnVmOyBpKyssIG9mZiArPSBYRlNfQlVGX0NPVU5UKGJwKSkgeworCQlicCA9IGRhYnVmLT5icHNbaV07CisJCWYgPSBvZmY7CisJCWwgPSBmICsgWEZTX0JVRl9DT1VOVChicCkgLSAxOworCQlpZiAoZiA8IGZpcnN0KQorCQkJZiA9IGZpcnN0OworCQlpZiAobCA+IGxhc3QpCisJCQlsID0gbGFzdDsKKwkJaWYgKGYgPD0gbCkKKwkJCXhmc190cmFuc19sb2dfYnVmKHRwLCBicCwgZiAtIG9mZiwgbCAtIG9mZik7CisJCS8qCisJCSAqIEJfRE9ORSBpcyBzZXQgYnkgeGZzX3RyYW5zX2xvZyBidWYuCisJCSAqIElmIHdlIGRvbid0IHNldCBpdCBvbiBhIG5ldyBidWZmZXIgKGdldCBub3QgcmVhZCkKKwkJICogdGhlbiBpZiB3ZSBkb24ndCBwdXQgYW55dGhpbmcgaW4gdGhlIGJ1ZmZlciBpdCB3b24ndAorCQkgKiBiZSBzZXQsIGFuZCBhdCBjb21taXQgaXQgaXQgcmVsZWFzZWQgaW50byB0aGUgY2FjaGUsCisJCSAqIGFuZCB0aGVuIGEgcmVhZCB3aWxsIGZhaWwuCisJCSAqLworCQllbHNlIGlmICghKFhGU19CVUZfSVNET05FKGJwKSkpCisJCSAgWEZTX0JVRl9ET05FKGJwKTsKKwl9CisJQVNTRVJUKGxhc3QgPCBvZmYpOworfQorCisvKgorICogUmVsZWFzZSBkYWJ1ZiBmcm9tIGEgdHJhbnNhY3Rpb24uCisgKiBIYXZlIHRvIGZyZWUgdXAgdGhlIGRhYnVmIGJlZm9yZSB0aGUgYnVmZmVycyBhcmUgcmVsZWFzZWQsCisgKiBzaW5jZSB0aGUgc3luY2hyb25pemF0aW9uIG9uIHRoZSBkYWJ1ZiBpcyByZWFsbHkgdGhlIGxvY2sgb24gdGhlIGJ1ZmZlci4KKyAqLwordm9pZAoreGZzX2RhX2JyZWxzZSh4ZnNfdHJhbnNfdCAqdHAsIHhmc19kYWJ1Zl90ICpkYWJ1ZikKK3sKKwl4ZnNfYnVmX3QJKmJwOworCXhmc19idWZfdAkqKmJwbGlzdDsKKwlpbnQJCWk7CisJaW50CQluYnVmOworCisJQVNTRVJUKGRhYnVmLT5uYnVmICYmIGRhYnVmLT5kYXRhICYmIGRhYnVmLT5iYmNvdW50ICYmIGRhYnVmLT5icHNbMF0pOworCWlmICgobmJ1ZiA9IGRhYnVmLT5uYnVmKSA9PSAxKSB7CisJCWJwbGlzdCA9ICZicDsKKwkJYnAgPSBkYWJ1Zi0+YnBzWzBdOworCX0gZWxzZSB7CisJCWJwbGlzdCA9IGttZW1fYWxsb2MobmJ1ZiAqIHNpemVvZigqYnBsaXN0KSwgS01fU0xFRVApOworCQltZW1jcHkoYnBsaXN0LCBkYWJ1Zi0+YnBzLCBuYnVmICogc2l6ZW9mKCpicGxpc3QpKTsKKwl9CisJeGZzX2RhX2J1Zl9kb25lKGRhYnVmKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmJ1ZjsgaSsrKQorCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicGxpc3RbaV0pOworCWlmIChicGxpc3QgIT0gJmJwKQorCQlrbWVtX2ZyZWUoYnBsaXN0LCBuYnVmICogc2l6ZW9mKCpicGxpc3QpKTsKK30KKworLyoKKyAqIEludmFsaWRhdGUgZGFidWYgZnJvbSBhIHRyYW5zYWN0aW9uLgorICovCit2b2lkCit4ZnNfZGFfYmludmFsKHhmc190cmFuc190ICp0cCwgeGZzX2RhYnVmX3QgKmRhYnVmKQoreworCXhmc19idWZfdAkqYnA7CisJeGZzX2J1Zl90CSoqYnBsaXN0OworCWludAkJaTsKKwlpbnQJCW5idWY7CisKKwlBU1NFUlQoZGFidWYtPm5idWYgJiYgZGFidWYtPmRhdGEgJiYgZGFidWYtPmJiY291bnQgJiYgZGFidWYtPmJwc1swXSk7CisJaWYgKChuYnVmID0gZGFidWYtPm5idWYpID09IDEpIHsKKwkJYnBsaXN0ID0gJmJwOworCQlicCA9IGRhYnVmLT5icHNbMF07CisJfSBlbHNlIHsKKwkJYnBsaXN0ID0ga21lbV9hbGxvYyhuYnVmICogc2l6ZW9mKCpicGxpc3QpLCBLTV9TTEVFUCk7CisJCW1lbWNweShicGxpc3QsIGRhYnVmLT5icHMsIG5idWYgKiBzaXplb2YoKmJwbGlzdCkpOworCX0KKwl4ZnNfZGFfYnVmX2RvbmUoZGFidWYpOworCWZvciAoaSA9IDA7IGkgPCBuYnVmOyBpKyspCisJCXhmc190cmFuc19iaW52YWwodHAsIGJwbGlzdFtpXSk7CisJaWYgKGJwbGlzdCAhPSAmYnApCisJCWttZW1fZnJlZShicGxpc3QsIG5idWYgKiBzaXplb2YoKmJwbGlzdCkpOworfQorCisvKgorICogR2V0IHRoZSBmaXJzdCBkYWRkciBmcm9tIGEgZGFidWYuCisgKi8KK3hmc19kYWRkcl90Cit4ZnNfZGFfYmxrbm8oeGZzX2RhYnVmX3QgKmRhYnVmKQoreworCUFTU0VSVChkYWJ1Zi0+bmJ1Zik7CisJQVNTRVJUKGRhYnVmLT5kYXRhKTsKKwlyZXR1cm4gWEZTX0JVRl9BRERSKGRhYnVmLT5icHNbMF0pOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kYV9idHJlZS5oIGIvZnMveGZzL3hmc19kYV9idHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYzY5OWQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2RhX2J0cmVlLmgKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19EQV9CVFJFRV9IX18KKyNkZWZpbmUJX19YRlNfREFfQlRSRUVfSF9fCisKK3N0cnVjdCB4ZnNfYnVmOworc3RydWN0IHhmc19ibWFwX2ZyZWU7CitzdHJ1Y3QgeGZzX2lub2RlOworc3RydWN0IHhmc19tb3VudDsKK3N0cnVjdCB4ZnNfdHJhbnM7CitzdHJ1Y3Qgem9uZTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERpcmVjdG9yeSBTdHJ1Y3R1cmUgd2hlbiBncmVhdGVyIHRoYW4gWEZTX0xCU0laRShtcCkgYnl0ZXMuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBjb21tb24gdG8gYm90aCBsZWFmIG5vZGVzIGFuZCBub24tbGVhZiBub2RlcyBpbiB0aGUgQnRyZWUuCisgKgorICogSXMgaXMgdXNlZCB0byBtYW5hZ2UgYSBkb3VibHkgbGlua2VkIGxpc3Qgb2YgYWxsIGJsb2NrcyBhdCB0aGUgc2FtZQorICogbGV2ZWwgaW4gdGhlIEJ0cmVlLCBhbmQgdG8gaWRlbnRpZnkgd2hpY2ggdHlwZSBvZiBibG9jayB0aGlzIGlzLgorICovCisjZGVmaW5lIFhGU19EQV9OT0RFX01BR0lDCTB4ZmViZQkvKiBtYWdpYyBudW1iZXI6IG5vbi1sZWFmIGJsb2NrcyAqLworI2RlZmluZSBYRlNfRElSX0xFQUZfTUFHSUMJMHhmZWViCS8qIG1hZ2ljIG51bWJlcjogZGlyZWN0b3J5IGxlYWYgYmxrcyAqLworI2RlZmluZSBYRlNfQVRUUl9MRUFGX01BR0lDCTB4ZmJlZQkvKiBtYWdpYyBudW1iZXI6IGF0dHJpYnV0ZSBsZWFmIGJsa3MgKi8KKyNkZWZpbmUJWEZTX0RJUjJfTEVBRjFfTUFHSUMJMHhkMmYxCS8qIG1hZ2ljIG51bWJlcjogdjIgZGlybGYgc2luZ2xlIGJsa3MgKi8KKyNkZWZpbmUJWEZTX0RJUjJfTEVBRk5fTUFHSUMJMHhkMmZmCS8qIG1hZ2ljIG51bWJlcjogdjIgZGlybGYgbXVsdGkgYmxrcyAqLworCisjZGVmaW5lCVhGU19ESVJYX0xFQUZfTUFHSUMobXApCVwKKwkoWEZTX0RJUl9JU19WMShtcCkgPyBYRlNfRElSX0xFQUZfTUFHSUMgOiBYRlNfRElSMl9MRUFGTl9NQUdJQykKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RhX2Jsa2luZm8geworCXhmc19kYWJsa190IGZvcnc7CQkJLyogcHJldmlvdXMgYmxvY2sgaW4gbGlzdCAqLworCXhmc19kYWJsa190IGJhY2s7CQkJLyogZm9sbG93aW5nIGJsb2NrIGluIGxpc3QgKi8KKwlfX3VpbnQxNl90IG1hZ2ljOwkJCS8qIHZhbGlkaXR5IGNoZWNrIG9uIGJsb2NrICovCisJX191aW50MTZfdCBwYWQ7CQkJCS8qIHVudXNlZCAqLworfSB4ZnNfZGFfYmxraW5mb190OworCisvKgorICogVGhpcyBpcyB0aGUgc3RydWN0dXJlIG9mIHRoZSByb290IGFuZCBpbnRlcm1lZGlhdGUgbm9kZXMgaW4gdGhlIEJ0cmVlLgorICogVGhlIGxlYWYgbm9kZXMgYXJlIGRlZmluZWQgYWJvdmUuCisgKgorICogRW50cmllcyBhcmUgbm90IHBhY2tlZC4KKyAqCisgKiBTaW5jZSB3ZSBoYXZlIGR1cGxpY2F0ZSBrZXlzLCB1c2UgYSBiaW5hcnkgc2VhcmNoIGJ1dCBhbHdheXMgZm9sbG93CisgKiBhbGwgbWF0Y2ggaW4gdGhlIGJsb2NrLCBub3QganVzdCB0aGUgZmlyc3QgbWF0Y2ggZm91bmQuCisgKi8KKyNkZWZpbmUJWEZTX0RBX05PREVfTUFYREVQVEgJNQkvKiBtYXggZGVwdGggb2YgQnRyZWUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RhX2ludG5vZGUgeworCXN0cnVjdCB4ZnNfZGFfbm9kZV9oZHIgewkvKiBjb25zdGFudC1zdHJ1Y3R1cmUgaGVhZGVyIGJsb2NrICovCisJCXhmc19kYV9ibGtpbmZvX3QgaW5mbzsJLyogYmxvY2sgdHlwZSwgbGlua3MsIGV0Yy4gKi8KKwkJX191aW50MTZfdCBjb3VudDsJLyogY291bnQgb2YgYWN0aXZlIGVudHJpZXMgKi8KKwkJX191aW50MTZfdCBsZXZlbDsJLyogbGV2ZWwgYWJvdmUgbGVhdmVzIChsZWFmID09IDApICovCisJfSBoZHI7CisJc3RydWN0IHhmc19kYV9ub2RlX2VudHJ5IHsKKwkJeGZzX2RhaGFzaF90IGhhc2h2YWw7CS8qIGhhc2ggdmFsdWUgZm9yIHRoaXMgZGVzY2VuZGFudCAqLworCQl4ZnNfZGFibGtfdCBiZWZvcmU7CS8qIEJ0cmVlIGJsb2NrIGJlZm9yZSB0aGlzIGtleSAqLworCX0gYnRyZWVbMV07CQkJLyogdmFyaWFibGUgc2l6ZWQgYXJyYXkgb2Yga2V5cyAqLworfSB4ZnNfZGFfaW50bm9kZV90OwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RhX25vZGVfaGRyIHhmc19kYV9ub2RlX2hkcl90OwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RhX25vZGVfZW50cnkgeGZzX2RhX25vZGVfZW50cnlfdDsKKworI2RlZmluZSBYRlNfREFfTUFYSEFTSAkoKHhmc19kYWhhc2hfdCktMSkgLyogbGFyZ2VzdCB2YWxpZCBoYXNoIHZhbHVlICovCisKKy8qCisgKiBNYWNyb3MgdXNlZCBieSBkaXJlY3RvcnkgY29kZSB0byBpbnRlcmZhY2UgdG8gdGhlIGZpbGVzeXN0ZW0uCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0xCU0laRSkKK2ludCB4ZnNfbGJzaXplKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX0xCU0laRShtcCkJCQl4ZnNfbGJzaXplKG1wKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0xCU0laRShtcCkJKChtcCktPm1fc2Iuc2JfYmxvY2tzaXplKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19MQkxPRykKK2ludCB4ZnNfbGJsb2coc3RydWN0IHhmc19tb3VudCAqbXApOworI2RlZmluZQlYRlNfTEJMT0cobXApCQkJeGZzX2xibG9nKG1wKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0xCTE9HKG1wKQkoKG1wKS0+bV9zYi5zYl9ibG9ja2xvZykKKyNlbmRpZgorCisvKgorICogTWFjcm9zIHVzZWQgYnkgZGlyZWN0b3J5IGNvZGUgdG8gaW50ZXJmYWNlIHRvIHRoZSBrZXJuZWwKKyAqLworCisvKgorICogTWFjcm9zIHVzZWQgdG8gbWFuaXB1bGF0ZSBkaXJlY3Rvcnkgb2ZmX3QncworICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19EQV9NQUtFX0JOT0VOVFJZKQorX191aW50MzJfdCB4ZnNfZGFfbWFrZV9ibm9lbnRyeShzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RhYmxrX3QgYm5vLAorCQkJCWludCBlbnRyeSk7CisjZGVmaW5lCVhGU19EQV9NQUtFX0JOT0VOVFJZKG1wLGJubyxlbnRyeSkJXAorCXhmc19kYV9tYWtlX2Jub2VudHJ5KG1wLGJubyxlbnRyeSkKKyNlbHNlCisjZGVmaW5lCVhGU19EQV9NQUtFX0JOT0VOVFJZKG1wLGJubyxlbnRyeSkgXAorCSgoKGJubykgPDwgKG1wKS0+bV9kaXJjb29rX2Vsb2cpIHwgKGVudHJ5KSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfREFfTUFLRV9DT09LSUUpCit4ZnNfb2ZmX3QgeGZzX2RhX21ha2VfY29va2llKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGFibGtfdCBibm8sIGludCBlbnRyeSwKKwkJCQl4ZnNfZGFoYXNoX3QgaGFzaCk7CisjZGVmaW5lCVhGU19EQV9NQUtFX0NPT0tJRShtcCxibm8sZW50cnksaGFzaCkJXAorCXhmc19kYV9tYWtlX2Nvb2tpZShtcCxibm8sZW50cnksaGFzaCkKKyNlbHNlCisjZGVmaW5lCVhGU19EQV9NQUtFX0NPT0tJRShtcCxibm8sZW50cnksaGFzaCkgXAorCSgoKHhmc19vZmZfdClYRlNfREFfTUFLRV9CTk9FTlRSWShtcCwgYm5vLCBlbnRyeSkgPDwgMzIpIHwgKGhhc2gpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19EQV9DT09LSUVfSEFTSCkKK3hmc19kYWhhc2hfdCB4ZnNfZGFfY29va2llX2hhc2goc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19vZmZfdCBjb29raWUpOworI2RlZmluZQlYRlNfREFfQ09PS0lFX0hBU0gobXAsY29va2llKQkJeGZzX2RhX2Nvb2tpZV9oYXNoKG1wLGNvb2tpZSkKKyNlbHNlCisjZGVmaW5lCVhGU19EQV9DT09LSUVfSEFTSChtcCxjb29raWUpCSgoeGZzX2RhaGFzaF90KShjb29raWUpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19EQV9DT09LSUVfQk5PKQoreGZzX2RhYmxrX3QgeGZzX2RhX2Nvb2tpZV9ibm8oc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19vZmZfdCBjb29raWUpOworI2RlZmluZQlYRlNfREFfQ09PS0lFX0JOTyhtcCxjb29raWUpCQl4ZnNfZGFfY29va2llX2JubyhtcCxjb29raWUpCisjZWxzZQorI2RlZmluZQlYRlNfREFfQ09PS0lFX0JOTyhtcCxjb29raWUpIFwKKwkoKCh4ZnNfb2ZmX3QpKGNvb2tpZSkgPj4gMzEpID09IC0xTEwgPyBcCisJCSh4ZnNfZGFibGtfdCkwIDogXAorCQkoeGZzX2RhYmxrX3QpKCh4ZnNfb2ZmX3QpKGNvb2tpZSkgPj4gKChtcCktPm1fZGlyY29va19lbG9nICsgMzIpKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfREFfQ09PS0lFX0VOVFJZKQoraW50IHhmc19kYV9jb29raWVfZW50cnkoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19vZmZfdCBjb29raWUpOworI2RlZmluZQlYRlNfREFfQ09PS0lFX0VOVFJZKG1wLGNvb2tpZSkJCXhmc19kYV9jb29raWVfZW50cnkobXAsY29va2llKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RBX0NPT0tJRV9FTlRSWShtcCxjb29raWUpIFwKKwkoKCh4ZnNfb2ZmX3QpKGNvb2tpZSkgPj4gMzEpID09IC0xTEwgPyBcCisJCSh4ZnNfZGFibGtfdCkwIDogXAorCQkoeGZzX2RhYmxrX3QpKCgoeGZzX29mZl90KShjb29raWUpID4+IDMyKSAmIFwKKwkJCSAgICAgICgoMSA8PCAobXApLT5tX2RpcmNvb2tfZWxvZykgLSAxKSkpCisjZW5kaWYKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQnRyZWUgc2VhcmNoaW5nIGFuZCBtb2RpZmljYXRpb24gc3RydWN0dXJlIGRlZmluaXRpb25zLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogU3RydWN0dXJlIHRvIGVhc2UgcGFzc2luZyBhcm91bmQgY29tcG9uZW50IG5hbWVzLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGFfYXJncyB7CisJdWNoYXJfdAkJKm5hbWU7CQkvKiBzdHJpbmcgKG1heWJlIG5vdCBOVUxMIHRlcm1pbmF0ZWQpICovCisJaW50CQluYW1lbGVuOwkvKiBsZW5ndGggb2Ygc3RyaW5nIChtYXliZSBubyBOVUxMKSAqLworCXVjaGFyX3QJCSp2YWx1ZTsJCS8qIHNldCBvZiBieXRlcyAobWF5YmUgY29udGFpbiBOVUxMcykgKi8KKwlpbnQJCXZhbHVlbGVuOwkvKiBsZW5ndGggb2YgdmFsdWUgKi8KKwlpbnQJCWZsYWdzOwkJLyogYXJndW1lbnQgZmxhZ3MgKGVnOiBBVFRSX05PQ1JFQVRFKSAqLworCXhmc19kYWhhc2hfdAloYXNodmFsOwkvKiBoYXNoIHZhbHVlIG9mIG5hbWUgKi8KKwl4ZnNfaW5vX3QJaW51bWJlcjsJLyogaW5wdXQvb3V0cHV0IGlub2RlIG51bWJlciAqLworCXN0cnVjdCB4ZnNfaW5vZGUgKmRwOwkJLyogZGlyZWN0b3J5IGlub2RlIHRvIG1hbmlwdWxhdGUgKi8KKwl4ZnNfZnNibG9ja190CSpmaXJzdGJsb2NrOwkvKiBwdHIgdG8gZmlyc3RibG9jayBmb3IgYm1hcCBjYWxscyAqLworCXN0cnVjdCB4ZnNfYm1hcF9mcmVlICpmbGlzdDsJLyogcHRyIHRvIGZyZWVsaXN0IGZvciBibWFwX2ZpbmlzaCAqLworCXN0cnVjdCB4ZnNfdHJhbnMgKnRyYW5zOwkvKiBjdXJyZW50IHRyYW5zIChjaGFuZ2VzIG92ZXIgdGltZSkgKi8KKwl4ZnNfZXh0bGVuX3QJdG90YWw7CQkvKiB0b3RhbCBibG9ja3MgbmVlZGVkLCBmb3IgMXN0IGJtYXAgKi8KKwlpbnQJCXdoaWNoZm9yazsJLyogZGF0YSBvciBhdHRyaWJ1dGUgZm9yayAqLworCXhmc19kYWJsa190CWJsa25vOwkJLyogYmxrbm8gb2YgYXR0ciBsZWFmIG9mIGludGVyZXN0ICovCisJaW50CQlpbmRleDsJCS8qIGluZGV4IG9mIGF0dHIgb2YgaW50ZXJlc3QgaW4gYmxrICovCisJeGZzX2RhYmxrX3QJcm10Ymxrbm87CS8qIHJlbW90ZSBhdHRyIHZhbHVlIHN0YXJ0aW5nIGJsa25vICovCisJaW50CQlybXRibGtjbnQ7CS8qIHJlbW90ZSBhdHRyIHZhbHVlIGJsb2NrIGNvdW50ICovCisJeGZzX2RhYmxrX3QJYmxrbm8yOwkJLyogYmxrbm8gb2YgMm5kIGF0dHIgbGVhZiBvZiBpbnRlcmVzdCAqLworCWludAkJaW5kZXgyOwkJLyogaW5kZXggb2YgMm5kIGF0dHIgaW4gYmxrICovCisJeGZzX2RhYmxrX3QJcm10Ymxrbm8yOwkvKiByZW1vdGUgYXR0ciB2YWx1ZSBzdGFydGluZyBibGtubyAqLworCWludAkJcm10YmxrY250MjsJLyogcmVtb3RlIGF0dHIgdmFsdWUgYmxvY2sgY291bnQgKi8KKwl1bnNpZ25lZCBjaGFyCWp1c3RjaGVjazsJLyogVC9GOiBjaGVjayBmb3Igb2sgd2l0aCBubyBzcGFjZSAqLworCXVuc2lnbmVkIGNoYXIJcmVuYW1lOwkJLyogVC9GOiB0aGlzIGlzIGFuIGF0b21pYyByZW5hbWUgb3AgKi8KKwl1bnNpZ25lZCBjaGFyCWFkZG5hbWU7CS8qIFQvRjogdGhpcyBpcyBhbiBhZGQgb3BlcmF0aW9uICovCisJdW5zaWduZWQgY2hhcglva25vZW50OwkvKiBUL0Y6IG9rIHRvIHJldHVybiBFTk9FTlQsIGVsc2UgZGllICovCit9IHhmc19kYV9hcmdzX3Q7CisKKy8qCisgKiBTdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYnVmZmVyKHMpIGZvciBhIGJsb2NrLgorICogVGhpcyBpcyBuZWVkZWQgaW4gdGhlIGRpcmVjdG9yeSB2ZXJzaW9uIDIgZm9ybWF0IGNhc2UsIHdoZW4KKyAqIG11bHRpcGxlIG5vbi1jb250aWd1b3VzIGZzYmxvY2tzIG1pZ2h0IGJlIG5lZWRlZCB0byBjb3ZlciBvbmUKKyAqIGxvZ2ljYWwgZGlyZWN0b3J5IGJsb2NrLgorICogSWYgdGhlIGJ1ZmZlciBjb3VudCBpcyAxIHRoZW4gdGhlIGRhdGEgcG9pbnRlciBwb2ludHMgdG8gdGhlCisgKiBzYW1lIHBsYWNlIGFzIHRoZSBiX2FkZHIgZmllbGQgZm9yIHRoZSBidWZmZXIsIGVsc2UgdG8ga21lbV9hbGxvY2VkIG1lbW9yeS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RhYnVmIHsKKwlpbnQJCW5idWY7CQkvKiBudW1iZXIgb2YgYnVmZmVyIHBvaW50ZXJzIHByZXNlbnQgKi8KKwlzaG9ydAkJZGlydHk7CQkvKiBkYXRhIG5lZWRzIHRvIGJlIGNvcGllZCBiYWNrICovCisJc2hvcnQJCWJiY291bnQ7CS8qIGhvdyBsYXJnZSBpcyBkYXRhIGluIGJicyAqLworCXZvaWQJCSpkYXRhOwkJLyogcG9pbnRlciBmb3IgYnVmZmVycycgZGF0YSAqLworI2lmZGVmIFhGU19EQUJVRl9ERUJVRworCWluc3RfdAkJKnJhOwkJLyogcmV0dXJuIGFkZHJlc3Mgb2YgY2FsbGVyIHRvIG1ha2UgKi8KKwlzdHJ1Y3QgeGZzX2RhYnVmICpuZXh0OwkJLyogbmV4dCBpbiBnbG9iYWwgY2hhaW4gKi8KKwlzdHJ1Y3QgeGZzX2RhYnVmICpwcmV2OwkJLyogcHJldmlvdXMgaW4gZ2xvYmFsIGNoYWluICovCisJc3RydWN0IHhmc19idWZ0YXJnICp0YXJnZXQ7CS8qIGRldmljZSBmb3IgYnVmZmVyICovCisJeGZzX2RhZGRyX3QJYmxrbm87CQkvKiBkYWRkciBmaXJzdCBpbiBicHNbMF0gKi8KKyNlbmRpZgorCXN0cnVjdCB4ZnNfYnVmCSpicHNbMV07CS8qIGFjdHVhbGx5IG5idWYgb2YgdGhlc2UgKi8KK30geGZzX2RhYnVmX3Q7CisjZGVmaW5lCVhGU19EQV9CVUZfU0laRShuKQlcCisJKHNpemVvZih4ZnNfZGFidWZfdCkgKyBzaXplb2Yoc3RydWN0IHhmc19idWYgKikgKiAoKG4pIC0gMSkpCisKKyNpZmRlZiBYRlNfREFCVUZfREVCVUcKK2V4dGVybiB4ZnNfZGFidWZfdAkqeGZzX2RhYnVmX2dsb2JhbF9saXN0OworI2VuZGlmCisKKy8qCisgKiBTdG9yYWdlIGZvciBob2xkaW5nIHN0YXRlIGR1cmluZyBCdHJlZSBzZWFyY2hlcyBhbmQgc3BsaXQvam9pbiBvcHMuCisgKgorICogT25seSBuZWVkIHNwYWNlIGZvciA1IGludGVybWVkaWF0ZSBub2Rlcy4gIFdpdGggYSBtaW5pbXVtIG9mIDYyLXdheQorICogZmFub3V0IHRvIHRoZSBCdHJlZSwgd2UgY2FuIHN1cHBvcnQgb3ZlciA5MDAgbWlsbGlvbiBkaXJlY3RvcnkgYmxvY2tzLAorICogd2hpY2ggaXMgc2xpZ2h0bHkgbW9yZSB0aGFuIGVub3VnaC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RhX3N0YXRlX2JsayB7CisJeGZzX2RhYnVmX3QJKmJwOwkJLyogYnVmZmVyIGNvbnRhaW5pbmcgYmxvY2sgKi8KKwl4ZnNfZGFibGtfdAlibGtubzsJCS8qIGZpbGVzeXN0ZW0gYmxrbm8gb2YgYnVmZmVyICovCisJeGZzX2RhZGRyX3QJZGlza19ibGtubzsJLyogb24tZGlzayBibGtubyAoaW4gQkJzKSBvZiBidWZmZXIgKi8KKwlpbnQJCWluZGV4OwkJLyogcmVsZXZhbnQgaW5kZXggaW50byBibG9jayAqLworCXhmc19kYWhhc2hfdAloYXNodmFsOwkvKiBsYXN0IGhhc2ggdmFsdWUgaW4gYmxvY2sgKi8KKwlpbnQJCW1hZ2ljOwkJLyogYmxrJ3MgbWFnaWMgbnVtYmVyLCBpZTogYmxrIHR5cGUgKi8KK30geGZzX2RhX3N0YXRlX2Jsa190OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGFfc3RhdGVfcGF0aCB7CisJaW50CQkJYWN0aXZlOwkJLyogbnVtYmVyIG9mIGFjdGl2ZSBsZXZlbHMgKi8KKwl4ZnNfZGFfc3RhdGVfYmxrX3QJYmxrW1hGU19EQV9OT0RFX01BWERFUFRIXTsKK30geGZzX2RhX3N0YXRlX3BhdGhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RhX3N0YXRlIHsKKwl4ZnNfZGFfYXJnc190CQkqYXJnczsJCS8qIGZpbGVuYW1lIGFyZ3VtZW50cyAqLworCXN0cnVjdCB4ZnNfbW91bnQJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCXVuc2lnbmVkIGludAkJYmxvY2tzaXplOwkvKiBsb2dpY2FsIGJsb2NrIHNpemUgKi8KKwl1bnNpZ25lZCBpbnQJCW5vZGVfZW50czsJLyogaG93IG1hbnkgZW50cmllcyBpbiBkYW5vZGUgKi8KKwl4ZnNfZGFfc3RhdGVfcGF0aF90CXBhdGg7CQkvKiBzZWFyY2gvc3BsaXQgcGF0aHMgKi8KKwl4ZnNfZGFfc3RhdGVfcGF0aF90CWFsdHBhdGg7CS8qIGFsdGVybmF0ZSBwYXRoIGZvciBqb2luICovCisJdW5zaWduZWQgY2hhcgkJaW5sZWFmOwkJLyogaW5zZXJ0IGludG8gMS0+bGYsIDAtPnNwbGYgKi8KKwl1bnNpZ25lZCBjaGFyCQlleHRyYXZhbGlkOwkvKiBUL0Y6IGV4dHJhYmxrIGlzIGluIHVzZSAqLworCXVuc2lnbmVkIGNoYXIJCWV4dHJhYWZ0ZXI7CS8qIFQvRjogZXh0cmFibGsgaXMgYWZ0ZXIgbmV3ICovCisJeGZzX2RhX3N0YXRlX2Jsa190CWV4dHJhYmxrOwkvKiBmb3IgZG91YmxlLXNwbGl0cyBvbiBsZWFmcyAqLworCQkJCQkJLyogZm9yIGRpcnYyIGV4dHJhYmxrIGlzIGRhdGEgKi8KK30geGZzX2RhX3N0YXRlX3Q7CisKKy8qCisgKiBVdGlsaXR5IG1hY3JvcyB0byBhaWQgaW4gbG9nZ2luZyBjaGFuZ2VkIHN0cnVjdHVyZSBmaWVsZHMuCisgKi8KKyNkZWZpbmUgWEZTX0RBX0xPR09GRihCQVNFLCBBRERSKQkoKGNoYXIgKikoQUREUikgLSAoY2hhciAqKShCQVNFKSkKKyNkZWZpbmUgWEZTX0RBX0xPR1JBTkdFKEJBU0UsIEFERFIsIFNJWkUpCVwKKwkJKHVpbnQpKFhGU19EQV9MT0dPRkYoQkFTRSwgQUREUikpLCBcCisJCSh1aW50KShYRlNfREFfTE9HT0ZGKEJBU0UsIEFERFIpKyhTSVpFKS0xKQorCisKKyNpZmRlZiBfX0tFUk5FTF9fCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgdGhlIGtlcm5lbC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIFJvdXRpbmVzIHVzZWQgZm9yIGdyb3dpbmcgdGhlIEJ0cmVlLgorICovCitpbnQJeGZzX2RhX25vZGVfY3JlYXRlKHhmc19kYV9hcmdzX3QgKmFyZ3MsIHhmc19kYWJsa190IGJsa25vLCBpbnQgbGV2ZWwsCisJCQkJCSB4ZnNfZGFidWZfdCAqKmJwcCwgaW50IHdoaWNoZm9yayk7CitpbnQJeGZzX2RhX3NwbGl0KHhmc19kYV9zdGF0ZV90ICpzdGF0ZSk7CisKKy8qCisgKiBSb3V0aW5lcyB1c2VkIGZvciBzaHJpbmtpbmcgdGhlIEJ0cmVlLgorICovCitpbnQJeGZzX2RhX2pvaW4oeGZzX2RhX3N0YXRlX3QgKnN0YXRlKTsKK3ZvaWQJeGZzX2RhX2ZpeGhhc2hwYXRoKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwKKwkJCQkJICB4ZnNfZGFfc3RhdGVfcGF0aF90ICpwYXRoX3RvX3RvX2ZpeCk7CisKKy8qCisgKiBSb3V0aW5lcyB1c2VkIGZvciBmaW5kaW5nIHRoaW5ncyBpbiB0aGUgQnRyZWUuCisgKi8KK2ludAl4ZnNfZGFfbm9kZV9sb29rdXBfaW50KHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwgaW50ICpyZXN1bHQpOworaW50CXhmc19kYV9wYXRoX3NoaWZ0KHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwgeGZzX2RhX3N0YXRlX3BhdGhfdCAqcGF0aCwKKwkJCQkJIGludCBmb3J3YXJkLCBpbnQgcmVsZWFzZSwgaW50ICpyZXN1bHQpOworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKi8KK2ludAl4ZnNfZGFfYmxrX3VubGluayh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIHhmc19kYV9zdGF0ZV9ibGtfdCAqZHJvcF9ibGssCisJCQkJCSB4ZnNfZGFfc3RhdGVfYmxrX3QgKnNhdmVfYmxrKTsKK2ludAl4ZnNfZGFfYmxrX2xpbmsoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLCB4ZnNfZGFfc3RhdGVfYmxrX3QgKm9sZF9ibGssCisJCQkJICAgICAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqbmV3X2Jsayk7CisKKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICovCitpbnQJeGZzX2RhX2dyb3dfaW5vZGUoeGZzX2RhX2FyZ3NfdCAqYXJncywgeGZzX2RhYmxrX3QgKm5ld19ibGtubyk7CitpbnQJeGZzX2RhX2dldF9idWYoc3RydWN0IHhmc190cmFucyAqdHJhbnMsIHN0cnVjdCB4ZnNfaW5vZGUgKmRwLAorCQkJICAgICAgeGZzX2RhYmxrX3QgYm5vLCB4ZnNfZGFkZHJfdCBtYXBwZWRibm8sCisJCQkgICAgICB4ZnNfZGFidWZfdCAqKmJwLCBpbnQgd2hpY2hmb3JrKTsKK2ludAl4ZnNfZGFfcmVhZF9idWYoc3RydWN0IHhmc190cmFucyAqdHJhbnMsIHN0cnVjdCB4ZnNfaW5vZGUgKmRwLAorCQkJICAgICAgIHhmc19kYWJsa190IGJubywgeGZzX2RhZGRyX3QgbWFwcGVkYm5vLAorCQkJICAgICAgIHhmc19kYWJ1Zl90ICoqYnBwLCBpbnQgd2hpY2hmb3JrKTsKK3hmc19kYWRkcl90CXhmc19kYV9yZWFkYV9idWYoc3RydWN0IHhmc190cmFucyAqdHJhbnMsIHN0cnVjdCB4ZnNfaW5vZGUgKmRwLAorCQkJeGZzX2RhYmxrX3QgYm5vLCBpbnQgd2hpY2hmb3JrKTsKK2ludAl4ZnNfZGFfc2hyaW5rX2lub2RlKHhmc19kYV9hcmdzX3QgKmFyZ3MsIHhmc19kYWJsa190IGRlYWRfYmxrbm8sCisJCQkJCSAgeGZzX2RhYnVmX3QgKmRlYWRfYnVmKTsKKwordWludCB4ZnNfZGFfaGFzaG5hbWUodWNoYXJfdCAqbmFtZV9zdHJpbmcsIGludCBuYW1lX2xlbmd0aCk7Cit1aW50IHhmc19kYV9sb2cyX3JvdW5kdXAodWludCBpKTsKK3hmc19kYV9zdGF0ZV90ICp4ZnNfZGFfc3RhdGVfYWxsb2Modm9pZCk7Cit2b2lkIHhmc19kYV9zdGF0ZV9mcmVlKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSk7Cit2b2lkIHhmc19kYV9zdGF0ZV9raWxsX2FsdHBhdGgoeGZzX2RhX3N0YXRlX3QgKnN0YXRlKTsKKwordm9pZCB4ZnNfZGFfYnVmX2RvbmUoeGZzX2RhYnVmX3QgKmRhYnVmKTsKK3ZvaWQgeGZzX2RhX2xvZ19idWYoc3RydWN0IHhmc190cmFucyAqdHAsIHhmc19kYWJ1Zl90ICpkYWJ1ZiwgdWludCBmaXJzdCwKKwkJCSAgIHVpbnQgbGFzdCk7Cit2b2lkIHhmc19kYV9icmVsc2Uoc3RydWN0IHhmc190cmFucyAqdHAsIHhmc19kYWJ1Zl90ICpkYWJ1Zik7Cit2b2lkIHhmc19kYV9iaW52YWwoc3RydWN0IHhmc190cmFucyAqdHAsIHhmc19kYWJ1Zl90ICpkYWJ1Zik7Cit4ZnNfZGFkZHJfdCB4ZnNfZGFfYmxrbm8oeGZzX2RhYnVmX3QgKmRhYnVmKTsKKworZXh0ZXJuIHN0cnVjdCBrbWVtX3pvbmUgKnhmc19kYV9zdGF0ZV96b25lOworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCS8qIF9fWEZTX0RBX0JUUkVFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kZnJhZy5jIGIvZnMveGZzL3hmc19kZnJhZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZDU1MWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2RmcmFnLmMKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCisjaW5jbHVkZSAieGZzX2RmcmFnLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX21hYy5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorCisvKgorICogU3lzc2dpIGludGVyZmFjZSBmb3Igc3dhcGV4dAorICovCitpbnQKK3hmc19zd2FwZXh0KAorCXhmc19zd2FwZXh0X3QJX191c2VyICpzeHApCit7CisJeGZzX3N3YXBleHRfdAlzeDsKKwl4ZnNfaW5vZGVfdCAgICAgKmlwPU5VTEwsICp0aXA9TlVMTCwgKmlwc1syXTsKKwl4ZnNfdHJhbnNfdCAgICAgKnRwOworCXhmc19tb3VudF90ICAgICAqbXA7CisJeGZzX2JzdGF0X3QJKnNicDsKKwlzdHJ1Y3QgZmlsZQkqZnAgPSBOVUxMLCAqdGZwID0gTlVMTDsKKwl2bm9kZV90CQkqdnAsICp0dnA7CisJYmh2X2Rlc2NfdCAgICAgICpiZHAsICp0YmRwOworCXZuX2Jodl9oZWFkX3QgICAqYmhwLCAqdGJocDsKKwl1aW50CQlsb2NrX2ZsYWdzPTA7CisJaW50CQlpbGZfZmllbGRzLCB0aWxmX2ZpZWxkczsKKwlpbnQJCWVycm9yID0gMDsKKwl4ZnNfaWZvcmtfdAl0ZW1waWYsICppZnAsICp0aWZwOworCV9fdWludDY0X3QJdG1wOworCWludAkJYWZvcmtibGtzID0gMDsKKwlpbnQJCXRhZm9ya2Jsa3MgPSAwOworCWludAkJbG9ja2VkID0gMDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc3gsIHN4cCwgc2l6ZW9mKHN4KSkpCisJCXJldHVybiBYRlNfRVJST1IoRUZBVUxUKTsKKworCS8qIFB1bGwgaW5mb3JtYXRpb24gZm9yIHRoZSB0YXJnZXQgZmQgKi8KKwlpZiAoKChmcCA9IGZnZXQoKGludClzeC5zeF9mZHRhcmdldCkpID09IE5VTEwpIHx8CisJICAgICgodnAgPSBMSU5WRlNfR0VUX1ZQKGZwLT5mX2RlbnRyeS0+ZF9pbm9kZSkpID09IE5VTEwpKSAgeworCQllcnJvciA9IFhGU19FUlJPUihFSU5WQUwpOworCQlnb3RvIGVycm9yMDsKKwl9CisKKwliaHAgPSBWTl9CSFZfSEVBRCh2cCk7CisJYmRwID0gdm5fYmh2X2xvb2t1cChiaHAsICZ4ZnNfdm5vZGVvcHMpOworCWlmIChiZHAgPT0gTlVMTCkgeworCQllcnJvciA9IFhGU19FUlJPUihFQkFERik7CisJCWdvdG8gZXJyb3IwOworCX0gZWxzZSB7CisJCWlwID0gWEZTX0JIVlRPSShiZHApOworCX0KKworCWlmICgoKHRmcCA9IGZnZXQoKGludClzeC5zeF9mZHRtcCkpID09IE5VTEwpIHx8CisJICAgICgodHZwID0gTElOVkZTX0dFVF9WUCh0ZnAtPmZfZGVudHJ5LT5kX2lub2RlKSkgPT0gTlVMTCkpIHsKKwkJZXJyb3IgPSBYRlNfRVJST1IoRUlOVkFMKTsKKwkJZ290byBlcnJvcjA7CisJfQorCisJdGJocCA9IFZOX0JIVl9IRUFEKHR2cCk7CisJdGJkcCA9IHZuX2Jodl9sb29rdXAodGJocCwgJnhmc192bm9kZW9wcyk7CisJaWYgKHRiZHAgPT0gTlVMTCkgeworCQllcnJvciA9IFhGU19FUlJPUihFQkFERik7CisJCWdvdG8gZXJyb3IwOworCX0gZWxzZSB7CisJCXRpcCA9IFhGU19CSFZUT0kodGJkcCk7CisJfQorCisJaWYgKGlwLT5pX21vdW50ICE9IHRpcC0+aV9tb3VudCkgeworCQllcnJvciA9ICBYRlNfRVJST1IoRUlOVkFMKTsKKwkJZ290byBlcnJvcjA7CisJfQorCisJaWYgKGlwLT5pX2lubyA9PSB0aXAtPmlfaW5vKSB7CisJCWVycm9yID0gIFhGU19FUlJPUihFSU5WQUwpOworCQlnb3RvIGVycm9yMDsKKwl9CisKKwltcCA9IGlwLT5pX21vdW50OworCisJc2JwID0gJnN4LnN4X3N0YXQ7CisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKKwkJZXJyb3IgPSAgWEZTX0VSUk9SKEVJTyk7CisJCWdvdG8gZXJyb3IwOworCX0KKworCWxvY2tlZCA9IDE7CisKKwkvKiBMb2NrIGluIGlfaW5vIG9yZGVyICovCisJaWYgKGlwLT5pX2lubyA8IHRpcC0+aV9pbm8pIHsKKwkJaXBzWzBdID0gaXA7CisJCWlwc1sxXSA9IHRpcDsKKwl9IGVsc2UgeworCQlpcHNbMF0gPSB0aXA7CisJCWlwc1sxXSA9IGlwOworCX0KKwlsb2NrX2ZsYWdzID0gWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0w7CisJeGZzX2xvY2tfaW5vZGVzKGlwcywgMiwgMCwgbG9ja19mbGFncyk7CisKKwkvKiBDaGVjayBwZXJtaXNzaW9ucyAqLworCWVycm9yID0geGZzX2lhY2Nlc3MoaXAsIFNfSVdVU1IsIE5VTEwpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJvcjA7CisKKwllcnJvciA9IHhmc19pYWNjZXNzKHRpcCwgU19JV1VTUiwgTlVMTCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yMDsKKworCS8qIFZlcmlmeSB0aGF0IGJvdGggZmlsZXMgaGF2ZSB0aGUgc2FtZSBmb3JtYXQgKi8KKwlpZiAoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgIT0gKHRpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpKSB7CisJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7CisJCWdvdG8gZXJyb3IwOworCX0KKworCS8qIFZlcmlmeSBib3RoIGZpbGVzIGFyZSBlaXRoZXIgcmVhbC10aW1lIG9yIG5vbi1yZWFsdGltZSAqLworCWlmICgoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpICE9CisJICAgICh0aXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpKSB7CisJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7CisJCWdvdG8gZXJyb3IwOworCX0KKworCS8qIFNob3VsZCBuZXZlciBnZXQgYSBsb2NhbCBmb3JtYXQgKi8KKwlpZiAoaXAtPmlfZC5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwgfHwKKwkgICAgdGlwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKSB7CisJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7CisJCWdvdG8gZXJyb3IwOworCX0KKworCWlmIChWTl9DQUNIRUQodHZwKSAhPSAwKQorCQl4ZnNfaW52YWxfY2FjaGVkX3BhZ2VzKFhGU19JVE9WKHRpcCksICYodGlwLT5pX2lvY29yZSksCisJCQkJCQkobG9mZl90KTAsIDAsIDApOworCisJLyogVmVyaWZ5IE9fRElSRUNUIGZvciBmdG1wICovCisJaWYgKFZOX0NBQ0hFRCh0dnApICE9IDApIHsKKwkJZXJyb3IgPSBYRlNfRVJST1IoRUlOVkFMKTsKKwkJZ290byBlcnJvcjA7CisJfQorCisJLyogVmVyaWZ5IGFsbCBkYXRhIGFyZSBiZWluZyBzd2FwcGVkICovCisJaWYgKHN4LnN4X29mZnNldCAhPSAwIHx8CisJICAgIHN4LnN4X2xlbmd0aCAhPSBpcC0+aV9kLmRpX3NpemUgfHwKKwkgICAgc3guc3hfbGVuZ3RoICE9IHRpcC0+aV9kLmRpX3NpemUpIHsKKwkJZXJyb3IgPSBYRlNfRVJST1IoRUZBVUxUKTsKKwkJZ290byBlcnJvcjA7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgdGFyZ2V0IGhhcyBleHRlbmRlZCBhdHRyaWJ1dGVzLCB0aGUgdG1wIGZpbGUKKwkgKiBtdXN0IGFsc28gaW4gb3JkZXIgdG8gZW5zdXJlIHRoZSBjb3JyZWN0IGRhdGEgZm9yaworCSAqIGZvcm1hdC4KKwkgKi8KKwlpZiAoIFhGU19JRk9SS19RKGlwKSAhPSBYRlNfSUZPUktfUSh0aXApICkgeworCQllcnJvciA9IFhGU19FUlJPUihFSU5WQUwpOworCQlnb3RvIGVycm9yMDsKKwl9CisKKwkvKgorCSAqIENvbXBhcmUgdGhlIGN1cnJlbnQgY2hhbmdlICYgbW9kaWZ5IHRpbWVzIHdpdGggdGhhdAorCSAqIHBhc3NlZCBpbi4gIElmIHRoZXkgZGlmZmVyLCB3ZSBhYm9ydCB0aGlzIHN3YXAuCisJICogVGhpcyBpcyB0aGUgbWVjaGFuaXNtIHVzZWQgdG8gZW5zdXJlIHRoZSBjYWxsaW5nCisJICogcHJvY2VzcyB0aGF0IHRoZSBmaWxlIHdhcyBub3QgY2hhbmdlZCBvdXQgZnJvbQorCSAqIHVuZGVyIGl0LgorCSAqLworCWlmICgoc2JwLT5ic19jdGltZS50dl9zZWMgIT0gaXAtPmlfZC5kaV9jdGltZS50X3NlYykgfHwKKwkgICAgKHNicC0+YnNfY3RpbWUudHZfbnNlYyAhPSBpcC0+aV9kLmRpX2N0aW1lLnRfbnNlYykgfHwKKwkgICAgKHNicC0+YnNfbXRpbWUudHZfc2VjICE9IGlwLT5pX2QuZGlfbXRpbWUudF9zZWMpIHx8CisJICAgIChzYnAtPmJzX210aW1lLnR2X25zZWMgIT0gaXAtPmlfZC5kaV9tdGltZS50X25zZWMpKSB7CisJCWVycm9yID0gWEZTX0VSUk9SKEVCVVNZKTsKKwkJZ290byBlcnJvcjA7CisJfQorCisJLyogV2UgbmVlZCB0byBmYWlsIGlmIHRoZSBmaWxlIGlzIG1lbW9yeSBtYXBwZWQuICBPbmNlIHdlIGhhdmUgdG9zc2VkCisJICogYWxsIGV4aXN0aW5nIHBhZ2VzLCB0aGUgcGFnZSBmYXVsdCB3aWxsIGhhdmUgbm8gb3B0aW9uCisJICogYnV0IHRvIGdvIHRvIHRoZSBmaWxlc3lzdGVtIGZvciBwYWdlcy4gQnkgbWFraW5nIHRoZSBwYWdlIGZhdWx0IGNhbGwKKwkgKiBWT1BfUkVBRCAob3Igd3JpdGUgaW4gdGhlIGNhc2Ugb2YgYXV0b2dyb3cpIHRoZXkgYmxvY2sgb24gdGhlIGlvbG9jaworCSAqIHVudGlsIHdlIGhhdmUgc3dpdGNoZWQgdGhlIGV4dGVudHMuCisJICovCisJaWYgKFZOX01BUFBFRCh2cCkpIHsKKwkJZXJyb3IgPSBYRlNfRVJST1IoRUJVU1kpOworCQlnb3RvIGVycm9yMDsKKwl9CisKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc19pdW5sb2NrKHRpcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJLyoKKwkgKiBUaGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIGhlcmUgc2luY2Ugd2UgZ2F2ZSB1cCB0aGUKKwkgKiBpbG9jay4gIEhvd2V2ZXIsIHRoZSBkYXRhIGZvcmsgd2lsbCBub3QgY2hhbmdlIHNpbmNlCisJICogd2UgaGF2ZSB0aGUgaW9sb2NrIChsb2NrZWQgZm9yIHRydW5jYXRpb24gdG9vKSBzbyB3ZQorCSAqIGFyZSBzYWZlLiAgV2UgZG9uJ3QgcmVhbGx5IGNhcmUgaWYgbm9uLWlvIHJlbGF0ZWQKKwkgKiBmaWVsZHMgY2hhbmdlLgorCSAqLworCisJVk9QX1RPU1NfUEFHRVModnAsIDAsIC0xLCBGSV9SRU1BUEYpOworCisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19TV0FQRVhUKTsKKwlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsCisJCQkJICAgICBYRlNfSUNIQU5HRV9MT0dfUkVTKG1wKSwgMCwKKwkJCQkgICAgIDAsIDApKSkgeworCQl4ZnNfaXVubG9jayhpcCwgIFhGU19JT0xPQ0tfRVhDTCk7CisJCXhmc19pdW5sb2NrKHRpcCwgWEZTX0lPTE9DS19FWENMKTsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJeGZzX2xvY2tfaW5vZGVzKGlwcywgMiwgMCwgWEZTX0lMT0NLX0VYQ0wpOworCisJLyoKKwkgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGV4dGVuZGVkIGF0dHJpYnV0ZSBibG9ja3MKKwkgKi8KKwlpZiAoICgoWEZTX0lGT1JLX1EoaXApICE9IDApICYmIChpcC0+aV9kLmRpX2FuZXh0ZW50cyA+IDApKSAmJgorCSAgICAgKGlwLT5pX2QuZGlfYWZvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkpIHsKKwkJZXJyb3IgPSB4ZnNfYm1hcF9jb3VudF9ibG9ja3ModHAsIGlwLCBYRlNfQVRUUl9GT1JLLCAmYWZvcmtibGtzKTsKKwkJaWYgKGVycm9yKSB7CisJCQl4ZnNfaXVubG9jayhpcCwgIGxvY2tfZmxhZ3MpOworCQkJeGZzX2l1bmxvY2sodGlwLCBsb2NrX2ZsYWdzKTsKKwkJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJfQorCWlmICggKChYRlNfSUZPUktfUSh0aXApICE9IDApICYmICh0aXAtPmlfZC5kaV9hbmV4dGVudHMgPiAwKSkgJiYKKwkgICAgICh0aXAtPmlfZC5kaV9hZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0xPQ0FMKSkgeworCQllcnJvciA9IHhmc19ibWFwX2NvdW50X2Jsb2Nrcyh0cCwgdGlwLCBYRlNfQVRUUl9GT1JLLAorCQkJJnRhZm9ya2Jsa3MpOworCQlpZiAoZXJyb3IpIHsKKwkJCXhmc19pdW5sb2NrKGlwLCAgbG9ja19mbGFncyk7CisJCQl4ZnNfaXVubG9jayh0aXAsIGxvY2tfZmxhZ3MpOworCQkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwl9CisKKwkvKgorCSAqIFN3YXAgdGhlIGRhdGEgZm9ya3Mgb2YgdGhlIGlub2RlcworCSAqLworCWlmcCA9ICZpcC0+aV9kZjsKKwl0aWZwID0gJnRpcC0+aV9kZjsKKwl0ZW1waWYgPSAqaWZwOwkvKiBzdHJ1Y3QgY29weSAqLworCSppZnAgPSAqdGlmcDsJLyogc3RydWN0IGNvcHkgKi8KKwkqdGlmcCA9IHRlbXBpZjsJLyogc3RydWN0IGNvcHkgKi8KKworCS8qCisJICogRml4IHRoZSBvbi1kaXNrIGlub2RlIHZhbHVlcworCSAqLworCXRtcCA9IChfX3VpbnQ2NF90KWlwLT5pX2QuZGlfbmJsb2NrczsKKwlpcC0+aV9kLmRpX25ibG9ja3MgPSB0aXAtPmlfZC5kaV9uYmxvY2tzIC0gdGFmb3JrYmxrcyArIGFmb3JrYmxrczsKKwl0aXAtPmlfZC5kaV9uYmxvY2tzID0gdG1wICsgdGFmb3JrYmxrcyAtIGFmb3JrYmxrczsKKworCXRtcCA9IChfX3VpbnQ2NF90KSBpcC0+aV9kLmRpX25leHRlbnRzOworCWlwLT5pX2QuZGlfbmV4dGVudHMgPSB0aXAtPmlfZC5kaV9uZXh0ZW50czsKKwl0aXAtPmlfZC5kaV9uZXh0ZW50cyA9IHRtcDsKKworCXRtcCA9IChfX3VpbnQ2NF90KSBpcC0+aV9kLmRpX2Zvcm1hdDsKKwlpcC0+aV9kLmRpX2Zvcm1hdCA9IHRpcC0+aV9kLmRpX2Zvcm1hdDsKKwl0aXAtPmlfZC5kaV9mb3JtYXQgPSB0bXA7CisKKwlpbGZfZmllbGRzID0gWEZTX0lMT0dfQ09SRTsKKworCXN3aXRjaChpcC0+aV9kLmRpX2Zvcm1hdCkgeworCWNhc2UgWEZTX0RJTk9ERV9GTVRfRVhURU5UUzoKKwkJLyogSWYgdGhlIGV4dGVudHMgZml0IGluIHRoZSBpbm9kZSwgZml4IHRoZQorCQkgKiBwb2ludGVyLiAgT3RoZXJ3aXNlIGl0J3MgYWxyZWFkeSBOVUxMIG9yCisJCSAqIHBvaW50aW5nIHRvIHRoZSBleHRlbnQuCisJCSAqLworCQlpZiAoaXAtPmlfZC5kaV9uZXh0ZW50cyA8PSBYRlNfSU5MSU5FX0VYVFMpIHsKKwkJCWlmcC0+aWZfdTEuaWZfZXh0ZW50cyA9CisJCQkJaWZwLT5pZl91Mi5pZl9pbmxpbmVfZXh0OworCQl9CisJCWlsZl9maWVsZHMgfD0gWEZTX0lMT0dfREVYVDsKKwkJYnJlYWs7CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9CVFJFRToKKwkJaWxmX2ZpZWxkcyB8PSBYRlNfSUxPR19EQlJPT1Q7CisJCWJyZWFrOworCX0KKworCXRpbGZfZmllbGRzID0gWEZTX0lMT0dfQ09SRTsKKworCXN3aXRjaCh0aXAtPmlfZC5kaV9mb3JtYXQpIHsKKwljYXNlIFhGU19ESU5PREVfRk1UX0VYVEVOVFM6CisJCS8qIElmIHRoZSBleHRlbnRzIGZpdCBpbiB0aGUgaW5vZGUsIGZpeCB0aGUKKwkJICogcG9pbnRlci4gIE90aGVyd2lzZSBpdCdzIGFscmVhZHkgTlVMTCBvcgorCQkgKiBwb2ludGluZyB0byB0aGUgZXh0ZW50LgorCQkgKi8KKwkJaWYgKHRpcC0+aV9kLmRpX25leHRlbnRzIDw9IFhGU19JTkxJTkVfRVhUUykgeworCQkJdGlmcC0+aWZfdTEuaWZfZXh0ZW50cyA9CisJCQkJdGlmcC0+aWZfdTIuaWZfaW5saW5lX2V4dDsKKwkJfQorCQl0aWxmX2ZpZWxkcyB8PSBYRlNfSUxPR19ERVhUOworCQlicmVhazsKKwljYXNlIFhGU19ESU5PREVfRk1UX0JUUkVFOgorCQl0aWxmX2ZpZWxkcyB8PSBYRlNfSUxPR19EQlJPT1Q7CisJCWJyZWFrOworCX0KKworCS8qCisJICogSW5jcmVtZW50IHZub2RlIHJlZiBjb3VudHMgc2luY2UgeGZzX3RyYW5zX2NvbW1pdCAmCisJICogeGZzX3RyYW5zX2NhbmNlbCB3aWxsIGJvdGggdW5sb2NrIHRoZSBpbm9kZXMgYW5kCisJICogZGVjcmVtZW50IHRoZSBhc3NvY2lhdGVkIHJlZiBjb3VudHMuCisJICovCisJVk5fSE9MRCh2cCk7CisJVk5fSE9MRCh0dnApOworCisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgbG9ja19mbGFncyk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCB0aXAsIGxvY2tfZmxhZ3MpOworCisJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsICBpbGZfZmllbGRzKTsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCB0aXAsIHRpbGZfZmllbGRzKTsKKworCS8qCisJICogSWYgdGhpcyBpcyBhIHN5bmNocm9ub3VzIG1vdW50LCBtYWtlIHN1cmUgdGhhdCB0aGUKKwkgKiB0cmFuc2FjdGlvbiBnb2VzIHRvIGRpc2sgYmVmb3JlIHJldHVybmluZyB0byB0aGUgdXNlci4KKwkgKi8KKwlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfV1NZTkMpIHsKKwkJeGZzX3RyYW5zX3NldF9zeW5jKHRwKTsKKwl9CisKKwllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19TV0FQRVhULCBOVUxMKTsKKworCWZwdXQoZnApOworCWZwdXQodGZwKTsKKworCXJldHVybiBlcnJvcjsKKworIGVycm9yMDoKKwlpZiAobG9ja2VkKSB7CisJCXhmc19pdW5sb2NrKGlwLCAgbG9ja19mbGFncyk7CisJCXhmc19pdW5sb2NrKHRpcCwgbG9ja19mbGFncyk7CisJfQorCisJaWYgKGZwICE9IE5VTEwpIGZwdXQoZnApOworCWlmICh0ZnAgIT0gTlVMTCkgZnB1dCh0ZnApOworCisJcmV0dXJuIGVycm9yOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kZnJhZy5oIGIvZnMveGZzL3hmc19kZnJhZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNDg2MDUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2RmcmFnLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0RGUkFHX0hfXworI2RlZmluZQlfX1hGU19ERlJBR19IX18KKworLyoKKyAqIFN0cnVjdHVyZSBwYXNzZWQgdG8geGZzX3N3YXBleHQKKyAqLworCit0eXBlZGVmIHN0cnVjdCB4ZnNfc3dhcGV4dAoreworCV9faW50NjRfdAlzeF92ZXJzaW9uOwkvKiB2ZXJzaW9uICovCisJX19pbnQ2NF90CXN4X2ZkdGFyZ2V0OwkvKiBmZCBvZiB0YXJnZXQgZmlsZSAqLworCV9faW50NjRfdAlzeF9mZHRtcDsJLyogZmQgb2YgdG1wIGZpbGUgKi8KKwl4ZnNfb2ZmX3QJc3hfb2Zmc2V0OwkvKiBvZmZzZXQgaW50byBmaWxlICovCisJeGZzX29mZl90CXN4X2xlbmd0aDsJLyogbGVuZyBmcm9tIG9mZnNldCAqLworCWNoYXIJCXN4X3BhZFsxNl07CS8qIHBhZCBzcGFjZSwgdW51c2VkICovCisJeGZzX2JzdGF0X3QJc3hfc3RhdDsJLyogc3RhdCBvZiB0YXJnZXQgYjQgY29weSAqLworfSB4ZnNfc3dhcGV4dF90OworCisvKgorICogVmVyc2lvbiBmbGFnCisgKi8KKyNkZWZpbmUgWEZTX1NYX1ZFUlNJT04JCTAKKworI2lmZGVmIF9fS0VSTkVMX18KKy8qCisgKiBQcm90b3R5cGVzIGZvciB2aXNpYmxlIHhmc19kZnJhZy5jIHJvdXRpbmVzLgorICovCisKKy8qCisgKiBTeXNjYWxsIGludGVyZmFjZSBmb3IgeGZzX3N3YXBleHQKKyAqLworaW50CXhmc19zd2FwZXh0KHN0cnVjdCB4ZnNfc3dhcGV4dCBfX3VzZXIgKnN4KTsKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCS8qIF9fWEZTX0RGUkFHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaW5vZGUuaCBiL2ZzL3hmcy94ZnNfZGlub2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjOTMyYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZGlub2RlLmgKQEAgLTAsMCArMSw0MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19ESU5PREVfSF9fCisjZGVmaW5lCV9fWEZTX0RJTk9ERV9IX18KKworc3RydWN0IHhmc19idWY7CitzdHJ1Y3QgeGZzX21vdW50OworCisjZGVmaW5lCVhGU19ESU5PREVfVkVSU0lPTl8xCTEKKyNkZWZpbmUJWEZTX0RJTk9ERV9WRVJTSU9OXzIJMgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElOT0RFX0dPT0RfVkVSU0lPTikKK2ludCB4ZnNfZGlub2RlX2dvb2RfdmVyc2lvbihpbnQgdik7CisjZGVmaW5lIFhGU19ESU5PREVfR09PRF9WRVJTSU9OKHYpCXhmc19kaW5vZGVfZ29vZF92ZXJzaW9uKHYpCisjZWxzZQorI2RlZmluZSBYRlNfRElOT0RFX0dPT0RfVkVSU0lPTih2KQkoKCh2KSA9PSBYRlNfRElOT0RFX1ZFUlNJT05fMSkgfHwgXAorCQkJCQkgKCh2KSA9PSBYRlNfRElOT0RFX1ZFUlNJT05fMikpCisjZW5kaWYKKyNkZWZpbmUJWEZTX0RJTk9ERV9NQUdJQwkweDQ5NGUJLyogJ0lOJyAqLworCisvKgorICogRGlzayBpbm9kZSBzdHJ1Y3R1cmUuCisgKiBUaGlzIGlzIGp1c3QgdGhlIGhlYWRlcjsgdGhlIGlub2RlIGlzIGV4cGFuZGVkIHRvIGZpbGwgYSB2YXJpYWJsZSBzaXplCisgKiB3aXRoIHRoZSBsYXN0IGZpZWxkIGV4cGFuZGluZy4gIEl0IGlzIHNwbGl0IGludG8gdGhlIGNvcmUgYW5kICJvdGhlciIKKyAqIGJlY2F1c2Ugd2Ugb25seSBuZWVkIHRoZSBjb3JlIHBhcnQgaW4gdGhlIGluLWNvcmUgaW5vZGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc190aW1lc3RhbXAgeworCV9faW50MzJfdAl0X3NlYzsJCS8qIHRpbWVzdGFtcCBzZWNvbmRzICovCisJX19pbnQzMl90CXRfbnNlYzsJCS8qIHRpbWVzdGFtcCBuYW5vc2Vjb25kcyAqLworfSB4ZnNfdGltZXN0YW1wX3Q7CisKKy8qCisgKiBOb3RlOiBDb29yZGluYXRlIGNoYW5nZXMgdG8gdGhpcyBzdHJ1Y3R1cmUgd2l0aCB0aGUgWEZTX0RJXyogI2RlZmluZXMKKyAqIGJlbG93IGFuZCB0aGUgb2Zmc2V0cyB0YWJsZSBpbiB4ZnNfaWFsbG9jX2xvZ19kaSgpLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlub2RlX2NvcmUKK3sKKwlfX3VpbnQxNl90CWRpX21hZ2ljOwkvKiBpbm9kZSBtYWdpYyAjID0gWEZTX0RJTk9ERV9NQUdJQyAqLworCV9fdWludDE2X3QJZGlfbW9kZTsJLyogbW9kZSBhbmQgdHlwZSBvZiBmaWxlICovCisJX19pbnQ4X3QJZGlfdmVyc2lvbjsJLyogaW5vZGUgdmVyc2lvbiAqLworCV9faW50OF90CWRpX2Zvcm1hdDsJLyogZm9ybWF0IG9mIGRpX2MgZGF0YSAqLworCV9fdWludDE2X3QJZGlfb25saW5rOwkvKiBvbGQgbnVtYmVyIG9mIGxpbmtzIHRvIGZpbGUgKi8KKwlfX3VpbnQzMl90CWRpX3VpZDsJCS8qIG93bmVyJ3MgdXNlciBpZCAqLworCV9fdWludDMyX3QJZGlfZ2lkOwkJLyogb3duZXIncyBncm91cCBpZCAqLworCV9fdWludDMyX3QJZGlfbmxpbms7CS8qIG51bWJlciBvZiBsaW5rcyB0byBmaWxlICovCisJX191aW50MTZfdAlkaV9wcm9qaWQ7CS8qIG93bmVyJ3MgcHJvamVjdCBpZCAqLworCV9fdWludDhfdAlkaV9wYWRbOF07CS8qIHVudXNlZCwgemVyb2VkIHNwYWNlICovCisJX191aW50MTZfdAlkaV9mbHVzaGl0ZXI7CS8qIGluY3JlbWVudGVkIG9uIGZsdXNoICovCisJeGZzX3RpbWVzdGFtcF90CWRpX2F0aW1lOwkvKiB0aW1lIGxhc3QgYWNjZXNzZWQgKi8KKwl4ZnNfdGltZXN0YW1wX3QJZGlfbXRpbWU7CS8qIHRpbWUgbGFzdCBtb2RpZmllZCAqLworCXhmc190aW1lc3RhbXBfdAlkaV9jdGltZTsJLyogdGltZSBjcmVhdGVkL2lub2RlIG1vZGlmaWVkICovCisJeGZzX2ZzaXplX3QJZGlfc2l6ZTsJLyogbnVtYmVyIG9mIGJ5dGVzIGluIGZpbGUgKi8KKwl4ZnNfZHJmc2Jub190CWRpX25ibG9ja3M7CS8qICMgb2YgZGlyZWN0ICYgYnRyZWUgYmxvY2tzIHVzZWQgKi8KKwl4ZnNfZXh0bGVuX3QJZGlfZXh0c2l6ZTsJLyogYmFzaWMvbWluaW11bSBleHRlbnQgc2l6ZSBmb3IgZmlsZSAqLworCXhmc19leHRudW1fdAlkaV9uZXh0ZW50czsJLyogbnVtYmVyIG9mIGV4dGVudHMgaW4gZGF0YSBmb3JrICovCisJeGZzX2FleHRudW1fdAlkaV9hbmV4dGVudHM7CS8qIG51bWJlciBvZiBleHRlbnRzIGluIGF0dHJpYnV0ZSBmb3JrKi8KKwlfX3VpbnQ4X3QJZGlfZm9ya29mZjsJLyogYXR0ciBmb3JrIG9mZnMsIDw8MyBmb3IgNjRiIGFsaWduICovCisJX19pbnQ4X3QJZGlfYWZvcm1hdDsJLyogZm9ybWF0IG9mIGF0dHIgZm9yaydzIGRhdGEgKi8KKwlfX3VpbnQzMl90CWRpX2RtZXZtYXNrOwkvKiBETUlHIGV2ZW50IG1hc2sgKi8KKwlfX3VpbnQxNl90CWRpX2Rtc3RhdGU7CS8qIERNSUcgc3RhdGUgaW5mbyAqLworCV9fdWludDE2X3QJZGlfZmxhZ3M7CS8qIHJhbmRvbSBmbGFncywgWEZTX0RJRkxBR18uLi4gKi8KKwlfX3VpbnQzMl90CWRpX2dlbjsJCS8qIGdlbmVyYXRpb24gbnVtYmVyICovCit9IHhmc19kaW5vZGVfY29yZV90OworCisjZGVmaW5lIERJX01BWF9GTFVTSCAweGZmZmYKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Rpbm9kZQoreworCXhmc19kaW5vZGVfY29yZV90CWRpX2NvcmU7CisJLyoKKwkgKiBJbiBhZGRpbmcgYW55dGhpbmcgYmV0d2VlbiB0aGUgY29yZSBhbmQgdGhlIHVuaW9uLCBiZQorCSAqIHN1cmUgdG8gdXBkYXRlIHRoZSBtYWNyb3MgbGlrZSBYRlNfTElUSU5PIGJlbG93IGFuZAorCSAqIFhGU19CTUFQX1JCTE9DS19EU0laRSBpbiB4ZnNfYm1hcF9idHJlZS5oLgorCSAqLworCXhmc19hZ2lub190CQlkaV9uZXh0X3VubGlua2VkOy8qIGFnaSB1bmxpbmtlZCBsaXN0IHB0ciAqLworCXVuaW9uIHsKKwkJeGZzX2JtZHJfYmxvY2tfdCBkaV9ibWJ0OwkvKiBidHJlZSByb290IGJsb2NrICovCisJCXhmc19ibWJ0X3JlY18zMl90IGRpX2JteFsxXTsJLyogZXh0ZW50IGxpc3QgKi8KKwkJeGZzX2Rpcl9zaG9ydGZvcm1fdCBkaV9kaXJzZjsJLyogc2hvcnRmb3JtIGRpcmVjdG9yeSAqLworCQl4ZnNfZGlyMl9zZl90CWRpX2RpcjJzZjsJLyogc2hvcnRmb3JtIGRpcmVjdG9yeSB2MiAqLworCQljaGFyCQlkaV9jWzFdOwkvKiBsb2NhbCBjb250ZW50cyAqLworCQl4ZnNfZGV2X3QJZGlfZGV2OwkJLyogZGV2aWNlIGZvciBTX0lGQ0hSL1NfSUZCTEsgKi8KKwkJdXVpZF90CQlkaV9tdXVpZDsJLyogbW91bnQgcG9pbnQgdmFsdWUgKi8KKwkJY2hhcgkJZGlfc3ltbGlua1sxXTsJLyogbG9jYWwgc3ltYm9saWMgbGluayAqLworCX0JCWRpX3U7CisJdW5pb24geworCQl4ZnNfYm1kcl9ibG9ja190IGRpX2FibWJ0OwkvKiBidHJlZSByb290IGJsb2NrICovCisJCXhmc19ibWJ0X3JlY18zMl90IGRpX2FibXhbMV07CS8qIGV4dGVudCBsaXN0ICovCisJCXhmc19hdHRyX3Nob3J0Zm9ybV90IGRpX2F0dHJzZjsJLyogc2hvcnRmb3JtIGF0dHJpYnV0ZSBsaXN0ICovCisJfQkJZGlfYTsKK30geGZzX2Rpbm9kZV90OworCisvKgorICogVGhlIDMyIGJpdCBsaW5rIGNvdW50IGluIHRoZSBpbm9kZSB0aGVvcmV0aWNhbGx5IG1heGVzIG91dCBhdCBVSU5UX01BWC4KKyAqIFNpbmNlIHRoZSBwYXRoY29uZiBpbnRlcmZhY2UgaXMgc2lnbmVkLCB3ZSB1c2UgMl4zMSAtIDEgaW5zdGVhZC4KKyAqIFRoZSBvbGQgaW5vZGUgZm9ybWF0IGhhZCBhIDE2IGJpdCBsaW5rIGNvdW50LCBzbyBpdHMgbWF4aW11bSBpcyBVU0hSVF9NQVguCisgKi8KKyNkZWZpbmUJWEZTX01BWExJTksJCSgoMVUgPDwgMzEpIC0gMVUpCisjZGVmaW5lCVhGU19NQVhMSU5LXzEJCTY1NTM1VQorCisvKgorICogQml0IG5hbWVzIGZvciBsb2dnaW5nIGRpc2sgaW5vZGVzIG9ubHkKKyAqLworI2RlZmluZQlYRlNfRElfTUFHSUMJCTB4MDAwMDAwMQorI2RlZmluZQlYRlNfRElfTU9ERQkJMHgwMDAwMDAyCisjZGVmaW5lCVhGU19ESV9WRVJTSU9OCQkweDAwMDAwMDQKKyNkZWZpbmUJWEZTX0RJX0ZPUk1BVAkJMHgwMDAwMDA4CisjZGVmaW5lCVhGU19ESV9PTkxJTksJCTB4MDAwMDAxMAorI2RlZmluZQlYRlNfRElfVUlECQkweDAwMDAwMjAKKyNkZWZpbmUJWEZTX0RJX0dJRAkJMHgwMDAwMDQwCisjZGVmaW5lCVhGU19ESV9OTElOSwkJMHgwMDAwMDgwCisjZGVmaW5lCVhGU19ESV9QUk9KSUQJCTB4MDAwMDEwMAorI2RlZmluZQlYRlNfRElfUEFECQkweDAwMDAyMDAKKyNkZWZpbmUJWEZTX0RJX0FUSU1FCQkweDAwMDA0MDAKKyNkZWZpbmUJWEZTX0RJX01USU1FCQkweDAwMDA4MDAKKyNkZWZpbmUJWEZTX0RJX0NUSU1FCQkweDAwMDEwMDAKKyNkZWZpbmUJWEZTX0RJX1NJWkUJCTB4MDAwMjAwMAorI2RlZmluZQlYRlNfRElfTkJMT0NLUwkJMHgwMDA0MDAwCisjZGVmaW5lCVhGU19ESV9FWFRTSVpFCQkweDAwMDgwMDAKKyNkZWZpbmUJWEZTX0RJX05FWFRFTlRTCQkweDAwMTAwMDAKKyNkZWZpbmUJWEZTX0RJX05BRVhURU5UUwkweDAwMjAwMDAKKyNkZWZpbmUJWEZTX0RJX0ZPUktPRkYJCTB4MDA0MDAwMAorI2RlZmluZQlYRlNfRElfQUZPUk1BVAkJMHgwMDgwMDAwCisjZGVmaW5lCVhGU19ESV9ETUVWTUFTSwkJMHgwMTAwMDAwCisjZGVmaW5lCVhGU19ESV9ETVNUQVRFCQkweDAyMDAwMDAKKyNkZWZpbmUJWEZTX0RJX0ZMQUdTCQkweDA0MDAwMDAKKyNkZWZpbmUJWEZTX0RJX0dFTgkJMHgwODAwMDAwCisjZGVmaW5lCVhGU19ESV9ORVhUX1VOTElOS0VECTB4MTAwMDAwMAorI2RlZmluZQlYRlNfRElfVQkJMHgyMDAwMDAwCisjZGVmaW5lCVhGU19ESV9BCQkweDQwMDAwMDAKKyNkZWZpbmUJWEZTX0RJX05VTV9CSVRTCQkyNworI2RlZmluZQlYRlNfRElfQUxMX0JJVFMJCSgoMSA8PCBYRlNfRElfTlVNX0JJVFMpIC0gMSkKKyNkZWZpbmUJWEZTX0RJX0NPUkVfQklUUwkoWEZTX0RJX0FMTF9CSVRTICYgfihYRlNfRElfVXxYRlNfRElfQSkpCisKKy8qCisgKiBWYWx1ZXMgZm9yIGRpX2Zvcm1hdAorICovCit0eXBlZGVmIGVudW0geGZzX2Rpbm9kZV9mbXQKK3sKKwlYRlNfRElOT0RFX0ZNVF9ERVYsCQkvKiBDSFIsIEJMSzogZGlfZGV2ICovCisJWEZTX0RJTk9ERV9GTVRfTE9DQUwsCQkvKiBESVIsIFJFRzogZGlfYyAqLworCQkJCQkvKiBMTks6IGRpX3N5bWxpbmsgKi8KKwlYRlNfRElOT0RFX0ZNVF9FWFRFTlRTLAkJLyogRElSLCBSRUcsIExOSzogZGlfYm14ICovCisJWEZTX0RJTk9ERV9GTVRfQlRSRUUsCQkvKiBESVIsIFJFRywgTE5LOiBkaV9ibWJ0ICovCisJWEZTX0RJTk9ERV9GTVRfVVVJRAkJLyogTU5UOiBkaV91dWlkICovCit9IHhmc19kaW5vZGVfZm10X3Q7CisKKy8qCisgKiBJbm9kZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHNpemVzLgorICovCisjZGVmaW5lCVhGU19ESU5PREVfTUlOX0xPRwk4CisjZGVmaW5lCVhGU19ESU5PREVfTUFYX0xPRwkxMQorI2RlZmluZQlYRlNfRElOT0RFX01JTl9TSVpFCSgxIDw8IFhGU19ESU5PREVfTUlOX0xPRykKKyNkZWZpbmUJWEZTX0RJTk9ERV9NQVhfU0laRQkoMSA8PCBYRlNfRElOT0RFX01BWF9MT0cpCisKKy8qCisgKiBJbm9kZSBzaXplIGZvciBnaXZlbiBmcy4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTElUSU5PKQoraW50IHhmc19saXRpbm8oc3RydWN0IHhmc19tb3VudCAqbXApOworI2RlZmluZQlYRlNfTElUSU5PKG1wKQkJeGZzX2xpdGlubyhtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19MSVRJTk8obXApCSgobXApLT5tX2xpdGlubykKKyNlbmRpZgorI2RlZmluZQlYRlNfQlJPT1RfU0laRV9BREoJXAorCShzaXplb2YoeGZzX2JtYnRfYmxvY2tfdCkgLSBzaXplb2YoeGZzX2JtZHJfYmxvY2tfdCkpCisKKy8qCisgKiBGb3JrIGlkZW50aWZpZXJzLiAgSGVyZSBzbyB1dGlsaXRpZXMgY2FuIHVzZSB0aGVtIHdpdGhvdXQgaW5jbHVkaW5nCisgKiB4ZnNfaW5vZGUuaC4KKyAqLworI2RlZmluZQlYRlNfREFUQV9GT1JLCTAKKyNkZWZpbmUJWEZTX0FUVFJfRk9SSwkxCisKKy8qCisgKiBJbm9kZSBkYXRhICYgYXR0cmlidXRlIGZvcmsgc2l6ZXMsIHBlciBpbm9kZS4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQ0ZPUktfUSkKK2ludCB4ZnNfY2ZvcmtfcV9kaXNrKHhmc19kaW5vZGVfY29yZV90ICpkY3ApOworaW50IHhmc19jZm9ya19xKHhmc19kaW5vZGVfY29yZV90ICpkY3ApOworI2RlZmluZQlYRlNfQ0ZPUktfUV9ESVNLKGRjcCkgICAgICAgICAgICAgICB4ZnNfY2ZvcmtfcV9kaXNrKGRjcCkKKyNkZWZpbmUJWEZTX0NGT1JLX1EoZGNwKSAgICAgICAgICAgICAgICAgICAgeGZzX2Nmb3JrX3EoZGNwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0NGT1JLX1FfRElTSyhkY3ApCQkgICAgKChkY3ApLT5kaV9mb3Jrb2ZmICE9IDApCisjZGVmaW5lIFhGU19DRk9SS19RKGRjcCkgICAgICAgICAgICAgICAgICAgICgoZGNwKS0+ZGlfZm9ya29mZiAhPSAwKQorCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0NGT1JLX0JPRkYpCitpbnQgeGZzX2Nmb3JrX2JvZmZfZGlzayh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwKTsKK2ludCB4ZnNfY2ZvcmtfYm9mZih4ZnNfZGlub2RlX2NvcmVfdCAqZGNwKTsKKyNkZWZpbmUJWEZTX0NGT1JLX0JPRkZfRElTSyhkY3ApCSAgICB4ZnNfY2ZvcmtfYm9mZl9kaXNrKGRjcCkKKyNkZWZpbmUJWEZTX0NGT1JLX0JPRkYoZGNwKQkgICAgICAgICAgICB4ZnNfY2ZvcmtfYm9mZihkY3ApCisjZWxzZQorI2RlZmluZQlYRlNfQ0ZPUktfQk9GRl9ESVNLKGRjcCkJICAgICgoaW50KShJTlRfR0VUKChkY3ApLT5kaV9mb3Jrb2ZmLCBBUkNIX0NPTlZFUlQpIDw8IDMpKQorI2RlZmluZSBYRlNfQ0ZPUktfQk9GRihkY3ApICAgICAgICAgICAgICAgICAoKGludCkoKGRjcCktPmRpX2ZvcmtvZmYgPDwgMykpCisKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQ0ZPUktfRFNJWkUpCitpbnQgeGZzX2Nmb3JrX2RzaXplX2Rpc2soeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgc3RydWN0IHhmc19tb3VudCAqbXApOworaW50IHhmc19jZm9ya19kc2l6ZSh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwLCBzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19DRk9SS19EU0laRV9ESVNLKGRjcCxtcCkgICAgICAgIHhmc19jZm9ya19kc2l6ZV9kaXNrKGRjcCxtcCkKKyNkZWZpbmUJWEZTX0NGT1JLX0RTSVpFKGRjcCxtcCkgICAgICAgICAgICAgeGZzX2Nmb3JrX2RzaXplKGRjcCxtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19DRk9SS19EU0laRV9ESVNLKGRjcCxtcCkgXAorCShYRlNfQ0ZPUktfUV9ESVNLKGRjcCkgPyBYRlNfQ0ZPUktfQk9GRl9ESVNLKGRjcCkgOiBYRlNfTElUSU5PKG1wKSkKKyNkZWZpbmUgWEZTX0NGT1JLX0RTSVpFKGRjcCxtcCkgXAorCShYRlNfQ0ZPUktfUShkY3ApID8gWEZTX0NGT1JLX0JPRkYoZGNwKSA6IFhGU19MSVRJTk8obXApKQorCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0NGT1JLX0FTSVpFKQoraW50IHhmc19jZm9ya19hc2l6ZV9kaXNrKHhmc19kaW5vZGVfY29yZV90ICpkY3AsIHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKK2ludCB4ZnNfY2ZvcmtfYXNpemUoeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgc3RydWN0IHhmc19tb3VudCAqbXApOworI2RlZmluZQlYRlNfQ0ZPUktfQVNJWkVfRElTSyhkY3AsbXApICAgICAgICB4ZnNfY2ZvcmtfYXNpemVfZGlzayhkY3AsbXApCisjZGVmaW5lCVhGU19DRk9SS19BU0laRShkY3AsbXApICAgICAgICAgICAgIHhmc19jZm9ya19hc2l6ZShkY3AsbXApCisjZWxzZQorI2RlZmluZQlYRlNfQ0ZPUktfQVNJWkVfRElTSyhkY3AsbXApIFwKKwkoWEZTX0NGT1JLX1FfRElTSyhkY3ApID8gWEZTX0xJVElOTyhtcCkgLSBYRlNfQ0ZPUktfQk9GRl9ESVNLKGRjcCkgOiAwKQorI2RlZmluZSBYRlNfQ0ZPUktfQVNJWkUoZGNwLG1wKSBcCisJKFhGU19DRk9SS19RKGRjcCkgPyBYRlNfTElUSU5PKG1wKSAtIFhGU19DRk9SS19CT0ZGKGRjcCkgOiAwKQorCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0NGT1JLX1NJWkUpCitpbnQgeGZzX2Nmb3JrX3NpemVfZGlzayh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwLCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgaW50IHcpOworaW50IHhmc19jZm9ya19zaXplKHhmc19kaW5vZGVfY29yZV90ICpkY3AsIHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBpbnQgdyk7CisjZGVmaW5lCVhGU19DRk9SS19TSVpFX0RJU0soZGNwLG1wLHcpICAgICAgIHhmc19jZm9ya19zaXplX2Rpc2soZGNwLG1wLHcpCisjZGVmaW5lCVhGU19DRk9SS19TSVpFKGRjcCxtcCx3KSAgICAgICAgICAgIHhmc19jZm9ya19zaXplKGRjcCxtcCx3KQorI2Vsc2UKKyNkZWZpbmUJWEZTX0NGT1JLX1NJWkVfRElTSyhkY3AsbXAsdykgXAorCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFwKKwkJWEZTX0NGT1JLX0RTSVpFX0RJU0soZGNwLCBtcCkgOiBcCisJIAlYRlNfQ0ZPUktfQVNJWkVfRElTSyhkY3AsIG1wKSkKKyNkZWZpbmUgWEZTX0NGT1JLX1NJWkUoZGNwLG1wLHcpIFwKKwkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBcCisJCVhGU19DRk9SS19EU0laRShkY3AsIG1wKSA6IFhGU19DRk9SS19BU0laRShkY3AsIG1wKSkKKworI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RGT1JLX0RTSVpFKQoraW50IHhmc19kZm9ya19kc2l6ZSh4ZnNfZGlub2RlX3QgKmRpcCwgc3RydWN0IHhmc19tb3VudCAqbXApOworI2RlZmluZQlYRlNfREZPUktfRFNJWkUoZGlwLG1wKSAgICAgICAgICAgICB4ZnNfZGZvcmtfZHNpemUoZGlwLG1wKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0RGT1JLX0RTSVpFKGRpcCxtcCkgICAgICAgICAgICAgWEZTX0NGT1JLX0RTSVpFX0RJU0soJihkaXApLT5kaV9jb3JlLCBtcCkKKworI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ERk9SS19BU0laRSkKK2ludCB4ZnNfZGZvcmtfYXNpemUoeGZzX2Rpbm9kZV90ICpkaXAsIHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX0RGT1JLX0FTSVpFKGRpcCxtcCkgICAgICAgICAgICAgeGZzX2Rmb3JrX2FzaXplKGRpcCxtcCkKKyNlbHNlCisjZGVmaW5lIFhGU19ERk9SS19BU0laRShkaXAsbXApICAgICAgICAgICAgIFhGU19DRk9SS19BU0laRV9ESVNLKCYoZGlwKS0+ZGlfY29yZSwgbXApCisKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfREZPUktfU0laRSkKK2ludCB4ZnNfZGZvcmtfc2l6ZSh4ZnNfZGlub2RlX3QgKmRpcCwgc3RydWN0IHhmc19tb3VudCAqbXAsIGludCB3KTsKKyNkZWZpbmUJWEZTX0RGT1JLX1NJWkUoZGlwLG1wLHcpICAgICAgICAgICAgeGZzX2Rmb3JrX3NpemUoZGlwLG1wLHcpCisjZWxzZQorI2RlZmluZQlYRlNfREZPUktfU0laRShkaXAsbXAsdykJICAgIFhGU19DRk9SS19TSVpFX0RJU0soJihkaXApLT5kaV9jb3JlLCBtcCwgdykKKworI2VuZGlmCisKKy8qCisgKiBNYWNyb3MgZm9yIGFjY2Vzc2luZyBwZXItZm9yayBkaXNrIGlub2RlIGluZm9ybWF0aW9uLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ERk9SS19RKQoraW50IHhmc19kZm9ya19xKHhmc19kaW5vZGVfdCAqZGlwKTsKKyNkZWZpbmUJWEZTX0RGT1JLX1EoZGlwKQkgICAgICAgICAgICB4ZnNfZGZvcmtfcShkaXApCisjZWxzZQorI2RlZmluZQlYRlNfREZPUktfUShkaXApICAgICAgICAgICAgICAgICAgICBYRlNfQ0ZPUktfUV9ESVNLKCYoZGlwKS0+ZGlfY29yZSkKKworI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ERk9SS19CT0ZGKQoraW50IHhmc19kZm9ya19ib2ZmKHhmc19kaW5vZGVfdCAqZGlwKTsKKyNkZWZpbmUJWEZTX0RGT1JLX0JPRkYoZGlwKQkJICAgIHhmc19kZm9ya19ib2ZmKGRpcCkKKyNlbHNlCisjZGVmaW5lCVhGU19ERk9SS19CT0ZGKGRpcCkJCSAgICBYRlNfQ0ZPUktfQk9GRl9ESVNLKCYoZGlwKS0+ZGlfY29yZSkKKworI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ERk9SS19EUFRSKQorY2hhciAqeGZzX2Rmb3JrX2RwdHIoeGZzX2Rpbm9kZV90ICpkaXApOworI2RlZmluZQlYRlNfREZPUktfRFBUUihkaXApCSAgICAgICAgICAgIHhmc19kZm9ya19kcHRyKGRpcCkKKyNlbHNlCisjZGVmaW5lCVhGU19ERk9SS19EUFRSKGRpcCkJCSAgICAoKGRpcCktPmRpX3UuZGlfYykKKworI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ERk9SS19BUFRSKQorY2hhciAqeGZzX2Rmb3JrX2FwdHIoeGZzX2Rpbm9kZV90ICpkaXApOworI2RlZmluZQlYRlNfREZPUktfQVBUUihkaXApICAgICAgICAgICAgICAgICB4ZnNfZGZvcmtfYXB0cihkaXApCisjZWxzZQorI2RlZmluZQlYRlNfREZPUktfQVBUUihkaXApCQkgICAgKChkaXApLT5kaV91LmRpX2MgKyBYRlNfREZPUktfQk9GRihkaXApKQorCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RGT1JLX1BUUikKK2NoYXIgKnhmc19kZm9ya19wdHIoeGZzX2Rpbm9kZV90ICpkaXAsIGludCB3KTsKKyNkZWZpbmUJWEZTX0RGT1JLX1BUUihkaXAsdykgICAgICAgICAgICAgICAgeGZzX2Rmb3JrX3B0cihkaXAsdykKKyNlbHNlCisjZGVmaW5lCVhGU19ERk9SS19QVFIoZGlwLHcpCVwKKwkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBYRlNfREZPUktfRFBUUihkaXApIDogWEZTX0RGT1JLX0FQVFIoZGlwKSkKKworI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19DRk9SS19GT1JNQVQpCitpbnQgeGZzX2Nmb3JrX2Zvcm1hdCh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwLCBpbnQgdyk7CisjZGVmaW5lCVhGU19DRk9SS19GT1JNQVQoZGNwLHcpICAgICAgICAgICAgIHhmc19jZm9ya19mb3JtYXQoZGNwLHcpCisjZWxzZQorI2RlZmluZQlYRlNfQ0ZPUktfRk9STUFUKGRjcCx3KSBcCisJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gKGRjcCktPmRpX2Zvcm1hdCA6IChkY3ApLT5kaV9hZm9ybWF0KQorCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0NGT1JLX0ZNVF9TRVQpCit2b2lkIHhmc19jZm9ya19mbXRfc2V0KHhmc19kaW5vZGVfY29yZV90ICpkY3AsIGludCB3LCBpbnQgbik7CisjZGVmaW5lCVhGU19DRk9SS19GTVRfU0VUKGRjcCx3LG4pICAgICAgICAgICB4ZnNfY2ZvcmtfZm10X3NldChkY3AsdyxuKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0NGT1JLX0ZNVF9TRVQoZGNwLHcsbikgXAorCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFwKKwkJKChkY3ApLT5kaV9mb3JtYXQgPSAobikpIDogXAorCQkoKGRjcCktPmRpX2Fmb3JtYXQgPSAobikpKQorCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0NGT1JLX05FWFRFTlRTKQoraW50IHhmc19jZm9ya19uZXh0ZW50c19kaXNrKHhmc19kaW5vZGVfY29yZV90ICpkY3AsIGludCB3KTsKK2ludCB4ZnNfY2ZvcmtfbmV4dGVudHMoeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgaW50IHcpOworI2RlZmluZQlYRlNfQ0ZPUktfTkVYVEVOVFNfRElTSyhkY3AsdykgICAgICAgeGZzX2Nmb3JrX25leHRlbnRzX2Rpc2soZGNwLHcpCisjZGVmaW5lCVhGU19DRk9SS19ORVhURU5UUyhkY3AsdykgICAgICAgICAgICB4ZnNfY2ZvcmtfbmV4dGVudHMoZGNwLHcpCisjZWxzZQorI2RlZmluZQlYRlNfQ0ZPUktfTkVYVEVOVFNfRElTSyhkY3AsdykgXAorCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFwKKwkgCUlOVF9HRVQoKGRjcCktPmRpX25leHRlbnRzLCBBUkNIX0NPTlZFUlQpIDogXAorCSAJSU5UX0dFVCgoZGNwKS0+ZGlfYW5leHRlbnRzLCBBUkNIX0NPTlZFUlQpKQorI2RlZmluZSBYRlNfQ0ZPUktfTkVYVEVOVFMoZGNwLHcpIFwKKwkoKHcpID09IFhGU19EQVRBX0ZPUksgPyAoZGNwKS0+ZGlfbmV4dGVudHMgOiAoZGNwKS0+ZGlfYW5leHRlbnRzKQorCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0NGT1JLX05FWFRfU0VUKQordm9pZCB4ZnNfY2ZvcmtfbmV4dF9zZXQoeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgaW50IHcsIGludCBuKTsKKyNkZWZpbmUJWEZTX0NGT1JLX05FWFRfU0VUKGRjcCx3LG4pCSAgICAgICAgeGZzX2Nmb3JrX25leHRfc2V0KGRjcCx3LG4pCisjZWxzZQorI2RlZmluZQlYRlNfQ0ZPUktfTkVYVF9TRVQoZGNwLHcsbikgXAorCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFwKKwkJKChkY3ApLT5kaV9uZXh0ZW50cyA9IChuKSkgOiBcCisJCSgoZGNwKS0+ZGlfYW5leHRlbnRzID0gKG4pKSkKKworI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RGT1JLX05FWFRFTlRTKQoraW50IHhmc19kZm9ya19uZXh0ZW50cyh4ZnNfZGlub2RlX3QgKmRpcCwgaW50IHcpOworI2RlZmluZQlYRlNfREZPUktfTkVYVEVOVFMoZGlwLHcpIHhmc19kZm9ya19uZXh0ZW50cyhkaXAsdykKKyNlbHNlCisjZGVmaW5lCVhGU19ERk9SS19ORVhURU5UUyhkaXAsdykgWEZTX0NGT1JLX05FWFRFTlRTX0RJU0soJihkaXApLT5kaV9jb3JlLCB3KQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JVRl9UT19ESU5PREUpCit4ZnNfZGlub2RlX3QgKnhmc19idWZfdG9fZGlub2RlKHN0cnVjdCB4ZnNfYnVmICpicCk7CisjZGVmaW5lCVhGU19CVUZfVE9fRElOT0RFKGJwKQl4ZnNfYnVmX3RvX2Rpbm9kZShicCkKKyNlbHNlCisjZGVmaW5lCVhGU19CVUZfVE9fRElOT0RFKGJwKQkoKHhmc19kaW5vZGVfdCAqKShYRlNfQlVGX1BUUihicCkpKQorI2VuZGlmCisKKy8qCisgKiBWYWx1ZXMgZm9yIGRpX2ZsYWdzCisgKiBUaGVyZSBzaG91bGQgYmUgYSBvbmUtdG8tb25lIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gdGhlc2UgZmxhZ3MgYW5kIHRoZQorICogWEZTX1hGTEFHX3MuCisgKi8KKyNkZWZpbmUgWEZTX0RJRkxBR19SRUFMVElNRV9CSVQgIDAJLyogZmlsZSdzIGJsb2NrcyBjb21lIGZyb20gcnQgYXJlYSAqLworI2RlZmluZSBYRlNfRElGTEFHX1BSRUFMTE9DX0JJVCAgMQkvKiBmaWxlIHNwYWNlIGhhcyBiZWVuIHByZWFsbG9jYXRlZCAqLworI2RlZmluZSBYRlNfRElGTEFHX05FV1JUQk1fQklUICAgMgkvKiBmb3IgcnRiaXRtYXAgaW5vZGUsIG5ldyBmb3JtYXQgKi8KKyNkZWZpbmUgWEZTX0RJRkxBR19JTU1VVEFCTEVfQklUIDMJLyogaW5vZGUgaXMgaW1tdXRhYmxlICovCisjZGVmaW5lIFhGU19ESUZMQUdfQVBQRU5EX0JJVCAgICA0CS8qIGlub2RlIGlzIGFwcGVuZC1vbmx5ICovCisjZGVmaW5lIFhGU19ESUZMQUdfU1lOQ19CSVQgICAgICA1CS8qIGlub2RlIGlzIHdyaXR0ZW4gc3luY2hyb25vdXNseSAqLworI2RlZmluZSBYRlNfRElGTEFHX05PQVRJTUVfQklUICAgNgkvKiBkbyBub3QgdXBkYXRlIGF0aW1lICovCisjZGVmaW5lIFhGU19ESUZMQUdfTk9EVU1QX0JJVCAgICA3CS8qIGRvIG5vdCBkdW1wICovCisjZGVmaW5lIFhGU19ESUZMQUdfUlRJTkhFUklUX0JJVCA4CS8qIGNyZWF0ZSB3aXRoIHJlYWx0aW1lIGJpdCBzZXQgKi8KKyNkZWZpbmUgWEZTX0RJRkxBR19QUk9KSU5IRVJJVF9CSVQgIDkJLyogY3JlYXRlIHdpdGggcGFyZW50cyBwcm9qaWQgKi8KKyNkZWZpbmUgWEZTX0RJRkxBR19OT1NZTUxJTktTX0JJVCAgMTAJLyogZGlzYWxsb3cgc3ltbGluayBjcmVhdGlvbiAqLworI2RlZmluZSBYRlNfRElGTEFHX1JFQUxUSU1FICAgICAgKDEgPDwgWEZTX0RJRkxBR19SRUFMVElNRV9CSVQpCisjZGVmaW5lIFhGU19ESUZMQUdfUFJFQUxMT0MgICAgICAoMSA8PCBYRlNfRElGTEFHX1BSRUFMTE9DX0JJVCkKKyNkZWZpbmUgWEZTX0RJRkxBR19ORVdSVEJNICAgICAgICgxIDw8IFhGU19ESUZMQUdfTkVXUlRCTV9CSVQpCisjZGVmaW5lIFhGU19ESUZMQUdfSU1NVVRBQkxFICAgICAoMSA8PCBYRlNfRElGTEFHX0lNTVVUQUJMRV9CSVQpCisjZGVmaW5lIFhGU19ESUZMQUdfQVBQRU5EICAgICAgICAoMSA8PCBYRlNfRElGTEFHX0FQUEVORF9CSVQpCisjZGVmaW5lIFhGU19ESUZMQUdfU1lOQyAgICAgICAgICAoMSA8PCBYRlNfRElGTEFHX1NZTkNfQklUKQorI2RlZmluZSBYRlNfRElGTEFHX05PQVRJTUUgICAgICAgKDEgPDwgWEZTX0RJRkxBR19OT0FUSU1FX0JJVCkKKyNkZWZpbmUgWEZTX0RJRkxBR19OT0RVTVAgICAgICAgICgxIDw8IFhGU19ESUZMQUdfTk9EVU1QX0JJVCkKKyNkZWZpbmUgWEZTX0RJRkxBR19SVElOSEVSSVQgICAgICgxIDw8IFhGU19ESUZMQUdfUlRJTkhFUklUX0JJVCkKKyNkZWZpbmUgWEZTX0RJRkxBR19QUk9KSU5IRVJJVCAgICgxIDw8IFhGU19ESUZMQUdfUFJPSklOSEVSSVRfQklUKQorI2RlZmluZSBYRlNfRElGTEFHX05PU1lNTElOS1MgICAgKDEgPDwgWEZTX0RJRkxBR19OT1NZTUxJTktTX0JJVCkKKworI2RlZmluZSBYRlNfRElGTEFHX0FOWSBcCisJKFhGU19ESUZMQUdfUkVBTFRJTUUgfCBYRlNfRElGTEFHX1BSRUFMTE9DIHwgWEZTX0RJRkxBR19ORVdSVEJNIHwgXAorCSBYRlNfRElGTEFHX0lNTVVUQUJMRSB8IFhGU19ESUZMQUdfQVBQRU5EIHwgWEZTX0RJRkxBR19TWU5DIHwgXAorCSBYRlNfRElGTEFHX05PQVRJTUUgfCBYRlNfRElGTEFHX05PRFVNUCB8IFhGU19ESUZMQUdfUlRJTkhFUklUIHwgXAorCSBYRlNfRElGTEFHX1BST0pJTkhFUklUIHwgWEZTX0RJRkxBR19OT1NZTUxJTktTKQorCisjZW5kaWYJLyogX19YRlNfRElOT0RFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIuYyBiL2ZzL3hmcy94ZnNfZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzMGJjNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZGlyLmMKQEAgLTAsMCArMSwxMjIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX2xlYWYuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKworLyoKKyAqIHhmc19kaXIuYworICoKKyAqIFByb3ZpZGUgdGhlIGV4dGVybmFsIGludGVyZmFjZXMgdG8gbWFuYWdlIGRpcmVjdG9yaWVzLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZvciB0aGUga2VybmVsLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogRnVuY3Rpb25zIGZvciB0aGUgZGlyb3BzIGludGVyZmFjZXMuCisgKi8KK3N0YXRpYyB2b2lkCXhmc19kaXJfbW91bnQoc3RydWN0IHhmc19tb3VudCAqbXApOworCitzdGF0aWMgaW50CXhmc19kaXJfaXNlbXB0eShzdHJ1Y3QgeGZzX2lub2RlICpkcCk7CisKK3N0YXRpYyBpbnQJeGZzX2Rpcl9pbml0KHN0cnVjdCB4ZnNfdHJhbnMgKnRyYW5zLAorCQkJICAgICBzdHJ1Y3QgeGZzX2lub2RlICpkaXIsCisJCQkgICAgIHN0cnVjdCB4ZnNfaW5vZGUgKnBhcmVudF9kaXIpOworCitzdGF0aWMgaW50CXhmc19kaXJfY3JlYXRlbmFtZShzdHJ1Y3QgeGZzX3RyYW5zICp0cmFucywKKwkJCQkgICBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKKwkJCQkgICBjaGFyICpuYW1lX3N0cmluZywKKwkJCQkgICBpbnQgbmFtZV9sZW4sCisJCQkJICAgeGZzX2lub190IGlub2RlX251bWJlciwKKwkJCQkgICB4ZnNfZnNibG9ja190ICpmaXJzdGJsb2NrLAorCQkJCSAgIHhmc19ibWFwX2ZyZWVfdCAqZmxpc3QsCisJCQkJICAgeGZzX2V4dGxlbl90IHRvdGFsKTsKKworc3RhdGljIGludAl4ZnNfZGlyX2xvb2t1cChzdHJ1Y3QgeGZzX3RyYW5zICp0cCwKKwkJCSAgICAgICBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKKwkJCSAgICAgICBjaGFyICpuYW1lX3N0cmluZywKKwkJCSAgICAgICBpbnQgbmFtZV9sZW5ndGgsCisJCQkgICAgICAgeGZzX2lub190ICppbm9kZV9udW1iZXIpOworCitzdGF0aWMgaW50CXhmc19kaXJfcmVtb3ZlbmFtZShzdHJ1Y3QgeGZzX3RyYW5zICp0cmFucywKKwkJCQkgICBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKKwkJCQkgICBjaGFyICpuYW1lX3N0cmluZywKKwkJCQkgICBpbnQgbmFtZV9sZW5ndGgsCisJCQkJICAgeGZzX2lub190IGlubywKKwkJCQkgICB4ZnNfZnNibG9ja190ICpmaXJzdGJsb2NrLAorCQkJCSAgIHhmc19ibWFwX2ZyZWVfdCAqZmxpc3QsCisJCQkJICAgeGZzX2V4dGxlbl90IHRvdGFsKTsKKworc3RhdGljIGludAl4ZnNfZGlyX2dldGRlbnRzKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLAorCQkJCSBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKKwkJCQkgc3RydWN0IHVpbyAqdWlvcCwKKwkJCQkgaW50ICplb2ZwKTsKKworc3RhdGljIGludAl4ZnNfZGlyX3JlcGxhY2Uoc3RydWN0IHhmc190cmFucyAqdHAsCisJCQkJc3RydWN0IHhmc19pbm9kZSAqZHAsCisJCQkJY2hhciAqbmFtZV9zdHJpbmcsCisJCQkJaW50IG5hbWVfbGVuZ3RoLAorCQkJCXhmc19pbm9fdCBpbm9kZV9udW1iZXIsCisJCQkJeGZzX2ZzYmxvY2tfdCAqZmlyc3RibG9jaywKKwkJCQl4ZnNfYm1hcF9mcmVlX3QgKmZsaXN0LAorCQkJCXhmc19leHRsZW5fdCB0b3RhbCk7CisKK3N0YXRpYyBpbnQJeGZzX2Rpcl9jYW5lbnRlcihzdHJ1Y3QgeGZzX3RyYW5zICp0cCwKKwkJCQkgc3RydWN0IHhmc19pbm9kZSAqZHAsCisJCQkJIGNoYXIgKm5hbWVfc3RyaW5nLAorCQkJCSBpbnQgbmFtZV9sZW5ndGgpOworCitzdGF0aWMgaW50CXhmc19kaXJfc2hvcnRmb3JtX3ZhbGlkYXRlX29uZGlzayh4ZnNfbW91bnRfdCAqbXAsCisJCQkJCQkgIHhmc19kaW5vZGVfdCAqZGlwKTsKKworeGZzX2Rpcm9wc190IHhmc3YxX2Rpcm9wcyA9IHsKKwkueGRfbW91bnQJCQk9IHhmc19kaXJfbW91bnQsCisJLnhkX2lzZW1wdHkJCQk9IHhmc19kaXJfaXNlbXB0eSwKKwkueGRfaW5pdAkJCT0geGZzX2Rpcl9pbml0LAorCS54ZF9jcmVhdGVuYW1lCQkJPSB4ZnNfZGlyX2NyZWF0ZW5hbWUsCisJLnhkX2xvb2t1cAkJCT0geGZzX2Rpcl9sb29rdXAsCisJLnhkX3JlbW92ZW5hbWUJCQk9IHhmc19kaXJfcmVtb3ZlbmFtZSwKKwkueGRfZ2V0ZGVudHMJCQk9IHhmc19kaXJfZ2V0ZGVudHMsCisJLnhkX3JlcGxhY2UJCQk9IHhmc19kaXJfcmVwbGFjZSwKKwkueGRfY2FuZW50ZXIJCQk9IHhmc19kaXJfY2FuZW50ZXIsCisJLnhkX3Nob3J0Zm9ybV92YWxpZGF0ZV9vbmRpc2sJPSB4ZnNfZGlyX3Nob3J0Zm9ybV92YWxpZGF0ZV9vbmRpc2ssCisJLnhkX3Nob3J0Zm9ybV90b19zaW5nbGUJCT0geGZzX2Rpcl9zaG9ydGZvcm1fdG9fbGVhZiwKK307CisKKy8qCisgKiBJbnRlcm5hbCByb3V0aW5lcyB3aGVuIGRpcnNpemUgPT0gWEZTX0xCU0laRShtcCkuCisgKi8KK1NUQVRJQyBpbnQgeGZzX2Rpcl9sZWFmX2xvb2t1cCh4ZnNfZGFfYXJnc190ICphcmdzKTsKK1NUQVRJQyBpbnQgeGZzX2Rpcl9sZWFmX3JlbW92ZW5hbWUoeGZzX2RhX2FyZ3NfdCAqYXJncywgaW50ICpudW1iZXJfZW50cmllcywKKwkJCQkJCSBpbnQgKnRvdGFsX25hbWVieXRlcyk7CitTVEFUSUMgaW50IHhmc19kaXJfbGVhZl9nZXRkZW50cyh4ZnNfdHJhbnNfdCAqdHJhbnMsIHhmc19pbm9kZV90ICpkcCwKKwkJCQkJICAgICB1aW9fdCAqdWlvLCBpbnQgKmVvZnAsCisJCQkJCSAgICAgeGZzX2RpcmVudF90ICpkYnAsCisJCQkJCSAgICAgeGZzX2Rpcl9wdXRfdCBwdXQpOworU1RBVElDIGludCB4ZnNfZGlyX2xlYWZfcmVwbGFjZSh4ZnNfZGFfYXJnc190ICphcmdzKTsKKworLyoKKyAqIEludGVybmFsIHJvdXRpbmVzIHdoZW4gZGlyc2l6ZSA+IFhGU19MQlNJWkUobXApLgorICovCitTVEFUSUMgaW50IHhmc19kaXJfbm9kZV9hZGRuYW1lKHhmc19kYV9hcmdzX3QgKmFyZ3MpOworU1RBVElDIGludCB4ZnNfZGlyX25vZGVfbG9va3VwKHhmc19kYV9hcmdzX3QgKmFyZ3MpOworU1RBVElDIGludCB4ZnNfZGlyX25vZGVfcmVtb3ZlbmFtZSh4ZnNfZGFfYXJnc190ICphcmdzKTsKK1NUQVRJQyBpbnQgeGZzX2Rpcl9ub2RlX2dldGRlbnRzKHhmc190cmFuc190ICp0cmFucywgeGZzX2lub2RlX3QgKmRwLAorCQkJCQkgICAgIHVpb190ICp1aW8sIGludCAqZW9mcCwKKwkJCQkJICAgICB4ZnNfZGlyZW50X3QgKmRicCwKKwkJCQkJICAgICB4ZnNfZGlyX3B1dF90IHB1dCk7CitTVEFUSUMgaW50IHhmc19kaXJfbm9kZV9yZXBsYWNlKHhmc19kYV9hcmdzX3QgKmFyZ3MpOworCisjaWYgZGVmaW5lZChYRlNfRElSX1RSQUNFKQora3RyYWNlX3QgKnhmc19kaXJfdHJhY2VfYnVmOworI2VuZGlmCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE92ZXJhbGwgZXh0ZXJuYWwgaW50ZXJmYWNlIHJvdXRpbmVzLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit4ZnNfZGFoYXNoX3QJeGZzX2Rpcl9oYXNoX2RvdCwgeGZzX2Rpcl9oYXNoX2RvdGRvdDsKKworLyoKKyAqIE9uZS10aW1lIHN0YXJ0dXAgcm91dGluZSBjYWxsZWQgZnJvbSB4ZnNfaW5pdCgpLgorICovCit2b2lkCit4ZnNfZGlyX3N0YXJ0dXAodm9pZCkKK3sKKwl4ZnNfZGlyX2hhc2hfZG90ID0geGZzX2RhX2hhc2huYW1lKCIuIiwgMSk7CisJeGZzX2Rpcl9oYXNoX2RvdGRvdCA9IHhmc19kYV9oYXNobmFtZSgiLi4iLCAyKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgZGlyZWN0b3J5LXJlbGF0ZWQgZmllbGRzIGluIHRoZSBtb3VudCBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkCit4ZnNfZGlyX21vdW50KHhmc19tb3VudF90ICptcCkKK3sKKwl1aW50IHNob3J0Y291bnQsIGxlYWZjb3VudCwgY291bnQ7CisKKwltcC0+bV9kaXJ2ZXJzaW9uID0gMTsKKwlzaG9ydGNvdW50ID0gKG1wLT5tX2F0dHJvZmZzZXQgLSAodWludClzaXplb2YoeGZzX2Rpcl9zZl9oZHJfdCkpIC8KKwkJICAgICAodWludClzaXplb2YoeGZzX2Rpcl9zZl9lbnRyeV90KTsKKwlsZWFmY291bnQgPSAoWEZTX0xCU0laRShtcCkgLSAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2hkcl90KSkgLworCQkgICAgKCh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCkgKworCQkgICAgICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfbmFtZV90KSk7CisJY291bnQgPSBzaG9ydGNvdW50ID4gbGVhZmNvdW50ID8gc2hvcnRjb3VudCA6IGxlYWZjb3VudDsKKwltcC0+bV9kaXJjb29rX2Vsb2cgPSB4ZnNfZGFfbG9nMl9yb3VuZHVwKGNvdW50ICsgMSk7CisJQVNTRVJUKG1wLT5tX2RpcmNvb2tfZWxvZyA8PSBtcC0+bV9zYi5zYl9ibG9ja2xvZyk7CisJbXAtPm1fZGlyX25vZGVfZW50cyA9IG1wLT5tX2F0dHJfbm9kZV9lbnRzID0KKwkJKFhGU19MQlNJWkUobXApIC0gKHVpbnQpc2l6ZW9mKHhmc19kYV9ub2RlX2hkcl90KSkgLworCQkodWludClzaXplb2YoeGZzX2RhX25vZGVfZW50cnlfdCk7CisJbXAtPm1fZGlyX21hZ2ljcGN0ID0gKFhGU19MQlNJWkUobXApICogMzcpIC8gMTAwOworCW1wLT5tX2RpcmJsa3NpemUgPSBtcC0+bV9zYi5zYl9ibG9ja3NpemU7CisJbXAtPm1fZGlyYmxrZnNicyA9IDE7Cit9CisKKy8qCisgKiBSZXR1cm4gMSBpZiBkaXJlY3RvcnkgY29udGFpbnMgb25seSAiLiIgYW5kICIuLiIuCisgKi8KK3N0YXRpYyBpbnQKK3hmc19kaXJfaXNlbXB0eSh4ZnNfaW5vZGVfdCAqZHApCit7CisJeGZzX2Rpcl9zZl9oZHJfdCAqaGRyOworCisJQVNTRVJUKChkcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZESVIpOworCWlmIChkcC0+aV9kLmRpX3NpemUgPT0gMCkKKwkJcmV0dXJuKDEpOworCWlmIChkcC0+aV9kLmRpX3NpemUgPiBYRlNfSUZPUktfRFNJWkUoZHApKQorCQlyZXR1cm4oMCk7CisJaGRyID0gKHhmc19kaXJfc2ZfaGRyX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCXJldHVybihoZHItPmNvdW50ID09IDApOworfQorCisvKgorICogSW5pdGlhbGl6ZSBhIGRpcmVjdG9yeSB3aXRoIGl0cyAiLiIgYW5kICIuLiIgZW50cmllcy4KKyAqLworc3RhdGljIGludAoreGZzX2Rpcl9pbml0KHhmc190cmFuc190ICp0cmFucywgeGZzX2lub2RlX3QgKmRpciwgeGZzX2lub2RlX3QgKnBhcmVudF9kaXIpCit7CisJeGZzX2RhX2FyZ3NfdCBhcmdzOworCWludCBlcnJvcjsKKworCW1lbXNldCgoY2hhciAqKSZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCWFyZ3MuZHAgPSBkaXI7CisJYXJncy50cmFucyA9IHRyYW5zOworCisJQVNTRVJUKChkaXItPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKTsKKwlpZiAoKGVycm9yID0geGZzX2Rpcl9pbm9fdmFsaWRhdGUodHJhbnMtPnRfbW91bnRwLCBwYXJlbnRfZGlyLT5pX2lubykpKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4oeGZzX2Rpcl9zaG9ydGZvcm1fY3JlYXRlKCZhcmdzLCBwYXJlbnRfZGlyLT5pX2lubykpOworfQorCisvKgorICogR2VuZXJpYyBoYW5kbGVyIHJvdXRpbmUgdG8gYWRkIGEgbmFtZSB0byBhIGRpcmVjdG9yeS4KKyAqIFRyYW5zaXRpb25zIGRpcmVjdG9yeSBmcm9tIHNob3J0Zm9ybSB0byBCdHJlZSBhcyBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyBpbnQJCQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXJfY3JlYXRlbmFtZSh4ZnNfdHJhbnNfdCAqdHJhbnMsIHhmc19pbm9kZV90ICpkcCwgY2hhciAqbmFtZSwKKwkJICAgaW50IG5hbWVsZW4sIHhmc19pbm9fdCBpbnVtLCB4ZnNfZnNibG9ja190ICpmaXJzdGJsb2NrLAorCQkgICB4ZnNfYm1hcF9mcmVlX3QgKmZsaXN0LCB4ZnNfZXh0bGVuX3QgdG90YWwpCit7CisJeGZzX2RhX2FyZ3NfdCBhcmdzOworCWludCByZXR2YWwsIG5ld3NpemUsIGRvbmU7CisKKwlBU1NFUlQoKGRwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUik7CisKKwlpZiAoKHJldHZhbCA9IHhmc19kaXJfaW5vX3ZhbGlkYXRlKHRyYW5zLT50X21vdW50cCwgaW51bSkpKQorCQlyZXR1cm4gKHJldHZhbCk7CisKKwlYRlNfU1RBVFNfSU5DKHhzX2Rpcl9jcmVhdGUpOworCS8qCisJICogRmlsbCBpbiB0aGUgYXJnIHN0cnVjdHVyZSBmb3IgdGhpcyByZXF1ZXN0LgorCSAqLworCWFyZ3MubmFtZSA9IG5hbWU7CisJYXJncy5uYW1lbGVuID0gbmFtZWxlbjsKKwlhcmdzLmhhc2h2YWwgPSB4ZnNfZGFfaGFzaG5hbWUobmFtZSwgbmFtZWxlbik7CisJYXJncy5pbnVtYmVyID0gaW51bTsKKwlhcmdzLmRwID0gZHA7CisJYXJncy5maXJzdGJsb2NrID0gZmlyc3RibG9jazsKKwlhcmdzLmZsaXN0ID0gZmxpc3Q7CisJYXJncy50b3RhbCA9IHRvdGFsOworCWFyZ3Mud2hpY2hmb3JrID0gWEZTX0RBVEFfRk9SSzsKKwlhcmdzLnRyYW5zID0gdHJhbnM7CisJYXJncy5qdXN0Y2hlY2sgPSAwOworCWFyZ3MuYWRkbmFtZSA9IGFyZ3Mub2tub2VudCA9IDE7CisKKwkvKgorCSAqIERlY2lkZSBvbiB3aGF0IHdvcmsgcm91dGluZXMgdG8gY2FsbCBiYXNlZCBvbiB0aGUgaW5vZGUgc2l6ZS4KKwkgKi8KKwlkb25lID0gMDsKKwlpZiAoZHAtPmlfZC5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpIHsKKwkJbmV3c2l6ZSA9IFhGU19ESVJfU0ZfRU5UU0laRV9CWU5BTUUoYXJncy5uYW1lbGVuKTsKKwkJaWYgKChkcC0+aV9kLmRpX3NpemUgKyBuZXdzaXplKSA8PSBYRlNfSUZPUktfRFNJWkUoZHApKSB7CisJCQlyZXR2YWwgPSB4ZnNfZGlyX3Nob3J0Zm9ybV9hZGRuYW1lKCZhcmdzKTsKKwkJCWRvbmUgPSAxOworCQl9IGVsc2UgeworCQkJaWYgKHRvdGFsID09IDApCisJCQkJcmV0dXJuIFhGU19FUlJPUihFTk9TUEMpOworCQkJcmV0dmFsID0geGZzX2Rpcl9zaG9ydGZvcm1fdG9fbGVhZigmYXJncyk7CisJCQlkb25lID0gcmV0dmFsICE9IDA7CisJCX0KKwl9CisJaWYgKCFkb25lICYmIHhmc19ibWFwX29uZV9ibG9jayhkcCwgWEZTX0RBVEFfRk9SSykpIHsKKwkJcmV0dmFsID0geGZzX2Rpcl9sZWFmX2FkZG5hbWUoJmFyZ3MpOworCQlkb25lID0gcmV0dmFsICE9IEVOT1NQQzsKKwkJaWYgKCFkb25lKSB7CisJCQlpZiAodG90YWwgPT0gMCkKKwkJCQlyZXR1cm4gWEZTX0VSUk9SKEVOT1NQQyk7CisJCQlyZXR2YWwgPSB4ZnNfZGlyX2xlYWZfdG9fbm9kZSgmYXJncyk7CisJCQlkb25lID0gcmV0dmFsICE9IDA7CisJCX0KKwl9CisJaWYgKCFkb25lKSB7CisJCXJldHZhbCA9IHhmc19kaXJfbm9kZV9hZGRuYW1lKCZhcmdzKTsKKwl9CisJcmV0dXJuKHJldHZhbCk7Cit9CisKKy8qCisgKiBHZW5lcmljIGhhbmRsZXIgcm91dGluZSB0byBjaGVjayBpZiBhIG5hbWUgY2FuIGJlIGFkZGVkIHRvIGEgZGlyZWN0b3J5LAorICogd2l0aG91dCBhZGRpbmcgYW55IGJsb2NrcyB0byB0aGUgZGlyZWN0b3J5LgorICovCitzdGF0aWMgaW50CQkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyX2NhbmVudGVyKHhmc190cmFuc190ICp0cmFucywgeGZzX2lub2RlX3QgKmRwLCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKK3sKKwl4ZnNfZGFfYXJnc190IGFyZ3M7CisJaW50IHJldHZhbCwgbmV3c2l6ZTsKKworCUFTU0VSVCgoZHAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKTsKKwkvKgorCSAqIEZpbGwgaW4gdGhlIGFyZyBzdHJ1Y3R1cmUgZm9yIHRoaXMgcmVxdWVzdC4KKwkgKi8KKwlhcmdzLm5hbWUgPSBuYW1lOworCWFyZ3MubmFtZWxlbiA9IG5hbWVsZW47CisJYXJncy5oYXNodmFsID0geGZzX2RhX2hhc2huYW1lKG5hbWUsIG5hbWVsZW4pOworCWFyZ3MuaW51bWJlciA9IDA7CisJYXJncy5kcCA9IGRwOworCWFyZ3MuZmlyc3RibG9jayA9IE5VTEw7CisJYXJncy5mbGlzdCA9IE5VTEw7CisJYXJncy50b3RhbCA9IDA7CisJYXJncy53aGljaGZvcmsgPSBYRlNfREFUQV9GT1JLOworCWFyZ3MudHJhbnMgPSB0cmFuczsKKwlhcmdzLmp1c3RjaGVjayA9IGFyZ3MuYWRkbmFtZSA9IGFyZ3Mub2tub2VudCA9IDE7CisKKwkvKgorCSAqIERlY2lkZSBvbiB3aGF0IHdvcmsgcm91dGluZXMgdG8gY2FsbCBiYXNlZCBvbiB0aGUgaW5vZGUgc2l6ZS4KKwkgKi8KKwlpZiAoZHAtPmlfZC5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpIHsKKwkJbmV3c2l6ZSA9IFhGU19ESVJfU0ZfRU5UU0laRV9CWU5BTUUoYXJncy5uYW1lbGVuKTsKKwkJaWYgKChkcC0+aV9kLmRpX3NpemUgKyBuZXdzaXplKSA8PSBYRlNfSUZPUktfRFNJWkUoZHApKQorCQkJcmV0dmFsID0gMDsKKwkJZWxzZQorCQkJcmV0dmFsID0gWEZTX0VSUk9SKEVOT1NQQyk7CisJfSBlbHNlIGlmICh4ZnNfYm1hcF9vbmVfYmxvY2soZHAsIFhGU19EQVRBX0ZPUkspKSB7CisJCXJldHZhbCA9IHhmc19kaXJfbGVhZl9hZGRuYW1lKCZhcmdzKTsKKwl9IGVsc2UgeworCQlyZXR2YWwgPSB4ZnNfZGlyX25vZGVfYWRkbmFtZSgmYXJncyk7CisJfQorCXJldHVybihyZXR2YWwpOworfQorCisvKgorICogR2VuZXJpYyBoYW5kbGVyIHJvdXRpbmUgdG8gcmVtb3ZlIGEgbmFtZSBmcm9tIGEgZGlyZWN0b3J5LgorICogVHJhbnNpdGlvbnMgZGlyZWN0b3J5IGZyb20gQnRyZWUgdG8gc2hvcnRmb3JtIGFzIG5lY2Vzc2FyeS4KKyAqLworc3RhdGljIGludAkJCQkJCQkvKiBlcnJvciAqLworeGZzX2Rpcl9yZW1vdmVuYW1lKHhmc190cmFuc190ICp0cmFucywgeGZzX2lub2RlX3QgKmRwLCBjaGFyICpuYW1lLAorCQkgICBpbnQgbmFtZWxlbiwgeGZzX2lub190IGlubywgeGZzX2ZzYmxvY2tfdCAqZmlyc3RibG9jaywKKwkJICAgeGZzX2JtYXBfZnJlZV90ICpmbGlzdCwgeGZzX2V4dGxlbl90IHRvdGFsKQoreworCXhmc19kYV9hcmdzX3QgYXJnczsKKwlpbnQgY291bnQsIHRvdGFsbGVuLCBuZXdzaXplLCByZXR2YWw7CisKKwlBU1NFUlQoKGRwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUik7CisJWEZTX1NUQVRTX0lOQyh4c19kaXJfcmVtb3ZlKTsKKwkvKgorCSAqIEZpbGwgaW4gdGhlIGFyZyBzdHJ1Y3R1cmUgZm9yIHRoaXMgcmVxdWVzdC4KKwkgKi8KKwlhcmdzLm5hbWUgPSBuYW1lOworCWFyZ3MubmFtZWxlbiA9IG5hbWVsZW47CisJYXJncy5oYXNodmFsID0geGZzX2RhX2hhc2huYW1lKG5hbWUsIG5hbWVsZW4pOworCWFyZ3MuaW51bWJlciA9IGlubzsKKwlhcmdzLmRwID0gZHA7CisJYXJncy5maXJzdGJsb2NrID0gZmlyc3RibG9jazsKKwlhcmdzLmZsaXN0ID0gZmxpc3Q7CisJYXJncy50b3RhbCA9IHRvdGFsOworCWFyZ3Mud2hpY2hmb3JrID0gWEZTX0RBVEFfRk9SSzsKKwlhcmdzLnRyYW5zID0gdHJhbnM7CisJYXJncy5qdXN0Y2hlY2sgPSBhcmdzLmFkZG5hbWUgPSBhcmdzLm9rbm9lbnQgPSAwOworCisJLyoKKwkgKiBEZWNpZGUgb24gd2hhdCB3b3JrIHJvdXRpbmVzIHRvIGNhbGwgYmFzZWQgb24gdGhlIGlub2RlIHNpemUuCisJICovCisJaWYgKGRwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKSB7CisJCXJldHZhbCA9IHhmc19kaXJfc2hvcnRmb3JtX3JlbW92ZW5hbWUoJmFyZ3MpOworCX0gZWxzZSBpZiAoeGZzX2JtYXBfb25lX2Jsb2NrKGRwLCBYRlNfREFUQV9GT1JLKSkgeworCQlyZXR2YWwgPSB4ZnNfZGlyX2xlYWZfcmVtb3ZlbmFtZSgmYXJncywgJmNvdW50LCAmdG90YWxsZW4pOworCQlpZiAocmV0dmFsID09IDApIHsKKwkJCW5ld3NpemUgPSBYRlNfRElSX1NGX0FMTEZJVChjb3VudCwgdG90YWxsZW4pOworCQkJaWYgKG5ld3NpemUgPD0gWEZTX0lGT1JLX0RTSVpFKGRwKSkgeworCQkJCXJldHZhbCA9IHhmc19kaXJfbGVhZl90b19zaG9ydGZvcm0oJmFyZ3MpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcmV0dmFsID0geGZzX2Rpcl9ub2RlX3JlbW92ZW5hbWUoJmFyZ3MpOworCX0KKwlyZXR1cm4ocmV0dmFsKTsKK30KKworc3RhdGljIGludAkJCQkJCQkvKiBlcnJvciAqLworeGZzX2Rpcl9sb29rdXAoeGZzX3RyYW5zX3QgKnRyYW5zLCB4ZnNfaW5vZGVfdCAqZHAsIGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAorCQkJCSAgIHhmc19pbm9fdCAqaW51bSkKK3sKKwl4ZnNfZGFfYXJnc190IGFyZ3M7CisJaW50IHJldHZhbDsKKworCUFTU0VSVCgoZHAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKTsKKworCVhGU19TVEFUU19JTkMoeHNfZGlyX2xvb2t1cCk7CisJLyoKKwkgKiBGaWxsIGluIHRoZSBhcmcgc3RydWN0dXJlIGZvciB0aGlzIHJlcXVlc3QuCisJICovCisJYXJncy5uYW1lID0gbmFtZTsKKwlhcmdzLm5hbWVsZW4gPSBuYW1lbGVuOworCWFyZ3MuaGFzaHZhbCA9IHhmc19kYV9oYXNobmFtZShuYW1lLCBuYW1lbGVuKTsKKwlhcmdzLmludW1iZXIgPSAwOworCWFyZ3MuZHAgPSBkcDsKKwlhcmdzLmZpcnN0YmxvY2sgPSBOVUxMOworCWFyZ3MuZmxpc3QgPSBOVUxMOworCWFyZ3MudG90YWwgPSAwOworCWFyZ3Mud2hpY2hmb3JrID0gWEZTX0RBVEFfRk9SSzsKKwlhcmdzLnRyYW5zID0gdHJhbnM7CisJYXJncy5qdXN0Y2hlY2sgPSBhcmdzLmFkZG5hbWUgPSAwOworCWFyZ3Mub2tub2VudCA9IDE7CisKKwkvKgorCSAqIERlY2lkZSBvbiB3aGF0IHdvcmsgcm91dGluZXMgdG8gY2FsbCBiYXNlZCBvbiB0aGUgaW5vZGUgc2l6ZS4KKwkgKi8KKwlpZiAoZHAtPmlfZC5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpIHsKKwkJcmV0dmFsID0geGZzX2Rpcl9zaG9ydGZvcm1fbG9va3VwKCZhcmdzKTsKKwl9IGVsc2UgaWYgKHhmc19ibWFwX29uZV9ibG9jayhkcCwgWEZTX0RBVEFfRk9SSykpIHsKKwkJcmV0dmFsID0geGZzX2Rpcl9sZWFmX2xvb2t1cCgmYXJncyk7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0geGZzX2Rpcl9ub2RlX2xvb2t1cCgmYXJncyk7CisJfQorCWlmIChyZXR2YWwgPT0gRUVYSVNUKQorCQlyZXR2YWwgPSAwOworCSppbnVtID0gYXJncy5pbnVtYmVyOworCXJldHVybihyZXR2YWwpOworfQorCisvKgorICogSW1wbGVtZW50IHJlYWRkaXIuCisgKi8KK3N0YXRpYyBpbnQJCQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXJfZ2V0ZGVudHMoeGZzX3RyYW5zX3QgKnRyYW5zLCB4ZnNfaW5vZGVfdCAqZHAsIHVpb190ICp1aW8sIGludCAqZW9mcCkKK3sKKwl4ZnNfZGlyZW50X3QgKmRicDsKKwlpbnQgIGFsaWdubWVudCwgcmV0dmFsOworCXhmc19kaXJfcHV0X3QgcHV0OworCisJWEZTX1NUQVRTX0lOQyh4c19kaXJfZ2V0ZGVudHMpOworCUFTU0VSVCgoZHAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKTsKKworCS8qCisJICogSWYgb3VyIGNhbGxlciBoYXMgZ2l2ZW4gdXMgYSBzaW5nbGUgY29udGlndW91cyBtZW1vcnkgYnVmZmVyLAorCSAqIGp1c3Qgd29yayBkaXJlY3RseSB3aXRoaW4gdGhhdCBidWZmZXIuICBJZiBpdCdzIGluIHVzZXIgbWVtb3J5LAorCSAqIGxvY2sgaXQgZG93biBmaXJzdC4KKwkgKi8KKwlhbGlnbm1lbnQgPSBzaXplb2YoeGZzX29mZl90KSAtIDE7CisJaWYgKCh1aW8tPnVpb19pb3ZjbnQgPT0gMSkgJiYKKwkgICAgKCgoX19wc2ludF90KXVpby0+dWlvX2lvdlswXS5pb3ZfYmFzZSAmIGFsaWdubWVudCkgPT0gMCkgJiYKKwkgICAgKCh1aW8tPnVpb19pb3ZbMF0uaW92X2xlbiAmIGFsaWdubWVudCkgPT0gMCkpIHsKKwkJZGJwID0gTlVMTDsKKwkJcHV0ID0geGZzX2Rpcl9wdXRfZGlyZW50NjRfZGlyZWN0OworCX0gZWxzZSB7CisJCWRicCA9IGttZW1fYWxsb2Moc2l6ZW9mKCpkYnApICsgTUFYTkFNRUxFTiwgS01fU0xFRVApOworCQlwdXQgPSB4ZnNfZGlyX3B1dF9kaXJlbnQ2NF91aW87CisJfQorCisJLyoKKwkgKiBEZWNpZGUgb24gd2hhdCB3b3JrIHJvdXRpbmVzIHRvIGNhbGwgYmFzZWQgb24gdGhlIGlub2RlIHNpemUuCisJICovCisJKmVvZnAgPSAwOworCisJaWYgKGRwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKSB7CisJCXJldHZhbCA9IHhmc19kaXJfc2hvcnRmb3JtX2dldGRlbnRzKGRwLCB1aW8sIGVvZnAsIGRicCwgcHV0KTsKKwl9IGVsc2UgaWYgKHhmc19ibWFwX29uZV9ibG9jayhkcCwgWEZTX0RBVEFfRk9SSykpIHsKKwkJcmV0dmFsID0geGZzX2Rpcl9sZWFmX2dldGRlbnRzKHRyYW5zLCBkcCwgdWlvLCBlb2ZwLCBkYnAsIHB1dCk7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0geGZzX2Rpcl9ub2RlX2dldGRlbnRzKHRyYW5zLCBkcCwgdWlvLCBlb2ZwLCBkYnAsIHB1dCk7CisJfQorCWlmIChkYnAgIT0gTlVMTCkKKwkJa21lbV9mcmVlKGRicCwgc2l6ZW9mKCpkYnApICsgTUFYTkFNRUxFTik7CisKKwlyZXR1cm4ocmV0dmFsKTsKK30KKworc3RhdGljIGludAkJCQkJCQkvKiBlcnJvciAqLworeGZzX2Rpcl9yZXBsYWNlKHhmc190cmFuc190ICp0cmFucywgeGZzX2lub2RlX3QgKmRwLCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJCQkgICAgeGZzX2lub190IGludW0sIHhmc19mc2Jsb2NrX3QgKmZpcnN0YmxvY2ssCisJCQkJICAgIHhmc19ibWFwX2ZyZWVfdCAqZmxpc3QsIHhmc19leHRsZW5fdCB0b3RhbCkKK3sKKwl4ZnNfZGFfYXJnc190IGFyZ3M7CisJaW50IHJldHZhbDsKKworCUFTU0VSVCgoZHAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKTsKKworCWlmICgocmV0dmFsID0geGZzX2Rpcl9pbm9fdmFsaWRhdGUodHJhbnMtPnRfbW91bnRwLCBpbnVtKSkpCisJCXJldHVybiByZXR2YWw7CisKKwkvKgorCSAqIEZpbGwgaW4gdGhlIGFyZyBzdHJ1Y3R1cmUgZm9yIHRoaXMgcmVxdWVzdC4KKwkgKi8KKwlhcmdzLm5hbWUgPSBuYW1lOworCWFyZ3MubmFtZWxlbiA9IG5hbWVsZW47CisJYXJncy5oYXNodmFsID0geGZzX2RhX2hhc2huYW1lKG5hbWUsIG5hbWVsZW4pOworCWFyZ3MuaW51bWJlciA9IGludW07CisJYXJncy5kcCA9IGRwOworCWFyZ3MuZmlyc3RibG9jayA9IGZpcnN0YmxvY2s7CisJYXJncy5mbGlzdCA9IGZsaXN0OworCWFyZ3MudG90YWwgPSB0b3RhbDsKKwlhcmdzLndoaWNoZm9yayA9IFhGU19EQVRBX0ZPUks7CisJYXJncy50cmFucyA9IHRyYW5zOworCWFyZ3MuanVzdGNoZWNrID0gYXJncy5hZGRuYW1lID0gYXJncy5va25vZW50ID0gMDsKKworCS8qCisJICogRGVjaWRlIG9uIHdoYXQgd29yayByb3V0aW5lcyB0byBjYWxsIGJhc2VkIG9uIHRoZSBpbm9kZSBzaXplLgorCSAqLworCWlmIChkcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkgeworCQlyZXR2YWwgPSB4ZnNfZGlyX3Nob3J0Zm9ybV9yZXBsYWNlKCZhcmdzKTsKKwl9IGVsc2UgaWYgKHhmc19ibWFwX29uZV9ibG9jayhkcCwgWEZTX0RBVEFfRk9SSykpIHsKKwkJcmV0dmFsID0geGZzX2Rpcl9sZWFmX3JlcGxhY2UoJmFyZ3MpOworCX0gZWxzZSB7CisJCXJldHZhbCA9IHhmc19kaXJfbm9kZV9yZXBsYWNlKCZhcmdzKTsKKwl9CisKKwlyZXR1cm4ocmV0dmFsKTsKK30KKworc3RhdGljIGludAoreGZzX2Rpcl9zaG9ydGZvcm1fdmFsaWRhdGVfb25kaXNrKHhmc19tb3VudF90ICptcCwgeGZzX2Rpbm9kZV90ICpkcCkKK3sKKwl4ZnNfaW5vX3QJCWlubzsKKwlpbnQJCQluYW1lbGVuX3N1bTsKKwlpbnQJCQljb3VudDsKKwl4ZnNfZGlyX3Nob3J0Zm9ybV90CSpzZjsKKwl4ZnNfZGlyX3NmX2VudHJ5X3QJKnNmZTsKKwlpbnQJCQlpOworCisKKworCWlmICgoSU5UX0dFVChkcC0+ZGlfY29yZS5kaV9tb2RlLCBBUkNIX0NPTlZFUlQpICYgU19JRk1UKSAhPSBTX0lGRElSKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAoSU5UX0dFVChkcC0+ZGlfY29yZS5kaV9mb3JtYXQsIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChJTlRfR0VUKGRwLT5kaV9jb3JlLmRpX3NpemUsIEFSQ0hfQ09OVkVSVCkgPCBzaXplb2Yoc2YtPmhkcikpIHsKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgbXAsICJJbnZhbGlkIHNob3J0Zm9ybSBzaXplOiBkcCAweCVwIiwKKwkJCWRwKTsKKwkJcmV0dXJuIDE7CisJfQorCXNmID0gKHhmc19kaXJfc2hvcnRmb3JtX3QgKikoJmRwLT5kaV91LmRpX2RpcnNmKTsKKwlpbm8gPSBYRlNfR0VUX0RJUl9JTk84KHNmLT5oZHIucGFyZW50KTsKKwlpZiAoeGZzX2Rpcl9pbm9fdmFsaWRhdGUobXAsIGlubykpCisJCXJldHVybiAxOworCisJY291bnQgPQlzZi0+aGRyLmNvdW50OworCWlmICgoY291bnQgPCAwKSB8fCAoKGNvdW50ICogMTApID4gWEZTX0xJVElOTyhtcCkpKSB7CisJCXhmc19mc19jbW5fZXJyKENFX1dBUk4sIG1wLAorCQkJIkludmFsaWQgc2hvcnRmb3JtIGNvdW50OiBkcCAweCVwIiwgZHApOworCQlyZXR1cm4oMSk7CisJfQorCisJaWYgKGNvdW50ID09IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCisJbmFtZWxlbl9zdW0gPSAwOworCXNmZSA9ICZzZi0+bGlzdFswXTsKKwlmb3IgKGkgPSBzZi0+aGRyLmNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaW5vID0gWEZTX0dFVF9ESVJfSU5POChzZmUtPmludW1iZXIpOworCQl4ZnNfZGlyX2lub192YWxpZGF0ZShtcCwgaW5vKTsKKwkJaWYgKHNmZS0+bmFtZWxlbiA+PSBYRlNfTElUSU5PKG1wKSkgeworCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgbXAsCisJCQkJIkludmFsaWQgc2hvcnRmb3JtIG5hbWVsZW46IGRwIDB4JXAiLCBkcCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQluYW1lbGVuX3N1bSArPSBzZmUtPm5hbWVsZW47CisJCXNmZSA9IFhGU19ESVJfU0ZfTkVYVEVOVFJZKHNmZSk7CisJfQorCWlmIChuYW1lbGVuX3N1bSA+PSBYRlNfTElUSU5PKG1wKSkgeworCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBtcCwKKwkJCSJJbnZhbGlkIHNob3J0Zm9ybSBuYW1lbGVuOiBkcCAweCVwIiwgZHApOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEV4dGVybmFsIHJvdXRpbmVzIHdoZW4gZGlyc2l6ZSA9PSBYRlNfTEJTSVpFKGRwLT5pX21vdW50KS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIEFkZCBhIG5hbWUgdG8gdGhlIGxlYWYgZGlyZWN0b3J5IHN0cnVjdHVyZQorICogVGhpcyBpcyB0aGUgZXh0ZXJuYWwgcm91dGluZS4KKyAqLworaW50Cit4ZnNfZGlyX2xlYWZfYWRkbmFtZSh4ZnNfZGFfYXJnc190ICphcmdzKQoreworCWludCBpbmRleCwgcmV0dmFsOworCXhmc19kYWJ1Zl90ICpicDsKKworCXJldHZhbCA9IHhmc19kYV9yZWFkX2J1ZihhcmdzLT50cmFucywgYXJncy0+ZHAsIDAsIC0xLCAmYnAsCisJCQkJCSAgICAgIFhGU19EQVRBX0ZPUkspOworCWlmIChyZXR2YWwpCisJCXJldHVybihyZXR2YWwpOworCUFTU0VSVChicCAhPSBOVUxMKTsKKworCXJldHZhbCA9IHhmc19kaXJfbGVhZl9sb29rdXBfaW50KGJwLCBhcmdzLCAmaW5kZXgpOworCWlmIChyZXR2YWwgPT0gRU5PRU5UKQorCQlyZXR2YWwgPSB4ZnNfZGlyX2xlYWZfYWRkKGJwLCBhcmdzLCBpbmRleCk7CisJeGZzX2RhX2J1Zl9kb25lKGJwKTsKKwlyZXR1cm4ocmV0dmFsKTsKK30KKworLyoKKyAqIFJlbW92ZSBhIG5hbWUgZnJvbSB0aGUgbGVhZiBkaXJlY3Rvcnkgc3RydWN0dXJlCisgKiBUaGlzIGlzIHRoZSBleHRlcm5hbCByb3V0aW5lLgorICovCitTVEFUSUMgaW50Cit4ZnNfZGlyX2xlYWZfcmVtb3ZlbmFtZSh4ZnNfZGFfYXJnc190ICphcmdzLCBpbnQgKmNvdW50LCBpbnQgKnRvdGFsbGVuKQoreworCXhmc19kaXJfbGVhZmJsb2NrX3QgKmxlYWY7CisJaW50IGluZGV4LCByZXR2YWw7CisJeGZzX2RhYnVmX3QgKmJwOworCisJcmV0dmFsID0geGZzX2RhX3JlYWRfYnVmKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgMCwgLTEsICZicCwKKwkJCQkJICAgICAgWEZTX0RBVEFfRk9SSyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuKHJldHZhbCk7CisJQVNTRVJUKGJwICE9IE5VTEwpOworCWxlYWYgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSX0xFQUZfTUFHSUMpOworCXJldHZhbCA9IHhmc19kaXJfbGVhZl9sb29rdXBfaW50KGJwLCBhcmdzLCAmaW5kZXgpOworCWlmIChyZXR2YWwgPT0gRUVYSVNUKSB7CisJCSh2b2lkKXhmc19kaXJfbGVhZl9yZW1vdmUoYXJncy0+dHJhbnMsIGJwLCBpbmRleCk7CisJCSpjb3VudCA9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQkqdG90YWxsZW4gPSBJTlRfR0VUKGxlYWYtPmhkci5uYW1lYnl0ZXMsIEFSQ0hfQ09OVkVSVCk7CisJCXJldHZhbCA9IDA7CisJfQorCXhmc19kYV9idWZfZG9uZShicCk7CisJcmV0dXJuKHJldHZhbCk7Cit9CisKKy8qCisgKiBMb29rIHVwIGEgbmFtZSBpbiBhIGxlYWYgZGlyZWN0b3J5IHN0cnVjdHVyZS4KKyAqIFRoaXMgaXMgdGhlIGV4dGVybmFsIHJvdXRpbmUuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19kaXJfbGVhZl9sb29rdXAoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwlpbnQgaW5kZXgsIHJldHZhbDsKKwl4ZnNfZGFidWZfdCAqYnA7CisKKwlyZXR2YWwgPSB4ZnNfZGFfcmVhZF9idWYoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCAwLCAtMSwgJmJwLAorCQkJCQkgICAgICBYRlNfREFUQV9GT1JLKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4ocmV0dmFsKTsKKwlBU1NFUlQoYnAgIT0gTlVMTCk7CisJcmV0dmFsID0geGZzX2Rpcl9sZWFmX2xvb2t1cF9pbnQoYnAsIGFyZ3MsICZpbmRleCk7CisJeGZzX2RhX2JyZWxzZShhcmdzLT50cmFucywgYnApOworCXJldHVybihyZXR2YWwpOworfQorCisvKgorICogQ29weSBvdXQgZGlyZWN0b3J5IGVudHJpZXMgZm9yIGdldGRlbnRzKCksIGZvciBsZWFmIGRpcmVjdG9yaWVzLgorICovCitTVEFUSUMgaW50Cit4ZnNfZGlyX2xlYWZfZ2V0ZGVudHMoeGZzX3RyYW5zX3QgKnRyYW5zLCB4ZnNfaW5vZGVfdCAqZHAsIHVpb190ICp1aW8sCisJCQkJICBpbnQgKmVvZnAsIHhmc19kaXJlbnRfdCAqZGJwLCB4ZnNfZGlyX3B1dF90IHB1dCkKK3sKKwl4ZnNfZGFidWZfdCAqYnA7CisJaW50IHJldHZhbCwgZW9iOworCisJcmV0dmFsID0geGZzX2RhX3JlYWRfYnVmKGRwLT5pX3RyYW5zcCwgZHAsIDAsIC0xLCAmYnAsIFhGU19EQVRBX0ZPUkspOworCWlmIChyZXR2YWwpCisJCXJldHVybihyZXR2YWwpOworCUFTU0VSVChicCAhPSBOVUxMKTsKKwlyZXR2YWwgPSB4ZnNfZGlyX2xlYWZfZ2V0ZGVudHNfaW50KGJwLCBkcCwgMCwgdWlvLCAmZW9iLCBkYnAsIHB1dCwgLTEpOworCXhmc19kYV9icmVsc2UodHJhbnMsIGJwKTsKKwkqZW9mcCA9IChlb2IgPT0gMCk7CisJcmV0dXJuKHJldHZhbCk7Cit9CisKKy8qCisgKiBMb29rIHVwIGEgbmFtZSBpbiBhIGxlYWYgZGlyZWN0b3J5IHN0cnVjdHVyZSwgcmVwbGFjZSB0aGUgaW5vZGUgbnVtYmVyLgorICogVGhpcyBpcyB0aGUgZXh0ZXJuYWwgcm91dGluZS4KKyAqLworU1RBVElDIGludAoreGZzX2Rpcl9sZWFmX3JlcGxhY2UoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwlpbnQgaW5kZXgsIHJldHZhbDsKKwl4ZnNfZGFidWZfdCAqYnA7CisJeGZzX2lub190IGludW07CisJeGZzX2Rpcl9sZWFmYmxvY2tfdCAqbGVhZjsKKwl4ZnNfZGlyX2xlYWZfZW50cnlfdCAqZW50cnk7CisJeGZzX2Rpcl9sZWFmX25hbWVfdCAqbmFtZXN0OworCisJaW51bSA9IGFyZ3MtPmludW1iZXI7CisJcmV0dmFsID0geGZzX2RhX3JlYWRfYnVmKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgMCwgLTEsICZicCwKKwkJCQkJICAgICAgWEZTX0RBVEFfRk9SSyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuKHJldHZhbCk7CisJQVNTRVJUKGJwICE9IE5VTEwpOworCXJldHZhbCA9IHhmc19kaXJfbGVhZl9sb29rdXBfaW50KGJwLCBhcmdzLCAmaW5kZXgpOworCWlmIChyZXR2YWwgPT0gRUVYSVNUKSB7CisJCWxlYWYgPSBicC0+ZGF0YTsKKwkJZW50cnkgPSAmbGVhZi0+ZW50cmllc1tpbmRleF07CisJCW5hbWVzdCA9IFhGU19ESVJfTEVBRl9OQU1FU1RSVUNUKGxlYWYsIElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkpOworCQkvKiBYWFggLSByZXBsYWNlIGFzc2VydD8gKi8KKwkJWEZTX0RJUl9TRl9QVVRfRElSSU5PKCZpbnVtLCAmbmFtZXN0LT5pbnVtYmVyKTsKKwkJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwLAorCQkgICAgWEZTX0RBX0xPR1JBTkdFKGxlYWYsIG5hbWVzdCwgc2l6ZW9mKG5hbWVzdC0+aW51bWJlcikpKTsKKwkJeGZzX2RhX2J1Zl9kb25lKGJwKTsKKwkJcmV0dmFsID0gMDsKKwl9IGVsc2UKKwkJeGZzX2RhX2JyZWxzZShhcmdzLT50cmFucywgYnApOworCXJldHVybihyZXR2YWwpOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBFeHRlcm5hbCByb3V0aW5lcyB3aGVuIGRpcnNpemUgPiBYRlNfTEJTSVpFKG1wKS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIEFkZCBhIG5hbWUgdG8gYSBCdHJlZS1mb3JtYXQgZGlyZWN0b3J5LgorICoKKyAqIFRoaXMgd2lsbCBpbnZvbHZlIHdhbGtpbmcgZG93biB0aGUgQnRyZWUsIGFuZCBtYXkgaW52b2x2ZSBzcGxpdHRpbmcKKyAqIGxlYWYgbm9kZXMgYW5kIGV2ZW4gc3BsaXR0aW5nIGludGVybWVkaWF0ZSBub2RlcyB1cCB0byBhbmQgaW5jbHVkaW5nCisgKiB0aGUgcm9vdCBub2RlIChhIHNwZWNpYWwgY2FzZSBvZiBhbiBpbnRlcm1lZGlhdGUgbm9kZSkuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19kaXJfbm9kZV9hZGRuYW1lKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2RhX3N0YXRlX3QgKnN0YXRlOworCXhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrOworCWludCByZXR2YWwsIGVycm9yOworCisJLyoKKwkgKiBGaWxsIGluIGJ1Y2tldCBvZiBhcmd1bWVudHMvcmVzdWx0cy9jb250ZXh0IHRvIGNhcnJ5IGFyb3VuZC4KKwkgKi8KKwlzdGF0ZSA9IHhmc19kYV9zdGF0ZV9hbGxvYygpOworCXN0YXRlLT5hcmdzID0gYXJnczsKKwlzdGF0ZS0+bXAgPSBhcmdzLT5kcC0+aV9tb3VudDsKKwlzdGF0ZS0+YmxvY2tzaXplID0gc3RhdGUtPm1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZTsKKwlzdGF0ZS0+bm9kZV9lbnRzID0gc3RhdGUtPm1wLT5tX2Rpcl9ub2RlX2VudHM7CisKKwkvKgorCSAqIFNlYXJjaCB0byBzZWUgaWYgbmFtZSBhbHJlYWR5IGV4aXN0cywgYW5kIGdldCBiYWNrIGEgcG9pbnRlcgorCSAqIHRvIHdoZXJlIGl0IHNob3VsZCBnby4KKwkgKi8KKwllcnJvciA9IHhmc19kYV9ub2RlX2xvb2t1cF9pbnQoc3RhdGUsICZyZXR2YWwpOworCWlmIChlcnJvcikKKwkJcmV0dmFsID0gZXJyb3I7CisJaWYgKHJldHZhbCAhPSBFTk9FTlQpCisJCWdvdG8gZXJyb3I7CisJYmxrID0gJnN0YXRlLT5wYXRoLmJsa1sgc3RhdGUtPnBhdGguYWN0aXZlLTEgXTsKKwlBU1NFUlQoYmxrLT5tYWdpYyA9PSBYRlNfRElSX0xFQUZfTUFHSUMpOworCXJldHZhbCA9IHhmc19kaXJfbGVhZl9hZGQoYmxrLT5icCwgYXJncywgYmxrLT5pbmRleCk7CisJaWYgKHJldHZhbCA9PSAwKSB7CisJCS8qCisJCSAqIEFkZGl0aW9uIHN1Y2NlZWRlZCwgdXBkYXRlIEJ0cmVlIGhhc2h2YWxzLgorCQkgKi8KKwkJaWYgKCFhcmdzLT5qdXN0Y2hlY2spCisJCQl4ZnNfZGFfZml4aGFzaHBhdGgoc3RhdGUsICZzdGF0ZS0+cGF0aCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQWRkaXRpb24gZmFpbGVkLCBzcGxpdCBhcyBtYW55IEJ0cmVlIGVsZW1lbnRzIGFzIHJlcXVpcmVkLgorCQkgKi8KKwkJaWYgKGFyZ3MtPnRvdGFsID09IDApIHsKKwkJCUFTU0VSVChyZXR2YWwgPT0gRU5PU1BDKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJcmV0dmFsID0geGZzX2RhX3NwbGl0KHN0YXRlKTsKKwl9CitlcnJvcjoKKwl4ZnNfZGFfc3RhdGVfZnJlZShzdGF0ZSk7CisKKwlyZXR1cm4ocmV0dmFsKTsKK30KKworLyoKKyAqIFJlbW92ZSBhIG5hbWUgZnJvbSBhIEItdHJlZSBkaXJlY3RvcnkuCisgKgorICogVGhpcyB3aWxsIGludm9sdmUgd2Fsa2luZyBkb3duIHRoZSBCdHJlZSwgYW5kIG1heSBpbnZvbHZlIGpvaW5pbmcKKyAqIGxlYWYgbm9kZXMgYW5kIGV2ZW4gam9pbmluZyBpbnRlcm1lZGlhdGUgbm9kZXMgdXAgdG8gYW5kIGluY2x1ZGluZworICogdGhlIHJvb3Qgbm9kZSAoYSBzcGVjaWFsIGNhc2Ugb2YgYW4gaW50ZXJtZWRpYXRlIG5vZGUpLgorICovCitTVEFUSUMgaW50Cit4ZnNfZGlyX25vZGVfcmVtb3ZlbmFtZSh4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19kYV9zdGF0ZV90ICpzdGF0ZTsKKwl4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazsKKwlpbnQgcmV0dmFsLCBlcnJvcjsKKworCXN0YXRlID0geGZzX2RhX3N0YXRlX2FsbG9jKCk7CisJc3RhdGUtPmFyZ3MgPSBhcmdzOworCXN0YXRlLT5tcCA9IGFyZ3MtPmRwLT5pX21vdW50OworCXN0YXRlLT5ibG9ja3NpemUgPSBzdGF0ZS0+bXAtPm1fc2Iuc2JfYmxvY2tzaXplOworCXN0YXRlLT5ub2RlX2VudHMgPSBzdGF0ZS0+bXAtPm1fZGlyX25vZGVfZW50czsKKworCS8qCisJICogU2VhcmNoIHRvIHNlZSBpZiBuYW1lIGV4aXN0cywgYW5kIGdldCBiYWNrIGEgcG9pbnRlciB0byBpdC4KKwkgKi8KKwllcnJvciA9IHhmc19kYV9ub2RlX2xvb2t1cF9pbnQoc3RhdGUsICZyZXR2YWwpOworCWlmIChlcnJvcikKKwkJcmV0dmFsID0gZXJyb3I7CisJaWYgKHJldHZhbCAhPSBFRVhJU1QpIHsKKwkJeGZzX2RhX3N0YXRlX2ZyZWUoc3RhdGUpOworCQlyZXR1cm4ocmV0dmFsKTsKKwl9CisKKwkvKgorCSAqIFJlbW92ZSB0aGUgbmFtZSBhbmQgdXBkYXRlIHRoZSBoYXNodmFscyBpbiB0aGUgdHJlZS4KKwkgKi8KKwlibGsgPSAmc3RhdGUtPnBhdGguYmxrWyBzdGF0ZS0+cGF0aC5hY3RpdmUtMSBdOworCUFTU0VSVChibGstPm1hZ2ljID09IFhGU19ESVJfTEVBRl9NQUdJQyk7CisJcmV0dmFsID0geGZzX2Rpcl9sZWFmX3JlbW92ZShhcmdzLT50cmFucywgYmxrLT5icCwgYmxrLT5pbmRleCk7CisJeGZzX2RhX2ZpeGhhc2hwYXRoKHN0YXRlLCAmc3RhdGUtPnBhdGgpOworCisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgdGhlIHRyZWUgbmVlZHMgdG8gYmUgY29sbGFwc2VkLgorCSAqLworCWVycm9yID0gMDsKKwlpZiAocmV0dmFsKSB7CisJCWVycm9yID0geGZzX2RhX2pvaW4oc3RhdGUpOworCX0KKworCXhmc19kYV9zdGF0ZV9mcmVlKHN0YXRlKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybihlcnJvcik7CisJcmV0dXJuKDApOworfQorCisvKgorICogTG9vayB1cCBhIGZpbGVuYW1lIGluIGEgaW50IGRpcmVjdG9yeS4KKyAqIFVzZSBhbiBpbnRlcm5hbCByb3V0aW5lIHRvIGFjdHVhbGx5IGRvIGFsbCB0aGUgd29yay4KKyAqLworU1RBVElDIGludAoreGZzX2Rpcl9ub2RlX2xvb2t1cCh4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19kYV9zdGF0ZV90ICpzdGF0ZTsKKwlpbnQgcmV0dmFsLCBlcnJvciwgaTsKKworCXN0YXRlID0geGZzX2RhX3N0YXRlX2FsbG9jKCk7CisJc3RhdGUtPmFyZ3MgPSBhcmdzOworCXN0YXRlLT5tcCA9IGFyZ3MtPmRwLT5pX21vdW50OworCXN0YXRlLT5ibG9ja3NpemUgPSBzdGF0ZS0+bXAtPm1fc2Iuc2JfYmxvY2tzaXplOworCXN0YXRlLT5ub2RlX2VudHMgPSBzdGF0ZS0+bXAtPm1fZGlyX25vZGVfZW50czsKKworCS8qCisJICogU2VhcmNoIHRvIHNlZSBpZiBuYW1lIGV4aXN0cywKKwkgKiBhbmQgZ2V0IGJhY2sgYSBwb2ludGVyIHRvIGl0LgorCSAqLworCWVycm9yID0geGZzX2RhX25vZGVfbG9va3VwX2ludChzdGF0ZSwgJnJldHZhbCk7CisJaWYgKGVycm9yKSB7CisJCXJldHZhbCA9IGVycm9yOworCX0KKworCS8qCisJICogSWYgbm90IGluIGEgdHJhbnNhY3Rpb24sIHdlIGhhdmUgdG8gcmVsZWFzZSBhbGwgdGhlIGJ1ZmZlcnMuCisJICovCisJZm9yIChpID0gMDsgaSA8IHN0YXRlLT5wYXRoLmFjdGl2ZTsgaSsrKSB7CisJCXhmc19kYV9icmVsc2UoYXJncy0+dHJhbnMsIHN0YXRlLT5wYXRoLmJsa1tpXS5icCk7CisJCXN0YXRlLT5wYXRoLmJsa1tpXS5icCA9IE5VTEw7CisJfQorCisJeGZzX2RhX3N0YXRlX2ZyZWUoc3RhdGUpOworCXJldHVybihyZXR2YWwpOworfQorCitTVEFUSUMgaW50Cit4ZnNfZGlyX25vZGVfZ2V0ZGVudHMoeGZzX3RyYW5zX3QgKnRyYW5zLCB4ZnNfaW5vZGVfdCAqZHAsIHVpb190ICp1aW8sCisJCQkJICBpbnQgKmVvZnAsIHhmc19kaXJlbnRfdCAqZGJwLCB4ZnNfZGlyX3B1dF90IHB1dCkKK3sKKwl4ZnNfZGFfaW50bm9kZV90ICpub2RlOworCXhmc19kYV9ub2RlX2VudHJ5X3QgKmJ0cmVlOworCXhmc19kaXJfbGVhZmJsb2NrX3QgKmxlYWYgPSBOVUxMOworCXhmc19kYWJsa190IGJubywgbmV4dGJubzsKKwl4ZnNfZGFoYXNoX3QgY29va2hhc2g7CisJeGZzX21vdW50X3QgKm1wOworCWludCBlcnJvciwgZW9iLCBpOworCXhmc19kYWJ1Zl90ICpicDsKKwl4ZnNfZGFkZHJfdCBuZXh0ZGE7CisKKwkvKgorCSAqIFBpY2sgdXAgb3VyIGNvbnRleHQuCisJICovCisJbXAgPSBkcC0+aV9tb3VudDsKKwlicCA9IE5VTEw7CisJYm5vID0gWEZTX0RBX0NPT0tJRV9CTk8obXAsIHVpby0+dWlvX29mZnNldCk7CisJY29va2hhc2ggPSBYRlNfREFfQ09PS0lFX0hBU0gobXAsIHVpby0+dWlvX29mZnNldCk7CisKKwl4ZnNfZGlyX3RyYWNlX2dfZHUoIm5vZGU6IHN0YXJ0IiwgZHAsIHVpbyk7CisKKwkvKgorCSAqIFJlLWZpbmQgb3VyIHBsYWNlLCBldmVuIGlmIHdlJ3JlIGNvbmZ1c2VkIGFib3V0IHdoYXQgb3VyIHBsYWNlIGlzLgorCSAqCisJICogRmlyc3Qgd2UgY2hlY2sgdGhlIGJsb2NrIG51bWJlciBmcm9tIHRoZSBtYWdpYyBjb29raWUsIGl0IGlzIGEKKwkgKiBjYWNoZSBvZiB3aGVyZSB3ZSBlbmRlZCBsYXN0IHRpbWUuICBJZiB3ZSBmaW5kIGEgbGVhZiBibG9jaywgYW5kCisJICogdGhlIHN0YXJ0aW5nIGhhc2h2YWwgaW4gdGhhdCBibG9jayBpcyBsZXNzIHRoYW4gb3VyIGRlc2lyZWQKKwkgKiBoYXNodmFsLCB0aGVuIHdlIHJ1biB3aXRoIGl0LgorCSAqLworCWlmIChibm8gPiAwKSB7CisJCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKHRyYW5zLCBkcCwgYm5vLCAtMiwgJmJwLCBYRlNfREFUQV9GT1JLKTsKKwkJaWYgKChlcnJvciAhPSAwKSAmJiAoZXJyb3IgIT0gRUZTQ09SUlVQVEVEKSkKKwkJCXJldHVybihlcnJvcik7CisJCWlmIChicCkKKwkJCWxlYWYgPSBicC0+ZGF0YTsKKwkJaWYgKGJwICYmIElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RJUl9MRUFGX01BR0lDKSB7CisJCQl4ZnNfZGlyX3RyYWNlX2dfZHViKCJub2RlOiBibG9jayBub3QgYSBsZWFmIiwKKwkJCQkJCSAgIGRwLCB1aW8sIGJubyk7CisJCQl4ZnNfZGFfYnJlbHNlKHRyYW5zLCBicCk7CisJCQlicCA9IE5VTEw7CisJCX0KKwkJaWYgKGJwICYmIElOVF9HRVQobGVhZi0+ZW50cmllc1swXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpID4gY29va2hhc2gpIHsKKwkJCXhmc19kaXJfdHJhY2VfZ19kdWIoIm5vZGU6IGxlYWYgaGFzaCB0b28gbGFyZ2UiLAorCQkJCQkJICAgZHAsIHVpbywgYm5vKTsKKwkJCXhmc19kYV9icmVsc2UodHJhbnMsIGJwKTsKKwkJCWJwID0gTlVMTDsKKwkJfQorCQlpZiAoYnAgJiYKKwkJICAgIGNvb2toYXNoID4gSU5UX0dFVChsZWFmLT5lbnRyaWVzW0lOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gMV0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSkgeworCQkJeGZzX2Rpcl90cmFjZV9nX2R1Yigibm9kZTogbGVhZiBoYXNoIHRvbyBzbWFsbCIsCisJCQkJCQkgICBkcCwgdWlvLCBibm8pOworCQkJeGZzX2RhX2JyZWxzZSh0cmFucywgYnApOworCQkJYnAgPSBOVUxMOworCQl9CisJfQorCisJLyoKKwkgKiBJZiB3ZSBkaWQgbm90IGZpbmQgYSBsZWFmIGJsb2NrIGZyb20gdGhlIGJsb2Nrbm8gaW4gdGhlIGNvb2tpZSwKKwkgKiBvciB3ZSB0aGVyZSB3YXMgbm8gYmxvY2tubyBpbiB0aGUgY29va2llIChlZzogZmlyc3QgdGltZSB0aHJ1KSwKKwkgKiB0aGUgd2Ugc3RhcnQgYXQgdGhlIHRvcCBvZiB0aGUgQnRyZWUgYW5kIHJlLWZpbmQgb3VyIGhhc2h2YWwuCisJICovCisJaWYgKGJwID09IE5VTEwpIHsKKwkJeGZzX2Rpcl90cmFjZV9nX2R1KCJub2RlOiBzdGFydCBhdCByb290IiAsIGRwLCB1aW8pOworCQlibm8gPSAwOworCQlmb3IgKDs7KSB7CisJCQllcnJvciA9IHhmc19kYV9yZWFkX2J1Zih0cmFucywgZHAsIGJubywgLTEsICZicCwKKwkJCQkJCSAgICAgICBYRlNfREFUQV9GT1JLKTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4oZXJyb3IpOworCQkJaWYgKGJwID09IE5VTEwpCisJCQkJcmV0dXJuKFhGU19FUlJPUihFRlNDT1JSVVBURUQpKTsKKwkJCW5vZGUgPSBicC0+ZGF0YTsKKwkJCWlmIChJTlRfR0VUKG5vZGUtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpICE9IFhGU19EQV9OT0RFX01BR0lDKQorCQkJCWJyZWFrOworCQkJYnRyZWUgPSAmbm9kZS0+YnRyZWVbMF07CisJCQl4ZnNfZGlyX3RyYWNlX2dfZHVuKCJub2RlOiBub2RlIGRldGFpbCIsIGRwLCB1aW8sIG5vZGUpOworCQkJZm9yIChpID0gMDsgaSA8IElOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOyBidHJlZSsrLCBpKyspIHsKKwkJCQlpZiAoSU5UX0dFVChidHJlZS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA+PSBjb29raGFzaCkgeworCQkJCQlibm8gPSBJTlRfR0VUKGJ0cmVlLT5iZWZvcmUsIEFSQ0hfQ09OVkVSVCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChpID09IElOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKSB7CisJCQkJeGZzX2RhX2JyZWxzZSh0cmFucywgYnApOworCQkJCXhmc19kaXJfdHJhY2VfZ19kdSgibm9kZTogaGFzaCBiZXlvbmQgRU9GIiwKKwkJCQkJCQkgIGRwLCB1aW8pOworCQkJCXVpby0+dWlvX29mZnNldCA9IFhGU19EQV9NQUtFX0NPT0tJRShtcCwgMCwgMCwKKwkJCQkJCQkgICAgIFhGU19EQV9NQVhIQVNIKTsKKwkJCQkqZW9mcCA9IDE7CisJCQkJcmV0dXJuKDApOworCQkJfQorCQkJeGZzX2Rpcl90cmFjZV9nX2R1Yigibm9kZTogZ29pbmcgdG8gYmxvY2siLAorCQkJCQkJICAgZHAsIHVpbywgYm5vKTsKKwkJCXhmc19kYV9icmVsc2UodHJhbnMsIGJwKTsKKwkJfQorCX0KKwlBU1NFUlQoY29va2hhc2ggIT0gWEZTX0RBX01BWEhBU0gpOworCisJLyoKKwkgKiBXZSd2ZSBkcm9wcGVkIGRvd24gdG8gdGhlIChmaXJzdCkgbGVhZiBibG9jayB0aGF0IGNvbnRhaW5zIHRoZQorCSAqIGhhc2h2YWwgd2UgYXJlIGludGVyZXN0ZWQgaW4uICBDb250aW51ZSByb2xsaW5nIHVwd2FyZCB0aHJ1IHRoZQorCSAqIGxlYWYgYmxvY2tzIHVudGlsIHdlIGZpbGwgdXAgb3VyIGJ1ZmZlci4KKwkgKi8KKwlmb3IgKDs7KSB7CisJCWxlYWYgPSBicC0+ZGF0YTsKKwkJaWYgKHVubGlrZWx5KElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RJUl9MRUFGX01BR0lDKSkgeworCQkJeGZzX2Rpcl90cmFjZV9nX2R1bCgibm9kZTogbm90IGEgbGVhZiIsIGRwLCB1aW8sIGxlYWYpOworCQkJeGZzX2RhX2JyZWxzZSh0cmFucywgYnApOworCQkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19kaXJfbm9kZV9nZXRkZW50cygxKSIsCisJCQkJCSAgICAgWEZTX0VSUkxFVkVMX0xPVywgbXAsIGxlYWYpOworCQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQl9CisJCXhmc19kaXJfdHJhY2VfZ19kdWwoIm5vZGU6IGxlYWYgZGV0YWlsIiwgZHAsIHVpbywgbGVhZik7CisJCWlmICgobmV4dGJubyA9IElOVF9HRVQobGVhZi0+aGRyLmluZm8uZm9ydywgQVJDSF9DT05WRVJUKSkpIHsKKwkJCW5leHRkYSA9IHhmc19kYV9yZWFkYV9idWYodHJhbnMsIGRwLCBuZXh0Ym5vLAorCQkJCQkJICBYRlNfREFUQV9GT1JLKTsKKwkJfSBlbHNlCisJCQluZXh0ZGEgPSAtMTsKKwkJZXJyb3IgPSB4ZnNfZGlyX2xlYWZfZ2V0ZGVudHNfaW50KGJwLCBkcCwgYm5vLCB1aW8sICZlb2IsIGRicCwKKwkJCQkJCSAgcHV0LCBuZXh0ZGEpOworCQl4ZnNfZGFfYnJlbHNlKHRyYW5zLCBicCk7CisJCWJubyA9IG5leHRibm87CisJCWlmIChlb2IpIHsKKwkJCXhmc19kaXJfdHJhY2VfZ19kdWIoIm5vZGU6IEUtTy1CIiwgZHAsIHVpbywgYm5vKTsKKwkJCSplb2ZwID0gMDsKKwkJCXJldHVybihlcnJvcik7CisJCX0KKwkJaWYgKGJubyA9PSAwKQorCQkJYnJlYWs7CisJCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKHRyYW5zLCBkcCwgYm5vLCBuZXh0ZGEsICZicCwKKwkJCQkJWEZTX0RBVEFfRk9SSyk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybihlcnJvcik7CisJCWlmICh1bmxpa2VseShicCA9PSBOVUxMKSkgeworCQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2Rpcl9ub2RlX2dldGRlbnRzKDIpIiwKKwkJCQkJIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKKwkJCXJldHVybihYRlNfRVJST1IoRUZTQ09SUlVQVEVEKSk7CisJCX0KKwl9CisJKmVvZnAgPSAxOworCXhmc19kaXJfdHJhY2VfZ19kdSgibm9kZTogRS1PLUYiLCBkcCwgdWlvKTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBMb29rIHVwIGEgZmlsZW5hbWUgaW4gYW4gaW50IGRpcmVjdG9yeSwgcmVwbGFjZSB0aGUgaW5vZGUgbnVtYmVyLgorICogVXNlIGFuIGludGVybmFsIHJvdXRpbmUgdG8gYWN0dWFsbHkgZG8gdGhlIGxvb2t1cC4KKyAqLworU1RBVElDIGludAoreGZzX2Rpcl9ub2RlX3JlcGxhY2UoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwl4ZnNfZGFfc3RhdGVfdCAqc3RhdGU7CisJeGZzX2RhX3N0YXRlX2Jsa190ICpibGs7CisJeGZzX2Rpcl9sZWFmYmxvY2tfdCAqbGVhZjsKKwl4ZnNfZGlyX2xlYWZfZW50cnlfdCAqZW50cnk7CisJeGZzX2Rpcl9sZWFmX25hbWVfdCAqbmFtZXN0OworCXhmc19pbm9fdCBpbnVtOworCWludCByZXR2YWwsIGVycm9yLCBpOworCXhmc19kYWJ1Zl90ICpicDsKKworCXN0YXRlID0geGZzX2RhX3N0YXRlX2FsbG9jKCk7CisJc3RhdGUtPmFyZ3MgPSBhcmdzOworCXN0YXRlLT5tcCA9IGFyZ3MtPmRwLT5pX21vdW50OworCXN0YXRlLT5ibG9ja3NpemUgPSBzdGF0ZS0+bXAtPm1fc2Iuc2JfYmxvY2tzaXplOworCXN0YXRlLT5ub2RlX2VudHMgPSBzdGF0ZS0+bXAtPm1fZGlyX25vZGVfZW50czsKKwlpbnVtID0gYXJncy0+aW51bWJlcjsKKworCS8qCisJICogU2VhcmNoIHRvIHNlZSBpZiBuYW1lIGV4aXN0cywKKwkgKiBhbmQgZ2V0IGJhY2sgYSBwb2ludGVyIHRvIGl0LgorCSAqLworCWVycm9yID0geGZzX2RhX25vZGVfbG9va3VwX2ludChzdGF0ZSwgJnJldHZhbCk7CisJaWYgKGVycm9yKSB7CisJCXJldHZhbCA9IGVycm9yOworCX0KKworCWlmIChyZXR2YWwgPT0gRUVYSVNUKSB7CisJCWJsayA9ICZzdGF0ZS0+cGF0aC5ibGtbc3RhdGUtPnBhdGguYWN0aXZlIC0gMV07CisJCUFTU0VSVChibGstPm1hZ2ljID09IFhGU19ESVJfTEVBRl9NQUdJQyk7CisJCWJwID0gYmxrLT5icDsKKwkJbGVhZiA9IGJwLT5kYXRhOworCQllbnRyeSA9ICZsZWFmLT5lbnRyaWVzW2Jsay0+aW5kZXhdOworCQluYW1lc3QgPSBYRlNfRElSX0xFQUZfTkFNRVNUUlVDVChsZWFmLCBJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpKTsKKwkJLyogWFhYIC0gcmVwbGFjZSBhc3NlcnQgPyAqLworCQlYRlNfRElSX1NGX1BVVF9ESVJJTk8oJmludW0sICZuYW1lc3QtPmludW1iZXIpOworCQl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAsCisJCSAgICBYRlNfREFfTE9HUkFOR0UobGVhZiwgbmFtZXN0LCBzaXplb2YobmFtZXN0LT5pbnVtYmVyKSkpOworCQl4ZnNfZGFfYnVmX2RvbmUoYnApOworCQlibGstPmJwID0gTlVMTDsKKwkJcmV0dmFsID0gMDsKKwl9IGVsc2UgeworCQlpID0gc3RhdGUtPnBhdGguYWN0aXZlIC0gMTsKKwkJeGZzX2RhX2JyZWxzZShhcmdzLT50cmFucywgc3RhdGUtPnBhdGguYmxrW2ldLmJwKTsKKwkJc3RhdGUtPnBhdGguYmxrW2ldLmJwID0gTlVMTDsKKwl9CisJZm9yIChpID0gMDsgaSA8IHN0YXRlLT5wYXRoLmFjdGl2ZSAtIDE7IGkrKykgeworCQl4ZnNfZGFfYnJlbHNlKGFyZ3MtPnRyYW5zLCBzdGF0ZS0+cGF0aC5ibGtbaV0uYnApOworCQlzdGF0ZS0+cGF0aC5ibGtbaV0uYnAgPSBOVUxMOworCX0KKworCXhmc19kYV9zdGF0ZV9mcmVlKHN0YXRlKTsKKwlyZXR1cm4ocmV0dmFsKTsKK30KKworI2lmIGRlZmluZWQoWEZTX0RJUl9UUkFDRSkKKy8qCisgKiBBZGQgYSB0cmFjZSBidWZmZXIgZW50cnkgZm9yIGFuIGlub2RlIGFuZCBhIHVpby4KKyAqLwordm9pZAoreGZzX2Rpcl90cmFjZV9nX2R1KGNoYXIgKndoZXJlLCB4ZnNfaW5vZGVfdCAqZHAsIHVpb190ICp1aW8pCit7CisJeGZzX2Rpcl90cmFjZV9lbnRlcihYRlNfRElSX0tUUkFDRV9HX0RVLCB3aGVyZSwKKwkJICAgICAodm9pZCAqKWRwLCAodm9pZCAqKWRwLT5pX21vdW50LAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKSh1aW8tPnVpb19vZmZzZXQgPj4gMzIpKSwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykodWlvLT51aW9fb2Zmc2V0ICYgMHhGRkZGRkZGRikpLAorCQkgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpdWlvLT51aW9fcmVzaWQsCisJCSAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qCisgKiBBZGQgYSB0cmFjZSBidWZmZXIgZW50cnkgZm9yIGFuIGlub2RlIGFuZCBhIHVpby4KKyAqLwordm9pZAoreGZzX2Rpcl90cmFjZV9nX2R1YihjaGFyICp3aGVyZSwgeGZzX2lub2RlX3QgKmRwLCB1aW9fdCAqdWlvLCB4ZnNfZGFibGtfdCBibm8pCit7CisJeGZzX2Rpcl90cmFjZV9lbnRlcihYRlNfRElSX0tUUkFDRV9HX0RVQiwgd2hlcmUsCisJCSAgICAgKHZvaWQgKilkcCwgKHZvaWQgKilkcC0+aV9tb3VudCwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykodWlvLT51aW9fb2Zmc2V0ID4+IDMyKSksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKHVpby0+dWlvX29mZnNldCAmIDB4RkZGRkZGRkYpKSwKKwkJICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXVpby0+dWlvX3Jlc2lkLAorCQkgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpYm5vLAorCQkgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhbiBpbm9kZSBhbmQgYSB1aW8uCisgKi8KK3ZvaWQKK3hmc19kaXJfdHJhY2VfZ19kdW4oY2hhciAqd2hlcmUsIHhmc19pbm9kZV90ICpkcCwgdWlvX3QgKnVpbywKKwkJCXhmc19kYV9pbnRub2RlX3QgKm5vZGUpCit7CisJaW50CWxhc3QgPSBJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIDE7CisKKwl4ZnNfZGlyX3RyYWNlX2VudGVyKFhGU19ESVJfS1RSQUNFX0dfRFVOLCB3aGVyZSwKKwkJICAgICAodm9pZCAqKWRwLCAodm9pZCAqKWRwLT5pX21vdW50LAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKSh1aW8tPnVpb19vZmZzZXQgPj4gMzIpKSwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykodWlvLT51aW9fb2Zmc2V0ICYgMHhGRkZGRkZGRikpLAorCQkgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpdWlvLT51aW9fcmVzaWQsCisJCSAgICAgKHZvaWQgKikodW5zaWduZWQgbG9uZykKKwkJCUlOVF9HRVQobm9kZS0+aGRyLmluZm8uZm9ydywgQVJDSF9DT05WRVJUKSwKKwkJICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKQorCQkJSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCksCisJCSAgICAgKHZvaWQgKikodW5zaWduZWQgbG9uZykKKwkJCUlOVF9HRVQobm9kZS0+YnRyZWVbMF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSwKKwkJICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKQorCQkJSU5UX0dFVChub2RlLT5idHJlZVtsYXN0XS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpLAorCQkgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhbiBpbm9kZSBhbmQgYSB1aW8uCisgKi8KK3ZvaWQKK3hmc19kaXJfdHJhY2VfZ19kdWwoY2hhciAqd2hlcmUsIHhmc19pbm9kZV90ICpkcCwgdWlvX3QgKnVpbywKKwkJCXhmc19kaXJfbGVhZmJsb2NrX3QgKmxlYWYpCit7CisJaW50CWxhc3QgPSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIDE7CisKKwl4ZnNfZGlyX3RyYWNlX2VudGVyKFhGU19ESVJfS1RSQUNFX0dfRFVMLCB3aGVyZSwKKwkJICAgICAodm9pZCAqKWRwLCAodm9pZCAqKWRwLT5pX21vdW50LAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKSh1aW8tPnVpb19vZmZzZXQgPj4gMzIpKSwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykodWlvLT51aW9fb2Zmc2V0ICYgMHhGRkZGRkZGRikpLAorCQkgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpdWlvLT51aW9fcmVzaWQsCisJCSAgICAgKHZvaWQgKikodW5zaWduZWQgbG9uZykKKwkJCUlOVF9HRVQobGVhZi0+aGRyLmluZm8uZm9ydywgQVJDSF9DT05WRVJUKSwKKwkJICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKQorCQkJSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCksCisJCSAgICAgKHZvaWQgKikodW5zaWduZWQgbG9uZykKKwkJCUlOVF9HRVQobGVhZi0+ZW50cmllc1swXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpLAorCQkgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpCisJCQlJTlRfR0VUKGxlYWYtPmVudHJpZXNbbGFzdF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSwKKwkJICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworLyoKKyAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgYW4gaW5vZGUgYW5kIGEgdWlvLgorICovCit2b2lkCit4ZnNfZGlyX3RyYWNlX2dfZHVlKGNoYXIgKndoZXJlLCB4ZnNfaW5vZGVfdCAqZHAsIHVpb190ICp1aW8sCisJCQl4ZnNfZGlyX2xlYWZfZW50cnlfdCAqZW50cnkpCit7CisJeGZzX2Rpcl90cmFjZV9lbnRlcihYRlNfRElSX0tUUkFDRV9HX0RVRSwgd2hlcmUsCisJCSAgICAgKHZvaWQgKilkcCwgKHZvaWQgKilkcC0+aV9tb3VudCwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykodWlvLT51aW9fb2Zmc2V0ID4+IDMyKSksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKHVpby0+dWlvX29mZnNldCAmIDB4RkZGRkZGRkYpKSwKKwkJICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXVpby0+dWlvX3Jlc2lkLAorCQkgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpCisJCQlJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpLAorCQkgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhbiBpbm9kZSBhbmQgYSB1aW8uCisgKi8KK3ZvaWQKK3hmc19kaXJfdHJhY2VfZ19kdWMoY2hhciAqd2hlcmUsIHhmc19pbm9kZV90ICpkcCwgdWlvX3QgKnVpbywgeGZzX29mZl90IGNvb2tpZSkKK3sKKwl4ZnNfZGlyX3RyYWNlX2VudGVyKFhGU19ESVJfS1RSQUNFX0dfRFVDLCB3aGVyZSwKKwkJICAgICAodm9pZCAqKWRwLCAodm9pZCAqKWRwLT5pX21vdW50LAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKSh1aW8tPnVpb19vZmZzZXQgPj4gMzIpKSwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykodWlvLT51aW9fb2Zmc2V0ICYgMHhGRkZGRkZGRikpLAorCQkgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpdWlvLT51aW9fcmVzaWQsCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGNvb2tpZSA+PiAzMikpLAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKShjb29raWUgJiAweEZGRkZGRkZGKSksCisJCSAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qCisgKiBBZGQgYSB0cmFjZSBidWZmZXIgZW50cnkgZm9yIHRoZSBhcmd1bWVudHMgZ2l2ZW4gdG8gdGhlIHJvdXRpbmUsCisgKiBnZW5lcmljIGZvcm0uCisgKi8KK3ZvaWQKK3hmc19kaXJfdHJhY2VfZW50ZXIoaW50IHR5cGUsIGNoYXIgKndoZXJlLAorCQkJdm9pZCAqIGEwLCB2b2lkICogYTEsCisJCQl2b2lkICogYTIsIHZvaWQgKiBhMywKKwkJCXZvaWQgKiBhNCwgdm9pZCAqIGE1LAorCQkJdm9pZCAqIGE2LCB2b2lkICogYTcsCisJCQl2b2lkICogYTgsIHZvaWQgKiBhOSwKKwkJCXZvaWQgKiBhMTAsIHZvaWQgKiBhMTEpCit7CisJQVNTRVJUKHhmc19kaXJfdHJhY2VfYnVmKTsKKwlrdHJhY2VfZW50ZXIoeGZzX2Rpcl90cmFjZV9idWYsICh2b2lkICopKHVuc2lnbmVkIGxvbmcpdHlwZSwKKwkJCQkJKHZvaWQgKil3aGVyZSwKKwkJCQkJKHZvaWQgKilhMCwgKHZvaWQgKilhMSwgKHZvaWQgKilhMiwKKwkJCQkJKHZvaWQgKilhMywgKHZvaWQgKilhNCwgKHZvaWQgKilhNSwKKwkJCQkJKHZvaWQgKilhNiwgKHZvaWQgKilhNywgKHZvaWQgKilhOCwKKwkJCQkJKHZvaWQgKilhOSwgKHZvaWQgKilhMTAsICh2b2lkICopYTExLAorCQkJCQlOVUxMLCBOVUxMKTsKK30KKyNlbmRpZgkvKiBYRlNfRElSX1RSQUNFICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Rpci5oIGIvZnMveGZzL3hmc19kaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGJjOWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19kaXIuaApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0RJUl9IX18KKyNkZWZpbmUJX19YRlNfRElSX0hfXworCisvKgorICogTGFyZ2UgZGlyZWN0b3JpZXMgYXJlIHN0cnVjdHVyZWQgYXJvdW5kIEJ0cmVlcyB3aGVyZSBhbGwgdGhlIGRhdGEKKyAqIGVsZW1lbnRzIGFyZSBpbiB0aGUgbGVhZiBub2Rlcy4gIEZpbGVuYW1lcyBhcmUgaGFzaGVkIGludG8gYW4gaW50LAorICogdGhlbiB0aGF0IGludCBpcyB1c2VkIGFzIHRoZSBpbmRleCBpbnRvIHRoZSBCdHJlZS4gIFNpbmNlIHRoZSBoYXNodmFsCisgKiBvZiBhIGZpbGVuYW1lIG1heSBub3QgYmUgdW5pcXVlLCB3ZSBtYXkgaGF2ZSBkdXBsaWNhdGUga2V5cy4gIFRoZQorICogaW50ZXJuYWwgbGlua3MgaW4gdGhlIEJ0cmVlIGFyZSBsb2dpY2FsIGJsb2NrIG9mZnNldHMgaW50byB0aGUgZmlsZS4KKyAqCisgKiBTbWFsbCBkaXJlY3RvcmllcyB1c2UgYSBkaWZmZXJlbnQgZm9ybWF0IGFuZCBhcmUgcGFja2VkIGFzIHRpZ2h0bHkKKyAqIGFzIHBvc3NpYmxlIHNvIGFzIHRvIGZpdCBpbnRvIHRoZSBsaXRlcmFsIGFyZWEgb2YgdGhlIGlub2RlLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZvciB0aGUga2VybmVsLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdHJ1Y3QgdWlvOworc3RydWN0IHhmc19ibWFwX2ZyZWU7CitzdHJ1Y3QgeGZzX2RhX2FyZ3M7CitzdHJ1Y3QgeGZzX2Rpbm9kZTsKK3N0cnVjdCB4ZnNfaW5vZGU7CitzdHJ1Y3QgeGZzX21vdW50Oworc3RydWN0IHhmc190cmFuczsKKworLyoKKyAqIERpcmVjdG9yeSBmdW5jdGlvbiB0eXBlcy4KKyAqIFB1dCBpbiBzdHJ1Y3R1cmVzICh4ZnNfZGlyb3BzX3QpIGZvciB2MSBhbmQgdjIgZGlyZWN0b3JpZXMuCisgKi8KK3R5cGVkZWYgdm9pZAkoKnhmc19kaXJfbW91bnRfdCkoc3RydWN0IHhmc19tb3VudCAqbXApOwordHlwZWRlZiBpbnQJKCp4ZnNfZGlyX2lzZW1wdHlfdCkoc3RydWN0IHhmc19pbm9kZSAqZHApOwordHlwZWRlZiBpbnQJKCp4ZnNfZGlyX2luaXRfdCkoc3RydWN0IHhmc190cmFucyAqdHAsCisJCQkJICBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKKwkJCQkgIHN0cnVjdCB4ZnNfaW5vZGUgKnBkcCk7Cit0eXBlZGVmIGludAkoKnhmc19kaXJfY3JlYXRlbmFtZV90KShzdHJ1Y3QgeGZzX3RyYW5zICp0cCwKKwkJCQkJc3RydWN0IHhmc19pbm9kZSAqZHAsCisJCQkJCWNoYXIgKm5hbWUsCisJCQkJCWludCBuYW1lbGVuLAorCQkJCQl4ZnNfaW5vX3QgaW51bSwKKwkJCQkJeGZzX2ZzYmxvY2tfdCAqZmlyc3QsCisJCQkJCXN0cnVjdCB4ZnNfYm1hcF9mcmVlICpmbGlzdCwKKwkJCQkJeGZzX2V4dGxlbl90IHRvdGFsKTsKK3R5cGVkZWYgaW50CSgqeGZzX2Rpcl9sb29rdXBfdCkoc3RydWN0IHhmc190cmFucyAqdHAsCisJCQkJICAgIHN0cnVjdCB4ZnNfaW5vZGUgKmRwLAorCQkJCSAgICBjaGFyICpuYW1lLAorCQkJCSAgICBpbnQgbmFtZWxlbiwKKwkJCQkgICAgeGZzX2lub190ICppbnVtKTsKK3R5cGVkZWYgaW50CSgqeGZzX2Rpcl9yZW1vdmVuYW1lX3QpKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLAorCQkJCQlzdHJ1Y3QgeGZzX2lub2RlICpkcCwKKwkJCQkJY2hhciAqbmFtZSwKKwkJCQkJaW50IG5hbWVsZW4sCisJCQkJCXhmc19pbm9fdCBpbm8sCisJCQkJCXhmc19mc2Jsb2NrX3QgKmZpcnN0LAorCQkJCQlzdHJ1Y3QgeGZzX2JtYXBfZnJlZSAqZmxpc3QsCisJCQkJCXhmc19leHRsZW5fdCB0b3RhbCk7Cit0eXBlZGVmIGludAkoKnhmc19kaXJfZ2V0ZGVudHNfdCkoc3RydWN0IHhmc190cmFucyAqdHAsCisJCQkJICAgICAgc3RydWN0IHhmc19pbm9kZSAqZHAsCisJCQkJICAgICAgc3RydWN0IHVpbyAqdWlvLAorCQkJCSAgICAgIGludCAqZW9mcCk7Cit0eXBlZGVmIGludAkoKnhmc19kaXJfcmVwbGFjZV90KShzdHJ1Y3QgeGZzX3RyYW5zICp0cCwKKwkJCQkgICAgIHN0cnVjdCB4ZnNfaW5vZGUgKmRwLAorCQkJCSAgICAgY2hhciAqbmFtZSwKKwkJCQkgICAgIGludCBuYW1lbGVuLAorCQkJCSAgICAgeGZzX2lub190IGludW0sCisJCQkJICAgICB4ZnNfZnNibG9ja190ICpmaXJzdCwKKwkJCQkgICAgIHN0cnVjdCB4ZnNfYm1hcF9mcmVlICpmbGlzdCwKKwkJCQkgICAgIHhmc19leHRsZW5fdCB0b3RhbCk7Cit0eXBlZGVmIGludAkoKnhmc19kaXJfY2FuZW50ZXJfdCkoc3RydWN0IHhmc190cmFucyAqdHAsCisJCQkJICAgICAgc3RydWN0IHhmc19pbm9kZSAqZHAsCisJCQkJICAgICAgY2hhciAqbmFtZSwKKwkJCQkgICAgICBpbnQgbmFtZWxlbik7Cit0eXBlZGVmIGludAkoKnhmc19kaXJfc2hvcnRmb3JtX3ZhbGlkYXRlX29uZGlza190KShzdHJ1Y3QgeGZzX21vdW50ICptcCwKKwkJCQkJCSAgICAgICBzdHJ1Y3QgeGZzX2Rpbm9kZSAqZGlwKTsKK3R5cGVkZWYgaW50CSgqeGZzX2Rpcl9zaG9ydGZvcm1fdG9fc2luZ2xlX3QpKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CisKK3R5cGVkZWYgc3RydWN0IHhmc19kaXJvcHMgeworCXhmc19kaXJfbW91bnRfdAkJCQl4ZF9tb3VudDsKKwl4ZnNfZGlyX2lzZW1wdHlfdAkJCXhkX2lzZW1wdHk7CisJeGZzX2Rpcl9pbml0X3QJCQkJeGRfaW5pdDsKKwl4ZnNfZGlyX2NyZWF0ZW5hbWVfdAkJCXhkX2NyZWF0ZW5hbWU7CisJeGZzX2Rpcl9sb29rdXBfdAkJCXhkX2xvb2t1cDsKKwl4ZnNfZGlyX3JlbW92ZW5hbWVfdAkJCXhkX3JlbW92ZW5hbWU7CisJeGZzX2Rpcl9nZXRkZW50c190CQkJeGRfZ2V0ZGVudHM7CisJeGZzX2Rpcl9yZXBsYWNlX3QJCQl4ZF9yZXBsYWNlOworCXhmc19kaXJfY2FuZW50ZXJfdAkJCXhkX2NhbmVudGVyOworCXhmc19kaXJfc2hvcnRmb3JtX3ZhbGlkYXRlX29uZGlza190CXhkX3Nob3J0Zm9ybV92YWxpZGF0ZV9vbmRpc2s7CisJeGZzX2Rpcl9zaG9ydGZvcm1fdG9fc2luZ2xlX3QJCXhkX3Nob3J0Zm9ybV90b19zaW5nbGU7Cit9IHhmc19kaXJvcHNfdDsKKworLyoKKyAqIE92ZXJhbGwgZXh0ZXJuYWwgaW50ZXJmYWNlIHJvdXRpbmVzLgorICovCit2b2lkCXhmc19kaXJfc3RhcnR1cCh2b2lkKTsJLyogY2FsbGVkIGV4YWN0bHkgb25jZSAqLworCisjZGVmaW5lCVhGU19ESVJfTU9VTlQobXApCVwKKwkoKG1wKS0+bV9kaXJvcHMueGRfbW91bnQobXApKQorI2RlZmluZQlYRlNfRElSX0lTRU1QVFkobXAsZHApCVwKKwkoKG1wKS0+bV9kaXJvcHMueGRfaXNlbXB0eShkcCkpCisjZGVmaW5lCVhGU19ESVJfSU5JVChtcCx0cCxkcCxwZHApCVwKKwkoKG1wKS0+bV9kaXJvcHMueGRfaW5pdCh0cCxkcCxwZHApKQorI2RlZmluZQlYRlNfRElSX0NSRUFURU5BTUUobXAsdHAsZHAsbmFtZSxuYW1lbGVuLGludW0sZmlyc3QsZmxpc3QsdG90YWwpIFwKKwkoKG1wKS0+bV9kaXJvcHMueGRfY3JlYXRlbmFtZSh0cCxkcCxuYW1lLG5hbWVsZW4saW51bSxmaXJzdCxmbGlzdCxcCisJCQkJICAgICAgdG90YWwpKQorI2RlZmluZQlYRlNfRElSX0xPT0tVUChtcCx0cCxkcCxuYW1lLG5hbWVsZW4saW51bSkJXAorCSgobXApLT5tX2Rpcm9wcy54ZF9sb29rdXAodHAsZHAsbmFtZSxuYW1lbGVuLGludW0pKQorI2RlZmluZQlYRlNfRElSX1JFTU9WRU5BTUUobXAsdHAsZHAsbmFtZSxuYW1lbGVuLGlubyxmaXJzdCxmbGlzdCx0b3RhbCkJXAorCSgobXApLT5tX2Rpcm9wcy54ZF9yZW1vdmVuYW1lKHRwLGRwLG5hbWUsbmFtZWxlbixpbm8sZmlyc3QsZmxpc3QsdG90YWwpKQorI2RlZmluZQlYRlNfRElSX0dFVERFTlRTKG1wLHRwLGRwLHVpbyxlb2ZwKQlcCisJKChtcCktPm1fZGlyb3BzLnhkX2dldGRlbnRzKHRwLGRwLHVpbyxlb2ZwKSkKKyNkZWZpbmUJWEZTX0RJUl9SRVBMQUNFKG1wLHRwLGRwLG5hbWUsbmFtZWxlbixpbnVtLGZpcnN0LGZsaXN0LHRvdGFsKQlcCisJKChtcCktPm1fZGlyb3BzLnhkX3JlcGxhY2UodHAsZHAsbmFtZSxuYW1lbGVuLGludW0sZmlyc3QsZmxpc3QsdG90YWwpKQorI2RlZmluZQlYRlNfRElSX0NBTkVOVEVSKG1wLHRwLGRwLG5hbWUsbmFtZWxlbikJXAorCSgobXApLT5tX2Rpcm9wcy54ZF9jYW5lbnRlcih0cCxkcCxuYW1lLG5hbWVsZW4pKQorI2RlZmluZQlYRlNfRElSX1NIT1JURk9STV9WQUxJREFURV9PTkRJU0sobXAsZGlwKQlcCisJKChtcCktPm1fZGlyb3BzLnhkX3Nob3J0Zm9ybV92YWxpZGF0ZV9vbmRpc2sobXAsZGlwKSkKKyNkZWZpbmUJWEZTX0RJUl9TSE9SVEZPUk1fVE9fU0lOR0xFKG1wLGFyZ3MpCVwKKwkoKG1wKS0+bV9kaXJvcHMueGRfc2hvcnRmb3JtX3RvX3NpbmdsZShhcmdzKSkKKworI2RlZmluZQlYRlNfRElSX0lTX1YxKG1wKQkoKG1wKS0+bV9kaXJ2ZXJzaW9uID09IDEpCitleHRlcm4geGZzX2Rpcm9wc190IHhmc3YxX2Rpcm9wczsKKworI2VuZGlmCS8qIF9fWEZTX0RJUl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMi5jIGIvZnMveGZzL3hmc19kaXIyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmYzBhMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZGlyMi5jCkBAIC0wLDAgKzEsODU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisvKgorICogWEZTIHYyIGRpcmVjdG9yeSBpbXBsbWVudGF0aW9uLgorICogVG9wLWxldmVsIGFuZCB1dGlsaXR5IHJvdXRpbmVzLgorICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKworI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX2xlYWYuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9kYXRhLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfbGVhZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX2Jsb2NrLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfbm9kZS5oIgorI2luY2x1ZGUgInhmc19kaXIyX3RyYWNlLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorCisvKgorICogRGVjbGFyYXRpb25zIGZvciBpbnRlcmZhY2Ugcm91dGluZXMuCisgKi8KK3N0YXRpYyB2b2lkCXhmc19kaXIyX21vdW50KHhmc19tb3VudF90ICptcCk7CitzdGF0aWMgaW50CXhmc19kaXIyX2lzZW1wdHkoeGZzX2lub2RlX3QgKmRwKTsKK3N0YXRpYyBpbnQJeGZzX2RpcjJfaW5pdCh4ZnNfdHJhbnNfdCAqdHAsIHhmc19pbm9kZV90ICpkcCwKKwkJCSAgICAgIHhmc19pbm9kZV90ICpwZHApOworc3RhdGljIGludAl4ZnNfZGlyMl9jcmVhdGVuYW1lKHhmc190cmFuc190ICp0cCwgeGZzX2lub2RlX3QgKmRwLAorCQkJCSAgICBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgeGZzX2lub190IGludW0sCisJCQkJICAgIHhmc19mc2Jsb2NrX3QgKmZpcnN0LAorCQkJCSAgICB4ZnNfYm1hcF9mcmVlX3QgKmZsaXN0LCB4ZnNfZXh0bGVuX3QgdG90YWwpOworc3RhdGljIGludAl4ZnNfZGlyMl9sb29rdXAoeGZzX3RyYW5zX3QgKnRwLCB4ZnNfaW5vZGVfdCAqZHAsIGNoYXIgKm5hbWUsCisJCQkJaW50IG5hbWVsZW4sIHhmc19pbm9fdCAqaW51bSk7CitzdGF0aWMgaW50CXhmc19kaXIyX3JlbW92ZW5hbWUoeGZzX3RyYW5zX3QgKnRwLCB4ZnNfaW5vZGVfdCAqZHAsCisJCQkJICAgIGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCB4ZnNfaW5vX3QgaW5vLAorCQkJCSAgICB4ZnNfZnNibG9ja190ICpmaXJzdCwKKwkJCQkgICAgeGZzX2JtYXBfZnJlZV90ICpmbGlzdCwgeGZzX2V4dGxlbl90IHRvdGFsKTsKK3N0YXRpYyBpbnQJeGZzX2RpcjJfZ2V0ZGVudHMoeGZzX3RyYW5zX3QgKnRwLCB4ZnNfaW5vZGVfdCAqZHAsIHVpb190ICp1aW8sCisJCQkJICBpbnQgKmVvZnApOworc3RhdGljIGludAl4ZnNfZGlyMl9yZXBsYWNlKHhmc190cmFuc190ICp0cCwgeGZzX2lub2RlX3QgKmRwLCBjaGFyICpuYW1lLAorCQkJCSBpbnQgbmFtZWxlbiwgeGZzX2lub190IGludW0sCisJCQkJIHhmc19mc2Jsb2NrX3QgKmZpcnN0LCB4ZnNfYm1hcF9mcmVlX3QgKmZsaXN0LAorCQkJCSB4ZnNfZXh0bGVuX3QgdG90YWwpOworc3RhdGljIGludAl4ZnNfZGlyMl9jYW5lbnRlcih4ZnNfdHJhbnNfdCAqdHAsIHhmc19pbm9kZV90ICpkcCwgY2hhciAqbmFtZSwKKwkJCQkgIGludCBuYW1lbGVuKTsKK3N0YXRpYyBpbnQJeGZzX2RpcjJfc2hvcnRmb3JtX3ZhbGlkYXRlX29uZGlzayh4ZnNfbW91bnRfdCAqbXAsCisJCQkJCQkgICB4ZnNfZGlub2RlX3QgKmRpcCk7CisKKy8qCisgKiBVdGlsaXR5IHJvdXRpbmUgZGVjbGFyYXRpb25zLgorICovCitzdGF0aWMgaW50CXhmc19kaXIyX3B1dF9kaXJlbnQ2NF9kaXJlY3QoeGZzX2RpcjJfcHV0X2FyZ3NfdCAqcGEpOworc3RhdGljIGludAl4ZnNfZGlyMl9wdXRfZGlyZW50NjRfdWlvKHhmc19kaXIyX3B1dF9hcmdzX3QgKnBhKTsKKworLyoKKyAqIERpcmVjdG9yeSBvcGVyYXRpb25zIHZlY3Rvci4KKyAqLworeGZzX2Rpcm9wc190CXhmc3YyX2Rpcm9wcyA9IHsKKwkueGRfbW91bnQJCQk9IHhmc19kaXIyX21vdW50LAorCS54ZF9pc2VtcHR5CQkJPSB4ZnNfZGlyMl9pc2VtcHR5LAorCS54ZF9pbml0CQkJPSB4ZnNfZGlyMl9pbml0LAorCS54ZF9jcmVhdGVuYW1lCQkJPSB4ZnNfZGlyMl9jcmVhdGVuYW1lLAorCS54ZF9sb29rdXAJCQk9IHhmc19kaXIyX2xvb2t1cCwKKwkueGRfcmVtb3ZlbmFtZQkJCT0geGZzX2RpcjJfcmVtb3ZlbmFtZSwKKwkueGRfZ2V0ZGVudHMJCQk9IHhmc19kaXIyX2dldGRlbnRzLAorCS54ZF9yZXBsYWNlCQkJPSB4ZnNfZGlyMl9yZXBsYWNlLAorCS54ZF9jYW5lbnRlcgkJCT0geGZzX2RpcjJfY2FuZW50ZXIsCisJLnhkX3Nob3J0Zm9ybV92YWxpZGF0ZV9vbmRpc2sJPSB4ZnNfZGlyMl9zaG9ydGZvcm1fdmFsaWRhdGVfb25kaXNrLAorCS54ZF9zaG9ydGZvcm1fdG9fc2luZ2xlCQk9IHhmc19kaXIyX3NmX3RvX2Jsb2NrLAorfTsKKworLyoKKyAqIEludGVyZmFjZSByb3V0aW5lcy4KKyAqLworCisvKgorICogSW5pdGlhbGl6ZSBkaXJlY3RvcnktcmVsYXRlZCBmaWVsZHMgaW4gdGhlIG1vdW50IHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQKK3hmc19kaXIyX21vdW50KAorCXhmc19tb3VudF90CSptcCkJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KK3sKKwltcC0+bV9kaXJ2ZXJzaW9uID0gMjsKKwlBU1NFUlQoKDEgPDwgKG1wLT5tX3NiLnNiX2Jsb2NrbG9nICsgbXAtPm1fc2Iuc2JfZGlyYmxrbG9nKSkgPD0KKwkgICAgICAgWEZTX01BWF9CTE9DS1NJWkUpOworCW1wLT5tX2RpcmJsa3NpemUgPSAxIDw8IChtcC0+bV9zYi5zYl9ibG9ja2xvZyArIG1wLT5tX3NiLnNiX2RpcmJsa2xvZyk7CisJbXAtPm1fZGlyYmxrZnNicyA9IDEgPDwgbXAtPm1fc2Iuc2JfZGlyYmxrbG9nOworCW1wLT5tX2RpcmRhdGFibGsgPSBYRlNfRElSMl9EQl9UT19EQShtcCwgWEZTX0RJUjJfREFUQV9GSVJTVERCKG1wKSk7CisJbXAtPm1fZGlybGVhZmJsayA9IFhGU19ESVIyX0RCX1RPX0RBKG1wLCBYRlNfRElSMl9MRUFGX0ZJUlNUREIobXApKTsKKwltcC0+bV9kaXJmcmVlYmxrID0gWEZTX0RJUjJfREJfVE9fREEobXAsIFhGU19ESVIyX0ZSRUVfRklSU1REQihtcCkpOworCW1wLT5tX2F0dHJfbm9kZV9lbnRzID0KKwkJKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSAtICh1aW50KXNpemVvZih4ZnNfZGFfbm9kZV9oZHJfdCkpIC8KKwkJKHVpbnQpc2l6ZW9mKHhmc19kYV9ub2RlX2VudHJ5X3QpOworCW1wLT5tX2Rpcl9ub2RlX2VudHMgPQorCQkobXAtPm1fZGlyYmxrc2l6ZSAtICh1aW50KXNpemVvZih4ZnNfZGFfbm9kZV9oZHJfdCkpIC8KKwkJKHVpbnQpc2l6ZW9mKHhmc19kYV9ub2RlX2VudHJ5X3QpOworCW1wLT5tX2Rpcl9tYWdpY3BjdCA9IChtcC0+bV9kaXJibGtzaXplICogMzcpIC8gMTAwOworfQorCisvKgorICogUmV0dXJuIDEgaWYgZGlyZWN0b3J5IGNvbnRhaW5zIG9ubHkgIi4iIGFuZCAiLi4iLgorICovCitzdGF0aWMgaW50CQkJCS8qIHJldHVybiBjb2RlICovCit4ZnNfZGlyMl9pc2VtcHR5KAorCXhmc19pbm9kZV90CSpkcCkJCS8qIGluY29yZSBpbm9kZSBzdHJ1Y3R1cmUgKi8KK3sKKwl4ZnNfZGlyMl9zZl90CSpzZnA7CQkvKiBzaG9ydGZvcm0gZGlyZWN0b3J5IHN0cnVjdHVyZSAqLworCisJQVNTRVJUKChkcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZESVIpOworCS8qCisJICogTWlnaHQgaGFwcGVuIGR1cmluZyBzaHV0ZG93bi4KKwkgKi8KKwlpZiAoZHAtPmlfZC5kaV9zaXplID09IDApIHsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChkcC0+aV9kLmRpX3NpemUgPiBYRlNfSUZPUktfRFNJWkUoZHApKQorCQlyZXR1cm4gMDsKKwlzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJcmV0dXJuICFzZnAtPmhkci5jb3VudDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgYSBkaXJlY3Rvcnkgd2l0aCBpdHMgIi4iIGFuZCAiLi4iIGVudHJpZXMuCisgKi8KK3N0YXRpYyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX2luaXQoCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9kZV90CSpkcCwJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwl4ZnNfaW5vZGVfdAkqcGRwKQkJLyogaW5jb3JlIHBhcmVudCBkaXJlY3RvcnkgaW5vZGUgKi8KK3sKKwl4ZnNfZGFfYXJnc190CWFyZ3M7CQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCisJbWVtc2V0KChjaGFyICopJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisJYXJncy5kcCA9IGRwOworCWFyZ3MudHJhbnMgPSB0cDsKKwlBU1NFUlQoKGRwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUik7CisJaWYgKChlcnJvciA9IHhmc19kaXJfaW5vX3ZhbGlkYXRlKHRwLT50X21vdW50cCwgcGRwLT5pX2lubykpKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJcmV0dXJuIHhmc19kaXIyX3NmX2NyZWF0ZSgmYXJncywgcGRwLT5pX2lubyk7Cit9CisKKy8qCisgIEVudGVyIGEgbmFtZSBpbiBhIGRpcmVjdG9yeS4KKyAqLworc3RhdGljIGludAkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX2NyZWF0ZW5hbWUoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwLAkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWNoYXIJCQkqbmFtZSwJCS8qIG5ldyBlbnRyeSBuYW1lICovCisJaW50CQkJbmFtZWxlbiwJLyogbmV3IGVudHJ5IG5hbWUgbGVuZ3RoICovCisJeGZzX2lub190CQlpbnVtLAkJLyogbmV3IGVudHJ5IGlub2RlIG51bWJlciAqLworCXhmc19mc2Jsb2NrX3QJCSpmaXJzdCwJCS8qIGJtYXAncyBmaXJzdGJsb2NrICovCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCQkvKiBibWFwJ3MgZnJlZWJsb2NrIGxpc3QgKi8KKwl4ZnNfZXh0bGVuX3QJCXRvdGFsKQkJLyogYm1hcCdzIHRvdGFsIGJsb2NrIGNvdW50ICovCit7CisJeGZzX2RhX2FyZ3NfdAkJYXJnczsJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwlpbnQJCQlydmFsOwkJLyogcmV0dXJuIHZhbHVlICovCisJaW50CQkJdjsJCS8qIHR5cGUtY2hlY2tpbmcgdmFsdWUgKi8KKworCUFTU0VSVCgoZHAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKTsKKwlpZiAoKHJ2YWwgPSB4ZnNfZGlyX2lub192YWxpZGF0ZSh0cC0+dF9tb3VudHAsIGludW0pKSkgeworCQlyZXR1cm4gcnZhbDsKKwl9CisJWEZTX1NUQVRTX0lOQyh4c19kaXJfY3JlYXRlKTsKKwkvKgorCSAqIEZpbGwgaW4gdGhlIGFyZyBzdHJ1Y3R1cmUgZm9yIHRoaXMgcmVxdWVzdC4KKwkgKi8KKwlhcmdzLm5hbWUgPSBuYW1lOworCWFyZ3MubmFtZWxlbiA9IG5hbWVsZW47CisJYXJncy5oYXNodmFsID0geGZzX2RhX2hhc2huYW1lKG5hbWUsIG5hbWVsZW4pOworCWFyZ3MuaW51bWJlciA9IGludW07CisJYXJncy5kcCA9IGRwOworCWFyZ3MuZmlyc3RibG9jayA9IGZpcnN0OworCWFyZ3MuZmxpc3QgPSBmbGlzdDsKKwlhcmdzLnRvdGFsID0gdG90YWw7CisJYXJncy53aGljaGZvcmsgPSBYRlNfREFUQV9GT1JLOworCWFyZ3MudHJhbnMgPSB0cDsKKwlhcmdzLmp1c3RjaGVjayA9IDA7CisJYXJncy5hZGRuYW1lID0gYXJncy5va25vZW50ID0gMTsKKwkvKgorCSAqIERlY2lkZSBvbiB3aGF0IHdvcmsgcm91dGluZXMgdG8gY2FsbCBiYXNlZCBvbiB0aGUgaW5vZGUgc2l6ZS4KKwkgKi8KKwlpZiAoZHAtPmlfZC5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpCisJCXJ2YWwgPSB4ZnNfZGlyMl9zZl9hZGRuYW1lKCZhcmdzKTsKKwllbHNlIGlmICgocnZhbCA9IHhmc19kaXIyX2lzYmxvY2sodHAsIGRwLCAmdikpKSB7CisJCXJldHVybiBydmFsOworCX0gZWxzZSBpZiAodikKKwkJcnZhbCA9IHhmc19kaXIyX2Jsb2NrX2FkZG5hbWUoJmFyZ3MpOworCWVsc2UgaWYgKChydmFsID0geGZzX2RpcjJfaXNsZWFmKHRwLCBkcCwgJnYpKSkgeworCQlyZXR1cm4gcnZhbDsKKwl9IGVsc2UgaWYgKHYpCisJCXJ2YWwgPSB4ZnNfZGlyMl9sZWFmX2FkZG5hbWUoJmFyZ3MpOworCWVsc2UKKwkJcnZhbCA9IHhmc19kaXIyX25vZGVfYWRkbmFtZSgmYXJncyk7CisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBMb29rdXAgYSBuYW1lIGluIGEgZGlyZWN0b3J5LCBnaXZlIGJhY2sgdGhlIGlub2RlIG51bWJlci4KKyAqLworc3RhdGljIGludAkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfbG9va3VwKAorCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkqZHAsCQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJY2hhcgkJKm5hbWUsCQkvKiBsb29rdXAgbmFtZSAqLworCWludAkJbmFtZWxlbiwJLyogbG9va3VwIG5hbWUgbGVuZ3RoICovCisJeGZzX2lub190CSppbnVtKQkJLyogb3V0OiBpbm9kZSBudW1iZXIgKi8KK3sKKwl4ZnNfZGFfYXJnc190CWFyZ3M7CQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCisJaW50CQlydmFsOwkJLyogcmV0dXJuIHZhbHVlICovCisJaW50CQl2OwkJLyogdHlwZS1jaGVja2luZyB2YWx1ZSAqLworCisJQVNTRVJUKChkcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZESVIpOworCVhGU19TVEFUU19JTkMoeHNfZGlyX2xvb2t1cCk7CisKKwkvKgorCSAqIEZpbGwgaW4gdGhlIGFyZyBzdHJ1Y3R1cmUgZm9yIHRoaXMgcmVxdWVzdC4KKwkgKi8KKwlhcmdzLm5hbWUgPSBuYW1lOworCWFyZ3MubmFtZWxlbiA9IG5hbWVsZW47CisJYXJncy5oYXNodmFsID0geGZzX2RhX2hhc2huYW1lKG5hbWUsIG5hbWVsZW4pOworCWFyZ3MuaW51bWJlciA9IDA7CisJYXJncy5kcCA9IGRwOworCWFyZ3MuZmlyc3RibG9jayA9IE5VTEw7CisJYXJncy5mbGlzdCA9IE5VTEw7CisJYXJncy50b3RhbCA9IDA7CisJYXJncy53aGljaGZvcmsgPSBYRlNfREFUQV9GT1JLOworCWFyZ3MudHJhbnMgPSB0cDsKKwlhcmdzLmp1c3RjaGVjayA9IGFyZ3MuYWRkbmFtZSA9IDA7CisJYXJncy5va25vZW50ID0gMTsKKwkvKgorCSAqIERlY2lkZSBvbiB3aGF0IHdvcmsgcm91dGluZXMgdG8gY2FsbCBiYXNlZCBvbiB0aGUgaW5vZGUgc2l6ZS4KKwkgKi8KKwlpZiAoZHAtPmlfZC5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpCisJCXJ2YWwgPSB4ZnNfZGlyMl9zZl9sb29rdXAoJmFyZ3MpOworCWVsc2UgaWYgKChydmFsID0geGZzX2RpcjJfaXNibG9jayh0cCwgZHAsICZ2KSkpIHsKKwkJcmV0dXJuIHJ2YWw7CisJfSBlbHNlIGlmICh2KQorCQlydmFsID0geGZzX2RpcjJfYmxvY2tfbG9va3VwKCZhcmdzKTsKKwllbHNlIGlmICgocnZhbCA9IHhmc19kaXIyX2lzbGVhZih0cCwgZHAsICZ2KSkpIHsKKwkJcmV0dXJuIHJ2YWw7CisJfSBlbHNlIGlmICh2KQorCQlydmFsID0geGZzX2RpcjJfbGVhZl9sb29rdXAoJmFyZ3MpOworCWVsc2UKKwkJcnZhbCA9IHhmc19kaXIyX25vZGVfbG9va3VwKCZhcmdzKTsKKwlpZiAocnZhbCA9PSBFRVhJU1QpCisJCXJ2YWwgPSAwOworCWlmIChydmFsID09IDApCisJCSppbnVtID0gYXJncy5pbnVtYmVyOworCXJldHVybiBydmFsOworfQorCisvKgorICogUmVtb3ZlIGFuIGVudHJ5IGZyb20gYSBkaXJlY3RvcnkuCisgKi8KK3N0YXRpYyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX3JlbW92ZW5hbWUoCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9kZV90CSpkcCwJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwljaGFyCQkqbmFtZSwJCS8qIG5hbWUgb2YgZW50cnkgdG8gcmVtb3ZlICovCisJaW50CQluYW1lbGVuLAkvKiBuYW1lIGxlbmd0aCBvZiBlbnRyeSB0byByZW1vdmUgKi8KKwl4ZnNfaW5vX3QJaW5vLAkJLyogaW5vZGUgbnVtYmVyIG9mIGVudHJ5IHRvIHJlbW92ZSAqLworCXhmc19mc2Jsb2NrX3QJKmZpcnN0LAkJLyogYm1hcCdzIGZpcnN0YmxvY2sgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJKmZsaXN0LAkJLyogYm1hcCdzIGZyZWVibG9jayBsaXN0ICovCisJeGZzX2V4dGxlbl90CXRvdGFsKQkJLyogYm1hcCdzIHRvdGFsIGJsb2NrIGNvdW50ICovCit7CisJeGZzX2RhX2FyZ3NfdAlhcmdzOwkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworCWludAkJcnZhbDsJCS8qIHJldHVybiB2YWx1ZSAqLworCWludAkJdjsJCS8qIHR5cGUtY2hlY2tpbmcgdmFsdWUgKi8KKworCUFTU0VSVCgoZHAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKTsKKwlYRlNfU1RBVFNfSU5DKHhzX2Rpcl9yZW1vdmUpOworCS8qCisJICogRmlsbCBpbiB0aGUgYXJnIHN0cnVjdHVyZSBmb3IgdGhpcyByZXF1ZXN0LgorCSAqLworCWFyZ3MubmFtZSA9IG5hbWU7CisJYXJncy5uYW1lbGVuID0gbmFtZWxlbjsKKwlhcmdzLmhhc2h2YWwgPSB4ZnNfZGFfaGFzaG5hbWUobmFtZSwgbmFtZWxlbik7CisJYXJncy5pbnVtYmVyID0gaW5vOworCWFyZ3MuZHAgPSBkcDsKKwlhcmdzLmZpcnN0YmxvY2sgPSBmaXJzdDsKKwlhcmdzLmZsaXN0ID0gZmxpc3Q7CisJYXJncy50b3RhbCA9IHRvdGFsOworCWFyZ3Mud2hpY2hmb3JrID0gWEZTX0RBVEFfRk9SSzsKKwlhcmdzLnRyYW5zID0gdHA7CisJYXJncy5qdXN0Y2hlY2sgPSBhcmdzLmFkZG5hbWUgPSBhcmdzLm9rbm9lbnQgPSAwOworCS8qCisJICogRGVjaWRlIG9uIHdoYXQgd29yayByb3V0aW5lcyB0byBjYWxsIGJhc2VkIG9uIHRoZSBpbm9kZSBzaXplLgorCSAqLworCWlmIChkcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkKKwkJcnZhbCA9IHhmc19kaXIyX3NmX3JlbW92ZW5hbWUoJmFyZ3MpOworCWVsc2UgaWYgKChydmFsID0geGZzX2RpcjJfaXNibG9jayh0cCwgZHAsICZ2KSkpIHsKKwkJcmV0dXJuIHJ2YWw7CisJfSBlbHNlIGlmICh2KQorCQlydmFsID0geGZzX2RpcjJfYmxvY2tfcmVtb3ZlbmFtZSgmYXJncyk7CisJZWxzZSBpZiAoKHJ2YWwgPSB4ZnNfZGlyMl9pc2xlYWYodHAsIGRwLCAmdikpKSB7CisJCXJldHVybiBydmFsOworCX0gZWxzZSBpZiAodikKKwkJcnZhbCA9IHhmc19kaXIyX2xlYWZfcmVtb3ZlbmFtZSgmYXJncyk7CisJZWxzZQorCQlydmFsID0geGZzX2RpcjJfbm9kZV9yZW1vdmVuYW1lKCZhcmdzKTsKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIFJlYWQgYSBkaXJlY3RvcnkuCisgKi8KK3N0YXRpYyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX2dldGRlbnRzKAorCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkqZHAsCQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJdWlvX3QJCSp1aW8sCQkvKiBjYWxsZXIncyBidWZmZXIgY29udHJvbCAqLworCWludAkJKmVvZnApCQkvKiBvdXQ6IGVvZiByZWFjaGVkICovCit7CisJaW50CQlhbGlnbm1lbnQ7CS8qIGFsaWdubWVudCByZXF1aXJlZCBmb3IgQUJJICovCisJeGZzX2RpcmVudF90CSpkYnA7CQkvKiBtYWxsb2MnZWQgYnVmZmVyICovCisJeGZzX2RpcjJfcHV0X3QJcHV0OwkJLyogZW50cnkgZm9ybWF0dGluZyByb3V0aW5lICovCisJaW50CQlydmFsOwkJLyogcmV0dXJuIHZhbHVlICovCisJaW50CQl2OwkJLyogdHlwZS1jaGVja2luZyB2YWx1ZSAqLworCisJQVNTRVJUKChkcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZESVIpOworCVhGU19TVEFUU19JTkMoeHNfZGlyX2dldGRlbnRzKTsKKwkvKgorCSAqIElmIG91ciBjYWxsZXIgaGFzIGdpdmVuIHVzIGEgc2luZ2xlIGNvbnRpZ3VvdXMgYWxpZ25lZCBtZW1vcnkgYnVmZmVyLAorCSAqIGp1c3Qgd29yayBkaXJlY3RseSB3aXRoaW4gdGhhdCBidWZmZXIuICBJZiBpdCdzIGluIHVzZXIgbWVtb3J5LAorCSAqIGxvY2sgaXQgZG93biBmaXJzdC4KKwkgKi8KKwlhbGlnbm1lbnQgPSBzaXplb2YoeGZzX29mZl90KSAtIDE7CisJaWYgKCh1aW8tPnVpb19pb3ZjbnQgPT0gMSkgJiYKKwkgICAgKCgoX19wc2ludF90KXVpby0+dWlvX2lvdlswXS5pb3ZfYmFzZSAmIGFsaWdubWVudCkgPT0gMCkgJiYKKwkgICAgKCh1aW8tPnVpb19pb3ZbMF0uaW92X2xlbiAmIGFsaWdubWVudCkgPT0gMCkpIHsKKwkJZGJwID0gTlVMTDsKKwkJcHV0ID0geGZzX2RpcjJfcHV0X2RpcmVudDY0X2RpcmVjdDsKKwl9IGVsc2UgeworCQlkYnAgPSBrbWVtX2FsbG9jKHNpemVvZigqZGJwKSArIE1BWE5BTUVMRU4sIEtNX1NMRUVQKTsKKwkJcHV0ID0geGZzX2RpcjJfcHV0X2RpcmVudDY0X3VpbzsKKwl9CisKKwkqZW9mcCA9IDA7CisJLyoKKwkgKiBEZWNpZGUgb24gd2hhdCB3b3JrIHJvdXRpbmVzIHRvIGNhbGwgYmFzZWQgb24gdGhlIGlub2RlIHNpemUuCisJICovCisJaWYgKGRwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKQorCQlydmFsID0geGZzX2RpcjJfc2ZfZ2V0ZGVudHMoZHAsIHVpbywgZW9mcCwgZGJwLCBwdXQpOworCWVsc2UgaWYgKChydmFsID0geGZzX2RpcjJfaXNibG9jayh0cCwgZHAsICZ2KSkpIHsKKwkJOworCX0gZWxzZSBpZiAodikKKwkJcnZhbCA9IHhmc19kaXIyX2Jsb2NrX2dldGRlbnRzKHRwLCBkcCwgdWlvLCBlb2ZwLCBkYnAsIHB1dCk7CisJZWxzZQorCQlydmFsID0geGZzX2RpcjJfbGVhZl9nZXRkZW50cyh0cCwgZHAsIHVpbywgZW9mcCwgZGJwLCBwdXQpOworCWlmIChkYnAgIT0gTlVMTCkKKwkJa21lbV9mcmVlKGRicCwgc2l6ZW9mKCpkYnApICsgTUFYTkFNRUxFTik7CisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBSZXBsYWNlIHRoZSBpbm9kZSBudW1iZXIgb2YgYSBkaXJlY3RvcnkgZW50cnkuCisgKi8KK3N0YXRpYyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX3JlcGxhY2UoCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9kZV90CSpkcCwJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwljaGFyCQkqbmFtZSwJCS8qIG5hbWUgb2YgZW50cnkgdG8gcmVwbGFjZSAqLworCWludAkJbmFtZWxlbiwJLyogbmFtZSBsZW5ndGggb2YgZW50cnkgdG8gcmVwbGFjZSAqLworCXhmc19pbm9fdAlpbnVtLAkJLyogbmV3IGlub2RlIG51bWJlciAqLworCXhmc19mc2Jsb2NrX3QJKmZpcnN0LAkJLyogYm1hcCdzIGZpcnN0YmxvY2sgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJKmZsaXN0LAkJLyogYm1hcCdzIGZyZWVibG9jayBsaXN0ICovCisJeGZzX2V4dGxlbl90CXRvdGFsKQkJLyogYm1hcCdzIHRvdGFsIGJsb2NrIGNvdW50ICovCit7CisJeGZzX2RhX2FyZ3NfdAlhcmdzOwkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworCWludAkJcnZhbDsJCS8qIHJldHVybiB2YWx1ZSAqLworCWludAkJdjsJCS8qIHR5cGUtY2hlY2tpbmcgdmFsdWUgKi8KKworCUFTU0VSVCgoZHAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKTsKKworCWlmICgocnZhbCA9IHhmc19kaXJfaW5vX3ZhbGlkYXRlKHRwLT50X21vdW50cCwgaW51bSkpKSB7CisJCXJldHVybiBydmFsOworCX0KKwkvKgorCSAqIEZpbGwgaW4gdGhlIGFyZyBzdHJ1Y3R1cmUgZm9yIHRoaXMgcmVxdWVzdC4KKwkgKi8KKwlhcmdzLm5hbWUgPSBuYW1lOworCWFyZ3MubmFtZWxlbiA9IG5hbWVsZW47CisJYXJncy5oYXNodmFsID0geGZzX2RhX2hhc2huYW1lKG5hbWUsIG5hbWVsZW4pOworCWFyZ3MuaW51bWJlciA9IGludW07CisJYXJncy5kcCA9IGRwOworCWFyZ3MuZmlyc3RibG9jayA9IGZpcnN0OworCWFyZ3MuZmxpc3QgPSBmbGlzdDsKKwlhcmdzLnRvdGFsID0gdG90YWw7CisJYXJncy53aGljaGZvcmsgPSBYRlNfREFUQV9GT1JLOworCWFyZ3MudHJhbnMgPSB0cDsKKwlhcmdzLmp1c3RjaGVjayA9IGFyZ3MuYWRkbmFtZSA9IGFyZ3Mub2tub2VudCA9IDA7CisJLyoKKwkgKiBEZWNpZGUgb24gd2hhdCB3b3JrIHJvdXRpbmVzIHRvIGNhbGwgYmFzZWQgb24gdGhlIGlub2RlIHNpemUuCisJICovCisJaWYgKGRwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKQorCQlydmFsID0geGZzX2RpcjJfc2ZfcmVwbGFjZSgmYXJncyk7CisJZWxzZSBpZiAoKHJ2YWwgPSB4ZnNfZGlyMl9pc2Jsb2NrKHRwLCBkcCwgJnYpKSkgeworCQlyZXR1cm4gcnZhbDsKKwl9IGVsc2UgaWYgKHYpCisJCXJ2YWwgPSB4ZnNfZGlyMl9ibG9ja19yZXBsYWNlKCZhcmdzKTsKKwllbHNlIGlmICgocnZhbCA9IHhmc19kaXIyX2lzbGVhZih0cCwgZHAsICZ2KSkpIHsKKwkJcmV0dXJuIHJ2YWw7CisJfSBlbHNlIGlmICh2KQorCQlydmFsID0geGZzX2RpcjJfbGVhZl9yZXBsYWNlKCZhcmdzKTsKKwllbHNlCisJCXJ2YWwgPSB4ZnNfZGlyMl9ub2RlX3JlcGxhY2UoJmFyZ3MpOworCXJldHVybiBydmFsOworfQorCisvKgorICogU2VlIGlmIHRoaXMgZW50cnkgY2FuIGJlIGFkZGVkIHRvIHRoZSBkaXJlY3Rvcnkgd2l0aG91dCBhbGxvY2F0aW5nIHNwYWNlLgorICovCitzdGF0aWMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9jYW5lbnRlcigKKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub2RlX3QJKmRwLAkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWNoYXIJCSpuYW1lLAkJLyogbmFtZSBvZiBlbnRyeSB0byBhZGQgKi8KKwlpbnQJCW5hbWVsZW4pCS8qIG5hbWUgbGVuZ3RoIG9mIGVudHJ5IHRvIGFkZCAqLworeworCXhmc19kYV9hcmdzX3QJYXJnczsJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwlpbnQJCXJ2YWw7CQkvKiByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCXY7CQkvKiB0eXBlLWNoZWNraW5nIHZhbHVlICovCisKKwlBU1NFUlQoKGRwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUik7CisJLyoKKwkgKiBGaWxsIGluIHRoZSBhcmcgc3RydWN0dXJlIGZvciB0aGlzIHJlcXVlc3QuCisJICovCisJYXJncy5uYW1lID0gbmFtZTsKKwlhcmdzLm5hbWVsZW4gPSBuYW1lbGVuOworCWFyZ3MuaGFzaHZhbCA9IHhmc19kYV9oYXNobmFtZShuYW1lLCBuYW1lbGVuKTsKKwlhcmdzLmludW1iZXIgPSAwOworCWFyZ3MuZHAgPSBkcDsKKwlhcmdzLmZpcnN0YmxvY2sgPSBOVUxMOworCWFyZ3MuZmxpc3QgPSBOVUxMOworCWFyZ3MudG90YWwgPSAwOworCWFyZ3Mud2hpY2hmb3JrID0gWEZTX0RBVEFfRk9SSzsKKwlhcmdzLnRyYW5zID0gdHA7CisJYXJncy5qdXN0Y2hlY2sgPSBhcmdzLmFkZG5hbWUgPSBhcmdzLm9rbm9lbnQgPSAxOworCS8qCisJICogRGVjaWRlIG9uIHdoYXQgd29yayByb3V0aW5lcyB0byBjYWxsIGJhc2VkIG9uIHRoZSBpbm9kZSBzaXplLgorCSAqLworCWlmIChkcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkKKwkJcnZhbCA9IHhmc19kaXIyX3NmX2FkZG5hbWUoJmFyZ3MpOworCWVsc2UgaWYgKChydmFsID0geGZzX2RpcjJfaXNibG9jayh0cCwgZHAsICZ2KSkpIHsKKwkJcmV0dXJuIHJ2YWw7CisJfSBlbHNlIGlmICh2KQorCQlydmFsID0geGZzX2RpcjJfYmxvY2tfYWRkbmFtZSgmYXJncyk7CisJZWxzZSBpZiAoKHJ2YWwgPSB4ZnNfZGlyMl9pc2xlYWYodHAsIGRwLCAmdikpKSB7CisJCXJldHVybiBydmFsOworCX0gZWxzZSBpZiAodikKKwkJcnZhbCA9IHhmc19kaXIyX2xlYWZfYWRkbmFtZSgmYXJncyk7CisJZWxzZQorCQlydmFsID0geGZzX2RpcjJfbm9kZV9hZGRuYW1lKCZhcmdzKTsKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIER1bW15IHJvdXRpbmUgZm9yIHNob3J0Zm9ybSBpbm9kZSB2YWxpZGF0aW9uLgorICogQ2FuJ3QgcmVhbGx5IGRvIHRoaXMuCisgKi8KKy8qIEFSR1NVU0VEICovCitzdGF0aWMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9zaG9ydGZvcm1fdmFsaWRhdGVfb25kaXNrKAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfZGlub2RlX3QJKmRpcCkJCS8qIG9uZGlzayBpbm9kZSAqLworeworCXJldHVybiAwOworfQorCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqLworCisvKgorICogQWRkIGEgYmxvY2sgdG8gdGhlIGRpcmVjdG9yeS4KKyAqIFRoaXMgcm91dGluZSBpcyBmb3IgZGF0YSBhbmQgZnJlZSBibG9ja3MsIG5vdCBsZWFmL25vZGUgYmxvY2tzCisgKiB3aGljaCBhcmUgaGFuZGxlZCBieSB4ZnNfZGFfZ3Jvd19pbm9kZS4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfZ3Jvd19pbm9kZSgKKwl4ZnNfZGFfYXJnc190CSphcmdzLAkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworCWludAkJc3BhY2UsCQkvKiB2MiBkaXIncyBzcGFjZSBYRlNfRElSMl94eHhfU1BBQ0UgKi8KKwl4ZnNfZGlyMl9kYl90CSpkYnApCQkvKiBvdXQ6IGJsb2NrIG51bWJlciBhZGRlZCAqLworeworCXhmc19maWxlb2ZmX3QJYm5vOwkJLyogZGlyZWN0b3J5IG9mZnNldCBvZiBuZXcgYmxvY2sgKi8KKwlpbnQJCWNvdW50OwkJLyogY291bnQgb2YgZmlsZXN5c3RlbSBibG9ja3MgKi8KKwl4ZnNfaW5vZGVfdAkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJZ290OwkJLyogYmxvY2tzIGFjdHVhbGx5IG1hcHBlZCAqLworCWludAkJaTsJCS8qIHRlbXAgbWFwcGluZyBpbmRleCAqLworCXhmc19ibWJ0X2lyZWNfdAltYXA7CQkvKiBzaW5nbGUgc3RydWN0dXJlIGZvciBibWFwICovCisJaW50CQltYXBpOwkJLyogbWFwcGluZyBpbmRleCAqLworCXhmc19ibWJ0X2lyZWNfdAkqbWFwcDsJCS8qIGJtYXAgbWFwcGluZyBzdHJ1Y3R1cmUocykgKi8KKwl4ZnNfbW91bnRfdAkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJaW50CQlubWFwOwkJLyogbnVtYmVyIG9mIGJtYXAgZW50cmllcyAqLworCXhmc190cmFuc190CSp0cDsJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3NfcygiZ3Jvd19pbm9kZSIsIGFyZ3MsIHNwYWNlKTsKKwlkcCA9IGFyZ3MtPmRwOworCXRwID0gYXJncy0+dHJhbnM7CisJbXAgPSBkcC0+aV9tb3VudDsKKwkvKgorCSAqIFNldCBsb3dlc3QgcG9zc2libGUgYmxvY2sgaW4gdGhlIHNwYWNlIHJlcXVlc3RlZC4KKwkgKi8KKwlibm8gPSBYRlNfQl9UT19GU0JUKG1wLCBzcGFjZSAqIFhGU19ESVIyX1NQQUNFX1NJWkUpOworCWNvdW50ID0gbXAtPm1fZGlyYmxrZnNiczsKKwkvKgorCSAqIEZpbmQgdGhlIGZpcnN0IGhvbGUgZm9yIG91ciBibG9jay4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2JtYXBfZmlyc3RfdW51c2VkKHRwLCBkcCwgY291bnQsICZibm8sIFhGU19EQVRBX0ZPUkspKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCW5tYXAgPSAxOworCUFTU0VSVChhcmdzLT5maXJzdGJsb2NrICE9IE5VTEwpOworCS8qCisJICogVHJ5IG1hcHBpbmcgdGhlIG5ldyBibG9jayBjb250aWd1b3VzbHkgKG9uZSBleHRlbnQpLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGRwLCBibm8sIGNvdW50LAorCQkJWEZTX0JNQVBJX1dSSVRFfFhGU19CTUFQSV9NRVRBREFUQXxYRlNfQk1BUElfQ09OVElHLAorCQkJYXJncy0+Zmlyc3RibG9jaywgYXJncy0+dG90YWwsICZtYXAsICZubWFwLAorCQkJYXJncy0+Zmxpc3QpKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCUFTU0VSVChubWFwIDw9IDEpOworCS8qCisJICogR290IGl0IGluIDEuCisJICovCisJaWYgKG5tYXAgPT0gMSkgeworCQltYXBwID0gJm1hcDsKKwkJbWFwaSA9IDE7CisJfQorCS8qCisJICogRGlkbid0IHdvcmsgYW5kIHRoaXMgaXMgYSBtdWx0aXBsZS1mc2IgZGlyZWN0b3J5IGJsb2NrLgorCSAqIFRyeSBhZ2FpbiB3aXRoIGNvbnRpZ3VvdXMgZmxhZyB0dXJuZWQgb24uCisJICovCisJZWxzZSBpZiAobm1hcCA9PSAwICYmIGNvdW50ID4gMSkgeworCQl4ZnNfZmlsZW9mZl90CWI7CS8qIGN1cnJlbnQgZmlsZSBvZmZzZXQgKi8KKworCQkvKgorCQkgKiBTcGFjZSBmb3IgbWF4aW11bSBudW1iZXIgb2YgbWFwcGluZ3MuCisJCSAqLworCQltYXBwID0ga21lbV9hbGxvYyhzaXplb2YoKm1hcHApICogY291bnQsIEtNX1NMRUVQKTsKKwkJLyoKKwkJICogSXRlcmF0ZSB1bnRpbCB3ZSBnZXQgdG8gdGhlIGVuZCBvZiBvdXIgYmxvY2suCisJCSAqLworCQlmb3IgKGIgPSBibm8sIG1hcGkgPSAwOyBiIDwgYm5vICsgY291bnQ7ICkgeworCQkJaW50CWM7CS8qIGN1cnJlbnQgZnNiIGNvdW50ICovCisKKwkJCS8qCisJCQkgKiBDYW4ndCBtYXAgbW9yZSB0aGFuIE1BWF9OTUFQIGF0IG9uY2UuCisJCQkgKi8KKwkJCW5tYXAgPSBNSU4oWEZTX0JNQVBfTUFYX05NQVAsIGNvdW50KTsKKwkJCWMgPSAoaW50KShibm8gKyBjb3VudCAtIGIpOworCQkJaWYgKChlcnJvciA9IHhmc19ibWFwaSh0cCwgZHAsIGIsIGMsCisJCQkJCVhGU19CTUFQSV9XUklURXxYRlNfQk1BUElfTUVUQURBVEEsCisJCQkJCWFyZ3MtPmZpcnN0YmxvY2ssIGFyZ3MtPnRvdGFsLAorCQkJCQkmbWFwcFttYXBpXSwgJm5tYXAsIGFyZ3MtPmZsaXN0KSkpIHsKKwkJCQlrbWVtX2ZyZWUobWFwcCwgc2l6ZW9mKCptYXBwKSAqIGNvdW50KTsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQlpZiAobm1hcCA8IDEpCisJCQkJYnJlYWs7CisJCQkvKgorCQkJICogQWRkIHRoaXMgYnVuY2ggaW50byBvdXIgdGFibGUsIGdvIHRvIHRoZSBuZXh0IG9mZnNldC4KKwkJCSAqLworCQkJbWFwaSArPSBubWFwOworCQkJYiA9IG1hcHBbbWFwaSAtIDFdLmJyX3N0YXJ0b2ZmICsKKwkJCSAgICBtYXBwW21hcGkgLSAxXS5icl9ibG9ja2NvdW50OworCQl9CisJfQorCS8qCisJICogRGlkbid0IHdvcmsuCisJICovCisJZWxzZSB7CisJCW1hcGkgPSAwOworCQltYXBwID0gTlVMTDsKKwl9CisJLyoKKwkgKiBTZWUgaG93IG1hbnkgZnNiJ3Mgd2UgZ290LgorCSAqLworCWZvciAoaSA9IDAsIGdvdCA9IDA7IGkgPCBtYXBpOyBpKyspCisJCWdvdCArPSBtYXBwW2ldLmJyX2Jsb2NrY291bnQ7CisJLyoKKwkgKiBEaWRuJ3QgZ2V0IGVub3VnaCBmc2Incywgb3IgdGhlIGZpcnN0L2xhc3QgYmxvY2sncyBhcmUgd3JvbmcuCisJICovCisJaWYgKGdvdCAhPSBjb3VudCB8fCBtYXBwWzBdLmJyX3N0YXJ0b2ZmICE9IGJubyB8fAorCSAgICBtYXBwW21hcGkgLSAxXS5icl9zdGFydG9mZiArIG1hcHBbbWFwaSAtIDFdLmJyX2Jsb2NrY291bnQgIT0KKwkgICAgYm5vICsgY291bnQpIHsKKwkJaWYgKG1hcHAgIT0gJm1hcCkKKwkJCWttZW1fZnJlZShtYXBwLCBzaXplb2YoKm1hcHApICogY291bnQpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVOT1NQQyk7CisJfQorCS8qCisJICogRG9uZSB3aXRoIHRoZSB0ZW1wb3JhcnkgbWFwcGluZyB0YWJsZS4KKwkgKi8KKwlpZiAobWFwcCAhPSAmbWFwKQorCQlrbWVtX2ZyZWUobWFwcCwgc2l6ZW9mKCptYXBwKSAqIGNvdW50KTsKKwkqZGJwID0gWEZTX0RJUjJfREFfVE9fREIobXAsICh4ZnNfZGFibGtfdClibm8pOworCS8qCisJICogVXBkYXRlIGZpbGUncyBzaXplIGlmIHRoaXMgaXMgdGhlIGRhdGEgc3BhY2UgYW5kIGl0IGdyZXcuCisJICovCisJaWYgKHNwYWNlID09IFhGU19ESVIyX0RBVEFfU1BBQ0UpIHsKKwkJeGZzX2ZzaXplX3QJc2l6ZTsJCS8qIGRpcmVjdG9yeSBmaWxlIChkYXRhKSBzaXplICovCisKKwkJc2l6ZSA9IFhGU19GU0JfVE9fQihtcCwgYm5vICsgY291bnQpOworCQlpZiAoc2l6ZSA+IGRwLT5pX2QuZGlfc2l6ZSkgeworCQkJZHAtPmlfZC5kaV9zaXplID0gc2l6ZTsKKwkJCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGRwLCBYRlNfSUxPR19DT1JFKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNlZSBpZiB0aGUgZGlyZWN0b3J5IGlzIGEgc2luZ2xlLWJsb2NrIGZvcm0gZGlyZWN0b3J5LgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9pc2Jsb2NrKAorCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkqZHAsCQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQkqdnApCQkvKiBvdXQ6IDEgaXMgYmxvY2ssIDAgaXMgbm90IGJsb2NrICovCit7CisJeGZzX2ZpbGVvZmZfdAlsYXN0OwkJLyogbGFzdCBmaWxlIG9mZnNldCAqLworCXhmc19tb3VudF90CSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwlpbnQJCXJ2YWw7CQkvKiByZXR1cm4gdmFsdWUgKi8KKworCW1wID0gZHAtPmlfbW91bnQ7CisJaWYgKChydmFsID0geGZzX2JtYXBfbGFzdF9vZmZzZXQodHAsIGRwLCAmbGFzdCwgWEZTX0RBVEFfRk9SSykpKSB7CisJCXJldHVybiBydmFsOworCX0KKwlydmFsID0gWEZTX0ZTQl9UT19CKG1wLCBsYXN0KSA9PSBtcC0+bV9kaXJibGtzaXplOworCUFTU0VSVChydmFsID09IDAgfHwgZHAtPmlfZC5kaV9zaXplID09IG1wLT5tX2RpcmJsa3NpemUpOworCSp2cCA9IHJ2YWw7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZWUgaWYgdGhlIGRpcmVjdG9yeSBpcyBhIHNpbmdsZS1sZWFmIGZvcm0gZGlyZWN0b3J5LgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9pc2xlYWYoCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9kZV90CSpkcCwJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwlpbnQJCSp2cCkJCS8qIG91dDogMSBpcyBsZWFmLCAwIGlzIG5vdCBsZWFmICovCit7CisJeGZzX2ZpbGVvZmZfdAlsYXN0OwkJLyogbGFzdCBmaWxlIG9mZnNldCAqLworCXhmc19tb3VudF90CSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwlpbnQJCXJ2YWw7CQkvKiByZXR1cm4gdmFsdWUgKi8KKworCW1wID0gZHAtPmlfbW91bnQ7CisJaWYgKChydmFsID0geGZzX2JtYXBfbGFzdF9vZmZzZXQodHAsIGRwLCAmbGFzdCwgWEZTX0RBVEFfRk9SSykpKSB7CisJCXJldHVybiBydmFsOworCX0KKwkqdnAgPSBsYXN0ID09IG1wLT5tX2RpcmxlYWZibGsgKyAoMSA8PCBtcC0+bV9zYi5zYl9kaXJibGtsb2cpOworCXJldHVybiAwOworfQorCisvKgorICogR2V0ZGVudHMgcHV0IHJvdXRpbmUgZm9yIDY0LWJpdCBBQkksIGRpcmVjdCBmb3JtLgorICovCitzdGF0aWMgaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfcHV0X2RpcmVudDY0X2RpcmVjdCgKKwl4ZnNfZGlyMl9wdXRfYXJnc190CSpwYSkJCS8qIGFyZ3VtZW50IGJ1bmRsZSAqLworeworCXhmc19kaXJlbnRfdAkJKmlkYnA7CQkvKiBkaXJlbnQgcG9pbnRlciAqLworCWlvdmVjX3QJCQkqaW92cDsJCS8qIGlvIHZlY3RvciAqLworCWludAkJCW5hbWVsZW47CS8qIGVudHJ5IG5hbWUgbGVuZ3RoICovCisJaW50CQkJcmVjbGVuOwkJLyogZW50cnkgdG90YWwgbGVuZ3RoICovCisJdWlvX3QJCQkqdWlvOwkJLyogSS9PIGNvbnRyb2wgKi8KKworCW5hbWVsZW4gPSBwYS0+bmFtZWxlbjsKKwlyZWNsZW4gPSBESVJFTlRTSVpFKG5hbWVsZW4pOworCXVpbyA9IHBhLT51aW87CisJLyoKKwkgKiBXb24ndCBmaXQgaW4gdGhlIHJlbWFpbmluZyBzcGFjZS4KKwkgKi8KKwlpZiAocmVjbGVuID4gdWlvLT51aW9fcmVzaWQpIHsKKwkJcGEtPmRvbmUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJaW92cCA9IHVpby0+dWlvX2lvdjsKKwlpZGJwID0gKHhmc19kaXJlbnRfdCAqKWlvdnAtPmlvdl9iYXNlOworCWlvdnAtPmlvdl9iYXNlID0gKGNoYXIgKilpZGJwICsgcmVjbGVuOworCWlvdnAtPmlvdl9sZW4gLT0gcmVjbGVuOworCXVpby0+dWlvX3Jlc2lkIC09IHJlY2xlbjsKKwlpZGJwLT5kX3JlY2xlbiA9IHJlY2xlbjsKKwlpZGJwLT5kX2lubyA9IHBhLT5pbm87CisJaWRicC0+ZF9vZmYgPSBwYS0+Y29vazsKKwlpZGJwLT5kX25hbWVbbmFtZWxlbl0gPSAnXDAnOworCXBhLT5kb25lID0gMTsKKwltZW1jcHkoaWRicC0+ZF9uYW1lLCBwYS0+bmFtZSwgbmFtZWxlbik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXRkZW50cyBwdXQgcm91dGluZSBmb3IgNjQtYml0IEFCSSwgdWlvIGZvcm0uCisgKi8KK3N0YXRpYyBpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9wdXRfZGlyZW50NjRfdWlvKAorCXhmc19kaXIyX3B1dF9hcmdzX3QJKnBhKQkJLyogYXJndW1lbnQgYnVuZGxlICovCit7CisJeGZzX2RpcmVudF90CQkqaWRicDsJCS8qIGRpcmVudCBwb2ludGVyICovCisJaW50CQkJbmFtZWxlbjsJLyogZW50cnkgbmFtZSBsZW5ndGggKi8KKwlpbnQJCQlyZWNsZW47CQkvKiBlbnRyeSB0b3RhbCBsZW5ndGggKi8KKwlpbnQJCQlydmFsOwkJLyogcmV0dXJuIHZhbHVlICovCisJdWlvX3QJCQkqdWlvOwkJLyogSS9PIGNvbnRyb2wgKi8KKworCW5hbWVsZW4gPSBwYS0+bmFtZWxlbjsKKwlyZWNsZW4gPSBESVJFTlRTSVpFKG5hbWVsZW4pOworCXVpbyA9IHBhLT51aW87CisJLyoKKwkgKiBXb24ndCBmaXQgaW4gdGhlIHJlbWFpbmluZyBzcGFjZS4KKwkgKi8KKwlpZiAocmVjbGVuID4gdWlvLT51aW9fcmVzaWQpIHsKKwkJcGEtPmRvbmUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJaWRicCA9IHBhLT5kYnA7CisJaWRicC0+ZF9yZWNsZW4gPSByZWNsZW47CisJaWRicC0+ZF9pbm8gPSBwYS0+aW5vOworCWlkYnAtPmRfb2ZmID0gcGEtPmNvb2s7CisJaWRicC0+ZF9uYW1lW25hbWVsZW5dID0gJ1wwJzsKKwltZW1jcHkoaWRicC0+ZF9uYW1lLCBwYS0+bmFtZSwgbmFtZWxlbik7CisJcnZhbCA9IHVpb19yZWFkKChjYWRkcl90KWlkYnAsIHJlY2xlbiwgdWlvKTsKKwlwYS0+ZG9uZSA9IChydmFsID09IDApOworCXJldHVybiBydmFsOworfQorCisvKgorICogUmVtb3ZlIHRoZSBnaXZlbiBibG9jayBmcm9tIHRoZSBkaXJlY3RvcnkuCisgKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgZGF0YSBhbmQgZnJlZSBibG9ja3MsIGxlYWYvbm9kZSBhcmUgZG9uZQorICogYnkgeGZzX2RhX3Nocmlua19pbm9kZS4KKyAqLworaW50Cit4ZnNfZGlyMl9zaHJpbmtfaW5vZGUoCisJeGZzX2RhX2FyZ3NfdAkqYXJncywJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfZGlyMl9kYl90CWRiLAkJLyogZGlyZWN0b3J5IGJsb2NrIG51bWJlciAqLworCXhmc19kYWJ1Zl90CSpicCkJCS8qIGJsb2NrJ3MgYnVmZmVyICovCit7CisJeGZzX2ZpbGVvZmZfdAlibm87CQkvKiBkaXJlY3RvcnkgZmlsZSBvZmZzZXQgKi8KKwl4ZnNfZGFibGtfdAlkYTsJCS8qIGRpcmVjdG9yeSBmaWxlIG9mZnNldCAqLworCWludAkJZG9uZTsJCS8qIGJ1bm1hcCBpcyBmaW5pc2hlZCAqLworCXhmc19pbm9kZV90CSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX21vdW50X3QJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc190cmFuc190CSp0cDsJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3NfZGIoInNocmlua19pbm9kZSIsIGFyZ3MsIGRiLCBicCk7CisJZHAgPSBhcmdzLT5kcDsKKwltcCA9IGRwLT5pX21vdW50OworCXRwID0gYXJncy0+dHJhbnM7CisJZGEgPSBYRlNfRElSMl9EQl9UT19EQShtcCwgZGIpOworCS8qCisJICogVW5tYXAgdGhlIGZzYmxvY2socykuCisJICovCisJaWYgKChlcnJvciA9IHhmc19idW5tYXBpKHRwLCBkcCwgZGEsIG1wLT5tX2RpcmJsa2ZzYnMsCisJCQlYRlNfQk1BUElfTUVUQURBVEEsIDAsIGFyZ3MtPmZpcnN0YmxvY2ssIGFyZ3MtPmZsaXN0LAorCQkJJmRvbmUpKSkgeworCQkvKgorCQkgKiBFTk9TUEMgYWN0dWFsbHkgY2FuIGhhcHBlbiBpZiB3ZSdyZSBpbiBhIHJlbW92ZW5hbWUgd2l0aAorCQkgKiBubyBzcGFjZSByZXNlcnZhdGlvbiwgYW5kIHRoZSByZXN1bHRpbmcgYmxvY2sgcmVtb3ZhbAorCQkgKiB3b3VsZCBjYXVzZSBhIGJtYXAgYnRyZWUgc3BsaXQgb3IgY29udmVyc2lvbiBmcm9tIGV4dGVudHMKKwkJICogdG8gYnRyZWUuICBUaGlzIGNhbiBvbmx5IGhhcHBlbiBmb3IgdW4tZnJhZ21lbnRlZAorCQkgKiBkaXJlY3RvcnkgYmxvY2tzLCBzaW5jZSB5b3UgbmVlZCB0byBiZSBwdW5jaGluZyBvdXQKKwkJICogdGhlIG1pZGRsZSBvZiBhbiBleHRlbnQuCisJCSAqIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIGxlYXZlIHRoZSBibG9jayBpbiB0aGUgZmlsZSwKKwkJICogYW5kIG5vdCBiaW52YWwgaXQuCisJCSAqIFNvIHRoZSBibG9jayBoYXMgdG8gYmUgaW4gYSBjb25zaXN0ZW50IGVtcHR5IHN0YXRlCisJCSAqIGFuZCBhcHByb3ByaWF0ZWx5IGxvZ2dlZC4KKwkJICogV2UgZG9uJ3QgZnJlZSB1cCB0aGUgYnVmZmVyLCB0aGUgY2FsbGVyIGNhbiB0ZWxsIGl0CisJCSAqIGhhc24ndCBoYXBwZW5lZCBzaW5jZSBpdCBnb3QgYW4gZXJyb3IgYmFjay4KKwkJICovCisJCXJldHVybiBlcnJvcjsKKwl9CisJQVNTRVJUKGRvbmUpOworCS8qCisJICogSW52YWxpZGF0ZSB0aGUgYnVmZmVyIGZyb20gdGhlIHRyYW5zYWN0aW9uLgorCSAqLworCXhmc19kYV9iaW52YWwodHAsIGJwKTsKKwkvKgorCSAqIElmIGl0J3Mgbm90IGEgZGF0YSBibG9jaywgd2UncmUgZG9uZS4KKwkgKi8KKwlpZiAoZGIgPj0gWEZTX0RJUjJfTEVBRl9GSVJTVERCKG1wKSkKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBJZiB0aGUgYmxvY2sgaXNuJ3QgdGhlIGxhc3Qgb25lIGluIHRoZSBkaXJlY3RvcnksIHdlJ3JlIGRvbmUuCisJICovCisJaWYgKGRwLT5pX2QuZGlfc2l6ZSA+IFhGU19ESVIyX0RCX09GRl9UT19CWVRFKG1wLCBkYiArIDEsIDApKQorCQlyZXR1cm4gMDsKKwlibm8gPSBkYTsKKwlpZiAoKGVycm9yID0geGZzX2JtYXBfbGFzdF9iZWZvcmUodHAsIGRwLCAmYm5vLCBYRlNfREFUQV9GT1JLKSkpIHsKKwkJLyoKKwkJICogVGhpcyBjYW4ndCByZWFsbHkgaGFwcGVuIHVubGVzcyB0aGVyZSdzIGtlcm5lbCBjb3JydXB0aW9uLgorCQkgKi8KKwkJcmV0dXJuIGVycm9yOworCX0KKwlpZiAoZGIgPT0gbXAtPm1fZGlyZGF0YWJsaykKKwkJQVNTRVJUKGJubyA9PSAwKTsKKwllbHNlCisJCUFTU0VSVChibm8gPiAwKTsKKwkvKgorCSAqIFNldCB0aGUgc2l6ZSB0byB0aGUgbmV3IGxhc3QgYmxvY2suCisJICovCisJZHAtPmlfZC5kaV9zaXplID0gWEZTX0ZTQl9UT19CKG1wLCBibm8pOworCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGRwLCBYRlNfSUxPR19DT1JFKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMi5oIGIvZnMveGZzL3hmc19kaXIyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY0ZmM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZGlyMi5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19ESVIyX0hfXworI2RlZmluZQlfX1hGU19ESVIyX0hfXworCitzdHJ1Y3QgdWlvOworc3RydWN0IHhmc19kYWJ1ZjsKK3N0cnVjdCB4ZnNfZGFfYXJnczsKK3N0cnVjdCB4ZnNfZGlyMl9wdXRfYXJnczsKK3N0cnVjdCB4ZnNfaW5vZGU7CitzdHJ1Y3QgeGZzX3RyYW5zOworCisvKgorICogRGlyZWN0b3J5IHZlcnNpb24gMi4KKyAqIFRoZXJlIGFyZSA0IHBvc3NpYmxlIGZvcm1hdHM6CisgKglzaG9ydGZvcm0KKyAqCXNpbmdsZSBibG9jayAtIGRhdGEgd2l0aCBlbWJlZGRlZCBsZWFmIGF0IHRoZSBlbmQKKyAqCW11bHRpcGxlIGRhdGEgYmxvY2tzLCBzaW5nbGUgbGVhZitmcmVlaW5kZXggYmxvY2sKKyAqCWRhdGEgYmxvY2tzLCBub2RlJmxlYWYgYmxvY2tzIChidHJlZSksIGZyZWVpbmRleCBibG9ja3MKKyAqCisgKglUaGUgc2hvcnRmb3JtIGZvcm1hdCBpcyBpbiB4ZnNfZGlyMl9zZi5oLgorICoJVGhlIHNpbmdsZSBibG9jayBmb3JtYXQgaXMgaW4geGZzX2RpcjJfYmxvY2suaC4KKyAqCVRoZSBkYXRhIGJsb2NrIGZvcm1hdCBpcyBpbiB4ZnNfZGlyMl9kYXRhLmguCisgKglUaGUgbGVhZiBhbmQgZnJlZWluZGV4IGJsb2NrIGZvcm1hdHMgYXJlIGluIHhmc19kaXIyX2xlYWYuaC4KKyAqCU5vZGUgYmxvY2tzIGFyZSB0aGUgc2FtZSBhcyB0aGUgb3RoZXIgdmVyc2lvbiwgaW4geGZzX2RhX2J0cmVlLmguCisgKi8KKworLyoKKyAqIEJ5dGUgb2Zmc2V0IGluIGRhdGEgYmxvY2sgYW5kIHNob3J0Zm9ybSBlbnRyeS4KKyAqLwordHlwZWRlZglfX3VpbnQxNl90CXhmc19kaXIyX2RhdGFfb2ZmX3Q7CisjZGVmaW5lCU5VTExEQVRBT0ZGCTB4ZmZmZlUKK3R5cGVkZWYgdWludAkJeGZzX2RpcjJfZGF0YV9hb2ZmX3Q7CS8qIGFyZ3VtZW50IGZvcm0gKi8KKworLyoKKyAqIERpcmVjdG9yeSBibG9jayBudW1iZXIgKGxvZ2ljYWwgZGlyYmxrIGluIGZpbGUpCisgKi8KK3R5cGVkZWYJX191aW50MzJfdAl4ZnNfZGlyMl9kYl90OworCisvKgorICogQnl0ZSBvZmZzZXQgaW4gYSBkaXJlY3RvcnkuCisgKi8KK3R5cGVkZWYJeGZzX29mZl90CQl4ZnNfZGlyMl9vZmZfdDsKKworLyoKKyAqIEZvciBnZXRkZW50cywgYXJndW1lbnQgc3RydWN0IGZvciBwdXQgcm91dGluZXMuCisgKi8KK3R5cGVkZWYgaW50ICgqeGZzX2RpcjJfcHV0X3QpKHN0cnVjdCB4ZnNfZGlyMl9wdXRfYXJncyAqcGEpOwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfcHV0X2FyZ3MgeworCXhmc19vZmZfdAkJY29vazsJCS8qIGNvb2tpZSBvZiAobmV4dCkgZW50cnkgKi8KKwl4ZnNfaW50aW5vX3QJaW5vOwkJLyogaW5vZGUgbnVtYmVyICovCisJc3RydWN0IHhmc19kaXJlbnQJKmRicDsJCS8qIGJ1ZmZlciBwb2ludGVyICovCisJY2hhcgkJKm5hbWU7CQkvKiBkaXJlY3RvcnkgZW50cnkgbmFtZSAqLworCWludAkJbmFtZWxlbjsJLyogbGVuZ3RoIG9mIG5hbWUgKi8KKwlpbnQJCWRvbmU7CQkvKiBvdXRwdXQ6IHNldCBpZiB2YWx1ZSB3YXMgc3RvcmVkICovCisJeGZzX2RpcjJfcHV0X3QJcHV0OwkJLyogcHV0IGZ1bmN0aW9uIHB0ciAoaS9vKSAqLworCXN0cnVjdCB1aW8JKnVpbzsJCS8qIHVpbyBjb250cm9sIHN0cnVjdHVyZSAqLworfSB4ZnNfZGlyMl9wdXRfYXJnc190OworCisjZGVmaW5lCVhGU19ESVJfSVNfVjIobXApCSgobXApLT5tX2RpcnZlcnNpb24gPT0gMikKK2V4dGVybiB4ZnNfZGlyb3BzX3QJeGZzdjJfZGlyb3BzOworCisvKgorICogT3RoZXIgaW50ZXJmYWNlcyB1c2VkIGJ5IHRoZSByZXN0IG9mIHRoZSBkaXIgdjIgY29kZS4KKyAqLworZXh0ZXJuIGludAorCXhmc19kaXIyX2dyb3dfaW5vZGUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCBpbnQgc3BhY2UsCisJCQkgICAgeGZzX2RpcjJfZGJfdCAqZGJwKTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX2lzYmxvY2soc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfaW5vZGUgKmRwLCBpbnQgKnZwKTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX2lzbGVhZihzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgc3RydWN0IHhmc19pbm9kZSAqZHAsIGludCAqdnApOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfc2hyaW5rX2lub2RlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgeGZzX2RpcjJfZGJfdCBkYiwKKwkJCSAgICAgIHN0cnVjdCB4ZnNfZGFidWYgKmJwKTsKKworI2VuZGlmCS8qIF9fWEZTX0RJUjJfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjJfYmxvY2suYyBiL2ZzL3hmcy94ZnNfZGlyMl9ibG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNGM0MGYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2RpcjJfYmxvY2suYwpAQCAtMCwwICsxLDEyNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKy8qCisgKiB4ZnNfZGlyMl9ibG9jay5jCisgKiBYRlMgVjIgZGlyZWN0b3J5IGltcGxlbWVudGF0aW9uLCBzaW5nbGUtYmxvY2sgZm9ybS4KKyAqIFNlZSB4ZnNfZGlyMl9ibG9jay5oIGZvciB0aGUgZm9ybWF0LgorICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKworI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9sZWFmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfZGF0YS5oIgorI2luY2x1ZGUgInhmc19kaXIyX2xlYWYuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9ibG9jay5oIgorI2luY2x1ZGUgInhmc19kaXIyX3RyYWNlLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisKKy8qCisgKiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzLgorICovCitzdGF0aWMgdm9pZCB4ZnNfZGlyMl9ibG9ja19sb2dfbGVhZih4ZnNfdHJhbnNfdCAqdHAsIHhmc19kYWJ1Zl90ICpicCwgaW50IGZpcnN0LAorCQkJCSAgICBpbnQgbGFzdCk7CitzdGF0aWMgdm9pZCB4ZnNfZGlyMl9ibG9ja19sb2dfdGFpbCh4ZnNfdHJhbnNfdCAqdHAsIHhmc19kYWJ1Zl90ICpicCk7CitzdGF0aWMgaW50IHhmc19kaXIyX2Jsb2NrX2xvb2t1cF9pbnQoeGZzX2RhX2FyZ3NfdCAqYXJncywgeGZzX2RhYnVmX3QgKipicHAsCisJCQkJICAgICBpbnQgKmVudG5vKTsKK3N0YXRpYyBpbnQgeGZzX2RpcjJfYmxvY2tfc29ydChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKTsKKworLyoKKyAqIEFkZCBhbiBlbnRyeSB0byBhIGJsb2NrIGRpcmVjdG9yeS4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX2Jsb2NrX2FkZG5hbWUoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MpCQkvKiBkaXJlY3Rvcnkgb3AgYXJndW1lbnRzICovCit7CisJeGZzX2RpcjJfZGF0YV9mcmVlX3QJKmJmOwkJLyogYmVzdGZyZWUgdGFibGUgaW4gYmxvY2sgKi8KKwl4ZnNfZGlyMl9ibG9ja190CSpibG9jazsJCS8qIGRpcmVjdG9yeSBibG9jayBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmJscDsJCS8qIGJsb2NrIGxlYWYgZW50cmllcyAqLworCXhmc19kYWJ1Zl90CQkqYnA7CQkvKiBidWZmZXIgZm9yIGJsb2NrICovCisJeGZzX2RpcjJfYmxvY2tfdGFpbF90CSpidHA7CQkvKiBibG9jayB0YWlsICovCisJaW50CQkJY29tcGFjdDsJLyogbmVlZCB0byBjb21wYWN0IGxlYWYgZW50cyAqLworCXhmc19kaXIyX2RhdGFfZW50cnlfdAkqZGVwOwkJLyogYmxvY2sgZGF0YSBlbnRyeSAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBkaXJlY3RvcnkgaW5vZGUgKi8KKwl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CSpkdXA7CQkvKiBibG9jayB1bnVzZWQgZW50cnkgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJKmVuZGR1cD1OVUxMOwkvKiB1bnVzZWQgYXQgZW5kIG9mIGRhdGEgKi8KKwl4ZnNfZGFoYXNoX3QJCWhhc2g7CQkvKiBoYXNoIHZhbHVlIG9mIGZvdW5kIGVudHJ5ICovCisJaW50CQkJaGlnaDsJCS8qIGhpZ2ggaW5kZXggZm9yIGJpbmFyeSBzcmNoICovCisJaW50CQkJaGlnaHN0YWxlOwkvKiBoaWdoIHN0YWxlIGluZGV4ICovCisJaW50CQkJbGZsb2doaWdoPTA7CS8qIGxhc3QgZmluYWwgbGVhZiB0byBsb2cgKi8KKwlpbnQJCQlsZmxvZ2xvdz0wOwkvKiBmaXJzdCBmaW5hbCBsZWFmIHRvIGxvZyAqLworCWludAkJCWxlbjsJCS8qIGxlbmd0aCBvZiB0aGUgbmV3IGVudHJ5ICovCisJaW50CQkJbG93OwkJLyogbG93IGluZGV4IGZvciBiaW5hcnkgc3JjaCAqLworCWludAkJCWxvd3N0YWxlOwkvKiBsb3cgc3RhbGUgaW5kZXggKi8KKwlpbnQJCQltaWQ9MDsJCS8qIG1pZHBvaW50IGZvciBiaW5hcnkgc3JjaCAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJaW50CQkJbmVlZGxvZzsJLyogbmVlZCB0byBsb2cgaGVhZGVyICovCisJaW50CQkJbmVlZHNjYW47CS8qIG5lZWQgdG8gcmVzY2FuIGZyZWVzcGFjZSAqLworCXhmc19kaXIyX2RhdGFfb2ZmX3QJKnRhZ3A7CQkvKiBwb2ludGVyIHRvIHRhZyB2YWx1ZSAqLworCXhmc190cmFuc190CQkqdHA7CQkvKiB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3MoImJsb2NrX2FkZG5hbWUiLCBhcmdzKTsKKwlkcCA9IGFyZ3MtPmRwOworCXRwID0gYXJncy0+dHJhbnM7CisJbXAgPSBkcC0+aV9tb3VudDsKKwkvKgorCSAqIFJlYWQgdGhlIChvbmUgYW5kIG9ubHkpIGRpcmVjdG9yeSBibG9jayBpbnRvIGRhYnVmIGJwLgorCSAqLworCWlmICgoZXJyb3IgPQorCSAgICB4ZnNfZGFfcmVhZF9idWYodHAsIGRwLCBtcC0+bV9kaXJkYXRhYmxrLCAtMSwgJmJwLCBYRlNfREFUQV9GT1JLKSkpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlBU1NFUlQoYnAgIT0gTlVMTCk7CisJYmxvY2sgPSBicC0+ZGF0YTsKKwkvKgorCSAqIENoZWNrIHRoZSBtYWdpYyBudW1iZXIsIGNvcnJ1cHRlZCBpZiB3cm9uZy4KKwkgKi8KKwlpZiAodW5saWtlbHkoSU5UX0dFVChibG9jay0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQkhPSBYRlNfRElSMl9CTE9DS19NQUdJQykpIHsKKwkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19kaXIyX2Jsb2NrX2FkZG5hbWUiLAorCQkJCSAgICAgWEZTX0VSUkxFVkVMX0xPVywgbXAsIGJsb2NrKTsKKwkJeGZzX2RhX2JyZWxzZSh0cCwgYnApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCWxlbiA9IFhGU19ESVIyX0RBVEFfRU5UU0laRShhcmdzLT5uYW1lbGVuKTsKKwkvKgorCSAqIFNldCB1cCBwb2ludGVycyB0byBwYXJ0cyBvZiB0aGUgYmxvY2suCisJICovCisJYmYgPSBibG9jay0+aGRyLmJlc3RmcmVlOworCWJ0cCA9IFhGU19ESVIyX0JMT0NLX1RBSUxfUChtcCwgYmxvY2spOworCWJscCA9IFhGU19ESVIyX0JMT0NLX0xFQUZfUChidHApOworCS8qCisJICogTm8gc3RhbGUgZW50cmllcz8gIE5lZWQgc3BhY2UgZm9yIGVudHJ5IGFuZCBuZXcgbGVhZi4KKwkgKi8KKwlpZiAoIWJ0cC0+c3RhbGUpIHsKKwkJLyoKKwkJICogVGFnIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBsZWFmIGVudHJ5LgorCQkgKi8KKwkJdGFncCA9ICh4ZnNfZGlyMl9kYXRhX29mZl90ICopYmxwIC0gMTsKKwkJLyoKKwkJICogRGF0YSBvYmplY3QganVzdCBiZWZvcmUgdGhlIGZpcnN0IGxlYWYgZW50cnkuCisJCSAqLworCQllbmRkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKSgoY2hhciAqKWJsb2NrICsgSU5UX0dFVCgqdGFncCwgQVJDSF9DT05WRVJUKSk7CisJCS8qCisJCSAqIElmIGl0J3Mgbm90IGZyZWUgdGhlbiBjYW4ndCBkbyB0aGlzIGFkZCB3aXRob3V0IGNsZWFuaW5nIHVwOgorCQkgKiB0aGUgc3BhY2UgYmVmb3JlIHRoZSBmaXJzdCBsZWFmIGVudHJ5IG5lZWRzIHRvIGJlIGZyZWUgc28gaXQKKwkJICogY2FuIGJlIGV4cGFuZGVkIHRvIGhvbGQgdGhlIHBvaW50ZXIgdG8gdGhlIG5ldyBlbnRyeS4KKwkJICovCisJCWlmIChJTlRfR0VUKGVuZGR1cC0+ZnJlZXRhZywgQVJDSF9DT05WRVJUKSAhPSBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKQorCQkJZHVwID0gZW5kZHVwID0gTlVMTDsKKwkJLyoKKwkJICogQ2hlY2sgb3V0IHRoZSBiaWdnZXN0IGZyZWVzcGFjZSBhbmQgc2VlIGlmIGl0J3MgdGhlIHNhbWUgb25lLgorCQkgKi8KKwkJZWxzZSB7CisJCQlkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKQorCQkJICAgICAgKChjaGFyICopYmxvY2sgKyBJTlRfR0VUKGJmWzBdLm9mZnNldCwgQVJDSF9DT05WRVJUKSk7CisJCQlpZiAoZHVwID09IGVuZGR1cCkgeworCQkJCS8qCisJCQkJICogSXQgaXMgdGhlIGJpZ2dlc3QgZnJlZXNwYWNlLCBpcyBpdCB0b28gc21hbGwKKwkJCQkgKiB0byBob2xkIHRoZSBuZXcgbGVhZiB0b28/CisJCQkJICovCisJCQkJaWYgKElOVF9HRVQoZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPCBsZW4gKyAodWludClzaXplb2YoKmJscCkpIHsKKwkJCQkJLyoKKwkJCQkJICogWWVzLCB3ZSB1c2UgdGhlIHNlY29uZC1sYXJnZXN0CisJCQkJCSAqIGVudHJ5IGluc3RlYWQgaWYgaXQgd29ya3MuCisJCQkJCSAqLworCQkJCQlpZiAoSU5UX0dFVChiZlsxXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPj0gbGVuKQorCQkJCQkJZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikKKwkJCQkJCSAgICAgICgoY2hhciAqKWJsb2NrICsKKwkJCQkJCSAgICAgICBJTlRfR0VUKGJmWzFdLm9mZnNldCwgQVJDSF9DT05WRVJUKSk7CisJCQkJCWVsc2UKKwkJCQkJCWR1cCA9IE5VTEw7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIE5vdCB0aGUgc2FtZSBmcmVlIGVudHJ5LAorCQkJCSAqIGp1c3QgY2hlY2sgaXRzIGxlbmd0aC4KKwkJCQkgKi8KKwkJCQlpZiAoSU5UX0dFVChkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKSA8IGxlbikgeworCQkJCQlkdXAgPSBOVUxMOworCQkJCX0KKwkJCX0KKwkJfQorCQljb21wYWN0ID0gMDsKKwl9CisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgc3RhbGUgZW50cmllcyB3ZSdsbCB1c2Ugb25lIGZvciB0aGUgbGVhZi4KKwkgKiBJcyB0aGUgYmlnZ2VzdCBlbnRyeSBlbm91Z2ggdG8gYXZvaWQgY29tcGFjdGlvbj8KKwkgKi8KKwllbHNlIGlmIChJTlRfR0VUKGJmWzBdLmxlbmd0aCwgQVJDSF9DT05WRVJUKSA+PSBsZW4pIHsKKwkJZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikKKwkJICAgICAgKChjaGFyICopYmxvY2sgKyBJTlRfR0VUKGJmWzBdLm9mZnNldCwgQVJDSF9DT05WRVJUKSk7CisJCWNvbXBhY3QgPSAwOworCX0KKwkvKgorCSAqIFdpbGwgbmVlZCB0byBjb21wYWN0IHRvIG1ha2UgdGhpcyB3b3JrLgorCSAqLworCWVsc2UgeworCQkvKgorCQkgKiBUYWcganVzdCBiZWZvcmUgdGhlIGZpcnN0IGxlYWYgZW50cnkuCisJCSAqLworCQl0YWdwID0gKHhmc19kaXIyX2RhdGFfb2ZmX3QgKilibHAgLSAxOworCQkvKgorCQkgKiBEYXRhIG9iamVjdCBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgbGVhZiBlbnRyeS4KKwkJICovCisJCWR1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopKChjaGFyICopYmxvY2sgKyBJTlRfR0VUKCp0YWdwLCBBUkNIX0NPTlZFUlQpKTsKKwkJLyoKKwkJICogSWYgaXQncyBub3QgZnJlZSB0aGVuIHRoZSBkYXRhIHdpbGwgZ28gd2hlcmUgdGhlCisJCSAqIGxlYWYgZGF0YSBzdGFydHMgbm93LCBpZiBpdCB3b3JrcyBhdCBhbGwuCisJCSAqLworCQlpZiAoSU5UX0dFVChkdXAtPmZyZWV0YWcsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfREFUQV9GUkVFX1RBRykgeworCQkJaWYgKElOVF9HRVQoZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgKyAoSU5UX0dFVChidHAtPnN0YWxlLCBBUkNIX0NPTlZFUlQpIC0gMSkgKgorCQkJICAgICh1aW50KXNpemVvZigqYmxwKSA8IGxlbikKKwkJCQlkdXAgPSBOVUxMOworCQl9IGVsc2UgaWYgKChJTlRfR0VUKGJ0cC0+c3RhbGUsIEFSQ0hfQ09OVkVSVCkgLSAxKSAqICh1aW50KXNpemVvZigqYmxwKSA8IGxlbikKKwkJCWR1cCA9IE5VTEw7CisJCWVsc2UKKwkJCWR1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopYmxwOworCQljb21wYWN0ID0gMTsKKwl9CisJLyoKKwkgKiBJZiB0aGlzIGlzbid0IGEgcmVhbCBhZGQsIHdlJ3JlIGRvbmUgd2l0aCB0aGUgYnVmZmVyLgorCSAqLworCWlmIChhcmdzLT5qdXN0Y2hlY2spCisJCXhmc19kYV9icmVsc2UodHAsIGJwKTsKKwkvKgorCSAqIElmIHdlIGRvbid0IGhhdmUgc3BhY2UgZm9yIHRoZSBuZXcgZW50cnkgJiBsZWFmIC4uLgorCSAqLworCWlmICghZHVwKSB7CisJCS8qCisJCSAqIE5vdCB0cnlpbmcgdG8gYWN0dWFsbHkgZG8gYW55dGhpbmcsIG9yIGRvbid0IGhhdmUKKwkJICogYSBzcGFjZSByZXNlcnZhdGlvbjogcmV0dXJuIG5vLXNwYWNlLgorCQkgKi8KKwkJaWYgKGFyZ3MtPmp1c3RjaGVjayB8fCBhcmdzLT50b3RhbCA9PSAwKQorCQkJcmV0dXJuIFhGU19FUlJPUihFTk9TUEMpOworCQkvKgorCQkgKiBDb252ZXJ0IHRvIHRoZSBuZXh0IGxhcmdlciBmb3JtYXQuCisJCSAqIFRoZW4gYWRkIHRoZSBuZXcgZW50cnkgaW4gdGhhdCBmb3JtYXQuCisJCSAqLworCQllcnJvciA9IHhmc19kaXIyX2Jsb2NrX3RvX2xlYWYoYXJncywgYnApOworCQl4ZnNfZGFfYnVmX2RvbmUoYnApOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJCXJldHVybiB4ZnNfZGlyMl9sZWFmX2FkZG5hbWUoYXJncyk7CisJfQorCS8qCisJICogSnVzdCBjaGVja2luZywgYW5kIGl0IHdvdWxkIHdvcmssIHNvIHNheSBzby4KKwkgKi8KKwlpZiAoYXJncy0+anVzdGNoZWNrKQorCQlyZXR1cm4gMDsKKwluZWVkbG9nID0gbmVlZHNjYW4gPSAwOworCS8qCisJICogSWYgbmVlZCB0byBjb21wYWN0IHRoZSBsZWFmIGVudHJpZXMsIGRvIGl0IG5vdy4KKwkgKiBMZWF2ZSB0aGUgaGlnaGVzdC1udW1iZXJlZCBzdGFsZSBlbnRyeSBzdGFsZS4KKwkgKiBYWFggc2hvdWxkIGJlIHRoZSBvbmUgY2xvc2VzdCB0byBtaWQgYnV0IG1pZCBpcyBub3QgeWV0IGNvbXB1dGVkLgorCSAqLworCWlmIChjb21wYWN0KSB7CisJCWludAlmcm9taWR4OwkJLyogc291cmNlIGxlYWYgaW5kZXggKi8KKwkJaW50CXRvaWR4OwkJCS8qIHRhcmdldCBsZWFmIGluZGV4ICovCisKKwkJZm9yIChmcm9taWR4ID0gdG9pZHggPSBJTlRfR0VUKGJ0cC0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxLAorCQkJaGlnaHN0YWxlID0gbGZsb2doaWdoID0gLTE7CisJCSAgICAgZnJvbWlkeCA+PSAwOworCQkgICAgIGZyb21pZHgtLSkgeworCQkJaWYgKElOVF9HRVQoYmxwW2Zyb21pZHhdLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTlVMTF9EQVRBUFRSKSB7CisJCQkJaWYgKGhpZ2hzdGFsZSA9PSAtMSkKKwkJCQkJaGlnaHN0YWxlID0gdG9pZHg7CisJCQkJZWxzZSB7CisJCQkJCWlmIChsZmxvZ2hpZ2ggPT0gLTEpCisJCQkJCQlsZmxvZ2hpZ2ggPSB0b2lkeDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJaWYgKGZyb21pZHggPCB0b2lkeCkKKwkJCQlibHBbdG9pZHhdID0gYmxwW2Zyb21pZHhdOworCQkJdG9pZHgtLTsKKwkJfQorCQlsZmxvZ2xvdyA9IHRvaWR4ICsgMSAtIChJTlRfR0VUKGJ0cC0+c3RhbGUsIEFSQ0hfQ09OVkVSVCkgLSAxKTsKKwkJbGZsb2doaWdoIC09IElOVF9HRVQoYnRwLT5zdGFsZSwgQVJDSF9DT05WRVJUKSAtIDE7CisJCUlOVF9NT0QoYnRwLT5jb3VudCwgQVJDSF9DT05WRVJULCAtKElOVF9HRVQoYnRwLT5zdGFsZSwgQVJDSF9DT05WRVJUKSAtIDEpKTsKKwkJeGZzX2RpcjJfZGF0YV9tYWtlX2ZyZWUodHAsIGJwLAorCQkJKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoY2hhciAqKWJscCAtIChjaGFyICopYmxvY2spLAorCQkJKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoSU5UX0dFVChidHAtPnN0YWxlLCBBUkNIX0NPTlZFUlQpIC0gMSkgKiBzaXplb2YoKmJscCkpLAorCQkJJm5lZWRsb2csICZuZWVkc2Nhbik7CisJCWJscCArPSBJTlRfR0VUKGJ0cC0+c3RhbGUsIEFSQ0hfQ09OVkVSVCkgLSAxOworCQlJTlRfU0VUKGJ0cC0+c3RhbGUsIEFSQ0hfQ09OVkVSVCwgMSk7CisJCS8qCisJCSAqIElmIHdlIG5vdyBuZWVkIHRvIHJlYnVpbGQgdGhlIGJlc3RmcmVlIG1hcCwgZG8gc28uCisJCSAqIFRoaXMgbmVlZHMgdG8gaGFwcGVuIGJlZm9yZSB0aGUgbmV4dCBjYWxsIHRvIHVzZV9mcmVlLgorCQkgKi8KKwkJaWYgKG5lZWRzY2FuKSB7CisJCQl4ZnNfZGlyMl9kYXRhX2ZyZWVzY2FuKG1wLCAoeGZzX2RpcjJfZGF0YV90ICopYmxvY2ssCisJCQkJJm5lZWRsb2csIE5VTEwpOworCQkJbmVlZHNjYW4gPSAwOworCQl9CisJfQorCS8qCisJICogU2V0IGxlYWYgbG9nZ2luZyBib3VuZGFyaWVzIHRvIGltcG9zc2libGUgc3RhdGUuCisJICogRm9yIHRoZSBuby1zdGFsZSBjYXNlIHRoZXkncmUgc2V0IGV4cGxpY2l0bHkuCisJICovCisJZWxzZSBpZiAoSU5UX0dFVChidHAtPnN0YWxlLCBBUkNIX0NPTlZFUlQpKSB7CisJCWxmbG9nbG93ID0gSU5UX0dFVChidHAtPmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQlsZmxvZ2hpZ2ggPSAtMTsKKwl9CisJLyoKKwkgKiBGaW5kIHRoZSBzbG90IHRoYXQncyBmaXJzdCBsb3dlciB0aGFuIG91ciBoYXNoIHZhbHVlLCAtMSBpZiBub25lLgorCSAqLworCWZvciAobG93ID0gMCwgaGlnaCA9IElOVF9HRVQoYnRwLT5jb3VudCwgQVJDSF9DT05WRVJUKSAtIDE7IGxvdyA8PSBoaWdoOyApIHsKKwkJbWlkID0gKGxvdyArIGhpZ2gpID4+IDE7CisJCWlmICgoaGFzaCA9IElOVF9HRVQoYmxwW21pZF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSkgPT0gYXJncy0+aGFzaHZhbCkKKwkJCWJyZWFrOworCQlpZiAoaGFzaCA8IGFyZ3MtPmhhc2h2YWwpCisJCQlsb3cgPSBtaWQgKyAxOworCQllbHNlCisJCQloaWdoID0gbWlkIC0gMTsKKwl9CisJd2hpbGUgKG1pZCA+PSAwICYmIElOVF9HRVQoYmxwW21pZF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSA+PSBhcmdzLT5oYXNodmFsKSB7CisJCW1pZC0tOworCX0KKwkvKgorCSAqIE5vIHN0YWxlIGVudHJpZXMsIHdpbGwgdXNlIGVuZGR1cCBzcGFjZSB0byBob2xkIG5ldyBsZWFmLgorCSAqLworCWlmICghYnRwLT5zdGFsZSkgeworCQkvKgorCQkgKiBNYXJrIHRoZSBzcGFjZSBuZWVkZWQgZm9yIHRoZSBuZXcgbGVhZiBlbnRyeSwgbm93IGluIHVzZS4KKwkJICovCisJCXhmc19kaXIyX2RhdGFfdXNlX2ZyZWUodHAsIGJwLCBlbmRkdXAsCisJCQkoeGZzX2RpcjJfZGF0YV9hb2ZmX3QpCisJCQkoKGNoYXIgKillbmRkdXAgLSAoY2hhciAqKWJsb2NrICsgSU5UX0dFVChlbmRkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKSAtCisJCQkgc2l6ZW9mKCpibHApKSwKKwkJCSh4ZnNfZGlyMl9kYXRhX2FvZmZfdClzaXplb2YoKmJscCksCisJCQkmbmVlZGxvZywgJm5lZWRzY2FuKTsKKwkJLyoKKwkJICogVXBkYXRlIHRoZSB0YWlsIChlbnRyeSBjb3VudCkuCisJCSAqLworCQlJTlRfTU9EKGJ0cC0+Y291bnQsIEFSQ0hfQ09OVkVSVCwgKzEpOworCQkvKgorCQkgKiBJZiB3ZSBub3cgbmVlZCB0byByZWJ1aWxkIHRoZSBiZXN0ZnJlZSBtYXAsIGRvIHNvLgorCQkgKiBUaGlzIG5lZWRzIHRvIGhhcHBlbiBiZWZvcmUgdGhlIG5leHQgY2FsbCB0byB1c2VfZnJlZS4KKwkJICovCisJCWlmIChuZWVkc2NhbikgeworCQkJeGZzX2RpcjJfZGF0YV9mcmVlc2NhbihtcCwgKHhmc19kaXIyX2RhdGFfdCAqKWJsb2NrLAorCQkJCSZuZWVkbG9nLCBOVUxMKTsKKwkJCW5lZWRzY2FuID0gMDsKKwkJfQorCQkvKgorCQkgKiBBZGp1c3QgcG9pbnRlciB0byB0aGUgZmlyc3QgbGVhZiBlbnRyeSwgd2UncmUgYWJvdXQgdG8gbW92ZQorCQkgKiB0aGUgdGFibGUgdXAgb25lIHRvIG9wZW4gdXAgc3BhY2UgZm9yIHRoZSBuZXcgbGVhZiBlbnRyeS4KKwkJICogVGhlbiBhZGp1c3Qgb3VyIGluZGV4IHRvIG1hdGNoLgorCQkgKi8KKwkJYmxwLS07CisJCW1pZCsrOworCQlpZiAobWlkKQorCQkJbWVtbW92ZShibHAsICZibHBbMV0sIG1pZCAqIHNpemVvZigqYmxwKSk7CisJCWxmbG9nbG93ID0gMDsKKwkJbGZsb2doaWdoID0gbWlkOworCX0KKwkvKgorCSAqIFVzZSBhIHN0YWxlIGxlYWYgZm9yIG91ciBuZXcgZW50cnkuCisJICovCisJZWxzZSB7CisJCWZvciAobG93c3RhbGUgPSBtaWQ7CisJCSAgICAgbG93c3RhbGUgPj0gMCAmJgorCQkJSU5UX0dFVChibHBbbG93c3RhbGVdLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RJUjJfTlVMTF9EQVRBUFRSOworCQkgICAgIGxvd3N0YWxlLS0pCisJCQljb250aW51ZTsKKwkJZm9yIChoaWdoc3RhbGUgPSBtaWQgKyAxOworCQkgICAgIGhpZ2hzdGFsZSA8IElOVF9HRVQoYnRwLT5jb3VudCwgQVJDSF9DT05WRVJUKSAmJgorCQkJSU5UX0dFVChibHBbaGlnaHN0YWxlXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpICE9IFhGU19ESVIyX05VTExfREFUQVBUUiAmJgorCQkJKGxvd3N0YWxlIDwgMCB8fCBtaWQgLSBsb3dzdGFsZSA+IGhpZ2hzdGFsZSAtIG1pZCk7CisJCSAgICAgaGlnaHN0YWxlKyspCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogTW92ZSBlbnRyaWVzIHRvd2FyZCB0aGUgbG93LW51bWJlcmVkIHN0YWxlIGVudHJ5LgorCQkgKi8KKwkJaWYgKGxvd3N0YWxlID49IDAgJiYKKwkJICAgIChoaWdoc3RhbGUgPT0gSU5UX0dFVChidHAtPmNvdW50LCBBUkNIX0NPTlZFUlQpIHx8CisJCSAgICAgbWlkIC0gbG93c3RhbGUgPD0gaGlnaHN0YWxlIC0gbWlkKSkgeworCQkJaWYgKG1pZCAtIGxvd3N0YWxlKQorCQkJCW1lbW1vdmUoJmJscFtsb3dzdGFsZV0sICZibHBbbG93c3RhbGUgKyAxXSwKKwkJCQkJKG1pZCAtIGxvd3N0YWxlKSAqIHNpemVvZigqYmxwKSk7CisJCQlsZmxvZ2xvdyA9IE1JTihsb3dzdGFsZSwgbGZsb2dsb3cpOworCQkJbGZsb2doaWdoID0gTUFYKG1pZCwgbGZsb2doaWdoKTsKKwkJfQorCQkvKgorCQkgKiBNb3ZlIGVudHJpZXMgdG93YXJkIHRoZSBoaWdoLW51bWJlcmVkIHN0YWxlIGVudHJ5LgorCQkgKi8KKwkJZWxzZSB7CisJCQlBU1NFUlQoaGlnaHN0YWxlIDwgSU5UX0dFVChidHAtPmNvdW50LCBBUkNIX0NPTlZFUlQpKTsKKwkJCW1pZCsrOworCQkJaWYgKGhpZ2hzdGFsZSAtIG1pZCkKKwkJCQltZW1tb3ZlKCZibHBbbWlkICsgMV0sICZibHBbbWlkXSwKKwkJCQkJKGhpZ2hzdGFsZSAtIG1pZCkgKiBzaXplb2YoKmJscCkpOworCQkJbGZsb2dsb3cgPSBNSU4obWlkLCBsZmxvZ2xvdyk7CisJCQlsZmxvZ2hpZ2ggPSBNQVgoaGlnaHN0YWxlLCBsZmxvZ2hpZ2gpOworCQl9CisJCUlOVF9NT0QoYnRwLT5zdGFsZSwgQVJDSF9DT05WRVJULCAtMSk7CisJfQorCS8qCisJICogUG9pbnQgdG8gdGhlIG5ldyBkYXRhIGVudHJ5LgorCSAqLworCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKilkdXA7CisJLyoKKwkgKiBGaWxsIGluIHRoZSBsZWFmIGVudHJ5LgorCSAqLworCUlOVF9TRVQoYmxwW21pZF0uaGFzaHZhbCwgQVJDSF9DT05WRVJULCBhcmdzLT5oYXNodmFsKTsKKwlJTlRfU0VUKGJscFttaWRdLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUjJfQllURV9UT19EQVRBUFRSKG1wLCAoY2hhciAqKWRlcCAtIChjaGFyICopYmxvY2spKTsKKwl4ZnNfZGlyMl9ibG9ja19sb2dfbGVhZih0cCwgYnAsIGxmbG9nbG93LCBsZmxvZ2hpZ2gpOworCS8qCisJICogTWFyayBzcGFjZSBmb3IgdGhlIGRhdGEgZW50cnkgdXNlZC4KKwkgKi8KKwl4ZnNfZGlyMl9kYXRhX3VzZV9mcmVlKHRwLCBicCwgZHVwLAorCQkoeGZzX2RpcjJfZGF0YV9hb2ZmX3QpKChjaGFyICopZHVwIC0gKGNoYXIgKilibG9jayksCisJCSh4ZnNfZGlyMl9kYXRhX2FvZmZfdClsZW4sICZuZWVkbG9nLCAmbmVlZHNjYW4pOworCS8qCisJICogQ3JlYXRlIHRoZSBuZXcgZGF0YSBlbnRyeS4KKwkgKi8KKwlJTlRfU0VUKGRlcC0+aW51bWJlciwgQVJDSF9DT05WRVJULCBhcmdzLT5pbnVtYmVyKTsKKwlkZXAtPm5hbWVsZW4gPSBhcmdzLT5uYW1lbGVuOworCW1lbWNweShkZXAtPm5hbWUsIGFyZ3MtPm5hbWUsIGFyZ3MtPm5hbWVsZW4pOworCXRhZ3AgPSBYRlNfRElSMl9EQVRBX0VOVFJZX1RBR19QKGRlcCk7CisJSU5UX1NFVCgqdGFncCwgQVJDSF9DT05WRVJULCAoeGZzX2RpcjJfZGF0YV9vZmZfdCkoKGNoYXIgKilkZXAgLSAoY2hhciAqKWJsb2NrKSk7CisJLyoKKwkgKiBDbGVhbiB1cCB0aGUgYmVzdGZyZWUgYXJyYXkgYW5kIGxvZyB0aGUgaGVhZGVyLCB0YWlsLCBhbmQgZW50cnkuCisJICovCisJaWYgKG5lZWRzY2FuKQorCQl4ZnNfZGlyMl9kYXRhX2ZyZWVzY2FuKG1wLCAoeGZzX2RpcjJfZGF0YV90ICopYmxvY2ssICZuZWVkbG9nLAorCQkJTlVMTCk7CisJaWYgKG5lZWRsb2cpCisJCXhmc19kaXIyX2RhdGFfbG9nX2hlYWRlcih0cCwgYnApOworCXhmc19kaXIyX2Jsb2NrX2xvZ190YWlsKHRwLCBicCk7CisJeGZzX2RpcjJfZGF0YV9sb2dfZW50cnkodHAsIGJwLCBkZXApOworCXhmc19kaXIyX2RhdGFfY2hlY2soZHAsIGJwKTsKKwl4ZnNfZGFfYnVmX2RvbmUoYnApOworCXJldHVybiAwOworfQorCisvKgorICogUmVhZGRpciBmb3IgYmxvY2sgZGlyZWN0b3JpZXMuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9ibG9ja19nZXRkZW50cygKKwl4ZnNfdHJhbnNfdAkJKnRwLAkJLyogdHJhbnNhY3Rpb24gKE5VTEwpICovCisJeGZzX2lub2RlX3QJCSpkcCwJCS8qIGluY29yZSBpbm9kZSAqLworCXVpb190CQkJKnVpbywJCS8qIGNhbGxlcidzIGJ1ZmZlciBjb250cm9sICovCisJaW50CQkJKmVvZnAsCQkvKiBlb2YgcmVhY2hlZD8gKG91dCkgKi8KKwl4ZnNfZGlyZW50X3QJCSpkYnAsCQkvKiBjYWxsZXIncyBidWZmZXIgKi8KKwl4ZnNfZGlyMl9wdXRfdAkJcHV0KQkJLyogYWJpJ3MgZm9ybWF0dGluZyBmdW5jdGlvbiAqLworeworCXhmc19kaXIyX2Jsb2NrX3QJKmJsb2NrOwkJLyogZGlyZWN0b3J5IGJsb2NrIHN0cnVjdHVyZSAqLworCXhmc19kYWJ1Zl90CQkqYnA7CQkvKiBidWZmZXIgZm9yIGJsb2NrICovCisJeGZzX2RpcjJfYmxvY2tfdGFpbF90CSpidHA7CQkvKiBibG9jayB0YWlsICovCisJeGZzX2RpcjJfZGF0YV9lbnRyeV90CSpkZXA7CQkvKiBibG9jayBkYXRhIGVudHJ5ICovCisJeGZzX2RpcjJfZGF0YV91bnVzZWRfdAkqZHVwOwkJLyogYmxvY2sgdW51c2VkIGVudHJ5ICovCisJY2hhcgkJCSplbmRwdHI7CS8qIGVuZCBvZiB0aGUgZGF0YSBlbnRyaWVzICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc19kaXIyX3B1dF9hcmdzX3QJcDsJCS8qIGFyZyBwYWNrYWdlIGZvciBwdXQgcnRuICovCisJY2hhcgkJCSpwdHI7CQkvKiBjdXJyZW50IGRhdGEgZW50cnkgKi8KKwlpbnQJCQl3YW50b2ZmOwkvKiBzdGFydGluZyBibG9jayBvZmZzZXQgKi8KKworCW1wID0gZHAtPmlfbW91bnQ7CisJLyoKKwkgKiBJZiB0aGUgYmxvY2sgbnVtYmVyIGluIHRoZSBvZmZzZXQgaXMgb3V0IG9mIHJhbmdlLCB3ZSdyZSBkb25lLgorCSAqLworCWlmIChYRlNfRElSMl9EQVRBUFRSX1RPX0RCKG1wLCB1aW8tPnVpb19vZmZzZXQpID4gbXAtPm1fZGlyZGF0YWJsaykgeworCQkqZW9mcCA9IDE7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIENhbid0IHJlYWQgdGhlIGJsb2NrLCBnaXZlIHVwLCBlbHNlIGdldCBkYWJ1ZiBpbiBicC4KKwkgKi8KKwlpZiAoKGVycm9yID0KKwkgICAgeGZzX2RhX3JlYWRfYnVmKHRwLCBkcCwgbXAtPm1fZGlyZGF0YWJsaywgLTEsICZicCwgWEZTX0RBVEFfRk9SSykpKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJQVNTRVJUKGJwICE9IE5VTEwpOworCS8qCisJICogRXh0cmFjdCB0aGUgYnl0ZSBvZmZzZXQgd2Ugc3RhcnQgYXQgZnJvbSB0aGUgc2VlayBwb2ludGVyLgorCSAqIFdlJ2xsIHNraXAgZW50cmllcyBiZWZvcmUgdGhpcy4KKwkgKi8KKwl3YW50b2ZmID0gWEZTX0RJUjJfREFUQVBUUl9UT19PRkYobXAsIHVpby0+dWlvX29mZnNldCk7CisJYmxvY2sgPSBicC0+ZGF0YTsKKwl4ZnNfZGlyMl9kYXRhX2NoZWNrKGRwLCBicCk7CisJLyoKKwkgKiBTZXQgdXAgdmFsdWVzIGZvciB0aGUgbG9vcC4KKwkgKi8KKwlidHAgPSBYRlNfRElSMl9CTE9DS19UQUlMX1AobXAsIGJsb2NrKTsKKwlwdHIgPSAoY2hhciAqKWJsb2NrLT51OworCWVuZHB0ciA9IChjaGFyICopWEZTX0RJUjJfQkxPQ0tfTEVBRl9QKGJ0cCk7CisJcC5kYnAgPSBkYnA7CisJcC5wdXQgPSBwdXQ7CisJcC51aW8gPSB1aW87CisJLyoKKwkgKiBMb29wIG92ZXIgdGhlIGRhdGEgcG9ydGlvbiBvZiB0aGUgYmxvY2suCisJICogRWFjaCBvYmplY3QgaXMgYSByZWFsIGVudHJ5IChkZXApIG9yIGFuIHVudXNlZCBvbmUgKGR1cCkuCisJICovCisJd2hpbGUgKHB0ciA8IGVuZHB0cikgeworCQlkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKXB0cjsKKwkJLyoKKwkJICogVW51c2VkLCBza2lwIGl0LgorCQkgKi8KKwkJaWYgKElOVF9HRVQoZHVwLT5mcmVldGFnLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0RBVEFfRlJFRV9UQUcpIHsKKwkJCXB0ciArPSBJTlRfR0VUKGR1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpOworCQkJY29udGludWU7CisJCX0KKworCQlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopcHRyOworCisJCS8qCisJCSAqIEJ1bXAgcG9pbnRlciBmb3IgdGhlIG5leHQgaXRlcmF0aW9uLgorCQkgKi8KKwkJcHRyICs9IFhGU19ESVIyX0RBVEFfRU5UU0laRShkZXAtPm5hbWVsZW4pOworCQkvKgorCQkgKiBUaGUgZW50cnkgaXMgYmVmb3JlIHRoZSBkZXNpcmVkIHN0YXJ0aW5nIHBvaW50LCBza2lwIGl0LgorCQkgKi8KKwkJaWYgKChjaGFyICopZGVwIC0gKGNoYXIgKilibG9jayA8IHdhbnRvZmYpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogU2V0IHVwIGFyZ3VtZW50IHN0cnVjdHVyZSBmb3IgcHV0IHJvdXRpbmUuCisJCSAqLworCQlwLm5hbWVsZW4gPSBkZXAtPm5hbWVsZW47CisKKwkJcC5jb29rID0gWEZTX0RJUjJfREJfT0ZGX1RPX0RBVEFQVFIobXAsIG1wLT5tX2RpcmRhdGFibGssCisJCQkJCQkgICAgcHRyIC0gKGNoYXIgKilibG9jayk7CisJCXAuaW5vID0gSU5UX0dFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCk7CisjaWYgWEZTX0JJR19JTlVNUworCQlwLmlubyArPSBtcC0+bV9pbm9hZGQ7CisjZW5kaWYKKwkJcC5uYW1lID0gKGNoYXIgKilkZXAtPm5hbWU7CisKKwkJLyoKKwkJICogUHV0IHRoZSBlbnRyeSBpbiB0aGUgY2FsbGVyJ3MgYnVmZmVyLgorCQkgKi8KKwkJZXJyb3IgPSBwLnB1dCgmcCk7CisKKwkJLyoKKwkJICogSWYgaXQgZGlkbid0IGZpdCwgc2V0IHRoZSBmaW5hbCBvZmZzZXQgdG8gaGVyZSAmIHJldHVybi4KKwkJICovCisJCWlmICghcC5kb25lKSB7CisJCQl1aW8tPnVpb19vZmZzZXQgPQorCQkJCVhGU19ESVIyX0RCX09GRl9UT19EQVRBUFRSKG1wLCBtcC0+bV9kaXJkYXRhYmxrLAorCQkJCQkoY2hhciAqKWRlcCAtIChjaGFyICopYmxvY2spOworCQkJeGZzX2RhX2JyZWxzZSh0cCwgYnApOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJfQorCisJLyoKKwkgKiBSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGJsb2NrLgorCSAqIFNldCB0aGUgb2Zmc2V0IHRvIGEgbm9uZXhpc3RlbnQgYmxvY2sgMSBhbmQgcmV0dXJuLgorCSAqLworCSplb2ZwID0gMTsKKworCXVpby0+dWlvX29mZnNldCA9CisJCVhGU19ESVIyX0RCX09GRl9UT19EQVRBUFRSKG1wLCBtcC0+bV9kaXJkYXRhYmxrICsgMSwgMCk7CisKKwl4ZnNfZGFfYnJlbHNlKHRwLCBicCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExvZyBsZWFmIGVudHJpZXMgZnJvbSB0aGUgYmxvY2suCisgKi8KK3N0YXRpYyB2b2lkCit4ZnNfZGlyMl9ibG9ja19sb2dfbGVhZigKKwl4ZnNfdHJhbnNfdAkJKnRwLAkJLyogdHJhbnNhY3Rpb24gc3RydWN0dXJlICovCisJeGZzX2RhYnVmX3QJCSpicCwJCS8qIGJsb2NrIGJ1ZmZlciAqLworCWludAkJCWZpcnN0LAkJLyogaW5kZXggb2YgZmlyc3QgbG9nZ2VkIGxlYWYgKi8KKwlpbnQJCQlsYXN0KQkJLyogaW5kZXggb2YgbGFzdCBsb2dnZWQgbGVhZiAqLworeworCXhmc19kaXIyX2Jsb2NrX3QJKmJsb2NrOwkJLyogZGlyZWN0b3J5IGJsb2NrIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2xlYWZfZW50cnlfdAkqYmxwOwkJLyogYmxvY2sgbGVhZiBlbnRyaWVzICovCisJeGZzX2RpcjJfYmxvY2tfdGFpbF90CSpidHA7CQkvKiBibG9jayB0YWlsICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKworCW1wID0gdHAtPnRfbW91bnRwOworCWJsb2NrID0gYnAtPmRhdGE7CisJYnRwID0gWEZTX0RJUjJfQkxPQ0tfVEFJTF9QKG1wLCBibG9jayk7CisJYmxwID0gWEZTX0RJUjJfQkxPQ0tfTEVBRl9QKGJ0cCk7CisJeGZzX2RhX2xvZ19idWYodHAsIGJwLCAodWludCkoKGNoYXIgKikmYmxwW2ZpcnN0XSAtIChjaGFyICopYmxvY2spLAorCQkodWludCkoKGNoYXIgKikmYmxwW2xhc3QgKyAxXSAtIChjaGFyICopYmxvY2sgLSAxKSk7Cit9CisKKy8qCisgKiBMb2cgdGhlIGJsb2NrIHRhaWwuCisgKi8KK3N0YXRpYyB2b2lkCit4ZnNfZGlyMl9ibG9ja19sb2dfdGFpbCgKKwl4ZnNfdHJhbnNfdAkJKnRwLAkJLyogdHJhbnNhY3Rpb24gc3RydWN0dXJlICovCisJeGZzX2RhYnVmX3QJCSpicCkJCS8qIGJsb2NrIGJ1ZmZlciAqLworeworCXhmc19kaXIyX2Jsb2NrX3QJKmJsb2NrOwkJLyogZGlyZWN0b3J5IGJsb2NrIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2Jsb2NrX3RhaWxfdAkqYnRwOwkJLyogYmxvY2sgdGFpbCAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisKKwltcCA9IHRwLT50X21vdW50cDsKKwlibG9jayA9IGJwLT5kYXRhOworCWJ0cCA9IFhGU19ESVIyX0JMT0NLX1RBSUxfUChtcCwgYmxvY2spOworCXhmc19kYV9sb2dfYnVmKHRwLCBicCwgKHVpbnQpKChjaGFyICopYnRwIC0gKGNoYXIgKilibG9jayksCisJCSh1aW50KSgoY2hhciAqKShidHAgKyAxKSAtIChjaGFyICopYmxvY2sgLSAxKSk7Cit9CisKKy8qCisgKiBMb29rIHVwIGFuIGVudHJ5IGluIHRoZSBibG9jay4gIFRoaXMgaXMgdGhlIGV4dGVybmFsIHJvdXRpbmUsCisgKiB4ZnNfZGlyMl9ibG9ja19sb29rdXBfaW50IGRvZXMgdGhlIHJlYWwgd29yay4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX2Jsb2NrX2xvb2t1cCgKKwl4ZnNfZGFfYXJnc190CQkqYXJncykJCS8qIGRpciBsb29rdXAgYXJndW1lbnRzICovCit7CisJeGZzX2RpcjJfYmxvY2tfdAkqYmxvY2s7CQkvKiBibG9jayBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmJscDsJCS8qIGJsb2NrIGxlYWYgZW50cmllcyAqLworCXhmc19kYWJ1Zl90CQkqYnA7CQkvKiBibG9jayBidWZmZXIgKi8KKwl4ZnNfZGlyMl9ibG9ja190YWlsX3QJKmJ0cDsJCS8qIGJsb2NrIHRhaWwgKi8KKwl4ZnNfZGlyMl9kYXRhX2VudHJ5X3QJKmRlcDsJCS8qIGJsb2NrIGRhdGEgZW50cnkgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGlub2RlICovCisJaW50CQkJZW50OwkJLyogZW50cnkgaW5kZXggKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzKCJibG9ja19sb29rdXAiLCBhcmdzKTsKKwkvKgorCSAqIEdldCB0aGUgYnVmZmVyLCBsb29rIHVwIHRoZSBlbnRyeS4KKwkgKiBJZiBub3QgZm91bmQgKEVOT0VOVCkgdGhlbiByZXR1cm4sIGhhdmUgbm8gYnVmZmVyLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfZGlyMl9ibG9ja19sb29rdXBfaW50KGFyZ3MsICZicCwgJmVudCkpKQorCQlyZXR1cm4gZXJyb3I7CisJZHAgPSBhcmdzLT5kcDsKKwltcCA9IGRwLT5pX21vdW50OworCWJsb2NrID0gYnAtPmRhdGE7CisJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCwgYnApOworCWJ0cCA9IFhGU19ESVIyX0JMT0NLX1RBSUxfUChtcCwgYmxvY2spOworCWJscCA9IFhGU19ESVIyX0JMT0NLX0xFQUZfUChidHApOworCS8qCisJICogR2V0IHRoZSBvZmZzZXQgZnJvbSB0aGUgbGVhZiBlbnRyeSwgdG8gcG9pbnQgdG8gdGhlIGRhdGEuCisJICovCisJZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKQorCSAgICAgICgoY2hhciAqKWJsb2NrICsgWEZTX0RJUjJfREFUQVBUUl9UT19PRkYobXAsIElOVF9HRVQoYmxwW2VudF0uYWRkcmVzcywgQVJDSF9DT05WRVJUKSkpOworCS8qCisJICogRmlsbCBpbiBpbm9kZSBudW1iZXIsIHJlbGVhc2UgdGhlIGJsb2NrLgorCSAqLworCWFyZ3MtPmludW1iZXIgPSBJTlRfR0VUKGRlcC0+aW51bWJlciwgQVJDSF9DT05WRVJUKTsKKwl4ZnNfZGFfYnJlbHNlKGFyZ3MtPnRyYW5zLCBicCk7CisJcmV0dXJuIFhGU19FUlJPUihFRVhJU1QpOworfQorCisvKgorICogSW50ZXJuYWwgYmxvY2sgbG9va3VwIHJvdXRpbmUuCisgKi8KK3N0YXRpYyBpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9ibG9ja19sb29rdXBfaW50KAorCXhmc19kYV9hcmdzX3QJCSphcmdzLAkJLyogZGlyIGxvb2t1cCBhcmd1bWVudHMgKi8KKwl4ZnNfZGFidWZfdAkJKipicHAsCQkvKiByZXR1cm5lZCBibG9jayBidWZmZXIgKi8KKwlpbnQJCQkqZW50bm8pCQkvKiByZXR1cm5lZCBlbnRyeSBudW1iZXIgKi8KK3sKKwl4ZnNfZGlyMl9kYXRhcHRyX3QJYWRkcjsJCS8qIGRhdGEgZW50cnkgYWRkcmVzcyAqLworCXhmc19kaXIyX2Jsb2NrX3QJKmJsb2NrOwkJLyogYmxvY2sgc3RydWN0dXJlICovCisJeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpibHA7CQkvKiBibG9jayBsZWFmIGVudHJpZXMgKi8KKwl4ZnNfZGFidWZfdAkJKmJwOwkJLyogYmxvY2sgYnVmZmVyICovCisJeGZzX2RpcjJfYmxvY2tfdGFpbF90CSpidHA7CQkvKiBibG9jayB0YWlsICovCisJeGZzX2RpcjJfZGF0YV9lbnRyeV90CSpkZXA7CQkvKiBibG9jayBkYXRhIGVudHJ5ICovCisJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBpbm9kZSAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX2RhaGFzaF90CQloYXNoOwkJLyogZm91bmQgaGFzaCB2YWx1ZSAqLworCWludAkJCWhpZ2g7CQkvKiBiaW5hcnkgc2VhcmNoIGhpZ2ggaW5kZXggKi8KKwlpbnQJCQlsb3c7CQkvKiBiaW5hcnkgc2VhcmNoIGxvdyBpbmRleCAqLworCWludAkJCW1pZDsJCS8qIGJpbmFyeSBzZWFyY2ggY3VycmVudCBpZHggKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc190cmFuc190CQkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisKKwlkcCA9IGFyZ3MtPmRwOworCXRwID0gYXJncy0+dHJhbnM7CisJbXAgPSBkcC0+aV9tb3VudDsKKwkvKgorCSAqIFJlYWQgdGhlIGJ1ZmZlciwgcmV0dXJuIGVycm9yIGlmIHdlIGNhbid0IGdldCBpdC4KKwkgKi8KKwlpZiAoKGVycm9yID0KKwkgICAgeGZzX2RhX3JlYWRfYnVmKHRwLCBkcCwgbXAtPm1fZGlyZGF0YWJsaywgLTEsICZicCwgWEZTX0RBVEFfRk9SSykpKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJQVNTRVJUKGJwICE9IE5VTEwpOworCWJsb2NrID0gYnAtPmRhdGE7CisJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCwgYnApOworCWJ0cCA9IFhGU19ESVIyX0JMT0NLX1RBSUxfUChtcCwgYmxvY2spOworCWJscCA9IFhGU19ESVIyX0JMT0NLX0xFQUZfUChidHApOworCS8qCisJICogTG9vcCBkb2luZyBhIGJpbmFyeSBzZWFyY2ggZm9yIG91ciBoYXNoIHZhbHVlLgorCSAqIEZpbmQgb3VyIGVudHJ5LCBFTk9FTlQgaWYgaXQncyBub3QgdGhlcmUuCisJICovCisJZm9yIChsb3cgPSAwLCBoaWdoID0gSU5UX0dFVChidHAtPmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gMTsgOyApIHsKKwkJQVNTRVJUKGxvdyA8PSBoaWdoKTsKKwkJbWlkID0gKGxvdyArIGhpZ2gpID4+IDE7CisJCWlmICgoaGFzaCA9IElOVF9HRVQoYmxwW21pZF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSkgPT0gYXJncy0+aGFzaHZhbCkKKwkJCWJyZWFrOworCQlpZiAoaGFzaCA8IGFyZ3MtPmhhc2h2YWwpCisJCQlsb3cgPSBtaWQgKyAxOworCQllbHNlCisJCQloaWdoID0gbWlkIC0gMTsKKwkJaWYgKGxvdyA+IGhpZ2gpIHsKKwkJCUFTU0VSVChhcmdzLT5va25vZW50KTsKKwkJCXhmc19kYV9icmVsc2UodHAsIGJwKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRU5PRU5UKTsKKwkJfQorCX0KKwkvKgorCSAqIEJhY2sgdXAgdG8gdGhlIGZpcnN0IG9uZSB3aXRoIHRoZSByaWdodCBoYXNoIHZhbHVlLgorCSAqLworCXdoaWxlIChtaWQgPiAwICYmIElOVF9HRVQoYmxwW21pZCAtIDFdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPT0gYXJncy0+aGFzaHZhbCkgeworCQltaWQtLTsKKwl9CisJLyoKKwkgKiBOb3cgbG9vcCBmb3J3YXJkIHRocm91Z2ggYWxsIHRoZSBlbnRyaWVzIHdpdGggdGhlCisJICogcmlnaHQgaGFzaCB2YWx1ZSBsb29raW5nIGZvciBvdXIgbmFtZS4KKwkgKi8KKwlkbyB7CisJCWlmICgoYWRkciA9IElOVF9HRVQoYmxwW21pZF0uYWRkcmVzcywgQVJDSF9DT05WRVJUKSkgPT0gWEZTX0RJUjJfTlVMTF9EQVRBUFRSKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIEdldCBwb2ludGVyIHRvIHRoZSBlbnRyeSBmcm9tIHRoZSBsZWFmLgorCQkgKi8KKwkJZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKQorCQkJKChjaGFyICopYmxvY2sgKyBYRlNfRElSMl9EQVRBUFRSX1RPX09GRihtcCwgYWRkcikpOworCQkvKgorCQkgKiBDb21wYXJlLCBpZiBpdCdzIHJpZ2h0IGdpdmUgYmFjayBidWZmZXIgJiBlbnRyeSBudW1iZXIuCisJCSAqLworCQlpZiAoZGVwLT5uYW1lbGVuID09IGFyZ3MtPm5hbWVsZW4gJiYKKwkJICAgIGRlcC0+bmFtZVswXSA9PSBhcmdzLT5uYW1lWzBdICYmCisJCSAgICBtZW1jbXAoZGVwLT5uYW1lLCBhcmdzLT5uYW1lLCBhcmdzLT5uYW1lbGVuKSA9PSAwKSB7CisJCQkqYnBwID0gYnA7CisJCQkqZW50bm8gPSBtaWQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gd2hpbGUgKCsrbWlkIDwgSU5UX0dFVChidHAtPmNvdW50LCBBUkNIX0NPTlZFUlQpICYmIElOVF9HRVQoYmxwW21pZF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSA9PSBoYXNoKTsKKwkvKgorCSAqIE5vIG1hdGNoLCByZWxlYXNlIHRoZSBidWZmZXIgYW5kIHJldHVybiBFTk9FTlQuCisJICovCisJQVNTRVJUKGFyZ3MtPm9rbm9lbnQpOworCXhmc19kYV9icmVsc2UodHAsIGJwKTsKKwlyZXR1cm4gWEZTX0VSUk9SKEVOT0VOVCk7Cit9CisKKy8qCisgKiBSZW1vdmUgYW4gZW50cnkgZnJvbSBhIGJsb2NrIGZvcm1hdCBkaXJlY3RvcnkuCisgKiBJZiB0aGF0IG1ha2VzIHRoZSBibG9jayBzbWFsbCBlbm91Z2ggdG8gZml0IGluIHNob3J0Zm9ybSwgdHJhbnNmb3JtIGl0LgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfYmxvY2tfcmVtb3ZlbmFtZSgKKwl4ZnNfZGFfYXJnc190CQkqYXJncykJCS8qIGRpcmVjdG9yeSBvcGVyYXRpb24gYXJncyAqLworeworCXhmc19kaXIyX2Jsb2NrX3QJKmJsb2NrOwkJLyogYmxvY2sgc3RydWN0dXJlICovCisJeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpibHA7CQkvKiBibG9jayBsZWFmIHBvaW50ZXIgKi8KKwl4ZnNfZGFidWZfdAkJKmJwOwkJLyogYmxvY2sgYnVmZmVyICovCisJeGZzX2RpcjJfYmxvY2tfdGFpbF90CSpidHA7CQkvKiBibG9jayB0YWlsICovCisJeGZzX2RpcjJfZGF0YV9lbnRyeV90CSpkZXA7CQkvKiBibG9jayBkYXRhIGVudHJ5ICovCisJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBpbm9kZSAqLworCWludAkJCWVudDsJCS8qIGJsb2NrIGxlYWYgZW50cnkgaW5kZXggKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJaW50CQkJbmVlZGxvZzsJLyogbmVlZCB0byBsb2cgYmxvY2sgaGVhZGVyICovCisJaW50CQkJbmVlZHNjYW47CS8qIG5lZWQgdG8gZml4dXAgYmVzdGZyZWUgKi8KKwl4ZnNfZGlyMl9zZl9oZHJfdAlzZmg7CQkvKiBzaG9ydGZvcm0gaGVhZGVyICovCisJaW50CQkJc2l6ZTsJCS8qIHNob3J0Zm9ybSBzaXplICovCisJeGZzX3RyYW5zX3QJCSp0cDsJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3MoImJsb2NrX3JlbW92ZW5hbWUiLCBhcmdzKTsKKwkvKgorCSAqIExvb2sgdXAgdGhlIGVudHJ5IGluIHRoZSBibG9jay4gIEdldHMgdGhlIGJ1ZmZlciBhbmQgZW50cnkgaW5kZXguCisJICogSXQgd2lsbCBhbHdheXMgYmUgdGhlcmUsIHRoZSB2bm9kZW9wcyBsZXZlbCBkb2VzIGEgbG9va3VwIGZpcnN0LgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfZGlyMl9ibG9ja19sb29rdXBfaW50KGFyZ3MsICZicCwgJmVudCkpKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJZHAgPSBhcmdzLT5kcDsKKwl0cCA9IGFyZ3MtPnRyYW5zOworCW1wID0gZHAtPmlfbW91bnQ7CisJYmxvY2sgPSBicC0+ZGF0YTsKKwlidHAgPSBYRlNfRElSMl9CTE9DS19UQUlMX1AobXAsIGJsb2NrKTsKKwlibHAgPSBYRlNfRElSMl9CTE9DS19MRUFGX1AoYnRwKTsKKwkvKgorCSAqIFBvaW50IHRvIHRoZSBkYXRhIGVudHJ5IHVzaW5nIHRoZSBsZWFmIGVudHJ5LgorCSAqLworCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKikKKwkgICAgICAoKGNoYXIgKilibG9jayArIFhGU19ESVIyX0RBVEFQVFJfVE9fT0ZGKG1wLCBJTlRfR0VUKGJscFtlbnRdLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkpKTsKKwkvKgorCSAqIE1hcmsgdGhlIGRhdGEgZW50cnkncyBzcGFjZSBmcmVlLgorCSAqLworCW5lZWRsb2cgPSBuZWVkc2NhbiA9IDA7CisJeGZzX2RpcjJfZGF0YV9tYWtlX2ZyZWUodHAsIGJwLAorCQkoeGZzX2RpcjJfZGF0YV9hb2ZmX3QpKChjaGFyICopZGVwIC0gKGNoYXIgKilibG9jayksCisJCVhGU19ESVIyX0RBVEFfRU5UU0laRShkZXAtPm5hbWVsZW4pLCAmbmVlZGxvZywgJm5lZWRzY2FuKTsKKwkvKgorCSAqIEZpeCB1cCB0aGUgYmxvY2sgdGFpbC4KKwkgKi8KKwlJTlRfTU9EKGJ0cC0+c3RhbGUsIEFSQ0hfQ09OVkVSVCwgKzEpOworCXhmc19kaXIyX2Jsb2NrX2xvZ190YWlsKHRwLCBicCk7CisJLyoKKwkgKiBSZW1vdmUgdGhlIGxlYWYgZW50cnkgYnkgbWFya2luZyBpdCBzdGFsZS4KKwkgKi8KKwlJTlRfU0VUKGJscFtlbnRdLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUjJfTlVMTF9EQVRBUFRSKTsKKwl4ZnNfZGlyMl9ibG9ja19sb2dfbGVhZih0cCwgYnAsIGVudCwgZW50KTsKKwkvKgorCSAqIEZpeCB1cCBiZXN0ZnJlZSwgbG9nIHRoZSBoZWFkZXIgaWYgbmVjZXNzYXJ5LgorCSAqLworCWlmIChuZWVkc2NhbikKKwkJeGZzX2RpcjJfZGF0YV9mcmVlc2NhbihtcCwgKHhmc19kaXIyX2RhdGFfdCAqKWJsb2NrLCAmbmVlZGxvZywKKwkJCU5VTEwpOworCWlmIChuZWVkbG9nKQorCQl4ZnNfZGlyMl9kYXRhX2xvZ19oZWFkZXIodHAsIGJwKTsKKwl4ZnNfZGlyMl9kYXRhX2NoZWNrKGRwLCBicCk7CisJLyoKKwkgKiBTZWUgaWYgdGhlIHNpemUgYXMgYSBzaG9ydGZvcm0gaXMgZ29vZCBlbm91Z2guCisJICovCisJaWYgKChzaXplID0geGZzX2RpcjJfYmxvY2tfc2ZzaXplKGRwLCBibG9jaywgJnNmaCkpID4KKwkgICAgWEZTX0lGT1JLX0RTSVpFKGRwKSkgeworCQl4ZnNfZGFfYnVmX2RvbmUoYnApOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBJZiBpdCB3b3JrcywgZG8gdGhlIGNvbnZlcnNpb24uCisJICovCisJcmV0dXJuIHhmc19kaXIyX2Jsb2NrX3RvX3NmKGFyZ3MsIGJwLCBzaXplLCAmc2ZoKTsKK30KKworLyoKKyAqIFJlcGxhY2UgYW4gZW50cnkgaW4gYSBWMiBibG9jayBkaXJlY3RvcnkuCisgKiBDaGFuZ2UgdGhlIGlub2RlIG51bWJlciB0byB0aGUgbmV3IHZhbHVlLgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfYmxvY2tfcmVwbGFjZSgKKwl4ZnNfZGFfYXJnc190CQkqYXJncykJCS8qIGRpcmVjdG9yeSBvcGVyYXRpb24gYXJncyAqLworeworCXhmc19kaXIyX2Jsb2NrX3QJKmJsb2NrOwkJLyogYmxvY2sgc3RydWN0dXJlICovCisJeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpibHA7CQkvKiBibG9jayBsZWFmIGVudHJpZXMgKi8KKwl4ZnNfZGFidWZfdAkJKmJwOwkJLyogYmxvY2sgYnVmZmVyICovCisJeGZzX2RpcjJfYmxvY2tfdGFpbF90CSpidHA7CQkvKiBibG9jayB0YWlsICovCisJeGZzX2RpcjJfZGF0YV9lbnRyeV90CSpkZXA7CQkvKiBibG9jayBkYXRhIGVudHJ5ICovCisJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBpbm9kZSAqLworCWludAkJCWVudDsJCS8qIGxlYWYgZW50cnkgaW5kZXggKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzKCJibG9ja19yZXBsYWNlIiwgYXJncyk7CisJLyoKKwkgKiBMb29rdXAgdGhlIGVudHJ5IGluIHRoZSBkaXJlY3RvcnkuICBHZXQgYnVmZmVyIGFuZCBlbnRyeSBpbmRleC4KKwkgKiBUaGlzIHdpbGwgYWx3YXlzIHN1Y2NlZWQgc2luY2UgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBkb25lIGEgbG9va3VwLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfZGlyMl9ibG9ja19sb29rdXBfaW50KGFyZ3MsICZicCwgJmVudCkpKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJZHAgPSBhcmdzLT5kcDsKKwltcCA9IGRwLT5pX21vdW50OworCWJsb2NrID0gYnAtPmRhdGE7CisJYnRwID0gWEZTX0RJUjJfQkxPQ0tfVEFJTF9QKG1wLCBibG9jayk7CisJYmxwID0gWEZTX0RJUjJfQkxPQ0tfTEVBRl9QKGJ0cCk7CisJLyoKKwkgKiBQb2ludCB0byB0aGUgZGF0YSBlbnRyeSB3ZSBuZWVkIHRvIGNoYW5nZS4KKwkgKi8KKwlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopCisJICAgICAgKChjaGFyICopYmxvY2sgKyBYRlNfRElSMl9EQVRBUFRSX1RPX09GRihtcCwgSU5UX0dFVChibHBbZW50XS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpKSk7CisJQVNTRVJUKElOVF9HRVQoZGVwLT5pbnVtYmVyLCBBUkNIX0NPTlZFUlQpICE9IGFyZ3MtPmludW1iZXIpOworCS8qCisJICogQ2hhbmdlIHRoZSBpbm9kZSBudW1iZXIgdG8gdGhlIG5ldyB2YWx1ZS4KKwkgKi8KKwlJTlRfU0VUKGRlcC0+aW51bWJlciwgQVJDSF9DT05WRVJULCBhcmdzLT5pbnVtYmVyKTsKKwl4ZnNfZGlyMl9kYXRhX2xvZ19lbnRyeShhcmdzLT50cmFucywgYnAsIGRlcCk7CisJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCwgYnApOworCXhmc19kYV9idWZfZG9uZShicCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBRc29ydCBjb21wYXJpc29uIHJvdXRpbmUgZm9yIHRoZSBibG9jayBsZWFmIGVudHJpZXMuCisgKi8KK3N0YXRpYyBpbnQJCQkJCS8qIHNvcnQgb3JkZXIgKi8KK3hmc19kaXIyX2Jsb2NrX3NvcnQoCisJY29uc3Qgdm9pZAkJCSphLAkvKiBmaXJzdCBsZWFmIGVudHJ5ICovCisJY29uc3Qgdm9pZAkJCSpiKQkvKiBzZWNvbmQgbGVhZiBlbnRyeSAqLworeworCWNvbnN0IHhmc19kaXIyX2xlYWZfZW50cnlfdAkqbGE7CS8qIGZpcnN0IGxlYWYgZW50cnkgKi8KKwljb25zdCB4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmxiOwkvKiBzZWNvbmQgbGVhZiBlbnRyeSAqLworCisJbGEgPSBhOworCWxiID0gYjsKKwlyZXR1cm4gSU5UX0dFVChsYS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA8IElOVF9HRVQobGItPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPyAtMSA6CisJCShJTlRfR0VUKGxhLT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpID4gSU5UX0dFVChsYi0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA/IDEgOiAwKTsKK30KKworLyoKKyAqIENvbnZlcnQgYSBWMiBsZWFmIGRpcmVjdG9yeSB0byBhIFYyIGJsb2NrIGRpcmVjdG9yeSBpZiBwb3NzaWJsZS4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX2xlYWZfdG9fYmxvY2soCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MsCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCisJeGZzX2RhYnVmX3QJCSpsYnAsCQkvKiBsZWFmIGJ1ZmZlciAqLworCXhmc19kYWJ1Zl90CQkqZGJwKQkJLyogZGF0YSBidWZmZXIgKi8KK3sKKwl4ZnNfZGlyMl9kYXRhX29mZl90CSpiZXN0c3A7CS8qIGxlYWYgYmVzdHMgdGFibGUgKi8KKwl4ZnNfZGlyMl9ibG9ja190CSpibG9jazsJCS8qIGJsb2NrIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2Jsb2NrX3RhaWxfdAkqYnRwOwkJLyogYmxvY2sgdGFpbCAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJeGZzX2RpcjJfZGF0YV91bnVzZWRfdAkqZHVwOwkJLyogdW51c2VkIGRhdGEgZW50cnkgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWZyb207CQkvKiBsZWFmIGZyb20gaW5kZXggKi8KKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmxlcDsJCS8qIGxlYWYgZW50cnkgKi8KKwl4ZnNfZGlyMl9sZWFmX3RhaWxfdAkqbHRwOwkJLyogbGVhZiB0YWlsIHN0cnVjdHVyZSAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCWludAkJCW5lZWRsb2c7CS8qIG5lZWQgdG8gbG9nIGRhdGEgaGVhZGVyICovCisJaW50CQkJbmVlZHNjYW47CS8qIG5lZWQgdG8gc2NhbiBmb3IgYmVzdGZyZWUgKi8KKwl4ZnNfZGlyMl9zZl9oZHJfdAlzZmg7CQkvKiBzaG9ydGZvcm0gaGVhZGVyICovCisJaW50CQkJc2l6ZTsJCS8qIGJ5dGVzIHVzZWQgKi8KKwl4ZnNfZGlyMl9kYXRhX29mZl90CSp0YWdwOwkJLyogZW5kIG9mIGVudHJ5ICh0YWcpICovCisJaW50CQkJdG87CQkvKiBibG9jay9sZWFmIHRvIGluZGV4ICovCisJeGZzX3RyYW5zX3QJCSp0cDsJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3NfYmIoImxlYWZfdG9fYmxvY2siLCBhcmdzLCBsYnAsIGRicCk7CisJZHAgPSBhcmdzLT5kcDsKKwl0cCA9IGFyZ3MtPnRyYW5zOworCW1wID0gZHAtPmlfbW91bnQ7CisJbGVhZiA9IGxicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9MRUFGMV9NQUdJQyk7CisJbHRwID0gWEZTX0RJUjJfTEVBRl9UQUlMX1AobXAsIGxlYWYpOworCS8qCisJICogSWYgdGhlcmUgYXJlIGRhdGEgYmxvY2tzIG90aGVyIHRoYW4gdGhlIGZpcnN0IG9uZSwgdGFrZSB0aGlzCisJICogb3Bwb3J0dW5pdHkgdG8gcmVtb3ZlIHRyYWlsaW5nIGVtcHR5IGRhdGEgYmxvY2tzIHRoYXQgbWF5IGhhdmUKKwkgKiBiZWVuIGxlZnQgYmVoaW5kIGR1cmluZyBuby1zcGFjZS1yZXNlcnZhdGlvbiBvcGVyYXRpb25zLgorCSAqIFRoZXNlIHdpbGwgc2hvdyB1cCBpbiB0aGUgbGVhZiBiZXN0cyB0YWJsZS4KKwkgKi8KKwl3aGlsZSAoZHAtPmlfZC5kaV9zaXplID4gbXAtPm1fZGlyYmxrc2l6ZSkgeworCQliZXN0c3AgPSBYRlNfRElSMl9MRUFGX0JFU1RTX1AobHRwKTsKKwkJaWYgKElOVF9HRVQoYmVzdHNwW0lOVF9HRVQobHRwLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxXSwgQVJDSF9DT05WRVJUKSA9PQorCQkgICAgbXAtPm1fZGlyYmxrc2l6ZSAtICh1aW50KXNpemVvZihibG9jay0+aGRyKSkgeworCQkJaWYgKChlcnJvciA9CisJCQkgICAgeGZzX2RpcjJfbGVhZl90cmltX2RhdGEoYXJncywgbGJwLAorCQkJCSAgICAoeGZzX2RpcjJfZGJfdCkoSU5UX0dFVChsdHAtPmJlc3Rjb3VudCwgQVJDSF9DT05WRVJUKSAtIDEpKSkpCisJCQkJZ290byBvdXQ7CisJCX0gZWxzZSB7CisJCQllcnJvciA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwkvKgorCSAqIFJlYWQgdGhlIGRhdGEgYmxvY2sgaWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGl0LCBnaXZlIHVwIGlmIGl0IGZhaWxzLgorCSAqLworCWlmIChkYnAgPT0gTlVMTCAmJgorCSAgICAoZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYodHAsIGRwLCBtcC0+bV9kaXJkYXRhYmxrLCAtMSwgJmRicCwKKwkJICAgIFhGU19EQVRBX0ZPUkspKSkgeworCQlnb3RvIG91dDsKKwl9CisJYmxvY2sgPSBkYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQoYmxvY2stPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9EQVRBX01BR0lDKTsKKwkvKgorCSAqIFNpemUgb2YgdGhlICJsZWFmIiBhcmVhIGluIHRoZSBibG9jay4KKwkgKi8KKwlzaXplID0gKHVpbnQpc2l6ZW9mKGJsb2NrLT50YWlsKSArCisJICAgICAgICh1aW50KXNpemVvZigqbGVwKSAqIChJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIElOVF9HRVQobGVhZi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQpKTsKKwkvKgorCSAqIExvb2sgYXQgdGhlIGxhc3QgZGF0YSBlbnRyeS4KKwkgKi8KKwl0YWdwID0gKHhmc19kaXIyX2RhdGFfb2ZmX3QgKikoKGNoYXIgKilibG9jayArIG1wLT5tX2RpcmJsa3NpemUpIC0gMTsKKwlkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKSgoY2hhciAqKWJsb2NrICsgSU5UX0dFVCgqdGFncCwgQVJDSF9DT05WRVJUKSk7CisJLyoKKwkgKiBJZiBpdCdzIG5vdCBmcmVlIG9yIGlzIHRvbyBzaG9ydCB3ZSBjYW4ndCBkbyBpdC4KKwkgKi8KKwlpZiAoSU5UX0dFVChkdXAtPmZyZWV0YWcsIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RJUjJfREFUQV9GUkVFX1RBRyB8fCBJTlRfR0VUKGR1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpIDwgc2l6ZSkgeworCQllcnJvciA9IDA7CisJCWdvdG8gb3V0OworCX0KKwkvKgorCSAqIFN0YXJ0IGNvbnZlcnRpbmcgaXQgdG8gYmxvY2sgZm9ybS4KKwkgKi8KKwlJTlRfU0VUKGJsb2NrLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUjJfQkxPQ0tfTUFHSUMpOworCW5lZWRsb2cgPSAxOworCW5lZWRzY2FuID0gMDsKKwkvKgorCSAqIFVzZSB1cCB0aGUgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2sgKGJscC9idHApLgorCSAqLworCXhmc19kaXIyX2RhdGFfdXNlX2ZyZWUodHAsIGRicCwgZHVwLCBtcC0+bV9kaXJibGtzaXplIC0gc2l6ZSwgc2l6ZSwKKwkJJm5lZWRsb2csICZuZWVkc2Nhbik7CisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBibG9jayB0YWlsLgorCSAqLworCWJ0cCA9IFhGU19ESVIyX0JMT0NLX1RBSUxfUChtcCwgYmxvY2spOworCUlOVF9TRVQoYnRwLT5jb3VudCwgQVJDSF9DT05WRVJULCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIElOVF9HRVQobGVhZi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQpKTsKKwlidHAtPnN0YWxlID0gMDsKKwl4ZnNfZGlyMl9ibG9ja19sb2dfdGFpbCh0cCwgZGJwKTsKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGJsb2NrIGxlYWYgYXJlYS4gIFdlIGNvbXBhY3Qgb3V0IHN0YWxlIGVudHJpZXMuCisJICovCisJbGVwID0gWEZTX0RJUjJfQkxPQ0tfTEVBRl9QKGJ0cCk7CisJZm9yIChmcm9tID0gdG8gPSAwOyBmcm9tIDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7IGZyb20rKykgeworCQlpZiAoSU5UX0dFVChsZWFmLT5lbnRzW2Zyb21dLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTlVMTF9EQVRBUFRSKQorCQkJY29udGludWU7CisJCWxlcFt0bysrXSA9IGxlYWYtPmVudHNbZnJvbV07CisJfQorCUFTU0VSVCh0byA9PSBJTlRfR0VUKGJ0cC0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpOworCXhmc19kaXIyX2Jsb2NrX2xvZ19sZWFmKHRwLCBkYnAsIDAsIElOVF9HRVQoYnRwLT5jb3VudCwgQVJDSF9DT05WRVJUKSAtIDEpOworCS8qCisJICogU2NhbiB0aGUgYmVzdGZyZWUgaWYgd2UgbmVlZCBpdCBhbmQgbG9nIHRoZSBkYXRhIGJsb2NrIGhlYWRlci4KKwkgKi8KKwlpZiAobmVlZHNjYW4pCisJCXhmc19kaXIyX2RhdGFfZnJlZXNjYW4obXAsICh4ZnNfZGlyMl9kYXRhX3QgKilibG9jaywgJm5lZWRsb2csCisJCQlOVUxMKTsKKwlpZiAobmVlZGxvZykKKwkJeGZzX2RpcjJfZGF0YV9sb2dfaGVhZGVyKHRwLCBkYnApOworCS8qCisJICogUGl0Y2ggdGhlIG9sZCBsZWFmIGJsb2NrLgorCSAqLworCWVycm9yID0geGZzX2RhX3Nocmlua19pbm9kZShhcmdzLCBtcC0+bV9kaXJsZWFmYmxrLCBsYnApOworCWxicCA9IE5VTEw7CisJaWYgKGVycm9yKSB7CisJCWdvdG8gb3V0OworCX0KKwkvKgorCSAqIE5vdyBzZWUgaWYgdGhlIHJlc3VsdGluZyBibG9jayBjYW4gYmUgc2hydW5rZW4gdG8gc2hvcnRmb3JtLgorCSAqLworCWlmICgoc2l6ZSA9IHhmc19kaXIyX2Jsb2NrX3Nmc2l6ZShkcCwgYmxvY2ssICZzZmgpKSA+CisJICAgIFhGU19JRk9SS19EU0laRShkcCkpIHsKKwkJZXJyb3IgPSAwOworCQlnb3RvIG91dDsKKwl9CisJcmV0dXJuIHhmc19kaXIyX2Jsb2NrX3RvX3NmKGFyZ3MsIGRicCwgc2l6ZSwgJnNmaCk7CitvdXQ6CisJaWYgKGxicCkKKwkJeGZzX2RhX2J1Zl9kb25lKGxicCk7CisJaWYgKGRicCkKKwkJeGZzX2RhX2J1Zl9kb25lKGRicCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogQ29udmVydCB0aGUgc2hvcnRmb3JtIGRpcmVjdG9yeSB0byBibG9jayBmb3JtLgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfc2ZfdG9fYmxvY2soCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MpCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCit7CisJeGZzX2RpcjJfZGJfdAkJYmxrbm87CQkvKiBkaXItcmVsYXRpdmUgYmxvY2sgIyAoMCkgKi8KKwl4ZnNfZGlyMl9ibG9ja190CSpibG9jazsJCS8qIGJsb2NrIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2xlYWZfZW50cnlfdAkqYmxwOwkJLyogYmxvY2sgbGVhZiBlbnRyaWVzICovCisJeGZzX2RhYnVmX3QJCSpicDsJCS8qIGJsb2NrIGJ1ZmZlciAqLworCXhmc19kaXIyX2Jsb2NrX3RhaWxfdAkqYnRwOwkJLyogYmxvY2sgdGFpbCBwb2ludGVyICovCisJY2hhcgkJCSpidWY7CQkvKiBzZiBidWZmZXIgKi8KKwlpbnQJCQlidWZfbGVuOworCXhmc19kaXIyX2RhdGFfZW50cnlfdAkqZGVwOwkJLyogZGF0YSBlbnRyeSBwb2ludGVyICovCisJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwlpbnQJCQlkdW1teTsJCS8qIHRyYXNoICovCisJeGZzX2RpcjJfZGF0YV91bnVzZWRfdAkqZHVwOwkJLyogdW51c2VkIGVudHJ5IHBvaW50ZXIgKi8KKwlpbnQJCQllbmRvZmZzZXQ7CS8qIGVuZCBvZiBkYXRhIG9iamVjdHMgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWk7CQkvKiBpbmRleCAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJaW50CQkJbmVlZGxvZzsJLyogbmVlZCB0byBsb2cgYmxvY2sgaGVhZGVyICovCisJaW50CQkJbmVlZHNjYW47CS8qIG5lZWQgdG8gc2NhbiBibG9jayBmcmVlc3BjICovCisJaW50CQkJbmV3b2Zmc2V0OwkvKiBvZmZzZXQgZnJvbSBjdXJyZW50IGVudHJ5ICovCisJaW50CQkJb2Zmc2V0OwkJLyogdGFyZ2V0IGJsb2NrIG9mZnNldCAqLworCXhmc19kaXIyX3NmX2VudHJ5X3QJKnNmZXA7CQkvKiBzZiBlbnRyeSBwb2ludGVyICovCisJeGZzX2RpcjJfc2ZfdAkJKnNmcDsJCS8qIHNob3J0Zm9ybSBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9kYXRhX29mZl90CSp0YWdwOwkJLyogZW5kIG9mIGRhdGEgZW50cnkgKi8KKwl4ZnNfdHJhbnNfdAkJKnRwOwkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCisJeGZzX2RpcjJfdHJhY2VfYXJncygic2ZfdG9fYmxvY2siLCBhcmdzKTsKKwlkcCA9IGFyZ3MtPmRwOworCXRwID0gYXJncy0+dHJhbnM7CisJbXAgPSBkcC0+aV9tb3VudDsKKwlBU1NFUlQoZHAtPmlfZGYuaWZfZmxhZ3MgJiBYRlNfSUZJTkxJTkUpOworCS8qCisJICogQm9tYiBvdXQgaWYgdGhlIHNob3J0Zm9ybSBkaXJlY3RvcnkgaXMgd2F5IHRvbyBzaG9ydC4KKwkgKi8KKwlpZiAoZHAtPmlfZC5kaV9zaXplIDwgb2Zmc2V0b2YoeGZzX2RpcjJfc2ZfaGRyX3QsIHBhcmVudCkpIHsKKwkJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04obXApKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCX0KKwlBU1NFUlQoZHAtPmlfZGYuaWZfYnl0ZXMgPT0gZHAtPmlfZC5kaV9zaXplKTsKKwlBU1NFUlQoZHAtPmlfZGYuaWZfdTEuaWZfZGF0YSAhPSBOVUxMKTsKKwlzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJQVNTRVJUKGRwLT5pX2QuZGlfc2l6ZSA+PSBYRlNfRElSMl9TRl9IRFJfU0laRShzZnAtPmhkci5pOGNvdW50KSk7CisJLyoKKwkgKiBDb3B5IHRoZSBkaXJlY3RvcnkgaW50byB0aGUgc3RhY2sgYnVmZmVyLgorCSAqIFRoZW4gcGl0Y2ggdGhlIGluY29yZSBpbm9kZSBkYXRhIHNvIHdlIGNhbiBtYWtlIGV4dGVudHMuCisJICovCisKKwlidWZfbGVuID0gZHAtPmlfZGYuaWZfYnl0ZXM7CisJYnVmID0ga21lbV9hbGxvYyhkcC0+aV9kZi5pZl9ieXRlcywgS01fU0xFRVApOworCisJbWVtY3B5KGJ1Ziwgc2ZwLCBkcC0+aV9kZi5pZl9ieXRlcyk7CisJeGZzX2lkYXRhX3JlYWxsb2MoZHAsIC1kcC0+aV9kZi5pZl9ieXRlcywgWEZTX0RBVEFfRk9SSyk7CisJZHAtPmlfZC5kaV9zaXplID0gMDsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBkcCwgWEZTX0lMT0dfQ09SRSk7CisJLyoKKwkgKiBSZXNldCBwb2ludGVyIC0gb2xkIHNmcCBpcyBnb25lLgorCSAqLworCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopYnVmOworCS8qCisJICogQWRkIGJsb2NrIDAgdG8gdGhlIGlub2RlLgorCSAqLworCWVycm9yID0geGZzX2RpcjJfZ3Jvd19pbm9kZShhcmdzLCBYRlNfRElSMl9EQVRBX1NQQUNFLCAmYmxrbm8pOworCWlmIChlcnJvcikgeworCQlrbWVtX2ZyZWUoYnVmLCBidWZfbGVuKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGRhdGEgYmxvY2suCisJICovCisJZXJyb3IgPSB4ZnNfZGlyMl9kYXRhX2luaXQoYXJncywgYmxrbm8sICZicCk7CisJaWYgKGVycm9yKSB7CisJCWttZW1fZnJlZShidWYsIGJ1Zl9sZW4pOworCQlyZXR1cm4gZXJyb3I7CisJfQorCWJsb2NrID0gYnAtPmRhdGE7CisJSU5UX1NFVChibG9jay0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19ESVIyX0JMT0NLX01BR0lDKTsKKwkvKgorCSAqIENvbXB1dGUgc2l6ZSBvZiBibG9jayAidGFpbCIgYXJlYS4KKwkgKi8KKwlpID0gKHVpbnQpc2l6ZW9mKCpidHApICsKKwkgICAgKElOVF9HRVQoc2ZwLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgKyAyKSAqICh1aW50KXNpemVvZih4ZnNfZGlyMl9sZWFmX2VudHJ5X3QpOworCS8qCisJICogVGhlIHdob2xlIHRoaW5nIGlzIGluaXRpYWxpemVkIHRvIGZyZWUgYnkgdGhlIGluaXQgcm91dGluZS4KKwkgKiBTYXkgd2UncmUgdXNpbmcgdGhlIGxlYWYgYW5kIHRhaWwgYXJlYS4KKwkgKi8KKwlkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKWJsb2NrLT51OworCW5lZWRsb2cgPSBuZWVkc2NhbiA9IDA7CisJeGZzX2RpcjJfZGF0YV91c2VfZnJlZSh0cCwgYnAsIGR1cCwgbXAtPm1fZGlyYmxrc2l6ZSAtIGksIGksICZuZWVkbG9nLAorCQkmbmVlZHNjYW4pOworCUFTU0VSVChuZWVkc2NhbiA9PSAwKTsKKwkvKgorCSAqIEZpbGwgaW4gdGhlIHRhaWwuCisJICovCisJYnRwID0gWEZTX0RJUjJfQkxPQ0tfVEFJTF9QKG1wLCBibG9jayk7CisJSU5UX1NFVChidHAtPmNvdW50LCBBUkNIX0NPTlZFUlQsIElOVF9HRVQoc2ZwLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgKyAyKTsJLyogLiwgLi4gKi8KKwlidHAtPnN0YWxlID0gMDsKKwlibHAgPSBYRlNfRElSMl9CTE9DS19MRUFGX1AoYnRwKTsKKwllbmRvZmZzZXQgPSAodWludCkoKGNoYXIgKilibHAgLSAoY2hhciAqKWJsb2NrKTsKKwkvKgorCSAqIFJlbW92ZSB0aGUgZnJlZXNwYWNlLCB3ZSdsbCBtYW5hZ2UgaXQuCisJICovCisJeGZzX2RpcjJfZGF0YV91c2VfZnJlZSh0cCwgYnAsIGR1cCwKKwkJKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoY2hhciAqKWR1cCAtIChjaGFyICopYmxvY2spLAorCQlJTlRfR0VUKGR1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpLCAmbmVlZGxvZywgJm5lZWRzY2FuKTsKKwkvKgorCSAqIENyZWF0ZSBlbnRyeSBmb3IgLgorCSAqLworCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKikKKwkgICAgICAoKGNoYXIgKilibG9jayArIFhGU19ESVIyX0RBVEFfRE9UX09GRlNFVCk7CisJSU5UX1NFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCwgZHAtPmlfaW5vKTsKKwlkZXAtPm5hbWVsZW4gPSAxOworCWRlcC0+bmFtZVswXSA9ICcuJzsKKwl0YWdwID0gWEZTX0RJUjJfREFUQV9FTlRSWV9UQUdfUChkZXApOworCUlOVF9TRVQoKnRhZ3AsIEFSQ0hfQ09OVkVSVCwgKHhmc19kaXIyX2RhdGFfb2ZmX3QpKChjaGFyICopZGVwIC0gKGNoYXIgKilibG9jaykpOworCXhmc19kaXIyX2RhdGFfbG9nX2VudHJ5KHRwLCBicCwgZGVwKTsKKwlJTlRfU0VUKGJscFswXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQsIHhmc19kaXJfaGFzaF9kb3QpOworCUlOVF9TRVQoYmxwWzBdLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUjJfQllURV9UT19EQVRBUFRSKG1wLCAoY2hhciAqKWRlcCAtIChjaGFyICopYmxvY2spKTsKKwkvKgorCSAqIENyZWF0ZSBlbnRyeSBmb3IgLi4KKwkgKi8KKwlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopCisJCSgoY2hhciAqKWJsb2NrICsgWEZTX0RJUjJfREFUQV9ET1RET1RfT0ZGU0VUKTsKKwlJTlRfU0VUKGRlcC0+aW51bWJlciwgQVJDSF9DT05WRVJULCBYRlNfRElSMl9TRl9HRVRfSU5VTUJFUihzZnAsICZzZnAtPmhkci5wYXJlbnQpKTsKKwlkZXAtPm5hbWVsZW4gPSAyOworCWRlcC0+bmFtZVswXSA9IGRlcC0+bmFtZVsxXSA9ICcuJzsKKwl0YWdwID0gWEZTX0RJUjJfREFUQV9FTlRSWV9UQUdfUChkZXApOworCUlOVF9TRVQoKnRhZ3AsIEFSQ0hfQ09OVkVSVCwgKHhmc19kaXIyX2RhdGFfb2ZmX3QpKChjaGFyICopZGVwIC0gKGNoYXIgKilibG9jaykpOworCXhmc19kaXIyX2RhdGFfbG9nX2VudHJ5KHRwLCBicCwgZGVwKTsKKwlJTlRfU0VUKGJscFsxXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQsIHhmc19kaXJfaGFzaF9kb3Rkb3QpOworCUlOVF9TRVQoYmxwWzFdLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUjJfQllURV9UT19EQVRBUFRSKG1wLCAoY2hhciAqKWRlcCAtIChjaGFyICopYmxvY2spKTsKKwlvZmZzZXQgPSBYRlNfRElSMl9EQVRBX0ZJUlNUX09GRlNFVDsKKwkvKgorCSAqIExvb3Agb3ZlciBleGlzdGluZyBlbnRyaWVzLCBzdHVmZiB0aGVtIGluLgorCSAqLworCWlmICgoaSA9IDApID09IElOVF9HRVQoc2ZwLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpCisJCXNmZXAgPSBOVUxMOworCWVsc2UKKwkJc2ZlcCA9IFhGU19ESVIyX1NGX0ZJUlNURU5UUlkoc2ZwKTsKKwkvKgorCSAqIE5lZWQgdG8gcHJlc2VydmUgdGhlIGV4aXN0aW5nIG9mZnNldCB2YWx1ZXMgaW4gdGhlIHNmIGRpcmVjdG9yeS4KKwkgKiBJbnNlcnQgaG9sZXMgKHVudXNlZCBlbnRyaWVzKSB3aGVyZSBuZWNlc3NhcnkuCisJICovCisJd2hpbGUgKG9mZnNldCA8IGVuZG9mZnNldCkgeworCQkvKgorCQkgKiBzZmVwIGlzIG51bGwgd2hlbiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBsaXN0LgorCQkgKi8KKwkJaWYgKHNmZXAgPT0gTlVMTCkKKwkJCW5ld29mZnNldCA9IGVuZG9mZnNldDsKKwkJZWxzZQorCQkJbmV3b2Zmc2V0ID0gWEZTX0RJUjJfU0ZfR0VUX09GRlNFVChzZmVwKTsKKwkJLyoKKwkJICogVGhlcmUgc2hvdWxkIGJlIGEgaG9sZSBoZXJlLCBtYWtlIG9uZS4KKwkJICovCisJCWlmIChvZmZzZXQgPCBuZXdvZmZzZXQpIHsKKwkJCWR1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopCisJCQkgICAgICAoKGNoYXIgKilibG9jayArIG9mZnNldCk7CisJCQlJTlRfU0VUKGR1cC0+ZnJlZXRhZywgQVJDSF9DT05WRVJULCBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKTsKKwkJCUlOVF9TRVQoZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCwgbmV3b2Zmc2V0IC0gb2Zmc2V0KTsKKwkJCUlOVF9TRVQoKlhGU19ESVIyX0RBVEFfVU5VU0VEX1RBR19QKGR1cCksIEFSQ0hfQ09OVkVSVCwKKwkJCQkoeGZzX2RpcjJfZGF0YV9vZmZfdCkKKwkJCQkoKGNoYXIgKilkdXAgLSAoY2hhciAqKWJsb2NrKSk7CisJCQl4ZnNfZGlyMl9kYXRhX2xvZ191bnVzZWQodHAsIGJwLCBkdXApOworCQkJKHZvaWQpeGZzX2RpcjJfZGF0YV9mcmVlaW5zZXJ0KCh4ZnNfZGlyMl9kYXRhX3QgKilibG9jaywKKwkJCQlkdXAsICZkdW1teSk7CisJCQlvZmZzZXQgKz0gSU5UX0dFVChkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIENvcHkgYSByZWFsIGVudHJ5LgorCQkgKi8KKwkJZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKSgoY2hhciAqKWJsb2NrICsgbmV3b2Zmc2V0KTsKKwkJSU5UX1NFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUjJfU0ZfR0VUX0lOVU1CRVIoc2ZwLAorCQkJCVhGU19ESVIyX1NGX0lOVU1CRVJQKHNmZXApKSk7CisJCWRlcC0+bmFtZWxlbiA9IHNmZXAtPm5hbWVsZW47CisJCW1lbWNweShkZXAtPm5hbWUsIHNmZXAtPm5hbWUsIGRlcC0+bmFtZWxlbik7CisJCXRhZ3AgPSBYRlNfRElSMl9EQVRBX0VOVFJZX1RBR19QKGRlcCk7CisJCUlOVF9TRVQoKnRhZ3AsIEFSQ0hfQ09OVkVSVCwgKHhmc19kaXIyX2RhdGFfb2ZmX3QpKChjaGFyICopZGVwIC0gKGNoYXIgKilibG9jaykpOworCQl4ZnNfZGlyMl9kYXRhX2xvZ19lbnRyeSh0cCwgYnAsIGRlcCk7CisJCUlOVF9TRVQoYmxwWzIgKyBpXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQsIHhmc19kYV9oYXNobmFtZSgoY2hhciAqKXNmZXAtPm5hbWUsIHNmZXAtPm5hbWVsZW4pKTsKKwkJSU5UX1NFVChibHBbMiArIGldLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUjJfQllURV9UT19EQVRBUFRSKG1wLAorCQkJCQkJIChjaGFyICopZGVwIC0gKGNoYXIgKilibG9jaykpOworCQlvZmZzZXQgPSAoaW50KSgoY2hhciAqKSh0YWdwICsgMSkgLSAoY2hhciAqKWJsb2NrKTsKKwkJaWYgKCsraSA9PSBJTlRfR0VUKHNmcC0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKQorCQkJc2ZlcCA9IE5VTEw7CisJCWVsc2UKKwkJCXNmZXAgPSBYRlNfRElSMl9TRl9ORVhURU5UUlkoc2ZwLCBzZmVwKTsKKwl9CisJLyogRG9uZSB3aXRoIHRoZSB0ZW1wb3JhcnkgYnVmZmVyICovCisJa21lbV9mcmVlKGJ1ZiwgYnVmX2xlbik7CisJLyoKKwkgKiBTb3J0IHRoZSBsZWFmIGVudHJpZXMgYnkgaGFzaCB2YWx1ZS4KKwkgKi8KKwlxc29ydChibHAsIElOVF9HRVQoYnRwLT5jb3VudCwgQVJDSF9DT05WRVJUKSwgc2l6ZW9mKCpibHApLCB4ZnNfZGlyMl9ibG9ja19zb3J0KTsKKwkvKgorCSAqIExvZyB0aGUgbGVhZiBlbnRyeSBhcmVhIGFuZCB0YWlsLgorCSAqIEFscmVhZHkgbG9nZ2VkIHRoZSBoZWFkZXIgaW4gZGF0YV9pbml0LCBpZ25vcmUgbmVlZGxvZy4KKwkgKi8KKwlBU1NFUlQobmVlZHNjYW4gPT0gMCk7CisJeGZzX2RpcjJfYmxvY2tfbG9nX2xlYWYodHAsIGJwLCAwLCBJTlRfR0VUKGJ0cC0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxKTsKKwl4ZnNfZGlyMl9ibG9ja19sb2dfdGFpbCh0cCwgYnApOworCXhmc19kaXIyX2RhdGFfY2hlY2soZHAsIGJwKTsKKwl4ZnNfZGFfYnVmX2RvbmUoYnApOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX2Jsb2NrLmggYi9mcy94ZnMveGZzX2RpcjJfYmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTU3OGI4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19kaXIyX2Jsb2NrLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0RJUjJfQkxPQ0tfSF9fCisjZGVmaW5lCV9fWEZTX0RJUjJfQkxPQ0tfSF9fCisKKy8qCisgKiB4ZnNfZGlyMl9ibG9jay5oCisgKiBEaXJlY3RvcnkgdmVyc2lvbiAyLCBzaW5nbGUgYmxvY2sgZm9ybWF0IHN0cnVjdHVyZXMKKyAqLworCitzdHJ1Y3QgdWlvOworc3RydWN0IHhmc19kYWJ1ZjsKK3N0cnVjdCB4ZnNfZGFfYXJnczsKK3N0cnVjdCB4ZnNfZGlyMl9kYXRhX2hkcjsKK3N0cnVjdCB4ZnNfZGlyMl9sZWFmX2VudHJ5Oworc3RydWN0IHhmc19pbm9kZTsKK3N0cnVjdCB4ZnNfbW91bnQ7CitzdHJ1Y3QgeGZzX3RyYW5zOworCisvKgorICogVGhlIHNpbmdsZSBibG9jayBmb3JtYXQgaXMgYXMgZm9sbG93czoKKyAqIHhmc19kaXIyX2RhdGFfaGRyX3Qgc3RydWN0dXJlCisgKiB4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgYW5kIHhmc19kaXIyX2RhdGFfdW51c2VkX3Qgc3RydWN0dXJlcworICogeGZzX2RpcjJfbGVhZl9lbnRyeV90IHN0cnVjdHVyZXMKKyAqIHhmc19kaXIyX2Jsb2NrX3RhaWxfdCBzdHJ1Y3R1cmUKKyAqLworCisjZGVmaW5lCVhGU19ESVIyX0JMT0NLX01BR0lDCTB4NTg0NDMyNDIJLyogWEQyQjogZm9yIG9uZSBibG9jayBkaXJzICovCisKK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX2Jsb2NrX3RhaWwgeworCV9fdWludDMyX3QJY291bnQ7CQkJLyogY291bnQgb2YgbGVhZiBlbnRyaWVzICovCisJX191aW50MzJfdAlzdGFsZTsJCQkvKiBjb3VudCBvZiBzdGFsZSBsZiBlbnRyaWVzICovCit9IHhmc19kaXIyX2Jsb2NrX3RhaWxfdDsKKworLyoKKyAqIEdlbmVyaWMgc2luZ2xlLWJsb2NrIHN0cnVjdHVyZSwgZm9yIHhmc19kYi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfYmxvY2sgeworCXhmc19kaXIyX2RhdGFfaGRyX3QJaGRyOwkJLyogbWFnaWMgWEZTX0RJUjJfQkxPQ0tfTUFHSUMgKi8KKwl4ZnNfZGlyMl9kYXRhX3VuaW9uX3QJdVsxXTsKKwl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJbGVhZlsxXTsKKwl4ZnNfZGlyMl9ibG9ja190YWlsX3QJdGFpbDsKK30geGZzX2RpcjJfYmxvY2tfdDsKKworLyoKKyAqIFBvaW50ZXIgdG8gdGhlIGxlYWYgaGVhZGVyIGVtYmVkZGVkIGluIGEgZGF0YSBibG9jayAoMS1ibG9jayBmb3JtYXQpCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfQkxPQ0tfVEFJTF9QKQoreGZzX2RpcjJfYmxvY2tfdGFpbF90ICoKK3hmc19kaXIyX2Jsb2NrX3RhaWxfcChzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfYmxvY2tfdCAqYmxvY2spOworI2RlZmluZQlYRlNfRElSMl9CTE9DS19UQUlMX1AobXAsYmxvY2spCXhmc19kaXIyX2Jsb2NrX3RhaWxfcChtcCxibG9jaykKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX0JMT0NLX1RBSUxfUChtcCxibG9jaykJXAorCSgoKHhmc19kaXIyX2Jsb2NrX3RhaWxfdCAqKSgoY2hhciAqKShibG9jaykgKyAobXApLT5tX2RpcmJsa3NpemUpKSAtIDEpCisjZW5kaWYKKworLyoKKyAqIFBvaW50ZXIgdG8gdGhlIGxlYWYgZW50cmllcyBlbWJlZGRlZCBpbiBhIGRhdGEgYmxvY2sgKDEtYmxvY2sgZm9ybWF0KQorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX0JMT0NLX0xFQUZfUCkKK3N0cnVjdCB4ZnNfZGlyMl9sZWFmX2VudHJ5ICp4ZnNfZGlyMl9ibG9ja19sZWFmX3AoeGZzX2RpcjJfYmxvY2tfdGFpbF90ICpidHApOworI2RlZmluZQlYRlNfRElSMl9CTE9DS19MRUFGX1AoYnRwKSBcCisJeGZzX2RpcjJfYmxvY2tfbGVhZl9wKGJ0cCkKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX0JMT0NLX0xFQUZfUChidHApCVwKKwkoKChzdHJ1Y3QgeGZzX2RpcjJfbGVhZl9lbnRyeSAqKShidHApKSAtIElOVF9HRVQoKGJ0cCktPmNvdW50LCBBUkNIX0NPTlZFUlQpKQorI2VuZGlmCisKKy8qCisgKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMuCisgKi8KKworZXh0ZXJuIGludAorCXhmc19kaXIyX2Jsb2NrX2FkZG5hbWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX2Jsb2NrX2dldGRlbnRzKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKKwkJCQlzdHJ1Y3QgdWlvICp1aW8sIGludCAqZW9mcCwgc3RydWN0IHhmc19kaXJlbnQgKmRicCwKKwkJCQl4ZnNfZGlyMl9wdXRfdCBwdXQpOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfYmxvY2tfbG9va3VwKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9ibG9ja19yZW1vdmVuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9ibG9ja19yZXBsYWNlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9sZWFmX3RvX2Jsb2NrKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgc3RydWN0IHhmc19kYWJ1ZiAqbGJwLAorCQkJICAgICAgIHN0cnVjdCB4ZnNfZGFidWYgKmRicCk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9zZl90b19ibG9jayhzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworCisjZW5kaWYJLyogX19YRlNfRElSMl9CTE9DS19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMl9kYXRhLmMgYi9mcy94ZnMveGZzX2RpcjJfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOTg4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2RpcjJfZGF0YS5jCkBAIC0wLDAgKzEsODU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisvKgorICogeGZzX2RpcjJfZGF0YS5jCisgKiBDb3JlIGRhdGEgYmxvY2sgaGFuZGxpbmcgcm91dGluZXMgZm9yIFhGUyBWMiBkaXJlY3Rvcmllcy4KKyAqIFNlZSB4ZnNfZGlyMl9kYXRhLmggZm9yIGRhdGEgc3RydWN0dXJlcy4KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX2xlYWYuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9kYXRhLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfbGVhZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX2Jsb2NrLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisKKyNpZmRlZiBERUJVRworLyoKKyAqIENoZWNrIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgZGF0YSBibG9jay4KKyAqIFRoZSBpbnB1dCBjYW4gYWxzbyBiZSBhIGJsb2NrLWZvcm1hdCBkaXJlY3RvcnkuCisgKiBQb3AgYW4gYXNzZXJ0IGlmIHdlIGZpbmQgYW55dGhpbmcgYmFkLgorICovCit2b2lkCit4ZnNfZGlyMl9kYXRhX2NoZWNrKAorCXhmc19pbm9kZV90CQkqZHAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19kYWJ1Zl90CQkqYnApCQkvKiBkYXRhIGJsb2NrJ3MgYnVmZmVyICovCit7CisJeGZzX2RpcjJfZGF0YXB0cl90CWFkZHI7CQkvKiBhZGRyIGZvciBsZWFmIGxvb2t1cCAqLworCXhmc19kaXIyX2RhdGFfZnJlZV90CSpiZjsJCS8qIGJlc3RmcmVlIHRhYmxlICovCisJeGZzX2RpcjJfYmxvY2tfdGFpbF90CSpidHA9TlVMTDsJLyogYmxvY2sgdGFpbCAqLworCWludAkJCWNvdW50OwkJLyogY291bnQgb2YgZW50cmllcyBmb3VuZCAqLworCXhmc19kaXIyX2RhdGFfdAkJKmQ7CQkvKiBkYXRhIGJsb2NrIHBvaW50ZXIgKi8KKwl4ZnNfZGlyMl9kYXRhX2VudHJ5X3QJKmRlcDsJCS8qIGRhdGEgZW50cnkgKi8KKwl4ZnNfZGlyMl9kYXRhX2ZyZWVfdAkqZGZwOwkJLyogYmVzdGZyZWUgZW50cnkgKi8KKwl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CSpkdXA7CQkvKiB1bnVzZWQgZW50cnkgKi8KKwljaGFyCQkJKmVuZHA7CQkvKiBlbmQgb2YgdXNlZnVsIGRhdGEgKi8KKwlpbnQJCQlmcmVlc2VlbjsJLyogbWFzayBvZiBiZXN0ZnJlZXMgc2VlbiAqLworCXhmc19kYWhhc2hfdAkJaGFzaDsJCS8qIGhhc2ggb2YgY3VycmVudCBuYW1lICovCisJaW50CQkJaTsJCS8qIGxlYWYgaW5kZXggKi8KKwlpbnQJCQlsYXN0ZnJlZTsJLyogbGFzdCBlbnRyeSB3YXMgdW51c2VkICovCisJeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpsZXA9TlVMTDsJLyogYmxvY2sgbGVhZiBlbnRyaWVzICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwljaGFyCQkJKnA7CQkvKiBjdXJyZW50IGRhdGEgcG9zaXRpb24gKi8KKwlpbnQJCQlzdGFsZTsJCS8qIGNvdW50IG9mIHN0YWxlIGxlYXZlcyAqLworCisJbXAgPSBkcC0+aV9tb3VudDsKKwlkID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQoZC0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0RBVEFfTUFHSUMgfHwKKwkgICAgICAgSU5UX0dFVChkLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfQkxPQ0tfTUFHSUMpOworCWJmID0gZC0+aGRyLmJlc3RmcmVlOworCXAgPSAoY2hhciAqKWQtPnU7CisJaWYgKElOVF9HRVQoZC0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0JMT0NLX01BR0lDKSB7CisJCWJ0cCA9IFhGU19ESVIyX0JMT0NLX1RBSUxfUChtcCwgKHhmc19kaXIyX2Jsb2NrX3QgKilkKTsKKwkJbGVwID0gWEZTX0RJUjJfQkxPQ0tfTEVBRl9QKGJ0cCk7CisJCWVuZHAgPSAoY2hhciAqKWxlcDsKKwl9IGVsc2UKKwkJZW5kcCA9IChjaGFyICopZCArIG1wLT5tX2RpcmJsa3NpemU7CisJY291bnQgPSBsYXN0ZnJlZSA9IGZyZWVzZWVuID0gMDsKKwkvKgorCSAqIEFjY291bnQgZm9yIHplcm8gYmVzdGZyZWUgZW50cmllcy4KKwkgKi8KKwlpZiAoIWJmWzBdLmxlbmd0aCkgeworCQlBU1NFUlQoIWJmWzBdLm9mZnNldCk7CisJCWZyZWVzZWVuIHw9IDEgPDwgMDsKKwl9CisJaWYgKCFiZlsxXS5sZW5ndGgpIHsKKwkJQVNTRVJUKCFiZlsxXS5vZmZzZXQpOworCQlmcmVlc2VlbiB8PSAxIDw8IDE7CisJfQorCWlmICghYmZbMl0ubGVuZ3RoKSB7CisJCUFTU0VSVCghYmZbMl0ub2Zmc2V0KTsKKwkJZnJlZXNlZW4gfD0gMSA8PCAyOworCX0KKwlBU1NFUlQoSU5UX0dFVChiZlswXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPj0gSU5UX0dFVChiZlsxXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVChJTlRfR0VUKGJmWzFdLmxlbmd0aCwgQVJDSF9DT05WRVJUKSA+PSBJTlRfR0VUKGJmWzJdLmxlbmd0aCwgQVJDSF9DT05WRVJUKSk7CisJLyoKKwkgKiBMb29wIG92ZXIgdGhlIGRhdGEvdW51c2VkIGVudHJpZXMuCisJICovCisJd2hpbGUgKHAgPCBlbmRwKSB7CisJCWR1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopcDsKKwkJLyoKKwkJICogSWYgaXQncyB1bnVzZWQsIGxvb2sgZm9yIHRoZSBzcGFjZSBpbiB0aGUgYmVzdGZyZWUgdGFibGUuCisJCSAqIElmIHdlIGZpbmQgaXQsIGFjY291bnQgZm9yIHRoYXQsIGVsc2UgbWFrZSBzdXJlIGl0CisJCSAqIGRvZXNuJ3QgbmVlZCB0byBiZSB0aGVyZS4KKwkJICovCisJCWlmIChJTlRfR0VUKGR1cC0+ZnJlZXRhZywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKSB7CisJCQlBU1NFUlQobGFzdGZyZWUgPT0gMCk7CisJCQlBU1NFUlQoSU5UX0dFVCgqWEZTX0RJUjJfREFUQV9VTlVTRURfVEFHX1AoZHVwKSwgQVJDSF9DT05WRVJUKSA9PQorCQkJICAgICAgIChjaGFyICopZHVwIC0gKGNoYXIgKilkKTsKKwkJCWRmcCA9IHhmc19kaXIyX2RhdGFfZnJlZWZpbmQoZCwgZHVwKTsKKwkJCWlmIChkZnApIHsKKwkJCQlpID0gKGludCkoZGZwIC0gYmYpOworCQkJCUFTU0VSVCgoZnJlZXNlZW4gJiAoMSA8PCBpKSkgPT0gMCk7CisJCQkJZnJlZXNlZW4gfD0gMSA8PCBpOworCQkJfSBlbHNlCisJCQkJQVNTRVJUKElOVF9HRVQoZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPD0gSU5UX0dFVChiZlsyXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpOworCQkJcCArPSBJTlRfR0VUKGR1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpOworCQkJbGFzdGZyZWUgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJLyoKKwkJICogSXQncyBhIHJlYWwgZW50cnkuICBWYWxpZGF0ZSB0aGUgZmllbGRzLgorCQkgKiBJZiB0aGlzIGlzIGEgYmxvY2sgZGlyZWN0b3J5IHRoZW4gbWFrZSBzdXJlIGl0J3MKKwkJICogaW4gdGhlIGxlYWYgc2VjdGlvbiBvZiB0aGUgYmxvY2suCisJCSAqIFRoZSBsaW5lYXIgc2VhcmNoIGlzIGNydWRlIGJ1dCB0aGlzIGlzIERFQlVHIGNvZGUuCisJCSAqLworCQlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopcDsKKwkJQVNTRVJUKGRlcC0+bmFtZWxlbiAhPSAwKTsKKwkJQVNTRVJUKHhmc19kaXJfaW5vX3ZhbGlkYXRlKG1wLCBJTlRfR0VUKGRlcC0+aW51bWJlciwgQVJDSF9DT05WRVJUKSkgPT0gMCk7CisJCUFTU0VSVChJTlRfR0VUKCpYRlNfRElSMl9EQVRBX0VOVFJZX1RBR19QKGRlcCksIEFSQ0hfQ09OVkVSVCkgPT0KKwkJICAgICAgIChjaGFyICopZGVwIC0gKGNoYXIgKilkKTsKKwkJY291bnQrKzsKKwkJbGFzdGZyZWUgPSAwOworCQlpZiAoSU5UX0dFVChkLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfQkxPQ0tfTUFHSUMpIHsKKwkJCWFkZHIgPSBYRlNfRElSMl9EQl9PRkZfVE9fREFUQVBUUihtcCwgbXAtPm1fZGlyZGF0YWJsaywKKwkJCQkoeGZzX2RpcjJfZGF0YV9hb2ZmX3QpCisJCQkJKChjaGFyICopZGVwIC0gKGNoYXIgKilkKSk7CisJCQloYXNoID0geGZzX2RhX2hhc2huYW1lKChjaGFyICopZGVwLT5uYW1lLCBkZXAtPm5hbWVsZW4pOworCQkJZm9yIChpID0gMDsgaSA8IElOVF9HRVQoYnRwLT5jb3VudCwgQVJDSF9DT05WRVJUKTsgaSsrKSB7CisJCQkJaWYgKElOVF9HRVQobGVwW2ldLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkgPT0gYWRkciAmJgorCQkJCSAgICBJTlRfR0VUKGxlcFtpXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpID09IGhhc2gpCisJCQkJCWJyZWFrOworCQkJfQorCQkJQVNTRVJUKGkgPCBJTlRfR0VUKGJ0cC0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpOworCQl9CisJCXAgKz0gWEZTX0RJUjJfREFUQV9FTlRTSVpFKGRlcC0+bmFtZWxlbik7CisJfQorCS8qCisJICogTmVlZCB0byBoYXZlIHNlZW4gYWxsIHRoZSBlbnRyaWVzIGFuZCBhbGwgdGhlIGJlc3RmcmVlIHNsb3RzLgorCSAqLworCUFTU0VSVChmcmVlc2VlbiA9PSA3KTsKKwlpZiAoSU5UX0dFVChkLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfQkxPQ0tfTUFHSUMpIHsKKwkJZm9yIChpID0gc3RhbGUgPSAwOyBpIDwgSU5UX0dFVChidHAtPmNvdW50LCBBUkNIX0NPTlZFUlQpOyBpKyspIHsKKwkJCWlmIChJTlRfR0VUKGxlcFtpXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX05VTExfREFUQVBUUikKKwkJCQlzdGFsZSsrOworCQkJaWYgKGkgPiAwKQorCQkJCUFTU0VSVChJTlRfR0VUKGxlcFtpXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpID49IElOVF9HRVQobGVwW2kgLSAxXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpKTsKKwkJfQorCQlBU1NFUlQoY291bnQgPT0gSU5UX0dFVChidHAtPmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gSU5UX0dFVChidHAtPnN0YWxlLCBBUkNIX0NPTlZFUlQpKTsKKwkJQVNTRVJUKHN0YWxlID09IElOVF9HRVQoYnRwLT5zdGFsZSwgQVJDSF9DT05WRVJUKSk7CisJfQorfQorI2VuZGlmCisKKy8qCisgKiBHaXZlbiBhIGRhdGEgYmxvY2sgYW5kIGFuIHVudXNlZCBlbnRyeSBmcm9tIHRoYXQgYmxvY2ssCisgKiByZXR1cm4gdGhlIGJlc3RmcmVlIGVudHJ5IGlmIGFueSB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0LgorICovCit4ZnNfZGlyMl9kYXRhX2ZyZWVfdCAqCit4ZnNfZGlyMl9kYXRhX2ZyZWVmaW5kKAorCXhmc19kaXIyX2RhdGFfdAkJKmQsCQkvKiBkYXRhIGJsb2NrICovCisJeGZzX2RpcjJfZGF0YV91bnVzZWRfdAkqZHVwKQkJLyogZGF0YSB1bnVzZWQgZW50cnkgKi8KK3sKKwl4ZnNfZGlyMl9kYXRhX2ZyZWVfdAkqZGZwOwkJLyogYmVzdGZyZWUgZW50cnkgKi8KKwl4ZnNfZGlyMl9kYXRhX2FvZmZfdAlvZmY7CQkvKiBvZmZzZXQgdmFsdWUgbmVlZGVkICovCisjaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorCWludAkJCW1hdGNoZWQ7CS8qIG1hdGNoZWQgdGhlIHZhbHVlICovCisJaW50CQkJc2Vlbnplcm87CS8qIHNhdyBhIDAgYmVzdGZyZWUgZW50cnkgKi8KKyNlbmRpZgorCisJb2ZmID0gKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoY2hhciAqKWR1cCAtIChjaGFyICopZCk7CisjaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorCS8qCisJICogVmFsaWRhdGUgc29tZSBjb25zaXN0ZW5jeSBpbiB0aGUgYmVzdGZyZWUgdGFibGUuCisJICogQ2hlY2sgb3JkZXIsIG5vbi1vdmVybGFwcGluZyBlbnRyaWVzLCBhbmQgaWYgd2UgZmluZCB0aGUKKwkgKiBvbmUgd2UncmUgbG9va2luZyBmb3IgaXQgaGFzIHRvIGJlIGV4YWN0LgorCSAqLworCUFTU0VSVChJTlRfR0VUKGQtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9EQVRBX01BR0lDIHx8CisJICAgICAgIElOVF9HRVQoZC0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0JMT0NLX01BR0lDKTsKKwlmb3IgKGRmcCA9ICZkLT5oZHIuYmVzdGZyZWVbMF0sIHNlZW56ZXJvID0gbWF0Y2hlZCA9IDA7CisJICAgICBkZnAgPCAmZC0+aGRyLmJlc3RmcmVlW1hGU19ESVIyX0RBVEFfRkRfQ09VTlRdOworCSAgICAgZGZwKyspIHsKKwkJaWYgKCFkZnAtPm9mZnNldCkgeworCQkJQVNTRVJUKCFkZnAtPmxlbmd0aCk7CisJCQlzZWVuemVybyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlBU1NFUlQoc2Vlbnplcm8gPT0gMCk7CisJCWlmIChJTlRfR0VUKGRmcC0+b2Zmc2V0LCBBUkNIX0NPTlZFUlQpID09IG9mZikgeworCQkJbWF0Y2hlZCA9IDE7CisJCQlBU1NFUlQoSU5UX0dFVChkZnAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKSA9PSBJTlRfR0VUKGR1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpKTsKKwkJfSBlbHNlIGlmIChvZmYgPCBJTlRfR0VUKGRmcC0+b2Zmc2V0LCBBUkNIX0NPTlZFUlQpKQorCQkJQVNTRVJUKG9mZiArIElOVF9HRVQoZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPD0gSU5UX0dFVChkZnAtPm9mZnNldCwgQVJDSF9DT05WRVJUKSk7CisJCWVsc2UKKwkJCUFTU0VSVChJTlRfR0VUKGRmcC0+b2Zmc2V0LCBBUkNIX0NPTlZFUlQpICsgSU5UX0dFVChkZnAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKSA8PSBvZmYpOworCQlBU1NFUlQobWF0Y2hlZCB8fCBJTlRfR0VUKGRmcC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpID49IElOVF9HRVQoZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpOworCQlpZiAoZGZwID4gJmQtPmhkci5iZXN0ZnJlZVswXSkKKwkJCUFTU0VSVChJTlRfR0VUKGRmcFstMV0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpID49IElOVF9HRVQoZGZwWzBdLmxlbmd0aCwgQVJDSF9DT05WRVJUKSk7CisJfQorI2VuZGlmCisJLyoKKwkgKiBJZiB0aGlzIGlzIHNtYWxsZXIgdGhhbiB0aGUgc21hbGxlc3QgYmVzdGZyZWUgZW50cnksCisJICogaXQgY2FuJ3QgYmUgdGhlcmUgc2luY2UgdGhleSdyZSBzb3J0ZWQuCisJICovCisJaWYgKElOVF9HRVQoZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPCBJTlRfR0VUKGQtPmhkci5iZXN0ZnJlZVtYRlNfRElSMl9EQVRBX0ZEX0NPVU5UIC0gMV0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpKQorCQlyZXR1cm4gTlVMTDsKKwkvKgorCSAqIExvb2sgYXQgdGhlIHRocmVlIGJlc3RmcmVlIGVudHJpZXMgZm9yIG91ciBndXkuCisJICovCisJZm9yIChkZnAgPSAmZC0+aGRyLmJlc3RmcmVlWzBdOworCSAgICAgZGZwIDwgJmQtPmhkci5iZXN0ZnJlZVtYRlNfRElSMl9EQVRBX0ZEX0NPVU5UXTsKKwkgICAgIGRmcCsrKSB7CisJCWlmICghZGZwLT5vZmZzZXQpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKElOVF9HRVQoZGZwLT5vZmZzZXQsIEFSQ0hfQ09OVkVSVCkgPT0gb2ZmKQorCQkJcmV0dXJuIGRmcDsKKwl9CisJLyoKKwkgKiBEaWRuJ3QgZmluZCBpdC4gIFRoaXMgb25seSBoYXBwZW5zIGlmIHRoZXJlIGFyZSBkdXBsaWNhdGUgbGVuZ3Rocy4KKwkgKi8KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEluc2VydCBhbiB1bnVzZWQtc3BhY2UgZW50cnkgaW50byB0aGUgYmVzdGZyZWUgdGFibGUuCisgKi8KK3hmc19kaXIyX2RhdGFfZnJlZV90ICoJCQkJLyogZW50cnkgaW5zZXJ0ZWQgKi8KK3hmc19kaXIyX2RhdGFfZnJlZWluc2VydCgKKwl4ZnNfZGlyMl9kYXRhX3QJCSpkLAkJLyogZGF0YSBibG9jayBwb2ludGVyICovCisJeGZzX2RpcjJfZGF0YV91bnVzZWRfdAkqZHVwLAkJLyogdW51c2VkIHNwYWNlICovCisJaW50CQkJKmxvZ2hlYWQpCS8qIGxvZyB0aGUgZGF0YSBoZWFkZXIgKG91dCkgKi8KK3sKKwl4ZnNfZGlyMl9kYXRhX2ZyZWVfdAkqZGZwOwkJLyogYmVzdGZyZWUgdGFibGUgcG9pbnRlciAqLworCXhmc19kaXIyX2RhdGFfZnJlZV90CW5ldzsJCS8qIG5ldyBiZXN0ZnJlZSBlbnRyeSAqLworCisjaWZkZWYgX19LRVJORUxfXworCUFTU0VSVChJTlRfR0VUKGQtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9EQVRBX01BR0lDIHx8CisJICAgICAgIElOVF9HRVQoZC0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0JMT0NLX01BR0lDKTsKKyNlbmRpZgorCWRmcCA9IGQtPmhkci5iZXN0ZnJlZTsKKwlJTlRfQ09QWShuZXcubGVuZ3RoLCBkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKTsKKwlJTlRfU0VUKG5ldy5vZmZzZXQsIEFSQ0hfQ09OVkVSVCwgKHhmc19kaXIyX2RhdGFfb2ZmX3QpKChjaGFyICopZHVwIC0gKGNoYXIgKilkKSk7CisJLyoKKwkgKiBJbnNlcnQgYXQgcG9zaXRpb24gMCwgMSwgb3IgMjsgb3Igbm90IGF0IGFsbC4KKwkgKi8KKwlpZiAoSU5UX0dFVChuZXcubGVuZ3RoLCBBUkNIX0NPTlZFUlQpID4gSU5UX0dFVChkZnBbMF0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpKSB7CisJCWRmcFsyXSA9IGRmcFsxXTsKKwkJZGZwWzFdID0gZGZwWzBdOworCQlkZnBbMF0gPSBuZXc7CisJCSpsb2doZWFkID0gMTsKKwkJcmV0dXJuICZkZnBbMF07CisJfQorCWlmIChJTlRfR0VUKG5ldy5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPiBJTlRfR0VUKGRmcFsxXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJZGZwWzJdID0gZGZwWzFdOworCQlkZnBbMV0gPSBuZXc7CisJCSpsb2doZWFkID0gMTsKKwkJcmV0dXJuICZkZnBbMV07CisJfQorCWlmIChJTlRfR0VUKG5ldy5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPiBJTlRfR0VUKGRmcFsyXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJZGZwWzJdID0gbmV3OworCQkqbG9naGVhZCA9IDE7CisJCXJldHVybiAmZGZwWzJdOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFJlbW92ZSBhIGJlc3RmcmVlIGVudHJ5IGZyb20gdGhlIHRhYmxlLgorICovCit2b2lkCit4ZnNfZGlyMl9kYXRhX2ZyZWVyZW1vdmUoCisJeGZzX2RpcjJfZGF0YV90CQkqZCwJCS8qIGRhdGEgYmxvY2sgcG9pbnRlciAqLworCXhmc19kaXIyX2RhdGFfZnJlZV90CSpkZnAsCQkvKiBiZXN0ZnJlZSBlbnRyeSBwb2ludGVyICovCisJaW50CQkJKmxvZ2hlYWQpCS8qIG91dDogbG9nIGRhdGEgaGVhZGVyICovCit7CisjaWZkZWYgX19LRVJORUxfXworCUFTU0VSVChJTlRfR0VUKGQtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9EQVRBX01BR0lDIHx8CisJICAgICAgIElOVF9HRVQoZC0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0JMT0NLX01BR0lDKTsKKyNlbmRpZgorCS8qCisJICogSXQncyB0aGUgZmlyc3QgZW50cnksIHNsaWRlIHRoZSBuZXh0IDIgdXAuCisJICovCisJaWYgKGRmcCA9PSAmZC0+aGRyLmJlc3RmcmVlWzBdKSB7CisJCWQtPmhkci5iZXN0ZnJlZVswXSA9IGQtPmhkci5iZXN0ZnJlZVsxXTsKKwkJZC0+aGRyLmJlc3RmcmVlWzFdID0gZC0+aGRyLmJlc3RmcmVlWzJdOworCX0KKwkvKgorCSAqIEl0J3MgdGhlIHNlY29uZCBlbnRyeSwgc2xpZGUgdGhlIDNyZCBlbnRyeSB1cC4KKwkgKi8KKwllbHNlIGlmIChkZnAgPT0gJmQtPmhkci5iZXN0ZnJlZVsxXSkKKwkJZC0+aGRyLmJlc3RmcmVlWzFdID0gZC0+aGRyLmJlc3RmcmVlWzJdOworCS8qCisJICogTXVzdCBiZSB0aGUgbGFzdCBlbnRyeS4KKwkgKi8KKwllbHNlCisJCUFTU0VSVChkZnAgPT0gJmQtPmhkci5iZXN0ZnJlZVsyXSk7CisJLyoKKwkgKiBDbGVhciB0aGUgM3JkIGVudHJ5LCBtdXN0IGJlIHplcm8gbm93LgorCSAqLworCWQtPmhkci5iZXN0ZnJlZVsyXS5sZW5ndGggPSAwOworCWQtPmhkci5iZXN0ZnJlZVsyXS5vZmZzZXQgPSAwOworCSpsb2doZWFkID0gMTsKK30KKworLyoKKyAqIEdpdmVuIGEgZGF0YSBibG9jaywgcmVjb25zdHJ1Y3QgaXRzIGJlc3RmcmVlIG1hcC4KKyAqLwordm9pZAoreGZzX2RpcjJfZGF0YV9mcmVlc2NhbigKKwl4ZnNfbW91bnRfdAkJKm1wLAkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc19kaXIyX2RhdGFfdAkJKmQsCQkvKiBkYXRhIGJsb2NrIHBvaW50ZXIgKi8KKwlpbnQJCQkqbG9naGVhZCwJLyogb3V0OiBsb2cgZGF0YSBoZWFkZXIgKi8KKwljaGFyCQkJKmFlbmRwKQkJLyogaW46IGNhbGxlcidzIGVuZHAgKi8KK3sKKwl4ZnNfZGlyMl9ibG9ja190YWlsX3QJKmJ0cDsJCS8qIGJsb2NrIHRhaWwgKi8KKwl4ZnNfZGlyMl9kYXRhX2VudHJ5X3QJKmRlcDsJCS8qIGFjdGl2ZSBkYXRhIGVudHJ5ICovCisJeGZzX2RpcjJfZGF0YV91bnVzZWRfdAkqZHVwOwkJLyogdW51c2VkIGRhdGEgZW50cnkgKi8KKwljaGFyCQkJKmVuZHA7CQkvKiBlbmQgb2YgYmxvY2sncyBkYXRhICovCisJY2hhcgkJCSpwOwkJLyogY3VycmVudCBlbnRyeSBwb2ludGVyICovCisKKyNpZmRlZiBfX0tFUk5FTF9fCisJQVNTRVJUKElOVF9HRVQoZC0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0RBVEFfTUFHSUMgfHwKKwkgICAgICAgSU5UX0dFVChkLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfQkxPQ0tfTUFHSUMpOworI2VuZGlmCisJLyoKKwkgKiBTdGFydCBieSBjbGVhcmluZyB0aGUgdGFibGUuCisJICovCisJbWVtc2V0KGQtPmhkci5iZXN0ZnJlZSwgMCwgc2l6ZW9mKGQtPmhkci5iZXN0ZnJlZSkpOworCSpsb2doZWFkID0gMTsKKwkvKgorCSAqIFNldCB1cCBwb2ludGVycy4KKwkgKi8KKwlwID0gKGNoYXIgKilkLT51OworCWlmIChhZW5kcCkKKwkJZW5kcCA9IGFlbmRwOworCWVsc2UgaWYgKElOVF9HRVQoZC0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0JMT0NLX01BR0lDKSB7CisJCWJ0cCA9IFhGU19ESVIyX0JMT0NLX1RBSUxfUChtcCwgKHhmc19kaXIyX2Jsb2NrX3QgKilkKTsKKwkJZW5kcCA9IChjaGFyICopWEZTX0RJUjJfQkxPQ0tfTEVBRl9QKGJ0cCk7CisJfSBlbHNlCisJCWVuZHAgPSAoY2hhciAqKWQgKyBtcC0+bV9kaXJibGtzaXplOworCS8qCisJICogTG9vcCBvdmVyIHRoZSBibG9jaydzIGVudHJpZXMuCisJICovCisJd2hpbGUgKHAgPCBlbmRwKSB7CisJCWR1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopcDsKKwkJLyoKKwkJICogSWYgaXQncyBhIGZyZWUgZW50cnksIGluc2VydCBpdC4KKwkJICovCisJCWlmIChJTlRfR0VUKGR1cC0+ZnJlZXRhZywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKSB7CisJCQlBU1NFUlQoKGNoYXIgKilkdXAgLSAoY2hhciAqKWQgPT0KKwkJCSAgICAgICBJTlRfR0VUKCpYRlNfRElSMl9EQVRBX1VOVVNFRF9UQUdfUChkdXApLCBBUkNIX0NPTlZFUlQpKTsKKwkJCXhmc19kaXIyX2RhdGFfZnJlZWluc2VydChkLCBkdXAsIGxvZ2hlYWQpOworCQkJcCArPSBJTlRfR0VUKGR1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpOworCQl9CisJCS8qCisJCSAqIEZvciBhY3RpdmUgZW50cmllcywgY2hlY2sgdGhlaXIgdGFncyBhbmQgc2tpcCB0aGVtLgorCQkgKi8KKwkJZWxzZSB7CisJCQlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopcDsKKwkJCUFTU0VSVCgoY2hhciAqKWRlcCAtIChjaGFyICopZCA9PQorCQkJICAgICAgIElOVF9HRVQoKlhGU19ESVIyX0RBVEFfRU5UUllfVEFHX1AoZGVwKSwgQVJDSF9DT05WRVJUKSk7CisJCQlwICs9IFhGU19ESVIyX0RBVEFfRU5UU0laRShkZXAtPm5hbWVsZW4pOworCQl9CisJfQorfQorCisvKgorICogSW5pdGlhbGl6ZSBhIGRhdGEgYmxvY2sgYXQgdGhlIGdpdmVuIGJsb2NrIG51bWJlciBpbiB0aGUgZGlyZWN0b3J5LgorICogR2l2ZSBiYWNrIHRoZSBidWZmZXIgZm9yIHRoZSBjcmVhdGVkIGJsb2NrLgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfZGF0YV9pbml0KAorCXhmc19kYV9hcmdzX3QJCSphcmdzLAkJLyogZGlyZWN0b3J5IG9wZXJhdGlvbiBhcmdzICovCisJeGZzX2RpcjJfZGJfdAkJYmxrbm8sCQkvKiBsb2dpY2FsIGRpciBibG9jayBudW1iZXIgKi8KKwl4ZnNfZGFidWZfdAkJKipicHApCQkvKiBvdXRwdXQgYmxvY2sgYnVmZmVyICovCit7CisJeGZzX2RhYnVmX3QJCSpicDsJCS8qIGJsb2NrIGJ1ZmZlciAqLworCXhmc19kaXIyX2RhdGFfdAkJKmQ7CQkvKiBwb2ludGVyIHRvIGJsb2NrICovCisJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CSpkdXA7CQkvKiB1bnVzZWQgZW50cnkgcG9pbnRlciAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQkJaTsJCS8qIGJlc3RmcmVlIGluZGV4ICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkJKnRwOwkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCWludCAgICAgICAgICAgICAgICAgICAgIHQ7ICAgICAgICAgICAgICAvKiB0ZW1wICovCisKKwlkcCA9IGFyZ3MtPmRwOworCW1wID0gZHAtPmlfbW91bnQ7CisJdHAgPSBhcmdzLT50cmFuczsKKwkvKgorCSAqIEdldCB0aGUgYnVmZmVyIHNldCB1cCBmb3IgdGhlIGJsb2NrLgorCSAqLworCWVycm9yID0geGZzX2RhX2dldF9idWYodHAsIGRwLCBYRlNfRElSMl9EQl9UT19EQShtcCwgYmxrbm8pLCAtMSwgJmJwLAorCQlYRlNfREFUQV9GT1JLKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlBU1NFUlQoYnAgIT0gTlVMTCk7CisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBoZWFkZXIuCisJICovCisJZCA9IGJwLT5kYXRhOworCUlOVF9TRVQoZC0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19ESVIyX0RBVEFfTUFHSUMpOworCUlOVF9TRVQoZC0+aGRyLmJlc3RmcmVlWzBdLm9mZnNldCwgQVJDSF9DT05WRVJULCAoeGZzX2RpcjJfZGF0YV9vZmZfdClzaXplb2YoZC0+aGRyKSk7CisJZm9yIChpID0gMTsgaSA8IFhGU19ESVIyX0RBVEFfRkRfQ09VTlQ7IGkrKykgeworCQlkLT5oZHIuYmVzdGZyZWVbaV0ubGVuZ3RoID0gMDsKKwkJZC0+aGRyLmJlc3RmcmVlW2ldLm9mZnNldCA9IDA7CisJfQorCS8qCisJICogU2V0IHVwIGFuIHVudXNlZCBlbnRyeSBmb3IgdGhlIGJsb2NrJ3MgYm9keS4KKwkgKi8KKwlkdXAgPSAmZC0+dVswXS51bnVzZWQ7CisJSU5UX1NFVChkdXAtPmZyZWV0YWcsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUjJfREFUQV9GUkVFX1RBRyk7CisKKwl0PW1wLT5tX2RpcmJsa3NpemUgLSAodWludClzaXplb2YoZC0+aGRyKTsKKwlJTlRfU0VUKGQtPmhkci5iZXN0ZnJlZVswXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCwgdCk7CisJSU5UX1NFVChkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJULCB0KTsKKwlJTlRfU0VUKCpYRlNfRElSMl9EQVRBX1VOVVNFRF9UQUdfUChkdXApLCBBUkNIX0NPTlZFUlQsCisJCSh4ZnNfZGlyMl9kYXRhX29mZl90KSgoY2hhciAqKWR1cCAtIChjaGFyICopZCkpOworCS8qCisJICogTG9nIGl0IGFuZCByZXR1cm4gaXQuCisJICovCisJeGZzX2RpcjJfZGF0YV9sb2dfaGVhZGVyKHRwLCBicCk7CisJeGZzX2RpcjJfZGF0YV9sb2dfdW51c2VkKHRwLCBicCwgZHVwKTsKKwkqYnBwID0gYnA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMb2cgYW4gYWN0aXZlIGRhdGEgZW50cnkgZnJvbSB0aGUgYmxvY2suCisgKi8KK3ZvaWQKK3hmc19kaXIyX2RhdGFfbG9nX2VudHJ5KAorCXhmc190cmFuc190CQkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2RhYnVmX3QJCSpicCwJCS8qIGJsb2NrIGJ1ZmZlciAqLworCXhmc19kaXIyX2RhdGFfZW50cnlfdAkqZGVwKQkJLyogZGF0YSBlbnRyeSBwb2ludGVyICovCit7CisJeGZzX2RpcjJfZGF0YV90CQkqZDsJCS8qIGRhdGEgYmxvY2sgcG9pbnRlciAqLworCisJZCA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGQtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9EQVRBX01BR0lDIHx8CisJICAgICAgIElOVF9HRVQoZC0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0JMT0NLX01BR0lDKTsKKwl4ZnNfZGFfbG9nX2J1Zih0cCwgYnAsICh1aW50KSgoY2hhciAqKWRlcCAtIChjaGFyICopZCksCisJCSh1aW50KSgoY2hhciAqKShYRlNfRElSMl9EQVRBX0VOVFJZX1RBR19QKGRlcCkgKyAxKSAtCisJCSAgICAgICAoY2hhciAqKWQgLSAxKSk7Cit9CisKKy8qCisgKiBMb2cgYSBkYXRhIGJsb2NrIGhlYWRlci4KKyAqLwordm9pZAoreGZzX2RpcjJfZGF0YV9sb2dfaGVhZGVyKAorCXhmc190cmFuc190CQkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2RhYnVmX3QJCSpicCkJCS8qIGJsb2NrIGJ1ZmZlciAqLworeworCXhmc19kaXIyX2RhdGFfdAkJKmQ7CQkvKiBkYXRhIGJsb2NrIHBvaW50ZXIgKi8KKworCWQgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChkLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfREFUQV9NQUdJQyB8fAorCSAgICAgICBJTlRfR0VUKGQtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9CTE9DS19NQUdJQyk7CisJeGZzX2RhX2xvZ19idWYodHAsIGJwLCAodWludCkoKGNoYXIgKikmZC0+aGRyIC0gKGNoYXIgKilkKSwKKwkJKHVpbnQpKHNpemVvZihkLT5oZHIpIC0gMSkpOworfQorCisvKgorICogTG9nIGEgZGF0YSB1bnVzZWQgZW50cnkuCisgKi8KK3ZvaWQKK3hmc19kaXIyX2RhdGFfbG9nX3VudXNlZCgKKwl4ZnNfdHJhbnNfdAkJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19kYWJ1Zl90CQkqYnAsCQkvKiBibG9jayBidWZmZXIgKi8KKwl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CSpkdXApCQkvKiBkYXRhIHVudXNlZCBwb2ludGVyICovCit7CisJeGZzX2RpcjJfZGF0YV90CQkqZDsJCS8qIGRhdGEgYmxvY2sgcG9pbnRlciAqLworCisJZCA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGQtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9EQVRBX01BR0lDIHx8CisJICAgICAgIElOVF9HRVQoZC0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0JMT0NLX01BR0lDKTsKKwkvKgorCSAqIExvZyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgdW51c2VkIGVudHJ5LgorCSAqLworCXhmc19kYV9sb2dfYnVmKHRwLCBicCwgKHVpbnQpKChjaGFyICopZHVwIC0gKGNoYXIgKilkKSwKKwkJKHVpbnQpKChjaGFyICopJmR1cC0+bGVuZ3RoICsgc2l6ZW9mKGR1cC0+bGVuZ3RoKSAtCisJCSAgICAgICAxIC0gKGNoYXIgKilkKSk7CisJLyoKKwkgKiBMb2cgdGhlIGVuZCAodGFnKSBvZiB0aGUgdW51c2VkIGVudHJ5LgorCSAqLworCXhmc19kYV9sb2dfYnVmKHRwLCBicCwKKwkJKHVpbnQpKChjaGFyICopWEZTX0RJUjJfREFUQV9VTlVTRURfVEFHX1AoZHVwKSAtIChjaGFyICopZCksCisJCSh1aW50KSgoY2hhciAqKVhGU19ESVIyX0RBVEFfVU5VU0VEX1RBR19QKGR1cCkgLSAoY2hhciAqKWQgKworCQkgICAgICAgc2l6ZW9mKHhmc19kaXIyX2RhdGFfb2ZmX3QpIC0gMSkpOworfQorCisvKgorICogTWFrZSBhIGJ5dGUgcmFuZ2UgaW4gdGhlIGRhdGEgYmxvY2sgdW51c2VkLgorICogSXRzIGN1cnJlbnQgY29udGVudHMgYXJlIHVuaW1wb3J0YW50LgorICovCit2b2lkCit4ZnNfZGlyMl9kYXRhX21ha2VfZnJlZSgKKwl4ZnNfdHJhbnNfdAkJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19kYWJ1Zl90CQkqYnAsCQkvKiBibG9jayBidWZmZXIgKi8KKwl4ZnNfZGlyMl9kYXRhX2FvZmZfdAlvZmZzZXQsCQkvKiBzdGFydGluZyBieXRlIG9mZnNldCAqLworCXhmc19kaXIyX2RhdGFfYW9mZl90CWxlbiwJCS8qIGxlbmd0aCBpbiBieXRlcyAqLworCWludAkJCSpuZWVkbG9ncCwJLyogb3V0OiBsb2cgaGVhZGVyICovCisJaW50CQkJKm5lZWRzY2FucCkJLyogb3V0OiByZWdlbiBiZXN0ZnJlZSAqLworeworCXhmc19kaXIyX2RhdGFfdAkJKmQ7CQkvKiBkYXRhIGJsb2NrIHBvaW50ZXIgKi8KKwl4ZnNfZGlyMl9kYXRhX2ZyZWVfdAkqZGZwOwkJLyogYmVzdGZyZWUgcG9pbnRlciAqLworCWNoYXIJCQkqZW5kcHRyOwkvKiBlbmQgb2YgZGF0YSBhcmVhICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwlpbnQJCQluZWVkc2NhbjsJLyogbmVlZCB0byByZWdlbiBiZXN0ZnJlZSAqLworCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJKm5ld2R1cDsJLyogbmV3IHVudXNlZCBlbnRyeSAqLworCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJKnBvc3RkdXA7CS8qIHVudXNlZCBlbnRyeSBhZnRlciB1cyAqLworCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJKnByZXZkdXA7CS8qIHVudXNlZCBlbnRyeSBiZWZvcmUgdXMgKi8KKworCW1wID0gdHAtPnRfbW91bnRwOworCWQgPSBicC0+ZGF0YTsKKwkvKgorCSAqIEZpZ3VyZSBvdXQgd2hlcmUgdGhlIGVuZCBvZiB0aGUgZGF0YSBhcmVhIGlzLgorCSAqLworCWlmIChJTlRfR0VUKGQtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9EQVRBX01BR0lDKQorCQllbmRwdHIgPSAoY2hhciAqKWQgKyBtcC0+bV9kaXJibGtzaXplOworCWVsc2UgeworCQl4ZnNfZGlyMl9ibG9ja190YWlsX3QJKmJ0cDsJLyogYmxvY2sgdGFpbCAqLworCisJCUFTU0VSVChJTlRfR0VUKGQtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9CTE9DS19NQUdJQyk7CisJCWJ0cCA9IFhGU19ESVIyX0JMT0NLX1RBSUxfUChtcCwgKHhmc19kaXIyX2Jsb2NrX3QgKilkKTsKKwkJZW5kcHRyID0gKGNoYXIgKilYRlNfRElSMl9CTE9DS19MRUFGX1AoYnRwKTsKKwl9CisJLyoKKwkgKiBJZiB0aGlzIGlzbid0IHRoZSBzdGFydCBvZiB0aGUgYmxvY2ssIHRoZW4gYmFjayB1cCB0bworCSAqIHRoZSBwcmV2aW91cyBlbnRyeSBhbmQgc2VlIGlmIGl0J3MgZnJlZS4KKwkgKi8KKwlpZiAob2Zmc2V0ID4gc2l6ZW9mKGQtPmhkcikpIHsKKwkJeGZzX2RpcjJfZGF0YV9vZmZfdAkqdGFncDsJLyogdGFnIGp1c3QgYmVmb3JlIHVzICovCisKKwkJdGFncCA9ICh4ZnNfZGlyMl9kYXRhX29mZl90ICopKChjaGFyICopZCArIG9mZnNldCkgLSAxOworCQlwcmV2ZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikoKGNoYXIgKilkICsgSU5UX0dFVCgqdGFncCwgQVJDSF9DT05WRVJUKSk7CisJCWlmIChJTlRfR0VUKHByZXZkdXAtPmZyZWV0YWcsIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RJUjJfREFUQV9GUkVFX1RBRykKKwkJCXByZXZkdXAgPSBOVUxMOworCX0gZWxzZQorCQlwcmV2ZHVwID0gTlVMTDsKKwkvKgorCSAqIElmIHRoaXMgaXNuJ3QgdGhlIGVuZCBvZiB0aGUgYmxvY2ssIHNlZSBpZiB0aGUgZW50cnkgYWZ0ZXIKKwkgKiB1cyBpcyBmcmVlLgorCSAqLworCWlmICgoY2hhciAqKWQgKyBvZmZzZXQgKyBsZW4gPCBlbmRwdHIpIHsKKwkJcG9zdGR1cCA9CisJCQkoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKSgoY2hhciAqKWQgKyBvZmZzZXQgKyBsZW4pOworCQlpZiAoSU5UX0dFVChwb3N0ZHVwLT5mcmVldGFnLCBBUkNIX0NPTlZFUlQpICE9IFhGU19ESVIyX0RBVEFfRlJFRV9UQUcpCisJCQlwb3N0ZHVwID0gTlVMTDsKKwl9IGVsc2UKKwkJcG9zdGR1cCA9IE5VTEw7CisJQVNTRVJUKCpuZWVkc2NhbnAgPT0gMCk7CisJbmVlZHNjYW4gPSAwOworCS8qCisJICogUHJldmlvdXMgYW5kIGZvbGxvd2luZyBlbnRyaWVzIGFyZSBib3RoIGZyZWUsCisJICogbWVyZ2UgZXZlcnl0aGluZyBpbnRvIGEgc2luZ2xlIGZyZWUgZW50cnkuCisJICovCisJaWYgKHByZXZkdXAgJiYgcG9zdGR1cCkgeworCQl4ZnNfZGlyMl9kYXRhX2ZyZWVfdAkqZGZwMjsJLyogYW5vdGhlciBiZXN0ZnJlZSBwb2ludGVyICovCisKKwkJLyoKKwkJICogU2VlIGlmIHByZXZkdXAgYW5kL29yIHBvc3RkdXAgYXJlIGluIGJlc3RmcmVlIHRhYmxlLgorCQkgKi8KKwkJZGZwID0geGZzX2RpcjJfZGF0YV9mcmVlZmluZChkLCBwcmV2ZHVwKTsKKwkJZGZwMiA9IHhmc19kaXIyX2RhdGFfZnJlZWZpbmQoZCwgcG9zdGR1cCk7CisJCS8qCisJCSAqIFdlIG5lZWQgYSByZXNjYW4gdW5sZXNzIHRoZXJlIGFyZSBleGFjdGx5IDIgZnJlZSBlbnRyaWVzCisJCSAqIG5hbWVseSBvdXIgdHdvLiAgVGhlbiB3ZSBrbm93IHdoYXQncyBoYXBwZW5pbmcsIG90aGVyd2lzZQorCQkgKiBzaW5jZSB0aGUgdGhpcmQgYmVzdGZyZWUgaXMgdGhlcmUsIHRoZXJlIG1pZ2h0IGJlIG1vcmUKKwkJICogZW50cmllcy4KKwkJICovCisJCW5lZWRzY2FuID0gZC0+aGRyLmJlc3RmcmVlWzJdLmxlbmd0aDsKKwkJLyoKKwkJICogRml4IHVwIHRoZSBuZXcgYmlnIGZyZWVzcGFjZS4KKwkJICovCisJCUlOVF9NT0QocHJldmR1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQsIGxlbiArIElOVF9HRVQocG9zdGR1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpKTsKKwkJSU5UX1NFVCgqWEZTX0RJUjJfREFUQV9VTlVTRURfVEFHX1AocHJldmR1cCksIEFSQ0hfQ09OVkVSVCwKKwkJCSh4ZnNfZGlyMl9kYXRhX29mZl90KSgoY2hhciAqKXByZXZkdXAgLSAoY2hhciAqKWQpKTsKKwkJeGZzX2RpcjJfZGF0YV9sb2dfdW51c2VkKHRwLCBicCwgcHJldmR1cCk7CisJCWlmICghbmVlZHNjYW4pIHsKKwkJCS8qCisJCQkgKiBIYXMgdG8gYmUgdGhlIGNhc2UgdGhhdCBlbnRyaWVzIDAgYW5kIDEgYXJlCisJCQkgKiBkZnAgYW5kIGRmcDIgKGRvbid0IGtub3cgd2hpY2ggaXMgd2hpY2gpLCBhbmQKKwkJCSAqIGVudHJ5IDIgaXMgZW1wdHkuCisJCQkgKiBSZW1vdmUgZW50cnkgMSBmaXJzdCB0aGVuIGVudHJ5IDAuCisJCQkgKi8KKwkJCUFTU0VSVChkZnAgJiYgZGZwMik7CisJCQlpZiAoZGZwID09ICZkLT5oZHIuYmVzdGZyZWVbMV0pIHsKKwkJCQlkZnAgPSAmZC0+aGRyLmJlc3RmcmVlWzBdOworCQkJCUFTU0VSVChkZnAyID09IGRmcCk7CisJCQkJZGZwMiA9ICZkLT5oZHIuYmVzdGZyZWVbMV07CisJCQl9CisJCQl4ZnNfZGlyMl9kYXRhX2ZyZWVyZW1vdmUoZCwgZGZwMiwgbmVlZGxvZ3ApOworCQkJeGZzX2RpcjJfZGF0YV9mcmVlcmVtb3ZlKGQsIGRmcCwgbmVlZGxvZ3ApOworCQkJLyoKKwkJCSAqIE5vdyBpbnNlcnQgdGhlIG5ldyBlbnRyeS4KKwkJCSAqLworCQkJZGZwID0geGZzX2RpcjJfZGF0YV9mcmVlaW5zZXJ0KGQsIHByZXZkdXAsIG5lZWRsb2dwKTsKKwkJCUFTU0VSVChkZnAgPT0gJmQtPmhkci5iZXN0ZnJlZVswXSk7CisJCQlBU1NFUlQoSU5UX0dFVChkZnAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKSA9PSBJTlRfR0VUKHByZXZkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKSk7CisJCQlBU1NFUlQoIWRmcFsxXS5sZW5ndGgpOworCQkJQVNTRVJUKCFkZnBbMl0ubGVuZ3RoKTsKKwkJfQorCX0KKwkvKgorCSAqIFRoZSBlbnRyeSBiZWZvcmUgdXMgaXMgZnJlZSwgbWVyZ2Ugd2l0aCBpdC4KKwkgKi8KKwllbHNlIGlmIChwcmV2ZHVwKSB7CisJCWRmcCA9IHhmc19kaXIyX2RhdGFfZnJlZWZpbmQoZCwgcHJldmR1cCk7CisJCUlOVF9NT0QocHJldmR1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQsIGxlbik7CisJCUlOVF9TRVQoKlhGU19ESVIyX0RBVEFfVU5VU0VEX1RBR19QKHByZXZkdXApLCBBUkNIX0NPTlZFUlQsCisJCQkoeGZzX2RpcjJfZGF0YV9vZmZfdCkoKGNoYXIgKilwcmV2ZHVwIC0gKGNoYXIgKilkKSk7CisJCXhmc19kaXIyX2RhdGFfbG9nX3VudXNlZCh0cCwgYnAsIHByZXZkdXApOworCQkvKgorCQkgKiBJZiB0aGUgcHJldmlvdXMgZW50cnkgd2FzIGluIHRoZSB0YWJsZSwgdGhlIG5ldyBlbnRyeQorCQkgKiBpcyBsb25nZXIsIHNvIGl0IHdpbGwgYmUgaW4gdGhlIHRhYmxlIHRvby4gIFJlbW92ZQorCQkgKiB0aGUgb2xkIG9uZSBhbmQgYWRkIHRoZSBuZXcgb25lLgorCQkgKi8KKwkJaWYgKGRmcCkgeworCQkJeGZzX2RpcjJfZGF0YV9mcmVlcmVtb3ZlKGQsIGRmcCwgbmVlZGxvZ3ApOworCQkJKHZvaWQpeGZzX2RpcjJfZGF0YV9mcmVlaW5zZXJ0KGQsIHByZXZkdXAsIG5lZWRsb2dwKTsKKwkJfQorCQkvKgorCQkgKiBPdGhlcndpc2Ugd2UgbmVlZCBhIHNjYW4gaWYgdGhlIG5ldyBlbnRyeSBpcyBiaWcgZW5vdWdoLgorCQkgKi8KKwkJZWxzZQorCQkJbmVlZHNjYW4gPSBJTlRfR0VUKHByZXZkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKSA+IElOVF9HRVQoZC0+aGRyLmJlc3RmcmVlWzJdLmxlbmd0aCwgQVJDSF9DT05WRVJUKTsKKwl9CisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGVudHJ5IGlzIGZyZWUsIG1lcmdlIHdpdGggaXQuCisJICovCisJZWxzZSBpZiAocG9zdGR1cCkgeworCQlkZnAgPSB4ZnNfZGlyMl9kYXRhX2ZyZWVmaW5kKGQsIHBvc3RkdXApOworCQluZXdkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKSgoY2hhciAqKWQgKyBvZmZzZXQpOworCQlJTlRfU0VUKG5ld2R1cC0+ZnJlZXRhZywgQVJDSF9DT05WRVJULCBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKTsKKwkJSU5UX1NFVChuZXdkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJULCBsZW4gKyBJTlRfR0VUKHBvc3RkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKSk7CisJCUlOVF9TRVQoKlhGU19ESVIyX0RBVEFfVU5VU0VEX1RBR19QKG5ld2R1cCksIEFSQ0hfQ09OVkVSVCwKKwkJCSh4ZnNfZGlyMl9kYXRhX29mZl90KSgoY2hhciAqKW5ld2R1cCAtIChjaGFyICopZCkpOworCQl4ZnNfZGlyMl9kYXRhX2xvZ191bnVzZWQodHAsIGJwLCBuZXdkdXApOworCQkvKgorCQkgKiBJZiB0aGUgZm9sbG93aW5nIGVudHJ5IHdhcyBpbiB0aGUgdGFibGUsIHRoZSBuZXcgZW50cnkKKwkJICogaXMgbG9uZ2VyLCBzbyBpdCB3aWxsIGJlIGluIHRoZSB0YWJsZSB0b28uICBSZW1vdmUKKwkJICogdGhlIG9sZCBvbmUgYW5kIGFkZCB0aGUgbmV3IG9uZS4KKwkJICovCisJCWlmIChkZnApIHsKKwkJCXhmc19kaXIyX2RhdGFfZnJlZXJlbW92ZShkLCBkZnAsIG5lZWRsb2dwKTsKKwkJCSh2b2lkKXhmc19kaXIyX2RhdGFfZnJlZWluc2VydChkLCBuZXdkdXAsIG5lZWRsb2dwKTsKKwkJfQorCQkvKgorCQkgKiBPdGhlcndpc2Ugd2UgbmVlZCBhIHNjYW4gaWYgdGhlIG5ldyBlbnRyeSBpcyBiaWcgZW5vdWdoLgorCQkgKi8KKwkJZWxzZQorCQkJbmVlZHNjYW4gPSBJTlRfR0VUKG5ld2R1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpID4gSU5UX0dFVChkLT5oZHIuYmVzdGZyZWVbMl0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpOworCX0KKwkvKgorCSAqIE5laXRoZXIgbmVpZ2hib3IgaXMgZnJlZS4gIE1ha2UgYSBuZXcgZW50cnkuCisJICovCisJZWxzZSB7CisJCW5ld2R1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopKChjaGFyICopZCArIG9mZnNldCk7CisJCUlOVF9TRVQobmV3ZHVwLT5mcmVldGFnLCBBUkNIX0NPTlZFUlQsIFhGU19ESVIyX0RBVEFfRlJFRV9UQUcpOworCQlJTlRfU0VUKG5ld2R1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQsIGxlbik7CisJCUlOVF9TRVQoKlhGU19ESVIyX0RBVEFfVU5VU0VEX1RBR19QKG5ld2R1cCksIEFSQ0hfQ09OVkVSVCwKKwkJCSh4ZnNfZGlyMl9kYXRhX29mZl90KSgoY2hhciAqKW5ld2R1cCAtIChjaGFyICopZCkpOworCQl4ZnNfZGlyMl9kYXRhX2xvZ191bnVzZWQodHAsIGJwLCBuZXdkdXApOworCQkodm9pZCl4ZnNfZGlyMl9kYXRhX2ZyZWVpbnNlcnQoZCwgbmV3ZHVwLCBuZWVkbG9ncCk7CisJfQorCSpuZWVkc2NhbnAgPSBuZWVkc2NhbjsKK30KKworLyoKKyAqIFRha2UgYSBieXRlIHJhbmdlIG91dCBvZiBhbiBleGlzdGluZyB1bnVzZWQgc3BhY2UgYW5kIG1ha2UgaXQgdW4tZnJlZS4KKyAqLwordm9pZAoreGZzX2RpcjJfZGF0YV91c2VfZnJlZSgKKwl4ZnNfdHJhbnNfdAkJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19kYWJ1Zl90CQkqYnAsCQkvKiBkYXRhIGJsb2NrIGJ1ZmZlciAqLworCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJKmR1cCwJCS8qIHVudXNlZCBlbnRyeSAqLworCXhmc19kaXIyX2RhdGFfYW9mZl90CW9mZnNldCwJCS8qIHN0YXJ0aW5nIG9mZnNldCB0byB1c2UgKi8KKwl4ZnNfZGlyMl9kYXRhX2FvZmZfdAlsZW4sCQkvKiBsZW5ndGggdG8gdXNlICovCisJaW50CQkJKm5lZWRsb2dwLAkvKiBvdXQ6IG5lZWQgdG8gbG9nIGhlYWRlciAqLworCWludAkJCSpuZWVkc2NhbnApCS8qIG91dDogbmVlZCByZWdlbiBiZXN0ZnJlZSAqLworeworCXhmc19kaXIyX2RhdGFfdAkJKmQ7CQkvKiBkYXRhIGJsb2NrICovCisJeGZzX2RpcjJfZGF0YV9mcmVlX3QJKmRmcDsJCS8qIGJlc3RmcmVlIHBvaW50ZXIgKi8KKwlpbnQJCQltYXRjaGJhY2s7CS8qIG1hdGNoZXMgZW5kIG9mIGZyZWVzcGFjZSAqLworCWludAkJCW1hdGNoZnJvbnQ7CS8qIG1hdGNoZXMgc3RhcnQgb2YgZnJlZXNwYWNlICovCisJaW50CQkJbmVlZHNjYW47CS8qIG5lZWQgdG8gcmVnZW4gYmVzdGZyZWUgKi8KKwl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CSpuZXdkdXA7CS8qIG5ldyB1bnVzZWQgZW50cnkgKi8KKwl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CSpuZXdkdXAyOwkvKiBhbm90aGVyIG5ldyB1bnVzZWQgZW50cnkgKi8KKwlpbnQJCQlvbGRsZW47CQkvKiBvbGQgdW51c2VkIGVudHJ5J3MgbGVuZ3RoICovCisKKwlkID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQoZC0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0RBVEFfTUFHSUMgfHwKKwkgICAgICAgSU5UX0dFVChkLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfQkxPQ0tfTUFHSUMpOworCUFTU0VSVChJTlRfR0VUKGR1cC0+ZnJlZXRhZywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKTsKKwlBU1NFUlQob2Zmc2V0ID49IChjaGFyICopZHVwIC0gKGNoYXIgKilkKTsKKwlBU1NFUlQob2Zmc2V0ICsgbGVuIDw9IChjaGFyICopZHVwICsgSU5UX0dFVChkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKSAtIChjaGFyICopZCk7CisJQVNTRVJUKChjaGFyICopZHVwIC0gKGNoYXIgKilkID09IElOVF9HRVQoKlhGU19ESVIyX0RBVEFfVU5VU0VEX1RBR19QKGR1cCksIEFSQ0hfQ09OVkVSVCkpOworCS8qCisJICogTG9vayB1cCB0aGUgZW50cnkgaW4gdGhlIGJlc3RmcmVlIHRhYmxlLgorCSAqLworCWRmcCA9IHhmc19kaXIyX2RhdGFfZnJlZWZpbmQoZCwgZHVwKTsKKwlvbGRsZW4gPSBJTlRfR0VUKGR1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpOworCUFTU0VSVChkZnAgfHwgb2xkbGVuIDw9IElOVF9HRVQoZC0+aGRyLmJlc3RmcmVlWzJdLmxlbmd0aCwgQVJDSF9DT05WRVJUKSk7CisJLyoKKwkgKiBDaGVjayBmb3IgYWxpZ25tZW50IHdpdGggZnJvbnQgYW5kIGJhY2sgb2YgdGhlIGVudHJ5LgorCSAqLworCW1hdGNoZnJvbnQgPSAoY2hhciAqKWR1cCAtIChjaGFyICopZCA9PSBvZmZzZXQ7CisJbWF0Y2hiYWNrID0gKGNoYXIgKilkdXAgKyBvbGRsZW4gLSAoY2hhciAqKWQgPT0gb2Zmc2V0ICsgbGVuOworCUFTU0VSVCgqbmVlZHNjYW5wID09IDApOworCW5lZWRzY2FuID0gMDsKKwkvKgorCSAqIElmIHdlIG1hdGNoZWQgaXQgZXhhY3RseSB3ZSBqdXN0IG5lZWQgdG8gZ2V0IHJpZCBvZiBpdCBmcm9tCisJICogdGhlIGJlc3RmcmVlIHRhYmxlLgorCSAqLworCWlmIChtYXRjaGZyb250ICYmIG1hdGNoYmFjaykgeworCQlpZiAoZGZwKSB7CisJCQluZWVkc2NhbiA9IGQtPmhkci5iZXN0ZnJlZVsyXS5vZmZzZXQ7CisJCQlpZiAoIW5lZWRzY2FuKQorCQkJCXhmc19kaXIyX2RhdGFfZnJlZXJlbW92ZShkLCBkZnAsIG5lZWRsb2dwKTsKKwkJfQorCX0KKwkvKgorCSAqIFdlIG1hdGNoIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBlbnRyeS4KKwkgKiBNYWtlIGEgbmV3IGVudHJ5IHdpdGggdGhlIHJlbWFpbmluZyBmcmVlc3BhY2UuCisJICovCisJZWxzZSBpZiAobWF0Y2hmcm9udCkgeworCQluZXdkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKSgoY2hhciAqKWQgKyBvZmZzZXQgKyBsZW4pOworCQlJTlRfU0VUKG5ld2R1cC0+ZnJlZXRhZywgQVJDSF9DT05WRVJULCBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKTsKKwkJSU5UX1NFVChuZXdkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJULCBvbGRsZW4gLSBsZW4pOworCQlJTlRfU0VUKCpYRlNfRElSMl9EQVRBX1VOVVNFRF9UQUdfUChuZXdkdXApLCBBUkNIX0NPTlZFUlQsCisJCQkoeGZzX2RpcjJfZGF0YV9vZmZfdCkoKGNoYXIgKiluZXdkdXAgLSAoY2hhciAqKWQpKTsKKwkJeGZzX2RpcjJfZGF0YV9sb2dfdW51c2VkKHRwLCBicCwgbmV3ZHVwKTsKKwkJLyoKKwkJICogSWYgaXQgd2FzIGluIHRoZSB0YWJsZSwgcmVtb3ZlIGl0IGFuZCBhZGQgdGhlIG5ldyBvbmUuCisJCSAqLworCQlpZiAoZGZwKSB7CisJCQl4ZnNfZGlyMl9kYXRhX2ZyZWVyZW1vdmUoZCwgZGZwLCBuZWVkbG9ncCk7CisJCQlkZnAgPSB4ZnNfZGlyMl9kYXRhX2ZyZWVpbnNlcnQoZCwgbmV3ZHVwLCBuZWVkbG9ncCk7CisJCQlBU1NFUlQoZGZwICE9IE5VTEwpOworCQkJQVNTRVJUKElOVF9HRVQoZGZwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPT0gSU5UX0dFVChuZXdkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKSk7CisJCQlBU1NFUlQoSU5UX0dFVChkZnAtPm9mZnNldCwgQVJDSF9DT05WRVJUKSA9PSAoY2hhciAqKW5ld2R1cCAtIChjaGFyICopZCk7CisJCQkvKgorCQkJICogSWYgd2UgZ290IGluc2VydGVkIGF0IHRoZSBsYXN0IHNsb3QsCisJCQkgKiB0aGF0IG1lYW5zIHdlIGRvbid0IGtub3cgaWYgdGhlcmUgd2FzIGEgYmV0dGVyCisJCQkgKiBjaG9pY2UgZm9yIHRoZSBsYXN0IHNsb3QsIG9yIG5vdC4gIFJlc2Nhbi4KKwkJCSAqLworCQkJbmVlZHNjYW4gPSBkZnAgPT0gJmQtPmhkci5iZXN0ZnJlZVsyXTsKKwkJfQorCX0KKwkvKgorCSAqIFdlIG1hdGNoIHRoZSBsYXN0IHBhcnQgb2YgdGhlIGVudHJ5LgorCSAqIFRyaW0gdGhlIGFsbG9jYXRlZCBzcGFjZSBvZmYgdGhlIHRhaWwgb2YgdGhlIGVudHJ5LgorCSAqLworCWVsc2UgaWYgKG1hdGNoYmFjaykgeworCQluZXdkdXAgPSBkdXA7CisJCUlOVF9TRVQobmV3ZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCwgKHhmc19kaXIyX2RhdGFfb2ZmX3QpCisJCQkoKChjaGFyICopZCArIG9mZnNldCkgLSAoY2hhciAqKW5ld2R1cCkpOworCQlJTlRfU0VUKCpYRlNfRElSMl9EQVRBX1VOVVNFRF9UQUdfUChuZXdkdXApLCBBUkNIX0NPTlZFUlQsCisJCQkoeGZzX2RpcjJfZGF0YV9vZmZfdCkoKGNoYXIgKiluZXdkdXAgLSAoY2hhciAqKWQpKTsKKwkJeGZzX2RpcjJfZGF0YV9sb2dfdW51c2VkKHRwLCBicCwgbmV3ZHVwKTsKKwkJLyoKKwkJICogSWYgaXQgd2FzIGluIHRoZSB0YWJsZSwgcmVtb3ZlIGl0IGFuZCBhZGQgdGhlIG5ldyBvbmUuCisJCSAqLworCQlpZiAoZGZwKSB7CisJCQl4ZnNfZGlyMl9kYXRhX2ZyZWVyZW1vdmUoZCwgZGZwLCBuZWVkbG9ncCk7CisJCQlkZnAgPSB4ZnNfZGlyMl9kYXRhX2ZyZWVpbnNlcnQoZCwgbmV3ZHVwLCBuZWVkbG9ncCk7CisJCQlBU1NFUlQoZGZwICE9IE5VTEwpOworCQkJQVNTRVJUKElOVF9HRVQoZGZwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPT0gSU5UX0dFVChuZXdkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKSk7CisJCQlBU1NFUlQoSU5UX0dFVChkZnAtPm9mZnNldCwgQVJDSF9DT05WRVJUKSA9PSAoY2hhciAqKW5ld2R1cCAtIChjaGFyICopZCk7CisJCQkvKgorCQkJICogSWYgd2UgZ290IGluc2VydGVkIGF0IHRoZSBsYXN0IHNsb3QsCisJCQkgKiB0aGF0IG1lYW5zIHdlIGRvbid0IGtub3cgaWYgdGhlcmUgd2FzIGEgYmV0dGVyCisJCQkgKiBjaG9pY2UgZm9yIHRoZSBsYXN0IHNsb3QsIG9yIG5vdC4gIFJlc2Nhbi4KKwkJCSAqLworCQkJbmVlZHNjYW4gPSBkZnAgPT0gJmQtPmhkci5iZXN0ZnJlZVsyXTsKKwkJfQorCX0KKwkvKgorCSAqIFBva2luZyBvdXQgdGhlIG1pZGRsZSBvZiBhbiBlbnRyeS4KKwkgKiBNYWtlIHR3byBuZXcgZW50cmllcy4KKwkgKi8KKwllbHNlIHsKKwkJbmV3ZHVwID0gZHVwOworCQlJTlRfU0VUKG5ld2R1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQsICh4ZnNfZGlyMl9kYXRhX29mZl90KQorCQkJKCgoY2hhciAqKWQgKyBvZmZzZXQpIC0gKGNoYXIgKiluZXdkdXApKTsKKwkJSU5UX1NFVCgqWEZTX0RJUjJfREFUQV9VTlVTRURfVEFHX1AobmV3ZHVwKSwgQVJDSF9DT05WRVJULAorCQkJKHhmc19kaXIyX2RhdGFfb2ZmX3QpKChjaGFyICopbmV3ZHVwIC0gKGNoYXIgKilkKSk7CisJCXhmc19kaXIyX2RhdGFfbG9nX3VudXNlZCh0cCwgYnAsIG5ld2R1cCk7CisJCW5ld2R1cDIgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKSgoY2hhciAqKWQgKyBvZmZzZXQgKyBsZW4pOworCQlJTlRfU0VUKG5ld2R1cDItPmZyZWV0YWcsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUjJfREFUQV9GUkVFX1RBRyk7CisJCUlOVF9TRVQobmV3ZHVwMi0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQsIG9sZGxlbiAtIGxlbiAtIElOVF9HRVQobmV3ZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpOworCQlJTlRfU0VUKCpYRlNfRElSMl9EQVRBX1VOVVNFRF9UQUdfUChuZXdkdXAyKSwgQVJDSF9DT05WRVJULAorCQkJKHhmc19kaXIyX2RhdGFfb2ZmX3QpKChjaGFyICopbmV3ZHVwMiAtIChjaGFyICopZCkpOworCQl4ZnNfZGlyMl9kYXRhX2xvZ191bnVzZWQodHAsIGJwLCBuZXdkdXAyKTsKKwkJLyoKKwkJICogSWYgdGhlIG9sZCBlbnRyeSB3YXMgaW4gdGhlIHRhYmxlLCB3ZSBuZWVkIHRvIHNjYW4KKwkJICogaWYgdGhlIDNyZCBlbnRyeSB3YXMgdmFsaWQsIHNpbmNlIHRoZXNlIGVudHJpZXMKKwkJICogYXJlIHNtYWxsZXIgdGhhbiB0aGUgb2xkIG9uZS4KKwkJICogSWYgd2UgZG9uJ3QgbmVlZCB0byBzY2FuIHRoYXQgbWVhbnMgdGhlcmUgd2VyZSAxIG9yIDIKKwkJICogZW50cmllcyBpbiB0aGUgdGFibGUsIGFuZCByZW1vdmluZyB0aGUgb2xkIGFuZCBhZGRpbmcKKwkJICogdGhlIDIgbmV3IHdpbGwgd29yay4KKwkJICovCisJCWlmIChkZnApIHsKKwkJCW5lZWRzY2FuID0gZC0+aGRyLmJlc3RmcmVlWzJdLmxlbmd0aDsKKwkJCWlmICghbmVlZHNjYW4pIHsKKwkJCQl4ZnNfZGlyMl9kYXRhX2ZyZWVyZW1vdmUoZCwgZGZwLCBuZWVkbG9ncCk7CisJCQkJKHZvaWQpeGZzX2RpcjJfZGF0YV9mcmVlaW5zZXJ0KGQsIG5ld2R1cCwKKwkJCQkJbmVlZGxvZ3ApOworCQkJCSh2b2lkKXhmc19kaXIyX2RhdGFfZnJlZWluc2VydChkLCBuZXdkdXAyLAorCQkJCQluZWVkbG9ncCk7CisJCQl9CisJCX0KKwl9CisJKm5lZWRzY2FucCA9IG5lZWRzY2FuOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX2RhdGEuaCBiL2ZzL3hmcy94ZnNfZGlyMl9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwMjI5NAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZGlyMl9kYXRhLmgKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19ESVIyX0RBVEFfSF9fCisjZGVmaW5lCV9fWEZTX0RJUjJfREFUQV9IX18KKworLyoKKyAqIERpcmVjdG9yeSBmb3JtYXQgMiwgZGF0YSBibG9jayBzdHJ1Y3R1cmVzLgorICovCisKK3N0cnVjdCB4ZnNfZGFidWY7CitzdHJ1Y3QgeGZzX2RhX2FyZ3M7CitzdHJ1Y3QgeGZzX2lub2RlOworc3RydWN0IHhmc190cmFuczsKKworLyoKKyAqIENvbnN0YW50cy4KKyAqLworI2RlZmluZQlYRlNfRElSMl9EQVRBX01BR0lDCTB4NTg0NDMyNDQJLyogWEQyRDogZm9yIG11bHRpYmxvY2sgZGlycyAqLworI2RlZmluZQlYRlNfRElSMl9EQVRBX0FMSUdOX0xPRwkzCQkvKiBpLmUuLCA4IGJ5dGVzICovCisjZGVmaW5lCVhGU19ESVIyX0RBVEFfQUxJR04JKDEgPDwgWEZTX0RJUjJfREFUQV9BTElHTl9MT0cpCisjZGVmaW5lCVhGU19ESVIyX0RBVEFfRlJFRV9UQUcJMHhmZmZmCisjZGVmaW5lCVhGU19ESVIyX0RBVEFfRkRfQ09VTlQJMworCisvKgorICogRGlyZWN0b3J5IGFkZHJlc3Mgc3BhY2UgZGl2aWRlZCBpbnRvIHNlY3Rpb25zLAorICogc3BhY2VzIHNlcGFyYXRlZCBieSAzMmdiLgorICovCisjZGVmaW5lCVhGU19ESVIyX1NQQUNFX1NJWkUJKDFVTEwgPDwgKDMyICsgWEZTX0RJUjJfREFUQV9BTElHTl9MT0cpKQorI2RlZmluZQlYRlNfRElSMl9EQVRBX1NQQUNFCTAKKyNkZWZpbmUJWEZTX0RJUjJfREFUQV9PRkZTRVQJKFhGU19ESVIyX0RBVEFfU1BBQ0UgKiBYRlNfRElSMl9TUEFDRV9TSVpFKQorI2RlZmluZQlYRlNfRElSMl9EQVRBX0ZJUlNUREIobXApCVwKKwlYRlNfRElSMl9CWVRFX1RPX0RCKG1wLCBYRlNfRElSMl9EQVRBX09GRlNFVCkKKworLyoKKyAqIE9mZnNldHMgb2YgLiBhbmQgLi4gaW4gZGF0YSBzcGFjZSAoYWx3YXlzIGJsb2NrIDApCisgKi8KKyNkZWZpbmUJWEZTX0RJUjJfREFUQV9ET1RfT0ZGU0VUCVwKKwkoKHhmc19kaXIyX2RhdGFfYW9mZl90KXNpemVvZih4ZnNfZGlyMl9kYXRhX2hkcl90KSkKKyNkZWZpbmUJWEZTX0RJUjJfREFUQV9ET1RET1RfT0ZGU0VUCVwKKwkoWEZTX0RJUjJfREFUQV9ET1RfT0ZGU0VUICsgWEZTX0RJUjJfREFUQV9FTlRTSVpFKDEpKQorI2RlZmluZQlYRlNfRElSMl9EQVRBX0ZJUlNUX09GRlNFVAkJXAorCShYRlNfRElSMl9EQVRBX0RPVERPVF9PRkZTRVQgKyBYRlNfRElSMl9EQVRBX0VOVFNJWkUoMikpCisKKy8qCisgKiBTdHJ1Y3R1cmVzLgorICovCisKKy8qCisgKiBEZXNjcmliZSBhIGZyZWUgYXJlYSBpbiB0aGUgZGF0YSBibG9jay4KKyAqIFRoZSBmcmVlc3BhY2Ugd2lsbCBiZSBmb3JtYXR0ZWQgYXMgYSB4ZnNfZGlyMl9kYXRhX3VudXNlZF90LgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9kYXRhX2ZyZWUgeworCXhmc19kaXIyX2RhdGFfb2ZmX3QJb2Zmc2V0OwkJLyogc3RhcnQgb2YgZnJlZXNwYWNlICovCisJeGZzX2RpcjJfZGF0YV9vZmZfdAlsZW5ndGg7CQkvKiBsZW5ndGggb2YgZnJlZXNwYWNlICovCit9IHhmc19kaXIyX2RhdGFfZnJlZV90OworCisvKgorICogSGVhZGVyIGZvciB0aGUgZGF0YSBibG9ja3MuCisgKiBBbHdheXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGRpcmVjdG9yeS1zaXplZCBibG9jay4KKyAqIFRoZSBjb2RlIGtub3dzIHRoYXQgWEZTX0RJUjJfREFUQV9GRF9DT1VOVCBpcyAzLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9kYXRhX2hkciB7CisJX191aW50MzJfdAkJbWFnaWM7CQkvKiBYRlNfRElSMl9EQVRBX01BR0lDICovCisJCQkJCQkvKiBvciBYRlNfRElSMl9CTE9DS19NQUdJQyAqLworCXhmc19kaXIyX2RhdGFfZnJlZV90CWJlc3RmcmVlW1hGU19ESVIyX0RBVEFfRkRfQ09VTlRdOworfSB4ZnNfZGlyMl9kYXRhX2hkcl90OworCisvKgorICogQWN0aXZlIGVudHJ5IGluIGEgZGF0YSBibG9jay4gIEFsaWduZWQgdG8gOCBieXRlcy4KKyAqIFRhZyBhcHBlYXJzIGFzIHRoZSBsYXN0IDIgYnl0ZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX2RhdGFfZW50cnkgeworCXhmc19pbm9fdAkJaW51bWJlcjsJLyogaW5vZGUgbnVtYmVyICovCisJX191aW50OF90CQluYW1lbGVuOwkvKiBuYW1lIGxlbmd0aCAqLworCV9fdWludDhfdAkJbmFtZVsxXTsJLyogbmFtZSBieXRlcywgbm8gbnVsbCAqLworCQkJCQkJLyogdmFyaWFibGUgb2Zmc2V0ICovCisJeGZzX2RpcjJfZGF0YV9vZmZfdAl0YWc7CQkvKiBzdGFydGluZyBvZmZzZXQgb2YgdXMgKi8KK30geGZzX2RpcjJfZGF0YV9lbnRyeV90OworCisvKgorICogVW51c2VkIGVudHJ5IGluIGEgZGF0YSBibG9jay4gIEFsaWduZWQgdG8gOCBieXRlcy4KKyAqIFRhZyBhcHBlYXJzIGFzIHRoZSBsYXN0IDIgYnl0ZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX2RhdGFfdW51c2VkIHsKKwlfX3VpbnQxNl90CQlmcmVldGFnOwkvKiBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHICovCisJeGZzX2RpcjJfZGF0YV9vZmZfdAlsZW5ndGg7CQkvKiB0b3RhbCBmcmVlIGxlbmd0aCAqLworCQkJCQkJLyogdmFyaWFibGUgb2Zmc2V0ICovCisJeGZzX2RpcjJfZGF0YV9vZmZfdAl0YWc7CQkvKiBzdGFydGluZyBvZmZzZXQgb2YgdXMgKi8KK30geGZzX2RpcjJfZGF0YV91bnVzZWRfdDsKKwordHlwZWRlZiB1bmlvbiB7CisJeGZzX2RpcjJfZGF0YV9lbnRyeV90CWVudHJ5OworCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJdW51c2VkOworfSB4ZnNfZGlyMl9kYXRhX3VuaW9uX3Q7CisKKy8qCisgKiBHZW5lcmljIGRhdGEgYmxvY2sgc3RydWN0dXJlLCBmb3IgeGZzX2RiLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9kYXRhIHsKKwl4ZnNfZGlyMl9kYXRhX2hkcl90CWhkcjsJCS8qIG1hZ2ljIFhGU19ESVIyX0RBVEFfTUFHSUMgKi8KKwl4ZnNfZGlyMl9kYXRhX3VuaW9uX3QJdVsxXTsKK30geGZzX2RpcjJfZGF0YV90OworCisvKgorICogTWFjcm9zLgorICovCisKKy8qCisgKiBTaXplIG9mIGEgZGF0YSBlbnRyeS4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9EQVRBX0VOVFNJWkUpCitpbnQgeGZzX2RpcjJfZGF0YV9lbnRzaXplKGludCBuKTsKKyNkZWZpbmUgWEZTX0RJUjJfREFUQV9FTlRTSVpFKG4pCXhmc19kaXIyX2RhdGFfZW50c2l6ZShuKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfREFUQV9FTlRTSVpFKG4pCVwKKwkoKGludCkocm91bmR1cChvZmZzZXRvZih4ZnNfZGlyMl9kYXRhX2VudHJ5X3QsIG5hbWVbMF0pICsgKG4pICsgXAorCQkgKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2RhdGFfb2ZmX3QpLCBYRlNfRElSMl9EQVRBX0FMSUdOKSkpCisjZW5kaWYKKworLyoKKyAqIFBvaW50ZXIgdG8gYW4gZW50cnkncyB0YWcgd29yZC4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9EQVRBX0VOVFJZX1RBR19QKQoreGZzX2RpcjJfZGF0YV9vZmZfdCAqeGZzX2RpcjJfZGF0YV9lbnRyeV90YWdfcCh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKmRlcCk7CisjZGVmaW5lCVhGU19ESVIyX0RBVEFfRU5UUllfVEFHX1AoZGVwKQl4ZnNfZGlyMl9kYXRhX2VudHJ5X3RhZ19wKGRlcCkKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX0RBVEFfRU5UUllfVEFHX1AoZGVwKQlcCisJKCh4ZnNfZGlyMl9kYXRhX29mZl90ICopXAorCSAoKGNoYXIgKikoZGVwKSArIFhGU19ESVIyX0RBVEFfRU5UU0laRSgoZGVwKS0+bmFtZWxlbikgLSBcCisJICAodWludClzaXplb2YoeGZzX2RpcjJfZGF0YV9vZmZfdCkpKQorI2VuZGlmCisKKy8qCisgKiBQb2ludGVyIHRvIGEgZnJlZXNwYWNlJ3MgdGFnIHdvcmQuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfREFUQV9VTlVTRURfVEFHX1ApCit4ZnNfZGlyMl9kYXRhX29mZl90ICp4ZnNfZGlyMl9kYXRhX3VudXNlZF90YWdfcCh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICpkdXApOworI2RlZmluZQlYRlNfRElSMl9EQVRBX1VOVVNFRF9UQUdfUChkdXApIFwKKwl4ZnNfZGlyMl9kYXRhX3VudXNlZF90YWdfcChkdXApCisjZWxzZQorI2RlZmluZQlYRlNfRElSMl9EQVRBX1VOVVNFRF9UQUdfUChkdXApCVwKKwkoKHhmc19kaXIyX2RhdGFfb2ZmX3QgKilcCisJICgoY2hhciAqKShkdXApICsgSU5UX0dFVCgoZHVwKS0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpIFwKKwkJCS0gKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2RhdGFfb2ZmX3QpKSkKKyNlbmRpZgorCisvKgorICogRnVuY3Rpb24gZGVjbGFyYXRpb25zLgorICovCisKKyNpZmRlZiBERUJVRworZXh0ZXJuIHZvaWQKKwl4ZnNfZGlyMl9kYXRhX2NoZWNrKHN0cnVjdCB4ZnNfaW5vZGUgKmRwLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCk7CisjZWxzZQorI2RlZmluZQl4ZnNfZGlyMl9kYXRhX2NoZWNrKGRwLGJwKQorI2VuZGlmCisKK2V4dGVybiB4ZnNfZGlyMl9kYXRhX2ZyZWVfdCAqCisJeGZzX2RpcjJfZGF0YV9mcmVlZmluZCh4ZnNfZGlyMl9kYXRhX3QgKmQsCisJCQkgICAgICAgeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqZHVwKTsKKworZXh0ZXJuIHhmc19kaXIyX2RhdGFfZnJlZV90ICoKKwl4ZnNfZGlyMl9kYXRhX2ZyZWVpbnNlcnQoeGZzX2RpcjJfZGF0YV90ICpkLAorCQkJCSB4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICpkdXAsIGludCAqbG9naGVhZCk7CisKK2V4dGVybiB2b2lkCisJeGZzX2RpcjJfZGF0YV9mcmVlcmVtb3ZlKHhmc19kaXIyX2RhdGFfdCAqZCwKKwkJCQkgeGZzX2RpcjJfZGF0YV9mcmVlX3QgKmRmcCwgaW50ICpsb2doZWFkKTsKKworZXh0ZXJuIHZvaWQKKwl4ZnNfZGlyMl9kYXRhX2ZyZWVzY2FuKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9kYXRhX3QgKmQsCisJCQkgICAgICAgaW50ICpsb2doZWFkLCBjaGFyICphZW5kcCk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9kYXRhX2luaXQoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCB4ZnNfZGlyMl9kYl90IGJsa25vLAorCQkJICAgc3RydWN0IHhmc19kYWJ1ZiAqKmJwcCk7CisKK2V4dGVybiB2b2lkCisJeGZzX2RpcjJfZGF0YV9sb2dfZW50cnkoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfZGFidWYgKmJwLAorCQkJCXhmc19kaXIyX2RhdGFfZW50cnlfdCAqZGVwKTsKKworZXh0ZXJuIHZvaWQKKwl4ZnNfZGlyMl9kYXRhX2xvZ19oZWFkZXIoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfZGFidWYgKmJwKTsKKworZXh0ZXJuIHZvaWQKKwl4ZnNfZGlyMl9kYXRhX2xvZ191bnVzZWQoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfZGFidWYgKmJwLAorCQkJCSB4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICpkdXApOworCitleHRlcm4gdm9pZAorCXhmc19kaXIyX2RhdGFfbWFrZV9mcmVlKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCwKKwkJCQl4ZnNfZGlyMl9kYXRhX2FvZmZfdCBvZmZzZXQsCisJCQkJeGZzX2RpcjJfZGF0YV9hb2ZmX3QgbGVuLCBpbnQgKm5lZWRsb2dwLAorCQkJCWludCAqbmVlZHNjYW5wKTsKKworZXh0ZXJuIHZvaWQKKwl4ZnNfZGlyMl9kYXRhX3VzZV9mcmVlKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCwKKwkJCSAgICAgICB4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICpkdXAsCisJCQkgICAgICAgeGZzX2RpcjJfZGF0YV9hb2ZmX3Qgb2Zmc2V0LAorCQkJICAgICAgIHhmc19kaXIyX2RhdGFfYW9mZl90IGxlbiwgaW50ICpuZWVkbG9ncCwKKwkJCSAgICAgICBpbnQgKm5lZWRzY2FucCk7CisKKyNlbmRpZgkvKiBfX1hGU19ESVIyX0RBVEFfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjJfbGVhZi5jIGIvZnMveGZzL3hmc19kaXIyX2xlYWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjJkMWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19kaXIyX2xlYWYuYwpAQCAtMCwwICsxLDE4OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKy8qCisgKiB4ZnNfZGlyMl9sZWFmLmMKKyAqIFhGUyBkaXJlY3RvcnkgdmVyc2lvbiAyIGltcGxlbWVudGF0aW9uIC0gc2luZ2xlIGxlYWYgZm9ybQorICogc2VlIHhmc19kaXIyX2xlYWYuaCBmb3IgZGF0YSBzdHJ1Y3R1cmVzLgorICogVGhlc2UgZGlyZWN0b3JpZXMgaGF2ZSBtdWx0aXBsZSBYRlNfRElSMl9EQVRBIGJsb2NrcyBhbmQgb25lCisgKiBYRlNfRElSMl9MRUFGMSBibG9jayBjb250YWluaW5nIHRoZSBoYXNoIHRhYmxlIGFuZCBmcmVlc3BhY2UgbWFwLgorICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKworI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfZGF0YS5oIgorI2luY2x1ZGUgInhmc19kaXIyX2xlYWYuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9ibG9jay5oIgorI2luY2x1ZGUgInhmc19kaXIyX25vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl90cmFjZS5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKworLyoKKyAqIExvY2FsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KKyAqLworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCB4ZnNfZGlyMl9sZWFmX2NoZWNrKHhmc19pbm9kZV90ICpkcCwgeGZzX2RhYnVmX3QgKmJwKTsKKyNlbHNlCisjZGVmaW5lCXhmc19kaXIyX2xlYWZfY2hlY2soZHAsIGJwKQorI2VuZGlmCitzdGF0aWMgaW50IHhmc19kaXIyX2xlYWZfbG9va3VwX2ludCh4ZnNfZGFfYXJnc190ICphcmdzLCB4ZnNfZGFidWZfdCAqKmxicHAsCisJCQkJICAgIGludCAqaW5kZXhwLCB4ZnNfZGFidWZfdCAqKmRicHApOworCisvKgorICogQ29udmVydCBhIGJsb2NrIGZvcm0gZGlyZWN0b3J5IHRvIGEgbGVhZiBmb3JtIGRpcmVjdG9yeS4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX2Jsb2NrX3RvX2xlYWYoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MsCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCisJeGZzX2RhYnVmX3QJCSpkYnApCQkvKiBpbnB1dCBibG9jaydzIGJ1ZmZlciAqLworeworCXhmc19kaXIyX2RhdGFfb2ZmX3QJKmJlc3RzcDsJLyogbGVhZidzIGJlc3RzcCBlbnRyaWVzICovCisJeGZzX2RhYmxrX3QJCWJsa25vOwkJLyogbGVhZiBibG9jaydzIGJubyAqLworCXhmc19kaXIyX2Jsb2NrX3QJKmJsb2NrOwkJLyogYmxvY2sgc3RydWN0dXJlICovCisJeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpibHA7CQkvKiBibG9jaydzIGxlYWYgZW50cmllcyAqLworCXhmc19kaXIyX2Jsb2NrX3RhaWxfdAkqYnRwOwkJLyogYmxvY2sncyB0YWlsICovCisJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiBjb2RlICovCisJeGZzX2RhYnVmX3QJCSpsYnA7CQkvKiBsZWFmIGJsb2NrJ3MgYnVmZmVyICovCisJeGZzX2RpcjJfZGJfdAkJbGRiOwkJLyogbGVhZiBibG9jaydzIGJubyAqLworCXhmc19kaXIyX2xlYWZfdAkJKmxlYWY7CQkvKiBsZWFmIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2xlYWZfdGFpbF90CSpsdHA7CQkvKiBsZWFmJ3MgdGFpbCAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJaW50CQkJbmVlZGxvZzsJLyogbmVlZCB0byBsb2cgYmxvY2sgaGVhZGVyICovCisJaW50CQkJbmVlZHNjYW47CS8qIG5lZWQgdG8gcmVzY2FuIGJlc3RmcmVlICovCisJeGZzX3RyYW5zX3QJCSp0cDsJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3NfYigiYmxvY2tfdG9fbGVhZiIsIGFyZ3MsIGRicCk7CisJZHAgPSBhcmdzLT5kcDsKKwltcCA9IGRwLT5pX21vdW50OworCXRwID0gYXJncy0+dHJhbnM7CisJLyoKKwkgKiBBZGQgdGhlIGxlYWYgYmxvY2sgdG8gdGhlIGlub2RlLgorCSAqIFRoaXMgaW50ZXJmYWNlIHdpbGwgb25seSBwdXQgYmxvY2tzIGluIHRoZSBsZWFmL25vZGUgcmFuZ2UuCisJICogU2luY2UgdGhhdCdzIGVtcHR5IG5vdywgd2UnbGwgZ2V0IHRoZSByb290IChibG9jayAwIGluIHJhbmdlKS4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2RhX2dyb3dfaW5vZGUoYXJncywgJmJsa25vKSkpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlsZGIgPSBYRlNfRElSMl9EQV9UT19EQihtcCwgYmxrbm8pOworCUFTU0VSVChsZGIgPT0gWEZTX0RJUjJfTEVBRl9GSVJTVERCKG1wKSk7CisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBsZWFmIGJsb2NrLCBnZXQgYSBidWZmZXIgZm9yIGl0LgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfZGlyMl9sZWFmX2luaXQoYXJncywgbGRiLCAmbGJwLCBYRlNfRElSMl9MRUFGMV9NQUdJQykpKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJQVNTRVJUKGxicCAhPSBOVUxMKTsKKwlsZWFmID0gbGJwLT5kYXRhOworCWJsb2NrID0gZGJwLT5kYXRhOworCXhmc19kaXIyX2RhdGFfY2hlY2soZHAsIGRicCk7CisJYnRwID0gWEZTX0RJUjJfQkxPQ0tfVEFJTF9QKG1wLCBibG9jayk7CisJYmxwID0gWEZTX0RJUjJfQkxPQ0tfTEVBRl9QKGJ0cCk7CisJLyoKKwkgKiBTZXQgdGhlIGNvdW50cyBpbiB0aGUgbGVhZiBoZWFkZXIuCisJICovCisJSU5UX0NPUFkobGVhZi0+aGRyLmNvdW50LCBidHAtPmNvdW50LCBBUkNIX0NPTlZFUlQpOyAvKiBJTlRfOiB0eXBlIGNoYW5nZSAqLworCUlOVF9DT1BZKGxlYWYtPmhkci5zdGFsZSwgYnRwLT5zdGFsZSwgQVJDSF9DT05WRVJUKTsgLyogSU5UXzogdHlwZSBjaGFuZ2UgKi8KKwkvKgorCSAqIENvdWxkIGNvbXBhY3QgdGhlc2UgYnV0IEkgdGhpbmsgd2UgYWx3YXlzIGRvIHRoZSBjb252ZXJzaW9uCisJICogYWZ0ZXIgc3F1ZWV6aW5nIG91dCBzdGFsZSBlbnRyaWVzLgorCSAqLworCW1lbWNweShsZWFmLT5lbnRzLCBibHAsIElOVF9HRVQoYnRwLT5jb3VudCwgQVJDSF9DT05WRVJUKSAqIHNpemVvZih4ZnNfZGlyMl9sZWFmX2VudHJ5X3QpKTsKKwl4ZnNfZGlyMl9sZWFmX2xvZ19lbnRzKHRwLCBsYnAsIDAsIElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gMSk7CisJbmVlZHNjYW4gPSAwOworCW5lZWRsb2cgPSAxOworCS8qCisJICogTWFrZSB0aGUgc3BhY2UgZm9ybWVybHkgb2NjdXBpZWQgYnkgdGhlIGxlYWYgZW50cmllcyBhbmQgYmxvY2sKKwkgKiB0YWlsIGJlIGZyZWUuCisJICovCisJeGZzX2RpcjJfZGF0YV9tYWtlX2ZyZWUodHAsIGRicCwKKwkJKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoY2hhciAqKWJscCAtIChjaGFyICopYmxvY2spLAorCQkoeGZzX2RpcjJfZGF0YV9hb2ZmX3QpKChjaGFyICopYmxvY2sgKyBtcC0+bV9kaXJibGtzaXplIC0KKwkJCQkgICAgICAgKGNoYXIgKilibHApLAorCQkmbmVlZGxvZywgJm5lZWRzY2FuKTsKKwkvKgorCSAqIEZpeCB1cCB0aGUgYmxvY2sgaGVhZGVyLCBtYWtlIGl0IGEgZGF0YSBibG9jay4KKwkgKi8KKwlJTlRfU0VUKGJsb2NrLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUjJfREFUQV9NQUdJQyk7CisJaWYgKG5lZWRzY2FuKQorCQl4ZnNfZGlyMl9kYXRhX2ZyZWVzY2FuKG1wLCAoeGZzX2RpcjJfZGF0YV90ICopYmxvY2ssICZuZWVkbG9nLAorCQkJTlVMTCk7CisJLyoKKwkgKiBTZXQgdXAgbGVhZiB0YWlsIGFuZCBiZXN0cyB0YWJsZS4KKwkgKi8KKwlsdHAgPSBYRlNfRElSMl9MRUFGX1RBSUxfUChtcCwgbGVhZik7CisJSU5UX1NFVChsdHAtPmJlc3Rjb3VudCwgQVJDSF9DT05WRVJULCAxKTsKKwliZXN0c3AgPSBYRlNfRElSMl9MRUFGX0JFU1RTX1AobHRwKTsKKwlJTlRfQ09QWShiZXN0c3BbMF0sIGJsb2NrLT5oZHIuYmVzdGZyZWVbMF0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpOworCS8qCisJICogTG9nIHRoZSBkYXRhIGhlYWRlciBhbmQgbGVhZiBiZXN0cyB0YWJsZS4KKwkgKi8KKwlpZiAobmVlZGxvZykKKwkJeGZzX2RpcjJfZGF0YV9sb2dfaGVhZGVyKHRwLCBkYnApOworCXhmc19kaXIyX2xlYWZfY2hlY2soZHAsIGxicCk7CisJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCwgZGJwKTsKKwl4ZnNfZGlyMl9sZWFmX2xvZ19iZXN0cyh0cCwgbGJwLCAwLCAwKTsKKwl4ZnNfZGFfYnVmX2RvbmUobGJwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFkZCBhbiBlbnRyeSB0byBhIGxlYWYgZm9ybSBkaXJlY3RvcnkuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9sZWFmX2FkZG5hbWUoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MpCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCit7CisJeGZzX2RpcjJfZGF0YV9vZmZfdAkqYmVzdHNwOwkvKiBmcmVlc3BhY2UgdGFibGUgaW4gbGVhZiAqLworCWludAkJCWNvbXBhY3Q7CS8qIG5lZWQgdG8gY29tcGFjdCBsZWF2ZXMgKi8KKwl4ZnNfZGlyMl9kYXRhX3QJCSpkYXRhOwkJLyogZGF0YSBibG9jayBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGFidWZfdAkJKmRicDsJCS8qIGRhdGEgYmxvY2sgYnVmZmVyICovCisJeGZzX2RpcjJfZGF0YV9lbnRyeV90CSpkZXA7CQkvKiBkYXRhIGJsb2NrIGVudHJ5ICovCisJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CSpkdXA7CQkvKiBkYXRhIHVudXNlZCBlbnRyeSAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQkJZ3Jvd247CQkvKiBhbGxvY2F0ZWQgbmV3IGRhdGEgYmxvY2sgKi8KKwlpbnQJCQloaWdoc3RhbGU7CS8qIGluZGV4IG9mIG5leHQgc3RhbGUgbGVhZiAqLworCWludAkJCWk7CQkvKiB0ZW1wb3JhcnksIGluZGV4ICovCisJaW50CQkJaW5kZXg7CQkvKiBsZWFmIHRhYmxlIHBvc2l0aW9uICovCisJeGZzX2RhYnVmX3QJCSpsYnA7CQkvKiBsZWFmJ3MgYnVmZmVyICovCisJeGZzX2RpcjJfbGVhZl90CQkqbGVhZjsJCS8qIGxlYWYgc3RydWN0dXJlICovCisJaW50CQkJbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIG5ldyBlbnRyeSAqLworCXhmc19kaXIyX2xlYWZfZW50cnlfdAkqbGVwOwkJLyogbGVhZiBlbnRyeSB0YWJsZSBwb2ludGVyICovCisJaW50CQkJbGZsb2dsb3c7CS8qIGxvdyBsZWFmIGxvZ2dpbmcgaW5kZXggKi8KKwlpbnQJCQlsZmxvZ2hpZ2g7CS8qIGhpZ2ggbGVhZiBsb2dnaW5nIGluZGV4ICovCisJaW50CQkJbG93c3RhbGU7CS8qIGluZGV4IG9mIHByZXYgc3RhbGUgbGVhZiAqLworCXhmc19kaXIyX2xlYWZfdGFpbF90CSpsdHA7CQkvKiBsZWFmIHRhaWwgcG9pbnRlciAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJaW50CQkJbmVlZGJ5dGVzOwkvKiBsZWFmIGJsb2NrIGJ5dGVzIG5lZWRlZCAqLworCWludAkJCW5lZWRsb2c7CS8qIG5lZWQgdG8gbG9nIGRhdGEgaGVhZGVyICovCisJaW50CQkJbmVlZHNjYW47CS8qIG5lZWQgdG8gcmVzY2FuIGRhdGEgZnJlZSAqLworCXhmc19kaXIyX2RhdGFfb2ZmX3QJKnRhZ3A7CQkvKiBlbmQgb2YgZGF0YSBlbnRyeSAqLworCXhmc190cmFuc190CQkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2RpcjJfZGJfdAkJdXNlX2Jsb2NrOwkvKiBkYXRhIGJsb2NrIG51bWJlciAqLworCisJeGZzX2RpcjJfdHJhY2VfYXJncygibGVhZl9hZGRuYW1lIiwgYXJncyk7CisJZHAgPSBhcmdzLT5kcDsKKwl0cCA9IGFyZ3MtPnRyYW5zOworCW1wID0gZHAtPmlfbW91bnQ7CisJLyoKKwkgKiBSZWFkIHRoZSBsZWFmIGJsb2NrLgorCSAqLworCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKHRwLCBkcCwgbXAtPm1fZGlybGVhZmJsaywgLTEsICZsYnAsCisJCVhGU19EQVRBX0ZPUkspOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCUFTU0VSVChsYnAgIT0gTlVMTCk7CisJLyoKKwkgKiBMb29rIHVwIHRoZSBlbnRyeSBieSBoYXNoIHZhbHVlIGFuZCBuYW1lLgorCSAqIFdlIGtub3cgaXQncyBub3QgdGhlcmUsIG91ciBjYWxsZXIgaGFzIGFscmVhZHkgZG9uZSBhIGxvb2t1cC4KKwkgKiBTbyB0aGUgaW5kZXggaXMgb2YgdGhlIGVudHJ5IHRvIGluc2VydCBpbiBmcm9udCBvZi4KKwkgKiBCdXQgaWYgdGhlcmUgYXJlIGR1cCBoYXNoIHZhbHVlcyB0aGUgaW5kZXggaXMgb2YgdGhlIGZpcnN0IG9mIHRob3NlLgorCSAqLworCWluZGV4ID0geGZzX2RpcjJfbGVhZl9zZWFyY2hfaGFzaChhcmdzLCBsYnApOworCWxlYWYgPSBsYnAtPmRhdGE7CisJbHRwID0gWEZTX0RJUjJfTEVBRl9UQUlMX1AobXAsIGxlYWYpOworCWJlc3RzcCA9IFhGU19ESVIyX0xFQUZfQkVTVFNfUChsdHApOworCWxlbmd0aCA9IFhGU19ESVIyX0RBVEFfRU5UU0laRShhcmdzLT5uYW1lbGVuKTsKKwkvKgorCSAqIFNlZSBpZiB0aGVyZSBhcmUgYW55IGVudHJpZXMgd2l0aCB0aGUgc2FtZSBoYXNoIHZhbHVlCisJICogYW5kIHNwYWNlIGluIHRoZWlyIGJsb2NrIGZvciB0aGUgbmV3IGVudHJ5LgorCSAqIFRoaXMgaXMgZ29vZCBiZWNhdXNlIGl0IHB1dHMgbXVsdGlwbGUgc2FtZS1oYXNoIHZhbHVlIGVudHJpZXMKKwkgKiBpbiBhIGRhdGEgYmxvY2ssIGltcHJvdmluZyB0aGUgbG9va3VwIG9mIHRob3NlIGVudHJpZXMuCisJICovCisJZm9yICh1c2VfYmxvY2sgPSAtMSwgbGVwID0gJmxlYWYtPmVudHNbaW5kZXhdOworCSAgICAgaW5kZXggPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAmJiBJTlRfR0VUKGxlcC0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA9PSBhcmdzLT5oYXNodmFsOworCSAgICAgaW5kZXgrKywgbGVwKyspIHsKKwkJaWYgKElOVF9HRVQobGVwLT5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX05VTExfREFUQVBUUikKKwkJCWNvbnRpbnVlOworCQlpID0gWEZTX0RJUjJfREFUQVBUUl9UT19EQihtcCwgSU5UX0dFVChsZXAtPmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkpOworCQlBU1NFUlQoaSA8IElOVF9HRVQobHRwLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCkpOworCQlBU1NFUlQoSU5UX0dFVChiZXN0c3BbaV0sIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTERBVEFPRkYpOworCQlpZiAoSU5UX0dFVChiZXN0c3BbaV0sIEFSQ0hfQ09OVkVSVCkgPj0gbGVuZ3RoKSB7CisJCQl1c2VfYmxvY2sgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyoKKwkgKiBEaWRuJ3QgZmluZCBhIGJsb2NrIHlldCwgbGluZWFyIHNlYXJjaCBhbGwgdGhlIGRhdGEgYmxvY2tzLgorCSAqLworCWlmICh1c2VfYmxvY2sgPT0gLTEpIHsKKwkJZm9yIChpID0gMDsgaSA8IElOVF9HRVQobHRwLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCk7IGkrKykgeworCQkJLyoKKwkJCSAqIFJlbWVtYmVyIGEgYmxvY2sgd2Ugc2VlIHRoYXQncyBtaXNzaW5nLgorCQkJICovCisJCQlpZiAoSU5UX0dFVChiZXN0c3BbaV0sIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTERBVEFPRkYgJiYgdXNlX2Jsb2NrID09IC0xKQorCQkJCXVzZV9ibG9jayA9IGk7CisJCQllbHNlIGlmIChJTlRfR0VUKGJlc3RzcFtpXSwgQVJDSF9DT05WRVJUKSA+PSBsZW5ndGgpIHsKKwkJCQl1c2VfYmxvY2sgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCS8qCisJICogSG93IG1hbnkgYnl0ZXMgZG8gd2UgbmVlZCBpbiB0aGUgbGVhZiBibG9jaz8KKwkgKi8KKwluZWVkYnl0ZXMgPQorCQkobGVhZi0+aGRyLnN0YWxlID8gMCA6ICh1aW50KXNpemVvZihsZWFmLT5lbnRzWzBdKSkgKworCQkodXNlX2Jsb2NrICE9IC0xID8gMCA6ICh1aW50KXNpemVvZihsZWFmLT5iZXN0c1swXSkpOworCS8qCisJICogTm93IGtpbGwgdXNlX2Jsb2NrIGlmIGl0IHJlZmVycyB0byBhIG1pc3NpbmcgYmxvY2ssIHNvIHdlCisJICogY2FuIHVzZSBpdCBhcyBhbiBpbmRpY2F0aW9uIG9mIGFsbG9jYXRpb24gbmVlZGVkLgorCSAqLworCWlmICh1c2VfYmxvY2sgIT0gLTEgJiYgSU5UX0dFVChiZXN0c3BbdXNlX2Jsb2NrXSwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREFUQU9GRikKKwkJdXNlX2Jsb2NrID0gLTE7CisJLyoKKwkgKiBJZiB3ZSBkb24ndCBoYXZlIGVub3VnaCBmcmVlIGJ5dGVzIGJ1dCB3ZSBjYW4gbWFrZSBlbm91Z2gKKwkgKiBieSBjb21wYWN0aW5nIG91dCBzdGFsZSBlbnRyaWVzLCB3ZSdsbCBkbyB0aGF0LgorCSAqLworCWlmICgoY2hhciAqKWJlc3RzcCAtIChjaGFyICopJmxlYWYtPmVudHNbSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCldIDwgbmVlZGJ5dGVzICYmCisJICAgIElOVF9HRVQobGVhZi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQpID4gMSkgeworCQljb21wYWN0ID0gMTsKKwl9CisJLyoKKwkgKiBPdGhlcndpc2UgaWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggZnJlZSBieXRlcyB3ZSBuZWVkIHRvCisJICogY29udmVydCB0byBub2RlIGZvcm0uCisJICovCisJZWxzZSBpZiAoKGNoYXIgKiliZXN0c3AgLSAoY2hhciAqKSZsZWFmLT5lbnRzW0lOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpXSA8CisJCSBuZWVkYnl0ZXMpIHsKKwkJLyoKKwkJICogSnVzdCBjaGVja2luZyBvciBubyBzcGFjZSByZXNlcnZhdGlvbiwgZ2l2ZSB1cC4KKwkJICovCisJCWlmIChhcmdzLT5qdXN0Y2hlY2sgfHwgYXJncy0+dG90YWwgPT0gMCkgeworCQkJeGZzX2RhX2JyZWxzZSh0cCwgbGJwKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRU5PU1BDKTsKKwkJfQorCQkvKgorCQkgKiBDb252ZXJ0IHRvIG5vZGUgZm9ybS4KKwkJICovCisJCWVycm9yID0geGZzX2RpcjJfbGVhZl90b19ub2RlKGFyZ3MsIGxicCk7CisJCXhmc19kYV9idWZfZG9uZShsYnApOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJCS8qCisJCSAqIFRoZW4gYWRkIHRoZSBuZXcgZW50cnkuCisJCSAqLworCQlyZXR1cm4geGZzX2RpcjJfbm9kZV9hZGRuYW1lKGFyZ3MpOworCX0KKwkvKgorCSAqIE90aGVyd2lzZSBpdCB3aWxsIGZpdCB3aXRob3V0IGNvbXBhY3Rpb24uCisJICovCisJZWxzZQorCQljb21wYWN0ID0gMDsKKwkvKgorCSAqIElmIGp1c3QgY2hlY2tpbmcsIHRoZW4gaXQgd2lsbCBmaXQgdW5sZXNzIHdlIG5lZWRlZCB0byBhbGxvY2F0ZQorCSAqIGEgbmV3IGRhdGEgYmxvY2suCisJICovCisJaWYgKGFyZ3MtPmp1c3RjaGVjaykgeworCQl4ZnNfZGFfYnJlbHNlKHRwLCBsYnApOworCQlyZXR1cm4gdXNlX2Jsb2NrID09IC0xID8gWEZTX0VSUk9SKEVOT1NQQykgOiAwOworCX0KKwkvKgorCSAqIElmIG5vIGFsbG9jYXRpb25zIGFyZSBhbGxvd2VkLCByZXR1cm4gbm93IGJlZm9yZSB3ZSd2ZQorCSAqIGNoYW5nZWQgYW55dGhpbmcuCisJICovCisJaWYgKGFyZ3MtPnRvdGFsID09IDAgJiYgdXNlX2Jsb2NrID09IC0xKSB7CisJCXhmc19kYV9icmVsc2UodHAsIGxicCk7CisJCXJldHVybiBYRlNfRVJST1IoRU5PU1BDKTsKKwl9CisJLyoKKwkgKiBOZWVkIHRvIGNvbXBhY3QgdGhlIGxlYWYgZW50cmllcywgcmVtb3Zpbmcgc3RhbGUgb25lcy4KKwkgKiBMZWF2ZSBvbmUgc3RhbGUgZW50cnkgYmVoaW5kIC0gdGhlIG9uZSBjbG9zZXN0IHRvIG91cgorCSAqIGluc2VydGlvbiBpbmRleCAtIGFuZCB3ZSdsbCBzaGlmdCB0aGF0IG9uZSB0byBvdXIgaW5zZXJ0aW9uCisJICogcG9pbnQgbGF0ZXIuCisJICovCisJaWYgKGNvbXBhY3QpIHsKKwkJeGZzX2RpcjJfbGVhZl9jb21wYWN0X3gxKGxicCwgJmluZGV4LCAmbG93c3RhbGUsICZoaWdoc3RhbGUsCisJCQkmbGZsb2dsb3csICZsZmxvZ2hpZ2gpOworCX0KKwkvKgorCSAqIFRoZXJlIGFyZSBzdGFsZSBlbnRyaWVzLCBzbyB3ZSdsbCBuZWVkIGxvZy1sb3cgYW5kIGxvZy1oaWdoCisJICogaW1wb3NzaWJseSBiYWQgdmFsdWVzIGxhdGVyLgorCSAqLworCWVsc2UgaWYgKElOVF9HRVQobGVhZi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQpKSB7CisJCWxmbG9nbG93ID0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCWxmbG9naGlnaCA9IC0xOworCX0KKwkvKgorCSAqIElmIHRoZXJlIHdhcyBubyBkYXRhIGJsb2NrIHNwYWNlIGZvdW5kLCB3ZSBuZWVkIHRvIGFsbG9jYXRlCisJICogYSBuZXcgb25lLgorCSAqLworCWlmICh1c2VfYmxvY2sgPT0gLTEpIHsKKwkJLyoKKwkJICogQWRkIHRoZSBuZXcgZGF0YSBibG9jay4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfZGlyMl9ncm93X2lub2RlKGFyZ3MsIFhGU19ESVIyX0RBVEFfU1BBQ0UsCisJCQkJJnVzZV9ibG9jaykpKSB7CisJCQl4ZnNfZGFfYnJlbHNlKHRwLCBsYnApOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCS8qCisJCSAqIEluaXRpYWxpemUgdGhlIGJsb2NrLgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19kaXIyX2RhdGFfaW5pdChhcmdzLCB1c2VfYmxvY2ssICZkYnApKSkgeworCQkJeGZzX2RhX2JyZWxzZSh0cCwgbGJwKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQkvKgorCQkgKiBJZiB3ZSdyZSBhZGRpbmcgYSBuZXcgZGF0YSBibG9jayBvbiB0aGUgZW5kIHdlIG5lZWQgdG8KKwkJICogZXh0ZW5kIHRoZSBiZXN0cyB0YWJsZS4gIENvcHkgaXQgdXAgb25lIGVudHJ5LgorCQkgKi8KKwkJaWYgKHVzZV9ibG9jayA+PSBJTlRfR0VUKGx0cC0+YmVzdGNvdW50LCBBUkNIX0NPTlZFUlQpKSB7CisJCQliZXN0c3AtLTsKKwkJCW1lbW1vdmUoJmJlc3RzcFswXSwgJmJlc3RzcFsxXSwKKwkJCQlJTlRfR0VUKGx0cC0+YmVzdGNvdW50LCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKGJlc3RzcFswXSkpOworCQkJSU5UX01PRChsdHAtPmJlc3Rjb3VudCwgQVJDSF9DT05WRVJULCArMSk7CisJCQl4ZnNfZGlyMl9sZWFmX2xvZ190YWlsKHRwLCBsYnApOworCQkJeGZzX2RpcjJfbGVhZl9sb2dfYmVzdHModHAsIGxicCwgMCwgSU5UX0dFVChsdHAtPmJlc3Rjb3VudCwgQVJDSF9DT05WRVJUKSAtIDEpOworCQl9CisJCS8qCisJCSAqIElmIHdlJ3JlIGZpbGxpbmcgaW4gYSBwcmV2aW91c2x5IGVtcHR5IGJsb2NrIGp1c3QgbG9nIGl0LgorCQkgKi8KKwkJZWxzZQorCQkJeGZzX2RpcjJfbGVhZl9sb2dfYmVzdHModHAsIGxicCwgdXNlX2Jsb2NrLCB1c2VfYmxvY2spOworCQlkYXRhID0gZGJwLT5kYXRhOworCQlJTlRfQ09QWShiZXN0c3BbdXNlX2Jsb2NrXSwgZGF0YS0+aGRyLmJlc3RmcmVlWzBdLmxlbmd0aCwgQVJDSF9DT05WRVJUKTsKKwkJZ3Jvd24gPSAxOworCX0KKwkvKgorCSAqIEFscmVhZHkgaGFkIHNwYWNlIGluIHNvbWUgZGF0YSBibG9jay4KKwkgKiBKdXN0IHJlYWQgdGhhdCBvbmUgaW4uCisJICovCisJZWxzZSB7CisJCWlmICgoZXJyb3IgPQorCQkgICAgeGZzX2RhX3JlYWRfYnVmKHRwLCBkcCwgWEZTX0RJUjJfREJfVE9fREEobXAsIHVzZV9ibG9jayksCisJCQkgICAgLTEsICZkYnAsIFhGU19EQVRBX0ZPUkspKSkgeworCQkJeGZzX2RhX2JyZWxzZSh0cCwgbGJwKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlkYXRhID0gZGJwLT5kYXRhOworCQlncm93biA9IDA7CisJfQorCXhmc19kaXIyX2RhdGFfY2hlY2soZHAsIGRicCk7CisJLyoKKwkgKiBQb2ludCB0byB0aGUgYmlnZ2VzdCBmcmVlc3BhY2UgaW4gb3VyIGRhdGEgYmxvY2suCisJICovCisJZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikKKwkgICAgICAoKGNoYXIgKilkYXRhICsgSU5UX0dFVChkYXRhLT5oZHIuYmVzdGZyZWVbMF0ub2Zmc2V0LCBBUkNIX0NPTlZFUlQpKTsKKwlBU1NFUlQoSU5UX0dFVChkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKSA+PSBsZW5ndGgpOworCW5lZWRzY2FuID0gbmVlZGxvZyA9IDA7CisJLyoKKwkgKiBNYXJrIHRoZSBpbml0aWFsIHBhcnQgb2Ygb3VyIGZyZWVzcGFjZSBpbiB1c2UgZm9yIHRoZSBuZXcgZW50cnkuCisJICovCisJeGZzX2RpcjJfZGF0YV91c2VfZnJlZSh0cCwgZGJwLCBkdXAsCisJCSh4ZnNfZGlyMl9kYXRhX2FvZmZfdCkoKGNoYXIgKilkdXAgLSAoY2hhciAqKWRhdGEpLCBsZW5ndGgsCisJCSZuZWVkbG9nLCAmbmVlZHNjYW4pOworCS8qCisJICogSW5pdGlhbGl6ZSBvdXIgbmV3IGVudHJ5IChhdCBsYXN0KS4KKwkgKi8KKwlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopZHVwOworCUlOVF9TRVQoZGVwLT5pbnVtYmVyLCBBUkNIX0NPTlZFUlQsIGFyZ3MtPmludW1iZXIpOworCWRlcC0+bmFtZWxlbiA9IGFyZ3MtPm5hbWVsZW47CisJbWVtY3B5KGRlcC0+bmFtZSwgYXJncy0+bmFtZSwgZGVwLT5uYW1lbGVuKTsKKwl0YWdwID0gWEZTX0RJUjJfREFUQV9FTlRSWV9UQUdfUChkZXApOworCUlOVF9TRVQoKnRhZ3AsIEFSQ0hfQ09OVkVSVCwgKHhmc19kaXIyX2RhdGFfb2ZmX3QpKChjaGFyICopZGVwIC0gKGNoYXIgKilkYXRhKSk7CisJLyoKKwkgKiBOZWVkIHRvIHNjYW4gZml4IHVwIHRoZSBiZXN0ZnJlZSB0YWJsZS4KKwkgKi8KKwlpZiAobmVlZHNjYW4pCisJCXhmc19kaXIyX2RhdGFfZnJlZXNjYW4obXAsIGRhdGEsICZuZWVkbG9nLCBOVUxMKTsKKwkvKgorCSAqIE5lZWQgdG8gbG9nIHRoZSBkYXRhIGJsb2NrJ3MgaGVhZGVyLgorCSAqLworCWlmIChuZWVkbG9nKQorCQl4ZnNfZGlyMl9kYXRhX2xvZ19oZWFkZXIodHAsIGRicCk7CisJeGZzX2RpcjJfZGF0YV9sb2dfZW50cnkodHAsIGRicCwgZGVwKTsKKwkvKgorCSAqIElmIHRoZSBiZXN0cyB0YWJsZSBuZWVkcyB0byBiZSBjaGFuZ2VkLCBkbyBpdC4KKwkgKiBMb2cgdGhlIGNoYW5nZSB1bmxlc3Mgd2UndmUgYWxyZWFkeSBkb25lIHRoYXQuCisJICovCisJaWYgKElOVF9HRVQoYmVzdHNwW3VzZV9ibG9ja10sIEFSQ0hfQ09OVkVSVCkgIT0gSU5UX0dFVChkYXRhLT5oZHIuYmVzdGZyZWVbMF0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpKSB7CisJCUlOVF9DT1BZKGJlc3RzcFt1c2VfYmxvY2tdLCBkYXRhLT5oZHIuYmVzdGZyZWVbMF0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpOworCQlpZiAoIWdyb3duKQorCQkJeGZzX2RpcjJfbGVhZl9sb2dfYmVzdHModHAsIGxicCwgdXNlX2Jsb2NrLCB1c2VfYmxvY2spOworCX0KKwkvKgorCSAqIE5vdyB3ZSBuZWVkIHRvIG1ha2Ugcm9vbSB0byBpbnNlcnQgdGhlIGxlYWYgZW50cnkuCisJICogSWYgdGhlcmUgYXJlIG5vIHN0YWxlIGVudHJpZXMsIHdlIGp1c3QgaW5zZXJ0IGEgaG9sZSBhdCBpbmRleC4KKwkgKi8KKwlpZiAoIWxlYWYtPmhkci5zdGFsZSkgeworCQkvKgorCQkgKiBsZXAgaXMgc3RpbGwgZ29vZCBhcyB0aGUgaW5kZXggbGVhZiBlbnRyeS4KKwkJICovCisJCWlmIChpbmRleCA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKQorCQkJbWVtbW92ZShsZXAgKyAxLCBsZXAsCisJCQkJKElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gaW5kZXgpICogc2l6ZW9mKCpsZXApKTsKKwkJLyoKKwkJICogUmVjb3JkIGxvdyBhbmQgaGlnaCBsb2dnaW5nIGluZGljZXMgZm9yIHRoZSBsZWFmLgorCQkgKi8KKwkJbGZsb2dsb3cgPSBpbmRleDsKKwkJbGZsb2doaWdoID0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCUlOVF9NT0QobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQsICsxKTsKKwl9CisJLyoKKwkgKiBUaGVyZSBhcmUgc3RhbGUgZW50cmllcy4KKwkgKiBXZSB3aWxsIHVzZSBvbmUgb2YgdGhlbSBmb3IgdGhlIG5ldyBlbnRyeS4KKwkgKiBJdCdzIHByb2JhYmx5IG5vdCBhdCB0aGUgcmlnaHQgbG9jYXRpb24sIHNvIHdlJ2xsIGhhdmUgdG8KKwkgKiBzaGlmdCBzb21lIHVwIG9yIGRvd24gZmlyc3QuCisJICovCisJZWxzZSB7CisJCS8qCisJCSAqIElmIHdlIGRpZG4ndCBjb21wYWN0IGJlZm9yZSwgd2UgbmVlZCB0byBmaW5kIHRoZSBuZWFyZXN0CisJCSAqIHN0YWxlIGVudHJpZXMgYmVmb3JlIGFuZCBhZnRlciBvdXIgaW5zZXJ0aW9uIHBvaW50LgorCQkgKi8KKwkJaWYgKGNvbXBhY3QgPT0gMCkgeworCQkJLyoKKwkJCSAqIEZpbmQgdGhlIGZpcnN0IHN0YWxlIGVudHJ5IGJlZm9yZSB0aGUgaW5zZXJ0aW9uCisJCQkgKiBwb2ludCwgaWYgYW55LgorCQkJICovCisJCQlmb3IgKGxvd3N0YWxlID0gaW5kZXggLSAxOworCQkJICAgICBsb3dzdGFsZSA+PSAwICYmCisJCQkJSU5UX0dFVChsZWFmLT5lbnRzW2xvd3N0YWxlXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpICE9CisJCQkJWEZTX0RJUjJfTlVMTF9EQVRBUFRSOworCQkJICAgICBsb3dzdGFsZS0tKQorCQkJCWNvbnRpbnVlOworCQkJLyoKKwkJCSAqIEZpbmQgdGhlIG5leHQgc3RhbGUgZW50cnkgYXQgb3IgYWZ0ZXIgdGhlIGluc2VydGlvbgorCQkJICogcG9pbnQsIGlmIGFueS4gICBTdG9wIGlmIHdlIGdvIHNvIGZhciB0aGF0IHRoZQorCQkJICogbG93c3RhbGUgZW50cnkgd291bGQgYmUgYmV0dGVyLgorCQkJICovCisJCQlmb3IgKGhpZ2hzdGFsZSA9IGluZGV4OworCQkJICAgICBoaWdoc3RhbGUgPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAmJgorCQkJCUlOVF9HRVQobGVhZi0+ZW50c1toaWdoc3RhbGVdLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkgIT0KKwkJCQlYRlNfRElSMl9OVUxMX0RBVEFQVFIgJiYKKwkJCQkobG93c3RhbGUgPCAwIHx8CisJCQkJIGluZGV4IC0gbG93c3RhbGUgLSAxID49IGhpZ2hzdGFsZSAtIGluZGV4KTsKKwkJCSAgICAgaGlnaHN0YWxlKyspCisJCQkJY29udGludWU7CisJCX0KKwkJLyoKKwkJICogSWYgdGhlIGxvdyBvbmUgaXMgYmV0dGVyLCB1c2UgaXQuCisJCSAqLworCQlpZiAobG93c3RhbGUgPj0gMCAmJgorCQkgICAgKGhpZ2hzdGFsZSA9PSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSB8fAorCQkgICAgIGluZGV4IC0gbG93c3RhbGUgLSAxIDwgaGlnaHN0YWxlIC0gaW5kZXgpKSB7CisJCQlBU1NFUlQoaW5kZXggLSBsb3dzdGFsZSAtIDEgPj0gMCk7CisJCQlBU1NFUlQoSU5UX0dFVChsZWFmLT5lbnRzW2xvd3N0YWxlXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpID09CisJCQkgICAgICAgWEZTX0RJUjJfTlVMTF9EQVRBUFRSKTsKKwkJCS8qCisJCQkgKiBDb3B5IGVudHJpZXMgdXAgdG8gY292ZXIgdGhlIHN0YWxlIGVudHJ5CisJCQkgKiBhbmQgbWFrZSByb29tIGZvciB0aGUgbmV3IGVudHJ5LgorCQkJICovCisJCQlpZiAoaW5kZXggLSBsb3dzdGFsZSAtIDEgPiAwKQorCQkJCW1lbW1vdmUoJmxlYWYtPmVudHNbbG93c3RhbGVdLAorCQkJCQkmbGVhZi0+ZW50c1tsb3dzdGFsZSArIDFdLAorCQkJCQkoaW5kZXggLSBsb3dzdGFsZSAtIDEpICogc2l6ZW9mKCpsZXApKTsKKwkJCWxlcCA9ICZsZWFmLT5lbnRzW2luZGV4IC0gMV07CisJCQlsZmxvZ2xvdyA9IE1JTihsb3dzdGFsZSwgbGZsb2dsb3cpOworCQkJbGZsb2doaWdoID0gTUFYKGluZGV4IC0gMSwgbGZsb2doaWdoKTsKKwkJfQorCQkvKgorCQkgKiBUaGUgaGlnaCBvbmUgaXMgYmV0dGVyLCBzbyB1c2UgdGhhdCBvbmUuCisJCSAqLworCQllbHNlIHsKKwkJCUFTU0VSVChoaWdoc3RhbGUgLSBpbmRleCA+PSAwKTsKKwkJCUFTU0VSVChJTlRfR0VUKGxlYWYtPmVudHNbaGlnaHN0YWxlXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpID09CisJCQkgICAgICAgWEZTX0RJUjJfTlVMTF9EQVRBUFRSKTsKKwkJCS8qCisJCQkgKiBDb3B5IGVudHJpZXMgZG93biB0byBjb3B2ZXIgdGhlIHN0YWxlIGVudHJ5CisJCQkgKiBhbmQgbWFrZSByb29tIGZvciB0aGUgbmV3IGVudHJ5LgorCQkJICovCisJCQlpZiAoaGlnaHN0YWxlIC0gaW5kZXggPiAwKQorCQkJCW1lbW1vdmUoJmxlYWYtPmVudHNbaW5kZXggKyAxXSwKKwkJCQkJJmxlYWYtPmVudHNbaW5kZXhdLAorCQkJCQkoaGlnaHN0YWxlIC0gaW5kZXgpICogc2l6ZW9mKCpsZXApKTsKKwkJCWxlcCA9ICZsZWFmLT5lbnRzW2luZGV4XTsKKwkJCWxmbG9nbG93ID0gTUlOKGluZGV4LCBsZmxvZ2xvdyk7CisJCQlsZmxvZ2hpZ2ggPSBNQVgoaGlnaHN0YWxlLCBsZmxvZ2hpZ2gpOworCQl9CisJCUlOVF9NT0QobGVhZi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQsIC0xKTsKKwl9CisJLyoKKwkgKiBGaWxsIGluIHRoZSBuZXcgbGVhZiBlbnRyeS4KKwkgKi8KKwlJTlRfU0VUKGxlcC0+aGFzaHZhbCwgQVJDSF9DT05WRVJULCBhcmdzLT5oYXNodmFsKTsKKwlJTlRfU0VUKGxlcC0+YWRkcmVzcywgQVJDSF9DT05WRVJULCBYRlNfRElSMl9EQl9PRkZfVE9fREFUQVBUUihtcCwgdXNlX2Jsb2NrLCBJTlRfR0VUKCp0YWdwLCBBUkNIX0NPTlZFUlQpKSk7CisJLyoKKwkgKiBMb2cgdGhlIGxlYWYgZmllbGRzIGFuZCBnaXZlIHVwIHRoZSBidWZmZXJzLgorCSAqLworCXhmc19kaXIyX2xlYWZfbG9nX2hlYWRlcih0cCwgbGJwKTsKKwl4ZnNfZGlyMl9sZWFmX2xvZ19lbnRzKHRwLCBsYnAsIGxmbG9nbG93LCBsZmxvZ2hpZ2gpOworCXhmc19kaXIyX2xlYWZfY2hlY2soZHAsIGxicCk7CisJeGZzX2RhX2J1Zl9kb25lKGxicCk7CisJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCwgZGJwKTsKKwl4ZnNfZGFfYnVmX2RvbmUoZGJwKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIERFQlVHCisvKgorICogQ2hlY2sgdGhlIGludGVybmFsIGNvbnNpc3RlbmN5IG9mIGEgbGVhZjEgYmxvY2suCisgKiBQb3AgYW4gYXNzZXJ0IGlmIHNvbWV0aGluZyBpcyB3cm9uZy4KKyAqLwordm9pZAoreGZzX2RpcjJfbGVhZl9jaGVjaygKKwl4ZnNfaW5vZGVfdAkJKmRwLAkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCXhmc19kYWJ1Zl90CQkqYnApCQkvKiBsZWFmJ3MgYnVmZmVyICovCit7CisJaW50CQkJaTsJCS8qIGxlYWYgaW5kZXggKi8KKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX3RhaWxfdAkqbHRwOwkJLyogbGVhZiB0YWlsIHBvaW50ZXIgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCWludAkJCXN0YWxlOwkJLyogY291bnQgb2Ygc3RhbGUgbGVhdmVzICovCisKKwlsZWFmID0gYnAtPmRhdGE7CisJbXAgPSBkcC0+aV9tb3VudDsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9MRUFGMV9NQUdJQyk7CisJLyoKKwkgKiBUaGlzIHZhbHVlIGlzIG5vdCByZXN0cmljdGl2ZSBlbm91Z2guCisJICogU2hvdWxkIGZhY3RvciBpbiB0aGUgc2l6ZSBvZiB0aGUgYmVzdHMgdGFibGUgYXMgd2VsbC4KKwkgKiBXZSBjYW4gZGVkdWNlIGEgdmFsdWUgZm9yIHRoYXQgZnJvbSBkaV9zaXplLgorCSAqLworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSA8PSBYRlNfRElSMl9NQVhfTEVBRl9FTlRTKG1wKSk7CisJbHRwID0gWEZTX0RJUjJfTEVBRl9UQUlMX1AobXAsIGxlYWYpOworCS8qCisJICogTGVhdmVzIGFuZCBiZXN0cyBkb24ndCBvdmVybGFwLgorCSAqLworCUFTU0VSVCgoY2hhciAqKSZsZWFmLT5lbnRzW0lOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpXSA8PQorCSAgICAgICAoY2hhciAqKVhGU19ESVIyX0xFQUZfQkVTVFNfUChsdHApKTsKKwkvKgorCSAqIENoZWNrIGhhc2ggdmFsdWUgb3JkZXIsIGNvdW50IHN0YWxlIGVudHJpZXMuCisJICovCisJZm9yIChpID0gc3RhbGUgPSAwOyBpIDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7IGkrKykgeworCQlpZiAoaSArIDEgPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkKKwkJCUFTU0VSVChJTlRfR0VUKGxlYWYtPmVudHNbaV0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSA8PQorCQkJICAgICAgIElOVF9HRVQobGVhZi0+ZW50c1tpICsgMV0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSk7CisJCWlmIChJTlRfR0VUKGxlYWYtPmVudHNbaV0uYWRkcmVzcywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9OVUxMX0RBVEFQVFIpCisJCQlzdGFsZSsrOworCX0KKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuc3RhbGUsIEFSQ0hfQ09OVkVSVCkgPT0gc3RhbGUpOworfQorI2VuZGlmCS8qIERFQlVHICovCisKKy8qCisgKiBDb21wYWN0IG91dCBhbnkgc3RhbGUgZW50cmllcyBpbiB0aGUgbGVhZi4KKyAqIExvZyB0aGUgaGVhZGVyIGFuZCBjaGFuZ2VkIGxlYWYgZW50cmllcywgaWYgYW55LgorICovCit2b2lkCit4ZnNfZGlyMl9sZWFmX2NvbXBhY3QoCisJeGZzX2RhX2FyZ3NfdAkqYXJncywJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfZGFidWZfdAkqYnApCQkvKiBsZWFmIGJ1ZmZlciAqLworeworCWludAkJZnJvbTsJCS8qIHNvdXJjZSBsZWFmIGluZGV4ICovCisJeGZzX2RpcjJfbGVhZl90CSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKwlpbnQJCWxvZ2xvdzsJCS8qIGZpcnN0IGxlYWYgZW50cnkgdG8gbG9nICovCisJaW50CQl0bzsJCS8qIHRhcmdldCBsZWFmIGluZGV4ICovCisKKwlsZWFmID0gYnAtPmRhdGE7CisJaWYgKCFsZWFmLT5oZHIuc3RhbGUpIHsKKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIENvbXByZXNzIG91dCB0aGUgc3RhbGUgZW50cmllcyBpbiBwbGFjZS4KKwkgKi8KKwlmb3IgKGZyb20gPSB0byA9IDAsIGxvZ2xvdyA9IC0xOyBmcm9tIDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7IGZyb20rKykgeworCQlpZiAoSU5UX0dFVChsZWFmLT5lbnRzW2Zyb21dLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTlVMTF9EQVRBUFRSKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIE9ubHkgYWN0dWFsbHkgY29weSB0aGUgZW50cmllcyB0aGF0IGFyZSBkaWZmZXJlbnQuCisJCSAqLworCQlpZiAoZnJvbSA+IHRvKSB7CisJCQlpZiAobG9nbG93ID09IC0xKQorCQkJCWxvZ2xvdyA9IHRvOworCQkJbGVhZi0+ZW50c1t0b10gPSBsZWFmLT5lbnRzW2Zyb21dOworCQl9CisJCXRvKys7CisJfQorCS8qCisJICogVXBkYXRlIGFuZCBsb2cgdGhlIGhlYWRlciwgbG9nIHRoZSBsZWFmIGVudHJpZXMuCisJICovCisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQpID09IGZyb20gLSB0byk7CisJSU5UX01PRChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCwgLShJTlRfR0VUKGxlYWYtPmhkci5zdGFsZSwgQVJDSF9DT05WRVJUKSkpOworCWxlYWYtPmhkci5zdGFsZSA9IDA7CisJeGZzX2RpcjJfbGVhZl9sb2dfaGVhZGVyKGFyZ3MtPnRyYW5zLCBicCk7CisJaWYgKGxvZ2xvdyAhPSAtMSkKKwkJeGZzX2RpcjJfbGVhZl9sb2dfZW50cyhhcmdzLT50cmFucywgYnAsIGxvZ2xvdywgdG8gLSAxKTsKK30KKworLyoKKyAqIENvbXBhY3QgdGhlIGxlYWYgZW50cmllcywgcmVtb3Zpbmcgc3RhbGUgb25lcy4KKyAqIExlYXZlIG9uZSBzdGFsZSBlbnRyeSBiZWhpbmQgLSB0aGUgb25lIGNsb3Nlc3QgdG8gb3VyCisgKiBpbnNlcnRpb24gaW5kZXggLSBhbmQgdGhlIGNhbGxlciB3aWxsIHNoaWZ0IHRoYXQgb25lIHRvIG91ciBpbnNlcnRpb24KKyAqIHBvaW50IGxhdGVyLgorICogUmV0dXJuIG5ldyBpbnNlcnRpb24gaW5kZXgsIHdoZXJlIHRoZSByZW1haW5pbmcgc3RhbGUgZW50cnkgaXMsCisgKiBhbmQgbGVhZiBsb2dnaW5nIGluZGljZXMuCisgKi8KK3ZvaWQKK3hmc19kaXIyX2xlYWZfY29tcGFjdF94MSgKKwl4ZnNfZGFidWZfdAkqYnAsCQkvKiBsZWFmIGJ1ZmZlciAqLworCWludAkJKmluZGV4cCwJLyogaW5zZXJ0aW9uIGluZGV4ICovCisJaW50CQkqbG93c3RhbGVwLAkvKiBvdXQ6IHN0YWxlIGVudHJ5IGJlZm9yZSB1cyAqLworCWludAkJKmhpZ2hzdGFsZXAsCS8qIG91dDogc3RhbGUgZW50cnkgYWZ0ZXIgdXMgKi8KKwlpbnQJCSpsb3dsb2dwLAkvKiBvdXQ6IGxvdyBsb2cgaW5kZXggKi8KKwlpbnQJCSpoaWdobG9ncCkJLyogb3V0OiBoaWdoIGxvZyBpbmRleCAqLworeworCWludAkJZnJvbTsJCS8qIHNvdXJjZSBjb3B5IGluZGV4ICovCisJaW50CQloaWdoc3RhbGU7CS8qIHN0YWxlIGVudHJ5IGF0L2FmdGVyIGluZGV4ICovCisJaW50CQlpbmRleDsJCS8qIGluc2VydGlvbiBpbmRleCAqLworCWludAkJa2VlcHN0YWxlOwkvKiBzb3VyY2UgaW5kZXggb2Yga2VwdCBzdGFsZSAqLworCXhmc19kaXIyX2xlYWZfdAkqbGVhZjsJCS8qIGxlYWYgc3RydWN0dXJlICovCisJaW50CQlsb3dzdGFsZTsJLyogc3RhbGUgZW50cnkgYmVmb3JlIGluZGV4ICovCisJaW50CQluZXdpbmRleD0wOwkvKiBuZXcgaW5zZXJ0aW9uIGluZGV4ICovCisJaW50CQl0bzsJCS8qIGRlc3RpbmF0aW9uIGNvcHkgaW5kZXggKi8KKworCWxlYWYgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuc3RhbGUsIEFSQ0hfQ09OVkVSVCkgPiAxKTsKKwlpbmRleCA9ICppbmRleHA7CisJLyoKKwkgKiBGaW5kIHRoZSBmaXJzdCBzdGFsZSBlbnRyeSBiZWZvcmUgb3VyIGluZGV4LCBpZiBhbnkuCisJICovCisJZm9yIChsb3dzdGFsZSA9IGluZGV4IC0gMTsKKwkgICAgIGxvd3N0YWxlID49IDAgJiYKKwkJSU5UX0dFVChsZWFmLT5lbnRzW2xvd3N0YWxlXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpICE9IFhGU19ESVIyX05VTExfREFUQVBUUjsKKwkgICAgIGxvd3N0YWxlLS0pCisJCWNvbnRpbnVlOworCS8qCisJICogRmluZCB0aGUgZmlyc3Qgc3RhbGUgZW50cnkgYXQgb3IgYWZ0ZXIgb3VyIGluZGV4LCBpZiBhbnkuCisJICogU3RvcCBpZiB0aGUgYW5zd2VyIHdvdWxkIGJlIHdvcnNlIHRoYW4gbG93c3RhbGUuCisJICovCisJZm9yIChoaWdoc3RhbGUgPSBpbmRleDsKKwkgICAgIGhpZ2hzdGFsZSA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpICYmCisJCUlOVF9HRVQobGVhZi0+ZW50c1toaWdoc3RhbGVdLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RJUjJfTlVMTF9EQVRBUFRSICYmCisJCShsb3dzdGFsZSA8IDAgfHwgaW5kZXggLSBsb3dzdGFsZSA+IGhpZ2hzdGFsZSAtIGluZGV4KTsKKwkgICAgIGhpZ2hzdGFsZSsrKQorCQljb250aW51ZTsKKwkvKgorCSAqIFBpY2sgdGhlIGJldHRlciBvZiBsb3dzdGFsZSBhbmQgaGlnaHN0YWxlLgorCSAqLworCWlmIChsb3dzdGFsZSA+PSAwICYmCisJICAgIChoaWdoc3RhbGUgPT0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgfHwKKwkgICAgIGluZGV4IC0gbG93c3RhbGUgPD0gaGlnaHN0YWxlIC0gaW5kZXgpKQorCQlrZWVwc3RhbGUgPSBsb3dzdGFsZTsKKwllbHNlCisJCWtlZXBzdGFsZSA9IGhpZ2hzdGFsZTsKKwkvKgorCSAqIENvcHkgdGhlIGVudHJpZXMgaW4gcGxhY2UsIHJlbW92aW5nIGFsbCB0aGUgc3RhbGUgZW50cmllcworCSAqIGV4Y2VwdCBrZWVwc3RhbGUuCisJICovCisJZm9yIChmcm9tID0gdG8gPSAwOyBmcm9tIDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7IGZyb20rKykgeworCQkvKgorCQkgKiBOb3RpY2UgdGhlIG5ldyB2YWx1ZSBvZiBpbmRleC4KKwkJICovCisJCWlmIChpbmRleCA9PSBmcm9tKQorCQkJbmV3aW5kZXggPSB0bzsKKwkJaWYgKGZyb20gIT0ga2VlcHN0YWxlICYmCisJCSAgICBJTlRfR0VUKGxlYWYtPmVudHNbZnJvbV0uYWRkcmVzcywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9OVUxMX0RBVEFQVFIpIHsKKwkJCWlmIChmcm9tID09IHRvKQorCQkJCSpsb3dsb2dwID0gdG87CisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBSZWNvcmQgdGhlIG5ldyBrZWVwc3RhbGUgdmFsdWUgZm9yIHRoZSBpbnNlcnRpb24uCisJCSAqLworCQlpZiAoZnJvbSA9PSBrZWVwc3RhbGUpCisJCQlsb3dzdGFsZSA9IGhpZ2hzdGFsZSA9IHRvOworCQkvKgorCQkgKiBDb3B5IG9ubHkgdGhlIGVudHJpZXMgdGhhdCBoYXZlIG1vdmVkLgorCQkgKi8KKwkJaWYgKGZyb20gPiB0bykKKwkJCWxlYWYtPmVudHNbdG9dID0gbGVhZi0+ZW50c1tmcm9tXTsKKwkJdG8rKzsKKwl9CisJQVNTRVJUKGZyb20gPiB0byk7CisJLyoKKwkgKiBJZiB0aGUgaW5zZXJ0aW9uIHBvaW50IHdhcyBwYXN0IHRoZSBsYXN0IGVudHJ5LAorCSAqIHNldCB0aGUgbmV3IGluc2VydGlvbiBwb2ludCBhY2NvcmRpbmdseS4KKwkgKi8KKwlpZiAoaW5kZXggPT0gZnJvbSkKKwkJbmV3aW5kZXggPSB0bzsKKwkqaW5kZXhwID0gbmV3aW5kZXg7CisJLyoKKwkgKiBBZGp1c3QgdGhlIGxlYWYgaGVhZGVyIHZhbHVlcy4KKwkgKi8KKwlJTlRfTU9EKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJULCAtKGZyb20gLSB0bykpOworCUlOVF9TRVQobGVhZi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQsIDEpOworCS8qCisJICogUmVtZW1iZXIgdGhlIGxvdy9oaWdoIHN0YWxlIHZhbHVlIG9ubHkgaW4gdGhlICJyaWdodCIKKwkgKiBkaXJlY3Rpb24uCisJICovCisJaWYgKGxvd3N0YWxlID49IG5ld2luZGV4KQorCQlsb3dzdGFsZSA9IC0xOworCWVsc2UKKwkJaGlnaHN0YWxlID0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJKmhpZ2hsb2dwID0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxOworCSpsb3dzdGFsZXAgPSBsb3dzdGFsZTsKKwkqaGlnaHN0YWxlcCA9IGhpZ2hzdGFsZTsKK30KKworLyoKKyAqIEdldGRlbnRzIChyZWFkZGlyKSBmb3IgbGVhZiBhbmQgbm9kZSBkaXJlY3Rvcmllcy4KKyAqIFRoaXMgcmVhZHMgdGhlIGRhdGEgYmxvY2tzIG9ubHksIHNvIGlzIHRoZSBzYW1lIGZvciBib3RoIGZvcm1zLgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfbGVhZl9nZXRkZW50cygKKwl4ZnNfdHJhbnNfdAkJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9kZV90CQkqZHAsCQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJdWlvX3QJCQkqdWlvLAkJLyogSS9PIGNvbnRyb2wgJiB2ZWN0b3JzICovCisJaW50CQkJKmVvZnAsCQkvKiBvdXQ6IHJlYWNoZWQgZW5kIG9mIGRpciAqLworCXhmc19kaXJlbnRfdAkJKmRicCwJCS8qIGNhbGxlcidzIGJ1ZmZlciAqLworCXhmc19kaXIyX3B1dF90CQlwdXQpCQkvKiBBQkkgZm9ybWF0dGluZyByb3V0aW5lICovCit7CisJeGZzX2RhYnVmX3QJCSpicDsJCS8qIGRhdGEgYmxvY2sgYnVmZmVyICovCisJaW50CQkJYnl0ZW9mZjsJLyogb2Zmc2V0IGluIGN1cnJlbnQgYmxvY2sgKi8KKwl4ZnNfZGlyMl9kYl90CQljdXJkYjsJCS8qIGRiIGZvciBjdXJyZW50IGJsb2NrICovCisJeGZzX2RpcjJfb2ZmX3QJCWN1cm9mZjsJCS8qIGN1cnJlbnQgb3ZlcmFsbCBvZmZzZXQgKi8KKwl4ZnNfZGlyMl9kYXRhX3QJCSpkYXRhOwkJLyogZGF0YSBibG9jayBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9kYXRhX2VudHJ5X3QJKmRlcDsJCS8qIGRhdGEgZW50cnkgKi8KKwl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CSpkdXA7CQkvKiB1bnVzZWQgZW50cnkgKi8KKwlpbnQJCQllb2Y7CQkvKiByZWFjaGVkIGVuZCBvZiBkaXJlY3RvcnkgKi8KKwlpbnQJCQllcnJvcj0wOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQkJaTsJCS8qIHRlbXBvcmFyeSBsb29wIGluZGV4ICovCisJaW50CQkJajsJCS8qIHRlbXBvcmFyeSBsb29wIGluZGV4ICovCisJaW50CQkJbGVuZ3RoOwkJLyogdGVtcG9yYXJ5IGxlbmd0aCB2YWx1ZSAqLworCXhmc19ibWJ0X2lyZWNfdAkJKm1hcDsJCS8qIG1hcCB2ZWN0b3IgZm9yIGJsb2NrcyAqLworCXhmc19leHRsZW5fdAkJbWFwX2Jsb2NrczsJLyogbnVtYmVyIG9mIGZzYnMgaW4gbWFwICovCisJeGZzX2RhYmxrX3QJCW1hcF9vZmY7CS8qIGxhc3QgbWFwcGVkIGZpbGUgb2Zmc2V0ICovCisJaW50CQkJbWFwX3NpemU7CS8qIHRvdGFsIGVudHJpZXMgaW4gKm1hcCAqLworCWludAkJCW1hcF92YWxpZDsJLyogdmFsaWQgZW50cmllcyBpbiAqbWFwICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfZGlyMl9vZmZfdAkJbmV3b2ZmOwkJLyogbmV3IGN1cm9mZiBhZnRlciBuZXcgYmxrICovCisJaW50CQkJbm1hcDsJCS8qIG1hcHBpbmdzIHRvIGFzayB4ZnNfYm1hcGkgKi8KKwl4ZnNfZGlyMl9wdXRfYXJnc190CXA7CQkvKiBmb3JtYXR0aW5nIGFyZyBidW5kbGUgKi8KKwljaGFyCQkJKnB0cj1OVUxMOwkJLyogcG9pbnRlciB0byBjdXJyZW50IGRhdGEgKi8KKwlpbnQJCQlyYV9jdXJyZW50OwkvKiBudW1iZXIgb2YgcmVhZC1haGVhZCBibGtzICovCisJaW50CQkJcmFfaW5kZXg7CS8qICptYXAgaW5kZXggZm9yIHJlYWQtYWhlYWQgKi8KKwlpbnQJCQlyYV9vZmZzZXQ7CS8qIG1hcCBlbnRyeSBvZmZzZXQgZm9yIHJhICovCisJaW50CQkJcmFfd2FudDsJLyogcmVhZGFoZWFkIGNvdW50IHdhbnRlZCAqLworCisJLyoKKwkgKiBJZiB0aGUgb2Zmc2V0IGlzIGF0IG9yIHBhc3QgdGhlIGxhcmdlc3QgYWxsb3dlZCB2YWx1ZSwKKwkgKiBnaXZlIHVwIHJpZ2h0IGF3YXksIHJldHVybiBlb2YuCisJICovCisJaWYgKHVpby0+dWlvX29mZnNldCA+PSBYRlNfRElSMl9NQVhfREFUQVBUUikgeworCQkqZW9mcCA9IDE7CisJCXJldHVybiAwOworCX0KKwltcCA9IGRwLT5pX21vdW50OworCS8qCisJICogU2V0dXAgZm9ybWF0dGluZyBhcmd1bWVudHMuCisJICovCisJcC5kYnAgPSBkYnA7CisJcC5wdXQgPSBwdXQ7CisJcC51aW8gPSB1aW87CisJLyoKKwkgKiBTZXQgdXAgdG8gYm1hcCBhIG51bWJlciBvZiBibG9ja3MgYmFzZWQgb24gdGhlIGNhbGxlcidzCisJICogYnVmZmVyIHNpemUsIHRoZSBkaXJlY3RvcnkgYmxvY2sgc2l6ZSwgYW5kIHRoZSBmaWxlc3lzdGVtCisJICogYmxvY2sgc2l6ZS4KKwkgKi8KKwltYXBfc2l6ZSA9CisJCWhvd21hbnkodWlvLT51aW9fcmVzaWQgKyBtcC0+bV9kaXJibGtzaXplLAorCQkJbXAtPm1fc2Iuc2JfYmxvY2tzaXplKTsKKwltYXAgPSBrbWVtX2FsbG9jKG1hcF9zaXplICogc2l6ZW9mKCptYXApLCBLTV9TTEVFUCk7CisJbWFwX3ZhbGlkID0gcmFfaW5kZXggPSByYV9vZmZzZXQgPSByYV9jdXJyZW50ID0gbWFwX2Jsb2NrcyA9IDA7CisJYnAgPSBOVUxMOworCWVvZiA9IDE7CisJLyoKKwkgKiBJbnNpZGUgdGhlIGxvb3Agd2Uga2VlcCB0aGUgbWFpbiBvZmZzZXQgdmFsdWUgYXMgYSBieXRlIG9mZnNldAorCSAqIGluIHRoZSBkaXJlY3RvcnkgZmlsZS4KKwkgKi8KKwljdXJvZmYgPSBYRlNfRElSMl9EQVRBUFRSX1RPX0JZVEUobXAsIHVpby0+dWlvX29mZnNldCk7CisJLyoKKwkgKiBGb3JjZSB0aGlzIGNvbnZlcnNpb24gdGhyb3VnaCBkYiBzbyB3ZSB0cnVuY2F0ZSB0aGUgb2Zmc2V0CisJICogZG93biB0byBnZXQgdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIGJsb2NrLgorCSAqLworCW1hcF9vZmYgPSBYRlNfRElSMl9EQl9UT19EQShtcCwgWEZTX0RJUjJfQllURV9UT19EQihtcCwgY3Vyb2ZmKSk7CisJLyoKKwkgKiBMb29wIG92ZXIgZGlyZWN0b3J5IGVudHJpZXMgdW50aWwgd2UgcmVhY2ggdGhlIGVuZCBvZmZzZXQuCisJICogR2V0IG1vcmUgYmxvY2tzIGFuZCByZWFkYWhlYWQgYXMgbmVjZXNzYXJ5LgorCSAqLworCXdoaWxlIChjdXJvZmYgPCBYRlNfRElSMl9MRUFGX09GRlNFVCkgeworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIG5vIGJ1ZmZlciwgb3Igd2UncmUgb2ZmIHRoZSBlbmQgb2YgdGhlCisJCSAqIGN1cnJlbnQgYnVmZmVyLCBuZWVkIHRvIGdldCBhbm90aGVyIG9uZS4KKwkJICovCisJCWlmICghYnAgfHwgcHRyID49IChjaGFyICopYnAtPmRhdGEgKyBtcC0+bV9kaXJibGtzaXplKSB7CisJCQkvKgorCQkJICogSWYgd2UgaGF2ZSBhIGJ1ZmZlciwgd2UgbmVlZCB0byByZWxlYXNlIGl0IGFuZAorCQkJICogdGFrZSBpdCBvdXQgb2YgdGhlIG1hcHBpbmcuCisJCQkgKi8KKwkJCWlmIChicCkgeworCQkJCXhmc19kYV9icmVsc2UodHAsIGJwKTsKKwkJCQlicCA9IE5VTEw7CisJCQkJbWFwX2Jsb2NrcyAtPSBtcC0+bV9kaXJibGtmc2JzOworCQkJCS8qCisJCQkJICogTG9vcCB0byBnZXQgcmlkIG9mIHRoZSBleHRlbnRzIGZvciB0aGUKKwkJCQkgKiBkaXJlY3RvcnkgYmxvY2suCisJCQkJICovCisJCQkJZm9yIChpID0gbXAtPm1fZGlyYmxrZnNiczsgaSA+IDA7ICkgeworCQkJCQlqID0gTUlOKChpbnQpbWFwLT5icl9ibG9ja2NvdW50LCBpKTsKKwkJCQkJbWFwLT5icl9ibG9ja2NvdW50IC09IGo7CisJCQkJCW1hcC0+YnJfc3RhcnRibG9jayArPSBqOworCQkJCQltYXAtPmJyX3N0YXJ0b2ZmICs9IGo7CisJCQkJCS8qCisJCQkJCSAqIElmIG1hcHBpbmcgaXMgZG9uZSwgcGl0Y2ggaXQgZnJvbQorCQkJCQkgKiB0aGUgdGFibGUuCisJCQkJCSAqLworCQkJCQlpZiAoIW1hcC0+YnJfYmxvY2tjb3VudCAmJiAtLW1hcF92YWxpZCkKKwkJCQkJCW1lbW1vdmUoJm1hcFswXSwgJm1hcFsxXSwKKwkJCQkJCQlzaXplb2YobWFwWzBdKSAqCisJCQkJCQkJbWFwX3ZhbGlkKTsKKwkJCQkJaSAtPSBqOworCQkJCX0KKwkJCX0KKwkJCS8qCisJCQkgKiBSZWNhbGN1bGF0ZSB0aGUgcmVhZGFoZWFkIGJsb2NrcyB3YW50ZWQuCisJCQkgKi8KKwkJCXJhX3dhbnQgPSBob3dtYW55KHVpby0+dWlvX3Jlc2lkICsgbXAtPm1fZGlyYmxrc2l6ZSwKKwkJCQkJICBtcC0+bV9zYi5zYl9ibG9ja3NpemUpIC0gMTsKKwkJCS8qCisJCQkgKiBJZiB3ZSBkb24ndCBoYXZlIGFzIG1hbnkgYXMgd2Ugd2FudCwgYW5kIHdlIGhhdmVuJ3QKKwkJCSAqIHJ1biBvdXQgb2YgZGF0YSBibG9ja3MsIGdldCBzb21lIG1vcmUgbWFwcGluZ3MuCisJCQkgKi8KKwkJCWlmICgxICsgcmFfd2FudCA+IG1hcF9ibG9ja3MgJiYKKwkJCSAgICBtYXBfb2ZmIDwKKwkJCSAgICBYRlNfRElSMl9CWVRFX1RPX0RBKG1wLCBYRlNfRElSMl9MRUFGX09GRlNFVCkpIHsKKwkJCQkvKgorCQkJCSAqIEdldCBtb3JlIGJtYXBzLCBmaWxsIGluIGFmdGVyIHRoZSBvbmVzCisJCQkJICogd2UgYWxyZWFkeSBoYXZlIGluIHRoZSB0YWJsZS4KKwkJCQkgKi8KKwkJCQlubWFwID0gbWFwX3NpemUgLSBtYXBfdmFsaWQ7CisJCQkJZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGRwLAorCQkJCQltYXBfb2ZmLAorCQkJCQlYRlNfRElSMl9CWVRFX1RPX0RBKG1wLAorCQkJCQkJWEZTX0RJUjJfTEVBRl9PRkZTRVQpIC0gbWFwX29mZiwKKwkJCQkJWEZTX0JNQVBJX01FVEFEQVRBLCBOVUxMLCAwLAorCQkJCQkmbWFwW21hcF92YWxpZF0sICZubWFwLCBOVUxMKTsKKwkJCQkvKgorCQkJCSAqIERvbid0IGtub3cgaWYgd2Ugc2hvdWxkIGlnbm9yZSB0aGlzIG9yCisJCQkJICogdHJ5IHRvIHJldHVybiBhbiBlcnJvci4KKwkJCQkgKiBUaGUgdHJvdWJsZSB3aXRoIHJldHVybmluZyBlcnJvcnMKKwkJCQkgKiBpcyB0aGF0IHJlYWRkaXIgd2lsbCBqdXN0IHN0b3Agd2l0aG91dAorCQkJCSAqIGFjdHVhbGx5IHBhc3NpbmcgdGhlIGVycm9yIHRocm91Z2guCisJCQkJICovCisJCQkJaWYgKGVycm9yKQorCQkJCQlicmVhazsJLyogWFhYICovCisJCQkJLyoKKwkJCQkgKiBJZiB3ZSBnb3QgYWxsIHRoZSBtYXBwaW5ncyB3ZSBhc2tlZCBmb3IsCisJCQkJICogc2V0IHRoZSBmaW5hbCBtYXAgb2Zmc2V0IGJhc2VkIG9uIHRoZQorCQkJCSAqIGxhc3QgYm1hcCB2YWx1ZSByZWNlaXZlZC4KKwkJCQkgKiBPdGhlcndpc2UsIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZC4KKwkJCQkgKi8KKwkJCQlpZiAobm1hcCA9PSBtYXBfc2l6ZSAtIG1hcF92YWxpZCkKKwkJCQkJbWFwX29mZiA9CisJCQkJCW1hcFttYXBfdmFsaWQgKyBubWFwIC0gMV0uYnJfc3RhcnRvZmYgKworCQkJCQltYXBbbWFwX3ZhbGlkICsgbm1hcCAtIDFdLmJyX2Jsb2NrY291bnQ7CisJCQkJZWxzZQorCQkJCQltYXBfb2ZmID0KKwkJCQkJCVhGU19ESVIyX0JZVEVfVE9fREEobXAsCisJCQkJCQkJWEZTX0RJUjJfTEVBRl9PRkZTRVQpOworCQkJCS8qCisJCQkJICogTG9vayBmb3IgaG9sZXMgaW4gdGhlIG1hcHBpbmcsIGFuZAorCQkJCSAqIGVsaW1pbmF0ZSB0aGVtLiAgQ291bnQgdXAgdGhlIHZhbGlkIGJsb2Nrcy4KKwkJCQkgKi8KKwkJCQlmb3IgKGkgPSBtYXBfdmFsaWQ7IGkgPCBtYXBfdmFsaWQgKyBubWFwOyApIHsKKwkJCQkJaWYgKG1hcFtpXS5icl9zdGFydGJsb2NrID09CisJCQkJCSAgICBIT0xFU1RBUlRCTE9DSykgeworCQkJCQkJbm1hcC0tOworCQkJCQkJbGVuZ3RoID0gbWFwX3ZhbGlkICsgbm1hcCAtIGk7CisJCQkJCQlpZiAobGVuZ3RoKQorCQkJCQkJCW1lbW1vdmUoJm1hcFtpXSwKKwkJCQkJCQkJJm1hcFtpICsgMV0sCisJCQkJCQkJCXNpemVvZihtYXBbaV0pICoKKwkJCQkJCQkJbGVuZ3RoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW1hcF9ibG9ja3MgKz0KKwkJCQkJCQltYXBbaV0uYnJfYmxvY2tjb3VudDsKKwkJCQkJCWkrKzsKKwkJCQkJfQorCQkJCX0KKwkJCQltYXBfdmFsaWQgKz0gbm1hcDsKKwkJCX0KKwkJCS8qCisJCQkgKiBObyB2YWxpZCBtYXBwaW5ncywgc28gbm8gbW9yZSBkYXRhIGJsb2Nrcy4KKwkJCSAqLworCQkJaWYgKCFtYXBfdmFsaWQpIHsKKwkJCQljdXJvZmYgPSBYRlNfRElSMl9EQV9UT19CWVRFKG1wLCBtYXBfb2ZmKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qCisJCQkgKiBSZWFkIHRoZSBkaXJlY3RvcnkgYmxvY2sgc3RhcnRpbmcgYXQgdGhlIGZpcnN0CisJCQkgKiBtYXBwaW5nLgorCQkJICovCisJCQljdXJkYiA9IFhGU19ESVIyX0RBX1RPX0RCKG1wLCBtYXAtPmJyX3N0YXJ0b2ZmKTsKKwkJCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKHRwLCBkcCwgbWFwLT5icl9zdGFydG9mZiwKKwkJCQltYXAtPmJyX2Jsb2NrY291bnQgPj0gbXAtPm1fZGlyYmxrZnNicyA/CisJCQkJICAgIFhGU19GU0JfVE9fREFERFIobXAsIG1hcC0+YnJfc3RhcnRibG9jaykgOgorCQkJCSAgICAtMSwKKwkJCQkmYnAsIFhGU19EQVRBX0ZPUkspOworCQkJLyoKKwkJCSAqIFNob3VsZCBqdXN0IHNraXAgb3ZlciB0aGUgZGF0YSBibG9jayBpbnN0ZWFkCisJCQkgKiBvZiBnaXZpbmcgdXAuCisJCQkgKi8KKwkJCWlmIChlcnJvcikKKwkJCQlicmVhazsJLyogWFhYICovCisJCQkvKgorCQkJICogQWRqdXN0IHRoZSBjdXJyZW50IGFtb3VudCBvZiByZWFkLWFoZWFkOiB3ZSBqdXN0CisJCQkgKiByZWFkIGEgYmxvY2sgdGhhdCB3YXMgcHJldmlvdXNseSByYS4KKwkJCSAqLworCQkJaWYgKHJhX2N1cnJlbnQpCisJCQkJcmFfY3VycmVudCAtPSBtcC0+bV9kaXJibGtmc2JzOworCQkJLyoKKwkJCSAqIERvIHdlIG5lZWQgbW9yZSByZWFkYWhlYWQ/CisJCQkgKi8KKwkJCWZvciAocmFfaW5kZXggPSByYV9vZmZzZXQgPSBpID0gMDsKKwkJCSAgICAgcmFfd2FudCA+IHJhX2N1cnJlbnQgJiYgaSA8IG1hcF9ibG9ja3M7CisJCQkgICAgIGkgKz0gbXAtPm1fZGlyYmxrZnNicykgeworCQkJCUFTU0VSVChyYV9pbmRleCA8IG1hcF92YWxpZCk7CisJCQkJLyoKKwkJCQkgKiBSZWFkLWFoZWFkIGEgY29udGlndW91cyBkaXJlY3RvcnkgYmxvY2suCisJCQkJICovCisJCQkJaWYgKGkgPiByYV9jdXJyZW50ICYmCisJCQkJICAgIG1hcFtyYV9pbmRleF0uYnJfYmxvY2tjb3VudCA+PQorCQkJCSAgICBtcC0+bV9kaXJibGtmc2JzKSB7CisJCQkJCXhmc19iYXJlYWQobXAtPm1fZGRldl90YXJncCwKKwkJCQkJCVhGU19GU0JfVE9fREFERFIobXAsCisJCQkJCQkgICBtYXBbcmFfaW5kZXhdLmJyX3N0YXJ0YmxvY2sgKworCQkJCQkJICAgcmFfb2Zmc2V0KSwKKwkJCQkJCShpbnQpQlRPQkIobXAtPm1fZGlyYmxrc2l6ZSkpOworCQkJCQlyYV9jdXJyZW50ID0gaTsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBSZWFkLWFoZWFkIGEgbm9uLWNvbnRpZ3VvdXMgZGlyZWN0b3J5IGJsb2NrLgorCQkJCSAqIFRoaXMgZG9lc24ndCB1c2Ugb3VyIG1hcHBpbmcsIGJ1dCB0aGlzCisJCQkJICogaXMgYSB2ZXJ5IHJhcmUgY2FzZS4KKwkJCQkgKi8KKwkJCQllbHNlIGlmIChpID4gcmFfY3VycmVudCkgeworCQkJCQkodm9pZCl4ZnNfZGFfcmVhZGFfYnVmKHRwLCBkcCwKKwkJCQkJCW1hcFtyYV9pbmRleF0uYnJfc3RhcnRvZmYgKworCQkJCQkJcmFfb2Zmc2V0LCBYRlNfREFUQV9GT1JLKTsKKwkJCQkJcmFfY3VycmVudCA9IGk7CisJCQkJfQorCQkJCS8qCisJCQkJICogQWR2YW5jZSBvZmZzZXQgdGhyb3VnaCB0aGUgbWFwcGluZyB0YWJsZS4KKwkJCQkgKi8KKwkJCQlmb3IgKGogPSAwOyBqIDwgbXAtPm1fZGlyYmxrZnNiczsgaisrKSB7CisJCQkJCS8qCisJCQkJCSAqIFRoZSByZXN0IG9mIHRoaXMgZXh0ZW50IGJ1dCBub3QKKwkJCQkJICogbW9yZSB0aGFuIGEgZGlyIGJsb2NrLgorCQkJCQkgKi8KKwkJCQkJbGVuZ3RoID0gTUlOKG1wLT5tX2RpcmJsa2ZzYnMsCisJCQkJCQkoaW50KShtYXBbcmFfaW5kZXhdLmJyX2Jsb2NrY291bnQgLQorCQkJCQkJcmFfb2Zmc2V0KSk7CisJCQkJCWogKz0gbGVuZ3RoOworCQkJCQlyYV9vZmZzZXQgKz0gbGVuZ3RoOworCQkJCQkvKgorCQkJCQkgKiBBZHZhbmNlIHRvIHRoZSBuZXh0IG1hcHBpbmcgaWYKKwkJCQkJICogdGhpcyBvbmUgaXMgdXNlZCB1cC4KKwkJCQkJICovCisJCQkJCWlmIChyYV9vZmZzZXQgPT0KKwkJCQkJICAgIG1hcFtyYV9pbmRleF0uYnJfYmxvY2tjb3VudCkgeworCQkJCQkJcmFfb2Zmc2V0ID0gMDsKKwkJCQkJCXJhX2luZGV4Kys7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkvKgorCQkJICogSGF2aW5nIGRvbmUgYSByZWFkLCB3ZSBuZWVkIHRvIHNldCBhIG5ldyBvZmZzZXQuCisJCQkgKi8KKwkJCW5ld29mZiA9IFhGU19ESVIyX0RCX09GRl9UT19CWVRFKG1wLCBjdXJkYiwgMCk7CisJCQkvKgorCQkJICogU3RhcnQgb2YgdGhlIGN1cnJlbnQgYmxvY2suCisJCQkgKi8KKwkJCWlmIChjdXJvZmYgPCBuZXdvZmYpCisJCQkJY3Vyb2ZmID0gbmV3b2ZmOworCQkJLyoKKwkJCSAqIE1ha2Ugc3VyZSB3ZSdyZSBpbiB0aGUgcmlnaHQgYmxvY2suCisJCQkgKi8KKwkJCWVsc2UgaWYgKGN1cm9mZiA+IG5ld29mZikKKwkJCQlBU1NFUlQoWEZTX0RJUjJfQllURV9UT19EQihtcCwgY3Vyb2ZmKSA9PQorCQkJCSAgICAgICBjdXJkYik7CisJCQlkYXRhID0gYnAtPmRhdGE7CisJCQl4ZnNfZGlyMl9kYXRhX2NoZWNrKGRwLCBicCk7CisJCQkvKgorCQkJICogRmluZCBvdXIgcG9zaXRpb24gaW4gdGhlIGJsb2NrLgorCQkJICovCisJCQlwdHIgPSAoY2hhciAqKSZkYXRhLT51OworCQkJYnl0ZW9mZiA9IFhGU19ESVIyX0JZVEVfVE9fT0ZGKG1wLCBjdXJvZmYpOworCQkJLyoKKwkJCSAqIFNraXAgcGFzdCB0aGUgaGVhZGVyLgorCQkJICovCisJCQlpZiAoYnl0ZW9mZiA9PSAwKQorCQkJCWN1cm9mZiArPSAodWludClzaXplb2YoZGF0YS0+aGRyKTsKKwkJCS8qCisJCQkgKiBTa2lwIHBhc3QgZW50cmllcyB1bnRpbCB3ZSByZWFjaCBvdXIgb2Zmc2V0LgorCQkJICovCisJCQllbHNlIHsKKwkJCQl3aGlsZSAoKGNoYXIgKilwdHIgLSAoY2hhciAqKWRhdGEgPCBieXRlb2ZmKSB7CisJCQkJCWR1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopcHRyOworCisJCQkJCWlmIChJTlRfR0VUKGR1cC0+ZnJlZXRhZywgQVJDSF9DT05WRVJUKQorCQkJCQkJICA9PSBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKSB7CisKKwkJCQkJCWxlbmd0aCA9IElOVF9HRVQoZHVwLT5sZW5ndGgsCisJCQkJCQkJCSBBUkNIX0NPTlZFUlQpOworCQkJCQkJcHRyICs9IGxlbmd0aDsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKilwdHI7CisJCQkJCWxlbmd0aCA9CisJCQkJCSAgIFhGU19ESVIyX0RBVEFfRU5UU0laRShkZXAtPm5hbWVsZW4pOworCQkJCQlwdHIgKz0gbGVuZ3RoOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIE5vdyBzZXQgb3VyIHJlYWwgb2Zmc2V0LgorCQkJCSAqLworCQkJCWN1cm9mZiA9CisJCQkJCVhGU19ESVIyX0RCX09GRl9UT19CWVRFKG1wLAorCQkJCQkgICAgWEZTX0RJUjJfQllURV9UT19EQihtcCwgY3Vyb2ZmKSwKKwkJCQkJICAgIChjaGFyICopcHRyIC0gKGNoYXIgKilkYXRhKTsKKwkJCQlpZiAocHRyID49IChjaGFyICopZGF0YSArIG1wLT5tX2RpcmJsa3NpemUpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQl9CisJCS8qCisJCSAqIFdlIGhhdmUgYSBwb2ludGVyIHRvIGFuIGVudHJ5LgorCQkgKiBJcyBpdCBhIGxpdmUgb25lPworCQkgKi8KKwkJZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKilwdHI7CisJCS8qCisJCSAqIE5vLCBpdCdzIHVudXNlZCwgc2tpcCBvdmVyIGl0LgorCQkgKi8KKwkJaWYgKElOVF9HRVQoZHVwLT5mcmVldGFnLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKSB7CisJCQlsZW5ndGggPSBJTlRfR0VUKGR1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpOworCQkJcHRyICs9IGxlbmd0aDsKKwkJCWN1cm9mZiArPSBsZW5ndGg7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIENvcHkgdGhlIGVudHJ5IGludG8gdGhlIHB1dGFyZ3MsIGFuZCB0cnkgZm9ybWF0dGluZyBpdC4KKwkJICovCisJCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKilwdHI7CisKKwkJcC5uYW1lbGVuID0gZGVwLT5uYW1lbGVuOworCisJCWxlbmd0aCA9IFhGU19ESVIyX0RBVEFfRU5UU0laRShwLm5hbWVsZW4pOworCisJCXAuY29vayA9IFhGU19ESVIyX0JZVEVfVE9fREFUQVBUUihtcCwgY3Vyb2ZmICsgbGVuZ3RoKTsKKworCQlwLmlubyA9IElOVF9HRVQoZGVwLT5pbnVtYmVyLCBBUkNIX0NPTlZFUlQpOworI2lmIFhGU19CSUdfSU5VTVMKKwkJcC5pbm8gKz0gbXAtPm1faW5vYWRkOworI2VuZGlmCisJCXAubmFtZSA9IChjaGFyICopZGVwLT5uYW1lOworCisJCWVycm9yID0gcC5wdXQoJnApOworCisJCS8qCisJCSAqIFdvbid0IGZpdC4gIFJldHVybiB0byBjYWxsZXIuCisJCSAqLworCQlpZiAoIXAuZG9uZSkgeworCQkJZW9mID0gMDsKKwkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqIEFkdmFuY2UgdG8gbmV4dCBlbnRyeSBpbiB0aGUgYmxvY2suCisJCSAqLworCQlwdHIgKz0gbGVuZ3RoOworCQljdXJvZmYgKz0gbGVuZ3RoOworCX0KKworCS8qCisJICogQWxsIGRvbmUuICBTZXQgb3V0cHV0IG9mZnNldCB2YWx1ZSB0byBjdXJyZW50IG9mZnNldC4KKwkgKi8KKwkqZW9mcCA9IGVvZjsKKwlpZiAoY3Vyb2ZmID4gWEZTX0RJUjJfREFUQVBUUl9UT19CWVRFKG1wLCBYRlNfRElSMl9NQVhfREFUQVBUUikpCisJCXVpby0+dWlvX29mZnNldCA9IFhGU19ESVIyX01BWF9EQVRBUFRSOworCWVsc2UKKwkJdWlvLT51aW9fb2Zmc2V0ID0gWEZTX0RJUjJfQllURV9UT19EQVRBUFRSKG1wLCBjdXJvZmYpOworCWttZW1fZnJlZShtYXAsIG1hcF9zaXplICogc2l6ZW9mKCptYXApKTsKKwlpZiAoYnApCisJCXhmc19kYV9icmVsc2UodHAsIGJwKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGEgbmV3IGxlYWYgYmxvY2ssIGxlYWYxIG9yIGxlYWZuIG1hZ2ljIGFjY2VwdGVkLgorICovCitpbnQKK3hmc19kaXIyX2xlYWZfaW5pdCgKKwl4ZnNfZGFfYXJnc190CQkqYXJncywJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfZGlyMl9kYl90CQlibm8sCQkvKiBkaXJlY3RvcnkgYmxvY2sgbnVtYmVyICovCisJeGZzX2RhYnVmX3QJCSoqYnBwLAkJLyogb3V0OiBsZWFmIGJ1ZmZlciAqLworCWludAkJCW1hZ2ljKQkJLyogbWFnaWMgbnVtYmVyIGZvciBibG9jayAqLworeworCXhmc19kYWJ1Zl90CQkqYnA7CQkvKiBsZWFmIGJ1ZmZlciAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gY29kZSAqLworCXhmc19kaXIyX2xlYWZfdAkJKmxlYWY7CQkvKiBsZWFmIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2xlYWZfdGFpbF90CSpsdHA7CQkvKiBsZWFmIHRhaWwgc3RydWN0dXJlICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkJKnRwOwkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCisJZHAgPSBhcmdzLT5kcDsKKwlBU1NFUlQoZHAgIT0gTlVMTCk7CisJdHAgPSBhcmdzLT50cmFuczsKKwltcCA9IGRwLT5pX21vdW50OworCUFTU0VSVChibm8gPj0gWEZTX0RJUjJfTEVBRl9GSVJTVERCKG1wKSAmJgorCSAgICAgICBibm8gPCBYRlNfRElSMl9GUkVFX0ZJUlNUREIobXApKTsKKwkvKgorCSAqIEdldCB0aGUgYnVmZmVyIGZvciB0aGUgYmxvY2suCisJICovCisJZXJyb3IgPSB4ZnNfZGFfZ2V0X2J1Zih0cCwgZHAsIFhGU19ESVIyX0RCX1RPX0RBKG1wLCBibm8pLCAtMSwgJmJwLAorCQlYRlNfREFUQV9GT1JLKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlBU1NFUlQoYnAgIT0gTlVMTCk7CisJbGVhZiA9IGJwLT5kYXRhOworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgaGVhZGVyLgorCSAqLworCUlOVF9TRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCwgbWFnaWMpOworCWxlYWYtPmhkci5pbmZvLmZvcncgPSAwOworCWxlYWYtPmhkci5pbmZvLmJhY2sgPSAwOworCWxlYWYtPmhkci5jb3VudCA9IDA7CisJbGVhZi0+aGRyLnN0YWxlID0gMDsKKwl4ZnNfZGlyMl9sZWFmX2xvZ19oZWFkZXIodHAsIGJwKTsKKwkvKgorCSAqIElmIGl0J3MgYSBsZWFmLWZvcm1hdCBkaXJlY3RvcnkgaW5pdGlhbGl6ZSB0aGUgdGFpbC4KKwkgKiBJbiB0aGlzIGNhc2Ugb3VyIGNhbGxlciBoYXMgdGhlIHJlYWwgYmVzdHMgdGFibGUgdG8gY29weSBpbnRvCisJICogdGhlIGJsb2NrLgorCSAqLworCWlmIChtYWdpYyA9PSBYRlNfRElSMl9MRUFGMV9NQUdJQykgeworCQlsdHAgPSBYRlNfRElSMl9MRUFGX1RBSUxfUChtcCwgbGVhZik7CisJCWx0cC0+YmVzdGNvdW50ID0gMDsKKwkJeGZzX2RpcjJfbGVhZl9sb2dfdGFpbCh0cCwgYnApOworCX0KKwkqYnBwID0gYnA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMb2cgdGhlIGJlc3RzIGVudHJpZXMgaW5kaWNhdGVkIGZyb20gYSBsZWFmMSBibG9jay4KKyAqLwordm9pZAoreGZzX2RpcjJfbGVhZl9sb2dfYmVzdHMoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfZGFidWZfdAkJKmJwLAkJLyogbGVhZiBidWZmZXIgKi8KKwlpbnQJCQlmaXJzdCwJCS8qIGZpcnN0IGVudHJ5IHRvIGxvZyAqLworCWludAkJCWxhc3QpCQkvKiBsYXN0IGVudHJ5IHRvIGxvZyAqLworeworCXhmc19kaXIyX2RhdGFfb2ZmX3QJKmZpcnN0YjsJLyogcG9pbnRlciB0byBmaXJzdCBlbnRyeSAqLworCXhmc19kaXIyX2RhdGFfb2ZmX3QJKmxhc3RiOwkJLyogcG9pbnRlciB0byBsYXN0IGVudHJ5ICovCisJeGZzX2RpcjJfbGVhZl90CQkqbGVhZjsJCS8qIGxlYWYgc3RydWN0dXJlICovCisJeGZzX2RpcjJfbGVhZl90YWlsX3QJKmx0cDsJCS8qIGxlYWYgdGFpbCBzdHJ1Y3R1cmUgKi8KKworCWxlYWYgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9MRUFGMV9NQUdJQyk7CisJbHRwID0gWEZTX0RJUjJfTEVBRl9UQUlMX1AodHAtPnRfbW91bnRwLCBsZWFmKTsKKwlmaXJzdGIgPSBYRlNfRElSMl9MRUFGX0JFU1RTX1AobHRwKSArIGZpcnN0OworCWxhc3RiID0gWEZTX0RJUjJfTEVBRl9CRVNUU19QKGx0cCkgKyBsYXN0OworCXhmc19kYV9sb2dfYnVmKHRwLCBicCwgKHVpbnQpKChjaGFyICopZmlyc3RiIC0gKGNoYXIgKilsZWFmKSwKKwkJKHVpbnQpKChjaGFyICopbGFzdGIgLSAoY2hhciAqKWxlYWYgKyBzaXplb2YoKmxhc3RiKSAtIDEpKTsKK30KKworLyoKKyAqIExvZyB0aGUgbGVhZiBlbnRyaWVzIGluZGljYXRlZCBmcm9tIGEgbGVhZjEgb3IgbGVhZm4gYmxvY2suCisgKi8KK3ZvaWQKK3hmc19kaXIyX2xlYWZfbG9nX2VudHMoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfZGFidWZfdAkJKmJwLAkJLyogbGVhZiBidWZmZXIgKi8KKwlpbnQJCQlmaXJzdCwJCS8qIGZpcnN0IGVudHJ5IHRvIGxvZyAqLworCWludAkJCWxhc3QpCQkvKiBsYXN0IGVudHJ5IHRvIGxvZyAqLworeworCXhmc19kaXIyX2xlYWZfZW50cnlfdAkqZmlyc3RsZXA7CS8qIHBvaW50ZXIgdG8gZmlyc3QgZW50cnkgKi8KKwl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmxhc3RsZXA7CS8qIHBvaW50ZXIgdG8gbGFzdCBlbnRyeSAqLworCXhmc19kaXIyX2xlYWZfdAkJKmxlYWY7CQkvKiBsZWFmIHN0cnVjdHVyZSAqLworCisJbGVhZiA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0xFQUYxX01BR0lDIHx8CisJICAgICAgIElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCWZpcnN0bGVwID0gJmxlYWYtPmVudHNbZmlyc3RdOworCWxhc3RsZXAgPSAmbGVhZi0+ZW50c1tsYXN0XTsKKwl4ZnNfZGFfbG9nX2J1Zih0cCwgYnAsICh1aW50KSgoY2hhciAqKWZpcnN0bGVwIC0gKGNoYXIgKilsZWFmKSwKKwkJKHVpbnQpKChjaGFyICopbGFzdGxlcCAtIChjaGFyICopbGVhZiArIHNpemVvZigqbGFzdGxlcCkgLSAxKSk7Cit9CisKKy8qCisgKiBMb2cgdGhlIGhlYWRlciBvZiB0aGUgbGVhZjEgb3IgbGVhZm4gYmxvY2suCisgKi8KK3ZvaWQKK3hmc19kaXIyX2xlYWZfbG9nX2hlYWRlcigKKwl4ZnNfdHJhbnNfdAkJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19kYWJ1Zl90CQkqYnApCQkvKiBsZWFmIGJ1ZmZlciAqLworeworCXhmc19kaXIyX2xlYWZfdAkJKmxlYWY7CQkvKiBsZWFmIHN0cnVjdHVyZSAqLworCisJbGVhZiA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0xFQUYxX01BR0lDIHx8CisJICAgICAgIElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCXhmc19kYV9sb2dfYnVmKHRwLCBicCwgKHVpbnQpKChjaGFyICopJmxlYWYtPmhkciAtIChjaGFyICopbGVhZiksCisJCSh1aW50KShzaXplb2YobGVhZi0+aGRyKSAtIDEpKTsKK30KKworLyoKKyAqIExvZyB0aGUgdGFpbCBvZiB0aGUgbGVhZjEgYmxvY2suCisgKi8KK3ZvaWQKK3hmc19kaXIyX2xlYWZfbG9nX3RhaWwoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfZGFidWZfdAkJKmJwKQkJLyogbGVhZiBidWZmZXIgKi8KK3sKKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX3RhaWxfdAkqbHRwOwkJLyogbGVhZiB0YWlsIHN0cnVjdHVyZSAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisKKwltcCA9IHRwLT50X21vdW50cDsKKwlsZWFmID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTEVBRjFfTUFHSUMpOworCWx0cCA9IFhGU19ESVIyX0xFQUZfVEFJTF9QKG1wLCBsZWFmKTsKKwl4ZnNfZGFfbG9nX2J1Zih0cCwgYnAsICh1aW50KSgoY2hhciAqKWx0cCAtIChjaGFyICopbGVhZiksCisJCSh1aW50KShtcC0+bV9kaXJibGtzaXplIC0gMSkpOworfQorCisvKgorICogTG9vayB1cCB0aGUgZW50cnkgcmVmZXJyZWQgdG8gYnkgYXJncyBpbiB0aGUgbGVhZiBmb3JtYXQgZGlyZWN0b3J5LgorICogTW9zdCBvZiB0aGUgd29yayBpcyBkb25lIGJ5IHRoZSB4ZnNfZGlyMl9sZWFmX2xvb2t1cF9pbnQgcm91dGluZSB3aGljaAorICogaXMgYWxzbyB1c2VkIGJ5IHRoZSBub2RlLWZvcm1hdCBjb2RlLgorICovCitpbnQKK3hmc19kaXIyX2xlYWZfbG9va3VwKAorCXhmc19kYV9hcmdzX3QJCSphcmdzKQkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworeworCXhmc19kYWJ1Zl90CQkqZGJwOwkJLyogZGF0YSBibG9jayBidWZmZXIgKi8KKwl4ZnNfZGlyMl9kYXRhX2VudHJ5X3QJKmRlcDsJCS8qIGRhdGEgYmxvY2sgZW50cnkgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIGNvZGUgKi8KKwlpbnQJCQlpbmRleDsJCS8qIGZvdW5kIGVudHJ5IGluZGV4ICovCisJeGZzX2RhYnVmX3QJCSpsYnA7CQkvKiBsZWFmIGJ1ZmZlciAqLworCXhmc19kaXIyX2xlYWZfdAkJKmxlYWY7CQkvKiBsZWFmIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2xlYWZfZW50cnlfdAkqbGVwOwkJLyogbGVhZiBlbnRyeSAqLworCXhmc190cmFuc190CQkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzKCJsZWFmX2xvb2t1cCIsIGFyZ3MpOworCS8qCisJICogTG9vayB1cCBuYW1lIGluIHRoZSBsZWFmIGJsb2NrLCByZXR1cm5pbmcgYm90aCBidWZmZXJzIGFuZCBpbmRleC4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2RpcjJfbGVhZl9sb29rdXBfaW50KGFyZ3MsICZsYnAsICZpbmRleCwgJmRicCkpKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJdHAgPSBhcmdzLT50cmFuczsKKwlkcCA9IGFyZ3MtPmRwOworCXhmc19kaXIyX2xlYWZfY2hlY2soZHAsIGxicCk7CisJbGVhZiA9IGxicC0+ZGF0YTsKKwkvKgorCSAqIEdldCB0byB0aGUgbGVhZiBlbnRyeSBhbmQgY29udGFpbmVkIGRhdGEgZW50cnkgYWRkcmVzcy4KKwkgKi8KKwlsZXAgPSAmbGVhZi0+ZW50c1tpbmRleF07CisJLyoKKwkgKiBQb2ludCB0byB0aGUgZGF0YSBlbnRyeS4KKwkgKi8KKwlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopCisJICAgICAgKChjaGFyICopZGJwLT5kYXRhICsKKwkgICAgICAgWEZTX0RJUjJfREFUQVBUUl9UT19PRkYoZHAtPmlfbW91bnQsIElOVF9HRVQobGVwLT5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpKSk7CisJLyoKKwkgKiBSZXR1cm4gdGhlIGZvdW5kIGlub2RlIG51bWJlci4KKwkgKi8KKwlhcmdzLT5pbnVtYmVyID0gSU5UX0dFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCk7CisJeGZzX2RhX2JyZWxzZSh0cCwgZGJwKTsKKwl4ZnNfZGFfYnJlbHNlKHRwLCBsYnApOworCXJldHVybiBYRlNfRVJST1IoRUVYSVNUKTsKK30KKworLyoKKyAqIExvb2sgdXAgbmFtZS9oYXNoIGluIHRoZSBsZWFmIGJsb2NrLgorICogRmlsbCBpbiBpbmRleHAgd2l0aCB0aGUgZm91bmQgaW5kZXgsIGFuZCBkYnBwIHdpdGggdGhlIGRhdGEgYnVmZmVyLgorICogSWYgbm90IGZvdW5kIGRicHAgd2lsbCBiZSBOVUxMLCBhbmQgRU5PRU5UIGNvbWVzIGJhY2suCisgKiBsYnBwIHdpbGwgYWx3YXlzIGJlIGZpbGxlZCBpbiB3aXRoIHRoZSBsZWFmIGJ1ZmZlciB1bmxlc3MgdGhlcmUncyBhbiBlcnJvci4KKyAqLworc3RhdGljIGludAkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX2xlYWZfbG9va3VwX2ludCgKKwl4ZnNfZGFfYXJnc190CQkqYXJncywJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfZGFidWZfdAkJKipsYnBwLAkJLyogb3V0OiBsZWFmIGJ1ZmZlciAqLworCWludAkJCSppbmRleHAsCS8qIG91dDogaW5kZXggaW4gbGVhZiBibG9jayAqLworCXhmc19kYWJ1Zl90CQkqKmRicHApCQkvKiBvdXQ6IGRhdGEgYnVmZmVyICovCit7CisJeGZzX2RpcjJfZGJfdAkJY3VyZGI7CQkvKiBjdXJyZW50IGRhdGEgYmxvY2sgbnVtYmVyICovCisJeGZzX2RhYnVmX3QJCSpkYnA7CQkvKiBkYXRhIGJ1ZmZlciAqLworCXhmc19kaXIyX2RhdGFfZW50cnlfdAkqZGVwOwkJLyogZGF0YSBlbnRyeSAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gY29kZSAqLworCWludAkJCWluZGV4OwkJLyogaW5kZXggaW4gbGVhZiBibG9jayAqLworCXhmc19kYWJ1Zl90CQkqbGJwOwkJLyogbGVhZiBidWZmZXIgKi8KKwl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmxlcDsJCS8qIGxlYWYgZW50cnkgKi8KKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc19kaXIyX2RiX3QJCW5ld2RiOwkJLyogbmV3IGRhdGEgYmxvY2sgbnVtYmVyICovCisJeGZzX3RyYW5zX3QJCSp0cDsJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCWRwID0gYXJncy0+ZHA7CisJdHAgPSBhcmdzLT50cmFuczsKKwltcCA9IGRwLT5pX21vdW50OworCS8qCisJICogUmVhZCB0aGUgbGVhZiBibG9jayBpbnRvIHRoZSBidWZmZXIuCisJICovCisJaWYgKChlcnJvciA9CisJICAgIHhmc19kYV9yZWFkX2J1Zih0cCwgZHAsIG1wLT5tX2RpcmxlYWZibGssIC0xLCAmbGJwLAorCQkgICAgWEZTX0RBVEFfRk9SSykpKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJKmxicHAgPSBsYnA7CisJbGVhZiA9IGxicC0+ZGF0YTsKKwl4ZnNfZGlyMl9sZWFmX2NoZWNrKGRwLCBsYnApOworCS8qCisJICogTG9vayBmb3IgdGhlIGZpcnN0IGxlYWYgZW50cnkgd2l0aCBvdXIgaGFzaCB2YWx1ZS4KKwkgKi8KKwlpbmRleCA9IHhmc19kaXIyX2xlYWZfc2VhcmNoX2hhc2goYXJncywgbGJwKTsKKwkvKgorCSAqIExvb3Agb3ZlciBhbGwgdGhlIGVudHJpZXMgd2l0aCB0aGUgcmlnaHQgaGFzaCB2YWx1ZQorCSAqIGxvb2tpbmcgdG8gbWF0Y2ggdGhlIG5hbWUuCisJICovCisJZm9yIChsZXAgPSAmbGVhZi0+ZW50c1tpbmRleF0sIGRicCA9IE5VTEwsIGN1cmRiID0gLTE7CisJICAgICBpbmRleCA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpICYmIElOVF9HRVQobGVwLT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpID09IGFyZ3MtPmhhc2h2YWw7CisJICAgICBsZXArKywgaW5kZXgrKykgeworCQkvKgorCQkgKiBTa2lwIG92ZXIgc3RhbGUgbGVhZiBlbnRyaWVzLgorCQkgKi8KKwkJaWYgKElOVF9HRVQobGVwLT5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX05VTExfREFUQVBUUikKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBHZXQgdGhlIG5ldyBkYXRhIGJsb2NrIG51bWJlci4KKwkJICovCisJCW5ld2RiID0gWEZTX0RJUjJfREFUQVBUUl9UT19EQihtcCwgSU5UX0dFVChsZXAtPmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkpOworCQkvKgorCQkgKiBJZiBpdCdzIG5vdCB0aGUgc2FtZSBhcyB0aGUgb2xkIGRhdGEgYmxvY2sgbnVtYmVyLAorCQkgKiBuZWVkIHRvIHBpdGNoIHRoZSBvbGQgb25lIGFuZCByZWFkIHRoZSBuZXcgb25lLgorCQkgKi8KKwkJaWYgKG5ld2RiICE9IGN1cmRiKSB7CisJCQlpZiAoZGJwKQorCQkJCXhmc19kYV9icmVsc2UodHAsIGRicCk7CisJCQlpZiAoKGVycm9yID0KKwkJCSAgICB4ZnNfZGFfcmVhZF9idWYodHAsIGRwLAorCQkJCSAgICBYRlNfRElSMl9EQl9UT19EQShtcCwgbmV3ZGIpLCAtMSwgJmRicCwKKwkJCQkgICAgWEZTX0RBVEFfRk9SSykpKSB7CisJCQkJeGZzX2RhX2JyZWxzZSh0cCwgbGJwKTsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQl4ZnNfZGlyMl9kYXRhX2NoZWNrKGRwLCBkYnApOworCQkJY3VyZGIgPSBuZXdkYjsKKwkJfQorCQkvKgorCQkgKiBQb2ludCB0byB0aGUgZGF0YSBlbnRyeS4KKwkJICovCisJCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKikKKwkJICAgICAgKChjaGFyICopZGJwLT5kYXRhICsKKwkJICAgICAgIFhGU19ESVIyX0RBVEFQVFJfVE9fT0ZGKG1wLCBJTlRfR0VUKGxlcC0+YWRkcmVzcywgQVJDSF9DT05WRVJUKSkpOworCQkvKgorCQkgKiBJZiBpdCBtYXRjaGVzIHRoZW4gcmV0dXJuIGl0LgorCQkgKi8KKwkJaWYgKGRlcC0+bmFtZWxlbiA9PSBhcmdzLT5uYW1lbGVuICYmCisJCSAgICBkZXAtPm5hbWVbMF0gPT0gYXJncy0+bmFtZVswXSAmJgorCQkgICAgbWVtY21wKGRlcC0+bmFtZSwgYXJncy0+bmFtZSwgYXJncy0+bmFtZWxlbikgPT0gMCkgeworCQkJKmRicHAgPSBkYnA7CisJCQkqaW5kZXhwID0gaW5kZXg7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwkvKgorCSAqIE5vIG1hdGNoIGZvdW5kLCByZXR1cm4gRU5PRU5ULgorCSAqLworCUFTU0VSVChhcmdzLT5va25vZW50KTsKKwlpZiAoZGJwKQorCQl4ZnNfZGFfYnJlbHNlKHRwLCBkYnApOworCXhmc19kYV9icmVsc2UodHAsIGxicCk7CisJcmV0dXJuIFhGU19FUlJPUihFTk9FTlQpOworfQorCisvKgorICogUmVtb3ZlIGFuIGVudHJ5IGZyb20gYSBsZWFmIGZvcm1hdCBkaXJlY3RvcnkuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9sZWFmX3JlbW92ZW5hbWUoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MpCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCit7CisJeGZzX2RpcjJfZGF0YV9vZmZfdAkqYmVzdHNwOwkvKiBsZWFmIGJsb2NrIGJlc3QgZnJlZXNwYWNlICovCisJeGZzX2RpcjJfZGF0YV90CQkqZGF0YTsJCS8qIGRhdGEgYmxvY2sgc3RydWN0dXJlICovCisJeGZzX2RpcjJfZGJfdAkJZGI7CQkvKiBkYXRhIGJsb2NrIG51bWJlciAqLworCXhmc19kYWJ1Zl90CQkqZGJwOwkJLyogZGF0YSBibG9jayBidWZmZXIgKi8KKwl4ZnNfZGlyMl9kYXRhX2VudHJ5X3QJKmRlcDsJCS8qIGRhdGEgZW50cnkgc3RydWN0dXJlICovCisJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiBjb2RlICovCisJeGZzX2RpcjJfZGJfdAkJaTsJCS8qIHRlbXBvcmFyeSBkYXRhIGJsb2NrICMgKi8KKwlpbnQJCQlpbmRleDsJCS8qIGluZGV4IGludG8gbGVhZiBlbnRyaWVzICovCisJeGZzX2RhYnVmX3QJCSpsYnA7CQkvKiBsZWFmIGJ1ZmZlciAqLworCXhmc19kaXIyX2xlYWZfdAkJKmxlYWY7CQkvKiBsZWFmIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2xlYWZfZW50cnlfdAkqbGVwOwkJLyogbGVhZiBlbnRyeSAqLworCXhmc19kaXIyX2xlYWZfdGFpbF90CSpsdHA7CQkvKiBsZWFmIHRhaWwgc3RydWN0dXJlICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwlpbnQJCQluZWVkbG9nOwkvKiBuZWVkIHRvIGxvZyBkYXRhIGhlYWRlciAqLworCWludAkJCW5lZWRzY2FuOwkvKiBuZWVkIHRvIHJlc2NhbiBkYXRhIGZyZWVzICovCisJeGZzX2RpcjJfZGF0YV9vZmZfdAlvbGRiZXN0OwkvKiBvbGQgdmFsdWUgb2YgYmVzdCBmcmVlICovCisJeGZzX3RyYW5zX3QJCSp0cDsJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3MoImxlYWZfcmVtb3ZlbmFtZSIsIGFyZ3MpOworCS8qCisJICogTG9va3VwIHRoZSBsZWFmIGVudHJ5LCBnZXQgdGhlIGxlYWYgYW5kIGRhdGEgYmxvY2tzIHJlYWQgaW4uCisJICovCisJaWYgKChlcnJvciA9IHhmc19kaXIyX2xlYWZfbG9va3VwX2ludChhcmdzLCAmbGJwLCAmaW5kZXgsICZkYnApKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCWRwID0gYXJncy0+ZHA7CisJdHAgPSBhcmdzLT50cmFuczsKKwltcCA9IGRwLT5pX21vdW50OworCWxlYWYgPSBsYnAtPmRhdGE7CisJZGF0YSA9IGRicC0+ZGF0YTsKKwl4ZnNfZGlyMl9kYXRhX2NoZWNrKGRwLCBkYnApOworCS8qCisJICogUG9pbnQgdG8gdGhlIGxlYWYgZW50cnksIHVzZSB0aGF0IHRvIHBvaW50IHRvIHRoZSBkYXRhIGVudHJ5LgorCSAqLworCWxlcCA9ICZsZWFmLT5lbnRzW2luZGV4XTsKKwlkYiA9IFhGU19ESVIyX0RBVEFQVFJfVE9fREIobXAsIElOVF9HRVQobGVwLT5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpKTsKKwlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopCisJICAgICAgKChjaGFyICopZGF0YSArIFhGU19ESVIyX0RBVEFQVFJfVE9fT0ZGKG1wLCBJTlRfR0VUKGxlcC0+YWRkcmVzcywgQVJDSF9DT05WRVJUKSkpOworCW5lZWRzY2FuID0gbmVlZGxvZyA9IDA7CisJb2xkYmVzdCA9IElOVF9HRVQoZGF0YS0+aGRyLmJlc3RmcmVlWzBdLmxlbmd0aCwgQVJDSF9DT05WRVJUKTsKKwlsdHAgPSBYRlNfRElSMl9MRUFGX1RBSUxfUChtcCwgbGVhZik7CisJYmVzdHNwID0gWEZTX0RJUjJfTEVBRl9CRVNUU19QKGx0cCk7CisJQVNTRVJUKElOVF9HRVQoYmVzdHNwW2RiXSwgQVJDSF9DT05WRVJUKSA9PSBvbGRiZXN0KTsKKwkvKgorCSAqIE1hcmsgdGhlIGZvcm1lciBkYXRhIGVudHJ5IHVudXNlZC4KKwkgKi8KKwl4ZnNfZGlyMl9kYXRhX21ha2VfZnJlZSh0cCwgZGJwLAorCQkoeGZzX2RpcjJfZGF0YV9hb2ZmX3QpKChjaGFyICopZGVwIC0gKGNoYXIgKilkYXRhKSwKKwkJWEZTX0RJUjJfREFUQV9FTlRTSVpFKGRlcC0+bmFtZWxlbiksICZuZWVkbG9nLCAmbmVlZHNjYW4pOworCS8qCisJICogV2UganVzdCBtYXJrIHRoZSBsZWFmIGVudHJ5IHN0YWxlIGJ5IHB1dHRpbmcgYSBudWxsIGluIGl0LgorCSAqLworCUlOVF9NT0QobGVhZi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQsICsxKTsKKwl4ZnNfZGlyMl9sZWFmX2xvZ19oZWFkZXIodHAsIGxicCk7CisJSU5UX1NFVChsZXAtPmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUjJfTlVMTF9EQVRBUFRSKTsKKwl4ZnNfZGlyMl9sZWFmX2xvZ19lbnRzKHRwLCBsYnAsIGluZGV4LCBpbmRleCk7CisJLyoKKwkgKiBTY2FuIHRoZSBmcmVlc3BhY2UgaW4gdGhlIGRhdGEgYmxvY2sgYWdhaW4gaWYgbmVjZXNzYXJ5LAorCSAqIGxvZyB0aGUgZGF0YSBibG9jayBoZWFkZXIgaWYgbmVjZXNzYXJ5LgorCSAqLworCWlmIChuZWVkc2NhbikKKwkJeGZzX2RpcjJfZGF0YV9mcmVlc2NhbihtcCwgZGF0YSwgJm5lZWRsb2csIE5VTEwpOworCWlmIChuZWVkbG9nKQorCQl4ZnNfZGlyMl9kYXRhX2xvZ19oZWFkZXIodHAsIGRicCk7CisJLyoKKwkgKiBJZiB0aGUgbG9uZ2VzdCBmcmVlc3BhY2UgaW4gdGhlIGRhdGEgYmxvY2sgaGFzIGNoYW5nZWQsCisJICogcHV0IHRoZSBuZXcgdmFsdWUgaW4gdGhlIGJlc3RzIHRhYmxlIGFuZCBsb2cgdGhhdC4KKwkgKi8KKwlpZiAoSU5UX0dFVChkYXRhLT5oZHIuYmVzdGZyZWVbMF0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpICE9IG9sZGJlc3QpIHsKKwkJSU5UX0NPUFkoYmVzdHNwW2RiXSwgZGF0YS0+aGRyLmJlc3RmcmVlWzBdLmxlbmd0aCwgQVJDSF9DT05WRVJUKTsKKwkJeGZzX2RpcjJfbGVhZl9sb2dfYmVzdHModHAsIGxicCwgZGIsIGRiKTsKKwl9CisJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCwgZGJwKTsKKwkvKgorCSAqIElmIHRoZSBkYXRhIGJsb2NrIGlzIG5vdyBlbXB0eSB0aGVuIGdldCByaWQgb2YgdGhlIGRhdGEgYmxvY2suCisJICovCisJaWYgKElOVF9HRVQoZGF0YS0+aGRyLmJlc3RmcmVlWzBdLmxlbmd0aCwgQVJDSF9DT05WRVJUKSA9PQorCSAgICBtcC0+bV9kaXJibGtzaXplIC0gKHVpbnQpc2l6ZW9mKGRhdGEtPmhkcikpIHsKKwkJQVNTRVJUKGRiICE9IG1wLT5tX2RpcmRhdGFibGspOworCQlpZiAoKGVycm9yID0geGZzX2RpcjJfc2hyaW5rX2lub2RlKGFyZ3MsIGRiLCBkYnApKSkgeworCQkJLyoKKwkJCSAqIE5vcGUsIGNhbid0IGdldCByaWQgb2YgaXQgYmVjYXVzZSBpdCBjYXVzZWQKKwkJCSAqIGFsbG9jYXRpb24gb2YgYSBibWFwIGJ0cmVlIGJsb2NrIHRvIGRvIHNvLgorCQkJICogSnVzdCBnbyBvbiwgcmV0dXJuaW5nIHN1Y2Nlc3MsIGxlYXZpbmcgdGhlCisJCQkgKiBlbXB0eSBibG9jayBpbiBwbGFjZS4KKwkJCSAqLworCQkJaWYgKGVycm9yID09IEVOT1NQQyAmJiBhcmdzLT50b3RhbCA9PSAwKSB7CisJCQkJeGZzX2RhX2J1Zl9kb25lKGRicCk7CisJCQkJZXJyb3IgPSAwOworCQkJfQorCQkJeGZzX2RpcjJfbGVhZl9jaGVjayhkcCwgbGJwKTsKKwkJCXhmc19kYV9idWZfZG9uZShsYnApOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCWRicCA9IE5VTEw7CisJCS8qCisJCSAqIElmIHRoaXMgaXMgdGhlIGxhc3QgZGF0YSBibG9jayB0aGVuIGNvbXBhY3QgdGhlCisJCSAqIGJlc3RzIHRhYmxlIGJ5IGdldHRpbmcgcmlkIG9mIGVudHJpZXMuCisJCSAqLworCQlpZiAoZGIgPT0gSU5UX0dFVChsdHAtPmJlc3Rjb3VudCwgQVJDSF9DT05WRVJUKSAtIDEpIHsKKwkJCS8qCisJCQkgKiBMb29rIGZvciB0aGUgbGFzdCBhY3RpdmUgZW50cnkgKGkpLgorCQkJICovCisJCQlmb3IgKGkgPSBkYiAtIDE7IGkgPiAwOyBpLS0pIHsKKwkJCQlpZiAoSU5UX0dFVChiZXN0c3BbaV0sIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTERBVEFPRkYpCisJCQkJCWJyZWFrOworCQkJfQorCQkJLyoKKwkJCSAqIENvcHkgdGhlIHRhYmxlIGRvd24gc28gaW5hY3RpdmUgZW50cmllcyBhdCB0aGUKKwkJCSAqIGVuZCBhcmUgcmVtb3ZlZC4KKwkJCSAqLworCQkJbWVtbW92ZSgmYmVzdHNwW2RiIC0gaV0sIGJlc3RzcCwKKwkJCQkoSU5UX0dFVChsdHAtPmJlc3Rjb3VudCwgQVJDSF9DT05WRVJUKSAtIChkYiAtIGkpKSAqIHNpemVvZigqYmVzdHNwKSk7CisJCQlJTlRfTU9EKGx0cC0+YmVzdGNvdW50LCBBUkNIX0NPTlZFUlQsIC0oZGIgLSBpKSk7CisJCQl4ZnNfZGlyMl9sZWFmX2xvZ190YWlsKHRwLCBsYnApOworCQkJeGZzX2RpcjJfbGVhZl9sb2dfYmVzdHModHAsIGxicCwgMCwgSU5UX0dFVChsdHAtPmJlc3Rjb3VudCwgQVJDSF9DT05WRVJUKSAtIDEpOworCQl9IGVsc2UKKwkJCUlOVF9TRVQoYmVzdHNwW2RiXSwgQVJDSF9DT05WRVJULCBOVUxMREFUQU9GRik7CisJfQorCS8qCisJICogSWYgdGhlIGRhdGEgYmxvY2sgd2FzIG5vdCB0aGUgZmlyc3Qgb25lLCBkcm9wIGl0LgorCSAqLworCWVsc2UgaWYgKGRiICE9IG1wLT5tX2RpcmRhdGFibGsgJiYgZGJwICE9IE5VTEwpIHsKKwkJeGZzX2RhX2J1Zl9kb25lKGRicCk7CisJCWRicCA9IE5VTEw7CisJfQorCXhmc19kaXIyX2xlYWZfY2hlY2soZHAsIGxicCk7CisJLyoKKwkgKiBTZWUgaWYgd2UgY2FuIGNvbnZlcnQgdG8gYmxvY2sgZm9ybS4KKwkgKi8KKwlyZXR1cm4geGZzX2RpcjJfbGVhZl90b19ibG9jayhhcmdzLCBsYnAsIGRicCk7Cit9CisKKy8qCisgKiBSZXBsYWNlIHRoZSBpbm9kZSBudW1iZXIgaW4gYSBsZWFmIGZvcm1hdCBkaXJlY3RvcnkgZW50cnkuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9sZWFmX3JlcGxhY2UoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MpCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCit7CisJeGZzX2RhYnVmX3QJCSpkYnA7CQkvKiBkYXRhIGJsb2NrIGJ1ZmZlciAqLworCXhmc19kaXIyX2RhdGFfZW50cnlfdAkqZGVwOwkJLyogZGF0YSBibG9jayBlbnRyeSAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gY29kZSAqLworCWludAkJCWluZGV4OwkJLyogaW5kZXggb2YgbGVhZiBlbnRyeSAqLworCXhmc19kYWJ1Zl90CQkqbGJwOwkJLyogbGVhZiBidWZmZXIgKi8KKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmxlcDsJCS8qIGxlYWYgZW50cnkgKi8KKwl4ZnNfdHJhbnNfdAkJKnRwOwkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCisJeGZzX2RpcjJfdHJhY2VfYXJncygibGVhZl9yZXBsYWNlIiwgYXJncyk7CisJLyoKKwkgKiBMb29rIHVwIHRoZSBlbnRyeS4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2RpcjJfbGVhZl9sb29rdXBfaW50KGFyZ3MsICZsYnAsICZpbmRleCwgJmRicCkpKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJZHAgPSBhcmdzLT5kcDsKKwlsZWFmID0gbGJwLT5kYXRhOworCS8qCisJICogUG9pbnQgdG8gdGhlIGxlYWYgZW50cnksIGdldCBkYXRhIGFkZHJlc3MgZnJvbSBpdC4KKwkgKi8KKwlsZXAgPSAmbGVhZi0+ZW50c1tpbmRleF07CisJLyoKKwkgKiBQb2ludCB0byB0aGUgZGF0YSBlbnRyeS4KKwkgKi8KKwlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopCisJICAgICAgKChjaGFyICopZGJwLT5kYXRhICsKKwkgICAgICAgWEZTX0RJUjJfREFUQVBUUl9UT19PRkYoZHAtPmlfbW91bnQsIElOVF9HRVQobGVwLT5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpKSk7CisJQVNTRVJUKGFyZ3MtPmludW1iZXIgIT0gSU5UX0dFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCkpOworCS8qCisJICogUHV0IHRoZSBuZXcgaW5vZGUgbnVtYmVyIGluLCBsb2cgaXQuCisJICovCisJSU5UX1NFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCwgYXJncy0+aW51bWJlcik7CisJdHAgPSBhcmdzLT50cmFuczsKKwl4ZnNfZGlyMl9kYXRhX2xvZ19lbnRyeSh0cCwgZGJwLCBkZXApOworCXhmc19kYV9idWZfZG9uZShkYnApOworCXhmc19kaXIyX2xlYWZfY2hlY2soZHAsIGxicCk7CisJeGZzX2RhX2JyZWxzZSh0cCwgbGJwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJldHVybiBpbmRleCBpbiB0aGUgbGVhZiBibG9jayAobGJwKSB3aGljaCBpcyBlaXRoZXIgdGhlIGZpcnN0CisgKiBvbmUgd2l0aCB0aGlzIGhhc2ggdmFsdWUsIG9yIGlmIHRoZXJlIGFyZSBub25lLCB0aGUgaW5zZXJ0IHBvaW50CisgKiBmb3IgdGhhdCBoYXNoIHZhbHVlLgorICovCitpbnQJCQkJCQkvKiBpbmRleCB2YWx1ZSAqLworeGZzX2RpcjJfbGVhZl9zZWFyY2hfaGFzaCgKKwl4ZnNfZGFfYXJnc190CQkqYXJncywJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfZGFidWZfdAkJKmxicCkJCS8qIGxlYWYgYnVmZmVyICovCit7CisJeGZzX2RhaGFzaF90CQloYXNoPTA7CQkvKiBoYXNoIGZyb20gdGhpcyBlbnRyeSAqLworCXhmc19kYWhhc2hfdAkJaGFzaHdhbnQ7CS8qIGhhc2ggdmFsdWUgbG9va2luZyBmb3IgKi8KKwlpbnQJCQloaWdoOwkJLyogaGlnaCBsZWFmIGluZGV4ICovCisJaW50CQkJbG93OwkJLyogbG93IGxlYWYgaW5kZXggKi8KKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmxlcDsJCS8qIGxlYWYgZW50cnkgKi8KKwlpbnQJCQltaWQ9MDsJCS8qIGN1cnJlbnQgbGVhZiBpbmRleCAqLworCisJbGVhZiA9IGxicC0+ZGF0YTsKKyNpZm5kZWYgX19LRVJORUxfXworCWlmICghbGVhZi0+aGRyLmNvdW50KQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCS8qCisJICogTm90ZSwgdGhlIHRhYmxlIGNhbm5vdCBiZSBlbXB0eSwgc28gd2UgaGF2ZSB0byBnbyB0aHJvdWdoIHRoZSBsb29wLgorCSAqIEJpbmFyeSBzZWFyY2ggdGhlIGxlYWYgZW50cmllcyBsb29raW5nIGZvciBvdXIgaGFzaCB2YWx1ZS4KKwkgKi8KKwlmb3IgKGxlcCA9IGxlYWYtPmVudHMsIGxvdyA9IDAsIGhpZ2ggPSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIDEsCisJCWhhc2h3YW50ID0gYXJncy0+aGFzaHZhbDsKKwkgICAgIGxvdyA8PSBoaWdoOyApIHsKKwkJbWlkID0gKGxvdyArIGhpZ2gpID4+IDE7CisJCWlmICgoaGFzaCA9IElOVF9HRVQobGVwW21pZF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSkgPT0gaGFzaHdhbnQpCisJCQlicmVhazsKKwkJaWYgKGhhc2ggPCBoYXNod2FudCkKKwkJCWxvdyA9IG1pZCArIDE7CisJCWVsc2UKKwkJCWhpZ2ggPSBtaWQgLSAxOworCX0KKwkvKgorCSAqIEZvdW5kIG9uZSwgYmFjayB1cCB0aHJvdWdoIGFsbCB0aGUgZXF1YWwgaGFzaCB2YWx1ZXMuCisJICovCisJaWYgKGhhc2ggPT0gaGFzaHdhbnQpIHsKKwkJd2hpbGUgKG1pZCA+IDAgJiYgSU5UX0dFVChsZXBbbWlkIC0gMV0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSA9PSBoYXNod2FudCkgeworCQkJbWlkLS07CisJCX0KKwl9CisJLyoKKwkgKiBOZWVkIHRvIHBvaW50IHRvIGFuIGVudHJ5IGhpZ2hlciB0aGFuIG91cnMuCisJICovCisJZWxzZSBpZiAoaGFzaCA8IGhhc2h3YW50KQorCQltaWQrKzsKKwlyZXR1cm4gbWlkOworfQorCisvKgorICogVHJpbSBvZmYgYSB0cmFpbGluZyBkYXRhIGJsb2NrLiAgV2Uga25vdyBpdCdzIGVtcHR5IHNpbmNlIHRoZSBsZWFmCisgKiBmcmVlc3BhY2UgdGFibGUgc2F5cyBzby4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX2xlYWZfdHJpbV9kYXRhKAorCXhmc19kYV9hcmdzX3QJCSphcmdzLAkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworCXhmc19kYWJ1Zl90CQkqbGJwLAkJLyogbGVhZiBidWZmZXIgKi8KKwl4ZnNfZGlyMl9kYl90CQlkYikJCS8qIGRhdGEgYmxvY2sgbnVtYmVyICovCit7CisJeGZzX2RpcjJfZGF0YV9vZmZfdAkqYmVzdHNwOwkvKiBsZWFmIGJlc3RzIHRhYmxlICovCisjaWZkZWYgREVCVUcKKwl4ZnNfZGlyMl9kYXRhX3QJCSpkYXRhOwkJLyogZGF0YSBibG9jayBzdHJ1Y3R1cmUgKi8KKyNlbmRpZgorCXhmc19kYWJ1Zl90CQkqZGJwOwkJLyogZGF0YSBibG9jayBidWZmZXIgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX2RpcjJfbGVhZl90CQkqbGVhZjsJCS8qIGxlYWYgc3RydWN0dXJlICovCisJeGZzX2RpcjJfbGVhZl90YWlsX3QJKmx0cDsJCS8qIGxlYWYgdGFpbCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc190cmFuc190CQkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisKKwlkcCA9IGFyZ3MtPmRwOworCW1wID0gZHAtPmlfbW91bnQ7CisJdHAgPSBhcmdzLT50cmFuczsKKwkvKgorCSAqIFJlYWQgdGhlIG9mZmVuZGluZyBkYXRhIGJsb2NrLiAgV2UgbmVlZCBpdHMgYnVmZmVyLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYodHAsIGRwLCBYRlNfRElSMl9EQl9UT19EQShtcCwgZGIpLCAtMSwgJmRicCwKKwkJCVhGU19EQVRBX0ZPUkspKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorI2lmZGVmIERFQlVHCisJZGF0YSA9IGRicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChkYXRhLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfREFUQV9NQUdJQyk7CisjZW5kaWYKKwkvKiB0aGlzIHNlZW1zIHRvIGJlIGFuIGVycm9yCisJICogZGF0YSBpcyBvbmx5IHZhbGlkIGlmIERFQlVHIGlzIGRlZmluZWQ/CisJICogUk1DIDA5LzA4LzE5OTkKKwkgKi8KKworCWxlYWYgPSBsYnAtPmRhdGE7CisJbHRwID0gWEZTX0RJUjJfTEVBRl9UQUlMX1AobXAsIGxlYWYpOworCUFTU0VSVChJTlRfR0VUKGRhdGEtPmhkci5iZXN0ZnJlZVswXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPT0KKwkgICAgICAgbXAtPm1fZGlyYmxrc2l6ZSAtICh1aW50KXNpemVvZihkYXRhLT5oZHIpKTsKKwlBU1NFUlQoZGIgPT0gSU5UX0dFVChsdHAtPmJlc3Rjb3VudCwgQVJDSF9DT05WRVJUKSAtIDEpOworCS8qCisJICogR2V0IHJpZCBvZiB0aGUgZGF0YSBibG9jay4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2RpcjJfc2hyaW5rX2lub2RlKGFyZ3MsIGRiLCBkYnApKSkgeworCQlBU1NFUlQoZXJyb3IgIT0gRU5PU1BDKTsKKwkJeGZzX2RhX2JyZWxzZSh0cCwgZGJwKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwkvKgorCSAqIEVsaW1pbmF0ZSB0aGUgbGFzdCBiZXN0cyBlbnRyeSBmcm9tIHRoZSB0YWJsZS4KKwkgKi8KKwliZXN0c3AgPSBYRlNfRElSMl9MRUFGX0JFU1RTX1AobHRwKTsKKwlJTlRfTU9EKGx0cC0+YmVzdGNvdW50LCBBUkNIX0NPTlZFUlQsIC0xKTsKKwltZW1tb3ZlKCZiZXN0c3BbMV0sICZiZXN0c3BbMF0sIElOVF9HRVQobHRwLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKmJlc3RzcCkpOworCXhmc19kaXIyX2xlYWZfbG9nX3RhaWwodHAsIGxicCk7CisJeGZzX2RpcjJfbGVhZl9sb2dfYmVzdHModHAsIGxicCwgMCwgSU5UX0dFVChsdHAtPmJlc3Rjb3VudCwgQVJDSF9DT05WRVJUKSAtIDEpOworCXJldHVybiAwOworfQorCisvKgorICogQ29udmVydCBub2RlIGZvcm0gZGlyZWN0b3J5IHRvIGxlYWYgZm9ybSBkaXJlY3RvcnkuCisgKiBUaGUgcm9vdCBvZiB0aGUgbm9kZSBmb3JtIGRpciBuZWVkcyB0byBhbHJlYWR5IGJlIGEgTEVBRk4gYmxvY2suCisgKiBKdXN0IHJldHVybiBpZiB3ZSBjYW4ndCBkbyBhbnl0aGluZy4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX25vZGVfdG9fbGVhZigKKwl4ZnNfZGFfc3RhdGVfdAkJKnN0YXRlKQkJLyogZGlyZWN0b3J5IG9wZXJhdGlvbiBzdGF0ZSAqLworeworCXhmc19kYV9hcmdzX3QJCSphcmdzOwkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gY29kZSAqLworCXhmc19kYWJ1Zl90CQkqZmJwOwkJLyogYnVmZmVyIGZvciBmcmVlc3BhY2UgYmxvY2sgKi8KKwl4ZnNfZmlsZW9mZl90CQlmbzsJCS8qIGZyZWVzcGFjZSBmaWxlIG9mZnNldCAqLworCXhmc19kaXIyX2ZyZWVfdAkJKmZyZWU7CQkvKiBmcmVlc3BhY2Ugc3RydWN0dXJlICovCisJeGZzX2RhYnVmX3QJCSpsYnA7CQkvKiBidWZmZXIgZm9yIGxlYWYgYmxvY2sgKi8KKwl4ZnNfZGlyMl9sZWFmX3RhaWxfdAkqbHRwOwkJLyogdGFpbCBvZiBsZWFmIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2xlYWZfdAkJKmxlYWY7CQkvKiBsZWFmIHN0cnVjdHVyZSAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJaW50CQkJcnZhbDsJCS8qIHN1Y2Nlc3NmdWwgZnJlZSB0cmltPyAqLworCXhmc190cmFuc190CQkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisKKwkvKgorCSAqIFRoZXJlJ3MgbW9yZSB0aGFuIGEgbGVhZiBsZXZlbCBpbiB0aGUgYnRyZWUsIHNvIHRoZXJlIG11c3QKKwkgKiBiZSBtdWx0aXBsZSBsZWFmbiBibG9ja3MuICBHaXZlIHVwLgorCSAqLworCWlmIChzdGF0ZS0+cGF0aC5hY3RpdmUgPiAxKQorCQlyZXR1cm4gMDsKKwlhcmdzID0gc3RhdGUtPmFyZ3M7CisJeGZzX2RpcjJfdHJhY2VfYXJncygibm9kZV90b19sZWFmIiwgYXJncyk7CisJbXAgPSBzdGF0ZS0+bXA7CisJZHAgPSBhcmdzLT5kcDsKKwl0cCA9IGFyZ3MtPnRyYW5zOworCS8qCisJICogR2V0IHRoZSBsYXN0IG9mZnNldCBpbiB0aGUgZmlsZS4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2JtYXBfbGFzdF9vZmZzZXQodHAsIGRwLCAmZm8sIFhGU19EQVRBX0ZPUkspKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCWZvIC09IG1wLT5tX2RpcmJsa2ZzYnM7CisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgZnJlZXNwYWNlIGJsb2NrcyBvdGhlciB0aGFuIHRoZSBmaXJzdCBvbmUsCisJICogdGFrZSB0aGlzIG9wcG9ydHVuaXR5IHRvIHJlbW92ZSB0cmFpbGluZyBlbXB0eSBmcmVlc3BhY2UgYmxvY2tzCisJICogdGhhdCBtYXkgaGF2ZSBiZWVuIGxlZnQgYmVoaW5kIGR1cmluZyBuby1zcGFjZS1yZXNlcnZhdGlvbgorCSAqIG9wZXJhdGlvbnMuCisJICovCisJd2hpbGUgKGZvID4gbXAtPm1fZGlyZnJlZWJsaykgeworCQlpZiAoKGVycm9yID0geGZzX2RpcjJfbm9kZV90cmltX2ZyZWUoYXJncywgZm8sICZydmFsKSkpIHsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlpZiAocnZhbCkKKwkJCWZvIC09IG1wLT5tX2RpcmJsa2ZzYnM7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKwkvKgorCSAqIE5vdyBmaW5kIHRoZSBibG9jayBqdXN0IGJlZm9yZSB0aGUgZnJlZXNwYWNlIGJsb2NrLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfYm1hcF9sYXN0X2JlZm9yZSh0cCwgZHAsICZmbywgWEZTX0RBVEFfRk9SSykpKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBJZiBpdCdzIG5vdCB0aGUgc2luZ2xlIGxlYWYgYmxvY2ssIGdpdmUgdXAuCisJICovCisJaWYgKFhGU19GU0JfVE9fQihtcCwgZm8pID4gWEZTX0RJUjJfTEVBRl9PRkZTRVQgKyBtcC0+bV9kaXJibGtzaXplKQorCQlyZXR1cm4gMDsKKwlsYnAgPSBzdGF0ZS0+cGF0aC5ibGtbMF0uYnA7CisJbGVhZiA9IGxicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQyk7CisJLyoKKwkgKiBSZWFkIHRoZSBmcmVlc3BhY2UgYmxvY2suCisJICovCisJaWYgKChlcnJvciA9IHhmc19kYV9yZWFkX2J1Zih0cCwgZHAsIG1wLT5tX2RpcmZyZWVibGssIC0xLCAmZmJwLAorCQkJWEZTX0RBVEFfRk9SSykpKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJZnJlZSA9IGZicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChmcmVlLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfRlJFRV9NQUdJQyk7CisJQVNTRVJUKCFmcmVlLT5oZHIuZmlyc3RkYik7CisJLyoKKwkgKiBOb3cgc2VlIGlmIHRoZSBsZWFmbiBhbmQgZnJlZSBkYXRhIHdpbGwgZml0IGluIGEgbGVhZjEuCisJICogSWYgbm90LCByZWxlYXNlIHRoZSBidWZmZXIgYW5kIGdpdmUgdXAuCisJICovCisJaWYgKCh1aW50KXNpemVvZihsZWFmLT5oZHIpICsKKwkgICAgKElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gSU5UX0dFVChsZWFmLT5oZHIuc3RhbGUsIEFSQ0hfQ09OVkVSVCkpICogKHVpbnQpc2l6ZW9mKGxlYWYtPmVudHNbMF0pICsKKwkgICAgSU5UX0dFVChmcmVlLT5oZHIubnZhbGlkLCBBUkNIX0NPTlZFUlQpICogKHVpbnQpc2l6ZW9mKGxlYWYtPmJlc3RzWzBdKSArCisJICAgICh1aW50KXNpemVvZihsZWFmLT50YWlsKSA+CisJICAgIG1wLT5tX2RpcmJsa3NpemUpIHsKKwkJeGZzX2RhX2JyZWxzZSh0cCwgZmJwKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogSWYgdGhlIGxlYWYgaGFzIGFueSBzdGFsZSBlbnRyaWVzIGluIGl0LCBjb21wcmVzcyB0aGVtIG91dC4KKwkgKiBUaGUgY29tcGFjdCByb3V0aW5lIHdpbGwgbG9nIHRoZSBoZWFkZXIuCisJICovCisJaWYgKElOVF9HRVQobGVhZi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQpKQorCQl4ZnNfZGlyMl9sZWFmX2NvbXBhY3QoYXJncywgbGJwKTsKKwllbHNlCisJCXhmc19kaXIyX2xlYWZfbG9nX2hlYWRlcih0cCwgbGJwKTsKKwlJTlRfU0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19ESVIyX0xFQUYxX01BR0lDKTsKKwkvKgorCSAqIFNldCB1cCB0aGUgbGVhZiB0YWlsIGZyb20gdGhlIGZyZWVzcGFjZSBibG9jay4KKwkgKi8KKwlsdHAgPSBYRlNfRElSMl9MRUFGX1RBSUxfUChtcCwgbGVhZik7CisJSU5UX0NPUFkobHRwLT5iZXN0Y291bnQsIGZyZWUtPmhkci5udmFsaWQsIEFSQ0hfQ09OVkVSVCk7CisJLyoKKwkgKiBTZXQgdXAgdGhlIGxlYWYgYmVzdHMgdGFibGUuCisJICovCisJbWVtY3B5KFhGU19ESVIyX0xFQUZfQkVTVFNfUChsdHApLCBmcmVlLT5iZXN0cywKKwkJSU5UX0dFVChsdHAtPmJlc3Rjb3VudCwgQVJDSF9DT05WRVJUKSAqIHNpemVvZihsZWFmLT5iZXN0c1swXSkpOworCXhmc19kaXIyX2xlYWZfbG9nX2Jlc3RzKHRwLCBsYnAsIDAsIElOVF9HRVQobHRwLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxKTsKKwl4ZnNfZGlyMl9sZWFmX2xvZ190YWlsKHRwLCBsYnApOworCXhmc19kaXIyX2xlYWZfY2hlY2soZHAsIGxicCk7CisJLyoKKwkgKiBHZXQgcmlkIG9mIHRoZSBmcmVlc3BhY2UgYmxvY2suCisJICovCisJZXJyb3IgPSB4ZnNfZGlyMl9zaHJpbmtfaW5vZGUoYXJncywgWEZTX0RJUjJfRlJFRV9GSVJTVERCKG1wKSwgZmJwKTsKKwlpZiAoZXJyb3IpIHsKKwkJLyoKKwkJICogVGhpcyBjYW4ndCBmYWlsIGhlcmUgYmVjYXVzZSBpdCBjYW4gb25seSBoYXBwZW4gd2hlbgorCQkgKiBwdW5jaGluZyBvdXQgdGhlIG1pZGRsZSBvZiBhbiBleHRlbnQsIGFuZCB0aGlzIGlzIGFuCisJCSAqIGlzb2xhdGVkIGJsb2NrLgorCQkgKi8KKwkJQVNTRVJUKGVycm9yICE9IEVOT1NQQyk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJZmJwID0gTlVMTDsKKwkvKgorCSAqIE5vdyBzZWUgaWYgd2UgY2FuIGNvbnZlcnQgdGhlIHNpbmdsZS1sZWFmIGRpcmVjdG9yeQorCSAqIGRvd24gdG8gYSBibG9jayBmb3JtIGRpcmVjdG9yeS4KKwkgKiBUaGlzIHJvdXRpbmUgYWx3YXlzIGtpbGxzIHRoZSBkYWJ1ZiBmb3IgdGhlIGxlYWYsIHNvCisJICogZWxpbWluYXRlIGl0IGZyb20gdGhlIHBhdGguCisJICovCisJZXJyb3IgPSB4ZnNfZGlyMl9sZWFmX3RvX2Jsb2NrKGFyZ3MsIGxicCwgTlVMTCk7CisJc3RhdGUtPnBhdGguYmxrWzBdLmJwID0gTlVMTDsKKwlyZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjJfbGVhZi5oIGIvZnMveGZzL3hmc19kaXIyX2xlYWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjIwZWVlCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19kaXIyX2xlYWYuaApAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfRElSMl9MRUFGX0hfXworI2RlZmluZQlfX1hGU19ESVIyX0xFQUZfSF9fCisKKy8qCisgKiBEaXJlY3RvcnkgdmVyc2lvbiAyLCBsZWFmIGJsb2NrIHN0cnVjdHVyZXMuCisgKi8KKworc3RydWN0IHVpbzsKK3N0cnVjdCB4ZnNfZGFidWY7CitzdHJ1Y3QgeGZzX2RhX2FyZ3M7CitzdHJ1Y3QgeGZzX2lub2RlOworc3RydWN0IHhmc19tb3VudDsKK3N0cnVjdCB4ZnNfdHJhbnM7CisKKy8qCisgKiBDb25zdGFudHMuCisgKi8KKworLyoKKyAqIE9mZnNldCBvZiB0aGUgbGVhZi9ub2RlIHNwYWNlLiAgRmlyc3QgYmxvY2sgaW4gdGhpcyBzcGFjZQorICogaXMgdGhlIGJ0cmVlIHJvb3QuCisgKi8KKyNkZWZpbmUJWEZTX0RJUjJfTEVBRl9TUEFDRQkxCisjZGVmaW5lCVhGU19ESVIyX0xFQUZfT0ZGU0VUCShYRlNfRElSMl9MRUFGX1NQQUNFICogWEZTX0RJUjJfU1BBQ0VfU0laRSkKKyNkZWZpbmUJWEZTX0RJUjJfTEVBRl9GSVJTVERCKG1wKQlcCisJWEZTX0RJUjJfQllURV9UT19EQihtcCwgWEZTX0RJUjJfTEVBRl9PRkZTRVQpCisKKy8qCisgKiBUeXBlcy4KKyAqLworCisvKgorICogT2Zmc2V0IGluIGRhdGEgc3BhY2Ugb2YgYSBkYXRhIGVudHJ5LgorICovCit0eXBlZGVmCV9fdWludDMyX3QJeGZzX2RpcjJfZGF0YXB0cl90OworI2RlZmluZQlYRlNfRElSMl9NQVhfREFUQVBUUgkoKHhmc19kaXIyX2RhdGFwdHJfdCkweGZmZmZmZmZmKQorI2RlZmluZQlYRlNfRElSMl9OVUxMX0RBVEFQVFIJKCh4ZnNfZGlyMl9kYXRhcHRyX3QpMCkKKworLyoKKyAqIFN0cnVjdHVyZXMuCisgKi8KKworLyoKKyAqIExlYWYgYmxvY2sgaGVhZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9sZWFmX2hkciB7CisJeGZzX2RhX2Jsa2luZm9fdAlpbmZvOwkJLyogaGVhZGVyIGZvciBkYSByb3V0aW5lcyAqLworCV9fdWludDE2X3QJCWNvdW50OwkJLyogY291bnQgb2YgZW50cmllcyAqLworCV9fdWludDE2X3QJCXN0YWxlOwkJLyogY291bnQgb2Ygc3RhbGUgZW50cmllcyAqLworfSB4ZnNfZGlyMl9sZWFmX2hkcl90OworCisvKgorICogTGVhZiBibG9jayBlbnRyeS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfbGVhZl9lbnRyeSB7CisJeGZzX2RhaGFzaF90CQloYXNodmFsOwkvKiBoYXNoIHZhbHVlIG9mIG5hbWUgKi8KKwl4ZnNfZGlyMl9kYXRhcHRyX3QJYWRkcmVzczsJLyogYWRkcmVzcyBvZiBkYXRhIGVudHJ5ICovCit9IHhmc19kaXIyX2xlYWZfZW50cnlfdDsKKworLyoKKyAqIExlYWYgYmxvY2sgdGFpbC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfbGVhZl90YWlsIHsKKwlfX3VpbnQzMl90CQliZXN0Y291bnQ7Cit9IHhmc19kaXIyX2xlYWZfdGFpbF90OworCisvKgorICogTGVhZiBibG9jay4KKyAqIGJlc3RzIGFuZCB0YWlsIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBibG9jayBmb3Igc2luZ2xlLWxlYWYgb25seQorICogKG1hZ2ljID0gWEZTX0RJUjJfTEVBRjFfTUFHSUMgbm90IFhGU19ESVIyX0xFQUZOX01BR0lDKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfbGVhZiB7CisJeGZzX2RpcjJfbGVhZl9oZHJfdAloZHI7CQkvKiBsZWFmIGhlYWRlciAqLworCXhmc19kaXIyX2xlYWZfZW50cnlfdAllbnRzWzFdOwkvKiBlbnRyaWVzICovCisJCQkJCQkvKiAuLi4gKi8KKwl4ZnNfZGlyMl9kYXRhX29mZl90CWJlc3RzWzFdOwkvKiBiZXN0IGZyZWUgY291bnRzICovCisJeGZzX2RpcjJfbGVhZl90YWlsX3QJdGFpbDsJCS8qIGxlYWYgdGFpbCAqLworfSB4ZnNfZGlyMl9sZWFmX3Q7CisKKy8qCisgKiBNYWNyb3MuCisgKiBUaGUgREIgYmxvY2tzIGFyZSBsb2dpY2FsIGRpcmVjdG9yeSBibG9jayBudW1iZXJzLCBub3QgZmlsZXN5c3RlbSBibG9ja3MuCisgKi8KKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9NQVhfTEVBRl9FTlRTKQoraW50Cit4ZnNfZGlyMl9tYXhfbGVhZl9lbnRzKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX0RJUjJfTUFYX0xFQUZfRU5UUyhtcCkJXAorCXhmc19kaXIyX21heF9sZWFmX2VudHMobXApCisjZWxzZQorI2RlZmluZQlYRlNfRElSMl9NQVhfTEVBRl9FTlRTKG1wKQlcCisJKChpbnQpKCgobXApLT5tX2RpcmJsa3NpemUgLSAodWludClzaXplb2YoeGZzX2RpcjJfbGVhZl9oZHJfdCkpIC8gXAorCSAgICAgICAodWludClzaXplb2YoeGZzX2RpcjJfbGVhZl9lbnRyeV90KSkpCisjZW5kaWYKKworLyoKKyAqIEdldCBhZGRyZXNzIG9mIHRoZSBiZXN0Y291bnQgZmllbGQgaW4gdGhlIHNpbmdsZS1sZWFmIGJsb2NrLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX0xFQUZfVEFJTF9QKQoreGZzX2RpcjJfbGVhZl90YWlsX3QgKgoreGZzX2RpcjJfbGVhZl90YWlsX3Aoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX2xlYWZfdCAqbHApOworI2RlZmluZQlYRlNfRElSMl9MRUFGX1RBSUxfUChtcCxscCkJXAorCXhmc19kaXIyX2xlYWZfdGFpbF9wKG1wLCBscCkKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX0xFQUZfVEFJTF9QKG1wLGxwKQlcCisJKCh4ZnNfZGlyMl9sZWFmX3RhaWxfdCAqKVwKKwkgKChjaGFyICopKGxwKSArIChtcCktPm1fZGlyYmxrc2l6ZSAtIFwKKwkgICh1aW50KXNpemVvZih4ZnNfZGlyMl9sZWFmX3RhaWxfdCkpKQorI2VuZGlmCisKKy8qCisgKiBHZXQgYWRkcmVzcyBvZiB0aGUgYmVzdHMgYXJyYXkgaW4gdGhlIHNpbmdsZS1sZWFmIGJsb2NrLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX0xFQUZfQkVTVFNfUCkKK3hmc19kaXIyX2RhdGFfb2ZmX3QgKgoreGZzX2RpcjJfbGVhZl9iZXN0c19wKHhmc19kaXIyX2xlYWZfdGFpbF90ICpsdHApOworI2RlZmluZQlYRlNfRElSMl9MRUFGX0JFU1RTX1AobHRwKQl4ZnNfZGlyMl9sZWFmX2Jlc3RzX3AobHRwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfTEVBRl9CRVNUU19QKGx0cCkJXAorCSgoeGZzX2RpcjJfZGF0YV9vZmZfdCAqKShsdHApIC0gSU5UX0dFVCgobHRwKS0+YmVzdGNvdW50LCBBUkNIX0NPTlZFUlQpKQorI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IGRhdGFwdHIgdG8gYnl0ZSBpbiBmaWxlIHNwYWNlCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfREFUQVBUUl9UT19CWVRFKQoreGZzX2RpcjJfb2ZmX3QKK3hmc19kaXIyX2RhdGFwdHJfdG9fYnl0ZShzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGF0YXB0cl90IGRwKTsKKyNkZWZpbmUJWEZTX0RJUjJfREFUQVBUUl9UT19CWVRFKG1wLGRwKQl4ZnNfZGlyMl9kYXRhcHRyX3RvX2J5dGUobXAsIGRwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfREFUQVBUUl9UT19CWVRFKG1wLGRwKQlcCisJKCh4ZnNfZGlyMl9vZmZfdCkoZHApIDw8IFhGU19ESVIyX0RBVEFfQUxJR05fTE9HKQorI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IGJ5dGUgaW4gZmlsZSBzcGFjZSB0byBkYXRhcHRyLiAgSXQgaGFkIGJldHRlciBiZSBhbGlnbmVkLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX0JZVEVfVE9fREFUQVBUUikKK3hmc19kaXIyX2RhdGFwdHJfdAoreGZzX2RpcjJfYnl0ZV90b19kYXRhcHRyKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9vZmZfdCBieSk7CisjZGVmaW5lCVhGU19ESVIyX0JZVEVfVE9fREFUQVBUUihtcCxieSkJeGZzX2RpcjJfYnl0ZV90b19kYXRhcHRyKG1wLGJ5KQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfQllURV9UT19EQVRBUFRSKG1wLGJ5KQlcCisJKCh4ZnNfZGlyMl9kYXRhcHRyX3QpKChieSkgPj4gWEZTX0RJUjJfREFUQV9BTElHTl9MT0cpKQorI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IGRhdGFwdHIgdG8gYSBibG9jayBudW1iZXIKKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9EQVRBUFRSX1RPX0RCKQoreGZzX2RpcjJfZGJfdAoreGZzX2RpcjJfZGF0YXB0cl90b19kYihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGF0YXB0cl90IGRwKTsKKyNkZWZpbmUJWEZTX0RJUjJfREFUQVBUUl9UT19EQihtcCxkcCkJeGZzX2RpcjJfZGF0YXB0cl90b19kYihtcCwgZHApCisjZWxzZQorI2RlZmluZQlYRlNfRElSMl9EQVRBUFRSX1RPX0RCKG1wLGRwKQlcCisJWEZTX0RJUjJfQllURV9UT19EQihtcCwgWEZTX0RJUjJfREFUQVBUUl9UT19CWVRFKG1wLCBkcCkpCisjZW5kaWYKKworLyoKKyAqIENvbnZlcnQgZGF0YXB0ciB0byBhIGJ5dGUgb2Zmc2V0IGluIGEgYmxvY2sKKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9EQVRBUFRSX1RPX09GRikKK3hmc19kaXIyX2RhdGFfYW9mZl90Cit4ZnNfZGlyMl9kYXRhcHRyX3RvX29mZihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGF0YXB0cl90IGRwKTsKKyNkZWZpbmUJWEZTX0RJUjJfREFUQVBUUl9UT19PRkYobXAsZHApCXhmc19kaXIyX2RhdGFwdHJfdG9fb2ZmKG1wLCBkcCkKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX0RBVEFQVFJfVE9fT0ZGKG1wLGRwKQlcCisJWEZTX0RJUjJfQllURV9UT19PRkYobXAsIFhGU19ESVIyX0RBVEFQVFJfVE9fQllURShtcCwgZHApKQorI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IGJsb2NrIGFuZCBvZmZzZXQgdG8gYnl0ZSBpbiBzcGFjZQorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX0RCX09GRl9UT19CWVRFKQoreGZzX2RpcjJfb2ZmX3QKK3hmc19kaXIyX2RiX29mZl90b19ieXRlKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9kYl90IGRiLAorCQkJeGZzX2RpcjJfZGF0YV9hb2ZmX3Qgbyk7CisjZGVmaW5lCVhGU19ESVIyX0RCX09GRl9UT19CWVRFKG1wLGRiLG8pCVwKKwl4ZnNfZGlyMl9kYl9vZmZfdG9fYnl0ZShtcCwgZGIsIG8pCisjZWxzZQorI2RlZmluZQlYRlNfRElSMl9EQl9PRkZfVE9fQllURShtcCxkYixvKQlcCisJKCgoeGZzX2RpcjJfb2ZmX3QpKGRiKSA8PCBcCisJICgobXApLT5tX3NiLnNiX2Jsb2NrbG9nICsgKG1wKS0+bV9zYi5zYl9kaXJibGtsb2cpKSArIChvKSkKKyNlbmRpZgorCisvKgorICogQ29udmVydCBieXRlIGluIHNwYWNlIHRvIChEQikgYmxvY2sKKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9CWVRFX1RPX0RCKQoreGZzX2RpcjJfZGJfdCB4ZnNfZGlyMl9ieXRlX3RvX2RiKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9vZmZfdCBieSk7CisjZGVmaW5lCVhGU19ESVIyX0JZVEVfVE9fREIobXAsYnkpCXhmc19kaXIyX2J5dGVfdG9fZGIobXAsIGJ5KQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfQllURV9UT19EQihtcCxieSkJXAorCSgoeGZzX2RpcjJfZGJfdCkoKGJ5KSA+PiBcCisJCQkgKChtcCktPm1fc2Iuc2JfYmxvY2tsb2cgKyAobXApLT5tX3NiLnNiX2RpcmJsa2xvZykpKQorI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IGJ5dGUgaW4gc3BhY2UgdG8gKERBKSBibG9jaworICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX0JZVEVfVE9fREEpCit4ZnNfZGFibGtfdCB4ZnNfZGlyMl9ieXRlX3RvX2RhKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9vZmZfdCBieSk7CisjZGVmaW5lCVhGU19ESVIyX0JZVEVfVE9fREEobXAsYnkpCXhmc19kaXIyX2J5dGVfdG9fZGEobXAsIGJ5KQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfQllURV9UT19EQShtcCxieSkJXAorCVhGU19ESVIyX0RCX1RPX0RBKG1wLCBYRlNfRElSMl9CWVRFX1RPX0RCKG1wLCBieSkpCisjZW5kaWYKKworLyoKKyAqIENvbnZlcnQgYnl0ZSBpbiBzcGFjZSB0byBvZmZzZXQgaW4gYSBibG9jaworICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX0JZVEVfVE9fT0ZGKQoreGZzX2RpcjJfZGF0YV9hb2ZmX3QKK3hmc19kaXIyX2J5dGVfdG9fb2ZmKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9vZmZfdCBieSk7CisjZGVmaW5lCVhGU19ESVIyX0JZVEVfVE9fT0ZGKG1wLGJ5KQl4ZnNfZGlyMl9ieXRlX3RvX29mZihtcCwgYnkpCisjZWxzZQorI2RlZmluZQlYRlNfRElSMl9CWVRFX1RPX09GRihtcCxieSkJXAorCSgoeGZzX2RpcjJfZGF0YV9hb2ZmX3QpKChieSkgJiBcCisJCQkJKCgxIDw8ICgobXApLT5tX3NiLnNiX2Jsb2NrbG9nICsgXAorCQkJCQkobXApLT5tX3NiLnNiX2RpcmJsa2xvZykpIC0gMSkpKQorI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IGJsb2NrIGFuZCBvZmZzZXQgdG8gZGF0YXB0cgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX0RCX09GRl9UT19EQVRBUFRSKQoreGZzX2RpcjJfZGF0YXB0cl90Cit4ZnNfZGlyMl9kYl9vZmZfdG9fZGF0YXB0cihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGJfdCBkYiwKKwkJCSAgIHhmc19kaXIyX2RhdGFfYW9mZl90IG8pOworI2RlZmluZQlYRlNfRElSMl9EQl9PRkZfVE9fREFUQVBUUihtcCxkYixvKQlcCisJeGZzX2RpcjJfZGJfb2ZmX3RvX2RhdGFwdHIobXAsIGRiLCBvKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfREJfT0ZGX1RPX0RBVEFQVFIobXAsZGIsbykJXAorCVhGU19ESVIyX0JZVEVfVE9fREFUQVBUUihtcCwgWEZTX0RJUjJfREJfT0ZGX1RPX0JZVEUobXAsIGRiLCBvKSkKKyNlbmRpZgorCisvKgorICogQ29udmVydCBibG9jayAoREIpIHRvIGJsb2NrIChkYWJsaykKKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9EQl9UT19EQSkKK3hmc19kYWJsa190IHhmc19kaXIyX2RiX3RvX2RhKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9kYl90IGRiKTsKKyNkZWZpbmUJWEZTX0RJUjJfREJfVE9fREEobXAsZGIpCXhmc19kaXIyX2RiX3RvX2RhKG1wLCBkYikKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX0RCX1RPX0RBKG1wLGRiKQlcCisJKCh4ZnNfZGFibGtfdCkoKGRiKSA8PCAobXApLT5tX3NiLnNiX2RpcmJsa2xvZykpCisjZW5kaWYKKworLyoKKyAqIENvbnZlcnQgYmxvY2sgKGRhYmxrKSB0byBibG9jayAoREIpCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfREFfVE9fREIpCit4ZnNfZGlyMl9kYl90IHhmc19kaXIyX2RhX3RvX2RiKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGFibGtfdCBkYSk7CisjZGVmaW5lCVhGU19ESVIyX0RBX1RPX0RCKG1wLGRhKQl4ZnNfZGlyMl9kYV90b19kYihtcCwgZGEpCisjZWxzZQorI2RlZmluZQlYRlNfRElSMl9EQV9UT19EQihtcCxkYSkJXAorCSgoeGZzX2RpcjJfZGJfdCkoKGRhKSA+PiAobXApLT5tX3NiLnNiX2RpcmJsa2xvZykpCisjZW5kaWYKKworLyoKKyAqIENvbnZlcnQgYmxvY2sgKGRhYmxrKSB0byBieXRlIG9mZnNldCBpbiBzcGFjZQorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX0RBX1RPX0JZVEUpCit4ZnNfZGlyMl9vZmZfdCB4ZnNfZGlyMl9kYV90b19ieXRlKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGFibGtfdCBkYSk7CisjZGVmaW5lIFhGU19ESVIyX0RBX1RPX0JZVEUobXAsZGEpCXhmc19kaXIyX2RhX3RvX2J5dGUobXAsIGRhKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfREFfVE9fQllURShtcCxkYSkJXAorCVhGU19ESVIyX0RCX09GRl9UT19CWVRFKG1wLCBYRlNfRElSMl9EQV9UT19EQihtcCwgZGEpLCAwKQorI2VuZGlmCisKKy8qCisgKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMuCisgKi8KKworZXh0ZXJuIGludAorCXhmc19kaXIyX2Jsb2NrX3RvX2xlYWYoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCBzdHJ1Y3QgeGZzX2RhYnVmICpkYnApOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfbGVhZl9hZGRuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CisKK2V4dGVybiB2b2lkCisJeGZzX2RpcjJfbGVhZl9jb21wYWN0KHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgc3RydWN0IHhmc19kYWJ1ZiAqYnApOworCitleHRlcm4gdm9pZAorCXhmc19kaXIyX2xlYWZfY29tcGFjdF94MShzdHJ1Y3QgeGZzX2RhYnVmICpicCwgaW50ICppbmRleHAsCisJCQkJIGludCAqbG93c3RhbGVwLCBpbnQgKmhpZ2hzdGFsZXAsIGludCAqbG93bG9ncCwKKwkJCQkgaW50ICpoaWdobG9ncCk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9sZWFmX2dldGRlbnRzKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKKwkJCSAgICAgICBzdHJ1Y3QgdWlvICp1aW8sIGludCAqZW9mcCwgc3RydWN0IHhmc19kaXJlbnQgKmRicCwKKwkJCSAgICAgICB4ZnNfZGlyMl9wdXRfdCBwdXQpOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfbGVhZl9pbml0KHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgeGZzX2RpcjJfZGJfdCBibm8sCisJCQkgICBzdHJ1Y3QgeGZzX2RhYnVmICoqYnBwLCBpbnQgbWFnaWMpOworCitleHRlcm4gdm9pZAorCXhmc19kaXIyX2xlYWZfbG9nX2VudHMoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfZGFidWYgKmJwLAorCQkJICAgICAgIGludCBmaXJzdCwgaW50IGxhc3QpOworCitleHRlcm4gdm9pZAorCXhmc19kaXIyX2xlYWZfbG9nX2Jlc3RzKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCwKKwkJCQlpbnQgZmlyc3QsIGludCBsYXN0KTsKKworZXh0ZXJuIHZvaWQKKwl4ZnNfZGlyMl9sZWFmX2xvZ19oZWFkZXIoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfZGFidWYgKmJwKTsKKworZXh0ZXJuIHZvaWQKKwl4ZnNfZGlyMl9sZWFmX2xvZ190YWlsKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9sZWFmX2xvb2t1cChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfbGVhZl9yZW1vdmVuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9sZWFmX3JlcGxhY2Uoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX2xlYWZfc2VhcmNoX2hhc2goc3RydWN0IHhmc19kYV9hcmdzICphcmdzLAorCQkJCSAgc3RydWN0IHhmc19kYWJ1ZiAqbGJwKTsKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9sZWFmX3RyaW1fZGF0YShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIHN0cnVjdCB4ZnNfZGFidWYgKmxicCwJCQkJeGZzX2RpcjJfZGJfdCBkYik7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9ub2RlX3RvX2xlYWYoc3RydWN0IHhmc19kYV9zdGF0ZSAqc3RhdGUpOworCisjZW5kaWYJLyogX19YRlNfRElSMl9MRUFGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX25vZGUuYyBiL2ZzL3hmcy94ZnNfZGlyMl9ub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc2MTVkOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZGlyMl9ub2RlLmMKQEAgLTAsMCArMSwyMDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisvKgorICogeGZzX2RpcjJfbm9kZS5jCisgKiBYRlMgZGlyZWN0b3J5IGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDIsIG5vZGUgZm9ybSBmaWxlcworICogU2VlIGRhdGEgc3RydWN0dXJlcyBpbiB4ZnNfZGlyMl9ub2RlLmggYW5kIHhmc19kYV9idHJlZS5oLgorICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKworI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfZGF0YS5oIgorI2luY2x1ZGUgInhmc19kaXIyX2xlYWYuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9ibG9jay5oIgorI2luY2x1ZGUgInhmc19kaXIyX25vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl90cmFjZS5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorCisvKgorICogRnVuY3Rpb24gZGVjbGFyYXRpb25zLgorICovCitzdGF0aWMgdm9pZCB4ZnNfZGlyMl9mcmVlX2xvZ19oZWFkZXIoeGZzX3RyYW5zX3QgKnRwLCB4ZnNfZGFidWZfdCAqYnApOworc3RhdGljIGludCB4ZnNfZGlyMl9sZWFmbl9hZGQoeGZzX2RhYnVmX3QgKmJwLCB4ZnNfZGFfYXJnc190ICphcmdzLCBpbnQgaW5kZXgpOworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCB4ZnNfZGlyMl9sZWFmbl9jaGVjayh4ZnNfaW5vZGVfdCAqZHAsIHhmc19kYWJ1Zl90ICpicCk7CisjZWxzZQorI2RlZmluZQl4ZnNfZGlyMl9sZWFmbl9jaGVjayhkcCwgYnApCisjZW5kaWYKK3N0YXRpYyB2b2lkIHhmc19kaXIyX2xlYWZuX21vdmVlbnRzKHhmc19kYV9hcmdzX3QgKmFyZ3MsIHhmc19kYWJ1Zl90ICpicF9zLAorCQkJCSAgICBpbnQgc3RhcnRfcywgeGZzX2RhYnVmX3QgKmJwX2QsIGludCBzdGFydF9kLAorCQkJCSAgICBpbnQgY291bnQpOworc3RhdGljIHZvaWQgeGZzX2RpcjJfbGVhZm5fcmViYWxhbmNlKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwKKwkJCQkgICAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrMSwKKwkJCQkgICAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrMik7CitzdGF0aWMgaW50IHhmc19kaXIyX2xlYWZuX3JlbW92ZSh4ZnNfZGFfYXJnc190ICphcmdzLCB4ZnNfZGFidWZfdCAqYnAsCisJCQkJIGludCBpbmRleCwgeGZzX2RhX3N0YXRlX2Jsa190ICpkYmxrLAorCQkJCSBpbnQgKnJ2YWwpOworc3RhdGljIGludCB4ZnNfZGlyMl9ub2RlX2FkZG5hbWVfaW50KHhmc19kYV9hcmdzX3QgKmFyZ3MsCisJCQkJICAgICB4ZnNfZGFfc3RhdGVfYmxrX3QgKmZibGspOworCisvKgorICogTG9nIGVudHJpZXMgZnJvbSBhIGZyZWVzcGFjZSBibG9jay4KKyAqLwordm9pZAoreGZzX2RpcjJfZnJlZV9sb2dfYmVzdHMoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfZGFidWZfdAkJKmJwLAkJLyogZnJlZXNwYWNlIGJ1ZmZlciAqLworCWludAkJCWZpcnN0LAkJLyogZmlyc3QgZW50cnkgdG8gbG9nICovCisJaW50CQkJbGFzdCkJCS8qIGxhc3QgZW50cnkgdG8gbG9nICovCit7CisJeGZzX2RpcjJfZnJlZV90CQkqZnJlZTsJCS8qIGZyZWVzcGFjZSBzdHJ1Y3R1cmUgKi8KKworCWZyZWUgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChmcmVlLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfRlJFRV9NQUdJQyk7CisJeGZzX2RhX2xvZ19idWYodHAsIGJwLAorCQkodWludCkoKGNoYXIgKikmZnJlZS0+YmVzdHNbZmlyc3RdIC0gKGNoYXIgKilmcmVlKSwKKwkJKHVpbnQpKChjaGFyICopJmZyZWUtPmJlc3RzW2xhc3RdIC0gKGNoYXIgKilmcmVlICsKKwkJICAgICAgIHNpemVvZihmcmVlLT5iZXN0c1swXSkgLSAxKSk7Cit9CisKKy8qCisgKiBMb2cgaGVhZGVyIGZyb20gYSBmcmVlc3BhY2UgYmxvY2suCisgKi8KK3N0YXRpYyB2b2lkCit4ZnNfZGlyMl9mcmVlX2xvZ19oZWFkZXIoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfZGFidWZfdAkJKmJwKQkJLyogZnJlZXNwYWNlIGJ1ZmZlciAqLworeworCXhmc19kaXIyX2ZyZWVfdAkJKmZyZWU7CQkvKiBmcmVlc3BhY2Ugc3RydWN0dXJlICovCisKKwlmcmVlID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQoZnJlZS0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0ZSRUVfTUFHSUMpOworCXhmc19kYV9sb2dfYnVmKHRwLCBicCwgKHVpbnQpKChjaGFyICopJmZyZWUtPmhkciAtIChjaGFyICopZnJlZSksCisJCSh1aW50KShzaXplb2YoeGZzX2RpcjJfZnJlZV9oZHJfdCkgLSAxKSk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgbGVhZi1mb3JtYXQgZGlyZWN0b3J5IHRvIGEgbm9kZS1mb3JtYXQgZGlyZWN0b3J5LgorICogV2UgbmVlZCB0byBjaGFuZ2UgdGhlIG1hZ2ljIG51bWJlciBvZiB0aGUgbGVhZiBibG9jaywgYW5kIGNvcHkKKyAqIHRoZSBmcmVlc3BhY2UgdGFibGUgb3V0IG9mIHRoZSBsZWFmIGJsb2NrIGludG8gaXRzIG93biBibG9jay4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX2xlYWZfdG9fbm9kZSgKKwl4ZnNfZGFfYXJnc190CQkqYXJncywJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfZGFidWZfdAkJKmxicCkJCS8qIGxlYWYgYnVmZmVyICovCit7CisJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19kYWJ1Zl90CQkqZmJwOwkJLyogZnJlZXNwYWNlIGJ1ZmZlciAqLworCXhmc19kaXIyX2RiX3QJCWZkYjsJCS8qIGZyZWVzcGFjZSBibG9jayBudW1iZXIgKi8KKwl4ZnNfZGlyMl9mcmVlX3QJCSpmcmVlOwkJLyogZnJlZXNwYWNlIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2RhdGFfb2ZmX3QJKmZyb207CQkvKiBwb2ludGVyIHRvIGZyZWVzcGFjZSBlbnRyeSAqLworCWludAkJCWk7CQkvKiBsZWFmIGZyZWVzcGFjZSBpbmRleCAqLworCXhmc19kaXIyX2xlYWZfdAkJKmxlYWY7CQkvKiBsZWFmIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2xlYWZfdGFpbF90CSpsdHA7CQkvKiBsZWFmIHRhaWwgc3RydWN0dXJlICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwlpbnQJCQluOwkJLyogY291bnQgb2YgbGl2ZSBmcmVlc3BjIGVudHMgKi8KKwl4ZnNfZGlyMl9kYXRhX29mZl90CW9mZjsJCS8qIGZyZWVzcGFjZSBlbnRyeSB2YWx1ZSAqLworCXhmc19kaXIyX2RhdGFfb2ZmX3QJKnRvOwkJLyogcG9pbnRlciB0byBmcmVlc3BhY2UgZW50cnkgKi8KKwl4ZnNfdHJhbnNfdAkJKnRwOwkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCisJeGZzX2RpcjJfdHJhY2VfYXJnc19iKCJsZWFmX3RvX25vZGUiLCBhcmdzLCBsYnApOworCWRwID0gYXJncy0+ZHA7CisJbXAgPSBkcC0+aV9tb3VudDsKKwl0cCA9IGFyZ3MtPnRyYW5zOworCS8qCisJICogQWRkIGEgZnJlZXNwYWNlIGJsb2NrIHRvIHRoZSBkaXJlY3RvcnkuCisJICovCisJaWYgKChlcnJvciA9IHhmc19kaXIyX2dyb3dfaW5vZGUoYXJncywgWEZTX0RJUjJfRlJFRV9TUEFDRSwgJmZkYikpKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJQVNTRVJUKGZkYiA9PSBYRlNfRElSMl9GUkVFX0ZJUlNUREIobXApKTsKKwkvKgorCSAqIEdldCB0aGUgYnVmZmVyIGZvciB0aGUgbmV3IGZyZWVzcGFjZSBibG9jay4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2RhX2dldF9idWYodHAsIGRwLCBYRlNfRElSMl9EQl9UT19EQShtcCwgZmRiKSwgLTEsICZmYnAsCisJCQlYRlNfREFUQV9GT1JLKSkpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlBU1NFUlQoZmJwICE9IE5VTEwpOworCWZyZWUgPSBmYnAtPmRhdGE7CisJbGVhZiA9IGxicC0+ZGF0YTsKKwlsdHAgPSBYRlNfRElSMl9MRUFGX1RBSUxfUChtcCwgbGVhZik7CisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBmcmVlc3BhY2UgYmxvY2sgaGVhZGVyLgorCSAqLworCUlOVF9TRVQoZnJlZS0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19ESVIyX0ZSRUVfTUFHSUMpOworCWZyZWUtPmhkci5maXJzdGRiID0gMDsKKwlBU1NFUlQoSU5UX0dFVChsdHAtPmJlc3Rjb3VudCwgQVJDSF9DT05WRVJUKSA8PSAodWludClkcC0+aV9kLmRpX3NpemUgLyBtcC0+bV9kaXJibGtzaXplKTsKKwlJTlRfQ09QWShmcmVlLT5oZHIubnZhbGlkLCBsdHAtPmJlc3Rjb3VudCwgQVJDSF9DT05WRVJUKTsKKwkvKgorCSAqIENvcHkgZnJlZXNwYWNlIGVudHJpZXMgZnJvbSB0aGUgbGVhZiBibG9jayB0byB0aGUgbmV3IGJsb2NrLgorCSAqIENvdW50IGFjdGl2ZSBlbnRyaWVzLgorCSAqLworCWZvciAoaSA9IG4gPSAwLCBmcm9tID0gWEZTX0RJUjJfTEVBRl9CRVNUU19QKGx0cCksIHRvID0gZnJlZS0+YmVzdHM7CisJICAgICBpIDwgSU5UX0dFVChsdHAtPmJlc3Rjb3VudCwgQVJDSF9DT05WRVJUKTsgaSsrLCBmcm9tKyssIHRvKyspIHsKKwkJaWYgKChvZmYgPSBJTlRfR0VUKCpmcm9tLCBBUkNIX0NPTlZFUlQpKSAhPSBOVUxMREFUQU9GRikKKwkJCW4rKzsKKwkJSU5UX1NFVCgqdG8sIEFSQ0hfQ09OVkVSVCwgb2ZmKTsKKwl9CisJSU5UX1NFVChmcmVlLT5oZHIubnVzZWQsIEFSQ0hfQ09OVkVSVCwgbik7CisJSU5UX1NFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJULCBYRlNfRElSMl9MRUFGTl9NQUdJQyk7CisJLyoKKwkgKiBMb2cgZXZlcnl0aGluZy4KKwkgKi8KKwl4ZnNfZGlyMl9sZWFmX2xvZ19oZWFkZXIodHAsIGxicCk7CisJeGZzX2RpcjJfZnJlZV9sb2dfaGVhZGVyKHRwLCBmYnApOworCXhmc19kaXIyX2ZyZWVfbG9nX2Jlc3RzKHRwLCBmYnAsIDAsIElOVF9HRVQoZnJlZS0+aGRyLm52YWxpZCwgQVJDSF9DT05WRVJUKSAtIDEpOworCXhmc19kYV9idWZfZG9uZShmYnApOworCXhmc19kaXIyX2xlYWZuX2NoZWNrKGRwLCBsYnApOworCXJldHVybiAwOworfQorCisvKgorICogQWRkIGEgbGVhZiBlbnRyeSB0byBhIGxlYWYgYmxvY2sgaW4gYSBub2RlLWZvcm0gZGlyZWN0b3J5LgorICogVGhlIG90aGVyIHdvcmsgbmVjZXNzYXJ5IGlzIGRvbmUgZnJvbSB0aGUgY2FsbGVyLgorICovCitzdGF0aWMgaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfbGVhZm5fYWRkKAorCXhmc19kYWJ1Zl90CQkqYnAsCQkvKiBsZWFmIGJ1ZmZlciAqLworCXhmc19kYV9hcmdzX3QJCSphcmdzLAkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworCWludAkJCWluZGV4KQkJLyogaW5zZXJ0aW9uIHB0IGZvciBuZXcgZW50cnkgKi8KK3sKKwlpbnQJCQljb21wYWN0OwkvKiBjb21wYWN0aW5nIHN0YWxlIGxlYXZlcyAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQkJaGlnaHN0YWxlOwkvKiBuZXh0IHN0YWxlIGVudHJ5ICovCisJeGZzX2RpcjJfbGVhZl90CQkqbGVhZjsJCS8qIGxlYWYgc3RydWN0dXJlICovCisJeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpsZXA7CQkvKiBsZWFmIGVudHJ5ICovCisJaW50CQkJbGZsb2doaWdoOwkvKiBoaWdoIGxlYWYgZW50cnkgbG9nZ2luZyAqLworCWludAkJCWxmbG9nbG93OwkvKiBsb3cgbGVhZiBlbnRyeSBsb2dnaW5nICovCisJaW50CQkJbG93c3RhbGU7CS8qIHByZXZpb3VzIHN0YWxlIGVudHJ5ICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkJKnRwOwkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCisJeGZzX2RpcjJfdHJhY2VfYXJnc19zYigibGVhZm5fYWRkIiwgYXJncywgaW5kZXgsIGJwKTsKKwlkcCA9IGFyZ3MtPmRwOworCW1wID0gZHAtPmlfbW91bnQ7CisJdHAgPSBhcmdzLT50cmFuczsKKwlsZWFmID0gYnAtPmRhdGE7CisKKwkvKgorCSAqIFF1aWNrIGNoZWNrIGp1c3QgdG8gbWFrZSBzdXJlIHdlIGFyZSBub3QgZ29pbmcgdG8gaW5kZXgKKwkgKiBpbnRvIG90aGVyIHBlb3BsZXMgbWVtb3J5CisJICovCisJaWYgKGluZGV4IDwgMCkKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgYWxyZWFkeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGVhZiBlbnRyaWVzIGluCisJICogdGhlIGJsb2NrLCBpZiB0aGVyZSBhcmUgbm8gc3RhbGUgZW50cmllcyBpdCB3b24ndCBmaXQuCisJICogQ2FsbGVyIHdpbGwgZG8gYSBzcGxpdC4gIElmIHRoZXJlIGFyZSBzdGFsZSBlbnRyaWVzIHdlJ2xsIGRvCisJICogYSBjb21wYWN0LgorCSAqLworCisJaWYgKElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX01BWF9MRUFGX0VOVFMobXApKSB7CisJCWlmICghbGVhZi0+aGRyLnN0YWxlKQorCQkJcmV0dXJuIFhGU19FUlJPUihFTk9TUEMpOworCQljb21wYWN0ID0gSU5UX0dFVChsZWFmLT5oZHIuc3RhbGUsIEFSQ0hfQ09OVkVSVCkgPiAxOworCX0gZWxzZQorCQljb21wYWN0ID0gMDsKKwlBU1NFUlQoaW5kZXggPT0gMCB8fCBJTlRfR0VUKGxlYWYtPmVudHNbaW5kZXggLSAxXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpIDw9IGFyZ3MtPmhhc2h2YWwpOworCUFTU0VSVChpbmRleCA9PSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSB8fAorCSAgICAgICBJTlRfR0VUKGxlYWYtPmVudHNbaW5kZXhdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPj0gYXJncy0+aGFzaHZhbCk7CisKKwlpZiAoYXJncy0+anVzdGNoZWNrKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogQ29tcGFjdCBvdXQgYWxsIGJ1dCBvbmUgc3RhbGUgbGVhZiBlbnRyeS4gIExlYXZlcyBiZWhpbmQKKwkgKiB0aGUgZW50cnkgY2xvc2VzdCB0byBpbmRleC4KKwkgKi8KKwlpZiAoY29tcGFjdCkgeworCQl4ZnNfZGlyMl9sZWFmX2NvbXBhY3RfeDEoYnAsICZpbmRleCwgJmxvd3N0YWxlLCAmaGlnaHN0YWxlLAorCQkJJmxmbG9nbG93LCAmbGZsb2doaWdoKTsKKwl9CisJLyoKKwkgKiBTZXQgaW1wb3NzaWJsZSBsb2dnaW5nIGluZGljZXMgZm9yIHRoaXMgY2FzZS4KKwkgKi8KKwllbHNlIGlmIChsZWFmLT5oZHIuc3RhbGUpIHsKKwkJbGZsb2dsb3cgPSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJbGZsb2doaWdoID0gLTE7CisJfQorCS8qCisJICogTm8gc3RhbGUgZW50cmllcywganVzdCBpbnNlcnQgYSBzcGFjZSBmb3IgdGhlIG5ldyBlbnRyeS4KKwkgKi8KKwlpZiAoIWxlYWYtPmhkci5zdGFsZSkgeworCQlsZXAgPSAmbGVhZi0+ZW50c1tpbmRleF07CisJCWlmIChpbmRleCA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKQorCQkJbWVtbW92ZShsZXAgKyAxLCBsZXAsCisJCQkJKElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gaW5kZXgpICogc2l6ZW9mKCpsZXApKTsKKwkJbGZsb2dsb3cgPSBpbmRleDsKKwkJbGZsb2doaWdoID0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCUlOVF9NT0QobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQsICsxKTsKKwl9CisJLyoKKwkgKiBUaGVyZSBhcmUgc3RhbGUgZW50cmllcy4gIFdlJ2xsIHVzZSBvbmUgZm9yIHRoZSBuZXcgZW50cnkuCisJICovCisJZWxzZSB7CisJCS8qCisJCSAqIElmIHdlIGRpZG4ndCBkbyBhIGNvbXBhY3QgdGhlbiB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQKKwkJICogd2hpY2ggc3RhbGUgZW50cnkgd2lsbCBiZSB1c2VkLgorCQkgKi8KKwkJaWYgKGNvbXBhY3QgPT0gMCkgeworCQkJLyoKKwkJCSAqIEZpbmQgZmlyc3Qgc3RhbGUgZW50cnkgYmVmb3JlIG91ciBpbnNlcnRpb24gcG9pbnQuCisJCQkgKi8KKwkJCWZvciAobG93c3RhbGUgPSBpbmRleCAtIDE7CisJCQkgICAgIGxvd3N0YWxlID49IDAgJiYKKwkJCQlJTlRfR0VUKGxlYWYtPmVudHNbbG93c3RhbGVdLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkgIT0KKwkJCQlYRlNfRElSMl9OVUxMX0RBVEFQVFI7CisJCQkgICAgIGxvd3N0YWxlLS0pCisJCQkJY29udGludWU7CisJCQkvKgorCQkJICogRmluZCBuZXh0IHN0YWxlIGVudHJ5IGFmdGVyIGluc2VydGlvbiBwb2ludC4KKwkJCSAqIFN0b3AgbG9va2luZyBpZiB0aGUgYW5zd2VyIHdvdWxkIGJlIHdvcnNlIHRoYW4KKwkJCSAqIGxvd3N0YWxlIGFscmVhZHkgZm91bmQuCisJCQkgKi8KKwkJCWZvciAoaGlnaHN0YWxlID0gaW5kZXg7CisJCQkgICAgIGhpZ2hzdGFsZSA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpICYmCisJCQkJSU5UX0dFVChsZWFmLT5lbnRzW2hpZ2hzdGFsZV0uYWRkcmVzcywgQVJDSF9DT05WRVJUKSAhPQorCQkJCVhGU19ESVIyX05VTExfREFUQVBUUiAmJgorCQkJCShsb3dzdGFsZSA8IDAgfHwKKwkJCQkgaW5kZXggLSBsb3dzdGFsZSAtIDEgPj0gaGlnaHN0YWxlIC0gaW5kZXgpOworCQkJICAgICBoaWdoc3RhbGUrKykKKwkJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBVc2luZyB0aGUgbG93IHN0YWxlIGVudHJ5LgorCQkgKiBTaGlmdCBlbnRyaWVzIHVwIHRvd2FyZCB0aGUgc3RhbGUgc2xvdC4KKwkJICovCisJCWlmIChsb3dzdGFsZSA+PSAwICYmCisJCSAgICAoaGlnaHN0YWxlID09IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIHx8CisJCSAgICAgaW5kZXggLSBsb3dzdGFsZSAtIDEgPCBoaWdoc3RhbGUgLSBpbmRleCkpIHsKKwkJCUFTU0VSVChJTlRfR0VUKGxlYWYtPmVudHNbbG93c3RhbGVdLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkgPT0KKwkJCSAgICAgICBYRlNfRElSMl9OVUxMX0RBVEFQVFIpOworCQkJQVNTRVJUKGluZGV4IC0gbG93c3RhbGUgLSAxID49IDApOworCQkJaWYgKGluZGV4IC0gbG93c3RhbGUgLSAxID4gMCkKKwkJCQltZW1tb3ZlKCZsZWFmLT5lbnRzW2xvd3N0YWxlXSwKKwkJCQkJJmxlYWYtPmVudHNbbG93c3RhbGUgKyAxXSwKKwkJCQkJKGluZGV4IC0gbG93c3RhbGUgLSAxKSAqIHNpemVvZigqbGVwKSk7CisJCQlsZXAgPSAmbGVhZi0+ZW50c1tpbmRleCAtIDFdOworCQkJbGZsb2dsb3cgPSBNSU4obG93c3RhbGUsIGxmbG9nbG93KTsKKwkJCWxmbG9naGlnaCA9IE1BWChpbmRleCAtIDEsIGxmbG9naGlnaCk7CisJCX0KKwkJLyoKKwkJICogVXNpbmcgdGhlIGhpZ2ggc3RhbGUgZW50cnkuCisJCSAqIFNoaWZ0IGVudHJpZXMgZG93biB0b3dhcmQgdGhlIHN0YWxlIHNsb3QuCisJCSAqLworCQllbHNlIHsKKwkJCUFTU0VSVChJTlRfR0VUKGxlYWYtPmVudHNbaGlnaHN0YWxlXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpID09CisJCQkgICAgICAgWEZTX0RJUjJfTlVMTF9EQVRBUFRSKTsKKwkJCUFTU0VSVChoaWdoc3RhbGUgLSBpbmRleCA+PSAwKTsKKwkJCWlmIChoaWdoc3RhbGUgLSBpbmRleCA+IDApCisJCQkJbWVtbW92ZSgmbGVhZi0+ZW50c1tpbmRleCArIDFdLAorCQkJCQkmbGVhZi0+ZW50c1tpbmRleF0sCisJCQkJCShoaWdoc3RhbGUgLSBpbmRleCkgKiBzaXplb2YoKmxlcCkpOworCQkJbGVwID0gJmxlYWYtPmVudHNbaW5kZXhdOworCQkJbGZsb2dsb3cgPSBNSU4oaW5kZXgsIGxmbG9nbG93KTsKKwkJCWxmbG9naGlnaCA9IE1BWChoaWdoc3RhbGUsIGxmbG9naGlnaCk7CisJCX0KKwkJSU5UX01PRChsZWFmLT5oZHIuc3RhbGUsIEFSQ0hfQ09OVkVSVCwgLTEpOworCX0KKwkvKgorCSAqIEluc2VydCB0aGUgbmV3IGVudHJ5LCBsb2cgZXZlcnl0aGluZy4KKwkgKi8KKwlJTlRfU0VUKGxlcC0+aGFzaHZhbCwgQVJDSF9DT05WRVJULCBhcmdzLT5oYXNodmFsKTsKKwlJTlRfU0VUKGxlcC0+YWRkcmVzcywgQVJDSF9DT05WRVJULCBYRlNfRElSMl9EQl9PRkZfVE9fREFUQVBUUihtcCwgYXJncy0+Ymxrbm8sIGFyZ3MtPmluZGV4KSk7CisJeGZzX2RpcjJfbGVhZl9sb2dfaGVhZGVyKHRwLCBicCk7CisJeGZzX2RpcjJfbGVhZl9sb2dfZW50cyh0cCwgYnAsIGxmbG9nbG93LCBsZmxvZ2hpZ2gpOworCXhmc19kaXIyX2xlYWZuX2NoZWNrKGRwLCBicCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBERUJVRworLyoKKyAqIENoZWNrIGludGVybmFsIGNvbnNpc3RlbmN5IG9mIGEgbGVhZm4gYmxvY2suCisgKi8KK3ZvaWQKK3hmc19kaXIyX2xlYWZuX2NoZWNrKAorCXhmc19pbm9kZV90CSpkcCwJCQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJeGZzX2RhYnVmX3QJKmJwKQkJCS8qIGxlYWYgYnVmZmVyICovCit7CisJaW50CQlpOwkJCS8qIGxlYWYgaW5kZXggKi8KKwl4ZnNfZGlyMl9sZWFmX3QJKmxlYWY7CQkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfbW91bnRfdAkqbXA7CQkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCWludAkJc3RhbGU7CQkJLyogY291bnQgb2Ygc3RhbGUgbGVhdmVzICovCisKKwlsZWFmID0gYnAtPmRhdGE7CisJbXAgPSBkcC0+aV9tb3VudDsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQyk7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIDw9IFhGU19ESVIyX01BWF9MRUFGX0VOVFMobXApKTsKKwlmb3IgKGkgPSBzdGFsZSA9IDA7IGkgPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsgaSsrKSB7CisJCWlmIChpICsgMSA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKSB7CisJCQlBU1NFUlQoSU5UX0dFVChsZWFmLT5lbnRzW2ldLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPD0KKwkJCSAgICAgICBJTlRfR0VUKGxlYWYtPmVudHNbaSArIDFdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkpOworCQl9CisJCWlmIChJTlRfR0VUKGxlYWYtPmVudHNbaV0uYWRkcmVzcywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9OVUxMX0RBVEFQVFIpCisJCQlzdGFsZSsrOworCX0KKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuc3RhbGUsIEFSQ0hfQ09OVkVSVCkgPT0gc3RhbGUpOworfQorI2VuZGlmCS8qIERFQlVHICovCisKKy8qCisgKiBSZXR1cm4gdGhlIGxhc3QgaGFzaCB2YWx1ZSBpbiB0aGUgbGVhZi4KKyAqIFN0YWxlIGVudHJpZXMgYXJlIG9rLgorICovCit4ZnNfZGFoYXNoX3QJCQkJCS8qIGhhc2ggdmFsdWUgKi8KK3hmc19kaXIyX2xlYWZuX2xhc3RoYXNoKAorCXhmc19kYWJ1Zl90CSpicCwJCQkvKiBsZWFmIGJ1ZmZlciAqLworCWludAkJKmNvdW50KQkJCS8qIGNvdW50IG9mIGVudHJpZXMgaW4gbGVhZiAqLworeworCXhmc19kaXIyX2xlYWZfdAkqbGVhZjsJCQkvKiBsZWFmIHN0cnVjdHVyZSAqLworCisJbGVhZiA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0xFQUZOX01BR0lDKTsKKwlpZiAoY291bnQpCisJCSpjb3VudCA9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCWlmICghbGVhZi0+aGRyLmNvdW50KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gSU5UX0dFVChsZWFmLT5lbnRzW0lOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gMV0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKTsKK30KKworLyoKKyAqIExvb2sgdXAgYSBsZWFmIGVudHJ5IGluIGEgbm9kZS1mb3JtYXQgbGVhZiBibG9jay4KKyAqIElmIHRoaXMgaXMgYW4gYWRkbmFtZSB0aGVuIHRoZSBleHRyYWJsayBpbiBzdGF0ZSBpcyBhIGZyZWVzcGFjZSBibG9jaywKKyAqIG90aGVyd2lzZSBpdCdzIGEgZGF0YSBibG9jay4KKyAqLworaW50Cit4ZnNfZGlyMl9sZWFmbl9sb29rdXBfaW50KAorCXhmc19kYWJ1Zl90CQkqYnAsCQkvKiBsZWFmIGJ1ZmZlciAqLworCXhmc19kYV9hcmdzX3QJCSphcmdzLAkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworCWludAkJCSppbmRleHAsCS8qIG91dDogbGVhZiBlbnRyeSBpbmRleCAqLworCXhmc19kYV9zdGF0ZV90CQkqc3RhdGUpCQkvKiBzdGF0ZSB0byBmaWxsIGluICovCit7CisJeGZzX2RhYnVmX3QJCSpjdXJicDsJCS8qIGN1cnJlbnQgZGF0YS9mcmVlIGJ1ZmZlciAqLworCXhmc19kaXIyX2RiX3QJCWN1cmRiOwkJLyogY3VycmVudCBkYXRhIGJsb2NrIG51bWJlciAqLworCXhmc19kaXIyX2RiX3QJCWN1cmZkYjsJCS8qIGN1cnJlbnQgZnJlZSBibG9jayBudW1iZXIgKi8KKwl4ZnNfZGlyMl9kYXRhX2VudHJ5X3QJKmRlcDsJCS8qIGRhdGEgYmxvY2sgZW50cnkgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQkJZmk7CQkvKiBmcmVlIGVudHJ5IGluZGV4ICovCisJeGZzX2RpcjJfZnJlZV90CQkqZnJlZT1OVUxMOwkvKiBmcmVlIGJsb2NrIHN0cnVjdHVyZSAqLworCWludAkJCWluZGV4OwkJLyogbGVhZiBlbnRyeSBpbmRleCAqLworCXhmc19kaXIyX2xlYWZfdAkJKmxlYWY7CQkvKiBsZWFmIHN0cnVjdHVyZSAqLworCWludAkJCWxlbmd0aD0wOwkvKiBsZW5ndGggb2YgbmV3IGRhdGEgZW50cnkgKi8KKwl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmxlcDsJCS8qIGxlYWYgZW50cnkgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc19kaXIyX2RiX3QJCW5ld2RiOwkJLyogbmV3IGRhdGEgYmxvY2sgbnVtYmVyICovCisJeGZzX2RpcjJfZGJfdAkJbmV3ZmRiOwkJLyogbmV3IGZyZWUgYmxvY2sgbnVtYmVyICovCisJeGZzX3RyYW5zX3QJCSp0cDsJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCWRwID0gYXJncy0+ZHA7CisJdHAgPSBhcmdzLT50cmFuczsKKwltcCA9IGRwLT5pX21vdW50OworCWxlYWYgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQyk7CisjaWZkZWYgX19LRVJORUxfXworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSA+IDApOworI2VuZGlmCisJeGZzX2RpcjJfbGVhZm5fY2hlY2soZHAsIGJwKTsKKwkvKgorCSAqIExvb2sgdXAgdGhlIGhhc2ggdmFsdWUgaW4gdGhlIGxlYWYgZW50cmllcy4KKwkgKi8KKwlpbmRleCA9IHhmc19kaXIyX2xlYWZfc2VhcmNoX2hhc2goYXJncywgYnApOworCS8qCisJICogRG8gd2UgaGF2ZSBhIGJ1ZmZlciBjb21pbmcgaW4/CisJICovCisJaWYgKHN0YXRlLT5leHRyYXZhbGlkKQorCQljdXJicCA9IHN0YXRlLT5leHRyYWJsay5icDsKKwllbHNlCisJCWN1cmJwID0gTlVMTDsKKwkvKgorCSAqIEZvciBhZGRuYW1lLCBpdCdzIGEgZnJlZSBibG9jayBidWZmZXIsIGdldCB0aGUgYmxvY2sgbnVtYmVyLgorCSAqLworCWlmIChhcmdzLT5hZGRuYW1lKSB7CisJCWN1cmZkYiA9IGN1cmJwID8gc3RhdGUtPmV4dHJhYmxrLmJsa25vIDogLTE7CisJCWN1cmRiID0gLTE7CisJCWxlbmd0aCA9IFhGU19ESVIyX0RBVEFfRU5UU0laRShhcmdzLT5uYW1lbGVuKTsKKwkJaWYgKChmcmVlID0gKGN1cmJwID8gY3VyYnAtPmRhdGEgOiBOVUxMKSkpCisJCQlBU1NFUlQoSU5UX0dFVChmcmVlLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfRlJFRV9NQUdJQyk7CisJfQorCS8qCisJICogRm9yIG90aGVycywgaXQncyBhIGRhdGEgYmxvY2sgYnVmZmVyLCBnZXQgdGhlIGJsb2NrIG51bWJlci4KKwkgKi8KKwllbHNlIHsKKwkJY3VyZmRiID0gLTE7CisJCWN1cmRiID0gY3VyYnAgPyBzdGF0ZS0+ZXh0cmFibGsuYmxrbm8gOiAtMTsKKwl9CisJLyoKKwkgKiBMb29wIG92ZXIgbGVhZiBlbnRyaWVzIHdpdGggdGhlIHJpZ2h0IGhhc2ggdmFsdWUuCisJICovCisJZm9yIChsZXAgPSAmbGVhZi0+ZW50c1tpbmRleF07CisJICAgICBpbmRleCA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpICYmIElOVF9HRVQobGVwLT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpID09IGFyZ3MtPmhhc2h2YWw7CisJICAgICBsZXArKywgaW5kZXgrKykgeworCQkvKgorCQkgKiBTa2lwIHN0YWxlIGxlYWYgZW50cmllcy4KKwkJICovCisJCWlmIChJTlRfR0VUKGxlcC0+YWRkcmVzcywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9OVUxMX0RBVEFQVFIpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogUHVsbCB0aGUgZGF0YSBibG9jayBudW1iZXIgZnJvbSB0aGUgZW50cnkuCisJCSAqLworCQluZXdkYiA9IFhGU19ESVIyX0RBVEFQVFJfVE9fREIobXAsIElOVF9HRVQobGVwLT5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJLyoKKwkJICogRm9yIGFkZG5hbWUsIHdlJ3JlIGxvb2tpbmcgZm9yIGEgcGxhY2UgdG8gcHV0IHRoZSBuZXcgZW50cnkuCisJCSAqIFdlIHdhbnQgdG8gdXNlIGEgZGF0YSBibG9jayB3aXRoIGFuIGVudHJ5IG9mIGVxdWFsCisJCSAqIGhhc2ggdmFsdWUgdG8gb3VycyBpZiB0aGVyZSBpcyBvbmUgd2l0aCByb29tLgorCQkgKi8KKwkJaWYgKGFyZ3MtPmFkZG5hbWUpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGlzIGJsb2NrIGlzbid0IHRoZSBkYXRhIGJsb2NrIHdlIGFscmVhZHkgaGF2ZQorCQkJICogaW4gaGFuZCwgdGFrZSBhIGxvb2sgYXQgaXQuCisJCQkgKi8KKwkJCWlmIChuZXdkYiAhPSBjdXJkYikgeworCQkJCWN1cmRiID0gbmV3ZGI7CisJCQkJLyoKKwkJCQkgKiBDb252ZXJ0IHRoZSBkYXRhIGJsb2NrIHRvIHRoZSBmcmVlIGJsb2NrCisJCQkJICogaG9sZGluZyBpdHMgZnJlZXNwYWNlIGluZm9ybWF0aW9uLgorCQkJCSAqLworCQkJCW5ld2ZkYiA9IFhGU19ESVIyX0RCX1RPX0ZEQihtcCwgbmV3ZGIpOworCQkJCS8qCisJCQkJICogSWYgaXQncyBub3QgdGhlIG9uZSB3ZSBoYXZlIGluIGhhbmQsCisJCQkJICogcmVhZCBpdCBpbi4KKwkJCQkgKi8KKwkJCQlpZiAobmV3ZmRiICE9IGN1cmZkYikgeworCQkJCQkvKgorCQkJCQkgKiBJZiB3ZSBoYWQgb25lIGJlZm9yZSwgZHJvcCBpdC4KKwkJCQkJICovCisJCQkJCWlmIChjdXJicCkKKwkJCQkJCXhmc19kYV9icmVsc2UodHAsIGN1cmJwKTsKKwkJCQkJLyoKKwkJCQkJICogUmVhZCB0aGUgZnJlZSBibG9jay4KKwkJCQkJICovCisJCQkJCWlmICgoZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYodHAsIGRwLAorCQkJCQkJCVhGU19ESVIyX0RCX1RPX0RBKG1wLAorCQkJCQkJCQluZXdmZGIpLAorCQkJCQkJCS0xLCAmY3VyYnAsCisJCQkJCQkJWEZTX0RBVEFfRk9SSykpKSB7CisJCQkJCQlyZXR1cm4gZXJyb3I7CisJCQkJCX0KKwkJCQkJY3VyZmRiID0gbmV3ZmRiOworCQkJCQlmcmVlID0gY3VyYnAtPmRhdGE7CisJCQkJCUFTU0VSVChJTlRfR0VUKGZyZWUtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PQorCQkJCQkgICAgICAgWEZTX0RJUjJfRlJFRV9NQUdJQyk7CisJCQkJCUFTU0VSVCgoSU5UX0dFVChmcmVlLT5oZHIuZmlyc3RkYiwgQVJDSF9DT05WRVJUKSAlCisJCQkJCQlYRlNfRElSMl9NQVhfRlJFRV9CRVNUUyhtcCkpID09CisJCQkJCSAgICAgICAwKTsKKwkJCQkJQVNTRVJUKElOVF9HRVQoZnJlZS0+aGRyLmZpcnN0ZGIsIEFSQ0hfQ09OVkVSVCkgPD0gY3VyZGIpOworCQkJCQlBU1NFUlQoY3VyZGIgPAorCQkJCQkgICAgICAgSU5UX0dFVChmcmVlLT5oZHIuZmlyc3RkYiwgQVJDSF9DT05WRVJUKSArCisJCQkJCSAgICAgICBJTlRfR0VUKGZyZWUtPmhkci5udmFsaWQsIEFSQ0hfQ09OVkVSVCkpOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIEdldCB0aGUgaW5kZXggZm9yIG91ciBlbnRyeS4KKwkJCQkgKi8KKwkJCQlmaSA9IFhGU19ESVIyX0RCX1RPX0ZESU5ERVgobXAsIGN1cmRiKTsKKwkJCQkvKgorCQkJCSAqIElmIGl0IGhhcyByb29tLCByZXR1cm4gaXQuCisJCQkJICovCisJCQkJaWYgKHVubGlrZWx5KElOVF9HRVQoZnJlZS0+YmVzdHNbZmldLCBBUkNIX0NPTlZFUlQpID09IE5VTExEQVRBT0ZGKSkgeworCQkJCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfZGlyMl9sZWFmbl9sb29rdXBfaW50IiwKKwkJCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbXApOworCQkJCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCQkJfQorCQkJCWlmIChJTlRfR0VUKGZyZWUtPmJlc3RzW2ZpXSwgQVJDSF9DT05WRVJUKSA+PSBsZW5ndGgpIHsKKwkJCQkJKmluZGV4cCA9IGluZGV4OworCQkJCQlzdGF0ZS0+ZXh0cmF2YWxpZCA9IDE7CisJCQkJCXN0YXRlLT5leHRyYWJsay5icCA9IGN1cmJwOworCQkJCQlzdGF0ZS0+ZXh0cmFibGsuYmxrbm8gPSBjdXJmZGI7CisJCQkJCXN0YXRlLT5leHRyYWJsay5pbmRleCA9IGZpOworCQkJCQlzdGF0ZS0+ZXh0cmFibGsubWFnaWMgPQorCQkJCQkJWEZTX0RJUjJfRlJFRV9NQUdJQzsKKwkJCQkJQVNTRVJUKGFyZ3MtPm9rbm9lbnQpOworCQkJCQlyZXR1cm4gWEZTX0VSUk9SKEVOT0VOVCk7CisJCQkJfQorCQkJfQorCQl9CisJCS8qCisJCSAqIE5vdCBhZGRpbmcgYSBuZXcgZW50cnksIHNvIHdlIHJlYWxseSB3YW50IHRvIGZpbmQKKwkJICogdGhlIG5hbWUgZ2l2ZW4gdG8gdXMuCisJCSAqLworCQllbHNlIHsKKwkJCS8qCisJCQkgKiBJZiBpdCdzIGEgZGlmZmVyZW50IGRhdGEgYmxvY2ssIGdvIGdldCBpdC4KKwkJCSAqLworCQkJaWYgKG5ld2RiICE9IGN1cmRiKSB7CisJCQkJLyoKKwkJCQkgKiBJZiB3ZSBoYWQgYSBibG9jayBiZWZvcmUsIGRyb3AgaXQuCisJCQkJICovCisJCQkJaWYgKGN1cmJwKQorCQkJCQl4ZnNfZGFfYnJlbHNlKHRwLCBjdXJicCk7CisJCQkJLyoKKwkJCQkgKiBSZWFkIHRoZSBkYXRhIGJsb2NrLgorCQkJCSAqLworCQkJCWlmICgoZXJyb3IgPQorCQkJCSAgICB4ZnNfZGFfcmVhZF9idWYodHAsIGRwLAorCQkJCQkgICAgWEZTX0RJUjJfREJfVE9fREEobXAsIG5ld2RiKSwgLTEsCisJCQkJCSAgICAmY3VyYnAsIFhGU19EQVRBX0ZPUkspKSkgeworCQkJCQlyZXR1cm4gZXJyb3I7CisJCQkJfQorCQkJCXhmc19kaXIyX2RhdGFfY2hlY2soZHAsIGN1cmJwKTsKKwkJCQljdXJkYiA9IG5ld2RiOworCQkJfQorCQkJLyoKKwkJCSAqIFBvaW50IHRvIHRoZSBkYXRhIGVudHJ5LgorCQkJICovCisJCQlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopCisJCQkgICAgICAoKGNoYXIgKiljdXJicC0+ZGF0YSArCisJCQkgICAgICAgWEZTX0RJUjJfREFUQVBUUl9UT19PRkYobXAsIElOVF9HRVQobGVwLT5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpKSk7CisJCQkvKgorCQkJICogQ29tcGFyZSB0aGUgZW50cnksIHJldHVybiBpdCBpZiBpdCBtYXRjaGVzLgorCQkJICovCisJCQlpZiAoZGVwLT5uYW1lbGVuID09IGFyZ3MtPm5hbWVsZW4gJiYKKwkJCSAgICBkZXAtPm5hbWVbMF0gPT0gYXJncy0+bmFtZVswXSAmJgorCQkJICAgIG1lbWNtcChkZXAtPm5hbWUsIGFyZ3MtPm5hbWUsIGFyZ3MtPm5hbWVsZW4pID09IDApIHsKKwkJCQlhcmdzLT5pbnVtYmVyID0gSU5UX0dFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCk7CisJCQkJKmluZGV4cCA9IGluZGV4OworCQkJCXN0YXRlLT5leHRyYXZhbGlkID0gMTsKKwkJCQlzdGF0ZS0+ZXh0cmFibGsuYnAgPSBjdXJicDsKKwkJCQlzdGF0ZS0+ZXh0cmFibGsuYmxrbm8gPSBjdXJkYjsKKwkJCQlzdGF0ZS0+ZXh0cmFibGsuaW5kZXggPQorCQkJCQkoaW50KSgoY2hhciAqKWRlcCAtCisJCQkJCSAgICAgIChjaGFyICopY3VyYnAtPmRhdGEpOworCQkJCXN0YXRlLT5leHRyYWJsay5tYWdpYyA9IFhGU19ESVIyX0RBVEFfTUFHSUM7CisJCQkJcmV0dXJuIFhGU19FUlJPUihFRVhJU1QpOworCQkJfQorCQl9CisJfQorCS8qCisJICogRGlkbid0IGZpbmQgYSBtYXRjaC4KKwkgKiBJZiB3ZSBhcmUgaG9sZGluZyBhIGJ1ZmZlciwgZ2l2ZSBpdCBiYWNrIGluIGNhc2Ugb3VyIGNhbGxlcgorCSAqIGZpbmRzIGl0IHVzZWZ1bC4KKwkgKi8KKwlpZiAoKHN0YXRlLT5leHRyYXZhbGlkID0gKGN1cmJwICE9IE5VTEwpKSkgeworCQlzdGF0ZS0+ZXh0cmFibGsuYnAgPSBjdXJicDsKKwkJc3RhdGUtPmV4dHJhYmxrLmluZGV4ID0gLTE7CisJCS8qCisJCSAqIEZvciBhZGRuYW1lLCBnaXZpbmcgYmFjayBhIGZyZWUgYmxvY2suCisJCSAqLworCQlpZiAoYXJncy0+YWRkbmFtZSkgeworCQkJc3RhdGUtPmV4dHJhYmxrLmJsa25vID0gY3VyZmRiOworCQkJc3RhdGUtPmV4dHJhYmxrLm1hZ2ljID0gWEZTX0RJUjJfRlJFRV9NQUdJQzsKKwkJfQorCQkvKgorCQkgKiBGb3Igb3RoZXIgY2FsbGVycywgZ2l2aW5nIGJhY2sgYSBkYXRhIGJsb2NrLgorCQkgKi8KKwkJZWxzZSB7CisJCQlzdGF0ZS0+ZXh0cmFibGsuYmxrbm8gPSBjdXJkYjsKKwkJCXN0YXRlLT5leHRyYWJsay5tYWdpYyA9IFhGU19ESVIyX0RBVEFfTUFHSUM7CisJCX0KKwl9CisJLyoKKwkgKiBSZXR1cm4gdGhlIGZpbmFsIGluZGV4LCB0aGF0IHdpbGwgYmUgdGhlIGluc2VydGlvbiBwb2ludC4KKwkgKi8KKwkqaW5kZXhwID0gaW5kZXg7CisJQVNTRVJUKGluZGV4ID09IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIHx8IGFyZ3MtPm9rbm9lbnQpOworCXJldHVybiBYRlNfRVJST1IoRU5PRU5UKTsKK30KKworLyoKKyAqIE1vdmUgY291bnQgbGVhZiBlbnRyaWVzIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIGxlYWYuCisgKiBMb2cgZW50cmllcyBhbmQgaGVhZGVycy4gIFN0YWxlIGVudHJpZXMgYXJlIHByZXNlcnZlZC4KKyAqLworc3RhdGljIHZvaWQKK3hmc19kaXIyX2xlYWZuX21vdmVlbnRzKAorCXhmc19kYV9hcmdzX3QJKmFyZ3MsCQkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworCXhmc19kYWJ1Zl90CSpicF9zLAkJCS8qIHNvdXJjZSBsZWFmIGJ1ZmZlciAqLworCWludAkJc3RhcnRfcywJCS8qIHNvdXJjZSBsZWFmIGluZGV4ICovCisJeGZzX2RhYnVmX3QJKmJwX2QsCQkJLyogZGVzdGluYXRpb24gbGVhZiBidWZmZXIgKi8KKwlpbnQJCXN0YXJ0X2QsCQkvKiBkZXN0aW5hdGlvbiBsZWFmIGluZGV4ICovCisJaW50CQljb3VudCkJCQkvKiBjb3VudCBvZiBsZWF2ZXMgdG8gY29weSAqLworeworCXhmc19kaXIyX2xlYWZfdAkqbGVhZl9kOwkJLyogZGVzdGluYXRpb24gbGVhZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX3QJKmxlYWZfczsJCS8qIHNvdXJjZSBsZWFmIHN0cnVjdHVyZSAqLworCWludAkJc3RhbGU7CQkJLyogY291bnQgc3RhbGUgbGVhdmVzIGNvcGllZCAqLworCXhmc190cmFuc190CSp0cDsJCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzX2JpYmlpKCJsZWFmbl9tb3ZlZW50cyIsIGFyZ3MsIGJwX3MsIHN0YXJ0X3MsIGJwX2QsCisJCXN0YXJ0X2QsIGNvdW50KTsKKwkvKgorCSAqIFNpbGVudGx5IHJldHVybiBpZiBub3RoaW5nIHRvIGRvLgorCSAqLworCWlmIChjb3VudCA9PSAwKSB7CisJCXJldHVybjsKKwl9CisJdHAgPSBhcmdzLT50cmFuczsKKwlsZWFmX3MgPSBicF9zLT5kYXRhOworCWxlYWZfZCA9IGJwX2QtPmRhdGE7CisJLyoKKwkgKiBJZiB0aGUgZGVzdGluYXRpb24gaW5kZXggaXMgbm90IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQKKwkgKiBkZXN0aW5hdGlvbiBsZWFmIGVudHJpZXMsIG9wZW4gdXAgYSBob2xlIGluIHRoZSBkZXN0aW5hdGlvbgorCSAqIHRvIGhvbGQgdGhlIG5ldyBlbnRyaWVzLgorCSAqLworCWlmIChzdGFydF9kIDwgSU5UX0dFVChsZWFmX2QtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkgeworCQltZW1tb3ZlKCZsZWFmX2QtPmVudHNbc3RhcnRfZCArIGNvdW50XSwgJmxlYWZfZC0+ZW50c1tzdGFydF9kXSwKKwkJCShJTlRfR0VUKGxlYWZfZC0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gc3RhcnRfZCkgKgorCQkJc2l6ZW9mKHhmc19kaXIyX2xlYWZfZW50cnlfdCkpOworCQl4ZnNfZGlyMl9sZWFmX2xvZ19lbnRzKHRwLCBicF9kLCBzdGFydF9kICsgY291bnQsCisJCQljb3VudCArIElOVF9HRVQobGVhZl9kLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxKTsKKwl9CisJLyoKKwkgKiBJZiB0aGUgc291cmNlIGhhcyBzdGFsZSBsZWF2ZXMsIGNvdW50IHRoZSBvbmVzIGluIHRoZSBjb3B5IHJhbmdlCisJICogc28gd2UgY2FuIHVwZGF0ZSB0aGUgaGVhZGVyIGNvcnJlY3RseS4KKwkgKi8KKwlpZiAobGVhZl9zLT5oZHIuc3RhbGUpIHsKKwkJaW50CWk7CQkJLyogdGVtcCBsZWFmIGluZGV4ICovCisKKwkJZm9yIChpID0gc3RhcnRfcywgc3RhbGUgPSAwOyBpIDwgc3RhcnRfcyArIGNvdW50OyBpKyspIHsKKwkJCWlmIChJTlRfR0VUKGxlYWZfcy0+ZW50c1tpXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX05VTExfREFUQVBUUikKKwkJCQlzdGFsZSsrOworCQl9CisJfSBlbHNlCisJCXN0YWxlID0gMDsKKwkvKgorCSAqIENvcHkgdGhlIGxlYWYgZW50cmllcyBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbi4KKwkgKi8KKwltZW1jcHkoJmxlYWZfZC0+ZW50c1tzdGFydF9kXSwgJmxlYWZfcy0+ZW50c1tzdGFydF9zXSwKKwkJY291bnQgKiBzaXplb2YoeGZzX2RpcjJfbGVhZl9lbnRyeV90KSk7CisJeGZzX2RpcjJfbGVhZl9sb2dfZW50cyh0cCwgYnBfZCwgc3RhcnRfZCwgc3RhcnRfZCArIGNvdW50IC0gMSk7CisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgc291cmNlIGVudHJpZXMgYWZ0ZXIgdGhlIG9uZXMgd2UgY29waWVkLAorCSAqIGRlbGV0ZSB0aGUgb25lcyB3ZSBjb3BpZWQgYnkgc2xpZGluZyB0aGUgbmV4dCBvbmVzIGRvd24uCisJICovCisJaWYgKHN0YXJ0X3MgKyBjb3VudCA8IElOVF9HRVQobGVhZl9zLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJbWVtbW92ZSgmbGVhZl9zLT5lbnRzW3N0YXJ0X3NdLCAmbGVhZl9zLT5lbnRzW3N0YXJ0X3MgKyBjb3VudF0sCisJCQljb3VudCAqIHNpemVvZih4ZnNfZGlyMl9sZWFmX2VudHJ5X3QpKTsKKwkJeGZzX2RpcjJfbGVhZl9sb2dfZW50cyh0cCwgYnBfcywgc3RhcnRfcywgc3RhcnRfcyArIGNvdW50IC0gMSk7CisJfQorCS8qCisJICogVXBkYXRlIHRoZSBoZWFkZXJzIGFuZCBsb2cgdGhlbS4KKwkgKi8KKwlJTlRfTU9EKGxlYWZfcy0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQsIC0oY291bnQpKTsKKwlJTlRfTU9EKGxlYWZfcy0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQsIC0oc3RhbGUpKTsKKwlJTlRfTU9EKGxlYWZfZC0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQsIGNvdW50KTsKKwlJTlRfTU9EKGxlYWZfZC0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQsIHN0YWxlKTsKKwl4ZnNfZGlyMl9sZWFmX2xvZ19oZWFkZXIodHAsIGJwX3MpOworCXhmc19kaXIyX2xlYWZfbG9nX2hlYWRlcih0cCwgYnBfZCk7CisJeGZzX2RpcjJfbGVhZm5fY2hlY2soYXJncy0+ZHAsIGJwX3MpOworCXhmc19kaXIyX2xlYWZuX2NoZWNrKGFyZ3MtPmRwLCBicF9kKTsKK30KKworLyoKKyAqIERldGVybWluZSB0aGUgc29ydCBvcmRlciBvZiB0d28gbGVhZiBibG9ja3MuCisgKiBSZXR1cm5zIDEgaWYgYm90aCBhcmUgdmFsaWQgYW5kIGxlYWYyIHNob3VsZCBiZSBiZWZvcmUgbGVhZjEsIGVsc2UgMC4KKyAqLworaW50CQkJCQkJLyogc29ydCBvcmRlciAqLworeGZzX2RpcjJfbGVhZm5fb3JkZXIoCisJeGZzX2RhYnVmX3QJKmxlYWYxX2JwLAkJLyogbGVhZjEgYnVmZmVyICovCisJeGZzX2RhYnVmX3QJKmxlYWYyX2JwKQkJLyogbGVhZjIgYnVmZmVyICovCit7CisJeGZzX2RpcjJfbGVhZl90CSpsZWFmMTsJCQkvKiBsZWFmMSBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX3QJKmxlYWYyOwkJCS8qIGxlYWYyIHN0cnVjdHVyZSAqLworCisJbGVhZjEgPSBsZWFmMV9icC0+ZGF0YTsKKwlsZWFmMiA9IGxlYWYyX2JwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYxLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQyk7CisJQVNTRVJUKElOVF9HRVQobGVhZjItPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0xFQUZOX01BR0lDKTsKKwlpZiAoSU5UX0dFVChsZWFmMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpID4gMCAmJgorCSAgICBJTlRfR0VUKGxlYWYyLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgPiAwICYmCisJICAgIChJTlRfR0VUKGxlYWYyLT5lbnRzWzBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPCBJTlRfR0VUKGxlYWYxLT5lbnRzWzBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgfHwKKwkgICAgIElOVF9HRVQobGVhZjItPmVudHNbSU5UX0dFVChsZWFmMi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gMV0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSA8CisJICAgICBJTlRfR0VUKGxlYWYxLT5lbnRzW0lOVF9HRVQobGVhZjEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIDFdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYmFsYW5jZSBsZWFmIGVudHJpZXMgYmV0d2VlbiB0d28gbGVhZiBibG9ja3MuCisgKiBUaGlzIGlzIGFjdHVhbGx5IG9ubHkgY2FsbGVkIHdoZW4gdGhlIHNlY29uZCBibG9jayBpcyBuZXcsCisgKiB0aG91Z2ggdGhlIGNvZGUgZGVhbHMgd2l0aCB0aGUgZ2VuZXJhbCBjYXNlLgorICogQSBuZXcgZW50cnkgd2lsbCBiZSBpbnNlcnRlZCBpbiBvbmUgb2YgdGhlIGJsb2NrcywgYW5kIHRoYXQKKyAqIGVudHJ5IGlzIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGJhbGFuY2luZy4KKyAqLworc3RhdGljIHZvaWQKK3hmc19kaXIyX2xlYWZuX3JlYmFsYW5jZSgKKwl4ZnNfZGFfc3RhdGVfdAkJKnN0YXRlLAkJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2RhX3N0YXRlX2Jsa190CSpibGsxLAkJLyogZmlyc3QgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfZGFfc3RhdGVfYmxrX3QJKmJsazIpCQkvKiBzZWNvbmQgYnRyZWUgYmxvY2sgKi8KK3sKKwl4ZnNfZGFfYXJnc190CQkqYXJnczsJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwlpbnQJCQljb3VudDsJCS8qIGNvdW50ICgmIGRpcmVjdGlvbikgbGVhdmVzICovCisJaW50CQkJaXNsZWZ0OwkJLyogbmV3IGdvZXMgaW4gbGVmdCBsZWFmICovCisJeGZzX2RpcjJfbGVhZl90CQkqbGVhZjE7CQkvKiBmaXJzdCBsZWFmIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2xlYWZfdAkJKmxlYWYyOwkJLyogc2Vjb25kIGxlYWYgc3RydWN0dXJlICovCisJaW50CQkJbWlkOwkJLyogbWlkcG9pbnQgbGVhZiBpbmRleCAqLworI2lmZGVmIERFQlVHCisJaW50CQkJb2xkc3RhbGU7CS8qIG9sZCBjb3VudCBvZiBzdGFsZSBsZWF2ZXMgKi8KKyNlbmRpZgorCWludAkJCW9sZHN1bTsJCS8qIG9sZCB0b3RhbCBsZWFmIGNvdW50ICovCisJaW50CQkJc3dhcDsJCS8qIHN3YXBwZWQgbGVhZiBibG9ja3MgKi8KKworCWFyZ3MgPSBzdGF0ZS0+YXJnczsKKwkvKgorCSAqIElmIHRoZSBibG9jayBvcmRlciBpcyB3cm9uZywgc3dhcCB0aGUgYXJndW1lbnRzLgorCSAqLworCWlmICgoc3dhcCA9IHhmc19kaXIyX2xlYWZuX29yZGVyKGJsazEtPmJwLCBibGsyLT5icCkpKSB7CisJCXhmc19kYV9zdGF0ZV9ibGtfdAkqdG1wOwkvKiB0ZW1wIGZvciBibG9jayBzd2FwICovCisKKwkJdG1wID0gYmxrMTsKKwkJYmxrMSA9IGJsazI7CisJCWJsazIgPSB0bXA7CisJfQorCWxlYWYxID0gYmxrMS0+YnAtPmRhdGE7CisJbGVhZjIgPSBibGsyLT5icC0+ZGF0YTsKKwlvbGRzdW0gPSBJTlRfR0VUKGxlYWYxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgKyBJTlRfR0VUKGxlYWYyLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisjaWZkZWYgREVCVUcKKwlvbGRzdGFsZSA9IElOVF9HRVQobGVhZjEtPmhkci5zdGFsZSwgQVJDSF9DT05WRVJUKSArIElOVF9HRVQobGVhZjItPmhkci5zdGFsZSwgQVJDSF9DT05WRVJUKTsKKyNlbmRpZgorCW1pZCA9IG9sZHN1bSA+PiAxOworCS8qCisJICogSWYgdGhlIG9sZCBsZWFmIGNvdW50IHdhcyBvZGQgdGhlbiB0aGUgbmV3IG9uZSB3aWxsIGJlIGV2ZW4sCisJICogc28gd2UgbmVlZCB0byBkaXZpZGUgdGhlIG5ldyBjb3VudCBldmVubHkuCisJICovCisJaWYgKG9sZHN1bSAmIDEpIHsKKwkJeGZzX2RhaGFzaF90CW1pZGhhc2g7CS8qIG1pZGRsZSBlbnRyeSBoYXNoIHZhbHVlICovCisKKwkJaWYgKG1pZCA+PSBJTlRfR0VUKGxlYWYxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpCisJCQltaWRoYXNoID0gSU5UX0dFVChsZWFmMi0+ZW50c1ttaWQgLSBJTlRfR0VUKGxlYWYxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCldLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisJCWVsc2UKKwkJCW1pZGhhc2ggPSBJTlRfR0VUKGxlYWYxLT5lbnRzW21pZF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKTsKKwkJaXNsZWZ0ID0gYXJncy0+aGFzaHZhbCA8PSBtaWRoYXNoOworCX0KKwkvKgorCSAqIElmIHRoZSBvbGQgY291bnQgaXMgZXZlbiB0aGVuIHRoZSBuZXcgY291bnQgaXMgb2RkLCBzbyB0aGVyZSdzCisJICogbm8gcHJlZmVycmVkIHNpZGUgZm9yIHRoZSBuZXcgZW50cnkuCisJICogUGljayB0aGUgbGVmdCBvbmUuCisJICovCisJZWxzZQorCQlpc2xlZnQgPSAxOworCS8qCisJICogQ2FsY3VsYXRlIG1vdmVkIGVudHJ5IGNvdW50LiAgUG9zaXRpdmUgbWVhbnMgbGVmdC10by1yaWdodCwKKwkgKiBuZWdhdGl2ZSBtZWFucyByaWdodC10by1sZWZ0LiAgVGhlbiBtb3ZlIHRoZSBlbnRyaWVzLgorCSAqLworCWNvdW50ID0gSU5UX0dFVChsZWFmMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gbWlkICsgKGlzbGVmdCA9PSAwKTsKKwlpZiAoY291bnQgPiAwKQorCQl4ZnNfZGlyMl9sZWFmbl9tb3ZlZW50cyhhcmdzLCBibGsxLT5icCwKKwkJCUlOVF9HRVQobGVhZjEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIGNvdW50LCBibGsyLT5icCwgMCwgY291bnQpOworCWVsc2UgaWYgKGNvdW50IDwgMCkKKwkJeGZzX2RpcjJfbGVhZm5fbW92ZWVudHMoYXJncywgYmxrMi0+YnAsIDAsIGJsazEtPmJwLAorCQkJSU5UX0dFVChsZWFmMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLCBjb3VudCk7CisJQVNTRVJUKElOVF9HRVQobGVhZjEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSArIElOVF9HRVQobGVhZjItPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSA9PSBvbGRzdW0pOworCUFTU0VSVChJTlRfR0VUKGxlYWYxLT5oZHIuc3RhbGUsIEFSQ0hfQ09OVkVSVCkgKyBJTlRfR0VUKGxlYWYyLT5oZHIuc3RhbGUsIEFSQ0hfQ09OVkVSVCkgPT0gb2xkc3RhbGUpOworCS8qCisJICogTWFyayB3aGV0aGVyIHdlJ3JlIGluc2VydGluZyBpbnRvIHRoZSBvbGQgb3IgbmV3IGxlYWYuCisJICovCisJaWYgKElOVF9HRVQobGVhZjEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSA8IElOVF9HRVQobGVhZjItPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkKKwkJc3RhdGUtPmlubGVhZiA9IHN3YXA7CisJZWxzZSBpZiAoSU5UX0dFVChsZWFmMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpID4gSU5UX0dFVChsZWFmMi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKQorCQlzdGF0ZS0+aW5sZWFmID0gIXN3YXA7CisJZWxzZQorCQlzdGF0ZS0+aW5sZWFmID0KKwkJCXN3YXAgXiAoYmxrMS0+aW5kZXggPD0gSU5UX0dFVChsZWFmMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKTsKKwkvKgorCSAqIEFkanVzdCB0aGUgZXhwZWN0ZWQgaW5kZXggZm9yIGluc2VydGlvbi4KKwkgKi8KKwlpZiAoIXN0YXRlLT5pbmxlYWYpCisJCWJsazItPmluZGV4ID0gYmxrMS0+aW5kZXggLSBJTlRfR0VUKGxlYWYxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCisJLyogCisJICogRmluYWxseSBzYW5pdHkgY2hlY2sganVzdCB0byBtYWtlIHN1cmUgd2UgYXJlIG5vdCByZXR1cm5pbmcgYSBuZWdhdGl2ZSBpbmRleCAKKwkgKi8KKwlpZihibGsyLT5pbmRleCA8IDApIHsKKwkJc3RhdGUtPmlubGVhZiA9IDE7CisJCWJsazItPmluZGV4ID0gMDsKKwkJY21uX2VycihDRV9BTEVSVCwKKwkJCSJ4ZnNfZGlyMl9sZWFmbl9yZWJhbGFuY2U6IHBpY2tlZCB0aGUgd3JvbmcgbGVhZj8gcmV2ZXJ0aW5nIG9yaWduYWwgbGVhZjogIgorCQkJImJsazEtPmluZGV4ICVkXG4iLAorCQkJYmxrMS0+aW5kZXgpOworCX0KK30KKworLyoKKyAqIFJlbW92ZSBhbiBlbnRyeSBmcm9tIGEgbm9kZSBkaXJlY3RvcnkuCisgKiBUaGlzIHJlbW92ZXMgdGhlIGxlYWYgZW50cnkgYW5kIHRoZSBkYXRhIGVudHJ5LAorICogYW5kIHVwZGF0ZXMgdGhlIGZyZWUgYmxvY2sgaWYgbmVjZXNzYXJ5LgorICovCitzdGF0aWMgaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfbGVhZm5fcmVtb3ZlKAorCXhmc19kYV9hcmdzX3QJCSphcmdzLAkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworCXhmc19kYWJ1Zl90CQkqYnAsCQkvKiBsZWFmIGJ1ZmZlciAqLworCWludAkJCWluZGV4LAkJLyogbGVhZiBlbnRyeSBpbmRleCAqLworCXhmc19kYV9zdGF0ZV9ibGtfdAkqZGJsaywJCS8qIGRhdGEgYmxvY2sgKi8KKwlpbnQJCQkqcnZhbCkJCS8qIHJlc3VsdGluZyBibG9jayBuZWVkcyBqb2luICovCit7CisJeGZzX2RpcjJfZGF0YV90CQkqZGF0YTsJCS8qIGRhdGEgYmxvY2sgc3RydWN0dXJlICovCisJeGZzX2RpcjJfZGJfdAkJZGI7CQkvKiBkYXRhIGJsb2NrIG51bWJlciAqLworCXhmc19kYWJ1Zl90CQkqZGJwOwkJLyogZGF0YSBibG9jayBidWZmZXIgKi8KKwl4ZnNfZGlyMl9kYXRhX2VudHJ5X3QJKmRlcDsJCS8qIGRhdGEgYmxvY2sgZW50cnkgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCXhmc19kaXIyX2xlYWZfdAkJKmxlYWY7CQkvKiBsZWFmIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2xlYWZfZW50cnlfdAkqbGVwOwkJLyogbGVhZiBlbnRyeSAqLworCWludAkJCWxvbmdlc3Q7CS8qIGxvbmdlc3QgZGF0YSBmcmVlIGVudHJ5ICovCisJaW50CQkJb2ZmOwkJLyogZGF0YSBibG9jayBlbnRyeSBvZmZzZXQgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCWludAkJCW5lZWRsb2c7CS8qIG5lZWQgdG8gbG9nIGRhdGEgaGVhZGVyICovCisJaW50CQkJbmVlZHNjYW47CS8qIG5lZWQgdG8gcmVzY2FuIGRhdGEgZnJlZXMgKi8KKwl4ZnNfdHJhbnNfdAkJKnRwOwkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCisJeGZzX2RpcjJfdHJhY2VfYXJnc19zYigibGVhZm5fcmVtb3ZlIiwgYXJncywgaW5kZXgsIGJwKTsKKwlkcCA9IGFyZ3MtPmRwOworCXRwID0gYXJncy0+dHJhbnM7CisJbXAgPSBkcC0+aV9tb3VudDsKKwlsZWFmID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCS8qCisJICogUG9pbnQgdG8gdGhlIGVudHJ5IHdlJ3JlIHJlbW92aW5nLgorCSAqLworCWxlcCA9ICZsZWFmLT5lbnRzW2luZGV4XTsKKwkvKgorCSAqIEV4dHJhY3QgdGhlIGRhdGEgYmxvY2sgYW5kIG9mZnNldCBmcm9tIHRoZSBlbnRyeS4KKwkgKi8KKwlkYiA9IFhGU19ESVIyX0RBVEFQVFJfVE9fREIobXAsIElOVF9HRVQobGVwLT5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpKTsKKwlBU1NFUlQoZGJsay0+Ymxrbm8gPT0gZGIpOworCW9mZiA9IFhGU19ESVIyX0RBVEFQVFJfVE9fT0ZGKG1wLCBJTlRfR0VUKGxlcC0+YWRkcmVzcywgQVJDSF9DT05WRVJUKSk7CisJQVNTRVJUKGRibGstPmluZGV4ID09IG9mZik7CisJLyoKKwkgKiBLaWxsIHRoZSBsZWFmIGVudHJ5IGJ5IG1hcmtpbmcgaXQgc3RhbGUuCisJICogTG9nIHRoZSBsZWFmIGJsb2NrIGNoYW5nZXMuCisJICovCisJSU5UX01PRChsZWFmLT5oZHIuc3RhbGUsIEFSQ0hfQ09OVkVSVCwgKzEpOworCXhmc19kaXIyX2xlYWZfbG9nX2hlYWRlcih0cCwgYnApOworCUlOVF9TRVQobGVwLT5hZGRyZXNzLCBBUkNIX0NPTlZFUlQsIFhGU19ESVIyX05VTExfREFUQVBUUik7CisJeGZzX2RpcjJfbGVhZl9sb2dfZW50cyh0cCwgYnAsIGluZGV4LCBpbmRleCk7CisJLyoKKwkgKiBNYWtlIHRoZSBkYXRhIGVudHJ5IGZyZWUuICBLZWVwIHRyYWNrIG9mIHRoZSBsb25nZXN0IGZyZWVzcGFjZQorCSAqIGluIHRoZSBkYXRhIGJsb2NrIGluIGNhc2UgaXQgY2hhbmdlcy4KKwkgKi8KKwlkYnAgPSBkYmxrLT5icDsKKwlkYXRhID0gZGJwLT5kYXRhOworCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKikoKGNoYXIgKilkYXRhICsgb2ZmKTsKKwlsb25nZXN0ID0gSU5UX0dFVChkYXRhLT5oZHIuYmVzdGZyZWVbMF0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpOworCW5lZWRsb2cgPSBuZWVkc2NhbiA9IDA7CisJeGZzX2RpcjJfZGF0YV9tYWtlX2ZyZWUodHAsIGRicCwgb2ZmLAorCQlYRlNfRElSMl9EQVRBX0VOVFNJWkUoZGVwLT5uYW1lbGVuKSwgJm5lZWRsb2csICZuZWVkc2Nhbik7CisJLyoKKwkgKiBSZXNjYW4gdGhlIGRhdGEgYmxvY2sgZnJlZXNwYWNlcyBmb3IgYmVzdGZyZWUuCisJICogTG9nIHRoZSBkYXRhIGJsb2NrIGhlYWRlciBpZiBuZWVkZWQuCisJICovCisJaWYgKG5lZWRzY2FuKQorCQl4ZnNfZGlyMl9kYXRhX2ZyZWVzY2FuKG1wLCBkYXRhLCAmbmVlZGxvZywgTlVMTCk7CisJaWYgKG5lZWRsb2cpCisJCXhmc19kaXIyX2RhdGFfbG9nX2hlYWRlcih0cCwgZGJwKTsKKwl4ZnNfZGlyMl9kYXRhX2NoZWNrKGRwLCBkYnApOworCS8qCisJICogSWYgdGhlIGxvbmdlc3QgZGF0YSBibG9jayBmcmVlc3BhY2UgY2hhbmdlcywgbmVlZCB0byB1cGRhdGUKKwkgKiB0aGUgY29ycmVzcG9uZGluZyBmcmVlYmxvY2sgZW50cnkuCisJICovCisJaWYgKGxvbmdlc3QgPCBJTlRfR0VUKGRhdGEtPmhkci5iZXN0ZnJlZVswXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCQl4ZnNfZGFidWZfdAkqZmJwOwkJLyogZnJlZWJsb2NrIGJ1ZmZlciAqLworCQl4ZnNfZGlyMl9kYl90CWZkYjsJCS8qIGZyZWVibG9jayBibG9jayBudW1iZXIgKi8KKwkJaW50CQlmaW5kZXg7CQkvKiBpbmRleCBpbiBmcmVlYmxvY2sgZW50cmllcyAqLworCQl4ZnNfZGlyMl9mcmVlX3QJKmZyZWU7CQkvKiBmcmVlYmxvY2sgc3RydWN0dXJlICovCisJCWludAkJbG9nZnJlZTsJLyogbmVlZCB0byBsb2cgZnJlZSBlbnRyeSAqLworCisJCS8qCisJCSAqIENvbnZlcnQgdGhlIGRhdGEgYmxvY2sgbnVtYmVyIHRvIGEgZnJlZSBibG9jaywKKwkJICogcmVhZCBpbiB0aGUgZnJlZSBibG9jay4KKwkJICovCisJCWZkYiA9IFhGU19ESVIyX0RCX1RPX0ZEQihtcCwgZGIpOworCQlpZiAoKGVycm9yID0geGZzX2RhX3JlYWRfYnVmKHRwLCBkcCwgWEZTX0RJUjJfREJfVE9fREEobXAsIGZkYiksCisJCQkJLTEsICZmYnAsIFhGU19EQVRBX0ZPUkspKSkgeworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCWZyZWUgPSBmYnAtPmRhdGE7CisJCUFTU0VSVChJTlRfR0VUKGZyZWUtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9GUkVFX01BR0lDKTsKKwkJQVNTRVJUKElOVF9HRVQoZnJlZS0+aGRyLmZpcnN0ZGIsIEFSQ0hfQ09OVkVSVCkgPT0KKwkJICAgICAgIFhGU19ESVIyX01BWF9GUkVFX0JFU1RTKG1wKSAqCisJCSAgICAgICAoZmRiIC0gWEZTX0RJUjJfRlJFRV9GSVJTVERCKG1wKSkpOworCQkvKgorCQkgKiBDYWxjdWxhdGUgd2hpY2ggZW50cnkgd2UgbmVlZCB0byBmaXguCisJCSAqLworCQlmaW5kZXggPSBYRlNfRElSMl9EQl9UT19GRElOREVYKG1wLCBkYik7CisJCWxvbmdlc3QgPSBJTlRfR0VUKGRhdGEtPmhkci5iZXN0ZnJlZVswXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCk7CisJCS8qCisJCSAqIElmIHRoZSBkYXRhIGJsb2NrIGlzIG5vdyBlbXB0eSB3ZSBjYW4gZ2V0IHJpZCBvZiBpdAorCQkgKiAodXN1YWxseSkuCisJCSAqLworCQlpZiAobG9uZ2VzdCA9PSBtcC0+bV9kaXJibGtzaXplIC0gKHVpbnQpc2l6ZW9mKGRhdGEtPmhkcikpIHsKKwkJCS8qCisJCQkgKiBUcnkgdG8gcHVuY2ggb3V0IHRoZSBkYXRhIGJsb2NrLgorCQkJICovCisJCQllcnJvciA9IHhmc19kaXIyX3Nocmlua19pbm9kZShhcmdzLCBkYiwgZGJwKTsKKwkJCWlmIChlcnJvciA9PSAwKSB7CisJCQkJZGJsay0+YnAgPSBOVUxMOworCQkJCWRhdGEgPSBOVUxMOworCQkJfQorCQkJLyoKKwkJCSAqIFdlIGNhbiBnZXQgRU5PU1BDIGlmIHRoZXJlJ3Mgbm8gc3BhY2UgcmVzZXJ2YXRpb24uCisJCQkgKiBJbiB0aGlzIGNhc2UganVzdCBkcm9wIHRoZSBidWZmZXIgYW5kIHNvbWUgb25lIGVsc2UKKwkJCSAqIHdpbGwgZXZlbnR1YWxseSBnZXQgcmlkIG9mIHRoZSBlbXB0eSBibG9jay4KKwkJCSAqLworCQkJZWxzZSBpZiAoZXJyb3IgPT0gRU5PU1BDICYmIGFyZ3MtPnRvdGFsID09IDApCisJCQkJeGZzX2RhX2J1Zl9kb25lKGRicCk7CisJCQllbHNlCisJCQkJcmV0dXJuIGVycm9yOworCQl9CisJCS8qCisJCSAqIElmIHdlIGdvdCByaWQgb2YgdGhlIGRhdGEgYmxvY2ssIHdlIGNhbiBlbGltaW5hdGUgdGhhdCBlbnRyeQorCQkgKiBpbiB0aGUgZnJlZSBibG9jay4KKwkJICovCisJCWlmIChkYXRhID09IE5VTEwpIHsKKwkJCS8qCisJCQkgKiBPbmUgbGVzcyB1c2VkIGVudHJ5IGluIHRoZSBmcmVlIHRhYmxlLgorCQkJICovCisJCQlJTlRfTU9EKGZyZWUtPmhkci5udXNlZCwgQVJDSF9DT05WRVJULCAtMSk7CisJCQl4ZnNfZGlyMl9mcmVlX2xvZ19oZWFkZXIodHAsIGZicCk7CisJCQkvKgorCQkJICogSWYgdGhpcyB3YXMgdGhlIGxhc3QgZW50cnkgaW4gdGhlIHRhYmxlLCB3ZSBjYW4KKwkJCSAqIHRyaW0gdGhlIHRhYmxlIHNpemUgYmFjay4gIFRoZXJlIG1pZ2h0IGJlIG90aGVyCisJCQkgKiBlbnRyaWVzIGF0IHRoZSBlbmQgcmVmZXJyaW5nIHRvIG5vbi1leGlzdGVudAorCQkJICogZGF0YSBibG9ja3MsIGdldCB0aG9zZSB0b28uCisJCQkgKi8KKwkJCWlmIChmaW5kZXggPT0gSU5UX0dFVChmcmVlLT5oZHIubnZhbGlkLCBBUkNIX0NPTlZFUlQpIC0gMSkgeworCQkJCWludAlpOwkJLyogZnJlZSBlbnRyeSBpbmRleCAqLworCisJCQkJZm9yIChpID0gZmluZGV4IC0gMTsKKwkJCQkgICAgIGkgPj0gMCAmJiBJTlRfR0VUKGZyZWUtPmJlc3RzW2ldLCBBUkNIX0NPTlZFUlQpID09IE5VTExEQVRBT0ZGOworCQkJCSAgICAgaS0tKQorCQkJCQljb250aW51ZTsKKwkJCQlJTlRfU0VUKGZyZWUtPmhkci5udmFsaWQsIEFSQ0hfQ09OVkVSVCwgaSArIDEpOworCQkJCWxvZ2ZyZWUgPSAwOworCQkJfQorCQkJLyoKKwkJCSAqIE5vdCB0aGUgbGFzdCBlbnRyeSwganVzdCBwdW5jaCBpdCBvdXQuCisJCQkgKi8KKwkJCWVsc2UgeworCQkJCUlOVF9TRVQoZnJlZS0+YmVzdHNbZmluZGV4XSwgQVJDSF9DT05WRVJULCBOVUxMREFUQU9GRik7CisJCQkJbG9nZnJlZSA9IDE7CisJCQl9CisJCQkvKgorCQkJICogSWYgdGhlcmUgYXJlIG5vIHVzZWZ1bCBlbnRyaWVzIGxlZnQgaW4gdGhlIGJsb2NrLAorCQkJICogZ2V0IHJpZCBvZiB0aGUgYmxvY2sgaWYgd2UgY2FuLgorCQkJICovCisJCQlpZiAoIWZyZWUtPmhkci5udXNlZCkgeworCQkJCWVycm9yID0geGZzX2RpcjJfc2hyaW5rX2lub2RlKGFyZ3MsIGZkYiwgZmJwKTsKKwkJCQlpZiAoZXJyb3IgPT0gMCkgeworCQkJCQlmYnAgPSBOVUxMOworCQkJCQlsb2dmcmVlID0gMDsKKwkJCQl9IGVsc2UgaWYgKGVycm9yICE9IEVOT1NQQyB8fCBhcmdzLT50b3RhbCAhPSAwKQorCQkJCQlyZXR1cm4gZXJyb3I7CisJCQkJLyoKKwkJCQkgKiBJdCdzIHBvc3NpYmxlIHRvIGdldCBFTk9TUEMgaWYgdGhlcmUgaXMgbm8KKwkJCQkgKiBzcGFjZSByZXNlcnZhdGlvbi4gIEluIHRoaXMgY2FzZSBzb21lIG9uZQorCQkJCSAqIGVsc2Ugd2lsbCBldmVudHVhbGx5IGdldCByaWQgb2YgdGhpcyBibG9jay4KKwkJCQkgKi8KKwkJCX0KKwkJfQorCQkvKgorCQkgKiBEYXRhIGJsb2NrIGlzIG5vdCBlbXB0eSwganVzdCBzZXQgdGhlIGZyZWUgZW50cnkgdG8KKwkJICogdGhlIG5ldyB2YWx1ZS4KKwkJICovCisJCWVsc2UgeworCQkJSU5UX1NFVChmcmVlLT5iZXN0c1tmaW5kZXhdLCBBUkNIX0NPTlZFUlQsIGxvbmdlc3QpOworCQkJbG9nZnJlZSA9IDE7CisJCX0KKwkJLyoKKwkJICogTG9nIHRoZSBmcmVlIGVudHJ5IHRoYXQgY2hhbmdlZCwgdW5sZXNzIHdlIGdvdCByaWQgb2YgaXQuCisJCSAqLworCQlpZiAobG9nZnJlZSkKKwkJCXhmc19kaXIyX2ZyZWVfbG9nX2Jlc3RzKHRwLCBmYnAsIGZpbmRleCwgZmluZGV4KTsKKwkJLyoKKwkJICogRHJvcCB0aGUgYnVmZmVyIGlmIHdlIHN0aWxsIGhhdmUgaXQuCisJCSAqLworCQlpZiAoZmJwKQorCQkJeGZzX2RhX2J1Zl9kb25lKGZicCk7CisJfQorCXhmc19kaXIyX2xlYWZuX2NoZWNrKGRwLCBicCk7CisJLyoKKwkgKiBSZXR1cm4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoaXMgbGVhZiBibG9jayBpcyBlbXRweSBlbm91Z2gKKwkgKiB0byBqdXN0aWZ5IHRyeWluZyB0byBqb2luIGl0IHdpdGggYSBuZWlnaGJvci4KKwkgKi8KKwkqcnZhbCA9CisJCSgodWludClzaXplb2YobGVhZi0+aGRyKSArCisJCSAodWludClzaXplb2YobGVhZi0+ZW50c1swXSkgKgorCQkgKElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gSU5UX0dFVChsZWFmLT5oZHIuc3RhbGUsIEFSQ0hfQ09OVkVSVCkpKSA8CisJCW1wLT5tX2Rpcl9tYWdpY3BjdDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNwbGl0IHRoZSBsZWFmIGVudHJpZXMgaW4gdGhlIG9sZCBibG9jayBpbnRvIG9sZCBhbmQgbmV3IGJsb2Nrcy4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX2xlYWZuX3NwbGl0KAorCXhmc19kYV9zdGF0ZV90CQkqc3RhdGUsCQkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfZGFfc3RhdGVfYmxrX3QJKm9sZGJsaywJLyogb3JpZ2luYWwgYmxvY2sgKi8KKwl4ZnNfZGFfc3RhdGVfYmxrX3QJKm5ld2JsaykJLyogbmV3bHkgY3JlYXRlZCBibG9jayAqLworeworCXhmc19kYV9hcmdzX3QJCSphcmdzOwkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworCXhmc19kYWJsa190CQlibGtubzsJCS8qIG5ldyBsZWFmIGJsb2NrIG51bWJlciAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKworCS8qCisJICogQWxsb2NhdGUgc3BhY2UgZm9yIGEgbmV3IGxlYWYgbm9kZS4KKwkgKi8KKwlhcmdzID0gc3RhdGUtPmFyZ3M7CisJbXAgPSBhcmdzLT5kcC0+aV9tb3VudDsKKwlBU1NFUlQoYXJncyAhPSBOVUxMKTsKKwlBU1NFUlQob2xkYmxrLT5tYWdpYyA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQyk7CisJZXJyb3IgPSB4ZnNfZGFfZ3Jvd19pbm9kZShhcmdzLCAmYmxrbm8pOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgbmV3IGxlYWYgYmxvY2suCisJICovCisJZXJyb3IgPSB4ZnNfZGlyMl9sZWFmX2luaXQoYXJncywgWEZTX0RJUjJfREFfVE9fREIobXAsIGJsa25vKSwKKwkJJm5ld2Jsay0+YnAsIFhGU19ESVIyX0xFQUZOX01BR0lDKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwluZXdibGstPmJsa25vID0gYmxrbm87CisJbmV3YmxrLT5tYWdpYyA9IFhGU19ESVIyX0xFQUZOX01BR0lDOworCS8qCisJICogUmViYWxhbmNlIHRoZSBlbnRyaWVzIGFjcm9zcyB0aGUgdHdvIGxlYXZlcywgbGluayB0aGUgbmV3CisJICogYmxvY2sgaW50byB0aGUgbGVhdmVzLgorCSAqLworCXhmc19kaXIyX2xlYWZuX3JlYmFsYW5jZShzdGF0ZSwgb2xkYmxrLCBuZXdibGspOworCWVycm9yID0geGZzX2RhX2Jsa19saW5rKHN0YXRlLCBvbGRibGssIG5ld2Jsayk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBJbnNlcnQgdGhlIG5ldyBlbnRyeSBpbiB0aGUgY29ycmVjdCBibG9jay4KKwkgKi8KKwlpZiAoc3RhdGUtPmlubGVhZikKKwkJZXJyb3IgPSB4ZnNfZGlyMl9sZWFmbl9hZGQob2xkYmxrLT5icCwgYXJncywgb2xkYmxrLT5pbmRleCk7CisJZWxzZQorCQllcnJvciA9IHhmc19kaXIyX2xlYWZuX2FkZChuZXdibGstPmJwLCBhcmdzLCBuZXdibGstPmluZGV4KTsKKwkvKgorCSAqIFVwZGF0ZSBsYXN0IGhhc2h2YWwgaW4gZWFjaCBibG9jayBzaW5jZSB3ZSBhZGRlZCB0aGUgbmFtZS4KKwkgKi8KKwlvbGRibGstPmhhc2h2YWwgPSB4ZnNfZGlyMl9sZWFmbl9sYXN0aGFzaChvbGRibGstPmJwLCBOVUxMKTsKKwluZXdibGstPmhhc2h2YWwgPSB4ZnNfZGlyMl9sZWFmbl9sYXN0aGFzaChuZXdibGstPmJwLCBOVUxMKTsKKwl4ZnNfZGlyMl9sZWFmbl9jaGVjayhhcmdzLT5kcCwgb2xkYmxrLT5icCk7CisJeGZzX2RpcjJfbGVhZm5fY2hlY2soYXJncy0+ZHAsIG5ld2Jsay0+YnApOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIENoZWNrIGEgbGVhZiBibG9jayBhbmQgaXRzIG5laWdoYm9ycyB0byBzZWUgaWYgdGhlIGJsb2NrIHNob3VsZCBiZQorICogY29sbGFwc2VkIGludG8gb25lIG9yIHRoZSBvdGhlciBuZWlnaGJvci4gIEFsd2F5cyBrZWVwIHRoZSBibG9jaworICogd2l0aCB0aGUgc21hbGxlciBibG9jayBudW1iZXIuCisgKiBJZiB0aGUgY3VycmVudCBibG9jayBpcyBvdmVyIDUwJSBmdWxsLCBkb24ndCB0cnkgdG8gam9pbiBpdCwgcmV0dXJuIDAuCisgKiBJZiB0aGUgYmxvY2sgaXMgZW1wdHksIGZpbGwgaW4gdGhlIHN0YXRlIHN0cnVjdHVyZSBhbmQgcmV0dXJuIDIuCisgKiBJZiBpdCBjYW4gYmUgY29sbGFwc2VkLCBmaWxsIGluIHRoZSBzdGF0ZSBzdHJ1Y3R1cmUgYW5kIHJldHVybiAxLgorICogSWYgbm90aGluZyBjYW4gYmUgZG9uZSwgcmV0dXJuIDAuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9sZWFmbl90b29zbWFsbCgKKwl4ZnNfZGFfc3RhdGVfdAkJKnN0YXRlLAkJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJKmFjdGlvbikJLyogcmVzdWx0aW5nIGFjdGlvbiB0byB0YWtlICovCit7CisJeGZzX2RhX3N0YXRlX2Jsa190CSpibGs7CQkvKiBsZWFmIGJsb2NrICovCisJeGZzX2RhYmxrX3QJCWJsa25vOwkJLyogbGVhZiBibG9jayBudW1iZXIgKi8KKwl4ZnNfZGFidWZfdAkJKmJwOwkJLyogbGVhZiBidWZmZXIgKi8KKwlpbnQJCQlieXRlczsJCS8qIGJ5dGVzIGluIHVzZSAqLworCWludAkJCWNvdW50OwkJLyogbGVhZiBsaXZlIGVudHJ5IGNvdW50ICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlmb3J3YXJkOwkvKiBzaWJsaW5nIGJsb2NrIGRpcmVjdGlvbiAqLworCWludAkJCWk7CQkvKiBzaWJsaW5nIGNvdW50ZXIgKi8KKwl4ZnNfZGFfYmxraW5mb190CSppbmZvOwkJLyogbGVhZiBibG9jayBoZWFkZXIgKi8KKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKwlpbnQJCQlydmFsOwkJLyogcmVzdWx0IGZyb20gcGF0aF9zaGlmdCAqLworCisJLyoKKwkgKiBDaGVjayBmb3IgdGhlIGRlZ2VuZXJhdGUgY2FzZSBvZiB0aGUgYmxvY2sgYmVpbmcgb3ZlciA1MCUgZnVsbC4KKwkgKiBJZiBzbywgaXQncyBub3Qgd29ydGggZXZlbiBsb29raW5nIHRvIHNlZSBpZiB3ZSBtaWdodCBiZSBhYmxlCisJICogdG8gY29hbGVzY2Ugd2l0aCBhIHNpYmxpbmcuCisJICovCisJYmxrID0gJnN0YXRlLT5wYXRoLmJsa1tzdGF0ZS0+cGF0aC5hY3RpdmUgLSAxXTsKKwlpbmZvID0gYmxrLT5icC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChpbmZvLT5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQyk7CisJbGVhZiA9ICh4ZnNfZGlyMl9sZWFmX3QgKilpbmZvOworCWNvdW50ID0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgLSBJTlRfR0VUKGxlYWYtPmhkci5zdGFsZSwgQVJDSF9DT05WRVJUKTsKKwlieXRlcyA9ICh1aW50KXNpemVvZihsZWFmLT5oZHIpICsgY291bnQgKiAodWludClzaXplb2YobGVhZi0+ZW50c1swXSk7CisJaWYgKGJ5dGVzID4gKHN0YXRlLT5ibG9ja3NpemUgPj4gMSkpIHsKKwkJLyoKKwkJICogQmxrIG92ZXIgNTAlLCBkb24ndCB0cnkgdG8gam9pbi4KKwkJICovCisJCSphY3Rpb24gPSAwOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBDaGVjayBmb3IgdGhlIGRlZ2VuZXJhdGUgY2FzZSBvZiB0aGUgYmxvY2sgYmVpbmcgZW1wdHkuCisJICogSWYgdGhlIGJsb2NrIGlzIGVtcHR5LCB3ZSdsbCBzaW1wbHkgZGVsZXRlIGl0LCBubyBuZWVkIHRvCisJICogY29hbGVzY2UgaXQgd2l0aCBhIHNpYmxpbmcgYmxvY2suICBXZSBjaG9vc2UgKGFyYml0cmFyaWx5KQorCSAqIHRvIG1lcmdlIHdpdGggdGhlIGZvcndhcmQgYmxvY2sgdW5sZXNzIGl0IGlzIE5VTEwuCisJICovCisJaWYgKGNvdW50ID09IDApIHsKKwkJLyoKKwkJICogTWFrZSBhbHRwYXRoIHBvaW50IHRvIHRoZSBibG9jayB3ZSB3YW50IHRvIGtlZXAgYW5kCisJCSAqIHBhdGggcG9pbnQgdG8gdGhlIGJsb2NrIHdlIHdhbnQgdG8gZHJvcCAodGhpcyBvbmUpLgorCQkgKi8KKwkJZm9yd2FyZCA9IGluZm8tPmZvcnc7CisJCW1lbWNweSgmc3RhdGUtPmFsdHBhdGgsICZzdGF0ZS0+cGF0aCwgc2l6ZW9mKHN0YXRlLT5wYXRoKSk7CisJCWVycm9yID0geGZzX2RhX3BhdGhfc2hpZnQoc3RhdGUsICZzdGF0ZS0+YWx0cGF0aCwgZm9yd2FyZCwgMCwKKwkJCSZydmFsKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCQkqYWN0aW9uID0gcnZhbCA/IDIgOiAwOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBFeGFtaW5lIGVhY2ggc2libGluZyBibG9jayB0byBzZWUgaWYgd2UgY2FuIGNvYWxlc2NlIHdpdGgKKwkgKiBhdCBsZWFzdCAyNSUgZnJlZSBzcGFjZSB0byBzcGFyZS4gIFdlIG5lZWQgdG8gZmlndXJlIG91dAorCSAqIHdoZXRoZXIgdG8gbWVyZ2Ugd2l0aCB0aGUgZm9yd2FyZCBvciB0aGUgYmFja3dhcmQgYmxvY2suCisJICogV2UgcHJlZmVyIGNvYWxlc2Npbmcgd2l0aCB0aGUgbG93ZXIgbnVtYmVyZWQgc2libGluZyBzbyBhcworCSAqIHRvIHNocmluayBhIGRpcmVjdG9yeSBvdmVyIHRpbWUuCisJICovCisJZm9yd2FyZCA9IElOVF9HRVQoaW5mby0+Zm9ydywgQVJDSF9DT05WRVJUKSA8IElOVF9HRVQoaW5mby0+YmFjaywgQVJDSF9DT05WRVJUKTsKKwlmb3IgKGkgPSAwLCBicCA9IE5VTEw7IGkgPCAyOyBmb3J3YXJkID0gIWZvcndhcmQsIGkrKykgeworCQlibGtubyA9IGZvcndhcmQgP0lOVF9HRVQoIGluZm8tPmZvcncsIEFSQ0hfQ09OVkVSVCkgOiBJTlRfR0VUKGluZm8tPmJhY2ssIEFSQ0hfQ09OVkVSVCk7CisJCWlmIChibGtubyA9PSAwKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIFJlYWQgdGhlIHNpYmxpbmcgbGVhZiBibG9jay4KKwkJICovCisJCWlmICgoZXJyb3IgPQorCQkgICAgeGZzX2RhX3JlYWRfYnVmKHN0YXRlLT5hcmdzLT50cmFucywgc3RhdGUtPmFyZ3MtPmRwLCBibGtubywKKwkJCSAgICAtMSwgJmJwLCBYRlNfREFUQV9GT1JLKSkpIHsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlBU1NFUlQoYnAgIT0gTlVMTCk7CisJCS8qCisJCSAqIENvdW50IGJ5dGVzIGluIHRoZSB0d28gYmxvY2tzIGNvbWJpbmVkLgorCQkgKi8KKwkJbGVhZiA9ICh4ZnNfZGlyMl9sZWFmX3QgKilpbmZvOworCQljb3VudCA9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gSU5UX0dFVChsZWFmLT5oZHIuc3RhbGUsIEFSQ0hfQ09OVkVSVCk7CisJCWJ5dGVzID0gc3RhdGUtPmJsb2Nrc2l6ZSAtIChzdGF0ZS0+YmxvY2tzaXplID4+IDIpOworCQlsZWFmID0gYnAtPmRhdGE7CisJCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0xFQUZOX01BR0lDKTsKKwkJY291bnQgKz0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgLSBJTlRfR0VUKGxlYWYtPmhkci5zdGFsZSwgQVJDSF9DT05WRVJUKTsKKwkJYnl0ZXMgLT0gY291bnQgKiAodWludClzaXplb2YobGVhZi0+ZW50c1swXSk7CisJCS8qCisJCSAqIEZpdHMgd2l0aCBhdCBsZWFzdCAyNSUgdG8gc3BhcmUuCisJCSAqLworCQlpZiAoYnl0ZXMgPj0gMCkKKwkJCWJyZWFrOworCQl4ZnNfZGFfYnJlbHNlKHN0YXRlLT5hcmdzLT50cmFucywgYnApOworCX0KKwkvKgorCSAqIERpZG4ndCBsaWtlIGVpdGhlciBibG9jaywgZ2l2ZSB1cC4KKwkgKi8KKwlpZiAoaSA+PSAyKSB7CisJCSphY3Rpb24gPSAwOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBEb25lIHdpdGggdGhlIHNpYmxpbmcgbGVhZiBibG9jayBoZXJlLCBkcm9wIHRoZSBkYWJ1ZgorCSAqIHNvIHBhdGhfc2hpZnQgY2FuIGdldCBpdC4KKwkgKi8KKwl4ZnNfZGFfYnVmX2RvbmUoYnApOworCS8qCisJICogTWFrZSBhbHRwYXRoIHBvaW50IHRvIHRoZSBibG9jayB3ZSB3YW50IHRvIGtlZXAgKHRoZSBsb3dlcgorCSAqIG51bWJlcmVkIGJsb2NrKSBhbmQgcGF0aCBwb2ludCB0byB0aGUgYmxvY2sgd2Ugd2FudCB0byBkcm9wLgorCSAqLworCW1lbWNweSgmc3RhdGUtPmFsdHBhdGgsICZzdGF0ZS0+cGF0aCwgc2l6ZW9mKHN0YXRlLT5wYXRoKSk7CisJaWYgKGJsa25vIDwgYmxrLT5ibGtubykKKwkJZXJyb3IgPSB4ZnNfZGFfcGF0aF9zaGlmdChzdGF0ZSwgJnN0YXRlLT5hbHRwYXRoLCBmb3J3YXJkLCAwLAorCQkJJnJ2YWwpOworCWVsc2UKKwkJZXJyb3IgPSB4ZnNfZGFfcGF0aF9zaGlmdChzdGF0ZSwgJnN0YXRlLT5wYXRoLCBmb3J3YXJkLCAwLAorCQkJJnJ2YWwpOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCSphY3Rpb24gPSBydmFsID8gMCA6IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNb3ZlIGFsbCB0aGUgbGVhZiBlbnRyaWVzIGZyb20gZHJvcF9ibGsgdG8gc2F2ZV9ibGsuCisgKiBUaGlzIGlzIGRvbmUgYXMgcGFydCBvZiBhIGpvaW4gb3BlcmF0aW9uLgorICovCit2b2lkCit4ZnNfZGlyMl9sZWFmbl91bmJhbGFuY2UoCisJeGZzX2RhX3N0YXRlX3QJCSpzdGF0ZSwJCS8qIGN1cnNvciAqLworCXhmc19kYV9zdGF0ZV9ibGtfdAkqZHJvcF9ibGssCS8qIGRlYWQgYmxvY2sgKi8KKwl4ZnNfZGFfc3RhdGVfYmxrX3QJKnNhdmVfYmxrKQkvKiBzdXJ2aXZpbmcgYmxvY2sgKi8KK3sKKwl4ZnNfZGFfYXJnc190CQkqYXJnczsJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfZGlyMl9sZWFmX3QJCSpkcm9wX2xlYWY7CS8qIGRlYWQgbGVhZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX3QJCSpzYXZlX2xlYWY7CS8qIHN1cnZpdmluZyBsZWFmIHN0cnVjdHVyZSAqLworCisJYXJncyA9IHN0YXRlLT5hcmdzOworCUFTU0VSVChkcm9wX2Jsay0+bWFnaWMgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCUFTU0VSVChzYXZlX2Jsay0+bWFnaWMgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCWRyb3BfbGVhZiA9IGRyb3BfYmxrLT5icC0+ZGF0YTsKKwlzYXZlX2xlYWYgPSBzYXZlX2Jsay0+YnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQoZHJvcF9sZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQyk7CisJQVNTRVJUKElOVF9HRVQoc2F2ZV9sZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQyk7CisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgYW55IHN0YWxlIGxlYWYgZW50cmllcywgdGFrZSB0aGlzIG9wcG9ydHVuaXR5CisJICogdG8gcHVyZ2UgdGhlbS4KKwkgKi8KKwlpZiAoSU5UX0dFVChkcm9wX2xlYWYtPmhkci5zdGFsZSwgQVJDSF9DT05WRVJUKSkKKwkJeGZzX2RpcjJfbGVhZl9jb21wYWN0KGFyZ3MsIGRyb3BfYmxrLT5icCk7CisJaWYgKElOVF9HRVQoc2F2ZV9sZWFmLT5oZHIuc3RhbGUsIEFSQ0hfQ09OVkVSVCkpCisJCXhmc19kaXIyX2xlYWZfY29tcGFjdChhcmdzLCBzYXZlX2Jsay0+YnApOworCS8qCisJICogTW92ZSB0aGUgZW50cmllcyBmcm9tIGRyb3AgdG8gdGhlIGFwcHJvcHJpYXRlIGVuZCBvZiBzYXZlLgorCSAqLworCWRyb3BfYmxrLT5oYXNodmFsID0gSU5UX0dFVChkcm9wX2xlYWYtPmVudHNbSU5UX0dFVChkcm9wX2xlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIDFdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisJaWYgKHhmc19kaXIyX2xlYWZuX29yZGVyKHNhdmVfYmxrLT5icCwgZHJvcF9ibGstPmJwKSkKKwkJeGZzX2RpcjJfbGVhZm5fbW92ZWVudHMoYXJncywgZHJvcF9ibGstPmJwLCAwLCBzYXZlX2Jsay0+YnAsIDAsCisJCQlJTlRfR0VUKGRyb3BfbGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKTsKKwllbHNlCisJCXhmc19kaXIyX2xlYWZuX21vdmVlbnRzKGFyZ3MsIGRyb3BfYmxrLT5icCwgMCwgc2F2ZV9ibGstPmJwLAorCQkJSU5UX0dFVChzYXZlX2xlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSwgSU5UX0dFVChkcm9wX2xlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSk7CisJc2F2ZV9ibGstPmhhc2h2YWwgPSBJTlRfR0VUKHNhdmVfbGVhZi0+ZW50c1tJTlRfR0VUKHNhdmVfbGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gMV0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKTsKKwl4ZnNfZGlyMl9sZWFmbl9jaGVjayhhcmdzLT5kcCwgc2F2ZV9ibGstPmJwKTsKK30KKworLyoKKyAqIFRvcC1sZXZlbCBub2RlIGZvcm0gZGlyZWN0b3J5IGFkZG5hbWUgcm91dGluZS4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX25vZGVfYWRkbmFtZSgKKwl4ZnNfZGFfYXJnc190CQkqYXJncykJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KK3sKKwl4ZnNfZGFfc3RhdGVfYmxrX3QJKmJsazsJCS8qIGxlYWYgYmxvY2sgZm9yIGluc2VydCAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQkJcnZhbDsJCS8qIHN1Yi1yZXR1cm4gdmFsdWUgKi8KKwl4ZnNfZGFfc3RhdGVfdAkJKnN0YXRlOwkJLyogYnRyZWUgY3Vyc29yICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzKCJub2RlX2FkZG5hbWUiLCBhcmdzKTsKKwkvKgorCSAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBzdGF0ZSAoYnRyZWUgY3Vyc29yKS4KKwkgKi8KKwlzdGF0ZSA9IHhmc19kYV9zdGF0ZV9hbGxvYygpOworCXN0YXRlLT5hcmdzID0gYXJnczsKKwlzdGF0ZS0+bXAgPSBhcmdzLT5kcC0+aV9tb3VudDsKKwlzdGF0ZS0+YmxvY2tzaXplID0gc3RhdGUtPm1wLT5tX2RpcmJsa3NpemU7CisJc3RhdGUtPm5vZGVfZW50cyA9IHN0YXRlLT5tcC0+bV9kaXJfbm9kZV9lbnRzOworCS8qCisJICogTG9vayB1cCB0aGUgbmFtZS4gIFdlJ3JlIG5vdCBzdXBwb3NlZCB0byBmaW5kIGl0LCBidXQKKwkgKiB0aGlzIGdpdmVzIHVzIHRoZSBpbnNlcnRpb24gcG9pbnQuCisJICovCisJZXJyb3IgPSB4ZnNfZGFfbm9kZV9sb29rdXBfaW50KHN0YXRlLCAmcnZhbCk7CisJaWYgKGVycm9yKQorCQlydmFsID0gZXJyb3I7CisJaWYgKHJ2YWwgIT0gRU5PRU5UKSB7CisJCWdvdG8gZG9uZTsKKwl9CisJLyoKKwkgKiBBZGQgdGhlIGRhdGEgZW50cnkgdG8gYSBkYXRhIGJsb2NrLgorCSAqIEV4dHJhdmFsaWQgaXMgc2V0IHRvIGEgZnJlZWJsb2NrIGZvdW5kIGJ5IGxvb2t1cC4KKwkgKi8KKwlydmFsID0geGZzX2RpcjJfbm9kZV9hZGRuYW1lX2ludChhcmdzLAorCQlzdGF0ZS0+ZXh0cmF2YWxpZCA/ICZzdGF0ZS0+ZXh0cmFibGsgOiBOVUxMKTsKKwlpZiAocnZhbCkgeworCQlnb3RvIGRvbmU7CisJfQorCWJsayA9ICZzdGF0ZS0+cGF0aC5ibGtbc3RhdGUtPnBhdGguYWN0aXZlIC0gMV07CisJQVNTRVJUKGJsay0+bWFnaWMgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCS8qCisJICogQWRkIHRoZSBuZXcgbGVhZiBlbnRyeS4KKwkgKi8KKwlydmFsID0geGZzX2RpcjJfbGVhZm5fYWRkKGJsay0+YnAsIGFyZ3MsIGJsay0+aW5kZXgpOworCWlmIChydmFsID09IDApIHsKKwkJLyoKKwkJICogSXQgd29ya2VkLCBmaXggdGhlIGhhc2ggdmFsdWVzIHVwIHRoZSBidHJlZS4KKwkJICovCisJCWlmICghYXJncy0+anVzdGNoZWNrKQorCQkJeGZzX2RhX2ZpeGhhc2hwYXRoKHN0YXRlLCAmc3RhdGUtPnBhdGgpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEl0IGRpZG4ndCB3b3JrLCB3ZSBuZWVkIHRvIHNwbGl0IHRoZSBsZWFmIGJsb2NrLgorCQkgKi8KKwkJaWYgKGFyZ3MtPnRvdGFsID09IDApIHsKKwkJCUFTU0VSVChydmFsID09IEVOT1NQQyk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJLyoKKwkJICogU3BsaXQgdGhlIGxlYWYgYmxvY2sgYW5kIGluc2VydCB0aGUgbmV3IGVudHJ5LgorCQkgKi8KKwkJcnZhbCA9IHhmc19kYV9zcGxpdChzdGF0ZSk7CisJfQorZG9uZToKKwl4ZnNfZGFfc3RhdGVfZnJlZShzdGF0ZSk7CisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBBZGQgdGhlIGRhdGEgZW50cnkgZm9yIGEgbm9kZS1mb3JtYXQgZGlyZWN0b3J5IG5hbWUgYWRkaXRpb24uCisgKiBUaGUgbGVhZiBlbnRyeSBpcyBhZGRlZCBpbiB4ZnNfZGlyMl9sZWFmbl9hZGQuCisgKiBXZSBtYXkgZW50ZXIgd2l0aCBhIGZyZWVzcGFjZSBibG9jayB0aGF0IHRoZSBsb29rdXAgZm91bmQuCisgKi8KK3N0YXRpYyBpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9ub2RlX2FkZG5hbWVfaW50KAorCXhmc19kYV9hcmdzX3QJCSphcmdzLAkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworCXhmc19kYV9zdGF0ZV9ibGtfdAkqZmJsaykJCS8qIG9wdGlvbmFsIGZyZWVzcGFjZSBibG9jayAqLworeworCXhmc19kaXIyX2RhdGFfdAkJKmRhdGE7CQkvKiBkYXRhIGJsb2NrIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2RiX3QJCWRibm87CQkvKiBkYXRhIGJsb2NrIG51bWJlciAqLworCXhmc19kYWJ1Zl90CQkqZGJwOwkJLyogZGF0YSBibG9jayBidWZmZXIgKi8KKwl4ZnNfZGlyMl9kYXRhX2VudHJ5X3QJKmRlcDsJCS8qIGRhdGEgZW50cnkgcG9pbnRlciAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJeGZzX2RpcjJfZGF0YV91bnVzZWRfdAkqZHVwOwkJLyogZGF0YSB1bnVzZWQgZW50cnkgcG9pbnRlciAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX2RpcjJfZGJfdAkJZmJubzsJCS8qIGZyZWVzcGFjZSBibG9jayBudW1iZXIgKi8KKwl4ZnNfZGFidWZfdAkJKmZicDsJCS8qIGZyZWVzcGFjZSBidWZmZXIgKi8KKwlpbnQJCQlmaW5kZXg7CQkvKiBmcmVlc3BhY2UgZW50cnkgaW5kZXggKi8KKwl4ZnNfZGlyMl9mcmVlX3QJCSpmcmVlPU5VTEw7CS8qIGZyZWVzcGFjZSBibG9jayBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9kYl90CQlpZmJubzsJCS8qIGluaXRpYWwgZnJlZXNwYWNlIGJsb2NrIG5vICovCisJeGZzX2RpcjJfZGJfdAkJbGFzdGZibm89MDsJLyogaGlnaGVzdCBmcmVlc3BhY2UgYmxvY2sgbm8gKi8KKwlpbnQJCQlsZW5ndGg7CQkvKiBsZW5ndGggb2YgdGhlIG5ldyBlbnRyeSAqLworCWludAkJCWxvZ2ZyZWU7CS8qIG5lZWQgdG8gbG9nIGZyZWUgZW50cnkgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCWludAkJCW5lZWRsb2c7CS8qIG5lZWQgdG8gbG9nIGRhdGEgaGVhZGVyICovCisJaW50CQkJbmVlZHNjYW47CS8qIG5lZWQgdG8gcmVzY2FuIGRhdGEgZnJlZXMgKi8KKwl4ZnNfZGlyMl9kYXRhX29mZl90CSp0YWdwOwkJLyogZGF0YSBlbnRyeSB0YWcgcG9pbnRlciAqLworCXhmc190cmFuc190CQkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisKKwlkcCA9IGFyZ3MtPmRwOworCW1wID0gZHAtPmlfbW91bnQ7CisJdHAgPSBhcmdzLT50cmFuczsKKwlsZW5ndGggPSBYRlNfRElSMl9EQVRBX0VOVFNJWkUoYXJncy0+bmFtZWxlbik7CisJLyoKKwkgKiBJZiB3ZSBjYW1lIGluIHdpdGggYSBmcmVlc3BhY2UgYmxvY2sgdGhhdCBtZWFucyB0aGF0IGxvb2t1cAorCSAqIGZvdW5kIGFuIGVudHJ5IHdpdGggb3VyIGhhc2ggdmFsdWUuICBUaGlzIGlzIHRoZSBmcmVlc3BhY2UKKwkgKiBibG9jayBmb3IgdGhhdCBkYXRhIGVudHJ5LgorCSAqLworCWlmIChmYmxrKSB7CisJCWZicCA9IGZibGstPmJwOworCQkvKgorCQkgKiBSZW1lbWJlciBpbml0aWFsIGZyZWVzcGFjZSBibG9jayBudW1iZXIuCisJCSAqLworCQlpZmJubyA9IGZibGstPmJsa25vOworCQlmcmVlID0gZmJwLT5kYXRhOworCQlBU1NFUlQoSU5UX0dFVChmcmVlLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfRlJFRV9NQUdJQyk7CisJCWZpbmRleCA9IGZibGstPmluZGV4OworCQkvKgorCQkgKiBUaGlzIG1lYW5zIHRoZSBmcmVlIGVudHJ5IHNob3dlZCB0aGF0IHRoZSBkYXRhIGJsb2NrIGhhZAorCQkgKiBzcGFjZSBmb3Igb3VyIGVudHJ5LCBzbyB3ZSByZW1lbWJlcmVkIGl0LgorCQkgKiBVc2UgdGhhdCBkYXRhIGJsb2NrLgorCQkgKi8KKwkJaWYgKGZpbmRleCA+PSAwKSB7CisJCQlBU1NFUlQoZmluZGV4IDwgSU5UX0dFVChmcmVlLT5oZHIubnZhbGlkLCBBUkNIX0NPTlZFUlQpKTsKKwkJCUFTU0VSVChJTlRfR0VUKGZyZWUtPmJlc3RzW2ZpbmRleF0sIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTERBVEFPRkYpOworCQkJQVNTRVJUKElOVF9HRVQoZnJlZS0+YmVzdHNbZmluZGV4XSwgQVJDSF9DT05WRVJUKSA+PSBsZW5ndGgpOworCQkJZGJubyA9IElOVF9HRVQoZnJlZS0+aGRyLmZpcnN0ZGIsIEFSQ0hfQ09OVkVSVCkgKyBmaW5kZXg7CisJCX0KKwkJLyoKKwkJICogVGhlIGRhdGEgYmxvY2sgbG9va2VkIGF0IGRpZG4ndCBoYXZlIGVub3VnaCByb29tLgorCQkgKiBXZSdsbCBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmcmVlc3BhY2UgZW50cmllcy4KKwkJICovCisJCWVsc2UgeworCQkJZGJubyA9IC0xOworCQkJZmluZGV4ID0gMDsKKwkJfQorCX0KKwkvKgorCSAqIERpZG4ndCBjb21lIGluIHdpdGggYSBmcmVlc3BhY2UgYmxvY2ssIHNvIGRvbid0IGhhdmUgYSBkYXRhIGJsb2NrLgorCSAqLworCWVsc2UgeworCQlpZmJubyA9IGRibm8gPSAtMTsKKwkJZmJwID0gTlVMTDsKKwkJZmluZGV4ID0gMDsKKwl9CisJLyoKKwkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgZGF0YSBibG9jayB5ZXQsIHdlJ3JlIGdvaW5nIHRvIHNjYW4gdGhlCisJICogZnJlZXNwYWNlIGJsb2NrcyBsb29raW5nIGZvciBvbmUuICBGaWd1cmUgb3V0IHdoYXQgdGhlCisJICogaGlnaGVzdCBmcmVlc3BhY2UgYmxvY2sgbnVtYmVyIGlzLgorCSAqLworCWlmIChkYm5vID09IC0xKSB7CisJCXhmc19maWxlb2ZmX3QJZm87CQkvKiBmcmVlc3BhY2UgYmxvY2sgbnVtYmVyICovCisKKwkJaWYgKChlcnJvciA9IHhmc19ibWFwX2xhc3Rfb2Zmc2V0KHRwLCBkcCwgJmZvLCBYRlNfREFUQV9GT1JLKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCWxhc3RmYm5vID0gWEZTX0RJUjJfREFfVE9fREIobXAsICh4ZnNfZGFibGtfdClmbyk7CisJCWZibm8gPSBpZmJubzsKKwl9CisJLyoKKwkgKiBXaGlsZSB3ZSBoYXZlbid0IGlkZW50aWZpZWQgYSBkYXRhIGJsb2NrLCBzZWFyY2ggdGhlIGZyZWVibG9jaworCSAqIGRhdGEgZm9yIGEgZ29vZCBkYXRhIGJsb2NrLiAgSWYgd2UgZmluZCBhIG51bGwgZnJlZWJsb2NrIGVudHJ5LAorCSAqIGluZGljYXRpbmcgYSBob2xlIGluIHRoZSBkYXRhIGJsb2NrcywgcmVtZW1iZXIgdGhhdC4KKwkgKi8KKwl3aGlsZSAoZGJubyA9PSAtMSkgeworCQkvKgorCQkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgZnJlZWJsb2NrIGluIGhhbmQsIGdldCB0aGUgbmV4dCBvbmUuCisJCSAqLworCQlpZiAoZmJwID09IE5VTEwpIHsKKwkJCS8qCisJCQkgKiBIYXBwZW5zIHRoZSBmaXJzdCB0aW1lIHRocm91Z2ggdW5sZXNzIGxvb2t1cCBnYXZlCisJCQkgKiB1cyBhIGZyZWVzcGFjZSBibG9jayB0byBzdGFydCB3aXRoLgorCQkJICovCisJCQlpZiAoKytmYm5vID09IDApCisJCQkJZmJubyA9IFhGU19ESVIyX0ZSRUVfRklSU1REQihtcCk7CisJCQkvKgorCQkJICogSWYgaXQncyBpZmJubyB3ZSBhbHJlYWR5IGxvb2tlZCBhdCBpdC4KKwkJCSAqLworCQkJaWYgKGZibm8gPT0gaWZibm8pCisJCQkJZmJubysrOworCQkJLyoKKwkJCSAqIElmIGl0J3Mgb2ZmIHRoZSBlbmQgd2UncmUgZG9uZS4KKwkJCSAqLworCQkJaWYgKGZibm8gPj0gbGFzdGZibm8pCisJCQkJYnJlYWs7CisJCQkvKgorCQkJICogUmVhZCB0aGUgYmxvY2suICBUaGVyZSBjYW4gYmUgaG9sZXMgaW4gdGhlCisJCQkgKiBmcmVlc3BhY2UgYmxvY2tzLCBzbyB0aGlzIG1pZ2h0IG5vdCBzdWNjZWVkLgorCQkJICogVGhpcyBzaG91bGQgYmUgcmVhbGx5IHJhcmUsIHNvIHRoZXJlJ3Mgbm8gcmVhc29uCisJCQkgKiB0byBhdm9pZCBpdC4KKwkJCSAqLworCQkJaWYgKChlcnJvciA9IHhmc19kYV9yZWFkX2J1Zih0cCwgZHAsCisJCQkJCVhGU19ESVIyX0RCX1RPX0RBKG1wLCBmYm5vKSwgLTIsICZmYnAsCisJCQkJCVhGU19EQVRBX0ZPUkspKSkgeworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCWlmICh1bmxpa2VseShmYnAgPT0gTlVMTCkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWZyZWUgPSBmYnAtPmRhdGE7CisJCQlBU1NFUlQoSU5UX0dFVChmcmVlLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfRlJFRV9NQUdJQyk7CisJCQlmaW5kZXggPSAwOworCQl9CisJCS8qCisJCSAqIExvb2sgYXQgdGhlIGN1cnJlbnQgZnJlZSBlbnRyeS4gIElzIGl0IGdvb2QgZW5vdWdoPworCQkgKi8KKwkJaWYgKElOVF9HRVQoZnJlZS0+YmVzdHNbZmluZGV4XSwgQVJDSF9DT05WRVJUKSAhPSBOVUxMREFUQU9GRiAmJgorCQkgICAgSU5UX0dFVChmcmVlLT5iZXN0c1tmaW5kZXhdLCBBUkNIX0NPTlZFUlQpID49IGxlbmd0aCkKKwkJCWRibm8gPSBJTlRfR0VUKGZyZWUtPmhkci5maXJzdGRiLCBBUkNIX0NPTlZFUlQpICsgZmluZGV4OworCQllbHNlIHsKKwkJCS8qCisJCQkgKiBBcmUgd2UgZG9uZSB3aXRoIHRoZSBmcmVlYmxvY2s/CisJCQkgKi8KKwkJCWlmICgrK2ZpbmRleCA9PSBJTlRfR0VUKGZyZWUtPmhkci5udmFsaWQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCQkvKgorCQkJCSAqIERyb3AgdGhlIGJsb2NrLgorCQkJCSAqLworCQkJCXhmc19kYV9icmVsc2UodHAsIGZicCk7CisJCQkJZmJwID0gTlVMTDsKKwkJCQlpZiAoZmJsayAmJiBmYmxrLT5icCkKKwkJCQkJZmJsay0+YnAgPSBOVUxMOworCQkJfQorCQl9CisJfQorCS8qCisJICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGRhdGEgYmxvY2ssIHdlIG5lZWQgdG8gYWxsb2NhdGUgb25lIGFuZCBtYWtlCisJICogdGhlIGZyZWVzcGFjZSBlbnRyaWVzIHJlZmVyIHRvIGl0LgorCSAqLworCWlmICh1bmxpa2VseShkYm5vID09IC0xKSkgeworCQkvKgorCQkgKiBOb3QgYWxsb3dlZCB0byBhbGxvY2F0ZSwgcmV0dXJuIGZhaWx1cmUuCisJCSAqLworCQlpZiAoYXJncy0+anVzdGNoZWNrIHx8IGFyZ3MtPnRvdGFsID09IDApIHsKKwkJCS8qCisJCQkgKiBEcm9wIHRoZSBmcmVlc3BhY2UgYnVmZmVyIHVubGVzcyBpdCBjYW1lIGZyb20gb3VyCisJCQkgKiBjYWxsZXIuCisJCQkgKi8KKwkJCWlmICgoZmJsayA9PSBOVUxMIHx8IGZibGstPmJwID09IE5VTEwpICYmIGZicCAhPSBOVUxMKQorCQkJCXhmc19kYV9idWZfZG9uZShmYnApOworCQkJcmV0dXJuIFhGU19FUlJPUihFTk9TUEMpOworCQl9CisJCS8qCisJCSAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBuZXcgZGF0YSBibG9jay4KKwkJICovCisJCWlmICh1bmxpa2VseSgoZXJyb3IgPSB4ZnNfZGlyMl9ncm93X2lub2RlKGFyZ3MsCisJCQkJCQkJIFhGU19ESVIyX0RBVEFfU1BBQ0UsCisJCQkJCQkJICZkYm5vKSkgfHwKKwkJICAgIChlcnJvciA9IHhmc19kaXIyX2RhdGFfaW5pdChhcmdzLCBkYm5vLCAmZGJwKSkpKSB7CisJCQkvKgorCQkJICogRHJvcCB0aGUgZnJlZXNwYWNlIGJ1ZmZlciB1bmxlc3MgaXQgY2FtZSBmcm9tIG91cgorCQkJICogY2FsbGVyLgorCQkJICovCisJCQlpZiAoKGZibGsgPT0gTlVMTCB8fCBmYmxrLT5icCA9PSBOVUxMKSAmJiBmYnAgIT0gTlVMTCkKKwkJCQl4ZnNfZGFfYnVmX2RvbmUoZmJwKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQkvKgorCQkgKiBJZiAoc29tZWhvdykgd2UgaGF2ZSBhIGZyZWVzcGFjZSBibG9jaywgZ2V0IHJpZCBvZiBpdC4KKwkJICovCisJCWlmIChmYnApCisJCQl4ZnNfZGFfYnJlbHNlKHRwLCBmYnApOworCQlpZiAoZmJsayAmJiBmYmxrLT5icCkKKwkJCWZibGstPmJwID0gTlVMTDsKKworCQkvKgorCQkgKiBHZXQgdGhlIGZyZWVzcGFjZSBibG9jayBjb3JyZXNwb25kaW5nIHRvIHRoZSBkYXRhIGJsb2NrCisJCSAqIHRoYXQgd2FzIGp1c3QgYWxsb2NhdGVkLgorCQkgKi8KKwkJZmJubyA9IFhGU19ESVIyX0RCX1RPX0ZEQihtcCwgZGJubyk7CisJCWlmICh1bmxpa2VseShlcnJvciA9IHhmc19kYV9yZWFkX2J1Zih0cCwgZHAsCisJCQkJWEZTX0RJUjJfREJfVE9fREEobXAsIGZibm8pLCAtMiwgJmZicCwKKwkJCQlYRlNfREFUQV9GT1JLKSkpIHsKKwkJCXhmc19kYV9idWZfZG9uZShkYnApOworCQkJcmV0dXJuIGVycm9yOworICAJCX0KKwkJLyoKKwkJICogSWYgdGhlcmUgd2Fzbid0IGEgZnJlZXNwYWNlIGJsb2NrLCB0aGUgcmVhZCB3aWxsCisJCSAqIHJldHVybiBhIE5VTEwgZmJwLiAgQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgb25lLgorCQkgKi8KKwkJaWYoIGZicCA9PSBOVUxMICkgeworCQkJaWYgKChlcnJvciA9IHhmc19kaXIyX2dyb3dfaW5vZGUoYXJncywgWEZTX0RJUjJfRlJFRV9TUEFDRSwKKwkJCQkJCQkmZmJubykpKSB7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCisJCQlpZiAodW5saWtlbHkoWEZTX0RJUjJfREJfVE9fRkRCKG1wLCBkYm5vKSAhPSBmYm5vKSkgeworCQkJCWNtbl9lcnIoQ0VfQUxFUlQsCisJCQkJCSJ4ZnNfZGlyMl9ub2RlX2FkZG5hbWVfaW50OiBkaXIgaW5vICIKKwkJCQkJIiVsbHUgbmVlZGVkIGZyZWVzcCBibG9jayAlbGxkIGZvclxuIgorCQkJCQkiICBkYXRhIGJsb2NrICVsbGQsIGdvdCAlbGxkXG4iCisJCQkJCSIgIGlmYm5vICVsbHUgbGFzdGZibm8gJWRcbiIsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZHAtPmlfaW5vLAorCQkJCQkobG9uZyBsb25nKVhGU19ESVIyX0RCX1RPX0ZEQihtcCwgZGJubyksCisJCQkJCShsb25nIGxvbmcpZGJubywgKGxvbmcgbG9uZylmYm5vLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWlmYm5vLCBsYXN0ZmJubyk7CisJCQkJaWYgKGZibGspIHsKKwkJCQkJY21uX2VycihDRV9BTEVSVCwKKwkJCQkJCSIgZmJsayAweCVwIGJsa25vICVsbHUgIgorCQkJCQkJImluZGV4ICVkIG1hZ2ljIDB4JXhcbiIsCisJCQkJCQlmYmxrLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylmYmxrLT5ibGtubywKKwkJCQkJCWZibGstPmluZGV4LAorCQkJCQkJZmJsay0+bWFnaWMpOworCQkJCX0gZWxzZSB7CisJCQkJCWNtbl9lcnIoQ0VfQUxFUlQsCisJCQkJCQkiIC4uLiBmYmxrIGlzIE5VTExcbiIpOworCQkJCX0KKwkJCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfZGlyMl9ub2RlX2FkZG5hbWVfaW50IiwKKwkJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQkJfQorCisJCQkvKgorCQkJICogR2V0IGEgYnVmZmVyIGZvciB0aGUgbmV3IGJsb2NrLgorCQkJICovCisJCQlpZiAoKGVycm9yID0geGZzX2RhX2dldF9idWYodHAsIGRwLAorCQkJCQkJICAgWEZTX0RJUjJfREJfVE9fREEobXAsIGZibm8pLAorCQkJCQkJICAgLTEsICZmYnAsIFhGU19EQVRBX0ZPUkspKSkgeworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCUFTU0VSVChmYnAgIT0gTlVMTCk7CisKKwkJCS8qCisJCQkgKiBJbml0aWFsaXplIHRoZSBuZXcgYmxvY2sgdG8gYmUgZW1wdHksIGFuZCByZW1lbWJlcgorCQkJICogaXRzIGZpcnN0IHNsb3QgYXMgb3VyIGVtcHR5IHNsb3QuCisJCQkgKi8KKwkJCWZyZWUgPSBmYnAtPmRhdGE7CisJCQlJTlRfU0VUKGZyZWUtPmhkci5tYWdpYywgQVJDSF9DT05WRVJULCBYRlNfRElSMl9GUkVFX01BR0lDKTsKKwkJCUlOVF9TRVQoZnJlZS0+aGRyLmZpcnN0ZGIsIEFSQ0hfQ09OVkVSVCwKKwkJCQkoZmJubyAtIFhGU19ESVIyX0ZSRUVfRklSU1REQihtcCkpICoKKwkJCQlYRlNfRElSMl9NQVhfRlJFRV9CRVNUUyhtcCkpOworCQkJZnJlZS0+aGRyLm52YWxpZCA9IDA7CisJCQlmcmVlLT5oZHIubnVzZWQgPSAwOworCQl9IGVsc2UgeworCQkJZnJlZSA9IGZicC0+ZGF0YTsKKwkJCUFTU0VSVChJTlRfR0VUKGZyZWUtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9GUkVFX01BR0lDKTsKKwkJfQorCisJCS8qCisJCSAqIFNldCB0aGUgZnJlZXNwYWNlIGJsb2NrIGluZGV4IGZyb20gdGhlIGRhdGEgYmxvY2sgbnVtYmVyLgorCQkgKi8KKwkJZmluZGV4ID0gWEZTX0RJUjJfREJfVE9fRkRJTkRFWChtcCwgZGJubyk7CisJCS8qCisJCSAqIElmIGl0J3MgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBlbnRyaWVzIGluIHRoZQorCQkgKiBmcmVlc3BhY2UgYmxvY2ssIGV4dGVuZCB0aGF0IHRhYmxlLgorCQkgKi8KKwkJaWYgKGZpbmRleCA+PSBJTlRfR0VUKGZyZWUtPmhkci5udmFsaWQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCUFTU0VSVChmaW5kZXggPCBYRlNfRElSMl9NQVhfRlJFRV9CRVNUUyhtcCkpOworCQkJSU5UX1NFVChmcmVlLT5oZHIubnZhbGlkLCBBUkNIX0NPTlZFUlQsIGZpbmRleCArIDEpOworCQkJLyoKKwkJCSAqIFRhZyBuZXcgZW50cnkgc28gbnVzZWQgd2lsbCBnbyB1cC4KKwkJCSAqLworCQkJSU5UX1NFVChmcmVlLT5iZXN0c1tmaW5kZXhdLCBBUkNIX0NPTlZFUlQsIE5VTExEQVRBT0ZGKTsKKwkJfQorCQkvKgorCQkgKiBJZiB0aGlzIGVudHJ5IHdhcyBmb3IgYW4gZW1wdHkgZGF0YSBibG9jaworCQkgKiAodGhpcyBzaG91bGQgYWx3YXlzIGJlIHRydWUpIHRoZW4gdXBkYXRlIHRoZSBoZWFkZXIuCisJCSAqLworCQlpZiAoSU5UX0dFVChmcmVlLT5iZXN0c1tmaW5kZXhdLCBBUkNIX0NPTlZFUlQpID09IE5VTExEQVRBT0ZGKSB7CisJCQlJTlRfTU9EKGZyZWUtPmhkci5udXNlZCwgQVJDSF9DT05WRVJULCArMSk7CisJCQl4ZnNfZGlyMl9mcmVlX2xvZ19oZWFkZXIodHAsIGZicCk7CisJCX0KKwkJLyoKKwkJICogVXBkYXRlIHRoZSByZWFsIHZhbHVlIGluIHRoZSB0YWJsZS4KKwkJICogV2UgaGF2ZW4ndCBhbGxvY2F0ZWQgdGhlIGRhdGEgZW50cnkgeWV0IHNvIHRoaXMgd2lsbAorCQkgKiBjaGFuZ2UgYWdhaW4uCisJCSAqLworCQlkYXRhID0gZGJwLT5kYXRhOworCQlJTlRfQ09QWShmcmVlLT5iZXN0c1tmaW5kZXhdLCBkYXRhLT5oZHIuYmVzdGZyZWVbMF0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpOworCQlsb2dmcmVlID0gMTsKKwl9CisJLyoKKwkgKiBXZSBoYWQgYSBkYXRhIGJsb2NrIHNvIHdlIGRvbid0IGhhdmUgdG8gbWFrZSBhIG5ldyBvbmUuCisJICovCisJZWxzZSB7CisJCS8qCisJCSAqIElmIGp1c3QgY2hlY2tpbmcsIHdlIHN1Y2NlZWRlZC4KKwkJICovCisJCWlmIChhcmdzLT5qdXN0Y2hlY2spIHsKKwkJCWlmICgoZmJsayA9PSBOVUxMIHx8IGZibGstPmJwID09IE5VTEwpICYmIGZicCAhPSBOVUxMKQorCQkJCXhmc19kYV9idWZfZG9uZShmYnApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyoKKwkJICogUmVhZCB0aGUgZGF0YSBibG9jayBpbi4KKwkJICovCisJCWlmICh1bmxpa2VseSgKKwkJICAgIGVycm9yID0geGZzX2RhX3JlYWRfYnVmKHRwLCBkcCwgWEZTX0RJUjJfREJfVE9fREEobXAsIGRibm8pLAorCQkJCS0xLCAmZGJwLCBYRlNfREFUQV9GT1JLKSkpIHsKKwkJCWlmICgoZmJsayA9PSBOVUxMIHx8IGZibGstPmJwID09IE5VTEwpICYmIGZicCAhPSBOVUxMKQorCQkJCXhmc19kYV9idWZfZG9uZShmYnApOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCWRhdGEgPSBkYnAtPmRhdGE7CisJCWxvZ2ZyZWUgPSAwOworCX0KKwlBU1NFUlQoSU5UX0dFVChkYXRhLT5oZHIuYmVzdGZyZWVbMF0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpID49IGxlbmd0aCk7CisJLyoKKwkgKiBQb2ludCB0byB0aGUgZXhpc3RpbmcgdW51c2VkIHNwYWNlLgorCSAqLworCWR1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopCisJICAgICAgKChjaGFyICopZGF0YSArIElOVF9HRVQoZGF0YS0+aGRyLmJlc3RmcmVlWzBdLm9mZnNldCwgQVJDSF9DT05WRVJUKSk7CisJbmVlZHNjYW4gPSBuZWVkbG9nID0gMDsKKwkvKgorCSAqIE1hcmsgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHVudXNlZCBzcGFjZSwgaW51c2UgZm9yIHVzLgorCSAqLworCXhmc19kaXIyX2RhdGFfdXNlX2ZyZWUodHAsIGRicCwgZHVwLAorCQkoeGZzX2RpcjJfZGF0YV9hb2ZmX3QpKChjaGFyICopZHVwIC0gKGNoYXIgKilkYXRhKSwgbGVuZ3RoLAorCQkmbmVlZGxvZywgJm5lZWRzY2FuKTsKKwkvKgorCSAqIEZpbGwgaW4gdGhlIG5ldyBlbnRyeSBhbmQgbG9nIGl0LgorCSAqLworCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKilkdXA7CisJSU5UX1NFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCwgYXJncy0+aW51bWJlcik7CisJZGVwLT5uYW1lbGVuID0gYXJncy0+bmFtZWxlbjsKKwltZW1jcHkoZGVwLT5uYW1lLCBhcmdzLT5uYW1lLCBkZXAtPm5hbWVsZW4pOworCXRhZ3AgPSBYRlNfRElSMl9EQVRBX0VOVFJZX1RBR19QKGRlcCk7CisJSU5UX1NFVCgqdGFncCwgQVJDSF9DT05WRVJULCAoeGZzX2RpcjJfZGF0YV9vZmZfdCkoKGNoYXIgKilkZXAgLSAoY2hhciAqKWRhdGEpKTsKKwl4ZnNfZGlyMl9kYXRhX2xvZ19lbnRyeSh0cCwgZGJwLCBkZXApOworCS8qCisJICogUmVzY2FuIHRoZSBibG9jayBmb3IgYmVzdGZyZWUgaWYgbmVlZGVkLgorCSAqLworCWlmIChuZWVkc2NhbikKKwkJeGZzX2RpcjJfZGF0YV9mcmVlc2NhbihtcCwgZGF0YSwgJm5lZWRsb2csIE5VTEwpOworCS8qCisJICogTG9nIHRoZSBkYXRhIGJsb2NrIGhlYWRlciBpZiBuZWVkZWQuCisJICovCisJaWYgKG5lZWRsb2cpCisJCXhmc19kaXIyX2RhdGFfbG9nX2hlYWRlcih0cCwgZGJwKTsKKwkvKgorCSAqIElmIHRoZSBmcmVlc3BhY2UgZW50cnkgaXMgbm93IHdyb25nLCB1cGRhdGUgaXQuCisJICovCisJaWYgKElOVF9HRVQoZnJlZS0+YmVzdHNbZmluZGV4XSwgQVJDSF9DT05WRVJUKSAhPSBJTlRfR0VUKGRhdGEtPmhkci5iZXN0ZnJlZVswXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJSU5UX0NPUFkoZnJlZS0+YmVzdHNbZmluZGV4XSwgZGF0YS0+aGRyLmJlc3RmcmVlWzBdLmxlbmd0aCwgQVJDSF9DT05WRVJUKTsKKwkJbG9nZnJlZSA9IDE7CisJfQorCS8qCisJICogTG9nIHRoZSBmcmVlc3BhY2UgZW50cnkgaWYgbmVlZGVkLgorCSAqLworCWlmIChsb2dmcmVlKQorCQl4ZnNfZGlyMl9mcmVlX2xvZ19iZXN0cyh0cCwgZmJwLCBmaW5kZXgsIGZpbmRleCk7CisJLyoKKwkgKiBJZiB0aGUgY2FsbGVyIGRpZG4ndCBoYW5kIHVzIHRoZSBmcmVlc3BhY2UgYmxvY2ssIGRyb3AgaXQuCisJICovCisJaWYgKChmYmxrID09IE5VTEwgfHwgZmJsay0+YnAgPT0gTlVMTCkgJiYgZmJwICE9IE5VTEwpCisJCXhmc19kYV9idWZfZG9uZShmYnApOworCS8qCisJICogUmV0dXJuIHRoZSBkYXRhIGJsb2NrIGFuZCBvZmZzZXQgaW4gYXJncywgdGhlbiBkcm9wIHRoZSBkYXRhIGJsb2NrLgorCSAqLworCWFyZ3MtPmJsa25vID0gKHhmc19kYWJsa190KWRibm87CisJYXJncy0+aW5kZXggPSBJTlRfR0VUKCp0YWdwLCBBUkNIX0NPTlZFUlQpOworCXhmc19kYV9idWZfZG9uZShkYnApOworCXJldHVybiAwOworfQorCisvKgorICogTG9va3VwIGFuIGVudHJ5IGluIGEgbm9kZS1mb3JtYXQgZGlyZWN0b3J5LgorICogQWxsIHRoZSByZWFsIHdvcmsgaGFwcGVucyBpbiB4ZnNfZGFfbm9kZV9sb29rdXBfaW50LgorICogVGhlIG9ubHkgcmVhbCBvdXRwdXQgaXMgdGhlIGlub2RlIG51bWJlciBvZiB0aGUgZW50cnkuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9ub2RlX2xvb2t1cCgKKwl4ZnNfZGFfYXJnc190CSphcmdzKQkJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KK3sKKwlpbnQJCWVycm9yOwkJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJaTsJCQkvKiBidHJlZSBsZXZlbCAqLworCWludAkJcnZhbDsJCQkvKiBvcGVyYXRpb24gcmV0dXJuIHZhbHVlICovCisJeGZzX2RhX3N0YXRlX3QJKnN0YXRlOwkJCS8qIGJ0cmVlIGN1cnNvciAqLworCisJeGZzX2RpcjJfdHJhY2VfYXJncygibm9kZV9sb29rdXAiLCBhcmdzKTsKKwkvKgorCSAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBidHJlZSBjdXJzb3IuCisJICovCisJc3RhdGUgPSB4ZnNfZGFfc3RhdGVfYWxsb2MoKTsKKwlzdGF0ZS0+YXJncyA9IGFyZ3M7CisJc3RhdGUtPm1wID0gYXJncy0+ZHAtPmlfbW91bnQ7CisJc3RhdGUtPmJsb2Nrc2l6ZSA9IHN0YXRlLT5tcC0+bV9kaXJibGtzaXplOworCXN0YXRlLT5ub2RlX2VudHMgPSBzdGF0ZS0+bXAtPm1fZGlyX25vZGVfZW50czsKKwkvKgorCSAqIEZpbGwgaW4gdGhlIHBhdGggdG8gdGhlIGVudHJ5IGluIHRoZSBjdXJzb3IuCisJICovCisJZXJyb3IgPSB4ZnNfZGFfbm9kZV9sb29rdXBfaW50KHN0YXRlLCAmcnZhbCk7CisJaWYgKGVycm9yKQorCQlydmFsID0gZXJyb3I7CisJLyoKKwkgKiBSZWxlYXNlIHRoZSBidHJlZSBibG9ja3MgYW5kIGxlYWYgYmxvY2suCisJICovCisJZm9yIChpID0gMDsgaSA8IHN0YXRlLT5wYXRoLmFjdGl2ZTsgaSsrKSB7CisJCXhmc19kYV9icmVsc2UoYXJncy0+dHJhbnMsIHN0YXRlLT5wYXRoLmJsa1tpXS5icCk7CisJCXN0YXRlLT5wYXRoLmJsa1tpXS5icCA9IE5VTEw7CisJfQorCS8qCisJICogUmVsZWFzZSB0aGUgZGF0YSBibG9jayBpZiB3ZSBoYXZlIGl0LgorCSAqLworCWlmIChzdGF0ZS0+ZXh0cmF2YWxpZCAmJiBzdGF0ZS0+ZXh0cmFibGsuYnApIHsKKwkJeGZzX2RhX2JyZWxzZShhcmdzLT50cmFucywgc3RhdGUtPmV4dHJhYmxrLmJwKTsKKwkJc3RhdGUtPmV4dHJhYmxrLmJwID0gTlVMTDsKKwl9CisJeGZzX2RhX3N0YXRlX2ZyZWUoc3RhdGUpOworCXJldHVybiBydmFsOworfQorCisvKgorICogUmVtb3ZlIGFuIGVudHJ5IGZyb20gYSBub2RlLWZvcm1hdCBkaXJlY3RvcnkuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9ub2RlX3JlbW92ZW5hbWUoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MpCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCit7CisJeGZzX2RhX3N0YXRlX2Jsa190CSpibGs7CQkvKiBsZWFmIGJsb2NrICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlydmFsOwkJLyogb3BlcmF0aW9uIHJldHVybiB2YWx1ZSAqLworCXhmc19kYV9zdGF0ZV90CQkqc3RhdGU7CQkvKiBidHJlZSBjdXJzb3IgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3MoIm5vZGVfcmVtb3ZlbmFtZSIsIGFyZ3MpOworCS8qCisJICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGJ0cmVlIGN1cnNvci4KKwkgKi8KKwlzdGF0ZSA9IHhmc19kYV9zdGF0ZV9hbGxvYygpOworCXN0YXRlLT5hcmdzID0gYXJnczsKKwlzdGF0ZS0+bXAgPSBhcmdzLT5kcC0+aV9tb3VudDsKKwlzdGF0ZS0+YmxvY2tzaXplID0gc3RhdGUtPm1wLT5tX2RpcmJsa3NpemU7CisJc3RhdGUtPm5vZGVfZW50cyA9IHN0YXRlLT5tcC0+bV9kaXJfbm9kZV9lbnRzOworCS8qCisJICogTG9vayB1cCB0aGUgZW50cnkgd2UncmUgZGVsZXRpbmcsIHNldCB1cCB0aGUgY3Vyc29yLgorCSAqLworCWVycm9yID0geGZzX2RhX25vZGVfbG9va3VwX2ludChzdGF0ZSwgJnJ2YWwpOworCWlmIChlcnJvcikgeworCQlydmFsID0gZXJyb3I7CisJfQorCS8qCisJICogRGlkbid0IGZpbmQgaXQsIHVwcGVyIGxheWVyIHNjcmV3ZWQgdXAuCisJICovCisJaWYgKHJ2YWwgIT0gRUVYSVNUKSB7CisJCXhmc19kYV9zdGF0ZV9mcmVlKHN0YXRlKTsKKwkJcmV0dXJuIHJ2YWw7CisJfQorCWJsayA9ICZzdGF0ZS0+cGF0aC5ibGtbc3RhdGUtPnBhdGguYWN0aXZlIC0gMV07CisJQVNTRVJUKGJsay0+bWFnaWMgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCUFTU0VSVChzdGF0ZS0+ZXh0cmF2YWxpZCk7CisJLyoKKwkgKiBSZW1vdmUgdGhlIGxlYWYgYW5kIGRhdGEgZW50cmllcy4KKwkgKiBFeHRyYWJsayByZWZlcnMgdG8gdGhlIGRhdGEgYmxvY2suCisJICovCisJZXJyb3IgPSB4ZnNfZGlyMl9sZWFmbl9yZW1vdmUoYXJncywgYmxrLT5icCwgYmxrLT5pbmRleCwKKwkJJnN0YXRlLT5leHRyYWJsaywgJnJ2YWwpOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qCisJICogRml4IHRoZSBoYXNoIHZhbHVlcyB1cCB0aGUgYnRyZWUuCisJICovCisJeGZzX2RhX2ZpeGhhc2hwYXRoKHN0YXRlLCAmc3RhdGUtPnBhdGgpOworCS8qCisJICogSWYgd2UgbmVlZCB0byBqb2luIGxlYWYgYmxvY2tzLCBkbyBpdC4KKwkgKi8KKwlpZiAocnZhbCAmJiBzdGF0ZS0+cGF0aC5hY3RpdmUgPiAxKQorCQllcnJvciA9IHhmc19kYV9qb2luKHN0YXRlKTsKKwkvKgorCSAqIElmIG5vIGVycm9ycyBzbyBmYXIsIHRyeSBjb252ZXJzaW9uIHRvIGxlYWYgZm9ybWF0LgorCSAqLworCWlmICghZXJyb3IpCisJCWVycm9yID0geGZzX2RpcjJfbm9kZV90b19sZWFmKHN0YXRlKTsKKwl4ZnNfZGFfc3RhdGVfZnJlZShzdGF0ZSk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogUmVwbGFjZSBhbiBlbnRyeSdzIGlub2RlIG51bWJlciBpbiBhIG5vZGUtZm9ybWF0IGRpcmVjdG9yeS4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX25vZGVfcmVwbGFjZSgKKwl4ZnNfZGFfYXJnc190CQkqYXJncykJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KK3sKKwl4ZnNfZGFfc3RhdGVfYmxrX3QJKmJsazsJCS8qIGxlYWYgYmxvY2sgKi8KKwl4ZnNfZGlyMl9kYXRhX3QJCSpkYXRhOwkJLyogZGF0YSBibG9jayBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9kYXRhX2VudHJ5X3QJKmRlcDsJCS8qIGRhdGEgZW50cnkgY2hhbmdlZCAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQkJaTsJCS8qIGJ0cmVlIGxldmVsICovCisJeGZzX2lub190CQlpbnVtOwkJLyogbmV3IGlub2RlIG51bWJlciAqLworCXhmc19kaXIyX2xlYWZfdAkJKmxlYWY7CQkvKiBsZWFmIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2xlYWZfZW50cnlfdAkqbGVwOwkJLyogbGVhZiBlbnRyeSBiZWluZyBjaGFuZ2VkICovCisJaW50CQkJcnZhbDsJCS8qIGludGVybmFsIHJldHVybiB2YWx1ZSAqLworCXhmc19kYV9zdGF0ZV90CQkqc3RhdGU7CQkvKiBidHJlZSBjdXJzb3IgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3MoIm5vZGVfcmVwbGFjZSIsIGFyZ3MpOworCS8qCisJICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGJ0cmVlIGN1cnNvci4KKwkgKi8KKwlzdGF0ZSA9IHhmc19kYV9zdGF0ZV9hbGxvYygpOworCXN0YXRlLT5hcmdzID0gYXJnczsKKwlzdGF0ZS0+bXAgPSBhcmdzLT5kcC0+aV9tb3VudDsKKwlzdGF0ZS0+YmxvY2tzaXplID0gc3RhdGUtPm1wLT5tX2RpcmJsa3NpemU7CisJc3RhdGUtPm5vZGVfZW50cyA9IHN0YXRlLT5tcC0+bV9kaXJfbm9kZV9lbnRzOworCWludW0gPSBhcmdzLT5pbnVtYmVyOworCS8qCisJICogTG9va3VwIHRoZSBlbnRyeSB0byBjaGFuZ2UgaW4gdGhlIGJ0cmVlLgorCSAqLworCWVycm9yID0geGZzX2RhX25vZGVfbG9va3VwX2ludChzdGF0ZSwgJnJ2YWwpOworCWlmIChlcnJvcikgeworCQlydmFsID0gZXJyb3I7CisJfQorCS8qCisJICogSXQgc2hvdWxkIGJlIGZvdW5kLCBzaW5jZSB0aGUgdm5vZGVvcHMgbGF5ZXIgaGFzIGxvb2tlZCBpdCB1cAorCSAqIGFuZCBsb2NrZWQgaXQuICBCdXQgcGFyYW5vaWEgaXMgZ29vZC4KKwkgKi8KKwlpZiAocnZhbCA9PSBFRVhJU1QpIHsKKwkJLyoKKwkJICogRmluZCB0aGUgbGVhZiBlbnRyeS4KKwkJICovCisJCWJsayA9ICZzdGF0ZS0+cGF0aC5ibGtbc3RhdGUtPnBhdGguYWN0aXZlIC0gMV07CisJCUFTU0VSVChibGstPm1hZ2ljID09IFhGU19ESVIyX0xFQUZOX01BR0lDKTsKKwkJbGVhZiA9IGJsay0+YnAtPmRhdGE7CisJCWxlcCA9ICZsZWFmLT5lbnRzW2Jsay0+aW5kZXhdOworCQlBU1NFUlQoc3RhdGUtPmV4dHJhdmFsaWQpOworCQkvKgorCQkgKiBQb2ludCB0byB0aGUgZGF0YSBlbnRyeS4KKwkJICovCisJCWRhdGEgPSBzdGF0ZS0+ZXh0cmFibGsuYnAtPmRhdGE7CisJCUFTU0VSVChJTlRfR0VUKGRhdGEtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9EQVRBX01BR0lDKTsKKwkJZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKQorCQkgICAgICAoKGNoYXIgKilkYXRhICsKKwkJICAgICAgIFhGU19ESVIyX0RBVEFQVFJfVE9fT0ZGKHN0YXRlLT5tcCwgSU5UX0dFVChsZXAtPmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkpKTsKKwkJQVNTRVJUKGludW0gIT0gSU5UX0dFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCkpOworCQkvKgorCQkgKiBGaWxsIGluIHRoZSBuZXcgaW5vZGUgbnVtYmVyIGFuZCBsb2cgdGhlIGVudHJ5LgorCQkgKi8KKwkJSU5UX1NFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCwgaW51bSk7CisJCXhmc19kaXIyX2RhdGFfbG9nX2VudHJ5KGFyZ3MtPnRyYW5zLCBzdGF0ZS0+ZXh0cmFibGsuYnAsIGRlcCk7CisJCXJ2YWwgPSAwOworCX0KKwkvKgorCSAqIERpZG4ndCBmaW5kIGl0LCBhbmQgd2UncmUgaG9sZGluZyBhIGRhdGEgYmxvY2suICBEcm9wIGl0LgorCSAqLworCWVsc2UgaWYgKHN0YXRlLT5leHRyYXZhbGlkKSB7CisJCXhmc19kYV9icmVsc2UoYXJncy0+dHJhbnMsIHN0YXRlLT5leHRyYWJsay5icCk7CisJCXN0YXRlLT5leHRyYWJsay5icCA9IE5VTEw7CisJfQorCS8qCisJICogUmVsZWFzZSBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGN1cnNvci4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc3RhdGUtPnBhdGguYWN0aXZlOyBpKyspIHsKKwkJeGZzX2RhX2JyZWxzZShhcmdzLT50cmFucywgc3RhdGUtPnBhdGguYmxrW2ldLmJwKTsKKwkJc3RhdGUtPnBhdGguYmxrW2ldLmJwID0gTlVMTDsKKwl9CisJeGZzX2RhX3N0YXRlX2ZyZWUoc3RhdGUpOworCXJldHVybiBydmFsOworfQorCisvKgorICogVHJpbSBvZmYgYSB0cmFpbGluZyBlbXB0eSBmcmVlc3BhY2UgYmxvY2suCisgKiBSZXR1cm4gKGluIHJ2YWxwKSAxIGlmIHdlIGRpZCBpdCwgMCBpZiBub3QuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9ub2RlX3RyaW1fZnJlZSgKKwl4ZnNfZGFfYXJnc190CQkqYXJncywJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfZmlsZW9mZl90CQlmbywJCS8qIGZyZWUgYmxvY2sgbnVtYmVyICovCisJaW50CQkJKnJ2YWxwKQkJLyogb3V0OiBkaWQgc29tZXRoaW5nICovCit7CisJeGZzX2RhYnVmX3QJCSpicDsJCS8qIGZyZWVzcGFjZSBidWZmZXIgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIGNvZGUgKi8KKwl4ZnNfZGlyMl9mcmVlX3QJCSpmcmVlOwkJLyogZnJlZXNwYWNlIHN0cnVjdHVyZSAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX3RyYW5zX3QJCSp0cDsJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCWRwID0gYXJncy0+ZHA7CisJbXAgPSBkcC0+aV9tb3VudDsKKwl0cCA9IGFyZ3MtPnRyYW5zOworCS8qCisJICogUmVhZCB0aGUgZnJlZXNwYWNlIGJsb2NrLgorCSAqLworCWlmICh1bmxpa2VseShlcnJvciA9IHhmc19kYV9yZWFkX2J1Zih0cCwgZHAsICh4ZnNfZGFibGtfdClmbywgLTIsICZicCwKKwkJCVhGU19EQVRBX0ZPUkspKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyoKKwkgKiBUaGVyZSBjYW4gYmUgaG9sZXMgaW4gZnJlZXNwYWNlLiAgSWYgZm8gaXMgYSBob2xlLCB0aGVyZSdzCisJICogbm90aGluZyB0byBkby4KKwkgKi8KKwlpZiAoYnAgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisJZnJlZSA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGZyZWUtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9GUkVFX01BR0lDKTsKKwkvKgorCSAqIElmIHRoZXJlIGFyZSB1c2VkIGVudHJpZXMsIHRoZXJlJ3Mgbm90aGluZyB0byBkby4KKwkgKi8KKwlpZiAoSU5UX0dFVChmcmVlLT5oZHIubnVzZWQsIEFSQ0hfQ09OVkVSVCkgPiAwKSB7CisJCXhmc19kYV9icmVsc2UodHAsIGJwKTsKKwkJKnJ2YWxwID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogQmxvdyB0aGUgYmxvY2sgYXdheS4KKwkgKi8KKwlpZiAoKGVycm9yID0KKwkgICAgeGZzX2RpcjJfc2hyaW5rX2lub2RlKGFyZ3MsIFhGU19ESVIyX0RBX1RPX0RCKG1wLCAoeGZzX2RhYmxrX3QpZm8pLAorCQkgICAgYnApKSkgeworCQkvKgorCQkgKiBDYW4ndCBmYWlsIHdpdGggRU5PU1BDIHNpbmNlIHRoYXQgb25seSBoYXBwZW5zIHdpdGggbm8KKwkJICogc3BhY2UgcmVzZXJ2YXRpb24sIHdoZW4gYnJlYWtpbmcgdXAgYW4gZXh0ZW50IGludG8gdHdvCisJCSAqIHBpZWNlcy4gIFRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgb2YgYW4gZXh0ZW50LgorCQkgKi8KKwkJQVNTRVJUKGVycm9yICE9IEVOT1NQQyk7CisJCXhmc19kYV9icmVsc2UodHAsIGJwKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwkvKgorCSAqIFJldHVybiB0aGF0IHdlIHN1Y2NlZWRlZC4KKwkgKi8KKwkqcnZhbHAgPSAxOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX25vZGUuaCBiL2ZzL3hmcy94ZnNfZGlyMl9ub2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZkYjQyMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZGlyMl9ub2RlLmgKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19ESVIyX05PREVfSF9fCisjZGVmaW5lCV9fWEZTX0RJUjJfTk9ERV9IX18KKworLyoKKyAqIERpcmVjdG9yeSB2ZXJzaW9uIDIsIGJ0cmVlIG5vZGUgZm9ybWF0IHN0cnVjdHVyZXMKKyAqLworCitzdHJ1Y3QgdWlvOworc3RydWN0IHhmc19kYWJ1ZjsKK3N0cnVjdCB4ZnNfZGFfYXJnczsKK3N0cnVjdCB4ZnNfZGFfc3RhdGU7CitzdHJ1Y3QgeGZzX2RhX3N0YXRlX2JsazsKK3N0cnVjdCB4ZnNfaW5vZGU7CitzdHJ1Y3QgeGZzX3RyYW5zOworCisvKgorICogQ29uc3RhbnRzLgorICovCisKKy8qCisgKiBPZmZzZXQgb2YgdGhlIGZyZWVzcGFjZSBpbmRleC4KKyAqLworI2RlZmluZQlYRlNfRElSMl9GUkVFX1NQQUNFCTIKKyNkZWZpbmUJWEZTX0RJUjJfRlJFRV9PRkZTRVQJKFhGU19ESVIyX0ZSRUVfU1BBQ0UgKiBYRlNfRElSMl9TUEFDRV9TSVpFKQorI2RlZmluZQlYRlNfRElSMl9GUkVFX0ZJUlNUREIobXApCVwKKwlYRlNfRElSMl9CWVRFX1RPX0RCKG1wLCBYRlNfRElSMl9GUkVFX09GRlNFVCkKKworI2RlZmluZQlYRlNfRElSMl9GUkVFX01BR0lDCTB4NTg0NDMyNDYJLyogWEQyRiAqLworCisvKgorICogU3RydWN0dXJlcy4KKyAqLwordHlwZWRlZglzdHJ1Y3QgeGZzX2RpcjJfZnJlZV9oZHIgeworCV9fdWludDMyX3QJCW1hZ2ljOwkJLyogWEZTX0RJUjJfRlJFRV9NQUdJQyAqLworCV9faW50MzJfdAkJZmlyc3RkYjsJLyogZGIgb2YgZmlyc3QgZW50cnkgKi8KKwlfX2ludDMyX3QJCW52YWxpZDsJCS8qIGNvdW50IG9mIHZhbGlkIGVudHJpZXMgKi8KKwlfX2ludDMyX3QJCW51c2VkOwkJLyogY291bnQgb2YgdXNlZCBlbnRyaWVzICovCit9IHhmc19kaXIyX2ZyZWVfaGRyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX2ZyZWUgeworCXhmc19kaXIyX2ZyZWVfaGRyX3QJaGRyOwkJLyogYmxvY2sgaGVhZGVyICovCisJeGZzX2RpcjJfZGF0YV9vZmZfdAliZXN0c1sxXTsJLyogYmVzdCBmcmVlIGNvdW50cyAqLworCQkJCQkJLyogdW51c2VkIGVudHJpZXMgYXJlIC0xICovCit9IHhmc19kaXIyX2ZyZWVfdDsKKyNkZWZpbmUJWEZTX0RJUjJfTUFYX0ZSRUVfQkVTVFMobXApCVwKKwkoKChtcCktPm1fZGlyYmxrc2l6ZSAtICh1aW50KXNpemVvZih4ZnNfZGlyMl9mcmVlX2hkcl90KSkgLyBcCisJICh1aW50KXNpemVvZih4ZnNfZGlyMl9kYXRhX29mZl90KSkKKworLyoKKyAqIE1hY3Jvcy4KKyAqLworCisvKgorICogQ29udmVydCBkYXRhIHNwYWNlIGRiIHRvIHRoZSBjb3JyZXNwb25kaW5nIGZyZWUgZGIuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfREJfVE9fRkRCKQoreGZzX2RpcjJfZGJfdAoreGZzX2RpcjJfZGJfdG9fZmRiKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9kYl90IGRiKTsKKyNkZWZpbmUJWEZTX0RJUjJfREJfVE9fRkRCKG1wLGRiKQl4ZnNfZGlyMl9kYl90b19mZGIobXAsIGRiKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfREJfVE9fRkRCKG1wLGRiKQlcCisJKFhGU19ESVIyX0ZSRUVfRklSU1REQihtcCkgKyAoZGIpIC8gWEZTX0RJUjJfTUFYX0ZSRUVfQkVTVFMobXApKQorI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IGRhdGEgc3BhY2UgZGIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgaW5kZXggaW4gYSBmcmVlIGRiLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX0RCX1RPX0ZESU5ERVgpCitpbnQKK3hmc19kaXIyX2RiX3RvX2ZkaW5kZXgoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX2RiX3QgZGIpOworI2RlZmluZQlYRlNfRElSMl9EQl9UT19GRElOREVYKG1wLGRiKQl4ZnNfZGlyMl9kYl90b19mZGluZGV4KG1wLCBkYikKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX0RCX1RPX0ZESU5ERVgobXAsZGIpCSgoZGIpICUgWEZTX0RJUjJfTUFYX0ZSRUVfQkVTVFMobXApKQorI2VuZGlmCisKKy8qCisgKiBGdW5jdGlvbnMuCisgKi8KKworZXh0ZXJuIHZvaWQKKwl4ZnNfZGlyMl9mcmVlX2xvZ19iZXN0cyhzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgc3RydWN0IHhmc19kYWJ1ZiAqYnAsCisJCQkJaW50IGZpcnN0LCBpbnQgbGFzdCk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9sZWFmX3RvX25vZGUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCBzdHJ1Y3QgeGZzX2RhYnVmICpsYnApOworCitleHRlcm4geGZzX2RhaGFzaF90CisJeGZzX2RpcjJfbGVhZm5fbGFzdGhhc2goc3RydWN0IHhmc19kYWJ1ZiAqYnAsIGludCAqY291bnQpOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfbGVhZm5fbG9va3VwX2ludChzdHJ1Y3QgeGZzX2RhYnVmICpicCwKKwkJCQkgIHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgaW50ICppbmRleHAsCisJCQkJICBzdHJ1Y3QgeGZzX2RhX3N0YXRlICpzdGF0ZSk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9sZWFmbl9vcmRlcihzdHJ1Y3QgeGZzX2RhYnVmICpsZWFmMV9icCwKKwkJCSAgICAgc3RydWN0IHhmc19kYWJ1ZiAqbGVhZjJfYnApOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfbGVhZm5fc3BsaXQoc3RydWN0IHhmc19kYV9zdGF0ZSAqc3RhdGUsCisJCQkgICAgIHN0cnVjdCB4ZnNfZGFfc3RhdGVfYmxrICpvbGRibGssCisJCQkgICAgIHN0cnVjdCB4ZnNfZGFfc3RhdGVfYmxrICpuZXdibGspOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfbGVhZm5fdG9vc21hbGwoc3RydWN0IHhmc19kYV9zdGF0ZSAqc3RhdGUsIGludCAqYWN0aW9uKTsKKworZXh0ZXJuIHZvaWQKKwl4ZnNfZGlyMl9sZWFmbl91bmJhbGFuY2Uoc3RydWN0IHhmc19kYV9zdGF0ZSAqc3RhdGUsCisJCQkJIHN0cnVjdCB4ZnNfZGFfc3RhdGVfYmxrICpkcm9wX2JsaywKKwkJCQkgc3RydWN0IHhmc19kYV9zdGF0ZV9ibGsgKnNhdmVfYmxrKTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX25vZGVfYWRkbmFtZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfbm9kZV9sb29rdXAoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX25vZGVfcmVtb3ZlbmFtZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfbm9kZV9yZXBsYWNlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9ub2RlX3RyaW1fZnJlZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIHhmc19maWxlb2ZmX3QgZm8sCisJCQkJaW50ICpydmFscCk7CisKKyNlbmRpZgkvKiBfX1hGU19ESVIyX05PREVfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjJfc2YuYyBiL2ZzL3hmcy94ZnNfZGlyMl9zZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYmM2MTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2RpcjJfc2YuYwpAQCAtMCwwICsxLDEzMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKy8qCisgKiB4ZnNfZGlyMl9zZi5jCisgKiBTaG9ydGZvcm0gZGlyZWN0b3J5IGltcGxlbWVudGF0aW9uIGZvciB2MiBkaXJlY3Rvcmllcy4KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgorI2luY2x1ZGUgInhmc19kaXJfbGVhZi5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19kaXIyX2RhdGEuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9sZWFmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfYmxvY2suaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl90cmFjZS5oIgorCisvKgorICogUHJvdG90eXBlcyBmb3IgaW50ZXJuYWwgZnVuY3Rpb25zLgorICovCitzdGF0aWMgdm9pZCB4ZnNfZGlyMl9zZl9hZGRuYW1lX2Vhc3koeGZzX2RhX2FyZ3NfdCAqYXJncywKKwkJCQkgICAgIHhmc19kaXIyX3NmX2VudHJ5X3QgKnNmZXAsCisJCQkJICAgICB4ZnNfZGlyMl9kYXRhX2FvZmZfdCBvZmZzZXQsCisJCQkJICAgICBpbnQgbmV3X2lzaXplKTsKK3N0YXRpYyB2b2lkIHhmc19kaXIyX3NmX2FkZG5hbWVfaGFyZCh4ZnNfZGFfYXJnc190ICphcmdzLCBpbnQgb2JqY2hhbmdlLAorCQkJCSAgICAgaW50IG5ld19pc2l6ZSk7CitzdGF0aWMgaW50IHhmc19kaXIyX3NmX2FkZG5hbWVfcGljayh4ZnNfZGFfYXJnc190ICphcmdzLCBpbnQgb2JqY2hhbmdlLAorCQkJCSAgICB4ZnNfZGlyMl9zZl9lbnRyeV90ICoqc2ZlcHAsCisJCQkJICAgIHhmc19kaXIyX2RhdGFfYW9mZl90ICpvZmZzZXRwKTsKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgeGZzX2RpcjJfc2ZfY2hlY2soeGZzX2RhX2FyZ3NfdCAqYXJncyk7CisjZWxzZQorI2RlZmluZQl4ZnNfZGlyMl9zZl9jaGVjayhhcmdzKQorI2VuZGlmIC8qIERFQlVHICovCisjaWYgWEZTX0JJR19JTlVNUworc3RhdGljIHZvaWQgeGZzX2RpcjJfc2ZfdG9pbm80KHhmc19kYV9hcmdzX3QgKmFyZ3MpOworc3RhdGljIHZvaWQgeGZzX2RpcjJfc2ZfdG9pbm84KHhmc19kYV9hcmdzX3QgKmFyZ3MpOworI2VuZGlmIC8qIFhGU19CSUdfSU5VTVMgKi8KKworLyoKKyAqIEdpdmVuIGEgYmxvY2sgZGlyZWN0b3J5IChkcC9ibG9jayksIGNhbGN1bGF0ZSBpdHMgc2l6ZSBhcyBhIHNob3J0Zm9ybSAoc2YpCisgKiBkaXJlY3RvcnkgYW5kIGEgaGVhZGVyIGZvciB0aGUgc2YgZGlyZWN0b3J5LCBpZiBpdCB3aWxsIGZpdCBpdCB0aGUKKyAqIHNwYWNlIGN1cnJlbnRseSBwcmVzZW50IGluIHRoZSBpbm9kZS4gIElmIGl0IHdvbid0IGZpdCwgdGhlIG91dHB1dAorICogc2l6ZSBpcyB0b28gYmlnIChidXQgbm90IGFjY3VyYXRlKS4KKyAqLworaW50CQkJCQkJLyogc2l6ZSBmb3Igc2YgZm9ybSAqLworeGZzX2RpcjJfYmxvY2tfc2ZzaXplKAorCXhmc19pbm9kZV90CQkqZHAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19kaXIyX2Jsb2NrX3QJKmJsb2NrLAkJLyogYmxvY2sgZGlyZWN0b3J5IGRhdGEgKi8KKwl4ZnNfZGlyMl9zZl9oZHJfdAkqc2ZocCkJCS8qIG91dHB1dDogaGVhZGVyIGZvciBzZiBmb3JtICovCit7CisJeGZzX2RpcjJfZGF0YXB0cl90CWFkZHI7CQkvKiBkYXRhIGVudHJ5IGFkZHJlc3MgKi8KKwl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmJscDsJCS8qIGxlYWYgYXJlYSBvZiB0aGUgYmxvY2sgKi8KKwl4ZnNfZGlyMl9ibG9ja190YWlsX3QJKmJ0cDsJCS8qIHRhaWwgYXJlYSBvZiB0aGUgYmxvY2sgKi8KKwlpbnQJCQljb3VudDsJCS8qIHNob3J0Zm9ybSBlbnRyeSBjb3VudCAqLworCXhmc19kaXIyX2RhdGFfZW50cnlfdAkqZGVwOwkJLyogZGF0YSBlbnRyeSBpbiB0aGUgYmxvY2sgKi8KKwlpbnQJCQlpOwkJLyogYmxvY2sgZW50cnkgaW5kZXggKi8KKwlpbnQJCQlpOGNvdW50OwkvKiBjb3VudCBvZiBiaWctaW5vZGUgZW50cmllcyAqLworCWludAkJCWlzZG90OwkJLyogZW50cnkgaXMgIi4iICovCisJaW50CQkJaXNkb3Rkb3Q7CS8qIGVudHJ5IGlzICIuLiIgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogbW91bnQgc3RydWN0dXJlIHBvaW50ZXIgKi8KKwlpbnQJCQluYW1lbGVuOwkvKiB0b3RhbCBuYW1lIGJ5dGVzICovCisJeGZzX2lub190CQlwYXJlbnQ7CQkvKiBwYXJlbnQgaW5vZGUgbnVtYmVyICovCisJaW50CQkJc2l6ZT0wOwkJLyogdG90YWwgY29tcHV0ZWQgc2l6ZSAqLworCisJbXAgPSBkcC0+aV9tb3VudDsKKworCWNvdW50ID0gaThjb3VudCA9IG5hbWVsZW4gPSAwOworCWJ0cCA9IFhGU19ESVIyX0JMT0NLX1RBSUxfUChtcCwgYmxvY2spOworCWJscCA9IFhGU19ESVIyX0JMT0NLX0xFQUZfUChidHApOworCisJLyoKKwkgKiBJdGVyYXRlIG92ZXIgdGhlIGJsb2NrJ3MgZGF0YSBlbnRyaWVzIGJ5IHVzaW5nIHRoZSBsZWFmIHBvaW50ZXJzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKGJ0cC0+Y291bnQsIEFSQ0hfQ09OVkVSVCk7IGkrKykgeworCQlpZiAoKGFkZHIgPSBJTlRfR0VUKGJscFtpXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpKSA9PSBYRlNfRElSMl9OVUxMX0RBVEFQVFIpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHRoZSBwb2ludGVyIHRvIHRoZSBlbnRyeSBhdCBoYW5kLgorCQkgKi8KKwkJZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKQorCQkgICAgICAoKGNoYXIgKilibG9jayArIFhGU19ESVIyX0RBVEFQVFJfVE9fT0ZGKG1wLCBhZGRyKSk7CisJCS8qCisJCSAqIERldGVjdCAuIGFuZCAuLiwgc28gd2UgY2FuIHNwZWNpYWwtY2FzZSB0aGVtLgorCQkgKiAuIGlzIG5vdCBpbmNsdWRlZCBpbiBzZiBkaXJlY3Rvcmllcy4KKwkJICogLi4gaXMgaW5jbHVkZWQgYnkganVzdCB0aGUgcGFyZW50IGlub2RlIG51bWJlci4KKwkJICovCisJCWlzZG90ID0gZGVwLT5uYW1lbGVuID09IDEgJiYgZGVwLT5uYW1lWzBdID09ICcuJzsKKwkJaXNkb3Rkb3QgPQorCQkJZGVwLT5uYW1lbGVuID09IDIgJiYKKwkJCWRlcC0+bmFtZVswXSA9PSAnLicgJiYgZGVwLT5uYW1lWzFdID09ICcuJzsKKyNpZiBYRlNfQklHX0lOVU1TCisJCWlmICghaXNkb3QpCisJCQlpOGNvdW50ICs9IElOVF9HRVQoZGVwLT5pbnVtYmVyLCBBUkNIX0NPTlZFUlQpID4gWEZTX0RJUjJfTUFYX1NIT1JUX0lOVU07CisjZW5kaWYKKwkJaWYgKCFpc2RvdCAmJiAhaXNkb3Rkb3QpIHsKKwkJCWNvdW50Kys7CisJCQluYW1lbGVuICs9IGRlcC0+bmFtZWxlbjsKKwkJfSBlbHNlIGlmIChpc2RvdGRvdCkKKwkJCXBhcmVudCA9IElOVF9HRVQoZGVwLT5pbnVtYmVyLCBBUkNIX0NPTlZFUlQpOworCQkvKgorCQkgKiBDYWxjdWxhdGUgdGhlIG5ldyBzaXplLCBzZWUgaWYgd2Ugc2hvdWxkIGdpdmUgdXAgeWV0LgorCQkgKi8KKwkJc2l6ZSA9IFhGU19ESVIyX1NGX0hEUl9TSVpFKGk4Y291bnQpICsJCS8qIGhlYWRlciAqLworCQkgICAgICAgY291bnQgKwkJCQkJLyogbmFtZWxlbiAqLworCQkgICAgICAgY291bnQgKiAodWludClzaXplb2YoeGZzX2RpcjJfc2Zfb2ZmX3QpICsgLyogb2Zmc2V0ICovCisJCSAgICAgICBuYW1lbGVuICsJCQkJLyogbmFtZSAqLworCQkgICAgICAgKGk4Y291bnQgPwkJCQkvKiBpbnVtYmVyICovCisJCQkJKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzhfdCkgKiBjb3VudCA6CisJCQkJKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzRfdCkgKiBjb3VudCk7CisJCWlmIChzaXplID4gWEZTX0lGT1JLX0RTSVpFKGRwKSkKKwkJCXJldHVybiBzaXplOwkJLyogc2l6ZSB2YWx1ZSBpcyBhIGZhaWx1cmUgKi8KKwl9CisJLyoKKwkgKiBDcmVhdGUgdGhlIG91dHB1dCBoZWFkZXIsIGlmIGl0IHdvcmtlZC4KKwkgKi8KKwlzZmhwLT5jb3VudCA9IGNvdW50OworCXNmaHAtPmk4Y291bnQgPSBpOGNvdW50OworCVhGU19ESVIyX1NGX1BVVF9JTlVNQkVSKCh4ZnNfZGlyMl9zZl90ICopc2ZocCwgJnBhcmVudCwgJnNmaHAtPnBhcmVudCk7CisJcmV0dXJuIHNpemU7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgYmxvY2sgZm9ybWF0IGRpcmVjdG9yeSB0byBzaG9ydGZvcm0uCisgKiBDYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IGl0IHdpbGwgZml0LCBhbmQgYnVpbHQgdXMgYSBoZWFkZXIuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9ibG9ja190b19zZigKKwl4ZnNfZGFfYXJnc190CQkqYXJncywJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfZGFidWZfdAkJKmJwLAkJLyogYmxvY2sgYnVmZmVyICovCisJaW50CQkJc2l6ZSwJCS8qIHNob3J0Zm9ybSBkaXJlY3Rvcnkgc2l6ZSAqLworCXhmc19kaXIyX3NmX2hkcl90CSpzZmhwKQkJLyogc2hvcnRmb3JtIGRpcmVjdG9yeSBoZHIgKi8KK3sKKwl4ZnNfZGlyMl9ibG9ja190CSpibG9jazsJCS8qIGJsb2NrIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2Jsb2NrX3RhaWxfdAkqYnRwOwkJLyogYmxvY2sgdGFpbCBwb2ludGVyICovCisJeGZzX2RpcjJfZGF0YV9lbnRyeV90CSpkZXA7CQkvKiBkYXRhIGVudHJ5IHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJKmR1cDsJCS8qIHVudXNlZCBkYXRhIHBvaW50ZXIgKi8KKwljaGFyCQkJKmVuZHB0cjsJLyogZW5kIG9mIGRhdGEgZW50cmllcyAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQkJbG9nZmxhZ3M7CS8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCWNoYXIJCQkqcHRyOwkJLyogY3VycmVudCBkYXRhIHBvaW50ZXIgKi8KKwl4ZnNfZGlyMl9zZl9lbnRyeV90CSpzZmVwOwkJLyogc2hvcnRmb3JtIGVudHJ5ICovCisJeGZzX2RpcjJfc2ZfdAkJKnNmcDsJCS8qIHNob3J0Zm9ybSBzdHJ1Y3R1cmUgKi8KKwl4ZnNfaW5vX3QgICAgICAgICAgICAgICB0ZW1wOworCisJeGZzX2RpcjJfdHJhY2VfYXJnc19zYigiYmxvY2tfdG9fc2YiLCBhcmdzLCBzaXplLCBicCk7CisJZHAgPSBhcmdzLT5kcDsKKwltcCA9IGRwLT5pX21vdW50OworCisJLyoKKwkgKiBNYWtlIGEgY29weSBvZiB0aGUgYmxvY2sgZGF0YSwgc28gd2UgY2FuIHNocmluayB0aGUgaW5vZGUKKwkgKiBhbmQgYWRkIGxvY2FsIGRhdGEuCisJICovCisJYmxvY2sgPSBrbWVtX2FsbG9jKG1wLT5tX2RpcmJsa3NpemUsIEtNX1NMRUVQKTsKKwltZW1jcHkoYmxvY2ssIGJwLT5kYXRhLCBtcC0+bV9kaXJibGtzaXplKTsKKwlsb2dmbGFncyA9IFhGU19JTE9HX0NPUkU7CisJaWYgKChlcnJvciA9IHhmc19kaXIyX3Nocmlua19pbm9kZShhcmdzLCBtcC0+bV9kaXJkYXRhYmxrLCBicCkpKSB7CisJCUFTU0VSVChlcnJvciAhPSBFTk9TUEMpOworCQlnb3RvIG91dDsKKwl9CisJLyoKKwkgKiBUaGUgYnVmZmVyIGlzIG5vdyB1bmNvbmRpdGlvbmFsbHkgZ29uZSwgd2hldGhlcgorCSAqIHhmc19kaXIyX3Nocmlua19pbm9kZSB3b3JrZWQgb3Igbm90LgorCSAqCisJICogQ29udmVydCB0aGUgaW5vZGUgdG8gbG9jYWwgZm9ybWF0LgorCSAqLworCWRwLT5pX2RmLmlmX2ZsYWdzICY9IH5YRlNfSUZFWFRFTlRTOworCWRwLT5pX2RmLmlmX2ZsYWdzIHw9IFhGU19JRklOTElORTsKKwlkcC0+aV9kLmRpX2Zvcm1hdCA9IFhGU19ESU5PREVfRk1UX0xPQ0FMOworCUFTU0VSVChkcC0+aV9kZi5pZl9ieXRlcyA9PSAwKTsKKwl4ZnNfaWRhdGFfcmVhbGxvYyhkcCwgc2l6ZSwgWEZTX0RBVEFfRk9SSyk7CisJbG9nZmxhZ3MgfD0gWEZTX0lMT0dfRERBVEE7CisJLyoKKwkgKiBDb3B5IHRoZSBoZWFkZXIgaW50byB0aGUgbmV3bHkgYWxsb2NhdGUgbG9jYWwgc3BhY2UuCisJICovCisJc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCW1lbWNweShzZnAsIHNmaHAsIFhGU19ESVIyX1NGX0hEUl9TSVpFKHNmaHAtPmk4Y291bnQpKTsKKwlkcC0+aV9kLmRpX3NpemUgPSBzaXplOworCS8qCisJICogU2V0IHVwIHRvIGxvb3Agb3ZlciB0aGUgYmxvY2sncyBlbnRyaWVzLgorCSAqLworCWJ0cCA9IFhGU19ESVIyX0JMT0NLX1RBSUxfUChtcCwgYmxvY2spOworCXB0ciA9IChjaGFyICopYmxvY2stPnU7CisJZW5kcHRyID0gKGNoYXIgKilYRlNfRElSMl9CTE9DS19MRUFGX1AoYnRwKTsKKwlzZmVwID0gWEZTX0RJUjJfU0ZfRklSU1RFTlRSWShzZnApOworCS8qCisJICogTG9vcCBvdmVyIHRoZSBhY3RpdmUgYW5kIHVudXNlZCBlbnRyaWVzLgorCSAqIFN0b3Agd2hlbiB3ZSByZWFjaCB0aGUgbGVhZi90YWlsIHBvcnRpb24gb2YgdGhlIGJsb2NrLgorCSAqLworCXdoaWxlIChwdHIgPCBlbmRwdHIpIHsKKwkJLyoKKwkJICogSWYgaXQncyB1bnVzZWQsIGp1c3Qgc2tpcCBvdmVyIGl0LgorCQkgKi8KKwkJZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKilwdHI7CisJCWlmIChJTlRfR0VUKGR1cC0+ZnJlZXRhZywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKSB7CisJCQlwdHIgKz0gSU5UX0dFVChkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKilwdHI7CisJCS8qCisJCSAqIFNraXAgLgorCQkgKi8KKwkJaWYgKGRlcC0+bmFtZWxlbiA9PSAxICYmIGRlcC0+bmFtZVswXSA9PSAnLicpCisJCQlBU1NFUlQoSU5UX0dFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCkgPT0gZHAtPmlfaW5vKTsKKwkJLyoKKwkJICogU2tpcCAuLiwgYnV0IG1ha2Ugc3VyZSB0aGUgaW5vZGUgbnVtYmVyIGlzIHJpZ2h0LgorCQkgKi8KKwkJZWxzZSBpZiAoZGVwLT5uYW1lbGVuID09IDIgJiYKKwkJCSBkZXAtPm5hbWVbMF0gPT0gJy4nICYmIGRlcC0+bmFtZVsxXSA9PSAnLicpCisJCQlBU1NFUlQoSU5UX0dFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCkgPT0KKwkJCSAgICAgICBYRlNfRElSMl9TRl9HRVRfSU5VTUJFUihzZnAsICZzZnAtPmhkci5wYXJlbnQpKTsKKwkJLyoKKwkJICogTm9ybWFsIGVudHJ5LCBjb3B5IGl0IGludG8gc2hvcnRmb3JtLgorCQkgKi8KKwkJZWxzZSB7CisJCQlzZmVwLT5uYW1lbGVuID0gZGVwLT5uYW1lbGVuOworCQkJWEZTX0RJUjJfU0ZfUFVUX09GRlNFVChzZmVwLAorCQkJCSh4ZnNfZGlyMl9kYXRhX2FvZmZfdCkKKwkJCQkoKGNoYXIgKilkZXAgLSAoY2hhciAqKWJsb2NrKSk7CisJCQltZW1jcHkoc2ZlcC0+bmFtZSwgZGVwLT5uYW1lLCBkZXAtPm5hbWVsZW4pOworCQkJdGVtcD1JTlRfR0VUKGRlcC0+aW51bWJlciwgQVJDSF9DT05WRVJUKTsKKwkJCVhGU19ESVIyX1NGX1BVVF9JTlVNQkVSKHNmcCwgJnRlbXAsCisJCQkJWEZTX0RJUjJfU0ZfSU5VTUJFUlAoc2ZlcCkpOworCQkJc2ZlcCA9IFhGU19ESVIyX1NGX05FWFRFTlRSWShzZnAsIHNmZXApOworCQl9CisJCXB0ciArPSBYRlNfRElSMl9EQVRBX0VOVFNJWkUoZGVwLT5uYW1lbGVuKTsKKwl9CisJQVNTRVJUKChjaGFyICopc2ZlcCAtIChjaGFyICopc2ZwID09IHNpemUpOworCXhmc19kaXIyX3NmX2NoZWNrKGFyZ3MpOworb3V0OgorCXhmc190cmFuc19sb2dfaW5vZGUoYXJncy0+dHJhbnMsIGRwLCBsb2dmbGFncyk7CisJa21lbV9mcmVlKGJsb2NrLCBtcC0+bV9kaXJibGtzaXplKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBBZGQgYSBuYW1lIHRvIGEgc2hvcnRmb3JtIGRpcmVjdG9yeS4KKyAqIFRoZXJlIGFyZSB0d28gYWxnb3JpdGhtcywgImVhc3kiIGFuZCAiaGFyZCIgd2hpY2ggd2UgZGVjaWRlIG9uCisgKiBiZWZvcmUgY2hhbmdpbmcgYW55dGhpbmcuCisgKiBDb252ZXJ0IHRvIGJsb2NrIGZvcm0gaWYgbmVjZXNzYXJ5LCBpZiB0aGUgbmV3IGVudHJ5IHdvbid0IGZpdC4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX3NmX2FkZG5hbWUoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MpCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCit7CisJaW50CQkJYWRkX2VudHNpemU7CS8qIHNpemUgb2YgdGhlIG5ldyBlbnRyeSAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlpbmNyX2lzaXplOwkvKiB0b3RhbCBjaGFuZ2UgaW4gc2l6ZSAqLworCWludAkJCW5ld19pc2l6ZTsJLyogZGlfc2l6ZSBhZnRlciBhZGRpbmcgbmFtZSAqLworCWludAkJCW9iamNoYW5nZTsJLyogY2hhbmdpbmcgdG8gOC1ieXRlIGlub2RlcyAqLworCXhmc19kaXIyX2RhdGFfYW9mZl90CW9mZnNldDsJCS8qIG9mZnNldCBmb3IgbmV3IGVudHJ5ICovCisJaW50CQkJb2xkX2lzaXplOwkvKiBkaV9zaXplIGJlZm9yZSBhZGRpbmcgbmFtZSAqLworCWludAkJCXBpY2s7CQkvKiB3aGljaCBhbGdvcml0aG0gdG8gdXNlICovCisJeGZzX2RpcjJfc2ZfdAkJKnNmcDsJCS8qIHNob3J0Zm9ybSBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9zZl9lbnRyeV90CSpzZmVwOwkJLyogc2hvcnRmb3JtIGVudHJ5ICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzKCJzZl9hZGRuYW1lIiwgYXJncyk7CisJQVNTRVJUKHhmc19kaXIyX3NmX2xvb2t1cChhcmdzKSA9PSBFTk9FTlQpOworCWRwID0gYXJncy0+ZHA7CisJQVNTRVJUKGRwLT5pX2RmLmlmX2ZsYWdzICYgWEZTX0lGSU5MSU5FKTsKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgc2hvcnRmb3JtIHZhbHVlIGhhcyBzb21lIG9mIGl0cyBoZWFkZXIuCisJICovCisJaWYgKGRwLT5pX2QuZGlfc2l6ZSA8IG9mZnNldG9mKHhmc19kaXIyX3NmX2hkcl90LCBwYXJlbnQpKSB7CisJCUFTU0VSVChYRlNfRk9SQ0VEX1NIVVRET1dOKGRwLT5pX21vdW50KSk7CisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwl9CisJQVNTRVJUKGRwLT5pX2RmLmlmX2J5dGVzID09IGRwLT5pX2QuZGlfc2l6ZSk7CisJQVNTRVJUKGRwLT5pX2RmLmlmX3UxLmlmX2RhdGEgIT0gTlVMTCk7CisJc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCUFTU0VSVChkcC0+aV9kLmRpX3NpemUgPj0gWEZTX0RJUjJfU0ZfSERSX1NJWkUoc2ZwLT5oZHIuaThjb3VudCkpOworCS8qCisJICogQ29tcHV0ZSBlbnRyeSAoYW5kIGNoYW5nZSBpbikgc2l6ZS4KKwkgKi8KKwlhZGRfZW50c2l6ZSA9IFhGU19ESVIyX1NGX0VOVFNJWkVfQllOQU1FKHNmcCwgYXJncy0+bmFtZWxlbik7CisJaW5jcl9pc2l6ZSA9IGFkZF9lbnRzaXplOworCW9iamNoYW5nZSA9IDA7CisjaWYgWEZTX0JJR19JTlVNUworCS8qCisJICogRG8gd2UgaGF2ZSB0byBjaGFuZ2UgdG8gOCBieXRlIGlub2Rlcz8KKwkgKi8KKwlpZiAoYXJncy0+aW51bWJlciA+IFhGU19ESVIyX01BWF9TSE9SVF9JTlVNICYmIHNmcC0+aGRyLmk4Y291bnQgPT0gMCkgeworCQkvKgorCQkgKiBZZXMsIGFkanVzdCB0aGUgZW50cnkgc2l6ZSBhbmQgdGhlIHRvdGFsIHNpemUuCisJCSAqLworCQlhZGRfZW50c2l6ZSArPQorCQkJKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzhfdCkgLQorCQkJKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzRfdCk7CisJCWluY3JfaXNpemUgKz0KKwkJCShzZnAtPmhkci5jb3VudCArIDIpICoKKwkJCSgodWludClzaXplb2YoeGZzX2RpcjJfaW5vOF90KSAtCisJCQkgKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzRfdCkpOworCQlvYmpjaGFuZ2UgPSAxOworCX0KKyNlbmRpZgorCW9sZF9pc2l6ZSA9IChpbnQpZHAtPmlfZC5kaV9zaXplOworCW5ld19pc2l6ZSA9IG9sZF9pc2l6ZSArIGluY3JfaXNpemU7CisJLyoKKwkgKiBXb24ndCBmaXQgYXMgc2hvcnRmb3JtIGFueSBtb3JlIChkdWUgdG8gc2l6ZSksCisJICogb3IgdGhlIHBpY2sgcm91dGluZSBzYXlzIGl0IHdvbid0IChkdWUgdG8gb2Zmc2V0IHZhbHVlcykuCisJICovCisJaWYgKG5ld19pc2l6ZSA+IFhGU19JRk9SS19EU0laRShkcCkgfHwKKwkgICAgKHBpY2sgPQorCSAgICAgeGZzX2RpcjJfc2ZfYWRkbmFtZV9waWNrKGFyZ3MsIG9iamNoYW5nZSwgJnNmZXAsICZvZmZzZXQpKSA9PSAwKSB7CisJCS8qCisJCSAqIEp1c3QgY2hlY2tpbmcgb3Igbm8gc3BhY2UgcmVzZXJ2YXRpb24sIGl0IGRvZXNuJ3QgZml0LgorCQkgKi8KKwkJaWYgKGFyZ3MtPmp1c3RjaGVjayB8fCBhcmdzLT50b3RhbCA9PSAwKQorCQkJcmV0dXJuIFhGU19FUlJPUihFTk9TUEMpOworCQkvKgorCQkgKiBDb252ZXJ0IHRvIGJsb2NrIGZvcm0gdGhlbiBhZGQgdGhlIG5hbWUuCisJCSAqLworCQllcnJvciA9IHhmc19kaXIyX3NmX3RvX2Jsb2NrKGFyZ3MpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJCXJldHVybiB4ZnNfZGlyMl9ibG9ja19hZGRuYW1lKGFyZ3MpOworCX0KKwkvKgorCSAqIEp1c3QgY2hlY2tpbmcsIGl0IGZpdHMuCisJICovCisJaWYgKGFyZ3MtPmp1c3RjaGVjaykKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBEbyBpdCB0aGUgZWFzeSB3YXkgLSBqdXN0IGFkZCBpdCBhdCB0aGUgZW5kLgorCSAqLworCWlmIChwaWNrID09IDEpCisJCXhmc19kaXIyX3NmX2FkZG5hbWVfZWFzeShhcmdzLCBzZmVwLCBvZmZzZXQsIG5ld19pc2l6ZSk7CisJLyoKKwkgKiBEbyBpdCB0aGUgaGFyZCB3YXkgLSBsb29rIGZvciBhIHBsYWNlIHRvIGluc2VydCB0aGUgbmV3IGVudHJ5LgorCSAqIENvbnZlcnQgdG8gOCBieXRlIGlub2RlIG51bWJlcnMgZmlyc3QgaWYgbmVjZXNzYXJ5LgorCSAqLworCWVsc2UgeworCQlBU1NFUlQocGljayA9PSAyKTsKKyNpZiBYRlNfQklHX0lOVU1TCisJCWlmIChvYmpjaGFuZ2UpCisJCQl4ZnNfZGlyMl9zZl90b2lubzgoYXJncyk7CisjZW5kaWYKKwkJeGZzX2RpcjJfc2ZfYWRkbmFtZV9oYXJkKGFyZ3MsIG9iamNoYW5nZSwgbmV3X2lzaXplKTsKKwl9CisJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19EREFUQSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBZGQgdGhlIG5ldyBlbnRyeSB0aGUgImVhc3kiIHdheS4KKyAqIFRoaXMgaXMgY29weWluZyB0aGUgb2xkIGRpcmVjdG9yeSBhbmQgYWRkaW5nIHRoZSBuZXcgZW50cnkgYXQgdGhlIGVuZC4KKyAqIFNpbmNlIGl0J3Mgc29ydGVkIGJ5ICJvZmZzZXQiIHdlIG5lZWQgcm9vbSBhZnRlciB0aGUgbGFzdCBvZmZzZXQKKyAqIHRoYXQncyBhbHJlYWR5IHRoZXJlLCBhbmQgdGhlbiByb29tIHRvIGNvbnZlcnQgdG8gYSBibG9jayBkaXJlY3RvcnkuCisgKiBUaGlzIGlzIGFscmVhZHkgY2hlY2tlZCBieSB0aGUgcGljayByb3V0aW5lLgorICovCitzdGF0aWMgdm9pZAoreGZzX2RpcjJfc2ZfYWRkbmFtZV9lYXN5KAorCXhmc19kYV9hcmdzX3QJCSphcmdzLAkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworCXhmc19kaXIyX3NmX2VudHJ5X3QJKnNmZXAsCQkvKiBwb2ludGVyIHRvIG5ldyBlbnRyeSAqLworCXhmc19kaXIyX2RhdGFfYW9mZl90CW9mZnNldCwJCS8qIG9mZnNldCB0byB1c2UgZm9yIG5ldyBlbnQgKi8KKwlpbnQJCQluZXdfaXNpemUpCS8qIG5ldyBkaXJlY3Rvcnkgc2l6ZSAqLworeworCWludAkJCWJ5dGVvZmY7CS8qIGJ5dGUgb2Zmc2V0IGluIHNmIGRpciAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJeGZzX2RpcjJfc2ZfdAkJKnNmcDsJCS8qIHNob3J0Zm9ybSBzdHJ1Y3R1cmUgKi8KKworCWRwID0gYXJncy0+ZHA7CisKKwlzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJYnl0ZW9mZiA9IChpbnQpKChjaGFyICopc2ZlcCAtIChjaGFyICopc2ZwKTsKKwkvKgorCSAqIEdyb3cgdGhlIGluLWlub2RlIHNwYWNlLgorCSAqLworCXhmc19pZGF0YV9yZWFsbG9jKGRwLCBYRlNfRElSMl9TRl9FTlRTSVpFX0JZTkFNRShzZnAsIGFyZ3MtPm5hbWVsZW4pLAorCQlYRlNfREFUQV9GT1JLKTsKKwkvKgorCSAqIE5lZWQgdG8gc2V0IHVwIGFnYWluIGR1ZSB0byByZWFsbG9jIG9mIHRoZSBpbm9kZSBkYXRhLgorCSAqLworCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwlzZmVwID0gKHhmc19kaXIyX3NmX2VudHJ5X3QgKikoKGNoYXIgKilzZnAgKyBieXRlb2ZmKTsKKwkvKgorCSAqIEZpbGwgaW4gdGhlIG5ldyBlbnRyeS4KKwkgKi8KKwlzZmVwLT5uYW1lbGVuID0gYXJncy0+bmFtZWxlbjsKKwlYRlNfRElSMl9TRl9QVVRfT0ZGU0VUKHNmZXAsIG9mZnNldCk7CisJbWVtY3B5KHNmZXAtPm5hbWUsIGFyZ3MtPm5hbWUsIHNmZXAtPm5hbWVsZW4pOworCVhGU19ESVIyX1NGX1BVVF9JTlVNQkVSKHNmcCwgJmFyZ3MtPmludW1iZXIsCisJCVhGU19ESVIyX1NGX0lOVU1CRVJQKHNmZXApKTsKKwkvKgorCSAqIFVwZGF0ZSB0aGUgaGVhZGVyIGFuZCBpbm9kZS4KKwkgKi8KKwlzZnAtPmhkci5jb3VudCsrOworI2lmIFhGU19CSUdfSU5VTVMKKwlpZiAoYXJncy0+aW51bWJlciA+IFhGU19ESVIyX01BWF9TSE9SVF9JTlVNKQorCQlzZnAtPmhkci5pOGNvdW50Kys7CisjZW5kaWYKKwlkcC0+aV9kLmRpX3NpemUgPSBuZXdfaXNpemU7CisJeGZzX2RpcjJfc2ZfY2hlY2soYXJncyk7Cit9CisKKy8qCisgKiBBZGQgdGhlIG5ldyBlbnRyeSB0aGUgImhhcmQiIHdheS4KKyAqIFRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY29udmVydGVkIHRvIDggYnl0ZSBpbm9kZSBudW1iZXJzIGlmIG5lY2Vzc2FyeSwKKyAqIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0byBsZWF2ZSB0aGUgaThjb3VudCBhdCAxLgorICogRmluZCBhIGhvbGUgdGhhdCB0aGUgbmV3IGVudHJ5IHdpbGwgZml0IGludG8sIGFuZCBjb3B5CisgKiB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZW50cmllcywgdGhlIG5ldyBlbnRyeSwgYW5kIHRoZSBsYXN0IHBhcnQgb2YKKyAqIHRoZSBlbnRyaWVzLgorICovCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK3hmc19kaXIyX3NmX2FkZG5hbWVfaGFyZCgKKwl4ZnNfZGFfYXJnc190CQkqYXJncywJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwlpbnQJCQlvYmpjaGFuZ2UsCS8qIGNoYW5naW5nIGlub2RlIG51bWJlciBzaXplICovCisJaW50CQkJbmV3X2lzaXplKQkvKiBuZXcgZGlyZWN0b3J5IHNpemUgKi8KK3sKKwlpbnQJCQlhZGRfZGF0YXNpemU7CS8qIGRhdGEgc2l6ZSBuZWVkIGZvciBuZXcgZW50ICovCisJY2hhcgkJCSpidWY7CQkvKiBidWZmZXIgZm9yIG9sZCAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQkJZW9mOwkJLyogcmVhY2hlZCBlbmQgb2Ygb2xkIGRpciAqLworCWludAkJCW5ieXRlczsJCS8qIHRlbXAgZm9yIGJ5dGUgY29waWVzICovCisJeGZzX2RpcjJfZGF0YV9hb2ZmX3QJbmV3X29mZnNldDsJLyogbmV4dCBvZmZzZXQgdmFsdWUgKi8KKwl4ZnNfZGlyMl9kYXRhX2FvZmZfdAlvZmZzZXQ7CQkvKiBjdXJyZW50IG9mZnNldCB2YWx1ZSAqLworCWludAkJCW9sZF9pc2l6ZTsJLyogcHJldmlvdXMgZGlfc2l6ZSAqLworCXhmc19kaXIyX3NmX2VudHJ5X3QJKm9sZHNmZXA7CS8qIGVudHJ5IGluIG9yaWdpbmFsIGRpciAqLworCXhmc19kaXIyX3NmX3QJCSpvbGRzZnA7CS8qIG9yaWdpbmFsIHNob3J0Zm9ybSBkaXIgKi8KKwl4ZnNfZGlyMl9zZl9lbnRyeV90CSpzZmVwOwkJLyogZW50cnkgaW4gbmV3IGRpciAqLworCXhmc19kaXIyX3NmX3QJCSpzZnA7CQkvKiBuZXcgc2hvcnRmb3JtIGRpciAqLworCisJLyoKKwkgKiBDb3B5IHRoZSBvbGQgZGlyZWN0b3J5IHRvIHRoZSBzdGFjayBidWZmZXIuCisJICovCisJZHAgPSBhcmdzLT5kcDsKKworCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwlvbGRfaXNpemUgPSAoaW50KWRwLT5pX2QuZGlfc2l6ZTsKKwlidWYgPSBrbWVtX2FsbG9jKG9sZF9pc2l6ZSwgS01fU0xFRVApOworCW9sZHNmcCA9ICh4ZnNfZGlyMl9zZl90ICopYnVmOworCW1lbWNweShvbGRzZnAsIHNmcCwgb2xkX2lzaXplKTsKKwkvKgorCSAqIExvb3Agb3ZlciB0aGUgb2xkIGRpcmVjdG9yeSBmaW5kaW5nIHRoZSBwbGFjZSB3ZSdyZSBnb2luZworCSAqIHRvIGluc2VydCB0aGUgbmV3IGVudHJ5LgorCSAqIElmIGl0J3MgZ29pbmcgdG8gZW5kIHVwIGF0IHRoZSBlbmQgdGhlbiBvbGRzZmVwIHdpbGwgcG9pbnQgdGhlcmUuCisJICovCisJZm9yIChvZmZzZXQgPSBYRlNfRElSMl9EQVRBX0ZJUlNUX09GRlNFVCwKKwkgICAgICBvbGRzZmVwID0gWEZTX0RJUjJfU0ZfRklSU1RFTlRSWShvbGRzZnApLAorCSAgICAgIGFkZF9kYXRhc2l6ZSA9IFhGU19ESVIyX0RBVEFfRU5UU0laRShhcmdzLT5uYW1lbGVuKSwKKwkgICAgICBlb2YgPSAoY2hhciAqKW9sZHNmZXAgPT0gJmJ1ZltvbGRfaXNpemVdOworCSAgICAgIWVvZjsKKwkgICAgIG9mZnNldCA9IG5ld19vZmZzZXQgKyBYRlNfRElSMl9EQVRBX0VOVFNJWkUob2xkc2ZlcC0+bmFtZWxlbiksCisJICAgICAgb2xkc2ZlcCA9IFhGU19ESVIyX1NGX05FWFRFTlRSWShvbGRzZnAsIG9sZHNmZXApLAorCSAgICAgIGVvZiA9IChjaGFyICopb2xkc2ZlcCA9PSAmYnVmW29sZF9pc2l6ZV0pIHsKKwkJbmV3X29mZnNldCA9IFhGU19ESVIyX1NGX0dFVF9PRkZTRVQob2xkc2ZlcCk7CisJCWlmIChvZmZzZXQgKyBhZGRfZGF0YXNpemUgPD0gbmV3X29mZnNldCkKKwkJCWJyZWFrOworCX0KKwkvKgorCSAqIEdldCByaWQgb2YgdGhlIG9sZCBkaXJlY3RvcnksIHRoZW4gYWxsb2NhdGUgc3BhY2UgZm9yCisJICogdGhlIG5ldyBvbmUuICBXZSBkbyB0aGlzIHNvIHhmc19pZGF0YV9yZWFsbG9jIHdvbid0IGNvcHkKKwkgKiB0aGUgZGF0YS4KKwkgKi8KKwl4ZnNfaWRhdGFfcmVhbGxvYyhkcCwgLW9sZF9pc2l6ZSwgWEZTX0RBVEFfRk9SSyk7CisJeGZzX2lkYXRhX3JlYWxsb2MoZHAsIG5ld19pc2l6ZSwgWEZTX0RBVEFfRk9SSyk7CisJLyoKKwkgKiBSZXNldCB0aGUgcG9pbnRlciBzaW5jZSB0aGUgYnVmZmVyIHdhcyByZWFsbG9jYXRlZC4KKwkgKi8KKwlzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJLyoKKwkgKiBDb3B5IHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBkaXJlY3RvcnksIGluY2x1ZGluZyB0aGUgaGVhZGVyLgorCSAqLworCW5ieXRlcyA9IChpbnQpKChjaGFyICopb2xkc2ZlcCAtIChjaGFyICopb2xkc2ZwKTsKKwltZW1jcHkoc2ZwLCBvbGRzZnAsIG5ieXRlcyk7CisJc2ZlcCA9ICh4ZnNfZGlyMl9zZl9lbnRyeV90ICopKChjaGFyICopc2ZwICsgbmJ5dGVzKTsKKwkvKgorCSAqIEZpbGwgaW4gdGhlIG5ldyBlbnRyeSwgYW5kIHVwZGF0ZSB0aGUgaGVhZGVyIGNvdW50cy4KKwkgKi8KKwlzZmVwLT5uYW1lbGVuID0gYXJncy0+bmFtZWxlbjsKKwlYRlNfRElSMl9TRl9QVVRfT0ZGU0VUKHNmZXAsIG9mZnNldCk7CisJbWVtY3B5KHNmZXAtPm5hbWUsIGFyZ3MtPm5hbWUsIHNmZXAtPm5hbWVsZW4pOworCVhGU19ESVIyX1NGX1BVVF9JTlVNQkVSKHNmcCwgJmFyZ3MtPmludW1iZXIsCisJCVhGU19ESVIyX1NGX0lOVU1CRVJQKHNmZXApKTsKKwlzZnAtPmhkci5jb3VudCsrOworI2lmIFhGU19CSUdfSU5VTVMKKwlpZiAoYXJncy0+aW51bWJlciA+IFhGU19ESVIyX01BWF9TSE9SVF9JTlVNICYmICFvYmpjaGFuZ2UpCisJCXNmcC0+aGRyLmk4Y291bnQrKzsKKyNlbmRpZgorCS8qCisJICogSWYgdGhlcmUncyBtb3JlIGxlZnQgdG8gY29weSwgZG8gdGhhdC4KKwkgKi8KKwlpZiAoIWVvZikgeworCQlzZmVwID0gWEZTX0RJUjJfU0ZfTkVYVEVOVFJZKHNmcCwgc2ZlcCk7CisJCW1lbWNweShzZmVwLCBvbGRzZmVwLCBvbGRfaXNpemUgLSBuYnl0ZXMpOworCX0KKwlrbWVtX2ZyZWUoYnVmLCBvbGRfaXNpemUpOworCWRwLT5pX2QuZGlfc2l6ZSA9IG5ld19pc2l6ZTsKKwl4ZnNfZGlyMl9zZl9jaGVjayhhcmdzKTsKK30KKworLyoKKyAqIERlY2lkZSBpZiB0aGUgbmV3IGVudHJ5IHdpbGwgZml0IGF0IGFsbC4KKyAqIElmIGl0IHdpbGwgZml0LCBwaWNrIGJldHdlZW4gYWRkaW5nIHRoZSBuZXcgZW50cnkgdG8gdGhlIGVuZCAoZWFzeSkKKyAqIG9yIHNvbWV3aGVyZSBlbHNlIChoYXJkKS4KKyAqIFJldHVybiAwICh3b24ndCBmaXQpLCAxIChlYXN5KSwgMiAoaGFyZCkuCisgKi8KKy8qQVJHU1VTRUQqLworc3RhdGljIGludAkJCQkJLyogcGljayByZXN1bHQgKi8KK3hmc19kaXIyX3NmX2FkZG5hbWVfcGljaygKKwl4ZnNfZGFfYXJnc190CQkqYXJncywJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwlpbnQJCQlvYmpjaGFuZ2UsCS8qIGlub2RlICMgc2l6ZSBjaGFuZ2VzICovCisJeGZzX2RpcjJfc2ZfZW50cnlfdAkqKnNmZXBwLAkvKiBvdXQoMSk6IG5ldyBlbnRyeSBwdHIgKi8KKwl4ZnNfZGlyMl9kYXRhX2FvZmZfdAkqb2Zmc2V0cCkJLyogb3V0KDEpOiBuZXcgb2Zmc2V0ICovCit7CisJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwlpbnQJCQlob2xlZml0OwkvKiBmb3VuZCBob2xlIGl0IHdpbGwgZml0IGluICovCisJaW50CQkJaTsJCS8qIGVudHJ5IG51bWJlciAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX2RpcjJfZGF0YV9hb2ZmX3QJb2Zmc2V0OwkJLyogZGF0YSBibG9jayBvZmZzZXQgKi8KKwl4ZnNfZGlyMl9zZl9lbnRyeV90CSpzZmVwOwkJLyogc2hvcnRmb3JtIGVudHJ5ICovCisJeGZzX2RpcjJfc2ZfdAkJKnNmcDsJCS8qIHNob3J0Zm9ybSBzdHJ1Y3R1cmUgKi8KKwlpbnQJCQlzaXplOwkJLyogZW50cnkncyBkYXRhIHNpemUgKi8KKwlpbnQJCQl1c2VkOwkJLyogZGF0YSBieXRlcyB1c2VkICovCisKKwlkcCA9IGFyZ3MtPmRwOworCW1wID0gZHAtPmlfbW91bnQ7CisKKwlzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJc2l6ZSA9IFhGU19ESVIyX0RBVEFfRU5UU0laRShhcmdzLT5uYW1lbGVuKTsKKwlvZmZzZXQgPSBYRlNfRElSMl9EQVRBX0ZJUlNUX09GRlNFVDsKKwlzZmVwID0gWEZTX0RJUjJfU0ZfRklSU1RFTlRSWShzZnApOworCWhvbGVmaXQgPSAwOworCS8qCisJICogTG9vcCBvdmVyIHNmIGVudHJpZXMuCisJICogS2VlcCB0cmFjayBvZiBkYXRhIG9mZnNldCBhbmQgd2hldGhlciB3ZSd2ZSBzZWVuIGEgcGxhY2UKKwkgKiB0byBpbnNlcnQgdGhlIG5ldyBlbnRyeS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2ZwLT5oZHIuY291bnQ7IGkrKykgeworCQlpZiAoIWhvbGVmaXQpCisJCQlob2xlZml0ID0gb2Zmc2V0ICsgc2l6ZSA8PSBYRlNfRElSMl9TRl9HRVRfT0ZGU0VUKHNmZXApOworCQlvZmZzZXQgPSBYRlNfRElSMl9TRl9HRVRfT0ZGU0VUKHNmZXApICsKKwkJCSBYRlNfRElSMl9EQVRBX0VOVFNJWkUoc2ZlcC0+bmFtZWxlbik7CisJCXNmZXAgPSBYRlNfRElSMl9TRl9ORVhURU5UUlkoc2ZwLCBzZmVwKTsKKwl9CisJLyoKKwkgKiBDYWxjdWxhdGUgZGF0YSBieXRlcyB1c2VkIGV4Y2x1ZGluZyB0aGUgbmV3IGVudHJ5LCBpZiB0aGlzCisJICogd2FzIGEgZGF0YSBibG9jayAoYmxvY2sgZm9ybSBkaXJlY3RvcnkpLgorCSAqLworCXVzZWQgPSBvZmZzZXQgKworCSAgICAgICAoc2ZwLT5oZHIuY291bnQgKyAzKSAqICh1aW50KXNpemVvZih4ZnNfZGlyMl9sZWFmX2VudHJ5X3QpICsKKwkgICAgICAgKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2Jsb2NrX3RhaWxfdCk7CisJLyoKKwkgKiBJZiBpdCB3b24ndCBmaXQgaW4gYSBibG9jayBmb3JtIHRoZW4gd2UgY2FuJ3QgaW5zZXJ0IGl0LAorCSAqIHdlJ2xsIGdvIGJhY2ssIGNvbnZlcnQgdG8gYmxvY2ssIHRoZW4gdHJ5IHRoZSBpbnNlcnQgYW5kIGNvbnZlcnQKKwkgKiB0byBsZWFmLgorCSAqLworCWlmICh1c2VkICsgKGhvbGVmaXQgPyAwIDogc2l6ZSkgPiBtcC0+bV9kaXJibGtzaXplKQorCQlyZXR1cm4gMDsKKwkvKgorCSAqIElmIGNoYW5naW5nIHRoZSBpbm9kZSBudW1iZXIgc2l6ZSwgZG8gaXQgdGhlIGhhcmQgd2F5LgorCSAqLworI2lmIFhGU19CSUdfSU5VTVMKKwlpZiAob2JqY2hhbmdlKSB7CisJCXJldHVybiAyOworCX0KKyNlbHNlCisJQVNTRVJUKG9iamNoYW5nZSA9PSAwKTsKKyNlbmRpZgorCS8qCisJICogSWYgaXQgd29uJ3QgZml0IGF0IHRoZSBlbmQgdGhlbiBkbyBpdCB0aGUgaGFyZCB3YXkgKHVzZSB0aGUgaG9sZSkuCisJICovCisJaWYgKHVzZWQgKyBzaXplID4gbXAtPm1fZGlyYmxrc2l6ZSkKKwkJcmV0dXJuIDI7CisJLyoKKwkgKiBEbyBpdCB0aGUgZWFzeSB3YXkuCisJICovCisJKnNmZXBwID0gc2ZlcDsKKwkqb2Zmc2V0cCA9IG9mZnNldDsKKwlyZXR1cm4gMTsKK30KKworI2lmZGVmIERFQlVHCisvKgorICogQ2hlY2sgY29uc2lzdGVuY3kgb2Ygc2hvcnRmb3JtIGRpcmVjdG9yeSwgYXNzZXJ0IGlmIGJhZC4KKyAqLworc3RhdGljIHZvaWQKK3hmc19kaXIyX3NmX2NoZWNrKAorCXhmc19kYV9hcmdzX3QJCSphcmdzKQkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworeworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQkJaTsJCS8qIGVudHJ5IG51bWJlciAqLworCWludAkJCWk4Y291bnQ7CS8qIG51bWJlciBvZiBiaWcgaW5vZGUjcyAqLworCXhmc19pbm9fdAkJaW5vOwkJLyogZW50cnkgaW5vZGUgbnVtYmVyICovCisJaW50CQkJb2Zmc2V0OwkJLyogZGF0YSBvZmZzZXQgKi8KKwl4ZnNfZGlyMl9zZl9lbnRyeV90CSpzZmVwOwkJLyogc2hvcnRmb3JtIGRpciBlbnRyeSAqLworCXhmc19kaXIyX3NmX3QJCSpzZnA7CQkvKiBzaG9ydGZvcm0gc3RydWN0dXJlICovCisKKwlkcCA9IGFyZ3MtPmRwOworCisJc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCW9mZnNldCA9IFhGU19ESVIyX0RBVEFfRklSU1RfT0ZGU0VUOworCWlubyA9IFhGU19ESVIyX1NGX0dFVF9JTlVNQkVSKHNmcCwgJnNmcC0+aGRyLnBhcmVudCk7CisJaThjb3VudCA9IGlubyA+IFhGU19ESVIyX01BWF9TSE9SVF9JTlVNOworCisJZm9yIChpID0gMCwgc2ZlcCA9IFhGU19ESVIyX1NGX0ZJUlNURU5UUlkoc2ZwKTsKKwkgICAgIGkgPCBzZnAtPmhkci5jb3VudDsKKwkgICAgIGkrKywgc2ZlcCA9IFhGU19ESVIyX1NGX05FWFRFTlRSWShzZnAsIHNmZXApKSB7CisJCUFTU0VSVChYRlNfRElSMl9TRl9HRVRfT0ZGU0VUKHNmZXApID49IG9mZnNldCk7CisJCWlubyA9IFhGU19ESVIyX1NGX0dFVF9JTlVNQkVSKHNmcCwgWEZTX0RJUjJfU0ZfSU5VTUJFUlAoc2ZlcCkpOworCQlpOGNvdW50ICs9IGlubyA+IFhGU19ESVIyX01BWF9TSE9SVF9JTlVNOworCQlvZmZzZXQgPQorCQkJWEZTX0RJUjJfU0ZfR0VUX09GRlNFVChzZmVwKSArCisJCQlYRlNfRElSMl9EQVRBX0VOVFNJWkUoc2ZlcC0+bmFtZWxlbik7CisJfQorCUFTU0VSVChpOGNvdW50ID09IHNmcC0+aGRyLmk4Y291bnQpOworCUFTU0VSVChYRlNfQklHX0lOVU1TIHx8IGk4Y291bnQgPT0gMCk7CisJQVNTRVJUKChjaGFyICopc2ZlcCAtIChjaGFyICopc2ZwID09IGRwLT5pX2QuZGlfc2l6ZSk7CisJQVNTRVJUKG9mZnNldCArCisJICAgICAgIChzZnAtPmhkci5jb3VudCArIDIpICogKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2xlYWZfZW50cnlfdCkgKworCSAgICAgICAodWludClzaXplb2YoeGZzX2RpcjJfYmxvY2tfdGFpbF90KSA8PQorCSAgICAgICBkcC0+aV9tb3VudC0+bV9kaXJibGtzaXplKTsKK30KKyNlbmRpZgkvKiBERUJVRyAqLworCisvKgorICogQ3JlYXRlIGEgbmV3IChzaG9ydGZvcm0pIGRpcmVjdG9yeS4KKyAqLworaW50CQkJCQkvKiBlcnJvciwgYWx3YXlzIDAgKi8KK3hmc19kaXIyX3NmX2NyZWF0ZSgKKwl4ZnNfZGFfYXJnc190CSphcmdzLAkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworCXhmc19pbm9fdAlwaW5vKQkJLyogcGFyZW50IGlub2RlIG51bWJlciAqLworeworCXhmc19pbm9kZV90CSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwlpbnQJCWk4Y291bnQ7CS8qIHBhcmVudCBpbm9kZSBpcyBhbiA4LWJ5dGUgbnVtYmVyICovCisJeGZzX2RpcjJfc2ZfdAkqc2ZwOwkJLyogc2hvcnRmb3JtIHN0cnVjdHVyZSAqLworCWludAkJc2l6ZTsJCS8qIGRpcmVjdG9yeSBzaXplICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzX2koInNmX2NyZWF0ZSIsIGFyZ3MsIHBpbm8pOworCWRwID0gYXJncy0+ZHA7CisKKwlBU1NFUlQoZHAgIT0gTlVMTCk7CisJQVNTRVJUKGRwLT5pX2QuZGlfc2l6ZSA9PSAwKTsKKwkvKgorCSAqIElmIGl0J3MgY3VycmVudGx5IGEgemVyby1sZW5ndGggZXh0ZW50IGZpbGUsCisJICogY29udmVydCBpdCB0byBsb2NhbCBmb3JtYXQuCisJICovCisJaWYgKGRwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMpIHsKKwkJZHAtPmlfZGYuaWZfZmxhZ3MgJj0gflhGU19JRkVYVEVOVFM7CS8qIGp1c3QgaW4gY2FzZSAqLworCQlkcC0+aV9kLmRpX2Zvcm1hdCA9IFhGU19ESU5PREVfRk1UX0xPQ0FMOworCQl4ZnNfdHJhbnNfbG9nX2lub2RlKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0dfQ09SRSk7CisJCWRwLT5pX2RmLmlmX2ZsYWdzIHw9IFhGU19JRklOTElORTsKKwl9CisJQVNTRVJUKGRwLT5pX2RmLmlmX2ZsYWdzICYgWEZTX0lGSU5MSU5FKTsKKwlBU1NFUlQoZHAtPmlfZGYuaWZfYnl0ZXMgPT0gMCk7CisJaThjb3VudCA9IHBpbm8gPiBYRlNfRElSMl9NQVhfU0hPUlRfSU5VTTsKKwlzaXplID0gWEZTX0RJUjJfU0ZfSERSX1NJWkUoaThjb3VudCk7CisJLyoKKwkgKiBNYWtlIGEgYnVmZmVyIGZvciB0aGUgZGF0YS4KKwkgKi8KKwl4ZnNfaWRhdGFfcmVhbGxvYyhkcCwgc2l6ZSwgWEZTX0RBVEFfRk9SSyk7CisJLyoKKwkgKiBGaWxsIGluIHRoZSBoZWFkZXIsCisJICovCisJc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCXNmcC0+aGRyLmk4Y291bnQgPSBpOGNvdW50OworCS8qCisJICogTm93IGNhbiBwdXQgaW4gdGhlIGlub2RlIG51bWJlciwgc2luY2UgaThjb3VudCBpcyBzZXQuCisJICovCisJWEZTX0RJUjJfU0ZfUFVUX0lOVU1CRVIoc2ZwLCAmcGlubywgJnNmcC0+aGRyLnBhcmVudCk7CisJc2ZwLT5oZHIuY291bnQgPSAwOworCWRwLT5pX2QuZGlfc2l6ZSA9IHNpemU7CisJeGZzX2RpcjJfc2ZfY2hlY2soYXJncyk7CisJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19EREFUQSk7CisJcmV0dXJuIDA7Cit9CisKK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9zZl9nZXRkZW50cygKKwl4ZnNfaW5vZGVfdAkJKmRwLAkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCXVpb190CQkJKnVpbywJCS8qIGNhbGxlcidzIGJ1ZmZlciBjb250cm9sICovCisJaW50CQkJKmVvZnAsCQkvKiBlb2YgcmVhY2hlZD8gKG91dCkgKi8KKwl4ZnNfZGlyZW50X3QJCSpkYnAsCQkvKiBjYWxsZXIncyBidWZmZXIgKi8KKwl4ZnNfZGlyMl9wdXRfdAkJcHV0KQkJLyogYWJpJ3MgZm9ybWF0dGluZyBmdW5jdGlvbiAqLworeworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQkJaTsJCS8qIHNob3J0Zm9ybSBlbnRyeSBudW1iZXIgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc19kaXIyX2RhdGFwdHJfdAlvZmY7CQkvKiBjdXJyZW50IGVudHJ5J3Mgb2Zmc2V0ICovCisJeGZzX2RpcjJfcHV0X2FyZ3NfdAlwOwkJLyogYXJnIHBhY2thZ2UgZm9yIHB1dCBydG4gKi8KKwl4ZnNfZGlyMl9zZl9lbnRyeV90CSpzZmVwOwkJLyogc2hvcnRmb3JtIGRpcmVjdG9yeSBlbnRyeSAqLworCXhmc19kaXIyX3NmX3QJCSpzZnA7CQkvKiBzaG9ydGZvcm0gc3RydWN0dXJlICovCisJeGZzX29mZl90CQkJZGlyX29mZnNldDsKKworCW1wID0gZHAtPmlfbW91bnQ7CisKKwlBU1NFUlQoZHAtPmlfZGYuaWZfZmxhZ3MgJiBYRlNfSUZJTkxJTkUpOworCS8qCisJICogR2l2ZSB1cCBpZiB0aGUgZGlyZWN0b3J5IGlzIHdheSB0b28gc2hvcnQuCisJICovCisJaWYgKGRwLT5pX2QuZGlfc2l6ZSA8IG9mZnNldG9mKHhmc19kaXIyX3NmX2hkcl90LCBwYXJlbnQpKSB7CisJCUFTU0VSVChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSk7CisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwl9CisKKwlkaXJfb2Zmc2V0ID0gdWlvLT51aW9fb2Zmc2V0OworCisJQVNTRVJUKGRwLT5pX2RmLmlmX2J5dGVzID09IGRwLT5pX2QuZGlfc2l6ZSk7CisJQVNTRVJUKGRwLT5pX2RmLmlmX3UxLmlmX2RhdGEgIT0gTlVMTCk7CisKKwlzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisKKwlBU1NFUlQoZHAtPmlfZC5kaV9zaXplID49IFhGU19ESVIyX1NGX0hEUl9TSVpFKHNmcC0+aGRyLmk4Y291bnQpKTsKKworCS8qCisJICogSWYgdGhlIGJsb2NrIG51bWJlciBpbiB0aGUgb2Zmc2V0IGlzIG91dCBvZiByYW5nZSwgd2UncmUgZG9uZS4KKwkgKi8KKwlpZiAoWEZTX0RJUjJfREFUQVBUUl9UT19EQihtcCwgZGlyX29mZnNldCkgPiBtcC0+bV9kaXJkYXRhYmxrKSB7CisJCSplb2ZwID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBTZXQgdXAgcHV0YXJncyBzdHJ1Y3R1cmUuCisJICovCisJcC5kYnAgPSBkYnA7CisJcC5wdXQgPSBwdXQ7CisJcC51aW8gPSB1aW87CisJLyoKKwkgKiBQdXQgLiBlbnRyeSB1bmxlc3Mgd2UncmUgc3RhcnRpbmcgcGFzdCBpdC4KKwkgKi8KKwlpZiAoZGlyX29mZnNldCA8PQorCQkgICAgWEZTX0RJUjJfREJfT0ZGX1RPX0RBVEFQVFIobXAsIG1wLT5tX2RpcmRhdGFibGssCisJCQkJCSAgICAgICBYRlNfRElSMl9EQVRBX0RPVF9PRkZTRVQpKSB7CisJCXAuY29vayA9IFhGU19ESVIyX0RCX09GRl9UT19EQVRBUFRSKG1wLCAwLAorCQkJCQkJWEZTX0RJUjJfREFUQV9ET1RET1RfT0ZGU0VUKTsKKwkJcC5pbm8gPSBkcC0+aV9pbm87CisjaWYgWEZTX0JJR19JTlVNUworCQlwLmlubyArPSBtcC0+bV9pbm9hZGQ7CisjZW5kaWYKKwkJcC5uYW1lID0gIi4iOworCQlwLm5hbWVsZW4gPSAxOworCisJCWVycm9yID0gcC5wdXQoJnApOworCisJCWlmICghcC5kb25lKSB7CisJCQl1aW8tPnVpb19vZmZzZXQgPQorCQkJCVhGU19ESVIyX0RCX09GRl9UT19EQVRBUFRSKG1wLCBtcC0+bV9kaXJkYXRhYmxrLAorCQkJCQkJWEZTX0RJUjJfREFUQV9ET1RfT0ZGU0VUKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCX0KKworCS8qCisJICogUHV0IC4uIGVudHJ5IHVubGVzcyB3ZSdyZSBzdGFydGluZyBwYXN0IGl0LgorCSAqLworCWlmIChkaXJfb2Zmc2V0IDw9CisJCSAgICBYRlNfRElSMl9EQl9PRkZfVE9fREFUQVBUUihtcCwgbXAtPm1fZGlyZGF0YWJsaywKKwkJCQkJICAgICAgIFhGU19ESVIyX0RBVEFfRE9URE9UX09GRlNFVCkpIHsKKwkJcC5jb29rID0gWEZTX0RJUjJfREJfT0ZGX1RPX0RBVEFQVFIobXAsIG1wLT5tX2RpcmRhdGFibGssCisJCQkJCQlYRlNfRElSMl9EQVRBX0ZJUlNUX09GRlNFVCk7CisJCXAuaW5vID0gWEZTX0RJUjJfU0ZfR0VUX0lOVU1CRVIoc2ZwLCAmc2ZwLT5oZHIucGFyZW50KTsKKyNpZiBYRlNfQklHX0lOVU1TCisJCXAuaW5vICs9IG1wLT5tX2lub2FkZDsKKyNlbmRpZgorCQlwLm5hbWUgPSAiLi4iOworCQlwLm5hbWVsZW4gPSAyOworCisJCWVycm9yID0gcC5wdXQoJnApOworCisJCWlmICghcC5kb25lKSB7CisJCQl1aW8tPnVpb19vZmZzZXQgPQorCQkJCVhGU19ESVIyX0RCX09GRl9UT19EQVRBUFRSKG1wLCBtcC0+bV9kaXJkYXRhYmxrLAorCQkJCQlYRlNfRElSMl9EQVRBX0RPVERPVF9PRkZTRVQpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJfQorCisJLyoKKwkgKiBMb29wIHdoaWxlIHRoZXJlIGFyZSBtb3JlIGVudHJpZXMgYW5kIHB1dCdpbmcgd29ya3MuCisJICovCisJZm9yIChpID0gMCwgc2ZlcCA9IFhGU19ESVIyX1NGX0ZJUlNURU5UUlkoc2ZwKTsKKwkJICAgICBpIDwgc2ZwLT5oZHIuY291bnQ7CisJCQkgICAgIGkrKywgc2ZlcCA9IFhGU19ESVIyX1NGX05FWFRFTlRSWShzZnAsIHNmZXApKSB7CisKKwkJb2ZmID0gWEZTX0RJUjJfREJfT0ZGX1RPX0RBVEFQVFIobXAsIG1wLT5tX2RpcmRhdGFibGssCisJCQkJWEZTX0RJUjJfU0ZfR0VUX09GRlNFVChzZmVwKSk7CisKKwkJaWYgKGRpcl9vZmZzZXQgPiBvZmYpCisJCQljb250aW51ZTsKKworCQlwLm5hbWVsZW4gPSBzZmVwLT5uYW1lbGVuOworCisJCXAuY29vayA9IFhGU19ESVIyX0RCX09GRl9UT19EQVRBUFRSKG1wLCBtcC0+bV9kaXJkYXRhYmxrLAorCQkJWEZTX0RJUjJfU0ZfR0VUX09GRlNFVChzZmVwKSArCisJCQlYRlNfRElSMl9EQVRBX0VOVFNJWkUocC5uYW1lbGVuKSk7CisKKwkJcC5pbm8gPSBYRlNfRElSMl9TRl9HRVRfSU5VTUJFUihzZnAsIFhGU19ESVIyX1NGX0lOVU1CRVJQKHNmZXApKTsKKyNpZiBYRlNfQklHX0lOVU1TCisJCXAuaW5vICs9IG1wLT5tX2lub2FkZDsKKyNlbmRpZgorCQlwLm5hbWUgPSAoY2hhciAqKXNmZXAtPm5hbWU7CisKKwkJZXJyb3IgPSBwLnB1dCgmcCk7CisKKwkJaWYgKCFwLmRvbmUpIHsKKwkJCXVpby0+dWlvX29mZnNldCA9IG9mZjsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCX0KKworCS8qCisJICogVGhleSBhbGwgZml0LgorCSAqLworCSplb2ZwID0gMTsKKworCXVpby0+dWlvX29mZnNldCA9CisJCVhGU19ESVIyX0RCX09GRl9UT19EQVRBUFRSKG1wLCBtcC0+bV9kaXJkYXRhYmxrICsgMSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExvb2t1cCBhbiBlbnRyeSBpbiBhIHNob3J0Zm9ybSBkaXJlY3RvcnkuCisgKiBSZXR1cm5zIEVFWElTVCBpZiBmb3VuZCwgRU5PRU5UIGlmIG5vdCBmb3VuZC4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX3NmX2xvb2t1cCgKKwl4ZnNfZGFfYXJnc190CQkqYXJncykJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KK3sKKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWludAkJCWk7CQkvKiBlbnRyeSBpbmRleCAqLworCXhmc19kaXIyX3NmX2VudHJ5X3QJKnNmZXA7CQkvKiBzaG9ydGZvcm0gZGlyZWN0b3J5IGVudHJ5ICovCisJeGZzX2RpcjJfc2ZfdAkJKnNmcDsJCS8qIHNob3J0Zm9ybSBzdHJ1Y3R1cmUgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3MoInNmX2xvb2t1cCIsIGFyZ3MpOworCXhmc19kaXIyX3NmX2NoZWNrKGFyZ3MpOworCWRwID0gYXJncy0+ZHA7CisKKwlBU1NFUlQoZHAtPmlfZGYuaWZfZmxhZ3MgJiBYRlNfSUZJTkxJTkUpOworCS8qCisJICogQmFpbCBvdXQgaWYgdGhlIGRpcmVjdG9yeSBpcyB3YXkgdG9vIHNob3J0LgorCSAqLworCWlmIChkcC0+aV9kLmRpX3NpemUgPCBvZmZzZXRvZih4ZnNfZGlyMl9zZl9oZHJfdCwgcGFyZW50KSkgeworCQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihkcC0+aV9tb3VudCkpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCUFTU0VSVChkcC0+aV9kZi5pZl9ieXRlcyA9PSBkcC0+aV9kLmRpX3NpemUpOworCUFTU0VSVChkcC0+aV9kZi5pZl91MS5pZl9kYXRhICE9IE5VTEwpOworCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwlBU1NFUlQoZHAtPmlfZC5kaV9zaXplID49IFhGU19ESVIyX1NGX0hEUl9TSVpFKHNmcC0+aGRyLmk4Y291bnQpKTsKKwkvKgorCSAqIFNwZWNpYWwgY2FzZSBmb3IgLgorCSAqLworCWlmIChhcmdzLT5uYW1lbGVuID09IDEgJiYgYXJncy0+bmFtZVswXSA9PSAnLicpIHsKKwkJYXJncy0+aW51bWJlciA9IGRwLT5pX2lubzsKKwkJcmV0dXJuIFhGU19FUlJPUihFRVhJU1QpOworCX0KKwkvKgorCSAqIFNwZWNpYWwgY2FzZSBmb3IgLi4KKwkgKi8KKwlpZiAoYXJncy0+bmFtZWxlbiA9PSAyICYmCisJICAgIGFyZ3MtPm5hbWVbMF0gPT0gJy4nICYmIGFyZ3MtPm5hbWVbMV0gPT0gJy4nKSB7CisJCWFyZ3MtPmludW1iZXIgPSBYRlNfRElSMl9TRl9HRVRfSU5VTUJFUihzZnAsICZzZnAtPmhkci5wYXJlbnQpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVFWElTVCk7CisJfQorCS8qCisJICogTG9vcCBvdmVyIGFsbCB0aGUgZW50cmllcyB0cnlpbmcgdG8gbWF0Y2ggb3Vycy4KKwkgKi8KKwlmb3IgKGkgPSAwLCBzZmVwID0gWEZTX0RJUjJfU0ZfRklSU1RFTlRSWShzZnApOworCSAgICAgaSA8IHNmcC0+aGRyLmNvdW50OworCSAgICAgaSsrLCBzZmVwID0gWEZTX0RJUjJfU0ZfTkVYVEVOVFJZKHNmcCwgc2ZlcCkpIHsKKwkJaWYgKHNmZXAtPm5hbWVsZW4gPT0gYXJncy0+bmFtZWxlbiAmJgorCQkgICAgc2ZlcC0+bmFtZVswXSA9PSBhcmdzLT5uYW1lWzBdICYmCisJCSAgICBtZW1jbXAoYXJncy0+bmFtZSwgc2ZlcC0+bmFtZSwgYXJncy0+bmFtZWxlbikgPT0gMCkgeworCQkJYXJncy0+aW51bWJlciA9CisJCQkJWEZTX0RJUjJfU0ZfR0VUX0lOVU1CRVIoc2ZwLAorCQkJCQlYRlNfRElSMl9TRl9JTlVNQkVSUChzZmVwKSk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVFWElTVCk7CisJCX0KKwl9CisJLyoKKwkgKiBEaWRuJ3QgZmluZCBpdC4KKwkgKi8KKwlBU1NFUlQoYXJncy0+b2tub2VudCk7CisJcmV0dXJuIFhGU19FUlJPUihFTk9FTlQpOworfQorCisvKgorICogUmVtb3ZlIGFuIGVudHJ5IGZyb20gYSBzaG9ydGZvcm0gZGlyZWN0b3J5LgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfc2ZfcmVtb3ZlbmFtZSgKKwl4ZnNfZGFfYXJnc190CQkqYXJncykKK3sKKwlpbnQJCQlieXRlb2ZmOwkvKiBvZmZzZXQgb2YgcmVtb3ZlZCBlbnRyeSAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQkJZW50c2l6ZTsJLyogdGhpcyBlbnRyeSdzIHNpemUgKi8KKwlpbnQJCQlpOwkJLyogc2hvcnRmb3JtIGVudHJ5IGluZGV4ICovCisJaW50CQkJbmV3c2l6ZTsJLyogbmV3IGlub2RlIHNpemUgKi8KKwlpbnQJCQlvbGRzaXplOwkvKiBvbGQgaW5vZGUgc2l6ZSAqLworCXhmc19kaXIyX3NmX2VudHJ5X3QJKnNmZXA7CQkvKiBzaG9ydGZvcm0gZGlyZWN0b3J5IGVudHJ5ICovCisJeGZzX2RpcjJfc2ZfdAkJKnNmcDsJCS8qIHNob3J0Zm9ybSBzdHJ1Y3R1cmUgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3MoInNmX3JlbW92ZW5hbWUiLCBhcmdzKTsKKwlkcCA9IGFyZ3MtPmRwOworCisJQVNTRVJUKGRwLT5pX2RmLmlmX2ZsYWdzICYgWEZTX0lGSU5MSU5FKTsKKwlvbGRzaXplID0gKGludClkcC0+aV9kLmRpX3NpemU7CisJLyoKKwkgKiBCYWlsIG91dCBpZiB0aGUgZGlyZWN0b3J5IGlzIHdheSB0b28gc2hvcnQuCisJICovCisJaWYgKG9sZHNpemUgPCBvZmZzZXRvZih4ZnNfZGlyMl9zZl9oZHJfdCwgcGFyZW50KSkgeworCQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihkcC0+aV9tb3VudCkpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCUFTU0VSVChkcC0+aV9kZi5pZl9ieXRlcyA9PSBvbGRzaXplKTsKKwlBU1NFUlQoZHAtPmlfZGYuaWZfdTEuaWZfZGF0YSAhPSBOVUxMKTsKKwlzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJQVNTRVJUKG9sZHNpemUgPj0gWEZTX0RJUjJfU0ZfSERSX1NJWkUoc2ZwLT5oZHIuaThjb3VudCkpOworCS8qCisJICogTG9vcCBvdmVyIHRoZSBvbGQgZGlyZWN0b3J5IGVudHJpZXMuCisJICogRmluZCB0aGUgb25lIHdlJ3JlIGRlbGV0aW5nLgorCSAqLworCWZvciAoaSA9IDAsIHNmZXAgPSBYRlNfRElSMl9TRl9GSVJTVEVOVFJZKHNmcCk7CisJICAgICBpIDwgc2ZwLT5oZHIuY291bnQ7CisJICAgICBpKyssIHNmZXAgPSBYRlNfRElSMl9TRl9ORVhURU5UUlkoc2ZwLCBzZmVwKSkgeworCQlpZiAoc2ZlcC0+bmFtZWxlbiA9PSBhcmdzLT5uYW1lbGVuICYmCisJCSAgICBzZmVwLT5uYW1lWzBdID09IGFyZ3MtPm5hbWVbMF0gJiYKKwkJICAgIG1lbWNtcChzZmVwLT5uYW1lLCBhcmdzLT5uYW1lLCBhcmdzLT5uYW1lbGVuKSA9PSAwKSB7CisJCQlBU1NFUlQoWEZTX0RJUjJfU0ZfR0VUX0lOVU1CRVIoc2ZwLAorCQkJCQlYRlNfRElSMl9TRl9JTlVNQkVSUChzZmVwKSkgPT0KKwkJCQlhcmdzLT5pbnVtYmVyKTsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qCisJICogRGlkbid0IGZpbmQgaXQuCisJICovCisJaWYgKGkgPT0gc2ZwLT5oZHIuY291bnQpIHsKKwkJcmV0dXJuIFhGU19FUlJPUihFTk9FTlQpOworCX0KKwkvKgorCSAqIENhbGN1bGF0ZSBzaXplcy4KKwkgKi8KKwlieXRlb2ZmID0gKGludCkoKGNoYXIgKilzZmVwIC0gKGNoYXIgKilzZnApOworCWVudHNpemUgPSBYRlNfRElSMl9TRl9FTlRTSVpFX0JZTkFNRShzZnAsIGFyZ3MtPm5hbWVsZW4pOworCW5ld3NpemUgPSBvbGRzaXplIC0gZW50c2l6ZTsKKwkvKgorCSAqIENvcHkgdGhlIHBhcnQgaWYgYW55IGFmdGVyIHRoZSByZW1vdmVkIGVudHJ5LCBzbGlkaW5nIGl0IGRvd24uCisJICovCisJaWYgKGJ5dGVvZmYgKyBlbnRzaXplIDwgb2xkc2l6ZSkKKwkJbWVtbW92ZSgoY2hhciAqKXNmcCArIGJ5dGVvZmYsIChjaGFyICopc2ZwICsgYnl0ZW9mZiArIGVudHNpemUsCisJCQlvbGRzaXplIC0gKGJ5dGVvZmYgKyBlbnRzaXplKSk7CisJLyoKKwkgKiBGaXggdXAgdGhlIGhlYWRlciBhbmQgZmlsZSBzaXplLgorCSAqLworCXNmcC0+aGRyLmNvdW50LS07CisJZHAtPmlfZC5kaV9zaXplID0gbmV3c2l6ZTsKKwkvKgorCSAqIFJlYWxsb2NhdGUsIG1ha2luZyBpdCBzbWFsbGVyLgorCSAqLworCXhmc19pZGF0YV9yZWFsbG9jKGRwLCBuZXdzaXplIC0gb2xkc2l6ZSwgWEZTX0RBVEFfRk9SSyk7CisJc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworI2lmIFhGU19CSUdfSU5VTVMKKwkvKgorCSAqIEFyZSB3ZSBjaGFuZ2luZyBpbm9kZSBudW1iZXIgc2l6ZT8KKwkgKi8KKwlpZiAoYXJncy0+aW51bWJlciA+IFhGU19ESVIyX01BWF9TSE9SVF9JTlVNKSB7CisJCWlmIChzZnAtPmhkci5pOGNvdW50ID09IDEpCisJCQl4ZnNfZGlyMl9zZl90b2lubzQoYXJncyk7CisJCWVsc2UKKwkJCXNmcC0+aGRyLmk4Y291bnQtLTsKKwl9CisjZW5kaWYKKwl4ZnNfZGlyMl9zZl9jaGVjayhhcmdzKTsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0REQVRBKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlcGxhY2UgdGhlIGlub2RlIG51bWJlciBvZiBhbiBlbnRyeSBpbiBhIHNob3J0Zm9ybSBkaXJlY3RvcnkuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9zZl9yZXBsYWNlKAorCXhmc19kYV9hcmdzX3QJCSphcmdzKQkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworeworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQkJaTsJCS8qIGVudHJ5IGluZGV4ICovCisjaWYgWEZTX0JJR19JTlVNUyB8fCBkZWZpbmVkKERFQlVHKQorCXhmc19pbm9fdAkJaW5vPTA7CQkvKiBlbnRyeSBvbGQgaW5vZGUgbnVtYmVyICovCisjZW5kaWYKKyNpZiBYRlNfQklHX0lOVU1TCisJaW50CQkJaThlbGV2YXRlZDsJLyogc2ZfdG9pbm84IHNldCBpOGNvdW50PTEgKi8KKyNlbmRpZgorCXhmc19kaXIyX3NmX2VudHJ5X3QJKnNmZXA7CQkvKiBzaG9ydGZvcm0gZGlyZWN0b3J5IGVudHJ5ICovCisJeGZzX2RpcjJfc2ZfdAkJKnNmcDsJCS8qIHNob3J0Zm9ybSBzdHJ1Y3R1cmUgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3MoInNmX3JlcGxhY2UiLCBhcmdzKTsKKwlkcCA9IGFyZ3MtPmRwOworCisJQVNTRVJUKGRwLT5pX2RmLmlmX2ZsYWdzICYgWEZTX0lGSU5MSU5FKTsKKwkvKgorCSAqIEJhaWwgb3V0IGlmIHRoZSBzaG9ydGZvcm0gZGlyZWN0b3J5IGlzIHdheSB0b28gc21hbGwuCisJICovCisJaWYgKGRwLT5pX2QuZGlfc2l6ZSA8IG9mZnNldG9mKHhmc19kaXIyX3NmX2hkcl90LCBwYXJlbnQpKSB7CisJCUFTU0VSVChYRlNfRk9SQ0VEX1NIVVRET1dOKGRwLT5pX21vdW50KSk7CisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwl9CisJQVNTRVJUKGRwLT5pX2RmLmlmX2J5dGVzID09IGRwLT5pX2QuZGlfc2l6ZSk7CisJQVNTRVJUKGRwLT5pX2RmLmlmX3UxLmlmX2RhdGEgIT0gTlVMTCk7CisJc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCUFTU0VSVChkcC0+aV9kLmRpX3NpemUgPj0gWEZTX0RJUjJfU0ZfSERSX1NJWkUoc2ZwLT5oZHIuaThjb3VudCkpOworI2lmIFhGU19CSUdfSU5VTVMKKwkvKgorCSAqIE5ldyBpbm9kZSBudW1iZXIgaXMgbGFyZ2UsIGFuZCBuZWVkIHRvIGNvbnZlcnQgdG8gOC1ieXRlIGlub2Rlcy4KKwkgKi8KKwlpZiAoYXJncy0+aW51bWJlciA+IFhGU19ESVIyX01BWF9TSE9SVF9JTlVNICYmIHNmcC0+aGRyLmk4Y291bnQgPT0gMCkgeworCQlpbnQJZXJyb3I7CQkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJCWludAluZXdzaXplOwkJLyogbmV3IGlub2RlIHNpemUgKi8KKworCQluZXdzaXplID0KKwkJCWRwLT5pX2RmLmlmX2J5dGVzICsKKwkJCShzZnAtPmhkci5jb3VudCArIDEpICoKKwkJCSgodWludClzaXplb2YoeGZzX2RpcjJfaW5vOF90KSAtCisJCQkgKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzRfdCkpOworCQkvKgorCQkgKiBXb24ndCBmaXQgYXMgc2hvcnRmb3JtLCBjb252ZXJ0IHRvIGJsb2NrIHRoZW4gZG8gcmVwbGFjZS4KKwkJICovCisJCWlmIChuZXdzaXplID4gWEZTX0lGT1JLX0RTSVpFKGRwKSkgeworCQkJZXJyb3IgPSB4ZnNfZGlyMl9zZl90b19ibG9jayhhcmdzKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCXJldHVybiB4ZnNfZGlyMl9ibG9ja19yZXBsYWNlKGFyZ3MpOworCQl9CisJCS8qCisJCSAqIFN0aWxsIGZpdHMsIGNvbnZlcnQgdG8gOC1ieXRlIG5vdy4KKwkJICovCisJCXhmc19kaXIyX3NmX3RvaW5vOChhcmdzKTsKKwkJaThlbGV2YXRlZCA9IDE7CisJCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwl9IGVsc2UKKwkJaThlbGV2YXRlZCA9IDA7CisjZW5kaWYKKwlBU1NFUlQoYXJncy0+bmFtZWxlbiAhPSAxIHx8IGFyZ3MtPm5hbWVbMF0gIT0gJy4nKTsKKwkvKgorCSAqIFJlcGxhY2UgLi4ncyBlbnRyeS4KKwkgKi8KKwlpZiAoYXJncy0+bmFtZWxlbiA9PSAyICYmCisJICAgIGFyZ3MtPm5hbWVbMF0gPT0gJy4nICYmIGFyZ3MtPm5hbWVbMV0gPT0gJy4nKSB7CisjaWYgWEZTX0JJR19JTlVNUyB8fCBkZWZpbmVkKERFQlVHKQorCQlpbm8gPSBYRlNfRElSMl9TRl9HRVRfSU5VTUJFUihzZnAsICZzZnAtPmhkci5wYXJlbnQpOworCQlBU1NFUlQoYXJncy0+aW51bWJlciAhPSBpbm8pOworI2VuZGlmCisJCVhGU19ESVIyX1NGX1BVVF9JTlVNQkVSKHNmcCwgJmFyZ3MtPmludW1iZXIsICZzZnAtPmhkci5wYXJlbnQpOworCX0KKwkvKgorCSAqIE5vcm1hbCBlbnRyeSwgbG9vayBmb3IgdGhlIG5hbWUuCisJICovCisJZWxzZSB7CisJCWZvciAoaSA9IDAsIHNmZXAgPSBYRlNfRElSMl9TRl9GSVJTVEVOVFJZKHNmcCk7CisJCSAgICAgaSA8IHNmcC0+aGRyLmNvdW50OworCQkgICAgIGkrKywgc2ZlcCA9IFhGU19ESVIyX1NGX05FWFRFTlRSWShzZnAsIHNmZXApKSB7CisJCQlpZiAoc2ZlcC0+bmFtZWxlbiA9PSBhcmdzLT5uYW1lbGVuICYmCisJCQkgICAgc2ZlcC0+bmFtZVswXSA9PSBhcmdzLT5uYW1lWzBdICYmCisJCQkgICAgbWVtY21wKGFyZ3MtPm5hbWUsIHNmZXAtPm5hbWUsIGFyZ3MtPm5hbWVsZW4pID09IDApIHsKKyNpZiBYRlNfQklHX0lOVU1TIHx8IGRlZmluZWQoREVCVUcpCisJCQkJaW5vID0gWEZTX0RJUjJfU0ZfR0VUX0lOVU1CRVIoc2ZwLAorCQkJCQlYRlNfRElSMl9TRl9JTlVNQkVSUChzZmVwKSk7CisJCQkJQVNTRVJUKGFyZ3MtPmludW1iZXIgIT0gaW5vKTsKKyNlbmRpZgorCQkJCVhGU19ESVIyX1NGX1BVVF9JTlVNQkVSKHNmcCwgJmFyZ3MtPmludW1iZXIsCisJCQkJCVhGU19ESVIyX1NGX0lOVU1CRVJQKHNmZXApKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiBEaWRuJ3QgZmluZCBpdC4KKwkJICovCisJCWlmIChpID09IHNmcC0+aGRyLmNvdW50KSB7CisJCQlBU1NFUlQoYXJncy0+b2tub2VudCk7CisjaWYgWEZTX0JJR19JTlVNUworCQkJaWYgKGk4ZWxldmF0ZWQpCisJCQkJeGZzX2RpcjJfc2ZfdG9pbm80KGFyZ3MpOworI2VuZGlmCisJCQlyZXR1cm4gWEZTX0VSUk9SKEVOT0VOVCk7CisJCX0KKwl9CisjaWYgWEZTX0JJR19JTlVNUworCS8qCisJICogU2VlIGlmIHRoZSBvbGQgbnVtYmVyIHdhcyBsYXJnZSwgdGhlIG5ldyBudW1iZXIgaXMgc21hbGwuCisJICovCisJaWYgKGlubyA+IFhGU19ESVIyX01BWF9TSE9SVF9JTlVNICYmCisJICAgIGFyZ3MtPmludW1iZXIgPD0gWEZTX0RJUjJfTUFYX1NIT1JUX0lOVU0pIHsKKwkJLyoKKwkJICogQW5kIHRoZSBvbGQgY291bnQgd2FzIG9uZSwgc28gbmVlZCB0byBjb252ZXJ0IHRvIHNtYWxsLgorCQkgKi8KKwkJaWYgKHNmcC0+aGRyLmk4Y291bnQgPT0gMSkKKwkJCXhmc19kaXIyX3NmX3RvaW5vNChhcmdzKTsKKwkJZWxzZQorCQkJc2ZwLT5oZHIuaThjb3VudC0tOworCX0KKwkvKgorCSAqIFNlZSBpZiB0aGUgb2xkIG51bWJlciB3YXMgc21hbGwsIHRoZSBuZXcgbnVtYmVyIGlzIGxhcmdlLgorCSAqLworCWlmIChpbm8gPD0gWEZTX0RJUjJfTUFYX1NIT1JUX0lOVU0gJiYKKwkgICAgYXJncy0+aW51bWJlciA+IFhGU19ESVIyX01BWF9TSE9SVF9JTlVNKSB7CisJCS8qCisJCSAqIGFkZCB0byB0aGUgaThjb3VudCB1bmxlc3Mgd2UganVzdCBjb252ZXJ0ZWQgdG8gOC1ieXRlCisJCSAqIGlub2RlcyAod2hpY2ggZG9lcyBhbiBpbXBsaWVkIGk4Y291bnQgPSAxKQorCQkgKi8KKwkJQVNTRVJUKHNmcC0+aGRyLmk4Y291bnQgIT0gMCk7CisJCWlmICghaThlbGV2YXRlZCkKKwkJCXNmcC0+aGRyLmk4Y291bnQrKzsKKwl9CisjZW5kaWYKKwl4ZnNfZGlyMl9zZl9jaGVjayhhcmdzKTsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0dfRERBVEEpOworCXJldHVybiAwOworfQorCisjaWYgWEZTX0JJR19JTlVNUworLyoKKyAqIENvbnZlcnQgZnJvbSA4LWJ5dGUgaW5vZGUgbnVtYmVycyB0byA0LWJ5dGUgaW5vZGUgbnVtYmVycy4KKyAqIFRoZSBsYXN0IDgtYnl0ZSBpbm9kZSBudW1iZXIgaXMgZ29uZSwgYnV0IHRoZSBjb3VudCBpcyBzdGlsbCAxLgorICovCitzdGF0aWMgdm9pZAoreGZzX2RpcjJfc2ZfdG9pbm80KAorCXhmc19kYV9hcmdzX3QJCSphcmdzKQkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworeworCWNoYXIJCQkqYnVmOwkJLyogb2xkIGRpcidzIGJ1ZmZlciAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQkJaTsJCS8qIGVudHJ5IGluZGV4ICovCisJeGZzX2lub190CQlpbm87CQkvKiBlbnRyeSBpbm9kZSBudW1iZXIgKi8KKwlpbnQJCQluZXdzaXplOwkvKiBuZXcgaW5vZGUgc2l6ZSAqLworCXhmc19kaXIyX3NmX2VudHJ5X3QJKm9sZHNmZXA7CS8qIG9sZCBzZiBlbnRyeSAqLworCXhmc19kaXIyX3NmX3QJCSpvbGRzZnA7CS8qIG9sZCBzZiBkaXJlY3RvcnkgKi8KKwlpbnQJCQlvbGRzaXplOwkvKiBvbGQgaW5vZGUgc2l6ZSAqLworCXhmc19kaXIyX3NmX2VudHJ5X3QJKnNmZXA7CQkvKiBuZXcgc2YgZW50cnkgKi8KKwl4ZnNfZGlyMl9zZl90CQkqc2ZwOwkJLyogbmV3IHNmIGRpcmVjdG9yeSAqLworCisJeGZzX2RpcjJfdHJhY2VfYXJncygic2ZfdG9pbm80IiwgYXJncyk7CisJZHAgPSBhcmdzLT5kcDsKKworCS8qCisJICogQ29weSB0aGUgb2xkIGRpcmVjdG9yeSB0byB0aGUgYnVmZmVyLgorCSAqIFRoZW4gbnVrZSBpdCBmcm9tIHRoZSBpbm9kZSwgYW5kIGFkZCB0aGUgbmV3IGJ1ZmZlciB0byB0aGUgaW5vZGUuCisJICogRG9uJ3Qgd2FudCB4ZnNfaWRhdGFfcmVhbGxvYyBjb3B5aW5nIHRoZSBkYXRhIGhlcmUuCisJICovCisJb2xkc2l6ZSA9IGRwLT5pX2RmLmlmX2J5dGVzOworCWJ1ZiA9IGttZW1fYWxsb2Mob2xkc2l6ZSwgS01fU0xFRVApOworCW9sZHNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwlBU1NFUlQob2xkc2ZwLT5oZHIuaThjb3VudCA9PSAxKTsKKwltZW1jcHkoYnVmLCBvbGRzZnAsIG9sZHNpemUpOworCS8qCisJICogQ29tcHV0ZSB0aGUgbmV3IGlub2RlIHNpemUuCisJICovCisJbmV3c2l6ZSA9CisJCW9sZHNpemUgLQorCQkob2xkc2ZwLT5oZHIuY291bnQgKyAxKSAqCisJCSgodWludClzaXplb2YoeGZzX2RpcjJfaW5vOF90KSAtICh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm80X3QpKTsKKwl4ZnNfaWRhdGFfcmVhbGxvYyhkcCwgLW9sZHNpemUsIFhGU19EQVRBX0ZPUkspOworCXhmc19pZGF0YV9yZWFsbG9jKGRwLCBuZXdzaXplLCBYRlNfREFUQV9GT1JLKTsKKwkvKgorCSAqIFJlc2V0IG91ciBwb2ludGVycywgdGhlIGRhdGEgaGFzIG1vdmVkLgorCSAqLworCW9sZHNmcCA9ICh4ZnNfZGlyMl9zZl90ICopYnVmOworCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwkvKgorCSAqIEZpbGwgaW4gdGhlIG5ldyBoZWFkZXIuCisJICovCisJc2ZwLT5oZHIuY291bnQgPSBvbGRzZnAtPmhkci5jb3VudDsKKwlzZnAtPmhkci5pOGNvdW50ID0gMDsKKwlpbm8gPSBYRlNfRElSMl9TRl9HRVRfSU5VTUJFUihvbGRzZnAsICZvbGRzZnAtPmhkci5wYXJlbnQpOworCVhGU19ESVIyX1NGX1BVVF9JTlVNQkVSKHNmcCwgJmlubywgJnNmcC0+aGRyLnBhcmVudCk7CisJLyoKKwkgKiBDb3B5IHRoZSBlbnRyaWVzIGZpZWxkIGJ5IGZpZWxkLgorCSAqLworCWZvciAoaSA9IDAsIHNmZXAgPSBYRlNfRElSMl9TRl9GSVJTVEVOVFJZKHNmcCksCisJCSAgICBvbGRzZmVwID0gWEZTX0RJUjJfU0ZfRklSU1RFTlRSWShvbGRzZnApOworCSAgICAgaSA8IHNmcC0+aGRyLmNvdW50OworCSAgICAgaSsrLCBzZmVwID0gWEZTX0RJUjJfU0ZfTkVYVEVOVFJZKHNmcCwgc2ZlcCksCisJCSAgb2xkc2ZlcCA9IFhGU19ESVIyX1NGX05FWFRFTlRSWShvbGRzZnAsIG9sZHNmZXApKSB7CisJCXNmZXAtPm5hbWVsZW4gPSBvbGRzZmVwLT5uYW1lbGVuOworCQlzZmVwLT5vZmZzZXQgPSBvbGRzZmVwLT5vZmZzZXQ7CisJCW1lbWNweShzZmVwLT5uYW1lLCBvbGRzZmVwLT5uYW1lLCBzZmVwLT5uYW1lbGVuKTsKKwkJaW5vID0gWEZTX0RJUjJfU0ZfR0VUX0lOVU1CRVIob2xkc2ZwLAorCQkJWEZTX0RJUjJfU0ZfSU5VTUJFUlAob2xkc2ZlcCkpOworCQlYRlNfRElSMl9TRl9QVVRfSU5VTUJFUihzZnAsICZpbm8sIFhGU19ESVIyX1NGX0lOVU1CRVJQKHNmZXApKTsKKwl9CisJLyoKKwkgKiBDbGVhbiB1cCB0aGUgaW5vZGUuCisJICovCisJa21lbV9mcmVlKGJ1Ziwgb2xkc2l6ZSk7CisJZHAtPmlfZC5kaV9zaXplID0gbmV3c2l6ZTsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0REQVRBKTsKK30KKworLyoKKyAqIENvbnZlcnQgZnJvbSA0LWJ5dGUgaW5vZGUgbnVtYmVycyB0byA4LWJ5dGUgaW5vZGUgbnVtYmVycy4KKyAqIFRoZSBuZXcgOC1ieXRlIGlub2RlIG51bWJlciBpcyBub3QgdGhlcmUgeWV0LCB3ZSBsZWF2ZSB3aXRoIHRoZQorICogY291bnQgMSBidXQgbm8gY29ycmVzcG9uZGluZyBlbnRyeS4KKyAqLworc3RhdGljIHZvaWQKK3hmc19kaXIyX3NmX3RvaW5vOCgKKwl4ZnNfZGFfYXJnc190CQkqYXJncykJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KK3sKKwljaGFyCQkJKmJ1ZjsJCS8qIG9sZCBkaXIncyBidWZmZXIgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWludAkJCWk7CQkvKiBlbnRyeSBpbmRleCAqLworCXhmc19pbm9fdAkJaW5vOwkJLyogZW50cnkgaW5vZGUgbnVtYmVyICovCisJaW50CQkJbmV3c2l6ZTsJLyogbmV3IGlub2RlIHNpemUgKi8KKwl4ZnNfZGlyMl9zZl9lbnRyeV90CSpvbGRzZmVwOwkvKiBvbGQgc2YgZW50cnkgKi8KKwl4ZnNfZGlyMl9zZl90CQkqb2xkc2ZwOwkvKiBvbGQgc2YgZGlyZWN0b3J5ICovCisJaW50CQkJb2xkc2l6ZTsJLyogb2xkIGlub2RlIHNpemUgKi8KKwl4ZnNfZGlyMl9zZl9lbnRyeV90CSpzZmVwOwkJLyogbmV3IHNmIGVudHJ5ICovCisJeGZzX2RpcjJfc2ZfdAkJKnNmcDsJCS8qIG5ldyBzZiBkaXJlY3RvcnkgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3MoInNmX3RvaW5vOCIsIGFyZ3MpOworCWRwID0gYXJncy0+ZHA7CisKKwkvKgorCSAqIENvcHkgdGhlIG9sZCBkaXJlY3RvcnkgdG8gdGhlIGJ1ZmZlci4KKwkgKiBUaGVuIG51a2UgaXQgZnJvbSB0aGUgaW5vZGUsIGFuZCBhZGQgdGhlIG5ldyBidWZmZXIgdG8gdGhlIGlub2RlLgorCSAqIERvbid0IHdhbnQgeGZzX2lkYXRhX3JlYWxsb2MgY29weWluZyB0aGUgZGF0YSBoZXJlLgorCSAqLworCW9sZHNpemUgPSBkcC0+aV9kZi5pZl9ieXRlczsKKwlidWYgPSBrbWVtX2FsbG9jKG9sZHNpemUsIEtNX1NMRUVQKTsKKwlvbGRzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJQVNTRVJUKG9sZHNmcC0+aGRyLmk4Y291bnQgPT0gMCk7CisJbWVtY3B5KGJ1Ziwgb2xkc2ZwLCBvbGRzaXplKTsKKwkvKgorCSAqIENvbXB1dGUgdGhlIG5ldyBpbm9kZSBzaXplLgorCSAqLworCW5ld3NpemUgPQorCQlvbGRzaXplICsKKwkJKG9sZHNmcC0+aGRyLmNvdW50ICsgMSkgKgorCQkoKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzhfdCkgLSAodWludClzaXplb2YoeGZzX2RpcjJfaW5vNF90KSk7CisJeGZzX2lkYXRhX3JlYWxsb2MoZHAsIC1vbGRzaXplLCBYRlNfREFUQV9GT1JLKTsKKwl4ZnNfaWRhdGFfcmVhbGxvYyhkcCwgbmV3c2l6ZSwgWEZTX0RBVEFfRk9SSyk7CisJLyoKKwkgKiBSZXNldCBvdXIgcG9pbnRlcnMsIHRoZSBkYXRhIGhhcyBtb3ZlZC4KKwkgKi8KKwlvbGRzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWJ1ZjsKKwlzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJLyoKKwkgKiBGaWxsIGluIHRoZSBuZXcgaGVhZGVyLgorCSAqLworCXNmcC0+aGRyLmNvdW50ID0gb2xkc2ZwLT5oZHIuY291bnQ7CisJc2ZwLT5oZHIuaThjb3VudCA9IDE7CisJaW5vID0gWEZTX0RJUjJfU0ZfR0VUX0lOVU1CRVIob2xkc2ZwLCAmb2xkc2ZwLT5oZHIucGFyZW50KTsKKwlYRlNfRElSMl9TRl9QVVRfSU5VTUJFUihzZnAsICZpbm8sICZzZnAtPmhkci5wYXJlbnQpOworCS8qCisJICogQ29weSB0aGUgZW50cmllcyBmaWVsZCBieSBmaWVsZC4KKwkgKi8KKwlmb3IgKGkgPSAwLCBzZmVwID0gWEZTX0RJUjJfU0ZfRklSU1RFTlRSWShzZnApLAorCQkgICAgb2xkc2ZlcCA9IFhGU19ESVIyX1NGX0ZJUlNURU5UUlkob2xkc2ZwKTsKKwkgICAgIGkgPCBzZnAtPmhkci5jb3VudDsKKwkgICAgIGkrKywgc2ZlcCA9IFhGU19ESVIyX1NGX05FWFRFTlRSWShzZnAsIHNmZXApLAorCQkgIG9sZHNmZXAgPSBYRlNfRElSMl9TRl9ORVhURU5UUlkob2xkc2ZwLCBvbGRzZmVwKSkgeworCQlzZmVwLT5uYW1lbGVuID0gb2xkc2ZlcC0+bmFtZWxlbjsKKwkJc2ZlcC0+b2Zmc2V0ID0gb2xkc2ZlcC0+b2Zmc2V0OworCQltZW1jcHkoc2ZlcC0+bmFtZSwgb2xkc2ZlcC0+bmFtZSwgc2ZlcC0+bmFtZWxlbik7CisJCWlubyA9IFhGU19ESVIyX1NGX0dFVF9JTlVNQkVSKG9sZHNmcCwKKwkJCVhGU19ESVIyX1NGX0lOVU1CRVJQKG9sZHNmZXApKTsKKwkJWEZTX0RJUjJfU0ZfUFVUX0lOVU1CRVIoc2ZwLCAmaW5vLCBYRlNfRElSMl9TRl9JTlVNQkVSUChzZmVwKSk7CisJfQorCS8qCisJICogQ2xlYW4gdXAgdGhlIGlub2RlLgorCSAqLworCWttZW1fZnJlZShidWYsIG9sZHNpemUpOworCWRwLT5pX2QuZGlfc2l6ZSA9IG5ld3NpemU7CisJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19EREFUQSk7Cit9CisjZW5kaWYJLyogWEZTX0JJR19JTlVNUyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX3NmLmggYi9mcy94ZnMveGZzX2RpcjJfc2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWM2ZjVhCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19kaXIyX3NmLmgKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0RJUjJfU0ZfSF9fCisjZGVmaW5lCV9fWEZTX0RJUjJfU0ZfSF9fCisKKy8qCisgKiBEaXJlY3RvcnkgbGF5b3V0IHdoZW4gc3RvcmVkIGludGVybmFsIHRvIGFuIGlub2RlLgorICoKKyAqIFNtYWxsIGRpcmVjdG9yaWVzIGFyZSBwYWNrZWQgYXMgdGlnaHRseSBhcyBwb3NzaWJsZSBzbyBhcyB0bworICogZml0IGludG8gdGhlIGxpdGVyYWwgYXJlYSBvZiB0aGUgaW5vZGUuCisgKi8KKworc3RydWN0IHVpbzsKK3N0cnVjdCB4ZnNfZGFidWY7CitzdHJ1Y3QgeGZzX2RhX2FyZ3M7CitzdHJ1Y3QgeGZzX2RpcjJfYmxvY2s7CitzdHJ1Y3QgeGZzX2lub2RlOworc3RydWN0IHhmc19tb3VudDsKK3N0cnVjdCB4ZnNfdHJhbnM7CisKKy8qCisgKiBNYXhpbXVtIHNpemUgb2YgYSBzaG9ydGZvcm0gZGlyZWN0b3J5LgorICovCisjZGVmaW5lCVhGU19ESVIyX1NGX01BWF9TSVpFCVwKKwkoWEZTX0RJTk9ERV9NQVhfU0laRSAtICh1aW50KXNpemVvZih4ZnNfZGlub2RlX2NvcmVfdCkgLSBcCisJICh1aW50KXNpemVvZih4ZnNfYWdpbm9fdCkpCisKKy8qCisgKiBJbm9kZSBudW1iZXIgc3RvcmVkIGFzIDggOC1iaXQgdmFsdWVzLgorICovCit0eXBlZGVmCXN0cnVjdCB7IF9fdWludDhfdCBpWzhdOyB9IHhmc19kaXIyX2lubzhfdDsKKworLyoKKyAqIElub2RlIG51bWJlciBzdG9yZWQgYXMgNCA4LWJpdCB2YWx1ZXMuCisgKiBXb3JrcyBhIGxvdCBvZiB0aGUgdGltZSwgd2hlbiBhbGwgdGhlIGlub2RlIG51bWJlcnMgaW4gYSBkaXJlY3RvcnkKKyAqIGZpdCBpbiAzMiBiaXRzLgorICovCit0eXBlZGVmIHN0cnVjdCB7IF9fdWludDhfdCBpWzRdOyB9IHhmc19kaXIyX2lubzRfdDsKKwordHlwZWRlZiB1bmlvbiB7CisJeGZzX2RpcjJfaW5vOF90CWk4OworCXhmc19kaXIyX2lubzRfdAlpNDsKK30geGZzX2RpcjJfaW5vdV90OworI2RlZmluZQlYRlNfRElSMl9NQVhfU0hPUlRfSU5VTQkoKHhmc19pbm9fdCkweGZmZmZmZmZmVUxMKQorCisvKgorICogTm9ybWFsaXplZCBvZmZzZXQgKGluIGEgZGF0YSBibG9jaykgb2YgdGhlIGVudHJ5LCByZWFsbHkgeGZzX2RpcjJfZGF0YV9vZmZfdC4KKyAqIE9ubHkgbmVlZCAxNiBiaXRzLCB0aGlzIGlzIHRoZSBieXRlIG9mZnNldCBpbnRvIHRoZSBzaW5nbGUgYmxvY2sgZm9ybS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeyBfX3VpbnQ4X3QgaVsyXTsgfSB4ZnNfZGlyMl9zZl9vZmZfdDsKKworLyoKKyAqIFRoZSBwYXJlbnQgZGlyZWN0b3J5IGhhcyBhIGRlZGljYXRlZCBmaWVsZCwgYW5kIHRoZSBzZWxmLXBvaW50ZXIgbXVzdAorICogYmUgY2FsY3VsYXRlZCBvbiB0aGUgZmx5LgorICoKKyAqIEVudHJpZXMgYXJlIHBhY2tlZCB0b3dhcmQgdGhlIHRvcCBhcyB0aWdodGx5IGFzIHBvc3NpYmxlLiAgVGhlIGhlYWRlcgorICogYW5kIHRoZSBlbGVtZW50cyBtdXN0IGJlIG1lbWNweSdkIG91dCBpbnRvIGEgd29yayBhcmVhIHRvIGdldCBjb3JyZWN0CisgKiBhbGlnbm1lbnQgZm9yIHRoZSBpbm9kZSBudW1iZXIgZmllbGRzLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9zZl9oZHIgeworCV9fdWludDhfdAkJY291bnQ7CQkvKiBjb3VudCBvZiBlbnRyaWVzICovCisJX191aW50OF90CQlpOGNvdW50OwkvKiBjb3VudCBvZiA4LWJ5dGUgaW5vZGUgI3MgKi8KKwl4ZnNfZGlyMl9pbm91X3QJCXBhcmVudDsJCS8qIHBhcmVudCBkaXIgaW5vZGUgbnVtYmVyICovCit9IHhmc19kaXIyX3NmX2hkcl90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9zZl9lbnRyeSB7CisJX191aW50OF90CQluYW1lbGVuOwkvKiBhY3R1YWwgbmFtZSBsZW5ndGggKi8KKwl4ZnNfZGlyMl9zZl9vZmZfdAlvZmZzZXQ7CQkvKiBzYXZlZCBvZmZzZXQgKi8KKwlfX3VpbnQ4X3QJCW5hbWVbMV07CS8qIG5hbWUsIHZhcmlhYmxlIHNpemUgKi8KKwl4ZnNfZGlyMl9pbm91X3QJCWludW1iZXI7CS8qIGlub2RlIG51bWJlciwgdmFyLiBvZmZzZXQgKi8KK30geGZzX2RpcjJfc2ZfZW50cnlfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfc2YgeworCXhmc19kaXIyX3NmX2hkcl90CWhkcjsJCS8qIHNob3J0Zm9ybSBoZWFkZXIgKi8KKwl4ZnNfZGlyMl9zZl9lbnRyeV90CWxpc3RbMV07CS8qIHNob3J0Zm9ybSBlbnRyaWVzICovCit9IHhmc19kaXIyX3NmX3Q7CisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfU0ZfSERSX1NJWkUpCitpbnQgeGZzX2RpcjJfc2ZfaGRyX3NpemUoaW50IGk4Y291bnQpOworI2RlZmluZQlYRlNfRElSMl9TRl9IRFJfU0laRShpOGNvdW50KQl4ZnNfZGlyMl9zZl9oZHJfc2l6ZShpOGNvdW50KQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfU0ZfSERSX1NJWkUoaThjb3VudCkJXAorCSgodWludClzaXplb2YoeGZzX2RpcjJfc2ZfaGRyX3QpIC0gXAorCSAoKGk4Y291bnQpID09IDApICogXAorCSAoKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzhfdCkgLSAodWludClzaXplb2YoeGZzX2RpcjJfaW5vNF90KSkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9TRl9JTlVNQkVSUCkKK3hmc19kaXIyX2lub3VfdCAqeGZzX2RpcjJfc2ZfaW51bWJlcnAoeGZzX2RpcjJfc2ZfZW50cnlfdCAqc2ZlcCk7CisjZGVmaW5lCVhGU19ESVIyX1NGX0lOVU1CRVJQKHNmZXApCXhmc19kaXIyX3NmX2ludW1iZXJwKHNmZXApCisjZWxzZQorI2RlZmluZQlYRlNfRElSMl9TRl9JTlVNQkVSUChzZmVwKQlcCisJKCh4ZnNfZGlyMl9pbm91X3QgKikmKHNmZXApLT5uYW1lWyhzZmVwKS0+bmFtZWxlbl0pCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9TRl9HRVRfSU5VTUJFUikKK3hmc19pbnRpbm9fdCB4ZnNfZGlyMl9zZl9nZXRfaW51bWJlcih4ZnNfZGlyMl9zZl90ICpzZnAsIHhmc19kaXIyX2lub3VfdCAqZnJvbSk7CisjZGVmaW5lCVhGU19ESVIyX1NGX0dFVF9JTlVNQkVSKHNmcCwgZnJvbSkJXAorCXhmc19kaXIyX3NmX2dldF9pbnVtYmVyKHNmcCwgZnJvbSkKKworI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfU0ZfR0VUX0lOVU1CRVIoc2ZwLCBmcm9tKQlcCisJKChzZnApLT5oZHIuaThjb3VudCA9PSAwID8gXAorCQkoeGZzX2ludGlub190KVhGU19HRVRfRElSX0lOTzQoKGZyb20pLT5pNCkgOiBcCisJCSh4ZnNfaW50aW5vX3QpWEZTX0dFVF9ESVJfSU5POCgoZnJvbSktPmk4KSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX1NGX1BVVF9JTlVNQkVSKQordm9pZCB4ZnNfZGlyMl9zZl9wdXRfaW51bWJlcih4ZnNfZGlyMl9zZl90ICpzZnAsIHhmc19pbm9fdCAqZnJvbSwKKwkJCQkgICAgIHhmc19kaXIyX2lub3VfdCAqdG8pOworI2RlZmluZQlYRlNfRElSMl9TRl9QVVRfSU5VTUJFUihzZnAsZnJvbSx0bykJXAorCXhmc19kaXIyX3NmX3B1dF9pbnVtYmVyKHNmcCxmcm9tLHRvKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfU0ZfUFVUX0lOVU1CRVIoc2ZwLGZyb20sdG8pCVwKKwlpZiAoKHNmcCktPmhkci5pOGNvdW50ID09IDApIHsgXAorCQlYRlNfUFVUX0RJUl9JTk80KCooZnJvbSksICh0byktPmk0KTsgXAorCX0gZWxzZSB7IFwKKwkJWEZTX1BVVF9ESVJfSU5POCgqKGZyb20pLCAodG8pLT5pOCk7IFwKKwl9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9TRl9HRVRfT0ZGU0VUKQoreGZzX2RpcjJfZGF0YV9hb2ZmX3QgeGZzX2RpcjJfc2ZfZ2V0X29mZnNldCh4ZnNfZGlyMl9zZl9lbnRyeV90ICpzZmVwKTsKKyNkZWZpbmUJWEZTX0RJUjJfU0ZfR0VUX09GRlNFVChzZmVwKQlcCisJeGZzX2RpcjJfc2ZfZ2V0X29mZnNldChzZmVwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfU0ZfR0VUX09GRlNFVChzZmVwKQlcCisJSU5UX0dFVF9VTkFMSUdORURfMTZfQkUoJihzZmVwKS0+b2Zmc2V0LmkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9TRl9QVVRfT0ZGU0VUKQordm9pZCB4ZnNfZGlyMl9zZl9wdXRfb2Zmc2V0KHhmc19kaXIyX3NmX2VudHJ5X3QgKnNmZXAsCisJCQkJICAgIHhmc19kaXIyX2RhdGFfYW9mZl90IG9mZik7CisjZGVmaW5lCVhGU19ESVIyX1NGX1BVVF9PRkZTRVQoc2ZlcCxvZmYpIFwKKwl4ZnNfZGlyMl9zZl9wdXRfb2Zmc2V0KHNmZXAsb2ZmKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfU0ZfUFVUX09GRlNFVChzZmVwLG9mZikJXAorCUlOVF9TRVRfVU5BTElHTkVEXzE2X0JFKCYoc2ZlcCktPm9mZnNldC5pLG9mZikKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX1NGX0VOVFNJWkVfQllOQU1FKQoraW50IHhmc19kaXIyX3NmX2VudHNpemVfYnluYW1lKHhmc19kaXIyX3NmX3QgKnNmcCwgaW50IGxlbik7CisjZGVmaW5lIFhGU19ESVIyX1NGX0VOVFNJWkVfQllOQU1FKHNmcCxsZW4pCVwKKwl4ZnNfZGlyMl9zZl9lbnRzaXplX2J5bmFtZShzZnAsbGVuKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0RJUjJfU0ZfRU5UU0laRV9CWU5BTUUoc2ZwLGxlbikJLyogc3BhY2UgYSBuYW1lIHVzZXMgKi8gXAorCSgodWludClzaXplb2YoeGZzX2RpcjJfc2ZfZW50cnlfdCkgLSAxICsgKGxlbikgLSBcCisJICgoc2ZwKS0+aGRyLmk4Y291bnQgPT0gMCkgKiBcCisJICgodWludClzaXplb2YoeGZzX2RpcjJfaW5vOF90KSAtICh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm80X3QpKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX1NGX0VOVFNJWkVfQllFTlRSWSkKK2ludCB4ZnNfZGlyMl9zZl9lbnRzaXplX2J5ZW50cnkoeGZzX2RpcjJfc2ZfdCAqc2ZwLCB4ZnNfZGlyMl9zZl9lbnRyeV90ICpzZmVwKTsKKyNkZWZpbmUgWEZTX0RJUjJfU0ZfRU5UU0laRV9CWUVOVFJZKHNmcCxzZmVwKQlcCisJeGZzX2RpcjJfc2ZfZW50c2l6ZV9ieWVudHJ5KHNmcCxzZmVwKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0RJUjJfU0ZfRU5UU0laRV9CWUVOVFJZKHNmcCxzZmVwKQkvKiBzcGFjZSBhbiBlbnRyeSB1c2VzICovIFwKKwkoKHVpbnQpc2l6ZW9mKHhmc19kaXIyX3NmX2VudHJ5X3QpIC0gMSArIChzZmVwKS0+bmFtZWxlbiAtIFwKKwkgKChzZnApLT5oZHIuaThjb3VudCA9PSAwKSAqIFwKKwkgKCh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm84X3QpIC0gKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzRfdCkpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfU0ZfRklSU1RFTlRSWSkKK3hmc19kaXIyX3NmX2VudHJ5X3QgKnhmc19kaXIyX3NmX2ZpcnN0ZW50cnkoeGZzX2RpcjJfc2ZfdCAqc2ZwKTsKKyNkZWZpbmUgWEZTX0RJUjJfU0ZfRklSU1RFTlRSWShzZnApCXhmc19kaXIyX3NmX2ZpcnN0ZW50cnkoc2ZwKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0RJUjJfU0ZfRklSU1RFTlRSWShzZnApCS8qIGZpcnN0IGVudHJ5IGluIHN0cnVjdCAqLyBcCisJKCh4ZnNfZGlyMl9zZl9lbnRyeV90ICopIFwKKwkgKChjaGFyICopKHNmcCkgKyBYRlNfRElSMl9TRl9IRFJfU0laRShzZnAtPmhkci5pOGNvdW50KSkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9TRl9ORVhURU5UUlkpCit4ZnNfZGlyMl9zZl9lbnRyeV90ICp4ZnNfZGlyMl9zZl9uZXh0ZW50cnkoeGZzX2RpcjJfc2ZfdCAqc2ZwLAorCQkJCQkgICB4ZnNfZGlyMl9zZl9lbnRyeV90ICpzZmVwKTsKKyNkZWZpbmUgWEZTX0RJUjJfU0ZfTkVYVEVOVFJZKHNmcCxzZmVwKQkJeGZzX2RpcjJfc2ZfbmV4dGVudHJ5KHNmcCxzZmVwKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0RJUjJfU0ZfTkVYVEVOVFJZKHNmcCxzZmVwKQkJLyogbmV4dCBlbnRyeSBpbiBzdHJ1Y3QgKi8gXAorCSgoeGZzX2RpcjJfc2ZfZW50cnlfdCAqKSBcCisJCSgoY2hhciAqKShzZmVwKSArIFhGU19ESVIyX1NGX0VOVFNJWkVfQllFTlRSWShzZnAsc2ZlcCkpKQorI2VuZGlmCisKKy8qCisgKiBGdW5jdGlvbnMuCisgKi8KKworZXh0ZXJuIGludAorCXhmc19kaXIyX2Jsb2NrX3Nmc2l6ZShzdHJ1Y3QgeGZzX2lub2RlICpkcCwKKwkJCSAgICAgIHN0cnVjdCB4ZnNfZGlyMl9ibG9jayAqYmxvY2ssCisJCQkgICAgICB4ZnNfZGlyMl9zZl9oZHJfdCAqc2ZocCk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9ibG9ja190b19zZihzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIHN0cnVjdCB4ZnNfZGFidWYgKmJwLAorCQkJICAgICBpbnQgc2l6ZSwgeGZzX2RpcjJfc2ZfaGRyX3QgKnNmaHApOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfc2ZfYWRkbmFtZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfc2ZfY3JlYXRlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgeGZzX2lub190IHBpbm8pOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfc2ZfZ2V0ZGVudHMoc3RydWN0IHhmc19pbm9kZSAqZHAsIHN0cnVjdCB1aW8gKnVpbywgaW50ICplb2ZwLAorCQkJICAgICBzdHJ1Y3QgeGZzX2RpcmVudCAqZGJwLCB4ZnNfZGlyMl9wdXRfdCBwdXQpOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfc2ZfbG9va3VwKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9zZl9yZW1vdmVuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9zZl9yZXBsYWNlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CisKKyNlbmRpZgkvKiBfX1hGU19ESVIyX1NGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX3RyYWNlLmMgYi9mcy94ZnMveGZzX2RpcjJfdHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDY0MTczCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19kaXIyX3RyYWNlLmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKy8qCisgKiB4ZnNfZGlyMl90cmFjZS5jCisgKiBUcmFjaW5nIGZvciB4ZnMgdjIgZGlyZWN0b3JpZXMuCisgKi8KKyNpbmNsdWRlICJ4ZnMuaCIKKworI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl90cmFjZS5oIgorCisjaWZkZWYgWEZTX0RJUjJfVFJBQ0UKK2t0cmFjZV90CSp4ZnNfZGlyMl90cmFjZV9idWY7CisKKy8qCisgKiBFbnRlciBzb21ldGhpbmcgaW4gdGhlIHRyYWNlIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkCit4ZnNfZGlyMl90cmFjZV9lbnRlcigKKwl4ZnNfaW5vZGVfdAkqZHAsCisJaW50CQl0eXBlLAorCWNoYXIJCSp3aGVyZSwKKwljaGFyCQkqbmFtZSwKKwlpbnQJCW5hbWVsZW4sCisJdm9pZAkJKmEwLAorCXZvaWQJCSphMSwKKwl2b2lkCQkqYTIsCisJdm9pZAkJKmEzLAorCXZvaWQJCSphNCwKKwl2b2lkCQkqYTUsCisJdm9pZAkJKmE2LAorCXZvaWQJCSphNykKK3sKKwl2b2lkCQkqbls1XTsKKworCUFTU0VSVCh4ZnNfZGlyMl90cmFjZV9idWYpOworCUFTU0VSVChkcC0+aV9kaXJfdHJhY2UpOworCWlmIChuYW1lKQorCQltZW1jcHkobiwgbmFtZSwgbWluKChpbnQpc2l6ZW9mKG4pLCBuYW1lbGVuKSk7CisJZWxzZQorCQltZW1zZXQoKGNoYXIgKiluLCAwLCBzaXplb2YobikpOworCWt0cmFjZV9lbnRlcih4ZnNfZGlyMl90cmFjZV9idWYsCisJCSh2b2lkICopKGxvbmcpdHlwZSwgKHZvaWQgKil3aGVyZSwKKwkJKHZvaWQgKilhMCwgKHZvaWQgKilhMSwgKHZvaWQgKilhMiwgKHZvaWQgKilhMywKKwkJKHZvaWQgKilhNCwgKHZvaWQgKilhNSwgKHZvaWQgKilhNiwgKHZvaWQgKilhNywKKwkJKHZvaWQgKikobG9uZyluYW1lbGVuLAorCQkodm9pZCAqKW5bMF0sICh2b2lkICopblsxXSwgKHZvaWQgKiluWzJdLAorCQkodm9pZCAqKW5bM10sICh2b2lkICopbls0XSk7CisJa3RyYWNlX2VudGVyKGRwLT5pX2Rpcl90cmFjZSwKKwkJKHZvaWQgKikobG9uZyl0eXBlLCAodm9pZCAqKXdoZXJlLAorCQkodm9pZCAqKWEwLCAodm9pZCAqKWExLCAodm9pZCAqKWEyLCAodm9pZCAqKWEzLAorCQkodm9pZCAqKWE0LCAodm9pZCAqKWE1LCAodm9pZCAqKWE2LCAodm9pZCAqKWE3LAorCQkodm9pZCAqKShsb25nKW5hbWVsZW4sCisJCSh2b2lkICopblswXSwgKHZvaWQgKiluWzFdLCAodm9pZCAqKW5bMl0sCisJCSh2b2lkICopblszXSwgKHZvaWQgKiluWzRdKTsKK30KKwordm9pZAoreGZzX2RpcjJfdHJhY2VfYXJncygKKwljaGFyCQkqd2hlcmUsCisJeGZzX2RhX2FyZ3NfdAkqYXJncykKK3sKKwl4ZnNfZGlyMl90cmFjZV9lbnRlcihhcmdzLT5kcCwgWEZTX0RJUjJfS1RSQUNFX0FSR1MsIHdoZXJlLAorCQkoY2hhciAqKWFyZ3MtPm5hbWUsIChpbnQpYXJncy0+bmFtZWxlbiwKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZylhcmdzLT5oYXNodmFsLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoYXJncy0+aW51bWJlciA+PiAzMikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoYXJncy0+aW51bWJlciAmIDB4RkZGRkZGRkYpKSwKKwkJKHZvaWQgKilhcmdzLT5kcCwgKHZvaWQgKilhcmdzLT50cmFucywKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZylhcmdzLT5qdXN0Y2hlY2ssIE5VTEwsIE5VTEwpOworfQorCit2b2lkCit4ZnNfZGlyMl90cmFjZV9hcmdzX2IoCisJY2hhcgkJKndoZXJlLAorCXhmc19kYV9hcmdzX3QJKmFyZ3MsCisJeGZzX2RhYnVmX3QJKmJwKQoreworCXhmc19kaXIyX3RyYWNlX2VudGVyKGFyZ3MtPmRwLCBYRlNfRElSMl9LVFJBQ0VfQVJHU19CLCB3aGVyZSwKKwkJKGNoYXIgKilhcmdzLT5uYW1lLCAoaW50KWFyZ3MtPm5hbWVsZW4sCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpYXJncy0+aGFzaHZhbCwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGFyZ3MtPmludW1iZXIgPj4gMzIpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGFyZ3MtPmludW1iZXIgJiAweEZGRkZGRkZGKSksCisJCSh2b2lkICopYXJncy0+ZHAsICh2b2lkICopYXJncy0+dHJhbnMsCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpYXJncy0+anVzdGNoZWNrLAorCQkodm9pZCAqKShicCA/IGJwLT5icHNbMF0gOiBOVUxMKSwgTlVMTCk7Cit9CisKK3ZvaWQKK3hmc19kaXIyX3RyYWNlX2FyZ3NfYmIoCisJY2hhcgkJKndoZXJlLAorCXhmc19kYV9hcmdzX3QJKmFyZ3MsCisJeGZzX2RhYnVmX3QJKmxicCwKKwl4ZnNfZGFidWZfdAkqZGJwKQoreworCXhmc19kaXIyX3RyYWNlX2VudGVyKGFyZ3MtPmRwLCBYRlNfRElSMl9LVFJBQ0VfQVJHU19CQiwgd2hlcmUsCisJCShjaGFyICopYXJncy0+bmFtZSwgKGludClhcmdzLT5uYW1lbGVuLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKWFyZ3MtPmhhc2h2YWwsCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShhcmdzLT5pbnVtYmVyID4+IDMyKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShhcmdzLT5pbnVtYmVyICYgMHhGRkZGRkZGRikpLAorCQkodm9pZCAqKWFyZ3MtPmRwLCAodm9pZCAqKWFyZ3MtPnRyYW5zLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKWFyZ3MtPmp1c3RjaGVjaywKKwkJKHZvaWQgKikobGJwID8gbGJwLT5icHNbMF0gOiBOVUxMKSwKKwkJKHZvaWQgKikoZGJwID8gZGJwLT5icHNbMF0gOiBOVUxMKSk7Cit9CisKK3ZvaWQKK3hmc19kaXIyX3RyYWNlX2FyZ3NfYmliaWkoCisJY2hhcgkJKndoZXJlLAorCXhmc19kYV9hcmdzX3QJKmFyZ3MsCisJeGZzX2RhYnVmX3QJKmJzLAorCWludAkJc3MsCisJeGZzX2RhYnVmX3QJKmJkLAorCWludAkJc2QsCisJaW50CQljKQoreworCXhmc19idWZfdAkqYnBicyA9IGJzID8gYnMtPmJwc1swXSA6IE5VTEw7CisJeGZzX2J1Zl90CSpicGJkID0gYmQgPyBiZC0+YnBzWzBdIDogTlVMTDsKKworCXhmc19kaXIyX3RyYWNlX2VudGVyKGFyZ3MtPmRwLCBYRlNfRElSMl9LVFJBQ0VfQVJHU19CSUJJSSwgd2hlcmUsCisJCShjaGFyICopYXJncy0+bmFtZSwgKGludClhcmdzLT5uYW1lbGVuLAorCQkodm9pZCAqKWFyZ3MtPmRwLCAodm9pZCAqKWFyZ3MtPnRyYW5zLAorCQkodm9pZCAqKWJwYnMsICh2b2lkICopKGxvbmcpc3MsICh2b2lkICopYnBiZCwgKHZvaWQgKikobG9uZylzZCwKKwkJKHZvaWQgKikobG9uZyljLCBOVUxMKTsKK30KKwordm9pZAoreGZzX2RpcjJfdHJhY2VfYXJnc19kYigKKwljaGFyCQkqd2hlcmUsCisJeGZzX2RhX2FyZ3NfdAkqYXJncywKKwl4ZnNfZGlyMl9kYl90CWRiLAorCXhmc19kYWJ1Zl90CSpicCkKK3sKKwl4ZnNfYnVmX3QJKmRicCA9IGJwID8gYnAtPmJwc1swXSA6IE5VTEw7CisKKwl4ZnNfZGlyMl90cmFjZV9lbnRlcihhcmdzLT5kcCwgWEZTX0RJUjJfS1RSQUNFX0FSR1NfREIsIHdoZXJlLAorCQkoY2hhciAqKWFyZ3MtPm5hbWUsIChpbnQpYXJncy0+bmFtZWxlbiwKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZylhcmdzLT5oYXNodmFsLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoYXJncy0+aW51bWJlciA+PiAzMikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoYXJncy0+aW51bWJlciAmIDB4RkZGRkZGRkYpKSwKKwkJKHZvaWQgKilhcmdzLT5kcCwgKHZvaWQgKilhcmdzLT50cmFucywKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZylhcmdzLT5qdXN0Y2hlY2ssICh2b2lkICopKGxvbmcpZGIsCisJCSh2b2lkICopZGJwKTsKK30KKwordm9pZAoreGZzX2RpcjJfdHJhY2VfYXJnc19pKAorCWNoYXIJCSp3aGVyZSwKKwl4ZnNfZGFfYXJnc190CSphcmdzLAorCXhmc19pbm9fdAlpKQoreworCXhmc19kaXIyX3RyYWNlX2VudGVyKGFyZ3MtPmRwLCBYRlNfRElSMl9LVFJBQ0VfQVJHU19JLCB3aGVyZSwKKwkJKGNoYXIgKilhcmdzLT5uYW1lLCAoaW50KWFyZ3MtPm5hbWVsZW4sCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpYXJncy0+aGFzaHZhbCwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGFyZ3MtPmludW1iZXIgPj4gMzIpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGFyZ3MtPmludW1iZXIgJiAweEZGRkZGRkZGKSksCisJCSh2b2lkICopYXJncy0+ZHAsICh2b2lkICopYXJncy0+dHJhbnMsCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpYXJncy0+anVzdGNoZWNrLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoaSA+PiAzMikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoaSAmIDB4RkZGRkZGRkYpKSk7Cit9CisKK3ZvaWQKK3hmc19kaXIyX3RyYWNlX2FyZ3NfcygKKwljaGFyCQkqd2hlcmUsCisJeGZzX2RhX2FyZ3NfdAkqYXJncywKKwlpbnQJCXMpCit7CisJeGZzX2RpcjJfdHJhY2VfZW50ZXIoYXJncy0+ZHAsIFhGU19ESVIyX0tUUkFDRV9BUkdTX1MsIHdoZXJlLAorCQkoY2hhciAqKWFyZ3MtPm5hbWUsIChpbnQpYXJncy0+bmFtZWxlbiwKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZylhcmdzLT5oYXNodmFsLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoYXJncy0+aW51bWJlciA+PiAzMikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoYXJncy0+aW51bWJlciAmIDB4RkZGRkZGRkYpKSwKKwkJKHZvaWQgKilhcmdzLT5kcCwgKHZvaWQgKilhcmdzLT50cmFucywKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZylhcmdzLT5qdXN0Y2hlY2ssICh2b2lkICopKGxvbmcpcywgTlVMTCk7Cit9CisKK3ZvaWQKK3hmc19kaXIyX3RyYWNlX2FyZ3Nfc2IoCisJY2hhcgkJKndoZXJlLAorCXhmc19kYV9hcmdzX3QJKmFyZ3MsCisJaW50CQlzLAorCXhmc19kYWJ1Zl90CSpicCkKK3sKKwl4ZnNfYnVmX3QJKmRicCA9IGJwID8gYnAtPmJwc1swXSA6IE5VTEw7CisKKwl4ZnNfZGlyMl90cmFjZV9lbnRlcihhcmdzLT5kcCwgWEZTX0RJUjJfS1RSQUNFX0FSR1NfU0IsIHdoZXJlLAorCQkoY2hhciAqKWFyZ3MtPm5hbWUsIChpbnQpYXJncy0+bmFtZWxlbiwKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZylhcmdzLT5oYXNodmFsLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoYXJncy0+aW51bWJlciA+PiAzMikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoYXJncy0+aW51bWJlciAmIDB4RkZGRkZGRkYpKSwKKwkJKHZvaWQgKilhcmdzLT5kcCwgKHZvaWQgKilhcmdzLT50cmFucywKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZylhcmdzLT5qdXN0Y2hlY2ssICh2b2lkICopKGxvbmcpcywKKwkJKHZvaWQgKilkYnApOworfQorI2VuZGlmCS8qIFhGU19ESVIyX1RSQUNFICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjJfdHJhY2UuaCBiL2ZzL3hmcy94ZnNfZGlyMl90cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMTc4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2RpcjJfdHJhY2UuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfRElSMl9UUkFDRV9IX18KKyNkZWZpbmUgX19YRlNfRElSMl9UUkFDRV9IX18KKworLyoKKyAqIFRyYWNpbmcgZm9yIHhmcyB2MiBkaXJlY3Rvcmllcy4KKyAqLworCisjaWYgZGVmaW5lZChYRlNfRElSMl9UUkFDRSkKKworc3RydWN0IGt0cmFjZTsKK3N0cnVjdCB4ZnNfZGFidWY7CitzdHJ1Y3QgeGZzX2RhX2FyZ3M7CisKKyNkZWZpbmUJWEZTX0RJUjJfR1RSQUNFX1NJWkUJCTQwOTYJLyogZ2xvYmFsIGJ1ZmZlciAqLworI2RlZmluZQlYRlNfRElSMl9LVFJBQ0VfU0laRQkJMzIJLyogcGVyLWlub2RlIGJ1ZmZlciAqLworZXh0ZXJuIHN0cnVjdCBrdHJhY2UgKnhmc19kaXIyX3RyYWNlX2J1ZjsKKworI2RlZmluZQlYRlNfRElSMl9LVFJBQ0VfQVJHUwkJMQkvKiBhcmdzIG9ubHkgKi8KKyNkZWZpbmUJWEZTX0RJUjJfS1RSQUNFX0FSR1NfQgkJMgkvKiBhcmdzICsgYnVmZmVyICovCisjZGVmaW5lCVhGU19ESVIyX0tUUkFDRV9BUkdTX0JCCQkzCS8qIGFyZ3MgKyAyIGJ1ZmZlcnMgKi8KKyNkZWZpbmUJWEZTX0RJUjJfS1RSQUNFX0FSR1NfREIJCTQJLyogYXJncywgZGIsIGJ1ZmZlciAqLworI2RlZmluZQlYRlNfRElSMl9LVFJBQ0VfQVJHU19JCQk1CS8qIGFyZ3MsIGludW0gKi8KKyNkZWZpbmUJWEZTX0RJUjJfS1RSQUNFX0FSR1NfUwkJNgkvKiBhcmdzLCBpbnQgKi8KKyNkZWZpbmUJWEZTX0RJUjJfS1RSQUNFX0FSR1NfU0IJCTcJLyogYXJncywgaW50LCBidWZmZXIgKi8KKyNkZWZpbmUJWEZTX0RJUjJfS1RSQUNFX0FSR1NfQklCSUkJOAkvKiBhcmdzLCBidWYvaW50L2J1Zi9pbnQvaW50ICovCisKK3ZvaWQgeGZzX2RpcjJfdHJhY2VfYXJncyhjaGFyICp3aGVyZSwgc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK3ZvaWQgeGZzX2RpcjJfdHJhY2VfYXJnc19iKGNoYXIgKndoZXJlLCBzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsCisJCQkgICBzdHJ1Y3QgeGZzX2RhYnVmICpicCk7Cit2b2lkIHhmc19kaXIyX3RyYWNlX2FyZ3NfYmIoY2hhciAqd2hlcmUsIHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywKKwkJCSAgICBzdHJ1Y3QgeGZzX2RhYnVmICpsYnAsIHN0cnVjdCB4ZnNfZGFidWYgKmRicCk7Cit2b2lkIHhmc19kaXIyX3RyYWNlX2FyZ3NfYmliaWkoY2hhciAqd2hlcmUsIHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywKKwkJCSAgICAgICBzdHJ1Y3QgeGZzX2RhYnVmICpicywgaW50IHNzLAorCQkJICAgICAgIHN0cnVjdCB4ZnNfZGFidWYgKmJkLCBpbnQgc2QsIGludCBjKTsKK3ZvaWQgeGZzX2RpcjJfdHJhY2VfYXJnc19kYihjaGFyICp3aGVyZSwgc3RydWN0IHhmc19kYV9hcmdzICphcmdzLAorCQkJICAgIHhmc19kaXIyX2RiX3QgZGIsIHN0cnVjdCB4ZnNfZGFidWYgKmJwKTsKK3ZvaWQgeGZzX2RpcjJfdHJhY2VfYXJnc19pKGNoYXIgKndoZXJlLCBzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIHhmc19pbm9fdCBpKTsKK3ZvaWQgeGZzX2RpcjJfdHJhY2VfYXJnc19zKGNoYXIgKndoZXJlLCBzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIGludCBzKTsKK3ZvaWQgeGZzX2RpcjJfdHJhY2VfYXJnc19zYihjaGFyICp3aGVyZSwgc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCBpbnQgcywKKwkJCSAgICBzdHJ1Y3QgeGZzX2RhYnVmICpicCk7CisKKyNlbHNlCS8qIFhGU19ESVIyX1RSQUNFICovCisKKyNkZWZpbmUJeGZzX2RpcjJfdHJhY2VfYXJncyh3aGVyZSwgYXJncykKKyNkZWZpbmUJeGZzX2RpcjJfdHJhY2VfYXJnc19iKHdoZXJlLCBhcmdzLCBicCkKKyNkZWZpbmUJeGZzX2RpcjJfdHJhY2VfYXJnc19iYih3aGVyZSwgYXJncywgbGJwLCBkYnApCisjZGVmaW5lCXhmc19kaXIyX3RyYWNlX2FyZ3NfYmliaWkod2hlcmUsIGFyZ3MsIGJzLCBzcywgYmQsIHNkLCBjKQorI2RlZmluZQl4ZnNfZGlyMl90cmFjZV9hcmdzX2RiKHdoZXJlLCBhcmdzLCBkYiwgYnApCisjZGVmaW5lCXhmc19kaXIyX3RyYWNlX2FyZ3NfaSh3aGVyZSwgYXJncywgaSkKKyNkZWZpbmUJeGZzX2RpcjJfdHJhY2VfYXJnc19zKHdoZXJlLCBhcmdzLCBzKQorI2RlZmluZQl4ZnNfZGlyMl90cmFjZV9hcmdzX3NiKHdoZXJlLCBhcmdzLCBzLCBicCkKKworI2VuZGlmCS8qIFhGU19ESVIyX1RSQUNFICovCisKKyNlbmRpZgkvKiBfX1hGU19ESVIyX1RSQUNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXJfbGVhZi5jIGIvZnMveGZzL3hmc19kaXJfbGVhZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNzAxOGQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2Rpcl9sZWFmLmMKQEAgLTAsMCArMSwyMjMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisvKgorICogeGZzX2Rpcl9sZWFmLmMKKyAqCisgKiBHUk9UOiBmaWd1cmUgb3V0IGhvdyB0byByZWNvdmVyIGdyYWNlZnVsbHkgd2hlbiBibWFwIHJldHVybnMgRU5PU1BDLgorICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKworI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9sZWFmLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisKKy8qCisgKiB4ZnNfZGlyX2xlYWYuYworICoKKyAqIFJvdXRpbmVzIHRvIGltcGxlbWVudCBsZWFmIGJsb2NrcyBvZiBkaXJlY3RvcmllcyBhcyBCdHJlZXMgb2YgaGFzaGVkIG5hbWVzLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZvciB0aGUga2VybmVsLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogUm91dGluZXMgdXNlZCBmb3IgZ3Jvd2luZyB0aGUgQnRyZWUuCisgKi8KK1NUQVRJQyB2b2lkIHhmc19kaXJfbGVhZl9hZGRfd29yayh4ZnNfZGFidWZfdCAqbGVhZl9idWZmZXIsIHhmc19kYV9hcmdzX3QgKmFyZ3MsCisJCQkJCSAgICAgIGludCBpbnNlcnRpb25faW5kZXgsCisJCQkJCSAgICAgIGludCBmcmVlbWFwX2luZGV4KTsKK1NUQVRJQyBpbnQgeGZzX2Rpcl9sZWFmX2NvbXBhY3QoeGZzX3RyYW5zX3QgKnRyYW5zLCB4ZnNfZGFidWZfdCAqbGVhZl9idWZmZXIsCisJCQkJCSAgICBpbnQgbXVzdGhhdmUsIGludCBqdXN0Y2hlY2spOworU1RBVElDIHZvaWQgeGZzX2Rpcl9sZWFmX3JlYmFsYW5jZSh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsCisJCQkJCQkgIHhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrMSwKKwkJCQkJCSAgeGZzX2RhX3N0YXRlX2Jsa190ICpibGsyKTsKK1NUQVRJQyBpbnQgeGZzX2Rpcl9sZWFmX2ZpZ3VyZV9iYWxhbmNlKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwKKwkJCQkJICB4ZnNfZGFfc3RhdGVfYmxrX3QgKmxlYWZfYmxrXzEsCisJCQkJCSAgeGZzX2RhX3N0YXRlX2Jsa190ICpsZWFmX2Jsa18yLAorCQkJCQkgIGludCAqbnVtYmVyX2VudHJpZXNfaW5fYmxrMSwKKwkJCQkJICBpbnQgKm51bWJlcl9uYW1lYnl0ZXNfaW5fYmxrMSk7CisKKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICovCitTVEFUSUMgdm9pZCB4ZnNfZGlyX2xlYWZfbW92ZWVudHMoeGZzX2Rpcl9sZWFmYmxvY2tfdCAqc3JjX2xlYWYsCisJCQkJCSAgICAgIGludCBzcmNfc3RhcnQsCisJCQkJCSAgICAgIHhmc19kaXJfbGVhZmJsb2NrX3QgKmRzdF9sZWFmLAorCQkJCQkgICAgICBpbnQgZHN0X3N0YXJ0LCBpbnQgbW92ZV9jb3VudCwKKwkJCQkJICAgICAgeGZzX21vdW50X3QgKm1wKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRXh0ZXJuYWwgcm91dGluZXMgd2hlbiBkaXJzaXplIDwgWEZTX0lGT1JLX0RTSVpFKGRwKS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKgorICogVmFsaWRhdGUgYSBnaXZlbiBpbm9kZSBudW1iZXIuCisgKi8KK2ludAoreGZzX2Rpcl9pbm9fdmFsaWRhdGUoeGZzX21vdW50X3QgKm1wLCB4ZnNfaW5vX3QgaW5vKQoreworCXhmc19hZ2Jsb2NrX3QJYWdibGtubzsKKwl4ZnNfYWdpbm9fdAlhZ2lubzsKKwl4ZnNfYWdudW1iZXJfdAlhZ25vOworCWludAkJaW5vX29rOworCWludAkJaW9mZjsKKworCWFnbm8gPSBYRlNfSU5PX1RPX0FHTk8obXAsIGlubyk7CisJYWdibGtubyA9IFhGU19JTk9fVE9fQUdCTk8obXAsIGlubyk7CisJaW9mZiA9IFhGU19JTk9fVE9fT0ZGU0VUKG1wLCBpbm8pOworCWFnaW5vID0gWEZTX09GRkJOT19UT19BR0lOTyhtcCwgYWdibGtubywgaW9mZik7CisJaW5vX29rID0KKwkJYWdubyA8IG1wLT5tX3NiLnNiX2FnY291bnQgJiYKKwkJYWdibGtubyA8IG1wLT5tX3NiLnNiX2FnYmxvY2tzICYmCisJCWFnYmxrbm8gIT0gMCAmJgorCQlpb2ZmIDwgKDEgPDwgbXAtPm1fc2Iuc2JfaW5vcGJsb2cpICYmCisJCVhGU19BR0lOT19UT19JTk8obXAsIGFnbm8sIGFnaW5vKSA9PSBpbm87CisJaWYgKHVubGlrZWx5KFhGU19URVNUX0VSUk9SKCFpbm9fb2ssIG1wLCBYRlNfRVJSVEFHX0RJUl9JTk9fVkFMSURBVEUsCisJCQlYRlNfUkFORE9NX0RJUl9JTk9fVkFMSURBVEUpKSkgeworCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBtcCwgIkludmFsaWQgaW5vZGUgbnVtYmVyIDB4JUx4IiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBpbm8pOworCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfZGlyX2lub192YWxpZGF0ZSIsIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENyZWF0ZSB0aGUgaW5pdGlhbCBjb250ZW50cyBvZiBhIHNob3J0Zm9ybSBkaXJlY3RvcnkuCisgKi8KK2ludAoreGZzX2Rpcl9zaG9ydGZvcm1fY3JlYXRlKHhmc19kYV9hcmdzX3QgKmFyZ3MsIHhmc19pbm9fdCBwYXJlbnQpCit7CisJeGZzX2Rpcl9zZl9oZHJfdCAqaGRyOworCXhmc19pbm9kZV90ICpkcDsKKworCWRwID0gYXJncy0+ZHA7CisJQVNTRVJUKGRwICE9IE5VTEwpOworCUFTU0VSVChkcC0+aV9kLmRpX3NpemUgPT0gMCk7CisJaWYgKGRwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMpIHsKKwkJZHAtPmlfZGYuaWZfZmxhZ3MgJj0gflhGU19JRkVYVEVOVFM7CS8qIGp1c3QgaW4gY2FzZSAqLworCQlkcC0+aV9kLmRpX2Zvcm1hdCA9IFhGU19ESU5PREVfRk1UX0xPQ0FMOworCQl4ZnNfdHJhbnNfbG9nX2lub2RlKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0dfQ09SRSk7CisJCWRwLT5pX2RmLmlmX2ZsYWdzIHw9IFhGU19JRklOTElORTsKKwl9CisJQVNTRVJUKGRwLT5pX2RmLmlmX2ZsYWdzICYgWEZTX0lGSU5MSU5FKTsKKwlBU1NFUlQoZHAtPmlfZGYuaWZfYnl0ZXMgPT0gMCk7CisJeGZzX2lkYXRhX3JlYWxsb2MoZHAsIHNpemVvZigqaGRyKSwgWEZTX0RBVEFfRk9SSyk7CisJaGRyID0gKHhmc19kaXJfc2ZfaGRyX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCVhGU19ESVJfU0ZfUFVUX0RJUklOTygmcGFyZW50LCAmaGRyLT5wYXJlbnQpOworCisJaGRyLT5jb3VudCA9IDA7CisJZHAtPmlfZC5kaV9zaXplID0gc2l6ZW9mKCpoZHIpOworCXhmc190cmFuc19sb2dfaW5vZGUoYXJncy0+dHJhbnMsIGRwLCBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfRERBVEEpOworCXJldHVybigwKTsKK30KKworLyoKKyAqIEFkZCBhIG5hbWUgdG8gdGhlIHNob3J0Zm9ybSBkaXJlY3Rvcnkgc3RydWN0dXJlLgorICogT3ZlcmZsb3cgZnJvbSB0aGUgaW5vZGUgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGZvci4KKyAqLworaW50Cit4ZnNfZGlyX3Nob3J0Zm9ybV9hZGRuYW1lKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2Rpcl9zaG9ydGZvcm1fdCAqc2Y7CisJeGZzX2Rpcl9zZl9lbnRyeV90ICpzZmU7CisJaW50IGksIG9mZnNldCwgc2l6ZTsKKwl4ZnNfaW5vZGVfdCAqZHA7CisKKwlkcCA9IGFyZ3MtPmRwOworCUFTU0VSVChkcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRklOTElORSk7CisJLyoKKwkgKiBDYXRjaCB0aGUgY2FzZSB3aGVyZSB0aGUgY29udmVyc2lvbiBmcm9tIHNob3J0Zm9ybSB0byBsZWFmCisJICogZmFpbGVkIHBhcnQgd2F5IHRocm91Z2guCisJICovCisJaWYgKGRwLT5pX2QuZGlfc2l6ZSA8IHNpemVvZih4ZnNfZGlyX3NmX2hkcl90KSkgeworCQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihkcC0+aV9tb3VudCkpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCUFTU0VSVChkcC0+aV9kZi5pZl9ieXRlcyA9PSBkcC0+aV9kLmRpX3NpemUpOworCUFTU0VSVChkcC0+aV9kZi5pZl91MS5pZl9kYXRhICE9IE5VTEwpOworCXNmID0gKHhmc19kaXJfc2hvcnRmb3JtX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCXNmZSA9ICZzZi0+bGlzdFswXTsKKwlmb3IgKGkgPSBJTlRfR0VUKHNmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKHNmZS0+bmFtZWxlbiA9PSBhcmdzLT5uYW1lbGVuICYmCisJCSAgICBhcmdzLT5uYW1lWzBdID09IHNmZS0+bmFtZVswXSAmJgorCQkgICAgbWVtY21wKGFyZ3MtPm5hbWUsIHNmZS0+bmFtZSwgYXJncy0+bmFtZWxlbikgPT0gMCkKKwkJCXJldHVybihYRlNfRVJST1IoRUVYSVNUKSk7CisJCXNmZSA9IFhGU19ESVJfU0ZfTkVYVEVOVFJZKHNmZSk7CisJfQorCisJb2Zmc2V0ID0gKGludCkoKGNoYXIgKilzZmUgLSAoY2hhciAqKXNmKTsKKwlzaXplID0gWEZTX0RJUl9TRl9FTlRTSVpFX0JZTkFNRShhcmdzLT5uYW1lbGVuKTsKKwl4ZnNfaWRhdGFfcmVhbGxvYyhkcCwgc2l6ZSwgWEZTX0RBVEFfRk9SSyk7CisJc2YgPSAoeGZzX2Rpcl9zaG9ydGZvcm1fdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJc2ZlID0gKHhmc19kaXJfc2ZfZW50cnlfdCAqKSgoY2hhciAqKXNmICsgb2Zmc2V0KTsKKworCVhGU19ESVJfU0ZfUFVUX0RJUklOTygmYXJncy0+aW51bWJlciwgJnNmZS0+aW51bWJlcik7CisJc2ZlLT5uYW1lbGVuID0gYXJncy0+bmFtZWxlbjsKKwltZW1jcHkoc2ZlLT5uYW1lLCBhcmdzLT5uYW1lLCBzZmUtPm5hbWVsZW4pOworCUlOVF9NT0Qoc2YtPmhkci5jb3VudCwgQVJDSF9DT05WRVJULCArMSk7CisKKwlkcC0+aV9kLmRpX3NpemUgKz0gc2l6ZTsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0REQVRBKTsKKworCXJldHVybigwKTsKK30KKworLyoKKyAqIFJlbW92ZSBhIG5hbWUgZnJvbSB0aGUgc2hvcnRmb3JtIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCisgKi8KK2ludAoreGZzX2Rpcl9zaG9ydGZvcm1fcmVtb3ZlbmFtZSh4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19kaXJfc2hvcnRmb3JtX3QgKnNmOworCXhmc19kaXJfc2ZfZW50cnlfdCAqc2ZlOworCWludCBiYXNlLCBzaXplID0gMCwgaTsKKwl4ZnNfaW5vZGVfdCAqZHA7CisKKwlkcCA9IGFyZ3MtPmRwOworCUFTU0VSVChkcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRklOTElORSk7CisJLyoKKwkgKiBDYXRjaCB0aGUgY2FzZSB3aGVyZSB0aGUgY29udmVyc2lvbiBmcm9tIHNob3J0Zm9ybSB0byBsZWFmCisJICogZmFpbGVkIHBhcnQgd2F5IHRocm91Z2guCisJICovCisJaWYgKGRwLT5pX2QuZGlfc2l6ZSA8IHNpemVvZih4ZnNfZGlyX3NmX2hkcl90KSkgeworCQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihkcC0+aV9tb3VudCkpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCUFTU0VSVChkcC0+aV9kZi5pZl9ieXRlcyA9PSBkcC0+aV9kLmRpX3NpemUpOworCUFTU0VSVChkcC0+aV9kZi5pZl91MS5pZl9kYXRhICE9IE5VTEwpOworCWJhc2UgPSBzaXplb2YoeGZzX2Rpcl9zZl9oZHJfdCk7CisJc2YgPSAoeGZzX2Rpcl9zaG9ydGZvcm1fdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJc2ZlID0gJnNmLT5saXN0WzBdOworCWZvciAoaSA9IElOVF9HRVQoc2YtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xOyBpID49IDA7IGktLSkgeworCQlzaXplID0gWEZTX0RJUl9TRl9FTlRTSVpFX0JZRU5UUlkoc2ZlKTsKKwkJaWYgKHNmZS0+bmFtZWxlbiA9PSBhcmdzLT5uYW1lbGVuICYmCisJCSAgICBzZmUtPm5hbWVbMF0gPT0gYXJncy0+bmFtZVswXSAmJgorCQkgICAgbWVtY21wKHNmZS0+bmFtZSwgYXJncy0+bmFtZSwgYXJncy0+bmFtZWxlbikgPT0gMCkKKwkJCWJyZWFrOworCQliYXNlICs9IHNpemU7CisJCXNmZSA9IFhGU19ESVJfU0ZfTkVYVEVOVFJZKHNmZSk7CisJfQorCWlmIChpIDwgMCkgeworCQlBU1NFUlQoYXJncy0+b2tub2VudCk7CisJCXJldHVybihYRlNfRVJST1IoRU5PRU5UKSk7CisJfQorCisJaWYgKChiYXNlICsgc2l6ZSkgIT0gZHAtPmlfZC5kaV9zaXplKSB7CisJCW1lbW1vdmUoJigoY2hhciAqKXNmKVtiYXNlXSwgJigoY2hhciAqKXNmKVtiYXNlK3NpemVdLAorCQkJCQkgICAgICBkcC0+aV9kLmRpX3NpemUgLSAoYmFzZStzaXplKSk7CisJfQorCUlOVF9NT0Qoc2YtPmhkci5jb3VudCwgQVJDSF9DT05WRVJULCAtMSk7CisKKwl4ZnNfaWRhdGFfcmVhbGxvYyhkcCwgLXNpemUsIFhGU19EQVRBX0ZPUkspOworCWRwLT5pX2QuZGlfc2l6ZSAtPSBzaXplOworCXhmc190cmFuc19sb2dfaW5vZGUoYXJncy0+dHJhbnMsIGRwLCBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfRERBVEEpOworCisJcmV0dXJuKDApOworfQorCisvKgorICogTG9vayB1cCBhIG5hbWUgaW4gYSBzaG9ydGZvcm0gZGlyZWN0b3J5IHN0cnVjdHVyZS4KKyAqLworaW50Cit4ZnNfZGlyX3Nob3J0Zm9ybV9sb29rdXAoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwl4ZnNfZGlyX3Nob3J0Zm9ybV90ICpzZjsKKwl4ZnNfZGlyX3NmX2VudHJ5X3QgKnNmZTsKKwlpbnQgaTsKKwl4ZnNfaW5vZGVfdCAqZHA7CisKKwlkcCA9IGFyZ3MtPmRwOworCUFTU0VSVChkcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRklOTElORSk7CisJLyoKKwkgKiBDYXRjaCB0aGUgY2FzZSB3aGVyZSB0aGUgY29udmVyc2lvbiBmcm9tIHNob3J0Zm9ybSB0byBsZWFmCisJICogZmFpbGVkIHBhcnQgd2F5IHRocm91Z2guCisJICovCisJaWYgKGRwLT5pX2QuZGlfc2l6ZSA8IHNpemVvZih4ZnNfZGlyX3NmX2hkcl90KSkgeworCQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihkcC0+aV9tb3VudCkpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCUFTU0VSVChkcC0+aV9kZi5pZl9ieXRlcyA9PSBkcC0+aV9kLmRpX3NpemUpOworCUFTU0VSVChkcC0+aV9kZi5pZl91MS5pZl9kYXRhICE9IE5VTEwpOworCXNmID0gKHhmc19kaXJfc2hvcnRmb3JtX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCWlmIChhcmdzLT5uYW1lbGVuID09IDIgJiYKKwkgICAgYXJncy0+bmFtZVswXSA9PSAnLicgJiYgYXJncy0+bmFtZVsxXSA9PSAnLicpIHsKKwkJWEZTX0RJUl9TRl9HRVRfRElSSU5PKCZzZi0+aGRyLnBhcmVudCwgJmFyZ3MtPmludW1iZXIpOworCQlyZXR1cm4oWEZTX0VSUk9SKEVFWElTVCkpOworCX0KKwlpZiAoYXJncy0+bmFtZWxlbiA9PSAxICYmIGFyZ3MtPm5hbWVbMF0gPT0gJy4nKSB7CisJCWFyZ3MtPmludW1iZXIgPSBkcC0+aV9pbm87CisJCXJldHVybihYRlNfRVJST1IoRUVYSVNUKSk7CisJfQorCXNmZSA9ICZzZi0+bGlzdFswXTsKKwlmb3IgKGkgPSBJTlRfR0VUKHNmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKHNmZS0+bmFtZWxlbiA9PSBhcmdzLT5uYW1lbGVuICYmCisJCSAgICBzZmUtPm5hbWVbMF0gPT0gYXJncy0+bmFtZVswXSAmJgorCQkgICAgbWVtY21wKGFyZ3MtPm5hbWUsIHNmZS0+bmFtZSwgYXJncy0+bmFtZWxlbikgPT0gMCkgeworCQkJWEZTX0RJUl9TRl9HRVRfRElSSU5PKCZzZmUtPmludW1iZXIsICZhcmdzLT5pbnVtYmVyKTsKKwkJCXJldHVybihYRlNfRVJST1IoRUVYSVNUKSk7CisJCX0KKwkJc2ZlID0gWEZTX0RJUl9TRl9ORVhURU5UUlkoc2ZlKTsKKwl9CisJQVNTRVJUKGFyZ3MtPm9rbm9lbnQpOworCXJldHVybihYRlNfRVJST1IoRU5PRU5UKSk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGZyb20gdXNpbmcgdGhlIHNob3J0Zm9ybSB0byB0aGUgbGVhZi4KKyAqLworaW50Cit4ZnNfZGlyX3Nob3J0Zm9ybV90b19sZWFmKHhmc19kYV9hcmdzX3QgKmlhcmdzKQoreworCXhmc19pbm9kZV90ICpkcDsKKwl4ZnNfZGlyX3Nob3J0Zm9ybV90ICpzZjsKKwl4ZnNfZGlyX3NmX2VudHJ5X3QgKnNmZTsKKwl4ZnNfZGFfYXJnc190IGFyZ3M7CisJeGZzX2lub190IGludW1iZXI7CisJY2hhciAqdG1wYnVmZmVyOworCWludCByZXR2YWwsIGksIHNpemU7CisJeGZzX2RhYmxrX3QgYmxrbm87CisJeGZzX2RhYnVmX3QgKmJwOworCisJZHAgPSBpYXJncy0+ZHA7CisJLyoKKwkgKiBDYXRjaCB0aGUgY2FzZSB3aGVyZSB0aGUgY29udmVyc2lvbiBmcm9tIHNob3J0Zm9ybSB0byBsZWFmCisJICogZmFpbGVkIHBhcnQgd2F5IHRocm91Z2guCisJICovCisJaWYgKGRwLT5pX2QuZGlfc2l6ZSA8IHNpemVvZih4ZnNfZGlyX3NmX2hkcl90KSkgeworCQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihkcC0+aV9tb3VudCkpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCUFTU0VSVChkcC0+aV9kZi5pZl9ieXRlcyA9PSBkcC0+aV9kLmRpX3NpemUpOworCUFTU0VSVChkcC0+aV9kZi5pZl91MS5pZl9kYXRhICE9IE5VTEwpOworCXNpemUgPSBkcC0+aV9kZi5pZl9ieXRlczsKKwl0bXBidWZmZXIgPSBrbWVtX2FsbG9jKHNpemUsIEtNX1NMRUVQKTsKKwlBU1NFUlQodG1wYnVmZmVyICE9IE5VTEwpOworCisJbWVtY3B5KHRtcGJ1ZmZlciwgZHAtPmlfZGYuaWZfdTEuaWZfZGF0YSwgc2l6ZSk7CisKKwlzZiA9ICh4ZnNfZGlyX3Nob3J0Zm9ybV90ICopdG1wYnVmZmVyOworCVhGU19ESVJfU0ZfR0VUX0RJUklOTygmc2YtPmhkci5wYXJlbnQsICZpbnVtYmVyKTsKKworCXhmc19pZGF0YV9yZWFsbG9jKGRwLCAtc2l6ZSwgWEZTX0RBVEFfRk9SSyk7CisJZHAtPmlfZC5kaV9zaXplID0gMDsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKGlhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0NPUkUpOworCXJldHZhbCA9IHhmc19kYV9ncm93X2lub2RlKGlhcmdzLCAmYmxrbm8pOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCisJQVNTRVJUKGJsa25vID09IDApOworCXJldHZhbCA9IHhmc19kaXJfbGVhZl9jcmVhdGUoaWFyZ3MsIGJsa25vLCAmYnApOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCXhmc19kYV9idWZfZG9uZShicCk7CisKKwlhcmdzLm5hbWUgPSAiLiI7CisJYXJncy5uYW1lbGVuID0gMTsKKwlhcmdzLmhhc2h2YWwgPSB4ZnNfZGlyX2hhc2hfZG90OworCWFyZ3MuaW51bWJlciA9IGRwLT5pX2lubzsKKwlhcmdzLmRwID0gZHA7CisJYXJncy5maXJzdGJsb2NrID0gaWFyZ3MtPmZpcnN0YmxvY2s7CisJYXJncy5mbGlzdCA9IGlhcmdzLT5mbGlzdDsKKwlhcmdzLnRvdGFsID0gaWFyZ3MtPnRvdGFsOworCWFyZ3Mud2hpY2hmb3JrID0gWEZTX0RBVEFfRk9SSzsKKwlhcmdzLnRyYW5zID0gaWFyZ3MtPnRyYW5zOworCWFyZ3MuanVzdGNoZWNrID0gMDsKKwlhcmdzLmFkZG5hbWUgPSBhcmdzLm9rbm9lbnQgPSAxOworCXJldHZhbCA9IHhmc19kaXJfbGVhZl9hZGRuYW1lKCZhcmdzKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKworCWFyZ3MubmFtZSA9ICIuLiI7CisJYXJncy5uYW1lbGVuID0gMjsKKwlhcmdzLmhhc2h2YWwgPSB4ZnNfZGlyX2hhc2hfZG90ZG90OworCWFyZ3MuaW51bWJlciA9IGludW1iZXI7CisJcmV0dmFsID0geGZzX2Rpcl9sZWFmX2FkZG5hbWUoJmFyZ3MpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCisJc2ZlID0gJnNmLT5saXN0WzBdOworCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKHNmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7IGkrKykgeworCQlhcmdzLm5hbWUgPSAoY2hhciAqKShzZmUtPm5hbWUpOworCQlhcmdzLm5hbWVsZW4gPSBzZmUtPm5hbWVsZW47CisJCWFyZ3MuaGFzaHZhbCA9IHhmc19kYV9oYXNobmFtZSgoY2hhciAqKShzZmUtPm5hbWUpLAorCQkJCQkgICAgICAgc2ZlLT5uYW1lbGVuKTsKKwkJWEZTX0RJUl9TRl9HRVRfRElSSU5PKCZzZmUtPmludW1iZXIsICZhcmdzLmludW1iZXIpOworCQlyZXR2YWwgPSB4ZnNfZGlyX2xlYWZfYWRkbmFtZSgmYXJncyk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIG91dDsKKwkJc2ZlID0gWEZTX0RJUl9TRl9ORVhURU5UUlkoc2ZlKTsKKwl9CisJcmV0dmFsID0gMDsKKworb3V0OgorCWttZW1fZnJlZSh0bXBidWZmZXIsIHNpemUpOworCXJldHVybihyZXR2YWwpOworfQorCitTVEFUSUMgaW50Cit4ZnNfZGlyX3Nob3J0Zm9ybV9jb21wYXJlKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJeGZzX2Rpcl9zZl9zb3J0X3QgKnNhLCAqc2I7CisKKwlzYSA9ICh4ZnNfZGlyX3NmX3NvcnRfdCAqKWE7CisJc2IgPSAoeGZzX2Rpcl9zZl9zb3J0X3QgKiliOworCWlmIChzYS0+aGFzaCA8IHNiLT5oYXNoKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAoc2EtPmhhc2ggPiBzYi0+aGFzaCkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gc2EtPmVudG5vIC0gc2ItPmVudG5vOworfQorCisvKgorICogQ29weSBvdXQgZGlyZWN0b3J5IGVudHJpZXMgZm9yIGdldGRlbnRzKCksIGZvciBzaG9ydGZvcm0gZGlyZWN0b3JpZXMuCisgKi8KKy8qQVJHU1VTRUQqLworaW50Cit4ZnNfZGlyX3Nob3J0Zm9ybV9nZXRkZW50cyh4ZnNfaW5vZGVfdCAqZHAsIHVpb190ICp1aW8sIGludCAqZW9mcCwKKwkJCQkgICAgICAgeGZzX2RpcmVudF90ICpkYnAsIHhmc19kaXJfcHV0X3QgcHV0KQoreworCXhmc19kaXJfc2hvcnRmb3JtX3QgKnNmOworCXhmc19kaXJfc2ZfZW50cnlfdCAqc2ZlOworCWludCByZXR2YWwsIGksIHNic2l6ZSwgbnNidWYsIGxhc3RyZXNpZD0wLCB3YW50X2VudG5vOworCXhmc19tb3VudF90ICptcDsKKwl4ZnNfZGFoYXNoX3QgY29va2hhc2gsIGhhc2g7CisJeGZzX2Rpcl9wdXRfYXJnc190IHA7CisJeGZzX2Rpcl9zZl9zb3J0X3QgKnNidWYsICpzYnA7CisKKwltcCA9IGRwLT5pX21vdW50OworCXNmID0gKHhmc19kaXJfc2hvcnRmb3JtX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCWNvb2toYXNoID0gWEZTX0RBX0NPT0tJRV9IQVNIKG1wLCB1aW8tPnVpb19vZmZzZXQpOworCXdhbnRfZW50bm8gPSBYRlNfREFfQ09PS0lFX0VOVFJZKG1wLCB1aW8tPnVpb19vZmZzZXQpOworCW5zYnVmID0gSU5UX0dFVChzZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpICsgMjsKKwlzYnNpemUgPSAobnNidWYgKyAxKSAqIHNpemVvZigqc2J1Zik7CisJc2JwID0gc2J1ZiA9IGttZW1fYWxsb2Moc2JzaXplLCBLTV9TTEVFUCk7CisKKwl4ZnNfZGlyX3RyYWNlX2dfZHUoInNmOiBzdGFydCIsIGRwLCB1aW8pOworCisJLyoKKwkgKiBDb2xsZWN0IGFsbCB0aGUgZW50cmllcyBpbnRvIHRoZSBidWZmZXIuCisJICogRW50cnkgMCBpcyAuCisJICovCisJc2JwLT5lbnRubyA9IDA7CisJc2JwLT5zZXFubyA9IDA7CisJc2JwLT5oYXNoID0geGZzX2Rpcl9oYXNoX2RvdDsKKwlzYnAtPmlubyA9IGRwLT5pX2lubzsKKwlzYnAtPm5hbWUgPSAiLiI7CisJc2JwLT5uYW1lbGVuID0gMTsKKwlzYnArKzsKKworCS8qCisJICogRW50cnkgMSBpcyAuLgorCSAqLworCXNicC0+ZW50bm8gPSAxOworCXNicC0+c2Vxbm8gPSAwOworCXNicC0+aGFzaCA9IHhmc19kaXJfaGFzaF9kb3Rkb3Q7CisJc2JwLT5pbm8gPSBYRlNfR0VUX0RJUl9JTk84KHNmLT5oZHIucGFyZW50KTsKKwlzYnAtPm5hbWUgPSAiLi4iOworCXNicC0+bmFtZWxlbiA9IDI7CisJc2JwKys7CisKKwkvKgorCSAqIFNjYW4gdGhlIGRpcmVjdG9yeSBkYXRhIGZvciB0aGUgcmVzdCBvZiB0aGUgZW50cmllcy4KKwkgKi8KKwlmb3IgKGkgPSAwLCBzZmUgPSAmc2YtPmxpc3RbMF07CisJCQlpIDwgSU5UX0dFVChzZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOyBpKyspIHsKKworCQlpZiAodW5saWtlbHkoCisJCSAgICAoKGNoYXIgKilzZmUgPCAoY2hhciAqKXNmKSB8fAorCQkgICAgKChjaGFyICopc2ZlID49ICgoY2hhciAqKXNmICsgZHAtPmlfZGYuaWZfYnl0ZXMpKSkpIHsKKwkJCXhmc19kaXJfdHJhY2VfZ19kdSgic2Y6IGNvcnJ1cHRlZCIsIGRwLCB1aW8pOworCQkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19kaXJfc2hvcnRmb3JtX2dldGRlbnRzIiwKKwkJCQkJICAgICBYRlNfRVJSTEVWRUxfTE9XLCBtcCwgc2ZlKTsKKwkJCWttZW1fZnJlZShzYnVmLCBzYnNpemUpOworCQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQl9CisKKwkJc2JwLT5lbnRubyA9IGkgKyAyOworCQlzYnAtPnNlcW5vID0gMDsKKwkJc2JwLT5oYXNoID0geGZzX2RhX2hhc2huYW1lKChjaGFyICopc2ZlLT5uYW1lLCBzZmUtPm5hbWVsZW4pOworCQlzYnAtPmlubyA9IFhGU19HRVRfRElSX0lOTzgoc2ZlLT5pbnVtYmVyKTsKKwkJc2JwLT5uYW1lID0gKGNoYXIgKilzZmUtPm5hbWU7CisJCXNicC0+bmFtZWxlbiA9IHNmZS0+bmFtZWxlbjsKKwkJc2ZlID0gWEZTX0RJUl9TRl9ORVhURU5UUlkoc2ZlKTsKKwkJc2JwKys7CisJfQorCisJLyoKKwkgKiBTb3J0IHRoZSBlbnRyaWVzIG9uIGhhc2ggdGhlbiBlbnRuby4KKwkgKi8KKwlxc29ydChzYnVmLCBuc2J1Ziwgc2l6ZW9mKCpzYnVmKSwgeGZzX2Rpcl9zaG9ydGZvcm1fY29tcGFyZSk7CisJLyoKKwkgKiBTdHVmZiBpbiBsYXN0IGVudHJ5LgorCSAqLworCXNicC0+ZW50bm8gPSBuc2J1ZjsKKwlzYnAtPmhhc2ggPSBYRlNfREFfTUFYSEFTSDsKKwlzYnAtPnNlcW5vID0gMDsKKwkvKgorCSAqIEZpZ3VyZSBvdXQgdGhlIHNlcXVlbmNlIG51bWJlcnMgaW4gY2FzZSB0aGVyZSdzIGEgaGFzaCBkdXBsaWNhdGUuCisJICovCisJZm9yIChoYXNoID0gc2J1Zi0+aGFzaCwgc2JwID0gc2J1ZiArIDE7CisJCQkJc2JwIDwgJnNidWZbbnNidWYgKyAxXTsgc2JwKyspIHsKKwkJaWYgKHNicC0+aGFzaCA9PSBoYXNoKQorCQkJc2JwLT5zZXFubyA9IHNicFstMV0uc2Vxbm8gKyAxOworCQllbHNlCisJCQloYXNoID0gc2JwLT5oYXNoOworCX0KKworCS8qCisJICogU2V0IHVwIHB1dCByb3V0aW5lLgorCSAqLworCXAuZGJwID0gZGJwOworCXAucHV0ID0gcHV0OworCXAudWlvID0gdWlvOworCisJLyoKKwkgKiBGaW5kIG91ciBwbGFjZS4KKwkgKi8KKwlmb3IgKHNicCA9IHNidWY7IHNicCA8ICZzYnVmW25zYnVmICsgMV07IHNicCsrKSB7CisJCWlmIChzYnAtPmhhc2ggPiBjb29raGFzaCB8fAorCQkgICAgKHNicC0+aGFzaCA9PSBjb29raGFzaCAmJiBzYnAtPnNlcW5vID49IHdhbnRfZW50bm8pKQorCQkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBEaWQgd2UgZmFpbCB0byBmaW5kIGFueXRoaW5nPyAgV2Ugc3RvcCBhdCB0aGUgbGFzdCBlbnRyeSwKKwkgKiB0aGUgb25lIHdlIHB1dCBtYXhoYXNoIGludG8uCisJICovCisJaWYgKHNicCA9PSAmc2J1Zltuc2J1Zl0pIHsKKwkJa21lbV9mcmVlKHNidWYsIHNic2l6ZSk7CisJCXhmc19kaXJfdHJhY2VfZ19kdSgic2Y6IGhhc2ggYmV5b25kIGVuZCIsIGRwLCB1aW8pOworCQl1aW8tPnVpb19vZmZzZXQgPSBYRlNfREFfTUFLRV9DT09LSUUobXAsIDAsIDAsIFhGU19EQV9NQVhIQVNIKTsKKwkJKmVvZnAgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIExvb3AgcHV0dGluZyBlbnRyaWVzIGludG8gdGhlIHVzZXIgYnVmZmVyLgorCSAqLworCXdoaWxlIChzYnAgPCAmc2J1Zltuc2J1Zl0pIHsKKwkJLyoKKwkJICogU2F2ZSB0aGUgZmlyc3QgcmVzaWQgaW4gYSBydW4gb2YgZXF1YWwtaGFzaHZhbCBlbnRyaWVzCisJCSAqIHNvIHRoYXQgd2UgY2FuIGJhY2sgdGhlbSBvdXQgaWYgdGhleSBkb24ndCBhbGwgZml0LgorCQkgKi8KKwkJaWYgKHNicC0+c2Vxbm8gPT0gMCB8fCBzYnAgPT0gc2J1ZikKKwkJCWxhc3RyZXNpZCA9IHVpby0+dWlvX3Jlc2lkOworCQlYRlNfUFVUX0NPT0tJRShwLmNvb2ssIG1wLCAwLCBzYnBbMV0uc2Vxbm8sIHNicFsxXS5oYXNoKTsKKwkJcC5pbm8gPSBzYnAtPmlubzsKKyNpZiBYRlNfQklHX0lOVU1TCisJCXAuaW5vICs9IG1wLT5tX2lub2FkZDsKKyNlbmRpZgorCQlwLm5hbWUgPSBzYnAtPm5hbWU7CisJCXAubmFtZWxlbiA9IHNicC0+bmFtZWxlbjsKKwkJcmV0dmFsID0gcC5wdXQoJnApOworCQlpZiAoIXAuZG9uZSkgeworCQkJdWlvLT51aW9fb2Zmc2V0ID0KKwkJCQlYRlNfREFfTUFLRV9DT09LSUUobXAsIDAsIDAsIHNicC0+aGFzaCk7CisJCQlrbWVtX2ZyZWUoc2J1Ziwgc2JzaXplKTsKKwkJCXVpby0+dWlvX3Jlc2lkID0gbGFzdHJlc2lkOworCQkJeGZzX2Rpcl90cmFjZV9nX2R1KCJzZjogRS1PLUIiLCBkcCwgdWlvKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJc2JwKys7CisJfQorCWttZW1fZnJlZShzYnVmLCBzYnNpemUpOworCXVpby0+dWlvX29mZnNldCA9IHAuY29vay5vOworCSplb2ZwID0gMTsKKwl4ZnNfZGlyX3RyYWNlX2dfZHUoInNmOiBFLU8tRiIsIGRwLCB1aW8pOworCXJldHVybiAwOworfQorCisvKgorICogTG9vayB1cCBhIG5hbWUgaW4gYSBzaG9ydGZvcm0gZGlyZWN0b3J5IHN0cnVjdHVyZSwgcmVwbGFjZSB0aGUgaW5vZGUgbnVtYmVyLgorICovCitpbnQKK3hmc19kaXJfc2hvcnRmb3JtX3JlcGxhY2UoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwl4ZnNfZGlyX3Nob3J0Zm9ybV90ICpzZjsKKwl4ZnNfZGlyX3NmX2VudHJ5X3QgKnNmZTsKKwl4ZnNfaW5vZGVfdCAqZHA7CisJaW50IGk7CisKKwlkcCA9IGFyZ3MtPmRwOworCUFTU0VSVChkcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRklOTElORSk7CisJLyoKKwkgKiBDYXRjaCB0aGUgY2FzZSB3aGVyZSB0aGUgY29udmVyc2lvbiBmcm9tIHNob3J0Zm9ybSB0byBsZWFmCisJICogZmFpbGVkIHBhcnQgd2F5IHRocm91Z2guCisJICovCisJaWYgKGRwLT5pX2QuZGlfc2l6ZSA8IHNpemVvZih4ZnNfZGlyX3NmX2hkcl90KSkgeworCQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihkcC0+aV9tb3VudCkpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCUFTU0VSVChkcC0+aV9kZi5pZl9ieXRlcyA9PSBkcC0+aV9kLmRpX3NpemUpOworCUFTU0VSVChkcC0+aV9kZi5pZl91MS5pZl9kYXRhICE9IE5VTEwpOworCXNmID0gKHhmc19kaXJfc2hvcnRmb3JtX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCWlmIChhcmdzLT5uYW1lbGVuID09IDIgJiYKKwkgICAgYXJncy0+bmFtZVswXSA9PSAnLicgJiYgYXJncy0+bmFtZVsxXSA9PSAnLicpIHsKKwkJLyogWFhYIC0gcmVwbGFjZSBhc3NlcnQ/ICovCisJCVhGU19ESVJfU0ZfUFVUX0RJUklOTygmYXJncy0+aW51bWJlciwgJnNmLT5oZHIucGFyZW50KTsKKwkJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0REQVRBKTsKKwkJcmV0dXJuKDApOworCX0KKwlBU1NFUlQoYXJncy0+bmFtZWxlbiAhPSAxIHx8IGFyZ3MtPm5hbWVbMF0gIT0gJy4nKTsKKwlzZmUgPSAmc2YtPmxpc3RbMF07CisJZm9yIChpID0gSU5UX0dFVChzZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTE7IGkgPj0gMDsgaS0tKSB7CisJCWlmIChzZmUtPm5hbWVsZW4gPT0gYXJncy0+bmFtZWxlbiAmJgorCQkgICAgc2ZlLT5uYW1lWzBdID09IGFyZ3MtPm5hbWVbMF0gJiYKKwkJICAgIG1lbWNtcChhcmdzLT5uYW1lLCBzZmUtPm5hbWUsIGFyZ3MtPm5hbWVsZW4pID09IDApIHsKKwkJCUFTU0VSVChtZW1jbXAoKGNoYXIgKikmYXJncy0+aW51bWJlciwKKwkJCQkoY2hhciAqKSZzZmUtPmludW1iZXIsIHNpemVvZih4ZnNfaW5vX3QpKSk7CisJCQlYRlNfRElSX1NGX1BVVF9ESVJJTk8oJmFyZ3MtPmludW1iZXIsICZzZmUtPmludW1iZXIpOworCQkJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0REQVRBKTsKKwkJCXJldHVybigwKTsKKwkJfQorCQlzZmUgPSBYRlNfRElSX1NGX05FWFRFTlRSWShzZmUpOworCX0KKwlBU1NFUlQoYXJncy0+b2tub2VudCk7CisJcmV0dXJuKFhGU19FUlJPUihFTk9FTlQpKTsKK30KKworLyoKKyAqIENvbnZlcnQgYSBsZWFmIGRpcmVjdG9yeSB0byBzaG9ydGZvcm0gc3RydWN0dXJlCisgKi8KK2ludAoreGZzX2Rpcl9sZWFmX3RvX3Nob3J0Zm9ybSh4ZnNfZGFfYXJnc190ICppYXJncykKK3sKKwl4ZnNfZGlyX2xlYWZibG9ja190ICpsZWFmOworCXhmc19kaXJfbGVhZl9oZHJfdCAqaGRyOworCXhmc19kaXJfbGVhZl9lbnRyeV90ICplbnRyeTsKKwl4ZnNfZGlyX2xlYWZfbmFtZV90ICpuYW1lc3Q7CisJeGZzX2RhX2FyZ3NfdCBhcmdzOworCXhmc19pbm9kZV90ICpkcDsKKwl4ZnNfaW5vX3QgcGFyZW50OworCWNoYXIgKnRtcGJ1ZmZlcjsKKwlpbnQgcmV0dmFsLCBpOworCXhmc19kYWJ1Zl90ICpicDsKKworCWRwID0gaWFyZ3MtPmRwOworCXRtcGJ1ZmZlciA9IGttZW1fYWxsb2MoWEZTX0xCU0laRShkcC0+aV9tb3VudCksIEtNX1NMRUVQKTsKKwlBU1NFUlQodG1wYnVmZmVyICE9IE5VTEwpOworCisJcmV0dmFsID0geGZzX2RhX3JlYWRfYnVmKGlhcmdzLT50cmFucywgaWFyZ3MtPmRwLCAwLCAtMSwgJmJwLAorCQkJCQkgICAgICAgWEZTX0RBVEFfRk9SSyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CisJQVNTRVJUKGJwICE9IE5VTEwpOworCW1lbWNweSh0bXBidWZmZXIsIGJwLT5kYXRhLCBYRlNfTEJTSVpFKGRwLT5pX21vdW50KSk7CisJbGVhZiA9ICh4ZnNfZGlyX2xlYWZibG9ja190ICopdG1wYnVmZmVyOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVJfTEVBRl9NQUdJQyk7CisJbWVtc2V0KGJwLT5kYXRhLCAwLCBYRlNfTEJTSVpFKGRwLT5pX21vdW50KSk7CisKKwkvKgorCSAqIEZpbmQgYW5kIHNwZWNpYWwgY2FzZSB0aGUgcGFyZW50IGlub2RlIG51bWJlcgorCSAqLworCWhkciA9ICZsZWFmLT5oZHI7CisJZW50cnkgPSAmbGVhZi0+ZW50cmllc1swXTsKKwlmb3IgKGkgPSBJTlRfR0VUKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCktMTsgaSA+PSAwOyBlbnRyeSsrLCBpLS0pIHsKKwkJbmFtZXN0ID0gWEZTX0RJUl9MRUFGX05BTUVTVFJVQ1QobGVhZiwgSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKSk7CisJCWlmICgoZW50cnktPm5hbWVsZW4gPT0gMikgJiYKKwkJICAgIChuYW1lc3QtPm5hbWVbMF0gPT0gJy4nKSAmJgorCQkgICAgKG5hbWVzdC0+bmFtZVsxXSA9PSAnLicpKSB7CisJCQlYRlNfRElSX1NGX0dFVF9ESVJJTk8oJm5hbWVzdC0+aW51bWJlciwgJnBhcmVudCk7CisJCQllbnRyeS0+bmFtZWlkeCA9IDA7CisJCX0gZWxzZSBpZiAoKGVudHJ5LT5uYW1lbGVuID09IDEpICYmIChuYW1lc3QtPm5hbWVbMF0gPT0gJy4nKSkgeworCQkJZW50cnktPm5hbWVpZHggPSAwOworCQl9CisJfQorCXJldHZhbCA9IHhmc19kYV9zaHJpbmtfaW5vZGUoaWFyZ3MsIDAsIGJwKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKwlyZXR2YWwgPSB4ZnNfZGlyX3Nob3J0Zm9ybV9jcmVhdGUoaWFyZ3MsIHBhcmVudCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIENvcHkgdGhlIHJlc3Qgb2YgdGhlIGZpbGVuYW1lcworCSAqLworCWVudHJ5ID0gJmxlYWYtPmVudHJpZXNbMF07CisJYXJncy5kcCA9IGRwOworCWFyZ3MuZmlyc3RibG9jayA9IGlhcmdzLT5maXJzdGJsb2NrOworCWFyZ3MuZmxpc3QgPSBpYXJncy0+Zmxpc3Q7CisJYXJncy50b3RhbCA9IGlhcmdzLT50b3RhbDsKKwlhcmdzLndoaWNoZm9yayA9IFhGU19EQVRBX0ZPUks7CisJYXJncy50cmFucyA9IGlhcmdzLT50cmFuczsKKwlhcmdzLmp1c3RjaGVjayA9IDA7CisJYXJncy5hZGRuYW1lID0gYXJncy5va25vZW50ID0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpOyBlbnRyeSsrLCBpKyspIHsKKwkJaWYgKCFlbnRyeS0+bmFtZWlkeCkKKwkJCWNvbnRpbnVlOworCQluYW1lc3QgPSBYRlNfRElSX0xFQUZfTkFNRVNUUlVDVChsZWFmLCBJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpKTsKKwkJYXJncy5uYW1lID0gKGNoYXIgKikobmFtZXN0LT5uYW1lKTsKKwkJYXJncy5uYW1lbGVuID0gZW50cnktPm5hbWVsZW47CisJCWFyZ3MuaGFzaHZhbCA9IElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisJCVhGU19ESVJfU0ZfR0VUX0RJUklOTygmbmFtZXN0LT5pbnVtYmVyLCAmYXJncy5pbnVtYmVyKTsKKwkJeGZzX2Rpcl9zaG9ydGZvcm1fYWRkbmFtZSgmYXJncyk7CisJfQorCitvdXQ6CisJa21lbV9mcmVlKHRtcGJ1ZmZlciwgWEZTX0xCU0laRShkcC0+aV9tb3VudCkpOworCXJldHVybihyZXR2YWwpOworfQorCisvKgorICogQ29udmVydCBmcm9tIHVzaW5nIGEgc2luZ2xlIGxlYWYgdG8gYSByb290IG5vZGUgYW5kIGEgbGVhZi4KKyAqLworaW50Cit4ZnNfZGlyX2xlYWZfdG9fbm9kZSh4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19kaXJfbGVhZmJsb2NrX3QgKmxlYWY7CisJeGZzX2RhX2ludG5vZGVfdCAqbm9kZTsKKwl4ZnNfaW5vZGVfdCAqZHA7CisJeGZzX2RhYnVmX3QgKmJwMSwgKmJwMjsKKwl4ZnNfZGFibGtfdCBibGtubzsKKwlpbnQgcmV0dmFsOworCisJZHAgPSBhcmdzLT5kcDsKKwlyZXR2YWwgPSB4ZnNfZGFfZ3Jvd19pbm9kZShhcmdzLCAmYmxrbm8pOworCUFTU0VSVChibGtubyA9PSAxKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4ocmV0dmFsKTsKKwlyZXR2YWwgPSB4ZnNfZGFfcmVhZF9idWYoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCAwLCAtMSwgJmJwMSwKKwkJCQkJICAgICAgWEZTX0RBVEFfRk9SSyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuKHJldHZhbCk7CisJQVNTRVJUKGJwMSAhPSBOVUxMKTsKKwlyZXR2YWwgPSB4ZnNfZGFfZ2V0X2J1ZihhcmdzLT50cmFucywgYXJncy0+ZHAsIDEsIC0xLCAmYnAyLAorCQkJCQkgICAgIFhGU19EQVRBX0ZPUkspOworCWlmIChyZXR2YWwpIHsKKwkJeGZzX2RhX2J1Zl9kb25lKGJwMSk7CisJCXJldHVybihyZXR2YWwpOworCX0KKwlBU1NFUlQoYnAyICE9IE5VTEwpOworCW1lbWNweShicDItPmRhdGEsIGJwMS0+ZGF0YSwgWEZTX0xCU0laRShkcC0+aV9tb3VudCkpOworCXhmc19kYV9idWZfZG9uZShicDEpOworCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicDIsIDAsIFhGU19MQlNJWkUoZHAtPmlfbW91bnQpIC0gMSk7CisKKwkvKgorCSAqIFNldCB1cCB0aGUgbmV3IHJvb3Qgbm9kZS4KKwkgKi8KKwlyZXR2YWwgPSB4ZnNfZGFfbm9kZV9jcmVhdGUoYXJncywgMCwgMSwgJmJwMSwgWEZTX0RBVEFfRk9SSyk7CisJaWYgKHJldHZhbCkgeworCQl4ZnNfZGFfYnVmX2RvbmUoYnAyKTsKKwkJcmV0dXJuKHJldHZhbCk7CisJfQorCW5vZGUgPSBicDEtPmRhdGE7CisJbGVhZiA9IGJwMi0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSX0xFQUZfTUFHSUMpOworCUlOVF9TRVQobm9kZS0+YnRyZWVbMF0uaGFzaHZhbCwgQVJDSF9DT05WRVJULCBJTlRfR0VUKGxlYWYtPmVudHJpZXNbIElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTEgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpKTsKKwl4ZnNfZGFfYnVmX2RvbmUoYnAyKTsKKwlJTlRfU0VUKG5vZGUtPmJ0cmVlWzBdLmJlZm9yZSwgQVJDSF9DT05WRVJULCBibGtubyk7CisJSU5UX1NFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCwgMSk7CisJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwMSwKKwkJWEZTX0RBX0xPR1JBTkdFKG5vZGUsICZub2RlLT5idHJlZVswXSwgc2l6ZW9mKG5vZGUtPmJ0cmVlWzBdKSkpOworCXhmc19kYV9idWZfZG9uZShicDEpOworCisJcmV0dXJuKHJldHZhbCk7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJvdXRpbmVzIHVzZWQgZm9yIGdyb3dpbmcgdGhlIEJ0cmVlLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogQ3JlYXRlIHRoZSBpbml0aWFsIGNvbnRlbnRzIG9mIGEgbGVhZiBkaXJlY3RvcnkKKyAqIG9yIGEgbGVhZiBpbiBhIG5vZGUgZGlyZWN0b3J5LgorICovCitpbnQKK3hmc19kaXJfbGVhZl9jcmVhdGUoeGZzX2RhX2FyZ3NfdCAqYXJncywgeGZzX2RhYmxrX3QgYmxrbm8sIHhmc19kYWJ1Zl90ICoqYnBwKQoreworCXhmc19kaXJfbGVhZmJsb2NrX3QgKmxlYWY7CisJeGZzX2Rpcl9sZWFmX2hkcl90ICpoZHI7CisJeGZzX2lub2RlX3QgKmRwOworCXhmc19kYWJ1Zl90ICpicDsKKwlpbnQgcmV0dmFsOworCisJZHAgPSBhcmdzLT5kcDsKKwlBU1NFUlQoZHAgIT0gTlVMTCk7CisJcmV0dmFsID0geGZzX2RhX2dldF9idWYoYXJncy0+dHJhbnMsIGRwLCBibGtubywgLTEsICZicCwgWEZTX0RBVEFfRk9SSyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuKHJldHZhbCk7CisJQVNTRVJUKGJwICE9IE5VTEwpOworCWxlYWYgPSBicC0+ZGF0YTsKKwltZW1zZXQoKGNoYXIgKilsZWFmLCAwLCBYRlNfTEJTSVpFKGRwLT5pX21vdW50KSk7CisJaGRyID0gJmxlYWYtPmhkcjsKKwlJTlRfU0VUKGhkci0+aW5mby5tYWdpYywgQVJDSF9DT05WRVJULCBYRlNfRElSX0xFQUZfTUFHSUMpOworCUlOVF9TRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCwgWEZTX0xCU0laRShkcC0+aV9tb3VudCkpOworCWlmICghaGRyLT5maXJzdHVzZWQpCisJCUlOVF9TRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCwgWEZTX0xCU0laRShkcC0+aV9tb3VudCkgLSAxKTsKKwlJTlRfU0VUKGhkci0+ZnJlZW1hcFswXS5iYXNlLCBBUkNIX0NPTlZFUlQsIHNpemVvZih4ZnNfZGlyX2xlYWZfaGRyX3QpKTsKKwlJTlRfU0VUKGhkci0+ZnJlZW1hcFswXS5zaXplLCBBUkNIX0NPTlZFUlQsIElOVF9HRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkgLSBJTlRfR0VUKGhkci0+ZnJlZW1hcFswXS5iYXNlLCBBUkNIX0NPTlZFUlQpKTsKKworCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicCwgMCwgWEZTX0xCU0laRShkcC0+aV9tb3VudCkgLSAxKTsKKworCSpicHAgPSBicDsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBTcGxpdCB0aGUgbGVhZiBub2RlLCByZWJhbGFuY2UsIHRoZW4gYWRkIHRoZSBuZXcgZW50cnkuCisgKi8KK2ludAoreGZzX2Rpcl9sZWFmX3NwbGl0KHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwgeGZzX2RhX3N0YXRlX2Jsa190ICpvbGRibGssCisJCQkJICB4ZnNfZGFfc3RhdGVfYmxrX3QgKm5ld2JsaykKK3sKKwl4ZnNfZGFibGtfdCBibGtubzsKKwl4ZnNfZGFfYXJnc190ICphcmdzOworCWludCBlcnJvcjsKKworCS8qCisJICogQWxsb2NhdGUgc3BhY2UgZm9yIGEgbmV3IGxlYWYgbm9kZS4KKwkgKi8KKwlhcmdzID0gc3RhdGUtPmFyZ3M7CisJQVNTRVJUKGFyZ3MgIT0gTlVMTCk7CisJQVNTRVJUKG9sZGJsay0+bWFnaWMgPT0gWEZTX0RJUl9MRUFGX01BR0lDKTsKKwllcnJvciA9IHhmc19kYV9ncm93X2lub2RlKGFyZ3MsICZibGtubyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4oZXJyb3IpOworCWVycm9yID0geGZzX2Rpcl9sZWFmX2NyZWF0ZShhcmdzLCBibGtubywgJm5ld2Jsay0+YnApOworCWlmIChlcnJvcikKKwkJcmV0dXJuKGVycm9yKTsKKwluZXdibGstPmJsa25vID0gYmxrbm87CisJbmV3YmxrLT5tYWdpYyA9IFhGU19ESVJfTEVBRl9NQUdJQzsKKworCS8qCisJICogUmViYWxhbmNlIHRoZSBlbnRyaWVzIGFjcm9zcyB0aGUgdHdvIGxlYXZlcy4KKwkgKi8KKwl4ZnNfZGlyX2xlYWZfcmViYWxhbmNlKHN0YXRlLCBvbGRibGssIG5ld2Jsayk7CisJZXJyb3IgPSB4ZnNfZGFfYmxrX2xpbmsoc3RhdGUsIG9sZGJsaywgbmV3YmxrKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybihlcnJvcik7CisKKwkvKgorCSAqIEluc2VydCB0aGUgbmV3IGVudHJ5IGluIHRoZSBjb3JyZWN0IGJsb2NrLgorCSAqLworCWlmIChzdGF0ZS0+aW5sZWFmKSB7CisJCWVycm9yID0geGZzX2Rpcl9sZWFmX2FkZChvbGRibGstPmJwLCBhcmdzLCBvbGRibGstPmluZGV4KTsKKwl9IGVsc2UgeworCQllcnJvciA9IHhmc19kaXJfbGVhZl9hZGQobmV3YmxrLT5icCwgYXJncywgbmV3YmxrLT5pbmRleCk7CisJfQorCisJLyoKKwkgKiBVcGRhdGUgbGFzdCBoYXNodmFsIGluIGVhY2ggYmxvY2sgc2luY2Ugd2UgYWRkZWQgdGhlIG5hbWUuCisJICovCisJb2xkYmxrLT5oYXNodmFsID0geGZzX2Rpcl9sZWFmX2xhc3RoYXNoKG9sZGJsay0+YnAsIE5VTEwpOworCW5ld2Jsay0+aGFzaHZhbCA9IHhmc19kaXJfbGVhZl9sYXN0aGFzaChuZXdibGstPmJwLCBOVUxMKTsKKwlyZXR1cm4oZXJyb3IpOworfQorCisvKgorICogQWRkIGEgbmFtZSB0byB0aGUgbGVhZiBkaXJlY3Rvcnkgc3RydWN0dXJlLgorICoKKyAqIE11c3QgdGFrZSBpbnRvIGFjY291bnQgZnJhZ21lbnRlZCBsZWF2ZXMgYW5kIGxlYXZlcyB3aGVyZSBzcGFjZW1hcCBoYXMKKyAqIGxvc3Qgc29tZSBmcmVlc3BhY2UgaW5mb3JtYXRpb24gKGllOiBob2xlcykuCisgKi8KK2ludAoreGZzX2Rpcl9sZWFmX2FkZCh4ZnNfZGFidWZfdCAqYnAsIHhmc19kYV9hcmdzX3QgKmFyZ3MsIGludCBpbmRleCkKK3sKKwl4ZnNfZGlyX2xlYWZibG9ja190ICpsZWFmOworCXhmc19kaXJfbGVhZl9oZHJfdCAqaGRyOworCXhmc19kaXJfbGVhZl9tYXBfdCAqbWFwOworCWludCB0YWJsZXNpemUsIGVudHNpemUsIHN1bSwgaSwgdG1wLCBlcnJvcjsKKworCWxlYWYgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSX0xFQUZfTUFHSUMpOworCUFTU0VSVCgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDw9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKSk7CisJaGRyID0gJmxlYWYtPmhkcjsKKwllbnRzaXplID0gWEZTX0RJUl9MRUFGX0VOVFNJWkVfQllOQU1FKGFyZ3MtPm5hbWVsZW4pOworCisJLyoKKwkgKiBTZWFyY2ggdGhyb3VnaCBmcmVlbWFwIGZvciBmaXJzdC1maXQgb24gbmV3IG5hbWUgbGVuZ3RoLgorCSAqIChtYXkgbmVlZCB0byBmaWd1cmUgaW4gc2l6ZSBvZiBlbnRyeSBzdHJ1Y3QgdG9vKQorCSAqLworCXRhYmxlc2l6ZSA9IChJTlRfR0VUKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgKyAxKSAqICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCkKKwkJCSsgKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9oZHJfdCk7CisJbWFwID0gJmhkci0+ZnJlZW1hcFtYRlNfRElSX0xFQUZfTUFQU0laRS0xXTsKKwlmb3IgKHN1bSA9IDAsIGkgPSBYRlNfRElSX0xFQUZfTUFQU0laRS0xOyBpID49IDA7IG1hcC0tLCBpLS0pIHsKKwkJaWYgKHRhYmxlc2l6ZSA+IElOVF9HRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCXN1bSArPSBJTlRfR0VUKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJUKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghbWFwLT5zaXplKQorCQkJY29udGludWU7CS8qIG5vIHNwYWNlIGluIHRoaXMgbWFwICovCisJCXRtcCA9IGVudHNpemU7CisJCWlmIChJTlRfR0VUKG1hcC0+YmFzZSwgQVJDSF9DT05WRVJUKSA8IElOVF9HRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkpCisJCQl0bXAgKz0gKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KTsKKwkJaWYgKElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpID49IHRtcCkgeworCQkJaWYgKCFhcmdzLT5qdXN0Y2hlY2spCisJCQkJeGZzX2Rpcl9sZWFmX2FkZF93b3JrKGJwLCBhcmdzLCBpbmRleCwgaSk7CisJCQlyZXR1cm4oMCk7CisJCX0KKwkJc3VtICs9IElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpOworCX0KKworCS8qCisJICogSWYgdGhlcmUgYXJlIG5vIGhvbGVzIGluIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBibG9jaywKKwkgKiBhbmQgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggZnJlZXNwYWNlLCB0aGVuIGNvbXBhY3Rpb24gd2lsbCBkbyB1cworCSAqIG5vIGdvb2QgYW5kIHdlIHNob3VsZCBqdXN0IGdpdmUgdXAuCisJICovCisJaWYgKCFoZHItPmhvbGVzICYmIChzdW0gPCBlbnRzaXplKSkKKwkJcmV0dXJuKFhGU19FUlJPUihFTk9TUEMpKTsKKworCS8qCisJICogQ29tcGFjdCB0aGUgZW50cmllcyB0byBjb2FsZXNjZSBmcmVlIHNwYWNlLgorCSAqIFBhc3MgdGhlIGp1c3RjaGVjayBmbGFnIHNvIHRoZSBjaGVja2luZyBwYXNzIGNhbiByZXR1cm4KKwkgKiBhbiBlcnJvciwgd2l0aG91dCBjaGFuZ2luZyBhbnl0aGluZywgaWYgaXQgd29uJ3QgZml0LgorCSAqLworCWVycm9yID0geGZzX2Rpcl9sZWFmX2NvbXBhY3QoYXJncy0+dHJhbnMsIGJwLAorCQkJYXJncy0+dG90YWwgPT0gMCA/CisJCQkJZW50c2l6ZSArCisJCQkJKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KSA6IDAsCisJCQlhcmdzLT5qdXN0Y2hlY2spOworCWlmIChlcnJvcikKKwkJcmV0dXJuKGVycm9yKTsKKwkvKgorCSAqIEFmdGVyIGNvbXBhY3Rpb24sIHRoZSBibG9jayBpcyBndWFyYW50ZWVkIHRvIGhhdmUgb25seSBvbmUKKwkgKiBmcmVlIHJlZ2lvbiwgaW4gZnJlZW1hcFswXS4gIElmIGl0IGlzIG5vdCBiaWcgZW5vdWdoLCBnaXZlIHVwLgorCSAqLworCWlmIChJTlRfR0VUKGhkci0+ZnJlZW1hcFswXS5zaXplLCBBUkNIX0NPTlZFUlQpIDwKKwkgICAgKGVudHNpemUgKyAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2VudHJ5X3QpKSkKKwkJcmV0dXJuKFhGU19FUlJPUihFTk9TUEMpKTsKKworCWlmICghYXJncy0+anVzdGNoZWNrKQorCQl4ZnNfZGlyX2xlYWZfYWRkX3dvcmsoYnAsIGFyZ3MsIGluZGV4LCAwKTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBBZGQgYSBuYW1lIHRvIGEgbGVhZiBkaXJlY3Rvcnkgc3RydWN0dXJlLgorICovCitTVEFUSUMgdm9pZAoreGZzX2Rpcl9sZWFmX2FkZF93b3JrKHhmc19kYWJ1Zl90ICpicCwgeGZzX2RhX2FyZ3NfdCAqYXJncywgaW50IGluZGV4LAorCQkgICAgICBpbnQgbWFwaW5kZXgpCit7CisJeGZzX2Rpcl9sZWFmYmxvY2tfdCAqbGVhZjsKKwl4ZnNfZGlyX2xlYWZfaGRyX3QgKmhkcjsKKwl4ZnNfZGlyX2xlYWZfZW50cnlfdCAqZW50cnk7CisJeGZzX2Rpcl9sZWFmX25hbWVfdCAqbmFtZXN0OworCXhmc19kaXJfbGVhZl9tYXBfdCAqbWFwOworCS8qIFJFRkVSRU5DRUQgKi8KKwl4ZnNfbW91bnRfdCAqbXA7CisJaW50IHRtcCwgaTsKKworCWxlYWYgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSX0xFQUZfTUFHSUMpOworCWhkciA9ICZsZWFmLT5oZHI7CisJQVNTRVJUKChtYXBpbmRleCA+PSAwKSAmJiAobWFwaW5kZXggPCBYRlNfRElSX0xFQUZfTUFQU0laRSkpOworCUFTU0VSVCgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDw9IElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSkpOworCisJLyoKKwkgKiBGb3JjZSBvcGVuIHNvbWUgc3BhY2UgaW4gdGhlIGVudHJ5IGFycmF5IGFuZCBmaWxsIGl0IGluLgorCSAqLworCWVudHJ5ID0gJmxlYWYtPmVudHJpZXNbaW5kZXhdOworCWlmIChpbmRleCA8IElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSkgeworCQl0bXAgID0gSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gaW5kZXg7CisJCXRtcCAqPSAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2VudHJ5X3QpOworCQltZW1tb3ZlKGVudHJ5ICsgMSwgZW50cnksIHRtcCk7CisJCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicCwKKwkJICAgIFhGU19EQV9MT0dSQU5HRShsZWFmLCBlbnRyeSwgdG1wICsgKHVpbnQpc2l6ZW9mKCplbnRyeSkpKTsKKwl9CisJSU5UX01PRChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQsICsxKTsKKworCS8qCisJICogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBuZXcgc3RyaW5nIChhdCB0aGUgZW5kIG9mIHRoZSBydW4pLgorCSAqLworCW1hcCA9ICZoZHItPmZyZWVtYXBbbWFwaW5kZXhdOworCW1wID0gYXJncy0+dHJhbnMtPnRfbW91bnRwOworCUFTU0VSVChJTlRfR0VUKG1hcC0+YmFzZSwgQVJDSF9DT05WRVJUKSA8IFhGU19MQlNJWkUobXApKTsKKwlBU1NFUlQoSU5UX0dFVChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCkgPj0gWEZTX0RJUl9MRUFGX0VOVFNJWkVfQllOQU1FKGFyZ3MtPm5hbWVsZW4pKTsKKwlBU1NFUlQoSU5UX0dFVChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCkgPCBYRlNfTEJTSVpFKG1wKSk7CisJSU5UX01PRChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCwgLShYRlNfRElSX0xFQUZfRU5UU0laRV9CWU5BTUUoYXJncy0+bmFtZWxlbikpKTsKKwlJTlRfU0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQsIElOVF9HRVQobWFwLT5iYXNlLCBBUkNIX0NPTlZFUlQpICsgSU5UX0dFVChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCkpOworCUlOVF9TRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCwgYXJncy0+aGFzaHZhbCk7CisJZW50cnktPm5hbWVsZW4gPSBhcmdzLT5uYW1lbGVuOworCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicCwKKwkgICAgWEZTX0RBX0xPR1JBTkdFKGxlYWYsIGVudHJ5LCBzaXplb2YoKmVudHJ5KSkpOworCisJLyoKKwkgKiBDb3B5IHRoZSBzdHJpbmcgYW5kIGlub2RlIG51bWJlciBpbnRvIHRoZSBuZXcgc3BhY2UuCisJICovCisJbmFtZXN0ID0gWEZTX0RJUl9MRUFGX05BTUVTVFJVQ1QobGVhZiwgSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKSk7CisJWEZTX0RJUl9TRl9QVVRfRElSSU5PKCZhcmdzLT5pbnVtYmVyLCAmbmFtZXN0LT5pbnVtYmVyKTsKKwltZW1jcHkobmFtZXN0LT5uYW1lLCBhcmdzLT5uYW1lLCBhcmdzLT5uYW1lbGVuKTsKKwl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAsCisJICAgIFhGU19EQV9MT0dSQU5HRShsZWFmLCBuYW1lc3QsIFhGU19ESVJfTEVBRl9FTlRTSVpFX0JZRU5UUlkoZW50cnkpKSk7CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgY29udHJvbCBpbmZvIGZvciB0aGlzIGxlYWYgbm9kZQorCSAqLworCWlmIChJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpIDwgSU5UX0dFVChoZHItPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKSkKKwkJSU5UX0NPUFkoaGRyLT5maXJzdHVzZWQsIGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpOworCUFTU0VSVChJTlRfR0VUKGhkci0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpID49ICgoSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpKnNpemVvZigqZW50cnkpKStzaXplb2YoKmhkcikpKTsKKwl0bXAgPSAoSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpLTEpICogKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KQorCQkJKyAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2hkcl90KTsKKwltYXAgPSAmaGRyLT5mcmVlbWFwWzBdOworCWZvciAoaSA9IDA7IGkgPCBYRlNfRElSX0xFQUZfTUFQU0laRTsgbWFwKyssIGkrKykgeworCQlpZiAoSU5UX0dFVChtYXAtPmJhc2UsIEFSQ0hfQ09OVkVSVCkgPT0gdG1wKSB7CisJCQlJTlRfTU9EKG1hcC0+YmFzZSwgQVJDSF9DT05WRVJULCAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2VudHJ5X3QpKTsKKwkJCUlOVF9NT0QobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQsIC0oKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KSkpOworCQl9CisJfQorCUlOVF9NT0QoaGRyLT5uYW1lYnl0ZXMsIEFSQ0hfQ09OVkVSVCwgYXJncy0+bmFtZWxlbik7CisJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwLAorCQlYRlNfREFfTE9HUkFOR0UobGVhZiwgaGRyLCBzaXplb2YoKmhkcikpKTsKK30KKworLyoKKyAqIEdhcmJhZ2UgY29sbGVjdCBhIGxlYWYgZGlyZWN0b3J5IGJsb2NrIGJ5IGNvcHlpbmcgaXQgdG8gYSBuZXcgYnVmZmVyLgorICovCitTVEFUSUMgaW50Cit4ZnNfZGlyX2xlYWZfY29tcGFjdCh4ZnNfdHJhbnNfdCAqdHJhbnMsIHhmc19kYWJ1Zl90ICpicCwgaW50IG11c3RoYXZlLAorCQkgICAgIGludCBqdXN0Y2hlY2spCit7CisJeGZzX2Rpcl9sZWFmYmxvY2tfdCAqbGVhZl9zLCAqbGVhZl9kOworCXhmc19kaXJfbGVhZl9oZHJfdCAqaGRyX3MsICpoZHJfZDsKKwl4ZnNfbW91bnRfdCAqbXA7CisJY2hhciAqdG1wYnVmZmVyOworCWNoYXIgKnRtcGJ1ZmZlcjI9TlVMTDsKKwlpbnQgcnZhbDsKKwlpbnQgbGJzaXplOworCisJbXAgPSB0cmFucy0+dF9tb3VudHA7CisJbGJzaXplID0gWEZTX0xCU0laRShtcCk7CisJdG1wYnVmZmVyID0ga21lbV9hbGxvYyhsYnNpemUsIEtNX1NMRUVQKTsKKwlBU1NFUlQodG1wYnVmZmVyICE9IE5VTEwpOworCW1lbWNweSh0bXBidWZmZXIsIGJwLT5kYXRhLCBsYnNpemUpOworCisJLyoKKwkgKiBNYWtlIGEgc2Vjb25kIGNvcHkgaW4gY2FzZSB4ZnNfZGlyX2xlYWZfbW92ZWVudHMoKQorCSAqIGJlbG93IGRlc3Ryb3lzIHRoZSBvcmlnaW5hbC4KKwkgKi8KKwlpZiAobXVzdGhhdmUgfHwganVzdGNoZWNrKSB7CisJCXRtcGJ1ZmZlcjIgPSBrbWVtX2FsbG9jKGxic2l6ZSwgS01fU0xFRVApOworCQltZW1jcHkodG1wYnVmZmVyMiwgYnAtPmRhdGEsIGxic2l6ZSk7CisJfQorCW1lbXNldChicC0+ZGF0YSwgMCwgbGJzaXplKTsKKworCS8qCisJICogQ29weSBiYXNpYyBpbmZvcm1hdGlvbgorCSAqLworCWxlYWZfcyA9ICh4ZnNfZGlyX2xlYWZibG9ja190ICopdG1wYnVmZmVyOworCWxlYWZfZCA9IGJwLT5kYXRhOworCWhkcl9zID0gJmxlYWZfcy0+aGRyOworCWhkcl9kID0gJmxlYWZfZC0+aGRyOworCWhkcl9kLT5pbmZvID0gaGRyX3MtPmluZm87CS8qIHN0cnVjdCBjb3B5ICovCisJSU5UX1NFVChoZHJfZC0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQsIGxic2l6ZSk7CisJaWYgKCFoZHJfZC0+Zmlyc3R1c2VkKQorCQlJTlRfU0VUKGhkcl9kLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCwgbGJzaXplIC0gMSk7CisJaGRyX2QtPm5hbWVieXRlcyA9IDA7CisJaGRyX2QtPmNvdW50ID0gMDsKKwloZHJfZC0+aG9sZXMgPSAwOworCUlOVF9TRVQoaGRyX2QtPmZyZWVtYXBbMF0uYmFzZSwgQVJDSF9DT05WRVJULCBzaXplb2YoeGZzX2Rpcl9sZWFmX2hkcl90KSk7CisJSU5UX1NFVChoZHJfZC0+ZnJlZW1hcFswXS5zaXplLCBBUkNIX0NPTlZFUlQsIElOVF9HRVQoaGRyX2QtPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKSAtIElOVF9HRVQoaGRyX2QtPmZyZWVtYXBbMF0uYmFzZSwgQVJDSF9DT05WRVJUKSk7CisKKwkvKgorCSAqIENvcHkgYWxsIGVudHJ5J3MgaW4gdGhlIHNhbWUgKHNvcnRlZCkgb3JkZXIsCisJICogYnV0IGFsbG9jYXRlIGZpbGVuYW1lcyBwYWNrZWQgYW5kIGluIHNlcXVlbmNlLgorCSAqIFRoaXMgY2hhbmdlcyB0aGUgc291cmNlIChsZWFmX3MpIGFzIHdlbGwuCisJICovCisJeGZzX2Rpcl9sZWFmX21vdmVlbnRzKGxlYWZfcywgMCwgbGVhZl9kLCAwLCAoaW50KUlOVF9HRVQoaGRyX3MtPmNvdW50LCBBUkNIX0NPTlZFUlQpLCBtcCk7CisKKwlpZiAobXVzdGhhdmUgJiYgSU5UX0dFVChoZHJfZC0+ZnJlZW1hcFswXS5zaXplLCBBUkNIX0NPTlZFUlQpIDwgbXVzdGhhdmUpCisJCXJ2YWwgPSBYRlNfRVJST1IoRU5PU1BDKTsKKwllbHNlCisJCXJ2YWwgPSAwOworCisJaWYgKGp1c3RjaGVjayB8fCBydmFsID09IEVOT1NQQykgeworCQlBU1NFUlQodG1wYnVmZmVyMik7CisJCW1lbWNweShicC0+ZGF0YSwgdG1wYnVmZmVyMiwgbGJzaXplKTsKKwl9IGVsc2UgeworCQl4ZnNfZGFfbG9nX2J1Zih0cmFucywgYnAsIDAsIGxic2l6ZSAtIDEpOworCX0KKworCWttZW1fZnJlZSh0bXBidWZmZXIsIGxic2l6ZSk7CisJaWYgKG11c3RoYXZlIHx8IGp1c3RjaGVjaykKKwkJa21lbV9mcmVlKHRtcGJ1ZmZlcjIsIGxic2l6ZSk7CisJcmV0dXJuKHJ2YWwpOworfQorCisvKgorICogUmVkaXN0cmlidXRlIHRoZSBkaXJlY3RvcnkgZW50cmllcyBiZXR3ZWVuIHR3byBsZWFmIG5vZGVzLAorICogdGFraW5nIGludG8gYWNjb3VudCB0aGUgc2l6ZSBvZiB0aGUgbmV3IGVudHJ5LgorICoKKyAqIE5PVEU6IGlmIG5ldyBibG9jayBpcyBlbXB0eSwgdGhlbiBpdCB3aWxsIGdldCB0aGUgdXBwZXIgaGFsZiBvZiBvbGQgYmxvY2suCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfZGlyX2xlYWZfcmViYWxhbmNlKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwgeGZzX2RhX3N0YXRlX2Jsa190ICpibGsxLAorCQkJCSAgICAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrMikKK3sKKwl4ZnNfZGFfc3RhdGVfYmxrX3QgKnRtcF9ibGs7CisJeGZzX2Rpcl9sZWFmYmxvY2tfdCAqbGVhZjEsICpsZWFmMjsKKwl4ZnNfZGlyX2xlYWZfaGRyX3QgKmhkcjEsICpoZHIyOworCWludCBjb3VudCwgdG90YWxsZW4sIG1heCwgc3BhY2UsIHN3YXA7CisKKwkvKgorCSAqIFNldCB1cCBlbnZpcm9ubWVudC4KKwkgKi8KKwlBU1NFUlQoYmxrMS0+bWFnaWMgPT0gWEZTX0RJUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQoYmxrMi0+bWFnaWMgPT0gWEZTX0RJUl9MRUFGX01BR0lDKTsKKwlsZWFmMSA9IGJsazEtPmJwLT5kYXRhOworCWxlYWYyID0gYmxrMi0+YnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZjEtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKElOVF9HRVQobGVhZjItPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVJfTEVBRl9NQUdJQyk7CisKKwkvKgorCSAqIENoZWNrIG9yZGVyaW5nIG9mIGJsb2NrcywgcmV2ZXJzZSBpZiBpdCBtYWtlcyB0aGluZ3Mgc2ltcGxlci4KKwkgKi8KKwlzd2FwID0gMDsKKwlpZiAoeGZzX2Rpcl9sZWFmX29yZGVyKGJsazEtPmJwLCBibGsyLT5icCkpIHsKKwkJdG1wX2JsayA9IGJsazE7CisJCWJsazEgPSBibGsyOworCQlibGsyID0gdG1wX2JsazsKKwkJbGVhZjEgPSBibGsxLT5icC0+ZGF0YTsKKwkJbGVhZjIgPSBibGsyLT5icC0+ZGF0YTsKKwkJc3dhcCA9IDE7CisJfQorCWhkcjEgPSAmbGVhZjEtPmhkcjsKKwloZHIyID0gJmxlYWYyLT5oZHI7CisKKwkvKgorCSAqIEV4YW1pbmUgZW50cmllcyB1bnRpbCB3ZSByZWR1Y2UgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgaW4KKwkgKiBieXRlIHVzYWdlIGJldHdlZW4gdGhlIHR3byBibG9ja3MgdG8gYSBtaW5pbXVtLiAgVGhlbiBnZXQKKwkgKiB0aGUgZGlyZWN0aW9uIHRvIGNvcHkgYW5kIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gbW92ZS4KKwkgKi8KKwlzdGF0ZS0+aW5sZWFmID0geGZzX2Rpcl9sZWFmX2ZpZ3VyZV9iYWxhbmNlKHN0YXRlLCBibGsxLCBibGsyLAorCQkJCQkJCSAgICZjb3VudCwgJnRvdGFsbGVuKTsKKwlpZiAoc3dhcCkKKwkJc3RhdGUtPmlubGVhZiA9ICFzdGF0ZS0+aW5sZWFmOworCisJLyoKKwkgKiBNb3ZlIGFueSBlbnRyaWVzIHJlcXVpcmVkIGZyb20gbGVhZiB0byBsZWFmOgorCSAqLworCWlmIChjb3VudCA8IElOVF9HRVQoaGRyMS0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJLyoKKwkJICogRmlndXJlIHRoZSB0b3RhbCBieXRlcyB0byBiZSBhZGRlZCB0byB0aGUgZGVzdGluYXRpb24gbGVhZi4KKwkJICovCisJCWNvdW50ID0gSU5UX0dFVChoZHIxLT5jb3VudCwgQVJDSF9DT05WRVJUKSAtIGNvdW50OwkvKiBudW1iZXIgZW50cmllcyBiZWluZyBtb3ZlZCAqLworCQlzcGFjZSAgPSBJTlRfR0VUKGhkcjEtPm5hbWVieXRlcywgQVJDSF9DT05WRVJUKSAtIHRvdGFsbGVuOworCQlzcGFjZSArPSBjb3VudCAqICgodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX25hbWVfdCktMSk7CisJCXNwYWNlICs9IGNvdW50ICogKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KTsKKworCQkvKgorCQkgKiBsZWFmMiBpcyB0aGUgZGVzdGluYXRpb24sIGNvbXBhY3QgaXQgaWYgaXQgbG9va3MgdGlnaHQuCisJCSAqLworCQltYXggID0gSU5UX0dFVChoZHIyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkgLSAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2hkcl90KTsKKwkJbWF4IC09IElOVF9HRVQoaGRyMi0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgKiAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2VudHJ5X3QpOworCQlpZiAoc3BhY2UgPiBtYXgpIHsKKwkJCXhmc19kaXJfbGVhZl9jb21wYWN0KHN0YXRlLT5hcmdzLT50cmFucywgYmxrMi0+YnAsCisJCQkJCQkJCSAwLCAwKTsKKwkJfQorCisJCS8qCisJCSAqIE1vdmUgaGlnaCBlbnRyaWVzIGZyb20gbGVhZjEgdG8gbG93IGVuZCBvZiBsZWFmMi4KKwkJICovCisJCXhmc19kaXJfbGVhZl9tb3ZlZW50cyhsZWFmMSwgSU5UX0dFVChoZHIxLT5jb3VudCwgQVJDSF9DT05WRVJUKSAtIGNvdW50LAorCQkJCQkgICAgIGxlYWYyLCAwLCBjb3VudCwgc3RhdGUtPm1wKTsKKworCQl4ZnNfZGFfbG9nX2J1ZihzdGF0ZS0+YXJncy0+dHJhbnMsIGJsazEtPmJwLCAwLAorCQkJCQkJICAgc3RhdGUtPmJsb2Nrc2l6ZS0xKTsKKwkJeGZzX2RhX2xvZ19idWYoc3RhdGUtPmFyZ3MtPnRyYW5zLCBibGsyLT5icCwgMCwKKwkJCQkJCSAgIHN0YXRlLT5ibG9ja3NpemUtMSk7CisKKwl9IGVsc2UgaWYgKGNvdW50ID4gSU5UX0dFVChoZHIxLT5jb3VudCwgQVJDSF9DT05WRVJUKSkgeworCQkvKgorCQkgKiBGaWd1cmUgdGhlIHRvdGFsIGJ5dGVzIHRvIGJlIGFkZGVkIHRvIHRoZSBkZXN0aW5hdGlvbiBsZWFmLgorCQkgKi8KKwkJY291bnQgLT0gSU5UX0dFVChoZHIxLT5jb3VudCwgQVJDSF9DT05WRVJUKTsJCS8qIG51bWJlciBlbnRyaWVzIGJlaW5nIG1vdmVkICovCisJCXNwYWNlICA9IHRvdGFsbGVuIC0gSU5UX0dFVChoZHIxLT5uYW1lYnl0ZXMsIEFSQ0hfQ09OVkVSVCk7CisJCXNwYWNlICs9IGNvdW50ICogKCh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfbmFtZV90KS0xKTsKKwkJc3BhY2UgKz0gY291bnQgKiAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2VudHJ5X3QpOworCisJCS8qCisJCSAqIGxlYWYxIGlzIHRoZSBkZXN0aW5hdGlvbiwgY29tcGFjdCBpdCBpZiBpdCBsb29rcyB0aWdodC4KKwkJICovCisJCW1heCAgPSBJTlRfR0VUKGhkcjEtPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKSAtICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfaGRyX3QpOworCQltYXggLT0gSU5UX0dFVChoZHIxLT5jb3VudCwgQVJDSF9DT05WRVJUKSAqICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCk7CisJCWlmIChzcGFjZSA+IG1heCkgeworCQkJeGZzX2Rpcl9sZWFmX2NvbXBhY3Qoc3RhdGUtPmFyZ3MtPnRyYW5zLCBibGsxLT5icCwKKwkJCQkJCQkJIDAsIDApOworCQl9CisKKwkJLyoKKwkJICogTW92ZSBsb3cgZW50cmllcyBmcm9tIGxlYWYyIHRvIGhpZ2ggZW5kIG9mIGxlYWYxLgorCQkgKi8KKwkJeGZzX2Rpcl9sZWFmX21vdmVlbnRzKGxlYWYyLCAwLCBsZWFmMSwgKGludClJTlRfR0VUKGhkcjEtPmNvdW50LCBBUkNIX0NPTlZFUlQpLAorCQkJCQkgICAgIGNvdW50LCBzdGF0ZS0+bXApOworCisJCXhmc19kYV9sb2dfYnVmKHN0YXRlLT5hcmdzLT50cmFucywgYmxrMS0+YnAsIDAsCisJCQkJCQkgICBzdGF0ZS0+YmxvY2tzaXplLTEpOworCQl4ZnNfZGFfbG9nX2J1ZihzdGF0ZS0+YXJncy0+dHJhbnMsIGJsazItPmJwLCAwLAorCQkJCQkJICAgc3RhdGUtPmJsb2Nrc2l6ZS0xKTsKKwl9CisKKwkvKgorCSAqIENvcHkgb3V0IGxhc3QgaGFzaHZhbCBpbiBlYWNoIGJsb2NrIGZvciBCLXRyZWUgY29kZS4KKwkgKi8KKwlibGsxLT5oYXNodmFsID0gSU5UX0dFVChsZWFmMS0+ZW50cmllc1sgSU5UX0dFVChsZWFmMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTEgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpOworCWJsazItPmhhc2h2YWwgPSBJTlRfR0VUKGxlYWYyLT5lbnRyaWVzWyBJTlRfR0VUKGxlYWYyLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMSBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisKKwkvKgorCSAqIEFkanVzdCB0aGUgZXhwZWN0ZWQgaW5kZXggZm9yIGluc2VydGlvbi4KKwkgKiBHUk9UOiB0aGlzIGRvZXNuJ3Qgd29yayB1bmxlc3MgYmxrMiB3YXMgb3JpZ2luYWxseSBlbXB0eS4KKwkgKi8KKwlpZiAoIXN0YXRlLT5pbmxlYWYpIHsKKwkJYmxrMi0+aW5kZXggPSBibGsxLT5pbmRleCAtIElOVF9HRVQobGVhZjEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwl9Cit9CisKKy8qCisgKiBFeGFtaW5lIGVudHJpZXMgdW50aWwgd2UgcmVkdWNlIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGluCisgKiBieXRlIHVzYWdlIGJldHdlZW4gdGhlIHR3byBibG9ja3MgdG8gYSBtaW5pbXVtLgorICogR1JPVDogSXMgdGhpcyByZWFsbHkgbmVjZXNzYXJ5PyAgV2l0aCBvdGhlciB0aGFuIGEgNTEyIGJ5dGUgYmxvY2tzaXplLAorICogR1JPVDogdGhlcmUgd2lsbCBhbHdheXMgYmUgZW5vdWdoIHJvb20gaW4gZWl0aGVyIGJsb2NrIGZvciBhIG5ldyBlbnRyeS4KKyAqIEdST1Q6IERvIGEgZG91YmxlLXNwbGl0IGZvciB0aGlzIGNhc2U/CisgKi8KK1NUQVRJQyBpbnQKK3hmc19kaXJfbGVhZl9maWd1cmVfYmFsYW5jZSh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsCisJCQkJCSAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrMSwKKwkJCQkJICAgeGZzX2RhX3N0YXRlX2Jsa190ICpibGsyLAorCQkJCQkgICBpbnQgKmNvdW50YXJnLCBpbnQgKm5hbWVieXRlc2FyZykKK3sKKwl4ZnNfZGlyX2xlYWZibG9ja190ICpsZWFmMSwgKmxlYWYyOworCXhmc19kaXJfbGVhZl9oZHJfdCAqaGRyMSwgKmhkcjI7CisJeGZzX2Rpcl9sZWFmX2VudHJ5X3QgKmVudHJ5OworCWludCBjb3VudCwgbWF4LCB0b3RhbGxlbiwgaGFsZjsKKwlpbnQgbGFzdGRlbHRhLCBmb3VuZGl0LCB0bXA7CisKKwkvKgorCSAqIFNldCB1cCBlbnZpcm9ubWVudC4KKwkgKi8KKwlsZWFmMSA9IGJsazEtPmJwLT5kYXRhOworCWxlYWYyID0gYmxrMi0+YnAtPmRhdGE7CisJaGRyMSA9ICZsZWFmMS0+aGRyOworCWhkcjIgPSAmbGVhZjItPmhkcjsKKwlmb3VuZGl0ID0gMDsKKwl0b3RhbGxlbiA9IDA7CisKKwkvKgorCSAqIEV4YW1pbmUgZW50cmllcyB1bnRpbCB3ZSByZWR1Y2UgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgaW4KKwkgKiBieXRlIHVzYWdlIGJldHdlZW4gdGhlIHR3byBibG9ja3MgdG8gYSBtaW5pbXVtLgorCSAqLworCW1heCA9IElOVF9HRVQoaGRyMS0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgKyBJTlRfR0VUKGhkcjItPmNvdW50LCBBUkNIX0NPTlZFUlQpOworCWhhbGYgID0gKG1heCsxKSAqICh1aW50KShzaXplb2YoKmVudHJ5KStzaXplb2YoeGZzX2Rpcl9sZWFmX2VudHJ5X3QpLTEpOworCWhhbGYgKz0gSU5UX0dFVChoZHIxLT5uYW1lYnl0ZXMsIEFSQ0hfQ09OVkVSVCkgKyBJTlRfR0VUKGhkcjItPm5hbWVieXRlcywgQVJDSF9DT05WRVJUKSArIHN0YXRlLT5hcmdzLT5uYW1lbGVuOworCWhhbGYgLz0gMjsKKwlsYXN0ZGVsdGEgPSBzdGF0ZS0+YmxvY2tzaXplOworCWVudHJ5ID0gJmxlYWYxLT5lbnRyaWVzWzBdOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IG1heDsgZW50cnkrKywgY291bnQrKykgeworCisjZGVmaW5lIFhGU19ESVJfQUJTKEEpCSgoKEEpIDwgMCkgPyAtKEEpIDogKEEpKQorCQkvKgorCQkgKiBUaGUgbmV3IGVudHJ5IGlzIGluIHRoZSBmaXJzdCBibG9jaywgYWNjb3VudCBmb3IgaXQuCisJCSAqLworCQlpZiAoY291bnQgPT0gYmxrMS0+aW5kZXgpIHsKKwkJCXRtcCA9IHRvdGFsbGVuICsgKHVpbnQpc2l6ZW9mKCplbnRyeSkKKwkJCQkrIFhGU19ESVJfTEVBRl9FTlRTSVpFX0JZTkFNRShzdGF0ZS0+YXJncy0+bmFtZWxlbik7CisJCQlpZiAoWEZTX0RJUl9BQlMoaGFsZiAtIHRtcCkgPiBsYXN0ZGVsdGEpCisJCQkJYnJlYWs7CisJCQlsYXN0ZGVsdGEgPSBYRlNfRElSX0FCUyhoYWxmIC0gdG1wKTsKKwkJCXRvdGFsbGVuID0gdG1wOworCQkJZm91bmRpdCA9IDE7CisJCX0KKworCQkvKgorCQkgKiBXcmFwIGFyb3VuZCBpbnRvIHRoZSBzZWNvbmQgYmxvY2sgaWYgbmVjZXNzYXJ5LgorCQkgKi8KKwkJaWYgKGNvdW50ID09IElOVF9HRVQoaGRyMS0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCWxlYWYxID0gbGVhZjI7CisJCQllbnRyeSA9ICZsZWFmMS0+ZW50cmllc1swXTsKKwkJfQorCisJCS8qCisJCSAqIEZpZ3VyZSBvdXQgaWYgbmV4dCBsZWFmIGVudHJ5IHdvdWxkIGJlIHRvbyBtdWNoLgorCQkgKi8KKwkJdG1wID0gdG90YWxsZW4gKyAodWludClzaXplb2YoKmVudHJ5KQorCQkJCSsgWEZTX0RJUl9MRUFGX0VOVFNJWkVfQllFTlRSWShlbnRyeSk7CisJCWlmIChYRlNfRElSX0FCUyhoYWxmIC0gdG1wKSA+IGxhc3RkZWx0YSkKKwkJCWJyZWFrOworCQlsYXN0ZGVsdGEgPSBYRlNfRElSX0FCUyhoYWxmIC0gdG1wKTsKKwkJdG90YWxsZW4gPSB0bXA7CisjdW5kZWYgWEZTX0RJUl9BQlMKKwl9CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG5hbWVieXRlcyB0aGF0IHdpbGwgZW5kIHVwIGluIGxvd2VyIGJsb2NrLgorCSAqIElmIG5ldyBlbnRyeSBub3QgaW4gbG93ZXIgYmxvY2ssIGZpeCB1cCB0aGUgY291bnQuCisJICovCisJdG90YWxsZW4gLT0KKwkJY291bnQgKiAodWludCkoc2l6ZW9mKCplbnRyeSkrc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KS0xKTsKKwlpZiAoZm91bmRpdCkgeworCQl0b3RhbGxlbiAtPSAoc2l6ZW9mKCplbnRyeSkrc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KS0xKSArCisJCQkgICAgc3RhdGUtPmFyZ3MtPm5hbWVsZW47CisJfQorCisJKmNvdW50YXJnID0gY291bnQ7CisJKm5hbWVieXRlc2FyZyA9IHRvdGFsbGVuOworCXJldHVybihmb3VuZGl0KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJvdXRpbmVzIHVzZWQgZm9yIHNocmlua2luZyB0aGUgQnRyZWUuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBDaGVjayBhIGxlYWYgYmxvY2sgYW5kIGl0cyBuZWlnaGJvcnMgdG8gc2VlIGlmIHRoZSBibG9jayBzaG91bGQgYmUKKyAqIGNvbGxhcHNlZCBpbnRvIG9uZSBvciB0aGUgb3RoZXIgbmVpZ2hib3IuICBBbHdheXMga2VlcCB0aGUgYmxvY2sKKyAqIHdpdGggdGhlIHNtYWxsZXIgYmxvY2sgbnVtYmVyLgorICogSWYgdGhlIGN1cnJlbnQgYmxvY2sgaXMgb3ZlciA1MCUgZnVsbCwgZG9uJ3QgdHJ5IHRvIGpvaW4gaXQsIHJldHVybiAwLgorICogSWYgdGhlIGJsb2NrIGlzIGVtcHR5LCBmaWxsIGluIHRoZSBzdGF0ZSBzdHJ1Y3R1cmUgYW5kIHJldHVybiAyLgorICogSWYgaXQgY2FuIGJlIGNvbGxhcHNlZCwgZmlsbCBpbiB0aGUgc3RhdGUgc3RydWN0dXJlIGFuZCByZXR1cm4gMS4KKyAqIElmIG5vdGhpbmcgY2FuIGJlIGRvbmUsIHJldHVybiAwLgorICovCitpbnQKK3hmc19kaXJfbGVhZl90b29zbWFsbCh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIGludCAqYWN0aW9uKQoreworCXhmc19kaXJfbGVhZmJsb2NrX3QgKmxlYWY7CisJeGZzX2RhX3N0YXRlX2Jsa190ICpibGs7CisJeGZzX2RhX2Jsa2luZm9fdCAqaW5mbzsKKwlpbnQgY291bnQsIGJ5dGVzLCBmb3J3YXJkLCBlcnJvciwgcmV0dmFsLCBpOworCXhmc19kYWJsa190IGJsa25vOworCXhmc19kYWJ1Zl90ICpicDsKKworCS8qCisJICogQ2hlY2sgZm9yIHRoZSBkZWdlbmVyYXRlIGNhc2Ugb2YgdGhlIGJsb2NrIGJlaW5nIG92ZXIgNTAlIGZ1bGwuCisJICogSWYgc28sIGl0J3Mgbm90IHdvcnRoIGV2ZW4gbG9va2luZyB0byBzZWUgaWYgd2UgbWlnaHQgYmUgYWJsZQorCSAqIHRvIGNvYWxlc2NlIHdpdGggYSBzaWJsaW5nLgorCSAqLworCWJsayA9ICZzdGF0ZS0+cGF0aC5ibGtbIHN0YXRlLT5wYXRoLmFjdGl2ZS0xIF07CisJaW5mbyA9IGJsay0+YnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQoaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUl9MRUFGX01BR0lDKTsKKwlsZWFmID0gKHhmc19kaXJfbGVhZmJsb2NrX3QgKilpbmZvOworCWNvdW50ID0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJYnl0ZXMgPSAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2hkcl90KSArCisJCWNvdW50ICogKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KSArCisJCWNvdW50ICogKCh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfbmFtZV90KS0xKSArCisJCUlOVF9HRVQobGVhZi0+aGRyLm5hbWVieXRlcywgQVJDSF9DT05WRVJUKTsKKwlpZiAoYnl0ZXMgPiAoc3RhdGUtPmJsb2Nrc2l6ZSA+PiAxKSkgeworCQkqYWN0aW9uID0gMDsJLyogYmxrIG92ZXIgNTAlLCBkb24ndCB0cnkgdG8gam9pbiAqLworCQlyZXR1cm4oMCk7CisJfQorCisJLyoKKwkgKiBDaGVjayBmb3IgdGhlIGRlZ2VuZXJhdGUgY2FzZSBvZiB0aGUgYmxvY2sgYmVpbmcgZW1wdHkuCisJICogSWYgdGhlIGJsb2NrIGlzIGVtcHR5LCB3ZSdsbCBzaW1wbHkgZGVsZXRlIGl0LCBubyBuZWVkIHRvCisJICogY29hbGVzY2UgaXQgd2l0aCBhIHNpYmxpbmcgYmxvY2suICBXZSBjaG9vc2UgKGFyaWJ0cmFyaWx5KQorCSAqIHRvIG1lcmdlIHdpdGggdGhlIGZvcndhcmQgYmxvY2sgdW5sZXNzIGl0IGlzIE5VTEwuCisJICovCisJaWYgKGNvdW50ID09IDApIHsKKwkJLyoKKwkJICogTWFrZSBhbHRwYXRoIHBvaW50IHRvIHRoZSBibG9jayB3ZSB3YW50IHRvIGtlZXAgYW5kCisJCSAqIHBhdGggcG9pbnQgdG8gdGhlIGJsb2NrIHdlIHdhbnQgdG8gZHJvcCAodGhpcyBvbmUpLgorCQkgKi8KKwkJZm9yd2FyZCA9IGluZm8tPmZvcnc7CisJCW1lbWNweSgmc3RhdGUtPmFsdHBhdGgsICZzdGF0ZS0+cGF0aCwgc2l6ZW9mKHN0YXRlLT5wYXRoKSk7CisJCWVycm9yID0geGZzX2RhX3BhdGhfc2hpZnQoc3RhdGUsICZzdGF0ZS0+YWx0cGF0aCwgZm9yd2FyZCwKKwkJCQkJCSAwLCAmcmV0dmFsKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuKGVycm9yKTsKKwkJaWYgKHJldHZhbCkgeworCQkJKmFjdGlvbiA9IDA7CisJCX0gZWxzZSB7CisJCQkqYWN0aW9uID0gMjsKKwkJfQorCQlyZXR1cm4oMCk7CisJfQorCisJLyoKKwkgKiBFeGFtaW5lIGVhY2ggc2libGluZyBibG9jayB0byBzZWUgaWYgd2UgY2FuIGNvYWxlc2NlIHdpdGgKKwkgKiBhdCBsZWFzdCAyNSUgZnJlZSBzcGFjZSB0byBzcGFyZS4gIFdlIG5lZWQgdG8gZmlndXJlIG91dAorCSAqIHdoZXRoZXIgdG8gbWVyZ2Ugd2l0aCB0aGUgZm9yd2FyZCBvciB0aGUgYmFja3dhcmQgYmxvY2suCisJICogV2UgcHJlZmVyIGNvYWxlc2Npbmcgd2l0aCB0aGUgbG93ZXIgbnVtYmVyZWQgc2libGluZyBzbyBhcworCSAqIHRvIHNocmluayBhIGRpcmVjdG9yeSBvdmVyIHRpbWUuCisJICovCisJZm9yd2FyZCA9IChJTlRfR0VUKGluZm8tPmZvcncsIEFSQ0hfQ09OVkVSVCkgPCBJTlRfR0VUKGluZm8tPmJhY2ssIEFSQ0hfQ09OVkVSVCkpOwkvKiBzdGFydCB3aXRoIHNtYWxsZXIgYmxrIG51bSAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBmb3J3YXJkID0gIWZvcndhcmQsIGkrKykgeworCQlpZiAoZm9yd2FyZCkKKwkJCWJsa25vID0gSU5UX0dFVChpbmZvLT5mb3J3LCBBUkNIX0NPTlZFUlQpOworCQllbHNlCisJCQlibGtubyA9IElOVF9HRVQoaW5mby0+YmFjaywgQVJDSF9DT05WRVJUKTsKKwkJaWYgKGJsa25vID09IDApCisJCQljb250aW51ZTsKKwkJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoc3RhdGUtPmFyZ3MtPnRyYW5zLCBzdGF0ZS0+YXJncy0+ZHAsCisJCQkJCQkJICAgIGJsa25vLCAtMSwgJmJwLAorCQkJCQkJCSAgICBYRlNfREFUQV9GT1JLKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuKGVycm9yKTsKKwkJQVNTRVJUKGJwICE9IE5VTEwpOworCisJCWxlYWYgPSAoeGZzX2Rpcl9sZWFmYmxvY2tfdCAqKWluZm87CisJCWNvdW50ICA9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQlieXRlcyAgPSBzdGF0ZS0+YmxvY2tzaXplIC0gKHN0YXRlLT5ibG9ja3NpemU+PjIpOworCQlieXRlcyAtPSBJTlRfR0VUKGxlYWYtPmhkci5uYW1lYnl0ZXMsIEFSQ0hfQ09OVkVSVCk7CisJCWxlYWYgPSBicC0+ZGF0YTsKKwkJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUl9MRUFGX01BR0lDKTsKKwkJY291bnQgKz0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCWJ5dGVzIC09IElOVF9HRVQobGVhZi0+aGRyLm5hbWVieXRlcywgQVJDSF9DT05WRVJUKTsKKwkJYnl0ZXMgLT0gY291bnQgKiAoKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9uYW1lX3QpIC0gMSk7CisJCWJ5dGVzIC09IGNvdW50ICogKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KTsKKwkJYnl0ZXMgLT0gKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9oZHJfdCk7CisJCWlmIChieXRlcyA+PSAwKQorCQkJYnJlYWs7CS8qIGZpdHMgd2l0aCBhdCBsZWFzdCAyNSUgdG8gc3BhcmUgKi8KKworCQl4ZnNfZGFfYnJlbHNlKHN0YXRlLT5hcmdzLT50cmFucywgYnApOworCX0KKwlpZiAoaSA+PSAyKSB7CisJCSphY3Rpb24gPSAwOworCQlyZXR1cm4oMCk7CisJfQorCXhmc19kYV9idWZfZG9uZShicCk7CisKKwkvKgorCSAqIE1ha2UgYWx0cGF0aCBwb2ludCB0byB0aGUgYmxvY2sgd2Ugd2FudCB0byBrZWVwICh0aGUgbG93ZXIKKwkgKiBudW1iZXJlZCBibG9jaykgYW5kIHBhdGggcG9pbnQgdG8gdGhlIGJsb2NrIHdlIHdhbnQgdG8gZHJvcC4KKwkgKi8KKwltZW1jcHkoJnN0YXRlLT5hbHRwYXRoLCAmc3RhdGUtPnBhdGgsIHNpemVvZihzdGF0ZS0+cGF0aCkpOworCWlmIChibGtubyA8IGJsay0+Ymxrbm8pIHsKKwkJZXJyb3IgPSB4ZnNfZGFfcGF0aF9zaGlmdChzdGF0ZSwgJnN0YXRlLT5hbHRwYXRoLCBmb3J3YXJkLAorCQkJCQkJIDAsICZyZXR2YWwpOworCX0gZWxzZSB7CisJCWVycm9yID0geGZzX2RhX3BhdGhfc2hpZnQoc3RhdGUsICZzdGF0ZS0+cGF0aCwgZm9yd2FyZCwKKwkJCQkJCSAwLCAmcmV0dmFsKTsKKwl9CisJaWYgKGVycm9yKQorCQlyZXR1cm4oZXJyb3IpOworCWlmIChyZXR2YWwpIHsKKwkJKmFjdGlvbiA9IDA7CisJfSBlbHNlIHsKKwkJKmFjdGlvbiA9IDE7CisJfQorCXJldHVybigwKTsKK30KKworLyoKKyAqIFJlbW92ZSBhIG5hbWUgZnJvbSB0aGUgbGVhZiBkaXJlY3Rvcnkgc3RydWN0dXJlLgorICoKKyAqIFJldHVybiAxIGlmIGxlYWYgaXMgbGVzcyB0aGFuIDM3JSBmdWxsLCAwIGlmID49IDM3JSBmdWxsLgorICogSWYgdHdvIGxlYXZlcyBhcmUgMzclIGZ1bGwsIHdoZW4gY29tYmluZWQgdGhleSB3aWxsIGxlYXZlIDI1JSBmcmVlLgorICovCitpbnQKK3hmc19kaXJfbGVhZl9yZW1vdmUoeGZzX3RyYW5zX3QgKnRyYW5zLCB4ZnNfZGFidWZfdCAqYnAsIGludCBpbmRleCkKK3sKKwl4ZnNfZGlyX2xlYWZibG9ja190ICpsZWFmOworCXhmc19kaXJfbGVhZl9oZHJfdCAqaGRyOworCXhmc19kaXJfbGVhZl9tYXBfdCAqbWFwOworCXhmc19kaXJfbGVhZl9lbnRyeV90ICplbnRyeTsKKwl4ZnNfZGlyX2xlYWZfbmFtZV90ICpuYW1lc3Q7CisJaW50IGJlZm9yZSwgYWZ0ZXIsIHNtYWxsZXN0LCBlbnRzaXplOworCWludCB0YWJsZXNpemUsIHRtcCwgaTsKKwl4ZnNfbW91bnRfdCAqbXA7CisKKwlsZWFmID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUl9MRUFGX01BR0lDKTsKKwloZHIgPSAmbGVhZi0+aGRyOworCW1wID0gdHJhbnMtPnRfbW91bnRwOworCUFTU0VSVCgoSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpID4gMCkgJiYgKElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSA8IChYRlNfTEJTSVpFKG1wKS84KSkpOworCUFTU0VSVCgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDwgSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpKSk7CisJQVNTRVJUKElOVF9HRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkgPj0gKChJTlRfR0VUKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCkqc2l6ZW9mKCplbnRyeSkpK3NpemVvZigqaGRyKSkpOworCWVudHJ5ID0gJmxlYWYtPmVudHJpZXNbaW5kZXhdOworCUFTU0VSVChJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpID49IElOVF9HRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVChJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpIDwgWEZTX0xCU0laRShtcCkpOworCisJLyoKKwkgKiBTY2FuIHRocm91Z2ggZnJlZSByZWdpb24gdGFibGU6CisJICogICAgY2hlY2sgZm9yIGFkamFjZW5jeSBvZiBmcmVlJ2QgZW50cnkgd2l0aCBhbiBleGlzdGluZyBvbmUsCisJICogICAgZmluZCBzbWFsbGVzdCBmcmVlIHJlZ2lvbiBpbiBjYXNlIHdlIG5lZWQgdG8gcmVwbGFjZSBpdCwKKwkgKiAgICBhZGp1c3QgYW55IG1hcCB0aGF0IGJvcmRlcnMgdGhlIGVudHJ5IHRhYmxlLAorCSAqLworCXRhYmxlc2l6ZSA9IElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSAqICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCkKKwkJCSsgKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9oZHJfdCk7CisJbWFwID0gJmhkci0+ZnJlZW1hcFswXTsKKwl0bXAgPSBJTlRfR0VUKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJUKTsKKwliZWZvcmUgPSBhZnRlciA9IC0xOworCXNtYWxsZXN0ID0gWEZTX0RJUl9MRUFGX01BUFNJWkUgLSAxOworCWVudHNpemUgPSBYRlNfRElSX0xFQUZfRU5UU0laRV9CWUVOVFJZKGVudHJ5KTsKKwlmb3IgKGkgPSAwOyBpIDwgWEZTX0RJUl9MRUFGX01BUFNJWkU7IG1hcCsrLCBpKyspIHsKKwkJQVNTRVJUKElOVF9HRVQobWFwLT5iYXNlLCBBUkNIX0NPTlZFUlQpIDwgWEZTX0xCU0laRShtcCkpOworCQlBU1NFUlQoSU5UX0dFVChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCkgPCBYRlNfTEJTSVpFKG1wKSk7CisJCWlmIChJTlRfR0VUKG1hcC0+YmFzZSwgQVJDSF9DT05WRVJUKSA9PSB0YWJsZXNpemUpIHsKKwkJCUlOVF9NT0QobWFwLT5iYXNlLCBBUkNIX0NPTlZFUlQsIC0oKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KSkpOworCQkJSU5UX01PRChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCwgKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KSk7CisJCX0KKworCQlpZiAoKElOVF9HRVQobWFwLT5iYXNlLCBBUkNIX0NPTlZFUlQpICsgSU5UX0dFVChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCkpID09IElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCWJlZm9yZSA9IGk7CisJCX0gZWxzZSBpZiAoSU5UX0dFVChtYXAtPmJhc2UsIEFSQ0hfQ09OVkVSVCkgPT0gKElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkgKyBlbnRzaXplKSkgeworCQkJYWZ0ZXIgPSBpOworCQl9IGVsc2UgaWYgKElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpIDwgdG1wKSB7CisJCQl0bXAgPSBJTlRfR0VUKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJUKTsKKwkJCXNtYWxsZXN0ID0gaTsKKwkJfQorCX0KKworCS8qCisJICogQ29hbGVzY2UgYWRqYWNlbnQgZnJlZW1hcCByZWdpb25zLAorCSAqIG9yIHJlcGxhY2UgdGhlIHNtYWxsZXN0IHJlZ2lvbi4KKwkgKi8KKwlpZiAoKGJlZm9yZSA+PSAwKSB8fCAoYWZ0ZXIgPj0gMCkpIHsKKwkJaWYgKChiZWZvcmUgPj0gMCkgJiYgKGFmdGVyID49IDApKSB7CisJCQltYXAgPSAmaGRyLT5mcmVlbWFwW2JlZm9yZV07CisJCQlJTlRfTU9EKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJULCBlbnRzaXplKTsKKwkJCUlOVF9NT0QobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQsIElOVF9HRVQoaGRyLT5mcmVlbWFwW2FmdGVyXS5zaXplLCBBUkNIX0NPTlZFUlQpKTsKKwkJCWhkci0+ZnJlZW1hcFthZnRlcl0uYmFzZSA9IDA7CisJCQloZHItPmZyZWVtYXBbYWZ0ZXJdLnNpemUgPSAwOworCQl9IGVsc2UgaWYgKGJlZm9yZSA+PSAwKSB7CisJCQltYXAgPSAmaGRyLT5mcmVlbWFwW2JlZm9yZV07CisJCQlJTlRfTU9EKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJULCBlbnRzaXplKTsKKwkJfSBlbHNlIHsKKwkJCW1hcCA9ICZoZHItPmZyZWVtYXBbYWZ0ZXJdOworCQkJSU5UX0NPUFkobWFwLT5iYXNlLCBlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKTsKKwkJCUlOVF9NT0QobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQsIGVudHNpemUpOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogUmVwbGFjZSBzbWFsbGVzdCByZWdpb24gKGlmIGl0IGlzIHNtYWxsZXIgdGhhbiBmcmVlJ2QgZW50cnkpCisJCSAqLworCQltYXAgPSAmaGRyLT5mcmVlbWFwW3NtYWxsZXN0XTsKKwkJaWYgKElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpIDwgZW50c2l6ZSkgeworCQkJSU5UX0NPUFkobWFwLT5iYXNlLCBlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKTsKKwkJCUlOVF9TRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQsIGVudHNpemUpOworCQl9CisJfQorCisJLyoKKwkgKiBEaWQgd2UgcmVtb3ZlIHRoZSBmaXJzdCBlbnRyeT8KKwkgKi8KKwlpZiAoSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKSA9PSBJTlRfR0VUKGhkci0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpKQorCQlzbWFsbGVzdCA9IDE7CisJZWxzZQorCQlzbWFsbGVzdCA9IDA7CisKKwkvKgorCSAqIENvbXByZXNzIHRoZSByZW1haW5pbmcgZW50cmllcyBhbmQgemVybyBvdXQgdGhlIHJlbW92ZWQgc3R1ZmYuCisJICovCisJbmFtZXN0ID0gWEZTX0RJUl9MRUFGX05BTUVTVFJVQ1QobGVhZiwgSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKSk7CisJbWVtc2V0KChjaGFyICopbmFtZXN0LCAwLCBlbnRzaXplKTsKKwl4ZnNfZGFfbG9nX2J1Zih0cmFucywgYnAsIFhGU19EQV9MT0dSQU5HRShsZWFmLCBuYW1lc3QsIGVudHNpemUpKTsKKworCUlOVF9NT0QoaGRyLT5uYW1lYnl0ZXMsIEFSQ0hfQ09OVkVSVCwgLShlbnRyeS0+bmFtZWxlbikpOworCXRtcCA9IChJTlRfR0VUKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgLSBpbmRleCkgKiAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2VudHJ5X3QpOworCW1lbW1vdmUoZW50cnksIGVudHJ5ICsgMSwgdG1wKTsKKwlJTlRfTU9EKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCwgLTEpOworCXhmc19kYV9sb2dfYnVmKHRyYW5zLCBicCwKKwkgICAgWEZTX0RBX0xPR1JBTkdFKGxlYWYsIGVudHJ5LCB0bXAgKyAodWludClzaXplb2YoKmVudHJ5KSkpOworCWVudHJ5ID0gJmxlYWYtPmVudHJpZXNbSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpXTsKKwltZW1zZXQoKGNoYXIgKillbnRyeSwgMCwgc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KSk7CisKKwkvKgorCSAqIElmIHdlIHJlbW92ZWQgdGhlIGZpcnN0IGVudHJ5LCByZS1maW5kIHRoZSBmaXJzdCB1c2VkIGJ5dGUKKwkgKiBpbiB0aGUgbmFtZSBhcmVhLiAgTm90ZSB0aGF0IGlmIHRoZSBlbnRyeSB3YXMgdGhlICJmaXJzdHVzZWQiLAorCSAqIHRoZW4gd2UgZG9uJ3QgaGF2ZSBhICJob2xlIiBpbiBvdXIgYmxvY2sgcmVzdWx0aW5nIGZyb20KKwkgKiByZW1vdmluZyB0aGUgbmFtZS4KKwkgKi8KKwlpZiAoc21hbGxlc3QpIHsKKwkJdG1wID0gWEZTX0xCU0laRShtcCk7CisJCWVudHJ5ID0gJmxlYWYtPmVudHJpZXNbMF07CisJCWZvciAoaSA9IElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKS0xOyBpID49IDA7IGVudHJ5KyssIGktLSkgeworCQkJQVNTRVJUKElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkgPj0gSU5UX0dFVChoZHItPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKSk7CisJCQlBU1NFUlQoSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKSA8IFhGU19MQlNJWkUobXApKTsKKwkJCWlmIChJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpIDwgdG1wKQorCQkJCXRtcCA9IElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCk7CisJCX0KKwkJSU5UX1NFVChoZHItPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJULCB0bXApOworCQlpZiAoIWhkci0+Zmlyc3R1c2VkKQorCQkJSU5UX1NFVChoZHItPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJULCB0bXAgLSAxKTsKKwl9IGVsc2UgeworCQloZHItPmhvbGVzID0gMTsJCS8qIG1hcmsgYXMgbmVlZGluZyBjb21wYWN0aW9uICovCisJfQorCisJeGZzX2RhX2xvZ19idWYodHJhbnMsIGJwLCBYRlNfREFfTE9HUkFOR0UobGVhZiwgaGRyLCBzaXplb2YoKmhkcikpKTsKKworCS8qCisJICogQ2hlY2sgaWYgbGVhZiBpcyBsZXNzIHRoYW4gNTAlIGZ1bGwsIGNhbGxlciBtYXkgd2FudCB0bworCSAqICJqb2luIiB0aGUgbGVhZiB3aXRoIGEgc2libGluZyBpZiBzby4KKwkgKi8KKwl0bXAgID0gKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9oZHJfdCk7CisJdG1wICs9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpICogKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KTsKKwl0bXAgKz0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgKiAoKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9uYW1lX3QpIC0gMSk7CisJdG1wICs9IElOVF9HRVQobGVhZi0+aGRyLm5hbWVieXRlcywgQVJDSF9DT05WRVJUKTsKKwlpZiAodG1wIDwgbXAtPm1fZGlyX21hZ2ljcGN0KQorCQlyZXR1cm4oMSk7CQkJLyogbGVhZiBpcyA8IDM3JSBmdWxsICovCisJcmV0dXJuKDApOworfQorCisvKgorICogTW92ZSBhbGwgdGhlIGRpcmVjdG9yeSBlbnRyaWVzIGZyb20gZHJvcF9sZWFmIGludG8gc2F2ZV9sZWFmLgorICovCit2b2lkCit4ZnNfZGlyX2xlYWZfdW5iYWxhbmNlKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwgeGZzX2RhX3N0YXRlX2Jsa190ICpkcm9wX2JsaywKKwkJCQkgICAgICB4ZnNfZGFfc3RhdGVfYmxrX3QgKnNhdmVfYmxrKQoreworCXhmc19kaXJfbGVhZmJsb2NrX3QgKmRyb3BfbGVhZiwgKnNhdmVfbGVhZiwgKnRtcF9sZWFmOworCXhmc19kaXJfbGVhZl9oZHJfdCAqZHJvcF9oZHIsICpzYXZlX2hkciwgKnRtcF9oZHI7CisJeGZzX21vdW50X3QgKm1wOworCWNoYXIgKnRtcGJ1ZmZlcjsKKworCS8qCisJICogU2V0IHVwIGVudmlyb25tZW50LgorCSAqLworCW1wID0gc3RhdGUtPm1wOworCUFTU0VSVChkcm9wX2Jsay0+bWFnaWMgPT0gWEZTX0RJUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQoc2F2ZV9ibGstPm1hZ2ljID09IFhGU19ESVJfTEVBRl9NQUdJQyk7CisJZHJvcF9sZWFmID0gZHJvcF9ibGstPmJwLT5kYXRhOworCXNhdmVfbGVhZiA9IHNhdmVfYmxrLT5icC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChkcm9wX2xlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKElOVF9HRVQoc2F2ZV9sZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSX0xFQUZfTUFHSUMpOworCWRyb3BfaGRyID0gJmRyb3BfbGVhZi0+aGRyOworCXNhdmVfaGRyID0gJnNhdmVfbGVhZi0+aGRyOworCisJLyoKKwkgKiBTYXZlIGxhc3QgaGFzaHZhbCBmcm9tIGR5aW5nIGJsb2NrIGZvciBsYXRlciBCdHJlZSBmaXh1cC4KKwkgKi8KKwlkcm9wX2Jsay0+aGFzaHZhbCA9IElOVF9HRVQoZHJvcF9sZWFmLT5lbnRyaWVzWyBkcm9wX2xlYWYtPmhkci5jb3VudC0xIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKTsKKworCS8qCisJICogQ2hlY2sgaWYgd2UgbmVlZCBhIHRlbXAgYnVmZmVyLCBvciBjYW4gd2UgZG8gaXQgaW4gcGxhY2UuCisJICogTm90ZSB0aGF0IHdlIGRvbid0IGNoZWNrICJsZWFmIiBmb3IgaG9sZXMgYmVjYXVzZSB3ZSB3aWxsCisJICogYWx3YXlzIGJlIGRyb3BwaW5nIGl0LCB0b29zbWFsbCgpIGRlY2lkZWQgdGhhdCBmb3IgdXMgYWxyZWFkeS4KKwkgKi8KKwlpZiAoc2F2ZV9oZHItPmhvbGVzID09IDApIHsKKwkJLyoKKwkJICogZGVzdCBsZWFmIGhhcyBubyBob2xlcywgc28gd2UgYWRkIHRoZXJlLiAgTWF5IG5lZWQKKwkJICogdG8gbWFrZSBzb21lIHJvb20gaW4gdGhlIGVudHJ5IGFycmF5LgorCQkgKi8KKwkJaWYgKHhmc19kaXJfbGVhZl9vcmRlcihzYXZlX2Jsay0+YnAsIGRyb3BfYmxrLT5icCkpIHsKKwkJCXhmc19kaXJfbGVhZl9tb3ZlZW50cyhkcm9wX2xlYWYsIDAsIHNhdmVfbGVhZiwgMCwKKwkJCQkJCSAoaW50KUlOVF9HRVQoZHJvcF9oZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpLCBtcCk7CisJCX0gZWxzZSB7CisJCQl4ZnNfZGlyX2xlYWZfbW92ZWVudHMoZHJvcF9sZWFmLCAwLAorCQkJCQkgICAgICBzYXZlX2xlYWYsIElOVF9HRVQoc2F2ZV9oZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpLAorCQkJCQkgICAgICAoaW50KUlOVF9HRVQoZHJvcF9oZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpLCBtcCk7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBEZXN0aW5hdGlvbiBoYXMgaG9sZXMsIHNvIHdlIG1ha2UgYSB0ZW1wb3JhcnkgY29weQorCQkgKiBvZiB0aGUgbGVhZiBhbmQgYWRkIHRoZW0gYm90aCB0byB0aGF0LgorCQkgKi8KKwkJdG1wYnVmZmVyID0ga21lbV9hbGxvYyhzdGF0ZS0+YmxvY2tzaXplLCBLTV9TTEVFUCk7CisJCUFTU0VSVCh0bXBidWZmZXIgIT0gTlVMTCk7CisJCW1lbXNldCh0bXBidWZmZXIsIDAsIHN0YXRlLT5ibG9ja3NpemUpOworCQl0bXBfbGVhZiA9ICh4ZnNfZGlyX2xlYWZibG9ja190ICopdG1wYnVmZmVyOworCQl0bXBfaGRyID0gJnRtcF9sZWFmLT5oZHI7CisJCXRtcF9oZHItPmluZm8gPSBzYXZlX2hkci0+aW5mbzsJLyogc3RydWN0IGNvcHkgKi8KKwkJdG1wX2hkci0+Y291bnQgPSAwOworCQlJTlRfU0VUKHRtcF9oZHItPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJULCBzdGF0ZS0+YmxvY2tzaXplKTsKKwkJaWYgKCF0bXBfaGRyLT5maXJzdHVzZWQpCisJCQlJTlRfU0VUKHRtcF9oZHItPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJULCBzdGF0ZS0+YmxvY2tzaXplIC0gMSk7CisJCXRtcF9oZHItPm5hbWVieXRlcyA9IDA7CisJCWlmICh4ZnNfZGlyX2xlYWZfb3JkZXIoc2F2ZV9ibGstPmJwLCBkcm9wX2Jsay0+YnApKSB7CisJCQl4ZnNfZGlyX2xlYWZfbW92ZWVudHMoZHJvcF9sZWFmLCAwLCB0bXBfbGVhZiwgMCwKKwkJCQkJCSAoaW50KUlOVF9HRVQoZHJvcF9oZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpLCBtcCk7CisJCQl4ZnNfZGlyX2xlYWZfbW92ZWVudHMoc2F2ZV9sZWFmLCAwLAorCQkJCQkgICAgICB0bXBfbGVhZiwgSU5UX0dFVCh0bXBfbGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLAorCQkJCQkgICAgICAoaW50KUlOVF9HRVQoc2F2ZV9oZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpLCBtcCk7CisJCX0gZWxzZSB7CisJCQl4ZnNfZGlyX2xlYWZfbW92ZWVudHMoc2F2ZV9sZWFmLCAwLCB0bXBfbGVhZiwgMCwKKwkJCQkJCSAoaW50KUlOVF9HRVQoc2F2ZV9oZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpLCBtcCk7CisJCQl4ZnNfZGlyX2xlYWZfbW92ZWVudHMoZHJvcF9sZWFmLCAwLAorCQkJCQkgICAgICB0bXBfbGVhZiwgSU5UX0dFVCh0bXBfbGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLAorCQkJCQkgICAgICAoaW50KUlOVF9HRVQoZHJvcF9oZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpLCBtcCk7CisJCX0KKwkJbWVtY3B5KHNhdmVfbGVhZiwgdG1wX2xlYWYsIHN0YXRlLT5ibG9ja3NpemUpOworCQlrbWVtX2ZyZWUodG1wYnVmZmVyLCBzdGF0ZS0+YmxvY2tzaXplKTsKKwl9CisKKwl4ZnNfZGFfbG9nX2J1ZihzdGF0ZS0+YXJncy0+dHJhbnMsIHNhdmVfYmxrLT5icCwgMCwKKwkJCQkJICAgc3RhdGUtPmJsb2Nrc2l6ZSAtIDEpOworCisJLyoKKwkgKiBDb3B5IG91dCBsYXN0IGhhc2h2YWwgaW4gZWFjaCBibG9jayBmb3IgQi10cmVlIGNvZGUuCisJICovCisJc2F2ZV9ibGstPmhhc2h2YWwgPSBJTlRfR0VUKHNhdmVfbGVhZi0+ZW50cmllc1sgSU5UX0dFVChzYXZlX2xlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJvdXRpbmVzIHVzZWQgZm9yIGZpbmRpbmcgdGhpbmdzIGluIHRoZSBCdHJlZS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIExvb2sgdXAgYSBuYW1lIGluIGEgbGVhZiBkaXJlY3Rvcnkgc3RydWN0dXJlLgorICogVGhpcyBpcyB0aGUgaW50ZXJuYWwgcm91dGluZSwgaXQgdXNlcyB0aGUgY2FsbGVyJ3MgYnVmZmVyLgorICoKKyAqIE5vdGUgdGhhdCBkdXBsaWNhdGUga2V5cyBhcmUgYWxsb3dlZCwgYnV0IG9ubHkgY2hlY2sgd2l0aGluIHRoZQorICogY3VycmVudCBsZWFmIG5vZGUuICBUaGUgQnRyZWUgY29kZSBtdXN0IGNoZWNrIGluIGFkamFjZW50IGxlYWYgbm9kZXMuCisgKgorICogUmV0dXJuIGluICppbmRleCB0aGUgaW5kZXggaW50byB0aGUgZW50cnlbXSBhcnJheSBvZiBlaXRoZXIgdGhlIGZvdW5kCisgKiBlbnRyeSwgb3Igd2hlcmUgdGhlIGVudHJ5IHNob3VsZCBoYXZlIGJlZW4gKGluc2VydCBiZWZvcmUgdGhhdCBlbnRyeSkuCisgKgorICogRG9uJ3QgY2hhbmdlIHRoZSBhcmdzLT5pbnVtYmVyIHVubGVzcyB3ZSBmaW5kIHRoZSBmaWxlbmFtZS4KKyAqLworaW50Cit4ZnNfZGlyX2xlYWZfbG9va3VwX2ludCh4ZnNfZGFidWZfdCAqYnAsIHhmc19kYV9hcmdzX3QgKmFyZ3MsIGludCAqaW5kZXgpCit7CisJeGZzX2Rpcl9sZWFmYmxvY2tfdCAqbGVhZjsKKwl4ZnNfZGlyX2xlYWZfZW50cnlfdCAqZW50cnk7CisJeGZzX2Rpcl9sZWFmX25hbWVfdCAqbmFtZXN0OworCWludCBwcm9iZSwgc3BhbjsKKwl4ZnNfZGFoYXNoX3QgaGFzaHZhbDsKKworCWxlYWYgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSX0xFQUZfTUFHSUMpOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSA8IChYRlNfTEJTSVpFKGFyZ3MtPmRwLT5pX21vdW50KS84KSk7CisKKwkvKgorCSAqIEJpbmFyeSBzZWFyY2guICAobm90ZTogc21hbGwgYmxvY2tzIHdpbGwgc2tpcCB0aGlzIGxvb3ApCisJICovCisJaGFzaHZhbCA9IGFyZ3MtPmhhc2h2YWw7CisJcHJvYmUgPSBzcGFuID0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgLyAyOworCWZvciAoZW50cnkgPSAmbGVhZi0+ZW50cmllc1twcm9iZV07IHNwYW4gPiA0OworCQkgICBlbnRyeSA9ICZsZWFmLT5lbnRyaWVzW3Byb2JlXSkgeworCQlzcGFuIC89IDI7CisJCWlmIChJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpIDwgaGFzaHZhbCkKKwkJCXByb2JlICs9IHNwYW47CisJCWVsc2UgaWYgKElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPiBoYXNodmFsKQorCQkJcHJvYmUgLT0gc3BhbjsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCUFTU0VSVCgocHJvYmUgPj0gMCkgJiYgXAorCSAgICAgICAoKCFsZWFmLT5oZHIuY291bnQpIHx8IChwcm9iZSA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKSkpOworCUFTU0VSVCgoc3BhbiA8PSA0KSB8fCAoSU5UX0dFVChlbnRyeS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA9PSBoYXNodmFsKSk7CisKKwkvKgorCSAqIFNpbmNlIHdlIG1heSBoYXZlIGR1cGxpY2F0ZSBoYXNodmFsJ3MsIGZpbmQgdGhlIGZpcnN0IG1hdGNoaW5nCisJICogaGFzaHZhbCBpbiB0aGUgbGVhZi4KKwkgKi8KKwl3aGlsZSAoKHByb2JlID4gMCkgJiYgKElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPj0gaGFzaHZhbCkpIHsKKwkJZW50cnktLTsKKwkJcHJvYmUtLTsKKwl9CisJd2hpbGUgKChwcm9iZSA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKSAmJiAoSU5UX0dFVChlbnRyeS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA8IGhhc2h2YWwpKSB7CisJCWVudHJ5Kys7CisJCXByb2JlKys7CisJfQorCWlmICgocHJvYmUgPT0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpIHx8IChJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpICE9IGhhc2h2YWwpKSB7CisJCSppbmRleCA9IHByb2JlOworCQlBU1NFUlQoYXJncy0+b2tub2VudCk7CisJCXJldHVybihYRlNfRVJST1IoRU5PRU5UKSk7CisJfQorCisJLyoKKwkgKiBEdXBsaWNhdGUga2V5cyBtYXkgYmUgcHJlc2VudCwgc28gc2VhcmNoIGFsbCBvZiB0aGVtIGZvciBhIG1hdGNoLgorCSAqLworCXdoaWxlICgocHJvYmUgPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkgJiYgKElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPT0gaGFzaHZhbCkpIHsKKwkJbmFtZXN0ID0gWEZTX0RJUl9MRUFGX05BTUVTVFJVQ1QobGVhZiwgSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKSk7CisJCWlmIChlbnRyeS0+bmFtZWxlbiA9PSBhcmdzLT5uYW1lbGVuICYmCisJCSAgICBuYW1lc3QtPm5hbWVbMF0gPT0gYXJncy0+bmFtZVswXSAmJgorCQkgICAgbWVtY21wKGFyZ3MtPm5hbWUsIG5hbWVzdC0+bmFtZSwgYXJncy0+bmFtZWxlbikgPT0gMCkgeworCQkJWEZTX0RJUl9TRl9HRVRfRElSSU5PKCZuYW1lc3QtPmludW1iZXIsICZhcmdzLT5pbnVtYmVyKTsKKwkJCSppbmRleCA9IHByb2JlOworCQkJcmV0dXJuKFhGU19FUlJPUihFRVhJU1QpKTsKKwkJfQorCQllbnRyeSsrOworCQlwcm9iZSsrOworCX0KKwkqaW5kZXggPSBwcm9iZTsKKwlBU1NFUlQocHJvYmUgPT0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgfHwgYXJncy0+b2tub2VudCk7CisJcmV0dXJuKFhGU19FUlJPUihFTk9FTlQpKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBNb3ZlIHRoZSBpbmRpY2F0ZWQgZW50cmllcyBmcm9tIG9uZSBsZWFmIHRvIGFub3RoZXIuCisgKiBOT1RFOiB0aGlzIHJvdXRpbmUgbW9kaWZpZXMgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGxlYXZlcy4KKyAqLworLyogQVJHU1VTRUQgKi8KK1NUQVRJQyB2b2lkCit4ZnNfZGlyX2xlYWZfbW92ZWVudHMoeGZzX2Rpcl9sZWFmYmxvY2tfdCAqbGVhZl9zLCBpbnQgc3RhcnRfcywKKwkJICAgICAgeGZzX2Rpcl9sZWFmYmxvY2tfdCAqbGVhZl9kLCBpbnQgc3RhcnRfZCwKKwkJICAgICAgaW50IGNvdW50LCB4ZnNfbW91bnRfdCAqbXApCit7CisJeGZzX2Rpcl9sZWFmX2hkcl90ICpoZHJfcywgKmhkcl9kOworCXhmc19kaXJfbGVhZl9lbnRyeV90ICplbnRyeV9zLCAqZW50cnlfZDsKKwlpbnQgdG1wLCBpOworCisJLyoKKwkgKiBDaGVjayBmb3Igbm90aGluZyB0byBkby4KKwkgKi8KKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBTZXQgdXAgZW52aXJvbm1lbnQuCisJICovCisJQVNTRVJUKElOVF9HRVQobGVhZl9zLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSX0xFQUZfTUFHSUMpOworCUFTU0VSVChJTlRfR0VUKGxlYWZfZC0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUl9MRUFGX01BR0lDKTsKKwloZHJfcyA9ICZsZWFmX3MtPmhkcjsKKwloZHJfZCA9ICZsZWFmX2QtPmhkcjsKKwlBU1NFUlQoKElOVF9HRVQoaGRyX3MtPmNvdW50LCBBUkNIX0NPTlZFUlQpID4gMCkgJiYgKElOVF9HRVQoaGRyX3MtPmNvdW50LCBBUkNIX0NPTlZFUlQpIDwgKFhGU19MQlNJWkUobXApLzgpKSk7CisJQVNTRVJUKElOVF9HRVQoaGRyX3MtPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKSA+PQorCQkoKElOVF9HRVQoaGRyX3MtPmNvdW50LCBBUkNIX0NPTlZFUlQpKnNpemVvZigqZW50cnlfcykpK3NpemVvZigqaGRyX3MpKSk7CisJQVNTRVJUKElOVF9HRVQoaGRyX2QtPmNvdW50LCBBUkNIX0NPTlZFUlQpIDwgKFhGU19MQlNJWkUobXApLzgpKTsKKwlBU1NFUlQoSU5UX0dFVChoZHJfZC0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpID49CisJCSgoSU5UX0dFVChoZHJfZC0+Y291bnQsIEFSQ0hfQ09OVkVSVCkqc2l6ZW9mKCplbnRyeV9kKSkrc2l6ZW9mKCpoZHJfZCkpKTsKKworCUFTU0VSVChzdGFydF9zIDwgSU5UX0dFVChoZHJfcy0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVChzdGFydF9kIDw9IElOVF9HRVQoaGRyX2QtPmNvdW50LCBBUkNIX0NPTlZFUlQpKTsKKwlBU1NFUlQoY291bnQgPD0gSU5UX0dFVChoZHJfcy0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpOworCisJLyoKKwkgKiBNb3ZlIHRoZSBlbnRyaWVzIGluIHRoZSBkZXN0aW5hdGlvbiBsZWFmIHVwIHRvIG1ha2UgYSBob2xlPworCSAqLworCWlmIChzdGFydF9kIDwgSU5UX0dFVChoZHJfZC0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJdG1wICA9IElOVF9HRVQoaGRyX2QtPmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gc3RhcnRfZDsKKwkJdG1wICo9ICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCk7CisJCWVudHJ5X3MgPSAmbGVhZl9kLT5lbnRyaWVzW3N0YXJ0X2RdOworCQllbnRyeV9kID0gJmxlYWZfZC0+ZW50cmllc1tzdGFydF9kICsgY291bnRdOworCQltZW1jcHkoZW50cnlfZCwgZW50cnlfcywgdG1wKTsKKwl9CisKKwkvKgorCSAqIENvcHkgYWxsIGVudHJ5J3MgaW4gdGhlIHNhbWUgKHNvcnRlZCkgb3JkZXIsCisJICogYnV0IGFsbG9jYXRlIGZpbGVuYW1lcyBwYWNrZWQgYW5kIGluIHNlcXVlbmNlLgorCSAqLworCWVudHJ5X3MgPSAmbGVhZl9zLT5lbnRyaWVzW3N0YXJ0X3NdOworCWVudHJ5X2QgPSAmbGVhZl9kLT5lbnRyaWVzW3N0YXJ0X2RdOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgZW50cnlfcysrLCBlbnRyeV9kKyssIGkrKykgeworCQlBU1NFUlQoSU5UX0dFVChlbnRyeV9zLT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpID49IElOVF9HRVQoaGRyX3MtPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKSk7CisJCXRtcCA9IFhGU19ESVJfTEVBRl9FTlRTSVpFX0JZRU5UUlkoZW50cnlfcyk7CisJCUlOVF9NT0QoaGRyX2QtPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJULCAtKHRtcCkpOworCQllbnRyeV9kLT5oYXNodmFsID0gZW50cnlfcy0+aGFzaHZhbDsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJSU5UX0NPUFkoZW50cnlfZC0+bmFtZWlkeCwgaGRyX2QtPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKTsKKwkJZW50cnlfZC0+bmFtZWxlbiA9IGVudHJ5X3MtPm5hbWVsZW47CisJCUFTU0VSVChJTlRfR0VUKGVudHJ5X2QtPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkgKyB0bXAgPD0gWEZTX0xCU0laRShtcCkpOworCQltZW1jcHkoWEZTX0RJUl9MRUFGX05BTUVTVFJVQ1QobGVhZl9kLCBJTlRfR0VUKGVudHJ5X2QtPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkpLAorCQkgICAgICAgWEZTX0RJUl9MRUFGX05BTUVTVFJVQ1QobGVhZl9zLCBJTlRfR0VUKGVudHJ5X3MtPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkpLCB0bXApOworCQlBU1NFUlQoSU5UX0dFVChlbnRyeV9zLT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpICsgdG1wIDw9IFhGU19MQlNJWkUobXApKTsKKwkJbWVtc2V0KChjaGFyICopWEZTX0RJUl9MRUFGX05BTUVTVFJVQ1QobGVhZl9zLCBJTlRfR0VUKGVudHJ5X3MtPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkpLAorCQkgICAgICAwLCB0bXApOworCQlJTlRfTU9EKGhkcl9zLT5uYW1lYnl0ZXMsIEFSQ0hfQ09OVkVSVCwgLShlbnRyeV9kLT5uYW1lbGVuKSk7CisJCUlOVF9NT0QoaGRyX2QtPm5hbWVieXRlcywgQVJDSF9DT05WRVJULCBlbnRyeV9kLT5uYW1lbGVuKTsKKwkJSU5UX01PRChoZHJfcy0+Y291bnQsIEFSQ0hfQ09OVkVSVCwgLTEpOworCQlJTlRfTU9EKGhkcl9kLT5jb3VudCwgQVJDSF9DT05WRVJULCArMSk7CisJCXRtcCAgPSBJTlRfR0VUKGhkcl9kLT5jb3VudCwgQVJDSF9DT05WRVJUKSAqICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCkKKwkJCQkrICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfaGRyX3QpOworCQlBU1NFUlQoSU5UX0dFVChoZHJfZC0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpID49IHRtcCk7CisKKwl9CisKKwkvKgorCSAqIFplcm8gb3V0IHRoZSBlbnRyaWVzIHdlIGp1c3QgY29waWVkLgorCSAqLworCWlmIChzdGFydF9zID09IElOVF9HRVQoaGRyX3MtPmNvdW50LCBBUkNIX0NPTlZFUlQpKSB7CisJCXRtcCA9IGNvdW50ICogKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KTsKKwkJZW50cnlfcyA9ICZsZWFmX3MtPmVudHJpZXNbc3RhcnRfc107CisJCUFTU0VSVCgoY2hhciAqKWVudHJ5X3MgKyB0bXAgPD0gKGNoYXIgKilsZWFmX3MgKyBYRlNfTEJTSVpFKG1wKSk7CisJCW1lbXNldCgoY2hhciAqKWVudHJ5X3MsIDAsIHRtcCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTW92ZSB0aGUgcmVtYWluaW5nIGVudHJpZXMgZG93biB0byBmaWxsIHRoZSBob2xlLAorCQkgKiB0aGVuIHplcm8gdGhlIGVudHJpZXMgYXQgdGhlIHRvcC4KKwkJICovCisJCXRtcCAgPSBJTlRfR0VUKGhkcl9zLT5jb3VudCwgQVJDSF9DT05WRVJUKSAtIGNvdW50OworCQl0bXAgKj0gKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KTsKKwkJZW50cnlfcyA9ICZsZWFmX3MtPmVudHJpZXNbc3RhcnRfcyArIGNvdW50XTsKKwkJZW50cnlfZCA9ICZsZWFmX3MtPmVudHJpZXNbc3RhcnRfc107CisJCW1lbWNweShlbnRyeV9kLCBlbnRyeV9zLCB0bXApOworCisJCXRtcCA9IGNvdW50ICogKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KTsKKwkJZW50cnlfcyA9ICZsZWFmX3MtPmVudHJpZXNbSU5UX0dFVChoZHJfcy0+Y291bnQsIEFSQ0hfQ09OVkVSVCldOworCQlBU1NFUlQoKGNoYXIgKillbnRyeV9zICsgdG1wIDw9IChjaGFyICopbGVhZl9zICsgWEZTX0xCU0laRShtcCkpOworCQltZW1zZXQoKGNoYXIgKillbnRyeV9zLCAwLCB0bXApOworCX0KKworCS8qCisJICogRmlsbCBpbiB0aGUgZnJlZW1hcCBpbmZvcm1hdGlvbgorCSAqLworCUlOVF9TRVQoaGRyX2QtPmZyZWVtYXBbMF0uYmFzZSwgQVJDSF9DT05WRVJULCAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2hkcl90KSk7CisJSU5UX01PRChoZHJfZC0+ZnJlZW1hcFswXS5iYXNlLCBBUkNIX0NPTlZFUlQsIElOVF9HRVQoaGRyX2QtPmNvdW50LCBBUkNIX0NPTlZFUlQpICogKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KSk7CisJSU5UX1NFVChoZHJfZC0+ZnJlZW1hcFswXS5zaXplLCBBUkNIX0NPTlZFUlQsIElOVF9HRVQoaGRyX2QtPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKSAtIElOVF9HRVQoaGRyX2QtPmZyZWVtYXBbMF0uYmFzZSwgQVJDSF9DT05WRVJUKSk7CisJSU5UX1NFVChoZHJfZC0+ZnJlZW1hcFsxXS5iYXNlLCBBUkNIX0NPTlZFUlQsIChoZHJfZC0+ZnJlZW1hcFsyXS5iYXNlID0gMCkpOworCUlOVF9TRVQoaGRyX2QtPmZyZWVtYXBbMV0uc2l6ZSwgQVJDSF9DT05WRVJULCAoaGRyX2QtPmZyZWVtYXBbMl0uc2l6ZSA9IDApKTsKKwloZHJfcy0+aG9sZXMgPSAxOwkvKiBsZWFmIG1heSBub3QgYmUgY29tcGFjdCAqLworfQorCisvKgorICogQ29tcGFyZSB0d28gbGVhZiBibG9ja3MgIm9yZGVyIi4KKyAqLworaW50Cit4ZnNfZGlyX2xlYWZfb3JkZXIoeGZzX2RhYnVmX3QgKmxlYWYxX2JwLCB4ZnNfZGFidWZfdCAqbGVhZjJfYnApCit7CisJeGZzX2Rpcl9sZWFmYmxvY2tfdCAqbGVhZjEsICpsZWFmMjsKKworCWxlYWYxID0gbGVhZjFfYnAtPmRhdGE7CisJbGVhZjIgPSBsZWFmMl9icC0+ZGF0YTsKKwlBU1NFUlQoKElOVF9HRVQobGVhZjEtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVJfTEVBRl9NQUdJQykgJiYKKwkgICAgICAgKElOVF9HRVQobGVhZjItPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVJfTEVBRl9NQUdJQykpOworCWlmICgoSU5UX0dFVChsZWFmMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpID4gMCkgJiYgKElOVF9HRVQobGVhZjItPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSA+IDApICYmCisJICAgICgoSU5UX0dFVChsZWFmMi0+ZW50cmllc1sgMCBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPAorCSAgICAgIElOVF9HRVQobGVhZjEtPmVudHJpZXNbIDAgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpKSB8fAorCSAgICAgKElOVF9HRVQobGVhZjItPmVudHJpZXNbIElOVF9HRVQobGVhZjItPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSA8CisJICAgICAgSU5UX0dFVChsZWFmMS0+ZW50cmllc1sgSU5UX0dFVChsZWFmMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTEgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpKSkpIHsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBQaWNrIHVwIHRoZSBsYXN0IGhhc2h2YWx1ZSBmcm9tIGEgbGVhZiBibG9jay4KKyAqLworeGZzX2RhaGFzaF90Cit4ZnNfZGlyX2xlYWZfbGFzdGhhc2goeGZzX2RhYnVmX3QgKmJwLCBpbnQgKmNvdW50KQoreworCXhmc19kaXJfbGVhZmJsb2NrX3QgKmxlYWY7CisKKwlsZWFmID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUl9MRUFGX01BR0lDKTsKKwlpZiAoY291bnQpCisJCSpjb3VudCA9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCWlmICghbGVhZi0+aGRyLmNvdW50KQorCQlyZXR1cm4oMCk7CisJcmV0dXJuKElOVF9HRVQobGVhZi0+ZW50cmllc1sgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMSBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkpOworfQorCisvKgorICogQ29weSBvdXQgZGlyZWN0b3J5IGVudHJpZXMgZm9yIGdldGRlbnRzKCksIGZvciBsZWFmIGRpcmVjdG9yaWVzLgorICovCitpbnQKK3hmc19kaXJfbGVhZl9nZXRkZW50c19pbnQoCisJeGZzX2RhYnVmX3QJKmJwLAorCXhmc19pbm9kZV90CSpkcCwKKwl4ZnNfZGFibGtfdAlibm8sCisJdWlvX3QJCSp1aW8sCisJaW50CQkqZW9icCwKKwl4ZnNfZGlyZW50X3QJKmRicCwKKwl4ZnNfZGlyX3B1dF90CXB1dCwKKwl4ZnNfZGFkZHJfdAkJbmV4dGRhKQoreworCXhmc19kaXJfbGVhZmJsb2NrX3QJKmxlYWY7CisJeGZzX2Rpcl9sZWFmX2VudHJ5X3QJKmVudHJ5OworCXhmc19kaXJfbGVhZl9uYW1lX3QJKm5hbWVzdDsKKwlpbnQJCQllbnRubywgd2FudF9lbnRubywgaSwgbmV4dGVudG5vOworCXhmc19tb3VudF90CQkqbXA7CisJeGZzX2RhaGFzaF90CQljb29raGFzaDsKKwl4ZnNfZGFoYXNoX3QJCW5leHRoYXNoID0gMDsKKyNpZiAoQklUU19QRVJfTE9ORyA9PSAzMikKKwl4ZnNfZGFoYXNoX3QJCWxhc3RoYXNoID0gWEZTX0RBX01BWEhBU0g7CisjZW5kaWYKKwl4ZnNfZGlyX3B1dF9hcmdzX3QJcDsKKworCW1wID0gZHAtPmlfbW91bnQ7CisJbGVhZiA9IGJwLT5kYXRhOworCWlmIChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpICE9IFhGU19ESVJfTEVBRl9NQUdJQykgeworCQkqZW9icCA9IDE7CisJCXJldHVybihYRlNfRVJST1IoRU5PRU5UKSk7CS8qIFhYWCB3cm9uZyBjb2RlICovCisJfQorCisJd2FudF9lbnRubyA9IFhGU19EQV9DT09LSUVfRU5UUlkobXAsIHVpby0+dWlvX29mZnNldCk7CisKKwljb29raGFzaCA9IFhGU19EQV9DT09LSUVfSEFTSChtcCwgdWlvLT51aW9fb2Zmc2V0KTsKKworCXhmc19kaXJfdHJhY2VfZ19kdWwoImxlYWY6IHN0YXJ0IiwgZHAsIHVpbywgbGVhZik7CisKKwkvKgorCSAqIFJlLWZpbmQgb3VyIHBsYWNlLgorCSAqLworCWZvciAoaSA9IGVudG5vID0gMCwgZW50cnkgPSAmbGVhZi0+ZW50cmllc1swXTsKKwkJICAgICBpIDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCQkgICAgIGVudHJ5KyssIGkrKykgeworCisJCW5hbWVzdCA9IFhGU19ESVJfTEVBRl9OQU1FU1RSVUNUKGxlYWYsCisJCQkJICAgIElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkpOworCisJCWlmICh1bmxpa2VseSgKKwkJICAgICgoY2hhciAqKW5hbWVzdCA8IChjaGFyICopbGVhZikgfHwKKwkJICAgICgoY2hhciAqKW5hbWVzdCA+PSAoY2hhciAqKWxlYWYgKyBYRlNfTEJTSVpFKG1wKSkpKSB7CisJCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2Rpcl9sZWFmX2dldGRlbnRzX2ludCgxKSIsCisJCQkJCSAgICAgWEZTX0VSUkxFVkVMX0xPVywgbXAsIGxlYWYpOworCQkJeGZzX2Rpcl90cmFjZV9nX2R1KCJsZWFmOiBjb3JydXB0ZWQiLCBkcCwgdWlvKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJfQorCQlpZiAoSU5UX0dFVChlbnRyeS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA+PSBjb29raGFzaCkgeworCQkJaWYgKCAgIGVudG5vIDwgd2FudF9lbnRubworCQkJICAgICYmIElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCQk9PSBjb29raGFzaCkgeworCQkJCS8qCisJCQkJICogVHJ5aW5nIHRvIGdldCB0byBhIHBhcnRpY3VsYXIgb2Zmc2V0IGluIGEKKwkJCQkgKiBydW4gb2YgZXF1YWwtaGFzaHZhbCBlbnRyaWVzLgorCQkJCSAqLworCQkJCWVudG5vKys7CisJCQl9IGVsc2UgaWYgKCAgIHdhbnRfZW50bm8gPiAwCisJCQkJICAgJiYgZW50bm8gPT0gd2FudF9lbnRubworCQkJCSAgICYmIElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCQk9PSBjb29raGFzaCkgeworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQllbnRubyA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoaSA9PSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkgeworCQl4ZnNfZGlyX3RyYWNlX2dfZHUoImxlYWY6IGhhc2ggbm90IGZvdW5kIiwgZHAsIHVpbyk7CisJCWlmICghSU5UX0dFVChsZWFmLT5oZHIuaW5mby5mb3J3LCBBUkNIX0NPTlZFUlQpKQorCQkJdWlvLT51aW9fb2Zmc2V0ID0KKwkJCQlYRlNfREFfTUFLRV9DT09LSUUobXAsIDAsIDAsIFhGU19EQV9NQVhIQVNIKTsKKwkJLyoKKwkJICogRG9uJ3Qgc2V0IHVpb19vZmZzZXQgaWYgdGhlcmUncyBhbm90aGVyIGJsb2NrOgorCQkgKiB0aGUgbm9kZSBjb2RlIHdpbGwgYmUgc2V0dGluZyB1aW9fb2Zmc2V0IGFueXdheS4KKwkJICovCisJCSplb2JwID0gMDsKKwkJcmV0dXJuKDApOworCX0KKwl4ZnNfZGlyX3RyYWNlX2dfZHVlKCJsZWFmOiBoYXNoIGZvdW5kIiwgZHAsIHVpbywgZW50cnkpOworCisJcC5kYnAgPSBkYnA7CisJcC5wdXQgPSBwdXQ7CisJcC51aW8gPSB1aW87CisKKwkvKgorCSAqIFdlJ3JlIHN5bmNocm9uaXplZCwgc3RhcnQgY29weWluZyBlbnRyaWVzIG91dCB0byB0aGUgdXNlci4KKwkgKi8KKwlmb3IgKDsgZW50bm8gPj0gMCAmJiBpIDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCQkgICAgIGVudHJ5KyssIGkrKywgKGVudG5vID0gbmV4dGVudG5vKSkgeworCQlpbnQgbGFzdHJlc2lkPTAsIHJldHZhbDsKKwkJeGZzX2RpcmNvb2tfdCBsYXN0b2Zmc2V0OworCQl4ZnNfZGFoYXNoX3QgdGhpc2hhc2g7CisKKwkJLyoKKwkJICogQ2hlY2sgZm9yIGEgZGFtYWdlZCBkaXJlY3RvcnkgbGVhZiBibG9jayBhbmQgcGljayB1cAorCQkgKiB0aGUgaW5vZGUgbnVtYmVyIGZyb20gdGhpcyBlbnRyeS4KKwkJICovCisJCW5hbWVzdCA9IFhGU19ESVJfTEVBRl9OQU1FU1RSVUNUKGxlYWYsCisJCQkJICAgIElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkpOworCisJCWlmICh1bmxpa2VseSgKKwkJICAgICgoY2hhciAqKW5hbWVzdCA8IChjaGFyICopbGVhZikgfHwKKwkJICAgICgoY2hhciAqKW5hbWVzdCA+PSAoY2hhciAqKWxlYWYgKyBYRlNfTEJTSVpFKG1wKSkpKSB7CisJCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2Rpcl9sZWFmX2dldGRlbnRzX2ludCgyKSIsCisJCQkJCSAgICAgWEZTX0VSUkxFVkVMX0xPVywgbXAsIGxlYWYpOworCQkJeGZzX2Rpcl90cmFjZV9nX2R1KCJsZWFmOiBjb3JydXB0ZWQiLCBkcCwgdWlvKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJfQorCisJCXhmc19kaXJfdHJhY2VfZ19kdWMoImxlYWY6IG1pZGRsZSBjb29raWUgICIsCisJCQkJCQkgICBkcCwgdWlvLCBwLmNvb2subyk7CisKKwkJaWYgKGkgPCAoSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxKSkgeworCQkJbmV4dGhhc2ggPSBJTlRfR0VUKGVudHJ5WzFdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisKKwkJCWlmIChuZXh0aGFzaCA9PSBJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpKQorCQkJCW5leHRlbnRubyA9IGVudG5vICsgMTsKKwkJCWVsc2UKKwkJCQluZXh0ZW50bm8gPSAwOworCQkJWEZTX1BVVF9DT09LSUUocC5jb29rLCBtcCwgYm5vLCBuZXh0ZW50bm8sIG5leHRoYXNoKTsKKwkJCXhmc19kaXJfdHJhY2VfZ19kdWMoImxlYWY6IG1pZGRsZSBjb29raWUgICIsCisJCQkJCQkgICBkcCwgdWlvLCBwLmNvb2subyk7CisKKwkJfSBlbHNlIGlmICgodGhpc2hhc2ggPSBJTlRfR0VUKGxlYWYtPmhkci5pbmZvLmZvcncsCisJCQkJCQkJQVJDSF9DT05WRVJUKSkpIHsKKwkJCXhmc19kYWJ1Zl90ICpicDI7CisJCQl4ZnNfZGlyX2xlYWZibG9ja190ICpsZWFmMjsKKworCQkJQVNTRVJUKG5leHRkYSAhPSAtMSk7CisKKwkJCXJldHZhbCA9IHhmc19kYV9yZWFkX2J1ZihkcC0+aV90cmFuc3AsIGRwLCB0aGlzaGFzaCwKKwkJCQkJCSBuZXh0ZGEsICZicDIsIFhGU19EQVRBX0ZPUkspOworCQkJaWYgKHJldHZhbCkKKwkJCQlyZXR1cm4ocmV0dmFsKTsKKworCQkJQVNTRVJUKGJwMiAhPSBOVUxMKTsKKworCQkJbGVhZjIgPSBicDItPmRhdGE7CisKKwkJCWlmICh1bmxpa2VseSgKKwkJCSAgICAgICAoSU5UX0dFVChsZWFmMi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCSE9IFhGU19ESVJfTEVBRl9NQUdJQykKKwkJCSAgICB8fCAoSU5UX0dFVChsZWFmMi0+aGRyLmluZm8uYmFjaywgQVJDSF9DT05WRVJUKQorCQkJCQkJIT0gYm5vKSkpIHsJLyogR1JPVCAqLworCQkJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfZGlyX2xlYWZfZ2V0ZGVudHNfaW50KDMpIiwKKwkJCQkJCSAgICAgWEZTX0VSUkxFVkVMX0xPVywgbXAsCisJCQkJCQkgICAgIGxlYWYyKTsKKwkJCQl4ZnNfZGFfYnJlbHNlKGRwLT5pX3RyYW5zcCwgYnAyKTsKKworCQkJCXJldHVybihYRlNfRVJST1IoRUZTQ09SUlVQVEVEKSk7CisJCQl9CisKKwkJCW5leHRoYXNoID0gSU5UX0dFVChsZWFmMi0+ZW50cmllc1swXS5oYXNodmFsLAorCQkJCQkJCQlBUkNIX0NPTlZFUlQpOworCQkJbmV4dGVudG5vID0gLTE7CisJCQlYRlNfUFVUX0NPT0tJRShwLmNvb2ssIG1wLCB0aGlzaGFzaCwgMCwgbmV4dGhhc2gpOworCQkJeGZzX2RhX2JyZWxzZShkcC0+aV90cmFuc3AsIGJwMik7CisJCQl4ZnNfZGlyX3RyYWNlX2dfZHVjKCJsZWFmOiBuZXh0IGJsayBjb29raWUiLAorCQkJCQkJICAgZHAsIHVpbywgcC5jb29rLm8pOworCQl9IGVsc2UgeworCQkJbmV4dGVudG5vID0gLTE7CisJCQlYRlNfUFVUX0NPT0tJRShwLmNvb2ssIG1wLCAwLCAwLCBYRlNfREFfTUFYSEFTSCk7CisJCX0KKworCQkvKgorCQkgKiBTYXZlIG9mZiB0aGUgY29va2llIHNvIHdlIGNhbiBmYWxsIGJhY2sgc2hvdWxkIHRoZQorCQkgKiAncHV0JyBpbnRvIHRoZSBvdXRnb2luZyBidWZmZXIgZmFpbHMuICBUbyBoYW5kbGUgYSBydW4KKwkJICogb2YgZXF1YWwtaGFzaHZhbHMsIHRoZSBvZmZfdCBzdHJ1Y3R1cmUgb24gNjRiaXQKKwkJICogYnVpbGRzIGhhcyBlbnRubyBidWlsdCBpbnRvIHRoZSBjb29raWUgdG8gSUQgdGhlCisJCSAqIGVudHJ5LiAgT24gMzJiaXQgYnVpbGRzLCB3ZSBvbmx5IGhhdmUgc3BhY2UgZm9yIHRoZQorCQkgKiBoYXNodmFsIHNvIHdlIGNhbid0IElEIHNwZWNpZmljIGVudHJpZXMgd2l0aGluIGEgZ3JvdXAKKwkJICogb2Ygc2FtZSBoYXNodmFsIGVudHJpZXMuICAgRm9yIHRoaXMsIGxhc3RvZmZzZXQgaXMgc2V0CisJCSAqIHRvIHRoZSBmaXJzdCBpbiB0aGUgcnVuIG9mIGVxdWFsIGhhc2h2YWxzIHNvIHdlIGRvbid0CisJCSAqIGluY2x1ZGUgYW55IGVudHJpZXMgdW5sZXNzIHdlIGNhbiBpbmNsdWRlIGFsbCBlbnRyaWVzCisJCSAqIHRoYXQgc2hhcmUgdGhlIHNhbWUgaGFzaHZhbC4gIEhvcGVmdWxseSB0aGUgYnVmZmVyCisJCSAqIHByb3ZpZGVkIGlzIGJpZyBlbm91Z2ggdG8gaGFuZGxlIGl0IChzZWUgcHY3NjM1MTcpLgorCQkgKi8KKyNpZiAoQklUU19QRVJfTE9ORyA9PSAzMikKKwkJaWYgKCh0aGlzaGFzaCA9IElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkpCisJCQkJCQkJCSE9IGxhc3RoYXNoKSB7CisJCQlYRlNfUFVUX0NPT0tJRShsYXN0b2Zmc2V0LCBtcCwgYm5vLCBlbnRubywgdGhpc2hhc2gpOworCQkJbGFzdHJlc2lkID0gdWlvLT51aW9fcmVzaWQ7CisJCQlsYXN0aGFzaCA9IHRoaXNoYXNoOworCQl9IGVsc2UgeworCQkJeGZzX2Rpcl90cmFjZV9nX2R1YygibGVhZjogRFVQIENPT0tJRVMsIHNraXBwZWQiLAorCQkJCQkJICAgZHAsIHVpbywgcC5jb29rLm8pOworCQl9CisjZWxzZQorCQl0aGlzaGFzaCA9IElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisJCVhGU19QVVRfQ09PS0lFKGxhc3RvZmZzZXQsIG1wLCBibm8sIGVudG5vLCB0aGlzaGFzaCk7CisJCWxhc3RyZXNpZCA9IHVpby0+dWlvX3Jlc2lkOworI2VuZGlmIC8qIEJJVFNfUEVSX0xPTkcgPT0gMzIgKi8KKworCQkvKgorCQkgKiBQdXQgdGhlIGN1cnJlbnQgZW50cnkgaW50byB0aGUgb3V0Z29pbmcgYnVmZmVyLiAgSWYgd2UgZmFpbAorCQkgKiB0aGVuIHJlc3RvcmUgdGhlIFVJTyB0byB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGN1cnJlbnQKKwkJICogcnVuIG9mIGVxdWFsLWhhc2h2YWwgZW50cmllcyAocHJvYmFibHkgb25lIDEgZW50cnkgbG9uZykuCisJCSAqLworCQlwLmlubyA9IFhGU19HRVRfRElSX0lOTzgobmFtZXN0LT5pbnVtYmVyKTsKKyNpZiBYRlNfQklHX0lOVU1TCisJCXAuaW5vICs9IG1wLT5tX2lub2FkZDsKKyNlbmRpZgorCQlwLm5hbWUgPSAoY2hhciAqKW5hbWVzdC0+bmFtZTsKKwkJcC5uYW1lbGVuID0gZW50cnktPm5hbWVsZW47CisKKwkJcmV0dmFsID0gcC5wdXQoJnApOworCisJCWlmICghcC5kb25lKSB7CisJCQl1aW8tPnVpb19vZmZzZXQgPSBsYXN0b2Zmc2V0Lm87CisJCQl1aW8tPnVpb19yZXNpZCA9IGxhc3RyZXNpZDsKKworCQkJKmVvYnAgPSAxOworCisJCQl4ZnNfZGlyX3RyYWNlX2dfZHUoImxlYWY6IEUtTy1CIiwgZHAsIHVpbyk7CisKKwkJCXJldHVybihyZXR2YWwpOworCQl9CisJfQorCisJdWlvLT51aW9fb2Zmc2V0ID0gcC5jb29rLm87CisKKwkqZW9icCA9IDA7CisKKwl4ZnNfZGlyX3RyYWNlX2dfZHUoImxlYWY6IEUtTy1GIiwgZHAsIHVpbyk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBGb3JtYXQgYSBkaXJlbnQ2NCBzdHJ1Y3R1cmUgYW5kIGNvcHkgaXQgb3V0IHRoZSB0aGUgdXNlcidzIGJ1ZmZlci4KKyAqLworaW50Cit4ZnNfZGlyX3B1dF9kaXJlbnQ2NF9kaXJlY3QoeGZzX2Rpcl9wdXRfYXJnc190ICpwYSkKK3sKKwlpb3ZlY190ICppb3ZwOworCWludCByZWNsZW4sIG5hbWVsZW47CisJeGZzX2RpcmVudF90ICppZGJwOworCXVpb190ICp1aW87CisKKwluYW1lbGVuID0gcGEtPm5hbWVsZW47CisJcmVjbGVuID0gRElSRU5UU0laRShuYW1lbGVuKTsKKwl1aW8gPSBwYS0+dWlvOworCWlmIChyZWNsZW4gPiB1aW8tPnVpb19yZXNpZCkgeworCQlwYS0+ZG9uZSA9IDA7CisJCXJldHVybiAwOworCX0KKwlpb3ZwID0gdWlvLT51aW9faW92OworCWlkYnAgPSAoeGZzX2RpcmVudF90ICopaW92cC0+aW92X2Jhc2U7CisJaW92cC0+aW92X2Jhc2UgPSAoY2hhciAqKWlkYnAgKyByZWNsZW47CisJaW92cC0+aW92X2xlbiAtPSByZWNsZW47CisJdWlvLT51aW9fcmVzaWQgLT0gcmVjbGVuOworCWlkYnAtPmRfcmVjbGVuID0gcmVjbGVuOworCWlkYnAtPmRfaW5vID0gcGEtPmlubzsKKwlpZGJwLT5kX29mZiA9IHBhLT5jb29rLm87CisJaWRicC0+ZF9uYW1lW25hbWVsZW5dID0gJ1wwJzsKKwlwYS0+ZG9uZSA9IDE7CisJbWVtY3B5KGlkYnAtPmRfbmFtZSwgcGEtPm5hbWUsIG5hbWVsZW4pOworCXJldHVybiAwOworfQorCisvKgorICogRm9ybWF0IGEgZGlyZW50NjQgc3RydWN0dXJlIGFuZCBjb3B5IGl0IG91dCB0aGUgdGhlIHVzZXIncyBidWZmZXIuCisgKi8KK2ludAoreGZzX2Rpcl9wdXRfZGlyZW50NjRfdWlvKHhmc19kaXJfcHV0X2FyZ3NfdCAqcGEpCit7CisJaW50CQlyZXR2YWwsIHJlY2xlbiwgbmFtZWxlbjsKKwl4ZnNfZGlyZW50X3QJKmlkYnA7CisJdWlvX3QJCSp1aW87CisKKwluYW1lbGVuID0gcGEtPm5hbWVsZW47CisJcmVjbGVuID0gRElSRU5UU0laRShuYW1lbGVuKTsKKwl1aW8gPSBwYS0+dWlvOworCWlmIChyZWNsZW4gPiB1aW8tPnVpb19yZXNpZCkgeworCQlwYS0+ZG9uZSA9IDA7CisJCXJldHVybiAwOworCX0KKwlpZGJwID0gcGEtPmRicDsKKwlpZGJwLT5kX3JlY2xlbiA9IHJlY2xlbjsKKwlpZGJwLT5kX2lubyA9IHBhLT5pbm87CisJaWRicC0+ZF9vZmYgPSBwYS0+Y29vay5vOworCWlkYnAtPmRfbmFtZVtuYW1lbGVuXSA9ICdcMCc7CisJbWVtY3B5KGlkYnAtPmRfbmFtZSwgcGEtPm5hbWUsIG5hbWVsZW4pOworCXJldHZhbCA9IHVpb19yZWFkKChjYWRkcl90KWlkYnAsIHJlY2xlbiwgdWlvKTsKKwlwYS0+ZG9uZSA9IChyZXR2YWwgPT0gMCk7CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyX2xlYWYuaCBiL2ZzL3hmcy94ZnNfZGlyX2xlYWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGQ2OGQzCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19kaXJfbGVhZi5oCkBAIC0wLDAgKzEsMjQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19ESVJfTEVBRl9IX18KKyNkZWZpbmUJX19YRlNfRElSX0xFQUZfSF9fCisKKy8qCisgKiBEaXJlY3RvcnkgbGF5b3V0LCBpbnRlcm5hbCBzdHJ1Y3R1cmUsIGFjY2VzcyBtYWNyb3MsIGV0Yy4KKyAqCisgKiBMYXJnZSBkaXJlY3RvcmllcyBhcmUgc3RydWN0dXJlZCBhcm91bmQgQnRyZWVzIHdoZXJlIGFsbCB0aGUgZGF0YQorICogZWxlbWVudHMgYXJlIGluIHRoZSBsZWFmIG5vZGVzLiAgRmlsZW5hbWVzIGFyZSBoYXNoZWQgaW50byBhbiBpbnQsCisgKiB0aGVuIHRoYXQgaW50IGlzIHVzZWQgYXMgdGhlIGluZGV4IGludG8gdGhlIEJ0cmVlLiAgU2luY2UgdGhlIGhhc2h2YWwKKyAqIG9mIGEgZmlsZW5hbWUgbWF5IG5vdCBiZSB1bmlxdWUsIHdlIG1heSBoYXZlIGR1cGxpY2F0ZSBrZXlzLiAgVGhlCisgKiBpbnRlcm5hbCBsaW5rcyBpbiB0aGUgQnRyZWUgYXJlIGxvZ2ljYWwgYmxvY2sgb2Zmc2V0cyBpbnRvIHRoZSBmaWxlLgorICovCisKK3N0cnVjdCB1aW87CitzdHJ1Y3QgeGZzX2JtYXBfZnJlZTsKK3N0cnVjdCB4ZnNfZGFidWY7CitzdHJ1Y3QgeGZzX2RhX2FyZ3M7CitzdHJ1Y3QgeGZzX2RhX3N0YXRlOworc3RydWN0IHhmc19kYV9zdGF0ZV9ibGs7CitzdHJ1Y3QgeGZzX2Rpcl9wdXRfYXJnczsKK3N0cnVjdCB4ZnNfaW5vZGU7CitzdHJ1Y3QgeGZzX21vdW50Oworc3RydWN0IHhmc190cmFuczsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERpcmVjdG9yeSBTdHJ1Y3R1cmUgd2hlbiBlcXVhbCB0byBYRlNfTEJTSVpFKG1wKSBieXRlcy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbGVhZiBub2RlcyBpbiB0aGUgQnRyZWUuCisgKgorICogU3RydWN0IGxlYWZfZW50cnkncyBhcmUgcGFja2VkIGZyb20gdGhlIHRvcC4gIE5hbWVzIGdyb3cgZnJvbSB0aGUgYm90dG9tCisgKiBidXQgYXJlIG5vdCBwYWNrZWQuICBUaGUgZnJlZW1hcCBjb250YWlucyBydW4tbGVuZ3RoLWVuY29kZWQgZW50cmllcworICogZm9yIHRoZSBmcmVlIGJ5dGVzIGFmdGVyIHRoZSBsZWFmX2VudHJ5J3MsIGJ1dCBvbmx5IHRoZSBOIGxhcmdlc3Qgc3VjaCwKKyAqIHNtYWxsZXIgcnVucyBhcmUgZHJvcHBlZC4gIFdoZW4gdGhlIGZyZWVtYXAgZG9lc24ndCBzaG93IGVub3VnaCBzcGFjZQorICogZm9yIGFuIGFsbG9jYXRpb24sIHdlIGNvbXBhY3QgdGhlIG5hbWVsaXN0IGFyZWEgYW5kIHRyeSBhZ2Fpbi4gIElmIHdlCisgKiBzdGlsbCBkb24ndCBoYXZlIGVub3VnaCBzcGFjZSwgdGhlbiB3ZSBoYXZlIHRvIHNwbGl0IHRoZSBibG9jay4KKyAqCisgKiBTaW5jZSB3ZSBoYXZlIGR1cGxpY2F0ZSBoYXNoIGtleXMsIGZvciBlYWNoIGtleSB0aGF0IG1hdGNoZXMsIGNvbXBhcmUKKyAqIHRoZSBhY3R1YWwgc3RyaW5nLiAgVGhlIHJvb3QgYW5kIGludGVybWVkaWF0ZSBub2RlIHNlYXJjaCBhbHdheXMgdGFrZXMKKyAqIHRoZSBmaXJzdC1pbi10aGUtYmxvY2sga2V5IG1hdGNoIGZvdW5kLCBzbyB3ZSBzaG91bGQgb25seSBoYXZlIHRvIHdvcmsKKyAqICJmb3J3ImFyZC4gIElmIG5vbmUgbWF0Y2hlcywgY29udGludWUgd2l0aCB0aGUgImZvcnciYXJkIGxlYWYgbm9kZXMKKyAqIHVudGlsIHRoZSBoYXNoIGtleSBjaGFuZ2VzIG9yIHRoZSBmaWxlbmFtZSBpcyBmb3VuZC4KKyAqCisgKiBUaGUgcGFyZW50IGRpcmVjdG9yeSBhbmQgdGhlIHNlbGYtcG9pbnRlciBhcmUgZXhwbGljaXRseSByZXByZXNlbnRlZAorICogKGllOiB0aGVyZSBhcmUgZW50cmllcyBmb3IgIi4iIGFuZCAiLi4iKS4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGNvdW50IGJlaW5nIGEgX191aW50MTZfdCBsaW1pdHMgdXMgdG8gc29tZXRoaW5nIGxpa2UgYQorICogYmxvY2tzaXplIG9mIDEuM01CIGluIHRoZSBmYWNlIG9mIHdvcnN0IGNhc2UgKHNob3J0KSBmaWxlbmFtZXMuCisgKi8KKyNkZWZpbmUgWEZTX0RJUl9MRUFGX01BUFNJWkUJMwkvKiBob3cgbWFueSBmcmVlc3BhY2Ugc2xvdHMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Rpcl9sZWFmYmxvY2sgeworCXN0cnVjdCB4ZnNfZGlyX2xlYWZfaGRyIHsJLyogY29uc3RhbnQtc3RydWN0dXJlIGhlYWRlciBibG9jayAqLworCQl4ZnNfZGFfYmxraW5mb190IGluZm87CS8qIGJsb2NrIHR5cGUsIGxpbmtzLCBldGMuICovCisJCV9fdWludDE2X3QgY291bnQ7CS8qIGNvdW50IG9mIGFjdGl2ZSBsZWFmX2VudHJ5J3MgKi8KKwkJX191aW50MTZfdCBuYW1lYnl0ZXM7CS8qIG51bSBieXRlcyBvZiBuYW1lIHN0cmluZ3Mgc3RvcmVkICovCisJCV9fdWludDE2X3QgZmlyc3R1c2VkOwkvKiBmaXJzdCB1c2VkIGJ5dGUgaW4gbmFtZSBhcmVhICovCisJCV9fdWludDhfdCAgaG9sZXM7CS8qICE9IDAgaWYgYmxrIG5lZWRzIGNvbXBhY3Rpb24gKi8KKwkJX191aW50OF90ICBwYWQxOworCQlzdHJ1Y3QgeGZzX2Rpcl9sZWFmX21hcCB7LyogUkxFIG1hcCBvZiBmcmVlIGJ5dGVzICovCisJCQlfX3VpbnQxNl90IGJhc2U7IC8qIGJhc2Ugb2YgZnJlZSByZWdpb24gKi8KKwkJCV9fdWludDE2X3Qgc2l6ZTsgLyogcnVuIGxlbmd0aCBvZiBmcmVlIHJlZ2lvbiAqLworCQl9IGZyZWVtYXBbWEZTX0RJUl9MRUFGX01BUFNJWkVdOyAvKiBOIGxhcmdlc3QgZnJlZSByZWdpb25zICovCisJfSBoZHI7CisJc3RydWN0IHhmc19kaXJfbGVhZl9lbnRyeSB7CS8qIHNvcnRlZCBvbiBrZXksIG5vdCBuYW1lICovCisJCXhmc19kYWhhc2hfdCBoYXNodmFsOwkvKiBoYXNoIHZhbHVlIG9mIG5hbWUgKi8KKwkJX191aW50MTZfdCBuYW1laWR4OwkvKiBpbmRleCBpbnRvIGJ1ZmZlciBvZiBuYW1lICovCisJCV9fdWludDhfdCBuYW1lbGVuOwkvKiBsZW5ndGggb2YgbmFtZSBzdHJpbmcgKi8KKwkJX191aW50OF90IHBhZDI7CisJfSBlbnRyaWVzWzFdOwkJCS8qIHZhciBzaXplZCBhcnJheSAqLworCXN0cnVjdCB4ZnNfZGlyX2xlYWZfbmFtZSB7CisJCXhmc19kaXJfaW5vX3QgaW51bWJlcjsJLyogaW5vZGUgbnVtYmVyIGZvciB0aGlzIGtleSAqLworCQlfX3VpbnQ4X3QgbmFtZVsxXTsJLyogbmFtZSBzdHJpbmcgaXRzZWxmICovCisJfSBuYW1lbGlzdFsxXTsJCQkvKiBncm93cyBmcm9tIGJvdHRvbSBvZiBidWYgKi8KK30geGZzX2Rpcl9sZWFmYmxvY2tfdDsKK3R5cGVkZWYgc3RydWN0IHhmc19kaXJfbGVhZl9oZHIgeGZzX2Rpcl9sZWFmX2hkcl90OwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Rpcl9sZWFmX21hcCB4ZnNfZGlyX2xlYWZfbWFwX3Q7Cit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyX2xlYWZfZW50cnkgeGZzX2Rpcl9sZWFmX2VudHJ5X3Q7Cit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyX2xlYWZfbmFtZSB4ZnNfZGlyX2xlYWZfbmFtZV90OworCisvKgorICogTGVuZ3RoIG9mIG5hbWUgZm9yIHdoaWNoIGEgNTEyLWJ5dGUgYmxvY2sgZmlsZXN5c3RlbQorICogY2FuIGdldCBhIGRvdWJsZSBzcGxpdC4KKyAqLworI2RlZmluZQlYRlNfRElSX0xFQUZfQ0FOX0RPVUJMRV9TUExJVF9MRU4JXAorCSg1MTIgLSAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2hkcl90KSAtIFwKKwkgKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KSAqIDIgLSBcCisJICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfbmFtZV90KSAqIDIgLSAoTUFYTkFNRUxFTiAtIDIpICsgMSArIDEpCisKK3R5cGVkZWYgaW50ICgqeGZzX2Rpcl9wdXRfdCkoc3RydWN0IHhmc19kaXJfcHV0X2FyZ3MgKnBhKTsKKwordHlwZWRlZiB1bmlvbiB7CisJeGZzX29mZl90CQlvOwkJLyogb2Zmc2V0IChjb29raWUpICovCisJLyoKKwkgKiBXYXRjaCB0aGUgb3JkZXIgaGVyZSAoZW5kaWFuLW5lc3MgZGVwZW5kZW50KS4KKwkgKi8KKwlzdHJ1Y3QgeworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwkJeGZzX2RhaGFzaF90CWg7CS8qIGhhc2ggdmFsdWUgKi8KKwkJX191aW50MzJfdAliZTsJLyogYmxvY2sgYW5kIGVudHJ5ICovCisjZWxzZQkvKiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOICovCisJCV9fdWludDMyX3QJYmU7CS8qIGJsb2NrIGFuZCBlbnRyeSAqLworCQl4ZnNfZGFoYXNoX3QJaDsJLyogaGFzaCB2YWx1ZSAqLworI2VuZGlmCS8qIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4gKi8KKwl9IHM7Cit9IHhmc19kaXJjb29rX3Q7CisKKyNkZWZpbmUJWEZTX1BVVF9DT09LSUUoYyxtcCxibm8sZW50cnksaGFzaCkJXAorCSgoYykucy5iZSA9IFhGU19EQV9NQUtFX0JOT0VOVFJZKG1wLCBibm8sIGVudHJ5KSwgKGMpLnMuaCA9IChoYXNoKSkKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Rpcl9wdXRfYXJncworeworCXhmc19kaXJjb29rX3QJY29vazsJCS8qIGNvb2tpZSBvZiAobmV4dCkgZW50cnkgKi8KKwl4ZnNfaW50aW5vX3QJaW5vOwkJLyogaW5vZGUgbnVtYmVyICovCisJc3RydWN0IHhmc19kaXJlbnQJKmRicDsJCS8qIGJ1ZmZlciBwb2ludGVyICovCisJY2hhcgkJKm5hbWU7CQkvKiBkaXJlY3RvcnkgZW50cnkgbmFtZSAqLworCWludAkJbmFtZWxlbjsJLyogbGVuZ3RoIG9mIG5hbWUgKi8KKwlpbnQJCWRvbmU7CQkvKiBvdXRwdXQ6IHNldCBpZiB2YWx1ZSB3YXMgc3RvcmVkICovCisJeGZzX2Rpcl9wdXRfdAlwdXQ7CQkvKiBwdXQgZnVuY3Rpb24gcHRyIChpL28pICovCisJc3RydWN0IHVpbwkqdWlvOwkJLyogdWlvIGNvbnRyb2wgc3RydWN0dXJlICovCit9IHhmc19kaXJfcHV0X2FyZ3NfdDsKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSX0xFQUZfRU5UU0laRV9CWU5BTUUpCitpbnQgeGZzX2Rpcl9sZWFmX2VudHNpemVfYnluYW1lKGludCBsZW4pOworI2RlZmluZSBYRlNfRElSX0xFQUZfRU5UU0laRV9CWU5BTUUobGVuKQl4ZnNfZGlyX2xlYWZfZW50c2l6ZV9ieW5hbWUobGVuKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0RJUl9MRUFGX0VOVFNJWkVfQllOQU1FKGxlbikJLyogc3BhY2UgYSBuYW1lIHdpbGwgdXNlICovIFwKKwkoKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9uYW1lX3QpLTEgKyBsZW4pCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUl9MRUFGX0VOVFNJWkVfQllFTlRSWSkKK2ludCB4ZnNfZGlyX2xlYWZfZW50c2l6ZV9ieWVudHJ5KHhmc19kaXJfbGVhZl9lbnRyeV90ICplbnRyeSk7CisjZGVmaW5lIFhGU19ESVJfTEVBRl9FTlRTSVpFX0JZRU5UUlkoZW50cnkpCVwKKwl4ZnNfZGlyX2xlYWZfZW50c2l6ZV9ieWVudHJ5KGVudHJ5KQorI2Vsc2UKKyNkZWZpbmUgWEZTX0RJUl9MRUFGX0VOVFNJWkVfQllFTlRSWShlbnRyeSkJLyogc3BhY2UgYW4gZW50cnkgd2lsbCB1c2UgKi8gXAorCSgodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX25hbWVfdCktMSArIChlbnRyeSktPm5hbWVsZW4pCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUl9MRUFGX05BTUVTVFJVQ1QpCit4ZnNfZGlyX2xlYWZfbmFtZV90ICoKK3hmc19kaXJfbGVhZl9uYW1lc3RydWN0KHhmc19kaXJfbGVhZmJsb2NrX3QgKmxlYWZwLCBpbnQgb2Zmc2V0KTsKKyNkZWZpbmUgWEZTX0RJUl9MRUFGX05BTUVTVFJVQ1QobGVhZnAsb2Zmc2V0KQlcCisJeGZzX2Rpcl9sZWFmX25hbWVzdHJ1Y3QobGVhZnAsb2Zmc2V0KQorI2Vsc2UKKyNkZWZpbmUgWEZTX0RJUl9MRUFGX05BTUVTVFJVQ1QobGVhZnAsb2Zmc2V0KQkvKiBwb2ludCB0byBuYW1lIHN0cnVjdCAqLyBcCisJKCh4ZnNfZGlyX2xlYWZfbmFtZV90ICopJigoY2hhciAqKShsZWFmcCkpW29mZnNldF0pCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHRoZSBrZXJuZWwuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBJbnRlcm5hbCByb3V0aW5lcyB3aGVuIGRpcnNpemUgPCBYRlNfTElUSU5PKG1wKS4KKyAqLworaW50IHhmc19kaXJfc2hvcnRmb3JtX2NyZWF0ZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIHhmc19pbm9fdCBwYXJlbnQpOworaW50IHhmc19kaXJfc2hvcnRmb3JtX2FkZG5hbWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2ludCB4ZnNfZGlyX3Nob3J0Zm9ybV9sb29rdXAoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2ludCB4ZnNfZGlyX3Nob3J0Zm9ybV90b19sZWFmKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitpbnQgeGZzX2Rpcl9zaG9ydGZvcm1fcmVtb3ZlbmFtZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworaW50IHhmc19kaXJfc2hvcnRmb3JtX2dldGRlbnRzKHN0cnVjdCB4ZnNfaW5vZGUgKmRwLCBzdHJ1Y3QgdWlvICp1aW8sIGludCAqZW9mcCwKKwkJCQkgICAgICBzdHJ1Y3QgeGZzX2RpcmVudCAqZGJwLCB4ZnNfZGlyX3B1dF90IHB1dCk7CitpbnQgeGZzX2Rpcl9zaG9ydGZvcm1fcmVwbGFjZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworCisvKgorICogSW50ZXJuYWwgcm91dGluZXMgd2hlbiBkaXJzaXplID09IFhGU19MQlNJWkUobXApLgorICovCitpbnQgeGZzX2Rpcl9sZWFmX3RvX25vZGUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2ludCB4ZnNfZGlyX2xlYWZfdG9fc2hvcnRmb3JtKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CisKKy8qCisgKiBSb3V0aW5lcyB1c2VkIGZvciBncm93aW5nIHRoZSBCdHJlZS4KKyAqLworaW50CXhmc19kaXJfbGVhZl9jcmVhdGUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCB4ZnNfZGFibGtfdCB3aGljaF9ibG9jaywKKwkJCQkgICBzdHJ1Y3QgeGZzX2RhYnVmICoqYnBwKTsKK2ludAl4ZnNfZGlyX2xlYWZfc3BsaXQoc3RydWN0IHhmc19kYV9zdGF0ZSAqc3RhdGUsCisJCQkJICBzdHJ1Y3QgeGZzX2RhX3N0YXRlX2JsayAqb2xkYmxrLAorCQkJCSAgc3RydWN0IHhmc19kYV9zdGF0ZV9ibGsgKm5ld2Jsayk7CitpbnQJeGZzX2Rpcl9sZWFmX2FkZChzdHJ1Y3QgeGZzX2RhYnVmICpsZWFmX2J1ZmZlciwKKwkJCQlzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIGludCBpbnNlcnRpb25faW5kZXgpOworaW50CXhmc19kaXJfbGVhZl9hZGRuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitpbnQJeGZzX2Rpcl9sZWFmX2xvb2t1cF9pbnQoc3RydWN0IHhmc19kYWJ1ZiAqbGVhZl9idWZmZXIsCisJCQkJICAgICAgIHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywKKwkJCQkgICAgICAgaW50ICppbmRleF9mb3VuZF9hdCk7CitpbnQJeGZzX2Rpcl9sZWFmX3JlbW92ZShzdHJ1Y3QgeGZzX3RyYW5zICp0cmFucywKKwkJCQkgICBzdHJ1Y3QgeGZzX2RhYnVmICpsZWFmX2J1ZmZlciwKKwkJCQkgICBpbnQgaW5kZXhfdG9fcmVtb3ZlKTsKK2ludAl4ZnNfZGlyX2xlYWZfZ2V0ZGVudHNfaW50KHN0cnVjdCB4ZnNfZGFidWYgKmJwLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKKwkJCQkJIHhmc19kYWJsa190IGJubywgc3RydWN0IHVpbyAqdWlvLAorCQkJCQkgaW50ICplb2JwLCBzdHJ1Y3QgeGZzX2RpcmVudCAqZGJwLAorCQkJCQkgeGZzX2Rpcl9wdXRfdCBwdXQsIHhmc19kYWRkcl90IG5leHRkYSk7CisKKy8qCisgKiBSb3V0aW5lcyB1c2VkIGZvciBzaHJpbmtpbmcgdGhlIEJ0cmVlLgorICovCitpbnQJeGZzX2Rpcl9sZWFmX3Rvb3NtYWxsKHN0cnVjdCB4ZnNfZGFfc3RhdGUgKnN0YXRlLCBpbnQgKnJldHZhbCk7Cit2b2lkCXhmc19kaXJfbGVhZl91bmJhbGFuY2Uoc3RydWN0IHhmc19kYV9zdGF0ZSAqc3RhdGUsCisJCQkJCSAgICAgc3RydWN0IHhmc19kYV9zdGF0ZV9ibGsgKmRyb3BfYmxrLAorCQkJCQkgICAgIHN0cnVjdCB4ZnNfZGFfc3RhdGVfYmxrICpzYXZlX2Jsayk7CisKKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICovCit1aW50CXhmc19kaXJfbGVhZl9sYXN0aGFzaChzdHJ1Y3QgeGZzX2RhYnVmICpicCwgaW50ICpjb3VudCk7CitpbnQJeGZzX2Rpcl9sZWFmX29yZGVyKHN0cnVjdCB4ZnNfZGFidWYgKmxlYWYxX2JwLAorCQkJCSAgc3RydWN0IHhmc19kYWJ1ZiAqbGVhZjJfYnApOworaW50CXhmc19kaXJfcHV0X2RpcmVudDY0X2RpcmVjdCh4ZnNfZGlyX3B1dF9hcmdzX3QgKnBhKTsKK2ludAl4ZnNfZGlyX3B1dF9kaXJlbnQ2NF91aW8oeGZzX2Rpcl9wdXRfYXJnc190ICpwYSk7CitpbnQJeGZzX2Rpcl9pbm9fdmFsaWRhdGUoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19pbm9fdCBpbm8pOworCisKKy8qCisgKiBHbG9iYWwgZGF0YS4KKyAqLworZXh0ZXJuIHhmc19kYWhhc2hfdAl4ZnNfZGlyX2hhc2hfZG90LCB4ZnNfZGlyX2hhc2hfZG90ZG90OworCisjZW5kaWYgLyogX19YRlNfRElSX0xFQUZfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Rpcl9zZi5oIGIvZnMveGZzL3hmc19kaXJfc2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjFiY2ZjCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19kaXJfc2YuaApAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0RJUl9TRl9IX18KKyNkZWZpbmUJX19YRlNfRElSX1NGX0hfXworCisvKgorICogRGlyZWN0b3J5IGxheW91dCB3aGVuIHN0b3JlZCBpbnRlcm5hbCB0byBhbiBpbm9kZS4KKyAqCisgKiBTbWFsbCBkaXJlY3RvcmllcyBhcmUgcGFja2VkIGFzIHRpZ2h0bHkgYXMgcG9zc2libGUgc28gYXMgdG8KKyAqIGZpdCBpbnRvIHRoZSBsaXRlcmFsIGFyZWEgb2YgdGhlIGlub2RlLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsgX191aW50OF90IGlbc2l6ZW9mKHhmc19pbm9fdCldOyB9IHhmc19kaXJfaW5vX3Q7CisKKy8qCisgKiBUaGUgcGFyZW50IGRpcmVjdG9yeSBoYXMgYSBkZWRpY2F0ZWQgZmllbGQsIGFuZCB0aGUgc2VsZi1wb2ludGVyIG11c3QKKyAqIGJlIGNhbGN1bGF0ZWQgb24gdGhlIGZseS4KKyAqCisgKiBFbnRyaWVzIGFyZSBwYWNrZWQgdG93YXJkIHRoZSB0b3AgYXMgdGlnaHQgYXMgcG9zc2libGUuICBUaGUgaGVhZGVyCisgKiBhbmQgdGhlIGVsZW1lbnRzIG11Y2ggYmUgbWVtY3B5J2Qgb3V0IGludG8gYSB3b3JrIGFyZWEgdG8gZ2V0IGNvcnJlY3QKKyAqIGFsaWdubWVudCBmb3IgdGhlIGlub2RlIG51bWJlciBmaWVsZHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19kaXJfc2hvcnRmb3JtIHsKKwlzdHJ1Y3QgeGZzX2Rpcl9zZl9oZHIgewkJLyogY29uc3RhbnQtc3RydWN0dXJlIGhlYWRlciBibG9jayAqLworCQl4ZnNfZGlyX2lub190IHBhcmVudDsJLyogcGFyZW50IGRpciBpbm9kZSBudW1iZXIgKi8KKwkJX191aW50OF90IGNvdW50OwkvKiBjb3VudCBvZiBhY3RpdmUgZW50cmllcyAqLworCX0gaGRyOworCXN0cnVjdCB4ZnNfZGlyX3NmX2VudHJ5IHsKKwkJeGZzX2Rpcl9pbm9fdCBpbnVtYmVyOwkvKiByZWZlcmVuY2VkIGlub2RlIG51bWJlciAqLworCQlfX3VpbnQ4X3QgbmFtZWxlbjsJLyogYWN0dWFsIGxlbmd0aCBvZiBuYW1lIChubyBOVUxMKSAqLworCQlfX3VpbnQ4X3QgbmFtZVsxXTsJLyogbmFtZSAqLworCX0gbGlzdFsxXTsJCQkvKiB2YXJpYWJsZSBzaXplZCBhcnJheSAqLworfSB4ZnNfZGlyX3Nob3J0Zm9ybV90OwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Rpcl9zZl9oZHIgeGZzX2Rpcl9zZl9oZHJfdDsKK3R5cGVkZWYgc3RydWN0IHhmc19kaXJfc2ZfZW50cnkgeGZzX2Rpcl9zZl9lbnRyeV90OworCisvKgorICogV2UgZ2VuZXJhdGUgdGhpcyB0aGVuIHNvcnQgaXQsIHNvIHRoYXQgcmVhZGRpcnMgYXJlIHJldHVybmVkIGluCisgKiBoYXNoLW9yZGVyLiAgRWxzZSBzZWVrZGlyIHdvbid0IHdvcmsuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19kaXJfc2Zfc29ydCB7CisJX191aW50OF90CWVudG5vOwkJLyogLj0wLCAuLj0xLCBlbHNlIGVudHJ5IyArIDIgKi8KKwlfX3VpbnQ4X3QJc2Vxbm87CQkvKiBzZXF1ZW5jZSAjIHdpdGggc2FtZSBoYXNoIHZhbHVlICovCisJX191aW50OF90CW5hbWVsZW47CS8qIGxlbmd0aCBvZiBuYW1lIHZhbHVlIChubyBudWxsKSAqLworCXhmc19kYWhhc2hfdAloYXNoOwkJLyogdGhpcyBlbnRyeSdzIGhhc2ggdmFsdWUgKi8KKwl4ZnNfaW50aW5vX3QJaW5vOwkJLyogdGhpcyBlbnRyeSdzIGlub2RlIG51bWJlciAqLworCWNoYXIJCSpuYW1lOwkJLyogbmFtZSB2YWx1ZSwgcG9pbnRlciBpbnRvIGJ1ZmZlciAqLworfSB4ZnNfZGlyX3NmX3NvcnRfdDsKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSX1NGX0dFVF9ESVJJTk8pCit2b2lkIHhmc19kaXJfc2ZfZ2V0X2Rpcmlubyh4ZnNfZGlyX2lub190ICpmcm9tLCB4ZnNfaW5vX3QgKnRvKTsKKyNkZWZpbmUJWEZTX0RJUl9TRl9HRVRfRElSSU5PKGZyb20sdG8pCQkgICAgeGZzX2Rpcl9zZl9nZXRfZGlyaW5vKGZyb20sIHRvKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUl9TRl9HRVRfRElSSU5PKGZyb20sdG8pCQkgICAgKCoodG8pID0gWEZTX0dFVF9ESVJfSU5POCgqZnJvbSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUl9TRl9QVVRfRElSSU5PKQordm9pZCB4ZnNfZGlyX3NmX3B1dF9kaXJpbm8oeGZzX2lub190ICpmcm9tLCB4ZnNfZGlyX2lub190ICp0byk7CisjZGVmaW5lCVhGU19ESVJfU0ZfUFVUX0RJUklOTyhmcm9tLHRvKSAgICB4ZnNfZGlyX3NmX3B1dF9kaXJpbm8oZnJvbSwgdG8pCisjZWxzZQorI2RlZmluZQlYRlNfRElSX1NGX1BVVF9ESVJJTk8oZnJvbSx0bykgICAgWEZTX1BVVF9ESVJfSU5POCgqKGZyb20pLCAqKHRvKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSX1NGX0VOVFNJWkVfQllOQU1FKQoraW50IHhmc19kaXJfc2ZfZW50c2l6ZV9ieW5hbWUoaW50IGxlbik7CisjZGVmaW5lIFhGU19ESVJfU0ZfRU5UU0laRV9CWU5BTUUobGVuKQkJeGZzX2Rpcl9zZl9lbnRzaXplX2J5bmFtZShsZW4pCisjZWxzZQorI2RlZmluZSBYRlNfRElSX1NGX0VOVFNJWkVfQllOQU1FKGxlbikJCS8qIHNwYWNlIGEgbmFtZSB1c2VzICovIFwKKwkoKHVpbnQpc2l6ZW9mKHhmc19kaXJfc2ZfZW50cnlfdCktMSArIChsZW4pKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVJfU0ZfRU5UU0laRV9CWUVOVFJZKQoraW50IHhmc19kaXJfc2ZfZW50c2l6ZV9ieWVudHJ5KHhmc19kaXJfc2ZfZW50cnlfdCAqc2ZlcCk7CisjZGVmaW5lIFhGU19ESVJfU0ZfRU5UU0laRV9CWUVOVFJZKHNmZXApCXhmc19kaXJfc2ZfZW50c2l6ZV9ieWVudHJ5KHNmZXApCisjZWxzZQorI2RlZmluZSBYRlNfRElSX1NGX0VOVFNJWkVfQllFTlRSWShzZmVwKQkvKiBzcGFjZSBhbiBlbnRyeSB1c2VzICovIFwKKwkoKHVpbnQpc2l6ZW9mKHhmc19kaXJfc2ZfZW50cnlfdCktMSArIChzZmVwKS0+bmFtZWxlbikKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSX1NGX05FWFRFTlRSWSkKK3hmc19kaXJfc2ZfZW50cnlfdCAqeGZzX2Rpcl9zZl9uZXh0ZW50cnkoeGZzX2Rpcl9zZl9lbnRyeV90ICpzZmVwKTsKKyNkZWZpbmUgWEZTX0RJUl9TRl9ORVhURU5UUlkoc2ZlcCkJCXhmc19kaXJfc2ZfbmV4dGVudHJ5KHNmZXApCisjZWxzZQorI2RlZmluZSBYRlNfRElSX1NGX05FWFRFTlRSWShzZmVwKQkJLyogbmV4dCBlbnRyeSBpbiBzdHJ1Y3QgKi8gXAorCSgoeGZzX2Rpcl9zZl9lbnRyeV90ICopIFwKKwkJKChjaGFyICopKHNmZXApICsgWEZTX0RJUl9TRl9FTlRTSVpFX0JZRU5UUlkoc2ZlcCkpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVJfU0ZfQUxMRklUKQoraW50IHhmc19kaXJfc2ZfYWxsZml0KGludCBjb3VudCwgaW50IHRvdGFsbGVuKTsKKyNkZWZpbmUgWEZTX0RJUl9TRl9BTExGSVQoY291bnQsdG90YWxsZW4pCVwKKwl4ZnNfZGlyX3NmX2FsbGZpdChjb3VudCx0b3RhbGxlbikKKyNlbHNlCisjZGVmaW5lIFhGU19ESVJfU0ZfQUxMRklUKGNvdW50LHRvdGFsbGVuKQkvKiB3aWxsIGFsbCBlbnRyaWVzIGZpdD8gKi8gXAorCSgodWludClzaXplb2YoeGZzX2Rpcl9zZl9oZHJfdCkgKyBcCisJICAgICAgICgodWludClzaXplb2YoeGZzX2Rpcl9zZl9lbnRyeV90KS0xKSooY291bnQpICsgKHRvdGFsbGVuKSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChYRlNfRElSX1RSQUNFKQorCisvKgorICogS2VybmVsIHRyYWNpbmcgc3VwcG9ydCBmb3IgZGlyZWN0b3JpZXMuCisgKi8KK3N0cnVjdCB1aW87CitzdHJ1Y3QgeGZzX2lub2RlOworc3RydWN0IHhmc19kYV9pbnRub2RlOworc3RydWN0IHhmc19kaW5vZGU7CitzdHJ1Y3QgeGZzX2Rpcl9sZWFmYmxvY2s7CitzdHJ1Y3QgeGZzX2Rpcl9sZWFmX2VudHJ5OworCisjZGVmaW5lCVhGU19ESVJfVFJBQ0VfU0laRQk0MDk2CS8qIHNpemUgb2YgZ2xvYmFsIHRyYWNlIGJ1ZmZlciAqLworZXh0ZXJuIGt0cmFjZV90CSp4ZnNfZGlyX3RyYWNlX2J1ZjsKKworLyoKKyAqIFRyYWNlIHJlY29yZCB0eXBlcy4KKyAqLworI2RlZmluZQlYRlNfRElSX0tUUkFDRV9HX0RVCTEJLyogZHAsIHVpbyAqLworI2RlZmluZQlYRlNfRElSX0tUUkFDRV9HX0RVQgkyCS8qIGRwLCB1aW8sIGJubyAqLworI2RlZmluZQlYRlNfRElSX0tUUkFDRV9HX0RVTgkzCS8qIGRwLCB1aW8sIG5vZGUgKi8KKyNkZWZpbmUJWEZTX0RJUl9LVFJBQ0VfR19EVUwJNAkvKiBkcCwgdWlvLCBsZWFmICovCisjZGVmaW5lCVhGU19ESVJfS1RSQUNFX0dfRFVFCTUJLyogZHAsIHVpbywgbGVhZiBlbnRyeSAqLworI2RlZmluZQlYRlNfRElSX0tUUkFDRV9HX0RVQwk2CS8qIGRwLCB1aW8sIGNvb2tpZSAqLworCit2b2lkIHhmc19kaXJfdHJhY2VfZ19kdShjaGFyICp3aGVyZSwgc3RydWN0IHhmc19pbm9kZSAqZHAsIHN0cnVjdCB1aW8gKnVpbyk7Cit2b2lkIHhmc19kaXJfdHJhY2VfZ19kdWIoY2hhciAqd2hlcmUsIHN0cnVjdCB4ZnNfaW5vZGUgKmRwLCBzdHJ1Y3QgdWlvICp1aW8sCisJCQkgICAgICB4ZnNfZGFibGtfdCBibm8pOwordm9pZCB4ZnNfZGlyX3RyYWNlX2dfZHVuKGNoYXIgKndoZXJlLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwgc3RydWN0IHVpbyAqdWlvLAorCQkJICAgICAgc3RydWN0IHhmc19kYV9pbnRub2RlICpub2RlKTsKK3ZvaWQgeGZzX2Rpcl90cmFjZV9nX2R1bChjaGFyICp3aGVyZSwgc3RydWN0IHhmc19pbm9kZSAqZHAsIHN0cnVjdCB1aW8gKnVpbywKKwkJCSAgICAgIHN0cnVjdCB4ZnNfZGlyX2xlYWZibG9jayAqbGVhZik7Cit2b2lkIHhmc19kaXJfdHJhY2VfZ19kdWUoY2hhciAqd2hlcmUsIHN0cnVjdCB4ZnNfaW5vZGUgKmRwLCBzdHJ1Y3QgdWlvICp1aW8sCisJCQkgICAgICBzdHJ1Y3QgeGZzX2Rpcl9sZWFmX2VudHJ5ICplbnRyeSk7Cit2b2lkIHhmc19kaXJfdHJhY2VfZ19kdWMoY2hhciAqd2hlcmUsIHN0cnVjdCB4ZnNfaW5vZGUgKmRwLCBzdHJ1Y3QgdWlvICp1aW8sCisJCQkgICAgICB4ZnNfb2ZmX3QgY29va2llKTsKK3ZvaWQgeGZzX2Rpcl90cmFjZV9lbnRlcihpbnQgdHlwZSwgY2hhciAqd2hlcmUsCisJCQkgICAgIHZvaWQgKmEwLCB2b2lkICphMSwgdm9pZCAqYTIsIHZvaWQgKmEzLAorCQkJICAgICB2b2lkICphNCwgdm9pZCAqYTUsIHZvaWQgKmE2LCB2b2lkICphNywKKwkJCSAgICAgdm9pZCAqYTgsIHZvaWQgKmE5LCB2b2lkICphMTAsIHZvaWQgKmExMSk7CisjZWxzZQorI2RlZmluZQl4ZnNfZGlyX3RyYWNlX2dfZHUodyxkLHUpCisjZGVmaW5lCXhmc19kaXJfdHJhY2VfZ19kdWIodyxkLHUsYikKKyNkZWZpbmUJeGZzX2Rpcl90cmFjZV9nX2R1bih3LGQsdSxuKQorI2RlZmluZQl4ZnNfZGlyX3RyYWNlX2dfZHVsKHcsZCx1LGwpCisjZGVmaW5lCXhmc19kaXJfdHJhY2VfZ19kdWUodyxkLHUsZSkKKyNkZWZpbmUJeGZzX2Rpcl90cmFjZV9nX2R1Yyh3LGQsdSxjKQorI2VuZGlmIC8qIERFQlVHICovCisKKyNlbmRpZgkvKiBfX1hGU19ESVJfU0ZfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RtYXBpLmggYi9mcy94ZnMveGZzX2RtYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhZTNlNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZG1hcGkuaApAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfRE1BUElfSF9fCisjZGVmaW5lIF9fWEZTX0RNQVBJX0hfXworCisvKglWYWx1ZXMgdXNlZCB0byBkZWZpbmUgdGhlIG9uLWRpc2sgdmVyc2lvbiBvZiBkbV9hdHRybmFtZV90LiBBbGwKKyAqCW9uLWRpc2sgYXR0cmlidXRlIG5hbWVzIHN0YXJ0IHdpdGggdGhlIDgtYnl0ZSBzdHJpbmcgIlNHSV9ETUlfIi4KKyAqCisgKiAgICAgIEluIHRoZSBvbi1kaXNrIGlub2RlLCBETUFQSSBhdHRyaWJ1dGUgbmFtZXMgY29uc2lzdCBvZiB0aGUgdXNlci1wcm92aWRlZAorICogICAgICBuYW1lIHdpdGggdGhlIERNQVRUUl9QUkVGSVhTVFJJTkcgcHJlLXBlbmRlZC4gIFRoaXMgc3RyaW5nIG11c3QgTkVWRVIgYmUKKyAqICAgICAgY2hhbmdlZC4KKyAqLworCisjZGVmaW5lIERNQVRUUl9QUkVGSVhMRU4JOAorI2RlZmluZSBETUFUVFJfUFJFRklYU1RSSU5HCSJTR0lfRE1JXyIKKwordHlwZWRlZiBlbnVtIHsKKwlETV9FVkVOVF9JTlZBTElECT0gLTEsCisJRE1fRVZFTlRfQ0FOQ0VMCQk9IDAsCQkvKiBub3Qgc3VwcG9ydGVkICovCisJRE1fRVZFTlRfTU9VTlQJCT0gMSwKKwlETV9FVkVOVF9QUkVVTk1PVU5UCT0gMiwKKwlETV9FVkVOVF9VTk1PVU5UCT0gMywKKwlETV9FVkVOVF9ERUJVVAkJPSA0LAkJLyogbm90IHN1cHBvcnRlZCAqLworCURNX0VWRU5UX0NSRUFURQkJPSA1LAorCURNX0VWRU5UX0NMT1NFCQk9IDYsCQkvKiBub3Qgc3VwcG9ydGVkICovCisJRE1fRVZFTlRfUE9TVENSRUFURQk9IDcsCisJRE1fRVZFTlRfUkVNT1ZFCQk9IDgsCisJRE1fRVZFTlRfUE9TVFJFTU9WRQk9IDksCisJRE1fRVZFTlRfUkVOQU1FCQk9IDEwLAorCURNX0VWRU5UX1BPU1RSRU5BTUUJPSAxMSwKKwlETV9FVkVOVF9MSU5LCQk9IDEyLAorCURNX0VWRU5UX1BPU1RMSU5LCT0gMTMsCisJRE1fRVZFTlRfU1lNTElOSwk9IDE0LAorCURNX0VWRU5UX1BPU1RTWU1MSU5LCT0gMTUsCisJRE1fRVZFTlRfUkVBRAkJPSAxNiwKKwlETV9FVkVOVF9XUklURQkJPSAxNywKKwlETV9FVkVOVF9UUlVOQ0FURQk9IDE4LAorCURNX0VWRU5UX0FUVFJJQlVURQk9IDE5LAorCURNX0VWRU5UX0RFU1RST1kJPSAyMCwKKwlETV9FVkVOVF9OT1NQQUNFCT0gMjEsCisJRE1fRVZFTlRfVVNFUgkJPSAyMiwKKwlETV9FVkVOVF9NQVgJCT0gMjMKK30gZG1fZXZlbnR0eXBlX3Q7CisjZGVmaW5lIEhBVkVfRE1fRVZFTlRUWVBFX1QKKwordHlwZWRlZiBlbnVtIHsKKwlETV9SSUdIVF9OVUxMLAorCURNX1JJR0hUX1NIQVJFRCwKKwlETV9SSUdIVF9FWENMCit9IGRtX3JpZ2h0X3Q7CisjZGVmaW5lIEhBVkVfRE1fUklHSFRfVAorCisvKiBEZWZpbmVzIGZvciBkZXRlcm1pbmluZyBpZiBhbiBldmVudCBtZXNzYWdlIHNob3VsZCBiZSBzZW50LiAqLworI2RlZmluZQlETV9FVkVOVF9FTkFCTEVEKHZmc3AsIGlwLCBldmVudCkgKCBcCisJdW5saWtlbHkgKCh2ZnNwKS0+dmZzX2ZsYWcgJiBWRlNfRE1JKSAmJiBcCisJCSggKChpcCktPmlfZC5kaV9kbWV2bWFzayAmICgxIDw8IGV2ZW50KSkgfHwgXAorCQkgICgoaXApLT5pX21vdW50LT5tX2RtZXZtYXNrICYgKDEgPDwgZXZlbnQpKSApIFwKKwkpCisKKyNkZWZpbmUJRE1fRVZFTlRfRU5BQkxFRF9JTyh2ZnNwLCBpbywgZXZlbnQpICggXAorCXVubGlrZWx5ICgodmZzcCktPnZmc19mbGFnICYgVkZTX0RNSSkgJiYgXAorCQkoICgoaW8pLT5pb19kbWV2bWFzayAmICgxIDw8IGV2ZW50KSkgfHwgXAorCQkgICgoaW8pLT5pb19tb3VudC0+bV9kbWV2bWFzayAmICgxIDw8IGV2ZW50KSkgKSBcCisJKQorCisjZGVmaW5lIERNX1hGU19WQUxJRF9GU19FVkVOVFMJCSggXAorCSgxIDw8IERNX0VWRU5UX1BSRVVOTU9VTlQpCXwgXAorCSgxIDw8IERNX0VWRU5UX1VOTU9VTlQpCQl8IFwKKwkoMSA8PCBETV9FVkVOVF9OT1NQQUNFKQkJfCBcCisJKDEgPDwgRE1fRVZFTlRfREVCVVQpCQl8IFwKKwkoMSA8PCBETV9FVkVOVF9DUkVBVEUpCQl8IFwKKwkoMSA8PCBETV9FVkVOVF9QT1NUQ1JFQVRFKQl8IFwKKwkoMSA8PCBETV9FVkVOVF9SRU1PVkUpCQl8IFwKKwkoMSA8PCBETV9FVkVOVF9QT1NUUkVNT1ZFKQl8IFwKKwkoMSA8PCBETV9FVkVOVF9SRU5BTUUpCQl8IFwKKwkoMSA8PCBETV9FVkVOVF9QT1NUUkVOQU1FKQl8IFwKKwkoMSA8PCBETV9FVkVOVF9MSU5LKQkJfCBcCisJKDEgPDwgRE1fRVZFTlRfUE9TVExJTkspCXwgXAorCSgxIDw8IERNX0VWRU5UX1NZTUxJTkspCQl8IFwKKwkoMSA8PCBETV9FVkVOVF9QT1NUU1lNTElOSykJfCBcCisJKDEgPDwgRE1fRVZFTlRfQVRUUklCVVRFKQl8IFwKKwkoMSA8PCBETV9FVkVOVF9ERVNUUk9ZKQkJKQorCisvKiBFdmVudHMgdmFsaWQgaW4gZG1fc2V0X2V2ZW50bGlzdCgpIHdoZW4gY2FsbGVkIHdpdGggYSBmaWxlIGhhbmRsZSBmb3IKKyAgIGEgcmVndWxhciBmaWxlIG9yIGEgc3ltbGluay4gIFRoZXNlIGV2ZW50cyBhcmUgcGVyc2lzdGVudC4KKyovCisKKyNkZWZpbmUJRE1fWEZTX1ZBTElEX0ZJTEVfRVZFTlRTCSggXAorCSgxIDw8IERNX0VWRU5UX0FUVFJJQlVURSkJfCBcCisJKDEgPDwgRE1fRVZFTlRfREVTVFJPWSkJCSkKKworLyogRXZlbnRzIHZhbGlkIGluIGRtX3NldF9ldmVudGxpc3QoKSB3aGVuIGNhbGxlZCB3aXRoIGEgZmlsZSBoYW5kbGUgZm9yCisgICBhIGRpcmVjdG9yeS4gIFRoZXNlIGV2ZW50cyBhcmUgcGVyc2lzdGVudC4KKyovCisKKyNkZWZpbmUJRE1fWEZTX1ZBTElEX0RJUkVDVE9SWV9FVkVOVFMJKCBcCisJKDEgPDwgRE1fRVZFTlRfQ1JFQVRFKQkJfCBcCisJKDEgPDwgRE1fRVZFTlRfUE9TVENSRUFURSkJfCBcCisJKDEgPDwgRE1fRVZFTlRfUkVNT1ZFKQkJfCBcCisJKDEgPDwgRE1fRVZFTlRfUE9TVFJFTU9WRSkJfCBcCisJKDEgPDwgRE1fRVZFTlRfUkVOQU1FKQkJfCBcCisJKDEgPDwgRE1fRVZFTlRfUE9TVFJFTkFNRSkJfCBcCisJKDEgPDwgRE1fRVZFTlRfTElOSykJCXwgXAorCSgxIDw8IERNX0VWRU5UX1BPU1RMSU5LKQl8IFwKKwkoMSA8PCBETV9FVkVOVF9TWU1MSU5LKQkJfCBcCisJKDEgPDwgRE1fRVZFTlRfUE9TVFNZTUxJTkspCXwgXAorCSgxIDw8IERNX0VWRU5UX0FUVFJJQlVURSkJfCBcCisJKDEgPDwgRE1fRVZFTlRfREVTVFJPWSkJCSkKKworLyogRXZlbnRzIHN1cHBvcnRlZCBieSB0aGUgWEZTIGZpbGVzeXN0ZW0uICovCisjZGVmaW5lCURNX1hGU19TVVBQT1JURURfRVZFTlRTCQkoIFwKKwkoMSA8PCBETV9FVkVOVF9NT1VOVCkJCXwgXAorCSgxIDw8IERNX0VWRU5UX1BSRVVOTU9VTlQpCXwgXAorCSgxIDw8IERNX0VWRU5UX1VOTU9VTlQpCQl8IFwKKwkoMSA8PCBETV9FVkVOVF9OT1NQQUNFKQkJfCBcCisJKDEgPDwgRE1fRVZFTlRfQ1JFQVRFKQkJfCBcCisJKDEgPDwgRE1fRVZFTlRfUE9TVENSRUFURSkJfCBcCisJKDEgPDwgRE1fRVZFTlRfUkVNT1ZFKQkJfCBcCisJKDEgPDwgRE1fRVZFTlRfUE9TVFJFTU9WRSkJfCBcCisJKDEgPDwgRE1fRVZFTlRfUkVOQU1FKQkJfCBcCisJKDEgPDwgRE1fRVZFTlRfUE9TVFJFTkFNRSkJfCBcCisJKDEgPDwgRE1fRVZFTlRfTElOSykJCXwgXAorCSgxIDw8IERNX0VWRU5UX1BPU1RMSU5LKQl8IFwKKwkoMSA8PCBETV9FVkVOVF9TWU1MSU5LKQkJfCBcCisJKDEgPDwgRE1fRVZFTlRfUE9TVFNZTUxJTkspCXwgXAorCSgxIDw8IERNX0VWRU5UX1JFQUQpCQl8IFwKKwkoMSA8PCBETV9FVkVOVF9XUklURSkJCXwgXAorCSgxIDw8IERNX0VWRU5UX1RSVU5DQVRFKQl8IFwKKwkoMSA8PCBETV9FVkVOVF9BVFRSSUJVVEUpCXwgXAorCSgxIDw8IERNX0VWRU5UX0RFU1RST1kpCQkpCisKKworLyoKKyAqCURlZmluaXRpb25zIHVzZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvbiBkbV9zZW5kXypfZXZlbnQoKS4KKyAqLworCisjZGVmaW5lIERNX0ZMQUdTX05ERUxBWQkJMHgwMDEJLyogcmV0dXJuIEVBR0FJTiBhZnRlciBkbV9wZW5kaW5nKCkgKi8KKyNkZWZpbmUgRE1fRkxBR1NfVU5XQU5URUQJMHgwMDIJLyogZXZlbnQgbm90IGluIGZzeXMgZG1fZXZlbnRzZXRfdCAqLworI2RlZmluZSBETV9GTEFHU19JU0VNCQkweDAwNAkvKiB0aHJlYWQgaG9sZHMgaV9zZW0gKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDQsMjEpCisvKiBpX2FsbG9jX3NlbSB3YXMgYWRkZWQgaW4gMi40LjIyLXByZTEgKi8KKyNkZWZpbmUgRE1fRkxBR1NfSUFMTE9DU0VNX1JECTB4MDEwCS8qIHRocmVhZCBob2xkcyBpX2FsbG9jX3NlbSByZCAqLworI2RlZmluZSBETV9GTEFHU19JQUxMT0NTRU1fV1IJMHgwMjAJLyogdGhyZWFkIGhvbGRzIGlfYWxsb2Nfc2VtIHdyICovCisjZW5kaWYKKyNlbmRpZgorCisvKgorICoJQmFzZWQgb24gSU9fSVNESVJFQ1QsIGRlY2lkZSB3aGljaCBpXyBmbGFnIGlzIHNldC4KKyAqLworI2lmZGVmIERNX0ZMQUdTX0lBTExPQ1NFTV9SRAorI2RlZmluZSBETV9TRU1fRkxBR19SRChpb2ZsYWdzKSAoKChpb2ZsYWdzKSAmIElPX0lTRElSRUNUKSA/IFwKKwkJCSAgICAgIERNX0ZMQUdTX0lBTExPQ1NFTV9SRCA6IERNX0ZMQUdTX0lTRU0pCisjZGVmaW5lIERNX1NFTV9GTEFHX1dSCShETV9GTEFHU19JQUxMT0NTRU1fV1IgfCBETV9GTEFHU19JU0VNKQorI2Vsc2UKKyNkZWZpbmUgRE1fU0VNX0ZMQUdfUkQoaW9mbGFncykgKCgoaW9mbGFncykgJiBJT19JU0RJUkVDVCkgPyBcCisJCQkgICAgICAwIDogRE1fRkxBR1NfSVNFTSkKKyNkZWZpbmUgRE1fU0VNX0ZMQUdfV1IJKERNX0ZMQUdTX0lTRU0pCisjZW5kaWYKKworLyoKKyAqCU1hY3JvcyB0byB0dXJuIGNhbGxlciBzcGVjaWZpZWQgZGVsYXkvYmxvY2sgZmxhZ3MgaW50bworICoJZG1fc2VuZF94eHh4X2V2ZW50IGZsYWcgRE1fRkxBR1NfTkRFTEFZLgorICovCisKKyNkZWZpbmUgRklMUF9ERUxBWV9GTEFHKGZpbHApICgoZmlscC0+Zl9mbGFncyYoT19OREVMQVl8T19OT05CTE9DSykpID8gXAorCQkJRE1fRkxBR1NfTkRFTEFZIDogMCkKKyNkZWZpbmUgQVRfREVMQVlfRkxBRyhmKSAoKGYmQVRUUl9OT05CTE9DSykgPyBETV9GTEFHU19OREVMQVkgOiAwKQorCisKK2V4dGVybiBzdHJ1Y3QgYmh2X3Zmc29wcyB4ZnNfZG1vcHM7CisKKyNpZmRlZiBDT05GSUdfWEZTX0RNQVBJCit2b2lkIHhmc19kbV9pbml0KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICopOwordm9pZCB4ZnNfZG1fZXhpdChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqKTsKKyNkZWZpbmUgWEZTX0RNX0lOSVQoZnN0eXBlKQl4ZnNfZG1faW5pdChmc3R5cGUpCisjZGVmaW5lIFhGU19ETV9FWElUKGZzdHlwZSkJeGZzX2RtX2V4aXQoZnN0eXBlKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0RNX0lOSVQoZnN0eXBlKQorI2RlZmluZSBYRlNfRE1fRVhJVChmc3R5cGUpCisjZW5kaWYKKworI2VuZGlmICAvKiBfX1hGU19ETUFQSV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZG1vcHMuYyBiL2ZzL3hmcy94ZnNfZG1vcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWM1NGJhCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19kbW9wcy5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuCSBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisKK3hmc19kbW9wc190CXhmc19kbWNvcmVfc3R1YiA9IHsKKwkueGZzX3NlbmRfZGF0YQkJPSAoeGZzX3NlbmRfZGF0YV90KWZzX25vc3lzLAorCS54ZnNfc2VuZF9tbWFwCQk9ICh4ZnNfc2VuZF9tbWFwX3QpZnNfbm9lcnIsCisJLnhmc19zZW5kX2Rlc3Ryb3kJPSAoeGZzX3NlbmRfZGVzdHJveV90KWZzX25vc3lzLAorCS54ZnNfc2VuZF9uYW1lc3AJPSAoeGZzX3NlbmRfbmFtZXNwX3QpZnNfbm9zeXMsCisJLnhmc19zZW5kX3VubW91bnQJPSAoeGZzX3NlbmRfdW5tb3VudF90KWZzX25vdmFsLAorfTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZXJyb3IuYyBiL2ZzL3hmcy94ZnNfZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmUxZGVhCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19lcnJvci5jCkBAIC0wLDAgKzEsMzI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfdXRpbHMuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKworI2lmZGVmIERFQlVHCisKK2ludAl4ZnNfZXRyYXBbWEZTX0VSUk9SX05UUkFQXSA9IHsKKwkwLAorfTsKKworaW50Cit4ZnNfZXJyb3JfdHJhcChpbnQgZSkKK3sKKwlpbnQgaTsKKworCWlmICghZSkKKwkJcmV0dXJuIDA7CisJZm9yIChpID0gMDsgaSA8IFhGU19FUlJPUl9OVFJBUDsgaSsrKSB7CisJCWlmICh4ZnNfZXRyYXBbaV0gPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoZSAhPSB4ZnNfZXRyYXBbaV0pCisJCQljb250aW51ZTsKKwkJY21uX2VycihDRV9OT1RFLCAieGZzX2Vycm9yX3RyYXA6IGVycm9yICVkIiwgZSk7CisJCWRlYnVnX3N0b3BfYWxsX2NwdXMoKHZvaWQgKiktMUxMKTsKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZTsKK30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoSU5EVUNFX0lPX0VSUk9SKSkKKworaW50CXhmc19ldGVzdFtYRlNfTlVNX0lOSkVDVF9FUlJPUl07CitpbnQ2NF90CXhmc19ldGVzdF9mc2lkW1hGU19OVU1fSU5KRUNUX0VSUk9SXTsKK2NoYXIgKgl4ZnNfZXRlc3RfZnNuYW1lW1hGU19OVU1fSU5KRUNUX0VSUk9SXTsKKwordm9pZAoreGZzX2Vycm9yX3Rlc3RfaW5pdCh2b2lkKQoreworCW1lbXNldCh4ZnNfZXRlc3QsIDAsIHNpemVvZih4ZnNfZXRlc3QpKTsKKwltZW1zZXQoeGZzX2V0ZXN0X2ZzaWQsIDAsIHNpemVvZih4ZnNfZXRlc3RfZnNpZCkpOworCW1lbXNldCh4ZnNfZXRlc3RfZnNuYW1lLCAwLCBzaXplb2YoeGZzX2V0ZXN0X2ZzbmFtZSkpOworfQorCitpbnQKK3hmc19lcnJvcl90ZXN0KGludCBlcnJvcl90YWcsIGludCAqZnNpZHAsIGNoYXIgKmV4cHJlc3Npb24sCisJICAgICAgIGludCBsaW5lLCBjaGFyICpmaWxlLCB1bnNpZ25lZCBsb25nIHJhbmRmYWN0b3IpCit7CisJaW50IGk7CisJaW50NjRfdCBmc2lkOworCisJaWYgKHJhbmRvbSgpICUgcmFuZGZhY3RvcikKKwkJcmV0dXJuIDA7CisKKwltZW1jcHkoJmZzaWQsIGZzaWRwLCBzaXplb2YoeGZzX2ZzaWRfdCkpOworCisJZm9yIChpID0gMDsgaSA8IFhGU19OVU1fSU5KRUNUX0VSUk9SOyBpKyspICB7CisJCWlmICh4ZnNfZXRlc3RbaV0gPT0gZXJyb3JfdGFnICYmIHhmc19ldGVzdF9mc2lkW2ldID09IGZzaWQpIHsKKwkJCWNtbl9lcnIoQ0VfV0FSTiwKKwkiSW5qZWN0aW5nIGVycm9yICglcykgYXQgZmlsZSAlcywgbGluZSAlZCwgb24gZmlsZXN5c3RlbSBcIiVzXCIiLAorCQkJCWV4cHJlc3Npb24sIGZpbGUsIGxpbmUsIHhmc19ldGVzdF9mc25hbWVbaV0pOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50Cit4ZnNfZXJyb3J0YWdfYWRkKGludCBlcnJvcl90YWcsIHhmc19tb3VudF90ICptcCkKK3sKKwlpbnQgaTsKKwlpbnQgbGVuOworCWludDY0X3QgZnNpZDsKKworCW1lbWNweSgmZnNpZCwgbXAtPm1fZml4ZWRmc2lkLCBzaXplb2YoeGZzX2ZzaWRfdCkpOworCisJZm9yIChpID0gMDsgaSA8IFhGU19OVU1fSU5KRUNUX0VSUk9SOyBpKyspICB7CisJCWlmICh4ZnNfZXRlc3RfZnNpZFtpXSA9PSBmc2lkICYmIHhmc19ldGVzdFtpXSA9PSBlcnJvcl90YWcpIHsKKwkJCWNtbl9lcnIoQ0VfV0FSTiwgIlhGUyBlcnJvciB0YWcgIyVkIG9uIiwgZXJyb3JfdGFnKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IFhGU19OVU1fSU5KRUNUX0VSUk9SOyBpKyspICB7CisJCWlmICh4ZnNfZXRlc3RbaV0gPT0gMCkgeworCQkJY21uX2VycihDRV9XQVJOLCAiVHVybmVkIG9uIFhGUyBlcnJvciB0YWcgIyVkIiwKKwkJCQllcnJvcl90YWcpOworCQkJeGZzX2V0ZXN0W2ldID0gZXJyb3JfdGFnOworCQkJeGZzX2V0ZXN0X2ZzaWRbaV0gPSBmc2lkOworCQkJbGVuID0gc3RybGVuKG1wLT5tX2ZzbmFtZSk7CisJCQl4ZnNfZXRlc3RfZnNuYW1lW2ldID0ga21lbV9hbGxvYyhsZW4gKyAxLCBLTV9TTEVFUCk7CisJCQlzdHJjcHkoeGZzX2V0ZXN0X2ZzbmFtZVtpXSwgbXAtPm1fZnNuYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJY21uX2VycihDRV9XQVJOLCAiZXJyb3IgdGFnIG92ZXJmbG93LCB0b28gbWFueSB0dXJuZWQgb24iKTsKKworCXJldHVybiAxOworfQorCitpbnQKK3hmc19lcnJvcnRhZ19jbGVhcihpbnQgZXJyb3JfdGFnLCB4ZnNfbW91bnRfdCAqbXApCit7CisJaW50IGk7CisJaW50NjRfdCBmc2lkOworCisJbWVtY3B5KCZmc2lkLCBtcC0+bV9maXhlZGZzaWQsIHNpemVvZih4ZnNfZnNpZF90KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgWEZTX05VTV9JTkpFQ1RfRVJST1I7IGkrKykgeworCQlpZiAoeGZzX2V0ZXN0X2ZzaWRbaV0gPT0gZnNpZCAmJiB4ZnNfZXRlc3RbaV0gPT0gZXJyb3JfdGFnKSB7CisJCQl4ZnNfZXRlc3RbaV0gPSAwOworCQkJeGZzX2V0ZXN0X2ZzaWRbaV0gPSAwTEw7CisJCQlrbWVtX2ZyZWUoeGZzX2V0ZXN0X2ZzbmFtZVtpXSwKKwkJCQkgIHN0cmxlbih4ZnNfZXRlc3RfZnNuYW1lW2ldKSArIDEpOworCQkJeGZzX2V0ZXN0X2ZzbmFtZVtpXSA9IE5VTEw7CisJCQljbW5fZXJyKENFX1dBUk4sICJDbGVhcmVkIFhGUyBlcnJvciB0YWcgIyVkIiwKKwkJCQllcnJvcl90YWcpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwljbW5fZXJyKENFX1dBUk4sICJYRlMgZXJyb3IgdGFnICVkIG5vdCBvbiIsIGVycm9yX3RhZyk7CisKKwlyZXR1cm4gMTsKK30KKworaW50Cit4ZnNfZXJyb3J0YWdfY2xlYXJhbGxfdW1vdW50KGludDY0X3QgZnNpZCwgY2hhciAqZnNuYW1lLCBpbnQgbG91ZCkKK3sKKwlpbnQgaTsKKwlpbnQgY2xlYXJlZCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgWEZTX05VTV9JTkpFQ1RfRVJST1I7IGkrKykgeworCQlpZiAoKGZzaWQgPT0gMExMIHx8IHhmc19ldGVzdF9mc2lkW2ldID09IGZzaWQpICYmCisJCSAgICAgeGZzX2V0ZXN0W2ldICE9IDApIHsKKwkJCWNsZWFyZWQgPSAxOworCQkJY21uX2VycihDRV9XQVJOLCAiQ2xlYXJpbmcgWEZTIGVycm9yIHRhZyAjJWQiLAorCQkJCXhmc19ldGVzdFtpXSk7CisJCQl4ZnNfZXRlc3RbaV0gPSAwOworCQkJeGZzX2V0ZXN0X2ZzaWRbaV0gPSAwTEw7CisJCQlrbWVtX2ZyZWUoeGZzX2V0ZXN0X2ZzbmFtZVtpXSwKKwkJCQkgIHN0cmxlbih4ZnNfZXRlc3RfZnNuYW1lW2ldKSArIDEpOworCQkJeGZzX2V0ZXN0X2ZzbmFtZVtpXSA9IE5VTEw7CisJCX0KKwl9CisKKwlpZiAobG91ZCB8fCBjbGVhcmVkKQorCQljbW5fZXJyKENFX1dBUk4sCisJCQkiQ2xlYXJlZCBhbGwgWEZTIGVycm9yIHRhZ3MgZm9yIGZpbGVzeXN0ZW0gXCIlc1wiIiwKKwkJCWZzbmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50Cit4ZnNfZXJyb3J0YWdfY2xlYXJhbGwoeGZzX21vdW50X3QgKm1wKQoreworCWludDY0X3QgZnNpZDsKKworCW1lbWNweSgmZnNpZCwgbXAtPm1fZml4ZWRmc2lkLCBzaXplb2YoeGZzX2ZzaWRfdCkpOworCisJcmV0dXJuIHhmc19lcnJvcnRhZ19jbGVhcmFsbF91bW91bnQoZnNpZCwgbXAtPm1fZnNuYW1lLCAxKTsKK30KKyNlbmRpZiAvKiBERUJVRyB8fCBJTkRVQ0VfSU9fRVJST1IgKi8KKworc3RhdGljIHZvaWQKK3hmc19mc192Y21uX2VycihpbnQgbGV2ZWwsIHhmc19tb3VudF90ICptcCwgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworCWlmIChtcCAhPSBOVUxMKSB7CisJCWNoYXIJKm5ld2ZtdDsKKwkJaW50CWxlbiA9IDE2ICsgbXAtPm1fZnNuYW1lX2xlbiArIHN0cmxlbihmbXQpOworCisJCW5ld2ZtdCA9IGttZW1fYWxsb2MobGVuLCBLTV9TTEVFUCk7CisJCXNwcmludGYobmV3Zm10LCAiRmlsZXN5c3RlbSBcIiVzXCI6ICVzIiwgbXAtPm1fZnNuYW1lLCBmbXQpOworCQlpY21uX2VycihsZXZlbCwgbmV3Zm10LCBhcCk7CisJCWttZW1fZnJlZShuZXdmbXQsIGxlbik7CisJfSBlbHNlIHsKKwkJaWNtbl9lcnIobGV2ZWwsIGZtdCwgYXApOworCX0KK30KKwordm9pZAoreGZzX2ZzX2Ntbl9lcnIoaW50IGxldmVsLCB4ZnNfbW91bnRfdCAqbXAsIGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwl4ZnNfZnNfdmNtbl9lcnIobGV2ZWwsIG1wLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworfQorCit2b2lkCit4ZnNfY21uX2VycihpbnQgcGFuaWNfdGFnLCBpbnQgbGV2ZWwsIHhmc19tb3VudF90ICptcCwgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworI2lmZGVmIERFQlVHCisJeGZzX3BhbmljX21hc2sgfD0gWEZTX1BUQUdfU0hVVERPV05fQ09SUlVQVDsKKyNlbmRpZgorCisJaWYgKHhmc19wYW5pY19tYXNrICYmICh4ZnNfcGFuaWNfbWFzayAmIHBhbmljX3RhZykKKwkgICAgJiYgKGxldmVsICYgQ0VfQUxFUlQpKSB7CisJCWxldmVsICY9IH5DRV9BTEVSVDsKKwkJbGV2ZWwgfD0gQ0VfUEFOSUM7CisJCWNtbl9lcnIoQ0VfQUxFUlQsICJYRlM6IFRyYW5zZm9ybWluZyBhbiBhbGVydCBpbnRvIGEgQlVHLiIpOworCX0KKwl2YV9zdGFydChhcCwgZm10KTsKKwl4ZnNfZnNfdmNtbl9lcnIobGV2ZWwsIG1wLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworfQorCit2b2lkCit4ZnNfZXJyb3JfcmVwb3J0KAorCWNoYXIJCSp0YWcsCisJaW50CQlsZXZlbCwKKwl4ZnNfbW91bnRfdAkqbXAsCisJY2hhcgkJKmZuYW1lLAorCWludAkJbGluZW51bSwKKwlpbnN0X3QJCSpyYSkKK3sKKwlpZiAobGV2ZWwgPD0geGZzX2Vycm9yX2xldmVsKSB7CisJCXhmc19jbW5fZXJyKFhGU19QVEFHX0VSUk9SX1JFUE9SVCwKKwkJCSAgICBDRV9BTEVSVCwgbXAsCisJCSJYRlMgaW50ZXJuYWwgZXJyb3IgJXMgYXQgbGluZSAlZCBvZiBmaWxlICVzLiAgQ2FsbGVyIDB4JXBcbiIsCisJCQkgICAgdGFnLCBsaW5lbnVtLCBmbmFtZSwgcmEpOworCisJCXhmc19zdGFja190cmFjZSgpOworCX0KK30KKwordm9pZAoreGZzX2hleF9kdW1wKHZvaWQgKnAsIGludCBsZW5ndGgpCit7CisJX191aW50OF90ICp1aXAgPSAoX191aW50OF90KilwOworCWludAlpOworCWNoYXIJc2J1ZlsxMjhdLCAqczsKKworCXMgPSBzYnVmOworCSpzID0gJ1wwJzsKKwlmb3IgKGk9MDsgaTxsZW5ndGg7IGkrKywgdWlwKyspIHsKKwkJaWYgKChpICUgMTYpID09IDApIHsKKwkJCWlmICgqcyAhPSAnXDAnKQorCQkJCWNtbl9lcnIoQ0VfQUxFUlQsICIlc1xuIiwgc2J1Zik7CisJCQlzID0gc2J1ZjsKKwkJCXNwcmludGYocywgIjB4JXg6ICIsIGkpOworCQkJd2hpbGUoICpzICE9ICdcMCcpCisJCQkJcysrOworCQl9CisJCXNwcmludGYocywgIiUwMnggIiwgKnVpcCk7CisKKwkJLyoKKwkJICogdGhlIGtlcm5lbCBzcHJpbnRmIGlzIGEgdm9pZDsgdXNlciBzcHJpbnRmIHJldHVybnMKKwkJICogdGhlIHNwcmludGYnZWQgc3RyaW5nJ3MgbGVuZ3RoLiAgRmluZCB0aGUgbmV3IGVuZC0KKwkJICogb2Ytc3RyaW5nCisJCSAqLworCQl3aGlsZSggKnMgIT0gJ1wwJykKKwkJCXMrKzsKKwl9CisJY21uX2VycihDRV9BTEVSVCwgIiVzXG4iLCBzYnVmKTsKK30KKwordm9pZAoreGZzX2NvcnJ1cHRpb25fZXJyb3IoCisJY2hhcgkJKnRhZywKKwlpbnQJCWxldmVsLAorCXhmc19tb3VudF90CSptcCwKKwl2b2lkCQkqcCwKKwljaGFyCQkqZm5hbWUsCisJaW50CQlsaW5lbnVtLAorCWluc3RfdAkJKnJhKQoreworCWlmIChsZXZlbCA8PSB4ZnNfZXJyb3JfbGV2ZWwpCisJCXhmc19oZXhfZHVtcChwLCAxNik7CisJeGZzX2Vycm9yX3JlcG9ydCh0YWcsIGxldmVsLCBtcCwgZm5hbWUsIGxpbmVudW0sIHJhKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZXJyb3IuaCBiL2ZzL3hmcy94ZnNfZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmMwNTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19lcnJvci5oCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZglfX1hGU19FUlJPUl9IX18KKyNkZWZpbmUJX19YRlNfRVJST1JfSF9fCisKKyNkZWZpbmUgcHJkZXYoZm10LHRhcmcsYXJncy4uLikgXAorCXByaW50aygiWEZTOiBkZXZpY2UgJXMtICIgZm10ICJcbiIsIFhGU19CVUZUQVJHX05BTUUodGFyZyksICMjIGFyZ3MpCisKKyNkZWZpbmUgWEZTX0VSRUNPVkVSCTEJLyogRmFpbHVyZSB0byByZWNvdmVyIGxvZyAqLworI2RlZmluZSBYRlNfRUxPR1NUQVQJMgkvKiBGYWlsdXJlIHRvIHN0YXQgbG9nIGluIHVzZXIgc3BhY2UgKi8KKyNkZWZpbmUgWEZTX0VOT0xPR1NQQUNFCTMJLyogUmVzZXJ2YXRpb24gdG9vIGxhcmdlICovCisjZGVmaW5lIFhGU19FTk9UU1VQCTQJLyogT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUJWEZTX0VOT0xTTgk1CS8qIENhbid0IGZpbmQgdGhlIGxzbiB5b3UgYXNrZWQgZm9yICovCisjZGVmaW5lIFhGU19FTk9URk9VTkQJNgorI2RlZmluZSBYRlNfRU5PVFhGUwk3CS8qIE5vdCBYRlMgZmlsZXN5c3RlbSAqLworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUJWEZTX0VSUk9SX05UUkFQCTEwCitleHRlcm4gaW50CXhmc19ldHJhcFtYRlNfRVJST1JfTlRSQVBdOworZXh0ZXJuIGludAl4ZnNfZXJyb3JfdHJhcChpbnQpOworI2RlZmluZQlYRlNfRVJST1IoZSkJeGZzX2Vycm9yX3RyYXAoZSkKKyNlbHNlCisjZGVmaW5lCVhGU19FUlJPUihlKQkoZSkKKyNlbmRpZgorCitzdHJ1Y3QgeGZzX21vdW50OworCitleHRlcm4gdm9pZAoreGZzX2Vycm9yX3JlcG9ydCgKKwljaGFyCQkqdGFnLAorCWludAkJbGV2ZWwsCisJc3RydWN0IHhmc19tb3VudCAqbXAsCisJY2hhcgkJKmZuYW1lLAorCWludAkJbGluZW51bSwKKwlpbnN0X3QJCSpyYSk7CisKK2V4dGVybiB2b2lkCit4ZnNfY29ycnVwdGlvbl9lcnJvcigKKwljaGFyCQkqdGFnLAorCWludAkJbGV2ZWwsCisJc3RydWN0IHhmc19tb3VudCAqbXAsCisJdm9pZAkJKnAsCisJY2hhcgkJKmZuYW1lLAorCWludAkJbGluZW51bSwKKwlpbnN0X3QJCSpyYSk7CisKK2V4dGVybiB2b2lkCit4ZnNfaGV4X2R1bXAodm9pZCAqcCwgaW50IGxlbmd0aCk7CisKKyNkZWZpbmUJWEZTX0VSUk9SX1JFUE9SVChlLCBsdmwsIG1wKQlcCisJeGZzX2Vycm9yX3JlcG9ydChlLCBsdmwsIG1wLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fcmV0dXJuX2FkZHJlc3MpCisjZGVmaW5lCVhGU19DT1JSVVBUSU9OX0VSUk9SKGUsIGx2bCwgbXAsIG1lbSkJXAorCXhmc19jb3JydXB0aW9uX2Vycm9yKGUsIGx2bCwgbXAsIG1lbSwgXAorCQkJICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fcmV0dXJuX2FkZHJlc3MpCisKKyNkZWZpbmUgWEZTX0VSUkxFVkVMX09GRgkwCisjZGVmaW5lIFhGU19FUlJMRVZFTF9MT1cJMQorI2RlZmluZSBYRlNfRVJSTEVWRUxfSElHSAk1CisKKy8qCisgKiBlcnJvciBpbmplY3Rpb24gdGFncyAtIHRoZSBsYWJlbHMgY2FuIGJlIGFueXRoaW5nIHlvdSB3YW50CisgKiBidXQgZWFjaCB0YWcgc2hvdWxkIGhhdmUgaXRzIG93biB1bmlxdWUgbnVtYmVyCisgKi8KKworI2RlZmluZSBYRlNfRVJSVEFHX05PRVJST1IJCQkJMAorI2RlZmluZSBYRlNfRVJSVEFHX0lGTFVTSF8xCQkJCTEKKyNkZWZpbmUgWEZTX0VSUlRBR19JRkxVU0hfMgkJCQkyCisjZGVmaW5lIFhGU19FUlJUQUdfSUZMVVNIXzMJCQkJMworI2RlZmluZSBYRlNfRVJSVEFHX0lGTFVTSF80CQkJCTQKKyNkZWZpbmUgWEZTX0VSUlRBR19JRkxVU0hfNQkJCQk1CisjZGVmaW5lIFhGU19FUlJUQUdfSUZMVVNIXzYJCQkJNgorI2RlZmluZQlYRlNfRVJSVEFHX0RBX1JFQURfQlVGCQkJCTcKKyNkZWZpbmUJWEZTX0VSUlRBR19CVFJFRV9DSEVDS19MQkxPQ0sJCQk4CisjZGVmaW5lCVhGU19FUlJUQUdfQlRSRUVfQ0hFQ0tfU0JMT0NLCQkJOQorI2RlZmluZQlYRlNfRVJSVEFHX0FMTE9DX1JFQURfQUdGCQkJMTAKKyNkZWZpbmUJWEZTX0VSUlRBR19JQUxMT0NfUkVBRF9BR0kJCQkxMQorI2RlZmluZQlYRlNfRVJSVEFHX0lUT0JQX0lOT1RPQlAJCQkxMgorI2RlZmluZQlYRlNfRVJSVEFHX0lVTkxJTksJCQkJMTMKKyNkZWZpbmUJWEZTX0VSUlRBR19JVU5MSU5LX1JFTU9WRQkJCTE0CisjZGVmaW5lCVhGU19FUlJUQUdfRElSX0lOT19WQUxJREFURQkJCTE1CisjZGVmaW5lIFhGU19FUlJUQUdfQlVMS1NUQVRfUkVBRF9DSFVOSwkJCTE2CisjZGVmaW5lIFhGU19FUlJUQUdfSU9ET05FX0lPRVJSCQkJCTE3CisjZGVmaW5lIFhGU19FUlJUQUdfU1RSQVRSRUFEX0lPRVJSCQkJMTgKKyNkZWZpbmUgWEZTX0VSUlRBR19TVFJBVENNUExfSU9FUlIJCQkxOQorI2RlZmluZSBYRlNfRVJSVEFHX0RJT1dSSVRFX0lPRVJSCQkJMjAKKyNkZWZpbmUgWEZTX0VSUlRBR19CTUFQSUZPUk1BVAkJCQkyMQorI2RlZmluZSBYRlNfRVJSVEFHX01BWAkJCQkJMjIKKworLyoKKyAqIFJhbmRvbSBmYWN0b3JzIGZvciBhYm92ZSB0YWdzLCAxIG1lYW5zIGFsd2F5cywgMiBtZWFucyAxLzIgdGltZSwgZXRjLgorICovCisjZGVmaW5lIFhGU19SQU5ET01fREVGQVVMVAkJCQkxMDAKKyNkZWZpbmUgWEZTX1JBTkRPTV9JRkxVU0hfMQkJCQlYRlNfUkFORE9NX0RFRkFVTFQKKyNkZWZpbmUgWEZTX1JBTkRPTV9JRkxVU0hfMgkJCQlYRlNfUkFORE9NX0RFRkFVTFQKKyNkZWZpbmUgWEZTX1JBTkRPTV9JRkxVU0hfMwkJCQlYRlNfUkFORE9NX0RFRkFVTFQKKyNkZWZpbmUgWEZTX1JBTkRPTV9JRkxVU0hfNAkJCQlYRlNfUkFORE9NX0RFRkFVTFQKKyNkZWZpbmUgWEZTX1JBTkRPTV9JRkxVU0hfNQkJCQlYRlNfUkFORE9NX0RFRkFVTFQKKyNkZWZpbmUgWEZTX1JBTkRPTV9JRkxVU0hfNgkJCQlYRlNfUkFORE9NX0RFRkFVTFQKKyNkZWZpbmUgWEZTX1JBTkRPTV9EQV9SRUFEX0JVRgkJCQlYRlNfUkFORE9NX0RFRkFVTFQKKyNkZWZpbmUgWEZTX1JBTkRPTV9CVFJFRV9DSEVDS19MQkxPQ0sJCQkoWEZTX1JBTkRPTV9ERUZBVUxULzQpCisjZGVmaW5lIFhGU19SQU5ET01fQlRSRUVfQ0hFQ0tfU0JMT0NLCQkJWEZTX1JBTkRPTV9ERUZBVUxUCisjZGVmaW5lIFhGU19SQU5ET01fQUxMT0NfUkVBRF9BR0YJCQlYRlNfUkFORE9NX0RFRkFVTFQKKyNkZWZpbmUgWEZTX1JBTkRPTV9JQUxMT0NfUkVBRF9BR0kJCQlYRlNfUkFORE9NX0RFRkFVTFQKKyNkZWZpbmUgWEZTX1JBTkRPTV9JVE9CUF9JTk9UT0JQCQkJWEZTX1JBTkRPTV9ERUZBVUxUCisjZGVmaW5lIFhGU19SQU5ET01fSVVOTElOSwkJCQlYRlNfUkFORE9NX0RFRkFVTFQKKyNkZWZpbmUgWEZTX1JBTkRPTV9JVU5MSU5LX1JFTU9WRQkJCVhGU19SQU5ET01fREVGQVVMVAorI2RlZmluZSBYRlNfUkFORE9NX0RJUl9JTk9fVkFMSURBVEUJCQlYRlNfUkFORE9NX0RFRkFVTFQKKyNkZWZpbmUgWEZTX1JBTkRPTV9CVUxLU1RBVF9SRUFEX0NIVU5LCQkJWEZTX1JBTkRPTV9ERUZBVUxUCisjZGVmaW5lIFhGU19SQU5ET01fSU9ET05FX0lPRVJSCQkJCShYRlNfUkFORE9NX0RFRkFVTFQvMTApCisjZGVmaW5lIFhGU19SQU5ET01fU1RSQVRSRUFEX0lPRVJSCQkJKFhGU19SQU5ET01fREVGQVVMVC8xMCkKKyNkZWZpbmUgWEZTX1JBTkRPTV9TVFJBVENNUExfSU9FUlIJCQkoWEZTX1JBTkRPTV9ERUZBVUxULzEwKQorI2RlZmluZSBYRlNfUkFORE9NX0RJT1dSSVRFX0lPRVJSCQkJKFhGU19SQU5ET01fREVGQVVMVC8xMCkKKyNkZWZpbmUJWEZTX1JBTkRPTV9CTUFQSUZPUk1BVAkJCQlYRlNfUkFORE9NX0RFRkFVTFQKKworI2lmIChkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKElORFVDRV9JT19FUlJPUikpCitleHRlcm4gaW50CXhmc19lcnJvcl90ZXN0KGludCwgaW50ICosIGNoYXIgKiwgaW50LCBjaGFyICosIHVuc2lnbmVkIGxvbmcpOwordm9pZCB4ZnNfZXJyb3JfdGVzdF9pbml0KHZvaWQpOworCisjZGVmaW5lCVhGU19OVU1fSU5KRUNUX0VSUk9SCQkJCTEwCisKKyNpZmRlZiBfX0FOU0lfQ1BQX18KKyNkZWZpbmUgWEZTX1RFU1RfRVJST1IoZXhwciwgbXAsIHRhZywgcmYpCQlcCisJKChleHByKSB8fCBcCisJIHhmc19lcnJvcl90ZXN0KCh0YWcpLCAobXApLT5tX2ZpeGVkZnNpZCwgI2V4cHIsIF9fTElORV9fLCBfX0ZJTEVfXywgXAorCQkJIChyZikpKQorI2Vsc2UKKyNkZWZpbmUgWEZTX1RFU1RfRVJST1IoZXhwciwgbXAsIHRhZywgcmYpCQlcCisJKChleHByKSB8fCBcCisJIHhmc19lcnJvcl90ZXN0KCh0YWcpLCAobXApLT5tX2ZpeGVkZnNpZCwgImV4cHIiLCBfX0xJTkVfXywgX19GSUxFX18sIFwKKwkJCShyZikpKQorI2VuZGlmIC8qIF9fQU5TSV9DUFBfXyAqLworCitpbnQJCXhmc19lcnJvcnRhZ19hZGQoaW50IGVycm9yX3RhZywgeGZzX21vdW50X3QgKm1wKTsKK2ludAkJeGZzX2Vycm9ydGFnX2NsZWFyKGludCBlcnJvcl90YWcsIHhmc19tb3VudF90ICptcCk7CisKK2ludAkJeGZzX2Vycm9ydGFnX2NsZWFyYWxsKHhmc19tb3VudF90ICptcCk7CitpbnQJCXhmc19lcnJvcnRhZ19jbGVhcmFsbF91bW91bnQoaW50NjRfdCBmc2lkLCBjaGFyICpmc25hbWUsCisJCQkJCQlpbnQgbG91ZCk7CisjZWxzZQorI2RlZmluZSBYRlNfVEVTVF9FUlJPUihleHByLCBtcCwgdGFnLCByZikJKGV4cHIpCisjZGVmaW5lIHhmc19lcnJvcnRhZ19hZGQodGFnLCBtcCkJCShFTk9TWVMpCisjZGVmaW5lIHhmc19lcnJvcnRhZ19jbGVhcmFsbChtcCkJCShFTk9TWVMpCisjZW5kaWYgLyogKERFQlVHIHx8IElORFVDRV9JT19FUlJPUikgKi8KKworLyoKKyAqIFhGUyBwYW5pYyB0YWdzIC0tIGFsbG93IGEgY2FsbCB0byB4ZnNfY21uX2VycigpIGJlIHR1cm5lZCBpbnRvCisgKgkJCWEgcGFuaWMgYnkgc2V0dGluZyB4ZnNfcGFuaWNfbWFzayBpbiBhCisgKgkJCXN5c2N0bC4gIHVwZGF0ZSB4ZnNfbWF4W1hGU19QQVJBTV0gaWYKKyAqCQkJbW9yZSBhcmUgYWRkZWQuCisgKi8KKyNkZWZpbmUJCVhGU19OT19QVEFHCQkJMAorI2RlZmluZQkJWEZTX1BUQUdfSUZMVVNICQkJMHgwMDAwMDAwMQorI2RlZmluZQkJWEZTX1BUQUdfTE9HUkVTCQkJMHgwMDAwMDAwMgorI2RlZmluZQkJWEZTX1BUQUdfQUlMREVMRVRFCQkweDAwMDAwMDA0CisjZGVmaW5lCQlYRlNfUFRBR19FUlJPUl9SRVBPUlQJCTB4MDAwMDAwMDgKKyNkZWZpbmUJCVhGU19QVEFHX1NIVVRET1dOX0NPUlJVUFQJMHgwMDAwMDAxMAorI2RlZmluZQkJWEZTX1BUQUdfU0hVVERPV05fSU9FUlJPUgkweDAwMDAwMDIwCisjZGVmaW5lCQlYRlNfUFRBR19TSFVURE9XTl9MT0dFUlJPUgkweDAwMDAwMDQwCisKK3N0cnVjdCB4ZnNfbW91bnQ7CisvKiBQUklOVEZMSUtFNCAqLwordm9pZAkJeGZzX2Ntbl9lcnIoaW50IHBhbmljX3RhZywgaW50IGxldmVsLCBzdHJ1Y3QgeGZzX21vdW50ICptcCwKKwkJCSAgICBjaGFyICpmbXQsIC4uLik7CisvKiBQUklOVEZMSUtFMyAqLwordm9pZAkJeGZzX2ZzX2Ntbl9lcnIoaW50IGxldmVsLCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgY2hhciAqZm10LCAuLi4pOworCisjZW5kaWYJLyogX19YRlNfRVJST1JfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5jIGIvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWFmZDViCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uYwpAQCAtMCwwICsxLDY2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHhmc19lZmlfbG9nX2l0ZW0KKyAqIGFuZCB4ZnNfZWZkX2xvZ19pdGVtIGl0ZW1zLgorICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKworI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKKyNpbmNsdWRlICJ4ZnNfZXh0ZnJlZV9pdGVtLmgiCisKKwora21lbV96b25lX3QJKnhmc19lZmlfem9uZTsKK2ttZW1fem9uZV90CSp4ZnNfZWZkX3pvbmU7CisKK1NUQVRJQyB2b2lkCXhmc19lZmlfaXRlbV91bmxvY2soeGZzX2VmaV9sb2dfaXRlbV90ICopOworU1RBVElDIHZvaWQJeGZzX2VmaV9pdGVtX2Fib3J0KHhmc19lZmlfbG9nX2l0ZW1fdCAqKTsKK1NUQVRJQyB2b2lkCXhmc19lZmRfaXRlbV9hYm9ydCh4ZnNfZWZkX2xvZ19pdGVtX3QgKik7CisKKworCisvKgorICogVGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgaW92ZWNzIG5lZWRlZCB0byBsb2cgdGhlIGdpdmVuIGVmaSBpdGVtLgorICogV2Ugb25seSBuZWVkIDEgaW92ZWMgZm9yIGFuIGVmaSBpdGVtLiAgSXQganVzdCBsb2dzIHRoZSBlZmlfbG9nX2Zvcm1hdAorICogc3RydWN0dXJlLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB1aW50Cit4ZnNfZWZpX2l0ZW1fc2l6ZSh4ZnNfZWZpX2xvZ19pdGVtX3QgKmVmaXApCit7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byBmaWxsIGluIHRoZSB2ZWN0b3Igb2YgbG9nIGlvdmVjcyBmb3IgdGhlCisgKiBnaXZlbiBlZmkgbG9nIGl0ZW0uIFdlIHVzZSBvbmx5IDEgaW92ZWMsIGFuZCB3ZSBwb2ludCB0aGF0CisgKiBhdCB0aGUgZWZpX2xvZ19mb3JtYXQgc3RydWN0dXJlIGVtYmVkZGVkIGluIHRoZSBlZmkgaXRlbS4KKyAqIEl0IGlzIGF0IHRoaXMgcG9pbnQgdGhhdCB3ZSBhc3NlcnQgdGhhdCBhbGwgb2YgdGhlIGV4dGVudAorICogc2xvdHMgaW4gdGhlIGVmaSBpdGVtIGhhdmUgYmVlbiBmaWxsZWQuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfZWZpX2l0ZW1fZm9ybWF0KHhmc19lZmlfbG9nX2l0ZW1fdAkqZWZpcCwKKwkJICAgIHhmc19sb2dfaW92ZWNfdAkqbG9nX3ZlY3RvcikKK3sKKwl1aW50CXNpemU7CisKKwlBU1NFUlQoZWZpcC0+ZWZpX25leHRfZXh0ZW50ID09IGVmaXAtPmVmaV9mb3JtYXQuZWZpX25leHRlbnRzKTsKKworCWVmaXAtPmVmaV9mb3JtYXQuZWZpX3R5cGUgPSBYRlNfTElfRUZJOworCisJc2l6ZSA9IHNpemVvZih4ZnNfZWZpX2xvZ19mb3JtYXRfdCk7CisJc2l6ZSArPSAoZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfbmV4dGVudHMgLSAxKSAqIHNpemVvZih4ZnNfZXh0ZW50X3QpOworCWVmaXAtPmVmaV9mb3JtYXQuZWZpX3NpemUgPSAxOworCisJbG9nX3ZlY3Rvci0+aV9hZGRyID0gKHhmc19jYWRkcl90KSYoZWZpcC0+ZWZpX2Zvcm1hdCk7CisJbG9nX3ZlY3Rvci0+aV9sZW4gPSBzaXplOworCUFTU0VSVChzaXplID49IHNpemVvZih4ZnNfZWZpX2xvZ19mb3JtYXRfdCkpOworfQorCisKKy8qCisgKiBQaW5uaW5nIGhhcyBubyBtZWFuaW5nIGZvciBhbiBlZmkgaXRlbSwgc28ganVzdCByZXR1cm4uCisgKi8KKy8qQVJHU1VTRUQqLworU1RBVElDIHZvaWQKK3hmc19lZmlfaXRlbV9waW4oeGZzX2VmaV9sb2dfaXRlbV90ICplZmlwKQoreworCXJldHVybjsKK30KKworCisvKgorICogV2hpbGUgRUZJcyBjYW5ub3QgcmVhbGx5IGJlIHBpbm5lZCwgdGhlIHVucGluIG9wZXJhdGlvbiBpcyB0aGUKKyAqIGxhc3QgcGxhY2UgYXQgd2hpY2ggdGhlIEVGSSBpcyBtYW5pcHVsYXRlZCBkdXJpbmcgYSB0cmFuc2FjdGlvbi4KKyAqIEhlcmUgd2UgY29vcmRpbmF0ZSB3aXRoIHhmc19lZmlfY2FuY2VsKCkgdG8gZGV0ZXJtaW5lIHdobyBnZXRzIHRvCisgKiBmcmVlIHRoZSBFRkkuCisgKi8KKy8qQVJHU1VTRUQqLworU1RBVElDIHZvaWQKK3hmc19lZmlfaXRlbV91bnBpbih4ZnNfZWZpX2xvZ19pdGVtX3QgKmVmaXAsIGludCBzdGFsZSkKK3sKKwlpbnQJCW5leHRzOworCWludAkJc2l6ZTsKKwl4ZnNfbW91bnRfdAkqbXA7CisJU1BMREVDTChzKTsKKworCW1wID0gZWZpcC0+ZWZpX2l0ZW0ubGlfbW91bnRwOworCUFJTF9MT0NLKG1wLCBzKTsKKwlpZiAoZWZpcC0+ZWZpX2ZsYWdzICYgWEZTX0VGSV9DQU5DRUxFRCkgeworCQkvKgorCQkgKiB4ZnNfdHJhbnNfZGVsZXRlX2FpbCgpIGRyb3BzIHRoZSBBSUwgbG9jay4KKwkJICovCisJCXhmc190cmFuc19kZWxldGVfYWlsKG1wLCAoeGZzX2xvZ19pdGVtX3QgKillZmlwLCBzKTsKKworCQluZXh0cyA9IGVmaXAtPmVmaV9mb3JtYXQuZWZpX25leHRlbnRzOworCQlpZiAobmV4dHMgPiBYRlNfRUZJX01BWF9GQVNUX0VYVEVOVFMpIHsKKwkJCXNpemUgPSBzaXplb2YoeGZzX2VmaV9sb2dfaXRlbV90KTsKKwkJCXNpemUgKz0gKG5leHRzIC0gMSkgKiBzaXplb2YoeGZzX2V4dGVudF90KTsKKwkJCWttZW1fZnJlZShlZmlwLCBzaXplKTsKKwkJfSBlbHNlIHsKKwkJCWttZW1fem9uZV9mcmVlKHhmc19lZmlfem9uZSwgZWZpcCk7CisJCX0KKwl9IGVsc2UgeworCQllZmlwLT5lZmlfZmxhZ3MgfD0gWEZTX0VGSV9DT01NSVRURUQ7CisJCUFJTF9VTkxPQ0sobXAsIHMpOworCX0KKworCXJldHVybjsKK30KKworLyoKKyAqIGxpa2UgdW5waW4gb25seSB3ZSBoYXZlIHRvIGFsc28gY2xlYXIgdGhlIHhhY3Rpb24gZGVzY3JpcHRvcgorICogcG9pbnRpbmcgdGhlIGxvZyBpdGVtIGlmIHdlIGZyZWUgdGhlIGl0ZW0uICBUaGlzIHJvdXRpbmUgZHVwbGljYXRlcworICogdW5waW4gYmVjYXVzZSBlZmlfZmxhZ3MgaXMgcHJvdGVjdGVkIGJ5IHRoZSBBSUwgbG9jay4gIEZyZWVpbmcKKyAqIHRoZSBkZXNjcmlwdG9yIGFuZCB0aGVuIGNhbGxpbmcgdW5waW4gd291bGQgZm9yY2UgdXMgdG8gZHJvcCB0aGUgQUlMCisgKiBsb2NrIHdoaWNoIHdvdWxkIG9wZW4gdXAgYSByYWNlIGNvbmRpdGlvbi4KKyAqLworU1RBVElDIHZvaWQKK3hmc19lZmlfaXRlbV91bnBpbl9yZW1vdmUoeGZzX2VmaV9sb2dfaXRlbV90ICplZmlwLCB4ZnNfdHJhbnNfdCAqdHApCit7CisJaW50CQluZXh0czsKKwlpbnQJCXNpemU7CisJeGZzX21vdW50X3QJKm1wOworCXhmc19sb2dfaXRlbV9kZXNjX3QJKmxpZHA7CisJU1BMREVDTChzKTsKKworCW1wID0gZWZpcC0+ZWZpX2l0ZW0ubGlfbW91bnRwOworCUFJTF9MT0NLKG1wLCBzKTsKKwlpZiAoZWZpcC0+ZWZpX2ZsYWdzICYgWEZTX0VGSV9DQU5DRUxFRCkgeworCQkvKgorCQkgKiBmcmVlIHRoZSB4YWN0aW9uIGRlc2NyaXB0b3IgcG9pbnRpbmcgdG8gdGhpcyBpdGVtCisJCSAqLworCQlsaWRwID0geGZzX3RyYW5zX2ZpbmRfaXRlbSh0cCwgKHhmc19sb2dfaXRlbV90ICopIGVmaXApOworCQl4ZnNfdHJhbnNfZnJlZV9pdGVtKHRwLCBsaWRwKTsKKwkJLyoKKwkJICogcHVsbCB0aGUgaXRlbSBvZmYgdGhlIEFJTC4KKwkJICogeGZzX3RyYW5zX2RlbGV0ZV9haWwoKSBkcm9wcyB0aGUgQUlMIGxvY2suCisJCSAqLworCQl4ZnNfdHJhbnNfZGVsZXRlX2FpbChtcCwgKHhmc19sb2dfaXRlbV90ICopZWZpcCwgcyk7CisJCS8qCisJCSAqIG5vdyBmcmVlIHRoZSBpdGVtIGl0c2VsZgorCQkgKi8KKwkJbmV4dHMgPSBlZmlwLT5lZmlfZm9ybWF0LmVmaV9uZXh0ZW50czsKKwkJaWYgKG5leHRzID4gWEZTX0VGSV9NQVhfRkFTVF9FWFRFTlRTKSB7CisJCQlzaXplID0gc2l6ZW9mKHhmc19lZmlfbG9nX2l0ZW1fdCk7CisJCQlzaXplICs9IChuZXh0cyAtIDEpICogc2l6ZW9mKHhmc19leHRlbnRfdCk7CisJCQlrbWVtX2ZyZWUoZWZpcCwgc2l6ZSk7CisJCX0gZWxzZSB7CisJCQlrbWVtX3pvbmVfZnJlZSh4ZnNfZWZpX3pvbmUsIGVmaXApOworCQl9CisJfSBlbHNlIHsKKwkJZWZpcC0+ZWZpX2ZsYWdzIHw9IFhGU19FRklfQ09NTUlUVEVEOworCQlBSUxfVU5MT0NLKG1wLCBzKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBFZmkgaXRlbXMgaGF2ZSBubyBsb2NraW5nIG9yIHB1c2hpbmcuICBIb3dldmVyLCBzaW5jZSBFRklzIGFyZQorICogcHVsbGVkIGZyb20gdGhlIEFJTCB3aGVuIHRoZWlyIGNvcnJlc3BvbmRpbmcgRUZEcyBhcmUgY29tbWl0dGVkCisgKiB0byBkaXNrLCB0aGVpciBzaXR1YXRpb24gaXMgdmVyeSBzaW1pbGFyIHRvIGJlaW5nIHBpbm5lZC4gIFJldHVybgorICogWEZTX0lURU1fUElOTkVEIHNvIHRoYXQgdGhlIGNhbGxlciB3aWxsIGV2ZW50dWFsbHkgZmx1c2ggdGhlIGxvZy4KKyAqIFRoaXMgc2hvdWxkIGhlbHAgaW4gZ2V0dGluZyB0aGUgRUZJIG91dCBvZiB0aGUgQUlMLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB1aW50Cit4ZnNfZWZpX2l0ZW1fdHJ5bG9jayh4ZnNfZWZpX2xvZ19pdGVtX3QgKmVmaXApCit7CisJcmV0dXJuIFhGU19JVEVNX1BJTk5FRDsKK30KKworLyoKKyAqIEVmaSBpdGVtcyBoYXZlIG5vIGxvY2tpbmcsIHNvIGp1c3QgcmV0dXJuLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB2b2lkCit4ZnNfZWZpX2l0ZW1fdW5sb2NrKHhmc19lZmlfbG9nX2l0ZW1fdCAqZWZpcCkKK3sKKwlpZiAoZWZpcC0+ZWZpX2l0ZW0ubGlfZmxhZ3MgJiBYRlNfTElfQUJPUlRFRCkKKwkJeGZzX2VmaV9pdGVtX2Fib3J0KGVmaXApOworCXJldHVybjsKK30KKworLyoKKyAqIFRoZSBFRkkgaXMgbG9nZ2VkIG9ubHkgb25jZSBhbmQgY2Fubm90IGJlIG1vdmVkIGluIHRoZSBsb2csIHNvCisgKiBzaW1wbHkgcmV0dXJuIHRoZSBsc24gYXQgd2hpY2ggaXQncyBiZWVuIGxvZ2dlZC4gIFRoZSBjYW5jZWxlZAorICogZmxhZyBpcyBub3QgcGFpZCBhbnkgYXR0ZW50aW9uIGhlcmUuICBDaGVja2luZyBmb3IgdGhhdCBpcyBkZWxheWVkCisgKiB1bnRpbCB0aGUgRUZJIGlzIHVucGlubmVkLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB4ZnNfbHNuX3QKK3hmc19lZmlfaXRlbV9jb21taXR0ZWQoeGZzX2VmaV9sb2dfaXRlbV90ICplZmlwLCB4ZnNfbHNuX3QgbHNuKQoreworCXJldHVybiBsc247Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSB0cmFuc2FjdGlvbiBsb2dnaW5nIHRoZSBFRkkgaXMgYWJvcnRlZC4KKyAqIEZyZWUgdXAgdGhlIEVGSSBhbmQgcmV0dXJuLiAgTm8gbmVlZCB0byBjbGVhbiB1cCB0aGUgc2xvdCBmb3IKKyAqIHRoZSBpdGVtIGluIHRoZSB0cmFuc2FjdGlvbi4gIFRoYXQgd2FzIGRvbmUgYnkgdGhlIHVucGluIGNvZGUKKyAqIHdoaWNoIGlzIGNhbGxlZCBwcmlvciB0byB0aGlzIHJvdXRpbmUgaW4gdGhlIGFib3J0L2ZzLXNodXRkb3duIHBhdGguCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfZWZpX2l0ZW1fYWJvcnQoeGZzX2VmaV9sb2dfaXRlbV90ICplZmlwKQoreworCWludAluZXh0czsKKwlpbnQJc2l6ZTsKKworCW5leHRzID0gZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfbmV4dGVudHM7CisJaWYgKG5leHRzID4gWEZTX0VGSV9NQVhfRkFTVF9FWFRFTlRTKSB7CisJCXNpemUgPSBzaXplb2YoeGZzX2VmaV9sb2dfaXRlbV90KTsKKwkJc2l6ZSArPSAobmV4dHMgLSAxKSAqIHNpemVvZih4ZnNfZXh0ZW50X3QpOworCQlrbWVtX2ZyZWUoZWZpcCwgc2l6ZSk7CisJfSBlbHNlIHsKKwkJa21lbV96b25lX2ZyZWUoeGZzX2VmaV96b25lLCBlZmlwKTsKKwl9CisJcmV0dXJuOworfQorCisvKgorICogVGhlcmUgaXNuJ3QgbXVjaCB5b3UgY2FuIGRvIHRvIHB1c2ggb24gYW4gZWZpIGl0ZW0uICBJdCBpcyBzaW1wbHkKKyAqIHN0dWNrIHdhaXRpbmcgZm9yIGFsbCBvZiBpdHMgY29ycmVzcG9uZGluZyBlZmQgaXRlbXMgdG8gYmUKKyAqIGNvbW1pdHRlZCB0byBkaXNrLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB2b2lkCit4ZnNfZWZpX2l0ZW1fcHVzaCh4ZnNfZWZpX2xvZ19pdGVtX3QgKmVmaXApCit7CisJcmV0dXJuOworfQorCisvKgorICogVGhlIEVGSSBkZXBlbmRlbmN5IHRyYWNraW5nIG9wIGRvZXNuJ3QgZG8gc3F1YXQuICBJdCBjYW4ndCBiZWNhdXNlCisgKiBpdCBkb2Vzbid0IGtub3cgd2hlcmUgdGhlIGZyZWUgZXh0ZW50IGlzIGNvbWluZyBmcm9tLiAgVGhlIGRlcGVuZGVuY3kKKyAqIHRyYWNraW5nIGhhcyB0byBiZSBoYW5kbGVkIGJ5IHRoZSAiZW5jbG9zaW5nIiBtZXRhZGF0YSBvYmplY3QuICBGb3IKKyAqIGV4YW1wbGUsIGZvciBpbm9kZXMsIHRoZSBpbm9kZSBpcyBsb2NrZWQgdGhyb3VnaG91dCB0aGUgZXh0ZW50IGZyZWVpbmcKKyAqIHNvIHRoZSBkZXBlbmRlbmN5IHNob3VsZCBiZSByZWNvcmRlZCB0aGVyZS4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgdm9pZAoreGZzX2VmaV9pdGVtX2NvbW1pdHRpbmcoeGZzX2VmaV9sb2dfaXRlbV90ICplZmlwLCB4ZnNfbHNuX3QgbHNuKQoreworCXJldHVybjsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIG9wcyB2ZWN0b3Igc2hhcmVkIGJ5IGFsbCBlZmkgbG9nIGl0ZW1zLgorICovCitzdHJ1Y3QgeGZzX2l0ZW1fb3BzIHhmc19lZmlfaXRlbV9vcHMgPSB7CisJLmlvcF9zaXplCT0gKHVpbnQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfZWZpX2l0ZW1fc2l6ZSwKKwkuaW9wX2Zvcm1hdAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xvZ19pb3ZlY190KikpCisJCQkJCXhmc19lZmlfaXRlbV9mb3JtYXQsCisJLmlvcF9waW4JPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19lZmlfaXRlbV9waW4sCisJLmlvcF91bnBpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgaW50KSl4ZnNfZWZpX2l0ZW1fdW5waW4sCisJLmlvcF91bnBpbl9yZW1vdmUgPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc190cmFuc190ICopKQorCQkJCQl4ZnNfZWZpX2l0ZW1fdW5waW5fcmVtb3ZlLAorCS5pb3BfdHJ5bG9jawk9ICh1aW50KCopKHhmc19sb2dfaXRlbV90KikpeGZzX2VmaV9pdGVtX3RyeWxvY2ssCisJLmlvcF91bmxvY2sJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19lZmlfaXRlbV91bmxvY2ssCisJLmlvcF9jb21taXR0ZWQJPSAoeGZzX2xzbl90KCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xzbl90KSkKKwkJCQkJeGZzX2VmaV9pdGVtX2NvbW1pdHRlZCwKKwkuaW9wX3B1c2gJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19lZmlfaXRlbV9wdXNoLAorCS5pb3BfYWJvcnQJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19lZmlfaXRlbV9hYm9ydCwKKwkuaW9wX3B1c2hidWYJPSBOVUxMLAorCS5pb3BfY29tbWl0dGluZyA9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xzbl90KSkKKwkJCQkJeGZzX2VmaV9pdGVtX2NvbW1pdHRpbmcKK307CisKKworLyoKKyAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIGVmaSBpdGVtIHdpdGggdGhlIGdpdmVuIG51bWJlciBvZiBleHRlbnRzLgorICovCit4ZnNfZWZpX2xvZ19pdGVtX3QgKgoreGZzX2VmaV9pbml0KHhmc19tb3VudF90CSptcCwKKwkgICAgIHVpbnQJCW5leHRlbnRzKQorCit7CisJeGZzX2VmaV9sb2dfaXRlbV90CSplZmlwOworCXVpbnQJCQlzaXplOworCisJQVNTRVJUKG5leHRlbnRzID4gMCk7CisJaWYgKG5leHRlbnRzID4gWEZTX0VGSV9NQVhfRkFTVF9FWFRFTlRTKSB7CisJCXNpemUgPSAodWludCkoc2l6ZW9mKHhmc19lZmlfbG9nX2l0ZW1fdCkgKworCQkJKChuZXh0ZW50cyAtIDEpICogc2l6ZW9mKHhmc19leHRlbnRfdCkpKTsKKwkJZWZpcCA9ICh4ZnNfZWZpX2xvZ19pdGVtX3QqKWttZW1femFsbG9jKHNpemUsIEtNX1NMRUVQKTsKKwl9IGVsc2UgeworCQllZmlwID0gKHhmc19lZmlfbG9nX2l0ZW1fdCopa21lbV96b25lX3phbGxvYyh4ZnNfZWZpX3pvbmUsCisJCQkJCQkJICAgICBLTV9TTEVFUCk7CisJfQorCisJZWZpcC0+ZWZpX2l0ZW0ubGlfdHlwZSA9IFhGU19MSV9FRkk7CisJZWZpcC0+ZWZpX2l0ZW0ubGlfb3BzID0gJnhmc19lZmlfaXRlbV9vcHM7CisJZWZpcC0+ZWZpX2l0ZW0ubGlfbW91bnRwID0gbXA7CisJZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfbmV4dGVudHMgPSBuZXh0ZW50czsKKwllZmlwLT5lZmlfZm9ybWF0LmVmaV9pZCA9IChfX3BzaW50X3QpKHZvaWQqKWVmaXA7CisKKwlyZXR1cm4gKGVmaXApOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGVmZCBpdGVtIGNvZGUgYmVsb3cgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvCisgKiB0aGUgZ2l2ZW4gZWZpIGl0ZW0uICBFYWNoIGVmZCBjYWxscyB0aGlzIHdpdGggdGhlIG51bWJlciBvZgorICogZXh0ZW50cyB0aGF0IGl0IGhhcyBsb2dnZWQsIGFuZCB3aGVuIHRoZSBzdW0gb2YgdGhlc2UgcmVhY2hlcworICogdGhlIHRvdGFsIG51bWJlciBvZiBleHRlbnRzIGxvZ2dlZCBieSB0aGlzIGVmaSBpdGVtIHdlIGNhbiBmcmVlCisgKiB0aGUgZWZpIGl0ZW0uCisgKgorICogRnJlZWluZyB0aGUgZWZpIGl0ZW0gcmVxdWlyZXMgdGhhdCB3ZSByZW1vdmUgaXQgZnJvbSB0aGUgQUlMLgorICogV2UnbGwgdXNlIHRoZSBBSUwgbG9jayB0byBwcm90ZWN0IG91ciBjb3VudGVycyBhcyB3ZWxsIGFzCisgKiB0aGUgcmVtb3ZhbCBmcm9tIHRoZSBBSUwuCisgKi8KK3ZvaWQKK3hmc19lZmlfcmVsZWFzZSh4ZnNfZWZpX2xvZ19pdGVtX3QJKmVmaXAsCisJCXVpbnQJCQluZXh0ZW50cykKK3sKKwl4ZnNfbW91bnRfdAkqbXA7CisJaW50CQlleHRlbnRzX2xlZnQ7CisJdWludAkJc2l6ZTsKKwlpbnQJCW5leHRzOworCVNQTERFQ0wocyk7CisKKwltcCA9IGVmaXAtPmVmaV9pdGVtLmxpX21vdW50cDsKKwlBU1NFUlQoZWZpcC0+ZWZpX25leHRfZXh0ZW50ID4gMCk7CisJQVNTRVJUKGVmaXAtPmVmaV9mbGFncyAmIFhGU19FRklfQ09NTUlUVEVEKTsKKworCUFJTF9MT0NLKG1wLCBzKTsKKwlBU1NFUlQoZWZpcC0+ZWZpX25leHRfZXh0ZW50ID49IG5leHRlbnRzKTsKKwllZmlwLT5lZmlfbmV4dF9leHRlbnQgLT0gbmV4dGVudHM7CisJZXh0ZW50c19sZWZ0ID0gZWZpcC0+ZWZpX25leHRfZXh0ZW50OworCWlmIChleHRlbnRzX2xlZnQgPT0gMCkgeworCQkvKgorCQkgKiB4ZnNfdHJhbnNfZGVsZXRlX2FpbCgpIGRyb3BzIHRoZSBBSUwgbG9jay4KKwkJICovCisJCXhmc190cmFuc19kZWxldGVfYWlsKG1wLCAoeGZzX2xvZ19pdGVtX3QgKillZmlwLCBzKTsKKwl9IGVsc2UgeworCQlBSUxfVU5MT0NLKG1wLCBzKTsKKwl9CisKKwlpZiAoZXh0ZW50c19sZWZ0ID09IDApIHsKKwkJbmV4dHMgPSBlZmlwLT5lZmlfZm9ybWF0LmVmaV9uZXh0ZW50czsKKwkJaWYgKG5leHRzID4gWEZTX0VGSV9NQVhfRkFTVF9FWFRFTlRTKSB7CisJCQlzaXplID0gc2l6ZW9mKHhmc19lZmlfbG9nX2l0ZW1fdCk7CisJCQlzaXplICs9IChuZXh0cyAtIDEpICogc2l6ZW9mKHhmc19leHRlbnRfdCk7CisJCQlrbWVtX2ZyZWUoZWZpcCwgc2l6ZSk7CisJCX0gZWxzZSB7CisJCQlrbWVtX3pvbmVfZnJlZSh4ZnNfZWZpX3pvbmUsIGVmaXApOworCQl9CisJfQorfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgdHJhbnNhY3Rpb24gdGhhdCBzaG91bGQgYmUgY29tbWl0dGluZyB0aGUKKyAqIEVGRCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBFRkkgaXMgYWJvcnRlZC4gIFRoZSBjb21taXR0ZWQgYW5kCisgKiBjYW5jZWxlZCBmbGFncyBhcmUgdXNlZCB0byBjb29yZGluYXRlIHRoZSBmcmVlaW5nIG9mIHRoZSBFRkkgYW5kCisgKiB0aGUgcmVmZXJlbmNlcyBieSB0aGUgdHJhbnNhY3Rpb24gdGhhdCBjb21taXR0ZWQgaXQuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfZWZpX2NhbmNlbCgKKwl4ZnNfZWZpX2xvZ19pdGVtX3QJKmVmaXApCit7CisJaW50CQluZXh0czsKKwlpbnQJCXNpemU7CisJeGZzX21vdW50X3QJKm1wOworCVNQTERFQ0wocyk7CisKKwltcCA9IGVmaXAtPmVmaV9pdGVtLmxpX21vdW50cDsKKwlBSUxfTE9DSyhtcCwgcyk7CisJaWYgKGVmaXAtPmVmaV9mbGFncyAmIFhGU19FRklfQ09NTUlUVEVEKSB7CisJCS8qCisJCSAqIHhmc190cmFuc19kZWxldGVfYWlsKCkgZHJvcHMgdGhlIEFJTCBsb2NrLgorCQkgKi8KKwkJeGZzX3RyYW5zX2RlbGV0ZV9haWwobXAsICh4ZnNfbG9nX2l0ZW1fdCAqKWVmaXAsIHMpOworCisJCW5leHRzID0gZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfbmV4dGVudHM7CisJCWlmIChuZXh0cyA+IFhGU19FRklfTUFYX0ZBU1RfRVhURU5UUykgeworCQkJc2l6ZSA9IHNpemVvZih4ZnNfZWZpX2xvZ19pdGVtX3QpOworCQkJc2l6ZSArPSAobmV4dHMgLSAxKSAqIHNpemVvZih4ZnNfZXh0ZW50X3QpOworCQkJa21lbV9mcmVlKGVmaXAsIHNpemUpOworCQl9IGVsc2UgeworCQkJa21lbV96b25lX2ZyZWUoeGZzX2VmaV96b25lLCBlZmlwKTsKKwkJfQorCX0gZWxzZSB7CisJCWVmaXAtPmVmaV9mbGFncyB8PSBYRlNfRUZJX0NBTkNFTEVEOworCQlBSUxfVU5MT0NLKG1wLCBzKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKworCisKKworLyoKKyAqIFRoaXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGlvdmVjcyBuZWVkZWQgdG8gbG9nIHRoZSBnaXZlbiBlZmQgaXRlbS4KKyAqIFdlIG9ubHkgbmVlZCAxIGlvdmVjIGZvciBhbiBlZmQgaXRlbS4gIEl0IGp1c3QgbG9ncyB0aGUgZWZkX2xvZ19mb3JtYXQKKyAqIHN0cnVjdHVyZS4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgdWludAoreGZzX2VmZF9pdGVtX3NpemUoeGZzX2VmZF9sb2dfaXRlbV90ICplZmRwKQoreworCXJldHVybiAxOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gZmlsbCBpbiB0aGUgdmVjdG9yIG9mIGxvZyBpb3ZlY3MgZm9yIHRoZQorICogZ2l2ZW4gZWZkIGxvZyBpdGVtLiBXZSB1c2Ugb25seSAxIGlvdmVjLCBhbmQgd2UgcG9pbnQgdGhhdAorICogYXQgdGhlIGVmZF9sb2dfZm9ybWF0IHN0cnVjdHVyZSBlbWJlZGRlZCBpbiB0aGUgZWZkIGl0ZW0uCisgKiBJdCBpcyBhdCB0aGlzIHBvaW50IHRoYXQgd2UgYXNzZXJ0IHRoYXQgYWxsIG9mIHRoZSBleHRlbnQKKyAqIHNsb3RzIGluIHRoZSBlZmQgaXRlbSBoYXZlIGJlZW4gZmlsbGVkLgorICovCitTVEFUSUMgdm9pZAoreGZzX2VmZF9pdGVtX2Zvcm1hdCh4ZnNfZWZkX2xvZ19pdGVtX3QJKmVmZHAsCisJCSAgICB4ZnNfbG9nX2lvdmVjX3QJKmxvZ192ZWN0b3IpCit7CisJdWludAlzaXplOworCisJQVNTRVJUKGVmZHAtPmVmZF9uZXh0X2V4dGVudCA9PSBlZmRwLT5lZmRfZm9ybWF0LmVmZF9uZXh0ZW50cyk7CisKKwllZmRwLT5lZmRfZm9ybWF0LmVmZF90eXBlID0gWEZTX0xJX0VGRDsKKworCXNpemUgPSBzaXplb2YoeGZzX2VmZF9sb2dfZm9ybWF0X3QpOworCXNpemUgKz0gKGVmZHAtPmVmZF9mb3JtYXQuZWZkX25leHRlbnRzIC0gMSkgKiBzaXplb2YoeGZzX2V4dGVudF90KTsKKwllZmRwLT5lZmRfZm9ybWF0LmVmZF9zaXplID0gMTsKKworCWxvZ192ZWN0b3ItPmlfYWRkciA9ICh4ZnNfY2FkZHJfdCkmKGVmZHAtPmVmZF9mb3JtYXQpOworCWxvZ192ZWN0b3ItPmlfbGVuID0gc2l6ZTsKKwlBU1NFUlQoc2l6ZSA+PSBzaXplb2YoeGZzX2VmZF9sb2dfZm9ybWF0X3QpKTsKK30KKworCisvKgorICogUGlubmluZyBoYXMgbm8gbWVhbmluZyBmb3IgYW4gZWZkIGl0ZW0sIHNvIGp1c3QgcmV0dXJuLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB2b2lkCit4ZnNfZWZkX2l0ZW1fcGluKHhmc19lZmRfbG9nX2l0ZW1fdCAqZWZkcCkKK3sKKwlyZXR1cm47Cit9CisKKworLyoKKyAqIFNpbmNlIHBpbm5pbmcgaGFzIG5vIG1lYW5pbmcgZm9yIGFuIGVmZCBpdGVtLCB1bnBpbm5pbmcgZG9lcworICogbm90IGVpdGhlci4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgdm9pZAoreGZzX2VmZF9pdGVtX3VucGluKHhmc19lZmRfbG9nX2l0ZW1fdCAqZWZkcCwgaW50IHN0YWxlKQoreworCXJldHVybjsKK30KKworLypBUkdTVVNFRCovCitTVEFUSUMgdm9pZAoreGZzX2VmZF9pdGVtX3VucGluX3JlbW92ZSh4ZnNfZWZkX2xvZ19pdGVtX3QgKmVmZHAsIHhmc190cmFuc190ICp0cCkKK3sKKwlyZXR1cm47Cit9CisKKy8qCisgKiBFZmQgaXRlbXMgaGF2ZSBubyBsb2NraW5nLCBzbyBqdXN0IHJldHVybiBzdWNjZXNzLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB1aW50Cit4ZnNfZWZkX2l0ZW1fdHJ5bG9jayh4ZnNfZWZkX2xvZ19pdGVtX3QgKmVmZHApCit7CisJcmV0dXJuIFhGU19JVEVNX0xPQ0tFRDsKK30KKworLyoKKyAqIEVmZCBpdGVtcyBoYXZlIG5vIGxvY2tpbmcgb3IgcHVzaGluZywgc28gcmV0dXJuIGZhaWx1cmUKKyAqIHNvIHRoYXQgdGhlIGNhbGxlciBkb2Vzbid0IGJvdGhlciB3aXRoIHVzLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB2b2lkCit4ZnNfZWZkX2l0ZW1fdW5sb2NrKHhmc19lZmRfbG9nX2l0ZW1fdCAqZWZkcCkKK3sKKwlpZiAoZWZkcC0+ZWZkX2l0ZW0ubGlfZmxhZ3MgJiBYRlNfTElfQUJPUlRFRCkKKwkJeGZzX2VmZF9pdGVtX2Fib3J0KGVmZHApOworCXJldHVybjsKK30KKworLyoKKyAqIFdoZW4gdGhlIGVmZCBpdGVtIGlzIGNvbW1pdHRlZCB0byBkaXNrLCBhbGwgd2UgbmVlZCB0byBkbworICogaXMgZGVsZXRlIG91ciByZWZlcmVuY2UgdG8gb3VyIHBhcnRuZXIgZWZpIGl0ZW0gYW5kIHRoZW4KKyAqIGZyZWUgb3Vyc2VsdmVzLiAgU2luY2Ugd2UncmUgZnJlZWluZyBvdXJzZWx2ZXMgd2UgbXVzdAorICogcmV0dXJuIC0xIHRvIGtlZXAgdGhlIHRyYW5zYWN0aW9uIGNvZGUgZnJvbSBmdXJ0aGVyIHJlZmVyZW5jaW5nCisgKiB0aGlzIGl0ZW0uCisgKi8KKy8qQVJHU1VTRUQqLworU1RBVElDIHhmc19sc25fdAoreGZzX2VmZF9pdGVtX2NvbW1pdHRlZCh4ZnNfZWZkX2xvZ19pdGVtX3QgKmVmZHAsIHhmc19sc25fdCBsc24pCit7CisJdWludAlzaXplOworCWludAluZXh0czsKKworCS8qCisJICogSWYgd2UgZ290IGEgbG9nIEkvTyBlcnJvciwgaXQncyBhbHdheXMgdGhlIGNhc2UgdGhhdCB0aGUgTFIgd2l0aCB0aGUKKwkgKiBFRkkgZ290IHVucGlubmVkIGFuZCBmcmVlZCBiZWZvcmUgdGhlIEVGRCBnb3QgYWJvcnRlZC4KKwkgKi8KKwlpZiAoKGVmZHAtPmVmZF9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0FCT1JURUQpID09IDApCisJCXhmc19lZmlfcmVsZWFzZShlZmRwLT5lZmRfZWZpcCwgZWZkcC0+ZWZkX2Zvcm1hdC5lZmRfbmV4dGVudHMpOworCisJbmV4dHMgPSBlZmRwLT5lZmRfZm9ybWF0LmVmZF9uZXh0ZW50czsKKwlpZiAobmV4dHMgPiBYRlNfRUZEX01BWF9GQVNUX0VYVEVOVFMpIHsKKwkJc2l6ZSA9IHNpemVvZih4ZnNfZWZkX2xvZ19pdGVtX3QpOworCQlzaXplICs9IChuZXh0cyAtIDEpICogc2l6ZW9mKHhmc19leHRlbnRfdCk7CisJCWttZW1fZnJlZShlZmRwLCBzaXplKTsKKwl9IGVsc2UgeworCQlrbWVtX3pvbmVfZnJlZSh4ZnNfZWZkX3pvbmUsIGVmZHApOworCX0KKworCXJldHVybiAoeGZzX2xzbl90KS0xOworfQorCisvKgorICogVGhlIHRyYW5zYWN0aW9uIG9mIHdoaWNoIHRoaXMgRUZEIGlzIGEgcGFydCBoYXMgYmVlbiBhYm9ydGVkLgorICogSW5mb3JtIGl0cyBjb21wYW5pb24gRUZJIG9mIHRoaXMgZmFjdCBhbmQgdGhlbiBjbGVhbiB1cCBhZnRlcgorICogb3Vyc2VsdmVzLiAgTm8gbmVlZCB0byBjbGVhbiB1cCB0aGUgc2xvdCBmb3IgdGhlIGl0ZW0gaW4gdGhlCisgKiB0cmFuc2FjdGlvbi4gIFRoYXQgd2FzIGRvbmUgYnkgdGhlIHVucGluIGNvZGUgd2hpY2ggaXMgY2FsbGVkCisgKiBwcmlvciB0byB0aGlzIHJvdXRpbmUgaW4gdGhlIGFib3J0L2ZzLXNodXRkb3duIHBhdGguCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfZWZkX2l0ZW1fYWJvcnQoeGZzX2VmZF9sb2dfaXRlbV90ICplZmRwKQoreworCWludAluZXh0czsKKwlpbnQJc2l6ZTsKKworCS8qCisJICogSWYgd2UgZ290IGEgbG9nIEkvTyBlcnJvciwgaXQncyBhbHdheXMgdGhlIGNhc2UgdGhhdCB0aGUgTFIgd2l0aCB0aGUKKwkgKiBFRkkgZ290IHVucGlubmVkIGFuZCBmcmVlZCBiZWZvcmUgdGhlIEVGRCBnb3QgYWJvcnRlZC4gU28gZG9uJ3QKKwkgKiByZWZlcmVuY2UgdGhlIEVGSSBhdCBhbGwgaW4gdGhhdCBjYXNlLgorCSAqLworCWlmICgoZWZkcC0+ZWZkX2l0ZW0ubGlfZmxhZ3MgJiBYRlNfTElfQUJPUlRFRCkgPT0gMCkKKwkJeGZzX2VmaV9jYW5jZWwoZWZkcC0+ZWZkX2VmaXApOworCisJbmV4dHMgPSBlZmRwLT5lZmRfZm9ybWF0LmVmZF9uZXh0ZW50czsKKwlpZiAobmV4dHMgPiBYRlNfRUZEX01BWF9GQVNUX0VYVEVOVFMpIHsKKwkJc2l6ZSA9IHNpemVvZih4ZnNfZWZkX2xvZ19pdGVtX3QpOworCQlzaXplICs9IChuZXh0cyAtIDEpICogc2l6ZW9mKHhmc19leHRlbnRfdCk7CisJCWttZW1fZnJlZShlZmRwLCBzaXplKTsKKwl9IGVsc2UgeworCQlrbWVtX3pvbmVfZnJlZSh4ZnNfZWZkX3pvbmUsIGVmZHApOworCX0KKwlyZXR1cm47Cit9CisKKy8qCisgKiBUaGVyZSBpc24ndCBtdWNoIHlvdSBjYW4gZG8gdG8gcHVzaCBvbiBhbiBlZmQgaXRlbS4gIEl0IGlzIHNpbXBseQorICogc3R1Y2sgd2FpdGluZyBmb3IgdGhlIGxvZyB0byBiZSBmbHVzaGVkIHRvIGRpc2suCisgKi8KKy8qQVJHU1VTRUQqLworU1RBVElDIHZvaWQKK3hmc19lZmRfaXRlbV9wdXNoKHhmc19lZmRfbG9nX2l0ZW1fdCAqZWZkcCkKK3sKKwlyZXR1cm47Cit9CisKKy8qCisgKiBUaGUgRUZEIGRlcGVuZGVuY3kgdHJhY2tpbmcgb3AgZG9lc24ndCBkbyBzcXVhdC4gIEl0IGNhbid0IGJlY2F1c2UKKyAqIGl0IGRvZXNuJ3Qga25vdyB3aGVyZSB0aGUgZnJlZSBleHRlbnQgaXMgY29taW5nIGZyb20uICBUaGUgZGVwZW5kZW5jeQorICogdHJhY2tpbmcgaGFzIHRvIGJlIGhhbmRsZWQgYnkgdGhlICJlbmNsb3NpbmciIG1ldGFkYXRhIG9iamVjdC4gIEZvcgorICogZXhhbXBsZSwgZm9yIGlub2RlcywgdGhlIGlub2RlIGlzIGxvY2tlZCB0aHJvdWdob3V0IHRoZSBleHRlbnQgZnJlZWluZworICogc28gdGhlIGRlcGVuZGVuY3kgc2hvdWxkIGJlIHJlY29yZGVkIHRoZXJlLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB2b2lkCit4ZnNfZWZkX2l0ZW1fY29tbWl0dGluZyh4ZnNfZWZkX2xvZ19pdGVtX3QgKmVmaXAsIHhmc19sc25fdCBsc24pCit7CisJcmV0dXJuOworfQorCisvKgorICogVGhpcyBpcyB0aGUgb3BzIHZlY3RvciBzaGFyZWQgYnkgYWxsIGVmZCBsb2cgaXRlbXMuCisgKi8KK3N0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX2VmZF9pdGVtX29wcyA9IHsKKwkuaW9wX3NpemUJPSAodWludCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19lZmRfaXRlbV9zaXplLAorCS5pb3BfZm9ybWF0CT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfbG9nX2lvdmVjX3QqKSkKKwkJCQkJeGZzX2VmZF9pdGVtX2Zvcm1hdCwKKwkuaW9wX3Bpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX2VmZF9pdGVtX3BpbiwKKwkuaW9wX3VucGluCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCBpbnQpKXhmc19lZmRfaXRlbV91bnBpbiwKKwkuaW9wX3VucGluX3JlbW92ZSA9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgeGZzX3RyYW5zX3QqKSkKKwkJCQkJeGZzX2VmZF9pdGVtX3VucGluX3JlbW92ZSwKKwkuaW9wX3RyeWxvY2sJPSAodWludCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19lZmRfaXRlbV90cnlsb2NrLAorCS5pb3BfdW5sb2NrCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfZWZkX2l0ZW1fdW5sb2NrLAorCS5pb3BfY29tbWl0dGVkCT0gKHhmc19sc25fdCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sc25fdCkpCisJCQkJCXhmc19lZmRfaXRlbV9jb21taXR0ZWQsCisJLmlvcF9wdXNoCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfZWZkX2l0ZW1fcHVzaCwKKwkuaW9wX2Fib3J0CT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfZWZkX2l0ZW1fYWJvcnQsCisJLmlvcF9wdXNoYnVmCT0gTlVMTCwKKwkuaW9wX2NvbW1pdHRpbmcgPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sc25fdCkpCisJCQkJCXhmc19lZmRfaXRlbV9jb21taXR0aW5nCit9OworCisKKy8qCisgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBlZmQgaXRlbSB3aXRoIHRoZSBnaXZlbiBudW1iZXIgb2YgZXh0ZW50cy4KKyAqLworeGZzX2VmZF9sb2dfaXRlbV90ICoKK3hmc19lZmRfaW5pdCh4ZnNfbW91bnRfdAkqbXAsCisJICAgICB4ZnNfZWZpX2xvZ19pdGVtX3QJKmVmaXAsCisJICAgICB1aW50CQluZXh0ZW50cykKKworeworCXhmc19lZmRfbG9nX2l0ZW1fdAkqZWZkcDsKKwl1aW50CQkJc2l6ZTsKKworCUFTU0VSVChuZXh0ZW50cyA+IDApOworCWlmIChuZXh0ZW50cyA+IFhGU19FRkRfTUFYX0ZBU1RfRVhURU5UUykgeworCQlzaXplID0gKHVpbnQpKHNpemVvZih4ZnNfZWZkX2xvZ19pdGVtX3QpICsKKwkJCSgobmV4dGVudHMgLSAxKSAqIHNpemVvZih4ZnNfZXh0ZW50X3QpKSk7CisJCWVmZHAgPSAoeGZzX2VmZF9sb2dfaXRlbV90KilrbWVtX3phbGxvYyhzaXplLCBLTV9TTEVFUCk7CisJfSBlbHNlIHsKKwkJZWZkcCA9ICh4ZnNfZWZkX2xvZ19pdGVtX3QqKWttZW1fem9uZV96YWxsb2MoeGZzX2VmZF96b25lLAorCQkJCQkJCSAgICAgS01fU0xFRVApOworCX0KKworCWVmZHAtPmVmZF9pdGVtLmxpX3R5cGUgPSBYRlNfTElfRUZEOworCWVmZHAtPmVmZF9pdGVtLmxpX29wcyA9ICZ4ZnNfZWZkX2l0ZW1fb3BzOworCWVmZHAtPmVmZF9pdGVtLmxpX21vdW50cCA9IG1wOworCWVmZHAtPmVmZF9lZmlwID0gZWZpcDsKKwllZmRwLT5lZmRfZm9ybWF0LmVmZF9uZXh0ZW50cyA9IG5leHRlbnRzOworCWVmZHAtPmVmZF9mb3JtYXQuZWZkX2VmaV9pZCA9IGVmaXAtPmVmaV9mb3JtYXQuZWZpX2lkOworCisJcmV0dXJuIChlZmRwKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmggYi9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMjJkNjEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5oCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYJX19YRlNfRVhURlJFRV9JVEVNX0hfXworI2RlZmluZQlfX1hGU19FWFRGUkVFX0lURU1fSF9fCisKK3N0cnVjdCB4ZnNfbW91bnQ7CitzdHJ1Y3Qga21lbV96b25lOworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZXh0ZW50IHsKKwl4ZnNfZGZzYm5vX3QJZXh0X3N0YXJ0OworCXhmc19leHRsZW5fdAlleHRfbGVuOworfSB4ZnNfZXh0ZW50X3Q7CisKKy8qCisgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBsYXkgb3V0IGFuIGVmaSBsb2cgaXRlbSBpbiB0aGUKKyAqIGxvZy4gIFRoZSBlZmlfZXh0ZW50cyBmaWVsZCBpcyBhIHZhcmlhYmxlIHNpemUgYXJyYXkgd2hvc2UKKyAqIHNpemUgaXMgZ2l2ZW4gYnkgZWZpX25leHRlbnRzLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZWZpX2xvZ19mb3JtYXQgeworCXVuc2lnbmVkIHNob3J0CQllZmlfdHlwZTsJLyogZWZpIGxvZyBpdGVtIHR5cGUgKi8KKwl1bnNpZ25lZCBzaG9ydAkJZWZpX3NpemU7CS8qIHNpemUgb2YgdGhpcyBpdGVtICovCisJdWludAkJCWVmaV9uZXh0ZW50czsJLyogIyBleHRlbnRzIHRvIGZyZWUgKi8KKwlfX3VpbnQ2NF90CQllZmlfaWQ7CQkvKiBlZmkgaWRlbnRpZmllciAqLworCXhmc19leHRlbnRfdAkJZWZpX2V4dGVudHNbMV07CS8qIGFycmF5IG9mIGV4dGVudHMgdG8gZnJlZSAqLworfSB4ZnNfZWZpX2xvZ19mb3JtYXRfdDsKKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB1c2VkIHRvIGxheSBvdXQgYW4gZWZkIGxvZyBpdGVtIGluIHRoZQorICogbG9nLiAgVGhlIGVmZF9leHRlbnRzIGFycmF5IGlzIGEgdmFyaWFibGUgc2l6ZSBhcnJheSB3aG9zZQorICogc2l6ZSBpcyBnaXZlbiBieSBlZmRfbmV4dGVudHM7CisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19lZmRfbG9nX2Zvcm1hdCB7CisJdW5zaWduZWQgc2hvcnQJCWVmZF90eXBlOwkvKiBlZmQgbG9nIGl0ZW0gdHlwZSAqLworCXVuc2lnbmVkIHNob3J0CQllZmRfc2l6ZTsJLyogc2l6ZSBvZiB0aGlzIGl0ZW0gKi8KKwl1aW50CQkJZWZkX25leHRlbnRzOwkvKiAjIG9mIGV4dGVudHMgZnJlZWQgKi8KKwlfX3VpbnQ2NF90CQllZmRfZWZpX2lkOwkvKiBpZCBvZiBjb3JyZXNwb25kaW5nIGVmaSAqLworCXhmc19leHRlbnRfdAkJZWZkX2V4dGVudHNbMV07CS8qIGFycmF5IG9mIGV4dGVudHMgZnJlZWQgKi8KK30geGZzX2VmZF9sb2dfZm9ybWF0X3Q7CisKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoKKyAqIE1heCBudW1iZXIgb2YgZXh0ZW50cyBpbiBmYXN0IGFsbG9jYXRpb24gcGF0aC4KKyAqLworI2RlZmluZQlYRlNfRUZJX01BWF9GQVNUX0VYVEVOVFMJMTYKKworLyoKKyAqIERlZmluZSBFRkkgZmxhZ3MuCisgKi8KKyNkZWZpbmUJWEZTX0VGSV9SRUNPVkVSRUQJMHgxCisjZGVmaW5lCVhGU19FRklfQ09NTUlUVEVECTB4MgorI2RlZmluZQlYRlNfRUZJX0NBTkNFTEVECTB4NAorCisvKgorICogVGhpcyBpcyB0aGUgImV4dGVudCBmcmVlIGludGVudGlvbiIgbG9nIGl0ZW0uICBJdCBpcyB1c2VkCisgKiB0byBsb2cgdGhlIGZhY3QgdGhhdCBzb21lIGV4dGVudHMgbmVlZCB0byBiZSBmcmVlLiAgSXQgaXMKKyAqIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgImV4dGVudCBmcmVlIGRvbmUiIGxvZyBpdGVtCisgKiBkZXNjcmliZWQgYmVsb3cuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19lZmlfbG9nX2l0ZW0geworCXhmc19sb2dfaXRlbV90CQllZmlfaXRlbTsKKwl1aW50CQkJZWZpX2ZsYWdzOwkvKiBtaXNjIGZsYWdzICovCisJdWludAkJCWVmaV9uZXh0X2V4dGVudDsKKwl4ZnNfZWZpX2xvZ19mb3JtYXRfdAllZmlfZm9ybWF0OworfSB4ZnNfZWZpX2xvZ19pdGVtX3Q7CisKKy8qCisgKiBUaGlzIGlzIHRoZSAiZXh0ZW50IGZyZWUgZG9uZSIgbG9nIGl0ZW0uICBJdCBpcyB1c2VkIHRvIGxvZworICogdGhlIGZhY3QgdGhhdCBzb21lIGV4dGVudHMgZWFybGllciBtZW50aW9uZWQgaW4gYW4gZWZpIGl0ZW0KKyAqIGhhdmUgYmVlbiBmcmVlZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2VmZF9sb2dfaXRlbSB7CisJeGZzX2xvZ19pdGVtX3QJCWVmZF9pdGVtOworCXhmc19lZmlfbG9nX2l0ZW1fdAkqZWZkX2VmaXA7CisJdWludAkJCWVmZF9uZXh0X2V4dGVudDsKKwl4ZnNfZWZkX2xvZ19mb3JtYXRfdAllZmRfZm9ybWF0OworfSB4ZnNfZWZkX2xvZ19pdGVtX3Q7CisKKy8qCisgKiBNYXggbnVtYmVyIG9mIGV4dGVudHMgaW4gZmFzdCBhbGxvY2F0aW9uIHBhdGguCisgKi8KKyNkZWZpbmUJWEZTX0VGRF9NQVhfRkFTVF9FWFRFTlRTCTE2CisKK2V4dGVybiBzdHJ1Y3Qga21lbV96b25lCSp4ZnNfZWZpX3pvbmU7CitleHRlcm4gc3RydWN0IGttZW1fem9uZQkqeGZzX2VmZF96b25lOworCit4ZnNfZWZpX2xvZ19pdGVtX3QJKnhmc19lZmlfaW5pdChzdHJ1Y3QgeGZzX21vdW50ICosIHVpbnQpOworeGZzX2VmZF9sb2dfaXRlbV90CSp4ZnNfZWZkX2luaXQoc3RydWN0IHhmc19tb3VudCAqLCB4ZnNfZWZpX2xvZ19pdGVtX3QgKiwKKwkJCQkgICAgICB1aW50KTsKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCS8qIF9fWEZTX0VYVEZSRUVfSVRFTV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZnMuaCBiL2ZzL3hmcy94ZnNfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWU4NDQzCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19mcy5oCkBAIC0wLDAgKzEsNTI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk1LTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMi4xIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLgkgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0ZTX0hfXworI2RlZmluZSBfX1hGU19GU19IX18KKworLyoKKyAqIFNHSSdzIFhGUyBmaWxlc3lzdGVtJ3MgbWFqb3Igc3R1ZmYgKGNvbnN0YW50cywgc3RydWN0dXJlcykKKyAqLworCisjZGVmaW5lIFhGU19OQU1FCSJ4ZnMiCisKKy8qCisgKiBEaXJlY3QgSS9PIGF0dHJpYnV0ZSByZWNvcmQgdXNlZCB3aXRoIFhGU19JT0NfRElPSU5GTworICogZF9taW5pb3N6IGlzIHRoZSBtaW4geGZlciBzaXplLCB4ZmVyIHNpemUgbXVsdGlwbGUgYW5kIGZpbGUgc2VlayBvZmZzZXQKKyAqIGFsaWdubWVudC4KKyAqLworI2lmbmRlZiBIQVZFX0RJT0FUVFIKK3N0cnVjdCBkaW9hdHRyIHsKKwlfX3UzMgkJZF9tZW07CQkvKiBkYXRhIGJ1ZmZlciBtZW1vcnkgYWxpZ25tZW50ICovCisJX191MzIJCWRfbWluaW9zejsJLyogbWluIHhmZXIgc2l6ZQkJKi8KKwlfX3UzMgkJZF9tYXhpb3N6OwkvKiBtYXggeGZlciBzaXplCQkqLworfTsKKyNlbmRpZgorCisvKgorICogU3RydWN0dXJlIGZvciBYRlNfSU9DX0ZTR0VUWEFUVFJbQV0gYW5kIFhGU19JT0NfRlNTRVRYQVRUUi4KKyAqLworI2lmbmRlZiBIQVZFX0ZTWEFUVFIKK3N0cnVjdCBmc3hhdHRyIHsKKwlfX3UzMgkJZnN4X3hmbGFnczsJLyogeGZsYWdzIGZpZWxkIHZhbHVlIChnZXQvc2V0KSAqLworCV9fdTMyCQlmc3hfZXh0c2l6ZTsJLyogZXh0c2l6ZSBmaWVsZCB2YWx1ZSAoZ2V0L3NldCkqLworCV9fdTMyCQlmc3hfbmV4dGVudHM7CS8qIG5leHRlbnRzIGZpZWxkIHZhbHVlIChnZXQpCSovCisJdW5zaWduZWQgY2hhcglmc3hfcGFkWzE2XTsKK307CisjZW5kaWYKKworLyoKKyAqIEZsYWdzIGZvciB0aGUgYnNfeGZsYWdzL2ZzeF94ZmxhZ3MgZmllbGQKKyAqIFRoZXJlIHNob3VsZCBiZSBhIG9uZS10by1vbmUgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiB0aGVzZSBmbGFncyBhbmQgdGhlCisgKiBYRlNfRElGTEFHX3MuCisgKi8KKyNkZWZpbmUgWEZTX1hGTEFHX1JFQUxUSU1FCTB4MDAwMDAwMDEJLyogZGF0YSBpbiByZWFsdGltZSB2b2x1bWUgKi8KKyNkZWZpbmUgWEZTX1hGTEFHX1BSRUFMTE9DCTB4MDAwMDAwMDIJLyogcHJlYWxsb2NhdGVkIGZpbGUgZXh0ZW50cyAqLworI2RlZmluZSBYRlNfWEZMQUdfSU1NVVRBQkxFCTB4MDAwMDAwMDgJLyogZmlsZSBjYW5ub3QgYmUgbW9kaWZpZWQgKi8KKyNkZWZpbmUgWEZTX1hGTEFHX0FQUEVORAkweDAwMDAwMDEwCS8qIGFsbCB3cml0ZXMgYXBwZW5kICovCisjZGVmaW5lIFhGU19YRkxBR19TWU5DCQkweDAwMDAwMDIwCS8qIGFsbCB3cml0ZXMgc3luY2hyb25vdXMgKi8KKyNkZWZpbmUgWEZTX1hGTEFHX05PQVRJTUUJMHgwMDAwMDA0MAkvKiBkbyBub3QgdXBkYXRlIGFjY2VzcyB0aW1lICovCisjZGVmaW5lIFhGU19YRkxBR19OT0RVTVAJMHgwMDAwMDA4MAkvKiBkbyBub3QgaW5jbHVkZSBpbiBiYWNrdXBzICovCisjZGVmaW5lIFhGU19YRkxBR19SVElOSEVSSVQJMHgwMDAwMDEwMAkvKiBjcmVhdGUgd2l0aCBydCBiaXQgc2V0ICovCisjZGVmaW5lIFhGU19YRkxBR19QUk9KSU5IRVJJVAkweDAwMDAwMjAwCS8qIGNyZWF0ZSB3aXRoIHBhcmVudHMgcHJvamlkICovCisjZGVmaW5lIFhGU19YRkxBR19OT1NZTUxJTktTCTB4MDAwMDA0MDAJLyogZGlzYWxsb3cgc3ltbGluayBjcmVhdGlvbiAqLworI2RlZmluZSBYRlNfWEZMQUdfSEFTQVRUUgkweDgwMDAwMDAwCS8qIG5vIERJRkxBRyBmb3IgdGhpcwkqLworCisvKgorICogU3RydWN0dXJlIGZvciBYRlNfSU9DX0dFVEJNQVAuCisgKiBPbiBpbnB1dCwgZmlsbCBpbiBibXZfb2Zmc2V0IGFuZCBibXZfbGVuZ3RoIG9mIHRoZSBmaXJzdCBzdHJ1Y3R1cmUKKyAqIHRvIGluZGljYXRlIHRoZSBhcmVhIG9mIGludGVyZXN0IGluIHRoZSBmaWxlLCBhbmQgYm12X2VudHJ5IHdpdGggdGhlCisgKiBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgZ2l2ZW4uICBUaGUgZmlyc3Qgc3RydWN0dXJlIGlzIHVwZGF0ZWQgb24KKyAqIHJldHVybiB0byBnaXZlIHRoZSBvZmZzZXQgYW5kIGxlbmd0aCBmb3IgdGhlIG5leHQgY2FsbC4KKyAqLworI2lmbmRlZiBIQVZFX0dFVEJNQVAKK3N0cnVjdCBnZXRibWFwIHsKKwlfX3M2NAkJYm12X29mZnNldDsJLyogZmlsZSBvZmZzZXQgb2Ygc2VnbWVudCBpbiBibG9ja3MgKi8KKwlfX3M2NAkJYm12X2Jsb2NrOwkvKiBzdGFydGluZyBibG9jayAoNjQtYml0IGRhZGRyX3QpICAqLworCV9fczY0CQlibXZfbGVuZ3RoOwkvKiBsZW5ndGggb2Ygc2VnbWVudCwgYmxvY2tzCSAgICAqLworCV9fczMyCQlibXZfY291bnQ7CS8qICMgb2YgZW50cmllcyBpbiBhcnJheSBpbmNsLiAxc3QgICovCisJX19zMzIJCWJtdl9lbnRyaWVzOwkvKiAjIG9mIGVudHJpZXMgZmlsbGVkIGluIChvdXRwdXQpICAqLworfTsKKyNlbmRpZgorCisvKgorICoJU3RydWN0dXJlIGZvciBYRlNfSU9DX0dFVEJNQVBYLgkgRmllbGRzIGJtdl9vZmZzZXQgdGhyb3VnaCBibXZfZW50cmllcworICoJYXJlIHVzZWQgZXhhY3RseSBhcyBpbiB0aGUgZ2V0Ym1hcCBzdHJ1Y3R1cmUuICBUaGUgZ2V0Ym1hcHggc3RydWN0dXJlCisgKgloYXMgYWRkaXRpb25hbCBibXZfaWZsYWdzIGFuZCBibXZfb2ZsYWdzIGZpZWxkcy4gVGhlIGJtdl9pZmxhZ3MgZmllbGQKKyAqCWlzIG9ubHkgdXNlZCBmb3IgdGhlIGZpcnN0IHN0cnVjdHVyZS4gIEl0IGNvbnRhaW5zIGlucHV0IGZsYWdzCisgKglzcGVjaWZ5aW5nIFhGU19JT0NfR0VUQk1BUFggYWN0aW9ucy4gIFRoZSBibXZfb2ZsYWdzIGZpZWxkIGlzIGZpbGxlZAorICoJaW4gYnkgdGhlIFhGU19JT0NfR0VUQk1BUFggY29tbWFuZCBmb3IgZWFjaCByZXR1cm5lZCBzdHJ1Y3R1cmUgYWZ0ZXIKKyAqCXRoZSBmaXJzdC4KKyAqLworI2lmbmRlZiBIQVZFX0dFVEJNQVBYCitzdHJ1Y3QgZ2V0Ym1hcHggeworCV9fczY0CQlibXZfb2Zmc2V0OwkvKiBmaWxlIG9mZnNldCBvZiBzZWdtZW50IGluIGJsb2NrcyAqLworCV9fczY0CQlibXZfYmxvY2s7CS8qIHN0YXJ0aW5nIGJsb2NrICg2NC1iaXQgZGFkZHJfdCkgICovCisJX19zNjQJCWJtdl9sZW5ndGg7CS8qIGxlbmd0aCBvZiBzZWdtZW50LCBibG9ja3MJICAgICovCisJX19zMzIJCWJtdl9jb3VudDsJLyogIyBvZiBlbnRyaWVzIGluIGFycmF5IGluY2wuIDFzdCAgKi8KKwlfX3MzMgkJYm12X2VudHJpZXM7CS8qICMgb2YgZW50cmllcyBmaWxsZWQgaW4gKG91dHB1dCkuICovCisJX19zMzIJCWJtdl9pZmxhZ3M7CS8qIGlucHV0IGZsYWdzICgxc3Qgc3RydWN0dXJlKQkgICAgKi8KKwlfX3MzMgkJYm12X29mbGFnczsJLyogb3V0cHV0IGZsYWdzIChhZnRlciAxc3Qgc3RydWN0dXJlKSovCisJX19zMzIJCWJtdl91bnVzZWQxOwkvKiBmdXR1cmUgdXNlCQkJICAgICovCisJX19zMzIJCWJtdl91bnVzZWQyOwkvKiBmdXR1cmUgdXNlCQkJICAgICovCit9OworI2VuZGlmCisKKy8qCWJtdl9pZmxhZ3MgdmFsdWVzIC0gc2V0IGJ5IFhGU19JT0NfR0VUQk1BUFggY2FsbGVyLgkqLworI2RlZmluZSBCTVZfSUZfQVRUUkZPUksJCTB4MQkvKiByZXR1cm4gYXR0ciBmb3JrIHJhdGhlciB0aGFuIGRhdGEgKi8KKyNkZWZpbmUgQk1WX0lGX05PX0RNQVBJX1JFQUQJMHgyCS8qIERvIG5vdCBnZW5lcmF0ZSBETUFQSSByZWFkIGV2ZW50ICAqLworI2RlZmluZSBCTVZfSUZfUFJFQUxMT0MJCTB4NAkvKiBydG4gc3RhdHVzIEJNVl9PRl9QUkVBTExPQyBpZiByZXEgKi8KKyNkZWZpbmUgQk1WX0lGX1ZBTElECShCTVZfSUZfQVRUUkZPUkt8Qk1WX0lGX05PX0RNQVBJX1JFQUR8Qk1WX0lGX1BSRUFMTE9DKQorI2lmZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgQk1WX0lGX0VYVEVOREVEIDB4NDAwMDAwMDAJLyogZ2V0cG1hcHggaWYgc2V0ICovCisjZW5kaWYKKworLyoJYm12X29mbGFncyB2YWx1ZXMgLSByZXR1cm5lZCBmb3IgZm9yIGVhY2ggbm9uLWhlYWRlciBzZWdtZW50ICovCisjZGVmaW5lIEJNVl9PRl9QUkVBTExPQwkJMHgxCS8qIHNlZ21lbnQgPSB1bndyaXR0ZW4gcHJlLWFsbG9jYXRpb24gKi8KKworLyoJQ29udmVydCBnZXRibWFwIDwtPiBnZXRibWFweCAtIG1vdmUgZmllbGRzIGZyb20gcDEgdG8gcDIuICovCisjZGVmaW5lIEdFVEJNQVBfQ09OVkVSVChwMSxwMikgewlcCisJcDIuYm12X29mZnNldCA9IHAxLmJtdl9vZmZzZXQ7CVwKKwlwMi5ibXZfYmxvY2sgPSBwMS5ibXZfYmxvY2s7CVwKKwlwMi5ibXZfbGVuZ3RoID0gcDEuYm12X2xlbmd0aDsJXAorCXAyLmJtdl9jb3VudCA9IHAxLmJtdl9jb3VudDsJXAorCXAyLmJtdl9lbnRyaWVzID0gcDEuYm12X2VudHJpZXM7ICB9CisKKworLyoKKyAqIFN0cnVjdHVyZSBmb3IgWEZTX0lPQ19GU1NFVERNLgorICogRm9yIHVzZSBieSBiYWNrdXAgYW5kIHJlc3RvcmUgcHJvZ3JhbXMgdG8gc2V0IHRoZSBYRlMgb24tZGlzayBpbm9kZQorICogZmllbGRzIGRpX2RtZXZtYXNrIGFuZCBkaV9kbXN0YXRlLiAgVGhlc2UgbXVzdCBiZSBzZXQgdG8gZXhhY3RseSBhbmQKKyAqIG9ubHkgdmFsdWVzIHByZXZpb3VzbHkgb2J0YWluZWQgdmlhIHhmc19idWxrc3RhdCEgIChTcGVjaWZpY2FsbHkgdGhlCisgKiB4ZnNfYnN0YXRfdCBmaWVsZHMgYnNfZG1ldm1hc2sgYW5kIGJzX2Rtc3RhdGUuKQorICovCisjaWZuZGVmIEhBVkVfRlNETUlEQVRBCitzdHJ1Y3QgZnNkbWlkYXRhIHsKKwlfX3UzMgkJZnNkX2RtZXZtYXNrOwkvKiBjb3JyZXNwb25kcyB0byBkaV9kbWV2bWFzayAqLworCV9fdTE2CQlmc2RfcGFkZGluZzsKKwlfX3UxNgkJZnNkX2Rtc3RhdGU7CS8qIGNvcnJlc3BvbmRzIHRvIGRpX2Rtc3RhdGUgICovCit9OworI2VuZGlmCisKKy8qCisgKiBGaWxlIHNlZ21lbnQgbG9ja2luZyBzZXQgZGF0YSB0eXBlIGZvciA2NCBiaXQgYWNjZXNzLgorICogQWxzbyB1c2VkIGZvciBhbGwgdGhlIFJFU1YvRlJFRSBpbnRlcmZhY2VzLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZmxvY2s2NCB7CisJX19zMTYJCWxfdHlwZTsKKwlfX3MxNgkJbF93aGVuY2U7CisJX19zNjQJCWxfc3RhcnQ7CisJX19zNjQJCWxfbGVuOwkJLyogbGVuID09IDAgbWVhbnMgdW50aWwgZW5kIG9mIGZpbGUgKi8KKwlfX3MzMgkJbF9zeXNpZDsKKwlfX3UzMgkJbF9waWQ7CisJX19zMzIJCWxfcGFkWzRdOwkvKiByZXNlcnZlIGFyZWEJCQkgICAgKi8KK30geGZzX2Zsb2NrNjRfdDsKKworLyoKKyAqIE91dHB1dCBmb3IgWEZTX0lPQ19GU0dFT01FVFJZX1YxCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX2dlb21fdjEgeworCV9fdTMyCQlibG9ja3NpemU7CS8qIGZpbGVzeXN0ZW0gKGRhdGEpIGJsb2NrIHNpemUgKi8KKwlfX3UzMgkJcnRleHRzaXplOwkvKiByZWFsdGltZSBleHRlbnQgc2l6ZQkJKi8KKwlfX3UzMgkJYWdibG9ja3M7CS8qIGZzYmxvY2tzIGluIGFuIEFHCQkqLworCV9fdTMyCQlhZ2NvdW50OwkvKiBudW1iZXIgb2YgYWxsb2NhdGlvbiBncm91cHMJKi8KKwlfX3UzMgkJbG9nYmxvY2tzOwkvKiBmc2Jsb2NrcyBpbiB0aGUgbG9nCQkqLworCV9fdTMyCQlzZWN0c2l6ZTsJLyogKGRhdGEpIHNlY3RvciBzaXplLCBieXRlcwkqLworCV9fdTMyCQlpbm9kZXNpemU7CS8qIGlub2RlIHNpemUgaW4gYnl0ZXMJCSovCisJX191MzIJCWltYXhwY3Q7CS8qIG1heCBhbGxvd2VkIGlub2RlIHNwYWNlKCUpCSovCisJX191NjQJCWRhdGFibG9ja3M7CS8qIGZzYmxvY2tzIGluIGRhdGEgc3Vidm9sdW1lCSovCisJX191NjQJCXJ0YmxvY2tzOwkvKiBmc2Jsb2NrcyBpbiByZWFsdGltZSBzdWJ2b2wJKi8KKwlfX3U2NAkJcnRleHRlbnRzOwkvKiBydCBleHRlbnRzIGluIHJlYWx0aW1lIHN1YnZvbCovCisJX191NjQJCWxvZ3N0YXJ0OwkvKiBzdGFydGluZyBmc2Jsb2NrIG9mIHRoZSBsb2cJKi8KKwl1bnNpZ25lZCBjaGFyCXV1aWRbMTZdOwkvKiB1bmlxdWUgaWQgb2YgdGhlIGZpbGVzeXN0ZW0JKi8KKwlfX3UzMgkJc3VuaXQ7CQkvKiBzdHJpcGUgdW5pdCwgZnNibG9ja3MJKi8KKwlfX3UzMgkJc3dpZHRoOwkJLyogc3RyaXBlIHdpZHRoLCBmc2Jsb2NrcwkqLworCV9fczMyCQl2ZXJzaW9uOwkvKiBzdHJ1Y3R1cmUgdmVyc2lvbgkJKi8KKwlfX3UzMgkJZmxhZ3M7CQkvKiBzdXBlcmJsb2NrIHZlcnNpb24gZmxhZ3MJKi8KKwlfX3UzMgkJbG9nc2VjdHNpemU7CS8qIGxvZyBzZWN0b3Igc2l6ZSwgYnl0ZXMJKi8KKwlfX3UzMgkJcnRzZWN0c2l6ZTsJLyogcmVhbHRpbWUgc2VjdG9yIHNpemUsIGJ5dGVzCSovCisJX191MzIJCWRpcmJsb2Nrc2l6ZTsJLyogZGlyZWN0b3J5IGJsb2NrIHNpemUsIGJ5dGVzCSovCit9IHhmc19mc29wX2dlb21fdjFfdDsKKworLyoKKyAqIE91dHB1dCBmb3IgWEZTX0lPQ19GU0dFT01FVFJZCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX2dlb20geworCV9fdTMyCQlibG9ja3NpemU7CS8qIGZpbGVzeXN0ZW0gKGRhdGEpIGJsb2NrIHNpemUgKi8KKwlfX3UzMgkJcnRleHRzaXplOwkvKiByZWFsdGltZSBleHRlbnQgc2l6ZQkJKi8KKwlfX3UzMgkJYWdibG9ja3M7CS8qIGZzYmxvY2tzIGluIGFuIEFHCQkqLworCV9fdTMyCQlhZ2NvdW50OwkvKiBudW1iZXIgb2YgYWxsb2NhdGlvbiBncm91cHMJKi8KKwlfX3UzMgkJbG9nYmxvY2tzOwkvKiBmc2Jsb2NrcyBpbiB0aGUgbG9nCQkqLworCV9fdTMyCQlzZWN0c2l6ZTsJLyogKGRhdGEpIHNlY3RvciBzaXplLCBieXRlcwkqLworCV9fdTMyCQlpbm9kZXNpemU7CS8qIGlub2RlIHNpemUgaW4gYnl0ZXMJCSovCisJX191MzIJCWltYXhwY3Q7CS8qIG1heCBhbGxvd2VkIGlub2RlIHNwYWNlKCUpCSovCisJX191NjQJCWRhdGFibG9ja3M7CS8qIGZzYmxvY2tzIGluIGRhdGEgc3Vidm9sdW1lCSovCisJX191NjQJCXJ0YmxvY2tzOwkvKiBmc2Jsb2NrcyBpbiByZWFsdGltZSBzdWJ2b2wJKi8KKwlfX3U2NAkJcnRleHRlbnRzOwkvKiBydCBleHRlbnRzIGluIHJlYWx0aW1lIHN1YnZvbCovCisJX191NjQJCWxvZ3N0YXJ0OwkvKiBzdGFydGluZyBmc2Jsb2NrIG9mIHRoZSBsb2cJKi8KKwl1bnNpZ25lZCBjaGFyCXV1aWRbMTZdOwkvKiB1bmlxdWUgaWQgb2YgdGhlIGZpbGVzeXN0ZW0JKi8KKwlfX3UzMgkJc3VuaXQ7CQkvKiBzdHJpcGUgdW5pdCwgZnNibG9ja3MJKi8KKwlfX3UzMgkJc3dpZHRoOwkJLyogc3RyaXBlIHdpZHRoLCBmc2Jsb2NrcwkqLworCV9fczMyCQl2ZXJzaW9uOwkvKiBzdHJ1Y3R1cmUgdmVyc2lvbgkJKi8KKwlfX3UzMgkJZmxhZ3M7CQkvKiBzdXBlcmJsb2NrIHZlcnNpb24gZmxhZ3MJKi8KKwlfX3UzMgkJbG9nc2VjdHNpemU7CS8qIGxvZyBzZWN0b3Igc2l6ZSwgYnl0ZXMJKi8KKwlfX3UzMgkJcnRzZWN0c2l6ZTsJLyogcmVhbHRpbWUgc2VjdG9yIHNpemUsIGJ5dGVzCSovCisJX191MzIJCWRpcmJsb2Nrc2l6ZTsJLyogZGlyZWN0b3J5IGJsb2NrIHNpemUsIGJ5dGVzCSovCisJX191MzIJCWxvZ3N1bml0OwkvKiBsb2cgc3RyaXBlIHVuaXQsIGJ5dGVzICovCit9IHhmc19mc29wX2dlb21fdDsKKworLyogT3V0cHV0IGZvciBYRlNfRlNfQ09VTlRTICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZnNvcF9jb3VudHMgeworCV9fdTY0CWZyZWVkYXRhOwkvKiBmcmVlIGRhdGEgc2VjdGlvbiBibG9ja3MgKi8KKwlfX3U2NAlmcmVlcnR4OwkvKiBmcmVlIHJ0IGV4dGVudHMgKi8KKwlfX3U2NAlmcmVlaW5vOwkvKiBmcmVlIGlub2RlcyAqLworCV9fdTY0CWFsbG9jaW5vOwkvKiB0b3RhbCBhbGxvY2F0ZWQgaW5vZGVzICovCit9IHhmc19mc29wX2NvdW50c190OworCisvKiBJbnB1dC9PdXRwdXQgZm9yIFhGU19HRVRfUkVTQkxLUyBhbmQgWEZTX1NFVF9SRVNCTEtTICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZnNvcF9yZXNibGtzIHsKKwlfX3U2NCAgcmVzYmxrczsKKwlfX3U2NCAgcmVzYmxrc19hdmFpbDsKK30geGZzX2Zzb3BfcmVzYmxrc190OworCisjZGVmaW5lIFhGU19GU09QX0dFT01fVkVSU0lPTgkwCisKKyNkZWZpbmUgWEZTX0ZTT1BfR0VPTV9GTEFHU19BVFRSCTB4MDAwMQkvKiBhdHRyaWJ1dGVzIGluIHVzZQkqLworI2RlZmluZSBYRlNfRlNPUF9HRU9NX0ZMQUdTX05MSU5LCTB4MDAwMgkvKiAzMi1iaXQgbmxpbmsgdmFsdWVzCSovCisjZGVmaW5lIFhGU19GU09QX0dFT01fRkxBR1NfUVVPVEEJMHgwMDA0CS8qIHF1b3RhcyBlbmFibGVkCSovCisjZGVmaW5lIFhGU19GU09QX0dFT01fRkxBR1NfSUFMSUdOCTB4MDAwOAkvKiBpbm9kZSBhbGlnbm1lbnQJKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR0VPTV9GTEFHU19EQUxJR04JMHgwMDEwCS8qIGxhcmdlIGRhdGEgYWxpZ25tZW50ICovCisjZGVmaW5lIFhGU19GU09QX0dFT01fRkxBR1NfU0hBUkVECTB4MDAyMAkvKiByZWFkLW9ubHkgc2hhcmVkCSovCisjZGVmaW5lIFhGU19GU09QX0dFT01fRkxBR1NfRVhURkxHCTB4MDA0MAkvKiBzcGVjaWFsIGV4dGVudCBmbGFnCSovCisjZGVmaW5lIFhGU19GU09QX0dFT01fRkxBR1NfRElSVjIJMHgwMDgwCS8qIGRpcmVjdG9yeSB2ZXJzaW9uIDIJKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR0VPTV9GTEFHU19MT0dWMgkweDAxMDAJLyogbG9nIGZvcm1hdCB2ZXJzaW9uIDIJKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR0VPTV9GTEFHU19TRUNUT1IJMHgwMjAwCS8qIHNlY3RvciBzaXplcyA+MUJCCSovCisKKworLyoKKyAqIE1pbmltdW0gYW5kIG1heGltdW0gc2l6ZXMgbmVlZCBmb3IgZ3Jvd3RoIGNoZWNrcworICovCisjZGVmaW5lIFhGU19NSU5fQUdfQkxPQ0tTCTY0CisjZGVmaW5lIFhGU19NSU5fTE9HX0JMT0NLUwk1MTIKKyNkZWZpbmUgWEZTX01BWF9MT0dfQkxPQ0tTCSg2NCAqIDEwMjQpCisjZGVmaW5lIFhGU19NSU5fTE9HX0JZVEVTCSgyNTYgKiAxMDI0KQorI2RlZmluZSBYRlNfTUFYX0xPR19CWVRFUwkoMTI4ICogMTAyNCAqIDEwMjQpCisKKy8qCisgKiBTdHJ1Y3R1cmVzIGZvciBYRlNfSU9DX0ZTR1JPV0ZTREFUQSwgWEZTX0lPQ19GU0dST1dGU0xPRyAmIFhGU19JT0NfRlNHUk9XRlNSVAorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZ3Jvd2ZzX2RhdGEgeworCV9fdTY0CQluZXdibG9ja3M7CS8qIG5ldyBkYXRhIHN1YnZvbCBzaXplLCBmc2Jsb2NrcyAqLworCV9fdTMyCQlpbWF4cGN0OwkvKiBuZXcgaW5vZGUgc3BhY2UgcGVyY2VudGFnZSBsaW1pdCAqLworfSB4ZnNfZ3Jvd2ZzX2RhdGFfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2dyb3dmc19sb2cgeworCV9fdTMyCQluZXdibG9ja3M7CS8qIG5ldyBsb2cgc2l6ZSwgZnNibG9ja3MgKi8KKwlfX3UzMgkJaXNpbnQ7CQkvKiAxIGlmIG5ldyBsb2cgaXMgaW50ZXJuYWwgKi8KK30geGZzX2dyb3dmc19sb2dfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2dyb3dmc19ydCB7CisJX191NjQJCW5ld2Jsb2NrczsJLyogbmV3IHJlYWx0aW1lIHNpemUsIGZzYmxvY2tzICovCisJX191MzIJCWV4dHNpemU7CS8qIG5ldyByZWFsdGltZSBleHRlbnQgc2l6ZSwgZnNibG9ja3MgKi8KK30geGZzX2dyb3dmc19ydF90OworCisKKy8qCisgKiBTdHJ1Y3R1cmVzIHJldHVybmVkIGZyb20gaW9jdGwgWEZTX0lPQ19GU0JVTEtTVEFUICYgWEZTX0lPQ19GU0JVTEtTVEFUX1NJTkdMRQorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfYnN0aW1lIHsKKwl0aW1lX3QJCXR2X3NlYzsJCS8qIHNlY29uZHMJCSovCisJX19zMzIJCXR2X25zZWM7CS8qIGFuZCBuYW5vc2Vjb25kcwkqLworfSB4ZnNfYnN0aW1lX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19ic3RhdCB7CisJX191NjQJCWJzX2lubzsJCS8qIGlub2RlIG51bWJlcgkJCSovCisJX191MTYJCWJzX21vZGU7CS8qIHR5cGUgYW5kIG1vZGUJCSovCisJX191MTYJCWJzX25saW5rOwkvKiBudW1iZXIgb2YgbGlua3MJCSovCisJX191MzIJCWJzX3VpZDsJCS8qIHVzZXIgaWQJCQkqLworCV9fdTMyCQlic19naWQ7CQkvKiBncm91cCBpZAkJCSovCisJX191MzIJCWJzX3JkZXY7CS8qIGRldmljZSB2YWx1ZQkJCSovCisJX19zMzIJCWJzX2Jsa3NpemU7CS8qIGJsb2NrIHNpemUJCQkqLworCV9fczY0CQlic19zaXplOwkvKiBmaWxlIHNpemUJCQkqLworCXhmc19ic3RpbWVfdAlic19hdGltZTsJLyogYWNjZXNzIHRpbWUJCQkqLworCXhmc19ic3RpbWVfdAlic19tdGltZTsJLyogbW9kaWZ5IHRpbWUJCQkqLworCXhmc19ic3RpbWVfdAlic19jdGltZTsJLyogaW5vZGUgY2hhbmdlIHRpbWUJCSovCisJaW50NjRfdAkJYnNfYmxvY2tzOwkvKiBudW1iZXIgb2YgYmxvY2tzCQkqLworCV9fdTMyCQlic194ZmxhZ3M7CS8qIGV4dGVuZGVkIGZsYWdzCQkqLworCV9fczMyCQlic19leHRzaXplOwkvKiBleHRlbnQgc2l6ZQkJCSovCisJX19zMzIJCWJzX2V4dGVudHM7CS8qIG51bWJlciBvZiBleHRlbnRzCQkqLworCV9fdTMyCQlic19nZW47CQkvKiBnZW5lcmF0aW9uIGNvdW50CQkqLworCV9fdTE2CQlic19wcm9qaWQ7CS8qIHByb2plY3QgaWQJCQkqLworCXVuc2lnbmVkIGNoYXIJYnNfcGFkWzE0XTsJLyogcGFkIHNwYWNlLCB1bnVzZWQJCSovCisJX191MzIJCWJzX2RtZXZtYXNrOwkvKiBETUlHIGV2ZW50IG1hc2sJCSovCisJX191MTYJCWJzX2Rtc3RhdGU7CS8qIERNSUcgc3RhdGUgaW5mbwkJKi8KKwlfX3UxNgkJYnNfYWV4dGVudHM7CS8qIGF0dHJpYnV0ZSBudW1iZXIgb2YgZXh0ZW50cwkqLworfSB4ZnNfYnN0YXRfdDsKKworLyoKKyAqIFRoZSB1c2VyLWxldmVsIEJ1bGtTdGF0IFJlcXVlc3QgaW50ZXJmYWNlIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Zzb3BfYnVsa3JlcSB7CisJX191NjQJCV9fdXNlciAqbGFzdGlwOwkvKiBsYXN0IGlub2RlICMgcG9pbnRlcgkJKi8KKwlfX3MzMgkJaWNvdW50OwkJLyogY291bnQgb2YgZW50cmllcyBpbiBidWZmZXIJKi8KKwl2b2lkCQlfX3VzZXIgKnVidWZmZXI7LyogdXNlciBidWZmZXIgZm9yIGlub2RlIGRlc2MuCSovCisJX19zMzIJCV9fdXNlciAqb2NvdW50OwkvKiBvdXRwdXQgY291bnQgcG9pbnRlcgkJKi8KK30geGZzX2Zzb3BfYnVsa3JlcV90OworCisKKy8qCisgKiBTdHJ1Y3R1cmVzIHJldHVybmVkIGZyb20geGZzX2ludW1iZXJzIHJvdXRpbmUgKFhGU19JT0NfRlNJTlVNQkVSUykuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19pbm9ncnAgeworCV9fdTY0CQl4aV9zdGFydGlubzsJLyogc3RhcnRpbmcgaW5vZGUgbnVtYmVyCSovCisJX19zMzIJCXhpX2FsbG9jY291bnQ7CS8qICMgYml0cyBzZXQgaW4gYWxsb2NtYXNrCSovCisJX191NjQJCXhpX2FsbG9jbWFzazsJLyogbWFzayBvZiBhbGxvY2F0ZWQgaW5vZGVzCSovCit9IHhmc19pbm9ncnBfdDsKKworCisvKgorICogRXJyb3IgaW5qZWN0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZXJyb3JfaW5qZWN0aW9uIHsKKwlfX3MzMgkJZmQ7CisJX19zMzIJCWVycnRhZzsKK30geGZzX2Vycm9yX2luamVjdGlvbl90OworCisKKy8qCisgKiBUaGUgdXNlci1sZXZlbCBIYW5kbGUgUmVxdWVzdCBpbnRlcmZhY2Ugc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZnNvcF9oYW5kbGVyZXEgeworCV9fdTMyCQlmZDsJCS8qIGZkIGZvciBGRF9UT19IQU5ETEUJCSovCisJdm9pZAkJX191c2VyICpwYXRoOwkvKiB1c2VyIHBhdGhuYW1lCQkqLworCV9fdTMyCQlvZmxhZ3M7CQkvKiBvcGVuIGZsYWdzCQkJKi8KKwl2b2lkCQlfX3VzZXIgKmloYW5kbGU7LyogdXNlciBzdXBwbGllZCBoYW5kbGUJCSovCisJX191MzIJCWloYW5kbGVuOwkvKiB1c2VyIHN1cHBsaWVkIGxlbmd0aAkJKi8KKwl2b2lkCQlfX3VzZXIgKm9oYW5kbGU7LyogdXNlciBidWZmZXIgZm9yIGhhbmRsZQkqLworCV9fdTMyCQlfX3VzZXIgKm9oYW5kbGVuOy8qIHVzZXIgYnVmZmVyIGxlbmd0aAkJKi8KK30geGZzX2Zzb3BfaGFuZGxlcmVxX3Q7CisKKy8qCisgKiBDb21wb3VuZCBzdHJ1Y3R1cmVzIGZvciBwYXNzaW5nIGFyZ3MgdGhyb3VnaCBIYW5kbGUgUmVxdWVzdCBpbnRlcmZhY2VzCisgKiB4ZnNfZnNzZXRkbV9ieV9oYW5kbGUsIHhmc19hdHRybGlzdF9ieV9oYW5kbGUsIHhmc19hdHRybXVsdGlfYnlfaGFuZGxlCisgKiAtIGlvY3RsczogWEZTX0lPQ19GU1NFVERNX0JZX0hBTkRMRSwgWEZTX0lPQ19BVFRSTElTVF9CWV9IQU5ETEUsIGFuZAorICoJICAgICBYRlNfSU9DX0FUVFJNVUxUSV9CWV9IQU5ETEUKKyAqLworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZnNvcF9zZXRkbV9oYW5kbGVyZXEgeworCXN0cnVjdCB4ZnNfZnNvcF9oYW5kbGVyZXEJaHJlcTsJLyogaGFuZGxlIGluZm9ybWF0aW9uCSovCisJc3RydWN0IGZzZG1pZGF0YQkJX191c2VyICpkYXRhOwkvKiBETUFQSSBkYXRhCSovCit9IHhmc19mc29wX3NldGRtX2hhbmRsZXJlcV90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfYXR0cmxpc3RfY3Vyc29yIHsKKwlfX3UzMgkJb3BhcXVlWzRdOworfSB4ZnNfYXR0cmxpc3RfY3Vyc29yX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX2F0dHJsaXN0X2hhbmRsZXJlcSB7CisJc3RydWN0IHhmc19mc29wX2hhbmRsZXJlcQlocmVxOyAvKiBoYW5kbGUgaW50ZXJmYWNlIHN0cnVjdHVyZSAqLworCXN0cnVjdCB4ZnNfYXR0cmxpc3RfY3Vyc29yCXBvczsgLyogb3BhcXVlIGNvb2tpZSwgbGlzdCBvZmZzZXQgKi8KKwlfX3UzMgkJCQlmbGFnczsJLyogd2hpY2ggbmFtZXNwYWNlIHRvIHVzZSAqLworCV9fdTMyCQkJCWJ1ZmxlbjsJLyogbGVuZ3RoIG9mIGJ1ZmZlciBzdXBwbGllZCAqLworCXZvaWQJCQkJX191c2VyICpidWZmZXI7CS8qIHJldHVybmVkIG5hbWVzICovCit9IHhmc19mc29wX2F0dHJsaXN0X2hhbmRsZXJlcV90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfYXR0cl9tdWx0aW9wIHsKKwlfX3UzMgkJYW1fb3Bjb2RlOworCV9fczMyCQlhbV9lcnJvcjsKKwl2b2lkCQlfX3VzZXIgKmFtX2F0dHJuYW1lOworCXZvaWQJCV9fdXNlciAqYW1fYXR0cnZhbHVlOworCV9fdTMyCQlhbV9sZW5ndGg7CisJX191MzIJCWFtX2ZsYWdzOworfSB4ZnNfYXR0cl9tdWx0aW9wX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX2F0dHJtdWx0aV9oYW5kbGVyZXEgeworCXN0cnVjdCB4ZnNfZnNvcF9oYW5kbGVyZXEJaHJlcTsgLyogaGFuZGxlIGludGVyZmFjZSBzdHJ1Y3R1cmUgKi8KKwlfX3UzMgkJCQlvcGNvdW50Oy8qIGNvdW50IG9mIGZvbGxvd2luZyBtdWx0aW9wICovCisJc3RydWN0IHhmc19hdHRyX211bHRpb3AJCV9fdXNlciAqb3BzOyAvKiBhdHRyX211bHRpIGRhdGEgKi8KK30geGZzX2Zzb3BfYXR0cm11bHRpX2hhbmRsZXJlcV90OworCisvKgorICogcGVyIG1hY2hpbmUgdW5pcXVlIGZpbGVzeXN0ZW0gaWRlbnRpZmllciB0eXBlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeyBfX3UzMiB2YWxbMl07IH0geGZzX2ZzaWRfdDsgLyogZmlsZSBzeXN0ZW0gaWQgdHlwZSAqLworCisKKyNpZm5kZWYgSEFWRV9GSUQKKyNkZWZpbmUgTUFYRklEU1oJNDYKKwordHlwZWRlZiBzdHJ1Y3QgZmlkIHsKKwlfX3UxNgkJZmlkX2xlbjsJCS8qIGxlbmd0aCBvZiBkYXRhIGluIGJ5dGVzICovCisJdW5zaWduZWQgY2hhcglmaWRfZGF0YVtNQVhGSURTWl07CS8qIGRhdGEgKGZpZF9sZW4gd29ydGgpICAqLworfSBmaWRfdDsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB4ZnNfZmlkIHsKKwlfX3UxNgl4ZnNfZmlkX2xlbjsJCS8qIGxlbmd0aCBvZiByZW1haW5kZXIJKi8KKwlfX3UxNgl4ZnNfZmlkX3BhZDsKKwlfX3UzMgl4ZnNfZmlkX2dlbjsJCS8qIGdlbmVyYXRpb24gbnVtYmVyCSovCisJX191NjQJeGZzX2ZpZF9pbm87CQkvKiA2NCBiaXRzIGlub2RlIG51bWJlciAqLworfSB4ZnNfZmlkX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19maWQyIHsKKwlfX3UxNglmaWRfbGVuOwkvKiBsZW5ndGggb2YgcmVtYWluZGVyICovCisJX191MTYJZmlkX3BhZDsJLyogcGFkZGluZywgbXVzdCBiZSB6ZXJvICovCisJX191MzIJZmlkX2dlbjsJLyogZ2VuZXJhdGlvbiBudW1iZXIgKi8KKwlfX3U2NAlmaWRfaW5vOwkvKiBpbm9kZSBudW1iZXIgKi8KK30geGZzX2ZpZDJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2hhbmRsZSB7CisJdW5pb24geworCQlfX3M2NAkgICAgYWxpZ247CS8qIGZvcmNlIGFsaWdubWVudCBvZiBoYV9maWQJICovCisJCXhmc19mc2lkX3QgIF9oYV9mc2lkOwkvKiB1bmlxdWUgZmlsZSBzeXN0ZW0gaWRlbnRpZmllciAqLworCX0gaGFfdTsKKwl4ZnNfZmlkX3QJaGFfZmlkOwkJLyogZmlsZSBzeXN0ZW0gc3BlY2lmaWMgZmlsZSBJRAkgKi8KK30geGZzX2hhbmRsZV90OworI2RlZmluZSBoYV9mc2lkIGhhX3UuX2hhX2ZzaWQKKworI2RlZmluZSBYRlNfSFNJWkUoaGFuZGxlKQkoKChjaGFyICopICYoaGFuZGxlKS5oYV9maWQueGZzX2ZpZF9wYWQJIFwKKwkJCQkgLSAoY2hhciAqKSAmKGhhbmRsZSkpCQkJICBcCisJCQkJICsgKGhhbmRsZSkuaGFfZmlkLnhmc19maWRfbGVuKQorCisjZGVmaW5lIFhGU19IQU5ETEVfQ01QKGgxLCBoMikJbWVtY21wKGgxLCBoMiwgc2l6ZW9mKHhmc19oYW5kbGVfdCkpCisKKyNkZWZpbmUgRlNIU0laRQkJc2l6ZW9mKGZzaWRfdCkKKworLyogCisgKiBGbGFncyBmb3IgZ29pbmcgZG93biBvcGVyYXRpb24KKyAqLworI2RlZmluZSBYRlNfRlNPUF9HT0lOR19GTEFHU19ERUZBVUxUCQkweDAJLyogZ29pbmcgZG93biAqLworI2RlZmluZSBYRlNfRlNPUF9HT0lOR19GTEFHU19MT0dGTFVTSAkJMHgxCS8qIGZsdXNoIGxvZyBidXQgbm90IGRhdGEgKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR09JTkdfRkxBR1NfTk9MT0dGTFVTSAkJMHgyCS8qIGRvbid0IGZsdXNoIGxvZyBub3IgZGF0YSAqLworCisvKgorICogaW9jdGwgY29tbWFuZHMgdGhhdCBhcmUgdXNlZCBieSBMaW51eCBmaWxlc3lzdGVtcworICovCisjZGVmaW5lIFhGU19JT0NfR0VUWEZMQUdTCV9JT1IoJ2YnLCAxLCBsb25nKQorI2RlZmluZSBYRlNfSU9DX1NFVFhGTEFHUwlfSU9XKCdmJywgMiwgbG9uZykKKyNkZWZpbmUgWEZTX0lPQ19HRVRWRVJTSU9OCV9JT1IoJ3YnLCAxLCBsb25nKQorCisvKgorICogaW9jdGwgY29tbWFuZHMgdGhhdCByZXBsYWNlIElSSVggZmNudGwoKSdzCisgKiBGb3IgJ2RvY3VtZW50YXRpb24nIHB1cnBvc2VkIG1vcmUgdGhhbiBhbnl0aGluZyBlbHNlLAorICogdGhlICJjbWQgIyIgZmllbGQgcmVmbGVjdHMgdGhlIElSSVggZmNudGwgbnVtYmVyLgorICovCisjZGVmaW5lIFhGU19JT0NfQUxMT0NTUAkJX0lPVyAoJ1gnLCAxMCwgc3RydWN0IHhmc19mbG9jazY0KQorI2RlZmluZSBYRlNfSU9DX0ZSRUVTUAkJX0lPVyAoJ1gnLCAxMSwgc3RydWN0IHhmc19mbG9jazY0KQorI2RlZmluZSBYRlNfSU9DX0RJT0lORk8JCV9JT1IgKCdYJywgMzAsIHN0cnVjdCBkaW9hdHRyKQorI2RlZmluZSBYRlNfSU9DX0ZTR0VUWEFUVFIJX0lPUiAoJ1gnLCAzMSwgc3RydWN0IGZzeGF0dHIpCisjZGVmaW5lIFhGU19JT0NfRlNTRVRYQVRUUglfSU9XICgnWCcsIDMyLCBzdHJ1Y3QgZnN4YXR0cikKKyNkZWZpbmUgWEZTX0lPQ19BTExPQ1NQNjQJX0lPVyAoJ1gnLCAzNiwgc3RydWN0IHhmc19mbG9jazY0KQorI2RlZmluZSBYRlNfSU9DX0ZSRUVTUDY0CV9JT1cgKCdYJywgMzcsIHN0cnVjdCB4ZnNfZmxvY2s2NCkKKyNkZWZpbmUgWEZTX0lPQ19HRVRCTUFQCQlfSU9XUignWCcsIDM4LCBzdHJ1Y3QgZ2V0Ym1hcCkKKyNkZWZpbmUgWEZTX0lPQ19GU1NFVERNCQlfSU9XICgnWCcsIDM5LCBzdHJ1Y3QgZnNkbWlkYXRhKQorI2RlZmluZSBYRlNfSU9DX1JFU1ZTUAkJX0lPVyAoJ1gnLCA0MCwgc3RydWN0IHhmc19mbG9jazY0KQorI2RlZmluZSBYRlNfSU9DX1VOUkVTVlNQCV9JT1cgKCdYJywgNDEsIHN0cnVjdCB4ZnNfZmxvY2s2NCkKKyNkZWZpbmUgWEZTX0lPQ19SRVNWU1A2NAlfSU9XICgnWCcsIDQyLCBzdHJ1Y3QgeGZzX2Zsb2NrNjQpCisjZGVmaW5lIFhGU19JT0NfVU5SRVNWU1A2NAlfSU9XICgnWCcsIDQzLCBzdHJ1Y3QgeGZzX2Zsb2NrNjQpCisjZGVmaW5lIFhGU19JT0NfR0VUQk1BUEEJX0lPV1IoJ1gnLCA0NCwgc3RydWN0IGdldGJtYXApCisjZGVmaW5lIFhGU19JT0NfRlNHRVRYQVRUUkEJX0lPUiAoJ1gnLCA0NSwgc3RydWN0IGZzeGF0dHIpCisvKglYRlNfSU9DX1NFVEJJT1NJWkUgLS0tLSBkZXByZWNhdGVkIDQ2CSAgICovCisvKglYRlNfSU9DX0dFVEJJT1NJWkUgLS0tLSBkZXByZWNhdGVkIDQ3CSAgICovCisjZGVmaW5lIFhGU19JT0NfR0VUQk1BUFgJX0lPV1IoJ1gnLCA1Niwgc3RydWN0IGdldGJtYXApCisKKy8qCisgKiBpb2N0bCBjb21tYW5kcyB0aGF0IHJlcGxhY2UgSVJJWCBzeXNzZ2koKSdzCisgKi8KKyNkZWZpbmUgWEZTX0lPQ19GU0dFT01FVFJZX1YxCSAgICAgX0lPUiAoJ1gnLCAxMDAsIHN0cnVjdCB4ZnNfZnNvcF9nZW9tX3YxKQorI2RlZmluZSBYRlNfSU9DX0ZTQlVMS1NUQVQJICAgICBfSU9XUignWCcsIDEwMSwgc3RydWN0IHhmc19mc29wX2J1bGtyZXEpCisjZGVmaW5lIFhGU19JT0NfRlNCVUxLU1RBVF9TSU5HTEUgICAgX0lPV1IoJ1gnLCAxMDIsIHN0cnVjdCB4ZnNfZnNvcF9idWxrcmVxKQorI2RlZmluZSBYRlNfSU9DX0ZTSU5VTUJFUlMJICAgICBfSU9XUignWCcsIDEwMywgc3RydWN0IHhmc19mc29wX2J1bGtyZXEpCisjZGVmaW5lIFhGU19JT0NfUEFUSF9UT19GU0hBTkRMRSAgICAgX0lPV1IoJ1gnLCAxMDQsIHN0cnVjdCB4ZnNfZnNvcF9oYW5kbGVyZXEpCisjZGVmaW5lIFhGU19JT0NfUEFUSF9UT19IQU5ETEUJICAgICBfSU9XUignWCcsIDEwNSwgc3RydWN0IHhmc19mc29wX2hhbmRsZXJlcSkKKyNkZWZpbmUgWEZTX0lPQ19GRF9UT19IQU5ETEUJICAgICBfSU9XUignWCcsIDEwNiwgc3RydWN0IHhmc19mc29wX2hhbmRsZXJlcSkKKyNkZWZpbmUgWEZTX0lPQ19PUEVOX0JZX0hBTkRMRQkgICAgIF9JT1dSKCdYJywgMTA3LCBzdHJ1Y3QgeGZzX2Zzb3BfaGFuZGxlcmVxKQorI2RlZmluZSBYRlNfSU9DX1JFQURMSU5LX0JZX0hBTkRMRSAgIF9JT1dSKCdYJywgMTA4LCBzdHJ1Y3QgeGZzX2Zzb3BfaGFuZGxlcmVxKQorI2RlZmluZSBYRlNfSU9DX1NXQVBFWFQJCSAgICAgX0lPV1IoJ1gnLCAxMDksIHN0cnVjdCB4ZnNfc3dhcGV4dCkKKyNkZWZpbmUgWEZTX0lPQ19GU0dST1dGU0RBVEEJICAgICBfSU9XICgnWCcsIDExMCwgc3RydWN0IHhmc19ncm93ZnNfZGF0YSkKKyNkZWZpbmUgWEZTX0lPQ19GU0dST1dGU0xPRwkgICAgIF9JT1cgKCdYJywgMTExLCBzdHJ1Y3QgeGZzX2dyb3dmc19sb2cpCisjZGVmaW5lIFhGU19JT0NfRlNHUk9XRlNSVAkgICAgIF9JT1cgKCdYJywgMTEyLCBzdHJ1Y3QgeGZzX2dyb3dmc19ydCkKKyNkZWZpbmUgWEZTX0lPQ19GU0NPVU5UUwkgICAgIF9JT1IgKCdYJywgMTEzLCBzdHJ1Y3QgeGZzX2Zzb3BfY291bnRzKQorI2RlZmluZSBYRlNfSU9DX1NFVF9SRVNCTEtTCSAgICAgX0lPV1IoJ1gnLCAxMTQsIHN0cnVjdCB4ZnNfZnNvcF9yZXNibGtzKQorI2RlZmluZSBYRlNfSU9DX0dFVF9SRVNCTEtTCSAgICAgX0lPUiAoJ1gnLCAxMTUsIHN0cnVjdCB4ZnNfZnNvcF9yZXNibGtzKQorI2RlZmluZSBYRlNfSU9DX0VSUk9SX0lOSkVDVElPTgkgICAgIF9JT1cgKCdYJywgMTE2LCBzdHJ1Y3QgeGZzX2Vycm9yX2luamVjdGlvbikKKyNkZWZpbmUgWEZTX0lPQ19FUlJPUl9DTEVBUkFMTAkgICAgIF9JT1cgKCdYJywgMTE3LCBzdHJ1Y3QgeGZzX2Vycm9yX2luamVjdGlvbikKKy8qCVhGU19JT0NfQVRUUkNUTF9CWV9IQU5ETEUgLS0gZGVwcmVjYXRlZCAxMTgJICovCisjZGVmaW5lIFhGU19JT0NfRlJFRVpFCQkgICAgIF9JT1dSKCdYJywgMTE5LCBpbnQpCisjZGVmaW5lIFhGU19JT0NfVEhBVwkJICAgICBfSU9XUignWCcsIDEyMCwgaW50KQorI2RlZmluZSBYRlNfSU9DX0ZTU0VURE1fQllfSEFORExFICAgIF9JT1cgKCdYJywgMTIxLCBzdHJ1Y3QgeGZzX2Zzb3Bfc2V0ZG1faGFuZGxlcmVxKQorI2RlZmluZSBYRlNfSU9DX0FUVFJMSVNUX0JZX0hBTkRMRSAgIF9JT1cgKCdYJywgMTIyLCBzdHJ1Y3QgeGZzX2Zzb3BfYXR0cmxpc3RfaGFuZGxlcmVxKQorI2RlZmluZSBYRlNfSU9DX0FUVFJNVUxUSV9CWV9IQU5ETEUgIF9JT1cgKCdYJywgMTIzLCBzdHJ1Y3QgeGZzX2Zzb3BfYXR0cm11bHRpX2hhbmRsZXJlcSkKKyNkZWZpbmUgWEZTX0lPQ19GU0dFT01FVFJZCSAgICAgX0lPUiAoJ1gnLCAxMjQsIHN0cnVjdCB4ZnNfZnNvcF9nZW9tKQorI2RlZmluZSBYRlNfSU9DX0dPSU5HRE9XTgkgICAgIF9JT1IgKCdYJywgMTI1LCBfX3VpbnQzMl90KQorLyoJWEZTX0lPQ19HRVRGU1VVSUQgLS0tLS0tLS0tLSBkZXByZWNhdGVkIDE0MAkgKi8KKworCisjaWZuZGVmIEhBVkVfQkJNQUNST1MKKy8qCisgKiBCbG9jayBJL08gcGFyYW1ldGVyaXphdGlvbi4JQSBiYXNpYyBibG9jayAoQkIpIGlzIHRoZSBsb3dlc3Qgc2l6ZSBvZgorICogZmlsZXN5c3RlbSBhbGxvY2F0aW9uLCBhbmQgbXVzdCBlcXVhbCA1MTIuICBMZW5ndGggdW5pdHMgZ2l2ZW4gdG8gYmlvCisgKiByb3V0aW5lcyBhcmUgaW4gQkIncy4KKyAqLworI2RlZmluZSBCQlNISUZUCQk5CisjZGVmaW5lIEJCU0laRQkJKDE8PEJCU0hJRlQpCisjZGVmaW5lIEJCTUFTSwkJKEJCU0laRS0xKQorI2RlZmluZSBCVE9CQihieXRlcykJKCgoX191NjQpKGJ5dGVzKSArIEJCU0laRSAtIDEpID4+IEJCU0hJRlQpCisjZGVmaW5lIEJUT0JCVChieXRlcykJKChfX3U2NCkoYnl0ZXMpID4+IEJCU0hJRlQpCisjZGVmaW5lIEJCVE9CKGJicykJKChiYnMpIDw8IEJCU0hJRlQpCisjZW5kaWYKKworI2VuZGlmCS8qIF9fWEZTX0ZTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19mc29wcy5jIGIvZnMveGZzL3hmc19mc29wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMjEzMDUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2Zzb3BzLmMKQEAgLTAsMCArMSw2MTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZnNvcHMuaCIKKyNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisjaW5jbHVkZSAieGZzX3JlZmNhY2hlLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zX3NwYWNlLmgiCisjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisKKy8qCisgKiBGaWxlIHN5c3RlbSBvcGVyYXRpb25zCisgKi8KKworaW50Cit4ZnNfZnNfZ2VvbWV0cnkoCisJeGZzX21vdW50X3QJCSptcCwKKwl4ZnNfZnNvcF9nZW9tX3QJCSpnZW8sCisJaW50CQkJbmV3X3ZlcnNpb24pCit7CisJZ2VvLT5ibG9ja3NpemUgPSBtcC0+bV9zYi5zYl9ibG9ja3NpemU7CisJZ2VvLT5ydGV4dHNpemUgPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKKwlnZW8tPmFnYmxvY2tzID0gbXAtPm1fc2Iuc2JfYWdibG9ja3M7CisJZ2VvLT5hZ2NvdW50ID0gbXAtPm1fc2Iuc2JfYWdjb3VudDsKKwlnZW8tPmxvZ2Jsb2NrcyA9IG1wLT5tX3NiLnNiX2xvZ2Jsb2NrczsKKwlnZW8tPnNlY3RzaXplID0gbXAtPm1fc2Iuc2Jfc2VjdHNpemU7CisJZ2VvLT5pbm9kZXNpemUgPSBtcC0+bV9zYi5zYl9pbm9kZXNpemU7CisJZ2VvLT5pbWF4cGN0ID0gbXAtPm1fc2Iuc2JfaW1heF9wY3Q7CisJZ2VvLT5kYXRhYmxvY2tzID0gbXAtPm1fc2Iuc2JfZGJsb2NrczsKKwlnZW8tPnJ0YmxvY2tzID0gbXAtPm1fc2Iuc2JfcmJsb2NrczsKKwlnZW8tPnJ0ZXh0ZW50cyA9IG1wLT5tX3NiLnNiX3JleHRlbnRzOworCWdlby0+bG9nc3RhcnQgPSBtcC0+bV9zYi5zYl9sb2dzdGFydDsKKwlBU1NFUlQoc2l6ZW9mKGdlby0+dXVpZCk9PXNpemVvZihtcC0+bV9zYi5zYl91dWlkKSk7CisJbWVtY3B5KGdlby0+dXVpZCwgJm1wLT5tX3NiLnNiX3V1aWQsIHNpemVvZihtcC0+bV9zYi5zYl91dWlkKSk7CisJaWYgKG5ld192ZXJzaW9uID49IDIpIHsKKwkJZ2VvLT5zdW5pdCA9IG1wLT5tX3NiLnNiX3VuaXQ7CisJCWdlby0+c3dpZHRoID0gbXAtPm1fc2Iuc2Jfd2lkdGg7CisJfQorCWlmIChuZXdfdmVyc2lvbiA+PSAzKSB7CisJCWdlby0+dmVyc2lvbiA9IFhGU19GU09QX0dFT01fVkVSU0lPTjsKKwkJZ2VvLT5mbGFncyA9CisJCQkoWEZTX1NCX1ZFUlNJT05fSEFTQVRUUigmbXAtPm1fc2IpID8KKwkJCQlYRlNfRlNPUF9HRU9NX0ZMQUdTX0FUVFIgOiAwKSB8CisJCQkoWEZTX1NCX1ZFUlNJT05fSEFTTkxJTksoJm1wLT5tX3NiKSA/CisJCQkJWEZTX0ZTT1BfR0VPTV9GTEFHU19OTElOSyA6IDApIHwKKwkJCShYRlNfU0JfVkVSU0lPTl9IQVNRVU9UQSgmbXAtPm1fc2IpID8KKwkJCQlYRlNfRlNPUF9HRU9NX0ZMQUdTX1FVT1RBIDogMCkgfAorCQkJKFhGU19TQl9WRVJTSU9OX0hBU0FMSUdOKCZtcC0+bV9zYikgPworCQkJCVhGU19GU09QX0dFT01fRkxBR1NfSUFMSUdOIDogMCkgfAorCQkJKFhGU19TQl9WRVJTSU9OX0hBU0RBTElHTigmbXAtPm1fc2IpID8KKwkJCQlYRlNfRlNPUF9HRU9NX0ZMQUdTX0RBTElHTiA6IDApIHwKKwkJCShYRlNfU0JfVkVSU0lPTl9IQVNTSEFSRUQoJm1wLT5tX3NiKSA/CisJCQkJWEZTX0ZTT1BfR0VPTV9GTEFHU19TSEFSRUQgOiAwKSB8CisJCQkoWEZTX1NCX1ZFUlNJT05fSEFTRVhURkxHQklUKCZtcC0+bV9zYikgPworCQkJCVhGU19GU09QX0dFT01fRkxBR1NfRVhURkxHIDogMCkgfAorCQkJKFhGU19TQl9WRVJTSU9OX0hBU0RJUlYyKCZtcC0+bV9zYikgPworCQkJCVhGU19GU09QX0dFT01fRkxBR1NfRElSVjIgOiAwKSB8CisJCQkoWEZTX1NCX1ZFUlNJT05fSEFTU0VDVE9SKCZtcC0+bV9zYikgPworCQkJCVhGU19GU09QX0dFT01fRkxBR1NfU0VDVE9SIDogMCk7CisJCWdlby0+bG9nc2VjdHNpemUgPSBYRlNfU0JfVkVSU0lPTl9IQVNTRUNUT1IoJm1wLT5tX3NiKSA/CisJCQkJbXAtPm1fc2Iuc2JfbG9nc2VjdHNpemUgOiBCQlNJWkU7CisJCWdlby0+cnRzZWN0c2l6ZSA9IG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZTsKKwkJZ2VvLT5kaXJibG9ja3NpemUgPSBtcC0+bV9kaXJibGtzaXplOworCX0KKwlpZiAobmV3X3ZlcnNpb24gPj0gNCkgeworCQlnZW8tPmZsYWdzIHw9CisJCQkoWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJm1wLT5tX3NiKSA/CisJCQkJWEZTX0ZTT1BfR0VPTV9GTEFHU19MT0dWMiA6IDApOworCQlnZW8tPmxvZ3N1bml0ID0gbXAtPm1fc2Iuc2JfbG9nc3VuaXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit4ZnNfZ3Jvd2ZzX2RhdGFfcHJpdmF0ZSgKKwl4ZnNfbW91bnRfdAkJKm1wLAkJLyogbW91bnQgcG9pbnQgZm9yIGZpbGVzeXN0ZW0gKi8KKwl4ZnNfZ3Jvd2ZzX2RhdGFfdAkqaW4pCQkvKiBncm93ZnMgZGF0YSBpbnB1dCBzdHJ1Y3QgKi8KK3sKKwl4ZnNfYWdmX3QJCSphZ2Y7CisJeGZzX2FnaV90CQkqYWdpOworCXhmc19hZ251bWJlcl90CQlhZ25vOworCXhmc19leHRsZW5fdAkJYWdzaXplOworCXhmc19leHRsZW5fdAkJdG1wc2l6ZTsKKwl4ZnNfYWxsb2NfcmVjX3QJCSphcmVjOworCXhmc19idHJlZV9zYmxvY2tfdAkqYmxvY2s7CisJeGZzX2J1Zl90CQkqYnA7CisJaW50CQkJYnVja2V0OworCWludAkJCWRwY3Q7CisJaW50CQkJZXJyb3I7CisJeGZzX2FnbnVtYmVyX3QJCW5hZ2NvdW50OworCXhmc19hZ251bWJlcl90CQluYWdpbWF4ID0gMDsKKwl4ZnNfcmZzYmxvY2tfdAkJbmIsIG5iX21vZDsKKwl4ZnNfcmZzYmxvY2tfdAkJbmV3OworCXhmc19yZnNibG9ja190CQluZnJlZTsKKwl4ZnNfYWdudW1iZXJfdAkJb2FnY291bnQ7CisJaW50CQkJcGN0OworCXhmc19zYl90CQkqc2JwOworCXhmc190cmFuc190CQkqdHA7CisKKwluYiA9IGluLT5uZXdibG9ja3M7CisJcGN0ID0gaW4tPmltYXhwY3Q7CisJaWYgKG5iIDwgbXAtPm1fc2Iuc2JfZGJsb2NrcyB8fCBwY3QgPCAwIHx8IHBjdCA+IDEwMCkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCWRwY3QgPSBwY3QgLSBtcC0+bV9zYi5zYl9pbWF4X3BjdDsKKwllcnJvciA9IHhmc19yZWFkX2J1ZihtcCwgbXAtPm1fZGRldl90YXJncCwKKwkJCVhGU19GU0JfVE9fQkIobXAsIG5iKSAtIFhGU19GU1NfVE9fQkIobXAsIDEpLAorCQkJWEZTX0ZTU19UT19CQihtcCwgMSksIDAsICZicCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJQVNTRVJUKGJwKTsKKwl4ZnNfYnVmX3JlbHNlKGJwKTsKKworCW5ldyA9IG5iOwkvKiB1c2UgbmV3IGFzIGEgdGVtcG9yYXJ5IGhlcmUgKi8KKwluYl9tb2QgPSBkb19kaXYobmV3LCBtcC0+bV9zYi5zYl9hZ2Jsb2Nrcyk7CisJbmFnY291bnQgPSBuZXcgKyAobmJfbW9kICE9IDApOworCWlmIChuYl9tb2QgJiYgbmJfbW9kIDwgWEZTX01JTl9BR19CTE9DS1MpIHsKKwkJbmFnY291bnQtLTsKKwkJbmIgPSBuYWdjb3VudCAqIG1wLT5tX3NiLnNiX2FnYmxvY2tzOworCQlpZiAobmIgPCBtcC0+bV9zYi5zYl9kYmxvY2tzKQorCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKwluZXcgPSBuYiAtIG1wLT5tX3NiLnNiX2RibG9ja3M7CisJb2FnY291bnQgPSBtcC0+bV9zYi5zYl9hZ2NvdW50OworCWlmIChuYWdjb3VudCA+IG9hZ2NvdW50KSB7CisJCWRvd25fd3JpdGUoJm1wLT5tX3BlcmFnbG9jayk7CisJCW1wLT5tX3BlcmFnID0ga21lbV9yZWFsbG9jKG1wLT5tX3BlcmFnLAorCQkJc2l6ZW9mKHhmc19wZXJhZ190KSAqIG5hZ2NvdW50LAorCQkJc2l6ZW9mKHhmc19wZXJhZ190KSAqIG9hZ2NvdW50LAorCQkJS01fU0xFRVApOworCQltZW1zZXQoJm1wLT5tX3BlcmFnW29hZ2NvdW50XSwgMCwKKwkJCShuYWdjb3VudCAtIG9hZ2NvdW50KSAqIHNpemVvZih4ZnNfcGVyYWdfdCkpOworCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfMzJCSVRJTk9ERVM7CisJCW5hZ2ltYXggPSB4ZnNfaW5pdGlhbGl6ZV9wZXJhZyhtcCwgbmFnY291bnQpOworCQl1cF93cml0ZSgmbXAtPm1fcGVyYWdsb2NrKTsKKwl9CisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19HUk9XRlMpOworCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgWEZTX0dST1dGU19TUEFDRV9SRVMobXApLAorCQkJWEZTX0dST1dEQVRBX0xPR19SRVMobXApLCAwLCAwLCAwKSkpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwluZnJlZSA9IDA7CisJZm9yIChhZ25vID0gbmFnY291bnQgLSAxOyBhZ25vID49IG9hZ2NvdW50OyBhZ25vLS0sIG5ldyAtPSBhZ3NpemUpIHsKKwkJLyoKKwkJICogQUcgZnJlZWxpc3QgaGVhZGVyIGJsb2NrCisJCSAqLworCQlicCA9IHhmc19idWZfZ2V0KG1wLT5tX2RkZXZfdGFyZ3AsCisJCQkJICBYRlNfQUdfREFERFIobXAsIGFnbm8sIFhGU19BR0ZfREFERFIobXApKSwKKwkJCQkgIFhGU19GU1NfVE9fQkIobXAsIDEpLCAwKTsKKwkJYWdmID0gWEZTX0JVRl9UT19BR0YoYnApOworCQltZW1zZXQoYWdmLCAwLCBtcC0+bV9zYi5zYl9zZWN0c2l6ZSk7CisJCUlOVF9TRVQoYWdmLT5hZ2ZfbWFnaWNudW0sIEFSQ0hfQ09OVkVSVCwgWEZTX0FHRl9NQUdJQyk7CisJCUlOVF9TRVQoYWdmLT5hZ2ZfdmVyc2lvbm51bSwgQVJDSF9DT05WRVJULCBYRlNfQUdGX1ZFUlNJT04pOworCQlJTlRfU0VUKGFnZi0+YWdmX3NlcW5vLCBBUkNIX0NPTlZFUlQsIGFnbm8pOworCQlpZiAoYWdubyA9PSBuYWdjb3VudCAtIDEpCisJCQlhZ3NpemUgPQorCQkJCW5iIC0KKwkJCQkoYWdubyAqICh4ZnNfcmZzYmxvY2tfdCltcC0+bV9zYi5zYl9hZ2Jsb2Nrcyk7CisJCWVsc2UKKwkJCWFnc2l6ZSA9IG1wLT5tX3NiLnNiX2FnYmxvY2tzOworCQlJTlRfU0VUKGFnZi0+YWdmX2xlbmd0aCwgQVJDSF9DT05WRVJULCBhZ3NpemUpOworCQlJTlRfU0VUKGFnZi0+YWdmX3Jvb3RzW1hGU19CVE5VTV9CTk9pXSwgQVJDSF9DT05WRVJULAorCQkJWEZTX0JOT19CTE9DSyhtcCkpOworCQlJTlRfU0VUKGFnZi0+YWdmX3Jvb3RzW1hGU19CVE5VTV9DTlRpXSwgQVJDSF9DT05WRVJULAorCQkJWEZTX0NOVF9CTE9DSyhtcCkpOworCQlJTlRfU0VUKGFnZi0+YWdmX2xldmVsc1tYRlNfQlROVU1fQk5PaV0sIEFSQ0hfQ09OVkVSVCwgMSk7CisJCUlOVF9TRVQoYWdmLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9DTlRpXSwgQVJDSF9DT05WRVJULCAxKTsKKwkJYWdmLT5hZ2ZfZmxmaXJzdCA9IDA7CisJCUlOVF9TRVQoYWdmLT5hZ2ZfZmxsYXN0LCBBUkNIX0NPTlZFUlQsIFhGU19BR0ZMX1NJWkUobXApIC0gMSk7CisJCWFnZi0+YWdmX2ZsY291bnQgPSAwOworCQl0bXBzaXplID0gYWdzaXplIC0gWEZTX1BSRUFMTE9DX0JMT0NLUyhtcCk7CisJCUlOVF9TRVQoYWdmLT5hZ2ZfZnJlZWJsa3MsIEFSQ0hfQ09OVkVSVCwgdG1wc2l6ZSk7CisJCUlOVF9TRVQoYWdmLT5hZ2ZfbG9uZ2VzdCwgQVJDSF9DT05WRVJULCB0bXBzaXplKTsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKG1wLCBicCk7CisJCWlmIChlcnJvcikgeworCQkJZ290byBlcnJvcjA7CisJCX0KKwkJLyoKKwkJICogQUcgaW5vZGUgaGVhZGVyIGJsb2NrCisJCSAqLworCQlicCA9IHhmc19idWZfZ2V0KG1wLT5tX2RkZXZfdGFyZ3AsCisJCQkJICBYRlNfQUdfREFERFIobXAsIGFnbm8sIFhGU19BR0lfREFERFIobXApKSwKKwkJCQkgIFhGU19GU1NfVE9fQkIobXAsIDEpLCAwKTsKKwkJYWdpID0gWEZTX0JVRl9UT19BR0koYnApOworCQltZW1zZXQoYWdpLCAwLCBtcC0+bV9zYi5zYl9zZWN0c2l6ZSk7CisJCUlOVF9TRVQoYWdpLT5hZ2lfbWFnaWNudW0sIEFSQ0hfQ09OVkVSVCwgWEZTX0FHSV9NQUdJQyk7CisJCUlOVF9TRVQoYWdpLT5hZ2lfdmVyc2lvbm51bSwgQVJDSF9DT05WRVJULCBYRlNfQUdJX1ZFUlNJT04pOworCQlJTlRfU0VUKGFnaS0+YWdpX3NlcW5vLCBBUkNIX0NPTlZFUlQsIGFnbm8pOworCQlJTlRfU0VUKGFnaS0+YWdpX2xlbmd0aCwgQVJDSF9DT05WRVJULCBhZ3NpemUpOworCQlhZ2ktPmFnaV9jb3VudCA9IDA7CisJCUlOVF9TRVQoYWdpLT5hZ2lfcm9vdCwgQVJDSF9DT05WRVJULCBYRlNfSUJUX0JMT0NLKG1wKSk7CisJCUlOVF9TRVQoYWdpLT5hZ2lfbGV2ZWwsIEFSQ0hfQ09OVkVSVCwgMSk7CisJCWFnaS0+YWdpX2ZyZWVjb3VudCA9IDA7CisJCUlOVF9TRVQoYWdpLT5hZ2lfbmV3aW5vLCBBUkNIX0NPTlZFUlQsIE5VTExBR0lOTyk7CisJCUlOVF9TRVQoYWdpLT5hZ2lfZGlyaW5vLCBBUkNIX0NPTlZFUlQsIE5VTExBR0lOTyk7CisJCWZvciAoYnVja2V0ID0gMDsgYnVja2V0IDwgWEZTX0FHSV9VTkxJTktFRF9CVUNLRVRTOyBidWNrZXQrKykKKwkJCUlOVF9TRVQoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0XSwgQVJDSF9DT05WRVJULAorCQkJCU5VTExBR0lOTyk7CisJCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOworCQlpZiAoZXJyb3IpIHsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJCS8qCisJCSAqIEJOTyBidHJlZSByb290IGJsb2NrCisJCSAqLworCQlicCA9IHhmc19idWZfZ2V0KG1wLT5tX2RkZXZfdGFyZ3AsCisJCQlYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLCBYRlNfQk5PX0JMT0NLKG1wKSksCisJCQlCVE9CQihtcC0+bV9zYi5zYl9ibG9ja3NpemUpLCAwKTsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX1NCTE9DSyhicCk7CisJCW1lbXNldChibG9jaywgMCwgbXAtPm1fc2Iuc2JfYmxvY2tzaXplKTsKKwkJSU5UX1NFVChibG9jay0+YmJfbWFnaWMsIEFSQ0hfQ09OVkVSVCwgWEZTX0FCVEJfTUFHSUMpOworCQlibG9jay0+YmJfbGV2ZWwgPSAwOworCQlJTlRfU0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIDEpOworCQlJTlRfU0VUKGJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExBR0JMT0NLKTsKKwkJSU5UX1NFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCwgTlVMTEFHQkxPQ0spOworCQlhcmVjID0gWEZTX0JUUkVFX1JFQ19BRERSKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwgeGZzX2FsbG9jLAorCQkJYmxvY2ssIDEsIG1wLT5tX2FsbG9jX214clswXSk7CisJCUlOVF9TRVQoYXJlYy0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJULAorCQkJWEZTX1BSRUFMTE9DX0JMT0NLUyhtcCkpOworCQlJTlRfU0VUKGFyZWMtPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCwKKwkJCWFnc2l6ZSAtIElOVF9HRVQoYXJlYy0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJUKSk7CisJCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOworCQlpZiAoZXJyb3IpIHsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJCS8qCisJCSAqIENOVCBidHJlZSByb290IGJsb2NrCisJCSAqLworCQlicCA9IHhmc19idWZfZ2V0KG1wLT5tX2RkZXZfdGFyZ3AsCisJCQlYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLCBYRlNfQ05UX0JMT0NLKG1wKSksCisJCQlCVE9CQihtcC0+bV9zYi5zYl9ibG9ja3NpemUpLCAwKTsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX1NCTE9DSyhicCk7CisJCW1lbXNldChibG9jaywgMCwgbXAtPm1fc2Iuc2JfYmxvY2tzaXplKTsKKwkJSU5UX1NFVChibG9jay0+YmJfbWFnaWMsIEFSQ0hfQ09OVkVSVCwgWEZTX0FCVENfTUFHSUMpOworCQlibG9jay0+YmJfbGV2ZWwgPSAwOworCQlJTlRfU0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIDEpOworCQlJTlRfU0VUKGJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExBR0JMT0NLKTsKKwkJSU5UX1NFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCwgTlVMTEFHQkxPQ0spOworCQlhcmVjID0gWEZTX0JUUkVFX1JFQ19BRERSKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwgeGZzX2FsbG9jLAorCQkJYmxvY2ssIDEsIG1wLT5tX2FsbG9jX214clswXSk7CisJCUlOVF9TRVQoYXJlYy0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJULAorCQkJWEZTX1BSRUFMTE9DX0JMT0NLUyhtcCkpOworCQlJTlRfU0VUKGFyZWMtPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCwKKwkJCWFnc2l6ZSAtIElOVF9HRVQoYXJlYy0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJUKSk7CisJCW5mcmVlICs9IElOVF9HRVQoYXJlYy0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKG1wLCBicCk7CisJCWlmIChlcnJvcikgeworCQkJZ290byBlcnJvcjA7CisJCX0KKwkJLyoKKwkJICogSU5PIGJ0cmVlIHJvb3QgYmxvY2sKKwkJICovCisJCWJwID0geGZzX2J1Zl9nZXQobXAtPm1fZGRldl90YXJncCwKKwkJCVhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIFhGU19JQlRfQkxPQ0sobXApKSwKKwkJCUJUT0JCKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSksIDApOworCQlibG9jayA9IFhGU19CVUZfVE9fU0JMT0NLKGJwKTsKKwkJbWVtc2V0KGJsb2NrLCAwLCBtcC0+bV9zYi5zYl9ibG9ja3NpemUpOworCQlJTlRfU0VUKGJsb2NrLT5iYl9tYWdpYywgQVJDSF9DT05WRVJULCBYRlNfSUJUX01BR0lDKTsKKwkJYmxvY2stPmJiX2xldmVsID0gMDsKKwkJYmxvY2stPmJiX251bXJlY3MgPSAwOworCQlJTlRfU0VUKGJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExBR0JMT0NLKTsKKwkJSU5UX1NFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCwgTlVMTEFHQkxPQ0spOworCQllcnJvciA9IHhmc19id3JpdGUobXAsIGJwKTsKKwkJaWYgKGVycm9yKSB7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCX0KKwl4ZnNfdHJhbnNfYWdibG9ja3NfZGVsdGEodHAsIG5mcmVlKTsKKwkvKgorCSAqIFRoZXJlIGFyZSBuZXcgYmxvY2tzIGluIHRoZSBvbGQgbGFzdCBhLmcuCisJICovCisJaWYgKG5ldykgeworCQkvKgorCQkgKiBDaGFuZ2UgdGhlIGFnaSBsZW5ndGguCisJCSAqLworCQllcnJvciA9IHhmc19pYWxsb2NfcmVhZF9hZ2kobXAsIHRwLCBhZ25vLCAmYnApOworCQlpZiAoZXJyb3IpIHsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJCUFTU0VSVChicCk7CisJCWFnaSA9IFhGU19CVUZfVE9fQUdJKGJwKTsKKwkJSU5UX01PRChhZ2ktPmFnaV9sZW5ndGgsIEFSQ0hfQ09OVkVSVCwgbmV3KTsKKwkJQVNTRVJUKG5hZ2NvdW50ID09IG9hZ2NvdW50IHx8CisJCSAgICAgICBJTlRfR0VUKGFnaS0+YWdpX2xlbmd0aCwgQVJDSF9DT05WRVJUKSA9PQorCQkJCW1wLT5tX3NiLnNiX2FnYmxvY2tzKTsKKwkJeGZzX2lhbGxvY19sb2dfYWdpKHRwLCBicCwgWEZTX0FHSV9MRU5HVEgpOworCQkvKgorCQkgKiBDaGFuZ2UgYWdmIGxlbmd0aC4KKwkJICovCisJCWVycm9yID0geGZzX2FsbG9jX3JlYWRfYWdmKG1wLCB0cCwgYWdubywgMCwgJmJwKTsKKwkJaWYgKGVycm9yKSB7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQlBU1NFUlQoYnApOworCQlhZ2YgPSBYRlNfQlVGX1RPX0FHRihicCk7CisJCUlOVF9NT0QoYWdmLT5hZ2ZfbGVuZ3RoLCBBUkNIX0NPTlZFUlQsIG5ldyk7CisJCUFTU0VSVChJTlRfR0VUKGFnZi0+YWdmX2xlbmd0aCwgQVJDSF9DT05WRVJUKSA9PQorCQkJCUlOVF9HRVQoYWdpLT5hZ2lfbGVuZ3RoLCBBUkNIX0NPTlZFUlQpKTsKKwkJLyoKKwkJICogRnJlZSB0aGUgbmV3IHNwYWNlLgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfZnJlZV9leHRlbnQodHAsIFhGU19BR0JfVE9fRlNCKG1wLCBhZ25vLAorCQkJSU5UX0dFVChhZ2YtPmFnZl9sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgLSBuZXcpLCBuZXcpOworCQlpZiAoZXJyb3IpIHsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJfQorCWlmIChuYWdjb3VudCA+IG9hZ2NvdW50KQorCQl4ZnNfdHJhbnNfbW9kX3NiKHRwLCBYRlNfVFJBTlNfU0JfQUdDT1VOVCwgbmFnY291bnQgLSBvYWdjb3VudCk7CisJaWYgKG5iID4gbXAtPm1fc2Iuc2JfZGJsb2NrcykKKwkJeGZzX3RyYW5zX21vZF9zYih0cCwgWEZTX1RSQU5TX1NCX0RCTE9DS1MsCisJCQkJIG5iIC0gbXAtPm1fc2Iuc2JfZGJsb2Nrcyk7CisJaWYgKG5mcmVlKQorCQl4ZnNfdHJhbnNfbW9kX3NiKHRwLCBYRlNfVFJBTlNfU0JfRkRCTE9DS1MsIG5mcmVlKTsKKwlpZiAoZHBjdCkKKwkJeGZzX3RyYW5zX21vZF9zYih0cCwgWEZTX1RSQU5TX1NCX0lNQVhQQ1QsIGRwY3QpOworCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgMCwgTlVMTCk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJLyogTmV3IGFsbG9jYXRpb24gZ3JvdXBzIGZ1bGx5IGluaXRpYWxpemVkLCBzbyB1cGRhdGUgbW91bnQgc3RydWN0ICovCisJaWYgKG5hZ2ltYXgpCisJCW1wLT5tX21heGFnaSA9IG5hZ2ltYXg7CisJaWYgKG1wLT5tX3NiLnNiX2ltYXhfcGN0KSB7CisJCV9fdWludDY0X3QgaWNvdW50ID0gbXAtPm1fc2Iuc2JfZGJsb2NrcyAqIG1wLT5tX3NiLnNiX2ltYXhfcGN0OworCQlkb19kaXYoaWNvdW50LCAxMDApOworCQltcC0+bV9tYXhpY291bnQgPSBpY291bnQgPDwgbXAtPm1fc2Iuc2JfaW5vcGJsb2c7CisJfSBlbHNlCisJCW1wLT5tX21heGljb3VudCA9IDA7CisJZm9yIChhZ25vID0gMTsgYWdubyA8IG5hZ2NvdW50OyBhZ25vKyspIHsKKwkJZXJyb3IgPSB4ZnNfcmVhZF9idWYobXAsIG1wLT5tX2RkZXZfdGFyZ3AsCisJCQkJICBYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLCBYRlNfU0JfQkxPQ0sobXApKSwKKwkJCQkgIFhGU19GU1NfVE9fQkIobXAsIDEpLCAwLCAmYnApOworCQlpZiAoZXJyb3IpIHsKKwkJCXhmc19mc19jbW5fZXJyKENFX1dBUk4sIG1wLAorCQkJImVycm9yICVkIHJlYWRpbmcgc2Vjb25kYXJ5IHN1cGVyYmxvY2sgZm9yIGFnICVkIiwKKwkJCQllcnJvciwgYWdubyk7CisJCQlicmVhazsKKwkJfQorCQlzYnAgPSBYRlNfQlVGX1RPX1NCUChicCk7CisJCXhmc194bGF0ZXNiKHNicCwgJm1wLT5tX3NiLCAtMSwgWEZTX1NCX0FMTF9CSVRTKTsKKwkJLyoKKwkJICogSWYgd2UgZ2V0IGFuIGVycm9yIHdyaXRpbmcgb3V0IHRoZSBhbHRlcm5hdGUgc3VwZXJibG9ja3MsCisJCSAqIGp1c3QgaXNzdWUgYSB3YXJuaW5nIGFuZCBjb250aW51ZS4gIFRoZSByZWFsIHdvcmsgaXMKKwkJICogYWxyZWFkeSBkb25lIGFuZCBjb21taXR0ZWQuCisJCSAqLworCQlpZiAoIShlcnJvciA9IHhmc19id3JpdGUobXAsIGJwKSkpIHsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgbXAsCisJCSJ3cml0ZSBlcnJvciAlZCB1cGRhdGluZyBzZWNvbmRhcnkgc3VwZXJibG9jayBmb3IgYWcgJWQiLAorCQkJCWVycm9yLCBhZ25vKTsKKwkJCWJyZWFrOyAvKiBubyBwb2ludCBpbiBjb250aW51aW5nICovCisJCX0KKwl9CisJcmV0dXJuIDA7CisKKyBlcnJvcjA6CisJeGZzX3RyYW5zX2NhbmNlbCh0cCwgWEZTX1RSQU5TX0FCT1JUKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQKK3hmc19ncm93ZnNfbG9nX3ByaXZhdGUoCisJeGZzX21vdW50X3QJCSptcCwJLyogbW91bnQgcG9pbnQgZm9yIGZpbGVzeXN0ZW0gKi8KKwl4ZnNfZ3Jvd2ZzX2xvZ190CSppbikJLyogZ3Jvd2ZzIGxvZyBpbnB1dCBzdHJ1Y3QgKi8KK3sKKwl4ZnNfZXh0bGVuX3QJCW5iOworCisJbmIgPSBpbi0+bmV3YmxvY2tzOworCWlmIChuYiA8IFhGU19NSU5fTE9HX0JMT0NLUyB8fCBuYiA8IFhGU19CX1RPX0ZTQihtcCwgWEZTX01JTl9MT0dfQllURVMpKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJaWYgKG5iID09IG1wLT5tX3NiLnNiX2xvZ2Jsb2NrcyAmJgorCSAgICBpbi0+aXNpbnQgPT0gKG1wLT5tX3NiLnNiX2xvZ3N0YXJ0ICE9IDApKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJLyoKKwkgKiBNb3ZpbmcgdGhlIGxvZyBpcyBoYXJkLCBuZWVkIG5ldyBpbnRlcmZhY2VzIHRvIHN5bmMKKwkgKiB0aGUgbG9nIGZpcnN0LCBob2xkIG9mZiBhbGwgYWN0aXZpdHkgd2hpbGUgbW92aW5nIGl0LgorCSAqIENhbiBoYXZlIHNob3J0ZXIgb3IgbG9uZ2VyIGxvZyBpbiB0aGUgc2FtZSBzcGFjZSwKKwkgKiBvciB0cmFuc2Zvcm0gaW50ZXJuYWwgdG8gZXh0ZXJuYWwgbG9nIG9yIHZpY2UgdmVyc2EuCisJICovCisJcmV0dXJuIFhGU19FUlJPUihFTk9TWVMpOworfQorCisvKgorICogcHJvdGVjdGVkIHZlcnNpb25zIG9mIGdyb3dmcyBmdW5jdGlvbiBhY3F1aXJlIGFuZCByZWxlYXNlIGxvY2tzIG9uIHRoZSBtb3VudAorICogcG9pbnQgLSBleHBvcnRlZCB0aHJvdWdoIGlvY3RsczogWEZTX0lPQ19GU0dST1dGU0RBVEEsIFhGU19JT0NfRlNHUk9XRlNMT0csCisgKiBYRlNfSU9DX0ZTR1JPV0ZTUlQKKyAqLworCisKK2ludAoreGZzX2dyb3dmc19kYXRhKAorCXhmc19tb3VudF90CQkqbXAsCisJeGZzX2dyb3dmc19kYXRhX3QJKmluKQoreworCWludCBlcnJvcjsKKwlpZiAoIWNwc2VtYSgmbXAtPm1fZ3Jvd2xvY2spKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVXT1VMREJMT0NLKTsKKwllcnJvciA9IHhmc19ncm93ZnNfZGF0YV9wcml2YXRlKG1wLCBpbik7CisJdnNlbWEoJm1wLT5tX2dyb3dsb2NrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludAoreGZzX2dyb3dmc19sb2coCisJeGZzX21vdW50X3QJCSptcCwKKwl4ZnNfZ3Jvd2ZzX2xvZ190CSppbikKK3sKKwlpbnQgZXJyb3I7CisJaWYgKCFjcHNlbWEoJm1wLT5tX2dyb3dsb2NrKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFV09VTERCTE9DSyk7CisJZXJyb3IgPSB4ZnNfZ3Jvd2ZzX2xvZ19wcml2YXRlKG1wLCBpbik7CisJdnNlbWEoJm1wLT5tX2dyb3dsb2NrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBleHBvcnRlZCB0aHJvdWdoIGlvY3RsIFhGU19JT0NfRlNDT1VOVFMKKyAqLworCitpbnQKK3hmc19mc19jb3VudHMoCisJeGZzX21vdW50X3QJCSptcCwKKwl4ZnNfZnNvcF9jb3VudHNfdAkqY250KQoreworCXVuc2lnbmVkIGxvbmcJczsKKworCXMgPSBYRlNfU0JfTE9DSyhtcCk7CisJY250LT5mcmVlZGF0YSA9IG1wLT5tX3NiLnNiX2ZkYmxvY2tzOworCWNudC0+ZnJlZXJ0eCA9IG1wLT5tX3NiLnNiX2ZyZXh0ZW50czsKKwljbnQtPmZyZWVpbm8gPSBtcC0+bV9zYi5zYl9pZnJlZTsKKwljbnQtPmFsbG9jaW5vID0gbXAtPm1fc2Iuc2JfaWNvdW50OworCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCXJldHVybiAwOworfQorCisvKgorICogZXhwb3J0ZWQgdGhyb3VnaCBpb2N0bCBYRlNfSU9DX1NFVF9SRVNCTEtTICYgWEZTX0lPQ19HRVRfUkVTQkxLUworICoKKyAqIHhmc19yZXNlcnZlX2Jsb2NrcyBpcyBjYWxsZWQgdG8gc2V0IG1fcmVzYmxrcworICogaW4gdGhlIGluLWNvcmUgbW91bnQgdGFibGUuIFRoZSBudW1iZXIgb2YgdW51c2VkIHJlc2VydmVkIGJsb2NrcworICogaXMga2VwdCBpbiBtX3Jlc2Jsc19hdmFpbC4KKyAqCisgKiBSZXNlcnZlIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJsb2NrcyBpZiBhdmFpbGFibGUuIE90aGVyd2lzZSByZXR1cm4KKyAqIGFzIG1hbnkgYXMgcG9zc2libGUgdG8gc2F0aXNmeSB0aGUgcmVxdWVzdC4gVGhlIGFjdHVhbCBudW1iZXIKKyAqIHJlc2VydmVkIGFyZSByZXR1cm5lZCBpbiBvdXR2YWwKKyAqCisgKiBBIG51bGwgaW52YWwgcG9pbnRlciBpbmRpY2F0ZXMgdGhhdCBvbmx5IHRoZSBjdXJyZW50IHJlc2VydmVkIGJsb2NrcworICogYXZhaWxhYmxlICBzaG91bGQgIGJlIHJldHVybmVkIG5vIHNldHRpbmdzIGFyZSBjaGFuZ2VkLgorICovCisKK2ludAoreGZzX3Jlc2VydmVfYmxvY2tzKAorCXhmc19tb3VudF90ICAgICAgICAgICAgICptcCwKKwlfX3VpbnQ2NF90ICAgICAgICAgICAgICAqaW52YWwsCisJeGZzX2Zzb3BfcmVzYmxrc190ICAgICAgKm91dHZhbCkKK3sKKwlfX2ludDY0X3QJCWxjb3VudGVyLCBkZWx0YTsKKwlfX3VpbnQ2NF90CQlyZXF1ZXN0OworCXVuc2lnbmVkIGxvbmcJCXM7CisKKwkvKiBJZiBpbnZhbCBpcyBudWxsLCByZXBvcnQgY3VycmVudCB2YWx1ZXMgYW5kIHJldHVybiAqLworCisJaWYgKGludmFsID09IChfX3VpbnQ2NF90ICopTlVMTCkgeworCQlvdXR2YWwtPnJlc2Jsa3MgPSBtcC0+bV9yZXNibGtzOworCQlvdXR2YWwtPnJlc2Jsa3NfYXZhaWwgPSBtcC0+bV9yZXNibGtzX2F2YWlsOworCQlyZXR1cm4oMCk7CisJfQorCisJcmVxdWVzdCA9ICppbnZhbDsKKwlzID0gWEZTX1NCX0xPQ0sobXApOworCisJLyoKKwkgKiBJZiBvdXIgcHJldmlvdXMgcmVzZXJ2YXRpb24gd2FzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IHZhbHVlLAorCSAqIHRoZW4gbW92ZSBhbnkgdW51c2VkIGJsb2NrcyBiYWNrIHRvIHRoZSBmcmVlIHBvb2wuCisJICovCisKKwlpZiAobXAtPm1fcmVzYmxrcyA+IHJlcXVlc3QpIHsKKwkJbGNvdW50ZXIgPSBtcC0+bV9yZXNibGtzX2F2YWlsIC0gcmVxdWVzdDsKKwkJaWYgKGxjb3VudGVyICA+IDApIHsJCS8qIHJlbGVhc2UgdW51c2VkIGJsb2NrcyAqLworCQkJbXAtPm1fc2Iuc2JfZmRibG9ja3MgKz0gbGNvdW50ZXI7CisJCQltcC0+bV9yZXNibGtzX2F2YWlsIC09IGxjb3VudGVyOworCQl9CisJCW1wLT5tX3Jlc2Jsa3MgPSByZXF1ZXN0OworCX0gZWxzZSB7CisJCWRlbHRhID0gcmVxdWVzdCAtIG1wLT5tX3Jlc2Jsa3M7CisJCWxjb3VudGVyID0gbXAtPm1fc2Iuc2JfZmRibG9ja3MgLSBkZWx0YTsKKwkJaWYgKGxjb3VudGVyIDwgMCkgeworCQkJLyogV2UgY2FuJ3Qgc2F0aXNmeSB0aGUgcmVxdWVzdCwganVzdCBnZXQgd2hhdCB3ZSBjYW4gKi8KKwkJCW1wLT5tX3Jlc2Jsa3MgKz0gbXAtPm1fc2Iuc2JfZmRibG9ja3M7CisJCQltcC0+bV9yZXNibGtzX2F2YWlsICs9IG1wLT5tX3NiLnNiX2ZkYmxvY2tzOworCQkJbXAtPm1fc2Iuc2JfZmRibG9ja3MgPSAwOworCQl9IGVsc2UgeworCQkJbXAtPm1fc2Iuc2JfZmRibG9ja3MgPSBsY291bnRlcjsKKwkJCW1wLT5tX3Jlc2Jsa3MgPSByZXF1ZXN0OworCQkJbXAtPm1fcmVzYmxrc19hdmFpbCArPSBkZWx0YTsKKwkJfQorCX0KKworCW91dHZhbC0+cmVzYmxrcyA9IG1wLT5tX3Jlc2Jsa3M7CisJb3V0dmFsLT5yZXNibGtzX2F2YWlsID0gbXAtPm1fcmVzYmxrc19hdmFpbDsKKwlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKwlyZXR1cm4oMCk7Cit9CisKK3ZvaWQKK3hmc19mc19sb2dfZHVtbXkoeGZzX21vdW50X3QgKm1wKQoreworCXhmc190cmFuc190ICp0cDsKKwl4ZnNfaW5vZGVfdCAqaXA7CisKKworCXRwID0gX3hmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX0RVTU1ZMSk7CisJYXRvbWljX2luYygmbXAtPm1fYWN0aXZlX3RyYW5zKTsKKwlpZiAoeGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIFhGU19JQ0hBTkdFX0xPR19SRVMobXApLCAwLCAwLCAwKSkgeworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKKwkJcmV0dXJuOworCX0KKworCWlwID0gbXAtPm1fcm9vdGlwOworCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19paG9sZCh0cCwgaXApOworCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKwl4ZnNfdHJhbnNfc2V0X3N5bmModHApOworCXhmc190cmFuc19jb21taXQodHAsIDAsIE5VTEwpOworCisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKK30KKworaW50Cit4ZnNfZnNfZ29pbmdkb3duKAorCXhmc19tb3VudF90CSptcCwKKwlfX3VpbnQzMl90CWluZmxhZ3MpCit7CisJc3dpdGNoIChpbmZsYWdzKSB7CisJY2FzZSBYRlNfRlNPUF9HT0lOR19GTEFHU19ERUZBVUxUOiB7CisJCXN0cnVjdCB2ZnMgKnZmc3AgPSBYRlNfTVRPVkZTKG1wKTsKKwkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGZyZWV6ZV9iZGV2KHZmc3AtPnZmc19zdXBlci0+c19iZGV2KTsKKworCQlpZiAoc2IpIHsKKwkJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgWEZTX0ZPUkNFX1VNT1VOVCk7CisJCQl0aGF3X2JkZXYoc2ItPnNfYmRldiwgc2IpOworCQl9CisJCisJCWJyZWFrOworCX0KKwljYXNlIFhGU19GU09QX0dPSU5HX0ZMQUdTX0xPR0ZMVVNIOgorCQl4ZnNfZm9yY2Vfc2h1dGRvd24obXAsIFhGU19GT1JDRV9VTU9VTlQpOworCQlicmVhazsKKwljYXNlIFhGU19GU09QX0dPSU5HX0ZMQUdTX05PTE9HRkxVU0g6CisJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgWEZTX0ZPUkNFX1VNT1VOVHxYRlNfTE9HX0lPX0VSUk9SKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19mc29wcy5oIGIvZnMveGZzL3hmc19mc29wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MTQ4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2Zzb3BzLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfRlNPUFNfSF9fCisjZGVmaW5lCV9fWEZTX0ZTT1BTX0hfXworCitpbnQKK3hmc19mc19nZW9tZXRyeSgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXhmc19mc29wX2dlb21fdAkJKmdlbywKKwlpbnQJCQluZXdfdmVyc2lvbik7CisKK2ludAoreGZzX2dyb3dmc19kYXRhKAorCXhmc19tb3VudF90CQkqbXAsCisJeGZzX2dyb3dmc19kYXRhX3QJKmluKTsKKworaW50Cit4ZnNfZ3Jvd2ZzX2xvZygKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXhmc19ncm93ZnNfbG9nX3QJKmluKTsKKworaW50Cit4ZnNfZnNfY291bnRzKAorCXhmc19tb3VudF90CQkqbXAsCisJeGZzX2Zzb3BfY291bnRzX3QJKmNudCk7CisKK2ludAoreGZzX3Jlc2VydmVfYmxvY2tzKAorCXhmc19tb3VudF90CQkqbXAsCisJX191aW50NjRfdAkJKmludmFsLAorCXhmc19mc29wX3Jlc2Jsa3NfdAkqb3V0dmFsKTsKKworaW50Cit4ZnNfZnNfZ29pbmdkb3duKAorCXhmc19tb3VudF90CQkqbXAsCisJX191aW50MzJfdAkJaW5mbGFncyk7CisKKyNlbmRpZgkvKiBfX1hGU19GU09QU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaWFsbG9jLmMgYi9mcy94ZnMveGZzX2lhbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNWZlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2lhbGxvYy5jCkBAIC0wLDAgKzEsMTQwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorCisvKgorICogTG9nIHNwZWNpZmllZCBmaWVsZHMgZm9yIHRoZSBpbm9kZSBnaXZlbiBieSBicCBhbmQgb2ZmLgorICovCitTVEFUSUMgdm9pZAoreGZzX2lhbGxvY19sb2dfZGkoCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19idWZfdAkqYnAsCQkvKiBpbm9kZSBidWZmZXIgKi8KKwlpbnQJCW9mZiwJCS8qIGluZGV4IG9mIGlub2RlIGluIGJ1ZmZlciAqLworCWludAkJZmllbGRzKQkJLyogYml0bWFzayBvZiBmaWVsZHMgdG8gbG9nICovCit7CisJaW50CQkJZmlyc3Q7CQkvKiBmaXJzdCBieXRlIG51bWJlciAqLworCWludAkJCWlvZmZzZXQ7CS8qIG9mZiBpbiBieXRlcyAqLworCWludAkJCWxhc3Q7CQkvKiBsYXN0IGJ5dGUgbnVtYmVyICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIG1vdW50IHBvaW50IHN0cnVjdHVyZSAqLworCXN0YXRpYyBjb25zdCBzaG9ydAlvZmZzZXRzW10gPSB7CS8qIGZpZWxkIG9mZnNldHMgKi8KKwkJCQkJCS8qIGtlZXAgaW4gc3luYyB3aXRoIGJpdHMgKi8KKwkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX21hZ2ljKSwKKwkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX21vZGUpLAorCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfdmVyc2lvbiksCisJCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9mb3JtYXQpLAorCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfb25saW5rKSwKKwkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX3VpZCksCisJCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9naWQpLAorCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfbmxpbmspLAorCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfcHJvamlkKSwKKwkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX3BhZCksCisJCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9hdGltZSksCisJCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9tdGltZSksCisJCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9jdGltZSksCisJCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9zaXplKSwKKwkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX25ibG9ja3MpLAorCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfZXh0c2l6ZSksCisJCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9uZXh0ZW50cyksCisJCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9hbmV4dGVudHMpLAorCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfZm9ya29mZiksCisJCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9hZm9ybWF0KSwKKwkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX2RtZXZtYXNrKSwKKwkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX2Rtc3RhdGUpLAorCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfZmxhZ3MpLAorCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfZ2VuKSwKKwkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV90LCBkaV9uZXh0X3VubGlua2VkKSwKKwkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV90LCBkaV91KSwKKwkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV90LCBkaV9hKSwKKwkJc2l6ZW9mKHhmc19kaW5vZGVfdCkKKwl9OworCisKKwlBU1NFUlQob2Zmc2V0b2YoeGZzX2Rpbm9kZV90LCBkaV9jb3JlKSA9PSAwKTsKKwlBU1NFUlQoKGZpZWxkcyAmIChYRlNfRElfVXxYRlNfRElfQSkpID09IDApOworCW1wID0gdHAtPnRfbW91bnRwOworCS8qCisJICogR2V0IHRoZSBpbm9kZS1yZWxhdGl2ZSBmaXJzdCBhbmQgbGFzdCBieXRlcyBmb3IgdGhlc2UgZmllbGRzCisJICovCisJeGZzX2J0cmVlX29mZnNldHMoZmllbGRzLCBvZmZzZXRzLCBYRlNfRElfTlVNX0JJVFMsICZmaXJzdCwgJmxhc3QpOworCS8qCisJICogQ29udmVydCB0byBidWZmZXIgb2Zmc2V0cyBhbmQgbG9nIGl0LgorCSAqLworCWlvZmZzZXQgPSBvZmYgPDwgbXAtPm1fc2Iuc2JfaW5vZGVsb2c7CisJZmlyc3QgKz0gaW9mZnNldDsKKwlsYXN0ICs9IGlvZmZzZXQ7CisJeGZzX3RyYW5zX2xvZ19idWYodHAsIGJwLCBmaXJzdCwgbGFzdCk7Cit9CisKKy8qCisgKiBBbGxvY2F0aW9uIGdyb3VwIGxldmVsIGZ1bmN0aW9ucy4KKyAqLworCisvKgorICogQWxsb2NhdGUgbmV3IGlub2RlcyBpbiB0aGUgYWxsb2NhdGlvbiBncm91cCBzcGVjaWZpZWQgYnkgYWdicC4KKyAqIFJldHVybiAwIGZvciBzdWNjZXNzLCBlbHNlIGVycm9yIGNvZGUuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgY29kZSBvciAwICovCit4ZnNfaWFsbG9jX2FnX2FsbG9jKAorCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfYnVmX3QJKmFnYnAsCQkvKiBhbGxvYyBncm91cCBidWZmZXIgKi8KKwlpbnQJCSphbGxvYykKK3sKKwl4ZnNfYWdpX3QJKmFnaTsJCS8qIGFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyICovCisJeGZzX2FsbG9jX2FyZ190CWFyZ3M7CQkvKiBhbGxvY2F0aW9uIGFyZ3VtZW50IHN0cnVjdHVyZSAqLworCWludAkJYmxrc19wZXJfY2x1c3RlcjsgIC8qIGZzIGJsb2NrcyBwZXIgaW5vZGUgY2x1c3RlciAqLworCXhmc19idHJlZV9jdXJfdAkqY3VyOwkJLyogaW5vZGUgYnRyZWUgY3Vyc29yICovCisJeGZzX2RhZGRyX3QJZDsJCS8qIGRpc2sgYWRkciBvZiBidWZmZXIgKi8KKwlpbnQJCWVycm9yOworCXhmc19idWZfdAkqZmJ1ZjsJCS8qIG5ldyBmcmVlIGlub2RlcycgYnVmZmVyICovCisJeGZzX2Rpbm9kZV90CSpmcmVlOwkJLyogbmV3IGZyZWUgaW5vZGUgc3RydWN0dXJlICovCisJaW50CQlpOwkJLyogaW5vZGUgY291bnRlciAqLworCWludAkJajsJCS8qIGJsb2NrIGNvdW50ZXIgKi8KKwlpbnQJCW5idWZzOwkJLyogbnVtIGJ1ZnMgb2YgbmV3IGlub2RlcyAqLworCXhmc19hZ2lub190CW5ld2lubzsJCS8qIG5ldyBmaXJzdCBpbm9kZSdzIG51bWJlciAqLworCXhmc19hZ2lub190CW5ld2xlbjsJCS8qIG5ldyBudW1iZXIgb2YgaW5vZGVzICovCisJaW50CQluaW5vZGVzOwkvKiBudW0gaW5vZGVzIHBlciBidWYgKi8KKwl4ZnNfYWdpbm9fdAl0aGlzaW5vOwkvKiBjdXJyZW50IGlub2RlIG51bWJlciwgZm9yIGxvb3AgKi8KKwlpbnQJCXZlcnNpb247CS8qIGlub2RlIHZlcnNpb24gbnVtYmVyIHRvIHVzZSAqLworCWludAkJaXNhbGlnbmVkOwkvKiBpbm9kZSBhbGxvY2F0aW9uIGF0IHN0cmlwZSB1bml0ICovCisJCQkJCS8qIGJvdW5kYXJ5ICovCisJeGZzX2Rpbm9kZV9jb3JlX3QgZGljOyAgICAgICAgICAvKiBhIGRpbm9kZV9jb3JlIHRvIGNvcHkgdG8gbmV3ICovCisJCQkJCS8qIGlub2RlcyAqLworCisJYXJncy50cCA9IHRwOworCWFyZ3MubXAgPSB0cC0+dF9tb3VudHA7CisKKwkvKgorCSAqIExvY2tpbmcgd2lsbCBlbnN1cmUgdGhhdCB3ZSBkb24ndCBoYXZlIHR3byBjYWxsZXJzIGluIGhlcmUKKwkgKiBhdCBvbmUgdGltZS4KKwkgKi8KKwluZXdsZW4gPSBYRlNfSUFMTE9DX0lOT0RFUyhhcmdzLm1wKTsKKwlpZiAoYXJncy5tcC0+bV9tYXhpY291bnQgJiYKKwkgICAgYXJncy5tcC0+bV9zYi5zYl9pY291bnQgKyBuZXdsZW4gPiBhcmdzLm1wLT5tX21heGljb3VudCkKKwkJcmV0dXJuIFhGU19FUlJPUihFTk9TUEMpOworCWFyZ3MubWlubGVuID0gYXJncy5tYXhsZW4gPSBYRlNfSUFMTE9DX0JMT0NLUyhhcmdzLm1wKTsKKwkvKgorCSAqIFNldCB0aGUgYWxpZ25tZW50IGZvciB0aGUgYWxsb2NhdGlvbi4KKwkgKiBJZiBzdHJpcGUgYWxpZ25tZW50IGlzIHR1cm5lZCBvbiB0aGVuIGFsaWduIGF0IHN0cmlwZSB1bml0CisJICogYm91bmRhcnkuCisJICogSWYgdGhlIGNsdXN0ZXIgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gYSBmaWxlc3lzdGVtIGJsb2NrCisJICogdGhlbiB3ZSdyZSBkb2luZyBJL08gZm9yIGlub2RlcyBpbiBmaWxlc3lzdGVtIGJsb2NrIHNpemUgcGllY2VzLAorCSAqIHNvIGRvbid0IG5lZWQgYWxpZ25tZW50IGFueXdheS4KKwkgKi8KKwlpc2FsaWduZWQgPSAwOworCWlmIChhcmdzLm1wLT5tX3Npbm9hbGlnbikgeworCQlBU1NFUlQoIShhcmdzLm1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX05PQUxJR04pKTsKKwkJYXJncy5hbGlnbm1lbnQgPSBhcmdzLm1wLT5tX2RhbGlnbjsKKwkJaXNhbGlnbmVkID0gMTsKKwl9IGVsc2UgaWYgKFhGU19TQl9WRVJTSU9OX0hBU0FMSUdOKCZhcmdzLm1wLT5tX3NiKSAmJgorCSAgICBhcmdzLm1wLT5tX3NiLnNiX2lub2FsaWdubXQgPj0KKwkgICAgWEZTX0JfVE9fRlNCVChhcmdzLm1wLCBYRlNfSU5PREVfQ0xVU1RFUl9TSVpFKGFyZ3MubXApKSkKKwkJYXJncy5hbGlnbm1lbnQgPSBhcmdzLm1wLT5tX3NiLnNiX2lub2FsaWdubXQ7CisJZWxzZQorCQlhcmdzLmFsaWdubWVudCA9IDE7CisJYWdpID0gWEZTX0JVRl9UT19BR0koYWdicCk7CisJLyoKKwkgKiBOZWVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdG8gYWxsb2NhdGUgdGhlIGlub2RlIGJsb2Nrcy4KKwkgKiBJZGVhbGx5IHRoZXkgc2hvdWxkIGJlIHNwYWNlZCBvdXQgdGhyb3VnaCB0aGUgYS5nLgorCSAqIEZvciBub3csIGp1c3QgYWxsb2NhdGUgYmxvY2tzIHVwIGZyb250LgorCSAqLworCWFyZ3MuYWdibm8gPSBJTlRfR0VUKGFnaS0+YWdpX3Jvb3QsIEFSQ0hfQ09OVkVSVCk7CisJYXJncy5mc2JubyA9IFhGU19BR0JfVE9fRlNCKGFyZ3MubXAsIElOVF9HRVQoYWdpLT5hZ2lfc2Vxbm8sIEFSQ0hfQ09OVkVSVCksCisJCQkJICAgIGFyZ3MuYWdibm8pOworCS8qCisJICogQWxsb2NhdGUgYSBmaXhlZC1zaXplIGV4dGVudCBvZiBpbm9kZXMuCisJICovCisJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9ORUFSX0JOTzsKKwlhcmdzLm1vZCA9IGFyZ3MudG90YWwgPSBhcmdzLndhc2RlbCA9IGFyZ3MuaXNmbCA9IGFyZ3MudXNlcmRhdGEgPQorCQlhcmdzLm1pbmFsaWduc2xvcCA9IDA7CisJYXJncy5wcm9kID0gMTsKKwkvKgorCSAqIEFsbG93IHNwYWNlIGZvciB0aGUgaW5vZGUgYnRyZWUgdG8gc3BsaXQuCisJICovCisJYXJncy5taW5sZWZ0ID0gWEZTX0lOX01BWExFVkVMUyhhcmdzLm1wKSAtIDE7CisJaWYgKChlcnJvciA9IHhmc19hbGxvY192ZXh0ZW50KCZhcmdzKSkpCisJCXJldHVybiBlcnJvcjsKKworCS8qCisJICogSWYgc3RyaXBlIGFsaWdubWVudCBpcyB0dXJuZWQgb24sIHRoZW4gdHJ5IGFnYWluIHdpdGggY2x1c3RlcgorCSAqIGFsaWdubWVudC4KKwkgKi8KKwlpZiAoaXNhbGlnbmVkICYmIGFyZ3MuZnNibm8gPT0gTlVMTEZTQkxPQ0spIHsKKwkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9ORUFSX0JOTzsKKwkJYXJncy5hZ2JubyA9IElOVF9HRVQoYWdpLT5hZ2lfcm9vdCwgQVJDSF9DT05WRVJUKTsKKwkJYXJncy5mc2JubyA9IFhGU19BR0JfVE9fRlNCKGFyZ3MubXAsCisJCQkJSU5UX0dFVChhZ2ktPmFnaV9zZXFubywgQVJDSF9DT05WRVJUKSwgYXJncy5hZ2Jubyk7CisJCWlmIChYRlNfU0JfVkVSU0lPTl9IQVNBTElHTigmYXJncy5tcC0+bV9zYikgJiYKKwkJCWFyZ3MubXAtPm1fc2Iuc2JfaW5vYWxpZ25tdCA+PQorCQkJWEZTX0JfVE9fRlNCVChhcmdzLm1wLCBYRlNfSU5PREVfQ0xVU1RFUl9TSVpFKGFyZ3MubXApKSkKKwkJCQlhcmdzLmFsaWdubWVudCA9IGFyZ3MubXAtPm1fc2Iuc2JfaW5vYWxpZ25tdDsKKwkJZWxzZQorCQkJYXJncy5hbGlnbm1lbnQgPSAxOworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX3ZleHRlbnQoJmFyZ3MpKSkKKwkJCXJldHVybiBlcnJvcjsKKwl9CisKKwlpZiAoYXJncy5mc2JubyA9PSBOVUxMRlNCTE9DSykgeworCQkqYWxsb2MgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJQVNTRVJUKGFyZ3MubGVuID09IGFyZ3MubWlubGVuKTsKKwkvKgorCSAqIENvbnZlcnQgdGhlIHJlc3VsdHMuCisJICovCisJbmV3aW5vID0gWEZTX09GRkJOT19UT19BR0lOTyhhcmdzLm1wLCBhcmdzLmFnYm5vLCAwKTsKKwkvKgorCSAqIExvb3Agb3ZlciB0aGUgbmV3IGJsb2NrKHMpLCBmaWxsaW5nIGluIHRoZSBpbm9kZXMuCisJICogRm9yIHNtYWxsIGJsb2NrIHNpemVzLCBtYW5pcHVsYXRlIHRoZSBpbm9kZXMgaW4gYnVmZmVycworCSAqIHdoaWNoIGFyZSBtdWx0aXBsZXMgb2YgdGhlIGJsb2NrcyBzaXplLgorCSAqLworCWlmIChhcmdzLm1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSA+PSBYRlNfSU5PREVfQ0xVU1RFUl9TSVpFKGFyZ3MubXApKSB7CisJCWJsa3NfcGVyX2NsdXN0ZXIgPSAxOworCQluYnVmcyA9IChpbnQpYXJncy5sZW47CisJCW5pbm9kZXMgPSBhcmdzLm1wLT5tX3NiLnNiX2lub3BibG9jazsKKwl9IGVsc2UgeworCQlibGtzX3Blcl9jbHVzdGVyID0gWEZTX0lOT0RFX0NMVVNURVJfU0laRShhcmdzLm1wKSAvCisJCQkJICAgYXJncy5tcC0+bV9zYi5zYl9ibG9ja3NpemU7CisJCW5idWZzID0gKGludClhcmdzLmxlbiAvIGJsa3NfcGVyX2NsdXN0ZXI7CisJCW5pbm9kZXMgPSBibGtzX3Blcl9jbHVzdGVyICogYXJncy5tcC0+bV9zYi5zYl9pbm9wYmxvY2s7CisJfQorCS8qCisJICogRmlndXJlIG91dCB3aGF0IHZlcnNpb24gbnVtYmVyIHRvIHVzZSBpbiB0aGUgaW5vZGVzIHdlIGNyZWF0ZS4KKwkgKiBJZiB0aGUgc3VwZXJibG9jayB2ZXJzaW9uIGhhcyBjYXVnaHQgdXAgdG8gdGhlIG9uZSB0aGF0IHN1cHBvcnRzCisJICogdGhlIG5ldyBpbm9kZSBmb3JtYXQsIHRoZW4gdXNlIHRoZSBuZXcgaW5vZGUgdmVyc2lvbi4gIE90aGVyd2lzZQorCSAqIHVzZSB0aGUgb2xkIHZlcnNpb24gc28gdGhhdCBvbGQga2VybmVscyB3aWxsIGNvbnRpbnVlIHRvIGJlCisJICogYWJsZSB0byB1c2UgdGhlIGZpbGUgc3lzdGVtLgorCSAqLworCWlmIChYRlNfU0JfVkVSU0lPTl9IQVNOTElOSygmYXJncy5tcC0+bV9zYikpCisJCXZlcnNpb24gPSBYRlNfRElOT0RFX1ZFUlNJT05fMjsKKwllbHNlCisJCXZlcnNpb24gPSBYRlNfRElOT0RFX1ZFUlNJT05fMTsKKworCW1lbXNldCgmZGljLCAwLCBzaXplb2YoeGZzX2Rpbm9kZV9jb3JlX3QpKTsKKwlJTlRfU0VUKGRpYy5kaV9tYWdpYywgQVJDSF9DT05WRVJULCBYRlNfRElOT0RFX01BR0lDKTsKKwlJTlRfU0VUKGRpYy5kaV92ZXJzaW9uLCBBUkNIX0NPTlZFUlQsIHZlcnNpb24pOworCisJZm9yIChqID0gMDsgaiA8IG5idWZzOyBqKyspIHsKKwkJLyoKKwkJICogR2V0IHRoZSBibG9jay4KKwkJICovCisJCWQgPSBYRlNfQUdCX1RPX0RBRERSKGFyZ3MubXAsIElOVF9HRVQoYWdpLT5hZ2lfc2Vxbm8sIEFSQ0hfQ09OVkVSVCksCisJCQkJICAgICBhcmdzLmFnYm5vICsgKGogKiBibGtzX3Blcl9jbHVzdGVyKSk7CisJCWZidWYgPSB4ZnNfdHJhbnNfZ2V0X2J1Zih0cCwgYXJncy5tcC0+bV9kZGV2X3RhcmdwLCBkLAorCQkJCQkgYXJncy5tcC0+bV9ic2l6ZSAqIGJsa3NfcGVyX2NsdXN0ZXIsCisJCQkJCSBYRlNfQlVGX0xPQ0spOworCQlBU1NFUlQoZmJ1Zik7CisJCUFTU0VSVCghWEZTX0JVRl9HRVRFUlJPUihmYnVmKSk7CisJCS8qCisJCSAqIExvb3Agb3ZlciB0aGUgaW5vZGVzIGluIHRoaXMgYnVmZmVyLgorCQkgKi8KKworCQlmb3IgKGkgPSAwOyBpIDwgbmlub2RlczsgaSsrKSB7CisJCQlmcmVlID0gWEZTX01BS0VfSVBUUihhcmdzLm1wLCBmYnVmLCBpKTsKKwkJCW1lbWNweSgmKGZyZWUtPmRpX2NvcmUpLCAmZGljLCBzaXplb2YoeGZzX2Rpbm9kZV9jb3JlX3QpKTsKKwkJCUlOVF9TRVQoZnJlZS0+ZGlfbmV4dF91bmxpbmtlZCwgQVJDSF9DT05WRVJULCBOVUxMQUdJTk8pOworCQkJeGZzX2lhbGxvY19sb2dfZGkodHAsIGZidWYsIGksCisJCQkJWEZTX0RJX0NPUkVfQklUUyB8IFhGU19ESV9ORVhUX1VOTElOS0VEKTsKKwkJfQorCQl4ZnNfdHJhbnNfaW5vZGVfYWxsb2NfYnVmKHRwLCBmYnVmKTsKKwl9CisJSU5UX01PRChhZ2ktPmFnaV9jb3VudCwgQVJDSF9DT05WRVJULCBuZXdsZW4pOworCUlOVF9NT0QoYWdpLT5hZ2lfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQsIG5ld2xlbik7CisJZG93bl9yZWFkKCZhcmdzLm1wLT5tX3BlcmFnbG9jayk7CisJYXJncy5tcC0+bV9wZXJhZ1tJTlRfR0VUKGFnaS0+YWdpX3NlcW5vLCBBUkNIX0NPTlZFUlQpXS5wYWdpX2ZyZWVjb3VudCArPSBuZXdsZW47CisJdXBfcmVhZCgmYXJncy5tcC0+bV9wZXJhZ2xvY2spOworCUlOVF9TRVQoYWdpLT5hZ2lfbmV3aW5vLCBBUkNIX0NPTlZFUlQsIG5ld2lubyk7CisJLyoKKwkgKiBJbnNlcnQgcmVjb3JkcyBkZXNjcmliaW5nIHRoZSBuZXcgaW5vZGUgY2h1bmsgaW50byB0aGUgYnRyZWUuCisJICovCisJY3VyID0geGZzX2J0cmVlX2luaXRfY3Vyc29yKGFyZ3MubXAsIHRwLCBhZ2JwLAorCQkJSU5UX0dFVChhZ2ktPmFnaV9zZXFubywgQVJDSF9DT05WRVJUKSwKKwkJCVhGU19CVE5VTV9JTk8sICh4ZnNfaW5vZGVfdCAqKTAsIDApOworCWZvciAodGhpc2lubyA9IG5ld2lubzsKKwkgICAgIHRoaXNpbm8gPCBuZXdpbm8gKyBuZXdsZW47CisJICAgICB0aGlzaW5vICs9IFhGU19JTk9ERVNfUEVSX0NIVU5LKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfbG9va3VwX2VxKGN1ciwgdGhpc2lubywKKwkJCQlYRlNfSU5PREVTX1BFUl9DSFVOSywgWEZTX0lOT0JUX0FMTF9GUkVFLCAmaSkpKSB7CisJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjdXIsIFhGU19CVFJFRV9FUlJPUik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJQVNTRVJUKGkgPT0gMCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfaW5zZXJ0KGN1ciwgJmkpKSkgeworCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLCBYRlNfQlRSRUVfRVJST1IpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCUFTU0VSVChpID09IDEpOworCX0KKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkvKgorCSAqIExvZyBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciBmaWVsZHMKKwkgKi8KKwl4ZnNfaWFsbG9jX2xvZ19hZ2kodHAsIGFnYnAsCisJCVhGU19BR0lfQ09VTlQgfCBYRlNfQUdJX0ZSRUVDT1VOVCB8IFhGU19BR0lfTkVXSU5PKTsKKwkvKgorCSAqIE1vZGlmeS9sb2cgc3VwZXJibG9jayB2YWx1ZXMgZm9yIGlub2RlIGNvdW50IGFuZCBpbm9kZSBmcmVlIGNvdW50LgorCSAqLworCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9JQ09VTlQsIChsb25nKW5ld2xlbik7CisJeGZzX3RyYW5zX21vZF9zYih0cCwgWEZTX1RSQU5TX1NCX0lGUkVFLCAobG9uZyluZXdsZW4pOworCSphbGxvYyA9IDE7CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBfX2lubGluZSB4ZnNfYWdudW1iZXJfdAoreGZzX2lhbGxvY19uZXh0X2FnKAorCXhmc19tb3VudF90CSptcCkKK3sKKwl4ZnNfYWdudW1iZXJfdAlhZ25vOworCisJc3Bpbl9sb2NrKCZtcC0+bV9hZ2lyb3Rvcl9sb2NrKTsKKwlhZ25vID0gbXAtPm1fYWdpcm90b3I7CisJaWYgKCsrbXAtPm1fYWdpcm90b3IgPT0gbXAtPm1fbWF4YWdpKQorCQltcC0+bV9hZ2lyb3RvciA9IDA7CisJc3Bpbl91bmxvY2soJm1wLT5tX2FnaXJvdG9yX2xvY2spOworCisJcmV0dXJuIGFnbm87Cit9CisKKy8qCisgKiBTZWxlY3QgYW4gYWxsb2NhdGlvbiBncm91cCB0byBsb29rIGZvciBhIGZyZWUgaW5vZGUgaW4sIGJhc2VkIG9uIHRoZSBwYXJlbnQKKyAqIGlub2RlIGFuZCB0aGVuIG1vZGUuICBSZXR1cm4gdGhlIGFsbG9jYXRpb24gZ3JvdXAgYnVmZmVyLgorICovCitTVEFUSUMgeGZzX2J1Zl90ICoJCQkvKiBhbGxvY2F0aW9uIGdyb3VwIGJ1ZmZlciAqLworeGZzX2lhbGxvY19hZ19zZWxlY3QoCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9fdAlwYXJlbnQsCQkvKiBwYXJlbnQgZGlyZWN0b3J5IGlub2RlIG51bWJlciAqLworCW1vZGVfdAkJbW9kZSwJCS8qIGJpdHMgc2V0IHRvIGluZGljYXRlIGZpbGUgdHlwZSAqLworCWludAkJb2thbGxvYykJLyogb2sgdG8gYWxsb2NhdGUgbW9yZSBzcGFjZSAqLworeworCXhmc19idWZfdAkqYWdicDsJCS8qIGFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyIGJ1ZmZlciAqLworCXhmc19hZ251bWJlcl90CWFnY291bnQ7CS8qIG51bWJlciBvZiBhZydzIGluIHRoZSBmaWxlc3lzdGVtICovCisJeGZzX2FnbnVtYmVyX3QJYWdubzsJCS8qIGN1cnJlbnQgYWcgbnVtYmVyICovCisJaW50CQlmbGFnczsJCS8qIGFsbG9jIGJ1ZmZlciBsb2NraW5nIGZsYWdzICovCisJeGZzX2V4dGxlbl90CWluZWVkOwkJLyogYmxvY2tzIG5lZWRlZCBmb3IgaW5vZGUgYWxsb2NhdGlvbiAqLworCXhmc19leHRsZW5fdAlsb25nZXN0ID0gMDsJLyogbG9uZ2VzdCBleHRlbnQgYXZhaWxhYmxlICovCisJeGZzX21vdW50X3QJKm1wOwkJLyogbW91bnQgcG9pbnQgc3RydWN0dXJlICovCisJaW50CQluZWVkc3BhY2U7CS8qIGZpbGUgbW9kZSBpbXBsaWVzIHNwYWNlIGFsbG9jYXRlZCAqLworCXhmc19wZXJhZ190CSpwYWc7CQkvKiBwZXIgYWxsb2NhdGlvbiBncm91cCBkYXRhICovCisJeGZzX2FnbnVtYmVyX3QJcGFnbm87CQkvKiBwYXJlbnQgKHN0YXJ0aW5nKSBhZyBudW1iZXIgKi8KKworCS8qCisJICogRmlsZXMgb2YgdGhlc2UgdHlwZXMgbmVlZCBhdCBsZWFzdCBvbmUgYmxvY2sgaWYgbGVuZ3RoID4gMAorCSAqIChhbmQgdGhleSB3b24ndCBmaXQgaW4gdGhlIGlub2RlLCBidXQgdGhhdCdzIGhhcmQgdG8gZmlndXJlIG91dCkuCisJICovCisJbmVlZHNwYWNlID0gU19JU0RJUihtb2RlKSB8fCBTX0lTUkVHKG1vZGUpIHx8IFNfSVNMTksobW9kZSk7CisJbXAgPSB0cC0+dF9tb3VudHA7CisJYWdjb3VudCA9IG1wLT5tX21heGFnaTsKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJcGFnbm8gPSB4ZnNfaWFsbG9jX25leHRfYWcobXApOworCWVsc2UgeworCQlwYWdubyA9IFhGU19JTk9fVE9fQUdOTyhtcCwgcGFyZW50KTsKKwkJaWYgKHBhZ25vID49IGFnY291bnQpCisJCQlwYWdubyA9IDA7CisJfQorCUFTU0VSVChwYWdubyA8IGFnY291bnQpOworCS8qCisJICogTG9vcCB0aHJvdWdoIGFsbG9jYXRpb24gZ3JvdXBzLCBsb29raW5nIGZvciBvbmUgd2l0aCBhIGxpdHRsZQorCSAqIGZyZWUgc3BhY2UgaW4gaXQuICBOb3RlIHdlIGRvbid0IGxvb2sgZm9yIGZyZWUgaW5vZGVzLCBleGFjdGx5LgorCSAqIEluc3RlYWQsIHdlIGluY2x1ZGUgd2hldGhlciB0aGVyZSBpcyBhIG5lZWQgdG8gYWxsb2NhdGUgaW5vZGVzCisJICogdG8gbWVhbiB0aGF0IGJsb2NrcyBtdXN0IGJlIGFsbG9jYXRlZCBmb3IgdGhlbSwKKwkgKiBpZiBub25lIGFyZSBjdXJyZW50bHkgZnJlZS4KKwkgKi8KKwlhZ25vID0gcGFnbm87CisJZmxhZ3MgPSBYRlNfQUxMT0NfRkxBR19UUllMT0NLOworCWRvd25fcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwlmb3IgKDs7KSB7CisJCXBhZyA9ICZtcC0+bV9wZXJhZ1thZ25vXTsKKwkJaWYgKCFwYWctPnBhZ2lfaW5pdCkgeworCQkJaWYgKHhmc19pYWxsb2NfcmVhZF9hZ2kobXAsIHRwLCBhZ25vLCAmYWdicCkpIHsKKwkJCQlhZ2JwID0gTlVMTDsKKwkJCQlnb3RvIG5leHRhZzsKKwkJCX0KKwkJfSBlbHNlCisJCQlhZ2JwID0gTlVMTDsKKworCQlpZiAoIXBhZy0+cGFnaV9pbm9kZW9rKSB7CisJCQl4ZnNfaWFsbG9jX25leHRfYWcobXApOworCQkJZ290byB1bmxvY2tfbmV4dGFnOworCQl9CisKKwkJLyoKKwkJICogSXMgdGhlcmUgZW5vdWdoIGZyZWUgc3BhY2UgZm9yIHRoZSBmaWxlIHBsdXMgYSBibG9jaworCQkgKiBvZiBpbm9kZXMgKGlmIHdlIG5lZWQgdG8gYWxsb2NhdGUgc29tZSk/CisJCSAqLworCQlpbmVlZCA9IHBhZy0+cGFnaV9mcmVlY291bnQgPyAwIDogWEZTX0lBTExPQ19CTE9DS1MobXApOworCQlpZiAoaW5lZWQgJiYgIXBhZy0+cGFnZl9pbml0KSB7CisJCQlpZiAoYWdicCA9PSBOVUxMICYmCisJCQkgICAgeGZzX2lhbGxvY19yZWFkX2FnaShtcCwgdHAsIGFnbm8sICZhZ2JwKSkgeworCQkJCWFnYnAgPSBOVUxMOworCQkJCWdvdG8gbmV4dGFnOworCQkJfQorCQkJKHZvaWQpeGZzX2FsbG9jX3BhZ2ZfaW5pdChtcCwgdHAsIGFnbm8sIGZsYWdzKTsKKwkJfQorCQlpZiAoIWluZWVkIHx8IHBhZy0+cGFnZl9pbml0KSB7CisJCQlpZiAoaW5lZWQgJiYgIShsb25nZXN0ID0gcGFnLT5wYWdmX2xvbmdlc3QpKQorCQkJCWxvbmdlc3QgPSBwYWctPnBhZ2ZfZmxjb3VudCA+IDA7CisJCQlpZiAoIWluZWVkIHx8CisJCQkgICAgKHBhZy0+cGFnZl9mcmVlYmxrcyA+PSBuZWVkc3BhY2UgKyBpbmVlZCAmJgorCQkJICAgICBsb25nZXN0ID49IGluZWVkICYmCisJCQkgICAgIG9rYWxsb2MpKSB7CisJCQkJaWYgKGFnYnAgPT0gTlVMTCAmJgorCQkJCSAgICB4ZnNfaWFsbG9jX3JlYWRfYWdpKG1wLCB0cCwgYWdubywgJmFnYnApKSB7CisJCQkJCWFnYnAgPSBOVUxMOworCQkJCQlnb3RvIG5leHRhZzsKKwkJCQl9CisJCQkJdXBfcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwkJCQlyZXR1cm4gYWdicDsKKwkJCX0KKwkJfQordW5sb2NrX25leHRhZzoKKwkJaWYgKGFnYnApCisJCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBhZ2JwKTsKK25leHRhZzoKKwkJLyoKKwkJICogTm8gcG9pbnQgaW4gaXRlcmF0aW5nIG92ZXIgdGhlIHJlc3QsIGlmIHdlJ3JlIHNodXR0aW5nCisJCSAqIGRvd24uCisJCSAqLworCQlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKKwkJCXVwX3JlYWQoJm1wLT5tX3BlcmFnbG9jayk7CisJCQlyZXR1cm4gKHhmc19idWZfdCAqKTA7CisJCX0KKwkJYWdubysrOworCQlpZiAoYWdubyA+PSBhZ2NvdW50KQorCQkJYWdubyA9IDA7CisJCWlmIChhZ25vID09IHBhZ25vKSB7CisJCQlpZiAoZmxhZ3MgPT0gMCkgeworCQkJCXVwX3JlYWQoJm1wLT5tX3BlcmFnbG9jayk7CisJCQkJcmV0dXJuICh4ZnNfYnVmX3QgKikwOworCQkJfQorCQkJZmxhZ3MgPSAwOworCQl9CisJfQorfQorCisvKgorICogVmlzaWJsZSBpbm9kZSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KKyAqLworCisvKgorICogQWxsb2NhdGUgYW4gaW5vZGUgb24gZGlzay4KKyAqIE1vZGUgaXMgdXNlZCB0byB0ZWxsIHdoZXRoZXIgdGhlIG5ldyBpbm9kZSB3aWxsIG5lZWQgc3BhY2UsIGFuZCB3aGV0aGVyCisgKiBpdCBpcyBhIGRpcmVjdG9yeS4KKyAqCisgKiBUaGUgYXJndW1lbnRzIElPX2FnYnAgYW5kIGFsbG9jX2RvbmUgYXJlIGRlZmluZWQgdG8gd29yayB3aXRoaW4KKyAqIHRoZSBjb25zdHJhaW50IG9mIG9uZSBhbGxvY2F0aW9uIHBlciB0cmFuc2FjdGlvbi4KKyAqIHhmc19kaWFsbG9jKCkgaXMgZGVzaWduZWQgdG8gYmUgY2FsbGVkIHR3aWNlIGlmIGl0IGhhcyB0byBkbyBhbgorICogYWxsb2NhdGlvbiB0byBtYWtlIG1vcmUgZnJlZSBpbm9kZXMuICBPbiB0aGUgZmlyc3QgY2FsbCwKKyAqIElPX2FnYnAgc2hvdWxkIGJlIHNldCB0byBOVUxMLiBJZiBhbiBpbm9kZSBpcyBhdmFpbGFibGUsCisgKiBpLmUuLCB4ZnNfZGlhbGxvYygpIGRpZCBub3QgbmVlZCB0byBkbyBhbiBhbGxvY2F0aW9uLCBhbiBpbm9kZQorICogbnVtYmVyIGlzIHJldHVybmVkLiAgSW4gdGhpcyBjYXNlLCBJT19hZ2JwIHdvdWxkIGJlIHNldCB0byB0aGUKKyAqIGN1cnJlbnQgYWdfYnVmIGFuZCBhbGxvY19kb25lIHNldCB0byBmYWxzZS4KKyAqIElmIGFuIGFsbG9jYXRpb24gbmVlZGVkIHRvIGJlIGRvbmUsIHhmc19kaWFsbG9jIHdvdWxkIHJldHVybgorICogdGhlIGN1cnJlbnQgYWdfYnVmIGluIElPX2FnYnAgYW5kIHNldCBhbGxvY19kb25lIHRvIHRydWUuCisgKiBUaGUgY2FsbGVyIHNob3VsZCB0aGVuIGNvbW1pdCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgYWxsb2NhdGUgYSBuZXcKKyAqIHRyYW5zYWN0aW9uLCBhbmQgY2FsbCB4ZnNfZGlhbGxvYygpIGFnYWluLCBwYXNzaW5nIGluIHRoZSBwcmV2aW91cworICogdmFsdWUgb2YgSU9fYWdicC4gIElPX2FnYnAgc2hvdWxkIGJlIGhlbGQgYWNyb3NzIHRoZSB0cmFuc2FjdGlvbnMuCisgKiBTaW5jZSB0aGUgYWdicCBpcyBsb2NrZWQgYWNyb3NzIHRoZSB0d28gY2FsbHMsIHRoZSBzZWNvbmQgY2FsbCBpcworICogZ3VhcmFudGVlZCB0byBoYXZlIGEgZnJlZSBpbm9kZSBhdmFpbGFibGUuCisgKgorICogT25jZSB3ZSBzdWNjZXNzZnVsbHkgcGljayBhbiBpbm9kZSBpdHMgbnVtYmVyIGlzIHJldHVybmVkIGFuZCB0aGUKKyAqIG9uLWRpc2sgZGF0YSBzdHJ1Y3R1cmVzIGFyZSB1cGRhdGVkLiAgVGhlIGlub2RlIGl0c2VsZiBpcyBub3QgcmVhZAorICogaW4sIHNpbmNlIGRvaW5nIHNvIHdvdWxkIGJyZWFrIG9yZGVyaW5nIGNvbnN0cmFpbnRzIHdpdGggeGZzX3JlY2xhaW0uCisgKi8KK2ludAoreGZzX2RpYWxsb2MoCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9fdAlwYXJlbnQsCQkvKiBwYXJlbnQgaW5vZGUgKGRpcmVjdG9yeSkgKi8KKwltb2RlX3QJCW1vZGUsCQkvKiBtb2RlIGJpdHMgZm9yIG5ldyBpbm9kZSAqLworCWludAkJb2thbGxvYywJLyogb2sgdG8gYWxsb2NhdGUgbW9yZSBzcGFjZSAqLworCXhmc19idWZfdAkqKklPX2FnYnAsCS8qIGluL291dCBhZyBoZWFkZXIncyBidWZmZXIgKi8KKwlib29sZWFuX3QJKmFsbG9jX2RvbmUsCS8qIHRydWUgaWYgd2UgbmVlZGVkIHRvIHJlcGxlbmlzaAorCQkJCQkgICBpbm9kZSBmcmVlbGlzdCAqLworCXhmc19pbm9fdAkqaW5vcCkJCS8qIGlub2RlIG51bWJlciBhbGxvY2F0ZWQgKi8KK3sKKwl4ZnNfYWdudW1iZXJfdAlhZ2NvdW50OwkvKiBudW1iZXIgb2YgYWxsb2NhdGlvbiBncm91cHMgKi8KKwl4ZnNfYnVmX3QJKmFnYnA7CQkvKiBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlcidzIGJ1ZmZlciAqLworCXhmc19hZ251bWJlcl90CWFnbm87CQkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCXhmc19hZ2lfdAkqYWdpOwkJLyogYWxsb2NhdGlvbiBncm91cCBoZWFkZXIgc3RydWN0dXJlICovCisJeGZzX2J0cmVlX2N1cl90CSpjdXI7CQkvKiBpbm9kZSBhbGxvY2F0aW9uIGJ0cmVlIGN1cnNvciAqLworCWludAkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCWk7CQkvKiByZXN1bHQgY29kZSAqLworCWludAkJaWFsbG9jZWQ7CS8qIGlub2RlIGFsbG9jYXRpb24gc3RhdHVzICovCisJaW50CQlub3Jvb20gPSAwOwkvKiBubyBzcGFjZSBmb3IgaW5vZGUgYmxrIGFsbG9jYXRpb24gKi8KKwl4ZnNfaW5vX3QJaW5vOwkJLyogZnMtcmVsYXRpdmUgaW5vZGUgdG8gYmUgcmV0dXJuZWQgKi8KKwkvKiBSRUZFUkVOQ0VEICovCisJaW50CQlqOwkJLyogcmVzdWx0IGNvZGUgKi8KKwl4ZnNfbW91bnRfdAkqbXA7CQkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwlpbnQJCW9mZnNldDsJCS8qIGluZGV4IG9mIGlub2RlIGluIGNodW5rICovCisJeGZzX2FnaW5vX3QJcGFnaW5vOwkJLyogcGFyZW50J3MgYS5nLiByZWxhdGl2ZSBpbm9kZSAjICovCisJeGZzX2FnbnVtYmVyX3QJcGFnbm87CQkvKiBwYXJlbnQncyBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCXhmc19pbm9idF9yZWNfdAlyZWM7CQkvKiBpbm9kZSBhbGxvY2F0aW9uIHJlY29yZCAqLworCXhmc19hZ251bWJlcl90CXRhZ25vOwkJLyogdGVzdGluZyBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCXhmc19idHJlZV9jdXJfdAkqdGN1cjsJCS8qIHRlbXAgY3Vyc29yICovCisJeGZzX2lub2J0X3JlY190CXRyZWM7CQkvKiB0ZW1wIGlub2RlIGFsbG9jYXRpb24gcmVjb3JkICovCisKKworCWlmICgqSU9fYWdicCA9PSBOVUxMKSB7CisJCS8qCisJCSAqIFdlIGRvIG5vdCBoYXZlIGFuIGFnYnAsIHNvIHNlbGVjdCBhbiBpbml0aWFsIGFsbG9jYXRpb24KKwkJICogZ3JvdXAgZm9yIGlub2RlIGFsbG9jYXRpb24uCisJCSAqLworCQlhZ2JwID0geGZzX2lhbGxvY19hZ19zZWxlY3QodHAsIHBhcmVudCwgbW9kZSwgb2thbGxvYyk7CisJCS8qCisJCSAqIENvdWxkbid0IGZpbmQgYW4gYWxsb2NhdGlvbiBncm91cCBzYXRpc2Z5aW5nIHRoZQorCQkgKiBjcml0ZXJpYSwgZ2l2ZSB1cC4KKwkJICovCisJCWlmICghYWdicCkgeworCQkJKmlub3AgPSBOVUxMRlNJTk87CisJCQlyZXR1cm4gMDsKKwkJfQorCQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShhZ2JwKTsKKwkJQVNTRVJUKElOVF9HRVQoYWdpLT5hZ2lfbWFnaWNudW0sIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FHSV9NQUdJQyk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQ29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYgYmVmb3JlLiAgSW4gdGhpcyBjYXNlLCB3ZQorCQkgKiBrbm93IHRoYXQgdGhlIGFsbG9jYXRpb24gZ3JvdXAgaGFzIGZyZWUgaW5vZGVzLgorCQkgKi8KKwkJYWdicCA9ICpJT19hZ2JwOworCQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShhZ2JwKTsKKwkJQVNTRVJUKElOVF9HRVQoYWdpLT5hZ2lfbWFnaWNudW0sIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FHSV9NQUdJQyk7CisJCUFTU0VSVChJTlRfR0VUKGFnaS0+YWdpX2ZyZWVjb3VudCwgQVJDSF9DT05WRVJUKSA+IDApOworCX0KKwltcCA9IHRwLT50X21vdW50cDsKKwlhZ2NvdW50ID0gbXAtPm1fc2Iuc2JfYWdjb3VudDsKKwlhZ25vID0gSU5UX0dFVChhZ2ktPmFnaV9zZXFubywgQVJDSF9DT05WRVJUKTsKKwl0YWdubyA9IGFnbm87CisJcGFnbm8gPSBYRlNfSU5PX1RPX0FHTk8obXAsIHBhcmVudCk7CisJcGFnaW5vID0gWEZTX0lOT19UT19BR0lOTyhtcCwgcGFyZW50KTsKKworCS8qCisJICogSWYgd2UgaGF2ZSBhbHJlYWR5IGhpdCB0aGUgY2VpbGluZyBvZiBpbm9kZSBibG9ja3MgdGhlbiBjbGVhcgorCSAqIG9rYWxsb2Mgc28gd2Ugc2NhbiBhbGwgYXZhaWxhYmxlIGFnaSBzdHJ1Y3R1cmVzIGZvciBhIGZyZWUKKwkgKiBpbm9kZS4KKwkgKi8KKworCWlmIChtcC0+bV9tYXhpY291bnQgJiYKKwkgICAgbXAtPm1fc2Iuc2JfaWNvdW50ICsgWEZTX0lBTExPQ19JTk9ERVMobXApID4gbXAtPm1fbWF4aWNvdW50KSB7CisJCW5vcm9vbSA9IDE7CisJCW9rYWxsb2MgPSAwOworCX0KKworCS8qCisJICogTG9vcCB1bnRpbCB3ZSBmaW5kIGFuIGFsbG9jYXRpb24gZ3JvdXAgdGhhdCBlaXRoZXIgaGFzIGZyZWUgaW5vZGVzCisJICogb3IgaW4gd2hpY2ggd2UgY2FuIGFsbG9jYXRlIHNvbWUgaW5vZGVzLiAgSXRlcmF0ZSB0aHJvdWdoIHRoZQorCSAqIGFsbG9jYXRpb24gZ3JvdXBzIHVwd2FyZCwgd3JhcHBpbmcgYXQgdGhlIGVuZC4KKwkgKi8KKwkqYWxsb2NfZG9uZSA9IEJfRkFMU0U7CisJd2hpbGUgKCFhZ2ktPmFnaV9mcmVlY291bnQpIHsKKwkJLyoKKwkJICogRG9uJ3QgZG8gYW55dGhpbmcgaWYgd2UncmUgbm90IHN1cHBvc2VkIHRvIGFsbG9jYXRlCisJCSAqIGFueSBibG9ja3MsIGp1c3QgZ28gb24gdG8gdGhlIG5leHQgYWcuCisJCSAqLworCQlpZiAob2thbGxvYykgeworCQkJLyoKKwkJCSAqIFRyeSB0byBhbGxvY2F0ZSBzb21lIG5ldyBpbm9kZXMgaW4gdGhlIGFsbG9jYXRpb24KKwkJCSAqIGdyb3VwLgorCQkJICovCisJCQlpZiAoKGVycm9yID0geGZzX2lhbGxvY19hZ19hbGxvYyh0cCwgYWdicCwgJmlhbGxvY2VkKSkpIHsKKwkJCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBhZ2JwKTsKKwkJCQlpZiAoZXJyb3IgPT0gRU5PU1BDKSB7CisJCQkJCSppbm9wID0gTlVMTEZTSU5POworCQkJCQlyZXR1cm4gMDsKKwkJCQl9IGVsc2UKKwkJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQkJaWYgKGlhbGxvY2VkKSB7CisJCQkJLyoKKwkJCQkgKiBXZSBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkIHNvbWUgaW5vZGVzLCByZXR1cm4KKwkJCQkgKiB0aGUgY3VycmVudCBjb250ZXh0IHRvIHRoZSBjYWxsZXIgc28gdGhhdCBpdAorCQkJCSAqIGNhbiBjb21taXQgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gYW5kIGNhbGwKKwkJCQkgKiB1cyBhZ2FpbiB3aGVyZSB3ZSBsZWZ0IG9mZi4KKwkJCQkgKi8KKwkJCQlBU1NFUlQoSU5UX0dFVChhZ2ktPmFnaV9mcmVlY291bnQsIEFSQ0hfQ09OVkVSVCkgPiAwKTsKKwkJCQkqYWxsb2NfZG9uZSA9IEJfVFJVRTsKKwkJCQkqSU9fYWdicCA9IGFnYnA7CisJCQkJKmlub3AgPSBOVUxMRlNJTk87CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJLyoKKwkJICogSWYgaXQgZmFpbGVkLCBnaXZlIHVwIG9uIHRoaXMgYWcuCisJCSAqLworCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBhZ2JwKTsKKwkJLyoKKwkJICogR28gb24gdG8gdGhlIG5leHQgYWc6IGdldCBpdHMgYWcgaGVhZGVyLgorCQkgKi8KK25leHRhZzoKKwkJaWYgKCsrdGFnbm8gPT0gYWdjb3VudCkKKwkJCXRhZ25vID0gMDsKKwkJaWYgKHRhZ25vID09IGFnbm8pIHsKKwkJCSppbm9wID0gTlVMTEZTSU5POworCQkJcmV0dXJuIG5vcm9vbSA/IEVOT1NQQyA6IDA7CisJCX0KKwkJZG93bl9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCQlpZiAobXAtPm1fcGVyYWdbdGFnbm9dLnBhZ2lfaW5vZGVvayA9PSAwKSB7CisJCQl1cF9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCQkJZ290byBuZXh0YWc7CisJCX0KKwkJZXJyb3IgPSB4ZnNfaWFsbG9jX3JlYWRfYWdpKG1wLCB0cCwgdGFnbm8sICZhZ2JwKTsKKwkJdXBfcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBuZXh0YWc7CisJCWFnaSA9IFhGU19CVUZfVE9fQUdJKGFnYnApOworCQlBU1NFUlQoSU5UX0dFVChhZ2ktPmFnaV9tYWdpY251bSwgQVJDSF9DT05WRVJUKSA9PSBYRlNfQUdJX01BR0lDKTsKKwl9CisJLyoKKwkgKiBIZXJlIHdpdGggYW4gYWxsb2NhdGlvbiBncm91cCB0aGF0IGhhcyBhIGZyZWUgaW5vZGUuCisJICogUmVzZXQgYWdubyBzaW5jZSB3ZSBtYXkgaGF2ZSBjaG9zZW4gYSBuZXcgYWcgaW4gdGhlCisJICogbG9vcCBhYm92ZS4KKwkgKi8KKwlhZ25vID0gdGFnbm87CisJKklPX2FnYnAgPSBOVUxMOworCWN1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihtcCwgdHAsIGFnYnAsIElOVF9HRVQoYWdpLT5hZ2lfc2Vxbm8sIEFSQ0hfQ09OVkVSVCksCisJCQkJICAgIFhGU19CVE5VTV9JTk8sICh4ZnNfaW5vZGVfdCAqKTAsIDApOworCS8qCisJICogSWYgcGFnaW5vIGlzIDAgKHRoaXMgaXMgdGhlIHJvb3QgaW5vZGUgYWxsb2NhdGlvbikgdXNlIG5ld2luby4KKwkgKiBUaGlzIG11c3Qgd29yayBiZWNhdXNlIHdlJ3ZlIGp1c3QgYWxsb2NhdGVkIHNvbWUuCisJICovCisJaWYgKCFwYWdpbm8pCisJCXBhZ2lubyA9IElOVF9HRVQoYWdpLT5hZ2lfbmV3aW5vLCBBUkNIX0NPTlZFUlQpOworI2lmZGVmIERFQlVHCisJaWYgKGN1ci0+YmNfbmxldmVscyA9PSAxKSB7CisJCWludAlmcmVlY291bnQgPSAwOworCisJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfbG9va3VwX2dlKGN1ciwgMCwgMCwgMCwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCWRvIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfZ2V0X3JlYyhjdXIsICZyZWMuaXJfc3RhcnRpbm8sCisJCQkJCSZyZWMuaXJfZnJlZWNvdW50LCAmcmVjLmlyX2ZyZWUsICZpKSkpCisJCQkJZ290byBlcnJvcjA7CisJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCQlmcmVlY291bnQgKz0gcmVjLmlyX2ZyZWVjb3VudDsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfaW5jcmVtZW50KGN1ciwgMCwgJmkpKSkKKwkJCQlnb3RvIGVycm9yMDsKKwkJfSB3aGlsZSAoaSA9PSAxKTsKKworCQlBU1NFUlQoZnJlZWNvdW50ID09IElOVF9HRVQoYWdpLT5hZ2lfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQpIHx8CisJCSAgICAgICBYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSk7CisJfQorI2VuZGlmCisJLyoKKwkgKiBJZiBpbiB0aGUgc2FtZSBhLmcuIGFzIHRoZSBwYXJlbnQsIHRyeSB0byBnZXQgbmVhciB0aGUgcGFyZW50LgorCSAqLworCWlmIChwYWdubyA9PSBhZ25vKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfbG9va3VwX2xlKGN1ciwgcGFnaW5vLCAwLCAwLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCWlmIChpICE9IDAgJiYKKwkJICAgIChlcnJvciA9IHhmc19pbm9idF9nZXRfcmVjKGN1ciwgJnJlYy5pcl9zdGFydGlubywKKwkJCSAgICAmcmVjLmlyX2ZyZWVjb3VudCwgJnJlYy5pcl9mcmVlLCAmaikpID09IDAgJiYKKwkJICAgIGogPT0gMSAmJgorCQkgICAgcmVjLmlyX2ZyZWVjb3VudCA+IDApIHsKKwkJCS8qCisJCQkgKiBGb3VuZCBhIGZyZWUgaW5vZGUgaW4gdGhlIHNhbWUgY2h1bmsKKwkJCSAqIGFzIHBhcmVudCwgZG9uZS4KKwkJCSAqLworCQl9CisJCS8qCisJCSAqIEluIHRoZSBzYW1lIGEuZy4gYXMgcGFyZW50LCBidXQgcGFyZW50J3MgY2h1bmsgaXMgZnVsbC4KKwkJICovCisJCWVsc2UgeworCQkJaW50CWRvbmVsZWZ0OwkvKiBkb25lLCB0byB0aGUgbGVmdCAqLworCQkJaW50CWRvbmVyaWdodDsJLyogZG9uZSwgdG8gdGhlIHJpZ2h0ICovCisKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGVycm9yMDsKKwkJCUFTU0VSVChpID09IDEpOworCQkJQVNTRVJUKGogPT0gMSk7CisJCQkvKgorCQkJICogRHVwbGljYXRlIHRoZSBjdXJzb3IsIHNlYXJjaCBsZWZ0ICYgcmlnaHQKKwkJCSAqIHNpbXVsdGFuZW91c2x5LgorCQkJICovCisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2R1cF9jdXJzb3IoY3VyLCAmdGN1cikpKQorCQkJCWdvdG8gZXJyb3IwOworCQkJLyoKKwkJCSAqIFNlYXJjaCBsZWZ0IHdpdGggdGN1ciwgYmFjayB1cCAxIHJlY29yZC4KKwkJCSAqLworCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9kZWNyZW1lbnQodGN1ciwgMCwgJmkpKSkKKwkJCQlnb3RvIGVycm9yMTsKKwkJCWRvbmVsZWZ0ID0gIWk7CisJCQlpZiAoIWRvbmVsZWZ0KSB7CisJCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9nZXRfcmVjKHRjdXIsCisJCQkJCQkmdHJlYy5pcl9zdGFydGlubywKKwkJCQkJCSZ0cmVjLmlyX2ZyZWVjb3VudCwKKwkJCQkJCSZ0cmVjLmlyX2ZyZWUsICZpKSkpCisJCQkJCWdvdG8gZXJyb3IxOworCQkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IxKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBTZWFyY2ggcmlnaHQgd2l0aCBjdXIsIGdvIGZvcndhcmQgMSByZWNvcmQuCisJCQkgKi8KKwkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfaW5jcmVtZW50KGN1ciwgMCwgJmkpKSkKKwkJCQlnb3RvIGVycm9yMTsKKwkJCWRvbmVyaWdodCA9ICFpOworCQkJaWYgKCFkb25lcmlnaHQpIHsKKwkJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2dldF9yZWMoY3VyLAorCQkJCQkJJnJlYy5pcl9zdGFydGlubywKKwkJCQkJCSZyZWMuaXJfZnJlZWNvdW50LAorCQkJCQkJJnJlYy5pcl9mcmVlLCAmaSkpKQorCQkJCQlnb3RvIGVycm9yMTsKKwkJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMSk7CisJCQl9CisJCQkvKgorCQkJICogTG9vcCB1bnRpbCB3ZSBmaW5kIHRoZSBjbG9zZXN0IGlub2RlIGNodW5rCisJCQkgKiB3aXRoIGEgZnJlZSBvbmUuCisJCQkgKi8KKwkJCXdoaWxlICghZG9uZWxlZnQgfHwgIWRvbmVyaWdodCkgeworCQkJCWludAl1c2VsZWZ0OyAgLyogdXNpbmcgbGVmdCBpbm9kZQorCQkJCQkJICAgICBjaHVuayB0aGlzIHRpbWUgKi8KKworCQkJCS8qCisJCQkJICogRmlndXJlIG91dCB3aGljaCBibG9jayBpcyBjbG9zZXIsCisJCQkJICogaWYgYm90aCBhcmUgdmFsaWQuCisJCQkJICovCisJCQkJaWYgKCFkb25lbGVmdCAmJiAhZG9uZXJpZ2h0KQorCQkJCQl1c2VsZWZ0ID0KKwkJCQkJCXBhZ2lubyAtCisJCQkJCQkodHJlYy5pcl9zdGFydGlubyArCisJCQkJCQkgWEZTX0lOT0RFU19QRVJfQ0hVTksgLSAxKSA8CisJCQkJCQkgcmVjLmlyX3N0YXJ0aW5vIC0gcGFnaW5vOworCQkJCWVsc2UKKwkJCQkJdXNlbGVmdCA9ICFkb25lbGVmdDsKKwkJCQkvKgorCQkJCSAqIElmIGNoZWNraW5nIHRoZSBsZWZ0LCBkb2VzIGl0IGhhdmUKKwkJCQkgKiBmcmVlIGlub2Rlcz8KKwkJCQkgKi8KKwkJCQlpZiAodXNlbGVmdCAmJiB0cmVjLmlyX2ZyZWVjb3VudCkgeworCQkJCQkvKgorCQkJCQkgKiBZZXMsIHNldCBpdCB1cCBhcyB0aGUgY2h1bmsgdG8gdXNlLgorCQkJCQkgKi8KKwkJCQkJcmVjID0gdHJlYzsKKwkJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLAorCQkJCQkJWEZTX0JUUkVFX05PRVJST1IpOworCQkJCQljdXIgPSB0Y3VyOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBJZiBjaGVja2luZyB0aGUgcmlnaHQsIGRvZXMgaXQgaGF2ZQorCQkJCSAqIGZyZWUgaW5vZGVzPworCQkJCSAqLworCQkJCWlmICghdXNlbGVmdCAmJiByZWMuaXJfZnJlZWNvdW50KSB7CisJCQkJCS8qCisJCQkJCSAqIFllcywgaXQncyBhbHJlYWR5IHNldCB1cC4KKwkJCQkJICovCisJCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsCisJCQkJCQlYRlNfQlRSRUVfTk9FUlJPUik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIElmIHVzZWQgdGhlIGxlZnQsIGdldCBhbm90aGVyIG9uZQorCQkJCSAqIGZ1cnRoZXIgbGVmdC4KKwkJCQkgKi8KKwkJCQlpZiAodXNlbGVmdCkgeworCQkJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2RlY3JlbWVudCh0Y3VyLCAwLAorCQkJCQkJCSZpKSkpCisJCQkJCQlnb3RvIGVycm9yMTsKKwkJCQkJZG9uZWxlZnQgPSAhaTsKKwkJCQkJaWYgKCFkb25lbGVmdCkgeworCQkJCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9nZXRfcmVjKAorCQkJCQkJCSAgICB0Y3VyLAorCQkJCQkJCSAgICAmdHJlYy5pcl9zdGFydGlubywKKwkJCQkJCQkgICAgJnRyZWMuaXJfZnJlZWNvdW50LAorCQkJCQkJCSAgICAmdHJlYy5pcl9mcmVlLCAmaSkpKQorCQkJCQkJCWdvdG8gZXJyb3IxOworCQkJCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLAorCQkJCQkJCWVycm9yMSk7CisJCQkJCX0KKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBJZiB1c2VkIHRoZSByaWdodCwgZ2V0IGFub3RoZXIgb25lCisJCQkJICogZnVydGhlciByaWdodC4KKwkJCQkgKi8KKwkJCQllbHNlIHsKKwkJCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9pbmNyZW1lbnQoY3VyLCAwLAorCQkJCQkJCSZpKSkpCisJCQkJCQlnb3RvIGVycm9yMTsKKwkJCQkJZG9uZXJpZ2h0ID0gIWk7CisJCQkJCWlmICghZG9uZXJpZ2h0KSB7CisJCQkJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2dldF9yZWMoCisJCQkJCQkJICAgIGN1ciwKKwkJCQkJCQkgICAgJnJlYy5pcl9zdGFydGlubywKKwkJCQkJCQkgICAgJnJlYy5pcl9mcmVlY291bnQsCisJCQkJCQkJICAgICZyZWMuaXJfZnJlZSwgJmkpKSkKKwkJCQkJCQlnb3RvIGVycm9yMTsKKwkJCQkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwKKwkJCQkJCQllcnJvcjEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJQVNTRVJUKCFkb25lbGVmdCB8fCAhZG9uZXJpZ2h0KTsKKwkJfQorCX0KKwkvKgorCSAqIEluIGEgZGlmZmVyZW50IGEuZy4gZnJvbSB0aGUgcGFyZW50LgorCSAqIFNlZSBpZiB0aGUgbW9zdCByZWNlbnRseSBhbGxvY2F0ZWQgYmxvY2sgaGFzIGFueSBmcmVlLgorCSAqLworCWVsc2UgaWYgKElOVF9HRVQoYWdpLT5hZ2lfbmV3aW5vLCBBUkNIX0NPTlZFUlQpICE9IE5VTExBR0lOTykgeworCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2xvb2t1cF9lcShjdXIsCisJCQkJSU5UX0dFVChhZ2ktPmFnaV9uZXdpbm8sIEFSQ0hfQ09OVkVSVCksIDAsIDAsICZpKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJaWYgKGkgPT0gMSAmJgorCQkgICAgKGVycm9yID0geGZzX2lub2J0X2dldF9yZWMoY3VyLCAmcmVjLmlyX3N0YXJ0aW5vLAorCQkJICAgICZyZWMuaXJfZnJlZWNvdW50LCAmcmVjLmlyX2ZyZWUsICZqKSkgPT0gMCAmJgorCQkgICAgaiA9PSAxICYmCisJCSAgICByZWMuaXJfZnJlZWNvdW50ID4gMCkgeworCQkJLyoKKwkJCSAqIFRoZSBsYXN0IGNodW5rIGFsbG9jYXRlZCBpbiB0aGUgZ3JvdXAgc3RpbGwgaGFzCisJCQkgKiBhIGZyZWUgaW5vZGUuCisJCQkgKi8KKwkJfQorCQkvKgorCQkgKiBOb25lIGxlZnQgaW4gdGhlIGxhc3QgZ3JvdXAsIHNlYXJjaCB0aGUgd2hvbGUgYS5nLgorCQkgKi8KKwkJZWxzZSB7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBlcnJvcjA7CisJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2xvb2t1cF9nZShjdXIsIDAsIDAsIDAsICZpKSkpCisJCQkJZ290byBlcnJvcjA7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJCWZvciAoOzspIHsKKwkJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2dldF9yZWMoY3VyLAorCQkJCQkJJnJlYy5pcl9zdGFydGlubywKKwkJCQkJCSZyZWMuaXJfZnJlZWNvdW50LCAmcmVjLmlyX2ZyZWUsCisJCQkJCQkmaSkpKQorCQkJCQlnb3RvIGVycm9yMDsKKwkJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCQkJaWYgKHJlYy5pcl9mcmVlY291bnQgPiAwKQorCQkJCQlicmVhazsKKwkJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2luY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQkJCWdvdG8gZXJyb3IwOworCQkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJCX0KKwkJfQorCX0KKwlvZmZzZXQgPSBYRlNfSUFMTE9DX0ZJTkRfRlJFRSgmcmVjLmlyX2ZyZWUpOworCUFTU0VSVChvZmZzZXQgPj0gMCk7CisJQVNTRVJUKG9mZnNldCA8IFhGU19JTk9ERVNfUEVSX0NIVU5LKTsKKwlBU1NFUlQoKFhGU19BR0lOT19UT19PRkZTRVQobXAsIHJlYy5pcl9zdGFydGlubykgJQorCQkJCSAgIFhGU19JTk9ERVNfUEVSX0NIVU5LKSA9PSAwKTsKKwlpbm8gPSBYRlNfQUdJTk9fVE9fSU5PKG1wLCBhZ25vLCByZWMuaXJfc3RhcnRpbm8gKyBvZmZzZXQpOworCVhGU19JTk9CVF9DTFJfRlJFRSgmcmVjLCBvZmZzZXQpOworCXJlYy5pcl9mcmVlY291bnQtLTsKKwlpZiAoKGVycm9yID0geGZzX2lub2J0X3VwZGF0ZShjdXIsIHJlYy5pcl9zdGFydGlubywgcmVjLmlyX2ZyZWVjb3VudCwKKwkJCXJlYy5pcl9mcmVlKSkpCisJCWdvdG8gZXJyb3IwOworCUlOVF9NT0QoYWdpLT5hZ2lfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQsIC0xKTsKKwl4ZnNfaWFsbG9jX2xvZ19hZ2kodHAsIGFnYnAsIFhGU19BR0lfRlJFRUNPVU5UKTsKKwlkb3duX3JlYWQoJm1wLT5tX3BlcmFnbG9jayk7CisJbXAtPm1fcGVyYWdbdGFnbm9dLnBhZ2lfZnJlZWNvdW50LS07CisJdXBfcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKyNpZmRlZiBERUJVRworCWlmIChjdXItPmJjX25sZXZlbHMgPT0gMSkgeworCQlpbnQJZnJlZWNvdW50ID0gMDsKKworCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2xvb2t1cF9nZShjdXIsIDAsIDAsIDAsICZpKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJZG8geworCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9nZXRfcmVjKGN1ciwgJnJlYy5pcl9zdGFydGlubywKKwkJCQkJJnJlYy5pcl9mcmVlY291bnQsICZyZWMuaXJfZnJlZSwgJmkpKSkKKwkJCQlnb3RvIGVycm9yMDsKKwkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJCWZyZWVjb3VudCArPSByZWMuaXJfZnJlZWNvdW50OworCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9pbmNyZW1lbnQoY3VyLCAwLCAmaSkpKQorCQkJCWdvdG8gZXJyb3IwOworCQl9IHdoaWxlIChpID09IDEpOworCQlBU1NFUlQoZnJlZWNvdW50ID09IElOVF9HRVQoYWdpLT5hZ2lfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQpIHx8CisJCSAgICAgICBYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSk7CisJfQorI2VuZGlmCisJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJeGZzX3RyYW5zX21vZF9zYih0cCwgWEZTX1RSQU5TX1NCX0lGUkVFLCAtMSk7CisJKmlub3AgPSBpbm87CisJcmV0dXJuIDA7CitlcnJvcjE6CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX0VSUk9SKTsKK2Vycm9yMDoKKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjdXIsIFhGU19CVFJFRV9FUlJPUik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogRnJlZSBkaXNrIGlub2RlLiAgQ2FyZWZ1bGx5IGF2b2lkcyB0b3VjaGluZyB0aGUgaW5jb3JlIGlub2RlLCBhbGwKKyAqIG1hbmlwdWxhdGlvbnMgaW5jb3JlIGFyZSB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkuCisgKiBUaGUgb24tZGlzayBpbm9kZSBpcyBub3QgY2hhbmdlZCBieSB0aGlzIG9wZXJhdGlvbiwgb25seSB0aGUKKyAqIGJ0cmVlIChmcmVlIGlub2RlIG1hc2spIGlzIGNoYW5nZWQuCisgKi8KK2ludAoreGZzX2RpZnJlZSgKKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub190CWlub2RlLAkJLyogaW5vZGUgdG8gYmUgZnJlZWQgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJKmZsaXN0LAkJLyogZXh0ZW50cyB0byBmcmVlICovCisJaW50CQkqZGVsZXRlLAkvKiBzZXQgaWYgaW5vZGUgY2x1c3RlciB3YXMgZGVsZXRlZCAqLworCXhmc19pbm9fdAkqZmlyc3RfaW5vKQkvKiBmaXJzdCBpbm9kZSBpbiBkZWxldGVkIGNsdXN0ZXIgKi8KK3sKKwkvKiBSRUZFUkVOQ0VEICovCisJeGZzX2FnYmxvY2tfdAlhZ2JubzsJLyogYmxvY2sgbnVtYmVyIGNvbnRhaW5pbmcgaW5vZGUgKi8KKwl4ZnNfYnVmX3QJKmFnYnA7CS8qIGJ1ZmZlciBjb250YWluaW5nIGFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyICovCisJeGZzX2FnaW5vX3QJYWdpbm87CS8qIGlub2RlIG51bWJlciByZWxhdGl2ZSB0byBhbGxvY2F0aW9uIGdyb3VwICovCisJeGZzX2FnbnVtYmVyX3QJYWdubzsJLyogYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwl4ZnNfYWdpX3QJKmFnaTsJLyogYWxsb2NhdGlvbiBncm91cCBoZWFkZXIgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJKmN1cjsJLyogaW5vZGUgYnRyZWUgY3Vyc29yICovCisJaW50CQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQlpOwkvKiByZXN1bHQgY29kZSAqLworCWludAkJaWxlbjsJLyogaW5vZGVzIGluIGFuIGlub2RlIGNsdXN0ZXIgKi8KKwl4ZnNfbW91bnRfdAkqbXA7CS8qIG1vdW50IHN0cnVjdHVyZSBmb3IgZmlsZXN5c3RlbSAqLworCWludAkJb2ZmOwkvKiBvZmZzZXQgb2YgaW5vZGUgaW4gaW5vZGUgY2h1bmsgKi8KKwl4ZnNfaW5vYnRfcmVjX3QJcmVjOwkvKiBidHJlZSByZWNvcmQgKi8KKworCW1wID0gdHAtPnRfbW91bnRwOworCisJLyoKKwkgKiBCcmVhayB1cCBpbm9kZSBudW1iZXIgaW50byBpdHMgY29tcG9uZW50cy4KKwkgKi8KKwlhZ25vID0gWEZTX0lOT19UT19BR05PKG1wLCBpbm9kZSk7CisJaWYgKGFnbm8gPj0gbXAtPm1fc2Iuc2JfYWdjb3VudCkgIHsKKwkJY21uX2VycihDRV9XQVJOLAorCQkJInhmc19kaWZyZWU6IGFnbm8gPj0gbXAtPm1fc2Iuc2JfYWdjb3VudCAoJWQgPj0gJWQpIG9uICVzLiAgUmV0dXJuaW5nIEVJTlZBTC4iLAorCQkJYWdubywgbXAtPm1fc2Iuc2JfYWdjb3VudCwgbXAtPm1fZnNuYW1lKTsKKwkJQVNTRVJUKDApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJfQorCWFnaW5vID0gWEZTX0lOT19UT19BR0lOTyhtcCwgaW5vZGUpOworCWlmIChpbm9kZSAhPSBYRlNfQUdJTk9fVE9fSU5PKG1wLCBhZ25vLCBhZ2lubykpICB7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJCSJ4ZnNfZGlmcmVlOiBpbm9kZSAhPSBYRlNfQUdJTk9fVE9fSU5PKCkgKCVkICE9ICVkKSBvbiAlcy4gIFJldHVybmluZyBFSU5WQUwuIiwKKwkJCWlub2RlLCBYRlNfQUdJTk9fVE9fSU5PKG1wLCBhZ25vLCBhZ2lubyksIG1wLT5tX2ZzbmFtZSk7CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKwlhZ2JubyA9IFhGU19BR0lOT19UT19BR0JOTyhtcCwgYWdpbm8pOworCWlmIChhZ2JubyA+PSBtcC0+bV9zYi5zYl9hZ2Jsb2NrcykgIHsKKwkJY21uX2VycihDRV9XQVJOLAorCQkJInhmc19kaWZyZWU6IGFnYm5vID49IG1wLT5tX3NiLnNiX2FnYmxvY2tzICglZCA+PSAlZCkgb24gJXMuICBSZXR1cm5pbmcgRUlOVkFMLiIsCisJCQlhZ2JubywgbXAtPm1fc2Iuc2JfYWdibG9ja3MsIG1wLT5tX2ZzbmFtZSk7CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKwkvKgorCSAqIEdldCB0aGUgYWxsb2NhdGlvbiBncm91cCBoZWFkZXIuCisJICovCisJZG93bl9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCWVycm9yID0geGZzX2lhbGxvY19yZWFkX2FnaShtcCwgdHAsIGFnbm8sICZhZ2JwKTsKKwl1cF9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCWlmIChlcnJvcikgeworCQljbW5fZXJyKENFX1dBUk4sCisJCQkieGZzX2RpZnJlZTogeGZzX2lhbGxvY19yZWFkX2FnaSgpIHJldHVybmVkIGFuIGVycm9yICVkIG9uICVzLiAgUmV0dXJuaW5nIGVycm9yLiIsCisJCQllcnJvciwgbXAtPm1fZnNuYW1lKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlhZ2kgPSBYRlNfQlVGX1RPX0FHSShhZ2JwKTsKKwlBU1NFUlQoSU5UX0dFVChhZ2ktPmFnaV9tYWdpY251bSwgQVJDSF9DT05WRVJUKSA9PSBYRlNfQUdJX01BR0lDKTsKKwlBU1NFUlQoYWdibm8gPCBJTlRfR0VUKGFnaS0+YWdpX2xlbmd0aCwgQVJDSF9DT05WRVJUKSk7CisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBjdXJzb3IuCisJICovCisJY3VyID0geGZzX2J0cmVlX2luaXRfY3Vyc29yKG1wLCB0cCwgYWdicCwgYWdubywgWEZTX0JUTlVNX0lOTywKKwkJKHhmc19pbm9kZV90ICopMCwgMCk7CisjaWZkZWYgREVCVUcKKwlpZiAoY3VyLT5iY19ubGV2ZWxzID09IDEpIHsKKwkJaW50IGZyZWVjb3VudCA9IDA7CisKKwkJaWYgKChlcnJvciA9IHhmc19pbm9idF9sb29rdXBfZ2UoY3VyLCAwLCAwLCAwLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCWRvIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfZ2V0X3JlYyhjdXIsICZyZWMuaXJfc3RhcnRpbm8sCisJCQkJCSZyZWMuaXJfZnJlZWNvdW50LCAmcmVjLmlyX2ZyZWUsICZpKSkpCisJCQkJZ290byBlcnJvcjA7CisJCQlpZiAoaSkgeworCQkJCWZyZWVjb3VudCArPSByZWMuaXJfZnJlZWNvdW50OworCQkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfaW5jcmVtZW50KGN1ciwgMCwgJmkpKSkKKwkJCQkJZ290byBlcnJvcjA7CisJCQl9CisJCX0gd2hpbGUgKGkgPT0gMSk7CisJCUFTU0VSVChmcmVlY291bnQgPT0gSU5UX0dFVChhZ2ktPmFnaV9mcmVlY291bnQsIEFSQ0hfQ09OVkVSVCkgfHwKKwkJICAgICAgIFhGU19GT1JDRURfU0hVVERPV04obXApKTsKKwl9CisjZW5kaWYKKwkvKgorCSAqIExvb2sgZm9yIHRoZSBlbnRyeSBkZXNjcmliaW5nIHRoaXMgaW5vZGUuCisJICovCisJaWYgKChlcnJvciA9IHhmc19pbm9idF9sb29rdXBfbGUoY3VyLCBhZ2lubywgMCwgMCwgJmkpKSkgeworCQljbW5fZXJyKENFX1dBUk4sCisJCQkieGZzX2RpZnJlZTogeGZzX2lub2J0X2xvb2t1cF9sZSByZXR1cm5lZCgpICBhbiBlcnJvciAlZCBvbiAlcy4gIFJldHVybmluZyBlcnJvci4iLAorCQkJZXJyb3IsIG1wLT5tX2ZzbmFtZSk7CisJCWdvdG8gZXJyb3IwOworCX0KKwlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJaWYgKChlcnJvciA9IHhmc19pbm9idF9nZXRfcmVjKGN1ciwgJnJlYy5pcl9zdGFydGlubywgJnJlYy5pcl9mcmVlY291bnQsCisJCQkmcmVjLmlyX2ZyZWUsICZpKSkpIHsKKwkJY21uX2VycihDRV9XQVJOLAorCQkJInhmc19kaWZyZWU6IHhmc19pbm9idF9nZXRfcmVjKCkgIHJldHVybmVkIGFuIGVycm9yICVkIG9uICVzLiAgUmV0dXJuaW5nIGVycm9yLiIsCisJCQllcnJvciwgbXAtPm1fZnNuYW1lKTsKKwkJZ290byBlcnJvcjA7CisJfQorCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkvKgorCSAqIEdldCB0aGUgb2Zmc2V0IGluIHRoZSBpbm9kZSBjaHVuay4KKwkgKi8KKwlvZmYgPSBhZ2lubyAtIHJlYy5pcl9zdGFydGlubzsKKwlBU1NFUlQob2ZmID49IDAgJiYgb2ZmIDwgWEZTX0lOT0RFU19QRVJfQ0hVTkspOworCUFTU0VSVCghWEZTX0lOT0JUX0lTX0ZSRUUoJnJlYywgb2ZmKSk7CisJLyoKKwkgKiBNYXJrIHRoZSBpbm9kZSBmcmVlICYgaW5jcmVtZW50IHRoZSBjb3VudC4KKwkgKi8KKwlYRlNfSU5PQlRfU0VUX0ZSRUUoJnJlYywgb2ZmKTsKKwlyZWMuaXJfZnJlZWNvdW50Kys7CisKKwkvKgorCSAqIFdoZW4gYW4gaW5vZGUgY2x1c3RlciBpcyBmcmVlLCBpdCBiZWNvbWVzIGVsZ2libGUgZm9yIHJlbW92YWwKKwkgKi8KKwlpZiAoKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0lERUxFVEUpICYmCisJICAgIChyZWMuaXJfZnJlZWNvdW50ID09IFhGU19JQUxMT0NfSU5PREVTKG1wKSkpIHsKKworCQkqZGVsZXRlID0gMTsKKwkJKmZpcnN0X2lubyA9IFhGU19BR0lOT19UT19JTk8obXAsIGFnbm8sIHJlYy5pcl9zdGFydGlubyk7CisKKwkJLyoKKwkJICogUmVtb3ZlIHRoZSBpbm9kZSBjbHVzdGVyIGZyb20gdGhlIEFHSSBCK1RyZWUsIGFkanVzdCB0aGUKKwkJICogQUdJIGFuZCBTdXBlcmJsb2NrIGlub2RlIGNvdW50cywgYW5kIG1hcmsgdGhlIGRpc2sgc3BhY2UKKwkJICogdG8gYmUgZnJlZWQgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkLgorCQkgKi8KKwkJaWxlbiA9IFhGU19JQUxMT0NfSU5PREVTKG1wKTsKKwkJSU5UX01PRChhZ2ktPmFnaV9jb3VudCwgQVJDSF9DT05WRVJULCAtaWxlbik7CisJCUlOVF9NT0QoYWdpLT5hZ2lfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQsIC0oaWxlbiAtIDEpKTsKKwkJeGZzX2lhbGxvY19sb2dfYWdpKHRwLCBhZ2JwLCBYRlNfQUdJX0NPVU5UIHwgWEZTX0FHSV9GUkVFQ09VTlQpOworCQlkb3duX3JlYWQoJm1wLT5tX3BlcmFnbG9jayk7CisJCW1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2lfZnJlZWNvdW50IC09IGlsZW4gLSAxOworCQl1cF9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCQl4ZnNfdHJhbnNfbW9kX3NiKHRwLCBYRlNfVFJBTlNfU0JfSUNPVU5ULCAtaWxlbik7CisJCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9JRlJFRSwgLShpbGVuIC0gMSkpOworCisJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfZGVsZXRlKGN1ciwgJmkpKSkgeworCQkJY21uX2VycihDRV9XQVJOLCAieGZzX2RpZnJlZTogeGZzX2lub2J0X2RlbGV0ZSByZXR1cm5lZCBhbiBlcnJvciAlZCBvbiAlcy5cbiIsCisJCQkJZXJyb3IsIG1wLT5tX2ZzbmFtZSk7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCisJCXhmc19ibWFwX2FkZF9mcmVlKFhGU19BR0JfVE9fRlNCKG1wLAorCQkJCWFnbm8sIFhGU19JTk9fVE9fQUdCTk8obXAscmVjLmlyX3N0YXJ0aW5vKSksCisJCQkJWEZTX0lBTExPQ19CTE9DS1MobXApLCBmbGlzdCwgbXApOworCX0gZWxzZSB7CisJCSpkZWxldGUgPSAwOworCisJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfdXBkYXRlKGN1ciwgcmVjLmlyX3N0YXJ0aW5vLCByZWMuaXJfZnJlZWNvdW50LCByZWMuaXJfZnJlZSkpKSB7CisJCQljbW5fZXJyKENFX1dBUk4sCisJCQkJInhmc19kaWZyZWU6IHhmc19pbm9idF91cGRhdGUoKSAgcmV0dXJuZWQgYW4gZXJyb3IgJWQgb24gJXMuICBSZXR1cm5pbmcgZXJyb3IuIiwKKwkJCQllcnJvciwgbXAtPm1fZnNuYW1lKTsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJCS8qIAorCQkgKiBDaGFuZ2UgdGhlIGlub2RlIGZyZWUgY291bnRzIGFuZCBsb2cgdGhlIGFnL3NiIGNoYW5nZXMuCisJCSAqLworCQlJTlRfTU9EKGFnaS0+YWdpX2ZyZWVjb3VudCwgQVJDSF9DT05WRVJULCAxKTsKKwkJeGZzX2lhbGxvY19sb2dfYWdpKHRwLCBhZ2JwLCBYRlNfQUdJX0ZSRUVDT1VOVCk7CisJCWRvd25fcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwkJbXAtPm1fcGVyYWdbYWdub10ucGFnaV9mcmVlY291bnQrKzsKKwkJdXBfcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwkJeGZzX3RyYW5zX21vZF9zYih0cCwgWEZTX1RSQU5TX1NCX0lGUkVFLCAxKTsKKwl9CisKKyNpZmRlZiBERUJVRworCWlmIChjdXItPmJjX25sZXZlbHMgPT0gMSkgeworCQlpbnQgZnJlZWNvdW50ID0gMDsKKworCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2xvb2t1cF9nZShjdXIsIDAsIDAsIDAsICZpKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJZG8geworCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9nZXRfcmVjKGN1ciwKKwkJCQkJJnJlYy5pcl9zdGFydGlubywKKwkJCQkJJnJlYy5pcl9mcmVlY291bnQsCisJCQkJCSZyZWMuaXJfZnJlZSwgJmkpKSkKKwkJCQlnb3RvIGVycm9yMDsKKwkJCWlmIChpKSB7CisJCQkJZnJlZWNvdW50ICs9IHJlYy5pcl9mcmVlY291bnQ7CisJCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9pbmNyZW1lbnQoY3VyLCAwLCAmaSkpKQorCQkJCQlnb3RvIGVycm9yMDsKKwkJCX0KKwkJfSB3aGlsZSAoaSA9PSAxKTsKKwkJQVNTRVJUKGZyZWVjb3VudCA9PSBJTlRfR0VUKGFnaS0+YWdpX2ZyZWVjb3VudCwgQVJDSF9DT05WRVJUKSB8fAorCQkgICAgICAgWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpOworCX0KKyNlbmRpZgorCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCXJldHVybiAwOworCitlcnJvcjA6CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLCBYRlNfQlRSRUVfRVJST1IpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIGlub2RlIGluIGJuby9vZmYsIGZvciBtYXBwaW5nIGl0IGludG8gYSBidWZmZXIuCisgKi8KKy8qQVJHU1VTRUQqLworaW50Cit4ZnNfZGlsb2NhdGUoCisJeGZzX21vdW50X3QJKm1wLAkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vX3QJaW5vLAkvKiBpbm9kZSB0byBsb2NhdGUgKi8KKwl4ZnNfZnNibG9ja190CSpibm8sCS8qIG91dHB1dDogYmxvY2sgY29udGFpbmluZyBpbm9kZSAqLworCWludAkJKmxlbiwJLyogb3V0cHV0OiBudW0gYmxvY2tzIGluIGlub2RlIGNsdXN0ZXIgKi8KKwlpbnQJCSpvZmYsCS8qIG91dHB1dDogaW5kZXggaW4gYmxvY2sgb2YgaW5vZGUgKi8KKwl1aW50CQlmbGFncykJLyogZmxhZ3MgY29uY2VybmluZyBpbm9kZSBsb29rdXAgKi8KK3sKKwl4ZnNfYWdibG9ja190CWFnYm5vOwkvKiBibG9jayBudW1iZXIgb2YgaW5vZGUgaW4gdGhlIGFsbG9jIGdyb3VwICovCisJeGZzX2J1Zl90CSphZ2JwOwkvKiBhZ2kgYnVmZmVyICovCisJeGZzX2FnaW5vX3QJYWdpbm87CS8qIGlub2RlIG51bWJlciB3aXRoaW4gYWxsb2MgZ3JvdXAgKi8KKwl4ZnNfYWdudW1iZXJfdAlhZ25vOwkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCWludAkJYmxrc19wZXJfY2x1c3RlcjsgLyogbnVtIGJsb2NrcyBwZXIgaW5vZGUgY2x1c3RlciAqLworCXhmc19hZ2Jsb2NrX3QJY2h1bmtfYWdibm87CS8qIGZpcnN0IGJsb2NrIGluIGlub2RlIGNodW5rICovCisJeGZzX2FnaW5vX3QJY2h1bmtfYWdpbm87CS8qIGZpcnN0IGFnaW5vIGluIGlub2RlIGNodW5rICovCisJX19pbnQzMl90CWNodW5rX2NudDsJLyogY291bnQgb2YgZnJlZSBpbm9kZXMgaW4gY2h1bmsgKi8KKwl4ZnNfaW5vZnJlZV90CWNodW5rX2ZyZWU7CS8qIG1hc2sgb2YgZnJlZSBpbm9kZXMgaW4gY2h1bmsgKi8KKwl4ZnNfYWdibG9ja190CWNsdXN0ZXJfYWdibm87CS8qIGZpcnN0IGJsb2NrIGluIGlub2RlIGNsdXN0ZXIgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJKmN1cjsJLyogaW5vZGUgYnRyZWUgY3Vyc29yICovCisJaW50CQllcnJvcjsJLyogZXJyb3IgY29kZSAqLworCWludAkJaTsJLyogdGVtcCBzdGF0ZSAqLworCWludAkJb2Zmc2V0OwkvKiBpbmRleCBvZiBpbm9kZSBpbiBpdHMgYnVmZmVyICovCisJaW50CQlvZmZzZXRfYWdibm87CS8qIGJsa3MgZnJvbSBjaHVuayBzdGFydCB0byBpbm9kZSAqLworCisJQVNTRVJUKGlubyAhPSBOVUxMRlNJTk8pOworCS8qCisJICogU3BsaXQgdXAgdGhlIGlub2RlIG51bWJlciBpbnRvIGl0cyBwYXJ0cy4KKwkgKi8KKwlhZ25vID0gWEZTX0lOT19UT19BR05PKG1wLCBpbm8pOworCWFnaW5vID0gWEZTX0lOT19UT19BR0lOTyhtcCwgaW5vKTsKKwlhZ2JubyA9IFhGU19BR0lOT19UT19BR0JOTyhtcCwgYWdpbm8pOworCWlmIChhZ25vID49IG1wLT5tX3NiLnNiX2FnY291bnQgfHwgYWdibm8gPj0gbXAtPm1fc2Iuc2JfYWdibG9ja3MgfHwKKwkgICAgaW5vICE9IFhGU19BR0lOT19UT19JTk8obXAsIGFnbm8sIGFnaW5vKSkgeworI2lmZGVmIERFQlVHCisJCWlmIChhZ25vID49IG1wLT5tX3NiLnNiX2FnY291bnQpIHsKKwkJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwKKwkJCQkJInhmc19kaWxvY2F0ZTogYWdubyAoJWQpID49ICIKKwkJCQkJIm1wLT5tX3NiLnNiX2FnY291bnQgKCVkKSIsCisJCQkJCWFnbm8sICBtcC0+bV9zYi5zYl9hZ2NvdW50KTsKKwkJfQorCQlpZiAoYWdibm8gPj0gbXAtPm1fc2Iuc2JfYWdibG9ja3MpIHsKKwkJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwKKwkJCQkJInhmc19kaWxvY2F0ZTogYWdibm8gKDB4JWxseCkgPj0gIgorCQkJCQkibXAtPm1fc2Iuc2JfYWdibG9ja3MgKDB4JWx4KSIsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGFnYm5vLAorCQkJCQkodW5zaWduZWQgbG9uZykgbXAtPm1fc2Iuc2JfYWdibG9ja3MpOworCQl9CisJCWlmIChpbm8gIT0gWEZTX0FHSU5PX1RPX0lOTyhtcCwgYWdubywgYWdpbm8pKSB7CisJCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCisJCQkJCSJ4ZnNfZGlsb2NhdGU6IGlubyAoMHglbGx4KSAhPSAiCisJCQkJCSJYRlNfQUdJTk9fVE9fSU5PKG1wLCBhZ25vLCBhZ2lubykgIgorCQkJCQkiKDB4JWxseCkiLAorCQkJCQlpbm8sIFhGU19BR0lOT19UT19JTk8obXAsIGFnbm8sIGFnaW5vKSk7CisJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJfQorCWlmICgobXAtPm1fc2Iuc2JfYmxvY2tzaXplID49IFhGU19JTk9ERV9DTFVTVEVSX1NJWkUobXApKSB8fAorCSAgICAhKGZsYWdzICYgWEZTX0lNQVBfTE9PS1VQKSkgeworCQlvZmZzZXQgPSBYRlNfSU5PX1RPX09GRlNFVChtcCwgaW5vKTsKKwkJQVNTRVJUKG9mZnNldCA8IG1wLT5tX3NiLnNiX2lub3BibG9jayk7CisJCSpibm8gPSBYRlNfQUdCX1RPX0ZTQihtcCwgYWdubywgYWdibm8pOworCQkqb2ZmID0gb2Zmc2V0OworCQkqbGVuID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCWJsa3NfcGVyX2NsdXN0ZXIgPSBYRlNfSU5PREVfQ0xVU1RFUl9TSVpFKG1wKSA+PiBtcC0+bV9zYi5zYl9ibG9ja2xvZzsKKwlpZiAoKmJubyAhPSBOVUxMRlNCTE9DSykgeworCQlvZmZzZXQgPSBYRlNfSU5PX1RPX09GRlNFVChtcCwgaW5vKTsKKwkJQVNTRVJUKG9mZnNldCA8IG1wLT5tX3NiLnNiX2lub3BibG9jayk7CisJCWNsdXN0ZXJfYWdibm8gPSBYRlNfRlNCX1RPX0FHQk5PKG1wLCAqYm5vKTsKKwkJKm9mZiA9ICgoYWdibm8gLSBjbHVzdGVyX2FnYm5vKSAqIG1wLT5tX3NiLnNiX2lub3BibG9jaykgKworCQkJb2Zmc2V0OworCQkqbGVuID0gYmxrc19wZXJfY2x1c3RlcjsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChtcC0+bV9pbm9hbGlnbl9tYXNrKSB7CisJCW9mZnNldF9hZ2JubyA9IGFnYm5vICYgbXAtPm1faW5vYWxpZ25fbWFzazsKKwkJY2h1bmtfYWdibm8gPSBhZ2JubyAtIG9mZnNldF9hZ2JubzsKKwl9IGVsc2UgeworCQlkb3duX3JlYWQoJm1wLT5tX3BlcmFnbG9jayk7CisJCWVycm9yID0geGZzX2lhbGxvY19yZWFkX2FnaShtcCwgdHAsIGFnbm8sICZhZ2JwKTsKKwkJdXBfcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwkJaWYgKGVycm9yKSB7CisjaWZkZWYgREVCVUcKKwkJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwgInhmc19kaWxvY2F0ZTogIgorCQkJCQkieGZzX2lhbGxvY19yZWFkX2FnaSgpIHJldHVybmVkICIKKwkJCQkJImVycm9yICVkLCBhZ25vICVkIiwKKwkJCQkJZXJyb3IsIGFnbm8pOworI2VuZGlmIC8qIERFQlVHICovCisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJY3VyID0geGZzX2J0cmVlX2luaXRfY3Vyc29yKG1wLCB0cCwgYWdicCwgYWdubywgWEZTX0JUTlVNX0lOTywKKwkJCSh4ZnNfaW5vZGVfdCAqKTAsIDApOworCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2xvb2t1cF9sZShjdXIsIGFnaW5vLCAwLCAwLCAmaSkpKSB7CisjaWZkZWYgREVCVUcKKwkJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwgInhmc19kaWxvY2F0ZTogIgorCQkJCQkieGZzX2lub2J0X2xvb2t1cF9sZSgpIGZhaWxlZCIpOworI2VuZGlmIC8qIERFQlVHICovCisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2dldF9yZWMoY3VyLCAmY2h1bmtfYWdpbm8sICZjaHVua19jbnQsCisJCQkJJmNodW5rX2ZyZWUsICZpKSkpIHsKKyNpZmRlZiBERUJVRworCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLCAieGZzX2RpbG9jYXRlOiAiCisJCQkJCSJ4ZnNfaW5vYnRfZ2V0X3JlYygpIGZhaWxlZCIpOworI2VuZGlmIC8qIERFQlVHICovCisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQlpZiAoaSA9PSAwKSB7CisjaWZkZWYgREVCVUcKKwkJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwgInhmc19kaWxvY2F0ZTogIgorCQkJCQkieGZzX2lub2J0X2dldF9yZWMoKSBmYWlsZWQiKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCQkJZXJyb3IgPSBYRlNfRVJST1IoRUlOVkFMKTsKKwkJfQorCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBhZ2JwKTsKKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwkJY2h1bmtfYWdibm8gPSBYRlNfQUdJTk9fVE9fQUdCTk8obXAsIGNodW5rX2FnaW5vKTsKKwkJb2Zmc2V0X2FnYm5vID0gYWdibm8gLSBjaHVua19hZ2JubzsKKwl9CisJQVNTRVJUKGFnYm5vID49IGNodW5rX2FnYm5vKTsKKwljbHVzdGVyX2FnYm5vID0gY2h1bmtfYWdibm8gKworCQkoKG9mZnNldF9hZ2JubyAvIGJsa3NfcGVyX2NsdXN0ZXIpICogYmxrc19wZXJfY2x1c3Rlcik7CisJb2Zmc2V0ID0gKChhZ2JubyAtIGNsdXN0ZXJfYWdibm8pICogbXAtPm1fc2Iuc2JfaW5vcGJsb2NrKSArCisJCVhGU19JTk9fVE9fT0ZGU0VUKG1wLCBpbm8pOworCSpibm8gPSBYRlNfQUdCX1RPX0ZTQihtcCwgYWdubywgY2x1c3Rlcl9hZ2Jubyk7CisJKm9mZiA9IG9mZnNldDsKKwkqbGVuID0gYmxrc19wZXJfY2x1c3RlcjsKKwlyZXR1cm4gMDsKK2Vycm9yMDoKKwl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBhZ2JwKTsKKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjdXIsIFhGU19CVFJFRV9FUlJPUik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogQ29tcHV0ZSBhbmQgZmlsbCBpbiB2YWx1ZSBvZiBtX2luX21heGxldmVscy4KKyAqLwordm9pZAoreGZzX2lhbGxvY19jb21wdXRlX21heGxldmVscygKKwl4ZnNfbW91bnRfdAkqbXApCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KK3sKKwlpbnQJCWxldmVsOworCXVpbnQJCW1heGJsb2NrczsKKwl1aW50CQltYXhsZWFmZW50czsKKwlpbnQJCW1pbmxlYWZyZWNzOworCWludAkJbWlubm9kZXJlY3M7CisKKwltYXhsZWFmZW50cyA9ICgxTEwgPDwgWEZTX0lOT19BR0lOT19CSVRTKG1wKSkgPj4KKwkJWEZTX0lOT0RFU19QRVJfQ0hVTktfTE9HOworCW1pbmxlYWZyZWNzID0gbXAtPm1fYWxsb2NfbW5yWzBdOworCW1pbm5vZGVyZWNzID0gbXAtPm1fYWxsb2NfbW5yWzFdOworCW1heGJsb2NrcyA9IChtYXhsZWFmZW50cyArIG1pbmxlYWZyZWNzIC0gMSkgLyBtaW5sZWFmcmVjczsKKwlmb3IgKGxldmVsID0gMTsgbWF4YmxvY2tzID4gMTsgbGV2ZWwrKykKKwkJbWF4YmxvY2tzID0gKG1heGJsb2NrcyArIG1pbm5vZGVyZWNzIC0gMSkgLyBtaW5ub2RlcmVjczsKKwltcC0+bV9pbl9tYXhsZXZlbHMgPSBsZXZlbDsKK30KKworLyoKKyAqIExvZyBzcGVjaWZpZWQgZmllbGRzIGZvciB0aGUgYWcgaGRyIChpbm9kZSBzZWN0aW9uKQorICovCit2b2lkCit4ZnNfaWFsbG9jX2xvZ19hZ2koCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19idWZfdAkqYnAsCQkvKiBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciBidWZmZXIgKi8KKwlpbnQJCWZpZWxkcykJCS8qIGJpdG1hc2sgb2YgZmllbGRzIHRvIGxvZyAqLworeworCWludAkJCWZpcnN0OwkJLyogZmlyc3QgYnl0ZSBudW1iZXIgKi8KKwlpbnQJCQlsYXN0OwkJLyogbGFzdCBieXRlIG51bWJlciAqLworCXN0YXRpYyBjb25zdCBzaG9ydAlvZmZzZXRzW10gPSB7CS8qIGZpZWxkIHN0YXJ0aW5nIG9mZnNldHMgKi8KKwkJCQkJLyoga2VlcCBpbiBzeW5jIHdpdGggYml0IGRlZmluaXRpb25zICovCisJCW9mZnNldG9mKHhmc19hZ2lfdCwgYWdpX21hZ2ljbnVtKSwKKwkJb2Zmc2V0b2YoeGZzX2FnaV90LCBhZ2lfdmVyc2lvbm51bSksCisJCW9mZnNldG9mKHhmc19hZ2lfdCwgYWdpX3NlcW5vKSwKKwkJb2Zmc2V0b2YoeGZzX2FnaV90LCBhZ2lfbGVuZ3RoKSwKKwkJb2Zmc2V0b2YoeGZzX2FnaV90LCBhZ2lfY291bnQpLAorCQlvZmZzZXRvZih4ZnNfYWdpX3QsIGFnaV9yb290KSwKKwkJb2Zmc2V0b2YoeGZzX2FnaV90LCBhZ2lfbGV2ZWwpLAorCQlvZmZzZXRvZih4ZnNfYWdpX3QsIGFnaV9mcmVlY291bnQpLAorCQlvZmZzZXRvZih4ZnNfYWdpX3QsIGFnaV9uZXdpbm8pLAorCQlvZmZzZXRvZih4ZnNfYWdpX3QsIGFnaV9kaXJpbm8pLAorCQlvZmZzZXRvZih4ZnNfYWdpX3QsIGFnaV91bmxpbmtlZCksCisJCXNpemVvZih4ZnNfYWdpX3QpCisJfTsKKyNpZmRlZiBERUJVRworCXhmc19hZ2lfdAkJKmFnaTsJLyogYWxsb2NhdGlvbiBncm91cCBoZWFkZXIgKi8KKworCWFnaSA9IFhGU19CVUZfVE9fQUdJKGJwKTsKKwlBU1NFUlQoSU5UX0dFVChhZ2ktPmFnaV9tYWdpY251bSwgQVJDSF9DT05WRVJUKSA9PSBYRlNfQUdJX01BR0lDKTsKKyNlbmRpZgorCS8qCisJICogQ29tcHV0ZSBieXRlIG9mZnNldHMgZm9yIHRoZSBmaXJzdCBhbmQgbGFzdCBmaWVsZHMuCisJICovCisJeGZzX2J0cmVlX29mZnNldHMoZmllbGRzLCBvZmZzZXRzLCBYRlNfQUdJX05VTV9CSVRTLCAmZmlyc3QsICZsYXN0KTsKKwkvKgorCSAqIExvZyB0aGUgYWxsb2NhdGlvbiBncm91cCBpbm9kZSBoZWFkZXIgYnVmZmVyLgorCSAqLworCXhmc190cmFuc19sb2dfYnVmKHRwLCBicCwgZmlyc3QsIGxhc3QpOworfQorCisvKgorICogUmVhZCBpbiB0aGUgYWxsb2NhdGlvbiBncm91cCBoZWFkZXIgKGlub2RlIGFsbG9jYXRpb24gc2VjdGlvbikKKyAqLworaW50Cit4ZnNfaWFsbG9jX3JlYWRfYWdpKAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfYWdudW1iZXJfdAlhZ25vLAkJLyogYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJKipicHApCQkvKiBhbGxvY2F0aW9uIGdyb3VwIGhkciBidWYgKi8KK3sKKwl4ZnNfYWdpX3QJKmFnaTsJCS8qIGFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyICovCisJaW50CQlhZ2lfb2s7CQkvKiBhZ2kgaXMgY29uc2lzdGVudCAqLworCXhmc19idWZfdAkqYnA7CQkvKiBhbGxvY2F0aW9uIGdyb3VwIGhkciBidWYgKi8KKwl4ZnNfcGVyYWdfdAkqcGFnOwkJLyogcGVyIGFsbG9jYXRpb24gZ3JvdXAgZGF0YSAqLworCWludAkJZXJyb3I7CisKKwlBU1NFUlQoYWdubyAhPSBOVUxMQUdOVU1CRVIpOworCWVycm9yID0geGZzX3RyYW5zX3JlYWRfYnVmKAorCQkJbXAsIHRwLCBtcC0+bV9kZGV2X3RhcmdwLAorCQkJWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBYRlNfQUdJX0RBRERSKG1wKSksCisJCQlYRlNfRlNTX1RPX0JCKG1wLCAxKSwgMCwgJmJwKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlBU1NFUlQoYnAgJiYgIVhGU19CVUZfR0VURVJST1IoYnApKTsKKworCS8qCisJICogVmFsaWRhdGUgdGhlIG1hZ2ljIG51bWJlciBvZiB0aGUgYWdpIGJsb2NrLgorCSAqLworCWFnaSA9IFhGU19CVUZfVE9fQUdJKGJwKTsKKwlhZ2lfb2sgPQorCQlJTlRfR0VUKGFnaS0+YWdpX21hZ2ljbnVtLCBBUkNIX0NPTlZFUlQpID09IFhGU19BR0lfTUFHSUMgJiYKKwkJWEZTX0FHSV9HT09EX1ZFUlNJT04oCisJCQlJTlRfR0VUKGFnaS0+YWdpX3ZlcnNpb25udW0sIEFSQ0hfQ09OVkVSVCkpOworCWlmICh1bmxpa2VseShYRlNfVEVTVF9FUlJPUighYWdpX29rLCBtcCwgWEZTX0VSUlRBR19JQUxMT0NfUkVBRF9BR0ksCisJCQlYRlNfUkFORE9NX0lBTExPQ19SRUFEX0FHSSkpKSB7CisJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfaWFsbG9jX3JlYWRfYWdpIiwgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkgICAgIG1wLCBhZ2kpOworCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisJcGFnID0gJm1wLT5tX3BlcmFnW2Fnbm9dOworCWlmICghcGFnLT5wYWdpX2luaXQpIHsKKwkJcGFnLT5wYWdpX2ZyZWVjb3VudCA9IElOVF9HRVQoYWdpLT5hZ2lfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQpOworCQlwYWctPnBhZ2lfaW5pdCA9IDE7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSXQncyBwb3NzaWJsZSBmb3IgdGhlc2UgdG8gYmUgb3V0IG9mIHN5bmMgaWYKKwkJICogd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBmb3JjZWQgc2h1dGRvd24uCisJCSAqLworCQlBU1NFUlQocGFnLT5wYWdpX2ZyZWVjb3VudCA9PQorCQkJCUlOVF9HRVQoYWdpLT5hZ2lfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQpCisJCQl8fCBYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSk7CisJfQorCisjaWZkZWYgREVCVUcKKwl7CisJCWludAlpOworCisJCWZvciAoaSA9IDA7IGkgPCBYRlNfQUdJX1VOTElOS0VEX0JVQ0tFVFM7IGkrKykKKwkJCUFTU0VSVChhZ2ktPmFnaV91bmxpbmtlZFtpXSk7CisJfQorI2VuZGlmCisKKwlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfQUdJLCBYRlNfQUdJX1JFRik7CisJKmJwcCA9IGJwOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pYWxsb2MuaCBiL2ZzL3hmcy94ZnNfaWFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI2ZDAwMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfaWFsbG9jLmgKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19JQUxMT0NfSF9fCisjZGVmaW5lCV9fWEZTX0lBTExPQ19IX18KKworc3RydWN0IHhmc19idWY7CitzdHJ1Y3QgeGZzX2Rpbm9kZTsKK3N0cnVjdCB4ZnNfbW91bnQ7CitzdHJ1Y3QgeGZzX3RyYW5zOworCisvKgorICogQWxsb2NhdGlvbiBwYXJhbWV0ZXJzIGZvciBpbm9kZSBhbGxvY2F0aW9uLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JQUxMT0NfSU5PREVTKQoraW50IHhmc19pYWxsb2NfaW5vZGVzKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX0lBTExPQ19JTk9ERVMobXApCXhmc19pYWxsb2NfaW5vZGVzKG1wKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lBTExPQ19JTk9ERVMobXApCSgobXApLT5tX2lhbGxvY19pbm9zKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JQUxMT0NfQkxPQ0tTKQoreGZzX2V4dGxlbl90IHhmc19pYWxsb2NfYmxvY2tzKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX0lBTExPQ19CTE9DS1MobXApCXhmc19pYWxsb2NfYmxvY2tzKG1wKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lBTExPQ19CTE9DS1MobXApCSgobXApLT5tX2lhbGxvY19ibGtzKQorI2VuZGlmCisKKy8qCisgKiBGb3Igc21hbGwgYmxvY2sgZmlsZSBzeXN0ZW1zLCBtb3ZlIGlub2RlcyBpbiBjbHVzdGVycyBvZiB0aGlzIHNpemUuCisgKiBXaGVuIHdlIGRvbid0IGhhdmUgYSBsb3Qgb2YgbWVtb3J5LCBob3dldmVyLCB3ZSBnbyBhIGJpdCBzbWFsbGVyCisgKiB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBBR0kgYW5kIGlhbGxvYyBidHJlZSBibG9ja3Mgd2UgbmVlZCB0byBrZWVwCisgKiBhcm91bmQgZm9yIHhmc19kaWxvY2F0ZSgpLiAgV2UgY2hvb3NlIHdoaWNoIG9uZSB0byB1c2UgaW4KKyAqIHhmc19tb3VudF9pbnQoKS4KKyAqLworI2RlZmluZQlYRlNfSU5PREVfQklHX0NMVVNURVJfU0laRQk4MTkyCisjZGVmaW5lCVhGU19JTk9ERV9TTUFMTF9DTFVTVEVSX1NJWkUJNDA5NgorI2RlZmluZQlYRlNfSU5PREVfQ0xVU1RFUl9TSVpFKG1wKQkobXApLT5tX2lub2RlX2NsdXN0ZXJfc2l6ZQorCisvKgorICogTWFrZSBhbiBpbm9kZSBwb2ludGVyIG91dCBvZiB0aGUgYnVmZmVyL29mZnNldC4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTUFLRV9JUFRSKQorc3RydWN0IHhmc19kaW5vZGUgKnhmc19tYWtlX2lwdHIoc3RydWN0IHhmc19tb3VudCAqbXAsIHN0cnVjdCB4ZnNfYnVmICpiLCBpbnQgbyk7CisjZGVmaW5lCVhGU19NQUtFX0lQVFIobXAsYixvKQkJeGZzX21ha2VfaXB0cihtcCxiLG8pCisjZWxzZQorI2RlZmluZQlYRlNfTUFLRV9JUFRSKG1wLGIsbykgXAorCSgoeGZzX2Rpbm9kZV90ICopKHhmc19idWZfb2Zmc2V0KGIsIChvKSA8PCAobXApLT5tX3NiLnNiX2lub2RlbG9nKSkpCisjZW5kaWYKKworLyoKKyAqIEZpbmQgYSBmcmVlIChzZXQpIGJpdCBpbiB0aGUgaW5vZGUgYml0bWFzay4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSUFMTE9DX0ZJTkRfRlJFRSkKK2ludCB4ZnNfaWFsbG9jX2ZpbmRfZnJlZSh4ZnNfaW5vZnJlZV90ICpmcCk7CisjZGVmaW5lCVhGU19JQUxMT0NfRklORF9GUkVFKGZwKQl4ZnNfaWFsbG9jX2ZpbmRfZnJlZShmcCkKKyNlbHNlCisjZGVmaW5lCVhGU19JQUxMT0NfRklORF9GUkVFKGZwKQl4ZnNfbG93Yml0NjQoKihmcCkpCisjZW5kaWYKKworCisjaWZkZWYgX19LRVJORUxfXworCisvKgorICogUHJvdG90eXBlcyBmb3IgdmlzaWJsZSB4ZnNfaWFsbG9jLmMgcm91dGluZXMuCisgKi8KKworLyoKKyAqIEFsbG9jYXRlIGFuIGlub2RlIG9uIGRpc2suCisgKiBNb2RlIGlzIHVzZWQgdG8gdGVsbCB3aGV0aGVyIHRoZSBuZXcgaW5vZGUgd2lsbCBuZWVkIHNwYWNlLCBhbmQgd2hldGhlcgorICogaXQgaXMgYSBkaXJlY3RvcnkuCisgKgorICogVG8gd29yayB3aXRoaW4gdGhlIGNvbnN0cmFpbnQgb2Ygb25lIGFsbG9jYXRpb24gcGVyIHRyYW5zYWN0aW9uLAorICogeGZzX2RpYWxsb2MoKSBpcyBkZXNpZ25lZCB0byBiZSBjYWxsZWQgdHdpY2UgaWYgaXQgaGFzIHRvIGRvIGFuCisgKiBhbGxvY2F0aW9uIHRvIG1ha2UgbW9yZSBmcmVlIGlub2Rlcy4gIElmIGFuIGlub2RlIGlzCisgKiBhdmFpbGFibGUgd2l0aG91dCBhbiBhbGxvY2F0aW9uLCBhZ2JwIHdvdWxkIGJlIHNldCB0byB0aGUgY3VycmVudAorICogYWdicCBhbmQgYWxsb2NfZG9uZSBzZXQgdG8gZmFsc2UuCisgKiBJZiBhbiBhbGxvY2F0aW9uIG5lZWRlZCB0byBiZSBkb25lLCBhZ2JwIHdvdWxkIGJlIHNldCB0byB0aGUKKyAqIGlub2RlIGhlYWRlciBvZiB0aGUgYWxsb2NhdGlvbiBncm91cCBhbmQgYWxsb2NfZG9uZSBzZXQgdG8gdHJ1ZS4KKyAqIFRoZSBjYWxsZXIgc2hvdWxkIHRoZW4gY29tbWl0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGFuZCBhbGxvY2F0ZSBhIG5ldworICogdHJhbnNhY3Rpb24uICB4ZnNfZGlhbGxvYygpIHNob3VsZCB0aGVuIGJlIGNhbGxlZCBhZ2FpbiB3aXRoCisgKiB0aGUgYWdicCB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZSBwcmV2aW91cyBjYWxsLgorICoKKyAqIE9uY2Ugd2Ugc3VjY2Vzc2Z1bGx5IHBpY2sgYW4gaW5vZGUgaXRzIG51bWJlciBpcyByZXR1cm5lZCBhbmQgdGhlCisgKiBvbi1kaXNrIGRhdGEgc3RydWN0dXJlcyBhcmUgdXBkYXRlZC4gIFRoZSBpbm9kZSBpdHNlbGYgaXMgbm90IHJlYWQKKyAqIGluLCBzaW5jZSBkb2luZyBzbyB3b3VsZCBicmVhayBvcmRlcmluZyBjb25zdHJhaW50cyB3aXRoIHhmc19yZWNsYWltLgorICoKKyAqICphZ2JwIHNob3VsZCBiZSBzZXQgdG8gTlVMTCBvbiB0aGUgZmlyc3QgY2FsbCwgKmFsbG9jX2RvbmUgc2V0IHRvIEZBTFNFLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfZGlhbGxvYygKKwlzdHJ1Y3QgeGZzX3RyYW5zICp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vX3QJcGFyZW50LAkJLyogcGFyZW50IGlub2RlIChkaXJlY3RvcnkpICovCisJbW9kZV90CQltb2RlLAkJLyogbW9kZSBiaXRzIGZvciBuZXcgaW5vZGUgKi8KKwlpbnQJCW9rYWxsb2MsCS8qIG9rIHRvIGFsbG9jYXRlIG1vcmUgc3BhY2UgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkqKmFnYnAsCQkvKiBidWYgZm9yIGEuZy4gaW5vZGUgaGVhZGVyICovCisJYm9vbGVhbl90CSphbGxvY19kb25lLAkvKiBhbiBhbGxvY2F0aW9uIHdhcyBkb25lIHRvIHJlcGxlbmlzaAorCQkJCQkgICB0aGUgZnJlZSBpbm9kZXMgKi8KKwl4ZnNfaW5vX3QJKmlub3ApOwkJLyogaW5vZGUgbnVtYmVyIGFsbG9jYXRlZCAqLworCisvKgorICogRnJlZSBkaXNrIGlub2RlLiAgQ2FyZWZ1bGx5IGF2b2lkcyB0b3VjaGluZyB0aGUgaW5jb3JlIGlub2RlLCBhbGwKKyAqIG1hbmlwdWxhdGlvbnMgaW5jb3JlIGFyZSB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkuCisgKiBUaGUgb24tZGlzayBpbm9kZSBpcyBub3QgY2hhbmdlZCBieSB0aGlzIG9wZXJhdGlvbiwgb25seSB0aGUKKyAqIGJ0cmVlIChmcmVlIGlub2RlIG1hc2spIGlzIGNoYW5nZWQuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19kaWZyZWUoCisJc3RydWN0IHhmc190cmFucyAqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub190CWlub2RlLAkJLyogaW5vZGUgdG8gYmUgZnJlZWQgKi8KKwlzdHJ1Y3QgeGZzX2JtYXBfZnJlZSAqZmxpc3QsCS8qIGV4dGVudHMgdG8gZnJlZSAqLworCWludAkJKmRlbGV0ZSwJLyogc2V0IGlmIGlub2RlIGNsdXN0ZXIgd2FzIGRlbGV0ZWQgKi8KKwl4ZnNfaW5vX3QJKmZpcnN0X2lubyk7CS8qIGZpcnN0IGlub2RlIGluIGRlbGV0ZWQgY2x1c3RlciAqLworCisvKgorICogUmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW5vZGUgaW4gYm5vL2xlbi9vZmYsCisgKiBmb3IgbWFwcGluZyBpdCBpbnRvIGEgYnVmZmVyLgorICovCitpbnQKK3hmc19kaWxvY2F0ZSgKKwlzdHJ1Y3QgeGZzX21vdW50ICptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCXN0cnVjdCB4ZnNfdHJhbnMgKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9fdAlpbm8sCQkvKiBpbm9kZSB0byBsb2NhdGUgKi8KKwl4ZnNfZnNibG9ja190CSpibm8sCQkvKiBvdXRwdXQ6IGJsb2NrIGNvbnRhaW5pbmcgaW5vZGUgKi8KKwlpbnQJCSpsZW4sCQkvKiBvdXRwdXQ6IG51bSBibG9ja3MgaW4gY2x1c3RlciovCisJaW50CQkqb2ZmLAkJLyogb3V0cHV0OiBpbmRleCBpbiBibG9jayBvZiBpbm9kZSAqLworCXVpbnQJCWZsYWdzKTsJCS8qIGZsYWdzIGZvciBpbm9kZSBidHJlZSBsb29rdXAgKi8KKworLyoKKyAqIENvbXB1dGUgYW5kIGZpbGwgaW4gdmFsdWUgb2YgbV9pbl9tYXhsZXZlbHMuCisgKi8KK3ZvaWQKK3hmc19pYWxsb2NfY29tcHV0ZV9tYXhsZXZlbHMoCisJc3RydWN0IHhmc19tb3VudCAqbXApOwkJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCisKKy8qCisgKiBMb2cgc3BlY2lmaWVkIGZpZWxkcyBmb3IgdGhlIGFnIGhkciAoaW5vZGUgc2VjdGlvbikKKyAqLwordm9pZAoreGZzX2lhbGxvY19sb2dfYWdpKAorCXN0cnVjdCB4ZnNfdHJhbnMgKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfYnVmCSpicCwJCS8qIGFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyIGJ1ZmZlciAqLworCWludAkJZmllbGRzKTsJLyogYml0bWFzayBvZiBmaWVsZHMgdG8gbG9nICovCisKKy8qCisgKiBSZWFkIGluIHRoZSBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciAoaW5vZGUgYWxsb2NhdGlvbiBzZWN0aW9uKQorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfaWFsbG9jX3JlYWRfYWdpKAorCXN0cnVjdCB4ZnNfbW91bnQgKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCisJc3RydWN0IHhmc190cmFucyAqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2FnbnVtYmVyX3QJYWdubywJCS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCisJc3RydWN0IHhmc19idWYJKipicHApOwkJLyogYWxsb2NhdGlvbiBncm91cCBoZHIgYnVmICovCisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgkvKiBfX1hGU19JQUxMT0NfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lhbGxvY19idHJlZS5jIGIvZnMveGZzL3hmc19pYWxsb2NfYnRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDRkYWVjCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19pYWxsb2NfYnRyZWUuYwpAQCAtMCwwICsxLDIwOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKworI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorCisvKgorICogSW5vZGUgYWxsb2NhdGlvbiBtYW5hZ2VtZW50IGZvciBYRlMuCisgKi8KKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIGludGVybmFsIGZ1bmN0aW9ucy4KKyAqLworCitTVEFUSUMgdm9pZCB4ZnNfaW5vYnRfbG9nX2Jsb2NrKHhmc190cmFuc190ICosIHhmc19idWZfdCAqLCBpbnQpOworU1RBVElDIHZvaWQgeGZzX2lub2J0X2xvZ19rZXlzKHhmc19idHJlZV9jdXJfdCAqLCB4ZnNfYnVmX3QgKiwgaW50LCBpbnQpOworU1RBVElDIHZvaWQgeGZzX2lub2J0X2xvZ19wdHJzKHhmc19idHJlZV9jdXJfdCAqLCB4ZnNfYnVmX3QgKiwgaW50LCBpbnQpOworU1RBVElDIHZvaWQgeGZzX2lub2J0X2xvZ19yZWNzKHhmc19idHJlZV9jdXJfdCAqLCB4ZnNfYnVmX3QgKiwgaW50LCBpbnQpOworU1RBVElDIGludCB4ZnNfaW5vYnRfbHNoaWZ0KHhmc19idHJlZV9jdXJfdCAqLCBpbnQsIGludCAqKTsKK1NUQVRJQyBpbnQgeGZzX2lub2J0X25ld3Jvb3QoeGZzX2J0cmVlX2N1cl90ICosIGludCAqKTsKK1NUQVRJQyBpbnQgeGZzX2lub2J0X3JzaGlmdCh4ZnNfYnRyZWVfY3VyX3QgKiwgaW50LCBpbnQgKik7CitTVEFUSUMgaW50IHhmc19pbm9idF9zcGxpdCh4ZnNfYnRyZWVfY3VyX3QgKiwgaW50LCB4ZnNfYWdibG9ja190ICosCisJCXhmc19pbm9idF9rZXlfdCAqLCB4ZnNfYnRyZWVfY3VyX3QgKiosIGludCAqKTsKK1NUQVRJQyBpbnQgeGZzX2lub2J0X3VwZGtleSh4ZnNfYnRyZWVfY3VyX3QgKiwgeGZzX2lub2J0X2tleV90ICosIGludCk7CisKKy8qCisgKiBJbnRlcm5hbCBmdW5jdGlvbnMuCisgKi8KKworLyoKKyAqIFNpbmdsZSBsZXZlbCBvZiB0aGUgeGZzX2lub2J0X2RlbGV0ZSByZWNvcmQgZGVsZXRpb24gcm91dGluZS4KKyAqIERlbGV0ZSByZWNvcmQgcG9pbnRlZCB0byBieSBjdXIvbGV2ZWwuCisgKiBSZW1vdmUgdGhlIHJlY29yZCBmcm9tIGl0cyBibG9jayB0aGVuIHJlYmFsYW5jZSB0aGUgdHJlZS4KKyAqIFJldHVybiAwIGZvciBlcnJvciwgMSBmb3IgZG9uZSwgMiB0byBnbyBvbiB0byB0aGUgbmV4dCBsZXZlbC4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2lub2J0X2RlbHJlYygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldmVsLAkvKiBsZXZlbCByZW1vdmluZyByZWNvcmQgZnJvbSAqLworCWludAkJCSpzdGF0KQkvKiBmYWlsL2RvbmUvZ28tb24gKi8KK3sKKwl4ZnNfYnVmX3QJCSphZ2JwOwkvKiBidWZmZXIgZm9yIGEuZy4gaW5vZGUgaGVhZGVyICovCisJeGZzX21vdW50X3QJCSptcDsJLyogbW91bnQgc3RydWN0dXJlICovCisJeGZzX2FnaV90CQkqYWdpOwkvKiBhbGxvY2F0aW9uIGdyb3VwIGlub2RlIGhlYWRlciAqLworCXhmc19pbm9idF9ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgcmVjb3JkL2tleSBsaXZlcyBpbiAqLworCXhmc19hZ2Jsb2NrX3QJCWJubzsJLyogYnRyZWUgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CQkqYnA7CS8qIGJ1ZmZlciBmb3IgYmxvY2sgKi8KKwlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQkJaTsJLyogbG9vcCBpbmRleCAqLworCXhmc19pbm9idF9rZXlfdAkJa2V5OwkvKiBrcCBwb2ludHMgaGVyZSBpZiBibG9jayBpcyBsZXZlbCAwICovCisJeGZzX2lub2J0X2tleV90CQkqa3AgPSBOVUxMOwkvKiBwb2ludGVyIHRvIGJ0cmVlIGtleXMgKi8KKwl4ZnNfYWdibG9ja190CQlsYm5vOwkvKiBsZWZ0IGJsb2NrJ3MgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CQkqbGJwOwkvKiBsZWZ0IGJsb2NrJ3MgYnVmZmVyIHBvaW50ZXIgKi8KKwl4ZnNfaW5vYnRfYmxvY2tfdAkqbGVmdDsJLyogbGVmdCBidHJlZSBibG9jayAqLworCXhmc19pbm9idF9rZXlfdAkJKmxrcDsJLyogbGVmdCBibG9jayBrZXkgcG9pbnRlciAqLworCXhmc19pbm9idF9wdHJfdAkJKmxwcDsJLyogbGVmdCBibG9jayBhZGRyZXNzIHBvaW50ZXIgKi8KKwlpbnQJCQlscmVjcyA9IDA7CS8qIG51bWJlciBvZiByZWNvcmRzIGluIGxlZnQgYmxvY2sgKi8KKwl4ZnNfaW5vYnRfcmVjX3QJCSpscnA7CS8qIGxlZnQgYmxvY2sgcmVjb3JkIHBvaW50ZXIgKi8KKwl4ZnNfaW5vYnRfcHRyX3QJCSpwcCA9IE5VTEw7CS8qIHBvaW50ZXIgdG8gYnRyZWUgYWRkcmVzc2VzICovCisJaW50CQkJcHRyOwkvKiBpbmRleCBpbiBidHJlZSBibG9jayBmb3IgdGhpcyByZWMgKi8KKwl4ZnNfYWdibG9ja190CQlyYm5vOwkvKiByaWdodCBibG9jaydzIGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkJKnJicDsJLyogcmlnaHQgYmxvY2sncyBidWZmZXIgcG9pbnRlciAqLworCXhmc19pbm9idF9ibG9ja190CSpyaWdodDsJLyogcmlnaHQgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfaW5vYnRfa2V5X3QJCSpya3A7CS8qIHJpZ2h0IGJsb2NrIGtleSBwb2ludGVyICovCisJeGZzX2lub2J0X3JlY190CQkqcnA7CS8qIHBvaW50ZXIgdG8gYnRyZWUgcmVjb3JkcyAqLworCXhmc19pbm9idF9wdHJfdAkJKnJwcDsJLyogcmlnaHQgYmxvY2sgYWRkcmVzcyBwb2ludGVyICovCisJaW50CQkJcnJlY3MgPSAwOwkvKiBudW1iZXIgb2YgcmVjb3JkcyBpbiByaWdodCBibG9jayAqLworCWludAkJCW51bXJlY3M7CisJeGZzX2lub2J0X3JlY190CQkqcnJwOwkvKiByaWdodCBibG9jayByZWNvcmQgcG9pbnRlciAqLworCXhmc19idHJlZV9jdXJfdAkJKnRjdXI7CS8qIHRlbXBvcmFyeSBidHJlZSBjdXJzb3IgKi8KKworCW1wID0gY3VyLT5iY19tcDsKKworCS8qCisJICogR2V0IHRoZSBpbmRleCBvZiB0aGUgZW50cnkgYmVpbmcgZGVsZXRlZCwgY2hlY2sgZm9yIG5vdGhpbmcgdGhlcmUuCisJICovCisJcHRyID0gY3VyLT5iY19wdHJzW2xldmVsXTsKKwlpZiAocHRyID09IDApIHsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEdldCB0aGUgYnVmZmVyICYgYmxvY2sgY29udGFpbmluZyB0aGUgcmVjb3JkIG9yIGtleS9wdHIuCisJICovCisJYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOworCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApKSkKKwkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJLyoKKwkgKiBGYWlsIGlmIHdlJ3JlIG9mZiB0aGUgZW5kIG9mIHRoZSBibG9jay4KKwkgKi8KKworCW51bXJlY3MgPSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCWlmIChwdHIgPiBudW1yZWNzKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogSXQncyBhIG5vbmxlYWYuICBFeGNpc2UgdGhlIGtleSBhbmQgcHRyIGJlaW5nIGRlbGV0ZWQsIGJ5CisJICogc2xpZGluZyB0aGUgZW50cmllcyBwYXN0IHRoZW0gZG93biBvbmUuCisJICogTG9nIHRoZSBjaGFuZ2VkIGFyZWFzIG9mIHRoZSBibG9jay4KKwkgKi8KKwlpZiAobGV2ZWwgPiAwKSB7CisJCWtwID0gWEZTX0lOT0JUX0tFWV9BRERSKGJsb2NrLCAxLCBjdXIpOworCQlwcCA9IFhGU19JTk9CVF9QVFJfQUREUihibG9jaywgMSwgY3VyKTsKKyNpZmRlZiBERUJVRworCQlmb3IgKGkgPSBwdHI7IGkgPCBudW1yZWNzOyBpKyspIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIElOVF9HRVQocHBbaV0sIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpCisJCQkJcmV0dXJuIGVycm9yOworCQl9CisjZW5kaWYKKwkJaWYgKHB0ciA8IG51bXJlY3MpIHsKKwkJCW1lbW1vdmUoJmtwW3B0ciAtIDFdLCAma3BbcHRyXSwKKwkJCQkobnVtcmVjcyAtIHB0cikgKiBzaXplb2YoKmtwKSk7CisJCQltZW1tb3ZlKCZwcFtwdHIgLSAxXSwgJnBwW3B0cl0sCisJCQkJKG51bXJlY3MgLSBwdHIpICogc2l6ZW9mKCprcCkpOworCQkJeGZzX2lub2J0X2xvZ19rZXlzKGN1ciwgYnAsIHB0ciwgbnVtcmVjcyAtIDEpOworCQkJeGZzX2lub2J0X2xvZ19wdHJzKGN1ciwgYnAsIHB0ciwgbnVtcmVjcyAtIDEpOworCQl9CisJfQorCS8qCisJICogSXQncyBhIGxlYWYuICBFeGNpc2UgdGhlIHJlY29yZCBiZWluZyBkZWxldGVkLCBieSBzbGlkaW5nIHRoZQorCSAqIGVudHJpZXMgcGFzdCBpdCBkb3duIG9uZS4gIExvZyB0aGUgY2hhbmdlZCBhcmVhcyBvZiB0aGUgYmxvY2suCisJICovCisJZWxzZSB7CisJCXJwID0gWEZTX0lOT0JUX1JFQ19BRERSKGJsb2NrLCAxLCBjdXIpOworCQlpZiAocHRyIDwgbnVtcmVjcykgeworCQkJbWVtbW92ZSgmcnBbcHRyIC0gMV0sICZycFtwdHJdLAorCQkJCShudW1yZWNzIC0gcHRyKSAqIHNpemVvZigqcnApKTsKKwkJCXhmc19pbm9idF9sb2dfcmVjcyhjdXIsIGJwLCBwdHIsIG51bXJlY3MgLSAxKTsKKwkJfQorCQkvKgorCQkgKiBJZiBpdCdzIHRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIGJsb2NrLCB3ZSdsbCBuZWVkIGEga2V5CisJCSAqIHN0cnVjdHVyZSB0byBwYXNzIHVwIHRvIHRoZSBuZXh0IGxldmVsICh1cGRrZXkpLgorCQkgKi8KKwkJaWYgKHB0ciA9PSAxKSB7CisJCQlrZXkuaXJfc3RhcnRpbm8gPSBycC0+aXJfc3RhcnRpbm87CisJCQlrcCA9ICZrZXk7CisJCX0KKwl9CisJLyoKKwkgKiBEZWNyZW1lbnQgYW5kIGxvZyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGJsb2NrLgorCSAqLworCW51bXJlY3MtLTsKKwlJTlRfU0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIG51bXJlY3MpOworCXhmc19pbm9idF9sb2dfYmxvY2soY3VyLT5iY190cCwgYnAsIFhGU19CQl9OVU1SRUNTKTsKKwkvKgorCSAqIElzIHRoaXMgdGhlIHJvb3QgbGV2ZWw/ICBJZiBzbywgd2UncmUgYWxtb3N0IGRvbmUuCisJICovCisJaWYgKGxldmVsID09IGN1ci0+YmNfbmxldmVscyAtIDEpIHsKKwkJLyoKKwkJICogSWYgdGhpcyBpcyB0aGUgcm9vdCBsZXZlbCwKKwkJICogYW5kIHRoZXJlJ3Mgb25seSBvbmUgZW50cnkgbGVmdCwKKwkJICogYW5kIGl0J3MgTk9UIHRoZSBsZWFmIGxldmVsLAorCQkgKiB0aGVuIHdlIGNhbiBnZXQgcmlkIG9mIHRoaXMgbGV2ZWwuCisJCSAqLworCQlpZiAobnVtcmVjcyA9PSAxICYmIGxldmVsID4gMCkgeworCQkJYWdicCA9IGN1ci0+YmNfcHJpdmF0ZS5pLmFnYnA7CisJCQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShhZ2JwKTsKKwkJCS8qCisJCQkgKiBwcCBpcyBzdGlsbCBzZXQgdG8gdGhlIGZpcnN0IHBvaW50ZXIgaW4gdGhlIGJsb2NrLgorCQkJICogTWFrZSBpdCB0aGUgbmV3IHJvb3Qgb2YgdGhlIGJ0cmVlLgorCQkJICovCisJCQlibm8gPSBJTlRfR0VUKGFnaS0+YWdpX3Jvb3QsIEFSQ0hfQ09OVkVSVCk7CisJCQlhZ2ktPmFnaV9yb290ID0gKnBwOworCQkJSU5UX01PRChhZ2ktPmFnaV9sZXZlbCwgQVJDSF9DT05WRVJULCAtMSk7CisJCQkvKgorCQkJICogRnJlZSB0aGUgYmxvY2suCisJCQkgKi8KKwkJCWlmICgoZXJyb3IgPSB4ZnNfZnJlZV9leHRlbnQoY3VyLT5iY190cCwKKwkJCQlYRlNfQUdCX1RPX0ZTQihtcCwgY3VyLT5iY19wcml2YXRlLmkuYWdubywgYm5vKSwgMSkpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJCXhmc190cmFuc19iaW52YWwoY3VyLT5iY190cCwgYnApOworCQkJeGZzX2lhbGxvY19sb2dfYWdpKGN1ci0+YmNfdHAsIGFnYnAsCisJCQkJWEZTX0FHSV9ST09UIHwgWEZTX0FHSV9MRVZFTCk7CisJCQkvKgorCQkJICogVXBkYXRlIHRoZSBjdXJzb3Igc28gdGhlcmUncyBvbmUgZmV3ZXIgbGV2ZWwuCisJCQkgKi8KKwkJCWN1ci0+YmNfYnVmc1tsZXZlbF0gPSBOVUxMOworCQkJY3VyLT5iY19ubGV2ZWxzLS07CisJCX0gZWxzZSBpZiAobGV2ZWwgPiAwICYmCisJCQkgICAoZXJyb3IgPSB4ZnNfaW5vYnRfZGVjcmVtZW50KGN1ciwgbGV2ZWwsICZpKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCSpzdGF0ID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogSWYgd2UgZGVsZXRlZCB0aGUgbGVmdG1vc3QgZW50cnkgaW4gdGhlIGJsb2NrLCB1cGRhdGUgdGhlCisJICoga2V5IHZhbHVlcyBhYm92ZSB1cyBpbiB0aGUgdHJlZS4KKwkgKi8KKwlpZiAocHRyID09IDEgJiYgKGVycm9yID0geGZzX2lub2J0X3VwZGtleShjdXIsIGtwLCBsZXZlbCArIDEpKSkKKwkJcmV0dXJuIGVycm9yOworCS8qCisJICogSWYgdGhlIG51bWJlciBvZiByZWNvcmRzIHJlbWFpbmluZyBpbiB0aGUgYmxvY2sgaXMgYXQgbGVhc3QKKwkgKiB0aGUgbWluaW11bSwgd2UncmUgZG9uZS4KKwkgKi8KKwlpZiAobnVtcmVjcyA+PSBYRlNfSU5PQlRfQkxPQ0tfTUlOUkVDUyhsZXZlbCwgY3VyKSkgeworCQlpZiAobGV2ZWwgPiAwICYmCisJCSAgICAoZXJyb3IgPSB4ZnNfaW5vYnRfZGVjcmVtZW50KGN1ciwgbGV2ZWwsICZpKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCSpzdGF0ID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIG1vdmUgc29tZSByZWNvcmRzIGFyb3VuZCB0byBrZWVwIHRoZQorCSAqIHRyZWUgYmFsYW5jZWQuICBMb29rIGF0IHRoZSBsZWZ0IGFuZCByaWdodCBzaWJsaW5nIGJsb2NrcyB0bworCSAqIHNlZSBpZiB3ZSBjYW4gcmUtYmFsYW5jZSBieSBtb3Zpbmcgb25seSBvbmUgcmVjb3JkLgorCSAqLworCXJibm8gPSBJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKTsKKwlsYm5vID0gSU5UX0dFVChibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKTsKKwlibm8gPSBOVUxMQUdCTE9DSzsKKwlBU1NFUlQocmJubyAhPSBOVUxMQUdCTE9DSyB8fCBsYm5vICE9IE5VTExBR0JMT0NLKTsKKwkvKgorCSAqIER1cGxpY2F0ZSB0aGUgY3Vyc29yIHNvIG91ciBidHJlZSBtYW5pcHVsYXRpb25zIGhlcmUgd29uJ3QKKwkgKiBkaXNydXB0IHRoZSBuZXh0IGxldmVsIHVwLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZHVwX2N1cnNvcihjdXIsICZ0Y3VyKSkpCisJCXJldHVybiBlcnJvcjsKKwkvKgorCSAqIElmIHRoZXJlJ3MgYSByaWdodCBzaWJsaW5nLCBzZWUgaWYgaXQncyBvayB0byBzaGlmdCBhbiBlbnRyeQorCSAqIG91dCBvZiBpdC4KKwkgKi8KKwlpZiAocmJubyAhPSBOVUxMQUdCTE9DSykgeworCQkvKgorCQkgKiBNb3ZlIHRoZSB0ZW1wIGN1cnNvciB0byB0aGUgbGFzdCBlbnRyeSBpbiB0aGUgbmV4dCBibG9jay4KKwkJICogQWN0dWFsbHkgYW55IGVudHJ5IGJ1dCB0aGUgZmlyc3Qgd291bGQgc3VmZmljZS4KKwkJICovCisJCWkgPSB4ZnNfYnRyZWVfbGFzdHJlYyh0Y3VyLCBsZXZlbCk7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJaWYgKChlcnJvciA9IHhmc19pbm9idF9pbmNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQlpID0geGZzX2J0cmVlX2xhc3RyZWModGN1ciwgbGV2ZWwpOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCS8qCisJCSAqIEdyYWIgYSBwb2ludGVyIHRvIHRoZSBibG9jay4KKwkJICovCisJCXJicCA9IHRjdXItPmJjX2J1ZnNbbGV2ZWxdOworCQlyaWdodCA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0socmJwKTsKKyNpZmRlZiBERUJVRworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIHJpZ2h0LCBsZXZlbCwgcmJwKSkpCisJCQlnb3RvIGVycm9yMDsKKyNlbmRpZgorCQkvKgorCQkgKiBHcmFiIHRoZSBjdXJyZW50IGJsb2NrIG51bWJlciwgZm9yIGZ1dHVyZSB1c2UuCisJCSAqLworCQlibm8gPSBJTlRfR0VUKHJpZ2h0LT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpOworCQkvKgorCQkgKiBJZiByaWdodCBibG9jayBpcyBmdWxsIGVub3VnaCBzbyB0aGF0IHJlbW92aW5nIG9uZSBlbnRyeQorCQkgKiB3b24ndCBtYWtlIGl0IHRvbyBlbXB0eSwgYW5kIGxlZnQtc2hpZnRpbmcgYW4gZW50cnkgb3V0CisJCSAqIG9mIHJpZ2h0IHRvIHVzIHdvcmtzLCB3ZSdyZSBkb25lLgorCQkgKi8KKwkJaWYgKElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSAxID49CisJCSAgICAgWEZTX0lOT0JUX0JMT0NLX01JTlJFQ1MobGV2ZWwsIGN1cikpIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfbHNoaWZ0KHRjdXIsIGxldmVsLCAmaSkpKQorCQkJCWdvdG8gZXJyb3IwOworCQkJaWYgKGkpIHsKKwkJCQlBU1NFUlQoSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA+PQorCQkJCSAgICAgICBYRlNfSU5PQlRfQkxPQ0tfTUlOUkVDUyhsZXZlbCwgY3VyKSk7CisJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwKKwkJCQkJCSAgICAgWEZTX0JUUkVFX05PRVJST1IpOworCQkJCWlmIChsZXZlbCA+IDAgJiYKKwkJCQkgICAgKGVycm9yID0geGZzX2lub2J0X2RlY3JlbWVudChjdXIsIGxldmVsLAorCQkJCQkJJmkpKSkKKwkJCQkJcmV0dXJuIGVycm9yOworCQkJCSpzdGF0ID0gMTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiBPdGhlcndpc2UsIGdyYWIgdGhlIG51bWJlciBvZiByZWNvcmRzIGluIHJpZ2h0IGZvcgorCQkgKiBmdXR1cmUgcmVmZXJlbmNlLCBhbmQgZml4IHVwIHRoZSB0ZW1wIGN1cnNvciB0byBwb2ludAorCQkgKiB0byBvdXIgYmxvY2sgYWdhaW4gKGxhc3QgcmVjb3JkKS4KKwkJICovCisJCXJyZWNzID0gSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwkJaWYgKGxibm8gIT0gTlVMTEFHQkxPQ0spIHsKKwkJCXhmc19idHJlZV9maXJzdHJlYyh0Y3VyLCBsZXZlbCk7CisJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2RlY3JlbWVudCh0Y3VyLCBsZXZlbCwgJmkpKSkKKwkJCQlnb3RvIGVycm9yMDsKKwkJfQorCX0KKwkvKgorCSAqIElmIHRoZXJlJ3MgYSBsZWZ0IHNpYmxpbmcsIHNlZSBpZiBpdCdzIG9rIHRvIHNoaWZ0IGFuIGVudHJ5CisJICogb3V0IG9mIGl0LgorCSAqLworCWlmIChsYm5vICE9IE5VTExBR0JMT0NLKSB7CisJCS8qCisJCSAqIE1vdmUgdGhlIHRlbXAgY3Vyc29yIHRvIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUKKwkJICogcHJldmlvdXMgYmxvY2suCisJCSAqLworCQl4ZnNfYnRyZWVfZmlyc3RyZWModGN1ciwgbGV2ZWwpOworCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2RlY3JlbWVudCh0Y3VyLCBsZXZlbCwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQl4ZnNfYnRyZWVfZmlyc3RyZWModGN1ciwgbGV2ZWwpOworCQkvKgorCQkgKiBHcmFiIGEgcG9pbnRlciB0byB0aGUgYmxvY2suCisJCSAqLworCQlsYnAgPSB0Y3VyLT5iY19idWZzW2xldmVsXTsKKwkJbGVmdCA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0sobGJwKTsKKyNpZmRlZiBERUJVRworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGxlZnQsIGxldmVsLCBsYnApKSkKKwkJCWdvdG8gZXJyb3IwOworI2VuZGlmCisJCS8qCisJCSAqIEdyYWIgdGhlIGN1cnJlbnQgYmxvY2sgbnVtYmVyLCBmb3IgZnV0dXJlIHVzZS4KKwkJICovCisJCWJubyA9IElOVF9HRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCk7CisJCS8qCisJCSAqIElmIGxlZnQgYmxvY2sgaXMgZnVsbCBlbm91Z2ggc28gdGhhdCByZW1vdmluZyBvbmUgZW50cnkKKwkJICogd29uJ3QgbWFrZSBpdCB0b28gZW1wdHksIGFuZCByaWdodC1zaGlmdGluZyBhbiBlbnRyeSBvdXQKKwkJICogb2YgbGVmdCB0byB1cyB3b3Jrcywgd2UncmUgZG9uZS4KKwkJICovCisJCWlmIChJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSAxID49CisJCSAgICAgWEZTX0lOT0JUX0JMT0NLX01JTlJFQ1MobGV2ZWwsIGN1cikpIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfcnNoaWZ0KHRjdXIsIGxldmVsLCAmaSkpKQorCQkJCWdvdG8gZXJyb3IwOworCQkJaWYgKGkpIHsKKwkJCQlBU1NFUlQoSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA+PQorCQkJCSAgICAgICBYRlNfSU5PQlRfQkxPQ0tfTUlOUkVDUyhsZXZlbCwgY3VyKSk7CisJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwKKwkJCQkJCSAgICAgWEZTX0JUUkVFX05PRVJST1IpOworCQkJCWlmIChsZXZlbCA9PSAwKQorCQkJCQljdXItPmJjX3B0cnNbMF0rKzsKKwkJCQkqc3RhdCA9IDE7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJLyoKKwkJICogT3RoZXJ3aXNlLCBncmFiIHRoZSBudW1iZXIgb2YgcmVjb3JkcyBpbiByaWdodCBmb3IKKwkJICogZnV0dXJlIHJlZmVyZW5jZS4KKwkJICovCisJCWxyZWNzID0gSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCX0KKwkvKgorCSAqIERlbGV0ZSB0aGUgdGVtcCBjdXJzb3IsIHdlJ3JlIGRvbmUgd2l0aCBpdC4KKwkgKi8KKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcih0Y3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJLyoKKwkgKiBJZiBoZXJlLCB3ZSBuZWVkIHRvIGRvIGEgam9pbiB0byBrZWVwIHRoZSB0cmVlIGJhbGFuY2VkLgorCSAqLworCUFTU0VSVChibm8gIT0gTlVMTEFHQkxPQ0spOworCS8qCisJICogU2VlIGlmIHdlIGNhbiBqb2luIHdpdGggdGhlIGxlZnQgbmVpZ2hib3IgYmxvY2suCisJICovCisJaWYgKGxibm8gIT0gTlVMTEFHQkxPQ0sgJiYKKwkgICAgbHJlY3MgKyBudW1yZWNzIDw9IFhGU19JTk9CVF9CTE9DS19NQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJCS8qCisJCSAqIFNldCAicmlnaHQiIHRvIGJlIHRoZSBzdGFydGluZyBibG9jaywKKwkJICogImxlZnQiIHRvIGJlIHRoZSBsZWZ0IG5laWdoYm9yLgorCQkgKi8KKwkJcmJubyA9IGJubzsKKwkJcmlnaHQgPSBibG9jazsKKwkJcnJlY3MgPSBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCQlyYnAgPSBicDsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMobXAsIGN1ci0+YmNfdHAsCisJCQkJY3VyLT5iY19wcml2YXRlLmkuYWdubywgbGJubywgMCwgJmxicCwKKwkJCQlYRlNfSU5PX0JUUkVFX1JFRikpKQorCQkJcmV0dXJuIGVycm9yOworCQlsZWZ0ID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhsYnApOworCQlscmVjcyA9IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBsZWZ0LCBsZXZlbCwgbGJwKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qCisJICogSWYgdGhhdCB3b24ndCB3b3JrLCBzZWUgaWYgd2UgY2FuIGpvaW4gd2l0aCB0aGUgcmlnaHQgbmVpZ2hib3IgYmxvY2suCisJICovCisJZWxzZSBpZiAocmJubyAhPSBOVUxMQUdCTE9DSyAmJgorCQkgcnJlY3MgKyBudW1yZWNzIDw9IFhGU19JTk9CVF9CTE9DS19NQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJCS8qCisJCSAqIFNldCAibGVmdCIgdG8gYmUgdGhlIHN0YXJ0aW5nIGJsb2NrLAorCQkgKiAicmlnaHQiIHRvIGJlIHRoZSByaWdodCBuZWlnaGJvci4KKwkJICovCisJCWxibm8gPSBibm87CisJCWxlZnQgPSBibG9jazsKKwkJbHJlY3MgPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJCWxicCA9IGJwOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhtcCwgY3VyLT5iY190cCwKKwkJCQljdXItPmJjX3ByaXZhdGUuaS5hZ25vLCByYm5vLCAwLCAmcmJwLAorCQkJCVhGU19JTk9fQlRSRUVfUkVGKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCXJpZ2h0ID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhyYnApOworCQlycmVjcyA9IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgcmlnaHQsIGxldmVsLCByYnApKSkKKwkJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBPdGhlcndpc2UsIHdlIGNhbid0IGZpeCB0aGUgaW1iYWxhbmNlLgorCSAqIEp1c3QgcmV0dXJuLiAgVGhpcyBpcyBwcm9iYWJseSBhIGxvZ2ljIGVycm9yLCBidXQgaXQncyBub3QgZmF0YWwuCisJICovCisJZWxzZSB7CisJCWlmIChsZXZlbCA+IDAgJiYgKGVycm9yID0geGZzX2lub2J0X2RlY3JlbWVudChjdXIsIGxldmVsLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQkqc3RhdCA9IDE7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIFdlJ3JlIG5vdyBnb2luZyB0byBqb2luICJsZWZ0IiBhbmQgInJpZ2h0IiBieSBtb3ZpbmcgYWxsIHRoZSBzdHVmZgorCSAqIGluICJyaWdodCIgdG8gImxlZnQiIGFuZCBkZWxldGluZyAicmlnaHQiLgorCSAqLworCWlmIChsZXZlbCA+IDApIHsKKwkJLyoKKwkJICogSXQncyBhIG5vbi1sZWFmLiAgTW92ZSBrZXlzIGFuZCBwb2ludGVycy4KKwkJICovCisJCWxrcCA9IFhGU19JTk9CVF9LRVlfQUREUihsZWZ0LCBscmVjcyArIDEsIGN1cik7CisJCWxwcCA9IFhGU19JTk9CVF9QVFJfQUREUihsZWZ0LCBscmVjcyArIDEsIGN1cik7CisJCXJrcCA9IFhGU19JTk9CVF9LRVlfQUREUihyaWdodCwgMSwgY3VyKTsKKwkJcnBwID0gWEZTX0lOT0JUX1BUUl9BRERSKHJpZ2h0LCAxLCBjdXIpOworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IDA7IGkgPCBycmVjczsgaSsrKSB7CisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCBJTlRfR0VUKHJwcFtpXSwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkKKwkJCQlyZXR1cm4gZXJyb3I7CisJCX0KKyNlbmRpZgorCQltZW1jcHkobGtwLCBya3AsIHJyZWNzICogc2l6ZW9mKCpsa3ApKTsKKwkJbWVtY3B5KGxwcCwgcnBwLCBycmVjcyAqIHNpemVvZigqbHBwKSk7CisJCXhmc19pbm9idF9sb2dfa2V5cyhjdXIsIGxicCwgbHJlY3MgKyAxLCBscmVjcyArIHJyZWNzKTsKKwkJeGZzX2lub2J0X2xvZ19wdHJzKGN1ciwgbGJwLCBscmVjcyArIDEsIGxyZWNzICsgcnJlY3MpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEl0J3MgYSBsZWFmLiAgTW92ZSByZWNvcmRzLgorCQkgKi8KKwkJbHJwID0gWEZTX0lOT0JUX1JFQ19BRERSKGxlZnQsIGxyZWNzICsgMSwgY3VyKTsKKwkJcnJwID0gWEZTX0lOT0JUX1JFQ19BRERSKHJpZ2h0LCAxLCBjdXIpOworCQltZW1jcHkobHJwLCBycnAsIHJyZWNzICogc2l6ZW9mKCpscnApKTsKKwkJeGZzX2lub2J0X2xvZ19yZWNzKGN1ciwgbGJwLCBscmVjcyArIDEsIGxyZWNzICsgcnJlY3MpOworCX0KKwkvKgorCSAqIElmIHdlIGpvaW5lZCB3aXRoIHRoZSBsZWZ0IG5laWdoYm9yLCBzZXQgdGhlIGJ1ZmZlciBpbiB0aGUKKwkgKiBjdXJzb3IgdG8gdGhlIGxlZnQgYmxvY2ssIGFuZCBmaXggdXAgdGhlIGluZGV4LgorCSAqLworCWlmIChicCAhPSBsYnApIHsKKwkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldmVsLCBsYnApOworCQljdXItPmJjX3B0cnNbbGV2ZWxdICs9IGxyZWNzOworCX0KKwkvKgorCSAqIElmIHdlIGpvaW5lZCB3aXRoIHRoZSByaWdodCBuZWlnaGJvciBhbmQgdGhlcmUncyBhIGxldmVsIGFib3ZlCisJICogdXMsIGluY3JlbWVudCB0aGUgY3Vyc29yIGF0IHRoYXQgbGV2ZWwuCisJICovCisJZWxzZSBpZiAobGV2ZWwgKyAxIDwgY3VyLT5iY19ubGV2ZWxzICYmCisJCSAoZXJyb3IgPSB4ZnNfYWxsb2NfaW5jcmVtZW50KGN1ciwgbGV2ZWwgKyAxLCAmaSkpKQorCQlyZXR1cm4gZXJyb3I7CisJLyoKKwkgKiBGaXggdXAgdGhlIG51bWJlciBvZiByZWNvcmRzIGluIHRoZSBzdXJ2aXZpbmcgYmxvY2suCisJICovCisJbHJlY3MgKz0gcnJlY3M7CisJSU5UX1NFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIGxyZWNzKTsKKwkvKgorCSAqIEZpeCB1cCB0aGUgcmlnaHQgYmxvY2sgcG9pbnRlciBpbiB0aGUgc3Vydml2aW5nIGJsb2NrLCBhbmQgbG9nIGl0LgorCSAqLworCWxlZnQtPmJiX3JpZ2h0c2liID0gcmlnaHQtPmJiX3JpZ2h0c2liOworCXhmc19pbm9idF9sb2dfYmxvY2soY3VyLT5iY190cCwgbGJwLCBYRlNfQkJfTlVNUkVDUyB8IFhGU19CQl9SSUdIVFNJQik7CisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIHJpZ2h0IHNpYmxpbmcgbm93LCBtYWtlIGl0IHBvaW50IHRvIHRoZQorCSAqIHJlbWFpbmluZyBibG9jay4KKwkgKi8KKwlpZiAoSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSAhPSBOVUxMQUdCTE9DSykgeworCQl4ZnNfaW5vYnRfYmxvY2tfdAkqcnJibG9jazsKKwkJeGZzX2J1Zl90CQkqcnJicDsKKworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhtcCwgY3VyLT5iY190cCwKKwkJCQljdXItPmJjX3ByaXZhdGUuaS5hZ25vLCBJTlRfR0VUKGxlZnQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpLCAwLAorCQkJCSZycmJwLCBYRlNfSU5PX0JUUkVFX1JFRikpKQorCQkJcmV0dXJuIGVycm9yOworCQlycmJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhycmJwKTsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBycmJsb2NrLCBsZXZlbCwgcnJicCkpKQorCQkJcmV0dXJuIGVycm9yOworCQlJTlRfU0VUKHJyYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCwgbGJubyk7CisJCXhmc19pbm9idF9sb2dfYmxvY2soY3VyLT5iY190cCwgcnJicCwgWEZTX0JCX0xFRlRTSUIpOworCX0KKwkvKgorCSAqIEZyZWUgdGhlIGRlbGV0aW5nIGJsb2NrLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfZnJlZV9leHRlbnQoY3VyLT5iY190cCwgWEZTX0FHQl9UT19GU0IobXAsCisJCQkJICAgICBjdXItPmJjX3ByaXZhdGUuaS5hZ25vLCByYm5vKSwgMSkpKQorCQlyZXR1cm4gZXJyb3I7CisJeGZzX3RyYW5zX2JpbnZhbChjdXItPmJjX3RwLCByYnApOworCS8qCisJICogUmVhZGp1c3QgdGhlIHB0ciBhdCB0aGlzIGxldmVsIGlmIGl0J3Mgbm90IGEgbGVhZiwgc2luY2UgaXQncworCSAqIHN0aWxsIHBvaW50aW5nIGF0IHRoZSBkZWxldGlvbiBwb2ludCwgd2hpY2ggbWFrZXMgdGhlIGN1cnNvcgorCSAqIGluY29uc2lzdGVudC4gIElmIHRoaXMgbWFrZXMgdGhlIHB0ciAwLCB0aGUgY2FsbGVyIGZpeGVzIGl0IHVwLgorCSAqIFdlIGNhbid0IHVzZSBkZWNyZW1lbnQgYmVjYXVzZSBpdCB3b3VsZCBjaGFuZ2UgdGhlIG5leHQgbGV2ZWwgdXAuCisJICovCisJaWYgKGxldmVsID4gMCkKKwkJY3VyLT5iY19wdHJzW2xldmVsXS0tOworCS8qCisJICogUmV0dXJuIHZhbHVlIG1lYW5zIHRoZSBuZXh0IGxldmVsIHVwIGhhcyBzb21ldGhpbmcgdG8gZG8uCisJICovCisJKnN0YXQgPSAyOworCXJldHVybiAwOworCitlcnJvcjA6CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBJbnNlcnQgb25lIHJlY29yZC9sZXZlbC4gIFJldHVybiBpbmZvcm1hdGlvbiB0byB0aGUgY2FsbGVyCisgKiBhbGxvd2luZyB0aGUgbmV4dCBsZXZlbCB1cCB0byBwcm9jZWVkIGlmIG5lY2Vzc2FyeS4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2lub2J0X2luc3JlYygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldmVsLAkvKiBsZXZlbCB0byBpbnNlcnQgcmVjb3JkIGF0ICovCisJeGZzX2FnYmxvY2tfdAkJKmJub3AsCS8qIGkvbzogYmxvY2sgbnVtYmVyIGluc2VydGVkICovCisJeGZzX2lub2J0X3JlY190CQkqcmVjcCwJLyogaS9vOiByZWNvcmQgZGF0YSBpbnNlcnRlZCAqLworCXhmc19idHJlZV9jdXJfdAkJKipjdXJwLAkvKiBvdXRwdXQ6IG5ldyBjdXJzb3IgcmVwbGFjaW5nIGN1ciAqLworCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwl4ZnNfaW5vYnRfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrIHJlY29yZC9rZXkgbGl2ZXMgaW4gKi8KKwl4ZnNfYnVmX3QJCSpicDsJLyogYnVmZmVyIGZvciBibG9jayAqLworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlpOwkvKiBsb29wIGluZGV4ICovCisJeGZzX2lub2J0X2tleV90CQlrZXk7CS8qIGtleSB2YWx1ZSBiZWluZyBpbnNlcnRlZCAqLworCXhmc19pbm9idF9rZXlfdAkJKmtwPU5VTEw7CS8qIHBvaW50ZXIgdG8gYnRyZWUga2V5cyAqLworCXhmc19hZ2Jsb2NrX3QJCW5ibm87CS8qIGJsb2NrIG51bWJlciBvZiBhbGxvY2F0ZWQgYmxvY2sgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJCSpuY3VyOwkvKiBuZXcgY3Vyc29yIHRvIGJlIHVzZWQgYXQgbmV4dCBsdmwgKi8KKwl4ZnNfaW5vYnRfa2V5X3QJCW5rZXk7CS8qIG5ldyBrZXkgdmFsdWUsIGZyb20gc3BsaXQgKi8KKwl4ZnNfaW5vYnRfcmVjX3QJCW5yZWM7CS8qIG5ldyByZWNvcmQgdmFsdWUsIGZvciBjYWxsZXIgKi8KKwlpbnQJCQludW1yZWNzOworCWludAkJCW9wdHI7CS8qIG9sZCBwdHIgdmFsdWUgKi8KKwl4ZnNfaW5vYnRfcHRyX3QJCSpwcDsJLyogcG9pbnRlciB0byBidHJlZSBhZGRyZXNzZXMgKi8KKwlpbnQJCQlwdHI7CS8qIGluZGV4IGluIGJ0cmVlIGJsb2NrIGZvciB0aGlzIHJlYyAqLworCXhmc19pbm9idF9yZWNfdAkJKnJwPU5VTEw7CS8qIHBvaW50ZXIgdG8gYnRyZWUgcmVjb3JkcyAqLworCisJLyoKKwkgKiBJZiB3ZSBtYWRlIGl0IHRvIHRoZSByb290IGxldmVsLCBhbGxvY2F0ZSBhIG5ldyByb290IGJsb2NrCisJICogYW5kIHdlJ3JlIGRvbmUuCisJICovCisJaWYgKGxldmVsID49IGN1ci0+YmNfbmxldmVscykgeworCQllcnJvciA9IHhmc19pbm9idF9uZXdyb290KGN1ciwgJmkpOworCQkqYm5vcCA9IE5VTExBR0JMT0NLOworCQkqc3RhdCA9IGk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBNYWtlIGEga2V5IG91dCBvZiB0aGUgcmVjb3JkIGRhdGEgdG8gYmUgaW5zZXJ0ZWQsIGFuZCBzYXZlIGl0LgorCSAqLworCWtleS5pcl9zdGFydGlubyA9IHJlY3AtPmlyX3N0YXJ0aW5vOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCW9wdHIgPSBwdHIgPSBjdXItPmJjX3B0cnNbbGV2ZWxdOworCS8qCisJICogSWYgd2UncmUgb2ZmIHRoZSBsZWZ0IGVkZ2UsIHJldHVybiBmYWlsdXJlLgorCSAqLworCWlmIChwdHIgPT0gMCkgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIEdldCBwb2ludGVycyB0byB0aGUgYnRyZWUgYnVmZmVyIGFuZCBibG9jay4KKwkgKi8KKwlicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CisJYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGJwKTsKKwludW1yZWNzID0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKyNpZmRlZiBERUJVRworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCkpKQorCQlyZXR1cm4gZXJyb3I7CisJLyoKKwkgKiBDaGVjayB0aGF0IHRoZSBuZXcgZW50cnkgaXMgYmVpbmcgaW5zZXJ0ZWQgaW4gdGhlIHJpZ2h0IHBsYWNlLgorCSAqLworCWlmIChwdHIgPD0gbnVtcmVjcykgeworCQlpZiAobGV2ZWwgPT0gMCkgeworCQkJcnAgPSBYRlNfSU5PQlRfUkVDX0FERFIoYmxvY2ssIHB0ciwgY3VyKTsKKwkJCXhmc19idHJlZV9jaGVja19yZWMoY3VyLT5iY19idG51bSwgcmVjcCwgcnApOworCQl9IGVsc2UgeworCQkJa3AgPSBYRlNfSU5PQlRfS0VZX0FERFIoYmxvY2ssIHB0ciwgY3VyKTsKKwkJCXhmc19idHJlZV9jaGVja19rZXkoY3VyLT5iY19idG51bSwgJmtleSwga3ApOworCQl9CisJfQorI2VuZGlmCisJbmJubyA9IE5VTExBR0JMT0NLOworCW5jdXIgPSAoeGZzX2J0cmVlX2N1cl90ICopMDsKKwkvKgorCSAqIElmIHRoZSBibG9jayBpcyBmdWxsLCB3ZSBjYW4ndCBpbnNlcnQgdGhlIG5ldyBlbnRyeSB1bnRpbCB3ZQorCSAqIG1ha2UgdGhlIGJsb2NrIHVuLWZ1bGwuCisJICovCisJaWYgKG51bXJlY3MgPT0gWEZTX0lOT0JUX0JMT0NLX01BWFJFQ1MobGV2ZWwsIGN1cikpIHsKKwkJLyoKKwkJICogRmlyc3QsIHRyeSBzaGlmdGluZyBhbiBlbnRyeSB0byB0aGUgcmlnaHQgbmVpZ2hib3IuCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX2lub2J0X3JzaGlmdChjdXIsIGxldmVsLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQlpZiAoaSkgeworCQkJLyogbm90aGluZyAqLworCQl9CisJCS8qCisJCSAqIE5leHQsIHRyeSBzaGlmdGluZyBhbiBlbnRyeSB0byB0aGUgbGVmdCBuZWlnaGJvci4KKwkJICovCisJCWVsc2UgeworCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9sc2hpZnQoY3VyLCBsZXZlbCwgJmkpKSkKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQlpZiAoaSkgeworCQkJCW9wdHIgPSBwdHIgPSBjdXItPmJjX3B0cnNbbGV2ZWxdOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIE5leHQsIHRyeSBzcGxpdHRpbmcgdGhlIGN1cnJlbnQgYmxvY2sKKwkJCQkgKiBpbiBoYWxmLiBJZiB0aGlzIHdvcmtzIHdlIGhhdmUgdG8KKwkJCQkgKiByZS1zZXQgb3VyIHZhcmlhYmxlcyBiZWNhdXNlCisJCQkJICogd2UgY291bGQgYmUgaW4gYSBkaWZmZXJlbnQgYmxvY2sgbm93LgorCQkJCSAqLworCQkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfc3BsaXQoY3VyLCBsZXZlbCwgJm5ibm8sCisJCQkJCQkmbmtleSwgJm5jdXIsICZpKSkpCisJCQkJCXJldHVybiBlcnJvcjsKKwkJCQlpZiAoaSkgeworCQkJCQlicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CisJCQkJCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7CisjaWZkZWYgREVCVUcKKwkJCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLAorCQkJCQkJCWJsb2NrLCBsZXZlbCwgYnApKSkKKwkJCQkJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCQkJCQlwdHIgPSBjdXItPmJjX3B0cnNbbGV2ZWxdOworCQkJCQlucmVjLmlyX3N0YXJ0aW5vID0gbmtleS5pcl9zdGFydGlubzsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBPdGhlcndpc2UgdGhlIGluc2VydCBmYWlscy4KKwkJCQkJICovCisJCQkJCSpzdGF0ID0gMDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQl9CisJfQorCS8qCisJICogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZXJlJ3Mgcm9vbSBmb3Igb3VyIG5ldyBlbnRyeSBpbiB0aGUgYmxvY2sKKwkgKiB3ZSdyZSBwb2ludGluZyBhdC4KKwkgKi8KKwludW1yZWNzID0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwlpZiAobGV2ZWwgPiAwKSB7CisJCS8qCisJCSAqIEl0J3MgYSBub24tbGVhZiBlbnRyeS4gIE1ha2UgYSBob2xlIGZvciB0aGUgbmV3IGRhdGEKKwkJICogaW4gdGhlIGtleSBhbmQgcHRyIHJlZ2lvbnMgb2YgdGhlIGJsb2NrLgorCQkgKi8KKwkJa3AgPSBYRlNfSU5PQlRfS0VZX0FERFIoYmxvY2ssIDEsIGN1cik7CisJCXBwID0gWEZTX0lOT0JUX1BUUl9BRERSKGJsb2NrLCAxLCBjdXIpOworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IG51bXJlY3M7IGkgPj0gcHRyOyBpLS0pIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIElOVF9HRVQocHBbaSAtIDFdLCBBUkNIX0NPTlZFUlQpLCBsZXZlbCkpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJfQorI2VuZGlmCisJCW1lbW1vdmUoJmtwW3B0cl0sICZrcFtwdHIgLSAxXSwKKwkJCShudW1yZWNzIC0gcHRyICsgMSkgKiBzaXplb2YoKmtwKSk7CisJCW1lbW1vdmUoJnBwW3B0cl0sICZwcFtwdHIgLSAxXSwKKwkJCShudW1yZWNzIC0gcHRyICsgMSkgKiBzaXplb2YoKnBwKSk7CisJCS8qCisJCSAqIE5vdyBzdHVmZiB0aGUgbmV3IGRhdGEgaW4sIGJ1bXAgbnVtcmVjcyBhbmQgbG9nIHRoZSBuZXcgZGF0YS4KKwkJICovCisjaWZkZWYgREVCVUcKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgKmJub3AsIGxldmVsKSkpCisJCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkJa3BbcHRyIC0gMV0gPSBrZXk7IC8qIElOVF86IHN0cnVjdCBjb3B5ICovCisJCUlOVF9TRVQocHBbcHRyIC0gMV0sIEFSQ0hfQ09OVkVSVCwgKmJub3ApOworCQludW1yZWNzKys7CisJCUlOVF9TRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgbnVtcmVjcyk7CisJCXhmc19pbm9idF9sb2dfa2V5cyhjdXIsIGJwLCBwdHIsIG51bXJlY3MpOworCQl4ZnNfaW5vYnRfbG9nX3B0cnMoY3VyLCBicCwgcHRyLCBudW1yZWNzKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBJdCdzIGEgbGVhZiBlbnRyeS4gIE1ha2UgYSBob2xlIGZvciB0aGUgbmV3IHJlY29yZC4KKwkJICovCisJCXJwID0gWEZTX0lOT0JUX1JFQ19BRERSKGJsb2NrLCAxLCBjdXIpOworCQltZW1tb3ZlKCZycFtwdHJdLCAmcnBbcHRyIC0gMV0sCisJCQkobnVtcmVjcyAtIHB0ciArIDEpICogc2l6ZW9mKCpycCkpOworCQkvKgorCQkgKiBOb3cgc3R1ZmYgdGhlIG5ldyByZWNvcmQgaW4sIGJ1bXAgbnVtcmVjcworCQkgKiBhbmQgbG9nIHRoZSBuZXcgZGF0YS4KKwkJICovCisJCXJwW3B0ciAtIDFdID0gKnJlY3A7IC8qIElOVF86IHN0cnVjdCBjb3B5ICovCisJCW51bXJlY3MrKzsKKwkJSU5UX1NFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCBudW1yZWNzKTsKKwkJeGZzX2lub2J0X2xvZ19yZWNzKGN1ciwgYnAsIHB0ciwgbnVtcmVjcyk7CisJfQorCS8qCisJICogTG9nIHRoZSBuZXcgbnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIGJ0cmVlIGhlYWRlci4KKwkgKi8KKwl4ZnNfaW5vYnRfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIGJwLCBYRlNfQkJfTlVNUkVDUyk7CisjaWZkZWYgREVCVUcKKwkvKgorCSAqIENoZWNrIHRoYXQgdGhlIGtleS9yZWNvcmQgaXMgaW4gdGhlIHJpZ2h0IHBsYWNlLCBub3cuCisJICovCisJaWYgKHB0ciA8IG51bXJlY3MpIHsKKwkJaWYgKGxldmVsID09IDApCisJCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKGN1ci0+YmNfYnRudW0sIHJwICsgcHRyIC0gMSwKKwkJCQlycCArIHB0cik7CisJCWVsc2UKKwkJCXhmc19idHJlZV9jaGVja19rZXkoY3VyLT5iY19idG51bSwga3AgKyBwdHIgLSAxLAorCQkJCWtwICsgcHRyKTsKKwl9CisjZW5kaWYKKwkvKgorCSAqIElmIHdlIGluc2VydGVkIGF0IHRoZSBzdGFydCBvZiBhIGJsb2NrLCB1cGRhdGUgdGhlIHBhcmVudHMnIGtleXMuCisJICovCisJaWYgKG9wdHIgPT0gMSAmJiAoZXJyb3IgPSB4ZnNfaW5vYnRfdXBka2V5KGN1ciwgJmtleSwgbGV2ZWwgKyAxKSkpCisJCXJldHVybiBlcnJvcjsKKwkvKgorCSAqIFJldHVybiB0aGUgbmV3IGJsb2NrIG51bWJlciwgaWYgYW55LgorCSAqIElmIHRoZXJlIGlzIG9uZSwgZ2l2ZSBiYWNrIGEgcmVjb3JkIHZhbHVlIGFuZCBhIGN1cnNvciB0b28uCisJICovCisJKmJub3AgPSBuYm5vOworCWlmIChuYm5vICE9IE5VTExBR0JMT0NLKSB7CisJCSpyZWNwID0gbnJlYzsgLyogSU5UXzogc3RydWN0IGNvcHkgKi8KKwkJKmN1cnAgPSBuY3VyOworCX0KKwkqc3RhdCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMb2cgaGVhZGVyIGZpZWxkcyBmcm9tIGEgYnRyZWUgYmxvY2suCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfaW5vYnRfbG9nX2Jsb2NrKAorCXhmc190cmFuc190CQkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfYnVmX3QJCSpicCwJLyogYnVmZmVyIGNvbnRhaW5pbmcgYnRyZWUgYmxvY2sgKi8KKwlpbnQJCQlmaWVsZHMpCS8qIG1hc2sgb2YgZmllbGRzOiBYRlNfQkJfLi4uICovCit7CisJaW50CQkJZmlyc3Q7CS8qIGZpcnN0IGJ5dGUgb2Zmc2V0IGxvZ2dlZCAqLworCWludAkJCWxhc3Q7CS8qIGxhc3QgYnl0ZSBvZmZzZXQgbG9nZ2VkICovCisJc3RhdGljIGNvbnN0IHNob3J0CW9mZnNldHNbXSA9IHsJLyogdGFibGUgb2Ygb2Zmc2V0cyAqLworCQlvZmZzZXRvZih4ZnNfaW5vYnRfYmxvY2tfdCwgYmJfbWFnaWMpLAorCQlvZmZzZXRvZih4ZnNfaW5vYnRfYmxvY2tfdCwgYmJfbGV2ZWwpLAorCQlvZmZzZXRvZih4ZnNfaW5vYnRfYmxvY2tfdCwgYmJfbnVtcmVjcyksCisJCW9mZnNldG9mKHhmc19pbm9idF9ibG9ja190LCBiYl9sZWZ0c2liKSwKKwkJb2Zmc2V0b2YoeGZzX2lub2J0X2Jsb2NrX3QsIGJiX3JpZ2h0c2liKSwKKwkJc2l6ZW9mKHhmc19pbm9idF9ibG9ja190KQorCX07CisKKwl4ZnNfYnRyZWVfb2Zmc2V0cyhmaWVsZHMsIG9mZnNldHMsIFhGU19CQl9OVU1fQklUUywgJmZpcnN0LCAmbGFzdCk7CisJeGZzX3RyYW5zX2xvZ19idWYodHAsIGJwLCBmaXJzdCwgbGFzdCk7Cit9CisKKy8qCisgKiBMb2cga2V5cyBmcm9tIGEgYnRyZWUgYmxvY2sgKG5vbmxlYWYpLgorICovCitTVEFUSUMgdm9pZAoreGZzX2lub2J0X2xvZ19rZXlzKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2J1Zl90CQkqYnAsCS8qIGJ1ZmZlciBjb250YWluaW5nIGJ0cmVlIGJsb2NrICovCisJaW50CQkJa2ZpcnN0LAkvKiBpbmRleCBvZiBmaXJzdCBrZXkgdG8gbG9nICovCisJaW50CQkJa2xhc3QpCS8qIGluZGV4IG9mIGxhc3Qga2V5IHRvIGxvZyAqLworeworCXhmc19pbm9idF9ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgdG8gbG9nIGZyb20gKi8KKwlpbnQJCQlmaXJzdDsJLyogZmlyc3QgYnl0ZSBvZmZzZXQgbG9nZ2VkICovCisJeGZzX2lub2J0X2tleV90CQkqa3A7CS8qIGtleSBwb2ludGVyIGluIGJ0cmVlIGJsb2NrICovCisJaW50CQkJbGFzdDsJLyogbGFzdCBieXRlIG9mZnNldCBsb2dnZWQgKi8KKworCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7CisJa3AgPSBYRlNfSU5PQlRfS0VZX0FERFIoYmxvY2ssIDEsIGN1cik7CisJZmlyc3QgPSAoaW50KSgoeGZzX2NhZGRyX3QpJmtwW2tmaXJzdCAtIDFdIC0gKHhmc19jYWRkcl90KWJsb2NrKTsKKwlsYXN0ID0gKGludCkoKCh4ZnNfY2FkZHJfdCkma3Bba2xhc3RdIC0gMSkgLSAoeGZzX2NhZGRyX3QpYmxvY2spOworCXhmc190cmFuc19sb2dfYnVmKGN1ci0+YmNfdHAsIGJwLCBmaXJzdCwgbGFzdCk7Cit9CisKKy8qCisgKiBMb2cgYmxvY2sgcG9pbnRlciBmaWVsZHMgZnJvbSBhIGJ0cmVlIGJsb2NrIChub25sZWFmKS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19pbm9idF9sb2dfcHRycygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19idWZfdAkJKmJwLAkvKiBidWZmZXIgY29udGFpbmluZyBidHJlZSBibG9jayAqLworCWludAkJCXBmaXJzdCwJLyogaW5kZXggb2YgZmlyc3QgcG9pbnRlciB0byBsb2cgKi8KKwlpbnQJCQlwbGFzdCkJLyogaW5kZXggb2YgbGFzdCBwb2ludGVyIHRvIGxvZyAqLworeworCXhmc19pbm9idF9ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgdG8gbG9nIGZyb20gKi8KKwlpbnQJCQlmaXJzdDsJLyogZmlyc3QgYnl0ZSBvZmZzZXQgbG9nZ2VkICovCisJaW50CQkJbGFzdDsJLyogbGFzdCBieXRlIG9mZnNldCBsb2dnZWQgKi8KKwl4ZnNfaW5vYnRfcHRyX3QJCSpwcDsJLyogYmxvY2stcG9pbnRlciBwb2ludGVyIGluIGJ0cmVlIGJsayAqLworCisJYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGJwKTsKKwlwcCA9IFhGU19JTk9CVF9QVFJfQUREUihibG9jaywgMSwgY3VyKTsKKwlmaXJzdCA9IChpbnQpKCh4ZnNfY2FkZHJfdCkmcHBbcGZpcnN0IC0gMV0gLSAoeGZzX2NhZGRyX3QpYmxvY2spOworCWxhc3QgPSAoaW50KSgoKHhmc19jYWRkcl90KSZwcFtwbGFzdF0gLSAxKSAtICh4ZnNfY2FkZHJfdClibG9jayk7CisJeGZzX3RyYW5zX2xvZ19idWYoY3VyLT5iY190cCwgYnAsIGZpcnN0LCBsYXN0KTsKK30KKworLyoKKyAqIExvZyByZWNvcmRzIGZyb20gYSBidHJlZSBibG9jayAobGVhZikuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfaW5vYnRfbG9nX3JlY3MoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYnVmX3QJCSpicCwJLyogYnVmZmVyIGNvbnRhaW5pbmcgYnRyZWUgYmxvY2sgKi8KKwlpbnQJCQlyZmlyc3QsCS8qIGluZGV4IG9mIGZpcnN0IHJlY29yZCB0byBsb2cgKi8KKwlpbnQJCQlybGFzdCkJLyogaW5kZXggb2YgbGFzdCByZWNvcmQgdG8gbG9nICovCit7CisJeGZzX2lub2J0X2Jsb2NrX3QJKmJsb2NrOwkvKiBidHJlZSBibG9jayB0byBsb2cgZnJvbSAqLworCWludAkJCWZpcnN0OwkvKiBmaXJzdCBieXRlIG9mZnNldCBsb2dnZWQgKi8KKwlpbnQJCQlsYXN0OwkvKiBsYXN0IGJ5dGUgb2Zmc2V0IGxvZ2dlZCAqLworCXhmc19pbm9idF9yZWNfdAkJKnJwOwkvKiByZWNvcmQgcG9pbnRlciBmb3IgYnRyZWUgYmxvY2sgKi8KKworCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7CisJcnAgPSBYRlNfSU5PQlRfUkVDX0FERFIoYmxvY2ssIDEsIGN1cik7CisJZmlyc3QgPSAoaW50KSgoeGZzX2NhZGRyX3QpJnJwW3JmaXJzdCAtIDFdIC0gKHhmc19jYWRkcl90KWJsb2NrKTsKKwlsYXN0ID0gKGludCkoKCh4ZnNfY2FkZHJfdCkmcnBbcmxhc3RdIC0gMSkgLSAoeGZzX2NhZGRyX3QpYmxvY2spOworCXhmc190cmFuc19sb2dfYnVmKGN1ci0+YmNfdHAsIGJwLCBmaXJzdCwgbGFzdCk7Cit9CisKKy8qCisgKiBMb29rdXAgdGhlIHJlY29yZC4gIFRoZSBjdXJzb3IgaXMgbWFkZSB0byBwb2ludCB0byBpdCwgYmFzZWQgb24gZGlyLgorICogUmV0dXJuIDAgaWYgY2FuJ3QgZmluZCBhbnkgc3VjaCByZWNvcmQsIDEgZm9yIHN1Y2Nlc3MuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF9sb29rdXAoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfbG9va3VwX3QJCWRpciwJLyogPD0sID09LCBvciA+PSAqLworCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwl4ZnNfYWdibG9ja190CQlhZ2JubzsJLyogYS5nLiByZWxhdGl2ZSBidHJlZSBibG9jayBudW1iZXIgKi8KKwl4ZnNfYWdudW1iZXJfdAkJYWdubzsJLyogYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwl4ZnNfaW5vYnRfYmxvY2tfdAkqYmxvY2s9TlVMTDsJLyogY3VycmVudCBidHJlZSBibG9jayAqLworCV9faW50NjRfdAkJZGlmZjsJLyogZGlmZmVyZW5jZSBmb3IgdGhlIGN1cnJlbnQga2V5ICovCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWtleW5vPTA7CS8qIGN1cnJlbnQga2V5IG51bWJlciAqLworCWludAkJCWxldmVsOwkvKiBsZXZlbCBpbiB0aGUgYnRyZWUgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCisJLyoKKwkgKiBHZXQgdGhlIGFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyLCBhbmQgdGhlIHJvb3QgYmxvY2sgbnVtYmVyLgorCSAqLworCW1wID0gY3VyLT5iY19tcDsKKwl7CisJCXhmc19hZ2lfdAkqYWdpOwkvKiBhLmcuIGlub2RlIGhlYWRlciAqLworCisJCWFnaSA9IFhGU19CVUZfVE9fQUdJKGN1ci0+YmNfcHJpdmF0ZS5pLmFnYnApOworCQlhZ25vID0gSU5UX0dFVChhZ2ktPmFnaV9zZXFubywgQVJDSF9DT05WRVJUKTsKKwkJYWdibm8gPSBJTlRfR0VUKGFnaS0+YWdpX3Jvb3QsIEFSQ0hfQ09OVkVSVCk7CisJfQorCS8qCisJICogSXRlcmF0ZSBvdmVyIGVhY2ggbGV2ZWwgaW4gdGhlIGJ0cmVlLCBzdGFydGluZyBhdCB0aGUgcm9vdC4KKwkgKiBGb3IgZWFjaCBsZXZlbCBhYm92ZSB0aGUgbGVhdmVzLCBmaW5kIHRoZSBrZXkgd2UgbmVlZCwgYmFzZWQKKwkgKiBvbiB0aGUgbG9va3VwIHJlY29yZCwgdGhlbiBmb2xsb3cgdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sKKwkgKiBwb2ludGVyIGRvd24gdG8gdGhlIG5leHQgbGV2ZWwuCisJICovCisJZm9yIChsZXZlbCA9IGN1ci0+YmNfbmxldmVscyAtIDEsIGRpZmYgPSAxOyBsZXZlbCA+PSAwOyBsZXZlbC0tKSB7CisJCXhmc19idWZfdAkqYnA7CS8qIGJ1ZmZlciBwb2ludGVyIGZvciBidHJlZSBibG9jayAqLworCQl4ZnNfZGFkZHJfdAlkOwkvKiBkaXNrIGFkZHJlc3Mgb2YgYnRyZWUgYmxvY2sgKi8KKworCQkvKgorCQkgKiBHZXQgdGhlIGRpc2sgYWRkcmVzcyB3ZSdyZSBsb29raW5nIGZvci4KKwkJICovCisJCWQgPSBYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLCBhZ2Jubyk7CisJCS8qCisJCSAqIElmIHRoZSBvbGQgYnVmZmVyIGF0IHRoaXMgbGV2ZWwgaXMgZm9yIGEgZGlmZmVyZW50IGJsb2NrLAorCQkgKiB0aHJvdyBpdCBhd2F5LCBvdGhlcndpc2UganVzdCB1c2UgaXQuCisJCSAqLworCQlicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CisJCWlmIChicCAmJiBYRlNfQlVGX0FERFIoYnApICE9IGQpCisJCQlicCA9ICh4ZnNfYnVmX3QgKikwOworCQlpZiAoIWJwKSB7CisJCQkvKgorCQkJICogTmVlZCB0byBnZXQgYSBuZXcgYnVmZmVyLiAgUmVhZCBpdCwgdGhlbgorCQkJICogc2V0IGl0IGluIHRoZSBjdXJzb3IsIHJlbGVhc2luZyB0aGUgb2xkIG9uZS4KKwkJCSAqLworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMobXAsIGN1ci0+YmNfdHAsCisJCQkJCWFnbm8sIGFnYm5vLCAwLCAmYnAsIFhGU19JTk9fQlRSRUVfUkVGKSkpCisJCQkJcmV0dXJuIGVycm9yOworCQkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldmVsLCBicCk7CisJCQkvKgorCQkJICogUG9pbnQgdG8gdGhlIGJ0cmVlIGJsb2NrLCBub3cgdGhhdCB3ZSBoYXZlIHRoZSBidWZmZXIKKwkJCSAqLworCQkJYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGJwKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgYmxvY2ssIGxldmVsLAorCQkJCQlicCkpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJfSBlbHNlCisJCQlibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApOworCQkvKgorCQkgKiBJZiB3ZSBhbHJlYWR5IGhhZCBhIGtleSBtYXRjaCBhdCBhIGhpZ2hlciBsZXZlbCwgd2Uga25vdworCQkgKiB3ZSBuZWVkIHRvIHVzZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhpcyBibG9jay4KKwkJICovCisJCWlmIChkaWZmID09IDApCisJCQlrZXlubyA9IDE7CisJCS8qCisJCSAqIE90aGVyd2lzZSB3ZSBuZWVkIHRvIHNlYXJjaCB0aGlzIGJsb2NrLiAgRG8gYSBiaW5hcnkgc2VhcmNoLgorCQkgKi8KKwkJZWxzZSB7CisJCQlpbnQJCWhpZ2g7CS8qIGhpZ2ggZW50cnkgbnVtYmVyICovCisJCQl4ZnNfaW5vYnRfa2V5X3QJKmtrYmFzZT1OVUxMOy8qIGJhc2Ugb2Yga2V5cyBpbiBibG9jayAqLworCQkJeGZzX2lub2J0X3JlY190CSprcmJhc2U9TlVMTDsvKiBiYXNlIG9mIHJlY29yZHMgaW4gYmxvY2sgKi8KKwkJCWludAkJbG93OwkvKiBsb3cgZW50cnkgbnVtYmVyICovCisKKwkJCS8qCisJCQkgKiBHZXQgYSBwb2ludGVyIHRvIGtleXMgb3IgcmVjb3Jkcy4KKwkJCSAqLworCQkJaWYgKGxldmVsID4gMCkKKwkJCQlra2Jhc2UgPSBYRlNfSU5PQlRfS0VZX0FERFIoYmxvY2ssIDEsIGN1cik7CisJCQllbHNlCisJCQkJa3JiYXNlID0gWEZTX0lOT0JUX1JFQ19BRERSKGJsb2NrLCAxLCBjdXIpOworCQkJLyoKKwkJCSAqIFNldCBsb3cgYW5kIGhpZ2ggZW50cnkgbnVtYmVycywgMS1iYXNlZC4KKwkJCSAqLworCQkJbG93ID0gMTsKKwkJCWlmICghKGhpZ2ggPSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKSkgeworCQkJCS8qCisJCQkJICogSWYgdGhlIGJsb2NrIGlzIGVtcHR5LCB0aGUgdHJlZSBtdXN0CisJCQkJICogYmUgYW4gZW1wdHkgbGVhZi4KKwkJCQkgKi8KKwkJCQlBU1NFUlQobGV2ZWwgPT0gMCAmJiBjdXItPmJjX25sZXZlbHMgPT0gMSk7CisJCQkJY3VyLT5iY19wdHJzWzBdID0gZGlyICE9IFhGU19MT09LVVBfTEU7CisJCQkJKnN0YXQgPSAwOworCQkJCXJldHVybiAwOworCQkJfQorCQkJLyoKKwkJCSAqIEJpbmFyeSBzZWFyY2ggdGhlIGJsb2NrLgorCQkJICovCisJCQl3aGlsZSAobG93IDw9IGhpZ2gpIHsKKwkJCQl4ZnNfYWdpbm9fdAlzdGFydGlubzsJLyoga2V5IHZhbHVlICovCisKKwkJCQkvKgorCQkJCSAqIGtleW5vIGlzIGF2ZXJhZ2Ugb2YgbG93IGFuZCBoaWdoLgorCQkJCSAqLworCQkJCWtleW5vID0gKGxvdyArIGhpZ2gpID4+IDE7CisJCQkJLyoKKwkJCQkgKiBHZXQgc3RhcnRpbm8uCisJCQkJICovCisJCQkJaWYgKGxldmVsID4gMCkgeworCQkJCQl4ZnNfaW5vYnRfa2V5X3QJKmtrcDsKKworCQkJCQlra3AgPSBra2Jhc2UgKyBrZXlubyAtIDE7CisJCQkJCXN0YXJ0aW5vID0gSU5UX0dFVChra3AtPmlyX3N0YXJ0aW5vLCBBUkNIX0NPTlZFUlQpOworCQkJCX0gZWxzZSB7CisJCQkJCXhmc19pbm9idF9yZWNfdAkqa3JwOworCisJCQkJCWtycCA9IGtyYmFzZSArIGtleW5vIC0gMTsKKwkJCQkJc3RhcnRpbm8gPSBJTlRfR0VUKGtycC0+aXJfc3RhcnRpbm8sIEFSQ0hfQ09OVkVSVCk7CisJCQkJfQorCQkJCS8qCisJCQkJICogQ29tcHV0ZSBkaWZmZXJlbmNlIHRvIGdldCBuZXh0IGRpcmVjdGlvbi4KKwkJCQkgKi8KKwkJCQlkaWZmID0gKF9faW50NjRfdCkKKwkJCQkJc3RhcnRpbm8gLSBjdXItPmJjX3JlYy5pLmlyX3N0YXJ0aW5vOworCQkJCS8qCisJCQkJICogTGVzcyB0aGFuLCBtb3ZlIHJpZ2h0LgorCQkJCSAqLworCQkJCWlmIChkaWZmIDwgMCkKKwkJCQkJbG93ID0ga2V5bm8gKyAxOworCQkJCS8qCisJCQkJICogR3JlYXRlciB0aGFuLCBtb3ZlIGxlZnQuCisJCQkJICovCisJCQkJZWxzZSBpZiAoZGlmZiA+IDApCisJCQkJCWhpZ2ggPSBrZXlubyAtIDE7CisJCQkJLyoKKwkJCQkgKiBFcXVhbCwgd2UncmUgZG9uZS4KKwkJCQkgKi8KKwkJCQllbHNlCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qCisJCSAqIElmIHRoZXJlIGFyZSBtb3JlIGxldmVscywgc2V0IHVwIGZvciB0aGUgbmV4dCBsZXZlbAorCQkgKiBieSBnZXR0aW5nIHRoZSBibG9jayBudW1iZXIgYW5kIGZpbGxpbmcgaW4gdGhlIGN1cnNvci4KKwkJICovCisJCWlmIChsZXZlbCA+IDApIHsKKwkJCS8qCisJCQkgKiBJZiB3ZSBtb3ZlZCBsZWZ0LCBuZWVkIHRoZSBwcmV2aW91cyBrZXkgbnVtYmVyLAorCQkJICogdW5sZXNzIHRoZXJlIGlzbid0IG9uZS4KKwkJCSAqLworCQkJaWYgKGRpZmYgPiAwICYmIC0ta2V5bm8gPCAxKQorCQkJCWtleW5vID0gMTsKKwkJCWFnYm5vID0gSU5UX0dFVCgqWEZTX0lOT0JUX1BUUl9BRERSKGJsb2NrLCBrZXlubywgY3VyKSwgQVJDSF9DT05WRVJUKTsKKyNpZmRlZiBERUJVRworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgYWdibm8sIGxldmVsKSkpCisJCQkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJCQljdXItPmJjX3B0cnNbbGV2ZWxdID0ga2V5bm87CisJCX0KKwl9CisJLyoKKwkgKiBEb25lIHdpdGggdGhlIHNlYXJjaC4KKwkgKiBTZWUgaWYgd2UgbmVlZCB0byBhZGp1c3QgdGhlIHJlc3VsdHMuCisJICovCisJaWYgKGRpciAhPSBYRlNfTE9PS1VQX0xFICYmIGRpZmYgPCAwKSB7CisJCWtleW5vKys7CisJCS8qCisJCSAqIElmIGdlIHNlYXJjaCBhbmQgd2Ugd2VudCBvZmYgdGhlIGVuZCBvZiB0aGUgYmxvY2ssIGJ1dCBpdCdzCisJCSAqIG5vdCB0aGUgbGFzdCBibG9jaywgd2UncmUgaW4gdGhlIHdyb25nIGJsb2NrLgorCQkgKi8KKwkJaWYgKGRpciA9PSBYRlNfTE9PS1VQX0dFICYmCisJCSAgICBrZXlubyA+IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgJiYKKwkJICAgIElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpICE9IE5VTExBR0JMT0NLKSB7CisJCQlpbnQJaTsKKworCQkJY3VyLT5iY19wdHJzWzBdID0ga2V5bm87CisJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2luY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQkJcmV0dXJuIGVycm9yOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQkqc3RhdCA9IDE7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwllbHNlIGlmIChkaXIgPT0gWEZTX0xPT0tVUF9MRSAmJiBkaWZmID4gMCkKKwkJa2V5bm8tLTsKKwljdXItPmJjX3B0cnNbMF0gPSBrZXlubzsKKwkvKgorCSAqIFJldHVybiBpZiB3ZSBzdWNjZWVkZWQgb3Igbm90LgorCSAqLworCWlmIChrZXlubyA9PSAwIHx8IGtleW5vID4gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkKKwkJKnN0YXQgPSAwOworCWVsc2UKKwkJKnN0YXQgPSAoKGRpciAhPSBYRlNfTE9PS1VQX0VRKSB8fCAoZGlmZiA9PSAwKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNb3ZlIDEgcmVjb3JkIGxlZnQgZnJvbSBjdXIvbGV2ZWwgaWYgcG9zc2libGUuCisgKiBVcGRhdGUgY3VyIHRvIHJlZmxlY3QgdGhlIG5ldyBwYXRoLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfaW5vYnRfbHNoaWZ0KAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIHRvIHNoaWZ0IHJlY29yZCBvbiAqLworCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisjaWZkZWYgREVCVUcKKwlpbnQJCQlpOwkvKiBsb29wIGluZGV4ICovCisjZW5kaWYKKwl4ZnNfaW5vYnRfa2V5X3QJCWtleTsJLyoga2V5IHZhbHVlIGZvciBsZWFmIGxldmVsIHVwd2FyZCAqLworCXhmc19idWZfdAkJKmxicDsJLyogYnVmZmVyIGZvciBsZWZ0IG5laWdoYm9yIGJsb2NrICovCisJeGZzX2lub2J0X2Jsb2NrX3QJKmxlZnQ7CS8qIGxlZnQgbmVpZ2hib3IgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfaW5vYnRfa2V5X3QJCSpsa3A9TlVMTDsJLyoga2V5IHBvaW50ZXIgZm9yIGxlZnQgYmxvY2sgKi8KKwl4ZnNfaW5vYnRfcHRyX3QJCSpscHA7CS8qIGFkZHJlc3MgcG9pbnRlciBmb3IgbGVmdCBibG9jayAqLworCXhmc19pbm9idF9yZWNfdAkJKmxycD1OVUxMOwkvKiByZWNvcmQgcG9pbnRlciBmb3IgbGVmdCBibG9jayAqLworCWludAkJCW5yZWM7CS8qIG5ldyBudW1iZXIgb2YgbGVmdCBibG9jayBlbnRyaWVzICovCisJeGZzX2J1Zl90CQkqcmJwOwkvKiBidWZmZXIgZm9yIHJpZ2h0IChjdXJyZW50KSBibG9jayAqLworCXhmc19pbm9idF9ibG9ja190CSpyaWdodDsJLyogcmlnaHQgKGN1cnJlbnQpIGJ0cmVlIGJsb2NrICovCisJeGZzX2lub2J0X2tleV90CQkqcmtwPU5VTEw7CS8qIGtleSBwb2ludGVyIGZvciByaWdodCBibG9jayAqLworCXhmc19pbm9idF9wdHJfdAkJKnJwcD1OVUxMOwkvKiBhZGRyZXNzIHBvaW50ZXIgZm9yIHJpZ2h0IGJsb2NrICovCisJeGZzX2lub2J0X3JlY190CQkqcnJwPU5VTEw7CS8qIHJlY29yZCBwb2ludGVyIGZvciByaWdodCBibG9jayAqLworCisJLyoKKwkgKiBTZXQgdXAgdmFyaWFibGVzIGZvciB0aGlzIGJsb2NrIGFzICJyaWdodCIuCisJICovCisJcmJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKKwlyaWdodCA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0socmJwKTsKKyNpZmRlZiBERUJVRworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgcmlnaHQsIGxldmVsLCByYnApKSkKKwkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJLyoKKwkgKiBJZiB3ZSd2ZSBnb3Qgbm8gbGVmdCBzaWJsaW5nIHRoZW4gd2UgY2FuJ3Qgc2hpZnQgYW4gZW50cnkgbGVmdC4KKwkgKi8KKwlpZiAoSU5UX0dFVChyaWdodC0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMQUdCTE9DSykgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIElmIHRoZSBjdXJzb3IgZW50cnkgaXMgdGhlIG9uZSB0aGF0IHdvdWxkIGJlIG1vdmVkLCBkb24ndAorCSAqIGRvIGl0Li4uIGl0J3MgdG9vIGNvbXBsaWNhdGVkLgorCSAqLworCWlmIChjdXItPmJjX3B0cnNbbGV2ZWxdIDw9IDEpIHsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBTZXQgdXAgdGhlIGxlZnQgbmVpZ2hib3IgYXMgImxlZnQiLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfdHAsCisJCQljdXItPmJjX3ByaXZhdGUuaS5hZ25vLCBJTlRfR0VUKHJpZ2h0LT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpLCAwLCAmbGJwLAorCQkJWEZTX0lOT19CVFJFRV9SRUYpKSkKKwkJcmV0dXJuIGVycm9yOworCWxlZnQgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGxicCk7CisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBsZWZ0LCBsZXZlbCwgbGJwKSkpCisJCXJldHVybiBlcnJvcjsKKwkvKgorCSAqIElmIGl0J3MgZnVsbCwgaXQgY2FuJ3QgdGFrZSBhbm90aGVyIGVudHJ5LgorCSAqLworCWlmIChJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0lOT0JUX0JMT0NLX01BWFJFQ1MobGV2ZWwsIGN1cikpIHsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJbnJlYyA9IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDE7CisJLyoKKwkgKiBJZiBub24tbGVhZiwgY29weSBhIGtleSBhbmQgYSBwdHIgdG8gdGhlIGxlZnQgYmxvY2suCisJICovCisJaWYgKGxldmVsID4gMCkgeworCQlsa3AgPSBYRlNfSU5PQlRfS0VZX0FERFIobGVmdCwgbnJlYywgY3VyKTsKKwkJcmtwID0gWEZTX0lOT0JUX0tFWV9BRERSKHJpZ2h0LCAxLCBjdXIpOworCQkqbGtwID0gKnJrcDsKKwkJeGZzX2lub2J0X2xvZ19rZXlzKGN1ciwgbGJwLCBucmVjLCBucmVjKTsKKwkJbHBwID0gWEZTX0lOT0JUX1BUUl9BRERSKGxlZnQsIG5yZWMsIGN1cik7CisJCXJwcCA9IFhGU19JTk9CVF9QVFJfQUREUihyaWdodCwgMSwgY3VyKTsKKyNpZmRlZiBERUJVRworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCBJTlRfR0VUKCpycHAsIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpCisJCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkJKmxwcCA9ICpycHA7IC8qIElOVF86IG5vLWNoYW5nZSBjb3B5ICovCisJCXhmc19pbm9idF9sb2dfcHRycyhjdXIsIGxicCwgbnJlYywgbnJlYyk7CisJfQorCS8qCisJICogSWYgbGVhZiwgY29weSBhIHJlY29yZCB0byB0aGUgbGVmdCBibG9jay4KKwkgKi8KKwllbHNlIHsKKwkJbHJwID0gWEZTX0lOT0JUX1JFQ19BRERSKGxlZnQsIG5yZWMsIGN1cik7CisJCXJycCA9IFhGU19JTk9CVF9SRUNfQUREUihyaWdodCwgMSwgY3VyKTsKKwkJKmxycCA9ICpycnA7CisJCXhmc19pbm9idF9sb2dfcmVjcyhjdXIsIGxicCwgbnJlYywgbnJlYyk7CisJfQorCS8qCisJICogQnVtcCBhbmQgbG9nIGxlZnQncyBudW1yZWNzLCBkZWNyZW1lbnQgYW5kIGxvZyByaWdodCdzIG51bXJlY3MuCisJICovCisJSU5UX01PRChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsICsxKTsKKwl4ZnNfaW5vYnRfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIGxicCwgWEZTX0JCX05VTVJFQ1MpOworI2lmZGVmIERFQlVHCisJaWYgKGxldmVsID4gMCkKKwkJeGZzX2J0cmVlX2NoZWNrX2tleShjdXItPmJjX2J0bnVtLCBsa3AgLSAxLCBsa3ApOworCWVsc2UKKwkJeGZzX2J0cmVlX2NoZWNrX3JlYyhjdXItPmJjX2J0bnVtLCBscnAgLSAxLCBscnApOworI2VuZGlmCisJSU5UX01PRChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAtMSk7CisJeGZzX2lub2J0X2xvZ19ibG9jayhjdXItPmJjX3RwLCByYnAsIFhGU19CQl9OVU1SRUNTKTsKKwkvKgorCSAqIFNsaWRlIHRoZSBjb250ZW50cyBvZiByaWdodCBkb3duIG9uZSBlbnRyeS4KKwkgKi8KKwlpZiAobGV2ZWwgPiAwKSB7CisjaWZkZWYgREVCVUcKKwkJZm9yIChpID0gMDsgaSA8IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7IGkrKykgeworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgSU5UX0dFVChycHBbaSArIDFdLCBBUkNIX0NPTlZFUlQpLAorCQkJCQlsZXZlbCkpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJfQorI2VuZGlmCisJCW1lbW1vdmUocmtwLCBya3AgKyAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpya3ApKTsKKwkJbWVtbW92ZShycHAsIHJwcCArIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKnJwcCkpOworCQl4ZnNfaW5vYnRfbG9nX2tleXMoY3VyLCByYnAsIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCQl4ZnNfaW5vYnRfbG9nX3B0cnMoY3VyLCByYnAsIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCX0gZWxzZSB7CisJCW1lbW1vdmUocnJwLCBycnAgKyAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycnApKTsKKwkJeGZzX2lub2J0X2xvZ19yZWNzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJa2V5LmlyX3N0YXJ0aW5vID0gcnJwLT5pcl9zdGFydGlubzsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJcmtwID0gJmtleTsKKwl9CisJLyoKKwkgKiBVcGRhdGUgdGhlIHBhcmVudCBrZXkgdmFsdWVzIG9mIHJpZ2h0LgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfdXBka2V5KGN1ciwgcmtwLCBsZXZlbCArIDEpKSkKKwkJcmV0dXJuIGVycm9yOworCS8qCisJICogU2xpZGUgdGhlIGN1cnNvciB2YWx1ZSBsZWZ0IG9uZS4KKwkgKi8KKwljdXItPmJjX3B0cnNbbGV2ZWxdLS07CisJKnN0YXQgPSAxOworCXJldHVybiAwOworfQorCisvKgorICogQWxsb2NhdGUgYSBuZXcgcm9vdCBibG9jaywgZmlsbCBpdCBpbi4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2lub2J0X25ld3Jvb3QoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJeGZzX2FnaV90CQkqYWdpOwkvKiBhLmcuIGlub2RlIGhlYWRlciAqLworCXhmc19hbGxvY19hcmdfdAkJYXJnczsJLyogYWxsb2NhdGlvbiBhcmd1bWVudCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfaW5vYnRfYmxvY2tfdAkqYmxvY2s7CS8qIG9uZSBoYWxmIG9mIHRoZSBvbGQgcm9vdCBibG9jayAqLworCXhmc19idWZfdAkJKmJwOwkvKiBidWZmZXIgY29udGFpbmluZyBibG9jayAqLworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfaW5vYnRfa2V5X3QJCSprcDsJLyogYnRyZWUga2V5IHBvaW50ZXIgKi8KKwl4ZnNfYWdibG9ja190CQlsYm5vOwkvKiBsZWZ0IGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkJKmxicDsJLyogbGVmdCBidWZmZXIgcG9pbnRlciAqLworCXhmc19pbm9idF9ibG9ja190CSpsZWZ0OwkvKiBsZWZ0IGJ0cmVlIGJsb2NrICovCisJeGZzX2J1Zl90CQkqbmJwOwkvKiBuZXcgKHJvb3QpIGJ1ZmZlciAqLworCXhmc19pbm9idF9ibG9ja190CSpuZXc7CS8qIG5ldyAocm9vdCkgYnRyZWUgYmxvY2sgKi8KKwlpbnQJCQlucHRyOwkvKiBuZXcgdmFsdWUgZm9yIGtleSBpbmRleCwgMSBvciAyICovCisJeGZzX2lub2J0X3B0cl90CQkqcHA7CS8qIGJ0cmVlIGFkZHJlc3MgcG9pbnRlciAqLworCXhmc19hZ2Jsb2NrX3QJCXJibm87CS8qIHJpZ2h0IGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkJKnJicDsJLyogcmlnaHQgYnVmZmVyIHBvaW50ZXIgKi8KKwl4ZnNfaW5vYnRfYmxvY2tfdAkqcmlnaHQ7CS8qIHJpZ2h0IGJ0cmVlIGJsb2NrICovCisJeGZzX2lub2J0X3JlY190CQkqcnA7CS8qIGJ0cmVlIHJlY29yZCBwb2ludGVyICovCisKKwlBU1NFUlQoY3VyLT5iY19ubGV2ZWxzIDwgWEZTX0lOX01BWExFVkVMUyhjdXItPmJjX21wKSk7CisKKwkvKgorCSAqIEdldCBhIGJsb2NrICYgYSBidWZmZXIuCisJICovCisJYWdpID0gWEZTX0JVRl9UT19BR0koY3VyLT5iY19wcml2YXRlLmkuYWdicCk7CisJYXJncy50cCA9IGN1ci0+YmNfdHA7CisJYXJncy5tcCA9IGN1ci0+YmNfbXA7CisJYXJncy5mc2JubyA9IFhGU19BR0JfVE9fRlNCKGFyZ3MubXAsIGN1ci0+YmNfcHJpdmF0ZS5pLmFnbm8sCisJCUlOVF9HRVQoYWdpLT5hZ2lfcm9vdCwgQVJDSF9DT05WRVJUKSk7CisJYXJncy5tb2QgPSBhcmdzLm1pbmxlZnQgPSBhcmdzLmFsaWdubWVudCA9IGFyZ3MudG90YWwgPSBhcmdzLndhc2RlbCA9CisJCWFyZ3MuaXNmbCA9IGFyZ3MudXNlcmRhdGEgPSBhcmdzLm1pbmFsaWduc2xvcCA9IDA7CisJYXJncy5taW5sZW4gPSBhcmdzLm1heGxlbiA9IGFyZ3MucHJvZCA9IDE7CisJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9ORUFSX0JOTzsKKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX3ZleHRlbnQoJmFyZ3MpKSkKKwkJcmV0dXJuIGVycm9yOworCS8qCisJICogTm9uZSBhdmFpbGFibGUsIHdlIGZhaWwuCisJICovCisJaWYgKGFyZ3MuZnNibm8gPT0gTlVMTEZTQkxPQ0spIHsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJQVNTRVJUKGFyZ3MubGVuID09IDEpOworCW5icCA9IHhmc19idHJlZV9nZXRfYnVmcyhhcmdzLm1wLCBhcmdzLnRwLCBhcmdzLmFnbm8sIGFyZ3MuYWdibm8sIDApOworCW5ldyA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0sobmJwKTsKKwkvKgorCSAqIFNldCB0aGUgcm9vdCBkYXRhIGluIHRoZSBhLmcuIGlub2RlIHN0cnVjdHVyZS4KKwkgKi8KKwlJTlRfU0VUKGFnaS0+YWdpX3Jvb3QsIEFSQ0hfQ09OVkVSVCwgYXJncy5hZ2Jubyk7CisJSU5UX01PRChhZ2ktPmFnaV9sZXZlbCwgQVJDSF9DT05WRVJULCAxKTsKKwl4ZnNfaWFsbG9jX2xvZ19hZ2koYXJncy50cCwgY3VyLT5iY19wcml2YXRlLmkuYWdicCwKKwkJWEZTX0FHSV9ST09UIHwgWEZTX0FHSV9MRVZFTCk7CisJLyoKKwkgKiBBdCB0aGUgcHJldmlvdXMgcm9vdCBsZXZlbCB0aGVyZSBhcmUgbm93IHR3byBibG9ja3M6IHRoZSBvbGQKKwkgKiByb290LCBhbmQgdGhlIG5ldyBibG9jayBnZW5lcmF0ZWQgd2hlbiBpdCB3YXMgc3BsaXQuCisJICogV2UgZG9uJ3Qga25vdyB3aGljaCBvbmUgdGhlIGN1cnNvciBpcyBwb2ludGluZyBhdCwgc28gd2UKKwkgKiBzZXQgdXAgdmFyaWFibGVzICJsZWZ0IiBhbmQgInJpZ2h0IiBmb3IgZWFjaCBjYXNlLgorCSAqLworCWJwID0gY3VyLT5iY19idWZzW2N1ci0+YmNfbmxldmVscyAtIDFdOworCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBjdXItPmJjX25sZXZlbHMgLSAxLCBicCkpKQorCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwlpZiAoSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTEFHQkxPQ0spIHsKKwkJLyoKKwkJICogT3VyIGJsb2NrIGlzIGxlZnQsIHBpY2sgdXAgdGhlIHJpZ2h0IGJsb2NrLgorCQkgKi8KKwkJbGJwID0gYnA7CisJCWxibm8gPSBYRlNfREFERFJfVE9fQUdCTk8oYXJncy5tcCwgWEZTX0JVRl9BRERSKGxicCkpOworCQlsZWZ0ID0gYmxvY2s7CisJCXJibm8gPSBJTlRfR0VUKGxlZnQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhhcmdzLm1wLCBhcmdzLnRwLCBhcmdzLmFnbm8sCisJCQkJcmJubywgMCwgJnJicCwgWEZTX0lOT19CVFJFRV9SRUYpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJYnAgPSByYnA7CisJCXJpZ2h0ID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhyYnApOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIHJpZ2h0LAorCQkJCWN1ci0+YmNfbmxldmVscyAtIDEsIHJicCkpKQorCQkJcmV0dXJuIGVycm9yOworCQlucHRyID0gMTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBPdXIgYmxvY2sgaXMgcmlnaHQsIHBpY2sgdXAgdGhlIGxlZnQgYmxvY2suCisJCSAqLworCQlyYnAgPSBicDsKKwkJcmJubyA9IFhGU19EQUREUl9UT19BR0JOTyhhcmdzLm1wLCBYRlNfQlVGX0FERFIocmJwKSk7CisJCXJpZ2h0ID0gYmxvY2s7CisJCWxibm8gPSBJTlRfR0VUKHJpZ2h0LT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhhcmdzLm1wLCBhcmdzLnRwLCBhcmdzLmFnbm8sCisJCQkJbGJubywgMCwgJmxicCwgWEZTX0lOT19CVFJFRV9SRUYpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJYnAgPSBsYnA7CisJCWxlZnQgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGxicCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwKKwkJCQljdXItPmJjX25sZXZlbHMgLSAxLCBsYnApKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJbnB0ciA9IDI7CisJfQorCS8qCisJICogRmlsbCBpbiB0aGUgbmV3IGJsb2NrJ3MgYnRyZWUgaGVhZGVyIGFuZCBsb2cgaXQuCisJICovCisJSU5UX1NFVChuZXctPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQsIHhmc19tYWdpY3NbY3VyLT5iY19idG51bV0pOworCUlOVF9TRVQobmV3LT5iYl9sZXZlbCwgQVJDSF9DT05WRVJULCAoX191aW50MTZfdCljdXItPmJjX25sZXZlbHMpOworCUlOVF9TRVQobmV3LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIDIpOworCUlOVF9TRVQobmV3LT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExBR0JMT0NLKTsKKwlJTlRfU0VUKG5ldy0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCwgTlVMTEFHQkxPQ0spOworCXhmc19pbm9idF9sb2dfYmxvY2soYXJncy50cCwgbmJwLCBYRlNfQkJfQUxMX0JJVFMpOworCUFTU0VSVChsYm5vICE9IE5VTExBR0JMT0NLICYmIHJibm8gIT0gTlVMTEFHQkxPQ0spOworCS8qCisJICogRmlsbCBpbiB0aGUga2V5IGRhdGEgaW4gdGhlIG5ldyByb290LgorCSAqLworCWtwID0gWEZTX0lOT0JUX0tFWV9BRERSKG5ldywgMSwgY3VyKTsKKwlpZiAoSU5UX0dFVChsZWZ0LT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSA+IDApIHsKKwkJa3BbMF0gPSAqWEZTX0lOT0JUX0tFWV9BRERSKGxlZnQsIDEsIGN1cik7IC8qIElOVF86IHN0cnVjdCBjb3B5ICovCisJCWtwWzFdID0gKlhGU19JTk9CVF9LRVlfQUREUihyaWdodCwgMSwgY3VyKTsgLyogSU5UXzogc3RydWN0IGNvcHkgKi8KKwl9IGVsc2UgeworCQlycCA9IFhGU19JTk9CVF9SRUNfQUREUihsZWZ0LCAxLCBjdXIpOworCQlJTlRfQ09QWShrcFswXS5pcl9zdGFydGlubywgcnAtPmlyX3N0YXJ0aW5vLCBBUkNIX0NPTlZFUlQpOworCQlycCA9IFhGU19JTk9CVF9SRUNfQUREUihyaWdodCwgMSwgY3VyKTsKKwkJSU5UX0NPUFkoa3BbMV0uaXJfc3RhcnRpbm8sIHJwLT5pcl9zdGFydGlubywgQVJDSF9DT05WRVJUKTsKKwl9CisJeGZzX2lub2J0X2xvZ19rZXlzKGN1ciwgbmJwLCAxLCAyKTsKKwkvKgorCSAqIEZpbGwgaW4gdGhlIHBvaW50ZXIgZGF0YSBpbiB0aGUgbmV3IHJvb3QuCisJICovCisJcHAgPSBYRlNfSU5PQlRfUFRSX0FERFIobmV3LCAxLCBjdXIpOworCUlOVF9TRVQocHBbMF0sIEFSQ0hfQ09OVkVSVCwgbGJubyk7CisJSU5UX1NFVChwcFsxXSwgQVJDSF9DT05WRVJULCByYm5vKTsKKwl4ZnNfaW5vYnRfbG9nX3B0cnMoY3VyLCBuYnAsIDEsIDIpOworCS8qCisJICogRml4IHVwIHRoZSBjdXJzb3IuCisJICovCisJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGN1ci0+YmNfbmxldmVscywgbmJwKTsKKwljdXItPmJjX3B0cnNbY3VyLT5iY19ubGV2ZWxzXSA9IG5wdHI7CisJY3VyLT5iY19ubGV2ZWxzKys7CisJKnN0YXQgPSAxOworCXJldHVybiAwOworfQorCisvKgorICogTW92ZSAxIHJlY29yZCByaWdodCBmcm9tIGN1ci9sZXZlbCBpZiBwb3NzaWJsZS4KKyAqIFVwZGF0ZSBjdXIgdG8gcmVmbGVjdCB0aGUgbmV3IHBhdGguCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF9yc2hpZnQoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgdG8gc2hpZnQgcmVjb3JkIG9uICovCisJaW50CQkJKnN0YXQpCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlpOwkvKiBsb29wIGluZGV4ICovCisJeGZzX2lub2J0X2tleV90CQlrZXk7CS8qIGtleSB2YWx1ZSBmb3IgbGVhZiBsZXZlbCB1cHdhcmQgKi8KKwl4ZnNfYnVmX3QJCSpsYnA7CS8qIGJ1ZmZlciBmb3IgbGVmdCAoY3VycmVudCkgYmxvY2sgKi8KKwl4ZnNfaW5vYnRfYmxvY2tfdAkqbGVmdDsJLyogbGVmdCAoY3VycmVudCkgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfaW5vYnRfa2V5X3QJCSpsa3A7CS8qIGtleSBwb2ludGVyIGZvciBsZWZ0IGJsb2NrICovCisJeGZzX2lub2J0X3B0cl90CQkqbHBwOwkvKiBhZGRyZXNzIHBvaW50ZXIgZm9yIGxlZnQgYmxvY2sgKi8KKwl4ZnNfaW5vYnRfcmVjX3QJCSpscnA7CS8qIHJlY29yZCBwb2ludGVyIGZvciBsZWZ0IGJsb2NrICovCisJeGZzX2J1Zl90CQkqcmJwOwkvKiBidWZmZXIgZm9yIHJpZ2h0IG5laWdoYm9yIGJsb2NrICovCisJeGZzX2lub2J0X2Jsb2NrX3QJKnJpZ2h0OwkvKiByaWdodCBuZWlnaGJvciBidHJlZSBibG9jayAqLworCXhmc19pbm9idF9rZXlfdAkJKnJrcDsJLyoga2V5IHBvaW50ZXIgZm9yIHJpZ2h0IGJsb2NrICovCisJeGZzX2lub2J0X3B0cl90CQkqcnBwOwkvKiBhZGRyZXNzIHBvaW50ZXIgZm9yIHJpZ2h0IGJsb2NrICovCisJeGZzX2lub2J0X3JlY190CQkqcnJwPU5VTEw7CS8qIHJlY29yZCBwb2ludGVyIGZvciByaWdodCBibG9jayAqLworCXhmc19idHJlZV9jdXJfdAkJKnRjdXI7CS8qIHRlbXBvcmFyeSBjdXJzb3IgKi8KKworCS8qCisJICogU2V0IHVwIHZhcmlhYmxlcyBmb3IgdGhpcyBibG9jayBhcyAibGVmdCIuCisJICovCisJbGJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKKwlsZWZ0ID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhsYnApOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBsZWZ0LCBsZXZlbCwgbGJwKSkpCisJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCS8qCisJICogSWYgd2UndmUgZ290IG5vIHJpZ2h0IHNpYmxpbmcgdGhlbiB3ZSBjYW4ndCBzaGlmdCBhbiBlbnRyeSByaWdodC4KKwkgKi8KKwlpZiAoSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMQUdCTE9DSykgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIElmIHRoZSBjdXJzb3IgZW50cnkgaXMgdGhlIG9uZSB0aGF0IHdvdWxkIGJlIG1vdmVkLCBkb24ndAorCSAqIGRvIGl0Li4uIGl0J3MgdG9vIGNvbXBsaWNhdGVkLgorCSAqLworCWlmIChjdXItPmJjX3B0cnNbbGV2ZWxdID49IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIFNldCB1cCB0aGUgcmlnaHQgbmVpZ2hib3IgYXMgInJpZ2h0Ii4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhjdXItPmJjX21wLCBjdXItPmJjX3RwLAorCQkJY3VyLT5iY19wcml2YXRlLmkuYWdubywgSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSwgMCwgJnJicCwKKwkJCVhGU19JTk9fQlRSRUVfUkVGKSkpCisJCXJldHVybiBlcnJvcjsKKwlyaWdodCA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0socmJwKTsKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIHJpZ2h0LCBsZXZlbCwgcmJwKSkpCisJCXJldHVybiBlcnJvcjsKKwkvKgorCSAqIElmIGl0J3MgZnVsbCwgaXQgY2FuJ3QgdGFrZSBhbm90aGVyIGVudHJ5LgorCSAqLworCWlmIChJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19JTk9CVF9CTE9DS19NQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogTWFrZSBhIGhvbGUgYXQgdGhlIHN0YXJ0IG9mIHRoZSByaWdodCBuZWlnaGJvciBibG9jaywgdGhlbgorCSAqIGNvcHkgdGhlIGxhc3QgbGVmdCBibG9jayBlbnRyeSB0byB0aGUgaG9sZS4KKwkgKi8KKwlpZiAobGV2ZWwgPiAwKSB7CisJCWxrcCA9IFhGU19JTk9CVF9LRVlfQUREUihsZWZ0LCBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCksIGN1cik7CisJCWxwcCA9IFhGU19JTk9CVF9QVFJfQUREUihsZWZ0LCBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCksIGN1cik7CisJCXJrcCA9IFhGU19JTk9CVF9LRVlfQUREUihyaWdodCwgMSwgY3VyKTsKKwkJcnBwID0gWEZTX0lOT0JUX1BUUl9BRERSKHJpZ2h0LCAxLCBjdXIpOworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSAxOyBpID49IDA7IGktLSkgeworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgSU5UX0dFVChycHBbaV0sIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpCisJCQkJcmV0dXJuIGVycm9yOworCQl9CisjZW5kaWYKKwkJbWVtbW92ZShya3AgKyAxLCBya3AsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKnJrcCkpOworCQltZW1tb3ZlKHJwcCArIDEsIHJwcCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcnBwKSk7CisjaWZkZWYgREVCVUcKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgSU5UX0dFVCgqbHBwLCBBUkNIX0NPTlZFUlQpLCBsZXZlbCkpKQorCQkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJCSpya3AgPSAqbGtwOyAvKiBJTlRfOiBubyBjaGFuZ2UgY29weSAqLworCQkqcnBwID0gKmxwcDsgLyogSU5UXzogbm8gY2hhbmdlIGNvcHkgKi8KKwkJeGZzX2lub2J0X2xvZ19rZXlzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSk7CisJCXhmc19pbm9idF9sb2dfcHRycyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEpOworCX0gZWxzZSB7CisJCWxycCA9IFhGU19JTk9CVF9SRUNfQUREUihsZWZ0LCBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCksIGN1cik7CisJCXJycCA9IFhGU19JTk9CVF9SRUNfQUREUihyaWdodCwgMSwgY3VyKTsKKwkJbWVtbW92ZShycnAgKyAxLCBycnAsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKnJycCkpOworCQkqcnJwID0gKmxycDsKKwkJeGZzX2lub2J0X2xvZ19yZWNzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSk7CisJCWtleS5pcl9zdGFydGlubyA9IHJycC0+aXJfc3RhcnRpbm87IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCXJrcCA9ICZrZXk7CisJfQorCS8qCisJICogRGVjcmVtZW50IGFuZCBsb2cgbGVmdCdzIG51bXJlY3MsIGJ1bXAgYW5kIGxvZyByaWdodCdzIG51bXJlY3MuCisJICovCisJSU5UX01PRChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIC0xKTsKKwl4ZnNfaW5vYnRfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIGxicCwgWEZTX0JCX05VTVJFQ1MpOworCUlOVF9NT0QocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgKzEpOworI2lmZGVmIERFQlVHCisJaWYgKGxldmVsID4gMCkKKwkJeGZzX2J0cmVlX2NoZWNrX2tleShjdXItPmJjX2J0bnVtLCBya3AsIHJrcCArIDEpOworCWVsc2UKKwkJeGZzX2J0cmVlX2NoZWNrX3JlYyhjdXItPmJjX2J0bnVtLCBycnAsIHJycCArIDEpOworI2VuZGlmCisJeGZzX2lub2J0X2xvZ19ibG9jayhjdXItPmJjX3RwLCByYnAsIFhGU19CQl9OVU1SRUNTKTsKKwkvKgorCSAqIFVzaW5nIGEgdGVtcG9yYXJ5IGN1cnNvciwgdXBkYXRlIHRoZSBwYXJlbnQga2V5IHZhbHVlcyBvZiB0aGUKKwkgKiBibG9jayBvbiB0aGUgcmlnaHQuCisJICovCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9kdXBfY3Vyc29yKGN1ciwgJnRjdXIpKSkKKwkJcmV0dXJuIGVycm9yOworCXhmc19idHJlZV9sYXN0cmVjKHRjdXIsIGxldmVsKTsKKwlpZiAoKGVycm9yID0geGZzX2lub2J0X2luY3JlbWVudCh0Y3VyLCBsZXZlbCwgJmkpKSB8fAorCSAgICAoZXJyb3IgPSB4ZnNfaW5vYnRfdXBka2V5KHRjdXIsIHJrcCwgbGV2ZWwgKyAxKSkpIHsKKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcih0Y3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJKnN0YXQgPSAxOworCXJldHVybiAwOworfQorCisvKgorICogU3BsaXQgY3VyL2xldmVsIGJsb2NrIGluIGhhbGYuCisgKiBSZXR1cm4gbmV3IGJsb2NrIG51bWJlciBhbmQgaXRzIGZpcnN0IHJlY29yZCAodG8gYmUgaW5zZXJ0ZWQgaW50byBwYXJlbnQpLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfaW5vYnRfc3BsaXQoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgdG8gc3BsaXQgKi8KKwl4ZnNfYWdibG9ja190CQkqYm5vcCwJLyogb3V0cHV0OiBibG9jayBudW1iZXIgYWxsb2NhdGVkICovCisJeGZzX2lub2J0X2tleV90CQkqa2V5cCwJLyogb3V0cHV0OiBmaXJzdCBrZXkgb2YgbmV3IGJsb2NrICovCisJeGZzX2J0cmVlX2N1cl90CQkqKmN1cnAsCS8qIG91dHB1dDogbmV3IGN1cnNvciAqLworCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwl4ZnNfYWxsb2NfYXJnX3QJCWFyZ3M7CS8qIGFsbG9jYXRpb24gYXJndW1lbnQgc3RydWN0dXJlICovCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWk7CS8qIGxvb3AgaW5kZXgvcmVjb3JkIG51bWJlciAqLworCXhmc19hZ2Jsb2NrX3QJCWxibm87CS8qIGxlZnQgKGN1cnJlbnQpIGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkJKmxicDsJLyogYnVmZmVyIGZvciBsZWZ0IGJsb2NrICovCisJeGZzX2lub2J0X2Jsb2NrX3QJKmxlZnQ7CS8qIGxlZnQgKGN1cnJlbnQpIGJ0cmVlIGJsb2NrICovCisJeGZzX2lub2J0X2tleV90CQkqbGtwOwkvKiBsZWZ0IGJ0cmVlIGtleSBwb2ludGVyICovCisJeGZzX2lub2J0X3B0cl90CQkqbHBwOwkvKiBsZWZ0IGJ0cmVlIGFkZHJlc3MgcG9pbnRlciAqLworCXhmc19pbm9idF9yZWNfdAkJKmxycDsJLyogbGVmdCBidHJlZSByZWNvcmQgcG9pbnRlciAqLworCXhmc19idWZfdAkJKnJicDsJLyogYnVmZmVyIGZvciByaWdodCBibG9jayAqLworCXhmc19pbm9idF9ibG9ja190CSpyaWdodDsJLyogcmlnaHQgKG5ldykgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfaW5vYnRfa2V5X3QJCSpya3A7CS8qIHJpZ2h0IGJ0cmVlIGtleSBwb2ludGVyICovCisJeGZzX2lub2J0X3B0cl90CQkqcnBwOwkvKiByaWdodCBidHJlZSBhZGRyZXNzIHBvaW50ZXIgKi8KKwl4ZnNfaW5vYnRfcmVjX3QJCSpycnA7CS8qIHJpZ2h0IGJ0cmVlIHJlY29yZCBwb2ludGVyICovCisKKwkvKgorCSAqIFNldCB1cCBsZWZ0IGJsb2NrIChjdXJyZW50IG9uZSkuCisJICovCisJbGJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKKwlhcmdzLnRwID0gY3VyLT5iY190cDsKKwlhcmdzLm1wID0gY3VyLT5iY19tcDsKKwlsYm5vID0gWEZTX0RBRERSX1RPX0FHQk5PKGFyZ3MubXAsIFhGU19CVUZfQUREUihsYnApKTsKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBuZXcgYmxvY2suCisJICogSWYgd2UgY2FuJ3QgZG8gaXQsIHdlJ3JlIHRvYXN0LiAgR2l2ZSB1cC4KKwkgKi8KKwlhcmdzLmZzYm5vID0gWEZTX0FHQl9UT19GU0IoYXJncy5tcCwgY3VyLT5iY19wcml2YXRlLmkuYWdubywgbGJubyk7CisJYXJncy5tb2QgPSBhcmdzLm1pbmxlZnQgPSBhcmdzLmFsaWdubWVudCA9IGFyZ3MudG90YWwgPSBhcmdzLndhc2RlbCA9CisJCWFyZ3MuaXNmbCA9IGFyZ3MudXNlcmRhdGEgPSBhcmdzLm1pbmFsaWduc2xvcCA9IDA7CisJYXJncy5taW5sZW4gPSBhcmdzLm1heGxlbiA9IGFyZ3MucHJvZCA9IDE7CisJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9ORUFSX0JOTzsKKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX3ZleHRlbnQoJmFyZ3MpKSkKKwkJcmV0dXJuIGVycm9yOworCWlmIChhcmdzLmZzYm5vID09IE5VTExGU0JMT0NLKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCUFTU0VSVChhcmdzLmxlbiA9PSAxKTsKKwlyYnAgPSB4ZnNfYnRyZWVfZ2V0X2J1ZnMoYXJncy5tcCwgYXJncy50cCwgYXJncy5hZ25vLCBhcmdzLmFnYm5vLCAwKTsKKwkvKgorCSAqIFNldCB1cCB0aGUgbmV3IGJsb2NrIGFzICJyaWdodCIuCisJICovCisJcmlnaHQgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKHJicCk7CisJLyoKKwkgKiAiTGVmdCIgaXMgdGhlIGN1cnJlbnQgKGFjY29yZGluZyB0byB0aGUgY3Vyc29yKSBibG9jay4KKwkgKi8KKwlsZWZ0ID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhsYnApOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBsZWZ0LCBsZXZlbCwgbGJwKSkpCisJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCS8qCisJICogRmlsbCBpbiB0aGUgYnRyZWUgaGVhZGVyIGZvciB0aGUgbmV3IGJsb2NrLgorCSAqLworCUlOVF9TRVQocmlnaHQtPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQsIHhmc19tYWdpY3NbY3VyLT5iY19idG51bV0pOworCXJpZ2h0LT5iYl9sZXZlbCA9IGxlZnQtPmJiX2xldmVsOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCUlOVF9TRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgKF9fdWludDE2X3QpKElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAvIDIpKTsKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IGlmIHRoZXJlJ3MgYW4gb2RkIG51bWJlciBvZiBlbnRyaWVzIG5vdywgdGhhdAorCSAqIGVhY2ggbmV3IGJsb2NrIHdpbGwgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZW50cmllcy4KKwkgKi8KKwlpZiAoKElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAmIDEpICYmCisJICAgIGN1ci0+YmNfcHRyc1tsZXZlbF0gPD0gSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEpCisJCUlOVF9NT0QocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgKzEpOworCWkgPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMTsKKwkvKgorCSAqIEZvciBub24tbGVhZiBibG9ja3MsIGNvcHkga2V5cyBhbmQgYWRkcmVzc2VzIG92ZXIgdG8gdGhlIG5ldyBibG9jay4KKwkgKi8KKwlpZiAobGV2ZWwgPiAwKSB7CisJCWxrcCA9IFhGU19JTk9CVF9LRVlfQUREUihsZWZ0LCBpLCBjdXIpOworCQlscHAgPSBYRlNfSU5PQlRfUFRSX0FERFIobGVmdCwgaSwgY3VyKTsKKwkJcmtwID0gWEZTX0lOT0JUX0tFWV9BRERSKHJpZ2h0LCAxLCBjdXIpOworCQlycHAgPSBYRlNfSU5PQlRfUFRSX0FERFIocmlnaHQsIDEsIGN1cik7CisjaWZkZWYgREVCVUcKKwkJZm9yIChpID0gMDsgaSA8IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7IGkrKykgeworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgSU5UX0dFVChscHBbaV0sIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpCisJCQkJcmV0dXJuIGVycm9yOworCQl9CisjZW5kaWYKKwkJbWVtY3B5KHJrcCwgbGtwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpya3ApKTsKKwkJbWVtY3B5KHJwcCwgbHBwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycHApKTsKKwkJeGZzX2lub2J0X2xvZ19rZXlzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJeGZzX2lub2J0X2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJKmtleXAgPSAqcmtwOworCX0KKwkvKgorCSAqIEZvciBsZWFmIGJsb2NrcywgY29weSByZWNvcmRzIG92ZXIgdG8gdGhlIG5ldyBibG9jay4KKwkgKi8KKwllbHNlIHsKKwkJbHJwID0gWEZTX0lOT0JUX1JFQ19BRERSKGxlZnQsIGksIGN1cik7CisJCXJycCA9IFhGU19JTk9CVF9SRUNfQUREUihyaWdodCwgMSwgY3VyKTsKKwkJbWVtY3B5KHJycCwgbHJwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycnApKTsKKwkJeGZzX2lub2J0X2xvZ19yZWNzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJa2V5cC0+aXJfc3RhcnRpbm8gPSBycnAtPmlyX3N0YXJ0aW5vOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCX0KKwkvKgorCSAqIEZpbmQgdGhlIGxlZnQgYmxvY2sgbnVtYmVyIGJ5IGxvb2tpbmcgaW4gdGhlIGJ1ZmZlci4KKwkgKiBBZGp1c3QgbnVtcmVjcywgc2libGluZyBwb2ludGVycy4KKwkgKi8KKwlJTlRfTU9EKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgLShJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKSk7CisJcmlnaHQtPmJiX3JpZ2h0c2liID0gbGVmdC0+YmJfcmlnaHRzaWI7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJSU5UX1NFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJULCBhcmdzLmFnYm5vKTsKKwlJTlRfU0VUKHJpZ2h0LT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQsIGxibm8pOworCXhmc19pbm9idF9sb2dfYmxvY2soYXJncy50cCwgcmJwLCBYRlNfQkJfQUxMX0JJVFMpOworCXhmc19pbm9idF9sb2dfYmxvY2soYXJncy50cCwgbGJwLCBYRlNfQkJfTlVNUkVDUyB8IFhGU19CQl9SSUdIVFNJQik7CisJLyoKKwkgKiBJZiB0aGVyZSdzIGEgYmxvY2sgdG8gdGhlIG5ldyBibG9jaydzIHJpZ2h0LCBtYWtlIHRoYXQgYmxvY2sKKwkgKiBwb2ludCBiYWNrIHRvIHJpZ2h0IGluc3RlYWQgb2YgdG8gbGVmdC4KKwkgKi8KKwlpZiAoSU5UX0dFVChyaWdodC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTEFHQkxPQ0spIHsKKwkJeGZzX2lub2J0X2Jsb2NrX3QJKnJyYmxvY2s7CS8qIHJyIGJ0cmVlIGJsb2NrICovCisJCXhmc19idWZfdAkJKnJyYnA7CQkvKiBidWZmZXIgZm9yIHJyYmxvY2sgKi8KKworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhhcmdzLm1wLCBhcmdzLnRwLCBhcmdzLmFnbm8sCisJCQkJSU5UX0dFVChyaWdodC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCksIDAsICZycmJwLAorCQkJCVhGU19JTk9fQlRSRUVfUkVGKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCXJyYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKHJyYnApOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIHJyYmxvY2ssIGxldmVsLCBycmJwKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCUlOVF9TRVQocnJibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJULCBhcmdzLmFnYm5vKTsKKwkJeGZzX2lub2J0X2xvZ19ibG9jayhhcmdzLnRwLCBycmJwLCBYRlNfQkJfTEVGVFNJQik7CisJfQorCS8qCisJICogSWYgdGhlIGN1cnNvciBpcyByZWFsbHkgaW4gdGhlIHJpZ2h0IGJsb2NrLCBtb3ZlIGl0IHRoZXJlLgorCSAqIElmIGl0J3MganVzdCBwb2ludGluZyBwYXN0IHRoZSBsYXN0IGVudHJ5IGluIGxlZnQsIHRoZW4gd2UnbGwKKwkgKiBpbnNlcnQgdGhlcmUsIHNvIGRvbid0IGNoYW5nZSBhbnl0aGluZyBpbiB0aGF0IGNhc2UuCisJICovCisJaWYgKGN1ci0+YmNfcHRyc1tsZXZlbF0gPiBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxKSB7CisJCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXZlbCwgcmJwKTsKKwkJY3VyLT5iY19wdHJzW2xldmVsXSAtPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJfQorCS8qCisJICogSWYgdGhlcmUgYXJlIG1vcmUgbGV2ZWxzLCB3ZSdsbCBuZWVkIGFub3RoZXIgY3Vyc29yIHdoaWNoIHJlZmVycworCSAqIHRoZSByaWdodCBibG9jaywgbm8gbWF0dGVyIHdoZXJlIHRoaXMgY3Vyc29yIHdhcy4KKwkgKi8KKwlpZiAobGV2ZWwgKyAxIDwgY3VyLT5iY19ubGV2ZWxzKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZHVwX2N1cnNvcihjdXIsIGN1cnApKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJKCpjdXJwKS0+YmNfcHRyc1tsZXZlbCArIDFdKys7CisJfQorCSpibm9wID0gYXJncy5hZ2JubzsKKwkqc3RhdCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBVcGRhdGUga2V5cyBhdCBhbGwgbGV2ZWxzIGZyb20gaGVyZSB0byB0aGUgcm9vdCBhbG9uZyB0aGUgY3Vyc29yJ3MgcGF0aC4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2lub2J0X3VwZGtleSgKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19pbm9idF9rZXlfdAkJKmtleXAsCS8qIG5ldyBrZXkgdmFsdWUgdG8gdXBkYXRlIHRvICovCisJaW50CQkJbGV2ZWwpCS8qIHN0YXJ0aW5nIGxldmVsIGZvciB1cGRhdGUgKi8KK3sKKwlpbnQJCQlwdHI7CS8qIGluZGV4IG9mIGtleSBpbiBibG9jayAqLworCisJLyoKKwkgKiBHbyB1cCB0aGUgdHJlZSBmcm9tIHRoaXMgbGV2ZWwgdG93YXJkIHRoZSByb290LgorCSAqIEF0IGVhY2ggbGV2ZWwsIHVwZGF0ZSB0aGUga2V5IHZhbHVlIHRvIHRoZSB2YWx1ZSBpbnB1dC4KKwkgKiBTdG9wIHdoZW4gd2UgcmVhY2ggYSBsZXZlbCB3aGVyZSB0aGUgY3Vyc29yIGlzbid0IHBvaW50aW5nCisJICogYXQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBibG9jay4KKwkgKi8KKwlmb3IgKHB0ciA9IDE7IHB0ciA9PSAxICYmIGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzOyBsZXZlbCsrKSB7CisJCXhmc19idWZfdAkJKmJwOwkvKiBidWZmZXIgZm9yIGJsb2NrICovCisJCXhmc19pbm9idF9ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgKi8KKyNpZmRlZiBERUJVRworCQlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisjZW5kaWYKKwkJeGZzX2lub2J0X2tleV90CQkqa3A7CS8qIHB0ciB0byBidHJlZSBibG9jayBrZXlzICovCisKKwkJYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOworCQlibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApOworI2lmZGVmIERFQlVHCisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCkpKQorCQkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJCXB0ciA9IGN1ci0+YmNfcHRyc1tsZXZlbF07CisJCWtwID0gWEZTX0lOT0JUX0tFWV9BRERSKGJsb2NrLCBwdHIsIGN1cik7CisJCSprcCA9ICprZXlwOworCQl4ZnNfaW5vYnRfbG9nX2tleXMoY3VyLCBicCwgcHRyLCBwdHIpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEV4dGVybmFsbHkgdmlzaWJsZSByb3V0aW5lcy4KKyAqLworCisvKgorICogRGVjcmVtZW50IGN1cnNvciBieSBvbmUgcmVjb3JkIGF0IHRoZSBsZXZlbC4KKyAqIEZvciBub256ZXJvIGxldmVscyB0aGUgbGVhZi13YXJkIGluZm9ybWF0aW9uIGlzIHVudG91Y2hlZC4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2lub2J0X2RlY3JlbWVudCgKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldmVsLAkvKiBsZXZlbCBpbiBidHJlZSwgMCBpcyBsZWFmICovCisJaW50CQkJKnN0YXQpCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCXhmc19pbm9idF9ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgKi8KKwlpbnQJCQllcnJvcjsKKwlpbnQJCQlsZXY7CS8qIGJ0cmVlIGxldmVsICovCisKKwlBU1NFUlQobGV2ZWwgPCBjdXItPmJjX25sZXZlbHMpOworCS8qCisJICogUmVhZC1haGVhZCB0byB0aGUgbGVmdCBhdCB0aGlzIGxldmVsLgorCSAqLworCXhmc19idHJlZV9yZWFkYWhlYWQoY3VyLCBsZXZlbCwgWEZTX0JUQ1VSX0xFRlRSQSk7CisJLyoKKwkgKiBEZWNyZW1lbnQgdGhlIHB0ciBhdCB0aGlzIGxldmVsLiAgSWYgd2UncmUgc3RpbGwgaW4gdGhlIGJsb2NrCisJICogdGhlbiB3ZSdyZSBkb25lLgorCSAqLworCWlmICgtLWN1ci0+YmNfcHRyc1tsZXZlbF0gPiAwKSB7CisJCSpzdGF0ID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogR2V0IGEgcG9pbnRlciB0byB0aGUgYnRyZWUgYmxvY2suCisJICovCisJYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGN1ci0+YmNfYnVmc1tsZXZlbF0pOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsCisJCQljdXItPmJjX2J1ZnNbbGV2ZWxdKSkpCisJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCS8qCisJICogSWYgd2UganVzdCB3ZW50IG9mZiB0aGUgbGVmdCBlZGdlIG9mIHRoZSB0cmVlLCByZXR1cm4gZmFpbHVyZS4KKwkgKi8KKwlpZiAoSU5UX0dFVChibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMQUdCTE9DSykgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIE1hcmNoIHVwIHRoZSB0cmVlIGRlY3JlbWVudGluZyBwb2ludGVycy4KKwkgKiBTdG9wIHdoZW4gd2UgZG9uJ3QgZ28gb2ZmIHRoZSBsZWZ0IGVkZ2Ugb2YgYSBibG9jay4KKwkgKi8KKwlmb3IgKGxldiA9IGxldmVsICsgMTsgbGV2IDwgY3VyLT5iY19ubGV2ZWxzOyBsZXYrKykgeworCQlpZiAoLS1jdXItPmJjX3B0cnNbbGV2XSA+IDApCisJCQlicmVhazsKKwkJLyoKKwkJICogUmVhZC1haGVhZCB0aGUgbGVmdCBibG9jaywgd2UncmUgZ29pbmcgdG8gcmVhZCBpdAorCQkgKiBpbiB0aGUgbmV4dCBsb29wLgorCQkgKi8KKwkJeGZzX2J0cmVlX3JlYWRhaGVhZChjdXIsIGxldiwgWEZTX0JUQ1VSX0xFRlRSQSk7CisJfQorCS8qCisJICogSWYgd2Ugd2VudCBvZmYgdGhlIHJvb3QgdGhlbiB3ZSBhcmUgc2VyaW91c2x5IGNvbmZ1c2VkLgorCSAqLworCUFTU0VSVChsZXYgPCBjdXItPmJjX25sZXZlbHMpOworCS8qCisJICogTm93IHdhbGsgYmFjayBkb3duIHRoZSB0cmVlLCBmaXhpbmcgdXAgdGhlIGN1cnNvcidzIGJ1ZmZlcgorCSAqIHBvaW50ZXJzIGFuZCBrZXkgbnVtYmVycy4KKwkgKi8KKwlmb3IgKGJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhjdXItPmJjX2J1ZnNbbGV2XSk7IGxldiA+IGxldmVsOyApIHsKKwkJeGZzX2FnYmxvY2tfdAlhZ2JubzsJLyogYmxvY2sgbnVtYmVyIG9mIGJ0cmVlIGJsb2NrICovCisJCXhmc19idWZfdAkqYnA7CS8qIGJ1ZmZlciBjb250YWluaW5nIGJ0cmVlIGJsb2NrICovCisKKwkJYWdibm8gPSBJTlRfR0VUKCpYRlNfSU5PQlRfUFRSX0FERFIoYmxvY2ssIGN1ci0+YmNfcHRyc1tsZXZdLCBjdXIpLCBBUkNIX0NPTlZFUlQpOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhjdXItPmJjX21wLCBjdXItPmJjX3RwLAorCQkJCWN1ci0+YmNfcHJpdmF0ZS5pLmFnbm8sIGFnYm5vLCAwLCAmYnAsCisJCQkJWEZTX0lOT19CVFJFRV9SRUYpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJbGV2LS07CisJCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXYsIGJwKTsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGJwKTsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgbGV2LCBicCkpKQorCQkJcmV0dXJuIGVycm9yOworCQljdXItPmJjX3B0cnNbbGV2XSA9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJfQorCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlbGV0ZSB0aGUgcmVjb3JkIHBvaW50ZWQgdG8gYnkgY3VyLgorICogVGhlIGN1cnNvciByZWZlcnMgdG8gdGhlIHBsYWNlIHdoZXJlIHRoZSByZWNvcmQgd2FzIChjb3VsZCBiZSBpbnNlcnRlZCkKKyAqIHdoZW4gdGhlIG9wZXJhdGlvbiByZXR1cm5zLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfaW5vYnRfZGVsZXRlKAorCXhmc19idHJlZV9jdXJfdAkqY3VyLAkJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCWludAkJZXJyb3I7CisJaW50CQlpOwkJLyogcmVzdWx0IGNvZGUgKi8KKwlpbnQJCWxldmVsOwkJLyogYnRyZWUgbGV2ZWwgKi8KKworCS8qCisJICogR28gdXAgdGhlIHRyZWUsIHN0YXJ0aW5nIGF0IGxlYWYgbGV2ZWwuCisJICogSWYgMiBpcyByZXR1cm5lZCB0aGVuIGEgam9pbiB3YXMgZG9uZTsgZ28gdG8gdGhlIG5leHQgbGV2ZWwuCisJICogT3RoZXJ3aXNlIHdlIGFyZSBkb25lLgorCSAqLworCWZvciAobGV2ZWwgPSAwLCBpID0gMjsgaSA9PSAyOyBsZXZlbCsrKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfZGVscmVjKGN1ciwgbGV2ZWwsICZpKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCWlmIChpID09IDApIHsKKwkJZm9yIChsZXZlbCA9IDE7IGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzOyBsZXZlbCsrKSB7CisJCQlpZiAoY3VyLT5iY19wdHJzW2xldmVsXSA9PSAwKSB7CisJCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9kZWNyZW1lbnQoY3VyLCBsZXZlbCwgJmkpKSkKKwkJCQkJcmV0dXJuIGVycm9yOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCSpzdGF0ID0gaTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogR2V0IHRoZSBkYXRhIGZyb20gdGhlIHBvaW50ZWQtdG8gcmVjb3JkLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfaW5vYnRfZ2V0X3JlYygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19hZ2lub190CQkqaW5vLAkvKiBvdXRwdXQ6IHN0YXJ0aW5nIGlub2RlIG9mIGNodW5rICovCisJX19pbnQzMl90CQkqZmNudCwJLyogb3V0cHV0OiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgKi8KKwl4ZnNfaW5vZnJlZV90CQkqZnJlZSwJLyogb3V0cHV0OiBmcmVlIGlub2RlIG1hc2sgKi8KKwlpbnQJCQkqc3RhdCkJLyogb3V0cHV0OiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwl4ZnNfaW5vYnRfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrICovCisJeGZzX2J1Zl90CQkqYnA7CS8qIGJ1ZmZlciBjb250YWluaW5nIGJ0cmVlIGJsb2NrICovCisjaWZkZWYgREVCVUcKKwlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisjZW5kaWYKKwlpbnQJCQlwdHI7CS8qIHJlY29yZCBudW1iZXIgKi8KKwl4ZnNfaW5vYnRfcmVjX3QJCSpyZWM7CS8qIHJlY29yZCBkYXRhICovCisKKwlicCA9IGN1ci0+YmNfYnVmc1swXTsKKwlwdHIgPSBjdXItPmJjX3B0cnNbMF07CisJYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGJwKTsKKyNpZmRlZiBERUJVRworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgYmxvY2ssIDAsIGJwKSkpCisJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCS8qCisJICogT2ZmIHRoZSByaWdodCBlbmQgb3IgbGVmdCBlbmQsIHJldHVybiBmYWlsdXJlLgorCSAqLworCWlmIChwdHIgPiBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIHx8IHB0ciA8PSAwKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogUG9pbnQgdG8gdGhlIHJlY29yZCBhbmQgZXh0cmFjdCBpdHMgZGF0YS4KKwkgKi8KKwlyZWMgPSBYRlNfSU5PQlRfUkVDX0FERFIoYmxvY2ssIHB0ciwgY3VyKTsKKwkqaW5vID0gSU5UX0dFVChyZWMtPmlyX3N0YXJ0aW5vLCBBUkNIX0NPTlZFUlQpOworCSpmY250ID0gSU5UX0dFVChyZWMtPmlyX2ZyZWVjb3VudCwgQVJDSF9DT05WRVJUKTsKKwkqZnJlZSA9IElOVF9HRVQocmVjLT5pcl9mcmVlLCBBUkNIX0NPTlZFUlQpOworCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluY3JlbWVudCBjdXJzb3IgYnkgb25lIHJlY29yZCBhdCB0aGUgbGV2ZWwuCisgKiBGb3Igbm9uemVybyBsZXZlbHMgdGhlIGxlYWYtd2FyZCBpbmZvcm1hdGlvbiBpcyB1bnRvdWNoZWQuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF9pbmNyZW1lbnQoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgaW4gYnRyZWUsIDAgaXMgbGVhZiAqLworCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwl4ZnNfaW5vYnRfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrICovCisJeGZzX2J1Zl90CQkqYnA7CS8qIGJ1ZmZlciBjb250YWluaW5nIGJ0cmVlIGJsb2NrICovCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWxldjsJLyogYnRyZWUgbGV2ZWwgKi8KKworCUFTU0VSVChsZXZlbCA8IGN1ci0+YmNfbmxldmVscyk7CisJLyoKKwkgKiBSZWFkLWFoZWFkIHRvIHRoZSByaWdodCBhdCB0aGlzIGxldmVsLgorCSAqLworCXhmc19idHJlZV9yZWFkYWhlYWQoY3VyLCBsZXZlbCwgWEZTX0JUQ1VSX1JJR0hUUkEpOworCS8qCisJICogR2V0IGEgcG9pbnRlciB0byB0aGUgYnRyZWUgYmxvY2suCisJICovCisJYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOworCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApKSkKKwkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJLyoKKwkgKiBJbmNyZW1lbnQgdGhlIHB0ciBhdCB0aGlzIGxldmVsLiAgSWYgd2UncmUgc3RpbGwgaW4gdGhlIGJsb2NrCisJICogdGhlbiB3ZSdyZSBkb25lLgorCSAqLworCWlmICgrK2N1ci0+YmNfcHRyc1tsZXZlbF0gPD0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkgeworCQkqc3RhdCA9IDE7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIElmIHdlIGp1c3Qgd2VudCBvZmYgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIHRyZWUsIHJldHVybiBmYWlsdXJlLgorCSAqLworCWlmIChJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMQUdCTE9DSykgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIE1hcmNoIHVwIHRoZSB0cmVlIGluY3JlbWVudGluZyBwb2ludGVycy4KKwkgKiBTdG9wIHdoZW4gd2UgZG9uJ3QgZ28gb2ZmIHRoZSByaWdodCBlZGdlIG9mIGEgYmxvY2suCisJICovCisJZm9yIChsZXYgPSBsZXZlbCArIDE7IGxldiA8IGN1ci0+YmNfbmxldmVsczsgbGV2KyspIHsKKwkJYnAgPSBjdXItPmJjX2J1ZnNbbGV2XTsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGJwKTsKKyNpZmRlZiBERUJVRworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXYsIGJwKSkpCisJCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkJaWYgKCsrY3VyLT5iY19wdHJzW2xldl0gPD0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBSZWFkLWFoZWFkIHRoZSByaWdodCBibG9jaywgd2UncmUgZ29pbmcgdG8gcmVhZCBpdAorCQkgKiBpbiB0aGUgbmV4dCBsb29wLgorCQkgKi8KKwkJeGZzX2J0cmVlX3JlYWRhaGVhZChjdXIsIGxldiwgWEZTX0JUQ1VSX1JJR0hUUkEpOworCX0KKwkvKgorCSAqIElmIHdlIHdlbnQgb2ZmIHRoZSByb290IHRoZW4gd2UgYXJlIHNlcmlvdXNseSBjb25mdXNlZC4KKwkgKi8KKwlBU1NFUlQobGV2IDwgY3VyLT5iY19ubGV2ZWxzKTsKKwkvKgorCSAqIE5vdyB3YWxrIGJhY2sgZG93biB0aGUgdHJlZSwgZml4aW5nIHVwIHRoZSBjdXJzb3IncyBidWZmZXIKKwkgKiBwb2ludGVycyBhbmQga2V5IG51bWJlcnMuCisJICovCisJZm9yIChicCA9IGN1ci0+YmNfYnVmc1tsZXZdLCBibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApOworCSAgICAgbGV2ID4gbGV2ZWw7ICkgeworCQl4ZnNfYWdibG9ja190CWFnYm5vOwkvKiBibG9jayBudW1iZXIgb2YgYnRyZWUgYmxvY2sgKi8KKworCQlhZ2JubyA9IElOVF9HRVQoKlhGU19JTk9CVF9QVFJfQUREUihibG9jaywgY3VyLT5iY19wdHJzW2xldl0sIGN1ciksIEFSQ0hfQ09OVkVSVCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfdHAsCisJCQkJY3VyLT5iY19wcml2YXRlLmkuYWdubywgYWdibm8sIDAsICZicCwKKwkJCQlYRlNfSU5PX0JUUkVFX1JFRikpKQorCQkJcmV0dXJuIGVycm9yOworCQlsZXYtLTsKKwkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldiwgYnApOworCQlibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXYsIGJwKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCWN1ci0+YmNfcHRyc1tsZXZdID0gMTsKKwl9CisJKnN0YXQgPSAxOworCXJldHVybiAwOworfQorCisvKgorICogSW5zZXJ0IHRoZSBjdXJyZW50IHJlY29yZCBhdCB0aGUgcG9pbnQgcmVmZXJlbmNlZCBieSBjdXIuCisgKiBUaGUgY3Vyc29yIG1heSBiZSBpbmNvbnNpc3RlbnQgb24gcmV0dXJuIGlmIHNwbGl0cyBoYXZlIGJlZW4gZG9uZS4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2lub2J0X2luc2VydCgKKwl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwJCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQlpOwkJLyogcmVzdWx0IHZhbHVlLCAwIGZvciBmYWlsdXJlICovCisJaW50CQlsZXZlbDsJCS8qIGN1cnJlbnQgbGV2ZWwgbnVtYmVyIGluIGJ0cmVlICovCisJeGZzX2FnYmxvY2tfdAluYm5vOwkJLyogbmV3IGJsb2NrIG51bWJlciAoc3BsaXQgcmVzdWx0KSAqLworCXhmc19idHJlZV9jdXJfdAkqbmN1cjsJCS8qIG5ldyBjdXJzb3IgKHNwbGl0IHJlc3VsdCkgKi8KKwl4ZnNfaW5vYnRfcmVjX3QJbnJlYzsJCS8qIHJlY29yZCBiZWluZyBpbnNlcnRlZCB0aGlzIGxldmVsICovCisJeGZzX2J0cmVlX2N1cl90CSpwY3VyOwkJLyogcHJldmlvdXMgbGV2ZWwncyBjdXJzb3IgKi8KKworCWxldmVsID0gMDsKKwluYm5vID0gTlVMTEFHQkxPQ0s7CisJSU5UX1NFVChucmVjLmlyX3N0YXJ0aW5vLCBBUkNIX0NPTlZFUlQsIGN1ci0+YmNfcmVjLmkuaXJfc3RhcnRpbm8pOworCUlOVF9TRVQobnJlYy5pcl9mcmVlY291bnQsIEFSQ0hfQ09OVkVSVCwgY3VyLT5iY19yZWMuaS5pcl9mcmVlY291bnQpOworCUlOVF9TRVQobnJlYy5pcl9mcmVlLCBBUkNIX0NPTlZFUlQsIGN1ci0+YmNfcmVjLmkuaXJfZnJlZSk7CisJbmN1ciA9ICh4ZnNfYnRyZWVfY3VyX3QgKikwOworCXBjdXIgPSBjdXI7CisJLyoKKwkgKiBMb29wIGdvaW5nIHVwIHRoZSB0cmVlLCBzdGFydGluZyBhdCB0aGUgbGVhZiBsZXZlbC4KKwkgKiBTdG9wIHdoZW4gd2UgZG9uJ3QgZ2V0IGEgc3BsaXQgYmxvY2ssIHRoYXQgbXVzdCBtZWFuIHRoYXQKKwkgKiB0aGUgaW5zZXJ0IGlzIGZpbmlzaGVkIHdpdGggdGhpcyBsZXZlbC4KKwkgKi8KKwlkbyB7CisJCS8qCisJCSAqIEluc2VydCBucmVjL25ibm8gaW50byB0aGlzIGxldmVsIG9mIHRoZSB0cmVlLgorCQkgKiBOb3RlIGlmIHdlIGZhaWwsIG5ibm8gd2lsbCBiZSBudWxsLgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19pbm9idF9pbnNyZWMocGN1ciwgbGV2ZWwrKywgJm5ibm8sICZucmVjLCAmbmN1ciwKKwkJCQkmaSkpKSB7CisJCQlpZiAocGN1ciAhPSBjdXIpCisJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IocGN1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQkvKgorCQkgKiBTZWUgaWYgdGhlIGN1cnNvciB3ZSBqdXN0IHVzZWQgaXMgdHJhc2guCisJCSAqIENhbid0IHRyYXNoIHRoZSBjYWxsZXIncyBjdXJzb3IsIGJ1dCBvdGhlcndpc2Ugd2Ugc2hvdWxkCisJCSAqIGlmIG5jdXIgaXMgYSBuZXcgY3Vyc29yIG9yIHdlJ3JlIGFib3V0IHRvIGJlIGRvbmUuCisJCSAqLworCQlpZiAocGN1ciAhPSBjdXIgJiYgKG5jdXIgfHwgbmJubyA9PSBOVUxMQUdCTE9DSykpIHsKKwkJCWN1ci0+YmNfbmxldmVscyA9IHBjdXItPmJjX25sZXZlbHM7CisJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihwY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJCX0KKwkJLyoKKwkJICogSWYgd2UgZ290IGEgbmV3IGN1cnNvciwgc3dpdGNoIHRvIGl0LgorCQkgKi8KKwkJaWYgKG5jdXIpIHsKKwkJCXBjdXIgPSBuY3VyOworCQkJbmN1ciA9ICh4ZnNfYnRyZWVfY3VyX3QgKikwOworCQl9CisJfSB3aGlsZSAobmJubyAhPSBOVUxMQUdCTE9DSyk7CisJKnN0YXQgPSBpOworCXJldHVybiAwOworfQorCisvKgorICogTG9va3VwIHRoZSByZWNvcmQgZXF1YWwgdG8gaW5vIGluIHRoZSBidHJlZSBnaXZlbiBieSBjdXIuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF9sb29rdXBfZXEoCisJeGZzX2J0cmVlX2N1cl90CSpjdXIsCQkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdpbm9fdAlpbm8sCQkvKiBzdGFydGluZyBpbm9kZSBvZiBjaHVuayAqLworCV9faW50MzJfdAlmY250LAkJLyogZnJlZSBpbm9kZSBjb3VudCAqLworCXhmc19pbm9mcmVlX3QJZnJlZSwJCS8qIGZyZWUgaW5vZGUgbWFzayAqLworCWludAkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwljdXItPmJjX3JlYy5pLmlyX3N0YXJ0aW5vID0gaW5vOworCWN1ci0+YmNfcmVjLmkuaXJfZnJlZWNvdW50ID0gZmNudDsKKwljdXItPmJjX3JlYy5pLmlyX2ZyZWUgPSBmcmVlOworCXJldHVybiB4ZnNfaW5vYnRfbG9va3VwKGN1ciwgWEZTX0xPT0tVUF9FUSwgc3RhdCk7Cit9CisKKy8qCisgKiBMb29rdXAgdGhlIGZpcnN0IHJlY29yZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gaW5vCisgKiBpbiB0aGUgYnRyZWUgZ2l2ZW4gYnkgY3VyLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfaW5vYnRfbG9va3VwX2dlKAorCXhmc19idHJlZV9jdXJfdAkqY3VyLAkJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2FnaW5vX3QJaW5vLAkJLyogc3RhcnRpbmcgaW5vZGUgb2YgY2h1bmsgKi8KKwlfX2ludDMyX3QJZmNudCwJCS8qIGZyZWUgaW5vZGUgY291bnQgKi8KKwl4ZnNfaW5vZnJlZV90CWZyZWUsCQkvKiBmcmVlIGlub2RlIG1hc2sgKi8KKwlpbnQJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJY3VyLT5iY19yZWMuaS5pcl9zdGFydGlubyA9IGlubzsKKwljdXItPmJjX3JlYy5pLmlyX2ZyZWVjb3VudCA9IGZjbnQ7CisJY3VyLT5iY19yZWMuaS5pcl9mcmVlID0gZnJlZTsKKwlyZXR1cm4geGZzX2lub2J0X2xvb2t1cChjdXIsIFhGU19MT09LVVBfR0UsIHN0YXQpOworfQorCisvKgorICogTG9va3VwIHRoZSBmaXJzdCByZWNvcmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGlubworICogaW4gdGhlIGJ0cmVlIGdpdmVuIGJ5IGN1ci4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2lub2J0X2xvb2t1cF9sZSgKKwl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwJCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19hZ2lub190CWlubywJCS8qIHN0YXJ0aW5nIGlub2RlIG9mIGNodW5rICovCisJX19pbnQzMl90CWZjbnQsCQkvKiBmcmVlIGlub2RlIGNvdW50ICovCisJeGZzX2lub2ZyZWVfdAlmcmVlLAkJLyogZnJlZSBpbm9kZSBtYXNrICovCisJaW50CQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCWN1ci0+YmNfcmVjLmkuaXJfc3RhcnRpbm8gPSBpbm87CisJY3VyLT5iY19yZWMuaS5pcl9mcmVlY291bnQgPSBmY250OworCWN1ci0+YmNfcmVjLmkuaXJfZnJlZSA9IGZyZWU7CisJcmV0dXJuIHhmc19pbm9idF9sb29rdXAoY3VyLCBYRlNfTE9PS1VQX0xFLCBzdGF0KTsKK30KKworLyoKKyAqIFVwZGF0ZSB0aGUgcmVjb3JkIHJlZmVycmVkIHRvIGJ5IGN1ciwgdG8gdGhlIHZhbHVlIGdpdmVuCisgKiBieSBbaW5vLCBmY250LCBmcmVlXS4KKyAqIFRoaXMgZWl0aGVyIHdvcmtzIChyZXR1cm4gMCkgb3IgZ2V0cyBhbiBFRlNDT1JSVVBURUQgZXJyb3IuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF91cGRhdGUoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdpbm9fdAkJaW5vLAkvKiBzdGFydGluZyBpbm9kZSBvZiBjaHVuayAqLworCV9faW50MzJfdAkJZmNudCwJLyogZnJlZSBpbm9kZSBjb3VudCAqLworCXhmc19pbm9mcmVlX3QJCWZyZWUpCS8qIGZyZWUgaW5vZGUgbWFzayAqLworeworCXhmc19pbm9idF9ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgdG8gdXBkYXRlICovCisJeGZzX2J1Zl90CQkqYnA7CS8qIGJ1ZmZlciBjb250YWluaW5nIGJ0cmVlIGJsb2NrICovCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCXB0cjsJLyogY3VycmVudCByZWNvcmQgbnVtYmVyICh1cGRhdGluZykgKi8KKwl4ZnNfaW5vYnRfcmVjX3QJCSpycDsJLyogcG9pbnRlciB0byB1cGRhdGVkIHJlY29yZCAqLworCisJLyoKKwkgKiBQaWNrIHVwIHRoZSBjdXJyZW50IGJsb2NrLgorCSAqLworCWJwID0gY3VyLT5iY19idWZzWzBdOworCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCAwLCBicCkpKQorCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkvKgorCSAqIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgcmVjIHRvIGJlIHVwZGF0ZWQuCisJICovCisJcHRyID0gY3VyLT5iY19wdHJzWzBdOworCXJwID0gWEZTX0lOT0JUX1JFQ19BRERSKGJsb2NrLCBwdHIsIGN1cik7CisJLyoKKwkgKiBGaWxsIGluIHRoZSBuZXcgY29udGVudHMgYW5kIGxvZyB0aGVtLgorCSAqLworCUlOVF9TRVQocnAtPmlyX3N0YXJ0aW5vLCBBUkNIX0NPTlZFUlQsIGlubyk7CisJSU5UX1NFVChycC0+aXJfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQsIGZjbnQpOworCUlOVF9TRVQocnAtPmlyX2ZyZWUsIEFSQ0hfQ09OVkVSVCwgZnJlZSk7CisJeGZzX2lub2J0X2xvZ19yZWNzKGN1ciwgYnAsIHB0ciwgcHRyKTsKKwkvKgorCSAqIFVwZGF0aW5nIGZpcnN0IHJlY29yZCBpbiBsZWFmLiBQYXNzIG5ldyBrZXkgdmFsdWUgdXAgdG8gb3VyIHBhcmVudC4KKwkgKi8KKwlpZiAocHRyID09IDEpIHsKKwkJeGZzX2lub2J0X2tleV90CWtleTsJLyoga2V5IGNvbnRhaW5pbmcgW2lub10gKi8KKworCQlJTlRfU0VUKGtleS5pcl9zdGFydGlubywgQVJDSF9DT05WRVJULCBpbm8pOworCQlpZiAoKGVycm9yID0geGZzX2lub2J0X3VwZGtleShjdXIsICZrZXksIDEpKSkKKwkJCXJldHVybiBlcnJvcjsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lhbGxvY19idHJlZS5oIGIvZnMveGZzL3hmc19pYWxsb2NfYnRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDNjNGQxCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19pYWxsb2NfYnRyZWUuaApAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0lBTExPQ19CVFJFRV9IX18KKyNkZWZpbmUJX19YRlNfSUFMTE9DX0JUUkVFX0hfXworCisvKgorICogSW5vZGUgbWFwIG9uLWRpc2sgc3RydWN0dXJlcworICovCisKK3N0cnVjdCB4ZnNfYnVmOworc3RydWN0IHhmc19idHJlZV9jdXI7CitzdHJ1Y3QgeGZzX2J0cmVlX3NibG9jazsKK3N0cnVjdCB4ZnNfbW91bnQ7CisKKy8qCisgKiBUaGVyZSBpcyBhIGJ0cmVlIGZvciB0aGUgaW5vZGUgbWFwIHBlciBhbGxvY2F0aW9uIGdyb3VwLgorICovCisjZGVmaW5lCVhGU19JQlRfTUFHSUMJMHg0OTQxNDI1NAkvKiAnSUFCVCcgKi8KKwordHlwZWRlZglfX3VpbnQ2NF90CXhmc19pbm9mcmVlX3Q7CisjZGVmaW5lCVhGU19JTk9ERVNfUEVSX0NIVU5LCShOQkJZICogc2l6ZW9mKHhmc19pbm9mcmVlX3QpKQorI2RlZmluZQlYRlNfSU5PREVTX1BFUl9DSFVOS19MT0cJKFhGU19OQkJZTE9HICsgMykKKyNkZWZpbmUJWEZTX0lOT0JUX0FMTF9GUkVFCSgoeGZzX2lub2ZyZWVfdCktMSkKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PQlRfTUFTS04pCit4ZnNfaW5vZnJlZV90IHhmc19pbm9idF9tYXNrbihpbnQgaSwgaW50IG4pOworI2RlZmluZQlYRlNfSU5PQlRfTUFTS04oaSxuKQkJeGZzX2lub2J0X21hc2tuKGksbikKKyNlbHNlCisjZGVmaW5lCVhGU19JTk9CVF9NQVNLTihpLG4pCVwKKwkoKCgobikgPj0gWEZTX0lOT0RFU19QRVJfQ0hVTksgPyBcCisJCSh4ZnNfaW5vZnJlZV90KTAgOiAoKHhmc19pbm9mcmVlX3QpMSA8PCAobikpKSAtIDEpIDw8IChpKSkKKyNlbmRpZgorCisvKgorICogRGF0YSByZWNvcmQgc3RydWN0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19pbm9idF9yZWMKK3sKKwl4ZnNfYWdpbm9fdAlpcl9zdGFydGlubzsJLyogc3RhcnRpbmcgaW5vZGUgbnVtYmVyICovCisJX19pbnQzMl90CWlyX2ZyZWVjb3VudDsJLyogY291bnQgb2YgZnJlZSBpbm9kZXMgKHNldCBiaXRzKSAqLworCXhmc19pbm9mcmVlX3QJaXJfZnJlZTsJLyogZnJlZSBpbm9kZSBtYXNrICovCit9IHhmc19pbm9idF9yZWNfdDsKKworLyoKKyAqIEtleSBzdHJ1Y3R1cmUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2lub2J0X2tleQoreworCXhmc19hZ2lub190CWlyX3N0YXJ0aW5vOwkvKiBzdGFydGluZyBpbm9kZSBudW1iZXIgKi8KK30geGZzX2lub2J0X2tleV90OworCit0eXBlZGVmIHhmc19hZ2Jsb2NrX3QgeGZzX2lub2J0X3B0cl90OwkvKiBidHJlZSBwb2ludGVyIHR5cGUgKi8KKwkJCQkJLyogYnRyZWUgYmxvY2sgaGVhZGVyIHR5cGUgKi8KK3R5cGVkZWYJc3RydWN0IHhmc19idHJlZV9zYmxvY2sgeGZzX2lub2J0X2Jsb2NrX3Q7CisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JVRl9UT19JTk9CVF9CTE9DSykKK3hmc19pbm9idF9ibG9ja190ICp4ZnNfYnVmX3RvX2lub2J0X2Jsb2NrKHN0cnVjdCB4ZnNfYnVmICpicCk7CisjZGVmaW5lCVhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApCXhmc19idWZfdG9faW5vYnRfYmxvY2soYnApCisjZWxzZQorI2RlZmluZQlYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGJwKSAoKHhmc19pbm9idF9ibG9ja190ICopKFhGU19CVUZfUFRSKGJwKSkpCisjZW5kaWYKKworLyoKKyAqIEJpdCBtYW5pcHVsYXRpb25zIGZvciBpcl9mcmVlLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTk9CVF9NQVNLKQoreGZzX2lub2ZyZWVfdCB4ZnNfaW5vYnRfbWFzayhpbnQgaSk7CisjZGVmaW5lCVhGU19JTk9CVF9NQVNLKGkpCQl4ZnNfaW5vYnRfbWFzayhpKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lOT0JUX01BU0soaSkJCSgoeGZzX2lub2ZyZWVfdCkxIDw8IChpKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PQlRfSVNfRlJFRSkKK2ludCB4ZnNfaW5vYnRfaXNfZnJlZSh4ZnNfaW5vYnRfcmVjX3QgKnJwLCBpbnQgaSk7CisjZGVmaW5lCVhGU19JTk9CVF9JU19GUkVFKHJwLGkpCXhmc19pbm9idF9pc19mcmVlKHJwLGkpCisjZWxzZQorI2RlZmluZQlYRlNfSU5PQlRfSVNfRlJFRShycCxpKQkoKChycCktPmlyX2ZyZWUgJiBYRlNfSU5PQlRfTUFTSyhpKSkgIT0gMCkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PQlRfU0VUX0ZSRUUpCit2b2lkIHhmc19pbm9idF9zZXRfZnJlZSh4ZnNfaW5vYnRfcmVjX3QgKnJwLCBpbnQgaSk7CisjZGVmaW5lCVhGU19JTk9CVF9TRVRfRlJFRShycCxpKQl4ZnNfaW5vYnRfc2V0X2ZyZWUocnAsaSkKKyNlbHNlCisjZGVmaW5lCVhGU19JTk9CVF9TRVRfRlJFRShycCxpKQkoKHJwKS0+aXJfZnJlZSB8PSBYRlNfSU5PQlRfTUFTSyhpKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PQlRfQ0xSX0ZSRUUpCit2b2lkIHhmc19pbm9idF9jbHJfZnJlZSh4ZnNfaW5vYnRfcmVjX3QgKnJwLCBpbnQgaSk7CisjZGVmaW5lCVhGU19JTk9CVF9DTFJfRlJFRShycCxpKQl4ZnNfaW5vYnRfY2xyX2ZyZWUocnAsaSkKKyNlbHNlCisjZGVmaW5lCVhGU19JTk9CVF9DTFJfRlJFRShycCxpKQkoKHJwKS0+aXJfZnJlZSAmPSB+WEZTX0lOT0JUX01BU0soaSkpCisjZW5kaWYKKworLyoKKyAqIFJlYWwgYmxvY2sgc3RydWN0dXJlcyBoYXZlIGEgc2l6ZSBlcXVhbCB0byB0aGUgZGlzayBibG9jayBzaXplLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTk9CVF9CTE9DS19TSVpFKQoraW50IHhmc19pbm9idF9ibG9ja19zaXplKGludCBsZXYsIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZQlYRlNfSU5PQlRfQkxPQ0tfU0laRShsZXYsY3VyKQl4ZnNfaW5vYnRfYmxvY2tfc2l6ZShsZXYsY3VyKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lOT0JUX0JMT0NLX1NJWkUobGV2LGN1cikJKDEgPDwgKGN1ciktPmJjX2Jsb2NrbG9nKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT0JUX0JMT0NLX01BWFJFQ1MpCitpbnQgeGZzX2lub2J0X2Jsb2NrX21heHJlY3MoaW50IGxldiwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7CisjZGVmaW5lCVhGU19JTk9CVF9CTE9DS19NQVhSRUNTKGxldixjdXIpCXhmc19pbm9idF9ibG9ja19tYXhyZWNzKGxldixjdXIpCisjZWxzZQorI2RlZmluZQlYRlNfSU5PQlRfQkxPQ0tfTUFYUkVDUyhsZXYsY3VyKQlcCisJKChjdXIpLT5iY19tcC0+bV9pbm9idF9teHJbbGV2ICE9IDBdKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTk9CVF9CTE9DS19NSU5SRUNTKQoraW50IHhmc19pbm9idF9ibG9ja19taW5yZWNzKGludCBsZXYsIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZQlYRlNfSU5PQlRfQkxPQ0tfTUlOUkVDUyhsZXYsY3VyKQl4ZnNfaW5vYnRfYmxvY2tfbWlucmVjcyhsZXYsY3VyKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lOT0JUX0JMT0NLX01JTlJFQ1MobGV2LGN1cikJXAorCSgoY3VyKS0+YmNfbXAtPm1faW5vYnRfbW5yW2xldiAhPSAwXSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTk9CVF9JU19MQVNUX1JFQykKK2ludCB4ZnNfaW5vYnRfaXNfbGFzdF9yZWMoc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7CisjZGVmaW5lCVhGU19JTk9CVF9JU19MQVNUX1JFQyhjdXIpCXhmc19pbm9idF9pc19sYXN0X3JlYyhjdXIpCisjZWxzZQorI2RlZmluZQlYRlNfSU5PQlRfSVNfTEFTVF9SRUMoY3VyKQlcCisJKChjdXIpLT5iY19wdHJzWzBdID09IFwKKwkJSU5UX0dFVChYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKChjdXIpLT5iY19idWZzWzBdKS0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkKKyNlbmRpZgorCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgaW5vZGUgYnRyZWUgbGV2ZWxzLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTl9NQVhMRVZFTFMpCitpbnQgeGZzX2luX21heGxldmVscyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19JTl9NQVhMRVZFTFMobXApCQl4ZnNfaW5fbWF4bGV2ZWxzKG1wKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lOX01BWExFVkVMUyhtcCkJCSgobXApLT5tX2luX21heGxldmVscykKKyNlbmRpZgorCisvKgorICogYmxvY2sgbnVtYmVycyBpbiB0aGUgQUcuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lCVF9CTE9DSykKK3hmc19hZ2Jsb2NrX3QgeGZzX2lidF9ibG9jayhzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19JQlRfQkxPQ0sobXApCQl4ZnNfaWJ0X2Jsb2NrKG1wKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lCVF9CTE9DSyhtcCkJKCh4ZnNfYWdibG9ja190KShYRlNfQ05UX0JMT0NLKG1wKSArIDEpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19QUkVBTExPQ19CTE9DS1MpCit4ZnNfYWdibG9ja190IHhmc19wcmVhbGxvY19ibG9ja3Moc3RydWN0IHhmc19tb3VudCAqbXApOworI2RlZmluZQlYRlNfUFJFQUxMT0NfQkxPQ0tTKG1wKQkJeGZzX3ByZWFsbG9jX2Jsb2NrcyhtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19QUkVBTExPQ19CTE9DS1MobXApCSgoeGZzX2FnYmxvY2tfdCkoWEZTX0lCVF9CTE9DSyhtcCkgKyAxKSkKKyNlbmRpZgorCisvKgorICogUmVjb3JkLCBrZXksIGFuZCBwb2ludGVyIGFkZHJlc3MgbWFjcm9zIGZvciBidHJlZSBibG9ja3MuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT0JUX1JFQ19BRERSKQoreGZzX2lub2J0X3JlY190ICoKK3hmc19pbm9idF9yZWNfYWRkcih4ZnNfaW5vYnRfYmxvY2tfdCAqYmIsIGludCBpLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUJWEZTX0lOT0JUX1JFQ19BRERSKGJiLGksY3VyKQl4ZnNfaW5vYnRfcmVjX2FkZHIoYmIsaSxjdXIpCisjZWxzZQorI2RlZmluZQlYRlNfSU5PQlRfUkVDX0FERFIoYmIsaSxjdXIpCVwKKwlYRlNfQlRSRUVfUkVDX0FERFIoWEZTX0lOT0JUX0JMT0NLX1NJWkUoMCxjdXIpLCB4ZnNfaW5vYnQsIGJiLCBpLCBcCisJCVhGU19JTk9CVF9CTE9DS19NQVhSRUNTKDAsIGN1cikpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PQlRfS0VZX0FERFIpCit4ZnNfaW5vYnRfa2V5X3QgKgoreGZzX2lub2J0X2tleV9hZGRyKHhmc19pbm9idF9ibG9ja190ICpiYiwgaW50IGksIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZQlYRlNfSU5PQlRfS0VZX0FERFIoYmIsaSxjdXIpCXhmc19pbm9idF9rZXlfYWRkcihiYixpLGN1cikKKyNlbHNlCisjZGVmaW5lCVhGU19JTk9CVF9LRVlfQUREUihiYixpLGN1cikJXAorCVhGU19CVFJFRV9LRVlfQUREUihYRlNfSU5PQlRfQkxPQ0tfU0laRSgxLGN1ciksIHhmc19pbm9idCwgYmIsIGksIFwKKwkJWEZTX0lOT0JUX0JMT0NLX01BWFJFQ1MoMSwgY3VyKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTk9CVF9QVFJfQUREUikKK3hmc19pbm9idF9wdHJfdCAqCit4ZnNfaW5vYnRfcHRyX2FkZHIoeGZzX2lub2J0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7CisjZGVmaW5lCVhGU19JTk9CVF9QVFJfQUREUihiYixpLGN1cikJeGZzX2lub2J0X3B0cl9hZGRyKGJiLGksY3VyKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lOT0JUX1BUUl9BRERSKGJiLGksY3VyKQlcCisJWEZTX0JUUkVFX1BUUl9BRERSKFhGU19JTk9CVF9CTE9DS19TSVpFKDEsY3VyKSwgeGZzX2lub2J0LCBiYiwgaSwgXAorCQlYRlNfSU5PQlRfQkxPQ0tfTUFYUkVDUygxLCBjdXIpKQorI2VuZGlmCisKKy8qCisgKiBQcm90b3R5cGVzIGZvciBleHRlcm5hbGx5IHZpc2libGUgcm91dGluZXMuCisgKi8KKworLyoKKyAqIERlY3JlbWVudCBjdXJzb3IgYnkgb25lIHJlY29yZCBhdCB0aGUgbGV2ZWwuCisgKiBGb3Igbm9uemVybyBsZXZlbHMgdGhlIGxlYWYtd2FyZCBpbmZvcm1hdGlvbiBpcyB1bnRvdWNoZWQuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF9kZWNyZW1lbnQoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIGluIGJ0cmVlLCAwIGlzIGxlYWYgKi8KKwlpbnQJCQkqc3RhdCk7IC8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworCisvKgorICogRGVsZXRlIHRoZSByZWNvcmQgcG9pbnRlZCB0byBieSBjdXIuCisgKiBUaGUgY3Vyc29yIHJlZmVycyB0byB0aGUgcGxhY2Ugd2hlcmUgdGhlIHJlY29yZCB3YXMgKGNvdWxkIGJlIGluc2VydGVkKQorICogd2hlbiB0aGUgb3BlcmF0aW9uIHJldHVybnMuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF9kZWxldGUoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJKnN0YXQpOwkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KKworLyoKKyAqIEdldCB0aGUgZGF0YSBmcm9tIHRoZSBwb2ludGVkLXRvIHJlY29yZC4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2lub2J0X2dldF9yZWMoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2FnaW5vX3QJCSppbm8sCS8qIG91dHB1dDogc3RhcnRpbmcgaW5vZGUgb2YgY2h1bmsgKi8KKwlfX2ludDMyX3QJCSpmY250LAkvKiBvdXRwdXQ6IG51bWJlciBvZiBmcmVlIGlub2RlcyAqLworCXhmc19pbm9mcmVlX3QJCSpmcmVlLAkvKiBvdXRwdXQ6IGZyZWUgaW5vZGUgbWFzayAqLworCWludAkJCSpzdGF0KTsJLyogb3V0cHV0OiBzdWNjZXNzL2ZhaWx1cmUgKi8KKworLyoKKyAqIEluY3JlbWVudCBjdXJzb3IgYnkgb25lIHJlY29yZCBhdCB0aGUgbGV2ZWwuCisgKiBGb3Igbm9uemVybyBsZXZlbHMgdGhlIGxlYWYtd2FyZCBpbmZvcm1hdGlvbiBpcyB1bnRvdWNoZWQuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF9pbmNyZW1lbnQoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIGluIGJ0cmVlLCAwIGlzIGxlYWYgKi8KKwlpbnQJCQkqc3RhdCk7CS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworCisvKgorICogSW5zZXJ0IHRoZSBjdXJyZW50IHJlY29yZCBhdCB0aGUgcG9pbnQgcmVmZXJlbmNlZCBieSBjdXIuCisgKiBUaGUgY3Vyc29yIG1heSBiZSBpbmNvbnNpc3RlbnQgb24gcmV0dXJuIGlmIHNwbGl0cyBoYXZlIGJlZW4gZG9uZS4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2lub2J0X2luc2VydCgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQkqc3RhdCk7CS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworCisvKgorICogTG9va3VwIHRoZSByZWNvcmQgZXF1YWwgdG8gaW5vIGluIHRoZSBidHJlZSBnaXZlbiBieSBjdXIuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF9sb29rdXBfZXEoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2FnaW5vX3QJCWlubywJLyogc3RhcnRpbmcgaW5vZGUgb2YgY2h1bmsgKi8KKwlfX2ludDMyX3QJCWZjbnQsCS8qIGZyZWUgaW5vZGUgY291bnQgKi8KKwl4ZnNfaW5vZnJlZV90CQlmcmVlLAkvKiBmcmVlIGlub2RlIG1hc2sgKi8KKwlpbnQJCQkqc3RhdCk7CS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworCisvKgorICogTG9va3VwIHRoZSBmaXJzdCByZWNvcmQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGlubworICogaW4gdGhlIGJ0cmVlIGdpdmVuIGJ5IGN1ci4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2lub2J0X2xvb2t1cF9nZSgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdpbm9fdAkJaW5vLAkvKiBzdGFydGluZyBpbm9kZSBvZiBjaHVuayAqLworCV9faW50MzJfdAkJZmNudCwJLyogZnJlZSBpbm9kZSBjb3VudCAqLworCXhmc19pbm9mcmVlX3QJCWZyZWUsCS8qIGZyZWUgaW5vZGUgbWFzayAqLworCWludAkJCSpzdGF0KTsJLyogc3VjY2Vzcy9mYWlsdXJlICovCisKKy8qCisgKiBMb29rdXAgdGhlIGZpcnN0IHJlY29yZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gaW5vCisgKiBpbiB0aGUgYnRyZWUgZ2l2ZW4gYnkgY3VyLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfaW5vYnRfbG9va3VwX2xlKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19hZ2lub190CQlpbm8sCS8qIHN0YXJ0aW5nIGlub2RlIG9mIGNodW5rICovCisJX19pbnQzMl90CQlmY250LAkvKiBmcmVlIGlub2RlIGNvdW50ICovCisJeGZzX2lub2ZyZWVfdAkJZnJlZSwJLyogZnJlZSBpbm9kZSBtYXNrICovCisJaW50CQkJKnN0YXQpOwkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KKworLyoKKyAqIFVwZGF0ZSB0aGUgcmVjb3JkIHJlZmVycmVkIHRvIGJ5IGN1ciwgdG8gdGhlIHZhbHVlIGdpdmVuCisgKiBieSBbaW5vLCBmY250LCBmcmVlXS4KKyAqIFRoaXMgZWl0aGVyIHdvcmtzIChyZXR1cm4gMCkgb3IgZ2V0cyBhbiBFRlNDT1JSVVBURUQgZXJyb3IuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF91cGRhdGUoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2FnaW5vX3QJCWlubywJLyogc3RhcnRpbmcgaW5vZGUgb2YgY2h1bmsgKi8KKwlfX2ludDMyX3QJCWZjbnQsCS8qIGZyZWUgaW5vZGUgY291bnQgKi8KKwl4ZnNfaW5vZnJlZV90CQlmcmVlKTsJLyogZnJlZSBpbm9kZSBtYXNrICovCisKKyNlbmRpZgkvKiBfX1hGU19JQUxMT0NfQlRSRUVfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lnZXQuYyBiL2ZzL3hmcy94ZnNfaWdldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMGJhMWQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2lnZXQuYwpAQCAtMCwwICsxLDEwMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKworI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX3F1b3RhLmgiCisjaW5jbHVkZSAieGZzX3V0aWxzLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgaW5vZGUgaGFzaCB0YWJsZSBmb3IgdGhlIG5ld2x5IG1vdW50ZWQgZmlsZSBzeXN0ZW0uCisgKiBDaG9vc2UgYW4gaW5pdGlhbCB0YWJsZSBzaXplIGJhc2VkIG9uIHVzZXIgc3BlY2lmaWVkIHZhbHVlLCBlbHNlCisgKiB1c2UgYSBzaW1wbGUgYWxnb3JpdGhtIHVzaW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbm9kZXMgYXMgYW4KKyAqIGluZGljYXRvciBmb3IgdGFibGUgc2l6ZSwgYW5kIGNsYW1wIGl0IGJldHdlZW4gb25lIGFuZCBzb21lIGxhcmdlCisgKiBudW1iZXIgb2YgcGFnZXMuCisgKi8KK3ZvaWQKK3hmc19paGFzaF9pbml0KHhmc19tb3VudF90ICptcCkKK3sKKwlfX3VpbnQ2NF90CWljb3VudDsKKwl1aW50CQlpLCBmbGFncyA9IEtNX1NMRUVQIHwgS01fTUFZRkFJTDsKKworCWlmICghbXAtPm1faWhzaXplKSB7CisJCWljb3VudCA9IG1wLT5tX21heGljb3VudCA/IG1wLT5tX21heGljb3VudCA6CisJCQkgKG1wLT5tX3NiLnNiX2RibG9ja3MgPDwgbXAtPm1fc2Iuc2JfaW5vcGJsb2cpOworCQltcC0+bV9paHNpemUgPSAxIDw8IG1heF90KHVpbnQsIDgsCisJCQkJCSh4ZnNfaGlnaGJpdDY0KGljb3VudCkgKyAxKSAvIDIpOworCQltcC0+bV9paHNpemUgPSBtaW5fdCh1aW50LCBtcC0+bV9paHNpemUsCisJCQkJCSg2NCAqIE5CUFApIC8gc2l6ZW9mKHhmc19paGFzaF90KSk7CisJfQorCisJd2hpbGUgKCEobXAtPm1faWhhc2ggPSAoeGZzX2loYXNoX3QgKilrbWVtX3phbGxvYyhtcC0+bV9paHNpemUgKgorCQkJCQkJc2l6ZW9mKHhmc19paGFzaF90KSwgZmxhZ3MpKSkgeworCQlpZiAoKG1wLT5tX2loc2l6ZSA+Pj0gMSkgPD0gTkJQUCkKKwkJCWZsYWdzID0gS01fU0xFRVA7CisJfQorCWZvciAoaSA9IDA7IGkgPCBtcC0+bV9paHNpemU7IGkrKykgeworCQlyd2xvY2tfaW5pdCgmKG1wLT5tX2loYXNoW2ldLmloX2xvY2spKTsKKwl9Cit9CisKKy8qCisgKiBGcmVlIHVwIHN0cnVjdHVyZXMgYWxsb2NhdGVkIGJ5IHhmc19paGFzaF9pbml0LCBhdCB1bm1vdW50IHRpbWUuCisgKi8KK3ZvaWQKK3hmc19paGFzaF9mcmVlKHhmc19tb3VudF90ICptcCkKK3sKKwlrbWVtX2ZyZWUobXAtPm1faWhhc2gsIG1wLT5tX2loc2l6ZSpzaXplb2YoeGZzX2loYXNoX3QpKTsKKwltcC0+bV9paGFzaCA9IE5VTEw7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBpbm9kZSBjbHVzdGVyIGhhc2ggdGFibGUgZm9yIHRoZSBuZXdseSBtb3VudGVkIGZpbGUgc3lzdGVtLgorICogSXRzIHNpemUgaXMgZGVyaXZlZCBmcm9tIHRoZSBpaGFzaCB0YWJsZSBzaXplLgorICovCit2b2lkCit4ZnNfY2hhc2hfaW5pdCh4ZnNfbW91bnRfdCAqbXApCit7CisJdWludAlpOworCisJbXAtPm1fY2hzaXplID0gbWF4X3QodWludCwgMSwgbXAtPm1faWhzaXplIC8KKwkJCSAoWEZTX0lOT0RFX0NMVVNURVJfU0laRShtcCkgPj4gbXAtPm1fc2Iuc2JfaW5vZGVsb2cpKTsKKwltcC0+bV9jaHNpemUgPSBtaW5fdCh1aW50LCBtcC0+bV9jaHNpemUsIG1wLT5tX2loc2l6ZSk7CisJbXAtPm1fY2hhc2ggPSAoeGZzX2NoYXNoX3QgKilrbWVtX3phbGxvYyhtcC0+bV9jaHNpemUKKwkJCQkJCSAqIHNpemVvZih4ZnNfY2hhc2hfdCksCisJCQkJCQkgS01fU0xFRVApOworCWZvciAoaSA9IDA7IGkgPCBtcC0+bV9jaHNpemU7IGkrKykgeworCQlzcGlubG9ja19pbml0KCZtcC0+bV9jaGFzaFtpXS5jaF9sb2NrLCJ4ZnNoYXNoIik7CisJfQorfQorCisvKgorICogRnJlZSB1cCBzdHJ1Y3R1cmVzIGFsbG9jYXRlZCBieSB4ZnNfY2hhc2hfaW5pdCwgYXQgdW5tb3VudCB0aW1lLgorICovCit2b2lkCit4ZnNfY2hhc2hfZnJlZSh4ZnNfbW91bnRfdCAqbXApCit7CisJaW50CWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXAtPm1fY2hzaXplOyBpKyspIHsKKwkJc3BpbmxvY2tfZGVzdHJveSgmbXAtPm1fY2hhc2hbaV0uY2hfbG9jayk7CisJfQorCisJa21lbV9mcmVlKG1wLT5tX2NoYXNoLCBtcC0+bV9jaHNpemUqc2l6ZW9mKHhmc19jaGFzaF90KSk7CisJbXAtPm1fY2hhc2ggPSBOVUxMOworfQorCisvKgorICogTG9vayB1cCBhbiBpbm9kZSBieSBudW1iZXIgaW4gdGhlIGdpdmVuIGZpbGUgc3lzdGVtLgorICogVGhlIGlub2RlIGlzIGxvb2tlZCB1cCBpbiB0aGUgaGFzaCB0YWJsZSBmb3IgdGhlIGZpbGUgc3lzdGVtCisgKiByZXByZXNlbnRlZCBieSB0aGUgbW91bnQgcG9pbnQgcGFyYW1ldGVyIG1wLiAgRWFjaCBidWNrZXQgb2YKKyAqIHRoZSBoYXNoIHRhYmxlIGlzIGd1YXJkZWQgYnkgYW4gaW5kaXZpZHVhbCBzZW1hcGhvcmUuCisgKgorICogSWYgdGhlIGlub2RlIGlzIGZvdW5kIGluIHRoZSBoYXNoIHRhYmxlLCBpdHMgY29ycmVzcG9uZGluZyB2bm9kZQorICogaXMgb2J0YWluZWQgd2l0aCBhIGNhbGwgdG8gdm5fZ2V0KCkuICBUaGlzIGNhbGwgdGFrZXMgY2FyZSBvZgorICogY29vcmRpbmF0aW9uIHdpdGggdGhlIHJlY2xhbWF0aW9uIG9mIHRoZSBpbm9kZSBhbmQgdm5vZGUuICBOb3RlCisgKiB0aGF0IHRoZSB2bWFwIHN0cnVjdHVyZSBpcyBmaWxsZWQgaW4gd2hpbGUgaG9sZGluZyB0aGUgaGFzaCBsb2NrLgorICogVGhpcyBnaXZlcyB1cyB0aGUgc3RhdGUgb2YgdGhlIGlub2RlL3Zub2RlIHdoZW4gd2UgZm91bmQgaXQgYW5kCisgKiBpcyB1c2VkIGZvciBjb29yZGluYXRpb24gaW4gdm5fZ2V0KCkuCisgKgorICogSWYgaXQgaXMgbm90IGluIGNvcmUsIHJlYWQgaXQgaW4gZnJvbSB0aGUgZmlsZSBzeXN0ZW0ncyBkZXZpY2UgYW5kCisgKiBhZGQgdGhlIGlub2RlIGludG8gdGhlIGhhc2ggdGFibGUuCisgKgorICogVGhlIGlub2RlIGlzIGxvY2tlZCBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIHRoZSBsb2NrX2ZsYWdzIHBhcmFtZXRlci4KKyAqIFRoaXMgZmxhZyBwYXJhbWV0ZXIgaW5kaWNhdGVzIGhvdyBhbmQgaWYgdGhlIGlub2RlJ3MgSU8gbG9jayBhbmQgaW5vZGUgbG9jaworICogc2hvdWxkIGJlIHRha2VuLgorICoKKyAqIG1wIC0tIHRoZSBtb3VudCBwb2ludCBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IGZpbGUgc3lzdGVtLiAgSXQgcG9pbnRzCisgKiAgICAgICB0byB0aGUgaW5vZGUgaGFzaCB0YWJsZS4KKyAqIHRwIC0tIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpZiB0aGVyZSBpcyBvbmUuICBUaGlzIGlzCisgKiAgICAgICBzaW1wbHkgcGFzc2VkIHRocm91Z2ggdG8gdGhlIHhmc19pcmVhZCgpIGNhbGwuCisgKiBpbm8gLS0gdGhlIG51bWJlciBvZiB0aGUgaW5vZGUgZGVzaXJlZC4gIFRoaXMgaXMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyCisgKiAgICAgICAgd2l0aGluIHRoZSBmaWxlIHN5c3RlbSBmb3IgdGhlIGlub2RlIGJlaW5nIHJlcXVlc3RlZC4KKyAqIGxvY2tfZmxhZ3MgLS0gZmxhZ3MgaW5kaWNhdGluZyBob3cgdG8gbG9jayB0aGUgaW5vZGUuICBTZWUgdGhlIGNvbW1lbnQKKyAqCQkgZm9yIHhmc19pbG9jaygpIGZvciBhIGxpc3Qgb2YgdmFsaWQgdmFsdWVzLgorICogYm5vIC0tIHRoZSBibG9jayBudW1iZXIgc3RhcnRpbmcgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBpbm9kZSwKKyAqCSAgaWYga25vd24gKGFzIGJ5IGJ1bGtzdGF0KSwgZWxzZSAwLgorICovCitTVEFUSUMgaW50Cit4ZnNfaWdldF9jb3JlKAorCXZub2RlX3QJCSp2cCwKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19pbm9fdAlpbm8sCisJdWludAkJZmxhZ3MsCisJdWludAkJbG9ja19mbGFncywKKwl4ZnNfaW5vZGVfdAkqKmlwcCwKKwl4ZnNfZGFkZHJfdAlibm8pCit7CisJeGZzX2loYXNoX3QJKmloOworCXhmc19pbm9kZV90CSppcDsKKwl4ZnNfaW5vZGVfdAkqaXE7CisJdm5vZGVfdAkJKmlub2RlX3ZwOworCXVsb25nCQl2ZXJzaW9uOworCWludAkJZXJyb3I7CisJLyogUkVGRVJFTkNFRCAqLworCXhmc19jaGFzaF90CSpjaDsKKwl4ZnNfY2hhc2hsaXN0X3QJKmNobCwgKmNobG5ldzsKKwlTUExERUNMKHMpOworCisKKwlpaCA9IFhGU19JSEFTSChtcCwgaW5vKTsKKworYWdhaW46CisJcmVhZF9sb2NrKCZpaC0+aWhfbG9jayk7CisKKwlmb3IgKGlwID0gaWgtPmloX25leHQ7IGlwICE9IE5VTEw7IGlwID0gaXAtPmlfbmV4dCkgeworCQlpZiAoaXAtPmlfaW5vID09IGlubykgeworCQkJLyoKKwkJCSAqIElmIElORVcgaXMgc2V0IHRoaXMgaW5vZGUgaXMgYmVpbmcgc2V0IHVwCisJCQkgKiB3ZSBuZWVkIHRvIHBhdXNlIGFuZCB0cnkgYWdhaW4uCisJCQkgKi8KKwkJCWlmIChpcC0+aV9mbGFncyAmIFhGU19JTkVXKSB7CisJCQkJcmVhZF91bmxvY2soJmloLT5paF9sb2NrKTsKKwkJCQlkZWxheSgxKTsKKwkJCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2ZyZWN5Y2xlKTsKKworCQkJCWdvdG8gYWdhaW47CisJCQl9CisKKwkJCWlub2RlX3ZwID0gWEZTX0lUT1ZfTlVMTChpcCk7CisJCQlpZiAoaW5vZGVfdnAgPT0gTlVMTCkgeworCQkJCS8qCisJCQkJICogSWYgSVJFQ0xBSU0gaXMgc2V0IHRoaXMgaW5vZGUgaXMKKwkJCQkgKiBvbiBpdHMgd2F5IG91dCBvZiB0aGUgc3lzdGVtLAorCQkJCSAqIHdlIG5lZWQgdG8gcGF1c2UgYW5kIHRyeSBhZ2Fpbi4KKwkJCQkgKi8KKwkJCQlpZiAoaXAtPmlfZmxhZ3MgJiBYRlNfSVJFQ0xBSU0pIHsKKwkJCQkJcmVhZF91bmxvY2soJmloLT5paF9sb2NrKTsKKwkJCQkJZGVsYXkoMSk7CisJCQkJCVhGU19TVEFUU19JTkMoeHNfaWdfZnJlY3ljbGUpOworCisJCQkJCWdvdG8gYWdhaW47CisJCQkJfQorCisJCQkJdm5fdHJhY2VfZXhpdCh2cCwgInhmc19pZ2V0LmFsbG9jIiwKKwkJCQkJKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCisJCQkJWEZTX1NUQVRTX0lOQyh4c19pZ19mb3VuZCk7CisKKwkJCQlpcC0+aV9mbGFncyAmPSB+WEZTX0lSRUNMQUlNQUJMRTsKKwkJCQlyZWFkX3VubG9jaygmaWgtPmloX2xvY2spOworCisJCQkJWEZTX01PVU5UX0lMT0NLKG1wKTsKKwkJCQlsaXN0X2RlbF9pbml0KCZpcC0+aV9yZWNsYWltKTsKKwkJCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7CisKKwkJCQlnb3RvIGZpbmlzaF9pbm9kZTsKKworCQkJfSBlbHNlIGlmICh2cCAhPSBpbm9kZV92cCkgeworCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBMSU5WRlNfR0VUX0lQKGlub2RlX3ZwKTsKKworCQkJCS8qIFRoZSBpbm9kZSBpcyBiZWluZyB0b3JuIGRvd24sIHBhdXNlIGFuZAorCQkJCSAqIHRyeSBhZ2Fpbi4KKwkJCQkgKi8KKwkJCQlpZiAoaW5vZGUtPmlfc3RhdGUgJiAoSV9GUkVFSU5HIHwgSV9DTEVBUikpIHsKKwkJCQkJcmVhZF91bmxvY2soJmloLT5paF9sb2NrKTsKKwkJCQkJZGVsYXkoMSk7CisJCQkJCVhGU19TVEFUU19JTkMoeHNfaWdfZnJlY3ljbGUpOworCisJCQkJCWdvdG8gYWdhaW47CisJCQkJfQorLyogQ2hhbmNlcyBhcmUgdGhlIG90aGVyIHZub2RlICh0aGUgb25lIGluIHRoZSBpbm9kZSkgaXMgYmVpbmcgdG9ybgorICogZG93biByaWdodCBub3csIGFuZCB3ZSBsYW5kZWQgb24gdG9wIG9mIGl0LiBRdWVzdGlvbiBpcywgd2hhdCBkbworICogd2UgZG8/IFVuaG9vayB0aGUgb2xkIGlub2RlIGFuZCBob29rIHVwIHRoZSBuZXcgb25lPworICovCisJCQkJY21uX2VycihDRV9QQU5JQywKKwkJCSJ4ZnNfaWdldF9jb3JlOiBhbWJpZ3VvdXMgdm5zOiB2cC8weCVwLCBpbnZwLzB4JXAiLAorCQkJCQkJaW5vZGVfdnAsIHZwKTsKKwkJCX0KKworCQkJcmVhZF91bmxvY2soJmloLT5paF9sb2NrKTsKKworCQkJWEZTX1NUQVRTX0lOQyh4c19pZ19mb3VuZCk7CisKK2ZpbmlzaF9pbm9kZToKKwkJCWlmIChpcC0+aV9kLmRpX21vZGUgPT0gMCkgeworCQkJCWlmICghKGZsYWdzICYgSUdFVF9DUkVBVEUpKQorCQkJCQlyZXR1cm4gRU5PRU5UOworCQkJCXhmc19pb2NvcmVfaW5vZGVfcmVpbml0KGlwKTsKKwkJCX0KKwkKKwkJCWlmIChsb2NrX2ZsYWdzICE9IDApCisJCQkJeGZzX2lsb2NrKGlwLCBsb2NrX2ZsYWdzKTsKKworCQkJaXAtPmlfZmxhZ3MgJj0gflhGU19JU1RBTEU7CisKKwkJCXZuX3RyYWNlX2V4aXQodnAsICJ4ZnNfaWdldC5mb3VuZCIsCisJCQkJCQkoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisJCQlnb3RvIHJldHVybl9pcDsKKwkJfQorCX0KKworCS8qCisJICogSW5vZGUgY2FjaGUgbWlzczogc2F2ZSB0aGUgaGFzaCBjaGFpbiB2ZXJzaW9uIHN0YW1wIGFuZCB1bmxvY2sKKwkgKiB0aGUgY2hhaW4sIHNvIHdlIGRvbid0IGRlYWRsb2NrIGluIHZuX2FsbG9jLgorCSAqLworCVhGU19TVEFUU19JTkMoeHNfaWdfbWlzc2VkKTsKKworCXZlcnNpb24gPSBpaC0+aWhfdmVyc2lvbjsKKworCXJlYWRfdW5sb2NrKCZpaC0+aWhfbG9jayk7CisKKwkvKgorCSAqIFJlYWQgdGhlIGRpc2sgaW5vZGUgYXR0cmlidXRlcyBpbnRvIGEgbmV3IGlub2RlIHN0cnVjdHVyZSBhbmQgZ2V0CisJICogYSBuZXcgdm5vZGUgZm9yIGl0LiBUaGlzIHNob3VsZCBhbHNvIGluaXRpYWxpemUgaV9pbm8gYW5kIGlfbW91bnQuCisJICovCisJZXJyb3IgPSB4ZnNfaXJlYWQobXAsIHRwLCBpbm8sICZpcCwgYm5vKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCXZuX3RyYWNlX2V4aXQodnAsICJ4ZnNfaWdldC5hbGxvYyIsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKworCXhmc19pbm9kZV9sb2NrX2luaXQoaXAsIHZwKTsKKwl4ZnNfaW9jb3JlX2lub2RlX2luaXQoaXApOworCisJaWYgKGxvY2tfZmxhZ3MgIT0gMCkgeworCQl4ZnNfaWxvY2soaXAsIGxvY2tfZmxhZ3MpOworCX0KKwkJCisJaWYgKChpcC0+aV9kLmRpX21vZGUgPT0gMCkgJiYgIShmbGFncyAmIElHRVRfQ1JFQVRFKSkgeworCQl4ZnNfaWRlc3Ryb3koaXApOworCQlyZXR1cm4gRU5PRU5UOworCX0KKworCS8qCisJICogUHV0IGlwIG9uIGl0cyBoYXNoIGNoYWluLCB1bmxlc3Mgc29tZW9uZSBlbHNlIGhhc2hlZCBhIGR1cGxpY2F0ZQorCSAqIGFmdGVyIHdlIHJlbGVhc2VkIHRoZSBoYXNoIGxvY2suCisJICovCisJd3JpdGVfbG9jaygmaWgtPmloX2xvY2spOworCisJaWYgKGloLT5paF92ZXJzaW9uICE9IHZlcnNpb24pIHsKKwkJZm9yIChpcSA9IGloLT5paF9uZXh0OyBpcSAhPSBOVUxMOyBpcSA9IGlxLT5pX25leHQpIHsKKwkJCWlmIChpcS0+aV9pbm8gPT0gaW5vKSB7CisJCQkJd3JpdGVfdW5sb2NrKCZpaC0+aWhfbG9jayk7CisJCQkJeGZzX2lkZXN0cm95KGlwKTsKKworCQkJCVhGU19TVEFUU19JTkMoeHNfaWdfZHVwKTsKKwkJCQlnb3RvIGFnYWluOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBUaGVzZSB2YWx1ZXMgX211c3RfIGJlIHNldCBiZWZvcmUgcmVsZWFzaW5nIGlobG9jayEKKwkgKi8KKwlpcC0+aV9oYXNoID0gaWg7CisJaWYgKChpcSA9IGloLT5paF9uZXh0KSkgeworCQlpcS0+aV9wcmV2cCA9ICZpcC0+aV9uZXh0OworCX0KKwlpcC0+aV9uZXh0ID0gaXE7CisJaXAtPmlfcHJldnAgPSAmaWgtPmloX25leHQ7CisJaWgtPmloX25leHQgPSBpcDsKKwlpcC0+aV91ZHF1b3QgPSBpcC0+aV9nZHF1b3QgPSBOVUxMOworCWloLT5paF92ZXJzaW9uKys7CisJaXAtPmlfZmxhZ3MgfD0gWEZTX0lORVc7CisKKwl3cml0ZV91bmxvY2soJmloLT5paF9sb2NrKTsKKworCS8qCisJICogcHV0IGlwIG9uIGl0cyBjbHVzdGVyJ3MgaGFzaCBjaGFpbgorCSAqLworCUFTU0VSVChpcC0+aV9jaGFzaCA9PSBOVUxMICYmIGlwLT5pX2NwcmV2ID09IE5VTEwgJiYKKwkgICAgICAgaXAtPmlfY25leHQgPT0gTlVMTCk7CisKKwljaGxuZXcgPSBOVUxMOworCWNoID0gWEZTX0NIQVNIKG1wLCBpcC0+aV9ibGtubyk7CisgY2hscmVkbzoKKwlzID0gbXV0ZXhfc3BpbmxvY2soJmNoLT5jaF9sb2NrKTsKKwlmb3IgKGNobCA9IGNoLT5jaF9saXN0OyBjaGwgIT0gTlVMTDsgY2hsID0gY2hsLT5jaGxfbmV4dCkgeworCQlpZiAoY2hsLT5jaGxfYmxrbm8gPT0gaXAtPmlfYmxrbm8pIHsKKworCQkJLyogaW5zZXJ0IHRoaXMgaW5vZGUgaW50byB0aGUgZG91Ymx5LWxpbmtlZCBsaXN0CisJCQkgKiB3aGVyZSBjaGwgcG9pbnRzICovCisJCQlpZiAoKGlxID0gY2hsLT5jaGxfaXApKSB7CisJCQkJaXAtPmlfY3ByZXYgPSBpcS0+aV9jcHJldjsKKwkJCQlpcS0+aV9jcHJldi0+aV9jbmV4dCA9IGlwOworCQkJCWlxLT5pX2NwcmV2ID0gaXA7CisJCQkJaXAtPmlfY25leHQgPSBpcTsKKwkJCX0gZWxzZSB7CisJCQkJaXAtPmlfY25leHQgPSBpcDsKKwkJCQlpcC0+aV9jcHJldiA9IGlwOworCQkJfQorCQkJY2hsLT5jaGxfaXAgPSBpcDsKKwkJCWlwLT5pX2NoYXNoID0gY2hsOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBubyBoYXNoIGxpc3QgZm91bmQgZm9yIHRoaXMgYmxvY2s7IGFkZCBhIG5ldyBoYXNoIGxpc3QgKi8KKwlpZiAoY2hsID09IE5VTEwpICB7CisJCWlmIChjaGxuZXcgPT0gTlVMTCkgeworCQkJbXV0ZXhfc3BpbnVubG9jaygmY2gtPmNoX2xvY2ssIHMpOworCQkJQVNTRVJUKHhmc19jaGFzaGxpc3Rfem9uZSAhPSBOVUxMKTsKKwkJCWNobG5ldyA9ICh4ZnNfY2hhc2hsaXN0X3QgKikKKwkJCQkJa21lbV96b25lX2FsbG9jKHhmc19jaGFzaGxpc3Rfem9uZSwKKwkJCQkJCUtNX1NMRUVQKTsKKwkJCUFTU0VSVChjaGxuZXcgIT0gTlVMTCk7CisJCQlnb3RvIGNobHJlZG87CisJCX0gZWxzZSB7CisJCQlpcC0+aV9jbmV4dCA9IGlwOworCQkJaXAtPmlfY3ByZXYgPSBpcDsKKwkJCWlwLT5pX2NoYXNoID0gY2hsbmV3OworCQkJY2hsbmV3LT5jaGxfaXAgPSBpcDsKKwkJCWNobG5ldy0+Y2hsX2Jsa25vID0gaXAtPmlfYmxrbm87CisJCQljaGxuZXctPmNobF9uZXh0ID0gY2gtPmNoX2xpc3Q7CisJCQljaC0+Y2hfbGlzdCA9IGNobG5ldzsKKwkJCWNobG5ldyA9IE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY2hsbmV3ICE9IE5VTEwpIHsKKwkJCWttZW1fem9uZV9mcmVlKHhmc19jaGFzaGxpc3Rfem9uZSwgY2hsbmV3KTsKKwkJfQorCX0KKworCW11dGV4X3NwaW51bmxvY2soJmNoLT5jaF9sb2NrLCBzKTsKKworCisJLyoKKwkgKiBMaW5rIGlwIHRvIGl0cyBtb3VudCBhbmQgdGhyZWFkIGl0IG9uIHRoZSBtb3VudCdzIGlub2RlIGxpc3QuCisJICovCisJWEZTX01PVU5UX0lMT0NLKG1wKTsKKwlpZiAoKGlxID0gbXAtPm1faW5vZGVzKSkgeworCQlBU1NFUlQoaXEtPmlfbXByZXYtPmlfbW5leHQgPT0gaXEpOworCQlpcC0+aV9tcHJldiA9IGlxLT5pX21wcmV2OworCQlpcS0+aV9tcHJldi0+aV9tbmV4dCA9IGlwOworCQlpcS0+aV9tcHJldiA9IGlwOworCQlpcC0+aV9tbmV4dCA9IGlxOworCX0gZWxzZSB7CisJCWlwLT5pX21uZXh0ID0gaXA7CisJCWlwLT5pX21wcmV2ID0gaXA7CisJfQorCW1wLT5tX2lub2RlcyA9IGlwOworCisJWEZTX01PVU5UX0lVTkxPQ0sobXApOworCisgcmV0dXJuX2lwOgorCUFTU0VSVChpcC0+aV9kZi5pZl9leHRfbWF4ID09CisJICAgICAgIFhGU19JRk9SS19EU0laRShpcCkgLyBzaXplb2YoeGZzX2JtYnRfcmVjX3QpKTsKKworCUFTU0VSVCgoKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSAhPSAwKSA9PQorCSAgICAgICAoKGlwLT5pX2lvY29yZS5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpICE9IDApKTsKKworCSppcHAgPSBpcDsKKworCS8qCisJICogSWYgd2UgaGF2ZSBhIHJlYWwgdHlwZSBmb3IgYW4gb24tZGlzayBpbm9kZSwgd2UgY2FuIHNldCBvcHMoJnVubG9jaykKKwkgKiBub3cuCSBJZiBpdCdzIGEgbmV3IGlub2RlIGJlaW5nIGNyZWF0ZWQsIHhmc19pYWxsb2Mgd2lsbCBoYW5kbGUgaXQuCisJICovCisJVkZTX0lOSVRfVk5PREUoWEZTX01UT1ZGUyhtcCksIHZwLCBYRlNfSVRPQkhWKGlwKSwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogVGhlICdub3JtYWwnIGludGVybmFsIHhmc19pZ2V0LCBpZiBuZWVkZWQgaXQgd2lsbAorICogJ2FsbG9jYXRlJywgb3IgJ2dldCcsIHRoZSB2bm9kZS4KKyAqLworaW50Cit4ZnNfaWdldCgKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19pbm9fdAlpbm8sCisJdWludAkJZmxhZ3MsCisJdWludAkJbG9ja19mbGFncywKKwl4ZnNfaW5vZGVfdAkqKmlwcCwKKwl4ZnNfZGFkZHJfdAlibm8pCit7CisJc3RydWN0IGlub2RlCSppbm9kZTsKKwl2bm9kZV90CQkqdnAgPSBOVUxMOworCWludAkJZXJyb3I7CisKK3JldHJ5OgorCVhGU19TVEFUU19JTkMoeHNfaWdfYXR0ZW1wdHMpOworCisJaWYgKChpbm9kZSA9IGlnZXRfbG9ja2VkKFhGU19NVE9WRlMobXApLT52ZnNfc3VwZXIsIGlubykpKSB7CisJCWJodl9kZXNjX3QJKmJkcDsKKwkJeGZzX2lub2RlX3QJKmlwOworCQlpbnQJCW5ld25vZGU7CisKKwkJdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKwkJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKK2lub2RlX2FsbG9jYXRlOgorCQkJdm5faW5pdGlhbGl6ZShpbm9kZSk7CisJCQllcnJvciA9IHhmc19pZ2V0X2NvcmUodnAsIG1wLCB0cCwgaW5vLCBmbGFncywKKwkJCQkJbG9ja19mbGFncywgaXBwLCBibm8pOworCQkJaWYgKGVycm9yKSB7CisJCQkJdm5fbWFya19iYWQodnApOworCQkJCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKQorCQkJCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwkJCQlpcHV0KGlub2RlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFRoZXNlIGFyZSB0cnVlIGlmIHRoZSBpbm9kZSBpcyBpbiBpbmFjdGl2ZSBvcgorCQkJICogcmVjbGFpbS4gVGhlIGxpbnV4IGlub2RlIGlzIGFib3V0IHRvIGdvIGF3YXksCisJCQkgKiB3YWl0IGZvciB0aGF0IHBhdGggdG8gZmluaXNoLCBhbmQgdHJ5IGFnYWluLgorCQkJICovCisJCQlpZiAodnAtPnZfZmxhZyAmIChWSU5BQ1QgfCBWUkVDTE0pKSB7CisJCQkJdm5fd2FpdCh2cCk7CisJCQkJaXB1dChpbm9kZSk7CisJCQkJZ290byByZXRyeTsKKwkJCX0KKworCQkJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKKwkJCQlpcHV0KGlub2RlKTsKKwkJCQlyZXR1cm4gRUlPOworCQkJfQorCisJCQliZHAgPSB2bl9iaHZfbG9va3VwKFZOX0JIVl9IRUFEKHZwKSwgJnhmc192bm9kZW9wcyk7CisJCQlpZiAoYmRwID09IE5VTEwpIHsKKwkJCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2R1cCk7CisJCQkJZ290byBpbm9kZV9hbGxvY2F0ZTsKKwkJCX0KKwkJCWlwID0gWEZTX0JIVlRPSShiZHApOworCQkJaWYgKGxvY2tfZmxhZ3MgIT0gMCkKKwkJCQl4ZnNfaWxvY2soaXAsIGxvY2tfZmxhZ3MpOworCQkJbmV3bm9kZSA9IChpcC0+aV9kLmRpX21vZGUgPT0gMCk7CisJCQlpZiAobmV3bm9kZSkKKwkJCQl4ZnNfaW9jb3JlX2lub2RlX3JlaW5pdChpcCk7CisJCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2ZvdW5kKTsKKwkJCSppcHAgPSBpcDsKKwkJCWVycm9yID0gMDsKKwkJfQorCX0gZWxzZQorCQllcnJvciA9IEVOT01FTTsJLyogSWYgd2UgZ290IG5vIGlub2RlIHdlIGFyZSBvdXQgb2YgbWVtb3J5ICovCisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBEbyB0aGUgc2V0dXAgZm9yIHRoZSB2YXJpb3VzIGxvY2tzIHdpdGhpbiB0aGUgaW5jb3JlIGlub2RlLgorICovCit2b2lkCit4ZnNfaW5vZGVfbG9ja19pbml0KAorCXhmc19pbm9kZV90CSppcCwKKwl2bm9kZV90CQkqdnApCit7CisJbXJsb2NrX2luaXQoJmlwLT5pX2xvY2ssIE1STE9DS19BTExPV19FUVVBTF9QUkl8TVJMT0NLX0JBUlJJRVIsCisJCSAgICAgInhmc2lubyIsIChsb25nKXZwLT52X251bWJlcik7CisJbXJsb2NrX2luaXQoJmlwLT5pX2lvbG9jaywgTVJMT0NLX0JBUlJJRVIsICJ4ZnNpbyIsIHZwLT52X251bWJlcik7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaXAtPmlfaXBpbl93YWl0KTsKKwlhdG9taWNfc2V0KCZpcC0+aV9waW5jb3VudCwgMCk7CisJaW5pdF9zZW1hKCZpcC0+aV9mbG9jaywgMSwgInhmc2Zpbm8iLCB2cC0+dl9udW1iZXIpOworfQorCisvKgorICogTG9vayBmb3IgdGhlIGlub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGlubyBpbiB0aGUgaGFzaCB0YWJsZS4KKyAqIElmIGl0IGlzIHRoZXJlIGFuZCBpdHMgaV90cmFuc3AgcG9pbnRlciBtYXRjaGVzIHRwLCByZXR1cm4gaXQuCisgKiBPdGhlcndpc2UsIHJldHVybiBOVUxMLgorICovCit4ZnNfaW5vZGVfdCAqCit4ZnNfaW5vZGVfaW5jb3JlKHhmc19tb3VudF90CSptcCwKKwkJIHhmc19pbm9fdAlpbm8sCisJCSB4ZnNfdHJhbnNfdAkqdHApCit7CisJeGZzX2loYXNoX3QJKmloOworCXhmc19pbm9kZV90CSppcDsKKworCWloID0gWEZTX0lIQVNIKG1wLCBpbm8pOworCXJlYWRfbG9jaygmaWgtPmloX2xvY2spOworCWZvciAoaXAgPSBpaC0+aWhfbmV4dDsgaXAgIT0gTlVMTDsgaXAgPSBpcC0+aV9uZXh0KSB7CisJCWlmIChpcC0+aV9pbm8gPT0gaW5vKSB7CisJCQkvKgorCQkJICogSWYgd2UgZmluZCBpdCBhbmQgdHAgbWF0Y2hlcywgcmV0dXJuIGl0LgorCQkJICogT3RoZXJ3aXNlIGJyZWFrIGZyb20gdGhlIGxvb3AgYW5kIHJldHVybgorCQkJICogTlVMTC4KKwkJCSAqLworCQkJaWYgKGlwLT5pX3RyYW5zcCA9PSB0cCkgeworCQkJCXJlYWRfdW5sb2NrKCZpaC0+aWhfbG9jayk7CisJCQkJcmV0dXJuIChpcCk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmaWgtPmloX2xvY2spOworCXJldHVybiAoTlVMTCk7Cit9CisKKy8qCisgKiBEZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IG9mIGFuIGlub2RlIHN0cnVjdHVyZSBhbmQgdW5sb2NrIGl0LgorICoKKyAqIGlwIC0tIHRoZSBpbm9kZSBiZWluZyByZWxlYXNlZAorICogbG9ja19mbGFncyAtLSB0aGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIGlub2RlJ3MgbG9ja3MgdG8gYmUKKyAqICAgICAgIHRvIGJlIHJlbGVhc2VkLiAgU2VlIHRoZSBjb21tZW50IG9uIHhmc19pdW5sb2NrKCkgZm9yIGEgbGlzdAorICoJIG9mIHZhbGlkIHZhbHVlcy4KKyAqLwordm9pZAoreGZzX2lwdXQoeGZzX2lub2RlX3QJKmlwLAorCSB1aW50CQlsb2NrX2ZsYWdzKQoreworCXZub2RlX3QJKnZwID0gWEZTX0lUT1YoaXApOworCisJdm5fdHJhY2VfZW50cnkodnAsICJ4ZnNfaXB1dCIsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKworCXhmc19pdW5sb2NrKGlwLCBsb2NrX2ZsYWdzKTsKKworCVZOX1JFTEUodnApOworfQorCisvKgorICogU3BlY2lhbCBpcHV0IGZvciBicmFuZC1uZXcgaW5vZGVzIHRoYXQgYXJlIHN0aWxsIGxvY2tlZAorICovCit2b2lkCit4ZnNfaXB1dF9uZXcoeGZzX2lub2RlX3QJKmlwLAorCSAgICAgdWludAkJbG9ja19mbGFncykKK3sKKwl2bm9kZV90CQkqdnAgPSBYRlNfSVRPVihpcCk7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IExJTlZGU19HRVRfSVAodnApOworCisJdm5fdHJhY2VfZW50cnkodnAsICJ4ZnNfaXB1dF9uZXciLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwlpZiAoKGlwLT5pX2QuZGlfbW9kZSA9PSAwKSkgeworCQlBU1NFUlQoIShpcC0+aV9mbGFncyAmIFhGU19JUkVDTEFJTUFCTEUpKTsKKwkJdm5fbWFya19iYWQodnApOworCX0KKwlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykKKwkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CisJaWYgKGxvY2tfZmxhZ3MpCisJCXhmc19pdW5sb2NrKGlwLCBsb2NrX2ZsYWdzKTsKKwlWTl9SRUxFKHZwKTsKK30KKworCisvKgorICogVGhpcyByb3V0aW5lIGVtYm9kaWVzIHRoZSBwYXJ0IG9mIHRoZSByZWNsYWltIGNvZGUgdGhhdCBwdWxscworICogdGhlIGlub2RlIGZyb20gdGhlIGlub2RlIGhhc2ggdGFibGUgYW5kIHRoZSBtb3VudCBzdHJ1Y3R1cmUncworICogaW5vZGUgbGlzdC4KKyAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20geGZzX3JlY2xhaW0oKS4KKyAqLwordm9pZAoreGZzX2lyZWNsYWltKHhmc19pbm9kZV90ICppcCkKK3sKKwl2bm9kZV90CQkqdnA7CisKKwkvKgorCSAqIFJlbW92ZSBmcm9tIG9sZCBoYXNoIGxpc3QgYW5kIG1vdW50IGxpc3QuCisJICovCisJWEZTX1NUQVRTX0lOQyh4c19pZ19yZWNsYWltcyk7CisKKwl4ZnNfaWV4dHJhY3QoaXApOworCisJLyoKKwkgKiBIZXJlIHdlIGRvIGEgc3B1cmlvdXMgaW5vZGUgbG9jayBpbiBvcmRlciB0byBjb29yZGluYXRlIHdpdGgKKwkgKiB4ZnNfc3luYygpLiAgVGhpcyBpcyBiZWNhdXNlIHhmc19zeW5jKCkgcmVmZXJlbmNlcyB0aGUgaW5vZGVzCisJICogaW4gdGhlIG1vdW50IGxpc3Qgd2l0aG91dCB0YWtpbmcgcmVmZXJlbmNlcyBvbiB0aGUgY29ycmVzcG9uZGluZworCSAqIHZub2Rlcy4gIFdlIG1ha2UgdGhhdCBPSyBoZXJlIGJ5IGVuc3VyaW5nIHRoYXQgd2Ugd2FpdCB1bnRpbAorCSAqIHRoZSBpbm9kZSBpcyB1bmxvY2tlZCBpbiB4ZnNfc3luYygpIGJlZm9yZSB3ZSBnbyBhaGVhZCBhbmQKKwkgKiBmcmVlIGl0LiAgV2UgZ2V0IGJvdGggdGhlIHJlZ3VsYXIgbG9jayBhbmQgdGhlIGlvIGxvY2sgYmVjYXVzZQorCSAqIHRoZSB4ZnNfc3luYygpIGNvZGUgbWF5IG5lZWQgdG8gZHJvcCB0aGUgcmVndWxhciBvbmUgYnV0IHdpbGwKKwkgKiBzdGlsbCBob2xkIHRoZSBpbyBsb2NrLgorCSAqLworCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOworCisJLyoKKwkgKiBSZWxlYXNlIGRxdW90cyAoYW5kIHRoZWlyIHJlZmVyZW5jZXMpIGlmIGFueS4gQW4gaW5vZGUgbWF5IGVzY2FwZQorCSAqIHhmc19pbmFjdGl2ZSBhbmQgZ2V0IGhlcmUgdmlhIHZuX2FsbG9jLT52bl9yZWNsYWltIHBhdGguCisJICovCisJWEZTX1FNX0RRREVUQUNIKGlwLT5pX21vdW50LCBpcCk7CisKKwkvKgorCSAqIFB1bGwgb3VyIGJlaGF2aW9yIGRlc2NyaXB0b3IgZnJvbSB0aGUgdm5vZGUgY2hhaW4uCisJICovCisJdnAgPSBYRlNfSVRPVl9OVUxMKGlwKTsKKwlpZiAodnApIHsKKwkJdm5fYmh2X3JlbW92ZShWTl9CSFZfSEVBRCh2cCksIFhGU19JVE9CSFYoaXApKTsKKwl9CisKKwkvKgorCSAqIEZyZWUgYWxsIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGlub2RlLgorCSAqLworCXhmc19pZGVzdHJveShpcCk7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgcmVtb3ZlcyBhbiBhYm91dC10by1iZS1kZXN0cm95ZWQgaW5vZGUgZnJvbQorICogYWxsIG9mIHRoZSBsaXN0cyBpbiB3aGljaCBpdCBpcyBsb2NhdGVkIHdpdGggdGhlIGV4Y2VwdGlvbgorICogb2YgdGhlIGJlaGF2aW9yIGNoYWluLgorICovCit2b2lkCit4ZnNfaWV4dHJhY3QoCisJeGZzX2lub2RlX3QJKmlwKQoreworCXhmc19paGFzaF90CSppaDsKKwl4ZnNfaW5vZGVfdAkqaXE7CisJeGZzX21vdW50X3QJKm1wOworCXhmc19jaGFzaF90CSpjaDsKKwl4ZnNfY2hhc2hsaXN0X3QgKmNobCwgKmNobTsKKwlTUExERUNMKHMpOworCisJaWggPSBpcC0+aV9oYXNoOworCXdyaXRlX2xvY2soJmloLT5paF9sb2NrKTsKKwlpZiAoKGlxID0gaXAtPmlfbmV4dCkpIHsKKwkJaXEtPmlfcHJldnAgPSBpcC0+aV9wcmV2cDsKKwl9CisJKmlwLT5pX3ByZXZwID0gaXE7CisJd3JpdGVfdW5sb2NrKCZpaC0+aWhfbG9jayk7CisKKwkvKgorCSAqIFJlbW92ZSBmcm9tIGNsdXN0ZXIgaGFzaCBsaXN0CisJICogICAxKSBkZWxldGUgdGhlIGNoYXNobGlzdCBpZiB0aGlzIGlzIHRoZSBsYXN0IGlub2RlIG9uIHRoZSBjaGFzaGxpc3QKKwkgKiAgIDIpIHVuY2hhaW4gZnJvbSBsaXN0IG9mIGlub2RlcworCSAqICAgMykgcG9pbnQgY2hhc2hsaXN0LT5jaGxfaXAgdG8gJ2NobF9uZXh0JyBpZiB0byB0aGlzIGlub2RlLgorCSAqLworCW1wID0gaXAtPmlfbW91bnQ7CisJY2ggPSBYRlNfQ0hBU0gobXAsIGlwLT5pX2Jsa25vKTsKKwlzID0gbXV0ZXhfc3BpbmxvY2soJmNoLT5jaF9sb2NrKTsKKworCWlmIChpcC0+aV9jbmV4dCA9PSBpcCkgeworCQkvKiBMYXN0IGlub2RlIG9uIGNoYXNobGlzdCAqLworCQlBU1NFUlQoaXAtPmlfY25leHQgPT0gaXAgJiYgaXAtPmlfY3ByZXYgPT0gaXApOworCQlBU1NFUlQoaXAtPmlfY2hhc2ggIT0gTlVMTCk7CisJCWNobT1OVUxMOworCQlmb3IgKGNobCA9IGNoLT5jaF9saXN0OyBjaGwgIT0gTlVMTDsgY2hsID0gY2hsLT5jaGxfbmV4dCkgeworCQkJaWYgKGNobC0+Y2hsX2Jsa25vID09IGlwLT5pX2Jsa25vKSB7CisJCQkJaWYgKGNobSA9PSBOVUxMKSB7CisJCQkJCS8qIGZpcnN0IGl0ZW0gb24gdGhlIGxpc3QgKi8KKwkJCQkJY2gtPmNoX2xpc3QgPSBjaGwtPmNobF9uZXh0OworCQkJCX0gZWxzZSB7CisJCQkJCWNobS0+Y2hsX25leHQgPSBjaGwtPmNobF9uZXh0OworCQkJCX0KKwkJCQlrbWVtX3pvbmVfZnJlZSh4ZnNfY2hhc2hsaXN0X3pvbmUsIGNobCk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCUFTU0VSVChjaGwtPmNobF9pcCAhPSBpcCk7CisJCQkJY2htID0gY2hsOworCQkJfQorCQl9CisJCUFTU0VSVF9BTFdBWVMoY2hsICE9IE5VTEwpOworICAgICAgIH0gZWxzZSB7CisJCS8qIGRlbGV0ZSBvbmUgaW5vZGUgZnJvbSBhIG5vbi1lbXB0eSBsaXN0ICovCisJCWlxID0gaXAtPmlfY25leHQ7CisJCWlxLT5pX2NwcmV2ID0gaXAtPmlfY3ByZXY7CisJCWlwLT5pX2NwcmV2LT5pX2NuZXh0ID0gaXE7CisJCWlmIChpcC0+aV9jaGFzaC0+Y2hsX2lwID09IGlwKSB7CisJCQlpcC0+aV9jaGFzaC0+Y2hsX2lwID0gaXE7CisJCX0KKwkJaXAtPmlfY2hhc2ggPSBfX3JldHVybl9hZGRyZXNzOworCQlpcC0+aV9jcHJldiA9IF9fcmV0dXJuX2FkZHJlc3M7CisJCWlwLT5pX2NuZXh0ID0gX19yZXR1cm5fYWRkcmVzczsKKwl9CisJbXV0ZXhfc3BpbnVubG9jaygmY2gtPmNoX2xvY2ssIHMpOworCisJLyoKKwkgKiBSZW1vdmUgZnJvbSBtb3VudCdzIGlub2RlIGxpc3QuCisJICovCisJWEZTX01PVU5UX0lMT0NLKG1wKTsKKwlBU1NFUlQoKGlwLT5pX21uZXh0ICE9IE5VTEwpICYmIChpcC0+aV9tcHJldiAhPSBOVUxMKSk7CisJaXEgPSBpcC0+aV9tbmV4dDsKKwlpcS0+aV9tcHJldiA9IGlwLT5pX21wcmV2OworCWlwLT5pX21wcmV2LT5pX21uZXh0ID0gaXE7CisKKwkvKgorCSAqIEZpeCB1cCB0aGUgaGVhZCBwb2ludGVyIGlmIGl0IHBvaW50cyB0byB0aGUgaW5vZGUgYmVpbmcgZGVsZXRlZC4KKwkgKi8KKwlpZiAobXAtPm1faW5vZGVzID09IGlwKSB7CisJCWlmIChpcCA9PSBpcSkgeworCQkJbXAtPm1faW5vZGVzID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCW1wLT5tX2lub2RlcyA9IGlxOworCQl9CisJfQorCisJLyogRGVhbCB3aXRoIHRoZSBkZWxldGVkIGlub2RlcyBsaXN0ICovCisJbGlzdF9kZWxfaW5pdCgmaXAtPmlfcmVjbGFpbSk7CisKKwltcC0+bV9pcmVjbGFpbXMrKzsKKwlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGEgd3JhcHBlciByb3V0aW5lIGFyb3VuZCB0aGUgeGZzX2lsb2NrKCkgcm91dGluZQorICogdXNlZCB0byBjZW50cmFsaXplIHNvbWUgZ3J1bmd5IGNvZGUuICBJdCBpcyB1c2VkIGluIHBsYWNlcworICogdGhhdCB3aXNoIHRvIGxvY2sgdGhlIGlub2RlIHNvbGVseSBmb3IgcmVhZGluZyB0aGUgZXh0ZW50cy4KKyAqIFRoZSByZWFzb24gdGhlc2UgcGxhY2VzIGNhbid0IGp1c3QgY2FsbCB4ZnNfaWxvY2soU0hBUkVEKQorICogaXMgdGhhdCB0aGUgaW5vZGUgbG9jayBhbHNvIGd1YXJkcyB0byBicmluZ2luZyBpbiBvZiB0aGUKKyAqIGV4dGVudHMgZnJvbSBkaXNrIGZvciBhIGZpbGUgaW4gYi10cmVlIGZvcm1hdC4gIElmIHRoZSBpbm9kZQorICogaXMgaW4gYi10cmVlIGZvcm1hdCwgdGhlbiB3ZSBuZWVkIHRvIGxvY2sgdGhlIGlub2RlIGV4Y2x1c2l2ZWx5CisgKiB1bnRpbCB0aGUgZXh0ZW50cyBhcmUgcmVhZCBpbi4gIExvY2tpbmcgaXQgZXhjbHVzaXZlbHkgYWxsCisgKiB0aGUgdGltZSB3b3VsZCBsaW1pdCBvdXIgcGFyYWxsZWxpc20gdW5uZWNlc3NhcmlseSwgdGhvdWdoLgorICogV2hhdCB3ZSBkbyBpbnN0ZWFkIGlzIGNoZWNrIHRvIHNlZSBpZiB0aGUgZXh0ZW50cyBoYXZlIGJlZW4KKyAqIHJlYWQgaW4geWV0LCBhbmQgb25seSBsb2NrIHRoZSBpbm9kZSBleGNsdXNpdmVseSBpZiB0aGV5CisgKiBoYXZlIG5vdC4KKyAqCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIHZhbHVlIHdoaWNoIHNob3VsZCBiZSBnaXZlbiB0byB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgeGZzX2l1bmxvY2tfbWFwX3NoYXJlZCgpLiAgVGhpcyB2YWx1ZSBpcworICogdGhlIG1vZGUgaW4gd2hpY2ggdGhlIGxvY2sgd2FzIGFjdHVhbGx5IHRha2VuLgorICovCit1aW50Cit4ZnNfaWxvY2tfbWFwX3NoYXJlZCgKKwl4ZnNfaW5vZGVfdAkqaXApCit7CisJdWludAlsb2NrX21vZGU7CisKKwlpZiAoKGlwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0JUUkVFKSAmJgorCSAgICAoKGlwLT5pX2RmLmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykgPT0gMCkpIHsKKwkJbG9ja19tb2RlID0gWEZTX0lMT0NLX0VYQ0w7CisJfSBlbHNlIHsKKwkJbG9ja19tb2RlID0gWEZTX0lMT0NLX1NIQVJFRDsKKwl9CisKKwl4ZnNfaWxvY2soaXAsIGxvY2tfbW9kZSk7CisKKwlyZXR1cm4gbG9ja19tb2RlOworfQorCisvKgorICogVGhpcyBpcyBzaW1wbHkgdGhlIHVubG9jayByb3V0aW5lIHRvIGdvIHdpdGggeGZzX2lsb2NrX21hcF9zaGFyZWQoKS4KKyAqIEFsbCBpdCBkb2VzIGlzIGNhbGwgeGZzX2l1bmxvY2soKSB3aXRoIHRoZSBnaXZlbiBsb2NrX21vZGUuCisgKi8KK3ZvaWQKK3hmc19pdW5sb2NrX21hcF9zaGFyZWQoCisJeGZzX2lub2RlX3QJKmlwLAorCXVuc2lnbmVkIGludAlsb2NrX21vZGUpCit7CisJeGZzX2l1bmxvY2soaXAsIGxvY2tfbW9kZSk7Cit9CisKKy8qCisgKiBUaGUgeGZzIGlub2RlIGNvbnRhaW5zIDIgbG9ja3M6IGEgbXVsdGktcmVhZGVyIGxvY2sgY2FsbGVkIHRoZQorICogaV9pb2xvY2sgYW5kIGEgbXVsdGktcmVhZGVyIGxvY2sgY2FsbGVkIHRoZSBpX2xvY2suICBUaGlzIHJvdXRpbmUKKyAqIGFsbG93cyBlaXRoZXIgb3IgYm90aCBvZiB0aGUgbG9ja3MgdG8gYmUgb2J0YWluZWQuCisgKgorICogVGhlIDIgbG9ja3Mgc2hvdWxkIGFsd2F5cyBiZSBvcmRlcmVkIHNvIHRoYXQgdGhlIElPIGxvY2sgaXMKKyAqIG9idGFpbmVkIGZpcnN0IGluIG9yZGVyIHRvIHByZXZlbnQgZGVhZGxvY2suCisgKgorICogaXAgLS0gdGhlIGlub2RlIGJlaW5nIGxvY2tlZAorICogbG9ja19mbGFncyAtLSB0aGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIGlub2RlJ3MgbG9ja3MKKyAqICAgICAgIHRvIGJlIGxvY2tlZC4gIEl0IGNhbiBiZToKKyAqCQlYRlNfSU9MT0NLX1NIQVJFRCwKKyAqCQlYRlNfSU9MT0NLX0VYQ0wsCisgKgkJWEZTX0lMT0NLX1NIQVJFRCwKKyAqCQlYRlNfSUxPQ0tfRVhDTCwKKyAqCQlYRlNfSU9MT0NLX1NIQVJFRCB8IFhGU19JTE9DS19TSEFSRUQsCisgKgkJWEZTX0lPTE9DS19TSEFSRUQgfCBYRlNfSUxPQ0tfRVhDTCwKKyAqCQlYRlNfSU9MT0NLX0VYQ0wgfCBYRlNfSUxPQ0tfU0hBUkVELAorICoJCVhGU19JT0xPQ0tfRVhDTCB8IFhGU19JTE9DS19FWENMCisgKi8KK3ZvaWQKK3hmc19pbG9jayh4ZnNfaW5vZGVfdAkqaXAsCisJICB1aW50CQlsb2NrX2ZsYWdzKQoreworCS8qCisJICogWW91IGNhbid0IHNldCBib3RoIFNIQVJFRCBhbmQgRVhDTCBmb3IgdGhlIHNhbWUgbG9jaywKKwkgKiBhbmQgb25seSBYRlNfSU9MT0NLX1NIQVJFRCwgWEZTX0lPTE9DS19FWENMLCBYRlNfSUxPQ0tfU0hBUkVELAorCSAqIGFuZCBYRlNfSUxPQ0tfRVhDTCBhcmUgdmFsaWQgdmFsdWVzIHRvIHNldCBpbiBsb2NrX2ZsYWdzLgorCSAqLworCUFTU0VSVCgobG9ja19mbGFncyAmIChYRlNfSU9MT0NLX1NIQVJFRCB8IFhGU19JT0xPQ0tfRVhDTCkpICE9CisJICAgICAgIChYRlNfSU9MT0NLX1NIQVJFRCB8IFhGU19JT0xPQ0tfRVhDTCkpOworCUFTU0VSVCgobG9ja19mbGFncyAmIChYRlNfSUxPQ0tfU0hBUkVEIHwgWEZTX0lMT0NLX0VYQ0wpKSAhPQorCSAgICAgICAoWEZTX0lMT0NLX1NIQVJFRCB8IFhGU19JTE9DS19FWENMKSk7CisJQVNTRVJUKChsb2NrX2ZsYWdzICYgflhGU19MT0NLX01BU0spID09IDApOworCisJaWYgKGxvY2tfZmxhZ3MgJiBYRlNfSU9MT0NLX0VYQ0wpIHsKKwkJbXJ1cGRhdGUoJmlwLT5pX2lvbG9jayk7CisJfSBlbHNlIGlmIChsb2NrX2ZsYWdzICYgWEZTX0lPTE9DS19TSEFSRUQpIHsKKwkJbXJhY2Nlc3MoJmlwLT5pX2lvbG9jayk7CisJfQorCWlmIChsb2NrX2ZsYWdzICYgWEZTX0lMT0NLX0VYQ0wpIHsKKwkJbXJ1cGRhdGUoJmlwLT5pX2xvY2spOworCX0gZWxzZSBpZiAobG9ja19mbGFncyAmIFhGU19JTE9DS19TSEFSRUQpIHsKKwkJbXJhY2Nlc3MoJmlwLT5pX2xvY2spOworCX0KKwl4ZnNfaWxvY2tfdHJhY2UoaXAsIDEsIGxvY2tfZmxhZ3MsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKK30KKworLyoKKyAqIFRoaXMgaXMganVzdCBsaWtlIHhmc19pbG9jaygpLCBleGNlcHQgdGhhdCB0aGUgY2FsbGVyCisgKiBpcyBndWFyYW50ZWVkIG5vdCB0byBzbGVlcC4gIEl0IHJldHVybnMgMSBpZiBpdCBnZXRzCisgKiB0aGUgcmVxdWVzdGVkIGxvY2tzIGFuZCAwIG90aGVyd2lzZS4gIElmIHRoZSBJTyBsb2NrIGlzCisgKiBvYnRhaW5lZCBidXQgdGhlIGlub2RlIGxvY2sgY2Fubm90IGJlLCB0aGVuIHRoZSBJTyBsb2NrCisgKiBpcyBkcm9wcGVkIGJlZm9yZSByZXR1cm5pbmcuCisgKgorICogaXAgLS0gdGhlIGlub2RlIGJlaW5nIGxvY2tlZAorICogbG9ja19mbGFncyAtLSB0aGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIGlub2RlJ3MgbG9ja3MgdG8gYmUKKyAqICAgICAgIHRvIGJlIGxvY2tlZC4gIFNlZSB0aGUgY29tbWVudCBmb3IgeGZzX2lsb2NrKCkgZm9yIGEgbGlzdAorICoJIG9mIHZhbGlkIHZhbHVlcy4KKyAqCisgKi8KK2ludAoreGZzX2lsb2NrX25vd2FpdCh4ZnNfaW5vZGVfdAkqaXAsCisJCSB1aW50CQlsb2NrX2ZsYWdzKQoreworCWludAlpb2xvY2tlZDsKKwlpbnQJaWxvY2tlZDsKKworCS8qCisJICogWW91IGNhbid0IHNldCBib3RoIFNIQVJFRCBhbmQgRVhDTCBmb3IgdGhlIHNhbWUgbG9jaywKKwkgKiBhbmQgb25seSBYRlNfSU9MT0NLX1NIQVJFRCwgWEZTX0lPTE9DS19FWENMLCBYRlNfSUxPQ0tfU0hBUkVELAorCSAqIGFuZCBYRlNfSUxPQ0tfRVhDTCBhcmUgdmFsaWQgdmFsdWVzIHRvIHNldCBpbiBsb2NrX2ZsYWdzLgorCSAqLworCUFTU0VSVCgobG9ja19mbGFncyAmIChYRlNfSU9MT0NLX1NIQVJFRCB8IFhGU19JT0xPQ0tfRVhDTCkpICE9CisJICAgICAgIChYRlNfSU9MT0NLX1NIQVJFRCB8IFhGU19JT0xPQ0tfRVhDTCkpOworCUFTU0VSVCgobG9ja19mbGFncyAmIChYRlNfSUxPQ0tfU0hBUkVEIHwgWEZTX0lMT0NLX0VYQ0wpKSAhPQorCSAgICAgICAoWEZTX0lMT0NLX1NIQVJFRCB8IFhGU19JTE9DS19FWENMKSk7CisJQVNTRVJUKChsb2NrX2ZsYWdzICYgflhGU19MT0NLX01BU0spID09IDApOworCisJaW9sb2NrZWQgPSAwOworCWlmIChsb2NrX2ZsYWdzICYgWEZTX0lPTE9DS19FWENMKSB7CisJCWlvbG9ja2VkID0gbXJ0cnl1cGRhdGUoJmlwLT5pX2lvbG9jayk7CisJCWlmICghaW9sb2NrZWQpIHsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIGlmIChsb2NrX2ZsYWdzICYgWEZTX0lPTE9DS19TSEFSRUQpIHsKKwkJaW9sb2NrZWQgPSBtcnRyeWFjY2VzcygmaXAtPmlfaW9sb2NrKTsKKwkJaWYgKCFpb2xvY2tlZCkgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKGxvY2tfZmxhZ3MgJiBYRlNfSUxPQ0tfRVhDTCkgeworCQlpbG9ja2VkID0gbXJ0cnl1cGRhdGUoJmlwLT5pX2xvY2spOworCQlpZiAoIWlsb2NrZWQpIHsKKwkJCWlmIChpb2xvY2tlZCkgeworCQkJCW1ydW5sb2NrKCZpcC0+aV9pb2xvY2spOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgaWYgKGxvY2tfZmxhZ3MgJiBYRlNfSUxPQ0tfU0hBUkVEKSB7CisJCWlsb2NrZWQgPSBtcnRyeWFjY2VzcygmaXAtPmlfbG9jayk7CisJCWlmICghaWxvY2tlZCkgeworCQkJaWYgKGlvbG9ja2VkKSB7CisJCQkJbXJ1bmxvY2soJmlwLT5pX2lvbG9jayk7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwl4ZnNfaWxvY2tfdHJhY2UoaXAsIDIsIGxvY2tfZmxhZ3MsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIHhmc19pdW5sb2NrKCkgaXMgdXNlZCB0byBkcm9wIHRoZSBpbm9kZSBsb2NrcyBhY3F1aXJlZCB3aXRoCisgKiB4ZnNfaWxvY2soKSBhbmQgeGZzX2lsb2NrX25vd2FpdCgpLiAgVGhlIGNhbGxlciBtdXN0IHBhc3MKKyAqIGluIHRoZSBmbGFncyBnaXZlbiB0byB4ZnNfaWxvY2soKSBvciB4ZnNfaWxvY2tfbm93YWl0KCkgc28KKyAqIHRoYXQgd2Uga25vdyB3aGljaCBsb2NrcyB0byBkcm9wLgorICoKKyAqIGlwIC0tIHRoZSBpbm9kZSBiZWluZyB1bmxvY2tlZAorICogbG9ja19mbGFncyAtLSB0aGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIGlub2RlJ3MgbG9ja3MgdG8gYmUKKyAqICAgICAgIHRvIGJlIHVubG9ja2VkLiAgU2VlIHRoZSBjb21tZW50IGZvciB4ZnNfaWxvY2soKSBmb3IgYSBsaXN0CisgKgkgb2YgdmFsaWQgdmFsdWVzIGZvciB0aGlzIHBhcmFtZXRlci4KKyAqCisgKi8KK3ZvaWQKK3hmc19pdW5sb2NrKHhmc19pbm9kZV90CSppcCwKKwkgICAgdWludAlsb2NrX2ZsYWdzKQoreworCS8qCisJICogWW91IGNhbid0IHNldCBib3RoIFNIQVJFRCBhbmQgRVhDTCBmb3IgdGhlIHNhbWUgbG9jaywKKwkgKiBhbmQgb25seSBYRlNfSU9MT0NLX1NIQVJFRCwgWEZTX0lPTE9DS19FWENMLCBYRlNfSUxPQ0tfU0hBUkVELAorCSAqIGFuZCBYRlNfSUxPQ0tfRVhDTCBhcmUgdmFsaWQgdmFsdWVzIHRvIHNldCBpbiBsb2NrX2ZsYWdzLgorCSAqLworCUFTU0VSVCgobG9ja19mbGFncyAmIChYRlNfSU9MT0NLX1NIQVJFRCB8IFhGU19JT0xPQ0tfRVhDTCkpICE9CisJICAgICAgIChYRlNfSU9MT0NLX1NIQVJFRCB8IFhGU19JT0xPQ0tfRVhDTCkpOworCUFTU0VSVCgobG9ja19mbGFncyAmIChYRlNfSUxPQ0tfU0hBUkVEIHwgWEZTX0lMT0NLX0VYQ0wpKSAhPQorCSAgICAgICAoWEZTX0lMT0NLX1NIQVJFRCB8IFhGU19JTE9DS19FWENMKSk7CisJQVNTRVJUKChsb2NrX2ZsYWdzICYgfihYRlNfTE9DS19NQVNLIHwgWEZTX0lVTkxPQ0tfTk9OT1RJRlkpKSA9PSAwKTsKKwlBU1NFUlQobG9ja19mbGFncyAhPSAwKTsKKworCWlmIChsb2NrX2ZsYWdzICYgKFhGU19JT0xPQ0tfU0hBUkVEIHwgWEZTX0lPTE9DS19FWENMKSkgeworCQlBU1NFUlQoIShsb2NrX2ZsYWdzICYgWEZTX0lPTE9DS19TSEFSRUQpIHx8CisJCSAgICAgICAoaXNtcmxvY2tlZCgmaXAtPmlfaW9sb2NrLCBNUl9BQ0NFU1MpKSk7CisJCUFTU0VSVCghKGxvY2tfZmxhZ3MgJiBYRlNfSU9MT0NLX0VYQ0wpIHx8CisJCSAgICAgICAoaXNtcmxvY2tlZCgmaXAtPmlfaW9sb2NrLCBNUl9VUERBVEUpKSk7CisJCW1ydW5sb2NrKCZpcC0+aV9pb2xvY2spOworCX0KKworCWlmIChsb2NrX2ZsYWdzICYgKFhGU19JTE9DS19TSEFSRUQgfCBYRlNfSUxPQ0tfRVhDTCkpIHsKKwkJQVNTRVJUKCEobG9ja19mbGFncyAmIFhGU19JTE9DS19TSEFSRUQpIHx8CisJCSAgICAgICAoaXNtcmxvY2tlZCgmaXAtPmlfbG9jaywgTVJfQUNDRVNTKSkpOworCQlBU1NFUlQoIShsb2NrX2ZsYWdzICYgWEZTX0lMT0NLX0VYQ0wpIHx8CisJCSAgICAgICAoaXNtcmxvY2tlZCgmaXAtPmlfbG9jaywgTVJfVVBEQVRFKSkpOworCQltcnVubG9jaygmaXAtPmlfbG9jayk7CisKKwkJLyoKKwkJICogTGV0IHRoZSBBSUwga25vdyB0aGF0IHRoaXMgaXRlbSBoYXMgYmVlbiB1bmxvY2tlZCBpbiBjYXNlCisJCSAqIGl0IGlzIGluIHRoZSBBSUwgYW5kIGFueW9uZSBpcyB3YWl0aW5nIG9uIGl0LiAgRG9uJ3QgZG8KKwkJICogdGhpcyBpZiB0aGUgY2FsbGVyIGhhcyBhc2tlZCB1cyBub3QgdG8uCisJCSAqLworCQlpZiAoIShsb2NrX2ZsYWdzICYgWEZTX0lVTkxPQ0tfTk9OT1RJRlkpICYmCisJCSAgICAgaXAtPmlfaXRlbXAgIT0gTlVMTCkgeworCQkJeGZzX3RyYW5zX3VubG9ja2VkX2l0ZW0oaXAtPmlfbW91bnQsCisJCQkJCQkoeGZzX2xvZ19pdGVtX3QqKShpcC0+aV9pdGVtcCkpOworCQl9CisJfQorCXhmc19pbG9ja190cmFjZShpcCwgMywgbG9ja19mbGFncywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworfQorCisvKgorICogZ2l2ZSB1cCB3cml0ZSBsb2Nrcy4gIHRoZSBpL28gbG9jayBjYW5ub3QgYmUgaGVsZCBuZXN0ZWQKKyAqIGlmIGl0IGlzIGJlaW5nIGRlbW90ZWQuCisgKi8KK3ZvaWQKK3hmc19pbG9ja19kZW1vdGUoeGZzX2lub2RlX3QJKmlwLAorCQkgdWludAkJbG9ja19mbGFncykKK3sKKwlBU1NFUlQobG9ja19mbGFncyAmIChYRlNfSU9MT0NLX0VYQ0x8WEZTX0lMT0NLX0VYQ0wpKTsKKwlBU1NFUlQoKGxvY2tfZmxhZ3MgJiB+KFhGU19JT0xPQ0tfRVhDTHxYRlNfSUxPQ0tfRVhDTCkpID09IDApOworCisJaWYgKGxvY2tfZmxhZ3MgJiBYRlNfSUxPQ0tfRVhDTCkgeworCQlBU1NFUlQoaXNtcmxvY2tlZCgmaXAtPmlfbG9jaywgTVJfVVBEQVRFKSk7CisJCW1yZGVtb3RlKCZpcC0+aV9sb2NrKTsKKwl9CisJaWYgKGxvY2tfZmxhZ3MgJiBYRlNfSU9MT0NLX0VYQ0wpIHsKKwkJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2lvbG9jaywgTVJfVVBEQVRFKSk7CisJCW1yZGVtb3RlKCZpcC0+aV9pb2xvY2spOworCX0KK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgdGhyZWUgcm91dGluZXMgc2ltcGx5IG1hbmFnZSB0aGUgaV9mbG9jaworICogc2VtYXBob3JlIGVtYmVkZGVkIGluIHRoZSBpbm9kZS4gIFRoaXMgc2VtYXBob3JlIHN5bmNocm9uaXplcworICogcHJvY2Vzc2VzIGF0dGVtcHRpbmcgdG8gZmx1c2ggdGhlIGluLWNvcmUgaW5vZGUgYmFjayB0byBkaXNrLgorICovCit2b2lkCit4ZnNfaWZsb2NrKHhmc19pbm9kZV90ICppcCkKK3sKKwlwc2VtYSgmKGlwLT5pX2Zsb2NrKSwgUElOT0R8UExUV0FJVCk7Cit9CisKK2ludAoreGZzX2lmbG9ja19ub3dhaXQoeGZzX2lub2RlX3QgKmlwKQoreworCXJldHVybiAoY3BzZW1hKCYoaXAtPmlfZmxvY2spKSk7Cit9CisKK3ZvaWQKK3hmc19pZnVubG9jayh4ZnNfaW5vZGVfdCAqaXApCit7CisJQVNTRVJUKHZhbHVzZW1hKCYoaXAtPmlfZmxvY2spKSA8PSAwKTsKKwl2c2VtYSgmKGlwLT5pX2Zsb2NrKSk7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2ltYXAuaCBiL2ZzL3hmcy94ZnNfaW1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzODUwNjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2ltYXAuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfSU1BUF9IX18KKyNkZWZpbmUJX19YRlNfSU1BUF9IX18KKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBwYXNzZWQgdG8geGZzX2ltYXAoKSB0byBtYXAKKyAqIGFuIGlub2RlIG51bWJlciB0byBpdHMgb24gZGlzayBsb2NhdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2ltYXAgeworCXhmc19kYWRkcl90CWltX2Jsa25vOwkvKiBzdGFydGluZyBCQiBvZiBpbm9kZSBjaHVuayAqLworCXVpbnQJCWltX2xlbjsJCS8qIGxlbmd0aCBpbiBCQnMgb2YgaW5vZGUgY2h1bmsgKi8KKwl4ZnNfYWdibG9ja190CWltX2FnYmxrbm87CS8qIGxvZ2ljYWwgYmxvY2sgb2YgaW5vZGUgY2h1bmsgaW4gYWcgKi8KKwl1c2hvcnQJCWltX2lvZmZzZXQ7CS8qIGlub2RlIG9mZnNldCBpbiBibG9jayBpbiAiaW5vZGVzIiAqLworCXVzaG9ydAkJaW1fYm9mZnNldDsJLyogaW5vZGUgb2Zmc2V0IGluIGJsb2NrIGluIGJ5dGVzICovCit9IHhmc19pbWFwX3Q7CisKKyNpZmRlZiBfX0tFUk5FTF9fCitzdHJ1Y3QgeGZzX21vdW50Oworc3RydWN0IHhmc190cmFuczsKK2ludAl4ZnNfaW1hcChzdHJ1Y3QgeGZzX21vdW50ICosIHN0cnVjdCB4ZnNfdHJhbnMgKiwgeGZzX2lub190LAorCQkgeGZzX2ltYXBfdCAqLCB1aW50KTsKKyNlbmRpZgorCisjZW5kaWYJLyogX19YRlNfSU1BUF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGUuYyBiL2ZzL3hmcy94ZnNfaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2M2MzJhCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19pbm9kZS5jCkBAIC0wLDAgKzEsMzg3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnNfcHJpdi5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pbWFwLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX3V0aWxzLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfdHJhY2UuaCIKKyNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjLmgiCisjaW5jbHVkZSAieGZzX2FjbC5oIgorCisKK2ttZW1fem9uZV90ICp4ZnNfaWZvcmtfem9uZTsKK2ttZW1fem9uZV90ICp4ZnNfaW5vZGVfem9uZTsKK2ttZW1fem9uZV90ICp4ZnNfY2hhc2hsaXN0X3pvbmU7CisKKy8qCisgKiBVc2VkIGluIHhmc19pdHJ1bmNhdGUoKS4gIFRoaXMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGV4dGVudHMKKyAqIGZyZWVkIGZyb20gYSBmaWxlIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLgorICovCisjZGVmaW5lCVhGU19JVFJVTkNfTUFYX0VYVEVOVFMJMgorCitTVEFUSUMgaW50IHhmc19pZmx1c2hfaW50KHhmc19pbm9kZV90ICosIHhmc19idWZfdCAqKTsKK1NUQVRJQyBpbnQgeGZzX2lmb3JtYXRfbG9jYWwoeGZzX2lub2RlX3QgKiwgeGZzX2Rpbm9kZV90ICosIGludCwgaW50KTsKK1NUQVRJQyBpbnQgeGZzX2lmb3JtYXRfZXh0ZW50cyh4ZnNfaW5vZGVfdCAqLCB4ZnNfZGlub2RlX3QgKiwgaW50KTsKK1NUQVRJQyBpbnQgeGZzX2lmb3JtYXRfYnRyZWUoeGZzX2lub2RlX3QgKiwgeGZzX2Rpbm9kZV90ICosIGludCk7CisKKworI2lmZGVmIERFQlVHCisvKgorICogTWFrZSBzdXJlIHRoYXQgdGhlIGV4dGVudHMgaW4gdGhlIGdpdmVuIG1lbW9yeSBidWZmZXIKKyAqIGFyZSB2YWxpZC4KKyAqLworU1RBVElDIHZvaWQKK3hmc192YWxpZGF0ZV9leHRlbnRzKAorCXhmc19ibWJ0X3JlY190CQkqZXAsCisJaW50CQkJbnJlY3MsCisJaW50CQkJZGlzaywKKwl4ZnNfZXhudGZtdF90CQlmbXQpCit7CisJeGZzX2JtYnRfaXJlY190CQlpcmVjOworCXhmc19ibWJ0X3JlY190CQlyZWM7CisJaW50CQkJaTsKKworCWZvciAoaSA9IDA7IGkgPCBucmVjczsgaSsrKSB7CisJCXJlYy5sMCA9IGdldF91bmFsaWduZWQoKF9fdWludDY0X3QqKSZlcC0+bDApOworCQlyZWMubDEgPSBnZXRfdW5hbGlnbmVkKChfX3VpbnQ2NF90KikmZXAtPmwxKTsKKwkJaWYgKGRpc2spCisJCQl4ZnNfYm1idF9kaXNrX2dldF9hbGwoJnJlYywgJmlyZWMpOworCQllbHNlCisJCQl4ZnNfYm1idF9nZXRfYWxsKCZyZWMsICZpcmVjKTsKKwkJaWYgKGZtdCA9PSBYRlNfRVhURk1UX05PU1RBVEUpCisJCQlBU1NFUlQoaXJlYy5icl9zdGF0ZSA9PSBYRlNfRVhUX05PUk0pOworCQllcCsrOworCX0KK30KKyNlbHNlIC8qIERFQlVHICovCisjZGVmaW5lIHhmc192YWxpZGF0ZV9leHRlbnRzKGVwLCBucmVjcywgZGlzaywgZm10KQorI2VuZGlmIC8qIERFQlVHICovCisKKy8qCisgKiBDaGVjayB0aGF0IG5vbmUgb2YgdGhlIGlub2RlJ3MgaW4gdGhlIGJ1ZmZlciBoYXZlIGEgbmV4dAorICogdW5saW5rZWQgZmllbGQgb2YgMC4KKyAqLworI2lmIGRlZmluZWQoREVCVUcpCit2b2lkCit4ZnNfaW5vYnBfY2hlY2soCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19idWZfdAkqYnApCit7CisJaW50CQlpOworCWludAkJajsKKwl4ZnNfZGlub2RlX3QJKmRpcDsKKworCWogPSBtcC0+bV9pbm9kZV9jbHVzdGVyX3NpemUgPj4gbXAtPm1fc2Iuc2JfaW5vZGVsb2c7CisKKwlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisJCWRpcCA9ICh4ZnNfZGlub2RlX3QgKil4ZnNfYnVmX29mZnNldChicCwKKwkJCQkJaSAqIG1wLT5tX3NiLnNiX2lub2Rlc2l6ZSk7CisJCWlmICghZGlwLT5kaV9uZXh0X3VubGlua2VkKSAgeworCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLAorCQkJCSJEZXRlY3RlZCBhIGJvZ3VzIHplcm8gbmV4dF91bmxpbmtlZCBmaWVsZCBpbiBpbmNvcmUgaW5vZGUgYnVmZmVyIDB4JXAuICBBYm91dCB0byBwb3AgYW4gQVNTRVJULiIsCisJCQkJYnApOworCQkJQVNTRVJUKGRpcC0+ZGlfbmV4dF91bmxpbmtlZCk7CisJCX0KKwl9Cit9CisjZW5kaWYKKworLyoKKyAqIGNhbGxlZCBmcm9tIGJ3cml0ZSBvbiB4ZnMgaW5vZGUgYnVmZmVycworICovCit2b2lkCit4ZnNfaW5vYnBfYndjaGVjayh4ZnNfYnVmX3QgKmJwKQoreworCXhmc19tb3VudF90CSptcDsKKwlpbnQJCWk7CisJaW50CQlqOworCXhmc19kaW5vZGVfdAkqZGlwOworCisJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFMyhicCwgdm9pZCAqKSAhPSBOVUxMKTsKKworCW1wID0gWEZTX0JVRl9GU1BSSVZBVEUzKGJwLCB4ZnNfbW91bnRfdCAqKTsKKworCisJaiA9IG1wLT5tX2lub2RlX2NsdXN0ZXJfc2l6ZSA+PiBtcC0+bV9zYi5zYl9pbm9kZWxvZzsKKworCWZvciAoaSA9IDA7IGkgPCBqOyBpKyspICB7CisJCWRpcCA9ICh4ZnNfZGlub2RlX3QgKikgeGZzX2J1Zl9vZmZzZXQoYnAsCisJCQkJCQlpICogbXAtPm1fc2Iuc2JfaW5vZGVzaXplKTsKKwkJaWYgKElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX21hZ2ljLCBBUkNIX0NPTlZFUlQpICE9IFhGU19ESU5PREVfTUFHSUMpIHsKKwkJCWNtbl9lcnIoQ0VfV0FSTiwKKyJCYWQgbWFnaWMgIyAweCV4IGluIFhGUyBpbm9kZSBidWZmZXIgMHglTHgsIHN0YXJ0aW5nIGJsb2Nrbm8gJUxkLCBvZmZzZXQgMHgleCIsCisJCQkJSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfbWFnaWMsIEFSQ0hfQ09OVkVSVCksCisJCQkJKF9fdWludDY0X3QpKF9fcHN1bnNpZ25lZF90KSBicCwKKwkJCQkoX19pbnQ2NF90KSBYRlNfQlVGX0FERFIoYnApLAorCQkJCXhmc19idWZfb2Zmc2V0KGJwLCBpICogbXAtPm1fc2Iuc2JfaW5vZGVzaXplKSk7CisJCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBtcCwKKwkJCQkiY29ycnVwdCwgdW5tb3VudCBhbmQgcnVuIHhmc19yZXBhaXIiKTsKKwkJfQorCQlpZiAoIWRpcC0+ZGlfbmV4dF91bmxpbmtlZCkgIHsKKwkJCWNtbl9lcnIoQ0VfV0FSTiwKKyJCYWQgbmV4dF91bmxpbmtlZCBmaWVsZCAoMCkgaW4gWEZTIGlub2RlIGJ1ZmZlciAweCVwLCBzdGFydGluZyBibG9ja25vICVMZCwgb2Zmc2V0IDB4JXgiLAorCQkJCShfX3VpbnQ2NF90KShfX3BzdW5zaWduZWRfdCkgYnAsCisJCQkJKF9faW50NjRfdCkgWEZTX0JVRl9BRERSKGJwKSwKKwkJCQl4ZnNfYnVmX29mZnNldChicCwgaSAqIG1wLT5tX3NiLnNiX2lub2Rlc2l6ZSkpOworCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgbXAsCisJCQkJImNvcnJ1cHQsIHVubW91bnQgYW5kIHJ1biB4ZnNfcmVwYWlyIik7CisJCX0KKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIG1hcCBhbiBpbm9kZSBudW1iZXIgd2l0aGluIGEgZmlsZQorICogc3lzdGVtIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgb24tZGlzayB2ZXJzaW9uIG9mIHRoZQorICogaW5vZGUuICBJdCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlCisgKiBvbi1kaXNrIGlub2RlIGluIHRoZSBicHAgcGFyYW1ldGVyLCBhbmQgaW4gdGhlIGRpcCBwYXJhbWV0ZXIKKyAqIGl0IHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBvbi1kaXNrIGlub2RlIHdpdGhpbiB0aGF0IGJ1ZmZlci4KKyAqCisgKiBJZiBhIG5vbi16ZXJvIGVycm9yIGlzIHJldHVybmVkLCB0aGVuIHRoZSBjb250ZW50cyBvZiBicHAgYW5kCisgKiBkaXBwIGFyZSB1bmRlZmluZWQuCisgKgorICogVXNlIHhmc19pbWFwKCkgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIGFuZCBsb2NhdGlvbiBvZiB0aGUKKyAqIGJ1ZmZlciB0byByZWFkIGZyb20gZGlzay4KKyAqLworaW50Cit4ZnNfaW5vdG9icCgKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19pbm9fdAlpbm8sCisJeGZzX2Rpbm9kZV90CSoqZGlwcCwKKwl4ZnNfYnVmX3QJKipicHAsCisJaW50CQkqb2Zmc2V0KQoreworCWludAkJZGlfb2s7CisJeGZzX2ltYXBfdAlpbWFwOworCXhmc19idWZfdAkqYnA7CisJaW50CQllcnJvcjsKKwl4ZnNfZGlub2RlX3QJKmRpcDsKKworCS8qCisJICogQ2FsbCB0aGUgc3BhY2UgbWFuYWdtZW50IGNvZGUgdG8gZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlCisJICogaW5vZGUgb24gZGlzay4KKwkgKi8KKwlpbWFwLmltX2Jsa25vID0gMDsKKwllcnJvciA9IHhmc19pbWFwKG1wLCB0cCwgaW5vLCAmaW1hcCwgWEZTX0lNQVBfTE9PS1VQKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQljbW5fZXJyKENFX1dBUk4sCisJInhmc19pbm90b2JwOiB4ZnNfaW1hcCgpICByZXR1cm5lZCBhbiAiCisJImVycm9yICVkIG9uICVzLiAgUmV0dXJuaW5nIGVycm9yLiIsIGVycm9yLCBtcC0+bV9mc25hbWUpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgaW5vZGUgbnVtYmVyIG1hcHMgdG8gYSBibG9jayBvdXRzaWRlIHRoZSBib3VuZHMgb2YgdGhlCisJICogZmlsZSBzeXN0ZW0gdGhlbiByZXR1cm4gTlVMTCByYXRoZXIgdGhhbiBjYWxsaW5nIHJlYWRfYnVmCisJICogYW5kIHBhbmljaW5nIHdoZW4gd2UgZ2V0IGFuIGVycm9yIGZyb20gdGhlIGRyaXZlci4KKwkgKi8KKwlpZiAoKGltYXAuaW1fYmxrbm8gKyBpbWFwLmltX2xlbikgPgorCSAgICBYRlNfRlNCX1RPX0JCKG1wLCBtcC0+bV9zYi5zYl9kYmxvY2tzKSkgeworCQljbW5fZXJyKENFX1dBUk4sCisJInhmc19pbm90b2JwOiBpbm9kZSBudW1iZXIgKCVkICsgJWQpIG1hcHMgdG8gYSBibG9jayBvdXRzaWRlIHRoZSBib3VuZHMgIgorCSJvZiB0aGUgZmlsZSBzeXN0ZW0gJXMuICBSZXR1cm5pbmcgRUlOVkFMLiIsCisJCQlpbWFwLmltX2Jsa25vLCBpbWFwLmltX2xlbixtcC0+bV9mc25hbWUpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJfQorCisJLyoKKwkgKiBSZWFkIGluIHRoZSBidWZmZXIuICBJZiB0cCBpcyBOVUxMLCB4ZnNfdHJhbnNfcmVhZF9idWYoKSB3aWxsCisJICogZGVmYXVsdCB0byBqdXN0IGEgcmVhZF9idWYoKSBjYWxsLgorCSAqLworCWVycm9yID0geGZzX3RyYW5zX3JlYWRfYnVmKG1wLCB0cCwgbXAtPm1fZGRldl90YXJncCwgaW1hcC5pbV9ibGtubywKKwkJCQkgICAoaW50KWltYXAuaW1fbGVuLCBYRlNfQlVGX0xPQ0ssICZicCk7CisKKwlpZiAoZXJyb3IpIHsKKwkJY21uX2VycihDRV9XQVJOLAorCSJ4ZnNfaW5vdG9icDogeGZzX3RyYW5zX3JlYWRfYnVmKCkgIHJldHVybmVkIGFuICIKKwkiZXJyb3IgJWQgb24gJXMuICBSZXR1cm5pbmcgZXJyb3IuIiwgZXJyb3IsIG1wLT5tX2ZzbmFtZSk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJZGlwID0gKHhmc19kaW5vZGVfdCAqKXhmc19idWZfb2Zmc2V0KGJwLCAwKTsKKwlkaV9vayA9CisJCUlOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX21hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESU5PREVfTUFHSUMgJiYKKwkJWEZTX0RJTk9ERV9HT09EX1ZFUlNJT04oSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfdmVyc2lvbiwgQVJDSF9DT05WRVJUKSk7CisJaWYgKHVubGlrZWx5KFhGU19URVNUX0VSUk9SKCFkaV9vaywgbXAsIFhGU19FUlJUQUdfSVRPQlBfSU5PVE9CUCwKKwkJCVhGU19SQU5ET01fSVRPQlBfSU5PVE9CUCkpKSB7CisJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfaW5vdG9icCIsIFhGU19FUlJMRVZFTF9MT1csIG1wLCBkaXApOworCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkieGZzX2lub3RvYnA6IFhGU19URVNUX0VSUk9SKCkgIHJldHVybmVkIGFuICIKKwkiZXJyb3Igb24gJXMuICBSZXR1cm5pbmcgRUZTQ09SUlVQVEVELiIsICBtcC0+bV9mc25hbWUpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCisJeGZzX2lub2JwX2NoZWNrKG1wLCBicCk7CisKKwkvKgorCSAqIFNldCAqZGlwcCB0byBwb2ludCB0byB0aGUgb24tZGlzayBpbm9kZSBpbiB0aGUgYnVmZmVyLgorCSAqLworCSpkaXBwID0gKHhmc19kaW5vZGVfdCAqKXhmc19idWZfb2Zmc2V0KGJwLCBpbWFwLmltX2JvZmZzZXQpOworCSpicHAgPSBicDsKKwkqb2Zmc2V0ID0gaW1hcC5pbV9ib2Zmc2V0OworCXJldHVybiAwOworfQorCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIG1hcCBhbiBpbm9kZSB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcKKyAqIHRoZSBvbi1kaXNrIHZlcnNpb24gb2YgdGhlIGlub2RlLiAgSXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlCisgKiBidWZmZXIgY29udGFpbmluZyB0aGUgb24tZGlzayBpbm9kZSBpbiB0aGUgYnBwIHBhcmFtZXRlciwgYW5kIGluCisgKiB0aGUgZGlwIHBhcmFtZXRlciBpdCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgb24tZGlzayBpbm9kZSB3aXRoaW4KKyAqIHRoYXQgYnVmZmVyLgorICoKKyAqIElmIGEgbm9uLXplcm8gZXJyb3IgaXMgcmV0dXJuZWQsIHRoZW4gdGhlIGNvbnRlbnRzIG9mIGJwcCBhbmQKKyAqIGRpcHAgYXJlIHVuZGVmaW5lZC4KKyAqCisgKiBJZiB0aGUgaW5vZGUgaXMgbmV3IGFuZCBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLCB1c2UgeGZzX2ltYXAoKQorICogdG8gZGV0ZXJtaW5lIHRoZSBzaXplIGFuZCBsb2NhdGlvbiBvZiB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSBkaXNrLgorICogSWYgdGhlIGlub2RlIGhhcyBhbHJlYWR5IGJlZW4gbWFwcGVkIHRvIGl0cyBidWZmZXIgYW5kIHJlYWQgaW4gb25jZSwKKyAqIHRoZW4gdXNlIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgaW5vZGUgcmF0aGVyIHRoYW4KKyAqIGNhbGxpbmcgeGZzX2ltYXAoKS4gIFRoaXMgYWxsb3dzIHVzIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBsb29raW5nCisgKiBhdCB0aGUgaW5vZGUgYnRyZWUgZm9yIHNtYWxsIGJsb2NrIGZpbGUgc3lzdGVtcyAoc2VlIHhmc19kaWxvY2F0ZSgpKS4KKyAqIFdlIGNhbiB0ZWxsIHdoZXRoZXIgdGhlIGlub2RlIGhhcyBiZWVuIG1hcHBlZCBpbiBiZWZvcmUgYnkgY29tcGFyaW5nCisgKiBpdHMgZGlzayBibG9jayBhZGRyZXNzIHRvIDAuICBPbmx5IHVuaW5pdGlhbGl6ZWQgaW5vZGVzIHdpbGwgaGF2ZQorICogMCBmb3IgdGhlIGRpc2sgYmxvY2sgYWRkcmVzcy4KKyAqLworaW50Cit4ZnNfaXRvYnAoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfaW5vZGVfdAkqaXAsCisJeGZzX2Rpbm9kZV90CSoqZGlwcCwKKwl4ZnNfYnVmX3QJKipicHAsCisJeGZzX2RhZGRyX3QJYm5vKQoreworCXhmc19idWZfdAkqYnA7CisJaW50CQllcnJvcjsKKwl4ZnNfaW1hcF90CWltYXA7CisjaWZkZWYgX19LRVJORUxfXworCWludAkJaTsKKwlpbnQJCW5pOworI2VuZGlmCisKKwlpZiAoaXAtPmlfYmxrbm8gPT0gKHhmc19kYWRkcl90KTApIHsKKwkJLyoKKwkJICogQ2FsbCB0aGUgc3BhY2UgbWFuYWdlbWVudCBjb2RlIHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZQorCQkgKiBpbm9kZSBvbiBkaXNrLgorCQkgKi8KKwkJaW1hcC5pbV9ibGtubyA9IGJubzsKKwkJZXJyb3IgPSB4ZnNfaW1hcChtcCwgdHAsIGlwLT5pX2lubywgJmltYXAsIFhGU19JTUFQX0xPT0tVUCk7CisJCWlmIChlcnJvciAhPSAwKSB7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGUgaW5vZGUgbnVtYmVyIG1hcHMgdG8gYSBibG9jayBvdXRzaWRlIHRoZSBib3VuZHMKKwkJICogb2YgdGhlIGZpbGUgc3lzdGVtIHRoZW4gcmV0dXJuIE5VTEwgcmF0aGVyIHRoYW4gY2FsbGluZworCQkgKiByZWFkX2J1ZiBhbmQgcGFuaWNpbmcgd2hlbiB3ZSBnZXQgYW4gZXJyb3IgZnJvbSB0aGUKKwkJICogZHJpdmVyLgorCQkgKi8KKwkJaWYgKChpbWFwLmltX2Jsa25vICsgaW1hcC5pbV9sZW4pID4KKwkJICAgIFhGU19GU0JfVE9fQkIobXAsIG1wLT5tX3NiLnNiX2RibG9ja3MpKSB7CisjaWZkZWYgREVCVUcKKwkJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwgInhmc19pdG9icDogIgorCQkJCQkiKGltYXAuaW1fYmxrbm8gKDB4JWxseCkgIgorCQkJCQkiKyBpbWFwLmltX2xlbiAoMHglbGx4KSkgPiAiCisJCQkJCSIgWEZTX0ZTQl9UT19CQihtcCwgIgorCQkJCQkibXAtPm1fc2Iuc2JfZGJsb2NrcykgKDB4JWxseCkiLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBpbWFwLmltX2Jsa25vLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBpbWFwLmltX2xlbiwKKwkJCQkJWEZTX0ZTQl9UT19CQihtcCwgbXAtPm1fc2Iuc2JfZGJsb2NrcykpOworI2VuZGlmIC8qIERFQlVHICovCisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJCX0KKworCQkvKgorCQkgKiBGaWxsIGluIHRoZSBmaWVsZHMgaW4gdGhlIGlub2RlIHRoYXQgd2lsbCBiZSB1c2VkIHRvCisJCSAqIG1hcCB0aGUgaW5vZGUgdG8gaXRzIGJ1ZmZlciBmcm9tIG5vdyBvbi4KKwkJICovCisJCWlwLT5pX2Jsa25vID0gaW1hcC5pbV9ibGtubzsKKwkJaXAtPmlfbGVuID0gaW1hcC5pbV9sZW47CisJCWlwLT5pX2JvZmZzZXQgPSBpbWFwLmltX2JvZmZzZXQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogV2UndmUgYWxyZWFkeSBtYXBwZWQgdGhlIGlub2RlIG9uY2UsIHNvIGp1c3QgdXNlIHRoZQorCQkgKiBtYXBwaW5nIHRoYXQgd2Ugc2F2ZWQgdGhlIGZpcnN0IHRpbWUuCisJCSAqLworCQlpbWFwLmltX2Jsa25vID0gaXAtPmlfYmxrbm87CisJCWltYXAuaW1fbGVuID0gaXAtPmlfbGVuOworCQlpbWFwLmltX2JvZmZzZXQgPSBpcC0+aV9ib2Zmc2V0OworCX0KKwlBU1NFUlQoYm5vID09IDAgfHwgYm5vID09IGltYXAuaW1fYmxrbm8pOworCisJLyoKKwkgKiBSZWFkIGluIHRoZSBidWZmZXIuICBJZiB0cCBpcyBOVUxMLCB4ZnNfdHJhbnNfcmVhZF9idWYoKSB3aWxsCisJICogZGVmYXVsdCB0byBqdXN0IGEgcmVhZF9idWYoKSBjYWxsLgorCSAqLworCWVycm9yID0geGZzX3RyYW5zX3JlYWRfYnVmKG1wLCB0cCwgbXAtPm1fZGRldl90YXJncCwgaW1hcC5pbV9ibGtubywKKwkJCQkgICAoaW50KWltYXAuaW1fbGVuLCBYRlNfQlVGX0xPQ0ssICZicCk7CisKKwlpZiAoZXJyb3IpIHsKKyNpZmRlZiBERUJVRworCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsICJ4ZnNfaXRvYnA6ICIKKwkJCQkieGZzX3RyYW5zX3JlYWRfYnVmKCkgcmV0dXJuZWQgZXJyb3IgJWQsICIKKwkJCQkiaW1hcC5pbV9ibGtubyAweCVsbHgsIGltYXAuaW1fbGVuIDB4JWxseCIsCisJCQkJZXJyb3IsICh1bnNpZ25lZCBsb25nIGxvbmcpIGltYXAuaW1fYmxrbm8sCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgaW1hcC5pbV9sZW4pOworI2VuZGlmIC8qIERFQlVHICovCisJCXJldHVybiBlcnJvcjsKKwl9CisjaWZkZWYgX19LRVJORUxfXworCS8qCisJICogVmFsaWRhdGUgdGhlIG1hZ2ljIG51bWJlciBhbmQgdmVyc2lvbiBvZiBldmVyeSBpbm9kZSBpbiB0aGUgYnVmZmVyCisJICogKGlmIERFQlVHIGtlcm5lbCkgb3IgdGhlIGZpcnN0IGlub2RlIGluIHRoZSBidWZmZXIsIG90aGVyd2lzZS4KKwkgKi8KKyNpZmRlZiBERUJVRworCW5pID0gQkJUT0IoaW1hcC5pbV9sZW4pID4+IG1wLT5tX3NiLnNiX2lub2RlbG9nOworI2Vsc2UKKwluaSA9IDE7CisjZW5kaWYKKwlmb3IgKGkgPSAwOyBpIDwgbmk7IGkrKykgeworCQlpbnQJCWRpX29rOworCQl4ZnNfZGlub2RlX3QJKmRpcDsKKworCQlkaXAgPSAoeGZzX2Rpbm9kZV90ICopeGZzX2J1Zl9vZmZzZXQoYnAsCisJCQkJCShpIDw8IG1wLT5tX3NiLnNiX2lub2RlbG9nKSk7CisJCWRpX29rID0gSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfbWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJTk9ERV9NQUdJQyAmJgorCQkJICAgIFhGU19ESU5PREVfR09PRF9WRVJTSU9OKElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX3ZlcnNpb24sIEFSQ0hfQ09OVkVSVCkpOworCQlpZiAodW5saWtlbHkoWEZTX1RFU1RfRVJST1IoIWRpX29rLCBtcCwgWEZTX0VSUlRBR19JVE9CUF9JTk9UT0JQLAorCQkJCSBYRlNfUkFORE9NX0lUT0JQX0lOT1RPQlApKSkgeworI2lmZGVmIERFQlVHCisJCQlwcmRldigiYmFkIGlub2RlIG1hZ2ljL3ZzbiBkYWRkciAlbGxkICMlZCAobWFnaWM9JXgpIiwKKwkJCQltcC0+bV9kZGV2X3RhcmdwLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaW1hcC5pbV9ibGtubywgaSwKKwkJCQlJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9tYWdpYywgQVJDSF9DT05WRVJUKSk7CisjZW5kaWYKKwkJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfaXRvYnAiLCBYRlNfRVJSTEVWRUxfSElHSCwKKwkJCQkJICAgICBtcCwgZGlwKTsKKwkJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJfQorCX0KKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKwl4ZnNfaW5vYnBfY2hlY2sobXAsIGJwKTsKKworCS8qCisJICogTWFyayB0aGUgYnVmZmVyIGFzIGFuIGlub2RlIGJ1ZmZlciBub3cgdGhhdCBpdCBsb29rcyBnb29kCisJICovCisJWEZTX0JVRl9TRVRfVlRZUEUoYnAsIEJfRlNfSU5PKTsKKworCS8qCisJICogU2V0ICpkaXBwIHRvIHBvaW50IHRvIHRoZSBvbi1kaXNrIGlub2RlIGluIHRoZSBidWZmZXIuCisJICovCisJKmRpcHAgPSAoeGZzX2Rpbm9kZV90ICopeGZzX2J1Zl9vZmZzZXQoYnAsIGltYXAuaW1fYm9mZnNldCk7CisJKmJwcCA9IGJwOworCXJldHVybiAwOworfQorCisvKgorICogTW92ZSBpbm9kZSB0eXBlIGFuZCBpbm9kZSBmb3JtYXQgc3BlY2lmaWMgaW5mb3JtYXRpb24gZnJvbSB0aGUKKyAqIG9uLWRpc2sgaW5vZGUgdG8gdGhlIGluLWNvcmUgaW5vZGUuICBGb3IgZmlmb3MsIGRldnMsIGFuZCBzb2NrZXRzCisgKiB0aGlzIG1lYW5zIHNldCBpZl9yZGV2IHRvIHRoZSBwcm9wZXIgdmFsdWUuICBGb3IgZmlsZXMsIGRpcmVjdG9yaWVzLAorICogYW5kIHN5bWxpbmtzIHRoaXMgbWVhbnMgdG8gYnJpbmcgaW4gdGhlIGluLWxpbmUgZGF0YSBvciBleHRlbnQKKyAqIHBvaW50ZXJzLiAgRm9yIGEgZmlsZSBpbiBCLXRyZWUgZm9ybWF0LCBvbmx5IHRoZSByb290IGlzIGltbWVkaWF0ZWx5CisgKiBicm91Z2h0IGluLWNvcmUuICBUaGUgcmVzdCB3aWxsIGJlIGluLWxpbmVkIGluIGlmX2V4dGVudHMgd2hlbiBpdAorICogaXMgZmlyc3QgcmVmZXJlbmNlZCAoc2VlIHhmc19pcmVhZF9leHRlbnRzKCkpLgorICovCitTVEFUSUMgaW50Cit4ZnNfaWZvcm1hdCgKKwl4ZnNfaW5vZGVfdAkJKmlwLAorCXhmc19kaW5vZGVfdAkJKmRpcCkKK3sKKwl4ZnNfYXR0cl9zaG9ydGZvcm1fdAkqYXRwOworCWludAkJCXNpemU7CisJaW50CQkJZXJyb3I7CisJeGZzX2ZzaXplX3QgICAgICAgICAgICAgZGlfc2l6ZTsKKwlpcC0+aV9kZi5pZl9leHRfbWF4ID0KKwkJWEZTX0lGT1JLX0RTSVpFKGlwKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJZXJyb3IgPSAwOworCisJaWYgKHVubGlrZWx5KAorCSAgICBJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9uZXh0ZW50cywgQVJDSF9DT05WRVJUKSArCisJCUlOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX2FuZXh0ZW50cywgQVJDSF9DT05WRVJUKSA+CisJICAgIElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX25ibG9ja3MsIEFSQ0hfQ09OVkVSVCkpKSB7CisJCXhmc19mc19jbW5fZXJyKENFX1dBUk4sIGlwLT5pX21vdW50LAorCQkJImNvcnJ1cHQgZGlub2RlICVMdSwgZXh0ZW50IHRvdGFsID0gJWQsIG5ibG9ja3MgPSAlTHUuIgorCQkJIiAgVW5tb3VudCBhbmQgcnVuIHhmc19yZXBhaXIuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaXAtPmlfaW5vLAorCQkJKGludCkoSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfbmV4dGVudHMsIEFSQ0hfQ09OVkVSVCkKKwkJCSAgICArIElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX2FuZXh0ZW50cywgQVJDSF9DT05WRVJUKSksCisJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfbmJsb2NrcywgQVJDSF9DT05WRVJUKSk7CisJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfaWZvcm1hdCgxKSIsIFhGU19FUlJMRVZFTF9MT1csCisJCQkJICAgICBpcC0+aV9tb3VudCwgZGlwKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKworCWlmICh1bmxpa2VseShJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9mb3Jrb2ZmLCBBUkNIX0NPTlZFUlQpID4gaXAtPmlfbW91bnQtPm1fc2Iuc2JfaW5vZGVzaXplKSkgeworCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKKwkJCSJjb3JydXB0IGRpbm9kZSAlTHUsIGZvcmtvZmYgPSAweCV4LiIKKwkJCSIgIFVubW91bnQgYW5kIHJ1biB4ZnNfcmVwYWlyLiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWlwLT5pX2lubywKKwkJCShpbnQpKElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX2ZvcmtvZmYsIEFSQ0hfQ09OVkVSVCkpKTsKKwkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19pZm9ybWF0KDIpIiwgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkgICAgIGlwLT5pX21vdW50LCBkaXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCisJc3dpdGNoIChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZJRk86CisJY2FzZSBTX0lGQ0hSOgorCWNhc2UgU19JRkJMSzoKKwljYXNlIFNfSUZTT0NLOgorCQlpZiAodW5saWtlbHkoSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfZm9ybWF0LCBBUkNIX0NPTlZFUlQpICE9IFhGU19ESU5PREVfRk1UX0RFVikpIHsKKwkJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfaWZvcm1hdCgzKSIsIFhGU19FUlJMRVZFTF9MT1csCisJCQkJCSAgICAgIGlwLT5pX21vdW50LCBkaXApOworCQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQl9CisJCWlwLT5pX2QuZGlfc2l6ZSA9IDA7CisJCWlwLT5pX2RmLmlmX3UyLmlmX3JkZXYgPSBJTlRfR0VUKGRpcC0+ZGlfdS5kaV9kZXYsIEFSQ0hfQ09OVkVSVCk7CisJCWJyZWFrOworCisJY2FzZSBTX0lGUkVHOgorCWNhc2UgU19JRkxOSzoKKwljYXNlIFNfSUZESVI6CisJCXN3aXRjaCAoSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfZm9ybWF0LCBBUkNIX0NPTlZFUlQpKSB7CisJCWNhc2UgWEZTX0RJTk9ERV9GTVRfTE9DQUw6CisJCQkvKgorCQkJICogbm8gbG9jYWwgcmVndWxhciBmaWxlcyB5ZXQKKwkJCSAqLworCQkJaWYgKHVubGlrZWx5KChJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9tb2RlLCBBUkNIX0NPTlZFUlQpICYgU19JRk1UKSA9PSBTX0lGUkVHKSkgeworCQkJCXhmc19mc19jbW5fZXJyKENFX1dBUk4sIGlwLT5pX21vdW50LAorCQkJCQkiY29ycnVwdCBpbm9kZSAobG9jYWwgZm9ybWF0IGZvciByZWd1bGFyIGZpbGUpICVMdS4gIFVubW91bnQgYW5kIHJ1biB4ZnNfcmVwYWlyLiIsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGlwLT5pX2lubyk7CisJCQkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19pZm9ybWF0KDQpIiwKKwkJCQkJCSAgICAgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkJCSAgICAgaXAtPmlfbW91bnQsIGRpcCk7CisJCQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQkJfQorCisJCQlkaV9zaXplID0gSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfc2l6ZSwgQVJDSF9DT05WRVJUKTsKKwkJCWlmICh1bmxpa2VseShkaV9zaXplID4gWEZTX0RGT1JLX0RTSVpFKGRpcCwgaXAtPmlfbW91bnQpKSkgeworCQkJCXhmc19mc19jbW5fZXJyKENFX1dBUk4sIGlwLT5pX21vdW50LAorCQkJCQkiY29ycnVwdCBpbm9kZSAlTHUgKGJhZCBzaXplICVMZCBmb3IgbG9jYWwgaW5vZGUpLiAgVW5tb3VudCBhbmQgcnVuIHhmc19yZXBhaXIuIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgaXAtPmlfaW5vLAorCQkJCQkobG9uZyBsb25nKSBkaV9zaXplKTsKKwkJCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2lmb3JtYXQoNSkiLAorCQkJCQkJICAgICBYRlNfRVJSTEVWRUxfTE9XLAorCQkJCQkJICAgICBpcC0+aV9tb3VudCwgZGlwKTsKKwkJCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCQl9CisKKwkJCXNpemUgPSAoaW50KWRpX3NpemU7CisJCQllcnJvciA9IHhmc19pZm9ybWF0X2xvY2FsKGlwLCBkaXAsIFhGU19EQVRBX0ZPUkssIHNpemUpOworCQkJYnJlYWs7CisJCWNhc2UgWEZTX0RJTk9ERV9GTVRfRVhURU5UUzoKKwkJCWVycm9yID0geGZzX2lmb3JtYXRfZXh0ZW50cyhpcCwgZGlwLCBYRlNfREFUQV9GT1JLKTsKKwkJCWJyZWFrOworCQljYXNlIFhGU19ESU5PREVfRk1UX0JUUkVFOgorCQkJZXJyb3IgPSB4ZnNfaWZvcm1hdF9idHJlZShpcCwgZGlwLCBYRlNfREFUQV9GT1JLKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2lmb3JtYXQoNikiLCBYRlNfRVJSTEVWRUxfTE9XLAorCQkJCQkgaXAtPmlfbW91bnQpOworCQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2lmb3JtYXQoNykiLCBYRlNfRVJSTEVWRUxfTE9XLCBpcC0+aV9tb3VudCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJaWYgKCFYRlNfREZPUktfUShkaXApKQorCQlyZXR1cm4gMDsKKwlBU1NFUlQoaXAtPmlfYWZwID09IE5VTEwpOworCWlwLT5pX2FmcCA9IGttZW1fem9uZV96YWxsb2MoeGZzX2lmb3JrX3pvbmUsIEtNX1NMRUVQKTsKKwlpcC0+aV9hZnAtPmlmX2V4dF9tYXggPQorCQlYRlNfSUZPUktfQVNJWkUoaXApIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwlzd2l0Y2ggKElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX2Fmb3JtYXQsIEFSQ0hfQ09OVkVSVCkpIHsKKwljYXNlIFhGU19ESU5PREVfRk1UX0xPQ0FMOgorCQlhdHAgPSAoeGZzX2F0dHJfc2hvcnRmb3JtX3QgKilYRlNfREZPUktfQVBUUihkaXApOworCQlzaXplID0gKGludClJTlRfR0VUKGF0cC0+aGRyLnRvdHNpemUsIEFSQ0hfQ09OVkVSVCk7CisJCWVycm9yID0geGZzX2lmb3JtYXRfbG9jYWwoaXAsIGRpcCwgWEZTX0FUVFJfRk9SSywgc2l6ZSk7CisJCWJyZWFrOworCWNhc2UgWEZTX0RJTk9ERV9GTVRfRVhURU5UUzoKKwkJZXJyb3IgPSB4ZnNfaWZvcm1hdF9leHRlbnRzKGlwLCBkaXAsIFhGU19BVFRSX0ZPUkspOworCQlicmVhazsKKwljYXNlIFhGU19ESU5PREVfRk1UX0JUUkVFOgorCQllcnJvciA9IHhmc19pZm9ybWF0X2J0cmVlKGlwLCBkaXAsIFhGU19BVFRSX0ZPUkspOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJvciA9IFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQlicmVhazsKKwl9CisJaWYgKGVycm9yKSB7CisJCWttZW1fem9uZV9mcmVlKHhmc19pZm9ya196b25lLCBpcC0+aV9hZnApOworCQlpcC0+aV9hZnAgPSBOVUxMOworCQl4ZnNfaWRlc3Ryb3lfZm9yayhpcCwgWEZTX0RBVEFfRk9SSyk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFRoZSBmaWxlIGlzIGluLWxpbmVkIGluIHRoZSBvbi1kaXNrIGlub2RlLgorICogSWYgaXQgZml0cyBpbnRvIGlmX2lubGluZV9kYXRhLCB0aGVuIGNvcHkKKyAqIGl0IHRoZXJlLCBvdGhlcndpc2UgYWxsb2NhdGUgYSBidWZmZXIgZm9yIGl0CisgKiBhbmQgY29weSB0aGUgZGF0YSB0aGVyZS4gIEVpdGhlciB3YXksIHNldAorICogaWZfZGF0YSB0byBwb2ludCBhdCB0aGUgZGF0YS4KKyAqIElmIHdlIGFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgZGF0YSwgbWFrZQorICogc3VyZSB0aGF0IGl0cyBzaXplIGlzIGEgbXVsdGlwbGUgb2YgNCBhbmQKKyAqIHJlY29yZCB0aGUgcmVhbCBzaXplIGluIGlfcmVhbF9ieXRlcy4KKyAqLworU1RBVElDIGludAoreGZzX2lmb3JtYXRfbG9jYWwoCisJeGZzX2lub2RlX3QJKmlwLAorCXhmc19kaW5vZGVfdAkqZGlwLAorCWludAkJd2hpY2hmb3JrLAorCWludAkJc2l6ZSkKK3sKKwl4ZnNfaWZvcmtfdAkqaWZwOworCWludAkJcmVhbF9zaXplOworCisJLyoKKwkgKiBJZiB0aGUgc2l6ZSBpcyB1bnJlYXNvbmFibGUsIHRoZW4gc29tZXRoaW5nCisJICogaXMgd3JvbmcgYW5kIHdlIGp1c3QgYmFpbCBvdXQgcmF0aGVyIHRoYW4gY3Jhc2ggaW4KKwkgKiBrbWVtX2FsbG9jKCkgb3IgbWVtY3B5KCkgYmVsb3cuCisJICovCisJaWYgKHVubGlrZWx5KHNpemUgPiBYRlNfREZPUktfU0laRShkaXAsIGlwLT5pX21vdW50LCB3aGljaGZvcmspKSkgeworCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKKwkJCSJjb3JydXB0IGlub2RlICVMdSAoYmFkIHNpemUgJWQgZm9yIGxvY2FsIGZvcmssIHNpemUgPSAlZCkuICBVbm1vdW50IGFuZCBydW4geGZzX3JlcGFpci4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgaXAtPmlfaW5vLCBzaXplLAorCQkJWEZTX0RGT1JLX1NJWkUoZGlwLCBpcC0+aV9tb3VudCwgd2hpY2hmb3JrKSk7CisJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfaWZvcm1hdF9sb2NhbCIsIFhGU19FUlJMRVZFTF9MT1csCisJCQkJICAgICBpcC0+aV9tb3VudCwgZGlwKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCXJlYWxfc2l6ZSA9IDA7CisJaWYgKHNpemUgPT0gMCkKKwkJaWZwLT5pZl91MS5pZl9kYXRhID0gTlVMTDsKKwllbHNlIGlmIChzaXplIDw9IHNpemVvZihpZnAtPmlmX3UyLmlmX2lubGluZV9kYXRhKSkKKwkJaWZwLT5pZl91MS5pZl9kYXRhID0gaWZwLT5pZl91Mi5pZl9pbmxpbmVfZGF0YTsKKwllbHNlIHsKKwkJcmVhbF9zaXplID0gcm91bmR1cChzaXplLCA0KTsKKwkJaWZwLT5pZl91MS5pZl9kYXRhID0ga21lbV9hbGxvYyhyZWFsX3NpemUsIEtNX1NMRUVQKTsKKwl9CisJaWZwLT5pZl9ieXRlcyA9IHNpemU7CisJaWZwLT5pZl9yZWFsX2J5dGVzID0gcmVhbF9zaXplOworCWlmIChzaXplKQorCQltZW1jcHkoaWZwLT5pZl91MS5pZl9kYXRhLCBYRlNfREZPUktfUFRSKGRpcCwgd2hpY2hmb3JrKSwgc2l6ZSk7CisJaWZwLT5pZl9mbGFncyAmPSB+WEZTX0lGRVhURU5UUzsKKwlpZnAtPmlmX2ZsYWdzIHw9IFhGU19JRklOTElORTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSBmaWxlIGNvbnNpc3RzIG9mIGEgc2V0IG9mIGV4dGVudHMgYWxsCisgKiBvZiB3aGljaCBmaXQgaW50byB0aGUgb24tZGlzayBpbm9kZS4KKyAqIElmIHRoZXJlIGFyZSBmZXcgZW5vdWdoIGV4dGVudHMgdG8gZml0IGludG8KKyAqIHRoZSBpZl9pbmxpbmVfZXh0LCB0aGVuIGNvcHkgdGhlbSB0aGVyZS4KKyAqIE90aGVyd2lzZSBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlbSBhbmQgY29weQorICogdGhlbSBpbnRvIGl0LiAgRWl0aGVyIHdheSwgc2V0IGlmX2V4dGVudHMKKyAqIHRvIHBvaW50IGF0IHRoZSBleHRlbnRzLgorICovCitTVEFUSUMgaW50Cit4ZnNfaWZvcm1hdF9leHRlbnRzKAorCXhmc19pbm9kZV90CSppcCwKKwl4ZnNfZGlub2RlX3QJKmRpcCwKKwlpbnQJCXdoaWNoZm9yaykKK3sKKwl4ZnNfYm1idF9yZWNfdAkqZXAsICpkcDsKKwl4ZnNfaWZvcmtfdAkqaWZwOworCWludAkJbmV4OworCWludAkJcmVhbF9zaXplOworCWludAkJc2l6ZTsKKwlpbnQJCWk7CisKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCW5leCA9IFhGU19ERk9SS19ORVhURU5UUyhkaXAsIHdoaWNoZm9yayk7CisJc2l6ZSA9IG5leCAqICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisKKwkvKgorCSAqIElmIHRoZSBudW1iZXIgb2YgZXh0ZW50cyBpcyB1bnJlYXNvbmFibGUsIHRoZW4gc29tZXRoaW5nCisJICogaXMgd3JvbmcgYW5kIHdlIGp1c3QgYmFpbCBvdXQgcmF0aGVyIHRoYW4gY3Jhc2ggaW4KKwkgKiBrbWVtX2FsbG9jKCkgb3IgbWVtY3B5KCkgYmVsb3cuCisJICovCisJaWYgKHVubGlrZWx5KHNpemUgPCAwIHx8IHNpemUgPiBYRlNfREZPUktfU0laRShkaXAsIGlwLT5pX21vdW50LCB3aGljaGZvcmspKSkgeworCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKKwkJCSJjb3JydXB0IGlub2RlICVMdSAoKGEpZXh0ZW50cyA9ICVkKS4gIFVubW91bnQgYW5kIHJ1biB4ZnNfcmVwYWlyLiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKSBpcC0+aV9pbm8sIG5leCk7CisJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfaWZvcm1hdF9leHRlbnRzKDEpIiwgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkgICAgIGlwLT5pX21vdW50LCBkaXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCisJcmVhbF9zaXplID0gMDsKKwlpZiAobmV4ID09IDApCisJCWlmcC0+aWZfdTEuaWZfZXh0ZW50cyA9IE5VTEw7CisJZWxzZSBpZiAobmV4IDw9IFhGU19JTkxJTkVfRVhUUykKKwkJaWZwLT5pZl91MS5pZl9leHRlbnRzID0gaWZwLT5pZl91Mi5pZl9pbmxpbmVfZXh0OworCWVsc2UgeworCQlpZnAtPmlmX3UxLmlmX2V4dGVudHMgPSBrbWVtX2FsbG9jKHNpemUsIEtNX1NMRUVQKTsKKwkJQVNTRVJUKGlmcC0+aWZfdTEuaWZfZXh0ZW50cyAhPSBOVUxMKTsKKwkJcmVhbF9zaXplID0gc2l6ZTsKKwl9CisJaWZwLT5pZl9ieXRlcyA9IHNpemU7CisJaWZwLT5pZl9yZWFsX2J5dGVzID0gcmVhbF9zaXplOworCWlmIChzaXplKSB7CisJCWRwID0gKHhmc19ibWJ0X3JlY190ICopIFhGU19ERk9SS19QVFIoZGlwLCB3aGljaGZvcmspOworCQl4ZnNfdmFsaWRhdGVfZXh0ZW50cyhkcCwgbmV4LCAxLCBYRlNfRVhURk1UX0lOT0RFKGlwKSk7CisJCWVwID0gaWZwLT5pZl91MS5pZl9leHRlbnRzOworCQlmb3IgKGkgPSAwOyBpIDwgbmV4OyBpKyssIGVwKyssIGRwKyspIHsKKwkJCWVwLT5sMCA9IElOVF9HRVQoZ2V0X3VuYWxpZ25lZCgoX191aW50NjRfdCopJmRwLT5sMCksCisJCQkJCQkJCUFSQ0hfQ09OVkVSVCk7CisJCQllcC0+bDEgPSBJTlRfR0VUKGdldF91bmFsaWduZWQoKF9fdWludDY0X3QqKSZkcC0+bDEpLAorCQkJCQkJCQlBUkNIX0NPTlZFUlQpOworCQl9CisJCXhmc19ibWFwX3RyYWNlX2V4bGlzdCgieGZzX2lmb3JtYXRfZXh0ZW50cyIsIGlwLCBuZXgsCisJCQl3aGljaGZvcmspOworCQlpZiAod2hpY2hmb3JrICE9IFhGU19EQVRBX0ZPUksgfHwKKwkJCVhGU19FWFRGTVRfSU5PREUoaXApID09IFhGU19FWFRGTVRfTk9TVEFURSkKKwkJCQlpZiAodW5saWtlbHkoeGZzX2NoZWNrX25vc3RhdGVfZXh0ZW50cygKKwkJCQkgICAgaWZwLT5pZl91MS5pZl9leHRlbnRzLCBuZXgpKSkgeworCQkJCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfaWZvcm1hdF9leHRlbnRzKDIpIiwKKwkJCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkJCQkgaXAtPmlfbW91bnQpOworCQkJCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCQkJfQorCX0KKwlpZnAtPmlmX2ZsYWdzIHw9IFhGU19JRkVYVEVOVFM7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgZmlsZSBoYXMgdG9vIG1hbnkgZXh0ZW50cyB0byBmaXQgaW50bworICogdGhlIGlub2RlLCBzbyB0aGV5IGFyZSBpbiBCLXRyZWUgZm9ybWF0LgorICogQWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSByb290IG9mIHRoZSBCLXRyZWUKKyAqIGFuZCBjb3B5IHRoZSByb290IGludG8gaXQuICBUaGUgaV9leHRlbnRzCisgKiBmaWVsZCB3aWxsIHJlbWFpbiBOVUxMIHVudGlsIGFsbCBvZiB0aGUKKyAqIGV4dGVudHMgYXJlIHJlYWQgaW4gKHdoZW4gdGhleSBhcmUgbmVlZGVkKS4KKyAqLworU1RBVElDIGludAoreGZzX2lmb3JtYXRfYnRyZWUoCisJeGZzX2lub2RlX3QJCSppcCwKKwl4ZnNfZGlub2RlX3QJCSpkaXAsCisJaW50CQkJd2hpY2hmb3JrKQoreworCXhmc19ibWRyX2Jsb2NrX3QJKmRmcDsKKwl4ZnNfaWZvcmtfdAkJKmlmcDsKKwkvKiBSRUZFUkVOQ0VEICovCisJaW50CQkJbnJlY3M7CisJaW50CQkJc2l6ZTsKKworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJZGZwID0gKHhmc19ibWRyX2Jsb2NrX3QgKilYRlNfREZPUktfUFRSKGRpcCwgd2hpY2hmb3JrKTsKKwlzaXplID0gWEZTX0JNQVBfQlJPT1RfU1BBQ0UoZGZwKTsKKwlucmVjcyA9IFhGU19CTUFQX0JST09UX05VTVJFQ1MoZGZwKTsKKworCS8qCisJICogYmxvdyBvdXQgaWYgLS0gZm9yayBoYXMgbGVzcyBleHRlbnRzIHRoYW4gY2FuIGZpdCBpbgorCSAqIGZvcmsgKGZvcmsgc2hvdWxkbid0IGJlIGEgYnRyZWUgZm9ybWF0KSwgcm9vdCBidHJlZQorCSAqIGJsb2NrIGhhcyBtb3JlIHJlY29yZHMgdGhhbiBjYW4gZml0IGludG8gdGhlIGZvcmssCisJICogb3IgdGhlIG51bWJlciBvZiBleHRlbnRzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mCisJICogYmxvY2tzLgorCSAqLworCWlmICh1bmxpa2VseShYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgPD0gaWZwLT5pZl9leHRfbWF4CisJICAgIHx8IFhGU19CTURSX1NQQUNFX0NBTEMobnJlY3MpID4KKwkJCVhGU19ERk9SS19TSVpFKGRpcCwgaXAtPmlfbW91bnQsIHdoaWNoZm9yaykKKwkgICAgfHwgWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspID4gaXAtPmlfZC5kaV9uYmxvY2tzKSkgeworCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKKwkJCSJjb3JydXB0IGlub2RlICVMdSAoYnRyZWUpLiAgVW5tb3VudCBhbmQgcnVuIHhmc19yZXBhaXIuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGlwLT5pX2lubyk7CisJCVhGU19FUlJPUl9SRVBPUlQoInhmc19pZm9ybWF0X2J0cmVlIiwgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkgaXAtPmlfbW91bnQpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCisJaWZwLT5pZl9icm9vdF9ieXRlcyA9IHNpemU7CisJaWZwLT5pZl9icm9vdCA9IGttZW1fYWxsb2Moc2l6ZSwgS01fU0xFRVApOworCUFTU0VSVChpZnAtPmlmX2Jyb290ICE9IE5VTEwpOworCS8qCisJICogQ29weSBhbmQgY29udmVydCBmcm9tIHRoZSBvbi1kaXNrIHN0cnVjdHVyZQorCSAqIHRvIHRoZSBpbi1tZW1vcnkgc3RydWN0dXJlLgorCSAqLworCXhmc19ibWRyX3RvX2JtYnQoZGZwLCBYRlNfREZPUktfU0laRShkaXAsIGlwLT5pX21vdW50LCB3aGljaGZvcmspLAorCQlpZnAtPmlmX2Jyb290LCBzaXplKTsKKwlpZnAtPmlmX2ZsYWdzICY9IH5YRlNfSUZFWFRFTlRTOworCWlmcC0+aWZfZmxhZ3MgfD0gWEZTX0lGQlJPT1Q7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHhmc194bGF0ZV9kaW5vZGVfY29yZSAtIHRyYW5zbGF0ZSBhbiB4ZnNfaW5vZGVfY29yZV90IGJldHdlZW4gb25kaXNrCisgKiBhbmQgbmF0aXZlIGZvcm1hdAorICoKKyAqIGJ1ZiAgPSBvbi1kaXNrIHJlcHJlc2VudGF0aW9uCisgKiBkaXAgID0gbmF0aXZlIHJlcHJlc2VudGF0aW9uCisgKiBkaXIgID0gZGlyZWN0aW9uIC0gK3ZlIC0+IGRpc2sgdG8gbmF0aXZlCisgKiAgICAgICAgICAgICAgICAgICAgLXZlIC0+IG5hdGl2ZSB0byBkaXNrCisgKi8KK3ZvaWQKK3hmc194bGF0ZV9kaW5vZGVfY29yZSgKKwl4ZnNfY2FkZHJfdAkJYnVmLAorCXhmc19kaW5vZGVfY29yZV90CSpkaXAsCisJaW50CQkJZGlyKQoreworCXhmc19kaW5vZGVfY29yZV90CSpidWZfY29yZSA9ICh4ZnNfZGlub2RlX2NvcmVfdCAqKWJ1ZjsKKwl4ZnNfZGlub2RlX2NvcmVfdAkqbWVtX2NvcmUgPSAoeGZzX2Rpbm9kZV9jb3JlX3QgKilkaXA7CisJeGZzX2FyY2hfdAkJYXJjaCA9IEFSQ0hfQ09OVkVSVDsKKworCUFTU0VSVChkaXIpOworCisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9tYWdpYywgbWVtX2NvcmUtPmRpX21hZ2ljLCBkaXIsIGFyY2gpOworCUlOVF9YTEFURShidWZfY29yZS0+ZGlfbW9kZSwgbWVtX2NvcmUtPmRpX21vZGUsIGRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV92ZXJzaW9uLAltZW1fY29yZS0+ZGlfdmVyc2lvbiwgZGlyLCBhcmNoKTsKKwlJTlRfWExBVEUoYnVmX2NvcmUtPmRpX2Zvcm1hdCwgbWVtX2NvcmUtPmRpX2Zvcm1hdCwgZGlyLCBhcmNoKTsKKwlJTlRfWExBVEUoYnVmX2NvcmUtPmRpX29ubGluaywgbWVtX2NvcmUtPmRpX29ubGluaywgZGlyLCBhcmNoKTsKKwlJTlRfWExBVEUoYnVmX2NvcmUtPmRpX3VpZCwgbWVtX2NvcmUtPmRpX3VpZCwgZGlyLCBhcmNoKTsKKwlJTlRfWExBVEUoYnVmX2NvcmUtPmRpX2dpZCwgbWVtX2NvcmUtPmRpX2dpZCwgZGlyLCBhcmNoKTsKKwlJTlRfWExBVEUoYnVmX2NvcmUtPmRpX25saW5rLCBtZW1fY29yZS0+ZGlfbmxpbmssIGRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9wcm9qaWQsIG1lbV9jb3JlLT5kaV9wcm9qaWQsIGRpciwgYXJjaCk7CisKKwlpZiAoZGlyID4gMCkgeworCQltZW1jcHkobWVtX2NvcmUtPmRpX3BhZCwgYnVmX2NvcmUtPmRpX3BhZCwKKwkJCXNpemVvZihidWZfY29yZS0+ZGlfcGFkKSk7CisJfSBlbHNlIHsKKwkJbWVtY3B5KGJ1Zl9jb3JlLT5kaV9wYWQsIG1lbV9jb3JlLT5kaV9wYWQsCisJCQlzaXplb2YoYnVmX2NvcmUtPmRpX3BhZCkpOworCX0KKworCUlOVF9YTEFURShidWZfY29yZS0+ZGlfZmx1c2hpdGVyLCBtZW1fY29yZS0+ZGlfZmx1c2hpdGVyLCBkaXIsIGFyY2gpOworCisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9hdGltZS50X3NlYywgbWVtX2NvcmUtPmRpX2F0aW1lLnRfc2VjLAorCQkJZGlyLCBhcmNoKTsKKwlJTlRfWExBVEUoYnVmX2NvcmUtPmRpX2F0aW1lLnRfbnNlYywgbWVtX2NvcmUtPmRpX2F0aW1lLnRfbnNlYywKKwkJCWRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9tdGltZS50X3NlYywgbWVtX2NvcmUtPmRpX210aW1lLnRfc2VjLAorCQkJZGlyLCBhcmNoKTsKKwlJTlRfWExBVEUoYnVmX2NvcmUtPmRpX210aW1lLnRfbnNlYywgbWVtX2NvcmUtPmRpX210aW1lLnRfbnNlYywKKwkJCWRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9jdGltZS50X3NlYywgbWVtX2NvcmUtPmRpX2N0aW1lLnRfc2VjLAorCQkJZGlyLCBhcmNoKTsKKwlJTlRfWExBVEUoYnVmX2NvcmUtPmRpX2N0aW1lLnRfbnNlYywgbWVtX2NvcmUtPmRpX2N0aW1lLnRfbnNlYywKKwkJCWRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9zaXplLCBtZW1fY29yZS0+ZGlfc2l6ZSwgZGlyLCBhcmNoKTsKKwlJTlRfWExBVEUoYnVmX2NvcmUtPmRpX25ibG9ja3MsIG1lbV9jb3JlLT5kaV9uYmxvY2tzLCBkaXIsIGFyY2gpOworCUlOVF9YTEFURShidWZfY29yZS0+ZGlfZXh0c2l6ZSwgbWVtX2NvcmUtPmRpX2V4dHNpemUsIGRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9uZXh0ZW50cywgbWVtX2NvcmUtPmRpX25leHRlbnRzLCBkaXIsIGFyY2gpOworCUlOVF9YTEFURShidWZfY29yZS0+ZGlfYW5leHRlbnRzLCBtZW1fY29yZS0+ZGlfYW5leHRlbnRzLCBkaXIsIGFyY2gpOworCUlOVF9YTEFURShidWZfY29yZS0+ZGlfZm9ya29mZiwgbWVtX2NvcmUtPmRpX2ZvcmtvZmYsIGRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9hZm9ybWF0LCBtZW1fY29yZS0+ZGlfYWZvcm1hdCwgZGlyLCBhcmNoKTsKKwlJTlRfWExBVEUoYnVmX2NvcmUtPmRpX2RtZXZtYXNrLCBtZW1fY29yZS0+ZGlfZG1ldm1hc2ssIGRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9kbXN0YXRlLCBtZW1fY29yZS0+ZGlfZG1zdGF0ZSwgZGlyLCBhcmNoKTsKKwlJTlRfWExBVEUoYnVmX2NvcmUtPmRpX2ZsYWdzLCBtZW1fY29yZS0+ZGlfZmxhZ3MsIGRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9nZW4sIG1lbV9jb3JlLT5kaV9nZW4sIGRpciwgYXJjaCk7Cit9CisKK1NUQVRJQyB1aW50CitfeGZzX2RpYzJ4ZmxhZ3MoCisJeGZzX2Rpbm9kZV9jb3JlX3QJKmRpYywKKwlfX3VpbnQxNl90CQlkaV9mbGFncykKK3sKKwl1aW50CQkJZmxhZ3MgPSAwOworCisJaWYgKGRpX2ZsYWdzICYgWEZTX0RJRkxBR19BTlkpIHsKKwkJaWYgKGRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkKKwkJCWZsYWdzIHw9IFhGU19YRkxBR19SRUFMVElNRTsKKwkJaWYgKGRpX2ZsYWdzICYgWEZTX0RJRkxBR19QUkVBTExPQykKKwkJCWZsYWdzIHw9IFhGU19YRkxBR19QUkVBTExPQzsKKwkJaWYgKGRpX2ZsYWdzICYgWEZTX0RJRkxBR19JTU1VVEFCTEUpCisJCQlmbGFncyB8PSBYRlNfWEZMQUdfSU1NVVRBQkxFOworCQlpZiAoZGlfZmxhZ3MgJiBYRlNfRElGTEFHX0FQUEVORCkKKwkJCWZsYWdzIHw9IFhGU19YRkxBR19BUFBFTkQ7CisJCWlmIChkaV9mbGFncyAmIFhGU19ESUZMQUdfU1lOQykKKwkJCWZsYWdzIHw9IFhGU19YRkxBR19TWU5DOworCQlpZiAoZGlfZmxhZ3MgJiBYRlNfRElGTEFHX05PQVRJTUUpCisJCQlmbGFncyB8PSBYRlNfWEZMQUdfTk9BVElNRTsKKwkJaWYgKGRpX2ZsYWdzICYgWEZTX0RJRkxBR19OT0RVTVApCisJCQlmbGFncyB8PSBYRlNfWEZMQUdfTk9EVU1QOworCQlpZiAoZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JUSU5IRVJJVCkKKwkJCWZsYWdzIHw9IFhGU19YRkxBR19SVElOSEVSSVQ7CisJCWlmIChkaV9mbGFncyAmIFhGU19ESUZMQUdfUFJPSklOSEVSSVQpCisJCQlmbGFncyB8PSBYRlNfWEZMQUdfUFJPSklOSEVSSVQ7CisJCWlmIChkaV9mbGFncyAmIFhGU19ESUZMQUdfTk9TWU1MSU5LUykKKwkJCWZsYWdzIHw9IFhGU19YRkxBR19OT1NZTUxJTktTOworCX0KKworCXJldHVybiBmbGFnczsKK30KKwordWludAoreGZzX2lwMnhmbGFncygKKwl4ZnNfaW5vZGVfdAkJKmlwKQoreworCXhmc19kaW5vZGVfY29yZV90CSpkaWMgPSAmaXAtPmlfZDsKKworCXJldHVybiBfeGZzX2RpYzJ4ZmxhZ3MoZGljLCBkaWMtPmRpX2ZsYWdzKSB8CisJCShYRlNfQ0ZPUktfUShkaWMpID8gWEZTX1hGTEFHX0hBU0FUVFIgOiAwKTsKK30KKwordWludAoreGZzX2RpYzJ4ZmxhZ3MoCisJeGZzX2Rpbm9kZV9jb3JlX3QJKmRpYykKK3sKKwlyZXR1cm4gX3hmc19kaWMyeGZsYWdzKGRpYywgSU5UX0dFVChkaWMtPmRpX2ZsYWdzLCBBUkNIX0NPTlZFUlQpKSB8CisJCShYRlNfQ0ZPUktfUV9ESVNLKGRpYykgPyBYRlNfWEZMQUdfSEFTQVRUUiA6IDApOworfQorCisvKgorICogR2l2ZW4gYSBtb3VudCBzdHJ1Y3R1cmUgYW5kIGFuIGlub2RlIG51bWJlciwgcmV0dXJuIGEgcG9pbnRlcgorICogdG8gYSBuZXdseSBhbGxvY2F0ZWQgaW4tY29yZSBpbm9kZSBjb3Jlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCisgKiBpbm9kZSBudW1iZXIuCisgKgorICogSW5pdGlhbGl6ZSB0aGUgaW5vZGUncyBhdHRyaWJ1dGVzIGFuZCBleHRlbnQgcG9pbnRlcnMgaWYgaXQKKyAqIGFscmVhZHkgaGFzIHRoZW0gKGl0IHdpbGwgbm90IGlmIHRoZSBpbm9kZSBoYXMgbm8gbGlua3MpLgorICovCitpbnQKK3hmc19pcmVhZCgKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19pbm9fdAlpbm8sCisJeGZzX2lub2RlX3QJKippcHAsCisJeGZzX2RhZGRyX3QJYm5vKQoreworCXhmc19idWZfdAkqYnA7CisJeGZzX2Rpbm9kZV90CSpkaXA7CisJeGZzX2lub2RlX3QJKmlwOworCWludAkJZXJyb3I7CisKKwlBU1NFUlQoeGZzX2lub2RlX3pvbmUgIT0gTlVMTCk7CisKKwlpcCA9IGttZW1fem9uZV96YWxsb2MoeGZzX2lub2RlX3pvbmUsIEtNX1NMRUVQKTsKKwlpcC0+aV9pbm8gPSBpbm87CisJaXAtPmlfbW91bnQgPSBtcDsKKworCS8qCisJICogR2V0IHBvaW50ZXIncyB0byB0aGUgb24tZGlzayBpbm9kZSBhbmQgdGhlIGJ1ZmZlciBjb250YWluaW5nIGl0LgorCSAqIElmIHRoZSBpbm9kZSBudW1iZXIgcmVmZXJzIHRvIGEgYmxvY2sgb3V0c2lkZSB0aGUgZmlsZSBzeXN0ZW0KKwkgKiB0aGVuIHhmc19pdG9icCgpIHdpbGwgcmV0dXJuIE5VTEwuICBJbiB0aGlzIGNhc2Ugd2Ugc2hvdWxkCisJICogcmV0dXJuIE5VTEwgYXMgd2VsbC4gIFNldCBpX2Jsa25vIHRvIDAgc28gdGhhdCB4ZnNfaXRvYnAoKSB3aWxsCisJICoga25vdyB0aGF0IHRoaXMgaXMgYSBuZXcgaW5jb3JlIGlub2RlLgorCSAqLworCWVycm9yID0geGZzX2l0b2JwKG1wLCB0cCwgaXAsICZkaXAsICZicCwgYm5vKTsKKworCWlmIChlcnJvciAhPSAwKSB7CisJCWttZW1fem9uZV9mcmVlKHhmc19pbm9kZV96b25lLCBpcCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemUgaW5vZGUncyB0cmFjZSBidWZmZXJzLgorCSAqIERvIHRoaXMgYmVmb3JlIHhmc19pZm9ybWF0IGluIGNhc2UgaXQgYWRkcyBlbnRyaWVzLgorCSAqLworI2lmZGVmIFhGU19CTUFQX1RSQUNFCisJaXAtPmlfeHRyYWNlID0ga3RyYWNlX2FsbG9jKFhGU19CTUFQX0tUUkFDRV9TSVpFLCBLTV9TTEVFUCk7CisjZW5kaWYKKyNpZmRlZiBYRlNfQk1CVF9UUkFDRQorCWlwLT5pX2J0cmFjZSA9IGt0cmFjZV9hbGxvYyhYRlNfQk1CVF9LVFJBQ0VfU0laRSwgS01fU0xFRVApOworI2VuZGlmCisjaWZkZWYgWEZTX1JXX1RSQUNFCisJaXAtPmlfcnd0cmFjZSA9IGt0cmFjZV9hbGxvYyhYRlNfUldfS1RSQUNFX1NJWkUsIEtNX1NMRUVQKTsKKyNlbmRpZgorI2lmZGVmIFhGU19JTE9DS19UUkFDRQorCWlwLT5pX2xvY2tfdHJhY2UgPSBrdHJhY2VfYWxsb2MoWEZTX0lMT0NLX0tUUkFDRV9TSVpFLCBLTV9TTEVFUCk7CisjZW5kaWYKKyNpZmRlZiBYRlNfRElSMl9UUkFDRQorCWlwLT5pX2Rpcl90cmFjZSA9IGt0cmFjZV9hbGxvYyhYRlNfRElSMl9LVFJBQ0VfU0laRSwgS01fU0xFRVApOworI2VuZGlmCisKKwkvKgorCSAqIElmIHdlIGdvdCBzb21ldGhpbmcgdGhhdCBpc24ndCBhbiBpbm9kZSBpdCBtZWFucyBzb21lb25lCisJICogKG5mcyBvciBkbWkpIGhhcyBhIHN0YWxlIGhhbmRsZS4KKwkgKi8KKwlpZiAoSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfbWFnaWMsIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RJTk9ERV9NQUdJQykgeworCQlrbWVtX3pvbmVfZnJlZSh4ZnNfaW5vZGVfem9uZSwgaXApOworCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisjaWZkZWYgREVCVUcKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLCAieGZzX2lyZWFkOiAiCisJCQkJImRpcC0+ZGlfY29yZS5kaV9tYWdpYyAoMHgleCkgIT0gIgorCQkJCSJYRlNfRElOT0RFX01BR0lDICgweCV4KSIsCisJCQkJSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfbWFnaWMsIEFSQ0hfQ09OVkVSVCksCisJCQkJWEZTX0RJTk9ERV9NQUdJQyk7CisjZW5kaWYgLyogREVCVUcgKi8KKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKworCS8qCisJICogSWYgdGhlIG9uLWRpc2sgaW5vZGUgaXMgYWxyZWFkeSBsaW5rZWQgdG8gYSBkaXJlY3RvcnkKKwkgKiBlbnRyeSwgY29weSBhbGwgb2YgdGhlIGlub2RlIGludG8gdGhlIGluLWNvcmUgaW5vZGUuCisJICogeGZzX2lmb3JtYXQoKSBoYW5kbGVzIGNvcHlpbmcgaW4gdGhlIGlub2RlIGZvcm1hdAorCSAqIHNwZWNpZmljIGluZm9ybWF0aW9uLgorCSAqIE90aGVyd2lzZSwganVzdCBnZXQgdGhlIHRydWx5IHBlcm1hbmVudCBpbmZvcm1hdGlvbi4KKwkgKi8KKwlpZiAoZGlwLT5kaV9jb3JlLmRpX21vZGUpIHsKKwkJeGZzX3hsYXRlX2Rpbm9kZV9jb3JlKCh4ZnNfY2FkZHJfdCkmZGlwLT5kaV9jb3JlLAorCQkgICAgICYoaXAtPmlfZCksIDEpOworCQllcnJvciA9IHhmc19pZm9ybWF0KGlwLCBkaXApOworCQlpZiAoZXJyb3IpICB7CisJCQlrbWVtX3pvbmVfZnJlZSh4ZnNfaW5vZGVfem9uZSwgaXApOworCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworI2lmZGVmIERFQlVHCisJCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsICJ4ZnNfaXJlYWQ6ICIKKwkJCQkJInhmc19pZm9ybWF0KCkgcmV0dXJuZWQgZXJyb3IgJWQiLAorCQkJCQllcnJvcik7CisjZW5kaWYgLyogREVCVUcgKi8KKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCX0gZWxzZSB7CisJCWlwLT5pX2QuZGlfbWFnaWMgPSBJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9tYWdpYywgQVJDSF9DT05WRVJUKTsKKwkJaXAtPmlfZC5kaV92ZXJzaW9uID0gSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfdmVyc2lvbiwgQVJDSF9DT05WRVJUKTsKKwkJaXAtPmlfZC5kaV9nZW4gPSBJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9nZW4sIEFSQ0hfQ09OVkVSVCk7CisJCWlwLT5pX2QuZGlfZmx1c2hpdGVyID0gSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfZmx1c2hpdGVyLCBBUkNIX0NPTlZFUlQpOworCQkvKgorCQkgKiBNYWtlIHN1cmUgdG8gcHVsbCBpbiB0aGUgbW9kZSBoZXJlIGFzIHdlbGwgaW4KKwkJICogY2FzZSB0aGUgaW5vZGUgaXMgcmVsZWFzZWQgd2l0aG91dCBiZWluZyB1c2VkLgorCQkgKiBUaGlzIGVuc3VyZXMgdGhhdCB4ZnNfaW5hY3RpdmUoKSB3aWxsIHNlZSB0aGF0CisJCSAqIHRoZSBpbm9kZSBpcyBhbHJlYWR5IGZyZWUgYW5kIG5vdCB0cnkgdG8gbWVzcworCQkgKiB3aXRoIHRoZSB1bmluaXRpYWxpemVkIHBhcnQgb2YgaXQuCisJCSAqLworCQlpcC0+aV9kLmRpX21vZGUgPSAwOworCQkvKgorCQkgKiBJbml0aWFsaXplIHRoZSBwZXItZm9yayBtaW5pbWEgYW5kIG1heGltYSBmb3IgYSBuZXcKKwkJICogaW5vZGUgaGVyZS4gIHhmc19pZm9ybWF0IHdpbGwgZG8gaXQgZm9yIG9sZCBpbm9kZXMuCisJCSAqLworCQlpcC0+aV9kZi5pZl9leHRfbWF4ID0KKwkJCVhGU19JRk9SS19EU0laRShpcCkgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCX0KKworCUlOSVRfTElTVF9IRUFEKCZpcC0+aV9yZWNsYWltKTsKKworCS8qCisJICogVGhlIGlub2RlIGZvcm1hdCBjaGFuZ2VkIHdoZW4gd2UgbW92ZWQgdGhlIGxpbmsgY291bnQgYW5kCisJICogbWFkZSBpdCAzMiBiaXRzIGxvbmcuICBJZiB0aGlzIGlzIGFuIG9sZCBmb3JtYXQgaW5vZGUsCisJICogY29udmVydCBpdCBpbiBtZW1vcnkgdG8gbG9vayBsaWtlIGEgbmV3IG9uZS4gIElmIGl0IGdldHMKKwkgKiBmbHVzaGVkIHRvIGRpc2sgd2Ugd2lsbCBjb252ZXJ0IGJhY2sgYmVmb3JlIGZsdXNoaW5nIG9yCisJICogbG9nZ2luZyBpdC4gIFdlIHplcm8gb3V0IHRoZSBuZXcgcHJvamlkIGZpZWxkIGFuZCB0aGUgb2xkIGxpbmsKKwkgKiBjb3VudCBmaWVsZC4gIFdlJ2xsIGhhbmRsZSBjbGVhcmluZyB0aGUgcGFkIGZpZWxkICh0aGUgcmVtYWlucworCSAqIG9mIHRoZSBvbGQgdXVpZCBmaWVsZCkgd2hlbiB3ZSBhY3R1YWxseSBjb252ZXJ0IHRoZSBpbm9kZSB0bworCSAqIHRoZSBuZXcgZm9ybWF0LiBXZSBkb24ndCBjaGFuZ2UgdGhlIHZlcnNpb24gbnVtYmVyIHNvIHRoYXQgd2UKKwkgKiBjYW4gZGlzdGluZ3Vpc2ggdGhpcyBmcm9tIGEgcmVhbCBuZXcgZm9ybWF0IGlub2RlLgorCSAqLworCWlmIChpcC0+aV9kLmRpX3ZlcnNpb24gPT0gWEZTX0RJTk9ERV9WRVJTSU9OXzEpIHsKKwkJaXAtPmlfZC5kaV9ubGluayA9IGlwLT5pX2QuZGlfb25saW5rOworCQlpcC0+aV9kLmRpX29ubGluayA9IDA7CisJCWlwLT5pX2QuZGlfcHJvamlkID0gMDsKKwl9CisKKwlpcC0+aV9kZWxheWVkX2Jsa3MgPSAwOworCisJLyoKKwkgKiBNYXJrIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgaW5vZGUgYXMgc29tZXRoaW5nIHRvIGtlZXAKKwkgKiBhcm91bmQgZm9yIGEgd2hpbGUuICBUaGlzIGhlbHBzIHRvIGtlZXAgcmVjZW50bHkgYWNjZXNzZWQKKwkgKiBtZXRhLWRhdGEgaW4tY29yZSBsb25nZXIuCisJICovCisJIFhGU19CVUZfU0VUX1JFRihicCwgWEZTX0lOT19SRUYpOworCisJLyoKKwkgKiBVc2UgeGZzX3RyYW5zX2JyZWxzZSgpIHRvIHJlbGVhc2UgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZQorCSAqIG9uLWRpc2sgaW5vZGUsIGJlY2F1c2UgaXQgd2FzIGFjcXVpcmVkIHdpdGggeGZzX3RyYW5zX3JlYWRfYnVmKCkKKwkgKiBpbiB4ZnNfaXRvYnAoKSBhYm92ZS4gIElmIHRwIGlzIE5VTEwsIHRoaXMgaXMganVzdCBhIG5vcm1hbAorCSAqIGJyZWxzZSgpLiAgSWYgd2UncmUgd2l0aGluIGEgdHJhbnNhY3Rpb24sIHRoZW4geGZzX3RyYW5zX2JyZWxzZSgpCisJICogd2lsbCBvbmx5IHJlbGVhc2UgdGhlIGJ1ZmZlciBpZiBpdCBpcyBub3QgZGlydHkgd2l0aGluIHRoZQorCSAqIHRyYW5zYWN0aW9uLiAgSXQgd2lsbCBiZSBPSyB0byByZWxlYXNlIHRoZSBidWZmZXIgaW4gdGhpcyBjYXNlLAorCSAqIGJlY2F1c2UgaW5vZGVzIG9uIGRpc2sgYXJlIG5ldmVyIGRlc3Ryb3llZCBhbmQgd2Ugd2lsbCBiZQorCSAqIGxvY2tpbmcgdGhlIG5ldyBpbi1jb3JlIGlub2RlIGJlZm9yZSBwdXR0aW5nIGl0IGluIHRoZSBoYXNoCisJICogdGFibGUgd2hlcmUgb3RoZXIgcHJvY2Vzc2VzIGNhbiBmaW5kIGl0LiAgVGh1cyB3ZSBkb24ndCBoYXZlCisJICogdG8gd29ycnkgYWJvdXQgdGhlIGlub2RlIGJlaW5nIGNoYW5nZWQganVzdCBiZWNhdXNlIHdlIHJlbGVhc2VkCisJICogdGhlIGJ1ZmZlci4KKwkgKi8KKwl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisJKmlwcCA9IGlwOworCXJldHVybiAwOworfQorCisvKgorICogUmVhZCBpbiBleHRlbnRzIGZyb20gYSBidHJlZS1mb3JtYXQgaW5vZGUuCisgKiBBbGxvY2F0ZSBhbmQgZmlsbCBpbiBpZl9leHRlbnRzLiAgUmVhbCB3b3JrIGlzIGRvbmUgaW4geGZzX2JtYXAuYy4KKyAqLworaW50Cit4ZnNfaXJlYWRfZXh0ZW50cygKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX2lub2RlX3QJKmlwLAorCWludAkJd2hpY2hmb3JrKQoreworCWludAkJZXJyb3I7CisJeGZzX2lmb3JrX3QJKmlmcDsKKwlzaXplX3QJCXNpemU7CisKKwlpZiAodW5saWtlbHkoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSkpIHsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2lyZWFkX2V4dGVudHMiLCBYRlNfRVJSTEVWRUxfTE9XLAorCQkJCSBpcC0+aV9tb3VudCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisJc2l6ZSA9IFhGU19JRk9SS19ORVhURU5UUyhpcCwgd2hpY2hmb3JrKSAqICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwkvKgorCSAqIFdlIGtub3cgdGhhdCB0aGUgc2l6ZSBpcyB2YWxpZCAoaXQncyBjaGVja2VkIGluIGlmb3JtYXRfYnRyZWUpCisJICovCisJaWZwLT5pZl91MS5pZl9leHRlbnRzID0ga21lbV9hbGxvYyhzaXplLCBLTV9TTEVFUCk7CisJQVNTRVJUKGlmcC0+aWZfdTEuaWZfZXh0ZW50cyAhPSBOVUxMKTsKKwlpZnAtPmlmX2xhc3RleCA9IE5VTExFWFROVU07CisJaWZwLT5pZl9ieXRlcyA9IGlmcC0+aWZfcmVhbF9ieXRlcyA9IChpbnQpc2l6ZTsKKwlpZnAtPmlmX2ZsYWdzIHw9IFhGU19JRkVYVEVOVFM7CisJZXJyb3IgPSB4ZnNfYm1hcF9yZWFkX2V4dGVudHModHAsIGlwLCB3aGljaGZvcmspOworCWlmIChlcnJvcikgeworCQlrbWVtX2ZyZWUoaWZwLT5pZl91MS5pZl9leHRlbnRzLCBzaXplKTsKKwkJaWZwLT5pZl91MS5pZl9leHRlbnRzID0gTlVMTDsKKwkJaWZwLT5pZl9ieXRlcyA9IGlmcC0+aWZfcmVhbF9ieXRlcyA9IDA7CisJCWlmcC0+aWZfZmxhZ3MgJj0gflhGU19JRkVYVEVOVFM7CisJCXJldHVybiBlcnJvcjsKKwl9CisJeGZzX3ZhbGlkYXRlX2V4dGVudHMoKHhmc19ibWJ0X3JlY190ICopaWZwLT5pZl91MS5pZl9leHRlbnRzLAorCQlYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yayksIDAsIFhGU19FWFRGTVRfSU5PREUoaXApKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFsbG9jYXRlIGFuIGlub2RlIG9uIGRpc2sgYW5kIHJldHVybiBhIGNvcHkgb2YgaXRzIGluLWNvcmUgdmVyc2lvbi4KKyAqIFRoZSBpbi1jb3JlIGlub2RlIGlzIGxvY2tlZCBleGNsdXNpdmVseS4gIFNldCBtb2RlLCBubGluaywgYW5kIHJkZXYKKyAqIGFwcHJvcHJpYXRlbHkgd2l0aGluIHRoZSBpbm9kZS4gIFRoZSB1aWQgYW5kIGdpZCBmb3IgdGhlIGlub2RlIGFyZQorICogc2V0IGFjY29yZGluZyB0byB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGNyZWQgc3RydWN0dXJlLgorICoKKyAqIFVzZSB4ZnNfZGlhbGxvYygpIHRvIGFsbG9jYXRlIHRoZSBvbi1kaXNrIGlub2RlLiBJZiB4ZnNfZGlhbGxvYygpCisgKiBoYXMgYSBmcmVlIGlub2RlIGF2YWlsYWJsZSwgY2FsbCB4ZnNfaWdldCgpCisgKiB0byBvYnRhaW4gdGhlIGluLWNvcmUgdmVyc2lvbiBvZiB0aGUgYWxsb2NhdGVkIGlub2RlLiAgRmluYWxseSwKKyAqIGZpbGwgaW4gdGhlIGlub2RlIGFuZCBsb2cgaXRzIGluaXRpYWwgY29udGVudHMuICBJbiB0aGlzIGNhc2UsCisgKiBpYWxsb2NfY29udGV4dCB3b3VsZCBiZSBzZXQgdG8gTlVMTCBhbmQgY2FsbF9hZ2FpbiBzZXQgdG8gZmFsc2UuCisgKgorICogSWYgeGZzX2RpYWxsb2MoKSBkb2VzIG5vdCBoYXZlIGFuIGF2YWlsYWJsZSBpbm9kZSwKKyAqIGl0IHdpbGwgcmVwbGVuaXNoIGl0cyBzdXBwbHkgYnkgZG9pbmcgYW4gYWxsb2NhdGlvbi4gU2luY2Ugd2UgY2FuCisgKiBvbmx5IGRvIG9uZSBhbGxvY2F0aW9uIHdpdGhpbiBhIHRyYW5zYWN0aW9uIHdpdGhvdXQgZGVhZGxvY2tzLCB3ZQorICogbXVzdCBjb21taXQgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gYmVmb3JlIHJldHVybmluZyB0aGUgaW5vZGUgaXRzZWxmLgorICogSW4gdGhpcyBjYXNlLCB0aGVyZWZvcmUsIHdlIHdpbGwgc2V0IGNhbGxfYWdhaW4gdG8gdHJ1ZSBhbmQgcmV0dXJuLgorICogVGhlIGNhbGxlciBzaG91bGQgdGhlbiBjb21taXQgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24sIHN0YXJ0IGEgbmV3CisgKiB0cmFuc2FjdGlvbiwgYW5kIGNhbGwgeGZzX2lhbGxvYygpIGFnYWluIHRvIGFjdHVhbGx5IGdldCB0aGUgaW5vZGUuCisgKgorICogVG8gZW5zdXJlIHRoYXQgc29tZSBvdGhlciBwcm9jZXNzIGRvZXMgbm90IGdyYWIgdGhlIGlub2RlIHRoYXQKKyAqIHdhcyBhbGxvY2F0ZWQgZHVyaW5nIHRoZSBmaXJzdCBjYWxsIHRvIHhmc19pYWxsb2MoKSwgdGhpcyByb3V0aW5lCisgKiBhbHNvIHJldHVybnMgdGhlIFtsb2NrZWRdIGJwIHBvaW50aW5nIHRvIHRoZSBoZWFkIG9mIHRoZSBmcmVlbGlzdAorICogYXMgaWFsbG9jX2NvbnRleHQuICBUaGUgY2FsbGVyIHNob3VsZCBob2xkIHRoaXMgYnVmZmVyIGFjcm9zcworICogdGhlIGNvbW1pdCBhbmQgcGFzcyBpdCBiYWNrIGludG8gdGhpcyByb3V0aW5lIG9uIHRoZSBzZWNvbmQgY2FsbC4KKyAqLworaW50Cit4ZnNfaWFsbG9jKAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfaW5vZGVfdAkqcGlwLAorCW1vZGVfdAkJbW9kZSwKKwlubGlua190CQlubGluaywKKwl4ZnNfZGV2X3QJcmRldiwKKwljcmVkX3QJCSpjciwKKwl4ZnNfcHJpZF90CXByaWQsCisJaW50CQlva2FsbG9jLAorCXhmc19idWZfdAkqKmlhbGxvY19jb250ZXh0LAorCWJvb2xlYW5fdAkqY2FsbF9hZ2FpbiwKKwl4ZnNfaW5vZGVfdAkqKmlwcCkKK3sKKwl4ZnNfaW5vX3QJaW5vOworCXhmc19pbm9kZV90CSppcDsKKwl2bm9kZV90CQkqdnA7CisJdWludAkJZmxhZ3M7CisJaW50CQllcnJvcjsKKworCS8qCisJICogQ2FsbCB0aGUgc3BhY2UgbWFuYWdlbWVudCBjb2RlIHRvIHBpY2sKKwkgKiB0aGUgb24tZGlzayBpbm9kZSB0byBiZSBhbGxvY2F0ZWQuCisJICovCisJZXJyb3IgPSB4ZnNfZGlhbGxvYyh0cCwgcGlwLT5pX2lubywgbW9kZSwgb2thbGxvYywKKwkJCSAgICBpYWxsb2NfY29udGV4dCwgY2FsbF9hZ2FpbiwgJmlubyk7CisJaWYgKGVycm9yICE9IDApIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlpZiAoKmNhbGxfYWdhaW4gfHwgaW5vID09IE5VTExGU0lOTykgeworCQkqaXBwID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCUFTU0VSVCgqaWFsbG9jX2NvbnRleHQgPT0gTlVMTCk7CisKKwkvKgorCSAqIEdldCB0aGUgaW4tY29yZSBpbm9kZSB3aXRoIHRoZSBsb2NrIGhlbGQgZXhjbHVzaXZlbHkuCisJICogVGhpcyBpcyBiZWNhdXNlIHdlJ3JlIHNldHRpbmcgZmllbGRzIGhlcmUgd2UgbmVlZAorCSAqIHRvIHByZXZlbnQgb3RoZXJzIGZyb20gbG9va2luZyBhdCB1bnRpbCB3ZSdyZSBkb25lLgorCSAqLworCWVycm9yID0geGZzX3RyYW5zX2lnZXQodHAtPnRfbW91bnRwLCB0cCwgaW5vLAorCQkJSUdFVF9DUkVBVEUsIFhGU19JTE9DS19FWENMLCAmaXApOworCWlmIChlcnJvciAhPSAwKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJQVNTRVJUKGlwICE9IE5VTEwpOworCisJdnAgPSBYRlNfSVRPVihpcCk7CisJdnAtPnZfdHlwZSA9IElGVE9WVChtb2RlKTsKKwlpcC0+aV9kLmRpX21vZGUgPSAoX191aW50MTZfdCltb2RlOworCWlwLT5pX2QuZGlfb25saW5rID0gMDsKKwlpcC0+aV9kLmRpX25saW5rID0gbmxpbms7CisJQVNTRVJUKGlwLT5pX2QuZGlfbmxpbmsgPT0gbmxpbmspOworCWlwLT5pX2QuZGlfdWlkID0gY3VycmVudF9mc3VpZChjcik7CisJaXAtPmlfZC5kaV9naWQgPSBjdXJyZW50X2ZzZ2lkKGNyKTsKKwlpcC0+aV9kLmRpX3Byb2ppZCA9IHByaWQ7CisJbWVtc2V0KCYoaXAtPmlfZC5kaV9wYWRbMF0pLCAwLCBzaXplb2YoaXAtPmlfZC5kaV9wYWQpKTsKKworCS8qCisJICogSWYgdGhlIHN1cGVyYmxvY2sgdmVyc2lvbiBpcyB1cCB0byB3aGVyZSB3ZSBzdXBwb3J0IG5ldyBmb3JtYXQKKwkgKiBpbm9kZXMgYW5kIHRoaXMgaXMgY3VycmVudGx5IGFuIG9sZCBmb3JtYXQgaW5vZGUsIHRoZW4gY2hhbmdlCisJICogdGhlIGlub2RlIHZlcnNpb24gbnVtYmVyIG5vdy4gIFRoaXMgd2F5IHdlIG9ubHkgZG8gdGhlIGNvbnZlcnNpb24KKwkgKiBoZXJlIHJhdGhlciB0aGFuIGhlcmUgYW5kIGluIHRoZSBmbHVzaC9sb2dnaW5nIGNvZGUuCisJICovCisJaWYgKFhGU19TQl9WRVJTSU9OX0hBU05MSU5LKCZ0cC0+dF9tb3VudHAtPm1fc2IpICYmCisJICAgIGlwLT5pX2QuZGlfdmVyc2lvbiA9PSBYRlNfRElOT0RFX1ZFUlNJT05fMSkgeworCQlpcC0+aV9kLmRpX3ZlcnNpb24gPSBYRlNfRElOT0RFX1ZFUlNJT05fMjsKKwkJLyoKKwkJICogV2UndmUgYWxyZWFkeSB6ZXJvZWQgdGhlIG9sZCBsaW5rIGNvdW50LCB0aGUgcHJvamlkIGZpZWxkLAorCQkgKiBhbmQgdGhlIHBhZCBmaWVsZC4KKwkJICovCisJfQorCisJLyoKKwkgKiBQcm9qZWN0IGlkcyB3b24ndCBiZSBzdG9yZWQgb24gZGlzayBpZiB3ZSBhcmUgdXNpbmcgYSB2ZXJzaW9uIDEgaW5vZGUuCisJICovCisJaWYgKCAocHJpZCAhPSAwKSAmJiAoaXAtPmlfZC5kaV92ZXJzaW9uID09IFhGU19ESU5PREVfVkVSU0lPTl8xKSkKKwkJeGZzX2J1bXBfaW5vX3ZlcnMyKHRwLCBpcCk7CisKKwlpZiAoWEZTX0lOSEVSSVRfR0lEKHBpcCwgdnAtPnZfdmZzcCkpIHsKKwkJaXAtPmlfZC5kaV9naWQgPSBwaXAtPmlfZC5kaV9naWQ7CisJCWlmICgocGlwLT5pX2QuZGlfbW9kZSAmIFNfSVNHSUQpICYmIChtb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKSB7CisJCQlpcC0+aV9kLmRpX21vZGUgfD0gU19JU0dJRDsKKwkJfQorCX0KKworCS8qCisJICogSWYgdGhlIGdyb3VwIElEIG9mIHRoZSBuZXcgZmlsZSBkb2VzIG5vdCBtYXRjaCB0aGUgZWZmZWN0aXZlIGdyb3VwCisJICogSUQgb3Igb25lIG9mIHRoZSBzdXBwbGVtZW50YXJ5IGdyb3VwIElEcywgdGhlIFNfSVNHSUQgYml0IGlzIGNsZWFyZWQKKwkgKiAoYW5kIG9ubHkgaWYgdGhlIGlyaXhfc2dpZF9pbmhlcml0IGNvbXBhdGliaWxpdHkgdmFyaWFibGUgaXMgc2V0KS4KKwkgKi8KKwlpZiAoKGlyaXhfc2dpZF9pbmhlcml0KSAmJgorCSAgICAoaXAtPmlfZC5kaV9tb2RlICYgU19JU0dJRCkgJiYKKwkgICAgKCFpbl9ncm91cF9wKChnaWRfdClpcC0+aV9kLmRpX2dpZCkpKSB7CisJCWlwLT5pX2QuZGlfbW9kZSAmPSB+U19JU0dJRDsKKwl9CisKKwlpcC0+aV9kLmRpX3NpemUgPSAwOworCWlwLT5pX2QuZGlfbmV4dGVudHMgPSAwOworCUFTU0VSVChpcC0+aV9kLmRpX25ibG9ja3MgPT0gMCk7CisJeGZzX2ljaGd0aW1lKGlwLCBYRlNfSUNIR1RJTUVfQ0hHfFhGU19JQ0hHVElNRV9BQ0N8WEZTX0lDSEdUSU1FX01PRCk7CisJLyoKKwkgKiBkaV9nZW4gd2lsbCBoYXZlIGJlZW4gdGFrZW4gY2FyZSBvZiBpbiB4ZnNfaXJlYWQuCisJICovCisJaXAtPmlfZC5kaV9leHRzaXplID0gMDsKKwlpcC0+aV9kLmRpX2RtZXZtYXNrID0gMDsKKwlpcC0+aV9kLmRpX2Rtc3RhdGUgPSAwOworCWlwLT5pX2QuZGlfZmxhZ3MgPSAwOworCWZsYWdzID0gWEZTX0lMT0dfQ09SRTsKKwlzd2l0Y2ggKG1vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZJRk86CisJY2FzZSBTX0lGQ0hSOgorCWNhc2UgU19JRkJMSzoKKwljYXNlIFNfSUZTT0NLOgorCQlpcC0+aV9kLmRpX2Zvcm1hdCA9IFhGU19ESU5PREVfRk1UX0RFVjsKKwkJaXAtPmlfZGYuaWZfdTIuaWZfcmRldiA9IHJkZXY7CisJCWlwLT5pX2RmLmlmX2ZsYWdzID0gMDsKKwkJZmxhZ3MgfD0gWEZTX0lMT0dfREVWOworCQlicmVhazsKKwljYXNlIFNfSUZSRUc6CisJY2FzZSBTX0lGRElSOgorCQlpZiAodW5saWtlbHkocGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX0FOWSkpIHsKKwkJCWlmIChwaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUlRJTkhFUklUKSB7CisJCQkJaWYgKChtb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKSB7CisJCQkJCWlwLT5pX2QuZGlfZmxhZ3MgfD0gWEZTX0RJRkxBR19SVElOSEVSSVQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJaXAtPmlfZC5kaV9mbGFncyB8PSBYRlNfRElGTEFHX1JFQUxUSU1FOworCQkJCQlpcC0+aV9pb2NvcmUuaW9fZmxhZ3MgfD0gWEZTX0lPQ09SRV9SVDsKKwkJCQl9CisJCQl9CisJCQlpZiAoKHBpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19OT0FUSU1FKSAmJgorCQkJICAgIHhmc19pbmhlcml0X25vYXRpbWUpCisJCQkJaXAtPmlfZC5kaV9mbGFncyB8PSBYRlNfRElGTEFHX05PQVRJTUU7CisJCQlpZiAoKHBpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19OT0RVTVApICYmCisJCQkgICAgeGZzX2luaGVyaXRfbm9kdW1wKQorCQkJCWlwLT5pX2QuZGlfZmxhZ3MgfD0gWEZTX0RJRkxBR19OT0RVTVA7CisJCQlpZiAoKHBpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19TWU5DKSAmJgorCQkJICAgIHhmc19pbmhlcml0X3N5bmMpCisJCQkJaXAtPmlfZC5kaV9mbGFncyB8PSBYRlNfRElGTEFHX1NZTkM7CisJCQlpZiAoKHBpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19OT1NZTUxJTktTKSAmJgorCQkJICAgIHhmc19pbmhlcml0X25vc3ltbGlua3MpCisJCQkJaXAtPmlfZC5kaV9mbGFncyB8PSBYRlNfRElGTEFHX05PU1lNTElOS1M7CisJCX0KKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIFNfSUZMTks6CisJCWlwLT5pX2QuZGlfZm9ybWF0ID0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUzsKKwkJaXAtPmlfZGYuaWZfZmxhZ3MgPSBYRlNfSUZFWFRFTlRTOworCQlpcC0+aV9kZi5pZl9ieXRlcyA9IGlwLT5pX2RmLmlmX3JlYWxfYnl0ZXMgPSAwOworCQlpcC0+aV9kZi5pZl91MS5pZl9leHRlbnRzID0gTlVMTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCX0KKwkvKgorCSAqIEF0dHJpYnV0ZSBmb3JrIHNldHRpbmdzIGZvciBuZXcgaW5vZGUuCisJICovCisJaXAtPmlfZC5kaV9hZm9ybWF0ID0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUzsKKwlpcC0+aV9kLmRpX2FuZXh0ZW50cyA9IDA7CisKKwkvKgorCSAqIExvZyB0aGUgbmV3IHZhbHVlcyBzdHVmZmVkIGludG8gdGhlIGlub2RlLgorCSAqLworCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBmbGFncyk7CisKKwkvKiBub3cgdGhhdCB3ZSBoYXZlIGEgdl90eXBlIHdlIGNhbiBzZXQgTGludXggaW5vZGUgb3BzICgmIHVubG9jaykgKi8KKwlWRlNfSU5JVF9WTk9ERShYRlNfTVRPVkZTKHRwLT50X21vdW50cCksIHZwLCBYRlNfSVRPQkhWKGlwKSwgMSk7CisKKwkqaXBwID0gaXA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gYmxvY2tzIGFsbG9jYXRlZCB0byB0aGUKKyAqIGZpbGUgYmV5b25kIHRoZSBzaXplIG9mIHRoZSBmaWxlLiAgV2UgZG9uJ3QgY2hlY2sgdGhpcyBmb3IKKyAqIGZpbGVzIHdpdGggZml4ZWQgc2l6ZSBleHRlbnRzIG9yIHJlYWwgdGltZSBleHRlbnRzLCBidXQgd2UKKyAqIGF0IGxlYXN0IGRvIGl0IGZvciByZWd1bGFyIGZpbGVzLgorICovCisjaWZkZWYgREVCVUcKK3ZvaWQKK3hmc19pc2l6ZV9jaGVjaygKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2lub2RlX3QJKmlwLAorCXhmc19mc2l6ZV90CWlzaXplKQoreworCXhmc19maWxlb2ZmX3QJbWFwX2ZpcnN0OworCWludAkJbmltYXBzOworCXhmc19ibWJ0X2lyZWNfdAlpbWFwc1syXTsKKworCWlmICgoaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSAhPSBTX0lGUkVHKQorCQlyZXR1cm47CisKKwlpZiAoIGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FICkKKwkJcmV0dXJuOworCisJbmltYXBzID0gMjsKKwltYXBfZmlyc3QgPSBYRlNfQl9UT19GU0IobXAsICh4ZnNfdWZzaXplX3QpaXNpemUpOworCS8qCisJICogVGhlIGZpbGVzeXN0ZW0gY291bGQgYmUgc2h1dHRpbmcgZG93biwgc28gYm1hcGkgbWF5IHJldHVybgorCSAqIGFuIGVycm9yLgorCSAqLworCWlmICh4ZnNfYm1hcGkoTlVMTCwgaXAsIG1hcF9maXJzdCwKKwkJCSAoWEZTX0JfVE9fRlNCKG1wLAorCQkJCSAgICAgICAoeGZzX3Vmc2l6ZV90KVhGU19NQVhJT0ZGU0VUKG1wKSkgLQorCQkJICBtYXBfZmlyc3QpLAorCQkJIFhGU19CTUFQSV9FTlRJUkUsIE5VTEwsIDAsIGltYXBzLCAmbmltYXBzLAorCQkJIE5VTEwpKQorCSAgICByZXR1cm47CisJQVNTRVJUKG5pbWFwcyA9PSAxKTsKKwlBU1NFUlQoaW1hcHNbMF0uYnJfc3RhcnRibG9jayA9PSBIT0xFU1RBUlRCTE9DSyk7Cit9CisjZW5kaWYJLyogREVCVUcgKi8KKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgbGFzdCBwb3NzaWJsZSBidWZmZXJlZCBieXRlIGluIGEgZmlsZS4gIFRoaXMgbXVzdAorICogaW5jbHVkZSBkYXRhIHRoYXQgd2FzIGJ1ZmZlcmVkIGJleW9uZCB0aGUgRU9GIGJ5IHRoZSB3cml0ZSBjb2RlLgorICogVGhpcyBhbHNvIG5lZWRzIHRvIGRlYWwgd2l0aCBvdmVyZmxvd2luZyB0aGUgeGZzX2ZzaXplX3QgdHlwZQorICogd2hpY2ggY2FuIGhhcHBlbiBmb3Igc2l6ZXMgbmVhciB0aGUgbGltaXQuCisgKgorICogV2UgYWxzbyBuZWVkIHRvIHRha2UgaW50byBhY2NvdW50IGFueSBibG9ja3MgYmV5b25kIHRoZSBFT0YuICBJdAorICogbWF5IGJlIHRoZSBjYXNlIHRoYXQgdGhleSB3ZXJlIGJ1ZmZlcmVkIGJ5IGEgd3JpdGUgd2hpY2ggZmFpbGVkLgorICogSW4gdGhhdCBjYXNlIHRoZSBwYWdlcyB3aWxsIHN0aWxsIGJlIGluIG1lbW9yeSwgYnV0IHRoZSBpbm9kZSBzaXplCisgKiB3aWxsIG5ldmVyIGhhdmUgYmVlbiB1cGRhdGVkLgorICovCit4ZnNfZnNpemVfdAoreGZzX2ZpbGVfbGFzdF9ieXRlKAorCXhmc19pbm9kZV90CSppcCkKK3sKKwl4ZnNfbW91bnRfdAkqbXA7CisJeGZzX2ZzaXplX3QJbGFzdF9ieXRlOworCXhmc19maWxlb2ZmX3QJbGFzdF9ibG9jazsKKwl4ZnNfZmlsZW9mZl90CXNpemVfbGFzdF9ibG9jazsKKwlpbnQJCWVycm9yOworCisJQVNTRVJUKGlzbXJsb2NrZWQoJihpcC0+aV9pb2xvY2spLCBNUl9VUERBVEUgfCBNUl9BQ0NFU1MpKTsKKworCW1wID0gaXAtPmlfbW91bnQ7CisJLyoKKwkgKiBPbmx5IGNoZWNrIGZvciBibG9ja3MgYmV5b25kIHRoZSBFT0YgaWYgdGhlIGV4dGVudHMgaGF2ZQorCSAqIGJlZW4gcmVhZCBpbi4gIFRoaXMgZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IgdGhlIGlub2RlIGxvY2ssCisJICogYW5kIGl0IGFsc28gc2F2ZXMgdXMgZnJvbSBsb29raW5nIHdoZW4gaXQgcmVhbGx5IGlzbid0CisJICogbmVjZXNzYXJ5LgorCSAqLworCWlmIChpcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpIHsKKwkJZXJyb3IgPSB4ZnNfYm1hcF9sYXN0X29mZnNldChOVUxMLCBpcCwgJmxhc3RfYmxvY2ssCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJaWYgKGVycm9yKSB7CisJCQlsYXN0X2Jsb2NrID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCWxhc3RfYmxvY2sgPSAwOworCX0KKwlzaXplX2xhc3RfYmxvY2sgPSBYRlNfQl9UT19GU0IobXAsICh4ZnNfdWZzaXplX3QpaXAtPmlfZC5kaV9zaXplKTsKKwlsYXN0X2Jsb2NrID0gWEZTX0ZJTEVPRkZfTUFYKGxhc3RfYmxvY2ssIHNpemVfbGFzdF9ibG9jayk7CisKKwlsYXN0X2J5dGUgPSBYRlNfRlNCX1RPX0IobXAsIGxhc3RfYmxvY2spOworCWlmIChsYXN0X2J5dGUgPCAwKSB7CisJCXJldHVybiBYRlNfTUFYSU9GRlNFVChtcCk7CisJfQorCWxhc3RfYnl0ZSArPSAoMSA8PCBtcC0+bV93cml0ZWlvX2xvZyk7CisJaWYgKGxhc3RfYnl0ZSA8IDApIHsKKwkJcmV0dXJuIFhGU19NQVhJT0ZGU0VUKG1wKTsKKwl9CisJcmV0dXJuIGxhc3RfYnl0ZTsKK30KKworI2lmIGRlZmluZWQoWEZTX1JXX1RSQUNFKQorU1RBVElDIHZvaWQKK3hmc19pdHJ1bmNfdHJhY2UoCisJaW50CQl0YWcsCisJeGZzX2lub2RlX3QJKmlwLAorCWludAkJZmxhZywKKwl4ZnNfZnNpemVfdAluZXdfc2l6ZSwKKwl4ZnNfb2ZmX3QJdG9zc19zdGFydCwKKwl4ZnNfb2ZmX3QJdG9zc19maW5pc2gpCit7CisJaWYgKGlwLT5pX3J3dHJhY2UgPT0gTlVMTCkgeworCQlyZXR1cm47CisJfQorCisJa3RyYWNlX2VudGVyKGlwLT5pX3J3dHJhY2UsCisJCSAgICAgKHZvaWQqKSgobG9uZyl0YWcpLAorCQkgICAgICh2b2lkKilpcCwKKwkJICAgICAodm9pZCopKHVuc2lnbmVkIGxvbmcpKChpcC0+aV9kLmRpX3NpemUgPj4gMzIpICYgMHhmZmZmZmZmZiksCisJCSAgICAgKHZvaWQqKSh1bnNpZ25lZCBsb25nKShpcC0+aV9kLmRpX3NpemUgJiAweGZmZmZmZmZmKSwKKwkJICAgICAodm9pZCopKChsb25nKWZsYWcpLAorCQkgICAgICh2b2lkKikodW5zaWduZWQgbG9uZykoKG5ld19zaXplID4+IDMyKSAmIDB4ZmZmZmZmZmYpLAorCQkgICAgICh2b2lkKikodW5zaWduZWQgbG9uZykobmV3X3NpemUgJiAweGZmZmZmZmZmKSwKKwkJICAgICAodm9pZCopKHVuc2lnbmVkIGxvbmcpKCh0b3NzX3N0YXJ0ID4+IDMyKSAmIDB4ZmZmZmZmZmYpLAorCQkgICAgICh2b2lkKikodW5zaWduZWQgbG9uZykodG9zc19zdGFydCAmIDB4ZmZmZmZmZmYpLAorCQkgICAgICh2b2lkKikodW5zaWduZWQgbG9uZykoKHRvc3NfZmluaXNoID4+IDMyKSAmIDB4ZmZmZmZmZmYpLAorCQkgICAgICh2b2lkKikodW5zaWduZWQgbG9uZykodG9zc19maW5pc2ggJiAweGZmZmZmZmZmKSwKKwkJICAgICAodm9pZCopKHVuc2lnbmVkIGxvbmcpY3VycmVudF9jcHUoKSwKKwkJICAgICAodm9pZCopMCwKKwkJICAgICAodm9pZCopMCwKKwkJICAgICAodm9pZCopMCwKKwkJICAgICAodm9pZCopMCk7Cit9CisjZWxzZQorI2RlZmluZQl4ZnNfaXRydW5jX3RyYWNlKHRhZywgaXAsIGZsYWcsIG5ld19zaXplLCB0b3NzX3N0YXJ0LCB0b3NzX2ZpbmlzaCkKKyNlbmRpZgorCisvKgorICogU3RhcnQgdGhlIHRydW5jYXRpb24gb2YgdGhlIGZpbGUgdG8gbmV3X3NpemUuICBUaGUgbmV3IHNpemUKKyAqIG11c3QgYmUgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50IHNpemUuICBUaGlzIHJvdXRpbmUgd2lsbAorICogY2xlYXIgdGhlIGJ1ZmZlciBhbmQgcGFnZSBjYWNoZXMgb2YgZmlsZSBkYXRhIGluIHRoZSByZW1vdmVkCisgKiByYW5nZSwgYW5kIHhmc19pdHJ1bmNhdGVfZmluaXNoKCkgd2lsbCByZW1vdmUgdGhlIHVuZGVybHlpbmcKKyAqIGRpc2sgYmxvY2tzLgorICoKKyAqIFRoZSBpbm9kZSBtdXN0IGhhdmUgaXRzIEkvTyBsb2NrIGxvY2tlZCBFWENMVVNJVkVMWSwgYW5kIGl0CisgKiBtdXN0IE5PVCBoYXZlIHRoZSBpbm9kZSBsb2NrIGhlbGQgYXQgYWxsLiAgVGhpcyBpcyBiZWNhdXNlIHdlJ3JlCisgKiBjYWxsaW5nIGludG8gdGhlIGJ1ZmZlci9wYWdlIGNhY2hlIGNvZGUgYW5kIHdlIGNhbid0IGhvbGQgdGhlCisgKiBpbm9kZSBsb2NrIHdoZW4gd2UgZG8gc28uCisgKgorICogVGhlIGZsYWdzIHBhcmFtZXRlciBjYW4gaGF2ZSBlaXRoZXIgdGhlIHZhbHVlIFhGU19JVFJVTkNfREVGSU5JVEUKKyAqIG9yIFhGU19JVFJVTkNfTUFZQkUuICBUaGUgWEZTX0lUUlVOQ19NQVlCRSB2YWx1ZSBzaG91bGQgYmUgdXNlZAorICogaW4gdGhlIGNhc2UgdGhhdCB0aGUgY2FsbGVyIGlzIGxvY2tpbmcgdGhpbmdzIG91dCBvZiBvcmRlciBhbmQKKyAqIG1heSBub3QgYmUgYWJsZSB0byBjYWxsIHhmc19pdHJ1bmNhdGVfZmluaXNoKCkgd2l0aCB0aGUgaW5vZGUgbG9jaworICogaGVsZCB3aXRob3V0IGRyb3BwaW5nIHRoZSBJL08gbG9jay4gIElmIHRoZSBjYWxsZXIgbXVzdCBkcm9wIHRoZQorICogSS9PIGxvY2sgYmVmb3JlIGNhbGxpbmcgeGZzX2l0cnVuY2F0ZV9maW5pc2goKSwgdGhlbiB4ZnNfaXRydW5jYXRlX3N0YXJ0KCkKKyAqIG11c3QgYmUgY2FsbGVkIGFnYWluIHdpdGggYWxsIHRoZSBzYW1lIHJlc3RyaWN0aW9ucyBhcyB0aGUgaW5pdGlhbAorICogY2FsbC4KKyAqLwordm9pZAoreGZzX2l0cnVuY2F0ZV9zdGFydCgKKwl4ZnNfaW5vZGVfdAkqaXAsCisJdWludAkJZmxhZ3MsCisJeGZzX2ZzaXplX3QJbmV3X3NpemUpCit7CisJeGZzX2ZzaXplX3QJbGFzdF9ieXRlOworCXhmc19vZmZfdAl0b3NzX3N0YXJ0OworCXhmc19tb3VudF90CSptcDsKKwl2bm9kZV90CQkqdnA7CisKKwlBU1NFUlQoaXNtcmxvY2tlZCgmaXAtPmlfaW9sb2NrLCBNUl9VUERBVEUpICE9IDApOworCUFTU0VSVCgobmV3X3NpemUgPT0gMCkgfHwgKG5ld19zaXplIDw9IGlwLT5pX2QuZGlfc2l6ZSkpOworCUFTU0VSVCgoZmxhZ3MgPT0gWEZTX0lUUlVOQ19ERUZJTklURSkgfHwKKwkgICAgICAgKGZsYWdzID09IFhGU19JVFJVTkNfTUFZQkUpKTsKKworCW1wID0gaXAtPmlfbW91bnQ7CisJdnAgPSBYRlNfSVRPVihpcCk7CisJLyoKKwkgKiBDYWxsIFZPUF9UT1NTX1BBR0VTKCkgb3IgVk9QX0ZMVVNISU5WQUxfUEFHRVMoKSB0byBnZXQgcmlkIG9mIHBhZ2VzIGFuZCBidWZmZXJzCisJICogb3ZlcmxhcHBpbmcgdGhlIHJlZ2lvbiBiZWluZyByZW1vdmVkLiAgV2UgaGF2ZSB0byB1c2UKKwkgKiB0aGUgbGVzcyBlZmZpY2llbnQgVk9QX0ZMVVNISU5WQUxfUEFHRVMoKSBpbiB0aGUgY2FzZSB0aGF0IHRoZQorCSAqIGNhbGxlciBtYXkgbm90IGJlIGFibGUgdG8gZmluaXNoIHRoZSB0cnVuY2F0ZSB3aXRob3V0CisJICogZHJvcHBpbmcgdGhlIGlub2RlJ3MgSS9PIGxvY2suICBNYWtlIHN1cmUKKwkgKiB0byBjYXRjaCBhbnkgcGFnZXMgYnJvdWdodCBpbiBieSBidWZmZXJzIG92ZXJsYXBwaW5nCisJICogdGhlIEVPRiBieSBzZWFyY2hpbmcgb3V0IGJleW9uZCB0aGUgaXNpemUgYnkgb3VyCisJICogYmxvY2sgc2l6ZS4gV2Ugcm91bmQgbmV3X3NpemUgdXAgdG8gYSBibG9jayBib3VuZGFyeQorCSAqIHNvIHRoYXQgd2UgZG9uJ3QgdG9zcyB0aGluZ3Mgb24gdGhlIHNhbWUgYmxvY2sgYXMKKwkgKiBuZXdfc2l6ZSBidXQgYmVmb3JlIGl0LgorCSAqCisJICogQmVmb3JlIGNhbGxpbmcgVk9QX1RPU1NfUEFHRVMoKSBvciBWT1BfRkxVU0hJTlZBTF9QQUdFUygpLCBtYWtlIHN1cmUgdG8KKwkgKiBjYWxsIHJlbWFwZigpIG92ZXIgdGhlIHNhbWUgcmVnaW9uIGlmIHRoZSBmaWxlIGlzIG1hcHBlZC4KKwkgKiBUaGlzIGZyZWVzIHVwIG1hcHBlZCBmaWxlIHJlZmVyZW5jZXMgdG8gdGhlIHBhZ2VzIGluIHRoZQorCSAqIGdpdmVuIHJhbmdlIGFuZCBmb3IgdGhlIFZPUF9GTFVTSElOVkFMX1BBR0VTKCkgY2FzZSBpdCBlbnN1cmVzCisJICogdGhhdCB3ZSBnZXQgdGhlIGxhdGVzdCBtYXBwZWQgY2hhbmdlcyBmbHVzaGVkIG91dC4KKwkgKi8KKwl0b3NzX3N0YXJ0ID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KW5ld19zaXplKTsKKwl0b3NzX3N0YXJ0ID0gWEZTX0ZTQl9UT19CKG1wLCB0b3NzX3N0YXJ0KTsKKwlpZiAodG9zc19zdGFydCA8IDApIHsKKwkJLyoKKwkJICogVGhlIHBsYWNlIHRvIHN0YXJ0IHRvc3NpbmcgaXMgYmV5b25kIG91ciBtYXhpbXVtCisJCSAqIGZpbGUgc2l6ZSwgc28gdGhlcmUgaXMgbm8gd2F5IHRoYXQgdGhlIGRhdGEgZXh0ZW5kZWQKKwkJICogb3V0IHRoZXJlLgorCQkgKi8KKwkJcmV0dXJuOworCX0KKwlsYXN0X2J5dGUgPSB4ZnNfZmlsZV9sYXN0X2J5dGUoaXApOworCXhmc19pdHJ1bmNfdHJhY2UoWEZTX0lUUlVOQ19TVEFSVCwgaXAsIGZsYWdzLCBuZXdfc2l6ZSwgdG9zc19zdGFydCwKKwkJCSBsYXN0X2J5dGUpOworCWlmIChsYXN0X2J5dGUgPiB0b3NzX3N0YXJ0KSB7CisJCWlmIChmbGFncyAmIFhGU19JVFJVTkNfREVGSU5JVEUpIHsKKwkJCVZPUF9UT1NTX1BBR0VTKHZwLCB0b3NzX3N0YXJ0LCAtMSwgRklfUkVNQVBGX0xPQ0tFRCk7CisJCX0gZWxzZSB7CisJCQlWT1BfRkxVU0hJTlZBTF9QQUdFUyh2cCwgdG9zc19zdGFydCwgLTEsIEZJX1JFTUFQRl9MT0NLRUQpOworCQl9CisJfQorCisjaWZkZWYgREVCVUcKKwlpZiAobmV3X3NpemUgPT0gMCkgeworCQlBU1NFUlQoVk5fQ0FDSEVEKHZwKSA9PSAwKTsKKwl9CisjZW5kaWYKK30KKworLyoKKyAqIFNocmluayB0aGUgZmlsZSB0byB0aGUgZ2l2ZW4gbmV3X3NpemUuICBUaGUgbmV3CisgKiBzaXplIG11c3QgYmUgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50IHNpemUuCisgKiBUaGlzIHdpbGwgZnJlZSB1cCB0aGUgdW5kZXJseWluZyBibG9ja3MKKyAqIGluIHRoZSByZW1vdmVkIHJhbmdlIGFmdGVyIGEgY2FsbCB0byB4ZnNfaXRydW5jYXRlX3N0YXJ0KCkKKyAqIG9yIHhmc19hdHJ1bmNhdGVfc3RhcnQoKS4KKyAqCisgKiBUaGUgdHJhbnNhY3Rpb24gcGFzc2VkIHRvIHRoaXMgcm91dGluZSBtdXN0IGhhdmUgbWFkZQorICogYSBwZXJtYW5lbnQgbG9nIHJlc2VydmF0aW9uIG9mIGF0IGxlYXN0IFhGU19JVFJVTkNBVEVfTE9HX1JFUy4KKyAqIFRoaXMgcm91dGluZSBtYXkgY29tbWl0IHRoZSBnaXZlbiB0cmFuc2FjdGlvbiBhbmQKKyAqIHN0YXJ0IG5ldyBvbmVzLCBzbyBtYWtlIHN1cmUgZXZlcnl0aGluZyBpbnZvbHZlZCBpbgorICogdGhlIHRyYW5zYWN0aW9uIGlzIHRpZHkgYmVmb3JlIGNhbGxpbmcgaGVyZS4KKyAqIFNvbWUgdHJhbnNhY3Rpb24gd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyIHRvIGJlCisgKiBjb21taXR0ZWQuICBUaGUgaW5jb21pbmcgdHJhbnNhY3Rpb24gbXVzdCBhbHJlYWR5IGluY2x1ZGUKKyAqIHRoZSBpbm9kZSwgYW5kIGJvdGggaW5vZGUgbG9ja3MgbXVzdCBiZSBoZWxkIGV4Y2x1c2l2ZWx5LgorICogVGhlIGlub2RlIG11c3QgYWxzbyBiZSAiaGVsZCIgd2l0aGluIHRoZSB0cmFuc2FjdGlvbi4gIE9uCisgKiByZXR1cm4gdGhlIGlub2RlIHdpbGwgYmUgImhlbGQiIHdpdGhpbiB0aGUgcmV0dXJuZWQgdHJhbnNhY3Rpb24uCisgKiBUaGlzIHJvdXRpbmUgZG9lcyBOT1QgcmVxdWlyZSBhbnkgZGlzayBzcGFjZSB0byBiZSByZXNlcnZlZAorICogZm9yIGl0IHdpdGhpbiB0aGUgdHJhbnNhY3Rpb24uCisgKgorICogVGhlIGZvcmsgcGFyYW1ldGVyIG11c3QgYmUgZWl0aGVyIHhmc19hdHRyX2Zvcmsgb3IgeGZzX2RhdGFfZm9yaywKKyAqIGFuZCBpdCBpbmRpY2F0ZXMgdGhlIGZvcmsgd2hpY2ggaXMgdG8gYmUgdHJ1bmNhdGVkLiAgRm9yIHRoZQorICogYXR0cmlidXRlIGZvcmsgd2Ugb25seSBzdXBwb3J0IHRydW5jYXRpb24gdG8gc2l6ZSAwLgorICoKKyAqIFdlIHVzZSB0aGUgc3luYyBwYXJhbWV0ZXIgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhlIGZpcnN0CisgKiB0cmFuc2FjdGlvbiB3ZSBwZXJmb3JtIG1pZ2h0IGhhdmUgdG8gYmUgc3luY2hyb25vdXMuICBGb3IgdGhlIGF0dHIgZm9yaywKKyAqIGl0IG5lZWRzIHRvIGJlIHNvIGlmIHRoZSB1bmxpbmsgb2YgdGhlIGlub2RlIGlzIG5vdCB5ZXQga25vd24gdG8gYmUKKyAqIHBlcm1hbmVudCBpbiB0aGUgbG9nLiAgVGhpcyBrZWVwcyB1cyBmcm9tIGZyZWVpbmcgYW5kIHJldXNpbmcgdGhlCisgKiBibG9ja3Mgb2YgdGhlIGF0dHJpYnV0ZSBmb3JrIGJlZm9yZSB0aGUgdW5saW5rIG9mIHRoZSBpbm9kZSBiZWNvbWVzCisgKiBwZXJtYW5lbnQuCisgKgorICogRm9yIHRoZSBkYXRhIGZvcmssIHdlIG5vcm1hbGx5IGhhdmUgdG8gcnVuIHN5bmNocm9ub3VzbHkgaWYgd2UncmUKKyAqIGJlaW5nIGNhbGxlZCBvdXQgb2YgdGhlIGluYWN0aXZlIHBhdGggb3Igd2UncmUgYmVpbmcgY2FsbGVkCisgKiBvdXQgb2YgdGhlIGNyZWF0ZSBwYXRoIHdoZXJlIHdlJ3JlIHRydW5jYXRpbmcgYW4gZXhpc3RpbmcgZmlsZS4KKyAqIEVpdGhlciB3YXksIHRoZSB0cnVuY2F0ZSBuZWVkcyB0byBiZSBzeW5jIHNvIGJsb2NrcyBkb24ndCByZWFwcGVhcgorICogaW4gdGhlIGZpbGUgd2l0aCBhbHRlcmVkIGRhdGEgaW4gY2FzZSBvZiBhIGNyYXNoLiAgd3N5bmMgZmlsZXN5c3RlbXMKKyAqIGNhbiBydW4gdGhlIGZpcnN0IGNhc2UgYXN5bmMgYmVjYXVzZSBhbnl0aGluZyB0aGF0IHNocmlua3MgdGhlIGlub2RlCisgKiBoYXMgdG8gcnVuIHN5bmMgc28gYnkgdGhlIHRpbWUgd2UncmUgY2FsbGVkIGhlcmUgZnJvbSBpbmFjdGl2ZSwgdGhlCisgKiBpbm9kZSBzaXplIGlzIHBlcm1hbmVudGx5IHNldCB0byAwLgorICoKKyAqIENhbGxzIGZyb20gdGhlIHRydW5jYXRlIHBhdGggYWx3YXlzIG5lZWQgdG8gYmUgc3luYyB1bmxlc3Mgd2UncmUKKyAqIGluIGEgd3N5bmMgZmlsZXN5c3RlbSBhbmQgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiB1bmxpbmtlZC4KKyAqCisgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjb3JyZWN0bHkgc2V0dGluZyB0aGUgc3luYyBwYXJhbWV0ZXIuCisgKiBJdCBnZXRzIHRvbyBoYXJkIGZvciB1cyB0byBndWVzcyBoZXJlIHdoaWNoIHBhdGggd2UncmUgYmVpbmcgY2FsbGVkCisgKiBvdXQgb2YganVzdCBiYXNlZCBvbiBpbm9kZSBzdGF0ZS4KKyAqLworaW50Cit4ZnNfaXRydW5jYXRlX2ZpbmlzaCgKKwl4ZnNfdHJhbnNfdAkqKnRwLAorCXhmc19pbm9kZV90CSppcCwKKwl4ZnNfZnNpemVfdAluZXdfc2l6ZSwKKwlpbnQJCWZvcmssCisJaW50CQlzeW5jKQoreworCXhmc19mc2Jsb2NrX3QJZmlyc3RfYmxvY2s7CisJeGZzX2ZpbGVvZmZfdAlmaXJzdF91bm1hcF9ibG9jazsKKwl4ZnNfZmlsZW9mZl90CWxhc3RfYmxvY2s7CisJeGZzX2ZpbGJsa3NfdAl1bm1hcF9sZW49MDsKKwl4ZnNfbW91bnRfdAkqbXA7CisJeGZzX3RyYW5zX3QJKm50cDsKKwlpbnQJCWRvbmU7CisJaW50CQljb21taXR0ZWQ7CisJeGZzX2JtYXBfZnJlZV90CWZyZWVfbGlzdDsKKwlpbnQJCWVycm9yOworCisJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2lvbG9jaywgTVJfVVBEQVRFKSAhPSAwKTsKKwlBU1NFUlQoaXNtcmxvY2tlZCgmaXAtPmlfbG9jaywgTVJfVVBEQVRFKSAhPSAwKTsKKwlBU1NFUlQoKG5ld19zaXplID09IDApIHx8IChuZXdfc2l6ZSA8PSBpcC0+aV9kLmRpX3NpemUpKTsKKwlBU1NFUlQoKnRwICE9IE5VTEwpOworCUFTU0VSVCgoKnRwKS0+dF9mbGFncyAmIFhGU19UUkFOU19QRVJNX0xPR19SRVMpOworCUFTU0VSVChpcC0+aV90cmFuc3AgPT0gKnRwKTsKKwlBU1NFUlQoaXAtPmlfaXRlbXAgIT0gTlVMTCk7CisJQVNTRVJUKGlwLT5pX2l0ZW1wLT5pbGlfZmxhZ3MgJiBYRlNfSUxJX0hPTEQpOworCisKKwludHAgPSAqdHA7CisJbXAgPSAobnRwKS0+dF9tb3VudHA7CisJQVNTRVJUKCEgWEZTX05PVF9EUUFUVEFDSEVEKG1wLCBpcCkpOworCisJLyoKKwkgKiBXZSBvbmx5IHN1cHBvcnQgdHJ1bmNhdGluZyB0aGUgZW50aXJlIGF0dHJpYnV0ZSBmb3JrLgorCSAqLworCWlmIChmb3JrID09IFhGU19BVFRSX0ZPUkspIHsKKwkJbmV3X3NpemUgPSAwTEw7CisJfQorCWZpcnN0X3VubWFwX2Jsb2NrID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KW5ld19zaXplKTsKKwl4ZnNfaXRydW5jX3RyYWNlKFhGU19JVFJVTkNfRklOSVNIMSwgaXAsIDAsIG5ld19zaXplLCAwLCAwKTsKKwkvKgorCSAqIFRoZSBmaXJzdCB0aGluZyB3ZSBkbyBpcyBzZXQgdGhlIHNpemUgdG8gbmV3X3NpemUgcGVybWFuZW50bHkKKwkgKiBvbiBkaXNrLiAgVGhpcyB3YXkgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBhbnlvbmUgZXZlcgorCSAqIGJlaW5nIGFibGUgdG8gbG9vayBhdCB0aGUgZGF0YSBiZWluZyBmcmVlZCBldmVuIGluIHRoZSBmYWNlCisJICogb2YgYSBjcmFzaC4gIFdoYXQgd2UncmUgZ2V0dGluZyBhcm91bmQgaGVyZSBpcyB0aGUgY2FzZSB3aGVyZQorCSAqIHdlIGZyZWUgYSBibG9jaywgaXQgaXMgYWxsb2NhdGVkIHRvIGFub3RoZXIgZmlsZSwgaXQgaXMgd3JpdHRlbgorCSAqIHRvLCBhbmQgdGhlbiB3ZSBjcmFzaC4gIElmIHRoZSBuZXcgZGF0YSBnZXRzIHdyaXR0ZW4gdG8gdGhlCisJICogZmlsZSBidXQgdGhlIGxvZyBidWZmZXJzIGNvbnRhaW5pbmcgdGhlIGZyZWUgYW5kIHJlYWxsb2NhdGlvbgorCSAqIGRvbid0LCB0aGVuIHdlJ2QgZW5kIHVwIHdpdGggZ2FyYmFnZSBpbiB0aGUgYmxvY2tzIGJlaW5nIGZyZWVkLgorCSAqIEFzIGxvbmcgYXMgd2UgbWFrZSB0aGUgbmV3X3NpemUgcGVybWFuZW50IGJlZm9yZSBhY3R1YWxseQorCSAqIGZyZWVpbmcgYW55IGJsb2NrcyBpdCBkb2Vzbid0IG1hdHRlciBpZiB0aGV5IGdldCB3cml0dHRlbiB0by4KKwkgKgorCSAqIFRoZSBjYWxsZXJzIG11c3Qgc2lnbmFsIGludG8gdXMgd2hldGhlciBvciBub3QgdGhlIHNpemUKKwkgKiBzZXR0aW5nIGhlcmUgbXVzdCBiZSBzeW5jaHJvbm91cy4gIFRoZXJlIGFyZSBhIGZldyBjYXNlcworCSAqIHdoZXJlIGl0IGRvZXNuJ3QgaGF2ZSB0byBiZSBzeW5jaHJvbm91cy4gIFRob3NlIGNhc2VzCisJICogb2NjdXIgaWYgdGhlIGZpbGUgaXMgdW5saW5rZWQgYW5kIHdlIGtub3cgdGhlIHVubGluayBpcworCSAqIHBlcm1hbmVudCBvciBpZiB0aGUgYmxvY2tzIGJlaW5nIHRydW5jYXRlZCBhcmUgZ3VhcmFudGVlZAorCSAqIHRvIGJlIGJleW9uZCB0aGUgaW5vZGUgZW9mIChyZWdhcmRsZXNzIG9mIHRoZSBsaW5rIGNvdW50KQorCSAqIGFuZCB0aGUgZW9mIHZhbHVlIGlzIHBlcm1hbmVudC4gIEJvdGggb2YgdGhlc2UgY2FzZXMgb2NjdXIKKwkgKiBvbmx5IG9uIHdzeW5jLW1vdW50ZWQgZmlsZXN5c3RlbXMuICBJbiB0aG9zZSBjYXNlcywgd2UncmUKKwkgKiBndWFyYW50ZWVkIHRoYXQgbm8gdXNlciB3aWxsIGV2ZXIgc2VlIHRoZSBkYXRhIGluIHRoZSBibG9ja3MKKwkgKiB0aGF0IGFyZSBiZWluZyB0cnVuY2F0ZWQgc28gdGhlIHRydW5jYXRlIGNhbiBydW4gYXN5bmMuCisJICogSW4gdGhlIGZyZWUgYmV5b25kIGVvZiBjYXNlLCB0aGUgZmlsZSBtYXkgd2luZCB1cCB3aXRoCisJICogbW9yZSBibG9ja3MgYWxsb2NhdGVkIHRvIGl0IHRoYW4gaXQgbmVlZHMgaWYgd2UgY3Jhc2gKKwkgKiBhbmQgdGhhdCB3b24ndCBnZXQgZml4ZWQgdW50aWwgdGhlIG5leHQgdGltZSB0aGUgZmlsZQorCSAqIGlzIHJlLW9wZW5lZCBhbmQgY2xvc2VkIGJ1dCB0aGF0J3Mgb2sgYXMgdGhhdCBzaG91bGRuJ3QKKwkgKiBiZSB0b28gbWFueSBibG9ja3MuCisJICoKKwkgKiBIb3dldmVyLCB3ZSBjYW4ndCBqdXN0IG1ha2UgYWxsIHdzeW5jIHhhY3Rpb25zIHJ1biBhc3luYworCSAqIGJlY2F1c2UgdGhlcmUncyBvbmUgY2FsbCBvdXQgb2YgdGhlIGNyZWF0ZSBwYXRoIHRoYXQgbmVlZHMKKwkgKiB0byBydW4gc3luYyB3aGVyZSBpdCdzIHRydW5jYXRpbmcgYW4gZXhpc3RpbmcgZmlsZSB0byBzaXplCisJICogMCB3aG9zZSBzaXplIGlzID4gMC4KKwkgKgorCSAqIEl0J3MgcHJvYmFibHkgcG9zc2libGUgdG8gY29tZSB1cCB3aXRoIGEgdGVzdCBpbiB0aGlzCisJICogcm91dGluZSB0aGF0IHdvdWxkIGNvcnJlY3RseSBkaXN0aW5ndWlzaCBhbGwgdGhlIGFib3ZlCisJICogY2FzZXMgZnJvbSB0aGUgdmFsdWVzIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGFuZCB0aGUKKwkgKiBpbm9kZSBzdGF0ZSBidXQgZm9yIHNhbml0eSdzIHNha2UsIEkndmUgZGVjaWRlZCB0byBsZXQgdGhlCisJICogbGF5ZXJzIGFib3ZlIGp1c3QgdGVsbCB1cy4gIEl0J3Mgc2ltcGxlciB0byBjb3JyZWN0bHkgZmlndXJlCisJICogb3V0IGluIHRoZSBsYXllciBhYm92ZSBleGFjdGx5IHVuZGVyIHdoYXQgY29uZGl0aW9ucyB3ZQorCSAqIGNhbiBydW4gYXN5bmMgYW5kIEkgdGhpbmsgaXQncyBlYXNpZXIgZm9yIG90aGVycyByZWFkIGFuZAorCSAqIGZvbGxvdyB0aGUgbG9naWMgaW4gY2FzZSBzb21ldGhpbmcgaGFzIHRvIGJlIGNoYW5nZWQuCisJICogY3Njb3BlIGlzIHlvdXIgZnJpZW5kIC0tIHJjYy4KKwkgKgorCSAqIFRoZSBhdHRyaWJ1dGUgZm9yayBpcyBtdWNoIHNpbXBsZXIuCisJICoKKwkgKiBGb3IgdGhlIGF0dHJpYnV0ZSBmb3JrIHdlIGFsbG93IHRoZSBjYWxsZXIgdG8gdGVsbCB1cyB3aGV0aGVyCisJICogdGhlIHVubGluayBvZiB0aGUgaW5vZGUgdGhhdCBsZWQgdG8gdGhpcyBjYWxsIGlzIHlldCBwZXJtYW5lbnQKKwkgKiBpbiB0aGUgb24gZGlzayBsb2cuICBJZiBpdCBpcyBub3QgYW5kIHdlIHdpbGwgYmUgZnJlZWluZyBleHRlbnRzCisJICogaW4gdGhpcyBpbm9kZSB0aGVuIHdlIG1ha2UgdGhlIGZpcnN0IHRyYW5zYWN0aW9uIHN5bmNocm9ub3VzCisJICogdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHVubGluayBpcyBwZXJtYW5lbnQgYnkgdGhlIHRpbWUgd2UgZnJlZQorCSAqIHRoZSBibG9ja3MuCisJICovCisJaWYgKGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgeworCQlpZiAoaXAtPmlfZC5kaV9uZXh0ZW50cyA+IDApIHsKKwkJCWlwLT5pX2QuZGlfc2l6ZSA9IG5ld19zaXplOworCQkJeGZzX3RyYW5zX2xvZ19pbm9kZShudHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKwkJfQorCX0gZWxzZSBpZiAoc3luYykgeworCQlBU1NFUlQoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9XU1lOQykpOworCQlpZiAoaXAtPmlfZC5kaV9hbmV4dGVudHMgPiAwKQorCQkJeGZzX3RyYW5zX3NldF9zeW5jKG50cCk7CisJfQorCUFTU0VSVChmb3JrID09IFhGU19EQVRBX0ZPUksgfHwKKwkJKGZvcmsgPT0gWEZTX0FUVFJfRk9SSyAmJgorCQkJKChzeW5jICYmICEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfV1NZTkMpKSB8fAorCQkJIChzeW5jID09IDAgJiYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1dTWU5DKSkpKSk7CisKKwkvKgorCSAqIFNpbmNlIGl0IGlzIHBvc3NpYmxlIGZvciBzcGFjZSB0byBiZWNvbWUgYWxsb2NhdGVkIGJleW9uZAorCSAqIHRoZSBlbmQgb2YgdGhlIGZpbGUgKGluIGEgY3Jhc2ggd2hlcmUgdGhlIHNwYWNlIGlzIGFsbG9jYXRlZAorCSAqIGJ1dCB0aGUgaW5vZGUgc2l6ZSBpcyBub3QgeWV0IHVwZGF0ZWQpLCBzaW1wbHkgcmVtb3ZlIGFueQorCSAqIGJsb2NrcyB3aGljaCBzaG93IHVwIGJldHdlZW4gdGhlIG5ldyBFT0YgYW5kIHRoZSBtYXhpbXVtCisJICogcG9zc2libGUgZmlsZSBzaXplLiAgSWYgdGhlIGZpcnN0IGJsb2NrIHRvIGJlIHJlbW92ZWQgaXMKKwkgKiBiZXlvbmQgdGhlIG1heGltdW0gZmlsZSBzaXplIChpZSBpdCBpcyB0aGUgc2FtZSBhcyBsYXN0X2Jsb2NrKSwKKwkgKiB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uCisJICovCisJbGFzdF9ibG9jayA9IFhGU19CX1RPX0ZTQihtcCwgKHhmc191ZnNpemVfdClYRlNfTUFYSU9GRlNFVChtcCkpOworCUFTU0VSVChmaXJzdF91bm1hcF9ibG9jayA8PSBsYXN0X2Jsb2NrKTsKKwlkb25lID0gMDsKKwlpZiAobGFzdF9ibG9jayA9PSBmaXJzdF91bm1hcF9ibG9jaykgeworCQlkb25lID0gMTsKKwl9IGVsc2UgeworCQl1bm1hcF9sZW4gPSBsYXN0X2Jsb2NrIC0gZmlyc3RfdW5tYXBfYmxvY2sgKyAxOworCX0KKwl3aGlsZSAoIWRvbmUpIHsKKwkJLyoKKwkJICogRnJlZSB1cCB1cCB0byBYRlNfSVRSVU5DX01BWF9FWFRFTlRTLiAgeGZzX2J1bm1hcGkoKQorCQkgKiB3aWxsIHRlbGwgdXMgd2hldGhlciBpdCBmcmVlZCB0aGUgZW50aXJlIHJhbmdlIG9yCisJCSAqIG5vdC4gIElmIHRoaXMgaXMgYSBzeW5jaHJvbm91cyBtb3VudCAod3N5bmMpLAorCQkgKiB0aGVuIHdlIGNhbiB0ZWxsIGJ1bm1hcGkgdG8ga2VlcCBhbGwgdGhlCisJCSAqIHRyYW5zYWN0aW9ucyBhc3luY2hyb25vdXMgc2luY2UgdGhlIHVubGluaworCQkgKiB0cmFuc2FjdGlvbiB0aGF0IG1hZGUgdGhpcyBpbm9kZSBpbmFjdGl2ZSBoYXMKKwkJICogYWxyZWFkeSBoaXQgdGhlIGRpc2suICBUaGVyZSdzIG5vIGRhbmdlciBvZgorCQkgKiB0aGUgZnJlZWQgYmxvY2tzIGJlaW5nIHJldXNlZCwgdGhlcmUgYmVpbmcgYQorCQkgKiBjcmFzaCwgYW5kIHRoZSByZXVzZWQgYmxvY2tzIHN1ZGRlbmx5IHJlYXBwZWFyaW5nCisJCSAqIGluIHRoaXMgZmlsZSB3aXRoIGdhcmJhZ2UgaW4gdGhlbSBvbmNlIHJlY292ZXJ5CisJCSAqIHJ1bnMuCisJCSAqLworCQlYRlNfQk1BUF9JTklUKCZmcmVlX2xpc3QsICZmaXJzdF9ibG9jayk7CisJCWVycm9yID0geGZzX2J1bm1hcGkobnRwLCBpcCwgZmlyc3RfdW5tYXBfYmxvY2ssCisJCQkJICAgIHVubWFwX2xlbiwKKwkJCQkgICAgWEZTX0JNQVBJX0FGTEFHKGZvcmspIHwKKwkJCQkgICAgICAoc3luYyA/IDAgOiBYRlNfQk1BUElfQVNZTkMpLAorCQkJCSAgICBYRlNfSVRSVU5DX01BWF9FWFRFTlRTLAorCQkJCSAgICAmZmlyc3RfYmxvY2ssICZmcmVlX2xpc3QsICZkb25lKTsKKwkJaWYgKGVycm9yKSB7CisJCQkvKgorCQkJICogSWYgdGhlIGJ1bm1hcGkgY2FsbCBlbmNvdW50ZXJzIGFuIGVycm9yLAorCQkJICogcmV0dXJuIHRvIHRoZSBjYWxsZXIgd2hlcmUgdGhlIHRyYW5zYWN0aW9uCisJCQkgKiBjYW4gYmUgcHJvcGVybHkgYWJvcnRlZC4gIFdlIGp1c3QgbmVlZCB0bworCQkJICogbWFrZSBzdXJlIHdlJ3JlIG5vdCBob2xkaW5nIGFueSByZXNvdXJjZXMKKwkJCSAqIHRoYXQgd2Ugd2VyZSBub3Qgd2hlbiB3ZSBjYW1lIGluLgorCQkJICovCisJCQl4ZnNfYm1hcF9jYW5jZWwoJmZyZWVfbGlzdCk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKworCQkvKgorCQkgKiBEdXBsaWNhdGUgdGhlIHRyYW5zYWN0aW9uIHRoYXQgaGFzIHRoZSBwZXJtYW5lbnQKKwkJICogcmVzZXJ2YXRpb24gYW5kIGNvbW1pdCB0aGUgb2xkIHRyYW5zYWN0aW9uLgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2godHAsICZmcmVlX2xpc3QsIGZpcnN0X2Jsb2NrLAorCQkJCQkmY29tbWl0dGVkKTsKKwkJbnRwID0gKnRwOworCQlpZiAoZXJyb3IpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgYm1hcCBmaW5pc2ggY2FsbCBlbmNvdW50ZXJzIGFuIGVycm9yLAorCQkJICogcmV0dXJuIHRvIHRoZSBjYWxsZXIgd2hlcmUgdGhlIHRyYW5zYWN0aW9uCisJCQkgKiBjYW4gYmUgcHJvcGVybHkgYWJvcnRlZC4gIFdlIGp1c3QgbmVlZCB0bworCQkJICogbWFrZSBzdXJlIHdlJ3JlIG5vdCBob2xkaW5nIGFueSByZXNvdXJjZXMKKwkJCSAqIHRoYXQgd2Ugd2VyZSBub3Qgd2hlbiB3ZSBjYW1lIGluLgorCQkJICoKKwkJCSAqIEFib3J0aW5nIGZyb20gdGhpcyBwb2ludCBtaWdodCBsb3NlIHNvbWUKKwkJCSAqIGJsb2NrcyBpbiB0aGUgZmlsZSBzeXN0ZW0sIGJ1dCBvaCB3ZWxsLgorCQkJICovCisJCQl4ZnNfYm1hcF9jYW5jZWwoJmZyZWVfbGlzdCk7CisJCQlpZiAoY29tbWl0dGVkKSB7CisJCQkJLyoKKwkJCQkgKiBJZiB0aGUgcGFzc2VkIGluIHRyYW5zYWN0aW9uIGNvbW1pdHRlZAorCQkJCSAqIGluIHhmc19ibWFwX2ZpbmlzaCgpLCB0aGVuIHdlIHdhbnQgdG8KKwkJCQkgKiBhZGQgdGhlIGlub2RlIHRvIHRoaXMgb25lIGJlZm9yZSByZXR1cm5pbmcuCisJCQkJICogVGhpcyBrZWVwcyB0aGluZ3Mgc2ltcGxlIGZvciB0aGUgaGlnaGVyCisJCQkJICogbGV2ZWwgY29kZSwgYmVjYXVzZSBpdCBhbHdheXMga25vd3MgdGhhdAorCQkJCSAqIHRoZSBpbm9kZSBpcyBsb2NrZWQgYW5kIGhlbGQgaW4gdGhlCisJCQkJICogdHJhbnNhY3Rpb24gdGhhdCByZXR1cm5zIHRvIGl0IHdoZXRoZXIKKwkJCQkgKiBlcnJvcnMgb2NjdXIgb3Igbm90LiAgV2UgZG9uJ3QgbWFyayB0aGUKKwkJCQkgKiBpbm9kZSBkaXJ0eSBzbyB0aGF0IHRoaXMgdHJhbnNhY3Rpb24gY2FuCisJCQkJICogYmUgZWFzaWx5IGFib3J0ZWQgaWYgcG9zc2libGUuCisJCQkJICovCisJCQkJeGZzX3RyYW5zX2lqb2luKG50cCwgaXAsCisJCQkJCVhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKTsKKwkJCQl4ZnNfdHJhbnNfaWhvbGQobnRwLCBpcCk7CisJCQl9CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKworCQlpZiAoY29tbWl0dGVkKSB7CisJCQkvKgorCQkJICogVGhlIGZpcnN0IHhhY3Qgd2FzIGNvbW1pdHRlZCwKKwkJCSAqIHNvIGFkZCB0aGUgaW5vZGUgdG8gdGhlIG5ldyBvbmUuCisJCQkgKiBNYXJrIGl0IGRpcnR5IHNvIGl0IHdpbGwgYmUgbG9nZ2VkCisJCQkgKiBhbmQgbW92ZWQgZm9yd2FyZCBpbiB0aGUgbG9nIGFzCisJCQkgKiBwYXJ0IG9mIGV2ZXJ5IGNvbW1pdC4KKwkJCSAqLworCQkJeGZzX3RyYW5zX2lqb2luKG50cCwgaXAsCisJCQkJCVhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKTsKKwkJCXhmc190cmFuc19paG9sZChudHAsIGlwKTsKKwkJCXhmc190cmFuc19sb2dfaW5vZGUobnRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisJCX0KKwkJbnRwID0geGZzX3RyYW5zX2R1cChudHApOworCQkodm9pZCkgeGZzX3RyYW5zX2NvbW1pdCgqdHAsIDAsIE5VTEwpOworCQkqdHAgPSBudHA7CisJCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUobnRwLCAwLCBYRlNfSVRSVU5DQVRFX0xPR19SRVMobXApLCAwLAorCQkJCQkgIFhGU19UUkFOU19QRVJNX0xPR19SRVMsCisJCQkJCSAgWEZTX0lUUlVOQ0FURV9MT0dfQ09VTlQpOworCQkvKgorCQkgKiBBZGQgdGhlIGlub2RlIGJlaW5nIHRydW5jYXRlZCB0byB0aGUgbmV4dCBjaGFpbmVkCisJCSAqIHRyYW5zYWN0aW9uLgorCQkgKi8KKwkJeGZzX3RyYW5zX2lqb2luKG50cCwgaXAsIFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKTsKKwkJeGZzX3RyYW5zX2lob2xkKG50cCwgaXApOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gKGVycm9yKTsKKwl9CisJLyoKKwkgKiBPbmx5IHVwZGF0ZSB0aGUgc2l6ZSBpbiB0aGUgY2FzZSBvZiB0aGUgZGF0YSBmb3JrLCBidXQKKwkgKiBhbHdheXMgcmUtbG9nIHRoZSBpbm9kZSBzbyB0aGF0IG91ciBwZXJtYW5lbnQgdHJhbnNhY3Rpb24KKwkgKiBjYW4ga2VlcCBvbiByb2xsaW5nIGl0IGZvcndhcmQgaW4gdGhlIGxvZy4KKwkgKi8KKwlpZiAoZm9yayA9PSBYRlNfREFUQV9GT1JLKSB7CisJCXhmc19pc2l6ZV9jaGVjayhtcCwgaXAsIG5ld19zaXplKTsKKwkJaXAtPmlfZC5kaV9zaXplID0gbmV3X3NpemU7CisJfQorCXhmc190cmFuc19sb2dfaW5vZGUobnRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisJQVNTRVJUKChuZXdfc2l6ZSAhPSAwKSB8fAorCSAgICAgICAoZm9yayA9PSBYRlNfQVRUUl9GT1JLKSB8fAorCSAgICAgICAoaXAtPmlfZGVsYXllZF9ibGtzID09IDApKTsKKwlBU1NFUlQoKG5ld19zaXplICE9IDApIHx8CisJICAgICAgIChmb3JrID09IFhGU19BVFRSX0ZPUkspIHx8CisJICAgICAgIChpcC0+aV9kLmRpX25leHRlbnRzID09IDApKTsKKwl4ZnNfaXRydW5jX3RyYWNlKFhGU19JVFJVTkNfRklOSVNIMiwgaXAsIDAsIG5ld19zaXplLCAwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogeGZzX2lncm93X3N0YXJ0CisgKgorICogRG8gdGhlIGZpcnN0IHBhcnQgb2YgZ3Jvd2luZyBhIGZpbGU6IHplcm8gYW55IGRhdGEgaW4gdGhlIGxhc3QKKyAqIGJsb2NrIHRoYXQgaXMgYmV5b25kIHRoZSBvbGQgRU9GLiAgV2UgbmVlZCB0byBkbyB0aGlzIGJlZm9yZQorICogdGhlIGlub2RlIGlzIGpvaW5lZCB0byB0aGUgdHJhbnNhY3Rpb24gdG8gbW9kaWZ5IHRoZSBpX3NpemUuCisgKiBUaGF0IHdheSB3ZSBjYW4gZHJvcCB0aGUgaW5vZGUgbG9jayBhbmQgY2FsbCBpbnRvIHRoZSBidWZmZXIKKyAqIGNhY2hlIHRvIGdldCB0aGUgYnVmZmVyIG1hcHBpbmcgdGhlIEVPRi4KKyAqLworaW50Cit4ZnNfaWdyb3dfc3RhcnQoCisJeGZzX2lub2RlX3QJKmlwLAorCXhmc19mc2l6ZV90CW5ld19zaXplLAorCWNyZWRfdAkJKmNyZWRwKQoreworCXhmc19mc2l6ZV90CWlzaXplOworCWludAkJZXJyb3I7CisKKwlBU1NFUlQoaXNtcmxvY2tlZCgmKGlwLT5pX2xvY2spLCBNUl9VUERBVEUpICE9IDApOworCUFTU0VSVChpc21ybG9ja2VkKCYoaXAtPmlfaW9sb2NrKSwgTVJfVVBEQVRFKSAhPSAwKTsKKwlBU1NFUlQobmV3X3NpemUgPiBpcC0+aV9kLmRpX3NpemUpOworCisJZXJyb3IgPSAwOworCWlzaXplID0gaXAtPmlfZC5kaV9zaXplOworCS8qCisJICogWmVybyBhbnkgcGFnZXMgdGhhdCBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkKKwkgKiB4ZnNfd3JpdGVfZmlsZSgpIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlCisJICogYW5kIGFueSBibG9ja3MgYmV0d2VlbiB0aGUgb2xkIGFuZCBuZXcgZmlsZSBzaXplcy4KKwkgKi8KKwllcnJvciA9IHhmc196ZXJvX2VvZihYRlNfSVRPVihpcCksICZpcC0+aV9pb2NvcmUsIG5ld19zaXplLCBpc2l6ZSwKKwkJCQluZXdfc2l6ZSk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogeGZzX2lncm93X2ZpbmlzaAorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gZXh0ZW5kIHRoZSBzaXplIG9mIGEgZmlsZS4KKyAqIFRoZSBpbm9kZSBtdXN0IGhhdmUgYm90aCB0aGUgaW9sb2NrIGFuZCB0aGUgaWxvY2sgbG9ja2VkCisgKiBmb3IgdXBkYXRlIGFuZCBpdCBtdXN0IGJlIGEgcGFydCBvZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAqIFRoZSB4ZnNfaWdyb3dfc3RhcnQoKSBmdW5jdGlvbiBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgcHJldmlvdXNseS4KKyAqIElmIHRoZSBjaGFuZ2VfZmxhZyBpcyBub3QgemVybywgdGhlIGlub2RlIGNoYW5nZSB0aW1lc3RhbXAgd2lsbAorICogYmUgdXBkYXRlZC4KKyAqLwordm9pZAoreGZzX2lncm93X2ZpbmlzaCgKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX2lub2RlX3QJKmlwLAorCXhmc19mc2l6ZV90CW5ld19zaXplLAorCWludAkJY2hhbmdlX2ZsYWcpCit7CisJQVNTRVJUKGlzbXJsb2NrZWQoJihpcC0+aV9sb2NrKSwgTVJfVVBEQVRFKSAhPSAwKTsKKwlBU1NFUlQoaXNtcmxvY2tlZCgmKGlwLT5pX2lvbG9jayksIE1SX1VQREFURSkgIT0gMCk7CisJQVNTRVJUKGlwLT5pX3RyYW5zcCA9PSB0cCk7CisJQVNTRVJUKG5ld19zaXplID4gaXAtPmlfZC5kaV9zaXplKTsKKworCS8qCisJICogVXBkYXRlIHRoZSBmaWxlIHNpemUuICBVcGRhdGUgdGhlIGlub2RlIGNoYW5nZSB0aW1lc3RhbXAKKwkgKiBpZiBjaGFuZ2VfZmxhZyBzZXQuCisJICovCisJaXAtPmlfZC5kaV9zaXplID0gbmV3X3NpemU7CisJaWYgKGNoYW5nZV9mbGFnKQorCQl4ZnNfaWNoZ3RpbWUoaXAsIFhGU19JQ0hHVElNRV9DSEcpOworCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKworfQorCisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBpbm9kZSdzIGxpbmsgY291bnQgZ29lcyB0byAwLgorICogV2UgcGxhY2UgdGhlIG9uLWRpc2sgaW5vZGUgb24gYSBsaXN0IGluIHRoZSBBR0kuICBJdAorICogd2lsbCBiZSBwdWxsZWQgZnJvbSB0aGlzIGxpc3Qgd2hlbiB0aGUgaW5vZGUgaXMgZnJlZWQuCisgKi8KK2ludAoreGZzX2l1bmxpbmsoCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19pbm9kZV90CSppcCkKK3sKKwl4ZnNfbW91bnRfdAkqbXA7CisJeGZzX2FnaV90CSphZ2k7CisJeGZzX2Rpbm9kZV90CSpkaXA7CisJeGZzX2J1Zl90CSphZ2licDsKKwl4ZnNfYnVmX3QJKmlicDsKKwl4ZnNfYWdudW1iZXJfdAlhZ25vOworCXhmc19kYWRkcl90CWFnZGFkZHI7CisJeGZzX2FnaW5vX3QJYWdpbm87CisJc2hvcnQJCWJ1Y2tldF9pbmRleDsKKwlpbnQJCW9mZnNldDsKKwlpbnQJCWVycm9yOworCWludAkJYWdpX29rOworCisJQVNTRVJUKGlwLT5pX2QuZGlfbmxpbmsgPT0gMCk7CisJQVNTRVJUKGlwLT5pX2QuZGlfbW9kZSAhPSAwKTsKKwlBU1NFUlQoaXAtPmlfdHJhbnNwID09IHRwKTsKKworCW1wID0gdHAtPnRfbW91bnRwOworCisJYWdubyA9IFhGU19JTk9fVE9fQUdOTyhtcCwgaXAtPmlfaW5vKTsKKwlhZ2RhZGRyID0gWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBYRlNfQUdJX0RBRERSKG1wKSk7CisKKwkvKgorCSAqIEdldCB0aGUgYWdpIGJ1ZmZlciBmaXJzdC4gIEl0IGVuc3VyZXMgbG9jayBvcmRlcmluZworCSAqIG9uIHRoZSBsaXN0LgorCSAqLworCWVycm9yID0geGZzX3RyYW5zX3JlYWRfYnVmKG1wLCB0cCwgbXAtPm1fZGRldl90YXJncCwgYWdkYWRkciwKKwkJCQkgICBYRlNfRlNTX1RPX0JCKG1wLCAxKSwgMCwgJmFnaWJwKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwkvKgorCSAqIFZhbGlkYXRlIHRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIGFnaSBibG9jay4KKwkgKi8KKwlhZ2kgPSBYRlNfQlVGX1RPX0FHSShhZ2licCk7CisJYWdpX29rID0KKwkJSU5UX0dFVChhZ2ktPmFnaV9tYWdpY251bSwgQVJDSF9DT05WRVJUKSA9PSBYRlNfQUdJX01BR0lDICYmCisJCVhGU19BR0lfR09PRF9WRVJTSU9OKElOVF9HRVQoYWdpLT5hZ2lfdmVyc2lvbm51bSwgQVJDSF9DT05WRVJUKSk7CisJaWYgKHVubGlrZWx5KFhGU19URVNUX0VSUk9SKCFhZ2lfb2ssIG1wLCBYRlNfRVJSVEFHX0lVTkxJTkssCisJCQlYRlNfUkFORE9NX0lVTkxJTkspKSkgeworCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2l1bmxpbmsiLCBYRlNfRVJSTEVWRUxfTE9XLCBtcCwgYWdpKTsKKwkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYWdpYnApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCS8qCisJICogR2V0IHRoZSBpbmRleCBpbnRvIHRoZSBhZ2kgaGFzaCB0YWJsZSBmb3IgdGhlCisJICogbGlzdCB0aGlzIGlub2RlIHdpbGwgZ28gb24uCisJICovCisJYWdpbm8gPSBYRlNfSU5PX1RPX0FHSU5PKG1wLCBpcC0+aV9pbm8pOworCUFTU0VSVChhZ2lubyAhPSAwKTsKKwlidWNrZXRfaW5kZXggPSBhZ2lubyAlIFhGU19BR0lfVU5MSU5LRURfQlVDS0VUUzsKKwlBU1NFUlQoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSk7CisJQVNTRVJUKElOVF9HRVQoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSwgQVJDSF9DT05WRVJUKSAhPSBhZ2lubyk7CisKKwlpZiAoSU5UX0dFVChhZ2ktPmFnaV91bmxpbmtlZFtidWNrZXRfaW5kZXhdLCBBUkNIX0NPTlZFUlQpICE9IE5VTExBR0lOTykgeworCQkvKgorCQkgKiBUaGVyZSBpcyBhbHJlYWR5IGFub3RoZXIgaW5vZGUgaW4gdGhlIGJ1Y2tldCB3ZSBuZWVkCisJCSAqIHRvIGFkZCBvdXJzZWx2ZXMgdG8uICBBZGQgdXMgYXQgdGhlIGZyb250IG9mIHRoZSBsaXN0LgorCQkgKiBIZXJlIHdlIHB1dCB0aGUgaGVhZCBwb2ludGVyIGludG8gb3VyIG5leHQgcG9pbnRlciwKKwkJICogYW5kIHRoZW4gd2UgZmFsbCB0aHJvdWdoIHRvIHBvaW50IHRoZSBoZWFkIGF0IHVzLgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfaXRvYnAobXAsIHRwLCBpcCwgJmRpcCwgJmlicCwgMCk7CisJCWlmIChlcnJvcikgeworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCUFTU0VSVChJTlRfR0VUKGRpcC0+ZGlfbmV4dF91bmxpbmtlZCwgQVJDSF9DT05WRVJUKSA9PSBOVUxMQUdJTk8pOworCQlBU1NFUlQoZGlwLT5kaV9uZXh0X3VubGlua2VkKTsKKwkJLyogYm90aCBvbi1kaXNrLCBkb24ndCBlbmRpYW4gZmxpcCB0d2ljZSAqLworCQlkaXAtPmRpX25leHRfdW5saW5rZWQgPSBhZ2ktPmFnaV91bmxpbmtlZFtidWNrZXRfaW5kZXhdOworCQlvZmZzZXQgPSBpcC0+aV9ib2Zmc2V0ICsKKwkJCW9mZnNldG9mKHhmc19kaW5vZGVfdCwgZGlfbmV4dF91bmxpbmtlZCk7CisJCXhmc190cmFuc19pbm9kZV9idWYodHAsIGlicCk7CisJCXhmc190cmFuc19sb2dfYnVmKHRwLCBpYnAsIG9mZnNldCwKKwkJCQkgIChvZmZzZXQgKyBzaXplb2YoeGZzX2FnaW5vX3QpIC0gMSkpOworCQl4ZnNfaW5vYnBfY2hlY2sobXAsIGlicCk7CisJfQorCisJLyoKKwkgKiBQb2ludCB0aGUgYnVja2V0IGhlYWQgcG9pbnRlciBhdCB0aGUgaW5vZGUgYmVpbmcgaW5zZXJ0ZWQuCisJICovCisJQVNTRVJUKGFnaW5vICE9IDApOworCUlOVF9TRVQoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSwgQVJDSF9DT05WRVJULCBhZ2lubyk7CisJb2Zmc2V0ID0gb2Zmc2V0b2YoeGZzX2FnaV90LCBhZ2lfdW5saW5rZWQpICsKKwkJKHNpemVvZih4ZnNfYWdpbm9fdCkgKiBidWNrZXRfaW5kZXgpOworCXhmc190cmFuc19sb2dfYnVmKHRwLCBhZ2licCwgb2Zmc2V0LAorCQkJICAob2Zmc2V0ICsgc2l6ZW9mKHhmc19hZ2lub190KSAtIDEpKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFB1bGwgdGhlIG9uLWRpc2sgaW5vZGUgZnJvbSB0aGUgQUdJIHVubGlua2VkIGxpc3QuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19pdW5saW5rX3JlbW92ZSgKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX2lub2RlX3QJKmlwKQoreworCXhmc19pbm9fdAluZXh0X2lubzsKKwl4ZnNfbW91bnRfdAkqbXA7CisJeGZzX2FnaV90CSphZ2k7CisJeGZzX2Rpbm9kZV90CSpkaXA7CisJeGZzX2J1Zl90CSphZ2licDsKKwl4ZnNfYnVmX3QJKmlicDsKKwl4ZnNfYWdudW1iZXJfdAlhZ25vOworCXhmc19kYWRkcl90CWFnZGFkZHI7CisJeGZzX2FnaW5vX3QJYWdpbm87CisJeGZzX2FnaW5vX3QJbmV4dF9hZ2lubzsKKwl4ZnNfYnVmX3QJKmxhc3RfaWJwOworCXhmc19kaW5vZGVfdAkqbGFzdF9kaXA7CisJc2hvcnQJCWJ1Y2tldF9pbmRleDsKKwlpbnQJCW9mZnNldCwgbGFzdF9vZmZzZXQ7CisJaW50CQllcnJvcjsKKwlpbnQJCWFnaV9vazsKKworCS8qCisJICogRmlyc3QgcHVsbCB0aGUgb24tZGlzayBpbm9kZSBmcm9tIHRoZSBBR0kgdW5saW5rZWQgbGlzdC4KKwkgKi8KKwltcCA9IHRwLT50X21vdW50cDsKKworCWFnbm8gPSBYRlNfSU5PX1RPX0FHTk8obXAsIGlwLT5pX2lubyk7CisJYWdkYWRkciA9IFhGU19BR19EQUREUihtcCwgYWdubywgWEZTX0FHSV9EQUREUihtcCkpOworCisJLyoKKwkgKiBHZXQgdGhlIGFnaSBidWZmZXIgZmlyc3QuICBJdCBlbnN1cmVzIGxvY2sgb3JkZXJpbmcKKwkgKiBvbiB0aGUgbGlzdC4KKwkgKi8KKwllcnJvciA9IHhmc190cmFuc19yZWFkX2J1ZihtcCwgdHAsIG1wLT5tX2RkZXZfdGFyZ3AsIGFnZGFkZHIsCisJCQkJICAgWEZTX0ZTU19UT19CQihtcCwgMSksIDAsICZhZ2licCk7CisJaWYgKGVycm9yKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJCSJ4ZnNfaXVubGlua19yZW1vdmU6IHhmc190cmFuc19yZWFkX2J1ZigpICByZXR1cm5lZCBhbiBlcnJvciAlZCBvbiAlcy4gIFJldHVybmluZyBlcnJvci4iLAorCQkJZXJyb3IsIG1wLT5tX2ZzbmFtZSk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBWYWxpZGF0ZSB0aGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBhZ2kgYmxvY2suCisJICovCisJYWdpID0gWEZTX0JVRl9UT19BR0koYWdpYnApOworCWFnaV9vayA9CisJCUlOVF9HRVQoYWdpLT5hZ2lfbWFnaWNudW0sIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FHSV9NQUdJQyAmJgorCQlYRlNfQUdJX0dPT0RfVkVSU0lPTihJTlRfR0VUKGFnaS0+YWdpX3ZlcnNpb25udW0sIEFSQ0hfQ09OVkVSVCkpOworCWlmICh1bmxpa2VseShYRlNfVEVTVF9FUlJPUighYWdpX29rLCBtcCwgWEZTX0VSUlRBR19JVU5MSU5LX1JFTU9WRSwKKwkJCVhGU19SQU5ET01fSVVOTElOS19SRU1PVkUpKSkgeworCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2l1bmxpbmtfcmVtb3ZlIiwgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkgICAgIG1wLCBhZ2kpOworCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBhZ2licCk7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJCSJ4ZnNfaXVubGlua19yZW1vdmU6IFhGU19URVNUX0VSUk9SKCkgIHJldHVybmVkIGFuIGVycm9yIG9uICVzLiAgUmV0dXJuaW5nIEVGU0NPUlJVUFRFRC4iLAorCQkJIG1wLT5tX2ZzbmFtZSk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisJLyoKKwkgKiBHZXQgdGhlIGluZGV4IGludG8gdGhlIGFnaSBoYXNoIHRhYmxlIGZvciB0aGUKKwkgKiBsaXN0IHRoaXMgaW5vZGUgd2lsbCBnbyBvbi4KKwkgKi8KKwlhZ2lubyA9IFhGU19JTk9fVE9fQUdJTk8obXAsIGlwLT5pX2lubyk7CisJQVNTRVJUKGFnaW5vICE9IDApOworCWJ1Y2tldF9pbmRleCA9IGFnaW5vICUgWEZTX0FHSV9VTkxJTktFRF9CVUNLRVRTOworCUFTU0VSVChJTlRfR0VUKGFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF9pbmRleF0sIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTEFHSU5PKTsKKwlBU1NFUlQoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSk7CisKKwlpZiAoSU5UX0dFVChhZ2ktPmFnaV91bmxpbmtlZFtidWNrZXRfaW5kZXhdLCBBUkNIX0NPTlZFUlQpID09IGFnaW5vKSB7CisJCS8qCisJCSAqIFdlJ3JlIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LiAgR2V0IHRoZSBpbm9kZSdzCisJCSAqIG9uLWRpc2sgYnVmZmVyIHRvIHNlZSBpZiB0aGVyZSBpcyBhbnlvbmUgYWZ0ZXIgdXMKKwkJICogb24gdGhlIGxpc3QuICBPbmx5IG1vZGlmeSBvdXIgbmV4dCBwb2ludGVyIGlmIGl0CisJCSAqIGlzIG5vdCBhbHJlYWR5IE5VTExBR0lOTy4gIFRoaXMgc2F2ZXMgdXMgdGhlIG92ZXJoZWFkCisJCSAqIG9mIGRlYWxpbmcgd2l0aCB0aGUgYnVmZmVyIHdoZW4gdGhlcmUgaXMgbm8gbmVlZCB0bworCQkgKiBjaGFuZ2UgaXQuCisJCSAqLworCQllcnJvciA9IHhmc19pdG9icChtcCwgdHAsIGlwLCAmZGlwLCAmaWJwLCAwKTsKKwkJaWYgKGVycm9yKSB7CisJCQljbW5fZXJyKENFX1dBUk4sCisJCQkJInhmc19pdW5saW5rX3JlbW92ZTogeGZzX2l0b2JwKCkgIHJldHVybmVkIGFuIGVycm9yICVkIG9uICVzLiAgUmV0dXJuaW5nIGVycm9yLiIsCisJCQkJZXJyb3IsIG1wLT5tX2ZzbmFtZSk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJbmV4dF9hZ2lubyA9IElOVF9HRVQoZGlwLT5kaV9uZXh0X3VubGlua2VkLCBBUkNIX0NPTlZFUlQpOworCQlBU1NFUlQobmV4dF9hZ2lubyAhPSAwKTsKKwkJaWYgKG5leHRfYWdpbm8gIT0gTlVMTEFHSU5PKSB7CisJCQlJTlRfU0VUKGRpcC0+ZGlfbmV4dF91bmxpbmtlZCwgQVJDSF9DT05WRVJULCBOVUxMQUdJTk8pOworCQkJb2Zmc2V0ID0gaXAtPmlfYm9mZnNldCArCisJCQkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV90LCBkaV9uZXh0X3VubGlua2VkKTsKKwkJCXhmc190cmFuc19pbm9kZV9idWYodHAsIGlicCk7CisJCQl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgaWJwLCBvZmZzZXQsCisJCQkJCSAgKG9mZnNldCArIHNpemVvZih4ZnNfYWdpbm9fdCkgLSAxKSk7CisJCQl4ZnNfaW5vYnBfY2hlY2sobXAsIGlicCk7CisJCX0gZWxzZSB7CisJCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBpYnApOworCQl9CisJCS8qCisJCSAqIFBvaW50IHRoZSBidWNrZXQgaGVhZCBwb2ludGVyIGF0IHRoZSBuZXh0IGlub2RlLgorCQkgKi8KKwkJQVNTRVJUKG5leHRfYWdpbm8gIT0gMCk7CisJCUFTU0VSVChuZXh0X2FnaW5vICE9IGFnaW5vKTsKKwkJSU5UX1NFVChhZ2ktPmFnaV91bmxpbmtlZFtidWNrZXRfaW5kZXhdLCBBUkNIX0NPTlZFUlQsIG5leHRfYWdpbm8pOworCQlvZmZzZXQgPSBvZmZzZXRvZih4ZnNfYWdpX3QsIGFnaV91bmxpbmtlZCkgKworCQkJKHNpemVvZih4ZnNfYWdpbm9fdCkgKiBidWNrZXRfaW5kZXgpOworCQl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYWdpYnAsIG9mZnNldCwKKwkJCQkgIChvZmZzZXQgKyBzaXplb2YoeGZzX2FnaW5vX3QpIC0gMSkpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFdlIG5lZWQgdG8gc2VhcmNoIHRoZSBsaXN0IGZvciB0aGUgaW5vZGUgYmVpbmcgZnJlZWQuCisJCSAqLworCQluZXh0X2FnaW5vID0gSU5UX0dFVChhZ2ktPmFnaV91bmxpbmtlZFtidWNrZXRfaW5kZXhdLCBBUkNIX0NPTlZFUlQpOworCQlsYXN0X2licCA9IE5VTEw7CisJCXdoaWxlIChuZXh0X2FnaW5vICE9IGFnaW5vKSB7CisJCQkvKgorCQkJICogSWYgdGhlIGxhc3QgaW5vZGUgd2Fzbid0IHRoZSBvbmUgcG9pbnRpbmcgdG8KKwkJCSAqIHVzLCB0aGVuIHJlbGVhc2UgaXRzIGJ1ZmZlciBzaW5jZSB3ZSdyZSBub3QKKwkJCSAqIGdvaW5nIHRvIGRvIGFueXRoaW5nIHdpdGggaXQuCisJCQkgKi8KKwkJCWlmIChsYXN0X2licCAhPSBOVUxMKSB7CisJCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgbGFzdF9pYnApOworCQkJfQorCQkJbmV4dF9pbm8gPSBYRlNfQUdJTk9fVE9fSU5PKG1wLCBhZ25vLCBuZXh0X2FnaW5vKTsKKwkJCWVycm9yID0geGZzX2lub3RvYnAobXAsIHRwLCBuZXh0X2lubywgJmxhc3RfZGlwLAorCQkJCQkgICAgJmxhc3RfaWJwLCAmbGFzdF9vZmZzZXQpOworCQkJaWYgKGVycm9yKSB7CisJCQkJY21uX2VycihDRV9XQVJOLAorCQkJInhmc19pdW5saW5rX3JlbW92ZTogeGZzX2lub3RvYnAoKSAgcmV0dXJuZWQgYW4gZXJyb3IgJWQgb24gJXMuICBSZXR1cm5pbmcgZXJyb3IuIiwKKwkJCQkJZXJyb3IsIG1wLT5tX2ZzbmFtZSk7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQkJbmV4dF9hZ2lubyA9IElOVF9HRVQobGFzdF9kaXAtPmRpX25leHRfdW5saW5rZWQsIEFSQ0hfQ09OVkVSVCk7CisJCQlBU1NFUlQobmV4dF9hZ2lubyAhPSBOVUxMQUdJTk8pOworCQkJQVNTRVJUKG5leHRfYWdpbm8gIT0gMCk7CisJCX0KKwkJLyoKKwkJICogTm93IGxhc3RfaWJwIHBvaW50cyB0byB0aGUgYnVmZmVyIHByZXZpb3VzIHRvIHVzIG9uCisJCSAqIHRoZSB1bmxpbmtlZCBsaXN0LiAgUHVsbCB1cyBmcm9tIHRoZSBsaXN0LgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfaXRvYnAobXAsIHRwLCBpcCwgJmRpcCwgJmlicCwgMCk7CisJCWlmIChlcnJvcikgeworCQkJY21uX2VycihDRV9XQVJOLAorCQkJCSJ4ZnNfaXVubGlua19yZW1vdmU6IHhmc19pdG9icCgpICByZXR1cm5lZCBhbiBlcnJvciAlZCBvbiAlcy4gIFJldHVybmluZyBlcnJvci4iLAorCQkJCWVycm9yLCBtcC0+bV9mc25hbWUpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCW5leHRfYWdpbm8gPSBJTlRfR0VUKGRpcC0+ZGlfbmV4dF91bmxpbmtlZCwgQVJDSF9DT05WRVJUKTsKKwkJQVNTRVJUKG5leHRfYWdpbm8gIT0gMCk7CisJCUFTU0VSVChuZXh0X2FnaW5vICE9IGFnaW5vKTsKKwkJaWYgKG5leHRfYWdpbm8gIT0gTlVMTEFHSU5PKSB7CisJCQlJTlRfU0VUKGRpcC0+ZGlfbmV4dF91bmxpbmtlZCwgQVJDSF9DT05WRVJULCBOVUxMQUdJTk8pOworCQkJb2Zmc2V0ID0gaXAtPmlfYm9mZnNldCArCisJCQkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV90LCBkaV9uZXh0X3VubGlua2VkKTsKKwkJCXhmc190cmFuc19pbm9kZV9idWYodHAsIGlicCk7CisJCQl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgaWJwLCBvZmZzZXQsCisJCQkJCSAgKG9mZnNldCArIHNpemVvZih4ZnNfYWdpbm9fdCkgLSAxKSk7CisJCQl4ZnNfaW5vYnBfY2hlY2sobXAsIGlicCk7CisJCX0gZWxzZSB7CisJCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBpYnApOworCQl9CisJCS8qCisJCSAqIFBvaW50IHRoZSBwcmV2aW91cyBpbm9kZSBvbiB0aGUgbGlzdCB0byB0aGUgbmV4dCBpbm9kZS4KKwkJICovCisJCUlOVF9TRVQobGFzdF9kaXAtPmRpX25leHRfdW5saW5rZWQsIEFSQ0hfQ09OVkVSVCwgbmV4dF9hZ2lubyk7CisJCUFTU0VSVChuZXh0X2FnaW5vICE9IDApOworCQlvZmZzZXQgPSBsYXN0X29mZnNldCArIG9mZnNldG9mKHhmc19kaW5vZGVfdCwgZGlfbmV4dF91bmxpbmtlZCk7CisJCXhmc190cmFuc19pbm9kZV9idWYodHAsIGxhc3RfaWJwKTsKKwkJeGZzX3RyYW5zX2xvZ19idWYodHAsIGxhc3RfaWJwLCBvZmZzZXQsCisJCQkJICAob2Zmc2V0ICsgc2l6ZW9mKHhmc19hZ2lub190KSAtIDEpKTsKKwkJeGZzX2lub2JwX2NoZWNrKG1wLCBsYXN0X2licCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgeGZzX2lub2RlX2NsZWFuKHhmc19pbm9kZV90ICppcCkKK3sKKwlyZXR1cm4gKCgoaXAtPmlfaXRlbXAgPT0gTlVMTCkgfHwKKwkJIShpcC0+aV9pdGVtcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgWEZTX0lMT0dfQUxMKSkgJiYKKwkJKGlwLT5pX3VwZGF0ZV9jb3JlID09IDApKTsKK30KKwordm9pZAoreGZzX2lmcmVlX2NsdXN0ZXIoCisJeGZzX2lub2RlX3QJKmZyZWVfaXAsCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19pbm9fdAlpbnVtKQoreworCXhmc19tb3VudF90CQkqbXAgPSBmcmVlX2lwLT5pX21vdW50OworCWludAkJCWJsa3NfcGVyX2NsdXN0ZXI7CisJaW50CQkJbmJ1ZnM7CisJaW50CQkJbmlub2RlczsKKwlpbnQJCQlpLCBqLCBmb3VuZCwgcHJlX2ZsdXNoZWQ7CisJeGZzX2RhZGRyX3QJCWJsa25vOworCXhmc19idWZfdAkJKmJwOworCXhmc19paGFzaF90CQkqaWg7CisJeGZzX2lub2RlX3QJCSppcCwgKippcF9mb3VuZDsKKwl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwOworCXhmc19sb2dfaXRlbV90CQkqbGlwOworCVNQTERFQ0wocyk7CisKKwlpZiAobXAtPm1fc2Iuc2JfYmxvY2tzaXplID49IFhGU19JTk9ERV9DTFVTVEVSX1NJWkUobXApKSB7CisJCWJsa3NfcGVyX2NsdXN0ZXIgPSAxOworCQluaW5vZGVzID0gbXAtPm1fc2Iuc2JfaW5vcGJsb2NrOworCQluYnVmcyA9IFhGU19JQUxMT0NfQkxPQ0tTKG1wKTsKKwl9IGVsc2UgeworCQlibGtzX3Blcl9jbHVzdGVyID0gWEZTX0lOT0RFX0NMVVNURVJfU0laRShtcCkgLworCQkJCQltcC0+bV9zYi5zYl9ibG9ja3NpemU7CisJCW5pbm9kZXMgPSBibGtzX3Blcl9jbHVzdGVyICogbXAtPm1fc2Iuc2JfaW5vcGJsb2NrOworCQluYnVmcyA9IFhGU19JQUxMT0NfQkxPQ0tTKG1wKSAvIGJsa3NfcGVyX2NsdXN0ZXI7CisJfQorCisJaXBfZm91bmQgPSBrbWVtX2FsbG9jKG5pbm9kZXMgKiBzaXplb2YoeGZzX2lub2RlX3QgKiksIEtNX05PRlMpOworCisJZm9yIChqID0gMDsgaiA8IG5idWZzOyBqKyssIGludW0gKz0gbmlub2RlcykgeworCQlibGtubyA9IFhGU19BR0JfVE9fREFERFIobXAsIFhGU19JTk9fVE9fQUdOTyhtcCwgaW51bSksCisJCQkJCSBYRlNfSU5PX1RPX0FHQk5PKG1wLCBpbnVtKSk7CisKKworCQkvKgorCQkgKiBMb29rIGZvciBlYWNoIGlub2RlIGluIG1lbW9yeSBhbmQgYXR0ZW1wdCB0byBsb2NrIGl0LAorCQkgKiB3ZSBjYW4gYmUgcmFjaW5nIHdpdGggZmx1c2ggYW5kIHRhaWwgcHVzaGluZyBoZXJlLgorCQkgKiBhbnkgaW5vZGUgd2UgZ2V0IHRoZSBsb2NrcyBvbiwgYWRkIHRvIGFuIGFycmF5IG9mCisJCSAqIGlub2RlIGl0ZW1zIHRvIHByb2Nlc3MgbGF0ZXIuCisJCSAqCisJCSAqIFRoZSBnZXQgdGhlIGJ1ZmZlciBsb2NrLCB3ZSBjb3VsZCBiZWF0IGEgZmx1c2gKKwkJICogb3IgdGFpbCBwdXNoaW5nIHRocmVhZCB0byB0aGUgbG9jayBoZXJlLCBpbiB3aGljaAorCQkgKiBjYXNlIHRoZXkgd2lsbCBnbyBsb29raW5nIGZvciB0aGUgaW5vZGUgYnVmZmVyCisJCSAqIGFuZCBmYWlsLCB3ZSBuZWVkIHNvbWUgb3RoZXIgZm9ybSBvZiBpbnRlcmxvY2sKKwkJICogaGVyZS4KKwkJICovCisJCWZvdW5kID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IG5pbm9kZXM7IGkrKykgeworCQkJaWggPSBYRlNfSUhBU0gobXAsIGludW0gKyBpKTsKKwkJCXJlYWRfbG9jaygmaWgtPmloX2xvY2spOworCQkJZm9yIChpcCA9IGloLT5paF9uZXh0OyBpcCAhPSBOVUxMOyBpcCA9IGlwLT5pX25leHQpIHsKKwkJCQlpZiAoaXAtPmlfaW5vID09IGludW0gKyBpKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJLyogSW5vZGUgbm90IGluIG1lbW9yeSBvciB3ZSBmb3VuZCBpdCBhbHJlYWR5LAorCQkJICogbm90aGluZyB0byBkbworCQkJICovCisJCQlpZiAoIWlwIHx8IChpcC0+aV9mbGFncyAmIFhGU19JU1RBTEUpKSB7CisJCQkJcmVhZF91bmxvY2soJmloLT5paF9sb2NrKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHhmc19pbm9kZV9jbGVhbihpcCkpIHsKKwkJCQlyZWFkX3VubG9jaygmaWgtPmloX2xvY2spOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBJZiB3ZSBjYW4gZ2V0IHRoZSBsb2NrcyB0aGVuIGFkZCBpdCB0byB0aGUKKwkJCSAqIGxpc3QsIG90aGVyd2lzZSBieSB0aGUgdGltZSB3ZSBnZXQgdGhlIGJwIGxvY2sKKwkJCSAqIGJlbG93IGl0IHdpbGwgYWxyZWFkeSBiZSBhdHRhY2hlZCB0byB0aGUKKwkJCSAqIGlub2RlIGJ1ZmZlci4KKwkJCSAqLworCisJCQkvKiBUaGlzIGlub2RlIHdpbGwgYWxyZWFkeSBiZSBsb2NrZWQgLSBieSB1cywgbGV0cworCQkJICoga2VlcCBpdCB0aGF0IHdheS4KKwkJCSAqLworCisJCQlpZiAoaXAgPT0gZnJlZV9pcCkgeworCQkJCWlmICh4ZnNfaWZsb2NrX25vd2FpdChpcCkpIHsKKwkJCQkJaXAtPmlfZmxhZ3MgfD0gWEZTX0lTVEFMRTsKKworCQkJCQlpZiAoeGZzX2lub2RlX2NsZWFuKGlwKSkgeworCQkJCQkJeGZzX2lmdW5sb2NrKGlwKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlwX2ZvdW5kW2ZvdW5kKytdID0gaXA7CisJCQkJCX0KKwkJCQl9CisJCQkJcmVhZF91bmxvY2soJmloLT5paF9sb2NrKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHhmc19pbG9ja19ub3dhaXQoaXAsIFhGU19JTE9DS19FWENMKSkgeworCQkJCWlmICh4ZnNfaWZsb2NrX25vd2FpdChpcCkpIHsKKwkJCQkJaXAtPmlfZmxhZ3MgfD0gWEZTX0lTVEFMRTsKKworCQkJCQlpZiAoeGZzX2lub2RlX2NsZWFuKGlwKSkgeworCQkJCQkJeGZzX2lmdW5sb2NrKGlwKTsKKwkJCQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpcF9mb3VuZFtmb3VuZCsrXSA9IGlwOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJCQl9CisJCQl9CisKKwkJCXJlYWRfdW5sb2NrKCZpaC0+aWhfbG9jayk7CisJCX0KKworCQlicCA9IHhmc190cmFuc19nZXRfYnVmKHRwLCBtcC0+bV9kZGV2X3RhcmdwLCBibGtubywgCisJCQkJCW1wLT5tX2JzaXplICogYmxrc19wZXJfY2x1c3RlciwKKwkJCQkJWEZTX0JVRl9MT0NLKTsKKworCQlwcmVfZmx1c2hlZCA9IDA7CisJCWxpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfbG9nX2l0ZW1fdCAqKTsKKwkJd2hpbGUgKGxpcCkgeworCQkJaWYgKGxpcC0+bGlfdHlwZSA9PSBYRlNfTElfSU5PREUpIHsKKwkJCQlpaXAgPSAoeGZzX2lub2RlX2xvZ19pdGVtX3QgKilsaXA7CisJCQkJQVNTRVJUKGlpcC0+aWxpX2xvZ2dlZCA9PSAxKTsKKwkJCQlsaXAtPmxpX2NiID0gKHZvaWQoKikoeGZzX2J1Zl90Kix4ZnNfbG9nX2l0ZW1fdCopKSB4ZnNfaXN0YWxlX2RvbmU7CisJCQkJQUlMX0xPQ0sobXAscyk7CisJCQkJaWlwLT5pbGlfZmx1c2hfbHNuID0gaWlwLT5pbGlfaXRlbS5saV9sc247CisJCQkJQUlMX1VOTE9DSyhtcCwgcyk7CisJCQkJaWlwLT5pbGlfaW5vZGUtPmlfZmxhZ3MgfD0gWEZTX0lTVEFMRTsKKwkJCQlwcmVfZmx1c2hlZCsrOworCQkJfQorCQkJbGlwID0gbGlwLT5saV9iaW9fbGlzdDsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBmb3VuZDsgaSsrKSB7CisJCQlpcCA9IGlwX2ZvdW5kW2ldOworCQkJaWlwID0gaXAtPmlfaXRlbXA7CisKKwkJCWlmICghaWlwKSB7CisJCQkJaXAtPmlfdXBkYXRlX2NvcmUgPSAwOworCQkJCXhmc19pZnVubG9jayhpcCk7CisJCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWlwLT5pbGlfbGFzdF9maWVsZHMgPSBpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkczsKKwkJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzID0gMDsKKwkJCWlpcC0+aWxpX2xvZ2dlZCA9IDE7CisJCQlBSUxfTE9DSyhtcCxzKTsKKwkJCWlpcC0+aWxpX2ZsdXNoX2xzbiA9IGlpcC0+aWxpX2l0ZW0ubGlfbHNuOworCQkJQUlMX1VOTE9DSyhtcCwgcyk7CisKKwkJCXhmc19idWZfYXR0YWNoX2lvZG9uZShicCwKKwkJCQkodm9pZCgqKSh4ZnNfYnVmX3QqLHhmc19sb2dfaXRlbV90KikpCisJCQkJeGZzX2lzdGFsZV9kb25lLCAoeGZzX2xvZ19pdGVtX3QgKilpaXApOworCQkJaWYgKGlwICE9IGZyZWVfaXApIHsKKwkJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJfQorCQl9CisKKwkJaWYgKGZvdW5kIHx8IHByZV9mbHVzaGVkKQorCQkJeGZzX3RyYW5zX3N0YWxlX2lub2RlX2J1Zih0cCwgYnApOworCQl4ZnNfdHJhbnNfYmludmFsKHRwLCBicCk7CisJfQorCisJa21lbV9mcmVlKGlwX2ZvdW5kLCBuaW5vZGVzICogc2l6ZW9mKHhmc19pbm9kZV90ICopKTsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIHJldHVybiBhbiBpbm9kZSB0byB0aGUgaW5vZGUgZnJlZSBsaXN0LgorICogVGhlIGlub2RlIHNob3VsZCBhbHJlYWR5IGJlIHRydW5jYXRlZCB0byAwIGxlbmd0aCBhbmQgaGF2ZQorICogbm8gcGFnZXMgYXNzb2NpYXRlZCB3aXRoIGl0LiAgVGhpcyByb3V0aW5lIGFsc28gYXNzdW1lcyB0aGF0CisgKiB0aGUgaW5vZGUgaXMgYWxyZWFkeSBhIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uLgorICoKKyAqIFRoZSBvbi1kaXNrIGNvcHkgb2YgdGhlIGlub2RlIHdpbGwgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBsaXN0CisgKiBvZiB1bmxpbmtlZCBpbm9kZXMgaW4gdGhlIEFHSS4gV2UgbmVlZCB0byByZW1vdmUgdGhlIGlub2RlIGZyb20KKyAqIHRoYXQgbGlzdCBhdG9taWNhbGx5IHdpdGggcmVzcGVjdCB0byBmcmVlaW5nIGl0IGhlcmUuCisgKi8KK2ludAoreGZzX2lmcmVlKAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfaW5vZGVfdAkqaXAsCisJeGZzX2JtYXBfZnJlZV90CSpmbGlzdCkKK3sKKwlpbnQJCQllcnJvcjsKKwlpbnQJCQlkZWxldGU7CisJeGZzX2lub190CQlmaXJzdF9pbm87CisKKwlBU1NFUlQoaXNtcmxvY2tlZCgmaXAtPmlfbG9jaywgTVJfVVBEQVRFKSk7CisJQVNTRVJUKGlwLT5pX3RyYW5zcCA9PSB0cCk7CisJQVNTRVJUKGlwLT5pX2QuZGlfbmxpbmsgPT0gMCk7CisJQVNTRVJUKGlwLT5pX2QuZGlfbmV4dGVudHMgPT0gMCk7CisJQVNTRVJUKGlwLT5pX2QuZGlfYW5leHRlbnRzID09IDApOworCUFTU0VSVCgoaXAtPmlfZC5kaV9zaXplID09IDApIHx8CisJICAgICAgICgoaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSAhPSBTX0lGUkVHKSk7CisJQVNTRVJUKGlwLT5pX2QuZGlfbmJsb2NrcyA9PSAwKTsKKworCS8qCisJICogUHVsbCB0aGUgb24tZGlzayBpbm9kZSBmcm9tIHRoZSBBR0kgdW5saW5rZWQgbGlzdC4KKwkgKi8KKwllcnJvciA9IHhmc19pdW5saW5rX3JlbW92ZSh0cCwgaXApOworCWlmIChlcnJvciAhPSAwKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwllcnJvciA9IHhmc19kaWZyZWUodHAsIGlwLT5pX2lubywgZmxpc3QsICZkZWxldGUsICZmaXJzdF9pbm8pOworCWlmIChlcnJvciAhPSAwKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJaXAtPmlfZC5kaV9tb2RlID0gMDsJCS8qIG1hcmsgaW5jb3JlIGlub2RlIGFzIGZyZWUgKi8KKwlpcC0+aV9kLmRpX2ZsYWdzID0gMDsKKwlpcC0+aV9kLmRpX2RtZXZtYXNrID0gMDsKKwlpcC0+aV9kLmRpX2ZvcmtvZmYgPSAwOwkJLyogbWFyayB0aGUgYXR0ciBmb3JrIG5vdCBpbiB1c2UgKi8KKwlpcC0+aV9kZi5pZl9leHRfbWF4ID0KKwkJWEZTX0lGT1JLX0RTSVpFKGlwKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJaXAtPmlfZC5kaV9mb3JtYXQgPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTOworCWlwLT5pX2QuZGlfYWZvcm1hdCA9IFhGU19ESU5PREVfRk1UX0VYVEVOVFM7CisJLyoKKwkgKiBCdW1wIHRoZSBnZW5lcmF0aW9uIGNvdW50IHNvIG5vIG9uZSB3aWxsIGJlIGNvbmZ1c2VkCisJICogYnkgcmVpbmNhcm5hdGlvbnMgb2YgdGhpcyBpbm9kZS4KKwkgKi8KKwlpcC0+aV9kLmRpX2dlbisrOworCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKworCWlmIChkZWxldGUpIHsKKwkJeGZzX2lmcmVlX2NsdXN0ZXIoaXAsIHRwLCBmaXJzdF9pbm8pOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogUmVhbGxvY2F0ZSB0aGUgc3BhY2UgZm9yIGlmX2Jyb290IGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgcmVjb3JkcworICogYmVpbmcgYWRkZWQgb3IgZGVsZXRlZCBhcyBpbmRpY2F0ZWQgaW4gcmVjX2RpZmYuICBNb3ZlIHRoZSByZWNvcmRzCisgKiBhbmQgcG9pbnRlcnMgaW4gaWZfYnJvb3QgdG8gZml0IHRoZSBuZXcgc2l6ZS4gIFdoZW4gc2hyaW5raW5nIHRoaXMKKyAqIHdpbGwgZWxpbWluYXRlIGhvbGVzIGJldHdlZW4gdGhlIHJlY29yZHMgYW5kIHBvaW50ZXJzIGNyZWF0ZWQgYnkKKyAqIHRoZSBjYWxsZXIuICBXaGVuIGdyb3dpbmcgdGhpcyB3aWxsIGNyZWF0ZSBob2xlcyB0byBiZSBmaWxsZWQgaW4KKyAqIGJ5IHRoZSBjYWxsZXIuCisgKgorICogVGhlIGNhbGxlciBtdXN0IG5vdCByZXF1ZXN0IHRvIGFkZCBtb3JlIHJlY29yZHMgdGhhbiB3b3VsZCBmaXQgaW4KKyAqIHRoZSBvbi1kaXNrIGlub2RlIHJvb3QuICBJZiB0aGUgaWZfYnJvb3QgaXMgY3VycmVudGx5IE5VTEwsIHRoZW4KKyAqIGlmIHdlIGFkZGluZyByZWNvcmRzIG9uZSB3aWxsIGJlIGFsbG9jYXRlZC4gIFRoZSBjYWxsZXIgbXVzdCBhbHNvCisgKiBub3QgcmVxdWVzdCB0aGF0IHRoZSBudW1iZXIgb2YgcmVjb3JkcyBnbyBiZWxvdyB6ZXJvLCBhbHRob3VnaAorICogaXQgY2FuIGdvIHRvIHplcm8uCisgKgorICogaXAgLS0gdGhlIGlub2RlIHdob3NlIGlmX2Jyb290IGFyZWEgaXMgY2hhbmdpbmcKKyAqIGV4dF9kaWZmIC0tIHRoZSBjaGFuZ2UgaW4gdGhlIG51bWJlciBvZiByZWNvcmRzLCBwb3NpdGl2ZSBvciBuZWdhdGl2ZSwKKyAqCSByZXF1ZXN0ZWQgZm9yIHRoZSBpZl9icm9vdCBhcnJheS4KKyAqLwordm9pZAoreGZzX2lyb290X3JlYWxsb2MoCisJeGZzX2lub2RlX3QJCSppcCwKKwlpbnQJCQlyZWNfZGlmZiwKKwlpbnQJCQl3aGljaGZvcmspCit7CisJaW50CQkJY3VyX21heDsKKwl4ZnNfaWZvcmtfdAkJKmlmcDsKKwl4ZnNfYm1idF9ibG9ja190CSpuZXdfYnJvb3Q7CisJaW50CQkJbmV3X21heDsKKwlzaXplX3QJCQluZXdfc2l6ZTsKKwljaGFyCQkJKm5wOworCWNoYXIJCQkqb3A7CisKKwkvKgorCSAqIEhhbmRsZSB0aGUgZGVnZW5lcmF0ZSBjYXNlIHF1aWV0bHkuCisJICovCisJaWYgKHJlY19kaWZmID09IDApIHsKKwkJcmV0dXJuOworCX0KKworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJaWYgKHJlY19kaWZmID4gMCkgeworCQkvKgorCQkgKiBJZiB0aGVyZSB3YXNuJ3QgYW55IG1lbW9yeSBhbGxvY2F0ZWQgYmVmb3JlLCBqdXN0CisJCSAqIGFsbG9jYXRlIGl0IG5vdyBhbmQgZ2V0IG91dC4KKwkJICovCisJCWlmIChpZnAtPmlmX2Jyb290X2J5dGVzID09IDApIHsKKwkJCW5ld19zaXplID0gKHNpemVfdClYRlNfQk1BUF9CUk9PVF9TUEFDRV9DQUxDKHJlY19kaWZmKTsKKwkJCWlmcC0+aWZfYnJvb3QgPSAoeGZzX2JtYnRfYmxvY2tfdCopa21lbV9hbGxvYyhuZXdfc2l6ZSwKKwkJCQkJCQkJICAgICBLTV9TTEVFUCk7CisJCQlpZnAtPmlmX2Jyb290X2J5dGVzID0gKGludCluZXdfc2l6ZTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qCisJCSAqIElmIHRoZXJlIGlzIGFscmVhZHkgYW4gZXhpc3RpbmcgaWZfYnJvb3QsIHRoZW4gd2UgbmVlZAorCQkgKiB0byByZWFsbG9jKCkgaXQgYW5kIHNoaWZ0IHRoZSBwb2ludGVycyB0byB0aGVpciBuZXcKKwkJICogbG9jYXRpb24uICBUaGUgcmVjb3JkcyBkb24ndCBjaGFuZ2UgbG9jYXRpb24gYmVjYXVzZQorCQkgKiB0aGV5IGFyZSBrZXB0IGJ1dHRlZCB1cCBhZ2FpbnN0IHRoZSBidHJlZSBibG9jayBoZWFkZXIuCisJCSAqLworCQljdXJfbWF4ID0gWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhpZnAtPmlmX2Jyb290X2J5dGVzKTsKKwkJbmV3X21heCA9IGN1cl9tYXggKyByZWNfZGlmZjsKKwkJbmV3X3NpemUgPSAoc2l6ZV90KVhGU19CTUFQX0JST09UX1NQQUNFX0NBTEMobmV3X21heCk7CisJCWlmcC0+aWZfYnJvb3QgPSAoeGZzX2JtYnRfYmxvY2tfdCAqKQorCQkgIGttZW1fcmVhbGxvYyhpZnAtPmlmX2Jyb290LAorCQkJCW5ld19zaXplLAorCQkJCShzaXplX3QpWEZTX0JNQVBfQlJPT1RfU1BBQ0VfQ0FMQyhjdXJfbWF4KSwgLyogb2xkIHNpemUgKi8KKwkJCQlLTV9TTEVFUCk7CisJCW9wID0gKGNoYXIgKilYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihpZnAtPmlmX2Jyb290LCAxLAorCQkJCQkJICAgICAgaWZwLT5pZl9icm9vdF9ieXRlcyk7CisJCW5wID0gKGNoYXIgKilYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihpZnAtPmlmX2Jyb290LCAxLAorCQkJCQkJICAgICAgKGludCluZXdfc2l6ZSk7CisJCWlmcC0+aWZfYnJvb3RfYnl0ZXMgPSAoaW50KW5ld19zaXplOworCQlBU1NFUlQoaWZwLT5pZl9icm9vdF9ieXRlcyA8PQorCQkJWEZTX0lGT1JLX1NJWkUoaXAsIHdoaWNoZm9yaykgKyBYRlNfQlJPT1RfU0laRV9BREopOworCQltZW1tb3ZlKG5wLCBvcCwgY3VyX21heCAqICh1aW50KXNpemVvZih4ZnNfZGZzYm5vX3QpKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogcmVjX2RpZmYgaXMgbGVzcyB0aGFuIDAuICBJbiB0aGlzIGNhc2UsIHdlIGFyZSBzaHJpbmtpbmcgdGhlCisJICogaWZfYnJvb3QgYnVmZmVyLiAgSXQgbXVzdCBhbHJlYWR5IGV4aXN0LiAgSWYgd2UgZ28gdG8gemVybworCSAqIHJlY29yZHMsIGp1c3QgZ2V0IHJpZCBvZiB0aGUgcm9vdCBhbmQgY2xlYXIgdGhlIHN0YXR1cyBiaXQuCisJICovCisJQVNTRVJUKChpZnAtPmlmX2Jyb290ICE9IE5VTEwpICYmIChpZnAtPmlmX2Jyb290X2J5dGVzID4gMCkpOworCWN1cl9tYXggPSBYRlNfQk1BUF9CUk9PVF9NQVhSRUNTKGlmcC0+aWZfYnJvb3RfYnl0ZXMpOworCW5ld19tYXggPSBjdXJfbWF4ICsgcmVjX2RpZmY7CisJQVNTRVJUKG5ld19tYXggPj0gMCk7CisJaWYgKG5ld19tYXggPiAwKQorCQluZXdfc2l6ZSA9IChzaXplX3QpWEZTX0JNQVBfQlJPT1RfU1BBQ0VfQ0FMQyhuZXdfbWF4KTsKKwllbHNlCisJCW5ld19zaXplID0gMDsKKwlpZiAobmV3X3NpemUgPiAwKSB7CisJCW5ld19icm9vdCA9ICh4ZnNfYm1idF9ibG9ja190ICopa21lbV9hbGxvYyhuZXdfc2l6ZSwgS01fU0xFRVApOworCQkvKgorCQkgKiBGaXJzdCBjb3B5IG92ZXIgdGhlIGJ0cmVlIGJsb2NrIGhlYWRlci4KKwkJICovCisJCW1lbWNweShuZXdfYnJvb3QsIGlmcC0+aWZfYnJvb3QsIHNpemVvZih4ZnNfYm1idF9ibG9ja190KSk7CisJfSBlbHNlIHsKKwkJbmV3X2Jyb290ID0gTlVMTDsKKwkJaWZwLT5pZl9mbGFncyAmPSB+WEZTX0lGQlJPT1Q7CisJfQorCisJLyoKKwkgKiBPbmx5IGNvcHkgdGhlIHJlY29yZHMgYW5kIHBvaW50ZXJzIGlmIHRoZXJlIGFyZSBhbnkuCisJICovCisJaWYgKG5ld19tYXggPiAwKSB7CisJCS8qCisJCSAqIEZpcnN0IGNvcHkgdGhlIHJlY29yZHMuCisJCSAqLworCQlvcCA9IChjaGFyICopWEZTX0JNQVBfQlJPT1RfUkVDX0FERFIoaWZwLT5pZl9icm9vdCwgMSwKKwkJCQkJCSAgICAgaWZwLT5pZl9icm9vdF9ieXRlcyk7CisJCW5wID0gKGNoYXIgKilYRlNfQk1BUF9CUk9PVF9SRUNfQUREUihuZXdfYnJvb3QsIDEsCisJCQkJCQkgICAgIChpbnQpbmV3X3NpemUpOworCQltZW1jcHkobnAsIG9wLCBuZXdfbWF4ICogKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KSk7CisKKwkJLyoKKwkJICogVGhlbiBjb3B5IHRoZSBwb2ludGVycy4KKwkJICovCisJCW9wID0gKGNoYXIgKilYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihpZnAtPmlmX2Jyb290LCAxLAorCQkJCQkJICAgICBpZnAtPmlmX2Jyb290X2J5dGVzKTsKKwkJbnAgPSAoY2hhciAqKVhGU19CTUFQX0JST09UX1BUUl9BRERSKG5ld19icm9vdCwgMSwKKwkJCQkJCSAgICAgKGludCluZXdfc2l6ZSk7CisJCW1lbWNweShucCwgb3AsIG5ld19tYXggKiAodWludClzaXplb2YoeGZzX2Rmc2Jub190KSk7CisJfQorCWttZW1fZnJlZShpZnAtPmlmX2Jyb290LCBpZnAtPmlmX2Jyb290X2J5dGVzKTsKKwlpZnAtPmlmX2Jyb290ID0gbmV3X2Jyb290OworCWlmcC0+aWZfYnJvb3RfYnl0ZXMgPSAoaW50KW5ld19zaXplOworCUFTU0VSVChpZnAtPmlmX2Jyb290X2J5dGVzIDw9CisJCVhGU19JRk9SS19TSVpFKGlwLCB3aGljaGZvcmspICsgWEZTX0JST09UX1NJWkVfQURKKTsKKwlyZXR1cm47Cit9CisKKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgZm9yIGlmX2V4dGVudHMKKyAqIGlzIGluY3JlYXNlZCBvciBkZWNyZWFzZWQuICBUaGUgY2hhbmdlIGluIHNpemUgaXMgaW5kaWNhdGVkIGJ5CisgKiB0aGUgbnVtYmVyIG9mIGV4dGVudHMgdGhhdCBuZWVkIHRvIGJlIGFkZGVkIG9yIGRlbGV0ZWQgaW4gdGhlCisgKiBleHRfZGlmZiBwYXJhbWV0ZXIuCisgKgorICogSWYgdGhlIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgaGFzIGRlY3JlYXNlZCBiZWxvdyB0aGUgc2l6ZSBvZiB0aGUKKyAqIGlubGluZSBidWZmZXIsIHRoZW4gc3dpdGNoIHRvIHVzaW5nIHRoZSBpbmxpbmUgYnVmZmVyLiAgT3RoZXJ3aXNlLAorICogdXNlIGttZW1fcmVhbGxvYygpIG9yIGttZW1fYWxsb2MoKSB0byBhZGp1c3QgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcgorICogdG8gd2hhdCBpcyBuZWVkZWQuCisgKgorICogaXAgLS0gdGhlIGlub2RlIHdob3NlIGlmX2V4dGVudHMgYXJlYSBpcyBjaGFuZ2luZworICogZXh0X2RpZmYgLS0gdGhlIGNoYW5nZSBpbiB0aGUgbnVtYmVyIG9mIGV4dGVudHMsIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLAorICoJIHJlcXVlc3RlZCBmb3IgdGhlIGlmX2V4dGVudHMgYXJyYXkuCisgKi8KK3ZvaWQKK3hmc19pZXh0X3JlYWxsb2MoCisJeGZzX2lub2RlX3QJKmlwLAorCWludAkJZXh0X2RpZmYsCisJaW50CQl3aGljaGZvcmspCit7CisJaW50CQlieXRlX2RpZmY7CisJeGZzX2lmb3JrX3QJKmlmcDsKKwlpbnQJCW5ld19zaXplOworCXVpbnQJCXJuZXdfc2l6ZTsKKworCWlmIChleHRfZGlmZiA9PSAwKSB7CisJCXJldHVybjsKKwl9CisKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCWJ5dGVfZGlmZiA9IGV4dF9kaWZmICogKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwluZXdfc2l6ZSA9IChpbnQpaWZwLT5pZl9ieXRlcyArIGJ5dGVfZGlmZjsKKwlBU1NFUlQobmV3X3NpemUgPj0gMCk7CisKKwlpZiAobmV3X3NpemUgPT0gMCkgeworCQlpZiAoaWZwLT5pZl91MS5pZl9leHRlbnRzICE9IGlmcC0+aWZfdTIuaWZfaW5saW5lX2V4dCkgeworCQkJQVNTRVJUKGlmcC0+aWZfcmVhbF9ieXRlcyAhPSAwKTsKKwkJCWttZW1fZnJlZShpZnAtPmlmX3UxLmlmX2V4dGVudHMsIGlmcC0+aWZfcmVhbF9ieXRlcyk7CisJCX0KKwkJaWZwLT5pZl91MS5pZl9leHRlbnRzID0gTlVMTDsKKwkJcm5ld19zaXplID0gMDsKKwl9IGVsc2UgaWYgKG5ld19zaXplIDw9IHNpemVvZihpZnAtPmlmX3UyLmlmX2lubGluZV9leHQpKSB7CisJCS8qCisJCSAqIElmIHRoZSB2YWxpZCBleHRlbnRzIGNhbiBmaXQgaW4gaWZfaW5saW5lX2V4dCwKKwkJICogY29weSB0aGVtIGZyb20gdGhlIG1hbGxvYydkIHZlY3RvciBhbmQgZnJlZSBpdC4KKwkJICovCisJCWlmIChpZnAtPmlmX3UxLmlmX2V4dGVudHMgIT0gaWZwLT5pZl91Mi5pZl9pbmxpbmVfZXh0KSB7CisJCQkvKgorCQkJICogRm9yIG5vdywgZW1wdHkgZmlsZXMgYXJlIGZvcm1hdCBFWFRFTlRTLAorCQkJICogc28gdGhlIGlmX2V4dGVudHMgcG9pbnRlciBpcyBudWxsLgorCQkJICovCisJCQlpZiAoaWZwLT5pZl91MS5pZl9leHRlbnRzKSB7CisJCQkJbWVtY3B5KGlmcC0+aWZfdTIuaWZfaW5saW5lX2V4dCwKKwkJCQkJaWZwLT5pZl91MS5pZl9leHRlbnRzLCBuZXdfc2l6ZSk7CisJCQkJa21lbV9mcmVlKGlmcC0+aWZfdTEuaWZfZXh0ZW50cywKKwkJCQkJICBpZnAtPmlmX3JlYWxfYnl0ZXMpOworCQkJfQorCQkJaWZwLT5pZl91MS5pZl9leHRlbnRzID0gaWZwLT5pZl91Mi5pZl9pbmxpbmVfZXh0OworCQl9CisJCXJuZXdfc2l6ZSA9IDA7CisJfSBlbHNlIHsKKwkJcm5ld19zaXplID0gbmV3X3NpemU7CisJCWlmICgocm5ld19zaXplICYgKHJuZXdfc2l6ZSAtIDEpKSAhPSAwKQorCQkJcm5ld19zaXplID0geGZzX2lyb3VuZHVwKHJuZXdfc2l6ZSk7CisJCS8qCisJCSAqIFN0dWNrIHdpdGggbWFsbG9jL3JlYWxsb2MuCisJCSAqLworCQlpZiAoaWZwLT5pZl91MS5pZl9leHRlbnRzID09IGlmcC0+aWZfdTIuaWZfaW5saW5lX2V4dCkgeworCQkJaWZwLT5pZl91MS5pZl9leHRlbnRzID0gKHhmc19ibWJ0X3JlY190ICopCisJCQkJa21lbV9hbGxvYyhybmV3X3NpemUsIEtNX1NMRUVQKTsKKwkJCW1lbWNweShpZnAtPmlmX3UxLmlmX2V4dGVudHMsIGlmcC0+aWZfdTIuaWZfaW5saW5lX2V4dCwKKwkJCSAgICAgIHNpemVvZihpZnAtPmlmX3UyLmlmX2lubGluZV9leHQpKTsKKwkJfSBlbHNlIGlmIChybmV3X3NpemUgIT0gaWZwLT5pZl9yZWFsX2J5dGVzKSB7CisJCQlpZnAtPmlmX3UxLmlmX2V4dGVudHMgPSAoeGZzX2JtYnRfcmVjX3QgKikKKwkJCSAga21lbV9yZWFsbG9jKGlmcC0+aWZfdTEuaWZfZXh0ZW50cywKKwkJCQkJcm5ld19zaXplLAorCQkJCQlpZnAtPmlmX3JlYWxfYnl0ZXMsCisJCQkJCUtNX05PRlMpOworCQl9CisJfQorCWlmcC0+aWZfcmVhbF9ieXRlcyA9IHJuZXdfc2l6ZTsKKwlpZnAtPmlmX2J5dGVzID0gbmV3X3NpemU7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgZm9yIGlmX2RhdGEKKyAqIGlzIGluY3JlYXNlZCBvciBkZWNyZWFzZWQuICBUaGUgY2hhbmdlIGluIHNpemUgaXMgaW5kaWNhdGVkIGJ5CisgKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbmVlZCB0byBiZSBhZGRlZCBvciBkZWxldGVkIGluIHRoZQorICogYnl0ZV9kaWZmIHBhcmFtZXRlci4KKyAqCisgKiBJZiB0aGUgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCBoYXMgZGVjcmVhc2VkIGJlbG93IHRoZSBzaXplIG9mIHRoZQorICogaW5saW5lIGJ1ZmZlciwgdGhlbiBzd2l0Y2ggdG8gdXNpbmcgdGhlIGlubGluZSBidWZmZXIuICBPdGhlcndpc2UsCisgKiB1c2Uga21lbV9yZWFsbG9jKCkgb3Iga21lbV9hbGxvYygpIHRvIGFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyCisgKiB0byB3aGF0IGlzIG5lZWRlZC4KKyAqCisgKiBpcCAtLSB0aGUgaW5vZGUgd2hvc2UgaWZfZGF0YSBhcmVhIGlzIGNoYW5naW5nCisgKiBieXRlX2RpZmYgLS0gdGhlIGNoYW5nZSBpbiB0aGUgbnVtYmVyIG9mIGJ5dGVzLCBwb3NpdGl2ZSBvciBuZWdhdGl2ZSwKKyAqCSByZXF1ZXN0ZWQgZm9yIHRoZSBpZl9kYXRhIGFycmF5LgorICovCit2b2lkCit4ZnNfaWRhdGFfcmVhbGxvYygKKwl4ZnNfaW5vZGVfdAkqaXAsCisJaW50CQlieXRlX2RpZmYsCisJaW50CQl3aGljaGZvcmspCit7CisJeGZzX2lmb3JrX3QJKmlmcDsKKwlpbnQJCW5ld19zaXplOworCWludAkJcmVhbF9zaXplOworCisJaWYgKGJ5dGVfZGlmZiA9PSAwKSB7CisJCXJldHVybjsKKwl9CisKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCW5ld19zaXplID0gKGludClpZnAtPmlmX2J5dGVzICsgYnl0ZV9kaWZmOworCUFTU0VSVChuZXdfc2l6ZSA+PSAwKTsKKworCWlmIChuZXdfc2l6ZSA9PSAwKSB7CisJCWlmIChpZnAtPmlmX3UxLmlmX2RhdGEgIT0gaWZwLT5pZl91Mi5pZl9pbmxpbmVfZGF0YSkgeworCQkJa21lbV9mcmVlKGlmcC0+aWZfdTEuaWZfZGF0YSwgaWZwLT5pZl9yZWFsX2J5dGVzKTsKKwkJfQorCQlpZnAtPmlmX3UxLmlmX2RhdGEgPSBOVUxMOworCQlyZWFsX3NpemUgPSAwOworCX0gZWxzZSBpZiAobmV3X3NpemUgPD0gc2l6ZW9mKGlmcC0+aWZfdTIuaWZfaW5saW5lX2RhdGEpKSB7CisJCS8qCisJCSAqIElmIHRoZSB2YWxpZCBleHRlbnRzL2RhdGEgY2FuIGZpdCBpbiBpZl9pbmxpbmVfZXh0L2RhdGEsCisJCSAqIGNvcHkgdGhlbSBmcm9tIHRoZSBtYWxsb2MnZCB2ZWN0b3IgYW5kIGZyZWUgaXQuCisJCSAqLworCQlpZiAoaWZwLT5pZl91MS5pZl9kYXRhID09IE5VTEwpIHsKKwkJCWlmcC0+aWZfdTEuaWZfZGF0YSA9IGlmcC0+aWZfdTIuaWZfaW5saW5lX2RhdGE7CisJCX0gZWxzZSBpZiAoaWZwLT5pZl91MS5pZl9kYXRhICE9IGlmcC0+aWZfdTIuaWZfaW5saW5lX2RhdGEpIHsKKwkJCUFTU0VSVChpZnAtPmlmX3JlYWxfYnl0ZXMgIT0gMCk7CisJCQltZW1jcHkoaWZwLT5pZl91Mi5pZl9pbmxpbmVfZGF0YSwgaWZwLT5pZl91MS5pZl9kYXRhLAorCQkJICAgICAgbmV3X3NpemUpOworCQkJa21lbV9mcmVlKGlmcC0+aWZfdTEuaWZfZGF0YSwgaWZwLT5pZl9yZWFsX2J5dGVzKTsKKwkJCWlmcC0+aWZfdTEuaWZfZGF0YSA9IGlmcC0+aWZfdTIuaWZfaW5saW5lX2RhdGE7CisJCX0KKwkJcmVhbF9zaXplID0gMDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTdHVjayB3aXRoIG1hbGxvYy9yZWFsbG9jLgorCQkgKiBGb3IgaW5saW5lIGRhdGEsIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBtdXN0IGJlCisJCSAqIGEgbXVsdGlwbGUgb2YgNCBieXRlcyBpbiBzaXplIHNvIHRoYXQgaXQgY2FuIGJlCisJCSAqIGxvZ2dlZCBhbmQgc3RheSBvbiB3b3JkIGJvdW5kYXJpZXMuICBXZSBlbmZvcmNlCisJCSAqIHRoYXQgaGVyZS4KKwkJICovCisJCXJlYWxfc2l6ZSA9IHJvdW5kdXAobmV3X3NpemUsIDQpOworCQlpZiAoaWZwLT5pZl91MS5pZl9kYXRhID09IE5VTEwpIHsKKwkJCUFTU0VSVChpZnAtPmlmX3JlYWxfYnl0ZXMgPT0gMCk7CisJCQlpZnAtPmlmX3UxLmlmX2RhdGEgPSBrbWVtX2FsbG9jKHJlYWxfc2l6ZSwgS01fU0xFRVApOworCQl9IGVsc2UgaWYgKGlmcC0+aWZfdTEuaWZfZGF0YSAhPSBpZnAtPmlmX3UyLmlmX2lubGluZV9kYXRhKSB7CisJCQkvKgorCQkJICogT25seSBkbyB0aGUgcmVhbGxvYyBpZiB0aGUgdW5kZXJseWluZyBzaXplCisJCQkgKiBpcyByZWFsbHkgY2hhbmdpbmcuCisJCQkgKi8KKwkJCWlmIChpZnAtPmlmX3JlYWxfYnl0ZXMgIT0gcmVhbF9zaXplKSB7CisJCQkJaWZwLT5pZl91MS5pZl9kYXRhID0KKwkJCQkJa21lbV9yZWFsbG9jKGlmcC0+aWZfdTEuaWZfZGF0YSwKKwkJCQkJCQlyZWFsX3NpemUsCisJCQkJCQkJaWZwLT5pZl9yZWFsX2J5dGVzLAorCQkJCQkJCUtNX1NMRUVQKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUFTU0VSVChpZnAtPmlmX3JlYWxfYnl0ZXMgPT0gMCk7CisJCQlpZnAtPmlmX3UxLmlmX2RhdGEgPSBrbWVtX2FsbG9jKHJlYWxfc2l6ZSwgS01fU0xFRVApOworCQkJbWVtY3B5KGlmcC0+aWZfdTEuaWZfZGF0YSwgaWZwLT5pZl91Mi5pZl9pbmxpbmVfZGF0YSwKKwkJCQlpZnAtPmlmX2J5dGVzKTsKKwkJfQorCX0KKwlpZnAtPmlmX3JlYWxfYnl0ZXMgPSByZWFsX3NpemU7CisJaWZwLT5pZl9ieXRlcyA9IG5ld19zaXplOworCUFTU0VSVChpZnAtPmlmX2J5dGVzIDw9IFhGU19JRk9SS19TSVpFKGlwLCB3aGljaGZvcmspKTsKK30KKworCisKKworLyoKKyAqIE1hcCBpbm9kZSB0byBkaXNrIGJsb2NrIGFuZCBvZmZzZXQuCisgKgorICogbXAgLS0gdGhlIG1vdW50IHBvaW50IHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgZmlsZSBzeXN0ZW0KKyAqIHRwIC0tIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uCisgKiBpbm8gLS0gdGhlIGlub2RlIG51bWJlciBvZiB0aGUgaW5vZGUgdG8gYmUgbG9jYXRlZAorICogaW1hcCAtLSB0aGlzIHN0cnVjdHVyZSBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5CisgKgkgdG8gcmV0cmlldmUgdGhlIGdpdmVuIGlub2RlIGZyb20gZGlzaworICogZmxhZ3MgLS0gZmxhZ3MgdG8gcGFzcyB0byB4ZnNfZGlsb2NhdGUgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdAorICoJIGxvb2t1cHMgaW4gdGhlIGlub2RlIGJ0cmVlIHdlcmUgT0sgb3Igbm90CisgKi8KK2ludAoreGZzX2ltYXAoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfaW5vX3QJaW5vLAorCXhmc19pbWFwX3QJKmltYXAsCisJdWludAkJZmxhZ3MpCit7CisJeGZzX2ZzYmxvY2tfdAlmc2JubzsKKwlpbnQJCWxlbjsKKwlpbnQJCW9mZjsKKwlpbnQJCWVycm9yOworCisJZnNibm8gPSBpbWFwLT5pbV9ibGtubyA/CisJCVhGU19EQUREUl9UT19GU0IobXAsIGltYXAtPmltX2Jsa25vKSA6IE5VTExGU0JMT0NLOworCWVycm9yID0geGZzX2RpbG9jYXRlKG1wLCB0cCwgaW5vLCAmZnNibm8sICZsZW4sICZvZmYsIGZsYWdzKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCWltYXAtPmltX2Jsa25vID0gWEZTX0ZTQl9UT19EQUREUihtcCwgZnNibm8pOworCWltYXAtPmltX2xlbiA9IFhGU19GU0JfVE9fQkIobXAsIGxlbik7CisJaW1hcC0+aW1fYWdibGtubyA9IFhGU19GU0JfVE9fQUdCTk8obXAsIGZzYm5vKTsKKwlpbWFwLT5pbV9pb2Zmc2V0ID0gKHVzaG9ydClvZmY7CisJaW1hcC0+aW1fYm9mZnNldCA9ICh1c2hvcnQpKG9mZiA8PCBtcC0+bV9zYi5zYl9pbm9kZWxvZyk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3hmc19pZGVzdHJveV9mb3JrKAorCXhmc19pbm9kZV90CSppcCwKKwlpbnQJCXdoaWNoZm9yaykKK3sKKwl4ZnNfaWZvcmtfdAkqaWZwOworCisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwlpZiAoaWZwLT5pZl9icm9vdCAhPSBOVUxMKSB7CisJCWttZW1fZnJlZShpZnAtPmlmX2Jyb290LCBpZnAtPmlmX2Jyb290X2J5dGVzKTsKKwkJaWZwLT5pZl9icm9vdCA9IE5VTEw7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgZm9ybWF0IGlzIGxvY2FsLCB0aGVuIHdlIGNhbid0IGhhdmUgYW4gZXh0ZW50cworCSAqIGFycmF5IHNvIGp1c3QgbG9vayBmb3IgYW4gaW5saW5lIGRhdGEgYXJyYXkuICBJZiB3ZSdyZQorCSAqIG5vdCBsb2NhbCB0aGVuIHdlIG1heSBvciBtYXkgbm90IGhhdmUgYW4gZXh0ZW50cyBsaXN0LAorCSAqIHNvIGNoZWNrIGFuZCBmcmVlIGl0IHVwIGlmIHdlIGRvLgorCSAqLworCWlmIChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKSB7CisJCWlmICgoaWZwLT5pZl91MS5pZl9kYXRhICE9IGlmcC0+aWZfdTIuaWZfaW5saW5lX2RhdGEpICYmCisJCSAgICAoaWZwLT5pZl91MS5pZl9kYXRhICE9IE5VTEwpKSB7CisJCQlBU1NFUlQoaWZwLT5pZl9yZWFsX2J5dGVzICE9IDApOworCQkJa21lbV9mcmVlKGlmcC0+aWZfdTEuaWZfZGF0YSwgaWZwLT5pZl9yZWFsX2J5dGVzKTsKKwkJCWlmcC0+aWZfdTEuaWZfZGF0YSA9IE5VTEw7CisJCQlpZnAtPmlmX3JlYWxfYnl0ZXMgPSAwOworCQl9CisJfSBlbHNlIGlmICgoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpICYmCisJCSAgIChpZnAtPmlmX3UxLmlmX2V4dGVudHMgIT0gTlVMTCkgJiYKKwkJICAgKGlmcC0+aWZfdTEuaWZfZXh0ZW50cyAhPSBpZnAtPmlmX3UyLmlmX2lubGluZV9leHQpKSB7CisJCUFTU0VSVChpZnAtPmlmX3JlYWxfYnl0ZXMgIT0gMCk7CisJCWttZW1fZnJlZShpZnAtPmlmX3UxLmlmX2V4dGVudHMsIGlmcC0+aWZfcmVhbF9ieXRlcyk7CisJCWlmcC0+aWZfdTEuaWZfZXh0ZW50cyA9IE5VTEw7CisJCWlmcC0+aWZfcmVhbF9ieXRlcyA9IDA7CisJfQorCUFTU0VSVChpZnAtPmlmX3UxLmlmX2V4dGVudHMgPT0gTlVMTCB8fAorCSAgICAgICBpZnAtPmlmX3UxLmlmX2V4dGVudHMgPT0gaWZwLT5pZl91Mi5pZl9pbmxpbmVfZXh0KTsKKwlBU1NFUlQoaWZwLT5pZl9yZWFsX2J5dGVzID09IDApOworCWlmICh3aGljaGZvcmsgPT0gWEZTX0FUVFJfRk9SSykgeworCQlrbWVtX3pvbmVfZnJlZSh4ZnNfaWZvcmtfem9uZSwgaXAtPmlfYWZwKTsKKwkJaXAtPmlfYWZwID0gTlVMTDsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBmcmVlIGFsbCB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBhbiBpbm9kZS4KKyAqIEl0IG11c3QgZnJlZSB0aGUgaW5vZGUgaXRzZWxmIGFuZCBhbnkgYnVmZmVycyBhbGxvY2F0ZWQgZm9yCisgKiBpZl9leHRlbnRzL2lmX2RhdGEgYW5kIGlmX2Jyb290LiAgSXQgbXVzdCBhbHNvIGZyZWUgdGhlIGxvY2sKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5vZGUuCisgKi8KK3ZvaWQKK3hmc19pZGVzdHJveSgKKwl4ZnNfaW5vZGVfdAkqaXApCit7CisKKwlzd2l0Y2ggKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgeworCWNhc2UgU19JRlJFRzoKKwljYXNlIFNfSUZESVI6CisJY2FzZSBTX0lGTE5LOgorCQl4ZnNfaWRlc3Ryb3lfZm9yayhpcCwgWEZTX0RBVEFfRk9SSyk7CisJCWJyZWFrOworCX0KKwlpZiAoaXAtPmlfYWZwKQorCQl4ZnNfaWRlc3Ryb3lfZm9yayhpcCwgWEZTX0FUVFJfRk9SSyk7CisJbXJmcmVlKCZpcC0+aV9sb2NrKTsKKwltcmZyZWUoJmlwLT5pX2lvbG9jayk7CisJZnJlZXNlbWEoJmlwLT5pX2Zsb2NrKTsKKyNpZmRlZiBYRlNfQk1BUF9UUkFDRQorCWt0cmFjZV9mcmVlKGlwLT5pX3h0cmFjZSk7CisjZW5kaWYKKyNpZmRlZiBYRlNfQk1CVF9UUkFDRQorCWt0cmFjZV9mcmVlKGlwLT5pX2J0cmFjZSk7CisjZW5kaWYKKyNpZmRlZiBYRlNfUldfVFJBQ0UKKwlrdHJhY2VfZnJlZShpcC0+aV9yd3RyYWNlKTsKKyNlbmRpZgorI2lmZGVmIFhGU19JTE9DS19UUkFDRQorCWt0cmFjZV9mcmVlKGlwLT5pX2xvY2tfdHJhY2UpOworI2VuZGlmCisjaWZkZWYgWEZTX0RJUjJfVFJBQ0UKKwlrdHJhY2VfZnJlZShpcC0+aV9kaXJfdHJhY2UpOworI2VuZGlmCisJaWYgKGlwLT5pX2l0ZW1wKSB7CisJCS8qIFhYWGRwZCBzaG91bGQgYmUgYWJsZSB0byBhc3NlcnQgdGhpcyBidXQgc2h1dGRvd24KKwkJICogaXMgbGVhdmluZyB0aGUgQUlMIGJlaGluZC4gKi8KKwkJQVNTRVJUKCgoaXAtPmlfaXRlbXAtPmlsaV9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkgPT0gMCkgfHwKKwkJICAgICAgIFhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpKTsKKwkJeGZzX2lub2RlX2l0ZW1fZGVzdHJveShpcCk7CisJfQorCWttZW1fem9uZV9mcmVlKHhmc19pbm9kZV96b25lLCBpcCk7Cit9CisKKworLyoKKyAqIEluY3JlbWVudCB0aGUgcGluIGNvdW50IG9mIHRoZSBnaXZlbiBidWZmZXIuCisgKiBUaGlzIHZhbHVlIGlzIHByb3RlY3RlZCBieSBpcGlubG9jayBzcGlubG9jayBpbiB0aGUgbW91bnQgc3RydWN0dXJlLgorICovCit2b2lkCit4ZnNfaXBpbigKKwl4ZnNfaW5vZGVfdAkqaXApCit7CisJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2xvY2ssIE1SX1VQREFURSkpOworCisJYXRvbWljX2luYygmaXAtPmlfcGluY291bnQpOworfQorCisvKgorICogRGVjcmVtZW50IHRoZSBwaW4gY291bnQgb2YgdGhlIGdpdmVuIGlub2RlLCBhbmQgd2FrZSB1cAorICogYW55b25lIGluIHhmc19pd2FpdF91bnBpbigpIGlmIHRoZSBjb3VudCBnb2VzIHRvIDAuICBUaGUKKyAqIGlub2RlIG11c3QgaGF2ZSBiZWVuIHByZXZpb3Vsc3kgcGlubmVkIHdpdGggYSBjYWxsIHRvIHhmc19pcGluKCkuCisgKi8KK3ZvaWQKK3hmc19pdW5waW4oCisJeGZzX2lub2RlX3QJKmlwKQoreworCUFTU0VSVChhdG9taWNfcmVhZCgmaXAtPmlfcGluY291bnQpID4gMCk7CisKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaXAtPmlfcGluY291bnQpKSB7CisJCXZub2RlX3QJKnZwID0gWEZTX0lUT1ZfTlVMTChpcCk7CisKKwkJLyogbWFrZSBzeW5jIGNvbWUgYmFjayBhbmQgZmx1c2ggdGhpcyBpbm9kZSAqLworCQlpZiAodnApIHsKKwkJCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBMSU5WRlNfR0VUX0lQKHZwKTsKKworCQkJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykpCisJCQkJbWFya19pbm9kZV9kaXJ0eV9zeW5jKGlub2RlKTsKKwkJfQorCisJCXdha2VfdXAoJmlwLT5pX2lwaW5fd2FpdCk7CisJfQorfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gd2FpdCBmb3IgdGhlIGdpdmVuIGlub2RlIHRvIGJlIHVucGlubmVkLgorICogSXQgd2lsbCBzbGVlcCB1bnRpbCB0aGlzIGhhcHBlbnMuICBUaGUgY2FsbGVyIG11c3QgaGF2ZSB0aGUKKyAqIGlub2RlIGxvY2tlZCBpbiBhdCBsZWFzdCBzaGFyZWQgbW9kZSBzbyB0aGF0IHRoZSBidWZmZXIgY2Fubm90CisgKiBiZSBzdWJzZXF1ZW50bHkgcGlubmVkIG9uY2Ugc29tZW9uZSBpcyB3YWl0aW5nIGZvciBpdCB0byBiZQorICogdW5waW5uZWQuCisgKi8KK3ZvaWQKK3hmc19pdW5waW5fd2FpdCgKKwl4ZnNfaW5vZGVfdAkqaXApCit7CisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcDsKKwl4ZnNfbHNuX3QJbHNuOworCisJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2xvY2ssIE1SX1VQREFURSB8IE1SX0FDQ0VTUykpOworCisJaWYgKGF0b21pY19yZWFkKCZpcC0+aV9waW5jb3VudCkgPT0gMCkgeworCQlyZXR1cm47CisJfQorCisJaWlwID0gaXAtPmlfaXRlbXA7CisJaWYgKGlpcCAmJiBpaXAtPmlsaV9sYXN0X2xzbikgeworCQlsc24gPSBpaXAtPmlsaV9sYXN0X2xzbjsKKwl9IGVsc2UgeworCQlsc24gPSAoeGZzX2xzbl90KTA7CisJfQorCisJLyoKKwkgKiBHaXZlIHRoZSBsb2cgYSBwdXNoIHNvIHdlIGRvbid0IHdhaXQgaGVyZSB0b28gbG9uZy4KKwkgKi8KKwl4ZnNfbG9nX2ZvcmNlKGlwLT5pX21vdW50LCBsc24sIFhGU19MT0dfRk9SQ0UpOworCisJd2FpdF9ldmVudChpcC0+aV9pcGluX3dhaXQsIChhdG9taWNfcmVhZCgmaXAtPmlfcGluY291bnQpID09IDApKTsKK30KKworCisvKgorICogeGZzX2lleHRlbnRzX2NvcHkoKQorICoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIGNvcHkgdGhlIFJFQUwgZXh0ZW50cyAoYXMgb3Bwb3NlZCB0byB0aGUgZGVsYXllZAorICogYWxsb2NhdGlvbiBleHRlbnRzKSBmcm9tIHRoZSBpbm9kZSBpbnRvIHRoZSBnaXZlbiBidWZmZXIuICBJdAorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbnRvIHRoZSBidWZmZXIuCisgKgorICogSWYgdGhlcmUgYXJlIG5vIGRlbGF5ZWQgYWxsb2NhdGlvbiBleHRlbnRzLCB0aGVuIHdlIGNhbiBqdXN0CisgKiBtZW1jcHkoKSB0aGUgZXh0ZW50cyBpbnRvIHRoZSBidWZmZXIuICBPdGhlcndpc2UsIHdlIG5lZWQgdG8KKyAqIGV4YW1pbmUgZWFjaCBleHRlbnQgaW4gdHVybiBhbmQgc2tpcCB0aG9zZSB3aGljaCBhcmUgZGVsYXllZC4KKyAqLworaW50Cit4ZnNfaWV4dGVudHNfY29weSgKKwl4ZnNfaW5vZGVfdAkJKmlwLAorCXhmc19ibWJ0X3JlY190CQkqYnVmZmVyLAorCWludAkJCXdoaWNoZm9yaykKK3sKKwlpbnQJCQljb3BpZWQ7CisJeGZzX2JtYnRfcmVjX3QJCSpkZXN0X2VwOworCXhmc19ibWJ0X3JlY190CQkqZXA7CisjaWZkZWYgWEZTX0JNQVBfVFJBQ0UKKwlzdGF0aWMgY2hhcgkJZm5hbWVbXSA9ICJ4ZnNfaWV4dGVudHNfY29weSI7CisjZW5kaWYKKwlpbnQJCQlpOworCXhmc19pZm9ya190CQkqaWZwOworCWludAkJCW5yZWNzOworCXhmc19mc2Jsb2NrX3QJCXN0YXJ0X2Jsb2NrOworCisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwlBU1NFUlQoaXNtcmxvY2tlZCgmaXAtPmlfbG9jaywgTVJfVVBEQVRFfE1SX0FDQ0VTUykpOworCUFTU0VSVChpZnAtPmlmX2J5dGVzID4gMCk7CisKKwlucmVjcyA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCXhmc19ibWFwX3RyYWNlX2V4bGlzdChmbmFtZSwgaXAsIG5yZWNzLCB3aGljaGZvcmspOworCUFTU0VSVChucmVjcyA+IDApOworCisJLyoKKwkgKiBUaGVyZSBhcmUgc29tZSBkZWxheWVkIGFsbG9jYXRpb24gZXh0ZW50cyBpbiB0aGUKKwkgKiBpbm9kZSwgc28gY29weSB0aGUgZXh0ZW50cyBvbmUgYXQgYSB0aW1lIGFuZCBza2lwCisJICogdGhlIGRlbGF5ZWQgb25lcy4gIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lCisJICogbm9uLWRlbGF5ZWQgZXh0ZW50LgorCSAqLworCWVwID0gaWZwLT5pZl91MS5pZl9leHRlbnRzOworCWRlc3RfZXAgPSBidWZmZXI7CisJY29waWVkID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnJlY3M7IGkrKykgeworCQlzdGFydF9ibG9jayA9IHhmc19ibWJ0X2dldF9zdGFydGJsb2NrKGVwKTsKKwkJaWYgKElTTlVMTFNUQVJUQkxPQ0soc3RhcnRfYmxvY2spKSB7CisJCQkvKgorCQkJICogSXQncyBhIGRlbGF5ZWQgYWxsb2NhdGlvbiBleHRlbnQsIHNvIHNraXAgaXQuCisJCQkgKi8KKwkJCWVwKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFRyYW5zbGF0ZSB0byBvbiBkaXNrIGZvcm1hdCAqLworCQlwdXRfdW5hbGlnbmVkKElOVF9HRVQoZXAtPmwwLCBBUkNIX0NPTlZFUlQpLAorCQkJICAgICAgKF9fdWludDY0X3QqKSZkZXN0X2VwLT5sMCk7CisJCXB1dF91bmFsaWduZWQoSU5UX0dFVChlcC0+bDEsIEFSQ0hfQ09OVkVSVCksCisJCQkgICAgICAoX191aW50NjRfdCopJmRlc3RfZXAtPmwxKTsKKwkJZGVzdF9lcCsrOworCQllcCsrOworCQljb3BpZWQrKzsKKwl9CisJQVNTRVJUKGNvcGllZCAhPSAwKTsKKwl4ZnNfdmFsaWRhdGVfZXh0ZW50cyhidWZmZXIsIGNvcGllZCwgMSwgWEZTX0VYVEZNVF9JTk9ERShpcCkpOworCisJcmV0dXJuIChjb3BpZWQgKiAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpKTsKK30KKworLyoKKyAqIEVhY2ggb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBzdG9yZXMgZGF0YSBpbnRvIHRoZSBzYW1lIHJlZ2lvbgorICogb2YgdGhlIG9uLWRpc2sgaW5vZGUsIHNvIG9ubHkgb25lIG9mIHRoZW0gY2FuIGJlIHZhbGlkIGF0CisgKiBhbnkgZ2l2ZW4gdGltZS4gV2hpbGUgaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBjb25mbGljdGluZyBmb3JtYXRzCisgKiBhbmQgbG9nIGZsYWdzLCBlLmcuIGhhdmluZyBYRlNfSUxPR18/REFUQSBzZXQgd2hlbiB0aGUgZm9yayBpcworICogaW4gRVhURU5UUyBmb3JtYXQsIHRoaXMgY2FuIG9ubHkgaGFwcGVuIHdoZW4gdGhlIGZvcmsgaGFzCisgKiBjaGFuZ2VkIGZvcm1hdHMgYWZ0ZXIgYmVpbmcgbW9kaWZpZWQgYnV0IGJlZm9yZSBiZWluZyBmbHVzaGVkLgorICogSW4gdGhlc2UgY2FzZXMsIHRoZSBmb3JtYXQgYWx3YXlzIHRha2VzIHByZWNlZGVuY2UsIGJlY2F1c2UgdGhlCisgKiBmb3JtYXQgaW5kaWNhdGVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBmb3JrLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyBpbnQKK3hmc19pZmx1c2hfZm9yaygKKwl4ZnNfaW5vZGVfdAkJKmlwLAorCXhmc19kaW5vZGVfdAkJKmRpcCwKKwl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwLAorCWludAkJCXdoaWNoZm9yaywKKwl4ZnNfYnVmX3QJCSpicCkKK3sKKwljaGFyCQkJKmNwOworCXhmc19pZm9ya190CQkqaWZwOworCXhmc19tb3VudF90CQkqbXA7CisjaWZkZWYgWEZTX1RSQU5TX0RFQlVHCisJaW50CQkJZmlyc3Q7CisjZW5kaWYKKwlzdGF0aWMgY29uc3Qgc2hvcnQJYnJvb3RmbGFnWzJdID0KKwkJeyBYRlNfSUxPR19EQlJPT1QsIFhGU19JTE9HX0FCUk9PVCB9OworCXN0YXRpYyBjb25zdCBzaG9ydAlkYXRhZmxhZ1syXSA9CisJCXsgWEZTX0lMT0dfRERBVEEsIFhGU19JTE9HX0FEQVRBIH07CisJc3RhdGljIGNvbnN0IHNob3J0CWV4dGZsYWdbMl0gPQorCQl7IFhGU19JTE9HX0RFWFQsIFhGU19JTE9HX0FFWFQgfTsKKworCWlmIChpaXAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwkvKgorCSAqIFRoaXMgY2FuIGhhcHBlbiBpZiB3ZSBnYXZlIHVwIGluIGlmb3JtYXQgaW4gYW4gZXJyb3IgcGF0aCwKKwkgKiBmb3IgdGhlIGF0dHJpYnV0ZSBmb3JrLgorCSAqLworCWlmIChpZnAgPT0gTlVMTCkgeworCQlBU1NFUlQod2hpY2hmb3JrID09IFhGU19BVFRSX0ZPUkspOworCQlyZXR1cm4gMDsKKwl9CisJY3AgPSBYRlNfREZPUktfUFRSKGRpcCwgd2hpY2hmb3JrKTsKKwltcCA9IGlwLT5pX21vdW50OworCXN3aXRjaCAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSkgeworCWNhc2UgWEZTX0RJTk9ERV9GTVRfTE9DQUw6CisJCWlmICgoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJiBkYXRhZmxhZ1t3aGljaGZvcmtdKSAmJgorCQkgICAgKGlmcC0+aWZfYnl0ZXMgPiAwKSkgeworCQkJQVNTRVJUKGlmcC0+aWZfdTEuaWZfZGF0YSAhPSBOVUxMKTsKKwkJCUFTU0VSVChpZnAtPmlmX2J5dGVzIDw9IFhGU19JRk9SS19TSVpFKGlwLCB3aGljaGZvcmspKTsKKwkJCW1lbWNweShjcCwgaWZwLT5pZl91MS5pZl9kYXRhLCBpZnAtPmlmX2J5dGVzKTsKKwkJfQorCQlpZiAod2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUkspIHsKKwkJCWlmICh1bmxpa2VseShYRlNfRElSX1NIT1JURk9STV9WQUxJREFURV9PTkRJU0sobXAsIGRpcCkpKSB7CisJCQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2lmbHVzaF9mb3JrIiwKKwkJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTOgorCQlBU1NFUlQoKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSB8fAorCQkgICAgICAgIShpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIGV4dGZsYWdbd2hpY2hmb3JrXSkpOworCQlBU1NFUlQoKGlmcC0+aWZfdTEuaWZfZXh0ZW50cyAhPSBOVUxMKSB8fCAoaWZwLT5pZl9ieXRlcyA9PSAwKSk7CisJCUFTU0VSVCgoaWZwLT5pZl91MS5pZl9leHRlbnRzID09IE5VTEwpIHx8IChpZnAtPmlmX2J5dGVzID4gMCkpOworCQlpZiAoKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgZXh0ZmxhZ1t3aGljaGZvcmtdKSAmJgorCQkgICAgKGlmcC0+aWZfYnl0ZXMgPiAwKSkgeworCQkJQVNTRVJUKFhGU19JRk9SS19ORVhURU5UUyhpcCwgd2hpY2hmb3JrKSA+IDApOworCQkJKHZvaWQpeGZzX2lleHRlbnRzX2NvcHkoaXAsICh4ZnNfYm1idF9yZWNfdCAqKWNwLAorCQkJCXdoaWNoZm9yayk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFhGU19ESU5PREVfRk1UX0JUUkVFOgorCQlpZiAoKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgYnJvb3RmbGFnW3doaWNoZm9ya10pICYmCisJCSAgICAoaWZwLT5pZl9icm9vdF9ieXRlcyA+IDApKSB7CisJCQlBU1NFUlQoaWZwLT5pZl9icm9vdCAhPSBOVUxMKTsKKwkJCUFTU0VSVChpZnAtPmlmX2Jyb290X2J5dGVzIDw9CisJCQkgICAgICAgKFhGU19JRk9SS19TSVpFKGlwLCB3aGljaGZvcmspICsKKwkJCQlYRlNfQlJPT1RfU0laRV9BREopKTsKKwkJCXhmc19ibWJ0X3RvX2JtZHIoaWZwLT5pZl9icm9vdCwgaWZwLT5pZl9icm9vdF9ieXRlcywKKwkJCQkoeGZzX2JtZHJfYmxvY2tfdCAqKWNwLAorCQkJCVhGU19ERk9SS19TSVpFKGRpcCwgbXAsIHdoaWNoZm9yaykpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBYRlNfRElOT0RFX0ZNVF9ERVY6CisJCWlmIChpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX0RFVikgeworCQkJQVNTRVJUKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKTsKKwkJCUlOVF9TRVQoZGlwLT5kaV91LmRpX2RldiwgQVJDSF9DT05WRVJULCBpcC0+aV9kZi5pZl91Mi5pZl9yZGV2KTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgWEZTX0RJTk9ERV9GTVRfVVVJRDoKKwkJaWYgKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgWEZTX0lMT0dfVVVJRCkgeworCQkJQVNTRVJUKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKTsKKwkJCW1lbWNweSgmZGlwLT5kaV91LmRpX211dWlkLCAmaXAtPmlfZGYuaWZfdTIuaWZfdXVpZCwKKwkJCQlzaXplb2YodXVpZF90KSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogeGZzX2lmbHVzaCgpIHdpbGwgd3JpdGUgYSBtb2RpZmllZCBpbm9kZSdzIGNoYW5nZXMgb3V0IHRvIHRoZQorICogaW5vZGUncyBvbiBkaXNrIGhvbWUuICBUaGUgY2FsbGVyIG11c3QgaGF2ZSB0aGUgaW5vZGUgbG9jayBoZWxkCisgKiBpbiBhdCBsZWFzdCBzaGFyZWQgbW9kZSBhbmQgdGhlIGlub2RlIGZsdXNoIHNlbWFwaG9yZSBtdXN0IGJlCisgKiBoZWxkIGFzIHdlbGwuICBUaGUgaW5vZGUgbG9jayB3aWxsIHN0aWxsIGJlIGhlbGQgdXBvbiByZXR1cm4gZnJvbQorICogdGhlIGNhbGwgYW5kIHRoZSBjYWxsZXIgaXMgZnJlZSB0byB1bmxvY2sgaXQuCisgKiBUaGUgaW5vZGUgZmx1c2ggbG9jayB3aWxsIGJlIHVubG9ja2VkIHdoZW4gdGhlIGlub2RlIHJlYWNoZXMgdGhlIGRpc2suCisgKiBUaGUgZmxhZ3MgaW5kaWNhdGUgaG93IHRoZSBpbm9kZSdzIGJ1ZmZlciBzaG91bGQgYmUgd3JpdHRlbiBvdXQuCisgKi8KK2ludAoreGZzX2lmbHVzaCgKKwl4ZnNfaW5vZGVfdAkJKmlwLAorCXVpbnQJCQlmbGFncykKK3sKKwl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwOworCXhmc19idWZfdAkJKmJwOworCXhmc19kaW5vZGVfdAkJKmRpcDsKKwl4ZnNfbW91bnRfdAkJKm1wOworCWludAkJCWVycm9yOworCS8qIFJFRkVSRU5DRUQgKi8KKwl4ZnNfY2hhc2hfdAkJKmNoOworCXhmc19pbm9kZV90CQkqaXE7CisJaW50CQkJY2xjb3VudDsJLyogY291bnQgb2YgaW5vZGVzIGNsdXN0ZXJlZCAqLworCWludAkJCWJ1Zndhc2RlbHdyaTsKKwllbnVtIHsgSU5UX0RFTFdSSSA9ICgxIDw8IDApLCBJTlRfQVNZTkMgPSAoMSA8PCAxKSB9OworCVNQTERFQ0wocyk7CisKKwlYRlNfU1RBVFNfSU5DKHhzX2lmbHVzaF9jb3VudCk7CisKKwlBU1NFUlQoaXNtcmxvY2tlZCgmaXAtPmlfbG9jaywgTVJfVVBEQVRFfE1SX0FDQ0VTUykpOworCUFTU0VSVCh2YWx1c2VtYSgmaXAtPmlfZmxvY2spIDw9IDApOworCUFTU0VSVChpcC0+aV9kLmRpX2Zvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSB8fAorCSAgICAgICBpcC0+aV9kLmRpX25leHRlbnRzID4gaXAtPmlfZGYuaWZfZXh0X21heCk7CisKKwlpaXAgPSBpcC0+aV9pdGVtcDsKKwltcCA9IGlwLT5pX21vdW50OworCisJLyoKKwkgKiBJZiB0aGUgaW5vZGUgaXNuJ3QgZGlydHksIHRoZW4ganVzdCByZWxlYXNlIHRoZSBpbm9kZQorCSAqIGZsdXNoIGxvY2sgYW5kIGRvIG5vdGhpbmcuCisJICovCisJaWYgKChpcC0+aV91cGRhdGVfY29yZSA9PSAwKSAmJgorCSAgICAoKGlpcCA9PSBOVUxMKSB8fCAhKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgWEZTX0lMT0dfQUxMKSkpIHsKKwkJQVNTRVJUKChpaXAgIT0gTlVMTCkgPworCQkJICEoaWlwLT5pbGlfaXRlbS5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpIDogMSk7CisJCXhmc19pZnVubG9jayhpcCk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogV2UgY2FuJ3QgZmx1c2ggdGhlIGlub2RlIHVudGlsIGl0IGlzIHVucGlubmVkLCBzbworCSAqIHdhaXQgZm9yIGl0LiAgV2Uga25vdyBub29uZSBuZXcgY2FuIHBpbiBpdCwgYmVjYXVzZQorCSAqIHdlIGFyZSBob2xkaW5nIHRoZSBpbm9kZSBsb2NrIHNoYXJlZCBhbmQgeW91IG5lZWQKKwkgKiB0byBob2xkIGl0IGV4Y2x1c2l2ZWx5IHRvIHBpbiB0aGUgaW5vZGUuCisJICovCisJeGZzX2l1bnBpbl93YWl0KGlwKTsKKworCS8qCisJICogVGhpcyBtYXkgaGF2ZSBiZWVuIHVucGlubmVkIGJlY2F1c2UgdGhlIGZpbGVzeXN0ZW0gaXMgc2h1dHRpbmcKKwkgKiBkb3duIGZvcmNpYmx5LiBJZiB0aGF0J3MgdGhlIGNhc2Ugd2UgbXVzdCBub3Qgd3JpdGUgdGhpcyBpbm9kZQorCSAqIHRvIGRpc2ssIGJlY2F1c2UgdGhlIGxvZyByZWNvcmQgZGlkbid0IG1ha2UgaXQgdG8gZGlzayEKKwkgKi8KKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKKwkJaXAtPmlfdXBkYXRlX2NvcmUgPSAwOworCQlpZiAoaWlwKQorCQkJaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgPSAwOworCQl4ZnNfaWZ1bmxvY2soaXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBvbi1kaXNrIGlub2RlLgorCSAqLworCWVycm9yID0geGZzX2l0b2JwKG1wLCBOVUxMLCBpcCwgJmRpcCwgJmJwLCAwKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQl4ZnNfaWZ1bmxvY2soaXApOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyoKKwkgKiBEZWNpZGUgaG93IGJ1ZmZlciB3aWxsIGJlIGZsdXNoZWQgb3V0LiAgVGhpcyBpcyBkb25lIGJlZm9yZQorCSAqIHRoZSBjYWxsIHRvIHhmc19pZmx1c2hfaW50IGJlY2F1c2UgdGhpcyBmaWVsZCBpcyB6ZXJvZWQgYnkgaXQuCisJICovCisJaWYgKGlpcCAhPSBOVUxMICYmIGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICE9IDApIHsKKwkJLyoKKwkJICogRmx1c2ggb3V0IHRoZSBpbm9kZSBidWZmZXIgYWNjb3JkaW5nIHRvIHRoZSBkaXJlY3Rpb25zCisJCSAqIG9mIHRoZSBjYWxsZXIuICBJbiB0aGUgY2FzZXMgd2hlcmUgdGhlIGNhbGxlciBoYXMgZ2l2ZW4KKwkJICogdXMgYSBjaG9pY2UgY2hvb3NlIHRoZSBub24tZGVsd3JpIGNhc2UuICBUaGlzIGlzIGJlY2F1c2UKKwkJICogdGhlIGlub2RlIGlzIGluIHRoZSBBSUwgYW5kIHdlIG5lZWQgdG8gZ2V0IGl0IG91dCBzb29uLgorCQkgKi8KKwkJc3dpdGNoIChmbGFncykgeworCQljYXNlIFhGU19JRkxVU0hfU1lOQzoKKwkJY2FzZSBYRlNfSUZMVVNIX0RFTFdSSV9FTFNFX1NZTkM6CisJCQlmbGFncyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBYRlNfSUZMVVNIX0FTWU5DOgorCQljYXNlIFhGU19JRkxVU0hfREVMV1JJX0VMU0VfQVNZTkM6CisJCQlmbGFncyA9IElOVF9BU1lOQzsKKwkJCWJyZWFrOworCQljYXNlIFhGU19JRkxVU0hfREVMV1JJOgorCQkJZmxhZ3MgPSBJTlRfREVMV1JJOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBU1NFUlQoMCk7CisJCQlmbGFncyA9IDA7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoZmxhZ3MpIHsKKwkJY2FzZSBYRlNfSUZMVVNIX0RFTFdSSV9FTFNFX1NZTkM6CisJCWNhc2UgWEZTX0lGTFVTSF9ERUxXUklfRUxTRV9BU1lOQzoKKwkJY2FzZSBYRlNfSUZMVVNIX0RFTFdSSToKKwkJCWZsYWdzID0gSU5UX0RFTFdSSTsKKwkJCWJyZWFrOworCQljYXNlIFhGU19JRkxVU0hfQVNZTkM6CisJCQlmbGFncyA9IElOVF9BU1lOQzsKKwkJCWJyZWFrOworCQljYXNlIFhGU19JRkxVU0hfU1lOQzoKKwkJCWZsYWdzID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKDApOworCQkJZmxhZ3MgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIEZpcnN0IGZsdXNoIG91dCB0aGUgaW5vZGUgdGhhdCB4ZnNfaWZsdXNoIHdhcyBjYWxsZWQgd2l0aC4KKwkgKi8KKwllcnJvciA9IHhmc19pZmx1c2hfaW50KGlwLCBicCk7CisJaWYgKGVycm9yKSB7CisJCWdvdG8gY29ycnVwdF9vdXQ7CisJfQorCisJLyoKKwkgKiBpbm9kZSBjbHVzdGVyaW5nOgorCSAqIHNlZSBpZiBvdGhlciBpbm9kZXMgY2FuIGJlIGdhdGhlcmVkIGludG8gdGhpcyB3cml0ZQorCSAqLworCisJaXAtPmlfY2hhc2gtPmNobF9idWYgPSBicDsKKworCWNoID0gWEZTX0NIQVNIKG1wLCBpcC0+aV9ibGtubyk7CisJcyA9IG11dGV4X3NwaW5sb2NrKCZjaC0+Y2hfbG9jayk7CisKKwljbGNvdW50ID0gMDsKKwlmb3IgKGlxID0gaXAtPmlfY25leHQ7IGlxICE9IGlwOyBpcSA9IGlxLT5pX2NuZXh0KSB7CisJCS8qCisJCSAqIERvIGFuIHVuLXByb3RlY3RlZCBjaGVjayB0byBzZWUgaWYgdGhlIGlub2RlIGlzIGRpcnR5IGFuZAorCQkgKiBpcyBhIGNhbmRpZGF0ZSBmb3IgZmx1c2hpbmcuICBUaGVzZSBjaGVja3Mgd2lsbCBiZSByZXBlYXRlZAorCQkgKiBsYXRlciBhZnRlciB0aGUgYXBwcm9wcmlhdGUgbG9ja3MgYXJlIGFjcXVpcmVkLgorCQkgKi8KKwkJaWlwID0gaXEtPmlfaXRlbXA7CisJCWlmICgoaXEtPmlfdXBkYXRlX2NvcmUgPT0gMCkgJiYKKwkJICAgICgoaWlwID09IE5VTEwpIHx8CisJCSAgICAgIShpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX0FMTCkpICYmCisJCSAgICAgIHhmc19pcGluY291bnQoaXEpID09IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogVHJ5IHRvIGdldCBsb2Nrcy4gIElmIGFueSBhcmUgdW5hdmFpbGFibGUsCisJCSAqIHRoZW4gdGhpcyBpbm9kZSBjYW5ub3QgYmUgZmx1c2hlZCBhbmQgaXMgc2tpcHBlZC4KKwkJICovCisKKwkJLyogZ2V0IGlub2RlIGxvY2tzIChqdXN0IGlfbG9jaykgKi8KKwkJaWYgKHhmc19pbG9ja19ub3dhaXQoaXEsIFhGU19JTE9DS19TSEFSRUQpKSB7CisJCQkvKiBnZXQgaW5vZGUgZmx1c2ggbG9jayAqLworCQkJaWYgKHhmc19pZmxvY2tfbm93YWl0KGlxKSkgeworCQkJCS8qIGNoZWNrIGlmIHBpbm5lZCAqLworCQkJCWlmICh4ZnNfaXBpbmNvdW50KGlxKSA9PSAwKSB7CisJCQkJCS8qIGFycml2aW5nIGhlcmUgbWVhbnMgdGhhdAorCQkJCQkgKiB0aGlzIGlub2RlIGNhbiBiZSBmbHVzaGVkLgorCQkJCQkgKiBmaXJzdCByZS1jaGVjayB0aGF0IGl0J3MKKwkJCQkJICogZGlydHkKKwkJCQkJICovCisJCQkJCWlpcCA9IGlxLT5pX2l0ZW1wOworCQkJCQlpZiAoKGlxLT5pX3VwZGF0ZV9jb3JlICE9IDApfHwKKwkJCQkJICAgICgoaWlwICE9IE5VTEwpICYmCisJCQkJCSAgICAgKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgWEZTX0lMT0dfQUxMKSkpIHsKKwkJCQkJCWNsY291bnQrKzsKKwkJCQkJCWVycm9yID0geGZzX2lmbHVzaF9pbnQoaXEsIGJwKTsKKwkJCQkJCWlmIChlcnJvcikgeworCQkJCQkJCXhmc19pdW5sb2NrKGlxLAorCQkJCQkJCQkgICAgWEZTX0lMT0NLX1NIQVJFRCk7CisJCQkJCQkJZ290byBjbHVzdGVyX2NvcnJ1cHRfb3V0OworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJeGZzX2lmdW5sb2NrKGlxKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXhmc19pZnVubG9jayhpcSk7CisJCQkJfQorCQkJfQorCQkJeGZzX2l1bmxvY2soaXEsIFhGU19JTE9DS19TSEFSRUQpOworCQl9CisJfQorCW11dGV4X3NwaW51bmxvY2soJmNoLT5jaF9sb2NrLCBzKTsKKworCWlmIChjbGNvdW50KSB7CisJCVhGU19TVEFUU19JTkMoeHNfaWNsdXN0ZXJfZmx1c2hjbnQpOworCQlYRlNfU1RBVFNfQUREKHhzX2ljbHVzdGVyX2ZsdXNoaW5vZGUsIGNsY291bnQpOworCX0KKworCS8qCisJICogSWYgdGhlIGJ1ZmZlciBpcyBwaW5uZWQgdGhlbiBwdXNoIG9uIHRoZSBsb2cgc28gd2Ugd29uJ3QKKwkgKiBnZXQgc3R1Y2sgd2FpdGluZyBpbiB0aGUgd3JpdGUgZm9yIHRvbyBsb25nLgorCSAqLworCWlmIChYRlNfQlVGX0lTUElOTkVEKGJwKSl7CisJCXhmc19sb2dfZm9yY2UobXAsICh4ZnNfbHNuX3QpMCwgWEZTX0xPR19GT1JDRSk7CisJfQorCisJaWYgKGZsYWdzICYgSU5UX0RFTFdSSSkgeworCQl4ZnNfYmR3cml0ZShtcCwgYnApOworCX0gZWxzZSBpZiAoZmxhZ3MgJiBJTlRfQVNZTkMpIHsKKwkJeGZzX2Jhd3JpdGUobXAsIGJwKTsKKwl9IGVsc2UgeworCQllcnJvciA9IHhmc19id3JpdGUobXAsIGJwKTsKKwl9CisJcmV0dXJuIGVycm9yOworCitjb3JydXB0X291dDoKKwl4ZnNfYnVmX3JlbHNlKGJwKTsKKwl4ZnNfZm9yY2Vfc2h1dGRvd24obXAsIFhGU19DT1JSVVBUX0lOQ09SRSk7CisJeGZzX2lmbHVzaF9hYm9ydChpcCk7CisJLyoKKwkgKiBVbmxvY2tzIHRoZSBmbHVzaCBsb2NrCisJICovCisJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCitjbHVzdGVyX2NvcnJ1cHRfb3V0OgorCS8qIENvcnJ1cHRpb24gZGV0ZWN0ZWQgaW4gdGhlIGNsdXN0ZXJpbmcgbG9vcC4gIEludmFsaWRhdGUgdGhlCisJICogaW5vZGUgYnVmZmVyIGFuZCBzaHV0IGRvd24gdGhlIGZpbGVzeXN0ZW0uCisJICovCisJbXV0ZXhfc3BpbnVubG9jaygmY2gtPmNoX2xvY2ssIHMpOworCisJLyoKKwkgKiBDbGVhbiB1cCB0aGUgYnVmZmVyLiAgSWYgaXQgd2FzIEJfREVMV1JJLCBqdXN0IHJlbGVhc2UgaXQgLS0KKwkgKiBicmVsc2UgY2FuIGhhbmRsZSBpdCB3aXRoIG5vIHByb2JsZW1zLiAgSWYgbm90LCBzaHV0IGRvd24gdGhlCisJICogZmlsZXN5c3RlbSBiZWZvcmUgcmVsZWFzaW5nIHRoZSBidWZmZXIuCisJICovCisJaWYgKChidWZ3YXNkZWx3cmk9IFhGU19CVUZfSVNERUxBWVdSSVRFKGJwKSkpIHsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJfQorCisJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBYRlNfQ09SUlVQVF9JTkNPUkUpOworCisJaWYoIWJ1Zndhc2RlbHdyaSkgIHsKKwkJLyoKKwkJICogSnVzdCBsaWtlIGluY29yZV9yZWxzZTogaWYgd2UgaGF2ZSBiX2lvZG9uZSBmdW5jdGlvbnMsCisJCSAqIG1hcmsgdGhlIGJ1ZmZlciBhcyBhbiBlcnJvciBhbmQgY2FsbCB0aGVtLiAgT3RoZXJ3aXNlCisJCSAqIG1hcmsgaXQgYXMgc3RhbGUgYW5kIGJyZWxzZS4KKwkJICovCisJCWlmIChYRlNfQlVGX0lPRE9ORV9GVU5DKGJwKSkgeworCQkJWEZTX0JVRl9DTFJfQkRTVFJBVF9GVU5DKGJwKTsKKwkJCVhGU19CVUZfVU5ET05FKGJwKTsKKwkJCVhGU19CVUZfU1RBTEUoYnApOworCQkJWEZTX0JVRl9TSFVUKGJwKTsKKwkJCVhGU19CVUZfRVJST1IoYnAsRUlPKTsKKwkJCXhmc19iaW9kb25lKGJwKTsKKwkJfSBlbHNlIHsKKwkJCVhGU19CVUZfU1RBTEUoYnApOworCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCX0KKwl9CisKKwl4ZnNfaWZsdXNoX2Fib3J0KGlxKTsKKwkvKgorCSAqIFVubG9ja3MgdGhlIGZsdXNoIGxvY2sKKwkgKi8KKwlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7Cit9CisKKworU1RBVElDIGludAoreGZzX2lmbHVzaF9pbnQoCisJeGZzX2lub2RlX3QJCSppcCwKKwl4ZnNfYnVmX3QJCSpicCkKK3sKKwl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwOworCXhmc19kaW5vZGVfdAkJKmRpcDsKKwl4ZnNfbW91bnRfdAkJKm1wOworI2lmZGVmIFhGU19UUkFOU19ERUJVRworCWludAkJCWZpcnN0OworI2VuZGlmCisJU1BMREVDTChzKTsKKworCUFTU0VSVChpc21ybG9ja2VkKCZpcC0+aV9sb2NrLCBNUl9VUERBVEV8TVJfQUNDRVNTKSk7CisJQVNTRVJUKHZhbHVzZW1hKCZpcC0+aV9mbG9jaykgPD0gMCk7CisJQVNTRVJUKGlwLT5pX2QuZGlfZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0JUUkVFIHx8CisJICAgICAgIGlwLT5pX2QuZGlfbmV4dGVudHMgPiBpcC0+aV9kZi5pZl9leHRfbWF4KTsKKworCWlpcCA9IGlwLT5pX2l0ZW1wOworCW1wID0gaXAtPmlfbW91bnQ7CisKKworCS8qCisJICogSWYgdGhlIGlub2RlIGlzbid0IGRpcnR5LCB0aGVuIGp1c3QgcmVsZWFzZSB0aGUgaW5vZGUKKwkgKiBmbHVzaCBsb2NrIGFuZCBkbyBub3RoaW5nLgorCSAqLworCWlmICgoaXAtPmlfdXBkYXRlX2NvcmUgPT0gMCkgJiYKKwkgICAgKChpaXAgPT0gTlVMTCkgfHwgIShpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX0FMTCkpKSB7CisJCXhmc19pZnVubG9jayhpcCk7CisJCXJldHVybiAwOworCX0KKworCS8qIHNldCAqZGlwID0gaW5vZGUncyBwbGFjZSBpbiB0aGUgYnVmZmVyICovCisJZGlwID0gKHhmc19kaW5vZGVfdCAqKXhmc19idWZfb2Zmc2V0KGJwLCBpcC0+aV9ib2Zmc2V0KTsKKworCS8qCisJICogQ2xlYXIgaV91cGRhdGVfY29yZSBiZWZvcmUgY29weWluZyBvdXQgdGhlIGRhdGEuCisJICogVGhpcyBpcyBmb3IgY29vcmRpbmF0aW9uIHdpdGggb3VyIHRpbWVzdGFtcCB1cGRhdGVzCisJICogdGhhdCBkb24ndCBob2xkIHRoZSBpbm9kZSBsb2NrLiBUaGV5IHdpbGwgYWx3YXlzCisJICogdXBkYXRlIHRoZSB0aW1lc3RhbXBzIEJFRk9SRSBzZXR0aW5nIGlfdXBkYXRlX2NvcmUsCisJICogc28gaWYgd2UgY2xlYXIgaV91cGRhdGVfY29yZSBhZnRlciB0aGV5IHNldCBpdCB3ZQorCSAqIGFyZSBndWFyYW50ZWVkIHRvIHNlZSB0aGVpciB1cGRhdGVzIHRvIHRoZSB0aW1lc3RhbXBzLgorCSAqIEkgYmVsaWV2ZSB0aGF0IHRoaXMgZGVwZW5kcyBvbiBzdHJvbmdseSBvcmRlcmVkIG1lbW9yeQorCSAqIHNlbWFudGljcywgYnV0IHdlIGhhdmUgdGhhdC4gIFdlIHVzZSB0aGUgU1lOQ0hST05JWkUKKwkgKiBtYWNybyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29tcGlsZXIgZG9lcyBub3QgcmVvcmRlcgorCSAqIHRoZSBpX3VwZGF0ZV9jb3JlIGFjY2VzcyBiZWxvdyB0aGUgZGF0YSBjb3B5IGJlbG93LgorCSAqLworCWlwLT5pX3VwZGF0ZV9jb3JlID0gMDsKKwlTWU5DSFJPTklaRSgpOworCisJaWYgKFhGU19URVNUX0VSUk9SKElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX21hZ2ljLEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RJTk9ERV9NQUdJQywKKwkJCSAgICAgICBtcCwgWEZTX0VSUlRBR19JRkxVU0hfMSwgWEZTX1JBTkRPTV9JRkxVU0hfMSkpIHsKKwkJeGZzX2Ntbl9lcnIoWEZTX1BUQUdfSUZMVVNILCBDRV9BTEVSVCwgbXAsCisJCSAgICAieGZzX2lmbHVzaDogQmFkIGlub2RlICVMdSBtYWdpYyBudW1iZXIgMHgleCwgcHRyIDB4JXAiLAorCQkJaXAtPmlfaW5vLCAoaW50KSBJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9tYWdpYywgQVJDSF9DT05WRVJUKSwgZGlwKTsKKwkJZ290byBjb3JydXB0X291dDsKKwl9CisJaWYgKFhGU19URVNUX0VSUk9SKGlwLT5pX2QuZGlfbWFnaWMgIT0gWEZTX0RJTk9ERV9NQUdJQywKKwkJCQltcCwgWEZTX0VSUlRBR19JRkxVU0hfMiwgWEZTX1JBTkRPTV9JRkxVU0hfMikpIHsKKwkJeGZzX2Ntbl9lcnIoWEZTX1BUQUdfSUZMVVNILCBDRV9BTEVSVCwgbXAsCisJCQkieGZzX2lmbHVzaDogQmFkIGlub2RlICVMdSwgcHRyIDB4JXAsIG1hZ2ljIG51bWJlciAweCV4IiwKKwkJCWlwLT5pX2lubywgaXAsIGlwLT5pX2QuZGlfbWFnaWMpOworCQlnb3RvIGNvcnJ1cHRfb3V0OworCX0KKwlpZiAoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRlJFRykgeworCQlpZiAoWEZTX1RFU1RfRVJST1IoCisJCSAgICAoaXAtPmlfZC5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUykgJiYKKwkJICAgIChpcC0+aV9kLmRpX2Zvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSksCisJCSAgICBtcCwgWEZTX0VSUlRBR19JRkxVU0hfMywgWEZTX1JBTkRPTV9JRkxVU0hfMykpIHsKKwkJCXhmc19jbW5fZXJyKFhGU19QVEFHX0lGTFVTSCwgQ0VfQUxFUlQsIG1wLAorCQkJCSJ4ZnNfaWZsdXNoOiBCYWQgcmVndWxhciBpbm9kZSAlTHUsIHB0ciAweCVwIiwKKwkJCQlpcC0+aV9pbm8sIGlwKTsKKwkJCWdvdG8gY29ycnVwdF9vdXQ7CisJCX0KKwl9IGVsc2UgaWYgKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZESVIpIHsKKwkJaWYgKFhGU19URVNUX0VSUk9SKAorCQkgICAgKGlwLT5pX2QuZGlfZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0VYVEVOVFMpICYmCisJCSAgICAoaXAtPmlfZC5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpICYmCisJCSAgICAoaXAtPmlfZC5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpLAorCQkgICAgbXAsIFhGU19FUlJUQUdfSUZMVVNIXzQsIFhGU19SQU5ET01fSUZMVVNIXzQpKSB7CisJCQl4ZnNfY21uX2VycihYRlNfUFRBR19JRkxVU0gsIENFX0FMRVJULCBtcCwKKwkJCQkieGZzX2lmbHVzaDogQmFkIGRpcmVjdG9yeSBpbm9kZSAlTHUsIHB0ciAweCVwIiwKKwkJCQlpcC0+aV9pbm8sIGlwKTsKKwkJCWdvdG8gY29ycnVwdF9vdXQ7CisJCX0KKwl9CisJaWYgKFhGU19URVNUX0VSUk9SKGlwLT5pX2QuZGlfbmV4dGVudHMgKyBpcC0+aV9kLmRpX2FuZXh0ZW50cyA+CisJCQkJaXAtPmlfZC5kaV9uYmxvY2tzLCBtcCwgWEZTX0VSUlRBR19JRkxVU0hfNSwKKwkJCQlYRlNfUkFORE9NX0lGTFVTSF81KSkgeworCQl4ZnNfY21uX2VycihYRlNfUFRBR19JRkxVU0gsIENFX0FMRVJULCBtcCwKKwkJCSJ4ZnNfaWZsdXNoOiBkZXRlY3RlZCBjb3JydXB0IGluY29yZSBpbm9kZSAlTHUsIHRvdGFsIGV4dGVudHMgPSAlZCwgbmJsb2NrcyA9ICVMZCwgcHRyIDB4JXAiLAorCQkJaXAtPmlfaW5vLAorCQkJaXAtPmlfZC5kaV9uZXh0ZW50cyArIGlwLT5pX2QuZGlfYW5leHRlbnRzLAorCQkJaXAtPmlfZC5kaV9uYmxvY2tzLAorCQkJaXApOworCQlnb3RvIGNvcnJ1cHRfb3V0OworCX0KKwlpZiAoWEZTX1RFU1RfRVJST1IoaXAtPmlfZC5kaV9mb3Jrb2ZmID4gbXAtPm1fc2Iuc2JfaW5vZGVzaXplLAorCQkJCW1wLCBYRlNfRVJSVEFHX0lGTFVTSF82LCBYRlNfUkFORE9NX0lGTFVTSF82KSkgeworCQl4ZnNfY21uX2VycihYRlNfUFRBR19JRkxVU0gsIENFX0FMRVJULCBtcCwKKwkJCSJ4ZnNfaWZsdXNoOiBiYWQgaW5vZGUgJUx1LCBmb3Jrb2ZmIDB4JXgsIHB0ciAweCVwIiwKKwkJCWlwLT5pX2lubywgaXAtPmlfZC5kaV9mb3Jrb2ZmLCBpcCk7CisJCWdvdG8gY29ycnVwdF9vdXQ7CisJfQorCS8qCisJICogYnVtcCB0aGUgZmx1c2ggaXRlcmF0aW9uIGNvdW50LCB1c2VkIHRvIGRldGVjdCBmbHVzaGVzIHdoaWNoCisJICogcG9zdGRhdGUgYSBsb2cgcmVjb3JkIGR1cmluZyByZWNvdmVyeS4KKwkgKi8KKworCWlwLT5pX2QuZGlfZmx1c2hpdGVyKys7CisKKwkvKgorCSAqIENvcHkgdGhlIGRpcnR5IHBhcnRzIG9mIHRoZSBpbm9kZSBpbnRvIHRoZSBvbi1kaXNrCisJICogaW5vZGUuICBXZSBhbHdheXMgY29weSBvdXQgdGhlIGNvcmUgb2YgdGhlIGlub2RlLAorCSAqIGJlY2F1c2UgaWYgdGhlIGlub2RlIGlzIGRpcnR5IGF0IGFsbCB0aGUgY29yZSBtdXN0CisJICogYmUuCisJICovCisJeGZzX3hsYXRlX2Rpbm9kZV9jb3JlKCh4ZnNfY2FkZHJfdCkmKGRpcC0+ZGlfY29yZSksICYoaXAtPmlfZCksIC0xKTsKKworCS8qIFdyYXAsIHdlIG5ldmVyIGxldCB0aGUgbG9nIHB1dCBvdXQgRElfTUFYX0ZMVVNIICovCisJaWYgKGlwLT5pX2QuZGlfZmx1c2hpdGVyID09IERJX01BWF9GTFVTSCkKKwkJaXAtPmlfZC5kaV9mbHVzaGl0ZXIgPSAwOworCisJLyoKKwkgKiBJZiB0aGlzIGlzIHJlYWxseSBhbiBvbGQgZm9ybWF0IGlub2RlIGFuZCB0aGUgc3VwZXJibG9jayB2ZXJzaW9uCisJICogaGFzIG5vdCBiZWVuIHVwZGF0ZWQgdG8gc3VwcG9ydCBvbmx5IG5ldyBmb3JtYXQgaW5vZGVzLCB0aGVuCisJICogY29udmVydCBiYWNrIHRvIHRoZSBvbGQgaW5vZGUgZm9ybWF0LiAgSWYgdGhlIHN1cGVyYmxvY2sgdmVyc2lvbgorCSAqIGhhcyBiZWVuIHVwZGF0ZWQsIHRoZW4gbWFrZSB0aGUgY29udmVyc2lvbiBwZXJtYW5lbnQuCisJICovCisJQVNTRVJUKGlwLT5pX2QuZGlfdmVyc2lvbiA9PSBYRlNfRElOT0RFX1ZFUlNJT05fMSB8fAorCSAgICAgICBYRlNfU0JfVkVSU0lPTl9IQVNOTElOSygmbXAtPm1fc2IpKTsKKwlpZiAoaXAtPmlfZC5kaV92ZXJzaW9uID09IFhGU19ESU5PREVfVkVSU0lPTl8xKSB7CisJCWlmICghWEZTX1NCX1ZFUlNJT05fSEFTTkxJTksoJm1wLT5tX3NiKSkgeworCQkJLyoKKwkJCSAqIENvbnZlcnQgaXQgYmFjay4KKwkJCSAqLworCQkJQVNTRVJUKGlwLT5pX2QuZGlfbmxpbmsgPD0gWEZTX01BWExJTktfMSk7CisJCQlJTlRfU0VUKGRpcC0+ZGlfY29yZS5kaV9vbmxpbmssIEFSQ0hfQ09OVkVSVCwgaXAtPmlfZC5kaV9ubGluayk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGhlIHN1cGVyYmxvY2sgdmVyc2lvbiBoYXMgYWxyZWFkeSBiZWVuIGJ1bXBlZCwKKwkJCSAqIHNvIGp1c3QgbWFrZSB0aGUgY29udmVyc2lvbiB0byB0aGUgbmV3IGlub2RlCisJCQkgKiBmb3JtYXQgcGVybWFuZW50LgorCQkJICovCisJCQlpcC0+aV9kLmRpX3ZlcnNpb24gPSBYRlNfRElOT0RFX1ZFUlNJT05fMjsKKwkJCUlOVF9TRVQoZGlwLT5kaV9jb3JlLmRpX3ZlcnNpb24sIEFSQ0hfQ09OVkVSVCwgWEZTX0RJTk9ERV9WRVJTSU9OXzIpOworCQkJaXAtPmlfZC5kaV9vbmxpbmsgPSAwOworCQkJZGlwLT5kaV9jb3JlLmRpX29ubGluayA9IDA7CisJCQltZW1zZXQoJihpcC0+aV9kLmRpX3BhZFswXSksIDAsIHNpemVvZihpcC0+aV9kLmRpX3BhZCkpOworCQkJbWVtc2V0KCYoZGlwLT5kaV9jb3JlLmRpX3BhZFswXSksIDAsCisJCQkgICAgICBzaXplb2YoZGlwLT5kaV9jb3JlLmRpX3BhZCkpOworCQkJQVNTRVJUKGlwLT5pX2QuZGlfcHJvamlkID09IDApOworCQl9CisJfQorCisJaWYgKHhmc19pZmx1c2hfZm9yayhpcCwgZGlwLCBpaXAsIFhGU19EQVRBX0ZPUkssIGJwKSA9PSBFRlNDT1JSVVBURUQpIHsKKwkJZ290byBjb3JydXB0X291dDsKKwl9CisKKwlpZiAoWEZTX0lGT1JLX1EoaXApKSB7CisJCS8qCisJCSAqIFRoZSBvbmx5IGVycm9yIGZyb20geGZzX2lmbHVzaF9mb3JrIGlzIG9uIHRoZSBkYXRhIGZvcmsuCisJCSAqLworCQkodm9pZCkgeGZzX2lmbHVzaF9mb3JrKGlwLCBkaXAsIGlpcCwgWEZTX0FUVFJfRk9SSywgYnApOworCX0KKwl4ZnNfaW5vYnBfY2hlY2sobXAsIGJwKTsKKworCS8qCisJICogV2UndmUgcmVjb3JkZWQgZXZlcnl0aGluZyBsb2dnZWQgaW4gdGhlIGlub2RlLCBzbyB3ZSdkCisJICogbGlrZSB0byBjbGVhciB0aGUgaWxmX2ZpZWxkcyBiaXRzIHNvIHdlIGRvbid0IGxvZyBhbmQKKwkgKiBmbHVzaCB0aGluZ3MgdW5uZWNlc3NhcmlseS4gIEhvd2V2ZXIsIHdlIGNhbid0IHN0b3AKKwkgKiBsb2dnaW5nIGFsbCB0aGlzIGluZm9ybWF0aW9uIHVudGlsIHRoZSBkYXRhIHdlJ3ZlIGNvcGllZAorCSAqIGludG8gdGhlIGRpc2sgYnVmZmVyIGlzIHdyaXR0ZW4gdG8gZGlzay4gIElmIHdlIGRpZCB3ZSBtaWdodAorCSAqIG92ZXJ3cml0ZSB0aGUgY29weSBvZiB0aGUgaW5vZGUgaW4gdGhlIGxvZyB3aXRoIGFsbCB0aGUKKwkgKiBkYXRhIGFmdGVyIHJlLWxvZ2dpbmcgb25seSBwYXJ0IG9mIGl0LCBhbmQgaW4gdGhlIGZhY2Ugb2YKKwkgKiBhIGNyYXNoIHdlIHdvdWxkbid0IGhhdmUgYWxsIHRoZSBkYXRhIHdlIG5lZWQgdG8gcmVjb3Zlci4KKwkgKgorCSAqIFdoYXQgd2UgZG8gaXMgbW92ZSB0aGUgYml0cyB0byB0aGUgaWxpX2xhc3RfZmllbGRzIGZpZWxkLgorCSAqIFdoZW4gbG9nZ2luZyB0aGUgaW5vZGUsIHRoZXNlIGJpdHMgYXJlIG1vdmVkIGJhY2sgdG8gdGhlCisJICogaWxmX2ZpZWxkcyBmaWVsZC4gIEluIHRoZSB4ZnNfaWZsdXNoX2RvbmUoKSByb3V0aW5lIHdlCisJICogY2xlYXIgaWxpX2xhc3RfZmllbGRzLCBzaW5jZSB3ZSBrbm93IHRoYXQgdGhlIGluZm9ybWF0aW9uCisJICogdGhvc2UgYml0cyByZXByZXNlbnQgaXMgcGVybWFuZW50bHkgb24gZGlzay4gIEFzIGxvbmcgYXMKKwkgKiB0aGUgZmx1c2ggY29tcGxldGVzIGJlZm9yZSB0aGUgaW5vZGUgaXMgbG9nZ2VkIGFnYWluLCB0aGVuCisJICogYm90aCBpbGZfZmllbGRzIGFuZCBpbGlfbGFzdF9maWVsZHMgd2lsbCBiZSBjbGVhcmVkLgorCSAqCisJICogV2UgY2FuIHBsYXkgd2l0aCB0aGUgaWxmX2ZpZWxkcyBiaXRzIGhlcmUsIGJlY2F1c2UgdGhlIGlub2RlCisJICogbG9jayBtdXN0IGJlIGhlbGQgZXhjbHVzaXZlbHkgaW4gb3JkZXIgdG8gc2V0IGJpdHMgdGhlcmUKKwkgKiBhbmQgdGhlIGZsdXNoIGxvY2sgcHJvdGVjdHMgdGhlIGlsaV9sYXN0X2ZpZWxkcyBiaXRzLgorCSAqIFNldCBpbGlfbG9nZ2VkIHNvIHRoZSBmbHVzaCBkb25lCisJICogcm91dGluZSBjYW4gdGVsbCB3aGV0aGVyIG9yIG5vdCB0byBsb29rIGluIHRoZSBBSUwuCisJICogQWxzbywgc3RvcmUgdGhlIGN1cnJlbnQgTFNOIG9mIHRoZSBpbm9kZSBzbyB0aGF0IHdlIGNhbiB0ZWxsCisJICogd2hldGhlciB0aGUgaXRlbSBoYXMgbW92ZWQgaW4gdGhlIEFJTCBmcm9tIHhmc19pZmx1c2hfZG9uZSgpLgorCSAqIEluIG9yZGVyIHRvIHJlYWQgdGhlIGxzbiB3ZSBuZWVkIHRoZSBBSUwgbG9jaywgYmVjYXVzZQorCSAqIGl0IGlzIGEgNjQgYml0IHZhbHVlIHRoYXQgY2Fubm90IGJlIHJlYWQgYXRvbWljYWxseS4KKwkgKi8KKwlpZiAoaWlwICE9IE5VTEwgJiYgaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgIT0gMCkgeworCQlpaXAtPmlsaV9sYXN0X2ZpZWxkcyA9IGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzOworCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyA9IDA7CisJCWlpcC0+aWxpX2xvZ2dlZCA9IDE7CisKKwkJQVNTRVJUKHNpemVvZih4ZnNfbHNuX3QpID09IDgpOwkvKiBkb24ndCBsb2NrIGlmIGl0IHNocmlua3MgKi8KKwkJQUlMX0xPQ0sobXAscyk7CisJCWlpcC0+aWxpX2ZsdXNoX2xzbiA9IGlpcC0+aWxpX2l0ZW0ubGlfbHNuOworCQlBSUxfVU5MT0NLKG1wLCBzKTsKKworCQkvKgorCQkgKiBBdHRhY2ggdGhlIGZ1bmN0aW9uIHhmc19pZmx1c2hfZG9uZSB0byB0aGUgaW5vZGUncworCQkgKiBidWZmZXIuICBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBpbm9kZSBmcm9tIHRoZSBBSUwKKwkJICogYW5kIHVubG9jayB0aGUgaW5vZGUncyBmbHVzaCBsb2NrIHdoZW4gdGhlIGlub2RlIGlzCisJCSAqIGNvbXBsZXRlbHkgd3JpdHRlbiB0byBkaXNrLgorCQkgKi8KKwkJeGZzX2J1Zl9hdHRhY2hfaW9kb25lKGJwLCAodm9pZCgqKSh4ZnNfYnVmX3QqLHhmc19sb2dfaXRlbV90KikpCisJCQkJICAgICAgeGZzX2lmbHVzaF9kb25lLCAoeGZzX2xvZ19pdGVtX3QgKilpaXApOworCisJCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSAhPSBOVUxMKTsKKwkJQVNTRVJUKFhGU19CVUZfSU9ET05FX0ZVTkMoYnApICE9IE5VTEwpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFdlJ3JlIGZsdXNoaW5nIGFuIGlub2RlIHdoaWNoIGlzIG5vdCBpbiB0aGUgQUlMIGFuZCBoYXMKKwkJICogbm90IGJlZW4gbG9nZ2VkIGJ1dCBoYXMgaV91cGRhdGVfY29yZSBzZXQuICBGb3IgdGhpcworCQkgKiBjYXNlIHdlIGNhbiB1c2UgYSBCX0RFTFdSSSBmbHVzaCBhbmQgaW1tZWRpYXRlbHkgZHJvcAorCQkgKiB0aGUgaW5vZGUgZmx1c2ggbG9jayBiZWNhdXNlIHdlIGNhbiBhdm9pZCB0aGUgd2hvbGUKKwkJICogQUlMIHN0YXRlIHRoaW5nLiAgSXQncyBPSyB0byBkcm9wIHRoZSBmbHVzaCBsb2NrIG5vdywKKwkJICogYmVjYXVzZSB3ZSd2ZSBhbHJlYWR5IGxvY2tlZCB0aGUgYnVmZmVyIGFuZCB0byBkbyBhbnl0aGluZworCQkgKiB5b3UgcmVhbGx5IG5lZWQgYm90aC4KKwkJICovCisJCWlmIChpaXAgIT0gTlVMTCkgeworCQkJQVNTRVJUKGlpcC0+aWxpX2xvZ2dlZCA9PSAwKTsKKwkJCUFTU0VSVChpaXAtPmlsaV9sYXN0X2ZpZWxkcyA9PSAwKTsKKwkJCUFTU0VSVCgoaWlwLT5pbGlfaXRlbS5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpID09IDApOworCQl9CisJCXhmc19pZnVubG9jayhpcCk7CisJfQorCisJcmV0dXJuIDA7CisKK2NvcnJ1cHRfb3V0OgorCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKK30KKworCisvKgorICogRmx1c2ggYWxsIGluYWN0aXZlIGlub2RlcyBpbiBtcC4gIFJldHVybiB0cnVlIGlmIG5vIHVzZXIgcmVmZXJlbmNlcworICogd2VyZSBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitpbnQKK3hmc19pZmx1c2hfYWxsKAorCXhmc19tb3VudF90CSptcCwKKwlpbnQJCWZsYWcpCit7CisJaW50CQlidXN5OworCWludAkJZG9uZTsKKwlpbnQJCXB1cmdlZDsKKwl4ZnNfaW5vZGVfdAkqaXA7CisJdm1hcF90CQl2bWFwOworCXZub2RlX3QJCSp2cDsKKworCWJ1c3kgPSBkb25lID0gMDsKKwl3aGlsZSAoIWRvbmUpIHsKKwkJcHVyZ2VkID0gMDsKKwkJWEZTX01PVU5UX0lMT0NLKG1wKTsKKwkJaXAgPSBtcC0+bV9pbm9kZXM7CisJCWlmIChpcCA9PSBOVUxMKSB7CisJCQlicmVhazsKKwkJfQorCQlkbyB7CisJCQkvKiBNYWtlIHN1cmUgd2Ugc2tpcCBtYXJrZXJzIGluc2VydGVkIGJ5IHN5bmMgKi8KKwkJCWlmIChpcC0+aV9tb3VudCA9PSBOVUxMKSB7CisJCQkJaXAgPSBpcC0+aV9tbmV4dDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEl0J3MgdXAgdG8gb3VyIGNhbGxlciB0byBwdXJnZSB0aGUgcm9vdAorCQkJICogYW5kIHF1b3RhIHZub2RlcyBsYXRlci4KKwkJCSAqLworCQkJdnAgPSBYRlNfSVRPVl9OVUxMKGlwKTsKKworCQkJaWYgKCF2cCkgeworCQkJCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKKwkJCQl4ZnNfZmluaXNoX3JlY2xhaW0oaXAsIDAsIFhGU19JRkxVU0hfQVNZTkMpOworCQkJCXB1cmdlZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICh2bl9jb3VudCh2cCkgIT0gMCkgeworCQkJCWlmICh2bl9jb3VudCh2cCkgPT0gMSAmJgorCQkJCSAgICAoaXAgPT0gbXAtPm1fcm9vdGlwIHx8CisJCQkJICAgICAobXAtPm1fcXVvdGFpbmZvICYmCisJCQkJICAgICAgKGlwLT5pX2lubyA9PSBtcC0+bV9zYi5zYl91cXVvdGlubyB8fAorCQkJCSAgICAgICBpcC0+aV9pbm8gPT0gbXAtPm1fc2Iuc2JfZ3F1b3Rpbm8pKSkpIHsKKworCQkJCQlpcCA9IGlwLT5pX21uZXh0OworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKCEoZmxhZyAmIFhGU19GTFVTSF9BTEwpKSB7CisJCQkJCWJ1c3kgPSAxOworCQkJCQlkb25lID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qCisJCQkJICogSWdub3JlIGJ1c3kgaW5vZGVzIGJ1dCBjb250aW51ZSBmbHVzaGluZworCQkJCSAqIG90aGVycy4KKwkJCQkgKi8KKwkJCQlpcCA9IGlwLT5pX21uZXh0OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyoKKwkJCSAqIFNhbXBsZSB2cCBtYXBwaW5nIHdoaWxlIGhvbGRpbmcgbXAgbG9ja2VkIG9uIE1QCisJCQkgKiBzeXN0ZW1zLCBzbyB3ZSBkb24ndCBwdXJnZSBhIHJlY2xhaW1lZCBvcgorCQkJICogbm9uZXhpc3RlbnQgdm5vZGUuICBXZSBicmVhayBmcm9tIHRoZSBsb29wCisJCQkgKiBzaW5jZSB3ZSBrbm93IHRoYXQgd2UgbW9kaWZ5CisJCQkgKiBpdCBieSBwdWxsaW5nIG91cnNlbHZlcyBmcm9tIGl0IGluIHhmc19yZWNsYWltKCkKKwkJCSAqIGNhbGxlZCB2aWEgdm5fcHVyZ2UoKSBiZWxvdy4gIFNldCBpcCB0byB0aGUgbmV4dAorCQkJICogZW50cnkgaW4gdGhlIGxpc3QgYW55d2F5IHNvIHdlJ2xsIGtub3cgYmVsb3cKKwkJCSAqIHdoZXRoZXIgd2UgcmVhY2hlZCB0aGUgZW5kIG9yIG5vdC4KKwkJCSAqLworCQkJVk1BUCh2cCwgdm1hcCk7CisJCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7CisKKwkJCXZuX3B1cmdlKHZwLCAmdm1hcCk7CisKKwkJCXB1cmdlZCA9IDE7CisJCQlicmVhazsKKwkJfSB3aGlsZSAoaXAgIT0gbXAtPm1faW5vZGVzKTsKKwkJLyoKKwkJICogV2UgbmVlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHdoZW4gd2UgZXhpdCB0aGUgbG9vcAorCQkgKiBhZnRlciBhIHB1cmdlIGFuZCB3aGVuIHdlIHNpbXBseSBoaXQgdGhlIGVuZCBvZiB0aGUKKwkJICogbGlzdC4gIFdlIGNhbid0IHVzZSB0aGUgKGlwID09IG1wLT5tX2lub2RlcykgdGVzdCwKKwkJICogYmVjYXVzZSB3aGVuIHdlIHB1cmdlIGFuIGlub2RlIGF0IHRoZSBzdGFydCBvZiB0aGUgbGlzdAorCQkgKiB0aGUgbmV4dCBpbm9kZSBvbiB0aGUgbGlzdCBiZWNvbWVzIG1wLT5tX2lub2Rlcy4gIFRoYXQKKwkJICogd291bGQgY2F1c2Ugc3VjaCBhIHRlc3QgdG8gYmFpbCBvdXQgZWFybHkuICBUaGUgcHVyZ2VkCisJCSAqIHZhcmlhYmxlIHRlbGxzIHVzIGhvdyB3ZSBnb3Qgb3V0IG9mIHRoZSBsb29wLgorCQkgKi8KKwkJaWYgKCFwdXJnZWQpIHsKKwkJCWRvbmUgPSAxOworCQl9CisJfQorCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKKwlyZXR1cm4gIWJ1c3k7Cit9CisKKworLyoKKyAqIHhmc19pYWNjZXNzOiBjaGVjayBhY2Nlc3NpYmlsaXR5IG9mIGlub2RlIGZvciBtb2RlLgorICovCitpbnQKK3hmc19pYWNjZXNzKAorCXhmc19pbm9kZV90CSppcCwKKwltb2RlX3QJCW1vZGUsCisJY3JlZF90CQkqY3IpCit7CisJaW50CQllcnJvcjsKKwltb2RlX3QJCW9yZ21vZGUgPSBtb2RlOworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBMSU5WRlNfR0VUX0lQKFhGU19JVE9WKGlwKSk7CisKKwlpZiAobW9kZSAmIFNfSVdVU1IpIHsKKwkJdW1vZGVfdAkJaW1vZGUgPSBpbm9kZS0+aV9tb2RlOworCisJCWlmIChJU19SRE9OTFkoaW5vZGUpICYmCisJCSAgICAoU19JU1JFRyhpbW9kZSkgfHwgU19JU0RJUihpbW9kZSkgfHwgU19JU0xOSyhpbW9kZSkpKQorCQkJcmV0dXJuIFhGU19FUlJPUihFUk9GUyk7CisKKwkJaWYgKElTX0lNTVVUQUJMRShpbm9kZSkpCisJCQlyZXR1cm4gWEZTX0VSUk9SKEVBQ0NFUyk7CisJfQorCisJLyoKKwkgKiBJZiB0aGVyZSdzIGFuIEFjY2VzcyBDb250cm9sIExpc3QgaXQncyB1c2VkIGluc3RlYWQgb2YKKwkgKiB0aGUgbW9kZSBiaXRzLgorCSAqLworCWlmICgoZXJyb3IgPSBfQUNMX1hGU19JQUNDRVNTKGlwLCBtb2RlLCBjcikpICE9IC0xKQorCQlyZXR1cm4gZXJyb3IgPyBYRlNfRVJST1IoZXJyb3IpIDogMDsKKworCWlmIChjdXJyZW50X2ZzdWlkKGNyKSAhPSBpcC0+aV9kLmRpX3VpZCkgeworCQltb2RlID4+PSAzOworCQlpZiAoIWluX2dyb3VwX3AoKGdpZF90KWlwLT5pX2QuZGlfZ2lkKSkKKwkJCW1vZGUgPj49IDM7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgREFDcyBhcmUgb2sgd2UgZG9uJ3QgbmVlZCBhbnkgY2FwYWJpbGl0eSBjaGVjay4KKwkgKi8KKwlpZiAoKGlwLT5pX2QuZGlfbW9kZSAmIG1vZGUpID09IG1vZGUpCisJCXJldHVybiAwOworCS8qCisJICogUmVhZC93cml0ZSBEQUNzIGFyZSBhbHdheXMgb3ZlcnJpZGFibGUuCisJICogRXhlY3V0YWJsZSBEQUNzIGFyZSBvdmVycmlkYWJsZSBpZiBhdCBsZWFzdCBvbmUgZXhlYyBiaXQgaXMgc2V0LgorCSAqLworCWlmICghKG9yZ21vZGUgJiBTX0lYVVNSKSB8fAorCSAgICAoaW5vZGUtPmlfbW9kZSAmIFNfSVhVR08pIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCWlmIChjYXBhYmxlX2NyZWQoY3IsIENBUF9EQUNfT1ZFUlJJREUpKQorCQkJcmV0dXJuIDA7CisKKwlpZiAoKG9yZ21vZGUgPT0gU19JUlVTUikgfHwKKwkgICAgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgKCEob3JnbW9kZSAmIFNfSVdVU1IpKSkpIHsKKwkJaWYgKGNhcGFibGVfY3JlZChjciwgQ0FQX0RBQ19SRUFEX1NFQVJDSCkpCisJCQlyZXR1cm4gMDsKKyNpZmRlZglOT0lTRQorCQljbW5fZXJyKENFX05PVEUsICJJY2s6IG1vZGU9JW8sIG9yZ21vZGU9JW8iLCBtb2RlLCBvcmdtb2RlKTsKKyNlbmRpZgkvKiBOT0lTRSAqLworCQlyZXR1cm4gWEZTX0VSUk9SKEVBQ0NFUyk7CisJfQorCXJldHVybiBYRlNfRVJST1IoRUFDQ0VTKTsKK30KKworLyoKKyAqIHhmc19pcm91bmR1cDogcm91bmQgdXAgYXJndW1lbnQgdG8gbmV4dCBwb3dlciBvZiB0d28KKyAqLwordWludAoreGZzX2lyb3VuZHVwKAorCXVpbnQJdikKK3sKKwlpbnQgaTsKKwl1aW50IG07CisKKwlpZiAoKHYgJiAodiAtIDEpKSA9PSAwKQorCQlyZXR1cm4gdjsKKwlBU1NFUlQoKHYgJiAweDgwMDAwMDAwKSA9PSAwKTsKKwlpZiAoKHYgJiAodiArIDEpKSA9PSAwKQorCQlyZXR1cm4gdiArIDE7CisJZm9yIChpID0gMCwgbSA9IDE7IGkgPCAzMTsgaSsrLCBtIDw8PSAxKSB7CisJCWlmICh2ICYgbSkKKwkJCWNvbnRpbnVlOworCQl2IHw9IG07CisJCWlmICgodiAmICh2ICsgMSkpID09IDApCisJCQlyZXR1cm4gdiArIDE7CisJfQorCUFTU0VSVCgwKTsKKwlyZXR1cm4oIDAgKTsKK30KKworLyoKKyAqIENoYW5nZSB0aGUgcmVxdWVzdGVkIHRpbWVzdGFtcCBpbiB0aGUgZ2l2ZW4gaW5vZGUuCisgKiBXZSBkb24ndCBsb2NrIGFjcm9zcyB0aW1lc3RhbXAgdXBkYXRlcywgYW5kIHdlIGRvbid0IGxvZyB0aGVtIGJ1dAorICogd2UgZG8gcmVjb3JkIHRoZSBmYWN0IHRoYXQgdGhlcmUgaXMgZGlydHkgaW5mb3JtYXRpb24gaW4gY29yZS4KKyAqCisgKiBOT1RFIC0tIGNhbGxlcnMgTVVTVCBjb21iaW5lIFhGU19JQ0hHVElNRV9NT0Qgb3IgWEZTX0lDSEdUSU1FX0NIRworICoJCXdpdGggWEZTX0lDSEdUSU1FX0FDQyB0byBiZSBzdXJlIHRoYXQgYWNjZXNzIHRpbWUKKyAqCQl1cGRhdGUgd2lsbCB0YWtlLiAgQ2FsbGluZyBmaXJzdCB3aXRoIFhGU19JQ0hHVElNRV9BQ0MKKyAqCQlhbmQgdGhlbiBYRlNfSUNIR1RJTUVfTU9EIG1heSBmYWlsIHRvIG1vZGlmeSB0aGUgYWNjZXNzCisgKgkJdGltZXN0YW1wIGlmIHRoZSBmaWxlc3lzdGVtIGlzIG1vdW50ZWQgbm9hY2N0bS4KKyAqLwordm9pZAoreGZzX2ljaGd0aW1lKHhmc19pbm9kZV90ICppcCwKKwkgICAgIGludCBmbGFncykKK3sKKwl0aW1lc3BlY190CXR2OworCXZub2RlX3QJCSp2cCA9IFhGU19JVE9WKGlwKTsKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gTElOVkZTX0dFVF9JUCh2cCk7CisKKwkvKgorCSAqIFdlJ3JlIG5vdCBzdXBwb3NlZCB0byBjaGFuZ2UgdGltZXN0YW1wcyBpbiByZWFkb25seS1tb3VudGVkCisJICogZmlsZXN5c3RlbXMuICBUaHJvdyBpdCBhd2F5IGlmIGFueW9uZSBhc2tzIHVzLgorCSAqLworCWlmICh1bmxpa2VseSh2cC0+dl92ZnNwLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIERvbid0IHVwZGF0ZSBhY2Nlc3MgdGltZXN0YW1wcyBvbiByZWFkcyBpZiBtb3VudGVkICJub2F0aW1lIgorCSAqIFRocm93IGl0IGF3YXkgaWYgYW55b25lIGFza3MgdXMuCisJICovCisJaWYgKChpcC0+aV9tb3VudC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT0FUSU1FIHx8IElTX05PQVRJTUUoaW5vZGUpKSAmJgorCSAgICAoKGZsYWdzICYgKFhGU19JQ0hHVElNRV9BQ0N8WEZTX0lDSEdUSU1FX01PRHxYRlNfSUNIR1RJTUVfQ0hHKSkKKwkJCT09IFhGU19JQ0hHVElNRV9BQ0MpKQorCQlyZXR1cm47CisKKwluYW5vdGltZSgmdHYpOworCWlmIChmbGFncyAmIFhGU19JQ0hHVElNRV9NT0QpIHsKKwkJVk5fTVRJTUVTRVQodnAsICZ0dik7CisJCWlwLT5pX2QuZGlfbXRpbWUudF9zZWMgPSAoX19pbnQzMl90KXR2LnR2X3NlYzsKKwkJaXAtPmlfZC5kaV9tdGltZS50X25zZWMgPSAoX19pbnQzMl90KXR2LnR2X25zZWM7CisJfQorCWlmIChmbGFncyAmIFhGU19JQ0hHVElNRV9BQ0MpIHsKKwkJVk5fQVRJTUVTRVQodnAsICZ0dik7CisJCWlwLT5pX2QuZGlfYXRpbWUudF9zZWMgPSAoX19pbnQzMl90KXR2LnR2X3NlYzsKKwkJaXAtPmlfZC5kaV9hdGltZS50X25zZWMgPSAoX19pbnQzMl90KXR2LnR2X25zZWM7CisJfQorCWlmIChmbGFncyAmIFhGU19JQ0hHVElNRV9DSEcpIHsKKwkJVk5fQ1RJTUVTRVQodnAsICZ0dik7CisJCWlwLT5pX2QuZGlfY3RpbWUudF9zZWMgPSAoX19pbnQzMl90KXR2LnR2X3NlYzsKKwkJaXAtPmlfZC5kaV9jdGltZS50X25zZWMgPSAoX19pbnQzMl90KXR2LnR2X25zZWM7CisJfQorCisJLyoKKwkgKiBXZSB1cGRhdGUgdGhlIGlfdXBkYXRlX2NvcmUgZmllbGQgX2FmdGVyXyBjaGFuZ2luZworCSAqIHRoZSB0aW1lc3RhbXBzIGluIG9yZGVyIHRvIGNvb3JkaW5hdGUgcHJvcGVybHkgd2l0aAorCSAqIHhmc19pZmx1c2goKSBzbyB0aGF0IHdlIGRvbid0IGxvc2UgdGltZXN0YW1wIHVwZGF0ZXMuCisJICogVGhpcyBrZWVwcyB1cyBmcm9tIGhhdmluZyB0byBob2xkIHRoZSBpbm9kZSBsb2NrCisJICogd2hpbGUgZG9pbmcgdGhpcy4gIFdlIHVzZSB0aGUgU1lOQ0hST05JWkUgbWFjcm8gdG8KKwkgKiBlbnN1cmUgdGhhdCB0aGUgY29tcGlsZXIgZG9lcyBub3QgcmVvcmRlciB0aGUgdXBkYXRlCisJICogb2YgaV91cGRhdGVfY29yZSBhYm92ZSB0aGUgdGltZXN0YW1wIHVwZGF0ZXMgYWJvdmUuCisJICovCisJU1lOQ0hST05JWkUoKTsKKwlpcC0+aV91cGRhdGVfY29yZSA9IDE7CisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX0xPQ0spKQorCQltYXJrX2lub2RlX2RpcnR5X3N5bmMoaW5vZGUpOworfQorCisjaWZkZWYgWEZTX0lMT0NLX1RSQUNFCitrdHJhY2VfdAkqeGZzX2lsb2NrX3RyYWNlX2J1ZjsKKwordm9pZAoreGZzX2lsb2NrX3RyYWNlKHhmc19pbm9kZV90ICppcCwgaW50IGxvY2ssIHVuc2lnbmVkIGludCBsb2NrZmxhZ3MsIGluc3RfdCAqcmEpCit7CisJa3RyYWNlX2VudGVyKGlwLT5pX2xvY2tfdHJhY2UsCisJCSAgICAgKHZvaWQgKilpcCwKKwkJICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWxvY2ssIC8qIDEgPSBMT0NLLCAzPVVOTE9DSywgZXRjICovCisJCSAgICAgKHZvaWQgKikodW5zaWduZWQgbG9uZylsb2NrZmxhZ3MsIC8qIFhGU19JTE9DS19FWENMIGV0YyAqLworCQkgICAgICh2b2lkICopcmEsCQkvKiBjYWxsZXIgb2YgaWxvY2sgKi8KKwkJICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWN1cnJlbnRfY3B1KCksCisJCSAgICAgKHZvaWQgKikodW5zaWduZWQgbG9uZyljdXJyZW50X3BpZCgpLAorCQkgICAgIE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlLmggYi9mcy94ZnMveGZzX2lub2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUzYjFjYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGUuaApAQCAtMCwwICsxLDU1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYJX19YRlNfSU5PREVfSF9fCisjZGVmaW5lCV9fWEZTX0lOT0RFX0hfXworCisvKgorICogRmlsZSBpbmNvcmUgZXh0ZW50IGluZm9ybWF0aW9uLCBwcmVzZW50IGZvciBlYWNoIG9mIGRhdGEgJiBhdHRyIGZvcmtzLgorICovCisjZGVmaW5lCVhGU19JTkxJTkVfRVhUUwkyCisjZGVmaW5lCVhGU19JTkxJTkVfREFUQQkzMgordHlwZWRlZiBzdHJ1Y3QgeGZzX2lmb3JrIHsKKwlpbnQJCQlpZl9ieXRlczsJLyogYnl0ZXMgaW4gaWZfdTEgKi8KKwlpbnQJCQlpZl9yZWFsX2J5dGVzOwkvKiBieXRlcyBhbGxvY2F0ZWQgaW4gaWZfdTEgKi8KKwl4ZnNfYm1idF9ibG9ja190CSppZl9icm9vdDsJLyogZmlsZSdzIGluY29yZSBidHJlZSByb290ICovCisJc2hvcnQJCQlpZl9icm9vdF9ieXRlczsJLyogYnl0ZXMgYWxsb2NhdGVkIGZvciByb290ICovCisJdW5zaWduZWQgY2hhcgkJaWZfZmxhZ3M7CS8qIHBlci1mb3JrIGZsYWdzICovCisJdW5zaWduZWQgY2hhcgkJaWZfZXh0X21heDsJLyogbWF4ICMgb2YgZXh0ZW50IHJlY29yZHMgKi8KKwl4ZnNfZXh0bnVtX3QJCWlmX2xhc3RleDsJLyogbGFzdCBpZl9leHRlbnRzIHVzZWQgKi8KKwl1bmlvbiB7CisJCXhmc19ibWJ0X3JlY190CSppZl9leHRlbnRzOwkvKiBsaW5lYXIgbWFwIGZpbGUgZXh0cyAqLworCQljaGFyCQkqaWZfZGF0YTsJLyogaW5saW5lIGZpbGUgZGF0YSAqLworCX0gaWZfdTE7CisJdW5pb24geworCQl4ZnNfYm1idF9yZWNfdAlpZl9pbmxpbmVfZXh0W1hGU19JTkxJTkVfRVhUU107CisJCQkJCQkvKiB2ZXJ5IHNtYWxsIGZpbGUgZXh0ZW50cyAqLworCQljaGFyCQlpZl9pbmxpbmVfZGF0YVtYRlNfSU5MSU5FX0RBVEFdOworCQkJCQkJLyogdmVyeSBzbWFsbCBmaWxlIGRhdGEgKi8KKwkJeGZzX2Rldl90CWlmX3JkZXY7CS8qIGRldiBudW1iZXIgaWYgc3BlY2lhbCAqLworCQl1dWlkX3QJCWlmX3V1aWQ7CS8qIG1vdW50IHBvaW50IHZhbHVlICovCisJfSBpZl91MjsKK30geGZzX2lmb3JrX3Q7CisKKy8qCisgKiBGbGFncyBmb3IgeGZzX2ljaGd0aW1lKCkuCisgKi8KKyNkZWZpbmUJWEZTX0lDSEdUSU1FX01PRAkweDEJLyogZGF0YSBmb3JrIG1vZGlmaWNhdGlvbiB0aW1lc3RhbXAgKi8KKyNkZWZpbmUJWEZTX0lDSEdUSU1FX0FDQwkweDIJLyogZGF0YSBmb3JrIGFjY2VzcyB0aW1lc3RhbXAgKi8KKyNkZWZpbmUJWEZTX0lDSEdUSU1FX0NIRwkweDQJLyogaW5vZGUgZmllbGQgY2hhbmdlIHRpbWVzdGFtcCAqLworCisvKgorICogUGVyLWZvcmsgaW5jb3JlIGlub2RlIGZsYWdzLgorICovCisjZGVmaW5lCVhGU19JRklOTElORQkweDAwMDEJLyogSW5saW5lIGRhdGEgaXMgcmVhZCBpbiAqLworI2RlZmluZQlYRlNfSUZFWFRFTlRTCTB4MDAwMgkvKiBBbGwgZXh0ZW50IHBvaW50ZXJzIGFyZSByZWFkIGluICovCisjZGVmaW5lCVhGU19JRkJST09UCTB4MDAwNAkvKiBpX2Jyb290IHBvaW50cyB0byB0aGUgYm1hcCBiLXRyZWUgcm9vdCAqLworCisvKgorICogRmxhZ3MgZm9yIHhmc19pbWFwKCkgYW5kIHhmc19kaWxvY2F0ZSgpLgorICovCisjZGVmaW5lCVhGU19JTUFQX0xPT0tVUAkJMHgxCisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBleHRlbnQgcG9pbnRlcnMgaW4gaWZfdTEuaWZfZXh0ZW50cy4KKyAqLworI2RlZmluZQlYRlNfTUFYX0lOQ09SRV9FWFRFTlRTCTMyNzY4CisKKworI2lmZGVmIF9fS0VSTkVMX18KK3N0cnVjdCBiaHZfZGVzYzsKK3N0cnVjdCBjcmVkOworc3RydWN0IGt0cmFjZTsKK3N0cnVjdCB2bm9kZTsKK3N0cnVjdCB4ZnNfYnVmOworc3RydWN0IHhmc19ibWFwX2ZyZWU7CitzdHJ1Y3QgeGZzX2JtYnRfaXJlYzsKK3N0cnVjdCB4ZnNfYm1idF9ibG9jazsKK3N0cnVjdCB4ZnNfaW5vZGU7CitzdHJ1Y3QgeGZzX2lub2RlX2xvZ19pdGVtOworc3RydWN0IHhmc19tb3VudDsKK3N0cnVjdCB4ZnNfdHJhbnM7CitzdHJ1Y3QgeGZzX2RxdW90OworCisjaWYgZGVmaW5lZChYRlNfSUxPQ0tfVFJBQ0UpCisjZGVmaW5lIFhGU19JTE9DS19LVFJBQ0VfU0laRQkzMgorZXh0ZXJuIGt0cmFjZV90ICp4ZnNfaWxvY2tfdHJhY2VfYnVmOworZXh0ZXJuIHZvaWQgeGZzX2lsb2NrX3RyYWNlKHN0cnVjdCB4ZnNfaW5vZGUgKiwgaW50LCB1bnNpZ25lZCBpbnQsIGluc3RfdCAqKTsKKyNlbHNlCisjZGVmaW5lCXhmc19pbG9ja190cmFjZShpLG4sZixyYSkKKyNlbmRpZgorCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBjb21tdW5pY2F0ZSB3aGljaCBleHRlbnRzIG9mIGEgZmlsZQorICogd2VyZSBob2xlcyB3aGVuIGEgd3JpdGUgc3RhcnRlZCBmcm9tIHhmc193cml0ZV9maWxlKCkgdG8KKyAqIHhmc19zdHJhdF9yZWFkKCkuICBUaGlzIGlzIG5lY2Vzc2FyeSBzbyB0aGF0IHdlIGNhbiBrbm93IHdoaWNoCisgKiBibG9ja3MgbmVlZCB0byBiZSB6ZXJvZWQgd2hlbiB0aGV5IGFyZSByZWFkIGluIGluIHhmc19zdHJhdF9yZWFkKCkKKyAqIGlmIHRoZXkgd2VyZW5cJ3QgYWxsb2NhdGVkIHdoZW4gdGhlIGJ1ZmZlciBnaXZlbiB0byB4ZnNfc3RyYXRfcmVhZCgpCisgKiB3YXMgbWFwcGVkLgorICoKKyAqIFdlIGtlZXAgYSBsaXN0IG9mIHRoZXNlIGF0dGFjaGVkIHRvIHRoZSBpbm9kZS4gIFRoZSBsaXN0IGlzCisgKiBwcm90ZWN0ZWQgYnkgdGhlIGlub2RlIGxvY2sgYW5kIHRoZSBmYWN0IHRoYXQgdGhlIGlvIGxvY2sgaXMKKyAqIGhlbGQgZXhjbHVzaXZlbHkgYnkgd3JpdGVycy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2dhcCB7CisJc3RydWN0IHhmc19nYXAJKnhnX25leHQ7CisJeGZzX2ZpbGVvZmZfdAl4Z19vZmZzZXRfZnNiOworCXhmc19leHRsZW5fdAl4Z19jb3VudF9mc2I7Cit9IHhmc19nYXBfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZG1fYXR0cnNfcyB7CisJX191aW50MzJfdAlkYV9kbWV2bWFzazsJLyogRE1JRyBldmVudCBtYXNrICovCisJX191aW50MTZfdAlkYV9kbXN0YXRlOwkvKiBETUlHIHN0YXRlIGluZm8gKi8KKwlfX3VpbnQxNl90CWRhX3BhZDsJCS8qIERNSUcgZXh0cmEgcGFkZGluZyAqLworfSBkbV9hdHRyc190OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfaW9jb3JlIHsKKwl2b2lkCQkJKmlvX29iajsJLyogcG9pbnRlciB0byBjb250YWluZXIKKwkJCQkJCSAqIGlub2RlIG9yIGRjeHZuIHN0cnVjdHVyZSAqLworCXN0cnVjdCB4ZnNfbW91bnQJKmlvX21vdW50OwkvKiBmcyBtb3VudCBzdHJ1Y3QgcHRyICovCisjaWZkZWYgREVCVUcKKwltcmxvY2tfdAkJKmlvX2xvY2s7CS8qIGlub2RlIElPIGxvY2sgKi8KKwltcmxvY2tfdAkJKmlvX2lvbG9jazsJLyogaW5vZGUgSU8gbG9jayAqLworI2VuZGlmCisKKwkvKiBJL08gc3RhdGUgKi8KKwl4ZnNfZnNpemVfdAkJaW9fbmV3X3NpemU7CS8qIHN6IHdoZW4gd3JpdGUgY29tcGxldGVzICovCisKKwkvKiBNaXNjZWxsYW5lb3VzIHN0YXRlLiAqLworCXVuc2lnbmVkIGludAkJaW9fZmxhZ3M7CS8qIElPIHJlbGF0ZWQgZmxhZ3MgKi8KKworCS8qIERNQVBJIHN0YXRlICovCisJZG1fYXR0cnNfdAkJaW9fZG1hdHRyczsKKworfSB4ZnNfaW9jb3JlX3Q7CisKKyNkZWZpbmUgICAgICAgIGlvX2RtZXZtYXNrICAgICBpb19kbWF0dHJzLmRhX2RtZXZtYXNrCisjZGVmaW5lICAgICAgICBpb19kbXN0YXRlICAgICAgaW9fZG1hdHRycy5kYV9kbXN0YXRlCisKKyNkZWZpbmUgWEZTX0lPX0lOT0RFKGlvKQkoKHhmc19pbm9kZV90ICopICgoaW8pLT5pb19vYmopKQorI2RlZmluZSBYRlNfSU9fRENYVk4oaW8pCSgoZGN4dm5fdCAqKSAoKGlvKS0+aW9fb2JqKSkKKworLyoKKyAqIEZsYWdzIGluIHRoZSBmbGFncyBmaWVsZAorICovCisKKyNkZWZpbmUgWEZTX0lPQ09SRV9SVAkJMHgxCisKKy8qCisgKiB4ZnNfaW9jb3JlIHByb3RvdHlwZXMKKyAqLworCitleHRlcm4gdm9pZCB4ZnNfaW9jb3JlX2lub2RlX2luaXQoc3RydWN0IHhmc19pbm9kZSAqKTsKK2V4dGVybiB2b2lkIHhmc19pb2NvcmVfaW5vZGVfcmVpbml0KHN0cnVjdCB4ZnNfaW5vZGUgKik7CisKKworLyoKKyAqIFRoaXMgaXMgdGhlIHR5cGUgdXNlZCBpbiB0aGUgeGZzIGlub2RlIGhhc2ggdGFibGUuCisgKiBBbiBhcnJheSBvZiB0aGVzZSBpcyBhbGxvY2F0ZWQgZm9yIGVhY2ggbW91bnRlZAorICogZmlsZSBzeXN0ZW0gdG8gaGFzaCB0aGUgaW5vZGVzIGZvciB0aGF0IGZpbGUgc3lzdGVtLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfaWhhc2ggeworCXN0cnVjdCB4ZnNfaW5vZGUJKmloX25leHQ7CisJcndsb2NrX3QJCWloX2xvY2s7CisJdWludAkJCWloX3ZlcnNpb247Cit9IHhmc19paGFzaF90OworCisjZGVmaW5lIFhGU19JSEFTSChtcCxpbm8pICgobXApLT5tX2loYXNoICsgKCgodWludCkoaW5vKSkgJSAobXApLT5tX2loc2l6ZSkpCisKKy8qCisgKiBUaGlzIGlzIHRoZSB4ZnMgaW5vZGUgY2x1c3RlciBoYXNoLiAgVGhpcyBoYXNoIGlzIHVzZWQgYnkgeGZzX2lmbHVzaCB0bworICogZmluZCBpbm9kZXMgdGhhdCBzaGFyZSBhIGNsdXN0ZXIgYW5kIGNhbiBiZSBmbHVzaGVkIHRvIGRpc2sgYXQgdGhlIHNhbWUKKyAqIHRpbWUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19jaGFzaGxpc3QgeworCXN0cnVjdCB4ZnNfY2hhc2hsaXN0CSpjaGxfbmV4dDsKKwlzdHJ1Y3QgeGZzX2lub2RlCSpjaGxfaXA7CisJeGZzX2RhZGRyX3QJCWNobF9ibGtubzsJLyogc3RhcnRpbmcgYmxvY2sgbnVtYmVyIG9mCisJCQkJCQkgKiB0aGUgY2x1c3RlciAqLworCXN0cnVjdCB4ZnNfYnVmCQkqY2hsX2J1ZjsJLyogdGhlIGlub2RlIGJ1ZmZlciAqLworfSB4ZnNfY2hhc2hsaXN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19jaGFzaCB7CisJeGZzX2NoYXNobGlzdF90CQkqY2hfbGlzdDsKKwlsb2NrX3QJCQljaF9sb2NrOworfSB4ZnNfY2hhc2hfdDsKKworI2RlZmluZSBYRlNfQ0hBU0gobXAsYmxrKSAoKG1wKS0+bV9jaGFzaCArICgoKHVpbnQpYmxrKSAlIChtcCktPm1fY2hzaXplKSkKKworCisvKgorICogVGhpcyBpcyB0aGUgeGZzIGluLWNvcmUgaW5vZGUgc3RydWN0dXJlLgorICogTW9zdCBvZiB0aGUgb24tZGlzayBpbm9kZSBpcyBlbWJlZGRlZCBpbiB0aGUgaV9kIGZpZWxkLgorICoKKyAqIFRoZSBleHRlbnQgcG9pbnRlcnMvaW5saW5lIGZpbGUgc3BhY2UsIGhvd2V2ZXIsIGFyZSBtYW5hZ2VkCisgKiBzZXBhcmF0ZWx5LiAgVGhlIG1lbW9yeSBmb3IgdGhpcyBpbmZvcm1hdGlvbiBpcyBwb2ludGVkIHRvIGJ5CisgKiB0aGUgaWZfdTEgdW5pb25zIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGUgZGF0YS4KKyAqIFRoaXMgaXMgdXNlZCB0byBsaW5lYXJpemUgdGhlIGFycmF5IG9mIGV4dGVudHMgZm9yIGZhc3QgaW4tY29yZQorICogYWNjZXNzLiAgVGhpcyBpcyB1c2VkIHVudGlsIHRoZSBmaWxlJ3MgbnVtYmVyIG9mIGV4dGVudHMKKyAqIHN1cnBhc3NlcyBYRlNfTUFYX0lOQ09SRV9FWFRFTlRTLCBhdCB3aGljaCBwb2ludCBhbGwgZXh0ZW50IHBvaW50ZXJzCisgKiBhcmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgYnVmZmVyIGNhY2hlLgorICoKKyAqIE90aGVyIHN0YXRlIGtlcHQgaW4gdGhlIGluLWNvcmUgaW5vZGUgaXMgdXNlZCBmb3IgaWRlbnRpZmljYXRpb24sCisgKiBsb2NraW5nLCB0cmFuc2FjdGlvbmFsIHVwZGF0aW5nLCBldGMgb2YgdGhlIGlub2RlLgorICoKKyAqIEdlbmVyYWxseSwgd2UgZG8gbm90IHdhbnQgdG8gaG9sZCB0aGUgaV9ybG9jayB3aGlsZSBob2xkaW5nIHRoZQorICogaV9pbG9jay4gSGllcmFyY2h5IGlzIGlfaW9sb2NrIGZvbGxvd2VkIGJ5IGlfcmxvY2suCisgKgorICogeGZzX2lwdHJfdCBjb250YWlucyBhbGwgdGhlIGlub2RlIGZpZWxkcyB1cHRvIGFuZCBpbmNsdWRpbmcgdGhlCisgKiBpX21uZXh0IGFuZCBpX21wcmV2IGZpZWxkcywgaXQgaXMgdXNlZCBhcyBhIG1hcmtlciBpbiB0aGUgaW5vZGUKKyAqIGNoYWluIG9mZiB0aGUgbW91bnQgc3RydWN0dXJlIGJ5IHhmc19zeW5jIGNhbGxzLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgeGZzX2loYXNoCSppcF9oYXNoOwkvKiBwb2ludGVyIHRvIGhhc2ggaGVhZGVyICovCisJc3RydWN0IHhmc19pbm9kZQkqaXBfbmV4dDsJLyogaW5vZGUgaGFzaCBsaW5rIGZvcncgKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSppcF9tbmV4dDsJLyogbmV4dCBpbm9kZSBpbiBtb3VudCBsaXN0ICovCisJc3RydWN0IHhmc19pbm9kZQkqaXBfbXByZXY7CS8qIHB0ciB0byBwcmV2IGlub2RlICovCisJc3RydWN0IHhmc19pbm9kZQkqKmlwX3ByZXZwOwkvKiBwdHIgdG8gcHJldiBpX25leHQgKi8KKwlzdHJ1Y3QgeGZzX21vdW50CSppcF9tb3VudDsJLyogZnMgbW91bnQgc3RydWN0IHB0ciAqLworfSB4ZnNfaXB0cl90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfaW5vZGUgeworCS8qIElub2RlIGxpbmtpbmcgYW5kIGlkZW50aWZpY2F0aW9uIGluZm9ybWF0aW9uLiAqLworCXN0cnVjdCB4ZnNfaWhhc2gJKmlfaGFzaDsJLyogcG9pbnRlciB0byBoYXNoIGhlYWRlciAqLworCXN0cnVjdCB4ZnNfaW5vZGUJKmlfbmV4dDsJLyogaW5vZGUgaGFzaCBsaW5rIGZvcncgKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSppX21uZXh0OwkvKiBuZXh0IGlub2RlIGluIG1vdW50IGxpc3QgKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSppX21wcmV2OwkvKiBwdHIgdG8gcHJldiBpbm9kZSAqLworCXN0cnVjdCB4ZnNfaW5vZGUJKippX3ByZXZwOwkvKiBwdHIgdG8gcHJldiBpX25leHQgKi8KKwlzdHJ1Y3QgeGZzX21vdW50CSppX21vdW50OwkvKiBmcyBtb3VudCBzdHJ1Y3QgcHRyICovCisJc3RydWN0IGxpc3RfaGVhZAlpX3JlY2xhaW07CS8qIHJlY2xhaW0gbGlzdCAqLworCXN0cnVjdCBiaHZfZGVzYwkJaV9iaHZfZGVzYzsJLyogaW5vZGUgYmVoYXZpb3IgZGVzY3JpcHRvciovCisJc3RydWN0IHhmc19kcXVvdAkqaV91ZHF1b3Q7CS8qIHVzZXIgZHF1b3QgKi8KKwlzdHJ1Y3QgeGZzX2RxdW90CSppX2dkcXVvdDsJLyogZ3JvdXAgZHF1b3QgKi8KKworCS8qIElub2RlIGxvY2F0aW9uIHN0dWZmICovCisJeGZzX2lub190CQlpX2lubzsJCS8qIGlub2RlIG51bWJlciAoYWduby9hZ2lubykqLworCXhmc19kYWRkcl90CQlpX2Jsa25vOwkvKiBibGtubyBvZiBpbm9kZSBidWZmZXIgKi8KKwl1c2hvcnQJCQlpX2xlbjsJCS8qIGxlbiBvZiBpbm9kZSBidWZmZXIgKi8KKwl1c2hvcnQJCQlpX2JvZmZzZXQ7CS8qIG9mZiBvZiBpbm9kZSBpbiBidWZmZXIgKi8KKworCS8qIEV4dGVudCBpbmZvcm1hdGlvbi4gKi8KKwl4ZnNfaWZvcmtfdAkJKmlfYWZwOwkJLyogYXR0cmlidXRlIGZvcmsgcG9pbnRlciAqLworCXhmc19pZm9ya190CQlpX2RmOwkJLyogZGF0YSBmb3JrICovCisKKwkvKiBUcmFuc2FjdGlvbiBhbmQgbG9ja2luZyBpbmZvcm1hdGlvbi4gKi8KKwlzdHJ1Y3QgeGZzX3RyYW5zCSppX3RyYW5zcDsJLyogcHRyIHRvIG93bmluZyB0cmFuc2FjdGlvbiovCisJc3RydWN0IHhmc19pbm9kZV9sb2dfaXRlbSAqaV9pdGVtcDsJLyogbG9nZ2luZyBpbmZvcm1hdGlvbiAqLworCW1ybG9ja190CQlpX2xvY2s7CQkvKiBpbm9kZSBsb2NrICovCisJbXJsb2NrX3QJCWlfaW9sb2NrOwkvKiBpbm9kZSBJTyBsb2NrICovCisJc2VtYV90CQkJaV9mbG9jazsJLyogaW5vZGUgZmx1c2ggbG9jayAqLworCWF0b21pY190CQlpX3BpbmNvdW50OwkvKiBpbm9kZSBwaW4gY291bnQgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAlpX2lwaW5fd2FpdDsJLyogaW5vZGUgcGlubmluZyB3YWl0IHF1ZXVlICovCisjaWZkZWYgSEFWRV9SRUZDQUNIRQorCXN0cnVjdCB4ZnNfaW5vZGUJKippX3JlZmNhY2hlOwkvKiBwdHIgdG8gZW50cnkgaW4gcmVmIGNhY2hlICovCisJc3RydWN0IHhmc19pbm9kZQkqaV9yZWxlYXNlOwkvKiBpbm9kZSB0byB1bnJlZiAqLworI2VuZGlmCisJLyogSS9PIHN0YXRlICovCisJeGZzX2lvY29yZV90CQlpX2lvY29yZTsJLyogSS9PIGNvcmUgKi8KKworCS8qIE1pc2NlbGxhbmVvdXMgc3RhdGUuICovCisJdW5zaWduZWQgc2hvcnQJCWlfZmxhZ3M7CS8qIHNlZSBkZWZpbmVkIGZsYWdzIGJlbG93ICovCisJdW5zaWduZWQgY2hhcgkJaV91cGRhdGVfY29yZTsJLyogdGltZXN0YW1wcy9zaXplIGlzIGRpcnR5ICovCisJdW5zaWduZWQgY2hhcgkJaV91cGRhdGVfc2l6ZTsJLyogZGlfc2l6ZSBmaWVsZCBpcyBkaXJ0eSAqLworCXVuc2lnbmVkIGludAkJaV9nZW47CQkvKiBnZW5lcmF0aW9uIGNvdW50ICovCisJdW5zaWduZWQgaW50CQlpX2RlbGF5ZWRfYmxrczsJLyogY291bnQgb2YgZGVsYXkgYWxsb2MgYmxrcyAqLworCisJeGZzX2Rpbm9kZV9jb3JlX3QJaV9kOwkJLyogbW9zdCBvZiBvbmRpc2sgaW5vZGUgKi8KKwl4ZnNfY2hhc2hsaXN0X3QJCSppX2NoYXNoOwkvKiBjbHVzdGVyIGhhc2ggbGlzdCBoZWFkZXIgKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSppX2NuZXh0OwkvKiBjbHVzdGVyIGhhc2ggbGluayBmb3J3YXJkICovCisJc3RydWN0IHhmc19pbm9kZQkqaV9jcHJldjsJLyogY2x1c3RlciBoYXNoIGxpbmsgYmFja3dhcmQgKi8KKworCS8qIFRyYWNlIGJ1ZmZlcnMgcGVyIGlub2RlLiAqLworI2lmZGVmIFhGU19CTUFQX1RSQUNFCisJc3RydWN0IGt0cmFjZQkJKmlfeHRyYWNlOwkvKiBpbm9kZSBleHRlbnQgbGlzdCB0cmFjZSAqLworI2VuZGlmCisjaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKwlzdHJ1Y3Qga3RyYWNlCQkqaV9idHJhY2U7CS8qIGlub2RlIGJtYXAgYnRyZWUgdHJhY2UgKi8KKyNlbmRpZgorI2lmZGVmIFhGU19SV19UUkFDRQorCXN0cnVjdCBrdHJhY2UJCSppX3J3dHJhY2U7CS8qIGlub2RlIHJlYWQvd3JpdGUgdHJhY2UgKi8KKyNlbmRpZgorI2lmZGVmIFhGU19JTE9DS19UUkFDRQorCXN0cnVjdCBrdHJhY2UJCSppX2xvY2tfdHJhY2U7CS8qIGlub2RlIGxvY2svdW5sb2NrIHRyYWNlICovCisjZW5kaWYKKyNpZmRlZiBYRlNfRElSMl9UUkFDRQorCXN0cnVjdCBrdHJhY2UJCSppX2Rpcl90cmFjZTsJLyogaW5vZGUgZGlyZWN0b3J5IHRyYWNlICovCisjZW5kaWYKK30geGZzX2lub2RlX3Q7CisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKworLyoKKyAqIEZvcmsgaGFuZGxpbmcuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lGT1JLX1BUUikKK3hmc19pZm9ya190ICp4ZnNfaWZvcmtfcHRyKHhmc19pbm9kZV90ICppcCwgaW50IHcpOworI2RlZmluZQlYRlNfSUZPUktfUFRSKGlwLHcpCQl4ZnNfaWZvcmtfcHRyKGlwLHcpCisjZWxzZQorI2RlZmluZQlYRlNfSUZPUktfUFRSKGlwLHcpICAgKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gJihpcCktPmlfZGYgOiAoaXApLT5pX2FmcCkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSUZPUktfUSkKK2ludCB4ZnNfaWZvcmtfcSh4ZnNfaW5vZGVfdCAqaXApOworI2RlZmluZQlYRlNfSUZPUktfUShpcCkJCQl4ZnNfaWZvcmtfcShpcCkKKyNlbHNlCisjZGVmaW5lCVhGU19JRk9SS19RKGlwKQkJCVhGU19DRk9SS19RKCYoaXApLT5pX2QpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lGT1JLX0RTSVpFKQoraW50IHhmc19pZm9ya19kc2l6ZSh4ZnNfaW5vZGVfdCAqaXApOworI2RlZmluZQlYRlNfSUZPUktfRFNJWkUoaXApCQl4ZnNfaWZvcmtfZHNpemUoaXApCisjZWxzZQorI2RlZmluZQlYRlNfSUZPUktfRFNJWkUoaXApCQlYRlNfQ0ZPUktfRFNJWkUoJmlwLT5pX2QsIGlwLT5pX21vdW50KQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JRk9SS19BU0laRSkKK2ludCB4ZnNfaWZvcmtfYXNpemUoeGZzX2lub2RlX3QgKmlwKTsKKyNkZWZpbmUJWEZTX0lGT1JLX0FTSVpFKGlwKQkJeGZzX2lmb3JrX2FzaXplKGlwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lGT1JLX0FTSVpFKGlwKQkJWEZTX0NGT1JLX0FTSVpFKCZpcC0+aV9kLCBpcC0+aV9tb3VudCkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSUZPUktfU0laRSkKK2ludCB4ZnNfaWZvcmtfc2l6ZSh4ZnNfaW5vZGVfdCAqaXAsIGludCB3KTsKKyNkZWZpbmUJWEZTX0lGT1JLX1NJWkUoaXAsdykJCXhmc19pZm9ya19zaXplKGlwLHcpCisjZWxzZQorI2RlZmluZQlYRlNfSUZPUktfU0laRShpcCx3KQkJWEZTX0NGT1JLX1NJWkUoJmlwLT5pX2QsIGlwLT5pX21vdW50LCB3KQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JRk9SS19GT1JNQVQpCitpbnQgeGZzX2lmb3JrX2Zvcm1hdCh4ZnNfaW5vZGVfdCAqaXAsIGludCB3KTsKKyNkZWZpbmUJWEZTX0lGT1JLX0ZPUk1BVChpcCx3KQkJeGZzX2lmb3JrX2Zvcm1hdChpcCx3KQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lGT1JLX0ZPUk1BVChpcCx3KQkJWEZTX0NGT1JLX0ZPUk1BVCgmaXAtPmlfZCwgdykKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSUZPUktfRk1UX1NFVCkKK3ZvaWQgeGZzX2lmb3JrX2ZtdF9zZXQoeGZzX2lub2RlX3QgKmlwLCBpbnQgdywgaW50IG4pOworI2RlZmluZQlYRlNfSUZPUktfRk1UX1NFVChpcCx3LG4pCXhmc19pZm9ya19mbXRfc2V0KGlwLHcsbikKKyNlbHNlCisjZGVmaW5lCVhGU19JRk9SS19GTVRfU0VUKGlwLHcsbikJWEZTX0NGT1JLX0ZNVF9TRVQoJmlwLT5pX2QsIHcsIG4pCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lGT1JLX05FWFRFTlRTKQoraW50IHhmc19pZm9ya19uZXh0ZW50cyh4ZnNfaW5vZGVfdCAqaXAsIGludCB3KTsKKyNkZWZpbmUJWEZTX0lGT1JLX05FWFRFTlRTKGlwLHcpCXhmc19pZm9ya19uZXh0ZW50cyhpcCx3KQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lGT1JLX05FWFRFTlRTKGlwLHcpCVhGU19DRk9SS19ORVhURU5UUygmaXAtPmlfZCwgdykKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSUZPUktfTkVYVF9TRVQpCit2b2lkIHhmc19pZm9ya19uZXh0X3NldCh4ZnNfaW5vZGVfdCAqaXAsIGludCB3LCBpbnQgbik7CisjZGVmaW5lCVhGU19JRk9SS19ORVhUX1NFVChpcCx3LG4pCXhmc19pZm9ya19uZXh0X3NldChpcCx3LG4pCisjZWxzZQorI2RlZmluZQlYRlNfSUZPUktfTkVYVF9TRVQoaXAsdyxuKQlYRlNfQ0ZPUktfTkVYVF9TRVQoJmlwLT5pX2QsIHcsIG4pCisjZW5kaWYKKworCisjaWZkZWYgX19LRVJORUxfXworCisvKgorICogSW4tY29yZSBpbm9kZSBmbGFncy4KKyAqLworI2RlZmluZSBYRlNfSUdSSU8JMHgwMDAxICAvKiBpbm9kZSB1c2VkIGZvciBndWFyYW50ZWVkIHJhdGUgaS9vICovCisjZGVmaW5lIFhGU19JVUlPU1oJMHgwMDAyICAvKiBpbm9kZSBpL28gc2l6ZXMgaGF2ZSBiZWVuIGV4cGxpY2l0bHkgc2V0ICovCisjZGVmaW5lIFhGU19JUVVJRVNDRSAgICAweDAwMDQgIC8qIHdlIGhhdmUgc3RhcnRlZCBxdWllc2NpbmcgZm9yIHRoaXMgaW5vZGUgKi8KKyNkZWZpbmUgWEZTX0lSRUNMQUlNICAgIDB4MDAwOCAgLyogd2UgaGF2ZSBzdGFydGVkIHJlY2xhaW1pbmcgdGhpcyBpbm9kZSAgICAqLworI2RlZmluZSBYRlNfSVNUQUxFCTB4MDAxMAkvKiBpbm9kZSBoYXMgYmVlbiBzdGFsZWQgKi8KKyNkZWZpbmUgWEZTX0lSRUNMQUlNQUJMRSAweDAwMjAgLyogaW5vZGUgY2FuIGJlIHJlY2xhaW1lZCAqLworI2RlZmluZSBYRlNfSU5FVwkweDAwNDAKKworLyoKKyAqIEZsYWdzIGZvciBpbm9kZSBsb2NraW5nLgorICovCisjZGVmaW5lCVhGU19JT0xPQ0tfRVhDTAkJMHgwMDEKKyNkZWZpbmUJWEZTX0lPTE9DS19TSEFSRUQJMHgwMDIKKyNkZWZpbmUJWEZTX0lMT0NLX0VYQ0wJCTB4MDA0CisjZGVmaW5lCVhGU19JTE9DS19TSEFSRUQJMHgwMDgKKyNkZWZpbmUJWEZTX0lVTkxPQ0tfTk9OT1RJRlkJMHgwMTAKKyNkZWZpbmUgWEZTX0VYVEVOVF9UT0tFTl9SRAkweDA0MAorI2RlZmluZSBYRlNfU0laRV9UT0tFTl9SRAkweDA4MAorI2RlZmluZSBYRlNfRVhUU0laRV9SRAkJKFhGU19FWFRFTlRfVE9LRU5fUkR8WEZTX1NJWkVfVE9LRU5fUkQpCisjZGVmaW5lIFhGU19XSUxMTEVORAkJMHgxMDAJLyogQWx3YXlzIGFjcXVpcmUgdG9rZW5zIGZvciBsZW5kaW5nICovCisjZGVmaW5lIFhGU19FWFRFTlRfVE9LRU5fV1IJKFhGU19FWFRFTlRfVE9LRU5fUkQgfCBYRlNfV0lMTExFTkQpCisjZGVmaW5lIFhGU19TSVpFX1RPS0VOX1dSICAgICAgIChYRlNfU0laRV9UT0tFTl9SRCB8IFhGU19XSUxMTEVORCkKKyNkZWZpbmUgWEZTX0VYVFNJWkVfV1IJCShYRlNfRVhUU0laRV9SRCB8IFhGU19XSUxMTEVORCkKKworCisjZGVmaW5lIFhGU19MT0NLX01BU0sJXAorCShYRlNfSU9MT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX1NIQVJFRCB8IFhGU19JTE9DS19FWENMIHwgXAorCSBYRlNfSUxPQ0tfU0hBUkVEIHwgWEZTX0VYVEVOVF9UT0tFTl9SRCB8IFhGU19TSVpFX1RPS0VOX1JEIHwgXAorCSBYRlNfV0lMTExFTkQpCisKKy8qCisgKiBGbGFncyBmb3IgeGZzX2lmbHVzaCgpCisgKi8KKyNkZWZpbmUJWEZTX0lGTFVTSF9ERUxXUklfRUxTRV9TWU5DCTEKKyNkZWZpbmUJWEZTX0lGTFVTSF9ERUxXUklfRUxTRV9BU1lOQwkyCisjZGVmaW5lCVhGU19JRkxVU0hfU1lOQwkJCTMKKyNkZWZpbmUJWEZTX0lGTFVTSF9BU1lOQwkJNAorI2RlZmluZQlYRlNfSUZMVVNIX0RFTFdSSQkJNQorCisvKgorICogRmxhZ3MgZm9yIHhmc19pZmx1c2hfYWxsLgorICovCisjZGVmaW5lCVhGU19GTFVTSF9BTEwJCTB4MQorCisvKgorICogRmxhZ3MgZm9yIHhmc19pdHJ1bmNhdGVfc3RhcnQoKS4KKyAqLworI2RlZmluZQlYRlNfSVRSVU5DX0RFRklOSVRFCTB4MQorI2RlZmluZQlYRlNfSVRSVU5DX01BWUJFCTB4MgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JVE9WKQorc3RydWN0IHZub2RlICp4ZnNfaXRvdih4ZnNfaW5vZGVfdCAqaXApOworI2RlZmluZQlYRlNfSVRPVihpcCkJCXhmc19pdG92KGlwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lUT1YoaXApCQlCSFZfVE9fVk5PREUoWEZTX0lUT0JIVihpcCkpCisjZW5kaWYKKyNkZWZpbmUJWEZTX0lUT1ZfTlVMTChpcCkJQkhWX1RPX1ZOT0RFX05VTEwoWEZTX0lUT0JIVihpcCkpCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JVE9CSFYpCitzdHJ1Y3QgYmh2X2Rlc2MgKnhmc19pdG9iaHYoeGZzX2lub2RlX3QgKmlwKTsKKyNkZWZpbmUJWEZTX0lUT0JIVihpcCkJCXhmc19pdG9iaHYoaXApCisjZWxzZQorI2RlZmluZQlYRlNfSVRPQkhWKGlwKQkJKChzdHJ1Y3QgYmh2X2Rlc2MgKikoJigoaXApLT5pX2Jodl9kZXNjKSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JIVlRPSSkKK3hmc19pbm9kZV90ICp4ZnNfYmh2dG9pKHN0cnVjdCBiaHZfZGVzYyAqYmh2cCk7CisjZGVmaW5lCVhGU19CSFZUT0koYmh2cCkJeGZzX2JodnRvaShiaHZwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0JIVlRPSShiaHZwKQlcCisJKCh4ZnNfaW5vZGVfdCAqKSgoY2hhciAqKShiaHZwKSAtIFwKKwkJCSAoY2hhciAqKSYoKCh4ZnNfaW5vZGVfdCAqKTApLT5pX2Jodl9kZXNjKSkpCisjZW5kaWYKKworI2RlZmluZSBCSFZfSVNfWEZTKGJkcCkJCShCSFZfT1BTKGJkcCkgPT0gJnhmc192bm9kZW9wcykKKworLyoKKyAqIEZvciBtdWx0aXBsZSBncm91cHMgc3VwcG9ydDogaWYgU19JU0dJRCBiaXQgaXMgc2V0IGluIHRoZSBwYXJlbnQKKyAqIGRpcmVjdG9yeSwgZ3JvdXAgb2YgbmV3IGZpbGUgaXMgc2V0IHRvIHRoYXQgb2YgdGhlIHBhcmVudCwgYW5kCisgKiBuZXcgc3ViZGlyZWN0b3J5IGdldHMgU19JU0dJRCBiaXQgZnJvbSBwYXJlbnQuCisgKi8KKyNkZWZpbmUgWEZTX0lOSEVSSVRfR0lEKHBpcCwgdmZzcCkJXAorCSgoKHZmc3ApLT52ZnNfZmxhZyAmIFZGU19HUlBJRCkgfHwgKChwaXApLT5pX2QuZGlfbW9kZSAmIFNfSVNHSUQpKQorCisvKgorICogeGZzX2lnZXQuYyBwcm90b3R5cGVzLgorICovCisKKyNkZWZpbmUgSUdFVF9DUkVBVEUJMQorCit2b2lkCQl4ZnNfaWhhc2hfaW5pdChzdHJ1Y3QgeGZzX21vdW50ICopOwordm9pZAkJeGZzX2loYXNoX2ZyZWUoc3RydWN0IHhmc19tb3VudCAqKTsKK3ZvaWQJCXhmc19jaGFzaF9pbml0KHN0cnVjdCB4ZnNfbW91bnQgKik7Cit2b2lkCQl4ZnNfY2hhc2hfZnJlZShzdHJ1Y3QgeGZzX21vdW50ICopOworeGZzX2lub2RlX3QJKnhmc19pbm9kZV9pbmNvcmUoc3RydWN0IHhmc19tb3VudCAqLCB4ZnNfaW5vX3QsCisJCQkJICBzdHJ1Y3QgeGZzX3RyYW5zICopOwordm9pZCAgICAgICAgICAgIHhmc19pbm9kZV9sb2NrX2luaXQoeGZzX2lub2RlX3QgKiwgc3RydWN0IHZub2RlICopOworaW50CQl4ZnNfaWdldChzdHJ1Y3QgeGZzX21vdW50ICosIHN0cnVjdCB4ZnNfdHJhbnMgKiwgeGZzX2lub190LAorCQkJIHVpbnQsIHVpbnQsIHhmc19pbm9kZV90ICoqLCB4ZnNfZGFkZHJfdCk7Cit2b2lkCQl4ZnNfaXB1dCh4ZnNfaW5vZGVfdCAqLCB1aW50KTsKK3ZvaWQJCXhmc19pcHV0X25ldyh4ZnNfaW5vZGVfdCAqLCB1aW50KTsKK3ZvaWQJCXhmc19pbG9jayh4ZnNfaW5vZGVfdCAqLCB1aW50KTsKK2ludAkJeGZzX2lsb2NrX25vd2FpdCh4ZnNfaW5vZGVfdCAqLCB1aW50KTsKK3ZvaWQJCXhmc19pdW5sb2NrKHhmc19pbm9kZV90ICosIHVpbnQpOwordm9pZAkJeGZzX2lsb2NrX2RlbW90ZSh4ZnNfaW5vZGVfdCAqLCB1aW50KTsKK3ZvaWQJCXhmc19pZmxvY2soeGZzX2lub2RlX3QgKik7CitpbnQJCXhmc19pZmxvY2tfbm93YWl0KHhmc19pbm9kZV90ICopOwordWludAkJeGZzX2lsb2NrX21hcF9zaGFyZWQoeGZzX2lub2RlX3QgKik7Cit2b2lkCQl4ZnNfaXVubG9ja19tYXBfc2hhcmVkKHhmc19pbm9kZV90ICosIHVpbnQpOwordm9pZAkJeGZzX2lmdW5sb2NrKHhmc19pbm9kZV90ICopOwordm9pZAkJeGZzX2lyZWNsYWltKHhmc19pbm9kZV90ICopOworaW50CQl4ZnNfZmluaXNoX3JlY2xhaW0oeGZzX2lub2RlX3QgKiwgaW50LCBpbnQpOworaW50CQl4ZnNfZmluaXNoX3JlY2xhaW1fYWxsKHN0cnVjdCB4ZnNfbW91bnQgKiwgaW50KTsKKworLyoKKyAqIHhmc19pbm9kZS5jIHByb3RvdHlwZXMuCisgKi8KK2ludAkJeGZzX2lub3RvYnAoc3RydWN0IHhmc19tb3VudCAqLCBzdHJ1Y3QgeGZzX3RyYW5zICosIHhmc19pbm9fdCwKKwkJCSAgICB4ZnNfZGlub2RlX3QgKiosIHN0cnVjdCB4ZnNfYnVmICoqLCBpbnQgKik7CitpbnQJCXhmc19pdG9icChzdHJ1Y3QgeGZzX21vdW50ICosIHN0cnVjdCB4ZnNfdHJhbnMgKiwKKwkJCSAgeGZzX2lub2RlX3QgKiwgeGZzX2Rpbm9kZV90ICoqLCBzdHJ1Y3QgeGZzX2J1ZiAqKiwKKwkJCSAgeGZzX2RhZGRyX3QpOworaW50CQl4ZnNfaXJlYWQoc3RydWN0IHhmc19tb3VudCAqLCBzdHJ1Y3QgeGZzX3RyYW5zICosIHhmc19pbm9fdCwKKwkJCSAgeGZzX2lub2RlX3QgKiosIHhmc19kYWRkcl90KTsKK2ludAkJeGZzX2lyZWFkX2V4dGVudHMoc3RydWN0IHhmc190cmFucyAqLCB4ZnNfaW5vZGVfdCAqLCBpbnQpOworaW50CQl4ZnNfaWFsbG9jKHN0cnVjdCB4ZnNfdHJhbnMgKiwgeGZzX2lub2RlX3QgKiwgbW9kZV90LCBubGlua190LAorCQkJICAgeGZzX2Rldl90LCBzdHJ1Y3QgY3JlZCAqLCB4ZnNfcHJpZF90LCBpbnQsCisJCQkgICBzdHJ1Y3QgeGZzX2J1ZiAqKiwgYm9vbGVhbl90ICosIHhmc19pbm9kZV90ICoqKTsKK3ZvaWQJCXhmc194bGF0ZV9kaW5vZGVfY29yZSh4ZnNfY2FkZHJfdCwgc3RydWN0IHhmc19kaW5vZGVfY29yZSAqLAorCQkJCQlpbnQpOwordWludAkJeGZzX2lwMnhmbGFncyhzdHJ1Y3QgeGZzX2lub2RlICopOwordWludAkJeGZzX2RpYzJ4ZmxhZ3Moc3RydWN0IHhmc19kaW5vZGVfY29yZSAqKTsKK2ludAkJeGZzX2lmcmVlKHN0cnVjdCB4ZnNfdHJhbnMgKiwgeGZzX2lub2RlX3QgKiwKKwkJCSAgIHN0cnVjdCB4ZnNfYm1hcF9mcmVlICopOwordm9pZAkJeGZzX2l0cnVuY2F0ZV9zdGFydCh4ZnNfaW5vZGVfdCAqLCB1aW50LCB4ZnNfZnNpemVfdCk7CitpbnQJCXhmc19pdHJ1bmNhdGVfZmluaXNoKHN0cnVjdCB4ZnNfdHJhbnMgKiosIHhmc19pbm9kZV90ICosCisJCQkJICAgICB4ZnNfZnNpemVfdCwgaW50LCBpbnQpOworaW50CQl4ZnNfaXVubGluayhzdHJ1Y3QgeGZzX3RyYW5zICosIHhmc19pbm9kZV90ICopOworaW50CQl4ZnNfaWdyb3dfc3RhcnQoeGZzX2lub2RlX3QgKiwgeGZzX2ZzaXplX3QsIHN0cnVjdCBjcmVkICopOwordm9pZAkJeGZzX2lncm93X2ZpbmlzaChzdHJ1Y3QgeGZzX3RyYW5zICosIHhmc19pbm9kZV90ICosCisJCQkJIHhmc19mc2l6ZV90LCBpbnQpOworCit2b2lkCQl4ZnNfaWRlc3Ryb3lfZm9yayh4ZnNfaW5vZGVfdCAqLCBpbnQpOwordm9pZAkJeGZzX2lkZXN0cm95KHhmc19pbm9kZV90ICopOwordm9pZAkJeGZzX2lkYXRhX3JlYWxsb2MoeGZzX2lub2RlX3QgKiwgaW50LCBpbnQpOwordm9pZAkJeGZzX2lleHRyYWN0KHhmc19pbm9kZV90ICopOwordm9pZAkJeGZzX2lleHRfcmVhbGxvYyh4ZnNfaW5vZGVfdCAqLCBpbnQsIGludCk7Cit2b2lkCQl4ZnNfaXJvb3RfcmVhbGxvYyh4ZnNfaW5vZGVfdCAqLCBpbnQsIGludCk7Cit2b2lkCQl4ZnNfaXBpbih4ZnNfaW5vZGVfdCAqKTsKK3ZvaWQJCXhmc19pdW5waW4oeGZzX2lub2RlX3QgKik7CitpbnQJCXhmc19pZXh0ZW50c19jb3B5KHhmc19pbm9kZV90ICosIHhmc19ibWJ0X3JlY190ICosIGludCk7CitpbnQJCXhmc19pZmx1c2goeGZzX2lub2RlX3QgKiwgdWludCk7CitpbnQJCXhmc19pZmx1c2hfYWxsKHN0cnVjdCB4ZnNfbW91bnQgKiwgaW50KTsKK2ludAkJeGZzX2lhY2Nlc3MoeGZzX2lub2RlX3QgKiwgbW9kZV90LCBjcmVkX3QgKik7Cit1aW50CQl4ZnNfaXJvdW5kdXAodWludCk7Cit2b2lkCQl4ZnNfaWNoZ3RpbWUoeGZzX2lub2RlX3QgKiwgaW50KTsKK3hmc19mc2l6ZV90CXhmc19maWxlX2xhc3RfYnl0ZSh4ZnNfaW5vZGVfdCAqKTsKK3ZvaWQJCXhmc19sb2NrX2lub2Rlcyh4ZnNfaW5vZGVfdCAqKiwgaW50LCBpbnQsIHVpbnQpOworCisjZGVmaW5lIHhmc19pcGluY291bnQoaXApCSgodW5zaWduZWQgaW50KSBhdG9taWNfcmVhZCgmaXAtPmlfcGluY291bnQpKQorCisjaWZkZWYgREVCVUcKK3ZvaWQJCXhmc19pc2l6ZV9jaGVjayhzdHJ1Y3QgeGZzX21vdW50ICosIHhmc19pbm9kZV90ICosIHhmc19mc2l6ZV90KTsKKyNlbHNlCS8qIERFQlVHICovCisjZGVmaW5lIHhmc19pc2l6ZV9jaGVjayhtcCwgaXAsIGlzaXplKQorI2VuZGlmCS8qIERFQlVHICovCisKKyNpZiBkZWZpbmVkKERFQlVHKQordm9pZAkJeGZzX2lub2JwX2NoZWNrKHN0cnVjdCB4ZnNfbW91bnQgKiwgc3RydWN0IHhmc19idWYgKik7CisjZWxzZQorI2RlZmluZQl4ZnNfaW5vYnBfY2hlY2sobXAsIGJwKQorI2VuZGlmIC8qIERFQlVHICovCisKK2V4dGVybiBzdHJ1Y3Qga21lbV96b25lCSp4ZnNfY2hhc2hsaXN0X3pvbmU7CitleHRlcm4gc3RydWN0IGttZW1fem9uZQkqeGZzX2lmb3JrX3pvbmU7CitleHRlcm4gc3RydWN0IGttZW1fem9uZQkqeGZzX2lub2RlX3pvbmU7CitleHRlcm4gc3RydWN0IGttZW1fem9uZQkqeGZzX2lsaV96b25lOworZXh0ZXJuIHN0cnVjdCB2bm9kZW9wcwl4ZnNfdm5vZGVvcHM7CisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgkvKiBfX1hGU19JTk9ERV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jIGIvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY4Y2IxOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jCkBAIC0wLDAgKzEsMTA5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHhmc19pbm9kZV9sb2dfaXRlbS4KKyAqIEl0IGNvbnRhaW5zIHRoZSBpdGVtIG9wZXJhdGlvbnMgdXNlZCB0byBtYW5pcHVsYXRlIHRoZSBpbm9kZSBsb2cKKyAqIGl0ZW1zIGFzIHdlbGwgYXMgdXRpbGl0eSByb3V0aW5lcyB1c2VkIGJ5IHRoZSBpbm9kZSBzcGVjaWZpYworICogdHJhbnNhY3Rpb24gcm91dGluZXMuCisgKi8KKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKworCitrbWVtX3pvbmVfdAkqeGZzX2lsaV96b25lOwkJLyogaW5vZGUgbG9nIGl0ZW0gem9uZSAqLworCisvKgorICogVGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgaW92ZWNzIG5lZWRlZCB0byBsb2cgdGhlIGdpdmVuIGlub2RlIGl0ZW0uCisgKgorICogV2UgbmVlZCBvbmUgaW92ZWMgZm9yIHRoZSBpbm9kZSBsb2cgZm9ybWF0IHN0cnVjdHVyZSwgb25lIGZvciB0aGUKKyAqIGlub2RlIGNvcmUsIGFuZCBwb3NzaWJseSBvbmUgZm9yIHRoZSBpbm9kZSBkYXRhL2V4dGVudHMvYi10cmVlIHJvb3QKKyAqIGFuZCBvbmUgZm9yIHRoZSBpbm9kZSBhdHRyaWJ1dGUgZGF0YS9leHRlbnRzL2ItdHJlZSByb290LgorICovCitTVEFUSUMgdWludAoreGZzX2lub2RlX2l0ZW1fc2l6ZSgKKwl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwKQoreworCXVpbnQJCW52ZWNzOworCXhmc19pbm9kZV90CSppcDsKKworCWlwID0gaWlwLT5pbGlfaW5vZGU7CisJbnZlY3MgPSAyOworCisJLyoKKwkgKiBPbmx5IGxvZyB0aGUgZGF0YS9leHRlbnRzL2ItdHJlZSByb290IGlmIHRoZXJlIGlzIHNvbWV0aGluZworCSAqIGxlZnQgdG8gbG9nLgorCSAqLworCWlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzIHw9IFhGU19JTE9HX0NPUkU7CisKKwlzd2l0Y2ggKGlwLT5pX2QuZGlfZm9ybWF0KSB7CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTOgorCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmPQorCQkJfihYRlNfSUxPR19EREFUQSB8IFhGU19JTE9HX0RCUk9PVCB8CisJCQkgIFhGU19JTE9HX0RFViB8IFhGU19JTE9HX1VVSUQpOworCQlpZiAoKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgWEZTX0lMT0dfREVYVCkgJiYKKwkJICAgIChpcC0+aV9kLmRpX25leHRlbnRzID4gMCkgJiYKKwkJICAgIChpcC0+aV9kZi5pZl9ieXRlcyA+IDApKSB7CisJCQlBU1NFUlQoaXAtPmlfZGYuaWZfdTEuaWZfZXh0ZW50cyAhPSBOVUxMKTsKKwkJCW52ZWNzKys7CisJCX0gZWxzZSB7CisJCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmPSB+WEZTX0lMT0dfREVYVDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgWEZTX0RJTk9ERV9GTVRfQlRSRUU6CisJCUFTU0VSVChpcC0+aV9kZi5pZl9leHRfbWF4ID09CisJCSAgICAgICBYRlNfSUZPUktfRFNJWkUoaXApIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KSk7CisJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICY9CisJCQl+KFhGU19JTE9HX0REQVRBIHwgWEZTX0lMT0dfREVYVCB8CisJCQkgIFhGU19JTE9HX0RFViB8IFhGU19JTE9HX1VVSUQpOworCQlpZiAoKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgWEZTX0lMT0dfREJST09UKSAmJgorCQkgICAgKGlwLT5pX2RmLmlmX2Jyb290X2J5dGVzID4gMCkpIHsKKwkJCUFTU0VSVChpcC0+aV9kZi5pZl9icm9vdCAhPSBOVUxMKTsKKwkJCW52ZWNzKys7CisJCX0gZWxzZSB7CisJCQlBU1NFUlQoIShpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmCisJCQkJIFhGU19JTE9HX0RCUk9PVCkpOworI2lmZGVmIFhGU19UUkFOU19ERUJVRworCQkJaWYgKGlpcC0+aWxpX3Jvb3Rfc2l6ZSA+IDApIHsKKwkJCQlBU1NFUlQoaWlwLT5pbGlfcm9vdF9zaXplID09CisJCQkJICAgICAgIGlwLT5pX2RmLmlmX2Jyb290X2J5dGVzKTsKKwkJCQlBU1NFUlQobWVtY21wKGlpcC0+aWxpX29yaWdfcm9vdCwKKwkJCQkJICAgIGlwLT5pX2RmLmlmX2Jyb290LAorCQkJCQkgICAgaWlwLT5pbGlfcm9vdF9zaXplKSA9PSAwKTsKKwkJCX0gZWxzZSB7CisJCQkJQVNTRVJUKGlwLT5pX2RmLmlmX2Jyb290X2J5dGVzID09IDApOworCQkJfQorI2VuZGlmCisJCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmPSB+WEZTX0lMT0dfREJST09UOworCQl9CisJCWJyZWFrOworCisJY2FzZSBYRlNfRElOT0RFX0ZNVF9MT0NBTDoKKwkJaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJj0KKwkJCX4oWEZTX0lMT0dfREVYVCB8IFhGU19JTE9HX0RCUk9PVCB8CisJCQkgIFhGU19JTE9HX0RFViB8IFhGU19JTE9HX1VVSUQpOworCQlpZiAoKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgWEZTX0lMT0dfRERBVEEpICYmCisJCSAgICAoaXAtPmlfZGYuaWZfYnl0ZXMgPiAwKSkgeworCQkJQVNTRVJUKGlwLT5pX2RmLmlmX3UxLmlmX2RhdGEgIT0gTlVMTCk7CisJCQlBU1NFUlQoaXAtPmlfZC5kaV9zaXplID4gMCk7CisJCQludmVjcysrOworCQl9IGVsc2UgeworCQkJaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJj0gflhGU19JTE9HX0REQVRBOworCQl9CisJCWJyZWFrOworCisJY2FzZSBYRlNfRElOT0RFX0ZNVF9ERVY6CisJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICY9CisJCQl+KFhGU19JTE9HX0REQVRBIHwgWEZTX0lMT0dfREJST09UIHwKKwkJCSAgWEZTX0lMT0dfREVYVCB8IFhGU19JTE9HX1VVSUQpOworCQlicmVhazsKKworCWNhc2UgWEZTX0RJTk9ERV9GTVRfVVVJRDoKKwkJaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJj0KKwkJCX4oWEZTX0lMT0dfRERBVEEgfCBYRlNfSUxPR19EQlJPT1QgfAorCQkJICBYRlNfSUxPR19ERVhUIHwgWEZTX0lMT0dfREVWKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJCWJyZWFrOworCX0KKworCS8qCisJICogSWYgdGhlcmUgYXJlIG5vIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlsZSwKKwkgKiB0aGVuIHRoZXJlIGNhbm5vdCBiZSBhbnl0aGluZyBtb3JlIHRvIGxvZy4KKwkgKiBDbGVhciBhbGwgYXR0cmlidXRlLXJlbGF0ZWQgbG9nIGZsYWdzLgorCSAqLworCWlmICghWEZTX0lGT1JLX1EoaXApKSB7CisJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICY9CisJCQl+KFhGU19JTE9HX0FEQVRBIHwgWEZTX0lMT0dfQUJST09UIHwgWEZTX0lMT0dfQUVYVCk7CisJCXJldHVybiBudmVjczsKKwl9CisKKwkvKgorCSAqIExvZyBhbnkgbmVjZXNzYXJ5IGF0dHJpYnV0ZSBkYXRhLgorCSAqLworCXN3aXRjaCAoaXAtPmlfZC5kaV9hZm9ybWF0KSB7CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTOgorCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmPQorCQkJfihYRlNfSUxPR19BREFUQSB8IFhGU19JTE9HX0FCUk9PVCk7CisJCWlmICgoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJiBYRlNfSUxPR19BRVhUKSAmJgorCQkgICAgKGlwLT5pX2QuZGlfYW5leHRlbnRzID4gMCkgJiYKKwkJICAgIChpcC0+aV9hZnAtPmlmX2J5dGVzID4gMCkpIHsKKwkJCUFTU0VSVChpcC0+aV9hZnAtPmlmX3UxLmlmX2V4dGVudHMgIT0gTlVMTCk7CisJCQludmVjcysrOworCQl9IGVsc2UgeworCQkJaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJj0gflhGU19JTE9HX0FFWFQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFhGU19ESU5PREVfRk1UX0JUUkVFOgorCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmPQorCQkJfihYRlNfSUxPR19BREFUQSB8IFhGU19JTE9HX0FFWFQpOworCQlpZiAoKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgWEZTX0lMT0dfQUJST09UKSAmJgorCQkgICAgKGlwLT5pX2FmcC0+aWZfYnJvb3RfYnl0ZXMgPiAwKSkgeworCQkJQVNTRVJUKGlwLT5pX2FmcC0+aWZfYnJvb3QgIT0gTlVMTCk7CisJCQludmVjcysrOworCQl9IGVsc2UgeworCQkJaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJj0gflhGU19JTE9HX0FCUk9PVDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgWEZTX0RJTk9ERV9GTVRfTE9DQUw6CisJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICY9CisJCQl+KFhGU19JTE9HX0FFWFQgfCBYRlNfSUxPR19BQlJPT1QpOworCQlpZiAoKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgWEZTX0lMT0dfQURBVEEpICYmCisJCSAgICAoaXAtPmlfYWZwLT5pZl9ieXRlcyA+IDApKSB7CisJCQlBU1NFUlQoaXAtPmlfYWZwLT5pZl91MS5pZl9kYXRhICE9IE5VTEwpOworCQkJbnZlY3MrKzsKKwkJfSBlbHNlIHsKKwkJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICY9IH5YRlNfSUxPR19BREFUQTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIG52ZWNzOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gZmlsbCBpbiB0aGUgdmVjdG9yIG9mIGxvZyBpb3ZlY3MgZm9yIHRoZQorICogZ2l2ZW4gaW5vZGUgbG9nIGl0ZW0uICBJdCBmaWxscyB0aGUgZmlyc3QgaXRlbSB3aXRoIGFuIGlub2RlCisgKiBsb2cgZm9ybWF0IHN0cnVjdHVyZSwgdGhlIHNlY29uZCB3aXRoIHRoZSBvbi1kaXNrIGlub2RlIHN0cnVjdHVyZSwKKyAqIGFuZCBhIHBvc3NpYmxlIHRoaXJkIGFuZC9vciBmb3VydGggd2l0aCB0aGUgaW5vZGUgZGF0YS9leHRlbnRzL2ItdHJlZQorICogcm9vdCBhbmQgaW5vZGUgYXR0cmlidXRlcyBkYXRhL2V4dGVudHMvYi10cmVlIHJvb3QuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfaW5vZGVfaXRlbV9mb3JtYXQoCisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcCwKKwl4ZnNfbG9nX2lvdmVjX3QJCSpsb2dfdmVjdG9yKQoreworCXVpbnQJCQludmVjczsKKwl4ZnNfbG9nX2lvdmVjX3QJCSp2ZWNwOworCXhmc19pbm9kZV90CQkqaXA7CisJc2l6ZV90CQkJZGF0YV9ieXRlczsKKwl4ZnNfYm1idF9yZWNfdAkJKmV4dF9idWZmZXI7CisJaW50CQkJbnJlY3M7CisJeGZzX21vdW50X3QJCSptcDsKKworCWlwID0gaWlwLT5pbGlfaW5vZGU7CisJdmVjcCA9IGxvZ192ZWN0b3I7CisKKwl2ZWNwLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpJmlpcC0+aWxpX2Zvcm1hdDsKKwl2ZWNwLT5pX2xlbiAgPSBzaXplb2YoeGZzX2lub2RlX2xvZ19mb3JtYXRfdCk7CisJdmVjcCsrOworCW52ZWNzCSAgICAgPSAxOworCisJLyoKKwkgKiBDbGVhciBpX3VwZGF0ZV9jb3JlIGlmIHRoZSB0aW1lc3RhbXBzIChvciBhbnkgb3RoZXIKKwkgKiBub24tdHJhbnNhY3Rpb25hbCBtb2RpZmljYXRpb24pIG5lZWQgZmx1c2hpbmcvbG9nZ2luZworCSAqIGFuZCB3ZSdyZSBhYm91dCB0byBsb2cgdGhlbSB3aXRoIHRoZSByZXN0IG9mIHRoZSBjb3JlLgorCSAqCisJICogVGhpcyBpcyB0aGUgc2FtZSBsb2dpYyBhcyB4ZnNfaWZsdXNoKCkgYnV0IHRoaXMgY29kZSBjYW4ndAorCSAqIHJ1biBhdCB0aGUgc2FtZSB0aW1lIGFzIHhmc19pZmx1c2ggYmVjYXVzZSB3ZSdyZSBpbiBjb21taXQKKwkgKiBwcm9jZXNzaW5nIGhlcmUgYW5kIHNvIHdlIGhhdmUgdGhlIGlub2RlIGxvY2sgaGVsZCBpbgorCSAqIGV4Y2x1c2l2ZSBtb2RlLiAgQWx0aG91Z2ggaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyCisJICogZm9yIHRoZSB0aW1lc3RhbXBzIGlmIGJvdGggcm91dGluZXMgd2VyZSB0byBncmFiIHRoZQorCSAqIHRpbWVzdGFtcHMgb3Igbm90LiAgVGhhdCB3b3VsZCBiZSBvay4KKwkgKgorCSAqIFdlIGNsZWFyIGlfdXBkYXRlX2NvcmUgYmVmb3JlIGNvcHlpbmcgb3V0IHRoZSBkYXRhLgorCSAqIFRoaXMgaXMgZm9yIGNvb3JkaW5hdGlvbiB3aXRoIG91ciB0aW1lc3RhbXAgdXBkYXRlcworCSAqIHRoYXQgZG9uJ3QgaG9sZCB0aGUgaW5vZGUgbG9jay4gVGhleSB3aWxsIGFsd2F5cworCSAqIHVwZGF0ZSB0aGUgdGltZXN0YW1wcyBCRUZPUkUgc2V0dGluZyBpX3VwZGF0ZV9jb3JlLAorCSAqIHNvIGlmIHdlIGNsZWFyIGlfdXBkYXRlX2NvcmUgYWZ0ZXIgdGhleSBzZXQgaXQgd2UKKwkgKiBhcmUgZ3VhcmFudGVlZCB0byBzZWUgdGhlaXIgdXBkYXRlcyB0byB0aGUgdGltZXN0YW1wcworCSAqIGVpdGhlciBoZXJlLiAgTGlrZXdpc2UsIGlmIHRoZXkgc2V0IGl0IGFmdGVyIHdlIGNsZWFyIGl0CisJICogaGVyZSwgd2UnbGwgc2VlIGl0IGVpdGhlciBvbiB0aGUgbmV4dCBjb21taXQgb2YgdGhpcworCSAqIGlub2RlIG9yIHRoZSBuZXh0IHRpbWUgdGhlIGlub2RlIGdldHMgZmx1c2hlZCB2aWEKKwkgKiB4ZnNfaWZsdXNoKCkuICBUaGlzIGRlcGVuZHMgb24gc3Ryb25nbHkgb3JkZXJlZCBtZW1vcnkKKwkgKiBzZW1hbnRpY3MsIGJ1dCB3ZSBoYXZlIHRoYXQuICBXZSB1c2UgdGhlIFNZTkNIUk9OSVpFCisJICogbWFjcm8gdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHJlb3JkZXIKKwkgKiB0aGUgaV91cGRhdGVfY29yZSBhY2Nlc3MgYmVsb3cgdGhlIGRhdGEgY29weSBiZWxvdy4KKwkgKi8KKwlpZiAoaXAtPmlfdXBkYXRlX2NvcmUpICB7CisJCWlwLT5pX3VwZGF0ZV9jb3JlID0gMDsKKwkJU1lOQ0hST05JWkUoKTsKKwl9CisKKwkvKgorCSAqIFdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgcmUtb3JkZXJpbmcgaGVyZSBiZWNhdXNlCisJICogdGhlIHVwZGF0ZV9zaXplIGZpZWxkIGlzIHByb3RlY3RlZCBieSB0aGUgaW5vZGUgbG9jaworCSAqIGFuZCB3ZSBoYXZlIHRoYXQgaGVsZCBpbiBleGNsdXNpdmUgbW9kZS4KKwkgKi8KKwlpZiAoaXAtPmlfdXBkYXRlX3NpemUpCisJCWlwLT5pX3VwZGF0ZV9zaXplID0gMDsKKworCXZlY3AtPmlfYWRkciA9ICh4ZnNfY2FkZHJfdCkmaXAtPmlfZDsKKwl2ZWNwLT5pX2xlbiAgPSBzaXplb2YoeGZzX2Rpbm9kZV9jb3JlX3QpOworCXZlY3ArKzsKKwludmVjcysrOworCWlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzIHw9IFhGU19JTE9HX0NPUkU7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgcmVhbGx5IGFuIG9sZCBmb3JtYXQgaW5vZGUsIHRoZW4gd2UgbmVlZCB0bworCSAqIGxvZyBpdCBhcyBzdWNoLiAgVGhpcyBtZWFucyB0aGF0IHdlIGhhdmUgdG8gY29weSB0aGUgbGluaworCSAqIGNvdW50IGZyb20gdGhlIG5ldyBmaWVsZCB0byB0aGUgb2xkLiAgV2UgZG9uJ3QgaGF2ZSB0byB3b3JyeQorCSAqIGFib3V0IHRoZSBuZXcgZmllbGRzLCBiZWNhdXNlIG5vdGhpbmcgdHJ1c3RzIHRoZW0gYXMgbG9uZyBhcworCSAqIHRoZSBvbGQgaW5vZGUgdmVyc2lvbiBudW1iZXIgaXMgdGhlcmUuICBJZiB0aGUgc3VwZXJibG9jayBhbHJlYWR5CisJICogaGFzIGEgbmV3IHZlcnNpb24gbnVtYmVyLCB0aGVuIHdlIGRvbid0IGJvdGhlciBjb252ZXJ0aW5nIGJhY2suCisJICovCisJbXAgPSBpcC0+aV9tb3VudDsKKwlBU1NFUlQoaXAtPmlfZC5kaV92ZXJzaW9uID09IFhGU19ESU5PREVfVkVSU0lPTl8xIHx8CisJICAgICAgIFhGU19TQl9WRVJTSU9OX0hBU05MSU5LKCZtcC0+bV9zYikpOworCWlmIChpcC0+aV9kLmRpX3ZlcnNpb24gPT0gWEZTX0RJTk9ERV9WRVJTSU9OXzEpIHsKKwkJaWYgKCFYRlNfU0JfVkVSU0lPTl9IQVNOTElOSygmbXAtPm1fc2IpKSB7CisJCQkvKgorCQkJICogQ29udmVydCBpdCBiYWNrLgorCQkJICovCisJCQlBU1NFUlQoaXAtPmlfZC5kaV9ubGluayA8PSBYRlNfTUFYTElOS18xKTsKKwkJCWlwLT5pX2QuZGlfb25saW5rID0gaXAtPmlfZC5kaV9ubGluazsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBUaGUgc3VwZXJibG9jayB2ZXJzaW9uIGhhcyBhbHJlYWR5IGJlZW4gYnVtcGVkLAorCQkJICogc28ganVzdCBtYWtlIHRoZSBjb252ZXJzaW9uIHRvIHRoZSBuZXcgaW5vZGUKKwkJCSAqIGZvcm1hdCBwZXJtYW5lbnQuCisJCQkgKi8KKwkJCWlwLT5pX2QuZGlfdmVyc2lvbiA9IFhGU19ESU5PREVfVkVSU0lPTl8yOworCQkJaXAtPmlfZC5kaV9vbmxpbmsgPSAwOworCQkJbWVtc2V0KCYoaXAtPmlfZC5kaV9wYWRbMF0pLCAwLCBzaXplb2YoaXAtPmlfZC5kaV9wYWQpKTsKKwkJfQorCX0KKworCXN3aXRjaCAoaXAtPmlfZC5kaV9mb3JtYXQpIHsKKwljYXNlIFhGU19ESU5PREVfRk1UX0VYVEVOVFM6CisJCUFTU0VSVCghKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYKKwkJCSAoWEZTX0lMT0dfRERBVEEgfCBYRlNfSUxPR19EQlJPT1QgfAorCQkJICBYRlNfSUxPR19ERVYgfCBYRlNfSUxPR19VVUlEKSkpOworCQlpZiAoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJiBYRlNfSUxPR19ERVhUKSB7CisJCQlBU1NFUlQoaXAtPmlfZGYuaWZfYnl0ZXMgPiAwKTsKKwkJCUFTU0VSVChpcC0+aV9kZi5pZl91MS5pZl9leHRlbnRzICE9IE5VTEwpOworCQkJQVNTRVJUKGlwLT5pX2QuZGlfbmV4dGVudHMgPiAwKTsKKwkJCUFTU0VSVChpaXAtPmlsaV9leHRlbnRzX2J1ZiA9PSBOVUxMKTsKKwkJCW5yZWNzID0gaXAtPmlfZGYuaWZfYnl0ZXMgLworCQkJCSh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJCQlBU1NFUlQobnJlY3MgPiAwKTsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJCQlpZiAobnJlY3MgPT0gaXAtPmlfZC5kaV9uZXh0ZW50cykgeworCQkJCS8qCisJCQkJICogVGhlcmUgYXJlIG5vIGRlbGF5ZWQgYWxsb2NhdGlvbgorCQkJCSAqIGV4dGVudHMsIHNvIGp1c3QgcG9pbnQgdG8gdGhlCisJCQkJICogcmVhbCBleHRlbnRzIGFycmF5LgorCQkJCSAqLworCQkJCXZlY3AtPmlfYWRkciA9CisJCQkJCShjaGFyICopKGlwLT5pX2RmLmlmX3UxLmlmX2V4dGVudHMpOworCQkJCXZlY3AtPmlfbGVuID0gaXAtPmlfZGYuaWZfYnl0ZXM7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJeworCQkJCS8qCisJCQkJICogVGhlcmUgYXJlIGRlbGF5ZWQgYWxsb2NhdGlvbiBleHRlbnRzCisJCQkJICogaW4gdGhlIGlub2RlLCBvciB3ZSBuZWVkIHRvIGNvbnZlcnQKKwkJCQkgKiB0aGUgZXh0ZW50cyB0byBvbiBkaXNrIGZvcm1hdC4KKwkJCQkgKiBVc2UgeGZzX2lleHRlbnRzX2NvcHkoKQorCQkJCSAqIHRvIGNvcHkgb25seSB0aGUgcmVhbCBleHRlbnRzIGludG8KKwkJCQkgKiBhIHNlcGFyYXRlIGJ1ZmZlci4gIFdlJ2xsIGZyZWUgdGhlCisJCQkJICogYnVmZmVyIGluIHRoZSB1bmxvY2sgcm91dGluZS4KKwkJCQkgKi8KKwkJCQlleHRfYnVmZmVyID0ga21lbV9hbGxvYyhpcC0+aV9kZi5pZl9ieXRlcywKKwkJCQkJS01fU0xFRVApOworCQkJCWlpcC0+aWxpX2V4dGVudHNfYnVmID0gZXh0X2J1ZmZlcjsKKwkJCQl2ZWNwLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpZXh0X2J1ZmZlcjsKKwkJCQl2ZWNwLT5pX2xlbiA9IHhmc19pZXh0ZW50c19jb3B5KGlwLCBleHRfYnVmZmVyLAorCQkJCQkJWEZTX0RBVEFfRk9SSyk7CisJCQl9CisJCQlBU1NFUlQodmVjcC0+aV9sZW4gPD0gaXAtPmlfZGYuaWZfYnl0ZXMpOworCQkJaWlwLT5pbGlfZm9ybWF0LmlsZl9kc2l6ZSA9IHZlY3AtPmlfbGVuOworCQkJdmVjcCsrOworCQkJbnZlY3MrKzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgWEZTX0RJTk9ERV9GTVRfQlRSRUU6CisJCUFTU0VSVCghKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYKKwkJCSAoWEZTX0lMT0dfRERBVEEgfCBYRlNfSUxPR19ERVhUIHwKKwkJCSAgWEZTX0lMT0dfREVWIHwgWEZTX0lMT0dfVVVJRCkpKTsKKwkJaWYgKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgWEZTX0lMT0dfREJST09UKSB7CisJCQlBU1NFUlQoaXAtPmlfZGYuaWZfYnJvb3RfYnl0ZXMgPiAwKTsKKwkJCUFTU0VSVChpcC0+aV9kZi5pZl9icm9vdCAhPSBOVUxMKTsKKwkJCXZlY3AtPmlfYWRkciA9ICh4ZnNfY2FkZHJfdClpcC0+aV9kZi5pZl9icm9vdDsKKwkJCXZlY3AtPmlfbGVuID0gaXAtPmlfZGYuaWZfYnJvb3RfYnl0ZXM7CisJCQl2ZWNwKys7CisJCQludmVjcysrOworCQkJaWlwLT5pbGlfZm9ybWF0LmlsZl9kc2l6ZSA9IGlwLT5pX2RmLmlmX2Jyb290X2J5dGVzOworCQl9CisJCWJyZWFrOworCisJY2FzZSBYRlNfRElOT0RFX0ZNVF9MT0NBTDoKKwkJQVNTRVJUKCEoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJgorCQkJIChYRlNfSUxPR19EQlJPT1QgfCBYRlNfSUxPR19ERVhUIHwKKwkJCSAgWEZTX0lMT0dfREVWIHwgWEZTX0lMT0dfVVVJRCkpKTsKKwkJaWYgKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgWEZTX0lMT0dfRERBVEEpIHsKKwkJCUFTU0VSVChpcC0+aV9kZi5pZl9ieXRlcyA+IDApOworCQkJQVNTRVJUKGlwLT5pX2RmLmlmX3UxLmlmX2RhdGEgIT0gTlVMTCk7CisJCQlBU1NFUlQoaXAtPmlfZC5kaV9zaXplID4gMCk7CisKKwkJCXZlY3AtPmlfYWRkciA9ICh4ZnNfY2FkZHJfdClpcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCQkJLyoKKwkJCSAqIFJvdW5kIGlfYnl0ZXMgdXAgdG8gYSB3b3JkIGJvdW5kYXJ5LgorCQkJICogVGhlIHVuZGVybHlpbmcgbWVtb3J5IGlzIGd1YXJhbnRlZWQgdG8KKwkJCSAqIHRvIGJlIHRoZXJlIGJ5IHhmc19pZGF0YV9yZWFsbG9jKCkuCisJCQkgKi8KKwkJCWRhdGFfYnl0ZXMgPSByb3VuZHVwKGlwLT5pX2RmLmlmX2J5dGVzLCA0KTsKKwkJCUFTU0VSVCgoaXAtPmlfZGYuaWZfcmVhbF9ieXRlcyA9PSAwKSB8fAorCQkJICAgICAgIChpcC0+aV9kZi5pZl9yZWFsX2J5dGVzID09IGRhdGFfYnl0ZXMpKTsKKwkJCXZlY3AtPmlfbGVuID0gKGludClkYXRhX2J5dGVzOworCQkJdmVjcCsrOworCQkJbnZlY3MrKzsKKwkJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfZHNpemUgPSAodW5zaWduZWQpZGF0YV9ieXRlczsKKwkJfQorCQlicmVhazsKKworCWNhc2UgWEZTX0RJTk9ERV9GTVRfREVWOgorCQlBU1NFUlQoIShpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmCisJCQkgKFhGU19JTE9HX0RCUk9PVCB8IFhGU19JTE9HX0RFWFQgfAorCQkJICBYRlNfSUxPR19EREFUQSB8IFhGU19JTE9HX1VVSUQpKSk7CisJCWlmIChpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX0RFVikgeworCQkJaWlwLT5pbGlfZm9ybWF0LmlsZl91LmlsZnVfcmRldiA9CisJCQkJaXAtPmlfZGYuaWZfdTIuaWZfcmRldjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgWEZTX0RJTk9ERV9GTVRfVVVJRDoKKwkJQVNTRVJUKCEoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJgorCQkJIChYRlNfSUxPR19EQlJPT1QgfCBYRlNfSUxPR19ERVhUIHwKKwkJCSAgWEZTX0lMT0dfRERBVEEgfCBYRlNfSUxPR19ERVYpKSk7CisJCWlmIChpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX1VVSUQpIHsKKwkJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfdS5pbGZ1X3V1aWQgPQorCQkJCWlwLT5pX2RmLmlmX3UyLmlmX3V1aWQ7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJCWJyZWFrOworCX0KKworCS8qCisJICogSWYgdGhlcmUgYXJlIG5vIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlLAorCSAqIHRoZW4gd2UncmUgZG9uZS4KKwkgKiBBc3NlcnQgdGhhdCBubyBhdHRyaWJ1dGUtcmVsYXRlZCBsb2cgZmxhZ3MgYXJlIHNldC4KKwkgKi8KKwlpZiAoIVhGU19JRk9SS19RKGlwKSkgeworCQlBU1NFUlQobnZlY3MgPT0gaWlwLT5pbGlfaXRlbS5saV9kZXNjLT5saWRfc2l6ZSk7CisJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfc2l6ZSA9IG52ZWNzOworCQlBU1NFUlQoIShpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmCisJCQkgKFhGU19JTE9HX0FEQVRBIHwgWEZTX0lMT0dfQUJST09UIHwgWEZTX0lMT0dfQUVYVCkpKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoaXAtPmlfZC5kaV9hZm9ybWF0KSB7CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTOgorCQlBU1NFUlQoIShpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmCisJCQkgKFhGU19JTE9HX0FEQVRBIHwgWEZTX0lMT0dfQUJST09UKSkpOworCQlpZiAoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJiBYRlNfSUxPR19BRVhUKSB7CisJCQlBU1NFUlQoaXAtPmlfYWZwLT5pZl9ieXRlcyA+IDApOworCQkJQVNTRVJUKGlwLT5pX2FmcC0+aWZfdTEuaWZfZXh0ZW50cyAhPSBOVUxMKTsKKwkJCUFTU0VSVChpcC0+aV9kLmRpX2FuZXh0ZW50cyA+IDApOworI2lmZGVmIERFQlVHCisJCQlucmVjcyA9IGlwLT5pX2FmcC0+aWZfYnl0ZXMgLworCQkJCSh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisjZW5kaWYKKwkJCUFTU0VSVChucmVjcyA+IDApOworCQkJQVNTRVJUKG5yZWNzID09IGlwLT5pX2QuZGlfYW5leHRlbnRzKTsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJCQkvKgorCQkJICogVGhlcmUgYXJlIG5vdCBkZWxheWVkIGFsbG9jYXRpb24gZXh0ZW50cworCQkJICogZm9yIGF0dHJpYnV0ZXMsIHNvIGp1c3QgcG9pbnQgYXQgdGhlIGFycmF5LgorCQkJICovCisJCQl2ZWNwLT5pX2FkZHIgPSAoY2hhciAqKShpcC0+aV9hZnAtPmlmX3UxLmlmX2V4dGVudHMpOworCQkJdmVjcC0+aV9sZW4gPSBpcC0+aV9hZnAtPmlmX2J5dGVzOworI2Vsc2UKKwkJCUFTU0VSVChpaXAtPmlsaV9hZXh0ZW50c19idWYgPT0gTlVMTCk7CisJCQkvKgorCQkJICogTmVlZCB0byBlbmRpYW4gZmxpcCBiZWZvcmUgbG9nZ2luZworCQkJICovCisJCQlleHRfYnVmZmVyID0ga21lbV9hbGxvYyhpcC0+aV9hZnAtPmlmX2J5dGVzLAorCQkJCUtNX1NMRUVQKTsKKwkJCWlpcC0+aWxpX2FleHRlbnRzX2J1ZiA9IGV4dF9idWZmZXI7CisJCQl2ZWNwLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpZXh0X2J1ZmZlcjsKKwkJCXZlY3AtPmlfbGVuID0geGZzX2lleHRlbnRzX2NvcHkoaXAsIGV4dF9idWZmZXIsCisJCQkJCVhGU19BVFRSX0ZPUkspOworI2VuZGlmCisJCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2FzaXplID0gdmVjcC0+aV9sZW47CisJCQl2ZWNwKys7CisJCQludmVjcysrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBYRlNfRElOT0RFX0ZNVF9CVFJFRToKKwkJQVNTRVJUKCEoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJgorCQkJIChYRlNfSUxPR19BREFUQSB8IFhGU19JTE9HX0FFWFQpKSk7CisJCWlmIChpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX0FCUk9PVCkgeworCQkJQVNTRVJUKGlwLT5pX2FmcC0+aWZfYnJvb3RfYnl0ZXMgPiAwKTsKKwkJCUFTU0VSVChpcC0+aV9hZnAtPmlmX2Jyb290ICE9IE5VTEwpOworCQkJdmVjcC0+aV9hZGRyID0gKHhmc19jYWRkcl90KWlwLT5pX2FmcC0+aWZfYnJvb3Q7CisJCQl2ZWNwLT5pX2xlbiA9IGlwLT5pX2FmcC0+aWZfYnJvb3RfYnl0ZXM7CisJCQl2ZWNwKys7CisJCQludmVjcysrOworCQkJaWlwLT5pbGlfZm9ybWF0LmlsZl9hc2l6ZSA9IGlwLT5pX2FmcC0+aWZfYnJvb3RfYnl0ZXM7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFhGU19ESU5PREVfRk1UX0xPQ0FMOgorCQlBU1NFUlQoIShpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmCisJCQkgKFhGU19JTE9HX0FCUk9PVCB8IFhGU19JTE9HX0FFWFQpKSk7CisJCWlmIChpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX0FEQVRBKSB7CisJCQlBU1NFUlQoaXAtPmlfYWZwLT5pZl9ieXRlcyA+IDApOworCQkJQVNTRVJUKGlwLT5pX2FmcC0+aWZfdTEuaWZfZGF0YSAhPSBOVUxMKTsKKworCQkJdmVjcC0+aV9hZGRyID0gKHhmc19jYWRkcl90KWlwLT5pX2FmcC0+aWZfdTEuaWZfZGF0YTsKKwkJCS8qCisJCQkgKiBSb3VuZCBpX2J5dGVzIHVwIHRvIGEgd29yZCBib3VuZGFyeS4KKwkJCSAqIFRoZSB1bmRlcmx5aW5nIG1lbW9yeSBpcyBndWFyYW50ZWVkIHRvCisJCQkgKiB0byBiZSB0aGVyZSBieSB4ZnNfaWRhdGFfcmVhbGxvYygpLgorCQkJICovCisJCQlkYXRhX2J5dGVzID0gcm91bmR1cChpcC0+aV9hZnAtPmlmX2J5dGVzLCA0KTsKKwkJCUFTU0VSVCgoaXAtPmlfYWZwLT5pZl9yZWFsX2J5dGVzID09IDApIHx8CisJCQkgICAgICAgKGlwLT5pX2FmcC0+aWZfcmVhbF9ieXRlcyA9PSBkYXRhX2J5dGVzKSk7CisJCQl2ZWNwLT5pX2xlbiA9IChpbnQpZGF0YV9ieXRlczsKKwkJCXZlY3ArKzsKKwkJCW52ZWNzKys7CisJCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2FzaXplID0gKHVuc2lnbmVkKWRhdGFfYnl0ZXM7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJCWJyZWFrOworCX0KKworCUFTU0VSVChudmVjcyA9PSBpaXAtPmlsaV9pdGVtLmxpX2Rlc2MtPmxpZF9zaXplKTsKKwlpaXAtPmlsaV9mb3JtYXQuaWxmX3NpemUgPSBudmVjczsKK30KKworCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gcGluIHRoZSBpbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGlub2RlIGxvZworICogaXRlbSBpbiBtZW1vcnkgc28gaXQgY2Fubm90IGJlIHdyaXR0ZW4gb3V0LiAgRG8gdGhpcyBieSBjYWxsaW5nCisgKiB4ZnNfaXBpbigpIHRvIGJ1bXAgdGhlIHBpbiBjb3VudCBpbiB0aGUgaW5vZGUgd2hpbGUgaG9sZGluZyB0aGUKKyAqIGlub2RlIHBpbiBsb2NrLgorICovCitTVEFUSUMgdm9pZAoreGZzX2lub2RlX2l0ZW1fcGluKAorCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXApCit7CisJQVNTRVJUKGlzbXJsb2NrZWQoJihpaXAtPmlsaV9pbm9kZS0+aV9sb2NrKSwgTVJfVVBEQVRFKSk7CisJeGZzX2lwaW4oaWlwLT5pbGlfaW5vZGUpOworfQorCisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byB1bnBpbiB0aGUgaW5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbm9kZSBsb2cKKyAqIGl0ZW0gd2hpY2ggd2FzIHByZXZpb3VzbHkgcGlubmVkIHdpdGggYSBjYWxsIHRvIHhmc19pbm9kZV9pdGVtX3BpbigpLgorICogSnVzdCBjYWxsIHhmc19pdW5waW4oKSBvbiB0aGUgaW5vZGUgdG8gZG8gdGhpcy4KKyAqLworLyogQVJHU1VTRUQgKi8KK1NUQVRJQyB2b2lkCit4ZnNfaW5vZGVfaXRlbV91bnBpbigKKwl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwLAorCWludAkJCXN0YWxlKQoreworCXhmc19pdW5waW4oaWlwLT5pbGlfaW5vZGUpOworfQorCisvKiBBUkdTVVNFRCAqLworU1RBVElDIHZvaWQKK3hmc19pbm9kZV9pdGVtX3VucGluX3JlbW92ZSgKKwl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwLAorCXhmc190cmFuc190CQkqdHApCit7CisJeGZzX2l1bnBpbihpaXAtPmlsaV9pbm9kZSk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byBhdHRlbXB0IHRvIGxvY2sgdGhlIGlub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiBpbm9kZSBsb2cgaXRlbSwgaW4gcHJlcGFyYXRpb24gZm9yIHRoZSBwdXNoIHJvdXRpbmUgd2hpY2ggZG9lcyB0aGUgYWN0dWFsCisgKiBpZmx1c2guICBEb24ndCBzbGVlcCBvbiB0aGUgaW5vZGUgbG9jayBvciB0aGUgZmx1c2ggbG9jay4KKyAqCisgKiBJZiB0aGUgZmx1c2ggbG9jayBpcyBhbHJlYWR5IGhlbGQsIGluZGljYXRpbmcgdGhhdCB0aGUgaW5vZGUgaGFzCisgKiBiZWVuIG9yIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGZsdXNoZWQsIHRoZW4gKGlkZWFsbHkpIHdlJ2QgbGlrZSB0bworICogc2VlIGlmIHRoZSBpbm9kZSdzIGJ1ZmZlciBpcyBzdGlsbCBpbmNvcmUsIGFuZCBpZiBzbyBnaXZlIGl0IGEgbnVkZ2UuCisgKiBXZSBkZWxheSBkb2luZyBzbyB1bnRpbCB0aGUgcHVzaGJ1ZiByb3V0aW5lLCB0aG91Z2gsIHRvIGF2b2lkIGhvbGRpbmcKKyAqIHRoZSBBSUwgbG9jayBhY3Jvc3MgYSBjYWxsIHRvIHRoZSBibGFja2hvbGUgd2hpY2ggaXMgdGhlIGJ1ZmZlcmNhY2hlLgorICogQWxzbyB3ZSBkb24ndCB3YW50IHRvIHNsZWVwIGluIGFueSBkZXZpY2Ugc3RyYXRlZ3kgcm91dGluZXMsIHdoaWNoIGNhbiBoYXBwZW4KKyAqIGlmIHdlIGRvIHRoZSBzdWJzZXF1ZW50IGJhd3JpdGUgaW4gaGVyZS4KKyAqLworU1RBVElDIHVpbnQKK3hmc19pbm9kZV9pdGVtX3RyeWxvY2soCisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcCkKK3sKKwlyZWdpc3RlciB4ZnNfaW5vZGVfdAkqaXA7CisKKwlpcCA9IGlpcC0+aWxpX2lub2RlOworCisJaWYgKHhmc19pcGluY291bnQoaXApID4gMCkgeworCQlyZXR1cm4gWEZTX0lURU1fUElOTkVEOworCX0KKworCWlmICgheGZzX2lsb2NrX25vd2FpdChpcCwgWEZTX0lMT0NLX1NIQVJFRCkpIHsKKwkJcmV0dXJuIFhGU19JVEVNX0xPQ0tFRDsKKwl9CisKKwlpZiAoIXhmc19pZmxvY2tfbm93YWl0KGlwKSkgeworCQkvKgorCQkgKiBJZiBzb21lb25lIGVsc2UgaXNuJ3QgYWxyZWFkeSB0cnlpbmcgdG8gcHVzaCB0aGUgaW5vZGUKKwkJICogYnVmZmVyLCB3ZSBnZXQgdG8gZG8gaXQuCisJCSAqLworCQlpZiAoaWlwLT5pbGlfcHVzaGJ1Zl9mbGFnID09IDApIHsKKwkJCWlpcC0+aWxpX3B1c2hidWZfZmxhZyA9IDE7CisjaWZkZWYgREVCVUcKKwkJCWlpcC0+aWxpX3B1c2hfb3duZXIgPSBnZXRfdGhyZWFkX2lkKCk7CisjZW5kaWYKKwkJCS8qCisJCQkgKiBJbm9kZSBpcyBsZWZ0IGxvY2tlZCBpbiBzaGFyZWQgbW9kZS4KKwkJCSAqIFB1c2hidWYgcm91dGluZSBnZXRzIHRvIHVubG9jayBpdC4KKwkJCSAqLworCQkJcmV0dXJuIFhGU19JVEVNX1BVU0hCVUY7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2UgaG9sZCB0aGUgQUlMX0xPQ0ssIHNvIHdlIG11c3Qgc3BlY2lmeSB0aGUKKwkJCSAqIE5PTk9USUZZIGZsYWcgc28gdGhhdCB3ZSB3b24ndCBkb3VibGUgdHJpcC4KKwkJCSAqLworCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUR8WEZTX0lVTkxPQ0tfTk9OT1RJRlkpOworCQkJcmV0dXJuIFhGU19JVEVNX0ZMVVNISU5HOworCQl9CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisKKwkvKiBTdGFsZSBpdGVtcyBzaG91bGQgZm9yY2Ugb3V0IHRoZSBpY2xvZyAqLworCWlmIChpcC0+aV9mbGFncyAmIFhGU19JU1RBTEUpIHsKKwkJeGZzX2lmdW5sb2NrKGlwKTsKKwkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUR8WEZTX0lVTkxPQ0tfTk9OT1RJRlkpOworCQlyZXR1cm4gWEZTX0lURU1fUElOTkVEOworCX0KKworI2lmZGVmIERFQlVHCisJaWYgKCFYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSkgeworCQlBU1NFUlQoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgIT0gMCk7CisJCUFTU0VSVChpaXAtPmlsaV9sb2dnZWQgPT0gMCk7CisJCUFTU0VSVChpaXAtPmlsaV9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCk7CisJfQorI2VuZGlmCisJcmV0dXJuIFhGU19JVEVNX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBVbmxvY2sgdGhlIGlub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5vZGUgbG9nIGl0ZW0uCisgKiBDbGVhciB0aGUgZmllbGRzIG9mIHRoZSBpbm9kZSBhbmQgaW5vZGUgbG9nIGl0ZW0gdGhhdAorICogYXJlIHNwZWNpZmljIHRvIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgSWYgdGhlCisgKiBob2xkIGZsYWdzIGlzIHNldCwgZG8gbm90IHVubG9jayB0aGUgaW5vZGUuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfaW5vZGVfaXRlbV91bmxvY2soCisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcCkKK3sKKwl1aW50CQlob2xkOworCXVpbnQJCWlvbG9ja2VkOworCXVpbnQJCWxvY2tfZmxhZ3M7CisJeGZzX2lub2RlX3QJKmlwOworCisJQVNTRVJUKGlpcCAhPSBOVUxMKTsKKwlBU1NFUlQoaWlwLT5pbGlfaW5vZGUtPmlfaXRlbXAgIT0gTlVMTCk7CisJQVNTRVJUKGlzbXJsb2NrZWQoJihpaXAtPmlsaV9pbm9kZS0+aV9sb2NrKSwgTVJfVVBEQVRFKSk7CisJQVNTRVJUKCghKGlpcC0+aWxpX2lub2RlLT5pX2l0ZW1wLT5pbGlfZmxhZ3MgJgorCQkgIFhGU19JTElfSU9MT0NLRURfRVhDTCkpIHx8CisJICAgICAgIGlzbXJsb2NrZWQoJihpaXAtPmlsaV9pbm9kZS0+aV9pb2xvY2spLCBNUl9VUERBVEUpKTsKKwlBU1NFUlQoKCEoaWlwLT5pbGlfaW5vZGUtPmlfaXRlbXAtPmlsaV9mbGFncyAmCisJCSAgWEZTX0lMSV9JT0xPQ0tFRF9TSEFSRUQpKSB8fAorCSAgICAgICBpc21ybG9ja2VkKCYoaWlwLT5pbGlfaW5vZGUtPmlfaW9sb2NrKSwgTVJfQUNDRVNTKSk7CisJLyoKKwkgKiBDbGVhciB0aGUgdHJhbnNhY3Rpb24gcG9pbnRlciBpbiB0aGUgaW5vZGUuCisJICovCisJaXAgPSBpaXAtPmlsaV9pbm9kZTsKKwlpcC0+aV90cmFuc3AgPSBOVUxMOworCisJLyoKKwkgKiBJZiB0aGUgaW5vZGUgbmVlZGVkIGEgc2VwYXJhdGUgYnVmZmVyIHdpdGggd2hpY2ggdG8gbG9nCisJICogaXRzIGV4dGVudHMsIHRoZW4gZnJlZSBpdCBub3cuCisJICovCisJaWYgKGlpcC0+aWxpX2V4dGVudHNfYnVmICE9IE5VTEwpIHsKKwkJQVNTRVJUKGlwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMpOworCQlBU1NFUlQoaXAtPmlfZC5kaV9uZXh0ZW50cyA+IDApOworCQlBU1NFUlQoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJiBYRlNfSUxPR19ERVhUKTsKKwkJQVNTRVJUKGlwLT5pX2RmLmlmX2J5dGVzID4gMCk7CisJCWttZW1fZnJlZShpaXAtPmlsaV9leHRlbnRzX2J1ZiwgaXAtPmlfZGYuaWZfYnl0ZXMpOworCQlpaXAtPmlsaV9leHRlbnRzX2J1ZiA9IE5VTEw7CisJfQorCWlmIChpaXAtPmlsaV9hZXh0ZW50c19idWYgIT0gTlVMTCkgeworCQlBU1NFUlQoaXAtPmlfZC5kaV9hZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMpOworCQlBU1NFUlQoaXAtPmlfZC5kaV9hbmV4dGVudHMgPiAwKTsKKwkJQVNTRVJUKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgWEZTX0lMT0dfQUVYVCk7CisJCUFTU0VSVChpcC0+aV9hZnAtPmlmX2J5dGVzID4gMCk7CisJCWttZW1fZnJlZShpaXAtPmlsaV9hZXh0ZW50c19idWYsIGlwLT5pX2FmcC0+aWZfYnl0ZXMpOworCQlpaXAtPmlsaV9hZXh0ZW50c19idWYgPSBOVUxMOworCX0KKworCS8qCisJICogRmlndXJlIG91dCBpZiB3ZSBzaG91bGQgdW5sb2NrIHRoZSBpbm9kZSBvciBub3QuCisJICovCisJaG9sZCA9IGlpcC0+aWxpX2ZsYWdzICYgWEZTX0lMSV9IT0xEOworCisJLyoKKwkgKiBCZWZvcmUgY2xlYXJpbmcgb3V0IHRoZSBmbGFncywgcmVtZW1iZXIgd2hldGhlciB3ZQorCSAqIGFyZSBob2xkaW5nIHRoZSBpbm9kZSdzIElPIGxvY2suCisJICovCisJaW9sb2NrZWQgPSBpaXAtPmlsaV9mbGFncyAmIFhGU19JTElfSU9MT0NLRURfQU5ZOworCisJLyoKKwkgKiBDbGVhciBvdXQgdGhlIGZpZWxkcyBvZiB0aGUgaW5vZGUgbG9nIGl0ZW0gcGFydGljdWxhcgorCSAqIHRvIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgorCSAqLworCWlpcC0+aWxpX2lsb2NrX3JlY3VyID0gMDsKKwlpaXAtPmlsaV9pb2xvY2tfcmVjdXIgPSAwOworCWlpcC0+aWxpX2ZsYWdzID0gMDsKKworCS8qCisJICogVW5sb2NrIHRoZSBpbm9kZSBpZiBYRlNfSUxJX0hPTEQgd2FzIG5vdCBzZXQuCisJICovCisJaWYgKCFob2xkKSB7CisJCWxvY2tfZmxhZ3MgPSBYRlNfSUxPQ0tfRVhDTDsKKwkJaWYgKGlvbG9ja2VkICYgWEZTX0lMSV9JT0xPQ0tFRF9FWENMKSB7CisJCQlsb2NrX2ZsYWdzIHw9IFhGU19JT0xPQ0tfRVhDTDsKKwkJfSBlbHNlIGlmIChpb2xvY2tlZCAmIFhGU19JTElfSU9MT0NLRURfU0hBUkVEKSB7CisJCQlsb2NrX2ZsYWdzIHw9IFhGU19JT0xPQ0tfU0hBUkVEOworCQl9CisJCXhmc19pcHV0KGlpcC0+aWxpX2lub2RlLCBsb2NrX2ZsYWdzKTsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byBmaW5kIG91dCB3aGVyZSB0aGUgb2xkZXN0IGFjdGl2ZSBjb3B5IG9mIHRoZQorICogaW5vZGUgbG9nIGl0ZW0gaW4gdGhlIG9uIGRpc2sgbG9nIHJlc2lkZXMgbm93IHRoYXQgdGhlIGxhc3QgbG9nCisgKiB3cml0ZSBvZiBpdCBjb21wbGV0ZWQgYXQgdGhlIGdpdmVuIGxzbi4gIFNpbmNlIHdlIGFsd2F5cyByZS1sb2cKKyAqIGFsbCBkaXJ0eSBkYXRhIGluIGFuIGlub2RlLCB0aGUgbGF0ZXN0IGNvcHkgaW4gdGhlIG9uIGRpc2sgbG9nCisgKiBpcyB0aGUgb25seSBvbmUgdGhhdCBtYXR0ZXJzLiAgVGhlcmVmb3JlLCBzaW1wbHkgcmV0dXJuIHRoZQorICogZ2l2ZW4gbHNuLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB4ZnNfbHNuX3QKK3hmc19pbm9kZV9pdGVtX2NvbW1pdHRlZCgKKwl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwLAorCXhmc19sc25fdAkJbHNuKQoreworCXJldHVybiAobHNuKTsKK30KKworLyoKKyAqIFRoZSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBpbm9kZSBsb2NrZWQgaGFzIGFib3J0ZWQuICBUaGUgaW5vZGUKKyAqIG11c3Qgbm90IGJlIGRpcnR5IHdpdGhpbiB0aGUgdHJhbnNhY3Rpb24gKHVubGVzcyB3ZSdyZSBmb3JjaWJseQorICogc2h1dHRpbmcgZG93bikuICBXZSBzaW1wbHkgdW5sb2NrIGp1c3QgYXMgaWYgdGhlIHRyYW5zYWN0aW9uCisgKiBoYWQgYmVlbiBjYW5jZWxsZWQuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfaW5vZGVfaXRlbV9hYm9ydCgKKwl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwKQoreworCXhmc19pbm9kZV9pdGVtX3VubG9jayhpaXApOworCXJldHVybjsKK30KKworCisvKgorICogVGhpcyBnZXRzIGNhbGxlZCBieSB4ZnNfdHJhbnNfcHVzaF9haWwoKSwgd2hlbiBJT1BfVFJZTE9DSworICogZmFpbGVkIHRvIGdldCB0aGUgaW5vZGUgZmx1c2ggbG9jayBidXQgZGlkIGdldCB0aGUgaW5vZGUgbG9ja2VkIFNIQVJFRC4KKyAqIEhlcmUgd2UncmUgdHJ5aW5nIHRvIHNlZSBpZiB0aGUgaW5vZGUgYnVmZmVyIGlzIGluY29yZSwgYW5kIGlmIHNvIHdoZXRoZXIgaXQncworICogbWFya2VkIGRlbGF5ZWQgd3JpdGUuIElmIHRoYXQncyB0aGUgY2FzZSwgd2UnbGwgaW5pdGlhdGUgYSBiYXdyaXRlIG9uIHRoYXQKKyAqIGJ1ZmZlciB0byBleHBlZGl0ZSB0aGUgcHJvY2Vzcy4KKyAqCisgKiBXZSBhcmVuJ3QgaG9sZGluZyB0aGUgQUlMX0xPQ0sgKG9yIHRoZSBmbHVzaCBsb2NrKSB3aGVuIHRoaXMgZ2V0cyBjYWxsZWQsCisgKiBzbyBpdCBpcyBpbmhlcmVudGx5IHJhY2UteS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19pbm9kZV9pdGVtX3B1c2hidWYoCisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcCkKK3sKKwl4ZnNfaW5vZGVfdAkqaXA7CisJeGZzX21vdW50X3QJKm1wOworCXhmc19idWZfdAkqYnA7CisJdWludAkJZG9wdXNoOworCisJaXAgPSBpaXAtPmlsaV9pbm9kZTsKKworCUFTU0VSVChpc21ybG9ja2VkKCYoaXAtPmlfbG9jayksIE1SX0FDQ0VTUykpOworCisJLyoKKwkgKiBUaGUgaWxpX3B1c2hidWZfZmxhZyBrZWVwcyBvdGhlcnMgZnJvbQorCSAqIHRyeWluZyB0byBkdXBsaWNhdGUgb3VyIGVmZm9ydC4KKwkgKi8KKwlBU1NFUlQoaWlwLT5pbGlfcHVzaGJ1Zl9mbGFnICE9IDApOworCUFTU0VSVChpaXAtPmlsaV9wdXNoX293bmVyID09IGdldF90aHJlYWRfaWQoKSk7CisKKwkvKgorCSAqIElmIGZsdXNobG9jayBpc24ndCBsb2NrZWQgYW55bW9yZSwgY2hhbmNlcyBhcmUgdGhhdCB0aGUKKwkgKiBpbm9kZSBmbHVzaCBjb21wbGV0ZWQgYW5kIHRoZSBpbm9kZSB3YXMgdGFrZW4gb2ZmIHRoZSBBSUwuCisJICogU28sIGp1c3QgZ2V0IG91dC4KKwkgKi8KKwlpZiAoKHZhbHVzZW1hKCYoaXAtPmlfZmxvY2spKSA+IDApICB8fAorCSAgICAoKGlpcC0+aWxpX2l0ZW0ubGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSA9PSAwKSkgeworCQlpaXAtPmlsaV9wdXNoYnVmX2ZsYWcgPSAwOworCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJCXJldHVybjsKKwl9CisKKwltcCA9IGlwLT5pX21vdW50OworCWJwID0geGZzX2luY29yZShtcC0+bV9kZGV2X3RhcmdwLCBpaXAtPmlsaV9mb3JtYXQuaWxmX2Jsa25vLAorCQkgICAgaWlwLT5pbGlfZm9ybWF0LmlsZl9sZW4sIFhGU19JTkNPUkVfVFJZTE9DSyk7CisKKwlpZiAoYnAgIT0gTlVMTCkgeworCQlpZiAoWEZTX0JVRl9JU0RFTEFZV1JJVEUoYnApKSB7CisJCQkvKgorCQkJICogV2Ugd2VyZSByYWNpbmcgd2l0aCBpZmx1c2ggYmVjYXVzZSB3ZSBkb24ndCBob2xkCisJCQkgKiB0aGUgQUlMX0xPQ0sgb3IgdGhlIGZsdXNoIGxvY2suIEhvd2V2ZXIsIGF0IHRoaXMgcG9pbnQsCisJCQkgKiB3ZSBoYXZlIHRoZSBidWZmZXIsIGFuZCB3ZSBrbm93IHRoYXQgaXQncyBkaXJ0eS4KKwkJCSAqIFNvLCBpdCdzIHBvc3NpYmxlIHRoYXQgaWZsdXNoIHJhY2VkIHdpdGggdXMsIGFuZAorCQkJICogdGhpcyBpdGVtIGlzIGFscmVhZHkgdGFrZW4gb2ZmIHRoZSBBSUwuCisJCQkgKiBJZiBub3QsIHdlIGNhbiBmbHVzaCBpdCBhc3luYy4KKwkJCSAqLworCQkJZG9wdXNoID0gKChpaXAtPmlsaV9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkgJiYKKwkJCQkgICh2YWx1c2VtYSgmKGlwLT5pX2Zsb2NrKSkgPD0gMCkpOworCQkJaWlwLT5pbGlfcHVzaGJ1Zl9mbGFnID0gMDsKKwkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwkJCXhmc19idWZ0cmFjZSgiSU5PREUgSVRFTSBQVVNIIiwgYnApOworCQkJaWYgKFhGU19CVUZfSVNQSU5ORUQoYnApKSB7CisJCQkJeGZzX2xvZ19mb3JjZShtcCwgKHhmc19sc25fdCkwLAorCQkJCQkgICAgICBYRlNfTE9HX0ZPUkNFKTsKKwkJCX0KKwkJCWlmIChkb3B1c2gpIHsKKwkJCQl4ZnNfYmF3cml0ZShtcCwgYnApOworCQkJfSBlbHNlIHsKKwkJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlpcC0+aWxpX3B1c2hidWZfZmxhZyA9IDA7CisJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJfQorCQlyZXR1cm47CisJfQorCS8qCisJICogV2UgaGF2ZSB0byBiZSBjYXJlZnVsIGFib3V0IHJlc2V0dGluZyBwdXNoYnVmIGZsYWcgdG9vIGVhcmx5IChhYm92ZSkuCisJICogRXZlbiB0aG91Z2ggaW4gdGhlb3J5IHdlIGNhbiBkbyBpdCBhcyBzb29uIGFzIHdlIGhhdmUgdGhlIGJ1ZmxvY2ssCisJICogd2UgZG9uJ3Qgd2FudCBvdGhlcnMgdG8gYmUgZG9pbmcgd29yayBuZWVkbGVzc2x5LiBUaGV5J2xsIGNvbWUgdG8KKwkgKiB0aGlzIGZ1bmN0aW9uIHRoaW5raW5nIHRoYXQgcHVzaGluZyB0aGUgYnVmZmVyIGlzIHRoZWlyCisJICogcmVzcG9uc2liaWxpdHkgb25seSB0byBmaW5kIHRoYXQgdGhlIGJ1ZmZlciBpcyBzdGlsbCBsb2NrZWQgYnkKKwkgKiBhbm90aGVyIGRvaW5nIHRoZSBzYW1lIHRoaW5nCisJICovCisJaWlwLT5pbGlfcHVzaGJ1Zl9mbGFnID0gMDsKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJcmV0dXJuOworfQorCisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byBhc3luY2hyb25vdXNseSB3cml0ZSB0aGUgaW5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAqIGlub2RlIGxvZyBpdGVtIG91dCB0byBkaXNrLiBUaGUgaW5vZGUgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBsb2NrZWQgYnkKKyAqIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIHhmc19pbm9kZV9pdGVtX3RyeWxvY2soKS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19pbm9kZV9pdGVtX3B1c2goCisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcCkKK3sKKwl4ZnNfaW5vZGVfdAkqaXA7CisKKwlpcCA9IGlpcC0+aWxpX2lub2RlOworCisJQVNTRVJUKGlzbXJsb2NrZWQoJihpcC0+aV9sb2NrKSwgTVJfQUNDRVNTKSk7CisJQVNTRVJUKHZhbHVzZW1hKCYoaXAtPmlfZmxvY2spKSA8PSAwKTsKKwkvKgorCSAqIFNpbmNlIHdlIHdlcmUgYWJsZSB0byBsb2NrIHRoZSBpbm9kZSdzIGZsdXNoIGxvY2sgYW5kCisJICogd2UgZm91bmQgaXQgb24gdGhlIEFJTCwgdGhlIGlub2RlIG11c3QgYmUgZGlydHkuICBUaGlzCisJICogaXMgYmVjYXVzZSB0aGUgaW5vZGUgaXMgcmVtb3ZlZCBmcm9tIHRoZSBBSUwgd2hpbGUgc3RpbGwKKwkgKiBob2xkaW5nIHRoZSBmbHVzaCBsb2NrIGluIHhmc19pZmx1c2hfZG9uZSgpLiAgVGh1cywgaWYKKwkgKiB3ZSBmb3VuZCBpdCBpbiB0aGUgQUlMIGFuZCB3ZXJlIGFibGUgdG8gb2J0YWluIHRoZSBmbHVzaAorCSAqIGxvY2sgd2l0aG91dCBzbGVlcGluZywgdGhlbiB0aGVyZSBtdXN0IG5vdCBoYXZlIGJlZW4KKwkgKiBhbnlvbmUgaW4gdGhlIHByb2Nlc3Mgb2YgZmx1c2hpbmcgdGhlIGlub2RlLgorCSAqLworCUFTU0VSVChYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSB8fAorCSAgICAgICBpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAhPSAwKTsKKworCS8qCisJICogV3JpdGUgb3V0IHRoZSBpbm9kZS4gIFRoZSBjb21wbGV0aW9uIHJvdXRpbmUgKCdpZmx1c2hfZG9uZScpIHdpbGwKKwkgKiBwdWxsIGl0IGZyb20gdGhlIEFJTCwgbWFyayBpdCBjbGVhbiwgdW5sb2NrIHRoZSBmbHVzaCBsb2NrLgorCSAqLworCSh2b2lkKSB4ZnNfaWZsdXNoKGlwLCBYRlNfSUZMVVNIX0FTWU5DKTsKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBYWFggcmNjIC0gdGhpcyBvbmUgcmVhbGx5IGhhcyB0byBkbyBzb21ldGhpbmcuICBQcm9iYWJseSBuZWVkcworICogdG8gc3RhbXAgaW4gYSBuZXcgZmllbGQgaW4gdGhlIGluY29yZSBpbm9kZS4KKyAqLworLyogQVJHU1VTRUQgKi8KK1NUQVRJQyB2b2lkCit4ZnNfaW5vZGVfaXRlbV9jb21taXR0aW5nKAorCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXAsCisJeGZzX2xzbl90CQlsc24pCit7CisJaWlwLT5pbGlfbGFzdF9sc24gPSBsc247CisJcmV0dXJuOworfQorCisvKgorICogVGhpcyBpcyB0aGUgb3BzIHZlY3RvciBzaGFyZWQgYnkgYWxsIGJ1ZiBsb2cgaXRlbXMuCisgKi8KK3N0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX2lub2RlX2l0ZW1fb3BzID0geworCS5pb3Bfc2l6ZQk9ICh1aW50KCopKHhmc19sb2dfaXRlbV90KikpeGZzX2lub2RlX2l0ZW1fc2l6ZSwKKwkuaW9wX2Zvcm1hdAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xvZ19pb3ZlY190KikpCisJCQkJCXhmc19pbm9kZV9pdGVtX2Zvcm1hdCwKKwkuaW9wX3Bpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX2lub2RlX2l0ZW1fcGluLAorCS5pb3BfdW5waW4JPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIGludCkpeGZzX2lub2RlX2l0ZW1fdW5waW4sCisJLmlvcF91bnBpbl9yZW1vdmUgPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc190cmFuc190KikpCisJCQkJCXhmc19pbm9kZV9pdGVtX3VucGluX3JlbW92ZSwKKwkuaW9wX3RyeWxvY2sJPSAodWludCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19pbm9kZV9pdGVtX3RyeWxvY2ssCisJLmlvcF91bmxvY2sJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19pbm9kZV9pdGVtX3VubG9jaywKKwkuaW9wX2NvbW1pdHRlZAk9ICh4ZnNfbHNuX3QoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfbHNuX3QpKQorCQkJCQl4ZnNfaW5vZGVfaXRlbV9jb21taXR0ZWQsCisJLmlvcF9wdXNoCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfaW5vZGVfaXRlbV9wdXNoLAorCS5pb3BfYWJvcnQJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19pbm9kZV9pdGVtX2Fib3J0LAorCS5pb3BfcHVzaGJ1Zgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX2lub2RlX2l0ZW1fcHVzaGJ1ZiwKKwkuaW9wX2NvbW1pdHRpbmcgPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sc25fdCkpCisJCQkJCXhmc19pbm9kZV9pdGVtX2NvbW1pdHRpbmcKK307CisKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGlub2RlIGxvZyBpdGVtIGZvciBhIG5ld2x5IGFsbG9jYXRlZCAoaW4tY29yZSkgaW5vZGUuCisgKi8KK3ZvaWQKK3hmc19pbm9kZV9pdGVtX2luaXQoCisJeGZzX2lub2RlX3QJKmlwLAorCXhmc19tb3VudF90CSptcCkKK3sKKwl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwOworCisJQVNTRVJUKGlwLT5pX2l0ZW1wID09IE5VTEwpOworCWlpcCA9IGlwLT5pX2l0ZW1wID0ga21lbV96b25lX3phbGxvYyh4ZnNfaWxpX3pvbmUsIEtNX1NMRUVQKTsKKworCWlpcC0+aWxpX2l0ZW0ubGlfdHlwZSA9IFhGU19MSV9JTk9ERTsKKwlpaXAtPmlsaV9pdGVtLmxpX29wcyA9ICZ4ZnNfaW5vZGVfaXRlbV9vcHM7CisJaWlwLT5pbGlfaXRlbS5saV9tb3VudHAgPSBtcDsKKwlpaXAtPmlsaV9pbm9kZSA9IGlwOworCisJLyoKKwkgICBXZSBoYXZlIHplcm9lZCBtZW1vcnkuIE5vIG5lZWQgLi4uCisJICAgaWlwLT5pbGlfZXh0ZW50c19idWYgPSBOVUxMOworCSAgIGlpcC0+aWxpX3B1c2hidWZfZmxhZyA9IDA7CisJICovCisKKwlpaXAtPmlsaV9mb3JtYXQuaWxmX3R5cGUgPSBYRlNfTElfSU5PREU7CisJaWlwLT5pbGlfZm9ybWF0LmlsZl9pbm8gPSBpcC0+aV9pbm87CisJaWlwLT5pbGlfZm9ybWF0LmlsZl9ibGtubyA9IGlwLT5pX2Jsa25vOworCWlpcC0+aWxpX2Zvcm1hdC5pbGZfbGVuID0gaXAtPmlfbGVuOworCWlpcC0+aWxpX2Zvcm1hdC5pbGZfYm9mZnNldCA9IGlwLT5pX2JvZmZzZXQ7Cit9CisKKy8qCisgKiBGcmVlIHRoZSBpbm9kZSBsb2cgaXRlbSBhbmQgYW55IG1lbW9yeSBoYW5naW5nIG9mZiBvZiBpdC4KKyAqLwordm9pZAoreGZzX2lub2RlX2l0ZW1fZGVzdHJveSgKKwl4ZnNfaW5vZGVfdAkqaXApCit7CisjaWZkZWYgWEZTX1RSQU5TX0RFQlVHCisJaWYgKGlwLT5pX2l0ZW1wLT5pbGlfcm9vdF9zaXplICE9IDApIHsKKwkJa21lbV9mcmVlKGlwLT5pX2l0ZW1wLT5pbGlfb3JpZ19yb290LAorCQkJICBpcC0+aV9pdGVtcC0+aWxpX3Jvb3Rfc2l6ZSk7CisJfQorI2VuZGlmCisJa21lbV96b25lX2ZyZWUoeGZzX2lsaV96b25lLCBpcC0+aV9pdGVtcCk7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgdGhlIGlub2RlIGZsdXNoaW5nIEkvTyBjb21wbGV0aW9uIHJvdXRpbmUuICBJdCBpcyBjYWxsZWQKKyAqIGZyb20gaW50ZXJydXB0IGxldmVsIHdoZW4gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBpbm9kZSBpcworICogZmx1c2hlZCB0byBkaXNrLiAgSXQgaXMgcmVzcG9uc2libGUgZm9yIHJlbW92aW5nIHRoZSBpbm9kZSBpdGVtCisgKiBmcm9tIHRoZSBBSUwgaWYgaXQgaGFzIG5vdCBiZWVuIHJlLWxvZ2dlZCwgYW5kIHVubG9ja2luZyB0aGUgaW5vZGUncworICogZmx1c2ggbG9jay4KKyAqLworLypBUkdTVVNFRCovCit2b2lkCit4ZnNfaWZsdXNoX2RvbmUoCisJeGZzX2J1Zl90CQkqYnAsCisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcCkKK3sKKwl4ZnNfaW5vZGVfdAkqaXA7CisJU1BMREVDTChzKTsKKworCWlwID0gaWlwLT5pbGlfaW5vZGU7CisKKwkvKgorCSAqIFdlIG9ubHkgd2FudCB0byBwdWxsIHRoZSBpdGVtIGZyb20gdGhlIEFJTCBpZiBpdCBpcworCSAqIGFjdHVhbGx5IHRoZXJlIGFuZCBpdHMgbG9jYXRpb24gaW4gdGhlIGxvZyBoYXMgbm90CisJICogY2hhbmdlZCBzaW5jZSB3ZSBzdGFydGVkIHRoZSBmbHVzaC4gIFRodXMsIHdlIG9ubHkgYm90aGVyCisJICogaWYgdGhlIGlsaV9sb2dnZWQgZmxhZyBpcyBzZXQgYW5kIHRoZSBpbm9kZSdzIGxzbiBoYXMgbm90CisJICogY2hhbmdlZC4gIEZpcnN0IHdlIGNoZWNrIHRoZSBsc24gb3V0c2lkZQorCSAqIHRoZSBsb2NrIHNpbmNlIGl0J3MgY2hlYXBlciwgYW5kIHRoZW4gd2UgcmVjaGVjayB3aGlsZQorCSAqIGhvbGRpbmcgdGhlIGxvY2sgYmVmb3JlIHJlbW92aW5nIHRoZSBpbm9kZSBmcm9tIHRoZSBBSUwuCisJICovCisJaWYgKGlpcC0+aWxpX2xvZ2dlZCAmJgorCSAgICAoaWlwLT5pbGlfaXRlbS5saV9sc24gPT0gaWlwLT5pbGlfZmx1c2hfbHNuKSkgeworCQlBSUxfTE9DSyhpcC0+aV9tb3VudCwgcyk7CisJCWlmIChpaXAtPmlsaV9pdGVtLmxpX2xzbiA9PSBpaXAtPmlsaV9mbHVzaF9sc24pIHsKKwkJCS8qCisJCQkgKiB4ZnNfdHJhbnNfZGVsZXRlX2FpbCgpIGRyb3BzIHRoZSBBSUwgbG9jay4KKwkJCSAqLworCQkJeGZzX3RyYW5zX2RlbGV0ZV9haWwoaXAtPmlfbW91bnQsCisJCQkJCSAgICAgKHhmc19sb2dfaXRlbV90KilpaXAsIHMpOworCQl9IGVsc2UgeworCQkJQUlMX1VOTE9DSyhpcC0+aV9tb3VudCwgcyk7CisJCX0KKwl9CisKKwlpaXAtPmlsaV9sb2dnZWQgPSAwOworCisJLyoKKwkgKiBDbGVhciB0aGUgaWxpX2xhc3RfZmllbGRzIGJpdHMgbm93IHRoYXQgd2Uga25vdyB0aGF0IHRoZQorCSAqIGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGVtIGlzIHNhZmVseSBvbiBkaXNrLgorCSAqLworCWlpcC0+aWxpX2xhc3RfZmllbGRzID0gMDsKKworCS8qCisJICogUmVsZWFzZSB0aGUgaW5vZGUncyBmbHVzaCBsb2NrIHNpbmNlIHdlJ3JlIGRvbmUgd2l0aCBpdC4KKwkgKi8KKwl4ZnNfaWZ1bmxvY2soaXApOworCisJcmV0dXJuOworfQorCisvKgorICogVGhpcyBpcyB0aGUgaW5vZGUgZmx1c2hpbmcgYWJvcnQgcm91dGluZS4gIEl0IGlzIGNhbGxlZAorICogZnJvbSB4ZnNfaWZsdXNoIHdoZW4gdGhlIGZpbGVzeXN0ZW0gaXMgc2h1dHRpbmcgZG93biB0byBjbGVhbgorICogdXAgdGhlIGlub2RlIHN0YXRlLgorICogSXQgaXMgcmVzcG9uc2libGUgZm9yIHJlbW92aW5nIHRoZSBpbm9kZSBpdGVtCisgKiBmcm9tIHRoZSBBSUwgaWYgaXQgaGFzIG5vdCBiZWVuIHJlLWxvZ2dlZCwgYW5kIHVubG9ja2luZyB0aGUgaW5vZGUncworICogZmx1c2ggbG9jay4KKyAqLwordm9pZAoreGZzX2lmbHVzaF9hYm9ydCgKKwl4ZnNfaW5vZGVfdAkJKmlwKQoreworCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXA7CisJeGZzX21vdW50X3QJCSptcDsKKwlTUExERUNMKHMpOworCisJaWlwID0gaXAtPmlfaXRlbXA7CisJbXAgPSBpcC0+aV9tb3VudDsKKwlpZiAoaWlwKSB7CisJCWlmIChpaXAtPmlsaV9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkgeworCQkJQUlMX0xPQ0sobXAsIHMpOworCQkJaWYgKGlpcC0+aWxpX2l0ZW0ubGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSB7CisJCQkJLyoKKwkJCQkgKiB4ZnNfdHJhbnNfZGVsZXRlX2FpbCgpIGRyb3BzIHRoZSBBSUwgbG9jay4KKwkJCQkgKi8KKwkJCQl4ZnNfdHJhbnNfZGVsZXRlX2FpbChtcCwgKHhmc19sb2dfaXRlbV90ICopaWlwLAorCQkJCQlzKTsKKwkJCX0gZWxzZQorCQkJCUFJTF9VTkxPQ0sobXAsIHMpOworCQl9CisJCWlpcC0+aWxpX2xvZ2dlZCA9IDA7CisJCS8qCisJCSAqIENsZWFyIHRoZSBpbGlfbGFzdF9maWVsZHMgYml0cyBub3cgdGhhdCB3ZSBrbm93IHRoYXQgdGhlCisJCSAqIGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGVtIGlzIHNhZmVseSBvbiBkaXNrLgorCQkgKi8KKwkJaWlwLT5pbGlfbGFzdF9maWVsZHMgPSAwOworCQkvKgorCQkgKiBDbGVhciB0aGUgaW5vZGUgbG9nZ2luZyBmaWVsZHMgc28gbm8gbW9yZSBmbHVzaGVzIGFyZQorCQkgKiBhdHRlbXB0ZWQuCisJCSAqLworCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyA9IDA7CisJfQorCS8qCisJICogUmVsZWFzZSB0aGUgaW5vZGUncyBmbHVzaCBsb2NrIHNpbmNlIHdlJ3JlIGRvbmUgd2l0aCBpdC4KKwkgKi8KKwl4ZnNfaWZ1bmxvY2soaXApOworfQorCit2b2lkCit4ZnNfaXN0YWxlX2RvbmUoCisJeGZzX2J1Zl90CQkqYnAsCisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcCkKK3sKKwl4ZnNfaWZsdXNoX2Fib3J0KGlpcC0+aWxpX2lub2RlKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5oIGIvZnMveGZzL3hmc19pbm9kZV9pdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg3NzVlMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5oCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYJX19YRlNfSU5PREVfSVRFTV9IX18KKyNkZWZpbmUJX19YRlNfSU5PREVfSVRFTV9IX18KKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB1c2VkIHRvIGxheSBvdXQgYW4gaW5vZGUgbG9nIGl0ZW0gaW4gdGhlCisgKiBsb2cuICBUaGUgc2l6ZSBvZiB0aGUgaW5saW5lIGRhdGEvZXh0ZW50cy9iLXRyZWUgcm9vdCB0byBiZSBsb2dnZWQKKyAqIChpZiBhbnkpIGlzIGluZGljYXRlZCBpbiB0aGUgaWxmX2RzaXplIGZpZWxkLiAgQ2hhbmdlcyB0byB0aGlzIHN0cnVjdHVyZQorICogbXVzdCBiZSBhZGRlZCBvbiB0byB0aGUgZW5kLgorICoKKyAqIENvbnZlbnRpb24gZm9yIG5hbWluZyBpbm9kZSBsb2cgaXRlbSB2ZXJzaW9ucyA6ICBUaGUgY3VycmVudCB2ZXJzaW9uCisgKiBpcyBhbHdheXMgbmFtZWQgWEZTX0xJX0lOT0RFLiAgV2hlbiBhbiBpbm9kZSBsb2cgaXRlbSBnZXRzIHN1cGVyc2VkZWQsCisgKiBhZGQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIElSSVggdGhhdCB3aWxsIGdlbmVyYXRlIGxvZ3Mgd2l0aCB0aGF0IGl0ZW0KKyAqIHRvIHRoZSB2ZXJzaW9uIG5hbWUuCisgKgorICogLVZlcnNpb24gMSBvZiB0aGlzIHN0cnVjdHVyZSAoWEZTX0xJXzVfM19JTk9ERSkgaW5jbHVkZWQgdXAgdG8gdGhlIGZpcnN0CisgKgl1bmlvbiAoaWxmX3UpIGZpZWxkLiAgVGhpcyB3YXMgcmVsZWFzZWQgd2l0aCBJUklYIDUuMy1YRlMuCisgKiAtVmVyc2lvbiAyIG9mIHRoaXMgc3RydWN0dXJlIChYRlNfTElfNl8xX0lOT0RFKSBpcyBjdXJyZW50bHkgdGhlIGVudGlyZQorICoJc3RydWN0dXJlLiAgVGhpcyB3YXMgcmVsZWFzZWQgd2l0aCBJUklYIDYuMC4xLVhGUyBhbmQgSVJJWCA2LjEuCisgKiAtVmVyc2lvbiAzIG9mIHRoaXMgc3RydWN0dXJlIChYRlNfTElfSU5PREUpIGlzIHRoZSBzYW1lIGFzIHZlcnNpb24gMgorICoJc28gYSBuZXcgc3RydWN0dXJlIGRlZmluaXRpb24gd2Fzbid0IG5lY2Vzc2FyeS4gIEhvd2V2ZXIsIHdlIGhhZAorICoJdG8gYWRkIGEgbmV3IHR5cGUgYmVjYXVzZSB0aGUgaW5vZGUgY2x1c3RlciBzaXplIGNoYW5nZWQgZnJvbSA0SworICoJdG8gOEsgYW5kIHRoZSB2ZXJzaW9uIG51bWJlciBoYWQgdG8gYmUgcmV2J3ZlZCB0byBrZWVwIG9sZGVyIGtlcm5lbHMKKyAqCWZyb20gdHJ5aW5nIHRvIHJlY292ZXIgbG9ncyB3aXRoIHRoZSA4SyBidWZmZXJzIGluIHRoZW0uICBUaGUgbG9nZ2luZworICoJY29kZSBjYW4gaGFuZGxlIHJlY292ZXJ5IG9uIGRpZmZlcmVudC1zaXplZCBjbHVzdGVycyBub3cgc28gaG9wZWZ1bGx5CisgKgl0aGlzJ2xsIGJlIHRoZSBsYXN0IHRpbWUgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGlub2RlIGxvZyBpdGVtIGp1c3QKKyAqCWZvciBhIGNoYW5nZSBpbiB0aGUgaW5vZGUgY2x1c3RlciBzaXplLiAgVGhpcyBuZXcgdmVyc2lvbiB3YXMKKyAqCXJlbGVhc2VkIHdpdGggSVJJWCA2LjIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19pbm9kZV9sb2dfZm9ybWF0IHsKKwl1bnNpZ25lZCBzaG9ydAkJaWxmX3R5cGU7CS8qIGlub2RlIGxvZyBpdGVtIHR5cGUgKi8KKwl1bnNpZ25lZCBzaG9ydAkJaWxmX3NpemU7CS8qIHNpemUgb2YgdGhpcyBpdGVtICovCisJdWludAkJCWlsZl9maWVsZHM7CS8qIGZsYWdzIGZvciBmaWVsZHMgbG9nZ2VkICovCisJdXNob3J0CQkJaWxmX2FzaXplOwkvKiBzaXplIG9mIGF0dHIgZC9leHQvcm9vdCAqLworCXVzaG9ydAkJCWlsZl9kc2l6ZTsJLyogc2l6ZSBvZiBkYXRhL2V4dC9yb290ICovCisJeGZzX2lub190CQlpbGZfaW5vOwkvKiBpbm9kZSBudW1iZXIgKi8KKwl1bmlvbiB7CisJCXhmc19kZXZfdAlpbGZ1X3JkZXY7CS8qIHJkZXYgdmFsdWUgZm9yIGRldiBpbm9kZSovCisJCXV1aWRfdAkJaWxmdV91dWlkOwkvKiBtb3VudCBwb2ludCB2YWx1ZSAqLworCX0gaWxmX3U7CisJX19pbnQ2NF90CQlpbGZfYmxrbm87CS8qIGJsa25vIG9mIGlub2RlIGJ1ZmZlciAqLworCWludAkJCWlsZl9sZW47CS8qIGxlbiBvZiBpbm9kZSBidWZmZXIgKi8KKwlpbnQJCQlpbGZfYm9mZnNldDsJLyogb2ZmIG9mIGlub2RlIGluIGJ1ZmZlciAqLworfSB4ZnNfaW5vZGVfbG9nX2Zvcm1hdF90OworCisvKiBJbml0aWFsIHZlcnNpb24gc2hpcHBlZCB3aXRoIElSSVggNS4zLVhGUyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2lub2RlX2xvZ19mb3JtYXRfdjEgeworCXVuc2lnbmVkIHNob3J0CQlpbGZfdHlwZTsJLyogaW5vZGUgbG9nIGl0ZW0gdHlwZSAqLworCXVuc2lnbmVkIHNob3J0CQlpbGZfc2l6ZTsJLyogc2l6ZSBvZiB0aGlzIGl0ZW0gKi8KKwl1aW50CQkJaWxmX2ZpZWxkczsJLyogZmxhZ3MgZm9yIGZpZWxkcyBsb2dnZWQgKi8KKwl1aW50CQkJaWxmX2RzaXplOwkvKiBzaXplIG9mIGRhdGEvZXh0L3Jvb3QgKi8KKwl4ZnNfaW5vX3QJCWlsZl9pbm87CS8qIGlub2RlIG51bWJlciAqLworCXVuaW9uIHsKKwkJeGZzX2Rldl90CWlsZnVfcmRldjsJLyogcmRldiB2YWx1ZSBmb3IgZGV2IGlub2RlKi8KKwkJdXVpZF90CQlpbGZ1X3V1aWQ7CS8qIG1vdW50IHBvaW50IHZhbHVlICovCisJfSBpbGZfdTsKK30geGZzX2lub2RlX2xvZ19mb3JtYXRfdF92MTsKKworLyoKKyAqIEZsYWdzIGZvciB4ZnNfdHJhbnNfbG9nX2lub2RlIGZsYWdzIGZpZWxkLgorICovCisjZGVmaW5lCVhGU19JTE9HX0NPUkUJMHgwMDEJLyogbG9nIHN0YW5kYXJkIGlub2RlIGZpZWxkcyAqLworI2RlZmluZQlYRlNfSUxPR19EREFUQQkweDAwMgkvKiBsb2cgaV9kZi5pZl9kYXRhICovCisjZGVmaW5lCVhGU19JTE9HX0RFWFQJMHgwMDQJLyogbG9nIGlfZGYuaWZfZXh0ZW50cyAqLworI2RlZmluZQlYRlNfSUxPR19EQlJPT1QJMHgwMDgJLyogbG9nIGlfZGYuaV9icm9vdCAqLworI2RlZmluZQlYRlNfSUxPR19ERVYJMHgwMTAJLyogbG9nIHRoZSBkZXYgZmllbGQgKi8KKyNkZWZpbmUJWEZTX0lMT0dfVVVJRAkweDAyMAkvKiBsb2cgdGhlIHV1aWQgZmllbGQgKi8KKyNkZWZpbmUJWEZTX0lMT0dfQURBVEEJMHgwNDAJLyogbG9nIGlfYWYuaWZfZGF0YSAqLworI2RlZmluZQlYRlNfSUxPR19BRVhUCTB4MDgwCS8qIGxvZyBpX2FmLmlmX2V4dGVudHMgKi8KKyNkZWZpbmUJWEZTX0lMT0dfQUJST09UCTB4MTAwCS8qIGxvZyBpX2FmLmlfYnJvb3QgKi8KKworI2RlZmluZQlYRlNfSUxPR19OT05DT1JFCShYRlNfSUxPR19EREFUQSB8IFhGU19JTE9HX0RFWFQgfCBcCisJCQkJIFhGU19JTE9HX0RCUk9PVCB8IFhGU19JTE9HX0RFViB8IFwKKwkJCQkgWEZTX0lMT0dfVVVJRCB8IFhGU19JTE9HX0FEQVRBIHwgXAorCQkJCSBYRlNfSUxPR19BRVhUIHwgWEZTX0lMT0dfQUJST09UKQorCisjZGVmaW5lCVhGU19JTE9HX0RGT1JLCQkoWEZTX0lMT0dfRERBVEEgfCBYRlNfSUxPR19ERVhUIHwgXAorCQkJCSBYRlNfSUxPR19EQlJPT1QpCisKKyNkZWZpbmUJWEZTX0lMT0dfQUZPUksJCShYRlNfSUxPR19BREFUQSB8IFhGU19JTE9HX0FFWFQgfCBcCisJCQkJIFhGU19JTE9HX0FCUk9PVCkKKworI2RlZmluZQlYRlNfSUxPR19BTEwJCShYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfRERBVEEgfCBcCisJCQkJIFhGU19JTE9HX0RFWFQgfCBYRlNfSUxPR19EQlJPT1QgfCBcCisJCQkJIFhGU19JTE9HX0RFViB8IFhGU19JTE9HX1VVSUQgfCBcCisJCQkJIFhGU19JTE9HX0FEQVRBIHwgWEZTX0lMT0dfQUVYVCB8IFwKKwkJCQkgWEZTX0lMT0dfQUJST09UKQorCisjZGVmaW5lCVhGU19JTElfSE9MRAkJMHgxCisjZGVmaW5lCVhGU19JTElfSU9MT0NLRURfRVhDTAkweDIKKyNkZWZpbmUJWEZTX0lMSV9JT0xPQ0tFRF9TSEFSRUQJMHg0CisKKyNkZWZpbmUJWEZTX0lMSV9JT0xPQ0tFRF9BTlkgICAoWEZTX0lMSV9JT0xPQ0tFRF9FWENMIHwgWEZTX0lMSV9JT0xPQ0tFRF9TSEFSRUQpCisKKworI2lmZGVmIF9fS0VSTkVMX18KKworc3RydWN0IHhmc19idWY7CitzdHJ1Y3QgeGZzX2JtYnRfcmVjXzY0Oworc3RydWN0IHhmc19pbm9kZTsKK3N0cnVjdCB4ZnNfbW91bnQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2lub2RlX2xvZ19pdGVtIHsKKwl4ZnNfbG9nX2l0ZW1fdAkJaWxpX2l0ZW07CSAgIC8qIGNvbW1vbiBwb3J0aW9uICovCisJc3RydWN0IHhmc19pbm9kZQkqaWxpX2lub2RlOwkgICAvKiBpbm9kZSBwdHIgKi8KKwl4ZnNfbHNuX3QJCWlsaV9mbHVzaF9sc247CSAgIC8qIGxzbiBhdCBsYXN0IGZsdXNoICovCisJeGZzX2xzbl90CQlpbGlfbGFzdF9sc247CSAgIC8qIGxzbiBhdCBsYXN0IHRyYW5zYWN0aW9uICovCisJdW5zaWduZWQgc2hvcnQJCWlsaV9pbG9ja19yZWN1cjsgICAvKiBsb2NrIHJlY3Vyc2lvbiBjb3VudCAqLworCXVuc2lnbmVkIHNob3J0CQlpbGlfaW9sb2NrX3JlY3VyOyAgLyogbG9jayByZWN1cnNpb24gY291bnQgKi8KKwl1bnNpZ25lZCBzaG9ydAkJaWxpX2ZsYWdzOwkgICAvKiBtaXNjIGZsYWdzICovCisJdW5zaWduZWQgc2hvcnQJCWlsaV9sb2dnZWQ7CSAgIC8qIGZsdXNoZWQgbG9nZ2VkIGRhdGEgKi8KKwl1bnNpZ25lZCBpbnQJCWlsaV9sYXN0X2ZpZWxkczsgICAvKiBmaWVsZHMgd2hlbiBmbHVzaGVkICovCisJc3RydWN0IHhmc19ibWJ0X3JlY182NAkqaWxpX2V4dGVudHNfYnVmOyAgLyogYXJyYXkgb2YgbG9nZ2VkCisJCQkJCQkgICAgICBkYXRhIGV4dHMgKi8KKwlzdHJ1Y3QgeGZzX2JtYnRfcmVjXzY0CSppbGlfYWV4dGVudHNfYnVmOyAvKiBhcnJheSBvZiBsb2dnZWQKKwkJCQkJCSAgICAgIGF0dHIgZXh0cyAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgIGlsaV9wdXNoYnVmX2ZsYWc7ICAvKiBvbmUgYml0IHVzZWQgaW4gcHVzaF9haWwgKi8KKworI2lmZGVmIERFQlVHCisJdWludDY0X3QgICAgICAgICAgICAgICAgaWxpX3B1c2hfb3duZXI7ICAgIC8qIG9uZSB3aG8gc2V0cyBwdXNoYnVmX2ZsYWcKKwkJCQkJCSAgICAgIGFib3ZlIGdldHMgdG8gcHVzaCB0aGUgYnVmICovCisjZW5kaWYKKyNpZmRlZiBYRlNfVFJBTlNfREVCVUcKKwlpbnQJCQlpbGlfcm9vdF9zaXplOworCWNoYXIJCQkqaWxpX29yaWdfcm9vdDsKKyNlbmRpZgorCXhmc19pbm9kZV9sb2dfZm9ybWF0X3QJaWxpX2Zvcm1hdDsJICAgLyogbG9nZ2VkIHN0cnVjdHVyZSAqLworfSB4ZnNfaW5vZGVfbG9nX2l0ZW1fdDsKKworCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTE9HX0ZEQVRBKQoraW50IHhmc19pbG9nX2ZkYXRhKGludCB3KTsKKyNkZWZpbmUJWEZTX0lMT0dfRkRBVEEodykJeGZzX2lsb2dfZmRhdGEodykKKyNlbHNlCisjZGVmaW5lCVhGU19JTE9HX0ZEQVRBKHcpCVwKKwkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBYRlNfSUxPR19EREFUQSA6IFhGU19JTE9HX0FEQVRBKQorI2VuZGlmCisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lMT0dfRkJST09UKQoraW50IHhmc19pbG9nX2Zicm9vdChpbnQgdyk7CisjZGVmaW5lCVhGU19JTE9HX0ZCUk9PVCh3KQl4ZnNfaWxvZ19mYnJvb3QodykKKyNlbHNlCisjZGVmaW5lCVhGU19JTE9HX0ZCUk9PVCh3KQlcCisJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gWEZTX0lMT0dfREJST09UIDogWEZTX0lMT0dfQUJST09UKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTE9HX0ZFWFQpCitpbnQgeGZzX2lsb2dfZmV4dChpbnQgdyk7CisjZGVmaW5lCVhGU19JTE9HX0ZFWFQodykJeGZzX2lsb2dfZmV4dCh3KQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lMT0dfRkVYVCh3KQlcCisJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gWEZTX0lMT0dfREVYVCA6IFhGU19JTE9HX0FFWFQpCisjZW5kaWYKKworI2lmZGVmIF9fS0VSTkVMX18KKwordm9pZAl4ZnNfaW5vZGVfaXRlbV9pbml0KHN0cnVjdCB4ZnNfaW5vZGUgKiwgc3RydWN0IHhmc19tb3VudCAqKTsKK3ZvaWQJeGZzX2lub2RlX2l0ZW1fZGVzdHJveShzdHJ1Y3QgeGZzX2lub2RlICopOwordm9pZAl4ZnNfaWZsdXNoX2RvbmUoc3RydWN0IHhmc19idWYgKiwgeGZzX2lub2RlX2xvZ19pdGVtX3QgKik7Cit2b2lkCXhmc19pc3RhbGVfZG9uZShzdHJ1Y3QgeGZzX2J1ZiAqLCB4ZnNfaW5vZGVfbG9nX2l0ZW1fdCAqKTsKK3ZvaWQJeGZzX2lmbHVzaF9hYm9ydChzdHJ1Y3QgeGZzX2lub2RlICopOworCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisjZW5kaWYJLyogX19YRlNfSU5PREVfSVRFTV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW51bS5oIGIvZnMveGZzL3hmc19pbnVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhZjJkNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfaW51bS5oCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19JTlVNX0hfXworI2RlZmluZQlfX1hGU19JTlVNX0hfXworCisvKgorICogSW5vZGUgbnVtYmVyIGZvcm1hdDoKKyAqIGxvdyBpbm9wYmxvZyBiaXRzIC0gb2Zmc2V0IGluIGJsb2NrCisgKiBuZXh0IGFnYmxrbG9nIGJpdHMgLSBibG9jayBudW1iZXIgaW4gYWcKKyAqIG5leHQgYWdub19sb2cgYml0cyAtIGFnIG51bWJlcgorICogaGlnaCBhZ25vX2xvZy1hZ2Jsa2xvZy1pbm9wYmxvZyBiaXRzIC0gMAorICovCisKK3R5cGVkZWYJX191aW50MzJfdAl4ZnNfYWdpbm9fdDsJLyogd2l0aGluIGFsbG9jYXRpb24gZ3JwIGlub2RlIG51bWJlciAqLworCisvKgorICogVXNlZnVsIGlub2RlIGJpdHMgZm9yIHRoaXMga2VybmVsLgorICogVXNlZCBpbiBzb21lIHBsYWNlcyB3aGVyZSBoYXZpbmcgNjQtYml0cyBpbiB0aGUgMzItYml0IGtlcm5lbHMKKyAqIGNvc3RzIHRvbyBtdWNoLgorICovCisjaWYgWEZTX0JJR19JTlVNUwordHlwZWRlZgl4ZnNfaW5vX3QJeGZzX2ludGlub190OworI2Vsc2UKK3R5cGVkZWYJX191aW50MzJfdAl4ZnNfaW50aW5vX3Q7CisjZW5kaWYKKworI2RlZmluZQlOVUxMRlNJTk8JKCh4ZnNfaW5vX3QpLTEpCisjZGVmaW5lCU5VTExBR0lOTwkoKHhmc19hZ2lub190KS0xKQorCitzdHJ1Y3QgeGZzX21vdW50OworCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTk9fTUFTSykKK19fdWludDMyX3QgeGZzX2lub19tYXNrKGludCBrKTsKKyNkZWZpbmUJWEZTX0lOT19NQVNLKGspCQkJeGZzX2lub19tYXNrKGspCisjZWxzZQorI2RlZmluZQlYRlNfSU5PX01BU0soaykJKChfX3VpbnQzMl90KSgoMVVMTCA8PCAoaykpIC0gMSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT19PRkZTRVRfQklUUykKK2ludCB4ZnNfaW5vX29mZnNldF9iaXRzKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX0lOT19PRkZTRVRfQklUUyhtcCkJCXhmc19pbm9fb2Zmc2V0X2JpdHMobXApCisjZWxzZQorI2RlZmluZQlYRlNfSU5PX09GRlNFVF9CSVRTKG1wKQkoKG1wKS0+bV9zYi5zYl9pbm9wYmxvZykKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PX0FHQk5PX0JJVFMpCitpbnQgeGZzX2lub19hZ2Jub19iaXRzKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX0lOT19BR0JOT19CSVRTKG1wKQkJeGZzX2lub19hZ2Jub19iaXRzKG1wKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lOT19BR0JOT19CSVRTKG1wKQkoKG1wKS0+bV9zYi5zYl9hZ2Jsa2xvZykKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PX0FHSU5PX0JJVFMpCitpbnQgeGZzX2lub19hZ2lub19iaXRzKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX0lOT19BR0lOT19CSVRTKG1wKQkJeGZzX2lub19hZ2lub19iaXRzKG1wKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lOT19BR0lOT19CSVRTKG1wKQkJKChtcCktPm1fYWdpbm9fbG9nKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTk9fQUdOT19CSVRTKQoraW50IHhmc19pbm9fYWdub19iaXRzKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX0lOT19BR05PX0JJVFMobXApCQl4ZnNfaW5vX2Fnbm9fYml0cyhtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19JTk9fQUdOT19CSVRTKG1wKQkoKG1wKS0+bV9hZ25vX2xvZykKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PX0JJVFMpCitpbnQgeGZzX2lub19iaXRzKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX0lOT19CSVRTKG1wKQkJeGZzX2lub19iaXRzKG1wKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lOT19CSVRTKG1wKQkoWEZTX0lOT19BR05PX0JJVFMobXApICsgWEZTX0lOT19BR0lOT19CSVRTKG1wKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTk9fVE9fQUdOTykKK3hmc19hZ251bWJlcl90IHhmc19pbm9fdG9fYWdubyhzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2lub190IGkpOworI2RlZmluZQlYRlNfSU5PX1RPX0FHTk8obXAsaSkJCXhmc19pbm9fdG9fYWdubyhtcCxpKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lOT19UT19BR05PKG1wLGkpCVwKKwkoKHhmc19hZ251bWJlcl90KSgoaSkgPj4gWEZTX0lOT19BR0lOT19CSVRTKG1wKSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT19UT19BR0lOTykKK3hmc19hZ2lub190IHhmc19pbm9fdG9fYWdpbm8oc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19pbm9fdCBpKTsKKyNkZWZpbmUJWEZTX0lOT19UT19BR0lOTyhtcCxpKQkJeGZzX2lub190b19hZ2lubyhtcCxpKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lOT19UT19BR0lOTyhtcCxpKQlcCisJKCh4ZnNfYWdpbm9fdCkoaSkgJiBYRlNfSU5PX01BU0soWEZTX0lOT19BR0lOT19CSVRTKG1wKSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT19UT19BR0JOTykKK3hmc19hZ2Jsb2NrX3QgeGZzX2lub190b19hZ2JubyhzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2lub190IGkpOworI2RlZmluZQlYRlNfSU5PX1RPX0FHQk5PKG1wLGkpCQl4ZnNfaW5vX3RvX2FnYm5vKG1wLGkpCisjZWxzZQorI2RlZmluZQlYRlNfSU5PX1RPX0FHQk5PKG1wLGkpCVwKKwkoKCh4ZnNfYWdibG9ja190KShpKSA+PiBYRlNfSU5PX09GRlNFVF9CSVRTKG1wKSkgJiBcCisJIFhGU19JTk9fTUFTSyhYRlNfSU5PX0FHQk5PX0JJVFMobXApKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PX1RPX09GRlNFVCkKK2ludCB4ZnNfaW5vX3RvX29mZnNldChzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2lub190IGkpOworI2RlZmluZQlYRlNfSU5PX1RPX09GRlNFVChtcCxpKQkJeGZzX2lub190b19vZmZzZXQobXAsaSkKKyNlbHNlCisjZGVmaW5lCVhGU19JTk9fVE9fT0ZGU0VUKG1wLGkpCVwKKwkoKGludCkoaSkgJiBYRlNfSU5PX01BU0soWEZTX0lOT19PRkZTRVRfQklUUyhtcCkpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTk9fVE9fRlNCKQoreGZzX2ZzYmxvY2tfdCB4ZnNfaW5vX3RvX2ZzYihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2lub190IGkpOworI2RlZmluZQlYRlNfSU5PX1RPX0ZTQihtcCxpKQkJeGZzX2lub190b19mc2IobXAsaSkKKyNlbHNlCisjZGVmaW5lCVhGU19JTk9fVE9fRlNCKG1wLGkpCVwKKwlYRlNfQUdCX1RPX0ZTQihtcCwgWEZTX0lOT19UT19BR05PKG1wLGkpLCBYRlNfSU5PX1RPX0FHQk5PKG1wLGkpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FHSU5PX1RPX0lOTykKK3hmc19pbm9fdAoreGZzX2FnaW5vX3RvX2lubyhzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2FnbnVtYmVyX3QgYSwgeGZzX2FnaW5vX3QgaSk7CisjZGVmaW5lCVhGU19BR0lOT19UT19JTk8obXAsYSxpKQl4ZnNfYWdpbm9fdG9faW5vKG1wLGEsaSkKKyNlbHNlCisjZGVmaW5lCVhGU19BR0lOT19UT19JTk8obXAsYSxpKQlcCisJKCgoeGZzX2lub190KShhKSA8PCBYRlNfSU5PX0FHSU5PX0JJVFMobXApKSB8IChpKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUdJTk9fVE9fQUdCTk8pCit4ZnNfYWdibG9ja190IHhmc19hZ2lub190b19hZ2JubyhzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2FnaW5vX3QgaSk7CisjZGVmaW5lCVhGU19BR0lOT19UT19BR0JOTyhtcCxpKQl4ZnNfYWdpbm9fdG9fYWdibm8obXAsaSkKKyNlbHNlCisjZGVmaW5lCVhGU19BR0lOT19UT19BR0JOTyhtcCxpKQkoKGkpID4+IFhGU19JTk9fT0ZGU0VUX0JJVFMobXApKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BR0lOT19UT19PRkZTRVQpCitpbnQgeGZzX2FnaW5vX3RvX29mZnNldChzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2FnaW5vX3QgaSk7CisjZGVmaW5lCVhGU19BR0lOT19UT19PRkZTRVQobXAsaSkJeGZzX2FnaW5vX3RvX29mZnNldChtcCxpKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0FHSU5PX1RPX09GRlNFVChtcCxpKQlcCisJKChpKSAmIFhGU19JTk9fTUFTSyhYRlNfSU5PX09GRlNFVF9CSVRTKG1wKSkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfT0ZGQk5PX1RPX0FHSU5PKQoreGZzX2FnaW5vX3QgeGZzX29mZmJub190b19hZ2lubyhzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2FnYmxvY2tfdCBiLCBpbnQgbyk7CisjZGVmaW5lCVhGU19PRkZCTk9fVE9fQUdJTk8obXAsYixvKQl4ZnNfb2ZmYm5vX3RvX2FnaW5vKG1wLGIsbykKKyNlbHNlCisjZGVmaW5lCVhGU19PRkZCTk9fVE9fQUdJTk8obXAsYixvKQlcCisJKCh4ZnNfYWdpbm9fdCkoKChiKSA8PCBYRlNfSU5PX09GRlNFVF9CSVRTKG1wKSkgfCAobykpKQorI2VuZGlmCisKKyNpZiBYRlNfQklHX0lOVU1TCisjZGVmaW5lCVhGU19NQVhJTlVNQkVSCQkoKHhmc19pbm9fdCkoKDFVTEwgPDwgNTYpIC0gMVVMTCkpCisjZGVmaW5lCVhGU19JTk82NF9PRkZTRVQJKCh4ZnNfaW5vX3QpKDFVTEwgPDwgMzIpKQorI2Vsc2UKKyNkZWZpbmUJWEZTX01BWElOVU1CRVIJCSgoeGZzX2lub190KSgoMVVMTCA8PCAzMikgLSAxVUxMKSkKKyNlbmRpZgorI2RlZmluZQlYRlNfTUFYSU5VTUJFUl8zMgkoKHhmc19pbm9fdCkoKDFVTEwgPDwgMzIpIC0gMVVMTCkpCisKKyNlbmRpZgkvKiBfX1hGU19JTlVNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pb2NvcmUuYyBiL2ZzL3hmcy94ZnNfaW9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0ZWM0OQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfaW9jb3JlLmMKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgInhmc19xdW90YS5oIgorI2luY2x1ZGUgInhmc190cmFuc19zcGFjZS5oIgorI2luY2x1ZGUgInhmc19pb21hcC5oIgorCisKK1NUQVRJQyB4ZnNfZnNpemVfdAoreGZzX3NpemVfZm4oCisJeGZzX2lub2RlX3QJCSppcCkKK3sKKwlyZXR1cm4gKGlwLT5pX2QuZGlfc2l6ZSk7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19pb2luaXQoCisJc3RydWN0IHZmcwkJKnZmc3AsCisJc3RydWN0IHhmc19tb3VudF9hcmdzCSptbnRhcmdzLAorCWludAkJCWZsYWdzKQoreworCXJldHVybiB4ZnNfbW91bnRmcyh2ZnNwLCBYRlNfVkZTVE9NKHZmc3ApLCBmbGFncyk7Cit9CisKK3hmc19pb29wc190CXhmc19pb2NvcmVfeGZzID0geworCS54ZnNfaW9pbml0CQk9ICh4ZnNfaW9pbml0X3QpIHhmc19pb2luaXQsCisJLnhmc19ibWFwaV9mdW5jCQk9ICh4ZnNfYm1hcGlfdCkgeGZzX2JtYXBpLAorCS54ZnNfYm1hcF9lb2ZfZnVuYwk9ICh4ZnNfYm1hcF9lb2ZfdCkgeGZzX2JtYXBfZW9mLAorCS54ZnNfaW9tYXBfd3JpdGVfZGlyZWN0ID0KKwkJCSh4ZnNfaW9tYXBfd3JpdGVfZGlyZWN0X3QpIHhmc19pb21hcF93cml0ZV9kaXJlY3QsCisJLnhmc19pb21hcF93cml0ZV9kZWxheSA9CisJCQkoeGZzX2lvbWFwX3dyaXRlX2RlbGF5X3QpIHhmc19pb21hcF93cml0ZV9kZWxheSwKKwkueGZzX2lvbWFwX3dyaXRlX2FsbG9jYXRlID0KKwkJCSh4ZnNfaW9tYXBfd3JpdGVfYWxsb2NhdGVfdCkgeGZzX2lvbWFwX3dyaXRlX2FsbG9jYXRlLAorCS54ZnNfaW9tYXBfd3JpdGVfdW53cml0dGVuID0KKwkJCSh4ZnNfaW9tYXBfd3JpdGVfdW53cml0dGVuX3QpIHhmc19pb21hcF93cml0ZV91bndyaXR0ZW4sCisJLnhmc19pbG9jawkJPSAoeGZzX2xvY2tfdCkgeGZzX2lsb2NrLAorCS54ZnNfbGNrX21hcF9zaGFyZWQJPSAoeGZzX2xja19tYXBfc2hhcmVkX3QpIHhmc19pbG9ja19tYXBfc2hhcmVkLAorCS54ZnNfaWxvY2tfZGVtb3RlCT0gKHhmc19sb2NrX2RlbW90ZV90KSB4ZnNfaWxvY2tfZGVtb3RlLAorCS54ZnNfaWxvY2tfbm93YWl0CT0gKHhmc19sb2NrX25vd2FpdF90KSB4ZnNfaWxvY2tfbm93YWl0LAorCS54ZnNfdW5sb2NrCQk9ICh4ZnNfdW5sa190KSB4ZnNfaXVubG9jaywKKwkueGZzX3NpemVfZnVuYwkJPSAoeGZzX3NpemVfdCkgeGZzX3NpemVfZm4sCisJLnhmc19pb2RvbmUJCT0gKHhmc19pb2RvbmVfdCkgZnNfbm9lcnIsCit9OworCit2b2lkCit4ZnNfaW9jb3JlX2lub2RlX3JlaW5pdCgKKwl4ZnNfaW5vZGVfdAkqaXApCit7CisJeGZzX2lvY29yZV90CSppbyA9ICZpcC0+aV9pb2NvcmU7CisKKwlpby0+aW9fZmxhZ3MgPSAwOworCWlmIChpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkKKwkJaW8tPmlvX2ZsYWdzIHw9IFhGU19JT0NPUkVfUlQ7CisJaW8tPmlvX2RtZXZtYXNrID0gaXAtPmlfZC5kaV9kbWV2bWFzazsKKwlpby0+aW9fZG1zdGF0ZSA9IGlwLT5pX2QuZGlfZG1zdGF0ZTsKK30KKwordm9pZAoreGZzX2lvY29yZV9pbm9kZV9pbml0KAorCXhmc19pbm9kZV90CSppcCkKK3sKKwl4ZnNfaW9jb3JlX3QJKmlvID0gJmlwLT5pX2lvY29yZTsKKwl4ZnNfbW91bnRfdAkqbXAgPSBpcC0+aV9tb3VudDsKKworCWlvLT5pb19tb3VudCA9IG1wOworI2lmZGVmIERFQlVHCisJaW8tPmlvX2xvY2sgPSAmaXAtPmlfbG9jazsKKwlpby0+aW9faW9sb2NrID0gJmlwLT5pX2lvbG9jazsKKyNlbmRpZgorCisJaW8tPmlvX29iaiA9ICh2b2lkICopaXA7CisKKwl4ZnNfaW9jb3JlX2lub2RlX3JlaW5pdChpcCk7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lvbWFwLmMgYi9mcy94ZnMveGZzX2lvbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyNmU4ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfaW9tYXAuYwpAQCAtMCwwICsxLDEwMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuCSBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKworI2luY2x1ZGUgInhmc19mcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19xdW90YS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19pdGFibGUuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKyNpbmNsdWRlICJ4ZnNfYWNsLmgiCisjaW5jbHVkZSAieGZzX2NhcC5oIgorI2luY2x1ZGUgInhmc19tYWMuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0ci5oIgorI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgorI2luY2x1ZGUgInhmc190cmFuc19zcGFjZS5oIgorI2luY2x1ZGUgInhmc191dGlscy5oIgorI2luY2x1ZGUgInhmc19pb21hcC5oIgorCisjaWYgZGVmaW5lZChYRlNfUldfVFJBQ0UpCit2b2lkCit4ZnNfaW9tYXBfZW50ZXJfdHJhY2UoCisJaW50CQl0YWcsCisJeGZzX2lvY29yZV90CSppbywKKwl4ZnNfb2ZmX3QJb2Zmc2V0LAorCXNzaXplX3QJCWNvdW50KQoreworCXhmc19pbm9kZV90CSppcCA9IFhGU19JT19JTk9ERShpbyk7CisKKwlpZiAoIWlwLT5pX3J3dHJhY2UpCisJCXJldHVybjsKKworCWt0cmFjZV9lbnRlcihpcC0+aV9yd3RyYWNlLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZyl0YWcpLAorCQkodm9pZCAqKWlwLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoKGlwLT5pX2QuZGlfc2l6ZSA+PiAzMikgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShpcC0+aV9kLmRpX3NpemUgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKSgob2Zmc2V0ID4+IDMyKSAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKG9mZnNldCAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpY291bnQpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoKGlvLT5pb19uZXdfc2l6ZSA+PiAzMikgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShpby0+aW9fbmV3X3NpemUgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopTlVMTCwKKwkJKHZvaWQgKilOVUxMLAorCQkodm9pZCAqKU5VTEwsCisJCSh2b2lkICopTlVMTCwKKwkJKHZvaWQgKilOVUxMLAorCQkodm9pZCAqKU5VTEwsCisJCSh2b2lkICopTlVMTCk7Cit9CisKK3ZvaWQKK3hmc19pb21hcF9tYXBfdHJhY2UoCisJaW50CQl0YWcsCisJeGZzX2lvY29yZV90CSppbywKKwl4ZnNfb2ZmX3QJb2Zmc2V0LAorCXNzaXplX3QJCWNvdW50LAorCXhmc19pb21hcF90CSppb21hcHAsCisJeGZzX2JtYnRfaXJlY190CSppbWFwcCwKKwlpbnQJCWZsYWdzKQoreworCXhmc19pbm9kZV90CSppcCA9IFhGU19JT19JTk9ERShpbyk7CisKKwlpZiAoIWlwLT5pX3J3dHJhY2UpCisJCXJldHVybjsKKworCWt0cmFjZV9lbnRlcihpcC0+aV9yd3RyYWNlLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZyl0YWcpLAorCQkodm9pZCAqKWlwLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoKGlwLT5pX2QuZGlfc2l6ZSA+PiAzMikgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShpcC0+aV9kLmRpX3NpemUgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKSgob2Zmc2V0ID4+IDMyKSAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKG9mZnNldCAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpY291bnQpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZylmbGFncyksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKSgoaW9tYXBwLT5pb21hcF9vZmZzZXQgPj4gMzIpICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoaW9tYXBwLT5pb21hcF9vZmZzZXQgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShpb21hcHAtPmlvbWFwX2RlbHRhKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShpb21hcHAtPmlvbWFwX2JzaXplKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShpb21hcHAtPmlvbWFwX2JuKSksCisJCSh2b2lkICopKF9fcHNpbnRfdCkoaW1hcHAtPmJyX3N0YXJ0b2ZmKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGltYXBwLT5icl9ibG9ja2NvdW50KSksCisJCSh2b2lkICopKF9fcHNpbnRfdCkoaW1hcHAtPmJyX3N0YXJ0YmxvY2spKTsKK30KKyNlbHNlCisjZGVmaW5lIHhmc19pb21hcF9lbnRlcl90cmFjZSh0YWcsIGlvLCBvZmZzZXQsIGNvdW50KQorI2RlZmluZSB4ZnNfaW9tYXBfbWFwX3RyYWNlKHRhZywgaW8sIG9mZnNldCwgY291bnQsIGlvbWFwcCwgaW1hcHAsIGZsYWdzKQorI2VuZGlmCisKKyNkZWZpbmUgWEZTX1dSSVRFSU9fQUxJR04obXAsb2ZmKQkoKChvZmYpID4+IG1wLT5tX3dyaXRlaW9fbG9nKSBcCisJCQkJCQk8PCBtcC0+bV93cml0ZWlvX2xvZykKKyNkZWZpbmUgWEZTX1NUUkFUX1dSSVRFX0lNQVBTCTIKKyNkZWZpbmUgWEZTX1dSSVRFX0lNQVBTCQlYRlNfQk1BUF9NQVhfTk1BUAorCitTVEFUSUMgaW50Cit4ZnNfaW1hcF90b19ibWFwKAorCXhmc19pb2NvcmVfdAkqaW8sCisJeGZzX29mZl90CW9mZnNldCwKKwl4ZnNfYm1idF9pcmVjX3QgKmltYXAsCisJeGZzX2lvbWFwX3QJKmlvbWFwcCwKKwlpbnQJCWltYXBzLAkJCS8qIE51bWJlciBvZiBpbWFwIGVudHJpZXMgKi8KKwlpbnQJCWlvbWFwcywJCQkvKiBOdW1iZXIgb2YgaW9tYXAgZW50cmllcyAqLworCWludAkJZmxhZ3MpCit7CisJeGZzX21vdW50X3QJKm1wOworCXhmc19mc2l6ZV90CW5pc2l6ZTsKKwlpbnQJCXBibTsKKwl4ZnNfZnNibG9ja190CXN0YXJ0X2Jsb2NrOworCisJbXAgPSBpby0+aW9fbW91bnQ7CisJbmlzaXplID0gWEZTX1NJWkUobXAsIGlvKTsKKwlpZiAoaW8tPmlvX25ld19zaXplID4gbmlzaXplKQorCQluaXNpemUgPSBpby0+aW9fbmV3X3NpemU7CisKKwlmb3IgKHBibSA9IDA7IGltYXBzICYmIHBibSA8IGlvbWFwczsgaW1hcHMtLSwgaW9tYXBwKyssIGltYXArKywgcGJtKyspIHsKKwkJaW9tYXBwLT5pb21hcF9vZmZzZXQgPSBYRlNfRlNCX1RPX0IobXAsIGltYXAtPmJyX3N0YXJ0b2ZmKTsKKwkJaW9tYXBwLT5pb21hcF9kZWx0YSA9IG9mZnNldCAtIGlvbWFwcC0+aW9tYXBfb2Zmc2V0OworCQlpb21hcHAtPmlvbWFwX2JzaXplID0gWEZTX0ZTQl9UT19CKG1wLCBpbWFwLT5icl9ibG9ja2NvdW50KTsKKwkJaW9tYXBwLT5pb21hcF9mbGFncyA9IGZsYWdzOworCisJCWlmIChpby0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUKSB7CisJCQlpb21hcHAtPmlvbWFwX2ZsYWdzIHw9IElPTUFQX1JFQUxUSU1FOworCQkJaW9tYXBwLT5pb21hcF90YXJnZXQgPSBtcC0+bV9ydGRldl90YXJncDsKKwkJfSBlbHNlIHsKKwkJCWlvbWFwcC0+aW9tYXBfdGFyZ2V0ID0gbXAtPm1fZGRldl90YXJncDsKKwkJfQorCQlzdGFydF9ibG9jayA9IGltYXAtPmJyX3N0YXJ0YmxvY2s7CisJCWlmIChzdGFydF9ibG9jayA9PSBIT0xFU1RBUlRCTE9DSykgeworCQkJaW9tYXBwLT5pb21hcF9ibiA9IElPTUFQX0RBRERSX05VTEw7CisJCQlpb21hcHAtPmlvbWFwX2ZsYWdzIHw9IElPTUFQX0hPTEU7CisJCX0gZWxzZSBpZiAoc3RhcnRfYmxvY2sgPT0gREVMQVlTVEFSVEJMT0NLKSB7CisJCQlpb21hcHAtPmlvbWFwX2JuID0gSU9NQVBfREFERFJfTlVMTDsKKwkJCWlvbWFwcC0+aW9tYXBfZmxhZ3MgfD0gSU9NQVBfREVMQVk7CisJCX0gZWxzZSB7CisJCQlpb21hcHAtPmlvbWFwX2JuID0gWEZTX0ZTQl9UT19EQl9JTyhpbywgc3RhcnRfYmxvY2spOworCQkJaWYgKElTVU5XUklUVEVOKGltYXApKQorCQkJCWlvbWFwcC0+aW9tYXBfZmxhZ3MgfD0gSU9NQVBfVU5XUklUVEVOOworCQl9CisKKwkJaWYgKChpb21hcHAtPmlvbWFwX29mZnNldCArIGlvbWFwcC0+aW9tYXBfYnNpemUpID49IG5pc2l6ZSkgeworCQkJaW9tYXBwLT5pb21hcF9mbGFncyB8PSBJT01BUF9FT0Y7CisJCX0KKworCQlvZmZzZXQgKz0gaW9tYXBwLT5pb21hcF9ic2l6ZSAtIGlvbWFwcC0+aW9tYXBfZGVsdGE7CisJfQorCXJldHVybiBwYm07CS8qIFJldHVybiB0aGUgbnVtYmVyIGZpbGxlZCAqLworfQorCitpbnQKK3hmc19pb21hcCgKKwl4ZnNfaW9jb3JlX3QJKmlvLAorCXhmc19vZmZfdAlvZmZzZXQsCisJc3NpemVfdAkJY291bnQsCisJaW50CQlmbGFncywKKwl4ZnNfaW9tYXBfdAkqaW9tYXBwLAorCWludAkJKm5pb21hcHMpCit7CisJeGZzX21vdW50X3QJKm1wID0gaW8tPmlvX21vdW50OworCXhmc19maWxlb2ZmX3QJb2Zmc2V0X2ZzYiwgZW5kX2ZzYjsKKwlpbnQJCWVycm9yID0gMDsKKwlpbnQJCWxvY2ttb2RlID0gMDsKKwl4ZnNfYm1idF9pcmVjX3QJaW1hcDsKKwlpbnQJCW5pbWFwcyA9IDE7CisJaW50CQlibWFwaV9mbGFncyA9IDA7CisJaW50CQlpb21hcF9mbGFncyA9IDA7CisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKworCXN3aXRjaCAoZmxhZ3MgJgorCQkoQk1BUElfUkVBRCB8IEJNQVBJX1dSSVRFIHwgQk1BUElfQUxMT0NBVEUgfAorCQkgQk1BUElfVU5XUklUVEVOIHwgQk1BUElfREVWSUNFKSkgeworCWNhc2UgQk1BUElfUkVBRDoKKwkJeGZzX2lvbWFwX2VudGVyX3RyYWNlKFhGU19JT01BUF9SRUFEX0VOVEVSLCBpbywgb2Zmc2V0LCBjb3VudCk7CisJCWxvY2ttb2RlID0gWEZTX0xDS19NQVBfU0hBUkVEKG1wLCBpbyk7CisJCWJtYXBpX2ZsYWdzID0gWEZTX0JNQVBJX0VOVElSRTsKKwkJaWYgKGZsYWdzICYgQk1BUElfSUdOU1RBVEUpCisJCQlibWFwaV9mbGFncyB8PSBYRlNfQk1BUElfSUdTVEFURTsKKwkJYnJlYWs7CisJY2FzZSBCTUFQSV9XUklURToKKwkJeGZzX2lvbWFwX2VudGVyX3RyYWNlKFhGU19JT01BUF9XUklURV9FTlRFUiwgaW8sIG9mZnNldCwgY291bnQpOworCQlsb2NrbW9kZSA9IFhGU19JTE9DS19FWENMfFhGU19FWFRTSVpFX1dSOworCQlibWFwaV9mbGFncyA9IDA7CisJCVhGU19JTE9DSyhtcCwgaW8sIGxvY2ttb2RlKTsKKwkJYnJlYWs7CisJY2FzZSBCTUFQSV9BTExPQ0FURToKKwkJeGZzX2lvbWFwX2VudGVyX3RyYWNlKFhGU19JT01BUF9BTExPQ19FTlRFUiwgaW8sIG9mZnNldCwgY291bnQpOworCQlsb2NrbW9kZSA9IFhGU19JTE9DS19TSEFSRUR8WEZTX0VYVFNJWkVfUkQ7CisJCWJtYXBpX2ZsYWdzID0gWEZTX0JNQVBJX0VOVElSRTsKKwkJLyogQXR0ZW1wdCBub24tYmxvY2tpbmcgbG9jayAqLworCQlpZiAoZmxhZ3MgJiBCTUFQSV9UUllMT0NLKSB7CisJCQlpZiAoIVhGU19JTE9DS19OT1dBSVQobXAsIGlvLCBsb2NrbW9kZSkpCisJCQkJcmV0dXJuIFhGU19FUlJPUihFQUdBSU4pOworCQl9IGVsc2UgeworCQkJWEZTX0lMT0NLKG1wLCBpbywgbG9ja21vZGUpOworCQl9CisJCWJyZWFrOworCWNhc2UgQk1BUElfVU5XUklUVEVOOgorCQlnb3RvIHBoYXNlMjsKKwljYXNlIEJNQVBJX0RFVklDRToKKwkJbG9ja21vZGUgPSBYRlNfTENLX01BUF9TSEFSRUQobXAsIGlvKTsKKwkJaW9tYXBwLT5pb21hcF90YXJnZXQgPSBpby0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUID8KKwkJCW1wLT5tX3J0ZGV2X3RhcmdwIDogbXAtPm1fZGRldl90YXJncDsKKwkJZXJyb3IgPSAwOworCQkqbmlvbWFwcyA9IDE7CisJCWdvdG8gb3V0OworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCUFTU0VSVChvZmZzZXQgPD0gbXAtPm1fbWF4aW9mZnNldCk7CisJaWYgKCh4ZnNfZnNpemVfdClvZmZzZXQgKyBjb3VudCA+IG1wLT5tX21heGlvZmZzZXQpCisJCWNvdW50ID0gbXAtPm1fbWF4aW9mZnNldCAtIG9mZnNldDsKKwllbmRfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KW9mZnNldCArIGNvdW50KTsKKwlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKKworCWVycm9yID0gWEZTX0JNQVBJKG1wLCBOVUxMLCBpbywgb2Zmc2V0X2ZzYiwKKwkJCSh4ZnNfZmlsYmxrc190KShlbmRfZnNiIC0gb2Zmc2V0X2ZzYiksCisJCQlibWFwaV9mbGFncywgIE5VTEwsIDAsICZpbWFwLAorCQkJJm5pbWFwcywgTlVMTCk7CisKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCitwaGFzZTI6CisJc3dpdGNoIChmbGFncyAmIChCTUFQSV9XUklURXxCTUFQSV9BTExPQ0FURXxCTUFQSV9VTldSSVRURU4pKSB7CisJY2FzZSBCTUFQSV9XUklURToKKwkJLyogSWYgd2UgZm91bmQgYW4gZXh0ZW50LCByZXR1cm4gaXQgKi8KKwkJaWYgKG5pbWFwcyAmJiAoaW1hcC5icl9zdGFydGJsb2NrICE9IEhPTEVTVEFSVEJMT0NLKSkgeworCQkJeGZzX2lvbWFwX21hcF90cmFjZShYRlNfSU9NQVBfV1JJVEVfTUFQLCBpbywKKwkJCQkJb2Zmc2V0LCBjb3VudCwgaW9tYXBwLCAmaW1hcCwgZmxhZ3MpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZmxhZ3MgJiAoQk1BUElfRElSRUNUfEJNQVBJX01NQVApKSB7CisJCQllcnJvciA9IFhGU19JT01BUF9XUklURV9ESVJFQ1QobXAsIGlvLCBvZmZzZXQsCisJCQkJCWNvdW50LCBmbGFncywgJmltYXAsICZuaW1hcHMsIG5pbWFwcyk7CisJCX0gZWxzZSB7CisJCQllcnJvciA9IFhGU19JT01BUF9XUklURV9ERUxBWShtcCwgaW8sIG9mZnNldCwgY291bnQsCisJCQkJCWZsYWdzLCAmaW1hcCwgJm5pbWFwcyk7CisJCX0KKwkJaWYgKCFlcnJvcikgeworCQkJeGZzX2lvbWFwX21hcF90cmFjZShYRlNfSU9NQVBfQUxMT0NfTUFQLCBpbywKKwkJCQkJb2Zmc2V0LCBjb3VudCwgaW9tYXBwLCAmaW1hcCwgZmxhZ3MpOworCQl9CisJCWlvbWFwX2ZsYWdzID0gSU9NQVBfTkVXOworCQlicmVhazsKKwljYXNlIEJNQVBJX0FMTE9DQVRFOgorCQkvKiBJZiB3ZSBmb3VuZCBhbiBleHRlbnQsIHJldHVybiBpdCAqLworCQlYRlNfSVVOTE9DSyhtcCwgaW8sIGxvY2ttb2RlKTsKKwkJbG9ja21vZGUgPSAwOworCisJCWlmIChuaW1hcHMgJiYgIUlTTlVMTFNUQVJUQkxPQ0soaW1hcC5icl9zdGFydGJsb2NrKSkgeworCQkJeGZzX2lvbWFwX21hcF90cmFjZShYRlNfSU9NQVBfV1JJVEVfTUFQLCBpbywKKwkJCQkJb2Zmc2V0LCBjb3VudCwgaW9tYXBwLCAmaW1hcCwgZmxhZ3MpOworCQkJYnJlYWs7CisJCX0KKworCQllcnJvciA9IFhGU19JT01BUF9XUklURV9BTExPQ0FURShtcCwgaW8sICZpbWFwLCAmbmltYXBzKTsKKwkJYnJlYWs7CisJY2FzZSBCTUFQSV9VTldSSVRURU46CisJCWxvY2ttb2RlID0gMDsKKwkJZXJyb3IgPSBYRlNfSU9NQVBfV1JJVEVfVU5XUklUVEVOKG1wLCBpbywgb2Zmc2V0LCBjb3VudCk7CisJCW5pbWFwcyA9IDA7CisJCWJyZWFrOworCX0KKworCWlmIChuaW1hcHMpIHsKKwkJKm5pb21hcHMgPSB4ZnNfaW1hcF90b19ibWFwKGlvLCBvZmZzZXQsICZpbWFwLAorCQkJCQkgICAgaW9tYXBwLCBuaW1hcHMsICpuaW9tYXBzLCBpb21hcF9mbGFncyk7CisJfSBlbHNlIGlmIChuaW9tYXBzKSB7CisJCSpuaW9tYXBzID0gMDsKKwl9CisKK291dDoKKwlpZiAobG9ja21vZGUpCisJCVhGU19JVU5MT0NLKG1wLCBpbywgbG9ja21vZGUpOworCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworfQorCitTVEFUSUMgaW50Cit4ZnNfZmx1c2hfc3BhY2UoCisJeGZzX2lub2RlX3QJKmlwLAorCWludAkJKmZzeW5jZWQsCisJaW50CQkqaW9mbGFncykKK3sKKwlzd2l0Y2ggKCpmc3luY2VkKSB7CisJY2FzZSAwOgorCQlpZiAoaXAtPmlfZGVsYXllZF9ibGtzKSB7CisJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJeGZzX2ZsdXNoX2lub2RlKGlwKTsKKwkJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJKmZzeW5jZWQgPSAxOworCQl9IGVsc2UgeworCQkJKmlvZmxhZ3MgfD0gQk1BUElfU1lOQzsKKwkJCSpmc3luY2VkID0gMjsKKwkJfQorCQlyZXR1cm4gMDsKKwljYXNlIDE6CisJCSpmc3luY2VkID0gMjsKKwkJKmlvZmxhZ3MgfD0gQk1BUElfU1lOQzsKKwkJcmV0dXJuIDA7CisJY2FzZSAyOgorCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl4ZnNfZmx1c2hfZGV2aWNlKGlwKTsKKwkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCSpmc3luY2VkID0gMzsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitpbnQKK3hmc19pb21hcF93cml0ZV9kaXJlY3QoCisJeGZzX2lub2RlX3QJKmlwLAorCWxvZmZfdAkJb2Zmc2V0LAorCXNpemVfdAkJY291bnQsCisJaW50CQlmbGFncywKKwl4ZnNfYm1idF9pcmVjX3QgKnJldF9pbWFwLAorCWludAkJKm5tYXBzLAorCWludAkJZm91bmQpCit7CisJeGZzX21vdW50X3QJKm1wID0gaXAtPmlfbW91bnQ7CisJeGZzX2lvY29yZV90CSppbyA9ICZpcC0+aV9pb2NvcmU7CisJeGZzX2ZpbGVvZmZfdAlvZmZzZXRfZnNiOworCXhmc19maWxlb2ZmX3QJbGFzdF9mc2I7CisJeGZzX2ZpbGJsa3NfdAljb3VudF9mc2I7CisJeGZzX2ZzaXplX3QJaXNpemU7CisJeGZzX2ZzYmxvY2tfdAlmaXJzdGZzYjsKKwlpbnQJCW5pbWFwcywgbWFwczsKKwlpbnQJCWVycm9yOworCWludAkJYm1hcGlfZmxhZzsKKwlpbnQJCXJ0OworCXhmc190cmFuc190CSp0cDsKKwl4ZnNfYm1idF9pcmVjX3QgaW1hcFtYRlNfV1JJVEVfSU1BUFNdLCAqaW1hcHA7CisJeGZzX2JtYXBfZnJlZV90IGZyZWVfbGlzdDsKKwlpbnQJCWFlb2Y7CisJeGZzX2ZpbGJsa3NfdAlkYXRhYmxvY2tzOworCWludAkJY29tbWl0dGVkOworCWludAkJbnVtcnRleHRlbnRzOworCXVpbnQJCXJlc2Jsa3M7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBkcXVvdHMgYXJlIHRoZXJlLiBUaGlzIGRvZXNuJ3QgaG9sZAorCSAqIHRoZSBpbG9jayBhY3Jvc3MgYSBkaXNrIHJlYWQuCisJICovCisJZXJyb3IgPSBYRlNfUU1fRFFBVFRBQ0goaXAtPmlfbW91bnQsIGlwLCBYRlNfUU1PUFRfSUxPQ0tFRCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKKworCW1hcHMgPSBtaW4oWEZTX1dSSVRFX0lNQVBTLCAqbm1hcHMpOworCW5pbWFwcyA9IG1hcHM7CisKKwlpc2l6ZSA9IGlwLT5pX2QuZGlfc2l6ZTsKKwlhZW9mID0gKG9mZnNldCArIGNvdW50KSA+IGlzaXplOworCisJaWYgKGlvLT5pb19uZXdfc2l6ZSA+IGlzaXplKQorCQlpc2l6ZSA9IGlvLT5pb19uZXdfc2l6ZTsKKworCW9mZnNldF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBvZmZzZXQpOworCWxhc3RfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCAoKHhmc191ZnNpemVfdCkob2Zmc2V0ICsgY291bnQpKSk7CisJY291bnRfZnNiID0gbGFzdF9mc2IgLSBvZmZzZXRfZnNiOworCWlmIChmb3VuZCAmJiAocmV0X2ltYXAtPmJyX3N0YXJ0YmxvY2sgPT0gSE9MRVNUQVJUQkxPQ0spKSB7CisJCXhmc19maWxlb2ZmX3QJbWFwX2xhc3RfZnNiOworCisJCW1hcF9sYXN0X2ZzYiA9IHJldF9pbWFwLT5icl9ibG9ja2NvdW50ICsgcmV0X2ltYXAtPmJyX3N0YXJ0b2ZmOworCisJCWlmIChtYXBfbGFzdF9mc2IgPCBsYXN0X2ZzYikgeworCQkJbGFzdF9mc2IgPSBtYXBfbGFzdF9mc2I7CisJCQljb3VudF9mc2IgPSBsYXN0X2ZzYiAtIG9mZnNldF9mc2I7CisJCX0KKwkJQVNTRVJUKGNvdW50X2ZzYiA+IDApOworCX0KKworCS8qCisJICogZGV0ZXJtaW5lIGlmIHJlc2VydmluZyBzcGFjZSBvbgorCSAqIHRoZSBkYXRhIG9yIHJlYWx0aW1lIHBhcnRpdGlvbi4KKwkgKi8KKwlpZiAoKHJ0ID0gWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSkpIHsKKwkJaW50CXNicnRleHRzaXplLCBpcHJ0ZXh0c2l6ZTsKKworCQlzYnJ0ZXh0c2l6ZSA9IG1wLT5tX3NiLnNiX3JleHRzaXplOworCQlpcHJ0ZXh0c2l6ZSA9CisJCQlpcC0+aV9kLmRpX2V4dHNpemUgPyBpcC0+aV9kLmRpX2V4dHNpemUgOiBzYnJ0ZXh0c2l6ZTsKKwkJbnVtcnRleHRlbnRzID0gKGNvdW50X2ZzYiArIGlwcnRleHRzaXplIC0gMSk7CisJCWRvX2RpdihudW1ydGV4dGVudHMsIHNicnRleHRzaXplKTsKKwkJZGF0YWJsb2NrcyA9IDA7CisJfSBlbHNlIHsKKwkJZGF0YWJsb2NrcyA9IGNvdW50X2ZzYjsKKwkJbnVtcnRleHRlbnRzID0gMDsKKwl9CisKKwkvKgorCSAqIGFsbG9jYXRlIGFuZCBzZXR1cCB0aGUgdHJhbnNhY3Rpb24KKwkgKi8KKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfRElPU1RSQVQpOworCisJcmVzYmxrcyA9IFhGU19ESU9TVFJBVF9TUEFDRV9SRVMobXAsIGRhdGFibG9ja3MpOworCisJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgcmVzYmxrcywKKwkJCVhGU19XUklURV9MT0dfUkVTKG1wKSwgbnVtcnRleHRlbnRzLAorCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKKwkJCVhGU19XUklURV9MT0dfQ09VTlQpOworCisJLyoKKwkgKiBjaGVjayBmb3IgcnVubmluZyBvdXQgb2Ygc3BhY2UKKwkgKi8KKwlpZiAoZXJyb3IpCisJCS8qCisJCSAqIEZyZWUgdGhlIHRyYW5zYWN0aW9uIHN0cnVjdHVyZS4KKwkJICovCisJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCisJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3Jfb3V0OyAvKiBEb24ndCByZXR1cm4gaW4gYWJvdmUgaWYgLi4gdHJhbnMgLi4sCisJCQkJCW5lZWQgbG9jayB0byByZXR1cm4gKi8KKworCWlmIChYRlNfVFJBTlNfUkVTRVJWRV9CTEtRVU9UQShtcCwgdHAsIGlwLCByZXNibGtzKSkgeworCQllcnJvciA9IChFRFFVT1QpOworCQlnb3RvIGVycm9yMTsKKwl9CisJbmltYXBzID0gMTsKKworCWJtYXBpX2ZsYWcgPSBYRlNfQk1BUElfV1JJVEU7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19paG9sZCh0cCwgaXApOworCisJaWYgKCEoZmxhZ3MgJiBCTUFQSV9NTUFQKSAmJiAob2Zmc2V0IDwgaXAtPmlfZC5kaV9zaXplIHx8IHJ0KSkKKwkJYm1hcGlfZmxhZyB8PSBYRlNfQk1BUElfUFJFQUxMT0M7CisKKwkvKgorCSAqIGlzc3VlIHRoZSBibWFwaSgpIGNhbGwgdG8gYWxsb2NhdGUgdGhlIGJsb2NrcworCSAqLworCVhGU19CTUFQX0lOSVQoJmZyZWVfbGlzdCwgJmZpcnN0ZnNiKTsKKwlpbWFwcCA9ICZpbWFwWzBdOworCWVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgb2Zmc2V0X2ZzYiwgY291bnRfZnNiLAorCQlibWFwaV9mbGFnLCAmZmlyc3Rmc2IsIDAsIGltYXBwLCAmbmltYXBzLCAmZnJlZV9saXN0KTsKKwlpZiAoZXJyb3IpIHsKKwkJZ290byBlcnJvcjA7CisJfQorCisJLyoKKwkgKiBjb21wbGV0ZSB0aGUgdHJhbnNhY3Rpb24KKwkgKi8KKworCWVycm9yID0geGZzX2JtYXBfZmluaXNoKCZ0cCwgJmZyZWVfbGlzdCwgZmlyc3Rmc2IsICZjb21taXR0ZWQpOworCWlmIChlcnJvcikgeworCQlnb3RvIGVycm9yMDsKKwl9CisKKwllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsIE5VTEwpOworCWlmIChlcnJvcikgeworCQlnb3RvIGVycm9yX291dDsKKwl9CisKKwkvKiBjb3B5IGFueSBtYXBzIHRvIGNhbGxlcidzIGFycmF5IGFuZCByZXR1cm4gYW55IGVycm9yLiAqLworCWlmIChuaW1hcHMgPT0gMCkgeworCQllcnJvciA9IChFTk9TUEMpOworCQlnb3RvIGVycm9yX291dDsKKwl9CisKKwkqcmV0X2ltYXAgPSBpbWFwWzBdOworCSpubWFwcyA9IDE7CisJaWYgKCAhKGlvLT5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpICAmJiAhcmV0X2ltYXAtPmJyX3N0YXJ0YmxvY2spIHsKKyAgICAgICAgICAgICAgICBjbW5fZXJyKENFX1BBTklDLCJBY2Nlc3MgdG8gYmxvY2sgemVybzogIGZzIDwlcz4gaW5vZGU6ICVsbGQgIgorICAgICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2Jsb2NrIDogJWxseCBzdGFydF9vZmYgOiAlbGx4IGJsa2NudCA6ICVsbHggIgorICAgICAgICAgICAgICAgICAgICAgICAgImV4dGVudC1zdGF0ZSA6ICV4IFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpcC0+aV9tb3VudCktPm1fZnNuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylpcC0+aV9pbm8sCisgICAgICAgICAgICAgICAgICAgICAgICByZXRfaW1hcC0+YnJfc3RhcnRibG9jaywgcmV0X2ltYXAtPmJyX3N0YXJ0b2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0X2ltYXAtPmJyX2Jsb2NrY291bnQscmV0X2ltYXAtPmJyX3N0YXRlKTsKKyAgICAgICAgfQorCXJldHVybiAwOworCisgZXJyb3IwOgkvKiBDYW5jZWwgYm1hcCwgdW5sb2NrIGlub2RlLCBhbmQgY2FuY2VsIHRyYW5zICovCisJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOworCisgZXJyb3IxOgkvKiBKdXN0IGNhbmNlbCB0cmFuc2FjdGlvbiAqLworCXhmc190cmFuc19jYW5jZWwodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMgfCBYRlNfVFJBTlNfQUJPUlQpOworCSpubWFwcyA9IDA7CS8qIG5vdGhpbmcgc2V0LXVwIGhlcmUgKi8KKworZXJyb3Jfb3V0OgorCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworfQorCitpbnQKK3hmc19pb21hcF93cml0ZV9kZWxheSgKKwl4ZnNfaW5vZGVfdAkqaXAsCisJbG9mZl90CQlvZmZzZXQsCisJc2l6ZV90CQljb3VudCwKKwlpbnQJCWlvZmxhZywKKwl4ZnNfYm1idF9pcmVjX3QgKnJldF9pbWFwLAorCWludAkJKm5tYXBzKQoreworCXhmc19tb3VudF90CSptcCA9IGlwLT5pX21vdW50OworCXhmc19pb2NvcmVfdAkqaW8gPSAmaXAtPmlfaW9jb3JlOworCXhmc19maWxlb2ZmX3QJb2Zmc2V0X2ZzYjsKKwl4ZnNfZmlsZW9mZl90CWxhc3RfZnNiOworCXhmc19mc2l6ZV90CWlzaXplOworCXhmc19mc2Jsb2NrX3QJZmlyc3RibG9jazsKKwlpbnQJCW5pbWFwczsKKwlpbnQJCWVycm9yOworCXhmc19ibWJ0X2lyZWNfdCBpbWFwW1hGU19XUklURV9JTUFQU107CisJaW50CQlhZW9mOworCWludAkJZnN5bmNlZCA9IDA7CisKKwlBU1NFUlQoaXNtcmxvY2tlZCgmaXAtPmlfbG9jaywgTVJfVVBEQVRFKSAhPSAwKTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgdGhlIGRxdW90cyBhcmUgdGhlcmUuIFRoaXMgZG9lc24ndCBob2xkCisJICogdGhlIGlsb2NrIGFjcm9zcyBhIGRpc2sgcmVhZC4KKwkgKi8KKworCWVycm9yID0gWEZTX1FNX0RRQVRUQUNIKG1wLCBpcCwgWEZTX1FNT1BUX0lMT0NLRUQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7CisKK3JldHJ5OgorCWlzaXplID0gaXAtPmlfZC5kaV9zaXplOworCWlmIChpby0+aW9fbmV3X3NpemUgPiBpc2l6ZSkgeworCQlpc2l6ZSA9IGlvLT5pb19uZXdfc2l6ZTsKKwl9CisKKwlhZW9mID0gMDsKKwlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKKwlsYXN0X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKCh4ZnNfdWZzaXplX3QpKG9mZnNldCArIGNvdW50KSkpOworCS8qCisJICogSWYgdGhlIGNhbGxlciBpcyBkb2luZyBhIHdyaXRlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsCisJICogdGhlbiBleHRlbmQgdGhlIGFsbG9jYXRpb24gKGFuZCB0aGUgYnVmZmVyIHVzZWQgZm9yIHRoZSB3cml0ZSkKKwkgKiBvdXQgdG8gdGhlIGZpbGUgc3lzdGVtJ3Mgd3JpdGUgaW9zaXplLiAgV2UgY2xlYW4gdXAgYW55IGV4dHJhCisJICogc3BhY2UgbGVmdCBvdmVyIHdoZW4gdGhlIGZpbGUgaXMgY2xvc2VkIGluIHhmc19pbmFjdGl2ZSgpLgorCSAqCisJICogRm9yIHN5bmMgd3JpdGVzLCB3ZSBhcmUgZmx1c2hpbmcgZGVsYXllZCBhbGxvY2F0ZSBzcGFjZSB0bworCSAqIHRyeSB0byBtYWtlIGFkZGl0aW9uYWwgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uIG5lYXIKKwkgKiB0aGUgZmlsZXN5c3RlbSBmdWxsIGJvdW5kYXJ5IC0gcHJlYWxsb2NhdGlvbiBodXJ0cyBpbiB0aGF0CisJICogc2l0dWF0aW9uLCBvZiBjb3Vyc2UuCisJICovCisJaWYgKCEoaW9mbGFnICYgQk1BUElfU1lOQykgJiYgKChvZmZzZXQgKyBjb3VudCkgPiBpcC0+aV9kLmRpX3NpemUpKSB7CisJCXhmc19vZmZfdAlhbGlnbmVkX29mZnNldDsKKwkJeGZzX2ZpbGJsa3NfdCAgIGNvdW50X2ZzYjsKKwkJdW5zaWduZWQgaW50CWlvc2l6ZTsKKwkJeGZzX2ZpbGVvZmZfdAlpb2FsaWduOworCQlpbnQJCW47CisJCXhmc19maWxlb2ZmX3QgICBzdGFydF9mc2I7CisKKwkJLyoKKwkJICogSWYgdGhlcmUgYXJlIGFueSByZWFsIGJsb2NrcyBwYXN0IGVvZiwgdGhlbiBkb24ndAorCQkgKiBkbyBhbnkgc3BlY3VsYXRpdmUgYWxsb2NhdGlvbi4KKwkJICovCisJCXN0YXJ0X2ZzYiA9IFhGU19CX1RPX0ZTQlQobXAsCisJCQkJCSgoeGZzX3Vmc2l6ZV90KShvZmZzZXQgKyBjb3VudCAtIDEpKSk7CisJCWNvdW50X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKHhmc191ZnNpemVfdClYRlNfTUFYSU9GRlNFVChtcCkpOworCQl3aGlsZSAoY291bnRfZnNiID4gMCkgeworCQkJbmltYXBzID0gWEZTX1dSSVRFX0lNQVBTOworCQkJZXJyb3IgPSBYRlNfQk1BUEkobXAsIE5VTEwsIGlvLCBzdGFydF9mc2IsIGNvdW50X2ZzYiwKKwkJCQkJMCwgJmZpcnN0YmxvY2ssIDAsIGltYXAsICZuaW1hcHMsIE5VTEwpOworCQkJaWYgKGVycm9yKSB7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQkJZm9yIChuID0gMDsgbiA8IG5pbWFwczsgbisrKSB7CisJCQkJaWYgKCAhKGlvLT5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpICAmJiAKKwkJCQkJIWltYXBbbl0uYnJfc3RhcnRibG9jaykgeworCQkJCQljbW5fZXJyKENFX1BBTklDLCJBY2Nlc3MgdG8gYmxvY2sgIgorCQkJCQkJInplcm86ICBmcyA8JXM+IGlub2RlOiAlbGxkICIKKwkJCQkJCSJzdGFydF9ibG9jayA6ICVsbHggc3RhcnRfb2ZmICIKKwkJCQkJCSI6ICVsbHggYmxrY250IDogJWxseCAiCisJCQkJCQkiZXh0ZW50LXN0YXRlIDogJXggXG4iLAorCQkJCQkJKGlwLT5pX21vdW50KS0+bV9mc25hbWUsCisJCQkJCQkobG9uZyBsb25nKWlwLT5pX2lubywKKwkJCQkJCWltYXBbbl0uYnJfc3RhcnRibG9jaywKKwkJCQkJCWltYXBbbl0uYnJfc3RhcnRvZmYsCisJCQkJCQlpbWFwW25dLmJyX2Jsb2NrY291bnQsCisJCQkJCQlpbWFwW25dLmJyX3N0YXRlKTsKKyAgICAgICAgCQkJfQorCQkJCWlmICgoaW1hcFtuXS5icl9zdGFydGJsb2NrICE9IEhPTEVTVEFSVEJMT0NLKSAmJgorCQkJCSAgICAoaW1hcFtuXS5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSykpIHsKKwkJCQkJZ290byB3cml0ZV9tYXA7CisJCQkJfQorCQkJCXN0YXJ0X2ZzYiArPSBpbWFwW25dLmJyX2Jsb2NrY291bnQ7CisJCQkJY291bnRfZnNiIC09IGltYXBbbl0uYnJfYmxvY2tjb3VudDsKKwkJCX0KKwkJfQorCQlpb3NpemUgPSBtcC0+bV93cml0ZWlvX2Jsb2NrczsKKwkJYWxpZ25lZF9vZmZzZXQgPSBYRlNfV1JJVEVJT19BTElHTihtcCwgKG9mZnNldCArIGNvdW50IC0gMSkpOworCQlpb2FsaWduID0gWEZTX0JfVE9fRlNCVChtcCwgYWxpZ25lZF9vZmZzZXQpOworCQlsYXN0X2ZzYiA9IGlvYWxpZ24gKyBpb3NpemU7CisJCWFlb2YgPSAxOworCX0KK3dyaXRlX21hcDoKKwluaW1hcHMgPSBYRlNfV1JJVEVfSU1BUFM7CisJZmlyc3RibG9jayA9IE5VTExGU0JMT0NLOworCisJLyoKKwkgKiBJZiBtb3VudGVkIHdpdGggdGhlICItbyBzd2FsbG9jIiBvcHRpb24sIHJvdW5kdXAgdGhlIGFsbG9jYXRpb24KKwkgKiByZXF1ZXN0IHRvIGEgc3RyaXBlIHdpZHRoIGJvdW5kYXJ5IGlmIHRoZSBmaWxlIHNpemUgaXMgPj0KKwkgKiBzdHJpcGUgd2lkdGggYW5kIHdlIGFyZSBhbGxvY2F0aW5nIHBhc3QgdGhlIGFsbG9jYXRpb24gZW9mLgorCSAqLworCWlmICghKGlvLT5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpICYmIG1wLT5tX3N3aWR0aCAKKwkgICAgJiYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1NXQUxMT0MpCisJICAgICYmIChpc2l6ZSA+PSBYRlNfRlNCX1RPX0IobXAsIG1wLT5tX3N3aWR0aCkpICYmIGFlb2YpIHsKKwkJaW50IGVvZjsKKwkJeGZzX2ZpbGVvZmZfdCBuZXdfbGFzdF9mc2I7CisKKwkJbmV3X2xhc3RfZnNiID0gcm91bmR1cF82NChsYXN0X2ZzYiwgbXAtPm1fc3dpZHRoKTsKKwkJZXJyb3IgPSB4ZnNfYm1hcF9lb2YoaXAsIG5ld19sYXN0X2ZzYiwgWEZTX0RBVEFfRk9SSywgJmVvZik7CisJCWlmIChlcnJvcikgeworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCWlmIChlb2YpIHsKKwkJCWxhc3RfZnNiID0gbmV3X2xhc3RfZnNiOworCQl9CisJLyoKKwkgKiBSb3VuZHVwIHRoZSBhbGxvY2F0aW9uIHJlcXVlc3QgdG8gYSBzdHJpcGUgdW5pdCAobV9kYWxpZ24pIGJvdW5kYXJ5CisJICogaWYgdGhlIGZpbGUgc2l6ZSBpcyA+PSBzdHJpcGUgdW5pdCBzaXplLCBhbmQgd2UgYXJlIGFsbG9jYXRpbmcgcGFzdAorCSAqIHRoZSBhbGxvY2F0aW9uIGVvZi4KKwkgKi8KKwl9IGVsc2UgaWYgKCEoaW8tPmlvX2ZsYWdzICYgWEZTX0lPQ09SRV9SVCkgJiYgbXAtPm1fZGFsaWduICYmCisJCSAgIChpc2l6ZSA+PSBYRlNfRlNCX1RPX0IobXAsIG1wLT5tX2RhbGlnbikpICYmIGFlb2YpIHsKKwkJaW50IGVvZjsKKwkJeGZzX2ZpbGVvZmZfdCBuZXdfbGFzdF9mc2I7CisJCW5ld19sYXN0X2ZzYiA9IHJvdW5kdXBfNjQobGFzdF9mc2IsIG1wLT5tX2RhbGlnbik7CisJCWVycm9yID0geGZzX2JtYXBfZW9mKGlwLCBuZXdfbGFzdF9mc2IsIFhGU19EQVRBX0ZPUkssICZlb2YpOworCQlpZiAoZXJyb3IpIHsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlpZiAoZW9mKSB7CisJCQlsYXN0X2ZzYiA9IG5ld19sYXN0X2ZzYjsKKwkJfQorCS8qCisJICogUm91bmQgdXAgdGhlIGFsbG9jYXRpb24gcmVxdWVzdCB0byBhIHJlYWwtdGltZSBleHRlbnQgYm91bmRhcnkKKwkgKiBpZiB0aGUgZmlsZSBpcyBvbiB0aGUgcmVhbC10aW1lIHN1YnZvbHVtZS4KKwkgKi8KKwl9IGVsc2UgaWYgKGlvLT5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQgJiYgYWVvZikgeworCQlpbnQgZW9mOworCQl4ZnNfZmlsZW9mZl90IG5ld19sYXN0X2ZzYjsKKworCQluZXdfbGFzdF9mc2IgPSByb3VuZHVwXzY0KGxhc3RfZnNiLCBtcC0+bV9zYi5zYl9yZXh0c2l6ZSk7CisJCWVycm9yID0gWEZTX0JNQVBfRU9GKG1wLCBpbywgbmV3X2xhc3RfZnNiLCBYRlNfREFUQV9GT1JLLCAmZW9mKTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJaWYgKGVvZikKKwkJCWxhc3RfZnNiID0gbmV3X2xhc3RfZnNiOworCX0KKwllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgb2Zmc2V0X2ZzYiwKKwkJCSAgKHhmc19maWxibGtzX3QpKGxhc3RfZnNiIC0gb2Zmc2V0X2ZzYiksCisJCQkgIFhGU19CTUFQSV9ERUxBWSB8IFhGU19CTUFQSV9XUklURSB8CisJCQkgIFhGU19CTUFQSV9FTlRJUkUsICZmaXJzdGJsb2NrLCAxLCBpbWFwLAorCQkJICAmbmltYXBzLCBOVUxMKTsKKwkvKgorCSAqIFRoaXMgY2FuIGJlIEVEUVVPVCwgaWYgbmltYXBzID09IDAKKwkgKi8KKwlpZiAoZXJyb3IgJiYgKGVycm9yICE9IEVOT1NQQykpIHsKKwkJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7CisJfQorCS8qCisJICogSWYgYm1hcGkgcmV0dXJuZWQgdXMgbm90aGluZywgYW5kIGlmIHdlIGRpZG4ndCBnZXQgYmFjayBFRFFVT1QsCisJICogdGhlbiB3ZSBtdXN0IGhhdmUgcnVuIG91dCBvZiBzcGFjZS4KKwkgKi8KKwlpZiAobmltYXBzID09IDApIHsKKwkJeGZzX2lvbWFwX2VudGVyX3RyYWNlKFhGU19JT01BUF9XUklURV9OT1NQQUNFLAorCQkJCQlpbywgb2Zmc2V0LCBjb3VudCk7CisJCWlmICh4ZnNfZmx1c2hfc3BhY2UoaXAsICZmc3luY2VkLCAmaW9mbGFnKSkKKwkJCXJldHVybiBYRlNfRVJST1IoRU5PU1BDKTsKKworCQllcnJvciA9IDA7CisJCWdvdG8gcmV0cnk7CisJfQorCisJKnJldF9pbWFwID0gaW1hcFswXTsKKwkqbm1hcHMgPSAxOworCWlmICggIShpby0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUKSAgJiYgIXJldF9pbWFwLT5icl9zdGFydGJsb2NrKSB7CisJCWNtbl9lcnIoQ0VfUEFOSUMsIkFjY2VzcyB0byBibG9jayB6ZXJvOiAgZnMgPCVzPiBpbm9kZTogJWxsZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAic3RhcnRfYmxvY2sgOiAlbGx4IHN0YXJ0X29mZiA6ICVsbHggYmxrY250IDogJWxseCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZXh0ZW50LXN0YXRlIDogJXggXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgKGlwLT5pX21vdW50KS0+bV9mc25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWlwLT5pX2lubywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldF9pbWFwLT5icl9zdGFydGJsb2NrLCByZXRfaW1hcC0+YnJfc3RhcnRvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICByZXRfaW1hcC0+YnJfYmxvY2tjb3VudCxyZXRfaW1hcC0+YnJfc3RhdGUpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBhc3MgaW4gYSBkZWxheWVkIGFsbG9jYXRlIGV4dGVudCwgY29udmVydCBpdCB0byByZWFsIGV4dGVudHM7CisgKiByZXR1cm4gdG8gdGhlIGNhbGxlciB0aGUgZXh0ZW50IHdlIGNyZWF0ZSB3aGljaCBtYXBzIG9uIHRvcCBvZgorICogdGhlIG9yaWdpbmF0aW5nIGNhbGxlcnMgcmVxdWVzdC4KKyAqCisgKiBDYWxsZWQgd2l0aG91dCBhIGxvY2sgb24gdGhlIGlub2RlLgorICovCitpbnQKK3hmc19pb21hcF93cml0ZV9hbGxvY2F0ZSgKKwl4ZnNfaW5vZGVfdAkqaXAsCisJeGZzX2JtYnRfaXJlY190ICptYXAsCisJaW50CQkqcmV0bWFwKQoreworCXhmc19tb3VudF90CSptcCA9IGlwLT5pX21vdW50OworCXhmc19pb2NvcmVfdCAgICAqaW8gPSAmaXAtPmlfaW9jb3JlOworCXhmc19maWxlb2ZmX3QJb2Zmc2V0X2ZzYiwgbGFzdF9ibG9jazsKKwl4ZnNfZmlsZW9mZl90CWVuZF9mc2IsIG1hcF9zdGFydF9mc2I7CisJeGZzX2ZzYmxvY2tfdAlmaXJzdF9ibG9jazsKKwl4ZnNfYm1hcF9mcmVlX3QJZnJlZV9saXN0OworCXhmc19maWxibGtzX3QJY291bnRfZnNiOworCXhmc19ibWJ0X2lyZWNfdAlpbWFwW1hGU19TVFJBVF9XUklURV9JTUFQU107CisJeGZzX3RyYW5zX3QJKnRwOworCWludAkJaSwgbmltYXBzLCBjb21taXR0ZWQ7CisJaW50CQllcnJvciA9IDA7CisJaW50CQlucmVzOworCisJKnJldG1hcCA9IDA7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBkcXVvdHMgYXJlIHRoZXJlLgorCSAqLworCWlmICgoZXJyb3IgPSBYRlNfUU1fRFFBVFRBQ0gobXAsIGlwLCAwKSkpCisJCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworCisJb2Zmc2V0X2ZzYiA9IG1hcC0+YnJfc3RhcnRvZmY7CisJY291bnRfZnNiID0gbWFwLT5icl9ibG9ja2NvdW50OworCW1hcF9zdGFydF9mc2IgPSBvZmZzZXRfZnNiOworCisJWEZTX1NUQVRTX0FERCh4c194c3RyYXRfYnl0ZXMsIFhGU19GU0JfVE9fQihtcCwgY291bnRfZnNiKSk7CisKKwl3aGlsZSAoY291bnRfZnNiICE9IDApIHsKKwkJLyoKKwkJICogU2V0IHVwIGEgdHJhbnNhY3Rpb24gd2l0aCB3aGljaCB0byBhbGxvY2F0ZSB0aGUKKwkJICogYmFja2luZyBzdG9yZSBmb3IgdGhlIGZpbGUuICBEbyBhbGxvY2F0aW9ucyBpbiBhCisJCSAqIGxvb3AgdW50aWwgd2UgZ2V0IHNvbWUgc3BhY2UgaW4gdGhlIHJhbmdlIHdlIGFyZQorCQkgKiBpbnRlcmVzdGVkIGluLiAgVGhlIG90aGVyIHNwYWNlIHRoYXQgbWlnaHQgYmUgYWxsb2NhdGVkCisJCSAqIGlzIGluIHRoZSBkZWxheWVkIGFsbG9jYXRpb24gZXh0ZW50IG9uIHdoaWNoIHdlIHNpdAorCQkgKiBidXQgYmVmb3JlIG91ciBidWZmZXIgc3RhcnRzLgorCQkgKi8KKworCQluaW1hcHMgPSAwOworCQl3aGlsZSAobmltYXBzID09IDApIHsKKwkJCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfU1RSQVRfV1JJVEUpOworCQkJbnJlcyA9IFhGU19FWFRFTlRBRERfU1BBQ0VfUkVTKG1wLCBYRlNfREFUQV9GT1JLKTsKKwkJCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIG5yZXMsCisJCQkJCVhGU19XUklURV9MT0dfUkVTKG1wKSwKKwkJCQkJMCwgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKKwkJCQkJWEZTX1dSSVRFX0xPR19DT1VOVCk7CisJCQlpZiAoZXJyb3IgPT0gRU5PU1BDKSB7CisJCQkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwKKwkJCQkJCVhGU19XUklURV9MT0dfUkVTKG1wKSwKKwkJCQkJCTAsCisJCQkJCQlYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAorCQkJCQkJWEZTX1dSSVRFX0xPR19DT1VOVCk7CisJCQl9CisJCQlpZiAoZXJyb3IpIHsKKwkJCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKKwkJCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKKwkJCX0KKwkJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CisKKwkJCVhGU19CTUFQX0lOSVQoJmZyZWVfbGlzdCwgJmZpcnN0X2Jsb2NrKTsKKworCQkJbmltYXBzID0gWEZTX1NUUkFUX1dSSVRFX0lNQVBTOworCQkJLyoKKwkJCSAqIEVuc3VyZSB3ZSBkb24ndCBnbyBiZXlvbmQgZW9mIC0gaXQgaXMgcG9zc2libGUKKwkJCSAqIHRoZSBleHRlbnRzIGNoYW5nZWQgc2luY2Ugd2UgZGlkIHRoZSByZWFkIGNhbGwsCisJCQkgKiB3ZSBkcm9wcGVkIHRoZSBpbG9jayBpbiB0aGUgaW50ZXJpbS4KKwkJCSAqLworCisJCQllbmRfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCBpcC0+aV9kLmRpX3NpemUpOworCQkJeGZzX2JtYXBfbGFzdF9vZmZzZXQoTlVMTCwgaXAsICZsYXN0X2Jsb2NrLAorCQkJCVhGU19EQVRBX0ZPUkspOworCQkJbGFzdF9ibG9jayA9IFhGU19GSUxFT0ZGX01BWChsYXN0X2Jsb2NrLCBlbmRfZnNiKTsKKwkJCWlmICgobWFwX3N0YXJ0X2ZzYiArIGNvdW50X2ZzYikgPiBsYXN0X2Jsb2NrKSB7CisJCQkJY291bnRfZnNiID0gbGFzdF9ibG9jayAtIG1hcF9zdGFydF9mc2I7CisJCQkJaWYgKGNvdW50X2ZzYiA9PSAwKSB7CisJCQkJCWVycm9yID0gRUFHQUlOOworCQkJCQlnb3RvIHRyYW5zX2NhbmNlbDsKKwkJCQl9CisJCQl9CisKKwkJCS8qIEdvIGdldCB0aGUgYWN0dWFsIGJsb2NrcyAqLworCQkJZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGlwLCBtYXBfc3RhcnRfZnNiLCBjb3VudF9mc2IsCisJCQkJCVhGU19CTUFQSV9XUklURSwgJmZpcnN0X2Jsb2NrLCAxLAorCQkJCQlpbWFwLCAmbmltYXBzLCAmZnJlZV9saXN0KTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIHRyYW5zX2NhbmNlbDsKKworCQkJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJnRwLCAmZnJlZV9saXN0LAorCQkJCQlmaXJzdF9ibG9jaywgJmNvbW1pdHRlZCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byB0cmFuc19jYW5jZWw7CisKKwkJCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwKKwkJCQkJWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUywgTlVMTCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBlcnJvcjA7CisKKwkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCX0KKworCQkvKgorCQkgKiBTZWUgaWYgd2Ugd2VyZSBhYmxlIHRvIGFsbG9jYXRlIGFuIGV4dGVudCB0aGF0CisJCSAqIGNvdmVycyBhdCBsZWFzdCBwYXJ0IG9mIHRoZSBjYWxsZXJzIHJlcXVlc3QKKwkJICovCisKKwkJZm9yIChpID0gMDsgaSA8IG5pbWFwczsgaSsrKSB7CisJCQlpZiAoICEoaW8tPmlvX2ZsYWdzICYgWEZTX0lPQ09SRV9SVCkgICYmIAorCQkJCSFpbWFwW2ldLmJyX3N0YXJ0YmxvY2spIHsKKwkJCQljbW5fZXJyKENFX1BBTklDLCJBY2Nlc3MgdG8gYmxvY2sgemVybzogICIKKwkJCQkJImZzIDwlcz4gaW5vZGU6ICVsbGQgIgorCQkJCQkic3RhcnRfYmxvY2sgOiAlbGx4IHN0YXJ0X29mZiA6ICVsbHggIiAKKwkJCQkJImJsa2NudCA6ICVsbHggZXh0ZW50LXN0YXRlIDogJXggXG4iLAorCQkJCQkoaXAtPmlfbW91bnQpLT5tX2ZzbmFtZSwKKwkJCQkJKGxvbmcgbG9uZylpcC0+aV9pbm8sCisJCQkJCWltYXBbaV0uYnJfc3RhcnRibG9jaywKKwkJCQkJaW1hcFtpXS5icl9zdGFydG9mZiwKKwkJCQkgICAgICAgIGltYXBbaV0uYnJfYmxvY2tjb3VudCxpbWFwW2ldLmJyX3N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCWlmICgobWFwLT5icl9zdGFydG9mZiA+PSBpbWFwW2ldLmJyX3N0YXJ0b2ZmKSAmJgorCQkJICAgIChtYXAtPmJyX3N0YXJ0b2ZmIDwgKGltYXBbaV0uYnJfc3RhcnRvZmYgKworCQkJCQkJIGltYXBbaV0uYnJfYmxvY2tjb3VudCkpKSB7CisJCQkJKm1hcCA9IGltYXBbaV07CisJCQkJKnJldG1hcCA9IDE7CisJCQkJWEZTX1NUQVRTX0lOQyh4c194c3RyYXRfcXVpY2spOworCQkJCXJldHVybiAwOworCQkJfQorCQkJY291bnRfZnNiIC09IGltYXBbaV0uYnJfYmxvY2tjb3VudDsKKwkJfQorCisJCS8qIFNvIGZhciB3ZSBoYXZlIG5vdCBtYXBwZWQgdGhlIHJlcXVlc3RlZCBwYXJ0IG9mIHRoZQorCQkgKiBmaWxlLCBqdXN0IHN1cnJvdW5kaW5nIGRhdGEsIHRyeSBhZ2Fpbi4KKwkJICovCisJCW5pbWFwcy0tOworCQlvZmZzZXRfZnNiID0gaW1hcFtuaW1hcHNdLmJyX3N0YXJ0b2ZmICsKKwkJCSAgICAgaW1hcFtuaW1hcHNdLmJyX2Jsb2NrY291bnQ7CisJCW1hcF9zdGFydF9mc2IgPSBvZmZzZXRfZnNiOworCX0KKwordHJhbnNfY2FuY2VsOgorCXhmc19ibWFwX2NhbmNlbCgmZnJlZV9saXN0KTsKKwl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTIHwgWEZTX1RSQU5TX0FCT1JUKTsKK2Vycm9yMDoKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworfQorCitpbnQKK3hmc19pb21hcF93cml0ZV91bndyaXR0ZW4oCisJeGZzX2lub2RlX3QJKmlwLAorCWxvZmZfdAkJb2Zmc2V0LAorCXNpemVfdAkJY291bnQpCit7CisJeGZzX21vdW50X3QJKm1wID0gaXAtPmlfbW91bnQ7CisJeGZzX2lvY29yZV90ICAgICppbyA9ICZpcC0+aV9pb2NvcmU7CisJeGZzX3RyYW5zX3QJKnRwOworCXhmc19maWxlb2ZmX3QJb2Zmc2V0X2ZzYjsKKwl4ZnNfZmlsYmxrc190CWNvdW50X2ZzYjsKKwl4ZnNfZmlsYmxrc190CW51bWJsa3NfZnNiOworCXhmc19ibWJ0X2lyZWNfdAlpbWFwOworCWludAkJY29tbWl0dGVkOworCWludAkJZXJyb3I7CisJaW50CQlucmVzOworCWludAkJbmltYXBzOworCXhmc19mc2Jsb2NrX3QJZmlyc3Rmc2I7CisJeGZzX2JtYXBfZnJlZV90CWZyZWVfbGlzdDsKKworCXhmc19pb21hcF9lbnRlcl90cmFjZShYRlNfSU9NQVBfVU5XUklUVEVOLAorCQkJCSZpcC0+aV9pb2NvcmUsIG9mZnNldCwgY291bnQpOworCisJb2Zmc2V0X2ZzYiA9IFhGU19CX1RPX0ZTQlQobXAsIG9mZnNldCk7CisJY291bnRfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KW9mZnNldCArIGNvdW50KTsKKwljb3VudF9mc2IgPSAoeGZzX2ZpbGJsa3NfdCkoY291bnRfZnNiIC0gb2Zmc2V0X2ZzYik7CisKKwlkbyB7CisJCW5yZXMgPSBYRlNfRElPU1RSQVRfU1BBQ0VfUkVTKG1wLCAwKTsKKworCQkvKgorCQkgKiBzZXQgdXAgYSB0cmFuc2FjdGlvbiB0byBjb252ZXJ0IHRoZSByYW5nZSBvZiBleHRlbnRzCisJCSAqIGZyb20gdW53cml0dGVuIHRvIHJlYWwuIERvIGFsbG9jYXRpb25zIGluIGEgbG9vcCB1bnRpbAorCQkgKiB3ZSBoYXZlIGNvdmVyZWQgdGhlIHJhbmdlIHBhc3NlZCBpbi4KKwkJICovCisKKwkJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19TVFJBVF9XUklURSk7CisJCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIG5yZXMsCisJCQkJWEZTX1dSSVRFX0xPR19SRVMobXApLCAwLAorCQkJCVhGU19UUkFOU19QRVJNX0xPR19SRVMsCisJCQkJWEZTX1dSSVRFX0xPR19DT1VOVCk7CisJCWlmIChlcnJvcikgeworCQkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCisJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCXhmc190cmFuc19paG9sZCh0cCwgaXApOworCisJCS8qCisJCSAqIE1vZGlmeSB0aGUgdW53cml0dGVuIGV4dGVudCBzdGF0ZSBvZiB0aGUgYnVmZmVyLgorCQkgKi8KKwkJWEZTX0JNQVBfSU5JVCgmZnJlZV9saXN0LCAmZmlyc3Rmc2IpOworCQluaW1hcHMgPSAxOworCQllcnJvciA9IHhmc19ibWFwaSh0cCwgaXAsIG9mZnNldF9mc2IsIGNvdW50X2ZzYiwKKwkJCQkgIFhGU19CTUFQSV9XUklURSwgJmZpcnN0ZnNiLAorCQkJCSAgMSwgJmltYXAsICZuaW1hcHMsICZmcmVlX2xpc3QpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yX29uX2JtYXBpX3RyYW5zYWN0aW9uOworCisJCWVycm9yID0geGZzX2JtYXBfZmluaXNoKCYodHApLCAmKGZyZWVfbGlzdCksCisJCQkJZmlyc3Rmc2IsICZjb21taXR0ZWQpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yX29uX2JtYXBpX3RyYW5zYWN0aW9uOworCisJCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUywgTlVMTCk7CisJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3IwOworCQkKKwkJaWYgKCAhKGlvLT5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpICAmJiAhaW1hcC5icl9zdGFydGJsb2NrKSB7CisJCQljbW5fZXJyKENFX1BBTklDLCJBY2Nlc3MgdG8gYmxvY2sgemVybzogIGZzIDwlcz4gIgorCQkJCSJpbm9kZTogJWxsZCBzdGFydF9ibG9jayA6ICVsbHggc3RhcnRfb2ZmIDogIgorCQkJCSIlbGx4IGJsa2NudCA6ICVsbHggZXh0ZW50LXN0YXRlIDogJXggXG4iLAorCQkJCShpcC0+aV9tb3VudCktPm1fZnNuYW1lLAorCQkJCShsb25nIGxvbmcpaXAtPmlfaW5vLAorCQkJCWltYXAuYnJfc3RhcnRibG9jayxpbWFwLmJyX3N0YXJ0b2ZmLAorCQkJCWltYXAuYnJfYmxvY2tjb3VudCxpbWFwLmJyX3N0YXRlKTsKKyAgICAgICAgCX0KKworCQlpZiAoKG51bWJsa3NfZnNiID0gaW1hcC5icl9ibG9ja2NvdW50KSA9PSAwKSB7CisJCQkvKgorCQkJICogVGhlIG51bWJsa3NfZnNiIHZhbHVlIHNob3VsZCBhbHdheXMgZ2V0CisJCQkgKiBzbWFsbGVyLCBvdGhlcndpc2UgdGhlIGxvb3AgaXMgc3R1Y2suCisJCQkgKi8KKwkJCUFTU0VSVChpbWFwLmJyX2Jsb2NrY291bnQpOworCQkJYnJlYWs7CisJCX0KKwkJb2Zmc2V0X2ZzYiArPSBudW1ibGtzX2ZzYjsKKwkJY291bnRfZnNiIC09IG51bWJsa3NfZnNiOworCX0gd2hpbGUgKGNvdW50X2ZzYiA+IDApOworCisJcmV0dXJuIDA7CisKK2Vycm9yX29uX2JtYXBpX3RyYW5zYWN0aW9uOgorCXhmc19ibWFwX2NhbmNlbCgmZnJlZV9saXN0KTsKKwl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAoWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUyB8IFhGU19UUkFOU19BQk9SVCkpOworCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CitlcnJvcjA6CisJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lvbWFwLmggYi9mcy94ZnMveGZzX2lvbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjOTEwOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfaW9tYXAuaApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMywyMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworCisKKyNpZm5kZWYgX19YRlNfSU9NQVBfSF9fCisjZGVmaW5lIF9fWEZTX0lPTUFQX0hfXworCisjZGVmaW5lIElPTUFQX0RBRERSX05VTEwgKCh4ZnNfZGFkZHJfdCkgKC0xTEwpKQorCisKK3R5cGVkZWYgZW51bSB7CQkJCS8qIGlvbWFwX2ZsYWdzIHZhbHVlcyAqLworCUlPTUFQX0VPRiA9CQkweDAxLAkvKiBtYXBwaW5nIGNvbnRhaW5zIEVPRiAgICovCisJSU9NQVBfSE9MRSA9CQkweDAyLAkvKiBtYXBwaW5nIGNvdmVycyBhIGhvbGUgICovCisJSU9NQVBfREVMQVkgPQkJMHgwNCwJLyogbWFwcGluZyBjb3ZlcnMgZGVsYWxsb2MgcmVnaW9uICAqLworCUlPTUFQX1JFQUxUSU1FID0JMHgxMCwJLyogbWFwcGluZyBvbiB0aGUgcmVhbHRpbWUgZGV2aWNlICAqLworCUlPTUFQX1VOV1JJVFRFTiA9CTB4MjAsCS8qIG1hcHBpbmcgY292ZXJzIGFsbG9jYXRlZCAqLworCQkJCQkvKiBidXQgdW5pbml0aWFsaXplZCBmaWxlIGRhdGEgICovCisJSU9NQVBfTkVXID0JCTB4NDAJLyoganVzdCBhbGxvY2F0ZSAqLworfSBpb21hcF9mbGFnc190OworCit0eXBlZGVmIGVudW0geworCS8qIGJhc2UgZXh0ZW50IG1hbmlwdWxhdGlvbiBjYWxscyAqLworCUJNQVBJX1JFQUQgPSAoMSA8PCAwKSwJCS8qIHJlYWQgZXh0ZW50cyAqLworCUJNQVBJX1dSSVRFID0gKDEgPDwgMSksCQkvKiBjcmVhdGUgZXh0ZW50cyAqLworCUJNQVBJX0FMTE9DQVRFID0gKDEgPDwgMiksCS8qIGRlbGF5ZWQgYWxsb2NhdGUgdG8gcmVhbCBleHRlbnRzICovCisJQk1BUElfVU5XUklUVEVOICA9ICgxIDw8IDMpLAkvKiB1bndyaXR0ZW4gZXh0ZW50cyB0byByZWFsIGV4dGVudHMgKi8KKwkvKiBtb2RpZmllcnMgKi8KKwlCTUFQSV9JR05TVEFURSA9ICgxIDw8IDQpLAkvKiBpZ25vcmUgdW53cml0dGVuIHN0YXRlIG9uIHJlYWQgKi8KKwlCTUFQSV9ESVJFQ1QgPSAoMSA8PCA1KSwJCS8qIGRpcmVjdCBpbnN0ZWFkIG9mIGJ1ZmZlcmVkIHdyaXRlICovCisJQk1BUElfTU1BUCA9ICgxIDw8IDYpLAkJLyogYWxsb2NhdGUgZm9yIG1tYXAgd3JpdGUgKi8KKwlCTUFQSV9TWU5DID0gKDEgPDwgNyksCQkvKiBzeW5jIHdyaXRlIHRvIGZsdXNoIGRlbGFsbG9jIHNwYWNlICovCisJQk1BUElfVFJZTE9DSyA9ICgxIDw8IDgpLAkvKiBub24tYmxvY2tpbmcgcmVxdWVzdCAqLworCUJNQVBJX0RFVklDRSA9ICgxIDw8IDkpLAkvKiB3ZSBvbmx5IHdhbnQgdG8ga25vdyB0aGUgZGV2aWNlICovCit9IGJtYXBpX2ZsYWdzX3Q7CisKKworLyoKKyAqIHhmc19pb21hcF90OiAgRmlsZSBzeXN0ZW0gSS9PIG1hcAorICoKKyAqIFRoZSBpb21hcF9ibiBmaWVsZCBpcyBleHByZXNzZWQgaW4gNTEyLWJ5dGUgYmxvY2tzLCBhbmQgaXMgd2hlcmUgdGhlIAorICogbWFwcGluZyBzdGFydHMgb24gZGlzay4KKyAqCisgKiBUaGUgaW9tYXBfb2Zmc2V0LCBpb21hcF9ic2l6ZSBhbmQgaW9tYXBfZGVsdGEgZmllbGRzIGFyZSBpbiBieXRlcy4KKyAqIGlvbWFwX29mZnNldCBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBtYXBwaW5nIGluIHRoZSBmaWxlIGl0c2VsZi4KKyAqIGlvbWFwX2JzaXplIGlzIHRoZSBzaXplIG9mIHRoZSBtYXBwaW5nLCAgaW9tYXBfZGVsdGEgaXMgdGhlIAorICogZGVzaXJlZCBkYXRhJ3Mgb2Zmc2V0IGludG8gdGhlIG1hcHBpbmcsIGdpdmVuIHRoZSBvZmZzZXQgc3VwcGxpZWQgCisgKiB0byB0aGUgZmlsZSBJL08gbWFwIHJvdXRpbmUuCisgKgorICogV2hlbiBhIHJlcXVlc3QgaXMgbWFkZSB0byByZWFkIGJleW9uZCB0aGUgbG9naWNhbCBlbmQgb2YgdGhlIG9iamVjdCwKKyAqIGlvbWFwX3NpemUgbWF5IGJlIHNldCB0byAwLCBidXQgaW9tYXBfb2Zmc2V0IGFuZCBpb21hcF9sZW5ndGggc2hvdWxkIGJlIHNldAorICogdG8gdGhlIGFjdHVhbCBhbW91bnQgb2YgdW5kZXJseWluZyBzdG9yYWdlIHRoYXQgaGFzIGJlZW4gYWxsb2NhdGVkLCBpZiBhbnkuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2lvbWFwIHsKKwl4ZnNfZGFkZHJfdAkJaW9tYXBfYm47CS8qIGZpcnN0IDUxMmIgYmxrIG9mIG1hcHBpbmcgKi8KKwl4ZnNfYnVmdGFyZ190CQkqaW9tYXBfdGFyZ2V0OworCWxvZmZfdAkJCWlvbWFwX29mZnNldDsJLyogb2Zmc2V0IG9mIG1hcHBpbmcsIGJ5dGVzICovCisJbG9mZl90CQkJaW9tYXBfYnNpemU7CS8qIHNpemUgb2YgbWFwcGluZywgYnl0ZXMgKi8KKwlzaXplX3QJCQlpb21hcF9kZWx0YTsJLyogb2Zmc2V0IGludG8gbWFwcGluZywgYnl0ZXMgKi8KKwlpb21hcF9mbGFnc190CQlpb21hcF9mbGFnczsKK30geGZzX2lvbWFwX3Q7CisKK3N0cnVjdCB4ZnNfaW9jb3JlOworc3RydWN0IHhmc19pbm9kZTsKK3N0cnVjdCB4ZnNfYm1idF9pcmVjOworCitleHRlcm4gaW50IHhmc19pb21hcChzdHJ1Y3QgeGZzX2lvY29yZSAqLCB4ZnNfb2ZmX3QsIHNzaXplX3QsIGludCwKKwkJICAgICBzdHJ1Y3QgeGZzX2lvbWFwICosIGludCAqKTsKK2V4dGVybiBpbnQgeGZzX2lvbWFwX3dyaXRlX2RpcmVjdChzdHJ1Y3QgeGZzX2lub2RlICosIGxvZmZfdCwgc2l6ZV90LAorCQkJCSAgaW50LCBzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqLCBpbnQgKiwgaW50KTsKK2V4dGVybiBpbnQgeGZzX2lvbWFwX3dyaXRlX2RlbGF5KHN0cnVjdCB4ZnNfaW5vZGUgKiwgbG9mZl90LCBzaXplX3QsIGludCwKKwkJCQkgc3RydWN0IHhmc19ibWJ0X2lyZWMgKiwgaW50ICopOworZXh0ZXJuIGludCB4ZnNfaW9tYXBfd3JpdGVfYWxsb2NhdGUoc3RydWN0IHhmc19pbm9kZSAqLAorCQkJCXN0cnVjdCB4ZnNfYm1idF9pcmVjICosIGludCAqKTsKK2V4dGVybiBpbnQgeGZzX2lvbWFwX3dyaXRlX3Vud3JpdHRlbihzdHJ1Y3QgeGZzX2lub2RlICosIGxvZmZfdCwgc2l6ZV90KTsKKworI2VuZGlmIC8qIF9fWEZTX0lPTUFQX0hfXyovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2l0YWJsZS5jIGIvZnMveGZzL3hmc19pdGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmJjOGQzCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19pdGFibGUuYwpAQCAtMCwwICsxLDg1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorCisjaWZuZGVmIEhBVkVfVVNFUkFDQworI2RlZmluZSB1c2VyYWNjKHVidWZmZXIsIHNpemUsIGZsYWdzLCBmb28pICgwKQorI2RlZmluZSB1bnVzZXJhY2ModWJ1ZmZlciwgc2l6ZSwgZmxhZ3MpCisjZW5kaWYKKworU1RBVElDIGludAoreGZzX2J1bGtzdGF0X29uZV9pZ2V0KAorCXhmc19tb3VudF90CSptcCwJCS8qIG1vdW50IHBvaW50IGZvciBmaWxlc3lzdGVtICovCisJeGZzX2lub190CWlubywJCS8qIGlub2RlIG51bWJlciB0byBnZXQgZGF0YSBmb3IgKi8KKwl4ZnNfZGFkZHJfdAlibm8sCQkvKiBzdGFydGluZyBibm8gb2YgaW5vZGUgY2x1c3RlciAqLworCXhmc19ic3RhdF90CSpidWYsCQkvKiByZXR1cm4gYnVmZmVyICovCisJaW50CQkqc3RhdCkJCS8qIEJVTEtTVEFUX1JWXy4uLiAqLworeworCXhmc19kaW5vZGVfY29yZV90ICpkaWM7CQkvKiBkaW5vZGUgY29yZSBpbmZvIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkqaXA7CQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCWludAkJZXJyb3I7CisKKwllcnJvciA9IHhmc19pZ2V0KG1wLCBOVUxMLCBpbm8sIDAsIFhGU19JTE9DS19TSEFSRUQsICZpcCwgYm5vKTsKKwlpZiAoZXJyb3IpIHsKKwkJKnN0YXQgPSBCVUxLU1RBVF9SVl9OT1RISU5HOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJQVNTRVJUKGlwICE9IE5VTEwpOworCUFTU0VSVChpcC0+aV9ibGtubyAhPSAoeGZzX2RhZGRyX3QpMCk7CisJaWYgKGlwLT5pX2QuZGlfbW9kZSA9PSAwKSB7CisJCSpzdGF0ID0gQlVMS1NUQVRfUlZfTk9USElORzsKKwkJZXJyb3IgPSBYRlNfRVJST1IoRU5PRU5UKTsKKwkJZ290byBvdXRfaXB1dDsKKwl9CisKKwlkaWMgPSAmaXAtPmlfZDsKKworCS8qIHhmc19pZ2V0IHJldHVybnMgdGhlIGZvbGxvd2luZyB3aXRob3V0IG5lZWRpbmcKKwkgKiBmdXJ0aGVyIGNoYW5nZS4KKwkgKi8KKwlidWYtPmJzX25saW5rID0gZGljLT5kaV9ubGluazsKKwlidWYtPmJzX3Byb2ppZCA9IGRpYy0+ZGlfcHJvamlkOworCWJ1Zi0+YnNfaW5vID0gaW5vOworCWJ1Zi0+YnNfbW9kZSA9IGRpYy0+ZGlfbW9kZTsKKwlidWYtPmJzX3VpZCA9IGRpYy0+ZGlfdWlkOworCWJ1Zi0+YnNfZ2lkID0gZGljLT5kaV9naWQ7CisJYnVmLT5ic19zaXplID0gZGljLT5kaV9zaXplOworCWJ1Zi0+YnNfYXRpbWUudHZfc2VjID0gZGljLT5kaV9hdGltZS50X3NlYzsKKwlidWYtPmJzX2F0aW1lLnR2X25zZWMgPSBkaWMtPmRpX2F0aW1lLnRfbnNlYzsKKwlidWYtPmJzX210aW1lLnR2X3NlYyA9IGRpYy0+ZGlfbXRpbWUudF9zZWM7CisJYnVmLT5ic19tdGltZS50dl9uc2VjID0gZGljLT5kaV9tdGltZS50X25zZWM7CisJYnVmLT5ic19jdGltZS50dl9zZWMgPSBkaWMtPmRpX2N0aW1lLnRfc2VjOworCWJ1Zi0+YnNfY3RpbWUudHZfbnNlYyA9IGRpYy0+ZGlfY3RpbWUudF9uc2VjOworCWJ1Zi0+YnNfeGZsYWdzID0geGZzX2lwMnhmbGFncyhpcCk7CisJYnVmLT5ic19leHRzaXplID0gZGljLT5kaV9leHRzaXplIDw8IG1wLT5tX3NiLnNiX2Jsb2NrbG9nOworCWJ1Zi0+YnNfZXh0ZW50cyA9IGRpYy0+ZGlfbmV4dGVudHM7CisJYnVmLT5ic19nZW4gPSBkaWMtPmRpX2dlbjsKKwltZW1zZXQoYnVmLT5ic19wYWQsIDAsIHNpemVvZihidWYtPmJzX3BhZCkpOworCWJ1Zi0+YnNfZG1ldm1hc2sgPSBkaWMtPmRpX2RtZXZtYXNrOworCWJ1Zi0+YnNfZG1zdGF0ZSA9IGRpYy0+ZGlfZG1zdGF0ZTsKKwlidWYtPmJzX2FleHRlbnRzID0gZGljLT5kaV9hbmV4dGVudHM7CisKKwlzd2l0Y2ggKGRpYy0+ZGlfZm9ybWF0KSB7CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9ERVY6CisJCWJ1Zi0+YnNfcmRldiA9IGlwLT5pX2RmLmlmX3UyLmlmX3JkZXY7CisJCWJ1Zi0+YnNfYmxrc2l6ZSA9IEJMS0RFVl9JT1NJWkU7CisJCWJ1Zi0+YnNfYmxvY2tzID0gMDsKKwkJYnJlYWs7CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9MT0NBTDoKKwljYXNlIFhGU19ESU5PREVfRk1UX1VVSUQ6CisJCWJ1Zi0+YnNfcmRldiA9IDA7CisJCWJ1Zi0+YnNfYmxrc2l6ZSA9IG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZTsKKwkJYnVmLT5ic19ibG9ja3MgPSAwOworCQlicmVhazsKKwljYXNlIFhGU19ESU5PREVfRk1UX0VYVEVOVFM6CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9CVFJFRToKKwkJYnVmLT5ic19yZGV2ID0gMDsKKwkJYnVmLT5ic19ibGtzaXplID0gbXAtPm1fc2Iuc2JfYmxvY2tzaXplOworCQlidWYtPmJzX2Jsb2NrcyA9IGRpYy0+ZGlfbmJsb2NrcyArIGlwLT5pX2RlbGF5ZWRfYmxrczsKKwkJYnJlYWs7CisJfQorCisgb3V0X2lwdXQ6CisJeGZzX2lwdXQoaXAsIFhGU19JTE9DS19TSEFSRUQpOworCXJldHVybiBlcnJvcjsKK30KKworU1RBVElDIGludAoreGZzX2J1bGtzdGF0X29uZV9kaW5vZGUoCisJeGZzX21vdW50X3QJKm1wLAkJLyogbW91bnQgcG9pbnQgZm9yIGZpbGVzeXN0ZW0gKi8KKwl4ZnNfaW5vX3QJaW5vLAkJLyogaW5vZGUgbnVtYmVyIHRvIGdldCBkYXRhIGZvciAqLworCXhmc19kaW5vZGVfdAkqZGlwLAkJLyogZGlub2RlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfYnN0YXRfdAkqYnVmKQkJLyogcmV0dXJuIGJ1ZmZlciAqLworeworCXhmc19kaW5vZGVfY29yZV90ICpkaWM7CQkvKiBkaW5vZGUgY29yZSBpbmZvIHBvaW50ZXIgKi8KKworCWRpYyA9ICZkaXAtPmRpX2NvcmU7CisKKwkvKgorCSAqIFRoZSBpbm9kZSBmb3JtYXQgY2hhbmdlZCB3aGVuIHdlIG1vdmVkIHRoZSBsaW5rIGNvdW50IGFuZAorCSAqIG1hZGUgaXQgMzIgYml0cyBsb25nLiAgSWYgdGhpcyBpcyBhbiBvbGQgZm9ybWF0IGlub2RlLAorCSAqIGNvbnZlcnQgaXQgaW4gbWVtb3J5IHRvIGxvb2sgbGlrZSBhIG5ldyBvbmUuICBJZiBpdCBnZXRzCisJICogZmx1c2hlZCB0byBkaXNrIHdlIHdpbGwgY29udmVydCBiYWNrIGJlZm9yZSBmbHVzaGluZyBvcgorCSAqIGxvZ2dpbmcgaXQuICBXZSB6ZXJvIG91dCB0aGUgbmV3IHByb2ppZCBmaWVsZCBhbmQgdGhlIG9sZCBsaW5rCisJICogY291bnQgZmllbGQuICBXZSdsbCBoYW5kbGUgY2xlYXJpbmcgdGhlIHBhZCBmaWVsZCAodGhlIHJlbWFpbnMKKwkgKiBvZiB0aGUgb2xkIHV1aWQgZmllbGQpIHdoZW4gd2UgYWN0dWFsbHkgY29udmVydCB0aGUgaW5vZGUgdG8KKwkgKiB0aGUgbmV3IGZvcm1hdC4gV2UgZG9uJ3QgY2hhbmdlIHRoZSB2ZXJzaW9uIG51bWJlciBzbyB0aGF0IHdlCisJICogY2FuIGRpc3Rpbmd1aXNoIHRoaXMgZnJvbSBhIHJlYWwgbmV3IGZvcm1hdCBpbm9kZS4KKwkgKi8KKwlpZiAoSU5UX0dFVChkaWMtPmRpX3ZlcnNpb24sIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJTk9ERV9WRVJTSU9OXzEpIHsKKwkJYnVmLT5ic19ubGluayA9IElOVF9HRVQoZGljLT5kaV9vbmxpbmssIEFSQ0hfQ09OVkVSVCk7CisJCWJ1Zi0+YnNfcHJvamlkID0gMDsKKwl9IGVsc2UgeworCQlidWYtPmJzX25saW5rID0gSU5UX0dFVChkaWMtPmRpX25saW5rLCBBUkNIX0NPTlZFUlQpOworCQlidWYtPmJzX3Byb2ppZCA9IElOVF9HRVQoZGljLT5kaV9wcm9qaWQsIEFSQ0hfQ09OVkVSVCk7CisJfQorCisJYnVmLT5ic19pbm8gPSBpbm87CisJYnVmLT5ic19tb2RlID0gSU5UX0dFVChkaWMtPmRpX21vZGUsIEFSQ0hfQ09OVkVSVCk7CisJYnVmLT5ic191aWQgPSBJTlRfR0VUKGRpYy0+ZGlfdWlkLCBBUkNIX0NPTlZFUlQpOworCWJ1Zi0+YnNfZ2lkID0gSU5UX0dFVChkaWMtPmRpX2dpZCwgQVJDSF9DT05WRVJUKTsKKwlidWYtPmJzX3NpemUgPSBJTlRfR0VUKGRpYy0+ZGlfc2l6ZSwgQVJDSF9DT05WRVJUKTsKKwlidWYtPmJzX2F0aW1lLnR2X3NlYyA9IElOVF9HRVQoZGljLT5kaV9hdGltZS50X3NlYywgQVJDSF9DT05WRVJUKTsKKwlidWYtPmJzX2F0aW1lLnR2X25zZWMgPSBJTlRfR0VUKGRpYy0+ZGlfYXRpbWUudF9uc2VjLCBBUkNIX0NPTlZFUlQpOworCWJ1Zi0+YnNfbXRpbWUudHZfc2VjID0gSU5UX0dFVChkaWMtPmRpX210aW1lLnRfc2VjLCBBUkNIX0NPTlZFUlQpOworCWJ1Zi0+YnNfbXRpbWUudHZfbnNlYyA9IElOVF9HRVQoZGljLT5kaV9tdGltZS50X25zZWMsIEFSQ0hfQ09OVkVSVCk7CisJYnVmLT5ic19jdGltZS50dl9zZWMgPSBJTlRfR0VUKGRpYy0+ZGlfY3RpbWUudF9zZWMsIEFSQ0hfQ09OVkVSVCk7CisJYnVmLT5ic19jdGltZS50dl9uc2VjID0gSU5UX0dFVChkaWMtPmRpX2N0aW1lLnRfbnNlYywgQVJDSF9DT05WRVJUKTsKKwlidWYtPmJzX3hmbGFncyA9IHhmc19kaWMyeGZsYWdzKGRpYyk7CisJYnVmLT5ic19leHRzaXplID0gSU5UX0dFVChkaWMtPmRpX2V4dHNpemUsIEFSQ0hfQ09OVkVSVCkgPDwgbXAtPm1fc2Iuc2JfYmxvY2tsb2c7CisJYnVmLT5ic19leHRlbnRzID0gSU5UX0dFVChkaWMtPmRpX25leHRlbnRzLCBBUkNIX0NPTlZFUlQpOworCWJ1Zi0+YnNfZ2VuID0gSU5UX0dFVChkaWMtPmRpX2dlbiwgQVJDSF9DT05WRVJUKTsKKwltZW1zZXQoYnVmLT5ic19wYWQsIDAsIHNpemVvZihidWYtPmJzX3BhZCkpOworCWJ1Zi0+YnNfZG1ldm1hc2sgPSBJTlRfR0VUKGRpYy0+ZGlfZG1ldm1hc2ssIEFSQ0hfQ09OVkVSVCk7CisJYnVmLT5ic19kbXN0YXRlID0gSU5UX0dFVChkaWMtPmRpX2Rtc3RhdGUsIEFSQ0hfQ09OVkVSVCk7CisJYnVmLT5ic19hZXh0ZW50cyA9IElOVF9HRVQoZGljLT5kaV9hbmV4dGVudHMsIEFSQ0hfQ09OVkVSVCk7CisKKwlzd2l0Y2ggKElOVF9HRVQoZGljLT5kaV9mb3JtYXQsIEFSQ0hfQ09OVkVSVCkpIHsKKwljYXNlIFhGU19ESU5PREVfRk1UX0RFVjoKKwkJYnVmLT5ic19yZGV2ID0gSU5UX0dFVChkaXAtPmRpX3UuZGlfZGV2LCBBUkNIX0NPTlZFUlQpOworCQlidWYtPmJzX2Jsa3NpemUgPSBCTEtERVZfSU9TSVpFOworCQlidWYtPmJzX2Jsb2NrcyA9IDA7CisJCWJyZWFrOworCWNhc2UgWEZTX0RJTk9ERV9GTVRfTE9DQUw6CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9VVUlEOgorCQlidWYtPmJzX3JkZXYgPSAwOworCQlidWYtPmJzX2Jsa3NpemUgPSBtcC0+bV9zYi5zYl9ibG9ja3NpemU7CisJCWJ1Zi0+YnNfYmxvY2tzID0gMDsKKwkJYnJlYWs7CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTOgorCWNhc2UgWEZTX0RJTk9ERV9GTVRfQlRSRUU6CisJCWJ1Zi0+YnNfcmRldiA9IDA7CisJCWJ1Zi0+YnNfYmxrc2l6ZSA9IG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZTsKKwkJYnVmLT5ic19ibG9ja3MgPSBJTlRfR0VUKGRpYy0+ZGlfbmJsb2NrcywgQVJDSF9DT05WRVJUKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gc3RhdCBpbmZvcm1hdGlvbiBmb3Igb25lIGlub2RlLgorICogUmV0dXJuIDAgaWYgb2ssIGVsc2UgZXJybm8uCisgKi8KK2ludAkJICAgICAgIAkJLyogZXJyb3Igc3RhdHVzICovCit4ZnNfYnVsa3N0YXRfb25lKAorCXhmc19tb3VudF90CSptcCwJCS8qIG1vdW50IHBvaW50IGZvciBmaWxlc3lzdGVtICovCisJeGZzX2lub190CWlubywJCS8qIGlub2RlIG51bWJlciB0byBnZXQgZGF0YSBmb3IgKi8KKwl2b2lkCQlfX3VzZXIgKmJ1ZmZlciwJLyogYnVmZmVyIHRvIHBsYWNlIG91dHB1dCBpbiAqLworCWludAkJdWJzaXplLAkJLyogc2l6ZSBvZiBidWZmZXIgKi8KKwl2b2lkCQkqcHJpdmF0ZV9kYXRhLAkvKiBteSBwcml2YXRlIGRhdGEgKi8KKwl4ZnNfZGFkZHJfdAlibm8sCQkvKiBzdGFydGluZyBibm8gb2YgaW5vZGUgY2x1c3RlciAqLworCWludAkJKnVidXNlZCwJLyogYnl0ZXMgdXNlZCBieSBtZSAqLworCXZvaWQJCSpkaWJ1ZmYsCS8qIG9uLWRpc2sgaW5vZGUgYnVmZmVyICovCisJaW50CQkqc3RhdCkJCS8qIEJVTEtTVEFUX1JWXy4uLiAqLworeworCXhmc19ic3RhdF90CSpidWY7CQkvKiByZXR1cm4gYnVmZmVyICovCisJaW50CQllcnJvciA9IDA7CS8qIGVycm9yIHZhbHVlICovCisJeGZzX2Rpbm9kZV90CSpkaXA7CQkvKiBkaW5vZGUgaW5vZGUgcG9pbnRlciAqLworCisJZGlwID0gKHhmc19kaW5vZGVfdCAqKWRpYnVmZjsKKworCWlmICghYnVmZmVyIHx8IGlubyA9PSBtcC0+bV9zYi5zYl9yYm1pbm8gfHwgaW5vID09IG1wLT5tX3NiLnNiX3JzdW1pbm8gfHwKKwkgICAgKFhGU19TQl9WRVJTSU9OX0hBU1FVT1RBKCZtcC0+bV9zYikgJiYKKwkgICAgIChpbm8gPT0gbXAtPm1fc2Iuc2JfdXF1b3Rpbm8gfHwgaW5vID09IG1wLT5tX3NiLnNiX2dxdW90aW5vKSkpIHsKKwkJKnN0YXQgPSBCVUxLU1RBVF9SVl9OT1RISU5HOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJfQorCWlmICh1YnNpemUgPCBzaXplb2YoKmJ1ZikpIHsKKwkJKnN0YXQgPSBCVUxLU1RBVF9SVl9OT1RISU5HOworCQlyZXR1cm4gWEZTX0VSUk9SKEVOT01FTSk7CisJfQorCisJYnVmID0ga21lbV9hbGxvYyhzaXplb2YoKmJ1ZiksIEtNX1NMRUVQKTsKKworCWlmIChkaXAgPT0gTlVMTCkgeworCQkvKiBXZSdyZSBub3QgYmVpbmcgcGFzc2VkIGEgcG9pbnRlciB0byBhIGRpbm9kZS4gIFRoaXMgaGFwcGVucworCQkgKiBpZiBCVUxLU1RBVF9GR19JR0VUIGlzIHNlbGVjdGVkLiAgRG8gdGhlIGlnZXQuCisJCSAqLworCQllcnJvciA9IHhmc19idWxrc3RhdF9vbmVfaWdldChtcCwgaW5vLCBibm8sIGJ1Ziwgc3RhdCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0X2ZyZWU7CisJfSBlbHNlIHsKKwkJeGZzX2J1bGtzdGF0X29uZV9kaW5vZGUobXAsIGlubywgZGlwLCBidWYpOworCX0KKworCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBidWYsIHNpemVvZigqYnVmKSkpICB7CisJCSpzdGF0ID0gQlVMS1NUQVRfUlZfTk9USElORzsKKwkJZXJyb3IgPSAgRUZBVUxUOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCSpzdGF0ID0gQlVMS1NUQVRfUlZfRElET05FOworCWlmICh1YnVzZWQpCisJCSp1YnVzZWQgPSBzaXplb2YoKmJ1Zik7CisKKyBvdXRfZnJlZToKKwlrbWVtX2ZyZWUoYnVmLCBzaXplb2YoKmJ1ZikpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFJldHVybiBzdGF0IGluZm9ybWF0aW9uIGluIGJ1bGsgKGJ5LWlub2RlKSBmb3IgdGhlIGZpbGVzeXN0ZW0uCisgKi8KK2ludAkJCQkJLyogZXJyb3Igc3RhdHVzICovCit4ZnNfYnVsa3N0YXQoCisJeGZzX21vdW50X3QJCSptcCwJLyogbW91bnQgcG9pbnQgZm9yIGZpbGVzeXN0ZW0gKi8KKwl4ZnNfaW5vX3QJCSpsYXN0aW5vcCwgLyogbGFzdCBpbm9kZSByZXR1cm5lZCAqLworCWludAkJCSp1YmNvdW50cCwgLyogc2l6ZSBvZiBidWZmZXIvY291bnQgcmV0dXJuZWQgKi8KKwlidWxrc3RhdF9vbmVfcGYJCWZvcm1hdHRlciwgLyogZnVuYyB0aGF0J2QgZmlsbCBhIHNpbmdsZSBidWYgKi8KKwl2b2lkCQkJKnByaXZhdGVfZGF0YSwvKiBwcml2YXRlIGRhdGEgZm9yIGZvcm1hdHRlciAqLworCXNpemVfdAkJCXN0YXRzdHJ1Y3Rfc2l6ZSwgLyogc2l6ZW9mIHN0cnVjdCBmaWxsaW5nICovCisJY2hhcgkJCV9fdXNlciAqdWJ1ZmZlciwgLyogYnVmZmVyIHdpdGggaW5vZGUgc3RhdHMgKi8KKwlpbnQJCQlmbGFncywJLyogZGVmaW5lZCBpbiB4ZnNfaXRhYmxlLmggKi8KKwlpbnQJCQkqZG9uZSkJLyogMSBpZiB0aGVyZSdyZSBtb3JlIHN0YXRzIHRvIGdldCAqLworeworCXhmc19hZ2Jsb2NrX3QJCWFnYm5vPTA7LyogYWxsb2NhdGlvbiBncm91cCBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJCSphZ2JwOwkvKiBhZ2kgaGVhZGVyIGJ1ZmZlciAqLworCXhmc19hZ2lfdAkJKmFnaTsJLyogYWdpIGhlYWRlciBkYXRhICovCisJeGZzX2FnaW5vX3QJCWFnaW5vOwkvKiBpbm9kZSAjIGluIGFsbG9jYXRpb24gZ3JvdXAgKi8KKwl4ZnNfYWdudW1iZXJfdAkJYWdubzsJLyogYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwl4ZnNfZGFkZHJfdAkJYm5vOwkvKiBpbm9kZSBjbHVzdGVyIHN0YXJ0IGRhZGRyICovCisJaW50CQkJY2h1bmtpZHg7IC8qIGN1cnJlbnQgaW5kZXggaW50byBpbm9kZSBjaHVuayAqLworCWludAkJCWNsdXN0aWR4OyAvKiBjdXJyZW50IGluZGV4IGludG8gaW5vZGUgY2x1c3RlciAqLworCXhmc19idHJlZV9jdXJfdAkJKmN1cjsJLyogYnRyZWUgY3Vyc29yIGZvciBpYWxsb2MgYnRyZWUgKi8KKwlpbnQJCQllbmRfb2ZfYWc7IC8qIHNldCBpZiB3ZSd2ZSBzZWVuIHRoZSBhZyBlbmQgKi8KKwlpbnQJCQllcnJvcjsJLyogZXJyb3IgY29kZSAqLworCWludCAgICAgICAgICAgICAgICAgICAgIGZtdGVycm9yOy8qIGJ1bGtzdGF0IGZvcm1hdHRlciByZXN1bHQgKi8KKwlfX2ludDMyX3QJCWdjbnQ7CS8qIGN1cnJlbnQgYnRyZWUgcmVjJ3MgY291bnQgKi8KKwl4ZnNfaW5vZnJlZV90CQlnZnJlZTsJLyogY3VycmVudCBidHJlZSByZWMncyBmcmVlIG1hc2sgKi8KKwl4ZnNfYWdpbm9fdAkJZ2lubzsJLyogY3VycmVudCBidHJlZSByZWMncyBzdGFydCBpbm9kZSAqLworCWludAkJCWk7CS8qIGxvb3AgaW5kZXggKi8KKwlpbnQJCQlpY291bnQ7CS8qIGNvdW50IG9mIGlub2RlcyBnb29kIGluIGlyYnVmICovCisJeGZzX2lub190CQlpbm87CS8qIGlub2RlIG51bWJlciAoZmlsZXN5c3RlbSkgKi8KKwl4ZnNfaW5vYnRfcmVjX3QJCSppcmJwOwkvKiBjdXJyZW50IGlyZWMgYnVmZmVyIHBvaW50ZXIgKi8KKwl4ZnNfaW5vYnRfcmVjX3QJCSppcmJ1ZjsJLyogc3RhcnQgb2YgaXJlYyBidWZmZXIgKi8KKwl4ZnNfaW5vYnRfcmVjX3QJCSppcmJ1ZmVuZDsgLyogZW5kIG9mIGdvb2QgaXJlYyBidWZmZXIgZW50cmllcyAqLworCXhmc19pbm9fdAkJbGFzdGlubz0wOyAvKiBsYXN0IGlub2RlIG51bWJlciByZXR1cm5lZCAqLworCWludAkJCW5iY2x1c3RlcjsgLyogIyBvZiBibG9ja3MgaW4gYSBjbHVzdGVyICovCisJaW50CQkJbmljbHVzdGVyOyAvKiAjIG9mIGlub2RlcyBpbiBhIGNsdXN0ZXIgKi8KKwlpbnQJCQluaW1hc2s7CS8qIG1hc2sgZm9yIGlub2RlIGNsdXN0ZXJzICovCisJaW50CQkJbmlyYnVmOwkvKiBzaXplIG9mIGlyYnVmICovCisJaW50CQkJcnZhbDsJLyogcmV0dXJuIHZhbHVlIGVycm9yIGNvZGUgKi8KKwlpbnQJCQl0bXA7CS8qIHJlc3VsdCB2YWx1ZSBmcm9tIGJ0cmVlIGNhbGxzICovCisJaW50CQkJdWJjb3VudDsgLyogc2l6ZSBvZiB1c2VyJ3MgYnVmZmVyICovCisJaW50CQkJdWJsZWZ0OwkvKiBieXRlcyBsZWZ0IGluIHVzZXIncyBidWZmZXIgKi8KKwljaGFyCQkJX191c2VyICp1YnVmcDsJLyogcG9pbnRlciBpbnRvIHVzZXIncyBidWZmZXIgKi8KKwlpbnQJCQl1YmVsZW07CS8qIHNwYWNlcyB1c2VkIGluIHVzZXIncyBidWZmZXIgKi8KKwlpbnQJCQl1YnVzZWQ7CS8qIGJ5dGVzIHVzZWQgYnkgZm9ybWF0dGVyICovCisJeGZzX2J1Zl90CQkqYnA7CS8qIHB0ciB0byBvbi1kaXNrIGlub2RlIGNsdXN0ZXIgYnVmICovCisJeGZzX2Rpbm9kZV90CQkqZGlwOwkvKiBwdHIgaW50byBicCBmb3Igc3BlY2lmaWMgaW5vZGUgKi8KKwl4ZnNfaW5vZGVfdAkJKmlwOwkvKiBwdHIgdG8gaW4tY29yZSBpbm9kZSBzdHJ1Y3QgKi8KKworCS8qCisJICogR2V0IHRoZSBsYXN0IGlub2RlIHZhbHVlLCBzZWUgaWYgdGhlcmUncyBub3RoaW5nIHRvIGRvLgorCSAqLworCWlubyA9ICh4ZnNfaW5vX3QpKmxhc3Rpbm9wOworCWRpcCA9IE5VTEw7CisJYWdubyA9IFhGU19JTk9fVE9fQUdOTyhtcCwgaW5vKTsKKwlhZ2lubyA9IFhGU19JTk9fVE9fQUdJTk8obXAsIGlubyk7CisJaWYgKGFnbm8gPj0gbXAtPm1fc2Iuc2JfYWdjb3VudCB8fAorCSAgICBpbm8gIT0gWEZTX0FHSU5PX1RPX0lOTyhtcCwgYWdubywgYWdpbm8pKSB7CisJCSpkb25lID0gMTsKKwkJKnViY291bnRwID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCXViY291bnQgPSAqdWJjb3VudHA7IC8qIHN0YXRzdHJ1Y3QncyAqLworCXVibGVmdCA9IHViY291bnQgKiBzdGF0c3RydWN0X3NpemU7IC8qIGJ5dGVzICovCisJKnViY291bnRwID0gdWJlbGVtID0gMDsKKwkqZG9uZSA9IDA7CisJZm10ZXJyb3IgPSAwOworCXVidWZwID0gdWJ1ZmZlcjsKKwluaWNsdXN0ZXIgPSBtcC0+bV9zYi5zYl9ibG9ja3NpemUgPj0gWEZTX0lOT0RFX0NMVVNURVJfU0laRShtcCkgPworCQltcC0+bV9zYi5zYl9pbm9wYmxvY2sgOgorCQkoWEZTX0lOT0RFX0NMVVNURVJfU0laRShtcCkgPj4gbXAtPm1fc2Iuc2JfaW5vZGVsb2cpOworCW5pbWFzayA9IH4obmljbHVzdGVyIC0gMSk7CisJbmJjbHVzdGVyID0gbmljbHVzdGVyID4+IG1wLT5tX3NiLnNiX2lub3BibG9nOworCS8qCisJICogTG9jayBkb3duIHRoZSB1c2VyJ3MgYnVmZmVyLiBJZiBhIGJ1ZmZlciB3YXMgbm90IHNlbnQsIGFzIGluIHRoZSBjYXNlCisJICogZGlzayBxdW90YSBjb2RlIGNhbGxzIGhlcmUsIHdlIHNraXAgdGhpcy4KKwkgKi8KKwlpZiAodWJ1ZmZlciAmJgorCSAgICAoZXJyb3IgPSB1c2VyYWNjKHVidWZmZXIsIHViY291bnQgKiBzdGF0c3RydWN0X3NpemUsCisJCQkoQl9SRUFEfEJfUEhZUyksIE5VTEwpKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qCisJICogQWxsb2NhdGUgYSBwYWdlLXNpemVkIGJ1ZmZlciBmb3IgaW5vZGUgYnRyZWUgcmVjb3Jkcy4KKwkgKiBXZSBjb3VsZCB0cnkgYWxsb2NhdGluZyBzb21ldGhpbmcgc21hbGxlciwgYnV0IGZvciBub3JtYWwKKwkgKiBjYWxscyB3ZSdsbCBhbHdheXMgKHBvdGVudGlhbGx5KSBuZWVkIHRoZSB3aG9sZSBwYWdlLgorCSAqLworCWlyYnVmID0ga21lbV9hbGxvYyhOQlBDLCBLTV9TTEVFUCk7CisJbmlyYnVmID0gTkJQQyAvIHNpemVvZigqaXJidWYpOworCS8qCisJICogTG9vcCBvdmVyIHRoZSBhbGxvY2F0aW9uIGdyb3Vwcywgc3RhcnRpbmcgZnJvbSB0aGUgbGFzdAorCSAqIGlub2RlIHJldHVybmVkOyAwIG1lYW5zIHN0YXJ0IG9mIHRoZSBhbGxvY2F0aW9uIGdyb3VwLgorCSAqLworCXJ2YWwgPSAwOworCXdoaWxlICh1YmxlZnQgPj0gc3RhdHN0cnVjdF9zaXplICYmIGFnbm8gPCBtcC0+bV9zYi5zYl9hZ2NvdW50KSB7CisJCWJwID0gTlVMTDsKKwkJZG93bl9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCQllcnJvciA9IHhmc19pYWxsb2NfcmVhZF9hZ2kobXAsIE5VTEwsIGFnbm8sICZhZ2JwKTsKKwkJdXBfcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwkJaWYgKGVycm9yKSB7CisJCQkvKgorCQkJICogU2tpcCB0aGlzIGFsbG9jYXRpb24gZ3JvdXAgYW5kIGdvIHRvIHRoZSBuZXh0IG9uZS4KKwkJCSAqLworCQkJYWdubysrOworCQkJYWdpbm8gPSAwOworCQkJY29udGludWU7CisJCX0KKwkJYWdpID0gWEZTX0JVRl9UT19BR0koYWdicCk7CisJCS8qCisJCSAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgYnRyZWUgY3Vyc29yIGZvciBpYWxsb2MgYnRyZWUuCisJCSAqLworCQljdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IobXAsIE5VTEwsIGFnYnAsIGFnbm8sIFhGU19CVE5VTV9JTk8sCisJCQkoeGZzX2lub2RlX3QgKikwLCAwKTsKKwkJaXJicCA9IGlyYnVmOworCQlpcmJ1ZmVuZCA9IGlyYnVmICsgbmlyYnVmOworCQllbmRfb2ZfYWcgPSAwOworCQkvKgorCQkgKiBJZiB3ZSdyZSByZXR1cm5pbmcgaW4gdGhlIG1pZGRsZSBvZiBhbiBhbGxvY2F0aW9uIGdyb3VwLAorCQkgKiB3ZSBuZWVkIHRvIGdldCB0aGUgcmVtYWluZGVyIG9mIHRoZSBjaHVuayB3ZSdyZSBpbi4KKwkJICovCisJCWlmIChhZ2lubyA+IDApIHsKKwkJCS8qCisJCQkgKiBMb29rdXAgdGhlIGlub2RlIGNodW5rIHRoYXQgdGhpcyBpbm9kZSBsaXZlcyBpbi4KKwkJCSAqLworCQkJZXJyb3IgPSB4ZnNfaW5vYnRfbG9va3VwX2xlKGN1ciwgYWdpbm8sIDAsIDAsICZ0bXApOworCQkJaWYgKCFlcnJvciAmJgkvKiBubyBJL08gZXJyb3IgKi8KKwkJCSAgICB0bXAgJiYJLyogbG9va3VwIHN1Y2NlZWRlZCAqLworCQkJCQkvKiBnb3QgdGhlIHJlY29yZCwgc2hvdWxkIGFsd2F5cyB3b3JrICovCisJCQkgICAgIShlcnJvciA9IHhmc19pbm9idF9nZXRfcmVjKGN1ciwgJmdpbm8sICZnY250LAorCQkJCSAgICAmZ2ZyZWUsICZpKSkgJiYKKwkJCSAgICBpID09IDEgJiYKKwkJCQkJLyogdGhpcyBpcyB0aGUgcmlnaHQgY2h1bmsgKi8KKwkJCSAgICBhZ2lubyA8IGdpbm8gKyBYRlNfSU5PREVTX1BFUl9DSFVOSyAmJgorCQkJCQkvKiBsYXN0aW5vIHdhcyBub3QgbGFzdCBpbiBjaHVuayAqLworCQkJICAgIChjaHVua2lkeCA9IGFnaW5vIC0gZ2lubyArIDEpIDwKKwkJCQkgICAgWEZTX0lOT0RFU19QRVJfQ0hVTksgJiYKKwkJCQkJLyogdGhlcmUgYXJlIHNvbWUgbGVmdCBhbGxvY2F0ZWQgKi8KKwkJCSAgICBYRlNfSU5PQlRfTUFTS04oY2h1bmtpZHgsCisJCQkJICAgIFhGU19JTk9ERVNfUEVSX0NIVU5LIC0gY2h1bmtpZHgpICYgfmdmcmVlKSB7CisJCQkJLyoKKwkJCQkgKiBHcmFiIHRoZSBjaHVuayByZWNvcmQuICBNYXJrIGFsbCB0aGUKKwkJCQkgKiB1bmludGVyZXN0aW5nIGlub2RlcyAoYmVjYXVzZSB0aGV5J3JlCisJCQkJICogYmVmb3JlIG91ciBzdGFydCBwb2ludCkgZnJlZS4KKwkJCQkgKi8KKwkJCQlmb3IgKGkgPSAwOyBpIDwgY2h1bmtpZHg7IGkrKykgeworCQkJCQlpZiAoWEZTX0lOT0JUX01BU0soaSkgJiB+Z2ZyZWUpCisJCQkJCQlnY250Kys7CisJCQkJfQorCQkJCWdmcmVlIHw9IFhGU19JTk9CVF9NQVNLTigwLCBjaHVua2lkeCk7CisJCQkJSU5UX1NFVChpcmJwLT5pcl9zdGFydGlubywgQVJDSF9DT05WRVJULCBnaW5vKTsKKwkJCQlJTlRfU0VUKGlyYnAtPmlyX2ZyZWVjb3VudCwgQVJDSF9DT05WRVJULCBnY250KTsKKwkJCQlJTlRfU0VUKGlyYnAtPmlyX2ZyZWUsIEFSQ0hfQ09OVkVSVCwgZ2ZyZWUpOworCQkJCWlyYnArKzsKKwkJCQlhZ2lubyA9IGdpbm8gKyBYRlNfSU5PREVTX1BFUl9DSFVOSzsKKwkJCQlpY291bnQgPSBYRlNfSU5PREVTX1BFUl9DSFVOSyAtIGdjbnQ7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogSWYgYW55IG9mIHRob3NlIHRlc3RzIGZhaWxlZCwgYnVtcCB0aGUKKwkJCQkgKiBpbm9kZSBudW1iZXIgKGp1c3QgaW4gY2FzZSkuCisJCQkJICovCisJCQkJYWdpbm8rKzsKKwkJCQlpY291bnQgPSAwOworCQkJfQorCQkJLyoKKwkJCSAqIEluIGFueSBjYXNlLCBpbmNyZW1lbnQgdG8gdGhlIG5leHQgcmVjb3JkLgorCQkJICovCisJCQlpZiAoIWVycm9yKQorCQkJCWVycm9yID0geGZzX2lub2J0X2luY3JlbWVudChjdXIsIDAsICZ0bXApOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFN0YXJ0IG9mIGFnLiAgTG9va3VwIHRoZSBmaXJzdCBpbm9kZSBjaHVuay4KKwkJCSAqLworCQkJZXJyb3IgPSB4ZnNfaW5vYnRfbG9va3VwX2dlKGN1ciwgMCwgMCwgMCwgJnRtcCk7CisJCQlpY291bnQgPSAwOworCQl9CisJCS8qCisJCSAqIExvb3AgdGhyb3VnaCBpbm9kZSBidHJlZSByZWNvcmRzIGluIHRoaXMgYWcsCisJCSAqIHVudGlsIHdlIHJ1biBvdXQgb2YgaW5vZGVzIG9yIHNwYWNlIGluIHRoZSBidWZmZXIuCisJCSAqLworCQl3aGlsZSAoaXJicCA8IGlyYnVmZW5kICYmIGljb3VudCA8IHViY291bnQpIHsKKwkJCS8qCisJCQkgKiBMb29wIGFzIGxvbmcgYXMgd2UncmUgdW5hYmxlIHRvIHJlYWQgdGhlCisJCQkgKiBpbm9kZSBidHJlZS4KKwkJCSAqLworCQkJd2hpbGUgKGVycm9yKSB7CisJCQkJYWdpbm8gKz0gWEZTX0lOT0RFU19QRVJfQ0hVTks7CisJCQkJaWYgKFhGU19BR0lOT19UT19BR0JOTyhtcCwgYWdpbm8pID49CisJCQkJCQlJTlRfR0VUKGFnaS0+YWdpX2xlbmd0aCwgQVJDSF9DT05WRVJUKSkKKwkJCQkJYnJlYWs7CisJCQkJZXJyb3IgPSB4ZnNfaW5vYnRfbG9va3VwX2dlKGN1ciwgYWdpbm8sIDAsIDAsCisJCQkJCQkJICAgICZ0bXApOworCQkJfQorCQkJLyoKKwkJCSAqIElmIHJhbiBvZmYgdGhlIGVuZCBvZiB0aGUgYWcgZWl0aGVyIHdpdGggYW4gZXJyb3IsCisJCQkgKiBvciB0aGUgbm9ybWFsIHdheSwgc2V0IGVuZCBhbmQgc3RvcCBjb2xsZWN0aW5nLgorCQkJICovCisJCQlpZiAoZXJyb3IgfHwKKwkJCSAgICAoZXJyb3IgPSB4ZnNfaW5vYnRfZ2V0X3JlYyhjdXIsICZnaW5vLCAmZ2NudCwKKwkJCQkgICAgJmdmcmVlLCAmaSkpIHx8CisJCQkgICAgaSA9PSAwKSB7CisJCQkJZW5kX29mX2FnID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qCisJCQkgKiBJZiB0aGlzIGNodW5rIGhhcyBhbnkgYWxsb2NhdGVkIGlub2Rlcywgc2F2ZSBpdC4KKwkJCSAqLworCQkJaWYgKGdjbnQgPCBYRlNfSU5PREVTX1BFUl9DSFVOSykgeworCQkJCUlOVF9TRVQoaXJicC0+aXJfc3RhcnRpbm8sIEFSQ0hfQ09OVkVSVCwgZ2lubyk7CisJCQkJSU5UX1NFVChpcmJwLT5pcl9mcmVlY291bnQsIEFSQ0hfQ09OVkVSVCwgZ2NudCk7CisJCQkJSU5UX1NFVChpcmJwLT5pcl9mcmVlLCBBUkNIX0NPTlZFUlQsIGdmcmVlKTsKKwkJCQlpcmJwKys7CisJCQkJaWNvdW50ICs9IFhGU19JTk9ERVNfUEVSX0NIVU5LIC0gZ2NudDsKKwkJCX0KKwkJCS8qCisJCQkgKiBTZXQgYWdpbm8gdG8gYWZ0ZXIgdGhpcyBjaHVuayBhbmQgYnVtcCB0aGUgY3Vyc29yLgorCQkJICovCisJCQlhZ2lubyA9IGdpbm8gKyBYRlNfSU5PREVTX1BFUl9DSFVOSzsKKwkJCWVycm9yID0geGZzX2lub2J0X2luY3JlbWVudChjdXIsIDAsICZ0bXApOworCQl9CisJCS8qCisJCSAqIERyb3AgdGhlIGJ0cmVlIGJ1ZmZlcnMgYW5kIHRoZSBhZ2kgYnVmZmVyLgorCQkgKiBXZSBjYW4ndCBob2xkIGFueSBvZiB0aGUgbG9ja3MgdGhlc2UgcmVwcmVzZW50CisJCSAqIHdoZW4gY2FsbGluZyBpZ2V0LgorCQkgKi8KKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJCXhmc19idWZfcmVsc2UoYWdicCk7CisJCS8qCisJCSAqIE5vdyBmb3JtYXQgYWxsIHRoZSBnb29kIGlub2RlcyBpbnRvIHRoZSB1c2VyJ3MgYnVmZmVyLgorCQkgKi8KKwkJaXJidWZlbmQgPSBpcmJwOworCQlmb3IgKGlyYnAgPSBpcmJ1ZjsKKwkJICAgICBpcmJwIDwgaXJidWZlbmQgJiYgdWJsZWZ0ID49IHN0YXRzdHJ1Y3Rfc2l6ZTsgaXJicCsrKSB7CisJCQkvKgorCQkJICogUmVhZC1haGVhZCB0aGUgbmV4dCBjaHVuaydzIHdvcnRoIG9mIGlub2Rlcy4KKwkJCSAqLworCQkJaWYgKCZpcmJwWzFdIDwgaXJidWZlbmQpIHsKKwkJCQkvKgorCQkJCSAqIExvb3Agb3ZlciBhbGwgY2x1c3RlcnMgaW4gdGhlIG5leHQgY2h1bmsuCisJCQkJICogRG8gYSByZWFkYWhlYWQgaWYgdGhlcmUgYXJlIGFueSBhbGxvY2F0ZWQKKwkJCQkgKiBpbm9kZXMgaW4gdGhhdCBjbHVzdGVyLgorCQkJCSAqLworCQkJCWZvciAoYWdibm8gPSBYRlNfQUdJTk9fVE9fQUdCTk8obXAsCisJCQkJCQkJSU5UX0dFVChpcmJwWzFdLmlyX3N0YXJ0aW5vLCBBUkNIX0NPTlZFUlQpKSwKKwkJCQkgICAgIGNodW5raWR4ID0gMDsKKwkJCQkgICAgIGNodW5raWR4IDwgWEZTX0lOT0RFU19QRVJfQ0hVTks7CisJCQkJICAgICBjaHVua2lkeCArPSBuaWNsdXN0ZXIsCisJCQkJICAgICBhZ2JubyArPSBuYmNsdXN0ZXIpIHsKKwkJCQkJaWYgKFhGU19JTk9CVF9NQVNLTihjaHVua2lkeCwKKwkJCQkJCQkgICAgbmljbHVzdGVyKSAmCisJCQkJCSAgICB+KElOVF9HRVQoaXJicFsxXS5pcl9mcmVlLCBBUkNIX0NPTlZFUlQpKSkKKwkJCQkJCXhmc19idHJlZV9yZWFkYV9idWZzKG1wLCBhZ25vLAorCQkJCQkJCWFnYm5vLCBuYmNsdXN0ZXIpOworCQkJCX0KKwkJCX0KKwkJCS8qCisJCQkgKiBOb3cgcHJvY2VzcyB0aGlzIGNodW5rIG9mIGlub2Rlcy4KKwkJCSAqLworCQkJZm9yIChhZ2lubyA9IElOVF9HRVQoaXJicC0+aXJfc3RhcnRpbm8sIEFSQ0hfQ09OVkVSVCksIGNodW5raWR4ID0gMCwgY2x1c3RpZHggPSAwOworCQkJICAgICB1YmxlZnQgPiAwICYmCisJCQkJSU5UX0dFVChpcmJwLT5pcl9mcmVlY291bnQsIEFSQ0hfQ09OVkVSVCkgPCBYRlNfSU5PREVTX1BFUl9DSFVOSzsKKwkJCSAgICAgY2h1bmtpZHgrKywgY2x1c3RpZHgrKywgYWdpbm8rKykgeworCQkJCUFTU0VSVChjaHVua2lkeCA8IFhGU19JTk9ERVNfUEVSX0NIVU5LKTsKKwkJCQkvKgorCQkJCSAqIFJlY29tcHV0ZSBhZ2JubyBpZiB0aGlzIGlzIHRoZQorCQkJCSAqIGZpcnN0IGlub2RlIG9mIHRoZSBjbHVzdGVyLgorCQkJCSAqCisJCQkJICogQ2FyZWZ1bCB3aXRoIGNsdXN0aWR4LiAgIFRoZXJlIGNhbiBiZQorCQkJCSAqIG11bHRwbGUgY2x1c3RlcnMgcGVyIGNodW5rLCBhIHNpbmdsZQorCQkJCSAqIGNsdXN0ZXIgcGVyIGNodW5rIG9yIGEgY2x1c3RlciB0aGF0IGhhcworCQkJCSAqIGlub2RlcyByZXByZXNlbnRlZCBmcm9tIHNldmVyYWwgZGlmZmVyZW50CisJCQkJICogY2h1bmtzIChpZiBibG9ja3NpemUgaXMgbGFyZ2UpLgorCQkJCSAqCisJCQkJICogQmVjYXVzZSBvZiB0aGlzLCB0aGUgc3RhcnRpbmcgY2x1c3RpZHggaXMKKwkJCQkgKiBpbml0aWFsaXplZCB0byB6ZXJvIGluIHRoaXMgbG9vcCBidXQgbXVzdAorCQkJCSAqIGxhdGVyIGJlIHJlc2V0IGFmdGVyIHJlYWRpbmcgaW4gdGhlIGNsdXN0ZXIKKwkJCQkgKiBidWZmZXIuCisJCQkJICovCisJCQkJaWYgKChjaHVua2lkeCAmIChuaWNsdXN0ZXIgLSAxKSkgPT0gMCkgeworCQkJCQlhZ2JubyA9IFhGU19BR0lOT19UT19BR0JOTyhtcCwKKwkJCQkJCQlJTlRfR0VUKGlyYnAtPmlyX3N0YXJ0aW5vLCBBUkNIX0NPTlZFUlQpKSArCisJCQkJCQkoKGNodW5raWR4ICYgbmltYXNrKSA+PgorCQkJCQkJIG1wLT5tX3NiLnNiX2lub3BibG9nKTsKKworCQkJCQlpZiAoZmxhZ3MgJiBCVUxLU1RBVF9GR19RVUlDSykgeworCQkJCQkJaW5vID0gWEZTX0FHSU5PX1RPX0lOTyhtcCwgYWdubywKKwkJCQkJCQkJICAgICAgIGFnaW5vKTsKKwkJCQkJCWJubyA9IFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sCisJCQkJCQkJCSAgICAgICBhZ2Jubyk7CisKKwkJCQkJCS8qCisJCQkJCQkgKiBHZXQgdGhlIGlub2RlIGNsdXN0ZXIgYnVmZmVyCisJCQkJCQkgKi8KKwkJCQkJCUFTU0VSVCh4ZnNfaW5vZGVfem9uZSAhPSBOVUxMKTsKKwkJCQkJCWlwID0ga21lbV96b25lX3phbGxvYyh4ZnNfaW5vZGVfem9uZSwKKwkJCQkJCQkJICAgICAgS01fU0xFRVApOworCQkJCQkJaXAtPmlfaW5vID0gaW5vOworCQkJCQkJaXAtPmlfbW91bnQgPSBtcDsKKwkJCQkJCWlmIChicCkKKwkJCQkJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJCQkJCWVycm9yID0geGZzX2l0b2JwKG1wLCBOVUxMLCBpcCwKKwkJCQkJCQkJICAmZGlwLCAmYnAsIGJubyk7CisJCQkJCQlpZiAoIWVycm9yKQorCQkJCQkJCWNsdXN0aWR4ID0gaXAtPmlfYm9mZnNldCAvIG1wLT5tX3NiLnNiX2lub2Rlc2l6ZTsKKwkJCQkJCWttZW1fem9uZV9mcmVlKHhmc19pbm9kZV96b25lLCBpcCk7CisJCQkJCQlpZiAoWEZTX1RFU1RfRVJST1IoZXJyb3IgIT0gMCwKKwkJCQkJCQkJICAgbXAsIFhGU19FUlJUQUdfQlVMS1NUQVRfUkVBRF9DSFVOSywKKwkJCQkJCQkJICAgWEZTX1JBTkRPTV9CVUxLU1RBVF9SRUFEX0NIVU5LKSkgeworCQkJCQkJCWJwID0gTlVMTDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQkvKgorCQkJCSAqIFNraXAgaWYgdGhpcyBpbm9kZSBpcyBmcmVlLgorCQkJCSAqLworCQkJCWlmIChYRlNfSU5PQlRfTUFTSyhjaHVua2lkeCkgJiBJTlRfR0VUKGlyYnAtPmlyX2ZyZWUsIEFSQ0hfQ09OVkVSVCkpCisJCQkJCWNvbnRpbnVlOworCQkJCS8qCisJCQkJICogQ291bnQgdXNlZCBpbm9kZXMgYXMgZnJlZSBzbyB3ZSBjYW4gdGVsbAorCQkJCSAqIHdoZW4gdGhlIGNodW5rIGlzIHVzZWQgdXAuCisJCQkJICovCisJCQkJSU5UX01PRChpcmJwLT5pcl9mcmVlY291bnQsIEFSQ0hfQ09OVkVSVCwgKzEpOworCQkJCWlubyA9IFhGU19BR0lOT19UT19JTk8obXAsIGFnbm8sIGFnaW5vKTsKKwkJCQlibm8gPSBYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLCBhZ2Jubyk7CisJCQkJaWYgKGZsYWdzICYgQlVMS1NUQVRfRkdfUVVJQ0spIHsKKwkJCQkJZGlwID0gKHhmc19kaW5vZGVfdCAqKXhmc19idWZfb2Zmc2V0KGJwLAorCQkJCQkgICAgICAoY2x1c3RpZHggPDwgbXAtPm1fc2Iuc2JfaW5vZGVsb2cpKTsKKworCQkJCQlpZiAoSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfbWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCSAgICAhPSBYRlNfRElOT0RFX01BR0lDCisJCQkJCSAgICB8fCAhWEZTX0RJTk9ERV9HT09EX1ZFUlNJT04oCisJCQkJCQkgICAgSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfdmVyc2lvbiwgQVJDSF9DT05WRVJUKSkpCisJCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIEdldCB0aGUgaW5vZGUgYW5kIGZpbGwgaW4gYSBzaW5nbGUgYnVmZmVyLgorCQkJCSAqIEJVTEtTVEFUX0ZHX1FVSUNLIHVzZXMgZGlwIHRvIGZpbGwgaXQgaW4uCisJCQkJICogQlVMS1NUQVRfRkdfSUdFVCB1c2VzIGlnZXRzLgorCQkJCSAqIFNlZTogeGZzX2J1bGtzdGF0X29uZSAmIHhmc19kbV9idWxrc3RhdF9vbmUuCisJCQkJICogVGhpcyBpcyBhbHNvIHVzZWQgdG8gY291bnQgaW5vZGVzL2Jsa3MsIGV0YworCQkJCSAqIGluIHhmc19xbV9xdW90YWNoZWNrLgorCQkJCSAqLworCQkJCXVidXNlZCA9IHN0YXRzdHJ1Y3Rfc2l6ZTsKKwkJCQllcnJvciA9IGZvcm1hdHRlcihtcCwgaW5vLCB1YnVmcCwKKwkJCQkJCXVibGVmdCwgcHJpdmF0ZV9kYXRhLAorCQkJCQkJYm5vLCAmdWJ1c2VkLCBkaXAsICZmbXRlcnJvcik7CisJCQkJaWYgKGZtdGVycm9yID09IEJVTEtTVEFUX1JWX05PVEhJTkcpIHsKKwkJCQkJaWYgKGVycm9yID09IEVOT01FTSkKKwkJCQkJCXVibGVmdCA9IDA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoZm10ZXJyb3IgPT0gQlVMS1NUQVRfUlZfR0lWRVVQKSB7CisJCQkJCXVibGVmdCA9IDA7CisJCQkJCUFTU0VSVChlcnJvcik7CisJCQkJCXJ2YWwgPSBlcnJvcjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICh1YnVmcCkKKwkJCQkJdWJ1ZnAgKz0gdWJ1c2VkOworCQkJCXVibGVmdCAtPSB1YnVzZWQ7CisJCQkJdWJlbGVtKys7CisJCQkJbGFzdGlubyA9IGlubzsKKwkJCX0KKwkJfQorCisJCWlmIChicCkKKwkJCXhmc19idWZfcmVsc2UoYnApOworCisJCS8qCisJCSAqIFNldCB1cCBmb3IgdGhlIG5leHQgbG9vcCBpdGVyYXRpb24uCisJCSAqLworCQlpZiAodWJsZWZ0ID4gMCkgeworCQkJaWYgKGVuZF9vZl9hZykgeworCQkJCWFnbm8rKzsKKwkJCQlhZ2lubyA9IDA7CisJCQl9IGVsc2UKKwkJCQlhZ2lubyA9IFhGU19JTk9fVE9fQUdJTk8obXAsIGxhc3Rpbm8pOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKwkvKgorCSAqIERvbmUsIHdlJ3JlIGVpdGhlciBvdXQgb2YgZmlsZXN5c3RlbSBvciBzcGFjZSB0byBwdXQgdGhlIGRhdGEuCisJICovCisJa21lbV9mcmVlKGlyYnVmLCBOQlBDKTsKKwlpZiAodWJ1ZmZlcikKKwkJdW51c2VyYWNjKHVidWZmZXIsIHViY291bnQgKiBzdGF0c3RydWN0X3NpemUsIChCX1JFQUR8Ql9QSFlTKSk7CisJKnViY291bnRwID0gdWJlbGVtOworCWlmIChhZ25vID49IG1wLT5tX3NiLnNiX2FnY291bnQpIHsKKwkJLyoKKwkJICogSWYgd2UgcmFuIG91dCBvZiBmaWxlc3lzdGVtLCBtYXJrIGxhc3Rpbm8gYXMgb2ZmCisJCSAqIHRoZSBlbmQgb2YgdGhlIGZpbGVzeXN0ZW0sIHNvIHRoZSBuZXh0IGNhbGwKKwkJICogd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkuCisJCSAqLworCQkqbGFzdGlub3AgPSAoeGZzX2lub190KVhGU19BR0lOT19UT19JTk8obXAsIGFnbm8sIDApOworCQkqZG9uZSA9IDE7CisJfSBlbHNlCisJCSpsYXN0aW5vcCA9ICh4ZnNfaW5vX3QpbGFzdGlubzsKKworCXJldHVybiBydmFsOworfQorCisvKgorICogUmV0dXJuIHN0YXQgaW5mb3JtYXRpb24gaW4gYnVsayAoYnktaW5vZGUpIGZvciB0aGUgZmlsZXN5c3RlbS4KKyAqIFNwZWNpYWwgY2FzZSBmb3Igbm9uLXNlcXVlbnRpYWwgb25lIGlub2RlIGJ1bGtzdGF0LgorICovCitpbnQJCQkJCS8qIGVycm9yIHN0YXR1cyAqLworeGZzX2J1bGtzdGF0X3NpbmdsZSgKKwl4ZnNfbW91bnRfdAkJKm1wLAkvKiBtb3VudCBwb2ludCBmb3IgZmlsZXN5c3RlbSAqLworCXhmc19pbm9fdAkJKmxhc3Rpbm9wLCAvKiBpbm9kZSB0byByZXR1cm4gKi8KKwljaGFyCQkJX191c2VyICpidWZmZXIsIC8qIGJ1ZmZlciB3aXRoIGlub2RlIHN0YXRzICovCisJaW50CQkJKmRvbmUpCS8qIDEgaWYgdGhlcmUncmUgbW9yZSBzdGF0cyB0byBnZXQgKi8KK3sKKwlpbnQJCQljb3VudDsJLyogY291bnQgdmFsdWUgZm9yIGJ1bGtzdGF0IGNhbGwgKi8KKwlpbnQJCQllcnJvcjsJLyogcmV0dXJuIHZhbHVlICovCisJeGZzX2lub190CQlpbm87CS8qIGZpbGVzeXN0ZW0gaW5vZGUgbnVtYmVyICovCisJaW50CQkJcmVzOwkvKiByZXN1bHQgZnJvbSBiczEgKi8KKworCS8qCisJICogbm90ZSB0aGF0IHJlcXVlc3RpbmcgdmFsaWQgaW5vZGUgbnVtYmVycyB3aGljaCBhcmUgbm90IGFsbG9jYXRlZAorCSAqIHRvIGlub2RlcyB3aWxsIG1vc3QgbGlrZWx5IGNhdXNlIHhmc19pdG9icCB0byBnZW5lcmF0ZSB3YXJuaW5nCisJICogbWVzc2FnZXMgYWJvdXQgYmFkIG1hZ2ljIG51bWJlcnMuIFRoaXMgaXMgb2suIFRoZSBmYWN0IHRoYXQKKwkgKiB0aGUgaW5vZGUgaXNuJ3QgYWN0dWFsbHkgYW4gaW5vZGUgaXMgaGFuZGxlZCBieSB0aGUKKwkgKiBlcnJvciBjaGVjayBiZWxvdy4gRG9uZSB0aGlzIHdheSB0byBtYWtlIHRoZSB1c3VhbCBjYXNlIGZhc3RlcgorCSAqIGF0IHRoZSBleHBlbnNlIG9mIHRoZSBlcnJvciBjYXNlLgorCSAqLworCisJaW5vID0gKHhmc19pbm9fdCkqbGFzdGlub3A7CisJZXJyb3IgPSB4ZnNfYnVsa3N0YXRfb25lKG1wLCBpbm8sIGJ1ZmZlciwgc2l6ZW9mKHhmc19ic3RhdF90KSwKKwkJCQkgTlVMTCwgMCwgTlVMTCwgTlVMTCwgJnJlcyk7CisJaWYgKGVycm9yKSB7CisJCS8qCisJCSAqIFNwZWNpYWwgY2FzZSB3YXkgZmFpbGVkLCBkbyBpdCB0aGUgImxvbmciIHdheQorCQkgKiB0byBzZWUgaWYgdGhhdCB3b3Jrcy4KKwkJICovCisJCSgqbGFzdGlub3ApLS07CisJCWNvdW50ID0gMTsKKwkJaWYgKHhmc19idWxrc3RhdChtcCwgbGFzdGlub3AsICZjb3VudCwgeGZzX2J1bGtzdGF0X29uZSwKKwkJCQlOVUxMLCBzaXplb2YoeGZzX2JzdGF0X3QpLCBidWZmZXIsCisJCQkJQlVMS1NUQVRfRkdfSUdFVCwgZG9uZSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCWlmIChjb3VudCA9PSAwIHx8ICh4ZnNfaW5vX3QpKmxhc3Rpbm9wICE9IGlubykKKwkJCXJldHVybiBlcnJvciA9PSBFRlNDT1JSVVBURUQgPworCQkJCVhGU19FUlJPUihFSU5WQUwpIDogZXJyb3I7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKwkqZG9uZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gaW5vZGUgbnVtYmVyIHRhYmxlIGZvciB0aGUgZmlsZXN5c3RlbS4KKyAqLworaW50CQkJCQkvKiBlcnJvciBzdGF0dXMgKi8KK3hmc19pbnVtYmVycygKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBtb3VudCBwb2ludCBmb3IgZmlsZXN5c3RlbSAqLworCXhmc19pbm9fdAkqbGFzdGlubywJLyogbGFzdCBpbm9kZSByZXR1cm5lZCAqLworCWludAkJKmNvdW50LAkJLyogc2l6ZSBvZiBidWZmZXIvY291bnQgcmV0dXJuZWQgKi8KKwl4ZnNfaW5vZ3JwX3QJX191c2VyICp1YnVmZmVyKS8qIGJ1ZmZlciB3aXRoIGlub2RlIGRlc2NyaXB0aW9ucyAqLworeworCXhmc19idWZfdAkqYWdicDsKKwl4ZnNfYWdpbm9fdAlhZ2lubzsKKwl4ZnNfYWdudW1iZXJfdAlhZ25vOworCWludAkJYmNvdW50OworCXhmc19pbm9ncnBfdAkqYnVmZmVyOworCWludAkJYnVmaWR4OworCXhmc19idHJlZV9jdXJfdAkqY3VyOworCWludAkJZXJyb3I7CisJX19pbnQzMl90CWdjbnQ7CisJeGZzX2lub2ZyZWVfdAlnZnJlZTsKKwl4ZnNfYWdpbm9fdAlnaW5vOworCWludAkJaTsKKwl4ZnNfaW5vX3QJaW5vOworCWludAkJbGVmdDsKKwlpbnQJCXRtcDsKKworCWlubyA9ICh4ZnNfaW5vX3QpKmxhc3Rpbm87CisJYWdubyA9IFhGU19JTk9fVE9fQUdOTyhtcCwgaW5vKTsKKwlhZ2lubyA9IFhGU19JTk9fVE9fQUdJTk8obXAsIGlubyk7CisJbGVmdCA9ICpjb3VudDsKKwkqY291bnQgPSAwOworCWJjb3VudCA9IE1JTihsZWZ0LCAoaW50KShOQlBQIC8gc2l6ZW9mKCpidWZmZXIpKSk7CisJYnVmZmVyID0ga21lbV9hbGxvYyhiY291bnQgKiBzaXplb2YoKmJ1ZmZlciksIEtNX1NMRUVQKTsKKwllcnJvciA9IGJ1ZmlkeCA9IDA7CisJY3VyID0gTlVMTDsKKwlhZ2JwID0gTlVMTDsKKwl3aGlsZSAobGVmdCA+IDAgJiYgYWdubyA8IG1wLT5tX3NiLnNiX2FnY291bnQpIHsKKwkJaWYgKGFnYnAgPT0gTlVMTCkgeworCQkJZG93bl9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCQkJZXJyb3IgPSB4ZnNfaWFsbG9jX3JlYWRfYWdpKG1wLCBOVUxMLCBhZ25vLCAmYWdicCk7CisJCQl1cF9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCQkJaWYgKGVycm9yKSB7CisJCQkJLyoKKwkJCQkgKiBJZiB3ZSBjYW4ndCByZWFkIHRoZSBBR0kgb2YgdGhpcyBhZywKKwkJCQkgKiB0aGVuIGp1c3Qgc2tpcCB0byB0aGUgbmV4dCBvbmUuCisJCQkJICovCisJCQkJQVNTRVJUKGN1ciA9PSBOVUxMKTsKKwkJCQlhZ2JwID0gTlVMTDsKKwkJCQlhZ25vKys7CisJCQkJYWdpbm8gPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJY3VyID0geGZzX2J0cmVlX2luaXRfY3Vyc29yKG1wLCBOVUxMLCBhZ2JwLCBhZ25vLAorCQkJCVhGU19CVE5VTV9JTk8sICh4ZnNfaW5vZGVfdCAqKTAsIDApOworCQkJZXJyb3IgPSB4ZnNfaW5vYnRfbG9va3VwX2dlKGN1ciwgYWdpbm8sIDAsIDAsICZ0bXApOworCQkJaWYgKGVycm9yKSB7CisJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLCBYRlNfQlRSRUVfRVJST1IpOworCQkJCWN1ciA9IE5VTEw7CisJCQkJeGZzX2J1Zl9yZWxzZShhZ2JwKTsKKwkJCQlhZ2JwID0gTlVMTDsKKwkJCQkvKgorCQkJCSAqIE1vdmUgdXAgdGhlIHRoZSBsYXN0IGlub2RlIGluIHRoZSBjdXJyZW50CisJCQkJICogY2h1bmsuICBUaGUgbG9va3VwX2dlIHdpbGwgYWx3YXlzIGdldAorCQkJCSAqIHVzIHRoZSBmaXJzdCBpbm9kZSBpbiB0aGUgbmV4dCBjaHVuay4KKwkJCQkgKi8KKwkJCQlhZ2lubyArPSBYRlNfSU5PREVTX1BFUl9DSFVOSyAtIDE7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJaWYgKChlcnJvciA9IHhmc19pbm9idF9nZXRfcmVjKGN1ciwgJmdpbm8sICZnY250LCAmZ2ZyZWUsCisJCQkmaSkpIHx8CisJCSAgICBpID09IDApIHsKKwkJCXhmc19idWZfcmVsc2UoYWdicCk7CisJCQlhZ2JwID0gTlVMTDsKKwkJCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCQkJY3VyID0gTlVMTDsKKwkJCWFnbm8rKzsKKwkJCWFnaW5vID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWFnaW5vID0gZ2lubyArIFhGU19JTk9ERVNfUEVSX0NIVU5LIC0gMTsKKwkJYnVmZmVyW2J1ZmlkeF0ueGlfc3RhcnRpbm8gPSBYRlNfQUdJTk9fVE9fSU5PKG1wLCBhZ25vLCBnaW5vKTsKKwkJYnVmZmVyW2J1ZmlkeF0ueGlfYWxsb2Njb3VudCA9IFhGU19JTk9ERVNfUEVSX0NIVU5LIC0gZ2NudDsKKwkJYnVmZmVyW2J1ZmlkeF0ueGlfYWxsb2NtYXNrID0gfmdmcmVlOworCQlidWZpZHgrKzsKKwkJbGVmdC0tOworCQlpZiAoYnVmaWR4ID09IGJjb3VudCkgeworCQkJaWYgKGNvcHlfdG9fdXNlcih1YnVmZmVyLCBidWZmZXIsCisJCQkJCWJ1ZmlkeCAqIHNpemVvZigqYnVmZmVyKSkpIHsKKwkJCQllcnJvciA9IFhGU19FUlJPUihFRkFVTFQpOworCQkJCWJyZWFrOworCQkJfQorCQkJdWJ1ZmZlciArPSBidWZpZHg7CisJCQkqY291bnQgKz0gYnVmaWR4OworCQkJYnVmaWR4ID0gMDsKKwkJfQorCQlpZiAobGVmdCkgeworCQkJZXJyb3IgPSB4ZnNfaW5vYnRfaW5jcmVtZW50KGN1ciwgMCwgJnRtcCk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjdXIsIFhGU19CVFJFRV9FUlJPUik7CisJCQkJY3VyID0gTlVMTDsKKwkJCQl4ZnNfYnVmX3JlbHNlKGFnYnApOworCQkJCWFnYnAgPSBOVUxMOworCQkJCS8qCisJCQkJICogVGhlIGFnaW5vIHZhbHVlIGhhcyBhbHJlYWR5IGJlZW4gYnVtcGVkLgorCQkJCSAqIEp1c3QgdHJ5IHRvIHNraXAgdXAgdG8gaXQuCisJCQkJICovCisJCQkJYWdpbm8gKz0gWEZTX0lOT0RFU19QRVJfQ0hVTks7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwl9CisJaWYgKCFlcnJvcikgeworCQlpZiAoYnVmaWR4KSB7CisJCQlpZiAoY29weV90b191c2VyKHVidWZmZXIsIGJ1ZmZlciwKKwkJCQkJYnVmaWR4ICogc2l6ZW9mKCpidWZmZXIpKSkKKwkJCQllcnJvciA9IFhGU19FUlJPUihFRkFVTFQpOworCQkJZWxzZQorCQkJCSpjb3VudCArPSBidWZpZHg7CisJCX0KKwkJKmxhc3Rpbm8gPSBYRlNfQUdJTk9fVE9fSU5PKG1wLCBhZ25vLCBhZ2lubyk7CisJfQorCWttZW1fZnJlZShidWZmZXIsIGJjb3VudCAqIHNpemVvZigqYnVmZmVyKSk7CisJaWYgKGN1cikKKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLCAoZXJyb3IgPyBYRlNfQlRSRUVfRVJST1IgOgorCQkJCQkgICBYRlNfQlRSRUVfTk9FUlJPUikpOworCWlmIChhZ2JwKQorCQl4ZnNfYnVmX3JlbHNlKGFnYnApOworCXJldHVybiBlcnJvcjsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaXRhYmxlLmggYi9mcy94ZnMveGZzX2l0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZTlkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2l0YWJsZS5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19JVEFCTEVfSF9fCisjZGVmaW5lCV9fWEZTX0lUQUJMRV9IX18KKworLyoKKyAqIHhmc19idWxrc3RhdCgpIGlzIHVzZWQgdG8gZmlsbCBpbiB4ZnNfYnN0YXQgc3RydWN0dXJlcyBhcyB3ZWxsIGFzIGRtX3N0YXQKKyAqIHN0cnVjdHVyZXMgKGJ5IHRoZSBkbWkgbGlicmFyeSkuIFRoaXMgaXMgYSBwb2ludGVyIHRvIGEgZm9ybWF0dGVyIGZ1bmN0aW9uCisgKiB0aGF0IHdpbGwgaWdldCB0aGUgaW5vZGUgYW5kIGZpbGwgaW4gdGhlIGFwcHJvcHJpYXRlIHN0cnVjdHVyZS4KKyAqIHNlZSB4ZnNfYnVsa3N0YXRfb25lKCkgYW5kIHhmc19kbV9idWxrc3RhdF9vbmUoKSBpbiBkbWFwaV94ZnMuYworICovCit0eXBlZGVmIGludCAoKmJ1bGtzdGF0X29uZV9wZikoc3RydWN0IHhmc19tb3VudAkqbXAsCisJCQkgICAgICAgeGZzX2lub190CWlubywKKwkJCSAgICAgICB2b2lkCQlfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgICBpbnQJCXVic2l6ZSwKKwkJCSAgICAgICB2b2lkCQkqcHJpdmF0ZV9kYXRhLAorCQkJICAgICAgIHhmc19kYWRkcl90CWJubywKKwkJCSAgICAgICBpbnQJCSp1YnVzZWQsCisJCQkgICAgICAgdm9pZAkJKmRpcCwKKwkJCSAgICAgICBpbnQJCSpzdGF0KTsKKworLyoKKyAqIFZhbHVlcyBmb3Igc3RhdCByZXR1cm4gdmFsdWUuCisgKi8KKyNkZWZpbmUJQlVMS1NUQVRfUlZfTk9USElORwkwCisjZGVmaW5lCUJVTEtTVEFUX1JWX0RJRE9ORQkxCisjZGVmaW5lCUJVTEtTVEFUX1JWX0dJVkVVUAkyCisKKy8qCisgKiBWYWx1ZXMgZm9yIGJ1bGtzdGF0IGZsYWcgYXJndW1lbnQuCisgKi8KKyNkZWZpbmUJQlVMS1NUQVRfRkdfSUdFVAkweDEJLyogR28gdGhyb3VnaCB0aGUgYnVmZmVyIGNhY2hlICovCisjZGVmaW5lCUJVTEtTVEFUX0ZHX1FVSUNLCTB4MgkvKiBObyBpZ2V0LCB3YWxrIHRoZSBkaW5vZGUgY2x1c3RlciAqLworI2RlZmluZSBCVUxLU1RBVF9GR19WRlNMT0NLRUQJMHg0CS8qIEFscmVhZHkgaGF2ZSB2ZnMgbG9jayAqLworCisvKgorICogUmV0dXJuIHN0YXQgaW5mb3JtYXRpb24gaW4gYnVsayAoYnktaW5vZGUpIGZvciB0aGUgZmlsZXN5c3RlbS4KKyAqLworaW50CQkJCQkvKiBlcnJvciBzdGF0dXMgKi8KK3hmc19idWxrc3RhdCgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBtb3VudCBwb2ludCBmb3IgZmlsZXN5c3RlbSAqLworCXhmc19pbm9fdAkqbGFzdGlubywJLyogbGFzdCBpbm9kZSByZXR1cm5lZCAqLworCWludAkJKmNvdW50LAkJLyogc2l6ZSBvZiBidWZmZXIvY291bnQgcmV0dXJuZWQgKi8KKwlidWxrc3RhdF9vbmVfcGYgZm9ybWF0dGVyLAkvKiBmdW5jIHRoYXQnZCBmaWxsIGEgc2luZ2xlIGJ1ZiAqLworCXZvaWQJCSpwcml2YXRlX2RhdGEsCS8qIHByaXZhdGUgZGF0YSBmb3IgZm9ybWF0dGVyICovCisJc2l6ZV90CQlzdGF0c3RydWN0X3NpemUsLyogc2l6ZW9mIHN0cnVjdCB0aGF0IHdlJ3JlIGZpbGxpbmcgKi8KKwljaGFyCQlfX3VzZXIgKnVidWZmZXIsLyogYnVmZmVyIHdpdGggaW5vZGUgc3RhdHMgKi8KKwlpbnQJCWZsYWdzLAkJLyogZmxhZyB0byBjb250cm9sIGFjY2VzcyBtZXRob2QgKi8KKwlpbnQJCSpkb25lKTsJCS8qIDEgaWYgdGhlcmUncmUgbW9yZSBzdGF0cyB0byBnZXQgKi8KKworaW50Cit4ZnNfYnVsa3N0YXRfc2luZ2xlKAorCXhmc19tb3VudF90CQkqbXAsCisJeGZzX2lub190CQkqbGFzdGlub3AsCisJY2hhcgkJCV9fdXNlciAqYnVmZmVyLAorCWludAkJCSpkb25lKTsKKworaW50Cit4ZnNfYnVsa3N0YXRfb25lKAorCXhmc19tb3VudF90CQkqbXAsCisJeGZzX2lub190CQlpbm8sCisJdm9pZAkJCV9fdXNlciAqYnVmZmVyLAorCWludAkJCXVic2l6ZSwKKwl2b2lkCQkJKnByaXZhdGVfZGF0YSwKKwl4ZnNfZGFkZHJfdAkJYm5vLAorCWludAkJCSp1YnVzZWQsCisJdm9pZAkJCSpkaWJ1ZmYsCisJaW50CQkJKnN0YXQpOworCitpbnQJCQkJCS8qIGVycm9yIHN0YXR1cyAqLworeGZzX2ludW1iZXJzKAorCXhmc19tb3VudF90CQkqbXAsCS8qIG1vdW50IHBvaW50IGZvciBmaWxlc3lzdGVtICovCisJeGZzX2lub190CQkqbGFzdCwJLyogbGFzdCBpbm9kZSByZXR1cm5lZCAqLworCWludAkJCSpjb3VudCwJLyogc2l6ZSBvZiBidWZmZXIvY291bnQgcmV0dXJuZWQgKi8KKwl4ZnNfaW5vZ3JwX3QJCV9fdXNlciAqYnVmZmVyKTsvKiBidWZmZXIgd2l0aCBpbm9kZSBpbmZvICovCisKKyNlbmRpZgkvKiBfX1hGU19JVEFCTEVfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZy5jIGIvZnMveGZzL3hmc19sb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTJkNWZiCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19sb2cuYwpAQCAtMCwwICsxLDM1NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKy8qCisgKiBIaWdoIGxldmVsIGludGVyZmFjZSByb3V0aW5lcyBmb3IgbG9nIG1hbmFnZXIKKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfbG9nX3ByaXYuaCIKKyNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfbG9nX3JlY292ZXIuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKKworCisjZGVmaW5lIHhsb2dfd3JpdGVfYWR2X2NudChwdHIsIGxlbiwgb2ZmLCBieXRlcykgXAorCXsgKHB0cikgKz0gKGJ5dGVzKTsgXAorCSAgKGxlbikgLT0gKGJ5dGVzKTsgXAorCSAgKG9mZikgKz0gKGJ5dGVzKTt9CisKKy8qIExvY2FsIG1pc2NlbGxhbmVvdXMgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworU1RBVElDIGludAkgeGxvZ19iZHN0cmF0X2NiKHN0cnVjdCB4ZnNfYnVmICopOworU1RBVElDIGludAkgeGxvZ19jb21taXRfcmVjb3JkKHhmc19tb3VudF90ICptcCwgeGxvZ190aWNrZXRfdCAqdGlja2V0LAorCQkJCSAgICB4bG9nX2luX2NvcmVfdCAqKiwgeGZzX2xzbl90ICopOworU1RBVElDIHhsb2dfdCAqICB4bG9nX2FsbG9jX2xvZyh4ZnNfbW91bnRfdAkqbXAsCisJCQkJeGZzX2J1ZnRhcmdfdAkqbG9nX3RhcmdldCwKKwkJCQl4ZnNfZGFkZHJfdAlibGtfb2Zmc2V0LAorCQkJCWludAkJbnVtX2JibGtzKTsKK1NUQVRJQyBpbnQJIHhsb2dfc3BhY2VfbGVmdCh4bG9nX3QgKmxvZywgaW50IGN5Y2xlLCBpbnQgYnl0ZXMpOworU1RBVElDIGludAkgeGxvZ19zeW5jKHhsb2dfdCAqbG9nLCB4bG9nX2luX2NvcmVfdCAqaWNsb2cpOworU1RBVElDIHZvaWQJIHhsb2dfdW5hbGxvY19sb2coeGxvZ190ICpsb2cpOworU1RBVElDIGludAkgeGxvZ193cml0ZSh4ZnNfbW91bnRfdCAqbXAsIHhmc19sb2dfaW92ZWNfdCByZWdpb25bXSwKKwkJCSAgICBpbnQgbmVudHJpZXMsIHhmc19sb2dfdGlja2V0X3QgdGljLAorCQkJICAgIHhmc19sc25fdCAqc3RhcnRfbHNuLAorCQkJICAgIHhsb2dfaW5fY29yZV90ICoqY29tbWl0X2ljbG9nLAorCQkJICAgIHVpbnQgZmxhZ3MpOworCisvKiBsb2NhbCBzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9ucyAqLworU1RBVElDIHZvaWQgeGxvZ19zdGF0ZV9kb25lX3N5bmNpbmcoeGxvZ19pbl9jb3JlX3QgKmljbG9nLCBpbnQpOworU1RBVElDIHZvaWQgeGxvZ19zdGF0ZV9kb19jYWxsYmFjayh4bG9nX3QgKmxvZyxpbnQgYWJvcnRlZCwgeGxvZ19pbl9jb3JlX3QgKmljbG9nKTsKK1NUQVRJQyBpbnQgIHhsb2dfc3RhdGVfZ2V0X2ljbG9nX3NwYWNlKHhsb2dfdAkJKmxvZywKKwkJCQkgICAgICAgaW50CQlsZW4sCisJCQkJICAgICAgIHhsb2dfaW5fY29yZV90CSoqaWNsb2csCisJCQkJICAgICAgIHhsb2dfdGlja2V0X3QJKnRpY2tldCwKKwkJCQkgICAgICAgaW50CQkqY29udGludWVkX3dyaXRlLAorCQkJCSAgICAgICBpbnQJCSpsb2dvZmZzZXRwKTsKK1NUQVRJQyB2b2lkIHhsb2dfc3RhdGVfcHV0X3RpY2tldCh4bG9nX3QJKmxvZywKKwkJCQkgIHhsb2dfdGlja2V0X3QgKnRpYyk7CitTVEFUSUMgaW50ICB4bG9nX3N0YXRlX3JlbGVhc2VfaWNsb2coeGxvZ190CQkqbG9nLAorCQkJCSAgICAgeGxvZ19pbl9jb3JlX3QJKmljbG9nKTsKK1NUQVRJQyB2b2lkIHhsb2dfc3RhdGVfc3dpdGNoX2ljbG9ncyh4bG9nX3QJCSpsb2csCisJCQkJICAgICB4bG9nX2luX2NvcmVfdCAqaWNsb2csCisJCQkJICAgICBpbnQJCWV2ZW50dWFsX3NpemUpOworU1RBVElDIGludCAgeGxvZ19zdGF0ZV9zeW5jKHhsb2dfdCAqbG9nLCB4ZnNfbHNuX3QgbHNuLCB1aW50IGZsYWdzKTsKK1NUQVRJQyBpbnQgIHhsb2dfc3RhdGVfc3luY19hbGwoeGxvZ190ICpsb2csIHVpbnQgZmxhZ3MpOworU1RBVElDIHZvaWQgeGxvZ19zdGF0ZV93YW50X3N5bmMoeGxvZ190CSpsb2csIHhsb2dfaW5fY29yZV90ICppY2xvZyk7CisKKy8qIGxvY2FsIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIGdyYW50IGhlYWQgKi8KK1NUQVRJQyBpbnQgIHhsb2dfZ3JhbnRfbG9nX3NwYWNlKHhsb2dfdAkJKmxvZywKKwkJCQkgeGxvZ190aWNrZXRfdAkqeHRpYyk7CitTVEFUSUMgdm9pZCB4bG9nX2dyYW50X3B1c2hfYWlsKHhmc19tb3VudF90CSptcCwKKwkJCQlpbnQJCW5lZWRfYnl0ZXMpOworU1RBVElDIHZvaWQgeGxvZ19yZWdyYW50X3Jlc2VydmVfbG9nX3NwYWNlKHhsb2dfdAkgKmxvZywKKwkJCQkJICAgeGxvZ190aWNrZXRfdCAqdGlja2V0KTsKK1NUQVRJQyBpbnQgeGxvZ19yZWdyYW50X3dyaXRlX2xvZ19zcGFjZSh4bG9nX3QJCSpsb2csCisJCQkJCSB4bG9nX3RpY2tldF90ICAqdGlja2V0KTsKK1NUQVRJQyB2b2lkIHhsb2dfdW5ncmFudF9sb2dfc3BhY2UoeGxvZ190CSAqbG9nLAorCQkJCSAgIHhsb2dfdGlja2V0X3QgKnRpY2tldCk7CisKKworLyogbG9jYWwgdGlja2V0IGZ1bmN0aW9ucyAqLworU1RBVElDIHZvaWQJCXhsb2dfc3RhdGVfdGlja2V0X2FsbG9jKHhsb2dfdCAqbG9nKTsKK1NUQVRJQyB4bG9nX3RpY2tldF90CSp4bG9nX3RpY2tldF9nZXQoeGxvZ190ICpsb2csCisJCQkJCSBpbnQJdW5pdF9ieXRlcywKKwkJCQkJIGludAljb3VudCwKKwkJCQkJIGNoYXIJY2xpZW50aWQsCisJCQkJCSB1aW50CWZsYWdzKTsKK1NUQVRJQyB2b2lkCQl4bG9nX3RpY2tldF9wdXQoeGxvZ190ICpsb2csIHhsb2dfdGlja2V0X3QgKnRpY2tldCk7CisKKy8qIGxvY2FsIGRlYnVnIGZ1bmN0aW9ucyAqLworI2lmIGRlZmluZWQoREVCVUcpICYmICFkZWZpbmVkKFhMT0dfTk9MT0cpCitTVEFUSUMgdm9pZAl4bG9nX3ZlcmlmeV9kZXN0X3B0cih4bG9nX3QgKmxvZywgX19wc2ludF90IHB0cik7CitTVEFUSUMgdm9pZAl4bG9nX3ZlcmlmeV9ncmFudF9oZWFkKHhsb2dfdCAqbG9nLCBpbnQgZXF1YWxzKTsKK1NUQVRJQyB2b2lkCXhsb2dfdmVyaWZ5X2ljbG9nKHhsb2dfdCAqbG9nLCB4bG9nX2luX2NvcmVfdCAqaWNsb2csCisJCQkJICBpbnQgY291bnQsIGJvb2xlYW5fdCBzeW5jaW5nKTsKK1NUQVRJQyB2b2lkCXhsb2dfdmVyaWZ5X3RhaWxfbHNuKHhsb2dfdCAqbG9nLCB4bG9nX2luX2NvcmVfdCAqaWNsb2csCisJCQkJICAgICB4ZnNfbHNuX3QgdGFpbF9sc24pOworI2Vsc2UKKyNkZWZpbmUgeGxvZ192ZXJpZnlfZGVzdF9wdHIoYSxiKQorI2RlZmluZSB4bG9nX3ZlcmlmeV9ncmFudF9oZWFkKGEsYikKKyNkZWZpbmUgeGxvZ192ZXJpZnlfaWNsb2coYSxiLGMsZCkKKyNkZWZpbmUgeGxvZ192ZXJpZnlfdGFpbF9sc24oYSxiLGMpCisjZW5kaWYKKworaW50CQl4bG9nX2ljbG9nc19lbXB0eSh4bG9nX3QgKmxvZyk7CisKKyNpZmRlZiBERUJVRworaW50IHhsb2dfZG9fZXJyb3IgPSAwOworaW50IHhsb2dfcmVxX251bSAgPSAwOworaW50IHhsb2dfZXJyb3JfbW9kID0gMzM7CisjZW5kaWYKKworI2RlZmluZSBYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpCShsb2ctPmxfZmxhZ3MgJiBYTE9HX0lPX0VSUk9SKQorCisvKgorICogMCA9PiBkaXNhYmxlIGxvZyBtYW5hZ2VyCisgKiAxID0+IGVuYWJsZSBsb2cgbWFuYWdlcgorICogMiA9PiBlbmFibGUgbG9nIG1hbmFnZXIgYW5kIGxvZyBkZWJ1Z2dpbmcKKyAqLworI2lmIGRlZmluZWQoWExPR19OT0xPRykgfHwgZGVmaW5lZChERUJVRykKK2ludCAgIHhsb2dfZGVidWcgPSAxOworeGZzX2J1ZnRhcmdfdCAqeGxvZ190YXJnZXQ7CisjZW5kaWYKKworI2lmIGRlZmluZWQoWEZTX0xPR19UUkFDRSkKKwordm9pZAoreGxvZ190cmFjZV9sb2dncmFudCh4bG9nX3QgKmxvZywgeGxvZ190aWNrZXRfdCAqdGljLCB4ZnNfY2FkZHJfdCBzdHJpbmcpCit7CisJaWYgKCEgbG9nLT5sX2dyYW50X3RyYWNlKSB7CisJCWxvZy0+bF9ncmFudF90cmFjZSA9IGt0cmFjZV9hbGxvYygxMDI0LCBLTV9OT1NMRUVQKTsKKwkJaWYgKCEgbG9nLT5sX2dyYW50X3RyYWNlKQorCQkJcmV0dXJuOworCX0KKworCWt0cmFjZV9lbnRlcihsb2ctPmxfZ3JhbnRfdHJhY2UsCisJCSAgICAgKHZvaWQgKil0aWMsCisJCSAgICAgKHZvaWQgKilsb2ctPmxfcmVzZXJ2ZV9oZWFkcSwKKwkJICAgICAodm9pZCAqKWxvZy0+bF93cml0ZV9oZWFkcSwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZylsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9jeWNsZSksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpbG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMpLAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWxvZy0+bF9ncmFudF93cml0ZV9jeWNsZSksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpbG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzKSwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZylsb2ctPmxfY3Vycl9jeWNsZSksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpbG9nLT5sX2N1cnJfYmxvY2spLAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKUNZQ0xFX0xTTihsb2ctPmxfdGFpbF9sc24pKSwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZylCTE9DS19MU04obG9nLT5sX3RhaWxfbHNuKSksCisJCSAgICAgKHZvaWQgKilzdHJpbmcsCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpMTMpLAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKTE0KSwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykxNSksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpMTYpKTsKK30KKwordm9pZAoreGxvZ190cmFjZV9pY2xvZyh4bG9nX2luX2NvcmVfdCAqaWNsb2csIHVpbnQgc3RhdGUpCit7CisJcGlkX3QgcGlkOworCisJcGlkID0gY3VycmVudF9waWQoKTsKKworCWlmICghaWNsb2ctPmljX3RyYWNlKQorCQlpY2xvZy0+aWNfdHJhY2UgPSBrdHJhY2VfYWxsb2MoMjU2LCBLTV9TTEVFUCk7CisJa3RyYWNlX2VudGVyKGljbG9nLT5pY190cmFjZSwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZylzdGF0ZSksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpcGlkKSwKKwkJICAgICAodm9pZCAqKTAsCisJCSAgICAgKHZvaWQgKikwLAorCQkgICAgICh2b2lkICopMCwKKwkJICAgICAodm9pZCAqKTAsCisJCSAgICAgKHZvaWQgKikwLAorCQkgICAgICh2b2lkICopMCwKKwkJICAgICAodm9pZCAqKTAsCisJCSAgICAgKHZvaWQgKikwLAorCQkgICAgICh2b2lkICopMCwKKwkJICAgICAodm9pZCAqKTAsCisJCSAgICAgKHZvaWQgKikwLAorCQkgICAgICh2b2lkICopMCwKKwkJICAgICAodm9pZCAqKTAsCisJCSAgICAgKHZvaWQgKikwKTsKK30KKworI2Vsc2UKKyNkZWZpbmUJeGxvZ190cmFjZV9sb2dncmFudChsb2csdGljLHN0cmluZykKKyNkZWZpbmUJeGxvZ190cmFjZV9pY2xvZyhpY2xvZyxzdGF0ZSkKKyNlbmRpZiAvKiBYRlNfTE9HX1RSQUNFICovCisKKy8qCisgKiBOT1RFUzoKKyAqCisgKgkxLiBjdXJyYmxvY2sgZmllbGQgZ2V0cyB1cGRhdGVkIGF0IHN0YXJ0dXAgYW5kIGFmdGVyIGluLWNvcmUgbG9ncworICoJCW1hcmtlZCBhcyB3aXRoIFdBTlRfU1lOQy4KKyAqLworCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIGEgdXNlciBvZiBhIGxvZyBtYW5hZ2VyIHRpY2tldCBpcyBkb25lIHdpdGgKKyAqIHRoZSByZXNlcnZhdGlvbi4gIElmIHRoZSB0aWNrZXQgd2FzIGV2ZXIgdXNlZCwgdGhlbiBhIGNvbW1pdCByZWNvcmQgZm9yCisgKiB0aGUgYXNzb2NpYXRlZCB0cmFuc2FjdGlvbiBpcyB3cml0dGVuIG91dCBhcyBhIGxvZyBvcGVyYXRpb24gaGVhZGVyIHdpdGgKKyAqIG5vIGRhdGEuICBUaGUgZmxhZyBYTE9HX1RJQ19JTklURUQgaXMgc2V0IHdoZW4gdGhlIGZpcnN0IHdyaXRlIG9jY3VycyB3aXRoCisgKiBhIGdpdmVuIHRpY2tldC4gIElmIHRoZSB0aWNrZXQgd2FzIG9uZSB3aXRoIGEgcGVybWFuZW50IHJlc2VydmF0aW9uLCB0aGVuCisgKiBhIGZldyBvcGVyYXRpb25zIGFyZSBkb25lIGRpZmZlcmVudGx5LiAgUGVybWFuZW50IHJlc2VydmF0aW9uIHRpY2tldHMgYnkKKyAqIGRlZmF1bHQgZG9uJ3QgcmVsZWFzZSB0aGUgcmVzZXJ2YXRpb24uICBUaGV5IGp1c3QgY29tbWl0IHRoZSBjdXJyZW50CisgKiB0cmFuc2FjdGlvbiB3aXRoIHRoZSBiZWxpZWYgdGhhdCB0aGUgcmVzZXJ2YXRpb24gaXMgc3RpbGwgbmVlZGVkLiAgQSBmbGFnCisgKiBtdXN0IGJlIHBhc3NlZCBpbiBiZWZvcmUgcGVybWFuZW50IHJlc2VydmF0aW9ucyBhcmUgYWN0dWFsbHkgcmVsZWFzZWQuCisgKiBXaGVuIHRoZXNlIHR5cGUgb2YgdGlja2V0cyBhcmUgbm90IHJlbGVhc2VkLCB0aGV5IG5lZWQgdG8gYmUgc2V0IGludG8KKyAqIHRoZSBpbml0ZWQgc3RhdGUgYWdhaW4uICBCeSBkb2luZyB0aGlzLCBhIHN0YXJ0IHJlY29yZCB3aWxsIGJlIHdyaXR0ZW4KKyAqIG91dCB3aGVuIHRoZSBuZXh0IHdyaXRlIG9jY3Vycy4KKyAqLworeGZzX2xzbl90Cit4ZnNfbG9nX2RvbmUoeGZzX21vdW50X3QJKm1wLAorCSAgICAgeGZzX2xvZ190aWNrZXRfdAl4dGljLAorCSAgICAgdm9pZAkJKippY2xvZywKKwkgICAgIHVpbnQJCWZsYWdzKQoreworCXhsb2dfdAkJKmxvZyAgICA9IG1wLT5tX2xvZzsKKwl4bG9nX3RpY2tldF90CSp0aWNrZXQgPSAoeGZzX2xvZ190aWNrZXRfdCkgeHRpYzsKKwl4ZnNfbHNuX3QJbHNuCT0gMDsKKworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoWExPR19OT0xPRykKKwlpZiAoIXhsb2dfZGVidWcgJiYgeGxvZ190YXJnZXQgPT0gbG9nLT5sX3RhcmcpCisJCXJldHVybiAwOworI2VuZGlmCisKKwlpZiAoWExPR19GT1JDRURfU0hVVERPV04obG9nKSB8fAorCSAgICAvKgorCSAgICAgKiBJZiBub3RoaW5nIHdhcyBldmVyIHdyaXR0ZW4sIGRvbid0IHdyaXRlIG91dCBjb21taXQgcmVjb3JkLgorCSAgICAgKiBJZiB3ZSBnZXQgYW4gZXJyb3IsIGp1c3QgY29udGludWUgYW5kIGdpdmUgYmFjayB0aGUgbG9nIHRpY2tldC4KKwkgICAgICovCisJICAgICgoKHRpY2tldC0+dF9mbGFncyAmIFhMT0dfVElDX0lOSVRFRCkgPT0gMCkgJiYKKwkgICAgICh4bG9nX2NvbW1pdF9yZWNvcmQobXAsIHRpY2tldCwKKwkJCQkgKHhsb2dfaW5fY29yZV90ICoqKWljbG9nLCAmbHNuKSkpKSB7CisJCWxzbiA9ICh4ZnNfbHNuX3QpIC0xOworCQlpZiAodGlja2V0LT50X2ZsYWdzICYgWExPR19USUNfUEVSTV9SRVNFUlYpIHsKKwkJCWZsYWdzIHw9IFhGU19MT0dfUkVMX1BFUk1fUkVTRVJWOworCQl9CisJfQorCisKKwlpZiAoKHRpY2tldC0+dF9mbGFncyAmIFhMT0dfVElDX1BFUk1fUkVTRVJWKSA9PSAwIHx8CisJICAgIChmbGFncyAmIFhGU19MT0dfUkVMX1BFUk1fUkVTRVJWKSkgeworCQkvKgorCQkgKiBSZWxlYXNlIHRpY2tldCBpZiBub3QgcGVybWFuZW50IHJlc2VydmF0aW9uIG9yIGEgc3BlY2lmYworCQkgKiByZXF1ZXN0IGhhcyBiZWVuIG1hZGUgdG8gcmVsZWFzZSBhIHBlcm1hbmVudCByZXNlcnZhdGlvbi4KKwkJICovCisJCXhsb2dfdW5ncmFudF9sb2dfc3BhY2UobG9nLCB0aWNrZXQpOworCQl4bG9nX3N0YXRlX3B1dF90aWNrZXQobG9nLCB0aWNrZXQpOworCX0gZWxzZSB7CisJCXhsb2dfcmVncmFudF9yZXNlcnZlX2xvZ19zcGFjZShsb2csIHRpY2tldCk7CisJfQorCisJLyogSWYgdGhpcyB0aWNrZXQgd2FzIGEgcGVybWFuZW50IHJlc2VydmF0aW9uIGFuZCB3ZSBhcmVuJ3QKKwkgKiB0cnlpbmcgdG8gcmVsZWFzZSBpdCwgcmVzZXQgdGhlIGluaXRlZCBmbGFnczsgc28gbmV4dCB0aW1lCisJICogd2Ugd3JpdGUsIGEgc3RhcnQgcmVjb3JkIHdpbGwgYmUgd3JpdHRlbiBvdXQuCisJICovCisJaWYgKCh0aWNrZXQtPnRfZmxhZ3MgJiBYTE9HX1RJQ19QRVJNX1JFU0VSVikgJiYKKwkgICAgKGZsYWdzICYgWEZTX0xPR19SRUxfUEVSTV9SRVNFUlYpID09IDApCisJCXRpY2tldC0+dF9mbGFncyB8PSBYTE9HX1RJQ19JTklURUQ7CisKKwlyZXR1cm4gbHNuOworfQkvKiB4ZnNfbG9nX2RvbmUgKi8KKworCisvKgorICogRm9yY2UgdGhlIGluLWNvcmUgbG9nIHRvIGRpc2suICBJZiBmbGFncyA9PSBYRlNfTE9HX1NZTkMsCisgKgl0aGUgZm9yY2UgaXMgZG9uZSBzeW5jaHJvbm91c2x5LgorICoKKyAqIEFzeW5jaHJvbm91cyBmb3JjZXMgYXJlIGltcGxlbWVudGVkIGJ5IHNldHRpbmcgdGhlIFdBTlRfU1lOQworICogYml0IGluIHRoZSBhcHByb3ByaWF0ZSBpbi1jb3JlIGxvZyBhbmQgdGhlbiByZXR1cm5pbmcuCisgKgorICogU3luY2hyb25vdXMgZm9yY2VzIGFyZSBpbXBsZW1lbnRlZCB3aXRoIGEgc2VtYXBob3JlLiAgQWxsIGNhbGxlcnMKKyAqIHRvIGZvcmNlIGEgZ2l2ZW4gbHNuIHRvIGRpc2sgd2lsbCB3YWl0IG9uIGEgc2VtYXBob3JlIGF0dGFjaGVkIHRvIHRoZQorICogc3BlY2lmaWMgaW4tY29yZSBsb2cuICBXaGVuIGdpdmVuIGluLWNvcmUgbG9nIGZpbmFsbHkgY29tcGxldGVzIGl0cworICogd3JpdGUgdG8gZGlzaywgdGhhdCB0aHJlYWQgd2lsbCB3YWtlIHVwIGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhlCisgKiBzZW1hcGhvcmUuCisgKi8KK2ludAoreGZzX2xvZ19mb3JjZSh4ZnNfbW91bnRfdCAqbXAsCisJICAgICAgeGZzX2xzbl90CSAgbHNuLAorCSAgICAgIHVpbnQJICBmbGFncykKK3sKKwlpbnQJcnZhbDsKKwl4bG9nX3QgKmxvZyA9IG1wLT5tX2xvZzsKKworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoWExPR19OT0xPRykKKwlpZiAoIXhsb2dfZGVidWcgJiYgeGxvZ190YXJnZXQgPT0gbG9nLT5sX3RhcmcpCisJCXJldHVybiAwOworI2VuZGlmCisKKwlBU1NFUlQoZmxhZ3MgJiBYRlNfTE9HX0ZPUkNFKTsKKworCVhGU19TVEFUU19JTkMoeHNfbG9nX2ZvcmNlKTsKKworCWlmICgobG9nLT5sX2ZsYWdzICYgWExPR19JT19FUlJPUikgPT0gMCkgeworCQlpZiAobHNuID09IDApCisJCQlydmFsID0geGxvZ19zdGF0ZV9zeW5jX2FsbChsb2csIGZsYWdzKTsKKwkJZWxzZQorCQkJcnZhbCA9IHhsb2dfc3RhdGVfc3luYyhsb2csIGxzbiwgZmxhZ3MpOworCX0gZWxzZSB7CisJCXJ2YWwgPSBYRlNfRVJST1IoRUlPKTsKKwl9CisKKwlyZXR1cm4gcnZhbDsKKworfQkvKiB4ZnNfbG9nX2ZvcmNlICovCisKKy8qCisgKiBBdHRhY2hlcyBhIG5ldyBpY2xvZyBJL08gY29tcGxldGlvbiBjYWxsYmFjayByb3V0aW5lIGR1cmluZworICogdHJhbnNhY3Rpb24gY29tbWl0LiAgSWYgdGhlIGxvZyBpcyBpbiBlcnJvciBzdGF0ZSwgYSBub24temVybworICogcmV0dXJuIGNvZGUgaXMgaGFuZGVkIGJhY2sgYW5kIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCisgKiBleGVjdXRpbmcgdGhlIGNhbGxiYWNrIGF0IGFuIGFwcHJvcHJpYXRlIHRpbWUuCisgKi8KK2ludAoreGZzX2xvZ19ub3RpZnkoeGZzX21vdW50X3QJICAqbXAsCQkvKiBtb3VudCBvZiBwYXJ0aXRpb24gKi8KKwkgICAgICAgdm9pZAkJICAqaWNsb2dfaG5kbCwJLyogaWNsb2cgdG8gaGFuZyBjYWxsYmFjayBvZmYgKi8KKwkgICAgICAgeGZzX2xvZ19jYWxsYmFja190ICpjYikKK3sKKwl4bG9nX3QgKmxvZyA9IG1wLT5tX2xvZzsKKwl4bG9nX2luX2NvcmVfdAkgICppY2xvZyA9ICh4bG9nX2luX2NvcmVfdCAqKWljbG9nX2huZGw7CisJaW50CWFib3J0ZmxnLCBzcGw7CisKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKFhMT0dfTk9MT0cpCisJaWYgKCF4bG9nX2RlYnVnICYmIHhsb2dfdGFyZ2V0ID09IGxvZy0+bF90YXJnKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCWNiLT5jYl9uZXh0ID0gTlVMTDsKKwlzcGwgPSBMT0dfTE9DSyhsb2cpOworCWFib3J0ZmxnID0gKGljbG9nLT5pY19zdGF0ZSAmIFhMT0dfU1RBVEVfSU9FUlJPUik7CisJaWYgKCFhYm9ydGZsZykgeworCQlBU1NFUlRfQUxXQVlTKChpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9BQ1RJVkUpIHx8CisJCQkgICAgICAoaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfV0FOVF9TWU5DKSk7CisJCWNiLT5jYl9uZXh0ID0gTlVMTDsKKwkJKihpY2xvZy0+aWNfY2FsbGJhY2tfdGFpbCkgPSBjYjsKKwkJaWNsb2ctPmljX2NhbGxiYWNrX3RhaWwgPSAmKGNiLT5jYl9uZXh0KTsKKwl9CisJTE9HX1VOTE9DSyhsb2csIHNwbCk7CisJcmV0dXJuIGFib3J0ZmxnOworfQkvKiB4ZnNfbG9nX25vdGlmeSAqLworCitpbnQKK3hmc19sb2dfcmVsZWFzZV9pY2xvZyh4ZnNfbW91bnRfdCAqbXAsCisJCSAgICAgIHZvaWQJICAqaWNsb2dfaG5kbCkKK3sKKwl4bG9nX3QgKmxvZyA9IG1wLT5tX2xvZzsKKwl4bG9nX2luX2NvcmVfdAkgICppY2xvZyA9ICh4bG9nX2luX2NvcmVfdCAqKWljbG9nX2huZGw7CisKKwlpZiAoeGxvZ19zdGF0ZV9yZWxlYXNlX2ljbG9nKGxvZywgaWNsb2cpKSB7CisJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgWEZTX0xPR19JT19FUlJPUik7CisJCXJldHVybihFSU8pOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogIDEuIFJlc2VydmUgYW4gYW1vdW50IG9mIG9uLWRpc2sgbG9nIHNwYWNlIGFuZCByZXR1cm4gYSB0aWNrZXQgY29ycmVzcG9uZGluZworICoJdG8gdGhlIHJlc2VydmF0aW9uLgorICogIDIuIFBvdGVudGlhbGx5LCBwdXNoIGJ1ZmZlcnMgYXQgdGFpbCBvZiBsb2cgdG8gZGlzay4KKyAqCisgKiBFYWNoIHJlc2VydmF0aW9uIGlzIGdvaW5nIHRvIHJlc2VydmUgZXh0cmEgc3BhY2UgZm9yIGEgbG9nIHJlY29yZCBoZWFkZXIuCisgKiBXaGVuIHdyaXRlcyBoYXBwZW4gdG8gdGhlIG9uLWRpc2sgbG9nLCB3ZSBkb24ndCBzdWJ0cmFjdCB0aGUgbGVuZ3RoIG9mIHRoZQorICogbG9nIHJlY29yZCBoZWFkZXIgZnJvbSBhbnkgcmVzZXJ2YXRpb24uICBCeSB3YXN0aW5nIHNwYWNlIGluIGVhY2gKKyAqIHJlc2VydmF0aW9uLCB3ZSBwcmV2ZW50IG92ZXIgYWxsb2NhdGlvbiBwcm9ibGVtcy4KKyAqLworaW50Cit4ZnNfbG9nX3Jlc2VydmUoeGZzX21vdW50X3QJICptcCwKKwkJaW50CQkgdW5pdF9ieXRlcywKKwkJaW50CQkgY250LAorCQl4ZnNfbG9nX3RpY2tldF90ICp0aWNrZXQsCisJCV9fdWludDhfdAkgY2xpZW50LAorCQl1aW50CQkgZmxhZ3MpCit7CisJeGxvZ190CQkqbG9nID0gbXAtPm1fbG9nOworCXhsb2dfdGlja2V0X3QJKmludGVybmFsX3RpY2tldDsKKwlpbnQJCXJldHZhbDsKKworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoWExPR19OT0xPRykKKwlpZiAoIXhsb2dfZGVidWcgJiYgeGxvZ190YXJnZXQgPT0gbG9nLT5sX3RhcmcpCisJCXJldHVybiAwOworI2VuZGlmCisJcmV0dmFsID0gMDsKKwlBU1NFUlQoY2xpZW50ID09IFhGU19UUkFOU0FDVElPTiB8fCBjbGllbnQgPT0gWEZTX0xPRyk7CisJQVNTRVJUKChmbGFncyAmIFhGU19MT0dfTk9TTEVFUCkgPT0gMCk7CisKKwlpZiAoWExPR19GT1JDRURfU0hVVERPV04obG9nKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCisJWEZTX1NUQVRTX0lOQyh4c190cnlfbG9nc3BhY2UpOworCisJaWYgKCp0aWNrZXQgIT0gTlVMTCkgeworCQlBU1NFUlQoZmxhZ3MgJiBYRlNfTE9HX1BFUk1fUkVTRVJWKTsKKwkJaW50ZXJuYWxfdGlja2V0ID0gKHhsb2dfdGlja2V0X3QgKikqdGlja2V0OworCQl4bG9nX2dyYW50X3B1c2hfYWlsKG1wLCBpbnRlcm5hbF90aWNrZXQtPnRfdW5pdF9yZXMpOworCQlyZXR2YWwgPSB4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlKGxvZywgaW50ZXJuYWxfdGlja2V0KTsKKwl9IGVsc2UgeworCQkvKiBtYXkgc2xlZXAgaWYgbmVlZCB0byBhbGxvY2F0ZSBtb3JlIHRpY2tldHMgKi8KKwkJaW50ZXJuYWxfdGlja2V0ID0geGxvZ190aWNrZXRfZ2V0KGxvZywgdW5pdF9ieXRlcywgY250LAorCQkJCQkJICBjbGllbnQsIGZsYWdzKTsKKwkJKnRpY2tldCA9IGludGVybmFsX3RpY2tldDsKKwkJeGxvZ19ncmFudF9wdXNoX2FpbChtcCwKKwkJCQkgICAgKGludGVybmFsX3RpY2tldC0+dF91bml0X3JlcyAqCisJCQkJICAgICBpbnRlcm5hbF90aWNrZXQtPnRfY250KSk7CisJCXJldHZhbCA9IHhsb2dfZ3JhbnRfbG9nX3NwYWNlKGxvZywgaW50ZXJuYWxfdGlja2V0KTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQkvKiB4ZnNfbG9nX3Jlc2VydmUgKi8KKworCisvKgorICogTW91bnQgYSBsb2cgZmlsZXN5c3RlbQorICoKKyAqIG1wCQktIHViaXF1aXRvdXMgeGZzIG1vdW50IHBvaW50IHN0cnVjdHVyZQorICogbG9nX3RhcmdldAktIGJ1ZnRhcmcgb2Ygb24tZGlzayBsb2cgZGV2aWNlCisgKiBibGtfb2Zmc2V0CS0gU3RhcnQgYmxvY2sgIyB3aGVyZSBibG9jayBzaXplIGlzIDUxMiBieXRlcyAoQkJTSVpFKQorICogbnVtX2JibG9ja3MJLSBOdW1iZXIgb2YgQkJTSVpFIGJsb2NrcyBpbiBvbi1kaXNrIGxvZworICoKKyAqIFJldHVybiBlcnJvciBvciB6ZXJvLgorICovCitpbnQKK3hmc19sb2dfbW91bnQoeGZzX21vdW50X3QJKm1wLAorCSAgICAgIHhmc19idWZ0YXJnX3QJKmxvZ190YXJnZXQsCisJICAgICAgeGZzX2RhZGRyX3QJYmxrX29mZnNldCwKKwkgICAgICBpbnQJCW51bV9iYmxrcykKK3sKKwlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT1JFQ09WRVJZKSkKKwkJY21uX2VycihDRV9OT1RFLCAiWEZTIG1vdW50aW5nIGZpbGVzeXN0ZW0gJXMiLCBtcC0+bV9mc25hbWUpOworCWVsc2UgeworCQljbW5fZXJyKENFX05PVEUsCisJCQkiIU1vdW50aW5nIGZpbGVzeXN0ZW0gXCIlc1wiIGluIG5vLXJlY292ZXJ5IG1vZGUuICBGaWxlc3lzdGVtIHdpbGwgYmUgaW5jb25zaXN0ZW50LiIsCisJCQltcC0+bV9mc25hbWUpOworCQlBU1NFUlQoWEZTX01UT1ZGUyhtcCktPnZmc19mbGFnICYgVkZTX1JET05MWSk7CisJfQorCisJbXAtPm1fbG9nID0geGxvZ19hbGxvY19sb2cobXAsIGxvZ190YXJnZXQsIGJsa19vZmZzZXQsIG51bV9iYmxrcyk7CisKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKFhMT0dfTk9MT0cpCisJaWYgKCF4bG9nX2RlYnVnKSB7CisJCWNtbl9lcnIoQ0VfTk9URSwgImxvZyBkZXY6ICVzIiwgWEZTX0JVRlRBUkdfTkFNRShsb2dfdGFyZ2V0KSk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCS8qCisJICogc2tpcCBsb2cgcmVjb3Zlcnkgb24gYSBub3JlY292ZXJ5IG1vdW50LiAgcHJldGVuZCBpdCBhbGwKKwkgKiBqdXN0IHdvcmtlZC4KKwkgKi8KKwlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT1JFQ09WRVJZKSkgeworCQlpbnQJZXJyb3I7CisJCXZmc190CSp2ZnNwID0gWEZTX01UT1ZGUyhtcCk7CisJCWludAlyZWFkb25seSA9ICh2ZnNwLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpOworCisJCWlmIChyZWFkb25seSkKKwkJCXZmc3AtPnZmc19mbGFnICY9IH5WRlNfUkRPTkxZOworCisJCWVycm9yID0geGxvZ19yZWNvdmVyKG1wLT5tX2xvZywgcmVhZG9ubHkpOworCisJCWlmIChyZWFkb25seSkKKwkJCXZmc3AtPnZmc19mbGFnIHw9IFZGU19SRE9OTFk7CisJCWlmIChlcnJvcikgeworCQkJY21uX2VycihDRV9XQVJOLCAiWEZTOiBsb2cgbW91bnQvcmVjb3ZlcnkgZmFpbGVkOiBlcnJvciAlZCIsIGVycm9yKTsKKwkJCXhsb2dfdW5hbGxvY19sb2cobXAtPm1fbG9nKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCX0KKworCS8qIE5vcm1hbCB0cmFuc2FjdGlvbnMgY2FuIG5vdyBvY2N1ciAqLworCW1wLT5tX2xvZy0+bF9mbGFncyAmPSB+WExPR19BQ1RJVkVfUkVDT1ZFUlk7CisKKwkvKiBFbmQgbW91bnRpbmcgbWVzc2FnZSBpbiB4ZnNfbG9nX21vdW50X2ZpbmlzaCAqLworCXJldHVybiAwOworfQkvKiB4ZnNfbG9nX21vdW50ICovCisKKy8qCisgKiBGaW5pc2ggdGhlIHJlY292ZXJ5IG9mIHRoZSBmaWxlIHN5c3RlbS4gIFRoaXMgaXMgc2VwYXJhdGUgZnJvbQorICogdGhlIHhmc19sb2dfbW91bnQoKSBjYWxsLCBiZWNhdXNlIGl0IGRlcGVuZHMgb24gdGhlIGNvZGUgaW4KKyAqIHhmc19tb3VudGZzKCkgdG8gcmVhZCBpbiB0aGUgcm9vdCBhbmQgcmVhbC10aW1lIGJpdG1hcCBpbm9kZXMKKyAqIGJldHdlZW4gY2FsbGluZyB4ZnNfbG9nX21vdW50KCkgYW5kIGhlcmUuCisgKgorICogbXAJCS0gdWJpcXVpdG91cyB4ZnMgbW91bnQgcG9pbnQgc3RydWN0dXJlCisgKi8KK2ludAoreGZzX2xvZ19tb3VudF9maW5pc2goeGZzX21vdW50X3QgKm1wLCBpbnQgbWZzaV9mbGFncykKK3sKKwlpbnQJZXJyb3I7CisKKwlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT1JFQ09WRVJZKSkKKwkJZXJyb3IgPSB4bG9nX3JlY292ZXJfZmluaXNoKG1wLT5tX2xvZywgbWZzaV9mbGFncyk7CisJZWxzZSB7CisJCWVycm9yID0gMDsKKwkJQVNTRVJUKFhGU19NVE9WRlMobXApLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFVubW91bnQgcHJvY2Vzc2luZyBmb3IgdGhlIGxvZy4KKyAqLworaW50Cit4ZnNfbG9nX3VubW91bnQoeGZzX21vdW50X3QgKm1wKQoreworCWludAkJZXJyb3I7CisKKwllcnJvciA9IHhmc19sb2dfdW5tb3VudF93cml0ZShtcCk7CisJeGZzX2xvZ191bm1vdW50X2RlYWxsb2MobXApOworCXJldHVybiAoZXJyb3IpOworfQorCisvKgorICogRmluYWwgbG9nIHdyaXRlcyBhcyBwYXJ0IG9mIHVubW91bnQuCisgKgorICogTWFyayB0aGUgZmlsZXN5c3RlbSBjbGVhbiBhcyB1bm1vdW50IGhhcHBlbnMuICBOb3RlIHRoYXQgZHVyaW5nIHJlbG9jYXRpb24KKyAqIHRoaXMgcm91dGluZSBuZWVkcyB0byBiZSBleGVjdXRlZCBhcyBwYXJ0IG9mIHNvdXJjZS1iYWcgd2hpbGUgdGhlCisgKiBkZWFsbG9jYXRpb24gbXVzdCBub3QgYmUgZG9uZSB1bnRpbCBzb3VyY2UtZW5kLgorICovCisKKy8qCisgKiBVbm1vdW50IHJlY29yZCB1c2VkIHRvIGhhdmUgYSBzdHJpbmcgIlVubW91bnQgZmlsZXN5c3RlbS0tIiBpbiB0aGUKKyAqIGRhdGEgc2VjdGlvbiB3aGVyZSB0aGUgIlVuIiB3YXMgcmVhbGx5IGEgbWFnaWMgbnVtYmVyIChYTE9HX1VOTU9VTlRfVFlQRSkuCisgKiBXZSBqdXN0IHdyaXRlIHRoZSBtYWdpYyBudW1iZXIgbm93IHNpbmNlIHRoYXQgcGFydGljdWxhciBmaWVsZCBpc24ndAorICogY3VycmVudGx5IGFyY2hpdGVjdHVyZSBjb252ZXJ0ZWQgYW5kICJuVW1vdW50IiBpcyBhIGJpdCBmb28uCisgKiBBcyBmYXIgYXMgSSBrbm93LCB0aGVyZSB3ZXJlbid0IGFueSBkZXBlbmRlbmNpZXMgb24gdGhlIG9sZCBiZWhhdmlvdXIuCisgKi8KKworaW50Cit4ZnNfbG9nX3VubW91bnRfd3JpdGUoeGZzX21vdW50X3QgKm1wKQoreworCXhsb2dfdAkJICpsb2cgPSBtcC0+bV9sb2c7CisJeGxvZ19pbl9jb3JlX3QJICppY2xvZzsKKyNpZmRlZiBERUJVRworCXhsb2dfaW5fY29yZV90CSAqZmlyc3RfaWNsb2c7CisjZW5kaWYKKwl4ZnNfbG9nX2lvdmVjX3QgIHJlZ1sxXTsKKwl4ZnNfbG9nX3RpY2tldF90IHRpYyA9IE5VTEw7CisJeGZzX2xzbl90CSBsc247CisJaW50CQkgZXJyb3I7CisJU1BMREVDTChzKTsKKworCS8qIHRoZSBkYXRhIHNlY3Rpb24gbXVzdCBiZSAzMiBiaXQgc2l6ZSBhbGlnbmVkICovCisJc3RydWN0IHsKKwkgICAgX191aW50MTZfdCBtYWdpYzsKKwkgICAgX191aW50MTZfdCBwYWQxOworCSAgICBfX3VpbnQzMl90IHBhZDI7IC8qIG1heSBhcyB3ZWxsIG1ha2UgaXQgNjQgYml0cyAqLworCX0gbWFnaWMgPSB7IFhMT0dfVU5NT1VOVF9UWVBFLCAwLCAwIH07CisKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKFhMT0dfTk9MT0cpCisJaWYgKCF4bG9nX2RlYnVnICYmIHhsb2dfdGFyZ2V0ID09IGxvZy0+bF90YXJnKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCisJLyoKKwkgKiBEb24ndCB3cml0ZSBvdXQgdW5tb3VudCByZWNvcmQgb24gcmVhZC1vbmx5IG1vdW50cy4KKwkgKiBPciwgaWYgd2UgYXJlIGRvaW5nIGEgZm9yY2VkIHVtb3VudCAodHlwaWNhbGx5IGJlY2F1c2Ugb2YgSU8gZXJyb3JzKS4KKwkgKi8KKwlpZiAoWEZTX01UT1ZGUyhtcCktPnZmc19mbGFnICYgVkZTX1JET05MWSkKKwkJcmV0dXJuIDA7CisKKwl4ZnNfbG9nX2ZvcmNlKG1wLCAwLCBYRlNfTE9HX0ZPUkNFfFhGU19MT0dfU1lOQyk7CisKKyNpZmRlZiBERUJVRworCWZpcnN0X2ljbG9nID0gaWNsb2cgPSBsb2ctPmxfaWNsb2c7CisJZG8geworCQlpZiAoIShpY2xvZy0+aWNfc3RhdGUgJiBYTE9HX1NUQVRFX0lPRVJST1IpKSB7CisJCQlBU1NFUlQoaWNsb2ctPmljX3N0YXRlICYgWExPR19TVEFURV9BQ1RJVkUpOworCQkJQVNTRVJUKGljbG9nLT5pY19vZmZzZXQgPT0gMCk7CisJCX0KKwkJaWNsb2cgPSBpY2xvZy0+aWNfbmV4dDsKKwl9IHdoaWxlIChpY2xvZyAhPSBmaXJzdF9pY2xvZyk7CisjZW5kaWYKKwlpZiAoISAoWExPR19GT1JDRURfU0hVVERPV04obG9nKSkpIHsKKwkJcmVnWzBdLmlfYWRkciA9ICh2b2lkKikmbWFnaWM7CisJCXJlZ1swXS5pX2xlbiAgPSBzaXplb2YobWFnaWMpOworCisJCWVycm9yID0geGZzX2xvZ19yZXNlcnZlKG1wLCA2MDAsIDEsICZ0aWMsIFhGU19MT0csIDApOworCQlpZiAoIWVycm9yKSB7CisJCQkvKiByZW1vdmUgaW5pdGVkIGZsYWcgKi8KKwkJCSgoeGxvZ190aWNrZXRfdCAqKXRpYyktPnRfZmxhZ3MgPSAwOworCQkJZXJyb3IgPSB4bG9nX3dyaXRlKG1wLCByZWcsIDEsIHRpYywgJmxzbiwKKwkJCQkJICAgTlVMTCwgWExPR19VTk1PVU5UX1RSQU5TKTsKKwkJCS8qCisJCQkgKiBBdCB0aGlzIHBvaW50LCB3ZSdyZSB1bW91bnRpbmcgYW55d2F5LAorCQkJICogc28gdGhlcmUncyBubyBwb2ludCBpbiB0cmFuc2l0aW9uaW5nIGxvZyBzdGF0ZQorCQkJICogdG8gSU9FUlJPUi4gSnVzdCBjb250aW51ZS4uLgorCQkJICovCisJCX0KKworCQlpZiAoZXJyb3IpIHsKKwkJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwKKwkJCQkieGZzX2xvZ191bm1vdW50OiB1bm1vdW50IHJlY29yZCBmYWlsZWQiKTsKKwkJfQorCisKKwkJcyA9IExPR19MT0NLKGxvZyk7CisJCWljbG9nID0gbG9nLT5sX2ljbG9nOworCQlpY2xvZy0+aWNfcmVmY250Kys7CisJCUxPR19VTkxPQ0sobG9nLCBzKTsKKwkJeGxvZ19zdGF0ZV93YW50X3N5bmMobG9nLCBpY2xvZyk7CisJCSh2b2lkKSB4bG9nX3N0YXRlX3JlbGVhc2VfaWNsb2cobG9nLCBpY2xvZyk7CisKKwkJcyA9IExPR19MT0NLKGxvZyk7CisJCWlmICghKGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX0FDVElWRSB8fAorCQkgICAgICBpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9ESVJUWSkpIHsKKwkJCWlmICghWExPR19GT1JDRURfU0hVVERPV04obG9nKSkgeworCQkJCXN2X3dhaXQoJmljbG9nLT5pY19mb3JjZXNlbWEsIFBNRU0sCisJCQkJCSZsb2ctPmxfaWNsb2dsb2NrLCBzKTsKKwkJCX0gZWxzZSB7CisJCQkJTE9HX1VOTE9DSyhsb2csIHMpOworCQkJfQorCQl9IGVsc2UgeworCQkJTE9HX1VOTE9DSyhsb2csIHMpOworCQl9CisJCWlmICh0aWMpCisJCQl4bG9nX3N0YXRlX3B1dF90aWNrZXQobG9nLCB0aWMpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFdlJ3JlIGFscmVhZHkgaW4gZm9yY2VkX3NodXRkb3duIG1vZGUsIGNvdWxkbid0CisJCSAqIGV2ZW4gYXR0ZW1wdCB0byB3cml0ZSBvdXQgdGhlIHVubW91bnQgdHJhbnNhY3Rpb24uCisJCSAqCisJCSAqIEdvIHRocm91Z2ggdGhlIG1vdGlvbnMgb2Ygc3luYydpbmcgYW5kIHJlbGVhc2luZworCQkgKiB0aGUgaWNsb2csIGV2ZW4gdGhvdWdoIG5vIEkvTyB3aWxsIGFjdHVhbGx5IGhhcHBlbiwKKwkJICogd2UgbmVlZCB0byB3YWl0IGZvciBvdGhlciBsb2cgSS9PJ3MgdGhhdCBtYXkgYWxyZWFkeQorCQkgKiBiZSBpbiBwcm9ncmVzcy4gIERvIHRoaXMgYXMgYSBzZXBhcmF0ZSBzZWN0aW9uIG9mCisJCSAqIGNvZGUgc28gd2UnbGwga25vdyBpZiB3ZSBldmVyIGdldCBzdHVjayBoZXJlIHRoYXQKKwkJICogd2UncmUgaW4gdGhpcyBvZGQgc2l0dWF0aW9uIG9mIHRyeWluZyB0byB1bm1vdW50CisJCSAqIGEgZmlsZSBzeXN0ZW0gdGhhdCB3ZW50IGludG8gZm9yY2VkX3NodXRkb3duIGFzCisJCSAqIHRoZSByZXN1bHQgb2YgYW4gdW5tb3VudC4uCisJCSAqLworCQlzID0gTE9HX0xPQ0sobG9nKTsKKwkJaWNsb2cgPSBsb2ctPmxfaWNsb2c7CisJCWljbG9nLT5pY19yZWZjbnQrKzsKKwkJTE9HX1VOTE9DSyhsb2csIHMpOworCisJCXhsb2dfc3RhdGVfd2FudF9zeW5jKGxvZywgaWNsb2cpOworCQkodm9pZCkgeGxvZ19zdGF0ZV9yZWxlYXNlX2ljbG9nKGxvZywgaWNsb2cpOworCisJCXMgPSBMT0dfTE9DSyhsb2cpOworCisJCWlmICggISAoICAgaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfQUNUSVZFCisJCQl8fCBpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9ESVJUWQorCQkJfHwgaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfSU9FUlJPUikgKSB7CisKKwkJCQlzdl93YWl0KCZpY2xvZy0+aWNfZm9yY2VzZW1hLCBQTUVNLAorCQkJCQkmbG9nLT5sX2ljbG9nbG9jaywgcyk7CisJCX0gZWxzZSB7CisJCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30JLyogeGZzX2xvZ191bm1vdW50X3dyaXRlICovCisKKy8qCisgKiBEZWFsbG9jYXRlIGxvZyBzdHJ1Y3R1cmVzIGZvciB1bm1vdW50L3JlbG9jYXRpb24uCisgKi8KK3ZvaWQKK3hmc19sb2dfdW5tb3VudF9kZWFsbG9jKHhmc19tb3VudF90ICptcCkKK3sKKwl4bG9nX3VuYWxsb2NfbG9nKG1wLT5tX2xvZyk7Cit9CisKKy8qCisgKiBXcml0ZSByZWdpb24gdmVjdG9ycyB0byBsb2cuICBUaGUgd3JpdGUgaGFwcGVucyB1c2luZyB0aGUgc3BhY2UgcmVzZXJ2YXRpb24KKyAqIG9mIHRoZSB0aWNrZXQgKHRpYykuICBJdCBpcyBub3QgYSByZXF1aXJlbWVudCB0aGF0IGFsbCB3cml0ZXMgZm9yIGEgZ2l2ZW4KKyAqIHRyYW5zYWN0aW9uIG9jY3VyIHdpdGggb25lIGNhbGwgdG8geGZzX2xvZ193cml0ZSgpLgorICovCitpbnQKK3hmc19sb2dfd3JpdGUoeGZzX21vdW50X3QgKgltcCwKKwkgICAgICB4ZnNfbG9nX2lvdmVjX3QJcmVnW10sCisJICAgICAgaW50CQluZW50cmllcywKKwkgICAgICB4ZnNfbG9nX3RpY2tldF90CXRpYywKKwkgICAgICB4ZnNfbHNuX3QJCSpzdGFydF9sc24pCit7CisJaW50CWVycm9yOworCXhsb2dfdCAqbG9nID0gbXAtPm1fbG9nOworCisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChYTE9HX05PTE9HKQorCWlmICgheGxvZ19kZWJ1ZyAmJiB4bG9nX3RhcmdldCA9PSBsb2ctPmxfdGFyZykgeworCQkqc3RhcnRfbHNuID0gMDsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpCisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKworCWlmICgoZXJyb3IgPSB4bG9nX3dyaXRlKG1wLCByZWcsIG5lbnRyaWVzLCB0aWMsIHN0YXJ0X2xzbiwgTlVMTCwgMCkpKSB7CisJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgWEZTX0xPR19JT19FUlJPUik7CisJfQorCXJldHVybiAoZXJyb3IpOworfQkvKiB4ZnNfbG9nX3dyaXRlICovCisKKwordm9pZAoreGZzX2xvZ19tb3ZlX3RhaWwoeGZzX21vdW50X3QJKm1wLAorCQkgIHhmc19sc25fdAl0YWlsX2xzbikKK3sKKwl4bG9nX3RpY2tldF90CSp0aWM7CisJeGxvZ190CQkqbG9nID0gbXAtPm1fbG9nOworCWludAkJbmVlZF9ieXRlcywgZnJlZV9ieXRlcywgY3ljbGUsIGJ5dGVzOworCVNQTERFQ0wocyk7CisKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKFhMT0dfTk9MT0cpCisJaWYgKCF4bG9nX2RlYnVnICYmIHhsb2dfdGFyZ2V0ID09IGxvZy0+bF90YXJnKQorCQlyZXR1cm47CisjZW5kaWYKKwkvKiBYWFhzdXAgdG1wICovCisJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpCisJCXJldHVybjsKKwlBU1NFUlQoIVhGU19GT1JDRURfU0hVVERPV04obXApKTsKKworCWlmICh0YWlsX2xzbiA9PSAwKSB7CisJCS8qIG5lZWRlZCBzaW5jZSBzeW5jX2xzbiBpcyA2NCBiaXRzICovCisJCXMgPSBMT0dfTE9DSyhsb2cpOworCQl0YWlsX2xzbiA9IGxvZy0+bF9sYXN0X3N5bmNfbHNuOworCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJfQorCisJcyA9IEdSQU5UX0xPQ0sobG9nKTsKKworCS8qIEFsc28gYW4gaW52YWxpZCBsc24uICAxIGltcGxpZXMgdGhhdCB3ZSBhcmVuJ3QgcGFzc2luZyBpbiBhIHZhbGlkCisJICogdGFpbF9sc24uCisJICovCisJaWYgKHRhaWxfbHNuICE9IDEpIHsKKwkJbG9nLT5sX3RhaWxfbHNuID0gdGFpbF9sc247CisJfQorCisJaWYgKCh0aWMgPSBsb2ctPmxfd3JpdGVfaGVhZHEpKSB7CisjaWZkZWYgREVCVUcKKwkJaWYgKGxvZy0+bF9mbGFncyAmIFhMT0dfQUNUSVZFX1JFQ09WRVJZKQorCQkJcGFuaWMoIlJlY292ZXJ5IHByb2JsZW0iKTsKKyNlbmRpZgorCQljeWNsZSA9IGxvZy0+bF9ncmFudF93cml0ZV9jeWNsZTsKKwkJYnl0ZXMgPSBsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXM7CisJCWZyZWVfYnl0ZXMgPSB4bG9nX3NwYWNlX2xlZnQobG9nLCBjeWNsZSwgYnl0ZXMpOworCQlkbyB7CisJCQlBU1NFUlQodGljLT50X2ZsYWdzICYgWExPR19USUNfUEVSTV9SRVNFUlYpOworCisJCQlpZiAoZnJlZV9ieXRlcyA8IHRpYy0+dF91bml0X3JlcyAmJiB0YWlsX2xzbiAhPSAxKQorCQkJCWJyZWFrOworCQkJdGFpbF9sc24gPSAwOworCQkJZnJlZV9ieXRlcyAtPSB0aWMtPnRfdW5pdF9yZXM7CisJCQlzdl9zaWduYWwoJnRpYy0+dF9zZW1hKTsKKwkJCXRpYyA9IHRpYy0+dF9uZXh0OworCQl9IHdoaWxlICh0aWMgIT0gbG9nLT5sX3dyaXRlX2hlYWRxKTsKKwl9CisJaWYgKCh0aWMgPSBsb2ctPmxfcmVzZXJ2ZV9oZWFkcSkpIHsKKyNpZmRlZiBERUJVRworCQlpZiAobG9nLT5sX2ZsYWdzICYgWExPR19BQ1RJVkVfUkVDT1ZFUlkpCisJCQlwYW5pYygiUmVjb3ZlcnkgcHJvYmxlbSIpOworI2VuZGlmCisJCWN5Y2xlID0gbG9nLT5sX2dyYW50X3Jlc2VydmVfY3ljbGU7CisJCWJ5dGVzID0gbG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXM7CisJCWZyZWVfYnl0ZXMgPSB4bG9nX3NwYWNlX2xlZnQobG9nLCBjeWNsZSwgYnl0ZXMpOworCQlkbyB7CisJCQlpZiAodGljLT50X2ZsYWdzICYgWExPR19USUNfUEVSTV9SRVNFUlYpCisJCQkJbmVlZF9ieXRlcyA9IHRpYy0+dF91bml0X3Jlcyp0aWMtPnRfY250OworCQkJZWxzZQorCQkJCW5lZWRfYnl0ZXMgPSB0aWMtPnRfdW5pdF9yZXM7CisJCQlpZiAoZnJlZV9ieXRlcyA8IG5lZWRfYnl0ZXMgJiYgdGFpbF9sc24gIT0gMSkKKwkJCQlicmVhazsKKwkJCXRhaWxfbHNuID0gMDsKKwkJCWZyZWVfYnl0ZXMgLT0gbmVlZF9ieXRlczsKKwkJCXN2X3NpZ25hbCgmdGljLT50X3NlbWEpOworCQkJdGljID0gdGljLT50X25leHQ7CisJCX0gd2hpbGUgKHRpYyAhPSBsb2ctPmxfcmVzZXJ2ZV9oZWFkcSk7CisJfQorCUdSQU5UX1VOTE9DSyhsb2csIHMpOworfQkvKiB4ZnNfbG9nX21vdmVfdGFpbCAqLworCisvKgorICogRGV0ZXJtaW5lIGlmIHdlIGhhdmUgYSB0cmFuc2FjdGlvbiB0aGF0IGhhcyBnb25lIHRvIGRpc2sKKyAqIHRoYXQgbmVlZHMgdG8gYmUgY292ZXJlZC4gTG9nIGFjdGl2aXR5IG5lZWRzIHRvIGJlIGlkbGUgKG5vIEFJTCBhbmQKKyAqIG5vdGhpbmcgaW4gdGhlIGljbG9ncykuIEFuZCwgd2UgbmVlZCB0byBiZSBpbiB0aGUgcmlnaHQgc3RhdGUgaW5kaWNhdGluZworICogc29tZXRoaW5nIGhhcyBnb25lIG91dC4KKyAqLworaW50Cit4ZnNfbG9nX25lZWRfY292ZXJlZCh4ZnNfbW91bnRfdCAqbXApCit7CisJU1BMREVDTChzKTsKKwlpbnQJCW5lZWRlZCA9IDAsIGdlbjsKKwl4bG9nX3QJCSpsb2cgPSBtcC0+bV9sb2c7CisJdmZzX3QJCSp2ZnNwID0gWEZTX01UT1ZGUyhtcCk7CisKKwlpZiAoZnNfZnJvemVuKHZmc3ApIHx8IFhGU19GT1JDRURfU0hVVERPV04obXApIHx8CisJICAgICh2ZnNwLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpKQorCQlyZXR1cm4gMDsKKworCXMgPSBMT0dfTE9DSyhsb2cpOworCWlmICgoKGxvZy0+bF9jb3ZlcmVkX3N0YXRlID09IFhMT0dfU1RBVEVfQ09WRVJfTkVFRCkgfHwKKwkJKGxvZy0+bF9jb3ZlcmVkX3N0YXRlID09IFhMT0dfU1RBVEVfQ09WRVJfTkVFRDIpKQorCQkJJiYgIXhmc190cmFuc19maXJzdF9haWwobXAsICZnZW4pCisJCQkmJiB4bG9nX2ljbG9nc19lbXB0eShsb2cpKSB7CisJCWlmIChsb2ctPmxfY292ZXJlZF9zdGF0ZSA9PSBYTE9HX1NUQVRFX0NPVkVSX05FRUQpCisJCQlsb2ctPmxfY292ZXJlZF9zdGF0ZSA9IFhMT0dfU1RBVEVfQ09WRVJfRE9ORTsKKwkJZWxzZSB7CisJCQlBU1NFUlQobG9nLT5sX2NvdmVyZWRfc3RhdGUgPT0gWExPR19TVEFURV9DT1ZFUl9ORUVEMik7CisJCQlsb2ctPmxfY292ZXJlZF9zdGF0ZSA9IFhMT0dfU1RBVEVfQ09WRVJfRE9ORTI7CisJCX0KKwkJbmVlZGVkID0gMTsKKwl9CisJTE9HX1VOTE9DSyhsb2csIHMpOworCXJldHVybihuZWVkZWQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJbG9jYWwgcm91dGluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogeGZzX3RyYW5zX3RhaWxfYWlsIHJldHVybnMgMCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgaW4gdGhlIGxpc3QuCisgKiBUaGUgbG9nIG1hbmFnZXIgbXVzdCBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IExSIHdoaWNoIHdhcyBjb21taXR0ZWQKKyAqIHRvIGRpc2suICBUaGUgbHNuIG9mIHRoaXMgTFIgd2lsbCBiZWNvbWUgdGhlIG5ldyB0YWlsX2xzbiB3aGVuZXZlcgorICogeGZzX3RyYW5zX3RhaWxfYWlsIHJldHVybnMgMC4gIElmIHdlIGRvbid0IGRvIHRoaXMsIHdlIHJ1biBpbnRvCisgKiB0aGUgc2l0dWF0aW9uIHdoZXJlIHN0dWZmIGNvdWxkIGJlIHdyaXR0ZW4gaW50byB0aGUgbG9nIGJ1dCBub3RoaW5nCisgKiB3YXMgZXZlciBpbiB0aGUgQUlMIHdoZW4gYXNrZWQuICBFdmVudHVhbGx5LCB3ZSBwYW5pYyBzaW5jZSB0aGUKKyAqIHRhaWwgaGl0cyB0aGUgaGVhZC4KKyAqCisgKiBXZSBtYXkgYmUgaG9sZGluZyB0aGUgbG9nIGljbG9nIGxvY2sgdXBvbiBlbnRlcmluZyB0aGlzIHJvdXRpbmUuCisgKi8KK3hmc19sc25fdAoreGxvZ19hc3NpZ25fdGFpbF9sc24oeGZzX21vdW50X3QgKm1wKQoreworCXhmc19sc25fdCB0YWlsX2xzbjsKKwlTUExERUNMKHMpOworCXhsb2dfdAkgICpsb2cgPSBtcC0+bV9sb2c7CisKKwl0YWlsX2xzbiA9IHhmc190cmFuc190YWlsX2FpbChtcCk7CisJcyA9IEdSQU5UX0xPQ0sobG9nKTsKKwlpZiAodGFpbF9sc24gIT0gMCkgeworCQlsb2ctPmxfdGFpbF9sc24gPSB0YWlsX2xzbjsKKwl9IGVsc2UgeworCQl0YWlsX2xzbiA9IGxvZy0+bF90YWlsX2xzbiA9IGxvZy0+bF9sYXN0X3N5bmNfbHNuOworCX0KKwlHUkFOVF9VTkxPQ0sobG9nLCBzKTsKKworCXJldHVybiB0YWlsX2xzbjsKK30JLyogeGxvZ19hc3NpZ25fdGFpbF9sc24gKi8KKworCisvKgorICogUmV0dXJuIHRoZSBzcGFjZSBpbiB0aGUgbG9nIGJldHdlZW4gdGhlIHRhaWwgYW5kIHRoZSBoZWFkLiAgVGhlIGhlYWQKKyAqIGlzIHBhc3NlZCBpbiB0aGUgY3ljbGUvYnl0ZXMgZm9ybWFsIHBhcm1zLiAgSW4gdGhlIHNwZWNpYWwgY2FzZSB3aGVyZQorICogdGhlIHJlc2VydmUgaGVhZCBoYXMgd3JhcHBlZCBwYXNzZWQgdGhlIHRhaWwsIHRoaXMgY2FsY3VsYXRpb24gaXMgbm8KKyAqIGxvbmdlciB2YWxpZC4gIEluIHRoaXMgY2FzZSwganVzdCByZXR1cm4gMCB3aGljaCBtZWFucyB0aGVyZSBpcyBubyBzcGFjZQorICogaW4gdGhlIGxvZy4gIFRoaXMgd29ya3MgZm9yIGFsbCBwbGFjZXMgd2hlcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqIHdpdGggdGhlIHJlc2VydmUgaGVhZC4gIE9mIGNvdXJzZSwgaWYgdGhlIHdyaXRlIGhlYWQgd2VyZSB0byBldmVyCisgKiB3cmFwIHRoZSB0YWlsLCB3ZSBzaG91bGQgYmxvdyB1cC4gIFJhdGhlciB0aGFuIGNhdGNoIHRoaXMgY2FzZSBoZXJlLAorICogd2UgZGVwZW5kIG9uIG90aGVyIEFTU0VSVGlvbnMgaW4gb3RoZXIgcGFydHMgb2YgdGhlIGNvZGUuICAgWFhYbWlrZW4KKyAqCisgKiBUaGlzIGNvZGUgYWxzbyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIHRoZSByZXNlcnZhdGlvbiBoZWFkIGlzIGJlaGluZAorICogdGhlIHRhaWwuICBUaGUgZGV0YWlscyBvZiB0aGlzIGNhc2UgYXJlIGRlc2NyaWJlZCBiZWxvdywgYnV0IHRoZSBlbmQKKyAqIHJlc3VsdCBpcyB0aGF0IHdlIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbG9nIGFzIHRoZSBhbW91bnQgb2Ygc3BhY2UgbGVmdC4KKyAqLworaW50Cit4bG9nX3NwYWNlX2xlZnQoeGxvZ190ICpsb2csIGludCBjeWNsZSwgaW50IGJ5dGVzKQoreworCWludCBmcmVlX2J5dGVzOworCWludCB0YWlsX2J5dGVzOworCWludCB0YWlsX2N5Y2xlOworCisJdGFpbF9ieXRlcyA9IEJCVE9CKEJMT0NLX0xTTihsb2ctPmxfdGFpbF9sc24pKTsKKwl0YWlsX2N5Y2xlID0gQ1lDTEVfTFNOKGxvZy0+bF90YWlsX2xzbik7CisJaWYgKCh0YWlsX2N5Y2xlID09IGN5Y2xlKSAmJiAoYnl0ZXMgPj0gdGFpbF9ieXRlcykpIHsKKwkJZnJlZV9ieXRlcyA9IGxvZy0+bF9sb2dzaXplIC0gKGJ5dGVzIC0gdGFpbF9ieXRlcyk7CisJfSBlbHNlIGlmICgodGFpbF9jeWNsZSArIDEpIDwgY3ljbGUpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmICh0YWlsX2N5Y2xlIDwgY3ljbGUpIHsKKwkJQVNTRVJUKHRhaWxfY3ljbGUgPT0gKGN5Y2xlIC0gMSkpOworCQlmcmVlX2J5dGVzID0gdGFpbF9ieXRlcyAtIGJ5dGVzOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoZSByZXNlcnZhdGlvbiBoZWFkIGlzIGJlaGluZCB0aGUgdGFpbC4KKwkJICogSW4gdGhpcyBjYXNlIHdlIGp1c3Qgd2FudCB0byByZXR1cm4gdGhlIHNpemUgb2YgdGhlCisJCSAqIGxvZyBhcyB0aGUgYW1vdW50IG9mIHNwYWNlIGxlZnQuCisJCSAqLworCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbG9nLT5sX21wLAorCQkJInhsb2dfc3BhY2VfbGVmdDogaGVhZCBiZWhpbmQgdGFpbFxuIgorCQkJIiAgdGFpbF9jeWNsZSA9ICVkLCB0YWlsX2J5dGVzID0gJWRcbiIKKwkJCSIgIEdIICAgY3ljbGUgPSAlZCwgR0ggICBieXRlcyA9ICVkIiwKKwkJCXRhaWxfY3ljbGUsIHRhaWxfYnl0ZXMsIGN5Y2xlLCBieXRlcyk7CisJCUFTU0VSVCgwKTsKKwkJZnJlZV9ieXRlcyA9IGxvZy0+bF9sb2dzaXplOworCX0KKwlyZXR1cm4gZnJlZV9ieXRlczsKK30JLyogeGxvZ19zcGFjZV9sZWZ0ICovCisKKworLyoKKyAqIExvZyBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhbiBpbyBjb21wbGV0ZXMuCisgKgorICogVGhlIGxvZyBtYW5hZ2VyIG5lZWRzIGl0cyBvd24gcm91dGluZSwgaW4gb3JkZXIgdG8gY29udHJvbCB3aGF0CisgKiBoYXBwZW5zIHdpdGggdGhlIGJ1ZmZlciBhZnRlciB0aGUgd3JpdGUgY29tcGxldGVzLgorICovCit2b2lkCit4bG9nX2lvZG9uZSh4ZnNfYnVmX3QgKmJwKQoreworCXhsb2dfaW5fY29yZV90CSppY2xvZzsKKwl4bG9nX3QJCSpsOworCWludAkJYWJvcnRlZDsKKworCWljbG9nID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhsb2dfaW5fY29yZV90ICopOworCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHVuc2lnbmVkIGxvbmcpID09ICh1bnNpZ25lZCBsb25nKSAyKTsKKwlYRlNfQlVGX1NFVF9GU1BSSVZBVEUyKGJwLCAodW5zaWduZWQgbG9uZykxKTsKKwlhYm9ydGVkID0gMDsKKworCS8qCisJICogU29tZSB2ZXJzaW9ucyBvZiBjcHAgYmFyZiBvbiB0aGUgcmVjdXJzaXZlIGRlZmluaXRpb24gb2YKKwkgKiBpY19sb2cgLT4gaGljX2ZpZWxkcy5pY19sb2cgYW5kIGV4cGFuZCBpY19sb2cgdHdpY2Ugd2hlbgorCSAqIGl0IGlzIHBhc3NlZCB0aHJvdWdoIHR3byBtYWNyb3MuICBXb3JrYXJvdW5kIGJyb2tlbiBjcHAuCisJICovCisJbCA9IGljbG9nLT5pY19sb2c7CisKKwkvKgorCSAqIFJhY2UgdG8gc2h1dGRvd24gdGhlIGZpbGVzeXN0ZW0gaWYgd2Ugc2VlIGFuIGVycm9yLgorCSAqLworCWlmIChYRlNfVEVTVF9FUlJPUigoWEZTX0JVRl9HRVRFUlJPUihicCkpLCBsLT5sX21wLAorCQkJWEZTX0VSUlRBR19JT0RPTkVfSU9FUlIsIFhGU19SQU5ET01fSU9ET05FX0lPRVJSKSkgeworCQl4ZnNfaW9lcnJvcl9hbGVydCgieGxvZ19pb2RvbmUiLCBsLT5sX21wLCBicCwgWEZTX0JVRl9BRERSKGJwKSk7CisJCVhGU19CVUZfU1RBTEUoYnApOworCQl4ZnNfZm9yY2Vfc2h1dGRvd24obC0+bF9tcCwgWEZTX0xPR19JT19FUlJPUik7CisJCS8qCisJCSAqIFRoaXMgZmxhZyB3aWxsIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIHRyYW5zLWNvbW1pdHRlZAorCQkgKiBjYWxsYmFjayByb3V0aW5lcyB0byBsZXQgdGhlbSBrbm93IHRoYXQgdGhlIGxvZy1jb21taXQKKwkJICogZGlkbid0IHN1Y2NlZWQuCisJCSAqLworCQlhYm9ydGVkID0gWEZTX0xJX0FCT1JURUQ7CisJfSBlbHNlIGlmIChpY2xvZy0+aWNfc3RhdGUgJiBYTE9HX1NUQVRFX0lPRVJST1IpIHsKKwkJYWJvcnRlZCA9IFhGU19MSV9BQk9SVEVEOworCX0KKwl4bG9nX3N0YXRlX2RvbmVfc3luY2luZyhpY2xvZywgYWJvcnRlZCk7CisJaWYgKCEoWEZTX0JVRl9JU0FTWU5DKGJwKSkpIHsKKwkJLyoKKwkJICogQ29ycmVzcG9uZGluZyBwc2VtYSgpIHdpbGwgYmUgZG9uZSBpbiBid3JpdGUoKS4gIElmIHdlIGRvbid0CisJCSAqIHZzZW1hKCkgaGVyZSwgcGFuaWMuCisJCSAqLworCQlYRlNfQlVGX1ZfSU9ET05FU0VNQShicCk7CisJfQorfQkvKiB4bG9nX2lvZG9uZSAqLworCisvKgorICogVGhlIGJkc3RyYXQgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGxvZyBidWZzLiBUaGlzIGdpdmVzIHVzIGEgY2VudHJhbAorICogcGxhY2UgdG8gdHJhcCBidWZzIGluIGNhc2Ugd2UgZ2V0IGhpdCBieSBhIGxvZyBJL08gZXJyb3IgYW5kIG5lZWQgdG8KKyAqIHNodXRkb3duLiBBY3R1YWxseSwgaW4gcHJhY3RpY2UsIGV2ZW4gd2hlbiB3ZSBkaWRuJ3QgZ2V0IGEgbG9nIGVycm9yLAorICogd2UgdHJhbnNpdGlvbiB0aGUgaWNsb2dzIHRvIElPRVJST1Igc3RhdGUgKmFmdGVyKiBmbHVzaGluZyBhbGwgZXhpc3RpbmcKKyAqIGljbG9ncyB0byBkaXNrLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBhbnltb3JlIG5ldyB0cmFuc2FjdGlvbnMgdG8gYmUKKyAqIHN0YXJ0ZWQgb3IgY29tcGxldGVkIGFmdGVyd2FyZHMuCisgKi8KK1NUQVRJQyBpbnQKK3hsb2dfYmRzdHJhdF9jYihzdHJ1Y3QgeGZzX2J1ZiAqYnApCit7CisJeGxvZ19pbl9jb3JlX3QgKmljbG9nOworCisJaWNsb2cgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGxvZ19pbl9jb3JlX3QgKik7CisKKwlpZiAoKGljbG9nLT5pY19zdGF0ZSAmIFhMT0dfU1RBVEVfSU9FUlJPUikgPT0gMCkgeworCSAgLyogbm90ZSBmb3IgaXJpeCBic3RyYXQgd2lsbCBuZWVkICBzdHJ1Y3QgYmRldnN3IHBhc3NlZAorCSAgICogRml4IHRoZSBmb2xsb3dpbmcgbWFjcm8gaWYgdGhlIGNvZGUgZXZlciBpcyBtZXJnZWQKKwkgICAqLworCSAgICBYRlNfYmRzdHJhdChicCk7CisJCXJldHVybiAwOworCX0KKworCXhmc19idWZ0cmFjZSgiWExPR19fQkRTVFJBVCBJT0VSUk9SIiwgYnApOworCVhGU19CVUZfRVJST1IoYnAsIEVJTyk7CisJWEZTX0JVRl9TVEFMRShicCk7CisJeGZzX2Jpb2RvbmUoYnApOworCXJldHVybiAoWEZTX0VSUk9SKEVJTykpOworCisKK30KKworLyoKKyAqIFJldHVybiBzaXplIG9mIGVhY2ggaW4tY29yZSBsb2cgcmVjb3JkIGJ1ZmZlci4KKyAqCisgKiBMb3cgbWVtb3J5IG1hY2hpbmVzIG9ubHkgZ2V0IDIgMTZLQiBidWZmZXJzLiAgV2UgZG9uJ3Qgd2FudCB0byB3YXN0ZQorICogbWVtb3J5IGhlcmUuICBIb3dldmVyLCBhbGwgb3RoZXIgbWFjaGluZXMgZ2V0IGF0IGxlYXN0IDIgMzJLQiBidWZmZXJzLgorICogVGhlIG51bWJlciBpcyBoYXJkIGNvZGVkIGJlY2F1c2Ugd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgbWluaW11bQorICogbWVtb3J5IHNpemUsIGp1c3QgMzJNQiBzeXN0ZW1zLgorICoKKyAqIElmIHRoZSBmaWxlc3lzdGVtIGJsb2Nrc2l6ZSBpcyB0b28gbGFyZ2UsIHdlIG1heSBuZWVkIHRvIGNob29zZSBhCisgKiBsYXJnZXIgc2l6ZSBzaW5jZSB0aGUgZGlyZWN0b3J5IGNvZGUgY3VycmVudGx5IGxvZ3MgZW50aXJlIGJsb2Nrcy4KKyAqLworCitTVEFUSUMgdm9pZAoreGxvZ19nZXRfaWNsb2dfYnVmZmVyX3NpemUoeGZzX21vdW50X3QJKm1wLAorCQkJICAgeGxvZ190CSpsb2cpCit7CisJaW50IHNpemU7CisJaW50IHhoZHJzOworCisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChYTE9HX05PTE9HKQorCS8qCisJICogV2hlbiBsb2didWZzID09IDAsIHNvbWVvbmUgaGFzIGRpc2FibGVkIHRoZSBsb2cgZnJvbSB0aGUgRlNUQUIKKwkgKiBmaWxlLiAgVGhpcyBpcyBub3QgYSBkb2N1bWVudGVkIGZlYXR1cmUuICBXZSBuZWVkIHRvIHNldCB4bG9nX2RlYnVnCisJICogdG8gemVybyAodGhpcyBkZWFjdGl2YXRlcyB0aGUgbG9nKSBhbmQgc2V0IHhsb2dfdGFyZ2V0IHRvIHRoZQorCSAqIGFwcHJvcHJpYXRlIGRldmljZS4gIE9ubHkgb25lIGZpbGVzeXN0ZW0gbWF5IGJlIGFmZmVjdGVkIGFzIHN1Y2gKKwkgKiBzaW5jZSB0aGlzIGlzIGp1c3QgYSBwZXJmb3JtYW5jZSBoYWNrIHRvIHRlc3Qgd2hhdCB3ZSBtaWdodCBiZSBhYmxlCisJICogdG8gZ2V0IGlmIHRoZSBsb2cgd2VyZSBub3QgcHJlc2VudC4KKwkgKi8KKwlpZiAobXAtPm1fbG9nYnVmcyA9PSAwKSB7CisJCXhsb2dfZGVidWcgPSAwOworCQl4bG9nX3RhcmdldCA9IGxvZy0+bF90YXJnOworCQlsb2ctPmxfaWNsb2dfYnVmcyA9IFhMT0dfTUlOX0lDTE9HUzsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJLyoKKwkJICogVGhpcyBpcyB0aGUgbm9ybWFsIHBhdGguICBJZiBtX2xvZ2J1ZnMgPT0gLTEsIHRoZW4gdGhlCisJCSAqIGFkbWluIGhhcyBjaG9zZW4gdG8gdXNlIHRoZSBzeXN0ZW0gZGVmYXVsdHMgZm9yIGxvZ2J1ZmZlcnMuCisJCSAqLworCQlpZiAobXAtPm1fbG9nYnVmcyA9PSAtMSkgeyAKKwkJCWlmICh4ZnNfcGh5c21lbSA8PSBidG9jKDEyOCoxMDI0KjEwMjQpKSB7IAorCQkJCWxvZy0+bF9pY2xvZ19idWZzID0gWExPR19NSU5fSUNMT0dTOyAKKwkJCX0gZWxzZSBpZiAoeGZzX3BoeXNtZW0gPD0gYnRvYyg0MDAqMTAyNCoxMDI0KSkgeyAKKwkJCQlsb2ctPmxfaWNsb2dfYnVmcyA9IFhMT0dfTUVEX0lDTE9HUzsgCisJCQl9IGVsc2UgeworCQkJCS8qIDI1Nksgd2l0aCAzMksgYnVmcyAqLworCQkJCWxvZy0+bF9pY2xvZ19idWZzID0gWExPR19NQVhfSUNMT0dTOworCQkJfQorCQl9IGVsc2UKKwkJCWxvZy0+bF9pY2xvZ19idWZzID0gbXAtPm1fbG9nYnVmczsKKworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoWExPR19OT0xPRykKKwkJLyogV2UgYXJlIHJlYWN0aXZhdGluZyBhIGZpbGVzeXN0ZW0gYWZ0ZXIgaXQgd2FzIGluYWN0aXZlICovCisJCWlmIChsb2ctPmxfdGFyZyA9PSB4bG9nX3RhcmdldCkgeworCQkJeGxvZ190YXJnZXQgPSBOVUxMOworCQkJeGxvZ19kZWJ1ZyA9IDE7CisJCX0KKyNlbmRpZgorCX0KKworCS8qCisJICogQnVmZmVyIHNpemUgcGFzc2VkIGluIGZyb20gbW91bnQgc3lzdGVtIGNhbGwuCisJICovCisJaWYgKG1wLT5tX2xvZ2JzaXplICE9IC0xKSB7CisJCXNpemUgPSBsb2ctPmxfaWNsb2dfc2l6ZSA9IG1wLT5tX2xvZ2JzaXplOworCQlsb2ctPmxfaWNsb2dfc2l6ZV9sb2cgPSAwOworCQl3aGlsZSAoc2l6ZSAhPSAxKSB7CisJCQlsb2ctPmxfaWNsb2dfc2l6ZV9sb2crKzsKKwkJCXNpemUgPj49IDE7CisJCX0KKworCQlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJm1wLT5tX3NiKSkgeworCQkJLyogIyBoZWFkZXJzID0gc2l6ZSAvIDMySworCQkJICogb25lIGhlYWRlciBob2xkcyBjeWNsZXMgZnJvbSAzMksgb2YgZGF0YQorCQkJICovCisKKwkJCXhoZHJzID0gbXAtPm1fbG9nYnNpemUgLyBYTE9HX0hFQURFUl9DWUNMRV9TSVpFOworCQkJaWYgKG1wLT5tX2xvZ2JzaXplICUgWExPR19IRUFERVJfQ1lDTEVfU0laRSkKKwkJCQl4aGRycysrOworCQkJbG9nLT5sX2ljbG9nX2hzaXplID0geGhkcnMgPDwgQkJTSElGVDsKKwkJCWxvZy0+bF9pY2xvZ19oZWFkcyA9IHhoZHJzOworCQl9IGVsc2UgeworCQkJQVNTRVJUKG1wLT5tX2xvZ2JzaXplIDw9IFhMT0dfQklHX1JFQ09SRF9CU0laRSk7CisJCQlsb2ctPmxfaWNsb2dfaHNpemUgPSBCQlNJWkU7CisJCQlsb2ctPmxfaWNsb2dfaGVhZHMgPSAxOworCQl9CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFNwZWNpYWwgY2FzZSBtYWNoaW5lcyB0aGF0IGhhdmUgbGVzcyB0aGFuIDMyTUIgb2YgbWVtb3J5LgorCSAqIEFsbCBtYWNoaW5lcyB3aXRoIG1vcmUgbWVtb3J5IHVzZSAzMktCIGJ1ZmZlcnMuCisJICovCisJaWYgKHhmc19waHlzbWVtIDw9IGJ0b2MoMzIqMTAyNCoxMDI0KSkgeworCQkvKiBEb24ndCBjaGFuZ2U7IG1pbiBjb25maWd1cmF0aW9uICovCisJCWxvZy0+bF9pY2xvZ19zaXplID0gWExPR19SRUNPUkRfQlNJWkU7CQkvKiAxNmsgKi8KKwkJbG9nLT5sX2ljbG9nX3NpemVfbG9nID0gWExPR19SRUNPUkRfQlNISUZUOworCX0gZWxzZSB7CisJCWxvZy0+bF9pY2xvZ19zaXplID0gWExPR19CSUdfUkVDT1JEX0JTSVpFOwkvKiAzMmsgKi8KKwkJbG9nLT5sX2ljbG9nX3NpemVfbG9nID0gWExPR19CSUdfUkVDT1JEX0JTSElGVDsKKwl9CisKKwkvKiB0aGUgZGVmYXVsdCBsb2cgc2l6ZSBpcyAxNmsgb3IgMzJrIHdoaWNoIGlzIG9uZSBoZWFkZXIgc2VjdG9yICovCisJbG9nLT5sX2ljbG9nX2hzaXplID0gQkJTSVpFOworCWxvZy0+bF9pY2xvZ19oZWFkcyA9IDE7CisKKwkvKgorCSAqIEZvciAxNktCLCB3ZSB1c2UgMyAzMktCIGJ1ZmZlcnMuICBGb3IgMzJLQiBibG9jayBzaXplcywgd2UgdXNlCisJICogNCAzMktCIGJ1ZmZlcnMuICBGb3IgNjRLQiBibG9jayBzaXplcywgd2UgdXNlIDggMzJLQiBidWZmZXJzLgorCSAqLworCWlmIChtcC0+bV9zYi5zYl9ibG9ja3NpemUgPj0gMTYqMTAyNCkgeworCQlsb2ctPmxfaWNsb2dfc2l6ZSA9IFhMT0dfQklHX1JFQ09SRF9CU0laRTsKKwkJbG9nLT5sX2ljbG9nX3NpemVfbG9nID0gWExPR19CSUdfUkVDT1JEX0JTSElGVDsKKwkJaWYgKG1wLT5tX2xvZ2J1ZnMgPT0gLTEpIHsKKwkJCXN3aXRjaCAobXAtPm1fc2Iuc2JfYmxvY2tzaXplKSB7CisJCQkgICAgY2FzZSAxNioxMDI0OgkJCS8qIDE2IEtCICovCisJCQkJbG9nLT5sX2ljbG9nX2J1ZnMgPSAzOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgMzIqMTAyNDoJCQkvKiAzMiBLQiAqLworCQkJCWxvZy0+bF9pY2xvZ19idWZzID0gNDsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIDY0KjEwMjQ6CQkJLyogNjQgS0IgKi8KKwkJCQlsb2ctPmxfaWNsb2dfYnVmcyA9IDg7CisJCQkJYnJlYWs7CisJCQkgICAgZGVmYXVsdDoKKwkJCQl4bG9nX3BhbmljKCJYRlM6IEludmFsaWQgYmxvY2tzaXplIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CS8qIHhsb2dfZ2V0X2ljbG9nX2J1ZmZlcl9zaXplICovCisKKworLyoKKyAqIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyBzb21lIG9mIHRoZSBsb2cgc3RydWN0dXJlIGZvciBhIGdpdmVuIG1vdW50IHBvaW50LgorICogSXRzIHByaW1hcnkgcHVycG9zZSBpcyB0byBmaWxsIGluIGVub3VnaCwgc28gcmVjb3ZlcnkgY2FuIG9jY3VyLiAgSG93ZXZlciwKKyAqIHNvbWUgb3RoZXIgc3R1ZmYgbWF5IGJlIGZpbGxlZCBpbiB0b28uCisgKi8KK1NUQVRJQyB4bG9nX3QgKgoreGxvZ19hbGxvY19sb2coeGZzX21vdW50X3QJKm1wLAorCSAgICAgICB4ZnNfYnVmdGFyZ190CSpsb2dfdGFyZ2V0LAorCSAgICAgICB4ZnNfZGFkZHJfdAlibGtfb2Zmc2V0LAorCSAgICAgICBpbnQJCW51bV9iYmxrcykKK3sKKwl4bG9nX3QJCQkqbG9nOworCXhsb2dfcmVjX2hlYWRlcl90CSpoZWFkOworCXhsb2dfaW5fY29yZV90CQkqKmljbG9ncDsKKwl4bG9nX2luX2NvcmVfdAkJKmljbG9nLCAqcHJldl9pY2xvZz1OVUxMOworCXhmc19idWZfdAkJKmJwOworCWludAkJCWk7CisJaW50CQkJaWNsb2dzaXplOworCisJbG9nID0gKHhsb2dfdCAqKWttZW1femFsbG9jKHNpemVvZih4bG9nX3QpLCBLTV9TTEVFUCk7CisKKwlsb2ctPmxfbXAJICAgPSBtcDsKKwlsb2ctPmxfdGFyZwkgICA9IGxvZ190YXJnZXQ7CisJbG9nLT5sX2xvZ3NpemUgICAgID0gQkJUT0IobnVtX2JibGtzKTsKKwlsb2ctPmxfbG9nQkJzdGFydCAgPSBibGtfb2Zmc2V0OworCWxvZy0+bF9sb2dCQnNpemUgICA9IG51bV9iYmxrczsKKwlsb2ctPmxfY292ZXJlZF9zdGF0ZSA9IFhMT0dfU1RBVEVfQ09WRVJfSURMRTsKKwlsb2ctPmxfZmxhZ3MJICAgfD0gWExPR19BQ1RJVkVfUkVDT1ZFUlk7CisKKwlsb2ctPmxfcHJldl9ibG9jayAgPSAtMTsKKwlBU1NJR05fQU5ZX0xTTl9IT1NUKGxvZy0+bF90YWlsX2xzbiwgMSwgMCk7CisJLyogbG9nLT5sX3RhaWxfbHNuID0gMHgxMDAwMDAwMDBMTDsgY3ljbGUgPSAxOyBjdXJyZW50IGJsb2NrID0gMCAqLworCWxvZy0+bF9sYXN0X3N5bmNfbHNuID0gbG9nLT5sX3RhaWxfbHNuOworCWxvZy0+bF9jdXJyX2N5Y2xlICA9IDE7CSAgICAvKiAwIGlzIGJhZCBzaW5jZSB0aGlzIGlzIGluaXRpYWwgdmFsdWUgKi8KKwlsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9jeWNsZSA9IDE7CisJbG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlID0gMTsKKworCWlmIChYRlNfU0JfVkVSU0lPTl9IQVNTRUNUT1IoJm1wLT5tX3NiKSkgeworCQlsb2ctPmxfc2VjdGJiX2xvZyA9IG1wLT5tX3NiLnNiX2xvZ3NlY3Rsb2cgLSBCQlNISUZUOworCQlBU1NFUlQobG9nLT5sX3NlY3RiYl9sb2cgPD0gbXAtPm1fc2VjdGJiX2xvZyk7CisJCS8qIGZvciBsYXJnZXIgc2VjdG9yIHNpemVzLCBtdXN0IGhhdmUgdjIgb3IgZXh0ZXJuYWwgbG9nICovCisJCUFTU0VSVChsb2ctPmxfc2VjdGJiX2xvZyA9PSAwIHx8CisJCQlsb2ctPmxfbG9nQkJzdGFydCA9PSAwIHx8CisJCQlYRlNfU0JfVkVSU0lPTl9IQVNMT0dWMigmbXAtPm1fc2IpKTsKKwkJQVNTRVJUKG1wLT5tX3NiLnNiX2xvZ3NlY3Rsb2cgPj0gQkJTSElGVCk7CisJfQorCWxvZy0+bF9zZWN0YmJfbWFzayA9ICgxIDw8IGxvZy0+bF9zZWN0YmJfbG9nKSAtIDE7CisKKwl4bG9nX2dldF9pY2xvZ19idWZmZXJfc2l6ZShtcCwgbG9nKTsKKworCWJwID0geGZzX2J1Zl9nZXRfZW1wdHkobG9nLT5sX2ljbG9nX3NpemUsIG1wLT5tX2xvZ2Rldl90YXJncCk7CisJWEZTX0JVRl9TRVRfSU9ET05FX0ZVTkMoYnAsIHhsb2dfaW9kb25lKTsKKwlYRlNfQlVGX1NFVF9CRFNUUkFUX0ZVTkMoYnAsIHhsb2dfYmRzdHJhdF9jYik7CisJWEZTX0JVRl9TRVRfRlNQUklWQVRFMihicCwgKHVuc2lnbmVkIGxvbmcpMSk7CisJQVNTRVJUKFhGU19CVUZfSVNCVVNZKGJwKSk7CisJQVNTRVJUKFhGU19CVUZfVkFMVVNFTUEoYnApIDw9IDApOworCWxvZy0+bF94YnVmID0gYnA7CisKKwlzcGlubG9ja19pbml0KCZsb2ctPmxfaWNsb2dsb2NrLCAiaWNsb2ciKTsKKwlzcGlubG9ja19pbml0KCZsb2ctPmxfZ3JhbnRfbG9jaywgImdyaGVhZF9pY2xvZyIpOworCWluaXRuc2VtYSgmbG9nLT5sX2ZsdXNoc2VtYSwgMCwgImljLWZsdXNoIik7CisJeGxvZ19zdGF0ZV90aWNrZXRfYWxsb2MobG9nKTsgIC8qIHdhaXQgdW50aWwgYWZ0ZXIgaWNsb2dsb2NrIGluaXRlZCAqLworCisJLyogbG9nIHJlY29yZCBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgQkJTSVpFOyBzZWUgeGxvZ19yZWNfaGVhZGVyX3QgKi8KKwlBU1NFUlQoKFhGU19CVUZfU0laRShicCkgJiBCQk1BU0spID09IDApOworCisJaWNsb2dwID0gJmxvZy0+bF9pY2xvZzsKKwkvKgorCSAqIFRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIGZvciB0aGUgaWNsb2cgc3RydWN0dXJlIGlzCisJICogcmF0aGVyIGZ1bmt5IGR1ZSB0byB0aGUgd2F5IHRoZSBzdHJ1Y3R1cmUgaXMgZGVmaW5lZC4gIEl0IGlzCisJICogZG9uZSB0aGlzIHdheSBzbyB0aGF0IHdlIGNhbiB1c2UgZGlmZmVyZW50IHNpemVzIGZvciBtYWNoaW5lcworCSAqIHdpdGggZGlmZmVyZW50IGFtb3VudHMgb2YgbWVtb3J5LiAgU2VlIHRoZSBkZWZpbml0aW9uIG9mCisJICogeGxvZ19pbl9jb3JlX3QgaW4geGZzX2xvZ19wcml2LmggZm9yIGRldGFpbHMuCisJICovCisJaWNsb2dzaXplID0gbG9nLT5sX2ljbG9nX3NpemU7CisJQVNTRVJUKGxvZy0+bF9pY2xvZ19zaXplID49IDQwOTYpOworCWZvciAoaT0wOyBpIDwgbG9nLT5sX2ljbG9nX2J1ZnM7IGkrKykgeworCQkqaWNsb2dwID0gKHhsb2dfaW5fY29yZV90ICopCisJCQkgIGttZW1femFsbG9jKHNpemVvZih4bG9nX2luX2NvcmVfdCksIEtNX1NMRUVQKTsKKwkJaWNsb2cgPSAqaWNsb2dwOworCQlpY2xvZy0+aGljX2RhdGEgPSAoeGxvZ19pbl9jb3JlXzJfdCAqKQorCQkJICBrbWVtX3phbGxvYyhpY2xvZ3NpemUsIEtNX1NMRUVQKTsKKworCQlpY2xvZy0+aWNfcHJldiA9IHByZXZfaWNsb2c7CisJCXByZXZfaWNsb2cgPSBpY2xvZzsKKwkJbG9nLT5sX2ljbG9nX2Jha1tpXSA9ICh4ZnNfY2FkZHJfdCkmKGljbG9nLT5pY19oZWFkZXIpOworCisJCWhlYWQgPSAmaWNsb2ctPmljX2hlYWRlcjsKKwkJbWVtc2V0KGhlYWQsIDAsIHNpemVvZih4bG9nX3JlY19oZWFkZXJfdCkpOworCQlJTlRfU0VUKGhlYWQtPmhfbWFnaWNubywgQVJDSF9DT05WRVJULCBYTE9HX0hFQURFUl9NQUdJQ19OVU0pOworCQlJTlRfU0VUKGhlYWQtPmhfdmVyc2lvbiwgQVJDSF9DT05WRVJULAorCQkJWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJmxvZy0+bF9tcC0+bV9zYikgPyAyIDogMSk7CisJCUlOVF9TRVQoaGVhZC0+aF9zaXplLCBBUkNIX0NPTlZFUlQsIGxvZy0+bF9pY2xvZ19zaXplKTsKKwkJLyogbmV3IGZpZWxkcyAqLworCQlJTlRfU0VUKGhlYWQtPmhfZm10LCBBUkNIX0NPTlZFUlQsIFhMT0dfRk1UKTsKKwkJbWVtY3B5KCZoZWFkLT5oX2ZzX3V1aWQsICZtcC0+bV9zYi5zYl91dWlkLCBzaXplb2YodXVpZF90KSk7CisKKwkJYnAgPSB4ZnNfYnVmX2dldF9lbXB0eShsb2ctPmxfaWNsb2dfc2l6ZSwgbXAtPm1fbG9nZGV2X3RhcmdwKTsKKwkJWEZTX0JVRl9TRVRfSU9ET05FX0ZVTkMoYnAsIHhsb2dfaW9kb25lKTsKKwkJWEZTX0JVRl9TRVRfQkRTVFJBVF9GVU5DKGJwLCB4bG9nX2Jkc3RyYXRfY2IpOworCQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUyKGJwLCAodW5zaWduZWQgbG9uZykxKTsKKwkJaWNsb2ctPmljX2JwID0gYnA7CisKKwkJaWNsb2ctPmljX3NpemUgPSBYRlNfQlVGX1NJWkUoYnApIC0gbG9nLT5sX2ljbG9nX2hzaXplOworCQlpY2xvZy0+aWNfc3RhdGUgPSBYTE9HX1NUQVRFX0FDVElWRTsKKwkJaWNsb2ctPmljX2xvZyA9IGxvZzsKKwkJaWNsb2ctPmljX2NhbGxiYWNrX3RhaWwgPSAmKGljbG9nLT5pY19jYWxsYmFjayk7CisJCWljbG9nLT5pY19kYXRhcCA9IChjaGFyICopaWNsb2ctPmhpY19kYXRhICsgbG9nLT5sX2ljbG9nX2hzaXplOworCisJCUFTU0VSVChYRlNfQlVGX0lTQlVTWShpY2xvZy0+aWNfYnApKTsKKwkJQVNTRVJUKFhGU19CVUZfVkFMVVNFTUEoaWNsb2ctPmljX2JwKSA8PSAwKTsKKwkJc3ZfaW5pdCgmaWNsb2ctPmljX2ZvcmNlc2VtYSwgU1ZfREVGQVVMVCwgImljbG9nLWZvcmNlIik7CisJCXN2X2luaXQoJmljbG9nLT5pY193cml0ZXNlbWEsIFNWX0RFRkFVTFQsICJpY2xvZy13cml0ZSIpOworCisJCWljbG9ncCA9ICZpY2xvZy0+aWNfbmV4dDsKKwl9CisJKmljbG9ncCA9IGxvZy0+bF9pY2xvZzsJCQkvKiBjb21wbGV0ZSByaW5nICovCisJbG9nLT5sX2ljbG9nLT5pY19wcmV2ID0gcHJldl9pY2xvZzsJLyogcmUtd3JpdGUgMXN0IHByZXYgcHRyICovCisKKwlyZXR1cm4gbG9nOworfQkvKiB4bG9nX2FsbG9jX2xvZyAqLworCisKKy8qCisgKiBXcml0ZSBvdXQgdGhlIGNvbW1pdCByZWNvcmQgb2YgYSB0cmFuc2FjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuCisgKiB0aWNrZXQuICBSZXR1cm4gdGhlIGxzbiBvZiB0aGUgY29tbWl0IHJlY29yZC4KKyAqLworU1RBVElDIGludAoreGxvZ19jb21taXRfcmVjb3JkKHhmc19tb3VudF90ICAqbXAsCisJCSAgIHhsb2dfdGlja2V0X3QgKnRpY2tldCwKKwkJICAgeGxvZ19pbl9jb3JlX3QgKippY2xvZywKKwkJICAgeGZzX2xzbl90CSpjb21taXRsc25wKQoreworCWludAkJZXJyb3I7CisJeGZzX2xvZ19pb3ZlY190CXJlZ1sxXTsKKworCXJlZ1swXS5pX2FkZHIgPSBOVUxMOworCXJlZ1swXS5pX2xlbiA9IDA7CisKKwlBU1NFUlRfQUxXQVlTKGljbG9nKTsKKwlpZiAoKGVycm9yID0geGxvZ193cml0ZShtcCwgcmVnLCAxLCB0aWNrZXQsIGNvbW1pdGxzbnAsCisJCQkgICAgICAgaWNsb2csIFhMT0dfQ09NTUlUX1RSQU5TKSkpIHsKKwkJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBYRlNfTE9HX0lPX0VSUk9SKTsKKwl9CisJcmV0dXJuIChlcnJvcik7Cit9CS8qIHhsb2dfY29tbWl0X3JlY29yZCAqLworCisKKy8qCisgKiBQdXNoIG9uIHRoZSBidWZmZXIgY2FjaGUgY29kZSBpZiB3ZSBldmVyIHVzZSBtb3JlIHRoYW4gNzUlIG9mIHRoZSBvbi1kaXNrCisgKiBsb2cgc3BhY2UuICBUaGlzIGNvZGUgcHVzaGVzIG9uIHRoZSBsc24gd2hpY2ggd291bGQgc3VwcG9zZWRseSBmcmVlIHVwCisgKiB0aGUgMjUlIHdoaWNoIHdlIHdhbnQgdG8gbGVhdmUgZnJlZS4gIFdlIG1heSBuZWVkIHRvIGFkb3B0IGEgcG9saWN5IHdoaWNoCisgKiBwdXNoZXMgb24gYW4gbHNuIHdoaWNoIGlzIGZ1cnRoZXIgYWxvbmcgaW4gdGhlIGxvZyBvbmNlIHdlIHJlYWNoIHRoZSBoaWdoCisgKiB3YXRlciBtYXJrLiAgSW4gdGhpcyBtYW5uZXIsIHdlIHdvdWxkIGJlIGNyZWF0aW5nIGEgbG93IHdhdGVyIG1hcmsuCisgKi8KK3ZvaWQKK3hsb2dfZ3JhbnRfcHVzaF9haWwoeGZzX21vdW50X3QJKm1wLAorCQkgICAgaW50CQluZWVkX2J5dGVzKQoreworICAgIHhsb2dfdAkqbG9nID0gbXAtPm1fbG9nOwkvKiBwb2ludGVyIHRvIHRoZSBsb2cgKi8KKyAgICB4ZnNfbHNuX3QJdGFpbF9sc247CQkvKiBsc24gb2YgdGhlIGxvZyB0YWlsICovCisgICAgeGZzX2xzbl90CXRocmVzaG9sZF9sc24gPSAwOwkvKiBsc24gd2UnZCBsaWtlIHRvIGJlIGF0ICovCisgICAgaW50CQlmcmVlX2Jsb2NrczsJCS8qIGZyZWUgYmxvY2tzIGxlZnQgdG8gd3JpdGUgdG8gKi8KKyAgICBpbnQJCWZyZWVfYnl0ZXM7CQkvKiBmcmVlIGJ5dGVzIGxlZnQgdG8gd3JpdGUgdG8gKi8KKyAgICBpbnQJCXRocmVzaG9sZF9ibG9jazsJLyogYmxvY2sgaW4gbHNuIHdlJ2QgbGlrZSB0byBiZSBhdCAqLworICAgIGludAkJdGhyZXNob2xkX2N5Y2xlOwkvKiBsc24gY3ljbGUgd2UnZCBsaWtlIHRvIGJlIGF0ICovCisgICAgaW50CQlmcmVlX3RocmVzaG9sZDsKKyAgICBTUExERUNMKHMpOworCisgICAgQVNTRVJUKEJUT0JCKG5lZWRfYnl0ZXMpIDwgbG9nLT5sX2xvZ0JCc2l6ZSk7CisKKyAgICBzID0gR1JBTlRfTE9DSyhsb2cpOworICAgIGZyZWVfYnl0ZXMgPSB4bG9nX3NwYWNlX2xlZnQobG9nLAorCQkJCSBsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9jeWNsZSwKKwkJCQkgbG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMpOworICAgIHRhaWxfbHNuID0gbG9nLT5sX3RhaWxfbHNuOworICAgIGZyZWVfYmxvY2tzID0gQlRPQkJUKGZyZWVfYnl0ZXMpOworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIHRocmVzaG9sZCBmb3IgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGluIHRoZQorICAgICAqIGxvZyB0byB0aGUgbWF4aW11bSBvZiB3aGF0IHRoZSBjYWxsZXIgbmVlZHMsIG9uZSBxdWFydGVyIG9mIHRoZQorICAgICAqIGxvZywgYW5kIDI1NiBibG9ja3MuCisgICAgICovCisgICAgZnJlZV90aHJlc2hvbGQgPSBCVE9CQihuZWVkX2J5dGVzKTsKKyAgICBmcmVlX3RocmVzaG9sZCA9IE1BWChmcmVlX3RocmVzaG9sZCwgKGxvZy0+bF9sb2dCQnNpemUgPj4gMikpOworICAgIGZyZWVfdGhyZXNob2xkID0gTUFYKGZyZWVfdGhyZXNob2xkLCAyNTYpOworICAgIGlmIChmcmVlX2Jsb2NrcyA8IGZyZWVfdGhyZXNob2xkKSB7CisJdGhyZXNob2xkX2Jsb2NrID0gQkxPQ0tfTFNOKHRhaWxfbHNuKSArIGZyZWVfdGhyZXNob2xkOworCXRocmVzaG9sZF9jeWNsZSA9IENZQ0xFX0xTTih0YWlsX2xzbik7CisJaWYgKHRocmVzaG9sZF9ibG9jayA+PSBsb2ctPmxfbG9nQkJzaXplKSB7CisJICAgIHRocmVzaG9sZF9ibG9jayAtPSBsb2ctPmxfbG9nQkJzaXplOworCSAgICB0aHJlc2hvbGRfY3ljbGUgKz0gMTsKKwl9CisJQVNTSUdOX0FOWV9MU05fSE9TVCh0aHJlc2hvbGRfbHNuLCB0aHJlc2hvbGRfY3ljbGUsCisJCSAgICAgICB0aHJlc2hvbGRfYmxvY2spOworCisJLyogRG9uJ3QgcGFzcyBpbiBhbiBsc24gZ3JlYXRlciB0aGFuIHRoZSBsc24gb2YgdGhlIGxhc3QKKwkgKiBsb2cgcmVjb3JkIGtub3duIHRvIGJlIG9uIGRpc2suCisJICovCisJaWYgKFhGU19MU05fQ01QKHRocmVzaG9sZF9sc24sIGxvZy0+bF9sYXN0X3N5bmNfbHNuKSA+IDApCisJICAgIHRocmVzaG9sZF9sc24gPSBsb2ctPmxfbGFzdF9zeW5jX2xzbjsKKyAgICB9CisgICAgR1JBTlRfVU5MT0NLKGxvZywgcyk7CisKKyAgICAvKgorICAgICAqIEdldCB0aGUgdHJhbnNhY3Rpb24gbGF5ZXIgdG8ga2ljayB0aGUgZGlydHkgYnVmZmVycyBvdXQgdG8KKyAgICAgKiBkaXNrIGFzeW5jaHJvbm91c2x5LiBObyBwb2ludCBpbiB0cnlpbmcgdG8gZG8gdGhpcyBpZgorICAgICAqIHRoZSBmaWxlc3lzdGVtIGlzIHNodXR0aW5nIGRvd24uCisgICAgICovCisgICAgaWYgKHRocmVzaG9sZF9sc24gJiYKKwkhWExPR19GT1JDRURfU0hVVERPV04obG9nKSkKKwkgICAgeGZzX3RyYW5zX3B1c2hfYWlsKG1wLCB0aHJlc2hvbGRfbHNuKTsKK30JLyogeGxvZ19ncmFudF9wdXNoX2FpbCAqLworCisKKy8qCisgKiBGbHVzaCBvdXQgdGhlIGluLWNvcmUgbG9nIChpY2xvZykgdG8gdGhlIG9uLWRpc2sgbG9nIGluIGFuIGFzeW5jaHJvbm91cyAKKyAqIGZhc2hpb24uICBQcmV2aW91c2x5LCB3ZSBzaG91bGQgaGF2ZSBtb3ZlZCB0aGUgY3VycmVudCBpY2xvZworICogcHRyIGluIHRoZSBsb2cgdG8gcG9pbnQgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGljbG9nLiAgVGhpcyBhbGxvd3MgZnVydGhlcgorICogd3JpdGUgdG8gY29udGludWUgd2hpbGUgdGhpcyBjb2RlIHN5bmNzIG91dCBhbiBpY2xvZyByZWFkeSB0byBnby4KKyAqIEJlZm9yZSBhbiBpbi1jb3JlIGxvZyBjYW4gYmUgd3JpdHRlbiBvdXQsIHRoZSBkYXRhIHNlY3Rpb24gbXVzdCBiZSBzY2FubmVkCisgKiB0byBzYXZlIGF3YXkgdGhlIDFzdCB3b3JkIG9mIGVhY2ggQkJTSVpFIGJsb2NrIGludG8gdGhlIGhlYWRlci4gIFdlIHJlcGxhY2UKKyAqIGl0IHdpdGggdGhlIGN1cnJlbnQgY3ljbGUgY291bnQuICBFYWNoIEJCU0laRSBibG9jayBpcyB0YWdnZWQgd2l0aCB0aGUKKyAqIGN5Y2xlIGNvdW50IGJlY2F1c2UgdGhlcmUgaW4gYW4gaW1wbGljaXQgYXNzdW1wdGlvbiB0aGF0IGRyaXZlcyB3aWxsCisgKiBndWFyYW50ZWUgdGhhdCBlbnRpcmUgNTEyIGJ5dGUgYmxvY2tzIGdldCB3cml0dGVuIGF0IG9uY2UuICBJbiBvdGhlciB3b3JkcywKKyAqIHdlIGNhbid0IGhhdmUgcGFydCBvZiBhIDUxMiBieXRlIGJsb2NrIHdyaXR0ZW4gYW5kIHBhcnQgbm90IHdyaXR0ZW4uICBCeQorICogdGFnZ2luZyBlYWNoIGJsb2NrLCB3ZSB3aWxsIGtub3cgd2hpY2ggYmxvY2tzIGFyZSB2YWxpZCB3aGVuIHJlY292ZXJpbmcKKyAqIGFmdGVyIGFuIHVuY2xlYW4gc2h1dGRvd24uCisgKgorICogVGhpcyByb3V0aW5lIGlzIHNpbmdsZSB0aHJlYWRlZCBvbiB0aGUgaWNsb2cuICBObyBvdGhlciB0aHJlYWQgY2FuIGJlIGluCisgKiB0aGlzIHJvdXRpbmUgd2l0aCB0aGUgc2FtZSBpY2xvZy4gIENoYW5naW5nIGNvbnRlbnRzIG9mIGljbG9nIGNhbiB0aGVyZS0KKyAqIGZvcmUgYmUgZG9uZSB3aXRob3V0IGdyYWJiaW5nIHRoZSBzdGF0ZSBtYWNoaW5lIGxvY2suICBVcGRhdGluZyB0aGUgZ2xvYmFsCisgKiBsb2cgd2lsbCByZXF1aXJlIGdyYWJiaW5nIHRoZSBsb2NrIHRob3VnaC4KKyAqCisgKiBUaGUgZW50aXJlIGxvZyBtYW5hZ2VyIHVzZXMgYSBsb2dpY2FsIGJsb2NrIG51bWJlcmluZyBzY2hlbWUuICBPbmx5CisgKiBsb2dfc3luYyAoYW5kIHRoZW4gb25seSBid3JpdGUoKSkga25vdyBhYm91dCB0aGUgZmFjdCB0aGF0IHRoZSBsb2cgbWF5CisgKiBub3Qgc3RhcnQgd2l0aCBibG9jayB6ZXJvIG9uIGEgZ2l2ZW4gZGV2aWNlLiAgVGhlIGxvZyBibG9jayBzdGFydCBvZmZzZXQKKyAqIGlzIGFkZGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBjYWxsaW5nIGJ3cml0ZSgpLgorICovCisKK2ludAoreGxvZ19zeW5jKHhsb2dfdAkJKmxvZywKKwkgIHhsb2dfaW5fY29yZV90CSppY2xvZykKK3sKKwl4ZnNfY2FkZHJfdAlkcHRyOwkJLyogcG9pbnRlciB0byBieXRlIHNpemVkIGVsZW1lbnQgKi8KKwl4ZnNfYnVmX3QJKmJwOworCWludAkJaSwgb3BzOworCXVpbnQJCWNvdW50OwkJLyogYnl0ZSBjb3VudCBvZiBid3JpdGUgKi8KKwl1aW50CQljb3VudF9pbml0OwkvKiBpbml0aWFsIGNvdW50IGJlZm9yZSByb3VuZHVwICovCisJaW50CQlyb3VuZG9mZjsgICAgICAgLyogcm91bmRvZmYgdG8gQkIgb3Igc3RyaXBlICovCisJaW50CQlzcGxpdCA9IDA7CS8qIHNwbGl0IHdyaXRlIGludG8gdHdvIHJlZ2lvbnMgKi8KKwlpbnQJCWVycm9yOworCVNQTERFQ0wocyk7CisJaW50CQl2MiA9IFhGU19TQl9WRVJTSU9OX0hBU0xPR1YyKCZsb2ctPmxfbXAtPm1fc2IpOworCisJWEZTX1NUQVRTX0lOQyh4c19sb2dfd3JpdGVzKTsKKwlBU1NFUlQoaWNsb2ctPmljX3JlZmNudCA9PSAwKTsKKworCS8qIEFkZCBmb3IgTFIgaGVhZGVyICovCisJY291bnRfaW5pdCA9IGxvZy0+bF9pY2xvZ19oc2l6ZSArIGljbG9nLT5pY19vZmZzZXQ7CisKKwkvKiBSb3VuZCBvdXQgdGhlIGxvZyB3cml0ZSBzaXplICovCisJaWYgKHYyICYmIGxvZy0+bF9tcC0+bV9zYi5zYl9sb2dzdW5pdCA+IDEpIHsKKwkJLyogd2UgaGF2ZSBhIHYyIHN0cmlwZSB1bml0IHRvIHVzZSAqLworCQljb3VudCA9IFhMT0dfTFNVTklUVE9CKGxvZywgWExPR19CVE9MU1VOSVQobG9nLCBjb3VudF9pbml0KSk7CisJfSBlbHNlIHsKKwkJY291bnQgPSBCQlRPQihCVE9CQihjb3VudF9pbml0KSk7CisJfQorCXJvdW5kb2ZmID0gY291bnQgLSBjb3VudF9pbml0OworCUFTU0VSVChyb3VuZG9mZiA+PSAwKTsKKwlBU1NFUlQoKHYyICYmIGxvZy0+bF9tcC0+bV9zYi5zYl9sb2dzdW5pdCA+IDEgJiYgCisgICAgICAgICAgICAgICAgcm91bmRvZmYgPCBsb2ctPmxfbXAtPm1fc2Iuc2JfbG9nc3VuaXQpCisJCXx8IAorCQkobG9nLT5sX21wLT5tX3NiLnNiX2xvZ3N1bml0IDw9IDEgJiYgCisJCSByb3VuZG9mZiA8IEJCVE9CKDEpKSk7CisKKwkvKiBtb3ZlIGdyYW50IGhlYWRzIGJ5IHJvdW5kb2ZmIGluIHN5bmMgKi8KKwlzID0gR1JBTlRfTE9DSyhsb2cpOworCVhMT0dfR1JBTlRfQUREX1NQQUNFKGxvZywgcm91bmRvZmYsICd3Jyk7CisJWExPR19HUkFOVF9BRERfU1BBQ0UobG9nLCByb3VuZG9mZiwgJ3InKTsKKwlHUkFOVF9VTkxPQ0sobG9nLCBzKTsKKworCS8qIHB1dCBjeWNsZSBudW1iZXIgaW4gZXZlcnkgYmxvY2sgKi8KKwl4bG9nX3BhY2tfZGF0YShsb2csIGljbG9nLCByb3VuZG9mZik7IAorCisJLyogcmVhbCBieXRlIGxlbmd0aCAqLworCWlmICh2MikgeworCQlJTlRfU0VUKGljbG9nLT5pY19oZWFkZXIuaF9sZW4sIAorCQkJQVJDSF9DT05WRVJULAorCQkJaWNsb2ctPmljX29mZnNldCArIHJvdW5kb2ZmKTsKKwl9IGVsc2UgeworCQlJTlRfU0VUKGljbG9nLT5pY19oZWFkZXIuaF9sZW4sIEFSQ0hfQ09OVkVSVCwgaWNsb2ctPmljX29mZnNldCk7CisJfQorCisJLyogcHV0IG9wcyBjb3VudCBpbiBjb3JyZWN0IG9yZGVyICovCisJb3BzID0gaWNsb2ctPmljX2hlYWRlci5oX251bV9sb2dvcHM7CisJSU5UX1NFVChpY2xvZy0+aWNfaGVhZGVyLmhfbnVtX2xvZ29wcywgQVJDSF9DT05WRVJULCBvcHMpOworCisJYnAJICAgID0gaWNsb2ctPmljX2JwOworCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHVuc2lnbmVkIGxvbmcpID09ICh1bnNpZ25lZCBsb25nKTEpOworCVhGU19CVUZfU0VUX0ZTUFJJVkFURTIoYnAsICh1bnNpZ25lZCBsb25nKTIpOworCVhGU19CVUZfU0VUX0FERFIoYnAsIEJMT0NLX0xTTihJTlRfR0VUKGljbG9nLT5pY19oZWFkZXIuaF9sc24sIEFSQ0hfQ09OVkVSVCkpKTsKKworCVhGU19TVEFUU19BREQoeHNfbG9nX2Jsb2NrcywgQlRPQkIoY291bnQpKTsKKworCS8qIERvIHdlIG5lZWQgdG8gc3BsaXQgdGhpcyB3cml0ZSBpbnRvIDIgcGFydHM/ICovCisJaWYgKFhGU19CVUZfQUREUihicCkgKyBCVE9CQihjb3VudCkgPiBsb2ctPmxfbG9nQkJzaXplKSB7CisJCXNwbGl0ID0gY291bnQgLSAoQkJUT0IobG9nLT5sX2xvZ0JCc2l6ZSAtIFhGU19CVUZfQUREUihicCkpKTsKKwkJY291bnQgPSBCQlRPQihsb2ctPmxfbG9nQkJzaXplIC0gWEZTX0JVRl9BRERSKGJwKSk7CisJCWljbG9nLT5pY19id3JpdGVjbnQgPSAyOwkvKiBzcGxpdCBpbnRvIDIgd3JpdGVzICovCisJfSBlbHNlIHsKKwkJaWNsb2ctPmljX2J3cml0ZWNudCA9IDE7CisJfQorCVhGU19CVUZfU0VUX1BUUihicCwgKHhmc19jYWRkcl90KSAmKGljbG9nLT5pY19oZWFkZXIpLCBjb3VudCk7CisJWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCBpY2xvZyk7CS8qIHNhdmUgZm9yIGxhdGVyICovCisJWEZTX0JVRl9CVVNZKGJwKTsKKwlYRlNfQlVGX0FTWU5DKGJwKTsKKwkvKgorCSAqIERvIGEgZGlzayB3cml0ZSBjYWNoZSBmbHVzaCBmb3IgdGhlIGxvZyBibG9jay4KKwkgKiBUaGlzIGlzIGEgYml0IG9mIGEgc2xlZGdlaGFtbWVyLCBpdCB3b3VsZCBiZSBiZXR0ZXIKKwkgKiB0byB1c2UgYSB0YWcgYmFycmllciBoZXJlIHRoYXQganVzdCBwcmV2ZW50cyByZW9yZGVyaW5nLgorCSAqIEl0IG1heSBub3QgYmUgbmVlZGVkIHRvIGZsdXNoIHRoZSBmaXJzdCBzcGxpdCBibG9jayBpbiB0aGUgbG9nIHdyYXAKKwkgKiBjYXNlLCBidXQgZG8gaXQgYW55d2F5cyB0byBiZSBzYWZlIC1BSworCSAqLworCWlmICghKGxvZy0+bF9tcC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT0xPR0ZMVVNIKSkKKwkJWEZTX0JVRl9GTFVTSChicCk7CisKKwlBU1NFUlQoWEZTX0JVRl9BRERSKGJwKSA8PSBsb2ctPmxfbG9nQkJzaXplLTEpOworCUFTU0VSVChYRlNfQlVGX0FERFIoYnApICsgQlRPQkIoY291bnQpIDw9IGxvZy0+bF9sb2dCQnNpemUpOworCisJeGxvZ192ZXJpZnlfaWNsb2cobG9nLCBpY2xvZywgY291bnQsIEJfVFJVRSk7CisKKwkvKiBhY2NvdW50IGZvciBsb2cgd2hpY2ggZG9lc24ndCBzdGFydCBhdCBibG9jayAjMCAqLworCVhGU19CVUZfU0VUX0FERFIoYnAsIFhGU19CVUZfQUREUihicCkgKyBsb2ctPmxfbG9nQkJzdGFydCk7CisJLyoKKwkgKiBEb24ndCBjYWxsIHhmc19id3JpdGUgaGVyZS4gV2UgZG8gbG9nLXN5bmNzIGV2ZW4gd2hlbiB0aGUgZmlsZXN5c3RlbQorCSAqIGlzIHNodXR0aW5nIGRvd24uCisJICovCisJWEZTX0JVRl9XUklURShicCk7CisKKwlpZiAoKGVycm9yID0gWEZTX2J3cml0ZShicCkpKSB7CisJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX3N5bmMiLCBsb2ctPmxfbXAsIGJwLAorCQkJCSAgWEZTX0JVRl9BRERSKGJwKSk7CisJCXJldHVybiAoZXJyb3IpOworCX0KKwlpZiAoc3BsaXQpIHsKKwkJYnAJCT0gaWNsb2ctPmljX2xvZy0+bF94YnVmOworCQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB1bnNpZ25lZCBsb25nKSA9PQorCQkJCQkJCSh1bnNpZ25lZCBsb25nKTEpOworCQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUyKGJwLCAodW5zaWduZWQgbG9uZykyKTsKKwkJWEZTX0JVRl9TRVRfQUREUihicCwgMCk7CSAgICAgLyogbG9naWNhbCAwICovCisJCVhGU19CVUZfU0VUX1BUUihicCwgKHhmc19jYWRkcl90KSgoX19wc2ludF90KSYoaWNsb2ctPmljX2hlYWRlcikrCisJCQkJCSAgICAoX19wc2ludF90KWNvdW50KSwgc3BsaXQpOworCQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIGljbG9nKTsKKwkJWEZTX0JVRl9CVVNZKGJwKTsKKwkJWEZTX0JVRl9BU1lOQyhicCk7CisJCWlmICghKGxvZy0+bF9tcC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT0xPR0ZMVVNIKSkKKwkJCVhGU19CVUZfRkxVU0goYnApOworCQlkcHRyID0gWEZTX0JVRl9QVFIoYnApOworCQkvKgorCQkgKiBCdW1wIHRoZSBjeWNsZSBudW1iZXJzIGF0IHRoZSBzdGFydCBvZiBlYWNoIGJsb2NrCisJCSAqIHNpbmNlIHRoaXMgcGFydCBvZiB0aGUgYnVmZmVyIGlzIGF0IHRoZSBzdGFydCBvZgorCQkgKiBhIG5ldyBjeWNsZS4gIFdhdGNoIG91dCBmb3IgdGhlIGhlYWRlciBtYWdpYyBudW1iZXIKKwkJICogY2FzZSwgdGhvdWdoLgorCQkgKi8KKwkJZm9yIChpPTA7IGk8c3BsaXQ7IGkgKz0gQkJTSVpFKSB7CisJCQlJTlRfTU9EKCoodWludCAqKWRwdHIsIEFSQ0hfQ09OVkVSVCwgKzEpOworCQkJaWYgKElOVF9HRVQoKih1aW50ICopZHB0ciwgQVJDSF9DT05WRVJUKSA9PSBYTE9HX0hFQURFUl9NQUdJQ19OVU0pCisJCQkJSU5UX01PRCgqKHVpbnQgKilkcHRyLCBBUkNIX0NPTlZFUlQsICsxKTsKKwkJCWRwdHIgKz0gQkJTSVpFOworCQl9CisKKwkJQVNTRVJUKFhGU19CVUZfQUREUihicCkgPD0gbG9nLT5sX2xvZ0JCc2l6ZS0xKTsKKwkJQVNTRVJUKFhGU19CVUZfQUREUihicCkgKyBCVE9CQihjb3VudCkgPD0gbG9nLT5sX2xvZ0JCc2l6ZSk7CisKKwkJLyogYWNjb3VudCBmb3IgaW50ZXJuYWwgbG9nIHdoaWNoIGRvZXMndCBzdGFydCBhdCBibG9jayAjMCAqLworCQlYRlNfQlVGX1NFVF9BRERSKGJwLCBYRlNfQlVGX0FERFIoYnApICsgbG9nLT5sX2xvZ0JCc3RhcnQpOworCQlYRlNfQlVGX1dSSVRFKGJwKTsKKwkJaWYgKChlcnJvciA9IFhGU19id3JpdGUoYnApKSkgeworCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfc3luYyAoc3BsaXQpIiwgbG9nLT5sX21wLAorCQkJCQkgIGJwLCBYRlNfQlVGX0FERFIoYnApKTsKKwkJCXJldHVybiAoZXJyb3IpOworCQl9CisJfQorCXJldHVybiAoMCk7Cit9CS8qIHhsb2dfc3luYyAqLworCisKKy8qCisgKiBVbmFsbG9jYXRlIGEgbG9nIHN0cnVjdHVyZQorICovCit2b2lkCit4bG9nX3VuYWxsb2NfbG9nKHhsb2dfdCAqbG9nKQoreworCXhsb2dfaW5fY29yZV90CSppY2xvZywgKm5leHRfaWNsb2c7CisJeGxvZ190aWNrZXRfdAkqdGljLCAqbmV4dF90aWM7CisJaW50CQlpOworCisKKwlpY2xvZyA9IGxvZy0+bF9pY2xvZzsKKwlmb3IgKGk9MDsgaTxsb2ctPmxfaWNsb2dfYnVmczsgaSsrKSB7CisJCXN2X2Rlc3Ryb3koJmljbG9nLT5pY19mb3JjZXNlbWEpOworCQlzdl9kZXN0cm95KCZpY2xvZy0+aWNfd3JpdGVzZW1hKTsKKwkJeGZzX2J1Zl9mcmVlKGljbG9nLT5pY19icCk7CisjaWZkZWYgWEZTX0xPR19UUkFDRQorCQlpZiAoaWNsb2ctPmljX3RyYWNlICE9IE5VTEwpIHsKKwkJCWt0cmFjZV9mcmVlKGljbG9nLT5pY190cmFjZSk7CisJCX0KKyNlbmRpZgorCQluZXh0X2ljbG9nID0gaWNsb2ctPmljX25leHQ7CisJCWttZW1fZnJlZShpY2xvZy0+aGljX2RhdGEsIGxvZy0+bF9pY2xvZ19zaXplKTsKKwkJa21lbV9mcmVlKGljbG9nLCBzaXplb2YoeGxvZ19pbl9jb3JlX3QpKTsKKwkJaWNsb2cgPSBuZXh0X2ljbG9nOworCX0KKwlmcmVlc2VtYSgmbG9nLT5sX2ZsdXNoc2VtYSk7CisJc3BpbmxvY2tfZGVzdHJveSgmbG9nLT5sX2ljbG9nbG9jayk7CisJc3BpbmxvY2tfZGVzdHJveSgmbG9nLT5sX2dyYW50X2xvY2spOworCisJLyogWFhYc3VwIHRha2UgYSBsb29rIGF0IHRoaXMgYWdhaW4uICovCisJaWYgKChsb2ctPmxfdGlja2V0X2NudCAhPSBsb2ctPmxfdGlja2V0X3RjbnQpICAmJgorCSAgICAhWExPR19GT1JDRURfU0hVVERPV04obG9nKSkgeworCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBsb2ctPmxfbXAsCisJCQkieGxvZ191bmFsbG9jX2xvZzogKGNudDogJWQsIHRvdGFsOiAlZCkiLAorCQkJbG9nLT5sX3RpY2tldF9jbnQsIGxvZy0+bF90aWNrZXRfdGNudCk7CisJCS8qIEFTU0VSVChsb2ctPmxfdGlja2V0X2NudCA9PSBsb2ctPmxfdGlja2V0X3RjbnQpOyAqLworCisJfSBlbHNlIHsKKwkJdGljID0gbG9nLT5sX3VubW91bnRfZnJlZTsKKwkJd2hpbGUgKHRpYykgeworCQkJbmV4dF90aWMgPSB0aWMtPnRfbmV4dDsKKwkJCWttZW1fZnJlZSh0aWMsIE5CUFApOworCQkJdGljID0gbmV4dF90aWM7CisJCX0KKwl9CisJeGZzX2J1Zl9mcmVlKGxvZy0+bF94YnVmKTsKKyNpZmRlZiBYRlNfTE9HX1RSQUNFCisJaWYgKGxvZy0+bF90cmFjZSAhPSBOVUxMKSB7CisJCWt0cmFjZV9mcmVlKGxvZy0+bF90cmFjZSk7CisJfQorCWlmIChsb2ctPmxfZ3JhbnRfdHJhY2UgIT0gTlVMTCkgeworCQlrdHJhY2VfZnJlZShsb2ctPmxfZ3JhbnRfdHJhY2UpOworCX0KKyNlbmRpZgorCWxvZy0+bF9tcC0+bV9sb2cgPSBOVUxMOworCWttZW1fZnJlZShsb2csIHNpemVvZih4bG9nX3QpKTsKK30JLyogeGxvZ191bmFsbG9jX2xvZyAqLworCisvKgorICogVXBkYXRlIGNvdW50ZXJzIGF0b21pY2FsbHkgbm93IHRoYXQgbWVtY3B5IGlzIGRvbmUuCisgKi8KKy8qIEFSR1NVU0VEICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3hsb2dfc3RhdGVfZmluaXNoX2NvcHkoeGxvZ190CQkqbG9nLAorCQkgICAgICAgeGxvZ19pbl9jb3JlX3QJKmljbG9nLAorCQkgICAgICAgaW50CQlyZWNvcmRfY250LAorCQkgICAgICAgaW50CQljb3B5X2J5dGVzKQoreworCVNQTERFQ0wocyk7CisKKwlzID0gTE9HX0xPQ0sobG9nKTsKKworCWljbG9nLT5pY19oZWFkZXIuaF9udW1fbG9nb3BzICs9IHJlY29yZF9jbnQ7CisJaWNsb2ctPmljX29mZnNldCArPSBjb3B5X2J5dGVzOworCisJTE9HX1VOTE9DSyhsb2csIHMpOworfQkvKiB4bG9nX3N0YXRlX2ZpbmlzaF9jb3B5ICovCisKKworCisKKy8qCisgKiBXcml0ZSBzb21lIHJlZ2lvbiBvdXQgdG8gaW4tY29yZSBsb2cKKyAqCisgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIHdoZW4gd3JpdGluZyBleHRlcm5hbGx5IHByb3ZpZGVkIHJlZ2lvbnMgb3Igd2hlbgorICogd3JpdGluZyBvdXQgYSBjb21taXQgcmVjb3JkIGZvciBhIGdpdmVuIHRyYW5zYWN0aW9uLgorICoKKyAqIEdlbmVyYWwgYWxnb3JpdGhtOgorICoJMS4gRmluZCB0b3RhbCBsZW5ndGggb2YgdGhpcyB3cml0ZS4gIFRoaXMgbWF5IGluY2x1ZGUgYWRkaW5nIHRvIHRoZQorICoJCWxlbmd0aHMgcGFzc2VkIGluLgorICoJMi4gQ2hlY2sgd2hldGhlciB3ZSB2aW9sYXRlIHRoZSB0aWNrZXRzIHJlc2VydmF0aW9uLgorICoJMy4gV2hpbGUgd3JpdGluZyB0byB0aGlzIGljbG9nCisgKgkgICAgQS4gUmVzZXJ2ZSBhcyBtdWNoIHNwYWNlIGluIHRoaXMgaWNsb2cgYXMgY2FuIGdldAorICoJICAgIEIuIElmIHRoaXMgaXMgZmlyc3Qgd3JpdGUsIHNhdmUgYXdheSBzdGFydCBsc24KKyAqCSAgICBDLiBXaGlsZSB3cml0aW5nIHRoaXMgcmVnaW9uOgorICoJCTEuIElmIGZpcnN0IHdyaXRlIG9mIHRyYW5zYWN0aW9uLCB3cml0ZSBzdGFydCByZWNvcmQKKyAqCQkyLiBXcml0ZSBsb2cgb3BlcmF0aW9uIGhlYWRlciAoaGVhZGVyIHBlciByZWdpb24pCisgKgkJMy4gRmluZCBvdXQgaWYgd2UgY2FuIGZpdCBlbnRpcmUgcmVnaW9uIGludG8gdGhpcyBpY2xvZworICoJCTQuIFBvdGVudGlhbGx5LCB2ZXJpZnkgZGVzdGluYXRpb24gbWVtY3B5IHB0cgorICoJCTUuIE1lbWNweSAocGFydGlhbCkgcmVnaW9uCisgKgkJNi4gSWYgcGFydGlhbCBjb3B5LCByZWxlYXNlIGljbG9nOyBvdGhlcndpc2UsIGNvbnRpbnVlCisgKgkJCWNvcHlpbmcgbW9yZSByZWdpb25zIGludG8gY3VycmVudCBpY2xvZworICoJNC4gTWFyayB3YW50IHN5bmMgYml0IChpbiBzaW11bGF0aW9uIG1vZGUpCisgKgk1LiBSZWxlYXNlIGljbG9nIGZvciBwb3RlbnRpYWwgZmx1c2ggdG8gb24tZGlzayBsb2cuCisgKgorICogRVJST1JTOgorICogMS4JUGFuaWMgaWYgcmVzZXJ2YXRpb24gaXMgb3ZlcnJ1bi4gIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBzaW5jZQorICoJcmVzZXJ2YXRpb24gYW1vdW50cyBhcmUgZ2VuZXJhdGVkIGludGVybmFsIHRvIHRoZSBmaWxlc3lzdGVtLgorICogTk9URVM6CisgKiAxLiBUaWNrZXRzIGFyZSBzaW5nbGUgdGhyZWFkZWQgZGF0YSBzdHJ1Y3R1cmVzLgorICogMi4gVGhlIFhMT0dfRU5EX1RSQU5TICYgWExPR19DT05USU5VRV9UUkFOUyBmbGFncyBhcmUgcGFzc2VkIGRvd24gdG8gdGhlCisgKglzeW5jaW5nIHJvdXRpbmUuICBXaGVuIGEgc2luZ2xlIGxvZ193cml0ZSByZWdpb24gbmVlZHMgdG8gc3BhbgorICoJbXVsdGlwbGUgaW4tY29yZSBsb2dzLCB0aGUgWExPR19DT05USU5VRV9UUkFOUyBiaXQgc2hvdWxkIGJlIHNldAorICoJb24gYWxsIGxvZyBvcGVyYXRpb24gd3JpdGVzIHdoaWNoIGRvbid0IGNvbnRhaW4gdGhlIGVuZCBvZiB0aGUKKyAqCXJlZ2lvbi4gIFRoZSBYTE9HX0VORF9UUkFOUyBiaXQgaXMgdXNlZCBmb3IgdGhlIGluLWNvcmUgbG9nCisgKglvcGVyYXRpb24gd2hpY2ggY29udGFpbnMgdGhlIGVuZCBvZiB0aGUgY29udGludWVkIGxvZ193cml0ZSByZWdpb24uCisgKiAzLiBXaGVuIHhsb2dfc3RhdGVfZ2V0X2ljbG9nX3NwYWNlKCkgZ3JhYnMgdGhlIHJlc3Qgb2YgdGhlIGN1cnJlbnQgaWNsb2csCisgKgl3ZSBkb24ndCByZWFsbHkga25vdyBleGFjdGx5IGhvdyBtdWNoIHNwYWNlIHdpbGwgYmUgdXNlZC4gIEFzIGEgcmVzdWx0LAorICoJd2UgZG9uJ3QgdXBkYXRlIGljX29mZnNldCB1bnRpbCB0aGUgZW5kIHdoZW4gd2Uga25vdyBleGFjdGx5IGhvdyBtYW55CisgKglieXRlcyBoYXZlIGJlZW4gd3JpdHRlbiBvdXQuCisgKi8KK2ludAoreGxvZ193cml0ZSh4ZnNfbW91bnRfdCAqCW1wLAorCSAgIHhmc19sb2dfaW92ZWNfdAlyZWdbXSwKKwkgICBpbnQJCQluZW50cmllcywKKwkgICB4ZnNfbG9nX3RpY2tldF90CXRpYywKKwkgICB4ZnNfbHNuX3QJCSpzdGFydF9sc24sCisJICAgeGxvZ19pbl9jb3JlX3QJKipjb21taXRfaWNsb2csCisJICAgdWludAkJCWZsYWdzKQoreworICAgIHhsb2dfdAkgICAgICpsb2cgICAgPSBtcC0+bV9sb2c7CisgICAgeGxvZ190aWNrZXRfdCAgICAqdGlja2V0ID0gKHhsb2dfdGlja2V0X3QgKil0aWM7CisgICAgeGxvZ19vcF9oZWFkZXJfdCAqbG9nb3BfaGVhZDsgICAgLyogcHRyIHRvIGxvZyBvcGVyYXRpb24gaGVhZGVyICovCisgICAgeGxvZ19pbl9jb3JlX3QgICAqaWNsb2c7CSAgICAgLyogcHRyIHRvIGN1cnJlbnQgaW4tY29yZSBsb2cgKi8KKyAgICBfX3BzaW50X3QJICAgICBwdHI7CSAgICAgLyogY29weSBhZGRyZXNzIGludG8gZGF0YSByZWdpb24gKi8KKyAgICBpbnQJCSAgICAgbGVuOwkgICAgIC8qICMgeGxvZ193cml0ZSgpIGJ5dGVzIDIgc3RpbGwgY29weSAqLworICAgIGludAkJICAgICBpbmRleDsJICAgICAvKiByZWdpb24gaW5kZXggY3VycmVudGx5IGNvcHlpbmcgKi8KKyAgICBpbnQJCSAgICAgbG9nX29mZnNldDsgICAgIC8qIG9mZnNldCAoZnJvbSAwKSBpbnRvIGRhdGEgcmVnaW9uICovCisgICAgaW50CQkgICAgIHN0YXJ0X3JlY19jb3B5OyAvKiAjIGJ5dGVzIHRvIGNvcHkgZm9yIHN0YXJ0IHJlY29yZCAqLworICAgIGludAkJICAgICBwYXJ0aWFsX2NvcHk7ICAgLyogZGlkIHdlIHNwbGl0IGEgcmVnaW9uPyAqLworICAgIGludAkJICAgICBwYXJ0aWFsX2NvcHlfbGVuOy8qICMgYnl0ZXMgY29waWVkIGlmIHNwbGl0IHJlZ2lvbiAqLworICAgIGludAkJICAgICBuZWVkX2NvcHk7CSAgICAgLyogIyBieXRlcyBuZWVkIHRvIG1lbWNweSB0aGlzIHJlZ2lvbiAqLworICAgIGludAkJICAgICBjb3B5X2xlbjsJICAgICAvKiAjIGJ5dGVzIGFjdHVhbGx5IG1lbWNweSdpbmcgKi8KKyAgICBpbnQJCSAgICAgY29weV9vZmY7CSAgICAgLyogIyBieXRlcyBmcm9tIGVudHJ5IHN0YXJ0ICovCisgICAgaW50CQkgICAgIGNvbnR3cjsJICAgICAvKiBjb250aW51ZWQgd3JpdGUgb2YgaW4tY29yZSBsb2c/ICovCisgICAgaW50CQkgICAgIGVycm9yOworICAgIGludAkJICAgICByZWNvcmRfY250ID0gMCwgZGF0YV9jbnQgPSAwOworCisgICAgcGFydGlhbF9jb3B5X2xlbiA9IHBhcnRpYWxfY29weSA9IDA7CisKKyAgICAvKiBDYWxjdWxhdGUgcG90ZW50aWFsIG1heGltdW0gc3BhY2UuICBFYWNoIHJlZ2lvbiBnZXRzIGl0cyBvd24KKyAgICAgKiB4bG9nX29wX2hlYWRlcl90IGFuZCBtYXkgbmVlZCB0byBiZSBkb3VibGUgd29yZCBhbGlnbmVkLgorICAgICAqLworICAgIGxlbiA9IDA7CisgICAgaWYgKHRpY2tldC0+dF9mbGFncyAmIFhMT0dfVElDX0lOSVRFRCkgICAgIC8qIGFjY3QgZm9yIHN0YXJ0IHJlYyBvZiB4YWN0ICovCisJbGVuICs9IHNpemVvZih4bG9nX29wX2hlYWRlcl90KTsKKworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5lbnRyaWVzOyBpbmRleCsrKSB7CisJbGVuICs9IHNpemVvZih4bG9nX29wX2hlYWRlcl90KTsJICAgIC8qIGVhY2ggcmVnaW9uIGdldHMgPj0gMSAqLworCWxlbiArPSByZWdbaW5kZXhdLmlfbGVuOworICAgIH0KKyAgICBjb250d3IgPSAqc3RhcnRfbHNuID0gMDsKKworICAgIGlmICh0aWNrZXQtPnRfY3Vycl9yZXMgPCBsZW4pIHsKKyNpZmRlZiBERUJVRworCXhsb2dfcGFuaWMoCisJCSJ4ZnNfbG9nX3dyaXRlOiByZXNlcnZhdGlvbiByYW4gb3V0LiBOZWVkIHRvIHVwIHJlc2VydmF0aW9uIik7CisjZWxzZQorCS8qIEN1c3RvbWVyIGNvbmZpZ3VyYWJsZSBwYW5pYyAqLworCXhmc19jbW5fZXJyKFhGU19QVEFHX0xPR1JFUywgQ0VfQUxFUlQsIG1wLAorCQkieGZzX2xvZ193cml0ZTogcmVzZXJ2YXRpb24gcmFuIG91dC4gTmVlZCB0byB1cCByZXNlcnZhdGlvbiIpOworCS8qIElmIHdlIGRpZCBub3QgcGFuaWMsIHNodXRkb3duIHRoZSBmaWxlc3lzdGVtICovCisJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBYRlNfQ09SUlVQVF9JTkNPUkUpOworI2VuZGlmCisgICAgfSBlbHNlCisJdGlja2V0LT50X2N1cnJfcmVzIC09IGxlbjsKKworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5lbnRyaWVzOyApIHsKKwlpZiAoKGVycm9yID0geGxvZ19zdGF0ZV9nZXRfaWNsb2dfc3BhY2UobG9nLCBsZW4sICZpY2xvZywgdGlja2V0LAorCQkJCQkgICAgICAgJmNvbnR3ciwgJmxvZ19vZmZzZXQpKSkKKwkJcmV0dXJuIChlcnJvcik7CisKKwlBU1NFUlQobG9nX29mZnNldCA8PSBpY2xvZy0+aWNfc2l6ZSAtIDEpOworCXB0ciA9IChfX3BzaW50X3QpICgoY2hhciAqKWljbG9nLT5pY19kYXRhcCtsb2dfb2Zmc2V0KTsKKworCS8qIHN0YXJ0X2xzbiBpcyB0aGUgZmlyc3QgbHNuIHdyaXR0ZW4gdG8uIFRoYXQncyBhbGwgd2UgbmVlZC4gKi8KKwlpZiAoISAqc3RhcnRfbHNuKQorCSAgICAqc3RhcnRfbHNuID0gSU5UX0dFVChpY2xvZy0+aWNfaGVhZGVyLmhfbHNuLCBBUkNIX0NPTlZFUlQpOworCisJLyogVGhpcyBsb29wIHdyaXRlcyBvdXQgYXMgbWFueSByZWdpb25zIGFzIGNhbiBmaXQgaW4gdGhlIGFtb3VudAorCSAqIG9mIHNwYWNlIHdoaWNoIHdhcyBhbGxvY2F0ZWQgYnkgeGxvZ19zdGF0ZV9nZXRfaWNsb2dfc3BhY2UoKS4KKwkgKi8KKwl3aGlsZSAoaW5kZXggPCBuZW50cmllcykgeworCSAgICBBU1NFUlQocmVnW2luZGV4XS5pX2xlbiAlIHNpemVvZihfX2ludDMyX3QpID09IDApOworCSAgICBBU1NFUlQoKF9fcHNpbnRfdClwdHIgJSBzaXplb2YoX19pbnQzMl90KSA9PSAwKTsKKwkgICAgc3RhcnRfcmVjX2NvcHkgPSAwOworCisJICAgIC8qIElmIGZpcnN0IHdyaXRlIGZvciB0cmFuc2FjdGlvbiwgaW5zZXJ0IHN0YXJ0IHJlY29yZC4KKwkgICAgICogV2UgY2FuJ3QgYmUgdHJ5aW5nIHRvIGNvbW1pdCBpZiB3ZSBhcmUgaW5pdGVkLiAgV2UgY2FuJ3QKKwkgICAgICogaGF2ZSBhbnkgInBhcnRpYWxfY29weSIgaWYgd2UgYXJlIGluaXRlZC4KKwkgICAgICovCisJICAgIGlmICh0aWNrZXQtPnRfZmxhZ3MgJiBYTE9HX1RJQ19JTklURUQpIHsKKwkJbG9nb3BfaGVhZAkJPSAoeGxvZ19vcF9oZWFkZXJfdCAqKXB0cjsKKwkJSU5UX1NFVChsb2dvcF9oZWFkLT5vaF90aWQsIEFSQ0hfQ09OVkVSVCwgdGlja2V0LT50X3RpZCk7CisJCWxvZ29wX2hlYWQtPm9oX2NsaWVudGlkID0gdGlja2V0LT50X2NsaWVudGlkOworCQlsb2dvcF9oZWFkLT5vaF9sZW4JPSAwOworCQlsb2dvcF9oZWFkLT5vaF9mbGFncyAgICA9IFhMT0dfU1RBUlRfVFJBTlM7CisJCWxvZ29wX2hlYWQtPm9oX3JlczIJPSAwOworCQl0aWNrZXQtPnRfZmxhZ3MJCSY9IH5YTE9HX1RJQ19JTklURUQ7CS8qIGNsZWFyIGJpdCAqLworCQlyZWNvcmRfY250Kys7CisKKwkJc3RhcnRfcmVjX2NvcHkgPSBzaXplb2YoeGxvZ19vcF9oZWFkZXJfdCk7CisJCXhsb2dfd3JpdGVfYWR2X2NudChwdHIsIGxlbiwgbG9nX29mZnNldCwgc3RhcnRfcmVjX2NvcHkpOworCSAgICB9CisKKwkgICAgLyogQ29weSBsb2cgb3BlcmF0aW9uIGhlYWRlciBkaXJlY3RseSBpbnRvIGRhdGEgc2VjdGlvbiAqLworCSAgICBsb2dvcF9oZWFkCQkJPSAoeGxvZ19vcF9oZWFkZXJfdCAqKXB0cjsKKwkgICAgSU5UX1NFVChsb2dvcF9oZWFkLT5vaF90aWQsIEFSQ0hfQ09OVkVSVCwgdGlja2V0LT50X3RpZCk7CisJICAgIGxvZ29wX2hlYWQtPm9oX2NsaWVudGlkCT0gdGlja2V0LT50X2NsaWVudGlkOworCSAgICBsb2dvcF9oZWFkLT5vaF9yZXMyCQk9IDA7CisKKwkgICAgLyogaGVhZGVyIGNvcGllZCBkaXJlY3RseSAqLworCSAgICB4bG9nX3dyaXRlX2Fkdl9jbnQocHRyLCBsZW4sIGxvZ19vZmZzZXQsIHNpemVvZih4bG9nX29wX2hlYWRlcl90KSk7CisKKwkgICAgLyogYXJlIHdlIGNvcHlpbmcgYSBjb21taXQgb3IgdW5tb3VudCByZWNvcmQ/ICovCisJICAgIGxvZ29wX2hlYWQtPm9oX2ZsYWdzID0gZmxhZ3M7CisKKwkgICAgLyoKKwkgICAgICogV2UndmUgc2VlbiBsb2dzIGNvcnJ1cHRlZCB3aXRoIGJhZCB0cmFuc2FjdGlvbiBjbGllbnQKKwkgICAgICogaWRzLiAgVGhpcyBtYWtlcyBzdXJlIHRoYXQgWEZTIGRvZXNuJ3QgZ2VuZXJhdGUgdGhlbSBvbi4KKwkgICAgICogVHVybiB0aGlzIGludG8gYW4gRUlPIGFuZCBzaHV0IGRvd24gdGhlIGZpbGVzeXN0ZW0uCisJICAgICAqLworCSAgICBzd2l0Y2ggKGxvZ29wX2hlYWQtPm9oX2NsaWVudGlkKSAgeworCSAgICBjYXNlIFhGU19UUkFOU0FDVElPTjoKKwkgICAgY2FzZSBYRlNfVk9MVU1FOgorCSAgICBjYXNlIFhGU19MT0c6CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBtcCwKKwkJICAgICJCYWQgWEZTIHRyYW5zYWN0aW9uIGNsaWVudGlkIDB4JXggaW4gdGlja2V0IDB4JXAiLAorCQkgICAgbG9nb3BfaGVhZC0+b2hfY2xpZW50aWQsIHRpYyk7CisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwkgICAgfQorCisJICAgIC8qIFBhcnRpYWwgd3JpdGUgbGFzdCB0aW1lPyA9PiAocGFydGlhbF9jb3B5ICE9IDApCisJICAgICAqIG5lZWRfY29weSBpcyB0aGUgYW1vdW50IHdlJ2QgbGlrZSB0byBjb3B5IGlmIGV2ZXJ5dGhpbmcgY291bGQKKwkgICAgICogZml0IGluIHRoZSBjdXJyZW50IG1lbWNweS4KKwkgICAgICovCisJICAgIG5lZWRfY29weSA9CXJlZ1tpbmRleF0uaV9sZW4gLSBwYXJ0aWFsX2NvcHlfbGVuOworCisJICAgIGNvcHlfb2ZmID0gcGFydGlhbF9jb3B5X2xlbjsKKwkgICAgaWYgKG5lZWRfY29weSA8PSBpY2xvZy0+aWNfc2l6ZSAtIGxvZ19vZmZzZXQpIHsgLypjb21wbGV0ZSB3cml0ZSAqLworCQlJTlRfU0VUKGxvZ29wX2hlYWQtPm9oX2xlbiwgQVJDSF9DT05WRVJULCBjb3B5X2xlbiA9IG5lZWRfY29weSk7CisJCWlmIChwYXJ0aWFsX2NvcHkpCisJCSAgICBsb2dvcF9oZWFkLT5vaF9mbGFnc3w9IChYTE9HX0VORF9UUkFOU3xYTE9HX1dBU19DT05UX1RSQU5TKTsKKwkJcGFydGlhbF9jb3B5X2xlbiA9IHBhcnRpYWxfY29weSA9IDA7CisJICAgIH0gZWxzZSB7CQkJCQkgICAgLyogcGFydGlhbCB3cml0ZSAqLworCQljb3B5X2xlbiA9IGljbG9nLT5pY19zaXplIC0gbG9nX29mZnNldDsKKwkJSU5UX1NFVChsb2dvcF9oZWFkLT5vaF9sZW4sIEFSQ0hfQ09OVkVSVCwgY29weV9sZW4pOworCQlsb2dvcF9oZWFkLT5vaF9mbGFncyB8PSBYTE9HX0NPTlRJTlVFX1RSQU5TOworCQlpZiAocGFydGlhbF9jb3B5KQorCQkJbG9nb3BfaGVhZC0+b2hfZmxhZ3MgfD0gWExPR19XQVNfQ09OVF9UUkFOUzsKKwkJcGFydGlhbF9jb3B5X2xlbiArPSBjb3B5X2xlbjsKKwkJcGFydGlhbF9jb3B5Kys7CisJCWxlbiArPSBzaXplb2YoeGxvZ19vcF9oZWFkZXJfdCk7IC8qIGZyb20gc3BsaXR0aW5nIG9mIHJlZ2lvbiAqLworCQkvKiBhY2NvdW50IGZvciBuZXcgbG9nIG9wIGhlYWRlciAqLworCQl0aWNrZXQtPnRfY3Vycl9yZXMgLT0gc2l6ZW9mKHhsb2dfb3BfaGVhZGVyX3QpOworCSAgICB9CisJICAgIHhsb2dfdmVyaWZ5X2Rlc3RfcHRyKGxvZywgcHRyKTsKKworCSAgICAvKiBjb3B5IHJlZ2lvbiAqLworCSAgICBBU1NFUlQoY29weV9sZW4gPj0gMCk7CisJICAgIG1lbWNweSgoeGZzX2NhZGRyX3QpcHRyLCByZWdbaW5kZXhdLmlfYWRkciArIGNvcHlfb2ZmLCBjb3B5X2xlbik7CisJICAgIHhsb2dfd3JpdGVfYWR2X2NudChwdHIsIGxlbiwgbG9nX29mZnNldCwgY29weV9sZW4pOworCisJICAgIC8qIG1ha2UgY29weV9sZW4gdG90YWwgYnl0ZXMgY29waWVkLCBpbmNsdWRpbmcgaGVhZGVycyAqLworCSAgICBjb3B5X2xlbiArPSBzdGFydF9yZWNfY29weSArIHNpemVvZih4bG9nX29wX2hlYWRlcl90KTsKKwkgICAgcmVjb3JkX2NudCsrOworCSAgICBkYXRhX2NudCArPSBjb250d3IgPyBjb3B5X2xlbiA6IDA7CisJICAgIGlmIChwYXJ0aWFsX2NvcHkpIHsJCQkvKiBjb3BpZWQgcGFydGlhbCByZWdpb24gKi8KKwkJICAgIC8qIGFscmVhZHkgbWFya2VkIFdBTlRfU1lOQyBieSB4bG9nX3N0YXRlX2dldF9pY2xvZ19zcGFjZSAqLworCQkgICAgeGxvZ19zdGF0ZV9maW5pc2hfY29weShsb2csIGljbG9nLCByZWNvcmRfY250LCBkYXRhX2NudCk7CisJCSAgICByZWNvcmRfY250ID0gZGF0YV9jbnQgPSAwOworCQkgICAgaWYgKChlcnJvciA9IHhsb2dfc3RhdGVfcmVsZWFzZV9pY2xvZyhsb2csIGljbG9nKSkpCisJCQkgICAgcmV0dXJuIChlcnJvcik7CisJCSAgICBicmVhazsJCQkvKiBkb24ndCBpbmNyZW1lbnQgaW5kZXggKi8KKwkgICAgfSBlbHNlIHsJCQkJLyogY29waWVkIGVudGlyZSByZWdpb24gKi8KKwkJaW5kZXgrKzsKKwkJcGFydGlhbF9jb3B5X2xlbiA9IHBhcnRpYWxfY29weSA9IDA7CisKKwkJaWYgKGljbG9nLT5pY19zaXplIC0gbG9nX29mZnNldCA8PSBzaXplb2YoeGxvZ19vcF9oZWFkZXJfdCkpIHsKKwkJICAgIHhsb2dfc3RhdGVfZmluaXNoX2NvcHkobG9nLCBpY2xvZywgcmVjb3JkX2NudCwgZGF0YV9jbnQpOworCQkgICAgcmVjb3JkX2NudCA9IGRhdGFfY250ID0gMDsKKwkJICAgIHhsb2dfc3RhdGVfd2FudF9zeW5jKGxvZywgaWNsb2cpOworCQkgICAgaWYgKGNvbW1pdF9pY2xvZykgeworCQkJQVNTRVJUKGZsYWdzICYgWExPR19DT01NSVRfVFJBTlMpOworCQkJKmNvbW1pdF9pY2xvZyA9IGljbG9nOworCQkgICAgfSBlbHNlIGlmICgoZXJyb3IgPSB4bG9nX3N0YXRlX3JlbGVhc2VfaWNsb2cobG9nLCBpY2xvZykpKQorCQkJICAgcmV0dXJuIChlcnJvcik7CisJCSAgICBpZiAoaW5kZXggPT0gbmVudHJpZXMpCisJCQkgICAgcmV0dXJuIDA7CQkvKiB3ZSBhcmUgZG9uZSAqLworCQkgICAgZWxzZQorCQkJICAgIGJyZWFrOworCQl9CisJICAgIH0gLyogaWYgKHBhcnRpYWxfY29weSkgKi8KKwl9IC8qIHdoaWxlIChpbmRleCA8IG5lbnRyaWVzKSAqLworICAgIH0gLyogZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbmVudHJpZXM7ICkgKi8KKyAgICBBU1NFUlQobGVuID09IDApOworCisgICAgeGxvZ19zdGF0ZV9maW5pc2hfY29weShsb2csIGljbG9nLCByZWNvcmRfY250LCBkYXRhX2NudCk7CisgICAgaWYgKGNvbW1pdF9pY2xvZykgeworCUFTU0VSVChmbGFncyAmIFhMT0dfQ09NTUlUX1RSQU5TKTsKKwkqY29tbWl0X2ljbG9nID0gaWNsb2c7CisJcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAoeGxvZ19zdGF0ZV9yZWxlYXNlX2ljbG9nKGxvZywgaWNsb2cpKTsKK30JLyogeGxvZ193cml0ZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCQlTdGF0ZSBNYWNoaW5lIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIENsZWFuIGljbG9ncyBzdGFydGluZyBmcm9tIHRoZSBoZWFkLiAgVGhpcyBvcmRlcmluZyBtdXN0IGJlCisgKiBtYWludGFpbmVkLCBzbyBhbiBpY2xvZyBkb2Vzbid0IGJlY29tZSBBQ1RJVkUgYmV5b25kIG9uZSB0aGF0CisgKiBpcyBTWU5DSU5HLiAgVGhpcyBpcyBhbHNvIHJlcXVpcmVkIHRvIG1haW50YWluIHRoZSBub3Rpb24gdGhhdCB3ZSB1c2UKKyAqIGEgY291bnRpbmcgc2VtYXBob3JlIHRvIGhvbGQgb2ZmIHdvdWxkIGJlIHdyaXRlcnMgdG8gdGhlIGxvZyB3aGVuIGV2ZXJ5CisgKiBpY2xvZyBpcyB0cnlpbmcgdG8gc3luYyB0byBkaXNrLgorICoKKyAqIFN0YXRlIENoYW5nZTogRElSVFkgLT4gQUNUSVZFCisgKi8KK3ZvaWQKK3hsb2dfc3RhdGVfY2xlYW5fbG9nKHhsb2dfdCAqbG9nKQoreworCXhsb2dfaW5fY29yZV90CSppY2xvZzsKKwlpbnQgY2hhbmdlZCA9IDA7CisKKwlpY2xvZyA9IGxvZy0+bF9pY2xvZzsKKwlkbyB7CisJCWlmIChpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9ESVJUWSkgeworCQkJaWNsb2ctPmljX3N0YXRlCT0gWExPR19TVEFURV9BQ1RJVkU7CisJCQlpY2xvZy0+aWNfb2Zmc2V0ICAgICAgID0gMDsKKwkJCWljbG9nLT5pY19jYWxsYmFjawk9IE5VTEw7ICAgLyogZG9uJ3QgbmVlZCB0byBmcmVlICovCisJCQkvKgorCQkJICogSWYgdGhlIG51bWJlciBvZiBvcHMgaW4gdGhpcyBpY2xvZyBpbmRpY2F0ZSBpdCBqdXN0CisJCQkgKiBjb250YWlucyB0aGUgZHVtbXkgdHJhbnNhY3Rpb24sIHdlIGNhbgorCQkJICogY2hhbmdlIHN0YXRlIGludG8gSURMRSAodGhlIHNlY29uZCB0aW1lIGFyb3VuZCkuCisJCQkgKiBPdGhlcndpc2Ugd2Ugc2hvdWxkIGNoYW5nZSB0aGUgc3RhdGUgaW50bworCQkJICogTkVFRCBhIGR1bW15LgorCQkJICogV2UgZG9uJ3QgbmVlZCB0byBjb3ZlciB0aGUgZHVtbXkuCisJCQkgKi8KKwkJCWlmICghY2hhbmdlZCAmJgorCQkJICAgKElOVF9HRVQoaWNsb2ctPmljX2hlYWRlci5oX251bV9sb2dvcHMsIEFSQ0hfQ09OVkVSVCkgPT0gWExPR19DT1ZFUl9PUFMpKSB7CisJCQkJY2hhbmdlZCA9IDE7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogV2UgaGF2ZSB0d28gZGlydHkgaWNsb2dzIHNvIHN0YXJ0IG92ZXIKKwkJCQkgKiBUaGlzIGNvdWxkIGFsc28gYmUgbnVtIG9mIG9wcyBpbmRpY2F0ZXMKKwkJCQkgKiB0aGlzIGlzIG5vdCB0aGUgZHVtbXkgZ29pbmcgb3V0LgorCQkJCSAqLworCQkJCWNoYW5nZWQgPSAyOworCQkJfQorCQkJaWNsb2ctPmljX2hlYWRlci5oX251bV9sb2dvcHMgPSAwOworCQkJbWVtc2V0KGljbG9nLT5pY19oZWFkZXIuaF9jeWNsZV9kYXRhLCAwLAorCQkJICAgICAgc2l6ZW9mKGljbG9nLT5pY19oZWFkZXIuaF9jeWNsZV9kYXRhKSk7CisJCQlpY2xvZy0+aWNfaGVhZGVyLmhfbHNuID0gMDsKKwkJfSBlbHNlIGlmIChpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9BQ1RJVkUpCisJCQkvKiBkbyBub3RoaW5nICovOworCQllbHNlCisJCQlicmVhazsJLyogc3RvcCBjbGVhbmluZyAqLworCQlpY2xvZyA9IGljbG9nLT5pY19uZXh0OworCX0gd2hpbGUgKGljbG9nICE9IGxvZy0+bF9pY2xvZyk7CisKKwkvKiBsb2cgaXMgbG9ja2VkIHdoZW4gd2UgYXJlIGNhbGxlZCAqLworCS8qCisJICogQ2hhbmdlIHN0YXRlIGZvciB0aGUgZHVtbXkgbG9nIHJlY29yZGluZy4KKwkgKiBXZSB1c3VhbGx5IGdvIHRvIE5FRUQuIEJ1dCB3ZSBnbyB0byBORUVEMiBpZiB0aGUgY2hhbmdlZCBpbmRpY2F0ZXMKKwkgKiB3ZSBhcmUgZG9uZSB3cml0aW5nIHRoZSBkdW1teSByZWNvcmQuCisJICogSWYgd2UgYXJlIGRvbmUgd2l0aCB0aGUgc2Vjb25kIGR1bW15IHJlY29yZWQgKERPTkUyKSwgdGhlbgorCSAqIHdlIGdvIHRvIElETEUuCisJICovCisJaWYgKGNoYW5nZWQpIHsKKwkJc3dpdGNoIChsb2ctPmxfY292ZXJlZF9zdGF0ZSkgeworCQljYXNlIFhMT0dfU1RBVEVfQ09WRVJfSURMRToKKwkJY2FzZSBYTE9HX1NUQVRFX0NPVkVSX05FRUQ6CisJCWNhc2UgWExPR19TVEFURV9DT1ZFUl9ORUVEMjoKKwkJCWxvZy0+bF9jb3ZlcmVkX3N0YXRlID0gWExPR19TVEFURV9DT1ZFUl9ORUVEOworCQkJYnJlYWs7CisKKwkJY2FzZSBYTE9HX1NUQVRFX0NPVkVSX0RPTkU6CisJCQlpZiAoY2hhbmdlZCA9PSAxKQorCQkJCWxvZy0+bF9jb3ZlcmVkX3N0YXRlID0gWExPR19TVEFURV9DT1ZFUl9ORUVEMjsKKwkJCWVsc2UKKwkJCQlsb2ctPmxfY292ZXJlZF9zdGF0ZSA9IFhMT0dfU1RBVEVfQ09WRVJfTkVFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgWExPR19TVEFURV9DT1ZFUl9ET05FMjoKKwkJCWlmIChjaGFuZ2VkID09IDEpCisJCQkJbG9nLT5sX2NvdmVyZWRfc3RhdGUgPSBYTE9HX1NUQVRFX0NPVkVSX0lETEU7CisJCQllbHNlCisJCQkJbG9nLT5sX2NvdmVyZWRfc3RhdGUgPSBYTE9HX1NUQVRFX0NPVkVSX05FRUQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJQVNTRVJUKDApOworCQl9CisJfQorfQkvKiB4bG9nX3N0YXRlX2NsZWFuX2xvZyAqLworCitTVEFUSUMgeGZzX2xzbl90Cit4bG9nX2dldF9sb3dlc3RfbHNuKAorCXhsb2dfdAkJKmxvZykKK3sKKwl4bG9nX2luX2NvcmVfdCAgKmxzbl9sb2c7CisJeGZzX2xzbl90CWxvd2VzdF9sc24sIGxzbjsKKworCWxzbl9sb2cgPSBsb2ctPmxfaWNsb2c7CisJbG93ZXN0X2xzbiA9IDA7CisJZG8geworCSAgICBpZiAoIShsc25fbG9nLT5pY19zdGF0ZSAmIChYTE9HX1NUQVRFX0FDVElWRXxYTE9HX1NUQVRFX0RJUlRZKSkpIHsKKwkJbHNuID0gSU5UX0dFVChsc25fbG9nLT5pY19oZWFkZXIuaF9sc24sIEFSQ0hfQ09OVkVSVCk7CisJCWlmICgobHNuICYmICFsb3dlc3RfbHNuKSB8fAorCQkgICAgKFhGU19MU05fQ01QKGxzbiwgbG93ZXN0X2xzbikgPCAwKSkgeworCQkJbG93ZXN0X2xzbiA9IGxzbjsKKwkJfQorCSAgICB9CisJICAgIGxzbl9sb2cgPSBsc25fbG9nLT5pY19uZXh0OworCX0gd2hpbGUgKGxzbl9sb2cgIT0gbG9nLT5sX2ljbG9nKTsKKwlyZXR1cm4obG93ZXN0X2xzbik7Cit9CisKKworU1RBVElDIHZvaWQKK3hsb2dfc3RhdGVfZG9fY2FsbGJhY2soCisJeGxvZ190CQkqbG9nLAorCWludAkJYWJvcnRlZCwKKwl4bG9nX2luX2NvcmVfdAkqY2ljbG9nKQoreworCXhsb2dfaW5fY29yZV90CSAgICppY2xvZzsKKwl4bG9nX2luX2NvcmVfdAkgICAqZmlyc3RfaWNsb2c7CS8qIHVzZWQgdG8ga25vdyB3aGVuIHdlJ3ZlCisJCQkJCQkgKiBwcm9jZXNzZWQgYWxsIGljbG9ncyBvbmNlICovCisJeGZzX2xvZ19jYWxsYmFja190ICpjYiwgKmNiX25leHQ7CisJaW50CQkgICBmbHVzaGNudCA9IDA7CisJeGZzX2xzbl90CSAgIGxvd2VzdF9sc247CisJaW50CQkgICBpb2Vycm9yczsJLyogY291bnRlcjogaWNsb2dzIHdpdGggZXJyb3JzICovCisJaW50CQkgICBsb29wZGlkY2FsbGJhY2tzOyAvKiBmbGFnOiBpbm5lciBsb29wIGRpZCBjYWxsYmFja3MqLworCWludAkJICAgZnVuY2RpZGNhbGxiYWNrczsgLyogZmxhZzogZnVuY3Rpb24gZGlkIGNhbGxiYWNrcyAqLworCWludAkJICAgcmVwZWF0czsJLyogZm9yIGlzc3VpbmcgY29uc29sZSB3YXJuaW5ncyBpZgorCQkJCQkgKiBsb29waW5nIHRvbyBtYW55IHRpbWVzICovCisJU1BMREVDTChzKTsKKworCXMgPSBMT0dfTE9DSyhsb2cpOworCWZpcnN0X2ljbG9nID0gaWNsb2cgPSBsb2ctPmxfaWNsb2c7CisJaW9lcnJvcnMgPSAwOworCWZ1bmNkaWRjYWxsYmFja3MgPSAwOworCXJlcGVhdHMgPSAwOworCisJZG8geworCQkvKgorCQkgKiBTY2FuIGFsbCBpY2xvZ3Mgc3RhcnRpbmcgd2l0aCB0aGUgb25lIHBvaW50ZWQgdG8gYnkgdGhlCisJCSAqIGxvZy4gIFJlc2V0IHRoaXMgc3RhcnRpbmcgcG9pbnQgZWFjaCB0aW1lIHRoZSBsb2cgaXMKKwkJICogdW5sb2NrZWQgKGR1cmluZyBjYWxsYmFja3MpLgorCQkgKgorCQkgKiBLZWVwIGxvb3BpbmcgdGhyb3VnaCBpY2xvZ3MgdW50aWwgb25lIGZ1bGwgcGFzcyBpcyBtYWRlCisJCSAqIHdpdGhvdXQgcnVubmluZyBhbnkgY2FsbGJhY2tzLgorCQkgKi8KKwkJZmlyc3RfaWNsb2cgPSBsb2ctPmxfaWNsb2c7CisJCWljbG9nID0gbG9nLT5sX2ljbG9nOworCQlsb29wZGlkY2FsbGJhY2tzID0gMDsKKwkJcmVwZWF0cysrOworCisJCWRvIHsKKworCQkJLyogc2tpcCBhbGwgaWNsb2dzIGluIHRoZSBBQ1RJVkUgJiBESVJUWSBzdGF0ZXMgKi8KKwkJCWlmIChpY2xvZy0+aWNfc3RhdGUgJgorCQkJICAgIChYTE9HX1NUQVRFX0FDVElWRXxYTE9HX1NUQVRFX0RJUlRZKSkgeworCQkJCWljbG9nID0gaWNsb2ctPmljX25leHQ7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBCZXR3ZWVuIG1hcmtpbmcgYSBmaWxlc3lzdGVtIFNIVVRET1dOIGFuZCBzdG9wcGluZworCQkJICogdGhlIGxvZywgd2UgZG8gZmx1c2ggYWxsIGljbG9ncyB0byBkaXNrIChpZiB0aGVyZQorCQkJICogd2Fzbid0IGEgbG9nIEkvTyBlcnJvcikuIFNvLCB3ZSBkbyB3YW50IHRoaW5ncyB0bworCQkJICogZ28gc21vb3RobHkgaW4gY2FzZSBvZiBqdXN0IGEgU0hVVERPV04gIHcvbyBhCisJCQkgKiBMT0dfSU9fRVJST1IuCisJCQkgKi8KKwkJCWlmICghKGljbG9nLT5pY19zdGF0ZSAmIFhMT0dfU1RBVEVfSU9FUlJPUikpIHsKKwkJCQkvKgorCQkJCSAqIENhbiBvbmx5IHBlcmZvcm0gY2FsbGJhY2tzIGluIG9yZGVyLiAgU2luY2UKKwkJCQkgKiB0aGlzIGljbG9nIGlzIG5vdCBpbiB0aGUgRE9ORV9TWU5DLworCQkJCSAqIERPX0NBTExCQUNLIHN0YXRlLCB3ZSBza2lwIHRoZSByZXN0IGFuZAorCQkJCSAqIGp1c3QgdHJ5IHRvIGNsZWFuIHVwLiAgSWYgd2Ugc2V0IG91ciBpY2xvZworCQkJCSAqIHRvIERPX0NBTExCQUNLLCB3ZSB3aWxsIG5vdCBwcm9jZXNzIGl0IHdoZW4KKwkJCQkgKiB3ZSByZXRyeSBzaW5jZSBhIHByZXZpb3VzIGljbG9nIGlzIGluIHRoZQorCQkJCSAqIENBTExCQUNLIGFuZCB0aGUgc3RhdGUgY2Fubm90IGNoYW5nZSBzaW5jZQorCQkJCSAqIHdlIGFyZSBob2xkaW5nIHRoZSBMT0dfTE9DSy4KKwkJCQkgKi8KKwkJCQlpZiAoIShpY2xvZy0+aWNfc3RhdGUgJgorCQkJCQkoWExPR19TVEFURV9ET05FX1NZTkMgfAorCQkJCQkJIFhMT0dfU1RBVEVfRE9fQ0FMTEJBQ0spKSkgeworCQkJCQlpZiAoY2ljbG9nICYmIChjaWNsb2ctPmljX3N0YXRlID09CisJCQkJCQkJWExPR19TVEFURV9ET05FX1NZTkMpKSB7CisJCQkJCQljaWNsb2ctPmljX3N0YXRlID0gWExPR19TVEFURV9ET19DQUxMQkFDSzsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBXZSBub3cgaGF2ZSBhbiBpY2xvZyB0aGF0IGlzIGluIGVpdGhlciB0aGUKKwkJCQkgKiBET19DQUxMQkFDSyBvciBET05FX1NZTkMgc3RhdGVzLiBUaGUgb3RoZXIKKwkJCQkgKiBzdGF0ZXMgKFdBTlRfU1lOQywgU1lOQ0lORywgb3IgQ0FMTEJBQ0sgd2VyZQorCQkJCSAqIGNhdWdodCBieSB0aGUgYWJvdmUgaWYgYW5kIGFyZSBnb2luZyB0bworCQkJCSAqIGNsZWFuIChpLmUuIHdlIGFyZW4ndCBkb2luZyB0aGVpciBjYWxsYmFja3MpCisJCQkJICogc2VlIHRoZSBhYm92ZSBpZi4KKwkJCQkgKi8KKworCQkJCS8qCisJCQkJICogV2Ugd2lsbCBkbyBvbmUgbW9yZSBjaGVjayBoZXJlIHRvIHNlZSBpZiB3ZQorCQkJCSAqIGhhdmUgY2hhc2VkIG91ciB0YWlsIGFyb3VuZC4KKwkJCQkgKi8KKworCQkJCWxvd2VzdF9sc24gPSB4bG9nX2dldF9sb3dlc3RfbHNuKGxvZyk7CisJCQkJaWYgKGxvd2VzdF9sc24gJiYgKAorCQkJCQlYRlNfTFNOX0NNUCgKKwkJCQkJCWxvd2VzdF9sc24sCisJCQkJCQlJTlRfR0VUKGljbG9nLT5pY19oZWFkZXIuaF9sc24sIEFSQ0hfQ09OVkVSVCkKKwkJCQkJKTwwKSkgeworCQkJCQlpY2xvZyA9IGljbG9nLT5pY19uZXh0OworCQkJCQljb250aW51ZTsgLyogTGVhdmUgdGhpcyBpY2xvZyBmb3IKKwkJCQkJCSAgICogYW5vdGhlciB0aHJlYWQgKi8KKwkJCQl9CisKKwkJCQlpY2xvZy0+aWNfc3RhdGUgPSBYTE9HX1NUQVRFX0NBTExCQUNLOworCisJCQkJTE9HX1VOTE9DSyhsb2csIHMpOworCisJCQkJLyogbF9sYXN0X3N5bmNfbHNuIGZpZWxkIHByb3RlY3RlZCBieQorCQkJCSAqIEdSQU5UX0xPQ0suIERvbid0IHdvcnJ5IGFib3V0IGljbG9nJ3MgbHNuLgorCQkJCSAqIE5vIG9uZSBlbHNlIGNhbiBiZSBoZXJlIGV4Y2VwdCB1cy4KKwkJCQkgKi8KKwkJCQlzID0gR1JBTlRfTE9DSyhsb2cpOworCQkJCUFTU0VSVChYRlNfTFNOX0NNUCgKKwkJCQkJCWxvZy0+bF9sYXN0X3N5bmNfbHNuLAorCQkJCQkJSU5UX0dFVChpY2xvZy0+aWNfaGVhZGVyLmhfbHNuLCBBUkNIX0NPTlZFUlQpCisJCQkJCSk8PTApOworCQkJCWxvZy0+bF9sYXN0X3N5bmNfbHNuID0gSU5UX0dFVChpY2xvZy0+aWNfaGVhZGVyLmhfbHNuLCBBUkNIX0NPTlZFUlQpOworCQkJCUdSQU5UX1VOTE9DSyhsb2csIHMpOworCisJCQkJLyoKKwkJCQkgKiBLZWVwIHByb2Nlc3NpbmcgZW50cmllcyBpbiB0aGUgY2FsbGJhY2sgbGlzdAorCQkJCSAqIHVudGlsIHdlIGNvbWUgYXJvdW5kIGFuZCBpdCBpcyBlbXB0eS4gIFdlCisJCQkJICogbmVlZCB0byBhdG9taWNhbGx5IHNlZSB0aGF0IHRoZSBsaXN0IGlzCisJCQkJICogZW1wdHkgYW5kIGNoYW5nZSB0aGUgc3RhdGUgdG8gRElSVFkgc28gdGhhdAorCQkJCSAqIHdlIGRvbid0IG1pc3MgYW55IG1vcmUgY2FsbGJhY2tzIGJlaW5nIGFkZGVkLgorCQkJCSAqLworCQkJCXMgPSBMT0dfTE9DSyhsb2cpOworCQkJfSBlbHNlIHsKKwkJCQlpb2Vycm9ycysrOworCQkJfQorCQkJY2IgPSBpY2xvZy0+aWNfY2FsbGJhY2s7CisKKwkJCXdoaWxlIChjYiAhPSAwKSB7CisJCQkJaWNsb2ctPmljX2NhbGxiYWNrX3RhaWwgPSAmKGljbG9nLT5pY19jYWxsYmFjayk7CisJCQkJaWNsb2ctPmljX2NhbGxiYWNrID0gTlVMTDsKKwkJCQlMT0dfVU5MT0NLKGxvZywgcyk7CisKKwkJCQkvKiBwZXJmb3JtIGNhbGxiYWNrcyBpbiB0aGUgb3JkZXIgZ2l2ZW4gKi8KKwkJCQlmb3IgKDsgY2IgIT0gMDsgY2IgPSBjYl9uZXh0KSB7CisJCQkJCWNiX25leHQgPSBjYi0+Y2JfbmV4dDsKKwkJCQkJY2ItPmNiX2Z1bmMoY2ItPmNiX2FyZywgYWJvcnRlZCk7CisJCQkJfQorCQkJCXMgPSBMT0dfTE9DSyhsb2cpOworCQkJCWNiID0gaWNsb2ctPmljX2NhbGxiYWNrOworCQkJfQorCisJCQlsb29wZGlkY2FsbGJhY2tzKys7CisJCQlmdW5jZGlkY2FsbGJhY2tzKys7CisKKwkJCUFTU0VSVChpY2xvZy0+aWNfY2FsbGJhY2sgPT0gMCk7CisJCQlpZiAoIShpY2xvZy0+aWNfc3RhdGUgJiBYTE9HX1NUQVRFX0lPRVJST1IpKQorCQkJCWljbG9nLT5pY19zdGF0ZSA9IFhMT0dfU1RBVEVfRElSVFk7CisKKwkJCS8qCisJCQkgKiBUcmFuc2l0aW9uIGZyb20gRElSVFkgdG8gQUNUSVZFIGlmIGFwcGxpY2FibGUuCisJCQkgKiBOT1AgaWYgU1RBVEVfSU9FUlJPUi4KKwkJCSAqLworCQkJeGxvZ19zdGF0ZV9jbGVhbl9sb2cobG9nKTsKKworCQkJLyogd2FrZSB1cCB0aHJlYWRzIHdhaXRpbmcgaW4geGZzX2xvZ19mb3JjZSgpICovCisJCQlzdl9icm9hZGNhc3QoJmljbG9nLT5pY19mb3JjZXNlbWEpOworCisJCQlpY2xvZyA9IGljbG9nLT5pY19uZXh0OworCQl9IHdoaWxlIChmaXJzdF9pY2xvZyAhPSBpY2xvZyk7CisJCWlmIChyZXBlYXRzICYmIChyZXBlYXRzICUgMTApID09IDApIHsKKwkJCXhmc19mc19jbW5fZXJyKENFX1dBUk4sIGxvZy0+bF9tcCwKKwkJCQkieGxvZ19zdGF0ZV9kb19jYWxsYmFjazogbG9vcGluZyAlZCIsIHJlcGVhdHMpOworCQl9CisJfSB3aGlsZSAoIWlvZXJyb3JzICYmIGxvb3BkaWRjYWxsYmFja3MpOworCisJLyoKKwkgKiBtYWtlIG9uZSBsYXN0IGdhc3AgYXR0ZW1wdCB0byBzZWUgaWYgaWNsb2dzIGFyZSBiZWluZyBsZWZ0IGluCisJICogbGltYm8uLgorCSAqLworI2lmZGVmIERFQlVHCisJaWYgKGZ1bmNkaWRjYWxsYmFja3MpIHsKKwkJZmlyc3RfaWNsb2cgPSBpY2xvZyA9IGxvZy0+bF9pY2xvZzsKKwkJZG8geworCQkJQVNTRVJUKGljbG9nLT5pY19zdGF0ZSAhPSBYTE9HX1NUQVRFX0RPX0NBTExCQUNLKTsKKwkJCS8qCisJCQkgKiBUZXJtaW5hdGUgdGhlIGxvb3AgaWYgaWNsb2dzIGFyZSBmb3VuZCBpbiBzdGF0ZXMKKwkJCSAqIHdoaWNoIHdpbGwgY2F1c2Ugb3RoZXIgdGhyZWFkcyB0byBjbGVhbiB1cCBpY2xvZ3MuCisJCQkgKgorCQkJICogU1lOQ0lORyAtIGkvbyBjb21wbGV0aW9uIHdpbGwgZ28gdGhyb3VnaCBsb2dzCisJCQkgKiBET05FX1NZTkMgLSBpbnRlcnJ1cHQgdGhyZWFkIHNob3VsZCBiZSB3YWl0aW5nIGZvcgorCQkJICogICAgICAgICAgICAgIExPR19MT0NLCisJCQkgKiBJT0VSUk9SIC0gZ2l2ZSB1cCBob3BlIGFsbCB5ZSB3aG8gZW50ZXIgaGVyZQorCQkJICovCisJCQlpZiAoaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfV0FOVF9TWU5DIHx8CisJCQkgICAgaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfU1lOQ0lORyB8fAorCQkJICAgIGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX0RPTkVfU1lOQyB8fAorCQkJICAgIGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX0lPRVJST1IgKQorCQkJCWJyZWFrOworCQkJaWNsb2cgPSBpY2xvZy0+aWNfbmV4dDsKKwkJfSB3aGlsZSAoZmlyc3RfaWNsb2cgIT0gaWNsb2cpOworCX0KKyNlbmRpZgorCisJaWYgKGxvZy0+bF9pY2xvZy0+aWNfc3RhdGUgJiAoWExPR19TVEFURV9BQ1RJVkV8WExPR19TVEFURV9JT0VSUk9SKSkgeworCQlmbHVzaGNudCA9IGxvZy0+bF9mbHVzaGNudDsKKwkJbG9nLT5sX2ZsdXNoY250ID0gMDsKKwl9CisJTE9HX1VOTE9DSyhsb2csIHMpOworCXdoaWxlIChmbHVzaGNudC0tKQorCQl2c2VtYSgmbG9nLT5sX2ZsdXNoc2VtYSk7Cit9CS8qIHhsb2dfc3RhdGVfZG9fY2FsbGJhY2sgKi8KKworCisvKgorICogRmluaXNoIHRyYW5zaXRpb25pbmcgdGhpcyBpY2xvZyB0byB0aGUgZGlydHkgc3RhdGUuCisgKgorICogTWFrZSBzdXJlIHRoYXQgd2UgY29tcGxldGVseSBleGVjdXRlIHRoaXMgcm91dGluZSBvbmx5IHdoZW4gdGhpcyBpcworICogdGhlIGxhc3QgY2FsbCB0byB0aGUgaWNsb2cuICBUaGVyZSBpcyBhIGdvb2QgY2hhbmNlIHRoYXQgaWNsb2cgZmx1c2hlcywKKyAqIHdoZW4gd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgcGh5c2ljYWwgbG9nLCBnZXQgdHVybmVkIGludG8gMiBzZXBhcmF0ZQorICogY2FsbHMgdG8gYndyaXRlLiAgSGVuY2UsIG9uZSBpY2xvZyBmbHVzaCBjb3VsZCBnZW5lcmF0ZSB0d28gY2FsbHMgdG8gdGhpcworICogcm91dGluZS4gIEJ5IHVzaW5nIHRoZSByZWZlcmVuY2UgY291bnQgYndyaXRlY250LCB3ZSBndWFyYW50ZWUgdGhhdCBvbmx5CisgKiB0aGUgc2Vjb25kIGNvbXBsZXRpb24gZ29lcyB0aHJvdWdoLgorICoKKyAqIENhbGxiYWNrcyBjb3VsZCB0YWtlIHRpbWUsIHNvIHRoZXkgYXJlIGRvbmUgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhlCisgKiBnbG9iYWwgc3RhdGUgbWFjaGluZSBsb2cgbG9jay4gIEFzc3VtZSB0aGF0IHRoZSBjYWxscyB0byBjdnNlbWEgd29uJ3QKKyAqIHRha2UgYSBsb25nIHRpbWUuICBBdCBsZWFzdCB3ZSBrbm93IGl0IHdvbid0IHNsZWVwLgorICovCit2b2lkCit4bG9nX3N0YXRlX2RvbmVfc3luY2luZygKKwl4bG9nX2luX2NvcmVfdAkqaWNsb2csCisJaW50CQlhYm9ydGVkKQoreworCXhsb2dfdAkJICAgKmxvZyA9IGljbG9nLT5pY19sb2c7CisJU1BMREVDTChzKTsKKworCXMgPSBMT0dfTE9DSyhsb2cpOworCisJQVNTRVJUKGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX1NZTkNJTkcgfHwKKwkgICAgICAgaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfSU9FUlJPUik7CisJQVNTRVJUKGljbG9nLT5pY19yZWZjbnQgPT0gMCk7CisJQVNTRVJUKGljbG9nLT5pY19id3JpdGVjbnQgPT0gMSB8fCBpY2xvZy0+aWNfYndyaXRlY250ID09IDIpOworCisKKwkvKgorCSAqIElmIHdlIGdvdCBhbiBlcnJvciwgZWl0aGVyIG9uIHRoZSBmaXJzdCBidWZmZXIsIG9yIGluIHRoZSBjYXNlIG9mCisJICogc3BsaXQgbG9nIHdyaXRlcywgb24gdGhlIHNlY29uZCwgd2UgbWFyayBBTEwgaWNsb2dzIFNUQVRFX0lPRVJST1IsCisJICogYW5kIG5vbmUgc2hvdWxkIGV2ZXIgYmUgYXR0ZW1wdGVkIHRvIGJlIHdyaXR0ZW4gdG8gZGlzaworCSAqIGFnYWluLgorCSAqLworCWlmIChpY2xvZy0+aWNfc3RhdGUgIT0gWExPR19TVEFURV9JT0VSUk9SKSB7CisJCWlmICgtLWljbG9nLT5pY19id3JpdGVjbnQgPT0gMSkgeworCQkJTE9HX1VOTE9DSyhsb2csIHMpOworCQkJcmV0dXJuOworCQl9CisJCWljbG9nLT5pY19zdGF0ZSA9IFhMT0dfU1RBVEVfRE9ORV9TWU5DOworCX0KKworCS8qCisJICogU29tZW9uZSBjb3VsZCBiZSBzbGVlcGluZyBwcmlvciB0byB3cml0aW5nIG91dCB0aGUgbmV4dAorCSAqIGljbG9nIGJ1ZmZlciwgd2Ugd2FrZSB0aGVtIGFsbCwgb25lIHdpbGwgZ2V0IHRvIGRvIHRoZQorCSAqIEkvTywgdGhlIG90aGVycyBnZXQgdG8gd2FpdCBmb3IgdGhlIHJlc3VsdC4KKwkgKi8KKwlzdl9icm9hZGNhc3QoJmljbG9nLT5pY193cml0ZXNlbWEpOworCUxPR19VTkxPQ0sobG9nLCBzKTsKKwl4bG9nX3N0YXRlX2RvX2NhbGxiYWNrKGxvZywgYWJvcnRlZCwgaWNsb2cpOwkvKiBhbHNvIGNsZWFucyBsb2cgKi8KK30JLyogeGxvZ19zdGF0ZV9kb25lX3N5bmNpbmcgKi8KKworCisvKgorICogSWYgdGhlIGhlYWQgb2YgdGhlIGluLWNvcmUgbG9nIHJpbmcgaXMgbm90IChBQ1RJVkUgb3IgRElSVFkpLCB0aGVuIHdlIG11c3QKKyAqIHNsZWVwLiAgVGhlIGZsdXNoIHNlbWFwaG9yZSBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiBpbi1jb3JlIGJ1ZmZlcnMgYW5kCisgKiBkZWNyZW1lbnRlZCBhcm91bmQgZGlzayBzeW5jaW5nLiAgVGhlcmVmb3JlLCBpZiBhbGwgYnVmZmVycyBhcmUgc3luY2luZywKKyAqIHRoaXMgc2VtYXBob3JlIHdpbGwgY2F1c2UgbmV3IHdyaXRlcyB0byBzbGVlcCB1bnRpbCBhIHN5bmMgY29tcGxldGVzLgorICogT3RoZXJ3aXNlLCB0aGlzIGNvZGUganVzdCBkb2VzIHAoKSBmb2xsb3dlZCBieSB2KCkuICBUaGlzIGFwcHJveGltYXRlcworICogYSBzbGVlcC93YWtldXAgZXhjZXB0IHdlIGNhbid0IHJhY2UuCisgKgorICogVGhlIGluLWNvcmUgbG9ncyBhcmUgdXNlZCBpbiBhIGNpcmN1bGFyIGZhc2hpb24uIFRoZXkgYXJlIG5vdCB1c2VkCisgKiBvdXQtb2Ytb3JkZXIgZXZlbiB3aGVuIGFuIGljbG9nIHBhc3QgdGhlIGhlYWQgaXMgZnJlZS4KKyAqCisgKiByZXR1cm46CisgKgkqIGxvZ19vZmZzZXQgd2hlcmUgeGxvZ193cml0ZSgpIGNhbiBzdGFydCB3cml0aW5nIGludG8gdGhlIGluLWNvcmUKKyAqCQlsb2cncyBkYXRhIHNwYWNlLgorICoJKiBpbi1jb3JlIGxvZyBwb2ludGVyIHRvIHdoaWNoIHhsb2dfd3JpdGUoKSBzaG91bGQgd3JpdGUuCisgKgkqIGJvb2xlYW4gaW5kaWNhdGluZyB0aGlzIGlzIGEgY29udGludWVkIHdyaXRlIHRvIGFuIGluLWNvcmUgbG9nLgorICoJCUlmIHRoaXMgaXMgdGhlIGxhc3Qgd3JpdGUsIHRoZW4gdGhlIGluLWNvcmUgbG9nJ3Mgb2Zmc2V0IGZpZWxkCisgKgkJbmVlZHMgdG8gYmUgaW5jcmVtZW50ZWQsIGRlcGVuZGluZyBvbiB0aGUgYW1vdW50IG9mIGRhdGEgd2hpY2gKKyAqCQlpcyBjb3BpZWQuCisgKi8KK2ludAoreGxvZ19zdGF0ZV9nZXRfaWNsb2dfc3BhY2UoeGxvZ190CSAgKmxvZywKKwkJCSAgIGludAkJICBsZW4sCisJCQkgICB4bG9nX2luX2NvcmVfdCAqKmljbG9ncCwKKwkJCSAgIHhsb2dfdGlja2V0X3QgICp0aWNrZXQsCisJCQkgICBpbnQJCSAgKmNvbnRpbnVlZF93cml0ZSwKKwkJCSAgIGludAkJICAqbG9nb2Zmc2V0cCkKK3sKKwlTUExERUNMKHMpOworCWludAkJICBsb2dfb2Zmc2V0OworCXhsb2dfcmVjX2hlYWRlcl90ICpoZWFkOworCXhsb2dfaW5fY29yZV90CSAgKmljbG9nOworCWludAkJICBlcnJvcjsKKworcmVzdGFydDoKKwlzID0gTE9HX0xPQ0sobG9nKTsKKwlpZiAoWExPR19GT1JDRURfU0hVVERPV04obG9nKSkgeworCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwl9CisKKwlpY2xvZyA9IGxvZy0+bF9pY2xvZzsKKwlpZiAoISAoaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfQUNUSVZFKSkgeworCQlsb2ctPmxfZmx1c2hjbnQrKzsKKwkJTE9HX1VOTE9DSyhsb2csIHMpOworCQl4bG9nX3RyYWNlX2ljbG9nKGljbG9nLCBYTE9HX1RSQUNFX1NMRUVQX0ZMVVNIKTsKKwkJWEZTX1NUQVRTX0lOQyh4c19sb2dfbm9pY2xvZ3MpOworCQkvKiBFbnN1cmUgdGhhdCBsb2cgd3JpdGVzIGhhcHBlbiAqLworCQlwc2VtYSgmbG9nLT5sX2ZsdXNoc2VtYSwgUElOT0QpOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCUFTU0VSVChpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9BQ1RJVkUpOworCWhlYWQgPSAmaWNsb2ctPmljX2hlYWRlcjsKKworCWljbG9nLT5pY19yZWZjbnQrKzsJCQkvKiBwcmV2ZW50cyBzeW5jICovCisJbG9nX29mZnNldCA9IGljbG9nLT5pY19vZmZzZXQ7CisKKwkvKiBPbiB0aGUgMXN0IHdyaXRlIHRvIGFuIGljbG9nLCBmaWd1cmUgb3V0IGxzbi4gIFRoaXMgd29ya3MKKwkgKiBpZiBpY2xvZ3MgbWFya2VkIFhMT0dfU1RBVEVfV0FOVF9TWU5DIGFsd2F5cyB3cml0ZSBvdXQgd2hhdCB0aGV5IGFyZQorCSAqIGNvbW1pdHRpbmcgdG8uICBJZiB0aGUgb2Zmc2V0IGlzIHNldCwgdGhhdCdzIGhvdyBtYW55IGJsb2NrcworCSAqIG11c3QgYmUgd3JpdHRlbi4KKwkgKi8KKwlpZiAobG9nX29mZnNldCA9PSAwKSB7CisJCXRpY2tldC0+dF9jdXJyX3JlcyAtPSBsb2ctPmxfaWNsb2dfaHNpemU7CisJCUlOVF9TRVQoaGVhZC0+aF9jeWNsZSwgQVJDSF9DT05WRVJULCBsb2ctPmxfY3Vycl9jeWNsZSk7CisJCUFTU0lHTl9MU04oaGVhZC0+aF9sc24sIGxvZyk7CisJCUFTU0VSVChsb2ctPmxfY3Vycl9ibG9jayA+PSAwKTsKKwl9CisKKwkvKiBJZiB0aGVyZSBpcyBlbm91Z2ggcm9vbSB0byB3cml0ZSBldmVyeXRoaW5nLCB0aGVuIGRvIGl0LiAgT3RoZXJ3aXNlLAorCSAqIGNsYWltIHRoZSByZXN0IG9mIHRoZSByZWdpb24gYW5kIG1ha2Ugc3VyZSB0aGUgWExPR19TVEFURV9XQU5UX1NZTkMKKwkgKiBiaXQgaXMgb24sIHNvIHRoaXMgd2lsbCBnZXQgZmx1c2hlZCBvdXQuICBEb24ndCB1cGRhdGUgaWNfb2Zmc2V0CisJICogdW50aWwgeW91IGtub3cgZXhhY3RseSBob3cgbWFueSBieXRlcyBnZXQgY29waWVkLiAgVGhlcmVmb3JlLCB3YWl0CisJICogdW50aWwgbGF0ZXIgdG8gdXBkYXRlIGljX29mZnNldC4KKwkgKgorCSAqIHhsb2dfd3JpdGUoKSBhbGdvcml0aG0gYXNzdW1lcyB0aGF0IGF0IGxlYXN0IDIgeGxvZ19vcF9oZWFkZXJfdCdzCisJICogY2FuIGZpdCBpbnRvIHJlbWFpbmluZyBkYXRhIHNlY3Rpb24uCisJICovCisJaWYgKGljbG9nLT5pY19zaXplIC0gaWNsb2ctPmljX29mZnNldCA8IDIqc2l6ZW9mKHhsb2dfb3BfaGVhZGVyX3QpKSB7CisJCXhsb2dfc3RhdGVfc3dpdGNoX2ljbG9ncyhsb2csIGljbG9nLCBpY2xvZy0+aWNfc2l6ZSk7CisKKwkJLyogSWYgSSdtIHRoZSBvbmx5IG9uZSB3cml0aW5nIHRvIHRoaXMgaWNsb2csIHN5bmMgaXQgdG8gZGlzayAqLworCQlpZiAoaWNsb2ctPmljX3JlZmNudCA9PSAxKSB7CisJCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJCQlpZiAoKGVycm9yID0geGxvZ19zdGF0ZV9yZWxlYXNlX2ljbG9nKGxvZywgaWNsb2cpKSkKKwkJCQlyZXR1cm4gKGVycm9yKTsKKwkJfSBlbHNlIHsKKwkJCWljbG9nLT5pY19yZWZjbnQtLTsKKwkJCUxPR19VTkxPQ0sobG9nLCBzKTsKKwkJfQorCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJLyogRG8gd2UgaGF2ZSBlbm91Z2ggcm9vbSB0byB3cml0ZSB0aGUgZnVsbCBhbW91bnQgaW4gdGhlIHJlbWFpbmRlcgorCSAqIG9mIHRoaXMgaWNsb2c/ICBPciBtdXN0IHdlIGNvbnRpbnVlIGEgd3JpdGUgb24gdGhlIG5leHQgaWNsb2cgYW5kCisJICogbWFyayB0aGlzIGljbG9nIGFzIGNvbXBsZXRlbHkgdGFrZW4/ICBJbiB0aGUgY2FzZSB3aGVyZSB3ZSBzd2l0Y2gKKwkgKiBpY2xvZ3MgKHRvIG1hcmsgaXQgdGFrZW4pLCB0aGlzIHBhcnRpY3VsYXIgaWNsb2cgd2lsbCByZWxlYXNlL3N5bmMKKwkgKiB0byBkaXNrIGluIHhsb2dfd3JpdGUoKS4KKwkgKi8KKwlpZiAobGVuIDw9IGljbG9nLT5pY19zaXplIC0gaWNsb2ctPmljX29mZnNldCkgeworCQkqY29udGludWVkX3dyaXRlID0gMDsKKwkJaWNsb2ctPmljX29mZnNldCArPSBsZW47CisJfSBlbHNlIHsKKwkJKmNvbnRpbnVlZF93cml0ZSA9IDE7CisJCXhsb2dfc3RhdGVfc3dpdGNoX2ljbG9ncyhsb2csIGljbG9nLCBpY2xvZy0+aWNfc2l6ZSk7CisJfQorCSppY2xvZ3AgPSBpY2xvZzsKKworCUFTU0VSVChpY2xvZy0+aWNfb2Zmc2V0IDw9IGljbG9nLT5pY19zaXplKTsKKwlMT0dfVU5MT0NLKGxvZywgcyk7CisKKwkqbG9nb2Zmc2V0cCA9IGxvZ19vZmZzZXQ7CisJcmV0dXJuIDA7Cit9CS8qIHhsb2dfc3RhdGVfZ2V0X2ljbG9nX3NwYWNlICovCisKKy8qCisgKiBBdG9taWNhbGx5IGdldCB0aGUgbG9nIHNwYWNlIHJlcXVpcmVkIGZvciBhIGxvZyB0aWNrZXQuCisgKgorICogT25jZSBhIHRpY2tldCBnZXRzIHB1dCBvbnRvIHRoZSByZXNlcnZlcSwgaXQgd2lsbCBvbmx5IHJldHVybiBhZnRlcgorICogdGhlIG5lZWRlZCByZXNlcnZhdGlvbiBpcyBzYXRpc2ZpZWQuCisgKi8KK1NUQVRJQyBpbnQKK3hsb2dfZ3JhbnRfbG9nX3NwYWNlKHhsb2dfdAkgICAqbG9nLAorCQkgICAgIHhsb2dfdGlja2V0X3QgKnRpYykKK3sKKwlpbnQJCSBmcmVlX2J5dGVzOworCWludAkJIG5lZWRfYnl0ZXM7CisJU1BMREVDTChzKTsKKyNpZmRlZiBERUJVRworCXhmc19sc25fdAkgdGFpbF9sc247CisjZW5kaWYKKworCisjaWZkZWYgREVCVUcKKwlpZiAobG9nLT5sX2ZsYWdzICYgWExPR19BQ1RJVkVfUkVDT1ZFUlkpCisJCXBhbmljKCJncmFudCBSZWNvdmVyeSBwcm9ibGVtIik7CisjZW5kaWYKKworCS8qIElzIHRoZXJlIHNwYWNlIG9yIGRvIHdlIG5lZWQgdG8gc2xlZXA/ICovCisJcyA9IEdSQU5UX0xPQ0sobG9nKTsKKwl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGljLCAieGxvZ19ncmFudF9sb2dfc3BhY2U6IGVudGVyIik7CisKKwkvKiBzb21ldGhpbmcgaXMgYWxyZWFkeSBzbGVlcGluZzsgaW5zZXJ0IG5ldyB0cmFuc2FjdGlvbiBhdCBlbmQgKi8KKwlpZiAobG9nLT5sX3Jlc2VydmVfaGVhZHEpIHsKKwkJWExPR19JTlNfVElDS0VUUShsb2ctPmxfcmVzZXJ2ZV9oZWFkcSwgdGljKTsKKwkJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpYywKKwkJCQkgICAgInhsb2dfZ3JhbnRfbG9nX3NwYWNlOiBzbGVlcCAxIik7CisJCS8qCisJCSAqIEdvdHRhIGNoZWNrIHRoaXMgYmVmb3JlIGdvaW5nIHRvIHNsZWVwLCB3aGlsZSB3ZSdyZQorCQkgKiBob2xkaW5nIHRoZSBncmFudCBsb2NrLgorCQkgKi8KKwkJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpCisJCQlnb3RvIGVycm9yX3JldHVybjsKKworCQlYRlNfU1RBVFNfSU5DKHhzX3NsZWVwX2xvZ3NwYWNlKTsKKwkJc3Zfd2FpdCgmdGljLT50X3NlbWEsIFBJTk9EfFBMVFdBSVQsICZsb2ctPmxfZ3JhbnRfbG9jaywgcyk7CisJCS8qCisJCSAqIElmIHdlIGdvdCBhbiBlcnJvciwgYW5kIHRoZSBmaWxlc3lzdGVtIGlzIHNodXR0aW5nIGRvd24sCisJCSAqIHdlJ2xsIGNhdGNoIGl0IGRvd24gYmVsb3cuIFNvIGp1c3QgY29udGludWUuLi4KKwkJICovCisJCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsCisJCQkJICAgICJ4bG9nX2dyYW50X2xvZ19zcGFjZTogd2FrZSAxIik7CisJCXMgPSBHUkFOVF9MT0NLKGxvZyk7CisJfQorCWlmICh0aWMtPnRfZmxhZ3MgJiBYRlNfTE9HX1BFUk1fUkVTRVJWKQorCQluZWVkX2J5dGVzID0gdGljLT50X3VuaXRfcmVzKnRpYy0+dF9vY250OworCWVsc2UKKwkJbmVlZF9ieXRlcyA9IHRpYy0+dF91bml0X3JlczsKKworcmVkbzoKKwlpZiAoWExPR19GT1JDRURfU0hVVERPV04obG9nKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwlmcmVlX2J5dGVzID0geGxvZ19zcGFjZV9sZWZ0KGxvZywgbG9nLT5sX2dyYW50X3Jlc2VydmVfY3ljbGUsCisJCQkJICAgICBsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyk7CisJaWYgKGZyZWVfYnl0ZXMgPCBuZWVkX2J5dGVzKSB7CisJCWlmICgodGljLT50X2ZsYWdzICYgWExPR19USUNfSU5fUSkgPT0gMCkKKwkJCVhMT0dfSU5TX1RJQ0tFVFEobG9nLT5sX3Jlc2VydmVfaGVhZHEsIHRpYyk7CisJCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsCisJCQkJICAgICJ4bG9nX2dyYW50X2xvZ19zcGFjZTogc2xlZXAgMiIpOworCQlYRlNfU1RBVFNfSU5DKHhzX3NsZWVwX2xvZ3NwYWNlKTsKKwkJc3Zfd2FpdCgmdGljLT50X3NlbWEsIFBJTk9EfFBMVFdBSVQsICZsb2ctPmxfZ3JhbnRfbG9jaywgcyk7CisKKwkJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpIHsKKwkJCXMgPSBHUkFOVF9MT0NLKGxvZyk7CisJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCisJCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsCisJCQkJICAgICJ4bG9nX2dyYW50X2xvZ19zcGFjZTogd2FrZSAyIik7CisJCXhsb2dfZ3JhbnRfcHVzaF9haWwobG9nLT5sX21wLCBuZWVkX2J5dGVzKTsKKwkJcyA9IEdSQU5UX0xPQ0sobG9nKTsKKwkJZ290byByZWRvOworCX0gZWxzZSBpZiAodGljLT50X2ZsYWdzICYgWExPR19USUNfSU5fUSkKKwkJWExPR19ERUxfVElDS0VUUShsb2ctPmxfcmVzZXJ2ZV9oZWFkcSwgdGljKTsKKworCS8qIHdlJ3ZlIGdvdCBlbm91Z2ggc3BhY2UgKi8KKwlYTE9HX0dSQU5UX0FERF9TUEFDRShsb2csIG5lZWRfYnl0ZXMsICd3Jyk7CisJWExPR19HUkFOVF9BRERfU1BBQ0UobG9nLCBuZWVkX2J5dGVzLCAncicpOworI2lmZGVmIERFQlVHCisJdGFpbF9sc24gPSBsb2ctPmxfdGFpbF9sc247CisJLyoKKwkgKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGdyYW50IHdyaXRlIGhlYWQgZGlkbid0IGp1c3Qgb3ZlciBsYXAgdGhlCisJICogdGFpbC4gIElmIHRoZSBjeWNsZXMgYXJlIHRoZSBzYW1lLCB3ZSBjYW4ndCBiZSBvdmVybGFwcGluZy4KKwkgKiBPdGhlcndpc2UsIG1ha2Ugc3VyZSB0aGF0IHRoZSBjeWNsZXMgZGlmZmVyIGJ5IGV4YWN0bHkgb25lIGFuZAorCSAqIGNoZWNrIHRoZSBieXRlIGNvdW50LgorCSAqLworCWlmIChDWUNMRV9MU04odGFpbF9sc24pICE9IGxvZy0+bF9ncmFudF93cml0ZV9jeWNsZSkgeworCQlBU1NFUlQobG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlLTEgPT0gQ1lDTEVfTFNOKHRhaWxfbHNuKSk7CisJCUFTU0VSVChsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgPD0gQkJUT0IoQkxPQ0tfTFNOKHRhaWxfbHNuKSkpOworCX0KKyNlbmRpZgorCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsICJ4bG9nX2dyYW50X2xvZ19zcGFjZTogZXhpdCIpOworCXhsb2dfdmVyaWZ5X2dyYW50X2hlYWQobG9nLCAxKTsKKwlHUkFOVF9VTkxPQ0sobG9nLCBzKTsKKwlyZXR1cm4gMDsKKworIGVycm9yX3JldHVybjoKKwlpZiAodGljLT50X2ZsYWdzICYgWExPR19USUNfSU5fUSkKKwkJWExPR19ERUxfVElDS0VUUShsb2ctPmxfcmVzZXJ2ZV9oZWFkcSwgdGljKTsKKwl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGljLCAieGxvZ19ncmFudF9sb2dfc3BhY2U6IGVycl9yZXQiKTsKKwkvKgorCSAqIElmIHdlIGFyZSBmYWlsaW5nLCBtYWtlIHN1cmUgdGhlIHRpY2tldCBkb2Vzbid0IGhhdmUgYW55CisJICogY3VycmVudCByZXNlcnZhdGlvbnMuIFdlIGRvbid0IHdhbnQgdG8gYWRkIHRoaXMgYmFjayB3aGVuCisJICogdGhlIHRpY2tldC90cmFuc2FjdGlvbiBnZXRzIGNhbmNlbGxlZC4KKwkgKi8KKwl0aWMtPnRfY3Vycl9yZXMgPSAwOworCXRpYy0+dF9jbnQgPSAwOyAvKiB1bmdyYW50IHdpbGwgZ2l2ZSBiYWNrIHVuaXRfcmVzICogdF9jbnQuICovCisJR1JBTlRfVU5MT0NLKGxvZywgcyk7CisJcmV0dXJuIFhGU19FUlJPUihFSU8pOworfQkvKiB4bG9nX2dyYW50X2xvZ19zcGFjZSAqLworCisKKy8qCisgKiBSZXBsZW5pc2ggdGhlIGJ5dGUgcmVzZXJ2YXRpb24gcmVxdWlyZWQgYnkgbW92aW5nIHRoZSBncmFudCB3cml0ZSBoZWFkLgorICoKKyAqCisgKi8KK1NUQVRJQyBpbnQKK3hsb2dfcmVncmFudF93cml0ZV9sb2dfc3BhY2UoeGxvZ190CSAgICpsb2csCisJCQkgICAgIHhsb2dfdGlja2V0X3QgKnRpYykKK3sKKwlTUExERUNMKHMpOworCWludAkJZnJlZV9ieXRlcywgbmVlZF9ieXRlczsKKwl4bG9nX3RpY2tldF90CSpudGljOworI2lmZGVmIERFQlVHCisJeGZzX2xzbl90CXRhaWxfbHNuOworI2VuZGlmCisKKwl0aWMtPnRfY3Vycl9yZXMgPSB0aWMtPnRfdW5pdF9yZXM7CisKKwlpZiAodGljLT50X2NudCA+IDApCisJCXJldHVybiAoMCk7CisKKyNpZmRlZiBERUJVRworCWlmIChsb2ctPmxfZmxhZ3MgJiBYTE9HX0FDVElWRV9SRUNPVkVSWSkKKwkJcGFuaWMoInJlZ3JhbnQgUmVjb3ZlcnkgcHJvYmxlbSIpOworI2VuZGlmCisKKwlzID0gR1JBTlRfTE9DSyhsb2cpOworCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsICJ4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlOiBlbnRlciIpOworCisJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJLyogSWYgdGhlcmUgYXJlIG90aGVyIHdhaXRlcnMgb24gdGhlIHF1ZXVlIHRoZW4gZ2l2ZSB0aGVtIGEKKwkgKiBjaGFuY2UgYXQgbG9nc3BhY2UgYmVmb3JlIHVzLiBXYWtlIHVwIHRoZSBmaXJzdCB3YWl0ZXJzLAorCSAqIGlmIHdlIGRvIG5vdCB3YWtlIHVwIGFsbCB0aGUgd2FpdGVycyB0aGVuIGdvIHRvIHNsZWVwIHdhaXRpbmcKKwkgKiBmb3IgbW9yZSBmcmVlIHNwYWNlLCBvdGhlcndpc2UgdHJ5IHRvIGdldCBzb21lIHNwYWNlIGZvcgorCSAqIHRoaXMgdHJhbnNhY3Rpb24uCisJICovCisKKwlpZiAoKG50aWMgPSBsb2ctPmxfd3JpdGVfaGVhZHEpKSB7CisJCWZyZWVfYnl0ZXMgPSB4bG9nX3NwYWNlX2xlZnQobG9nLCBsb2ctPmxfZ3JhbnRfd3JpdGVfY3ljbGUsCisJCQkJCSAgICAgbG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzKTsKKwkJZG8geworCQkJQVNTRVJUKG50aWMtPnRfZmxhZ3MgJiBYTE9HX1RJQ19QRVJNX1JFU0VSVik7CisKKwkJCWlmIChmcmVlX2J5dGVzIDwgbnRpYy0+dF91bml0X3JlcykKKwkJCQlicmVhazsKKwkJCWZyZWVfYnl0ZXMgLT0gbnRpYy0+dF91bml0X3JlczsKKwkJCXN2X3NpZ25hbCgmbnRpYy0+dF9zZW1hKTsKKwkJCW50aWMgPSBudGljLT50X25leHQ7CisJCX0gd2hpbGUgKG50aWMgIT0gbG9nLT5sX3dyaXRlX2hlYWRxKTsKKworCQlpZiAobnRpYyAhPSBsb2ctPmxfd3JpdGVfaGVhZHEpIHsKKwkJCWlmICgodGljLT50X2ZsYWdzICYgWExPR19USUNfSU5fUSkgPT0gMCkKKwkJCQlYTE9HX0lOU19USUNLRVRRKGxvZy0+bF93cml0ZV9oZWFkcSwgdGljKTsKKworCQkJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpYywKKwkJCQkgICAgInhsb2dfcmVncmFudF93cml0ZV9sb2dfc3BhY2U6IHNsZWVwIDEiKTsKKwkJCVhGU19TVEFUU19JTkMoeHNfc2xlZXBfbG9nc3BhY2UpOworCQkJc3Zfd2FpdCgmdGljLT50X3NlbWEsIFBJTk9EfFBMVFdBSVQsCisJCQkJJmxvZy0+bF9ncmFudF9sb2NrLCBzKTsKKworCQkJLyogSWYgd2UncmUgc2h1dHRpbmcgZG93biwgdGhpcyB0aWMgaXMgYWxyZWFkeQorCQkJICogb2ZmIHRoZSBxdWV1ZSAqLworCQkJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpIHsKKwkJCQlzID0gR1JBTlRfTE9DSyhsb2cpOworCQkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQkJfQorCisJCQl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGljLAorCQkJCSAgICAieGxvZ19yZWdyYW50X3dyaXRlX2xvZ19zcGFjZTogd2FrZSAxIik7CisJCQl4bG9nX2dyYW50X3B1c2hfYWlsKGxvZy0+bF9tcCwgdGljLT50X3VuaXRfcmVzKTsKKwkJCXMgPSBHUkFOVF9MT0NLKGxvZyk7CisJCX0KKwl9CisKKwluZWVkX2J5dGVzID0gdGljLT50X3VuaXRfcmVzOworCityZWRvOgorCWlmIChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKQorCQlnb3RvIGVycm9yX3JldHVybjsKKworCWZyZWVfYnl0ZXMgPSB4bG9nX3NwYWNlX2xlZnQobG9nLCBsb2ctPmxfZ3JhbnRfd3JpdGVfY3ljbGUsCisJCQkJICAgICBsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXMpOworCWlmIChmcmVlX2J5dGVzIDwgbmVlZF9ieXRlcykgeworCQlpZiAoKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX0lOX1EpID09IDApCisJCQlYTE9HX0lOU19USUNLRVRRKGxvZy0+bF93cml0ZV9oZWFkcSwgdGljKTsKKwkJWEZTX1NUQVRTX0lOQyh4c19zbGVlcF9sb2dzcGFjZSk7CisJCXN2X3dhaXQoJnRpYy0+dF9zZW1hLCBQSU5PRHxQTFRXQUlULCAmbG9nLT5sX2dyYW50X2xvY2ssIHMpOworCisJCS8qIElmIHdlJ3JlIHNodXR0aW5nIGRvd24sIHRoaXMgdGljIGlzIGFscmVhZHkgb2ZmIHRoZSBxdWV1ZSAqLworCQlpZiAoWExPR19GT1JDRURfU0hVVERPV04obG9nKSkgeworCQkJcyA9IEdSQU5UX0xPQ0sobG9nKTsKKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQl9CisKKwkJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpYywKKwkJCQkgICAgInhsb2dfcmVncmFudF93cml0ZV9sb2dfc3BhY2U6IHdha2UgMiIpOworCQl4bG9nX2dyYW50X3B1c2hfYWlsKGxvZy0+bF9tcCwgbmVlZF9ieXRlcyk7CisJCXMgPSBHUkFOVF9MT0NLKGxvZyk7CisJCWdvdG8gcmVkbzsKKwl9IGVsc2UgaWYgKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX0lOX1EpCisJCVhMT0dfREVMX1RJQ0tFVFEobG9nLT5sX3dyaXRlX2hlYWRxLCB0aWMpOworCisJWExPR19HUkFOVF9BRERfU1BBQ0UobG9nLCBuZWVkX2J5dGVzLCAndycpOyAvKiB3ZSd2ZSBnb3QgZW5vdWdoIHNwYWNlICovCisjaWZkZWYgREVCVUcKKwl0YWlsX2xzbiA9IGxvZy0+bF90YWlsX2xzbjsKKwlpZiAoQ1lDTEVfTFNOKHRhaWxfbHNuKSAhPSBsb2ctPmxfZ3JhbnRfd3JpdGVfY3ljbGUpIHsKKwkJQVNTRVJUKGxvZy0+bF9ncmFudF93cml0ZV9jeWNsZS0xID09IENZQ0xFX0xTTih0YWlsX2xzbikpOworCQlBU1NFUlQobG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzIDw9IEJCVE9CKEJMT0NLX0xTTih0YWlsX2xzbikpKTsKKwl9CisjZW5kaWYKKworCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsICJ4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlOiBleGl0Iik7CisJeGxvZ192ZXJpZnlfZ3JhbnRfaGVhZChsb2csIDEpOworCUdSQU5UX1VOTE9DSyhsb2csIHMpOworCXJldHVybiAoMCk7CisKKworIGVycm9yX3JldHVybjoKKwlpZiAodGljLT50X2ZsYWdzICYgWExPR19USUNfSU5fUSkKKwkJWExPR19ERUxfVElDS0VUUShsb2ctPmxfcmVzZXJ2ZV9oZWFkcSwgdGljKTsKKwl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGljLCAieGxvZ19yZWdyYW50X3dyaXRlX2xvZ19zcGFjZTogZXJyX3JldCIpOworCS8qCisJICogSWYgd2UgYXJlIGZhaWxpbmcsIG1ha2Ugc3VyZSB0aGUgdGlja2V0IGRvZXNuJ3QgaGF2ZSBhbnkKKwkgKiBjdXJyZW50IHJlc2VydmF0aW9ucy4gV2UgZG9uJ3Qgd2FudCB0byBhZGQgdGhpcyBiYWNrIHdoZW4KKwkgKiB0aGUgdGlja2V0L3RyYW5zYWN0aW9uIGdldHMgY2FuY2VsbGVkLgorCSAqLworCXRpYy0+dF9jdXJyX3JlcyA9IDA7CisJdGljLT50X2NudCA9IDA7IC8qIHVuZ3JhbnQgd2lsbCBnaXZlIGJhY2sgdW5pdF9yZXMgKiB0X2NudC4gKi8KKwlHUkFOVF9VTkxPQ0sobG9nLCBzKTsKKwlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7Cit9CS8qIHhsb2dfcmVncmFudF93cml0ZV9sb2dfc3BhY2UgKi8KKworCisvKiBUaGUgZmlyc3QgY250LTEgdGltZXMgdGhyb3VnaCBoZXJlIHdlIGRvbid0IG5lZWQgdG8KKyAqIG1vdmUgdGhlIGdyYW50IHdyaXRlIGhlYWQgYmVjYXVzZSB0aGUgcGVybWFuZW50CisgKiByZXNlcnZhdGlvbiBoYXMgcmVzZXJ2ZWQgY250IHRpbWVzIHRoZSB1bml0IGFtb3VudC4KKyAqIFJlbGVhc2UgcGFydCBvZiBjdXJyZW50IHBlcm1hbmVudCB1bml0IHJlc2VydmF0aW9uIGFuZAorICogcmVzZXQgY3VycmVudCByZXNlcnZhdGlvbiB0byBiZSBvbmUgdW5pdHMgd29ydGguICBBbHNvCisgKiBtb3ZlIGdyYW50IHJlc2VydmF0aW9uIGhlYWQgZm9yd2FyZC4KKyAqLworU1RBVElDIHZvaWQKK3hsb2dfcmVncmFudF9yZXNlcnZlX2xvZ19zcGFjZSh4bG9nX3QJICAgICAqbG9nLAorCQkJICAgICAgIHhsb2dfdGlja2V0X3QgKnRpY2tldCkKK3sKKwlTUExERUNMKHMpOworCisJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpY2tldCwKKwkJCSAgICAieGxvZ19yZWdyYW50X3Jlc2VydmVfbG9nX3NwYWNlOiBlbnRlciIpOworCWlmICh0aWNrZXQtPnRfY250ID4gMCkKKwkJdGlja2V0LT50X2NudC0tOworCisJcyA9IEdSQU5UX0xPQ0sobG9nKTsKKwlYTE9HX0dSQU5UX1NVQl9TUEFDRShsb2csIHRpY2tldC0+dF9jdXJyX3JlcywgJ3cnKTsKKwlYTE9HX0dSQU5UX1NVQl9TUEFDRShsb2csIHRpY2tldC0+dF9jdXJyX3JlcywgJ3InKTsKKwl0aWNrZXQtPnRfY3Vycl9yZXMgPSB0aWNrZXQtPnRfdW5pdF9yZXM7CisJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpY2tldCwKKwkJCSAgICAieGxvZ19yZWdyYW50X3Jlc2VydmVfbG9nX3NwYWNlOiBzdWIgY3VycmVudCByZXMiKTsKKwl4bG9nX3ZlcmlmeV9ncmFudF9oZWFkKGxvZywgMSk7CisKKwkvKiBqdXN0IHJldHVybiBpZiB3ZSBzdGlsbCBoYXZlIHNvbWUgb2YgdGhlIHByZS1yZXNlcnZlZCBzcGFjZSAqLworCWlmICh0aWNrZXQtPnRfY250ID4gMCkgeworCQlHUkFOVF9VTkxPQ0sobG9nLCBzKTsKKwkJcmV0dXJuOworCX0KKworCVhMT0dfR1JBTlRfQUREX1NQQUNFKGxvZywgdGlja2V0LT50X3VuaXRfcmVzLCAncicpOworCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWNrZXQsCisJCQkgICAgInhsb2dfcmVncmFudF9yZXNlcnZlX2xvZ19zcGFjZTogZXhpdCIpOworCXhsb2dfdmVyaWZ5X2dyYW50X2hlYWQobG9nLCAwKTsKKwlHUkFOVF9VTkxPQ0sobG9nLCBzKTsKKwl0aWNrZXQtPnRfY3Vycl9yZXMgPSB0aWNrZXQtPnRfdW5pdF9yZXM7Cit9CS8qIHhsb2dfcmVncmFudF9yZXNlcnZlX2xvZ19zcGFjZSAqLworCisKKy8qCisgKiBHaXZlIGJhY2sgdGhlIHNwYWNlIGxlZnQgZnJvbSBhIHJlc2VydmF0aW9uLgorICoKKyAqIEFsbCB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZCB0byBtYWtlIGEgY29ycmVjdCBkZXRlcm1pbmF0aW9uIG9mIHNwYWNlIGxlZnQKKyAqIGlzIHByZXNlbnQuICBGb3Igbm9uLXBlcm1hbmVudCByZXNlcnZhdGlvbnMsIHRoaW5ncyBhcmUgcXVpdGUgZWFzeS4gIFRoZQorICogY291bnQgc2hvdWxkIGhhdmUgYmVlbiBkZWNyZW1lbnRlZCB0byB6ZXJvLiAgV2Ugb25seSBuZWVkIHRvIGRlYWwgd2l0aCB0aGUKKyAqIHNwYWNlIHJlbWFpbmluZyBpbiB0aGUgY3VycmVudCByZXNlcnZhdGlvbiBwYXJ0IG9mIHRoZSB0aWNrZXQuICBJZiB0aGUKKyAqIHRpY2tldCBjb250YWlucyBhIHBlcm1hbmVudCByZXNlcnZhdGlvbiwgdGhlcmUgbWF5IGJlIGxlZnQgb3ZlciBzcGFjZSB3aGljaAorICogbmVlZHMgdG8gYmUgcmVsZWFzZWQuICBBIGNvdW50IG9mIE4gbWVhbnMgdGhhdCBOLTEgcmVmaWxscyBvZiB0aGUgY3VycmVudAorICogcmVzZXJ2YXRpb24gY2FuIGJlIGRvbmUgYmVmb3JlIHdlIG5lZWQgdG8gYXNrIGZvciBtb3JlIHNwYWNlLiAgVGhlIGZpcnN0CisgKiBvbmUgZ29lcyB0byBmaWxsIHVwIHRoZSBmaXJzdCBjdXJyZW50IHJlc2VydmF0aW9uLiAgT25jZSB3ZSBydW4gb3V0IG9mCisgKiBzcGFjZSwgdGhlIGNvdW50IHdpbGwgc3RheSBhdCB6ZXJvIGFuZCB0aGUgb25seSBzcGFjZSByZW1haW5pbmcgd2lsbCBiZQorICogaW4gdGhlIGN1cnJlbnQgcmVzZXJ2YXRpb24gZmllbGQuCisgKi8KK1NUQVRJQyB2b2lkCit4bG9nX3VuZ3JhbnRfbG9nX3NwYWNlKHhsb2dfdAkgICAgICpsb2csCisJCSAgICAgICB4bG9nX3RpY2tldF90ICp0aWNrZXQpCit7CisJU1BMREVDTChzKTsKKworCWlmICh0aWNrZXQtPnRfY250ID4gMCkKKwkJdGlja2V0LT50X2NudC0tOworCisJcyA9IEdSQU5UX0xPQ0sobG9nKTsKKwl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGlja2V0LCAieGxvZ191bmdyYW50X2xvZ19zcGFjZTogZW50ZXIiKTsKKworCVhMT0dfR1JBTlRfU1VCX1NQQUNFKGxvZywgdGlja2V0LT50X2N1cnJfcmVzLCAndycpOworCVhMT0dfR1JBTlRfU1VCX1NQQUNFKGxvZywgdGlja2V0LT50X2N1cnJfcmVzLCAncicpOworCisJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpY2tldCwgInhsb2dfdW5ncmFudF9sb2dfc3BhY2U6IHN1YiBjdXJyZW50Iik7CisKKwkvKiBJZiB0aGlzIGlzIGEgcGVybWFuZW50IHJlc2VydmF0aW9uIHRpY2tldCwgd2UgbWF5IGJlIGFibGUgdG8gZnJlZQorCSAqIHVwIG1vcmUgc3BhY2UgYmFzZWQgb24gdGhlIHJlbWFpbmluZyBjb3VudC4KKwkgKi8KKwlpZiAodGlja2V0LT50X2NudCA+IDApIHsKKwkJQVNTRVJUKHRpY2tldC0+dF9mbGFncyAmIFhMT0dfVElDX1BFUk1fUkVTRVJWKTsKKwkJWExPR19HUkFOVF9TVUJfU1BBQ0UobG9nLCB0aWNrZXQtPnRfdW5pdF9yZXMqdGlja2V0LT50X2NudCwndycpOworCQlYTE9HX0dSQU5UX1NVQl9TUEFDRShsb2csIHRpY2tldC0+dF91bml0X3Jlcyp0aWNrZXQtPnRfY250LCdyJyk7CisJfQorCisJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpY2tldCwgInhsb2dfdW5ncmFudF9sb2dfc3BhY2U6IGV4aXQiKTsKKwl4bG9nX3ZlcmlmeV9ncmFudF9oZWFkKGxvZywgMSk7CisJR1JBTlRfVU5MT0NLKGxvZywgcyk7CisJeGZzX2xvZ19tb3ZlX3RhaWwobG9nLT5sX21wLCAxKTsKK30JLyogeGxvZ191bmdyYW50X2xvZ19zcGFjZSAqLworCisKKy8qCisgKiBBdG9taWNhbGx5IHB1dCBiYWNrIHVzZWQgdGlja2V0LgorICovCit2b2lkCit4bG9nX3N0YXRlX3B1dF90aWNrZXQoeGxvZ190CSAgICAqbG9nLAorCQkgICAgICB4bG9nX3RpY2tldF90ICp0aWMpCit7CisJdW5zaWduZWQgbG9uZyBzOworCisJcyA9IExPR19MT0NLKGxvZyk7CisJeGxvZ190aWNrZXRfcHV0KGxvZywgdGljKTsKKwlMT0dfVU5MT0NLKGxvZywgcyk7Cit9CS8qIHhsb2dfc3RhdGVfcHV0X3RpY2tldCAqLworCisvKgorICogRmx1c2ggaWNsb2cgdG8gZGlzayBpZiB0aGlzIGlzIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGUgZ2l2ZW4gaWNsb2cgYW5kCisgKiB0aGUgV0FOVF9TWU5DIGJpdCBpcyBzZXQuCisgKgorICogV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGVudGVyZWQsIHRoZSBpY2xvZyBpcyBub3QgbmVjZXNzYXJpbHkgaW4gdGhlCisgKiBXQU5UX1NZTkMgc3RhdGUuICBJdCBtYXkgYmUgc2l0dGluZyBhcm91bmQgd2FpdGluZyB0byBnZXQgZmlsbGVkLgorICoKKyAqCisgKi8KK2ludAoreGxvZ19zdGF0ZV9yZWxlYXNlX2ljbG9nKHhsb2dfdAkJKmxvZywKKwkJCSB4bG9nX2luX2NvcmVfdAkqaWNsb2cpCit7CisJU1BMREVDTChzKTsKKwlpbnQJCXN5bmMgPSAwOwkvKiBkbyB3ZSBzeW5jPyAqLworCisJeGxvZ19hc3NpZ25fdGFpbF9sc24obG9nLT5sX21wKTsKKworCXMgPSBMT0dfTE9DSyhsb2cpOworCisJaWYgKGljbG9nLT5pY19zdGF0ZSAmIFhMT0dfU1RBVEVfSU9FUlJPUikgeworCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwl9CisKKwlBU1NFUlQoaWNsb2ctPmljX3JlZmNudCA+IDApOworCUFTU0VSVChpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9BQ1RJVkUgfHwKKwkgICAgICAgaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfV0FOVF9TWU5DKTsKKworCWlmICgtLWljbG9nLT5pY19yZWZjbnQgPT0gMCAmJgorCSAgICBpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9XQU5UX1NZTkMpIHsKKwkJc3luYysrOworCQlpY2xvZy0+aWNfc3RhdGUgPSBYTE9HX1NUQVRFX1NZTkNJTkc7CisJCUlOVF9TRVQoaWNsb2ctPmljX2hlYWRlci5oX3RhaWxfbHNuLCBBUkNIX0NPTlZFUlQsIGxvZy0+bF90YWlsX2xzbik7CisJCXhsb2dfdmVyaWZ5X3RhaWxfbHNuKGxvZywgaWNsb2csIGxvZy0+bF90YWlsX2xzbik7CisJCS8qIGN5Y2xlIGluY3JlbWVudGVkIHdoZW4gaW5jcmVtZW50aW5nIGN1cnJfYmxvY2sgKi8KKwl9CisKKwlMT0dfVU5MT0NLKGxvZywgcyk7CisKKwkvKgorCSAqIFdlIGxldCB0aGUgbG9nIGxvY2sgZ28sIHNvIGl0J3MgcG9zc2libGUgdGhhdCB3ZSBoaXQgYSBsb2cgSS9PCisJICogZXJyb3Igb3Igc29tZW90aGVyIFNIVVRET1dOIGNvbmRpdGlvbiB0aGF0IG1hcmtzIHRoZSBpY2xvZworCSAqIGFzIFhMT0dfU1RBVEVfSU9FUlJPUiBiZWZvcmUgdGhlIGJ3cml0ZS4gSG93ZXZlciwgd2Uga25vdyB0aGF0CisJICogdGhpcyBpY2xvZyBoYXMgY29uc2lzdGVudCBkYXRhLCBzbyB3ZSBpZ25vcmUgSU9FUlJPUgorCSAqIGZsYWdzIGFmdGVyIHRoaXMgcG9pbnQuCisJICovCisJaWYgKHN5bmMpIHsKKwkJcmV0dXJuIHhsb2dfc3luYyhsb2csIGljbG9nKTsKKwl9CisJcmV0dXJuICgwKTsKKworfQkvKiB4bG9nX3N0YXRlX3JlbGVhc2VfaWNsb2cgKi8KKworCisvKgorICogVGhpcyByb3V0aW5lIHdpbGwgbWFyayB0aGUgY3VycmVudCBpY2xvZyBpbiB0aGUgcmluZyBhcyBXQU5UX1NZTkMKKyAqIGFuZCBtb3ZlIHRoZSBjdXJyZW50IGljbG9nIHBvaW50ZXIgdG8gdGhlIG5leHQgaWNsb2cgaW4gdGhlIHJpbmcuCisgKiBXaGVuIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSB4bG9nX3N0YXRlX2dldF9pY2xvZ19zcGFjZSgpLCB0aGUKKyAqIGV4YWN0IHNpemUgb2YgdGhlIGljbG9nIGhhcyBub3QgeWV0IGJlZW4gZGV0ZXJtaW5lZC4gIEFsbCB3ZSBrbm93IGlzCisgKiB0aGF0IGV2ZXJ5IGRhdGEgYmxvY2suICBXZSBoYXZlIHJ1biBvdXQgb2Ygc3BhY2UgaW4gdGhpcyBsb2cgcmVjb3JkLgorICovCitTVEFUSUMgdm9pZAoreGxvZ19zdGF0ZV9zd2l0Y2hfaWNsb2dzKHhsb2dfdAkJKmxvZywKKwkJCSB4bG9nX2luX2NvcmVfdCAqaWNsb2csCisJCQkgaW50CQlldmVudHVhbF9zaXplKQoreworCUFTU0VSVChpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9BQ1RJVkUpOworCWlmICghZXZlbnR1YWxfc2l6ZSkKKwkJZXZlbnR1YWxfc2l6ZSA9IGljbG9nLT5pY19vZmZzZXQ7CisJaWNsb2ctPmljX3N0YXRlID0gWExPR19TVEFURV9XQU5UX1NZTkM7CisJSU5UX1NFVChpY2xvZy0+aWNfaGVhZGVyLmhfcHJldl9ibG9jaywgQVJDSF9DT05WRVJULCBsb2ctPmxfcHJldl9ibG9jayk7CisJbG9nLT5sX3ByZXZfYmxvY2sgPSBsb2ctPmxfY3Vycl9ibG9jazsKKwlsb2ctPmxfcHJldl9jeWNsZSA9IGxvZy0+bF9jdXJyX2N5Y2xlOworCisJLyogcm9sbCBsb2c/OiBpY19vZmZzZXQgY2hhbmdlZCBsYXRlciAqLworCWxvZy0+bF9jdXJyX2Jsb2NrICs9IEJUT0JCKGV2ZW50dWFsX3NpemUpK0JUT0JCKGxvZy0+bF9pY2xvZ19oc2l6ZSk7CisKKwkvKiBSb3VuZCB1cCB0byBuZXh0IGxvZy1zdW5pdCAqLworCWlmIChYRlNfU0JfVkVSU0lPTl9IQVNMT0dWMigmbG9nLT5sX21wLT5tX3NiKSAmJgorCSAgICBsb2ctPmxfbXAtPm1fc2Iuc2JfbG9nc3VuaXQgPiAxKSB7CisJCV9fdWludDMyX3Qgc3VuaXRfYmIgPSBCVE9CQihsb2ctPmxfbXAtPm1fc2Iuc2JfbG9nc3VuaXQpOworCQlsb2ctPmxfY3Vycl9ibG9jayA9IHJvdW5kdXAobG9nLT5sX2N1cnJfYmxvY2ssIHN1bml0X2JiKTsKKwl9CisKKwlpZiAobG9nLT5sX2N1cnJfYmxvY2sgPj0gbG9nLT5sX2xvZ0JCc2l6ZSkgeworCQlsb2ctPmxfY3Vycl9jeWNsZSsrOworCQlpZiAobG9nLT5sX2N1cnJfY3ljbGUgPT0gWExPR19IRUFERVJfTUFHSUNfTlVNKQorCQkJbG9nLT5sX2N1cnJfY3ljbGUrKzsKKwkJbG9nLT5sX2N1cnJfYmxvY2sgLT0gbG9nLT5sX2xvZ0JCc2l6ZTsKKwkJQVNTRVJUKGxvZy0+bF9jdXJyX2Jsb2NrID49IDApOworCX0KKwlBU1NFUlQoaWNsb2cgPT0gbG9nLT5sX2ljbG9nKTsKKwlsb2ctPmxfaWNsb2cgPSBpY2xvZy0+aWNfbmV4dDsKK30JLyogeGxvZ19zdGF0ZV9zd2l0Y2hfaWNsb2dzICovCisKKworLyoKKyAqIFdyaXRlIG91dCBhbGwgZGF0YSBpbiB0aGUgaW4tY29yZSBsb2cgYXMgb2YgdGhpcyBleGFjdCBtb21lbnQgaW4gdGltZS4KKyAqCisgKiBEYXRhIG1heSBiZSB3cml0dGVuIHRvIHRoZSBpbi1jb3JlIGxvZyBkdXJpbmcgdGhpcyBjYWxsLiAgSG93ZXZlciwKKyAqIHdlIGRvbid0IGd1YXJhbnRlZSB0aGlzIGRhdGEgd2lsbCBiZSB3cml0dGVuIG91dC4gIEEgY2hhbmdlIGZyb20gcGFzdAorICogaW1wbGVtZW50YXRpb24gbWVhbnMgdGhpcyByb3V0aW5lIHdpbGwgKm5vdCogd3JpdGUgb3V0IHplcm8gbGVuZ3RoIExScy4KKyAqCisgKiBCYXNpY2FsbHksIHdlIHRyeSBhbmQgcGVyZm9ybSBhbiBpbnRlbGxpZ2VudCBzY2FuIG9mIHRoZSBpbi1jb3JlIGxvZ3MuCisgKiBJZiB3ZSBkZXRlcm1pbmUgdGhlcmUgaXMgbm8gZmx1c2hhYmxlIGRhdGEsIHdlIGp1c3QgcmV0dXJuLiAgVGhlcmUgaXMgbm8KKyAqIGZsdXNoYWJsZSBkYXRhIGlmOgorICoKKyAqCTEuIHRoZSBjdXJyZW50IGljbG9nIGlzIGFjdGl2ZSBhbmQgaGFzIG5vIGRhdGE7IHRoZSBwcmV2aW91cyBpY2xvZworICoJCWlzIGluIHRoZSBhY3RpdmUgb3IgZGlydHkgc3RhdGUuCisgKgkyLiB0aGUgY3VycmVudCBpY2xvZyBpcyBkcml0eSwgYW5kIHRoZSBwcmV2aW91cyBpY2xvZyBpcyBpbiB0aGUKKyAqCQlhY3RpdmUgb3IgZGlydHkgc3RhdGUuCisgKgorICogV2UgbWF5IHNsZWVwIChjYWxsIHBzZW1hKSBpZjoKKyAqCisgKgkxLiB0aGUgY3VycmVudCBpY2xvZyBpcyBub3QgaW4gdGhlIGFjdGl2ZSBub3IgZGlydHkgc3RhdGUuCisgKgkyLiB0aGUgY3VycmVudCBpY2xvZyBkaXJ0eSwgYW5kIHRoZSBwcmV2aW91cyBpY2xvZyBpcyBub3QgaW4gdGhlCisgKgkJYWN0aXZlIG5vciBkaXJ0eSBzdGF0ZS4KKyAqCTMuIHRoZSBjdXJyZW50IGljbG9nIGlzIGFjdGl2ZSwgYW5kIHRoZXJlIGlzIGFub3RoZXIgdGhyZWFkIHdyaXRpbmcKKyAqCQl0byB0aGlzIHBhcnRpY3VsYXIgaWNsb2cuCisgKgk0LiBhKSB0aGUgY3VycmVudCBpY2xvZyBpcyBhY3RpdmUgYW5kIGhhcyBubyBvdGhlciB3cml0ZXJzCisgKgkgICBiKSB3aGVuIHdlIHJldHVybiBmcm9tIGZsdXNoaW5nIG91dCB0aGlzIGljbG9nLCBpdCBpcyBzdGlsbAorICoJCW5vdCBpbiB0aGUgYWN0aXZlIG5vciBkaXJ0eSBzdGF0ZS4KKyAqLworU1RBVElDIGludAoreGxvZ19zdGF0ZV9zeW5jX2FsbCh4bG9nX3QgKmxvZywgdWludCBmbGFncykKK3sKKwl4bG9nX2luX2NvcmVfdAkqaWNsb2c7CisJeGZzX2xzbl90CWxzbjsKKwlTUExERUNMKHMpOworCisJcyA9IExPR19MT0NLKGxvZyk7CisKKwlpY2xvZyA9IGxvZy0+bF9pY2xvZzsKKwlpZiAoaWNsb2ctPmljX3N0YXRlICYgWExPR19TVEFURV9JT0VSUk9SKSB7CisJCUxPR19VTkxPQ0sobG9nLCBzKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCX0KKworCS8qIElmIHRoZSBoZWFkIGljbG9nIGlzIG5vdCBhY3RpdmUgbm9yIGRpcnR5LCB3ZSBqdXN0IGF0dGFjaAorCSAqIG91cnNlbHZlcyB0byB0aGUgaGVhZCBhbmQgZ28gdG8gc2xlZXAuCisJICovCisJaWYgKGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX0FDVElWRSB8fAorCSAgICBpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9ESVJUWSkgeworCQkvKgorCQkgKiBJZiB0aGUgaGVhZCBpcyBkaXJ0eSBvciAoYWN0aXZlIGFuZCBlbXB0eSksIHRoZW4KKwkJICogd2UgbmVlZCB0byBsb29rIGF0IHRoZSBwcmV2aW91cyBpY2xvZy4gIElmIHRoZSBwcmV2aW91cworCQkgKiBpY2xvZyBpcyBhY3RpdmUgb3IgZGlydHkgd2UgYXJlIGRvbmUuICBUaGVyZSBpcyBub3RoaW5nCisJCSAqIHRvIHN5bmMgb3V0LiAgT3RoZXJ3aXNlLCB3ZSBhdHRhY2ggb3Vyc2VsdmVzIHRvIHRoZQorCQkgKiBwcmV2aW91cyBpY2xvZyBhbmQgZ28gdG8gc2xlZXAuCisJCSAqLworCQlpZiAoaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfRElSVFkgfHwKKwkJICAgIChpY2xvZy0+aWNfcmVmY250ID09IDAgJiYgaWNsb2ctPmljX29mZnNldCA9PSAwKSkgeworCQkJaWNsb2cgPSBpY2xvZy0+aWNfcHJldjsKKwkJCWlmIChpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9BQ1RJVkUgfHwKKwkJCSAgICBpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9ESVJUWSkKKwkJCQlnb3RvIG5vX3NsZWVwOworCQkJZWxzZQorCQkJCWdvdG8gbWF5YmVfc2xlZXA7CisJCX0gZWxzZSB7CisJCQlpZiAoaWNsb2ctPmljX3JlZmNudCA9PSAwKSB7CisJCQkJLyogV2UgYXJlIHRoZSBvbmx5IG9uZSB3aXRoIGFjY2VzcyB0byB0aGlzCisJCQkJICogaWNsb2cuICBGbHVzaCBpdCBvdXQgbm93LiAgVGhlcmUgc2hvdWxkCisJCQkJICogYmUgYSByb3VuZG9mZiBvZiB6ZXJvIHRvIHNob3cgdGhhdCBzb21lb25lCisJCQkJICogaGFzIGFscmVhZHkgdGFrZW4gY2FyZSBvZiB0aGUgcm91bmRvZmYgZnJvbQorCQkJCSAqIHRoZSBwcmV2aW91cyBzeW5jLgorCQkJCSAqLworCQkJCWljbG9nLT5pY19yZWZjbnQrKzsKKwkJCQlsc24gPSBJTlRfR0VUKGljbG9nLT5pY19oZWFkZXIuaF9sc24sIEFSQ0hfQ09OVkVSVCk7CisJCQkJeGxvZ19zdGF0ZV9zd2l0Y2hfaWNsb2dzKGxvZywgaWNsb2csIDApOworCQkJCUxPR19VTkxPQ0sobG9nLCBzKTsKKworCQkJCWlmICh4bG9nX3N0YXRlX3JlbGVhc2VfaWNsb2cobG9nLCBpY2xvZykpCisJCQkJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwkJCQlzID0gTE9HX0xPQ0sobG9nKTsKKwkJCQlpZiAoSU5UX0dFVChpY2xvZy0+aWNfaGVhZGVyLmhfbHNuLCBBUkNIX0NPTlZFUlQpID09IGxzbiAmJgorCQkJCSAgICBpY2xvZy0+aWNfc3RhdGUgIT0gWExPR19TVEFURV9ESVJUWSkKKwkJCQkJZ290byBtYXliZV9zbGVlcDsKKwkJCQllbHNlCisJCQkJCWdvdG8gbm9fc2xlZXA7CisJCQl9IGVsc2UgeworCQkJCS8qIFNvbWVvbmUgZWxzZSBpcyB3cml0aW5nIHRvIHRoaXMgaWNsb2cuCisJCQkJICogVXNlIGl0cyBjYWxsIHRvIGZsdXNoIG91dCB0aGUgZGF0YS4gIEhvd2V2ZXIsCisJCQkJICogdGhlIG90aGVyIHRocmVhZCBtYXkgbm90IGZvcmNlIG91dCB0aGlzIExSLAorCQkJCSAqIHNvIHdlIG1hcmsgaXQgV0FOVF9TWU5DLgorCQkJCSAqLworCQkJCXhsb2dfc3RhdGVfc3dpdGNoX2ljbG9ncyhsb2csIGljbG9nLCAwKTsKKwkJCQlnb3RvIG1heWJlX3NsZWVwOworCQkJfQorCQl9CisJfQorCisJLyogQnkgdGhlIHRpbWUgd2UgY29tZSBhcm91bmQgYWdhaW4sIHRoZSBpY2xvZyBjb3VsZCd2ZSBiZWVuIGZpbGxlZAorCSAqIHdoaWNoIHdvdWxkIGdpdmUgaXQgYW5vdGhlciBsc24uICBJZiB3ZSBoYXZlIGEgbmV3IGxzbiwganVzdAorCSAqIHJldHVybiBiZWNhdXNlIHRoZSByZWxldmFudCBkYXRhIGhhcyBiZWVuIGZsdXNoZWQuCisJICovCittYXliZV9zbGVlcDoKKwlpZiAoZmxhZ3MgJiBYRlNfTE9HX1NZTkMpIHsKKwkJLyoKKwkJICogV2UgbXVzdCBjaGVjayBpZiB3ZSdyZSBzaHV0dGluZyBkb3duIGhlcmUsIGJlZm9yZQorCQkgKiB3ZSB3YWl0LCB3aGlsZSB3ZSdyZSBob2xkaW5nIHRoZSBMT0dfTE9DSy4KKwkJICogVGhlbiB3ZSBjaGVjayBhZ2FpbiBhZnRlciB3YWtpbmcgdXAsIGluIGNhc2Ugb3VyCisJCSAqIHNsZWVwIHdhcyBkaXN0dXJiZWQgYnkgYSBiYWQgbmV3cy4KKwkJICovCisJCWlmIChpY2xvZy0+aWNfc3RhdGUgJiBYTE9HX1NUQVRFX0lPRVJST1IpIHsKKwkJCUxPR19VTkxPQ0sobG9nLCBzKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwkJfQorCQlYRlNfU1RBVFNfSU5DKHhzX2xvZ19mb3JjZV9zbGVlcCk7CisJCXN2X3dhaXQoJmljbG9nLT5pY19mb3JjZXNlbWEsIFBJTk9ELCAmbG9nLT5sX2ljbG9nbG9jaywgcyk7CisJCS8qCisJCSAqIE5vIG5lZWQgdG8gZ3JhYiB0aGUgbG9nIGxvY2sgaGVyZSBzaW5jZSB3ZSdyZQorCQkgKiBvbmx5IGRlY2lkaW5nIHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiBFSU8KKwkJICogYW5kIHRoZSBtZW1vcnkgcmVhZCBzaG91bGQgYmUgYXRvbWljLgorCQkgKi8KKwkJaWYgKGljbG9nLT5pY19zdGF0ZSAmIFhMT0dfU1RBVEVfSU9FUlJPUikKKwkJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKworCX0gZWxzZSB7CisKK25vX3NsZWVwOgorCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJfQorCXJldHVybiAwOworfQkvKiB4bG9nX3N0YXRlX3N5bmNfYWxsICovCisKKworLyoKKyAqIFVzZWQgYnkgY29kZSB3aGljaCBpbXBsZW1lbnRzIHN5bmNocm9ub3VzIGxvZyBmb3JjZXMuCisgKgorICogRmluZCBpbi1jb3JlIGxvZyB3aXRoIGxzbi4KKyAqCUlmIGl0IGlzIGluIHRoZSBESVJUWSBzdGF0ZSwganVzdCByZXR1cm4uCisgKglJZiBpdCBpcyBpbiB0aGUgQUNUSVZFIHN0YXRlLCBtb3ZlIHRoZSBpbi1jb3JlIGxvZyBpbnRvIHRoZSBXQU5UX1NZTkMKKyAqCQlzdGF0ZSBhbmQgZ28gdG8gc2xlZXAgb3IgcmV0dXJuLgorICoJSWYgaXQgaXMgaW4gYW55IG90aGVyIHN0YXRlLCBnbyB0byBzbGVlcCBvciByZXR1cm4uCisgKgorICogSWYgZmlsZXN5c3RlbSBhY3Rpdml0eSBnb2VzIHRvIHplcm8sIHRoZSBpY2xvZyB3aWxsIGdldCBmbHVzaGVkIG9ubHkgYnkKKyAqIGJkZmx1c2goKS4KKyAqLworaW50Cit4bG9nX3N0YXRlX3N5bmMoeGxvZ190CSAgKmxvZywKKwkJeGZzX2xzbl90IGxzbiwKKwkJdWludAkgIGZsYWdzKQoreworICAgIHhsb2dfaW5fY29yZV90CSppY2xvZzsKKyAgICBpbnQJCQlhbHJlYWR5X3NsZXB0ID0gMDsKKyAgICBTUExERUNMKHMpOworCisKK3RyeV9hZ2FpbjoKKyAgICBzID0gTE9HX0xPQ0sobG9nKTsKKyAgICBpY2xvZyA9IGxvZy0+bF9pY2xvZzsKKworICAgIGlmIChpY2xvZy0+aWNfc3RhdGUgJiBYTE9HX1NUQVRFX0lPRVJST1IpIHsKKwkgICAgTE9HX1VOTE9DSyhsb2csIHMpOworCSAgICByZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisgICAgfQorCisgICAgZG8geworCWlmIChJTlRfR0VUKGljbG9nLT5pY19oZWFkZXIuaF9sc24sIEFSQ0hfQ09OVkVSVCkgIT0gbHNuKSB7CisJICAgIGljbG9nID0gaWNsb2ctPmljX25leHQ7CisJICAgIGNvbnRpbnVlOworCX0KKworCWlmIChpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9ESVJUWSkgeworCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9BQ1RJVkUpIHsKKwkJLyoKKwkJICogV2Ugc2xlZXAgaGVyZSBpZiB3ZSBoYXZlbid0IGFscmVhZHkgc2xlcHQgKGUuZy4KKwkJICogdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBsb29rZWQgYXQgdGhlIGNvcnJlY3QKKwkJICogaWNsb2cgYnVmKSBhbmQgdGhlIGJ1ZmZlciBiZWZvcmUgdXMgaXMgZ29pbmcgdG8KKwkJICogYmUgc3luYydlZC4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IGlmIHdlCisJCSAqIGFyZSBkb2luZyBzeW5jIHRyYW5zYWN0aW9ucyBoZXJlLCBieSB3YWl0aW5nIGZvcgorCQkgKiB0aGUgcHJldmlvdXMgSS9PIHRvIGNvbXBsZXRlLCB3ZSBjYW4gYWxsb3cgYSBmZXcKKwkJICogbW9yZSB0cmFuc2FjdGlvbnMgaW50byB0aGlzIGljbG9nIGJlZm9yZSB3ZSBjbG9zZQorCQkgKiBpdCBkb3duLgorCQkgKgorCQkgKiBPdGhlcndpc2UsIHdlIG1hcmsgdGhlIGJ1ZmZlciBXQU5UX1NZTkMsIGFuZCBidW1wCisJCSAqIHVwIHRoZSByZWZjbnQgc28gd2UgY2FuIHJlbGVhc2UgdGhlIGxvZyAod2hpY2ggZHJvcHMKKwkJICogdGhlIHJlZiBjb3VudCkuICBUaGUgc3RhdGUgc3dpdGNoIGtlZXBzIG5ldyB0cmFuc2FjdGlvbgorCQkgKiBjb21taXRzIGZyb20gdXNpbmcgdGhpcyBidWZmZXIuICBXaGVuIHRoZSBjdXJyZW50IGNvbW1pdHMKKwkJICogZmluaXNoIHdyaXRpbmcgaW50byB0aGUgYnVmZmVyLCB0aGUgcmVmY291bnQgd2lsbCBkcm9wIHRvCisJCSAqIHplcm8gYW5kIHRoZSBidWZmZXIgd2lsbCBnbyBvdXQgdGhlbi4KKwkJICovCisJCWlmICghYWxyZWFkeV9zbGVwdCAmJgorCQkgICAgKGljbG9nLT5pY19wcmV2LT5pY19zdGF0ZSAmIChYTE9HX1NUQVRFX1dBTlRfU1lOQyB8CisJCQkJCQkgWExPR19TVEFURV9TWU5DSU5HKSkpIHsKKwkJCUFTU0VSVCghKGljbG9nLT5pY19zdGF0ZSAmIFhMT0dfU1RBVEVfSU9FUlJPUikpOworCQkJWEZTX1NUQVRTX0lOQyh4c19sb2dfZm9yY2Vfc2xlZXApOworCQkJc3Zfd2FpdCgmaWNsb2ctPmljX3ByZXYtPmljX3dyaXRlc2VtYSwgUFNXUCwKKwkJCQkmbG9nLT5sX2ljbG9nbG9jaywgcyk7CisJCQlhbHJlYWR5X3NsZXB0ID0gMTsKKwkJCWdvdG8gdHJ5X2FnYWluOworCQl9IGVsc2UgeworCQkJaWNsb2ctPmljX3JlZmNudCsrOworCQkJeGxvZ19zdGF0ZV9zd2l0Y2hfaWNsb2dzKGxvZywgaWNsb2csIDApOworCQkJTE9HX1VOTE9DSyhsb2csIHMpOworCQkJaWYgKHhsb2dfc3RhdGVfcmVsZWFzZV9pY2xvZyhsb2csIGljbG9nKSkKKwkJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJCQlzID0gTE9HX0xPQ0sobG9nKTsKKwkJfQorCX0KKworCWlmICgoZmxhZ3MgJiBYRlNfTE9HX1NZTkMpICYmIC8qIHNsZWVwICovCisJICAgICEoaWNsb2ctPmljX3N0YXRlICYgKFhMT0dfU1RBVEVfQUNUSVZFIHwgWExPR19TVEFURV9ESVJUWSkpKSB7CisKKwkJLyoKKwkJICogRG9uJ3Qgd2FpdCBvbiB0aGUgZm9yY2VzZW1hIGlmIHdlIGtub3cgdGhhdCB3ZSd2ZQorCQkgKiBnb3R0ZW4gYSBsb2cgd3JpdGUgZXJyb3IuCisJCSAqLworCQlpZiAoaWNsb2ctPmljX3N0YXRlICYgWExPR19TVEFURV9JT0VSUk9SKSB7CisJCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJCX0KKwkJWEZTX1NUQVRTX0lOQyh4c19sb2dfZm9yY2Vfc2xlZXApOworCQlzdl93YWl0KCZpY2xvZy0+aWNfZm9yY2VzZW1hLCBQU1dQLCAmbG9nLT5sX2ljbG9nbG9jaywgcyk7CisJCS8qCisJCSAqIE5vIG5lZWQgdG8gZ3JhYiB0aGUgbG9nIGxvY2sgaGVyZSBzaW5jZSB3ZSdyZQorCQkgKiBvbmx5IGRlY2lkaW5nIHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiBFSU8KKwkJICogYW5kIHRoZSBtZW1vcnkgcmVhZCBzaG91bGQgYmUgYXRvbWljLgorCQkgKi8KKwkJaWYgKGljbG9nLT5pY19zdGF0ZSAmIFhMT0dfU1RBVEVfSU9FUlJPUikKKwkJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwl9IGVsc2UgewkJLyoganVzdCByZXR1cm4gKi8KKwkJTE9HX1VOTE9DSyhsb2csIHMpOworCX0KKwlyZXR1cm4gMDsKKworICAgIH0gd2hpbGUgKGljbG9nICE9IGxvZy0+bF9pY2xvZyk7CisKKyAgICBMT0dfVU5MT0NLKGxvZywgcyk7CisgICAgcmV0dXJuICgwKTsKK30JLyogeGxvZ19zdGF0ZV9zeW5jICovCisKKworLyoKKyAqIENhbGxlZCB3aGVuIHdlIHdhbnQgdG8gbWFyayB0aGUgY3VycmVudCBpY2xvZyBhcyBiZWluZyByZWFkeSB0byBzeW5jIHRvCisgKiBkaXNrLgorICovCit2b2lkCit4bG9nX3N0YXRlX3dhbnRfc3luYyh4bG9nX3QgKmxvZywgeGxvZ19pbl9jb3JlX3QgKmljbG9nKQoreworCVNQTERFQ0wocyk7CisKKwlzID0gTE9HX0xPQ0sobG9nKTsKKworCWlmIChpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9BQ1RJVkUpIHsKKwkJeGxvZ19zdGF0ZV9zd2l0Y2hfaWNsb2dzKGxvZywgaWNsb2csIDApOworCX0gZWxzZSB7CisJCUFTU0VSVChpY2xvZy0+aWNfc3RhdGUgJgorCQkJKFhMT0dfU1RBVEVfV0FOVF9TWU5DfFhMT0dfU1RBVEVfSU9FUlJPUikpOworCX0KKworCUxPR19VTkxPQ0sobG9nLCBzKTsKK30JLyogeGxvZ19zdGF0ZV93YW50X3N5bmMgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCQlUSUNLRVQgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoKKyAqCUFsZ29yaXRobSBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHBhZ2Ugc2l6ZS4gOy0oCisgKi8KK1NUQVRJQyB2b2lkCit4bG9nX3N0YXRlX3RpY2tldF9hbGxvYyh4bG9nX3QgKmxvZykKK3sKKwl4bG9nX3RpY2tldF90CSp0X2xpc3Q7CisJeGxvZ190aWNrZXRfdAkqbmV4dDsKKwl4ZnNfY2FkZHJfdAlidWY7CisJdWludAkJaSA9IChOQlBQIC8gc2l6ZW9mKHhsb2dfdGlja2V0X3QpKSAtIDI7CisJU1BMREVDTChzKTsKKworCS8qCisJICogVGhlIGttZW1femFsbG9jIG1heSBzbGVlcCwgc28gd2Ugc2hvdWxkbid0IGJlIGhvbGRpbmcgdGhlCisJICogZ2xvYmFsIGxvY2suICBYWFhtaWtlbjogbWF5IHdhbnQgdG8gdXNlIHpvbmUgYWxsb2NhdG9yLgorCSAqLworCWJ1ZiA9ICh4ZnNfY2FkZHJfdCkga21lbV96YWxsb2MoTkJQUCwgS01fU0xFRVApOworCisJcyA9IExPR19MT0NLKGxvZyk7CisKKwkvKiBBdHRhY2ggMXN0IHRpY2tldCB0byBRLCBzbyB3ZSBjYW4ga2VlcCB0cmFjayBvZiBhbGxvY2F0ZWQgbWVtb3J5ICovCisJdF9saXN0ID0gKHhsb2dfdGlja2V0X3QgKilidWY7CisJdF9saXN0LT50X25leHQgPSBsb2ctPmxfdW5tb3VudF9mcmVlOworCWxvZy0+bF91bm1vdW50X2ZyZWUgPSB0X2xpc3QrKzsKKwlsb2ctPmxfdGlja2V0X2NudCsrOworCWxvZy0+bF90aWNrZXRfdGNudCsrOworCisJLyogTmV4dCB0aWNrZXQgYmVjb21lcyBmaXJzdCB0aWNrZXQgYXR0YWNoZWQgdG8gdGlja2V0IGZyZWUgbGlzdCAqLworCWlmIChsb2ctPmxfZnJlZWxpc3QgIT0gTlVMTCkgeworCQlBU1NFUlQobG9nLT5sX3RhaWwgIT0gTlVMTCk7CisJCWxvZy0+bF90YWlsLT50X25leHQgPSB0X2xpc3Q7CisJfSBlbHNlIHsKKwkJbG9nLT5sX2ZyZWVsaXN0ID0gdF9saXN0OworCX0KKwlsb2ctPmxfdGlja2V0X2NudCsrOworCWxvZy0+bF90aWNrZXRfdGNudCsrOworCisJLyogQ3ljbGUgdGhyb3VnaCByZXN0IG9mIGFsbG9jJ2VkIG1lbW9yeSwgYnVpbGRpbmcgdXAgZnJlZSBRICovCisJZm9yICggOyBpID4gMDsgaS0tKSB7CisJCW5leHQgPSB0X2xpc3QgKyAxOworCQl0X2xpc3QtPnRfbmV4dCA9IG5leHQ7CisJCXRfbGlzdCA9IG5leHQ7CisJCWxvZy0+bF90aWNrZXRfY250Kys7CisJCWxvZy0+bF90aWNrZXRfdGNudCsrOworCX0KKwl0X2xpc3QtPnRfbmV4dCA9IE5VTEw7CisJbG9nLT5sX3RhaWwgPSB0X2xpc3Q7CisJTE9HX1VOTE9DSyhsb2csIHMpOworfQkvKiB4bG9nX3N0YXRlX3RpY2tldF9hbGxvYyAqLworCisKKy8qCisgKiBQdXQgdGlja2V0IGludG8gZnJlZSBsaXN0CisgKgorICogQXNzdW1wdGlvbjogbG9nIGxvY2sgaXMgaGVsZCBhcm91bmQgdGhpcyBjYWxsLgorICovCitTVEFUSUMgdm9pZAoreGxvZ190aWNrZXRfcHV0KHhsb2dfdAkJKmxvZywKKwkJeGxvZ190aWNrZXRfdAkqdGlja2V0KQoreworCXN2X2Rlc3Ryb3koJnRpY2tldC0+dF9zZW1hKTsKKworCS8qCisJICogRG9uJ3QgdGhpbmsgY2FjaGluZyB3aWxsIG1ha2UgdGhhdCBtdWNoIGRpZmZlcmVuY2UuICBJdCdzCisJICogbW9yZSBpbXBvcnRhbnQgdG8gbWFrZSBkZWJ1ZyBlYXNpZXIuCisJICovCisjaWYgMAorCS8qIHJlYWwgY29kZSB3aWxsIHdhbnQgdG8gdXNlIExJRk8gZm9yIGNhY2hpbmcgKi8KKwl0aWNrZXQtPnRfbmV4dCA9IGxvZy0+bF9mcmVlbGlzdDsKKwlsb2ctPmxfZnJlZWxpc3QgPSB0aWNrZXQ7CisJLyogbm8gbmVlZCB0byBjbGVhciBmaWVsZHMgKi8KKyNlbHNlCisJLyogV2hlbiB3ZSBkZWJ1ZywgaXQgaXMgZWFzaWVyIGlmIHRpY2tldHMgYXJlIGN5Y2xlZCAqLworCXRpY2tldC0+dF9uZXh0ICAgICA9IE5VTEw7CisJaWYgKGxvZy0+bF90YWlsICE9IDApIHsKKwkJbG9nLT5sX3RhaWwtPnRfbmV4dCA9IHRpY2tldDsKKwl9IGVsc2UgeworCQlBU1NFUlQobG9nLT5sX2ZyZWVsaXN0ID09IDApOworCQlsb2ctPmxfZnJlZWxpc3QgPSB0aWNrZXQ7CisJfQorCWxvZy0+bF90YWlsCSAgICA9IHRpY2tldDsKKyNlbmRpZiAvKiBERUJVRyAqLworCWxvZy0+bF90aWNrZXRfY250Kys7Cit9CS8qIHhsb2dfdGlja2V0X3B1dCAqLworCisKKy8qCisgKiBHcmFiIHRpY2tldCBvZmYgZnJlZWxpc3Qgb3IgYWxsb2NhdGlvbiBzb21lIG1vcmUKKyAqLworeGxvZ190aWNrZXRfdCAqCit4bG9nX3RpY2tldF9nZXQoeGxvZ190CQkqbG9nLAorCQlpbnQJCXVuaXRfYnl0ZXMsCisJCWludAkJY250LAorCQljaGFyCQljbGllbnQsCisJCXVpbnQJCXhmbGFncykKK3sKKwl4bG9nX3RpY2tldF90CSp0aWM7CisJdWludAkJbnVtX2hlYWRlcnM7CisJU1BMREVDTChzKTsKKworIGFsbG9jOgorCWlmIChsb2ctPmxfZnJlZWxpc3QgPT0gTlVMTCkKKwkJeGxvZ19zdGF0ZV90aWNrZXRfYWxsb2MobG9nKTsJCS8qIHBvdGVudGlhbGx5IHNsZWVwICovCisKKwlzID0gTE9HX0xPQ0sobG9nKTsKKwlpZiAobG9nLT5sX2ZyZWVsaXN0ID09IE5VTEwpIHsKKwkJTE9HX1VOTE9DSyhsb2csIHMpOworCQlnb3RvIGFsbG9jOworCX0KKwl0aWMJCT0gbG9nLT5sX2ZyZWVsaXN0OworCWxvZy0+bF9mcmVlbGlzdAk9IHRpYy0+dF9uZXh0OworCWlmIChsb2ctPmxfZnJlZWxpc3QgPT0gTlVMTCkKKwkJbG9nLT5sX3RhaWwgPSBOVUxMOworCWxvZy0+bF90aWNrZXRfY250LS07CisJTE9HX1VOTE9DSyhsb2csIHMpOworCisJLyoKKwkgKiBQZXJtYW5lbnQgcmVzZXJ2YXRpb25zIGhhdmUgdXAgdG8gJ2NudCctMSBhY3RpdmUgbG9nIG9wZXJhdGlvbnMKKwkgKiBpbiB0aGUgbG9nLiAgQSB1bml0IGluIHRoaXMgY2FzZSBpcyB0aGUgYW1vdW50IG9mIHNwYWNlIGZvciBvbmUKKwkgKiBvZiB0aGVzZSBsb2cgb3BlcmF0aW9ucy4gIE5vcm1hbCByZXNlcnZhdGlvbnMgaGF2ZSBhIGNudCBvZiAxCisJICogYW5kIHRoZWlyIHVuaXQgYW1vdW50IGlzIHRoZSB0b3RhbCBhbW91bnQgb2Ygc3BhY2UgcmVxdWlyZWQuCisJICoKKwkgKiBUaGUgZm9sbG93aW5nIGxpbmVzIG9mIGNvZGUgYWNjb3VudCBmb3Igbm9uLXRyYW5zYWN0aW9uIGRhdGEKKwkgKiB3aGljaCBvY2N1cHkgc3BhY2UgaW4gdGhlIG9uLWRpc2sgbG9nLiAKKwkgKi8KKworCS8qIGZvciBzdGFydC1yZWMgKi8KKwl1bml0X2J5dGVzICs9IHNpemVvZih4bG9nX29wX2hlYWRlcl90KTsgCisKKwkvKiBmb3IgcGFkZGluZyAqLworCWlmIChYRlNfU0JfVkVSU0lPTl9IQVNMT0dWMigmbG9nLT5sX21wLT5tX3NiKSAmJgorCQlsb2ctPmxfbXAtPm1fc2Iuc2JfbG9nc3VuaXQgPiAxKSB7CisJCS8qIGxvZyBzdSByb3VuZG9mZiAqLworCQl1bml0X2J5dGVzICs9IGxvZy0+bF9tcC0+bV9zYi5zYl9sb2dzdW5pdDsgIAorCX0gZWxzZSB7CisJCS8qIEJCIHJvdW5kb2ZmICovCisJCXVuaXRfYnl0ZXMgKz0gQkJTSVpFOworICAgICAgICB9CisKKwkvKiBmb3IgY29tbWl0LXJlYyAqLworCXVuaXRfYnl0ZXMgKz0gc2l6ZW9mKHhsb2dfb3BfaGVhZGVyX3QpOworIAorCS8qIGZvciBMUiBoZWFkZXJzICovCisJbnVtX2hlYWRlcnMgPSAoKHVuaXRfYnl0ZXMgKyBsb2ctPmxfaWNsb2dfc2l6ZS0xKSA+PiBsb2ctPmxfaWNsb2dfc2l6ZV9sb2cpOworCXVuaXRfYnl0ZXMgKz0gbG9nLT5sX2ljbG9nX2hzaXplICogbnVtX2hlYWRlcnM7CisKKwl0aWMtPnRfdW5pdF9yZXMJCT0gdW5pdF9ieXRlczsKKwl0aWMtPnRfY3Vycl9yZXMJCT0gdW5pdF9ieXRlczsKKwl0aWMtPnRfY250CQk9IGNudDsKKwl0aWMtPnRfb2NudAkJPSBjbnQ7CisJdGljLT50X3RpZAkJPSAoeGxvZ190aWRfdCkoKF9fcHNpbnRfdCl0aWMgJiAweGZmZmZmZmZmKTsKKwl0aWMtPnRfY2xpZW50aWQJCT0gY2xpZW50OworCXRpYy0+dF9mbGFncwkJPSBYTE9HX1RJQ19JTklURUQ7CisJaWYgKHhmbGFncyAmIFhGU19MT0dfUEVSTV9SRVNFUlYpCisJCXRpYy0+dF9mbGFncyB8PSBYTE9HX1RJQ19QRVJNX1JFU0VSVjsKKwlzdl9pbml0KCYodGljLT50X3NlbWEpLCBTVl9ERUZBVUxULCAibG9ndGljayIpOworCisJcmV0dXJuIHRpYzsKK30JLyogeGxvZ190aWNrZXRfZ2V0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCQlMb2cgZGVidWcgcm91dGluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyNpZiBkZWZpbmVkKERFQlVHKSAmJiAhZGVmaW5lZChYTE9HX05PTE9HKQorLyoKKyAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBwdHIgaXMgd2l0aGluIHRoZSB2YWxpZCBkYXRhIHJlZ2lvbiBvZgorICogb25lIG9mIHRoZSBpY2xvZ3MuICBUaGlzIHVzZXMgYmFja3VwIHBvaW50ZXJzIHN0b3JlZCBpbiBhIGRpZmZlcmVudAorICogcGFydCBvZiB0aGUgbG9nIGluIGNhc2Ugd2UgdHJhc2ggdGhlIGxvZyBzdHJ1Y3R1cmUuCisgKi8KK3ZvaWQKK3hsb2dfdmVyaWZ5X2Rlc3RfcHRyKHhsb2dfdCAgICAgKmxvZywKKwkJICAgICBfX3BzaW50X3QgIHB0cikKK3sKKwlpbnQgaTsKKwlpbnQgZ29vZF9wdHIgPSAwOworCisJZm9yIChpPTA7IGkgPCBsb2ctPmxfaWNsb2dfYnVmczsgaSsrKSB7CisJCWlmIChwdHIgPj0gKF9fcHNpbnRfdClsb2ctPmxfaWNsb2dfYmFrW2ldICYmCisJCSAgICBwdHIgPD0gKF9fcHNpbnRfdClsb2ctPmxfaWNsb2dfYmFrW2ldK2xvZy0+bF9pY2xvZ19zaXplKQorCQkJZ29vZF9wdHIrKzsKKwl9CisJaWYgKCEgZ29vZF9wdHIpCisJCXhsb2dfcGFuaWMoInhsb2dfdmVyaWZ5X2Rlc3RfcHRyOiBpbnZhbGlkIHB0ciIpOworfQkvKiB4bG9nX3ZlcmlmeV9kZXN0X3B0ciAqLworCitTVEFUSUMgdm9pZAoreGxvZ192ZXJpZnlfZ3JhbnRfaGVhZCh4bG9nX3QgKmxvZywgaW50IGVxdWFscykKK3sKKyAgICBpZiAobG9nLT5sX2dyYW50X3Jlc2VydmVfY3ljbGUgPT0gbG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlKSB7CisJaWYgKGVxdWFscykKKwkgICAgQVNTRVJUKGxvZy0+bF9ncmFudF9yZXNlcnZlX2J5dGVzID49IGxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyk7CisJZWxzZQorCSAgICBBU1NFUlQobG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMgPiBsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXMpOworICAgIH0gZWxzZSB7CisJQVNTRVJUKGxvZy0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlLTEgPT0gbG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlKTsKKwlBU1NFUlQobG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzID49IGxvZy0+bF9ncmFudF9yZXNlcnZlX2J5dGVzKTsKKyAgICB9Cit9CS8qIHhsb2dfdmVyaWZ5X2dyYW50X2hlYWQgKi8KKworLyogY2hlY2sgaWYgaXQgd2lsbCBmaXQgKi8KK1NUQVRJQyB2b2lkCit4bG9nX3ZlcmlmeV90YWlsX2xzbih4bG9nX3QJICAgICpsb2csCisJCSAgICAgeGxvZ19pbl9jb3JlX3QgKmljbG9nLAorCQkgICAgIHhmc19sc25fdAkgICAgdGFpbF9sc24pCit7CisgICAgaW50IGJsb2NrczsKKworICAgIGlmIChDWUNMRV9MU04odGFpbF9sc24pID09IGxvZy0+bF9wcmV2X2N5Y2xlKSB7CisJYmxvY2tzID0KKwkgICAgbG9nLT5sX2xvZ0JCc2l6ZSAtIChsb2ctPmxfcHJldl9ibG9jayAtIEJMT0NLX0xTTih0YWlsX2xzbikpOworCWlmIChibG9ja3MgPCBCVE9CQihpY2xvZy0+aWNfb2Zmc2V0KStCVE9CQihsb2ctPmxfaWNsb2dfaHNpemUpKQorCSAgICB4bG9nX3BhbmljKCJ4bG9nX3ZlcmlmeV90YWlsX2xzbjogcmFuIG91dCBvZiBsb2cgc3BhY2UiKTsKKyAgICB9IGVsc2UgeworCUFTU0VSVChDWUNMRV9MU04odGFpbF9sc24pKzEgPT0gbG9nLT5sX3ByZXZfY3ljbGUpOworCisJaWYgKEJMT0NLX0xTTih0YWlsX2xzbikgPT0gbG9nLT5sX3ByZXZfYmxvY2spCisJICAgIHhsb2dfcGFuaWMoInhsb2dfdmVyaWZ5X3RhaWxfbHNuOiB0YWlsIHdyYXBwZWQiKTsKKworCWJsb2NrcyA9IEJMT0NLX0xTTih0YWlsX2xzbikgLSBsb2ctPmxfcHJldl9ibG9jazsKKwlpZiAoYmxvY2tzIDwgQlRPQkIoaWNsb2ctPmljX29mZnNldCkgKyAxKQorCSAgICB4bG9nX3BhbmljKCJ4bG9nX3ZlcmlmeV90YWlsX2xzbjogcmFuIG91dCBvZiBsb2cgc3BhY2UiKTsKKyAgICB9Cit9CS8qIHhsb2dfdmVyaWZ5X3RhaWxfbHNuICovCisKKy8qCisgKiBQZXJmb3JtIGEgbnVtYmVyIG9mIGNoZWNrcyBvbiB0aGUgaWNsb2cgYmVmb3JlIHdyaXRpbmcgdG8gZGlzay4KKyAqCisgKiAxLiBNYWtlIHN1cmUgdGhlIGljbG9ncyBhcmUgc3RpbGwgY2lyY3VsYXIKKyAqIDIuIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZ29vZCBtYWdpYyBudW1iZXIKKyAqIDMuIE1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIG1hZ2ljIG51bWJlcnMgaW4gdGhlIGRhdGEKKyAqIDQuIENoZWNrIGZpZWxkcyBvZiBlYWNoIGxvZyBvcGVyYXRpb24gaGVhZGVyIGZvcjoKKyAqCUEuIFZhbGlkIGNsaWVudCBpZGVudGlmaWVyCisgKglCLiB0aWQgcHRyIHZhbHVlIGZhbGxzIGluIHZhbGlkIHB0ciBzcGFjZSAodXNlciBzcGFjZSBjb2RlKQorICoJQy4gTGVuZ3RoIGluIGxvZyByZWNvcmQgaGVhZGVyIGlzIGNvcnJlY3QgYWNjb3JkaW5nIHRvIHRoZQorICoJCWluZGl2aWR1YWwgb3BlcmF0aW9uIGhlYWRlcnMgd2l0aGluIHJlY29yZC4KKyAqIDUuIFdoZW4gYSBid3JpdGUgd2lsbCBvY2N1ciB3aXRoaW4gNSBibG9ja3Mgb2YgdGhlIGZyb250IG9mIHRoZSBwaHlzaWNhbAorICoJbG9nLCBjaGVjayB0aGUgcHJlY2VkaW5nIGJsb2NrcyBvZiB0aGUgcGh5c2ljYWwgbG9nIHRvIG1ha2Ugc3VyZSBhbGwKKyAqCXRoZSBjeWNsZSBudW1iZXJzIGFncmVlIHdpdGggdGhlIGN1cnJlbnQgY3ljbGUgbnVtYmVyLgorICovCitTVEFUSUMgdm9pZAoreGxvZ192ZXJpZnlfaWNsb2coeGxvZ190CSAqbG9nLAorCQkgIHhsb2dfaW5fY29yZV90ICppY2xvZywKKwkJICBpbnQJCSBjb3VudCwKKwkJICBib29sZWFuX3QJIHN5bmNpbmcpCit7CisJeGxvZ19vcF9oZWFkZXJfdAkqb3BoZWFkOworCXhsb2dfaW5fY29yZV90CQkqaWNwdHI7CisJeGxvZ19pbl9jb3JlXzJfdAkqeGhkcjsKKwl4ZnNfY2FkZHJfdAkJcHRyOworCXhmc19jYWRkcl90CQliYXNlX3B0cjsKKwlfX3BzaW50X3QJCWZpZWxkX29mZnNldDsKKwlfX3VpbnQ4X3QJCWNsaWVudGlkOworCWludAkJCWxlbiwgaSwgaiwgaywgb3BfbGVuOworCWludAkJCWlkeDsKKwlTUExERUNMKHMpOworCisJLyogY2hlY2sgdmFsaWRpdHkgb2YgaWNsb2cgcG9pbnRlcnMgKi8KKwlzID0gTE9HX0xPQ0sobG9nKTsKKwlpY3B0ciA9IGxvZy0+bF9pY2xvZzsKKwlmb3IgKGk9MDsgaSA8IGxvZy0+bF9pY2xvZ19idWZzOyBpKyspIHsKKwkJaWYgKGljcHRyID09IDApCisJCQl4bG9nX3BhbmljKCJ4bG9nX3ZlcmlmeV9pY2xvZzogaW52YWxpZCBwdHIiKTsKKwkJaWNwdHIgPSBpY3B0ci0+aWNfbmV4dDsKKwl9CisJaWYgKGljcHRyICE9IGxvZy0+bF9pY2xvZykKKwkJeGxvZ19wYW5pYygieGxvZ192ZXJpZnlfaWNsb2c6IGNvcnJ1cHQgaWNsb2cgcmluZyIpOworCUxPR19VTkxPQ0sobG9nLCBzKTsKKworCS8qIGNoZWNrIGxvZyBtYWdpYyBudW1iZXJzICovCisJcHRyID0gKHhmc19jYWRkcl90KSAmKGljbG9nLT5pY19oZWFkZXIpOworCWlmIChJTlRfR0VUKCoodWludCAqKXB0ciwgQVJDSF9DT05WRVJUKSAhPSBYTE9HX0hFQURFUl9NQUdJQ19OVU0pCisJCXhsb2dfcGFuaWMoInhsb2dfdmVyaWZ5X2ljbG9nOiBpbnZhbGlkIG1hZ2ljIG51bSIpOworCisJZm9yIChwdHIgKz0gQkJTSVpFOyBwdHIgPCAoKHhmc19jYWRkcl90KSYoaWNsb2ctPmljX2hlYWRlcikpK2NvdW50OworCSAgICAgcHRyICs9IEJCU0laRSkgeworCQlpZiAoSU5UX0dFVCgqKHVpbnQgKilwdHIsIEFSQ0hfQ09OVkVSVCkgPT0gWExPR19IRUFERVJfTUFHSUNfTlVNKQorCQkJeGxvZ19wYW5pYygieGxvZ192ZXJpZnlfaWNsb2c6IHVuZXhwZWN0ZWQgbWFnaWMgbnVtIik7CisJfQorCisJLyogY2hlY2sgZmllbGRzICovCisJbGVuID0gSU5UX0dFVChpY2xvZy0+aWNfaGVhZGVyLmhfbnVtX2xvZ29wcywgQVJDSF9DT05WRVJUKTsKKwlwdHIgPSBpY2xvZy0+aWNfZGF0YXA7CisJYmFzZV9wdHIgPSBwdHI7CisJb3BoZWFkID0gKHhsb2dfb3BfaGVhZGVyX3QgKilwdHI7CisJeGhkciA9ICh4bG9nX2luX2NvcmVfMl90ICopJmljbG9nLT5pY19oZWFkZXI7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCW9waGVhZCA9ICh4bG9nX29wX2hlYWRlcl90ICopcHRyOworCisJCS8qIGNsaWVudGlkIGlzIG9ubHkgMSBieXRlICovCisJCWZpZWxkX29mZnNldCA9IChfX3BzaW50X3QpCisJCQkgICAgICAgKCh4ZnNfY2FkZHJfdCkmKG9waGVhZC0+b2hfY2xpZW50aWQpIC0gYmFzZV9wdHIpOworCQlpZiAoc3luY2luZyA9PSBCX0ZBTFNFIHx8IChmaWVsZF9vZmZzZXQgJiAweDFmZikpIHsKKwkJCWNsaWVudGlkID0gb3BoZWFkLT5vaF9jbGllbnRpZDsKKwkJfSBlbHNlIHsKKwkJCWlkeCA9IEJUT0JCVCgoeGZzX2NhZGRyX3QpJihvcGhlYWQtPm9oX2NsaWVudGlkKSAtIGljbG9nLT5pY19kYXRhcCk7CisJCQlpZiAoaWR4ID49IChYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFKSkgeworCQkJCWogPSBpZHggLyAoWExPR19IRUFERVJfQ1lDTEVfU0laRSAvIEJCU0laRSk7CisJCQkJayA9IGlkeCAlIChYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFKTsKKwkJCQljbGllbnRpZCA9IEdFVF9DTElFTlRfSUQoeGhkcltqXS5oaWNfeGhlYWRlci54aF9jeWNsZV9kYXRhW2tdLCBBUkNIX0NPTlZFUlQpOworCQkJfSBlbHNlIHsKKwkJCQljbGllbnRpZCA9IEdFVF9DTElFTlRfSUQoaWNsb2ctPmljX2hlYWRlci5oX2N5Y2xlX2RhdGFbaWR4XSwgQVJDSF9DT05WRVJUKTsKKwkJCX0KKwkJfQorCQlpZiAoY2xpZW50aWQgIT0gWEZTX1RSQU5TQUNUSU9OICYmIGNsaWVudGlkICE9IFhGU19MT0cpCisJCQljbW5fZXJyKENFX1dBUk4sICJ4bG9nX3ZlcmlmeV9pY2xvZzogaW52YWxpZCBjbGllbnRpZCAlZCBvcCAweCVwIG9mZnNldCAweCV4IiwgY2xpZW50aWQsIG9waGVhZCwgZmllbGRfb2Zmc2V0KTsKKworCQkvKiBjaGVjayBsZW5ndGggKi8KKwkJZmllbGRfb2Zmc2V0ID0gKF9fcHNpbnRfdCkKKwkJCSAgICAgICAoKHhmc19jYWRkcl90KSYob3BoZWFkLT5vaF9sZW4pIC0gYmFzZV9wdHIpOworCQlpZiAoc3luY2luZyA9PSBCX0ZBTFNFIHx8IChmaWVsZF9vZmZzZXQgJiAweDFmZikpIHsKKwkJCW9wX2xlbiA9IElOVF9HRVQob3BoZWFkLT5vaF9sZW4sIEFSQ0hfQ09OVkVSVCk7CisJCX0gZWxzZSB7CisJCQlpZHggPSBCVE9CQlQoKF9fcHNpbnRfdCkmb3BoZWFkLT5vaF9sZW4gLQorCQkJCSAgICAoX19wc2ludF90KWljbG9nLT5pY19kYXRhcCk7CisJCQlpZiAoaWR4ID49IChYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFKSkgeworCQkJCWogPSBpZHggLyAoWExPR19IRUFERVJfQ1lDTEVfU0laRSAvIEJCU0laRSk7CisJCQkJayA9IGlkeCAlIChYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFKTsKKwkJCQlvcF9sZW4gPSBJTlRfR0VUKHhoZHJbal0uaGljX3hoZWFkZXIueGhfY3ljbGVfZGF0YVtrXSwgQVJDSF9DT05WRVJUKTsKKwkJCX0gZWxzZSB7CisJCQkJb3BfbGVuID0gSU5UX0dFVChpY2xvZy0+aWNfaGVhZGVyLmhfY3ljbGVfZGF0YVtpZHhdLCBBUkNIX0NPTlZFUlQpOworCQkJfQorCQl9CisJCXB0ciArPSBzaXplb2YoeGxvZ19vcF9oZWFkZXJfdCkgKyBvcF9sZW47CisJfQorfQkvKiB4bG9nX3ZlcmlmeV9pY2xvZyAqLworI2VuZGlmIC8qIERFQlVHICYmICFYTE9HX05PTE9HICovCisKKy8qCisgKiBNYXJrIGFsbCBpY2xvZ3MgSU9FUlJPUi4gTE9HX0xPQ0sgaXMgaGVsZCBieSB0aGUgY2FsbGVyLgorICovCitTVEFUSUMgaW50Cit4bG9nX3N0YXRlX2lvZXJyb3IoCisJeGxvZ190CSpsb2cpCit7CisJeGxvZ19pbl9jb3JlX3QJKmljbG9nLCAqaWM7CisKKwlpY2xvZyA9IGxvZy0+bF9pY2xvZzsKKwlpZiAoISAoaWNsb2ctPmljX3N0YXRlICYgWExPR19TVEFURV9JT0VSUk9SKSkgeworCQkvKgorCQkgKiBNYXJrIGFsbCB0aGUgaW5jb3JlIGxvZ3MgSU9FUlJPUi4KKwkJICogRnJvbSBub3cgb24sIG5vIGxvZyBmbHVzaGVzIHdpbGwgcmVzdWx0LgorCQkgKi8KKwkJaWMgPSBpY2xvZzsKKwkJZG8geworCQkJaWMtPmljX3N0YXRlID0gWExPR19TVEFURV9JT0VSUk9SOworCQkJaWMgPSBpYy0+aWNfbmV4dDsKKwkJfSB3aGlsZSAoaWMgIT0gaWNsb2cpOworCQlyZXR1cm4gKDApOworCX0KKwkvKgorCSAqIFJldHVybiBub24temVybywgaWYgc3RhdGUgdHJhbnNpdGlvbiBoYXMgYWxyZWFkeSBoYXBwZW5lZC4KKwkgKi8KKwlyZXR1cm4gKDEpOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSB4ZnNfZm9yY2Vfc2h1dGRvd24sIHdoZW4gd2UncmUgZm9yY2libHkKKyAqIHNodXR0aW5nIGRvd24gdGhlIGZpbGVzeXN0ZW0sIHR5cGljYWxseSBiZWNhdXNlIG9mIGFuIElPIGVycm9yLgorICogT3VyIG1haW4gb2JqZWN0aXZlcyBoZXJlIGFyZSB0byBtYWtlIHN1cmUgdGhhdDoKKyAqCWEuIHRoZSBmaWxlc3lzdGVtIGdldHMgbWFya2VkICdTSFVURE9XTicgZm9yIGFsbCBpbnRlcmVzdGVkCisgKgkgICBwYXJ0aWVzIHRvIGZpbmQgb3V0LCAnYXRvbWljYWxseScuCisgKgliLiB0aG9zZSB3aG8ncmUgc2xlZXBpbmcgb24gbG9nIHJlc2VydmF0aW9ucywgcGlubmVkIG9iamVjdHMgYW5kCisgKgkgICAgb3RoZXIgcmVzb3VyY2VzIGdldCB3b2tlbiB1cCwgYW5kIGJlIHRvbGQgdGhlIGJhZCBuZXdzLgorICoJYy4gbm90aGluZyBuZXcgZ2V0cyBxdWV1ZWQgdXAgYWZ0ZXIgKGEpIGFuZCAoYikgYXJlIGRvbmUuCisgKglkLiBpZiAhbG9nZXJyb3IsIGZsdXNoIHRoZSBpY2xvZ3MgdG8gZGlzaywgdGhlbiBzZWFsIHRoZW0gb2ZmCisgKgkgICBmb3IgYnVzaW5lc3MuCisgKi8KK2ludAoreGZzX2xvZ19mb3JjZV91bW91bnQoCisJc3RydWN0IHhmc19tb3VudAkqbXAsCisJaW50CQkJbG9nZXJyb3IpCit7CisJeGxvZ190aWNrZXRfdAkqdGljOworCXhsb2dfdAkJKmxvZzsKKwlpbnQJCXJldHZhbDsKKwlTUExERUNMKHMpOworCVNQTERFQ0woczIpOworCisJbG9nID0gbXAtPm1fbG9nOworCisJLyoKKwkgKiBJZiB0aGlzIGhhcHBlbnMgZHVyaW5nIGxvZyByZWNvdmVyeSwgZG9uJ3Qgd29ycnkgYWJvdXQKKwkgKiBsb2NraW5nOyB0aGUgbG9nIGlzbid0IG9wZW4gZm9yIGJ1c2luZXNzIHlldC4KKwkgKi8KKwlpZiAoIWxvZyB8fAorCSAgICBsb2ctPmxfZmxhZ3MgJiBYTE9HX0FDVElWRV9SRUNPVkVSWSkgeworCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfRlNfU0hVVERPV047CisJCVhGU19CVUZfRE9ORShtcC0+bV9zYl9icCk7CisJCXJldHVybiAoMCk7CisJfQorCisJLyoKKwkgKiBTb21lYm9keSBjb3VsZCd2ZSBhbHJlYWR5IGRvbmUgdGhlIGhhcmQgd29yayBmb3IgdXMuCisJICogTm8gbmVlZCB0byBnZXQgbG9ja3MgZm9yIHRoaXMuCisJICovCisJaWYgKGxvZ2Vycm9yICYmIGxvZy0+bF9pY2xvZy0+aWNfc3RhdGUgJiBYTE9HX1NUQVRFX0lPRVJST1IpIHsKKwkJQVNTRVJUKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpOworCQlyZXR1cm4gKDEpOworCX0KKwlyZXR2YWwgPSAwOworCS8qCisJICogV2UgbXVzdCBob2xkIGJvdGggdGhlIEdSQU5UIGxvY2sgYW5kIHRoZSBMT0cgbG9jaywKKwkgKiBiZWZvcmUgd2UgbWFyayB0aGUgZmlsZXN5c3RlbSBTSFVURE9XTiBhbmQgd2FrZQorCSAqIGV2ZXJ5Ym9keSB1cCB0byB0ZWxsIHRoZSBiYWQgbmV3cy4KKwkgKi8KKwlzID0gR1JBTlRfTE9DSyhsb2cpOworCXMyID0gTE9HX0xPQ0sobG9nKTsKKwltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfRlNfU0hVVERPV047CisJWEZTX0JVRl9ET05FKG1wLT5tX3NiX2JwKTsKKwkvKgorCSAqIFRoaXMgZmxhZyBpcyBzb3J0IG9mIHJlZHVuZGFudCBiZWNhdXNlIG9mIHRoZSBtb3VudCBmbGFnLCBidXQKKwkgKiBpdCdzIGdvb2QgdG8gbWFpbnRhaW4gdGhlIHNlcGFyYXRpb24gYmV0d2VlbiB0aGUgbG9nIGFuZCB0aGUgcmVzdAorCSAqIG9mIFhGUy4KKwkgKi8KKwlsb2ctPmxfZmxhZ3MgfD0gWExPR19JT19FUlJPUjsKKworCS8qCisJICogSWYgd2UgaGl0IGEgbG9nIGVycm9yLCB3ZSB3YW50IHRvIG1hcmsgYWxsIHRoZSBpY2xvZ3MgSU9FUlJPUgorCSAqIHdoaWxlIHdlJ3JlIHN0aWxsIGhvbGRpbmcgdGhlIGxvZ2xvY2suCisJICovCisJaWYgKGxvZ2Vycm9yKQorCQlyZXR2YWwgPSB4bG9nX3N0YXRlX2lvZXJyb3IobG9nKTsKKwlMT0dfVU5MT0NLKGxvZywgczIpOworCisJLyoKKwkgKiBXZSBkb24ndCB3YW50IGFueWJvZHkgd2FpdGluZyBmb3IgbG9nIHJlc2VydmF0aW9ucworCSAqIGFmdGVyIHRoaXMuIFRoYXQgbWVhbnMgd2UgaGF2ZSB0byB3YWtlIHVwIGV2ZXJ5Ym9keQorCSAqIHF1ZXVlZCB1cCBvbiByZXNlcnZlX2hlYWRxIGFzIHdlbGwgYXMgd3JpdGVfaGVhZHEuCisJICogSW4gYWRkaXRpb24sIHdlIG1ha2Ugc3VyZSBpbiB4bG9nX3tyZX1ncmFudF9sb2dfc3BhY2UKKwkgKiB0aGF0IHdlIGRvbid0IGVucXVldWUgYW55dGhpbmcgb25jZSB0aGUgU0hVVERPV04gZmxhZworCSAqIGlzIHNldCwgYW5kIHRoaXMgYWN0aW9uIGlzIHByb3RlY3RlZCBieSB0aGUgR1JBTlRMT0NLLgorCSAqLworCWlmICgodGljID0gbG9nLT5sX3Jlc2VydmVfaGVhZHEpKSB7CisJCWRvIHsKKwkJCXN2X3NpZ25hbCgmdGljLT50X3NlbWEpOworCQkJdGljID0gdGljLT50X25leHQ7CisJCX0gd2hpbGUgKHRpYyAhPSBsb2ctPmxfcmVzZXJ2ZV9oZWFkcSk7CisJfQorCisJaWYgKCh0aWMgPSBsb2ctPmxfd3JpdGVfaGVhZHEpKSB7CisJCWRvIHsKKwkJCXN2X3NpZ25hbCgmdGljLT50X3NlbWEpOworCQkJdGljID0gdGljLT50X25leHQ7CisJCX0gd2hpbGUgKHRpYyAhPSBsb2ctPmxfd3JpdGVfaGVhZHEpOworCX0KKwlHUkFOVF9VTkxPQ0sobG9nLCBzKTsKKworCWlmICghIChsb2ctPmxfaWNsb2ctPmljX3N0YXRlICYgWExPR19TVEFURV9JT0VSUk9SKSkgeworCQlBU1NFUlQoIWxvZ2Vycm9yKTsKKwkJLyoKKwkJICogRm9yY2UgdGhlIGluY29yZSBsb2dzIHRvIGRpc2sgYmVmb3JlIHNodXR0aW5nIHRoZQorCQkgKiBsb2cgZG93biBjb21wbGV0ZWx5LgorCQkgKi8KKwkJeGxvZ19zdGF0ZV9zeW5jX2FsbChsb2csIFhGU19MT0dfRk9SQ0V8WEZTX0xPR19TWU5DKTsKKwkJczIgPSBMT0dfTE9DSyhsb2cpOworCQlyZXR2YWwgPSB4bG9nX3N0YXRlX2lvZXJyb3IobG9nKTsKKwkJTE9HX1VOTE9DSyhsb2csIHMyKTsKKwl9CisJLyoKKwkgKiBXYWtlIHVwIGV2ZXJ5Ym9keSB3YWl0aW5nIG9uIHhmc19sb2dfZm9yY2UuCisJICogQ2FsbGJhY2sgYWxsIGxvZyBpdGVtIGNvbW1pdHRlZCBmdW5jdGlvbnMgYXMgaWYgdGhlCisJICogbG9nIHdyaXRlcyB3ZXJlIGNvbXBsZXRlZC4KKwkgKi8KKwl4bG9nX3N0YXRlX2RvX2NhbGxiYWNrKGxvZywgWEZTX0xJX0FCT1JURUQsIE5VTEwpOworCisjaWZkZWYgWEZTRVJST1JERUJVRworCXsKKwkJeGxvZ19pbl9jb3JlX3QJKmljbG9nOworCisJCXMgPSBMT0dfTE9DSyhsb2cpOworCQlpY2xvZyA9IGxvZy0+bF9pY2xvZzsKKwkJZG8geworCQkJQVNTRVJUKGljbG9nLT5pY19jYWxsYmFjayA9PSAwKTsKKwkJCWljbG9nID0gaWNsb2ctPmljX25leHQ7CisJCX0gd2hpbGUgKGljbG9nICE9IGxvZy0+bF9pY2xvZyk7CisJCUxPR19VTkxPQ0sobG9nLCBzKTsKKwl9CisjZW5kaWYKKwkvKiByZXR1cm4gbm9uLXplcm8gaWYgbG9nIElPRVJST1IgdHJhbnNpdGlvbiBoYWQgYWxyZWFkeSBoYXBwZW5lZCAqLworCXJldHVybiAocmV0dmFsKTsKK30KKworaW50Cit4bG9nX2ljbG9nc19lbXB0eSh4bG9nX3QgKmxvZykKK3sKKwl4bG9nX2luX2NvcmVfdAkqaWNsb2c7CisKKwlpY2xvZyA9IGxvZy0+bF9pY2xvZzsKKwlkbyB7CisJCS8qIGVuZGlhbm5lc3MgZG9lcyBub3QgbWF0dGVyIGhlcmUsIHplcm8gaXMgemVybyBpbgorCQkgKiBhbnkgbGFuZ3VhZ2UuCisJCSAqLworCQlpZiAoaWNsb2ctPmljX2hlYWRlci5oX251bV9sb2dvcHMpCisJCQlyZXR1cm4oMCk7CisJCWljbG9nID0gaWNsb2ctPmljX25leHQ7CisJfSB3aGlsZSAoaWNsb2cgIT0gbG9nLT5sX2ljbG9nKTsKKwlyZXR1cm4oMSk7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZy5oIGIvZnMveGZzL3hmc19sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGIxMjJkCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19sb2cuaApAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYJX19YRlNfTE9HX0hfXworI2RlZmluZSBfX1hGU19MT0dfSF9fCisKKy8qIGdldCBsc24gZmllbGRzICovCisKKyNkZWZpbmUgQ1lDTEVfTFNOKGxzbikgKCh1aW50KSgobHNuKT4+MzIpKQorI2RlZmluZSBCTE9DS19MU04obHNuKSAoKHVpbnQpKGxzbikpCisvKiB0aGlzIGlzIHVzZWQgaW4gYSBzcG90IHdoZXJlIHdlIG1pZ2h0IG90aGVyd2lzZSBkb3VibGUtZW5kaWFuLWZsaXAgKi8KKyNkZWZpbmUgQ1lDTEVfTFNOX0RJU0sobHNuKSAoKCh1aW50ICopJihsc24pKVswXSkKKworI2lmZGVmIF9fS0VSTkVMX18KKy8qCisgKiBCeSBjb21wYXJpbmcgZWFjaCBjb21wbmVudCwgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBleHRyYQorICogZW5kaWFuIGlzc3VlcyBpbiB0cmVhdGluZyB0d28gMzIgYml0IG51bWJlcnMgYXMgb25lIDY0IGJpdCBudW1iZXIKKyAqLworc3RhdGljCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID09IDIpICYmICggKF9fR05VQ19NSU5PUl9fID09IDk1KSB8fCAoX19HTlVDX01JTk9SX18gPT0gOTYpKQorX19hdHRyaWJ1dGVfXygodW51c2VkKSkJLyogZ2NjIDIuOTUsIDIuOTYgbWlzY29tcGlsZSB0aGlzIHdoZW4gaW5saW5lZCAqLworI2Vsc2UKK19faW5saW5lX18KKyNlbmRpZgoreGZzX2xzbl90CV9sc25fY21wKHhmc19sc25fdCBsc24xLCB4ZnNfbHNuX3QgbHNuMikKK3sKKwlpZiAoQ1lDTEVfTFNOKGxzbjEpICE9IENZQ0xFX0xTTihsc24yKSkKKwkJcmV0dXJuIChDWUNMRV9MU04obHNuMSk8Q1lDTEVfTFNOKGxzbjIpKT8gLTk5OSA6IDk5OTsKKworCWlmIChCTE9DS19MU04obHNuMSkgIT0gQkxPQ0tfTFNOKGxzbjIpKQorCQlyZXR1cm4gKEJMT0NLX0xTTihsc24xKTxCTE9DS19MU04obHNuMikpPyAtOTk5IDogOTk5OworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUJWEZTX0xTTl9DTVAoeCx5KSBfbHNuX2NtcCh4LHkpCisKKy8qCisgKiBNYWNyb3MsIHN0cnVjdHVyZXMsIHByb3RvdHlwZXMgZm9yIGludGVyZmFjZSB0byB0aGUgbG9nIG1hbmFnZXIuCisgKi8KKworLyoKKyAqIEZsYWdzIHRvIHhmc19sb2dfbW91bnQKKyAqLworI2RlZmluZSBYRlNfTE9HX1JFQ09WRVIJCTB4MQorCisvKgorICogRmxhZ3MgdG8geGZzX2xvZ19kb25lKCkKKyAqLworI2RlZmluZSBYRlNfTE9HX1JFTF9QRVJNX1JFU0VSVgkweDEKKworCisvKgorICogRmxhZ3MgdG8geGZzX2xvZ19yZXNlcnZlKCkKKyAqCisgKglYRlNfTE9HX1NMRUVQOgkgSWYgc3BhY2UgaXMgbm90IGF2YWlsYWJsZSwgc2xlZXAgKGRlZmF1bHQpCisgKglYRlNfTE9HX05PU0xFRVA6IElmIHNwYWNlIGlzIG5vdCBhdmFpbGFibGUsIHJldHVybiBlcnJvcgorICoJWEZTX0xPR19QRVJNX1JFU0VSVjogUGVybWFuZW50IHJlc2VydmF0aW9uLiAgV2hlbiB3cml0ZXMgYXJlCisgKgkJcGVyZm9ybWVkIGFnYWluc3QgdGhpcyB0eXBlIG9mIHJlc2VydmF0aW9uLCB0aGUgcmVzZXJ2YXRpb24KKyAqCQlpcyBub3QgZGVjcmVhc2VkLiAgTG9uZyBydW5uaW5nIHRyYW5zYWN0aW9ucyBzaG91bGQgdXNlIHRoaXMuCisgKi8KKyNkZWZpbmUgWEZTX0xPR19TTEVFUAkJMHgwCisjZGVmaW5lIFhGU19MT0dfTk9TTEVFUAkJMHgxCisjZGVmaW5lIFhGU19MT0dfUEVSTV9SRVNFUlYJMHgyCisjZGVmaW5lIFhGU19MT0dfUkVTVl9BTEwJKFhGU19MT0dfTk9TTEVFUHxYRlNfTE9HX1BFUk1fUkVTRVJWKQorCisKKy8qCisgKiBGbGFncyB0byB4ZnNfbG9nX2ZvcmNlKCkKKyAqCisgKglYRlNfTE9HX1NZTkM6CVN5bmNocm9ub3VzIGZvcmNlIGluLWNvcmUgbG9nIHRvIGRpc2sKKyAqCVhGU19MT0dfRk9SQ0U6CVN0YXJ0IGluLWNvcmUgbG9nIHdyaXRlIG5vdy4KKyAqCVhGU19MT0dfVVJHRToJU3RhcnQgd3JpdGUgd2l0aGluIHNvbWUgd2luZG93IG9mIHRpbWUuCisgKgorICogTm90ZTogRWl0aGVyIFhGU19MT0dfRk9SQ0Ugb3IgWEZTX0xPR19VUkdFIG11c3QgYmUgc2V0LgorICovCisjZGVmaW5lIFhGU19MT0dfU1lOQwkJMHgxCisjZGVmaW5lIFhGU19MT0dfRk9SQ0UJCTB4MgorI2RlZmluZSBYRlNfTE9HX1VSR0UJCTB4NAorCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisKKy8qIExvZyBDbGllbnRzICovCisjZGVmaW5lIFhGU19UUkFOU0FDVElPTgkJMHg2OQorI2RlZmluZSBYRlNfVk9MVU1FCQkweDIKKyNkZWZpbmUgWEZTX0xPRwkJCTB4YWEKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2xvZ19pb3ZlYyB7CisJeGZzX2NhZGRyX3QJCWlfYWRkcjsJCS8qIGJlZ2lubmluZyBhZGRyZXNzIG9mIHJlZ2lvbiAqLworCWludAkJaV9sZW47CQkvKiBsZW5ndGggaW4gYnl0ZXMgb2YgcmVnaW9uICovCit9IHhmc19sb2dfaW92ZWNfdDsKKwordHlwZWRlZiB2b2lkKiB4ZnNfbG9nX3RpY2tldF90OworCisvKgorICogU3RydWN0dXJlIHVzZWQgdG8gcGFzcyBjYWxsYmFjayBmdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uJ3MgYXJndW1lbnQKKyAqIHRvIHRoZSBsb2cgbWFuYWdlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2xvZ19jYWxsYmFjayB7CisJc3RydWN0IHhmc19sb2dfY2FsbGJhY2sJKmNiX25leHQ7CisJdm9pZAkJCSgqY2JfZnVuYykodm9pZCAqLCBpbnQpOworCXZvaWQJCQkqY2JfYXJnOworfSB4ZnNfbG9nX2NhbGxiYWNrX3Q7CisKKworI2lmZGVmIF9fS0VSTkVMX18KKy8qIExvZyBtYW5hZ2VyIGludGVyZmFjZXMgKi8KK3N0cnVjdCB4ZnNfbW91bnQ7Cit4ZnNfbHNuX3QgeGZzX2xvZ19kb25lKHN0cnVjdCB4ZnNfbW91bnQgKm1wLAorCQkgICAgICAgeGZzX2xvZ190aWNrZXRfdCB0aWNrZXQsCisJCSAgICAgICB2b2lkCQkqKmljbG9nLAorCQkgICAgICAgdWludAkJZmxhZ3MpOworaW50CSAgeGZzX2xvZ19mb3JjZShzdHJ1Y3QgeGZzX21vdW50ICptcCwKKwkJCXhmc19sc25fdAkgbHNuLAorCQkJdWludAkJIGZsYWdzKTsKK2ludAkgIHhmc19sb2dfbW91bnQoc3RydWN0IHhmc19tb3VudAkqbXAsCisJCQlzdHJ1Y3QgeGZzX2J1ZnRhcmcJKmxvZ190YXJnZXQsCisJCQl4ZnNfZGFkZHJfdAkJc3RhcnRfYmxvY2ssCisJCQlpbnQJCSAJbnVtX2JibG9ja3MpOworaW50CSAgeGZzX2xvZ19tb3VudF9maW5pc2goc3RydWN0IHhmc19tb3VudCAqbXAsIGludCk7Cit2b2lkCSAgeGZzX2xvZ19tb3ZlX3RhaWwoc3RydWN0IHhmc19tb3VudAkqbXAsCisJCQkgICAgeGZzX2xzbl90CQl0YWlsX2xzbik7CitpbnQJICB4ZnNfbG9nX25vdGlmeShzdHJ1Y3QgeGZzX21vdW50CSptcCwKKwkJCSB2b2lkCQkJKmljbG9nLAorCQkJIHhmc19sb2dfY2FsbGJhY2tfdAkqY2FsbGJhY2tfZW50cnkpOworaW50CSAgeGZzX2xvZ19yZWxlYXNlX2ljbG9nKHN0cnVjdCB4ZnNfbW91bnQgKm1wLAorCQkJIHZvaWQJCQkgKmljbG9nX2huZGwpOworaW50CSAgeGZzX2xvZ19yZXNlcnZlKHN0cnVjdCB4ZnNfbW91bnQgKm1wLAorCQkJICBpbnQJCSAgIGxlbmd0aCwKKwkJCSAgaW50CQkgICBjb3VudCwKKwkJCSAgeGZzX2xvZ190aWNrZXRfdCAqdGlja2V0LAorCQkJICBfX3VpbnQ4X3QJICAgY2xpZW50aWQsCisJCQkgIHVpbnQJCSAgIGZsYWdzKTsKK2ludAkgIHhmc19sb2dfd3JpdGUoc3RydWN0IHhmc19tb3VudCAqbXAsCisJCQl4ZnNfbG9nX2lvdmVjX3QgIHJlZ2lvbltdLAorCQkJaW50CQkgbmVudHJpZXMsCisJCQl4ZnNfbG9nX3RpY2tldF90IHRpY2tldCwKKwkJCXhmc19sc25fdAkgKnN0YXJ0X2xzbik7CitpbnQJICB4ZnNfbG9nX3VubW91bnQoc3RydWN0IHhmc19tb3VudCAqbXApOworaW50CSAgeGZzX2xvZ191bm1vdW50X3dyaXRlKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKK3ZvaWQgICAgICB4ZnNfbG9nX3VubW91bnRfZGVhbGxvYyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7CitpbnQJICB4ZnNfbG9nX2ZvcmNlX3Vtb3VudChzdHJ1Y3QgeGZzX21vdW50ICptcCwgaW50IGxvZ2Vycm9yKTsKK2ludAkgIHhmc19sb2dfbmVlZF9jb3ZlcmVkKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKwordm9pZAkgIHhsb2dfaW9kb25lKHN0cnVjdCB4ZnNfYnVmICopOworCisjZW5kaWYKKworCitleHRlcm4gaW50IHhsb2dfZGVidWc7CQkvKiBzZXQgdG8gMSB0byBlbmFibGUgcmVhbCBsb2cgKi8KKworCisjZW5kaWYJLyogX19YRlNfTE9HX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2dfcHJpdi5oIGIvZnMveGZzL3hmc19sb2dfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMWUzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2xvZ19wcml2LmgKQEAgLTAsMCArMSw1NjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmCV9fWEZTX0xPR19QUklWX0hfXworI2RlZmluZSBfX1hGU19MT0dfUFJJVl9IX18KKworc3RydWN0IHhmc19idWY7CitzdHJ1Y3Qga3RyYWNlOworc3RydWN0IGxvZzsKK3N0cnVjdCB4ZnNfYnVmX2NhbmNlbDsKK3N0cnVjdCB4ZnNfbW91bnQ7CisKKy8qCisgKiBNYWNyb3MsIHN0cnVjdHVyZXMsIHByb3RvdHlwZXMgZm9yIGludGVybmFsIGxvZyBtYW5hZ2VyIHVzZS4KKyAqLworCisjZGVmaW5lIFhMT0dfTUlOX0lDTE9HUwkJMgorI2RlZmluZSBYTE9HX01FRF9JQ0xPR1MJCTQKKyNkZWZpbmUgWExPR19NQVhfSUNMT0dTCQk4CisjZGVmaW5lIFhMT0dfQ0FMTEJBQ0tfU0laRQkxMAorI2RlZmluZSBYTE9HX0hFQURFUl9NQUdJQ19OVU0JMHhGRUVEYmFiZQkvKiBJbnZhbGlkIGN5Y2xlIG51bWJlciAqLworI2RlZmluZSBYTE9HX1ZFUlNJT05fMQkJMQorI2RlZmluZSBYTE9HX1ZFUlNJT05fMgkJMgkJLyogTGFyZ2UgSUNsb2dzLCBMb2cgc3VuaXQgKi8KKyNkZWZpbmUgWExPR19WRVJTSU9OX09LQklUUwkoWExPR19WRVJTSU9OXzEgfCBYTE9HX1ZFUlNJT05fMikKKyNkZWZpbmUgWExPR19SRUNPUkRfQlNJWkUJKDE2KjEwMjQpCS8qIGV2ZW50dWFsbHkgMzJrICovCisjZGVmaW5lIFhMT0dfQklHX1JFQ09SRF9CU0laRQkoMzIqMTAyNCkJLyogMzJrIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgWExPR19NQVhfUkVDT1JEX0JTSVpFCSgyNTYqMTAyNCkKKyNkZWZpbmUgWExPR19IRUFERVJfQ1lDTEVfU0laRQkoMzIqMTAyNCkJLyogY3ljbGUgZGF0YSBpbiBoZWFkZXIgKi8KKyNkZWZpbmUgWExPR19SRUNPUkRfQlNISUZUCTE0CQkvKiAxNjM4NCA9PSAxIDw8IDE0ICovCisjZGVmaW5lIFhMT0dfQklHX1JFQ09SRF9CU0hJRlQJMTUJCS8qIDMyayA9PSAxIDw8IDE1ICovCisjZGVmaW5lIFhMT0dfTUFYX1JFQ09SRF9CU0hJRlQJMTgJCS8qIDI1NmsgPT0gMSA8PCAxOCAqLworI2RlZmluZSBYTE9HX0JUT0xTVU5JVChsb2csIGIpICAoKChiKSsobG9nKS0+bF9tcC0+bV9zYi5zYl9sb2dzdW5pdC0xKSAvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2cpLT5sX21wLT5tX3NiLnNiX2xvZ3N1bml0KQorI2RlZmluZSBYTE9HX0xTVU5JVFRPQihsb2csIHN1KSAoKHN1KSAqIChsb2cpLT5sX21wLT5tX3NiLnNiX2xvZ3N1bml0KQorCisjZGVmaW5lIFhMT0dfSEVBREVSX1NJWkUJNTEyCisKKyNkZWZpbmUgWExPR19SRUNfU0hJRlQobG9nKSBcCisJQlRPQkIoMSA8PCAoWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJmxvZy0+bF9tcC0+bV9zYikgPyBcCisJIFhMT0dfTUFYX1JFQ09SRF9CU0hJRlQgOiBYTE9HX0JJR19SRUNPUkRfQlNISUZUKSkKKyNkZWZpbmUgWExPR19UT1RBTF9SRUNfU0hJRlQobG9nKSBcCisJQlRPQkIoWExPR19NQVhfSUNMT0dTIDw8IChYRlNfU0JfVkVSU0lPTl9IQVNMT0dWMigmbG9nLT5sX21wLT5tX3NiKSA/IFwKKwkgWExPR19NQVhfUkVDT1JEX0JTSElGVCA6IFhMT0dfQklHX1JFQ09SRF9CU0hJRlQpKQorCisvKgorICogIHNldCBsc25zCisgKi8KKworI2RlZmluZSBBU1NJR05fQU5ZX0xTTl9IT1NUKGxzbixjeWNsZSxibG9jaykgIFwKKyAgICB7IFwKKwkobHNuKSA9ICgoeGZzX2xzbl90KShjeWNsZSk8PDMyKXwoYmxvY2spOyBcCisgICAgfQorI2RlZmluZSBBU1NJR05fQU5ZX0xTTl9ESVNLKGxzbixjeWNsZSxibG9jaykgIFwKKyAgICB7IFwKKwlJTlRfU0VUKCgodWludCAqKSYobHNuKSlbMF0sIEFSQ0hfQ09OVkVSVCwgKGN5Y2xlKSk7IFwKKwlJTlRfU0VUKCgodWludCAqKSYobHNuKSlbMV0sIEFSQ0hfQ09OVkVSVCwgKGJsb2NrKSk7IFwKKyAgICB9CisjZGVmaW5lIEFTU0lHTl9MU04obHNuLGxvZykgXAorICAgIEFTU0lHTl9BTllfTFNOX0RJU0sobHNuLChsb2cpLT5sX2N1cnJfY3ljbGUsKGxvZyktPmxfY3Vycl9ibG9jayk7CisKKyNkZWZpbmUgWExPR19TRVQoZixiKQkJKCgoZikgJiAoYikpID09IChiKSkKKworI2RlZmluZSBHRVRfQ1lDTEUocHRyLCBhcmNoKSBcCisgICAgKElOVF9HRVQoKih1aW50ICopKHB0ciksIGFyY2gpID09IFhMT0dfSEVBREVSX01BR0lDX05VTSA/IFwKKwkgSU5UX0dFVCgqKCh1aW50ICopKHB0cikrMSksIGFyY2gpIDogXAorCSBJTlRfR0VUKCoodWludCAqKShwdHIpLCBhcmNoKSBcCisgICAgKQorCisjZGVmaW5lIEJMS19BVkcoYmxrMSwgYmxrMikJKChibGsxK2JsazIpID4+IDEpCisKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoKKyAqIGdldCBjbGllbnQgaWQgZnJvbSBwYWNrZWQgY29weS4KKyAqCisgKiB0aGlzIGhhY2sgaXMgaGVyZSBiZWNhdXNlIHRoZSB4bG9nX3BhY2sgY29kZSBjb3BpZXMgZm91ciBieXRlcworICogb2YgeGxvZ19vcF9oZWFkZXIgY29udGFpbmluZyB0aGUgZmllbGRzIG9oX2NsaWVudGlkLCBvaF9mbGFncworICogYW5kIG9oX3JlczIgaW50byB0aGUgcGFja2VkIGNvcHkuCisgKgorICogbGF0ZXIgb24gdGhpcyBmb3VyIGJ5dGUgY2h1bmsgaXMgdHJlYXRlZCBhcyBhbiBpbnQgYW5kIHRoZQorICogY2xpZW50IGlkIGlzIHB1bGxlZCBvdXQuCisgKgorICogdGhpcyBoYXMgZW5kaWFuIGlzc3Vlcywgb2YgY291cnNlLgorICovCisKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIEdFVF9DTElFTlRfSUQoaSxhcmNoKSBcCisgICAgKChpKSAmIDB4ZmYpCisjZWxzZQorI2RlZmluZSBHRVRfQ0xJRU5UX0lEKGksYXJjaCkgXAorICAgICgoaSkgPj4gMjQpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YTE9HX0dSQU5UX1NVQl9TUEFDRSkKK3ZvaWQgeGxvZ19ncmFudF9zdWJfc3BhY2Uoc3RydWN0IGxvZyAqbG9nLCBpbnQgYnl0ZXMsIGludCB0eXBlKTsKKyNkZWZpbmUgWExPR19HUkFOVF9TVUJfU1BBQ0UobG9nLGJ5dGVzLHR5cGUpCVwKKwl4bG9nX2dyYW50X3N1Yl9zcGFjZShsb2csYnl0ZXMsdHlwZSkKKyNlbHNlCisjZGVmaW5lIFhMT0dfR1JBTlRfU1VCX1NQQUNFKGxvZyxieXRlcyx0eXBlKQkJCQlcCisgICAgewkJCQkJCQkJCVwKKwlpZiAodHlwZSA9PSAndycpIHsJCQkJCQlcCisJCShsb2cpLT5sX2dyYW50X3dyaXRlX2J5dGVzIC09IChieXRlcyk7CQkJXAorCQlpZiAoKGxvZyktPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgPCAwKSB7CQkJXAorCQkJKGxvZyktPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgKz0gKGxvZyktPmxfbG9nc2l6ZTsJXAorCQkJKGxvZyktPmxfZ3JhbnRfd3JpdGVfY3ljbGUtLTsJCQlcCisJCX0JCQkJCQkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyAtPSAoYnl0ZXMpOwkJXAorCQlpZiAoKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyA8IDApIHsJCQlcCisJCQkobG9nKS0+bF9ncmFudF9yZXNlcnZlX2J5dGVzICs9IChsb2cpLT5sX2xvZ3NpemU7XAorCQkJKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9jeWNsZS0tOwkJCVwKKwkJfQkJCQkJCQlcCisJIH0JCQkJCQkJCVwKKyAgICB9CisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWExPR19HUkFOVF9BRERfU1BBQ0UpCit2b2lkIHhsb2dfZ3JhbnRfYWRkX3NwYWNlKHN0cnVjdCBsb2cgKmxvZywgaW50IGJ5dGVzLCBpbnQgdHlwZSk7CisjZGVmaW5lIFhMT0dfR1JBTlRfQUREX1NQQUNFKGxvZyxieXRlcyx0eXBlKQlcCisJeGxvZ19ncmFudF9hZGRfc3BhY2UobG9nLGJ5dGVzLHR5cGUpCisjZWxzZQorI2RlZmluZSBYTE9HX0dSQU5UX0FERF9TUEFDRShsb2csYnl0ZXMsdHlwZSkJCQkJXAorICAgIHsJCQkJCQkJCQlcCisJaWYgKHR5cGUgPT0gJ3cnKSB7CQkJCQkJXAorCQkobG9nKS0+bF9ncmFudF93cml0ZV9ieXRlcyArPSAoYnl0ZXMpOwkJCVwKKwkJaWYgKChsb2cpLT5sX2dyYW50X3dyaXRlX2J5dGVzID4gKGxvZyktPmxfbG9nc2l6ZSkgewlcCisJCQkobG9nKS0+bF9ncmFudF93cml0ZV9ieXRlcyAtPSAobG9nKS0+bF9sb2dzaXplOwlcCisJCQkobG9nKS0+bF9ncmFudF93cml0ZV9jeWNsZSsrOwkJCVwKKwkJfQkJCQkJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQkobG9nKS0+bF9ncmFudF9yZXNlcnZlX2J5dGVzICs9IChieXRlcyk7CQlcCisJCWlmICgobG9nKS0+bF9ncmFudF9yZXNlcnZlX2J5dGVzID4gKGxvZyktPmxfbG9nc2l6ZSkgewlcCisJCQkobG9nKS0+bF9ncmFudF9yZXNlcnZlX2J5dGVzIC09IChsb2cpLT5sX2xvZ3NpemU7XAorCQkJKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9jeWNsZSsrOwkJCVwKKwkJfQkJCQkJCQlcCisJIH0JCQkJCQkJCVwKKyAgICB9CisjZW5kaWYKKyNkZWZpbmUgWExPR19JTlNfVElDS0VUUShxLHRpYykJCQkJXAorICAgIHsJCQkJCQkJXAorCWlmIChxKSB7CQkJCQlcCisJCSh0aWMpLT50X25leHQJICAgID0gKHEpOwkJXAorCQkodGljKS0+dF9wcmV2CSAgICA9IChxKS0+dF9wcmV2OwlcCisJCShxKS0+dF9wcmV2LT50X25leHQgPSAodGljKTsJCVwKKwkJKHEpLT50X3ByZXYJICAgID0gKHRpYyk7CQlcCisJfSBlbHNlIHsJCQkJCVwKKwkJKHRpYyktPnRfcHJldiA9ICh0aWMpLT50X25leHQgPSAodGljKTsJXAorCQkocSkgPSAodGljKTsJCQkJXAorCX0JCQkJCQlcCisJKHRpYyktPnRfZmxhZ3MgfD0gWExPR19USUNfSU5fUTsJCVwKKyAgICB9CisjZGVmaW5lIFhMT0dfREVMX1RJQ0tFVFEocSx0aWMpCQkJCVwKKyAgICB7CQkJCQkJCVwKKwlpZiAoKHRpYykgPT0gKHRpYyktPnRfbmV4dCkgewkJCVwKKwkJKHEpID0gTlVMTDsJCQkJXAorCX0gZWxzZSB7CQkJCQlcCisJCShxKSA9ICh0aWMpLT50X25leHQ7CQkJXAorCQkodGljKS0+dF9uZXh0LT50X3ByZXYgPSAodGljKS0+dF9wcmV2OwlcCisJCSh0aWMpLT50X3ByZXYtPnRfbmV4dCA9ICh0aWMpLT50X25leHQ7CVwKKwl9CQkJCQkJXAorCSh0aWMpLT50X25leHQgPSAodGljKS0+dF9wcmV2ID0gTlVMTDsJCVwKKwkodGljKS0+dF9mbGFncyAmPSB+WExPR19USUNfSU5fUTsJCVwKKyAgICB9CisKKworI2RlZmluZSBHUkFOVF9MT0NLKGxvZykJCW11dGV4X3NwaW5sb2NrKCYobG9nKS0+bF9ncmFudF9sb2NrKQorI2RlZmluZSBHUkFOVF9VTkxPQ0sobG9nLCBzKQltdXRleF9zcGludW5sb2NrKCYobG9nKS0+bF9ncmFudF9sb2NrLCBzKQorI2RlZmluZSBMT0dfTE9DSyhsb2cpCQltdXRleF9zcGlubG9jaygmKGxvZyktPmxfaWNsb2dsb2NrKQorI2RlZmluZSBMT0dfVU5MT0NLKGxvZywgcykJbXV0ZXhfc3BpbnVubG9jaygmKGxvZyktPmxfaWNsb2dsb2NrLCBzKQorCisjZGVmaW5lIHhsb2dfcGFuaWMoYXJncy4uLikJY21uX2VycihDRV9QQU5JQywgIyMgYXJncykKKyNkZWZpbmUgeGxvZ19leGl0KGFyZ3MuLi4pCWNtbl9lcnIoQ0VfUEFOSUMsICMjIGFyZ3MpCisjZGVmaW5lIHhsb2dfd2FybihhcmdzLi4uKQljbW5fZXJyKENFX1dBUk4sICMjIGFyZ3MpCisKKy8qCisgKiBJbiBjb3JlIGxvZyBzdGF0ZQorICovCisjZGVmaW5lIFhMT0dfU1RBVEVfQUNUSVZFICAgIDB4MDAwMSAvKiBDdXJyZW50IElDIGxvZyBiZWluZyB3cml0dGVuIHRvICovCisjZGVmaW5lIFhMT0dfU1RBVEVfV0FOVF9TWU5DIDB4MDAwMiAvKiBXYW50IHRvIHN5bmMgdGhpcyBpY2xvZzsgbm8gbW9yZSB3cml0ZXMgKi8KKyNkZWZpbmUgWExPR19TVEFURV9TWU5DSU5HICAgMHgwMDA0IC8qIFRoaXMgSUMgbG9nIGlzIHN5bmNpbmcgKi8KKyNkZWZpbmUgWExPR19TVEFURV9ET05FX1NZTkMgMHgwMDA4IC8qIERvbmUgc3luY2luZyB0byBkaXNrICovCisjZGVmaW5lIFhMT0dfU1RBVEVfRE9fQ0FMTEJBQ0sgXAorCQkJICAgICAweDAwMTAgLyogUHJvY2VzcyBjYWxsYmFjayBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgWExPR19TVEFURV9DQUxMQkFDSyAgMHgwMDIwIC8qIENhbGxiYWNrIGZ1bmN0aW9ucyBub3cgKi8KKyNkZWZpbmUgWExPR19TVEFURV9ESVJUWSAgICAgMHgwMDQwIC8qIERpcnR5IElDIGxvZywgbm90IHJlYWR5IGZvciBBQ1RJVkUgc3RhdHVzKi8KKyNkZWZpbmUgWExPR19TVEFURV9JT0VSUk9SICAgMHgwMDgwIC8qIElPIGVycm9yIGhhcHBlbmVkIGluIHN5bmMnaW5nIGxvZyAqLworI2RlZmluZSBYTE9HX1NUQVRFX0FMTAkgICAgIDB4N0ZGRiAvKiBBbGwgcG9zc2libGUgdmFsaWQgZmxhZ3MgKi8KKyNkZWZpbmUgWExPR19TVEFURV9OT1RVU0VEICAgMHg4MDAwIC8qIFRoaXMgSUMgbG9nIG5vdCBiZWluZyB1c2VkICovCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisvKgorICogRmxhZ3MgdG8gbG9nIG9wZXJhdGlvbiBoZWFkZXIKKyAqCisgKiBUaGUgZmlyc3Qgd3JpdGUgb2YgYSBuZXcgdHJhbnNhY3Rpb24gd2lsbCBiZSBwcmVjZWRlZCB3aXRoIGEgc3RhcnQKKyAqIHJlY29yZCwgWExPR19TVEFSVF9UUkFOUy4gIE9uY2UgYSB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQsIGEgY29tbWl0CisgKiByZWNvcmQgaXMgd3JpdHRlbiwgWExPR19DT01NSVRfVFJBTlMuICBJZiBhIHNpbmdsZSByZWdpb24gY2FuIG5vdCBmaXQgaW50bworICogdGhlIHJlbWFpbmRlciBvZiB0aGUgY3VycmVudCBhY3RpdmUgaW4tY29yZSBsb2csIGl0IGlzIHNwbGl0IHVwIGludG8KKyAqIG11bHRpcGxlIHJlZ2lvbnMuICBFYWNoIHBhcnRpYWwgcmVnaW9uIHdpbGwgYmUgbWFya2VkIHdpdGggYQorICogWExPR19DT05USU5VRV9UUkFOUyB1bnRpbCB0aGUgbGFzdCBvbmUsIHdoaWNoIGdldHMgbWFya2VkIHdpdGggWExPR19FTkRfVFJBTlMuCisgKgorICovCisjZGVmaW5lIFhMT0dfU1RBUlRfVFJBTlMJMHgwMQkvKiBTdGFydCBhIG5ldyB0cmFuc2FjdGlvbiAqLworI2RlZmluZSBYTE9HX0NPTU1JVF9UUkFOUwkweDAyCS8qIENvbW1pdCB0aGlzIHRyYW5zYWN0aW9uICovCisjZGVmaW5lIFhMT0dfQ09OVElOVUVfVFJBTlMJMHgwNAkvKiBDb250IHRoaXMgdHJhbnMgaW50byBuZXcgcmVnaW9uICovCisjZGVmaW5lIFhMT0dfV0FTX0NPTlRfVFJBTlMJMHgwOAkvKiBDb250IHRoaXMgdHJhbnMgaW50byBuZXcgcmVnaW9uICovCisjZGVmaW5lIFhMT0dfRU5EX1RSQU5TCQkweDEwCS8qIEVuZCBhIGNvbnRpbnVlZCB0cmFuc2FjdGlvbiAqLworI2RlZmluZSBYTE9HX1VOTU9VTlRfVFJBTlMJMHgyMAkvKiBVbm1vdW50IGEgZmlsZXN5c3RlbSB0cmFuc2FjdGlvbiAqLworI2RlZmluZSBYTE9HX1NLSVBfVFJBTlMJCShYTE9HX0NPTU1JVF9UUkFOUyB8IFhMT0dfQ09OVElOVUVfVFJBTlMgfCBcCisJCQkJIFhMT0dfV0FTX0NPTlRfVFJBTlMgfCBYTE9HX0VORF9UUkFOUyB8IFwKKwkJCQkgWExPR19VTk1PVU5UX1RSQU5TKQorCisjaWZkZWYgX19LRVJORUxfXworLyoKKyAqIEZsYWdzIHRvIGxvZyB0aWNrZXQKKyAqLworI2RlZmluZSBYTE9HX1RJQ19JTklURUQJCTB4MQkvKiBoYXMgYmVlbiBpbml0aWFsaXplZCAqLworI2RlZmluZSBYTE9HX1RJQ19QRVJNX1JFU0VSVgkweDIJLyogcGVybWFuZW50IHJlc2VydmF0aW9uICovCisjZGVmaW5lIFhMT0dfVElDX0lOX1EJCTB4NAorI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworI2RlZmluZSBYTE9HX1VOTU9VTlRfVFlQRQkweDU1NmUJLyogVW4gZm9yIFVubW91bnQgKi8KKworLyoKKyAqIEZsYWdzIGZvciBsb2cgc3RydWN0dXJlCisgKi8KKyNkZWZpbmUgWExPR19DSEtTVU1fTUlTTUFUQ0gJMHgxCS8qIHVzZWQgb25seSBkdXJpbmcgcmVjb3ZlcnkgKi8KKyNkZWZpbmUgWExPR19BQ1RJVkVfUkVDT1ZFUlkJMHgyCS8qIGluIHRoZSBtaWRkbGUgb2YgcmVjb3ZlcnkgKi8KKyNkZWZpbmUJWExPR19SRUNPVkVSWV9ORUVERUQJMHg0CS8qIGxvZyB3YXMgcmVjb3ZlcmVkICovCisjZGVmaW5lIFhMT0dfSU9fRVJST1IJCTB4OAkvKiBsb2cgaGl0IGFuIEkvTyBlcnJvciwgYW5kIGJlaW5nCisJCQkJCSAgIHNodXRkb3duICovCit0eXBlZGVmIF9fdWludDMyX3QgeGxvZ190aWRfdDsKKworCisjaWZkZWYgX19LRVJORUxfXworLyoKKyAqIEJlbG93IGFyZSBzdGF0ZXMgZm9yIGNvdmVyaW5nIGFsbG9jYXRpb24gdHJhbnNhY3Rpb25zLgorICogQnkgY292ZXJpbmcsIHdlIG1lYW4gY2hhbmdpbmcgdGhlIGhfdGFpbF9sc24gaW4gdGhlIGxhc3Qgb24tZGlzaworICogbG9nIHdyaXRlIHN1Y2ggdGhhdCBubyBhbGxvY2F0aW9uIHRyYW5zYWN0aW9ucyB3aWxsIGJlIHJlLWRvbmUgZHVyaW5nCisgKiByZWNvdmVyeSBhZnRlciBhIHN5c3RlbSBjcmFzaC4gUmVjb3Zlcnkgc3RhcnRzIGF0IHRoZSBsYXN0IG9uLWRpc2sKKyAqIGxvZyB3cml0ZS4KKyAqCisgKiBUaGVzZSBzdGF0ZXMgYXJlIHVzZWQgdG8gaW5zZXJ0IGR1bW15IGxvZyBlbnRyaWVzIHRvIGNvdmVyCisgKiBzcGFjZSBhbGxvY2F0aW9uIHRyYW5zYWN0aW9ucyB3aGljaCBjYW4gdW5kbyBub24tdHJhbnNhY3Rpb25hbCBjaGFuZ2VzCisgKiBhZnRlciBhIGNyYXNoLiBXcml0ZXMgdG8gYSBmaWxlIHdpdGggc3BhY2UKKyAqIGFscmVhZHkgYWxsb2NhdGVkIGRvIG5vdCByZXN1bHQgaW4gYW55IHRyYW5zYWN0aW9ucy4gQWxsb2NhdGlvbnMKKyAqIG1pZ2h0IGluY2x1ZGUgc3BhY2UgYmV5b25kIHRoZSBFT0YuIFNvIGlmIHdlIGp1c3QgcHVzaCB0aGUgRU9GIGEKKyAqIGxpdHRsZSwgdGhlIGxhc3QgdHJhbnNhY3Rpb24gZm9yIHRoZSBmaWxlIGNvdWxkIGNvbnRhaW4gdGhlIHdyb25nCisgKiBzaXplLiBJZiB0aGVyZSBpcyBubyBmaWxlIHN5c3RlbSBhY3Rpdml0eSwgYWZ0ZXIgYW4gYWxsb2NhdGlvbgorICogdHJhbnNhY3Rpb24sIGFuZCB0aGUgc3lzdGVtIGNyYXNoZXMsIHRoZSBhbGxvY2F0aW9uIHRyYW5zYWN0aW9uCisgKiB3aWxsIGdldCByZXBsYXllZCBhbmQgdGhlIGZpbGUgd2lsbCBiZSB0cnVuY2F0ZWQuIFRoaXMgY291bGQKKyAqIGJlIGhvdXJzL2RheXMvLi4uIGFmdGVyIHRoZSBhbGxvY2F0aW9uIG9jY3VycmVkLgorICoKKyAqIFRoZSBmaXggZm9yIHRoaXMgaXMgdG8gZG8gdHdvIGR1bW15IHRyYW5zYWN0aW9ucyB3aGVuIHRoZQorICogc3lzdGVtIGlzIGlkbGUuIFdlIG5lZWQgdHdvIGR1bW15IHRyYW5zYWN0aW9uIGJlY2F1c2UgdGhlIGhfdGFpbF9sc24KKyAqIGluIHRoZSBsb2cgcmVjb3JkIGhlYWRlciBuZWVkcyB0byBwb2ludCBiZXlvbmQgdGhlIGxhc3QgcG9zc2libGUKKyAqIG5vbi1kdW1teSB0cmFuc2FjdGlvbi4gVGhlIGZpcnN0IGR1bW15IGNoYW5nZXMgdGhlIGhfdGFpbF9sc24gdG8KKyAqIHRoZSBmaXJzdCB0cmFuc2FjdGlvbiBiZWZvcmUgdGhlIGR1bW15LiBUaGUgc2Vjb25kIGR1bW15IGNhdXNlcworICogaF90YWlsX2xzbiB0byBwb2ludCB0byB0aGUgZmlyc3QgZHVtbXkuIFJlY292ZXJ5IHN0YXJ0cyBhdCBoX3RhaWxfbHNuLgorICoKKyAqIFRoZXNlIGR1bW15IHRyYW5zYWN0aW9ucyBnZXQgY29tbWl0dGVkIHdoZW4gZXZlcnl0aGluZworICogaXMgaWRsZSAoYWZ0ZXIgdGhlcmUgaGFzIGJlZW4gc29tZSBhY3Rpdml0eSkuCisgKgorICogVGhlcmUgYXJlIDUgc3RhdGVzIHVzZWQgdG8gY29udHJvbCB0aGlzLgorICoKKyAqICBJRExFIC0tIG5vIGxvZ2dpbmcgaGFzIGJlZW4gZG9uZSBvbiB0aGUgZmlsZSBzeXN0ZW0gb3IKKyAqCQl3ZSBhcmUgZG9uZSBjb3ZlcmluZyBwcmV2aW91cyB0cmFuc2FjdGlvbnMuCisgKiAgTkVFRCAtLSBsb2dnaW5nIGhhcyBvY2N1cnJlZCBhbmQgd2UgbmVlZCBhIGR1bW15IHRyYW5zYWN0aW9uCisgKgkJd2hlbiB0aGUgbG9nIGJlY29tZXMgaWRsZS4KKyAqICBET05FIC0tIHdlIHdlcmUgaW4gdGhlIE5FRUQgc3RhdGUgYW5kIGhhdmUgY29tbWl0dGVkIGEgZHVtbXkKKyAqCQl0cmFuc2FjdGlvbi4KKyAqICBORUVEMiAtLSB3ZSBkZXRlY3RlZCB0aGF0IGEgZHVtbXkgdHJhbnNhY3Rpb24gaGFzIGdvbmUgdG8gdGhlCisgKgkJb24gZGlzayBsb2cgd2l0aCBubyBvdGhlciB0cmFuc2FjdGlvbnMuCisgKiAgRE9ORTIgLS0gd2UgY29tbWl0dGVkIGEgZHVtbXkgdHJhbnNhY3Rpb24gd2hlbiBpbiB0aGUgTkVFRDIgc3RhdGUuCisgKgorICogVGhlcmUgYXJlIHR3byBwbGFjZXMgd2hlcmUgd2Ugc3dpdGNoIHN0YXRlczoKKyAqCisgKiAxLikgSW4geGZzX3N5bmMsIHdoZW4gd2UgZGV0ZWN0IGFuIGlkbGUgbG9nIGFuZCBhcmUgaW4gTkVFRCBvciBORUVEMi4KKyAqCVdlIGNvbW1pdCB0aGUgZHVtbXkgdHJhbnNhY3Rpb24gYW5kIHN3aXRjaCB0byBET05FIG9yIERPTkUyLAorICoJcmVzcGVjdGl2ZWx5LiBJbiBhbGwgb3RoZXIgc3RhdGVzLCB3ZSBkb24ndCBkbyBhbnl0aGluZy4KKyAqCisgKiAyLikgV2hlbiB3ZSBmaW5pc2ggd3JpdGluZyB0aGUgb24tZGlzayBsb2cgKHhsb2dfc3RhdGVfY2xlYW5fbG9nKS4KKyAqCisgKglObyBtYXR0ZXIgd2hhdCBzdGF0ZSB3ZSBhcmUgaW4sIGlmIHRoaXMgaXNuJ3QgdGhlIGR1bW15CisgKgl0cmFuc2FjdGlvbiBnb2luZyBvdXQsIHRoZSBuZXh0IHN0YXRlIGlzIE5FRUQuCisgKglTbywgaWYgd2UgYXJlbid0IGluIHRoZSBET05FIG9yIERPTkUyIHN0YXRlcywgdGhlIG5leHQgc3RhdGUKKyAqCWlzIE5FRUQuIFdlIGNhbid0IGJlIGZpbmlzaGluZyBhIHdyaXRlIG9mIHRoZSBkdW1teSByZWNvcmQKKyAqCXVubGVzcyBpdCB3YXMgY29tbWl0dGVkIGFuZCB0aGUgc3RhdGUgc3dpdGNoZWQgdG8gRE9ORSBvciBET05FMi4KKyAqCisgKglJZiB3ZSBhcmUgaW4gdGhlIERPTkUgc3RhdGUgYW5kIHRoaXMgd2FzIGEgd3JpdGUgb2YgdGhlCisgKgkJZHVtbXkgdHJhbnNhY3Rpb24sIHdlIG1vdmUgdG8gTkVFRDIuCisgKgorICoJSWYgd2UgYXJlIGluIHRoZSBET05FMiBzdGF0ZSBhbmQgdGhpcyB3YXMgYSB3cml0ZSBvZiB0aGUKKyAqCQlkdW1teSB0cmFuc2FjdGlvbiwgd2UgbW92ZSB0byBJRExFLgorICoKKyAqCisgKiBXcml0aW5nIG9ubHkgb25lIGR1bW15IHRyYW5zYWN0aW9uIGNhbiBnZXQgYXBwZW5kZWQgdG8KKyAqIG9uZSBmaWxlIHNwYWNlIGFsbG9jYXRpb24uIFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgbG9nIHJlY292ZXJ5CisgKiBjb2RlIHJlcGxheXMgdGhlIHNwYWNlIGFsbG9jYXRpb24gYW5kIGEgZmlsZSBjb3VsZCBiZSB0cnVuY2F0ZWQuCisgKiBUaGlzIGlzIHdoeSB3ZSBoYXZlIHRoZSBORUVEMiBhbmQgRE9ORTIgc3RhdGVzIGJlZm9yZSBnb2luZyBpZGxlLgorICovCisKKyNkZWZpbmUgWExPR19TVEFURV9DT1ZFUl9JRExFCTAKKyNkZWZpbmUgWExPR19TVEFURV9DT1ZFUl9ORUVECTEKKyNkZWZpbmUgWExPR19TVEFURV9DT1ZFUl9ET05FCTIKKyNkZWZpbmUgWExPR19TVEFURV9DT1ZFUl9ORUVEMgkzCisjZGVmaW5lIFhMT0dfU1RBVEVfQ09WRVJfRE9ORTIJNAorCisjZGVmaW5lIFhMT0dfQ09WRVJfT1BTCQk1CisKK3R5cGVkZWYgc3RydWN0IHhsb2dfdGlja2V0IHsKKwlzdl90CQkgICB0X3NlbWE7CSAvKiBzbGVlcCBvbiB0aGlzIHNlbWFwaG9yZQkgOjIwICovCisJc3RydWN0IHhsb2dfdGlja2V0ICp0X25leHQ7CSAvKgkJCSAgICAgICAgIDogNCAqLworCXN0cnVjdCB4bG9nX3RpY2tldCAqdF9wcmV2OwkgLyoJCQkJIDogNCAqLworCXhsb2dfdGlkX3QJICAgdF90aWQ7CSAvKiB0cmFuc2FjdGlvbiBpZGVudGlmaWVyCSA6IDQgKi8KKwlpbnQJCSAgIHRfY3Vycl9yZXM7CSAvKiBjdXJyZW50IHJlc2VydmF0aW9uIGluIGJ5dGVzIDogNCAqLworCWludAkJICAgdF91bml0X3JlczsJIC8qIHVuaXQgcmVzZXJ2YXRpb24gaW4gYnl0ZXMgICAgOiA0ICovCisJX191aW50OF90CSAgIHRfb2NudDsJIC8qIG9yaWdpbmFsIGNvdW50CQkgOiAxICovCisJX191aW50OF90CSAgIHRfY250OwkgLyogY3VycmVudCBjb3VudAkJIDogMSAqLworCV9fdWludDhfdAkgICB0X2NsaWVudGlkOwkgLyogd2hvIGRvZXMgdGhpcyBiZWxvbmcgdG87CSA6IDEgKi8KKwlfX3VpbnQ4X3QJICAgdF9mbGFnczsJIC8qIHByb3BlcnRpZXMgb2YgcmVzZXJ2YXRpb24JIDogMSAqLworfSB4bG9nX3RpY2tldF90OworI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgeGxvZ19vcF9oZWFkZXIgeworCXhsb2dfdGlkX3Qgb2hfdGlkOwkvKiB0cmFuc2FjdGlvbiBpZCBvZiBvcGVyYXRpb24JOiAgNCBiICovCisJaW50CSAgIG9oX2xlbjsJLyogYnl0ZXMgaW4gZGF0YSByZWdpb24JCTogIDQgYiAqLworCV9fdWludDhfdCAgb2hfY2xpZW50aWQ7CS8qIHdobyBzZW50IG1lIHRoaXMJCTogIDEgYiAqLworCV9fdWludDhfdCAgb2hfZmxhZ3M7CS8qCQkJCTogIDEgYiAqLworCXVzaG9ydAkgICBvaF9yZXMyOwkvKiAzMiBiaXQgYWxpZ24JCQk6ICAyIGIgKi8KK30geGxvZ19vcF9oZWFkZXJfdDsKKworCisvKiB2YWxpZCB2YWx1ZXMgZm9yIGhfZm10ICovCisjZGVmaW5lIFhMT0dfRk1UX1VOS05PV04gIDAKKyNkZWZpbmUgWExPR19GTVRfTElOVVhfTEUgMQorI2RlZmluZSBYTE9HX0ZNVF9MSU5VWF9CRSAyCisjZGVmaW5lIFhMT0dfRk1UX0lSSVhfQkUgIDMKKworLyogb3VyIGZtdCAqLworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgWExPR19GTVQgWExPR19GTVRfTElOVVhfTEUKKyNlbHNlCisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorI2RlZmluZSBYTE9HX0ZNVCBYTE9HX0ZNVF9MSU5VWF9CRQorI2Vsc2UKKyNlcnJvciB1bmtub3duIGJ5dGUgb3JkZXIKKyNlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHhsb2dfcmVjX2hlYWRlciB7CisJdWludAkgIGhfbWFnaWNubzsJLyogbG9nIHJlY29yZCAoTFIpIGlkZW50aWZpZXIJCTogIDQgKi8KKwl1aW50CSAgaF9jeWNsZTsJLyogd3JpdGUgY3ljbGUgb2YgbG9nCQkJOiAgNCAqLworCWludAkgIGhfdmVyc2lvbjsJLyogTFIgdmVyc2lvbgkJCQk6ICA0ICovCisJaW50CSAgaF9sZW47CS8qIGxlbiBpbiBieXRlczsgc2hvdWxkIGJlIDY0LWJpdCBhbGlnbmVkOiA0ICovCisJeGZzX2xzbl90IGhfbHNuOwkvKiBsc24gb2YgdGhpcyBMUgkJCTogIDggKi8KKwl4ZnNfbHNuX3QgaF90YWlsX2xzbjsJLyogbHNuIG9mIDFzdCBMUiB3LyBidWZmZXJzIG5vdCBjb21taXR0ZWQ6IDggKi8KKwl1aW50CSAgaF9jaGtzdW07CS8qIG1heSBub3QgYmUgdXNlZDsgbm9uLXplcm8gaWYgdXNlZAk6ICA0ICovCisJaW50CSAgaF9wcmV2X2Jsb2NrOyAvKiBibG9jayBudW1iZXIgdG8gcHJldmlvdXMgTFIJCTogIDQgKi8KKwlpbnQJICBoX251bV9sb2dvcHM7CS8qIG51bWJlciBvZiBsb2cgb3BlcmF0aW9ucyBpbiB0aGlzIExSCTogIDQgKi8KKwl1aW50CSAgaF9jeWNsZV9kYXRhW1hMT0dfSEVBREVSX0NZQ0xFX1NJWkUgLyBCQlNJWkVdOworCS8qIG5ldyBmaWVsZHMgKi8KKwlpbnQgICAgICAgaF9mbXQ7ICAgICAgICAvKiBmb3JtYXQgb2YgbG9nIHJlY29yZCAgICAgICAgICAgICAgICAgOiAgNCAqLworCXV1aWRfdCAgICBoX2ZzX3V1aWQ7ICAgIC8qIHV1aWQgb2YgRlMgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDE2ICovCisJaW50ICAgICAgIGhfc2l6ZTsJLyogaWNsb2cgc2l6ZQkJCQk6ICA0ICovCit9IHhsb2dfcmVjX2hlYWRlcl90OworCit0eXBlZGVmIHN0cnVjdCB4bG9nX3JlY19leHRfaGVhZGVyIHsKKwl1aW50CSAgeGhfY3ljbGU7CS8qIHdyaXRlIGN5Y2xlIG9mIGxvZwkJCTogNCAqLworCXVpbnQJICB4aF9jeWNsZV9kYXRhW1hMT0dfSEVBREVSX0NZQ0xFX1NJWkUgLyBCQlNJWkVdOyAvKgk6IDI1NiAqLworfSB4bG9nX3JlY19leHRfaGVhZGVyX3Q7CisKKyNpZmRlZiBfX0tFUk5FTF9fCisvKgorICogLSBBIGxvZyByZWNvcmQgaGVhZGVyIGlzIDUxMiBieXRlcy4gIFRoZXJlIGlzIHBsZW50eSBvZiByb29tIHRvIGdyb3cgdGhlCisgKgl4bG9nX3JlY19oZWFkZXJfdCBpbnRvIHRoZSByZXNlcnZlZCBzcGFjZS4KKyAqIC0gaWNfZGF0YSBmb2xsb3dzLCBzbyBhIHdyaXRlIHRvIGRpc2sgY2FuIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YKKyAqCXRoZSBpY2xvZy4KKyAqIC0gaWNfZm9yY2VzZW1hIGlzIHVzZWQgdG8gaW1wbGVtZW50IHN5bmNocm9ub3VzIGZvcmNpbmcgb2YgdGhlIGljbG9nIHRvIGRpc2suCisgKiAtIGljX25leHQgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIG5leHQgaWNsb2cgaW4gdGhlIHJpbmcuCisgKiAtIGljX2JwIGlzIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyIHVzZWQgdG8gd3JpdGUgdGhpcyBpbmNvcmUgbG9nIHRvIGRpc2suCisgKiAtIGljX2xvZyBpcyBhIHBvaW50ZXIgYmFjayB0byB0aGUgZ2xvYmFsIGxvZyBzdHJ1Y3R1cmUuCisgKiAtIGljX2NhbGxiYWNrIGlzIGEgbGlua2VkIGxpc3Qgb2YgY2FsbGJhY2sgZnVuY3Rpb24vYXJndW1lbnQgcGFpcnMgdG8gYmUKKyAqCWNhbGxlZCBhZnRlciBhbiBpY2xvZyBmaW5pc2hlcyB3cml0aW5nLgorICogLSBpY19zaXplIGlzIHRoZSBmdWxsIHNpemUgb2YgdGhlIGhlYWRlciBwbHVzIGRhdGEuCisgKiAtIGljX29mZnNldCBpcyB0aGUgY3VycmVudCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBpbiB0aGlzIGljbG9nLgorICogLSBpY19yZWZjbnQgaXMgYnVtcGVkIHdoZW4gc29tZW9uZSBpcyB3cml0aW5nIHRvIHRoZSBsb2cuCisgKiAtIGljX3N0YXRlIGlzIHRoZSBzdGF0ZSBvZiB0aGUgaWNsb2cuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhsb2dfaWNsb2dfZmllbGRzIHsKKwlzdl90CQkJaWNfZm9yY2VzZW1hOworCXN2X3QJCQlpY193cml0ZXNlbWE7CisJc3RydWN0IHhsb2dfaW5fY29yZQkqaWNfbmV4dDsKKwlzdHJ1Y3QgeGxvZ19pbl9jb3JlCSppY19wcmV2OworCXN0cnVjdCB4ZnNfYnVmCQkqaWNfYnA7CisJc3RydWN0IGxvZwkJKmljX2xvZzsKKwl4ZnNfbG9nX2NhbGxiYWNrX3QJKmljX2NhbGxiYWNrOworCXhmc19sb2dfY2FsbGJhY2tfdAkqKmljX2NhbGxiYWNrX3RhaWw7CisjaWZkZWYgWEZTX0xPR19UUkFDRQorCXN0cnVjdCBrdHJhY2UJCSppY190cmFjZTsKKyNlbmRpZgorCWludAkJCWljX3NpemU7CisJaW50CQkJaWNfb2Zmc2V0OworCWludAkJCWljX3JlZmNudDsKKwlpbnQJCQlpY19id3JpdGVjbnQ7CisJdXNob3J0X3QJCWljX3N0YXRlOworCWNoYXIJCQkqaWNfZGF0YXA7CS8qIHBvaW50ZXIgdG8gaWNsb2cgZGF0YSAqLworfSB4bG9nX2ljbG9nX2ZpZWxkc190OworCit0eXBlZGVmIHVuaW9uIHhsb2dfaW5fY29yZTIgeworCXhsb2dfcmVjX2hlYWRlcl90CWhpY19oZWFkZXI7CisJeGxvZ19yZWNfZXh0X2hlYWRlcl90CWhpY194aGVhZGVyOworCWNoYXIJCQloaWNfc2VjdG9yW1hMT0dfSEVBREVSX1NJWkVdOworfSB4bG9nX2luX2NvcmVfMl90OworCit0eXBlZGVmIHN0cnVjdCB4bG9nX2luX2NvcmUgeworCXhsb2dfaWNsb2dfZmllbGRzX3QJaGljX2ZpZWxkczsKKwl4bG9nX2luX2NvcmVfMl90CSpoaWNfZGF0YTsKK30geGxvZ19pbl9jb3JlX3Q7CisKKy8qCisgKiBEZWZpbmVzIHRvIHNhdmUgb3VyIGNvZGUgZnJvbSB0aGlzIGdsb3AuCisgKi8KKyNkZWZpbmUJaWNfZm9yY2VzZW1hCWhpY19maWVsZHMuaWNfZm9yY2VzZW1hCisjZGVmaW5lIGljX3dyaXRlc2VtYQloaWNfZmllbGRzLmljX3dyaXRlc2VtYQorI2RlZmluZQlpY19uZXh0CQloaWNfZmllbGRzLmljX25leHQKKyNkZWZpbmUJaWNfcHJldgkJaGljX2ZpZWxkcy5pY19wcmV2CisjZGVmaW5lCWljX2JwCQloaWNfZmllbGRzLmljX2JwCisjZGVmaW5lCWljX2xvZwkJaGljX2ZpZWxkcy5pY19sb2cKKyNkZWZpbmUJaWNfY2FsbGJhY2sJaGljX2ZpZWxkcy5pY19jYWxsYmFjaworI2RlZmluZQlpY19jYWxsYmFja190YWlsIGhpY19maWVsZHMuaWNfY2FsbGJhY2tfdGFpbAorI2RlZmluZQlpY190cmFjZQloaWNfZmllbGRzLmljX3RyYWNlCisjZGVmaW5lCWljX3NpemUJCWhpY19maWVsZHMuaWNfc2l6ZQorI2RlZmluZQlpY19vZmZzZXQJaGljX2ZpZWxkcy5pY19vZmZzZXQKKyNkZWZpbmUJaWNfcmVmY250CWhpY19maWVsZHMuaWNfcmVmY250CisjZGVmaW5lCWljX2J3cml0ZWNudAloaWNfZmllbGRzLmljX2J3cml0ZWNudAorI2RlZmluZQlpY19zdGF0ZQloaWNfZmllbGRzLmljX3N0YXRlCisjZGVmaW5lIGljX2RhdGFwCWhpY19maWVsZHMuaWNfZGF0YXAKKyNkZWZpbmUgaWNfaGVhZGVyCWhpY19kYXRhLT5oaWNfaGVhZGVyCisKKy8qCisgKiBUaGUgcmVzZXJ2YXRpb24gaGVhZCBsc24gaXMgbm90IG1hZGUgdXAgb2YgYSBjeWNsZSBudW1iZXIgYW5kIGJsb2NrIG51bWJlci4KKyAqIEluc3RlYWQsIGl0IHVzZXMgYSBjeWNsZSBudW1iZXIgYW5kIGJ5dGUgbnVtYmVyLiAgTG9ncyBkb24ndCBleHBlY3QgdG8KKyAqIG92ZXJmbG93IDMxIGJpdHMgd29ydGggb2YgYnl0ZSBvZmZzZXQsIHNvIHVzaW5nIGEgYnl0ZSBudW1iZXIgd2lsbCBtZWFuCisgKiB0aGF0IHJvdW5kIG9mZiBwcm9ibGVtcyB3b24ndCBvY2N1ciB3aGVuIHJlbGVhc2luZyBwYXJ0aWFsIHJlc2VydmF0aW9ucy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbG9nIHsKKwkvKiBUaGUgZm9sbG93aW5nIGJsb2NrIG9mIGZpZWxkcyBhcmUgY2hhbmdlZCB3aGlsZSBob2xkaW5nIGljbG9nbG9jayAqLworCXNlbWFfdAkJCWxfZmx1c2hzZW1hOyAgICAvKiBpY2xvZyBmbHVzaGluZyBzZW1hcGhvcmUgKi8KKwlpbnQJCQlsX2ZsdXNoY250OwkvKiAjIG9mIHByb2NzIHdhaXRpbmcgb24gdGhpcworCQkJCQkJICogc2VtYSAqLworCWludAkJCWxfdGlja2V0X2NudDsJLyogZnJlZSB0aWNrZXQgY291bnQgKi8KKwlpbnQJCQlsX3RpY2tldF90Y250OwkvKiB0b3RhbCB0aWNrZXQgY291bnQgKi8KKwlpbnQJCQlsX2NvdmVyZWRfc3RhdGU7Lyogc3RhdGUgb2YgImNvdmVyaW5nIGRpc2sKKwkJCQkJCSAqIGxvZyBlbnRyaWVzIiAqLworCXhsb2dfdGlja2V0X3QJCSpsX2ZyZWVsaXN0OyAgICAvKiBmcmVlIGxpc3Qgb2YgdGlja2V0cyAqLworCXhsb2dfdGlja2V0X3QJCSpsX3VubW91bnRfZnJlZTsvKiBrbWVtX2ZyZWUgdGhlc2UgYWRkcmVzc2VzICovCisJeGxvZ190aWNrZXRfdAkJKmxfdGFpbDsgICAgICAgIC8qIGZyZWUgbGlzdCBvZiB0aWNrZXRzICovCisJeGxvZ19pbl9jb3JlX3QJCSpsX2ljbG9nOyAgICAgICAvKiBoZWFkIGxvZyBxdWV1ZQkqLworCWxvY2tfdAkJCWxfaWNsb2dsb2NrOyAgICAvKiBncmFiIHRvIGNoYW5nZSBpY2xvZyBzdGF0ZSAqLworCXhmc19sc25fdAkJbF90YWlsX2xzbjsgICAgIC8qIGxzbiBvZiAxc3QgTFIgd2l0aCB1bmZsdXNoZWQKKwkJCQkJCSAqIGJ1ZmZlcnMgKi8KKwl4ZnNfbHNuX3QJCWxfbGFzdF9zeW5jX2xzbjsvKiBsc24gb2YgbGFzdCBMUiBvbiBkaXNrICovCisJc3RydWN0IHhmc19tb3VudAkqbF9tcDsJICAgICAgICAvKiBtb3VudCBwb2ludCAqLworCXN0cnVjdCB4ZnNfYnVmCQkqbF94YnVmOyAgICAgICAgLyogZXh0cmEgYnVmZmVyIGZvciBsb2cKKwkJCQkJCSAqIHdyYXBwaW5nICovCisJc3RydWN0IHhmc19idWZ0YXJnCSpsX3Rhcmc7ICAgICAgICAvKiBidWZ0YXJnIG9mIGxvZyAqLworCXhmc19kYWRkcl90CQlsX2xvZ0JCc3RhcnQ7ICAgLyogc3RhcnQgYmxvY2sgb2YgbG9nICovCisJaW50CQkJbF9sb2dzaXplOyAgICAgIC8qIHNpemUgb2YgbG9nIGluIGJ5dGVzICovCisJaW50CQkJbF9sb2dCQnNpemU7ICAgIC8qIHNpemUgb2YgbG9nIGluIEJCIGNodW5rcyAqLworCWludAkJCWxfY3Vycl9jeWNsZTsgICAvKiBDeWNsZSBudW1iZXIgb2YgbG9nIHdyaXRlcyAqLworCWludAkJCWxfcHJldl9jeWNsZTsgICAvKiBDeWNsZSBudW1iZXIgYmVmb3JlIGxhc3QKKwkJCQkJCSAqIGJsb2NrIGluY3JlbWVudCAqLworCWludAkJCWxfY3Vycl9ibG9jazsgICAvKiBjdXJyZW50IGxvZ2ljYWwgbG9nIGJsb2NrICovCisJaW50CQkJbF9wcmV2X2Jsb2NrOyAgIC8qIHByZXZpb3VzIGxvZ2ljYWwgbG9nIGJsb2NrICovCisJaW50CQkJbF9pY2xvZ19zaXplOwkvKiBzaXplIG9mIGxvZyBpbiBieXRlcyAqLworCWludAkJCWxfaWNsb2dfc2l6ZV9sb2c7IC8qIGxvZyBwb3dlciBzaXplIG9mIGxvZyAqLworCWludAkJCWxfaWNsb2dfYnVmczsJLyogbnVtYmVyIG9mIGljbG9nIGJ1ZmZlcnMgKi8KKworCS8qIFRoZSBmb2xsb3dpbmcgZmllbGQgYXJlIHVzZWQgZm9yIGRlYnVnZ2luZzsgbmVlZCB0byBob2xkIGljbG9nbG9jayAqLworCWNoYXIJCQkqbF9pY2xvZ19iYWtbWExPR19NQVhfSUNMT0dTXTsKKworCS8qIFRoZSBmb2xsb3dpbmcgYmxvY2sgb2YgZmllbGRzIGFyZSBjaGFuZ2VkIHdoaWxlIGhvbGRpbmcgZ3JhbnRfbG9jayAqLworCWxvY2tfdAkJCWxfZ3JhbnRfbG9jazsKKwl4bG9nX3RpY2tldF90CQkqbF9yZXNlcnZlX2hlYWRxOworCXhsb2dfdGlja2V0X3QJCSpsX3dyaXRlX2hlYWRxOworCWludAkJCWxfZ3JhbnRfcmVzZXJ2ZV9jeWNsZTsKKwlpbnQJCQlsX2dyYW50X3Jlc2VydmVfYnl0ZXM7CisJaW50CQkJbF9ncmFudF93cml0ZV9jeWNsZTsKKwlpbnQJCQlsX2dyYW50X3dyaXRlX2J5dGVzOworCisJLyogVGhlIGZvbGxvd2luZyBmaWVsZHMgZG9uJ3QgbmVlZCBsb2NraW5nICovCisjaWZkZWYgWEZTX0xPR19UUkFDRQorCXN0cnVjdCBrdHJhY2UJCSpsX3RyYWNlOworCXN0cnVjdCBrdHJhY2UJCSpsX2dyYW50X3RyYWNlOworI2VuZGlmCisJdWludAkJCWxfZmxhZ3M7CisJdWludAkJCWxfcXVvdGFvZmZzX2ZsYWc7IC8qIFhGU19EUV8qLCBmb3IgUVVPVEFPRkZzICovCisJc3RydWN0IHhmc19idWZfY2FuY2VsCSoqbF9idWZfY2FuY2VsX3RhYmxlOworCWludAkJCWxfaWNsb2dfaHNpemU7ICAvKiBzaXplIG9mIGljbG9nIGhlYWRlciAqLworCWludAkJCWxfaWNsb2dfaGVhZHM7ICAvKiAjIG9mIGljbG9nIGhlYWRlciBzZWN0b3JzICovCisJdWludAkJCWxfc2VjdGJiX2xvZzsgICAvKiBsb2cyIG9mIHNlY3RvciBzaXplIGluIEJCcyAqLworCXVpbnQJCQlsX3NlY3RiYl9tYXNrOyAgLyogc2VjdG9yIHNpemUgKGluIEJCcykKKwkJCQkJCSAqIGFsaWdubWVudCBtYXNrICovCit9IHhsb2dfdDsKKworCisvKiBjb21tb24gcm91dGluZXMgKi8KK2V4dGVybiB4ZnNfbHNuX3QgeGxvZ19hc3NpZ25fdGFpbF9sc24oc3RydWN0IHhmc19tb3VudCAqbXApOworZXh0ZXJuIGludAkgeGxvZ19maW5kX2hlYWQoeGxvZ190ICpsb2csIHhmc19kYWRkcl90ICpoZWFkX2Jsayk7CitleHRlcm4gaW50CSB4bG9nX2ZpbmRfdGFpbCh4bG9nX3QJKmxvZywKKwkJCQl4ZnNfZGFkZHJfdCAqaGVhZF9ibGssCisJCQkJeGZzX2RhZGRyX3QgKnRhaWxfYmxrLAorCQkJCWludCByZWFkb25seSk7CitleHRlcm4gaW50CSB4bG9nX3JlY292ZXIoeGxvZ190ICpsb2csIGludCByZWFkb25seSk7CitleHRlcm4gaW50CSB4bG9nX3JlY292ZXJfZmluaXNoKHhsb2dfdCAqbG9nLCBpbnQgbWZzaV9mbGFncyk7CitleHRlcm4gdm9pZAkgeGxvZ19wYWNrX2RhdGEoeGxvZ190ICpsb2csIHhsb2dfaW5fY29yZV90ICppY2xvZywgaW50KTsKK2V4dGVybiB2b2lkCSB4bG9nX3JlY292ZXJfcHJvY2Vzc19pdW5saW5rcyh4bG9nX3QgKmxvZyk7CisKK2V4dGVybiBzdHJ1Y3QgeGZzX2J1ZiAqeGxvZ19nZXRfYnAoeGxvZ190ICosIGludCk7CitleHRlcm4gdm9pZAkgeGxvZ19wdXRfYnAoc3RydWN0IHhmc19idWYgKik7CitleHRlcm4gaW50CSB4bG9nX2JyZWFkKHhsb2dfdCAqLCB4ZnNfZGFkZHJfdCwgaW50LCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKK2V4dGVybiB4ZnNfY2FkZHJfdCB4bG9nX2FsaWduKHhsb2dfdCAqLCB4ZnNfZGFkZHJfdCwgaW50LCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKKworLyogaWNsb2cgdHJhY2luZyAqLworI2RlZmluZSBYTE9HX1RSQUNFX0dSQUJfRkxVU0ggIDEKKyNkZWZpbmUgWExPR19UUkFDRV9SRUxfRkxVU0ggICAyCisjZGVmaW5lIFhMT0dfVFJBQ0VfU0xFRVBfRkxVU0ggMworI2RlZmluZSBYTE9HX1RSQUNFX1dBS0VfRkxVU0ggIDQKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCS8qIF9fWEZTX0xPR19QUklWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jIGIvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MjRiNWIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMKQEAgLTAsMCArMSw0MDk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2ltYXAuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2xvZ19wcml2LmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2xvZ19yZWNvdmVyLmgiCisjaW5jbHVkZSAieGZzX2V4dGZyZWVfaXRlbS5oIgorI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19xdW90YS5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorCitTVEFUSUMgaW50CXhsb2dfZmluZF96ZXJvZWQoeGxvZ190ICosIHhmc19kYWRkcl90ICopOworU1RBVElDIGludAl4bG9nX2NsZWFyX3N0YWxlX2Jsb2Nrcyh4bG9nX3QgKiwgeGZzX2xzbl90KTsKK1NUQVRJQyB2b2lkCXhsb2dfcmVjb3Zlcl9pbnNlcnRfaXRlbV9iYWNrcSh4bG9nX3JlY292ZXJfaXRlbV90ICoqcSwKKwkJCQkJICAgICAgIHhsb2dfcmVjb3Zlcl9pdGVtX3QgKml0ZW0pOworI2lmIGRlZmluZWQoREVCVUcpCitTVEFUSUMgdm9pZAl4bG9nX3JlY292ZXJfY2hlY2tfc3VtbWFyeSh4bG9nX3QgKik7CitTVEFUSUMgdm9pZAl4bG9nX3JlY292ZXJfY2hlY2tfYWlsKHhmc19tb3VudF90ICosIHhmc19sb2dfaXRlbV90ICosIGludCk7CisjZWxzZQorI2RlZmluZQl4bG9nX3JlY292ZXJfY2hlY2tfc3VtbWFyeShsb2cpCisjZGVmaW5lCXhsb2dfcmVjb3Zlcl9jaGVja19haWwobXAsIGxpcCwgZ2VuKQorI2VuZGlmCisKKworLyoKKyAqIFNlY3RvciBhbGlnbmVkIGJ1ZmZlciByb3V0aW5lcyBmb3IgYnVmZmVyIGNyZWF0ZS9yZWFkL3dyaXRlL2FjY2VzcworICovCisKKyNkZWZpbmUgWExPR19TRUNUT1JfUk9VTkRVUF9CQkNPVU5UKGxvZywgYmJzKQlcCisJKCAoKGxvZyktPmxfc2VjdGJiX21hc2sgJiYgKGJicyAmIChsb2cpLT5sX3NlY3RiYl9tYXNrKSkgPyBcCisJKChiYnMgKyAobG9nKS0+bF9zZWN0YmJfbWFzayArIDEpICYgfihsb2cpLT5sX3NlY3RiYl9tYXNrKSA6IChiYnMpICkKKyNkZWZpbmUgWExPR19TRUNUT1JfUk9VTkRET1dOX0JMS05PKGxvZywgYm5vKQkoKGJubykgJiB+KGxvZyktPmxfc2VjdGJiX21hc2spCisKK3hmc19idWZfdCAqCit4bG9nX2dldF9icCgKKwl4bG9nX3QJCSpsb2csCisJaW50CQludW1fYmJsa3MpCit7CisJQVNTRVJUKG51bV9iYmxrcyA+IDApOworCisJaWYgKGxvZy0+bF9zZWN0YmJfbG9nKSB7CisJCWlmIChudW1fYmJsa3MgPiAxKQorCQkJbnVtX2JibGtzICs9IFhMT0dfU0VDVE9SX1JPVU5EVVBfQkJDT1VOVChsb2csIDEpOworCQludW1fYmJsa3MgPSBYTE9HX1NFQ1RPUl9ST1VORFVQX0JCQ09VTlQobG9nLCBudW1fYmJsa3MpOworCX0KKwlyZXR1cm4geGZzX2J1Zl9nZXRfbm9hZGRyKEJCVE9CKG51bV9iYmxrcyksIGxvZy0+bF9tcC0+bV9sb2dkZXZfdGFyZ3ApOworfQorCit2b2lkCit4bG9nX3B1dF9icCgKKwl4ZnNfYnVmX3QJKmJwKQoreworCXhmc19idWZfZnJlZShicCk7Cit9CisKKworLyoKKyAqIG5iYmxrcyBzaG91bGQgYmUgdWludCwgYnV0IG9oIHdlbGwuICBKdXN0IHdhbnQgdG8gY2F0Y2ggdGhhdCAzMi1iaXQgbGVuZ3RoLgorICovCitpbnQKK3hsb2dfYnJlYWQoCisJeGxvZ190CQkqbG9nLAorCXhmc19kYWRkcl90CWJsa19ubywKKwlpbnQJCW5iYmxrcywKKwl4ZnNfYnVmX3QJKmJwKQoreworCWludAkJZXJyb3I7CisKKwlpZiAobG9nLT5sX3NlY3RiYl9sb2cpIHsKKwkJYmxrX25vID0gWExPR19TRUNUT1JfUk9VTkRET1dOX0JMS05PKGxvZywgYmxrX25vKTsKKwkJbmJibGtzID0gWExPR19TRUNUT1JfUk9VTkRVUF9CQkNPVU5UKGxvZywgbmJibGtzKTsKKwl9CisKKwlBU1NFUlQobmJibGtzID4gMCk7CisJQVNTRVJUKEJCVE9CKG5iYmxrcykgPD0gWEZTX0JVRl9TSVpFKGJwKSk7CisJQVNTRVJUKGJwKTsKKworCVhGU19CVUZfU0VUX0FERFIoYnAsIGxvZy0+bF9sb2dCQnN0YXJ0ICsgYmxrX25vKTsKKwlYRlNfQlVGX1JFQUQoYnApOworCVhGU19CVUZfQlVTWShicCk7CisJWEZTX0JVRl9TRVRfQ09VTlQoYnAsIEJCVE9CKG5iYmxrcykpOworCVhGU19CVUZfU0VUX1RBUkdFVChicCwgbG9nLT5sX21wLT5tX2xvZ2Rldl90YXJncCk7CisKKwl4ZnNiZHN0cmF0KGxvZy0+bF9tcCwgYnApOworCWlmICgoZXJyb3IgPSB4ZnNfaW93YWl0KGJwKSkpCisJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX2JyZWFkIiwgbG9nLT5sX21wLAorCQkJCSAgYnAsIFhGU19CVUZfQUREUihicCkpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFdyaXRlIG91dCB0aGUgYnVmZmVyIGF0IHRoZSBnaXZlbiBibG9jayBmb3IgdGhlIGdpdmVuIG51bWJlciBvZiBibG9ja3MuCisgKiBUaGUgYnVmZmVyIGlzIGtlcHQgbG9ja2VkIGFjcm9zcyB0aGUgd3JpdGUgYW5kIGlzIHJldHVybmVkIGxvY2tlZC4KKyAqIFRoaXMgY2FuIG9ubHkgYmUgdXNlZCBmb3Igc3luY2hyb25vdXMgbG9nIHdyaXRlcy4KKyAqLworaW50Cit4bG9nX2J3cml0ZSgKKwl4bG9nX3QJCSpsb2csCisJeGZzX2RhZGRyX3QJYmxrX25vLAorCWludAkJbmJibGtzLAorCXhmc19idWZfdAkqYnApCit7CisJaW50CQllcnJvcjsKKworCWlmIChsb2ctPmxfc2VjdGJiX2xvZykgeworCQlibGtfbm8gPSBYTE9HX1NFQ1RPUl9ST1VORERPV05fQkxLTk8obG9nLCBibGtfbm8pOworCQluYmJsa3MgPSBYTE9HX1NFQ1RPUl9ST1VORFVQX0JCQ09VTlQobG9nLCBuYmJsa3MpOworCX0KKworCUFTU0VSVChuYmJsa3MgPiAwKTsKKwlBU1NFUlQoQkJUT0IobmJibGtzKSA8PSBYRlNfQlVGX1NJWkUoYnApKTsKKworCVhGU19CVUZfU0VUX0FERFIoYnAsIGxvZy0+bF9sb2dCQnN0YXJ0ICsgYmxrX25vKTsKKwlYRlNfQlVGX1pFUk9GTEFHUyhicCk7CisJWEZTX0JVRl9CVVNZKGJwKTsKKwlYRlNfQlVGX0hPTEQoYnApOworCVhGU19CVUZfUFNFTUEoYnAsIFBSSUJJTyk7CisJWEZTX0JVRl9TRVRfQ09VTlQoYnAsIEJCVE9CKG5iYmxrcykpOworCVhGU19CVUZfU0VUX1RBUkdFVChicCwgbG9nLT5sX21wLT5tX2xvZ2Rldl90YXJncCk7CisKKwlpZiAoKGVycm9yID0geGZzX2J3cml0ZShsb2ctPmxfbXAsIGJwKSkpCisJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX2J3cml0ZSIsIGxvZy0+bF9tcCwKKwkJCQkgIGJwLCBYRlNfQlVGX0FERFIoYnApKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3hmc19jYWRkcl90Cit4bG9nX2FsaWduKAorCXhsb2dfdAkJKmxvZywKKwl4ZnNfZGFkZHJfdAlibGtfbm8sCisJaW50CQluYmJsa3MsCisJeGZzX2J1Zl90CSpicCkKK3sKKwl4ZnNfY2FkZHJfdAlwdHI7CisKKwlpZiAoIWxvZy0+bF9zZWN0YmJfbG9nKQorCQlyZXR1cm4gWEZTX0JVRl9QVFIoYnApOworCisJcHRyID0gWEZTX0JVRl9QVFIoYnApICsgQkJUT0IoKGludClibGtfbm8gJiBsb2ctPmxfc2VjdGJiX21hc2spOworCUFTU0VSVChYRlNfQlVGX1NJWkUoYnApID49CisJCUJCVE9CKG5iYmxrcyArIChibGtfbm8gJiBsb2ctPmxfc2VjdGJiX21hc2spKSk7CisJcmV0dXJuIHB0cjsKK30KKworI2lmZGVmIERFQlVHCisvKgorICogZHVtcCBkZWJ1ZyBzdXBlcmJsb2NrIGFuZCBsb2cgcmVjb3JkIGluZm9ybWF0aW9uCisgKi8KK1NUQVRJQyB2b2lkCit4bG9nX2hlYWRlcl9jaGVja19kdW1wKAorCXhmc19tb3VudF90CQkqbXAsCisJeGxvZ19yZWNfaGVhZGVyX3QJKmhlYWQpCit7CisJaW50CQkJYjsKKworCXByaW50aygiJXM6ICBTQiA6IHV1aWQgPSAiLCBfX0ZVTkNUSU9OX18pOworCWZvciAoYiA9IDA7IGIgPCAxNjsgYisrKQorCQlwcmludGsoIiUwMngiLCgodW5zaWduZWQgY2hhciAqKSZtcC0+bV9zYi5zYl91dWlkKVtiXSk7CisJcHJpbnRrKCIsIGZtdCA9ICVkXG4iLCBYTE9HX0ZNVCk7CisJcHJpbnRrKCIgICAgbG9nIDogdXVpZCA9ICIpOworCWZvciAoYiA9IDA7IGIgPCAxNjsgYisrKQorCQlwcmludGsoIiUwMngiLCgodW5zaWduZWQgY2hhciAqKSZoZWFkLT5oX2ZzX3V1aWQpW2JdKTsKKwlwcmludGsoIiwgZm10ID0gJWRcbiIsIElOVF9HRVQoaGVhZC0+aF9mbXQsIEFSQ0hfQ09OVkVSVCkpOworfQorI2Vsc2UKKyNkZWZpbmUgeGxvZ19oZWFkZXJfY2hlY2tfZHVtcChtcCwgaGVhZCkKKyNlbmRpZgorCisvKgorICogY2hlY2sgbG9nIHJlY29yZCBoZWFkZXIgZm9yIHJlY292ZXJ5CisgKi8KK1NUQVRJQyBpbnQKK3hsb2dfaGVhZGVyX2NoZWNrX3JlY292ZXIoCisJeGZzX21vdW50X3QJCSptcCwKKwl4bG9nX3JlY19oZWFkZXJfdAkqaGVhZCkKK3sKKwlBU1NFUlQoSU5UX0dFVChoZWFkLT5oX21hZ2ljbm8sIEFSQ0hfQ09OVkVSVCkgPT0gWExPR19IRUFERVJfTUFHSUNfTlVNKTsKKworCS8qCisJICogSVJJWCBkb2Vzbid0IHdyaXRlIHRoZSBoX2ZtdCBmaWVsZCBhbmQgbGVhdmVzIGl0IHplcm9lZAorCSAqIChYTE9HX0ZNVF9VTktOT1dOKS4gVGhpcyBzdG9wcyB1cyBmcm9tIHRyeWluZyB0byByZWNvdmVyCisJICogYSBkaXJ0eSBsb2cgY3JlYXRlZCBpbiBJUklYLgorCSAqLworCWlmICh1bmxpa2VseShJTlRfR0VUKGhlYWQtPmhfZm10LCBBUkNIX0NPTlZFUlQpICE9IFhMT0dfRk1UKSkgeworCQl4bG9nX3dhcm4oCisJIlhGUzogZGlydHkgbG9nIHdyaXR0ZW4gaW4gaW5jb21wYXRpYmxlIGZvcm1hdCAtIGNhbid0IHJlY292ZXIiKTsKKwkJeGxvZ19oZWFkZXJfY2hlY2tfZHVtcChtcCwgaGVhZCk7CisJCVhGU19FUlJPUl9SRVBPUlQoInhsb2dfaGVhZGVyX2NoZWNrX3JlY292ZXIoMSkiLAorCQkJCSBYRlNfRVJSTEVWRUxfSElHSCwgbXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfSBlbHNlIGlmICh1bmxpa2VseSghdXVpZF9lcXVhbCgmbXAtPm1fc2Iuc2JfdXVpZCwgJmhlYWQtPmhfZnNfdXVpZCkpKSB7CisJCXhsb2dfd2FybigKKwkiWEZTOiBkaXJ0eSBsb2cgZW50cnkgaGFzIG1pc21hdGNoZWQgdXVpZCAtIGNhbid0IHJlY292ZXIiKTsKKwkJeGxvZ19oZWFkZXJfY2hlY2tfZHVtcChtcCwgaGVhZCk7CisJCVhGU19FUlJPUl9SRVBPUlQoInhsb2dfaGVhZGVyX2NoZWNrX3JlY292ZXIoMikiLAorCQkJCSBYRlNfRVJSTEVWRUxfSElHSCwgbXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogcmVhZCB0aGUgaGVhZCBibG9jayBvZiB0aGUgbG9nIGFuZCBjaGVjayB0aGUgaGVhZGVyCisgKi8KK1NUQVRJQyBpbnQKK3hsb2dfaGVhZGVyX2NoZWNrX21vdW50KAorCXhmc19tb3VudF90CQkqbXAsCisJeGxvZ19yZWNfaGVhZGVyX3QJKmhlYWQpCit7CisJQVNTRVJUKElOVF9HRVQoaGVhZC0+aF9tYWdpY25vLCBBUkNIX0NPTlZFUlQpID09IFhMT0dfSEVBREVSX01BR0lDX05VTSk7CisKKwlpZiAodXVpZF9pc19uaWwoJmhlYWQtPmhfZnNfdXVpZCkpIHsKKwkJLyoKKwkJICogSVJJWCBkb2Vzbid0IHdyaXRlIHRoZSBoX2ZzX3V1aWQgb3IgaF9mbXQgZmllbGRzLiBJZgorCQkgKiBoX2ZzX3V1aWQgaXMgbmlsLCB3ZSBhc3N1bWUgdGhpcyBsb2cgd2FzIGxhc3QgbW91bnRlZAorCQkgKiBieSBJUklYIGFuZCBjb250aW51ZS4KKwkJICovCisJCXhsb2dfd2FybigiWEZTOiBuaWwgdXVpZCBpbiBsb2cgLSBJUklYIHN0eWxlIGxvZyIpOworCX0gZWxzZSBpZiAodW5saWtlbHkoIXV1aWRfZXF1YWwoJm1wLT5tX3NiLnNiX3V1aWQsICZoZWFkLT5oX2ZzX3V1aWQpKSkgeworCQl4bG9nX3dhcm4oIlhGUzogbG9nIGhhcyBtaXNtYXRjaGVkIHV1aWQgLSBjYW4ndCByZWNvdmVyIik7CisJCXhsb2dfaGVhZGVyX2NoZWNrX2R1bXAobXAsIGhlYWQpOworCQlYRlNfRVJST1JfUkVQT1JUKCJ4bG9nX2hlYWRlcl9jaGVja19tb3VudCIsCisJCQkJIFhGU19FUlJMRVZFTF9ISUdILCBtcCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyB2b2lkCit4bG9nX3JlY292ZXJfaW9kb25lKAorCXN0cnVjdCB4ZnNfYnVmCSpicCkKK3sKKwl4ZnNfbW91bnRfdAkqbXA7CisKKwlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikpOworCisJaWYgKFhGU19CVUZfR0VURVJST1IoYnApKSB7CisJCS8qCisJCSAqIFdlJ3JlIG5vdCBnb2luZyB0byBib3RoZXIgYWJvdXQgcmV0cnlpbmcKKwkJICogdGhpcyBkdXJpbmcgcmVjb3ZlcnkuIE9uZSBzdHJpa2UhCisJCSAqLworCQltcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfbW91bnRfdCAqKTsKKwkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfcmVjb3Zlcl9pb2RvbmUiLAorCQkJCSAgbXAsIGJwLCBYRlNfQlVGX0FERFIoYnApKTsKKwkJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBYRlNfTUVUQURBVEFfSU9fRVJST1IpOworCX0KKwlYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIE5VTEwpOworCVhGU19CVUZfQ0xSX0lPRE9ORV9GVU5DKGJwKTsKKwl4ZnNfYmlvZG9uZShicCk7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgZmluZHMgKHRvIGFuIGFwcHJveGltYXRpb24pIHRoZSBmaXJzdCBibG9jayBpbiB0aGUgcGh5c2ljYWwKKyAqIGxvZyB3aGljaCBjb250YWlucyB0aGUgZ2l2ZW4gY3ljbGUuICBJdCB1c2VzIGEgYmluYXJ5IHNlYXJjaCBhbGdvcml0aG0uCisgKiBOb3RlIHRoYXQgdGhlIGFsZ29yaXRobSBjYW4gbm90IGJlIHBlcmZlY3QgYmVjYXVzZSB0aGUgZGlzayB3aWxsIG5vdAorICogbmVjZXNzYXJpbHkgYmUgcGVyZmVjdC4KKyAqLworaW50Cit4bG9nX2ZpbmRfY3ljbGVfc3RhcnQoCisJeGxvZ190CQkqbG9nLAorCXhmc19idWZfdAkqYnAsCisJeGZzX2RhZGRyX3QJZmlyc3RfYmxrLAorCXhmc19kYWRkcl90CSpsYXN0X2JsaywKKwl1aW50CQljeWNsZSkKK3sKKwl4ZnNfY2FkZHJfdAlvZmZzZXQ7CisJeGZzX2RhZGRyX3QJbWlkX2JsazsKKwl1aW50CQltaWRfY3ljbGU7CisJaW50CQllcnJvcjsKKworCW1pZF9ibGsgPSBCTEtfQVZHKGZpcnN0X2JsaywgKmxhc3RfYmxrKTsKKwl3aGlsZSAobWlkX2JsayAhPSBmaXJzdF9ibGsgJiYgbWlkX2JsayAhPSAqbGFzdF9ibGspIHsKKwkJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCBtaWRfYmxrLCAxLCBicCkpKQorCQkJcmV0dXJuIGVycm9yOworCQlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgbWlkX2JsaywgMSwgYnApOworCQltaWRfY3ljbGUgPSBHRVRfQ1lDTEUob2Zmc2V0LCBBUkNIX0NPTlZFUlQpOworCQlpZiAobWlkX2N5Y2xlID09IGN5Y2xlKSB7CisJCQkqbGFzdF9ibGsgPSBtaWRfYmxrOworCQkJLyogbGFzdF9oYWxmX2N5Y2xlID09IG1pZF9jeWNsZSAqLworCQl9IGVsc2UgeworCQkJZmlyc3RfYmxrID0gbWlkX2JsazsKKwkJCS8qIGZpcnN0X2hhbGZfY3ljbGUgPT0gbWlkX2N5Y2xlICovCisJCX0KKwkJbWlkX2JsayA9IEJMS19BVkcoZmlyc3RfYmxrLCAqbGFzdF9ibGspOworCX0KKwlBU1NFUlQoKG1pZF9ibGsgPT0gZmlyc3RfYmxrICYmIG1pZF9ibGsrMSA9PSAqbGFzdF9ibGspIHx8CisJICAgICAgIChtaWRfYmxrID09ICpsYXN0X2JsayAmJiBtaWRfYmxrLTEgPT0gZmlyc3RfYmxrKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoZWNrIHRoYXQgdGhlIHJhbmdlIG9mIGJsb2NrcyBkb2VzIG5vdCBjb250YWluIHRoZSBjeWNsZSBudW1iZXIKKyAqIGdpdmVuLiAgVGhlIHNjYW4gbmVlZHMgdG8gb2NjdXIgZnJvbSBmcm9udCB0byBiYWNrIGFuZCB0aGUgcHRyIGludG8gdGhlCisgKiByZWdpb24gbXVzdCBiZSB1cGRhdGVkIHNpbmNlIGEgbGF0ZXIgcm91dGluZSB3aWxsIG5lZWQgdG8gcGVyZm9ybSBhbm90aGVyCisgKiB0ZXN0LiAgSWYgdGhlIHJlZ2lvbiBpcyBjb21wbGV0ZWx5IGdvb2QsIHdlIGVuZCB1cCByZXR1cm5pbmcgdGhlIHNhbWUKKyAqIGxhc3QgYmxvY2sgbnVtYmVyLgorICoKKyAqIFNldCBibGtubyB0byAtMSBpZiB3ZSBlbmNvdW50ZXIgbm8gZXJyb3JzLiAgVGhpcyBpcyBhbiBpbnZhbGlkIGJsb2NrIG51bWJlcgorICogc2luY2Ugd2UgZG9uJ3QgZXZlciBleHBlY3QgbG9ncyB0byBnZXQgdGhpcyBsYXJnZS4KKyAqLworU1RBVElDIGludAoreGxvZ19maW5kX3ZlcmlmeV9jeWNsZSgKKwl4bG9nX3QJCSpsb2csCisJeGZzX2RhZGRyX3QJc3RhcnRfYmxrLAorCWludAkJbmJibGtzLAorCXVpbnQJCXN0b3Bfb25fY3ljbGVfbm8sCisJeGZzX2RhZGRyX3QJKm5ld19ibGspCit7CisJeGZzX2RhZGRyX3QJaSwgajsKKwl1aW50CQljeWNsZTsKKwl4ZnNfYnVmX3QJKmJwOworCXhmc19kYWRkcl90CWJ1ZmJsa3M7CisJeGZzX2NhZGRyX3QJYnVmID0gTlVMTDsKKwlpbnQJCWVycm9yID0gMDsKKworCWJ1ZmJsa3MgPSAxIDw8IGZmcyhuYmJsa3MpOworCisJd2hpbGUgKCEoYnAgPSB4bG9nX2dldF9icChsb2csIGJ1ZmJsa3MpKSkgeworCQkvKiBjYW4ndCBnZXQgZW5vdWdoIG1lbW9yeSB0byBkbyBldmVyeXRoaW5nIGluIG9uZSBiaWcgYnVmZmVyICovCisJCWJ1ZmJsa3MgPj49IDE7CisJCWlmIChidWZibGtzIDw9IGxvZy0+bF9zZWN0YmJfbG9nKQorCQkJcmV0dXJuIEVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSBzdGFydF9ibGs7IGkgPCBzdGFydF9ibGsgKyBuYmJsa3M7IGkgKz0gYnVmYmxrcykgeworCQlpbnQJYmNvdW50OworCisJCWJjb3VudCA9IG1pbihidWZibGtzLCAoc3RhcnRfYmxrICsgbmJibGtzIC0gaSkpOworCisJCWlmICgoZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgaSwgYmNvdW50LCBicCkpKQorCQkJZ290byBvdXQ7CisKKwkJYnVmID0geGxvZ19hbGlnbihsb2csIGksIGJjb3VudCwgYnApOworCQlmb3IgKGogPSAwOyBqIDwgYmNvdW50OyBqKyspIHsKKwkJCWN5Y2xlID0gR0VUX0NZQ0xFKGJ1ZiwgQVJDSF9DT05WRVJUKTsKKwkJCWlmIChjeWNsZSA9PSBzdG9wX29uX2N5Y2xlX25vKSB7CisJCQkJKm5ld19ibGsgPSBpK2o7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWJ1ZiArPSBCQlNJWkU7CisJCX0KKwl9CisKKwkqbmV3X2JsayA9IC0xOworCitvdXQ6CisJeGxvZ19wdXRfYnAoYnApOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFBvdGVudGlhbGx5IGJhY2t1cCBvdmVyIHBhcnRpYWwgbG9nIHJlY29yZCB3cml0ZS4KKyAqCisgKiBJbiB0aGUgdHlwaWNhbCBjYXNlLCBsYXN0X2JsayBpcyB0aGUgbnVtYmVyIG9mIHRoZSBibG9jayBkaXJlY3RseSBhZnRlcgorICogYSBnb29kIGxvZyByZWNvcmQuICBUaGVyZWZvcmUsIHdlIHN1YnRyYWN0IG9uZSB0byBnZXQgdGhlIGJsb2NrIG51bWJlcgorICogb2YgdGhlIGxhc3QgYmxvY2sgaW4gdGhlIGdpdmVuIGJ1ZmZlci4gIGV4dHJhX2JibGtzIGNvbnRhaW5zIHRoZSBudW1iZXIKKyAqIG9mIGJsb2NrcyB3ZSB3b3VsZCBoYXZlIHJlYWQgb24gYSBwcmV2aW91cyByZWFkLiAgVGhpcyBoYXBwZW5zIHdoZW4gdGhlCisgKiBsYXN0IGxvZyByZWNvcmQgaXMgc3BsaXQgb3ZlciB0aGUgZW5kIG9mIHRoZSBwaHlzaWNhbCBsb2cuCisgKgorICogZXh0cmFfYmJsa3MgaXMgdGhlIG51bWJlciBvZiBibG9ja3MgcG90ZW50aWFsbHkgdmVyaWZpZWQgb24gYSBwcmV2aW91cworICogY2FsbCB0byB0aGlzIHJvdXRpbmUuCisgKi8KK1NUQVRJQyBpbnQKK3hsb2dfZmluZF92ZXJpZnlfbG9nX3JlY29yZCgKKwl4bG9nX3QJCQkqbG9nLAorCXhmc19kYWRkcl90CQlzdGFydF9ibGssCisJeGZzX2RhZGRyX3QJCSpsYXN0X2JsaywKKwlpbnQJCQlleHRyYV9iYmxrcykKK3sKKwl4ZnNfZGFkZHJfdAkJaTsKKwl4ZnNfYnVmX3QJCSpicDsKKwl4ZnNfY2FkZHJfdAkJb2Zmc2V0ID0gTlVMTDsKKwl4bG9nX3JlY19oZWFkZXJfdAkqaGVhZCA9IE5VTEw7CisJaW50CQkJZXJyb3IgPSAwOworCWludAkJCXNtYWxsbWVtID0gMDsKKwlpbnQJCQludW1fYmxrcyA9ICpsYXN0X2JsayAtIHN0YXJ0X2JsazsKKwlpbnQJCQl4aGRyczsKKworCUFTU0VSVChzdGFydF9ibGsgIT0gMCB8fCAqbGFzdF9ibGsgIT0gc3RhcnRfYmxrKTsKKworCWlmICghKGJwID0geGxvZ19nZXRfYnAobG9nLCBudW1fYmxrcykpKSB7CisJCWlmICghKGJwID0geGxvZ19nZXRfYnAobG9nLCAxKSkpCisJCQlyZXR1cm4gRU5PTUVNOworCQlzbWFsbG1lbSA9IDE7CisJfSBlbHNlIHsKKwkJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCBzdGFydF9ibGssIG51bV9ibGtzLCBicCkpKQorCQkJZ290byBvdXQ7CisJCW9mZnNldCA9IHhsb2dfYWxpZ24obG9nLCBzdGFydF9ibGssIG51bV9ibGtzLCBicCk7CisJCW9mZnNldCArPSAoKG51bV9ibGtzIC0gMSkgPDwgQkJTSElGVCk7CisJfQorCisJZm9yIChpID0gKCpsYXN0X2JsaykgLSAxOyBpID49IDA7IGktLSkgeworCQlpZiAoaSA8IHN0YXJ0X2JsaykgeworCQkJLyogdmFsaWQgbG9nIHJlY29yZCBub3QgZm91bmQgKi8KKwkJCXhsb2dfd2FybigKKwkJIlhGUzogTG9nIGluY29uc2lzdGVudCAoZGlkbid0IGZpbmQgcHJldmlvdXMgaGVhZGVyKSIpOworCQkJQVNTRVJUKDApOworCQkJZXJyb3IgPSBYRlNfRVJST1IoRUlPKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHNtYWxsbWVtKSB7CisJCQlpZiAoKGVycm9yID0geGxvZ19icmVhZChsb2csIGksIDEsIGJwKSkpCisJCQkJZ290byBvdXQ7CisJCQlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgaSwgMSwgYnApOworCQl9CisKKwkJaGVhZCA9ICh4bG9nX3JlY19oZWFkZXJfdCAqKW9mZnNldDsKKworCQlpZiAoWExPR19IRUFERVJfTUFHSUNfTlVNID09CisJCSAgICBJTlRfR0VUKGhlYWQtPmhfbWFnaWNubywgQVJDSF9DT05WRVJUKSkKKwkJCWJyZWFrOworCisJCWlmICghc21hbGxtZW0pCisJCQlvZmZzZXQgLT0gQkJTSVpFOworCX0KKworCS8qCisJICogV2UgaGl0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBoeXNpY2FsIGxvZyAmIHN0aWxsIG5vIGhlYWRlci4gIFJldHVybgorCSAqIHRvIGNhbGxlci4gIElmIGNhbGxlciBjYW4gaGFuZGxlIGEgcmV0dXJuIG9mIC0xLCB0aGVuIHRoaXMgcm91dGluZQorCSAqIHdpbGwgYmUgY2FsbGVkIGFnYWluIGZvciB0aGUgZW5kIG9mIHRoZSBwaHlzaWNhbCBsb2cuCisJICovCisJaWYgKGkgPT0gLTEpIHsKKwkJZXJyb3IgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBXZSBoYXZlIHRoZSBmaW5hbCBibG9jayBvZiB0aGUgZ29vZCBsb2cgKHRoZSBmaXJzdCBibG9jaworCSAqIG9mIHRoZSBsb2cgcmVjb3JkIF9iZWZvcmVfIHRoZSBoZWFkLiBTbyB3ZSBjaGVjayB0aGUgdXVpZC4KKwkgKi8KKwlpZiAoKGVycm9yID0geGxvZ19oZWFkZXJfY2hlY2tfbW91bnQobG9nLT5sX21wLCBoZWFkKSkpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBXZSBtYXkgaGF2ZSBmb3VuZCBhIGxvZyByZWNvcmQgaGVhZGVyIGJlZm9yZSB3ZSBleHBlY3RlZCBvbmUuCisJICogbGFzdF9ibGsgd2lsbCBiZSB0aGUgMXN0IGJsb2NrICMgd2l0aCBhIGdpdmVuIGN5Y2xlICMuICBXZSBtYXkgZW5kCisJICogdXAgcmVhZGluZyBhbiBlbnRpcmUgbG9nIHJlY29yZC4gIEluIHRoaXMgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0bworCSAqIHJlc2V0IGxhc3RfYmxrLiAgT25seSB3aGVuIGxhc3RfYmxrIHBvaW50cyBpbiB0aGUgbWlkZGxlIG9mIGEgbG9nCisJICogcmVjb3JkIGRvIHdlIHVwZGF0ZSBsYXN0X2Jsay4KKwkgKi8KKwlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJmxvZy0+bF9tcC0+bV9zYikpIHsKKwkJdWludAloX3NpemUgPSBJTlRfR0VUKGhlYWQtPmhfc2l6ZSwgQVJDSF9DT05WRVJUKTsKKworCQl4aGRycyA9IGhfc2l6ZSAvIFhMT0dfSEVBREVSX0NZQ0xFX1NJWkU7CisJCWlmIChoX3NpemUgJSBYTE9HX0hFQURFUl9DWUNMRV9TSVpFKQorCQkJeGhkcnMrKzsKKwl9IGVsc2UgeworCQl4aGRycyA9IDE7CisJfQorCisJaWYgKCpsYXN0X2JsayAtIGkgKyBleHRyYV9iYmxrcworCQkJIT0gQlRPQkIoSU5UX0dFVChoZWFkLT5oX2xlbiwgQVJDSF9DT05WRVJUKSkgKyB4aGRycykKKwkJKmxhc3RfYmxrID0gaTsKKworb3V0OgorCXhsb2dfcHV0X2JwKGJwKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBIZWFkIGlzIGRlZmluZWQgdG8gYmUgdGhlIHBvaW50IG9mIHRoZSBsb2cgd2hlcmUgdGhlIG5leHQgbG9nIHdyaXRlCisgKiB3cml0ZSBjb3VsZCBnby4gIFRoaXMgbWVhbnMgdGhhdCBpbmNvbXBsZXRlIExSIHdyaXRlcyBhdCB0aGUgZW5kIGFyZQorICogZWxpbWluYXRlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBoZWFkLiAgV2UgYXJlbid0IGd1YXJhbnRlZWQgdGhhdCBwcmV2aW91cworICogTFIgaGF2ZSBjb21wbGV0ZSB0cmFuc2FjdGlvbnMuICBXZSBvbmx5IGtub3cgdGhhdCBhIGN5Y2xlIG51bWJlciBvZgorICogY3VycmVudCBjeWNsZSBudW1iZXIgLTEgd29uJ3QgYmUgcHJlc2VudCBpbiB0aGUgbG9nIGlmIHdlIHN0YXJ0IHdyaXRpbmcKKyAqIGZyb20gb3VyIGN1cnJlbnQgYmxvY2sgbnVtYmVyLgorICoKKyAqIGxhc3RfYmxrIGNvbnRhaW5zIHRoZSBibG9jayBudW1iZXIgb2YgdGhlIGZpcnN0IGJsb2NrIHdpdGggYSBnaXZlbgorICogY3ljbGUgbnVtYmVyLgorICoKKyAqIFJldHVybjogemVybyBpZiBub3JtYWwsIG5vbi16ZXJvIGlmIGVycm9yLgorICovCitpbnQKK3hsb2dfZmluZF9oZWFkKAorCXhsb2dfdCAJCSpsb2csCisJeGZzX2RhZGRyX3QJKnJldHVybl9oZWFkX2JsaykKK3sKKwl4ZnNfYnVmX3QJKmJwOworCXhmc19jYWRkcl90CW9mZnNldDsKKwl4ZnNfZGFkZHJfdAluZXdfYmxrLCBmaXJzdF9ibGssIHN0YXJ0X2JsaywgbGFzdF9ibGssIGhlYWRfYmxrOworCWludAkJbnVtX3NjYW5fYmJsa3M7CisJdWludAkJZmlyc3RfaGFsZl9jeWNsZSwgbGFzdF9oYWxmX2N5Y2xlOworCXVpbnQJCXN0b3Bfb25fY3ljbGU7CisJaW50CQllcnJvciwgbG9nX2JibnVtID0gbG9nLT5sX2xvZ0JCc2l6ZTsKKworCS8qIElzIHRoZSBlbmQgb2YgdGhlIGxvZyBkZXZpY2UgemVyb2VkPyAqLworCWlmICgoZXJyb3IgPSB4bG9nX2ZpbmRfemVyb2VkKGxvZywgJmZpcnN0X2JsaykpID09IC0xKSB7CisJCSpyZXR1cm5faGVhZF9ibGsgPSBmaXJzdF9ibGs7CisKKwkJLyogSXMgdGhlIHdob2xlIGxvdCB6ZXJvZWQ/ICovCisJCWlmICghZmlyc3RfYmxrKSB7CisJCQkvKiBMaW51eCBYRlMgc2hvdWxkbid0IGdlbmVyYXRlIHRvdGFsbHkgemVyb2VkIGxvZ3MgLQorCQkJICogbWtmcyBldGMgd3JpdGUgYSBkdW1teSB1bm1vdW50IHJlY29yZCB0byBhIGZyZXNoCisJCQkgKiBsb2cgc28gd2UgY2FuIHN0b3JlIHRoZSB1dWlkIGluIHRoZXJlCisJCQkgKi8KKwkJCXhsb2dfd2FybigiWEZTOiB0b3RhbGx5IHplcm9lZCBsb2ciKTsKKwkJfQorCisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoZXJyb3IpIHsKKwkJeGxvZ193YXJuKCJYRlM6IGVtcHR5IGxvZyBjaGVjayBmYWlsZWQiKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWZpcnN0X2JsayA9IDA7CQkJLyogZ2V0IGN5Y2xlICMgb2YgMXN0IGJsb2NrICovCisJYnAgPSB4bG9nX2dldF9icChsb2csIDEpOworCWlmICghYnApCisJCXJldHVybiBFTk9NRU07CisJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCAwLCAxLCBicCkpKQorCQlnb3RvIGJwX2VycjsKKwlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgMCwgMSwgYnApOworCWZpcnN0X2hhbGZfY3ljbGUgPSBHRVRfQ1lDTEUob2Zmc2V0LCBBUkNIX0NPTlZFUlQpOworCisJbGFzdF9ibGsgPSBoZWFkX2JsayA9IGxvZ19iYm51bSAtIDE7CS8qIGdldCBjeWNsZSAjIG9mIGxhc3QgYmxvY2sgKi8KKwlpZiAoKGVycm9yID0geGxvZ19icmVhZChsb2csIGxhc3RfYmxrLCAxLCBicCkpKQorCQlnb3RvIGJwX2VycjsKKwlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgbGFzdF9ibGssIDEsIGJwKTsKKwlsYXN0X2hhbGZfY3ljbGUgPSBHRVRfQ1lDTEUob2Zmc2V0LCBBUkNIX0NPTlZFUlQpOworCUFTU0VSVChsYXN0X2hhbGZfY3ljbGUgIT0gMCk7CisKKwkvKgorCSAqIElmIHRoZSAxc3QgaGFsZiBjeWNsZSBudW1iZXIgaXMgZXF1YWwgdG8gdGhlIGxhc3QgaGFsZiBjeWNsZSBudW1iZXIsCisJICogdGhlbiB0aGUgZW50aXJlIGxvZyBpcyBzdGFtcGVkIHdpdGggdGhlIHNhbWUgY3ljbGUgbnVtYmVyLiAgSW4gdGhpcworCSAqIGNhc2UsIGhlYWRfYmxrIGNhbid0IGJlIHNldCB0byB6ZXJvICh3aGljaCBtYWtlcyBzZW5zZSkuICBUaGUgYmVsb3cKKwkgKiBtYXRoIGRvZXNuJ3Qgd29yayBvdXQgcHJvcGVybHkgd2l0aCBoZWFkX2JsayBlcXVhbCB0byB6ZXJvLiAgSW5zdGVhZCwKKwkgKiB3ZSBzZXQgaXQgdG8gbG9nX2JibnVtIHdoaWNoIGlzIGFuIGludmFsaWQgYmxvY2sgbnVtYmVyLCBidXQgdGhpcworCSAqIHZhbHVlIG1ha2VzIHRoZSBtYXRoIGNvcnJlY3QuICBJZiBoZWFkX2JsayBkb2Vzbid0IGNoYW5nZWQgdGhyb3VnaAorCSAqIGFsbCB0aGUgdGVzdHMgYmVsb3csICpoZWFkX2JsayBpcyBzZXQgdG8gemVybyBhdCB0aGUgdmVyeSBlbmQgcmF0aGVyCisJICogdGhhbiBsb2dfYmJudW0uICBJbiBhIHNlbnNlLCBsb2dfYmJudW0gYW5kIHplcm8gYXJlIHRoZSBzYW1lIGJsb2NrCisJICogaW4gYSBjaXJjdWxhciBmaWxlLgorCSAqLworCWlmIChmaXJzdF9oYWxmX2N5Y2xlID09IGxhc3RfaGFsZl9jeWNsZSkgeworCQkvKgorCQkgKiBJbiB0aGlzIGNhc2Ugd2UgYmVsaWV2ZSB0aGF0IHRoZSBlbnRpcmUgbG9nIHNob3VsZCBoYXZlCisJCSAqIGN5Y2xlIG51bWJlciBsYXN0X2hhbGZfY3ljbGUuICBXZSBuZWVkIHRvIHNjYW4gYmFja3dhcmRzCisJCSAqIGZyb20gdGhlIGVuZCB2ZXJpZnlpbmcgdGhhdCB0aGVyZSBhcmUgbm8gaG9sZXMgc3RpbGwKKwkJICogY29udGFpbmluZyBsYXN0X2hhbGZfY3ljbGUgLSAxLiAgSWYgd2UgZmluZCBzdWNoIGEgaG9sZSwKKwkJICogdGhlbiB0aGUgc3RhcnQgb2YgdGhhdCBob2xlIHdpbGwgYmUgdGhlIG5ldyBoZWFkLiAgVGhlCisJCSAqIHNpbXBsZSBjYXNlIGxvb2tzIGxpa2UKKwkJICogICAgICAgIHggfCB4IC4uLiB8IHggLSAxIHwgeAorCQkgKiBBbm90aGVyIGNhc2UgdGhhdCBmaXRzIHRoaXMgcGljdHVyZSB3b3VsZCBiZQorCQkgKiAgICAgICAgeCB8IHggKyAxIHwgeCAuLi4gfCB4CisJCSAqIEluIHRoaXMgY2FzZSB0aGUgaGVhZCByZWFsbHkgaXMgc29td2hlcmUgYXQgdGhlIGVuZCBvZiB0aGUKKwkJICogbG9nLCBhcyBvbmUgb2YgdGhlIGxhdGVzdCB3cml0ZXMgYXQgdGhlIGJlZ2lubmluZyB3YXMKKwkJICogaW5jb21wbGV0ZS4KKwkJICogT25lIG1vcmUgY2FzZSBpcworCQkgKiAgICAgICAgeCB8IHggKyAxIHwgeCAuLi4gfCB4IC0gMSB8IHgKKwkJICogVGhpcyBpcyByZWFsbHkgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBhYm92ZSB0d28gY2FzZXMsIGFuZAorCQkgKiB0aGUgaGVhZCBoYXMgdG8gZW5kIHVwIGF0IHRoZSBzdGFydCBvZiB0aGUgeC0xIGhvbGUgYXQgdGhlCisJCSAqIGVuZCBvZiB0aGUgbG9nLgorCQkgKgorCQkgKiBJbiB0aGUgMjU2ayBsb2cgY2FzZSwgd2Ugd2lsbCByZWFkIGZyb20gdGhlIGJlZ2lubmluZyB0byB0aGUKKwkJICogZW5kIG9mIHRoZSBsb2cgYW5kIHNlYXJjaCBmb3IgY3ljbGUgbnVtYmVycyBlcXVhbCB0byB4LTEuCisJCSAqIFdlIGRvbid0IHdvcnJ5IGFib3V0IHRoZSB4KzEgYmxvY2tzIHRoYXQgd2UgZW5jb3VudGVyLAorCQkgKiBiZWNhdXNlIHdlIGtub3cgdGhhdCB0aGV5IGNhbm5vdCBiZSB0aGUgaGVhZCBzaW5jZSB0aGUgbG9nCisJCSAqIHN0YXJ0ZWQgd2l0aCB4LgorCQkgKi8KKwkJaGVhZF9ibGsgPSBsb2dfYmJudW07CisJCXN0b3Bfb25fY3ljbGUgPSBsYXN0X2hhbGZfY3ljbGUgLSAxOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIGZpbmQgdGhlIGZpcnN0IGJsb2NrIHdpdGggY3ljbGUKKwkJICogbnVtYmVyIG1hdGNoaW5nIGxhc3RfaGFsZl9jeWNsZS4gIFdlIGV4cGVjdCB0aGUgbG9nIHRvIGJlCisJCSAqIHNvbWUgdmFyaWF0aW9uIG9uCisJCSAqICAgICAgICB4ICsgMSAuLi4gfCB4IC4uLgorCQkgKiBUaGUgZmlyc3QgYmxvY2sgd2l0aCBjeWNsZSBudW1iZXIgeCAobGFzdF9oYWxmX2N5Y2xlKSB3aWxsCisJCSAqIGJlIHdoZXJlIHRoZSBuZXcgaGVhZCBiZWxvbmdzLiAgRmlyc3Qgd2UgZG8gYSBiaW5hcnkgc2VhcmNoCisJCSAqIGZvciB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBsYXN0X2hhbGZfY3ljbGUuICBUaGUgYmluYXJ5CisJCSAqIHNlYXJjaCBtYXkgbm90IGJlIHRvdGFsbHkgYWNjdXJhdGUsIHNvIHRoZW4gd2Ugc2NhbiBiYWNrCisJCSAqIGZyb20gdGhlcmUgbG9va2luZyBmb3Igb2NjdXJyZW5jZXMgb2YgbGFzdF9oYWxmX2N5Y2xlIGJlZm9yZQorCQkgKiB1cy4gIElmIHRoYXQgYmFja3dhcmRzIHNjYW4gd3JhcHMgYXJvdW5kIHRoZSBiZWdpbm5pbmcgb2YKKwkJICogdGhlIGxvZywgdGhlbiB3ZSBsb29rIGZvciBvY2N1cnJlbmNlcyBvZiBsYXN0X2hhbGZfY3ljbGUgLSAxCisJCSAqIGF0IHRoZSBlbmQgb2YgdGhlIGxvZy4gIFRoZSBjYXNlcyB3ZSdyZSBsb29raW5nIGZvciBsb29rCisJCSAqIGxpa2UKKwkJICogICAgICAgIHggKyAxIC4uLiB8IHggfCB4ICsgMSB8IHggLi4uCisJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gYmluYXJ5IHNlYXJjaCBzdG9wcGVkIGhlcmUKKwkJICogb3IKKwkJICogICAgICAgIHggKyAxIC4uLiB8IHggLi4uIHwgeCAtIDEgfCB4CisJCSAqICAgICAgICA8LS0tLS0tLS0tPiBsZXNzIHRoYW4gc2NhbiBkaXN0YW5jZQorCQkgKi8KKwkJc3RvcF9vbl9jeWNsZSA9IGxhc3RfaGFsZl9jeWNsZTsKKwkJaWYgKChlcnJvciA9IHhsb2dfZmluZF9jeWNsZV9zdGFydChsb2csIGJwLCBmaXJzdF9ibGssCisJCQkJCQkmaGVhZF9ibGssIGxhc3RfaGFsZl9jeWNsZSkpKQorCQkJZ290byBicF9lcnI7CisJfQorCisJLyoKKwkgKiBOb3cgdmFsaWRhdGUgdGhlIGFuc3dlci4gIFNjYW4gYmFjayBzb21lIG51bWJlciBvZiBtYXhpbXVtIHBvc3NpYmxlCisJICogYmxvY2tzIGFuZCBtYWtlIHN1cmUgZWFjaCBvbmUgaGFzIHRoZSBleHBlY3RlZCBjeWNsZSBudW1iZXIuICBUaGUKKwkgKiBtYXhpbXVtIGlzIGRldGVybWluZWQgYnkgdGhlIHRvdGFsIHBvc3NpYmxlIGFtb3VudCBvZiBidWZmZXJpbmcKKwkgKiBpbiB0aGUgaW4tY29yZSBsb2cuICBUaGUgZm9sbG93aW5nIG51bWJlciBjYW4gYmUgbWFkZSB0aWdodGVyIGlmCisJICogd2UgYWN0dWFsbHkgbG9vayBhdCB0aGUgYmxvY2sgc2l6ZSBvZiB0aGUgZmlsZXN5c3RlbS4KKwkgKi8KKwludW1fc2Nhbl9iYmxrcyA9IFhMT0dfVE9UQUxfUkVDX1NISUZUKGxvZyk7CisJaWYgKGhlYWRfYmxrID49IG51bV9zY2FuX2JibGtzKSB7CisJCS8qCisJCSAqIFdlIGFyZSBndWFyYW50ZWVkIHRoYXQgdGhlIGVudGlyZSBjaGVjayBjYW4gYmUgcGVyZm9ybWVkCisJCSAqIGluIG9uZSBidWZmZXIuCisJCSAqLworCQlzdGFydF9ibGsgPSBoZWFkX2JsayAtIG51bV9zY2FuX2JibGtzOworCQlpZiAoKGVycm9yID0geGxvZ19maW5kX3ZlcmlmeV9jeWNsZShsb2csCisJCQkJCQlzdGFydF9ibGssIG51bV9zY2FuX2JibGtzLAorCQkJCQkJc3RvcF9vbl9jeWNsZSwgJm5ld19ibGspKSkKKwkJCWdvdG8gYnBfZXJyOworCQlpZiAobmV3X2JsayAhPSAtMSkKKwkJCWhlYWRfYmxrID0gbmV3X2JsazsKKwl9IGVsc2UgewkJLyogbmVlZCB0byByZWFkIDIgcGFydHMgb2YgbG9nICovCisJCS8qCisJCSAqIFdlIGFyZSBnb2luZyB0byBzY2FuIGJhY2t3YXJkcyBpbiB0aGUgbG9nIGluIHR3byBwYXJ0cy4KKwkJICogRmlyc3Qgd2Ugc2NhbiB0aGUgcGh5c2ljYWwgZW5kIG9mIHRoZSBsb2cuICBJbiB0aGlzIHBhcnQKKwkJICogb2YgdGhlIGxvZywgd2UgYXJlIGxvb2tpbmcgZm9yIGJsb2NrcyB3aXRoIGN5Y2xlIG51bWJlcgorCQkgKiBsYXN0X2hhbGZfY3ljbGUgLSAxLgorCQkgKiBJZiB3ZSBmaW5kIG9uZSwgdGhlbiB3ZSBrbm93IHRoYXQgdGhlIGxvZyBzdGFydHMgdGhlcmUsIGFzCisJCSAqIHdlJ3ZlIGZvdW5kIGEgaG9sZSB0aGF0IGRpZG4ndCBnZXQgd3JpdHRlbiBpbiBnb2luZyBhcm91bmQKKwkJICogdGhlIGVuZCBvZiB0aGUgcGh5c2ljYWwgbG9nLiAgVGhlIHNpbXBsZSBjYXNlIGZvciB0aGlzIGlzCisJCSAqICAgICAgICB4ICsgMSAuLi4gfCB4IC4uLiB8IHggLSAxIHwgeAorCQkgKiAgICAgICAgPC0tLS0tLS0tLT4gbGVzcyB0aGFuIHNjYW4gZGlzdGFuY2UKKwkJICogSWYgYWxsIG9mIHRoZSBibG9ja3MgYXQgdGhlIGVuZCBvZiB0aGUgbG9nIGhhdmUgY3ljbGUgbnVtYmVyCisJCSAqIGxhc3RfaGFsZl9jeWNsZSwgdGhlbiB3ZSBjaGVjayB0aGUgYmxvY2tzIGF0IHRoZSBzdGFydCBvZgorCQkgKiB0aGUgbG9nIGxvb2tpbmcgZm9yIG9jY3VycmVuY2VzIG9mIGxhc3RfaGFsZl9jeWNsZS4gIElmIHdlCisJCSAqIGZpbmQgb25lLCB0aGVuIG91ciBjdXJyZW50IGVzdGltYXRlIGZvciB0aGUgbG9jYXRpb24gb2YgdGhlCisJCSAqIGZpcnN0IG9jY3VycmVuY2Ugb2YgbGFzdF9oYWxmX2N5Y2xlIGlzIHdyb25nIGFuZCB3ZSBtb3ZlCisJCSAqIGJhY2sgdG8gdGhlIGhvbGUgd2UndmUgZm91bmQuICBUaGlzIGNhc2UgbG9va3MgbGlrZQorCQkgKiAgICAgICAgeCArIDEgLi4uIHwgeCB8IHggKyAxIHwgeCAuLi4KKwkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiBiaW5hcnkgc2VhcmNoIHN0b3BwZWQgaGVyZQorCQkgKiBBbm90aGVyIGNhc2Ugd2UgbmVlZCB0byBoYW5kbGUgdGhhdCBvbmx5IG9jY3VycyBpbiAyNTZrCisJCSAqIGxvZ3MgaXMKKwkJICogICAgICAgIHggKyAxIC4uLiB8IHggLi4uIHwgeCsxIHwgeCAuLi4KKwkJICogICAgICAgICAgICAgICAgICAgXiBiaW5hcnkgc2VhcmNoIHN0b3BzIGhlcmUKKwkJICogSW4gYSAyNTZrIGxvZywgdGhlIHNjYW4gYXQgdGhlIGVuZCBvZiB0aGUgbG9nIHdpbGwgc2VlIHRoZQorCQkgKiB4ICsgMSBibG9ja3MuICBXZSBuZWVkIHRvIHNraXAgcGFzdCB0aG9zZSBzaW5jZSB0aGF0IGlzCisJCSAqIGNlcnRhaW5seSBub3QgdGhlIGhlYWQgb2YgdGhlIGxvZy4gIEJ5IHNlYXJjaGluZyBmb3IKKwkJICogbGFzdF9oYWxmX2N5Y2xlLTEgd2UgYWNjb21wbGlzaCB0aGF0LgorCQkgKi8KKwkJc3RhcnRfYmxrID0gbG9nX2JibnVtIC0gbnVtX3NjYW5fYmJsa3MgKyBoZWFkX2JsazsKKwkJQVNTRVJUKGhlYWRfYmxrIDw9IElOVF9NQVggJiYKKwkJCSh4ZnNfZGFkZHJfdCkgbnVtX3NjYW5fYmJsa3MgLSBoZWFkX2JsayA+PSAwKTsKKwkJaWYgKChlcnJvciA9IHhsb2dfZmluZF92ZXJpZnlfY3ljbGUobG9nLCBzdGFydF9ibGssCisJCQkJCW51bV9zY2FuX2JibGtzIC0gKGludCloZWFkX2JsaywKKwkJCQkJKHN0b3Bfb25fY3ljbGUgLSAxKSwgJm5ld19ibGspKSkKKwkJCWdvdG8gYnBfZXJyOworCQlpZiAobmV3X2JsayAhPSAtMSkgeworCQkJaGVhZF9ibGsgPSBuZXdfYmxrOworCQkJZ290byBiYWRfYmxrOworCQl9CisKKwkJLyoKKwkJICogU2NhbiBiZWdpbm5pbmcgb2YgbG9nIG5vdy4gIFRoZSBsYXN0IHBhcnQgb2YgdGhlIHBoeXNpY2FsCisJCSAqIGxvZyBpcyBnb29kLiAgVGhpcyBzY2FuIG5lZWRzIHRvIHZlcmlmeSB0aGF0IGl0IGRvZXNuJ3QgZmluZAorCQkgKiB0aGUgbGFzdF9oYWxmX2N5Y2xlLgorCQkgKi8KKwkJc3RhcnRfYmxrID0gMDsKKwkJQVNTRVJUKGhlYWRfYmxrIDw9IElOVF9NQVgpOworCQlpZiAoKGVycm9yID0geGxvZ19maW5kX3ZlcmlmeV9jeWNsZShsb2csCisJCQkJCXN0YXJ0X2JsaywgKGludCloZWFkX2JsaywKKwkJCQkJc3RvcF9vbl9jeWNsZSwgJm5ld19ibGspKSkKKwkJCWdvdG8gYnBfZXJyOworCQlpZiAobmV3X2JsayAhPSAtMSkKKwkJCWhlYWRfYmxrID0gbmV3X2JsazsKKwl9CisKKyBiYWRfYmxrOgorCS8qCisJICogTm93IHdlIG5lZWQgdG8gbWFrZSBzdXJlIGhlYWRfYmxrIGlzIG5vdCBwb2ludGluZyB0byBhIGJsb2NrIGluCisJICogdGhlIG1pZGRsZSBvZiBhIGxvZyByZWNvcmQuCisJICovCisJbnVtX3NjYW5fYmJsa3MgPSBYTE9HX1JFQ19TSElGVChsb2cpOworCWlmIChoZWFkX2JsayA+PSBudW1fc2Nhbl9iYmxrcykgeworCQlzdGFydF9ibGsgPSBoZWFkX2JsayAtIG51bV9zY2FuX2JibGtzOyAvKiBkb24ndCByZWFkIGhlYWRfYmxrICovCisKKwkJLyogc3RhcnQgcHRyIGF0IGxhc3QgYmxvY2sgcHRyIGJlZm9yZSBoZWFkX2JsayAqLworCQlpZiAoKGVycm9yID0geGxvZ19maW5kX3ZlcmlmeV9sb2dfcmVjb3JkKGxvZywgc3RhcnRfYmxrLAorCQkJCQkJCSZoZWFkX2JsaywgMCkpID09IC0xKSB7CisJCQllcnJvciA9IFhGU19FUlJPUihFSU8pOworCQkJZ290byBicF9lcnI7CisJCX0gZWxzZSBpZiAoZXJyb3IpCisJCQlnb3RvIGJwX2VycjsKKwl9IGVsc2UgeworCQlzdGFydF9ibGsgPSAwOworCQlBU1NFUlQoaGVhZF9ibGsgPD0gSU5UX01BWCk7CisJCWlmICgoZXJyb3IgPSB4bG9nX2ZpbmRfdmVyaWZ5X2xvZ19yZWNvcmQobG9nLCBzdGFydF9ibGssCisJCQkJCQkJJmhlYWRfYmxrLCAwKSkgPT0gLTEpIHsKKwkJCS8qIFdlIGhpdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsb2cgZHVyaW5nIG91ciBzZWFyY2ggKi8KKwkJCXN0YXJ0X2JsayA9IGxvZ19iYm51bSAtIG51bV9zY2FuX2JibGtzICsgaGVhZF9ibGs7CisJCQluZXdfYmxrID0gbG9nX2JibnVtOworCQkJQVNTRVJUKHN0YXJ0X2JsayA8PSBJTlRfTUFYICYmCisJCQkJKHhmc19kYWRkcl90KSBsb2dfYmJudW0tc3RhcnRfYmxrID49IDApOworCQkJQVNTRVJUKGhlYWRfYmxrIDw9IElOVF9NQVgpOworCQkJaWYgKChlcnJvciA9IHhsb2dfZmluZF92ZXJpZnlfbG9nX3JlY29yZChsb2csCisJCQkJCQkJc3RhcnRfYmxrLCAmbmV3X2JsaywKKwkJCQkJCQkoaW50KWhlYWRfYmxrKSkgPT0gLTEpIHsKKwkJCQllcnJvciA9IFhGU19FUlJPUihFSU8pOworCQkJCWdvdG8gYnBfZXJyOworCQkJfSBlbHNlIGlmIChlcnJvcikKKwkJCQlnb3RvIGJwX2VycjsKKwkJCWlmIChuZXdfYmxrICE9IGxvZ19iYm51bSkKKwkJCQloZWFkX2JsayA9IG5ld19ibGs7CisJCX0gZWxzZSBpZiAoZXJyb3IpCisJCQlnb3RvIGJwX2VycjsKKwl9CisKKwl4bG9nX3B1dF9icChicCk7CisJaWYgKGhlYWRfYmxrID09IGxvZ19iYm51bSkKKwkJKnJldHVybl9oZWFkX2JsayA9IDA7CisJZWxzZQorCQkqcmV0dXJuX2hlYWRfYmxrID0gaGVhZF9ibGs7CisJLyoKKwkgKiBXaGVuIHJldHVybmluZyBoZXJlLCB3ZSBoYXZlIGEgZ29vZCBibG9jayBudW1iZXIuICBCYWQgYmxvY2sKKwkgKiBtZWFucyB0aGF0IGR1cmluZyBhIHByZXZpb3VzIGNyYXNoLCB3ZSBkaWRuJ3QgaGF2ZSBhIGNsZWFuIGJyZWFrCisJICogZnJvbSBjeWNsZSBudW1iZXIgTiB0byBjeWNsZSBudW1iZXIgTi0xLiAgSW4gdGhpcyBjYXNlLCB3ZSBuZWVkCisJICogdG8gZmluZCB0aGUgZmlyc3QgYmxvY2sgd2l0aCBjeWNsZSBudW1iZXIgTi0xLgorCSAqLworCXJldHVybiAwOworCisgYnBfZXJyOgorCXhsb2dfcHV0X2JwKGJwKTsKKworCWlmIChlcnJvcikKKwkgICAgeGxvZ193YXJuKCJYRlM6IGZhaWxlZCB0byBmaW5kIGxvZyBoZWFkIik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogRmluZCB0aGUgc3luYyBibG9jayBudW1iZXIgb3IgdGhlIHRhaWwgb2YgdGhlIGxvZy4KKyAqCisgKiBUaGlzIHdpbGwgYmUgdGhlIGJsb2NrIG51bWJlciBvZiB0aGUgbGFzdCByZWNvcmQgdG8gaGF2ZSBpdHMKKyAqIGFzc29jaWF0ZWQgYnVmZmVycyBzeW5jZWQgdG8gZGlzay4gIEV2ZXJ5IGxvZyByZWNvcmQgaGVhZGVyIGhhcworICogYSBzeW5jIGxzbiBlbWJlZGRlZCBpbiBpdC4gIExTTnMgaG9sZCBibG9jayBudW1iZXJzLCBzbyBpdCBpcyBlYXN5CisgKiB0byBnZXQgYSBzeW5jIGJsb2NrIG51bWJlci4gIFRoZSBvbmx5IGNvbmNlcm4gaXMgdG8gZmlndXJlIG91dCB3aGljaAorICogbG9nIHJlY29yZCBoZWFkZXIgdG8gYmVsaWV2ZS4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGFsZ29yaXRobSB1c2VzIHRoZSBsb2cgcmVjb3JkIGhlYWRlciB3aXRoIHRoZSBsYXJnZXN0CisgKiBsc24uICBUaGUgZW50aXJlIGxvZyByZWNvcmQgZG9lcyBub3QgbmVlZCB0byBiZSB2YWxpZC4gIFdlIG9ubHkgY2FyZQorICogdGhhdCB0aGUgaGVhZGVyIGlzIHZhbGlkLgorICoKKyAqIFdlIGNvdWxkIHNwZWVkIHVwIHNlYXJjaCBieSB1c2luZyBjdXJyZW50IGhlYWRfYmxrIGJ1ZmZlciwgYnV0IGl0IGlzIG5vdAorICogYXZhaWxhYmxlLgorICovCitpbnQKK3hsb2dfZmluZF90YWlsKAorCXhsb2dfdAkJCSpsb2csCisJeGZzX2RhZGRyX3QJCSpoZWFkX2JsaywKKwl4ZnNfZGFkZHJfdAkJKnRhaWxfYmxrLAorCWludAkJCXJlYWRvbmx5KQoreworCXhsb2dfcmVjX2hlYWRlcl90CSpyaGVhZDsKKwl4bG9nX29wX2hlYWRlcl90CSpvcF9oZWFkOworCXhmc19jYWRkcl90CQlvZmZzZXQgPSBOVUxMOworCXhmc19idWZfdAkJKmJwOworCWludAkJCWVycm9yLCBpLCBmb3VuZDsKKwl4ZnNfZGFkZHJfdAkJdW1vdW50X2RhdGFfYmxrOworCXhmc19kYWRkcl90CQlhZnRlcl91bW91bnRfYmxrOworCXhmc19sc25fdAkJdGFpbF9sc247CisJaW50CQkJaGJsa3M7CisKKwlmb3VuZCA9IDA7CisKKwkvKgorCSAqIEZpbmQgcHJldmlvdXMgbG9nIHJlY29yZAorCSAqLworCWlmICgoZXJyb3IgPSB4bG9nX2ZpbmRfaGVhZChsb2csIGhlYWRfYmxrKSkpCisJCXJldHVybiBlcnJvcjsKKworCWJwID0geGxvZ19nZXRfYnAobG9nLCAxKTsKKwlpZiAoIWJwKQorCQlyZXR1cm4gRU5PTUVNOworCWlmICgqaGVhZF9ibGsgPT0gMCkgewkJCQkvKiBzcGVjaWFsIGNhc2UgKi8KKwkJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCAwLCAxLCBicCkpKQorCQkJZ290byBicmVhZF9lcnI7CisJCW9mZnNldCA9IHhsb2dfYWxpZ24obG9nLCAwLCAxLCBicCk7CisJCWlmIChHRVRfQ1lDTEUob2Zmc2V0LCBBUkNIX0NPTlZFUlQpID09IDApIHsKKwkJCSp0YWlsX2JsayA9IDA7CisJCQkvKiBsZWF2ZSBhbGwgb3RoZXIgbG9nIGluaXRlZCB2YWx1ZXMgYWxvbmUgKi8KKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0KKworCS8qCisJICogU2VhcmNoIGJhY2t3YXJkcyBsb29raW5nIGZvciBsb2cgcmVjb3JkIGhlYWRlciBibG9jaworCSAqLworCUFTU0VSVCgqaGVhZF9ibGsgPCBJTlRfTUFYKTsKKwlmb3IgKGkgPSAoaW50KSgqaGVhZF9ibGspIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCBpLCAxLCBicCkpKQorCQkJZ290byBicmVhZF9lcnI7CisJCW9mZnNldCA9IHhsb2dfYWxpZ24obG9nLCBpLCAxLCBicCk7CisJCWlmIChYTE9HX0hFQURFUl9NQUdJQ19OVU0gPT0KKwkJICAgIElOVF9HRVQoKih1aW50ICopb2Zmc2V0LCBBUkNIX0NPTlZFUlQpKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwkvKgorCSAqIElmIHdlIGhhdmVuJ3QgZm91bmQgdGhlIGxvZyByZWNvcmQgaGVhZGVyIGJsb2NrLCBzdGFydCBsb29raW5nCisJICogYWdhaW4gZnJvbSB0aGUgZW5kIG9mIHRoZSBwaHlzaWNhbCBsb2cuICBYWFhtaWtlbjogVGhlcmUgc2hvdWxkIGJlCisJICogYSBjaGVjayBoZXJlIHRvIG1ha2Ugc3VyZSB3ZSBkaWRuJ3Qgc2VhcmNoIG1vcmUgdGhhbiBOIGJsb2NrcyBpbgorCSAqIHRoZSBwcmV2aW91cyBjb2RlLgorCSAqLworCWlmICghZm91bmQpIHsKKwkJZm9yIChpID0gbG9nLT5sX2xvZ0JCc2l6ZSAtIDE7IGkgPj0gKGludCkoKmhlYWRfYmxrKTsgaS0tKSB7CisJCQlpZiAoKGVycm9yID0geGxvZ19icmVhZChsb2csIGksIDEsIGJwKSkpCisJCQkJZ290byBicmVhZF9lcnI7CisJCQlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgaSwgMSwgYnApOworCQkJaWYgKFhMT0dfSEVBREVSX01BR0lDX05VTSA9PQorCQkJICAgIElOVF9HRVQoKih1aW50KilvZmZzZXQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCQlmb3VuZCA9IDI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaWYgKCFmb3VuZCkgeworCQl4bG9nX3dhcm4oIlhGUzogeGxvZ19maW5kX3RhaWw6IGNvdWxkbid0IGZpbmQgc3luYyByZWNvcmQiKTsKKwkJQVNTRVJUKDApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCisJLyogZmluZCBibGtfbm8gb2YgdGFpbCBvZiBsb2cgKi8KKwlyaGVhZCA9ICh4bG9nX3JlY19oZWFkZXJfdCAqKW9mZnNldDsKKwkqdGFpbF9ibGsgPSBCTE9DS19MU04oSU5UX0dFVChyaGVhZC0+aF90YWlsX2xzbiwgQVJDSF9DT05WRVJUKSk7CisKKwkvKgorCSAqIFJlc2V0IGxvZyB2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoZSBzdGF0ZSBvZiB0aGUgbG9nIHdoZW4gd2UKKwkgKiBjcmFzaGVkLiAgSW4gdGhlIGNhc2Ugd2hlcmUgaGVhZF9ibGsgPT0gMCwgd2UgYnVtcCBjdXJyX2N5Y2xlCisJICogb25lIGJlY2F1c2UgdGhlIG5leHQgd3JpdGUgc3RhcnRzIGEgbmV3IGN5Y2xlIHJhdGhlciB0aGFuCisJICogY29udGludWluZyB0aGUgY3ljbGUgb2YgdGhlIGxhc3QgZ29vZCBsb2cgcmVjb3JkLiAgQXQgdGhpcworCSAqIHBvaW50IHdlIGhhdmUgZ3VhcmFudGVlZCB0aGF0IGFsbCBwYXJ0aWFsIGxvZyByZWNvcmRzIGhhdmUgYmVlbgorCSAqIGFjY291bnRlZCBmb3IuICBUaGVyZWZvcmUsIHdlIGtub3cgdGhhdCB0aGUgbGFzdCBnb29kIGxvZyByZWNvcmQKKwkgKiB3cml0dGVuIHdhcyBjb21wbGV0ZSBhbmQgZW5kZWQgZXhhY3RseSBvbiB0aGUgZW5kIGJvdW5kYXJ5CisJICogb2YgdGhlIHBoeXNpY2FsIGxvZy4KKwkgKi8KKwlsb2ctPmxfcHJldl9ibG9jayA9IGk7CisJbG9nLT5sX2N1cnJfYmxvY2sgPSAoaW50KSpoZWFkX2JsazsKKwlsb2ctPmxfY3Vycl9jeWNsZSA9IElOVF9HRVQocmhlYWQtPmhfY3ljbGUsIEFSQ0hfQ09OVkVSVCk7CisJaWYgKGZvdW5kID09IDIpCisJCWxvZy0+bF9jdXJyX2N5Y2xlKys7CisJbG9nLT5sX3RhaWxfbHNuID0gSU5UX0dFVChyaGVhZC0+aF90YWlsX2xzbiwgQVJDSF9DT05WRVJUKTsKKwlsb2ctPmxfbGFzdF9zeW5jX2xzbiA9IElOVF9HRVQocmhlYWQtPmhfbHNuLCBBUkNIX0NPTlZFUlQpOworCWxvZy0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlID0gbG9nLT5sX2N1cnJfY3ljbGU7CisJbG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMgPSBCQlRPQihsb2ctPmxfY3Vycl9ibG9jayk7CisJbG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlID0gbG9nLT5sX2N1cnJfY3ljbGU7CisJbG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzID0gQkJUT0IobG9nLT5sX2N1cnJfYmxvY2spOworCisJLyoKKwkgKiBMb29rIGZvciB1bm1vdW50IHJlY29yZC4gIElmIHdlIGZpbmQgaXQsIHRoZW4gd2Uga25vdyB0aGVyZQorCSAqIHdhcyBhIGNsZWFuIHVubW91bnQuICBTaW5jZSAnaScgY291bGQgYmUgdGhlIGxhc3QgYmxvY2sgaW4KKwkgKiB0aGUgcGh5c2ljYWwgbG9nLCB3ZSBjb252ZXJ0IHRvIGEgbG9nIGJsb2NrIGJlZm9yZSBjb21wYXJpbmcKKwkgKiB0byB0aGUgaGVhZF9ibGsuCisJICoKKwkgKiBTYXZlIHRoZSBjdXJyZW50IHRhaWwgbHNuIHRvIHVzZSB0byBwYXNzIHRvCisJICogeGxvZ19jbGVhcl9zdGFsZV9ibG9ja3MoKSBiZWxvdy4gIFdlIHdvbid0IHdhbnQgdG8gY2xlYXIgdGhlCisJICogdW5tb3VudCByZWNvcmQgaWYgdGhlcmUgaXMgb25lLCBzbyB3ZSBwYXNzIHRoZSBsc24gb2YgdGhlCisJICogdW5tb3VudCByZWNvcmQgcmF0aGVyIHRoYW4gdGhlIGJsb2NrIGFmdGVyIGl0LgorCSAqLworCWlmIChYRlNfU0JfVkVSU0lPTl9IQVNMT0dWMigmbG9nLT5sX21wLT5tX3NiKSkgeworCQlpbnQJaF9zaXplID0gSU5UX0dFVChyaGVhZC0+aF9zaXplLCBBUkNIX0NPTlZFUlQpOworCQlpbnQJaF92ZXJzaW9uID0gSU5UX0dFVChyaGVhZC0+aF92ZXJzaW9uLCBBUkNIX0NPTlZFUlQpOworCisJCWlmICgoaF92ZXJzaW9uICYgWExPR19WRVJTSU9OXzIpICYmCisJCSAgICAoaF9zaXplID4gWExPR19IRUFERVJfQ1lDTEVfU0laRSkpIHsKKwkJCWhibGtzID0gaF9zaXplIC8gWExPR19IRUFERVJfQ1lDTEVfU0laRTsKKwkJCWlmIChoX3NpemUgJSBYTE9HX0hFQURFUl9DWUNMRV9TSVpFKQorCQkJCWhibGtzKys7CisJCX0gZWxzZSB7CisJCQloYmxrcyA9IDE7CisJCX0KKwl9IGVsc2UgeworCQloYmxrcyA9IDE7CisJfQorCWFmdGVyX3Vtb3VudF9ibGsgPSAoaSArIGhibGtzICsgKGludCkKKwkJQlRPQkIoSU5UX0dFVChyaGVhZC0+aF9sZW4sIEFSQ0hfQ09OVkVSVCkpKSAlIGxvZy0+bF9sb2dCQnNpemU7CisJdGFpbF9sc24gPSBsb2ctPmxfdGFpbF9sc247CisJaWYgKCpoZWFkX2JsayA9PSBhZnRlcl91bW91bnRfYmxrICYmCisJICAgIElOVF9HRVQocmhlYWQtPmhfbnVtX2xvZ29wcywgQVJDSF9DT05WRVJUKSA9PSAxKSB7CisJCXVtb3VudF9kYXRhX2JsayA9IChpICsgaGJsa3MpICUgbG9nLT5sX2xvZ0JCc2l6ZTsKKwkJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCB1bW91bnRfZGF0YV9ibGssIDEsIGJwKSkpIHsKKwkJCWdvdG8gYnJlYWRfZXJyOworCQl9CisJCW9mZnNldCA9IHhsb2dfYWxpZ24obG9nLCB1bW91bnRfZGF0YV9ibGssIDEsIGJwKTsKKwkJb3BfaGVhZCA9ICh4bG9nX29wX2hlYWRlcl90ICopb2Zmc2V0OworCQlpZiAob3BfaGVhZC0+b2hfZmxhZ3MgJiBYTE9HX1VOTU9VTlRfVFJBTlMpIHsKKwkJCS8qCisJCQkgKiBTZXQgdGFpbCBhbmQgbGFzdCBzeW5jIHNvIHRoYXQgbmV3bHkgd3JpdHRlbgorCQkJICogbG9nIHJlY29yZHMgd2lsbCBwb2ludCByZWNvdmVyeSB0byBhZnRlciB0aGUKKwkJCSAqIGN1cnJlbnQgdW5tb3VudCByZWNvcmQuCisJCQkgKi8KKwkJCUFTU0lHTl9BTllfTFNOX0hPU1QobG9nLT5sX3RhaWxfbHNuLCBsb2ctPmxfY3Vycl9jeWNsZSwKKwkJCQkJYWZ0ZXJfdW1vdW50X2Jsayk7CisJCQlBU1NJR05fQU5ZX0xTTl9IT1NUKGxvZy0+bF9sYXN0X3N5bmNfbHNuLCBsb2ctPmxfY3Vycl9jeWNsZSwKKwkJCQkJYWZ0ZXJfdW1vdW50X2Jsayk7CisJCQkqdGFpbF9ibGsgPSBhZnRlcl91bW91bnRfYmxrOworCQl9CisJfQorCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gYmxvY2tzIGluIGZyb250IG9mIHRoZSBoZWFkCisJICogd2l0aCB0aGUgc2FtZSBjeWNsZSBudW1iZXIgYXMgdGhlIGhlYWQuICBUaGlzIGNhbiBoYXBwZW4KKwkgKiBiZWNhdXNlIHdlIGFsbG93IG11bHRpcGxlIG91dHN0YW5kaW5nIGxvZyB3cml0ZXMgY29uY3VycmVudGx5LAorCSAqIGFuZCB0aGUgbGF0ZXIgd3JpdGVzIG1pZ2h0IG1ha2UgaXQgb3V0IGJlZm9yZSBlYXJsaWVyIG9uZXMuCisJICoKKwkgKiBXZSB1c2UgdGhlIGxzbiBmcm9tIGJlZm9yZSBtb2RpZnlpbmcgaXQgc28gdGhhdCB3ZSdsbCBuZXZlcgorCSAqIG92ZXJ3cml0ZSB0aGUgdW5tb3VudCByZWNvcmQgYWZ0ZXIgYSBjbGVhbiB1bm1vdW50LgorCSAqCisJICogRG8gdGhpcyBvbmx5IGlmIHdlIGFyZSBnb2luZyB0byByZWNvdmVyIHRoZSBmaWxlc3lzdGVtCisJICoKKwkgKiBOT1RFOiBUaGlzIHVzZWQgdG8gc2F5ICJpZiAoIXJlYWRvbmx5KSIKKwkgKiBIb3dldmVyIG9uIExpbnV4LCB3ZSBjYW4gJiBkbyByZWNvdmVyIGEgcmVhZC1vbmx5IGZpbGVzeXN0ZW0uCisJICogV2Ugb25seSBza2lwIHJlY292ZXJ5IGlmIE5PUkVDT1ZFUlkgaXMgc3BlY2lmaWVkIG9uIG1vdW50LAorCSAqIGluIHdoaWNoIGNhc2Ugd2Ugd291bGQgbm90IGJlIGhlcmUuCisJICoKKwkgKiBCdXQuLi4gaWYgdGhlIC1kZXZpY2UtIGl0c2VsZiBpcyByZWFkb25seSwganVzdCBza2lwIHRoaXMuCisJICogV2UgY2FuJ3QgcmVjb3ZlciB0aGlzIGRldmljZSBhbnl3YXksIHNvIGl0IHdvbid0IG1hdHRlci4KKwkgKi8KKwlpZiAoIXhmc19yZWFkb25seV9idWZ0YXJnKGxvZy0+bF9tcC0+bV9sb2dkZXZfdGFyZ3ApKSB7CisJCWVycm9yID0geGxvZ19jbGVhcl9zdGFsZV9ibG9ja3MobG9nLCB0YWlsX2xzbik7CisJfQorCiticmVhZF9lcnI6CitleGl0OgorCXhsb2dfcHV0X2JwKGJwKTsKKworCWlmIChlcnJvcikKKwkJeGxvZ193YXJuKCJYRlM6IGZhaWxlZCB0byBsb2NhdGUgbG9nIHRhaWwiKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBJcyB0aGUgbG9nIHplcm9lZCBhdCBhbGw/CisgKgorICogVGhlIGxhc3QgYmluYXJ5IHNlYXJjaCBzaG91bGQgYmUgY2hhbmdlZCB0byBwZXJmb3JtIGFuIFggYmxvY2sgcmVhZAorICogb25jZSBYIGJlY29tZXMgc21hbGwgZW5vdWdoLiAgWW91IGNhbiB0aGVuIHNlYXJjaCBsaW5lYXJseSB0aHJvdWdoCisgKiB0aGUgWCBibG9ja3MuICBUaGlzIHdpbGwgY3V0IGRvd24gb24gdGhlIG51bWJlciBvZiByZWFkcyB3ZSBuZWVkIHRvIGRvLgorICoKKyAqIElmIHRoZSBsb2cgaXMgcGFydGlhbGx5IHplcm9lZCwgdGhpcyByb3V0aW5lIHdpbGwgcGFzcyBiYWNrIHRoZSBibGtubworICogb2YgdGhlIGZpcnN0IGJsb2NrIHdpdGggY3ljbGUgbnVtYmVyIDAuICBJdCB3b24ndCBoYXZlIGEgY29tcGxldGUgTFIKKyAqIHByZWNlZGluZyBpdC4KKyAqCisgKiBSZXR1cm46CisgKgkwICA9PiB0aGUgbG9nIGlzIGNvbXBsZXRlbHkgd3JpdHRlbiB0bworICoJLTEgPT4gdXNlICpibGtfbm8gYXMgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBsb2cKKyAqCT4wID0+IGVycm9yIGhhcyBvY2N1cnJlZAorICovCitpbnQKK3hsb2dfZmluZF96ZXJvZWQoCisJeGxvZ190CQkqbG9nLAorCXhmc19kYWRkcl90CSpibGtfbm8pCit7CisJeGZzX2J1Zl90CSpicDsKKwl4ZnNfY2FkZHJfdAlvZmZzZXQ7CisJdWludAkgICAgICAgIGZpcnN0X2N5Y2xlLCBsYXN0X2N5Y2xlOworCXhmc19kYWRkcl90CW5ld19ibGssIGxhc3RfYmxrLCBzdGFydF9ibGs7CisJeGZzX2RhZGRyX3QgICAgIG51bV9zY2FuX2JibGtzOworCWludAkgICAgICAgIGVycm9yLCBsb2dfYmJudW0gPSBsb2ctPmxfbG9nQkJzaXplOworCisJLyogY2hlY2sgdG90YWxseSB6ZXJvZWQgbG9nICovCisJYnAgPSB4bG9nX2dldF9icChsb2csIDEpOworCWlmICghYnApCisJCXJldHVybiBFTk9NRU07CisJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCAwLCAxLCBicCkpKQorCQlnb3RvIGJwX2VycjsKKwlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgMCwgMSwgYnApOworCWZpcnN0X2N5Y2xlID0gR0VUX0NZQ0xFKG9mZnNldCwgQVJDSF9DT05WRVJUKTsKKwlpZiAoZmlyc3RfY3ljbGUgPT0gMCkgewkJLyogY29tcGxldGVseSB6ZXJvZWQgbG9nICovCisJCSpibGtfbm8gPSAwOworCQl4bG9nX3B1dF9icChicCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBjaGVjayBwYXJ0aWFsbHkgemVyb2VkIGxvZyAqLworCWlmICgoZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgbG9nX2JibnVtLTEsIDEsIGJwKSkpCisJCWdvdG8gYnBfZXJyOworCW9mZnNldCA9IHhsb2dfYWxpZ24obG9nLCBsb2dfYmJudW0tMSwgMSwgYnApOworCWxhc3RfY3ljbGUgPSBHRVRfQ1lDTEUob2Zmc2V0LCBBUkNIX0NPTlZFUlQpOworCWlmIChsYXN0X2N5Y2xlICE9IDApIHsJCS8qIGxvZyBjb21wbGV0ZWx5IHdyaXR0ZW4gdG8gKi8KKwkJeGxvZ19wdXRfYnAoYnApOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGZpcnN0X2N5Y2xlICE9IDEpIHsKKwkJLyoKKwkJICogSWYgdGhlIGN5Y2xlIG9mIHRoZSBsYXN0IGJsb2NrIGlzIHplcm8sIHRoZSBjeWNsZSBvZgorCQkgKiB0aGUgZmlyc3QgYmxvY2sgbXVzdCBiZSAxLiBJZiBpdCdzIG5vdCwgbWF5YmUgd2UncmUKKwkJICogbm90IGxvb2tpbmcgYXQgYSBsb2cuLi4gQmFpbCBvdXQuCisJCSAqLworCQl4bG9nX3dhcm4oIlhGUzogTG9nIGluY29uc2lzdGVudCBvciBub3QgYSBsb2cgKGxhc3Q9PTAsIGZpcnN0IT0xKSIpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJfQorCisJLyogd2UgaGF2ZSBhIHBhcnRpYWxseSB6ZXJvZWQgbG9nICovCisJbGFzdF9ibGsgPSBsb2dfYmJudW0tMTsKKwlpZiAoKGVycm9yID0geGxvZ19maW5kX2N5Y2xlX3N0YXJ0KGxvZywgYnAsIDAsICZsYXN0X2JsaywgMCkpKQorCQlnb3RvIGJwX2VycjsKKworCS8qCisJICogVmFsaWRhdGUgdGhlIGFuc3dlci4gIEJlY2F1c2UgdGhlcmUgaXMgbm8gd2F5IHRvIGd1YXJhbnRlZSB0aGF0CisJICogdGhlIGVudGlyZSBsb2cgaXMgbWFkZSB1cCBvZiBsb2cgcmVjb3JkcyB3aGljaCBhcmUgdGhlIHNhbWUgc2l6ZSwKKwkgKiB3ZSBzY2FuIG92ZXIgdGhlIGRlZmluZWQgbWF4aW11bSBibG9ja3MuICBBdCB0aGlzIHBvaW50LCB0aGUgbWF4aW11bQorCSAqIGlzIG5vdCBjaG9zZW4gdG8gbWVhbiBhbnl0aGluZyBzcGVjaWFsLiAgIFhYWG1pa2VuCisJICovCisJbnVtX3NjYW5fYmJsa3MgPSBYTE9HX1RPVEFMX1JFQ19TSElGVChsb2cpOworCUFTU0VSVChudW1fc2Nhbl9iYmxrcyA8PSBJTlRfTUFYKTsKKworCWlmIChsYXN0X2JsayA8IG51bV9zY2FuX2JibGtzKQorCQludW1fc2Nhbl9iYmxrcyA9IGxhc3RfYmxrOworCXN0YXJ0X2JsayA9IGxhc3RfYmxrIC0gbnVtX3NjYW5fYmJsa3M7CisKKwkvKgorCSAqIFdlIHNlYXJjaCBmb3IgYW55IGluc3RhbmNlcyBvZiBjeWNsZSBudW1iZXIgMCB0aGF0IG9jY3VyIGJlZm9yZQorCSAqIG91ciBjdXJyZW50IGVzdGltYXRlIG9mIHRoZSBoZWFkLiAgV2hhdCB3ZSdyZSB0cnlpbmcgdG8gZGV0ZWN0IGlzCisJICogICAgICAgIDEgLi4uIHwgMCB8IDEgfCAwLi4uCisJICogICAgICAgICAgICAgICAgICAgICAgIF4gYmluYXJ5IHNlYXJjaCBlbmRzIGhlcmUKKwkgKi8KKwlpZiAoKGVycm9yID0geGxvZ19maW5kX3ZlcmlmeV9jeWNsZShsb2csIHN0YXJ0X2JsaywKKwkJCQkJIChpbnQpbnVtX3NjYW5fYmJsa3MsIDAsICZuZXdfYmxrKSkpCisJCWdvdG8gYnBfZXJyOworCWlmIChuZXdfYmxrICE9IC0xKQorCQlsYXN0X2JsayA9IG5ld19ibGs7CisKKwkvKgorCSAqIFBvdGVudGlhbGx5IGJhY2t1cCBvdmVyIHBhcnRpYWwgbG9nIHJlY29yZCB3cml0ZS4gIFdlIGRvbid0IG5lZWQKKwkgKiB0byBzZWFyY2ggdGhlIGVuZCBvZiB0aGUgbG9nIGJlY2F1c2Ugd2Uga25vdyBpdCBpcyB6ZXJvLgorCSAqLworCWlmICgoZXJyb3IgPSB4bG9nX2ZpbmRfdmVyaWZ5X2xvZ19yZWNvcmQobG9nLCBzdGFydF9ibGssCisJCQkJJmxhc3RfYmxrLCAwKSkgPT0gLTEpIHsKKwkgICAgZXJyb3IgPSBYRlNfRVJST1IoRUlPKTsKKwkgICAgZ290byBicF9lcnI7CisJfSBlbHNlIGlmIChlcnJvcikKKwkgICAgZ290byBicF9lcnI7CisKKwkqYmxrX25vID0gbGFzdF9ibGs7CiticF9lcnI6CisJeGxvZ19wdXRfYnAoYnApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCXJldHVybiAtMTsKK30KKworLyoKKyAqIFRoZXNlIGFyZSBzaW1wbGUgc3Vicm91dGluZXMgdXNlZCBieSB4bG9nX2NsZWFyX3N0YWxlX2Jsb2NrcygpIGJlbG93CisgKiB0byBpbml0aWFsaXplIGEgYnVmZmVyIGZ1bGwgb2YgZW1wdHkgbG9nIHJlY29yZCBoZWFkZXJzIGFuZCB3cml0ZQorICogdGhlbSBpbnRvIHRoZSBsb2cuCisgKi8KK1NUQVRJQyB2b2lkCit4bG9nX2FkZF9yZWNvcmQoCisJeGxvZ190CQkJKmxvZywKKwl4ZnNfY2FkZHJfdAkJYnVmLAorCWludAkJCWN5Y2xlLAorCWludAkJCWJsb2NrLAorCWludAkJCXRhaWxfY3ljbGUsCisJaW50CQkJdGFpbF9ibG9jaykKK3sKKwl4bG9nX3JlY19oZWFkZXJfdAkqcmVjcCA9ICh4bG9nX3JlY19oZWFkZXJfdCAqKWJ1ZjsKKworCW1lbXNldChidWYsIDAsIEJCU0laRSk7CisJSU5UX1NFVChyZWNwLT5oX21hZ2ljbm8sIEFSQ0hfQ09OVkVSVCwgWExPR19IRUFERVJfTUFHSUNfTlVNKTsKKwlJTlRfU0VUKHJlY3AtPmhfY3ljbGUsIEFSQ0hfQ09OVkVSVCwgY3ljbGUpOworCUlOVF9TRVQocmVjcC0+aF92ZXJzaW9uLCBBUkNIX0NPTlZFUlQsCisJCQlYRlNfU0JfVkVSU0lPTl9IQVNMT0dWMigmbG9nLT5sX21wLT5tX3NiKSA/IDIgOiAxKTsKKwlBU1NJR05fQU5ZX0xTTl9ESVNLKHJlY3AtPmhfbHNuLCBjeWNsZSwgYmxvY2spOworCUFTU0lHTl9BTllfTFNOX0RJU0socmVjcC0+aF90YWlsX2xzbiwgdGFpbF9jeWNsZSwgdGFpbF9ibG9jayk7CisJSU5UX1NFVChyZWNwLT5oX2ZtdCwgQVJDSF9DT05WRVJULCBYTE9HX0ZNVCk7CisJbWVtY3B5KCZyZWNwLT5oX2ZzX3V1aWQsICZsb2ctPmxfbXAtPm1fc2Iuc2JfdXVpZCwgc2l6ZW9mKHV1aWRfdCkpOworfQorCitTVEFUSUMgaW50Cit4bG9nX3dyaXRlX2xvZ19yZWNvcmRzKAorCXhsb2dfdAkJKmxvZywKKwlpbnQJCWN5Y2xlLAorCWludAkJc3RhcnRfYmxvY2ssCisJaW50CQlibG9ja3MsCisJaW50CQl0YWlsX2N5Y2xlLAorCWludAkJdGFpbF9ibG9jaykKK3sKKwl4ZnNfY2FkZHJfdAlvZmZzZXQ7CisJeGZzX2J1Zl90CSpicDsKKwlpbnQJCWJhbGlnbiwgZWFsaWduOworCWludAkJc2VjdGJiID0gWExPR19TRUNUT1JfUk9VTkRVUF9CQkNPVU5UKGxvZywgMSk7CisJaW50CQllbmRfYmxvY2sgPSBzdGFydF9ibG9jayArIGJsb2NrczsKKwlpbnQJCWJ1ZmJsa3M7CisJaW50CQllcnJvciA9IDA7CisJaW50CQlpLCBqID0gMDsKKworCWJ1ZmJsa3MgPSAxIDw8IGZmcyhibG9ja3MpOworCXdoaWxlICghKGJwID0geGxvZ19nZXRfYnAobG9nLCBidWZibGtzKSkpIHsKKwkJYnVmYmxrcyA+Pj0gMTsKKwkJaWYgKGJ1ZmJsa3MgPD0gbG9nLT5sX3NlY3RiYl9sb2cpCisJCQlyZXR1cm4gRU5PTUVNOworCX0KKworCS8qIFdlIG1heSBuZWVkIHRvIGRvIGEgcmVhZCBhdCB0aGUgc3RhcnQgdG8gZmlsbCBpbiBwYXJ0IG9mCisJICogdGhlIGJ1ZmZlciBpbiB0aGUgc3RhcnRpbmcgc2VjdG9yIG5vdCBjb3ZlcmVkIGJ5IHRoZSBmaXJzdAorCSAqIHdyaXRlIGJlbG93LgorCSAqLworCWJhbGlnbiA9IFhMT0dfU0VDVE9SX1JPVU5ERE9XTl9CTEtOTyhsb2csIHN0YXJ0X2Jsb2NrKTsKKwlpZiAoYmFsaWduICE9IHN0YXJ0X2Jsb2NrKSB7CisJCWlmICgoZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgc3RhcnRfYmxvY2ssIDEsIGJwKSkpIHsKKwkJCXhsb2dfcHV0X2JwKGJwKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlqID0gc3RhcnRfYmxvY2sgLSBiYWxpZ247CisJfQorCisJZm9yIChpID0gc3RhcnRfYmxvY2s7IGkgPCBlbmRfYmxvY2s7IGkgKz0gYnVmYmxrcykgeworCQlpbnQJCWJjb3VudCwgZW5kY291bnQ7CisKKwkJYmNvdW50ID0gbWluKGJ1ZmJsa3MsIGVuZF9ibG9jayAtIHN0YXJ0X2Jsb2NrKTsKKwkJZW5kY291bnQgPSBiY291bnQgLSBqOworCisJCS8qIFdlIG1heSBuZWVkIHRvIGRvIGEgcmVhZCBhdCB0aGUgZW5kIHRvIGZpbGwgaW4gcGFydCBvZgorCQkgKiB0aGUgYnVmZmVyIGluIHRoZSBmaW5hbCBzZWN0b3Igbm90IGNvdmVyZWQgYnkgdGhlIHdyaXRlLgorCQkgKiBJZiB0aGlzIGlzIHRoZSBzYW1lIHNlY3RvciBhcyB0aGUgYWJvdmUgcmVhZCwgc2tpcCBpdC4KKwkJICovCisJCWVhbGlnbiA9IFhMT0dfU0VDVE9SX1JPVU5ERE9XTl9CTEtOTyhsb2csIGVuZF9ibG9jayk7CisJCWlmIChqID09IDAgJiYgKHN0YXJ0X2Jsb2NrICsgZW5kY291bnQgPiBlYWxpZ24pKSB7CisJCQlvZmZzZXQgPSBYRlNfQlVGX1BUUihicCk7CisJCQliYWxpZ24gPSBCQlRPQihlYWxpZ24gLSBzdGFydF9ibG9jayk7CisJCQlYRlNfQlVGX1NFVF9QVFIoYnAsIG9mZnNldCArIGJhbGlnbiwgQkJUT0Ioc2VjdGJiKSk7CisJCQlpZiAoKGVycm9yID0geGxvZ19icmVhZChsb2csIGVhbGlnbiwgc2VjdGJiLCBicCkpKQorCQkJCWJyZWFrOworCQkJWEZTX0JVRl9TRVRfUFRSKGJwLCBvZmZzZXQsIGJ1ZmJsa3MpOworCQl9CisKKwkJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIHN0YXJ0X2Jsb2NrLCBlbmRjb3VudCwgYnApOworCQlmb3IgKDsgaiA8IGVuZGNvdW50OyBqKyspIHsKKwkJCXhsb2dfYWRkX3JlY29yZChsb2csIG9mZnNldCwgY3ljbGUsIGkraiwKKwkJCQkJdGFpbF9jeWNsZSwgdGFpbF9ibG9jayk7CisJCQlvZmZzZXQgKz0gQkJTSVpFOworCQl9CisJCWVycm9yID0geGxvZ19id3JpdGUobG9nLCBzdGFydF9ibG9jaywgZW5kY291bnQsIGJwKTsKKwkJaWYgKGVycm9yKQorCQkJYnJlYWs7CisJCXN0YXJ0X2Jsb2NrICs9IGVuZGNvdW50OworCQlqID0gMDsKKwl9CisJeGxvZ19wdXRfYnAoYnApOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gYmxvdyBhd2F5IGFueSBpbmNvbXBsZXRlIGxvZyB3cml0ZXMgb3V0CisgKiBpbiBmcm9udCBvZiB0aGUgbG9nIGhlYWQuICBXZSBkbyB0aGlzIHNvIHRoYXQgd2Ugd29uJ3QgYmVjb21lIGNvbmZ1c2VkCisgKiBpZiB3ZSBjb21lIHVwLCB3cml0ZSBvbmx5IGEgbGl0dGxlIGJpdCBtb3JlLCBhbmQgdGhlbiBjcmFzaCBhZ2Fpbi4KKyAqIElmIHdlIGxlYXZlIHRoZSBwYXJ0aWFsIGxvZyByZWNvcmRzIG91dCB0aGVyZSwgdGhpcyBzaXR1YXRpb24gY291bGQKKyAqIGNhdXNlIHVzIHRvIHRoaW5rIHRob3NlIHBhcnRpYWwgd3JpdGVzIGFyZSB2YWxpZCBibG9ja3Mgc2luY2UgdGhleQorICogaGF2ZSB0aGUgY3VycmVudCBjeWNsZSBudW1iZXIuICBXZSBnZXQgcmlkIG9mIHRoZW0gYnkgb3ZlcndyaXRpbmcgdGhlbQorICogd2l0aCBlbXB0eSBsb2cgcmVjb3JkcyB3aXRoIHRoZSBvbGQgY3ljbGUgbnVtYmVyIHJhdGhlciB0aGFuIHRoZQorICogY3VycmVudCBvbmUuCisgKgorICogVGhlIHRhaWwgbHNuIGlzIHBhc3NlZCBpbiByYXRoZXIgdGhhbiB0YWtlbiBmcm9tCisgKiB0aGUgbG9nIHNvIHRoYXQgd2Ugd2lsbCBub3Qgd3JpdGUgb3ZlciB0aGUgdW5tb3VudCByZWNvcmQgYWZ0ZXIgYQorICogY2xlYW4gdW5tb3VudCBpbiBhIDUxMiBibG9jayBsb2cuICBEb2luZyBzbyB3b3VsZCBsZWF2ZSB0aGUgbG9nIHdpdGhvdXQKKyAqIGFueSB2YWxpZCBsb2cgcmVjb3JkcyBpbiBpdCB1bnRpbCBhIG5ldyBvbmUgd2FzIHdyaXR0ZW4uICBJZiB3ZSBjcmFzaGVkCisgKiBkdXJpbmcgdGhhdCB0aW1lIHdlIHdvdWxkIG5vdCBiZSBhYmxlIHRvIHJlY292ZXIuCisgKi8KK1NUQVRJQyBpbnQKK3hsb2dfY2xlYXJfc3RhbGVfYmxvY2tzKAorCXhsb2dfdAkJKmxvZywKKwl4ZnNfbHNuX3QJdGFpbF9sc24pCit7CisJaW50CQl0YWlsX2N5Y2xlLCBoZWFkX2N5Y2xlOworCWludAkJdGFpbF9ibG9jaywgaGVhZF9ibG9jazsKKwlpbnQJCXRhaWxfZGlzdGFuY2UsIG1heF9kaXN0YW5jZTsKKwlpbnQJCWRpc3RhbmNlOworCWludAkJZXJyb3I7CisKKwl0YWlsX2N5Y2xlID0gQ1lDTEVfTFNOKHRhaWxfbHNuKTsKKwl0YWlsX2Jsb2NrID0gQkxPQ0tfTFNOKHRhaWxfbHNuKTsKKwloZWFkX2N5Y2xlID0gbG9nLT5sX2N1cnJfY3ljbGU7CisJaGVhZF9ibG9jayA9IGxvZy0+bF9jdXJyX2Jsb2NrOworCisJLyoKKwkgKiBGaWd1cmUgb3V0IHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBuZXcgaGVhZCBvZiB0aGUgbG9nCisJICogYW5kIHRoZSB0YWlsLiAgV2Ugd2FudCB0byB3cml0ZSBvdmVyIGFueSBibG9ja3MgYmV5b25kIHRoZQorCSAqIGhlYWQgdGhhdCB3ZSBtYXkgaGF2ZSB3cml0dGVuIGp1c3QgYmVmb3JlIHRoZSBjcmFzaCwgYnV0CisJICogd2UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIHRhaWwgb2YgdGhlIGxvZy4KKwkgKi8KKwlpZiAoaGVhZF9jeWNsZSA9PSB0YWlsX2N5Y2xlKSB7CisJCS8qCisJCSAqIFRoZSB0YWlsIGlzIGJlaGluZCB0aGUgaGVhZCBpbiB0aGUgcGh5c2ljYWwgbG9nLAorCQkgKiBzbyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgaGVhZCB0byB0aGUgdGFpbCBpcyB0aGUKKwkJICogZGlzdGFuY2UgZnJvbSB0aGUgaGVhZCB0byB0aGUgZW5kIG9mIHRoZSBsb2cgcGx1cworCQkgKiB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsb2cgdG8gdGhlCisJCSAqIHRhaWwuCisJCSAqLworCQlpZiAodW5saWtlbHkoaGVhZF9ibG9jayA8IHRhaWxfYmxvY2sgfHwgaGVhZF9ibG9jayA+PSBsb2ctPmxfbG9nQkJzaXplKSkgeworCQkJWEZTX0VSUk9SX1JFUE9SVCgieGxvZ19jbGVhcl9zdGFsZV9ibG9ja3MoMSkiLAorCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbG9nLT5sX21wKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJfQorCQl0YWlsX2Rpc3RhbmNlID0gdGFpbF9ibG9jayArIChsb2ctPmxfbG9nQkJzaXplIC0gaGVhZF9ibG9jayk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhlIGhlYWQgaXMgYmVoaW5kIHRoZSB0YWlsIGluIHRoZSBwaHlzaWNhbCBsb2csCisJCSAqIHNvIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBoZWFkIHRvIHRoZSB0YWlsIGlzIGp1c3QKKwkJICogdGhlIHRhaWwgYmxvY2sgbWludXMgdGhlIGhlYWQgYmxvY2suCisJCSAqLworCQlpZiAodW5saWtlbHkoaGVhZF9ibG9jayA+PSB0YWlsX2Jsb2NrIHx8IGhlYWRfY3ljbGUgIT0gKHRhaWxfY3ljbGUgKyAxKSkpeworCQkJWEZTX0VSUk9SX1JFUE9SVCgieGxvZ19jbGVhcl9zdGFsZV9ibG9ja3MoMikiLAorCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbG9nLT5sX21wKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJfQorCQl0YWlsX2Rpc3RhbmNlID0gdGFpbF9ibG9jayAtIGhlYWRfYmxvY2s7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgaGVhZCBpcyByaWdodCB1cCBhZ2FpbnN0IHRoZSB0YWlsLCB3ZSBjYW4ndCBjbGVhcgorCSAqIGFueXRoaW5nLgorCSAqLworCWlmICh0YWlsX2Rpc3RhbmNlIDw9IDApIHsKKwkJQVNTRVJUKHRhaWxfZGlzdGFuY2UgPT0gMCk7CisJCXJldHVybiAwOworCX0KKworCW1heF9kaXN0YW5jZSA9IFhMT0dfVE9UQUxfUkVDX1NISUZUKGxvZyk7CisJLyoKKwkgKiBUYWtlIHRoZSBzbWFsbGVyIG9mIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBvdXRzdGFuZGluZyBJL08KKwkgKiB3ZSBjb3VsZCBoYXZlIGFuZCB0aGUgZGlzdGFuY2UgdG8gdGhlIHRhaWwgdG8gY2xlYXIgb3V0LgorCSAqIFdlIHRha2UgdGhlIHNtYWxsZXIgc28gdGhhdCB3ZSBkb24ndCBvdmVyd3JpdGUgdGhlIHRhaWwgYW5kCisJICogd2UgZG9uJ3Qgd2FzdGUgYWxsIGRheSB3cml0aW5nIGZyb20gdGhlIGhlYWQgdG8gdGhlIHRhaWwKKwkgKiBmb3Igbm8gcmVhc29uLgorCSAqLworCW1heF9kaXN0YW5jZSA9IE1JTihtYXhfZGlzdGFuY2UsIHRhaWxfZGlzdGFuY2UpOworCisJaWYgKChoZWFkX2Jsb2NrICsgbWF4X2Rpc3RhbmNlKSA8PSBsb2ctPmxfbG9nQkJzaXplKSB7CisJCS8qCisJCSAqIFdlIGNhbiBzdG9tcCBhbGwgdGhlIGJsb2NrcyB3ZSBuZWVkIHRvIHdpdGhvdXQKKwkJICogd3JhcHBpbmcgYXJvdW5kIHRoZSBlbmQgb2YgdGhlIGxvZy4gIEp1c3QgZG8gaXQKKwkJICogaW4gYSBzaW5nbGUgd3JpdGUuICBVc2UgdGhlIGN5Y2xlIG51bWJlciBvZiB0aGUKKwkJICogY3VycmVudCBjeWNsZSBtaW51cyBvbmUgc28gdGhhdCB0aGUgbG9nIHdpbGwgbG9vayBsaWtlOgorCQkgKiAgICAgbiAuLi4gfCBuIC0gMSAuLi4KKwkJICovCisJCWVycm9yID0geGxvZ193cml0ZV9sb2dfcmVjb3Jkcyhsb2csIChoZWFkX2N5Y2xlIC0gMSksCisJCQkJaGVhZF9ibG9jaywgbWF4X2Rpc3RhbmNlLCB0YWlsX2N5Y2xlLAorCQkJCXRhaWxfYmxvY2spOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogV2UgbmVlZCB0byB3cmFwIGFyb3VuZCB0aGUgZW5kIG9mIHRoZSBwaHlzaWNhbCBsb2cgaW4KKwkJICogb3JkZXIgdG8gY2xlYXIgYWxsIHRoZSBibG9ja3MuICBEbyBpdCBpbiB0d28gc2VwYXJhdGUKKwkJICogSS9Pcy4gIFRoZSBmaXJzdCB3cml0ZSBzaG91bGQgYmUgZnJvbSB0aGUgaGVhZCB0byB0aGUKKwkJICogZW5kIG9mIHRoZSBwaHlzaWNhbCBsb2csIGFuZCBpdCBzaG91bGQgdXNlIHRoZSBjdXJyZW50CisJCSAqIGN5Y2xlIG51bWJlciBtaW51cyBvbmUganVzdCBsaWtlIGFib3ZlLgorCQkgKi8KKwkJZGlzdGFuY2UgPSBsb2ctPmxfbG9nQkJzaXplIC0gaGVhZF9ibG9jazsKKwkJZXJyb3IgPSB4bG9nX3dyaXRlX2xvZ19yZWNvcmRzKGxvZywgKGhlYWRfY3ljbGUgLSAxKSwKKwkJCQloZWFkX2Jsb2NrLCBkaXN0YW5jZSwgdGFpbF9jeWNsZSwKKwkJCQl0YWlsX2Jsb2NrKTsKKworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisKKwkJLyoKKwkJICogTm93IHdyaXRlIHRoZSBibG9ja3MgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwaHlzaWNhbCBsb2cuCisJCSAqIFRoaXMgd3JpdGVzIHRoZSByZW1haW5kZXIgb2YgdGhlIGJsb2NrcyB3ZSB3YW50IHRvIGNsZWFyLgorCQkgKiBJdCB1c2VzIHRoZSBjdXJyZW50IGN5Y2xlIG51bWJlciBzaW5jZSB3ZSdyZSBub3cgb24gdGhlCisJCSAqIHNhbWUgY3ljbGUgYXMgdGhlIGhlYWQgc28gdGhhdCB3ZSBnZXQ6CisJCSAqICAgIG4gLi4uIG4gLi4uIHwgbiAtIDEgLi4uCisJCSAqICAgIF5eXl5eIGJsb2NrcyB3ZSdyZSB3cml0aW5nCisJCSAqLworCQlkaXN0YW5jZSA9IG1heF9kaXN0YW5jZSAtIChsb2ctPmxfbG9nQkJzaXplIC0gaGVhZF9ibG9jayk7CisJCWVycm9yID0geGxvZ193cml0ZV9sb2dfcmVjb3Jkcyhsb2csIGhlYWRfY3ljbGUsIDAsIGRpc3RhbmNlLAorCQkJCXRhaWxfY3ljbGUsIHRhaWxfYmxvY2spOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkJTG9nIHJlY292ZXIgcm91dGluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworU1RBVElDIHhsb2dfcmVjb3Zlcl90ICoKK3hsb2dfcmVjb3Zlcl9maW5kX3RpZCgKKwl4bG9nX3JlY292ZXJfdAkJKnEsCisJeGxvZ190aWRfdAkJdGlkKQoreworCXhsb2dfcmVjb3Zlcl90CQkqcCA9IHE7CisKKwl3aGlsZSAocCAhPSBOVUxMKSB7CisJCWlmIChwLT5yX2xvZ190aWQgPT0gdGlkKQorCQkgICAgYnJlYWs7CisJCXAgPSBwLT5yX25leHQ7CisJfQorCXJldHVybiBwOworfQorCitTVEFUSUMgdm9pZAoreGxvZ19yZWNvdmVyX3B1dF9oYXNocSgKKwl4bG9nX3JlY292ZXJfdAkJKipxLAorCXhsb2dfcmVjb3Zlcl90CQkqdHJhbnMpCit7CisJdHJhbnMtPnJfbmV4dCA9ICpxOworCSpxID0gdHJhbnM7Cit9CisKK1NUQVRJQyB2b2lkCit4bG9nX3JlY292ZXJfYWRkX2l0ZW0oCisJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqKml0ZW1xKQoreworCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW07CisKKwlpdGVtID0ga21lbV96YWxsb2Moc2l6ZW9mKHhsb2dfcmVjb3Zlcl9pdGVtX3QpLCBLTV9TTEVFUCk7CisJeGxvZ19yZWNvdmVyX2luc2VydF9pdGVtX2JhY2txKGl0ZW1xLCBpdGVtKTsKK30KKworU1RBVElDIGludAoreGxvZ19yZWNvdmVyX2FkZF90b19jb250X3RyYW5zKAorCXhsb2dfcmVjb3Zlcl90CQkqdHJhbnMsCisJeGZzX2NhZGRyX3QJCWRwLAorCWludAkJCWxlbikKK3sKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtOworCXhmc19jYWRkcl90CQlwdHIsIG9sZF9wdHI7CisJaW50CQkJb2xkX2xlbjsKKworCWl0ZW0gPSB0cmFucy0+cl9pdGVtcTsKKwlpZiAoaXRlbSA9PSAwKSB7CisJCS8qIGZpbmlzaCBjb3B5aW5nIHJlc3Qgb2YgdHJhbnMgaGVhZGVyICovCisJCXhsb2dfcmVjb3Zlcl9hZGRfaXRlbSgmdHJhbnMtPnJfaXRlbXEpOworCQlwdHIgPSAoeGZzX2NhZGRyX3QpICZ0cmFucy0+cl90aGVhZGVyICsKKwkJCQlzaXplb2YoeGZzX3RyYW5zX2hlYWRlcl90KSAtIGxlbjsKKwkJbWVtY3B5KHB0ciwgZHAsIGxlbik7IC8qIGQsIHMsIGwgKi8KKwkJcmV0dXJuIDA7CisJfQorCWl0ZW0gPSBpdGVtLT5yaV9wcmV2OworCisJb2xkX3B0ciA9IGl0ZW0tPnJpX2J1ZltpdGVtLT5yaV9jbnQtMV0uaV9hZGRyOworCW9sZF9sZW4gPSBpdGVtLT5yaV9idWZbaXRlbS0+cmlfY250LTFdLmlfbGVuOworCisJcHRyID0ga21lbV9yZWFsbG9jKG9sZF9wdHIsIGxlbitvbGRfbGVuLCBvbGRfbGVuLCAwKTsKKwltZW1jcHkoJnB0cltvbGRfbGVuXSwgZHAsIGxlbik7IC8qIGQsIHMsIGwgKi8KKwlpdGVtLT5yaV9idWZbaXRlbS0+cmlfY250LTFdLmlfbGVuICs9IGxlbjsKKwlpdGVtLT5yaV9idWZbaXRlbS0+cmlfY250LTFdLmlfYWRkciA9IHB0cjsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSBuZXh0IHJlZ2lvbiB0byBhZGQgaXMgdGhlIHN0YXJ0IG9mIGEgbmV3IHJlZ2lvbi4gIEl0IGNvdWxkIGJlCisgKiBhIHdob2xlIHJlZ2lvbiBvciBpdCBjb3VsZCBiZSB0aGUgZmlyc3QgcGFydCBvZiBhIG5ldyByZWdpb24uICBCZWNhdXNlCisgKiBvZiB0aGlzLCB0aGUgYXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgdGhlIHR5cGUgYW5kIHNpemUgZmllbGRzIG9mIGFsbAorICogZm9ybWF0IHN0cnVjdHVyZXMgZml0IGludG8gdGhlIGZpcnN0IDMyIGJpdHMgb2YgdGhlIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIHdvcmtzIGJlY2F1c2UgYWxsIHJlZ2lvbnMgbXVzdCBiZSAzMiBiaXQgYWxpZ25lZC4gIFRoZXJlZm9yZSwgd2UKKyAqIGVpdGhlciBoYXZlIGJvdGggZmllbGRzIG9yIHdlIGhhdmUgbmVpdGhlciBmaWVsZC4gIEluIHRoZSBjYXNlIHdlIGhhdmUKKyAqIG5laXRoZXIgZmllbGQsIHRoZSBkYXRhIHBhcnQgb2YgdGhlIHJlZ2lvbiBpcyB6ZXJvIGxlbmd0aC4gIFdlIG9ubHkgaGF2ZQorICogYSBsb2dfb3BfaGVhZGVyIGFuZCBjYW4gdGhyb3cgYXdheSB0aGUgaGVhZGVyIHNpbmNlIGEgbmV3IG9uZSB3aWxsIGFwcGVhcgorICogbGF0ZXIuICBJZiB3ZSBoYXZlIGF0IGxlYXN0IDQgYnl0ZXMsIHRoZW4gd2UgY2FuIGRldGVybWluZSBob3cgbWFueSByZWdpb25zCisgKiB3aWxsIGFwcGVhciBpbiB0aGUgY3VycmVudCBsb2cgaXRlbS4KKyAqLworU1RBVElDIGludAoreGxvZ19yZWNvdmVyX2FkZF90b190cmFucygKKwl4bG9nX3JlY292ZXJfdAkJKnRyYW5zLAorCXhmc19jYWRkcl90CQlkcCwKKwlpbnQJCQlsZW4pCit7CisJeGZzX2lub2RlX2xvZ19mb3JtYXRfdAkqaW5fZjsJCQkvKiBhbnkgd2lsbCBkbyAqLworCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW07CisJeGZzX2NhZGRyX3QJCXB0cjsKKworCWlmICghbGVuKQorCQlyZXR1cm4gMDsKKwlpdGVtID0gdHJhbnMtPnJfaXRlbXE7CisJaWYgKGl0ZW0gPT0gMCkgeworCQlBU1NFUlQoKih1aW50ICopZHAgPT0gWEZTX1RSQU5TX0hFQURFUl9NQUdJQyk7CisJCWlmIChsZW4gPT0gc2l6ZW9mKHhmc190cmFuc19oZWFkZXJfdCkpCisJCQl4bG9nX3JlY292ZXJfYWRkX2l0ZW0oJnRyYW5zLT5yX2l0ZW1xKTsKKwkJbWVtY3B5KCZ0cmFucy0+cl90aGVhZGVyLCBkcCwgbGVuKTsgLyogZCwgcywgbCAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlwdHIgPSBrbWVtX2FsbG9jKGxlbiwgS01fU0xFRVApOworCW1lbWNweShwdHIsIGRwLCBsZW4pOworCWluX2YgPSAoeGZzX2lub2RlX2xvZ19mb3JtYXRfdCAqKXB0cjsKKworCWlmIChpdGVtLT5yaV9wcmV2LT5yaV90b3RhbCAhPSAwICYmCisJICAgICBpdGVtLT5yaV9wcmV2LT5yaV90b3RhbCA9PSBpdGVtLT5yaV9wcmV2LT5yaV9jbnQpIHsKKwkJeGxvZ19yZWNvdmVyX2FkZF9pdGVtKCZ0cmFucy0+cl9pdGVtcSk7CisJfQorCWl0ZW0gPSB0cmFucy0+cl9pdGVtcTsKKwlpdGVtID0gaXRlbS0+cmlfcHJldjsKKworCWlmIChpdGVtLT5yaV90b3RhbCA9PSAwKSB7CQkvKiBmaXJzdCByZWdpb24gdG8gYmUgYWRkZWQgKi8KKwkJaXRlbS0+cmlfdG90YWwJPSBpbl9mLT5pbGZfc2l6ZTsKKwkJQVNTRVJUKGl0ZW0tPnJpX3RvdGFsIDw9IFhMT0dfTUFYX1JFR0lPTlNfSU5fSVRFTSk7CisJCWl0ZW0tPnJpX2J1ZiA9IGttZW1femFsbG9jKChpdGVtLT5yaV90b3RhbCAqCisJCQkJCSAgICBzaXplb2YoeGZzX2xvZ19pb3ZlY190KSksIEtNX1NMRUVQKTsKKwl9CisJQVNTRVJUKGl0ZW0tPnJpX3RvdGFsID4gaXRlbS0+cmlfY250KTsKKwkvKiBEZXNjcmlwdGlvbiByZWdpb24gaXMgcmlfYnVmWzBdICovCisJaXRlbS0+cmlfYnVmW2l0ZW0tPnJpX2NudF0uaV9hZGRyID0gcHRyOworCWl0ZW0tPnJpX2J1ZltpdGVtLT5yaV9jbnRdLmlfbGVuICA9IGxlbjsKKwlpdGVtLT5yaV9jbnQrKzsKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIHZvaWQKK3hsb2dfcmVjb3Zlcl9uZXdfdGlkKAorCXhsb2dfcmVjb3Zlcl90CQkqKnEsCisJeGxvZ190aWRfdAkJdGlkLAorCXhmc19sc25fdAkJbHNuKQoreworCXhsb2dfcmVjb3Zlcl90CQkqdHJhbnM7CisKKwl0cmFucyA9IGttZW1femFsbG9jKHNpemVvZih4bG9nX3JlY292ZXJfdCksIEtNX1NMRUVQKTsKKwl0cmFucy0+cl9sb2dfdGlkICAgPSB0aWQ7CisJdHJhbnMtPnJfbHNuCSAgID0gbHNuOworCXhsb2dfcmVjb3Zlcl9wdXRfaGFzaHEocSwgdHJhbnMpOworfQorCitTVEFUSUMgaW50Cit4bG9nX3JlY292ZXJfdW5saW5rX3RpZCgKKwl4bG9nX3JlY292ZXJfdAkJKipxLAorCXhsb2dfcmVjb3Zlcl90CQkqdHJhbnMpCit7CisJeGxvZ19yZWNvdmVyX3QJCSp0cDsKKwlpbnQJCQlmb3VuZCA9IDA7CisKKwlBU1NFUlQodHJhbnMgIT0gMCk7CisJaWYgKHRyYW5zID09ICpxKSB7CisJCSpxID0gKCpxKS0+cl9uZXh0OworCX0gZWxzZSB7CisJCXRwID0gKnE7CisJCXdoaWxlICh0cCAhPSAwKSB7CisJCQlpZiAodHAtPnJfbmV4dCA9PSB0cmFucykgeworCQkJCWZvdW5kID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXRwID0gdHAtPnJfbmV4dDsKKwkJfQorCQlpZiAoIWZvdW5kKSB7CisJCQl4bG9nX3dhcm4oCisJCQkgICAgICJYRlM6IHhsb2dfcmVjb3Zlcl91bmxpbmtfdGlkOiB0cmFucyBub3QgZm91bmQiKTsKKwkJCUFTU0VSVCgwKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwkJfQorCQl0cC0+cl9uZXh0ID0gdHAtPnJfbmV4dC0+cl9uZXh0OworCX0KKwlyZXR1cm4gMDsKK30KKworU1RBVElDIHZvaWQKK3hsb2dfcmVjb3Zlcl9pbnNlcnRfaXRlbV9iYWNrcSgKKwl4bG9nX3JlY292ZXJfaXRlbV90CSoqcSwKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtKQoreworCWlmICgqcSA9PSAwKSB7CisJCWl0ZW0tPnJpX3ByZXYgPSBpdGVtLT5yaV9uZXh0ID0gaXRlbTsKKwkJKnEgPSBpdGVtOworCX0gZWxzZSB7CisJCWl0ZW0tPnJpX25leHQJCT0gKnE7CisJCWl0ZW0tPnJpX3ByZXYJCT0gKCpxKS0+cmlfcHJldjsKKwkJKCpxKS0+cmlfcHJldgkJPSBpdGVtOworCQlpdGVtLT5yaV9wcmV2LT5yaV9uZXh0CT0gaXRlbTsKKwl9Cit9CisKK1NUQVRJQyB2b2lkCit4bG9nX3JlY292ZXJfaW5zZXJ0X2l0ZW1fZnJvbnRxKAorCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKipxLAorCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW0pCit7CisJeGxvZ19yZWNvdmVyX2luc2VydF9pdGVtX2JhY2txKHEsIGl0ZW0pOworCSpxID0gaXRlbTsKK30KKworU1RBVElDIGludAoreGxvZ19yZWNvdmVyX3Jlb3JkZXJfdHJhbnMoCisJeGxvZ190CQkJKmxvZywKKwl4bG9nX3JlY292ZXJfdAkJKnRyYW5zKQoreworCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKmZpcnN0X2l0ZW0sICppdGVtcSwgKml0ZW1xX25leHQ7CisJeGZzX2J1Zl9sb2dfZm9ybWF0X3QJKmJ1Zl9mOworCXhmc19idWZfbG9nX2Zvcm1hdF92MV90CSpvYnVmX2Y7CisJdXNob3J0CQkJZmxhZ3MgPSAwOworCisJZmlyc3RfaXRlbSA9IGl0ZW1xID0gdHJhbnMtPnJfaXRlbXE7CisJdHJhbnMtPnJfaXRlbXEgPSBOVUxMOworCWRvIHsKKwkJaXRlbXFfbmV4dCA9IGl0ZW1xLT5yaV9uZXh0OworCQlidWZfZiA9ICh4ZnNfYnVmX2xvZ19mb3JtYXRfdCAqKWl0ZW1xLT5yaV9idWZbMF0uaV9hZGRyOworCQlzd2l0Y2ggKElURU1fVFlQRShpdGVtcSkpIHsKKwkJY2FzZSBYRlNfTElfQlVGOgorCQkJZmxhZ3MgPSBidWZfZi0+YmxmX2ZsYWdzOworCQkJYnJlYWs7CisJCWNhc2UgWEZTX0xJXzZfMV9CVUY6CisJCWNhc2UgWEZTX0xJXzVfM19CVUY6CisJCQlvYnVmX2YgPSAoeGZzX2J1Zl9sb2dfZm9ybWF0X3YxX3QqKWJ1Zl9mOworCQkJZmxhZ3MgPSBvYnVmX2YtPmJsZl9mbGFnczsKKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoIChJVEVNX1RZUEUoaXRlbXEpKSB7CisJCWNhc2UgWEZTX0xJX0JVRjoKKwkJY2FzZSBYRlNfTElfNl8xX0JVRjoKKwkJY2FzZSBYRlNfTElfNV8zX0JVRjoKKwkJCWlmICghKGZsYWdzICYgWEZTX0JMSV9DQU5DRUwpKSB7CisJCQkJeGxvZ19yZWNvdmVyX2luc2VydF9pdGVtX2Zyb250cSgmdHJhbnMtPnJfaXRlbXEsCisJCQkJCQkJCWl0ZW1xKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBYRlNfTElfSU5PREU6CisJCWNhc2UgWEZTX0xJXzZfMV9JTk9ERToKKwkJY2FzZSBYRlNfTElfNV8zX0lOT0RFOgorCQljYXNlIFhGU19MSV9EUVVPVDoKKwkJY2FzZSBYRlNfTElfUVVPVEFPRkY6CisJCWNhc2UgWEZTX0xJX0VGRDoKKwkJY2FzZSBYRlNfTElfRUZJOgorCQkJeGxvZ19yZWNvdmVyX2luc2VydF9pdGVtX2JhY2txKCZ0cmFucy0+cl9pdGVtcSwgaXRlbXEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl4bG9nX3dhcm4oCisJIlhGUzogeGxvZ19yZWNvdmVyX3Jlb3JkZXJfdHJhbnM6IHVucmVjb2duaXplZCB0eXBlIG9mIGxvZyBvcGVyYXRpb24iKTsKKwkJCUFTU0VSVCgwKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwkJfQorCQlpdGVtcSA9IGl0ZW1xX25leHQ7CisJfSB3aGlsZSAoZmlyc3RfaXRlbSAhPSBpdGVtcSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBCdWlsZCB1cCB0aGUgdGFibGUgb2YgYnVmIGNhbmNlbCByZWNvcmRzIHNvIHRoYXQgd2UgZG9uJ3QgcmVwbGF5CisgKiBjYW5jZWxsZWQgZGF0YSBpbiB0aGUgc2Vjb25kIHBhc3MuICBGb3IgYnVmZmVyIHJlY29yZHMgdGhhdCBhcmUKKyAqIG5vdCBjYW5jZWwgcmVjb3JkcywgdGhlcmUgaXMgbm90aGluZyB0byBkbyBoZXJlIHNvIHdlIGp1c3QgcmV0dXJuLgorICoKKyAqIElmIHdlIGdldCBhIGNhbmNlbCByZWNvcmQgd2hpY2ggaXMgYWxyZWFkeSBpbiB0aGUgdGFibGUsIHRoaXMgaW5kaWNhdGVzCisgKiB0aGF0IHRoZSBidWZmZXIgd2FzIGNhbmNlbGxlZCBtdWx0aXBsZSB0aW1lcy4gIEluIG9yZGVyIHRvIGVuc3VyZQorICogdGhhdCBkdXJpbmcgcGFzcyAyIHdlIGtlZXAgdGhlIHJlY29yZCBpbiB0aGUgdGFibGUgdW50aWwgd2UgcmVhY2ggaXRzCisgKiBsYXN0IG9jY3VycmVuY2UgaW4gdGhlIGxvZywgd2Uga2VlcCBhIHJlZmVyZW5jZSBjb3VudCBpbiB0aGUgY2FuY2VsCisgKiByZWNvcmQgaW4gdGhlIHRhYmxlIHRvIHRlbGwgdXMgaG93IG1hbnkgdGltZXMgd2UgZXhwZWN0IHRvIHNlZSB0aGlzCisgKiByZWNvcmQgZHVyaW5nIHRoZSBzZWNvbmQgcGFzcy4KKyAqLworU1RBVElDIHZvaWQKK3hsb2dfcmVjb3Zlcl9kb19idWZmZXJfcGFzczEoCisJeGxvZ190CQkJKmxvZywKKwl4ZnNfYnVmX2xvZ19mb3JtYXRfdAkqYnVmX2YpCit7CisJeGZzX2J1Zl9jYW5jZWxfdAkqYmNwOworCXhmc19idWZfY2FuY2VsX3QJKm5leHRwOworCXhmc19idWZfY2FuY2VsX3QJKnByZXZwOworCXhmc19idWZfY2FuY2VsX3QJKipidWNrZXQ7CisJeGZzX2J1Zl9sb2dfZm9ybWF0X3YxX3QJKm9idWZfZjsKKwl4ZnNfZGFkZHJfdAkJYmxrbm8gPSAwOworCXVpbnQJCQlsZW4gPSAwOworCXVzaG9ydAkJCWZsYWdzID0gMDsKKworCXN3aXRjaCAoYnVmX2YtPmJsZl90eXBlKSB7CisJY2FzZSBYRlNfTElfQlVGOgorCQlibGtubyA9IGJ1Zl9mLT5ibGZfYmxrbm87CisJCWxlbiA9IGJ1Zl9mLT5ibGZfbGVuOworCQlmbGFncyA9IGJ1Zl9mLT5ibGZfZmxhZ3M7CisJCWJyZWFrOworCWNhc2UgWEZTX0xJXzZfMV9CVUY6CisJY2FzZSBYRlNfTElfNV8zX0JVRjoKKwkJb2J1Zl9mID0gKHhmc19idWZfbG9nX2Zvcm1hdF92MV90KilidWZfZjsKKwkJYmxrbm8gPSAoeGZzX2RhZGRyX3QpIG9idWZfZi0+YmxmX2Jsa25vOworCQlsZW4gPSBvYnVmX2YtPmJsZl9sZW47CisJCWZsYWdzID0gb2J1Zl9mLT5ibGZfZmxhZ3M7CisJCWJyZWFrOworCX0KKworCS8qCisJICogSWYgdGhpcyBpc24ndCBhIGNhbmNlbCBidWZmZXIgaXRlbSwgdGhlbiBqdXN0IHJldHVybi4KKwkgKi8KKwlpZiAoIShmbGFncyAmIFhGU19CTElfQ0FOQ0VMKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJbnNlcnQgYW4geGZzX2J1Zl9jYW5jZWwgcmVjb3JkIGludG8gdGhlIGhhc2ggdGFibGUgb2YKKwkgKiB0aGVtLiAgSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBpZGVudGljYWwgcmVjb3JkLCBidW1wCisJICogaXRzIHJlZmVyZW5jZSBjb3VudC4KKwkgKi8KKwlidWNrZXQgPSAmbG9nLT5sX2J1Zl9jYW5jZWxfdGFibGVbKF9fdWludDY0X3QpYmxrbm8gJQorCQkJCQkgIFhMT0dfQkNfVEFCTEVfU0laRV07CisJLyoKKwkgKiBJZiB0aGUgaGFzaCBidWNrZXQgaXMgZW1wdHkgdGhlbiBqdXN0IGluc2VydCBhIG5ldyByZWNvcmQgaW50bworCSAqIHRoZSBidWNrZXQuCisJICovCisJaWYgKCpidWNrZXQgPT0gTlVMTCkgeworCQliY3AgPSAoeGZzX2J1Zl9jYW5jZWxfdCAqKWttZW1fYWxsb2Moc2l6ZW9mKHhmc19idWZfY2FuY2VsX3QpLAorCQkJCQkJICAgICBLTV9TTEVFUCk7CisJCWJjcC0+YmNfYmxrbm8gPSBibGtubzsKKwkJYmNwLT5iY19sZW4gPSBsZW47CisJCWJjcC0+YmNfcmVmY291bnQgPSAxOworCQliY3AtPmJjX25leHQgPSBOVUxMOworCQkqYnVja2V0ID0gYmNwOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBUaGUgaGFzaCBidWNrZXQgaXMgbm90IGVtcHR5LCBzbyBzZWFyY2ggZm9yIGR1cGxpY2F0ZXMgb2Ygb3VyCisJICogcmVjb3JkLiAgSWYgd2UgZmluZCBvbmUgdGhlbSBqdXN0IGJ1bXAgaXRzIHJlZmNvdW50LiAgSWYgbm90CisJICogdGhlbiBhZGQgdXMgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KKwkgKi8KKwlwcmV2cCA9IE5VTEw7CisJbmV4dHAgPSAqYnVja2V0OworCXdoaWxlIChuZXh0cCAhPSBOVUxMKSB7CisJCWlmIChuZXh0cC0+YmNfYmxrbm8gPT0gYmxrbm8gJiYgbmV4dHAtPmJjX2xlbiA9PSBsZW4pIHsKKwkJCW5leHRwLT5iY19yZWZjb3VudCsrOworCQkJcmV0dXJuOworCQl9CisJCXByZXZwID0gbmV4dHA7CisJCW5leHRwID0gbmV4dHAtPmJjX25leHQ7CisJfQorCUFTU0VSVChwcmV2cCAhPSBOVUxMKTsKKwliY3AgPSAoeGZzX2J1Zl9jYW5jZWxfdCAqKWttZW1fYWxsb2Moc2l6ZW9mKHhmc19idWZfY2FuY2VsX3QpLAorCQkJCQkgICAgIEtNX1NMRUVQKTsKKwliY3AtPmJjX2Jsa25vID0gYmxrbm87CisJYmNwLT5iY19sZW4gPSBsZW47CisJYmNwLT5iY19yZWZjb3VudCA9IDE7CisJYmNwLT5iY19uZXh0ID0gTlVMTDsKKwlwcmV2cC0+YmNfbmV4dCA9IGJjcDsKK30KKworLyoKKyAqIENoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSBidWZmZXIgYmVpbmcgcmVjb3ZlcmVkIGhhcyBhIGNvcnJlc3BvbmRpbmcKKyAqIGVudHJ5IGluIHRoZSBidWZmZXIgY2FuY2VsIHJlY29yZCB0YWJsZS4gIElmIGl0IGRvZXMgdGhlbiByZXR1cm4gMQorICogc28gdGhhdCBpdCB3aWxsIGJlIGNhbmNlbGxlZCwgb3RoZXJ3aXNlIHJldHVybiAwLiAgSWYgdGhlIGJ1ZmZlciBpcworICogYWN0dWFsbHkgYSBidWZmZXIgY2FuY2VsIGl0ZW0gKFhGU19CTElfQ0FOQ0VMIGlzIHNldCksIHRoZW4gZGVjcmVtZW50CisgKiB0aGUgcmVmY291bnQgb24gdGhlIGVudHJ5IGluIHRoZSB0YWJsZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIHRhYmxlCisgKiBpZiB0aGlzIGlzIHRoZSBsYXN0IHJlZmVyZW5jZS4KKyAqCisgKiBXZSByZW1vdmUgdGhlIGNhbmNlbCByZWNvcmQgZnJvbSB0aGUgdGFibGUgd2hlbiB3ZSBlbmNvdW50ZXIgaXRzCisgKiBsYXN0IG9jY3VycmVuY2UgaW4gdGhlIGxvZyBzbyB0aGF0IGlmIHRoZSBzYW1lIGJ1ZmZlciBpcyByZS11c2VkCisgKiBhZ2FpbiBhZnRlciBpdHMgbGFzdCBjYW5jZWxsYXRpb24gd2UgYWN0dWFsbHkgcmVwbGF5IHRoZSBjaGFuZ2VzCisgKiBtYWRlIGF0IHRoYXQgcG9pbnQuCisgKi8KK1NUQVRJQyBpbnQKK3hsb2dfY2hlY2tfYnVmZmVyX2NhbmNlbGxlZCgKKwl4bG9nX3QJCQkqbG9nLAorCXhmc19kYWRkcl90CQlibGtubywKKwl1aW50CQkJbGVuLAorCXVzaG9ydAkJCWZsYWdzKQoreworCXhmc19idWZfY2FuY2VsX3QJKmJjcDsKKwl4ZnNfYnVmX2NhbmNlbF90CSpwcmV2cDsKKwl4ZnNfYnVmX2NhbmNlbF90CSoqYnVja2V0OworCisJaWYgKGxvZy0+bF9idWZfY2FuY2VsX3RhYmxlID09IE5VTEwpIHsKKwkJLyoKKwkJICogVGhlcmUgaXMgbm90aGluZyBpbiB0aGUgdGFibGUgYnVpbHQgaW4gcGFzcyBvbmUsCisJCSAqIHNvIHRoaXMgYnVmZmVyIG11c3Qgbm90IGJlIGNhbmNlbGxlZC4KKwkJICovCisJCUFTU0VSVCghKGZsYWdzICYgWEZTX0JMSV9DQU5DRUwpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYnVja2V0ID0gJmxvZy0+bF9idWZfY2FuY2VsX3RhYmxlWyhfX3VpbnQ2NF90KWJsa25vICUKKwkJCQkJICBYTE9HX0JDX1RBQkxFX1NJWkVdOworCWJjcCA9ICpidWNrZXQ7CisJaWYgKGJjcCA9PSBOVUxMKSB7CisJCS8qCisJCSAqIFRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIHRhYmxlIGJ1aWx0CisJCSAqIGluIHBhc3Mgb25lLCBzbyB0aGlzIGJ1ZmZlciBoYXMgbm90IGJlZW4gY2FuY2VsbGVkLgorCQkgKi8KKwkJQVNTRVJUKCEoZmxhZ3MgJiBYRlNfQkxJX0NBTkNFTCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFNlYXJjaCBmb3IgYW4gZW50cnkgaW4gdGhlIGJ1ZmZlciBjYW5jZWwgdGFibGUgdGhhdAorCSAqIG1hdGNoZXMgb3VyIGJ1ZmZlci4KKwkgKi8KKwlwcmV2cCA9IE5VTEw7CisJd2hpbGUgKGJjcCAhPSBOVUxMKSB7CisJCWlmIChiY3AtPmJjX2Jsa25vID09IGJsa25vICYmIGJjcC0+YmNfbGVuID09IGxlbikgeworCQkJLyoKKwkJCSAqIFdlJ3ZlIGdvIGEgbWF0Y2gsIHNvIHJldHVybiAxIHNvIHRoYXQgdGhlCisJCQkgKiByZWNvdmVyeSBvZiB0aGlzIGJ1ZmZlciBpcyBjYW5jZWxsZWQuCisJCQkgKiBJZiB0aGlzIGJ1ZmZlciBpcyBhY3R1YWxseSBhIGJ1ZmZlciBjYW5jZWwKKwkJCSAqIGxvZyBpdGVtLCB0aGVuIGRlY3JlbWVudCB0aGUgcmVmY291bnQgb24gdGhlCisJCQkgKiBvbmUgaW4gdGhlIHRhYmxlIGFuZCByZW1vdmUgaXQgaWYgdGhpcyBpcyB0aGUKKwkJCSAqIGxhc3QgcmVmZXJlbmNlLgorCQkJICovCisJCQlpZiAoZmxhZ3MgJiBYRlNfQkxJX0NBTkNFTCkgeworCQkJCWJjcC0+YmNfcmVmY291bnQtLTsKKwkJCQlpZiAoYmNwLT5iY19yZWZjb3VudCA9PSAwKSB7CisJCQkJCWlmIChwcmV2cCA9PSBOVUxMKSB7CisJCQkJCQkqYnVja2V0ID0gYmNwLT5iY19uZXh0OworCQkJCQl9IGVsc2UgeworCQkJCQkJcHJldnAtPmJjX25leHQgPSBiY3AtPmJjX25leHQ7CisJCQkJCX0KKwkJCQkJa21lbV9mcmVlKGJjcCwKKwkJCQkJCSAgc2l6ZW9mKHhmc19idWZfY2FuY2VsX3QpKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gMTsKKwkJfQorCQlwcmV2cCA9IGJjcDsKKwkJYmNwID0gYmNwLT5iY19uZXh0OworCX0KKwkvKgorCSAqIFdlIGRpZG4ndCBmaW5kIGEgY29ycmVzcG9uZGluZyBlbnRyeSBpbiB0aGUgdGFibGUsIHNvCisJICogcmV0dXJuIDAgc28gdGhhdCB0aGUgYnVmZmVyIGlzIE5PVCBjYW5jZWxsZWQuCisJICovCisJQVNTRVJUKCEoZmxhZ3MgJiBYRlNfQkxJX0NBTkNFTCkpOworCXJldHVybiAwOworfQorCitTVEFUSUMgaW50Cit4bG9nX3JlY292ZXJfZG9fYnVmZmVyX3Bhc3MyKAorCXhsb2dfdAkJCSpsb2csCisJeGZzX2J1Zl9sb2dfZm9ybWF0X3QJKmJ1Zl9mKQoreworCXhmc19idWZfbG9nX2Zvcm1hdF92MV90CSpvYnVmX2Y7CisJeGZzX2RhZGRyX3QJCWJsa25vID0gMDsKKwl1c2hvcnQJCQlmbGFncyA9IDA7CisJdWludAkJCWxlbiA9IDA7CisKKwlzd2l0Y2ggKGJ1Zl9mLT5ibGZfdHlwZSkgeworCWNhc2UgWEZTX0xJX0JVRjoKKwkJYmxrbm8gPSBidWZfZi0+YmxmX2Jsa25vOworCQlmbGFncyA9IGJ1Zl9mLT5ibGZfZmxhZ3M7CisJCWxlbiA9IGJ1Zl9mLT5ibGZfbGVuOworCQlicmVhazsKKwljYXNlIFhGU19MSV82XzFfQlVGOgorCWNhc2UgWEZTX0xJXzVfM19CVUY6CisJCW9idWZfZiA9ICh4ZnNfYnVmX2xvZ19mb3JtYXRfdjFfdCopYnVmX2Y7CisJCWJsa25vID0gKHhmc19kYWRkcl90KSBvYnVmX2YtPmJsZl9ibGtubzsKKwkJZmxhZ3MgPSBvYnVmX2YtPmJsZl9mbGFnczsKKwkJbGVuID0gKHhmc19kYWRkcl90KSBvYnVmX2YtPmJsZl9sZW47CisJCWJyZWFrOworCX0KKworCXJldHVybiB4bG9nX2NoZWNrX2J1ZmZlcl9jYW5jZWxsZWQobG9nLCBibGtubywgbGVuLCBmbGFncyk7Cit9CisKKy8qCisgKiBQZXJmb3JtIHJlY292ZXJ5IGZvciBhIGJ1ZmZlciBmdWxsIG9mIGlub2Rlcy4gIEluIHRoZXNlIGJ1ZmZlcnMsCisgKiB0aGUgb25seSBkYXRhIHdoaWNoIHNob3VsZCBiZSByZWNvdmVyZWQgaXMgdGhhdCB3aGljaCBjb3JyZXNwb25kcworICogdG8gdGhlIGRpX25leHRfdW5saW5rZWQgcG9pbnRlcnMgaW4gdGhlIG9uIGRpc2sgaW5vZGUgc3RydWN0dXJlcy4KKyAqIFRoZSByZXN0IG9mIHRoZSBkYXRhIGZvciB0aGUgaW5vZGVzIGlzIGFsd2F5cyBsb2dnZWQgdGhyb3VnaCB0aGUKKyAqIGlub2RlcyB0aGVtc2VsdmVzIHJhdGhlciB0aGFuIHRoZSBpbm9kZSBidWZmZXIgYW5kIGlzIHJlY292ZXJlZAorICogaW4geGxvZ19yZWNvdmVyX2RvX2lub2RlX3RyYW5zKCkuCisgKgorICogVGhlIG9ubHkgdGltZSB3aGVuIGJ1ZmZlcnMgZnVsbCBvZiBpbm9kZXMgYXJlIGZ1bGx5IHJlY292ZXJlZCBpcworICogd2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGwgb2YgbmV3bHkgYWxsb2NhdGVkIGlub2Rlcy4gIEluIHRoaXMgY2FzZQorICogdGhlIGJ1ZmZlciB3aWxsIG5vdCBiZSBtYXJrZWQgYXMgYW4gaW5vZGUgYnVmZmVyIGFuZCBzbyB3aWxsIGJlCisgKiBzZW50IHRvIHhsb2dfcmVjb3Zlcl9kb19yZWdfYnVmZmVyKCkgYmVsb3cgZHVyaW5nIHJlY292ZXJ5LgorICovCitTVEFUSUMgaW50Cit4bG9nX3JlY292ZXJfZG9faW5vZGVfYnVmZmVyKAorCXhmc19tb3VudF90CQkqbXAsCisJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSwKKwl4ZnNfYnVmX3QJCSpicCwKKwl4ZnNfYnVmX2xvZ19mb3JtYXRfdAkqYnVmX2YpCit7CisJaW50CQkJaTsKKwlpbnQJCQlpdGVtX2luZGV4OworCWludAkJCWJpdDsKKwlpbnQJCQluYml0czsKKwlpbnQJCQlyZWdfYnVmX29mZnNldDsKKwlpbnQJCQlyZWdfYnVmX2J5dGVzOworCWludAkJCW5leHRfdW5saW5rZWRfb2Zmc2V0OworCWludAkJCWlub2Rlc19wZXJfYnVmOworCXhmc19hZ2lub190CQkqbG9nZ2VkX25leHRwOworCXhmc19hZ2lub190CQkqYnVmZmVyX25leHRwOworCXhmc19idWZfbG9nX2Zvcm1hdF92MV90CSpvYnVmX2Y7CisJdW5zaWduZWQgaW50CQkqZGF0YV9tYXAgPSBOVUxMOworCXVuc2lnbmVkIGludAkJbWFwX3NpemUgPSAwOworCisJc3dpdGNoIChidWZfZi0+YmxmX3R5cGUpIHsKKwljYXNlIFhGU19MSV9CVUY6CisJCWRhdGFfbWFwID0gYnVmX2YtPmJsZl9kYXRhX21hcDsKKwkJbWFwX3NpemUgPSBidWZfZi0+YmxmX21hcF9zaXplOworCQlicmVhazsKKwljYXNlIFhGU19MSV82XzFfQlVGOgorCWNhc2UgWEZTX0xJXzVfM19CVUY6CisJCW9idWZfZiA9ICh4ZnNfYnVmX2xvZ19mb3JtYXRfdjFfdCopYnVmX2Y7CisJCWRhdGFfbWFwID0gb2J1Zl9mLT5ibGZfZGF0YV9tYXA7CisJCW1hcF9zaXplID0gb2J1Zl9mLT5ibGZfbWFwX3NpemU7CisJCWJyZWFrOworCX0KKwkvKgorCSAqIFNldCB0aGUgdmFyaWFibGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgcmVnaW9uIHRvCisJICogMCBzbyB0aGF0IHdlJ2xsIGluaXRpYWxpemUgdGhlbSBvbiB0aGUgZmlyc3QgcGFzcyB0aHJvdWdoCisJICogdGhlIGxvb3AuCisJICovCisJcmVnX2J1Zl9vZmZzZXQgPSAwOworCXJlZ19idWZfYnl0ZXMgPSAwOworCWJpdCA9IDA7CisJbmJpdHMgPSAwOworCWl0ZW1faW5kZXggPSAwOworCWlub2Rlc19wZXJfYnVmID0gWEZTX0JVRl9DT1VOVChicCkgPj4gbXAtPm1fc2Iuc2JfaW5vZGVsb2c7CisJZm9yIChpID0gMDsgaSA8IGlub2Rlc19wZXJfYnVmOyBpKyspIHsKKwkJbmV4dF91bmxpbmtlZF9vZmZzZXQgPSAoaSAqIG1wLT5tX3NiLnNiX2lub2Rlc2l6ZSkgKworCQkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV90LCBkaV9uZXh0X3VubGlua2VkKTsKKworCQl3aGlsZSAobmV4dF91bmxpbmtlZF9vZmZzZXQgPj0KKwkJICAgICAgIChyZWdfYnVmX29mZnNldCArIHJlZ19idWZfYnl0ZXMpKSB7CisJCQkvKgorCQkJICogVGhlIG5leHQgZGlfbmV4dF91bmxpbmtlZCBmaWVsZCBpcyBiZXlvbmQKKwkJCSAqIHRoZSBjdXJyZW50IGxvZ2dlZCByZWdpb24uICBGaW5kIHRoZSBuZXh0CisJCQkgKiBsb2dnZWQgcmVnaW9uIHRoYXQgY29udGFpbnMgb3IgaXMgYmV5b25kCisJCQkgKiB0aGUgY3VycmVudCBkaV9uZXh0X3VubGlua2VkIGZpZWxkLgorCQkJICovCisJCQliaXQgKz0gbmJpdHM7CisJCQliaXQgPSB4ZnNfbmV4dF9iaXQoZGF0YV9tYXAsIG1hcF9zaXplLCBiaXQpOworCisJCQkvKgorCQkJICogSWYgdGhlcmUgYXJlIG5vIG1vcmUgbG9nZ2VkIHJlZ2lvbnMgaW4gdGhlCisJCQkgKiBidWZmZXIsIHRoZW4gd2UncmUgZG9uZS4KKwkJCSAqLworCQkJaWYgKGJpdCA9PSAtMSkgeworCQkJCXJldHVybiAwOworCQkJfQorCisJCQluYml0cyA9IHhmc19jb250aWdfYml0cyhkYXRhX21hcCwgbWFwX3NpemUsCisJCQkJCQkJIGJpdCk7CisJCQlBU1NFUlQobmJpdHMgPiAwKTsKKwkJCXJlZ19idWZfb2Zmc2V0ID0gYml0IDw8IFhGU19CTElfU0hJRlQ7CisJCQlyZWdfYnVmX2J5dGVzID0gbmJpdHMgPDwgWEZTX0JMSV9TSElGVDsKKwkJCWl0ZW1faW5kZXgrKzsKKwkJfQorCisJCS8qCisJCSAqIElmIHRoZSBjdXJyZW50IGxvZ2dlZCByZWdpb24gc3RhcnRzIGFmdGVyIHRoZSBjdXJyZW50CisJCSAqIGRpX25leHRfdW5saW5rZWQgZmllbGQsIHRoZW4gbW92ZSBvbiB0byB0aGUgbmV4dAorCQkgKiBkaV9uZXh0X3VubGlua2VkIGZpZWxkLgorCQkgKi8KKwkJaWYgKG5leHRfdW5saW5rZWRfb2Zmc2V0IDwgcmVnX2J1Zl9vZmZzZXQpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJQVNTRVJUKGl0ZW0tPnJpX2J1ZltpdGVtX2luZGV4XS5pX2FkZHIgIT0gTlVMTCk7CisJCUFTU0VSVCgoaXRlbS0+cmlfYnVmW2l0ZW1faW5kZXhdLmlfbGVuICUgWEZTX0JMSV9DSFVOSykgPT0gMCk7CisJCUFTU0VSVCgocmVnX2J1Zl9vZmZzZXQgKyByZWdfYnVmX2J5dGVzKSA8PSBYRlNfQlVGX0NPVU5UKGJwKSk7CisKKwkJLyoKKwkJICogVGhlIGN1cnJlbnQgbG9nZ2VkIHJlZ2lvbiBjb250YWlucyBhIGNvcHkgb2YgdGhlCisJCSAqIGN1cnJlbnQgZGlfbmV4dF91bmxpbmtlZCBmaWVsZC4gIEV4dHJhY3QgaXRzIHZhbHVlCisJCSAqIGFuZCBjb3B5IGl0IHRvIHRoZSBidWZmZXIgY29weS4KKwkJICovCisJCWxvZ2dlZF9uZXh0cCA9ICh4ZnNfYWdpbm9fdCAqKQorCQkJICAgICAgICgoY2hhciAqKShpdGVtLT5yaV9idWZbaXRlbV9pbmRleF0uaV9hZGRyKSArCisJCQkJKG5leHRfdW5saW5rZWRfb2Zmc2V0IC0gcmVnX2J1Zl9vZmZzZXQpKTsKKwkJaWYgKHVubGlrZWx5KCpsb2dnZWRfbmV4dHAgPT0gMCkpIHsKKwkJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwKKwkJCQkiYmFkIGlub2RlIGJ1ZmZlciBsb2cgcmVjb3JkIChwdHIgPSAweCVwLCBicCA9IDB4JXApLiAgWEZTIHRyeWluZyB0byByZXBsYXkgYmFkICgwKSBpbm9kZSBkaV9uZXh0X3VubGlua2VkIGZpZWxkIiwKKwkJCQlpdGVtLCBicCk7CisJCQlYRlNfRVJST1JfUkVQT1JUKCJ4bG9nX3JlY292ZXJfZG9faW5vZGVfYnVmIiwKKwkJCQkJIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJfQorCisJCWJ1ZmZlcl9uZXh0cCA9ICh4ZnNfYWdpbm9fdCAqKXhmc19idWZfb2Zmc2V0KGJwLAorCQkJCQkgICAgICBuZXh0X3VubGlua2VkX29mZnNldCk7CisJCUlOVF9TRVQoKmJ1ZmZlcl9uZXh0cCwgQVJDSF9DT05WRVJULCAqbG9nZ2VkX25leHRwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBlcmZvcm0gYSAnbm9ybWFsJyBidWZmZXIgcmVjb3ZlcnkuICBFYWNoIGxvZ2dlZCByZWdpb24gb2YgdGhlCisgKiBidWZmZXIgc2hvdWxkIGJlIGNvcGllZCBvdmVyIHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lvbiBpbiB0aGUKKyAqIGdpdmVuIGJ1ZmZlci4gIFRoZSBiaXRtYXAgaW4gdGhlIGJ1ZiBsb2cgZm9ybWF0IHN0cnVjdHVyZSBpbmRpY2F0ZXMKKyAqIHdoZXJlIHRvIHBsYWNlIHRoZSBsb2dnZWQgZGF0YS4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgdm9pZAoreGxvZ19yZWNvdmVyX2RvX3JlZ19idWZmZXIoCisJeGZzX21vdW50X3QJCSptcCwKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtLAorCXhmc19idWZfdAkJKmJwLAorCXhmc19idWZfbG9nX2Zvcm1hdF90CSpidWZfZikKK3sKKwlpbnQJCQlpOworCWludAkJCWJpdDsKKwlpbnQJCQluYml0czsKKwl4ZnNfYnVmX2xvZ19mb3JtYXRfdjFfdAkqb2J1Zl9mOworCXVuc2lnbmVkIGludAkJKmRhdGFfbWFwID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQJCW1hcF9zaXplID0gMDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBlcnJvcjsKKworCXN3aXRjaCAoYnVmX2YtPmJsZl90eXBlKSB7CisJY2FzZSBYRlNfTElfQlVGOgorCQlkYXRhX21hcCA9IGJ1Zl9mLT5ibGZfZGF0YV9tYXA7CisJCW1hcF9zaXplID0gYnVmX2YtPmJsZl9tYXBfc2l6ZTsKKwkJYnJlYWs7CisJY2FzZSBYRlNfTElfNl8xX0JVRjoKKwljYXNlIFhGU19MSV81XzNfQlVGOgorCQlvYnVmX2YgPSAoeGZzX2J1Zl9sb2dfZm9ybWF0X3YxX3QqKWJ1Zl9mOworCQlkYXRhX21hcCA9IG9idWZfZi0+YmxmX2RhdGFfbWFwOworCQltYXBfc2l6ZSA9IG9idWZfZi0+YmxmX21hcF9zaXplOworCQlicmVhazsKKwl9CisJYml0ID0gMDsKKwlpID0gMTsgIC8qIDAgaXMgdGhlIGJ1ZiBmb3JtYXQgc3RydWN0dXJlICovCisJd2hpbGUgKDEpIHsKKwkJYml0ID0geGZzX25leHRfYml0KGRhdGFfbWFwLCBtYXBfc2l6ZSwgYml0KTsKKwkJaWYgKGJpdCA9PSAtMSkKKwkJCWJyZWFrOworCQluYml0cyA9IHhmc19jb250aWdfYml0cyhkYXRhX21hcCwgbWFwX3NpemUsIGJpdCk7CisJCUFTU0VSVChuYml0cyA+IDApOworCQlBU1NFUlQoaXRlbS0+cmlfYnVmW2ldLmlfYWRkciAhPSAwKTsKKwkJQVNTRVJUKGl0ZW0tPnJpX2J1ZltpXS5pX2xlbiAlIFhGU19CTElfQ0hVTksgPT0gMCk7CisJCUFTU0VSVChYRlNfQlVGX0NPVU5UKGJwKSA+PQorCQkgICAgICAgKCh1aW50KWJpdCA8PCBYRlNfQkxJX1NISUZUKSsobmJpdHM8PFhGU19CTElfU0hJRlQpKTsKKworCQkvKgorCQkgKiBEbyBhIHNhbml0eSBjaGVjayBpZiB0aGlzIGlzIGEgZHF1b3QgYnVmZmVyLiBKdXN0IGNoZWNraW5nCisJCSAqIHRoZSBmaXJzdCBkcXVvdCBpbiB0aGUgYnVmZmVyIHNob3VsZCBkby4gWFhYVGhpcyBpcworCQkgKiBwcm9iYWJseSBhIGdvb2QgdGhpbmcgdG8gZG8gZm9yIG90aGVyIGJ1ZiB0eXBlcyBhbHNvLgorCQkgKi8KKwkJZXJyb3IgPSAwOworCQlpZiAoYnVmX2YtPmJsZl9mbGFncyAmIChYRlNfQkxJX1VEUVVPVF9CVUZ8WEZTX0JMSV9HRFFVT1RfQlVGKSkgeworCQkJZXJyb3IgPSB4ZnNfcW1fZHFjaGVjaygoeGZzX2Rpc2tfZHF1b3RfdCAqKQorCQkJCQkgICAgICAgaXRlbS0+cmlfYnVmW2ldLmlfYWRkciwKKwkJCQkJICAgICAgIC0xLCAwLCBYRlNfUU1PUFRfRE9XQVJOLAorCQkJCQkgICAgICAgImRxdW90X2J1Zl9yZWNvdmVyIik7CisJCX0KKwkJaWYgKCFlcnJvcikKKwkJCW1lbWNweSh4ZnNfYnVmX29mZnNldChicCwKKwkJCQkodWludCliaXQgPDwgWEZTX0JMSV9TSElGVCksCS8qIGRlc3QgKi8KKwkJCQlpdGVtLT5yaV9idWZbaV0uaV9hZGRyLAkJLyogc291cmNlICovCisJCQkJbmJpdHM8PFhGU19CTElfU0hJRlQpOwkJLyogbGVuZ3RoICovCisJCWkrKzsKKwkJYml0ICs9IG5iaXRzOworCX0KKworCS8qIFNob3VsZG4ndCBiZSBhbnkgbW9yZSByZWdpb25zICovCisJQVNTRVJUKGkgPT0gaXRlbS0+cmlfdG90YWwpOworfQorCisvKgorICogRG8gc29tZSBwcmltaXRpdmUgZXJyb3IgY2hlY2tpbmcgb24gb25kaXNrIGRxdW90IGRhdGEgc3RydWN0dXJlcy4KKyAqLworaW50Cit4ZnNfcW1fZHFjaGVjaygKKwl4ZnNfZGlza19kcXVvdF90ICpkZHEsCisJeGZzX2RxaWRfdAkgaWQsCisJdWludAkJIHR5cGUsCSAgLyogdXNlZCBvbmx5IHdoZW4gSU9fZG9yZXBhaXIgaXMgdHJ1ZSAqLworCXVpbnQJCSBmbGFncywKKwljaGFyCQkgKnN0cikKK3sKKwl4ZnNfZHFibGtfdAkgKmQgPSAoeGZzX2RxYmxrX3QgKilkZHE7CisJaW50CQllcnJzID0gMDsKKworCS8qCisJICogV2UgY2FuIGVuY291bnRlciBhbiB1bmluaXRpYWxpemVkIGRxdW90IGJ1ZmZlciBmb3IgMiByZWFzb25zOgorCSAqIDEuIElmIHdlIGNyYXNoIHdoaWxlIGRlbGV0aW5nIHRoZSBxdW90YWlub2RlKHMpLCBhbmQgdGhvc2UgYmxrcyBnb3QKKwkgKiAgICB1c2VkIGZvciB1c2VyIGRhdGEuIFRoaXMgaXMgYmVjYXVzZSB3ZSB0YWtlIHRoZSBwYXRoIG9mIHJlZ3VsYXIKKwkgKiAgICBmaWxlIGRlbGV0aW9uOyBob3dldmVyLCB0aGUgc2l6ZSBmaWVsZCBvZiBxdW90YWlub2RlcyBpcyBuZXZlcgorCSAqICAgIHVwZGF0ZWQsIHNvIGFsbCB0aGUgdHJpY2tzIHRoYXQgd2UgcGxheSBpbiBpdHJ1bmNhdGVfZmluaXNoCisJICogICAgZG9uJ3QgcXVpdGUgbWF0dGVyLgorCSAqCisJICogMi4gV2UgZG9uJ3QgcGxheSB0aGUgcXVvdGEgYnVmZmVycyB3aGVuIHRoZXJlJ3MgYSBxdW90YW9mZiBsb2dpdGVtLgorCSAqICAgIEJ1dCB0aGUgYWxsb2NhdGlvbiB3aWxsIGJlIHJlcGxheWVkIHNvIHdlJ2xsIGVuZCB1cCB3aXRoIGFuCisJICogICAgdW5pbml0aWFsaXplZCBxdW90YSBibG9jay4KKwkgKgorCSAqIFRoaXMgaXMgYWxsIGZpbmU7IHRoaW5ncyBhcmUgc3RpbGwgY29uc2lzdGVudCwgYW5kIHdlIGhhdmVuJ3QgbG9zdAorCSAqIGFueSBxdW90YSBpbmZvcm1hdGlvbi4gSnVzdCBkb24ndCBjb21wbGFpbiBhYm91dCBiYWQgZHF1b3QgYmxrcy4KKwkgKi8KKwlpZiAoSU5UX0dFVChkZHEtPmRfbWFnaWMsIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RRVU9UX01BR0lDKSB7CisJCWlmIChmbGFncyAmIFhGU19RTU9QVF9ET1dBUk4pCisJCQljbW5fZXJyKENFX0FMRVJULAorCQkJIiVzIDogWEZTIGRxdW90IElEIDB4JXgsIG1hZ2ljIDB4JXggIT0gMHgleCIsCisJCQlzdHIsIGlkLAorCQkJSU5UX0dFVChkZHEtPmRfbWFnaWMsIEFSQ0hfQ09OVkVSVCksIFhGU19EUVVPVF9NQUdJQyk7CisJCWVycnMrKzsKKwl9CisJaWYgKElOVF9HRVQoZGRxLT5kX3ZlcnNpb24sIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RRVU9UX1ZFUlNJT04pIHsKKwkJaWYgKGZsYWdzICYgWEZTX1FNT1BUX0RPV0FSTikKKwkJCWNtbl9lcnIoQ0VfQUxFUlQsCisJCQkiJXMgOiBYRlMgZHF1b3QgSUQgMHgleCwgdmVyc2lvbiAweCV4ICE9IDB4JXgiLAorCQkJc3RyLCBpZCwKKwkJCUlOVF9HRVQoZGRxLT5kX21hZ2ljLCBBUkNIX0NPTlZFUlQpLCBYRlNfRFFVT1RfVkVSU0lPTik7CisJCWVycnMrKzsKKwl9CisKKwlpZiAoSU5UX0dFVChkZHEtPmRfZmxhZ3MsIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RRX1VTRVIgJiYKKwkgICAgSU5UX0dFVChkZHEtPmRfZmxhZ3MsIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RRX0dST1VQKSB7CisJCWlmIChmbGFncyAmIFhGU19RTU9QVF9ET1dBUk4pCisJCQljbW5fZXJyKENFX0FMRVJULAorCQkJIiVzIDogWEZTIGRxdW90IElEIDB4JXgsIHVua25vd24gZmxhZ3MgMHgleCIsCisJCQlzdHIsIGlkLCBJTlRfR0VUKGRkcS0+ZF9mbGFncywgQVJDSF9DT05WRVJUKSk7CisJCWVycnMrKzsKKwl9CisKKwlpZiAoaWQgIT0gLTEgJiYgaWQgIT0gSU5UX0dFVChkZHEtPmRfaWQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJaWYgKGZsYWdzICYgWEZTX1FNT1BUX0RPV0FSTikKKwkJCWNtbl9lcnIoQ0VfQUxFUlQsCisJCQkiJXMgOiBvbmRpc2stZHF1b3QgMHglcCwgSUQgbWlzbWF0Y2g6ICIKKwkJCSIweCV4IGV4cGVjdGVkLCBmb3VuZCBpZCAweCV4IiwKKwkJCXN0ciwgZGRxLCBpZCwgSU5UX0dFVChkZHEtPmRfaWQsIEFSQ0hfQ09OVkVSVCkpOworCQllcnJzKys7CisJfQorCisJaWYgKCFlcnJzICYmIGRkcS0+ZF9pZCkgeworCQlpZiAoSU5UX0dFVChkZHEtPmRfYmxrX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSAmJgorCQkgICAgSU5UX0dFVChkZHEtPmRfYmNvdW50LCBBUkNIX0NPTlZFUlQpID49CisJCQkJSU5UX0dFVChkZHEtPmRfYmxrX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSkgeworCQkJaWYgKCFkZHEtPmRfYnRpbWVyKSB7CisJCQkJaWYgKGZsYWdzICYgWEZTX1FNT1BUX0RPV0FSTikKKwkJCQkJY21uX2VycihDRV9BTEVSVCwKKwkJCQkJIiVzIDogRHF1b3QgSUQgMHgleCAoMHglcCkgIgorCQkJCQkiQkxLIFRJTUVSIE5PVCBTVEFSVEVEIiwKKwkJCQkJc3RyLCAoaW50KQorCQkJCQlJTlRfR0VUKGRkcS0+ZF9pZCwgQVJDSF9DT05WRVJUKSwgZGRxKTsKKwkJCQllcnJzKys7CisJCQl9CisJCX0KKwkJaWYgKElOVF9HRVQoZGRxLT5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkgJiYKKwkJICAgIElOVF9HRVQoZGRxLT5kX2ljb3VudCwgQVJDSF9DT05WRVJUKSA+PQorCQkJCUlOVF9HRVQoZGRxLT5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCWlmICghZGRxLT5kX2l0aW1lcikgeworCQkJCWlmIChmbGFncyAmIFhGU19RTU9QVF9ET1dBUk4pCisJCQkJCWNtbl9lcnIoQ0VfQUxFUlQsCisJCQkJCSIlcyA6IERxdW90IElEIDB4JXggKDB4JXApICIKKwkJCQkJIklOT0RFIFRJTUVSIE5PVCBTVEFSVEVEIiwKKwkJCQkJc3RyLCAoaW50KQorCQkJCQlJTlRfR0VUKGRkcS0+ZF9pZCwgQVJDSF9DT05WRVJUKSwgZGRxKTsKKwkJCQllcnJzKys7CisJCQl9CisJCX0KKwkJaWYgKElOVF9HRVQoZGRxLT5kX3J0Yl9zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkgJiYKKwkJICAgIElOVF9HRVQoZGRxLT5kX3J0YmNvdW50LCBBUkNIX0NPTlZFUlQpID49CisJCQkJSU5UX0dFVChkZHEtPmRfcnRiX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSkgeworCQkJaWYgKCFkZHEtPmRfcnRidGltZXIpIHsKKwkJCQlpZiAoZmxhZ3MgJiBYRlNfUU1PUFRfRE9XQVJOKQorCQkJCQljbW5fZXJyKENFX0FMRVJULAorCQkJCQkiJXMgOiBEcXVvdCBJRCAweCV4ICgweCVwKSAiCisJCQkJCSJSVEJMSyBUSU1FUiBOT1QgU1RBUlRFRCIsCisJCQkJCXN0ciwgKGludCkKKwkJCQkJSU5UX0dFVChkZHEtPmRfaWQsIEFSQ0hfQ09OVkVSVCksIGRkcSk7CisJCQkJZXJycysrOworCQkJfQorCQl9CisJfQorCisJaWYgKCFlcnJzIHx8ICEoZmxhZ3MgJiBYRlNfUU1PUFRfRFFSRVBBSVIpKQorCQlyZXR1cm4gZXJyczsKKworCWlmIChmbGFncyAmIFhGU19RTU9QVF9ET1dBUk4pCisJCWNtbl9lcnIoQ0VfTk9URSwgIlJlLWluaXRpYWxpemluZyBkcXVvdCBJRCAweCV4IiwgaWQpOworCisJLyoKKwkgKiBUeXBpY2FsbHksIGEgcmVwYWlyIGlzIG9ubHkgcmVxdWVzdGVkIGJ5IHF1b3RhY2hlY2suCisJICovCisJQVNTRVJUKGlkICE9IC0xKTsKKwlBU1NFUlQoZmxhZ3MgJiBYRlNfUU1PUFRfRFFSRVBBSVIpOworCW1lbXNldChkLCAwLCBzaXplb2YoeGZzX2RxYmxrX3QpKTsKKwlJTlRfU0VUKGQtPmRkX2Rpc2tkcS5kX21hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19EUVVPVF9NQUdJQyk7CisJSU5UX1NFVChkLT5kZF9kaXNrZHEuZF92ZXJzaW9uLCBBUkNIX0NPTlZFUlQsIFhGU19EUVVPVF9WRVJTSU9OKTsKKwlJTlRfU0VUKGQtPmRkX2Rpc2tkcS5kX2lkLCBBUkNIX0NPTlZFUlQsIGlkKTsKKwlJTlRfU0VUKGQtPmRkX2Rpc2tkcS5kX2ZsYWdzLCBBUkNIX0NPTlZFUlQsIHR5cGUpOworCisJcmV0dXJuIGVycnM7Cit9CisKKy8qCisgKiBQZXJmb3JtIGEgZHF1b3QgYnVmZmVyIHJlY292ZXJ5LgorICogU2ltcGxlIGFsZ29yaXRobTogaWYgd2UgaGF2ZSBmb3VuZCBhIFFVT1RBT0ZGIGxvZ2l0ZW0gb2YgdGhlIHNhbWUgdHlwZQorICogKGllLiBVU1Igb3IgR1JQKSwgdGhlbiBqdXN0IHRvc3MgdGhpcyBidWZmZXIgYXdheTsgZG9uJ3QgcmVjb3ZlciBpdC4KKyAqIEVsc2UsIHRyZWF0IGl0IGFzIGEgcmVndWxhciBidWZmZXIgYW5kIGRvIHJlY292ZXJ5LgorICovCitTVEFUSUMgdm9pZAoreGxvZ19yZWNvdmVyX2RvX2RxdW90X2J1ZmZlcigKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXhsb2dfdAkJCSpsb2csCisJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSwKKwl4ZnNfYnVmX3QJCSpicCwKKwl4ZnNfYnVmX2xvZ19mb3JtYXRfdAkqYnVmX2YpCit7CisJdWludAkJCXR5cGU7CisKKwkvKgorCSAqIEZpbGVzeXN0ZW1zIGFyZSByZXF1aXJlZCB0byBzZW5kIGluIHF1b3RhIGZsYWdzIGF0IG1vdW50IHRpbWUuCisJICovCisJaWYgKG1wLT5tX3FmbGFncyA9PSAwKSB7CisJCXJldHVybjsKKwl9CisKKwl0eXBlID0gMDsKKwlpZiAoYnVmX2YtPmJsZl9mbGFncyAmIFhGU19CTElfVURRVU9UX0JVRikKKwkJdHlwZSB8PSBYRlNfRFFfVVNFUjsKKwlpZiAoYnVmX2YtPmJsZl9mbGFncyAmIFhGU19CTElfR0RRVU9UX0JVRikKKwkJdHlwZSB8PSBYRlNfRFFfR1JPVVA7CisJLyoKKwkgKiBUaGlzIHR5cGUgb2YgcXVvdGFzIHdhcyB0dXJuZWQgb2ZmLCBzbyBpZ25vcmUgdGhpcyBidWZmZXIKKwkgKi8KKwlpZiAobG9nLT5sX3F1b3Rhb2Zmc19mbGFnICYgdHlwZSkKKwkJcmV0dXJuOworCisJeGxvZ19yZWNvdmVyX2RvX3JlZ19idWZmZXIobXAsIGl0ZW0sIGJwLCBidWZfZik7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgcmVwbGF5cyBhIG1vZGlmaWNhdGlvbiBtYWRlIHRvIGEgYnVmZmVyIGF0IHJ1bnRpbWUuCisgKiBUaGVyZSBhcmUgYWN0dWFsbHkgdHdvIHR5cGVzIG9mIGJ1ZmZlciwgcmVndWxhciBhbmQgaW5vZGUsIHdoaWNoCisgKiBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseS4gIElub2RlIGJ1ZmZlcnMgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkKKyAqIGluIHRoYXQgd2Ugb25seSByZWNvdmVyIGEgc3BlY2lmaWMgc2V0IG9mIGRhdGEgZnJvbSB0aGVtLCBuYW1lbHkKKyAqIHRoZSBpbm9kZSBkaV9uZXh0X3VubGlua2VkIGZpZWxkcy4gIFRoaXMgaXMgYmVjYXVzZSBhbGwgb3RoZXIgaW5vZGUKKyAqIGRhdGEgaXMgYWN0dWFsbHkgbG9nZ2VkIHZpYSBpbm9kZSByZWNvcmRzIGFuZCBhbnkgZGF0YSB3ZSByZXBsYXkKKyAqIGhlcmUgd2hpY2ggb3ZlcmxhcHMgdGhhdCBtYXkgYmUgc3RhbGUuCisgKgorICogV2hlbiBtZXRhLWRhdGEgYnVmZmVycyBhcmUgZnJlZWQgYXQgcnVuIHRpbWUgd2UgbG9nIGEgYnVmZmVyIGl0ZW0KKyAqIHdpdGggdGhlIFhGU19CTElfQ0FOQ0VMIGJpdCBzZXQgdG8gaW5kaWNhdGUgdGhhdCBwcmV2aW91cyBjb3BpZXMKKyAqIG9mIHRoZSBidWZmZXIgaW4gdGhlIGxvZyBzaG91bGQgbm90IGJlIHJlcGxheWVkIGF0IHJlY292ZXJ5IHRpbWUuCisgKiBUaGlzIGlzIHNvIHRoYXQgaWYgdGhlIGJsb2NrcyBjb3ZlcmVkIGJ5IHRoZSBidWZmZXIgYXJlIHJldXNlZCBmb3IKKyAqIGZpbGUgZGF0YSBiZWZvcmUgd2UgY3Jhc2ggd2UgZG9uJ3QgZW5kIHVwIHJlcGxheWluZyBvbGQsIGZyZWVkCisgKiBtZXRhLWRhdGEgaW50byBhIHVzZXIncyBmaWxlLgorICoKKyAqIFRvIGhhbmRsZSB0aGUgY2FuY2VsbGF0aW9uIG9mIGJ1ZmZlciBsb2cgaXRlbXMsIHdlIG1ha2UgdHdvIHBhc3NlcworICogb3ZlciB0aGUgbG9nIGR1cmluZyByZWNvdmVyeS4gIER1cmluZyB0aGUgZmlyc3Qgd2UgYnVpbGQgYSB0YWJsZSBvZgorICogdGhvc2UgYnVmZmVycyB3aGljaCBoYXZlIGJlZW4gY2FuY2VsbGVkLCBhbmQgZHVyaW5nIHRoZSBzZWNvbmQgd2UKKyAqIG9ubHkgcmVwbGF5IHRob3NlIGJ1ZmZlcnMgd2hpY2ggZG8gbm90IGhhdmUgY29ycmVzcG9uZGluZyBjYW5jZWwKKyAqIHJlY29yZHMgaW4gdGhlIHRhYmxlLiAgU2VlIHhsb2dfcmVjb3Zlcl9kb19idWZmZXJfcGFzc1sxLDJdIGFib3ZlCisgKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGFibGUgb2YgY2FuY2VsIHJlY29yZHMuCisgKi8KK1NUQVRJQyBpbnQKK3hsb2dfcmVjb3Zlcl9kb19idWZmZXJfdHJhbnMoCisJeGxvZ190CQkJKmxvZywKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtLAorCWludAkJCXBhc3MpCit7CisJeGZzX2J1Zl9sb2dfZm9ybWF0X3QJKmJ1Zl9mOworCXhmc19idWZfbG9nX2Zvcm1hdF92MV90CSpvYnVmX2Y7CisJeGZzX21vdW50X3QJCSptcDsKKwl4ZnNfYnVmX3QJCSpicDsKKwlpbnQJCQllcnJvcjsKKwlpbnQJCQljYW5jZWw7CisJeGZzX2RhZGRyX3QJCWJsa25vOworCWludAkJCWxlbjsKKwl1c2hvcnQJCQlmbGFnczsKKworCWJ1Zl9mID0gKHhmc19idWZfbG9nX2Zvcm1hdF90ICopaXRlbS0+cmlfYnVmWzBdLmlfYWRkcjsKKworCWlmIChwYXNzID09IFhMT0dfUkVDT1ZFUl9QQVNTMSkgeworCQkvKgorCQkgKiBJbiB0aGlzIHBhc3Mgd2UncmUgb25seSBsb29raW5nIGZvciBidWYgaXRlbXMKKwkJICogd2l0aCB0aGUgWEZTX0JMSV9DQU5DRUwgYml0IHNldC4KKwkJICovCisJCXhsb2dfcmVjb3Zlcl9kb19idWZmZXJfcGFzczEobG9nLCBidWZfZik7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEluIHRoaXMgcGFzcyB3ZSB3YW50IHRvIHJlY292ZXIgYWxsIHRoZSBidWZmZXJzCisJCSAqIHdoaWNoIGhhdmUgbm90IGJlZW4gY2FuY2VsbGVkIGFuZCBhcmUgbm90CisJCSAqIGNhbmNlbGxhdGlvbiBidWZmZXJzIHRoZW1zZWx2ZXMuICBUaGUgcm91dGluZQorCQkgKiB3ZSBjYWxsIGhlcmUgd2lsbCB0ZWxsIHVzIHdoZXRoZXIgb3Igbm90IHRvCisJCSAqIGNvbnRpbnVlIHdpdGggdGhlIHJlcGxheSBvZiB0aGlzIGJ1ZmZlci4KKwkJICovCisJCWNhbmNlbCA9IHhsb2dfcmVjb3Zlcl9kb19idWZmZXJfcGFzczIobG9nLCBidWZfZik7CisJCWlmIChjYW5jZWwpIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXN3aXRjaCAoYnVmX2YtPmJsZl90eXBlKSB7CisJY2FzZSBYRlNfTElfQlVGOgorCQlibGtubyA9IGJ1Zl9mLT5ibGZfYmxrbm87CisJCWxlbiA9IGJ1Zl9mLT5ibGZfbGVuOworCQlmbGFncyA9IGJ1Zl9mLT5ibGZfZmxhZ3M7CisJCWJyZWFrOworCWNhc2UgWEZTX0xJXzZfMV9CVUY6CisJY2FzZSBYRlNfTElfNV8zX0JVRjoKKwkJb2J1Zl9mID0gKHhmc19idWZfbG9nX2Zvcm1hdF92MV90KilidWZfZjsKKwkJYmxrbm8gPSBvYnVmX2YtPmJsZl9ibGtubzsKKwkJbGVuID0gb2J1Zl9mLT5ibGZfbGVuOworCQlmbGFncyA9IG9idWZfZi0+YmxmX2ZsYWdzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbG9nLT5sX21wLAorCQkJInhmc19sb2dfcmVjb3ZlcjogdW5rbm93biBidWZmZXIgdHlwZSAweCV4LCBkZXYgJXMiLAorCQkJYnVmX2YtPmJsZl90eXBlLCBYRlNfQlVGVEFSR19OQU1FKGxvZy0+bF90YXJnKSk7CisJCVhGU19FUlJPUl9SRVBPUlQoInhsb2dfcmVjb3Zlcl9kb19idWZmZXJfdHJhbnMiLAorCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBsb2ctPmxfbXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCisJbXAgPSBsb2ctPmxfbXA7CisJaWYgKGZsYWdzICYgWEZTX0JMSV9JTk9ERV9CVUYpIHsKKwkJYnAgPSB4ZnNfYnVmX3JlYWRfZmxhZ3MobXAtPm1fZGRldl90YXJncCwgYmxrbm8sIGxlbiwKKwkJCQkJCQkJWEZTX0JVRl9MT0NLKTsKKwl9IGVsc2UgeworCQlicCA9IHhmc19idWZfcmVhZChtcC0+bV9kZGV2X3RhcmdwLCBibGtubywgbGVuLCAwKTsKKwl9CisJaWYgKFhGU19CVUZfSVNFUlJPUihicCkpIHsKKwkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfcmVjb3Zlcl9kby4uKHJlYWQjMSkiLCBsb2ctPmxfbXAsCisJCQkJICBicCwgYmxrbm8pOworCQllcnJvciA9IFhGU19CVUZfR0VURVJST1IoYnApOworCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWVycm9yID0gMDsKKwlpZiAoZmxhZ3MgJiBYRlNfQkxJX0lOT0RFX0JVRikgeworCQllcnJvciA9IHhsb2dfcmVjb3Zlcl9kb19pbm9kZV9idWZmZXIobXAsIGl0ZW0sIGJwLCBidWZfZik7CisJfSBlbHNlIGlmIChmbGFncyAmIChYRlNfQkxJX1VEUVVPVF9CVUYgfCBYRlNfQkxJX0dEUVVPVF9CVUYpKSB7CisJCXhsb2dfcmVjb3Zlcl9kb19kcXVvdF9idWZmZXIobXAsIGxvZywgaXRlbSwgYnAsIGJ1Zl9mKTsKKwl9IGVsc2UgeworCQl4bG9nX3JlY292ZXJfZG9fcmVnX2J1ZmZlcihtcCwgaXRlbSwgYnAsIGJ1Zl9mKTsKKwl9CisJaWYgKGVycm9yKQorCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKKworCS8qCisJICogUGVyZm9ybSBkZWxheWVkIHdyaXRlIG9uIHRoZSBidWZmZXIuICBBc3luY2hyb25vdXMgd3JpdGVzIHdpbGwgYmUKKwkgKiBzbG93ZXIgd2hlbiB0YWtpbmcgaW50byBhY2NvdW50IGFsbCB0aGUgYnVmZmVycyB0byBiZSBmbHVzaGVkLgorCSAqCisJICogQWxzbyBtYWtlIHN1cmUgdGhhdCBvbmx5IGlub2RlIGJ1ZmZlcnMgd2l0aCBnb29kIHNpemVzIHN0YXkgaW4KKwkgKiB0aGUgYnVmZmVyIGNhY2hlLiAgVGhlIGtlcm5lbCBtb3ZlcyBpbm9kZXMgaW4gYnVmZmVycyBvZiAxIGJsb2NrCisJICogb3IgWEZTX0lOT0RFX0NMVVNURVJfU0laRSBieXRlcywgd2hpY2hldmVyIGlzIGJpZ2dlci4gIFRoZSBpbm9kZQorCSAqIGJ1ZmZlcnMgaW4gdGhlIGxvZyBjYW4gYmUgYSBkaWZmZXJlbnQgc2l6ZSBpZiB0aGUgbG9nIHdhcyBnZW5lcmF0ZWQKKwkgKiBieSBhbiBvbGRlciBrZXJuZWwgdXNpbmcgdW5jbHVzdGVyZWQgaW5vZGUgYnVmZmVycyBvciBhIG5ld2VyIGtlcm5lbAorCSAqIHJ1bm5pbmcgd2l0aCBhIGRpZmZlcmVudCBpbm9kZSBjbHVzdGVyIHNpemUuICBSZWdhcmRsZXNzLCBpZiB0aGUKKwkgKiB0aGUgaW5vZGUgYnVmZmVyIHNpemUgaXNuJ3QgTUFYKGJsb2Nrc2l6ZSwgWEZTX0lOT0RFX0NMVVNURVJfU0laRSkKKwkgKiBmb3IgKm91ciogdmFsdWUgb2YgWEZTX0lOT0RFX0NMVVNURVJfU0laRSwgdGhlbiB3ZSBuZWVkIHRvIGtlZXAKKwkgKiB0aGUgYnVmZmVyIG91dCBvZiB0aGUgYnVmZmVyIGNhY2hlIHNvIHRoYXQgdGhlIGJ1ZmZlciB3b24ndAorCSAqIG92ZXJsYXAgd2l0aCBmdXR1cmUgcmVhZHMgb2YgdGhvc2UgaW5vZGVzLgorCSAqLworCWlmIChYRlNfRElOT0RFX01BR0lDID09CisJICAgIElOVF9HRVQoKigoX191aW50MTZfdCAqKSh4ZnNfYnVmX29mZnNldChicCwgMCkpKSwgQVJDSF9DT05WRVJUKSAmJgorCSAgICAoWEZTX0JVRl9DT1VOVChicCkgIT0gTUFYKGxvZy0+bF9tcC0+bV9zYi5zYl9ibG9ja3NpemUsCisJCQkoX191aW50MzJfdClYRlNfSU5PREVfQ0xVU1RFUl9TSVpFKGxvZy0+bF9tcCkpKSkgeworCQlYRlNfQlVGX1NUQUxFKGJwKTsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKG1wLCBicCk7CisJfSBlbHNlIHsKKwkJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopID09IE5VTEwgfHwKKwkJICAgICAgIFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfbW91bnRfdCAqKSA9PSBtcCk7CisJCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgbXApOworCQlYRlNfQlVGX1NFVF9JT0RPTkVfRlVOQyhicCwgeGxvZ19yZWNvdmVyX2lvZG9uZSk7CisJCXhmc19iZHdyaXRlKG1wLCBicCk7CisJfQorCisJcmV0dXJuIChlcnJvcik7Cit9CisKK1NUQVRJQyBpbnQKK3hsb2dfcmVjb3Zlcl9kb19pbm9kZV90cmFucygKKwl4bG9nX3QJCQkqbG9nLAorCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW0sCisJaW50CQkJcGFzcykKK3sKKwl4ZnNfaW5vZGVfbG9nX2Zvcm1hdF90CSppbl9mOworCXhmc19tb3VudF90CQkqbXA7CisJeGZzX2J1Zl90CQkqYnA7CisJeGZzX2ltYXBfdAkJaW1hcDsKKwl4ZnNfZGlub2RlX3QJCSpkaXA7CisJeGZzX2lub190CQlpbm87CisJaW50CQkJbGVuOworCXhmc19jYWRkcl90CQlzcmM7CisJeGZzX2NhZGRyX3QJCWRlc3Q7CisJaW50CQkJZXJyb3I7CisJaW50CQkJYXR0cl9pbmRleDsKKwl1aW50CQkJZmllbGRzOworCXhmc19kaW5vZGVfY29yZV90CSpkaWNwOworCisJaWYgKHBhc3MgPT0gWExPR19SRUNPVkVSX1BBU1MxKSB7CisJCXJldHVybiAwOworCX0KKworCWluX2YgPSAoeGZzX2lub2RlX2xvZ19mb3JtYXRfdCAqKWl0ZW0tPnJpX2J1ZlswXS5pX2FkZHI7CisJaW5vID0gaW5fZi0+aWxmX2lubzsKKwltcCA9IGxvZy0+bF9tcDsKKwlpZiAoSVRFTV9UWVBFKGl0ZW0pID09IFhGU19MSV9JTk9ERSkgeworCQlpbWFwLmltX2Jsa25vID0gKHhmc19kYWRkcl90KWluX2YtPmlsZl9ibGtubzsKKwkJaW1hcC5pbV9sZW4gPSBpbl9mLT5pbGZfbGVuOworCQlpbWFwLmltX2JvZmZzZXQgPSBpbl9mLT5pbGZfYm9mZnNldDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBJdCdzIGFuIG9sZCBpbm9kZSBmb3JtYXQgcmVjb3JkLiAgV2UgZG9uJ3Qga25vdyB3aGVyZQorCQkgKiBpdHMgY2x1c3RlciBpcyBsb2NhdGVkIG9uIGRpc2ssIGFuZCB3ZSBjYW4ndCBhbGxvdworCQkgKiB4ZnNfaW1hcCgpIHRvIGZpZ3VyZSBpdCBvdXQgYmVjYXVzZSB0aGUgaW5vZGUgYnRyZWVzCisJCSAqIGFyZSBub3QgcmVhZHkgdG8gYmUgdXNlZC4gIFRoZXJlZm9yZSBkbyBub3QgcGFzcyB0aGUKKwkJICogWEZTX0lNQVBfTE9PS1VQIGZsYWcgdG8geGZzX2ltYXAoKS4gIFRoaXMgd2lsbCBnaXZlCisJCSAqIHVzIG9ubHkgdGhlIHNpbmdsZSBibG9jayBpbiB3aGljaCB0aGUgaW5vZGUgbGl2ZXMKKwkJICogcmF0aGVyIHRoYW4gaXRzIGNsdXN0ZXIsIHNvIHdlIG11c3QgbWFrZSBzdXJlIHRvCisJCSAqIGludmFsaWRhdGUgdGhlIGJ1ZmZlciB3aGVuIHdlIHdyaXRlIGl0IG91dCBiZWxvdy4KKwkJICovCisJCWltYXAuaW1fYmxrbm8gPSAwOworCQl4ZnNfaW1hcChsb2ctPmxfbXAsIE5VTEwsIGlubywgJmltYXAsIDApOworCX0KKworCS8qCisJICogSW5vZGUgYnVmZmVycyBjYW4gYmUgZnJlZWQsIGxvb2sgb3V0IGZvciBpdCwKKwkgKiBhbmQgZG8gbm90IHJlcGxheSB0aGUgaW5vZGUuCisJICovCisJaWYgKHhsb2dfY2hlY2tfYnVmZmVyX2NhbmNlbGxlZChsb2csIGltYXAuaW1fYmxrbm8sIGltYXAuaW1fbGVuLCAwKSkKKwkJcmV0dXJuIDA7CisKKwlicCA9IHhmc19idWZfcmVhZF9mbGFncyhtcC0+bV9kZGV2X3RhcmdwLCBpbWFwLmltX2Jsa25vLCBpbWFwLmltX2xlbiwKKwkJCQkJCQkJWEZTX0JVRl9MT0NLKTsKKwlpZiAoWEZTX0JVRl9JU0VSUk9SKGJwKSkgeworCQl4ZnNfaW9lcnJvcl9hbGVydCgieGxvZ19yZWNvdmVyX2RvLi4ocmVhZCMyKSIsIG1wLAorCQkJCSAgYnAsIGltYXAuaW1fYmxrbm8pOworCQllcnJvciA9IFhGU19CVUZfR0VURVJST1IoYnApOworCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwllcnJvciA9IDA7CisJQVNTRVJUKGluX2YtPmlsZl9maWVsZHMgJiBYRlNfSUxPR19DT1JFKTsKKwlkaXAgPSAoeGZzX2Rpbm9kZV90ICopeGZzX2J1Zl9vZmZzZXQoYnAsIGltYXAuaW1fYm9mZnNldCk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgcGxhY2Ugd2UncmUgZmx1c2hpbmcgb3V0IHRvIHJlYWxseSBsb29rcworCSAqIGxpa2UgYW4gaW5vZGUhCisJICovCisJaWYgKHVubGlrZWx5KElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX21hZ2ljLCBBUkNIX0NPTlZFUlQpICE9IFhGU19ESU5PREVfTUFHSUMpKSB7CisJCXhmc19idWZfcmVsc2UoYnApOworCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCisJCQkieGZzX2lub2RlX3JlY292ZXI6IEJhZCBpbm9kZSBtYWdpYyBudW1iZXIsIGRpbm8gcHRyID0gMHglcCwgZGlubyBicCA9IDB4JXAsIGlubyA9ICVMZCIsCisJCQlkaXAsIGJwLCBpbm8pOworCQlYRlNfRVJST1JfUkVQT1JUKCJ4bG9nX3JlY292ZXJfZG9faW5vZGVfdHJhbnMoMSkiLAorCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisJZGljcCA9ICh4ZnNfZGlub2RlX2NvcmVfdCopKGl0ZW0tPnJpX2J1ZlsxXS5pX2FkZHIpOworCWlmICh1bmxpa2VseShkaWNwLT5kaV9tYWdpYyAhPSBYRlNfRElOT0RFX01BR0lDKSkgeworCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLAorCQkJInhmc19pbm9kZV9yZWNvdmVyOiBCYWQgaW5vZGUgbG9nIHJlY29yZCwgcmVjIHB0ciAweCVwLCBpbm8gJUxkIiwKKwkJCWl0ZW0sIGlubyk7CisJCVhGU19FUlJPUl9SRVBPUlQoInhsb2dfcmVjb3Zlcl9kb19pbm9kZV90cmFucygyKSIsCisJCQkJIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKworCS8qIFNraXAgcmVwbGF5IHdoZW4gdGhlIG9uIGRpc2sgaW5vZGUgaXMgbmV3ZXIgdGhhbiB0aGUgbG9nIG9uZSAqLworCWlmIChkaWNwLT5kaV9mbHVzaGl0ZXIgPAorCSAgICBJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9mbHVzaGl0ZXIsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJLyoKKwkJICogRGVhbCB3aXRoIHRoZSB3cmFwIGNhc2UsIERJX01BWF9GTFVTSCBpcyBsZXNzCisJCSAqIHRoYW4gc21hbGxlciBudW1iZXJzCisJCSAqLworCQlpZiAoKElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX2ZsdXNoaXRlciwgQVJDSF9DT05WRVJUKQorCQkJCQkJCT09IERJX01BWF9GTFVTSCkgJiYKKwkJICAgIChkaWNwLT5kaV9mbHVzaGl0ZXIgPCAoRElfTUFYX0ZMVVNIPj4xKSkpIHsKKwkJCS8qIGRvIG5vdGhpbmcgKi8KKwkJfSBlbHNlIHsKKwkJCXhmc19idWZfcmVsc2UoYnApOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJLyogVGFrZSB0aGUgb3Bwb3J0dW5pdHkgdG8gcmVzZXQgdGhlIGZsdXNoIGl0ZXJhdGlvbiBjb3VudCAqLworCWRpY3AtPmRpX2ZsdXNoaXRlciA9IDA7CisKKwlpZiAodW5saWtlbHkoKGRpY3AtPmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpKSB7CisJCWlmICgoZGljcC0+ZGlfZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0VYVEVOVFMpICYmCisJCSAgICAoZGljcC0+ZGlfZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0JUUkVFKSkgeworCQkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhsb2dfcmVjb3Zlcl9kb19pbm9kZV90cmFucygzKSIsCisJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCwgZGljcCk7CisJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwKKwkJCQkieGZzX2lub2RlX3JlY292ZXI6IEJhZCByZWd1bGFyIGlub2RlIGxvZyByZWNvcmQsIHJlYyBwdHIgMHglcCwgaW5vIHB0ciA9IDB4JXAsIGlubyBicCA9IDB4JXAsIGlubyAlTGQiLAorCQkJCWl0ZW0sIGRpcCwgYnAsIGlubyk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCX0KKwl9IGVsc2UgaWYgKHVubGlrZWx5KChkaWNwLT5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKSkgeworCQlpZiAoKGRpY3AtPmRpX2Zvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTKSAmJgorCQkgICAgKGRpY3AtPmRpX2Zvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSkgJiYKKwkJICAgIChkaWNwLT5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpKSB7CisJCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGxvZ19yZWNvdmVyX2RvX2lub2RlX3RyYW5zKDQpIiwKKwkJCQkJICAgICBYRlNfRVJSTEVWRUxfTE9XLCBtcCwgZGljcCk7CisJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwKKwkJCQkieGZzX2lub2RlX3JlY292ZXI6IEJhZCBkaXIgaW5vZGUgbG9nIHJlY29yZCwgcmVjIHB0ciAweCVwLCBpbm8gcHRyID0gMHglcCwgaW5vIGJwID0gMHglcCwgaW5vICVMZCIsCisJCQkJaXRlbSwgZGlwLCBicCwgaW5vKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJfQorCX0KKwlpZiAodW5saWtlbHkoZGljcC0+ZGlfbmV4dGVudHMgKyBkaWNwLT5kaV9hbmV4dGVudHMgPiBkaWNwLT5kaV9uYmxvY2tzKSl7CisJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4bG9nX3JlY292ZXJfZG9faW5vZGVfdHJhbnMoNSkiLAorCQkJCSAgICAgWEZTX0VSUkxFVkVMX0xPVywgbXAsIGRpY3ApOworCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLAorCQkJInhmc19pbm9kZV9yZWNvdmVyOiBCYWQgaW5vZGUgbG9nIHJlY29yZCwgcmVjIHB0ciAweCVwLCBkaW5vIHB0ciAweCVwLCBkaW5vIGJwIDB4JXAsIGlubyAlTGQsIHRvdGFsIGV4dGVudHMgPSAlZCwgbmJsb2NrcyA9ICVMZCIsCisJCQlpdGVtLCBkaXAsIGJwLCBpbm8sCisJCQlkaWNwLT5kaV9uZXh0ZW50cyArIGRpY3AtPmRpX2FuZXh0ZW50cywKKwkJCWRpY3AtPmRpX25ibG9ja3MpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCWlmICh1bmxpa2VseShkaWNwLT5kaV9mb3Jrb2ZmID4gbXAtPm1fc2Iuc2JfaW5vZGVzaXplKSkgeworCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGxvZ19yZWNvdmVyX2RvX2lub2RlX3RyYW5zKDYpIiwKKwkJCQkgICAgIFhGU19FUlJMRVZFTF9MT1csIG1wLCBkaWNwKTsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwKKwkJCSJ4ZnNfaW5vZGVfcmVjb3ZlcjogQmFkIGlub2RlIGxvZyByZWMgcHRyIDB4JXAsIGRpbm8gcHRyIDB4JXAsIGRpbm8gYnAgMHglcCwgaW5vICVMZCwgZm9ya29mZiAweCV4IiwKKwkJCWl0ZW0sIGRpcCwgYnAsIGlubywgZGljcC0+ZGlfZm9ya29mZik7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisJaWYgKHVubGlrZWx5KGl0ZW0tPnJpX2J1ZlsxXS5pX2xlbiA+IHNpemVvZih4ZnNfZGlub2RlX2NvcmVfdCkpKSB7CisJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4bG9nX3JlY292ZXJfZG9faW5vZGVfdHJhbnMoNykiLAorCQkJCSAgICAgWEZTX0VSUkxFVkVMX0xPVywgbXAsIGRpY3ApOworCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLAorCQkJInhmc19pbm9kZV9yZWNvdmVyOiBCYWQgaW5vZGUgbG9nIHJlY29yZCBsZW5ndGggJWQsIHJlYyBwdHIgMHglcCIsCisJCQlpdGVtLT5yaV9idWZbMV0uaV9sZW4sIGl0ZW0pOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCisJLyogVGhlIGNvcmUgaXMgaW4gaW4tY29yZSBmb3JtYXQgKi8KKwl4ZnNfeGxhdGVfZGlub2RlX2NvcmUoKHhmc19jYWRkcl90KSZkaXAtPmRpX2NvcmUsCisJCQkgICAgICAoeGZzX2Rpbm9kZV9jb3JlX3QqKWl0ZW0tPnJpX2J1ZlsxXS5pX2FkZHIsIC0xKTsKKworCS8qIHRoZSByZXN0IGlzIGluIG9uLWRpc2sgZm9ybWF0ICovCisJaWYgKGl0ZW0tPnJpX2J1ZlsxXS5pX2xlbiA+IHNpemVvZih4ZnNfZGlub2RlX2NvcmVfdCkpIHsKKwkJbWVtY3B5KCh4ZnNfY2FkZHJfdCkgZGlwICsgc2l6ZW9mKHhmc19kaW5vZGVfY29yZV90KSwKKwkJCWl0ZW0tPnJpX2J1ZlsxXS5pX2FkZHIgKyBzaXplb2YoeGZzX2Rpbm9kZV9jb3JlX3QpLAorCQkJaXRlbS0+cmlfYnVmWzFdLmlfbGVuICAtIHNpemVvZih4ZnNfZGlub2RlX2NvcmVfdCkpOworCX0KKworCWZpZWxkcyA9IGluX2YtPmlsZl9maWVsZHM7CisJc3dpdGNoIChmaWVsZHMgJiAoWEZTX0lMT0dfREVWIHwgWEZTX0lMT0dfVVVJRCkpIHsKKwljYXNlIFhGU19JTE9HX0RFVjoKKwkJSU5UX1NFVChkaXAtPmRpX3UuZGlfZGV2LCBBUkNIX0NPTlZFUlQsIGluX2YtPmlsZl91LmlsZnVfcmRldik7CisKKwkJYnJlYWs7CisJY2FzZSBYRlNfSUxPR19VVUlEOgorCQlkaXAtPmRpX3UuZGlfbXV1aWQgPSBpbl9mLT5pbGZfdS5pbGZ1X3V1aWQ7CisJCWJyZWFrOworCX0KKworCWlmIChpbl9mLT5pbGZfc2l6ZSA9PSAyKQorCQlnb3RvIHdyaXRlX2lub2RlX2J1ZmZlcjsKKwlsZW4gPSBpdGVtLT5yaV9idWZbMl0uaV9sZW47CisJc3JjID0gaXRlbS0+cmlfYnVmWzJdLmlfYWRkcjsKKwlBU1NFUlQoaW5fZi0+aWxmX3NpemUgPD0gNCk7CisJQVNTRVJUKChpbl9mLT5pbGZfc2l6ZSA9PSAzKSB8fCAoZmllbGRzICYgWEZTX0lMT0dfQUZPUkspKTsKKwlBU1NFUlQoIShmaWVsZHMgJiBYRlNfSUxPR19ERk9SSykgfHwKKwkgICAgICAgKGxlbiA9PSBpbl9mLT5pbGZfZHNpemUpKTsKKworCXN3aXRjaCAoZmllbGRzICYgWEZTX0lMT0dfREZPUkspIHsKKwljYXNlIFhGU19JTE9HX0REQVRBOgorCWNhc2UgWEZTX0lMT0dfREVYVDoKKwkJbWVtY3B5KCZkaXAtPmRpX3UsIHNyYywgbGVuKTsKKwkJYnJlYWs7CisKKwljYXNlIFhGU19JTE9HX0RCUk9PVDoKKwkJeGZzX2JtYnRfdG9fYm1kcigoeGZzX2JtYnRfYmxvY2tfdCAqKXNyYywgbGVuLAorCQkJCSAmKGRpcC0+ZGlfdS5kaV9ibWJ0KSwKKwkJCQkgWEZTX0RGT1JLX0RTSVpFKGRpcCwgbXApKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBUaGVyZSBhcmUgbm8gZGF0YSBmb3JrIGZsYWdzIHNldC4KKwkJICovCisJCUFTU0VSVCgoZmllbGRzICYgWEZTX0lMT0dfREZPUkspID09IDApOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIElmIHdlIGxvZ2dlZCBhbnkgYXR0cmlidXRlIGRhdGEsIHJlY292ZXIgaXQuICBUaGVyZSBtYXkgb3IKKwkgKiBtYXkgbm90IGhhdmUgYmVlbiBhbnkgb3RoZXIgbm9uLWNvcmUgZGF0YSBsb2dnZWQgaW4gdGhpcworCSAqIHRyYW5zYWN0aW9uLgorCSAqLworCWlmIChpbl9mLT5pbGZfZmllbGRzICYgWEZTX0lMT0dfQUZPUkspIHsKKwkJaWYgKGluX2YtPmlsZl9maWVsZHMgJiBYRlNfSUxPR19ERk9SSykgeworCQkJYXR0cl9pbmRleCA9IDM7CisJCX0gZWxzZSB7CisJCQlhdHRyX2luZGV4ID0gMjsKKwkJfQorCQlsZW4gPSBpdGVtLT5yaV9idWZbYXR0cl9pbmRleF0uaV9sZW47CisJCXNyYyA9IGl0ZW0tPnJpX2J1ZlthdHRyX2luZGV4XS5pX2FkZHI7CisJCUFTU0VSVChsZW4gPT0gaW5fZi0+aWxmX2FzaXplKTsKKworCQlzd2l0Y2ggKGluX2YtPmlsZl9maWVsZHMgJiBYRlNfSUxPR19BRk9SSykgeworCQljYXNlIFhGU19JTE9HX0FEQVRBOgorCQljYXNlIFhGU19JTE9HX0FFWFQ6CisJCQlkZXN0ID0gWEZTX0RGT1JLX0FQVFIoZGlwKTsKKwkJCUFTU0VSVChsZW4gPD0gWEZTX0RGT1JLX0FTSVpFKGRpcCwgbXApKTsKKwkJCW1lbWNweShkZXN0LCBzcmMsIGxlbik7CisJCQlicmVhazsKKworCQljYXNlIFhGU19JTE9HX0FCUk9PVDoKKwkJCWRlc3QgPSBYRlNfREZPUktfQVBUUihkaXApOworCQkJeGZzX2JtYnRfdG9fYm1kcigoeGZzX2JtYnRfYmxvY2tfdCAqKXNyYywgbGVuLAorCQkJCQkgKHhmc19ibWRyX2Jsb2NrX3QqKWRlc3QsCisJCQkJCSBYRlNfREZPUktfQVNJWkUoZGlwLCBtcCkpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXhsb2dfd2FybigiWEZTOiB4bG9nX3JlY292ZXJfZG9faW5vZGVfdHJhbnM6IEludmFsaWQgZmxhZyIpOworCQkJQVNTRVJUKDApOworCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJCX0KKwl9CisKK3dyaXRlX2lub2RlX2J1ZmZlcjoKKwlpZiAoSVRFTV9UWVBFKGl0ZW0pID09IFhGU19MSV9JTk9ERSkgeworCQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgPT0gTlVMTCB8fAorCQkgICAgICAgWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19tb3VudF90ICopID09IG1wKTsKKwkJWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCBtcCk7CisJCVhGU19CVUZfU0VUX0lPRE9ORV9GVU5DKGJwLCB4bG9nX3JlY292ZXJfaW9kb25lKTsKKwkJeGZzX2Jkd3JpdGUobXAsIGJwKTsKKwl9IGVsc2UgeworCQlYRlNfQlVGX1NUQUxFKGJwKTsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKG1wLCBicCk7CisJfQorCisJcmV0dXJuIChlcnJvcik7Cit9CisKKy8qCisgKiBSZWNvdmVyIFFVT1RBT0ZGIHJlY29yZHMuIFdlIHNpbXBseSBtYWtlIGEgbm90ZSBvZiBpdCBpbiB0aGUgeGxvZ190CisgKiBzdHJ1Y3R1cmUsIHNvIHRoYXQgd2Uga25vdyBub3QgdG8gZG8gYW55IGRxdW90IGl0ZW0gb3IgZHF1b3QgYnVmZmVyIHJlY292ZXJ5LAorICogb2YgdGhhdCB0eXBlLgorICovCitTVEFUSUMgaW50Cit4bG9nX3JlY292ZXJfZG9fcXVvdGFvZmZfdHJhbnMoCisJeGxvZ190CQkJKmxvZywKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtLAorCWludAkJCXBhc3MpCit7CisJeGZzX3FvZmZfbG9nZm9ybWF0X3QJKnFvZmZfZjsKKworCWlmIChwYXNzID09IFhMT0dfUkVDT1ZFUl9QQVNTMikgeworCQlyZXR1cm4gKDApOworCX0KKworCXFvZmZfZiA9ICh4ZnNfcW9mZl9sb2dmb3JtYXRfdCAqKWl0ZW0tPnJpX2J1ZlswXS5pX2FkZHI7CisJQVNTRVJUKHFvZmZfZik7CisKKwkvKgorCSAqIFRoZSBsb2dpdGVtIGZvcm1hdCdzIGZsYWcgdGVsbHMgdXMgaWYgdGhpcyB3YXMgdXNlciBxdW90YW9mZiwKKwkgKiBncm91cCBxdW90YW9mZiBvciBib3RoLgorCSAqLworCWlmIChxb2ZmX2YtPnFmX2ZsYWdzICYgWEZTX1VRVU9UQV9BQ0NUKQorCQlsb2ctPmxfcXVvdGFvZmZzX2ZsYWcgfD0gWEZTX0RRX1VTRVI7CisJaWYgKHFvZmZfZi0+cWZfZmxhZ3MgJiBYRlNfR1FVT1RBX0FDQ1QpCisJCWxvZy0+bF9xdW90YW9mZnNfZmxhZyB8PSBYRlNfRFFfR1JPVVA7CisKKwlyZXR1cm4gKDApOworfQorCisvKgorICogUmVjb3ZlciBhIGRxdW90IHJlY29yZAorICovCitTVEFUSUMgaW50Cit4bG9nX3JlY292ZXJfZG9fZHF1b3RfdHJhbnMoCisJeGxvZ190CQkJKmxvZywKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtLAorCWludAkJCXBhc3MpCit7CisJeGZzX21vdW50X3QJCSptcDsKKwl4ZnNfYnVmX3QJCSpicDsKKwlzdHJ1Y3QgeGZzX2Rpc2tfZHF1b3QJKmRkcSwgKnJlY2RkcTsKKwlpbnQJCQllcnJvcjsKKwl4ZnNfZHFfbG9nZm9ybWF0X3QJKmRxX2Y7CisJdWludAkJCXR5cGU7CisKKwlpZiAocGFzcyA9PSBYTE9HX1JFQ09WRVJfUEFTUzEpIHsKKwkJcmV0dXJuIDA7CisJfQorCW1wID0gbG9nLT5sX21wOworCisJLyoKKwkgKiBGaWxlc3lzdGVtcyBhcmUgcmVxdWlyZWQgdG8gc2VuZCBpbiBxdW90YSBmbGFncyBhdCBtb3VudCB0aW1lLgorCSAqLworCWlmIChtcC0+bV9xZmxhZ3MgPT0gMCkKKwkJcmV0dXJuICgwKTsKKworCXJlY2RkcSA9ICh4ZnNfZGlza19kcXVvdF90ICopaXRlbS0+cmlfYnVmWzFdLmlfYWRkcjsKKwlBU1NFUlQocmVjZGRxKTsKKwkvKgorCSAqIFRoaXMgdHlwZSBvZiBxdW90YXMgd2FzIHR1cm5lZCBvZmYsIHNvIGlnbm9yZSB0aGlzIHJlY29yZC4KKwkgKi8KKwl0eXBlID0gSU5UX0dFVChyZWNkZHEtPmRfZmxhZ3MsIEFSQ0hfQ09OVkVSVCkgJgorCQkJKFhGU19EUV9VU0VSIHwgWEZTX0RRX0dST1VQKTsKKwlBU1NFUlQodHlwZSk7CisJaWYgKGxvZy0+bF9xdW90YW9mZnNfZmxhZyAmIHR5cGUpCisJCXJldHVybiAoMCk7CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHF1b3RhIHdhcyBfbm90XyB0dXJuZWQgb2ZmLgorCSAqIFNpbmNlIHRoZSBtb3VudCBmbGFncyBhcmUgbm90IGluZGljYXRpbmcgdG8gdXMgb3RoZXJ3aXNlLCB0aGlzCisJICogbXVzdCBtZWFuIHRoYXQgcXVvdGEgaXMgb24sIGFuZCB0aGUgZHF1b3QgbmVlZHMgdG8gYmUgcmVwbGF5ZWQuCisJICogUmVtZW1iZXIgdGhhdCB3ZSBtYXkgbm90IGhhdmUgZnVsbHkgcmVjb3ZlcmVkIHRoZSBzdXBlcmJsb2NrIHlldCwKKwkgKiBzbyB3ZSBjYW4ndCBkbyB0aGUgdXN1YWwgdHJpY2sgb2YgbG9va2luZyBhdCB0aGUgU0IgcXVvdGEgYml0cy4KKwkgKgorCSAqIFRoZSBvdGhlciBwb3NzaWJpbGl0eSwgb2YgY291cnNlLCBpcyB0aGF0IHRoZSBxdW90YSBzdWJzeXN0ZW0gd2FzCisJICogcmVtb3ZlZCBzaW5jZSB0aGUgbGFzdCBtb3VudCAtIEVOT1NZUy4KKwkgKi8KKwlkcV9mID0gKHhmc19kcV9sb2dmb3JtYXRfdCAqKWl0ZW0tPnJpX2J1ZlswXS5pX2FkZHI7CisJQVNTRVJUKGRxX2YpOworCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFjaGVjayhyZWNkZHEsCisJCQkgICBkcV9mLT5xbGZfaWQsCisJCQkgICAwLCBYRlNfUU1PUFRfRE9XQVJOLAorCQkJICAgInhsb2dfcmVjb3Zlcl9kb19kcXVvdF90cmFucyAobG9nIGNvcHkpIikpKSB7CisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwl9CisJQVNTRVJUKGRxX2YtPnFsZl9sZW4gPT0gMSk7CisKKwllcnJvciA9IHhmc19yZWFkX2J1ZihtcCwgbXAtPm1fZGRldl90YXJncCwKKwkJCSAgICAgZHFfZi0+cWxmX2Jsa25vLAorCQkJICAgICBYRlNfRlNCX1RPX0JCKG1wLCBkcV9mLT5xbGZfbGVuKSwKKwkJCSAgICAgMCwgJmJwKTsKKwlpZiAoZXJyb3IpIHsKKwkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfcmVjb3Zlcl9kby4uKHJlYWQjMykiLCBtcCwKKwkJCQkgIGJwLCBkcV9mLT5xbGZfYmxrbm8pOworCQlyZXR1cm4gZXJyb3I7CisJfQorCUFTU0VSVChicCk7CisJZGRxID0gKHhmc19kaXNrX2RxdW90X3QgKil4ZnNfYnVmX29mZnNldChicCwgZHFfZi0+cWxmX2JvZmZzZXQpOworCisJLyoKKwkgKiBBdCBsZWFzdCB0aGUgbWFnaWMgbnVtIHBvcnRpb24gc2hvdWxkIGJlIG9uIGRpc2sgYmVjYXVzZSB0aGlzCisJICogd2FzIGFtb25nIGEgY2h1bmsgb2YgZHF1b3RzIGNyZWF0ZWQgZWFybGllciwgYW5kIHdlIGRpZCBzb21lCisJICogbWluaW1hbCBpbml0aWFsaXphdGlvbiB0aGVuLgorCSAqLworCWlmICh4ZnNfcW1fZHFjaGVjayhkZHEsIGRxX2YtPnFsZl9pZCwgMCwgWEZTX1FNT1BUX0RPV0FSTiwKKwkJCSAgICJ4bG9nX3JlY292ZXJfZG9fZHF1b3RfdHJhbnMiKSkgeworCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCX0KKworCW1lbWNweShkZHEsIHJlY2RkcSwgaXRlbS0+cmlfYnVmWzFdLmlfbGVuKTsKKworCUFTU0VSVChkcV9mLT5xbGZfc2l6ZSA9PSAyKTsKKwlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgPT0gTlVMTCB8fAorCSAgICAgICBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX21vdW50X3QgKikgPT0gbXApOworCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgbXApOworCVhGU19CVUZfU0VUX0lPRE9ORV9GVU5DKGJwLCB4bG9nX3JlY292ZXJfaW9kb25lKTsKKwl4ZnNfYmR3cml0ZShtcCwgYnApOworCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gY3JlYXRlIGFuIGluLWNvcmUgZXh0ZW50IGZyZWUgaW50ZW50CisgKiBpdGVtIGZyb20gdGhlIGVmaSBmb3JtYXQgc3RydWN0dXJlIHdoaWNoIHdhcyBsb2dnZWQgb24gZGlzay4KKyAqIEl0IGFsbG9jYXRlcyBhbiBpbi1jb3JlIGVmaSwgY29waWVzIHRoZSBleHRlbnRzIGZyb20gdGhlIGZvcm1hdAorICogc3RydWN0dXJlIGludG8gaXQsIGFuZCBhZGRzIHRoZSBlZmkgdG8gdGhlIEFJTCB3aXRoIHRoZSBnaXZlbgorICogTFNOLgorICovCitTVEFUSUMgdm9pZAoreGxvZ19yZWNvdmVyX2RvX2VmaV90cmFucygKKwl4bG9nX3QJCQkqbG9nLAorCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW0sCisJeGZzX2xzbl90CQlsc24sCisJaW50CQkJcGFzcykKK3sKKwl4ZnNfbW91bnRfdAkJKm1wOworCXhmc19lZmlfbG9nX2l0ZW1fdAkqZWZpcDsKKwl4ZnNfZWZpX2xvZ19mb3JtYXRfdAkqZWZpX2Zvcm1hdHA7CisJU1BMREVDTChzKTsKKworCWlmIChwYXNzID09IFhMT0dfUkVDT1ZFUl9QQVNTMSkgeworCQlyZXR1cm47CisJfQorCisJZWZpX2Zvcm1hdHAgPSAoeGZzX2VmaV9sb2dfZm9ybWF0X3QgKilpdGVtLT5yaV9idWZbMF0uaV9hZGRyOworCUFTU0VSVChpdGVtLT5yaV9idWZbMF0uaV9sZW4gPT0KKwkgICAgICAgKHNpemVvZih4ZnNfZWZpX2xvZ19mb3JtYXRfdCkgKworCQkoKGVmaV9mb3JtYXRwLT5lZmlfbmV4dGVudHMgLSAxKSAqIHNpemVvZih4ZnNfZXh0ZW50X3QpKSkpOworCisJbXAgPSBsb2ctPmxfbXA7CisJZWZpcCA9IHhmc19lZmlfaW5pdChtcCwgZWZpX2Zvcm1hdHAtPmVmaV9uZXh0ZW50cyk7CisJbWVtY3B5KChjaGFyICopJihlZmlwLT5lZmlfZm9ybWF0KSwgKGNoYXIgKillZmlfZm9ybWF0cCwKKwkgICAgICBzaXplb2YoeGZzX2VmaV9sb2dfZm9ybWF0X3QpICsKKwkgICAgICAoKGVmaV9mb3JtYXRwLT5lZmlfbmV4dGVudHMgLSAxKSAqIHNpemVvZih4ZnNfZXh0ZW50X3QpKSk7CisJZWZpcC0+ZWZpX25leHRfZXh0ZW50ID0gZWZpX2Zvcm1hdHAtPmVmaV9uZXh0ZW50czsKKwllZmlwLT5lZmlfZmxhZ3MgfD0gWEZTX0VGSV9DT01NSVRURUQ7CisKKwlBSUxfTE9DSyhtcCxzKTsKKwkvKgorCSAqIHhmc190cmFuc191cGRhdGVfYWlsKCkgZHJvcHMgdGhlIEFJTCBsb2NrLgorCSAqLworCXhmc190cmFuc191cGRhdGVfYWlsKG1wLCAoeGZzX2xvZ19pdGVtX3QgKillZmlwLCBsc24sIHMpOworfQorCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gYW4gZWZkIGZvcm1hdCBzdHJ1Y3R1cmUgaXMgZm91bmQgaW4KKyAqIGEgY29tbWl0dGVkIHRyYW5zYWN0aW9uIGluIHRoZSBsb2cuICBJdCdzIHB1cnBvc2UgaXMgdG8gY2FuY2VsCisgKiB0aGUgY29ycmVzcG9uZGluZyBlZmkgaWYgaXQgd2FzIHN0aWxsIGluIHRoZSBsb2cuICBUbyBkbyB0aGlzCisgKiBpdCBzZWFyY2hlcyB0aGUgQUlMIGZvciB0aGUgZWZpIHdpdGggYW4gaWQgZXF1YWwgdG8gdGhhdCBpbiB0aGUKKyAqIGVmZCBmb3JtYXQgc3RydWN0dXJlLiAgSWYgd2UgZmluZCBpdCwgd2UgcmVtb3ZlIHRoZSBlZmkgZnJvbSB0aGUKKyAqIEFJTCBhbmQgZnJlZSBpdC4KKyAqLworU1RBVElDIHZvaWQKK3hsb2dfcmVjb3Zlcl9kb19lZmRfdHJhbnMoCisJeGxvZ190CQkJKmxvZywKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtLAorCWludAkJCXBhc3MpCit7CisJeGZzX21vdW50X3QJCSptcDsKKwl4ZnNfZWZkX2xvZ19mb3JtYXRfdAkqZWZkX2Zvcm1hdHA7CisJeGZzX2VmaV9sb2dfaXRlbV90CSplZmlwID0gTlVMTDsKKwl4ZnNfbG9nX2l0ZW1fdAkJKmxpcDsKKwlpbnQJCQlnZW47CisJaW50CQkJbmV4dHM7CisJX191aW50NjRfdAkJZWZpX2lkOworCVNQTERFQ0wocyk7CisKKwlpZiAocGFzcyA9PSBYTE9HX1JFQ09WRVJfUEFTUzEpIHsKKwkJcmV0dXJuOworCX0KKworCWVmZF9mb3JtYXRwID0gKHhmc19lZmRfbG9nX2Zvcm1hdF90ICopaXRlbS0+cmlfYnVmWzBdLmlfYWRkcjsKKwlBU1NFUlQoaXRlbS0+cmlfYnVmWzBdLmlfbGVuID09CisJICAgICAgIChzaXplb2YoeGZzX2VmZF9sb2dfZm9ybWF0X3QpICsKKwkJKChlZmRfZm9ybWF0cC0+ZWZkX25leHRlbnRzIC0gMSkgKiBzaXplb2YoeGZzX2V4dGVudF90KSkpKTsKKwllZmlfaWQgPSBlZmRfZm9ybWF0cC0+ZWZkX2VmaV9pZDsKKworCS8qCisJICogU2VhcmNoIGZvciB0aGUgZWZpIHdpdGggdGhlIGlkIGluIHRoZSBlZmQgZm9ybWF0IHN0cnVjdHVyZQorCSAqIGluIHRoZSBBSUwuCisJICovCisJbXAgPSBsb2ctPmxfbXA7CisJQUlMX0xPQ0sobXAscyk7CisJbGlwID0geGZzX3RyYW5zX2ZpcnN0X2FpbChtcCwgJmdlbik7CisJd2hpbGUgKGxpcCAhPSBOVUxMKSB7CisJCWlmIChsaXAtPmxpX3R5cGUgPT0gWEZTX0xJX0VGSSkgeworCQkJZWZpcCA9ICh4ZnNfZWZpX2xvZ19pdGVtX3QgKilsaXA7CisJCQlpZiAoZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfaWQgPT0gZWZpX2lkKSB7CisJCQkJLyoKKwkJCQkgKiB4ZnNfdHJhbnNfZGVsZXRlX2FpbCgpIGRyb3BzIHRoZQorCQkJCSAqIEFJTCBsb2NrLgorCQkJCSAqLworCQkJCXhmc190cmFuc19kZWxldGVfYWlsKG1wLCBsaXAsIHMpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWxpcCA9IHhmc190cmFuc19uZXh0X2FpbChtcCwgbGlwLCAmZ2VuLCBOVUxMKTsKKwl9CisJaWYgKGxpcCA9PSBOVUxMKSB7CisJCUFJTF9VTkxPQ0sobXAsIHMpOworCX0KKworCS8qCisJICogSWYgd2UgZm91bmQgaXQsIHRoZW4gZnJlZSBpdCB1cC4gIElmIGl0IHdhc24ndCB0aGVyZSwgaXQKKwkgKiBtdXN0IGhhdmUgYmVlbiBvdmVyd3JpdHRlbiBpbiB0aGUgbG9nLiAgT2ggd2VsbC4KKwkgKi8KKwlpZiAobGlwICE9IE5VTEwpIHsKKwkJbmV4dHMgPSBlZmlwLT5lZmlfZm9ybWF0LmVmaV9uZXh0ZW50czsKKwkJaWYgKG5leHRzID4gWEZTX0VGSV9NQVhfRkFTVF9FWFRFTlRTKSB7CisJCQlrbWVtX2ZyZWUobGlwLCBzaXplb2YoeGZzX2VmaV9sb2dfaXRlbV90KSArCisJCQkJICAoKG5leHRzIC0gMSkgKiBzaXplb2YoeGZzX2V4dGVudF90KSkpOworCQl9IGVsc2UgeworCQkJa21lbV96b25lX2ZyZWUoeGZzX2VmaV96b25lLCBlZmlwKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFBlcmZvcm0gdGhlIHRyYW5zYWN0aW9uCisgKgorICogSWYgdGhlIHRyYW5zYWN0aW9uIG1vZGlmaWVzIGEgYnVmZmVyIG9yIGlub2RlLCBkbyBpdCBub3cuICBPdGhlcndpc2UsCisgKiBFRklzIGFuZCBFRkRzIGdldCBxdWV1ZWQgdXAgYnkgYWRkaW5nIGVudHJpZXMgaW50byB0aGUgQUlMIGZvciB0aGVtLgorICovCitTVEFUSUMgaW50Cit4bG9nX3JlY292ZXJfZG9fdHJhbnMoCisJeGxvZ190CQkJKmxvZywKKwl4bG9nX3JlY292ZXJfdAkJKnRyYW5zLAorCWludAkJCXBhc3MpCit7CisJaW50CQkJZXJyb3IgPSAwOworCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW0sICpmaXJzdF9pdGVtOworCisJaWYgKChlcnJvciA9IHhsb2dfcmVjb3Zlcl9yZW9yZGVyX3RyYW5zKGxvZywgdHJhbnMpKSkKKwkJcmV0dXJuIGVycm9yOworCWZpcnN0X2l0ZW0gPSBpdGVtID0gdHJhbnMtPnJfaXRlbXE7CisJZG8geworCQkvKgorCQkgKiB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZSBibG9jayBudW1iZXIgYmVpbmcKKwkJICogdHJ1bmNhdGVkIGluID4gMSBUQiBidWZmZXJzIGJlY2F1c2UgaW4gdXNlci1sYW5kLAorCQkgKiB3ZSdyZSBub3cgbjMyIG9yIDY0LWJpdCBzbyB4ZnNfZGFkZHJfdCBpcyA2NC1iaXRzIHNvCisJCSAqIHRoZSBibGtubydzIHdpbGwgZ2V0IHRocm91Z2ggdGhlIHVzZXItbW9kZSBidWZmZXIKKwkJICogY2FjaGUgcHJvcGVybHkuICBUaGUgb25seSBiYWQgY2FzZSBpcyBvMzIga2VybmVscworCQkgKiB3aGVyZSB4ZnNfZGFkZHJfdCBpcyAzMi1iaXRzIGJ1dCBtb3VudCB3aWxsIHdhcm4gdXMKKwkJICogb2ZmIGEgPiAxIFRCIGZpbGVzeXN0ZW0gYmVmb3JlIHdlIGdldCBoZXJlLgorCQkgKi8KKwkJaWYgKChJVEVNX1RZUEUoaXRlbSkgPT0gWEZTX0xJX0JVRikgfHwKKwkJICAgIChJVEVNX1RZUEUoaXRlbSkgPT0gWEZTX0xJXzZfMV9CVUYpIHx8CisJCSAgICAoSVRFTV9UWVBFKGl0ZW0pID09IFhGU19MSV81XzNfQlVGKSkgeworCQkJaWYgICgoZXJyb3IgPSB4bG9nX3JlY292ZXJfZG9fYnVmZmVyX3RyYW5zKGxvZywgaXRlbSwKKwkJCQkJCQkJIHBhc3MpKSkKKwkJCQlicmVhazsKKwkJfSBlbHNlIGlmICgoSVRFTV9UWVBFKGl0ZW0pID09IFhGU19MSV9JTk9ERSkgfHwKKwkJCSAgIChJVEVNX1RZUEUoaXRlbSkgPT0gWEZTX0xJXzZfMV9JTk9ERSkgfHwKKwkJCSAgIChJVEVNX1RZUEUoaXRlbSkgPT0gWEZTX0xJXzVfM19JTk9ERSkpIHsKKwkJCWlmICgoZXJyb3IgPSB4bG9nX3JlY292ZXJfZG9faW5vZGVfdHJhbnMobG9nLCBpdGVtLAorCQkJCQkJCQlwYXNzKSkpCisJCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoSVRFTV9UWVBFKGl0ZW0pID09IFhGU19MSV9FRkkpIHsKKwkJCXhsb2dfcmVjb3Zlcl9kb19lZmlfdHJhbnMobG9nLCBpdGVtLCB0cmFucy0+cl9sc24sCisJCQkJCQkgIHBhc3MpOworCQl9IGVsc2UgaWYgKElURU1fVFlQRShpdGVtKSA9PSBYRlNfTElfRUZEKSB7CisJCQl4bG9nX3JlY292ZXJfZG9fZWZkX3RyYW5zKGxvZywgaXRlbSwgcGFzcyk7CisJCX0gZWxzZSBpZiAoSVRFTV9UWVBFKGl0ZW0pID09IFhGU19MSV9EUVVPVCkgeworCQkJaWYgKChlcnJvciA9IHhsb2dfcmVjb3Zlcl9kb19kcXVvdF90cmFucyhsb2csIGl0ZW0sCisJCQkJCQkJCSAgIHBhc3MpKSkKKwkJCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoKElURU1fVFlQRShpdGVtKSA9PSBYRlNfTElfUVVPVEFPRkYpKSB7CisJCQlpZiAoKGVycm9yID0geGxvZ19yZWNvdmVyX2RvX3F1b3Rhb2ZmX3RyYW5zKGxvZywgaXRlbSwKKwkJCQkJCQkJICAgcGFzcykpKQorCQkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCXhsb2dfd2FybigiWEZTOiB4bG9nX3JlY292ZXJfZG9fdHJhbnMiKTsKKwkJCUFTU0VSVCgwKTsKKwkJCWVycm9yID0gWEZTX0VSUk9SKEVJTyk7CisJCQlicmVhazsKKwkJfQorCQlpdGVtID0gaXRlbS0+cmlfbmV4dDsKKwl9IHdoaWxlIChmaXJzdF9pdGVtICE9IGl0ZW0pOworCisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogRnJlZSB1cCBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGUgdHJhbnNhY3Rpb24KKyAqCisgKiBSZW1lbWJlciB0aGF0IEVGSXMsIEVGRHMsIGFuZCBJVU5MSU5LcyBhcmUgaGFuZGxlZCBsYXRlci4KKyAqLworU1RBVElDIHZvaWQKK3hsb2dfcmVjb3Zlcl9mcmVlX3RyYW5zKAorCXhsb2dfcmVjb3Zlcl90CQkqdHJhbnMpCit7CisJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqZmlyc3RfaXRlbSwgKml0ZW0sICpmcmVlX2l0ZW07CisJaW50CQkJaTsKKworCWl0ZW0gPSBmaXJzdF9pdGVtID0gdHJhbnMtPnJfaXRlbXE7CisJZG8geworCQlmcmVlX2l0ZW0gPSBpdGVtOworCQlpdGVtID0gaXRlbS0+cmlfbmV4dDsKKwkJIC8qIEZyZWUgdGhlIHJlZ2lvbnMgaW4gdGhlIGl0ZW0uICovCisJCWZvciAoaSA9IDA7IGkgPCBmcmVlX2l0ZW0tPnJpX2NudDsgaSsrKSB7CisJCQlrbWVtX2ZyZWUoZnJlZV9pdGVtLT5yaV9idWZbaV0uaV9hZGRyLAorCQkJCSAgZnJlZV9pdGVtLT5yaV9idWZbaV0uaV9sZW4pOworCQl9CisJCS8qIEZyZWUgdGhlIGl0ZW0gaXRzZWxmICovCisJCWttZW1fZnJlZShmcmVlX2l0ZW0tPnJpX2J1ZiwKKwkJCSAgKGZyZWVfaXRlbS0+cmlfdG90YWwgKiBzaXplb2YoeGZzX2xvZ19pb3ZlY190KSkpOworCQlrbWVtX2ZyZWUoZnJlZV9pdGVtLCBzaXplb2YoeGxvZ19yZWNvdmVyX2l0ZW1fdCkpOworCX0gd2hpbGUgKGZpcnN0X2l0ZW0gIT0gaXRlbSk7CisJLyogRnJlZSB0aGUgdHJhbnNhY3Rpb24gcmVjb3ZlciBzdHJ1Y3R1cmUgKi8KKwlrbWVtX2ZyZWUodHJhbnMsIHNpemVvZih4bG9nX3JlY292ZXJfdCkpOworfQorCitTVEFUSUMgaW50Cit4bG9nX3JlY292ZXJfY29tbWl0X3RyYW5zKAorCXhsb2dfdAkJCSpsb2csCisJeGxvZ19yZWNvdmVyX3QJCSoqcSwKKwl4bG9nX3JlY292ZXJfdAkJKnRyYW5zLAorCWludAkJCXBhc3MpCit7CisJaW50CQkJZXJyb3I7CisKKwlpZiAoKGVycm9yID0geGxvZ19yZWNvdmVyX3VubGlua190aWQocSwgdHJhbnMpKSkKKwkJcmV0dXJuIGVycm9yOworCWlmICgoZXJyb3IgPSB4bG9nX3JlY292ZXJfZG9fdHJhbnMobG9nLCB0cmFucywgcGFzcykpKQorCQlyZXR1cm4gZXJyb3I7CisJeGxvZ19yZWNvdmVyX2ZyZWVfdHJhbnModHJhbnMpOwkJCS8qIG5vIGVycm9yICovCisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBpbnQKK3hsb2dfcmVjb3Zlcl91bm1vdW50X3RyYW5zKAorCXhsb2dfcmVjb3Zlcl90CQkqdHJhbnMpCit7CisJLyogRG8gbm90aGluZyBub3cgKi8KKwl4bG9nX3dhcm4oIlhGUzogeGxvZ19yZWNvdmVyX3VubW91bnRfdHJhbnM6IFVubW91bnQgTFIiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZXJlIGFyZSB0d28gdmFsaWQgc3RhdGVzIG9mIHRoZSByX3N0YXRlIGZpZWxkLiAgMCBpbmRpY2F0ZXMgdGhhdCB0aGUKKyAqIHRyYW5zYWN0aW9uIHN0cnVjdHVyZSBpcyBpbiBhIG5vcm1hbCBzdGF0ZS4gIFdlIGhhdmUgZWl0aGVyIHNlZW4gdGhlCisgKiBzdGFydCBvZiB0aGUgdHJhbnNhY3Rpb24gb3IgdGhlIGxhc3Qgb3BlcmF0aW9uIHdlIGFkZGVkIHdhcyBub3QgYSBwYXJ0aWFsCisgKiBvcGVyYXRpb24uICBJZiB0aGUgbGFzdCBvcGVyYXRpb24gd2UgYWRkZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHdhcyBhCisgKiBwYXJ0aWFsIG9wZXJhdGlvbiwgd2UgbmVlZCB0byBtYXJrIHJfc3RhdGUgd2l0aCBYTE9HX1dBU19DT05UX1RSQU5TLgorICoKKyAqIE5PVEU6IHNraXAgTFJzIHdpdGggMCBkYXRhIGxlbmd0aC4KKyAqLworU1RBVElDIGludAoreGxvZ19yZWNvdmVyX3Byb2Nlc3NfZGF0YSgKKwl4bG9nX3QJCQkqbG9nLAorCXhsb2dfcmVjb3Zlcl90CQkqcmhhc2hbXSwKKwl4bG9nX3JlY19oZWFkZXJfdAkqcmhlYWQsCisJeGZzX2NhZGRyX3QJCWRwLAorCWludAkJCXBhc3MpCit7CisJeGZzX2NhZGRyX3QJCWxwOworCWludAkJCW51bV9sb2dvcHM7CisJeGxvZ19vcF9oZWFkZXJfdAkqb2hlYWQ7CisJeGxvZ19yZWNvdmVyX3QJCSp0cmFuczsKKwl4bG9nX3RpZF90CQl0aWQ7CisJaW50CQkJZXJyb3I7CisJdW5zaWduZWQgbG9uZwkJaGFzaDsKKwl1aW50CQkJZmxhZ3M7CisKKwlscCA9IGRwICsgSU5UX0dFVChyaGVhZC0+aF9sZW4sIEFSQ0hfQ09OVkVSVCk7CisJbnVtX2xvZ29wcyA9IElOVF9HRVQocmhlYWQtPmhfbnVtX2xvZ29wcywgQVJDSF9DT05WRVJUKTsKKworCS8qIGNoZWNrIHRoZSBsb2cgZm9ybWF0IG1hdGNoZXMgb3VyIG93biAtIGVsc2Ugd2UgY2FuJ3QgcmVjb3ZlciAqLworCWlmICh4bG9nX2hlYWRlcl9jaGVja19yZWNvdmVyKGxvZy0+bF9tcCwgcmhlYWQpKQorCQlyZXR1cm4gKFhGU19FUlJPUihFSU8pKTsKKworCXdoaWxlICgoZHAgPCBscCkgJiYgbnVtX2xvZ29wcykgeworCQlBU1NFUlQoZHAgKyBzaXplb2YoeGxvZ19vcF9oZWFkZXJfdCkgPD0gbHApOworCQlvaGVhZCA9ICh4bG9nX29wX2hlYWRlcl90ICopZHA7CisJCWRwICs9IHNpemVvZih4bG9nX29wX2hlYWRlcl90KTsKKwkJaWYgKG9oZWFkLT5vaF9jbGllbnRpZCAhPSBYRlNfVFJBTlNBQ1RJT04gJiYKKwkJICAgIG9oZWFkLT5vaF9jbGllbnRpZCAhPSBYRlNfTE9HKSB7CisJCQl4bG9nX3dhcm4oCisJCSJYRlM6IHhsb2dfcmVjb3Zlcl9wcm9jZXNzX2RhdGE6IGJhZCBjbGllbnRpZCIpOworCQkJQVNTRVJUKDApOworCQkJcmV0dXJuIChYRlNfRVJST1IoRUlPKSk7CisJCX0KKwkJdGlkID0gSU5UX0dFVChvaGVhZC0+b2hfdGlkLCBBUkNIX0NPTlZFUlQpOworCQloYXNoID0gWExPR19SSEFTSCh0aWQpOworCQl0cmFucyA9IHhsb2dfcmVjb3Zlcl9maW5kX3RpZChyaGFzaFtoYXNoXSwgdGlkKTsKKwkJaWYgKHRyYW5zID09IE5VTEwpIHsJCSAgIC8qIG5vdCBmb3VuZDsgYWRkIG5ldyB0aWQgKi8KKwkJCWlmIChvaGVhZC0+b2hfZmxhZ3MgJiBYTE9HX1NUQVJUX1RSQU5TKQorCQkJCXhsb2dfcmVjb3Zlcl9uZXdfdGlkKCZyaGFzaFtoYXNoXSwgdGlkLAorCQkJCQlJTlRfR0VUKHJoZWFkLT5oX2xzbiwgQVJDSF9DT05WRVJUKSk7CisJCX0gZWxzZSB7CisJCQlBU1NFUlQoZHArSU5UX0dFVChvaGVhZC0+b2hfbGVuLCBBUkNIX0NPTlZFUlQpIDw9IGxwKTsKKwkJCWZsYWdzID0gb2hlYWQtPm9oX2ZsYWdzICYgflhMT0dfRU5EX1RSQU5TOworCQkJaWYgKGZsYWdzICYgWExPR19XQVNfQ09OVF9UUkFOUykKKwkJCQlmbGFncyAmPSB+WExPR19DT05USU5VRV9UUkFOUzsKKwkJCXN3aXRjaCAoZmxhZ3MpIHsKKwkJCWNhc2UgWExPR19DT01NSVRfVFJBTlM6CisJCQkJZXJyb3IgPSB4bG9nX3JlY292ZXJfY29tbWl0X3RyYW5zKGxvZywKKwkJCQkJCSZyaGFzaFtoYXNoXSwgdHJhbnMsIHBhc3MpOworCQkJCWJyZWFrOworCQkJY2FzZSBYTE9HX1VOTU9VTlRfVFJBTlM6CisJCQkJZXJyb3IgPSB4bG9nX3JlY292ZXJfdW5tb3VudF90cmFucyh0cmFucyk7CisJCQkJYnJlYWs7CisJCQljYXNlIFhMT0dfV0FTX0NPTlRfVFJBTlM6CisJCQkJZXJyb3IgPSB4bG9nX3JlY292ZXJfYWRkX3RvX2NvbnRfdHJhbnModHJhbnMsCisJCQkJCQlkcCwgSU5UX0dFVChvaGVhZC0+b2hfbGVuLAorCQkJCQkJCUFSQ0hfQ09OVkVSVCkpOworCQkJCWJyZWFrOworCQkJY2FzZSBYTE9HX1NUQVJUX1RSQU5TOgorCQkJCXhsb2dfd2FybigKKwkJCSJYRlM6IHhsb2dfcmVjb3Zlcl9wcm9jZXNzX2RhdGE6IGJhZCB0cmFuc2FjdGlvbiIpOworCQkJCUFTU0VSVCgwKTsKKwkJCQllcnJvciA9IFhGU19FUlJPUihFSU8pOworCQkJCWJyZWFrOworCQkJY2FzZSAwOgorCQkJY2FzZSBYTE9HX0NPTlRJTlVFX1RSQU5TOgorCQkJCWVycm9yID0geGxvZ19yZWNvdmVyX2FkZF90b190cmFucyh0cmFucywKKwkJCQkJCWRwLCBJTlRfR0VUKG9oZWFkLT5vaF9sZW4sCisJCQkJCQkJQVJDSF9DT05WRVJUKSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXhsb2dfd2FybigKKwkJCSJYRlM6IHhsb2dfcmVjb3Zlcl9wcm9jZXNzX2RhdGE6IGJhZCBmbGFnIik7CisJCQkJQVNTRVJUKDApOworCQkJCWVycm9yID0gWEZTX0VSUk9SKEVJTyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuIGVycm9yOworCQl9CisJCWRwICs9IElOVF9HRVQob2hlYWQtPm9oX2xlbiwgQVJDSF9DT05WRVJUKTsKKwkJbnVtX2xvZ29wcy0tOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFByb2Nlc3MgYW4gZXh0ZW50IGZyZWUgaW50ZW50IGl0ZW0gdGhhdCB3YXMgcmVjb3ZlcmVkIGZyb20KKyAqIHRoZSBsb2cuICBXZSBuZWVkIHRvIGZyZWUgdGhlIGV4dGVudHMgdGhhdCBpdCBkZXNjcmliZXMuCisgKi8KK1NUQVRJQyB2b2lkCit4bG9nX3JlY292ZXJfcHJvY2Vzc19lZmkoCisJeGZzX21vdW50X3QJCSptcCwKKwl4ZnNfZWZpX2xvZ19pdGVtX3QJKmVmaXApCit7CisJeGZzX2VmZF9sb2dfaXRlbV90CSplZmRwOworCXhmc190cmFuc190CQkqdHA7CisJaW50CQkJaTsKKwl4ZnNfZXh0ZW50X3QJCSpleHRwOworCXhmc19mc2Jsb2NrX3QJCXN0YXJ0YmxvY2tfZnNiOworCisJQVNTRVJUKCEoZWZpcC0+ZWZpX2ZsYWdzICYgWEZTX0VGSV9SRUNPVkVSRUQpKTsKKworCS8qCisJICogRmlyc3QgY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBleHRlbnRzIGRlc2NyaWJlZCBieSB0aGUKKwkgKiBFRkkuICBJZiBhbnkgYXJlIGJhZCwgdGhlbiBhc3N1bWUgdGhhdCBhbGwgYXJlIGJhZCBhbmQKKwkgKiBqdXN0IHRvc3MgdGhlIEVGSS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfbmV4dGVudHM7IGkrKykgeworCQlleHRwID0gJihlZmlwLT5lZmlfZm9ybWF0LmVmaV9leHRlbnRzW2ldKTsKKwkJc3RhcnRibG9ja19mc2IgPSBYRlNfQkJfVE9fRlNCKG1wLAorCQkJCSAgIFhGU19GU0JfVE9fREFERFIobXAsIGV4dHAtPmV4dF9zdGFydCkpOworCQlpZiAoKHN0YXJ0YmxvY2tfZnNiID09IDApIHx8CisJCSAgICAoZXh0cC0+ZXh0X2xlbiA9PSAwKSB8fAorCQkgICAgKHN0YXJ0YmxvY2tfZnNiID49IG1wLT5tX3NiLnNiX2RibG9ja3MpIHx8CisJCSAgICAoZXh0cC0+ZXh0X2xlbiA+PSBtcC0+bV9zYi5zYl9hZ2Jsb2NrcykpIHsKKwkJCS8qCisJCQkgKiBUaGlzIHdpbGwgcHVsbCB0aGUgRUZJIGZyb20gdGhlIEFJTCBhbmQKKwkJCSAqIGZyZWUgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggaXQuCisJCQkgKi8KKwkJCXhmc19lZmlfcmVsZWFzZShlZmlwLCBlZmlwLT5lZmlfZm9ybWF0LmVmaV9uZXh0ZW50cyk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgMCk7CisJeGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIFhGU19JVFJVTkNBVEVfTE9HX1JFUyhtcCksIDAsIDAsIDApOworCWVmZHAgPSB4ZnNfdHJhbnNfZ2V0X2VmZCh0cCwgZWZpcCwgZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfbmV4dGVudHMpOworCisJZm9yIChpID0gMDsgaSA8IGVmaXAtPmVmaV9mb3JtYXQuZWZpX25leHRlbnRzOyBpKyspIHsKKwkJZXh0cCA9ICYoZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfZXh0ZW50c1tpXSk7CisJCXhmc19mcmVlX2V4dGVudCh0cCwgZXh0cC0+ZXh0X3N0YXJ0LCBleHRwLT5leHRfbGVuKTsKKwkJeGZzX3RyYW5zX2xvZ19lZmRfZXh0ZW50KHRwLCBlZmRwLCBleHRwLT5leHRfc3RhcnQsCisJCQkJCSBleHRwLT5leHRfbGVuKTsKKwl9CisKKwllZmlwLT5lZmlfZmxhZ3MgfD0gWEZTX0VGSV9SRUNPVkVSRUQ7CisJeGZzX3RyYW5zX2NvbW1pdCh0cCwgMCwgTlVMTCk7Cit9CisKKy8qCisgKiBWZXJpZnkgdGhhdCBvbmNlIHdlJ3ZlIGVuY291bnRlcmVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGFuIEVGSQorICogaW4gdGhlIEFJTCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIEVGSXMgaW4gdGhlIEFJTC4KKyAqLworI2lmIGRlZmluZWQoREVCVUcpCitTVEFUSUMgdm9pZAoreGxvZ19yZWNvdmVyX2NoZWNrX2FpbCgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXhmc19sb2dfaXRlbV90CQkqbGlwLAorCWludAkJCWdlbikKK3sKKwlpbnQJCQlvcmlnX2dlbiA9IGdlbjsKKworCWRvIHsKKwkJQVNTRVJUKGxpcC0+bGlfdHlwZSAhPSBYRlNfTElfRUZJKTsKKwkJbGlwID0geGZzX3RyYW5zX25leHRfYWlsKG1wLCBsaXAsICZnZW4sIE5VTEwpOworCQkvKgorCQkgKiBUaGUgY2hlY2sgd2lsbCBiZSBib2d1cyBpZiB3ZSByZXN0YXJ0IGZyb20gdGhlCisJCSAqIGJlZ2lubmluZyBvZiB0aGUgQUlMLCBzbyBBU1NFUlQgdGhhdCB3ZSBkb24ndC4KKwkJICogV2UgbmV2ZXIgc2hvdWxkIHNpbmNlIHdlJ3JlIGhvbGRpbmcgdGhlIEFJTCBsb2NrCisJCSAqIHRoZSBlbnRpcmUgdGltZS4KKwkJICovCisJCUFTU0VSVChnZW4gPT0gb3JpZ19nZW4pOworCX0gd2hpbGUgKGxpcCAhPSBOVUxMKTsKK30KKyNlbmRpZgkvKiBERUJVRyAqLworCisvKgorICogV2hlbiB0aGlzIGlzIGNhbGxlZCwgYWxsIG9mIHRoZSBFRklzIHdoaWNoIGRpZCBub3QgaGF2ZQorICogY29ycmVzcG9uZGluZyBFRkRzIHNob3VsZCBiZSBpbiB0aGUgQUlMLiAgV2hhdCB3ZSBkbyBub3cKKyAqIGlzIGZyZWUgdGhlIGV4dGVudHMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggb25lLgorICoKKyAqIFNpbmNlIHdlIHByb2Nlc3MgdGhlIEVGSXMgaW4gbm9ybWFsIHRyYW5zYWN0aW9ucywgdGhleQorICogd2lsbCBiZSByZW1vdmVkIGF0IHNvbWUgcG9pbnQgYWZ0ZXIgdGhlIGNvbW1pdC4gIFRoaXMgcHJldmVudHMKKyAqIHVzIGZyb20ganVzdCB3YWxraW5nIGRvd24gdGhlIGxpc3QgcHJvY2Vzc2luZyBlYWNoIG9uZS4KKyAqIFdlJ2xsIHVzZSBhIGZsYWcgaW4gdGhlIEVGSSB0byBza2lwIHRob3NlIHRoYXQgd2UndmUgYWxyZWFkeQorICogcHJvY2Vzc2VkIGFuZCB1c2UgdGhlIEFJTCBpdGVyYXRpb24gbWVjaGFuaXNtJ3MgZ2VuZXJhdGlvbgorICogY291bnQgdG8gdHJ5IHRvIHNwZWVkIHRoaXMgdXAgYXQgbGVhc3QgYSBiaXQuCisgKgorICogV2hlbiB3ZSBzdGFydCwgd2Uga25vdyB0aGF0IHRoZSBFRklzIGFyZSB0aGUgb25seSB0aGluZ3MgaW4KKyAqIHRoZSBBSUwuICBBcyB3ZSBwcm9jZXNzIHRoZW0sIGhvd2V2ZXIsIG90aGVyIGl0ZW1zIGFyZSBhZGRlZAorICogdG8gdGhlIEFJTC4gIFNpbmNlIGV2ZXJ5dGhpbmcgYWRkZWQgdG8gdGhlIEFJTCBtdXN0IGNvbWUgYWZ0ZXIKKyAqIGV2ZXJ5dGhpbmcgYWxyZWFkeSBpbiB0aGUgQUlMLCB3ZSBzdG9wIHByb2Nlc3NpbmcgYXMgc29vbiBhcworICogd2Ugc2VlIHNvbWV0aGluZyBvdGhlciB0aGFuIGFuIEVGSSBpbiB0aGUgQUlMLgorICovCitTVEFUSUMgdm9pZAoreGxvZ19yZWNvdmVyX3Byb2Nlc3NfZWZpcygKKwl4bG9nX3QJCQkqbG9nKQoreworCXhmc19sb2dfaXRlbV90CQkqbGlwOworCXhmc19lZmlfbG9nX2l0ZW1fdAkqZWZpcDsKKwlpbnQJCQlnZW47CisJeGZzX21vdW50X3QJCSptcDsKKwlTUExERUNMKHMpOworCisJbXAgPSBsb2ctPmxfbXA7CisJQUlMX0xPQ0sobXAscyk7CisKKwlsaXAgPSB4ZnNfdHJhbnNfZmlyc3RfYWlsKG1wLCAmZ2VuKTsKKwl3aGlsZSAobGlwICE9IE5VTEwpIHsKKwkJLyoKKwkJICogV2UncmUgZG9uZSB3aGVuIHdlIHNlZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiBFRkkuCisJCSAqLworCQlpZiAobGlwLT5saV90eXBlICE9IFhGU19MSV9FRkkpIHsKKwkJCXhsb2dfcmVjb3Zlcl9jaGVja19haWwobXAsIGxpcCwgZ2VuKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogU2tpcCBFRklzIHRoYXQgd2UndmUgYWxyZWFkeSBwcm9jZXNzZWQuCisJCSAqLworCQllZmlwID0gKHhmc19lZmlfbG9nX2l0ZW1fdCAqKWxpcDsKKwkJaWYgKGVmaXAtPmVmaV9mbGFncyAmIFhGU19FRklfUkVDT1ZFUkVEKSB7CisJCQlsaXAgPSB4ZnNfdHJhbnNfbmV4dF9haWwobXAsIGxpcCwgJmdlbiwgTlVMTCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCUFJTF9VTkxPQ0sobXAsIHMpOworCQl4bG9nX3JlY292ZXJfcHJvY2Vzc19lZmkobXAsIGVmaXApOworCQlBSUxfTE9DSyhtcCxzKTsKKwkJbGlwID0geGZzX3RyYW5zX25leHRfYWlsKG1wLCBsaXAsICZnZW4sIE5VTEwpOworCX0KKwlBSUxfVU5MT0NLKG1wLCBzKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhIHRyYW5zYWN0aW9uIHRvIG51bGwgb3V0IGEgYmFkIGlub2RlIHBvaW50ZXIKKyAqIGluIGFuIGFnaSB1bmxpbmtlZCBpbm9kZSBoYXNoIGJ1Y2tldC4KKyAqLworU1RBVElDIHZvaWQKK3hsb2dfcmVjb3Zlcl9jbGVhcl9hZ2lfYnVja2V0KAorCXhmc19tb3VudF90CSptcCwKKwl4ZnNfYWdudW1iZXJfdAlhZ25vLAorCWludAkJYnVja2V0KQoreworCXhmc190cmFuc190CSp0cDsKKwl4ZnNfYWdpX3QJKmFnaTsKKwl4ZnNfYnVmX3QJKmFnaWJwOworCWludAkJb2Zmc2V0OworCWludAkJZXJyb3I7CisKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX0NMRUFSX0FHSV9CVUNLRVQpOworCXhmc190cmFuc19yZXNlcnZlKHRwLCAwLCBYRlNfQ0xFQVJfQUdJX0JVQ0tFVF9MT0dfUkVTKG1wKSwgMCwgMCwgMCk7CisKKwllcnJvciA9IHhmc190cmFuc19yZWFkX2J1ZihtcCwgdHAsIG1wLT5tX2RkZXZfdGFyZ3AsCisJCQkJICAgWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBYRlNfQUdJX0RBRERSKG1wKSksCisJCQkJICAgWEZTX0ZTU19UT19CQihtcCwgMSksIDAsICZhZ2licCk7CisJaWYgKGVycm9yKSB7CisJCXhmc190cmFuc19jYW5jZWwodHAsIFhGU19UUkFOU19BQk9SVCk7CisJCXJldHVybjsKKwl9CisKKwlhZ2kgPSBYRlNfQlVGX1RPX0FHSShhZ2licCk7CisJaWYgKElOVF9HRVQoYWdpLT5hZ2lfbWFnaWNudW0sIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0FHSV9NQUdJQykgeworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBYRlNfVFJBTlNfQUJPUlQpOworCQlyZXR1cm47CisJfQorCUFTU0VSVChJTlRfR0VUKGFnaS0+YWdpX21hZ2ljbnVtLCBBUkNIX0NPTlZFUlQpID09IFhGU19BR0lfTUFHSUMpOworCisJSU5UX1NFVChhZ2ktPmFnaV91bmxpbmtlZFtidWNrZXRdLCBBUkNIX0NPTlZFUlQsIE5VTExBR0lOTyk7CisJb2Zmc2V0ID0gb2Zmc2V0b2YoeGZzX2FnaV90LCBhZ2lfdW5saW5rZWQpICsKKwkJIChzaXplb2YoeGZzX2FnaW5vX3QpICogYnVja2V0KTsKKwl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYWdpYnAsIG9mZnNldCwKKwkJCSAgKG9mZnNldCArIHNpemVvZih4ZnNfYWdpbm9fdCkgLSAxKSk7CisKKwkodm9pZCkgeGZzX3RyYW5zX2NvbW1pdCh0cCwgMCwgTlVMTCk7Cit9CisKKy8qCisgKiB4bG9nX2l1bmxpbmtfcmVjb3ZlcgorICoKKyAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyByZWNvdmVyeSB0byBwcm9jZXNzIGFueSBpbm9kZXMgd2hpY2gKKyAqIHdlIHVubGlua2VkIGJ1dCBub3QgZnJlZWQgd2hlbiB0aGUgc3lzdGVtIGNyYXNoZWQuICBUaGVzZQorICogaW5vZGVzIHdpbGwgYmUgb24gdGhlIGxpc3RzIGluIHRoZSBBR0kgYmxvY2tzLiAgV2hhdCB3ZSBkbworICogaGVyZSBpcyBzY2FuIGFsbCB0aGUgQUdJcyBhbmQgZnVsbHkgdHJ1bmNhdGUgYW5kIGZyZWUgYW55CisgKiBpbm9kZXMgZm91bmQgb24gdGhlIGxpc3RzLiAgRWFjaCBpbm9kZSBpcyByZW1vdmVkIGZyb20gdGhlCisgKiBsaXN0cyB3aGVuIGl0IGhhcyBiZWVuIGZ1bGx5IHRydW5jYXRlZCBhbmQgaXMgZnJlZWQuICBUaGUKKyAqIGZyZWVpbmcgb2YgdGhlIGlub2RlIGFuZCBpdHMgcmVtb3ZhbCBmcm9tIHRoZSBsaXN0IG11c3QgYmUKKyAqIGF0b21pYy4KKyAqLwordm9pZAoreGxvZ19yZWNvdmVyX3Byb2Nlc3NfaXVubGlua3MoCisJeGxvZ190CQkqbG9nKQoreworCXhmc19tb3VudF90CSptcDsKKwl4ZnNfYWdudW1iZXJfdAlhZ25vOworCXhmc19hZ2lfdAkqYWdpOworCXhmc19idWZfdAkqYWdpYnA7CisJeGZzX2J1Zl90CSppYnA7CisJeGZzX2Rpbm9kZV90CSpkaXA7CisJeGZzX2lub2RlX3QJKmlwOworCXhmc19hZ2lub190CWFnaW5vOworCXhmc19pbm9fdAlpbm87CisJaW50CQlidWNrZXQ7CisJaW50CQllcnJvcjsKKwl1aW50CQltcF9kbWV2bWFzazsKKworCW1wID0gbG9nLT5sX21wOworCisJLyoKKwkgKiBQcmV2ZW50IGFueSBETUFQSSBldmVudCBmcm9tIGJlaW5nIHNlbnQgd2hpbGUgaW4gdGhpcyBmdW5jdGlvbi4KKwkgKi8KKwltcF9kbWV2bWFzayA9IG1wLT5tX2RtZXZtYXNrOworCW1wLT5tX2RtZXZtYXNrID0gMDsKKworCWZvciAoYWdubyA9IDA7IGFnbm8gPCBtcC0+bV9zYi5zYl9hZ2NvdW50OyBhZ25vKyspIHsKKwkJLyoKKwkJICogRmluZCB0aGUgYWdpIGZvciB0aGlzIGFnLgorCQkgKi8KKwkJYWdpYnAgPSB4ZnNfYnVmX3JlYWQobXAtPm1fZGRldl90YXJncCwKKwkJCQlYRlNfQUdfREFERFIobXAsIGFnbm8sIFhGU19BR0lfREFERFIobXApKSwKKwkJCQlYRlNfRlNTX1RPX0JCKG1wLCAxKSwgMCk7CisJCWlmIChYRlNfQlVGX0lTRVJST1IoYWdpYnApKSB7CisJCQl4ZnNfaW9lcnJvcl9hbGVydCgieGxvZ19yZWNvdmVyX3Byb2Nlc3NfaXVubGlua3MoIzEpIiwKKwkJCQlsb2ctPmxfbXAsIGFnaWJwLAorCQkJCVhGU19BR19EQUREUihtcCwgYWdubywgWEZTX0FHSV9EQUREUihtcCkpKTsKKwkJfQorCQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShhZ2licCk7CisJCUFTU0VSVChYRlNfQUdJX01BR0lDID09CisJCQlJTlRfR0VUKGFnaS0+YWdpX21hZ2ljbnVtLCBBUkNIX0NPTlZFUlQpKTsKKworCQlmb3IgKGJ1Y2tldCA9IDA7IGJ1Y2tldCA8IFhGU19BR0lfVU5MSU5LRURfQlVDS0VUUzsgYnVja2V0KyspIHsKKworCQkJYWdpbm8gPSBJTlRfR0VUKGFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF0sIEFSQ0hfQ09OVkVSVCk7CisJCQl3aGlsZSAoYWdpbm8gIT0gTlVMTEFHSU5PKSB7CisKKwkJCQkvKgorCQkJCSAqIFJlbGVhc2UgdGhlIGFnaSBidWZmZXIgc28gdGhhdCBpdCBjYW4KKwkJCQkgKiBiZSBhY3F1aXJlZCBpbiB0aGUgbm9ybWFsIGNvdXJzZSBvZiB0aGUKKwkJCQkgKiB0cmFuc2FjdGlvbiB0byB0cnVuY2F0ZSBhbmQgZnJlZSB0aGUgaW5vZGUuCisJCQkJICovCisJCQkJeGZzX2J1Zl9yZWxzZShhZ2licCk7CisKKwkJCQlpbm8gPSBYRlNfQUdJTk9fVE9fSU5PKG1wLCBhZ25vLCBhZ2lubyk7CisJCQkJZXJyb3IgPSB4ZnNfaWdldChtcCwgTlVMTCwgaW5vLCAwLCAwLCAmaXAsIDApOworCQkJCUFTU0VSVChlcnJvciB8fCAoaXAgIT0gTlVMTCkpOworCisJCQkJaWYgKCFlcnJvcikgeworCQkJCQkvKgorCQkJCQkgKiBHZXQgdGhlIG9uIGRpc2sgaW5vZGUgdG8gZmluZCB0aGUKKwkJCQkJICogbmV4dCBpbm9kZSBpbiB0aGUgYnVja2V0LgorCQkJCQkgKi8KKwkJCQkJZXJyb3IgPSB4ZnNfaXRvYnAobXAsIE5VTEwsIGlwLCAmZGlwLAorCQkJCQkJCSZpYnAsIDApOworCQkJCQlBU1NFUlQoZXJyb3IgfHwgKGRpcCAhPSBOVUxMKSk7CisJCQkJfQorCisJCQkJaWYgKCFlcnJvcikgeworCQkJCQlBU1NFUlQoaXAtPmlfZC5kaV9ubGluayA9PSAwKTsKKworCQkJCQkvKiBzZXR1cCBmb3IgdGhlIG5leHQgcGFzcyAqLworCQkJCQlhZ2lubyA9IElOVF9HRVQoZGlwLT5kaV9uZXh0X3VubGlua2VkLAorCQkJCQkJCUFSQ0hfQ09OVkVSVCk7CisJCQkJCXhmc19idWZfcmVsc2UoaWJwKTsKKwkJCQkJLyoKKwkJCQkJICogUHJldmVudCBhbnkgRE1BUEkgZXZlbnQgZnJvbQorCQkJCQkgKiBiZWluZyBzZW50IHdoZW4gdGhlCisJCQkJCSAqIHJlZmVyZW5jZSBvbiB0aGUgaW5vZGUgaXMKKwkJCQkJICogZHJvcHBlZC4KKwkJCQkJICovCisJCQkJCWlwLT5pX2QuZGlfZG1ldm1hc2sgPSAwOworCisJCQkJCS8qCisJCQkJCSAqIElmIHRoaXMgaXMgYSBuZXcgaW5vZGUsIGhhbmRsZQorCQkJCQkgKiBpdCBzcGVjaWFsbHkuICBPdGhlcndpc2UsCisJCQkJCSAqIGp1c3QgZHJvcCBvdXIgcmVmZXJlbmNlIHRvIHRoZQorCQkJCQkgKiBpbm9kZS4gIElmIHRoZXJlIGFyZSBubworCQkJCQkgKiBvdGhlciByZWZlcmVuY2VzLCB0aGlzIHdpbGwKKwkJCQkJICogc2VuZCB0aGUgaW5vZGUgdG8KKwkJCQkJICogeGZzX2luYWN0aXZlKCkgd2hpY2ggd2lsbAorCQkJCQkgKiB0cnVuY2F0ZSB0aGUgZmlsZSBhbmQgZnJlZQorCQkJCQkgKiB0aGUgaW5vZGUuCisJCQkJCSAqLworCQkJCQlpZiAoaXAtPmlfZC5kaV9tb2RlID09IDApCisJCQkJCQl4ZnNfaXB1dF9uZXcoaXAsIDApOworCQkJCQllbHNlCisJCQkJCQlWTl9SRUxFKFhGU19JVE9WKGlwKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyoKKwkJCQkJICogV2UgY2FuJ3QgcmVhZCBpbiB0aGUgaW5vZGUKKwkJCQkJICogdGhpcyBidWNrZXQgcG9pbnRzIHRvLCBvcgorCQkJCQkgKiB0aGlzIGlub2RlIGlzIG1lc3NlZCB1cC4gIEp1c3QKKwkJCQkJICogZGl0Y2ggdGhpcyBidWNrZXQgb2YgaW5vZGVzLiAgV2UKKwkJCQkJICogd2lsbCBsb3NlIHNvbWUgaW5vZGVzIGFuZCBzcGFjZSwKKwkJCQkJICogYnV0IGF0IGxlYXN0IHdlIHdvbid0IGhhbmcuICBDYWxsCisJCQkJCSAqIHhsb2dfcmVjb3Zlcl9jbGVhcl9hZ2lfYnVja2V0KCkKKwkJCQkJICogdG8gcGVyZm9ybSBhIHRyYW5zYWN0aW9uIHRvIGNsZWFyCisJCQkJCSAqIHRoZSBpbm9kZSBwb2ludGVyIGluIHRoZSBidWNrZXQuCisJCQkJCSAqLworCQkJCQl4bG9nX3JlY292ZXJfY2xlYXJfYWdpX2J1Y2tldChtcCwgYWdubywKKwkJCQkJCQlidWNrZXQpOworCisJCQkJCWFnaW5vID0gTlVMTEFHSU5POworCQkJCX0KKworCQkJCS8qCisJCQkJICogUmVhY3F1aXJlIHRoZSBhZ2lidWZmZXIgYW5kIGNvbnRpbnVlIGFyb3VuZAorCQkJCSAqIHRoZSBsb29wLgorCQkJCSAqLworCQkJCWFnaWJwID0geGZzX2J1Zl9yZWFkKG1wLT5tX2RkZXZfdGFyZ3AsCisJCQkJCQlYRlNfQUdfREFERFIobXAsIGFnbm8sCisJCQkJCQkJWEZTX0FHSV9EQUREUihtcCkpLAorCQkJCQkJWEZTX0ZTU19UT19CQihtcCwgMSksIDApOworCQkJCWlmIChYRlNfQlVGX0lTRVJST1IoYWdpYnApKSB7CisJCQkJCXhmc19pb2Vycm9yX2FsZXJ0KAorCQkJCSJ4bG9nX3JlY292ZXJfcHJvY2Vzc19pdW5saW5rcygjMikiLAorCQkJCQkJbG9nLT5sX21wLCBhZ2licCwKKwkJCQkJCVhGU19BR19EQUREUihtcCwgYWdubywKKwkJCQkJCQlYRlNfQUdJX0RBRERSKG1wKSkpOworCQkJCX0KKwkJCQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShhZ2licCk7CisJCQkJQVNTRVJUKFhGU19BR0lfTUFHSUMgPT0gSU5UX0dFVCgKKwkJCQkJYWdpLT5hZ2lfbWFnaWNudW0sIEFSQ0hfQ09OVkVSVCkpOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogUmVsZWFzZSB0aGUgYnVmZmVyIGZvciB0aGUgY3VycmVudCBhZ2kgc28gd2UgY2FuCisJCSAqIGdvIG9uIHRvIHRoZSBuZXh0IG9uZS4KKwkJICovCisJCXhmc19idWZfcmVsc2UoYWdpYnApOworCX0KKworCW1wLT5tX2RtZXZtYXNrID0gbXBfZG1ldm1hc2s7Cit9CisKKworI2lmZGVmIERFQlVHCitTVEFUSUMgdm9pZAoreGxvZ19wYWNrX2RhdGFfY2hlY2tzdW0oCisJeGxvZ190CQkqbG9nLAorCXhsb2dfaW5fY29yZV90CSppY2xvZywKKwlpbnQJCXNpemUpCit7CisJaW50CQlpOworCXVpbnQJCSp1cDsKKwl1aW50CQljaGtzdW0gPSAwOworCisJdXAgPSAodWludCAqKWljbG9nLT5pY19kYXRhcDsKKwkvKiBkaXZpZGUgbGVuZ3RoIGJ5IDQgdG8gZ2V0ICMgd29yZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgKHNpemUgPj4gMik7IGkrKykgeworCQljaGtzdW0gXj0gSU5UX0dFVCgqdXAsIEFSQ0hfQ09OVkVSVCk7CisJCXVwKys7CisJfQorCUlOVF9TRVQoaWNsb2ctPmljX2hlYWRlci5oX2Noa3N1bSwgQVJDSF9DT05WRVJULCBjaGtzdW0pOworfQorI2Vsc2UKKyNkZWZpbmUgeGxvZ19wYWNrX2RhdGFfY2hlY2tzdW0obG9nLCBpY2xvZywgc2l6ZSkKKyNlbmRpZgorCisvKgorICogU3RhbXAgY3ljbGUgbnVtYmVyIGluIGV2ZXJ5IGJsb2NrCisgKi8KK3ZvaWQKK3hsb2dfcGFja19kYXRhKAorCXhsb2dfdAkJCSpsb2csCisJeGxvZ19pbl9jb3JlX3QJCSppY2xvZywKKwlpbnQJCQlyb3VuZG9mZikKK3sKKwlpbnQJCQlpLCBqLCBrOworCWludAkJCXNpemUgPSBpY2xvZy0+aWNfb2Zmc2V0ICsgcm91bmRvZmY7CisJdWludAkJCWN5Y2xlX2xzbjsKKwl4ZnNfY2FkZHJfdAkJZHA7CisJeGxvZ19pbl9jb3JlXzJfdAkqeGhkcjsKKworCXhsb2dfcGFja19kYXRhX2NoZWNrc3VtKGxvZywgaWNsb2csIHNpemUpOworCisJY3ljbGVfbHNuID0gQ1lDTEVfTFNOX0RJU0soaWNsb2ctPmljX2hlYWRlci5oX2xzbik7CisKKwlkcCA9IGljbG9nLT5pY19kYXRhcDsKKwlmb3IgKGkgPSAwOyBpIDwgQlRPQkIoc2l6ZSkgJiYKKwkJaSA8IChYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFKTsgaSsrKSB7CisJCWljbG9nLT5pY19oZWFkZXIuaF9jeWNsZV9kYXRhW2ldID0gKih1aW50ICopZHA7CisJCSoodWludCAqKWRwID0gY3ljbGVfbHNuOworCQlkcCArPSBCQlNJWkU7CisJfQorCisJaWYgKFhGU19TQl9WRVJTSU9OX0hBU0xPR1YyKCZsb2ctPmxfbXAtPm1fc2IpKSB7CisJCXhoZHIgPSAoeGxvZ19pbl9jb3JlXzJfdCAqKSZpY2xvZy0+aWNfaGVhZGVyOworCQlmb3IgKCA7IGkgPCBCVE9CQihzaXplKTsgaSsrKSB7CisJCQlqID0gaSAvIChYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFKTsKKwkJCWsgPSBpICUgKFhMT0dfSEVBREVSX0NZQ0xFX1NJWkUgLyBCQlNJWkUpOworCQkJeGhkcltqXS5oaWNfeGhlYWRlci54aF9jeWNsZV9kYXRhW2tdID0gKih1aW50ICopZHA7CisJCQkqKHVpbnQgKilkcCA9IGN5Y2xlX2xzbjsKKwkJCWRwICs9IEJCU0laRTsKKwkJfQorCisJCWZvciAoaSA9IDE7IGkgPCBsb2ctPmxfaWNsb2dfaGVhZHM7IGkrKykgeworCQkJeGhkcltpXS5oaWNfeGhlYWRlci54aF9jeWNsZSA9IGN5Y2xlX2xzbjsKKwkJfQorCX0KK30KKworI2lmIGRlZmluZWQoREVCVUcpICYmIGRlZmluZWQoWEZTX0xPVURfUkVDT1ZFUlkpCitTVEFUSUMgdm9pZAoreGxvZ191bnBhY2tfZGF0YV9jaGVja3N1bSgKKwl4bG9nX3JlY19oZWFkZXJfdAkqcmhlYWQsCisJeGZzX2NhZGRyX3QJCWRwLAorCXhsb2dfdAkJCSpsb2cpCit7CisJdWludAkJCSp1cCA9ICh1aW50ICopZHA7CisJdWludAkJCWNoa3N1bSA9IDA7CisJaW50CQkJaTsKKworCS8qIGRpdmlkZSBsZW5ndGggYnkgNCB0byBnZXQgIyB3b3JkcyAqLworCWZvciAoaT0wOyBpIDwgSU5UX0dFVChyaGVhZC0+aF9sZW4sIEFSQ0hfQ09OVkVSVCkgPj4gMjsgaSsrKSB7CisJCWNoa3N1bSBePSBJTlRfR0VUKCp1cCwgQVJDSF9DT05WRVJUKTsKKwkJdXArKzsKKwl9CisJaWYgKGNoa3N1bSAhPSBJTlRfR0VUKHJoZWFkLT5oX2Noa3N1bSwgQVJDSF9DT05WRVJUKSkgeworCSAgICBpZiAocmhlYWQtPmhfY2hrc3VtIHx8CisJCSgobG9nLT5sX2ZsYWdzICYgWExPR19DSEtTVU1fTUlTTUFUQ0gpID09IDApKSB7CisJCSAgICBjbW5fZXJyKENFX0RFQlVHLAorCQkJIlhGUzogTG9nUiBjaGtzdW0gbWlzbWF0Y2g6IHdhcyAoMHgleCkgaXMgKDB4JXgpIiwKKwkJCSAgICBJTlRfR0VUKHJoZWFkLT5oX2Noa3N1bSwgQVJDSF9DT05WRVJUKSwgY2hrc3VtKTsKKwkJICAgIGNtbl9lcnIoQ0VfREVCVUcsCisiWEZTOiBEaXNyZWdhcmQgbWVzc2FnZSBpZiBmaWxlc3lzdGVtIHdhcyBjcmVhdGVkIHdpdGggbm9uLURFQlVHIGtlcm5lbCIpOworCQkgICAgaWYgKFhGU19TQl9WRVJTSU9OX0hBU0xPR1YyKCZsb2ctPmxfbXAtPm1fc2IpKSB7CisJCQkgICAgY21uX2VycihDRV9ERUJVRywKKwkJCQkiWEZTOiBMb2dSIHRoaXMgaXMgYSBMb2dWMiBmaWxlc3lzdGVtIik7CisJCSAgICB9CisJCSAgICBsb2ctPmxfZmxhZ3MgfD0gWExPR19DSEtTVU1fTUlTTUFUQ0g7CisJICAgIH0KKwl9Cit9CisjZWxzZQorI2RlZmluZSB4bG9nX3VucGFja19kYXRhX2NoZWNrc3VtKHJoZWFkLCBkcCwgbG9nKQorI2VuZGlmCisKK1NUQVRJQyB2b2lkCit4bG9nX3VucGFja19kYXRhKAorCXhsb2dfcmVjX2hlYWRlcl90CSpyaGVhZCwKKwl4ZnNfY2FkZHJfdAkJZHAsCisJeGxvZ190CQkJKmxvZykKK3sKKwlpbnQJCQlpLCBqLCBrOworCXhsb2dfaW5fY29yZV8yX3QJKnhoZHI7CisKKwlmb3IgKGkgPSAwOyBpIDwgQlRPQkIoSU5UX0dFVChyaGVhZC0+aF9sZW4sIEFSQ0hfQ09OVkVSVCkpICYmCisJCSAgaSA8IChYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFKTsgaSsrKSB7CisJCSoodWludCAqKWRwID0gKih1aW50ICopJnJoZWFkLT5oX2N5Y2xlX2RhdGFbaV07CisJCWRwICs9IEJCU0laRTsKKwl9CisKKwlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJmxvZy0+bF9tcC0+bV9zYikpIHsKKwkJeGhkciA9ICh4bG9nX2luX2NvcmVfMl90ICopcmhlYWQ7CisJCWZvciAoIDsgaSA8IEJUT0JCKElOVF9HRVQocmhlYWQtPmhfbGVuLCBBUkNIX0NPTlZFUlQpKTsgaSsrKSB7CisJCQlqID0gaSAvIChYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFKTsKKwkJCWsgPSBpICUgKFhMT0dfSEVBREVSX0NZQ0xFX1NJWkUgLyBCQlNJWkUpOworCQkJKih1aW50ICopZHAgPSB4aGRyW2pdLmhpY194aGVhZGVyLnhoX2N5Y2xlX2RhdGFba107CisJCQlkcCArPSBCQlNJWkU7CisJCX0KKwl9CisKKwl4bG9nX3VucGFja19kYXRhX2NoZWNrc3VtKHJoZWFkLCBkcCwgbG9nKTsKK30KKworU1RBVElDIGludAoreGxvZ192YWxpZF9yZWNfaGVhZGVyKAorCXhsb2dfdAkJCSpsb2csCisJeGxvZ19yZWNfaGVhZGVyX3QJKnJoZWFkLAorCXhmc19kYWRkcl90CQlibGtubykKK3sKKwlpbnQJCQlobGVuOworCisJaWYgKHVubGlrZWx5KAorCSAgICAoSU5UX0dFVChyaGVhZC0+aF9tYWdpY25vLCBBUkNIX0NPTlZFUlQpICE9CisJCQlYTE9HX0hFQURFUl9NQUdJQ19OVU0pKSkgeworCQlYRlNfRVJST1JfUkVQT1JUKCJ4bG9nX3ZhbGlkX3JlY19oZWFkZXIoMSkiLAorCQkJCVhGU19FUlJMRVZFTF9MT1csIGxvZy0+bF9tcCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisJaWYgKHVubGlrZWx5KAorCSAgICAoIXJoZWFkLT5oX3ZlcnNpb24gfHwKKwkgICAgKElOVF9HRVQocmhlYWQtPmhfdmVyc2lvbiwgQVJDSF9DT05WRVJUKSAmCisJCQkoflhMT0dfVkVSU0lPTl9PS0JJVFMpKSAhPSAwKSkpIHsKKwkJeGxvZ193YXJuKCJYRlM6ICVzOiB1bnJlY29nbmlzZWQgbG9nIHZlcnNpb24gKCVkKS4iLAorCQkJX19GVU5DVElPTl9fLCBJTlRfR0VUKHJoZWFkLT5oX3ZlcnNpb24sIEFSQ0hfQ09OVkVSVCkpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCisJLyogTFIgYm9keSBtdXN0IGhhdmUgZGF0YSBvciBpdCB3b3VsZG4ndCBoYXZlIGJlZW4gd3JpdHRlbiAqLworCWhsZW4gPSBJTlRfR0VUKHJoZWFkLT5oX2xlbiwgQVJDSF9DT05WRVJUKTsKKwlpZiAodW5saWtlbHkoIGhsZW4gPD0gMCB8fCBobGVuID4gSU5UX01BWCApKSB7CisJCVhGU19FUlJPUl9SRVBPUlQoInhsb2dfdmFsaWRfcmVjX2hlYWRlcigyKSIsCisJCQkJWEZTX0VSUkxFVkVMX0xPVywgbG9nLT5sX21wKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKwlpZiAodW5saWtlbHkoIGJsa25vID4gbG9nLT5sX2xvZ0JCc2l6ZSB8fCBibGtubyA+IElOVF9NQVggKSkgeworCQlYRlNfRVJST1JfUkVQT1JUKCJ4bG9nX3ZhbGlkX3JlY19oZWFkZXIoMykiLAorCQkJCVhGU19FUlJMRVZFTF9MT1csIGxvZy0+bF9tcCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBsb2cgZnJvbSB0YWlsIHRvIGhlYWQgYW5kIHByb2Nlc3MgdGhlIGxvZyByZWNvcmRzIGZvdW5kLgorICogSGFuZGxlIHRoZSB0d28gY2FzZXMgd2hlcmUgdGhlIHRhaWwgYW5kIGhlYWQgYXJlIGluIHRoZSBzYW1lIGN5Y2xlCisgKiBhbmQgd2hlcmUgdGhlIGFjdGl2ZSBwb3J0aW9uIG9mIHRoZSBsb2cgd3JhcHMgYXJvdW5kIHRoZSBlbmQgb2YKKyAqIHRoZSBwaHlzaWNhbCBsb2cgc2VwYXJhdGVseS4gIFRoZSBwYXNzIHBhcmFtZXRlciBpcyBwYXNzZWQgdGhyb3VnaAorICogdG8gdGhlIHJvdXRpbmVzIGNhbGxlZCB0byBwcm9jZXNzIHRoZSBkYXRhIGFuZCBpcyBub3QgbG9va2VkIGF0CisgKiBoZXJlLgorICovCitTVEFUSUMgaW50Cit4bG9nX2RvX3JlY292ZXJ5X3Bhc3MoCisJeGxvZ190CQkJKmxvZywKKwl4ZnNfZGFkZHJfdAkJaGVhZF9ibGssCisJeGZzX2RhZGRyX3QJCXRhaWxfYmxrLAorCWludAkJCXBhc3MpCit7CisJeGxvZ19yZWNfaGVhZGVyX3QJKnJoZWFkOworCXhmc19kYWRkcl90CQlibGtfbm87CisJeGZzX2NhZGRyX3QJCWJ1ZmFkZHIsIG9mZnNldDsKKwl4ZnNfYnVmX3QJCSpoYnAsICpkYnA7CisJaW50CQkJZXJyb3IgPSAwLCBoX3NpemU7CisJaW50CQkJYmJsa3MsIHNwbGl0X2JibGtzOworCWludAkJCWhibGtzLCBzcGxpdF9oYmxrcywgd3JhcHBlZF9oYmxrczsKKwl4bG9nX3JlY292ZXJfdAkJKnJoYXNoW1hMT0dfUkhBU0hfU0laRV07CisKKwlBU1NFUlQoaGVhZF9ibGsgIT0gdGFpbF9ibGspOworCisJLyoKKwkgKiBSZWFkIHRoZSBoZWFkZXIgb2YgdGhlIHRhaWwgYmxvY2sgYW5kIGdldCB0aGUgaWNsb2cgYnVmZmVyIHNpemUgZnJvbQorCSAqIGhfc2l6ZS4gIFVzZSB0aGlzIHRvIHRlbGwgaG93IG1hbnkgc2VjdG9ycyBtYWtlIHVwIHRoZSBsb2cgaGVhZGVyLgorCSAqLworCWlmIChYRlNfU0JfVkVSU0lPTl9IQVNMT0dWMigmbG9nLT5sX21wLT5tX3NiKSkgeworCQkvKgorCQkgKiBXaGVuIHVzaW5nIHZhcmlhYmxlIGxlbmd0aCBpY2xvZ3MsIHJlYWQgZmlyc3Qgc2VjdG9yIG9mCisJCSAqIGljbG9nIGhlYWRlciBhbmQgZXh0cmFjdCB0aGUgaGVhZGVyIHNpemUgZnJvbSBpdC4gIEdldCBhCisJCSAqIG5ldyBoYnAgdGhhdCBpcyB0aGUgY29ycmVjdCBzaXplLgorCQkgKi8KKwkJaGJwID0geGxvZ19nZXRfYnAobG9nLCAxKTsKKwkJaWYgKCFoYnApCisJCQlyZXR1cm4gRU5PTUVNOworCQlpZiAoKGVycm9yID0geGxvZ19icmVhZChsb2csIHRhaWxfYmxrLCAxLCBoYnApKSkKKwkJCWdvdG8gYnJlYWRfZXJyMTsKKwkJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIHRhaWxfYmxrLCAxLCBoYnApOworCQlyaGVhZCA9ICh4bG9nX3JlY19oZWFkZXJfdCAqKW9mZnNldDsKKwkJZXJyb3IgPSB4bG9nX3ZhbGlkX3JlY19oZWFkZXIobG9nLCByaGVhZCwgdGFpbF9ibGspOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGJyZWFkX2VycjE7CisJCWhfc2l6ZSA9IElOVF9HRVQocmhlYWQtPmhfc2l6ZSwgQVJDSF9DT05WRVJUKTsKKwkJaWYgKChJTlRfR0VUKHJoZWFkLT5oX3ZlcnNpb24sIEFSQ0hfQ09OVkVSVCkKKwkJCQkmIFhMT0dfVkVSU0lPTl8yKSAmJgorCQkgICAgKGhfc2l6ZSA+IFhMT0dfSEVBREVSX0NZQ0xFX1NJWkUpKSB7CisJCQloYmxrcyA9IGhfc2l6ZSAvIFhMT0dfSEVBREVSX0NZQ0xFX1NJWkU7CisJCQlpZiAoaF9zaXplICUgWExPR19IRUFERVJfQ1lDTEVfU0laRSkKKwkJCQloYmxrcysrOworCQkJeGxvZ19wdXRfYnAoaGJwKTsKKwkJCWhicCA9IHhsb2dfZ2V0X2JwKGxvZywgaGJsa3MpOworCQl9IGVsc2UgeworCQkJaGJsa3MgPSAxOworCQl9CisJfSBlbHNlIHsKKwkJQVNTRVJUKGxvZy0+bF9zZWN0YmJfbG9nID09IDApOworCQloYmxrcyA9IDE7CisJCWhicCA9IHhsb2dfZ2V0X2JwKGxvZywgMSk7CisJCWhfc2l6ZSA9IFhMT0dfQklHX1JFQ09SRF9CU0laRTsKKwl9CisKKwlpZiAoIWhicCkKKwkJcmV0dXJuIEVOT01FTTsKKwlkYnAgPSB4bG9nX2dldF9icChsb2csIEJUT0JCKGhfc2l6ZSkpOworCWlmICghZGJwKSB7CisJCXhsb2dfcHV0X2JwKGhicCk7CisJCXJldHVybiBFTk9NRU07CisJfQorCisJbWVtc2V0KHJoYXNoLCAwLCBzaXplb2Yocmhhc2gpKTsKKwlpZiAodGFpbF9ibGsgPD0gaGVhZF9ibGspIHsKKwkJZm9yIChibGtfbm8gPSB0YWlsX2JsazsgYmxrX25vIDwgaGVhZF9ibGs7ICkgeworCQkJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCBibGtfbm8sIGhibGtzLCBoYnApKSkKKwkJCQlnb3RvIGJyZWFkX2VycjI7CisJCQlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgYmxrX25vLCBoYmxrcywgaGJwKTsKKwkJCXJoZWFkID0gKHhsb2dfcmVjX2hlYWRlcl90ICopb2Zmc2V0OworCQkJZXJyb3IgPSB4bG9nX3ZhbGlkX3JlY19oZWFkZXIobG9nLCByaGVhZCwgYmxrX25vKTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGJyZWFkX2VycjI7CisKKwkJCS8qIGJsb2NrcyBpbiBkYXRhIHNlY3Rpb24gKi8KKwkJCWJibGtzID0gKGludClCVE9CQihJTlRfR0VUKHJoZWFkLT5oX2xlbiwgQVJDSF9DT05WRVJUKSk7CisJCQllcnJvciA9IHhsb2dfYnJlYWQobG9nLCBibGtfbm8gKyBoYmxrcywgYmJsa3MsIGRicCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBicmVhZF9lcnIyOworCQkJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIGJsa19ubyArIGhibGtzLCBiYmxrcywgZGJwKTsKKwkJCXhsb2dfdW5wYWNrX2RhdGEocmhlYWQsIG9mZnNldCwgbG9nKTsKKwkJCWlmICgoZXJyb3IgPSB4bG9nX3JlY292ZXJfcHJvY2Vzc19kYXRhKGxvZywKKwkJCQkJCXJoYXNoLCByaGVhZCwgb2Zmc2V0LCBwYXNzKSkpCisJCQkJZ290byBicmVhZF9lcnIyOworCQkJYmxrX25vICs9IGJibGtzICsgaGJsa3M7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBQZXJmb3JtIHJlY292ZXJ5IGFyb3VuZCB0aGUgZW5kIG9mIHRoZSBwaHlzaWNhbCBsb2cuCisJCSAqIFdoZW4gdGhlIGhlYWQgaXMgbm90IG9uIHRoZSBzYW1lIGN5Y2xlIG51bWJlciBhcyB0aGUgdGFpbCwKKwkJICogd2UgY2FuJ3QgZG8gYSBzZXF1ZW50aWFsIHJlY292ZXJ5IGFzIGFib3ZlLgorCQkgKi8KKwkJYmxrX25vID0gdGFpbF9ibGs7CisJCXdoaWxlIChibGtfbm8gPCBsb2ctPmxfbG9nQkJzaXplKSB7CisJCQkvKgorCQkJICogQ2hlY2sgZm9yIGhlYWRlciB3cmFwcGluZyBhcm91bmQgcGh5c2ljYWwgZW5kLW9mLWxvZworCQkJICovCisJCQlvZmZzZXQgPSBOVUxMOworCQkJc3BsaXRfaGJsa3MgPSAwOworCQkJd3JhcHBlZF9oYmxrcyA9IDA7CisJCQlpZiAoYmxrX25vICsgaGJsa3MgPD0gbG9nLT5sX2xvZ0JCc2l6ZSkgeworCQkJCS8qIFJlYWQgaGVhZGVyIGluIG9uZSByZWFkICovCisJCQkJZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgYmxrX25vLCBoYmxrcywgaGJwKTsKKwkJCQlpZiAoZXJyb3IpCisJCQkJCWdvdG8gYnJlYWRfZXJyMjsKKwkJCQlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgYmxrX25vLCBoYmxrcywgaGJwKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogVGhpcyBMUiBpcyBzcGxpdCBhY3Jvc3MgcGh5c2ljYWwgbG9nIGVuZCAqLworCQkJCWlmIChibGtfbm8gIT0gbG9nLT5sX2xvZ0JCc2l6ZSkgeworCQkJCQkvKiBzb21lIGRhdGEgYmVmb3JlIHBoeXNpY2FsIGxvZyBlbmQgKi8KKwkJCQkJQVNTRVJUKGJsa19ubyA8PSBJTlRfTUFYKTsKKwkJCQkJc3BsaXRfaGJsa3MgPSBsb2ctPmxfbG9nQkJzaXplIC0gKGludClibGtfbm87CisJCQkJCUFTU0VSVChzcGxpdF9oYmxrcyA+IDApOworCQkJCQlpZiAoKGVycm9yID0geGxvZ19icmVhZChsb2csIGJsa19ubywKKwkJCQkJCQlzcGxpdF9oYmxrcywgaGJwKSkpCisJCQkJCQlnb3RvIGJyZWFkX2VycjI7CisJCQkJCW9mZnNldCA9IHhsb2dfYWxpZ24obG9nLCBibGtfbm8sCisJCQkJCQkJc3BsaXRfaGJsa3MsIGhicCk7CisJCQkJfQorCQkJCS8qCisJCQkJICogTm90ZTogdGhpcyBibGFjayBtYWdpYyBzdGlsbCB3b3JrcyB3aXRoCisJCQkJICogbGFyZ2Ugc2VjdG9yIHNpemVzIChub24tNTEyKSBvbmx5IGJlY2F1c2U6CisJCQkJICogLSB3ZSBpbmNyZWFzZWQgdGhlIGJ1ZmZlciBzaXplIG9yaWdpbmFsbHkKKwkJCQkgKiAgIGJ5IDEgc2VjdG9yIGdpdmluZyB1cyBlbm91Z2ggZXh0cmEgc3BhY2UKKwkJCQkgKiAgIGZvciB0aGUgc2Vjb25kIHJlYWQ7CisJCQkJICogLSB0aGUgbG9nIHN0YXJ0IGlzIGd1YXJhbnRlZWQgdG8gYmUgc2VjdG9yCisJCQkJICogICBhbGlnbmVkOworCQkJCSAqIC0gd2UgcmVhZCB0aGUgbG9nIGVuZCAoTFIgaGVhZGVyIHN0YXJ0KQorCQkJCSAqICAgX2ZpcnN0XywgdGhlbiB0aGUgbG9nIHN0YXJ0IChMUiBoZWFkZXIgZW5kKQorCQkJCSAqICAgLSBvcmRlciBpcyBpbXBvcnRhbnQuCisJCQkJICovCisJCQkJYnVmYWRkciA9IFhGU19CVUZfUFRSKGhicCk7CisJCQkJWEZTX0JVRl9TRVRfUFRSKGhicCwKKwkJCQkJCWJ1ZmFkZHIgKyBCQlRPQihzcGxpdF9oYmxrcyksCisJCQkJCQlCQlRPQihoYmxrcyAtIHNwbGl0X2hibGtzKSk7CisJCQkJd3JhcHBlZF9oYmxrcyA9IGhibGtzIC0gc3BsaXRfaGJsa3M7CisJCQkJZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgMCwgd3JhcHBlZF9oYmxrcywgaGJwKTsKKwkJCQlpZiAoZXJyb3IpCisJCQkJCWdvdG8gYnJlYWRfZXJyMjsKKwkJCQlYRlNfQlVGX1NFVF9QVFIoaGJwLCBidWZhZGRyLCBCQlRPQihoYmxrcykpOworCQkJCWlmICghb2Zmc2V0KQorCQkJCQlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgMCwKKwkJCQkJCQl3cmFwcGVkX2hibGtzLCBoYnApOworCQkJfQorCQkJcmhlYWQgPSAoeGxvZ19yZWNfaGVhZGVyX3QgKilvZmZzZXQ7CisJCQllcnJvciA9IHhsb2dfdmFsaWRfcmVjX2hlYWRlcihsb2csIHJoZWFkLAorCQkJCQkJc3BsaXRfaGJsa3MgPyBibGtfbm8gOiAwKTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGJyZWFkX2VycjI7CisKKwkJCWJibGtzID0gKGludClCVE9CQihJTlRfR0VUKHJoZWFkLT5oX2xlbiwgQVJDSF9DT05WRVJUKSk7CisJCQlibGtfbm8gKz0gaGJsa3M7CisKKwkJCS8qIFJlYWQgaW4gZGF0YSBmb3IgbG9nIHJlY29yZCAqLworCQkJaWYgKGJsa19ubyArIGJibGtzIDw9IGxvZy0+bF9sb2dCQnNpemUpIHsKKwkJCQllcnJvciA9IHhsb2dfYnJlYWQobG9nLCBibGtfbm8sIGJibGtzLCBkYnApOworCQkJCWlmIChlcnJvcikKKwkJCQkJZ290byBicmVhZF9lcnIyOworCQkJCW9mZnNldCA9IHhsb2dfYWxpZ24obG9nLCBibGtfbm8sIGJibGtzLCBkYnApOworCQkJfSBlbHNlIHsKKwkJCQkvKiBUaGlzIGxvZyByZWNvcmQgaXMgc3BsaXQgYWNyb3NzIHRoZQorCQkJCSAqIHBoeXNpY2FsIGVuZCBvZiBsb2cgKi8KKwkJCQlvZmZzZXQgPSBOVUxMOworCQkJCXNwbGl0X2JibGtzID0gMDsKKwkJCQlpZiAoYmxrX25vICE9IGxvZy0+bF9sb2dCQnNpemUpIHsKKwkJCQkJLyogc29tZSBkYXRhIGlzIGJlZm9yZSB0aGUgcGh5c2ljYWwKKwkJCQkJICogZW5kIG9mIGxvZyAqLworCQkJCQlBU1NFUlQoIXdyYXBwZWRfaGJsa3MpOworCQkJCQlBU1NFUlQoYmxrX25vIDw9IElOVF9NQVgpOworCQkJCQlzcGxpdF9iYmxrcyA9CisJCQkJCQlsb2ctPmxfbG9nQkJzaXplIC0gKGludClibGtfbm87CisJCQkJCUFTU0VSVChzcGxpdF9iYmxrcyA+IDApOworCQkJCQlpZiAoKGVycm9yID0geGxvZ19icmVhZChsb2csIGJsa19ubywKKwkJCQkJCQlzcGxpdF9iYmxrcywgZGJwKSkpCisJCQkJCQlnb3RvIGJyZWFkX2VycjI7CisJCQkJCW9mZnNldCA9IHhsb2dfYWxpZ24obG9nLCBibGtfbm8sCisJCQkJCQkJc3BsaXRfYmJsa3MsIGRicCk7CisJCQkJfQorCQkJCS8qCisJCQkJICogTm90ZTogdGhpcyBibGFjayBtYWdpYyBzdGlsbCB3b3JrcyB3aXRoCisJCQkJICogbGFyZ2Ugc2VjdG9yIHNpemVzIChub24tNTEyKSBvbmx5IGJlY2F1c2U6CisJCQkJICogLSB3ZSBpbmNyZWFzZWQgdGhlIGJ1ZmZlciBzaXplIG9yaWdpbmFsbHkKKwkJCQkgKiAgIGJ5IDEgc2VjdG9yIGdpdmluZyB1cyBlbm91Z2ggZXh0cmEgc3BhY2UKKwkJCQkgKiAgIGZvciB0aGUgc2Vjb25kIHJlYWQ7CisJCQkJICogLSB0aGUgbG9nIHN0YXJ0IGlzIGd1YXJhbnRlZWQgdG8gYmUgc2VjdG9yCisJCQkJICogICBhbGlnbmVkOworCQkJCSAqIC0gd2UgcmVhZCB0aGUgbG9nIGVuZCAoTFIgaGVhZGVyIHN0YXJ0KQorCQkJCSAqICAgX2ZpcnN0XywgdGhlbiB0aGUgbG9nIHN0YXJ0IChMUiBoZWFkZXIgZW5kKQorCQkJCSAqICAgLSBvcmRlciBpcyBpbXBvcnRhbnQuCisJCQkJICovCisJCQkJYnVmYWRkciA9IFhGU19CVUZfUFRSKGRicCk7CisJCQkJWEZTX0JVRl9TRVRfUFRSKGRicCwKKwkJCQkJCWJ1ZmFkZHIgKyBCQlRPQihzcGxpdF9iYmxrcyksCisJCQkJCQlCQlRPQihiYmxrcyAtIHNwbGl0X2JibGtzKSk7CisJCQkJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCB3cmFwcGVkX2hibGtzLAorCQkJCQkJYmJsa3MgLSBzcGxpdF9iYmxrcywgZGJwKSkpCisJCQkJCWdvdG8gYnJlYWRfZXJyMjsKKwkJCQlYRlNfQlVGX1NFVF9QVFIoZGJwLCBidWZhZGRyLCBoX3NpemUpOworCQkJCWlmICghb2Zmc2V0KQorCQkJCQlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgd3JhcHBlZF9oYmxrcywKKwkJCQkJCWJibGtzIC0gc3BsaXRfYmJsa3MsIGRicCk7CisJCQl9CisJCQl4bG9nX3VucGFja19kYXRhKHJoZWFkLCBvZmZzZXQsIGxvZyk7CisJCQlpZiAoKGVycm9yID0geGxvZ19yZWNvdmVyX3Byb2Nlc3NfZGF0YShsb2csIHJoYXNoLAorCQkJCQkJCXJoZWFkLCBvZmZzZXQsIHBhc3MpKSkKKwkJCQlnb3RvIGJyZWFkX2VycjI7CisJCQlibGtfbm8gKz0gYmJsa3M7CisJCX0KKworCQlBU1NFUlQoYmxrX25vID49IGxvZy0+bF9sb2dCQnNpemUpOworCQlibGtfbm8gLT0gbG9nLT5sX2xvZ0JCc2l6ZTsKKworCQkvKiByZWFkIGZpcnN0IHBhcnQgb2YgcGh5c2ljYWwgbG9nICovCisJCXdoaWxlIChibGtfbm8gPCBoZWFkX2JsaykgeworCQkJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCBibGtfbm8sIGhibGtzLCBoYnApKSkKKwkJCQlnb3RvIGJyZWFkX2VycjI7CisJCQlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgYmxrX25vLCBoYmxrcywgaGJwKTsKKwkJCXJoZWFkID0gKHhsb2dfcmVjX2hlYWRlcl90ICopb2Zmc2V0OworCQkJZXJyb3IgPSB4bG9nX3ZhbGlkX3JlY19oZWFkZXIobG9nLCByaGVhZCwgYmxrX25vKTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGJyZWFkX2VycjI7CisJCQliYmxrcyA9IChpbnQpQlRPQkIoSU5UX0dFVChyaGVhZC0+aF9sZW4sIEFSQ0hfQ09OVkVSVCkpOworCQkJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCBibGtfbm8raGJsa3MsIGJibGtzLCBkYnApKSkKKwkJCQlnb3RvIGJyZWFkX2VycjI7CisJCQlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgYmxrX25vK2hibGtzLCBiYmxrcywgZGJwKTsKKwkJCXhsb2dfdW5wYWNrX2RhdGEocmhlYWQsIG9mZnNldCwgbG9nKTsKKwkJCWlmICgoZXJyb3IgPSB4bG9nX3JlY292ZXJfcHJvY2Vzc19kYXRhKGxvZywgcmhhc2gsCisJCQkJCQkJcmhlYWQsIG9mZnNldCwgcGFzcykpKQorCQkJCWdvdG8gYnJlYWRfZXJyMjsKKwkJCWJsa19ubyArPSBiYmxrcyArIGhibGtzOworCQl9CisJfQorCisgYnJlYWRfZXJyMjoKKwl4bG9nX3B1dF9icChkYnApOworIGJyZWFkX2VycjE6CisJeGxvZ19wdXRfYnAoaGJwKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBEbyB0aGUgcmVjb3Zlcnkgb2YgdGhlIGxvZy4gIFdlIGFjdHVhbGx5IGRvIHRoaXMgaW4gdHdvIHBoYXNlcy4KKyAqIFRoZSB0d28gcGFzc2VzIGFyZSBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoZSBmdW5jdGlvbgorICogb2YgY2FuY2VsbGluZyBhIHJlY29yZCB3cml0dGVuIGludG8gdGhlIGxvZy4gIFRoZSBmaXJzdCBwYXNzCisgKiBkZXRlcm1pbmVzIHRob3NlIHRoaW5ncyB3aGljaCBoYXZlIGJlZW4gY2FuY2VsbGVkLCBhbmQgdGhlCisgKiBzZWNvbmQgcGFzcyByZXBsYXlzIGxvZyBpdGVtcyBub3JtYWxseSBleGNlcHQgZm9yIHRob3NlIHdoaWNoCisgKiBoYXZlIGJlZW4gY2FuY2VsbGVkLiAgVGhlIGhhbmRsaW5nIG9mIHRoZSByZXBsYXkgYW5kIGNhbmNlbGxhdGlvbnMKKyAqIHRha2VzIHBsYWNlIGluIHRoZSBsb2cgaXRlbSB0eXBlIHNwZWNpZmljIHJvdXRpbmVzLgorICoKKyAqIFRoZSB0YWJsZSBvZiBpdGVtcyB3aGljaCBoYXZlIGNhbmNlbCByZWNvcmRzIGluIHRoZSBsb2cgaXMgYWxsb2NhdGVkCisgKiBhbmQgZnJlZWQgYXQgdGhpcyBsZXZlbCwgc2luY2Ugb25seSBoZXJlIGRvIHdlIGtub3cgd2hlbiBhbGwgb2YKKyAqIHRoZSBsb2cgcmVjb3ZlcnkgaGFzIGJlZW4gY29tcGxldGVkLgorICovCitTVEFUSUMgaW50Cit4bG9nX2RvX2xvZ19yZWNvdmVyeSgKKwl4bG9nX3QJCSpsb2csCisJeGZzX2RhZGRyX3QJaGVhZF9ibGssCisJeGZzX2RhZGRyX3QJdGFpbF9ibGspCit7CisJaW50CQllcnJvcjsKKworCUFTU0VSVChoZWFkX2JsayAhPSB0YWlsX2Jsayk7CisKKwkvKgorCSAqIEZpcnN0IGRvIGEgcGFzcyB0byBmaW5kIGFsbCBvZiB0aGUgY2FuY2VsbGVkIGJ1ZiBsb2cgaXRlbXMuCisJICogU3RvcmUgdGhlbSBpbiB0aGUgYnVmX2NhbmNlbF90YWJsZSBmb3IgdXNlIGluIHRoZSBzZWNvbmQgcGFzcy4KKwkgKi8KKwlsb2ctPmxfYnVmX2NhbmNlbF90YWJsZSA9CisJCSh4ZnNfYnVmX2NhbmNlbF90ICoqKWttZW1femFsbG9jKFhMT0dfQkNfVEFCTEVfU0laRSAqCisJCQkJCQkgc2l6ZW9mKHhmc19idWZfY2FuY2VsX3QqKSwKKwkJCQkJCSBLTV9TTEVFUCk7CisJZXJyb3IgPSB4bG9nX2RvX3JlY292ZXJ5X3Bhc3MobG9nLCBoZWFkX2JsaywgdGFpbF9ibGssCisJCQkJICAgICAgWExPR19SRUNPVkVSX1BBU1MxKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlrbWVtX2ZyZWUobG9nLT5sX2J1Zl9jYW5jZWxfdGFibGUsCisJCQkgIFhMT0dfQkNfVEFCTEVfU0laRSAqIHNpemVvZih4ZnNfYnVmX2NhbmNlbF90KikpOworCQlsb2ctPmxfYnVmX2NhbmNlbF90YWJsZSA9IE5VTEw7CisJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBUaGVuIGRvIGEgc2Vjb25kIHBhc3MgdG8gYWN0dWFsbHkgcmVjb3ZlciB0aGUgaXRlbXMgaW4gdGhlIGxvZy4KKwkgKiBXaGVuIGl0IGlzIGNvbXBsZXRlIGZyZWUgdGhlIHRhYmxlIG9mIGJ1ZiBjYW5jZWwgaXRlbXMuCisJICovCisJZXJyb3IgPSB4bG9nX2RvX3JlY292ZXJ5X3Bhc3MobG9nLCBoZWFkX2JsaywgdGFpbF9ibGssCisJCQkJICAgICAgWExPR19SRUNPVkVSX1BBU1MyKTsKKyNpZmRlZiBERUJVRworCXsKKwkJaW50CWk7CisKKwkJZm9yIChpID0gMDsgaSA8IFhMT0dfQkNfVEFCTEVfU0laRTsgaSsrKQorCQkJQVNTRVJUKGxvZy0+bF9idWZfY2FuY2VsX3RhYmxlW2ldID09IE5VTEwpOworCX0KKyNlbmRpZgkvKiBERUJVRyAqLworCisJa21lbV9mcmVlKGxvZy0+bF9idWZfY2FuY2VsX3RhYmxlLAorCQkgIFhMT0dfQkNfVEFCTEVfU0laRSAqIHNpemVvZih4ZnNfYnVmX2NhbmNlbF90KikpOworCWxvZy0+bF9idWZfY2FuY2VsX3RhYmxlID0gTlVMTDsKKworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIERvIHRoZSBhY3R1YWwgcmVjb3ZlcnkKKyAqLworU1RBVElDIGludAoreGxvZ19kb19yZWNvdmVyKAorCXhsb2dfdAkJKmxvZywKKwl4ZnNfZGFkZHJfdAloZWFkX2JsaywKKwl4ZnNfZGFkZHJfdAl0YWlsX2JsaykKK3sKKwlpbnQJCWVycm9yOworCXhmc19idWZfdAkqYnA7CisJeGZzX3NiX3QJKnNicDsKKworCS8qCisJICogRmlyc3QgcmVwbGF5IHRoZSBpbWFnZXMgaW4gdGhlIGxvZy4KKwkgKi8KKwllcnJvciA9IHhsb2dfZG9fbG9nX3JlY292ZXJ5KGxvZywgaGVhZF9ibGssIHRhaWxfYmxrKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCVhGU19iZmx1c2gobG9nLT5sX21wLT5tX2RkZXZfdGFyZ3ApOworCisJLyoKKwkgKiBJZiBJTyBlcnJvcnMgaGFwcGVuZWQgZHVyaW5nIHJlY292ZXJ5LCBiYWlsIG91dC4KKwkgKi8KKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihsb2ctPmxfbXApKSB7CisJCXJldHVybiAoRUlPKTsKKwl9CisKKwkvKgorCSAqIFdlIG5vdyB1cGRhdGUgdGhlIHRhaWxfbHNuIHNpbmNlIG11Y2ggb2YgdGhlIHJlY292ZXJ5IGhhcyBjb21wbGV0ZWQKKwkgKiBhbmQgdGhlcmUgbWF5IGJlIHNwYWNlIGF2YWlsYWJsZSB0byB1c2UuICBJZiB0aGVyZSB3ZXJlIG5vIGV4dGVudAorCSAqIG9yIGl1bmxpbmtzLCB3ZSBjYW4gZnJlZSB1cCB0aGUgZW50aXJlIGxvZyBhbmQgc2V0IHRoZSB0YWlsX2xzbiB0bworCSAqIGJlIHRoZSBsYXN0X3N5bmNfbHNuLiAgVGhpcyB3YXMgc2V0IGluIHhsb2dfZmluZF90YWlsIHRvIGJlIHRoZQorCSAqIGxzbiBvZiB0aGUgbGFzdCBrbm93biBnb29kIExSIG9uIGRpc2suICBJZiB0aGVyZSBhcmUgZXh0ZW50IGZyZWVzCisJICogb3IgaXVubGlua3MgdGhleSB3aWxsIGhhdmUgc29tZSBlbnRyaWVzIGluIHRoZSBBSUw7IHNvIHdlIGxvb2sgYXQKKwkgKiB0aGUgQUlMIHRvIGRldGVybWluZSBob3cgdG8gc2V0IHRoZSB0YWlsX2xzbi4KKwkgKi8KKwl4bG9nX2Fzc2lnbl90YWlsX2xzbihsb2ctPmxfbXApOworCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSd2ZSBmaW5pc2hlZCByZXBsYXlpbmcgYWxsIGJ1ZmZlciBhbmQgaW5vZGUKKwkgKiB1cGRhdGVzLCByZS1yZWFkIGluIHRoZSBzdXBlcmJsb2NrLgorCSAqLworCWJwID0geGZzX2dldHNiKGxvZy0+bF9tcCwgMCk7CisJWEZTX0JVRl9VTkRPTkUoYnApOworCVhGU19CVUZfUkVBRChicCk7CisJeGZzYmRzdHJhdChsb2ctPmxfbXAsIGJwKTsKKwlpZiAoKGVycm9yID0geGZzX2lvd2FpdChicCkpKSB7CisJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX2RvX3JlY292ZXIiLAorCQkJCSAgbG9nLT5sX21wLCBicCwgWEZTX0JVRl9BRERSKGJwKSk7CisJCUFTU0VSVCgwKTsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwkvKiBDb252ZXJ0IHN1cGVyYmxvY2sgZnJvbSBvbi1kaXNrIGZvcm1hdCAqLworCXNicCA9ICZsb2ctPmxfbXAtPm1fc2I7CisJeGZzX3hsYXRlc2IoWEZTX0JVRl9UT19TQlAoYnApLCBzYnAsIDEsIFhGU19TQl9BTExfQklUUyk7CisJQVNTRVJUKHNicC0+c2JfbWFnaWNudW0gPT0gWEZTX1NCX01BR0lDKTsKKwlBU1NFUlQoWEZTX1NCX0dPT0RfVkVSU0lPTihzYnApKTsKKwl4ZnNfYnVmX3JlbHNlKGJwKTsKKworCXhsb2dfcmVjb3Zlcl9jaGVja19zdW1tYXJ5KGxvZyk7CisKKwkvKiBOb3JtYWwgdHJhbnNhY3Rpb25zIGNhbiBub3cgb2NjdXIgKi8KKwlsb2ctPmxfZmxhZ3MgJj0gflhMT0dfQUNUSVZFX1JFQ09WRVJZOworCXJldHVybiAwOworfQorCisvKgorICogUGVyZm9ybSByZWNvdmVyeSBhbmQgcmUtaW5pdGlhbGl6ZSBzb21lIGxvZyB2YXJpYWJsZXMgaW4geGxvZ19maW5kX3RhaWwuCisgKgorICogUmV0dXJuIGVycm9yIG9yIHplcm8uCisgKi8KK2ludAoreGxvZ19yZWNvdmVyKAorCXhsb2dfdAkJKmxvZywKKwlpbnQJCXJlYWRvbmx5KQoreworCXhmc19kYWRkcl90CWhlYWRfYmxrLCB0YWlsX2JsazsKKwlpbnQJCWVycm9yOworCisJLyogZmluZCB0aGUgdGFpbCBvZiB0aGUgbG9nICovCisJaWYgKChlcnJvciA9IHhsb2dfZmluZF90YWlsKGxvZywgJmhlYWRfYmxrLCAmdGFpbF9ibGssIHJlYWRvbmx5KSkpCisJCXJldHVybiBlcnJvcjsKKworCWlmICh0YWlsX2JsayAhPSBoZWFkX2JsaykgeworCQkvKiBUaGVyZSB1c2VkIHRvIGJlIGEgY29tbWVudCBoZXJlOgorCQkgKgorCQkgKiBkaXNhbGxvdyByZWNvdmVyeSBvbiByZWFkLW9ubHkgbW91bnRzLiAgbm90ZSAtLSBtb3VudAorCQkgKiBjaGVja3MgZm9yIEVOT1NQQyBhbmQgdHVybnMgaXQgaW50byBhbiBpbnRlbGxpZ2VudAorCQkgKiBlcnJvciBtZXNzYWdlLgorCQkgKiAuLi5idXQgdGhpcyBpcyBubyBsb25nZXIgdHJ1ZS4gIE5vdywgdW5sZXNzIHlvdSBzcGVjaWZ5CisJCSAqIE5PUkVDT1ZFUlkgKGluIHdoaWNoIGNhc2UgdGhpcyBmdW5jdGlvbiB3b3VsZCBuZXZlciBiZQorCQkgKiBjYWxsZWQpLCB3ZSBqdXN0IGdvIGFoZWFkIGFuZCByZWNvdmVyLiAgV2UgZG8gdGhpcyBhbGwKKwkJICogdW5kZXIgdGhlIHZmcyBsYXllciwgc28gd2UgY2FuIGdldCBhd2F5IHdpdGggaXQgdW5sZXNzCisJCSAqIHRoZSBkZXZpY2UgaXRzZWxmIGlzIHJlYWQtb25seSwgaW4gd2hpY2ggY2FzZSB3ZSBmYWlsLgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19kZXZfaXNfcmVhZF9vbmx5KGxvZy0+bF9tcCwKKwkJCQkJCSJyZWNvdmVyeSByZXF1aXJlZCIpKSkgeworCQkJcmV0dXJuIGVycm9yOworCQl9CisKKwkJY21uX2VycihDRV9OT1RFLAorCQkJIlN0YXJ0aW5nIFhGUyByZWNvdmVyeSBvbiBmaWxlc3lzdGVtOiAlcyAoZGV2OiAlcykiLAorCQkJbG9nLT5sX21wLT5tX2ZzbmFtZSwgWEZTX0JVRlRBUkdfTkFNRShsb2ctPmxfdGFyZykpOworCisJCWVycm9yID0geGxvZ19kb19yZWNvdmVyKGxvZywgaGVhZF9ibGssIHRhaWxfYmxrKTsKKwkJbG9nLT5sX2ZsYWdzIHw9IFhMT0dfUkVDT1ZFUllfTkVFREVEOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBJbiB0aGUgZmlyc3QgcGFydCBvZiByZWNvdmVyeSB3ZSByZXBsYXkgaW5vZGVzIGFuZCBidWZmZXJzIGFuZCBidWlsZAorICogdXAgdGhlIGxpc3Qgb2YgZXh0ZW50IGZyZWUgaXRlbXMgd2hpY2ggbmVlZCB0byBiZSBwcm9jZXNzZWQuICBIZXJlCisgKiB3ZSBwcm9jZXNzIHRoZSBleHRlbnQgZnJlZSBpdGVtcyBhbmQgY2xlYW4gdXAgdGhlIG9uIGRpc2sgdW5saW5rZWQKKyAqIGlub2RlIGxpc3RzLiAgVGhpcyBpcyBzZXBhcmF0ZWQgZnJvbSB0aGUgZmlyc3QgcGFydCBvZiByZWNvdmVyeSBzbworICogdGhhdCB0aGUgcm9vdCBhbmQgcmVhbC10aW1lIGJpdG1hcCBpbm9kZXMgY2FuIGJlIHJlYWQgaW4gZnJvbSBkaXNrIGluCisgKiBiZXR3ZWVuIHRoZSB0d28gc3RhZ2VzLiAgVGhpcyBpcyBuZWNlc3Nhcnkgc28gdGhhdCB3ZSBjYW4gZnJlZSBzcGFjZQorICogaW4gdGhlIHJlYWwtdGltZSBwb3J0aW9uIG9mIHRoZSBmaWxlIHN5c3RlbS4KKyAqLworaW50Cit4bG9nX3JlY292ZXJfZmluaXNoKAorCXhsb2dfdAkJKmxvZywKKwlpbnQJCW1mc2lfZmxhZ3MpCit7CisJLyoKKwkgKiBOb3cgd2UncmUgcmVhZHkgdG8gZG8gdGhlIHRyYW5zYWN0aW9ucyBuZWVkZWQgZm9yIHRoZQorCSAqIHJlc3Qgb2YgcmVjb3ZlcnkuICBTdGFydCB3aXRoIGNvbXBsZXRpbmcgYWxsIHRoZSBleHRlbnQKKwkgKiBmcmVlIGludGVudCByZWNvcmRzIGFuZCB0aGVuIHByb2Nlc3MgdGhlIHVubGlua2VkIGlub2RlCisJICogbGlzdHMuICBBdCB0aGlzIHBvaW50LCB3ZSBlc3NlbnRpYWxseSBydW4gaW4gbm9ybWFsIG1vZGUKKwkgKiBleGNlcHQgdGhhdCB3ZSdyZSBzdGlsbCBwZXJmb3JtaW5nIHJlY292ZXJ5IGFjdGlvbnMKKwkgKiByYXRoZXIgdGhhbiBhY2NlcHRpbmcgbmV3IHJlcXVlc3RzLgorCSAqLworCWlmIChsb2ctPmxfZmxhZ3MgJiBYTE9HX1JFQ09WRVJZX05FRURFRCkgeworCQl4bG9nX3JlY292ZXJfcHJvY2Vzc19lZmlzKGxvZyk7CisJCS8qCisJCSAqIFN5bmMgdGhlIGxvZyB0byBnZXQgYWxsIHRoZSBFRklzIG91dCBvZiB0aGUgQUlMLgorCQkgKiBUaGlzIGlzbid0IGFic29sdXRlbHkgbmVjZXNzYXJ5LCBidXQgaXQgaGVscHMgaW4KKwkJICogY2FzZSB0aGUgdW5saW5rIHRyYW5zYWN0aW9ucyB3b3VsZCBoYXZlIHByb2JsZW1zCisJCSAqIHB1c2hpbmcgdGhlIEVGSXMgb3V0IG9mIHRoZSB3YXkuCisJCSAqLworCQl4ZnNfbG9nX2ZvcmNlKGxvZy0+bF9tcCwgKHhmc19sc25fdCkwLAorCQkJICAgICAgKFhGU19MT0dfRk9SQ0UgfCBYRlNfTE9HX1NZTkMpKTsKKworCQlpZiAoIChtZnNpX2ZsYWdzICYgWEZTX01GU0lfTk9VTkxJTkspID09IDAgKSB7CisJCQl4bG9nX3JlY292ZXJfcHJvY2Vzc19pdW5saW5rcyhsb2cpOworCQl9CisKKwkJeGxvZ19yZWNvdmVyX2NoZWNrX3N1bW1hcnkobG9nKTsKKworCQljbW5fZXJyKENFX05PVEUsCisJCQkiRW5kaW5nIFhGUyByZWNvdmVyeSBvbiBmaWxlc3lzdGVtOiAlcyAoZGV2OiAlcykiLAorCQkJbG9nLT5sX21wLT5tX2ZzbmFtZSwgWEZTX0JVRlRBUkdfTkFNRShsb2ctPmxfdGFyZykpOworCQlsb2ctPmxfZmxhZ3MgJj0gflhMT0dfUkVDT1ZFUllfTkVFREVEOworCX0gZWxzZSB7CisJCWNtbl9lcnIoQ0VfREVCVUcsCisJCQkiIUVuZGluZyBjbGVhbiBYRlMgbW91bnQgZm9yIGZpbGVzeXN0ZW06ICVzIiwKKwkJCWxvZy0+bF9tcC0+bV9mc25hbWUpOworCX0KKwlyZXR1cm4gMDsKK30KKworCisjaWYgZGVmaW5lZChERUJVRykKKy8qCisgKiBSZWFkIGFsbCBvZiB0aGUgYWdmIGFuZCBhZ2kgY291bnRlcnMgYW5kIGNoZWNrIHRoYXQgdGhleQorICogYXJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgc3VwZXJibG9jayBjb3VudGVycy4KKyAqLwordm9pZAoreGxvZ19yZWNvdmVyX2NoZWNrX3N1bW1hcnkoCisJeGxvZ190CQkqbG9nKQoreworCXhmc19tb3VudF90CSptcDsKKwl4ZnNfYWdmX3QJKmFnZnA7CisJeGZzX2FnaV90CSphZ2lwOworCXhmc19idWZfdAkqYWdmYnA7CisJeGZzX2J1Zl90CSphZ2licDsKKwl4ZnNfZGFkZHJfdAlhZ2ZkYWRkcjsKKwl4ZnNfZGFkZHJfdAlhZ2lkYWRkcjsKKwl4ZnNfYnVmX3QJKnNiYnA7CisjaWZkZWYgWEZTX0xPVURfUkVDT1ZFUlkKKwl4ZnNfc2JfdAkqc2JwOworI2VuZGlmCisJeGZzX2FnbnVtYmVyX3QJYWdubzsKKwlfX3VpbnQ2NF90CWZyZWVibGtzOworCV9fdWludDY0X3QJaXRvdGFsOworCV9fdWludDY0X3QJaWZyZWU7CisKKwltcCA9IGxvZy0+bF9tcDsKKworCWZyZWVibGtzID0gMExMOworCWl0b3RhbCA9IDBMTDsKKwlpZnJlZSA9IDBMTDsKKwlmb3IgKGFnbm8gPSAwOyBhZ25vIDwgbXAtPm1fc2Iuc2JfYWdjb3VudDsgYWdubysrKSB7CisJCWFnZmRhZGRyID0gWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBYRlNfQUdGX0RBRERSKG1wKSk7CisJCWFnZmJwID0geGZzX2J1Zl9yZWFkKG1wLT5tX2RkZXZfdGFyZ3AsIGFnZmRhZGRyLAorCQkJCVhGU19GU1NfVE9fQkIobXAsIDEpLCAwKTsKKwkJaWYgKFhGU19CVUZfSVNFUlJPUihhZ2ZicCkpIHsKKwkJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX3JlY292ZXJfY2hlY2tfc3VtbWFyeShhZ2YpIiwKKwkJCQkJCW1wLCBhZ2ZicCwgYWdmZGFkZHIpOworCQl9CisJCWFnZnAgPSBYRlNfQlVGX1RPX0FHRihhZ2ZicCk7CisJCUFTU0VSVChYRlNfQUdGX01BR0lDID09CisJCQlJTlRfR0VUKGFnZnAtPmFnZl9tYWdpY251bSwgQVJDSF9DT05WRVJUKSk7CisJCUFTU0VSVChYRlNfQUdGX0dPT0RfVkVSU0lPTigKKwkJCUlOVF9HRVQoYWdmcC0+YWdmX3ZlcnNpb25udW0sIEFSQ0hfQ09OVkVSVCkpKTsKKwkJQVNTRVJUKElOVF9HRVQoYWdmcC0+YWdmX3NlcW5vLCBBUkNIX0NPTlZFUlQpID09IGFnbm8pOworCisJCWZyZWVibGtzICs9IElOVF9HRVQoYWdmcC0+YWdmX2ZyZWVibGtzLCBBUkNIX0NPTlZFUlQpICsKKwkJCSAgICBJTlRfR0VUKGFnZnAtPmFnZl9mbGNvdW50LCBBUkNIX0NPTlZFUlQpOworCQl4ZnNfYnVmX3JlbHNlKGFnZmJwKTsKKworCQlhZ2lkYWRkciA9IFhGU19BR19EQUREUihtcCwgYWdubywgWEZTX0FHSV9EQUREUihtcCkpOworCQlhZ2licCA9IHhmc19idWZfcmVhZChtcC0+bV9kZGV2X3RhcmdwLCBhZ2lkYWRkciwKKwkJCQlYRlNfRlNTX1RPX0JCKG1wLCAxKSwgMCk7CisJCWlmIChYRlNfQlVGX0lTRVJST1IoYWdpYnApKSB7CisJCQl4ZnNfaW9lcnJvcl9hbGVydCgieGxvZ19yZWNvdmVyX2NoZWNrX3N1bW1hcnkoYWdpKSIsCisJCQkJCSAgbXAsIGFnaWJwLCBhZ2lkYWRkcik7CisJCX0KKwkJYWdpcCA9IFhGU19CVUZfVE9fQUdJKGFnaWJwKTsKKwkJQVNTRVJUKFhGU19BR0lfTUFHSUMgPT0KKwkJCUlOVF9HRVQoYWdpcC0+YWdpX21hZ2ljbnVtLCBBUkNIX0NPTlZFUlQpKTsKKwkJQVNTRVJUKFhGU19BR0lfR09PRF9WRVJTSU9OKAorCQkJSU5UX0dFVChhZ2lwLT5hZ2lfdmVyc2lvbm51bSwgQVJDSF9DT05WRVJUKSkpOworCQlBU1NFUlQoSU5UX0dFVChhZ2lwLT5hZ2lfc2Vxbm8sIEFSQ0hfQ09OVkVSVCkgPT0gYWdubyk7CisKKwkJaXRvdGFsICs9IElOVF9HRVQoYWdpcC0+YWdpX2NvdW50LCBBUkNIX0NPTlZFUlQpOworCQlpZnJlZSArPSBJTlRfR0VUKGFnaXAtPmFnaV9mcmVlY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCXhmc19idWZfcmVsc2UoYWdpYnApOworCX0KKworCXNiYnAgPSB4ZnNfZ2V0c2IobXAsIDApOworI2lmZGVmIFhGU19MT1VEX1JFQ09WRVJZCisJc2JwID0gJm1wLT5tX3NiOworCXhmc194bGF0ZXNiKFhGU19CVUZfVE9fU0JQKHNiYnApLCBzYnAsIDEsIFhGU19TQl9BTExfQklUUyk7CisJY21uX2VycihDRV9OT1RFLAorCQkieGxvZ19yZWNvdmVyX2NoZWNrX3N1bW1hcnk6IHNiX2ljb3VudCAlTHUgaXRvdGFsICVMdSIsCisJCXNicC0+c2JfaWNvdW50LCBpdG90YWwpOworCWNtbl9lcnIoQ0VfTk9URSwKKwkJInhsb2dfcmVjb3Zlcl9jaGVja19zdW1tYXJ5OiBzYl9pZnJlZSAlTHUgaXRvdGFsICVMdSIsCisJCXNicC0+c2JfaWZyZWUsIGlmcmVlKTsKKwljbW5fZXJyKENFX05PVEUsCisJCSJ4bG9nX3JlY292ZXJfY2hlY2tfc3VtbWFyeTogc2JfZmRibG9ja3MgJUx1IGZyZWVibGtzICVMdSIsCisJCXNicC0+c2JfZmRibG9ja3MsIGZyZWVibGtzKTsKKyNpZiAwCisJLyoKKwkgKiBUaGlzIGlzIHR1cm5lZCBvZmYgdW50aWwgSSBhY2NvdW50IGZvciB0aGUgYWxsb2NhdGlvbgorCSAqIGJ0cmVlIGJsb2NrcyB3aGljaCBsaXZlIGluIGZyZWUgc3BhY2UuCisJICovCisJQVNTRVJUKHNicC0+c2JfaWNvdW50ID09IGl0b3RhbCk7CisJQVNTRVJUKHNicC0+c2JfaWZyZWUgPT0gaWZyZWUpOworCUFTU0VSVChzYnAtPnNiX2ZkYmxvY2tzID09IGZyZWVibGtzKTsKKyNlbmRpZgorI2VuZGlmCisJeGZzX2J1Zl9yZWxzZShzYmJwKTsKK30KKyNlbmRpZiAvKiBERUJVRyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5oIGIvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMTU4YjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmCV9fWEZTX0xPR19SRUNPVkVSX0hfXworI2RlZmluZSBfX1hGU19MT0dfUkVDT1ZFUl9IX18KKworLyoKKyAqIE1hY3Jvcywgc3RydWN0dXJlcywgcHJvdG90eXBlcyBmb3IgaW50ZXJuYWwgbG9nIG1hbmFnZXIgdXNlLgorICovCisKKyNkZWZpbmUgWExPR19SSEFTSF9CSVRTICA0CisjZGVmaW5lIFhMT0dfUkhBU0hfU0laRQkxNgorI2RlZmluZSBYTE9HX1JIQVNIX1NISUZUIDIKKyNkZWZpbmUgWExPR19SSEFTSCh0aWQpCVwKKwkoKCgoX191aW50MzJfdCl0aWQpPj5YTE9HX1JIQVNIX1NISUZUKSAmIChYTE9HX1JIQVNIX1NJWkUtMSkpCisKKyNkZWZpbmUgWExPR19NQVhfUkVHSU9OU19JTl9JVEVNICAgKFhGU19NQVhfQkxPQ0tTSVpFIC8gWEZTX0JMSV9DSFVOSyAvIDIgKyAxKQorCisKKy8qCisgKiBpdGVtIGhlYWRlcnMgYXJlIGluIHJpX2J1ZlswXS4gIEFkZGl0aW9uYWwgYnVmZmVycyBmb2xsb3cuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhsb2dfcmVjb3Zlcl9pdGVtIHsKKwlzdHJ1Y3QgeGxvZ19yZWNvdmVyX2l0ZW0gKnJpX25leHQ7CisJc3RydWN0IHhsb2dfcmVjb3Zlcl9pdGVtICpyaV9wcmV2OworCWludAkJCSByaV90eXBlOworCWludAkJCSByaV9jbnQ7CS8qIGNvdW50IG9mIHJlZ2lvbnMgZm91bmQgKi8KKwlpbnQJCQkgcmlfdG90YWw7CS8qIHRvdGFsIHJlZ2lvbnMgKi8KKwl4ZnNfbG9nX2lvdmVjX3QJCSAqcmlfYnVmOwkvKiBwdHIgdG8gcmVnaW9ucyBidWZmZXIgKi8KK30geGxvZ19yZWNvdmVyX2l0ZW1fdDsKKworc3RydWN0IHhsb2dfdGlkOwordHlwZWRlZiBzdHJ1Y3QgeGxvZ19yZWNvdmVyIHsKKwlzdHJ1Y3QgeGxvZ19yZWNvdmVyICpyX25leHQ7CisJeGxvZ190aWRfdAkgICAgcl9sb2dfdGlkOwkJLyogbG9nJ3MgdHJhbnNhY3Rpb24gaWQgKi8KKwl4ZnNfdHJhbnNfaGVhZGVyX3QgIHJfdGhlYWRlcjsJCS8qIHRyYW5zIGhlYWRlciBmb3IgcGFydGlhbCAqLworCWludAkJICAgIHJfc3RhdGU7CQkvKiBub3QgbmVlZGVkICovCisJeGZzX2xzbl90CSAgICByX2xzbjsJCS8qIHhhY3QgbHNuICovCisJeGxvZ19yZWNvdmVyX2l0ZW1fdCAqcl9pdGVtcTsJCS8qIHEgZm9yIGl0ZW1zICovCit9IHhsb2dfcmVjb3Zlcl90OworCisjZGVmaW5lIElURU1fVFlQRShpKQkoKih1c2hvcnQgKikoaSktPnJpX2J1ZlswXS5pX2FkZHIpCisKKy8qCisgKiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbF9idWZfY2FuY2VsX3RhYmxlIHVzZWQgZHVyaW5nCisgKiByZWNvdmVyeS4KKyAqLworI2RlZmluZQlYTE9HX0JDX1RBQkxFX1NJWkUJNjQKKworI2RlZmluZQlYTE9HX1JFQ09WRVJfUEFTUzEJMQorI2RlZmluZQlYTE9HX1JFQ09WRVJfUEFTUzIJMgorCisjZW5kaWYJLyogX19YRlNfTE9HX1JFQ09WRVJfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX21hYy5oIGIvZnMveGZzL3hmc19tYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDU5YWFmCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19tYWMuaApAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfTUFDX0hfXworI2RlZmluZSBfX1hGU19NQUNfSF9fCisKKy8qCisgKiBNYW5kYXRvcnkgQWNjZXNzIENvbnRyb2wKKyAqCisgKiBMYXlvdXQgb2YgYSBjb21wb3NpdGUgTUFDIGxhYmVsOgorICogbWxfbGlzdCBjb250YWlucyB0aGUgbGlzdCBvZiBjYXRlZ29yaWVzIChNU0VOKSBmb2xsb3dlZCBieSB0aGUgbGlzdCBvZgorICogZGl2aXNpb25zIChNSU5UKS4gVGhpcyBpcyBhY3R1YWxseSBhIGhlYWRlciBmb3IgdGhlIGRhdGEgc3RydWN0dXJlIHdoaWNoCisgKiB3aWxsIGhhdmUgYW4gbWxfbGlzdCB3aXRoIG1vcmUgdGhhbiBvbmUgZWxlbWVudC4KKyAqCisgKiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgfCBtbF9tc2VuX3R5cGUgfCBtbF9taW50X3R5cGUgfAorICogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgIHwgbWxfbGV2ZWwgICAgIHwgbWxfZ3JhZGUgICAgIHwKKyAqICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICB8IG1sX2NhdGNvdW50ICAgICAgICAgICAgICAgICB8CisgKiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgfCBtbF9kaXZjb3VudCAgICAgICAgICAgICAgICAgfAorICogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgIHwgY2F0ZWdvcnkgMSAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgfCAuIC4gLiAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICB8IGNhdGVnb3J5IE4gICAgICAgICAgICAgICAgICB8ICh3aGVyZSBOID0gbWxfY2F0Y291bnQpCisgKiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgfCBkaXZpc2lvbiAxICAgICAgICAgICAgICAgICAgfAorICogICAgICB8IC4gLiAuICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgIHwgZGl2aXNpb24gTSAgICAgICAgICAgICAgICAgIHwgKHdoZXJlIE0gPSBtbF9kaXZjb3VudCkKKyAqICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjZGVmaW5lIFhGU19NQUNfTUFYX1NFVFMJMjUwCit0eXBlZGVmIHN0cnVjdCB4ZnNfbWFjX2xhYmVsIHsKKwlfX3VpbnQ4X3QJbWxfbXNlbl90eXBlOwkvKiBNU0VOIGxhYmVsIHR5cGUgKi8KKwlfX3VpbnQ4X3QJbWxfbWludF90eXBlOwkvKiBNSU5UIGxhYmVsIHR5cGUgKi8KKwlfX3VpbnQ4X3QJbWxfbGV2ZWw7CS8qIEhpZXJhcmNoaWNhbCBsZXZlbCAqLworCV9fdWludDhfdAltbF9ncmFkZTsJLyogSGllcmFyY2hpY2FsIGdyYWRlICovCisJX191aW50MTZfdAltbF9jYXRjb3VudDsJLyogQ2F0ZWdvcnkgY291bnQgKi8KKwlfX3VpbnQxNl90CW1sX2RpdmNvdW50OwkvKiBEaXZpc2lvbiBjb3VudCAqLworCQkJCQkvKiBDYXRlZ29yeSBzZXQsIHRoZW4gRGl2aXNpb24gc2V0ICovCisJX191aW50MTZfdAltbF9saXN0W1hGU19NQUNfTUFYX1NFVFNdOworfSB4ZnNfbWFjX2xhYmVsX3Q7CisKKy8qIE1TRU4gbGFiZWwgdHlwZSBuYW1lcy4gQ2hvb3NlIGFuIHVwcGVyIGNhc2UgQVNDSUkgY2hhcmFjdGVyLiAgKi8KKyNkZWZpbmUgWEZTX01TRU5fQURNSU5fTEFCRUwJJ0EnCS8qIEFkbWluOiBsb3c8YWRtaW4gIT0gdGNzZWM8aGlnaCAqLworI2RlZmluZSBYRlNfTVNFTl9FUVVBTF9MQUJFTAknRScJLyogV2lsZGNhcmQgLSBhbHdheXMgZXF1YWwgKi8KKyNkZWZpbmUgWEZTX01TRU5fSElHSF9MQUJFTAknSCcJLyogU3lzdGVtIEhpZ2ggLSBhbHdheXMgZG9taW5hdGVzICovCisjZGVmaW5lIFhGU19NU0VOX01MRF9ISUdIX0xBQkVMCSdJJwkvKiBTeXN0ZW0gSGlnaCwgbXVsdGktbGV2ZWwgZGlyICovCisjZGVmaW5lIFhGU19NU0VOX0xPV19MQUJFTAknTCcJLyogU3lzdGVtIExvdyAtIGFsd2F5cyBkb21pbmF0ZWQgKi8KKyNkZWZpbmUgWEZTX01TRU5fTUxEX0xBQkVMCSdNJwkvKiBUQ1NFQyBsYWJlbCBvbiBhIG11bHRpLWxldmVsIGRpciAqLworI2RlZmluZSBYRlNfTVNFTl9NTERfTE9XX0xBQkVMCSdOJwkvKiBTeXN0ZW0gTG93LCBtdWx0aS1sZXZlbCBkaXIgKi8KKyNkZWZpbmUgWEZTX01TRU5fVENTRUNfTEFCRUwJJ1QnCS8qIFRDU0VDIGxhYmVsICovCisjZGVmaW5lIFhGU19NU0VOX1VOS05PV05fTEFCRUwJJ1UnCS8qIHVua25vd24gbGFiZWwgKi8KKworLyogTUlOVCBsYWJlbCB0eXBlIG5hbWVzLiBDaG9vc2UgYSBsb3dlciBjYXNlIEFTQ0lJIGNoYXJhY3Rlci4gICovCisjZGVmaW5lIFhGU19NSU5UX0JJQkFfTEFCRUwJJ2InCS8qIER1YWwgb2YgYSBUQ1NFQyBsYWJlbCAqLworI2RlZmluZSBYRlNfTUlOVF9FUVVBTF9MQUJFTAknZScJLyogV2lsZGNhcmQgLSBhbHdheXMgZXF1YWwgKi8KKyNkZWZpbmUgWEZTX01JTlRfSElHSF9MQUJFTAknaCcJLyogSGlnaCBHcmFkZSAtIGFsd2F5cyBkb21pbmF0ZXMgKi8KKyNkZWZpbmUgWEZTX01JTlRfTE9XX0xBQkVMCSdsJwkvKiBMb3cgR3JhZGUgLSBhbHdheXMgZG9taW5hdGVkICovCisKKy8qIE9uLWRpc2sgWEZTIGV4dGVuZGVkIGF0dHJpYnV0ZSBuYW1lcyAqLworI2RlZmluZSBTR0lfTUFDX0ZJTEUJIlNHSV9NQUNfRklMRSIKKyNkZWZpbmUgU0dJX01BQ19GSUxFX1NJWkUJKHNpemVvZihTR0lfTUFDX0ZJTEUpLTEpCisKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2lmZGVmIENPTkZJR19GU19QT1NJWF9NQUMKKworLyogTk9UIFlFVCBJTVBMRU1FTlRFRCAqLworCisjZGVmaW5lIE1BQ0VYRUMJCTAwMTAwCisjZGVmaW5lIE1BQ1dSSVRFCTAwMjAwCisjZGVmaW5lIE1BQ1JFQUQJCTAwNDAwCisKK3N0cnVjdCB4ZnNfaW5vZGU7CitleHRlcm4gaW50ICB4ZnNfbWFjX2lhY2Nlc3Moc3RydWN0IHhmc19pbm9kZSAqLCBtb2RlX3QsIGNyZWRfdCAqKTsKKworI2RlZmluZSBfTUFDX1hGU19JQUNDRVNTKGksbSxjKSAoeGZzX21hY19pYWNjZXNzKGksbSxjKSkKKyNkZWZpbmUgX01BQ19WQUNDRVNTKHYsYyxtKQkoeGZzX21hY192YWNjZXNzKHYsYyxtKSkKKyNkZWZpbmUgX01BQ19FWElTVFMJCXhmc19tYWNfdmhhc2xhYmVsCisKKyNlbHNlCisjZGVmaW5lIF9NQUNfWEZTX0lBQ0NFU1MoaSxtLGMpCSgwKQorI2RlZmluZSBfTUFDX1ZBQ0NFU1ModixjLG0pCSgwKQorI2RlZmluZSBfTUFDX0VYSVNUUwkJKE5VTEwpCisjZW5kaWYKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCS8qIF9fWEZTX01BQ19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbWFjcm9zLmMgYi9mcy94ZnMveGZzX21hY3Jvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNGY0NmMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX21hY3Jvcy5jCkBAIC0wLDAgKzEsMjEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2RlZmluZQlYRlNfTUFDUk9fQworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisjaW5jbHVkZSAieGZzX2xvZ19wcml2LmgiCisjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfbGVhZi5oIgorI2luY2x1ZGUgInhmc19kaXJfbGVhZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX2RhdGEuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9sZWFmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfYmxvY2suaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9ub2RlLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19JU05VTExEU1RBUlRCTE9DSykKK2ludAoraXNudWxsZHN0YXJ0YmxvY2soeGZzX2Rmc2Jub190IHgpCit7CisJcmV0dXJuIElTTlVMTERTVEFSVEJMT0NLKHgpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX0lTTlVMTFNUQVJUQkxPQ0spCitpbnQKK2lzbnVsbHN0YXJ0YmxvY2soeGZzX2ZzYmxvY2tfdCB4KQoreworCXJldHVybiBJU05VTExTVEFSVEJMT0NLKHgpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX05VTExTVEFSVEJMT0NLKQoreGZzX2ZzYmxvY2tfdAorbnVsbHN0YXJ0YmxvY2soaW50IGspCit7CisJcmV0dXJuIE5VTExTVEFSVEJMT0NLKGspOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1NUQVJUQkxPQ0tWQUwpCit4ZnNfZmlsYmxrc190CitzdGFydGJsb2NrdmFsKHhmc19mc2Jsb2NrX3QgeCkKK3sKKwlyZXR1cm4gU1RBUlRCTE9DS1ZBTCh4KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUdfQ0hFQ0tfREFERFIpCit2b2lkCit4ZnNfYWdfY2hlY2tfZGFkZHIoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGFkZHJfdCBkLCB4ZnNfZXh0bGVuX3QgbGVuKQoreworCVhGU19BR19DSEVDS19EQUREUihtcCwgZCwgbGVuKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUdfREFERFIpCit4ZnNfZGFkZHJfdAoreGZzX2FnX2RhZGRyKHhmc19tb3VudF90ICptcCwgeGZzX2FnbnVtYmVyX3QgYWdubywgeGZzX2RhZGRyX3QgZCkKK3sKKwlyZXR1cm4gWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBkKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUdfTUFYTEVWRUxTKQoraW50Cit4ZnNfYWdfbWF4bGV2ZWxzKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0FHX01BWExFVkVMUyhtcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FHQl9UT19EQUREUikKK3hmc19kYWRkcl90Cit4ZnNfYWdiX3RvX2RhZGRyKHhmc19tb3VudF90ICptcCwgeGZzX2FnbnVtYmVyX3QgYWdubywgeGZzX2FnYmxvY2tfdCBhZ2JubykKK3sKKwlyZXR1cm4gWEZTX0FHQl9UT19EQUREUihtcCwgYWdubywgYWdibm8pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BR0JfVE9fRlNCKQoreGZzX2ZzYmxvY2tfdAoreGZzX2FnYl90b19mc2IoeGZzX21vdW50X3QgKm1wLCB4ZnNfYWdudW1iZXJfdCBhZ25vLCB4ZnNfYWdibG9ja190IGFnYm5vKQoreworCXJldHVybiBYRlNfQUdCX1RPX0ZTQihtcCwgYWdubywgYWdibm8pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BR0JMT0NLX01BWCkKK3hmc19hZ2Jsb2NrX3QKK3hmc19hZ2Jsb2NrX21heCh4ZnNfYWdibG9ja190IGEsIHhmc19hZ2Jsb2NrX3QgYikKK3sKKwlyZXR1cm4gWEZTX0FHQkxPQ0tfTUFYKGEsIGIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BR0JMT0NLX01JTikKK3hmc19hZ2Jsb2NrX3QKK3hmc19hZ2Jsb2NrX21pbih4ZnNfYWdibG9ja190IGEsIHhmc19hZ2Jsb2NrX3QgYikKK3sKKwlyZXR1cm4gWEZTX0FHQkxPQ0tfTUlOKGEsIGIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BR0ZfQkxPQ0spCit4ZnNfYWdibG9ja190Cit4ZnNfYWdmX2Jsb2NrKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0FHRl9CTE9DSyhtcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FHRl9HT09EX1ZFUlNJT04pCitpbnQKK3hmc19hZ2ZfZ29vZF92ZXJzaW9uKHVuc2lnbmVkIHYpCit7CisJcmV0dXJuIFhGU19BR0ZfR09PRF9WRVJTSU9OKHYpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BR0ZMX0JMT0NLKQoreGZzX2FnYmxvY2tfdAoreGZzX2FnZmxfYmxvY2soeGZzX21vdW50X3QgKm1wKQoreworCXJldHVybiBYRlNfQUdGTF9CTE9DSyhtcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FHSV9CTE9DSykKK3hmc19hZ2Jsb2NrX3QKK3hmc19hZ2lfYmxvY2soeGZzX21vdW50X3QgKm1wKQoreworCXJldHVybiBYRlNfQUdJX0JMT0NLKG1wKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUdJX0dPT0RfVkVSU0lPTikKK2ludAoreGZzX2FnaV9nb29kX3ZlcnNpb24odW5zaWduZWQgdikKK3sKKwlyZXR1cm4gWEZTX0FHSV9HT09EX1ZFUlNJT04odik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FHSU5PX1RPX0FHQk5PKQoreGZzX2FnYmxvY2tfdAoreGZzX2FnaW5vX3RvX2FnYm5vKHhmc19tb3VudF90ICptcCwgeGZzX2FnaW5vX3QgaSkKK3sKKwlyZXR1cm4gWEZTX0FHSU5PX1RPX0FHQk5PKG1wLCBpKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUdJTk9fVE9fSU5PKQoreGZzX2lub190Cit4ZnNfYWdpbm9fdG9faW5vKHhmc19tb3VudF90ICptcCwgeGZzX2FnbnVtYmVyX3QgYSwgeGZzX2FnaW5vX3QgaSkKK3sKKwlyZXR1cm4gWEZTX0FHSU5PX1RPX0lOTyhtcCwgYSwgaSk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FHSU5PX1RPX09GRlNFVCkKK2ludAoreGZzX2FnaW5vX3RvX29mZnNldCh4ZnNfbW91bnRfdCAqbXAsIHhmc19hZ2lub190IGkpCit7CisJcmV0dXJuIFhGU19BR0lOT19UT19PRkZTRVQobXAsIGkpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BTExPQ19CTE9DS19NQVhSRUNTKQoraW50Cit4ZnNfYWxsb2NfYmxvY2tfbWF4cmVjcyhpbnQgbGV2LCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKK3sKKwlyZXR1cm4gWEZTX0FMTE9DX0JMT0NLX01BWFJFQ1MobGV2LCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BTExPQ19CTE9DS19NSU5SRUNTKQoraW50Cit4ZnNfYWxsb2NfYmxvY2tfbWlucmVjcyhpbnQgbGV2LCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKK3sKKwlyZXR1cm4gWEZTX0FMTE9DX0JMT0NLX01JTlJFQ1MobGV2LCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BTExPQ19CTE9DS19TSVpFKQorLypBUkdTVVNFRDEqLworaW50Cit4ZnNfYWxsb2NfYmxvY2tfc2l6ZShpbnQgbGV2LCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKK3sKKwlyZXR1cm4gWEZTX0FMTE9DX0JMT0NLX1NJWkUobGV2LCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BTExPQ19LRVlfQUREUikKKy8qQVJHU1VTRUQzKi8KK3hmc19hbGxvY19rZXlfdCAqCit4ZnNfYWxsb2Nfa2V5X2FkZHIoeGZzX2FsbG9jX2Jsb2NrX3QgKmJiLCBpbnQgaSwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCit7CisJcmV0dXJuIFhGU19BTExPQ19LRVlfQUREUihiYiwgaSwgY3VyKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUxMT0NfUFRSX0FERFIpCit4ZnNfYWxsb2NfcHRyX3QgKgoreGZzX2FsbG9jX3B0cl9hZGRyKHhmc19hbGxvY19ibG9ja190ICpiYiwgaW50IGksIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfQUxMT0NfUFRSX0FERFIoYmIsIGksIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FMTE9DX1JFQ19BRERSKQorLypBUkdTVVNFRDMqLworeGZzX2FsbG9jX3JlY190ICoKK3hmc19hbGxvY19yZWNfYWRkcih4ZnNfYWxsb2NfYmxvY2tfdCAqYmIsIGludCBpLCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKK3sKKwlyZXR1cm4gWEZTX0FMTE9DX1JFQ19BRERSKGJiLCBpLCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BVFRSX0xFQUZfRU5UU0laRV9MT0NBTCkKK2ludAoreGZzX2F0dHJfbGVhZl9lbnRzaXplX2xvY2FsKGludCBubGVuLCBpbnQgdmxlbikKK3sKKwlyZXR1cm4gWEZTX0FUVFJfTEVBRl9FTlRTSVpFX0xPQ0FMKG5sZW4sIHZsZW4pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BVFRSX0xFQUZfRU5UU0laRV9MT0NBTF9NQVgpCitpbnQKK3hmc19hdHRyX2xlYWZfZW50c2l6ZV9sb2NhbF9tYXgoaW50IGJzaXplKQoreworCXJldHVybiBYRlNfQVRUUl9MRUFGX0VOVFNJWkVfTE9DQUxfTUFYKGJzaXplKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQVRUUl9MRUFGX0VOVFNJWkVfUkVNT1RFKQoraW50Cit4ZnNfYXR0cl9sZWFmX2VudHNpemVfcmVtb3RlKGludCBubGVuKQoreworCXJldHVybiBYRlNfQVRUUl9MRUFGX0VOVFNJWkVfUkVNT1RFKG5sZW4pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BVFRSX0xFQUZfTkFNRSkKK2NoYXIgKgoreGZzX2F0dHJfbGVhZl9uYW1lKHhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmcCwgaW50IGlkeCkKK3sKKwlyZXR1cm4gWEZTX0FUVFJfTEVBRl9OQU1FKGxlYWZwLCBpZHgpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BVFRSX0xFQUZfTkFNRV9MT0NBTCkKK3hmc19hdHRyX2xlYWZfbmFtZV9sb2NhbF90ICoKK3hmc19hdHRyX2xlYWZfbmFtZV9sb2NhbCh4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZnAsIGludCBpZHgpCit7CisJcmV0dXJuIFhGU19BVFRSX0xFQUZfTkFNRV9MT0NBTChsZWFmcCwgaWR4KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKQoreGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZV90ICoKK3hmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGUoeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWZwLCBpbnQgaWR4KQoreworCXJldHVybiBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWZwLCBpZHgpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BVFRSX1NGX0VOVFNJWkUpCitpbnQKK3hmc19hdHRyX3NmX2VudHNpemUoeGZzX2F0dHJfc2ZfZW50cnlfdCAqc2ZlcCkKK3sKKwlyZXR1cm4gWEZTX0FUVFJfU0ZfRU5UU0laRShzZmVwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQVRUUl9TRl9FTlRTSVpFX0JZTkFNRSkKK2ludAoreGZzX2F0dHJfc2ZfZW50c2l6ZV9ieW5hbWUoaW50IG5sZW4sIGludCB2bGVuKQoreworCXJldHVybiBYRlNfQVRUUl9TRl9FTlRTSVpFX0JZTkFNRShubGVuLCB2bGVuKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQVRUUl9TRl9ORVhURU5UUlkpCit4ZnNfYXR0cl9zZl9lbnRyeV90ICoKK3hmc19hdHRyX3NmX25leHRlbnRyeSh4ZnNfYXR0cl9zZl9lbnRyeV90ICpzZmVwKQoreworCXJldHVybiBYRlNfQVRUUl9TRl9ORVhURU5UUlkoc2ZlcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FUVFJfU0ZfVE9UU0laRSkKK2ludAoreGZzX2F0dHJfc2ZfdG90c2l6ZSh4ZnNfaW5vZGVfdCAqZHApCit7CisJcmV0dXJuIFhGU19BVFRSX1NGX1RPVFNJWkUoZHApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CSFZUT0kpCit4ZnNfaW5vZGVfdCAqCit4ZnNfYmh2dG9pKGJodl9kZXNjX3QgKmJodnApCit7CisJcmV0dXJuIFhGU19CSFZUT0koYmh2cCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JIVlRPTSkKK3hmc19tb3VudF90ICoKK3hmc19iaHZ0b20oYmh2X2Rlc2NfdCAqYmRwKQoreworCXJldHVybiBYRlNfQkhWVE9NKGJkcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX1ZGU1RPTSkKK3hmc19tb3VudF90ICoKK3hmc192ZnN0b20odmZzX3QgKnZmcykKK3sKKwlyZXR1cm4gWEZTX1ZGU1RPTSh2ZnMpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTV9NQVhMRVZFTFMpCitpbnQKK3hmc19ibV9tYXhsZXZlbHMoeGZzX21vdW50X3QgKm1wLCBpbnQgdykKK3sKKwlyZXR1cm4gWEZTX0JNX01BWExFVkVMUyhtcCwgdyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQkxPQ0tfRE1BWFJFQ1MpCitpbnQKK3hmc19ibWFwX2Jsb2NrX2RtYXhyZWNzKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfQk1BUF9CTE9DS19ETUFYUkVDUyhsZXYsIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQkxPQ0tfRE1JTlJFQ1MpCitpbnQKK3hmc19ibWFwX2Jsb2NrX2RtaW5yZWNzKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfQk1BUF9CTE9DS19ETUlOUkVDUyhsZXYsIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQkxPQ0tfRFNJWkUpCitpbnQKK3hmc19ibWFwX2Jsb2NrX2RzaXplKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfQk1BUF9CTE9DS19EU0laRShsZXYsIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MpCitpbnQKK3hmc19ibWFwX2Jsb2NrX2ltYXhyZWNzKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfQk1BUF9CTE9DS19JTUFYUkVDUyhsZXYsIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQkxPQ0tfSU1JTlJFQ1MpCitpbnQKK3hmc19ibWFwX2Jsb2NrX2ltaW5yZWNzKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfQk1BUF9CTE9DS19JTUlOUkVDUyhsZXYsIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQkxPQ0tfSVNJWkUpCitpbnQKK3hmc19ibWFwX2Jsb2NrX2lzaXplKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfQk1BUF9CTE9DS19JU0laRShsZXYsIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQlJPT1RfS0VZX0FERFIpCisvKkFSR1NVU0VEMyovCit4ZnNfYm1idF9rZXlfdCAqCit4ZnNfYm1hcF9icm9vdF9rZXlfYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIGludCBzeikKK3sKKwlyZXR1cm4gWEZTX0JNQVBfQlJPT1RfS0VZX0FERFIoYmIsIGksIHN6KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk1BUF9CUk9PVF9NQVhSRUNTKQoraW50Cit4ZnNfYm1hcF9icm9vdF9tYXhyZWNzKGludCBzeikKK3sKKwlyZXR1cm4gWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhzeik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQlJPT1RfTlVNUkVDUykKK2ludAoreGZzX2JtYXBfYnJvb3RfbnVtcmVjcyh4ZnNfYm1kcl9ibG9ja190ICpiYikKK3sKKwlyZXR1cm4gWEZTX0JNQVBfQlJPT1RfTlVNUkVDUyhiYik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIpCit4ZnNfYm1idF9wdHJfdCAqCit4ZnNfYm1hcF9icm9vdF9wdHJfYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIGludCBzeikKK3sKKwlyZXR1cm4gWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIoYmIsIGksIHN6KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk1BUF9CUk9PVF9SRUNfQUREUikKKy8qQVJHU1VTRUQzKi8KK3hmc19ibWJ0X3JlY190ICoKK3hmc19ibWFwX2Jyb290X3JlY19hZGRyKHhmc19ibWJ0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgaW50IHN6KQoreworCXJldHVybiBYRlNfQk1BUF9CUk9PVF9SRUNfQUREUihiYiwgaSwgc3opOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX0JST09UX1NQQUNFKQoraW50Cit4ZnNfYm1hcF9icm9vdF9zcGFjZSh4ZnNfYm1kcl9ibG9ja190ICpiYikKK3sKKwlyZXR1cm4gWEZTX0JNQVBfQlJPT1RfU1BBQ0UoYmIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX0JST09UX1NQQUNFX0NBTEMpCitpbnQKK3hmc19ibWFwX2Jyb290X3NwYWNlX2NhbGMoaW50IG5yZWNzKQoreworCXJldHVybiBYRlNfQk1BUF9CUk9PVF9TUEFDRV9DQUxDKG5yZWNzKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk1BUF9JQkxPQ0tfU0laRSkKKy8qQVJHU1VTRUQxKi8KK2ludAoreGZzX2JtYXBfaWJsb2NrX3NpemUoaW50IGxldiwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCit7CisJcmV0dXJuIFhGU19CTUFQX0lCTE9DS19TSVpFKGxldiwgY3VyKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk1BUF9JTklUKQordm9pZAoreGZzX2JtYXBfaW5pdCh4ZnNfYm1hcF9mcmVlX3QgKmZscCwgeGZzX2ZzYmxvY2tfdCAqZmJwKQoreworCVhGU19CTUFQX0lOSVQoZmxwLCBmYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX0tFWV9EQUREUikKKy8qQVJHU1VTRUQzKi8KK3hmc19ibWJ0X2tleV90ICoKK3hmc19ibWFwX2tleV9kYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfQk1BUF9LRVlfREFERFIoYmIsIGksIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfS0VZX0lBRERSKQorLypBUkdTVVNFRDMqLworeGZzX2JtYnRfa2V5X3QgKgoreGZzX2JtYXBfa2V5X2lhZGRyKHhmc19ibWJ0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCit7CisJcmV0dXJuIFhGU19CTUFQX0tFWV9JQUREUihiYiwgaSwgY3VyKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk1BUF9QVFJfREFERFIpCit4ZnNfYm1idF9wdHJfdCAqCit4ZnNfYm1hcF9wdHJfZGFkZHIoeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBpLCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKK3sKKwlyZXR1cm4gWEZTX0JNQVBfUFRSX0RBRERSKGJiLCBpLCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX1BUUl9JQUREUikKK3hmc19ibWJ0X3B0cl90ICoKK3hmc19ibWFwX3B0cl9pYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfQk1BUF9QVFJfSUFERFIoYmIsIGksIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfUkJMT0NLX0RTSVpFKQorLypBUkdTVVNFRDEqLworaW50Cit4ZnNfYm1hcF9yYmxvY2tfZHNpemUoaW50IGxldiwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCit7CisJcmV0dXJuIFhGU19CTUFQX1JCTE9DS19EU0laRShsZXYsIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfUkJMT0NLX0lTSVpFKQorLypBUkdTVVNFRDEqLworaW50Cit4ZnNfYm1hcF9yYmxvY2tfaXNpemUoaW50IGxldiwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCit7CisJcmV0dXJuIFhGU19CTUFQX1JCTE9DS19JU0laRShsZXYsIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfUkVDX0RBRERSKQorLypBUkdTVVNFRDMqLworeGZzX2JtYnRfcmVjX3QgKgoreGZzX2JtYXBfcmVjX2RhZGRyKHhmc19ibWJ0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCit7CisJcmV0dXJuIFhGU19CTUFQX1JFQ19EQUREUihiYiwgaSwgY3VyKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk1BUF9SRUNfSUFERFIpCisvKkFSR1NVU0VEMyovCit4ZnNfYm1idF9yZWNfdCAqCit4ZnNfYm1hcF9yZWNfaWFkZHIoeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBpLCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKK3sKKwlyZXR1cm4gWEZTX0JNQVBfUkVDX0lBRERSKGJiLCBpLCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX1NBTklUWV9DSEVDSykKK2ludAoreGZzX2JtYXBfc2FuaXR5X2NoZWNrKHhmc19tb3VudF90ICptcCwgeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBsZXZlbCkKK3sKKwlyZXR1cm4gWEZTX0JNQVBfU0FOSVRZX0NIRUNLKG1wLCBiYiwgbGV2ZWwpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQSV9BRkxBRykKK2ludAoreGZzX2JtYXBpX2FmbGFnKGludCB3KQoreworCXJldHVybiBYRlNfQk1BUElfQUZMQUcodyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNRFJfU1BBQ0VfQ0FMQykKK2ludAoreGZzX2JtZHJfc3BhY2VfY2FsYyhpbnQgbnJlY3MpCit7CisJcmV0dXJuIFhGU19CTURSX1NQQUNFX0NBTEMobnJlY3MpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTk9fQkxPQ0spCit4ZnNfYWdibG9ja190Cit4ZnNfYm5vX2Jsb2NrKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0JOT19CTE9DSyhtcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JUUkVFX0xPTkdfUFRSUykKK2ludAoreGZzX2J0cmVlX2xvbmdfcHRycyh4ZnNfYnRudW1fdCBidG51bSkKK3sKKwlyZXR1cm4gWEZTX0JUUkVFX0xPTkdfUFRSUyhidG51bSk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JVRl9UT19BR0YpCit4ZnNfYWdmX3QgKgoreGZzX2J1Zl90b19hZ2YoeGZzX2J1Zl90ICpicCkKK3sKKwlyZXR1cm4gWEZTX0JVRl9UT19BR0YoYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CVUZfVE9fQUdGTCkKK3hmc19hZ2ZsX3QgKgoreGZzX2J1Zl90b19hZ2ZsKHhmc19idWZfdCAqYnApCit7CisJcmV0dXJuIFhGU19CVUZfVE9fQUdGTChicCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JVRl9UT19BR0kpCit4ZnNfYWdpX3QgKgoreGZzX2J1Zl90b19hZ2koeGZzX2J1Zl90ICpicCkKK3sKKwlyZXR1cm4gWEZTX0JVRl9UT19BR0koYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CVUZfVE9fQUxMT0NfQkxPQ0spCit4ZnNfYWxsb2NfYmxvY2tfdCAqCit4ZnNfYnVmX3RvX2FsbG9jX2Jsb2NrKHhmc19idWZfdCAqYnApCit7CisJcmV0dXJuIFhGU19CVUZfVE9fQUxMT0NfQkxPQ0soYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CVUZfVE9fQkxPQ0spCit4ZnNfYnRyZWVfYmxvY2tfdCAqCit4ZnNfYnVmX3RvX2Jsb2NrKHhmc19idWZfdCAqYnApCit7CisJcmV0dXJuIFhGU19CVUZfVE9fQkxPQ0soYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CVUZfVE9fQk1CVF9CTE9DSykKK3hmc19ibWJ0X2Jsb2NrX3QgKgoreGZzX2J1Zl90b19ibWJ0X2Jsb2NrKHhmc19idWZfdCAqYnApCit7CisJcmV0dXJuIFhGU19CVUZfVE9fQk1CVF9CTE9DSyhicCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JVRl9UT19ESU5PREUpCit4ZnNfZGlub2RlX3QgKgoreGZzX2J1Zl90b19kaW5vZGUoeGZzX2J1Zl90ICpicCkKK3sKKwlyZXR1cm4gWEZTX0JVRl9UT19ESU5PREUoYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CVUZfVE9fSU5PQlRfQkxPQ0spCit4ZnNfaW5vYnRfYmxvY2tfdCAqCit4ZnNfYnVmX3RvX2lub2J0X2Jsb2NrKHhmc19idWZfdCAqYnApCit7CisJcmV0dXJuIFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CVUZfVE9fTEJMT0NLKQoreGZzX2J0cmVlX2xibG9ja190ICoKK3hmc19idWZfdG9fbGJsb2NrKHhmc19idWZfdCAqYnApCit7CisJcmV0dXJuIFhGU19CVUZfVE9fTEJMT0NLKGJwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQlVGX1RPX1NCTE9DSykKK3hmc19idHJlZV9zYmxvY2tfdCAqCit4ZnNfYnVmX3RvX3NibG9jayh4ZnNfYnVmX3QgKmJwKQoreworCXJldHVybiBYRlNfQlVGX1RPX1NCTE9DSyhicCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JVRl9UT19TQlApCit4ZnNfc2JfdCAqCit4ZnNfYnVmX3RvX3NicCh4ZnNfYnVmX3QgKmJwKQoreworCXJldHVybiBYRlNfQlVGX1RPX1NCUChicCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0NGT1JLX0FTSVpFKQoraW50Cit4ZnNfY2ZvcmtfYXNpemVfZGlzayh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwLCB4ZnNfbW91bnRfdCAqbXApCit7CisJcmV0dXJuIFhGU19DRk9SS19BU0laRV9ESVNLKGRjcCwgbXApOworfQoraW50Cit4ZnNfY2ZvcmtfYXNpemUoeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgeGZzX21vdW50X3QgKm1wKQoreworCXJldHVybiBYRlNfQ0ZPUktfQVNJWkUoZGNwLCBtcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0NGT1JLX0JPRkYpCitpbnQKK3hmc19jZm9ya19ib2ZmX2Rpc2soeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCkKK3sKKwlyZXR1cm4gWEZTX0NGT1JLX0JPRkZfRElTSyhkY3ApOworfQoraW50Cit4ZnNfY2ZvcmtfYm9mZih4ZnNfZGlub2RlX2NvcmVfdCAqZGNwKQoreworCXJldHVybiBYRlNfQ0ZPUktfQk9GRihkY3ApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19DRk9SS19EU0laRSkKK2ludAoreGZzX2Nmb3JrX2RzaXplX2Rpc2soeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgeGZzX21vdW50X3QgKm1wKQoreworCXJldHVybiBYRlNfQ0ZPUktfRFNJWkVfRElTSyhkY3AsIG1wKTsKK30KK2ludAoreGZzX2Nmb3JrX2RzaXplKHhmc19kaW5vZGVfY29yZV90ICpkY3AsIHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0NGT1JLX0RTSVpFKGRjcCwgbXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19DRk9SS19GTVRfU0VUKQordm9pZAoreGZzX2Nmb3JrX2ZtdF9zZXQoeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgaW50IHcsIGludCBuKQoreworCVhGU19DRk9SS19GTVRfU0VUKGRjcCwgdywgbik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0NGT1JLX0ZPUk1BVCkKK2ludAoreGZzX2Nmb3JrX2Zvcm1hdCh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwLCBpbnQgdykKK3sKKwlyZXR1cm4gWEZTX0NGT1JLX0ZPUk1BVChkY3AsIHcpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19DRk9SS19ORVhUX1NFVCkKK3ZvaWQKK3hmc19jZm9ya19uZXh0X3NldCh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwLCBpbnQgdywgaW50IG4pCit7CisJWEZTX0NGT1JLX05FWFRfU0VUKGRjcCwgdywgbik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0NGT1JLX05FWFRFTlRTKQoraW50Cit4ZnNfY2ZvcmtfbmV4dGVudHNfZGlzayh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwLCBpbnQgdykKK3sKKwlyZXR1cm4gWEZTX0NGT1JLX05FWFRFTlRTX0RJU0soZGNwLCB3KTsKK30KK2ludAoreGZzX2Nmb3JrX25leHRlbnRzKHhmc19kaW5vZGVfY29yZV90ICpkY3AsIGludCB3KQoreworCXJldHVybiBYRlNfQ0ZPUktfTkVYVEVOVFMoZGNwLCB3KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQ0ZPUktfUSkKK2ludAoreGZzX2Nmb3JrX3FfZGlzayh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwKQoreworCXJldHVybiBYRlNfQ0ZPUktfUV9ESVNLKGRjcCk7Cit9CitpbnQKK3hmc19jZm9ya19xKHhmc19kaW5vZGVfY29yZV90ICpkY3ApCit7CisJcmV0dXJuIFhGU19DRk9SS19RKGRjcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0NGT1JLX1NJWkUpCitpbnQKK3hmc19jZm9ya19zaXplX2Rpc2soeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgeGZzX21vdW50X3QgKm1wLCBpbnQgdykKK3sKKwlyZXR1cm4gWEZTX0NGT1JLX1NJWkVfRElTSyhkY3AsIG1wLCB3KTsKK30KK2ludAoreGZzX2Nmb3JrX3NpemUoeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgeGZzX21vdW50X3QgKm1wLCBpbnQgdykKK3sKKwlyZXR1cm4gWEZTX0NGT1JLX1NJWkUoZGNwLCBtcCwgdyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0NOVF9CTE9DSykKK3hmc19hZ2Jsb2NrX3QKK3hmc19jbnRfYmxvY2soeGZzX21vdW50X3QgKm1wKQoreworCXJldHVybiBYRlNfQ05UX0JMT0NLKG1wKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfREFfQ09PS0lFX0JOTykKK3hmc19kYWJsa190Cit4ZnNfZGFfY29va2llX2Jubyh4ZnNfbW91bnRfdCAqbXAsIHhmc19vZmZfdCBjb29raWUpCit7CisJcmV0dXJuIFhGU19EQV9DT09LSUVfQk5PKG1wLCBjb29raWUpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19EQV9DT09LSUVfRU5UUlkpCitpbnQKK3hmc19kYV9jb29raWVfZW50cnkoeGZzX21vdW50X3QgKm1wLCB4ZnNfb2ZmX3QgY29va2llKQoreworCXJldHVybiBYRlNfREFfQ09PS0lFX0VOVFJZKG1wLCBjb29raWUpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19EQV9DT09LSUVfSEFTSCkKKy8qQVJHU1VTRUQxKi8KK3hmc19kYWhhc2hfdAoreGZzX2RhX2Nvb2tpZV9oYXNoKHhmc19tb3VudF90ICptcCwgeGZzX29mZl90IGNvb2tpZSkKK3sKKwlyZXR1cm4gWEZTX0RBX0NPT0tJRV9IQVNIKG1wLCBjb29raWUpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19EQV9NQUtFX0JOT0VOVFJZKQorX191aW50MzJfdAoreGZzX2RhX21ha2VfYm5vZW50cnkoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGFibGtfdCBibm8sIGludCBlbnRyeSkKK3sKKwlyZXR1cm4gWEZTX0RBX01BS0VfQk5PRU5UUlkobXAsIGJubywgZW50cnkpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19EQV9NQUtFX0NPT0tJRSkKK3hmc19vZmZfdAoreGZzX2RhX21ha2VfY29va2llKHhmc19tb3VudF90ICptcCwgeGZzX2RhYmxrX3QgYm5vLCBpbnQgZW50cnksCisJCSAgIHhmc19kYWhhc2hfdCBoYXNoKQoreworCXJldHVybiBYRlNfREFfTUFLRV9DT09LSUUobXAsIGJubywgZW50cnksIGhhc2gpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19EQUREUl9UT19BR0JOTykKK3hmc19hZ2Jsb2NrX3QKK3hmc19kYWRkcl90b19hZ2Jubyh4ZnNfbW91bnRfdCAqbXAsIHhmc19kYWRkcl90IGQpCit7CisJcmV0dXJuIFhGU19EQUREUl9UT19BR0JOTyhtcCwgZCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RBRERSX1RPX0FHTk8pCit4ZnNfYWdudW1iZXJfdAoreGZzX2RhZGRyX3RvX2Fnbm8oeGZzX21vdW50X3QgKm1wLCB4ZnNfZGFkZHJfdCBkKQoreworCXJldHVybiBYRlNfREFERFJfVE9fQUdOTyhtcCwgZCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RBRERSX1RPX0ZTQikKK3hmc19mc2Jsb2NrX3QKK3hmc19kYWRkcl90b19mc2IoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGFkZHJfdCBkKQoreworCXJldHVybiBYRlNfREFERFJfVE9fRlNCKG1wLCBkKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfREZPUktfQVBUUikKK2NoYXIgKgoreGZzX2Rmb3JrX2FwdHIoeGZzX2Rpbm9kZV90ICpkaXApCit7CisJcmV0dXJuIFhGU19ERk9SS19BUFRSKGRpcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RGT1JLX0FTSVpFKQoraW50Cit4ZnNfZGZvcmtfYXNpemUoeGZzX2Rpbm9kZV90ICpkaXAsIHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0RGT1JLX0FTSVpFKGRpcCwgbXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ERk9SS19CT0ZGKQoraW50Cit4ZnNfZGZvcmtfYm9mZih4ZnNfZGlub2RlX3QgKmRpcCkKK3sKKwlyZXR1cm4gWEZTX0RGT1JLX0JPRkYoZGlwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfREZPUktfRFBUUikKK2NoYXIgKgoreGZzX2Rmb3JrX2RwdHIoeGZzX2Rpbm9kZV90ICpkaXApCit7CisJcmV0dXJuIFhGU19ERk9SS19EUFRSKGRpcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RGT1JLX0RTSVpFKQoraW50Cit4ZnNfZGZvcmtfZHNpemUoeGZzX2Rpbm9kZV90ICpkaXAsIHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0RGT1JLX0RTSVpFKGRpcCwgbXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ERk9SS19ORVhURU5UUykKK2ludAoreGZzX2Rmb3JrX25leHRlbnRzKHhmc19kaW5vZGVfdCAqZGlwLCBpbnQgdykKK3sKKwlyZXR1cm4gWEZTX0RGT1JLX05FWFRFTlRTKGRpcCwgdyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RGT1JLX1BUUikKK2NoYXIgKgoreGZzX2Rmb3JrX3B0cih4ZnNfZGlub2RlX3QgKmRpcCwgaW50IHcpCit7CisJcmV0dXJuIFhGU19ERk9SS19QVFIoZGlwLCB3KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfREZPUktfUSkKK2ludAoreGZzX2Rmb3JrX3EoeGZzX2Rpbm9kZV90ICpkaXApCit7CisJcmV0dXJuIFhGU19ERk9SS19RKGRpcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RGT1JLX1NJWkUpCitpbnQKK3hmc19kZm9ya19zaXplKHhmc19kaW5vZGVfdCAqZGlwLCB4ZnNfbW91bnRfdCAqbXAsIGludCB3KQoreworCXJldHVybiBYRlNfREZPUktfU0laRShkaXAsIG1wLCB3KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElOT0RFX0dPT0RfVkVSU0lPTikKK2ludAoreGZzX2Rpbm9kZV9nb29kX3ZlcnNpb24oaW50IHYpCit7CisJcmV0dXJuIFhGU19ESU5PREVfR09PRF9WRVJTSU9OKHYpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVJfTEVBRl9FTlRTSVpFX0JZRU5UUlkpCitpbnQKK3hmc19kaXJfbGVhZl9lbnRzaXplX2J5ZW50cnkoeGZzX2Rpcl9sZWFmX2VudHJ5X3QgKmVudHJ5KQoreworCXJldHVybiBYRlNfRElSX0xFQUZfRU5UU0laRV9CWUVOVFJZKGVudHJ5KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSX0xFQUZfRU5UU0laRV9CWU5BTUUpCitpbnQKK3hmc19kaXJfbGVhZl9lbnRzaXplX2J5bmFtZShpbnQgbGVuKQoreworCXJldHVybiBYRlNfRElSX0xFQUZfRU5UU0laRV9CWU5BTUUobGVuKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSX0xFQUZfTkFNRVNUUlVDVCkKK3hmc19kaXJfbGVhZl9uYW1lX3QgKgoreGZzX2Rpcl9sZWFmX25hbWVzdHJ1Y3QoeGZzX2Rpcl9sZWFmYmxvY2tfdCAqbGVhZnAsIGludCBvZmZzZXQpCit7CisJcmV0dXJuIFhGU19ESVJfTEVBRl9OQU1FU1RSVUNUKGxlYWZwLCBvZmZzZXQpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVJfU0ZfQUxMRklUKQoraW50Cit4ZnNfZGlyX3NmX2FsbGZpdChpbnQgY291bnQsIGludCB0b3RhbGxlbikKK3sKKwlyZXR1cm4gWEZTX0RJUl9TRl9BTExGSVQoY291bnQsIHRvdGFsbGVuKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSX1NGX0VOVFNJWkVfQllFTlRSWSkKK2ludAoreGZzX2Rpcl9zZl9lbnRzaXplX2J5ZW50cnkoeGZzX2Rpcl9zZl9lbnRyeV90ICpzZmVwKQoreworCXJldHVybiBYRlNfRElSX1NGX0VOVFNJWkVfQllFTlRSWShzZmVwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSX1NGX0VOVFNJWkVfQllOQU1FKQoraW50Cit4ZnNfZGlyX3NmX2VudHNpemVfYnluYW1lKGludCBsZW4pCit7CisJcmV0dXJuIFhGU19ESVJfU0ZfRU5UU0laRV9CWU5BTUUobGVuKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSX1NGX0dFVF9ESVJJTk8pCit2b2lkCit4ZnNfZGlyX3NmX2dldF9kaXJpbm8oeGZzX2Rpcl9pbm9fdCAqZnJvbSwgeGZzX2lub190ICp0bykKK3sKKwlYRlNfRElSX1NGX0dFVF9ESVJJTk8oZnJvbSwgdG8pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVJfU0ZfTkVYVEVOVFJZKQoreGZzX2Rpcl9zZl9lbnRyeV90ICoKK3hmc19kaXJfc2ZfbmV4dGVudHJ5KHhmc19kaXJfc2ZfZW50cnlfdCAqc2ZlcCkKK3sKKwlyZXR1cm4gWEZTX0RJUl9TRl9ORVhURU5UUlkoc2ZlcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUl9TRl9QVVRfRElSSU5PKQordm9pZAoreGZzX2Rpcl9zZl9wdXRfZGlyaW5vKHhmc19pbm9fdCAqZnJvbSwgeGZzX2Rpcl9pbm9fdCAqdG8pCit7CisJWEZTX0RJUl9TRl9QVVRfRElSSU5PKGZyb20sIHRvKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9CTE9DS19MRUFGX1ApCit4ZnNfZGlyMl9sZWFmX2VudHJ5X3QgKgoreGZzX2RpcjJfYmxvY2tfbGVhZl9wKHhmc19kaXIyX2Jsb2NrX3RhaWxfdCAqYnRwKQoreworCXJldHVybiBYRlNfRElSMl9CTE9DS19MRUFGX1AoYnRwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9CTE9DS19UQUlMX1ApCit4ZnNfZGlyMl9ibG9ja190YWlsX3QgKgoreGZzX2RpcjJfYmxvY2tfdGFpbF9wKHhmc19tb3VudF90ICptcCwgeGZzX2RpcjJfYmxvY2tfdCAqYmxvY2spCit7CisJcmV0dXJuIFhGU19ESVIyX0JMT0NLX1RBSUxfUChtcCwgYmxvY2spOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX0JZVEVfVE9fREEpCit4ZnNfZGFibGtfdAoreGZzX2RpcjJfYnl0ZV90b19kYSh4ZnNfbW91bnRfdCAqbXAsIHhmc19kaXIyX29mZl90IGJ5KQoreworCXJldHVybiBYRlNfRElSMl9CWVRFX1RPX0RBKG1wLCBieSk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfQllURV9UT19EQVRBUFRSKQorLyogQVJHU1VTRUQgKi8KK3hmc19kaXIyX2RhdGFwdHJfdAoreGZzX2RpcjJfYnl0ZV90b19kYXRhcHRyKHhmc19tb3VudF90ICptcCwgeGZzX2RpcjJfb2ZmX3QgYnkpCit7CisJcmV0dXJuIFhGU19ESVIyX0JZVEVfVE9fREFUQVBUUihtcCwgYnkpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX0JZVEVfVE9fREIpCit4ZnNfZGlyMl9kYl90Cit4ZnNfZGlyMl9ieXRlX3RvX2RiKHhmc19tb3VudF90ICptcCwgeGZzX2RpcjJfb2ZmX3QgYnkpCit7CisJcmV0dXJuIFhGU19ESVIyX0JZVEVfVE9fREIobXAsIGJ5KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9CWVRFX1RPX09GRikKK3hmc19kaXIyX2RhdGFfYW9mZl90Cit4ZnNfZGlyMl9ieXRlX3RvX29mZih4ZnNfbW91bnRfdCAqbXAsIHhmc19kaXIyX29mZl90IGJ5KQoreworCXJldHVybiBYRlNfRElSMl9CWVRFX1RPX09GRihtcCwgYnkpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX0RBX1RPX0JZVEUpCit4ZnNfZGlyMl9vZmZfdAoreGZzX2RpcjJfZGFfdG9fYnl0ZSh4ZnNfbW91bnRfdCAqbXAsIHhmc19kYWJsa190IGRhKQoreworCXJldHVybiBYRlNfRElSMl9EQV9UT19CWVRFKG1wLCBkYSk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfREFfVE9fREIpCit4ZnNfZGlyMl9kYl90Cit4ZnNfZGlyMl9kYV90b19kYih4ZnNfbW91bnRfdCAqbXAsIHhmc19kYWJsa190IGRhKQoreworCXJldHVybiBYRlNfRElSMl9EQV9UT19EQihtcCwgZGEpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX0RBVEFfRU5UUllfVEFHX1ApCit4ZnNfZGlyMl9kYXRhX29mZl90ICoKK3hmc19kaXIyX2RhdGFfZW50cnlfdGFnX3AoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICpkZXApCit7CisJcmV0dXJuIFhGU19ESVIyX0RBVEFfRU5UUllfVEFHX1AoZGVwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9EQVRBX0VOVFNJWkUpCitpbnQKK3hmc19kaXIyX2RhdGFfZW50c2l6ZShpbnQgbikKK3sKKwlyZXR1cm4gWEZTX0RJUjJfREFUQV9FTlRTSVpFKG4pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX0RBVEFfVU5VU0VEX1RBR19QKQoreGZzX2RpcjJfZGF0YV9vZmZfdCAqCit4ZnNfZGlyMl9kYXRhX3VudXNlZF90YWdfcCh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICpkdXApCit7CisJcmV0dXJuIFhGU19ESVIyX0RBVEFfVU5VU0VEX1RBR19QKGR1cCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfREFUQVBUUl9UT19CWVRFKQorLyogQVJHU1VTRUQgKi8KK3hmc19kaXIyX29mZl90Cit4ZnNfZGlyMl9kYXRhcHRyX3RvX2J5dGUoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGlyMl9kYXRhcHRyX3QgZHApCit7CisJcmV0dXJuIFhGU19ESVIyX0RBVEFQVFJfVE9fQllURShtcCwgZHApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX0RBVEFQVFJfVE9fREIpCit4ZnNfZGlyMl9kYl90Cit4ZnNfZGlyMl9kYXRhcHRyX3RvX2RiKHhmc19tb3VudF90ICptcCwgeGZzX2RpcjJfZGF0YXB0cl90IGRwKQoreworCXJldHVybiBYRlNfRElSMl9EQVRBUFRSX1RPX0RCKG1wLCBkcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfREFUQVBUUl9UT19PRkYpCit4ZnNfZGlyMl9kYXRhX2FvZmZfdAoreGZzX2RpcjJfZGF0YXB0cl90b19vZmYoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGlyMl9kYXRhcHRyX3QgZHApCit7CisJcmV0dXJuIFhGU19ESVIyX0RBVEFQVFJfVE9fT0ZGKG1wLCBkcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfREJfT0ZGX1RPX0JZVEUpCit4ZnNfZGlyMl9vZmZfdAoreGZzX2RpcjJfZGJfb2ZmX3RvX2J5dGUoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGlyMl9kYl90IGRiLAorCQkJeGZzX2RpcjJfZGF0YV9hb2ZmX3QgbykKK3sKKwlyZXR1cm4gWEZTX0RJUjJfREJfT0ZGX1RPX0JZVEUobXAsIGRiLCBvKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9EQl9PRkZfVE9fREFUQVBUUikKK3hmc19kaXIyX2RhdGFwdHJfdAoreGZzX2RpcjJfZGJfb2ZmX3RvX2RhdGFwdHIoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGlyMl9kYl90IGRiLAorCQkJICAgeGZzX2RpcjJfZGF0YV9hb2ZmX3QgbykKK3sKKwlyZXR1cm4gWEZTX0RJUjJfREJfT0ZGX1RPX0RBVEFQVFIobXAsIGRiLCBvKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9EQl9UT19EQSkKK3hmc19kYWJsa190Cit4ZnNfZGlyMl9kYl90b19kYSh4ZnNfbW91bnRfdCAqbXAsIHhmc19kaXIyX2RiX3QgZGIpCit7CisJcmV0dXJuIFhGU19ESVIyX0RCX1RPX0RBKG1wLCBkYik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfREJfVE9fRkRCKQoreGZzX2RpcjJfZGJfdAoreGZzX2RpcjJfZGJfdG9fZmRiKHhmc19tb3VudF90ICptcCwgeGZzX2RpcjJfZGJfdCBkYikKK3sKKwlyZXR1cm4gWEZTX0RJUjJfREJfVE9fRkRCKG1wLCBkYik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfREJfVE9fRkRJTkRFWCkKK2ludAoreGZzX2RpcjJfZGJfdG9fZmRpbmRleCh4ZnNfbW91bnRfdCAqbXAsIHhmc19kaXIyX2RiX3QgZGIpCit7CisJcmV0dXJuIFhGU19ESVIyX0RCX1RPX0ZESU5ERVgobXAsIGRiKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9MRUFGX0JFU1RTX1ApCit4ZnNfZGlyMl9kYXRhX29mZl90ICoKK3hmc19kaXIyX2xlYWZfYmVzdHNfcCh4ZnNfZGlyMl9sZWFmX3RhaWxfdCAqbHRwKQoreworCXJldHVybiBYRlNfRElSMl9MRUFGX0JFU1RTX1AobHRwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9MRUFGX1RBSUxfUCkKK3hmc19kaXIyX2xlYWZfdGFpbF90ICoKK3hmc19kaXIyX2xlYWZfdGFpbF9wKHhmc19tb3VudF90ICptcCwgeGZzX2RpcjJfbGVhZl90ICpscCkKK3sKKwlyZXR1cm4gWEZTX0RJUjJfTEVBRl9UQUlMX1AobXAsIGxwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9NQVhfTEVBRl9FTlRTKQoraW50Cit4ZnNfZGlyMl9tYXhfbGVhZl9lbnRzKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0RJUjJfTUFYX0xFQUZfRU5UUyhtcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfU0ZfRU5UU0laRV9CWUVOVFJZKQoraW50Cit4ZnNfZGlyMl9zZl9lbnRzaXplX2J5ZW50cnkoeGZzX2RpcjJfc2ZfdCAqc2ZwLCB4ZnNfZGlyMl9zZl9lbnRyeV90ICpzZmVwKQoreworCXJldHVybiBYRlNfRElSMl9TRl9FTlRTSVpFX0JZRU5UUlkoc2ZwLCBzZmVwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9TRl9GSVJTVEVOVFJZKQoreGZzX2RpcjJfc2ZfZW50cnlfdCAqCit4ZnNfZGlyMl9zZl9maXJzdGVudHJ5KHhmc19kaXIyX3NmX3QgKnNmcCkKK3sKKwlyZXR1cm4gWEZTX0RJUjJfU0ZfRklSU1RFTlRSWShzZnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX1NGX0VOVFNJWkVfQllOQU1FKQoraW50Cit4ZnNfZGlyMl9zZl9lbnRzaXplX2J5bmFtZSh4ZnNfZGlyMl9zZl90ICpzZnAsIGludCBsZW4pCit7CisJcmV0dXJuIFhGU19ESVIyX1NGX0VOVFNJWkVfQllOQU1FKHNmcCwgbGVuKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9TRl9HRVRfSU5VTUJFUikKK3hmc19pbnRpbm9fdAoreGZzX2RpcjJfc2ZfZ2V0X2ludW1iZXIoeGZzX2RpcjJfc2ZfdCAqc2ZwLCB4ZnNfZGlyMl9pbm91X3QgKmZyb20pCit7CisJcmV0dXJuIFhGU19ESVIyX1NGX0dFVF9JTlVNQkVSKHNmcCwgZnJvbSk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfU0ZfR0VUX09GRlNFVCkKK3hmc19kaXIyX2RhdGFfYW9mZl90Cit4ZnNfZGlyMl9zZl9nZXRfb2Zmc2V0KHhmc19kaXIyX3NmX2VudHJ5X3QgKnNmZXApCit7CisJcmV0dXJuIFhGU19ESVIyX1NGX0dFVF9PRkZTRVQoc2ZlcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfU0ZfSERSX1NJWkUpCitpbnQKK3hmc19kaXIyX3NmX2hkcl9zaXplKGludCBpOGNvdW50KQoreworCXJldHVybiBYRlNfRElSMl9TRl9IRFJfU0laRShpOGNvdW50KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9TRl9JTlVNQkVSUCkKK3hmc19kaXIyX2lub3VfdCAqCit4ZnNfZGlyMl9zZl9pbnVtYmVycCh4ZnNfZGlyMl9zZl9lbnRyeV90ICpzZmVwKQoreworCXJldHVybiBYRlNfRElSMl9TRl9JTlVNQkVSUChzZmVwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9TRl9ORVhURU5UUlkpCit4ZnNfZGlyMl9zZl9lbnRyeV90ICoKK3hmc19kaXIyX3NmX25leHRlbnRyeSh4ZnNfZGlyMl9zZl90ICpzZnAsIHhmc19kaXIyX3NmX2VudHJ5X3QgKnNmZXApCit7CisJcmV0dXJuIFhGU19ESVIyX1NGX05FWFRFTlRSWShzZnAsIHNmZXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX1NGX1BVVF9JTlVNQkVSKQordm9pZAoreGZzX2RpcjJfc2ZfcHV0X2ludW1iZXIoeGZzX2RpcjJfc2ZfdCAqc2ZwLCB4ZnNfaW5vX3QgKmZyb20sIHhmc19kaXIyX2lub3VfdCAqdG8pCit7CisJWEZTX0RJUjJfU0ZfUFVUX0lOVU1CRVIoc2ZwLCBmcm9tLCB0byk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfU0ZfUFVUX09GRlNFVCkKK3ZvaWQKK3hmc19kaXIyX3NmX3B1dF9vZmZzZXQoeGZzX2RpcjJfc2ZfZW50cnlfdCAqc2ZlcCwgeGZzX2RpcjJfZGF0YV9hb2ZmX3Qgb2ZmKQoreworCVhGU19ESVIyX1NGX1BVVF9PRkZTRVQoc2ZlcCwgb2ZmKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRVhURk1UX0lOT0RFICkKK3hmc19leG50Zm10X3QKK3hmc19leHRmbXRfaW5vZGUoc3RydWN0IHhmc19pbm9kZSAqaXApCit7CisJcmV0dXJuIFhGU19FWFRGTVRfSU5PREUoaXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19FWFRMRU5fTUFYKQoreGZzX2V4dGxlbl90Cit4ZnNfZXh0bGVuX21heCh4ZnNfZXh0bGVuX3QgYSwgeGZzX2V4dGxlbl90IGIpCit7CisJcmV0dXJuIFhGU19FWFRMRU5fTUFYKGEsIGIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19FWFRMRU5fTUlOKQoreGZzX2V4dGxlbl90Cit4ZnNfZXh0bGVuX21pbih4ZnNfZXh0bGVuX3QgYSwgeGZzX2V4dGxlbl90IGIpCit7CisJcmV0dXJuIFhGU19FWFRMRU5fTUlOKGEsIGIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19GSUxCTEtTX01BWCkKK3hmc19maWxibGtzX3QKK3hmc19maWxibGtzX21heCh4ZnNfZmlsYmxrc190IGEsIHhmc19maWxibGtzX3QgYikKK3sKKwlyZXR1cm4gWEZTX0ZJTEJMS1NfTUFYKGEsIGIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19GSUxCTEtTX01JTikKK3hmc19maWxibGtzX3QKK3hmc19maWxibGtzX21pbih4ZnNfZmlsYmxrc190IGEsIHhmc19maWxibGtzX3QgYikKK3sKKwlyZXR1cm4gWEZTX0ZJTEJMS1NfTUlOKGEsIGIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19GSUxFT0ZGX01BWCkKK3hmc19maWxlb2ZmX3QKK3hmc19maWxlb2ZmX21heCh4ZnNfZmlsZW9mZl90IGEsIHhmc19maWxlb2ZmX3QgYikKK3sKKwlyZXR1cm4gWEZTX0ZJTEVPRkZfTUFYKGEsIGIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19GSUxFT0ZGX01JTikKK3hmc19maWxlb2ZmX3QKK3hmc19maWxlb2ZmX21pbih4ZnNfZmlsZW9mZl90IGEsIHhmc19maWxlb2ZmX3QgYikKK3sKKwlyZXR1cm4gWEZTX0ZJTEVPRkZfTUlOKGEsIGIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19GU0JfU0FOSVRZX0NIRUNLKQoraW50Cit4ZnNfZnNiX3Nhbml0eV9jaGVjayh4ZnNfbW91bnRfdCAqbXAsIHhmc19mc2Jsb2NrX3QgZnNibm8pCit7CisJcmV0dXJuIFhGU19GU0JfU0FOSVRZX0NIRUNLKG1wLCBmc2Jubyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0ZTQl9UT19BR0JOTykKK3hmc19hZ2Jsb2NrX3QKK3hmc19mc2JfdG9fYWdibm8oeGZzX21vdW50X3QgKm1wLCB4ZnNfZnNibG9ja190IGZzYm5vKQoreworCXJldHVybiBYRlNfRlNCX1RPX0FHQk5PKG1wLCBmc2Jubyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0ZTQl9UT19BR05PKQoreGZzX2FnbnVtYmVyX3QKK3hmc19mc2JfdG9fYWdubyh4ZnNfbW91bnRfdCAqbXAsIHhmc19mc2Jsb2NrX3QgZnNibm8pCit7CisJcmV0dXJuIFhGU19GU0JfVE9fQUdOTyhtcCwgZnNibm8pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19GU0JfVE9fREFERFIpCit4ZnNfZGFkZHJfdAoreGZzX2ZzYl90b19kYWRkcih4ZnNfbW91bnRfdCAqbXAsIHhmc19mc2Jsb2NrX3QgZnNibm8pCit7CisJcmV0dXJuIFhGU19GU0JfVE9fREFERFIobXAsIGZzYm5vKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRlNCX1RPX0RCKQoreGZzX2RhZGRyX3QKK3hmc19mc2JfdG9fZGIoeGZzX2lub2RlX3QgKmlwLCB4ZnNfZnNibG9ja190IGZzYikKK3sKKwlyZXR1cm4gWEZTX0ZTQl9UT19EQihpcCwgZnNiKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSERSX0JMT0NLKQoreGZzX2FnYmxvY2tfdAoreGZzX2hkcl9ibG9jayh4ZnNfbW91bnRfdCAqbXAsIHhmc19kYWRkcl90IGQpCit7CisJcmV0dXJuIFhGU19IRFJfQkxPQ0sobXAsIGQpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JQUxMT0NfQkxPQ0tTKQoreGZzX2V4dGxlbl90Cit4ZnNfaWFsbG9jX2Jsb2Nrcyh4ZnNfbW91bnRfdCAqbXApCit7CisJcmV0dXJuIFhGU19JQUxMT0NfQkxPQ0tTKG1wKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSUFMTE9DX0ZJTkRfRlJFRSkKK2ludAoreGZzX2lhbGxvY19maW5kX2ZyZWUoeGZzX2lub2ZyZWVfdCAqZnApCit7CisJcmV0dXJuIFhGU19JQUxMT0NfRklORF9GUkVFKGZwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSUFMTE9DX0lOT0RFUykKK2ludAoreGZzX2lhbGxvY19pbm9kZXMoeGZzX21vdW50X3QgKm1wKQoreworCXJldHVybiBYRlNfSUFMTE9DX0lOT0RFUyhtcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lCVF9CTE9DSykKK3hmc19hZ2Jsb2NrX3QKK3hmc19pYnRfYmxvY2soeGZzX21vdW50X3QgKm1wKQoreworCXJldHVybiBYRlNfSUJUX0JMT0NLKG1wKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSUZPUktfQVNJWkUpCitpbnQKK3hmc19pZm9ya19hc2l6ZSh4ZnNfaW5vZGVfdCAqaXApCit7CisJcmV0dXJuIFhGU19JRk9SS19BU0laRShpcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lGT1JLX0RTSVpFKQoraW50Cit4ZnNfaWZvcmtfZHNpemUoeGZzX2lub2RlX3QgKmlwKQoreworCXJldHVybiBYRlNfSUZPUktfRFNJWkUoaXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JRk9SS19GTVRfU0VUKQordm9pZAoreGZzX2lmb3JrX2ZtdF9zZXQoeGZzX2lub2RlX3QgKmlwLCBpbnQgdywgaW50IG4pCit7CisJWEZTX0lGT1JLX0ZNVF9TRVQoaXAsIHcsIG4pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JRk9SS19GT1JNQVQpCitpbnQKK3hmc19pZm9ya19mb3JtYXQoeGZzX2lub2RlX3QgKmlwLCBpbnQgdykKK3sKKwlyZXR1cm4gWEZTX0lGT1JLX0ZPUk1BVChpcCwgdyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lGT1JLX05FWFRfU0VUKQordm9pZAoreGZzX2lmb3JrX25leHRfc2V0KHhmc19pbm9kZV90ICppcCwgaW50IHcsIGludCBuKQoreworCVhGU19JRk9SS19ORVhUX1NFVChpcCwgdywgbik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lGT1JLX05FWFRFTlRTKQoraW50Cit4ZnNfaWZvcmtfbmV4dGVudHMoeGZzX2lub2RlX3QgKmlwLCBpbnQgdykKK3sKKwlyZXR1cm4gWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSUZPUktfUFRSKQoreGZzX2lmb3JrX3QgKgoreGZzX2lmb3JrX3B0cih4ZnNfaW5vZGVfdCAqaXAsIGludCB3KQoreworCXJldHVybiBYRlNfSUZPUktfUFRSKGlwLCB3KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSUZPUktfUSkKK2ludAoreGZzX2lmb3JrX3EoeGZzX2lub2RlX3QgKmlwKQoreworCXJldHVybiBYRlNfSUZPUktfUShpcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lGT1JLX1NJWkUpCitpbnQKK3hmc19pZm9ya19zaXplKHhmc19pbm9kZV90ICppcCwgaW50IHcpCit7CisJcmV0dXJuIFhGU19JRk9SS19TSVpFKGlwLCB3KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSUxPR19GQlJPT1QpCitpbnQKK3hmc19pbG9nX2Zicm9vdChpbnQgdykKK3sKKwlyZXR1cm4gWEZTX0lMT0dfRkJST09UKHcpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTE9HX0ZEQVRBKQoraW50Cit4ZnNfaWxvZ19mZGF0YShpbnQgdykKK3sKKwlyZXR1cm4gWEZTX0lMT0dfRkRBVEEodyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lMT0dfRkVYVCkKK2ludAoreGZzX2lsb2dfZmV4dChpbnQgdykKK3sKKwlyZXR1cm4gWEZTX0lMT0dfRkVYVCh3KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5fTUFYTEVWRUxTKQoraW50Cit4ZnNfaW5fbWF4bGV2ZWxzKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0lOX01BWExFVkVMUyhtcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT19BR0JOT19CSVRTKQoraW50Cit4ZnNfaW5vX2FnYm5vX2JpdHMoeGZzX21vdW50X3QgKm1wKQoreworCXJldHVybiBYRlNfSU5PX0FHQk5PX0JJVFMobXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9fQUdJTk9fQklUUykKK2ludAoreGZzX2lub19hZ2lub19iaXRzKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0lOT19BR0lOT19CSVRTKG1wKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5PX0FHTk9fQklUUykKK2ludAoreGZzX2lub19hZ25vX2JpdHMoeGZzX21vdW50X3QgKm1wKQoreworCXJldHVybiBYRlNfSU5PX0FHTk9fQklUUyhtcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT19CSVRTKQoraW50Cit4ZnNfaW5vX2JpdHMoeGZzX21vdW50X3QgKm1wKQoreworCXJldHVybiBYRlNfSU5PX0JJVFMobXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9fTUFTSykKK19fdWludDMyX3QKK3hmc19pbm9fbWFzayhpbnQgaykKK3sKKwlyZXR1cm4gWEZTX0lOT19NQVNLKGspOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9fT0ZGU0VUX0JJVFMpCitpbnQKK3hmc19pbm9fb2Zmc2V0X2JpdHMoeGZzX21vdW50X3QgKm1wKQoreworCXJldHVybiBYRlNfSU5PX09GRlNFVF9CSVRTKG1wKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5PX1RPX0FHQk5PKQoreGZzX2FnYmxvY2tfdAoreGZzX2lub190b19hZ2Jubyh4ZnNfbW91bnRfdCAqbXAsIHhmc19pbm9fdCBpKQoreworCXJldHVybiBYRlNfSU5PX1RPX0FHQk5PKG1wLCBpKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5PX1RPX0FHSU5PKQoreGZzX2FnaW5vX3QKK3hmc19pbm9fdG9fYWdpbm8oeGZzX21vdW50X3QgKm1wLCB4ZnNfaW5vX3QgaSkKK3sKKwlyZXR1cm4gWEZTX0lOT19UT19BR0lOTyhtcCwgaSk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT19UT19BR05PKQoreGZzX2FnbnVtYmVyX3QKK3hmc19pbm9fdG9fYWdubyh4ZnNfbW91bnRfdCAqbXAsIHhmc19pbm9fdCBpKQoreworCXJldHVybiBYRlNfSU5PX1RPX0FHTk8obXAsIGkpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9fVE9fRlNCKQoreGZzX2ZzYmxvY2tfdAoreGZzX2lub190b19mc2IoeGZzX21vdW50X3QgKm1wLCB4ZnNfaW5vX3QgaSkKK3sKKwlyZXR1cm4gWEZTX0lOT19UT19GU0IobXAsIGkpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9fVE9fT0ZGU0VUKQoraW50Cit4ZnNfaW5vX3RvX29mZnNldCh4ZnNfbW91bnRfdCAqbXAsIHhmc19pbm9fdCBpKQoreworCXJldHVybiBYRlNfSU5PX1RPX09GRlNFVChtcCwgaSk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT0JUX0JMT0NLX01BWFJFQ1MpCitpbnQKK3hmc19pbm9idF9ibG9ja19tYXhyZWNzKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfSU5PQlRfQkxPQ0tfTUFYUkVDUyhsZXYsIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT0JUX0JMT0NLX01JTlJFQ1MpCitpbnQKK3hmc19pbm9idF9ibG9ja19taW5yZWNzKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfSU5PQlRfQkxPQ0tfTUlOUkVDUyhsZXYsIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT0JUX0JMT0NLX1NJWkUpCisvKkFSR1NVU0VEMSovCitpbnQKK3hmc19pbm9idF9ibG9ja19zaXplKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfSU5PQlRfQkxPQ0tfU0laRShsZXYsIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT0JUX0NMUl9GUkVFKQordm9pZAoreGZzX2lub2J0X2Nscl9mcmVlKHhmc19pbm9idF9yZWNfdCAqcnAsIGludCBpKQoreworCVhGU19JTk9CVF9DTFJfRlJFRShycCwgaSk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT0JUX0lTX0ZSRUUpCitpbnQKK3hmc19pbm9idF9pc19mcmVlKHhmc19pbm9idF9yZWNfdCAqcnAsIGludCBpKQoreworCXJldHVybiBYRlNfSU5PQlRfSVNfRlJFRShycCwgaSk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT0JUX0lTX0xBU1RfUkVDKQoraW50Cit4ZnNfaW5vYnRfaXNfbGFzdF9yZWMoeGZzX2J0cmVlX2N1cl90ICpjdXIpCit7CisJcmV0dXJuIFhGU19JTk9CVF9JU19MQVNUX1JFQyhjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9CVF9LRVlfQUREUikKKy8qQVJHU1VTRUQzKi8KK3hmc19pbm9idF9rZXlfdCAqCit4ZnNfaW5vYnRfa2V5X2FkZHIoeGZzX2lub2J0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCit7CisJcmV0dXJuIFhGU19JTk9CVF9LRVlfQUREUihiYiwgaSwgY3VyKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5PQlRfTUFTSykKK3hmc19pbm9mcmVlX3QKK3hmc19pbm9idF9tYXNrKGludCBpKQoreworCXJldHVybiBYRlNfSU5PQlRfTUFTSyhpKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5PQlRfTUFTS04pCit4ZnNfaW5vZnJlZV90Cit4ZnNfaW5vYnRfbWFza24oaW50IGksIGludCBuKQoreworCXJldHVybiBYRlNfSU5PQlRfTUFTS04oaSwgbik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT0JUX1BUUl9BRERSKQoreGZzX2lub2J0X3B0cl90ICoKK3hmc19pbm9idF9wdHJfYWRkcih4ZnNfaW5vYnRfYmxvY2tfdCAqYmIsIGludCBpLCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKK3sKKwlyZXR1cm4gWEZTX0lOT0JUX1BUUl9BRERSKGJiLCBpLCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9CVF9SRUNfQUREUikKKy8qQVJHU1VTRUQzKi8KK3hmc19pbm9idF9yZWNfdCAqCit4ZnNfaW5vYnRfcmVjX2FkZHIoeGZzX2lub2J0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCit7CisJcmV0dXJuIFhGU19JTk9CVF9SRUNfQUREUihiYiwgaSwgY3VyKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5PQlRfU0VUX0ZSRUUpCit2b2lkCit4ZnNfaW5vYnRfc2V0X2ZyZWUoeGZzX2lub2J0X3JlY190ICpycCwgaW50IGkpCit7CisJWEZTX0lOT0JUX1NFVF9GUkVFKHJwLCBpKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSVRPQkhWKQorYmh2X2Rlc2NfdCAqCit4ZnNfaXRvYmh2KHhmc19pbm9kZV90ICppcCkKK3sKKwlyZXR1cm4gWEZTX0lUT0JIVihpcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lUT1YpCit2bm9kZV90ICoKK3hmc19pdG92KHhmc19pbm9kZV90ICppcCkKK3sKKwlyZXR1cm4gWEZTX0lUT1YoaXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19MQkxPRykKK2ludAoreGZzX2xibG9nKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0xCTE9HKG1wKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTEJTSVpFKQoraW50Cit4ZnNfbGJzaXplKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0xCU0laRShtcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0xJQ19BTExfRlJFRSkKK3ZvaWQKK3hmc19saWNfYWxsX2ZyZWUoeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwKQoreworCVhGU19MSUNfQUxMX0ZSRUUoY3ApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19MSUNfQVJFX0FMTF9GUkVFKQoraW50Cit4ZnNfbGljX2FyZV9hbGxfZnJlZSh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqY3ApCit7CisJcmV0dXJuIFhGU19MSUNfQVJFX0FMTF9GUkVFKGNwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTElDX0NMQUlNKQordm9pZAoreGZzX2xpY19jbGFpbSh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqY3AsIGludCBzbG90KQoreworCVhGU19MSUNfQ0xBSU0oY3AsIHNsb3QpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19MSUNfREVTQ19UT19DSFVOSykKK3hmc19sb2dfaXRlbV9jaHVua190ICoKK3hmc19saWNfZGVzY190b19jaHVuayh4ZnNfbG9nX2l0ZW1fZGVzY190ICpkcCkKK3sKKwlyZXR1cm4gWEZTX0xJQ19ERVNDX1RPX0NIVU5LKGRwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTElDX0RFU0NfVE9fU0xPVCkKK2ludAoreGZzX2xpY19kZXNjX3RvX3Nsb3QoeGZzX2xvZ19pdGVtX2Rlc2NfdCAqZHApCit7CisJcmV0dXJuIFhGU19MSUNfREVTQ19UT19TTE9UKGRwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTElDX0lOSVQpCit2b2lkCit4ZnNfbGljX2luaXQoeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwKQoreworCVhGU19MSUNfSU5JVChjcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0xJQ19JTklUX1NMT1QpCit2b2lkCit4ZnNfbGljX2luaXRfc2xvdCh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqY3AsIGludCBzbG90KQoreworCVhGU19MSUNfSU5JVF9TTE9UKGNwLCBzbG90KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTElDX0lTRlJFRSkKK2ludAoreGZzX2xpY19pc2ZyZWUoeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwLCBpbnQgc2xvdCkKK3sKKwlyZXR1cm4gWEZTX0xJQ19JU0ZSRUUoY3AsIHNsb3QpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19MSUNfUkVMU0UpCit2b2lkCit4ZnNfbGljX3JlbHNlKHhmc19sb2dfaXRlbV9jaHVua190ICpjcCwgaW50IHNsb3QpCit7CisJWEZTX0xJQ19SRUxTRShjcCwgc2xvdCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0xJQ19TTE9UKQoreGZzX2xvZ19pdGVtX2Rlc2NfdCAqCit4ZnNfbGljX3Nsb3QoeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwLCBpbnQgc2xvdCkKK3sKKwlyZXR1cm4gWEZTX0xJQ19TTE9UKGNwLCBzbG90KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTElDX1ZBQ0FOQ1kpCitpbnQKK3hmc19saWNfdmFjYW5jeSh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqY3ApCit7CisJcmV0dXJuIFhGU19MSUNfVkFDQU5DWShjcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0xJVElOTykKK2ludAoreGZzX2xpdGlubyh4ZnNfbW91bnRfdCAqbXApCit7CisJcmV0dXJuIFhGU19MSVRJTk8obXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19NQUtFX0lQVFIpCit4ZnNfZGlub2RlX3QgKgoreGZzX21ha2VfaXB0cih4ZnNfbW91bnRfdCAqbXAsIHhmc19idWZfdCAqYiwgaW50IG8pCit7CisJcmV0dXJuIFhGU19NQUtFX0lQVFIobXAsIGIsIG8pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19NQVNLMzJISSkKK19fdWludDMyX3QKK3hmc19tYXNrMzJoaShpbnQgbikKK3sKKwlyZXR1cm4gWEZTX01BU0szMkhJKG4pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19NQVNLMzJMTykKK19fdWludDMyX3QKK3hmc19tYXNrMzJsbyhpbnQgbikKK3sKKwlyZXR1cm4gWEZTX01BU0szMkxPKG4pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19NQVNLNjRISSkKK19fdWludDY0X3QKK3hmc19tYXNrNjRoaShpbnQgbikKK3sKKwlyZXR1cm4gWEZTX01BU0s2NEhJKG4pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19NQVNLNjRMTykKK19fdWludDY0X3QKK3hmc19tYXNrNjRsbyhpbnQgbikKK3sKKwlyZXR1cm4gWEZTX01BU0s2NExPKG4pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19NSU5fRlJFRUxJU1QpCitpbnQKK3hmc19taW5fZnJlZWxpc3QoeGZzX2FnZl90ICphLCB4ZnNfbW91bnRfdCAqbXApCit7CisJcmV0dXJuIFhGU19NSU5fRlJFRUxJU1QoYSwgbXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19NSU5fRlJFRUxJU1RfUEFHKQoraW50Cit4ZnNfbWluX2ZyZWVsaXN0X3BhZyh4ZnNfcGVyYWdfdCAqcGFnLCB4ZnNfbW91bnRfdCAqbXApCit7CisJcmV0dXJuIFhGU19NSU5fRlJFRUxJU1RfUEFHKHBhZywgbXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19NSU5fRlJFRUxJU1RfUkFXKQoraW50Cit4ZnNfbWluX2ZyZWVsaXN0X3Jhdyh1aW50IGJsLCB1aW50IGNsLCB4ZnNfbW91bnRfdCAqbXApCit7CisJcmV0dXJuIFhGU19NSU5fRlJFRUxJU1RfUkFXKGJsLCBjbCwgbXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19NVE9WRlMpCit2ZnNfdCAqCit4ZnNfbXRvdmZzKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX01UT1ZGUyhtcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX09GRkJOT19UT19BR0lOTykKK3hmc19hZ2lub190Cit4ZnNfb2ZmYm5vX3RvX2FnaW5vKHhmc19tb3VudF90ICptcCwgeGZzX2FnYmxvY2tfdCBiLCBpbnQgbykKK3sKKwlyZXR1cm4gWEZTX09GRkJOT19UT19BR0lOTyhtcCwgYiwgbyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX1BSRUFMTE9DX0JMT0NLUykKK3hmc19hZ2Jsb2NrX3QKK3hmc19wcmVhbGxvY19ibG9ja3MoeGZzX21vdW50X3QgKm1wKQoreworCXJldHVybiBYRlNfUFJFQUxMT0NfQkxPQ0tTKG1wKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfQkxPQ0spCit4ZnNfYWdibG9ja190Cit4ZnNfc2JfYmxvY2soeGZzX21vdW50X3QgKm1wKQoreworCXJldHVybiBYRlNfU0JfQkxPQ0sobXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9HT09EX1ZFUlNJT04pCitpbnQKK3hmc19zYl9nb29kX3ZlcnNpb24oeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gWEZTX1NCX0dPT0RfVkVSU0lPTihzYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0FEREFUVFIpCit2b2lkCit4ZnNfc2JfdmVyc2lvbl9hZGRhdHRyKHhmc19zYl90ICpzYnApCit7CisJWEZTX1NCX1ZFUlNJT05fQUREQVRUUihzYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0FERERBTElHTikKK3ZvaWQKK3hmc19zYl92ZXJzaW9uX2FkZGRhbGlnbih4ZnNfc2JfdCAqc2JwKQoreworCVhGU19TQl9WRVJTSU9OX0FERERBTElHTihzYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0FERE5MSU5LKQordm9pZAoreGZzX3NiX3ZlcnNpb25fYWRkbmxpbmsoeGZzX3NiX3QgKnNicCkKK3sKKwlYRlNfU0JfVkVSU0lPTl9BREROTElOSyhzYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0FERFFVT1RBKQordm9pZAoreGZzX3NiX3ZlcnNpb25fYWRkcXVvdGEoeGZzX3NiX3QgKnNicCkKK3sKKwlYRlNfU0JfVkVSU0lPTl9BRERRVU9UQShzYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0FERFNIQVJFRCkKK3ZvaWQKK3hmc19zYl92ZXJzaW9uX2FkZHNoYXJlZCh4ZnNfc2JfdCAqc2JwKQoreworCVhGU19TQl9WRVJTSU9OX0FERFNIQVJFRChzYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0hBU0FMSUdOKQoraW50Cit4ZnNfc2JfdmVyc2lvbl9oYXNhbGlnbih4ZnNfc2JfdCAqc2JwKQoreworCXJldHVybiBYRlNfU0JfVkVSU0lPTl9IQVNBTElHTihzYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0hBU0FUVFIpCitpbnQKK3hmc19zYl92ZXJzaW9uX2hhc2F0dHIoeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fSEFTQVRUUihzYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0hBU0RBTElHTikKK2ludAoreGZzX3NiX3ZlcnNpb25faGFzZGFsaWduKHhmc19zYl90ICpzYnApCit7CisJcmV0dXJuIFhGU19TQl9WRVJTSU9OX0hBU0RBTElHTihzYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0hBU0RJUlYyKQoraW50Cit4ZnNfc2JfdmVyc2lvbl9oYXNkaXJ2Mih4ZnNfc2JfdCAqc2JwKQoreworCXJldHVybiBYRlNfU0JfVkVSU0lPTl9IQVNESVJWMihzYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0hBU0VYVEZMR0JJVCkKK2ludAoreGZzX3NiX3ZlcnNpb25faGFzZXh0ZmxnYml0KHhmc19zYl90ICpzYnApCit7CisJcmV0dXJuIFhGU19TQl9WRVJTSU9OX0hBU0VYVEZMR0JJVChzYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0hBU05MSU5LKQoraW50Cit4ZnNfc2JfdmVyc2lvbl9oYXNubGluayh4ZnNfc2JfdCAqc2JwKQoreworCXJldHVybiBYRlNfU0JfVkVSU0lPTl9IQVNOTElOSyhzYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0hBU1FVT1RBKQoraW50Cit4ZnNfc2JfdmVyc2lvbl9oYXNxdW90YSh4ZnNfc2JfdCAqc2JwKQoreworCXJldHVybiBYRlNfU0JfVkVSU0lPTl9IQVNRVU9UQShzYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0hBU1NIQVJFRCkKK2ludAoreGZzX3NiX3ZlcnNpb25faGFzc2hhcmVkKHhmc19zYl90ICpzYnApCit7CisJcmV0dXJuIFhGU19TQl9WRVJTSU9OX0hBU1NIQVJFRChzYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX05VTSkKK2ludAoreGZzX3NiX3ZlcnNpb25fbnVtKHhmc19zYl90ICpzYnApCit7CisJcmV0dXJuIFhGU19TQl9WRVJTSU9OX05VTShzYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX1NVQkFMSUdOKQordm9pZAoreGZzX3NiX3ZlcnNpb25fc3ViYWxpZ24oeGZzX3NiX3QgKnNicCkKK3sKKwlYRlNfU0JfVkVSU0lPTl9TVUJBTElHTihzYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX1NVQlNIQVJFRCkKK3ZvaWQKK3hmc19zYl92ZXJzaW9uX3N1YnNoYXJlZCh4ZnNfc2JfdCAqc2JwKQoreworCVhGU19TQl9WRVJTSU9OX1NVQlNIQVJFRChzYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0hBU0xPR1YyKQoraW50Cit4ZnNfc2JfdmVyc2lvbl9oYXNsb2d2Mih4ZnNfc2JfdCAqc2JwKQoreworCXJldHVybiBYRlNfU0JfVkVSU0lPTl9IQVNMT0dWMihzYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0hBU1NFQ1RPUikKK2ludAoreGZzX3NiX3ZlcnNpb25faGFzc2VjdG9yKHhmc19zYl90ICpzYnApCit7CisJcmV0dXJuIFhGU19TQl9WRVJTSU9OX0hBU1NFQ1RPUihzYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX1RPTkVXKQordW5zaWduZWQKK3hmc19zYl92ZXJzaW9uX3RvbmV3KHVuc2lnbmVkIHYpCit7CisJcmV0dXJuIFhGU19TQl9WRVJTSU9OX1RPTkVXKHYpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX1RPT0xEKQordW5zaWduZWQKK3hmc19zYl92ZXJzaW9uX3Rvb2xkKHVuc2lnbmVkIHYpCit7CisJcmV0dXJuIFhGU19TQl9WRVJTSU9OX1RPT0xEKHYpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hMT0dfR1JBTlRfQUREX1NQQUNFKQordm9pZAoreGxvZ19ncmFudF9hZGRfc3BhY2UoeGxvZ190ICpsb2csIGludCBieXRlcywgaW50IHR5cGUpCit7CisJWExPR19HUkFOVF9BRERfU1BBQ0UobG9nLCBieXRlcywgdHlwZSk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWExPR19HUkFOVF9TVUJfU1BBQ0UpCit2b2lkCit4bG9nX2dyYW50X3N1Yl9zcGFjZSh4bG9nX3QgKmxvZywgaW50IGJ5dGVzLCBpbnQgdHlwZSkKK3sKKwlYTE9HX0dSQU5UX1NVQl9TUEFDRShsb2csIGJ5dGVzLCB0eXBlKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNNT1JFQklUUykKK2ludAoreGZzX3NiX3ZlcnNpb25faGFzbW9yZWJpdHMoeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fSEFTTU9SRUJJVFMoc2JwKTsKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX21hY3Jvcy5oIGIvZnMveGZzL3hmc19tYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTkzMDc1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19tYWNyb3MuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX01BQ1JPU19IX18KKyNkZWZpbmUJX19YRlNfTUFDUk9TX0hfXworCisvKgorICogU2V0IGZvciBkZWJ1ZyBrZXJuZWxzIGFuZCBzaW11bGF0aW9uCisgKiBUaGVzZSByZXBsYWNlbWVudHMgc2F2ZSBzcGFjZS4KKyAqIFVzZWQgaW4geGZzX21hY3Jvcy5jLgorICovCisjZGVmaW5lCVhGU19XQU5UX1NQQUNFX0MJXAorCSghZGVmaW5lZChfU1RBTkRBTE9ORSkgJiYgZGVmaW5lZChERUJVRykpCisKKy8qCisgKiBTZXQgZm9yIGRlYnVnIHNpbXVsYXRpb24gYW5kIGtlcm5lbCBidWlsZHMsIGJ1dCBub3QgZm9yIHN0YW5kYWxvbmUuCisgKiBUaGVzZSByZXBsYWNlbWVudHMgZG8gbm90IHNhdmUgc3BhY2UuCisgKiBVc2VkIGluIHhmc19tYWNyb3MuYy4KKyAqLworI2RlZmluZQlYRlNfV0FOVF9GVU5DU19DCVwKKwkoIWRlZmluZWQoX1NUQU5EQUxPTkUpICYmIGRlZmluZWQoREVCVUcpKQorCisvKgorICogQ29ycmVzcG9uZGluZyBuYW1lcyB1c2VkIGluIC5oIGZpbGVzLgorICovCisjZGVmaW5lCVhGU19XQU5UX1NQQUNFCShYRlNfV0FOVF9TUEFDRV9DICYmICFkZWZpbmVkKFhGU19NQUNST19DKSkKKyNkZWZpbmUJWEZTX1dBTlRfRlVOQ1MJKFhGU19XQU5UX0ZVTkNTX0MgJiYgIWRlZmluZWQoWEZTX01BQ1JPX0MpKQorCisvKgorICogVGhlc2UgYXJlIHRoZSBtYWNyb3MgdGhhdCBnZXQgdHVybmVkIGludG8gZnVuY3Rpb25zIHRvIHNhdmUgc3BhY2UuCisgKi8KKyNkZWZpbmUJWEZTU09fTlVMTFNUQVJUQkxPQ0sgMQorI2RlZmluZQlYRlNTT19YRlNfQUdCX1RPX0RBRERSIDEKKyNkZWZpbmUgWEZTU09fWEZTX0FHQl9UT19GU0IgMQorI2RlZmluZQlYRlNTT19YRlNfQUdJTk9fVE9fSU5PIDEKKyNkZWZpbmUJWEZTU09fWEZTX0FMTE9DX0JMT0NLX01JTlJFQ1MgMQorI2RlZmluZQlYRlNTT19YRlNfQVRUUl9TRl9ORVhURU5UUlkgMQorI2RlZmluZQlYRlNTT19YRlNfQk1BUF9CTE9DS19ETUFYUkVDUyAxCisjZGVmaW5lCVhGU1NPX1hGU19CTUFQX0JMT0NLX0lNQVhSRUNTIDEKKyNkZWZpbmUJWEZTU09fWEZTX0JNQVBfQkxPQ0tfSU1JTlJFQ1MgMQorI2RlZmluZQlYRlNTT19YRlNfQk1BUF9JTklUIDEKKyNkZWZpbmUJWEZTU09fWEZTX0JNQVBfUFRSX0lBRERSIDEKKyNkZWZpbmUJWEZTU09fWEZTX0JNQVBfU0FOSVRZX0NIRUNLIDEKKyNkZWZpbmUJWEZTU09fWEZTX0JNQVBJX0FGTEFHIDEKKyNkZWZpbmUJWEZTU09fWEZTX0NGT1JLX1NJWkUgMQorI2RlZmluZQlYRlNTT19YRlNfREFfQ09PS0lFX0JOTyAxCisjZGVmaW5lCVhGU1NPX1hGU19EQV9DT09LSUVfRU5UUlkgMQorI2RlZmluZQlYRlNTT19YRlNfREFERFJfVE9fQUdCTk8gMQorI2RlZmluZQlYRlNTT19YRlNfREFERFJfVE9fRlNCIDEKKyNkZWZpbmUJWEZTU09fWEZTX0RGT1JLX1BUUiAxCisjZGVmaW5lCVhGU1NPX1hGU19ESVJfU0ZfR0VUX0RJUklOTyAxCisjZGVmaW5lCVhGU1NPX1hGU19ESVJfU0ZfTkVYVEVOVFJZIDEKKyNkZWZpbmUJWEZTU09fWEZTX0RJUl9TRl9QVVRfRElSSU5PIDEKKyNkZWZpbmUJWEZTU09fWEZTX0ZJTEJMS1NfTUlOIDEKKyNkZWZpbmUJWEZTU09fWEZTX0ZTQl9TQU5JVFlfQ0hFQ0sgMQorI2RlZmluZQlYRlNTT19YRlNfRlNCX1RPX0RBRERSIDEKKyNkZWZpbmUJWEZTU09fWEZTX0ZTQl9UT19EQiAxCisjZGVmaW5lCVhGU1NPX1hGU19JQUxMT0NfSU5PREVTIDEKKyNkZWZpbmUJWEZTU09fWEZTX0lGT1JLX0FTSVpFIDEKKyNkZWZpbmUJWEZTU09fWEZTX0lGT1JLX0RTSVpFIDEKKyNkZWZpbmUJWEZTU09fWEZTX0lGT1JLX0ZPUk1BVCAxCisjZGVmaW5lCVhGU1NPX1hGU19JRk9SS19ORVhUX1NFVCAxCisjZGVmaW5lCVhGU1NPX1hGU19JRk9SS19ORVhURU5UUyAxCisjZGVmaW5lCVhGU1NPX1hGU19JRk9SS19QVFIgMQorI2RlZmluZQlYRlNTT19YRlNfSUxPR19GQlJPT1QgMQorI2RlZmluZQlYRlNTT19YRlNfSUxPR19GRVhUIDEKKyNkZWZpbmUJWEZTU09fWEZTX0lOT19NQVNLIDEKKyNkZWZpbmUJWEZTU09fWEZTX0lOT19UT19GU0IgMQorI2RlZmluZQlYRlNTT19YRlNfSU5PREVfQ0xFQVJfUkVBRF9BSEVBRCAxCisjZGVmaW5lCVhGU1NPX1hGU19NSU5fRlJFRUxJU1QgMQorI2RlZmluZSBYRlNTT19YRlNfU0JfR09PRF9WRVJTSU9OIDEKKyNkZWZpbmUgWEZTU09fWEZTX1NCX1ZFUlNJT05fSEFTTkxJTksgMQorI2RlZmluZQlYRlNTT19YTE9HX0dSQU5UX0FERF9TUEFDRSAxCisjZGVmaW5lCVhGU1NPX1hMT0dfR1JBTlRfU1VCX1NQQUNFIDEKKworI2VuZGlmCS8qIF9fWEZTX01BQ1JPU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbW91bnQuYyBiL2ZzL3hmcy94ZnNfbW91bnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTc0MjNjCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19tb3VudC5jCkBAIC0wLDAgKzEsMTU4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKyNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKKyNpbmNsdWRlICJ4ZnNfZnNvcHMuaCIKKworU1RBVElDIHZvaWQJeGZzX21vdW50X2xvZ19zYnVuaXQoeGZzX21vdW50X3QgKiwgX19pbnQ2NF90KTsKK1NUQVRJQyBpbnQJeGZzX3V1aWRfbW91bnQoeGZzX21vdW50X3QgKik7CitTVEFUSUMgdm9pZAl4ZnNfdXVpZF91bm1vdW50KHhmc19tb3VudF90ICptcCk7CisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIHNob3J0IG9mZnNldDsKKyAgICBzaG9ydCB0eXBlOyAgICAgLyogMCA9IGludGVnZXIKKwkJKiAxID0gYmluYXJ5IC8gc3RyaW5nIChubyB0cmFuc2xhdGlvbikKKwkJKi8KK30geGZzX3NiX2luZm9bXSA9IHsKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9tYWdpY251bSksICAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX2Jsb2Nrc2l6ZSksICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfZGJsb2NrcyksICAgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9yYmxvY2tzKSwgICAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX3JleHRlbnRzKSwgICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfdXVpZCksICAgICAgIDEgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9sb2dzdGFydCksICAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX3Jvb3Rpbm8pLCAgICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfcmJtaW5vKSwgICAgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9yc3VtaW5vKSwgICAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX3JleHRzaXplKSwgICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfYWdibG9ja3MpLCAgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9hZ2NvdW50KSwgICAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX3JibWJsb2NrcyksICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfbG9nYmxvY2tzKSwgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl92ZXJzaW9ubnVtKSwgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX3NlY3RzaXplKSwgICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfaW5vZGVzaXplKSwgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9pbm9wYmxvY2spLCAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX2ZuYW1lWzBdKSwgICAxIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfYmxvY2tsb2cpLCAgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9zZWN0bG9nKSwgICAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX2lub2RlbG9nKSwgICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfaW5vcGJsb2cpLCAgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9hZ2Jsa2xvZyksICAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX3JleHRzbG9nKSwgICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfaW5wcm9ncmVzcyksIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9pbWF4X3BjdCksICAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX2ljb3VudCksICAgICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfaWZyZWUpLCAgICAgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9mZGJsb2NrcyksICAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX2ZyZXh0ZW50cyksICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfdXF1b3Rpbm8pLCAgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9ncXVvdGlubyksICAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX3FmbGFncyksICAgICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfZmxhZ3MpLCAgICAgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9zaGFyZWRfdm4pLCAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX2lub2FsaWdubXQpLCAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfdW5pdCksCSAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2Jfd2lkdGgpLAkgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX2RpcmJsa2xvZyksCSAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfbG9nc2VjdGxvZyksIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9sb2dzZWN0c2l6ZSksMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX2xvZ3N1bml0KSwJIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9mZWF0dXJlczIpLAkgMCB9LAorICAgIHsgc2l6ZW9mKHhmc19zYl90KSwJCQkgMCB9Cit9OworCisvKgorICogUmV0dXJuIGEgcG9pbnRlciB0byBhbiBpbml0aWFsaXplZCB4ZnNfbW91bnQgc3RydWN0dXJlLgorICovCit4ZnNfbW91bnRfdCAqCit4ZnNfbW91bnRfaW5pdCh2b2lkKQoreworCXhmc19tb3VudF90ICptcDsKKworCW1wID0ga21lbV96YWxsb2Moc2l6ZW9mKCptcCksIEtNX1NMRUVQKTsKKworCUFJTF9MT0NLSU5JVCgmbXAtPm1fYWlsX2xvY2ssICJ4ZnNfYWlsIik7CisJc3BpbmxvY2tfaW5pdCgmbXAtPm1fc2JfbG9jaywgInhmc19zYiIpOworCW11dGV4X2luaXQoJm1wLT5tX2lsb2NrLCBNVVRFWF9ERUZBVUxULCAieGZzX2lsb2NrIik7CisJaW5pdG5zZW1hKCZtcC0+bV9ncm93bG9jaywgMSwgInhmc19ncm93Iik7CisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBBSUwuCisJICovCisJeGZzX3RyYW5zX2FpbF9pbml0KG1wKTsKKworCWF0b21pY19zZXQoJm1wLT5tX2FjdGl2ZV90cmFucywgMCk7CisKKwlyZXR1cm4gbXA7Cit9CisKKy8qCisgKiBGcmVlIHVwIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgbW91bnQgc3RydWN0dXJlLiAgQXNzdW1lIHRoYXQKKyAqIHRoZSBzdHJ1Y3R1cmUgd2FzIGluaXRpYWxseSB6ZXJvZWQsIHNvIHdlIGNhbiB0ZWxsIHdoaWNoIGZpZWxkcyBnb3QKKyAqIGluaXRpYWxpemVkLgorICovCit2b2lkCit4ZnNfbW91bnRfZnJlZSgKKwl4ZnNfbW91bnRfdCAqbXAsCisJaW50CSAgICByZW1vdmVfYmh2KQoreworCWlmIChtcC0+bV9paGFzaCkKKwkJeGZzX2loYXNoX2ZyZWUobXApOworCWlmIChtcC0+bV9jaGFzaCkKKwkJeGZzX2NoYXNoX2ZyZWUobXApOworCisJaWYgKG1wLT5tX3BlcmFnKSB7CisJCWludAlhZ25vOworCisJCWZvciAoYWdubyA9IDA7IGFnbm8gPCBtcC0+bV9tYXhhZ2k7IGFnbm8rKykKKwkJCWlmIChtcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2xpc3QpCisJCQkJa21lbV9mcmVlKG1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2JfbGlzdCwKKwkJCQkJCXNpemVvZih4ZnNfcGVyYWdfYnVzeV90KSAqCisJCQkJCQkJWEZTX1BBR0JfTlVNX1NMT1RTKTsKKwkJa21lbV9mcmVlKG1wLT5tX3BlcmFnLAorCQkJICBzaXplb2YoeGZzX3BlcmFnX3QpICogbXAtPm1fc2Iuc2JfYWdjb3VudCk7CisJfQorCisJQUlMX0xPQ0tfREVTVFJPWSgmbXAtPm1fYWlsX2xvY2spOworCXNwaW5sb2NrX2Rlc3Ryb3koJm1wLT5tX3NiX2xvY2spOworCW11dGV4X2Rlc3Ryb3koJm1wLT5tX2lsb2NrKTsKKwlmcmVlc2VtYSgmbXAtPm1fZ3Jvd2xvY2spOworCWlmIChtcC0+bV9xdW90YWluZm8pCisJCVhGU19RTV9ET05FKG1wKTsKKworCWlmIChtcC0+bV9mc25hbWUgIT0gTlVMTCkKKwkJa21lbV9mcmVlKG1wLT5tX2ZzbmFtZSwgbXAtPm1fZnNuYW1lX2xlbik7CisKKwlpZiAocmVtb3ZlX2JodikgeworCQlzdHJ1Y3QgdmZzCSp2ZnNwID0gWEZTX01UT1ZGUyhtcCk7CisKKwkJYmh2X3JlbW92ZV9hbGxfdmZzb3BzKHZmc3AsIDApOworCQlWRlNfUkVNT1ZFQkhWKHZmc3AsICZtcC0+bV9iaHYpOworCX0KKworCWttZW1fZnJlZShtcCwgc2l6ZW9mKHhmc19tb3VudF90KSk7Cit9CisKKworLyoKKyAqIENoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgU0IgZm91bmQuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19tb3VudF92YWxpZGF0ZV9zYigKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX3NiX3QJKnNicCkKK3sKKwkvKgorCSAqIElmIHRoZSBsb2cgZGV2aWNlIGFuZCBkYXRhIGRldmljZSBoYXZlIHRoZQorCSAqIHNhbWUgZGV2aWNlIG51bWJlciwgdGhlIGxvZyBpcyBpbnRlcm5hbC4KKwkgKiBDb25zZXF1ZW50bHksIHRoZSBzYl9sb2dzdGFydCBzaG91bGQgYmUgbm9uLXplcm8uICBJZgorCSAqIHdlIGhhdmUgYSB6ZXJvIHNiX2xvZ3N0YXJ0IGluIHRoaXMgY2FzZSwgd2UgbWF5IGJlIHRyeWluZyB0byBtb3VudAorCSAqIGEgdm9sdW1lIGZpbGVzeXN0ZW0gaW4gYSBub24tdm9sdW1lIG1hbm5lci4KKwkgKi8KKwlpZiAoc2JwLT5zYl9tYWdpY251bSAhPSBYRlNfU0JfTUFHSUMpIHsKKwkJY21uX2VycihDRV9XQVJOLCAiWEZTOiBiYWQgbWFnaWMgbnVtYmVyIik7CisJCXJldHVybiBYRlNfRVJST1IoRVdST05HRlMpOworCX0KKworCWlmICghWEZTX1NCX0dPT0RfVkVSU0lPTihzYnApKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwgIlhGUzogYmFkIHZlcnNpb24iKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFV1JPTkdGUyk7CisJfQorCisJaWYgKHVubGlrZWx5KAorCSAgICBzYnAtPnNiX2xvZ3N0YXJ0ID09IDAgJiYgbXAtPm1fbG9nZGV2X3RhcmdwID09IG1wLT5tX2RkZXZfdGFyZ3ApKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkiWEZTOiBmaWxlc3lzdGVtIGlzIG1hcmtlZCBhcyBoYXZpbmcgYW4gZXh0ZXJuYWwgbG9nOyAiCisJInNwZWNpZnkgbG9nZGV2IG9uIHRoZVxubW91bnQgY29tbWFuZCBsaW5lLiIpOworCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX21vdW50X3ZhbGlkYXRlX3NiKDEpIiwKKwkJCQkgICAgIFhGU19FUlJMRVZFTF9ISUdILCBtcCwgc2JwKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKworCWlmICh1bmxpa2VseSgKKwkgICAgc2JwLT5zYl9sb2dzdGFydCAhPSAwICYmIG1wLT5tX2xvZ2Rldl90YXJncCAhPSBtcC0+bV9kZGV2X3RhcmdwKSkgeworCQljbW5fZXJyKENFX1dBUk4sCisJIlhGUzogZmlsZXN5c3RlbSBpcyBtYXJrZWQgYXMgaGF2aW5nIGFuIGludGVybmFsIGxvZzsgIgorCSJkb24ndCBzcGVjaWZ5IGxvZ2RldiBvblxudGhlIG1vdW50IGNvbW1hbmQgbGluZS4iKTsKKwkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19tb3VudF92YWxpZGF0ZV9zYigyKSIsCisJCQkJICAgICBYRlNfRVJSTEVWRUxfSElHSCwgbXAsIHNicCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisKKwkvKgorCSAqIE1vcmUgc2FuaXR5IGNoZWNraW5nLiBUaGVzZSB3ZXJlIHN0b2xlbiBkaXJlY3RseSBmcm9tCisJICogeGZzX3JlcGFpci4KKwkgKi8KKwlpZiAodW5saWtlbHkoCisJICAgIHNicC0+c2JfYWdjb3VudCA8PSAwCQkJCQl8fAorCSAgICBzYnAtPnNiX3NlY3RzaXplIDwgWEZTX01JTl9TRUNUT1JTSVpFCQkJfHwKKwkgICAgc2JwLT5zYl9zZWN0c2l6ZSA+IFhGU19NQVhfU0VDVE9SU0laRQkJCXx8CisJICAgIHNicC0+c2Jfc2VjdGxvZyA8IFhGU19NSU5fU0VDVE9SU0laRV9MT0cJCQl8fAorCSAgICBzYnAtPnNiX3NlY3Rsb2cgPiBYRlNfTUFYX1NFQ1RPUlNJWkVfTE9HCQkJfHwKKwkgICAgc2JwLT5zYl9ibG9ja3NpemUgPCBYRlNfTUlOX0JMT0NLU0laRQkJCXx8CisJICAgIHNicC0+c2JfYmxvY2tzaXplID4gWEZTX01BWF9CTE9DS1NJWkUJCQl8fAorCSAgICBzYnAtPnNiX2Jsb2NrbG9nIDwgWEZTX01JTl9CTE9DS1NJWkVfTE9HCQkJfHwKKwkgICAgc2JwLT5zYl9ibG9ja2xvZyA+IFhGU19NQVhfQkxPQ0tTSVpFX0xPRwkJCXx8CisJICAgIHNicC0+c2JfaW5vZGVzaXplIDwgWEZTX0RJTk9ERV9NSU5fU0laRQkJCXx8CisJICAgIHNicC0+c2JfaW5vZGVzaXplID4gWEZTX0RJTk9ERV9NQVhfU0laRQkJCXx8CisJICAgIChzYnAtPnNiX3JleHRzaXplICogc2JwLT5zYl9ibG9ja3NpemUgPiBYRlNfTUFYX1JURVhUU0laRSkJfHwKKwkgICAgKHNicC0+c2JfcmV4dHNpemUgKiBzYnAtPnNiX2Jsb2Nrc2l6ZSA8IFhGU19NSU5fUlRFWFRTSVpFKQl8fAorCSAgICBzYnAtPnNiX2ltYXhfcGN0ID4gMTAwKSkgeworCQljbW5fZXJyKENFX1dBUk4sICJYRlM6IFNCIHNhbml0eSBjaGVjayAxIGZhaWxlZCIpOworCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX21vdW50X3ZhbGlkYXRlX3NiKDMpIiwKKwkJCQkgICAgIFhGU19FUlJMRVZFTF9MT1csIG1wLCBzYnApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCisJLyoKKwkgKiBTYW5pdHkgY2hlY2sgQUcgY291bnQsIHNpemUgZmllbGRzIGFnYWluc3QgZGF0YSBzaXplIGZpZWxkCisJICovCisJaWYgKHVubGlrZWx5KAorCSAgICBzYnAtPnNiX2RibG9ja3MgPT0gMCB8fAorCSAgICBzYnAtPnNiX2RibG9ja3MgPgorCSAgICAgKHhmc19kcmZzYm5vX3Qpc2JwLT5zYl9hZ2NvdW50ICogc2JwLT5zYl9hZ2Jsb2NrcyB8fAorCSAgICBzYnAtPnNiX2RibG9ja3MgPCAoeGZzX2RyZnNibm9fdCkoc2JwLT5zYl9hZ2NvdW50IC0gMSkgKgorCQkJICAgICAgc2JwLT5zYl9hZ2Jsb2NrcyArIFhGU19NSU5fQUdfQkxPQ0tTKSkgeworCQljbW5fZXJyKENFX1dBUk4sICJYRlM6IFNCIHNhbml0eSBjaGVjayAyIGZhaWxlZCIpOworCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfbW91bnRfdmFsaWRhdGVfc2IoNCkiLAorCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisKKwlBU1NFUlQoUEFHRV9TSElGVCA+PSBzYnAtPnNiX2Jsb2NrbG9nKTsKKwlBU1NFUlQoc2JwLT5zYl9ibG9ja2xvZyA+PSBCQlNISUZUKTsKKworI2lmIFhGU19CSUdfQkxLTk9TICAgICAvKiBMaW1pdGVkIGJ5IFVMT05HX01BWCBvZiBwYWdlIGNhY2hlIGluZGV4ICovCisJaWYgKHVubGlrZWx5KAorCSAgICAoc2JwLT5zYl9kYmxvY2tzID4+IChQQUdFX1NISUZUIC0gc2JwLT5zYl9ibG9ja2xvZykpID4gVUxPTkdfTUFYIHx8CisJICAgIChzYnAtPnNiX3JibG9ja3MgPj4gKFBBR0VfU0hJRlQgLSBzYnAtPnNiX2Jsb2NrbG9nKSkgPiBVTE9OR19NQVgpKSB7CisjZWxzZSAgICAgICAgICAgICAgICAgIC8qIExpbWl0ZWQgYnkgVUlOVF9NQVggb2Ygc2VjdG9ycyAqLworCWlmICh1bmxpa2VseSgKKwkgICAgKHNicC0+c2JfZGJsb2NrcyA8PCAoc2JwLT5zYl9ibG9ja2xvZyAtIEJCU0hJRlQpKSA+IFVJTlRfTUFYIHx8CisJICAgIChzYnAtPnNiX3JibG9ja3MgPDwgKHNicC0+c2JfYmxvY2tsb2cgLSBCQlNISUZUKSkgPiBVSU5UX01BWCkpIHsKKyNlbmRpZgorCQljbW5fZXJyKENFX1dBUk4sCisJIlhGUzogRmlsZSBzeXN0ZW0gaXMgdG9vIGxhcmdlIHRvIGJlIG1vdW50ZWQgb24gdGhpcyBzeXN0ZW0uIik7CisJCXJldHVybiBYRlNfRVJST1IoRTJCSUcpOworCX0KKworCWlmICh1bmxpa2VseShzYnAtPnNiX2lucHJvZ3Jlc3MpKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwgIlhGUzogZmlsZSBzeXN0ZW0gYnVzeSIpOworCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfbW91bnRfdmFsaWRhdGVfc2IoNSkiLAorCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisKKwkvKgorCSAqIFVudGlsIHRoaXMgaXMgZml4ZWQgb25seSBwYWdlLXNpemVkIG9yIHNtYWxsZXIgZGF0YSBibG9ja3Mgd29yay4KKwkgKi8KKwlpZiAodW5saWtlbHkoc2JwLT5zYl9ibG9ja3NpemUgPiBQQUdFX1NJWkUpKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJIlhGUzogQXR0ZW1wdGVkIHRvIG1vdW50IGZpbGUgc3lzdGVtIHdpdGggYmxvY2tzaXplICVkIGJ5dGVzIiwKKwkJCXNicC0+c2JfYmxvY2tzaXplKTsKKwkJY21uX2VycihDRV9XQVJOLAorCQkiWEZTOiBPbmx5IHBhZ2Utc2l6ZWQgKCVkKSBvciBsZXNzIGJsb2Nrc2l6ZXMgY3VycmVudGx5IHdvcmsuIiwKKwkJCVBBR0VfU0laRSk7CisJCXJldHVybiBYRlNfRVJST1IoRU5PU1lTKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworeGZzX2FnbnVtYmVyX3QKK3hmc19pbml0aWFsaXplX3BlcmFnKHhmc19tb3VudF90ICptcCwgeGZzX2FnbnVtYmVyX3QgYWdjb3VudCkKK3sKKwl4ZnNfYWdudW1iZXJfdAlpbmRleCwgbWF4X21ldGFkYXRhOworCXhmc19wZXJhZ190CSpwYWc7CisJeGZzX2FnaW5vX3QJYWdpbm87CisJeGZzX2lub190CWlubzsKKwl4ZnNfc2JfdAkqc2JwID0gJm1wLT5tX3NiOworCXhmc19pbm9fdAltYXhfaW51bSA9IFhGU19NQVhJTlVNQkVSXzMyOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBmaWxlc3lzdGVtIGNhbiBvdmVyZmxvdyAzMiBiaXQgaW5vZGVzICovCisJYWdpbm8gPSBYRlNfT0ZGQk5PX1RPX0FHSU5PKG1wLCBzYnAtPnNiX2FnYmxvY2tzIC0gMSwgMCk7CisJaW5vID0gWEZTX0FHSU5PX1RPX0lOTyhtcCwgYWdjb3VudCAtIDEsIGFnaW5vKTsKKworCS8qIENsZWFyIHRoZSBtb3VudCBmbGFnIGlmIG5vIGlub2RlIGNhbiBvdmVyZmxvdyAzMiBiaXRzCisJICogb24gdGhpcyBmaWxlc3lzdGVtLCBvciBpZiBzcGVjaWZpY2FsbHkgcmVxdWVzdGVkLi4KKwkgKi8KKwlpZiAoKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UXzMyQklUSU5PT1BUKSAmJiBpbm8gPiBtYXhfaW51bSkgeworCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfMzJCSVRJTk9ERVM7CisJfSBlbHNlIHsKKwkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF8zMkJJVElOT0RFUzsKKwl9CisKKwkvKiBJZiB3ZSBjYW4gb3ZlcmZsb3cgdGhlbiBzZXR1cCB0aGUgYWcgaGVhZGVycyBhY2NvcmRpbmdseSAqLworCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF8zMkJJVElOT0RFUykgeworCQkvKiBDYWxjdWxhdGUgaG93IG11Y2ggc2hvdWxkIGJlIHJlc2VydmVkIGZvciBpbm9kZXMgdG8KKwkJICogbWVldCB0aGUgbWF4IGlub2RlIHBlcmNlbnRhZ2UuCisJCSAqLworCQlpZiAobXAtPm1fbWF4aWNvdW50KSB7CisJCQlfX3VpbnQ2NF90CWljb3VudDsKKworCQkJaWNvdW50ID0gc2JwLT5zYl9kYmxvY2tzICogc2JwLT5zYl9pbWF4X3BjdDsKKwkJCWRvX2RpdihpY291bnQsIDEwMCk7CisJCQlpY291bnQgKz0gc2JwLT5zYl9hZ2Jsb2NrcyAtIDE7CisJCQlkb19kaXYoaWNvdW50LCBtcC0+bV9pYWxsb2NfYmxrcyk7CisJCQltYXhfbWV0YWRhdGEgPSBpY291bnQ7CisJCX0gZWxzZSB7CisJCQltYXhfbWV0YWRhdGEgPSBhZ2NvdW50OworCQl9CisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGFnY291bnQ7IGluZGV4KyspIHsKKwkJCWlubyA9IFhGU19BR0lOT19UT19JTk8obXAsIGluZGV4LCBhZ2lubyk7CisJCQlpZiAoaW5vID4gbWF4X2ludW0pIHsKKwkJCQlpbmRleCsrOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBUaGlzIGFnIGlzIHByZWZlcmVkIGZvciBpbm9kZXMgKi8KKwkJCXBhZyA9ICZtcC0+bV9wZXJhZ1tpbmRleF07CisJCQlwYWctPnBhZ2lfaW5vZGVvayA9IDE7CisJCQlpZiAoaW5kZXggPCBtYXhfbWV0YWRhdGEpCisJCQkJcGFnLT5wYWdmX21ldGFkYXRhID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFNldHVwIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHNtYWxsZXIgZmlsZXN5c3RlbXMgKi8KKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgYWdjb3VudDsgaW5kZXgrKykgeworCQkJcGFnID0gJm1wLT5tX3BlcmFnW2luZGV4XTsKKwkJCXBhZy0+cGFnaV9pbm9kZW9rID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gaW5kZXg7Cit9CisKKy8qCisgKiB4ZnNfeGxhdGVzYgorICoKKyAqICAgICBkYXRhICAgICAgIC0gb24gZGlzayB2ZXJzaW9uIG9mIHNiCisgKiAgICAgc2IgICAgICAgICAtIGEgc3VwZXJibG9jaworICogICAgIGRpciAgICAgICAgLSBjb252ZXJzaW9uIGRpcmVjdGlvbjogPDAgLSBjb252ZXJ0IHNiIHRvIGJ1ZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjAgLSBjb252ZXJ0IGJ1ZiB0byBzYgorICogICAgIGZpZWxkcyAgICAgLSB3aGljaCBmaWVsZHMgdG8gY29weSAoYml0bWFzaykKKyAqLwordm9pZAoreGZzX3hsYXRlc2IoCisJdm9pZAkJKmRhdGEsCisJeGZzX3NiX3QJKnNiLAorCWludAkJZGlyLAorCV9faW50NjRfdAlmaWVsZHMpCit7CisJeGZzX2NhZGRyX3QJYnVmX3B0cjsKKwl4ZnNfY2FkZHJfdAltZW1fcHRyOworCXhmc19zYl9maWVsZF90CWY7CisJaW50CQlmaXJzdDsKKwlpbnQJCXNpemU7CisKKwlBU1NFUlQoZGlyKTsKKwlBU1NFUlQoZmllbGRzKTsKKworCWlmICghZmllbGRzKQorCQlyZXR1cm47CisKKwlidWZfcHRyID0gKHhmc19jYWRkcl90KWRhdGE7CisJbWVtX3B0ciA9ICh4ZnNfY2FkZHJfdClzYjsKKworCXdoaWxlIChmaWVsZHMpIHsKKwkJZiA9ICh4ZnNfc2JfZmllbGRfdCl4ZnNfbG93Yml0NjQoKF9fdWludDY0X3QpZmllbGRzKTsKKwkJZmlyc3QgPSB4ZnNfc2JfaW5mb1tmXS5vZmZzZXQ7CisJCXNpemUgPSB4ZnNfc2JfaW5mb1tmICsgMV0ub2Zmc2V0IC0gZmlyc3Q7CisKKwkJQVNTRVJUKHhmc19zYl9pbmZvW2ZdLnR5cGUgPT0gMCB8fCB4ZnNfc2JfaW5mb1tmXS50eXBlID09IDEpOworCisJCWlmIChzaXplID09IDEgfHwgeGZzX3NiX2luZm9bZl0udHlwZSA9PSAxKSB7CisJCQlpZiAoZGlyID4gMCkgeworCQkJCW1lbWNweShtZW1fcHRyICsgZmlyc3QsIGJ1Zl9wdHIgKyBmaXJzdCwgc2l6ZSk7CisJCQl9IGVsc2UgeworCQkJCW1lbWNweShidWZfcHRyICsgZmlyc3QsIG1lbV9wdHIgKyBmaXJzdCwgc2l6ZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKHNpemUpIHsKKwkJCWNhc2UgMjoKKwkJCQlJTlRfWExBVEUoKihfX3VpbnQxNl90KikoYnVmX3B0citmaXJzdCksCisJCQkJCSAgKihfX3VpbnQxNl90KikobWVtX3B0citmaXJzdCksCisJCQkJCSAgZGlyLCBBUkNIX0NPTlZFUlQpOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCUlOVF9YTEFURSgqKF9fdWludDMyX3QqKShidWZfcHRyK2ZpcnN0KSwKKwkJCQkJICAqKF9fdWludDMyX3QqKShtZW1fcHRyK2ZpcnN0KSwKKwkJCQkJICBkaXIsIEFSQ0hfQ09OVkVSVCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDg6CisJCQkJSU5UX1hMQVRFKCooX191aW50NjRfdCopKGJ1Zl9wdHIrZmlyc3QpLAorCQkJCQkgICooX191aW50NjRfdCopKG1lbV9wdHIrZmlyc3QpLCBkaXIsIEFSQ0hfQ09OVkVSVCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUFTU0VSVCgwKTsKKwkJCX0KKwkJfQorCisJCWZpZWxkcyAmPSB+KDFMTCA8PCBmKTsKKwl9Cit9CisKKy8qCisgKiB4ZnNfcmVhZHNiCisgKgorICogRG9lcyB0aGUgaW5pdGlhbCByZWFkIG9mIHRoZSBzdXBlcmJsb2NrLgorICovCitpbnQKK3hmc19yZWFkc2IoeGZzX21vdW50X3QgKm1wKQoreworCXVuc2lnbmVkIGludAlzZWN0b3Jfc2l6ZTsKKwl1bnNpZ25lZCBpbnQJZXh0cmFfZmxhZ3M7CisJeGZzX2J1Zl90CSpicDsKKwl4ZnNfc2JfdAkqc2JwOworCWludAkJZXJyb3I7CisKKwlBU1NFUlQobXAtPm1fc2JfYnAgPT0gTlVMTCk7CisJQVNTRVJUKG1wLT5tX2RkZXZfdGFyZ3AgIT0gTlVMTCk7CisKKwkvKgorCSAqIEFsbG9jYXRlIGEgKGxvY2tlZCkgYnVmZmVyIHRvIGhvbGQgdGhlIHN1cGVyYmxvY2suCisJICogVGhpcyB3aWxsIGJlIGtlcHQgYXJvdW5kIGF0IGFsbCB0aW1lcyB0byBvcHRpbWl6ZQorCSAqIGFjY2VzcyB0byB0aGUgc3VwZXJibG9jay4KKwkgKi8KKwlzZWN0b3Jfc2l6ZSA9IHhmc19nZXRzaXplX2J1ZnRhcmcobXAtPm1fZGRldl90YXJncCk7CisJZXh0cmFfZmxhZ3MgPSBYRlNfQlVGX0xPQ0sgfCBYRlNfQlVGX01BTkFHRSB8IFhGU19CVUZfTUFQUEVEOworCisJYnAgPSB4ZnNfYnVmX3JlYWRfZmxhZ3MobXAtPm1fZGRldl90YXJncCwgWEZTX1NCX0RBRERSLAorCQkJCUJUT0JCKHNlY3Rvcl9zaXplKSwgZXh0cmFfZmxhZ3MpOworCWlmICghYnAgfHwgWEZTX0JVRl9JU0VSUk9SKGJwKSkgeworCQljbW5fZXJyKENFX1dBUk4sICJYRlM6IFNCIHJlYWQgZmFpbGVkIik7CisJCWVycm9yID0gYnAgPyBYRlNfQlVGX0dFVEVSUk9SKGJwKSA6IEVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKwlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKKwlBU1NFUlQoWEZTX0JVRl9WQUxVU0VNQShicCkgPD0gMCk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIG1vdW50IHN0cnVjdHVyZSBmcm9tIHRoZSBzdXBlcmJsb2NrLgorCSAqIEJ1dCBmaXJzdCBkbyBzb21lIGJhc2ljIGNvbnNpc3RlbmN5IGNoZWNraW5nLgorCSAqLworCXNicCA9IFhGU19CVUZfVE9fU0JQKGJwKTsKKwl4ZnNfeGxhdGVzYihYRlNfQlVGX1BUUihicCksICYobXAtPm1fc2IpLCAxLCBYRlNfU0JfQUxMX0JJVFMpOworCisJZXJyb3IgPSB4ZnNfbW91bnRfdmFsaWRhdGVfc2IobXAsICYobXAtPm1fc2IpKTsKKwlpZiAoZXJyb3IpIHsKKwkJY21uX2VycihDRV9XQVJOLCAiWEZTOiBTQiB2YWxpZGF0ZSBmYWlsZWQiKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qCisJICogV2UgbXVzdCBiZSBhYmxlIHRvIGRvIHNlY3Rvci1zaXplZCBhbmQgc2VjdG9yLWFsaWduZWQgSU8uCisJICovCisJaWYgKHNlY3Rvcl9zaXplID4gbXAtPm1fc2Iuc2Jfc2VjdHNpemUpIHsKKwkJY21uX2VycihDRV9XQVJOLAorCQkJIlhGUzogZGV2aWNlIHN1cHBvcnRzIG9ubHkgJXUgYnl0ZSBzZWN0b3JzIChub3QgJXUpIiwKKwkJCXNlY3Rvcl9zaXplLCBtcC0+bV9zYi5zYl9zZWN0c2l6ZSk7CisJCWVycm9yID0gRU5PU1lTOworCQlnb3RvIGZhaWw7CisJfQorCisJLyoKKwkgKiBJZiBkZXZpY2Ugc2VjdG9yIHNpemUgaXMgc21hbGxlciB0aGFuIHRoZSBzdXBlcmJsb2NrIHNpemUsCisJICogcmUtcmVhZCB0aGUgc3VwZXJibG9jayBzbyB0aGUgYnVmZmVyIGlzIGNvcnJlY3RseSBzaXplZC4KKwkgKi8KKwlpZiAoc2VjdG9yX3NpemUgPCBtcC0+bV9zYi5zYl9zZWN0c2l6ZSkgeworCQlYRlNfQlVGX1VOTUFOQUdFKGJwKTsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCXNlY3Rvcl9zaXplID0gbXAtPm1fc2Iuc2Jfc2VjdHNpemU7CisJCWJwID0geGZzX2J1Zl9yZWFkX2ZsYWdzKG1wLT5tX2RkZXZfdGFyZ3AsIFhGU19TQl9EQUREUiwKKwkJCQkJQlRPQkIoc2VjdG9yX3NpemUpLCBleHRyYV9mbGFncyk7CisJCWlmICghYnAgfHwgWEZTX0JVRl9JU0VSUk9SKGJwKSkgeworCQkJY21uX2VycihDRV9XQVJOLCAiWEZTOiBTQiByZS1yZWFkIGZhaWxlZCIpOworCQkJZXJyb3IgPSBicCA/IFhGU19CVUZfR0VURVJST1IoYnApIDogRU5PTUVNOworCQkJZ290byBmYWlsOworCQl9CisJCUFTU0VSVChYRlNfQlVGX0lTQlVTWShicCkpOworCQlBU1NFUlQoWEZTX0JVRl9WQUxVU0VNQShicCkgPD0gMCk7CisJfQorCisJbXAtPm1fc2JfYnAgPSBicDsKKwl4ZnNfYnVmX3JlbHNlKGJwKTsKKwlBU1NFUlQoWEZTX0JVRl9WQUxVU0VNQShicCkgPiAwKTsKKwlyZXR1cm4gMDsKKworIGZhaWw6CisJaWYgKGJwKSB7CisJCVhGU19CVUZfVU5NQU5BR0UoYnApOworCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCisKKy8qCisgKiB4ZnNfbW91bnRfY29tbW9uCisgKgorICogTW91bnQgaW5pdGlhbGl6YXRpb24gY29kZSBlc3RhYmxpc2hpbmcgdmFyaW91cyBtb3VudAorICogZmllbGRzIGZyb20gdGhlIHN1cGVyYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbgorICogbW91bnQgc3RydWN0dXJlCisgKi8KK3ZvaWQKK3hmc19tb3VudF9jb21tb24oeGZzX21vdW50X3QgKm1wLCB4ZnNfc2JfdCAqc2JwKQoreworCWludAlpOworCisJbXAtPm1fYWdmcm90b3IgPSBtcC0+bV9hZ2lyb3RvciA9IDA7CisJc3BpbmxvY2tfaW5pdCgmbXAtPm1fYWdpcm90b3JfbG9jaywgIm1fYWdpcm90b3JfbG9jayIpOworCW1wLT5tX21heGFnaSA9IG1wLT5tX3NiLnNiX2FnY291bnQ7CisJbXAtPm1fYmxrYml0X2xvZyA9IHNicC0+c2JfYmxvY2tsb2cgKyBYRlNfTkJCWUxPRzsKKwltcC0+bV9ibGtiYl9sb2cgPSBzYnAtPnNiX2Jsb2NrbG9nIC0gQkJTSElGVDsKKwltcC0+bV9zZWN0YmJfbG9nID0gc2JwLT5zYl9zZWN0bG9nIC0gQkJTSElGVDsKKwltcC0+bV9hZ25vX2xvZyA9IHhmc19oaWdoYml0MzIoc2JwLT5zYl9hZ2NvdW50IC0gMSkgKyAxOworCW1wLT5tX2FnaW5vX2xvZyA9IHNicC0+c2JfaW5vcGJsb2cgKyBzYnAtPnNiX2FnYmxrbG9nOworCW1wLT5tX2xpdGlubyA9IHNicC0+c2JfaW5vZGVzaXplIC0KKwkJKCh1aW50KXNpemVvZih4ZnNfZGlub2RlX2NvcmVfdCkgKyAodWludClzaXplb2YoeGZzX2FnaW5vX3QpKTsKKwltcC0+bV9ibG9ja21hc2sgPSBzYnAtPnNiX2Jsb2Nrc2l6ZSAtIDE7CisJbXAtPm1fYmxvY2t3c2l6ZSA9IHNicC0+c2JfYmxvY2tzaXplID4+IFhGU19XT1JETE9HOworCW1wLT5tX2Jsb2Nrd21hc2sgPSBtcC0+bV9ibG9ja3dzaXplIC0gMTsKKwlJTklUX0xJU1RfSEVBRCgmbXAtPm1fZGVsX2lub2Rlcyk7CisKKwkvKgorCSAqIFNldHVwIGZvciBhdHRyaWJ1dGVzLCBpbiBjYXNlIHRoZXkgZ2V0IGNyZWF0ZWQuCisJICogVGhpcyB2YWx1ZSBpcyBmb3IgaW5vZGVzIGdldHRpbmcgYXR0cmlidXRlcyBmb3IgdGhlIGZpcnN0IHRpbWUsCisJICogdGhlIHBlci1pbm9kZSB2YWx1ZSBpcyBmb3Igb2xkIGF0dHJpYnV0ZSB2YWx1ZXMuCisJICovCisJQVNTRVJUKHNicC0+c2JfaW5vZGVzaXplID49IDI1NiAmJiBzYnAtPnNiX2lub2Rlc2l6ZSA8PSAyMDQ4KTsKKwlzd2l0Y2ggKHNicC0+c2JfaW5vZGVzaXplKSB7CisJY2FzZSAyNTY6CisJCW1wLT5tX2F0dHJvZmZzZXQgPSBYRlNfTElUSU5PKG1wKSAtIFhGU19CTURSX1NQQUNFX0NBTEMoMik7CisJCWJyZWFrOworCWNhc2UgNTEyOgorCWNhc2UgMTAyNDoKKwljYXNlIDIwNDg6CisJCW1wLT5tX2F0dHJvZmZzZXQgPSBYRlNfQk1EUl9TUEFDRV9DQUxDKDEyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCX0KKwlBU1NFUlQobXAtPm1fYXR0cm9mZnNldCA8IFhGU19MSVRJTk8obXApKTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJbXAtPm1fYWxsb2NfbXhyW2ldID0gWEZTX0JUUkVFX0JMT0NLX01BWFJFQ1Moc2JwLT5zYl9ibG9ja3NpemUsCisJCQl4ZnNfYWxsb2MsIGkgPT0gMCk7CisJCW1wLT5tX2FsbG9jX21ucltpXSA9IFhGU19CVFJFRV9CTE9DS19NSU5SRUNTKHNicC0+c2JfYmxvY2tzaXplLAorCQkJeGZzX2FsbG9jLCBpID09IDApOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCW1wLT5tX2JtYXBfZG14cltpXSA9IFhGU19CVFJFRV9CTE9DS19NQVhSRUNTKHNicC0+c2JfYmxvY2tzaXplLAorCQkJeGZzX2JtYnQsIGkgPT0gMCk7CisJCW1wLT5tX2JtYXBfZG1ucltpXSA9IFhGU19CVFJFRV9CTE9DS19NSU5SRUNTKHNicC0+c2JfYmxvY2tzaXplLAorCQkJeGZzX2JtYnQsIGkgPT0gMCk7CisJfQorCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJbXAtPm1faW5vYnRfbXhyW2ldID0gWEZTX0JUUkVFX0JMT0NLX01BWFJFQ1Moc2JwLT5zYl9ibG9ja3NpemUsCisJCQl4ZnNfaW5vYnQsIGkgPT0gMCk7CisJCW1wLT5tX2lub2J0X21ucltpXSA9IFhGU19CVFJFRV9CTE9DS19NSU5SRUNTKHNicC0+c2JfYmxvY2tzaXplLAorCQkJeGZzX2lub2J0LCBpID09IDApOworCX0KKworCW1wLT5tX2JzaXplID0gWEZTX0ZTQl9UT19CQihtcCwgMSk7CisJbXAtPm1faWFsbG9jX2lub3MgPSAoaW50KU1BWCgoX191aW50MTZfdClYRlNfSU5PREVTX1BFUl9DSFVOSywKKwkJCQkJc2JwLT5zYl9pbm9wYmxvY2spOworCW1wLT5tX2lhbGxvY19ibGtzID0gbXAtPm1faWFsbG9jX2lub3MgPj4gc2JwLT5zYl9pbm9wYmxvZzsKK30KKy8qCisgKiB4ZnNfbW91bnRmcworICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgZm9sbG93aW5nIG9uIGFuIGluaXRpYWwgbW91bnQgb2YgYSBmaWxlIHN5c3RlbToKKyAqCS0gcmVhZHMgdGhlIHN1cGVyYmxvY2sgZnJvbSBkaXNrIGFuZCBpbml0IHRoZSBtb3VudCBzdHJ1Y3QKKyAqCS0gaWYgd2UncmUgYSAzMi1iaXQga2VybmVsLCBkbyBhIHNpemUgY2hlY2sgb24gdGhlIHN1cGVyYmxvY2sKKyAqCQlzbyB3ZSBkb24ndCBtb3VudCB0ZXJhYnl0ZSBmaWxlc3lzdGVtcworICoJLSBpbml0IG1vdW50IHN0cnVjdCByZWFsdGltZSBmaWVsZHMKKyAqCS0gYWxsb2NhdGUgaW5vZGUgaGFzaCB0YWJsZSBmb3IgZnMKKyAqCS0gaW5pdCBkaXJlY3RvcnkgbWFuYWdlcgorICoJLSBwZXJmb3JtIHJlY292ZXJ5IGFuZCBpbml0IHRoZSBsb2cgbWFuYWdlcgorICovCitpbnQKK3hmc19tb3VudGZzKAorCXZmc190CQkqdmZzcCwKKwl4ZnNfbW91bnRfdAkqbXAsCisJaW50CQltZnNpX2ZsYWdzKQoreworCXhmc19idWZfdAkqYnA7CisJeGZzX3NiX3QJKnNicCA9ICYobXAtPm1fc2IpOworCXhmc19pbm9kZV90CSpyaXA7CisJdm5vZGVfdAkJKnJ2cCA9IE5VTEw7CisJaW50CQlyZWFkaW9fbG9nLCB3cml0ZWlvX2xvZzsKKwl4ZnNfZGFkZHJfdAlkOworCV9fdWludDY0X3QJcmV0NjQ7CisJX19pbnQ2NF90CXVwZGF0ZV9mbGFnczsKKwl1aW50CQlxdW90YW1vdW50LCBxdW90YWZsYWdzOworCWludAkJYWdubzsKKwlpbnQJCXV1aWRfbW91bnRlZCA9IDA7CisJaW50CQllcnJvciA9IDA7CisKKwlpZiAobXAtPm1fc2JfYnAgPT0gTlVMTCkgeworCQlpZiAoKGVycm9yID0geGZzX3JlYWRzYihtcCkpKSB7CisJCQlyZXR1cm4gKGVycm9yKTsKKwkJfQorCX0KKwl4ZnNfbW91bnRfY29tbW9uKG1wLCBzYnApOworCisJLyoKKwkgKiBDaGVjayBpZiBzYl9hZ2Jsb2NrcyBpcyBhbGlnbmVkIGF0IHN0cmlwZSBib3VuZGFyeQorCSAqIElmIHNiX2FnYmxvY2tzIGlzIE5PVCBhbGlnbmVkIHR1cm4gb2ZmIG1fZGFsaWduIHNpbmNlCisJICogYWxsb2NhdG9yIGFsaWdubWVudCBpcyB3aXRoaW4gYW4gYWcsIHRoZXJlZm9yZSBhZyBoYXMKKwkgKiB0byBiZSBhbGlnbmVkIGF0IHN0cmlwZSBib3VuZGFyeS4KKwkgKi8KKwl1cGRhdGVfZmxhZ3MgPSAwTEw7CisJaWYgKG1wLT5tX2RhbGlnbiAmJiAhKG1mc2lfZmxhZ3MgJiBYRlNfTUZTSV9TRUNPTkQpKSB7CisJCS8qCisJCSAqIElmIHN0cmlwZSB1bml0IGFuZCBzdHJpcGUgd2lkdGggYXJlIG5vdCBtdWx0aXBsZXMKKwkJICogb2YgdGhlIGZzIGJsb2Nrc2l6ZSB0dXJuIG9mZiBhbGlnbm1lbnQuCisJCSAqLworCQlpZiAoKEJCVE9CKG1wLT5tX2RhbGlnbikgJiBtcC0+bV9ibG9ja21hc2spIHx8CisJCSAgICAoQkJUT0IobXAtPm1fc3dpZHRoKSAmIG1wLT5tX2Jsb2NrbWFzaykpIHsKKwkJCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9SRVRFUlIpIHsKKwkJCQljbW5fZXJyKENFX1dBUk4sCisJCQkJCSJYRlM6IGFsaWdubWVudCBjaGVjayAxIGZhaWxlZCIpOworCQkJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7CisJCQkJZ290byBlcnJvcjE7CisJCQl9CisJCQltcC0+bV9kYWxpZ24gPSBtcC0+bV9zd2lkdGggPSAwOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIENvbnZlcnQgdGhlIHN0cmlwZSB1bml0IGFuZCB3aWR0aCB0byBGU0JzLgorCQkJICovCisJCQltcC0+bV9kYWxpZ24gPSBYRlNfQkJfVE9fRlNCVChtcCwgbXAtPm1fZGFsaWduKTsKKwkJCWlmIChtcC0+bV9kYWxpZ24gJiYgKHNicC0+c2JfYWdibG9ja3MgJSBtcC0+bV9kYWxpZ24pKSB7CisJCQkJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1JFVEVSUikgeworCQkJCQllcnJvciA9IFhGU19FUlJPUihFSU5WQUwpOworCQkJCQlnb3RvIGVycm9yMTsKKwkJCQl9CisJCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgbXAsCisic3RyaXBlIGFsaWdubWVudCB0dXJuZWQgb2ZmOiBzdW5pdCglZCkvc3dpZHRoKCVkKSBpbmNvbXBhdGlibGUgd2l0aCBhZ3NpemUoJWQpIiwKKwkJCQkJbXAtPm1fZGFsaWduLCBtcC0+bV9zd2lkdGgsCisJCQkJCXNicC0+c2JfYWdibG9ja3MpOworCisJCQkJbXAtPm1fZGFsaWduID0gMDsKKwkJCQltcC0+bV9zd2lkdGggPSAwOworCQkJfSBlbHNlIGlmIChtcC0+bV9kYWxpZ24pIHsKKwkJCQltcC0+bV9zd2lkdGggPSBYRlNfQkJfVE9fRlNCVChtcCwgbXAtPm1fc3dpZHRoKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1JFVEVSUikgeworCQkJCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBtcCwKKyJzdHJpcGUgYWxpZ25tZW50IHR1cm5lZCBvZmY6IHN1bml0KCVkKSBsZXNzIHRoYW4gYnNpemUoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJbXAtPm1fZGFsaWduLAorCQkJCQkJbXAtPm1fYmxvY2ttYXNrICsxKTsKKwkJCQkJZXJyb3IgPSBYRlNfRVJST1IoRUlOVkFMKTsKKwkJCQkJZ290byBlcnJvcjE7CisJCQkJfQorCQkJCW1wLT5tX3N3aWR0aCA9IDA7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBVcGRhdGUgc3VwZXJibG9jayB3aXRoIG5ldyB2YWx1ZXMKKwkJICogYW5kIGxvZyBjaGFuZ2VzCisJCSAqLworCQlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTREFMSUdOKHNicCkpIHsKKwkJCWlmIChzYnAtPnNiX3VuaXQgIT0gbXAtPm1fZGFsaWduKSB7CisJCQkJc2JwLT5zYl91bml0ID0gbXAtPm1fZGFsaWduOworCQkJCXVwZGF0ZV9mbGFncyB8PSBYRlNfU0JfVU5JVDsKKwkJCX0KKwkJCWlmIChzYnAtPnNiX3dpZHRoICE9IG1wLT5tX3N3aWR0aCkgeworCQkJCXNicC0+c2Jfd2lkdGggPSBtcC0+bV9zd2lkdGg7CisJCQkJdXBkYXRlX2ZsYWdzIHw9IFhGU19TQl9XSURUSDsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX05PQUxJR04pICE9IFhGU19NT1VOVF9OT0FMSUdOICYmCisJCSAgICBYRlNfU0JfVkVSU0lPTl9IQVNEQUxJR04oJm1wLT5tX3NiKSkgeworCQkJbXAtPm1fZGFsaWduID0gc2JwLT5zYl91bml0OworCQkJbXAtPm1fc3dpZHRoID0gc2JwLT5zYl93aWR0aDsKKwl9CisKKwl4ZnNfYWxsb2NfY29tcHV0ZV9tYXhsZXZlbHMobXApOworCXhmc19ibWFwX2NvbXB1dGVfbWF4bGV2ZWxzKG1wLCBYRlNfREFUQV9GT1JLKTsKKwl4ZnNfYm1hcF9jb21wdXRlX21heGxldmVscyhtcCwgWEZTX0FUVFJfRk9SSyk7CisJeGZzX2lhbGxvY19jb21wdXRlX21heGxldmVscyhtcCk7CisKKwlpZiAoc2JwLT5zYl9pbWF4X3BjdCkgeworCQlfX3VpbnQ2NF90CWljb3VudDsKKworCQkvKiBNYWtlIHN1cmUgdGhlIG1heGltdW0gaW5vZGUgY291bnQgaXMgYSBtdWx0aXBsZSBvZiB0aGUKKwkJICogdW5pdHMgd2UgYWxsb2NhdGUgaW5vZGVzIGluLgorCQkgKi8KKworCQlpY291bnQgPSBzYnAtPnNiX2RibG9ja3MgKiBzYnAtPnNiX2ltYXhfcGN0OworCQlkb19kaXYoaWNvdW50LCAxMDApOworCQlkb19kaXYoaWNvdW50LCBtcC0+bV9pYWxsb2NfYmxrcyk7CisJCW1wLT5tX21heGljb3VudCA9IChpY291bnQgKiBtcC0+bV9pYWxsb2NfYmxrcykgIDw8CisJCQkJICAgc2JwLT5zYl9pbm9wYmxvZzsKKwl9IGVsc2UKKwkJbXAtPm1fbWF4aWNvdW50ID0gMDsKKworCW1wLT5tX21heGlvZmZzZXQgPSB4ZnNfbWF4X2ZpbGVfb2Zmc2V0KHNicC0+c2JfYmxvY2tsb2cpOworCisJLyoKKwkgKiBYRlMgdXNlcyB0aGUgdXVpZCBmcm9tIHRoZSBzdXBlcmJsb2NrIGFzIHRoZSB1bmlxdWUKKwkgKiBpZGVudGlmaWVyIGZvciBmc2lkLiAgV2UgY2FuIG5vdCB1c2UgdGhlIHV1aWQgZnJvbSB0aGUgdm9sdW1lCisJICogc2luY2UgYSBzaW5nbGUgcGFydGl0aW9uIGZpbGVzeXN0ZW0gaXMgaWRlbnRpY2FsIHRvIGEgc2luZ2xlCisJICogcGFydGl0aW9uIHZvbHVtZS9maWxlc3lzdGVtLgorCSAqLworCWlmICgobWZzaV9mbGFncyAmIFhGU19NRlNJX1NFQ09ORCkgPT0gMCAmJgorCSAgICAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfTk9VVUlEKSA9PSAwKSB7CisJCWlmICh4ZnNfdXVpZF9tb3VudChtcCkpIHsKKwkJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7CisJCQlnb3RvIGVycm9yMTsKKwkJfQorCQl1dWlkX21vdW50ZWQ9MTsKKwkJcmV0NjQgPSB1dWlkX2hhc2g2NCgmc2JwLT5zYl91dWlkKTsKKwkJbWVtY3B5KCZ2ZnNwLT52ZnNfZnNpZCwgJnJldDY0LCBzaXplb2YocmV0NjQpKTsKKwl9CisKKwkvKgorCSAqIFNldCB0aGUgZGVmYXVsdCBtaW5pbXVtIHJlYWQgYW5kIHdyaXRlIHNpemVzIHVubGVzcworCSAqIGFscmVhZHkgc3BlY2lmaWVkIGluIGEgbW91bnQgb3B0aW9uLgorCSAqIFdlIHVzZSBzbWFsbGVyIEkvTyBzaXplcyB3aGVuIHRoZSBmaWxlIHN5c3RlbQorCSAqIGlzIGJlaW5nIHVzZWQgZm9yIE5GUyBzZXJ2aWNlICh3c3luYyBtb3VudCBvcHRpb24pLgorCSAqLworCWlmICghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0RGTFRfSU9TSVpFKSkgeworCQlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfV1NZTkMpIHsKKwkJCXJlYWRpb19sb2cgPSBYRlNfV1NZTkNfUkVBRElPX0xPRzsKKwkJCXdyaXRlaW9fbG9nID0gWEZTX1dTWU5DX1dSSVRFSU9fTE9HOworCQl9IGVsc2UgeworCQkJcmVhZGlvX2xvZyA9IFhGU19SRUFESU9fTE9HX0xBUkdFOworCQkJd3JpdGVpb19sb2cgPSBYRlNfV1JJVEVJT19MT0dfTEFSR0U7CisJCX0KKwl9IGVsc2UgeworCQlyZWFkaW9fbG9nID0gbXAtPm1fcmVhZGlvX2xvZzsKKwkJd3JpdGVpb19sb2cgPSBtcC0+bV93cml0ZWlvX2xvZzsKKwl9CisKKwkvKgorCSAqIFNldCB0aGUgbnVtYmVyIG9mIHJlYWRhaGVhZCBidWZmZXJzIHRvIHVzZSBiYXNlZCBvbgorCSAqIHBoeXNpY2FsIG1lbW9yeSBzaXplLgorCSAqLworCWlmICh4ZnNfcGh5c21lbSA8PSA0MDk2KQkJLyogPD0gMTZNQiAqLworCQltcC0+bV9ucmVhZGFoZWFkcyA9IFhGU19SV19OUkVBREFIRUFEXzE2TUI7CisJZWxzZSBpZiAoeGZzX3BoeXNtZW0gPD0gODE5MikJLyogPD0gMzJNQiAqLworCQltcC0+bV9ucmVhZGFoZWFkcyA9IFhGU19SV19OUkVBREFIRUFEXzMyTUI7CisJZWxzZQorCQltcC0+bV9ucmVhZGFoZWFkcyA9IFhGU19SV19OUkVBREFIRUFEX0szMjsKKwlpZiAoc2JwLT5zYl9ibG9ja2xvZyA+IHJlYWRpb19sb2cpIHsKKwkJbXAtPm1fcmVhZGlvX2xvZyA9IHNicC0+c2JfYmxvY2tsb2c7CisJfSBlbHNlIHsKKwkJbXAtPm1fcmVhZGlvX2xvZyA9IHJlYWRpb19sb2c7CisJfQorCW1wLT5tX3JlYWRpb19ibG9ja3MgPSAxIDw8IChtcC0+bV9yZWFkaW9fbG9nIC0gc2JwLT5zYl9ibG9ja2xvZyk7CisJaWYgKHNicC0+c2JfYmxvY2tsb2cgPiB3cml0ZWlvX2xvZykgeworCQltcC0+bV93cml0ZWlvX2xvZyA9IHNicC0+c2JfYmxvY2tsb2c7CisJfSBlbHNlIHsKKwkJbXAtPm1fd3JpdGVpb19sb2cgPSB3cml0ZWlvX2xvZzsKKwl9CisJbXAtPm1fd3JpdGVpb19ibG9ja3MgPSAxIDw8IChtcC0+bV93cml0ZWlvX2xvZyAtIHNicC0+c2JfYmxvY2tsb2cpOworCisJLyoKKwkgKiBTZXQgdGhlIGlub2RlIGNsdXN0ZXIgc2l6ZSBiYXNlZCBvbiB0aGUgcGh5c2ljYWwgbWVtb3J5CisJICogc2l6ZS4gIFRoaXMgbWF5IHN0aWxsIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGZpbGUgc3lzdGVtCisJICogYmxvY2sgc2l6ZSBpZiBpdCBpcyBsYXJnZXIgdGhhbiB0aGUgY2hvc2VuIGNsdXN0ZXIgc2l6ZS4KKwkgKi8KKwlpZiAoeGZzX3BoeXNtZW0gPD0gYnRvYygzMiAqIDEwMjQgKiAxMDI0KSkgeyAvKiA8PSAzMiBNQiAqLworCQltcC0+bV9pbm9kZV9jbHVzdGVyX3NpemUgPSBYRlNfSU5PREVfU01BTExfQ0xVU1RFUl9TSVpFOworCX0gZWxzZSB7CisJCW1wLT5tX2lub2RlX2NsdXN0ZXJfc2l6ZSA9IFhGU19JTk9ERV9CSUdfQ0xVU1RFUl9TSVpFOworCX0KKwkvKgorCSAqIFNldCB3aGV0aGVyIHdlJ3JlIHVzaW5nIGlub2RlIGFsaWdubWVudC4KKwkgKi8KKwlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTQUxJR04oJm1wLT5tX3NiKSAmJgorCSAgICBtcC0+bV9zYi5zYl9pbm9hbGlnbm10ID49CisJICAgIFhGU19CX1RPX0ZTQlQobXAsIG1wLT5tX2lub2RlX2NsdXN0ZXJfc2l6ZSkpCisJCW1wLT5tX2lub2FsaWduX21hc2sgPSBtcC0+bV9zYi5zYl9pbm9hbGlnbm10IC0gMTsKKwllbHNlCisJCW1wLT5tX2lub2FsaWduX21hc2sgPSAwOworCS8qCisJICogSWYgd2UgYXJlIHVzaW5nIHN0cmlwZSBhbGlnbm1lbnQsIGNoZWNrIHdoZXRoZXIKKwkgKiB0aGUgc3RyaXBlIHVuaXQgaXMgYSBtdWx0aXBsZSBvZiB0aGUgaW5vZGUgYWxpZ25tZW50CisJICovCisJaWYgKG1wLT5tX2RhbGlnbiAmJiBtcC0+bV9pbm9hbGlnbl9tYXNrICYmCisJICAgICEobXAtPm1fZGFsaWduICYgbXAtPm1faW5vYWxpZ25fbWFzaykpCisJCW1wLT5tX3Npbm9hbGlnbiA9IG1wLT5tX2RhbGlnbjsKKwllbHNlCisJCW1wLT5tX3Npbm9hbGlnbiA9IDA7CisJLyoKKwkgKiBDaGVjayB0aGF0IHRoZSBkYXRhIChhbmQgbG9nIGlmIHNlcGFyYXRlKSBhcmUgYW4gb2sgc2l6ZS4KKwkgKi8KKwlkID0gKHhmc19kYWRkcl90KVhGU19GU0JfVE9fQkIobXAsIG1wLT5tX3NiLnNiX2RibG9ja3MpOworCWlmIChYRlNfQkJfVE9fRlNCKG1wLCBkKSAhPSBtcC0+bV9zYi5zYl9kYmxvY2tzKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwgIlhGUzogc2l6ZSBjaGVjayAxIGZhaWxlZCIpOworCQllcnJvciA9IFhGU19FUlJPUihFMkJJRyk7CisJCWdvdG8gZXJyb3IxOworCX0KKwllcnJvciA9IHhmc19yZWFkX2J1ZihtcCwgbXAtPm1fZGRldl90YXJncCwKKwkJCSAgICAgZCAtIFhGU19GU1NfVE9fQkIobXAsIDEpLAorCQkJICAgICBYRlNfRlNTX1RPX0JCKG1wLCAxKSwgMCwgJmJwKTsKKwlpZiAoIWVycm9yKSB7CisJCXhmc19idWZfcmVsc2UoYnApOworCX0gZWxzZSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwgIlhGUzogc2l6ZSBjaGVjayAyIGZhaWxlZCIpOworCQlpZiAoZXJyb3IgPT0gRU5PU1BDKSB7CisJCQllcnJvciA9IFhGU19FUlJPUihFMkJJRyk7CisJCX0KKwkJZ290byBlcnJvcjE7CisJfQorCisJaWYgKCgobWZzaV9mbGFncyAmIFhGU19NRlNJX0NMSUVOVCkgPT0gMCkgJiYKKwkgICAgbXAtPm1fbG9nZGV2X3RhcmdwICE9IG1wLT5tX2RkZXZfdGFyZ3ApIHsKKwkJZCA9ICh4ZnNfZGFkZHJfdClYRlNfRlNCX1RPX0JCKG1wLCBtcC0+bV9zYi5zYl9sb2dibG9ja3MpOworCQlpZiAoWEZTX0JCX1RPX0ZTQihtcCwgZCkgIT0gbXAtPm1fc2Iuc2JfbG9nYmxvY2tzKSB7CisJCQljbW5fZXJyKENFX1dBUk4sICJYRlM6IHNpemUgY2hlY2sgMyBmYWlsZWQiKTsKKwkJCWVycm9yID0gWEZTX0VSUk9SKEUyQklHKTsKKwkJCWdvdG8gZXJyb3IxOworCQl9CisJCWVycm9yID0geGZzX3JlYWRfYnVmKG1wLCBtcC0+bV9sb2dkZXZfdGFyZ3AsCisJCQkJICAgICBkIC0gWEZTX0ZTQl9UT19CQihtcCwgMSksCisJCQkJICAgICBYRlNfRlNCX1RPX0JCKG1wLCAxKSwgMCwgJmJwKTsKKwkJaWYgKCFlcnJvcikgeworCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCX0gZWxzZSB7CisJCQljbW5fZXJyKENFX1dBUk4sICJYRlM6IHNpemUgY2hlY2sgMyBmYWlsZWQiKTsKKwkJCWlmIChlcnJvciA9PSBFTk9TUEMpIHsKKwkJCQllcnJvciA9IFhGU19FUlJPUihFMkJJRyk7CisJCQl9CisJCQlnb3RvIGVycm9yMTsKKwkJfQorCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSByZWFsdGltZSBmaWVsZHMgaW4gdGhlIG1vdW50IHN0cnVjdHVyZQorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfcnRtb3VudF9pbml0KG1wKSkpIHsKKwkJY21uX2VycihDRV9XQVJOLCAiWEZTOiBSVCBtb3VudCBmYWlsZWQiKTsKKwkJZ290byBlcnJvcjE7CisJfQorCisJLyoKKwkgKiBGb3IgY2xpZW50IGNhc2Ugd2UgYXJlIGRvbmUgbm93CisJICovCisJaWYgKG1mc2lfZmxhZ3MgJiBYRlNfTUZTSV9DTElFTlQpIHsKKwkJcmV0dXJuKDApOworCX0KKworCS8qCisJICogIENvcGllcyB0aGUgbG93IG9yZGVyIGJpdHMgb2YgdGhlIHRpbWVzdGFtcCBhbmQgdGhlIHJhbmRvbWx5CisJICogIHNldCAic2VxdWVuY2UiIG51bWJlciBvdXQgb2YgYSBVVUlELgorCSAqLworCXV1aWRfZ2V0bm9kZXVuaXEoJnNicC0+c2JfdXVpZCwgbXAtPm1fZml4ZWRmc2lkKTsKKworCS8qCisJICogIFRoZSB2ZnMgc3RydWN0dXJlIG5lZWRzIHRvIGhhdmUgYSBmaWxlIHN5c3RlbSBpbmRlcGVuZGVudAorCSAqICB3YXkgb2YgY2hlY2tpbmcgZm9yIHRoZSBpbnZhcmlhbnQgZmlsZSBzeXN0ZW0gSUQuICBTaW5jZSBpdAorCSAqICBjYW4ndCBsb29rIGF0IG1vdW50IHN0cnVjdHVyZXMgaXQgaGFzIGEgcG9pbnRlciB0byB0aGUgZGF0YQorCSAqICBpbiB0aGUgbW91bnQgc3RydWN0dXJlLgorCSAqCisJICogIEZpbGUgc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgdXNlciBsZXZlbCBmaWxlIGhhbmRsZXMgKGkuZS4KKwkgKiAgYWxsIG9mIHRoZW0gZXhjZXB0IGZvciBYRlMpIHdpbGwgbGVhdmUgdmZzX2FsdGZzaWQgYXMgTlVMTC4KKwkgKi8KKwl2ZnNwLT52ZnNfYWx0ZnNpZCA9ICh4ZnNfZnNpZF90ICopbXAtPm1fZml4ZWRmc2lkOworCW1wLT5tX2RtZXZtYXNrID0gMDsJLyogbm90IHBlcnNpc3RlbnQ7IHNldCBhZnRlciBlYWNoIG1vdW50ICovCisKKwkvKgorCSAqIFNlbGVjdCB0aGUgcmlnaHQgZGlyZWN0b3J5IG1hbmFnZXIuCisJICovCisJbXAtPm1fZGlyb3BzID0KKwkJWEZTX1NCX1ZFUlNJT05fSEFTRElSVjIoJm1wLT5tX3NiKSA/CisJCQl4ZnN2Ml9kaXJvcHMgOgorCQkJeGZzdjFfZGlyb3BzOworCisJLyoKKwkgKiBJbml0aWFsaXplIGRpcmVjdG9yeSBtYW5hZ2VyJ3MgZW50cmllcy4KKwkgKi8KKwlYRlNfRElSX01PVU5UKG1wKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgYXR0cmlidXRlIG1hbmFnZXIncyBlbnRyaWVzLgorCSAqLworCW1wLT5tX2F0dHJfbWFnaWNwY3QgPSAobXAtPm1fc2Iuc2JfYmxvY2tzaXplICogMzcpIC8gMTAwOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBwcmVjb21wdXRlZCB0cmFuc2FjdGlvbiByZXNlcnZhdGlvbnMgdmFsdWVzLgorCSAqLworCXhmc190cmFuc19pbml0KG1wKTsKKworCS8qCisJICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGlub2RlIGhhc2ggdGFibGUgZm9yIHRoaXMKKwkgKiBmaWxlIHN5c3RlbS4KKwkgKi8KKwl4ZnNfaWhhc2hfaW5pdChtcCk7CisJeGZzX2NoYXNoX2luaXQobXApOworCisJLyoKKwkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgcGVyLWFnIGRhdGEuCisJICovCisJaW5pdF9yd3NlbSgmbXAtPm1fcGVyYWdsb2NrKTsKKwltcC0+bV9wZXJhZyA9CisJCWttZW1femFsbG9jKHNicC0+c2JfYWdjb3VudCAqIHNpemVvZih4ZnNfcGVyYWdfdCksIEtNX1NMRUVQKTsKKworCW1wLT5tX21heGFnaSA9IHhmc19pbml0aWFsaXplX3BlcmFnKG1wLCBzYnAtPnNiX2FnY291bnQpOworCisJLyoKKwkgKiBsb2cncyBtb3VudC10aW1lIGluaXRpYWxpemF0aW9uLiBQZXJmb3JtIDFzdCBwYXJ0IHJlY292ZXJ5IGlmIG5lZWRlZAorCSAqLworCWlmIChsaWtlbHkoc2JwLT5zYl9sb2dibG9ja3MgPiAwKSkgewkvKiBjaGVjayBmb3Igdm9sdW1lIGNhc2UgKi8KKwkJZXJyb3IgPSB4ZnNfbG9nX21vdW50KG1wLCBtcC0+bV9sb2dkZXZfdGFyZ3AsCisJCQkJICAgICAgWEZTX0ZTQl9UT19EQUREUihtcCwgc2JwLT5zYl9sb2dzdGFydCksCisJCQkJICAgICAgWEZTX0ZTQl9UT19CQihtcCwgc2JwLT5zYl9sb2dibG9ja3MpKTsKKwkJaWYgKGVycm9yKSB7CisJCQljbW5fZXJyKENFX1dBUk4sICJYRlM6IGxvZyBtb3VudCBmYWlsZWQiKTsKKwkJCWdvdG8gZXJyb3IyOworCQl9CisJfSBlbHNlIHsJLyogTm8gbG9nIGhhcyBiZWVuIGRlZmluZWQgKi8KKwkJY21uX2VycihDRV9XQVJOLCAiWEZTOiBubyBsb2cgZGVmaW5lZCIpOworCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfbW91bnRmc19pbnQoMSkiLCBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCWVycm9yID0gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCWdvdG8gZXJyb3IyOworCX0KKworCS8qCisJICogR2V0IGFuZCBzYW5pdHktY2hlY2sgdGhlIHJvb3QgaW5vZGUuCisJICogU2F2ZSB0aGUgcG9pbnRlciB0byBpdCBpbiB0aGUgbW91bnQgc3RydWN0dXJlLgorCSAqLworCWVycm9yID0geGZzX2lnZXQobXAsIE5VTEwsIHNicC0+c2Jfcm9vdGlubywgMCwgWEZTX0lMT0NLX0VYQ0wsICZyaXAsIDApOworCWlmIChlcnJvcikgeworCQljbW5fZXJyKENFX1dBUk4sICJYRlM6IGZhaWxlZCB0byByZWFkIHJvb3QgaW5vZGUiKTsKKwkJZ290byBlcnJvcjM7CisJfQorCisJQVNTRVJUKHJpcCAhPSBOVUxMKTsKKwlydnAgPSBYRlNfSVRPVihyaXApOworCisJaWYgKHVubGlrZWx5KChyaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSAhPSBTX0lGRElSKSkgeworCQljbW5fZXJyKENFX1dBUk4sICJYRlM6IGNvcnJ1cHRlZCByb290IGlub2RlIik7CisJCXByZGV2KCJSb290IGlub2RlICVsbHUgaXMgbm90IGEgZGlyZWN0b3J5IiwKKwkJICAgICAgbXAtPm1fZGRldl90YXJncCwgKHVuc2lnbmVkIGxvbmcgbG9uZylyaXAtPmlfaW5vKTsKKwkJeGZzX2l1bmxvY2socmlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCVhGU19FUlJPUl9SRVBPUlQoInhmc19tb3VudGZzX2ludCgyKSIsIFhGU19FUlJMRVZFTF9MT1csCisJCQkJIG1wKTsKKwkJZXJyb3IgPSBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJZ290byBlcnJvcjQ7CisJfQorCW1wLT5tX3Jvb3RpcCA9IHJpcDsJLyogc2F2ZSBpdCAqLworCisJeGZzX2l1bmxvY2socmlwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgcmVhbHRpbWUgaW5vZGUgcG9pbnRlcnMgaW4gdGhlIG1vdW50IHN0cnVjdHVyZQorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfcnRtb3VudF9pbm9kZXMobXApKSkgeworCQkvKgorCQkgKiBGcmVlIHVwIHRoZSByb290IGlub2RlLgorCQkgKi8KKwkJY21uX2VycihDRV9XQVJOLCAiWEZTOiBmYWlsZWQgdG8gcmVhZCBSVCBpbm9kZXMiKTsKKwkJZ290byBlcnJvcjQ7CisJfQorCisJLyoKKwkgKiBJZiBmcyBpcyBub3QgbW91bnRlZCByZWFkb25seSwgdGhlbiB1cGRhdGUgdGhlIHN1cGVyYmxvY2sKKwkgKiB1bml0IGFuZCB3aWR0aCBjaGFuZ2VzLgorCSAqLworCWlmICh1cGRhdGVfZmxhZ3MgJiYgISh2ZnNwLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpKQorCQl4ZnNfbW91bnRfbG9nX3NidW5pdChtcCwgdXBkYXRlX2ZsYWdzKTsKKworCS8qCisJICogSW5pdGlhbGlzZSB0aGUgWEZTIHF1b3RhIG1hbmFnZW1lbnQgc3Vic3lzdGVtIGZvciB0aGlzIG1vdW50CisJICovCisJaWYgKChlcnJvciA9IFhGU19RTV9JTklUKG1wLCAmcXVvdGFtb3VudCwgJnF1b3RhZmxhZ3MpKSkKKwkJZ290byBlcnJvcjQ7CisKKwkvKgorCSAqIEZpbmlzaCByZWNvdmVyaW5nIHRoZSBmaWxlIHN5c3RlbS4gIFRoaXMgcGFydCBuZWVkZWQgdG8gYmUKKwkgKiBkZWxheWVkIHVudGlsIGFmdGVyIHRoZSByb290IGFuZCByZWFsLXRpbWUgYml0bWFwIGlub2RlcworCSAqIHdlcmUgY29uc2lzdGVudGx5IHJlYWQgaW4uCisJICovCisJZXJyb3IgPSB4ZnNfbG9nX21vdW50X2ZpbmlzaChtcCwgbWZzaV9mbGFncyk7CisJaWYgKGVycm9yKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwgIlhGUzogbG9nIG1vdW50IGZpbmlzaCBmYWlsZWQiKTsKKwkJZ290byBlcnJvcjQ7CisJfQorCisJLyoKKwkgKiBDb21wbGV0ZSB0aGUgcXVvdGEgaW5pdGlhbGlzYXRpb24sIHBvc3QtbG9nLXJlcGxheSBjb21wb25lbnQuCisJICovCisJaWYgKChlcnJvciA9IFhGU19RTV9NT1VOVChtcCwgcXVvdGFtb3VudCwgcXVvdGFmbGFncywgbWZzaV9mbGFncykpKQorCQlnb3RvIGVycm9yNDsKKworCXJldHVybiAwOworCisgZXJyb3I0OgorCS8qCisJICogRnJlZSB1cCB0aGUgcm9vdCBpbm9kZS4KKwkgKi8KKwlWTl9SRUxFKHJ2cCk7CisgZXJyb3IzOgorCXhmc19sb2dfdW5tb3VudF9kZWFsbG9jKG1wKTsKKyBlcnJvcjI6CisJeGZzX2loYXNoX2ZyZWUobXApOworCXhmc19jaGFzaF9mcmVlKG1wKTsKKwlmb3IgKGFnbm8gPSAwOyBhZ25vIDwgc2JwLT5zYl9hZ2NvdW50OyBhZ25vKyspCisJCWlmIChtcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2xpc3QpCisJCQlrbWVtX2ZyZWUobXAtPm1fcGVyYWdbYWdub10ucGFnYl9saXN0LAorCQkJICBzaXplb2YoeGZzX3BlcmFnX2J1c3lfdCkgKiBYRlNfUEFHQl9OVU1fU0xPVFMpOworCWttZW1fZnJlZShtcC0+bV9wZXJhZywgc2JwLT5zYl9hZ2NvdW50ICogc2l6ZW9mKHhmc19wZXJhZ190KSk7CisJbXAtPm1fcGVyYWcgPSBOVUxMOworCS8qIEZBTExUSFJPVUdIICovCisgZXJyb3IxOgorCWlmICh1dWlkX21vdW50ZWQpCisJCXhmc191dWlkX3VubW91bnQobXApOworCXhmc19mcmVlc2IobXApOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIHhmc191bm1vdW50ZnMKKyAqCisgKiBUaGlzIGZsdXNoZXMgb3V0IHRoZSBpbm9kZXMsZHF1b3RzIGFuZCB0aGUgc3VwZXJibG9jaywgdW5tb3VudHMgdGhlCisgKiBsb2cgYW5kIG1ha2VzIHN1cmUgdGhhdCBpbmNvcmUgc3RydWN0dXJlcyBhcmUgZnJlZWQuCisgKi8KK2ludAoreGZzX3VubW91bnRmcyh4ZnNfbW91bnRfdCAqbXAsIHN0cnVjdCBjcmVkICpjcikKK3sKKwlzdHJ1Y3QgdmZzCSp2ZnNwID0gWEZTX01UT1ZGUyhtcCk7CisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChJTkRVQ0VfSU9fRVJST1IpCisJaW50NjRfdAkJZnNpZDsKKyNlbmRpZgorCisJeGZzX2lmbHVzaF9hbGwobXAsIFhGU19GTFVTSF9BTEwpOworCisJWEZTX1FNX0RRUFVSR0VBTEwobXAsCisJCVhGU19RTU9QVF9VUVVPVEEgfCBYRlNfUU1PUFRfR1FVT1RBIHwgWEZTX1FNT1BUX1VNT1VOVElORyk7CisKKwkvKgorCSAqIEZsdXNoIG91dCB0aGUgbG9nIHN5bmNocm9ub3VzbHkgc28gdGhhdCB3ZSBrbm93IGZvciBzdXJlCisJICogdGhhdCBub3RoaW5nIGlzIHBpbm5lZC4gIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgYmZsdXNoKCkKKwkgKiB3aWxsIHNraXAgcGlubmVkIGJ1ZmZlcnMuCisJICovCisJeGZzX2xvZ19mb3JjZShtcCwgKHhmc19sc25fdCkwLCBYRlNfTE9HX0ZPUkNFIHwgWEZTX0xPR19TWU5DKTsKKworCXhmc19iaW52YWwobXAtPm1fZGRldl90YXJncCk7CisJaWYgKG1wLT5tX3J0ZGV2X3RhcmdwKSB7CisJCXhmc19iaW52YWwobXAtPm1fcnRkZXZfdGFyZ3ApOworCX0KKworCXhmc191bm1vdW50ZnNfd3JpdGVzYihtcCk7CisKKwl4ZnNfdW5tb3VudGZzX3dhaXQobXApOyAJCS8qIHdhaXQgZm9yIGFzeW5jIGJ1ZnMgKi8KKworCXhmc19sb2dfdW5tb3VudChtcCk7CQkJLyogRG9uZSEgTm8gbW9yZSBmcyBvcHMuICovCisKKwl4ZnNfZnJlZXNiKG1wKTsKKworCS8qCisJICogQWxsIGlub2RlcyBmcm9tIHRoaXMgbW91bnQgcG9pbnQgc2hvdWxkIGJlIGZyZWVkLgorCSAqLworCUFTU0VSVChtcC0+bV9pbm9kZXMgPT0gTlVMTCk7CisKKwkvKgorCSAqIFdlIG1heSBoYXZlIGJ1ZnMgdGhhdCBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgZ2V0dGluZyB3cml0dGVuIHN0aWxsLgorCSAqIFdlIG11c3Qgd2FpdCBmb3IgdGhlIEkvTyBjb21wbGV0aW9uIG9mIHRob3NlLiBUaGUgc3luYyBmbGFnIGhlcmUKKwkgKiBkb2VzIGEgdHdvIHBhc3MgaXRlcmF0aW9uIHRocnUgdGhlIGJ1ZmNhY2hlLgorCSAqLworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgeworCQl4ZnNfaW5jb3JlX3JlbHNlKG1wLT5tX2RkZXZfdGFyZ3AsIDAsIDEpOyAvKiBzeW5jaHJvbm91cyAqLworCX0KKworCXhmc191bm1vdW50ZnNfY2xvc2UobXAsIGNyKTsKKwlpZiAoKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX05PVVVJRCkgPT0gMCkKKwkJeGZzX3V1aWRfdW5tb3VudChtcCk7CisKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKElORFVDRV9JT19FUlJPUikKKwkvKgorCSAqIGNsZWFyIGFsbCBlcnJvciB0YWdzIG9uIHRoaXMgZmlsZXN5c3RlbQorCSAqLworCW1lbWNweSgmZnNpZCwgJnZmc3AtPnZmc19mc2lkLCBzaXplb2YoaW50NjRfdCkpOworCXhmc19lcnJvcnRhZ19jbGVhcmFsbF91bW91bnQoZnNpZCwgbXAtPm1fZnNuYW1lLCAwKTsKKyNlbmRpZgorCVhGU19JT0RPTkUodmZzcCk7CisJeGZzX21vdW50X2ZyZWUobXAsIDEpOworCXJldHVybiAwOworfQorCit2b2lkCit4ZnNfdW5tb3VudGZzX2Nsb3NlKHhmc19tb3VudF90ICptcCwgc3RydWN0IGNyZWQgKmNyKQoreworCWlmIChtcC0+bV9sb2dkZXZfdGFyZ3AgIT0gbXAtPm1fZGRldl90YXJncCkKKwkJeGZzX2ZyZWVfYnVmdGFyZyhtcC0+bV9sb2dkZXZfdGFyZ3AsIDEpOworCWlmIChtcC0+bV9ydGRldl90YXJncCkKKwkJeGZzX2ZyZWVfYnVmdGFyZyhtcC0+bV9ydGRldl90YXJncCwgMSk7CisJeGZzX2ZyZWVfYnVmdGFyZyhtcC0+bV9kZGV2X3RhcmdwLCAwKTsKK30KKwordm9pZAoreGZzX3VubW91bnRmc193YWl0KHhmc19tb3VudF90ICptcCkKK3sKKwlpZiAobXAtPm1fbG9nZGV2X3RhcmdwICE9IG1wLT5tX2RkZXZfdGFyZ3ApCisJCXhmc193YWl0X2J1ZnRhcmcobXAtPm1fbG9nZGV2X3RhcmdwKTsKKwlpZiAobXAtPm1fcnRkZXZfdGFyZ3ApCisJCXhmc193YWl0X2J1ZnRhcmcobXAtPm1fcnRkZXZfdGFyZ3ApOworCXhmc193YWl0X2J1ZnRhcmcobXAtPm1fZGRldl90YXJncCk7Cit9CisKK2ludAoreGZzX3VubW91bnRmc193cml0ZXNiKHhmc19tb3VudF90ICptcCkKK3sKKwl4ZnNfYnVmX3QJKnNicDsKKwl4ZnNfc2JfdAkqc2I7CisJaW50CQllcnJvciA9IDA7CisKKwkvKgorCSAqIHNraXAgc3VwZXJibG9jayB3cml0ZSBpZiBmcyBpcyByZWFkLW9ubHksIG9yCisJICogaWYgd2UgYXJlIGRvaW5nIGEgZm9yY2VkIHVtb3VudC4KKwkgKi8KKwlzYnAgPSB4ZnNfZ2V0c2IobXAsIDApOworCWlmICghKFhGU19NVE9WRlMobXApLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkgfHwKKwkJWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpKSB7CisJCS8qCisJCSAqIG1hcmsgc2hhcmVkLXJlYWRvbmx5IGlmIGRlc2lyZWQKKwkJICovCisJCXNiID0gWEZTX0JVRl9UT19TQlAoc2JwKTsKKwkJaWYgKG1wLT5tX21rX3NoYXJlZHJvKSB7CisJCQlpZiAoIShzYi0+c2JfZmxhZ3MgJiBYRlNfU0JGX1JFQURPTkxZKSkKKwkJCQlzYi0+c2JfZmxhZ3MgfD0gWEZTX1NCRl9SRUFET05MWTsKKwkJCWlmICghWEZTX1NCX1ZFUlNJT05fSEFTU0hBUkVEKHNiKSkKKwkJCQlYRlNfU0JfVkVSU0lPTl9BRERTSEFSRUQoc2IpOworCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfTk9URSwgbXAsCisJCQkJIlVubW91bnRpbmcsIG1hcmtpbmcgc2hhcmVkIHJlYWQtb25seSIpOworCQl9CisJCVhGU19CVUZfVU5ET05FKHNicCk7CisJCVhGU19CVUZfVU5SRUFEKHNicCk7CisJCVhGU19CVUZfVU5ERUxBWVdSSVRFKHNicCk7CisJCVhGU19CVUZfV1JJVEUoc2JwKTsKKwkJWEZTX0JVRl9VTkFTWU5DKHNicCk7CisJCUFTU0VSVChYRlNfQlVGX1RBUkdFVChzYnApID09IG1wLT5tX2RkZXZfdGFyZ3ApOworCQl4ZnNiZHN0cmF0KG1wLCBzYnApOworCQkvKiBOZXZlcm1pbmQgZXJyb3JzIHdlIG1pZ2h0IGdldCBoZXJlLiAqLworCQllcnJvciA9IHhmc19pb3dhaXQoc2JwKTsKKwkJaWYgKGVycm9yKQorCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhmc191bm1vdW50ZnNfd3JpdGVzYiIsCisJCQkJCSAgbXAsIHNicCwgWEZTX0JVRl9BRERSKHNicCkpOworCQlpZiAoZXJyb3IgJiYgbXAtPm1fbWtfc2hhcmVkcm8pCisJCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsICJTdXBlcmJsb2NrIHdyaXRlIGVycm9yIGRldGVjdGVkIHdoaWxlIHVubW91bnRpbmcuICBGaWxlc3lzdGVtIG1heSBub3QgYmUgbWFya2VkIHNoYXJlZCByZWFkb25seSIpOworCX0KKwl4ZnNfYnVmX3JlbHNlKHNicCk7CisJcmV0dXJuIChlcnJvcik7Cit9CisKKy8qCisgKiB4ZnNfbW9kX3NiKCkgY2FuIGJlIHVzZWQgdG8gY29weSBhcmJpdHJhcnkgY2hhbmdlcyB0byB0aGUKKyAqIGluLWNvcmUgc3VwZXJibG9jayBpbnRvIHRoZSBzdXBlcmJsb2NrIGJ1ZmZlciB0byBiZSBsb2dnZWQuCisgKiBJdCBkb2VzIG5vdCBwcm92aWRlIHRoZSBoaWdoZXIgbGV2ZWwgb2YgbG9ja2luZyB0aGF0IGlzCisgKiBuZWVkZWQgdG8gcHJvdGVjdCB0aGUgaW4tY29yZSBzdXBlcmJsb2NrIGZyb20gY29uY3VycmVudAorICogYWNjZXNzLgorICovCit2b2lkCit4ZnNfbW9kX3NiKHhmc190cmFuc190ICp0cCwgX19pbnQ2NF90IGZpZWxkcykKK3sKKwl4ZnNfYnVmX3QJKmJwOworCWludAkJZmlyc3Q7CisJaW50CQlsYXN0OworCXhmc19tb3VudF90CSptcDsKKwl4ZnNfc2JfdAkqc2JwOworCXhmc19zYl9maWVsZF90CWY7CisKKwlBU1NFUlQoZmllbGRzKTsKKwlpZiAoIWZpZWxkcykKKwkJcmV0dXJuOworCW1wID0gdHAtPnRfbW91bnRwOworCWJwID0geGZzX3RyYW5zX2dldHNiKHRwLCBtcCwgMCk7CisJc2JwID0gWEZTX0JVRl9UT19TQlAoYnApOworCWZpcnN0ID0gc2l6ZW9mKHhmc19zYl90KTsKKwlsYXN0ID0gMDsKKworCS8qIHRyYW5zbGF0ZS9jb3B5ICovCisKKwl4ZnNfeGxhdGVzYihYRlNfQlVGX1BUUihicCksICYobXAtPm1fc2IpLCAtMSwgZmllbGRzKTsKKworCS8qIGZpbmQgbW9kaWZpZWQgcmFuZ2UgKi8KKworCWYgPSAoeGZzX3NiX2ZpZWxkX3QpeGZzX2xvd2JpdDY0KChfX3VpbnQ2NF90KWZpZWxkcyk7CisJQVNTRVJUKCgxTEwgPDwgZikgJiBYRlNfU0JfTU9EX0JJVFMpOworCWZpcnN0ID0geGZzX3NiX2luZm9bZl0ub2Zmc2V0OworCisJZiA9ICh4ZnNfc2JfZmllbGRfdCl4ZnNfaGlnaGJpdDY0KChfX3VpbnQ2NF90KWZpZWxkcyk7CisJQVNTRVJUKCgxTEwgPDwgZikgJiBYRlNfU0JfTU9EX0JJVFMpOworCWxhc3QgPSB4ZnNfc2JfaW5mb1tmICsgMV0ub2Zmc2V0IC0gMTsKKworCXhmc190cmFuc19sb2dfYnVmKHRwLCBicCwgZmlyc3QsIGxhc3QpOworfQorCisvKgorICogeGZzX21vZF9pbmNvcmVfc2JfdW5sb2NrZWQoKSBpcyBhIHV0aWxpdHkgcm91dGluZSBjb21tb24gdXNlZCB0byBhcHBseQorICogYSBkZWx0YSB0byBhIHNwZWNpZmllZCBmaWVsZCBpbiB0aGUgaW4tY29yZSBzdXBlcmJsb2NrLiAgU2ltcGx5CisgKiBzd2l0Y2ggb24gdGhlIGZpZWxkIGluZGljYXRlZCBhbmQgYXBwbHkgdGhlIGRlbHRhIHRvIHRoYXQgZmllbGQuCisgKiBGaWVsZHMgYXJlIG5vdCBhbGxvd2VkIHRvIGRpcCBiZWxvdyB6ZXJvLCBzbyBpZiB0aGUgZGVsdGEgd291bGQKKyAqIGRvIHRoaXMgZG8gbm90IGFwcGx5IGl0IGFuZCByZXR1cm4gRUlOVkFMLgorICoKKyAqIFRoZSBTQl9MT0NLIG11c3QgYmUgaGVsZCB3aGVuIHRoaXMgcm91dGluZSBpcyBjYWxsZWQuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19tb2RfaW5jb3JlX3NiX3VubG9ja2VkKHhmc19tb3VudF90ICptcCwgeGZzX3NiX2ZpZWxkX3QgZmllbGQsCisJCQlpbnQgZGVsdGEsIGludCByc3ZkKQoreworCWludAkJc2NvdW50ZXI7CS8qIHNob3J0IGNvdW50ZXIgZm9yIDMyIGJpdCBmaWVsZHMgKi8KKwlsb25nIGxvbmcJbGNvdW50ZXI7CS8qIGxvbmcgY291bnRlciBmb3IgNjQgYml0IGZpZWxkcyAqLworCWxvbmcgbG9uZwlyZXNfdXNlZCwgcmVtOworCisJLyoKKwkgKiBXaXRoIHRoZSBpbi1jb3JlIHN1cGVyYmxvY2sgc3BpbiBsb2NrIGhlbGQsIHN3aXRjaAorCSAqIG9uIHRoZSBpbmRpY2F0ZWQgZmllbGQuICBBcHBseSB0aGUgZGVsdGEgdG8gdGhlCisJICogcHJvcGVyIGZpZWxkLiAgSWYgdGhlIGZpZWxkcyB2YWx1ZSB3b3VsZCBkaXAgYmVsb3cKKwkgKiAwLCB0aGVuIGRvIG5vdCBhcHBseSB0aGUgZGVsdGEgYW5kIHJldHVybiBFSU5WQUwuCisJICovCisJc3dpdGNoIChmaWVsZCkgeworCWNhc2UgWEZTX1NCU19JQ09VTlQ6CisJCWxjb3VudGVyID0gKGxvbmcgbG9uZyltcC0+bV9zYi5zYl9pY291bnQ7CisJCWxjb3VudGVyICs9IGRlbHRhOworCQlpZiAobGNvdW50ZXIgPCAwKSB7CisJCQlBU1NFUlQoMCk7CisJCQlyZXR1cm4gKFhGU19FUlJPUihFSU5WQUwpKTsKKwkJfQorCQltcC0+bV9zYi5zYl9pY291bnQgPSBsY291bnRlcjsKKwkJcmV0dXJuICgwKTsKKwljYXNlIFhGU19TQlNfSUZSRUU6CisJCWxjb3VudGVyID0gKGxvbmcgbG9uZyltcC0+bV9zYi5zYl9pZnJlZTsKKwkJbGNvdW50ZXIgKz0gZGVsdGE7CisJCWlmIChsY291bnRlciA8IDApIHsKKwkJCUFTU0VSVCgwKTsKKwkJCXJldHVybiAoWEZTX0VSUk9SKEVJTlZBTCkpOworCQl9CisJCW1wLT5tX3NiLnNiX2lmcmVlID0gbGNvdW50ZXI7CisJCXJldHVybiAoMCk7CisJY2FzZSBYRlNfU0JTX0ZEQkxPQ0tTOgorCisJCWxjb3VudGVyID0gKGxvbmcgbG9uZyltcC0+bV9zYi5zYl9mZGJsb2NrczsKKwkJcmVzX3VzZWQgPSAobG9uZyBsb25nKShtcC0+bV9yZXNibGtzIC0gbXAtPm1fcmVzYmxrc19hdmFpbCk7CisKKwkJaWYgKGRlbHRhID4gMCkgewkJLyogUHV0dGluZyBibG9ja3MgYmFjayAqLworCQkJaWYgKHJlc191c2VkID4gZGVsdGEpIHsKKwkJCQltcC0+bV9yZXNibGtzX2F2YWlsICs9IGRlbHRhOworCQkJfSBlbHNlIHsKKwkJCQlyZW0gPSBkZWx0YSAtIHJlc191c2VkOworCQkJCW1wLT5tX3Jlc2Jsa3NfYXZhaWwgPSBtcC0+bV9yZXNibGtzOworCQkJCWxjb3VudGVyICs9IHJlbTsKKwkJCX0KKwkJfSBlbHNlIHsJCQkJLyogVGFraW5nIGJsb2NrcyBhd2F5ICovCisKKwkJCWxjb3VudGVyICs9IGRlbHRhOworCisJCS8qCisJCSAqIElmIHdlcmUgb3V0IG9mIGJsb2NrcywgdXNlIGFueSBhdmFpbGFibGUgcmVzZXJ2ZWQgYmxvY2tzIGlmCisJCSAqIHdlcmUgYWxsb3dlZCB0by4KKwkJICovCisKKwkJCWlmIChsY291bnRlciA8IDApIHsKKwkJCQlpZiAocnN2ZCkgeworCQkJCQlsY291bnRlciA9IChsb25nIGxvbmcpbXAtPm1fcmVzYmxrc19hdmFpbCArIGRlbHRhOworCQkJCQlpZiAobGNvdW50ZXIgPCAwKSB7CisJCQkJCQlyZXR1cm4gKFhGU19FUlJPUihFTk9TUEMpKTsKKwkJCQkJfQorCQkJCQltcC0+bV9yZXNibGtzX2F2YWlsID0gbGNvdW50ZXI7CisJCQkJCXJldHVybiAoMCk7CisJCQkJfSBlbHNlIHsJLyogbm90IHJlc2VydmVkICovCisJCQkJCXJldHVybiAoWEZTX0VSUk9SKEVOT1NQQykpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCW1wLT5tX3NiLnNiX2ZkYmxvY2tzID0gbGNvdW50ZXI7CisJCXJldHVybiAoMCk7CisJY2FzZSBYRlNfU0JTX0ZSRVhURU5UUzoKKwkJbGNvdW50ZXIgPSAobG9uZyBsb25nKW1wLT5tX3NiLnNiX2ZyZXh0ZW50czsKKwkJbGNvdW50ZXIgKz0gZGVsdGE7CisJCWlmIChsY291bnRlciA8IDApIHsKKwkJCXJldHVybiAoWEZTX0VSUk9SKEVOT1NQQykpOworCQl9CisJCW1wLT5tX3NiLnNiX2ZyZXh0ZW50cyA9IGxjb3VudGVyOworCQlyZXR1cm4gKDApOworCWNhc2UgWEZTX1NCU19EQkxPQ0tTOgorCQlsY291bnRlciA9IChsb25nIGxvbmcpbXAtPm1fc2Iuc2JfZGJsb2NrczsKKwkJbGNvdW50ZXIgKz0gZGVsdGE7CisJCWlmIChsY291bnRlciA8IDApIHsKKwkJCUFTU0VSVCgwKTsKKwkJCXJldHVybiAoWEZTX0VSUk9SKEVJTlZBTCkpOworCQl9CisJCW1wLT5tX3NiLnNiX2RibG9ja3MgPSBsY291bnRlcjsKKwkJcmV0dXJuICgwKTsKKwljYXNlIFhGU19TQlNfQUdDT1VOVDoKKwkJc2NvdW50ZXIgPSBtcC0+bV9zYi5zYl9hZ2NvdW50OworCQlzY291bnRlciArPSBkZWx0YTsKKwkJaWYgKHNjb3VudGVyIDwgMCkgeworCQkJQVNTRVJUKDApOworCQkJcmV0dXJuIChYRlNfRVJST1IoRUlOVkFMKSk7CisJCX0KKwkJbXAtPm1fc2Iuc2JfYWdjb3VudCA9IHNjb3VudGVyOworCQlyZXR1cm4gKDApOworCWNhc2UgWEZTX1NCU19JTUFYX1BDVDoKKwkJc2NvdW50ZXIgPSBtcC0+bV9zYi5zYl9pbWF4X3BjdDsKKwkJc2NvdW50ZXIgKz0gZGVsdGE7CisJCWlmIChzY291bnRlciA8IDApIHsKKwkJCUFTU0VSVCgwKTsKKwkJCXJldHVybiAoWEZTX0VSUk9SKEVJTlZBTCkpOworCQl9CisJCW1wLT5tX3NiLnNiX2ltYXhfcGN0ID0gc2NvdW50ZXI7CisJCXJldHVybiAoMCk7CisJY2FzZSBYRlNfU0JTX1JFWFRTSVpFOgorCQlzY291bnRlciA9IG1wLT5tX3NiLnNiX3JleHRzaXplOworCQlzY291bnRlciArPSBkZWx0YTsKKwkJaWYgKHNjb3VudGVyIDwgMCkgeworCQkJQVNTRVJUKDApOworCQkJcmV0dXJuIChYRlNfRVJST1IoRUlOVkFMKSk7CisJCX0KKwkJbXAtPm1fc2Iuc2JfcmV4dHNpemUgPSBzY291bnRlcjsKKwkJcmV0dXJuICgwKTsKKwljYXNlIFhGU19TQlNfUkJNQkxPQ0tTOgorCQlzY291bnRlciA9IG1wLT5tX3NiLnNiX3JibWJsb2NrczsKKwkJc2NvdW50ZXIgKz0gZGVsdGE7CisJCWlmIChzY291bnRlciA8IDApIHsKKwkJCUFTU0VSVCgwKTsKKwkJCXJldHVybiAoWEZTX0VSUk9SKEVJTlZBTCkpOworCQl9CisJCW1wLT5tX3NiLnNiX3JibWJsb2NrcyA9IHNjb3VudGVyOworCQlyZXR1cm4gKDApOworCWNhc2UgWEZTX1NCU19SQkxPQ0tTOgorCQlsY291bnRlciA9IChsb25nIGxvbmcpbXAtPm1fc2Iuc2JfcmJsb2NrczsKKwkJbGNvdW50ZXIgKz0gZGVsdGE7CisJCWlmIChsY291bnRlciA8IDApIHsKKwkJCUFTU0VSVCgwKTsKKwkJCXJldHVybiAoWEZTX0VSUk9SKEVJTlZBTCkpOworCQl9CisJCW1wLT5tX3NiLnNiX3JibG9ja3MgPSBsY291bnRlcjsKKwkJcmV0dXJuICgwKTsKKwljYXNlIFhGU19TQlNfUkVYVEVOVFM6CisJCWxjb3VudGVyID0gKGxvbmcgbG9uZyltcC0+bV9zYi5zYl9yZXh0ZW50czsKKwkJbGNvdW50ZXIgKz0gZGVsdGE7CisJCWlmIChsY291bnRlciA8IDApIHsKKwkJCUFTU0VSVCgwKTsKKwkJCXJldHVybiAoWEZTX0VSUk9SKEVJTlZBTCkpOworCQl9CisJCW1wLT5tX3NiLnNiX3JleHRlbnRzID0gbGNvdW50ZXI7CisJCXJldHVybiAoMCk7CisJY2FzZSBYRlNfU0JTX1JFWFRTTE9HOgorCQlzY291bnRlciA9IG1wLT5tX3NiLnNiX3JleHRzbG9nOworCQlzY291bnRlciArPSBkZWx0YTsKKwkJaWYgKHNjb3VudGVyIDwgMCkgeworCQkJQVNTRVJUKDApOworCQkJcmV0dXJuIChYRlNfRVJST1IoRUlOVkFMKSk7CisJCX0KKwkJbXAtPm1fc2Iuc2JfcmV4dHNsb2cgPSBzY291bnRlcjsKKwkJcmV0dXJuICgwKTsKKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJCXJldHVybiAoWEZTX0VSUk9SKEVJTlZBTCkpOworCX0KK30KKworLyoKKyAqIHhmc19tb2RfaW5jb3JlX3NiKCkgaXMgdXNlZCB0byBjaGFuZ2UgYSBmaWVsZCBpbiB0aGUgaW4tY29yZQorICogc3VwZXJibG9jayBzdHJ1Y3R1cmUgYnkgdGhlIHNwZWNpZmllZCBkZWx0YS4gIFRoaXMgbW9kaWZpY2F0aW9uCisgKiBpcyBwcm90ZWN0ZWQgYnkgdGhlIFNCX0xPQ0suICBKdXN0IHVzZSB0aGUgeGZzX21vZF9pbmNvcmVfc2JfdW5sb2NrZWQoKQorICogcm91dGluZSB0byBkbyB0aGUgd29yay4KKyAqLworaW50Cit4ZnNfbW9kX2luY29yZV9zYih4ZnNfbW91bnRfdCAqbXAsIHhmc19zYl9maWVsZF90IGZpZWxkLCBpbnQgZGVsdGEsIGludCByc3ZkKQoreworCXVuc2lnbmVkIGxvbmcJczsKKwlpbnQJc3RhdHVzOworCisJcyA9IFhGU19TQl9MT0NLKG1wKTsKKwlzdGF0dXMgPSB4ZnNfbW9kX2luY29yZV9zYl91bmxvY2tlZChtcCwgZmllbGQsIGRlbHRhLCByc3ZkKTsKKwlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qCisgKiB4ZnNfbW9kX2luY29yZV9zYl9iYXRjaCgpIGlzIHVzZWQgdG8gY2hhbmdlIG1vcmUgdGhhbiBvbmUgZmllbGQKKyAqIGluIHRoZSBpbi1jb3JlIHN1cGVyYmxvY2sgc3RydWN0dXJlIGF0IGEgdGltZS4gIFRoaXMgbW9kaWZpY2F0aW9uCisgKiBpcyBwcm90ZWN0ZWQgYnkgYSBsb2NrIGludGVybmFsIHRvIHRoaXMgbW9kdWxlLiAgVGhlIGZpZWxkcyBhbmQKKyAqIGNoYW5nZXMgdG8gdGhvc2UgZmllbGRzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIGFycmF5IG9mIHhmc19tb2Rfc2IKKyAqIHN0cnVjdHVyZXMgcGFzc2VkIGluLgorICoKKyAqIEVpdGhlciBhbGwgb2YgdGhlIHNwZWNpZmllZCBkZWx0YXMgd2lsbCBiZSBhcHBsaWVkIG9yIG5vbmUgb2YKKyAqIHRoZW0gd2lsbC4gIElmIGFueSBtb2RpZmllZCBmaWVsZCBkaXBzIGJlbG93IDAsIHRoZW4gYWxsIG1vZGlmaWNhdGlvbnMKKyAqIHdpbGwgYmUgYmFja2VkIG91dCBhbmQgRUlOVkFMIHdpbGwgYmUgcmV0dXJuZWQuCisgKi8KK2ludAoreGZzX21vZF9pbmNvcmVfc2JfYmF0Y2goeGZzX21vdW50X3QgKm1wLCB4ZnNfbW9kX3NiX3QgKm1zYiwgdWludCBubXNiLCBpbnQgcnN2ZCkKK3sKKwl1bnNpZ25lZCBsb25nCXM7CisJaW50CQlzdGF0dXM9MDsKKwl4ZnNfbW9kX3NiX3QJKm1zYnA7CisKKwkvKgorCSAqIExvb3AgdGhyb3VnaCB0aGUgYXJyYXkgb2YgbW9kIHN0cnVjdHVyZXMgYW5kIGFwcGx5IGVhY2gKKwkgKiBpbmRpdmlkdWFsbHkuICBJZiBhbnkgZmFpbCwgdGhlbiBiYWNrIG91dCBhbGwgdGhvc2UKKwkgKiB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkLiAgRG8gYWxsIG9mIHRoaXMgd2l0aGluCisJICogdGhlIHNjb3BlIG9mIHRoZSBTQl9MT0NLIHNvIHRoYXQgYWxsIG9mIHRoZSBjaGFuZ2VzIHdpbGwKKwkgKiBiZSBhdG9taWMuCisJICovCisJcyA9IFhGU19TQl9MT0NLKG1wKTsKKwltc2JwID0gJm1zYlswXTsKKwlmb3IgKG1zYnAgPSAmbXNicFswXTsgbXNicCA8IChtc2IgKyBubXNiKTsgbXNicCsrKSB7CisJCS8qCisJCSAqIEFwcGx5IHRoZSBkZWx0YSBhdCBpbmRleCBuLiAgSWYgaXQgZmFpbHMsIGJyZWFrCisJCSAqIGZyb20gdGhlIGxvb3Agc28gd2UnbGwgZmFsbCBpbnRvIHRoZSB1bmRvIGxvb3AKKwkJICogYmVsb3cuCisJCSAqLworCQlzdGF0dXMgPSB4ZnNfbW9kX2luY29yZV9zYl91bmxvY2tlZChtcCwgbXNicC0+bXNiX2ZpZWxkLAorCQkJCQkJICAgIG1zYnAtPm1zYl9kZWx0YSwgcnN2ZCk7CisJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHdlIGRpZG4ndCBjb21wbGV0ZSB0aGUgbG9vcCBhYm92ZSwgdGhlbiBiYWNrIG91dAorCSAqIGFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIHN1cGVyYmxvY2suICBJZiB5b3UgYWRkIGNvZGUKKwkgKiBiZXR3ZWVuIHRoZSBsb29wIGFib3ZlIGFuZCBoZXJlLCBtYWtlIHN1cmUgdGhhdCB5b3UKKwkgKiBwcmVzZXJ2ZSB0aGUgdmFsdWUgb2Ygc3RhdHVzLiBMb29wIGJhY2sgdW50aWwKKwkgKiB3ZSBzdGVwIGJlbG93IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LiAgTWFrZSBzdXJlCisJICogd2UgZG9uJ3QgdG91Y2ggYW55dGhpbmcgYmFjayB0aGVyZS4KKwkgKi8KKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJbXNicC0tOworCQl3aGlsZSAobXNicCA+PSBtc2IpIHsKKwkJCXN0YXR1cyA9IHhmc19tb2RfaW5jb3JlX3NiX3VubG9ja2VkKG1wLAorCQkJCSAgICBtc2JwLT5tc2JfZmllbGQsIC0obXNicC0+bXNiX2RlbHRhKSwgcnN2ZCk7CisJCQlBU1NFUlQoc3RhdHVzID09IDApOworCQkJbXNicC0tOworCQl9CisJfQorCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoKKyAqIHhmc19nZXRzYigpIGlzIGNhbGxlZCB0byBvYnRhaW4gdGhlIGJ1ZmZlciBmb3IgdGhlIHN1cGVyYmxvY2suCisgKiBUaGUgYnVmZmVyIGlzIHJldHVybmVkIGxvY2tlZCBhbmQgcmVhZCBpbiBmcm9tIGRpc2suCisgKiBUaGUgYnVmZmVyIHNob3VsZCBiZSByZWxlYXNlZCB3aXRoIGEgY2FsbCB0byB4ZnNfYnJlbHNlKCkuCisgKgorICogSWYgdGhlIGZsYWdzIHBhcmFtZXRlciBpcyBCVUZfVFJZTE9DSywgdGhlbiB3ZSdsbCBvbmx5IHJldHVybgorICogdGhlIHN1cGVyYmxvY2sgYnVmZmVyIGlmIGl0IGNhbiBiZSBsb2NrZWQgd2l0aG91dCBzbGVlcGluZy4KKyAqIElmIGl0IGNhbid0IHRoZW4gd2UnbGwgcmV0dXJuIE5VTEwuCisgKi8KK3hmc19idWZfdCAqCit4ZnNfZ2V0c2IoCisJeGZzX21vdW50X3QJKm1wLAorCWludAkJZmxhZ3MpCit7CisJeGZzX2J1Zl90CSpicDsKKworCUFTU0VSVChtcC0+bV9zYl9icCAhPSBOVUxMKTsKKwlicCA9IG1wLT5tX3NiX2JwOworCWlmIChmbGFncyAmIFhGU19CVUZfVFJZTE9DSykgeworCQlpZiAoIVhGU19CVUZfQ1BTRU1BKGJwKSkgeworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlYRlNfQlVGX1BTRU1BKGJwLCBQUklCSU8pOworCX0KKwlYRlNfQlVGX0hPTEQoYnApOworCUFTU0VSVChYRlNfQlVGX0lTRE9ORShicCkpOworCXJldHVybiAoYnApOworfQorCisvKgorICogVXNlZCB0byBmcmVlIHRoZSBzdXBlcmJsb2NrIGFsb25nIHZhcmlvdXMgZXJyb3IgcGF0aHMuCisgKi8KK3ZvaWQKK3hmc19mcmVlc2IoCisJeGZzX21vdW50X3QJKm1wKQoreworCXhmc19idWZfdAkqYnA7CisKKwkvKgorCSAqIFVzZSB4ZnNfZ2V0c2IoKSBzbyB0aGF0IHRoZSBidWZmZXIgd2lsbCBiZSBsb2NrZWQKKwkgKiB3aGVuIHdlIGNhbGwgeGZzX2J1Zl9yZWxzZSgpLgorCSAqLworCWJwID0geGZzX2dldHNiKG1wLCAwKTsKKwlYRlNfQlVGX1VOTUFOQUdFKGJwKTsKKwl4ZnNfYnVmX3JlbHNlKGJwKTsKKwltcC0+bV9zYl9icCA9IE5VTEw7Cit9CisKKy8qCisgKiBTZWUgaWYgdGhlIFVVSUQgaXMgdW5pcXVlIGFtb25nIG1vdW50ZWQgWEZTIGZpbGVzeXN0ZW1zLgorICogTW91bnQgZmFpbHMgaWYgVVVJRCBpcyBuaWwgb3IgYSBGUyB3aXRoIHRoZSBzYW1lIFVVSUQgaXMgYWxyZWFkeSBtb3VudGVkLgorICovCitTVEFUSUMgaW50Cit4ZnNfdXVpZF9tb3VudCgKKwl4ZnNfbW91bnRfdAkqbXApCit7CisJaWYgKHV1aWRfaXNfbmlsKCZtcC0+bV9zYi5zYl91dWlkKSkgeworCQljbW5fZXJyKENFX1dBUk4sCisJCQkiWEZTOiBGaWxlc3lzdGVtICVzIGhhcyBuaWwgVVVJRCAtIGNhbid0IG1vdW50IiwKKwkJCW1wLT5tX2ZzbmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKCF1dWlkX3RhYmxlX2luc2VydCgmbXAtPm1fc2Iuc2JfdXVpZCkpIHsKKwkJY21uX2VycihDRV9XQVJOLAorCQkJIlhGUzogRmlsZXN5c3RlbSAlcyBoYXMgZHVwbGljYXRlIFVVSUQgLSBjYW4ndCBtb3VudCIsCisJCQltcC0+bV9mc25hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogUmVtb3ZlIGZpbGVzeXN0ZW0gZnJvbSB0aGUgVVVJRCB0YWJsZS4KKyAqLworU1RBVElDIHZvaWQKK3hmc191dWlkX3VubW91bnQoCisJeGZzX21vdW50X3QJKm1wKQoreworCXV1aWRfdGFibGVfcmVtb3ZlKCZtcC0+bV9zYi5zYl91dWlkKTsKK30KKworLyoKKyAqIFVzZWQgdG8gbG9nIGNoYW5nZXMgdG8gdGhlIHN1cGVyYmxvY2sgdW5pdCBhbmQgd2lkdGggZmllbGRzIHdoaWNoIGNvdWxkCisgKiBiZSBhbHRlcmVkIGJ5IHRoZSBtb3VudCBvcHRpb25zLiBPbmx5IHRoZSBmaXJzdCBzdXBlcmJsb2NrIGlzIHVwZGF0ZWQuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfbW91bnRfbG9nX3NidW5pdCgKKwl4ZnNfbW91bnRfdAkqbXAsCisJX19pbnQ2NF90CWZpZWxkcykKK3sKKwl4ZnNfdHJhbnNfdAkqdHA7CisKKwlBU1NFUlQoZmllbGRzICYgKFhGU19TQl9VTklUfFhGU19TQl9XSURUSHxYRlNfU0JfVVVJRCkpOworCisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19TQl9VTklUKTsKKwlpZiAoeGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIG1wLT5tX3NiLnNiX3NlY3RzaXplICsgMTI4LCAwLCAwLAorCQkJCVhGU19ERUZBVUxUX0xPR19DT1VOVCkpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCXJldHVybjsKKwl9CisJeGZzX21vZF9zYih0cCwgZmllbGRzKTsKKwl4ZnNfdHJhbnNfY29tbWl0KHRwLCAwLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbW91bnQuaCBiL2ZzL3hmcy94ZnNfbW91bnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmM2MjAxCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19tb3VudC5oCkBAIC0wLDAgKzEsNTczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19NT1VOVF9IX18KKyNkZWZpbmUJX19YRlNfTU9VTlRfSF9fCisKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX3RyYW5zX3Jlc2VydmF0aW9ucyB7CisJdWludAl0cl93cml0ZTsJLyogZXh0ZW50IGFsbG9jIHRyYW5zICovCisJdWludAl0cl9pdHJ1bmNhdGU7CS8qIHRydW5jYXRlIHRyYW5zICovCisJdWludAl0cl9yZW5hbWU7CS8qIHJlbmFtZSB0cmFucyAqLworCXVpbnQJdHJfbGluazsJLyogbGluayB0cmFucyAqLworCXVpbnQJdHJfcmVtb3ZlOwkvKiB1bmxpbmsgdHJhbnMgKi8KKwl1aW50CXRyX3N5bWxpbms7CS8qIHN5bWxpbmsgdHJhbnMgKi8KKwl1aW50CXRyX2NyZWF0ZTsJLyogY3JlYXRlIHRyYW5zICovCisJdWludAl0cl9ta2RpcjsJLyogbWtkaXIgdHJhbnMgKi8KKwl1aW50CXRyX2lmcmVlOwkvKiBpbm9kZSBmcmVlIHRyYW5zICovCisJdWludAl0cl9pY2hhbmdlOwkvKiBpbm9kZSB1cGRhdGUgdHJhbnMgKi8KKwl1aW50CXRyX2dyb3dkYXRhOwkvKiBmcyBkYXRhIHNlY3Rpb24gZ3JvdyB0cmFucyAqLworCXVpbnQJdHJfc3dyaXRlOwkvKiBzeW5jIHdyaXRlIGlub2RlIHRyYW5zICovCisJdWludAl0cl9hZGRhZm9yazsJLyogY3Z0IGlub2RlIHRvIGF0dHJpYnV0ZWQgdHJhbnMgKi8KKwl1aW50CXRyX3dyaXRlaWQ7CS8qIHdyaXRlIHNldHVpZC9zZXRnaWQgZmlsZSAqLworCXVpbnQJdHJfYXR0cmludmFsOwkvKiBhdHRyIGZvcmsgYnVmZmVyIGludmFsaWRhdGlvbiAqLworCXVpbnQJdHJfYXR0cnNldDsJLyogc2V0L2NyZWF0ZSBhbiBhdHRyaWJ1dGUgKi8KKwl1aW50CXRyX2F0dHJybTsJLyogcmVtb3ZlIGFuIGF0dHJpYnV0ZSAqLworCXVpbnQJdHJfY2xlYXJhZ2k7CS8qIGNsZWFyIGJhZCBhZ2kgdW5saW5rZWQgaW5vIGJ1Y2tldCAqLworCXVpbnQJdHJfZ3Jvd3J0YWxsb2M7CS8qIGdyb3cgcmVhbHRpbWUgYWxsb2NhdGlvbnMgKi8KKwl1aW50CXRyX2dyb3dydHplcm87CS8qIGdyb3cgcmVhbHRpbWUgemVyb2luZyAqLworCXVpbnQJdHJfZ3Jvd3J0ZnJlZTsJLyogZ3JvdyByZWFsdGltZSBmcmVlaW5nICovCit9IHhmc190cmFuc19yZXNlcnZhdGlvbnNfdDsKKworCisjaWZuZGVmIF9fS0VSTkVMX18KKy8qCisgKiBNb3ZlZCBoZXJlIGZyb20geGZzX2FnLmggdG8gYXZvaWQgcmVvcmRlcmluZyBoZWFkZXIgZmlsZXMKKyAqLworI2RlZmluZSBYRlNfREFERFJfVE9fQUdOTyhtcCxkKSBcCisJKCh4ZnNfYWdudW1iZXJfdCkoWEZTX0JCX1RPX0ZTQlQobXAsIGQpIC8gKG1wKS0+bV9zYi5zYl9hZ2Jsb2NrcykpCisjZGVmaW5lIFhGU19EQUREUl9UT19BR0JOTyhtcCxkKSBcCisJKCh4ZnNfYWdibG9ja190KShYRlNfQkJfVE9fRlNCVChtcCwgZCkgJSAobXApLT5tX3NiLnNiX2FnYmxvY2tzKSkKKyNlbHNlCitzdHJ1Y3QgY3JlZDsKK3N0cnVjdCBsb2c7CitzdHJ1Y3QgdmZzOworc3RydWN0IHZub2RlOworc3RydWN0IHhmc19tb3VudF9hcmdzOworc3RydWN0IHhmc19paGFzaDsKK3N0cnVjdCB4ZnNfY2hhc2g7CitzdHJ1Y3QgeGZzX2lub2RlOworc3RydWN0IHhmc19wZXJhZzsKK3N0cnVjdCB4ZnNfaW9jb3JlOworc3RydWN0IHhmc19ibWJ0X2lyZWM7CitzdHJ1Y3QgeGZzX2JtYXBfZnJlZTsKKworI2RlZmluZQlBSUxfTE9DS19UCQlsb2NrX3QKKyNkZWZpbmUJQUlMX0xPQ0tJTklUKHgseSkJc3BpbmxvY2tfaW5pdCh4LHkpCisjZGVmaW5lCUFJTF9MT0NLX0RFU1RST1koeCkJc3BpbmxvY2tfZGVzdHJveSh4KQorI2RlZmluZQlBSUxfTE9DSyhtcCxzKQkJcz1tdXRleF9zcGlubG9jaygmKG1wKS0+bV9haWxfbG9jaykKKyNkZWZpbmUJQUlMX1VOTE9DSyhtcCxzKQltdXRleF9zcGludW5sb2NrKCYobXApLT5tX2FpbF9sb2NrLCBzKQorCisKKy8qCisgKiBQcm90b3R5cGVzIGFuZCBmdW5jdGlvbnMgZm9yIHRoZSBEYXRhIE1pZ3JhdGlvbiBzdWJzeXN0ZW0uCisgKi8KKwordHlwZWRlZiBpbnQJKCp4ZnNfc2VuZF9kYXRhX3QpKGludCwgc3RydWN0IHZub2RlICosCisJCQl4ZnNfb2ZmX3QsIHNpemVfdCwgaW50LCB2cndsb2NrX3QgKik7Cit0eXBlZGVmIGludAkoKnhmc19zZW5kX21tYXBfdCkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICosIHVpbnQpOwordHlwZWRlZiBpbnQJKCp4ZnNfc2VuZF9kZXN0cm95X3QpKHN0cnVjdCB2bm9kZSAqLCBkbV9yaWdodF90KTsKK3R5cGVkZWYgaW50CSgqeGZzX3NlbmRfbmFtZXNwX3QpKGRtX2V2ZW50dHlwZV90LCBzdHJ1Y3QgdmZzICosCisJCQlzdHJ1Y3Qgdm5vZGUgKiwKKwkJCWRtX3JpZ2h0X3QsIHN0cnVjdCB2bm9kZSAqLCBkbV9yaWdodF90LAorCQkJY2hhciAqLCBjaGFyICosIG1vZGVfdCwgaW50LCBpbnQpOwordHlwZWRlZiB2b2lkCSgqeGZzX3NlbmRfdW5tb3VudF90KShzdHJ1Y3QgdmZzICosIHN0cnVjdCB2bm9kZSAqLAorCQkJZG1fcmlnaHRfdCwgbW9kZV90LCBpbnQsIGludCk7CisKK3R5cGVkZWYgc3RydWN0IHhmc19kbW9wcyB7CisJeGZzX3NlbmRfZGF0YV90CQl4ZnNfc2VuZF9kYXRhOworCXhmc19zZW5kX21tYXBfdAkJeGZzX3NlbmRfbW1hcDsKKwl4ZnNfc2VuZF9kZXN0cm95X3QJeGZzX3NlbmRfZGVzdHJveTsKKwl4ZnNfc2VuZF9uYW1lc3BfdAl4ZnNfc2VuZF9uYW1lc3A7CisJeGZzX3NlbmRfdW5tb3VudF90CXhmc19zZW5kX3VubW91bnQ7Cit9IHhmc19kbW9wc190OworCisjZGVmaW5lIFhGU19TRU5EX0RBVEEobXAsIGV2LHZwLG9mZixsZW4sZmwsbG9jaykgXAorCSgqKG1wKS0+bV9kbV9vcHMueGZzX3NlbmRfZGF0YSkoZXYsdnAsb2ZmLGxlbixmbCxsb2NrKQorI2RlZmluZSBYRlNfU0VORF9NTUFQKG1wLCB2bWEsZmwpIFwKKwkoKihtcCktPm1fZG1fb3BzLnhmc19zZW5kX21tYXApKHZtYSxmbCkKKyNkZWZpbmUgWEZTX1NFTkRfREVTVFJPWShtcCwgdnAscmlnaHQpIFwKKwkoKihtcCktPm1fZG1fb3BzLnhmc19zZW5kX2Rlc3Ryb3kpKHZwLHJpZ2h0KQorI2RlZmluZSBYRlNfU0VORF9OQU1FU1AobXAsIGV2LGIxLHIxLGIyLHIyLG4xLG4yLG1vZGUscnZhbCxmbCkgXAorCSgqKG1wKS0+bV9kbV9vcHMueGZzX3NlbmRfbmFtZXNwKShldixOVUxMLGIxLHIxLGIyLHIyLG4xLG4yLG1vZGUscnZhbCxmbCkKKyNkZWZpbmUgWEZTX1NFTkRfUFJFVU5NT1VOVChtcCwgdmZzLGIxLHIxLGIyLHIyLG4xLG4yLG1vZGUscnZhbCxmbCkgXAorCSgqKG1wKS0+bV9kbV9vcHMueGZzX3NlbmRfbmFtZXNwKShETV9FVkVOVF9QUkVVTk1PVU5ULHZmcyxiMSxyMSxiMixyMixuMSxuMixtb2RlLHJ2YWwsZmwpCisjZGVmaW5lIFhGU19TRU5EX1VOTU9VTlQobXAsIHZmc3AsdnAscmlnaHQsbW9kZSxydmFsLGZsKSBcCisJKCoobXApLT5tX2RtX29wcy54ZnNfc2VuZF91bm1vdW50KSh2ZnNwLHZwLHJpZ2h0LG1vZGUscnZhbCxmbCkKKworCisvKgorICogUHJvdG90eXBlcyBhbmQgZnVuY3Rpb25zIGZvciB0aGUgUXVvdGEgTWFuYWdlbWVudCBzdWJzeXN0ZW0uCisgKi8KKworc3RydWN0IHhmc19kcXVvdDsKK3N0cnVjdCB4ZnNfZHF0cnhvcHM7CitzdHJ1Y3QgeGZzX3F1b3RhaW5mbzsKKwordHlwZWRlZiBpbnQJKCp4ZnNfcW1pbml0X3QpKHN0cnVjdCB4ZnNfbW91bnQgKiwgdWludCAqLCB1aW50ICopOwordHlwZWRlZiBpbnQJKCp4ZnNfcW1tb3VudF90KShzdHJ1Y3QgeGZzX21vdW50ICosIHVpbnQsIHVpbnQsIGludCk7Cit0eXBlZGVmIGludAkoKnhmc19xbXVubW91bnRfdCkoc3RydWN0IHhmc19tb3VudCAqKTsKK3R5cGVkZWYgdm9pZAkoKnhmc19xbWRvbmVfdCkoc3RydWN0IHhmc19tb3VudCAqKTsKK3R5cGVkZWYgdm9pZAkoKnhmc19kcXJlbGVfdCkoc3RydWN0IHhmc19kcXVvdCAqKTsKK3R5cGVkZWYgaW50CSgqeGZzX2RxYXR0YWNoX3QpKHN0cnVjdCB4ZnNfaW5vZGUgKiwgdWludCk7Cit0eXBlZGVmIHZvaWQJKCp4ZnNfZHFkZXRhY2hfdCkoc3RydWN0IHhmc19pbm9kZSAqKTsKK3R5cGVkZWYgaW50CSgqeGZzX2RxcHVyZ2VhbGxfdCkoc3RydWN0IHhmc19tb3VudCAqLCB1aW50KTsKK3R5cGVkZWYgaW50CSgqeGZzX2Rxdm9wYWxsb2NfdCkoc3RydWN0IHhmc19tb3VudCAqLAorCQkJc3RydWN0IHhmc19pbm9kZSAqLCB1aWRfdCwgZ2lkX3QsIHVpbnQsCisJCQlzdHJ1Y3QgeGZzX2RxdW90ICoqLCBzdHJ1Y3QgeGZzX2RxdW90ICoqKTsKK3R5cGVkZWYgdm9pZAkoKnhmc19kcXZvcGNyZWF0ZV90KShzdHJ1Y3QgeGZzX3RyYW5zICosIHN0cnVjdCB4ZnNfaW5vZGUgKiwKKwkJCXN0cnVjdCB4ZnNfZHF1b3QgKiwgc3RydWN0IHhmc19kcXVvdCAqKTsKK3R5cGVkZWYgaW50CSgqeGZzX2Rxdm9wcmVuYW1lX3QpKHN0cnVjdCB4ZnNfaW5vZGUgKiopOwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RxdW90ICogKCp4ZnNfZHF2b3BjaG93bl90KSgKKwkJCXN0cnVjdCB4ZnNfdHJhbnMgKiwgc3RydWN0IHhmc19pbm9kZSAqLAorCQkJc3RydWN0IHhmc19kcXVvdCAqKiwgc3RydWN0IHhmc19kcXVvdCAqKTsKK3R5cGVkZWYgaW50CSgqeGZzX2Rxdm9wY2hvd25yZXN2X3QpKHN0cnVjdCB4ZnNfdHJhbnMgKiwgc3RydWN0IHhmc19pbm9kZSAqLAorCQkJc3RydWN0IHhmc19kcXVvdCAqLCBzdHJ1Y3QgeGZzX2RxdW90ICosIHVpbnQpOworCit0eXBlZGVmIHN0cnVjdCB4ZnNfcW1vcHMgeworCXhmc19xbWluaXRfdAkJeGZzX3FtaW5pdDsKKwl4ZnNfcW1kb25lX3QJCXhmc19xbWRvbmU7CisJeGZzX3FtbW91bnRfdAkJeGZzX3FtbW91bnQ7CisJeGZzX3FtdW5tb3VudF90CQl4ZnNfcW11bm1vdW50OworCXhmc19kcXJlbGVfdAkJeGZzX2RxcmVsZTsKKwl4ZnNfZHFhdHRhY2hfdAkJeGZzX2RxYXR0YWNoOworCXhmc19kcWRldGFjaF90CQl4ZnNfZHFkZXRhY2g7CisJeGZzX2RxcHVyZ2VhbGxfdAl4ZnNfZHFwdXJnZWFsbDsKKwl4ZnNfZHF2b3BhbGxvY190CXhmc19kcXZvcGFsbG9jOworCXhmc19kcXZvcGNyZWF0ZV90CXhmc19kcXZvcGNyZWF0ZTsKKwl4ZnNfZHF2b3ByZW5hbWVfdAl4ZnNfZHF2b3ByZW5hbWU7CisJeGZzX2Rxdm9wY2hvd25fdAl4ZnNfZHF2b3BjaG93bjsKKwl4ZnNfZHF2b3BjaG93bnJlc3ZfdAl4ZnNfZHF2b3BjaG93bnJlc3Y7CisJc3RydWN0IHhmc19kcXRyeG9wcwkqeGZzX2RxdHJ4b3BzOworfSB4ZnNfcW1vcHNfdDsKKworI2RlZmluZSBYRlNfUU1fSU5JVChtcCwgbW50LCBmbCkgXAorCSgqKG1wKS0+bV9xbV9vcHMueGZzX3FtaW5pdCkobXAsIG1udCwgZmwpCisjZGVmaW5lIFhGU19RTV9NT1VOVChtcCwgbW50LCBmbCwgbWZzaV9mbGFncykgXAorCSgqKG1wKS0+bV9xbV9vcHMueGZzX3FtbW91bnQpKG1wLCBtbnQsIGZsLCBtZnNpX2ZsYWdzKQorI2RlZmluZSBYRlNfUU1fVU5NT1VOVChtcCkgXAorCSgqKG1wKS0+bV9xbV9vcHMueGZzX3FtdW5tb3VudCkobXApCisjZGVmaW5lIFhGU19RTV9ET05FKG1wKSBcCisJKCoobXApLT5tX3FtX29wcy54ZnNfcW1kb25lKShtcCkKKyNkZWZpbmUgWEZTX1FNX0RRUkVMRShtcCwgZHEpIFwKKwkoKihtcCktPm1fcW1fb3BzLnhmc19kcXJlbGUpKGRxKQorI2RlZmluZSBYRlNfUU1fRFFBVFRBQ0gobXAsIGlwLCBmbCkgXAorCSgqKG1wKS0+bV9xbV9vcHMueGZzX2RxYXR0YWNoKShpcCwgZmwpCisjZGVmaW5lIFhGU19RTV9EUURFVEFDSChtcCwgaXApIFwKKwkoKihtcCktPm1fcW1fb3BzLnhmc19kcWRldGFjaCkoaXApCisjZGVmaW5lIFhGU19RTV9EUVBVUkdFQUxMKG1wLCBmbCkgXAorCSgqKG1wKS0+bV9xbV9vcHMueGZzX2RxcHVyZ2VhbGwpKG1wLCBmbCkKKyNkZWZpbmUgWEZTX1FNX0RRVk9QQUxMT0MobXAsIGlwLCB1aWQsIGdpZCwgZmwsIGRxMSwgZHEyKSBcCisJKCoobXApLT5tX3FtX29wcy54ZnNfZHF2b3BhbGxvYykobXAsIGlwLCB1aWQsIGdpZCwgZmwsIGRxMSwgZHEyKQorI2RlZmluZSBYRlNfUU1fRFFWT1BDUkVBVEUobXAsIHRwLCBpcCwgZHExLCBkcTIpIFwKKwkoKihtcCktPm1fcW1fb3BzLnhmc19kcXZvcGNyZWF0ZSkodHAsIGlwLCBkcTEsIGRxMikKKyNkZWZpbmUgWEZTX1FNX0RRVk9QUkVOQU1FKG1wLCBpcCkgXAorCSgqKG1wKS0+bV9xbV9vcHMueGZzX2Rxdm9wcmVuYW1lKShpcCkKKyNkZWZpbmUgWEZTX1FNX0RRVk9QQ0hPV04obXAsIHRwLCBpcCwgZHFwLCBkcSkgXAorCSgqKG1wKS0+bV9xbV9vcHMueGZzX2Rxdm9wY2hvd24pKHRwLCBpcCwgZHFwLCBkcSkKKyNkZWZpbmUgWEZTX1FNX0RRVk9QQ0hPV05SRVNWKG1wLCB0cCwgaXAsIGRxMSwgZHEyLCBmbCkgXAorCSgqKG1wKS0+bV9xbV9vcHMueGZzX2Rxdm9wY2hvd25yZXN2KSh0cCwgaXAsIGRxMSwgZHEyLCBmbCkKKworCisvKgorICogUHJvdG90eXBlcyBhbmQgZnVuY3Rpb25zIGZvciBJL08gY29yZSBtb2R1bGFyaXphdGlvbi4KKyAqLworCit0eXBlZGVmIGludAkJKCp4ZnNfaW9pbml0X3QpKHN0cnVjdCB2ZnMgKiwKKwkJCQlzdHJ1Y3QgeGZzX21vdW50X2FyZ3MgKiwgaW50KTsKK3R5cGVkZWYgaW50CQkoKnhmc19ibWFwaV90KShzdHJ1Y3QgeGZzX3RyYW5zICosIHZvaWQgKiwKKwkJCQl4ZnNfZmlsZW9mZl90LCB4ZnNfZmlsYmxrc190LCBpbnQsCisJCQkJeGZzX2ZzYmxvY2tfdCAqLCB4ZnNfZXh0bGVuX3QsCisJCQkJc3RydWN0IHhmc19ibWJ0X2lyZWMgKiwgaW50ICosCisJCQkJc3RydWN0IHhmc19ibWFwX2ZyZWUgKik7Cit0eXBlZGVmIGludAkJKCp4ZnNfYm1hcF9lb2ZfdCkodm9pZCAqLCB4ZnNfZmlsZW9mZl90LCBpbnQsIGludCAqKTsKK3R5cGVkZWYgaW50CQkoKnhmc19pb21hcF93cml0ZV9kaXJlY3RfdCkoCisJCQkJdm9pZCAqLCBsb2ZmX3QsIHNpemVfdCwgaW50LAorCQkJCXN0cnVjdCB4ZnNfYm1idF9pcmVjICosIGludCAqLCBpbnQpOwordHlwZWRlZiBpbnQJCSgqeGZzX2lvbWFwX3dyaXRlX2RlbGF5X3QpKAorCQkJCXZvaWQgKiwgbG9mZl90LCBzaXplX3QsIGludCwKKwkJCQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqLCBpbnQgKik7Cit0eXBlZGVmIGludAkJKCp4ZnNfaW9tYXBfd3JpdGVfYWxsb2NhdGVfdCkoCisJCQkJdm9pZCAqLCBzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqLCBpbnQgKik7Cit0eXBlZGVmIGludAkJKCp4ZnNfaW9tYXBfd3JpdGVfdW53cml0dGVuX3QpKAorCQkJCXZvaWQgKiwgbG9mZl90LCBzaXplX3QpOwordHlwZWRlZiB1aW50CQkoKnhmc19sY2tfbWFwX3NoYXJlZF90KSh2b2lkICopOwordHlwZWRlZiB2b2lkCQkoKnhmc19sb2NrX3QpKHZvaWQgKiwgdWludCk7Cit0eXBlZGVmIHZvaWQJCSgqeGZzX2xvY2tfZGVtb3RlX3QpKHZvaWQgKiwgdWludCk7Cit0eXBlZGVmIGludAkJKCp4ZnNfbG9ja19ub3dhaXRfdCkodm9pZCAqLCB1aW50KTsKK3R5cGVkZWYgdm9pZAkJKCp4ZnNfdW5sa190KSh2b2lkICosIHVuc2lnbmVkIGludCk7Cit0eXBlZGVmIHhmc19mc2l6ZV90CSgqeGZzX3NpemVfdCkodm9pZCAqKTsKK3R5cGVkZWYgeGZzX2ZzaXplX3QJKCp4ZnNfaW9kb25lX3QpKHN0cnVjdCB2ZnMgKik7CisKK3R5cGVkZWYgc3RydWN0IHhmc19pb29wcyB7CisJeGZzX2lvaW5pdF90CQkJeGZzX2lvaW5pdDsKKwl4ZnNfYm1hcGlfdAkJCXhmc19ibWFwaV9mdW5jOworCXhmc19ibWFwX2VvZl90CQkJeGZzX2JtYXBfZW9mX2Z1bmM7CisJeGZzX2lvbWFwX3dyaXRlX2RpcmVjdF90CXhmc19pb21hcF93cml0ZV9kaXJlY3Q7CisJeGZzX2lvbWFwX3dyaXRlX2RlbGF5X3QJCXhmc19pb21hcF93cml0ZV9kZWxheTsKKwl4ZnNfaW9tYXBfd3JpdGVfYWxsb2NhdGVfdAl4ZnNfaW9tYXBfd3JpdGVfYWxsb2NhdGU7CisJeGZzX2lvbWFwX3dyaXRlX3Vud3JpdHRlbl90CXhmc19pb21hcF93cml0ZV91bndyaXR0ZW47CisJeGZzX2xvY2tfdAkJCXhmc19pbG9jazsKKwl4ZnNfbGNrX21hcF9zaGFyZWRfdAkJeGZzX2xja19tYXBfc2hhcmVkOworCXhmc19sb2NrX2RlbW90ZV90CQl4ZnNfaWxvY2tfZGVtb3RlOworCXhmc19sb2NrX25vd2FpdF90CQl4ZnNfaWxvY2tfbm93YWl0OworCXhmc191bmxrX3QJCQl4ZnNfdW5sb2NrOworCXhmc19zaXplX3QJCQl4ZnNfc2l6ZV9mdW5jOworCXhmc19pb2RvbmVfdAkJCXhmc19pb2RvbmU7Cit9IHhmc19pb29wc190OworCisjZGVmaW5lIFhGU19JT0lOSVQodmZzcCwgYXJncywgZmxhZ3MpIFwKKwkoKihtcCktPm1faW9fb3BzLnhmc19pb2luaXQpKHZmc3AsIGFyZ3MsIGZsYWdzKQorI2RlZmluZSBYRlNfQk1BUEkobXAsIHRyYW5zLGlvLGJubyxsZW4sZixmaXJzdCx0b3QsbXZhbCxubWFwLGZsaXN0KQlcCisJKCoobXApLT5tX2lvX29wcy54ZnNfYm1hcGlfZnVuYykgXAorCQkodHJhbnMsKGlvKS0+aW9fb2JqLGJubyxsZW4sZixmaXJzdCx0b3QsbXZhbCxubWFwLGZsaXN0KQorI2RlZmluZSBYRlNfQk1BUF9FT0YobXAsIGlvLCBlbmRvZmYsIHdoaWNoZm9yaywgZW9mKSBcCisJKCoobXApLT5tX2lvX29wcy54ZnNfYm1hcF9lb2ZfZnVuYykgXAorCQkoKGlvKS0+aW9fb2JqLCBlbmRvZmYsIHdoaWNoZm9yaywgZW9mKQorI2RlZmluZSBYRlNfSU9NQVBfV1JJVEVfRElSRUNUKG1wLCBpbywgb2Zmc2V0LCBjb3VudCwgZmxhZ3MsIG12YWwsIG5tYXAsIGZvdW5kKVwKKwkoKihtcCktPm1faW9fb3BzLnhmc19pb21hcF93cml0ZV9kaXJlY3QpIFwKKwkJKChpbyktPmlvX29iaiwgb2Zmc2V0LCBjb3VudCwgZmxhZ3MsIG12YWwsIG5tYXAsIGZvdW5kKQorI2RlZmluZSBYRlNfSU9NQVBfV1JJVEVfREVMQVkobXAsIGlvLCBvZmZzZXQsIGNvdW50LCBmbGFncywgbXZhbCwgbm1hcCkgXAorCSgqKG1wKS0+bV9pb19vcHMueGZzX2lvbWFwX3dyaXRlX2RlbGF5KSBcCisJCSgoaW8pLT5pb19vYmosIG9mZnNldCwgY291bnQsIGZsYWdzLCBtdmFsLCBubWFwKQorI2RlZmluZSBYRlNfSU9NQVBfV1JJVEVfQUxMT0NBVEUobXAsIGlvLCBtdmFsLCBubWFwKSBcCisJKCoobXApLT5tX2lvX29wcy54ZnNfaW9tYXBfd3JpdGVfYWxsb2NhdGUpIFwKKwkJKChpbyktPmlvX29iaiwgbXZhbCwgbm1hcCkKKyNkZWZpbmUgWEZTX0lPTUFQX1dSSVRFX1VOV1JJVFRFTihtcCwgaW8sIG9mZnNldCwgY291bnQpIFwKKwkoKihtcCktPm1faW9fb3BzLnhmc19pb21hcF93cml0ZV91bndyaXR0ZW4pIFwKKwkJKChpbyktPmlvX29iaiwgb2Zmc2V0LCBjb3VudCkKKyNkZWZpbmUgWEZTX0xDS19NQVBfU0hBUkVEKG1wLCBpbykgXAorCSgqKG1wKS0+bV9pb19vcHMueGZzX2xja19tYXBfc2hhcmVkKSgoaW8pLT5pb19vYmopCisjZGVmaW5lIFhGU19JTE9DSyhtcCwgaW8sIG1vZGUpIFwKKwkoKihtcCktPm1faW9fb3BzLnhmc19pbG9jaykoKGlvKS0+aW9fb2JqLCBtb2RlKQorI2RlZmluZSBYRlNfSUxPQ0tfTk9XQUlUKG1wLCBpbywgbW9kZSkgXAorCSgqKG1wKS0+bV9pb19vcHMueGZzX2lsb2NrX25vd2FpdCkoKGlvKS0+aW9fb2JqLCBtb2RlKQorI2RlZmluZSBYRlNfSVVOTE9DSyhtcCwgaW8sIG1vZGUpIFwKKwkoKihtcCktPm1faW9fb3BzLnhmc191bmxvY2spKChpbyktPmlvX29iaiwgbW9kZSkKKyNkZWZpbmUgWEZTX0lMT0NLX0RFTU9URShtcCwgaW8sIG1vZGUpIFwKKwkoKihtcCktPm1faW9fb3BzLnhmc19pbG9ja19kZW1vdGUpKChpbyktPmlvX29iaiwgbW9kZSkKKyNkZWZpbmUgWEZTX1NJWkUobXAsIGlvKSBcCisJKCoobXApLT5tX2lvX29wcy54ZnNfc2l6ZV9mdW5jKSgoaW8pLT5pb19vYmopCisjZGVmaW5lIFhGU19JT0RPTkUodmZzcCkgXAorCSgqKG1wKS0+bV9pb19vcHMueGZzX2lvZG9uZSkodmZzcCkKKworCit0eXBlZGVmIHN0cnVjdCB4ZnNfbW91bnQgeworCWJodl9kZXNjX3QJCW1fYmh2OwkJLyogdmZzIHhmcyBiZWhhdmlvciAqLworCXhmc190aWRfdAkJbV90aWQ7CQkvKiBuZXh0IHVudXNlZCB0aWQgZm9yIGZzICovCisJQUlMX0xPQ0tfVAkJbV9haWxfbG9jazsJLyogZnMgQUlMIG11dGV4ICovCisJeGZzX2FpbF9lbnRyeV90CQltX2FpbDsJCS8qIGZzIGFjdGl2ZSBsb2cgaXRlbSBsaXN0ICovCisJdWludAkJCW1fYWlsX2dlbjsJLyogZnMgQUlMIGdlbmVyYXRpb24gY291bnQgKi8KKwl4ZnNfc2JfdAkJbV9zYjsJCS8qIGNvcHkgb2YgZnMgc3VwZXJibG9jayAqLworCWxvY2tfdAkJCW1fc2JfbG9jazsJLyogc2IgY291bnRlciBtdXRleCAqLworCXN0cnVjdCB4ZnNfYnVmCQkqbV9zYl9icDsJLyogYnVmZmVyIGZvciBzdXBlcmJsb2NrICovCisJY2hhcgkJCSptX2ZzbmFtZTsJLyogZmlsZXN5c3RlbSBuYW1lICovCisJaW50CQkJbV9mc25hbWVfbGVuOwkvKiBzdHJsZW4gb2YgZnMgbmFtZSAqLworCWludAkJCW1fYnNpemU7CS8qIGZzIGxvZ2ljYWwgYmxvY2sgc2l6ZSAqLworCXhmc19hZ251bWJlcl90CQltX2FnZnJvdG9yOwkvKiBsYXN0IGFnIHdoZXJlIHNwYWNlIGZvdW5kICovCisJeGZzX2FnbnVtYmVyX3QJCW1fYWdpcm90b3I7CS8qIGxhc3QgYWcgZGlyIGlub2RlIGFsbG9jZWQgKi8KKwlsb2NrX3QJCQltX2FnaXJvdG9yX2xvY2s7LyogLi4gYW5kIGxvY2sgcHJvdGVjdGluZyBpdCAqLworCXhmc19hZ251bWJlcl90CQltX21heGFnaTsJLyogaGlnaGVzdCBpbm9kZSBhbGxvYyBncm91cCAqLworCXVpbnQJCQltX2loc2l6ZTsJLyogc2l6ZSBvZiBuZXh0IGZpZWxkICovCisJc3RydWN0IHhmc19paGFzaAkqbV9paGFzaDsJLyogZnMgcHJpdmF0ZSBpbm9kZSBoYXNoIHRhYmxlKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSptX2lub2RlczsJLyogYWN0aXZlIGlub2RlIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCW1fZGVsX2lub2RlczsJLyogaW5vZGVzIHRvIHJlY2xhaW0gKi8KKwltdXRleF90CQkJbV9pbG9jazsJLyogaW5vZGUgbGlzdCBtdXRleCAqLworCXVpbnQJCQltX2lyZWNsYWltczsJLyogY291bnQgb2YgY2FsbHMgdG8gcmVjbGFpbSovCisJdWludAkJCW1fcmVhZGlvX2xvZzsJLyogbWluIHJlYWQgc2l6ZSBsb2cgYnl0ZXMgKi8KKwl1aW50CQkJbV9yZWFkaW9fYmxvY2tzOyAvKiBtaW4gcmVhZCBzaXplIGJsb2NrcyAqLworCXVpbnQJCQltX3dyaXRlaW9fbG9nOwkvKiBtaW4gd3JpdGUgc2l6ZSBsb2cgYnl0ZXMgKi8KKwl1aW50CQkJbV93cml0ZWlvX2Jsb2NrczsgLyogbWluIHdyaXRlIHNpemUgYmxvY2tzICovCisJc3RydWN0IGxvZwkJKm1fbG9nOwkJLyogbG9nIHNwZWNpZmljIHN0dWZmICovCisJaW50CQkJbV9sb2didWZzOwkvKiBudW1iZXIgb2YgbG9nIGJ1ZmZlcnMgKi8KKwlpbnQJCQltX2xvZ2JzaXplOwkvKiBzaXplIG9mIGVhY2ggbG9nIGJ1ZmZlciAqLworCXVpbnQJCQltX3JzdW1sZXZlbHM7CS8qIHJ0IHN1bW1hcnkgbGV2ZWxzICovCisJdWludAkJCW1fcnN1bXNpemU7CS8qIHNpemUgb2YgcnQgc3VtbWFyeSwgYnl0ZXMgKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSptX3JibWlwOwkvKiBwb2ludGVyIHRvIGJpdG1hcCBpbm9kZSAqLworCXN0cnVjdCB4ZnNfaW5vZGUJKm1fcnN1bWlwOwkvKiBwb2ludGVyIHRvIHN1bW1hcnkgaW5vZGUgKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSptX3Jvb3RpcDsJLyogcG9pbnRlciB0byByb290IGRpcmVjdG9yeSAqLworCXN0cnVjdCB4ZnNfcXVvdGFpbmZvCSptX3F1b3RhaW5mbzsJLyogZGlzayBxdW90YSBpbmZvcm1hdGlvbiAqLworCXhmc19idWZ0YXJnX3QJCSptX2RkZXZfdGFyZ3A7CS8qIHNhdmVzIHRha2luZyB0aGUgYWRkcmVzcyAqLworCXhmc19idWZ0YXJnX3QJCSptX2xvZ2Rldl90YXJncDsvKiBwdHIgdG8gbG9nIGRldmljZSAqLworCXhmc19idWZ0YXJnX3QJCSptX3J0ZGV2X3RhcmdwOwkvKiBwdHIgdG8gcnQgZGV2aWNlICovCisjZGVmaW5lIG1fZGV2CQltX2RkZXZfdGFyZ3AtPnBicl9kZXYKKwlfX3VpbnQ4X3QJCW1fZGlyY29va19lbG9nOwkvKiBsb2cgZC1jb29raWUgZW50cnkgYml0cyAqLworCV9fdWludDhfdAkJbV9ibGtiaXRfbG9nOwkvKiBibG9ja2xvZyArIE5CQlkgKi8KKwlfX3VpbnQ4X3QJCW1fYmxrYmJfbG9nOwkvKiBibG9ja2xvZyAtIEJCU0hJRlQgKi8KKwlfX3VpbnQ4X3QJCW1fYWdub19sb2c7CS8qIGxvZyAjYWcncyAqLworCV9fdWludDhfdAkJbV9hZ2lub19sb2c7CS8qICNiaXRzIGZvciBhZ2lubyBpbiBpbnVtICovCisJX191aW50OF90CQltX25yZWFkYWhlYWRzOwkvKiAjcmVhZGFoZWFkIGJ1ZmZlcnMgKi8KKwlfX3VpbnQxNl90CQltX2lub2RlX2NsdXN0ZXJfc2l6ZTsvKiBtaW4gaW5vZGUgYnVmIHNpemUgKi8KKwl1aW50CQkJbV9ibG9ja21hc2s7CS8qIHNiX2Jsb2Nrc2l6ZS0xICovCisJdWludAkJCW1fYmxvY2t3c2l6ZTsJLyogc2JfYmxvY2tzaXplIGluIHdvcmRzICovCisJdWludAkJCW1fYmxvY2t3bWFzazsJLyogYmxvY2t3c2l6ZS0xICovCisJdWludAkJCW1fYWxsb2NfbXhyWzJdOwkvKiBYRlNfQUxMT0NfQkxPQ0tfTUFYUkVDUyAqLworCXVpbnQJCQltX2FsbG9jX21uclsyXTsJLyogWEZTX0FMTE9DX0JMT0NLX01JTlJFQ1MgKi8KKwl1aW50CQkJbV9ibWFwX2RteHJbMl07CS8qIFhGU19CTUFQX0JMT0NLX0RNQVhSRUNTICovCisJdWludAkJCW1fYm1hcF9kbW5yWzJdOwkvKiBYRlNfQk1BUF9CTE9DS19ETUlOUkVDUyAqLworCXVpbnQJCQltX2lub2J0X214clsyXTsJLyogWEZTX0lOT0JUX0JMT0NLX01BWFJFQ1MgKi8KKwl1aW50CQkJbV9pbm9idF9tbnJbMl07CS8qIFhGU19JTk9CVF9CTE9DS19NSU5SRUNTICovCisJdWludAkJCW1fYWdfbWF4bGV2ZWxzOwkvKiBYRlNfQUdfTUFYTEVWRUxTICovCisJdWludAkJCW1fYm1fbWF4bGV2ZWxzWzJdOyAvKiBYRlNfQk1fTUFYTEVWRUxTICovCisJdWludAkJCW1faW5fbWF4bGV2ZWxzOwkvKiBYRlNfSU5fTUFYTEVWRUxTICovCisJc3RydWN0IHhmc19wZXJhZwkqbV9wZXJhZzsJLyogcGVyLWFnIGFjY291bnRpbmcgaW5mbyAqLworCXN0cnVjdCByd19zZW1hcGhvcmUJbV9wZXJhZ2xvY2s7CS8qIGxvY2sgZm9yIG1fcGVyYWcgKHBvaW50ZXIpICovCisJc2VtYV90CQkJbV9ncm93bG9jazsJLyogZ3Jvd2ZzIG11dGV4ICovCisJaW50CQkJbV9maXhlZGZzaWRbMl07CS8qIHVuY2hhbmdlZCBmb3IgbGlmZSBvZiBGUyAqLworCXVpbnQJCQltX2RtZXZtYXNrOwkvKiBETUkgZXZlbnRzIGZvciB0aGlzIEZTICovCisJdWludAkJCW1fZmxhZ3M7CS8qIGdsb2JhbCBtb3VudCBmbGFncyAqLworCXVpbnQJCQltX2F0dHJvZmZzZXQ7CS8qIGlub2RlIGF0dHJpYnV0ZSBvZmZzZXQgKi8KKwl1aW50CQkJbV9kaXJfbm9kZV9lbnRzOyAvKiAjZW50cmllcyBpbiBhIGRpciBkYW5vZGUgKi8KKwl1aW50CQkJbV9hdHRyX25vZGVfZW50czsgLyogI2VudHJpZXMgaW4gYXR0ciBkYW5vZGUgKi8KKwlpbnQJCQltX2lhbGxvY19pbm9zOwkvKiBpbm9kZXMgaW4gaW5vZGUgYWxsb2NhdGlvbiAqLworCWludAkJCW1faWFsbG9jX2Jsa3M7CS8qIGJsb2NrcyBpbiBpbm9kZSBhbGxvY2F0aW9uICovCisJaW50CQkJbV9saXRpbm87CS8qIHNpemUgb2YgaW5vZGUgdW5pb24gYXJlYSAqLworCWludAkJCW1faW5vYWxpZ25fbWFzazsvKiBtYXNrIHNiX2lub2FsaWdubXQgaWYgdXNlZCAqLworCXVpbnQJCQltX3FmbGFnczsJLyogcXVvdGEgc3RhdHVzIGZsYWdzICovCisJeGZzX3RyYW5zX3Jlc2VydmF0aW9uc190IG1fcmVzZXJ2YXRpb25zOy8qIHByZWNvbXB1dGVkIHJlcyB2YWx1ZXMgKi8KKwlfX3VpbnQ2NF90CQltX21heGljb3VudDsJLyogbWF4aW11bSBpbm9kZSBjb3VudCAqLworCV9fdWludDY0X3QJCW1fbWF4aW9mZnNldDsJLyogbWF4aW11bSBpbm9kZSBvZmZzZXQgKi8KKwlfX3VpbnQ2NF90CQltX3Jlc2Jsa3M7CS8qIHRvdGFsIHJlc2VydmVkIGJsb2NrcyAqLworCV9fdWludDY0X3QJCW1fcmVzYmxrc19hdmFpbDsvKiBhdmFpbGFibGUgcmVzZXJ2ZWQgYmxvY2tzICovCisjaWYgWEZTX0JJR19JTlVNUworCXhmc19pbm9fdAkJbV9pbm9hZGQ7CS8qIGFkZCB2YWx1ZSBmb3IgaW5vNjRfb2Zmc2V0ICovCisjZW5kaWYKKwlpbnQJCQltX2RhbGlnbjsJLyogc3RyaXBlIHVuaXQgKi8KKwlpbnQJCQltX3N3aWR0aDsJLyogc3RyaXBlIHdpZHRoICovCisJaW50CQkJbV9zaW5vYWxpZ247CS8qIHN0cmlwZSB1bml0IGlub2RlIGFsaWdubW50ICovCisJaW50CQkJbV9hdHRyX21hZ2ljcGN0Oy8qIDM3JSBvZiB0aGUgYmxvY2tzaXplICovCisJaW50CQkJbV9kaXJfbWFnaWNwY3Q7CS8qIDM3JSBvZiB0aGUgZGlyIGJsb2Nrc2l6ZSAqLworCV9fdWludDhfdAkJbV9ta19zaGFyZWRybzsJLyogbWFyayBzaGFyZWQgcm8gb24gdW5tb3VudCAqLworCV9fdWludDhfdAkJbV9pbm9kZV9xdWllc2NlOy8qIGNhbGwgcXVpZXNjZSBvbiBuZXcgaW5vZGVzLgorCQkJCQkJICAgZmllbGQgZ292ZXJuZWQgYnkgbV9pbG9jayAqLworCV9fdWludDhfdAkJbV9zZWN0YmJfbG9nOwkvKiBzZWN0bG9nIC0gQkJTSElGVCAqLworCV9fdWludDhfdAkJbV9kaXJ2ZXJzaW9uOwkvKiAxIG9yIDIgKi8KKwl4ZnNfZGlyb3BzX3QJCW1fZGlyb3BzOwkvKiB0YWJsZSBvZiBkaXIgZnVuY3MgKi8KKwlpbnQJCQltX2RpcmJsa3NpemU7CS8qIGRpcmVjdG9yeSBibG9jayBzei0tYnl0ZXMgKi8KKwlpbnQJCQltX2RpcmJsa2ZzYnM7CS8qIGRpcmVjdG9yeSBibG9jayBzei0tZnNicyAqLworCXhmc19kYWJsa190CQltX2RpcmRhdGFibGs7CS8qIGJsb2Nrbm8gb2YgZGlyIGRhdGEgdjIgKi8KKwl4ZnNfZGFibGtfdAkJbV9kaXJsZWFmYmxrOwkvKiBibG9ja25vIG9mIGRpciBub24tZGF0YSB2MiAqLworCXhmc19kYWJsa190CQltX2RpcmZyZWVibGs7CS8qIGJsb2Nrbm8gb2YgZGlyZnJlZWluZGV4IHYyICovCisJdWludAkJCW1fY2hzaXplOwkvKiBzaXplIG9mIG5leHQgZmllbGQgKi8KKwlzdHJ1Y3QgeGZzX2NoYXNoCSptX2NoYXNoOwkvKiBmcyBwcml2YXRlIGlub2RlIHBlci1jbHVzdGVyCisJCQkJCQkgKiBoYXNoIHRhYmxlICovCisJc3RydWN0IHhmc19kbW9wcwltX2RtX29wczsJLyogdmVjdG9yIG9mIERNSSBvcHMgKi8KKwlzdHJ1Y3QgeGZzX3Ftb3BzCW1fcW1fb3BzOwkvKiB2ZWN0b3Igb2YgWFFNIG9wcyAqLworCXN0cnVjdCB4ZnNfaW9vcHMJbV9pb19vcHM7CS8qIHZlY3RvciBvZiBJL08gb3BzICovCisJYXRvbWljX3QJCW1fYWN0aXZlX3RyYW5zOwkvKiBudW1iZXIgdHJhbnMgZnJvemVuICovCit9IHhmc19tb3VudF90OworCisvKgorICogRmxhZ3MgZm9yIG1fZmxhZ3MuCisgKi8KKyNkZWZpbmUJWEZTX01PVU5UX1dTWU5DCQkweDAwMDAwMDAxCS8qIGZvciBuZnMgLSBhbGwgbWV0YWRhdGEgb3BzCisJCQkJCQkgICBtdXN0IGJlIHN5bmNocm9ub3VzIGV4Y2VwdAorCQkJCQkJICAgZm9yIHNwYWNlIGFsbG9jYXRpb25zICovCisjZGVmaW5lCVhGU19NT1VOVF9JTk82NAkJMHgwMDAwMDAwMgorCQkJICAgICAvKiAweDAwMDAwMDA0CS0tIGN1cnJlbnRseSB1bnVzZWQgKi8KKwkJCSAgICAgLyogMHgwMDAwMDAwOAktLSBjdXJyZW50bHkgdW51c2VkICovCisjZGVmaW5lIFhGU19NT1VOVF9GU19TSFVURE9XTgkweDAwMDAwMDEwCS8qIGF0b21pYyBzdG9wIG9mIGFsbCBmaWxlc3lzdGVtCisJCQkJCQkgICBvcGVyYXRpb25zLCB0eXBpY2FsbHkgZm9yCisJCQkJCQkgICBkaXNrIGVycm9ycyBpbiBtZXRhZGF0YSAqLworI2RlZmluZSBYRlNfTU9VTlRfTk9BVElNRQkweDAwMDAwMDIwCS8qIGRvbid0IG1vZGlmeSBpbm9kZSBhY2Nlc3MKKwkJCQkJCSAgIHRpbWVzIG9uIHJlYWRzICovCisjZGVmaW5lIFhGU19NT1VOVF9SRVRFUlIJMHgwMDAwMDA0MCAgICAgIC8qIHJldHVybiBhbGlnbm1lbnQgZXJyb3JzIHRvCisJCQkJCQkgICB1c2VyICovCisjZGVmaW5lIFhGU19NT1VOVF9OT0FMSUdOCTB4MDAwMDAwODAJLyogdHVybiBvZmYgc3RyaXBlIGFsaWdubWVudAorCQkJCQkJICAgYWxsb2NhdGlvbnMgKi8KKwkJCSAgICAgLyogMHgwMDAwMDEwMAktLSBjdXJyZW50bHkgdW51c2VkICovCisJCQkgICAgIC8qCTB4MDAwMDAyMDAJLS0gY3VycmVudGx5IHVudXNlZCAqLworI2RlZmluZSBYRlNfTU9VTlRfTk9SRUNPVkVSWQkweDAwMDAwNDAwCS8qIG5vIHJlY292ZXJ5IC0gZGlydHkgZnMgKi8KKyNkZWZpbmUgWEZTX01PVU5UX1NIQVJFRAkweDAwMDAwODAwCS8qIHNoYXJlZCBtb3VudCAqLworI2RlZmluZSBYRlNfTU9VTlRfREZMVF9JT1NJWkUJMHgwMDAwMTAwMAkvKiBzZXQgZGVmYXVsdCBpL28gc2l6ZSAqLworI2RlZmluZSBYRlNfTU9VTlRfT1NZTkNJU09TWU5DCTB4MDAwMDIwMDAJLyogb19zeW5jIGlzIFJFQUxMWSBvX3N5bmMgKi8KKwkJCQkJCS8qIG9zeW5jaXNkc3luYyBpcyBub3cgZGVmYXVsdCovCisjZGVmaW5lIFhGU19NT1VOVF8zMkJJVElOT0RFUwkweDAwMDA0MDAwCS8qIGRvIG5vdCBjcmVhdGUgaW5vZGVzIGFib3ZlCisJCQkJCQkgKiAzMiBiaXRzIGluIHNpemUgKi8KKyNkZWZpbmUgWEZTX01PVU5UXzMyQklUSU5PT1BUCTB4MDAwMDgwMDAJLyogc2F2ZWQgbW91bnQgb3B0aW9uIHN0YXRlICovCisjZGVmaW5lIFhGU19NT1VOVF9OT1VVSUQJMHgwMDAxMDAwMAkvKiBpZ25vcmUgdXVpZCBkdXJpbmcgbW91bnQgKi8KKyNkZWZpbmUgWEZTX01PVU5UX05PTE9HRkxVU0gJMHgwMDAyMDAwMAorI2RlZmluZSBYRlNfTU9VTlRfSURFTEVURQkweDAwMDQwMDAwCS8qIGRlbGV0ZSBlbXB0eSBpbm9kZSBjbHVzdGVycyovCisjZGVmaW5lIFhGU19NT1VOVF9TV0FMTE9DCTB4MDAwODAwMDAJLyogdHVybiBvbiBzdHJpcGUgd2lkdGgKKwkJCQkJCSAqIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgWEZTX01PVU5UX0lIQVNIU0laRQkweDAwMTAwMDAwCS8qIGlub2RlIGhhc2ggdGFibGUgc2l6ZSAqLworI2RlZmluZSBYRlNfTU9VTlRfRElSU1lOQwkweDAwMjAwMDAwCS8qIHN5bmNocm9ub3VzIGRpcmVjdG9yeSBvcHMgKi8KKworLyoKKyAqIERlZmF1bHQgbWluaW11bSByZWFkIGFuZCB3cml0ZSBzaXplcy4KKyAqLworI2RlZmluZSBYRlNfUkVBRElPX0xPR19MQVJHRQkxNgorI2RlZmluZSBYRlNfV1JJVEVJT19MT0dfTEFSR0UJMTYKKworLyoKKyAqIE1heCBhbmQgbWluIHZhbHVlcyBmb3IgVUlPIGFuZCBtb3VudC1vcHRpb24gZGVmaW5lZCBJL08gc2l6ZXM7CisgKiBtaW4gdmFsdWUgY2FuJ3QgYmUgbGVzcyB0aGFuIGEgcGFnZS4gIEN1cnJlbnRseSB1bnVzZWQuCisgKi8KKyNkZWZpbmUgWEZTX01BWF9JT19MT0cJCTE2CS8qIDY0SyAqLworI2RlZmluZSBYRlNfTUlOX0lPX0xPRwkJUEFHRV9TSElGVAorCisvKgorICogU3luY2hyb25vdXMgcmVhZCBhbmQgd3JpdGUgc2l6ZXMuICBUaGlzIHNob3VsZCBiZQorICogYmV0dGVyIGZvciBORlN2MiB3c3luYyBmaWxlc3lzdGVtcy4KKyAqLworI2RlZmluZQlYRlNfV1NZTkNfUkVBRElPX0xPRwkxNQkvKiAzMksgKi8KKyNkZWZpbmUJWEZTX1dTWU5DX1dSSVRFSU9fTE9HCTE0CS8qIDE2SyAqLworCisjZGVmaW5lIFhGU19NQVhJT0ZGU0VUKG1wKQkoKG1wKS0+bV9tYXhpb2Zmc2V0KQorCisjZGVmaW5lIFhGU19GT1JDRURfU0hVVERPV04obXApCSgobXApLT5tX2ZsYWdzICYgWEZTX01PVU5UX0ZTX1NIVVRET1dOKQorI2RlZmluZSB4ZnNfZm9yY2Vfc2h1dGRvd24obSxmKQlcCisJVkZTX0ZPUkNFX1NIVVRET1dOKChYRlNfTVRPVkZTKG0pKSwgZiwgX19GSUxFX18sIF9fTElORV9fKQorCisvKgorICogRmxhZ3Mgc2VudCB0byB4ZnNfZm9yY2Vfc2h1dGRvd24uCisgKi8KKyNkZWZpbmUgWEZTX01FVEFEQVRBX0lPX0VSUk9SCTB4MQorI2RlZmluZSBYRlNfTE9HX0lPX0VSUk9SCTB4MgorI2RlZmluZSBYRlNfRk9SQ0VfVU1PVU5UCTB4NAorI2RlZmluZSBYRlNfQ09SUlVQVF9JTkNPUkUJMHg4CS8qIENvcnJ1cHQgaW4tbWVtb3J5IGRhdGEgc3RydWN0dXJlcyAqLworI2RlZmluZSBYRlNfU0hVVERPV05fUkVNT1RFX1JFUSAweDEwCS8qIFNodXRkb3duIGNhbWUgZnJvbSByZW1vdGUgY2VsbCAqLworCisvKgorICogeGZsYWdzIGZvciB4ZnNfc3luY3N1YgorICovCisjZGVmaW5lIFhGU19YU1lOQ19SRUxPQwkJMHgwMQorCisvKgorICogRmxhZ3MgZm9yIHhmc19tb3VudGZzCisgKi8KKyNkZWZpbmUgWEZTX01GU0lfU0VDT05ECQkweDAxCS8qIFNlY29uZGFyeSBtb3VudCAtLSBza2lwIHN0dWZmICovCisjZGVmaW5lIFhGU19NRlNJX0NMSUVOVAkJMHgwMgkvKiBJcyBhIGNsaWVudCAtLSBza2lwIGxvdHMgb2Ygc3R1ZmYgKi8KKyNkZWZpbmUgWEZTX01GU0lfTk9VTkxJTksJMHgwOAkvKiBTa2lwIHVubGlua2VkIGlub2RlIHByb2Nlc3NpbmcgaW4gKi8KKwkJCQkJLyogbG9nIHJlY292ZXJ5ICovCisjZGVmaW5lIFhGU19NRlNJX05PX1FVT1RBQ0hFQ0sJMHgxMAkvKiBTa2lwIHF1b3RhY2hlY2sgcHJvY2Vzc2luZyAqLworCisvKgorICogTWFjcm9zIGZvciBnZXR0aW5nIGZyb20gbW91bnQgdG8gdmZzIGFuZCBiYWNrLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19NVE9WRlMpCitzdHJ1Y3QgdmZzICp4ZnNfbXRvdmZzKHhmc19tb3VudF90ICptcCk7CisjZGVmaW5lCVhGU19NVE9WRlMobXApCQl4ZnNfbXRvdmZzKG1wKQorI2Vsc2UKKyNkZWZpbmUJWEZTX01UT1ZGUyhtcCkJCShiaHZ0b3ZmcygmKG1wKS0+bV9iaHYpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CSFZUT00pCit4ZnNfbW91bnRfdCAqeGZzX2JodnRvbShiaHZfZGVzY190ICpiZHApOworI2RlZmluZQlYRlNfQkhWVE9NKGJkcCkJeGZzX2JodnRvbShiZHApCisjZWxzZQorI2RlZmluZSBYRlNfQkhWVE9NKGJkcCkJCSgoeGZzX21vdW50X3QgKilCSFZfUERBVEEoYmRwKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfVkZTVE9NKQoreGZzX21vdW50X3QgKnhmc192ZnN0b20odmZzX3QgKnZmcyk7CisjZGVmaW5lIFhGU19WRlNUT00odmZzKSB4ZnNfdmZzdG9tKHZmcykKKyNlbHNlCisjZGVmaW5lIFhGU19WRlNUT00odmZzKQkJXAorCShYRlNfQkhWVE9NKGJodl9sb29rdXAoVkZTX0JIVkhFQUQodmZzKSwgJnhmc192ZnNvcHMpKSkKKyNlbmRpZgorCisKKy8qCisgKiBNb3ZlZCBoZXJlIGZyb20geGZzX2FnLmggdG8gYXZvaWQgcmVvcmRlcmluZyBoZWFkZXIgZmlsZXMKKyAqLworCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19EQUREUl9UT19BR05PKQoreGZzX2FnbnVtYmVyX3QgeGZzX2RhZGRyX3RvX2Fnbm8oc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kYWRkcl90IGQpOworI2RlZmluZSBYRlNfREFERFJfVE9fQUdOTyhtcCxkKSAgICAgICAgIHhmc19kYWRkcl90b19hZ25vKG1wLGQpCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHhmc19hZ251bWJlcl90IFhGU19EQUREUl9UT19BR05PKHhmc19tb3VudF90ICptcCwgeGZzX2RhZGRyX3QgZCkKK3sKKwlkID0gWEZTX0JCX1RPX0ZTQlQobXAsIGQpOworCWRvX2RpdihkLCBtcC0+bV9zYi5zYl9hZ2Jsb2Nrcyk7CisJcmV0dXJuICh4ZnNfYWdudW1iZXJfdCkgZDsKK30KKworI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19EQUREUl9UT19BR0JOTykKK3hmc19hZ2Jsb2NrX3QgeGZzX2RhZGRyX3RvX2FnYm5vKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGFkZHJfdCBkKTsKKyNkZWZpbmUgWEZTX0RBRERSX1RPX0FHQk5PKG1wLGQpICAgICAgICB4ZnNfZGFkZHJfdG9fYWdibm8obXAsZCkKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgeGZzX2FnYmxvY2tfdCBYRlNfREFERFJfVE9fQUdCTk8oeGZzX21vdW50X3QgKm1wLCB4ZnNfZGFkZHJfdCBkKQoreworCWQgPSBYRlNfQkJfVE9fRlNCVChtcCwgZCk7CisJcmV0dXJuICh4ZnNfYWdibG9ja190KSBkb19kaXYoZCwgbXAtPm1fc2Iuc2JfYWdibG9ja3MpOworfQorCisjZW5kaWYKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIGZvciB1c2UgYnkgdGhlIHhmc19tb2RfaW5jb3JlX3NiX2JhdGNoKCkgcm91dGluZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX21vZF9zYiB7CisJeGZzX3NiX2ZpZWxkX3QJbXNiX2ZpZWxkOwkvKiBGaWVsZCB0byBtb2RpZnksIHNlZSBiZWxvdyAqLworCWludAkJbXNiX2RlbHRhOwkvKiBDaGFuZ2UgdG8gbWFrZSB0byBzcGVjaWZpZWQgZmllbGQgKi8KK30geGZzX21vZF9zYl90OworCisjZGVmaW5lCVhGU19NT1VOVF9JTE9DSyhtcCkJbXV0ZXhfbG9jaygmKChtcCktPm1faWxvY2spLCBQSU5PRCkKKyNkZWZpbmUJWEZTX01PVU5UX0lVTkxPQ0sobXApCW11dGV4X3VubG9jaygmKChtcCktPm1faWxvY2spKQorI2RlZmluZQlYRlNfU0JfTE9DSyhtcCkJCW11dGV4X3NwaW5sb2NrKCYobXApLT5tX3NiX2xvY2spCisjZGVmaW5lCVhGU19TQl9VTkxPQ0sobXAscykJbXV0ZXhfc3BpbnVubG9jaygmKG1wKS0+bV9zYl9sb2NrLChzKSkKKworZXh0ZXJuIHhmc19tb3VudF90ICp4ZnNfbW91bnRfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkCXhmc19tb2Rfc2IoeGZzX3RyYW5zX3QgKiwgX19pbnQ2NF90KTsKK2V4dGVybiB2b2lkCXhmc19tb3VudF9mcmVlKHhmc19tb3VudF90ICptcCwgaW50IHJlbW92ZV9iaHYpOworZXh0ZXJuIGludAl4ZnNfbW91bnRmcyhzdHJ1Y3QgdmZzICosIHhmc19tb3VudF90ICptcCwgaW50KTsKKworZXh0ZXJuIGludAl4ZnNfdW5tb3VudGZzKHhmc19tb3VudF90ICosIHN0cnVjdCBjcmVkICopOworZXh0ZXJuIHZvaWQJeGZzX3VubW91bnRmc193YWl0KHhmc19tb3VudF90ICopOworZXh0ZXJuIHZvaWQJeGZzX3VubW91bnRmc19jbG9zZSh4ZnNfbW91bnRfdCAqLCBzdHJ1Y3QgY3JlZCAqKTsKK2V4dGVybiBpbnQJeGZzX3VubW91bnRmc193cml0ZXNiKHhmc19tb3VudF90ICopOworZXh0ZXJuIGludAl4ZnNfdW5tb3VudF9mbHVzaCh4ZnNfbW91bnRfdCAqLCBpbnQpOworZXh0ZXJuIGludAl4ZnNfbW9kX2luY29yZV9zYih4ZnNfbW91bnRfdCAqLCB4ZnNfc2JfZmllbGRfdCwgaW50LCBpbnQpOworZXh0ZXJuIGludAl4ZnNfbW9kX2luY29yZV9zYl9iYXRjaCh4ZnNfbW91bnRfdCAqLCB4ZnNfbW9kX3NiX3QgKiwKKwkJCXVpbnQsIGludCk7CitleHRlcm4gc3RydWN0IHhmc19idWYgKnhmc19nZXRzYih4ZnNfbW91bnRfdCAqLCBpbnQpOworZXh0ZXJuIGludAl4ZnNfcmVhZHNiKHhmc19tb3VudF90ICptcCk7CitleHRlcm4gdm9pZAl4ZnNfZnJlZXNiKHhmc19tb3VudF90ICopOworZXh0ZXJuIHZvaWQJeGZzX2RvX2ZvcmNlX3NodXRkb3duKGJodl9kZXNjX3QgKiwgaW50LCBjaGFyICosIGludCk7CitleHRlcm4gaW50CXhmc19zeW5jc3ViKHhmc19tb3VudF90ICosIGludCwgaW50LCBpbnQgKik7CitleHRlcm4geGZzX2FnbnVtYmVyX3QJeGZzX2luaXRpYWxpemVfcGVyYWcoeGZzX21vdW50X3QgKiwgeGZzX2FnbnVtYmVyX3QpOworZXh0ZXJuIHZvaWQJeGZzX3hsYXRlc2Iodm9pZCAqLCBzdHJ1Y3QgeGZzX3NiICosIGludCwgX19pbnQ2NF90KTsKKworZXh0ZXJuIHN0cnVjdCB2ZnNvcHMgeGZzX3Zmc29wczsKK2V4dGVybiBzdHJ1Y3Qgdm5vZGVvcHMgeGZzX3Zub2Rlb3BzOworCitleHRlcm4gc3RydWN0IHhmc19kbW9wcyB4ZnNfZG1jb3JlX3N0dWI7CitleHRlcm4gc3RydWN0IHhmc19xbW9wcyB4ZnNfcW1jb3JlX3N0dWI7CitleHRlcm4gc3RydWN0IHhmc19pb29wcyB4ZnNfaW9jb3JlX3hmczsKKworZXh0ZXJuIGludAl4ZnNfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkCXhmc19jbGVhbnVwKHZvaWQpOworCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisjZW5kaWYJLyogX19YRlNfTU9VTlRfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3Ftb3BzLmMgYi9mcy94ZnMveGZzX3Ftb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0MGM5MgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfcW1vcHMuYwpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLgkgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2luY2x1ZGUgInhmcy5oIgorCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorCisKK1NUQVRJQyBzdHJ1Y3QgeGZzX2RxdW90ICoKK3hmc19kcXZvcGNob3duX2RlZmF1bHQoCisJc3RydWN0IHhmc190cmFucwkqdHAsCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCisJc3RydWN0IHhmc19kcXVvdAkqKmRxcCwKKwlzdHJ1Y3QgeGZzX2RxdW90CSpkcSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworeGZzX3Ftb3BzX3QJeGZzX3FtY29yZV9zdHViID0geworCS54ZnNfcW1pbml0CQk9ICh4ZnNfcW1pbml0X3QpIGZzX25vZXJyLAorCS54ZnNfcW1kb25lCQk9ICh4ZnNfcW1kb25lX3QpIGZzX25vZXJyLAorCS54ZnNfcW1tb3VudAkJPSAoeGZzX3FtbW91bnRfdCkgZnNfbm9lcnIsCisJLnhmc19xbXVubW91bnQJCT0gKHhmc19xbXVubW91bnRfdCkgZnNfbm9lcnIsCisJLnhmc19kcXJlbGUJCT0gKHhmc19kcXJlbGVfdCkgZnNfbm9lcnIsCisJLnhmc19kcWF0dGFjaAkJPSAoeGZzX2RxYXR0YWNoX3QpIGZzX25vZXJyLAorCS54ZnNfZHFkZXRhY2gJCT0gKHhmc19kcWRldGFjaF90KSBmc19ub2VyciwKKwkueGZzX2RxcHVyZ2VhbGwJCT0gKHhmc19kcXB1cmdlYWxsX3QpIGZzX25vZXJyLAorCS54ZnNfZHF2b3BhbGxvYwkJPSAoeGZzX2Rxdm9wYWxsb2NfdCkgZnNfbm9lcnIsCisJLnhmc19kcXZvcGNyZWF0ZQk9ICh4ZnNfZHF2b3BjcmVhdGVfdCkgZnNfbm9lcnIsCisJLnhmc19kcXZvcHJlbmFtZQk9ICh4ZnNfZHF2b3ByZW5hbWVfdCkgZnNfbm9lcnIsCisJLnhmc19kcXZvcGNob3duCQk9IHhmc19kcXZvcGNob3duX2RlZmF1bHQsCisJLnhmc19kcXZvcGNob3ducmVzdgk9ICh4ZnNfZHF2b3BjaG93bnJlc3ZfdCkgZnNfbm9lcnIsCit9OwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19xdW90YS5oIGIvZnMveGZzL3hmc19xdW90YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwM2VjNGUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX3F1b3RhLmgKQEAgLTAsMCArMSwzNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX1FVT1RBX0hfXworI2RlZmluZSBfX1hGU19RVU9UQV9IX18KKworLyoKKyAqIFRoZSBvbmRpc2sgZm9ybSBvZiBhIGRxdW90IHN0cnVjdHVyZS4KKyAqLworI2RlZmluZSBYRlNfRFFVT1RfTUFHSUMJCTB4NDQ1MQkJLyogJ0RRJyAqLworI2RlZmluZSBYRlNfRFFVT1RfVkVSU0lPTgkodV9pbnQ4X3QpMHgwMQkvKiBsYXRlc3QgdmVyc2lvbiBudW1iZXIgKi8KKworLyoKKyAqIHVpZF90IGFuZCBnaWRfdCBhcmUgaGFyZC1jb2RlZCB0byAzMiBiaXRzIGluIHRoZSBpbm9kZS4KKyAqIEhlbmNlLCBhbiAnaWQnIGluIGEgZHF1b3QgaXMgMzIgYml0cy4uCisgKi8KK3R5cGVkZWYgX19pbnQzMl90CXhmc19kcWlkX3Q7CisKKy8qCisgKiBFdmVudGhvdWdoIHVzZXJzIG1heSBub3QgaGF2ZSBxdW90YSBsaW1pdHMgb2NjdXB5aW5nIGFsbCA2NC1iaXRzLAorICogdGhleSBtYXkgbmVlZCA2NC1iaXQgYWNjb3VudGluZy4gSGVuY2UsIDY0LWJpdCBxdW90YS1jb3VudGVycywKKyAqIGFuZCBxdW90YS1saW1pdHMuIFRoaXMgaXMgYSB3YXN0ZSBpbiB0aGUgY29tbW9uIGNhc2UsIGJ1dCBoZXkgLi4uCisgKi8KK3R5cGVkZWYgX191aW50NjRfdAl4ZnNfcWNudF90OwordHlwZWRlZiBfX3VpbnQxNl90CXhmc19xd2FybmNudF90OworCisvKgorICogVGhpcyBpcyB0aGUgbWFpbiBwb3J0aW9uIG9mIHRoZSBvbi1kaXNrIHJlcHJlc2VudGF0aW9uIG9mIHF1b3RhCisgKiBpbmZvcm1hdGlvbiBmb3IgYSB1c2VyLiBUaGlzIGlzIHRoZSBxX2NvcmUgb2YgdGhlIHhmc19kcXVvdF90IHRoYXQKKyAqIGlzIGtlcHQgaW4ga2VybmVsIG1lbW9yeS4gV2UgcGFkIHRoaXMgd2l0aCBzb21lIG1vcmUgZXhwYW5zaW9uIHJvb20KKyAqIHRvIGNvbnN0cnVjdCB0aGUgb24gZGlzayBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0CXhmc19kaXNrX2RxdW90IHsKKy8qMTYqLwl1X2ludDE2X3QJZF9tYWdpYzsJLyogZHF1b3QgbWFnaWMgPSBYRlNfRFFVT1RfTUFHSUMgKi8KKy8qOCAqLwl1X2ludDhfdAlkX3ZlcnNpb247CS8qIGRxdW90IHZlcnNpb24gKi8KKy8qOCAqLwl1X2ludDhfdAlkX2ZsYWdzOwkvKiBYRlNfRFFfVVNFUi9QUk9KL0dST1VQICovCisvKjMyKi8JeGZzX2RxaWRfdAlkX2lkOwkJLyogdXNlcixwcm9qZWN0LGdyb3VwIGlkICovCisvKjY0Ki8JeGZzX3FjbnRfdAlkX2Jsa19oYXJkbGltaXQ7LyogYWJzb2x1dGUgbGltaXQgb24gZGlzayBibGtzICovCisvKjY0Ki8JeGZzX3FjbnRfdAlkX2Jsa19zb2Z0bGltaXQ7LyogcHJlZmVycmVkIGxpbWl0IG9uIGRpc2sgYmxrcyAqLworLyo2NCovCXhmc19xY250X3QJZF9pbm9faGFyZGxpbWl0Oy8qIG1heGltdW0gIyBhbGxvY2F0ZWQgaW5vZGVzICovCisvKjY0Ki8JeGZzX3FjbnRfdAlkX2lub19zb2Z0bGltaXQ7LyogcHJlZmVycmVkIGlub2RlIGxpbWl0ICovCisvKjY0Ki8JeGZzX3FjbnRfdAlkX2Jjb3VudDsJLyogZGlzayBibG9ja3Mgb3duZWQgYnkgdGhlIHVzZXIgKi8KKy8qNjQqLwl4ZnNfcWNudF90CWRfaWNvdW50OwkvKiBpbm9kZXMgb3duZWQgYnkgdGhlIHVzZXIgKi8KKy8qMzIqLwlfX2ludDMyX3QJZF9pdGltZXI7CS8qIHplcm8gaWYgd2l0aGluIGlub2RlIGxpbWl0cyBpZiBub3QsCisJCQkJCSAgIHRoaXMgaXMgd2hlbiB3ZSByZWZ1c2Ugc2VydmljZSAqLworLyozMiovCV9faW50MzJfdAlkX2J0aW1lcjsJLyogc2ltaWxhciB0byBhYm92ZTsgZm9yIGRpc2sgYmxvY2tzICovCisvKjE2Ki8JeGZzX3F3YXJuY250X3QJZF9pd2FybnM7CS8qIHdhcm5pbmdzIGlzc3VlZCB3cnQgbnVtIGlub2RlcyAqLworLyoxNiovCXhmc19xd2FybmNudF90CWRfYndhcm5zOwkvKiB3YXJuaW5ncyBpc3N1ZWQgd3J0IGRpc2sgYmxvY2tzICovCisvKjMyKi8JX19pbnQzMl90CWRfcGFkMDsJCS8qIDY0IGJpdCBhbGlnbiAqLworLyo2NCovCXhmc19xY250X3QJZF9ydGJfaGFyZGxpbWl0Oy8qIGFic29sdXRlIGxpbWl0IG9uIHJlYWx0aW1lIGJsa3MgKi8KKy8qNjQqLwl4ZnNfcWNudF90CWRfcnRiX3NvZnRsaW1pdDsvKiBwcmVmZXJyZWQgbGltaXQgb24gUlQgZGlzayBibGtzICovCisvKjY0Ki8JeGZzX3FjbnRfdAlkX3J0YmNvdW50OwkvKiByZWFsdGltZSBibG9ja3Mgb3duZWQgKi8KKy8qMzIqLwlfX2ludDMyX3QJZF9ydGJ0aW1lcjsJLyogc2ltaWxhciB0byBhYm92ZTsgZm9yIFJUIGRpc2sgYmxvY2tzICovCisvKjE2Ki8JeGZzX3F3YXJuY250X3QJZF9ydGJ3YXJuczsJLyogd2FybmluZ3MgaXNzdWVkIHdydCBSVCBkaXNrIGJsb2NrcyAqLworLyoxNiovCV9fdWludDE2X3QJZF9wYWQ7Cit9IHhmc19kaXNrX2RxdW90X3Q7CisKKy8qCisgKiBUaGlzIGlzIHdoYXQgZ29lcyBvbiBkaXNrLiBUaGlzIGlzIHNlcGFyYXRlZCBmcm9tIHRoZSB4ZnNfZGlza19kcXVvdCBiZWNhdXNlCisgKiBjYXJyeWluZyB0aGUgdW5uZWNlc3NhcnkgcGFkZGluZyB3b3VsZCBiZSBhIHdhc3RlIG9mIG1lbW9yeS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RxYmxrIHsKKwl4ZnNfZGlza19kcXVvdF90ICBkZF9kaXNrZHE7CS8qIHBvcnRpb24gdGhhdCBsaXZlcyBpbmNvcmUgYXMgd2VsbCAqLworCWNoYXIJCSAgZGRfZmlsbFszMl07CS8qIGZpbGxpbmcgZm9yIHBvc3Rlcml0eSAqLworfSB4ZnNfZHFibGtfdDsKKworLyoKKyAqIGZsYWdzIGZvciBxX2ZsYWdzIGZpZWxkIGluIHRoZSBkcXVvdC4KKyAqLworI2RlZmluZSBYRlNfRFFfVVNFUgkJMHgwMDAxCQkvKiBhIHVzZXIgcXVvdGEgKi8KKy8qICNkZWZpbmUgWEZTX0RRX1BST0oJCTB4MDAwMgkJLS0gcHJvamVjdCBxdW90YSAoSVJJWCkgKi8KKyNkZWZpbmUgWEZTX0RRX0dST1VQCQkweDAwMDQJCS8qIGEgZ3JvdXAgcXVvdGEgKi8KKyNkZWZpbmUgWEZTX0RRX0ZMT0NLRUQJCTB4MDAwOAkJLyogZmx1c2ggbG9jayB0YWtlbiAqLworI2RlZmluZSBYRlNfRFFfRElSVFkJCTB4MDAxMAkJLyogZHF1b3QgaXMgZGlydHkgKi8KKyNkZWZpbmUgWEZTX0RRX1dBTlQJCTB4MDAyMAkJLyogZm9yIGxvb2t1cC9yZWNsYWltIHJhY2UgKi8KKyNkZWZpbmUgWEZTX0RRX0lOQUNUSVZFCQkweDAwNDAJCS8qIGRxIG9mZiBtcGxpc3QgJiBoYXNobGlzdCAqLworI2RlZmluZSBYRlNfRFFfTUFSS0VSCQkweDAwODAJCS8qIHNlbnRpbmVsICovCisKKy8qCisgKiBJbiB0aGUgd29yc3QgY2FzZSwgd2hlbiBib3RoIHVzZXIgYW5kIGdyb3VwIHF1b3RhcyBhcmUgb24sCisgKiB3ZSBjYW4gaGF2ZSBhIG1heCBvZiB0aHJlZSBkcXVvdHMgY2hhbmdpbmcgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24uCisgKi8KKyNkZWZpbmUgWEZTX0RRVU9UX0xPR1JFUyhtcCkJKHNpemVvZih4ZnNfZGlza19kcXVvdF90KSAqIDMpCisKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgc3RydWN0dXJlcyB1c2VkIHRvIGxheSBvdXQgZHF1b3RzIGFuZCBxdW90YW9mZgorICogcmVjb3JkcyBvbiB0aGUgbG9nLiBRdWl0ZSBzaW1pbGFyIHRvIHRob3NlIG9mIGlub2Rlcy4KKyAqLworCisvKgorICogbG9nIGZvcm1hdCBzdHJ1Y3QgZm9yIGRxdW90cy4KKyAqIFRoZSBmaXJzdCB0d28gZmllbGRzIG11c3QgYmUgdGhlIHR5cGUgYW5kIHNpemUgZml0dGluZyBpbnRvCisgKiAzMiBiaXRzIDogbG9nX3JlY292ZXJ5IGNvZGUgYXNzdW1lcyB0aGF0LgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZHFfbG9nZm9ybWF0IHsKKwlfX3VpbnQxNl90CQlxbGZfdHlwZTsgICAgICAvKiBkcXVvdCBsb2cgaXRlbSB0eXBlICovCisJX191aW50MTZfdAkJcWxmX3NpemU7ICAgICAgLyogc2l6ZSBvZiB0aGlzIGl0ZW0gKi8KKwl4ZnNfZHFpZF90CQlxbGZfaWQ7CSAgICAgICAvKiB1c3IvZ3JwIGlkIG51bWJlciA6IDMyIGJpdHMgKi8KKwlfX2ludDY0X3QJCXFsZl9ibGtubzsgICAgIC8qIGJsa25vIG9mIGRxdW90IGJ1ZmZlciAqLworCV9faW50MzJfdAkJcWxmX2xlbjsgICAgICAgLyogbGVuIG9mIGRxdW90IGJ1ZmZlciAqLworCV9fdWludDMyX3QJCXFsZl9ib2Zmc2V0OyAgIC8qIG9mZiBvZiBkcXVvdCBpbiBidWZmZXIgKi8KK30geGZzX2RxX2xvZ2Zvcm1hdF90OworCisvKgorICogbG9nIGZvcm1hdCBzdHJ1Y3QgZm9yIFFVT1RBT0ZGIHJlY29yZHMuCisgKiBUaGUgZmlyc3QgdHdvIGZpZWxkcyBtdXN0IGJlIHRoZSB0eXBlIGFuZCBzaXplIGZpdHRpbmcgaW50bworICogMzIgYml0cyA6IGxvZ19yZWNvdmVyeSBjb2RlIGFzc3VtZXMgdGhhdC4KKyAqIFdlIHdyaXRlIHR3byBMSV9RVU9UQU9GRiBsb2dpdGVtcyBwZXIgcXVvdGFvZmYsIHRoZSBsYXN0IG9uZSBrZWVwcyBhIHBvaW50ZXIKKyAqIHRvIHRoZSBmaXJzdCBhbmQgZW5zdXJlcyB0aGF0IHRoZSBmaXJzdCBsb2dpdGVtIGlzIHRha2VuIG91dCBvZiB0aGUgQUlMCisgKiBvbmx5IHdoZW4gdGhlIGxhc3Qgb25lIGlzIHNlY3VyZWx5IGNvbW1pdHRlZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX3FvZmZfbG9nZm9ybWF0IHsKKwl1bnNpZ25lZCBzaG9ydAkJcWZfdHlwZTsJLyogcXVvdGFvZmYgbG9nIGl0ZW0gdHlwZSAqLworCXVuc2lnbmVkIHNob3J0CQlxZl9zaXplOwkvKiBzaXplIG9mIHRoaXMgaXRlbSAqLworCXVuc2lnbmVkIGludAkJcWZfZmxhZ3M7CS8qIFVTUiBhbmQvb3IgR1JQICovCisJY2hhcgkJCXFmX3BhZFsxMl07CS8qIHBhZGRpbmcgZm9yIGZ1dHVyZSAqLworfSB4ZnNfcW9mZl9sb2dmb3JtYXRfdDsKKworCisvKgorICogRGlzayBxdW90YXMgc3RhdHVzIGluIG1fcWZsYWdzLCBhbmQgYWxzbyBzYl9xZmxhZ3MuIDE2IGJpdHMuCisgKi8KKyNkZWZpbmUgWEZTX1VRVU9UQV9BQ0NUCTB4MDAwMSAgLyogdXNlciBxdW90YSBhY2NvdW50aW5nIE9OICovCisjZGVmaW5lIFhGU19VUVVPVEFfRU5GRAkweDAwMDIgIC8qIHVzZXIgcXVvdGEgbGltaXRzIGVuZm9yY2VkICovCisjZGVmaW5lIFhGU19VUVVPVEFfQ0hLRAkweDAwMDQgIC8qIHF1b3RhY2hlY2sgcnVuIG9uIHVzciBxdW90YXMgKi8KKyNkZWZpbmUgWEZTX1BRVU9UQV9BQ0NUCTB4MDAwOCAgLyogKElSSVgpIHByb2plY3QgcXVvdGEgYWNjb3VudGluZyBPTiAqLworI2RlZmluZSBYRlNfR1FVT1RBX0VORkQJMHgwMDEwICAvKiBncm91cCBxdW90YSBsaW1pdHMgZW5mb3JjZWQgKi8KKyNkZWZpbmUgWEZTX0dRVU9UQV9DSEtECTB4MDAyMCAgLyogcXVvdGFjaGVjayBydW4gb24gZ3JwIHF1b3RhcyAqLworI2RlZmluZSBYRlNfR1FVT1RBX0FDQ1QJMHgwMDQwICAvKiBncm91cCBxdW90YSBhY2NvdW50aW5nIE9OICovCisKKy8qCisgKiBJbmNvcmUgb25seSBmbGFncyBmb3IgcXVvdGFvZmYgLSB0aGVzZSBiaXRzIGdldCBjbGVhcmVkIHdoZW4gcXVvdGEocykKKyAqIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBnZXR0aW5nIHR1cm5lZCBvZmYuIFRoZXNlIGZsYWdzIGFyZSBpbiBtX3FmbGFncyBidXQKKyAqIG5ldmVyIGluIHNiX3FmbGFncy4KKyAqLworI2RlZmluZSBYRlNfVVFVT1RBX0FDVElWRQkweDAwODAgIC8qIHVxdW90YXMgYXJlIGJlaW5nIHR1cm5lZCBvZmYgKi8KKyNkZWZpbmUgWEZTX0dRVU9UQV9BQ1RJVkUJMHgwMTAwICAvKiBncXVvdGFzIGFyZSBiZWluZyB0dXJuZWQgb2ZmICovCisKKy8qCisgKiBDaGVja2luZyBYRlNfSVNfKlFVT1RBX09OKCkgd2hpbGUgaG9sZGluZyBhbnkgaW5vZGUgbG9jayBndWFyYW50ZWVzCisgKiBxdW90YSB3aWxsIGJlIG5vdCBiZSBzd2l0Y2hlZCBvZmYgYXMgbG9uZyBhcyB0aGF0IGlub2RlIGxvY2sgaXMgaGVsZC4KKyAqLworI2RlZmluZSBYRlNfSVNfUVVPVEFfT04obXApCSgobXApLT5tX3FmbGFncyAmIChYRlNfVVFVT1RBX0FDVElWRSB8IFwKKwkJCQkJCSAgIFhGU19HUVVPVEFfQUNUSVZFKSkKKyNkZWZpbmUgWEZTX0lTX1VRVU9UQV9PTihtcCkJKChtcCktPm1fcWZsYWdzICYgWEZTX1VRVU9UQV9BQ1RJVkUpCisjZGVmaW5lIFhGU19JU19HUVVPVEFfT04obXApCSgobXApLT5tX3FmbGFncyAmIFhGU19HUVVPVEFfQUNUSVZFKQorCisvKgorICogRmxhZ3MgdG8gdGVsbCB2YXJpb3VzIGZ1bmN0aW9ucyB3aGF0IHRvIGRvLiBOb3QgYWxsIG9mIHRoZXNlIGFyZSBtZWFuaW5nZnVsCisgKiB0byBhIHNpbmdsZSBmdW5jdGlvbi4gTm9uZSBvZiB0aGVzZSBYRlNfUU1PUFRfKiBmbGFncyBhcmUgbWVhbnQgdG8gaGF2ZQorICogcGVyc2lzdGVudCB2YWx1ZXMgKGllLiB0aGVpciB2YWx1ZXMgY2FuIGFuZCB3aWxsIGNoYW5nZSBiZXR3ZWVuIHZlcnNpb25zKQorICovCisjZGVmaW5lIFhGU19RTU9QVF9EUUxPQ0sJMHgwMDAwMDAxIC8qIGRxbG9jayAqLworI2RlZmluZSBYRlNfUU1PUFRfRFFBTExPQwkweDAwMDAwMDIgLyogYWxsb2MgZHF1b3Qgb25kaXNrIGlmIG5lZWRlZCAqLworI2RlZmluZSBYRlNfUU1PUFRfVVFVT1RBCTB4MDAwMDAwNCAvKiB1c2VyIGRxdW90IHJlcXVlc3RlZCAqLworI2RlZmluZSBYRlNfUU1PUFRfR1FVT1RBCTB4MDAwMDAwOCAvKiBncm91cCBkcXVvdCByZXF1ZXN0ZWQgKi8KKyNkZWZpbmUgWEZTX1FNT1BUX0ZPUkNFX1JFUwkweDAwMDAwMTAgLyogaWdub3JlIHF1b3RhIGxpbWl0cyAqLworI2RlZmluZSBYRlNfUU1PUFRfRFFTVVNFUgkweDAwMDAwMjAgLyogZG9uJ3QgY2FjaGUgc3VwZXIgdXNlcnMgZHF1b3QgKi8KKyNkZWZpbmUgWEZTX1FNT1BUX1NCVkVSU0lPTgkweDAwMDAwNDAgLyogY2hhbmdlIHN1cGVyYmxvY2sgdmVyc2lvbiBudW0gKi8KKyNkZWZpbmUgWEZTX1FNT1BUX1FVT1RBT0ZGCTB4MDAwMDA4MCAvKiBxdW90YXMgYXJlIGJlaW5nIHR1cm5lZCBvZmYgKi8KKyNkZWZpbmUgWEZTX1FNT1BUX1VNT1VOVElORwkweDAwMDAxMDAgLyogZmlsZXN5cyBpcyBiZWluZyB1bm1vdW50ZWQgKi8KKyNkZWZpbmUgWEZTX1FNT1BUX0RPTE9HCQkweDAwMDAyMDAgLyogbG9nIGJ1ZiBjaGFuZ2VzIChpbiBxdW90YWNoZWNrKSAqLworI2RlZmluZSBYRlNfUU1PUFRfRE9XQVJOICAgICAgICAweDAwMDA0MDAgLyogaW5jcmVhc2Ugd2FybmluZyBjbnQgaWYgbmVjZXNzYXJ5ICovCisjZGVmaW5lIFhGU19RTU9QVF9JTE9DS0VECTB4MDAwMDgwMCAvKiBpbm9kZSBpcyBhbHJlYWR5IGxvY2tlZCAoZXhjbCkgKi8KKyNkZWZpbmUgWEZTX1FNT1BUX0RRUkVQQUlSCTB4MDAwMTAwMCAvKiByZXBhaXIgZHF1b3QsIGlmIGRhbWFnZWQuICovCisKKy8qCisgKiBmbGFncyB0byB4ZnNfdHJhbnNfbW9kX2RxdW90IHRvIGluZGljYXRlIHdoaWNoIGZpZWxkIG5lZWRzIHRvIGJlCisgKiBtb2RpZmllZC4KKyAqLworI2RlZmluZSBYRlNfUU1PUFRfUkVTX1JFR0JMS1MJMHgwMDEwMDAwCisjZGVmaW5lIFhGU19RTU9QVF9SRVNfUlRCTEtTCTB4MDAyMDAwMAorI2RlZmluZSBYRlNfUU1PUFRfQkNPVU5UCTB4MDA0MDAwMAorI2RlZmluZSBYRlNfUU1PUFRfSUNPVU5UCTB4MDA4MDAwMAorI2RlZmluZSBYRlNfUU1PUFRfUlRCQ09VTlQJMHgwMTAwMDAwCisjZGVmaW5lIFhGU19RTU9QVF9ERUxCQ09VTlQJMHgwMjAwMDAwCisjZGVmaW5lIFhGU19RTU9QVF9ERUxSVEJDT1VOVAkweDA0MDAwMDAKKyNkZWZpbmUgWEZTX1FNT1BUX1JFU19JTk9TCTB4MDgwMDAwMAorCisvKgorICogZmxhZ3MgZm9yIGRxZmx1c2ggYW5kIGRxZmx1c2hfYWxsLgorICovCisjZGVmaW5lIFhGU19RTU9QVF9TWU5DCQkweDEwMDAwMDAKKyNkZWZpbmUgWEZTX1FNT1BUX0FTWU5DCQkweDIwMDAwMDAKKyNkZWZpbmUgWEZTX1FNT1BUX0RFTFdSSQkweDQwMDAwMDAKKworLyoKKyAqIGZsYWdzIGZvciBkcWFsbG9jLgorICovCisjZGVmaW5lIFhGU19RTU9QVF9JTkhFUklUCTB4ODAwMDAwMAorCisvKgorICogZmxhZ3MgdG8geGZzX3RyYW5zX21vZF9kcXVvdC4KKyAqLworI2RlZmluZSBYRlNfVFJBTlNfRFFfUkVTX0JMS1MJWEZTX1FNT1BUX1JFU19SRUdCTEtTCisjZGVmaW5lIFhGU19UUkFOU19EUV9SRVNfUlRCTEtTCVhGU19RTU9QVF9SRVNfUlRCTEtTCisjZGVmaW5lIFhGU19UUkFOU19EUV9SRVNfSU5PUwlYRlNfUU1PUFRfUkVTX0lOT1MKKyNkZWZpbmUgWEZTX1RSQU5TX0RRX0JDT1VOVAlYRlNfUU1PUFRfQkNPVU5UCisjZGVmaW5lIFhGU19UUkFOU19EUV9ERUxCQ09VTlQJWEZTX1FNT1BUX0RFTEJDT1VOVAorI2RlZmluZSBYRlNfVFJBTlNfRFFfSUNPVU5UCVhGU19RTU9QVF9JQ09VTlQKKyNkZWZpbmUgWEZTX1RSQU5TX0RRX1JUQkNPVU5UCVhGU19RTU9QVF9SVEJDT1VOVAorI2RlZmluZSBYRlNfVFJBTlNfRFFfREVMUlRCQ09VTlQgWEZTX1FNT1BUX0RFTFJUQkNPVU5UCisKKworI2RlZmluZSBYRlNfUU1PUFRfUVVPVEFMTAkoWEZTX1FNT1BUX1VRVU9UQXxYRlNfUU1PUFRfR1FVT1RBKQorI2RlZmluZSBYRlNfUU1PUFRfUkVTQkxLX01BU0sJKFhGU19RTU9QVF9SRVNfUkVHQkxLUyB8IFhGU19RTU9QVF9SRVNfUlRCTEtTKQorCisjaWZkZWYgX19LRVJORUxfXworLyoKKyAqIFRoaXMgY2hlY2sgaXMgZG9uZSB0eXBpY2FsbHkgd2l0aG91dCBob2xkaW5nIHRoZSBpbm9kZSBsb2NrOworICogdGhhdCBtYXkgc2VlbSByYWNleSwgYnV0IGl0IGlzIGhhcm1sZXNzIGluIHRoZSBjb250ZXh0IHRoYXQgaXQgaXMgdXNlZC4KKyAqIFRoZSBpbm9kZSBjYW5ub3QgZ28gaW5hY3RpdmUgYXMgbG9uZyBhIHJlZmVyZW5jZSBpcyBrZXB0LCBhbmQKKyAqIHRoZXJlZm9yZSBpZiBkcXVvdChzKSB3ZXJlIGF0dGFjaGVkLCB0aGV5J2xsIHN0YXkgY29uc2lzdGVudC4KKyAqIElmLCBmb3IgZXhhbXBsZSwgdGhlIG93bmVyc2hpcCBvZiB0aGUgaW5vZGUgY2hhbmdlcyB3aGlsZQorICogd2UgZGlkbid0IGhhdmUgdGhlIGlub2RlIGxvY2tlZCwgdGhlIGFwcHJvcHJpYXRlIGRxdW90KHMpIHdpbGwgYmUKKyAqIGF0dGFjaGVkIGF0b21pY2FsbHkuCisgKi8KKyNkZWZpbmUgWEZTX05PVF9EUUFUVEFDSEVEKG1wLCBpcCkgKChYRlNfSVNfVVFVT1RBX09OKG1wKSAmJlwKKwkJCQkgICAgIChpcCktPmlfdWRxdW90ID09IE5VTEwpIHx8IFwKKwkJCQkgICAgKFhGU19JU19HUVVPVEFfT04obXApICYmIFwKKwkJCQkgICAgIChpcCktPmlfZ2RxdW90ID09IE5VTEwpKQorCisjZGVmaW5lIFhGU19RTV9ORUVEX1FVT1RBQ0hFQ0sobXApICgoWEZTX0lTX1VRVU9UQV9PTihtcCkgJiYgXAorCQkJCSAgICAgKG1wLT5tX3NiLnNiX3FmbGFncyAmIFwKKwkJCQkgICAgICBYRlNfVVFVT1RBX0NIS0QpID09IDApIHx8IFwKKwkJCQkgICAgKFhGU19JU19HUVVPVEFfT04obXApICYmIFwKKwkJCQkgICAgIChtcC0+bV9zYi5zYl9xZmxhZ3MgJiBcCisJCQkJICAgICAgWEZTX0dRVU9UQV9DSEtEKSA9PSAwKSkKKworI2RlZmluZSBYRlNfTU9VTlRfUVVPVEFfQUxMCShYRlNfVVFVT1RBX0FDQ1R8WEZTX1VRVU9UQV9FTkZEfFwKKwkJCQkgWEZTX1VRVU9UQV9DSEtEfFhGU19HUVVPVEFfQUNDVHxcCisJCQkJIFhGU19HUVVPVEFfRU5GRHxYRlNfR1FVT1RBX0NIS0QpCisjZGVmaW5lIFhGU19NT1VOVF9RVU9UQV9NQVNLCShYRlNfTU9VTlRfUVVPVEFfQUxMIHwgWEZTX1VRVU9UQV9BQ1RJVkUgfCBcCisJCQkJIFhGU19HUVVPVEFfQUNUSVZFKQorCisKKy8qCisgKiBUaGUgc3RydWN0dXJlIGtlcHQgaW5zaWRlIHRoZSB4ZnNfdHJhbnNfdCBrZWVwIHRyYWNrIG9mIGRxdW90IGNoYW5nZXMKKyAqIHdpdGhpbiBhIHRyYW5zYWN0aW9uIGFuZCBhcHBseSB0aGVtIGxhdGVyLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZHF0cnggeworCXN0cnVjdCB4ZnNfZHF1b3QgKnF0X2RxdW90OwkgIC8qIHRoZSBkcXVvdCB0aGlzIHJlZmVycyB0byAqLworCXVsb25nCQlxdF9ibGtfcmVzOwkgIC8qIGJsa3MgcmVzZXJ2ZWQgb24gYSBkcXVvdCAqLworCXVsb25nCQlxdF9ibGtfcmVzX3VzZWQ7ICAvKiBibGtzIHVzZWQgZnJvbSB0aGUgcmVzZXJ2YXRpb24gKi8KKwl1bG9uZwkJcXRfaW5vX3JlczsJICAvKiBpbm9kZSByZXNlcnZlZCBvbiBhIGRxdW90ICovCisJdWxvbmcJCXF0X2lub19yZXNfdXNlZDsgIC8qIGlub2RlcyB1c2VkIGZyb20gdGhlIHJlc2VydmF0aW9uICovCisJbG9uZwkJcXRfYmNvdW50X2RlbHRhOyAgLyogZHF1b3QgYmxrIGNvdW50IGNoYW5nZXMgKi8KKwlsb25nCQlxdF9kZWxiY250X2RlbHRhOyAvKiBkZWxheWVkIGRxdW90IGJsayBjb3VudCBjaGFuZ2VzICovCisJbG9uZwkJcXRfaWNvdW50X2RlbHRhOyAgLyogZHF1b3QgaW5vZGUgY291bnQgY2hhbmdlcyAqLworCXVsb25nCQlxdF9ydGJsa19yZXM7CSAgLyogIyBibGtzIHJlc2VydmVkIG9uIGEgZHF1b3QgKi8KKwl1bG9uZwkJcXRfcnRibGtfcmVzX3VzZWQ7LyogIyBibGtzIHVzZWQgZnJvbSByZXNlcnZhdGlvbiAqLworCWxvbmcJCXF0X3J0YmNvdW50X2RlbHRhOy8qIGRxdW90IHJlYWx0aW1lIGJsayBjaGFuZ2VzICovCisJbG9uZwkJcXRfZGVscnRiX2RlbHRhOyAgLyogZGVsYXllZCBSVCBibGsgY291bnQgY2hhbmdlcyAqLworfSB4ZnNfZHF0cnhfdDsKKworLyoKKyAqIERxdW90IHRyYW5zYWN0aW9uIGZ1bmN0aW9ucywgdXNlZCBpZiBxdW90YSBpcyBlbmFibGVkLgorICovCit0eXBlZGVmIHZvaWQJKCpxb19kdXBfZHFpbmZvX3QpKHN0cnVjdCB4ZnNfdHJhbnMgKiwgc3RydWN0IHhmc190cmFucyAqKTsKK3R5cGVkZWYgdm9pZAkoKnFvX21vZF9kcXVvdF9ieWlub190KShzdHJ1Y3QgeGZzX3RyYW5zICosCisJCQkJc3RydWN0IHhmc19pbm9kZSAqLCB1aW50LCBsb25nKTsKK3R5cGVkZWYgdm9pZAkoKnFvX2ZyZWVfZHFpbmZvX3QpKHN0cnVjdCB4ZnNfdHJhbnMgKik7Cit0eXBlZGVmIHZvaWQJKCpxb19hcHBseV9kcXVvdF9kZWx0YXNfdCkoc3RydWN0IHhmc190cmFucyAqKTsKK3R5cGVkZWYgdm9pZAkoKnFvX3VucmVzZXJ2ZV9hbmRfbW9kX2RxdW90c190KShzdHJ1Y3QgeGZzX3RyYW5zICopOwordHlwZWRlZiBpbnQJKCpxb19yZXNlcnZlX3F1b3RhX25ibGtzX3QpKAorCQkJCXN0cnVjdCB4ZnNfdHJhbnMgKiwgc3RydWN0IHhmc19tb3VudCAqLAorCQkJCXN0cnVjdCB4ZnNfaW5vZGUgKiwgbG9uZywgbG9uZywgdWludCk7Cit0eXBlZGVmIGludAkoKnFvX3Jlc2VydmVfcXVvdGFfYnlkcXVvdHNfdCkoCisJCQkJc3RydWN0IHhmc190cmFucyAqLCBzdHJ1Y3QgeGZzX21vdW50ICosCisJCQkJc3RydWN0IHhmc19kcXVvdCAqLCBzdHJ1Y3QgeGZzX2RxdW90ICosCisJCQkJbG9uZywgbG9uZywgdWludCk7Cit0eXBlZGVmIHN0cnVjdCB4ZnNfZHF0cnhvcHMgeworCXFvX2R1cF9kcWluZm9fdAkJCXFvX2R1cF9kcWluZm87CisJcW9fZnJlZV9kcWluZm9fdAkJcW9fZnJlZV9kcWluZm87CisJcW9fbW9kX2RxdW90X2J5aW5vX3QJCXFvX21vZF9kcXVvdF9ieWlubzsKKwlxb19hcHBseV9kcXVvdF9kZWx0YXNfdAkJcW9fYXBwbHlfZHF1b3RfZGVsdGFzOworCXFvX3Jlc2VydmVfcXVvdGFfbmJsa3NfdAlxb19yZXNlcnZlX3F1b3RhX25ibGtzOworCXFvX3Jlc2VydmVfcXVvdGFfYnlkcXVvdHNfdAlxb19yZXNlcnZlX3F1b3RhX2J5ZHF1b3RzOworCXFvX3VucmVzZXJ2ZV9hbmRfbW9kX2RxdW90c190CXFvX3VucmVzZXJ2ZV9hbmRfbW9kX2RxdW90czsKK30geGZzX2RxdHJ4b3BzX3Q7CisKKyNkZWZpbmUgWEZTX0RRVFJYT1AobXAsIHRwLCBvcCwgYXJncy4uLikgXAorCQkoKG1wKS0+bV9xbV9vcHMueGZzX2RxdHJ4b3BzID8gXAorCQkoKG1wKS0+bV9xbV9vcHMueGZzX2RxdHJ4b3BzLT5vcCkodHAsICMjIGFyZ3MpIDogMCkKKworI2RlZmluZSBYRlNfRFFUUlhPUF9WT0lEKG1wLCB0cCwgb3AsIGFyZ3MuLi4pIFwKKwkJKChtcCktPm1fcW1fb3BzLnhmc19kcXRyeG9wcyA/IFwKKwkJKChtcCktPm1fcW1fb3BzLnhmc19kcXRyeG9wcy0+b3ApKHRwLCAjIyBhcmdzKSA6ICh2b2lkKTApCisKKyNkZWZpbmUgWEZTX1RSQU5TX0RVUF9EUUlORk8obXAsIG90cCwgbnRwKSBcCisJWEZTX0RRVFJYT1BfVk9JRChtcCwgb3RwLCBxb19kdXBfZHFpbmZvLCBudHApCisjZGVmaW5lIFhGU19UUkFOU19GUkVFX0RRSU5GTyhtcCwgdHApIFwKKwlYRlNfRFFUUlhPUF9WT0lEKG1wLCB0cCwgcW9fZnJlZV9kcWluZm8pCisjZGVmaW5lIFhGU19UUkFOU19NT0RfRFFVT1RfQllJTk8obXAsIHRwLCBpcCwgZmllbGQsIGRlbHRhKSBcCisJWEZTX0RRVFJYT1BfVk9JRChtcCwgdHAsIHFvX21vZF9kcXVvdF9ieWlubywgaXAsIGZpZWxkLCBkZWx0YSkKKyNkZWZpbmUgWEZTX1RSQU5TX0FQUExZX0RRVU9UX0RFTFRBUyhtcCwgdHApIFwKKwlYRlNfRFFUUlhPUF9WT0lEKG1wLCB0cCwgcW9fYXBwbHlfZHF1b3RfZGVsdGFzKQorI2RlZmluZSBYRlNfVFJBTlNfUkVTRVJWRV9RVU9UQV9OQkxLUyhtcCwgdHAsIGlwLCBuYmxrcywgbmlub3MsIGZsKSBcCisJWEZTX0RRVFJYT1AobXAsIHRwLCBxb19yZXNlcnZlX3F1b3RhX25ibGtzLCBtcCwgaXAsIG5ibGtzLCBuaW5vcywgZmwpCisjZGVmaW5lIFhGU19UUkFOU19SRVNFUlZFX1FVT1RBX0JZRFFVT1RTKG1wLCB0cCwgdWQsIGdkLCBuYiwgbmksIGZsKSBcCisJWEZTX0RRVFJYT1AobXAsIHRwLCBxb19yZXNlcnZlX3F1b3RhX2J5ZHF1b3RzLCBtcCwgdWQsIGdkLCBuYiwgbmksIGZsKQorI2RlZmluZSBYRlNfVFJBTlNfVU5SRVNFUlZFX0FORF9NT0RfRFFVT1RTKG1wLCB0cCkgXAorCVhGU19EUVRSWE9QX1ZPSUQobXAsIHRwLCBxb191bnJlc2VydmVfYW5kX21vZF9kcXVvdHMpCisKKyNkZWZpbmUgWEZTX1RSQU5TX1JFU0VSVkVfQkxLUVVPVEEobXAsIHRwLCBpcCwgbmJsa3MpIFwKKwlYRlNfVFJBTlNfUkVTRVJWRV9RVU9UQV9OQkxLUyhtcCwgdHAsIGlwLCBuYmxrcywgMCwgXAorCQkJCVhGU19RTU9QVF9SRVNfUkVHQkxLUykKKyNkZWZpbmUgWEZTX1RSQU5TX1JFU0VSVkVfQkxLUVVPVEFfRk9SQ0UobXAsIHRwLCBpcCwgbmJsa3MpIFwKKwlYRlNfVFJBTlNfUkVTRVJWRV9RVU9UQV9OQkxLUyhtcCwgdHAsIGlwLCBuYmxrcywgMCwgXAorCQkJCVhGU19RTU9QVF9SRVNfUkVHQkxLUyB8IFhGU19RTU9QVF9GT1JDRV9SRVMpCisjZGVmaW5lIFhGU19UUkFOU19VTlJFU0VSVkVfQkxLUVVPVEEobXAsIHRwLCBpcCwgbmJsa3MpIFwKKwlYRlNfVFJBTlNfUkVTRVJWRV9RVU9UQV9OQkxLUyhtcCwgdHAsIGlwLCAtKG5ibGtzKSwgMCwgXAorCQkJCVhGU19RTU9QVF9SRVNfUkVHQkxLUykKKyNkZWZpbmUgWEZTX1RSQU5TX1JFU0VSVkVfUVVPVEEobXAsIHRwLCB1ZCwgZ2QsIG5iLCBuaSwgZikgXAorCVhGU19UUkFOU19SRVNFUlZFX1FVT1RBX0JZRFFVT1RTKG1wLCB0cCwgdWQsIGdkLCBuYiwgbmksIFwKKwkJCQlmIHwgWEZTX1FNT1BUX1JFU19SRUdCTEtTKQorI2RlZmluZSBYRlNfVFJBTlNfVU5SRVNFUlZFX1FVT1RBKG1wLCB0cCwgdWQsIGdkLCBuYiwgbmksIGYpIFwKKwlYRlNfVFJBTlNfUkVTRVJWRV9RVU9UQV9CWURRVU9UUyhtcCwgdHAsIHVkLCBnZCwgLShuYiksIC0obmkpLCBcCisJCQkJZiB8IFhGU19RTU9QVF9SRVNfUkVHQkxLUykKKworZXh0ZXJuIGludCB4ZnNfcW1fZHFjaGVjayh4ZnNfZGlza19kcXVvdF90ICosIHhmc19kcWlkX3QsIHVpbnQsIHVpbnQsIGNoYXIgKik7CisKK2V4dGVybiBzdHJ1Y3QgYmh2X3Zmc29wcyB4ZnNfcW1vcHM7CisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgkvKiBfX1hGU19RVU9UQV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcmVmY2FjaGUuaCBiL2ZzL3hmcy94ZnNfcmVmY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDhkZGZkCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19yZWZjYWNoZS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX1JFRkNBQ0hFX0hfXworI2RlZmluZSBfX1hGU19SRUZDQUNIRV9IX18KKworI2lmZGVmIEhBVkVfUkVGQ0FDSEUKKy8qCisgKiBNYXhpbXVtIHNpemUgKGluIGlub2RlcykgZm9yIHRoZSBORlMgcmVmZXJlbmNlIGNhY2hlCisgKi8KKyNkZWZpbmUgWEZTX1JFRkNBQ0hFX1NJWkVfTUFYCTUxMgorCitzdHJ1Y3QgeGZzX2lub2RlOworc3RydWN0IHhmc19tb3VudDsKKworZXh0ZXJuIHZvaWQgeGZzX3JlZmNhY2hlX2luc2VydChzdHJ1Y3QgeGZzX2lub2RlICopOworZXh0ZXJuIHZvaWQgeGZzX3JlZmNhY2hlX3B1cmdlX2lwKHN0cnVjdCB4ZnNfaW5vZGUgKik7CitleHRlcm4gdm9pZCB4ZnNfcmVmY2FjaGVfcHVyZ2VfbXAoc3RydWN0IHhmc19tb3VudCAqKTsKK2V4dGVybiB2b2lkIHhmc19yZWZjYWNoZV9wdXJnZV9zb21lKHN0cnVjdCB4ZnNfbW91bnQgKik7CitleHRlcm4gdm9pZCB4ZnNfcmVmY2FjaGVfcmVzaXplKGludCk7CitleHRlcm4gdm9pZCB4ZnNfcmVmY2FjaGVfZGVzdHJveSh2b2lkKTsKKworZXh0ZXJuIHZvaWQgeGZzX3JlZmNhY2hlX2l1bmxvY2soc3RydWN0IHhmc19pbm9kZSAqLCB1aW50KTsKKworI2Vsc2UKKworI2RlZmluZSB4ZnNfcmVmY2FjaGVfaW5zZXJ0KGlwKQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSB4ZnNfcmVmY2FjaGVfcHVyZ2VfaXAoaXApCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgeGZzX3JlZmNhY2hlX3B1cmdlX21wKG1wKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHhmc19yZWZjYWNoZV9wdXJnZV9zb21lKG1wKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHhmc19yZWZjYWNoZV9yZXNpemUoc2l6ZSkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSB4ZnNfcmVmY2FjaGVfZGVzdHJveSgpCQlkbyB7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgeGZzX3JlZmNhY2hlX2l1bmxvY2soaXAsIGZsYWdzKQl4ZnNfaXVubG9jayhpcCwgZmxhZ3MpCisKKyNlbmRpZgorCisjZW5kaWYJLyogX19YRlNfUkVGQ0FDSEVfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3JlbmFtZS5jIGIvZnMveGZzL3hmc19yZW5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjEzZjlhCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19yZW5hbWUuYwpAQCAtMCwwICsxLDY3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKKyNpbmNsdWRlICJ4ZnNfcmVmY2FjaGUuaCIKKyNpbmNsdWRlICJ4ZnNfdXRpbHMuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnNfc3BhY2UuaCIKKyNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX2xlYWYuaCIKKworCisvKgorICogR2l2ZW4gYW4gYXJyYXkgb2YgdXAgdG8gNCBpbm9kZSBwb2ludGVycywgdW5sb2NrIHRoZSBwb2ludGVkIHRvIGlub2Rlcy4KKyAqIElmIHRoZXJlIGFyZSBmZXdlciB0aGFuIDQgZW50cmllcyBpbiB0aGUgYXJyYXksIHRoZSBlbXB0eSBlbnRyaWVzIHdpbGwKKyAqIGJlIGF0IHRoZSBlbmQgYW5kIHdpbGwgaGF2ZSBOVUxMIHBvaW50ZXJzIGluIHRoZW0uCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfcmVuYW1lX3VubG9jazQoCisJeGZzX2lub2RlX3QJKippX3RhYiwKKwl1aW50CQlsb2NrX21vZGUpCit7CisJaW50CWk7CisKKwl4ZnNfaXVubG9jayhpX3RhYlswXSwgbG9ja19tb2RlKTsKKwlmb3IgKGkgPSAxOyBpIDwgNDsgaSsrKSB7CisJCWlmIChpX3RhYltpXSA9PSBOVUxMKSB7CisJCQlicmVhazsKKwkJfQorCQkvKgorCQkgKiBXYXRjaCBvdXQgZm9yIGR1cGxpY2F0ZSBlbnRyaWVzIGluIHRoZSB0YWJsZS4KKwkJICovCisJCWlmIChpX3RhYltpXSAhPSBpX3RhYltpLTFdKSB7CisJCQl4ZnNfaXVubG9jayhpX3RhYltpXSwgbG9ja19tb2RlKTsKKwkJfQorCX0KK30KKworI2lmZGVmIERFQlVHCitpbnQgeGZzX3JlbmFtZV9za2lwLCB4ZnNfcmVuYW1lX25za2lwOworI2VuZGlmCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHJvdXRpbmUgd2lsbCBhY3F1aXJlIHRoZSBsb2NrcyByZXF1aXJlZCBmb3IgYSByZW5hbWUKKyAqIG9wZXJhdGlvbi4gVGhlIGNvZGUgdW5kZXJzdGFuZHMgdGhlIHNlbWFudGljcyBvZiByZW5hbWVzIGFuZCB3aWxsCisgKiB2YWxpZGF0ZSB0aGF0IG5hbWUxIGV4aXN0cyB1bmRlciBkcDEgJiB0aGF0IG5hbWUyIG1heSBvciBtYXkgbm90CisgKiBleGlzdCB1bmRlciBkcDIuCisgKgorICogV2UgYXJlIHJlbmFtaW5nIGRwMS9uYW1lMSB0byBkcDIvbmFtZTIuCisgKgorICogUmV0dXJuIEVOT0VOVCBpZiBkcDEgZG9lcyBub3QgZXhpc3QsIG90aGVyIGxvb2t1cCBlcnJvcnMsIG9yIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19sb2NrX2Zvcl9yZW5hbWUoCisJeGZzX2lub2RlX3QJKmRwMSwJLyogb2xkIChzb3VyY2UpIGRpcmVjdG9yeSBpbm9kZSAqLworCXhmc19pbm9kZV90CSpkcDIsCS8qIG5ldyAodGFyZ2V0KSBkaXJlY3RvcnkgaW5vZGUgKi8KKwl2bmFtZV90CQkqdm5hbWUxLC8qIG9sZCBlbnRyeSBuYW1lICovCisJdm5hbWVfdAkJKnZuYW1lMiwvKiBuZXcgZW50cnkgbmFtZSAqLworCXhmc19pbm9kZV90CSoqaXBwMSwJLyogaW5vZGUgb2Ygb2xkIGVudHJ5ICovCisJeGZzX2lub2RlX3QJKippcHAyLAkvKiBpbm9kZSBvZiBuZXcgZW50cnksIGlmIGl0CisJCQkJICAgYWxyZWFkeSBleGlzdHMsIE5VTEwgb3RoZXJ3aXNlLiAqLworCXhmc19pbm9kZV90CSoqaV90YWIsLyogYXJyYXkgb2YgaW5vZGUgcmV0dXJuZWQsIHNvcnRlZCAqLworCWludAkJKm51bV9pbm9kZXMpICAvKiBudW1iZXIgb2YgaW5vZGVzIGluIGFycmF5ICovCit7CisJeGZzX2lub2RlX3QJCSppcDEsICppcDIsICp0ZW1wOworCXhmc19pbm9fdAkJaW51bTEsIGludW0yOworCWludAkJCWVycm9yOworCWludAkJCWksIGo7CisJdWludAkJCWxvY2tfbW9kZTsKKwlpbnQJCQlkaWZmX2RpcnMgPSAoZHAxICE9IGRwMik7CisKKwlpcDIgPSBOVUxMOworCisJLyoKKwkgKiBGaXJzdCwgZmluZCBvdXQgdGhlIGN1cnJlbnQgaW51bXMgb2YgdGhlIGVudHJpZXMgc28gdGhhdCB3ZQorCSAqIGNhbiBkZXRlcm1pbmUgdGhlIGluaXRpYWwgbG9ja2luZyBvcmRlci4gIFdlJ2xsIGhhdmUgdG8KKwkgKiBzYW5pdHkgY2hlY2sgc3R1ZmYgYWZ0ZXIgYWxsIHRoZSBsb2NrcyBoYXZlIGJlZW4gYWNxdWlyZWQKKwkgKiB0byBzZWUgaWYgd2Ugc3RpbGwgaGF2ZSB0aGUgcmlnaHQgaW5vZGVzLCBkaXJlY3RvcmllcywgZXRjLgorCSAqLworCWxvY2tfbW9kZSA9IHhmc19pbG9ja19tYXBfc2hhcmVkKGRwMSk7CisJZXJyb3IgPSB4ZnNfZ2V0X2Rpcl9lbnRyeSh2bmFtZTEsICZpcDEpOworCWlmIChlcnJvcikgeworCQl4ZnNfaXVubG9ja19tYXBfc2hhcmVkKGRwMSwgbG9ja19tb2RlKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWludW0xID0gaXAxLT5pX2lubzsKKworCUFTU0VSVChpcDEpOworCUlUUkFDRShpcDEpOworCisJLyoKKwkgKiBVbmxvY2sgZHAxIGFuZCBsb2NrIGRwMiBpZiB0aGV5IGFyZSBkaWZmZXJlbnQuCisJICovCisKKwlpZiAoZGlmZl9kaXJzKSB7CisJCXhmc19pdW5sb2NrX21hcF9zaGFyZWQoZHAxLCBsb2NrX21vZGUpOworCQlsb2NrX21vZGUgPSB4ZnNfaWxvY2tfbWFwX3NoYXJlZChkcDIpOworCX0KKworCWVycm9yID0geGZzX2Rpcl9sb29rdXBfaW50KFhGU19JVE9CSFYoZHAyKSwgbG9ja19tb2RlLAorCQkJCSAgIHZuYW1lMiwgJmludW0yLCAmaXAyKTsKKwlpZiAoZXJyb3IgPT0gRU5PRU5UKSB7CQkvKiB0YXJnZXQgZG9lcyBub3QgbmVlZCB0byBleGlzdC4gKi8KKwkJaW51bTIgPSAwOworCX0gZWxzZSBpZiAoZXJyb3IpIHsKKwkJLyoKKwkJICogSWYgZHAyIGFuZCBkcDEgYXJlIHRoZSBzYW1lLCB0aGUgbmV4dCBsaW5lIHVubG9ja3MgZHAxLgorCQkgKiBHb3QgaXQ/CisJCSAqLworCQl4ZnNfaXVubG9ja19tYXBfc2hhcmVkKGRwMiwgbG9ja19tb2RlKTsKKwkJSVJFTEUgKGlwMSk7CisJCXJldHVybiBlcnJvcjsKKwl9IGVsc2UgeworCQlJVFJBQ0UoaXAyKTsKKwl9CisKKwkvKgorCSAqIGlfdGFiIGNvbnRhaW5zIGEgbGlzdCBvZiBwb2ludGVycyB0byBpbm9kZXMuICBXZSBpbml0aWFsaXplCisJICogdGhlIHRhYmxlIGhlcmUgJiB3ZSdsbCBzb3J0IGl0LiAgV2Ugd2lsbCB0aGVuIHVzZSBpdCB0bworCSAqIG9yZGVyIHRoZSBhY3F1aXNpdGlvbiBvZiB0aGUgaW5vZGUgbG9ja3MuCisJICoKKwkgKiBOb3RlIHRoYXQgdGhlIHRhYmxlIG1heSBjb250YWluIGR1cGxpY2F0ZXMuICBlLmcuLCBkcDEgPT0gZHAyLgorCSAqLworCWlfdGFiWzBdID0gZHAxOworCWlfdGFiWzFdID0gZHAyOworCWlfdGFiWzJdID0gaXAxOworCWlmIChpbnVtMiA9PSAwKSB7CisJCSpudW1faW5vZGVzID0gMzsKKwkJaV90YWJbM10gPSBOVUxMOworCX0gZWxzZSB7CisJCSpudW1faW5vZGVzID0gNDsKKwkJaV90YWJbM10gPSBpcDI7CisJfQorCisJLyoKKwkgKiBTb3J0IHRoZSBlbGVtZW50cyB2aWEgYnViYmxlIHNvcnQuICAoUmVtZW1iZXIsIHRoZXJlIGFyZSBhdAorCSAqIG1vc3QgNCBlbGVtZW50cyB0byBzb3J0LCBzbyB0aGlzIGlzIGFkZXF1YXRlLikKKwkgKi8KKwlmb3IgKGk9MDsgaSA8ICpudW1faW5vZGVzOyBpKyspIHsKKwkJZm9yIChqPTE7IGogPCAqbnVtX2lub2RlczsgaisrKSB7CisJCQlpZiAoaV90YWJbal0tPmlfaW5vIDwgaV90YWJbai0xXS0+aV9pbm8pIHsKKwkJCQl0ZW1wID0gaV90YWJbal07CisJCQkJaV90YWJbal0gPSBpX3RhYltqLTFdOworCQkJCWlfdGFiW2otMV0gPSB0ZW1wOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBXZSBoYXZlIGRwMiBsb2NrZWQuIElmIGl0IGlzbid0IGZpcnN0LCB1bmxvY2sgaXQuCisJICogSWYgaXQgaXMgZmlyc3QsIHRlbGwgeGZzX2xvY2tfaW5vZGVzIHNvIGl0IGNhbiBza2lwIGl0CisJICogd2hlbiBsb2NraW5nLiBpZiBkcDEgPT0gZHAyLCB4ZnNfbG9ja19pbm9kZXMgd2lsbCBza2lwIGJvdGgKKwkgKiBzaW5jZSB0aGV5IGFyZSBlcXVhbC4geGZzX2xvY2tfaW5vZGVzIG5lZWRzIGFsbCB0aGVzZSBpbm9kZXMKKwkgKiBzbyB0aGF0IGl0IGNhbiB1bmxvY2sgYW5kIHJldHJ5IGlmIHRoZXJlIG1pZ2h0IGJlIGEgZGVhZC1sb2NrCisJICogcG90ZW50aWFsIHdpdGggdGhlIGxvZy4KKwkgKi8KKworCWlmIChpX3RhYlswXSA9PSBkcDIgJiYgbG9ja19tb2RlID09IFhGU19JTE9DS19TSEFSRUQpIHsKKyNpZmRlZiBERUJVRworCQl4ZnNfcmVuYW1lX3NraXArKzsKKyNlbmRpZgorCQl4ZnNfbG9ja19pbm9kZXMoaV90YWIsICpudW1faW5vZGVzLCAxLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwl9IGVsc2UgeworI2lmZGVmIERFQlVHCisJCXhmc19yZW5hbWVfbnNraXArKzsKKyNlbmRpZgorCQl4ZnNfaXVubG9ja19tYXBfc2hhcmVkKGRwMiwgbG9ja19tb2RlKTsKKwkJeGZzX2xvY2tfaW5vZGVzKGlfdGFiLCAqbnVtX2lub2RlcywgMCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJfQorCisJLyoKKwkgKiBTZXQgdGhlIHJldHVybiB2YWx1ZS4gTnVsbCBvdXQgYW55IHVudXNlZCBlbnRyaWVzIGluIGlfdGFiLgorCSAqLworCSppcHAxID0gKmlwcDIgPSBOVUxMOworCWZvciAoaT0wOyBpIDwgKm51bV9pbm9kZXM7IGkrKykgeworCQlpZiAoaV90YWJbaV0tPmlfaW5vID09IGludW0xKSB7CisJCQkqaXBwMSA9IGlfdGFiW2ldOworCQl9CisJCWlmIChpX3RhYltpXS0+aV9pbm8gPT0gaW51bTIpIHsKKwkJCSppcHAyID0gaV90YWJbaV07CisJCX0KKwl9CisJZm9yICg7aSA8IDQ7IGkrKykgeworCQlpX3RhYltpXSA9IE5VTEw7CisJfQorCXJldHVybiAwOworfQorCisKK2ludCByZW5hbWVfd2hpY2hfZXJyb3JfcmV0dXJuID0gMDsKKworLyoKKyAqIHhmc19yZW5hbWUKKyAqLworaW50Cit4ZnNfcmVuYW1lKAorCWJodl9kZXNjX3QJKnNyY19kaXJfYmRwLAorCXZuYW1lX3QJCSpzcmNfdm5hbWUsCisJdm5vZGVfdAkJKnRhcmdldF9kaXJfdnAsCisJdm5hbWVfdAkJKnRhcmdldF92bmFtZSwKKwljcmVkX3QJCSpjcmVkcCkKK3sKKwl4ZnNfdHJhbnNfdAkqdHA7CisJeGZzX2lub2RlX3QJKnNyY19kcCwgKnRhcmdldF9kcCwgKnNyY19pcCwgKnRhcmdldF9pcDsKKwl4ZnNfbW91bnRfdAkqbXA7CisJaW50CQluZXdfcGFyZW50OwkJLyogbW92aW5nIHRvIGEgbmV3IGRpciAqLworCWludAkJc3JjX2lzX2RpcmVjdG9yeTsJLyogc3JjX25hbWUgaXMgYSBkaXJlY3RvcnkgKi8KKwlpbnQJCWVycm9yOworCXhmc19ibWFwX2ZyZWVfdCBmcmVlX2xpc3Q7CisJeGZzX2ZzYmxvY2tfdCAgIGZpcnN0X2Jsb2NrOworCWludAkJY2FuY2VsX2ZsYWdzOworCWludAkJY29tbWl0dGVkOworCXhmc19pbm9kZV90CSppbm9kZXNbNF07CisJaW50CQl0YXJnZXRfaXBfZHJvcHBlZCA9IDA7CS8qIGRyb3BwZWQgdGFyZ2V0X2lwIGxpbms/ICovCisJdm5vZGVfdAkJKnNyY19kaXJfdnA7CisJYmh2X2Rlc2NfdAkqdGFyZ2V0X2Rpcl9iZHA7CisJaW50CQlzcGFjZXJlczsKKwlpbnQJCXRhcmdldF9saW5rX3plcm8gPSAwOworCWludAkJbnVtX2lub2RlczsKKwljaGFyCQkqc3JjX25hbWUgPSBWTkFNRShzcmNfdm5hbWUpOworCWNoYXIJCSp0YXJnZXRfbmFtZSA9IFZOQU1FKHRhcmdldF92bmFtZSk7CisJaW50CQlzcmNfbmFtZWxlbiA9IFZOQU1FTEVOKHNyY192bmFtZSk7CisJaW50CQl0YXJnZXRfbmFtZWxlbiA9IFZOQU1FTEVOKHRhcmdldF92bmFtZSk7CisKKwlzcmNfZGlyX3ZwID0gQkhWX1RPX1ZOT0RFKHNyY19kaXJfYmRwKTsKKwl2bl90cmFjZV9lbnRyeShzcmNfZGlyX3ZwLCAieGZzX3JlbmFtZSIsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwl2bl90cmFjZV9lbnRyeSh0YXJnZXRfZGlyX3ZwLCAieGZzX3JlbmFtZSIsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKworCS8qCisJICogRmluZCB0aGUgWEZTIGJlaGF2aW9yIGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQgZGlyZWN0b3J5CisJICogdm5vZGUgc2luY2UgaXQgd2FzIG5vdCBoYW5kZWQgdG8gdXMuCisJICovCisJdGFyZ2V0X2Rpcl9iZHAgPSB2bl9iaHZfbG9va3VwX3VubG9ja2VkKFZOX0JIVl9IRUFEKHRhcmdldF9kaXJfdnApLAorCQkJCQkJJnhmc192bm9kZW9wcyk7CisJaWYgKHRhcmdldF9kaXJfYmRwID09IE5VTEwpIHsKKwkJcmV0dXJuIFhGU19FUlJPUihFWERFVik7CisJfQorCisJc3JjX2RwID0gWEZTX0JIVlRPSShzcmNfZGlyX2JkcCk7CisJdGFyZ2V0X2RwID0gWEZTX0JIVlRPSSh0YXJnZXRfZGlyX2JkcCk7CisJbXAgPSBzcmNfZHAtPmlfbW91bnQ7CisKKwlpZiAoRE1fRVZFTlRfRU5BQkxFRChzcmNfZGlyX3ZwLT52X3Zmc3AsIHNyY19kcCwgRE1fRVZFTlRfUkVOQU1FKSB8fAorCSAgICBETV9FVkVOVF9FTkFCTEVEKHRhcmdldF9kaXJfdnAtPnZfdmZzcCwKKwkJCQl0YXJnZXRfZHAsIERNX0VWRU5UX1JFTkFNRSkpIHsKKwkJZXJyb3IgPSBYRlNfU0VORF9OQU1FU1AobXAsIERNX0VWRU5UX1JFTkFNRSwKKwkJCQkJc3JjX2Rpcl92cCwgRE1fUklHSFRfTlVMTCwKKwkJCQkJdGFyZ2V0X2Rpcl92cCwgRE1fUklHSFRfTlVMTCwKKwkJCQkJc3JjX25hbWUsIHRhcmdldF9uYW1lLAorCQkJCQkwLCAwLCAwKTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwl9CisJLyogUmV0dXJuIHRocm91Z2ggc3RkX3JldHVybiBhZnRlciB0aGlzIHBvaW50LiAqLworCisJLyoKKwkgKiBMb2NrIGFsbCB0aGUgcGFydGljaXBhdGluZyBpbm9kZXMuIERlcGVuZGluZyB1cG9uIHdoZXRoZXIKKwkgKiB0aGUgdGFyZ2V0X25hbWUgZXhpc3RzIGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5LCBhbmQKKwkgKiB3aGV0aGVyIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGlzIHRoZSBzYW1lIGFzIHRoZSBzb3VyY2UKKwkgKiBkaXJlY3RvcnksIHdlIGNhbiBsb2NrIGZyb20gMiB0byA0IGlub2Rlcy4KKwkgKiB4ZnNfbG9ja19mb3JfcmVuYW1lKCkgd2lsbCByZXR1cm4gRU5PRU5UIGlmIHNyY19uYW1lCisJICogZG9lcyBub3QgZXhpc3QgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuCisJICovCisJdHAgPSBOVUxMOworCWVycm9yID0geGZzX2xvY2tfZm9yX3JlbmFtZShzcmNfZHAsIHRhcmdldF9kcCwgc3JjX3ZuYW1lLAorCQkJdGFyZ2V0X3ZuYW1lLCAmc3JjX2lwLCAmdGFyZ2V0X2lwLCBpbm9kZXMsCisJCQkmbnVtX2lub2Rlcyk7CisKKwlpZiAoZXJyb3IpIHsKKwkJcmVuYW1lX3doaWNoX2Vycm9yX3JldHVybiA9IF9fTElORV9fOworCQkvKgorCQkgKiBXZSBoYXZlIG5vdGhpbmcgbG9ja2VkLCBubyBpbm9kZSByZWZlcmVuY2VzLCBhbmQKKwkJICogbm8gdHJhbnNhY3Rpb24sIHNvIGp1c3QgZ2V0IG91dC4KKwkJICovCisJCWdvdG8gc3RkX3JldHVybjsKKwl9CisKKwlBU1NFUlQoc3JjX2lwICE9IE5VTEwpOworCisJaWYgKChzcmNfaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKSB7CisJCS8qCisJCSAqIENoZWNrIGZvciBsaW5rIGNvdW50IG92ZXJmbG93IG9uIHRhcmdldF9kcAorCQkgKi8KKwkJaWYgKHRhcmdldF9pcCA9PSBOVUxMICYmIChzcmNfZHAgIT0gdGFyZ2V0X2RwKSAmJgorCQkgICAgdGFyZ2V0X2RwLT5pX2QuZGlfbmxpbmsgPj0gWEZTX01BWExJTkspIHsKKwkJCXJlbmFtZV93aGljaF9lcnJvcl9yZXR1cm4gPSBfX0xJTkVfXzsKKwkJCWVycm9yID0gWEZTX0VSUk9SKEVNTElOSyk7CisJCQl4ZnNfcmVuYW1lX3VubG9jazQoaW5vZGVzLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwkJCWdvdG8gcmVsZV9yZXR1cm47CisJCX0KKwl9CisKKwluZXdfcGFyZW50ID0gKHNyY19kcCAhPSB0YXJnZXRfZHApOworCXNyY19pc19kaXJlY3RvcnkgPSAoKHNyY19pcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZESVIpOworCisJLyoKKwkgKiBEcm9wIHRoZSBsb2NrcyBvbiBvdXIgaW5vZGVzIHNvIHRoYXQgd2UgY2FuIHN0YXJ0IHRoZSB0cmFuc2FjdGlvbi4KKwkgKi8KKwl4ZnNfcmVuYW1lX3VubG9jazQoaW5vZGVzLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKworCVhGU19CTUFQX0lOSVQoJmZyZWVfbGlzdCwgJmZpcnN0X2Jsb2NrKTsKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1JFTkFNRSk7CisJY2FuY2VsX2ZsYWdzID0gWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUzsKKwlzcGFjZXJlcyA9IFhGU19SRU5BTUVfU1BBQ0VfUkVTKG1wLCB0YXJnZXRfbmFtZWxlbik7CisJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgc3BhY2VyZXMsIFhGU19SRU5BTUVfTE9HX1JFUyhtcCksIDAsCisJCQlYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLCBYRlNfUkVOQU1FX0xPR19DT1VOVCk7CisJaWYgKGVycm9yID09IEVOT1NQQykgeworCQlzcGFjZXJlcyA9IDA7CisJCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIFhGU19SRU5BTUVfTE9HX1JFUyhtcCksIDAsCisJCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywgWEZTX1JFTkFNRV9MT0dfQ09VTlQpOworCX0KKwlpZiAoZXJyb3IpIHsKKwkJcmVuYW1lX3doaWNoX2Vycm9yX3JldHVybiA9IF9fTElORV9fOworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKKwkJZ290byByZWxlX3JldHVybjsKKwl9CisKKwkvKgorCSAqIEF0dGFjaCB0aGUgZHF1b3RzIHRvIHRoZSBpbm9kZXMKKwkgKi8KKwlpZiAoKGVycm9yID0gWEZTX1FNX0RRVk9QUkVOQU1FKG1wLCBpbm9kZXMpKSkgeworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBjYW5jZWxfZmxhZ3MpOworCQlyZW5hbWVfd2hpY2hfZXJyb3JfcmV0dXJuID0gX19MSU5FX187CisJCWdvdG8gcmVsZV9yZXR1cm47CisJfQorCisJLyoKKwkgKiBSZWFjcXVpcmUgdGhlIGlub2RlIGxvY2tzIHdlIGRyb3BwZWQgYWJvdmUuCisJICovCisJeGZzX2xvY2tfaW5vZGVzKGlub2RlcywgbnVtX2lub2RlcywgMCwgWEZTX0lMT0NLX0VYQ0wpOworCisJLyoKKwkgKiBKb2luIGFsbCB0aGUgaW5vZGVzIHRvIHRoZSB0cmFuc2FjdGlvbi4gRnJvbSB0aGlzIHBvaW50IG9uLAorCSAqIHdlIGNhbiByZWx5IG9uIGVpdGhlciB0cmFuc19jb21taXQgb3IgdHJhbnNfY2FuY2VsIHRvIHVubG9jaworCSAqIHRoZW0uICBOb3RlIHRoYXQgd2UgbmVlZCB0byBhZGQgYSB2bm9kZSByZWZlcmVuY2UgdG8gdGhlCisJICogZGlyZWN0b3JpZXMgc2luY2UgdHJhbnNfY29tbWl0ICYgdHJhbnNfY2FuY2VsIHdpbGwgZGVjcmVtZW50CisJICogdGhlbSB3aGVuIHRoZXkgdW5sb2NrIHRoZSBpbm9kZXMuICBBbHNvLCB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwKKwkgKiBub3QgdG8gYWRkIGFuIGlub2RlIHRvIHRoZSB0cmFuc2FjdGlvbiBtb3JlIHRoYW4gb25jZS4KKwkgKi8KKwlWTl9IT0xEKHNyY19kaXJfdnApOworCXhmc190cmFuc19pam9pbih0cCwgc3JjX2RwLCBYRlNfSUxPQ0tfRVhDTCk7CisJaWYgKG5ld19wYXJlbnQpIHsKKwkJVk5fSE9MRCh0YXJnZXRfZGlyX3ZwKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCB0YXJnZXRfZHAsIFhGU19JTE9DS19FWENMKTsKKwl9CisJaWYgKChzcmNfaXAgIT0gc3JjX2RwKSAmJiAoc3JjX2lwICE9IHRhcmdldF9kcCkpIHsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBzcmNfaXAsIFhGU19JTE9DS19FWENMKTsKKwl9CisJaWYgKCh0YXJnZXRfaXAgIT0gTlVMTCkgJiYKKwkgICAgKHRhcmdldF9pcCAhPSBzcmNfaXApICYmCisJICAgICh0YXJnZXRfaXAgIT0gc3JjX2RwKSAmJgorCSAgICAodGFyZ2V0X2lwICE9IHRhcmdldF9kcCkpIHsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCB0YXJnZXRfaXAsIFhGU19JTE9DS19FWENMKTsKKwl9CisKKwkvKgorCSAqIFNldCB1cCB0aGUgdGFyZ2V0LgorCSAqLworCWlmICh0YXJnZXRfaXAgPT0gTlVMTCkgeworCQkvKgorCQkgKiBJZiB0aGVyZSdzIG5vIHNwYWNlIHJlc2VydmF0aW9uLCBjaGVjayB0aGUgZW50cnkgd2lsbAorCQkgKiBmaXQgYmVmb3JlIGFjdHVhbGx5IGluc2VydGluZyBpdC4KKwkJICovCisJCWlmIChzcGFjZXJlcyA9PSAwICYmCisJCSAgICAoZXJyb3IgPSBYRlNfRElSX0NBTkVOVEVSKG1wLCB0cCwgdGFyZ2V0X2RwLCB0YXJnZXRfbmFtZSwKKwkJCQl0YXJnZXRfbmFtZWxlbikpKSB7CisJCQlyZW5hbWVfd2hpY2hfZXJyb3JfcmV0dXJuID0gX19MSU5FX187CisJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCQkvKgorCQkgKiBJZiB0YXJnZXQgZG9lcyBub3QgZXhpc3QgYW5kIHRoZSByZW5hbWUgY3Jvc3NlcworCQkgKiBkaXJlY3RvcmllcywgYWRqdXN0IHRoZSB0YXJnZXQgZGlyZWN0b3J5IGxpbmsgY291bnQKKwkJICogdG8gYWNjb3VudCBmb3IgdGhlICIuLiIgcmVmZXJlbmNlIGZyb20gdGhlIG5ldyBlbnRyeS4KKwkJICovCisJCWVycm9yID0gWEZTX0RJUl9DUkVBVEVOQU1FKG1wLCB0cCwgdGFyZ2V0X2RwLCB0YXJnZXRfbmFtZSwKKwkJCQkJICAgdGFyZ2V0X25hbWVsZW4sIHNyY19pcC0+aV9pbm8sCisJCQkJCSAgICZmaXJzdF9ibG9jaywgJmZyZWVfbGlzdCwgc3BhY2VyZXMpOworCQlpZiAoZXJyb3IgPT0gRU5PU1BDKSB7CisJCQlyZW5hbWVfd2hpY2hfZXJyb3JfcmV0dXJuID0gX19MSU5FX187CisJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCQlpZiAoZXJyb3IpIHsKKwkJCXJlbmFtZV93aGljaF9lcnJvcl9yZXR1cm4gPSBfX0xJTkVfXzsKKwkJCWdvdG8gYWJvcnRfcmV0dXJuOworCQl9CisJCXhmc19pY2hndGltZSh0YXJnZXRfZHAsIFhGU19JQ0hHVElNRV9NT0QgfCBYRlNfSUNIR1RJTUVfQ0hHKTsKKworCQlpZiAobmV3X3BhcmVudCAmJiBzcmNfaXNfZGlyZWN0b3J5KSB7CisJCQllcnJvciA9IHhmc19idW1wbGluayh0cCwgdGFyZ2V0X2RwKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXJlbmFtZV93aGljaF9lcnJvcl9yZXR1cm4gPSBfX0xJTkVfXzsKKwkJCQlnb3RvIGFib3J0X3JldHVybjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7IC8qIHRhcmdldF9pcCAhPSBOVUxMICovCisKKwkJLyoKKwkJICogSWYgdGFyZ2V0IGV4aXN0cyBhbmQgaXQncyBhIGRpcmVjdG9yeSwgY2hlY2sgdGhhdCBib3RoCisJCSAqIHRhcmdldCBhbmQgc291cmNlIGFyZSBkaXJlY3RvcmllcyBhbmQgdGhhdCB0YXJnZXQgY2FuIGJlCisJCSAqIGRlc3Ryb3llZCwgb3IgdGhhdCBuZWl0aGVyIGlzIGEgZGlyZWN0b3J5LgorCQkgKi8KKwkJaWYgKCh0YXJnZXRfaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKSB7CisJCQkvKgorCQkJICogTWFrZSBzdXJlIHRhcmdldCBkaXIgaXMgZW1wdHkuCisJCQkgKi8KKwkJCWlmICghKFhGU19ESVJfSVNFTVBUWSh0YXJnZXRfaXAtPmlfbW91bnQsIHRhcmdldF9pcCkpIHx8CisJCQkgICAgKHRhcmdldF9pcC0+aV9kLmRpX25saW5rID4gMikpIHsKKwkJCQllcnJvciA9IFhGU19FUlJPUihFRVhJU1QpOworCQkJCXJlbmFtZV93aGljaF9lcnJvcl9yZXR1cm4gPSBfX0xJTkVfXzsKKwkJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIExpbmsgdGhlIHNvdXJjZSBpbm9kZSB1bmRlciB0aGUgdGFyZ2V0IG5hbWUuCisJCSAqIElmIHRoZSBzb3VyY2UgaW5vZGUgaXMgYSBkaXJlY3RvcnkgYW5kIHdlIGFyZSBtb3ZpbmcKKwkJICogaXQgYWNyb3NzIGRpcmVjdG9yaWVzLCBpdHMgIi4uIiBlbnRyeSB3aWxsIGJlCisJCSAqIGluY29uc2lzdGVudCB1bnRpbCB3ZSByZXBsYWNlIHRoYXQgZG93biBiZWxvdy4KKwkJICoKKwkJICogSW4gY2FzZSB0aGVyZSBpcyBhbHJlYWR5IGFuIGVudHJ5IHdpdGggdGhlIHNhbWUKKwkJICogbmFtZSBhdCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LCByZW1vdmUgaXQgZmlyc3QuCisJCSAqLworCQllcnJvciA9IFhGU19ESVJfUkVQTEFDRShtcCwgdHAsIHRhcmdldF9kcCwgdGFyZ2V0X25hbWUsCisJCQl0YXJnZXRfbmFtZWxlbiwgc3JjX2lwLT5pX2lubywgJmZpcnN0X2Jsb2NrLAorCQkJJmZyZWVfbGlzdCwgc3BhY2VyZXMpOworCQlpZiAoZXJyb3IpIHsKKwkJCXJlbmFtZV93aGljaF9lcnJvcl9yZXR1cm4gPSBfX0xJTkVfXzsKKwkJCWdvdG8gYWJvcnRfcmV0dXJuOworCQl9CisJCXhmc19pY2hndGltZSh0YXJnZXRfZHAsIFhGU19JQ0hHVElNRV9NT0QgfCBYRlNfSUNIR1RJTUVfQ0hHKTsKKworCQkvKgorCQkgKiBEZWNyZW1lbnQgdGhlIGxpbmsgY291bnQgb24gdGhlIHRhcmdldCBzaW5jZSB0aGUgdGFyZ2V0CisJCSAqIGRpciBubyBsb25nZXIgcG9pbnRzIHRvIGl0LgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfZHJvcGxpbmsodHAsIHRhcmdldF9pcCk7CisJCWlmIChlcnJvcikgeworCQkJcmVuYW1lX3doaWNoX2Vycm9yX3JldHVybiA9IF9fTElORV9fOworCQkJZ290byBhYm9ydF9yZXR1cm47CisJCX0KKwkJdGFyZ2V0X2lwX2Ryb3BwZWQgPSAxOworCisJCWlmIChzcmNfaXNfZGlyZWN0b3J5KSB7CisJCQkvKgorCQkJICogRHJvcCB0aGUgbGluayBmcm9tIHRoZSBvbGQgIi4iIGVudHJ5LgorCQkJICovCisJCQllcnJvciA9IHhmc19kcm9wbGluayh0cCwgdGFyZ2V0X2lwKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXJlbmFtZV93aGljaF9lcnJvcl9yZXR1cm4gPSBfX0xJTkVfXzsKKwkJCQlnb3RvIGFib3J0X3JldHVybjsKKwkJCX0KKwkJfQorCisJCS8qIERvIHRoaXMgdGVzdCB3aGlsZSB3ZSBzdGlsbCBob2xkIHRoZSBsb2NrcyAqLworCQl0YXJnZXRfbGlua196ZXJvID0gKHRhcmdldF9pcCktPmlfZC5kaV9ubGluaz09MDsKKworCX0gLyogdGFyZ2V0X2lwICE9IE5VTEwgKi8KKworCS8qCisJICogUmVtb3ZlIHRoZSBzb3VyY2UuCisJICovCisJaWYgKG5ld19wYXJlbnQgJiYgc3JjX2lzX2RpcmVjdG9yeSkgeworCisJCS8qCisJCSAqIFJld3JpdGUgdGhlICIuLiIgZW50cnkgdG8gcG9pbnQgdG8gdGhlIG5ldworCQkgKiBkaXJlY3RvcnkuCisJCSAqLworCQllcnJvciA9IFhGU19ESVJfUkVQTEFDRShtcCwgdHAsIHNyY19pcCwgIi4uIiwgMiwKKwkJCQkJdGFyZ2V0X2RwLT5pX2lubywgJmZpcnN0X2Jsb2NrLAorCQkJCQkmZnJlZV9saXN0LCBzcGFjZXJlcyk7CisJCUFTU0VSVChlcnJvciAhPSBFRVhJU1QpOworCQlpZiAoZXJyb3IpIHsKKwkJCXJlbmFtZV93aGljaF9lcnJvcl9yZXR1cm4gPSBfX0xJTkVfXzsKKwkJCWdvdG8gYWJvcnRfcmV0dXJuOworCQl9CisJCXhmc19pY2hndGltZShzcmNfaXAsIFhGU19JQ0hHVElNRV9NT0QgfCBYRlNfSUNIR1RJTUVfQ0hHKTsKKworCX0gZWxzZSB7CisJCS8qCisJCSAqIFdlIGFsd2F5cyB3YW50IHRvIGhpdCB0aGUgY3RpbWUgb24gdGhlIHNvdXJjZSBpbm9kZS4KKwkJICogV2UgZG8gaXQgaW4gdGhlIGlmIGNsYXVzZSBhYm92ZSBmb3IgdGhlICduZXdfcGFyZW50ICYmCisJCSAqIHNyY19pc19kaXJlY3RvcnknIGNhc2UsIGFuZCBoZXJlIHdlIGdldCBhbGwgdGhlIG90aGVyCisJCSAqIGNhc2VzLiAgVGhpcyBpc24ndCBzdHJpY3RseSByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmRzCisJCSAqIHNpbmNlIHRoZSBzb3VyY2UgaW5vZGUgaXNuJ3QgcmVhbGx5IGJlaW5nIGNoYW5nZWQsCisJCSAqIGJ1dCBvbGQgdW5peCBmaWxlIHN5c3RlbXMgZGlkIGl0IGFuZCBzb21lIGluY3JlbWVudGFsCisJCSAqIGJhY2t1cCBwcm9ncmFtcyB3b24ndCB3b3JrIHdpdGhvdXQgaXQuCisJCSAqLworCQl4ZnNfaWNoZ3RpbWUoc3JjX2lwLCBYRlNfSUNIR1RJTUVfQ0hHKTsKKwl9CisKKwkvKgorCSAqIEFkanVzdCB0aGUgbGluayBjb3VudCBvbiBzcmNfZHAuICBUaGlzIGlzIG5lY2Vzc2FyeSB3aGVuCisJICogcmVuYW1pbmcgYSBkaXJlY3RvcnksIGVpdGhlciB3aXRoaW4gb25lIHBhcmVudCB3aGVuCisJICogdGhlIHRhcmdldCBleGlzdGVkLCBvciBhY3Jvc3MgdHdvIHBhcmVudCBkaXJlY3Rvcmllcy4KKwkgKi8KKwlpZiAoc3JjX2lzX2RpcmVjdG9yeSAmJiAobmV3X3BhcmVudCB8fCB0YXJnZXRfaXAgIT0gTlVMTCkpIHsKKworCQkvKgorCQkgKiBEZWNyZW1lbnQgbGluayBjb3VudCBvbiBzcmNfZGlyZWN0b3J5IHNpbmNlIHRoZQorCQkgKiBlbnRyeSB0aGF0J3MgbW92ZWQgbm8gbG9uZ2VyIHBvaW50cyB0byBpdC4KKwkJICovCisJCWVycm9yID0geGZzX2Ryb3BsaW5rKHRwLCBzcmNfZHApOworCQlpZiAoZXJyb3IpIHsKKwkJCXJlbmFtZV93aGljaF9lcnJvcl9yZXR1cm4gPSBfX0xJTkVfXzsKKwkJCWdvdG8gYWJvcnRfcmV0dXJuOworCQl9CisJfQorCisJZXJyb3IgPSBYRlNfRElSX1JFTU9WRU5BTUUobXAsIHRwLCBzcmNfZHAsIHNyY19uYW1lLCBzcmNfbmFtZWxlbiwKKwkJCXNyY19pcC0+aV9pbm8sICZmaXJzdF9ibG9jaywgJmZyZWVfbGlzdCwgc3BhY2VyZXMpOworCWlmIChlcnJvcikgeworCQlyZW5hbWVfd2hpY2hfZXJyb3JfcmV0dXJuID0gX19MSU5FX187CisJCWdvdG8gYWJvcnRfcmV0dXJuOworCX0KKwl4ZnNfaWNoZ3RpbWUoc3JjX2RwLCBYRlNfSUNIR1RJTUVfTU9EIHwgWEZTX0lDSEdUSU1FX0NIRyk7CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgZ2VuZXJhdGlvbiBjb3VudHMgb24gYWxsIHRoZSBkaXJlY3RvcnkgaW5vZGVzCisJICogdGhhdCB3ZSdyZSBtb2RpZnlpbmcuCisJICovCisJc3JjX2RwLT5pX2dlbisrOworCXhmc190cmFuc19sb2dfaW5vZGUodHAsIHNyY19kcCwgWEZTX0lMT0dfQ09SRSk7CisKKwlpZiAobmV3X3BhcmVudCkgeworCQl0YXJnZXRfZHAtPmlfZ2VuKys7CisJCXhmc190cmFuc19sb2dfaW5vZGUodHAsIHRhcmdldF9kcCwgWEZTX0lMT0dfQ09SRSk7CisJfQorCisJLyoKKwkgKiBJZiB0aGVyZSB3YXMgYSB0YXJnZXQgaW5vZGUsIHRha2UgYW4gZXh0cmEgcmVmZXJlbmNlIG9uCisJICogaXQgaGVyZSBzbyB0aGF0IGl0IGRvZXNuJ3QgZ28gdG8geGZzX2luYWN0aXZlKCkgZnJvbQorCSAqIHdpdGhpbiB0aGUgY29tbWl0LgorCSAqLworCWlmICh0YXJnZXRfaXAgIT0gTlVMTCkgeworCQlJSE9MRCh0YXJnZXRfaXApOworCX0KKworCS8qCisJICogSWYgdGhpcyBpcyBhIHN5bmNocm9ub3VzIG1vdW50LCBtYWtlIHN1cmUgdGhhdCB0aGUKKwkgKiByZW5hbWUgdHJhbnNhY3Rpb24gZ29lcyB0byBkaXNrIGJlZm9yZSByZXR1cm5pbmcgdG8KKwkgKiB0aGUgdXNlci4KKwkgKi8KKwlpZiAobXAtPm1fZmxhZ3MgJiAoWEZTX01PVU5UX1dTWU5DfFhGU19NT1VOVF9ESVJTWU5DKSkgeworCQl4ZnNfdHJhbnNfc2V0X3N5bmModHApOworCX0KKworCS8qCisJICogVGFrZSByZWZzLiBmb3Igdm9wX2xpbmtfcmVtb3ZlZCBjYWxscyBiZWxvdy4gIE5vIG5lZWQgdG8gd29ycnkKKwkgKiBhYm91dCBkaXJlY3RvcnkgcmVmcy4gYmVjYXVzZSB0aGUgY2FsbGVyIGhvbGRzIHRoZW0uCisJICoKKwkgKiBEbyBob2xkcyBiZWZvcmUgdGhlIHhmc19ibWFwX2ZpbmlzaCBzaW5jZSBpdCBtaWdodCByZWxlIHRoZW0gZG93bgorCSAqIHRvIHplcm8uCisJICovCisKKwlpZiAodGFyZ2V0X2lwX2Ryb3BwZWQpCisJCUlIT0xEKHRhcmdldF9pcCk7CisJSUhPTEQoc3JjX2lwKTsKKworCWVycm9yID0geGZzX2JtYXBfZmluaXNoKCZ0cCwgJmZyZWVfbGlzdCwgZmlyc3RfYmxvY2ssICZjb21taXR0ZWQpOworCWlmIChlcnJvcikgeworCQl4ZnNfYm1hcF9jYW5jZWwoJmZyZWVfbGlzdCk7CisJCXhmc190cmFuc19jYW5jZWwodHAsIChYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTIHwKKwkJCQkgWEZTX1RSQU5TX0FCT1JUKSk7CisJCWlmICh0YXJnZXRfaXAgIT0gTlVMTCkgeworCQkJSVJFTEUodGFyZ2V0X2lwKTsKKwkJfQorCQlpZiAodGFyZ2V0X2lwX2Ryb3BwZWQpIHsKKwkJCUlSRUxFKHRhcmdldF9pcCk7CisJCX0KKwkJSVJFTEUoc3JjX2lwKTsKKwkJZ290byBzdGRfcmV0dXJuOworCX0KKworCS8qCisJICogdHJhbnNfY29tbWl0IHdpbGwgdW5sb2NrIHNyY19pcCwgdGFyZ2V0X2lwICYgZGVjcmVtZW50CisJICogdGhlIHZub2RlIHJlZmVyZW5jZXMuCisJICovCisJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTLCBOVUxMKTsKKwlpZiAodGFyZ2V0X2lwICE9IE5VTEwpIHsKKwkJeGZzX3JlZmNhY2hlX3B1cmdlX2lwKHRhcmdldF9pcCk7CisJCUlSRUxFKHRhcmdldF9pcCk7CisJfQorCS8qCisJICogTGV0IGludGVycG9zZWQgZmlsZSBzeXN0ZW1zIGtub3cgYWJvdXQgcmVtb3ZlZCBsaW5rcy4KKwkgKi8KKwlpZiAodGFyZ2V0X2lwX2Ryb3BwZWQpIHsKKwkJVk9QX0xJTktfUkVNT1ZFRChYRlNfSVRPVih0YXJnZXRfaXApLCB0YXJnZXRfZGlyX3ZwLAorCQkJCQl0YXJnZXRfbGlua196ZXJvKTsKKwkJSVJFTEUodGFyZ2V0X2lwKTsKKwl9CisKKwlGU0NfTk9USUZZX05BTUVfQ0hBTkdFRChYRlNfSVRPVihzcmNfaXApKTsKKworCUlSRUxFKHNyY19pcCk7CisKKwkvKiBGYWxsIHRocm91Z2ggdG8gc3RkX3JldHVybiB3aXRoIGVycm9yID0gMCBvciBlcnJubyBmcm9tCisJICogeGZzX3RyYW5zX2NvbW1pdAkgKi8KK3N0ZF9yZXR1cm46CisJaWYgKERNX0VWRU5UX0VOQUJMRUQoc3JjX2Rpcl92cC0+dl92ZnNwLCBzcmNfZHAsIERNX0VWRU5UX1BPU1RSRU5BTUUpIHx8CisJICAgIERNX0VWRU5UX0VOQUJMRUQodGFyZ2V0X2Rpcl92cC0+dl92ZnNwLAorCQkJCXRhcmdldF9kcCwgRE1fRVZFTlRfUE9TVFJFTkFNRSkpIHsKKwkJKHZvaWQpIFhGU19TRU5EX05BTUVTUCAobXAsIERNX0VWRU5UX1BPU1RSRU5BTUUsCisJCQkJCXNyY19kaXJfdnAsIERNX1JJR0hUX05VTEwsCisJCQkJCXRhcmdldF9kaXJfdnAsIERNX1JJR0hUX05VTEwsCisJCQkJCXNyY19uYW1lLCB0YXJnZXRfbmFtZSwKKwkJCQkJMCwgZXJyb3IsIDApOworCX0KKwlyZXR1cm4gZXJyb3I7CisKKyBhYm9ydF9yZXR1cm46CisJY2FuY2VsX2ZsYWdzIHw9IFhGU19UUkFOU19BQk9SVDsKKwkvKiBGQUxMVEhST1VHSCAqLworIGVycm9yX3JldHVybjoKKwl4ZnNfYm1hcF9jYW5jZWwoJmZyZWVfbGlzdCk7CisJeGZzX3RyYW5zX2NhbmNlbCh0cCwgY2FuY2VsX2ZsYWdzKTsKKwlnb3RvIHN0ZF9yZXR1cm47CisKKyByZWxlX3JldHVybjoKKwlJUkVMRShzcmNfaXApOworCWlmICh0YXJnZXRfaXAgIT0gTlVMTCkgeworCQlJUkVMRSh0YXJnZXRfaXApOworCX0KKwlnb3RvIHN0ZF9yZXR1cm47Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3J0YWxsb2MuYyBiL2ZzL3hmcy94ZnNfcnRhbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMzc4MjIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX3J0YWxsb2MuYwpAQCAtMCwwICsxLDI0NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKy8qCisgKiBGcmVlIHJlYWx0aW1lIHNwYWNlIGFsbG9jYXRpb24gZm9yIFhGUy4KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgorI2luY2x1ZGUgInhmc19mc29wcy5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zX3NwYWNlLmgiCisKKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIGludGVybmFsIGZ1bmN0aW9ucy4KKyAqLworCisKK1NUQVRJQyBpbnQgeGZzX3J0YWxsb2NhdGVfcmFuZ2UoeGZzX21vdW50X3QgKiwgeGZzX3RyYW5zX3QgKiwgeGZzX3J0YmxvY2tfdCwKKwkJeGZzX2V4dGxlbl90LCB4ZnNfYnVmX3QgKiosIHhmc19mc2Jsb2NrX3QgKik7CitTVEFUSUMgaW50IHhmc19ydGFueV9zdW1tYXJ5KHhmc19tb3VudF90ICosIHhmc190cmFuc190ICosIGludCwgaW50LAorCQl4ZnNfcnRibG9ja190LCB4ZnNfYnVmX3QgKiosIHhmc19mc2Jsb2NrX3QgKiwgaW50ICopOworU1RBVElDIGludCB4ZnNfcnRjaGVja19yYW5nZSh4ZnNfbW91bnRfdCAqLCB4ZnNfdHJhbnNfdCAqLCB4ZnNfcnRibG9ja190LAorCQl4ZnNfZXh0bGVuX3QsIGludCwgeGZzX3J0YmxvY2tfdCAqLCBpbnQgKik7CitTVEFUSUMgaW50IHhmc19ydGZpbmRfYmFjayh4ZnNfbW91bnRfdCAqLCB4ZnNfdHJhbnNfdCAqLCB4ZnNfcnRibG9ja190LAorCQl4ZnNfcnRibG9ja190LCB4ZnNfcnRibG9ja190ICopOworU1RBVElDIGludCB4ZnNfcnRmaW5kX2ZvcncoeGZzX21vdW50X3QgKiwgeGZzX3RyYW5zX3QgKiwgeGZzX3J0YmxvY2tfdCwKKwkJeGZzX3J0YmxvY2tfdCwgeGZzX3J0YmxvY2tfdCAqKTsKK1NUQVRJQyBpbnQgeGZzX3J0Z2V0X3N1bW1hcnkoIHhmc19tb3VudF90ICosIHhmc190cmFuc190ICosIGludCwKKwkJeGZzX3J0YmxvY2tfdCwgeGZzX2J1Zl90ICoqLCB4ZnNfZnNibG9ja190ICosIHhmc19zdW1pbmZvX3QgKik7CitTVEFUSUMgaW50IHhmc19ydG1vZGlmeV9yYW5nZSh4ZnNfbW91bnRfdCAqLCB4ZnNfdHJhbnNfdCAqLCB4ZnNfcnRibG9ja190LAorCQl4ZnNfZXh0bGVuX3QsIGludCk7CitTVEFUSUMgaW50IHhmc19ydG1vZGlmeV9zdW1tYXJ5KHhmc19tb3VudF90ICosIHhmc190cmFuc190ICosIGludCwKKwkJeGZzX3J0YmxvY2tfdCwgaW50LCB4ZnNfYnVmX3QgKiosIHhmc19mc2Jsb2NrX3QgKik7CisKKy8qCisgKiBJbnRlcm5hbCBmdW5jdGlvbnMuCisgKi8KKworLyoKKyAqIHhmc19sb3diaXQzMjogZ2V0IGxvdyBiaXQgc2V0IG91dCBvZiAzMi1iaXQgYXJndW1lbnQsIC0xIGlmIG5vbmUgc2V0LgorICovCitTVEFUSUMgaW50Cit4ZnNfbG93Yml0MzIoCisJX191aW50MzJfdAl2KQoreworCWlmICh2KQorCQlyZXR1cm4gZmZzKHYpIC0gMTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBzcGFjZSB0byB0aGUgYml0bWFwIG9yIHN1bW1hcnkgZmlsZSwgYW5kIHplcm8gaXQsIGZvciBncm93ZnMuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ncm93ZnNfcnRfYWxsb2MoCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfZXh0bGVuX3QJb2Jsb2NrcywJLyogb2xkIGNvdW50IG9mIGJsb2NrcyAqLworCXhmc19leHRsZW5fdAluYmxvY2tzLAkvKiBuZXcgY291bnQgb2YgYmxvY2tzICovCisJeGZzX2lub190CWlubykJCS8qIGlub2RlIG51bWJlciAoYml0bWFwL3N1bW1hcnkpICovCit7CisJeGZzX2ZpbGVvZmZfdAlibm87CQkvKiBibG9jayBudW1iZXIgaW4gZmlsZSAqLworCXhmc19idWZfdAkqYnA7CQkvKiB0ZW1wb3JhcnkgYnVmZmVyIGZvciB6ZXJvaW5nICovCisJaW50CQljYW5jZWxmbGFnczsJLyogZmxhZ3MgZm9yIHhmc190cmFuc19jYW5jZWwgKi8KKwlpbnQJCWNvbW1pdHRlZDsJLyogdHJhbnNhY3Rpb24gY29tbWl0dGVkIGZsYWcgKi8KKwl4ZnNfZGFkZHJfdAlkOwkJLyogZGlzayBibG9jayBhZGRyZXNzICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19mc2Jsb2NrX3QJZmlyc3RibG9jazsJLyogZmlyc3QgYmxvY2sgYWxsb2NhdGVkIGluIHhhY3Rpb24gKi8KKwl4ZnNfYm1hcF9mcmVlX3QJZmxpc3Q7CQkvKiBsaXN0IG9mIGZyZWVkIGJsb2NrcyAqLworCXhmc19mc2Jsb2NrX3QJZnNibm87CQkvKiBmaWxlc3lzdGVtIGJsb2NrIGZvciBibm8gKi8KKwl4ZnNfaW5vZGVfdAkqaXA7CQkvKiBwb2ludGVyIHRvIGluY29yZSBpbm9kZSAqLworCXhmc19ibWJ0X2lyZWNfdAltYXA7CQkvKiBibG9jayBtYXAgb3V0cHV0ICovCisJaW50CQlubWFwOwkJLyogbnVtYmVyIG9mIGJsb2NrIG1hcHMgKi8KKwlpbnQJCXJlc2Jsa3M7CS8qIHNwYWNlIHJlc2VydmF0aW9uICovCisJeGZzX3RyYW5zX3QJKnRwOwkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCisJLyoKKwkgKiBBbGxvY2F0ZSBzcGFjZSB0byB0aGUgZmlsZSwgYXMgbmVjZXNzYXJ5LgorCSAqLworCXdoaWxlIChvYmxvY2tzIDwgbmJsb2NrcykgeworCQl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX0dST1dGU1JUX0FMTE9DKTsKKwkJcmVzYmxrcyA9IFhGU19HUk9XRlNSVF9TUEFDRV9SRVMobXAsIG5ibG9ja3MgLSBvYmxvY2tzKTsKKwkJY2FuY2VsZmxhZ3MgPSAwOworCQkvKgorCQkgKiBSZXNlcnZlIHNwYWNlICYgbG9nIGZvciBvbmUgZXh0ZW50IGFkZGVkIHRvIHRoZSBmaWxlLgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCByZXNibGtzLAorCQkJCVhGU19HUk9XUlRBTExPQ19MT0dfUkVTKG1wKSwgMCwKKwkJCQlYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAorCQkJCVhGU19ERUZBVUxUX1BFUk1fTE9HX0NPVU5UKSkpCisJCQlnb3RvIGVycm9yX2V4aXQ7CisJCWNhbmNlbGZsYWdzID0gWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUzsKKwkJLyoKKwkJICogTG9jayB0aGUgaW5vZGUuCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX3RyYW5zX2lnZXQobXAsIHRwLCBpbm8sIDAsIFhGU19JTE9DS19FWENMLCAmaXApKSkKKwkJCWdvdG8gZXJyb3JfZXhpdDsKKwkJWEZTX0JNQVBfSU5JVCgmZmxpc3QsICZmaXJzdGJsb2NrKTsKKwkJLyoKKwkJICogQWxsb2NhdGUgYmxvY2tzIHRvIHRoZSBiaXRtYXAgZmlsZS4KKwkJICovCisJCW5tYXAgPSAxOworCQljYW5jZWxmbGFncyB8PSBYRlNfVFJBTlNfQUJPUlQ7CisJCWVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgb2Jsb2NrcywgbmJsb2NrcyAtIG9ibG9ja3MsCisJCQlYRlNfQk1BUElfV1JJVEUgfCBYRlNfQk1BUElfTUVUQURBVEEsICZmaXJzdGJsb2NrLAorCQkJcmVzYmxrcywgJm1hcCwgJm5tYXAsICZmbGlzdCk7CisJCWlmICghZXJyb3IgJiYgbm1hcCA8IDEpCisJCQllcnJvciA9IFhGU19FUlJPUihFTk9TUEMpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yX2V4aXQ7CisJCS8qCisJCSAqIEZyZWUgYW55IGJsb2NrcyBmcmVlZCB1cCBpbiB0aGUgdHJhbnNhY3Rpb24sIHRoZW4gY29tbWl0LgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJnRwLCAmZmxpc3QsIGZpcnN0YmxvY2ssICZjb21taXR0ZWQpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yX2V4aXQ7CisJCXhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsIE5VTEwpOworCQkvKgorCQkgKiBOb3cgd2UgbmVlZCB0byBjbGVhciB0aGUgYWxsb2NhdGVkIGJsb2Nrcy4KKwkJICogRG8gdGhpcyBvbmUgYmxvY2sgcGVyIHRyYW5zYWN0aW9uLCB0byBrZWVwIGl0IHNpbXBsZS4KKwkJICovCisJCWNhbmNlbGZsYWdzID0gMDsKKwkJZm9yIChibm8gPSBtYXAuYnJfc3RhcnRvZmYsIGZzYm5vID0gbWFwLmJyX3N0YXJ0YmxvY2s7CisJCSAgICAgYm5vIDwgbWFwLmJyX3N0YXJ0b2ZmICsgbWFwLmJyX2Jsb2NrY291bnQ7CisJCSAgICAgYm5vKyssIGZzYm5vKyspIHsKKwkJCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfR1JPV0ZTUlRfWkVSTyk7CisJCQkvKgorCQkJICogUmVzZXJ2ZSBsb2cgZm9yIG9uZSBibG9jayB6ZXJvaW5nLgorCQkJICovCisJCQlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsCisJCQkJCVhGU19HUk9XUlRaRVJPX0xPR19SRVMobXApLCAwLCAwLCAwKSkpCisJCQkJZ290byBlcnJvcl9leGl0OworCQkJLyoKKwkJCSAqIExvY2sgdGhlIGJpdG1hcCBpbm9kZS4KKwkJCSAqLworCQkJaWYgKChlcnJvciA9IHhmc190cmFuc19pZ2V0KG1wLCB0cCwgaW5vLCAwLCBYRlNfSUxPQ0tfRVhDTCwKKwkJCQkJJmlwKSkpCisJCQkJZ290byBlcnJvcl9leGl0OworCQkJLyoKKwkJCSAqIEdldCBhIGJ1ZmZlciBmb3IgdGhlIGJsb2NrLgorCQkJICovCisJCQlkID0gWEZTX0ZTQl9UT19EQUREUihtcCwgZnNibm8pOworCQkJYnAgPSB4ZnNfdHJhbnNfZ2V0X2J1Zih0cCwgbXAtPm1fZGRldl90YXJncCwgZCwKKwkJCQltcC0+bV9ic2l6ZSwgMCk7CisJCQlpZiAoYnAgPT0gTlVMTCkgeworCQkJCWVycm9yID0gWEZTX0VSUk9SKEVJTyk7CisJCQkJZ290byBlcnJvcl9leGl0OworCQkJfQorCQkJbWVtc2V0KFhGU19CVUZfUFRSKGJwKSwgMCwgbXAtPm1fc2Iuc2JfYmxvY2tzaXplKTsKKwkJCXhmc190cmFuc19sb2dfYnVmKHRwLCBicCwgMCwgbXAtPm1fc2Iuc2JfYmxvY2tzaXplIC0gMSk7CisJCQkvKgorCQkJICogQ29tbWl0IHRoZSB0cmFuc2FjdGlvbi4KKwkJCSAqLworCQkJeGZzX3RyYW5zX2NvbW1pdCh0cCwgMCwgTlVMTCk7CisJCX0KKwkJLyoKKwkJICogR28gb24gdG8gdGhlIG5leHQgZXh0ZW50LCBpZiBhbnkuCisJCSAqLworCQlvYmxvY2tzID0gbWFwLmJyX3N0YXJ0b2ZmICsgbWFwLmJyX2Jsb2NrY291bnQ7CisJfQorCXJldHVybiAwOworZXJyb3JfZXhpdDoKKwl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBjYW5jZWxmbGFncyk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogQXR0ZW1wdCB0byBhbGxvY2F0ZSBhbiBleHRlbnQgbWlubGVuPD1sZW48PW1heGxlbiBzdGFydGluZyBmcm9tCisgKiBiaXRtYXAgYmxvY2sgYmJuby4gIElmIHdlIGRvbid0IGdldCBtYXhsZW4gdGhlbiB1c2UgcHJvZCB0byB0cmltCisgKiB0aGUgbGVuZ3RoLCBpZiBnaXZlbi4gIFJldHVybnMgZXJyb3I7IHJldHVybnMgc3RhcnRpbmcgYmxvY2sgaW4gKnJ0YmxvY2suCisgKiBUaGUgbGVuZ3RocyBhcmUgYWxsIGluIHJ0ZXh0ZW50cy4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX3J0YWxsb2NhdGVfZXh0ZW50X2Jsb2NrKAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19ydGJsb2NrX3QJYmJubywJCS8qIGJpdG1hcCBibG9jayBudW1iZXIgKi8KKwl4ZnNfZXh0bGVuX3QJbWlubGVuLAkJLyogbWluaW11bSBsZW5ndGggdG8gYWxsb2NhdGUgKi8KKwl4ZnNfZXh0bGVuX3QJbWF4bGVuLAkJLyogbWF4aW11bSBsZW5ndGggdG8gYWxsb2NhdGUgKi8KKwl4ZnNfZXh0bGVuX3QJKmxlbiwJCS8qIG91dDogYWN0dWFsIGxlbmd0aCBhbGxvY2F0ZWQgKi8KKwl4ZnNfcnRibG9ja190CSpuZXh0cCwJCS8qIG91dDogbmV4dCBibG9jayB0byB0cnkgKi8KKwl4ZnNfYnVmX3QJKipyYnBwLAkJLyogaW4vb3V0OiBzdW1tYXJ5IGJsb2NrIGJ1ZmZlciAqLworCXhmc19mc2Jsb2NrX3QJKnJzYiwJCS8qIGluL291dDogc3VtbWFyeSBibG9jayBudW1iZXIgKi8KKwl4ZnNfZXh0bGVuX3QJcHJvZCwJCS8qIGV4dGVudCBwcm9kdWN0IGZhY3RvciAqLworCXhmc19ydGJsb2NrX3QJKnJ0YmxvY2spCS8qIG91dDogc3RhcnQgYmxvY2sgYWxsb2NhdGVkICovCit7CisJeGZzX3J0YmxvY2tfdAliZXN0aTsJCS8qIGJlc3QgcnRibG9jayBmb3VuZCBzbyBmYXIgKi8KKwl4ZnNfcnRibG9ja190CWJlc3RsZW47CS8qIGJlc3QgbGVuZ3RoIGZvdW5kIHNvIGZhciAqLworCXhmc19ydGJsb2NrX3QJZW5kOwkJLyogbGFzdCBydGJsb2NrIGluIGNodW5rICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHZhbHVlICovCisJeGZzX3J0YmxvY2tfdAlpOwkJLyogY3VycmVudCBydGJsb2NrIHRyeWluZyAqLworCXhmc19ydGJsb2NrX3QJbmV4dDsJCS8qIG5leHQgcnRibG9jayB0byB0cnkgKi8KKwlpbnQJCXN0YXQ7CQkvKiBzdGF0dXMgZnJvbSBpbnRlcm5hbCBjYWxscyAqLworCisJLyoKKwkgKiBMb29wIG92ZXIgYWxsIHRoZSBleHRlbnRzIHN0YXJ0aW5nIGluIHRoaXMgYml0bWFwIGJsb2NrLAorCSAqIGxvb2tpbmcgZm9yIG9uZSB0aGF0J3MgbG9uZyBlbm91Z2guCisJICovCisJZm9yIChpID0gWEZTX0JMT0NLVE9CSVQobXAsIGJibm8pLCBiZXN0aSA9IC0xLCBiZXN0bGVuID0gMCwKKwkJZW5kID0gWEZTX0JMT0NLVE9CSVQobXAsIGJibm8gKyAxKSAtIDE7CisJICAgICBpIDw9IGVuZDsKKwkgICAgIGkrKykgeworCQkvKgorCQkgKiBTZWUgaWYgdGhlcmUncyBhIGZyZWUgZXh0ZW50IG9mIG1heGxlbiBzdGFydGluZyBhdCBpLgorCQkgKiBJZiBpdCdzIG5vdCBzbyB0aGVuIG5leHQgd2lsbCBjb250YWluIHRoZSBmaXJzdCBub24tZnJlZS4KKwkJICovCisJCWVycm9yID0geGZzX3J0Y2hlY2tfcmFuZ2UobXAsIHRwLCBpLCBtYXhsZW4sIDEsICZuZXh0LCAmc3RhdCk7CisJCWlmIChlcnJvcikgeworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCWlmIChzdGF0KSB7CisJCQkvKgorCQkJICogaSBmb3IgbWF4bGVuIGlzIGFsbCBmcmVlLCBhbGxvY2F0ZSBhbmQgcmV0dXJuIHRoYXQuCisJCQkgKi8KKwkJCWVycm9yID0geGZzX3J0YWxsb2NhdGVfcmFuZ2UobXAsIHRwLCBpLCBtYXhsZW4sIHJicHAsCisJCQkJcnNiKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCSpsZW4gPSBtYXhsZW47CisJCQkqcnRibG9jayA9IGk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKgorCQkgKiBJbiB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIGEgdmFyaWFibGUtc2l6ZWQgYWxsb2NhdGlvbgorCQkgKiByZXF1ZXN0LCBmaWd1cmUgb3V0IGhvdyBiaWcgdGhpcyBmcmVlIHBpZWNlIGlzLAorCQkgKiBhbmQgaWYgaXQncyBiaWcgZW5vdWdoIGZvciB0aGUgbWluaW11bSwgYW5kIHRoZSBiZXN0CisJCSAqIHNvIGZhciwgcmVtZW1iZXIgaXQuCisJCSAqLworCQlpZiAobWlubGVuIDwgbWF4bGVuKSB7CisJCQl4ZnNfcnRibG9ja190CXRoaXNsZW47CS8qIHRoaXMgZXh0ZW50IHNpemUgKi8KKworCQkJdGhpc2xlbiA9IG5leHQgLSBpOworCQkJaWYgKHRoaXNsZW4gPj0gbWlubGVuICYmIHRoaXNsZW4gPiBiZXN0bGVuKSB7CisJCQkJYmVzdGkgPSBpOworCQkJCWJlc3RsZW4gPSB0aGlzbGVuOworCQkJfQorCQl9CisJCS8qCisJCSAqIElmIG5vdCBkb25lIHlldCwgZmluZCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgZnJlZSBzcGFjZS4KKwkJICovCisJCWlmIChuZXh0IDwgZW5kKSB7CisJCQllcnJvciA9IHhmc19ydGZpbmRfZm9ydyhtcCwgdHAsIG5leHQsIGVuZCwgJmkpOworCQkJaWYgKGVycm9yKSB7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKwkvKgorCSAqIFNlYXJjaGVkIHRoZSB3aG9sZSB0aGluZyAmIGRpZG4ndCBmaW5kIGEgbWF4bGVuIGZyZWUgZXh0ZW50LgorCSAqLworCWlmIChtaW5sZW4gPCBtYXhsZW4gJiYgYmVzdGkgIT0gLTEpIHsKKwkJeGZzX2V4dGxlbl90CXA7CS8qIGFtb3VudCB0byB0cmltIGxlbmd0aCBieSAqLworCisJCS8qCisJCSAqIElmIHNpemUgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgcHJvZCwgbWFrZSB0aGF0IHNvLgorCQkgKi8KKwkJaWYgKHByb2QgPiAxICYmIChwID0gZG9fbW9kKGJlc3RsZW4sIHByb2QpKSkKKwkJCWJlc3RsZW4gLT0gcDsKKwkJLyoKKwkJICogQWxsb2NhdGUgYmVzdGkgZm9yIGJlc3RsZW4gJiByZXR1cm4gdGhhdC4KKwkJICovCisJCWVycm9yID0geGZzX3J0YWxsb2NhdGVfcmFuZ2UobXAsIHRwLCBiZXN0aSwgYmVzdGxlbiwgcmJwcCwgcnNiKTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJKmxlbiA9IGJlc3RsZW47CisJCSpydGJsb2NrID0gYmVzdGk7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIEFsbG9jYXRpb24gZmFpbGVkLiAgU2V0ICpuZXh0cCB0byB0aGUgbmV4dCBibG9jayB0byB0cnkuCisJICovCisJKm5leHRwID0gbmV4dDsKKwkqcnRibG9jayA9IE5VTExSVEJMT0NLOworCXJldHVybiAwOworfQorCisvKgorICogQWxsb2NhdGUgYW4gZXh0ZW50IG9mIGxlbmd0aCBtaW5sZW48PWxlbjw9bWF4bGVuLCBzdGFydGluZyBhdCBibG9jaworICogYm5vLiAgSWYgd2UgZG9uJ3QgZ2V0IG1heGxlbiB0aGVuIHVzZSBwcm9kIHRvIHRyaW0gdGhlIGxlbmd0aCwgaWYgZ2l2ZW4uCisgKiBSZXR1cm5zIGVycm9yOyByZXR1cm5zIHN0YXJ0aW5nIGJsb2NrIGluICpydGJsb2NrLgorICogVGhlIGxlbmd0aHMgYXJlIGFsbCBpbiBydGV4dGVudHMuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ydGFsbG9jYXRlX2V4dGVudF9leGFjdCgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfcnRibG9ja190CWJubywJCS8qIHN0YXJ0aW5nIGJsb2NrIG51bWJlciB0byBhbGxvY2F0ZSAqLworCXhmc19leHRsZW5fdAltaW5sZW4sCQkvKiBtaW5pbXVtIGxlbmd0aCB0byBhbGxvY2F0ZSAqLworCXhmc19leHRsZW5fdAltYXhsZW4sCQkvKiBtYXhpbXVtIGxlbmd0aCB0byBhbGxvY2F0ZSAqLworCXhmc19leHRsZW5fdAkqbGVuLAkJLyogb3V0OiBhY3R1YWwgbGVuZ3RoIGFsbG9jYXRlZCAqLworCXhmc19idWZfdAkqKnJicHAsCQkvKiBpbi9vdXQ6IHN1bW1hcnkgYmxvY2sgYnVmZmVyICovCisJeGZzX2ZzYmxvY2tfdAkqcnNiLAkJLyogaW4vb3V0OiBzdW1tYXJ5IGJsb2NrIG51bWJlciAqLworCXhmc19leHRsZW5fdAlwcm9kLAkJLyogZXh0ZW50IHByb2R1Y3QgZmFjdG9yICovCisJeGZzX3J0YmxvY2tfdAkqcnRibG9jaykJLyogb3V0OiBzdGFydCBibG9jayBhbGxvY2F0ZWQgKi8KK3sKKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgdmFsdWUgKi8KKwl4ZnNfZXh0bGVuX3QJaTsJCS8qIGV4dGVudCBsZW5ndGggdHJpbW1lZCBkdWUgdG8gcHJvZCAqLworCWludAkJaXNmcmVlOwkJLyogZXh0ZW50IGlzIGZyZWUgKi8KKwl4ZnNfcnRibG9ja190CW5leHQ7CQkvKiBuZXh0IGJsb2NrIHRvIHRyeSAoZHVtbXkpICovCisKKwlBU1NFUlQobWlubGVuICUgcHJvZCA9PSAwICYmIG1heGxlbiAlIHByb2QgPT0gMCk7CisJLyoKKwkgKiBDaGVjayBpZiB0aGUgcmFuZ2UgaW4gcXVlc3Rpb24gKGZvciBtYXhsZW4pIGlzIGZyZWUuCisJICovCisJZXJyb3IgPSB4ZnNfcnRjaGVja19yYW5nZShtcCwgdHAsIGJubywgbWF4bGVuLCAxLCAmbmV4dCwgJmlzZnJlZSk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJaWYgKGlzZnJlZSkgeworCQkvKgorCQkgKiBJZiBpdCBpcywgYWxsb2NhdGUgaXQgYW5kIHJldHVybiBzdWNjZXNzLgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfcnRhbGxvY2F0ZV9yYW5nZShtcCwgdHAsIGJubywgbWF4bGVuLCByYnBwLCByc2IpOworCQlpZiAoZXJyb3IpIHsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQkqbGVuID0gbWF4bGVuOworCQkqcnRibG9jayA9IGJubzsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogSWYgbm90LCBhbGxvY2F0ZSB3aGF0IHRoZXJlIGlzLCBpZiBpdCdzIGF0IGxlYXN0IG1pbmxlbi4KKwkgKi8KKwltYXhsZW4gPSBuZXh0IC0gYm5vOworCWlmIChtYXhsZW4gPCBtaW5sZW4pIHsKKwkJLyoKKwkJICogRmFpbGVkLCByZXR1cm4gZmFpbHVyZSBzdGF0dXMuCisJCSAqLworCQkqcnRibG9jayA9IE5VTExSVEJMT0NLOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBUcmltIG9mZiB0YWlsIG9mIGV4dGVudCwgaWYgcHJvZCBpcyBzcGVjaWZpZWQuCisJICovCisJaWYgKHByb2QgPiAxICYmIChpID0gbWF4bGVuICUgcHJvZCkpIHsKKwkJbWF4bGVuIC09IGk7CisJCWlmIChtYXhsZW4gPCBtaW5sZW4pIHsKKwkJCS8qCisJCQkgKiBOb3cgd2UgY2FuJ3QgZG8gaXQsIHJldHVybiBmYWlsdXJlIHN0YXR1cy4KKwkJCSAqLworCQkJKnJ0YmxvY2sgPSBOVUxMUlRCTE9DSzsKKwkJCXJldHVybiAwOworCQl9CisJfQorCS8qCisJICogQWxsb2NhdGUgd2hhdCB3ZSBjYW4gYW5kIHJldHVybiBpdC4KKwkgKi8KKwllcnJvciA9IHhmc19ydGFsbG9jYXRlX3JhbmdlKG1wLCB0cCwgYm5vLCBtYXhsZW4sIHJicHAsIHJzYik7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJKmxlbiA9IG1heGxlbjsKKwkqcnRibG9jayA9IGJubzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFsbG9jYXRlIGFuIGV4dGVudCBvZiBsZW5ndGggbWlubGVuPD1sZW48PW1heGxlbiwgc3RhcnRpbmcgYXMgbmVhcgorICogdG8gYm5vIGFzIHBvc3NpYmxlLiAgSWYgd2UgZG9uJ3QgZ2V0IG1heGxlbiB0aGVuIHVzZSBwcm9kIHRvIHRyaW0KKyAqIHRoZSBsZW5ndGgsIGlmIGdpdmVuLiAgVGhlIGxlbmd0aHMgYXJlIGFsbCBpbiBydGV4dGVudHMuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ydGFsbG9jYXRlX2V4dGVudF9uZWFyKAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19ydGJsb2NrX3QJYm5vLAkJLyogc3RhcnRpbmcgYmxvY2sgbnVtYmVyIHRvIGFsbG9jYXRlICovCisJeGZzX2V4dGxlbl90CW1pbmxlbiwJCS8qIG1pbmltdW0gbGVuZ3RoIHRvIGFsbG9jYXRlICovCisJeGZzX2V4dGxlbl90CW1heGxlbiwJCS8qIG1heGltdW0gbGVuZ3RoIHRvIGFsbG9jYXRlICovCisJeGZzX2V4dGxlbl90CSpsZW4sCQkvKiBvdXQ6IGFjdHVhbCBsZW5ndGggYWxsb2NhdGVkICovCisJeGZzX2J1Zl90CSoqcmJwcCwJCS8qIGluL291dDogc3VtbWFyeSBibG9jayBidWZmZXIgKi8KKwl4ZnNfZnNibG9ja190CSpyc2IsCQkvKiBpbi9vdXQ6IHN1bW1hcnkgYmxvY2sgbnVtYmVyICovCisJeGZzX2V4dGxlbl90CXByb2QsCQkvKiBleHRlbnQgcHJvZHVjdCBmYWN0b3IgKi8KKwl4ZnNfcnRibG9ja190CSpydGJsb2NrKQkvKiBvdXQ6IHN0YXJ0IGJsb2NrIGFsbG9jYXRlZCAqLworeworCWludAkJYW55OwkJLyogYW55IHVzZWZ1bCBleHRlbnRzIGZyb20gc3VtbWFyeSAqLworCXhmc19ydGJsb2NrX3QJYmJubzsJCS8qIGJpdG1hcCBibG9jayBudW1iZXIgKi8KKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgdmFsdWUgKi8KKwlpbnQJCWk7CQkvKiBiaXRtYXAgYmxvY2sgb2Zmc2V0IChsb29wIGNvbnRyb2wpICovCisJaW50CQlqOwkJLyogc2Vjb25kYXJ5IGxvb3AgY29udHJvbCAqLworCWludAkJbG9nMmxlbjsJLyogbG9nMiBvZiBtaW5sZW4gKi8KKwl4ZnNfcnRibG9ja190CW47CQkvKiBuZXh0IGJsb2NrIHRvIHRyeSAqLworCXhmc19ydGJsb2NrX3QJcjsJCS8qIHJlc3VsdCBibG9jayAqLworCisJQVNTRVJUKG1pbmxlbiAlIHByb2QgPT0gMCAmJiBtYXhsZW4gJSBwcm9kID09IDApOworCS8qCisJICogSWYgdGhlIGJsb2NrIG51bWJlciBnaXZlbiBpcyBvZmYgdGhlIGVuZCwgc2lsZW50bHkgc2V0IGl0IHRvCisJICogdGhlIGxhc3QgYmxvY2suCisJICovCisJaWYgKGJubyA+PSBtcC0+bV9zYi5zYl9yZXh0ZW50cykKKwkJYm5vID0gbXAtPm1fc2Iuc2JfcmV4dGVudHMgLSAxOworCS8qCisJICogVHJ5IHRoZSBleGFjdCBhbGxvY2F0aW9uIGZpcnN0LgorCSAqLworCWVycm9yID0geGZzX3J0YWxsb2NhdGVfZXh0ZW50X2V4YWN0KG1wLCB0cCwgYm5vLCBtaW5sZW4sIG1heGxlbiwgbGVuLAorCQlyYnBwLCByc2IsIHByb2QsICZyKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwkvKgorCSAqIElmIHRoZSBleGFjdCBhbGxvY2F0aW9uIHdvcmtlZCwgcmV0dXJuIHRoYXQuCisJICovCisJaWYgKHIgIT0gTlVMTFJUQkxPQ0spIHsKKwkJKnJ0YmxvY2sgPSByOworCQlyZXR1cm4gMDsKKwl9CisJYmJubyA9IFhGU19CSVRUT0JMT0NLKG1wLCBibm8pOworCWkgPSAwOworCWxvZzJsZW4gPSB4ZnNfaGlnaGJpdDMyKG1pbmxlbik7CisJLyoKKwkgKiBMb29wIG92ZXIgYWxsIGJpdG1hcCBibG9ja3MgKGJibm8gKyBpIGlzIGN1cnJlbnQgYmxvY2spLgorCSAqLworCWZvciAoOzspIHsKKwkJLyoKKwkJICogR2V0IHN1bW1hcnkgaW5mb3JtYXRpb24gb2YgZXh0ZW50cyBvZiBhbGwgdXNlZnVsIGxldmVscworCQkgKiBzdGFydGluZyBpbiB0aGlzIGJpdG1hcCBibG9jay4KKwkJICovCisJCWVycm9yID0geGZzX3J0YW55X3N1bW1hcnkobXAsIHRwLCBsb2cybGVuLCBtcC0+bV9yc3VtbGV2ZWxzIC0gMSwKKwkJCWJibm8gKyBpLCByYnBwLCByc2IsICZhbnkpOworCQlpZiAoZXJyb3IpIHsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQkvKgorCQkgKiBJZiB0aGVyZSBhcmUgYW55IHVzZWZ1bCBleHRlbnRzIHN0YXJ0aW5nIGhlcmUsIHRyeQorCQkgKiBhbGxvY2F0aW5nIG9uZS4KKwkJICovCisJCWlmIChhbnkpIHsKKwkJCS8qCisJCQkgKiBPbiB0aGUgcG9zaXRpdmUgc2lkZSBvZiB0aGUgc3RhcnRpbmcgbG9jYXRpb24uCisJCQkgKi8KKwkJCWlmIChpID49IDApIHsKKwkJCQkvKgorCQkJCSAqIFRyeSB0byBhbGxvY2F0ZSBhbiBleHRlbnQgc3RhcnRpbmcgaW4KKwkJCQkgKiB0aGlzIGJsb2NrLgorCQkJCSAqLworCQkJCWVycm9yID0geGZzX3J0YWxsb2NhdGVfZXh0ZW50X2Jsb2NrKG1wLCB0cCwKKwkJCQkJYmJubyArIGksIG1pbmxlbiwgbWF4bGVuLCBsZW4sICZuLCByYnBwLAorCQkJCQlyc2IsIHByb2QsICZyKTsKKwkJCQlpZiAoZXJyb3IpIHsKKwkJCQkJcmV0dXJuIGVycm9yOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIElmIGl0IHdvcmtlZCwgcmV0dXJuIGl0LgorCQkJCSAqLworCQkJCWlmIChyICE9IE5VTExSVEJMT0NLKSB7CisJCQkJCSpydGJsb2NrID0gcjsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQkJLyoKKwkJCSAqIE9uIHRoZSBuZWdhdGl2ZSBzaWRlIG9mIHRoZSBzdGFydGluZyBsb2NhdGlvbi4KKwkJCSAqLworCQkJZWxzZSB7CQkvKiBpIDwgMCAqLworCQkJCS8qCisJCQkJICogTG9vcCBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgYml0bWFwIGJsb2NrcyBmcm9tCisJCQkJICogdGhlIHN0YXJ0aW5nIHBvaW50LTEgdXAgdG8gd2hlcmUgd2UgYXJlIG5vdy4KKwkJCQkgKiBUaGVyZSBzaG91bGQgYmUgYW4gZXh0ZW50IHdoaWNoIGVuZHMgaW4gdGhpcworCQkJCSAqIGJpdG1hcCBibG9jayBhbmQgaXMgbG9uZyBlbm91Z2guCisJCQkJICovCisJCQkJZm9yIChqID0gLTE7IGogPiBpOyBqLS0pIHsKKwkJCQkJLyoKKwkJCQkJICogR3JhYiB0aGUgc3VtbWFyeSBpbmZvcm1hdGlvbiBmb3IKKwkJCQkJICogdGhpcyBiaXRtYXAgYmxvY2suCisJCQkJCSAqLworCQkJCQllcnJvciA9IHhmc19ydGFueV9zdW1tYXJ5KG1wLCB0cCwKKwkJCQkJCWxvZzJsZW4sIG1wLT5tX3JzdW1sZXZlbHMgLSAxLAorCQkJCQkJYmJubyArIGosIHJicHAsIHJzYiwgJmFueSk7CisJCQkJCWlmIChlcnJvcikgeworCQkJCQkJcmV0dXJuIGVycm9yOworCQkJCQl9CisJCQkJCS8qCisJCQkJCSAqIElmIHRoZXJlJ3Mgbm8gZXh0ZW50IGdpdmVuIGluIHRoZQorCQkJCQkgKiBzdW1tYXJ5IHRoYXQgbWVhbnMgdGhlIGV4dGVudCB3ZQorCQkJCQkgKiBmb3VuZCBtdXN0IGNhcnJ5IG92ZXIgZnJvbSBhbgorCQkJCQkgKiBlYXJsaWVyIGJsb2NrLiAgSWYgdGhlcmUgaXMgYW4KKwkJCQkJICogZXh0ZW50IGdpdmVuLCB3ZSd2ZSBhbHJlYWR5IHRyaWVkCisJCQkJCSAqIHRoYXQgYWxsb2NhdGlvbiwgZG9uJ3QgZG8gaXQgYWdhaW4uCisJCQkJCSAqLworCQkJCQlpZiAoYW55KQorCQkJCQkJY29udGludWU7CisJCQkJCWVycm9yID0geGZzX3J0YWxsb2NhdGVfZXh0ZW50X2Jsb2NrKG1wLAorCQkJCQkJdHAsIGJibm8gKyBqLCBtaW5sZW4sIG1heGxlbiwKKwkJCQkJCWxlbiwgJm4sIHJicHAsIHJzYiwgcHJvZCwgJnIpOworCQkJCQlpZiAoZXJyb3IpIHsKKwkJCQkJCXJldHVybiBlcnJvcjsKKwkJCQkJfQorCQkJCQkvKgorCQkJCQkgKiBJZiBpdCB3b3JrcywgcmV0dXJuIHRoZSBleHRlbnQuCisJCQkJCSAqLworCQkJCQlpZiAociAhPSBOVUxMUlRCTE9DSykgeworCQkJCQkJKnJ0YmxvY2sgPSByOworCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBUaGVyZSB3ZXJlbid0IGludGVydmVuaW5nIGJpdG1hcCBibG9ja3MKKwkJCQkgKiB3aXRoIGEgbG9uZyBlbm91Z2ggZXh0ZW50LCBvciB0aGUKKwkJCQkgKiBhbGxvY2F0aW9uIGRpZG4ndCB3b3JrIGZvciBzb21lIHJlYXNvbgorCQkJCSAqIChpLmUuIGl0J3MgYSBsaXR0bGUgKiB0b28gc2hvcnQpLgorCQkJCSAqIFRyeSB0byBhbGxvY2F0ZSBmcm9tIHRoZSBzdW1tYXJ5IGJsb2NrCisJCQkJICogdGhhdCB3ZSBmb3VuZC4KKwkJCQkgKi8KKwkJCQllcnJvciA9IHhmc19ydGFsbG9jYXRlX2V4dGVudF9ibG9jayhtcCwgdHAsCisJCQkJCWJibm8gKyBpLCBtaW5sZW4sIG1heGxlbiwgbGVuLCAmbiwgcmJwcCwKKwkJCQkJcnNiLCBwcm9kLCAmcik7CisJCQkJaWYgKGVycm9yKSB7CisJCQkJCXJldHVybiBlcnJvcjsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBJZiBpdCB3b3JrcywgcmV0dXJuIHRoZSBleHRlbnQuCisJCQkJICovCisJCQkJaWYgKHIgIT0gTlVMTFJUQkxPQ0spIHsKKwkJCQkJKnJ0YmxvY2sgPSByOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyoKKwkJICogTG9vcCBjb250cm9sLiAgSWYgd2Ugd2VyZSBvbiB0aGUgcG9zaXRpdmUgc2lkZSwgYW5kIHRoZXJlJ3MKKwkJICogc3RpbGwgbW9yZSBibG9ja3Mgb24gdGhlIG5lZ2F0aXZlIHNpZGUsIGdvIHRoZXJlLgorCQkgKi8KKwkJaWYgKGkgPiAwICYmIChpbnQpYmJubyAtIGkgPj0gMCkKKwkJCWkgPSAtaTsKKwkJLyoKKwkJICogSWYgcG9zaXRpdmUsIGFuZCBubyBtb3JlIG5lZ2F0aXZlLCBidXQgdGhlcmUgYXJlIG1vcmUKKwkJICogcG9zaXRpdmUsIGdvIHRoZXJlLgorCQkgKi8KKwkJZWxzZSBpZiAoaSA+IDAgJiYgKGludCliYm5vICsgaSA8IG1wLT5tX3NiLnNiX3JibWJsb2NrcyAtIDEpCisJCQlpKys7CisJCS8qCisJCSAqIElmIG5lZ2F0aXZlIG9yIDAgKGp1c3Qgc3RhcnRlZCksIGFuZCB0aGVyZSBhcmUgcG9zaXRpdmUKKwkJICogYmxvY2tzIHRvIGdvLCBnbyB0aGVyZS4gIFRoZSAwIGNhc2UgbW92ZXMgdG8gYmxvY2sgMS4KKwkJICovCisJCWVsc2UgaWYgKGkgPD0gMCAmJiAoaW50KWJibm8gLSBpIDwgbXAtPm1fc2Iuc2JfcmJtYmxvY2tzIC0gMSkKKwkJCWkgPSAxIC0gaTsKKwkJLyoKKwkJICogSWYgbmVnYXRpdmUgb3IgMCBhbmQgdGhlcmUgYXJlIG1vcmUgbmVnYXRpdmUgYmxvY2tzLAorCQkgKiBnbyB0aGVyZS4KKwkJICovCisJCWVsc2UgaWYgKGkgPD0gMCAmJiAoaW50KWJibm8gKyBpID4gMCkKKwkJCWktLTsKKwkJLyoKKwkJICogTXVzdCBiZSBkb25lLiAgUmV0dXJuIGZhaWx1cmUuCisJCSAqLworCQllbHNlCisJCQlicmVhazsKKwl9CisJKnJ0YmxvY2sgPSBOVUxMUlRCTE9DSzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFsbG9jYXRlIGFuIGV4dGVudCBvZiBsZW5ndGggbWlubGVuPD1sZW48PW1heGxlbiwgd2l0aCBubyBwb3NpdGlvbgorICogc3BlY2lmaWVkLiAgSWYgd2UgZG9uJ3QgZ2V0IG1heGxlbiB0aGVuIHVzZSBwcm9kIHRvIHRyaW0KKyAqIHRoZSBsZW5ndGgsIGlmIGdpdmVuLiAgVGhlIGxlbmd0aHMgYXJlIGFsbCBpbiBydGV4dGVudHMuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ydGFsbG9jYXRlX2V4dGVudF9zaXplKAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19leHRsZW5fdAltaW5sZW4sCQkvKiBtaW5pbXVtIGxlbmd0aCB0byBhbGxvY2F0ZSAqLworCXhmc19leHRsZW5fdAltYXhsZW4sCQkvKiBtYXhpbXVtIGxlbmd0aCB0byBhbGxvY2F0ZSAqLworCXhmc19leHRsZW5fdAkqbGVuLAkJLyogb3V0OiBhY3R1YWwgbGVuZ3RoIGFsbG9jYXRlZCAqLworCXhmc19idWZfdAkqKnJicHAsCQkvKiBpbi9vdXQ6IHN1bW1hcnkgYmxvY2sgYnVmZmVyICovCisJeGZzX2ZzYmxvY2tfdAkqcnNiLAkJLyogaW4vb3V0OiBzdW1tYXJ5IGJsb2NrIG51bWJlciAqLworCXhmc19leHRsZW5fdAlwcm9kLAkJLyogZXh0ZW50IHByb2R1Y3QgZmFjdG9yICovCisJeGZzX3J0YmxvY2tfdAkqcnRibG9jaykJLyogb3V0OiBzdGFydCBibG9jayBhbGxvY2F0ZWQgKi8KK3sKKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgdmFsdWUgKi8KKwlpbnQJCWk7CQkvKiBiaXRtYXAgYmxvY2sgbnVtYmVyICovCisJaW50CQlsOwkJLyogbGV2ZWwgbnVtYmVyIChsb29wIGNvbnRyb2wpICovCisJeGZzX3J0YmxvY2tfdAluOwkJLyogbmV4dCBibG9jayB0byBiZSB0cmllZCAqLworCXhmc19ydGJsb2NrX3QJcjsJCS8qIHJlc3VsdCBibG9jayBudW1iZXIgKi8KKwl4ZnNfc3VtaW5mb190CXN1bTsJCS8qIHN1bW1hcnkgaW5mb3JtYXRpb24gZm9yIGV4dGVudHMgKi8KKworCUFTU0VSVChtaW5sZW4gJSBwcm9kID09IDAgJiYgbWF4bGVuICUgcHJvZCA9PSAwKTsKKwkvKgorCSAqIExvb3Agb3ZlciBhbGwgdGhlIGxldmVscyBzdGFydGluZyB3aXRoIG1heGxlbi4KKwkgKiBBdCBlYWNoIGxldmVsLCBsb29rIGF0IGFsbCB0aGUgYml0bWFwIGJsb2NrcywgdG8gc2VlIGlmIHRoZXJlCisJICogYXJlIGV4dGVudHMgc3RhcnRpbmcgdGhlcmUgdGhhdCBhcmUgbG9uZyBlbm91Z2ggKD49IG1heGxlbikuCisJICogTm90ZSwgb25seSBvbiB0aGUgaW5pdGlhbCBsZXZlbCBjYW4gdGhlIGFsbG9jYXRpb24gZmFpbCBpZgorCSAqIHRoZSBzdW1tYXJ5IHNheXMgdGhlcmUncyBhbiBleHRlbnQuCisJICovCisJZm9yIChsID0geGZzX2hpZ2hiaXQzMihtYXhsZW4pOyBsIDwgbXAtPm1fcnN1bWxldmVsczsgbCsrKSB7CisJCS8qCisJCSAqIExvb3Agb3ZlciBhbGwgdGhlIGJpdG1hcCBibG9ja3MuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbXAtPm1fc2Iuc2JfcmJtYmxvY2tzOyBpKyspIHsKKwkJCS8qCisJCQkgKiBHZXQgdGhlIHN1bW1hcnkgZm9yIHRoaXMgbGV2ZWwvYmxvY2suCisJCQkgKi8KKwkJCWVycm9yID0geGZzX3J0Z2V0X3N1bW1hcnkobXAsIHRwLCBsLCBpLCByYnBwLCByc2IsCisJCQkJJnN1bSk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQkvKgorCQkJICogTm90aGluZyB0aGVyZSwgb24gdG8gdGhlIG5leHQgYmxvY2suCisJCQkgKi8KKwkJCWlmICghc3VtKQorCQkJCWNvbnRpbnVlOworCQkJLyoKKwkJCSAqIFRyeSBhbGxvY2F0aW5nIHRoZSBleHRlbnQuCisJCQkgKi8KKwkJCWVycm9yID0geGZzX3J0YWxsb2NhdGVfZXh0ZW50X2Jsb2NrKG1wLCB0cCwgaSwgbWF4bGVuLAorCQkJCW1heGxlbiwgbGVuLCAmbiwgcmJwcCwgcnNiLCBwcm9kLCAmcik7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQkvKgorCQkJICogSWYgaXQgd29ya2VkLCByZXR1cm4gdGhhdC4KKwkJCSAqLworCQkJaWYgKHIgIT0gTlVMTFJUQkxPQ0spIHsKKwkJCQkqcnRibG9jayA9IHI7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkvKgorCQkJICogSWYgdGhlICJuZXh0IGJsb2NrIHRvIHRyeSIgcmV0dXJuZWQgZnJvbSB0aGUKKwkJCSAqIGFsbG9jYXRvciBpcyBiZXlvbmQgdGhlIG5leHQgYml0bWFwIGJsb2NrLAorCQkJICogc2tpcCB0byB0aGF0IGJpdG1hcCBibG9jay4KKwkJCSAqLworCQkJaWYgKFhGU19CSVRUT0JMT0NLKG1wLCBuKSA+IGkgKyAxKQorCQkJCWkgPSBYRlNfQklUVE9CTE9DSyhtcCwgbikgLSAxOworCQl9CisJfQorCS8qCisJICogRGlkbid0IGZpbmQgYW55IG1heGxlbiBibG9ja3MuICBUcnkgc21hbGxlciBvbmVzLCB1bmxlc3MKKwkgKiB3ZSdyZSBhc2tpbmcgZm9yIGEgZml4ZWQgc2l6ZSBleHRlbnQuCisJICovCisJaWYgKG1pbmxlbiA+IC0tbWF4bGVuKSB7CisJCSpydGJsb2NrID0gTlVMTFJUQkxPQ0s7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIExvb3Agb3ZlciBzaXplcywgZnJvbSBtYXhsZW4gZG93biB0byBtaW5sZW4uCisJICogVGhpcyB0aW1lLCB3aGVuIHdlIGRvIHRoZSBhbGxvY2F0aW9ucywgYWxsb3cgc21hbGxlciBvbmVzCisJICogdG8gc3VjY2VlZC4KKwkgKi8KKwlmb3IgKGwgPSB4ZnNfaGlnaGJpdDMyKG1heGxlbik7IGwgPj0geGZzX2hpZ2hiaXQzMihtaW5sZW4pOyBsLS0pIHsKKwkJLyoKKwkJICogTG9vcCBvdmVyIGFsbCB0aGUgYml0bWFwIGJsb2NrcywgdHJ5IGFuIGFsbG9jYXRpb24KKwkJICogc3RhcnRpbmcgaW4gdGhhdCBibG9jay4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBtcC0+bV9zYi5zYl9yYm1ibG9ja3M7IGkrKykgeworCQkJLyoKKwkJCSAqIEdldCB0aGUgc3VtbWFyeSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBsZXZlbC9ibG9jay4KKwkJCSAqLworCQkJZXJyb3IgPQl4ZnNfcnRnZXRfc3VtbWFyeShtcCwgdHAsIGwsIGksIHJicHAsIHJzYiwKKwkJCQkJCSAgJnN1bSk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQkvKgorCQkJICogSWYgbm90aGluZyB0aGVyZSwgZ28gb24gdG8gbmV4dC4KKwkJCSAqLworCQkJaWYgKCFzdW0pCisJCQkJY29udGludWU7CisJCQkvKgorCQkJICogVHJ5IHRoZSBhbGxvY2F0aW9uLiAgTWFrZSBzdXJlIHRoZSBzcGVjaWZpZWQKKwkJCSAqIG1pbmxlbi9tYXhsZW4gYXJlIGluIHRoZSBwb3NzaWJsZSByYW5nZSBmb3IKKwkJCSAqIHRoaXMgc3VtbWFyeSBsZXZlbC4KKwkJCSAqLworCQkJZXJyb3IgPSB4ZnNfcnRhbGxvY2F0ZV9leHRlbnRfYmxvY2sobXAsIHRwLCBpLAorCQkJCQlYRlNfUlRNQVgobWlubGVuLCAxIDw8IGwpLAorCQkJCQlYRlNfUlRNSU4obWF4bGVuLCAoMSA8PCAobCArIDEpKSAtIDEpLAorCQkJCQlsZW4sICZuLCByYnBwLCByc2IsIHByb2QsICZyKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCS8qCisJCQkgKiBJZiBpdCB3b3JrZWQsIHJldHVybiB0aGF0IGV4dGVudC4KKwkJCSAqLworCQkJaWYgKHIgIT0gTlVMTFJUQkxPQ0spIHsKKwkJCQkqcnRibG9jayA9IHI7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkvKgorCQkJICogSWYgdGhlICJuZXh0IGJsb2NrIHRvIHRyeSIgcmV0dXJuZWQgZnJvbSB0aGUKKwkJCSAqIGFsbG9jYXRvciBpcyBiZXlvbmQgdGhlIG5leHQgYml0bWFwIGJsb2NrLAorCQkJICogc2tpcCB0byB0aGF0IGJpdG1hcCBibG9jay4KKwkJCSAqLworCQkJaWYgKFhGU19CSVRUT0JMT0NLKG1wLCBuKSA+IGkgKyAxKQorCQkJCWkgPSBYRlNfQklUVE9CTE9DSyhtcCwgbikgLSAxOworCQl9CisJfQorCS8qCisJICogR290IG5vdGhpbmcsIHJldHVybiBmYWlsdXJlLgorCSAqLworCSpydGJsb2NrID0gTlVMTFJUQkxPQ0s7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNYXJrIGFuIGV4dGVudCBzcGVjaWZpZWQgYnkgc3RhcnQgYW5kIGxlbiBhbGxvY2F0ZWQuCisgKiBVcGRhdGVzIGFsbCB0aGUgc3VtbWFyeSBpbmZvcm1hdGlvbiBhcyB3ZWxsIGFzIHRoZSBiaXRtYXAuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ydGFsbG9jYXRlX3JhbmdlKAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19ydGJsb2NrX3QJc3RhcnQsCQkvKiBzdGFydCBibG9jayB0byBhbGxvY2F0ZSAqLworCXhmc19leHRsZW5fdAlsZW4sCQkvKiBsZW5ndGggdG8gYWxsb2NhdGUgKi8KKwl4ZnNfYnVmX3QJKipyYnBwLAkJLyogaW4vb3V0OiBzdW1tYXJ5IGJsb2NrIGJ1ZmZlciAqLworCXhmc19mc2Jsb2NrX3QJKnJzYikJCS8qIGluL291dDogc3VtbWFyeSBibG9jayBudW1iZXIgKi8KK3sKKwl4ZnNfcnRibG9ja190CWVuZDsJCS8qIGVuZCBvZiB0aGUgYWxsb2NhdGVkIGV4dGVudCAqLworCWludAkJZXJyb3I7CQkvKiBlcnJvciB2YWx1ZSAqLworCXhmc19ydGJsb2NrX3QJcG9zdGJsb2NrOwkvKiBmaXJzdCBibG9jayBhbGxvY2F0ZWQgPiBlbmQgKi8KKwl4ZnNfcnRibG9ja190CXByZWJsb2NrOwkvKiBmaXJzdCBibG9jayBhbGxvY2F0ZWQgPCBzdGFydCAqLworCisJZW5kID0gc3RhcnQgKyBsZW4gLSAxOworCS8qCisJICogQXNzdW1lIHdlJ3JlIGFsbG9jYXRpbmcgb3V0IG9mIHRoZSBtaWRkbGUgb2YgYSBmcmVlIGV4dGVudC4KKwkgKiBXZSBuZWVkIHRvIGZpbmQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBleHRlbnQgc28gd2UgY2FuCisJICogcHJvcGVybHkgdXBkYXRlIHRoZSBzdW1tYXJ5LgorCSAqLworCWVycm9yID0geGZzX3J0ZmluZF9iYWNrKG1wLCB0cCwgc3RhcnQsIDAsICZwcmVibG9jayk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBGaW5kIHRoZSBuZXh0IGFsbG9jYXRlZCBibG9jayAoZW5kIG9mIGZyZWUgZXh0ZW50KS4KKwkgKi8KKwllcnJvciA9IHhmc19ydGZpbmRfZm9ydyhtcCwgdHAsIGVuZCwgbXAtPm1fc2Iuc2JfcmV4dGVudHMgLSAxLAorCQkmcG9zdGJsb2NrKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwkvKgorCSAqIERlY3JlbWVudCB0aGUgc3VtbWFyeSBpbmZvcm1hdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbnRpcmUKKwkgKiAob2xkKSBmcmVlIGV4dGVudC4KKwkgKi8KKwllcnJvciA9IHhmc19ydG1vZGlmeV9zdW1tYXJ5KG1wLCB0cCwKKwkJWEZTX1JUQkxPQ0tMT0cocG9zdGJsb2NrICsgMSAtIHByZWJsb2NrKSwKKwkJWEZTX0JJVFRPQkxPQ0sobXAsIHByZWJsb2NrKSwgLTEsIHJicHAsIHJzYik7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgYmxvY2tzIG5vdCBiZWluZyBhbGxvY2F0ZWQgYXQgdGhlIGZyb250IG9mIHRoZQorCSAqIG9sZCBleHRlbnQsIGFkZCBzdW1tYXJ5IGRhdGEgZm9yIHRoZW0gdG8gYmUgZnJlZS4KKwkgKi8KKwlpZiAocHJlYmxvY2sgPCBzdGFydCkgeworCQllcnJvciA9IHhmc19ydG1vZGlmeV9zdW1tYXJ5KG1wLCB0cCwKKwkJCVhGU19SVEJMT0NLTE9HKHN0YXJ0IC0gcHJlYmxvY2spLAorCQkJWEZTX0JJVFRPQkxPQ0sobXAsIHByZWJsb2NrKSwgMSwgcmJwcCwgcnNiKTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwl9CisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgYmxvY2tzIG5vdCBiZWluZyBhbGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUKKwkgKiBvbGQgZXh0ZW50LCBhZGQgc3VtbWFyeSBkYXRhIGZvciB0aGVtIHRvIGJlIGZyZWUuCisJICovCisJaWYgKHBvc3RibG9jayA+IGVuZCkgeworCQllcnJvciA9IHhmc19ydG1vZGlmeV9zdW1tYXJ5KG1wLCB0cCwKKwkJCVhGU19SVEJMT0NLTE9HKHBvc3RibG9jayAtIGVuZCksCisJCQlYRlNfQklUVE9CTE9DSyhtcCwgZW5kICsgMSksIDEsIHJicHAsIHJzYik7CisJCWlmIChlcnJvcikgeworCQkJcmV0dXJuIGVycm9yOworCQl9CisJfQorCS8qCisJICogTW9kaWZ5IHRoZSBiaXRtYXAgdG8gbWFyayB0aGlzIGV4dGVudCBhbGxvY2F0ZWQuCisJICovCisJZXJyb3IgPSB4ZnNfcnRtb2RpZnlfcmFuZ2UobXAsIHRwLCBzdGFydCwgbGVuLCAwKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGZyZWUgZXh0ZW50cyBpbiB0aGUgc2l6ZSByYW5nZSBnaXZlbgorICogYnkgbG93IGFuZCBoaWdoLCBmb3IgdGhlIGJpdG1hcCBibG9jayBiYm5vLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfcnRhbnlfc3VtbWFyeSgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJaW50CQlsb3csCQkvKiBsb3cgbG9nMiBleHRlbnQgc2l6ZSAqLworCWludAkJaGlnaCwJCS8qIGhpZ2ggbG9nMiBleHRlbnQgc2l6ZSAqLworCXhmc19ydGJsb2NrX3QJYmJubywJCS8qIGJpdG1hcCBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJKipyYnBwLAkJLyogaW4vb3V0OiBzdW1tYXJ5IGJsb2NrIGJ1ZmZlciAqLworCXhmc19mc2Jsb2NrX3QJKnJzYiwJCS8qIGluL291dDogc3VtbWFyeSBibG9jayBudW1iZXIgKi8KKwlpbnQJCSpzdGF0KQkJLyogb3V0OiBhbnkgZ29vZCBleHRlbnRzIGhlcmU/ICovCit7CisJaW50CQllcnJvcjsJCS8qIGVycm9yIHZhbHVlICovCisJaW50CQlsb2c7CQkvKiBsb29wIGNvdW50ZXIsIGxvZzIgb2YgZXh0LiBzaXplICovCisJeGZzX3N1bWluZm9fdAlzdW07CQkvKiBzdW1tYXJ5IGRhdGEgKi8KKworCS8qCisJICogTG9vcCBvdmVyIGxvZ3Mgb2YgZXh0ZW50IHNpemVzLiAgT3JkZXIgaXMgaXJyZWxldmFudC4KKwkgKi8KKwlmb3IgKGxvZyA9IGxvdzsgbG9nIDw9IGhpZ2g7IGxvZysrKSB7CisJCS8qCisJCSAqIEdldCBvbmUgc3VtbWFyeSBkYXR1bS4KKwkJICovCisJCWVycm9yID0geGZzX3J0Z2V0X3N1bW1hcnkobXAsIHRwLCBsb2csIGJibm8sIHJicHAsIHJzYiwgJnN1bSk7CisJCWlmIChlcnJvcikgeworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCS8qCisJCSAqIElmIHRoZXJlIGFyZSBhbnksIHJldHVybiBzdWNjZXNzLgorCQkgKi8KKwkJaWYgKHN1bSkgeworCQkJKnN0YXQgPSAxOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJLyoKKwkgKiBGb3VuZCBub3RoaW5nLCByZXR1cm4gZmFpbHVyZS4KKwkgKi8KKwkqc3RhdCA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgYSBidWZmZXIgZm9yIHRoZSBiaXRtYXAgb3Igc3VtbWFyeSBmaWxlIGJsb2NrIHNwZWNpZmllZC4KKyAqIFRoZSBidWZmZXIgaXMgcmV0dXJuZWQgcmVhZCBhbmQgbG9ja2VkLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfcnRidWZfZ2V0KAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfcnRibG9ja190CWJsb2NrLAkJLyogYmxvY2sgbnVtYmVyIGluIGJpdG1hcCBvciBzdW1tYXJ5ICovCisJaW50CQlpc3N1bSwJCS8qIGlzIHN1bW1hcnkgbm90IGJpdG1hcCAqLworCXhmc19idWZfdAkqKmJwcCkJCS8qIG91dHB1dDogYnVmZmVyIGZvciB0aGUgYmxvY2sgKi8KK3sKKwl4ZnNfYnVmX3QJKmJwOwkJLyogYmxvY2sgYnVmZmVyLCByZXN1bHQgKi8KKwl4ZnNfZGFkZHJfdAlkOwkJLyogZGlzayBhZGRyIG9mIGJsb2NrICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHZhbHVlICovCisJeGZzX2ZzYmxvY2tfdAlmc2I7CQkvKiBmcyBibG9jayBudW1iZXIgZm9yIGJsb2NrICovCisJeGZzX2lub2RlX3QJKmlwOwkJLyogYml0bWFwIG9yIHN1bW1hcnkgaW5vZGUgKi8KKworCWlwID0gaXNzdW0gPyBtcC0+bV9yc3VtaXAgOiBtcC0+bV9yYm1pcDsKKwkvKgorCSAqIE1hcCBmcm9tIHRoZSBmaWxlIG9mZnNldCAoYmxvY2spIGFuZCBpbm9kZSBudW1iZXIgdG8gdGhlCisJICogZmlsZSBzeXN0ZW0gYmxvY2suCisJICovCisJZXJyb3IgPSB4ZnNfYm1hcGlfc2luZ2xlKHRwLCBpcCwgWEZTX0RBVEFfRk9SSywgJmZzYiwgYmxvY2spOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCUFTU0VSVChmc2IgIT0gTlVMTEZTQkxPQ0spOworCS8qCisJICogQ29udmVydCB0byBkaXNrIGFkZHJlc3MgZm9yIGJ1ZmZlciBjYWNoZS4KKwkgKi8KKwlkID0gWEZTX0ZTQl9UT19EQUREUihtcCwgZnNiKTsKKwkvKgorCSAqIFJlYWQgdGhlIGJ1ZmZlci4KKwkgKi8KKwllcnJvciA9IHhmc190cmFuc19yZWFkX2J1ZihtcCwgdHAsIG1wLT5tX2RkZXZfdGFyZ3AsIGQsCisJCQkJICAgbXAtPm1fYnNpemUsIDAsICZicCk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJQVNTRVJUKGJwICYmICFYRlNfQlVGX0dFVEVSUk9SKGJwKSk7CisJKmJwcCA9IGJwOworCXJldHVybiAwOworfQorCisjaWZkZWYgREVCVUcKKy8qCisgKiBDaGVjayB0aGF0IHRoZSBnaXZlbiBleHRlbnQgKGJsb2NrIHJhbmdlKSBpcyBhbGxvY2F0ZWQgYWxyZWFkeS4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX3J0Y2hlY2tfYWxsb2NfcmFuZ2UoCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX3J0YmxvY2tfdAlibm8sCQkvKiBzdGFydGluZyBibG9jayBudW1iZXIgb2YgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CWxlbiwJCS8qIGxlbmd0aCBvZiBleHRlbnQgKi8KKwlpbnQJCSpzdGF0KQkJLyogb3V0OiAxIGZvciBhbGxvY2F0ZWQsIDAgZm9yIG5vdCAqLworeworCXhmc19ydGJsb2NrX3QJbmV3OwkJLyogZHVtbXkgZm9yIHhmc19ydGNoZWNrX3JhbmdlICovCisKKwlyZXR1cm4geGZzX3J0Y2hlY2tfcmFuZ2UobXAsIHRwLCBibm8sIGxlbiwgMCwgJm5ldywgc3RhdCk7Cit9CisjZW5kaWYKKworI2lmZGVmIERFQlVHCisvKgorICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gYmxvY2sgaW4gdGhlIGJpdG1hcCBoYXMgdGhlIGdpdmVuIHZhbHVlLgorICovCitTVEFUSUMgaW50CQkJCS8qIDEgZm9yIG1hdGNoZXMsIDAgZm9yIG5vdCAqLworeGZzX3J0Y2hlY2tfYml0KAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfcnRibG9ja190CXN0YXJ0LAkJLyogYml0IChibG9jaykgdG8gY2hlY2sgKi8KKwlpbnQJCXZhbCkJCS8qIDEgZm9yIGZyZWUsIDAgZm9yIGFsbG9jYXRlZCAqLworeworCWludAkJYml0OwkJLyogYml0IG51bWJlciBpbiB0aGUgd29yZCAqLworCXhmc19ydGJsb2NrX3QJYmxvY2s7CQkvKiBiaXRtYXAgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CSpicDsJCS8qIGJ1ZiBmb3IgdGhlIGJsb2NrICovCisJeGZzX3J0d29yZF90CSpidWZwOwkJLyogcG9pbnRlciBpbnRvIHRoZSBidWZmZXIgKi8KKwkvKiBSRUZFUkVOQ0VEICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHZhbHVlICovCisJeGZzX3J0d29yZF90CXdkaWZmOwkJLyogZGlmZmVyZW5jZSBiZXR3ZWVuIGJpdCAmIGV4cGVjdGVkICovCisJaW50CQl3b3JkOwkJLyogd29yZCBudW1iZXIgaW4gdGhlIGJ1ZmZlciAqLworCXhmc19ydHdvcmRfdAl3dmFsOwkJLyogd29yZCB2YWx1ZSBmcm9tIGJ1ZmZlciAqLworCisJYmxvY2sgPSBYRlNfQklUVE9CTE9DSyhtcCwgc3RhcnQpOworCWVycm9yID0geGZzX3J0YnVmX2dldChtcCwgdHAsIGJsb2NrLCAwLCAmYnApOworCWJ1ZnAgPSAoeGZzX3J0d29yZF90ICopWEZTX0JVRl9QVFIoYnApOworCXdvcmQgPSBYRlNfQklUVE9XT1JEKG1wLCBzdGFydCk7CisJYml0ID0gKGludCkoc3RhcnQgJiAoWEZTX05CV09SRCAtIDEpKTsKKwl3dmFsID0gYnVmcFt3b3JkXTsKKwl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisJd2RpZmYgPSAod3ZhbCBeIC12YWwpICYgKCh4ZnNfcnR3b3JkX3QpMSA8PCBiaXQpOworCXJldHVybiAhd2RpZmY7Cit9CisjZW5kaWYJLyogREVCVUcgKi8KKworI2lmIDAKKy8qCisgKiBDaGVjayB0aGF0IHRoZSBnaXZlbiBleHRlbnQgKGJsb2NrIHJhbmdlKSBpcyBmcmVlIGFscmVhZHkuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ydGNoZWNrX2ZyZWVfcmFuZ2UoCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX3J0YmxvY2tfdAlibm8sCQkvKiBzdGFydGluZyBibG9jayBudW1iZXIgb2YgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CWxlbiwJCS8qIGxlbmd0aCBvZiBleHRlbnQgKi8KKwlpbnQJCSpzdGF0KQkJLyogb3V0OiAxIGZvciBmcmVlLCAwIGZvciBub3QgKi8KK3sKKwl4ZnNfcnRibG9ja190CW5ldzsJCS8qIGR1bW15IGZvciB4ZnNfcnRjaGVja19yYW5nZSAqLworCisJcmV0dXJuIHhmc19ydGNoZWNrX3JhbmdlKG1wLCB0cCwgYm5vLCBsZW4sIDEsICZuZXcsIHN0YXQpOworfQorI2VuZGlmCisKKy8qCisgKiBDaGVjayB0aGF0IHRoZSBnaXZlbiByYW5nZSBpcyBlaXRoZXIgYWxsIGFsbG9jYXRlZCAodmFsID0gMCkgb3IKKyAqIGFsbCBmcmVlICh2YWwgPSAxKS4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX3J0Y2hlY2tfcmFuZ2UoCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX3J0YmxvY2tfdAlzdGFydCwJCS8qIHN0YXJ0aW5nIGJsb2NrIG51bWJlciBvZiBleHRlbnQgKi8KKwl4ZnNfZXh0bGVuX3QJbGVuLAkJLyogbGVuZ3RoIG9mIGV4dGVudCAqLworCWludAkJdmFsLAkJLyogMSBmb3IgZnJlZSwgMCBmb3IgYWxsb2NhdGVkICovCisJeGZzX3J0YmxvY2tfdAkqbmV3LAkJLyogb3V0OiBmaXJzdCBibG9jayBub3QgbWF0Y2hpbmcgKi8KKwlpbnQJCSpzdGF0KQkJLyogb3V0OiAxIGZvciBtYXRjaGVzLCAwIGZvciBub3QgKi8KK3sKKwl4ZnNfcnR3b3JkX3QJKmI7CQkvKiBjdXJyZW50IHdvcmQgaW4gYnVmZmVyICovCisJaW50CQliaXQ7CQkvKiBiaXQgbnVtYmVyIGluIHRoZSB3b3JkICovCisJeGZzX3J0YmxvY2tfdAlibG9jazsJCS8qIGJpdG1hcCBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJKmJwOwkJLyogYnVmIGZvciB0aGUgYmxvY2sgKi8KKwl4ZnNfcnR3b3JkX3QJKmJ1ZnA7CQkvKiBzdGFydGluZyB3b3JkIGluIGJ1ZmZlciAqLworCWludAkJZXJyb3I7CQkvKiBlcnJvciB2YWx1ZSAqLworCXhmc19ydGJsb2NrX3QJaTsJCS8qIGN1cnJlbnQgYml0IG51bWJlciByZWwuIHRvIHN0YXJ0ICovCisJeGZzX3J0YmxvY2tfdAlsYXN0Yml0OwkvKiBsYXN0IHVzZWZ1bCBiaXQgaW4gd29yZCAqLworCXhmc19ydHdvcmRfdAltYXNrOwkJLyogbWFzayBvZiByZWxldmFudCBiaXRzIGZvciB2YWx1ZSAqLworCXhmc19ydHdvcmRfdAl3ZGlmZjsJCS8qIGRpZmZlcmVuY2UgZnJvbSB3YW50ZWQgdmFsdWUgKi8KKwlpbnQJCXdvcmQ7CQkvKiB3b3JkIG51bWJlciBpbiB0aGUgYnVmZmVyICovCisKKwkvKgorCSAqIENvbXB1dGUgc3RhcnRpbmcgYml0bWFwIGJsb2NrIG51bWJlcgorCSAqLworCWJsb2NrID0gWEZTX0JJVFRPQkxPQ0sobXAsIHN0YXJ0KTsKKwkvKgorCSAqIFJlYWQgdGhlIGJpdG1hcCBibG9jay4KKwkgKi8KKwllcnJvciA9IHhmc19ydGJ1Zl9nZXQobXAsIHRwLCBibG9jaywgMCwgJmJwKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlidWZwID0gKHhmc19ydHdvcmRfdCAqKVhGU19CVUZfUFRSKGJwKTsKKwkvKgorCSAqIENvbXB1dGUgdGhlIHN0YXJ0aW5nIHdvcmQncyBhZGRyZXNzLCBhbmQgc3RhcnRpbmcgYml0LgorCSAqLworCXdvcmQgPSBYRlNfQklUVE9XT1JEKG1wLCBzdGFydCk7CisJYiA9ICZidWZwW3dvcmRdOworCWJpdCA9IChpbnQpKHN0YXJ0ICYgKFhGU19OQldPUkQgLSAxKSk7CisJLyoKKwkgKiAwIChhbGxvY2F0ZWQpID0+IGFsbCB6ZXJvJ3M7IDEgKGZyZWUpID0+IGFsbCBvbmUncy4KKwkgKi8KKwl2YWwgPSAtdmFsOworCS8qCisJICogSWYgbm90IHN0YXJ0aW5nIG9uIGEgd29yZCBib3VuZGFyeSwgZGVhbCB3aXRoIHRoZSBmaXJzdAorCSAqIChwYXJ0aWFsKSB3b3JkLgorCSAqLworCWlmIChiaXQpIHsKKwkJLyoKKwkJICogQ29tcHV0ZSBmaXJzdCBiaXQgbm90IGV4YW1pbmVkLgorCQkgKi8KKwkJbGFzdGJpdCA9IFhGU19SVE1JTihiaXQgKyBsZW4sIFhGU19OQldPUkQpOworCQkvKgorCQkgKiBNYXNrIG9mIHJlbGV2YW50IGJpdHMuCisJCSAqLworCQltYXNrID0gKCgoeGZzX3J0d29yZF90KTEgPDwgKGxhc3RiaXQgLSBiaXQpKSAtIDEpIDw8IGJpdDsKKwkJLyoKKwkJICogQ29tcHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gYWN0dWFsIGFuZCBkZXNpcmVkIHZhbHVlLgorCQkgKi8KKwkJaWYgKCh3ZGlmZiA9ICgqYiBeIHZhbCkgJiBtYXNrKSkgeworCQkJLyoKKwkJCSAqIERpZmZlcmVudCwgY29tcHV0ZSBmaXJzdCB3cm9uZyBiaXQgYW5kIHJldHVybi4KKwkJCSAqLworCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCQkJaSA9IFhGU19SVExPQklUKHdkaWZmKSAtIGJpdDsKKwkJCSpuZXcgPSBzdGFydCArIGk7CisJCQkqc3RhdCA9IDA7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpID0gbGFzdGJpdCAtIGJpdDsKKwkJLyoKKwkJICogR28gb24gdG8gbmV4dCBibG9jayBpZiB0aGF0J3Mgd2hlcmUgdGhlIG5leHQgd29yZCBpcworCQkgKiBhbmQgd2UgbmVlZCB0aGUgbmV4dCB3b3JkLgorCQkgKi8KKwkJaWYgKCsrd29yZCA9PSBYRlNfQkxPQ0tXU0laRShtcCkgJiYgaSA8IGxlbikgeworCQkJLyoKKwkJCSAqIElmIGRvbmUgd2l0aCB0aGlzIGJsb2NrLCBnZXQgdGhlIG5leHQgb25lLgorCQkJICovCisJCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisJCQllcnJvciA9IHhmc19ydGJ1Zl9nZXQobXAsIHRwLCArK2Jsb2NrLCAwLCAmYnApOworCQkJaWYgKGVycm9yKSB7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQkJYiA9IGJ1ZnAgPSAoeGZzX3J0d29yZF90ICopWEZTX0JVRl9QVFIoYnApOworCQkJd29yZCA9IDA7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogR28gb24gdG8gdGhlIG5leHQgd29yZCBpbiB0aGUgYnVmZmVyLgorCQkJICovCisJCQliKys7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBTdGFydGluZyBvbiBhIHdvcmQgYm91bmRhcnksIG5vIHBhcnRpYWwgd29yZC4KKwkJICovCisJCWkgPSAwOworCX0KKwkvKgorCSAqIExvb3Agb3ZlciB3aG9sZSB3b3JkcyBpbiBidWZmZXJzLiAgV2hlbiB3ZSB1c2UgdXAgb25lIGJ1ZmZlcgorCSAqIHdlIG1vdmUgb24gdG8gdGhlIG5leHQgb25lLgorCSAqLworCXdoaWxlIChsZW4gLSBpID49IFhGU19OQldPUkQpIHsKKwkJLyoKKwkJICogQ29tcHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gYWN0dWFsIGFuZCBkZXNpcmVkIHZhbHVlLgorCQkgKi8KKwkJaWYgKCh3ZGlmZiA9ICpiIF4gdmFsKSkgeworCQkJLyoKKwkJCSAqIERpZmZlcmVudCwgY29tcHV0ZSBmaXJzdCB3cm9uZyBiaXQgYW5kIHJldHVybi4KKwkJCSAqLworCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCQkJaSArPSBYRlNfUlRMT0JJVCh3ZGlmZik7CisJCQkqbmV3ID0gc3RhcnQgKyBpOworCQkJKnN0YXQgPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaSArPSBYRlNfTkJXT1JEOworCQkvKgorCQkgKiBHbyBvbiB0byBuZXh0IGJsb2NrIGlmIHRoYXQncyB3aGVyZSB0aGUgbmV4dCB3b3JkIGlzCisJCSAqIGFuZCB3ZSBuZWVkIHRoZSBuZXh0IHdvcmQuCisJCSAqLworCQlpZiAoKyt3b3JkID09IFhGU19CTE9DS1dTSVpFKG1wKSAmJiBpIDwgbGVuKSB7CisJCQkvKgorCQkJICogSWYgZG9uZSB3aXRoIHRoaXMgYmxvY2ssIGdldCB0aGUgbmV4dCBvbmUuCisJCQkgKi8KKwkJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkJCWVycm9yID0geGZzX3J0YnVmX2dldChtcCwgdHAsICsrYmxvY2ssIDAsICZicCk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQliID0gYnVmcCA9ICh4ZnNfcnR3b3JkX3QgKilYRlNfQlVGX1BUUihicCk7CisJCQl3b3JkID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBHbyBvbiB0byB0aGUgbmV4dCB3b3JkIGluIHRoZSBidWZmZXIuCisJCQkgKi8KKwkJCWIrKzsKKwkJfQorCX0KKwkvKgorCSAqIElmIG5vdCBlbmRpbmcgb24gYSB3b3JkIGJvdW5kYXJ5LCBkZWFsIHdpdGggdGhlIGxhc3QKKwkgKiAocGFydGlhbCkgd29yZC4KKwkgKi8KKwlpZiAoKGxhc3RiaXQgPSBsZW4gLSBpKSkgeworCQkvKgorCQkgKiBNYXNrIG9mIHJlbGV2YW50IGJpdHMuCisJCSAqLworCQltYXNrID0gKCh4ZnNfcnR3b3JkX3QpMSA8PCBsYXN0Yml0KSAtIDE7CisJCS8qCisJCSAqIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGFjdHVhbCBhbmQgZGVzaXJlZCB2YWx1ZS4KKwkJICovCisJCWlmICgod2RpZmYgPSAoKmIgXiB2YWwpICYgbWFzaykpIHsKKwkJCS8qCisJCQkgKiBEaWZmZXJlbnQsIGNvbXB1dGUgZmlyc3Qgd3JvbmcgYml0IGFuZCByZXR1cm4uCisJCQkgKi8KKwkJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkJCWkgKz0gWEZTX1JUTE9CSVQod2RpZmYpOworCQkJKm5ldyA9IHN0YXJ0ICsgaTsKKwkJCSpzdGF0ID0gMDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCWkgPSBsZW47CisJfQorCS8qCisJICogU3VjY2Vzc2Z1bCwgcmV0dXJuLgorCSAqLworCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkqbmV3ID0gc3RhcnQgKyBpOworCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvcHkgYW5kIHRyYW5zZm9ybSB0aGUgc3VtbWFyeSBmaWxlLCBnaXZlbiB0aGUgb2xkIGFuZCBuZXcKKyAqIHBhcmFtZXRlcnMgaW4gdGhlIG1vdW50IHN0cnVjdHVyZXMuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ydGNvcHlfc3VtbWFyeSgKKwl4ZnNfbW91bnRfdAkqb21wLAkJLyogb2xkIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX21vdW50X3QJKm5tcCwJCS8qIG5ldyBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc190cmFuc190CSp0cCkJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KK3sKKwl4ZnNfcnRibG9ja190CWJibm87CQkvKiBiaXRtYXAgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CSpicDsJCS8qIHN1bW1hcnkgYnVmZmVyICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJbG9nOwkJLyogc3VtbWFyeSBsZXZlbCBudW1iZXIgKGxvZyBsZW5ndGgpICovCisJeGZzX3N1bWluZm9fdAlzdW07CQkvKiBzdW1tYXJ5IGRhdGEgKi8KKwl4ZnNfZnNibG9ja190CXN1bWJubzsJCS8qIHN1bW1hcnkgYmxvY2sgbnVtYmVyICovCisKKwlicCA9IE5VTEw7CisJZm9yIChsb2cgPSBvbXAtPm1fcnN1bWxldmVscyAtIDE7IGxvZyA+PSAwOyBsb2ctLSkgeworCQlmb3IgKGJibm8gPSBvbXAtPm1fc2Iuc2JfcmJtYmxvY2tzIC0gMTsKKwkJICAgICAoeGZzX3NydGJsb2NrX3QpYmJubyA+PSAwOworCQkgICAgIGJibm8tLSkgeworCQkJZXJyb3IgPSB4ZnNfcnRnZXRfc3VtbWFyeShvbXAsIHRwLCBsb2csIGJibm8sICZicCwKKwkJCQkmc3VtYm5vLCAmc3VtKTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQlpZiAoc3VtID09IDApCisJCQkJY29udGludWU7CisJCQllcnJvciA9IHhmc19ydG1vZGlmeV9zdW1tYXJ5KG9tcCwgdHAsIGxvZywgYmJubywgLXN1bSwKKwkJCQkmYnAsICZzdW1ibm8pOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybiBlcnJvcjsKKwkJCWVycm9yID0geGZzX3J0bW9kaWZ5X3N1bW1hcnkobm1wLCB0cCwgbG9nLCBiYm5vLCBzdW0sCisJCQkJJmJwLCAmc3VtYm5vKTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQlBU1NFUlQoc3VtID4gMCk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZWFyY2hpbmcgYmFja3dhcmQgZnJvbSBzdGFydCB0byBsaW1pdCwgZmluZCB0aGUgZmlyc3QgYmxvY2sgd2hvc2UKKyAqIGFsbG9jYXRlZC9mcmVlIHN0YXRlIGlzIGRpZmZlcmVudCBmcm9tIHN0YXJ0J3MuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ydGZpbmRfYmFjaygKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfcnRibG9ja190CXN0YXJ0LAkJLyogc3RhcnRpbmcgYmxvY2sgdG8gbG9vayBhdCAqLworCXhmc19ydGJsb2NrX3QJbGltaXQsCQkvKiBsYXN0IGJsb2NrIHRvIGxvb2sgYXQgKi8KKwl4ZnNfcnRibG9ja190CSpydGJsb2NrKQkvKiBvdXQ6IHN0YXJ0IGJsb2NrIGZvdW5kICovCit7CisJeGZzX3J0d29yZF90CSpiOwkJLyogY3VycmVudCB3b3JkIGluIGJ1ZmZlciAqLworCWludAkJYml0OwkJLyogYml0IG51bWJlciBpbiB0aGUgd29yZCAqLworCXhmc19ydGJsb2NrX3QJYmxvY2s7CQkvKiBiaXRtYXAgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CSpicDsJCS8qIGJ1ZiBmb3IgdGhlIGJsb2NrICovCisJeGZzX3J0d29yZF90CSpidWZwOwkJLyogc3RhcnRpbmcgd29yZCBpbiBidWZmZXIgKi8KKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgdmFsdWUgKi8KKwl4ZnNfcnRibG9ja190CWZpcnN0Yml0OwkvKiBmaXJzdCB1c2VmdWwgYml0IGluIHRoZSB3b3JkICovCisJeGZzX3J0YmxvY2tfdAlpOwkJLyogY3VycmVudCBiaXQgbnVtYmVyIHJlbC4gdG8gc3RhcnQgKi8KKwl4ZnNfcnRibG9ja190CWxlbjsJCS8qIGxlbmd0aCBvZiBpbnNwZWN0ZWQgYXJlYSAqLworCXhmc19ydHdvcmRfdAltYXNrOwkJLyogbWFzayBvZiByZWxldmFudCBiaXRzIGZvciB2YWx1ZSAqLworCXhmc19ydHdvcmRfdAl3YW50OwkJLyogbWFzayBmb3IgImdvb2QiIHZhbHVlcyAqLworCXhmc19ydHdvcmRfdAl3ZGlmZjsJCS8qIGRpZmZlcmVuY2UgZnJvbSB3YW50ZWQgdmFsdWUgKi8KKwlpbnQJCXdvcmQ7CQkvKiB3b3JkIG51bWJlciBpbiB0aGUgYnVmZmVyICovCisKKwkvKgorCSAqIENvbXB1dGUgYW5kIHJlYWQgaW4gc3RhcnRpbmcgYml0bWFwIGJsb2NrIGZvciBzdGFydGluZyBibG9jay4KKwkgKi8KKwlibG9jayA9IFhGU19CSVRUT0JMT0NLKG1wLCBzdGFydCk7CisJZXJyb3IgPSB4ZnNfcnRidWZfZ2V0KG1wLCB0cCwgYmxvY2ssIDAsICZicCk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJYnVmcCA9ICh4ZnNfcnR3b3JkX3QgKilYRlNfQlVGX1BUUihicCk7CisJLyoKKwkgKiBHZXQgdGhlIGZpcnN0IHdvcmQncyBpbmRleCAmIHBvaW50IHRvIGl0LgorCSAqLworCXdvcmQgPSBYRlNfQklUVE9XT1JEKG1wLCBzdGFydCk7CisJYiA9ICZidWZwW3dvcmRdOworCWJpdCA9IChpbnQpKHN0YXJ0ICYgKFhGU19OQldPUkQgLSAxKSk7CisJbGVuID0gc3RhcnQgLSBsaW1pdCArIDE7CisJLyoKKwkgKiBDb21wdXRlIG1hdGNoIHZhbHVlLCBiYXNlZCBvbiB0aGUgYml0IGF0IHN0YXJ0OiBpZiAxIChmcmVlKQorCSAqIHRoZW4gYWxsLW9uZXMsIGVsc2UgYWxsLXplcm9lcy4KKwkgKi8KKwl3YW50ID0gKCpiICYgKCh4ZnNfcnR3b3JkX3QpMSA8PCBiaXQpKSA/IC0xIDogMDsKKwkvKgorCSAqIElmIHRoZSBzdGFydGluZyBwb3NpdGlvbiBpcyBub3Qgd29yZC1hbGlnbmVkLCBkZWFsIHdpdGggdGhlCisJICogcGFydGlhbCB3b3JkLgorCSAqLworCWlmIChiaXQgPCBYRlNfTkJXT1JEIC0gMSkgeworCQkvKgorCQkgKiBDYWxjdWxhdGUgZmlyc3QgKGxlZnRtb3N0KSBiaXQgbnVtYmVyIHRvIGxvb2sgYXQsCisJCSAqIGFuZCBtYXNrIGZvciBhbGwgdGhlIHJlbGV2YW50IGJpdHMgaW4gdGhpcyB3b3JkLgorCQkgKi8KKwkJZmlyc3RiaXQgPSBYRlNfUlRNQVgoKHhmc19zcnRibG9ja190KShiaXQgLSBsZW4gKyAxKSwgMCk7CisJCW1hc2sgPSAoKCh4ZnNfcnR3b3JkX3QpMSA8PCAoYml0IC0gZmlyc3RiaXQgKyAxKSkgLSAxKSA8PAorCQkJZmlyc3RiaXQ7CisJCS8qCisJCSAqIENhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB2YWx1ZSB0aGVyZQorCQkgKiBhbmQgd2hhdCB3ZSdyZSBsb29raW5nIGZvci4KKwkJICovCisJCWlmICgod2RpZmYgPSAoKmIgXiB3YW50KSAmIG1hc2spKSB7CisJCQkvKgorCQkJICogRGlmZmVyZW50LiAgTWFyayB3aGVyZSB3ZSBhcmUgYW5kIHJldHVybi4KKwkJCSAqLworCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCQkJaSA9IGJpdCAtIFhGU19SVEhJQklUKHdkaWZmKTsKKwkJCSpydGJsb2NrID0gc3RhcnQgLSBpICsgMTsKKwkJCXJldHVybiAwOworCQl9CisJCWkgPSBiaXQgLSBmaXJzdGJpdCArIDE7CisJCS8qCisJCSAqIEdvIG9uIHRvIHByZXZpb3VzIGJsb2NrIGlmIHRoYXQncyB3aGVyZSB0aGUgcHJldmlvdXMgd29yZCBpcworCQkgKiBhbmQgd2UgbmVlZCB0aGUgcHJldmlvdXMgd29yZC4KKwkJICovCisJCWlmICgtLXdvcmQgPT0gLTEgJiYgaSA8IGxlbikgeworCQkJLyoKKwkJCSAqIElmIGRvbmUgd2l0aCB0aGlzIGJsb2NrLCBnZXQgdGhlIHByZXZpb3VzIG9uZS4KKwkJCSAqLworCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCQkJZXJyb3IgPSB4ZnNfcnRidWZfZ2V0KG1wLCB0cCwgLS1ibG9jaywgMCwgJmJwKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCWJ1ZnAgPSAoeGZzX3J0d29yZF90ICopWEZTX0JVRl9QVFIoYnApOworCQkJd29yZCA9IFhGU19CTE9DS1dNQVNLKG1wKTsKKwkJCWIgPSAmYnVmcFt3b3JkXTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBHbyBvbiB0byB0aGUgcHJldmlvdXMgd29yZCBpbiB0aGUgYnVmZmVyLgorCQkJICovCisJCQliLS07CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBTdGFydGluZyBvbiBhIHdvcmQgYm91bmRhcnksIG5vIHBhcnRpYWwgd29yZC4KKwkJICovCisJCWkgPSAwOworCX0KKwkvKgorCSAqIExvb3Agb3ZlciB3aG9sZSB3b3JkcyBpbiBidWZmZXJzLiAgV2hlbiB3ZSB1c2UgdXAgb25lIGJ1ZmZlcgorCSAqIHdlIG1vdmUgb24gdG8gdGhlIHByZXZpb3VzIG9uZS4KKwkgKi8KKwl3aGlsZSAobGVuIC0gaSA+PSBYRlNfTkJXT1JEKSB7CisJCS8qCisJCSAqIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGFjdHVhbCBhbmQgZGVzaXJlZCB2YWx1ZS4KKwkJICovCisJCWlmICgod2RpZmYgPSAqYiBeIHdhbnQpKSB7CisJCQkvKgorCQkJICogRGlmZmVyZW50LCBtYXJrIHdoZXJlIHdlIGFyZSBhbmQgcmV0dXJuLgorCQkJICovCisJCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisJCQlpICs9IFhGU19OQldPUkQgLSAxIC0gWEZTX1JUSElCSVQod2RpZmYpOworCQkJKnJ0YmxvY2sgPSBzdGFydCAtIGkgKyAxOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaSArPSBYRlNfTkJXT1JEOworCQkvKgorCQkgKiBHbyBvbiB0byBwcmV2aW91cyBibG9jayBpZiB0aGF0J3Mgd2hlcmUgdGhlIHByZXZpb3VzIHdvcmQgaXMKKwkJICogYW5kIHdlIG5lZWQgdGhlIHByZXZpb3VzIHdvcmQuCisJCSAqLworCQlpZiAoLS13b3JkID09IC0xICYmIGkgPCBsZW4pIHsKKwkJCS8qCisJCQkgKiBJZiBkb25lIHdpdGggdGhpcyBibG9jaywgZ2V0IHRoZSBwcmV2aW91cyBvbmUuCisJCQkgKi8KKwkJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkJCWVycm9yID0geGZzX3J0YnVmX2dldChtcCwgdHAsIC0tYmxvY2ssIDAsICZicCk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQlidWZwID0gKHhmc19ydHdvcmRfdCAqKVhGU19CVUZfUFRSKGJwKTsKKwkJCXdvcmQgPSBYRlNfQkxPQ0tXTUFTSyhtcCk7CisJCQliID0gJmJ1ZnBbd29yZF07CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogR28gb24gdG8gdGhlIHByZXZpb3VzIHdvcmQgaW4gdGhlIGJ1ZmZlci4KKwkJCSAqLworCQkJYi0tOworCQl9CisJfQorCS8qCisJICogSWYgbm90IGVuZGluZyBvbiBhIHdvcmQgYm91bmRhcnksIGRlYWwgd2l0aCB0aGUgbGFzdAorCSAqIChwYXJ0aWFsKSB3b3JkLgorCSAqLworCWlmIChsZW4gLSBpKSB7CisJCS8qCisJCSAqIENhbGN1bGF0ZSBmaXJzdCAobGVmdG1vc3QpIGJpdCBudW1iZXIgdG8gbG9vayBhdCwKKwkJICogYW5kIG1hc2sgZm9yIGFsbCB0aGUgcmVsZXZhbnQgYml0cyBpbiB0aGlzIHdvcmQuCisJCSAqLworCQlmaXJzdGJpdCA9IFhGU19OQldPUkQgLSAobGVuIC0gaSk7CisJCW1hc2sgPSAoKCh4ZnNfcnR3b3JkX3QpMSA8PCAobGVuIC0gaSkpIC0gMSkgPDwgZmlyc3RiaXQ7CisJCS8qCisJCSAqIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGFjdHVhbCBhbmQgZGVzaXJlZCB2YWx1ZS4KKwkJICovCisJCWlmICgod2RpZmYgPSAoKmIgXiB3YW50KSAmIG1hc2spKSB7CisJCQkvKgorCQkJICogRGlmZmVyZW50LCBtYXJrIHdoZXJlIHdlIGFyZSBhbmQgcmV0dXJuLgorCQkJICovCisJCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisJCQlpICs9IFhGU19OQldPUkQgLSAxIC0gWEZTX1JUSElCSVQod2RpZmYpOworCQkJKnJ0YmxvY2sgPSBzdGFydCAtIGkgKyAxOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJaSA9IGxlbjsKKwl9CisJLyoKKwkgKiBObyBtYXRjaCwgcmV0dXJuIHRoYXQgd2Ugc2Nhbm5lZCB0aGUgd2hvbGUgYXJlYS4KKwkgKi8KKwl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisJKnJ0YmxvY2sgPSBzdGFydCAtIGkgKyAxOworCXJldHVybiAwOworfQorCisvKgorICogU2VhcmNoaW5nIGZvcndhcmQgZnJvbSBzdGFydCB0byBsaW1pdCwgZmluZCB0aGUgZmlyc3QgYmxvY2sgd2hvc2UKKyAqIGFsbG9jYXRlZC9mcmVlIHN0YXRlIGlzIGRpZmZlcmVudCBmcm9tIHN0YXJ0J3MuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ydGZpbmRfZm9ydygKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfcnRibG9ja190CXN0YXJ0LAkJLyogc3RhcnRpbmcgYmxvY2sgdG8gbG9vayBhdCAqLworCXhmc19ydGJsb2NrX3QJbGltaXQsCQkvKiBsYXN0IGJsb2NrIHRvIGxvb2sgYXQgKi8KKwl4ZnNfcnRibG9ja190CSpydGJsb2NrKQkvKiBvdXQ6IHN0YXJ0IGJsb2NrIGZvdW5kICovCit7CisJeGZzX3J0d29yZF90CSpiOwkJLyogY3VycmVudCB3b3JkIGluIGJ1ZmZlciAqLworCWludAkJYml0OwkJLyogYml0IG51bWJlciBpbiB0aGUgd29yZCAqLworCXhmc19ydGJsb2NrX3QJYmxvY2s7CQkvKiBiaXRtYXAgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CSpicDsJCS8qIGJ1ZiBmb3IgdGhlIGJsb2NrICovCisJeGZzX3J0d29yZF90CSpidWZwOwkJLyogc3RhcnRpbmcgd29yZCBpbiBidWZmZXIgKi8KKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgdmFsdWUgKi8KKwl4ZnNfcnRibG9ja190CWk7CQkvKiBjdXJyZW50IGJpdCBudW1iZXIgcmVsLiB0byBzdGFydCAqLworCXhmc19ydGJsb2NrX3QJbGFzdGJpdDsJLyogbGFzdCB1c2VmdWwgYml0IGluIHRoZSB3b3JkICovCisJeGZzX3J0YmxvY2tfdAlsZW47CQkvKiBsZW5ndGggb2YgaW5zcGVjdGVkIGFyZWEgKi8KKwl4ZnNfcnR3b3JkX3QJbWFzazsJCS8qIG1hc2sgb2YgcmVsZXZhbnQgYml0cyBmb3IgdmFsdWUgKi8KKwl4ZnNfcnR3b3JkX3QJd2FudDsJCS8qIG1hc2sgZm9yICJnb29kIiB2YWx1ZXMgKi8KKwl4ZnNfcnR3b3JkX3QJd2RpZmY7CQkvKiBkaWZmZXJlbmNlIGZyb20gd2FudGVkIHZhbHVlICovCisJaW50CQl3b3JkOwkJLyogd29yZCBudW1iZXIgaW4gdGhlIGJ1ZmZlciAqLworCisJLyoKKwkgKiBDb21wdXRlIGFuZCByZWFkIGluIHN0YXJ0aW5nIGJpdG1hcCBibG9jayBmb3Igc3RhcnRpbmcgYmxvY2suCisJICovCisJYmxvY2sgPSBYRlNfQklUVE9CTE9DSyhtcCwgc3RhcnQpOworCWVycm9yID0geGZzX3J0YnVmX2dldChtcCwgdHAsIGJsb2NrLCAwLCAmYnApOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCWJ1ZnAgPSAoeGZzX3J0d29yZF90ICopWEZTX0JVRl9QVFIoYnApOworCS8qCisJICogR2V0IHRoZSBmaXJzdCB3b3JkJ3MgaW5kZXggJiBwb2ludCB0byBpdC4KKwkgKi8KKwl3b3JkID0gWEZTX0JJVFRPV09SRChtcCwgc3RhcnQpOworCWIgPSAmYnVmcFt3b3JkXTsKKwliaXQgPSAoaW50KShzdGFydCAmIChYRlNfTkJXT1JEIC0gMSkpOworCWxlbiA9IGxpbWl0IC0gc3RhcnQgKyAxOworCS8qCisJICogQ29tcHV0ZSBtYXRjaCB2YWx1ZSwgYmFzZWQgb24gdGhlIGJpdCBhdCBzdGFydDogaWYgMSAoZnJlZSkKKwkgKiB0aGVuIGFsbC1vbmVzLCBlbHNlIGFsbC16ZXJvZXMuCisJICovCisJd2FudCA9ICgqYiAmICgoeGZzX3J0d29yZF90KTEgPDwgYml0KSkgPyAtMSA6IDA7CisJLyoKKwkgKiBJZiB0aGUgc3RhcnRpbmcgcG9zaXRpb24gaXMgbm90IHdvcmQtYWxpZ25lZCwgZGVhbCB3aXRoIHRoZQorCSAqIHBhcnRpYWwgd29yZC4KKwkgKi8KKwlpZiAoYml0KSB7CisJCS8qCisJCSAqIENhbGN1bGF0ZSBsYXN0IChyaWdodG1vc3QpIGJpdCBudW1iZXIgdG8gbG9vayBhdCwKKwkJICogYW5kIG1hc2sgZm9yIGFsbCB0aGUgcmVsZXZhbnQgYml0cyBpbiB0aGlzIHdvcmQuCisJCSAqLworCQlsYXN0Yml0ID0gWEZTX1JUTUlOKGJpdCArIGxlbiwgWEZTX05CV09SRCk7CisJCW1hc2sgPSAoKCh4ZnNfcnR3b3JkX3QpMSA8PCAobGFzdGJpdCAtIGJpdCkpIC0gMSkgPDwgYml0OworCQkvKgorCQkgKiBDYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdmFsdWUgdGhlcmUKKwkJICogYW5kIHdoYXQgd2UncmUgbG9va2luZyBmb3IuCisJCSAqLworCQlpZiAoKHdkaWZmID0gKCpiIF4gd2FudCkgJiBtYXNrKSkgeworCQkJLyoKKwkJCSAqIERpZmZlcmVudC4gIE1hcmsgd2hlcmUgd2UgYXJlIGFuZCByZXR1cm4uCisJCQkgKi8KKwkJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkJCWkgPSBYRlNfUlRMT0JJVCh3ZGlmZikgLSBiaXQ7CisJCQkqcnRibG9jayA9IHN0YXJ0ICsgaSAtIDE7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpID0gbGFzdGJpdCAtIGJpdDsKKwkJLyoKKwkJICogR28gb24gdG8gbmV4dCBibG9jayBpZiB0aGF0J3Mgd2hlcmUgdGhlIG5leHQgd29yZCBpcworCQkgKiBhbmQgd2UgbmVlZCB0aGUgbmV4dCB3b3JkLgorCQkgKi8KKwkJaWYgKCsrd29yZCA9PSBYRlNfQkxPQ0tXU0laRShtcCkgJiYgaSA8IGxlbikgeworCQkJLyoKKwkJCSAqIElmIGRvbmUgd2l0aCB0aGlzIGJsb2NrLCBnZXQgdGhlIHByZXZpb3VzIG9uZS4KKwkJCSAqLworCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCQkJZXJyb3IgPSB4ZnNfcnRidWZfZ2V0KG1wLCB0cCwgKytibG9jaywgMCwgJmJwKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCWIgPSBidWZwID0gKHhmc19ydHdvcmRfdCAqKVhGU19CVUZfUFRSKGJwKTsKKwkJCXdvcmQgPSAwOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEdvIG9uIHRvIHRoZSBwcmV2aW91cyB3b3JkIGluIHRoZSBidWZmZXIuCisJCQkgKi8KKwkJCWIrKzsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIFN0YXJ0aW5nIG9uIGEgd29yZCBib3VuZGFyeSwgbm8gcGFydGlhbCB3b3JkLgorCQkgKi8KKwkJaSA9IDA7CisJfQorCS8qCisJICogTG9vcCBvdmVyIHdob2xlIHdvcmRzIGluIGJ1ZmZlcnMuICBXaGVuIHdlIHVzZSB1cCBvbmUgYnVmZmVyCisJICogd2UgbW92ZSBvbiB0byB0aGUgbmV4dCBvbmUuCisJICovCisJd2hpbGUgKGxlbiAtIGkgPj0gWEZTX05CV09SRCkgeworCQkvKgorCQkgKiBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBhY3R1YWwgYW5kIGRlc2lyZWQgdmFsdWUuCisJCSAqLworCQlpZiAoKHdkaWZmID0gKmIgXiB3YW50KSkgeworCQkJLyoKKwkJCSAqIERpZmZlcmVudCwgbWFyayB3aGVyZSB3ZSBhcmUgYW5kIHJldHVybi4KKwkJCSAqLworCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCQkJaSArPSBYRlNfUlRMT0JJVCh3ZGlmZik7CisJCQkqcnRibG9jayA9IHN0YXJ0ICsgaSAtIDE7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpICs9IFhGU19OQldPUkQ7CisJCS8qCisJCSAqIEdvIG9uIHRvIG5leHQgYmxvY2sgaWYgdGhhdCdzIHdoZXJlIHRoZSBuZXh0IHdvcmQgaXMKKwkJICogYW5kIHdlIG5lZWQgdGhlIG5leHQgd29yZC4KKwkJICovCisJCWlmICgrK3dvcmQgPT0gWEZTX0JMT0NLV1NJWkUobXApICYmIGkgPCBsZW4pIHsKKwkJCS8qCisJCQkgKiBJZiBkb25lIHdpdGggdGhpcyBibG9jaywgZ2V0IHRoZSBuZXh0IG9uZS4KKwkJCSAqLworCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCQkJZXJyb3IgPSB4ZnNfcnRidWZfZ2V0KG1wLCB0cCwgKytibG9jaywgMCwgJmJwKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCWIgPSBidWZwID0gKHhmc19ydHdvcmRfdCAqKVhGU19CVUZfUFRSKGJwKTsKKwkJCXdvcmQgPSAwOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEdvIG9uIHRvIHRoZSBuZXh0IHdvcmQgaW4gdGhlIGJ1ZmZlci4KKwkJCSAqLworCQkJYisrOworCQl9CisJfQorCS8qCisJICogSWYgbm90IGVuZGluZyBvbiBhIHdvcmQgYm91bmRhcnksIGRlYWwgd2l0aCB0aGUgbGFzdAorCSAqIChwYXJ0aWFsKSB3b3JkLgorCSAqLworCWlmICgobGFzdGJpdCA9IGxlbiAtIGkpKSB7CisJCS8qCisJCSAqIENhbGN1bGF0ZSBtYXNrIGZvciBhbGwgdGhlIHJlbGV2YW50IGJpdHMgaW4gdGhpcyB3b3JkLgorCQkgKi8KKwkJbWFzayA9ICgoeGZzX3J0d29yZF90KTEgPDwgbGFzdGJpdCkgLSAxOworCQkvKgorCQkgKiBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBhY3R1YWwgYW5kIGRlc2lyZWQgdmFsdWUuCisJCSAqLworCQlpZiAoKHdkaWZmID0gKCpiIF4gd2FudCkgJiBtYXNrKSkgeworCQkJLyoKKwkJCSAqIERpZmZlcmVudCwgbWFyayB3aGVyZSB3ZSBhcmUgYW5kIHJldHVybi4KKwkJCSAqLworCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCQkJaSArPSBYRlNfUlRMT0JJVCh3ZGlmZik7CisJCQkqcnRibG9jayA9IHN0YXJ0ICsgaSAtIDE7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlpID0gbGVuOworCX0KKwkvKgorCSAqIE5vIG1hdGNoLCByZXR1cm4gdGhhdCB3ZSBzY2FubmVkIHRoZSB3aG9sZSBhcmVhLgorCSAqLworCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkqcnRibG9jayA9IHN0YXJ0ICsgaSAtIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNYXJrIGFuIGV4dGVudCBzcGVjaWZpZWQgYnkgc3RhcnQgYW5kIGxlbiBmcmVlZC4KKyAqIFVwZGF0ZXMgYWxsIHRoZSBzdW1tYXJ5IGluZm9ybWF0aW9uIGFzIHdlbGwgYXMgdGhlIGJpdG1hcC4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX3J0ZnJlZV9yYW5nZSgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfcnRibG9ja190CXN0YXJ0LAkJLyogc3RhcnRpbmcgYmxvY2sgdG8gZnJlZSAqLworCXhmc19leHRsZW5fdAlsZW4sCQkvKiBsZW5ndGggdG8gZnJlZSAqLworCXhmc19idWZfdAkqKnJicHAsCQkvKiBpbi9vdXQ6IHN1bW1hcnkgYmxvY2sgYnVmZmVyICovCisJeGZzX2ZzYmxvY2tfdAkqcnNiKQkJLyogaW4vb3V0OiBzdW1tYXJ5IGJsb2NrIG51bWJlciAqLworeworCXhmc19ydGJsb2NrX3QJZW5kOwkJLyogZW5kIG9mIHRoZSBmcmVlZCBleHRlbnQgKi8KKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgdmFsdWUgKi8KKwl4ZnNfcnRibG9ja190CXBvc3RibG9jazsJLyogZmlyc3QgYmxvY2sgZnJlZWQgPiBlbmQgKi8KKwl4ZnNfcnRibG9ja190CXByZWJsb2NrOwkvKiBmaXJzdCBibG9jayBmcmVlZCA8IHN0YXJ0ICovCisKKwllbmQgPSBzdGFydCArIGxlbiAtIDE7CisJLyoKKwkgKiBNb2RpZnkgdGhlIGJpdG1hcCB0byBtYXJrIHRoaXMgZXh0ZW50IGZyZWVkLgorCSAqLworCWVycm9yID0geGZzX3J0bW9kaWZ5X3JhbmdlKG1wLCB0cCwgc3RhcnQsIGxlbiwgMSk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBBc3N1bWUgd2UncmUgZnJlZWluZyBvdXQgb2YgdGhlIG1pZGRsZSBvZiBhbiBhbGxvY2F0ZWQgZXh0ZW50LgorCSAqIFdlIG5lZWQgdG8gZmluZCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIGV4dGVudCBzbyB3ZSBjYW4KKwkgKiBwcm9wZXJseSB1cGRhdGUgdGhlIHN1bW1hcnkuCisJICovCisJZXJyb3IgPSB4ZnNfcnRmaW5kX2JhY2sobXAsIHRwLCBzdGFydCwgMCwgJnByZWJsb2NrKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwkvKgorCSAqIEZpbmQgdGhlIG5leHQgYWxsb2NhdGVkIGJsb2NrIChlbmQgb2YgYWxsb2NhdGVkIGV4dGVudCkuCisJICovCisJZXJyb3IgPSB4ZnNfcnRmaW5kX2ZvcncobXAsIHRwLCBlbmQsIG1wLT5tX3NiLnNiX3JleHRlbnRzIC0gMSwKKwkJJnBvc3RibG9jayk7CisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgYmxvY2tzIG5vdCBiZWluZyBmcmVlZCBhdCB0aGUgZnJvbnQgb2YgdGhlCisJICogb2xkIGV4dGVudCwgYWRkIHN1bW1hcnkgZGF0YSBmb3IgdGhlbSB0byBiZSBhbGxvY2F0ZWQuCisJICovCisJaWYgKHByZWJsb2NrIDwgc3RhcnQpIHsKKwkJZXJyb3IgPSB4ZnNfcnRtb2RpZnlfc3VtbWFyeShtcCwgdHAsCisJCQlYRlNfUlRCTE9DS0xPRyhzdGFydCAtIHByZWJsb2NrKSwKKwkJCVhGU19CSVRUT0JMT0NLKG1wLCBwcmVibG9jayksIC0xLCByYnBwLCByc2IpOworCQlpZiAoZXJyb3IpIHsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCX0KKwkvKgorCSAqIElmIHRoZXJlIGFyZSBibG9ja3Mgbm90IGJlaW5nIGZyZWVkIGF0IHRoZSBlbmQgb2YgdGhlCisJICogb2xkIGV4dGVudCwgYWRkIHN1bW1hcnkgZGF0YSBmb3IgdGhlbSB0byBiZSBhbGxvY2F0ZWQuCisJICovCisJaWYgKHBvc3RibG9jayA+IGVuZCkgeworCQllcnJvciA9IHhmc19ydG1vZGlmeV9zdW1tYXJ5KG1wLCB0cCwKKwkJCVhGU19SVEJMT0NLTE9HKHBvc3RibG9jayAtIGVuZCksCisJCQlYRlNfQklUVE9CTE9DSyhtcCwgZW5kICsgMSksIC0xLCByYnBwLCByc2IpOworCQlpZiAoZXJyb3IpIHsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCX0KKwkvKgorCSAqIEluY3JlbWVudCB0aGUgc3VtbWFyeSBpbmZvcm1hdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbnRpcmUKKwkgKiAobmV3KSBmcmVlIGV4dGVudC4KKwkgKi8KKwllcnJvciA9IHhmc19ydG1vZGlmeV9zdW1tYXJ5KG1wLCB0cCwKKwkJWEZTX1JUQkxPQ0tMT0cocG9zdGJsb2NrICsgMSAtIHByZWJsb2NrKSwKKwkJWEZTX0JJVFRPQkxPQ0sobXAsIHByZWJsb2NrKSwgMSwgcmJwcCwgcnNiKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBSZWFkIGFuZCByZXR1cm4gdGhlIHN1bW1hcnkgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gZXh0ZW50IHNpemUsCisgKiBiaXRtYXAgYmxvY2sgY29tYmluYXRpb24uCisgKiBLZWVwcyB0cmFjayBvZiBhIGN1cnJlbnQgc3VtbWFyeSBibG9jaywgc28gd2UgZG9uJ3Qga2VlcCByZWFkaW5nCisgKiBpdCBmcm9tIHRoZSBidWZmZXIgY2FjaGUuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ydGdldF9zdW1tYXJ5KAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwlpbnQJCWxvZywJCS8qIGxvZzIgb2YgZXh0ZW50IHNpemUgKi8KKwl4ZnNfcnRibG9ja190CWJibm8sCQkvKiBiaXRtYXAgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CSoqcmJwcCwJCS8qIGluL291dDogc3VtbWFyeSBibG9jayBidWZmZXIgKi8KKwl4ZnNfZnNibG9ja190CSpyc2IsCQkvKiBpbi9vdXQ6IHN1bW1hcnkgYmxvY2sgbnVtYmVyICovCisJeGZzX3N1bWluZm9fdAkqc3VtKQkJLyogb3V0OiBzdW1tYXJ5IGluZm8gZm9yIHRoaXMgYmxvY2sgKi8KK3sKKwl4ZnNfYnVmX3QJKmJwOwkJLyogYnVmZmVyIGZvciBzdW1tYXJ5IGJsb2NrICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHZhbHVlICovCisJeGZzX2ZzYmxvY2tfdAlzYjsJCS8qIHN1bW1hcnkgZnNibG9jayAqLworCWludAkJc287CQkvKiBpbmRleCBpbnRvIHRoZSBzdW1tYXJ5IGZpbGUgKi8KKwl4ZnNfc3VtaW5mb190CSpzcDsJCS8qIHBvaW50ZXIgdG8gcmV0dXJuZWQgZGF0YSAqLworCisJLyoKKwkgKiBDb21wdXRlIGVudHJ5IG51bWJlciBpbiB0aGUgc3VtbWFyeSBmaWxlLgorCSAqLworCXNvID0gWEZTX1NVTU9GRlMobXAsIGxvZywgYmJubyk7CisJLyoKKwkgKiBDb21wdXRlIHRoZSBibG9jayBudW1iZXIgaW4gdGhlIHN1bW1hcnkgZmlsZS4KKwkgKi8KKwlzYiA9IFhGU19TVU1PRkZTVE9CTE9DSyhtcCwgc28pOworCS8qCisJICogSWYgd2UgaGF2ZSBhbiBvbGQgYnVmZmVyLCBhbmQgdGhlIGJsb2NrIG51bWJlciBtYXRjaGVzLCB1c2UgdGhhdC4KKwkgKi8KKwlpZiAocmJwcCAmJiAqcmJwcCAmJiAqcnNiID09IHNiKQorCQlicCA9ICpyYnBwOworCS8qCisJICogT3RoZXJ3aXNlIHdlIGhhdmUgdG8gZ2V0IHRoZSBidWZmZXIuCisJICovCisJZWxzZSB7CisJCS8qCisJCSAqIElmIHRoZXJlIHdhcyBhbiBvbGQgb25lLCBnZXQgcmlkIG9mIGl0IGZpcnN0LgorCQkgKi8KKwkJaWYgKHJicHAgJiYgKnJicHApCisJCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCAqcmJwcCk7CisJCWVycm9yID0geGZzX3J0YnVmX2dldChtcCwgdHAsIHNiLCAxLCAmYnApOworCQlpZiAoZXJyb3IpIHsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQkvKgorCQkgKiBSZW1lbWJlciB0aGlzIGJ1ZmZlciBhbmQgYmxvY2sgZm9yIHRoZSBuZXh0IGNhbGwuCisJCSAqLworCQlpZiAocmJwcCkgeworCQkJKnJicHAgPSBicDsKKwkJCSpyc2IgPSBzYjsKKwkJfQorCX0KKwkvKgorCSAqIFBvaW50IHRvIHRoZSBzdW1tYXJ5IGluZm9ybWF0aW9uICYgY29weSBpdCBvdXQuCisJICovCisJc3AgPSBYRlNfU1VNUFRSKG1wLCBicCwgc28pOworCSpzdW0gPSAqc3A7CisJLyoKKwkgKiBEcm9wIHRoZSBidWZmZXIgaWYgd2UncmUgbm90IGFza2VkIHRvIHJlbWVtYmVyIGl0LgorCSAqLworCWlmICghcmJwcCkKKwkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCXJldHVybiAwOworfQorCisvKgorICogU2V0IHRoZSBnaXZlbiByYW5nZSBvZiBiaXRtYXAgYml0cyB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgKiBEbyB3aGF0ZXZlciBJL08gYW5kIGxvZ2dpbmcgaXMgcmVxdWlyZWQuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ydG1vZGlmeV9yYW5nZSgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfcnRibG9ja190CXN0YXJ0LAkJLyogc3RhcnRpbmcgYmxvY2sgdG8gbW9kaWZ5ICovCisJeGZzX2V4dGxlbl90CWxlbiwJCS8qIGxlbmd0aCBvZiBleHRlbnQgdG8gbW9kaWZ5ICovCisJaW50CQl2YWwpCQkvKiAxIGZvciBmcmVlLCAwIGZvciBhbGxvY2F0ZWQgKi8KK3sKKwl4ZnNfcnR3b3JkX3QJKmI7CQkvKiBjdXJyZW50IHdvcmQgaW4gYnVmZmVyICovCisJaW50CQliaXQ7CQkvKiBiaXQgbnVtYmVyIGluIHRoZSB3b3JkICovCisJeGZzX3J0YmxvY2tfdAlibG9jazsJCS8qIGJpdG1hcCBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJKmJwOwkJLyogYnVmIGZvciB0aGUgYmxvY2sgKi8KKwl4ZnNfcnR3b3JkX3QJKmJ1ZnA7CQkvKiBzdGFydGluZyB3b3JkIGluIGJ1ZmZlciAqLworCWludAkJZXJyb3I7CQkvKiBlcnJvciB2YWx1ZSAqLworCXhmc19ydHdvcmRfdAkqZmlyc3Q7CQkvKiBmaXJzdCB1c2VkIHdvcmQgaW4gdGhlIGJ1ZmZlciAqLworCWludAkJaTsJCS8qIGN1cnJlbnQgYml0IG51bWJlciByZWwuIHRvIHN0YXJ0ICovCisJaW50CQlsYXN0Yml0OwkvKiBsYXN0IHVzZWZ1bCBiaXQgaW4gd29yZCAqLworCXhmc19ydHdvcmRfdAltYXNrOwkJLyogbWFzayBvIGZyZWxldmFudCBiaXRzIGZvciB2YWx1ZSAqLworCWludAkJd29yZDsJCS8qIHdvcmQgbnVtYmVyIGluIHRoZSBidWZmZXIgKi8KKworCS8qCisJICogQ29tcHV0ZSBzdGFydGluZyBiaXRtYXAgYmxvY2sgbnVtYmVyLgorCSAqLworCWJsb2NrID0gWEZTX0JJVFRPQkxPQ0sobXAsIHN0YXJ0KTsKKwkvKgorCSAqIFJlYWQgdGhlIGJpdG1hcCBibG9jaywgYW5kIHBvaW50IHRvIGl0cyBkYXRhLgorCSAqLworCWVycm9yID0geGZzX3J0YnVmX2dldChtcCwgdHAsIGJsb2NrLCAwLCAmYnApOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCWJ1ZnAgPSAoeGZzX3J0d29yZF90ICopWEZTX0JVRl9QVFIoYnApOworCS8qCisJICogQ29tcHV0ZSB0aGUgc3RhcnRpbmcgd29yZCdzIGFkZHJlc3MsIGFuZCBzdGFydGluZyBiaXQuCisJICovCisJd29yZCA9IFhGU19CSVRUT1dPUkQobXAsIHN0YXJ0KTsKKwlmaXJzdCA9IGIgPSAmYnVmcFt3b3JkXTsKKwliaXQgPSAoaW50KShzdGFydCAmIChYRlNfTkJXT1JEIC0gMSkpOworCS8qCisJICogMCAoYWxsb2NhdGVkKSA9PiBhbGwgemVyb2VzOyAxIChmcmVlKSA9PiBhbGwgb25lcy4KKwkgKi8KKwl2YWwgPSAtdmFsOworCS8qCisJICogSWYgbm90IHN0YXJ0aW5nIG9uIGEgd29yZCBib3VuZGFyeSwgZGVhbCB3aXRoIHRoZSBmaXJzdAorCSAqIChwYXJ0aWFsKSB3b3JkLgorCSAqLworCWlmIChiaXQpIHsKKwkJLyoKKwkJICogQ29tcHV0ZSBmaXJzdCBiaXQgbm90IGNoYW5nZWQgYW5kIG1hc2sgb2YgcmVsZXZhbnQgYml0cy4KKwkJICovCisJCWxhc3RiaXQgPSBYRlNfUlRNSU4oYml0ICsgbGVuLCBYRlNfTkJXT1JEKTsKKwkJbWFzayA9ICgoKHhmc19ydHdvcmRfdCkxIDw8IChsYXN0Yml0IC0gYml0KSkgLSAxKSA8PCBiaXQ7CisJCS8qCisJCSAqIFNldC9jbGVhciB0aGUgYWN0aXZlIGJpdHMuCisJCSAqLworCQlpZiAodmFsKQorCQkJKmIgfD0gbWFzazsKKwkJZWxzZQorCQkJKmIgJj0gfm1hc2s7CisJCWkgPSBsYXN0Yml0IC0gYml0OworCQkvKgorCQkgKiBHbyBvbiB0byB0aGUgbmV4dCBibG9jayBpZiB0aGF0J3Mgd2hlcmUgdGhlIG5leHQgd29yZCBpcworCQkgKiBhbmQgd2UgbmVlZCB0aGUgbmV4dCB3b3JkLgorCQkgKi8KKwkJaWYgKCsrd29yZCA9PSBYRlNfQkxPQ0tXU0laRShtcCkgJiYgaSA8IGxlbikgeworCQkJLyoKKwkJCSAqIExvZyB0aGUgY2hhbmdlZCBwYXJ0IG9mIHRoaXMgYmxvY2suCisJCQkgKiBHZXQgdGhlIG5leHQgb25lLgorCQkJICovCisJCQl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYnAsCisJCQkJKHVpbnQpKChjaGFyICopZmlyc3QgLSAoY2hhciAqKWJ1ZnApLAorCQkJCSh1aW50KSgoY2hhciAqKWIgLSAoY2hhciAqKWJ1ZnApKTsKKwkJCWVycm9yID0geGZzX3J0YnVmX2dldChtcCwgdHAsICsrYmxvY2ssIDAsICZicCk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQlmaXJzdCA9IGIgPSBidWZwID0gKHhmc19ydHdvcmRfdCAqKVhGU19CVUZfUFRSKGJwKTsKKwkJCXdvcmQgPSAwOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEdvIG9uIHRvIHRoZSBuZXh0IHdvcmQgaW4gdGhlIGJ1ZmZlcgorCQkJICovCisJCQliKys7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBTdGFydGluZyBvbiBhIHdvcmQgYm91bmRhcnksIG5vIHBhcnRpYWwgd29yZC4KKwkJICovCisJCWkgPSAwOworCX0KKwkvKgorCSAqIExvb3Agb3ZlciB3aG9sZSB3b3JkcyBpbiBidWZmZXJzLiAgV2hlbiB3ZSB1c2UgdXAgb25lIGJ1ZmZlcgorCSAqIHdlIG1vdmUgb24gdG8gdGhlIG5leHQgb25lLgorCSAqLworCXdoaWxlIChsZW4gLSBpID49IFhGU19OQldPUkQpIHsKKwkJLyoKKwkJICogU2V0IHRoZSB3b3JkIHZhbHVlIGNvcnJlY3RseS4KKwkJICovCisJCSpiID0gdmFsOworCQlpICs9IFhGU19OQldPUkQ7CisJCS8qCisJCSAqIEdvIG9uIHRvIHRoZSBuZXh0IGJsb2NrIGlmIHRoYXQncyB3aGVyZSB0aGUgbmV4dCB3b3JkIGlzCisJCSAqIGFuZCB3ZSBuZWVkIHRoZSBuZXh0IHdvcmQuCisJCSAqLworCQlpZiAoKyt3b3JkID09IFhGU19CTE9DS1dTSVpFKG1wKSAmJiBpIDwgbGVuKSB7CisJCQkvKgorCQkJICogTG9nIHRoZSBjaGFuZ2VkIHBhcnQgb2YgdGhpcyBibG9jay4KKwkJCSAqIEdldCB0aGUgbmV4dCBvbmUuCisJCQkgKi8KKwkJCXhmc190cmFuc19sb2dfYnVmKHRwLCBicCwKKwkJCQkodWludCkoKGNoYXIgKilmaXJzdCAtIChjaGFyICopYnVmcCksCisJCQkJKHVpbnQpKChjaGFyICopYiAtIChjaGFyICopYnVmcCkpOworCQkJZXJyb3IgPSB4ZnNfcnRidWZfZ2V0KG1wLCB0cCwgKytibG9jaywgMCwgJmJwKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCWZpcnN0ID0gYiA9IGJ1ZnAgPSAoeGZzX3J0d29yZF90ICopWEZTX0JVRl9QVFIoYnApOworCQkJd29yZCA9IDA7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogR28gb24gdG8gdGhlIG5leHQgd29yZCBpbiB0aGUgYnVmZmVyCisJCQkgKi8KKwkJCWIrKzsKKwkJfQorCX0KKwkvKgorCSAqIElmIG5vdCBlbmRpbmcgb24gYSB3b3JkIGJvdW5kYXJ5LCBkZWFsIHdpdGggdGhlIGxhc3QKKwkgKiAocGFydGlhbCkgd29yZC4KKwkgKi8KKwlpZiAoKGxhc3RiaXQgPSBsZW4gLSBpKSkgeworCQkvKgorCQkgKiBDb21wdXRlIGEgbWFzayBvZiByZWxldmFudCBiaXRzLgorCQkgKi8KKwkJYml0ID0gMDsKKwkJbWFzayA9ICgoeGZzX3J0d29yZF90KTEgPDwgbGFzdGJpdCkgLSAxOworCQkvKgorCQkgKiBTZXQvY2xlYXIgdGhlIGFjdGl2ZSBiaXRzLgorCQkgKi8KKwkJaWYgKHZhbCkKKwkJCSpiIHw9IG1hc2s7CisJCWVsc2UKKwkJCSpiICY9IH5tYXNrOworCQliKys7CisJfQorCS8qCisJICogTG9nIGFueSByZW1haW5pbmcgY2hhbmdlZCBieXRlcy4KKwkgKi8KKwlpZiAoYiA+IGZpcnN0KQorCQl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYnAsICh1aW50KSgoY2hhciAqKWZpcnN0IC0gKGNoYXIgKilidWZwKSwKKwkJCSh1aW50KSgoY2hhciAqKWIgLSAoY2hhciAqKWJ1ZnAgLSAxKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIGFuZCBtb2RpZnkgdGhlIHN1bW1hcnkgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gZXh0ZW50IHNpemUsCisgKiBiaXRtYXAgYmxvY2sgY29tYmluYXRpb24uCisgKiBLZWVwcyB0cmFjayBvZiBhIGN1cnJlbnQgc3VtbWFyeSBibG9jaywgc28gd2UgZG9uJ3Qga2VlcCByZWFkaW5nCisgKiBpdCBmcm9tIHRoZSBidWZmZXIgY2FjaGUuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ydG1vZGlmeV9zdW1tYXJ5KAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCWludAkJbG9nLAkJLyogbG9nMiBvZiBleHRlbnQgc2l6ZSAqLworCXhmc19ydGJsb2NrX3QJYmJubywJCS8qIGJpdG1hcCBibG9jayBudW1iZXIgKi8KKwlpbnQJCWRlbHRhLAkJLyogY2hhbmdlIHRvIG1ha2UgdG8gc3VtbWFyeSBpbmZvICovCisJeGZzX2J1Zl90CSoqcmJwcCwJCS8qIGluL291dDogc3VtbWFyeSBibG9jayBidWZmZXIgKi8KKwl4ZnNfZnNibG9ja190CSpyc2IpCQkvKiBpbi9vdXQ6IHN1bW1hcnkgYmxvY2sgbnVtYmVyICovCit7CisJeGZzX2J1Zl90CSpicDsJCS8qIGJ1ZmZlciBmb3IgdGhlIHN1bW1hcnkgYmxvY2sgKi8KKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgdmFsdWUgKi8KKwl4ZnNfZnNibG9ja190CXNiOwkJLyogc3VtbWFyeSBmc2Jsb2NrICovCisJaW50CQlzbzsJCS8qIGluZGV4IGludG8gdGhlIHN1bW1hcnkgZmlsZSAqLworCXhmc19zdW1pbmZvX3QJKnNwOwkJLyogcG9pbnRlciB0byByZXR1cm5lZCBkYXRhICovCisKKwkvKgorCSAqIENvbXB1dGUgZW50cnkgbnVtYmVyIGluIHRoZSBzdW1tYXJ5IGZpbGUuCisJICovCisJc28gPSBYRlNfU1VNT0ZGUyhtcCwgbG9nLCBiYm5vKTsKKwkvKgorCSAqIENvbXB1dGUgdGhlIGJsb2NrIG51bWJlciBpbiB0aGUgc3VtbWFyeSBmaWxlLgorCSAqLworCXNiID0gWEZTX1NVTU9GRlNUT0JMT0NLKG1wLCBzbyk7CisJLyoKKwkgKiBJZiB3ZSBoYXZlIGFuIG9sZCBidWZmZXIsIGFuZCB0aGUgYmxvY2sgbnVtYmVyIG1hdGNoZXMsIHVzZSB0aGF0LgorCSAqLworCWlmIChyYnBwICYmICpyYnBwICYmICpyc2IgPT0gc2IpCisJCWJwID0gKnJicHA7CisJLyoKKwkgKiBPdGhlcndpc2Ugd2UgaGF2ZSB0byBnZXQgdGhlIGJ1ZmZlci4KKwkgKi8KKwllbHNlIHsKKwkJLyoKKwkJICogSWYgdGhlcmUgd2FzIGFuIG9sZCBvbmUsIGdldCByaWQgb2YgaXQgZmlyc3QuCisJCSAqLworCQlpZiAocmJwcCAmJiAqcmJwcCkKKwkJCXhmc190cmFuc19icmVsc2UodHAsICpyYnBwKTsKKwkJZXJyb3IgPSB4ZnNfcnRidWZfZ2V0KG1wLCB0cCwgc2IsIDEsICZicCk7CisJCWlmIChlcnJvcikgeworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCS8qCisJCSAqIFJlbWVtYmVyIHRoaXMgYnVmZmVyIGFuZCBibG9jayBmb3IgdGhlIG5leHQgY2FsbC4KKwkJICovCisJCWlmIChyYnBwKSB7CisJCQkqcmJwcCA9IGJwOworCQkJKnJzYiA9IHNiOworCQl9CisJfQorCS8qCisJICogUG9pbnQgdG8gdGhlIHN1bW1hcnkgaW5mb3JtYXRpb24sIG1vZGlmeSBhbmQgbG9nIGl0LgorCSAqLworCXNwID0gWEZTX1NVTVBUUihtcCwgYnAsIHNvKTsKKwkqc3AgKz0gZGVsdGE7CisJeGZzX3RyYW5zX2xvZ19idWYodHAsIGJwLCAodWludCkoKGNoYXIgKilzcCAtIChjaGFyICopWEZTX0JVRl9QVFIoYnApKSwKKwkJKHVpbnQpKChjaGFyICopc3AgLSAoY2hhciAqKVhGU19CVUZfUFRSKGJwKSArIHNpemVvZigqc3ApIC0gMSkpOworCXJldHVybiAwOworfQorCisvKgorICogVmlzaWJsZSAoZXhwb3J0ZWQpIGZ1bmN0aW9ucy4KKyAqLworCisvKgorICogR3JvdyB0aGUgcmVhbHRpbWUgYXJlYSBvZiB0aGUgZmlsZXN5c3RlbS4KKyAqLworaW50Cit4ZnNfZ3Jvd2ZzX3J0KAorCXhmc19tb3VudF90CSptcCwJCS8qIG1vdW50IHBvaW50IGZvciBmaWxlc3lzdGVtICovCisJeGZzX2dyb3dmc19ydF90CSppbikJCS8qIGdyb3dmcyBydCBpbnB1dCBzdHJ1Y3QgKi8KK3sKKwl4ZnNfcnRibG9ja190CWJtYm5vOwkJLyogYml0bWFwIGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkqYnA7CQkvKiB0ZW1wb3JhcnkgYnVmZmVyICovCisJaW50CQljYW5jZWxmbGFnczsJLyogZmxhZ3MgZm9yIHhmc190cmFuc19jYW5jZWwgKi8KKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX2lub2RlX3QJKmlwOwkJLyogYml0bWFwIGlub2RlLCB1c2VkIGFzIGxvY2sgKi8KKwl4ZnNfbW91bnRfdAkqbm1wOwkJLyogbmV3IChmYWtlKSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZHJmc2Jub190CW5yYmxvY2tzOwkvKiBuZXcgbnVtYmVyIG9mIHJlYWx0aW1lIGJsb2NrcyAqLworCXhmc19leHRsZW5fdAlucmJtYmxvY2tzOwkvKiBuZXcgbnVtYmVyIG9mIHJ0IGJpdG1hcCBibG9ja3MgKi8KKwl4ZnNfZHJ0Ym5vX3QJbnJleHRlbnRzOwkvKiBuZXcgbnVtYmVyIG9mIHJlYWx0aW1lIGV4dGVudHMgKi8KKwl1aW50OF90CQlucmV4dHNsb2c7CS8qIG5ldyBsb2cyIG9mIHNiX3JleHRlbnRzICovCisJeGZzX2V4dGxlbl90CW5yc3VtYmxvY2tzOwkvKiBuZXcgbnVtYmVyIG9mIHN1bW1hcnkgYmxvY2tzICovCisJdWludAkJbnJzdW1sZXZlbHM7CS8qIG5ldyBydCBzdW1tYXJ5IGxldmVscyAqLworCXVpbnQJCW5yc3Vtc2l6ZTsJLyogbmV3IHNpemUgb2YgcnQgc3VtbWFyeSwgYnl0ZXMgKi8KKwl4ZnNfc2JfdAkqbnNicDsJCS8qIG5ldyBzdXBlcmJsb2NrICovCisJeGZzX2V4dGxlbl90CXJibWJsb2NrczsJLyogY3VycmVudCBudW1iZXIgb2YgcnQgYml0bWFwIGJsb2NrcyAqLworCXhmc19leHRsZW5fdAlyc3VtYmxvY2tzOwkvKiBjdXJyZW50IG51bWJlciBvZiBydCBzdW1tYXJ5IGJsa3MgKi8KKwl4ZnNfc2JfdAkqc2JwOwkJLyogb2xkIHN1cGVyYmxvY2sgKi8KKwl4ZnNfZnNibG9ja190CXN1bWJubzsJCS8qIHN1bW1hcnkgYmxvY2sgbnVtYmVyICovCisJeGZzX3RyYW5zX3QJKnRwOwkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCisJc2JwID0gJm1wLT5tX3NiOworCS8qCisJICogSW5pdGlhbCBlcnJvciBjaGVja2luZy4KKwkgKi8KKwlpZiAobXAtPm1fcnRkZXZfdGFyZ3AgfHwgbXAtPm1fcmJtaXAgPT0gTlVMTCB8fAorCSAgICAobnJibG9ja3MgPSBpbi0+bmV3YmxvY2tzKSA8PSBzYnAtPnNiX3JibG9ja3MgfHwKKwkgICAgKHNicC0+c2JfcmJsb2NrcyAmJiAoaW4tPmV4dHNpemUgIT0gc2JwLT5zYl9yZXh0c2l6ZSkpKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJLyoKKwkgKiBSZWFkIGluIHRoZSBsYXN0IGJsb2NrIG9mIHRoZSBkZXZpY2UsIG1ha2Ugc3VyZSBpdCBleGlzdHMuCisJICovCisJZXJyb3IgPSB4ZnNfcmVhZF9idWYobXAsIG1wLT5tX3J0ZGV2X3RhcmdwLAorCQkJWEZTX0ZTQl9UT19CQihtcCwgaW4tPm5ld2Jsb2NrcyAtIDEpLAorCQkJWEZTX0ZTQl9UT19CQihtcCwgMSksIDAsICZicCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJQVNTRVJUKGJwKTsKKwl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkvKgorCSAqIENhbGN1bGF0ZSBuZXcgcGFyYW1ldGVycy4gIFRoZXNlIGFyZSB0aGUgZmluYWwgdmFsdWVzIHRvIGJlIHJlYWNoZWQuCisJICovCisJbnJleHRlbnRzID0gbnJibG9ja3M7CisJZG9fZGl2KG5yZXh0ZW50cywgaW4tPmV4dHNpemUpOworCW5yYm1ibG9ja3MgPSByb3VuZHVwXzY0KG5yZXh0ZW50cywgTkJCWSAqIHNicC0+c2JfYmxvY2tzaXplKTsKKwlucmV4dHNsb2cgPSB4ZnNfaGlnaGJpdDMyKG5yZXh0ZW50cyk7CisJbnJzdW1sZXZlbHMgPSBucmV4dHNsb2cgKyAxOworCW5yc3Vtc2l6ZSA9ICh1aW50KXNpemVvZih4ZnNfc3VtaW5mb190KSAqIG5yc3VtbGV2ZWxzICogbnJibWJsb2NrczsKKwlucnN1bWJsb2NrcyA9IFhGU19CX1RPX0ZTQihtcCwgbnJzdW1zaXplKTsKKwlucnN1bXNpemUgPSBYRlNfRlNCX1RPX0IobXAsIG5yc3VtYmxvY2tzKTsKKwkvKgorCSAqIE5ldyBzdW1tYXJ5IHNpemUgY2FuJ3QgYmUgbW9yZSB0aGFuIGhhbGYgdGhlIHNpemUgb2YKKwkgKiB0aGUgbG9nLiAgVGhpcyBwcmV2ZW50cyB1cyBmcm9tIGdldHRpbmcgYSBsb2cgb3ZlcmZsb3csCisJICogc2luY2Ugd2UnbGwgbG9nIGJhc2ljYWxseSB0aGUgd2hvbGUgc3VtbWFyeSBmaWxlIGF0IG9uY2UuCisJICovCisJaWYgKG5yc3VtYmxvY2tzID4gKG1wLT5tX3NiLnNiX2xvZ2Jsb2NrcyA+PiAxKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCS8qCisJICogR2V0IHRoZSBvbGQgYmxvY2sgY291bnRzIGZvciBiaXRtYXAgYW5kIHN1bW1hcnkgaW5vZGVzLgorCSAqIFRoZXNlIGNhbid0IGNoYW5nZSBzaW5jZSBvdGhlciBncm93ZnMgY2FsbGVycyBhcmUgbG9ja2VkIG91dC4KKwkgKi8KKwlyYm1ibG9ja3MgPSBYRlNfQl9UT19GU0IobXAsIG1wLT5tX3JibWlwLT5pX2QuZGlfc2l6ZSk7CisJcnN1bWJsb2NrcyA9IFhGU19CX1RPX0ZTQihtcCwgbXAtPm1fcnN1bWlwLT5pX2QuZGlfc2l6ZSk7CisJLyoKKwkgKiBBbGxvY2F0ZSBzcGFjZSB0byB0aGUgYml0bWFwIGFuZCBzdW1tYXJ5IGZpbGVzLCBhcyBuZWNlc3NhcnkuCisJICovCisJaWYgKChlcnJvciA9IHhmc19ncm93ZnNfcnRfYWxsb2MobXAsIHJibWJsb2NrcywgbnJibWJsb2NrcywKKwkJCW1wLT5tX3NiLnNiX3JibWlubykpKQorCQlyZXR1cm4gZXJyb3I7CisJaWYgKChlcnJvciA9IHhmc19ncm93ZnNfcnRfYWxsb2MobXAsIHJzdW1ibG9ja3MsIG5yc3VtYmxvY2tzLAorCQkJbXAtPm1fc2Iuc2JfcnN1bWlubykpKQorCQlyZXR1cm4gZXJyb3I7CisJbm1wID0gTlVMTDsKKwkvKgorCSAqIExvb3Agb3ZlciB0aGUgYml0bWFwIGJsb2Nrcy4KKwkgKiBXZSB3aWxsIGRvIGV2ZXJ5dGhpbmcgb25lIGJpdG1hcCBibG9jayBhdCBhIHRpbWUuCisJICogU2tpcCB0aGUgY3VycmVudCBibG9jayBpZiBpdCBpcyBleGFjdGx5IGZ1bGwuCisJICogVGhpcyBhbHNvIGRlYWxzIHdpdGggdGhlIGNhc2Ugd2hlcmUgdGhlcmUgd2VyZSBubyBydGV4dGVudHMgYmVmb3JlLgorCSAqLworCWZvciAoYm1ibm8gPSBzYnAtPnNiX3JibWJsb2NrcyAtCisJCSAgICAgKChzYnAtPnNiX3JleHRlbnRzICYgKCgxIDw8IG1wLT5tX2Jsa2JpdF9sb2cpIC0gMSkpICE9IDApOworCSAgICAgYm1ibm8gPCBucmJtYmxvY2tzOworCSAgICAgYm1ibm8rKykgeworCQkvKgorCQkgKiBBbGxvY2F0ZSBhIG5ldyAoZmFrZSkgbW91bnQvc2IuCisJCSAqLworCQlubXAgPSBrbWVtX2FsbG9jKHNpemVvZigqbm1wKSwgS01fU0xFRVApOworCQkqbm1wID0gKm1wOworCQluc2JwID0gJm5tcC0+bV9zYjsKKwkJLyoKKwkJICogQ2FsY3VsYXRlIG5ldyBzYiBhbmQgbW91bnQgZmllbGRzIGZvciB0aGlzIHJvdW5kLgorCQkgKi8KKwkJbnNicC0+c2JfcmV4dHNpemUgPSBpbi0+ZXh0c2l6ZTsKKwkJbnNicC0+c2JfcmJtYmxvY2tzID0gYm1ibm8gKyAxOworCQluc2JwLT5zYl9yYmxvY2tzID0KKwkJCVhGU19SVE1JTihucmJsb2NrcywKKwkJCQkgIG5zYnAtPnNiX3JibWJsb2NrcyAqIE5CQlkgKgorCQkJCSAgbnNicC0+c2JfYmxvY2tzaXplICogbnNicC0+c2JfcmV4dHNpemUpOworCQluc2JwLT5zYl9yZXh0ZW50cyA9IG5zYnAtPnNiX3JibG9ja3M7CisJCWRvX2Rpdihuc2JwLT5zYl9yZXh0ZW50cywgbnNicC0+c2JfcmV4dHNpemUpOworCQluc2JwLT5zYl9yZXh0c2xvZyA9IHhmc19oaWdoYml0MzIobnNicC0+c2JfcmV4dGVudHMpOworCQlucnN1bWxldmVscyA9IG5tcC0+bV9yc3VtbGV2ZWxzID0gbnNicC0+c2JfcmV4dHNsb2cgKyAxOworCQlucnN1bXNpemUgPQorCQkJKHVpbnQpc2l6ZW9mKHhmc19zdW1pbmZvX3QpICogbnJzdW1sZXZlbHMgKgorCQkJbnNicC0+c2JfcmJtYmxvY2tzOworCQlucnN1bWJsb2NrcyA9IFhGU19CX1RPX0ZTQihtcCwgbnJzdW1zaXplKTsKKwkJbm1wLT5tX3JzdW1zaXplID0gbnJzdW1zaXplID0gWEZTX0ZTQl9UT19CKG1wLCBucnN1bWJsb2Nrcyk7CisJCS8qCisJCSAqIFN0YXJ0IGEgdHJhbnNhY3Rpb24sIGdldCB0aGUgbG9nIHJlc2VydmF0aW9uLgorCQkgKi8KKwkJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19HUk9XRlNSVF9GUkVFKTsKKwkJY2FuY2VsZmxhZ3MgPSAwOworCQlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsCisJCQkJWEZTX0dST1dSVEZSRUVfTE9HX1JFUyhubXApLCAwLCAwLCAwKSkpCisJCQlnb3RvIGVycm9yX2V4aXQ7CisJCS8qCisJCSAqIExvY2sgb3V0IG90aGVyIGNhbGxlcnMgYnkgZ3JhYmJpbmcgdGhlIGJpdG1hcCBpbm9kZSBsb2NrLgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc190cmFuc19pZ2V0KG1wLCB0cCwgMCwgbXAtPm1fc2Iuc2JfcmJtaW5vLAorCQkJCVhGU19JTE9DS19FWENMLCAmaXApKSkKKwkJCWdvdG8gZXJyb3JfZXhpdDsKKwkJQVNTRVJUKGlwID09IG1wLT5tX3JibWlwKTsKKwkJLyoKKwkJICogVXBkYXRlIHRoZSBiaXRtYXAgaW5vZGUncyBzaXplLgorCQkgKi8KKwkJbXAtPm1fcmJtaXAtPmlfZC5kaV9zaXplID0KKwkJCW5zYnAtPnNiX3JibWJsb2NrcyAqIG5zYnAtPnNiX2Jsb2Nrc2l6ZTsKKwkJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgbXAtPm1fcmJtaXAsIFhGU19JTE9HX0NPUkUpOworCQljYW5jZWxmbGFncyB8PSBYRlNfVFJBTlNfQUJPUlQ7CisJCS8qCisJCSAqIEdldCB0aGUgc3VtbWFyeSBpbm9kZSBpbnRvIHRoZSB0cmFuc2FjdGlvbi4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfaWdldChtcCwgdHAsIG1wLT5tX3NiLnNiX3JzdW1pbm8sCisJCQkJMCwgWEZTX0lMT0NLX0VYQ0wsICZpcCkpKQorCQkJZ290byBlcnJvcl9leGl0OworCQlBU1NFUlQoaXAgPT0gbXAtPm1fcnN1bWlwKTsKKwkJLyoKKwkJICogVXBkYXRlIHRoZSBzdW1tYXJ5IGlub2RlJ3Mgc2l6ZS4KKwkJICovCisJCW1wLT5tX3JzdW1pcC0+aV9kLmRpX3NpemUgPSBubXAtPm1fcnN1bXNpemU7CisJCXhmc190cmFuc19sb2dfaW5vZGUodHAsIG1wLT5tX3JzdW1pcCwgWEZTX0lMT0dfQ09SRSk7CisJCS8qCisJCSAqIENvcHkgc3VtbWFyeSBkYXRhIGZyb20gb2xkIHRvIG5ldyBzaXplcy4KKwkJICogRG8gdGhpcyB3aGVuIHRoZSByZWFsIHNpemUgKG5vdCBibG9jay1hbGlnbmVkKSBjaGFuZ2VzLgorCQkgKi8KKwkJaWYgKHNicC0+c2JfcmJtYmxvY2tzICE9IG5zYnAtPnNiX3JibWJsb2NrcyB8fAorCQkgICAgbXAtPm1fcnN1bWxldmVscyAhPSBubXAtPm1fcnN1bWxldmVscykgeworCQkJZXJyb3IgPSB4ZnNfcnRjb3B5X3N1bW1hcnkobXAsIG5tcCwgdHApOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gZXJyb3JfZXhpdDsKKwkJfQorCQkvKgorCQkgKiBVcGRhdGUgc3VwZXJibG9jayBmaWVsZHMuCisJCSAqLworCQlpZiAobnNicC0+c2JfcmV4dHNpemUgIT0gc2JwLT5zYl9yZXh0c2l6ZSkKKwkJCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9SRVhUU0laRSwKKwkJCQluc2JwLT5zYl9yZXh0c2l6ZSAtIHNicC0+c2JfcmV4dHNpemUpOworCQlpZiAobnNicC0+c2JfcmJtYmxvY2tzICE9IHNicC0+c2JfcmJtYmxvY2tzKQorCQkJeGZzX3RyYW5zX21vZF9zYih0cCwgWEZTX1RSQU5TX1NCX1JCTUJMT0NLUywKKwkJCQluc2JwLT5zYl9yYm1ibG9ja3MgLSBzYnAtPnNiX3JibWJsb2Nrcyk7CisJCWlmIChuc2JwLT5zYl9yYmxvY2tzICE9IHNicC0+c2JfcmJsb2NrcykKKwkJCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9SQkxPQ0tTLAorCQkJCW5zYnAtPnNiX3JibG9ja3MgLSBzYnAtPnNiX3JibG9ja3MpOworCQlpZiAobnNicC0+c2JfcmV4dGVudHMgIT0gc2JwLT5zYl9yZXh0ZW50cykKKwkJCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9SRVhURU5UUywKKwkJCQluc2JwLT5zYl9yZXh0ZW50cyAtIHNicC0+c2JfcmV4dGVudHMpOworCQlpZiAobnNicC0+c2JfcmV4dHNsb2cgIT0gc2JwLT5zYl9yZXh0c2xvZykKKwkJCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9SRVhUU0xPRywKKwkJCQluc2JwLT5zYl9yZXh0c2xvZyAtIHNicC0+c2JfcmV4dHNsb2cpOworCQkvKgorCQkgKiBGcmVlIG5ldyBleHRlbnQuCisJCSAqLworCQlicCA9IE5VTEw7CisJCWVycm9yID0geGZzX3J0ZnJlZV9yYW5nZShubXAsIHRwLCBzYnAtPnNiX3JleHRlbnRzLAorCQkJbnNicC0+c2JfcmV4dGVudHMgLSBzYnAtPnNiX3JleHRlbnRzLCAmYnAsICZzdW1ibm8pOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yX2V4aXQ7CisJCS8qCisJCSAqIE1hcmsgbW9yZSBibG9ja3MgZnJlZSBpbiB0aGUgc3VwZXJibG9jay4KKwkJICovCisJCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9GUkVYVEVOVFMsCisJCQluc2JwLT5zYl9yZXh0ZW50cyAtIHNicC0+c2JfcmV4dGVudHMpOworCQkvKgorCQkgKiBGcmVlIHRoZSBmYWtlIG1wIHN0cnVjdHVyZS4KKwkJICovCisJCWttZW1fZnJlZShubXAsIHNpemVvZigqbm1wKSk7CisJCW5tcCA9IE5VTEw7CisJCS8qCisJCSAqIFVwZGF0ZSBtcCB2YWx1ZXMgaW50byB0aGUgcmVhbCBtcCBzdHJ1Y3R1cmUuCisJCSAqLworCQltcC0+bV9yc3VtbGV2ZWxzID0gbnJzdW1sZXZlbHM7CisJCW1wLT5tX3JzdW1zaXplID0gbnJzdW1zaXplOworCQkvKgorCQkgKiBDb21taXQgdGhlIHRyYW5zYWN0aW9uLgorCQkgKi8KKwkJeGZzX3RyYW5zX2NvbW1pdCh0cCwgMCwgTlVMTCk7CisJfQorCXJldHVybiAwOworCisJLyoKKwkgKiBFcnJvciBwYXRocyBjb21lIGhlcmUuCisJICovCitlcnJvcl9leGl0OgorCWlmIChubXApCisJCWttZW1fZnJlZShubXAsIHNpemVvZigqbm1wKSk7CisJeGZzX3RyYW5zX2NhbmNlbCh0cCwgY2FuY2VsZmxhZ3MpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEFsbG9jYXRlIGFuIGV4dGVudCBpbiB0aGUgcmVhbHRpbWUgc3Vidm9sdW1lLCB3aXRoIHRoZSB1c3VhbCBhbGxvY2F0aW9uCisgKiBwYXJhbWV0ZXJzLiAgVGhlIGxlbmd0aCB1bml0cyBhcmUgYWxsIGluIHJlYWx0aW1lIGV4dGVudHMsIGFzIGlzIHRoZQorICogcmVzdWx0IGJsb2NrIG51bWJlci4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX3J0YWxsb2NhdGVfZXh0ZW50KAorCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfcnRibG9ja190CWJubywJCS8qIHN0YXJ0aW5nIGJsb2NrIG51bWJlciB0byBhbGxvY2F0ZSAqLworCXhmc19leHRsZW5fdAltaW5sZW4sCQkvKiBtaW5pbXVtIGxlbmd0aCB0byBhbGxvY2F0ZSAqLworCXhmc19leHRsZW5fdAltYXhsZW4sCQkvKiBtYXhpbXVtIGxlbmd0aCB0byBhbGxvY2F0ZSAqLworCXhmc19leHRsZW5fdAkqbGVuLAkJLyogb3V0OiBhY3R1YWwgbGVuZ3RoIGFsbG9jYXRlZCAqLworCXhmc19hbGxvY3R5cGVfdAl0eXBlLAkJLyogYWxsb2NhdGlvbiB0eXBlIFhGU19BTExPQ1RZUEUuLi4gKi8KKwlpbnQJCXdhc2RlbCwJCS8qIHdhcyBhIGRlbGF5ZWQgYWxsb2NhdGlvbiBleHRlbnQgKi8KKwl4ZnNfZXh0bGVuX3QJcHJvZCwJCS8qIGV4dGVudCBwcm9kdWN0IGZhY3RvciAqLworCXhmc19ydGJsb2NrX3QJKnJ0YmxvY2spCS8qIG91dDogc3RhcnQgYmxvY2sgYWxsb2NhdGVkICovCit7CisJaW50CQllcnJvcjsJCS8qIGVycm9yIHZhbHVlICovCisJeGZzX2lub2RlX3QJKmlwOwkJLyogaW5vZGUgZm9yIGJpdG1hcCBmaWxlICovCisJeGZzX21vdW50X3QJKm1wOwkJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCisJeGZzX3J0YmxvY2tfdAlyOwkJLyogcmVzdWx0IGFsbG9jYXRlZCBibG9jayAqLworCXhmc19mc2Jsb2NrX3QJc2I7CQkvKiBzdW1tYXJ5IGZpbGUgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CSpzdW1icDsJCS8qIHN1bW1hcnkgZmlsZSBibG9jayBidWZmZXIgKi8KKworCUFTU0VSVChtaW5sZW4gPiAwICYmIG1pbmxlbiA8PSBtYXhsZW4pOworCW1wID0gdHAtPnRfbW91bnRwOworCS8qCisJICogSWYgcHJvZCBpcyBzZXQgdGhlbiBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gdG8gbWlubGVuIGFuZCBtYXhsZW4uCisJICovCisJaWYgKHByb2QgPiAxKSB7CisJCXhmc19leHRsZW5fdAlpOworCisJCWlmICgoaSA9IG1heGxlbiAlIHByb2QpKQorCQkJbWF4bGVuIC09IGk7CisJCWlmICgoaSA9IG1pbmxlbiAlIHByb2QpKQorCQkJbWlubGVuICs9IHByb2QgLSBpOworCQlpZiAobWF4bGVuIDwgbWlubGVuKSB7CisJCQkqcnRibG9jayA9IE5VTExSVEJMT0NLOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJLyoKKwkgKiBMb2NrIG91dCBvdGhlciBjYWxsZXJzIGJ5IGdyYWJiaW5nIHRoZSBiaXRtYXAgaW5vZGUgbG9jay4KKwkgKi8KKwllcnJvciA9IHhmc190cmFuc19pZ2V0KG1wLCB0cCwgbXAtPm1fc2Iuc2JfcmJtaW5vLCAwLCBYRlNfSUxPQ0tfRVhDTCwgJmlwKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlzdW1icCA9IE5VTEw7CisJLyoKKwkgKiBBbGxvY2F0ZSBieSBzaXplLCBvciBuZWFyIGFub3RoZXIgYmxvY2ssIG9yIGV4YWN0bHkgYXQgc29tZSBibG9jay4KKwkgKi8KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFhGU19BTExPQ1RZUEVfQU5ZX0FHOgorCQllcnJvciA9IHhmc19ydGFsbG9jYXRlX2V4dGVudF9zaXplKG1wLCB0cCwgbWlubGVuLCBtYXhsZW4sIGxlbiwKKwkJCQkmc3VtYnAsCSZzYiwgcHJvZCwgJnIpOworCQlicmVhazsKKwljYXNlIFhGU19BTExPQ1RZUEVfTkVBUl9CTk86CisJCWVycm9yID0geGZzX3J0YWxsb2NhdGVfZXh0ZW50X25lYXIobXAsIHRwLCBibm8sIG1pbmxlbiwgbWF4bGVuLAorCQkJCWxlbiwgJnN1bWJwLCAmc2IsIHByb2QsICZyKTsKKwkJYnJlYWs7CisJY2FzZSBYRlNfQUxMT0NUWVBFX1RISVNfQk5POgorCQllcnJvciA9IHhmc19ydGFsbG9jYXRlX2V4dGVudF9leGFjdChtcCwgdHAsIGJubywgbWlubGVuLCBtYXhsZW4sCisJCQkJbGVuLCAmc3VtYnAsICZzYiwgcHJvZCwgJnIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJfQorCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qCisJICogSWYgaXQgd29ya2VkLCB1cGRhdGUgdGhlIHN1cGVyYmxvY2suCisJICovCisJaWYgKHIgIT0gTlVMTFJUQkxPQ0spIHsKKwkJbG9uZwlzbGVuID0gKGxvbmcpKmxlbjsKKworCQlBU1NFUlQoKmxlbiA+PSBtaW5sZW4gJiYgKmxlbiA8PSBtYXhsZW4pOworCQlpZiAod2FzZGVsKQorCQkJeGZzX3RyYW5zX21vZF9zYih0cCwgWEZTX1RSQU5TX1NCX1JFU19GUkVYVEVOVFMsIC1zbGVuKTsKKwkJZWxzZQorCQkJeGZzX3RyYW5zX21vZF9zYih0cCwgWEZTX1RSQU5TX1NCX0ZSRVhURU5UUywgLXNsZW4pOworCX0KKwkqcnRibG9jayA9IHI7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGcmVlIGFuIGV4dGVudCBpbiB0aGUgcmVhbHRpbWUgc3Vidm9sdW1lLiAgTGVuZ3RoIGlzIGV4cHJlc3NlZCBpbgorICogcmVhbHRpbWUgZXh0ZW50cywgYXMgaXMgdGhlIGJsb2NrIG51bWJlci4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX3J0ZnJlZV9leHRlbnQoCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19ydGJsb2NrX3QJYm5vLAkJLyogc3RhcnRpbmcgYmxvY2sgbnVtYmVyIHRvIGZyZWUgKi8KKwl4ZnNfZXh0bGVuX3QJbGVuKQkJLyogbGVuZ3RoIG9mIGV4dGVudCBmcmVlZCAqLworeworCWludAkJZXJyb3I7CQkvKiBlcnJvciB2YWx1ZSAqLworCXhmc19pbm9kZV90CSppcDsJCS8qIGJpdG1hcCBmaWxlIGlub2RlICovCisJeGZzX21vdW50X3QJKm1wOwkJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCisJeGZzX2ZzYmxvY2tfdAlzYjsJCS8qIHN1bW1hcnkgZmlsZSBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJKnN1bWJwOwkJLyogc3VtbWFyeSBmaWxlIGJsb2NrIGJ1ZmZlciAqLworCisJbXAgPSB0cC0+dF9tb3VudHA7CisJLyoKKwkgKiBTeW5jaHJvbml6ZSBieSBsb2NraW5nIHRoZSBiaXRtYXAgaW5vZGUuCisJICovCisJZXJyb3IgPSB4ZnNfdHJhbnNfaWdldChtcCwgdHAsIG1wLT5tX3NiLnNiX3JibWlubywgMCwgWEZTX0lMT0NLX0VYQ0wsICZpcCk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSAmJiBkZWZpbmVkKERFQlVHKQorCS8qCisJICogQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyB3aG9sZSByYW5nZSBpcyBjdXJyZW50bHkgYWxsb2NhdGVkLgorCSAqLworCXsKKwkJaW50CXN0YXQ7CQkvKiByZXN1bHQgZnJvbSBjaGVja2luZyByYW5nZSAqLworCisJCWVycm9yID0geGZzX3J0Y2hlY2tfYWxsb2NfcmFuZ2UobXAsIHRwLCBibm8sIGxlbiwgJnN0YXQpOworCQlpZiAoZXJyb3IpIHsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlBU1NFUlQoc3RhdCk7CisJfQorI2VuZGlmCisJc3VtYnAgPSBOVUxMOworCS8qCisJICogRnJlZSB0aGUgcmFuZ2Ugb2YgcmVhbHRpbWUgYmxvY2tzLgorCSAqLworCWVycm9yID0geGZzX3J0ZnJlZV9yYW5nZShtcCwgdHAsIGJubywgbGVuLCAmc3VtYnAsICZzYik7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBNYXJrIG1vcmUgYmxvY2tzIGZyZWUgaW4gdGhlIHN1cGVyYmxvY2suCisJICovCisJeGZzX3RyYW5zX21vZF9zYih0cCwgWEZTX1RSQU5TX1NCX0ZSRVhURU5UUywgKGxvbmcpbGVuKTsKKwkvKgorCSAqIElmIHdlJ3ZlIG5vdyBmcmVlZCBhbGwgdGhlIGJsb2NrcywgcmVzZXQgdGhlIGZpbGUgc2VxdWVuY2UKKwkgKiBudW1iZXIgdG8gMC4KKwkgKi8KKwlpZiAodHAtPnRfZnJleHRlbnRzX2RlbHRhICsgbXAtPm1fc2Iuc2JfZnJleHRlbnRzID09CisJICAgIG1wLT5tX3NiLnNiX3JleHRlbnRzKSB7CisJCWlmICghKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX05FV1JUQk0pKQorCQkJaXAtPmlfZC5kaV9mbGFncyB8PSBYRlNfRElGTEFHX05FV1JUQk07CisJCSooX191aW50NjRfdCAqKSZpcC0+aV9kLmRpX2F0aW1lID0gMDsKKwkJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgcmVhbHRpbWUgZmllbGRzIGluIHRoZSBtb3VudCBzdHJ1Y3R1cmUuCisgKi8KK2ludAkJCQkvKiBlcnJvciAqLworeGZzX3J0bW91bnRfaW5pdCgKKwl4ZnNfbW91bnRfdAkqbXApCS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworeworCXhmc19idWZfdAkqYnA7CS8qIGJ1ZmZlciBmb3IgbGFzdCBibG9jayBvZiBzdWJ2b2x1bWUgKi8KKwl4ZnNfZGFkZHJfdAlkOwkvKiBhZGRyZXNzIG9mIGxhc3QgYmxvY2sgb2Ygc3Vidm9sdW1lICovCisJaW50CQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX3NiX3QJKnNicDsJLyogZmlsZXN5c3RlbSBzdXBlcmJsb2NrIGNvcHkgaW4gbW91bnQgKi8KKworCXNicCA9ICZtcC0+bV9zYjsKKwlpZiAoc2JwLT5zYl9yYmxvY2tzID09IDApCisJCXJldHVybiAwOworCWlmIChtcC0+bV9ydGRldl90YXJncCA9PSBOVUxMKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkiWEZTOiBUaGlzIGZpbGVzeXN0ZW0gaGFzIGEgcmVhbHRpbWUgdm9sdW1lLCB1c2UgcnRkZXY9ZGV2aWNlIG9wdGlvbiIpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVOT0RFVik7CisJfQorCW1wLT5tX3JzdW1sZXZlbHMgPSBzYnAtPnNiX3JleHRzbG9nICsgMTsKKwltcC0+bV9yc3Vtc2l6ZSA9CisJCSh1aW50KXNpemVvZih4ZnNfc3VtaW5mb190KSAqIG1wLT5tX3JzdW1sZXZlbHMgKgorCQlzYnAtPnNiX3JibWJsb2NrczsKKwltcC0+bV9yc3Vtc2l6ZSA9IHJvdW5kdXAobXAtPm1fcnN1bXNpemUsIHNicC0+c2JfYmxvY2tzaXplKTsKKwltcC0+bV9yYm1pcCA9IG1wLT5tX3JzdW1pcCA9IE5VTEw7CisJLyoKKwkgKiBDaGVjayB0aGF0IHRoZSByZWFsdGltZSBzZWN0aW9uIGlzIGFuIG9rIHNpemUuCisJICovCisJZCA9ICh4ZnNfZGFkZHJfdClYRlNfRlNCX1RPX0JCKG1wLCBtcC0+bV9zYi5zYl9yYmxvY2tzKTsKKwlpZiAoWEZTX0JCX1RPX0ZTQihtcCwgZCkgIT0gbXAtPm1fc2Iuc2JfcmJsb2NrcykgeworCQljbW5fZXJyKENFX1dBUk4sICJYRlM6IHJlYWx0aW1lIG1vdW50IC0tICVsbHUgIT0gJWxsdSIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKSBYRlNfQkJfVE9fRlNCKG1wLCBkKSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIG1wLT5tX3NiLnNiX3JibG9ja3MpOworCQlyZXR1cm4gWEZTX0VSUk9SKEUyQklHKTsKKwl9CisJZXJyb3IgPSB4ZnNfcmVhZF9idWYobXAsIG1wLT5tX3J0ZGV2X3RhcmdwLAorCQkJCWQgLSBYRlNfRlNCX1RPX0JCKG1wLCAxKSwKKwkJCQlYRlNfRlNCX1RPX0JCKG1wLCAxKSwgMCwgJmJwKTsKKwlpZiAoZXJyb3IpIHsKKwkJY21uX2VycihDRV9XQVJOLAorCSJYRlM6IHJlYWx0aW1lIG1vdW50IC0tIHhmc19yZWFkX2J1ZiBmYWlsZWQsIHJldHVybmVkICVkIiwgZXJyb3IpOworCQlpZiAoZXJyb3IgPT0gRU5PU1BDKQorCQkJcmV0dXJuIFhGU19FUlJPUihFMkJJRyk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJeGZzX2J1Zl9yZWxzZShicCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgdGhlIGJpdG1hcCBhbmQgc3VtbWFyeSBpbm9kZXMgaW50byB0aGUgbW91bnQgc3RydWN0dXJlCisgKiBhdCBtb3VudCB0aW1lLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfcnRtb3VudF9pbm9kZXMoCisJeGZzX21vdW50X3QJKm1wKQkJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCit7CisJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19zYl90CSpzYnA7CisKKwlzYnAgPSAmbXAtPm1fc2I7CisJaWYgKHNicC0+c2JfcmJtaW5vID09IE5VTExGU0lOTykKKwkJcmV0dXJuIDA7CisJZXJyb3IgPSB4ZnNfaWdldChtcCwgTlVMTCwgc2JwLT5zYl9yYm1pbm8sIDAsIDAsICZtcC0+bV9yYm1pcCwgMCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJQVNTRVJUKG1wLT5tX3JibWlwICE9IE5VTEwpOworCUFTU0VSVChzYnAtPnNiX3JzdW1pbm8gIT0gTlVMTEZTSU5PKTsKKwllcnJvciA9IHhmc19pZ2V0KG1wLCBOVUxMLCBzYnAtPnNiX3JzdW1pbm8sIDAsIDAsICZtcC0+bV9yc3VtaXAsIDApOworCWlmIChlcnJvcikgeworCQlWTl9SRUxFKFhGU19JVE9WKG1wLT5tX3JibWlwKSk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJQVNTRVJUKG1wLT5tX3JzdW1pcCAhPSBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBpY2sgYW4gZXh0ZW50IGZvciBhbGxvY2F0aW9uIGF0IHRoZSBzdGFydCBvZiBhIG5ldyByZWFsdGltZSBmaWxlLgorICogVXNlIHRoZSBzZXF1ZW5jZSBudW1iZXIgc3RvcmVkIGluIHRoZSBhdGltZSBmaWVsZCBvZiB0aGUgYml0bWFwIGlub2RlLgorICogVHJhbnNsYXRlIHRoaXMgdG8gYSBmcmFjdGlvbiBvZiB0aGUgcnRleHRlbnRzLCBhbmQgcmV0dXJuIHRoZSBwcm9kdWN0CisgKiBvZiBydGV4dGVudHMgYW5kIHRoZSBmcmFjdGlvbi4KKyAqIFRoZSBmcmFjdGlvbiBzZXF1ZW5jZSBpcyAwLCAxLzIsIDEvNCwgMy80LCAxLzgsIC4uLiwgNy84LCAxLzE2LCAuLi4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX3J0cGlja19leHRlbnQoCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2V4dGxlbl90CWxlbiwJCS8qIGFsbG9jYXRpb24gbGVuZ3RoIChydGV4dGVudHMpICovCisJeGZzX3J0YmxvY2tfdAkqcGljaykJCS8qIHJlc3VsdCBydCBleHRlbnQgKi8KK3sKKwl4ZnNfcnRibG9ja190CWI7CQkvKiByZXN1bHQgYmxvY2sgKi8KKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX2lub2RlX3QJKmlwOwkJLyogYml0bWFwIGluY29yZSBpbm9kZSAqLworCWludAkJbG9nMjsJCS8qIGxvZyBvZiBzZXF1ZW5jZSBudW1iZXIgKi8KKwlfX3VpbnQ2NF90CXJlc2lkOwkJLyogcmVzaWR1YWwgYWZ0ZXIgbG9nIHJlbW92ZWQgKi8KKwlfX3VpbnQ2NF90CXNlcTsJCS8qIHNlcXVlbmNlIG51bWJlciBvZiBmaWxlIGNyZWF0aW9uICovCisJX191aW50NjRfdAkqc2VxcDsJCS8qIHBvaW50ZXIgdG8gc2Vxbm8gaW4gaW5vZGUgKi8KKworCWVycm9yID0geGZzX3RyYW5zX2lnZXQobXAsIHRwLCBtcC0+bV9zYi5zYl9yYm1pbm8sIDAsIFhGU19JTE9DS19FWENMLCAmaXApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCUFTU0VSVChpcCA9PSBtcC0+bV9yYm1pcCk7CisJc2VxcCA9IChfX3VpbnQ2NF90ICopJmlwLT5pX2QuZGlfYXRpbWU7CisJaWYgKCEoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfTkVXUlRCTSkpIHsKKwkJaXAtPmlfZC5kaV9mbGFncyB8PSBYRlNfRElGTEFHX05FV1JUQk07CisJCSpzZXFwID0gMDsKKwl9CisJc2VxID0gKnNlcXA7CisJaWYgKChsb2cyID0geGZzX2hpZ2hiaXQ2NChzZXEpKSA9PSAtMSkKKwkJYiA9IDA7CisJZWxzZSB7CisJCXJlc2lkID0gc2VxIC0gKDFVTEwgPDwgbG9nMik7CisJCWIgPSAobXAtPm1fc2Iuc2JfcmV4dGVudHMgKiAoKHJlc2lkIDw8IDEpICsgMVVMTCkpID4+CisJCSAgICAobG9nMiArIDEpOworCQlpZiAoYiA+PSBtcC0+bV9zYi5zYl9yZXh0ZW50cykKKwkJCWIgPSBkb19tb2QoYiwgbXAtPm1fc2Iuc2JfcmV4dGVudHMpOworCQlpZiAoYiArIGxlbiA+IG1wLT5tX3NiLnNiX3JleHRlbnRzKQorCQkJYiA9IG1wLT5tX3NiLnNiX3JleHRlbnRzIC0gbGVuOworCX0KKwkqc2VxcCA9IHNlcSArIDE7CisJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOworCSpwaWNrID0gYjsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIERFQlVHCisvKgorICogRGVidWcgY29kZTogcHJpbnQgb3V0IHRoZSB2YWx1ZSBvZiBhIHJhbmdlIGluIHRoZSBiaXRtYXAuCisgKi8KK3ZvaWQKK3hmc19ydHByaW50X3JhbmdlKAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfcnRibG9ja190CXN0YXJ0LAkJLyogc3RhcnRpbmcgYmxvY2sgdG8gcHJpbnQgKi8KKwl4ZnNfZXh0bGVuX3QJbGVuKQkJLyogbGVuZ3RoIHRvIHByaW50ICovCit7CisJeGZzX2V4dGxlbl90CWk7CQkvKiBibG9jayBudW1iZXIgaW4gdGhlIGV4dGVudCAqLworCisJcHJpbnRrKCIlTGQ6ICIsIChsb25nIGxvbmcpc3RhcnQpOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJcHJpbnRrKCIlZCIsIHhmc19ydGNoZWNrX2JpdChtcCwgdHAsIHN0YXJ0ICsgaSwgMSkpOworCXByaW50aygiXG4iKTsKK30KKworLyoKKyAqIERlYnVnIGNvZGU6IHByaW50IHRoZSBzdW1tYXJ5IGZpbGUuCisgKi8KK3ZvaWQKK3hmc19ydHByaW50X3N1bW1hcnkoCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCisJeGZzX3RyYW5zX3QJKnRwKQkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworeworCXhmc19zdW1pbmZvX3QJYzsJCS8qIHN1bW1hcnkgZGF0YSAqLworCXhmc19ydGJsb2NrX3QJaTsJCS8qIGJpdG1hcCBibG9jayBudW1iZXIgKi8KKwlpbnQJCWw7CQkvKiBzdW1tYXJ5IGluZm9ybWF0aW9uIGxldmVsICovCisJaW50CQlwOwkJLyogZmxhZyBmb3IgcHJpbnRlZCBhbnl0aGluZyAqLworCXhmc19mc2Jsb2NrX3QJc2I7CQkvKiBzdW1tYXJ5IGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkqc3VtYnA7CQkvKiBzdW1tYXJ5IGJsb2NrIGJ1ZmZlciAqLworCisJc3VtYnAgPSBOVUxMOworCWZvciAobCA9IDA7IGwgPCBtcC0+bV9yc3VtbGV2ZWxzOyBsKyspIHsKKwkJZm9yIChwID0gMCwgaSA9IDA7IGkgPCBtcC0+bV9zYi5zYl9yYm1ibG9ja3M7IGkrKykgeworCQkJKHZvaWQpeGZzX3J0Z2V0X3N1bW1hcnkobXAsIHRwLCBsLCBpLCAmc3VtYnAsICZzYiwgJmMpOworCQkJaWYgKGMpIHsKKwkJCQlpZiAoIXApIHsKKwkJCQkJcHJpbnRrKCIlTGQtJUxkOiIsIDFMTCA8PCBsLAorCQkJCQkJWEZTX1JUTUlOKCgxTEwgPDwgbCkgKworCQkJCQkJCSAgKCgxTEwgPDwgbCkgLSAxTEwpLAorCQkJCQkJCSBtcC0+bV9zYi5zYl9yZXh0ZW50cykpOworCQkJCQlwID0gMTsKKwkJCQl9CisJCQkJcHJpbnRrKCIgJUxkOiVkIiwgKGxvbmcgbG9uZylpLCBjKTsKKwkJCX0KKwkJfQorCQlpZiAocCkKKwkJCXByaW50aygiXG4iKTsKKwl9CisJaWYgKHN1bWJwKQorCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBzdW1icCk7Cit9CisjZW5kaWYJLyogREVCVUcgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcnRhbGxvYy5oIGIvZnMveGZzL3hmc19ydGFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI3MTAyNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfcnRhbGxvYy5oCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19SVEFMTE9DX0hfXworI2RlZmluZQlfX1hGU19SVEFMTE9DX0hfXworCitzdHJ1Y3QgeGZzX21vdW50Oworc3RydWN0IHhmc190cmFuczsKKworI2RlZmluZSBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApICgoaXApLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKQorCisvKiBNaW4gYW5kIG1heCBydCBleHRlbnQgc2l6ZXMsIHNwZWNpZmllZCBpbiBieXRlcyAqLworI2RlZmluZQlYRlNfTUFYX1JURVhUU0laRQkoMTAyNCAqIDEwMjQgKiAxMDI0KQkvKiAxR0IgKi8KKyNkZWZpbmUJWEZTX0RGTF9SVEVYVFNJWkUJKDY0ICogMTAyNCkJICAgICAgICAvKiA2NEtCICovCisjZGVmaW5lCVhGU19NSU5fUlRFWFRTSVpFCSg0ICogMTAyNCkJCS8qIDRLQiAqLworCisvKgorICogQ29uc3RhbnRzIGZvciBiaXQgbWFuaXB1bGF0aW9ucy4KKyAqLworI2RlZmluZQlYRlNfTkJCWUxPRwkzCQkvKiBsb2cyKE5CQlkpICovCisjZGVmaW5lCVhGU19XT1JETE9HCTIJCS8qIGxvZzIoc2l6ZW9mKHhmc19ydHdvcmRfdCkpICovCisjZGVmaW5lCVhGU19OQldPUkRMT0cJKFhGU19OQkJZTE9HICsgWEZTX1dPUkRMT0cpCisjZGVmaW5lCVhGU19OQldPUkQJKDEgPDwgWEZTX05CV09SRExPRykKKyNkZWZpbmUJWEZTX1dPUkRNQVNLCSgoMSA8PCBYRlNfV09SRExPRykgLSAxKQorCisjZGVmaW5lCVhGU19CTE9DS1NJWkUobXApCSgobXApLT5tX3NiLnNiX2Jsb2Nrc2l6ZSkKKyNkZWZpbmUJWEZTX0JMT0NLTUFTSyhtcCkJKChtcCktPm1fYmxvY2ttYXNrKQorI2RlZmluZQlYRlNfQkxPQ0tXU0laRShtcCkJKChtcCktPm1fYmxvY2t3c2l6ZSkKKyNkZWZpbmUJWEZTX0JMT0NLV01BU0sobXApCSgobXApLT5tX2Jsb2Nrd21hc2spCisKKy8qCisgKiBTdW1tYXJ5IGFuZCBiaXQgbWFuaXB1bGF0aW9uIG1hY3Jvcy4KKyAqLworI2RlZmluZQlYRlNfU1VNT0ZGUyhtcCxscyxiYikJKChpbnQpKChscykgKiAobXApLT5tX3NiLnNiX3JibWJsb2NrcyArIChiYikpKQorI2RlZmluZQlYRlNfU1VNT0ZGU1RPQkxPQ0sobXAscykJXAorCSgoKHMpICogKHVpbnQpc2l6ZW9mKHhmc19zdW1pbmZvX3QpKSA+PiAobXApLT5tX3NiLnNiX2Jsb2NrbG9nKQorI2RlZmluZQlYRlNfU1VNUFRSKG1wLGJwLHNvKQlcCisJKCh4ZnNfc3VtaW5mb190ICopKChjaGFyICopWEZTX0JVRl9QVFIoYnApICsgXAorCQkoKChzbykgKiAodWludClzaXplb2YoeGZzX3N1bWluZm9fdCkpICYgWEZTX0JMT0NLTUFTSyhtcCkpKSkKKworI2RlZmluZQlYRlNfQklUVE9CTE9DSyhtcCxiaSkJKChiaSkgPj4gKG1wKS0+bV9ibGtiaXRfbG9nKQorI2RlZmluZQlYRlNfQkxPQ0tUT0JJVChtcCxiYikJKChiYikgPDwgKG1wKS0+bV9ibGtiaXRfbG9nKQorI2RlZmluZQlYRlNfQklUVE9XT1JEKG1wLGJpKQlcCisJKChpbnQpKCgoYmkpID4+IFhGU19OQldPUkRMT0cpICYgWEZTX0JMT0NLV01BU0sobXApKSkKKworI2RlZmluZQlYRlNfUlRNSU4oYSxiKQkoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorI2RlZmluZQlYRlNfUlRNQVgoYSxiKQkoKGEpID4gKGIpID8gKGEpIDogKGIpKQorCisjZGVmaW5lCVhGU19SVExPQklUKHcpCXhmc19sb3diaXQzMih3KQorI2RlZmluZQlYRlNfUlRISUJJVCh3KQl4ZnNfaGlnaGJpdDMyKHcpCisKKyNpZiBYRlNfQklHX0JMS05PUworI2RlZmluZQlYRlNfUlRCTE9DS0xPRyhiKQl4ZnNfaGlnaGJpdDY0KGIpCisjZWxzZQorI2RlZmluZQlYRlNfUlRCTE9DS0xPRyhiKQl4ZnNfaGlnaGJpdDMyKGIpCisjZW5kaWYKKworCisjaWZkZWYgX19LRVJORUxfXworCisjaWZkZWYgQ09ORklHX1hGU19SVAorLyoKKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIGV4cG9ydGVkIGZ1bmN0aW9ucy4KKyAqLworCisvKgorICogQWxsb2NhdGUgYW4gZXh0ZW50IGluIHRoZSByZWFsdGltZSBzdWJ2b2x1bWUsIHdpdGggdGhlIHVzdWFsIGFsbG9jYXRpb24KKyAqIHBhcmFtZXRlcnMuICBUaGUgbGVuZ3RoIHVuaXRzIGFyZSBhbGwgaW4gcmVhbHRpbWUgZXh0ZW50cywgYXMgaXMgdGhlCisgKiByZXN1bHQgYmxvY2sgbnVtYmVyLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfcnRhbGxvY2F0ZV9leHRlbnQoCisJc3RydWN0IHhmc190cmFucwkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfcnRibG9ja190CQlibm8sCS8qIHN0YXJ0aW5nIGJsb2NrIG51bWJlciB0byBhbGxvY2F0ZSAqLworCXhmc19leHRsZW5fdAkJbWlubGVuLAkvKiBtaW5pbXVtIGxlbmd0aCB0byBhbGxvY2F0ZSAqLworCXhmc19leHRsZW5fdAkJbWF4bGVuLAkvKiBtYXhpbXVtIGxlbmd0aCB0byBhbGxvY2F0ZSAqLworCXhmc19leHRsZW5fdAkJKmxlbiwJLyogb3V0OiBhY3R1YWwgbGVuZ3RoIGFsbG9jYXRlZCAqLworCXhmc19hbGxvY3R5cGVfdAkJdHlwZSwJLyogYWxsb2NhdGlvbiB0eXBlIFhGU19BTExPQ1RZUEUuLi4gKi8KKwlpbnQJCQl3YXNkZWwsCS8qIHdhcyBhIGRlbGF5ZWQgYWxsb2NhdGlvbiBleHRlbnQgKi8KKwl4ZnNfZXh0bGVuX3QJCXByb2QsCS8qIGV4dGVudCBwcm9kdWN0IGZhY3RvciAqLworCXhmc19ydGJsb2NrX3QJCSpydGJsb2NrKTsgLyogb3V0OiBzdGFydCBibG9jayBhbGxvY2F0ZWQgKi8KKworLyoKKyAqIEZyZWUgYW4gZXh0ZW50IGluIHRoZSByZWFsdGltZSBzdWJ2b2x1bWUuICBMZW5ndGggaXMgZXhwcmVzc2VkIGluCisgKiByZWFsdGltZSBleHRlbnRzLCBhcyBpcyB0aGUgYmxvY2sgbnVtYmVyLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfcnRmcmVlX2V4dGVudCgKKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19ydGJsb2NrX3QJCWJubywJLyogc3RhcnRpbmcgYmxvY2sgbnVtYmVyIHRvIGZyZWUgKi8KKwl4ZnNfZXh0bGVuX3QJCWxlbik7CS8qIGxlbmd0aCBvZiBleHRlbnQgZnJlZWQgKi8KKworLyoKKyAqIEluaXRpYWxpemUgcmVhbHRpbWUgZmllbGRzIGluIHRoZSBtb3VudCBzdHJ1Y3R1cmUuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ydG1vdW50X2luaXQoCisJc3RydWN0IHhmc19tb3VudAkqbXApOwkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKworLyoKKyAqIEdldCB0aGUgYml0bWFwIGFuZCBzdW1tYXJ5IGlub2RlcyBpbnRvIHRoZSBtb3VudCBzdHJ1Y3R1cmUKKyAqIGF0IG1vdW50IHRpbWUuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ydG1vdW50X2lub2RlcygKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCk7CS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCisvKgorICogUGljayBhbiBleHRlbnQgZm9yIGFsbG9jYXRpb24gYXQgdGhlIHN0YXJ0IG9mIGEgbmV3IHJlYWx0aW1lIGZpbGUuCisgKiBVc2UgdGhlIHNlcXVlbmNlIG51bWJlciBzdG9yZWQgaW4gdGhlIGF0aW1lIGZpZWxkIG9mIHRoZSBiaXRtYXAgaW5vZGUuCisgKiBUcmFuc2xhdGUgdGhpcyB0byBhIGZyYWN0aW9uIG9mIHRoZSBydGV4dGVudHMsIGFuZCByZXR1cm4gdGhlIHByb2R1Y3QKKyAqIG9mIHJ0ZXh0ZW50cyBhbmQgdGhlIGZyYWN0aW9uLgorICogVGhlIGZyYWN0aW9uIHNlcXVlbmNlIGlzIDAsIDEvMiwgMS80LCAzLzQsIDEvOCwgLi4uLCA3LzgsIDEvMTYsIC4uLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfcnRwaWNrX2V4dGVudCgKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19leHRsZW5fdAkJbGVuLAkvKiBhbGxvY2F0aW9uIGxlbmd0aCAocnRleHRlbnRzKSAqLworCXhmc19ydGJsb2NrX3QJCSpwaWNrKTsJLyogcmVzdWx0IHJ0IGV4dGVudCAqLworCisvKgorICogRGVidWcgY29kZTogcHJpbnQgb3V0IHRoZSB2YWx1ZSBvZiBhIHJhbmdlIGluIHRoZSBiaXRtYXAuCisgKi8KK3ZvaWQKK3hmc19ydHByaW50X3JhbmdlKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19ydGJsb2NrX3QJCXN0YXJ0LAkvKiBzdGFydGluZyBibG9jayB0byBwcmludCAqLworCXhmc19leHRsZW5fdAkJbGVuKTsJLyogbGVuZ3RoIHRvIHByaW50ICovCisKKy8qCisgKiBEZWJ1ZyBjb2RlOiBwcmludCB0aGUgc3VtbWFyeSBmaWxlLgorICovCit2b2lkCit4ZnNfcnRwcmludF9zdW1tYXJ5KAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCk7CS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworLyoKKyAqIEdyb3cgdGhlIHJlYWx0aW1lIGFyZWEgb2YgdGhlIGZpbGVzeXN0ZW0uCisgKi8KK2ludAoreGZzX2dyb3dmc19ydCgKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCisJeGZzX2dyb3dmc19ydF90CQkqaW4pOwkvKiB1c2VyIHN1cHBsaWVkIGdyb3dmcyBzdHJ1Y3QgKi8KKworI2Vsc2UKKyMgZGVmaW5lIHhmc19ydGFsbG9jYXRlX2V4dGVudCh0LGIsbWluLG1heCxsLGEsZixwLHJiKSAgKEVOT1NZUykKKyMgZGVmaW5lIHhmc19ydGZyZWVfZXh0ZW50KHQsYixsKSAgICAgICAgICAgICAgICAgICAgICAgKEVOT1NZUykKKyMgZGVmaW5lIHhmc19ydHBpY2tfZXh0ZW50KG0sdCxsLHJiKSAgICAgICAgICAgICAgICAgICAgKEVOT1NZUykKKyMgZGVmaW5lIHhmc19ncm93ZnNfcnQobXAsaW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgKEVOT1NZUykKKyMgZGVmaW5lIHhmc19ydG1vdW50X2luaXQobSkgICAgKCgobXApLT5tX3NiLnNiX3JibG9ja3MgPT0gMCk/IDAgOiAoRU5PU1lTKSkKKyMgZGVmaW5lIHhmc19ydG1vdW50X2lub2RlcyhtKSAgKCgobXApLT5tX3NiLnNiX3JibG9ja3MgPT0gMCk/IDAgOiAoRU5PU1lTKSkKKyNlbmRpZgkvKiBDT05GSUdfWEZTX1JUICovCisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgkvKiBfX1hGU19SVEFMTE9DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ydy5jIGIvZnMveGZzL3hmc19ydy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZmY3YWUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX3J3LmMKQEAgLTAsMCArMSwzNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0ci5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfYWNsLmgiCisjaW5jbHVkZSAieGZzX21hYy5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorCisvKgorICogVGhpcyBpcyBhIHN1YnJvdXRpbmUgZm9yIHhmc193cml0ZSgpIGFuZCBvdGhlciB3cml0ZXJzICh4ZnNfaW9jdGwpCisgKiB3aGljaCBjbGVhcnMgdGhlIHNldHVpZCBhbmQgc2V0Z2lkIGJpdHMgd2hlbiBhIGZpbGUgaXMgd3JpdHRlbi4KKyAqLworaW50Cit4ZnNfd3JpdGVfY2xlYXJfc2V0dWlkKAorCXhmc19pbm9kZV90CSppcCkKK3sKKwl4ZnNfbW91bnRfdAkqbXA7CisJeGZzX3RyYW5zX3QJKnRwOworCWludAkJZXJyb3I7CisKKwltcCA9IGlwLT5pX21vdW50OworCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfV1JJVEVJRCk7CisJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLAorCQkJCSAgICAgIFhGU19XUklURUlEX0xPR19SRVMobXApLAorCQkJCSAgICAgIDAsIDAsIDApKSkgeworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CisJaXAtPmlfZC5kaV9tb2RlICY9IH5TX0lTVUlEOworCisJLyoKKwkgKiBOb3RlIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBtYW5kYXRvcnkKKwkgKiBmaWxlIGxvY2tpbmcgYmVpbmcgZGlzYWJsZWQgaGVyZSBiZWNhdXNlIHdlIG9ubHkKKwkgKiBjbGVhciB0aGUgU19JU0dJRCBiaXQgaWYgdGhlIEdyb3VwIGV4ZWN1dGUgYml0IGlzCisJICogb24sIGJ1dCBpZiBpdCB3YXMgb24gdGhlbiBtYW5kYXRvcnkgbG9ja2luZyB3b3VsZG4ndAorCSAqIGhhdmUgYmVlbiBlbmFibGVkLgorCSAqLworCWlmIChpcC0+aV9kLmRpX21vZGUgJiBTX0lYR1JQKSB7CisJCWlwLT5pX2QuZGlfbW9kZSAmPSB+U19JU0dJRDsKKwl9CisJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOworCXhmc190cmFuc19zZXRfc3luYyh0cCk7CisJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwLCBOVUxMKTsKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXJldHVybiAwOworfQorCisvKgorICogRm9yY2UgYSBzaHV0ZG93biBvZiB0aGUgZmlsZXN5c3RlbSBpbnN0YW50bHkgd2hpbGUga2VlcGluZworICogdGhlIGZpbGVzeXN0ZW0gY29uc2lzdGVudC4gV2UgZG9uJ3QgZG8gYW4gdW5tb3VudCBoZXJlOyBqdXN0IHNodXRkb3duCisgKiB0aGUgc2hvcCwgbWFrZSBzdXJlIHRoYXQgYWJzb2x1dGVseSBub3RoaW5nIHBlcnNpc3RlbnQgaGFwcGVucyB0bworICogdGhpcyBmaWxlc3lzdGVtIGFmdGVyIHRoaXMgcG9pbnQuCisgKi8KKwordm9pZAoreGZzX2RvX2ZvcmNlX3NodXRkb3duKAorCWJodl9kZXNjX3QJKmJkcCwKKwlpbnQJCWZsYWdzLAorCWNoYXIJCSpmbmFtZSwKKwlpbnQJCWxubnVtKQoreworCWludAkJbG9nZXJyb3I7CisJeGZzX21vdW50X3QJKm1wOworCisJbXAgPSBYRlNfQkhWVE9NKGJkcCk7CisJbG9nZXJyb3IgPSBmbGFncyAmIFhGU19MT0dfSU9fRVJST1I7CisKKwlpZiAoIShmbGFncyAmIFhGU19GT1JDRV9VTU9VTlQpKSB7CisJCWNtbl9lcnIoQ0VfTk9URSwKKwkJInhmc19mb3JjZV9zaHV0ZG93biglcywweCV4KSBjYWxsZWQgZnJvbSBsaW5lICVkIG9mIGZpbGUgJXMuICBSZXR1cm4gYWRkcmVzcyA9IDB4JXAiLAorCQkJbXAtPm1fZnNuYW1lLGZsYWdzLGxubnVtLGZuYW1lLF9fcmV0dXJuX2FkZHJlc3MpOworCX0KKwkvKgorCSAqIE5vIG5lZWQgdG8gZHVwbGljYXRlIGVmZm9ydHMuCisJICovCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApICYmICFsb2dlcnJvcikKKwkJcmV0dXJuOworCisJLyoKKwkgKiBUaGlzIGZsYWdzIFhGU19NT1VOVF9GU19TSFVURE9XTiwgbWFrZXMgc3VyZSB0aGF0IHdlIGRvbid0CisJICogcXVldWUgdXAgYW55Ym9keSBuZXcgb24gdGhlIGxvZyByZXNlcnZhdGlvbnMsIGFuZCB3YWtlcyB1cAorCSAqIGV2ZXJ5Ym9keSB3aG8ncyBzbGVlcGluZyBvbiBsb2cgcmVzZXJ2YXRpb25zIGFuZCB0ZWxscworCSAqIHRoZW0gdGhlIGJhZCBuZXdzLgorCSAqLworCWlmICh4ZnNfbG9nX2ZvcmNlX3Vtb3VudChtcCwgbG9nZXJyb3IpKQorCQlyZXR1cm47CisKKwlpZiAoZmxhZ3MgJiBYRlNfQ09SUlVQVF9JTkNPUkUpIHsKKwkJeGZzX2Ntbl9lcnIoWEZTX1BUQUdfU0hVVERPV05fQ09SUlVQVCwgQ0VfQUxFUlQsIG1wLAorICAgICJDb3JydXB0aW9uIG9mIGluLW1lbW9yeSBkYXRhIGRldGVjdGVkLiAgU2h1dHRpbmcgZG93biBmaWxlc3lzdGVtOiAlcyIsCisJCQltcC0+bV9mc25hbWUpOworCQlpZiAoWEZTX0VSUkxFVkVMX0hJR0ggPD0geGZzX2Vycm9yX2xldmVsKSB7CisJCQl4ZnNfc3RhY2tfdHJhY2UoKTsKKwkJfQorCX0gZWxzZSBpZiAoIShmbGFncyAmIFhGU19GT1JDRV9VTU9VTlQpKSB7CisJCWlmIChsb2dlcnJvcikgeworCQkJeGZzX2Ntbl9lcnIoWEZTX1BUQUdfU0hVVERPV05fTE9HRVJST1IsIENFX0FMRVJULCBtcCwKKwkJCSJMb2cgSS9PIEVycm9yIERldGVjdGVkLiAgU2h1dHRpbmcgZG93biBmaWxlc3lzdGVtOiAlcyIsCisJCQkJbXAtPm1fZnNuYW1lKTsKKwkJfSBlbHNlIGlmICghKGZsYWdzICYgWEZTX1NIVVRET1dOX1JFTU9URV9SRVEpKSB7CisJCQl4ZnNfY21uX2VycihYRlNfUFRBR19TSFVURE9XTl9JT0VSUk9SLCBDRV9BTEVSVCwgbXAsCisJCQkJIkkvTyBFcnJvciBEZXRlY3RlZC4gIFNodXR0aW5nIGRvd24gZmlsZXN5c3RlbTogJXMiLAorCQkJCW1wLT5tX2ZzbmFtZSk7CisJCX0KKwl9CisJaWYgKCEoZmxhZ3MgJiBYRlNfRk9SQ0VfVU1PVU5UKSkgeworCQljbW5fZXJyKENFX0FMRVJULAorCQkiUGxlYXNlIHVtb3VudCB0aGUgZmlsZXN5c3RlbSwgYW5kIHJlY3RpZnkgdGhlIHByb2JsZW0ocykiKTsKKwl9Cit9CisKKworLyoKKyAqIENhbGxlZCB3aGVuIHdlIHdhbnQgdG8gc3RvcCBhIGJ1ZmZlciBmcm9tIGdldHRpbmcgd3JpdHRlbiBvciByZWFkLgorICogV2UgYXR0YWNoIHRoZSBFSU8gZXJyb3IsIG11Y2sgd2l0aCBpdHMgZmxhZ3MsIGFuZCBjYWxsIGJpb2RvbmUKKyAqIHNvIHRoYXQgdGhlIHByb3BlciBpb2RvbmUgY2FsbGJhY2tzIGdldCBjYWxsZWQuCisgKi8KK2ludAoreGZzX2Jpb2Vycm9yKAorCXhmc19idWZfdCAqYnApCit7CisKKyNpZmRlZiBYRlNFUlJPUkRFQlVHCisJQVNTRVJUKFhGU19CVUZfSVNSRUFEKGJwKSB8fCBicC0+Yl9pb2RvbmUpOworI2VuZGlmCisKKwkvKgorCSAqIE5vIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgYnVmZmVyIGlzIHVucGlubmVkLgorCSAqIFdlIGFyZW4ndCBmbHVzaGluZyBpdC4KKwkgKi8KKwl4ZnNfYnVmdHJhY2UoIlhGUyBJT0VSUk9SIiwgYnApOworCVhGU19CVUZfRVJST1IoYnAsIEVJTyk7CisJLyoKKwkgKiBXZSdyZSBjYWxsaW5nIGJpb2RvbmUsIHNvIGRlbGV0ZSBCX0RPTkUgZmxhZy4gRWl0aGVyIHdheQorCSAqIHdlIGhhdmUgdG8gY2FsbCB0aGUgaW9kb25lIGNhbGxiYWNrLCBhbmQgY2FsbGluZyBiaW9kb25lCisJICogcHJvYmFibHkgaXMgdGhlIGJlc3Qgd2F5IHNpbmNlIGl0IHRha2VzIGNhcmUgb2YKKwkgKiBHUklPIGFzIHdlbGwuCisJICovCisJWEZTX0JVRl9VTlJFQUQoYnApOworCVhGU19CVUZfVU5ERUxBWVdSSVRFKGJwKTsKKwlYRlNfQlVGX1VORE9ORShicCk7CisJWEZTX0JVRl9TVEFMRShicCk7CisKKwlYRlNfQlVGX0NMUl9CRFNUUkFUX0ZVTkMoYnApOworCXhmc19iaW9kb25lKGJwKTsKKworCXJldHVybiAoRUlPKTsKK30KKworLyoKKyAqIFNhbWUgYXMgeGZzX2Jpb2Vycm9yLCBleGNlcHQgdGhhdCB3ZSBhcmUgcmVsZWFzaW5nIHRoZSBidWZmZXIKKyAqIGhlcmUgb3Vyc2VsdmVzLCBhbmQgYXZvaWRpbmcgdGhlIGJpb2RvbmUgY2FsbC4KKyAqIFRoaXMgaXMgbWVhbnQgZm9yIHVzZXJkYXRhIGVycm9yczsgbWV0YWRhdGEgYnVmcyBjb21lIHdpdGgKKyAqIGlvZG9uZSBmdW5jdGlvbnMgYXR0YWNoZWQsIHNvIHRoYXQgd2UgY2FuIHRyYWNrIGRvd24gZXJyb3JzLgorICovCitpbnQKK3hmc19iaW9lcnJvcl9yZWxzZSgKKwl4ZnNfYnVmX3QgKmJwKQoreworCWludDY0X3QgZmw7CisKKwlBU1NFUlQoWEZTX0JVRl9JT0RPTkVfRlVOQyhicCkgIT0geGZzX2J1Zl9pb2RvbmVfY2FsbGJhY2tzKTsKKwlBU1NFUlQoWEZTX0JVRl9JT0RPTkVfRlVOQyhicCkgIT0geGxvZ19pb2RvbmUpOworCisJeGZzX2J1ZnRyYWNlKCJYRlMgSU9FUlJFTFNFIiwgYnApOworCWZsID0gWEZTX0JVRl9CRkxBR1MoYnApOworCS8qCisJICogTm8gbmVlZCB0byB3YWl0IHVudGlsIHRoZSBidWZmZXIgaXMgdW5waW5uZWQuCisJICogV2UgYXJlbid0IGZsdXNoaW5nIGl0LgorCSAqCisJICogY2h1bmtob2xkIGV4cGVjdHMgQl9ET05FIHRvIGJlIHNldCwgd2hldGhlcgorCSAqIHdlIGFjdHVhbGx5IGZpbmlzaCB0aGUgSS9PIG9yIG5vdC4gV2UgZG9uJ3Qgd2FudCB0bworCSAqIGNoYW5nZSB0aGF0IGludGVyZmFjZS4KKwkgKi8KKwlYRlNfQlVGX1VOUkVBRChicCk7CisJWEZTX0JVRl9VTkRFTEFZV1JJVEUoYnApOworCVhGU19CVUZfRE9ORShicCk7CisJWEZTX0JVRl9TVEFMRShicCk7CisJWEZTX0JVRl9DTFJfSU9ET05FX0ZVTkMoYnApOworCVhGU19CVUZfQ0xSX0JEU1RSQVRfRlVOQyhicCk7CisJaWYgKCEoZmwgJiBYRlNfQl9BU1lOQykpIHsKKwkJLyoKKwkJICogTWFyayBiX2Vycm9yIGFuZCBCX0VSUk9SIF9ib3RoXy4KKwkJICogTG90J3Mgb2YgY2h1bmtjYWNoZSBjb2RlIGFzc3VtZXMgdGhhdC4KKwkJICogVGhlcmUncyBubyByZWFzb24gdG8gbWFyayBlcnJvciBmb3IKKwkJICogQVNZTkMgYnVmZmVycy4KKwkJICovCisJCVhGU19CVUZfRVJST1IoYnAsIEVJTyk7CisJCVhGU19CVUZfVl9JT0RPTkVTRU1BKGJwKTsKKwl9IGVsc2UgeworCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwl9CisJcmV0dXJuIChFSU8pOworfQorLyoKKyAqIFByaW50cyBvdXQgYW4gQUxFUlQgbWVzc2FnZSBhYm91dCBJL08gZXJyb3IuCisgKi8KK3ZvaWQKK3hmc19pb2Vycm9yX2FsZXJ0KAorCWNoYXIJCQkqZnVuYywKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwKKwl4ZnNfYnVmX3QJCSpicCwKKwl4ZnNfZGFkZHJfdAkJYmxrbm8pCit7CisJY21uX2VycihDRV9BTEVSVCwKKyAiSS9PIGVycm9yIGluIGZpbGVzeXN0ZW0gKFwiJXNcIikgbWV0YS1kYXRhIGRldiAlcyBibG9jayAweCVsbHgiCisgIiAgICAgICAoXCIlc1wiKSBlcnJvciAlZCBidWYgY291bnQgJXUiLAorCQkoIW1wIHx8ICFtcC0+bV9mc25hbWUpID8gIihmcyBuYW1lIG5vdCBzZXQpIiA6IG1wLT5tX2ZzbmFtZSwKKwkJWEZTX0JVRlRBUkdfTkFNRShicC0+cGJfdGFyZ2V0KSwKKwkJKF9fdWludDY0X3QpYmxrbm8sCisJCWZ1bmMsCisJCVhGU19CVUZfR0VURVJST1IoYnApLAorCQlYRlNfQlVGX0NPVU5UKGJwKSk7Cit9CisKKy8qCisgKiBUaGlzIGlzbid0IGFuIGFic29sdXRlIHJlcXVpcmVtZW50LCBidXQgaXQgaXMKKyAqIGp1c3QgYSBnb29kIGlkZWEgdG8gY2FsbCB4ZnNfcmVhZF9idWYgaW5zdGVhZCBvZgorICogZGlyZWN0bHkgZG9pbmcgYSByZWFkX2J1ZiBjYWxsLiBGb3Igb25lLCB3ZSBzaG91bGRuJ3QKKyAqIGJlIGRvaW5nIHRoaXMgZGlzayByZWFkIGlmIHdlIGFyZSBpbiBTSFVURE9XTiBzdGF0ZSBhbnl3YXksCisgKiBzbyB0aGlzIHN0b3BzIHRoYXQgZnJvbSBoYXBwZW5pbmcuIFNlY29uZGx5LCB0aGlzIGRvZXMgYWxsCisgKiB0aGUgZXJyb3IgY2hlY2tpbmcgc3R1ZmYgYW5kIHRoZSBicmVsc2UgaWYgYXBwcm9wcmlhdGUgZm9yCisgKiB0aGUgY2FsbGVyLCBzbyB0aGUgY29kZSBjYW4gYmUgYSBsaXR0bGUgbGVhbmVyLgorICovCisKK2ludAoreGZzX3JlYWRfYnVmKAorCXN0cnVjdCB4ZnNfbW91bnQgKm1wLAorCXhmc19idWZ0YXJnX3QJICp0YXJnZXQsCisJeGZzX2RhZGRyX3QJIGJsa25vLAorCWludCAgICAgICAgICAgICAgbGVuLAorCXVpbnQgICAgICAgICAgICAgZmxhZ3MsCisJeGZzX2J1Zl90CSAqKmJwcCkKK3sKKwl4ZnNfYnVmX3QJICpicDsKKwlpbnQJCSBlcnJvcjsKKworCWlmIChmbGFncykKKwkJYnAgPSB4ZnNfYnVmX3JlYWRfZmxhZ3ModGFyZ2V0LCBibGtubywgbGVuLCBmbGFncyk7CisJZWxzZQorCQlicCA9IHhmc19idWZfcmVhZCh0YXJnZXQsIGJsa25vLCBsZW4sIGZsYWdzKTsKKwlpZiAoIWJwKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJZXJyb3IgPSBYRlNfQlVGX0dFVEVSUk9SKGJwKTsKKwlpZiAoYnAgJiYgIWVycm9yICYmICFYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgeworCQkqYnBwID0gYnA7CisJfSBlbHNlIHsKKwkJKmJwcCA9IE5VTEw7CisJCWlmIChlcnJvcikgeworCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhmc19yZWFkX2J1ZiIsIG1wLCBicCwgWEZTX0JVRl9BRERSKGJwKSk7CisJCX0gZWxzZSB7CisJCQllcnJvciA9IFhGU19FUlJPUihFSU8pOworCQl9CisJCWlmIChicCkgeworCQkJWEZTX0JVRl9VTkRPTkUoYnApOworCQkJWEZTX0JVRl9VTkRFTEFZV1JJVEUoYnApOworCQkJWEZTX0JVRl9TVEFMRShicCk7CisJCQkvKgorCQkJICogYnJlbHNlIGNsZWFycyBCX0VSUk9SIGFuZCBiX2Vycm9yCisJCQkgKi8KKwkJCXhmc19idWZfcmVsc2UoYnApOworCQl9CisJfQorCXJldHVybiAoZXJyb3IpOworfQorCisvKgorICogV3JhcHBlciBhcm91bmQgYndyaXRlKCkgc28gdGhhdCB3ZSBjYW4gdHJhcAorICogd3JpdGUgZXJyb3JzLCBhbmQgYWN0IGFjY29yZGluZ2x5LgorICovCitpbnQKK3hmc19id3JpdGUoCisJc3RydWN0IHhmc19tb3VudCAqbXAsCisJc3RydWN0IHhmc19idWYJICpicCkKK3sKKwlpbnQJZXJyb3I7CisKKwkvKgorCSAqIFhYWHN1cCBob3cgZG9lcyB0aGlzIHdvcmsgZm9yIHF1b3Rhcy4KKwkgKi8KKwlYRlNfQlVGX1NFVF9CRFNUUkFUX0ZVTkMoYnAsIHhmc19iZHN0cmF0X2NiKTsKKwlYRlNfQlVGX1NFVF9GU1BSSVZBVEUzKGJwLCBtcCk7CisJWEZTX0JVRl9XUklURShicCk7CisKKwlpZiAoKGVycm9yID0gWEZTX2J3cml0ZShicCkpKSB7CisJCUFTU0VSVChtcCk7CisJCS8qCisJCSAqIENhbm5vdCBwdXQgYSBidWZ0cmFjZSBoZXJlIHNpbmNlIGlmIHRoZSBidWZmZXIgaXMgbm90CisJCSAqIEJfSE9MRCB0aGVuIHdlIHdpbGwgYnJlbHNlKCkgdGhlIGJ1ZmZlciBiZWZvcmUgcmV0dXJuaW5nCisJCSAqIGZyb20gYndyaXRlIGFuZCB3ZSBjb3VsZCBiZSB0cmFjaW5nIGEgYnVmZmVyIHRoYXQgaGFzCisJCSAqIGJlZW4gcmV1c2VkLgorCQkgKi8KKwkJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBYRlNfTUVUQURBVEFfSU9fRVJST1IpOworCX0KKwlyZXR1cm4gKGVycm9yKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcncuaCBiL2ZzL3hmcy94ZnNfcncuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGIxMGJmCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19ydy5oCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZglfX1hGU19SV19IX18KKyNkZWZpbmUJX19YRlNfUldfSF9fCisKK3N0cnVjdCB4ZnNfYnVmOworc3RydWN0IHhmc19pbm9kZTsKK3N0cnVjdCB4ZnNfbW91bnQ7CisKKy8qCisgKiBNYXhpbXVtIGNvdW50IG9mIGJtYXBzIHVzZWQgYnkgcmVhZCBhbmQgd3JpdGUgcGF0aHMuCisgKi8KKyNkZWZpbmUJWEZTX01BWF9SV19OQk1BUFMJNAorCisvKgorICogQ291bnRzIG9mIHJlYWRhaGVhZCBidWZmZXJzIHRvIHVzZSBiYXNlZCBvbiBwaHlzaWNhbCBtZW1vcnkgc2l6ZS4KKyAqIE5vbmUgb2YgdGhlc2Ugc2hvdWxkIGJlIG1vcmUgdGhhbiBYRlNfTUFYX1JXX05CTUFQUy4KKyAqLworI2RlZmluZQlYRlNfUldfTlJFQURBSEVBRF8xNk1CCTIKKyNkZWZpbmUJWEZTX1JXX05SRUFEQUhFQURfMzJNQgkzCisjZGVmaW5lCVhGU19SV19OUkVBREFIRUFEX0szMgk0CisjZGVmaW5lCVhGU19SV19OUkVBREFIRUFEX0s2NAk0CisKKy8qCisgKiBNYXhpbXVtIHNpemUgb2YgYSBidWZmZXIgdGhhdCB3ZVwnbGwgbWFwLiAgTWFraW5nIHRoaXMKKyAqIHRvbyBiaWcgd2lsbCBkZWdyYWRlIHBlcmZvcm1hbmNlIGR1ZSB0byB0aGUgbnVtYmVyIG9mCisgKiBwYWdlcyB3aGljaCBuZWVkIHRvIGJlIGdhdGhlcmVkLiAgTWFraW5nIGl0IHRvbyBzbWFsbAorICogd2lsbCBwcmV2ZW50IHVzIGZyb20gZG9pbmcgbGFyZ2UgSS9PXCdzIHRvIGhhcmR3YXJlIHRoYXQKKyAqIG5lZWRzIGl0LgorICoKKyAqIFRoaXMgaXMgY3VycmVudGx5IHNldCB0byA1MTIgS0IuCisgKi8KKyNkZWZpbmUJWEZTX01BWF9CTUFQX0xFTl9CQgkxMDI0CisjZGVmaW5lCVhGU19NQVhfQk1BUF9MRU5fQllURVMJNTI0Mjg4CisKKy8qCisgKiBDb252ZXJ0IHRoZSBnaXZlbiBmaWxlIHN5c3RlbSBibG9jayB0byBhIGRpc2sgYmxvY2suCisgKiBXZSBoYXZlIHRvIHRyZWF0IGl0IGRpZmZlcmVudGx5IGJhc2VkIG9uIHdoZXRoZXIgdGhlCisgKiBmaWxlIGlzIGEgcmVhbCB0aW1lIGZpbGUgb3Igbm90LCBiZWNhdXNlIHRoZSBibWFwIGNvZGUKKyAqIGRvZXMuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0ZTQl9UT19EQikKK3hmc19kYWRkcl90IHhmc19mc2JfdG9fZGIoc3RydWN0IHhmc19pbm9kZSAqaXAsIHhmc19mc2Jsb2NrX3QgZnNiKTsKKyNkZWZpbmUJWEZTX0ZTQl9UT19EQihpcCxmc2IpCXhmc19mc2JfdG9fZGIoaXAsZnNiKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0ZTQl9UT19EQihpcCxmc2IpIFwKKwkJKCgoaXApLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSA/IFwKKwkJICh4ZnNfZGFkZHJfdClYRlNfRlNCX1RPX0JCKChpcCktPmlfbW91bnQsIChmc2IpKSA6IFwKKwkJIFhGU19GU0JfVE9fREFERFIoKGlwKS0+aV9tb3VudCwgKGZzYikpKQorI2VuZGlmCisKKyNkZWZpbmUgWEZTX0ZTQl9UT19EQl9JTyhpbyxmc2IpIFwKKwkJKCgoaW8pLT5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpID8gXAorCQkgWEZTX0ZTQl9UT19CQigoaW8pLT5pb19tb3VudCwgKGZzYikpIDogXAorCQkgWEZTX0ZTQl9UT19EQUREUigoaW8pLT5pb19tb3VudCwgKGZzYikpKQorCisvKgorICogUHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIGluIHhmc19ydy5jLgorICovCisKK2ludAoreGZzX3dyaXRlX2NsZWFyX3NldHVpZCgKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCk7CisKK2ludAoreGZzX2J3cml0ZSgKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwKTsKKworaW50Cit4ZnNfYmlvZXJyb3IoCisJc3RydWN0IHhmc19idWYJCSpiKTsKKworaW50Cit4ZnNfYmlvZXJyb3JfcmVsc2UoCisJc3RydWN0IHhmc19idWYJCSpiKTsKKworaW50Cit4ZnNfcmVhZF9idWYoCisJc3RydWN0IHhmc19tb3VudAkqbXAsCisJeGZzX2J1ZnRhcmdfdAkJKnRhcmdldCwKKwl4ZnNfZGFkZHJfdAkJYmxrbm8sCisJaW50CQkJbGVuLAorCXVpbnQJCQlmbGFncywKKwlzdHJ1Y3QgeGZzX2J1ZgkJKipicHApOworCit2b2lkCit4ZnNfaW9lcnJvcl9hbGVydCgKKwljaGFyCQkJKmZ1bmMsCisJc3RydWN0IHhmc19tb3VudAkqbXAsCisJeGZzX2J1Zl90CQkqYnAsCisJeGZzX2RhZGRyX3QJCWJsa25vKTsKKworCisvKgorICogUHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIGluIHhmc192bm9kZW9wcy5jLgorICovCisKK2ludAoreGZzX3J3bG9jaygKKwliaHZfZGVzY190CQkqYmRwLAorCXZyd2xvY2tfdAkJd3JpdGVfbG9jayk7CisKK3ZvaWQKK3hmc19yd3VubG9jaygKKwliaHZfZGVzY190CQkqYmRwLAorCXZyd2xvY2tfdAkJd3JpdGVfbG9jayk7CisKK2ludAoreGZzX2NoYW5nZV9maWxlX3NwYWNlKAorCWJodl9kZXNjX3QJCSpiZHAsCisJaW50CQkJY21kLAorCXhmc19mbG9jazY0X3QJCSpiZiwKKwl4ZnNfb2ZmX3QJCW9mZnNldCwKKwljcmVkX3QJCQkqY3JlZHAsCisJaW50CQkJZmxhZ3MpOworCitpbnQKK3hmc19zZXRfZG1hdHRycygKKwliaHZfZGVzY190CQkqYmRwLAorCXVfaW50CQkJZXZtYXNrLAorCXVfaW50MTZfdAkJc3RhdGUsCisJY3JlZF90CQkJKmNyZWRwKTsKKworI2VuZGlmIC8qIF9fWEZTX1JXX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19zYi5oIGIvZnMveGZzL3hmc19zYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMDkwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX3NiLmgKQEAgLTAsMCArMSw1ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX1NCX0hfXworI2RlZmluZQlfX1hGU19TQl9IX18KKworLyoKKyAqIFN1cGVyIGJsb2NrCisgKiBGaXRzIGludG8gYSBzZWN0b3Itc2l6ZWQgYnVmZmVyIGF0IGFkZHJlc3MgMCBvZiBlYWNoIGFsbG9jYXRpb24gZ3JvdXAuCisgKiBPbmx5IHRoZSBmaXJzdCBvZiB0aGVzZSBpcyBldmVyIHVwZGF0ZWQgZXhjZXB0IGR1cmluZyBncm93ZnMuCisgKi8KKworc3RydWN0IHhmc19idWY7CitzdHJ1Y3QgeGZzX21vdW50OworCisjZGVmaW5lCVhGU19TQl9NQUdJQwkJMHg1ODQ2NTM0MgkvKiAnWEZTQicgKi8KKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fMQkxCQkvKiA1LjMsIDYuMC4xLCA2LjEgKi8KKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fMgkyCQkvKiA2LjIgLSBhdHRyaWJ1dGVzICovCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OXzMJMwkJLyogNi4yIC0gbmV3IGlub2RlIHZlcnNpb24gKi8KKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fNAk0CQkvKiA2LjIrIC0gYml0bWFzayB2ZXJzaW9uICovCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX05VTUJJVFMJCTB4MDAwZgorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9BTExGQklUUwkJMHhmZmYwCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX1NBU0hGQklUUwkweGYwMDAKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fUkVBTEZCSVRTCTB4MGZmMAorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9BVFRSQklUCQkweDAwMTAKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fTkxJTktCSVQJCTB4MDAyMAorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9RVU9UQUJJVAkJMHgwMDQwCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0FMSUdOQklUCQkweDAwODAKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fREFMSUdOQklUCTB4MDEwMAorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9TSEFSRURCSVQJMHgwMjAwCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0xPR1YyQklUCQkweDA0MDAKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fU0VDVE9SQklUCTB4MDgwMAorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9FWFRGTEdCSVQJMHgxMDAwCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0RJUlYyQklUCQkweDIwMDAKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fTU9SRUJJVFNCSVQJMHg4MDAwCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX09LU0FTSEZCSVRTCVwKKwkoWEZTX1NCX1ZFUlNJT05fRVhURkxHQklUIHwgXAorCSBYRlNfU0JfVkVSU0lPTl9ESVJWMkJJVCkKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fT0tSRUFMRkJJVFMJXAorCShYRlNfU0JfVkVSU0lPTl9BVFRSQklUIHwgXAorCSBYRlNfU0JfVkVSU0lPTl9OTElOS0JJVCB8IFwKKwkgWEZTX1NCX1ZFUlNJT05fUVVPVEFCSVQgfCBcCisJIFhGU19TQl9WRVJTSU9OX0FMSUdOQklUIHwgXAorCSBYRlNfU0JfVkVSU0lPTl9EQUxJR05CSVQgfCBcCisJIFhGU19TQl9WRVJTSU9OX1NIQVJFREJJVCB8IFwKKwkgWEZTX1NCX1ZFUlNJT05fTE9HVjJCSVQgfCBcCisJIFhGU19TQl9WRVJTSU9OX1NFQ1RPUkJJVCkKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fT0tTQVNIQklUUwlcCisJKFhGU19TQl9WRVJTSU9OX05VTUJJVFMgfCBcCisJIFhGU19TQl9WRVJTSU9OX1JFQUxGQklUUyB8IFwKKwkgWEZTX1NCX1ZFUlNJT05fT0tTQVNIRkJJVFMpCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX09LUkVBTEJJVFMJXAorCShYRlNfU0JfVkVSU0lPTl9OVU1CSVRTIHwgXAorCSBYRlNfU0JfVkVSU0lPTl9PS1JFQUxGQklUUyB8IFwKKwkgWEZTX1NCX1ZFUlNJT05fT0tTQVNIRkJJVFMpCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX01LRlMoaWEsZGlhLGV4dGZsYWcsZGlydjIsbmEsc2ZsYWcsbW9yZWJpdHMpCVwKKwkoKChpYSkgfHwgKGRpYSkgfHwgKGV4dGZsYWcpIHx8IChkaXJ2MikgfHwgKG5hKSB8fCAoc2ZsYWcpIHx8IFwKKwkgIChtb3JlYml0cykpID8gXAorCQkoWEZTX1NCX1ZFUlNJT05fNCB8IFwKKwkJICgoaWEpID8gWEZTX1NCX1ZFUlNJT05fQUxJR05CSVQgOiAwKSB8IFwKKwkJICgoZGlhKSA/IFhGU19TQl9WRVJTSU9OX0RBTElHTkJJVCA6IDApIHwgXAorCQkgKChleHRmbGFnKSA/IFhGU19TQl9WRVJTSU9OX0VYVEZMR0JJVCA6IDApIHwgXAorCQkgKChkaXJ2MikgPyBYRlNfU0JfVkVSU0lPTl9ESVJWMkJJVCA6IDApIHwgXAorCQkgKChuYSkgPyBYRlNfU0JfVkVSU0lPTl9MT0dWMkJJVCA6IDApIHwgXAorCQkgKChzZmxhZykgPyBYRlNfU0JfVkVSU0lPTl9TRUNUT1JCSVQgOiAwKSB8IFwKKwkJICgobW9yZWJpdHMpID8gWEZTX1NCX1ZFUlNJT05fTU9SRUJJVFNCSVQgOiAwKSkgOiBcCisJCVhGU19TQl9WRVJTSU9OXzEpCisKKy8qCisgKiBUaGVyZSBhcmUgdHdvIHdvcmRzIHRvIGhvbGQgWEZTICJmZWF0dXJlIiBiaXRzOiB0aGUgb3JpZ2luYWwKKyAqIHdvcmQsIHNiX3ZlcnNpb25udW0sIGFuZCBzYl9mZWF0dXJlczIuICBXaGVuZXZlciBhIGJpdCBpcyBzZXQgaW4KKyAqIHNiX2ZlYXR1cmVzMiwgdGhlIGZlYXR1cmUgYml0IFhGU19TQl9WRVJTSU9OX01PUkVCSVRTQklUIG11c3QgYmUgc2V0LgorICoKKyAqIFRoZXNlIGRlZmluZXMgcmVwcmVzZW50IGJpdHMgaW4gc2JfZmVhdHVyZXMyLgorICovCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OMl9SRUFMRkJJVFMJMHgwMGZmZmZmZgkvKiBNYXNrOiBmZWF0dXJlcyAqLworI2RlZmluZSBYRlNfU0JfVkVSU0lPTjJfUkVTRVJWRUQxQklUCTB4MDAwMDAwMDEKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT04yX1NBU0hGQklUUwkweGZmMDAwMDAwCS8qIE1hc2s6IGZlYXR1cmVzIHRoYXQKKwkJCQkJCQkgICByZXF1aXJlIGNoYW5naW5nCisJCQkJCQkJICAgUFJPTSBhbmQgU0FTSCAqLworCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OMl9PS1JFQUxGQklUUwlcCisJKDApCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OMl9PS1NBU0hGQklUUwlcCisJKDApCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OMl9PS1JFQUxCSVRTCVwKKwkoWEZTX1NCX1ZFUlNJT04yX09LUkVBTEZCSVRTIHwJXAorCSBYRlNfU0JfVkVSU0lPTjJfT0tTQVNIRkJJVFMgKQorCisvKgorICogbWtmcyBtYWNybyB0byBzZXQgdXAgc2JfZmVhdHVyZXMyIHdvcmQKKyAqLworI2RlZmluZQlYRlNfU0JfVkVSU0lPTjJfTUtGUyh4eXopCVwKKwkoKHh5eikgPyAwIDogMCkKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX3NiCit7CisJX191aW50MzJfdAlzYl9tYWdpY251bTsJLyogbWFnaWMgbnVtYmVyID09IFhGU19TQl9NQUdJQyAqLworCV9fdWludDMyX3QJc2JfYmxvY2tzaXplOwkvKiBsb2dpY2FsIGJsb2NrIHNpemUsIGJ5dGVzICovCisJeGZzX2RyZnNibm9fdAlzYl9kYmxvY2tzOwkvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgKi8KKwl4ZnNfZHJmc2Jub190CXNiX3JibG9ja3M7CS8qIG51bWJlciBvZiByZWFsdGltZSBibG9ja3MgKi8KKwl4ZnNfZHJ0Ym5vX3QJc2JfcmV4dGVudHM7CS8qIG51bWJlciBvZiByZWFsdGltZSBleHRlbnRzICovCisJdXVpZF90CQlzYl91dWlkOwkvKiBmaWxlIHN5c3RlbSB1bmlxdWUgaWQgKi8KKwl4ZnNfZGZzYm5vX3QJc2JfbG9nc3RhcnQ7CS8qIHN0YXJ0aW5nIGJsb2NrIG9mIGxvZyBpZiBpbnRlcm5hbCAqLworCXhmc19pbm9fdAlzYl9yb290aW5vOwkvKiByb290IGlub2RlIG51bWJlciAqLworCXhmc19pbm9fdAlzYl9yYm1pbm87CS8qIGJpdG1hcCBpbm9kZSBmb3IgcmVhbHRpbWUgZXh0ZW50cyAqLworCXhmc19pbm9fdAlzYl9yc3VtaW5vOwkvKiBzdW1tYXJ5IGlub2RlIGZvciBydCBiaXRtYXAgKi8KKwl4ZnNfYWdibG9ja190CXNiX3JleHRzaXplOwkvKiByZWFsdGltZSBleHRlbnQgc2l6ZSwgYmxvY2tzICovCisJeGZzX2FnYmxvY2tfdAlzYl9hZ2Jsb2NrczsJLyogc2l6ZSBvZiBhbiBhbGxvY2F0aW9uIGdyb3VwICovCisJeGZzX2FnbnVtYmVyX3QJc2JfYWdjb3VudDsJLyogbnVtYmVyIG9mIGFsbG9jYXRpb24gZ3JvdXBzICovCisJeGZzX2V4dGxlbl90CXNiX3JibWJsb2NrczsJLyogbnVtYmVyIG9mIHJ0IGJpdG1hcCBibG9ja3MgKi8KKwl4ZnNfZXh0bGVuX3QJc2JfbG9nYmxvY2tzOwkvKiBudW1iZXIgb2YgbG9nIGJsb2NrcyAqLworCV9fdWludDE2X3QJc2JfdmVyc2lvbm51bTsJLyogaGVhZGVyIHZlcnNpb24gPT0gWEZTX1NCX1ZFUlNJT04gKi8KKwlfX3VpbnQxNl90CXNiX3NlY3RzaXplOwkvKiB2b2x1bWUgc2VjdG9yIHNpemUsIGJ5dGVzICovCisJX191aW50MTZfdAlzYl9pbm9kZXNpemU7CS8qIGlub2RlIHNpemUsIGJ5dGVzICovCisJX191aW50MTZfdAlzYl9pbm9wYmxvY2s7CS8qIGlub2RlcyBwZXIgYmxvY2sgKi8KKwljaGFyCQlzYl9mbmFtZVsxMl07CS8qIGZpbGUgc3lzdGVtIG5hbWUgKi8KKwlfX3VpbnQ4X3QJc2JfYmxvY2tsb2c7CS8qIGxvZzIgb2Ygc2JfYmxvY2tzaXplICovCisJX191aW50OF90CXNiX3NlY3Rsb2c7CS8qIGxvZzIgb2Ygc2Jfc2VjdHNpemUgKi8KKwlfX3VpbnQ4X3QJc2JfaW5vZGVsb2c7CS8qIGxvZzIgb2Ygc2JfaW5vZGVzaXplICovCisJX191aW50OF90CXNiX2lub3BibG9nOwkvKiBsb2cyIG9mIHNiX2lub3BibG9jayAqLworCV9fdWludDhfdAlzYl9hZ2Jsa2xvZzsJLyogbG9nMiBvZiBzYl9hZ2Jsb2NrcyAocm91bmRlZCB1cCkgKi8KKwlfX3VpbnQ4X3QJc2JfcmV4dHNsb2c7CS8qIGxvZzIgb2Ygc2JfcmV4dGVudHMgKi8KKwlfX3VpbnQ4X3QJc2JfaW5wcm9ncmVzczsJLyogbWtmcyBpcyBpbiBwcm9ncmVzcywgZG9uJ3QgbW91bnQgKi8KKwlfX3VpbnQ4X3QJc2JfaW1heF9wY3Q7CS8qIG1heCAlIG9mIGZzIGZvciBpbm9kZSBzcGFjZSAqLworCQkJCQkvKiBzdGF0aXN0aWNzICovCisJLyoKKwkgKiBUaGVzZSBmaWVsZHMgbXVzdCByZW1haW4gY29udGlndW91cy4gIElmIHlvdSByZWFsbHkKKwkgKiB3YW50IHRvIGNoYW5nZSB0aGVpciBsYXlvdXQsIG1ha2Ugc3VyZSB5b3UgZml4IHRoZQorCSAqIGNvZGUgaW4geGZzX3RyYW5zX2FwcGx5X3NiX2RlbHRhcygpLgorCSAqLworCV9fdWludDY0X3QJc2JfaWNvdW50OwkvKiBhbGxvY2F0ZWQgaW5vZGVzICovCisJX191aW50NjRfdAlzYl9pZnJlZTsJLyogZnJlZSBpbm9kZXMgKi8KKwlfX3VpbnQ2NF90CXNiX2ZkYmxvY2tzOwkvKiBmcmVlIGRhdGEgYmxvY2tzICovCisJX191aW50NjRfdAlzYl9mcmV4dGVudHM7CS8qIGZyZWUgcmVhbHRpbWUgZXh0ZW50cyAqLworCS8qCisJICogRW5kIGNvbnRpZ3VvdXMgZmllbGRzLgorCSAqLworCXhmc19pbm9fdAlzYl91cXVvdGlubzsJLyogdXNlciBxdW90YSBpbm9kZSAqLworCXhmc19pbm9fdAlzYl9ncXVvdGlubzsJLyogZ3JvdXAgcXVvdGEgaW5vZGUgKi8KKwlfX3VpbnQxNl90CXNiX3FmbGFnczsJLyogcXVvdGEgZmxhZ3MgKi8KKwlfX3VpbnQ4X3QJc2JfZmxhZ3M7CS8qIG1pc2MuIGZsYWdzICovCisJX191aW50OF90CXNiX3NoYXJlZF92bjsJLyogc2hhcmVkIHZlcnNpb24gbnVtYmVyICovCisJeGZzX2V4dGxlbl90CXNiX2lub2FsaWdubXQ7CS8qIGlub2RlIGNodW5rIGFsaWdubWVudCwgZnNibG9ja3MgKi8KKwlfX3VpbnQzMl90CXNiX3VuaXQ7CS8qIHN0cmlwZSBvciByYWlkIHVuaXQgKi8KKwlfX3VpbnQzMl90CXNiX3dpZHRoOwkvKiBzdHJpcGUgb3IgcmFpZCB3aWR0aCAqLworCV9fdWludDhfdAlzYl9kaXJibGtsb2c7CS8qIGxvZzIgb2YgZGlyIGJsb2NrIHNpemUgKGZzYnMpICovCisJX191aW50OF90CXNiX2xvZ3NlY3Rsb2c7CS8qIGxvZzIgb2YgdGhlIGxvZyBzZWN0b3Igc2l6ZSAqLworCV9fdWludDE2X3QJc2JfbG9nc2VjdHNpemU7CS8qIHNlY3RvciBzaXplIGZvciB0aGUgbG9nLCBieXRlcyAqLworCV9fdWludDMyX3QJc2JfbG9nc3VuaXQ7CS8qIHN0cmlwZSB1bml0IHNpemUgZm9yIHRoZSBsb2cgKi8KKwlfX3VpbnQzMl90CXNiX2ZlYXR1cmVzMjsJLyogYWRkaXRvbmFsIGZlYXR1cmUgYml0cyAqLworfSB4ZnNfc2JfdDsKKworLyoKKyAqIFNlcXVlbmNlIG51bWJlciB2YWx1ZXMgZm9yIHRoZSBmaWVsZHMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJWEZTX1NCU19NQUdJQ05VTSwgWEZTX1NCU19CTE9DS1NJWkUsIFhGU19TQlNfREJMT0NLUywgWEZTX1NCU19SQkxPQ0tTLAorCVhGU19TQlNfUkVYVEVOVFMsIFhGU19TQlNfVVVJRCwgWEZTX1NCU19MT0dTVEFSVCwgWEZTX1NCU19ST09USU5PLAorCVhGU19TQlNfUkJNSU5PLCBYRlNfU0JTX1JTVU1JTk8sIFhGU19TQlNfUkVYVFNJWkUsIFhGU19TQlNfQUdCTE9DS1MsCisJWEZTX1NCU19BR0NPVU5ULCBYRlNfU0JTX1JCTUJMT0NLUywgWEZTX1NCU19MT0dCTE9DS1MsCisJWEZTX1NCU19WRVJTSU9OTlVNLCBYRlNfU0JTX1NFQ1RTSVpFLCBYRlNfU0JTX0lOT0RFU0laRSwKKwlYRlNfU0JTX0lOT1BCTE9DSywgWEZTX1NCU19GTkFNRSwgWEZTX1NCU19CTE9DS0xPRywKKwlYRlNfU0JTX1NFQ1RMT0csIFhGU19TQlNfSU5PREVMT0csIFhGU19TQlNfSU5PUEJMT0csIFhGU19TQlNfQUdCTEtMT0csCisJWEZTX1NCU19SRVhUU0xPRywgWEZTX1NCU19JTlBST0dSRVNTLCBYRlNfU0JTX0lNQVhfUENULCBYRlNfU0JTX0lDT1VOVCwKKwlYRlNfU0JTX0lGUkVFLCBYRlNfU0JTX0ZEQkxPQ0tTLCBYRlNfU0JTX0ZSRVhURU5UUywgWEZTX1NCU19VUVVPVElOTywKKwlYRlNfU0JTX0dRVU9USU5PLCBYRlNfU0JTX1FGTEFHUywgWEZTX1NCU19GTEFHUywgWEZTX1NCU19TSEFSRURfVk4sCisJWEZTX1NCU19JTk9BTElHTk1ULCBYRlNfU0JTX1VOSVQsIFhGU19TQlNfV0lEVEgsIFhGU19TQlNfRElSQkxLTE9HLAorCVhGU19TQlNfTE9HU0VDVExPRywgWEZTX1NCU19MT0dTRUNUU0laRSwgWEZTX1NCU19MT0dTVU5JVCwKKwlYRlNfU0JTX0ZFQVRVUkVTMiwKKwlYRlNfU0JTX0ZJRUxEQ09VTlQKK30geGZzX3NiX2ZpZWxkX3Q7CisKKy8qCisgKiBNYXNrIHZhbHVlcywgZGVmaW5lZCBiYXNlZCBvbiB0aGUgeGZzX3NiX2ZpZWxkX3QgdmFsdWVzLgorICogT25seSBkZWZpbmUgdGhlIG9uZXMgd2UncmUgdXNpbmcuCisgKi8KKyNkZWZpbmUJWEZTX1NCX01WQUwoeCkJCSgxTEwgPDwgWEZTX1NCU18gIyMgeCkKKyNkZWZpbmUJWEZTX1NCX1VVSUQJCVhGU19TQl9NVkFMKFVVSUQpCisjZGVmaW5lCVhGU19TQl9GTkFNRQkJWEZTX1NCX01WQUwoRk5BTUUpCisjZGVmaW5lCVhGU19TQl9ST09USU5PCQlYRlNfU0JfTVZBTChST09USU5PKQorI2RlZmluZQlYRlNfU0JfUkJNSU5PCQlYRlNfU0JfTVZBTChSQk1JTk8pCisjZGVmaW5lCVhGU19TQl9SU1VNSU5PCQlYRlNfU0JfTVZBTChSU1VNSU5PKQorI2RlZmluZQlYRlNfU0JfVkVSU0lPTk5VTQlYRlNfU0JfTVZBTChWRVJTSU9OTlVNKQorI2RlZmluZSBYRlNfU0JfVVFVT1RJTk8JCVhGU19TQl9NVkFMKFVRVU9USU5PKQorI2RlZmluZSBYRlNfU0JfR1FVT1RJTk8JCVhGU19TQl9NVkFMKEdRVU9USU5PKQorI2RlZmluZSBYRlNfU0JfUUZMQUdTCQlYRlNfU0JfTVZBTChRRkxBR1MpCisjZGVmaW5lIFhGU19TQl9TSEFSRURfVk4JWEZTX1NCX01WQUwoU0hBUkVEX1ZOKQorI2RlZmluZSBYRlNfU0JfVU5JVAkJWEZTX1NCX01WQUwoVU5JVCkKKyNkZWZpbmUgWEZTX1NCX1dJRFRICQlYRlNfU0JfTVZBTChXSURUSCkKKyNkZWZpbmUJWEZTX1NCX05VTV9CSVRTCQkoKGludClYRlNfU0JTX0ZJRUxEQ09VTlQpCisjZGVmaW5lCVhGU19TQl9BTExfQklUUwkJKCgxTEwgPDwgWEZTX1NCX05VTV9CSVRTKSAtIDEpCisjZGVmaW5lCVhGU19TQl9NT0RfQklUUwkJXAorCShYRlNfU0JfVVVJRCB8IFhGU19TQl9ST09USU5PIHwgWEZTX1NCX1JCTUlOTyB8IFhGU19TQl9SU1VNSU5PIHwgXAorCSBYRlNfU0JfVkVSU0lPTk5VTSB8IFhGU19TQl9VUVVPVElOTyB8IFhGU19TQl9HUVVPVElOTyB8IFwKKwkgWEZTX1NCX1FGTEFHUyB8IFhGU19TQl9TSEFSRURfVk4gfCBYRlNfU0JfVU5JVCB8IFhGU19TQl9XSURUSCkKKworLyoKKyAqIE1pc2MuIEZsYWdzIC0gd2FybmluZyAtIHRoZXNlIHdpbGwgYmUgY2xlYXJlZCBieSB4ZnNfcmVwYWlyIHVubGVzcworICogYSBmZWF0dXJlIGJpdCBpcyBzZXQgd2hlbiB0aGUgZmxhZyBpcyB1c2VkLgorICovCisjZGVmaW5lIFhGU19TQkZfTk9GTEFHUwkJMHgwMAkvKiBubyBmbGFncyBzZXQgKi8KKyNkZWZpbmUgWEZTX1NCRl9SRUFET05MWQkweDAxCS8qIG9ubHkgcmVhZC1vbmx5IG1vdW50cyBhbGxvd2VkICovCisKKy8qCisgKiBkZWZpbmUgbWF4LiBzaGFyZWQgdmVyc2lvbiB3ZSBjYW4gaW50ZXJvcGVyYXRlIHdpdGgKKyAqLworI2RlZmluZSBYRlNfU0JfTUFYX1NIQVJFRF9WTgkwCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fTlVNKQoraW50IHhmc19zYl92ZXJzaW9uX251bSh4ZnNfc2JfdCAqc2JwKTsKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkJeGZzX3NiX3ZlcnNpb25fbnVtKHNicCkKKyNlbHNlCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX05VTShzYnApCSgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX05VTUJJVFMpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfR09PRF9WRVJTSU9OKQoraW50IHhmc19zYl9nb29kX3ZlcnNpb24oeGZzX3NiX3QgKnNicCk7CisjZGVmaW5lCVhGU19TQl9HT09EX1ZFUlNJT04oc2JwKQl4ZnNfc2JfZ29vZF92ZXJzaW9uKHNicCkKKyNlbHNlCisjZGVmaW5lCVhGU19TQl9HT09EX1ZFUlNJT05fSU5UKHNicCkJXAorCSgoKChzYnApLT5zYl92ZXJzaW9ubnVtID49IFhGU19TQl9WRVJTSU9OXzEpICYmIFwKKwkgICgoc2JwKS0+c2JfdmVyc2lvbm51bSA8PSBYRlNfU0JfVkVSU0lPTl8zKSkgfHwgXAorCSAgICgoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAorCSAgICAhKCgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIH5YRlNfU0JfVkVSU0lPTl9PS1JFQUxCSVRTKSB8fCBcCisJICAgICAgKCgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX01PUkVCSVRTQklUKSAmJiBcCisJICAgICAgICgoc2JwKS0+c2JfZmVhdHVyZXMyICYgflhGU19TQl9WRVJTSU9OMl9PS1JFQUxCSVRTKSkpCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lCVhGU19TQl9HT09EX1ZFUlNJT04oc2JwKQlcCisJKFhGU19TQl9HT09EX1ZFUlNJT05fSU5UKHNicCkgJiYgXAorCSAgKHNicCktPnNiX3NoYXJlZF92biA8PSBYRlNfU0JfTUFYX1NIQVJFRF9WTikgKSkKKyNlbHNlCisvKgorICogZXh0cmEgMiBwYXJlbidzIGhlcmUgKCggdG8gdW5jb25mdXNlIHBhcmVuLW1hdGNoaW5nIGVkaXRvcnMKKyAqIGxpa2UgdmkgYmVjYXVzZSBYRlNfU0JfR09PRF9WRVJTSU9OX0lOVCBpcyBhIHBhcnRpYWwgZXhwcmVzc2lvbgorICogYW5kIHRoZSB0d28gWEZTX1NCX0dPT0RfVkVSU0lPTidzIGVhY2ggMiBtb3JlIGNsb3NlIHBhcmVuJ3MgdG8KKyAqIGNvbXBsZXRlIHRoZSBleHByZXNzaW9uLgorICovCisjZGVmaW5lIFhGU19TQl9HT09EX1ZFUlNJT04oc2JwKQlcCisJKFhGU19TQl9HT09EX1ZFUlNJT05fSU5UKHNicCkgJiYgXAorCSAgKCEoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9TSEFSRURCSVQpIHx8IFwKKwkgICAoc2JwKS0+c2Jfc2hhcmVkX3ZuIDw9IFhGU19TQl9NQVhfU0hBUkVEX1ZOKSkgKSkKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYKKworI2RlZmluZQlYRlNfU0JfR09PRF9TQVNIX1ZFUlNJT04oc2JwKQlcCisJKCgoKHNicCktPnNiX3ZlcnNpb25udW0gPj0gWEZTX1NCX1ZFUlNJT05fMSkgJiYgXAorCSAgKChzYnApLT5zYl92ZXJzaW9ubnVtIDw9IFhGU19TQl9WRVJTSU9OXzMpKSB8fCBcCisJICgoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAorCSAgISgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIH5YRlNfU0JfVkVSU0lPTl9PS1NBU0hCSVRTKSkpCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fVE9ORVcpCit1bnNpZ25lZCB4ZnNfc2JfdmVyc2lvbl90b25ldyh1bnNpZ25lZCB2KTsKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fVE9ORVcodikJeGZzX3NiX3ZlcnNpb25fdG9uZXcodikKKyNlbHNlCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX1RPTkVXKHYpCVwKKwkoKCgodikgPT0gWEZTX1NCX1ZFUlNJT05fMSkgPyBcCisJCTAgOiBcCisJCSgoKHYpID09IFhGU19TQl9WRVJTSU9OXzIpID8gXAorCQkJWEZTX1NCX1ZFUlNJT05fQVRUUkJJVCA6IFwKKwkJCShYRlNfU0JfVkVSU0lPTl9BVFRSQklUIHwgWEZTX1NCX1ZFUlNJT05fTkxJTktCSVQpKSkgfCBcCisJIFhGU19TQl9WRVJTSU9OXzQpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9UT09MRCkKK3Vuc2lnbmVkIHhmc19zYl92ZXJzaW9uX3Rvb2xkKHVuc2lnbmVkIHYpOworI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9UT09MRCh2KQl4ZnNfc2JfdmVyc2lvbl90b29sZCh2KQorI2Vsc2UKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fVE9PTEQodikJXAorCSgoKHYpICYgKFhGU19TQl9WRVJTSU9OX1FVT1RBQklUIHwgWEZTX1NCX1ZFUlNJT05fQUxJR05CSVQpKSA/IFwKKwkJMCA6IFwKKwkJKCgodikgJiBYRlNfU0JfVkVSU0lPTl9OTElOS0JJVCkgPyBcCisJCQlYRlNfU0JfVkVSU0lPTl8zIDogXAorCQkJKCgodikgJiBYRlNfU0JfVkVSU0lPTl9BVFRSQklUKSA/ICBcCisJCQkJWEZTX1NCX1ZFUlNJT05fMiA6IFwKKwkJCQlYRlNfU0JfVkVSU0lPTl8xKSkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNBVFRSKQoraW50IHhmc19zYl92ZXJzaW9uX2hhc2F0dHIoeGZzX3NiX3QgKnNicCk7CisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0hBU0FUVFIoc2JwKQl4ZnNfc2JfdmVyc2lvbl9oYXNhdHRyKHNicCkKKyNlbHNlCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0hBU0FUVFIoc2JwKQlcCisJKCgoc2JwKS0+c2JfdmVyc2lvbm51bSA9PSBYRlNfU0JfVkVSU0lPTl8yKSB8fCBcCisJICgoc2JwKS0+c2JfdmVyc2lvbm51bSA9PSBYRlNfU0JfVkVSU0lPTl8zKSB8fCBcCisJICgoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAorCSAgKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fQVRUUkJJVCkpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fQUREQVRUUikKK3ZvaWQgeGZzX3NiX3ZlcnNpb25fYWRkYXR0cih4ZnNfc2JfdCAqc2JwKTsKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fQUREQVRUUihzYnApCXhmc19zYl92ZXJzaW9uX2FkZGF0dHIoc2JwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fQUREQVRUUihzYnApCVwKKwkoKHNicCktPnNiX3ZlcnNpb25udW0gPSBcCisJICgoKHNicCktPnNiX3ZlcnNpb25udW0gPT0gWEZTX1NCX1ZFUlNJT05fMSkgPyBcCisJCVhGU19TQl9WRVJTSU9OXzIgOiBcCisJCSgoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgPyBcCisJCQkoKHNicCktPnNiX3ZlcnNpb25udW0gfCBYRlNfU0JfVkVSU0lPTl9BVFRSQklUKSA6IFwKKwkJCShYRlNfU0JfVkVSU0lPTl80IHwgWEZTX1NCX1ZFUlNJT05fQVRUUkJJVCkpKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0hBU05MSU5LKQoraW50IHhmc19zYl92ZXJzaW9uX2hhc25saW5rKHhmc19zYl90ICpzYnApOworI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9IQVNOTElOSyhzYnApCXhmc19zYl92ZXJzaW9uX2hhc25saW5rKHNicCkKKyNlbHNlCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0hBU05MSU5LKHNicCkJXAorCSgoKHNicCktPnNiX3ZlcnNpb25udW0gPT0gWEZTX1NCX1ZFUlNJT05fMykgfHwgXAorCSAoKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKKwkgICgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX05MSU5LQklUKSkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9BREROTElOSykKK3ZvaWQgeGZzX3NiX3ZlcnNpb25fYWRkbmxpbmsoeGZzX3NiX3QgKnNicCk7CisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0FERE5MSU5LKHNicCkJeGZzX3NiX3ZlcnNpb25fYWRkbmxpbmsoc2JwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fQURETkxJTksoc2JwKQlcCisJKChzYnApLT5zYl92ZXJzaW9ubnVtID0gXAorCSAoKHNicCktPnNiX3ZlcnNpb25udW0gPD0gWEZTX1NCX1ZFUlNJT05fMiA/IFwKKwkJWEZTX1NCX1ZFUlNJT05fMyA6IFwKKwkJKChzYnApLT5zYl92ZXJzaW9ubnVtIHwgWEZTX1NCX1ZFUlNJT05fTkxJTktCSVQpKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0hBU1FVT1RBKQoraW50IHhmc19zYl92ZXJzaW9uX2hhc3F1b3RhKHhmc19zYl90ICpzYnApOworI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9IQVNRVU9UQShzYnApCXhmc19zYl92ZXJzaW9uX2hhc3F1b3RhKHNicCkKKyNlbHNlCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0hBU1FVT1RBKHNicCkJXAorCSgoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAorCSAoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9RVU9UQUJJVCkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9BRERRVU9UQSkKK3ZvaWQgeGZzX3NiX3ZlcnNpb25fYWRkcXVvdGEoeGZzX3NiX3QgKnNicCk7CisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0FERFFVT1RBKHNicCkJeGZzX3NiX3ZlcnNpb25fYWRkcXVvdGEoc2JwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fQUREUVVPVEEoc2JwKQlcCisJKChzYnApLT5zYl92ZXJzaW9ubnVtID0gXAorCSAoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCA/IFwKKwkJKChzYnApLT5zYl92ZXJzaW9ubnVtIHwgWEZTX1NCX1ZFUlNJT05fUVVPVEFCSVQpIDogXAorCQkoWEZTX1NCX1ZFUlNJT05fVE9ORVcoKHNicCktPnNiX3ZlcnNpb25udW0pIHwgXAorCQkgWEZTX1NCX1ZFUlNJT05fUVVPVEFCSVQpKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0hBU0FMSUdOKQoraW50IHhmc19zYl92ZXJzaW9uX2hhc2FsaWduKHhmc19zYl90ICpzYnApOworI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9IQVNBTElHTihzYnApCXhmc19zYl92ZXJzaW9uX2hhc2FsaWduKHNicCkKKyNlbHNlCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0hBU0FMSUdOKHNicCkJXAorCSgoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAorCSAoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9BTElHTkJJVCkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9TVUJBTElHTikKK3ZvaWQgeGZzX3NiX3ZlcnNpb25fc3ViYWxpZ24oeGZzX3NiX3QgKnNicCk7CisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX1NVQkFMSUdOKHNicCkJeGZzX3NiX3ZlcnNpb25fc3ViYWxpZ24oc2JwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fU1VCQUxJR04oc2JwKQlcCisJKChzYnApLT5zYl92ZXJzaW9ubnVtID0gXAorCSBYRlNfU0JfVkVSU0lPTl9UT09MRCgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIH5YRlNfU0JfVkVSU0lPTl9BTElHTkJJVCkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNEQUxJR04pCitpbnQgeGZzX3NiX3ZlcnNpb25faGFzZGFsaWduKHhmc19zYl90ICpzYnApOworI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9IQVNEQUxJR04oc2JwKQl4ZnNfc2JfdmVyc2lvbl9oYXNkYWxpZ24oc2JwKQorI2Vsc2UKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fSEFTREFMSUdOKHNicCkJXAorCSgoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAorCSAoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9EQUxJR05CSVQpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fQUREREFMSUdOKQoraW50IHhmc19zYl92ZXJzaW9uX2FkZGRhbGlnbih4ZnNfc2JfdCAqc2JwKTsKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fQUREREFMSUdOKHNicCkJeGZzX3NiX3ZlcnNpb25fYWRkZGFsaWduKHNicCkKKyNlbHNlCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0FERERBTElHTihzYnApCVwKKwkoKHNicCktPnNiX3ZlcnNpb25udW0gPSBcCisJCSgoc2JwKS0+c2JfdmVyc2lvbm51bSB8IFhGU19TQl9WRVJTSU9OX0RBTElHTkJJVCkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNTSEFSRUQpCitpbnQgeGZzX3NiX3ZlcnNpb25faGFzc2hhcmVkKHhmc19zYl90ICpzYnApOworI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9IQVNTSEFSRUQoc2JwKQl4ZnNfc2JfdmVyc2lvbl9oYXNzaGFyZWQoc2JwKQorI2Vsc2UKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fSEFTU0hBUkVEKHNicCkJXAorCSgoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAorCSAoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9TSEFSRURCSVQpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fQUREU0hBUkVEKQoraW50IHhmc19zYl92ZXJzaW9uX2FkZHNoYXJlZCh4ZnNfc2JfdCAqc2JwKTsKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fQUREU0hBUkVEKHNicCkJeGZzX3NiX3ZlcnNpb25fYWRkc2hhcmVkKHNicCkKKyNlbHNlCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0FERFNIQVJFRChzYnApCVwKKwkoKHNicCktPnNiX3ZlcnNpb25udW0gPSBcCisJCSgoc2JwKS0+c2JfdmVyc2lvbm51bSB8IFhGU19TQl9WRVJTSU9OX1NIQVJFREJJVCkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9TVUJTSEFSRUQpCitpbnQgeGZzX3NiX3ZlcnNpb25fc3Vic2hhcmVkKHhmc19zYl90ICpzYnApOworI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9TVUJTSEFSRUQoc2JwKQl4ZnNfc2JfdmVyc2lvbl9zdWJzaGFyZWQoc2JwKQorI2Vsc2UKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fU1VCU0hBUkVEKHNicCkJXAorCSgoc2JwKS0+c2JfdmVyc2lvbm51bSA9IFwKKwkJKChzYnApLT5zYl92ZXJzaW9ubnVtICYgflhGU19TQl9WRVJTSU9OX1NIQVJFREJJVCkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNESVJWMikKK2ludCB4ZnNfc2JfdmVyc2lvbl9oYXNkaXJ2Mih4ZnNfc2JfdCAqc2JwKTsKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fSEFTRElSVjIoc2JwKQl4ZnNfc2JfdmVyc2lvbl9oYXNkaXJ2MihzYnApCisjZWxzZQorI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9IQVNESVJWMihzYnApCVwKKwkoKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKKwkgKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fRElSVjJCSVQpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIpCitpbnQgeGZzX3NiX3ZlcnNpb25faGFzbG9ndjIoeGZzX3NiX3QgKnNicCk7CisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0hBU0xPR1YyKHNicCkgICB4ZnNfc2JfdmVyc2lvbl9oYXNsb2d2MihzYnApCisjZWxzZQorI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9IQVNMT0dWMihzYnApICAgXAorCSgoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAorCSgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX0xPR1YyQklUKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0hBU0VYVEZMR0JJVCkKK2ludCB4ZnNfc2JfdmVyc2lvbl9oYXNleHRmbGdiaXQoeGZzX3NiX3QgKnNicCk7CisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0hBU0VYVEZMR0JJVChzYnApCXhmc19zYl92ZXJzaW9uX2hhc2V4dGZsZ2JpdChzYnApCisjZWxzZQorI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9IQVNFWFRGTEdCSVQoc2JwKQlcCisJKChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCisJICgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX0VYVEZMR0JJVCkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9BRERFWFRGTEdCSVQpCitpbnQgeGZzX3NiX3ZlcnNpb25fYWRkZXh0ZmxnYml0KHhmc19zYl90ICpzYnApOworI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9BRERFWFRGTEdCSVQoc2JwKQl4ZnNfc2JfdmVyc2lvbl9hZGRleHRmbGdiaXQoc2JwKQorI2Vsc2UKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fQURERVhURkxHQklUKHNicCkJXAorCSgoc2JwKS0+c2JfdmVyc2lvbm51bSA9IFwKKwkJKChzYnApLT5zYl92ZXJzaW9ubnVtIHwgWEZTX1NCX1ZFUlNJT05fRVhURkxHQklUKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX1NVQkVYVEZMR0JJVCkKK2ludCB4ZnNfc2JfdmVyc2lvbl9zdWJleHRmbGdiaXQoeGZzX3NiX3QgKnNicCk7CisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX1NVQkVYVEZMR0JJVChzYnApCXhmc19zYl92ZXJzaW9uX3N1YmV4dGZsZ2JpdChzYnApCisjZWxzZQorI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9TVUJFWFRGTEdCSVQoc2JwKQlcCisJKChzYnApLT5zYl92ZXJzaW9ubnVtID0gXAorCQkoKHNicCktPnNiX3ZlcnNpb25udW0gJiB+WEZTX1NCX1ZFUlNJT05fRVhURkxHQklUKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0hBU1NFQ1RPUikKK2ludCB4ZnNfc2JfdmVyc2lvbl9oYXNzZWN0b3IoeGZzX3NiX3QgKnNicCk7CisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0hBU1NFQ1RPUihzYnApICAgeGZzX3NiX3ZlcnNpb25faGFzc2VjdG9yKHNicCkKKyNlbHNlCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0hBU1NFQ1RPUihzYnApICAgXAorCSgoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAorCSgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX1NFQ1RPUkJJVCkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNNT1JFQklUU0JJVCkKK2ludCB4ZnNfc2JfdmVyc2lvbl9oYXNtb3JlYml0cyh4ZnNfc2JfdCAqc2JwKTsKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fSEFTTU9SRUJJVFMoc2JwKQl4ZnNfc2JfdmVyc2lvbl9oYXNtb3JlYml0cyhzYnApCisjZWxzZQorI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9IQVNNT1JFQklUUyhzYnApCVwKKwkoKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKKwkgKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fTU9SRUJJVFNCSVQpKQorI2VuZGlmCisKKy8qCisgKiBzYl9mZWF0dXJlczIgYml0IHZlcnNpb24gbWFjcm9zLgorICoKKyAqIEZvciBleGFtcGxlLCBmb3IgYSBiaXQgZGVmaW5lZCBhcyBYRlNfU0JfVkVSU0lPTjJfWUJJVCwgaGFzIGEgbWFjcm86CisgKgorICogU0JfVkVSU0lPTl9IQVNZQklUKHhmc19zYl90ICpzYnApCisgKgkoKFhGU19TQl9WRVJTSU9OX0hBU01PUkVCSVRTKHNicCkgJiYKKyAqCSAoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTjJfWUJJVCkKKyAqLworCisvKgorICogZW5kIG9mIHN1cGVyYmxvY2sgdmVyc2lvbiBtYWNyb3MKKyAqLworCisjZGVmaW5lIFhGU19TQl9EQUREUgkoKHhmc19kYWRkcl90KTApCS8qIGRhZGRyIGluIGZpbGVzeXN0ZW0vYWcgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX0JMT0NLKQoreGZzX2FnYmxvY2tfdCB4ZnNfc2JfYmxvY2soc3RydWN0IHhmc19tb3VudCAqbXApOworI2RlZmluZQlYRlNfU0JfQkxPQ0sobXApCXhmc19zYl9ibG9jayhtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19TQl9CTE9DSyhtcCkJWEZTX0hEUl9CTE9DSyhtcCwgWEZTX1NCX0RBRERSKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0hEUl9CTE9DSykKK3hmc19hZ2Jsb2NrX3QgeGZzX2hkcl9ibG9jayhzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RhZGRyX3QgZCk7CisjZGVmaW5lCVhGU19IRFJfQkxPQ0sobXAsZCkJeGZzX2hkcl9ibG9jayhtcCxkKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0hEUl9CTE9DSyhtcCxkKQkoKHhmc19hZ2Jsb2NrX3QpKFhGU19CQl9UT19GU0JUKG1wLGQpKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfREFERFJfVE9fRlNCKQoreGZzX2ZzYmxvY2tfdCB4ZnNfZGFkZHJfdG9fZnNiKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGFkZHJfdCBkKTsKKyNkZWZpbmUJWEZTX0RBRERSX1RPX0ZTQihtcCxkKQkJeGZzX2RhZGRyX3RvX2ZzYihtcCxkKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RBRERSX1RPX0ZTQihtcCxkKSBcCisJWEZTX0FHQl9UT19GU0IobXAsIFhGU19EQUREUl9UT19BR05PKG1wLGQpLCBYRlNfREFERFJfVE9fQUdCTk8obXAsZCkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0ZTQl9UT19EQUREUikKK3hmc19kYWRkcl90IHhmc19mc2JfdG9fZGFkZHIoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19mc2Jsb2NrX3QgZnNibm8pOworI2RlZmluZQlYRlNfRlNCX1RPX0RBRERSKG1wLGZzYm5vKQl4ZnNfZnNiX3RvX2RhZGRyKG1wLGZzYm5vKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0ZTQl9UT19EQUREUihtcCxmc2JubykgXAorCVhGU19BR0JfVE9fREFERFIobXAsIFhGU19GU0JfVE9fQUdOTyhtcCxmc2JubyksIFwKKwkJCSBYRlNfRlNCX1RPX0FHQk5PKG1wLGZzYm5vKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CVUZfVE9fU0JQKQoreGZzX3NiX3QgKnhmc19idWZfdG9fc2JwKHN0cnVjdCB4ZnNfYnVmICpicCk7CisjZGVmaW5lIFhGU19CVUZfVE9fU0JQKGJwKQl4ZnNfYnVmX3RvX3NicChicCkKKyNlbHNlCisjZGVmaW5lIFhGU19CVUZfVE9fU0JQKGJwKQkoKHhmc19zYl90ICopWEZTX0JVRl9QVFIoYnApKQorI2VuZGlmCisKKy8qCisgKiBGaWxlIHN5c3RlbSBzZWN0b3IgdG8gYmFzaWMgYmxvY2sgY29udmVyc2lvbnMuCisgKi8KKyNkZWZpbmUgWEZTX0ZTU19UT19CQihtcCxzZWMpCSgoc2VjKSA8PCAobXApLT5tX3NlY3RiYl9sb2cpCisjZGVmaW5lIFhGU19CQl9UT19GU1MobXAsYmIpCVwKKwkoKChiYikgKyAoWEZTX0ZTU19UT19CQihtcCwxKSAtIDEpKSA+PiAobXApLT5tX3NlY3RiYl9sb2cpCisjZGVmaW5lIFhGU19CQl9UT19GU1NUKG1wLGJiKQkoKGJiKSA+PiAobXApLT5tX3NlY3RiYl9sb2cpCisKKy8qCisgKiBGaWxlIHN5c3RlbSBzZWN0b3IgdG8gYnl0ZSBjb252ZXJzaW9ucy4KKyAqLworI2RlZmluZSBYRlNfRlNTX1RPX0IobXAsc2VjdG5vKQkoKHhmc19mc2l6ZV90KShzZWN0bm8pIDw8IChtcCktPm1fc2Iuc2Jfc2VjdGxvZykKKyNkZWZpbmUgWEZTX0JfVE9fRlNTVChtcCxiKQkoKChfX3VpbnQ2NF90KShiKSkgPj4gKG1wKS0+bV9zYi5zYl9zZWN0bG9nKQorCisvKgorICogRmlsZSBzeXN0ZW0gYmxvY2sgdG8gYmFzaWMgYmxvY2sgY29udmVyc2lvbnMuCisgKi8KKyNkZWZpbmUJWEZTX0ZTQl9UT19CQihtcCxmc2JubykJKChmc2JubykgPDwgKG1wKS0+bV9ibGtiYl9sb2cpCisjZGVmaW5lCVhGU19CQl9UT19GU0IobXAsYmIpCVwKKwkoKChiYikgKyAoWEZTX0ZTQl9UT19CQihtcCwxKSAtIDEpKSA+PiAobXApLT5tX2Jsa2JiX2xvZykKKyNkZWZpbmUJWEZTX0JCX1RPX0ZTQlQobXAsYmIpCSgoYmIpID4+IChtcCktPm1fYmxrYmJfbG9nKQorI2RlZmluZQlYRlNfQkJfRlNCX09GRlNFVChtcCxiYikgKChiYikgJiAoKG1wKS0+bV9ic2l6ZSAtIDEpKQorCisvKgorICogRmlsZSBzeXN0ZW0gYmxvY2sgdG8gYnl0ZSBjb252ZXJzaW9ucy4KKyAqLworI2RlZmluZSBYRlNfRlNCX1RPX0IobXAsZnNibm8pCSgoeGZzX2ZzaXplX3QpKGZzYm5vKSA8PCAobXApLT5tX3NiLnNiX2Jsb2NrbG9nKQorI2RlZmluZSBYRlNfQl9UT19GU0IobXAsYikJXAorCSgoKChfX3VpbnQ2NF90KShiKSkgKyAobXApLT5tX2Jsb2NrbWFzaykgPj4gKG1wKS0+bV9zYi5zYl9ibG9ja2xvZykKKyNkZWZpbmUgWEZTX0JfVE9fRlNCVChtcCxiKQkoKChfX3VpbnQ2NF90KShiKSkgPj4gKG1wKS0+bV9zYi5zYl9ibG9ja2xvZykKKyNkZWZpbmUgWEZTX0JfRlNCX09GRlNFVChtcCxiKQkoKGIpICYgKG1wKS0+bV9ibG9ja21hc2spCisKKyNlbmRpZgkvKiBfX1hGU19TQl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnMuYyBiL2ZzL3hmcy94ZnNfdHJhbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGIwZTIyCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc190cmFucy5jCkBAIC0wLDAgKzEsMTMxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnNfcHJpdi5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgorI2luY2x1ZGUgInhmc19xdW90YS5oIgorI2luY2x1ZGUgInhmc190cmFuc19zcGFjZS5oIgorCisKK1NUQVRJQyB2b2lkCXhmc190cmFuc19hcHBseV9zYl9kZWx0YXMoeGZzX3RyYW5zX3QgKik7CitTVEFUSUMgdWludAl4ZnNfdHJhbnNfY291bnRfdmVjcyh4ZnNfdHJhbnNfdCAqKTsKK1NUQVRJQyB2b2lkCXhmc190cmFuc19maWxsX3ZlY3MoeGZzX3RyYW5zX3QgKiwgeGZzX2xvZ19pb3ZlY190ICopOworU1RBVElDIHZvaWQJeGZzX3RyYW5zX3VuY29tbWl0KHhmc190cmFuc190ICosIHVpbnQpOworU1RBVElDIHZvaWQJeGZzX3RyYW5zX2NvbW1pdHRlZCh4ZnNfdHJhbnNfdCAqLCBpbnQpOworU1RBVElDIHZvaWQJeGZzX3RyYW5zX2NodW5rX2NvbW1pdHRlZCh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqLCB4ZnNfbHNuX3QsIGludCk7CitTVEFUSUMgdm9pZAl4ZnNfdHJhbnNfZnJlZSh4ZnNfdHJhbnNfdCAqKTsKKwora21lbV96b25lX3QJCSp4ZnNfdHJhbnNfem9uZTsKKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgcHJlY29tcHV0ZWQgdHJhbnNhY3Rpb24gcmVzZXJ2YXRpb24gdmFsdWVzCisgKiBpbiB0aGUgbW91bnQgc3RydWN0dXJlLgorICovCit2b2lkCit4ZnNfdHJhbnNfaW5pdCgKKwl4ZnNfbW91bnRfdAkqbXApCit7CisJeGZzX3RyYW5zX3Jlc2VydmF0aW9uc190CSpyZXNwOworCisJcmVzcCA9ICYobXAtPm1fcmVzZXJ2YXRpb25zKTsKKwlyZXNwLT50cl93cml0ZSA9CisJCSh1aW50KShYRlNfQ0FMQ19XUklURV9MT0dfUkVTKG1wKSArIFhGU19EUVVPVF9MT0dSRVMobXApKTsKKwlyZXNwLT50cl9pdHJ1bmNhdGUgPQorCQkodWludCkoWEZTX0NBTENfSVRSVU5DQVRFX0xPR19SRVMobXApICsgWEZTX0RRVU9UX0xPR1JFUyhtcCkpOworCXJlc3AtPnRyX3JlbmFtZSA9CisJCSh1aW50KShYRlNfQ0FMQ19SRU5BTUVfTE9HX1JFUyhtcCkgKyBYRlNfRFFVT1RfTE9HUkVTKG1wKSk7CisJcmVzcC0+dHJfbGluayA9ICh1aW50KVhGU19DQUxDX0xJTktfTE9HX1JFUyhtcCk7CisJcmVzcC0+dHJfcmVtb3ZlID0KKwkJKHVpbnQpKFhGU19DQUxDX1JFTU9WRV9MT0dfUkVTKG1wKSArIFhGU19EUVVPVF9MT0dSRVMobXApKTsKKwlyZXNwLT50cl9zeW1saW5rID0KKwkJKHVpbnQpKFhGU19DQUxDX1NZTUxJTktfTE9HX1JFUyhtcCkgKyBYRlNfRFFVT1RfTE9HUkVTKG1wKSk7CisJcmVzcC0+dHJfY3JlYXRlID0KKwkJKHVpbnQpKFhGU19DQUxDX0NSRUFURV9MT0dfUkVTKG1wKSArIFhGU19EUVVPVF9MT0dSRVMobXApKTsKKwlyZXNwLT50cl9ta2RpciA9CisJCSh1aW50KShYRlNfQ0FMQ19NS0RJUl9MT0dfUkVTKG1wKSArIFhGU19EUVVPVF9MT0dSRVMobXApKTsKKwlyZXNwLT50cl9pZnJlZSA9CisJCSh1aW50KShYRlNfQ0FMQ19JRlJFRV9MT0dfUkVTKG1wKSArIFhGU19EUVVPVF9MT0dSRVMobXApKTsKKwlyZXNwLT50cl9pY2hhbmdlID0KKwkJKHVpbnQpKFhGU19DQUxDX0lDSEFOR0VfTE9HX1JFUyhtcCkgKyBYRlNfRFFVT1RfTE9HUkVTKG1wKSk7CisJcmVzcC0+dHJfZ3Jvd2RhdGEgPSAodWludClYRlNfQ0FMQ19HUk9XREFUQV9MT0dfUkVTKG1wKTsKKwlyZXNwLT50cl9zd3JpdGUgPSAodWludClYRlNfQ0FMQ19TV1JJVEVfTE9HX1JFUyhtcCk7CisJcmVzcC0+dHJfd3JpdGVpZCA9ICh1aW50KVhGU19DQUxDX1dSSVRFSURfTE9HX1JFUyhtcCk7CisJcmVzcC0+dHJfYWRkYWZvcmsgPQorCQkodWludCkoWEZTX0NBTENfQUREQUZPUktfTE9HX1JFUyhtcCkgKyBYRlNfRFFVT1RfTE9HUkVTKG1wKSk7CisJcmVzcC0+dHJfYXR0cmludmFsID0gKHVpbnQpWEZTX0NBTENfQVRUUklOVkFMX0xPR19SRVMobXApOworCXJlc3AtPnRyX2F0dHJzZXQgPQorCQkodWludCkoWEZTX0NBTENfQVRUUlNFVF9MT0dfUkVTKG1wKSArIFhGU19EUVVPVF9MT0dSRVMobXApKTsKKwlyZXNwLT50cl9hdHRycm0gPQorCQkodWludCkoWEZTX0NBTENfQVRUUlJNX0xPR19SRVMobXApICsgWEZTX0RRVU9UX0xPR1JFUyhtcCkpOworCXJlc3AtPnRyX2NsZWFyYWdpID0gKHVpbnQpWEZTX0NBTENfQ0xFQVJfQUdJX0JVQ0tFVF9MT0dfUkVTKG1wKTsKKwlyZXNwLT50cl9ncm93cnRhbGxvYyA9ICh1aW50KVhGU19DQUxDX0dST1dSVEFMTE9DX0xPR19SRVMobXApOworCXJlc3AtPnRyX2dyb3dydHplcm8gPSAodWludClYRlNfQ0FMQ19HUk9XUlRaRVJPX0xPR19SRVMobXApOworCXJlc3AtPnRyX2dyb3dydGZyZWUgPSAodWludClYRlNfQ0FMQ19HUk9XUlRGUkVFX0xPR19SRVMobXApOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBhbGxvY2F0ZSBhIHRyYW5zYWN0aW9uIHN0cnVjdHVyZS4KKyAqIFRoZSB0eXBlIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdGhlIHRyYW5zYWN0aW9uLiAgVGhlc2UKKyAqIGFyZSBlbnVtZXJhdGVkIGluIHhmc190cmFucy5oLgorICoKKyAqIER5bmFtaWNhbGx5IGFsbG9jYXRlIHRoZSB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUgZnJvbSB0aGUgdHJhbnNhY3Rpb24KKyAqIHpvbmUsIGluaXRpYWxpemUgaXQsIGFuZCByZXR1cm4gaXQgdG8gdGhlIGNhbGxlci4KKyAqLworeGZzX3RyYW5zX3QgKgoreGZzX3RyYW5zX2FsbG9jKAorCXhmc19tb3VudF90CSptcCwKKwl1aW50CQl0eXBlKQoreworCWZzX2NoZWNrX2Zyb3plbihYRlNfTVRPVkZTKG1wKSwgU0JfRlJFRVpFX1RSQU5TKTsKKwlhdG9taWNfaW5jKCZtcC0+bV9hY3RpdmVfdHJhbnMpOworCisJcmV0dXJuIChfeGZzX3RyYW5zX2FsbG9jKG1wLCB0eXBlKSk7CisKK30KKworeGZzX3RyYW5zX3QgKgorX3hmc190cmFuc19hbGxvYygKKwl4ZnNfbW91bnRfdAkqbXAsCisJdWludAkJdHlwZSkKK3sKKwl4ZnNfdHJhbnNfdAkqdHA7CisKKwlBU1NFUlQoeGZzX3RyYW5zX3pvbmUgIT0gTlVMTCk7CisJdHAgPSBrbWVtX3pvbmVfemFsbG9jKHhmc190cmFuc196b25lLCBLTV9TTEVFUCk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIHRyYW5zYWN0aW9uIHN0cnVjdHVyZS4KKwkgKi8KKwl0cC0+dF9tYWdpYyA9IFhGU19UUkFOU19NQUdJQzsKKwl0cC0+dF90eXBlID0gdHlwZTsKKwl0cC0+dF9tb3VudHAgPSBtcDsKKwl0cC0+dF9pdGVtc19mcmVlID0gWEZTX0xJQ19OVU1fU0xPVFM7CisJdHAtPnRfYnVzeV9mcmVlID0gWEZTX0xCQ19OVU1fU0xPVFM7CisJWEZTX0xJQ19JTklUKCYodHAtPnRfaXRlbXMpKTsKKwlYRlNfTEJDX0lOSVQoJih0cC0+dF9idXN5KSk7CisKKwlyZXR1cm4gKHRwKTsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIGNyZWF0ZSBhIG5ldyB0cmFuc2FjdGlvbiB3aGljaCB3aWxsIHNoYXJlIHRoZQorICogcGVybWFuZW50IGxvZyByZXNlcnZhdGlvbiBvZiB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24uICBUaGUgcmVtYWluaW5nCisgKiB1bnVzZWQgYmxvY2sgYW5kIHJ0IGV4dGVudCByZXNlcnZhdGlvbnMgYXJlIGFsc28gaW5oZXJpdGVkLiAgVGhpcworICogaW1wbGllcyB0aGF0IHRoZSBvcmlnaW5hbCB0cmFuc2FjdGlvbiBpcyBubyBsb25nZXIgYWxsb3dlZCB0byBhbGxvY2F0ZQorICogYmxvY2tzLiAgTG9ja3MgYW5kIGxvZyBpdGVtcywgaG93ZXZlciwgYXJlIG5vIGluaGVyaXRlZC4gIFRoZXkgbXVzdAorICogYmUgYWRkZWQgdG8gdGhlIG5ldyB0cmFuc2FjdGlvbiBleHBsaWNpdGx5LgorICovCit4ZnNfdHJhbnNfdCAqCit4ZnNfdHJhbnNfZHVwKAorCXhmc190cmFuc190CSp0cCkKK3sKKwl4ZnNfdHJhbnNfdAkqbnRwOworCisJbnRwID0ga21lbV96b25lX3phbGxvYyh4ZnNfdHJhbnNfem9uZSwgS01fU0xFRVApOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBuZXcgdHJhbnNhY3Rpb24gc3RydWN0dXJlLgorCSAqLworCW50cC0+dF9tYWdpYyA9IFhGU19UUkFOU19NQUdJQzsKKwludHAtPnRfdHlwZSA9IHRwLT50X3R5cGU7CisJbnRwLT50X21vdW50cCA9IHRwLT50X21vdW50cDsKKwludHAtPnRfaXRlbXNfZnJlZSA9IFhGU19MSUNfTlVNX1NMT1RTOworCW50cC0+dF9idXN5X2ZyZWUgPSBYRlNfTEJDX05VTV9TTE9UUzsKKwlYRlNfTElDX0lOSVQoJihudHAtPnRfaXRlbXMpKTsKKwlYRlNfTEJDX0lOSVQoJihudHAtPnRfYnVzeSkpOworCisJQVNTRVJUKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUyk7CisKKyNpZiBkZWZpbmVkKFhMT0dfTk9MT0cpIHx8IGRlZmluZWQoREVCVUcpCisJQVNTRVJUKCF4bG9nX2RlYnVnIHx8IHRwLT50X3RpY2tldCAhPSBOVUxMKTsKKyNlbHNlCisJQVNTRVJUKHRwLT50X3RpY2tldCAhPSBOVUxMKTsKKyNlbmRpZgorCW50cC0+dF9mbGFncyA9IFhGU19UUkFOU19QRVJNX0xPR19SRVMgfCAodHAtPnRfZmxhZ3MgJiBYRlNfVFJBTlNfUkVTRVJWRSk7CisJbnRwLT50X3RpY2tldCA9IHRwLT50X3RpY2tldDsKKwludHAtPnRfYmxrX3JlcyA9IHRwLT50X2Jsa19yZXMgLSB0cC0+dF9ibGtfcmVzX3VzZWQ7CisJdHAtPnRfYmxrX3JlcyA9IHRwLT50X2Jsa19yZXNfdXNlZDsKKwludHAtPnRfcnR4X3JlcyA9IHRwLT50X3J0eF9yZXMgLSB0cC0+dF9ydHhfcmVzX3VzZWQ7CisJdHAtPnRfcnR4X3JlcyA9IHRwLT50X3J0eF9yZXNfdXNlZDsKKwlQRkxBR1NfRFVQKCZ0cC0+dF9wZmxhZ3MsICZudHAtPnRfcGZsYWdzKTsKKworCVhGU19UUkFOU19EVVBfRFFJTkZPKHRwLT50X21vdW50cCwgdHAsIG50cCk7CisKKwlhdG9taWNfaW5jKCZ0cC0+dF9tb3VudHAtPm1fYWN0aXZlX3RyYW5zKTsKKwlyZXR1cm4gbnRwOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gcmVzZXJ2ZSBmcmVlIGRpc2sgYmxvY2tzIGFuZCBsb2cgc3BhY2UgZm9yIHRoZQorICogZ2l2ZW4gdHJhbnNhY3Rpb24uICBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgYWxsb2NhdGluZyBhbnkgcmVzb3VyY2VzCisgKiB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uLgorICoKKyAqIFRoaXMgd2lsbCByZXR1cm4gRU5PU1BDIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoIGJsb2NrcyBhdmFpbGFibGUuCisgKiBJdCB3aWxsIHNsZWVwIHdhaXRpbmcgZm9yIGF2YWlsYWJsZSBsb2cgc3BhY2UuCisgKiBUaGUgb25seSB2YWxpZCB2YWx1ZSBmb3IgdGhlIGZsYWdzIHBhcmFtZXRlciBpcyBYRlNfUkVTX0xPR19QRVJNLCB3aGljaAorICogaXMgdXNlZCBieSBsb25nIHJ1bm5pbmcgdHJhbnNhY3Rpb25zLiAgSWYgYW55IG9uZSBvZiB0aGUgcmVzZXJ2YXRpb25zCisgKiBmYWlscyB0aGVuIHRoZXkgd2lsbCBhbGwgYmUgYmFja2VkIG91dC4KKyAqCisgKiBUaGlzIGRvZXMgbm90IGRvIHF1b3RhIHJlc2VydmF0aW9ucy4gVGhhdCB0eXBpY2FsbHkgaXMgZG9uZSBieSB0aGUKKyAqIGNhbGxlciBhZnRlcndhcmRzLgorICovCitpbnQKK3hmc190cmFuc19yZXNlcnZlKAorCXhmc190cmFuc190CSp0cCwKKwl1aW50CQlibG9ja3MsCisJdWludAkJbG9nc3BhY2UsCisJdWludAkJcnRleHRlbnRzLAorCXVpbnQJCWZsYWdzLAorCXVpbnQJCWxvZ2NvdW50KQoreworCWludAkJbG9nX2ZsYWdzOworCWludAkJZXJyb3I7CisJaW50CXJzdmQ7CisKKwllcnJvciA9IDA7CisJcnN2ZCA9ICh0cC0+dF9mbGFncyAmIFhGU19UUkFOU19SRVNFUlZFKSAhPSAwOworCisJLyogTWFyayB0aGlzIHRocmVhZCBhcyBiZWluZyBpbiBhIHRyYW5zYWN0aW9uICovCisgICAgICAgIFBGTEFHU19TRVRfRlNUUkFOUygmdHAtPnRfcGZsYWdzKTsKKworCS8qCisJICogQXR0ZW1wdCB0byByZXNlcnZlIHRoZSBuZWVkZWQgZGlzayBibG9ja3MgYnkgZGVjcmVtZW50aW5nCisJICogdGhlIG51bWJlciBuZWVkZWQgZnJvbSB0aGUgbnVtYmVyIGF2YWlsYWJsZS4gIFRoaXMgd2lsbAorCSAqIGZhaWwgaWYgdGhlIGNvdW50IHdvdWxkIGdvIGJlbG93IHplcm8uCisJICovCisJaWYgKGJsb2NrcyA+IDApIHsKKwkJZXJyb3IgPSB4ZnNfbW9kX2luY29yZV9zYih0cC0+dF9tb3VudHAsIFhGU19TQlNfRkRCTE9DS1MsCisJCQkJCSAgLWJsb2NrcywgcnN2ZCk7CisJCWlmIChlcnJvciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQRkxBR1NfUkVTVE9SRV9GU1RSQU5TKCZ0cC0+dF9wZmxhZ3MpOworCQkJcmV0dXJuIChYRlNfRVJST1IoRU5PU1BDKSk7CisJCX0KKwkJdHAtPnRfYmxrX3JlcyArPSBibG9ja3M7CisJfQorCisJLyoKKwkgKiBSZXNlcnZlIHRoZSBsb2cgc3BhY2UgbmVlZGVkIGZvciB0aGlzIHRyYW5zYWN0aW9uLgorCSAqLworCWlmIChsb2dzcGFjZSA+IDApIHsKKwkJQVNTRVJUKCh0cC0+dF9sb2dfcmVzID09IDApIHx8ICh0cC0+dF9sb2dfcmVzID09IGxvZ3NwYWNlKSk7CisJCUFTU0VSVCgodHAtPnRfbG9nX2NvdW50ID09IDApIHx8CisJCQkodHAtPnRfbG9nX2NvdW50ID09IGxvZ2NvdW50KSk7CisJCWlmIChmbGFncyAmIFhGU19UUkFOU19QRVJNX0xPR19SRVMpIHsKKwkJCWxvZ19mbGFncyA9IFhGU19MT0dfUEVSTV9SRVNFUlY7CisJCQl0cC0+dF9mbGFncyB8PSBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTOworCQl9IGVsc2UgeworCQkJQVNTRVJUKHRwLT50X3RpY2tldCA9PSBOVUxMKTsKKwkJCUFTU0VSVCghKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUykpOworCQkJbG9nX2ZsYWdzID0gMDsKKwkJfQorCisJCWVycm9yID0geGZzX2xvZ19yZXNlcnZlKHRwLT50X21vdW50cCwgbG9nc3BhY2UsIGxvZ2NvdW50LAorCQkJCQkmdHAtPnRfdGlja2V0LAorCQkJCQlYRlNfVFJBTlNBQ1RJT04sIGxvZ19mbGFncyk7CisJCWlmIChlcnJvcikgeworCQkJZ290byB1bmRvX2Jsb2NrczsKKwkJfQorCQl0cC0+dF9sb2dfcmVzID0gbG9nc3BhY2U7CisJCXRwLT50X2xvZ19jb3VudCA9IGxvZ2NvdW50OworCX0KKworCS8qCisJICogQXR0ZW1wdCB0byByZXNlcnZlIHRoZSBuZWVkZWQgcmVhbHRpbWUgZXh0ZW50cyBieSBkZWNyZW1lbnRpbmcKKwkgKiB0aGUgbnVtYmVyIG5lZWRlZCBmcm9tIHRoZSBudW1iZXIgYXZhaWxhYmxlLiAgVGhpcyB3aWxsCisJICogZmFpbCBpZiB0aGUgY291bnQgd291bGQgZ28gYmVsb3cgemVyby4KKwkgKi8KKwlpZiAocnRleHRlbnRzID4gMCkgeworCQllcnJvciA9IHhmc19tb2RfaW5jb3JlX3NiKHRwLT50X21vdW50cCwgWEZTX1NCU19GUkVYVEVOVFMsCisJCQkJCSAgLXJ0ZXh0ZW50cywgcnN2ZCk7CisJCWlmIChlcnJvcikgeworCQkJZXJyb3IgPSBYRlNfRVJST1IoRU5PU1BDKTsKKwkJCWdvdG8gdW5kb19sb2c7CisJCX0KKwkJdHAtPnRfcnR4X3JlcyArPSBydGV4dGVudHM7CisJfQorCisJcmV0dXJuIDA7CisKKwkvKgorCSAqIEVycm9yIGNhc2VzIGp1bXAgdG8gb25lIG9mIHRoZXNlIGxhYmVscyB0byB1bmRvIGFueQorCSAqIHJlc2VydmF0aW9ucyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiBwZXJmb3JtZWQuCisJICovCit1bmRvX2xvZzoKKwlpZiAobG9nc3BhY2UgPiAwKSB7CisJCWlmIChmbGFncyAmIFhGU19UUkFOU19QRVJNX0xPR19SRVMpIHsKKwkJCWxvZ19mbGFncyA9IFhGU19MT0dfUkVMX1BFUk1fUkVTRVJWOworCQl9IGVsc2UgeworCQkJbG9nX2ZsYWdzID0gMDsKKwkJfQorCQl4ZnNfbG9nX2RvbmUodHAtPnRfbW91bnRwLCB0cC0+dF90aWNrZXQsIE5VTEwsIGxvZ19mbGFncyk7CisJCXRwLT50X3RpY2tldCA9IE5VTEw7CisJCXRwLT50X2xvZ19yZXMgPSAwOworCQl0cC0+dF9mbGFncyAmPSB+WEZTX1RSQU5TX1BFUk1fTE9HX1JFUzsKKwl9CisKK3VuZG9fYmxvY2tzOgorCWlmIChibG9ja3MgPiAwKSB7CisJCSh2b2lkKSB4ZnNfbW9kX2luY29yZV9zYih0cC0+dF9tb3VudHAsIFhGU19TQlNfRkRCTE9DS1MsCisJCQkJCSBibG9ja3MsIHJzdmQpOworCQl0cC0+dF9ibGtfcmVzID0gMDsKKwl9CisKKyAgICAgICAgUEZMQUdTX1JFU1RPUkVfRlNUUkFOUygmdHAtPnRfcGZsYWdzKTsKKworCXJldHVybiAoZXJyb3IpOworfQorCisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byBzZXQgdGhlIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGdpdmVuCisgKiB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQgdG8gZGlzay4gIFRoZSB0cmFuc2FjdGlvbiBwb2ludGVyIGFuZCB0aGUKKyAqIGFyZ3VtZW50IHBvaW50ZXIgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIHJvdXRpbmUuCisgKgorICogT25seSBvbmUgY2FsbGJhY2sgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhbnkgc2luZ2xlIHRyYW5zYWN0aW9uLgorICovCit2b2lkCit4ZnNfdHJhbnNfY2FsbGJhY2soCisJeGZzX3RyYW5zX3QJCSp0cCwKKwl4ZnNfdHJhbnNfY2FsbGJhY2tfdAljYWxsYmFjaywKKwl2b2lkCQkJKmFyZykKK3sKKwlBU1NFUlQodHAtPnRfY2FsbGJhY2sgPT0gTlVMTCk7CisJdHAtPnRfY2FsbGJhY2sgPSBjYWxsYmFjazsKKwl0cC0+dF9jYWxsYXJnID0gYXJnOworfQorCisKKy8qCisgKiBSZWNvcmQgdGhlIGluZGljYXRlZCBjaGFuZ2UgdG8gdGhlIGdpdmVuIGZpZWxkIGZvciBhcHBsaWNhdGlvbgorICogdG8gdGhlIGZpbGUgc3lzdGVtJ3Mgc3VwZXJibG9jayB3aGVuIHRoZSB0cmFuc2FjdGlvbiBjb21taXRzLgorICogRm9yIG5vdywganVzdCBzdG9yZSB0aGUgY2hhbmdlIGluIHRoZSB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUuCisgKgorICogTWFyayB0aGUgdHJhbnNhY3Rpb24gc3RydWN0dXJlIHRvIGluZGljYXRlIHRoYXQgdGhlIHN1cGVyYmxvY2sKKyAqIG5lZWRzIHRvIGJlIHVwZGF0ZWQgYmVmb3JlIGNvbW1pdHRpbmcuCisgKi8KK3ZvaWQKK3hmc190cmFuc19tb2Rfc2IoCisJeGZzX3RyYW5zX3QJKnRwLAorCXVpbnQJCWZpZWxkLAorCWxvbmcJCWRlbHRhKQoreworCisJc3dpdGNoIChmaWVsZCkgeworCWNhc2UgWEZTX1RSQU5TX1NCX0lDT1VOVDoKKwkJdHAtPnRfaWNvdW50X2RlbHRhICs9IGRlbHRhOworCQlicmVhazsKKwljYXNlIFhGU19UUkFOU19TQl9JRlJFRToKKwkJdHAtPnRfaWZyZWVfZGVsdGEgKz0gZGVsdGE7CisJCWJyZWFrOworCWNhc2UgWEZTX1RSQU5TX1NCX0ZEQkxPQ0tTOgorCQkvKgorCQkgKiBUcmFjayB0aGUgbnVtYmVyIG9mIGJsb2NrcyBhbGxvY2F0ZWQgaW4gdGhlCisJCSAqIHRyYW5zYWN0aW9uLiAgTWFrZSBzdXJlIGl0IGRvZXMgbm90IGV4Y2VlZCB0aGUKKwkJICogbnVtYmVyIHJlc2VydmVkLgorCQkgKi8KKwkJaWYgKGRlbHRhIDwgMCkgeworCQkJdHAtPnRfYmxrX3Jlc191c2VkICs9ICh1aW50KS1kZWx0YTsKKwkJCUFTU0VSVCh0cC0+dF9ibGtfcmVzX3VzZWQgPD0gdHAtPnRfYmxrX3Jlcyk7CisJCX0KKwkJdHAtPnRfZmRibG9ja3NfZGVsdGEgKz0gZGVsdGE7CisJCWJyZWFrOworCWNhc2UgWEZTX1RSQU5TX1NCX1JFU19GREJMT0NLUzoKKwkJLyoKKwkJICogVGhlIGFsbG9jYXRpb24gaGFzIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZQorCQkgKiBpbi1jb3JlIHN1cGVyYmxvY2sncyBjb3VudGVyLiAgVGhpcyBzaG91bGQgb25seQorCQkgKiBiZSBhcHBsaWVkIHRvIHRoZSBvbi1kaXNrIHN1cGVyYmxvY2suCisJCSAqLworCQlBU1NFUlQoZGVsdGEgPCAwKTsKKwkJdHAtPnRfcmVzX2ZkYmxvY2tzX2RlbHRhICs9IGRlbHRhOworCQlicmVhazsKKwljYXNlIFhGU19UUkFOU19TQl9GUkVYVEVOVFM6CisJCS8qCisJCSAqIFRyYWNrIHRoZSBudW1iZXIgb2YgYmxvY2tzIGFsbG9jYXRlZCBpbiB0aGUKKwkJICogdHJhbnNhY3Rpb24uICBNYWtlIHN1cmUgaXQgZG9lcyBub3QgZXhjZWVkIHRoZQorCQkgKiBudW1iZXIgcmVzZXJ2ZWQuCisJCSAqLworCQlpZiAoZGVsdGEgPCAwKSB7CisJCQl0cC0+dF9ydHhfcmVzX3VzZWQgKz0gKHVpbnQpLWRlbHRhOworCQkJQVNTRVJUKHRwLT50X3J0eF9yZXNfdXNlZCA8PSB0cC0+dF9ydHhfcmVzKTsKKwkJfQorCQl0cC0+dF9mcmV4dGVudHNfZGVsdGEgKz0gZGVsdGE7CisJCWJyZWFrOworCWNhc2UgWEZTX1RSQU5TX1NCX1JFU19GUkVYVEVOVFM6CisJCS8qCisJCSAqIFRoZSBhbGxvY2F0aW9uIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUKKwkJICogaW4tY29yZSBzdXBlcmJsb2NrcydzIGNvdW50ZXIuICBUaGlzIHNob3VsZCBvbmx5CisJCSAqIGJlIGFwcGxpZWQgdG8gdGhlIG9uLWRpc2sgc3VwZXJibG9jay4KKwkJICovCisJCUFTU0VSVChkZWx0YSA8IDApOworCQl0cC0+dF9yZXNfZnJleHRlbnRzX2RlbHRhICs9IGRlbHRhOworCQlicmVhazsKKwljYXNlIFhGU19UUkFOU19TQl9EQkxPQ0tTOgorCQlBU1NFUlQoZGVsdGEgPiAwKTsKKwkJdHAtPnRfZGJsb2Nrc19kZWx0YSArPSBkZWx0YTsKKwkJYnJlYWs7CisJY2FzZSBYRlNfVFJBTlNfU0JfQUdDT1VOVDoKKwkJQVNTRVJUKGRlbHRhID4gMCk7CisJCXRwLT50X2FnY291bnRfZGVsdGEgKz0gZGVsdGE7CisJCWJyZWFrOworCWNhc2UgWEZTX1RSQU5TX1NCX0lNQVhQQ1Q6CisJCXRwLT50X2ltYXhwY3RfZGVsdGEgKz0gZGVsdGE7CisJCWJyZWFrOworCWNhc2UgWEZTX1RSQU5TX1NCX1JFWFRTSVpFOgorCQl0cC0+dF9yZXh0c2l6ZV9kZWx0YSArPSBkZWx0YTsKKwkJYnJlYWs7CisJY2FzZSBYRlNfVFJBTlNfU0JfUkJNQkxPQ0tTOgorCQl0cC0+dF9yYm1ibG9ja3NfZGVsdGEgKz0gZGVsdGE7CisJCWJyZWFrOworCWNhc2UgWEZTX1RSQU5TX1NCX1JCTE9DS1M6CisJCXRwLT50X3JibG9ja3NfZGVsdGEgKz0gZGVsdGE7CisJCWJyZWFrOworCWNhc2UgWEZTX1RSQU5TX1NCX1JFWFRFTlRTOgorCQl0cC0+dF9yZXh0ZW50c19kZWx0YSArPSBkZWx0YTsKKwkJYnJlYWs7CisJY2FzZSBYRlNfVFJBTlNfU0JfUkVYVFNMT0c6CisJCXRwLT50X3JleHRzbG9nX2RlbHRhICs9IGRlbHRhOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJCXJldHVybjsKKwl9CisKKwl0cC0+dF9mbGFncyB8PSAoWEZTX1RSQU5TX1NCX0RJUlRZIHwgWEZTX1RSQU5TX0RJUlRZKTsKK30KKworLyoKKyAqIHhmc190cmFuc19hcHBseV9zYl9kZWx0YXMoKSBpcyBjYWxsZWQgZnJvbSB0aGUgY29tbWl0IGNvZGUKKyAqIHRvIGJyaW5nIHRoZSBzdXBlcmJsb2NrIGJ1ZmZlciBpbnRvIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uCisgKiBhbmQgbW9kaWZ5IGl0IGFzIHJlcXVlc3RlZCBieSBlYXJsaWVyIGNhbGxzIHRvIHhmc190cmFuc19tb2Rfc2IoKS4KKyAqCisgKiBGb3Igbm93IHdlIGp1c3QgbG9vayBhdCBlYWNoIGZpZWxkIGFsbG93ZWQgdG8gY2hhbmdlIGFuZCBjaGFuZ2UKKyAqIGl0IGlmIG5lY2Vzc2FyeS4KKyAqLworU1RBVElDIHZvaWQKK3hmc190cmFuc19hcHBseV9zYl9kZWx0YXMoCisJeGZzX3RyYW5zX3QJKnRwKQoreworCXhmc19zYl90CSpzYnA7CisJeGZzX2J1Zl90CSpicDsKKwlpbnQJCXdob2xlID0gMDsKKworCWJwID0geGZzX3RyYW5zX2dldHNiKHRwLCB0cC0+dF9tb3VudHAsIDApOworCXNicCA9IFhGU19CVUZfVE9fU0JQKGJwKTsKKworCS8qCisJICogQ2hlY2sgdGhhdCBzdXBlcmJsb2NrIG1vZHMgbWF0Y2ggdGhlIG1vZHMgbWFkZSB0byBBR0YgY291bnRlcnMuCisJICovCisJQVNTRVJUKCh0cC0+dF9mZGJsb2Nrc19kZWx0YSArIHRwLT50X3Jlc19mZGJsb2Nrc19kZWx0YSkgPT0KKwkgICAgICAgKHRwLT50X2FnX2ZyZWVibGtzX2RlbHRhICsgdHAtPnRfYWdfZmxpc3RfZGVsdGEgKworCQl0cC0+dF9hZ19idHJlZV9kZWx0YSkpOworCisJaWYgKHRwLT50X2ljb3VudF9kZWx0YSAhPSAwKSB7CisJCUlOVF9NT0Qoc2JwLT5zYl9pY291bnQsIEFSQ0hfQ09OVkVSVCwgdHAtPnRfaWNvdW50X2RlbHRhKTsKKwl9CisJaWYgKHRwLT50X2lmcmVlX2RlbHRhICE9IDApIHsKKwkJSU5UX01PRChzYnAtPnNiX2lmcmVlLCBBUkNIX0NPTlZFUlQsIHRwLT50X2lmcmVlX2RlbHRhKTsKKwl9CisKKwlpZiAodHAtPnRfZmRibG9ja3NfZGVsdGEgIT0gMCkgeworCQlJTlRfTU9EKHNicC0+c2JfZmRibG9ja3MsIEFSQ0hfQ09OVkVSVCwgdHAtPnRfZmRibG9ja3NfZGVsdGEpOworCX0KKwlpZiAodHAtPnRfcmVzX2ZkYmxvY2tzX2RlbHRhICE9IDApIHsKKwkJSU5UX01PRChzYnAtPnNiX2ZkYmxvY2tzLCBBUkNIX0NPTlZFUlQsIHRwLT50X3Jlc19mZGJsb2Nrc19kZWx0YSk7CisJfQorCisJaWYgKHRwLT50X2ZyZXh0ZW50c19kZWx0YSAhPSAwKSB7CisJCUlOVF9NT0Qoc2JwLT5zYl9mcmV4dGVudHMsIEFSQ0hfQ09OVkVSVCwgdHAtPnRfZnJleHRlbnRzX2RlbHRhKTsKKwl9CisJaWYgKHRwLT50X3Jlc19mcmV4dGVudHNfZGVsdGEgIT0gMCkgeworCQlJTlRfTU9EKHNicC0+c2JfZnJleHRlbnRzLCBBUkNIX0NPTlZFUlQsIHRwLT50X3Jlc19mcmV4dGVudHNfZGVsdGEpOworCX0KKwlpZiAodHAtPnRfZGJsb2Nrc19kZWx0YSAhPSAwKSB7CisJCUlOVF9NT0Qoc2JwLT5zYl9kYmxvY2tzLCBBUkNIX0NPTlZFUlQsIHRwLT50X2RibG9ja3NfZGVsdGEpOworCQl3aG9sZSA9IDE7CisJfQorCWlmICh0cC0+dF9hZ2NvdW50X2RlbHRhICE9IDApIHsKKwkJSU5UX01PRChzYnAtPnNiX2FnY291bnQsIEFSQ0hfQ09OVkVSVCwgdHAtPnRfYWdjb3VudF9kZWx0YSk7CisJCXdob2xlID0gMTsKKwl9CisJaWYgKHRwLT50X2ltYXhwY3RfZGVsdGEgIT0gMCkgeworCQlJTlRfTU9EKHNicC0+c2JfaW1heF9wY3QsIEFSQ0hfQ09OVkVSVCwgdHAtPnRfaW1heHBjdF9kZWx0YSk7CisJCXdob2xlID0gMTsKKwl9CisJaWYgKHRwLT50X3JleHRzaXplX2RlbHRhICE9IDApIHsKKwkJSU5UX01PRChzYnAtPnNiX3JleHRzaXplLCBBUkNIX0NPTlZFUlQsIHRwLT50X3JleHRzaXplX2RlbHRhKTsKKwkJd2hvbGUgPSAxOworCX0KKwlpZiAodHAtPnRfcmJtYmxvY2tzX2RlbHRhICE9IDApIHsKKwkJSU5UX01PRChzYnAtPnNiX3JibWJsb2NrcywgQVJDSF9DT05WRVJULCB0cC0+dF9yYm1ibG9ja3NfZGVsdGEpOworCQl3aG9sZSA9IDE7CisJfQorCWlmICh0cC0+dF9yYmxvY2tzX2RlbHRhICE9IDApIHsKKwkJSU5UX01PRChzYnAtPnNiX3JibG9ja3MsIEFSQ0hfQ09OVkVSVCwgdHAtPnRfcmJsb2Nrc19kZWx0YSk7CisJCXdob2xlID0gMTsKKwl9CisJaWYgKHRwLT50X3JleHRlbnRzX2RlbHRhICE9IDApIHsKKwkJSU5UX01PRChzYnAtPnNiX3JleHRlbnRzLCBBUkNIX0NPTlZFUlQsIHRwLT50X3JleHRlbnRzX2RlbHRhKTsKKwkJd2hvbGUgPSAxOworCX0KKwlpZiAodHAtPnRfcmV4dHNsb2dfZGVsdGEgIT0gMCkgeworCQlJTlRfTU9EKHNicC0+c2JfcmV4dHNsb2csIEFSQ0hfQ09OVkVSVCwgdHAtPnRfcmV4dHNsb2dfZGVsdGEpOworCQl3aG9sZSA9IDE7CisJfQorCisJaWYgKHdob2xlKQorCQkvKgorCQkgKiBMb2cgdGhlIHdob2xlIHRoaW5nLCB0aGUgZmllbGRzIGFyZSBkaXNjb250aWd1b3VzLgorCQkgKi8KKwkJeGZzX3RyYW5zX2xvZ19idWYodHAsIGJwLCAwLCBzaXplb2YoeGZzX3NiX3QpIC0gMSk7CisJZWxzZQorCQkvKgorCQkgKiBTaW5jZSBhbGwgdGhlIG1vZGlmaWFibGUgZmllbGRzIGFyZSBjb250aWd1b3VzLCB3ZQorCQkgKiBjYW4gZ2V0IGF3YXkgd2l0aCB0aGlzLgorCQkgKi8KKwkJeGZzX3RyYW5zX2xvZ19idWYodHAsIGJwLCBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfaWNvdW50KSwKKwkJCQkgIG9mZnNldG9mKHhmc19zYl90LCBzYl9mcmV4dGVudHMpICsKKwkJCQkgIHNpemVvZihzYnAtPnNiX2ZyZXh0ZW50cykgLSAxKTsKKworCVhGU19NVE9WRlModHAtPnRfbW91bnRwKS0+dmZzX3N1cGVyLT5zX2RpcnQgPSAxOworfQorCisvKgorICogeGZzX3RyYW5zX3VucmVzZXJ2ZV9hbmRfbW9kX3NiKCkgaXMgY2FsbGVkIHRvIHJlbGVhc2UgdW51c2VkCisgKiByZXNlcnZhdGlvbnMgYW5kIGFwcGx5IHN1cGVyYmxvY2sgY291bnRlciBjaGFuZ2VzIHRvIHRoZSBpbi1jb3JlCisgKiBzdXBlcmJsb2NrLgorICoKKyAqIFRoaXMgaXMgZG9uZSBlZmZpY2llbnRseSB3aXRoIGEgc2luZ2xlIGNhbGwgdG8geGZzX21vZF9pbmNvcmVfc2JfYmF0Y2goKS4KKyAqLwordm9pZAoreGZzX3RyYW5zX3VucmVzZXJ2ZV9hbmRfbW9kX3NiKAorCXhmc190cmFuc190CSp0cCkKK3sKKwl4ZnNfbW9kX3NiX3QJbXNiWzE0XTsJLyogSWYgeW91IGFkZCBjYXNlcywgYWRkIGVudHJpZXMgKi8KKwl4ZnNfbW9kX3NiX3QJKm1zYnA7CisJLyogUkVGRVJFTkNFRCAqLworCWludAkJZXJyb3I7CisJaW50CQlyc3ZkOworCisJbXNicCA9IG1zYjsKKwlyc3ZkID0gKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX1JFU0VSVkUpICE9IDA7CisKKwkvKgorCSAqIFJlbGVhc2UgYW55IHJlc2VydmVkIGJsb2Nrcy4gIEFueSB0aGF0IHdlcmUgYWxsb2NhdGVkCisJICogd2lsbCBiZSB0YWtlbiBiYWNrIGFnYWluIGJ5IGZkYmxvY2tzX2RlbHRhIGJlbG93LgorCSAqLworCWlmICh0cC0+dF9ibGtfcmVzID4gMCkgeworCQltc2JwLT5tc2JfZmllbGQgPSBYRlNfU0JTX0ZEQkxPQ0tTOworCQltc2JwLT5tc2JfZGVsdGEgPSB0cC0+dF9ibGtfcmVzOworCQltc2JwKys7CisJfQorCisJLyoKKwkgKiBSZWxlYXNlIGFueSByZXNlcnZlZCByZWFsIHRpbWUgZXh0ZW50cyAuICBBbnkgdGhhdCB3ZXJlCisJICogYWxsb2NhdGVkIHdpbGwgYmUgdGFrZW4gYmFjayBhZ2FpbiBieSBmcmV4dGVudHNfZGVsdGEgYmVsb3cuCisJICovCisJaWYgKHRwLT50X3J0eF9yZXMgPiAwKSB7CisJCW1zYnAtPm1zYl9maWVsZCA9IFhGU19TQlNfRlJFWFRFTlRTOworCQltc2JwLT5tc2JfZGVsdGEgPSB0cC0+dF9ydHhfcmVzOworCQltc2JwKys7CisJfQorCisJLyoKKwkgKiBBcHBseSBhbnkgc3VwZXJibG9jayBtb2RpZmljYXRpb25zIHRvIHRoZSBpbi1jb3JlIHZlcnNpb24uCisJICogVGhlIHRfcmVzX2ZkYmxvY2tzX2RlbHRhIGFuZCB0X3Jlc19mcmV4dGVudHNfZGVsdGEgZmllbGRzIGFyZQorCSAqIGV4cGxpY2l0eSBOT1QgYXBwbGllZCB0byB0aGUgaW4tY29yZSBzdXBlcmJsb2NrLgorCSAqIFRoZSBpZGVhIGlzIHRoYXQgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUuCisJICovCisJaWYgKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX1NCX0RJUlRZKSB7CisJCWlmICh0cC0+dF9pY291bnRfZGVsdGEgIT0gMCkgeworCQkJbXNicC0+bXNiX2ZpZWxkID0gWEZTX1NCU19JQ09VTlQ7CisJCQltc2JwLT5tc2JfZGVsdGEgPSAoaW50KXRwLT50X2ljb3VudF9kZWx0YTsKKwkJCW1zYnArKzsKKwkJfQorCQlpZiAodHAtPnRfaWZyZWVfZGVsdGEgIT0gMCkgeworCQkJbXNicC0+bXNiX2ZpZWxkID0gWEZTX1NCU19JRlJFRTsKKwkJCW1zYnAtPm1zYl9kZWx0YSA9IChpbnQpdHAtPnRfaWZyZWVfZGVsdGE7CisJCQltc2JwKys7CisJCX0KKwkJaWYgKHRwLT50X2ZkYmxvY2tzX2RlbHRhICE9IDApIHsKKwkJCW1zYnAtPm1zYl9maWVsZCA9IFhGU19TQlNfRkRCTE9DS1M7CisJCQltc2JwLT5tc2JfZGVsdGEgPSAoaW50KXRwLT50X2ZkYmxvY2tzX2RlbHRhOworCQkJbXNicCsrOworCQl9CisJCWlmICh0cC0+dF9mcmV4dGVudHNfZGVsdGEgIT0gMCkgeworCQkJbXNicC0+bXNiX2ZpZWxkID0gWEZTX1NCU19GUkVYVEVOVFM7CisJCQltc2JwLT5tc2JfZGVsdGEgPSAoaW50KXRwLT50X2ZyZXh0ZW50c19kZWx0YTsKKwkJCW1zYnArKzsKKwkJfQorCQlpZiAodHAtPnRfZGJsb2Nrc19kZWx0YSAhPSAwKSB7CisJCQltc2JwLT5tc2JfZmllbGQgPSBYRlNfU0JTX0RCTE9DS1M7CisJCQltc2JwLT5tc2JfZGVsdGEgPSAoaW50KXRwLT50X2RibG9ja3NfZGVsdGE7CisJCQltc2JwKys7CisJCX0KKwkJaWYgKHRwLT50X2FnY291bnRfZGVsdGEgIT0gMCkgeworCQkJbXNicC0+bXNiX2ZpZWxkID0gWEZTX1NCU19BR0NPVU5UOworCQkJbXNicC0+bXNiX2RlbHRhID0gKGludCl0cC0+dF9hZ2NvdW50X2RlbHRhOworCQkJbXNicCsrOworCQl9CisJCWlmICh0cC0+dF9pbWF4cGN0X2RlbHRhICE9IDApIHsKKwkJCW1zYnAtPm1zYl9maWVsZCA9IFhGU19TQlNfSU1BWF9QQ1Q7CisJCQltc2JwLT5tc2JfZGVsdGEgPSAoaW50KXRwLT50X2ltYXhwY3RfZGVsdGE7CisJCQltc2JwKys7CisJCX0KKwkJaWYgKHRwLT50X3JleHRzaXplX2RlbHRhICE9IDApIHsKKwkJCW1zYnAtPm1zYl9maWVsZCA9IFhGU19TQlNfUkVYVFNJWkU7CisJCQltc2JwLT5tc2JfZGVsdGEgPSAoaW50KXRwLT50X3JleHRzaXplX2RlbHRhOworCQkJbXNicCsrOworCQl9CisJCWlmICh0cC0+dF9yYm1ibG9ja3NfZGVsdGEgIT0gMCkgeworCQkJbXNicC0+bXNiX2ZpZWxkID0gWEZTX1NCU19SQk1CTE9DS1M7CisJCQltc2JwLT5tc2JfZGVsdGEgPSAoaW50KXRwLT50X3JibWJsb2Nrc19kZWx0YTsKKwkJCW1zYnArKzsKKwkJfQorCQlpZiAodHAtPnRfcmJsb2Nrc19kZWx0YSAhPSAwKSB7CisJCQltc2JwLT5tc2JfZmllbGQgPSBYRlNfU0JTX1JCTE9DS1M7CisJCQltc2JwLT5tc2JfZGVsdGEgPSAoaW50KXRwLT50X3JibG9ja3NfZGVsdGE7CisJCQltc2JwKys7CisJCX0KKwkJaWYgKHRwLT50X3JleHRlbnRzX2RlbHRhICE9IDApIHsKKwkJCW1zYnAtPm1zYl9maWVsZCA9IFhGU19TQlNfUkVYVEVOVFM7CisJCQltc2JwLT5tc2JfZGVsdGEgPSAoaW50KXRwLT50X3JleHRlbnRzX2RlbHRhOworCQkJbXNicCsrOworCQl9CisJCWlmICh0cC0+dF9yZXh0c2xvZ19kZWx0YSAhPSAwKSB7CisJCQltc2JwLT5tc2JfZmllbGQgPSBYRlNfU0JTX1JFWFRTTE9HOworCQkJbXNicC0+bXNiX2RlbHRhID0gKGludCl0cC0+dF9yZXh0c2xvZ19kZWx0YTsKKwkJCW1zYnArKzsKKwkJfQorCX0KKworCS8qCisJICogSWYgd2UgbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcsIGRvIGl0LgorCSAqLworCWlmIChtc2JwID4gbXNiKSB7CisJCWVycm9yID0geGZzX21vZF9pbmNvcmVfc2JfYmF0Y2godHAtPnRfbW91bnRwLCBtc2IsCisJCQkodWludCkobXNicCAtIG1zYiksIHJzdmQpOworCQlBU1NFUlQoZXJyb3IgPT0gMCk7CisJfQorfQorCisKKy8qCisgKiB4ZnNfdHJhbnNfY29tbWl0CisgKgorICogQ29tbWl0IHRoZSBnaXZlbiB0cmFuc2FjdGlvbiB0byB0aGUgbG9nIGEvc3luY2hyb25vdXNseS4KKyAqCisgKiBYRlMgZGlzayBlcnJvciBoYW5kbGluZyBtZWNoYW5pc20gaXMgbm90IGJhc2VkIG9uIGEgdHlwaWNhbAorICogdHJhbnNhY3Rpb24gYWJvcnQgbWVjaGFuaXNtLiBMb2dpY2FsbHkgYWZ0ZXIgdGhlIGZpbGVzeXN0ZW0KKyAqIGdldHMgbWFya2VkICdTSFVURE9XTicsIHdlIGNhbid0IGxldCBhbnkgbmV3IHRyYW5zYWN0aW9ucworICogYmUgZHVyYWJsZSAtIGllLiBjb21taXR0ZWQgdG8gZGlzayAtIGJlY2F1c2Ugc29tZSBtZXRhZGF0YSBtaWdodAorICogYmUgaW5jb25zaXN0ZW50LiBJbiBzdWNoIGNhc2VzLCB0aGlzIHJldHVybnMgYW4gZXJyb3IsIGFuZCB0aGUKKyAqIGNhbGxlciBtYXkgYXNzdW1lIHRoYXQgYWxsIGxvY2tlZCBvYmplY3RzIGpvaW5lZCB0byB0aGUgdHJhbnNhY3Rpb24KKyAqIGhhdmUgYWxyZWFkeSBiZWVuIHVubG9ja2VkIGFzIGlmIHRoZSBjb21taXQgaGFkIHN1Y2NlZWRlZC4KKyAqIERvIG5vdCByZWZlcmVuY2UgdGhlIHRyYW5zYWN0aW9uIHN0cnVjdHVyZSBhZnRlciB0aGlzIGNhbGwuCisgKi8KKyAvKkFSR1NVU0VEKi8KK2ludAoreGZzX3RyYW5zX2NvbW1pdCgKKwl4ZnNfdHJhbnNfdAkqdHAsCisJdWludAkJZmxhZ3MsCisJeGZzX2xzbl90CSpjb21taXRfbHNuX3ApCit7CisJeGZzX2xvZ19pb3ZlY190CQkqbG9nX3ZlY3RvcjsKKwlpbnQJCQludmVjOworCXhmc19tb3VudF90CQkqbXA7CisJeGZzX2xzbl90CQljb21taXRfbHNuOworCS8qIFJFRkVSRU5DRUQgKi8KKwlpbnQJCQllcnJvcjsKKwlpbnQJCQlsb2dfZmxhZ3M7CisJaW50CQkJc3luYzsKKyNkZWZpbmUJWEZTX1RSQU5TX0xPR1ZFQ19DT1VOVAkxNgorCXhmc19sb2dfaW92ZWNfdAkJbG9nX3ZlY3Rvcl9mYXN0W1hGU19UUkFOU19MT0dWRUNfQ09VTlRdOworI2lmIGRlZmluZWQoWExPR19OT0xPRykgfHwgZGVmaW5lZChERUJVRykKKwlzdGF0aWMgeGZzX2xzbl90CXRyYW5zX2xzbiA9IDE7CisjZW5kaWYKKwl2b2lkCQkJKmNvbW1pdF9pY2xvZzsKKwlpbnQJCQlzaHV0ZG93bjsKKworCWNvbW1pdF9sc24gPSAtMTsKKworCS8qCisJICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjb21taXQgaXMgcmVsZWFzaW5nIGEgcGVybWFuZW50CisJICogbG9nIHJlc2VydmF0aW9uIG9yIG5vdC4KKwkgKi8KKwlpZiAoZmxhZ3MgJiBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTKSB7CisJCUFTU0VSVCh0cC0+dF9mbGFncyAmIFhGU19UUkFOU19QRVJNX0xPR19SRVMpOworCQlsb2dfZmxhZ3MgPSBYRlNfTE9HX1JFTF9QRVJNX1JFU0VSVjsKKwl9IGVsc2UgeworCQlsb2dfZmxhZ3MgPSAwOworCX0KKwltcCA9IHRwLT50X21vdW50cDsKKworCS8qCisJICogSWYgdGhlcmUgaXMgbm90aGluZyB0byBiZSBsb2dnZWQgYnkgdGhlIHRyYW5zYWN0aW9uLAorCSAqIHRoZW4gdW5sb2NrIGFsbCBvZiB0aGUgaXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZQorCSAqIHRyYW5zYWN0aW9uIGFuZCBmcmVlIHRoZSB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUuCisJICogQWxzbyBtYWtlIHN1cmUgdG8gcmV0dXJuIGFueSByZXNlcnZlZCBibG9ja3MgdG8KKwkgKiB0aGUgZnJlZSBwb29sLgorCSAqLworc2h1dF91c19kb3duOgorCXNodXRkb3duID0gWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkgPyBFSU8gOiAwOworCWlmICghKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX0RJUlRZKSB8fCBzaHV0ZG93bikgeworCQl4ZnNfdHJhbnNfdW5yZXNlcnZlX2FuZF9tb2Rfc2IodHApOworCQkvKgorCQkgKiBJdCBpcyBpbmRlZWQgcG9zc2libGUgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBiZQorCQkgKiBub3QgZGlydHkgYnV0IHRoZSBkcWluZm8gcG9ydGlvbiB0byBiZS4gQWxsIHRoYXQKKwkJICogbWVhbnMgaXMgdGhhdCB3ZSBoYXZlIHNvbWUgKG5vbi1wZXJzaXN0ZW50KSBxdW90YQorCQkgKiByZXNlcnZhdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHVucmVzZXJ2ZWQuCisJCSAqLworCQlYRlNfVFJBTlNfVU5SRVNFUlZFX0FORF9NT0RfRFFVT1RTKG1wLCB0cCk7CisJCWlmICh0cC0+dF90aWNrZXQpIHsKKwkJCWNvbW1pdF9sc24gPSB4ZnNfbG9nX2RvbmUobXAsIHRwLT50X3RpY2tldCwKKwkJCQkJCQlOVUxMLCBsb2dfZmxhZ3MpOworCQkJaWYgKGNvbW1pdF9sc24gPT0gLTEgJiYgIXNodXRkb3duKQorCQkJCXNodXRkb3duID0gWEZTX0VSUk9SKEVJTyk7CisJCX0KKyAgICAgICAgICAgICAgICBQRkxBR1NfUkVTVE9SRV9GU1RSQU5TKCZ0cC0+dF9wZmxhZ3MpOworCQl4ZnNfdHJhbnNfZnJlZV9pdGVtcyh0cCwgc2h1dGRvd24/IFhGU19UUkFOU19BQk9SVCA6IDApOworCQl4ZnNfdHJhbnNfZnJlZV9idXN5KHRwKTsKKwkJeGZzX3RyYW5zX2ZyZWUodHApOworCQlYRlNfU1RBVFNfSU5DKHhzX3RyYW5zX2VtcHR5KTsKKwkJaWYgKGNvbW1pdF9sc25fcCkKKwkJCSpjb21taXRfbHNuX3AgPSBjb21taXRfbHNuOworCQlyZXR1cm4gKHNodXRkb3duKTsKKwl9CisjaWYgZGVmaW5lZChYTE9HX05PTE9HKSB8fCBkZWZpbmVkKERFQlVHKQorCUFTU0VSVCgheGxvZ19kZWJ1ZyB8fCB0cC0+dF90aWNrZXQgIT0gTlVMTCk7CisjZWxzZQorCUFTU0VSVCh0cC0+dF90aWNrZXQgIT0gTlVMTCk7CisjZW5kaWYKKworCS8qCisJICogSWYgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHN1cGVyYmxvY2ssIHRoZW4gZG8gaXQgbm93LgorCSAqLworCWlmICh0cC0+dF9mbGFncyAmIFhGU19UUkFOU19TQl9ESVJUWSkgeworCQl4ZnNfdHJhbnNfYXBwbHlfc2JfZGVsdGFzKHRwKTsKKwl9CisJWEZTX1RSQU5TX0FQUExZX0RRVU9UX0RFTFRBUyhtcCwgdHApOworCisJLyoKKwkgKiBBc2sgZWFjaCBsb2cgaXRlbSBob3cgbWFueSBsb2dfdmVjdG9yIGVudHJpZXMgaXQgd2lsbAorCSAqIG5lZWQgc28gd2UgY2FuIGZpZ3VyZSBvdXQgaG93IG1hbnkgdG8gYWxsb2NhdGUuCisJICogVHJ5IHRvIGF2b2lkIHRoZSBrbWVtX2FsbG9jKCkgY2FsbCBpbiB0aGUgY29tbW9uIGNhc2UKKwkgKiBieSB1c2luZyBhIHZlY3RvciBmcm9tIHRoZSBzdGFjayB3aGVuIGl0IGZpdHMuCisJICovCisJbnZlYyA9IHhmc190cmFuc19jb3VudF92ZWNzKHRwKTsKKworCWlmIChudmVjID09IDApIHsKKwkJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBYRlNfTE9HX0lPX0VSUk9SKTsKKwkJZ290byBzaHV0X3VzX2Rvd247CisJfQorCisKKwlpZiAobnZlYyA8PSBYRlNfVFJBTlNfTE9HVkVDX0NPVU5UKSB7CisJCWxvZ192ZWN0b3IgPSBsb2dfdmVjdG9yX2Zhc3Q7CisJfSBlbHNlIHsKKwkJbG9nX3ZlY3RvciA9ICh4ZnNfbG9nX2lvdmVjX3QgKilrbWVtX2FsbG9jKG52ZWMgKgorCQkJCQkJICAgc2l6ZW9mKHhmc19sb2dfaW92ZWNfdCksCisJCQkJCQkgICBLTV9TTEVFUCk7CisJfQorCisJLyoKKwkgKiBGaWxsIGluIHRoZSBsb2dfdmVjdG9yIGFuZCBwaW4gdGhlIGxvZ2dlZCBpdGVtcywgYW5kCisJICogdGhlbiB3cml0ZSB0aGUgdHJhbnNhY3Rpb24gdG8gdGhlIGxvZy4KKwkgKi8KKwl4ZnNfdHJhbnNfZmlsbF92ZWNzKHRwLCBsb2dfdmVjdG9yKTsKKworCS8qCisJICogSWdub3JlIGVycm9ycyBoZXJlLiB4ZnNfbG9nX2RvbmUgd291bGQgZG8gdGhlIHJpZ2h0IHRoaW5nLgorCSAqIFdlIG5lZWQgdG8gcHV0IHRoZSB0aWNrZXQsIGV0Yy4gYXdheS4KKwkgKi8KKwllcnJvciA9IHhmc19sb2dfd3JpdGUobXAsIGxvZ192ZWN0b3IsIG52ZWMsIHRwLT50X3RpY2tldCwKKwkJCSAgICAgJih0cC0+dF9sc24pKTsKKworI2lmIGRlZmluZWQoWExPR19OT0xPRykgfHwgZGVmaW5lZChERUJVRykKKwlpZiAoeGxvZ19kZWJ1ZykgeworCQljb21taXRfbHNuID0geGZzX2xvZ19kb25lKG1wLCB0cC0+dF90aWNrZXQsCisJCQkJCSAgJmNvbW1pdF9pY2xvZywgbG9nX2ZsYWdzKTsKKwl9IGVsc2UgeworCQljb21taXRfbHNuID0gMDsKKwkJdHAtPnRfbHNuID0gdHJhbnNfbHNuKys7CisJfQorI2Vsc2UKKwkvKgorCSAqIFRoaXMgaXMgdGhlIHJlZ3VsYXIgY2FzZS4gIEF0IHRoaXMgcG9pbnQgKGFmdGVyIHRoZSBjYWxsIGZpbmlzaGVzKSwKKwkgKiB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkIGluY29yZSBhbmQgY291bGQgZ28gb3V0IHRvIGRpc2sgYXQKKwkgKiBhbnkgdGltZS4gIEhvd2V2ZXIsIGFsbCB0aGUgaXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbgorCSAqIGFyZSBzdGlsbCBsb2NrZWQgYW5kIHBpbm5lZCBpbiBtZW1vcnkuCisJICovCisJY29tbWl0X2xzbiA9IHhmc19sb2dfZG9uZShtcCwgdHAtPnRfdGlja2V0LCAmY29tbWl0X2ljbG9nLCBsb2dfZmxhZ3MpOworI2VuZGlmCisKKwl0cC0+dF9jb21taXRfbHNuID0gY29tbWl0X2xzbjsKKwlpZiAobnZlYyA+IFhGU19UUkFOU19MT0dWRUNfQ09VTlQpIHsKKwkJa21lbV9mcmVlKGxvZ192ZWN0b3IsIG52ZWMgKiBzaXplb2YoeGZzX2xvZ19pb3ZlY190KSk7CisJfQorCisJaWYgKGNvbW1pdF9sc25fcCkKKwkJKmNvbW1pdF9sc25fcCA9IGNvbW1pdF9sc247CisKKwkvKgorCSAqIElmIHdlIGdvdCBhIGxvZyB3cml0ZSBlcnJvci4gVW5waW4gdGhlIGxvZ2l0ZW1zIHRoYXQgd2UKKwkgKiBoYWQgcGlubmVkLCBjbGVhbiB1cCwgZnJlZSB0cmFucyBzdHJ1Y3R1cmUsIGFuZCByZXR1cm4gZXJyb3IuCisJICovCisJaWYgKGVycm9yIHx8IGNvbW1pdF9sc24gPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQRkxBR1NfUkVTVE9SRV9GU1RSQU5TKCZ0cC0+dF9wZmxhZ3MpOworCQl4ZnNfdHJhbnNfdW5jb21taXQodHAsIGZsYWdzfFhGU19UUkFOU19BQk9SVCk7CisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwl9CisKKwkvKgorCSAqIE9uY2UgdGhlIHRyYW5zYWN0aW9uIGhhcyBjb21taXR0ZWQsIHVudXNlZAorCSAqIHJlc2VydmF0aW9ucyBuZWVkIHRvIGJlIHJlbGVhc2VkIGFuZCBjaGFuZ2VzIHRvCisJICogdGhlIHN1cGVyYmxvY2sgbmVlZCB0byBiZSByZWZsZWN0ZWQgaW4gdGhlIGluLWNvcmUKKwkgKiB2ZXJzaW9uLiAgRG8gdGhhdCBub3cuCisJICovCisJeGZzX3RyYW5zX3VucmVzZXJ2ZV9hbmRfbW9kX3NiKHRwKTsKKworCXN5bmMgPSB0cC0+dF9mbGFncyAmIFhGU19UUkFOU19TWU5DOworCisJLyoKKwkgKiBUZWxsIHRoZSBMTSB0byBjYWxsIHRoZSB0cmFuc2FjdGlvbiBjb21wbGV0aW9uIHJvdXRpbmUKKwkgKiB3aGVuIHRoZSBsb2cgd3JpdGUgd2l0aCBMU04gY29tbWl0X2xzbiBjb21wbGV0ZXMgKGUuZy4KKwkgKiB3aGVuIHRoZSB0cmFuc2FjdGlvbiBjb21taXQgcmVhbGx5IGhpdHMgdGhlIG9uLWRpc2sgbG9nKS4KKwkgKiBBZnRlciB0aGlzIGNhbGwgd2UgY2Fubm90IHJlZmVyZW5jZSB0cCwgYmVjYXVzZSB0aGUgY2FsbAorCSAqIGNhbiBoYXBwZW4gYXQgYW55IHRpbWUgYW5kIHRoZSBjYWxsIHdpbGwgZnJlZSB0aGUgdHJhbnNhY3Rpb24KKwkgKiBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSB0cC4gIFRoZSBvbmx5IGNhc2Ugd2hlcmUgd2UgY2FsbAorCSAqIHRoZSBjb21wbGV0aW9uIHJvdXRpbmUgKHhmc190cmFuc19jb21taXR0ZWQpIGRpcmVjdGx5IGlzCisJICogaWYgdGhlIGxvZyBpcyB0dXJuZWQgb2ZmIG9uIGEgZGVidWcga2VybmVsIG9yIHdlJ3JlCisJICogcnVubmluZyBpbiBzaW11bGF0aW9uIG1vZGUgKHRoZSBsb2cgaXMgZXhwbGljaXRseSB0dXJuZWQKKwkgKiBvZmYpLgorCSAqLworCXRwLT50X2xvZ2NiLmNiX2Z1bmMgPSAodm9pZCgqKSh2b2lkKiwgaW50KSl4ZnNfdHJhbnNfY29tbWl0dGVkOworCXRwLT50X2xvZ2NiLmNiX2FyZyA9IHRwOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIHBhc3MgdGhlIGljbG9nIGJ1ZmZlciB3aGljaCB3YXMgdXNlZCBmb3IgdGhlCisJICogdHJhbnNhY3Rpb24gY29tbWl0IHJlY29yZCBpbnRvIHRoaXMgZnVuY3Rpb24sIGFuZCBhdHRhY2gKKwkgKiB0aGUgY2FsbGJhY2sgdG8gaXQuIFRoZSBjYWxsYmFjayBtdXN0IGJlIGF0dGFjaGVkIGJlZm9yZQorCSAqIHRoZSBpdGVtcyBhcmUgdW5sb2NrZWQgdG8gYXZvaWQgcmFjaW5nIHdpdGggb3RoZXIgdGhyZWFkcworCSAqIHdhaXRpbmcgZm9yIGFuIGl0ZW0gdG8gdW5sb2NrLgorCSAqLworCXNodXRkb3duID0geGZzX2xvZ19ub3RpZnkobXAsIGNvbW1pdF9pY2xvZywgJih0cC0+dF9sb2djYikpOworCisJLyoKKwkgKiBNYXJrIHRoaXMgdGhyZWFkIGFzIG5vIGxvbmdlciBiZWluZyBpbiBhIHRyYW5zYWN0aW9uCisJICovCisJUEZMQUdTX1JFU1RPUkVfRlNUUkFOUygmdHAtPnRfcGZsYWdzKTsKKworCS8qCisJICogT25jZSBhbGwgdGhlIGl0ZW1zIG9mIHRoZSB0cmFuc2FjdGlvbiBoYXZlIGJlZW4gY29waWVkCisJICogdG8gdGhlIGluIGNvcmUgbG9nIGFuZCB0aGUgY2FsbGJhY2sgaXMgYXR0YWNoZWQsIHRoZQorCSAqIGl0ZW1zIGNhbiBiZSB1bmxvY2tlZC4KKwkgKgorCSAqIFRoaXMgd2lsbCBmcmVlIGRlc2NyaXB0b3JzIHBvaW50aW5nIHRvIGl0ZW1zIHdoaWNoIHdlcmUKKwkgKiBub3QgbG9nZ2VkIHNpbmNlIHRoZXJlIGlzIG5vdGhpbmcgbW9yZSB0byBkbyB3aXRoIHRoZW0uCisJICogRm9yIGl0ZW1zIHdoaWNoIHdlcmUgbG9nZ2VkLCB3ZSB3aWxsIGtlZXAgcG9pbnRlcnMgdG8gdGhlbQorCSAqIHNvIHRoZXkgY2FuIGJlIHVucGlubmVkIGFmdGVyIHRoZSB0cmFuc2FjdGlvbiBjb21taXRzIHRvIGRpc2suCisJICogVGhpcyB3aWxsIGFsc28gc3RhbXAgZWFjaCBtb2RpZmllZCBtZXRhLWRhdGEgaXRlbSB3aXRoCisJICogdGhlIGNvbW1pdCBsc24gb2YgdGhpcyB0cmFuc2FjdGlvbiBmb3IgZGVwZW5kZW5jeSB0cmFja2luZworCSAqIHB1cnBvc2VzLgorCSAqLworCXhmc190cmFuc191bmxvY2tfaXRlbXModHAsIGNvbW1pdF9sc24pOworCisJLyoKKwkgKiBJZiB3ZSBkZXRlY3RlZCBhIGxvZyBlcnJvciBlYXJsaWVyLCBmaW5pc2ggY29tbWl0dGluZworCSAqIHRoZSB0cmFuc2FjdGlvbiBub3cgKHVucGluIGxvZyBpdGVtcywgZXRjKS4KKwkgKgorCSAqIE9yZGVyIGlzIGNyaXRpY2FsIGhlcmUsIHRvIGF2b2lkIHVzaW5nIHRoZSB0cmFuc2FjdGlvbgorCSAqIHBvaW50ZXIgYWZ0ZXIgaXRzIGJlZW4gZnJlZWQgKGJ5IHhmc190cmFuc19jb21taXR0ZWQKKwkgKiBlaXRoZXIgaGVyZSBub3csIG9yIGFzIGEgY2FsbGJhY2spLiAgV2UgY2Fubm90IGRvIHRoaXMKKwkgKiBzdGVwIGluc2lkZSB4ZnNfbG9nX25vdGlmeSBhcyB3YXMgZG9uZSBlYXJsaWVyIGJlY2F1c2UKKwkgKiBvZiB0aGlzIGlzc3VlLgorCSAqLworCWlmIChzaHV0ZG93bikKKwkJeGZzX3RyYW5zX2NvbW1pdHRlZCh0cCwgWEZTX0xJX0FCT1JURUQpOworCisJLyoKKwkgKiBOb3cgdGhhdCB0aGUgeGZzX3RyYW5zX2NvbW1pdHRlZCBjYWxsYmFjayBoYXMgYmVlbiBhdHRhY2hlZCwKKwkgKiBhbmQgdGhlIGl0ZW1zIGFyZSByZWxlYXNlZCB3ZSBjYW4gZmluYWxseSBhbGxvdyB0aGUgaWNsb2cgdG8KKwkgKiBnbyB0byBkaXNrLgorCSAqLworCWVycm9yID0geGZzX2xvZ19yZWxlYXNlX2ljbG9nKG1wLCBjb21taXRfaWNsb2cpOworCisJLyoKKwkgKiBJZiB0aGUgdHJhbnNhY3Rpb24gbmVlZHMgdG8gYmUgc3luY2hyb25vdXMsIHRoZW4gZm9yY2UgdGhlCisJICogbG9nIG91dCBub3cgYW5kIHdhaXQgZm9yIGl0LgorCSAqLworCWlmIChzeW5jKSB7CisJCWlmICghZXJyb3IpCisJCQllcnJvciA9IHhmc19sb2dfZm9yY2UobXAsIGNvbW1pdF9sc24sCisJCQkJICAgICAgWEZTX0xPR19GT1JDRSB8IFhGU19MT0dfU1lOQyk7CisJCVhGU19TVEFUU19JTkMoeHNfdHJhbnNfc3luYyk7CisJfSBlbHNlIHsKKwkJWEZTX1NUQVRTX0lOQyh4c190cmFuc19hc3luYyk7CisJfQorCisJcmV0dXJuIChlcnJvcik7Cit9CisKKworLyoKKyAqIFRvdGFsIHVwIHRoZSBudW1iZXIgb2YgbG9nIGlvdmVjcyBuZWVkZWQgdG8gY29tbWl0IHRoaXMKKyAqIHRyYW5zYWN0aW9uLiAgVGhlIHRyYW5zYWN0aW9uIGl0c2VsZiBuZWVkcyBvbmUgZm9yIHRoZQorICogdHJhbnNhY3Rpb24gaGVhZGVyLiAgQXNrIGVhY2ggZGlydHkgaXRlbSBpbiB0dXJuIGhvdyBtYW55CisgKiBpdCBuZWVkcyB0byBnZXQgdGhlIHRvdGFsLgorICovCitTVEFUSUMgdWludAoreGZzX3RyYW5zX2NvdW50X3ZlY3MoCisJeGZzX3RyYW5zX3QJKnRwKQoreworCWludAkJCW52ZWNzOworCXhmc19sb2dfaXRlbV9kZXNjX3QJKmxpZHA7CisKKwludmVjcyA9IDE7CisJbGlkcCA9IHhmc190cmFuc19maXJzdF9pdGVtKHRwKTsKKwlBU1NFUlQobGlkcCAhPSBOVUxMKTsKKworCS8qIEluIHRoZSBub24tZGVidWcgY2FzZSB3ZSBuZWVkIHRvIHN0YXJ0IGJhaWxpbmcgb3V0IGlmIHdlCisJICogZGlkbid0IGZpbmQgYSBsb2dfaXRlbSBoZXJlLCByZXR1cm4gemVybyBhbmQgbGV0IHRyYW5zX2NvbW1pdAorCSAqIGRlYWwgd2l0aCBpdC4KKwkgKi8KKwlpZiAobGlkcCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXdoaWxlIChsaWRwICE9IE5VTEwpIHsKKwkJLyoKKwkJICogU2tpcCBpdGVtcyB3aGljaCBhcmVuJ3QgZGlydHkgaW4gdGhpcyB0cmFuc2FjdGlvbi4KKwkJICovCisJCWlmICghKGxpZHAtPmxpZF9mbGFncyAmIFhGU19MSURfRElSVFkpKSB7CisJCQlsaWRwID0geGZzX3RyYW5zX25leHRfaXRlbSh0cCwgbGlkcCk7CisJCQljb250aW51ZTsKKwkJfQorCQlsaWRwLT5saWRfc2l6ZSA9IElPUF9TSVpFKGxpZHAtPmxpZF9pdGVtKTsKKwkJbnZlY3MgKz0gbGlkcC0+bGlkX3NpemU7CisJCWxpZHAgPSB4ZnNfdHJhbnNfbmV4dF9pdGVtKHRwLCBsaWRwKTsKKwl9CisKKwlyZXR1cm4gbnZlY3M7Cit9CisKKy8qCisgKiBDYWxsZWQgZnJvbSB0aGUgdHJhbnNfY29tbWl0IGNvZGUgd2hlbiB3ZSBub3RpY2UgdGhhdAorICogdGhlIGZpbGVzeXN0ZW0gaXMgaW4gdGhlIG1pZGRsZSBvZiBhIGZvcmNlZCBzaHV0ZG93bi4KKyAqLworU1RBVElDIHZvaWQKK3hmc190cmFuc191bmNvbW1pdCgKKwl4ZnNfdHJhbnNfdAkqdHAsCisJdWludAkJZmxhZ3MpCit7CisJeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKKworCWZvciAobGlkcCA9IHhmc190cmFuc19maXJzdF9pdGVtKHRwKTsKKwkgICAgIGxpZHAgIT0gTlVMTDsKKwkgICAgIGxpZHAgPSB4ZnNfdHJhbnNfbmV4dF9pdGVtKHRwLCBsaWRwKSkgeworCQkvKgorCQkgKiBVbnBpbiBhbGwgYnV0IHRob3NlIHRoYXQgYXJlbid0IGRpcnR5LgorCQkgKi8KKwkJaWYgKGxpZHAtPmxpZF9mbGFncyAmIFhGU19MSURfRElSVFkpCisJCQlJT1BfVU5QSU5fUkVNT1ZFKGxpZHAtPmxpZF9pdGVtLCB0cCk7CisJfQorCisJeGZzX3RyYW5zX3VucmVzZXJ2ZV9hbmRfbW9kX3NiKHRwKTsKKwlYRlNfVFJBTlNfVU5SRVNFUlZFX0FORF9NT0RfRFFVT1RTKHRwLT50X21vdW50cCwgdHApOworCisJeGZzX3RyYW5zX2ZyZWVfaXRlbXModHAsIGZsYWdzKTsKKwl4ZnNfdHJhbnNfZnJlZV9idXN5KHRwKTsKKwl4ZnNfdHJhbnNfZnJlZSh0cCk7Cit9CisKKy8qCisgKiBGaWxsIGluIHRoZSB2ZWN0b3Igd2l0aCBwb2ludGVycyB0byBkYXRhIHRvIGJlIGxvZ2dlZAorICogYnkgdGhpcyB0cmFuc2FjdGlvbi4gIFRoZSB0cmFuc2FjdGlvbiBoZWFkZXIgdGFrZXMKKyAqIHRoZSBmaXJzdCB2ZWN0b3IsIGFuZCB0aGVuIGVhY2ggZGlydHkgaXRlbSB0YWtlcyB0aGUKKyAqIG51bWJlciBvZiB2ZWN0b3JzIGl0IGluZGljYXRlZCBpdCBuZWVkZWQgaW4geGZzX3RyYW5zX2NvdW50X3ZlY3MoKS4KKyAqCisgKiBBcyBlYWNoIGl0ZW0gZmlsbHMgaW4gdGhlIGVudHJpZXMgaXQgbmVlZHMsIGFsc28gcGluIHRoZSBpdGVtCisgKiBzbyB0aGF0IGl0IGNhbm5vdCBiZSBmbHVzaGVkIG91dCB1bnRpbCB0aGUgbG9nIHdyaXRlIGNvbXBsZXRlcy4KKyAqLworU1RBVElDIHZvaWQKK3hmc190cmFuc19maWxsX3ZlY3MoCisJeGZzX3RyYW5zX3QJCSp0cCwKKwl4ZnNfbG9nX2lvdmVjX3QJCSpsb2dfdmVjdG9yKQoreworCXhmc19sb2dfaXRlbV9kZXNjX3QJKmxpZHA7CisJeGZzX2xvZ19pb3ZlY190CQkqdmVjcDsKKwl1aW50CQkJbml0ZW1zOworCisJLyoKKwkgKiBTa2lwIG92ZXIgdGhlIGVudHJ5IGZvciB0aGUgdHJhbnNhY3Rpb24gaGVhZGVyLCB3ZSdsbAorCSAqIGZpbGwgdGhhdCBpbiBhdCB0aGUgZW5kLgorCSAqLworCXZlY3AgPSBsb2dfdmVjdG9yICsgMTsJCS8qIHBvaW50ZXIgYXJpdGhtZXRpYyAqLworCisJbml0ZW1zID0gMDsKKwlsaWRwID0geGZzX3RyYW5zX2ZpcnN0X2l0ZW0odHApOworCUFTU0VSVChsaWRwICE9IE5VTEwpOworCXdoaWxlIChsaWRwICE9IE5VTEwpIHsKKwkJLyoKKwkJICogU2tpcCBpdGVtcyB3aGljaCBhcmVuJ3QgZGlydHkgaW4gdGhpcyB0cmFuc2FjdGlvbi4KKwkJICovCisJCWlmICghKGxpZHAtPmxpZF9mbGFncyAmIFhGU19MSURfRElSVFkpKSB7CisJCQlsaWRwID0geGZzX3RyYW5zX25leHRfaXRlbSh0cCwgbGlkcCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBUaGUgaXRlbSBtYXkgYmUgbWFya2VkIGRpcnR5IGJ1dCBub3QgbG9nIGFueXRoaW5nLgorCQkgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGdldCBjYWxsZWQgd2hlbiBhIHRyYW5zYWN0aW9uCisJCSAqIGlzIGNvbW1pdHRlZC4KKwkJICovCisJCWlmIChsaWRwLT5saWRfc2l6ZSkgeworCQkJbml0ZW1zKys7CisJCX0KKwkJSU9QX0ZPUk1BVChsaWRwLT5saWRfaXRlbSwgdmVjcCk7CisJCXZlY3AgKz0gbGlkcC0+bGlkX3NpemU7CQkvKiBwb2ludGVyIGFyaXRobWV0aWMgKi8KKwkJSU9QX1BJTihsaWRwLT5saWRfaXRlbSk7CisJCWxpZHAgPSB4ZnNfdHJhbnNfbmV4dF9pdGVtKHRwLCBsaWRwKTsKKwl9CisKKwkvKgorCSAqIE5vdyB0aGF0IHdlJ3ZlIGNvdW50ZWQgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGlzCisJICogdHJhbnNhY3Rpb24sIGZpbGwgaW4gdGhlIHRyYW5zYWN0aW9uIGhlYWRlci4KKwkgKi8KKwl0cC0+dF9oZWFkZXIudGhfbWFnaWMgPSBYRlNfVFJBTlNfSEVBREVSX01BR0lDOworCXRwLT50X2hlYWRlci50aF90eXBlID0gdHAtPnRfdHlwZTsKKwl0cC0+dF9oZWFkZXIudGhfbnVtX2l0ZW1zID0gbml0ZW1zOworCWxvZ192ZWN0b3ItPmlfYWRkciA9ICh4ZnNfY2FkZHJfdCkmdHAtPnRfaGVhZGVyOworCWxvZ192ZWN0b3ItPmlfbGVuID0gc2l6ZW9mKHhmc190cmFuc19oZWFkZXJfdCk7Cit9CisKKworLyoKKyAqIFVubG9jayBhbGwgb2YgdGhlIHRyYW5zYWN0aW9uJ3MgaXRlbXMgYW5kIGZyZWUgdGhlIHRyYW5zYWN0aW9uLgorICogVGhlIHRyYW5zYWN0aW9uIG11c3Qgbm90IGhhdmUgbW9kaWZpZWQgYW55IG9mIGl0cyBpdGVtcywgYmVjYXVzZQorICogdGhlcmUgaXMgbm8gd2F5IHRvIHJlc3RvcmUgdGhlbSB0byB0aGVpciBwcmV2aW91cyBzdGF0ZS4KKyAqCisgKiBJZiB0aGUgdHJhbnNhY3Rpb24gaGFzIG1hZGUgYSBsb2cgcmVzZXJ2YXRpb24sIG1ha2Ugc3VyZSB0byByZWxlYXNlCisgKiBpdCBhcyB3ZWxsLgorICovCit2b2lkCit4ZnNfdHJhbnNfY2FuY2VsKAorCXhmc190cmFuc190CQkqdHAsCisJaW50CQkJZmxhZ3MpCit7CisJaW50CQkJbG9nX2ZsYWdzOworI2lmZGVmIERFQlVHCisJeGZzX2xvZ19pdGVtX2NodW5rX3QJKmxpY3A7CisJeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKKwl4ZnNfbG9nX2l0ZW1fdAkJKmxpcDsKKwlpbnQJCQlpOworI2VuZGlmCisKKwkvKgorCSAqIFNlZSBpZiB0aGUgY2FsbGVyIGlzIGJlaW5nIHRvbyBsYXp5IHRvIGZpZ3VyZSBvdXQgaWYKKwkgKiB0aGUgdHJhbnNhY3Rpb24gcmVhbGx5IG5lZWRzIGFuIGFib3J0LgorCSAqLworCWlmICgoZmxhZ3MgJiBYRlNfVFJBTlNfQUJPUlQpICYmICEodHAtPnRfZmxhZ3MgJiBYRlNfVFJBTlNfRElSVFkpKQorCQlmbGFncyAmPSB+WEZTX1RSQU5TX0FCT1JUOworCS8qCisJICogU2VlIGlmIHRoZSBjYWxsZXIgaXMgcmVseWluZyBvbiB1cyB0byBzaHV0IGRvd24gdGhlCisJICogZmlsZXN5c3RlbS4gIFRoaXMgaGFwcGVucyBpbiBwYXRocyB3aGVyZSB3ZSBkZXRlY3QKKwkgKiBjb3JydXB0aW9uIGFuZCBkZWNpZGUgdG8gZ2l2ZSB1cC4KKwkgKi8KKwlpZiAoKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX0RJUlRZKSAmJgorCSAgICAhWEZTX0ZPUkNFRF9TSFVURE9XTih0cC0+dF9tb3VudHApKQorCQl4ZnNfZm9yY2Vfc2h1dGRvd24odHAtPnRfbW91bnRwLCBYRlNfQ09SUlVQVF9JTkNPUkUpOworI2lmZGVmIERFQlVHCisJaWYgKCEoZmxhZ3MgJiBYRlNfVFJBTlNfQUJPUlQpKSB7CisJCWxpY3AgPSAmKHRwLT50X2l0ZW1zKTsKKwkJd2hpbGUgKGxpY3AgIT0gTlVMTCkgeworCQkJbGlkcCA9IGxpY3AtPmxpY19kZXNjczsKKwkJCWZvciAoaSA9IDA7IGkgPCBsaWNwLT5saWNfdW51c2VkOyBpKyssIGxpZHArKykgeworCQkJCWlmIChYRlNfTElDX0lTRlJFRShsaWNwLCBpKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlsaXAgPSBsaWRwLT5saWRfaXRlbTsKKwkJCQlpZiAoIVhGU19GT1JDRURfU0hVVERPV04odHAtPnRfbW91bnRwKSkKKwkJCQkJQVNTRVJUKCEobGlwLT5saV90eXBlID09IFhGU19MSV9FRkQpKTsKKwkJCX0KKwkJCWxpY3AgPSBsaWNwLT5saWNfbmV4dDsKKwkJfQorCX0KKyNlbmRpZgorCXhmc190cmFuc191bnJlc2VydmVfYW5kX21vZF9zYih0cCk7CisJWEZTX1RSQU5TX1VOUkVTRVJWRV9BTkRfTU9EX0RRVU9UUyh0cC0+dF9tb3VudHAsIHRwKTsKKworCWlmICh0cC0+dF90aWNrZXQpIHsKKwkJaWYgKGZsYWdzICYgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUykgeworCQkJQVNTRVJUKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUyk7CisJCQlsb2dfZmxhZ3MgPSBYRlNfTE9HX1JFTF9QRVJNX1JFU0VSVjsKKwkJfSBlbHNlIHsKKwkJCWxvZ19mbGFncyA9IDA7CisJCX0KKwkJeGZzX2xvZ19kb25lKHRwLT50X21vdW50cCwgdHAtPnRfdGlja2V0LCBOVUxMLCBsb2dfZmxhZ3MpOworCX0KKworCS8qIG1hcmsgdGhpcyB0aHJlYWQgYXMgbm8gbG9uZ2VyIGJlaW5nIGluIGEgdHJhbnNhY3Rpb24gKi8KKyAgICAgICAgUEZMQUdTX1JFU1RPUkVfRlNUUkFOUygmdHAtPnRfcGZsYWdzKTsKKworCXhmc190cmFuc19mcmVlX2l0ZW1zKHRwLCBmbGFncyk7CisJeGZzX3RyYW5zX2ZyZWVfYnVzeSh0cCk7CisJeGZzX3RyYW5zX2ZyZWUodHApOworfQorCisKKy8qCisgKiBGcmVlIHRoZSB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUuICBJZiB0aGVyZSBpcyBtb3JlIGNsZWFuIHVwCisgKiB0byBkbyB3aGVuIHRoZSBzdHJ1Y3R1cmUgaXMgZnJlZWQsIGFkZCBpdCBoZXJlLgorICovCitTVEFUSUMgdm9pZAoreGZzX3RyYW5zX2ZyZWUoCisJeGZzX3RyYW5zX3QJKnRwKQoreworCWF0b21pY19kZWMoJnRwLT50X21vdW50cC0+bV9hY3RpdmVfdHJhbnMpOworCVhGU19UUkFOU19GUkVFX0RRSU5GTyh0cC0+dF9tb3VudHAsIHRwKTsKKwlrbWVtX3pvbmVfZnJlZSh4ZnNfdHJhbnNfem9uZSwgdHApOworfQorCisKKy8qCisgKiBUSElTIFNIT1VMRCBCRSBSRVdSSVRURU4gVE8gVVNFIHhmc190cmFuc19uZXh0X2l0ZW0oKS4KKyAqCisgKiBUaGlzIGlzIHR5cGljYWxseSBjYWxsZWQgYnkgdGhlIExNIHdoZW4gYSB0cmFuc2FjdGlvbiBoYXMgYmVlbiBmdWxseQorICogY29tbWl0dGVkIHRvIGRpc2suICBJdCBuZWVkcyB0byB1bnBpbiB0aGUgaXRlbXMgd2hpY2ggaGF2ZQorICogYmVlbiBsb2dnZWQgYnkgdGhlIHRyYW5zYWN0aW9uIGFuZCB1cGRhdGUgdGhlaXIgcG9zaXRpb25zCisgKiBpbiB0aGUgQUlMIGlmIG5lY2Vzc2FyeS4KKyAqIFRoaXMgYWxzbyBnZXRzIGNhbGxlZCB3aGVuIHRoZSB0cmFuc2FjdGlvbnMgZGlkbid0IGdldCB3cml0dGVuIG91dAorICogYmVjYXVzZSBvZiBhbiBJL08gZXJyb3IuIEFib3J0ZmxhZyAmIFhGU19MSV9BQk9SVEVEIGlzIHNldCB0aGVuLgorICoKKyAqIENhbGwgeGZzX3RyYW5zX2NodW5rX2NvbW1pdHRlZCgpIHRvIHByb2Nlc3MgdGhlIGl0ZW1zIGluCisgKiBlYWNoIGNodW5rLgorICovCitTVEFUSUMgdm9pZAoreGZzX3RyYW5zX2NvbW1pdHRlZCgKKwl4ZnNfdHJhbnNfdAkqdHAsCisJaW50CQlhYm9ydGZsYWcpCit7CisJeGZzX2xvZ19pdGVtX2NodW5rX3QJKmxpY3A7CisJeGZzX2xvZ19pdGVtX2NodW5rX3QJKm5leHRfbGljcDsKKwl4ZnNfbG9nX2J1c3lfY2h1bmtfdAkqbGJjcDsKKwl4ZnNfbG9nX2J1c3lfc2xvdF90CSpsYnNwOworCWludAkJCWk7CisKKwkvKgorCSAqIENhbGwgdGhlIHRyYW5zYWN0aW9uJ3MgY29tcGxldGlvbiBjYWxsYmFjayBpZiB0aGVyZQorCSAqIGlzIG9uZS4KKwkgKi8KKwlpZiAodHAtPnRfY2FsbGJhY2sgIT0gTlVMTCkgeworCQl0cC0+dF9jYWxsYmFjayh0cCwgdHAtPnRfY2FsbGFyZyk7CisJfQorCisJLyoKKwkgKiBTcGVjaWFsIGNhc2UgdGhlIGNodW5rIGVtYmVkZGVkIGluIHRoZSB0cmFuc2FjdGlvbi4KKwkgKi8KKwlsaWNwID0gJih0cC0+dF9pdGVtcyk7CisJaWYgKCEoWEZTX0xJQ19BUkVfQUxMX0ZSRUUobGljcCkpKSB7CisJCXhmc190cmFuc19jaHVua19jb21taXR0ZWQobGljcCwgdHAtPnRfbHNuLCBhYm9ydGZsYWcpOworCX0KKworCS8qCisJICogUHJvY2VzcyB0aGUgaXRlbXMgaW4gZWFjaCBjaHVuayBpbiB0dXJuLgorCSAqLworCWxpY3AgPSBsaWNwLT5saWNfbmV4dDsKKwl3aGlsZSAobGljcCAhPSBOVUxMKSB7CisJCUFTU0VSVCghWEZTX0xJQ19BUkVfQUxMX0ZSRUUobGljcCkpOworCQl4ZnNfdHJhbnNfY2h1bmtfY29tbWl0dGVkKGxpY3AsIHRwLT50X2xzbiwgYWJvcnRmbGFnKTsKKwkJbmV4dF9saWNwID0gbGljcC0+bGljX25leHQ7CisJCWttZW1fZnJlZShsaWNwLCBzaXplb2YoeGZzX2xvZ19pdGVtX2NodW5rX3QpKTsKKwkJbGljcCA9IG5leHRfbGljcDsKKwl9CisKKwkvKgorCSAqIENsZWFyIGFsbCB0aGUgcGVyLUFHIGJ1c3kgbGlzdCBpdGVtcyBsaXN0ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbgorCSAqLworCWxiY3AgPSAmdHAtPnRfYnVzeTsKKwl3aGlsZSAobGJjcCAhPSBOVUxMKSB7CisJCWZvciAoaSA9IDAsIGxic3AgPSBsYmNwLT5sYmNfYnVzeTsgaSA8IGxiY3AtPmxiY191bnVzZWQ7IGkrKywgbGJzcCsrKSB7CisJCQlpZiAoIVhGU19MQkNfSVNGUkVFKGxiY3AsIGkpKSB7CisJCQkJeGZzX2FsbG9jX2NsZWFyX2J1c3kodHAsIGxic3AtPmxiY19hZywKKwkJCQkJCSAgICAgbGJzcC0+bGJjX2lkeCk7CisJCQl9CisJCX0KKwkJbGJjcCA9IGxiY3AtPmxiY19uZXh0OworCX0KKwl4ZnNfdHJhbnNfZnJlZV9idXN5KHRwKTsKKworCS8qCisJICogVGhhdCdzIGl0IGZvciB0aGUgdHJhbnNhY3Rpb24gc3RydWN0dXJlLiAgRnJlZSBpdC4KKwkgKi8KKwl4ZnNfdHJhbnNfZnJlZSh0cCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byBwZXJmb3JtIHRoZSBjb21taXQgcHJvY2Vzc2luZyBmb3IgZWFjaAorICogaXRlbSBkZXNjcmliZWQgYnkgdGhlIGdpdmVuIGNodW5rLgorICoKKyAqIFRoZSBjb21taXQgcHJvY2Vzc2luZyBjb25zaXN0cyBvZiB1bmxvY2tpbmcgaXRlbXMgd2hpY2ggd2VyZQorICogaGVsZCBsb2NrZWQgd2l0aCB0aGUgU1lOQ19VTkxPQ0sgYXR0cmlidXRlLCBjYWxsaW5nIHRoZSBjb21taXR0ZWQKKyAqIHJvdXRpbmUgb2YgZWFjaCBsb2dnZWQgaXRlbSwgdXBkYXRpbmcgdGhlIGl0ZW0ncyBwb3NpdGlvbiBpbiB0aGUgQUlMCisgKiBpZiBuZWNlc3NhcnksIGFuZCB1bnBpbm5pbmcgZWFjaCBpdGVtLiAgSWYgdGhlIGNvbW1pdHRlZCByb3V0aW5lCisgKiByZXR1cm5zIC0xLCB0aGVuIGRvIG5vdGhpbmcgZnVydGhlciB3aXRoIHRoZSBpdGVtIGJlY2F1c2UgaXQKKyAqIG1heSBoYXZlIGJlZW4gZnJlZWQuCisgKgorICogU2luY2UgaXRlbXMgYXJlIHVubG9ja2VkIHdoZW4gdGhleSBhcmUgY29waWVkIHRvIHRoZSBpbmNvcmUKKyAqIGxvZywgaXQgaXMgcG9zc2libGUgZm9yIHR3byB0cmFuc2FjdGlvbnMgdG8gYmUgY29tcGxldGluZworICogYW5kIG1hbmlwdWxhdGluZyB0aGUgc2FtZSBpdGVtIHNpbXVsdGFuZW91c2x5LiAgVGhlIEFJTCBsb2NrCisgKiB3aWxsIHByb3RlY3QgdGhlIGxzbiBmaWVsZCBvZiBlYWNoIGl0ZW0uICBUaGUgdmFsdWUgb2YgdGhpcworICogZmllbGQgY2FuIG5ldmVyIGdvIGJhY2t3YXJkcy4KKyAqCisgKiBXZSB1bnBpbiB0aGUgaXRlbXMgYWZ0ZXIgcmVwb3NpdGlvbmluZyB0aGVtIGluIHRoZSBBSUwsIGJlY2F1c2UKKyAqIG90aGVyd2lzZSB0aGV5IGNvdWxkIGJlIGltbWVkaWF0ZWx5IGZsdXNoZWQgYW5kIHdlJ2QgaGF2ZSB0byByYWNlCisgKiB3aXRoIHRoZSBmbHVzaGVyIHRyeWluZyB0byBwdWxsIHRoZSBpdGVtIGZyb20gdGhlIEFJTCBhcyB3ZSBhZGQgaXQuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfdHJhbnNfY2h1bmtfY29tbWl0dGVkKAorCXhmc19sb2dfaXRlbV9jaHVua190CSpsaWNwLAorCXhmc19sc25fdAkJbHNuLAorCWludAkJCWFib3J0ZWQpCit7CisJeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKKwl4ZnNfbG9nX2l0ZW1fdAkJKmxpcDsKKwl4ZnNfbHNuX3QJCWl0ZW1fbHNuOworCXN0cnVjdCB4ZnNfbW91bnQJKm1wOworCWludAkJCWk7CisJU1BMREVDTChzKTsKKworCWxpZHAgPSBsaWNwLT5saWNfZGVzY3M7CisJZm9yIChpID0gMDsgaSA8IGxpY3AtPmxpY191bnVzZWQ7IGkrKywgbGlkcCsrKSB7CisJCWlmIChYRlNfTElDX0lTRlJFRShsaWNwLCBpKSkgeworCQkJY29udGludWU7CisJCX0KKworCQlsaXAgPSBsaWRwLT5saWRfaXRlbTsKKwkJaWYgKGFib3J0ZWQpCisJCQlsaXAtPmxpX2ZsYWdzIHw9IFhGU19MSV9BQk9SVEVEOworCisJCS8qCisJCSAqIFNlbmQgaW4gdGhlIEFCT1JURUQgZmxhZyB0byB0aGUgQ09NTUlUVEVEIHJvdXRpbmUKKwkJICogc28gdGhhdCBpdCBrbm93cyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgYWJvcnRlZAorCQkgKiBvciBub3QuCisJCSAqLworCQlpdGVtX2xzbiA9IElPUF9DT01NSVRURUQobGlwLCBsc24pOworCisJCS8qCisJCSAqIElmIHRoZSBjb21taXR0ZWQgcm91dGluZSByZXR1cm5zIC0xLCBtYWtlCisJCSAqIG5vIG1vcmUgcmVmZXJlbmNlcyB0byB0aGUgaXRlbS4KKwkJICovCisJCWlmIChYRlNfTFNOX0NNUChpdGVtX2xzbiwgKHhmc19sc25fdCktMSkgPT0gMCkgeworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGUgcmV0dXJuZWQgbHNuIGlzIGdyZWF0ZXIgdGhhbiB3aGF0IGl0CisJCSAqIGNvbnRhaW5lZCBiZWZvcmUsIHVwZGF0ZSB0aGUgbG9jYXRpb24gb2YgdGhlCisJCSAqIGl0ZW0gaW4gdGhlIEFJTC4gIElmIGl0IGlzIG5vdCwgdGhlbiBkbyBub3RoaW5nLgorCQkgKiBJdGVtcyBjYW4gbmV2ZXIgbW92ZSBiYWNrd2FyZHMgaW4gdGhlIEFJTC4KKwkJICoKKwkJICogV2hpbGUgdGhlIG5ldyBsc24gc2hvdWxkIHVzdWFsbHkgYmUgZ3JlYXRlciwgaXQKKwkJICogaXMgcG9zc2libGUgdGhhdCBhIGxhdGVyIHRyYW5zYWN0aW9uIGNvbXBsZXRpbmcKKwkJICogc2ltdWx0YW5lb3VzbHkgd2l0aCBhbiBlYXJsaWVyIG9uZSB1c2luZyB0aGUKKwkJICogc2FtZSBpdGVtIGNvdWxkIGNvbXBsZXRlIGZpcnN0IHdpdGggYSBoaWdoZXIgbHNuLgorCQkgKiBUaGlzIHdvdWxkIGNhdXNlIHRoZSBlYXJsaWVyIHRyYW5zYWN0aW9uIHRvIGZhaWwKKwkJICogdGhlIHRlc3QgYmVsb3cuCisJCSAqLworCQltcCA9IGxpcC0+bGlfbW91bnRwOworCQlBSUxfTE9DSyhtcCxzKTsKKwkJaWYgKFhGU19MU05fQ01QKGl0ZW1fbHNuLCBsaXAtPmxpX2xzbikgPiAwKSB7CisJCQkvKgorCQkJICogVGhpcyB3aWxsIHNldCB0aGUgaXRlbSdzIGxzbiB0byBpdGVtX2xzbgorCQkJICogYW5kIHVwZGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gaW4KKwkJCSAqIHRoZSBBSUwuCisJCQkgKgorCQkJICogeGZzX3RyYW5zX3VwZGF0ZV9haWwoKSBkcm9wcyB0aGUgQUlMIGxvY2suCisJCQkgKi8KKwkJCXhmc190cmFuc191cGRhdGVfYWlsKG1wLCBsaXAsIGl0ZW1fbHNuLCBzKTsKKwkJfSBlbHNlIHsKKwkJCUFJTF9VTkxPQ0sobXAsIHMpOworCQl9CisKKwkJLyoKKwkJICogTm93IHRoYXQgd2UndmUgcmVwb3NpdGlvbmVkIHRoZSBpdGVtIGluIHRoZSBBSUwsCisJCSAqIHVucGluIGl0IHNvIGl0IGNhbiBiZSBmbHVzaGVkLiBQYXNzIGluZm9ybWF0aW9uCisJCSAqIGFib3V0IGJ1ZmZlciBzdGFsZSBzdGF0ZSBkb3duIGZyb20gdGhlIGxvZyBpdGVtCisJCSAqIGZsYWdzLCBpZiBhbnlvbmUgZWxzZSBzdGFsZXMgdGhlIGJ1ZmZlciB3ZSBkbyBub3QKKwkJICogd2FudCB0byBwYXkgYW55IGF0dGVudGlvbiB0byBpdC4KKwkJICovCisJCUlPUF9VTlBJTihsaXAsIGxpZHAtPmxpZF9mbGFncyAmIFhGU19MSURfQlVGX1NUQUxFKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zLmggYi9mcy94ZnMveGZzX3RyYW5zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzN2NjYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnMuaApAQCAtMCwwICsxLDEwNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmCV9fWEZTX1RSQU5TX0hfXworI2RlZmluZQlfX1hGU19UUkFOU19IX18KKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB3cml0dGVuIGluIHRoZSBsb2cgYXQgdGhlIGhlYWQgb2YKKyAqIGV2ZXJ5IHRyYW5zYWN0aW9uLiBJdCBpZGVudGlmaWVzIHRoZSB0eXBlIGFuZCBpZCBvZiB0aGUKKyAqIHRyYW5zYWN0aW9uLCBhbmQgY29udGFpbnMgdGhlIG51bWJlciBvZiBpdGVtcyBsb2dnZWQgYnkKKyAqIHRoZSB0cmFuc2FjdGlvbiBzbyB3ZSBrbm93IGhvdyBtYW55IHRvIGV4cGVjdCBkdXJpbmcgcmVjb3ZlcnkuCisgKgorICogRG8gbm90IGNoYW5nZSB0aGUgYmVsb3cgc3RydWN0dXJlIHdpdGhvdXQgcmVkb2luZyB0aGUgY29kZSBpbgorICogeGxvZ19yZWNvdmVyX2FkZF90b190cmFucygpIGFuZCB4bG9nX3JlY292ZXJfYWRkX3RvX2NvbnRfdHJhbnMoKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX3RyYW5zX2hlYWRlciB7CisJdWludAkJdGhfbWFnaWM7CQkvKiBtYWdpYyBudW1iZXIgKi8KKwl1aW50CQl0aF90eXBlOwkJLyogdHJhbnNhY3Rpb24gdHlwZSAqLworCV9faW50MzJfdAl0aF90aWQ7CQkJLyogdHJhbnNhY3Rpb24gaWQgKHVudXNlZCkgKi8KKwl1aW50CQl0aF9udW1faXRlbXM7CQkvKiBudW0gaXRlbXMgbG9nZ2VkIGJ5IHRyYW5zICovCit9IHhmc190cmFuc19oZWFkZXJfdDsKKworI2RlZmluZQlYRlNfVFJBTlNfSEVBREVSX01BR0lDCTB4NTQ1MjQxNGUJLyogVFJBTiAqLworCisvKgorICogTG9nIGl0ZW0gdHlwZXMuCisgKi8KKyNkZWZpbmUJWEZTX0xJXzVfM19CVUYJCTB4MTIzNAkvKiB2MSBidWZzLCAxLWJsb2NrIGlub2RlIGJ1ZmZlcnMgKi8KKyNkZWZpbmUJWEZTX0xJXzVfM19JTk9ERQkweDEyMzUJLyogMS1ibG9jayBpbm9kZSBidWZmZXJzICovCisjZGVmaW5lCVhGU19MSV9FRkkJCTB4MTIzNgorI2RlZmluZQlYRlNfTElfRUZECQkweDEyMzcKKyNkZWZpbmUJWEZTX0xJX0lVTkxJTksJCTB4MTIzOAorI2RlZmluZQlYRlNfTElfNl8xX0lOT0RFCTB4MTIzOQkvKiA0SyBub24tYWxpZ25lZCBpbm9kZSBidWZzICovCisjZGVmaW5lCVhGU19MSV82XzFfQlVGCQkweDEyM2EJLyogdjEsIDRLIGlub2RlIGJ1ZmZlcnMgKi8KKyNkZWZpbmUJWEZTX0xJX0lOT0RFCQkweDEyM2IJLyogYWxpZ25lZCBpbm8gY2h1bmtzLCB2YXItc2l6ZSBpYnVmcyAqLworI2RlZmluZQlYRlNfTElfQlVGCQkweDEyM2MJLyogdjIgYnVmcywgdmFyaWFibGUgc2l6ZWQgaW5vZGUgYnVmcyAqLworI2RlZmluZQlYRlNfTElfRFFVT1QJCTB4MTIzZAorI2RlZmluZQlYRlNfTElfUVVPVEFPRkYJCTB4MTIzZQorCisvKgorICogVHJhbnNhY3Rpb24gdHlwZXMuICBVc2VkIHRvIGRpc3Rpbmd1aXNoIHR5cGVzIG9mIGJ1ZmZlcnMuCisgKi8KKyNkZWZpbmUgWEZTX1RSQU5TX1NFVEFUVFJfTk9UX1NJWkUJMQorI2RlZmluZSBYRlNfVFJBTlNfU0VUQVRUUl9TSVpFCQkyCisjZGVmaW5lIFhGU19UUkFOU19JTkFDVElWRQkJMworI2RlZmluZSBYRlNfVFJBTlNfQ1JFQVRFCQk0CisjZGVmaW5lIFhGU19UUkFOU19DUkVBVEVfVFJVTkMJCTUKKyNkZWZpbmUgWEZTX1RSQU5TX1RSVU5DQVRFX0ZJTEUJCTYKKyNkZWZpbmUgWEZTX1RSQU5TX1JFTU9WRQkJNworI2RlZmluZSBYRlNfVFJBTlNfTElOSwkJCTgKKyNkZWZpbmUgWEZTX1RSQU5TX1JFTkFNRQkJOQorI2RlZmluZSBYRlNfVFJBTlNfTUtESVIJCQkxMAorI2RlZmluZSBYRlNfVFJBTlNfUk1ESVIJCQkxMQorI2RlZmluZSBYRlNfVFJBTlNfU1lNTElOSwkJMTIKKyNkZWZpbmUgWEZTX1RSQU5TX1NFVF9ETUFUVFJTCQkxMworI2RlZmluZSBYRlNfVFJBTlNfR1JPV0ZTCQkxNAorI2RlZmluZSBYRlNfVFJBTlNfU1RSQVRfV1JJVEUJCTE1CisjZGVmaW5lIFhGU19UUkFOU19ESU9TVFJBVAkJMTYKKyNkZWZpbmUJWEZTX1RSQU5TX1dSSVRFX1NZTkMJCTE3CisjZGVmaW5lCVhGU19UUkFOU19XUklURUlECQkxOAorI2RlZmluZQlYRlNfVFJBTlNfQUREQUZPUksJCTE5CisjZGVmaW5lCVhGU19UUkFOU19BVFRSSU5WQUwJCTIwCisjZGVmaW5lCVhGU19UUkFOU19BVFJVTkNBVEUJCTIxCisjZGVmaW5lCVhGU19UUkFOU19BVFRSX1NFVAkJMjIKKyNkZWZpbmUJWEZTX1RSQU5TX0FUVFJfUk0JCTIzCisjZGVmaW5lCVhGU19UUkFOU19BVFRSX0ZMQUcJCTI0CisjZGVmaW5lCVhGU19UUkFOU19DTEVBUl9BR0lfQlVDS0VUCTI1CisjZGVmaW5lIFhGU19UUkFOU19RTV9TQkNIQU5HRQkJMjYKKy8qCisgKiBEdW1teSBlbnRyaWVzIHNpbmNlIHdlIHVzZSB0aGUgdHJhbnNhY3Rpb24gdHlwZSB0byBpbmRleCBpbnRvIHRoZQorICogdHJhbnNfdHlwZVtdIGluIHhsb2dfcmVjb3Zlcl9wcmludF90cmFuc19oZWFkKCkKKyAqLworI2RlZmluZSBYRlNfVFJBTlNfRFVNTVkxCQkyNworI2RlZmluZSBYRlNfVFJBTlNfRFVNTVkyCQkyOAorI2RlZmluZSBYRlNfVFJBTlNfUU1fUVVPVEFPRkYJCTI5CisjZGVmaW5lIFhGU19UUkFOU19RTV9EUUFMTE9DCQkzMAorI2RlZmluZSBYRlNfVFJBTlNfUU1fU0VUUUxJTQkJMzEKKyNkZWZpbmUgWEZTX1RSQU5TX1FNX0RRQ0xVU1RFUgkJMzIKKyNkZWZpbmUgWEZTX1RSQU5TX1FNX1FJTk9DUkVBVEUJCTMzCisjZGVmaW5lIFhGU19UUkFOU19RTV9RVU9UQU9GRl9FTkQJMzQKKyNkZWZpbmUgWEZTX1RSQU5TX1NCX1VOSVQJCTM1CisjZGVmaW5lIFhGU19UUkFOU19GU1lOQ19UUwkJMzYKKyNkZWZpbmUJWEZTX1RSQU5TX0dST1dGU1JUX0FMTE9DCTM3CisjZGVmaW5lCVhGU19UUkFOU19HUk9XRlNSVF9aRVJPCQkzOAorI2RlZmluZQlYRlNfVFJBTlNfR1JPV0ZTUlRfRlJFRQkJMzkKKyNkZWZpbmUJWEZTX1RSQU5TX1NXQVBFWFQJCTQwCisvKiBuZXcgdHJhbnNhY3Rpb24gdHlwZXMgbmVlZCB0byBiZSByZWZsZWN0ZWQgaW4geGZzX2xvZ3ByaW50KDgpICovCisKKworI2lmZGVmIF9fS0VSTkVMX18KK3N0cnVjdCB4ZnNfYnVmOworc3RydWN0IHhmc19idWZ0YXJnOworc3RydWN0IHhmc19lZmRfbG9nX2l0ZW07CitzdHJ1Y3QgeGZzX2VmaV9sb2dfaXRlbTsKK3N0cnVjdCB4ZnNfaW5vZGU7CitzdHJ1Y3QgeGZzX2l0ZW1fb3BzOworc3RydWN0IHhmc19sb2dfaW92ZWM7CitzdHJ1Y3QgeGZzX2xvZ19pdGVtOworc3RydWN0IHhmc19sb2dfaXRlbV9kZXNjOworc3RydWN0IHhmc19tb3VudDsKK3N0cnVjdCB4ZnNfdHJhbnM7CitzdHJ1Y3QgeGZzX2RxdW90X2FjY3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19haWxfZW50cnkgeworCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmFpbF9mb3J3OwkvKiBBSUwgZm9ydyBwb2ludGVyICovCisJc3RydWN0IHhmc19sb2dfaXRlbQkqYWlsX2JhY2s7CS8qIEFJTCBiYWNrIHBvaW50ZXIgKi8KK30geGZzX2FpbF9lbnRyeV90OworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIHRvIHhmc190cmFuc19wdXNoX2FpbCgpCisgKiBhbmQgaXMgdXNlZCB0byB0cmFjayB0aGUgd2hhdCBMU04gdGhlIHdhaXRpbmcgcHJvY2Vzc2VzIGFyZQorICogd2FpdGluZyB0byBiZWNvbWUgdW51c2VkLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfYWlsX3RpY2tldCB7CisJeGZzX2xzbl90CQlhdF9sc247CQkvKiBsc24gd2FpdGluIGZvciAqLworCXN0cnVjdCB4ZnNfYWlsX3RpY2tldAkqYXRfZm9ydzsJLyogd2FpdCBsaXN0IHB0ciAqLworCXN0cnVjdCB4ZnNfYWlsX3RpY2tldAkqYXRfYmFjazsJLyogd2FpdCBsaXN0IHB0ciAqLworCXN2X3QJCQlhdF9zZW1hOwkvKiB3YWl0IHNlbWEgKi8KK30geGZzX2FpbF90aWNrZXRfdDsKKworCit0eXBlZGVmIHN0cnVjdCB4ZnNfbG9nX2l0ZW0geworCXhmc19haWxfZW50cnlfdAkJCWxpX2FpbDsJCS8qIEFJTCBwb2ludGVycyAqLworCXhmc19sc25fdAkJCWxpX2xzbjsJCS8qIGxhc3Qgb24tZGlzayBsc24gKi8KKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtX2Rlc2MJKmxpX2Rlc2M7CS8qIHB0ciB0byBjdXJyZW50IGRlc2MqLworCXN0cnVjdCB4ZnNfbW91bnQJCSpsaV9tb3VudHA7CS8qIHB0ciB0byBmcyBtb3VudCAqLworCXVpbnQJCQkJbGlfdHlwZTsJLyogaXRlbSB0eXBlICovCisJdWludAkJCQlsaV9mbGFnczsJLyogbWlzYyBmbGFncyAqLworCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JCSpsaV9iaW9fbGlzdDsJLyogYnVmZmVyIGl0ZW0gbGlzdCAqLworCXZvaWQJCQkJKCpsaV9jYikoc3RydWN0IHhmc19idWYgKiwKKwkJCQkJCSBzdHJ1Y3QgeGZzX2xvZ19pdGVtICopOworCQkJCQkJCS8qIGJ1ZmZlciBpdGVtIGlvZG9uZSAqLworCQkJCQkJCS8qIGNhbGxiYWNrIGZ1bmMgKi8KKwlzdHJ1Y3QgeGZzX2l0ZW1fb3BzCQkqbGlfb3BzOwkvKiBmdW5jdGlvbiBsaXN0ICovCit9IHhmc19sb2dfaXRlbV90OworCisjZGVmaW5lCVhGU19MSV9JTl9BSUwJMHgxCisjZGVmaW5lIFhGU19MSV9BQk9SVEVECTB4MgorCit0eXBlZGVmIHN0cnVjdCB4ZnNfaXRlbV9vcHMgeworCXVpbnQgKCppb3Bfc2l6ZSkoeGZzX2xvZ19pdGVtX3QgKik7CisJdm9pZCAoKmlvcF9mb3JtYXQpKHhmc19sb2dfaXRlbV90ICosIHN0cnVjdCB4ZnNfbG9nX2lvdmVjICopOworCXZvaWQgKCppb3BfcGluKSh4ZnNfbG9nX2l0ZW1fdCAqKTsKKwl2b2lkICgqaW9wX3VucGluKSh4ZnNfbG9nX2l0ZW1fdCAqLCBpbnQpOworCXZvaWQgKCppb3BfdW5waW5fcmVtb3ZlKSh4ZnNfbG9nX2l0ZW1fdCAqLCBzdHJ1Y3QgeGZzX3RyYW5zICopOworCXVpbnQgKCppb3BfdHJ5bG9jaykoeGZzX2xvZ19pdGVtX3QgKik7CisJdm9pZCAoKmlvcF91bmxvY2spKHhmc19sb2dfaXRlbV90ICopOworCXhmc19sc25fdCAoKmlvcF9jb21taXR0ZWQpKHhmc19sb2dfaXRlbV90ICosIHhmc19sc25fdCk7CisJdm9pZCAoKmlvcF9wdXNoKSh4ZnNfbG9nX2l0ZW1fdCAqKTsKKwl2b2lkICgqaW9wX2Fib3J0KSh4ZnNfbG9nX2l0ZW1fdCAqKTsKKwl2b2lkICgqaW9wX3B1c2hidWYpKHhmc19sb2dfaXRlbV90ICopOworCXZvaWQgKCppb3BfY29tbWl0dGluZykoeGZzX2xvZ19pdGVtX3QgKiwgeGZzX2xzbl90KTsKK30geGZzX2l0ZW1fb3BzX3Q7CisKKyNkZWZpbmUgSU9QX1NJWkUoaXApCQkoKihpcCktPmxpX29wcy0+aW9wX3NpemUpKGlwKQorI2RlZmluZSBJT1BfRk9STUFUKGlwLHZwKQkoKihpcCktPmxpX29wcy0+aW9wX2Zvcm1hdCkoaXAsIHZwKQorI2RlZmluZSBJT1BfUElOKGlwKQkJKCooaXApLT5saV9vcHMtPmlvcF9waW4pKGlwKQorI2RlZmluZSBJT1BfVU5QSU4oaXAsIGZsYWdzKQkoKihpcCktPmxpX29wcy0+aW9wX3VucGluKShpcCwgZmxhZ3MpCisjZGVmaW5lIElPUF9VTlBJTl9SRU1PVkUoaXAsdHApICgqKGlwKS0+bGlfb3BzLT5pb3BfdW5waW5fcmVtb3ZlKShpcCwgdHApCisjZGVmaW5lIElPUF9UUllMT0NLKGlwKQkJKCooaXApLT5saV9vcHMtPmlvcF90cnlsb2NrKShpcCkKKyNkZWZpbmUgSU9QX1VOTE9DSyhpcCkJCSgqKGlwKS0+bGlfb3BzLT5pb3BfdW5sb2NrKShpcCkKKyNkZWZpbmUgSU9QX0NPTU1JVFRFRChpcCwgbHNuKQkoKihpcCktPmxpX29wcy0+aW9wX2NvbW1pdHRlZCkoaXAsIGxzbikKKyNkZWZpbmUgSU9QX1BVU0goaXApCQkoKihpcCktPmxpX29wcy0+aW9wX3B1c2gpKGlwKQorI2RlZmluZSBJT1BfQUJPUlQoaXApCQkoKihpcCktPmxpX29wcy0+aW9wX2Fib3J0KShpcCkKKyNkZWZpbmUgSU9QX1BVU0hCVUYoaXApCQkoKihpcCktPmxpX29wcy0+aW9wX3B1c2hidWYpKGlwKQorI2RlZmluZSBJT1BfQ09NTUlUVElORyhpcCwgbHNuKSAoKihpcCktPmxpX29wcy0+aW9wX2NvbW1pdHRpbmcpKGlwLCBsc24pCisKKy8qCisgKiBSZXR1cm4gdmFsdWVzIGZvciB0aGUgSU9QX1RSWUxPQ0soKSByb3V0aW5lcy4KKyAqLworI2RlZmluZQlYRlNfSVRFTV9TVUNDRVNTCTAKKyNkZWZpbmUJWEZTX0lURU1fUElOTkVECQkxCisjZGVmaW5lCVhGU19JVEVNX0xPQ0tFRAkJMgorI2RlZmluZQlYRlNfSVRFTV9GTFVTSElORwkzCisjZGVmaW5lIFhGU19JVEVNX1BVU0hCVUYJNAorCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byB0cmFjayBsb2cgaXRlbXMgYXNzb2NpYXRlZCB3aXRoCisgKiBhIHRyYW5zYWN0aW9uLiAgSXQgcG9pbnRzIHRvIHRoZSBsb2cgaXRlbSBhbmQga2VlcHMgc29tZQorICogZmxhZ3MgdG8gdHJhY2sgdGhlIHN0YXRlIG9mIHRoZSBsb2cgaXRlbS4gIEl0IGFsc28gdHJhY2tzCisgKiB0aGUgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCB0byBsb2cgdGhlIGl0ZW0gaXQgZGVzY3JpYmVzCisgKiBvbmNlIHdlIGdldCB0byBjb21taXQgcHJvY2Vzc2luZyAoc2VlIHhmc190cmFuc19jb21taXQoKSkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19sb2dfaXRlbV9kZXNjIHsKKwl4ZnNfbG9nX2l0ZW1fdAkqbGlkX2l0ZW07CisJdXNob3J0CQlsaWRfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyCWxpZF9mbGFnczsKKwl1bnNpZ25lZCBjaGFyCWxpZF9pbmRleDsKK30geGZzX2xvZ19pdGVtX2Rlc2NfdDsKKworI2RlZmluZSBYRlNfTElEX0RJUlRZCQkweDEKKyNkZWZpbmUgWEZTX0xJRF9QSU5ORUQJCTB4MgorI2RlZmluZSBYRlNfTElEX0JVRl9TVEFMRQkweDgKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gbWFpbnRhaW4gYSBjaHVuayBsaXN0IG9mIGxvZ19pdGVtX2Rlc2MKKyAqIHN0cnVjdHVyZXMuIFRoZSBmcmVlIGZpZWxkIGlzIGEgYml0bWFzayBpbmRpY2F0aW5nIHdoaWNoIGRlc2NyaXB0b3JzCisgKiBpbiB0aGlzIGNodW5rJ3MgYXJyYXkgYXJlIGZyZWUuICBUaGUgdW51c2VkIGZpZWxkIGlzIHRoZSBmaXJzdCB2YWx1ZQorICogbm90IHVzZWQgc2luY2UgdGhpcyBjaHVuayB3YXMgYWxsb2NhdGVkLgorICovCisjZGVmaW5lCVhGU19MSUNfTlVNX1NMT1RTCTE1Cit0eXBlZGVmIHN0cnVjdCB4ZnNfbG9nX2l0ZW1fY2h1bmsgeworCXN0cnVjdCB4ZnNfbG9nX2l0ZW1fY2h1bmsJKmxpY19uZXh0OworCXVzaG9ydAkJCQlsaWNfZnJlZTsKKwl1c2hvcnQJCQkJbGljX3VudXNlZDsKKwl4ZnNfbG9nX2l0ZW1fZGVzY190CQlsaWNfZGVzY3NbWEZTX0xJQ19OVU1fU0xPVFNdOworfSB4ZnNfbG9nX2l0ZW1fY2h1bmtfdDsKKworI2RlZmluZQlYRlNfTElDX01BWF9TTE9UCShYRlNfTElDX05VTV9TTE9UUyAtIDEpCisjZGVmaW5lCVhGU19MSUNfRlJFRU1BU0sJKCgxIDw8IFhGU19MSUNfTlVNX1NMT1RTKSAtIDEpCisKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGdpdmVuIGNodW5rLiAgU2V0IHRoZSBjaHVuaydzIGZyZWUgZGVzY3JpcHRvciBtYXNrCisgKiB0byBpbmRpY2F0ZSB0aGF0IGFsbCBkZXNjcmlwdG9ycyBhcmUgZnJlZS4gIFRoZSBjYWxsZXIgZ2V0cyB0byBzZXQKKyAqIGxpY191bnVzZWQgdG8gdGhlIHJpZ2h0IHZhbHVlICgwIG1hdGNoZXMgYWxsIGZyZWUpLiAgVGhlCisgKiBsaWNfZGVzY3MubGlkX2luZGV4IHZhbHVlcyBhcmUgc2V0IHVwIGFzIGVhY2ggZGVzYyBpcyBhbGxvY2F0ZWQuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0xJQ19JTklUKQordm9pZCB4ZnNfbGljX2luaXQoeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwKTsKKyNkZWZpbmUJWEZTX0xJQ19JTklUKGNwKQl4ZnNfbGljX2luaXQoY3ApCisjZWxzZQorI2RlZmluZQlYRlNfTElDX0lOSVQoY3ApCSgoY3ApLT5saWNfZnJlZSA9IFhGU19MSUNfRlJFRU1BU0spCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0xJQ19JTklUX1NMT1QpCit2b2lkIHhmc19saWNfaW5pdF9zbG90KHhmc19sb2dfaXRlbV9jaHVua190ICpjcCwgaW50IHNsb3QpOworI2RlZmluZQlYRlNfTElDX0lOSVRfU0xPVChjcCxzbG90KQl4ZnNfbGljX2luaXRfc2xvdChjcCwgc2xvdCkKKyNlbHNlCisjZGVmaW5lCVhGU19MSUNfSU5JVF9TTE9UKGNwLHNsb3QpCVwKKwkoKGNwKS0+bGljX2Rlc2NzW3Nsb3RdLmxpZF9pbmRleCA9ICh1bnNpZ25lZCBjaGFyKShzbG90KSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTElDX1ZBQ0FOQ1kpCitpbnQgeGZzX2xpY192YWNhbmN5KHhmc19sb2dfaXRlbV9jaHVua190ICpjcCk7CisjZGVmaW5lCVhGU19MSUNfVkFDQU5DWShjcCkJCXhmc19saWNfdmFjYW5jeShjcCkKKyNlbHNlCisjZGVmaW5lCVhGU19MSUNfVkFDQU5DWShjcCkJCSgoKGNwKS0+bGljX2ZyZWUpICYgWEZTX0xJQ19GUkVFTUFTSykKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTElDX0FMTF9GUkVFKQordm9pZCB4ZnNfbGljX2FsbF9mcmVlKHhmc19sb2dfaXRlbV9jaHVua190ICpjcCk7CisjZGVmaW5lCVhGU19MSUNfQUxMX0ZSRUUoY3ApCQl4ZnNfbGljX2FsbF9mcmVlKGNwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0xJQ19BTExfRlJFRShjcCkJCSgoY3ApLT5saWNfZnJlZSA9IFhGU19MSUNfRlJFRU1BU0spCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0xJQ19BUkVfQUxMX0ZSRUUpCitpbnQgeGZzX2xpY19hcmVfYWxsX2ZyZWUoeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwKTsKKyNkZWZpbmUJWEZTX0xJQ19BUkVfQUxMX0ZSRUUoY3ApCXhmc19saWNfYXJlX2FsbF9mcmVlKGNwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0xJQ19BUkVfQUxMX0ZSRUUoY3ApCSgoKGNwKS0+bGljX2ZyZWUgJiBYRlNfTElDX0ZSRUVNQVNLKSA9PVwKKwkJCQkJWEZTX0xJQ19GUkVFTUFTSykKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTElDX0lTRlJFRSkKK2ludCB4ZnNfbGljX2lzZnJlZSh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqY3AsIGludCBzbG90KTsKKyNkZWZpbmUJWEZTX0xJQ19JU0ZSRUUoY3Asc2xvdCkJeGZzX2xpY19pc2ZyZWUoY3Asc2xvdCkKKyNlbHNlCisjZGVmaW5lCVhGU19MSUNfSVNGUkVFKGNwLHNsb3QpCSgoY3ApLT5saWNfZnJlZSAmICgxIDw8IChzbG90KSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0xJQ19DTEFJTSkKK3ZvaWQgeGZzX2xpY19jbGFpbSh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqY3AsIGludCBzbG90KTsKKyNkZWZpbmUJWEZTX0xJQ19DTEFJTShjcCxzbG90KQkJeGZzX2xpY19jbGFpbShjcCxzbG90KQorI2Vsc2UKKyNkZWZpbmUJWEZTX0xJQ19DTEFJTShjcCxzbG90KQkJKChjcCktPmxpY19mcmVlICY9IH4oMSA8PCAoc2xvdCkpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19MSUNfUkVMU0UpCit2b2lkIHhmc19saWNfcmVsc2UoeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwLCBpbnQgc2xvdCk7CisjZGVmaW5lCVhGU19MSUNfUkVMU0UoY3Asc2xvdCkJCXhmc19saWNfcmVsc2UoY3Asc2xvdCkKKyNlbHNlCisjZGVmaW5lCVhGU19MSUNfUkVMU0UoY3Asc2xvdCkJCSgoY3ApLT5saWNfZnJlZSB8PSAxIDw8IChzbG90KSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTElDX1NMT1QpCit4ZnNfbG9nX2l0ZW1fZGVzY190ICp4ZnNfbGljX3Nsb3QoeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwLCBpbnQgc2xvdCk7CisjZGVmaW5lCVhGU19MSUNfU0xPVChjcCxzbG90KQkJeGZzX2xpY19zbG90KGNwLHNsb3QpCisjZWxzZQorI2RlZmluZQlYRlNfTElDX1NMT1QoY3Asc2xvdCkJCSgmKChjcCktPmxpY19kZXNjc1tzbG90XSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0xJQ19ERVNDX1RPX1NMT1QpCitpbnQgeGZzX2xpY19kZXNjX3RvX3Nsb3QoeGZzX2xvZ19pdGVtX2Rlc2NfdCAqZHApOworI2RlZmluZQlYRlNfTElDX0RFU0NfVE9fU0xPVChkcCkJeGZzX2xpY19kZXNjX3RvX3Nsb3QoZHApCisjZWxzZQorI2RlZmluZQlYRlNfTElDX0RFU0NfVE9fU0xPVChkcCkJKCh1aW50KSgoZHApLT5saWRfaW5kZXgpKQorI2VuZGlmCisvKgorICogQ2FsY3VsYXRlIHRoZSBhZGRyZXNzIG9mIGEgY2h1bmsgZ2l2ZW4gYSBkZXNjcmlwdG9yIHBvaW50ZXI6CisgKiBkcCAtIGRwLT5saWRfaW5kZXggZ2l2ZSB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGxpY19kZXNjcyBhcnJheS4KKyAqIEZyb20gdGhpcyB3ZSBzdWJ0cmFjdCB0aGUgb2Zmc2V0IG9mIHRoZSBsaWNfZGVzY3MgZmllbGQgaW4gYSBjaHVuay4KKyAqIEFsbCBvZiB0aGlzIHlpZWxkcyB0aGUgYWRkcmVzcyBvZiB0aGUgY2h1bmssIHdoaWNoIGlzCisgKiBjYXN0IHRvIGEgY2h1bmsgcG9pbnRlci4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTElDX0RFU0NfVE9fQ0hVTkspCit4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqeGZzX2xpY19kZXNjX3RvX2NodW5rKHhmc19sb2dfaXRlbV9kZXNjX3QgKmRwKTsKKyNkZWZpbmUJWEZTX0xJQ19ERVNDX1RPX0NIVU5LKGRwKQl4ZnNfbGljX2Rlc2NfdG9fY2h1bmsoZHApCisjZWxzZQorI2RlZmluZQlYRlNfTElDX0RFU0NfVE9fQ0hVTksoZHApCSgoeGZzX2xvZ19pdGVtX2NodW5rX3QqKSBcCisJCQkJCSgoKHhmc19jYWRkcl90KSgoZHApIC0gKGRwKS0+bGlkX2luZGV4KSkgLVwKKwkJCQkJKHhmc19jYWRkcl90KSgoKHhmc19sb2dfaXRlbV9jaHVua190KikgXAorCQkJCQkwKS0+bGljX2Rlc2NzKSkpCisjZW5kaWYKKworI2lmZGVmIF9fS0VSTkVMX18KKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIG1haW50YWluIGEgbGlzdCBvZiBibG9jayByYW5nZXMgdGhhdCBoYXZlIGJlZW4KKyAqIGZyZWVkIGluIHRoZSB0cmFuc2FjdGlvbi4gIFRoZSByYW5nZXMgYXJlIGxpc3RlZCBpbiB0aGUgcGVyYWdbXSBidXN5IGxpc3QKKyAqIGJldHdlZW4gd2hlbiB0aGV5J3JlIGZyZWVkIGFuZCB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkIHRvIGRpc2suCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2xvZ19idXN5X3Nsb3QgeworCXhmc19hZ251bWJlcl90CQlsYmNfYWc7CisJdXNob3J0CQkJbGJjX2lkeDsJLyogaW5kZXggaW4gcGVyYWcuYnVzeVtdICovCit9IHhmc19sb2dfYnVzeV9zbG90X3Q7CisKKyNkZWZpbmUgWEZTX0xCQ19OVU1fU0xPVFMJMzEKK3R5cGVkZWYgc3RydWN0IHhmc19sb2dfYnVzeV9jaHVuayB7CisJc3RydWN0IHhmc19sb2dfYnVzeV9jaHVuawkqbGJjX25leHQ7CisJdWludAkJCQlsYmNfZnJlZTsJLyogYml0bWFzayBvZiBmcmVlIHNsb3RzICovCisJdXNob3J0CQkJCWxiY191bnVzZWQ7CS8qIGZpcnN0IHVudXNlZCAqLworCXhmc19sb2dfYnVzeV9zbG90X3QJCWxiY19idXN5W1hGU19MQkNfTlVNX1NMT1RTXTsKK30geGZzX2xvZ19idXN5X2NodW5rX3Q7CisKKyNkZWZpbmUJWEZTX0xCQ19NQVhfU0xPVAkoWEZTX0xCQ19OVU1fU0xPVFMgLSAxKQorI2RlZmluZQlYRlNfTEJDX0ZSRUVNQVNLCSgoMVUgPDwgWEZTX0xCQ19OVU1fU0xPVFMpIC0gMSkKKworI2RlZmluZQlYRlNfTEJDX0lOSVQoY3ApCSgoY3ApLT5sYmNfZnJlZSA9IFhGU19MQkNfRlJFRU1BU0spCisjZGVmaW5lCVhGU19MQkNfQ0xBSU0oY3AsIHNsb3QpCSgoY3ApLT5sYmNfZnJlZSAmPSB+KDEgPDwgKHNsb3QpKSkKKyNkZWZpbmUJWEZTX0xCQ19TTE9UKGNwLCBzbG90KQkoJigoY3ApLT5sYmNfYnVzeVsoc2xvdCldKSkKKyNkZWZpbmUJWEZTX0xCQ19WQUNBTkNZKGNwKQkoKChjcCktPmxiY19mcmVlKSAmIFhGU19MQkNfRlJFRU1BU0spCisjZGVmaW5lCVhGU19MQkNfSVNGUkVFKGNwLCBzbG90KSAoKGNwKS0+bGJjX2ZyZWUgJiAoMSA8PCAoc2xvdCkpKQorCisvKgorICogVGhpcyBpcyB0aGUgdHlwZSBvZiBmdW5jdGlvbiB3aGljaCBjYW4gYmUgZ2l2ZW4gdG8geGZzX3RyYW5zX2NhbGxiYWNrKCkKKyAqIHRvIGJlIGNhbGxlZCB1cG9uIHRoZSB0cmFuc2FjdGlvbidzIGNvbW1pdCB0byBkaXNrLgorICovCit0eXBlZGVmIHZvaWQgKCp4ZnNfdHJhbnNfY2FsbGJhY2tfdCkoc3RydWN0IHhmc190cmFucyAqLCB2b2lkICopOworCisvKgorICogVGhpcyBpcyB0aGUgc3RydWN0dXJlIG1haW50YWluZWQgZm9yIGV2ZXJ5IGFjdGl2ZSB0cmFuc2FjdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX3RyYW5zIHsKKwl1bnNpZ25lZCBpbnQJCXRfbWFnaWM7CS8qIG1hZ2ljIG51bWJlciAqLworCXhmc19sb2dfY2FsbGJhY2tfdAl0X2xvZ2NiOwkvKiBsb2cgY2FsbGJhY2sgc3RydWN0ICovCisJc3RydWN0IHhmc190cmFucwkqdF9mb3J3OwkvKiBhc3luYyBsaXN0IHBvaW50ZXJzICovCisJc3RydWN0IHhmc190cmFucwkqdF9iYWNrOwkvKiBhc3luYyBsaXN0IHBvaW50ZXJzICovCisJdW5zaWduZWQgaW50CQl0X3R5cGU7CQkvKiB0cmFuc2FjdGlvbiB0eXBlICovCisJdW5zaWduZWQgaW50CQl0X2xvZ19yZXM7CS8qIGFtdCBvZiBsb2cgc3BhY2UgcmVzdmQgKi8KKwl1bnNpZ25lZCBpbnQJCXRfbG9nX2NvdW50OwkvKiBjb3VudCBmb3IgcGVybSBsb2cgcmVzICovCisJdW5zaWduZWQgaW50CQl0X2Jsa19yZXM7CS8qICMgb2YgYmxvY2tzIHJlc3ZkICovCisJdW5zaWduZWQgaW50CQl0X2Jsa19yZXNfdXNlZDsJLyogIyBvZiByZXN2ZCBibG9ja3MgdXNlZCAqLworCXVuc2lnbmVkIGludAkJdF9ydHhfcmVzOwkvKiAjIG9mIHJ0IGV4dGVudHMgcmVzdmQgKi8KKwl1bnNpZ25lZCBpbnQJCXRfcnR4X3Jlc191c2VkOwkvKiAjIG9mIHJlc3ZkIHJ0IGV4dGVudHMgdXNlZCAqLworCXhmc19sb2dfdGlja2V0X3QJdF90aWNrZXQ7CS8qIGxvZyBtZ3IgdGlja2V0ICovCisJc2VtYV90CQkJdF9zZW1hOwkJLyogc2VtYSBmb3IgY29tbWl0IGNvbXBsZXRpb24gKi8KKwl4ZnNfbHNuX3QJCXRfbHNuOwkJLyogbG9nIHNlcSBudW0gb2Ygc3RhcnQgb2YKKwkJCQkJCSAqIHRyYW5zYWN0aW9uLiAqLworCXhmc19sc25fdAkJdF9jb21taXRfbHNuOwkvKiBsb2cgc2VxIG51bSBvZiBlbmQgb2YKKwkJCQkJCSAqIHRyYW5zYWN0aW9uLiAqLworCXN0cnVjdCB4ZnNfbW91bnQJKnRfbW91bnRwOwkvKiBwdHIgdG8gZnMgbW91bnQgc3RydWN0ICovCisJc3RydWN0IHhmc19kcXVvdF9hY2N0ICAgKnRfZHFpbmZvOwkvKiBhY2N0aW5nIGluZm8gZm9yIGRxdW90cyAqLworCXhmc190cmFuc19jYWxsYmFja190CXRfY2FsbGJhY2s7CS8qIHRyYW5zYWN0aW9uIGNhbGxiYWNrICovCisJdm9pZAkJCSp0X2NhbGxhcmc7CS8qIGNhbGxiYWNrIGFyZyAqLworCXVuc2lnbmVkIGludAkJdF9mbGFnczsJLyogbWlzYyBmbGFncyAqLworCWxvbmcJCQl0X2ljb3VudF9kZWx0YTsJLyogc3VwZXJibG9jayBpY291bnQgY2hhbmdlICovCisJbG9uZwkJCXRfaWZyZWVfZGVsdGE7CS8qIHN1cGVyYmxvY2sgaWZyZWUgY2hhbmdlICovCisJbG9uZwkJCXRfZmRibG9ja3NfZGVsdGE7IC8qIHN1cGVyYmxvY2sgZmRibG9ja3MgY2hnICovCisJbG9uZwkJCXRfcmVzX2ZkYmxvY2tzX2RlbHRhOyAvKiBvbi1kaXNrIG9ubHkgY2hnICovCisJbG9uZwkJCXRfZnJleHRlbnRzX2RlbHRhOy8qIHN1cGVyYmxvY2sgZnJlZXh0ZW50cyBjaGcqLworCWxvbmcJCQl0X3Jlc19mcmV4dGVudHNfZGVsdGE7IC8qIG9uLWRpc2sgb25seSBjaGcgKi8KKwlsb25nCQkJdF9hZ19mcmVlYmxrc19kZWx0YTsgLyogZGVidWdnaW5nIGNvdW50ZXIgKi8KKwlsb25nCQkJdF9hZ19mbGlzdF9kZWx0YTsgLyogZGVidWdnaW5nIGNvdW50ZXIgKi8KKwlsb25nCQkJdF9hZ19idHJlZV9kZWx0YTsgLyogZGVidWdnaW5nIGNvdW50ZXIgKi8KKwlsb25nCQkJdF9kYmxvY2tzX2RlbHRhOy8qIHN1cGVyYmxvY2sgZGJsb2NrcyBjaGFuZ2UgKi8KKwlsb25nCQkJdF9hZ2NvdW50X2RlbHRhOy8qIHN1cGVyYmxvY2sgYWdjb3VudCBjaGFuZ2UgKi8KKwlsb25nCQkJdF9pbWF4cGN0X2RlbHRhOy8qIHN1cGVyYmxvY2sgaW1heHBjdCBjaGFuZ2UgKi8KKwlsb25nCQkJdF9yZXh0c2l6ZV9kZWx0YTsvKiBzdXBlcmJsb2NrIHJleHRzaXplIGNoZyAqLworCWxvbmcJCQl0X3JibWJsb2Nrc19kZWx0YTsvKiBzdXBlcmJsb2NrIHJibWJsb2NrcyBjaGcgKi8KKwlsb25nCQkJdF9yYmxvY2tzX2RlbHRhOy8qIHN1cGVyYmxvY2sgcmJsb2NrcyBjaGFuZ2UgKi8KKwlsb25nCQkJdF9yZXh0ZW50c19kZWx0YTsvKiBzdXBlcmJsb2NrcyByZXh0ZW50cyBjaGcgKi8KKwlsb25nCQkJdF9yZXh0c2xvZ19kZWx0YTsvKiBzdXBlcmJsb2NrcyByZXh0c2xvZyBjaGcgKi8KKwl1bnNpZ25lZCBpbnQJCXRfaXRlbXNfZnJlZTsJLyogbG9nIGl0ZW0gZGVzY3MgZnJlZSAqLworCXhmc19sb2dfaXRlbV9jaHVua190CXRfaXRlbXM7CS8qIGZpcnN0IGxvZyBpdGVtIGRlc2MgY2h1bmsgKi8KKwl4ZnNfdHJhbnNfaGVhZGVyX3QJdF9oZWFkZXI7CS8qIGhlYWRlciBmb3IgaW4tbG9nIHRyYW5zICovCisJdW5zaWduZWQgaW50CQl0X2J1c3lfZnJlZTsJLyogYnVzeSBkZXNjcyBmcmVlICovCisJeGZzX2xvZ19idXN5X2NodW5rX3QJdF9idXN5OwkJLyogYnVzeS9hc3luYyBmcmVlIGJsb2NrcyAqLworICAgICAgICB4ZnNfcGZsYWdzX3QgICAgICAgICAgICB0X3BmbGFnczsgICAgICAgLyogc2F2ZWQgcGZsYWdzIHN0YXRlICovCit9IHhmc190cmFuc190OworCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisKKyNkZWZpbmUJWEZTX1RSQU5TX01BR0lDCQkweDU0NTI0MTRFCS8qICdUUkFOJyAqLworLyoKKyAqIFZhbHVlcyBmb3IgdF9mbGFncy4KKyAqLworI2RlZmluZQlYRlNfVFJBTlNfRElSVFkJCTB4MDEJLyogc29tZXRoaW5nIG5lZWRzIHRvIGJlIGxvZ2dlZCAqLworI2RlZmluZQlYRlNfVFJBTlNfU0JfRElSVFkJMHgwMgkvKiBzdXBlcmJsb2NrIGlzIG1vZGlmaWVkICovCisjZGVmaW5lCVhGU19UUkFOU19QRVJNX0xPR19SRVMJMHgwNAkvKiB4YWN0IHRvb2sgYSBwZXJtYW5lbnQgbG9nIHJlcyAqLworI2RlZmluZQlYRlNfVFJBTlNfU1lOQwkJMHgwOAkvKiBtYWtlIGNvbW1pdCBzeW5jaHJvbm91cyAqLworI2RlZmluZSBYRlNfVFJBTlNfRFFfRElSVFkJMHgxMAkvKiBhdCBsZWFzdCBvbmUgZHF1b3QgaW4gdHJ4IGRpcnR5ICovCisjZGVmaW5lIFhGU19UUkFOU19SRVNFUlZFCTB4MjAgICAgLyogT0sgdG8gdXNlIHJlc2VydmVkIGRhdGEgYmxvY2tzICovCisKKy8qCisgKiBWYWx1ZXMgZm9yIGNhbGwgZmxhZ3MgcGFyYW1ldGVyLgorICovCisjZGVmaW5lCVhGU19UUkFOU19OT1NMRUVQCQkweDEKKyNkZWZpbmUJWEZTX1RSQU5TX1dBSVQJCQkweDIKKyNkZWZpbmUJWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUwkweDQKKyNkZWZpbmUJWEZTX1RSQU5TX0FCT1JUCQkJMHg4CisKKy8qCisgKiBGaWVsZCB2YWx1ZXMgZm9yIHhmc190cmFuc19tb2Rfc2IuCisgKi8KKyNkZWZpbmUJWEZTX1RSQU5TX1NCX0lDT1VOVAkJMHgwMDAwMDAwMQorI2RlZmluZQlYRlNfVFJBTlNfU0JfSUZSRUUJCTB4MDAwMDAwMDIKKyNkZWZpbmUJWEZTX1RSQU5TX1NCX0ZEQkxPQ0tTCQkweDAwMDAwMDA0CisjZGVmaW5lCVhGU19UUkFOU19TQl9SRVNfRkRCTE9DS1MJMHgwMDAwMDAwOAorI2RlZmluZQlYRlNfVFJBTlNfU0JfRlJFWFRFTlRTCQkweDAwMDAwMDEwCisjZGVmaW5lCVhGU19UUkFOU19TQl9SRVNfRlJFWFRFTlRTCTB4MDAwMDAwMjAKKyNkZWZpbmUJWEZTX1RSQU5TX1NCX0RCTE9DS1MJCTB4MDAwMDAwNDAKKyNkZWZpbmUJWEZTX1RSQU5TX1NCX0FHQ09VTlQJCTB4MDAwMDAwODAKKyNkZWZpbmUJWEZTX1RSQU5TX1NCX0lNQVhQQ1QJCTB4MDAwMDAxMDAKKyNkZWZpbmUJWEZTX1RSQU5TX1NCX1JFWFRTSVpFCQkweDAwMDAwMjAwCisjZGVmaW5lCVhGU19UUkFOU19TQl9SQk1CTE9DS1MJCTB4MDAwMDA0MDAKKyNkZWZpbmUJWEZTX1RSQU5TX1NCX1JCTE9DS1MJCTB4MDAwMDA4MDAKKyNkZWZpbmUJWEZTX1RSQU5TX1NCX1JFWFRFTlRTCQkweDAwMDAxMDAwCisjZGVmaW5lCVhGU19UUkFOU19TQl9SRVhUU0xPRwkJMHgwMDAwMjAwMAorCisKKy8qCisgKiBWYXJpb3VzIGxvZyByZXNlcnZhdGlvbiB2YWx1ZXMuCisgKiBUaGVzZSBhcmUgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIGZpbGUgc3lzdGVtIGJsb2NrCisgKiBiZWNhdXNlIHRoYXQgaXMgd2hhdCBtb3N0IHRyYW5zYWN0aW9ucyBtYW5pcHVsYXRlLgorICogRWFjaCBhZGRzIGluIGFuIGFkZGl0aW9uYWwgMTI4IGJ5dGVzIHBlciBpdGVtIGxvZ2dlZCB0bworICogdHJ5IHRvIGFjY291bnQgZm9yIHRoZSBvdmVyaGVhZCBvZiB0aGUgdHJhbnNhY3Rpb24gbWVjaGFuaXNtLgorICoKKyAqIE5vdGU6CisgKiBNb3N0IG9mIHRoZSByZXNlcnZhdGlvbnMgdW5kZXJlc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIGFsbG9jYXRpb24KKyAqIGdyb3VwcyBpbnRvIHdoaWNoIHRoZXkgY291bGQgZnJlZSBleHRlbnRzIGluIHRoZSB4ZnNfYm1hcF9maW5pc2goKQorICogY2FsbC4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgbnVtYmVyIGluIHRoZSB3b3JzdCBjYXNlIGlzIHF1aXRlIGhpZ2gKKyAqIGFuZCBxdWl0ZSB1bnVzdWFsLiAgSW4gb3JkZXIgdG8gZml4IHRoaXMgd2UgbmVlZCB0byBjaGFuZ2UKKyAqIHhmc19ibWFwX2ZpbmlzaCgpIHRvIGZyZWUgZXh0ZW50cyBpbiBvbmx5IGEgc2luZ2xlIEFHIGF0IGEgdGltZS4KKyAqIFRoaXMgd2lsbCByZXF1aXJlIGNoYW5nZXMgdG8gdGhlIEVGSSBjb2RlIGFzIHdlbGwsIGhvd2V2ZXIsIHNvIHRoYXQKKyAqIHRoZSBFRkkgZm9yIHRoZSBleHRlbnRzIG5vdCBmcmVlZCBpcyBsb2dnZWQgYWdhaW4gaW4gZWFjaCB0cmFuc2FjdGlvbi4KKyAqIFNlZSBidWcgMjYxOTE3LgorICovCisKKy8qCisgKiBQZXItZXh0ZW50IGxvZyByZXNlcnZhdGlvbiBmb3IgdGhlIGFsbG9jYXRpb24gYnRyZWUgY2hhbmdlcworICogaW52b2x2ZWQgaW4gZnJlZWluZyBvciBhbGxvY2F0aW5nIGFuIGV4dGVudC4KKyAqIDIgdHJlZXMgKiAoMiBibG9ja3MvbGV2ZWwgKiBtYXggZGVwdGggLSAxKSAqIGJsb2NrIHNpemUKKyAqLworI2RlZmluZQlYRlNfQUxMT0NGUkVFX0xPR19SRVMobXAsbngpIFwKKwkoKG54KSAqICgyICogWEZTX0ZTQl9UT19CKChtcCksIDIgKiBYRlNfQUdfTUFYTEVWRUxTKG1wKSAtIDEpKSkKKyNkZWZpbmUJWEZTX0FMTE9DRlJFRV9MT0dfQ09VTlQobXAsbngpIFwKKwkoKG54KSAqICgyICogKDIgKiBYRlNfQUdfTUFYTEVWRUxTKG1wKSAtIDEpKSkKKworLyoKKyAqIFBlci1kaXJlY3RvcnkgbG9nIHJlc2VydmF0aW9uIGZvciBhbnkgZGlyZWN0b3J5IGNoYW5nZS4KKyAqIGRpciBibG9ja3M6ICgxIGJ0cmVlIGJsb2NrIHBlciBsZXZlbCArIGRhdGEgYmxvY2sgKyBmcmVlIGJsb2NrKSAqIGRibG9jayBzaXplCisgKiBibWFwIGJ0cmVlOiAobGV2ZWxzICsgMikgKiBtYXggZGVwdGggKiBibG9jayBzaXplCisgKiB2MiBkaXJlY3RvcnkgYmxvY2tzIGNhbiBiZSBmcmFnbWVudGVkIGJlbG93IHRoZSBkaXJibGtzaXplIGRvd24gdG8gdGhlIGZzYgorICogc2l6ZSwgc28gYWNjb3VudCBmb3IgdGhhdCBpbiB0aGUgREFFTlRFUiBtYWNyb3MuCisgKi8KKyNkZWZpbmUJWEZTX0RJUk9QX0xPR19SRVMobXApCVwKKwkoWEZTX0ZTQl9UT19CKG1wLCBYRlNfREFFTlRFUl9CTE9DS1MobXAsIFhGU19EQVRBX0ZPUkspKSArIFwKKwkgKFhGU19GU0JfVE9fQihtcCwgWEZTX0RBRU5URVJfQk1BUFMobXAsIFhGU19EQVRBX0ZPUkspICsgMSkpKQorI2RlZmluZQlYRlNfRElST1BfTE9HX0NPVU5UKG1wKQlcCisJKFhGU19EQUVOVEVSX0JMT0NLUyhtcCwgWEZTX0RBVEFfRk9SSykgKyBcCisJIFhGU19EQUVOVEVSX0JNQVBTKG1wLCBYRlNfREFUQV9GT1JLKSArIDEpCisKKy8qCisgKiBJbiBhIHdyaXRlIHRyYW5zYWN0aW9uIHdlIGNhbiBhbGxvY2F0ZSBhIG1heGltdW0gb2YgMgorICogZXh0ZW50cy4gIFRoaXMgZ2l2ZXM6CisgKiAgICB0aGUgaW5vZGUgZ2V0dGluZyB0aGUgbmV3IGV4dGVudHM6IGlub2RlIHNpemUKKyAqICAgIHRoZSBpbm9kZVwncyBibWFwIGJ0cmVlOiBtYXggZGVwdGggKiBibG9jayBzaXplCisgKiAgICB0aGUgYWdmcyBvZiB0aGUgYWdzIGZyb20gd2hpY2ggdGhlIGV4dGVudHMgYXJlIGFsbG9jYXRlZDogMiAqIHNlY3RvcgorICogICAgdGhlIHN1cGVyYmxvY2sgZnJlZSBibG9jayBjb3VudGVyOiBzZWN0b3Igc2l6ZQorICogICAgdGhlIGFsbG9jYXRpb24gYnRyZWVzOiAyIGV4dHMgKiAyIHRyZWVzICogKDIgKiBtYXggZGVwdGggLSAxKSAqIGJsb2NrIHNpemUKKyAqIEFuZCB0aGUgYm1hcF9maW5pc2ggdHJhbnNhY3Rpb24gY2FuIGZyZWUgYm1hcCBibG9ja3MgaW4gYSBqb2luOgorICogICAgdGhlIGFnZnMgb2YgdGhlIGFncyBjb250YWluaW5nIHRoZSBibG9ja3M6IDIgKiBzZWN0b3Igc2l6ZQorICogICAgdGhlIGFnZmxzIG9mIHRoZSBhZ3MgY29udGFpbmluZyB0aGUgYmxvY2tzOiAyICogc2VjdG9yIHNpemUKKyAqICAgIHRoZSBzdXBlciBibG9jayBmcmVlIGJsb2NrIGNvdW50ZXI6IHNlY3RvciBzaXplCisgKiAgICB0aGUgYWxsb2NhdGlvbiBidHJlZXM6IDIgZXh0cyAqIDIgdHJlZXMgKiAoMiAqIG1heCBkZXB0aCAtIDEpICogYmxvY2sgc2l6ZQorICovCisjZGVmaW5lIFhGU19DQUxDX1dSSVRFX0xPR19SRVMobXApIFwKKwkoTUFYKCBcCisJICgobXApLT5tX3NiLnNiX2lub2Rlc2l6ZSArIFwKKwkgIFhGU19GU0JfVE9fQigobXApLCBYRlNfQk1fTUFYTEVWRUxTKG1wLCBYRlNfREFUQV9GT1JLKSkgKyBcCisJICAoMiAqIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUpICsgXAorCSAgKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSArIFwKKwkgIFhGU19BTExPQ0ZSRUVfTE9HX1JFUyhtcCwgMikgKyBcCisJICAoMTI4ICogKDQgKyBYRlNfQk1fTUFYTEVWRUxTKG1wLCBYRlNfREFUQV9GT1JLKSArIFhGU19BTExPQ0ZSRUVfTE9HX0NPVU5UKG1wLCAyKSkpKSxcCisJICgoMiAqIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUpICsgXAorCSAgKDIgKiAobXApLT5tX3NiLnNiX3NlY3RzaXplKSArIFwKKwkgIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUgKyBcCisJICBYRlNfQUxMT0NGUkVFX0xPR19SRVMobXAsIDIpICsgXAorCSAgKDEyOCAqICg1ICsgWEZTX0FMTE9DRlJFRV9MT0dfQ09VTlQobXAsIDIpKSkpKSkKKworI2RlZmluZQlYRlNfV1JJVEVfTE9HX1JFUyhtcCkJKChtcCktPm1fcmVzZXJ2YXRpb25zLnRyX3dyaXRlKQorCisvKgorICogSW4gdHJ1bmNhdGluZyBhIGZpbGUgd2UgZnJlZSB1cCB0byB0d28gZXh0ZW50cyBhdCBvbmNlLiAgV2UgY2FuIG1vZGlmeToKKyAqICAgIHRoZSBpbm9kZSBiZWluZyB0cnVuY2F0ZWQ6IGlub2RlIHNpemUKKyAqICAgIHRoZSBpbm9kZVwncyBibWFwIGJ0cmVlOiAobWF4IGRlcHRoICsgMSkgKiBibG9jayBzaXplCisgKiBBbmQgdGhlIGJtYXBfZmluaXNoIHRyYW5zYWN0aW9uIGNhbiBmcmVlIHRoZSBibG9ja3MgYW5kIGJtYXAgYmxvY2tzOgorICogICAgdGhlIGFnZiBmb3IgZWFjaCBvZiB0aGUgYWdzOiA0ICogc2VjdG9yIHNpemUKKyAqICAgIHRoZSBhZ2ZsIGZvciBlYWNoIG9mIHRoZSBhZ3M6IDQgKiBzZWN0b3Igc2l6ZQorICogICAgdGhlIHN1cGVyIGJsb2NrIHRvIHJlZmxlY3QgdGhlIGZyZWVkIGJsb2Nrczogc2VjdG9yIHNpemUKKyAqICAgIHdvcnN0IGNhc2Ugc3BsaXQgaW4gYWxsb2NhdGlvbiBidHJlZXMgcGVyIGV4dGVudCBhc3N1bWluZyA0IGV4dGVudHM6CisgKgkJNCBleHRzICogMiB0cmVlcyAqICgyICogbWF4IGRlcHRoIC0gMSkgKiBibG9jayBzaXplCisgKiAgICB0aGUgaW5vZGUgYnRyZWU6IG1heCBkZXB0aCAqIGJsb2Nrc2l6ZQorICogICAgdGhlIGFsbG9jYXRpb24gYnRyZWVzOiAyIHRyZWVzICogKG1heCBkZXB0aCAtIDEpICogYmxvY2sgc2l6ZQorICovCisjZGVmaW5lCVhGU19DQUxDX0lUUlVOQ0FURV9MT0dfUkVTKG1wKSBcCisJKE1BWCggXAorCSAoKG1wKS0+bV9zYi5zYl9pbm9kZXNpemUgKyBcCisJICBYRlNfRlNCX1RPX0IoKG1wKSwgWEZTX0JNX01BWExFVkVMUyhtcCwgWEZTX0RBVEFfRk9SSykgKyAxKSArIFwKKwkgICgxMjggKiAoMiArIFhGU19CTV9NQVhMRVZFTFMobXAsIFhGU19EQVRBX0ZPUkspKSkpLCBcCisJICgoNCAqIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUpICsgXAorCSAgKDQgKiAobXApLT5tX3NiLnNiX3NlY3RzaXplKSArIFwKKwkgIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUgKyBcCisJICBYRlNfQUxMT0NGUkVFX0xPR19SRVMobXAsIDQpICsgXAorCSAgKDEyOCAqICg5ICsgWEZTX0FMTE9DRlJFRV9MT0dfQ09VTlQobXAsIDQpKSkgKyBcCisJICAoMTI4ICogNSkgKyBcCisJICBYRlNfQUxMT0NGUkVFX0xPR19SRVMobXAsIDEpICsgXAorCSAgICgxMjggKiAoMiArIFhGU19JQUxMT0NfQkxPQ0tTKG1wKSArIFhGU19JTl9NQVhMRVZFTFMobXApICsgXAorCSAgICBYRlNfQUxMT0NGUkVFX0xPR19DT1VOVChtcCwgMSkpKSkpKQorCisjZGVmaW5lCVhGU19JVFJVTkNBVEVfTE9HX1JFUyhtcCkgICAoKG1wKS0+bV9yZXNlcnZhdGlvbnMudHJfaXRydW5jYXRlKQorCisvKgorICogSW4gcmVuYW1pbmcgYSBmaWxlcyB3ZSBjYW4gbW9kaWZ5OgorICogICAgdGhlIGZvdXIgaW5vZGVzIGludm9sdmVkOiA0ICogaW5vZGUgc2l6ZQorICogICAgdGhlIHR3byBkaXJlY3RvcnkgYnRyZWVzOiAyICogKG1heCBkZXB0aCArIHYyKSAqIGRpciBibG9jayBzaXplCisgKiAgICB0aGUgdHdvIGRpcmVjdG9yeSBibWFwIGJ0cmVlczogMiAqIG1heCBkZXB0aCAqIGJsb2NrIHNpemUKKyAqIEFuZCB0aGUgYm1hcF9maW5pc2ggdHJhbnNhY3Rpb24gY2FuIGZyZWUgZGlyIGFuZCBibWFwIGJsb2NrcyAodHdvIHNldHMKKyAqCW9mIGJtYXAgYmxvY2tzKSBnaXZpbmc6CisgKiAgICB0aGUgYWdmIGZvciB0aGUgYWdzIGluIHdoaWNoIHRoZSBibG9ja3MgbGl2ZTogMyAqIHNlY3RvciBzaXplCisgKiAgICB0aGUgYWdmbCBmb3IgdGhlIGFncyBpbiB3aGljaCB0aGUgYmxvY2tzIGxpdmU6IDMgKiBzZWN0b3Igc2l6ZQorICogICAgdGhlIHN1cGVyYmxvY2sgZm9yIHRoZSBmcmVlIGJsb2NrIGNvdW50OiBzZWN0b3Igc2l6ZQorICogICAgdGhlIGFsbG9jYXRpb24gYnRyZWVzOiAzIGV4dHMgKiAyIHRyZWVzICogKDIgKiBtYXggZGVwdGggLSAxKSAqIGJsb2NrIHNpemUKKyAqLworI2RlZmluZQlYRlNfQ0FMQ19SRU5BTUVfTE9HX1JFUyhtcCkgXAorCShNQVgoIFwKKwkgKCg0ICogKG1wKS0+bV9zYi5zYl9pbm9kZXNpemUpICsgXAorCSAgKDIgKiBYRlNfRElST1BfTE9HX1JFUyhtcCkpICsgXAorCSAgKDEyOCAqICg0ICsgMiAqIFhGU19ESVJPUF9MT0dfQ09VTlQobXApKSkpLCBcCisJICgoMyAqIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUpICsgXAorCSAgKDMgKiAobXApLT5tX3NiLnNiX3NlY3RzaXplKSArIFwKKwkgIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUgKyBcCisJICBYRlNfQUxMT0NGUkVFX0xPR19SRVMobXAsIDMpICsgXAorCSAgKDEyOCAqICg3ICsgWEZTX0FMTE9DRlJFRV9MT0dfQ09VTlQobXAsIDMpKSkpKSkKKworI2RlZmluZQlYRlNfUkVOQU1FX0xPR19SRVMobXApCSgobXApLT5tX3Jlc2VydmF0aW9ucy50cl9yZW5hbWUpCisKKy8qCisgKiBGb3IgY3JlYXRpbmcgYSBsaW5rIHRvIGFuIGlub2RlOgorICogICAgdGhlIHBhcmVudCBkaXJlY3RvcnkgaW5vZGU6IGlub2RlIHNpemUKKyAqICAgIHRoZSBsaW5rZWQgaW5vZGU6IGlub2RlIHNpemUKKyAqICAgIHRoZSBkaXJlY3RvcnkgYnRyZWUgY291bGQgc3BsaXQ6IChtYXggZGVwdGggKyB2MikgKiBkaXIgYmxvY2sgc2l6ZQorICogICAgdGhlIGRpcmVjdG9yeSBibWFwIGJ0cmVlIGNvdWxkIGpvaW4gb3Igc3BsaXQ6IChtYXggZGVwdGggKyB2MikgKiBibG9ja3NpemUKKyAqIEFuZCB0aGUgYm1hcF9maW5pc2ggdHJhbnNhY3Rpb24gY2FuIGZyZWUgc29tZSBibWFwIGJsb2NrcyBnaXZpbmc6CisgKiAgICB0aGUgYWdmIGZvciB0aGUgYWcgaW4gd2hpY2ggdGhlIGJsb2NrcyBsaXZlOiBzZWN0b3Igc2l6ZQorICogICAgdGhlIGFnZmwgZm9yIHRoZSBhZyBpbiB3aGljaCB0aGUgYmxvY2tzIGxpdmU6IHNlY3RvciBzaXplCisgKiAgICB0aGUgc3VwZXJibG9jayBmb3IgdGhlIGZyZWUgYmxvY2sgY291bnQ6IHNlY3RvciBzaXplCisgKiAgICB0aGUgYWxsb2NhdGlvbiBidHJlZXM6IDIgdHJlZXMgKiAoMiAqIG1heCBkZXB0aCAtIDEpICogYmxvY2sgc2l6ZQorICovCisjZGVmaW5lCVhGU19DQUxDX0xJTktfTE9HX1JFUyhtcCkgXAorCShNQVgoIFwKKwkgKChtcCktPm1fc2Iuc2JfaW5vZGVzaXplICsgXAorCSAgKG1wKS0+bV9zYi5zYl9pbm9kZXNpemUgKyBcCisJICBYRlNfRElST1BfTE9HX1JFUyhtcCkgKyBcCisJICAoMTI4ICogKDIgKyBYRlNfRElST1BfTE9HX0NPVU5UKG1wKSkpKSwgXAorCSAoKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSArIFwKKwkgIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUgKyBcCisJICAobXApLT5tX3NiLnNiX3NlY3RzaXplICsgXAorCSAgWEZTX0FMTE9DRlJFRV9MT0dfUkVTKG1wLCAxKSArIFwKKwkgICgxMjggKiAoMyArIFhGU19BTExPQ0ZSRUVfTE9HX0NPVU5UKG1wLCAxKSkpKSkpCisKKyNkZWZpbmUJWEZTX0xJTktfTE9HX1JFUyhtcCkJKChtcCktPm1fcmVzZXJ2YXRpb25zLnRyX2xpbmspCisKKy8qCisgKiBGb3IgcmVtb3ZpbmcgYSBkaXJlY3RvcnkgZW50cnkgd2UgY2FuIG1vZGlmeToKKyAqICAgIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGlub2RlOiBpbm9kZSBzaXplCisgKiAgICB0aGUgcmVtb3ZlZCBpbm9kZTogaW5vZGUgc2l6ZQorICogICAgdGhlIGRpcmVjdG9yeSBidHJlZSBjb3VsZCBqb2luOiAobWF4IGRlcHRoICsgdjIpICogZGlyIGJsb2NrIHNpemUKKyAqICAgIHRoZSBkaXJlY3RvcnkgYm1hcCBidHJlZSBjb3VsZCBqb2luIG9yIHNwbGl0OiAobWF4IGRlcHRoICsgdjIpICogYmxvY2tzaXplCisgKiBBbmQgdGhlIGJtYXBfZmluaXNoIHRyYW5zYWN0aW9uIGNhbiBmcmVlIHRoZSBkaXIgYW5kIGJtYXAgYmxvY2tzIGdpdmluZzoKKyAqICAgIHRoZSBhZ2YgZm9yIHRoZSBhZyBpbiB3aGljaCB0aGUgYmxvY2tzIGxpdmU6IDIgKiBzZWN0b3Igc2l6ZQorICogICAgdGhlIGFnZmwgZm9yIHRoZSBhZyBpbiB3aGljaCB0aGUgYmxvY2tzIGxpdmU6IDIgKiBzZWN0b3Igc2l6ZQorICogICAgdGhlIHN1cGVyYmxvY2sgZm9yIHRoZSBmcmVlIGJsb2NrIGNvdW50OiBzZWN0b3Igc2l6ZQorICogICAgdGhlIGFsbG9jYXRpb24gYnRyZWVzOiAyIGV4dHMgKiAyIHRyZWVzICogKDIgKiBtYXggZGVwdGggLSAxKSAqIGJsb2NrIHNpemUKKyAqLworI2RlZmluZQlYRlNfQ0FMQ19SRU1PVkVfTE9HX1JFUyhtcCkJXAorCShNQVgoIFwKKwkgKChtcCktPm1fc2Iuc2JfaW5vZGVzaXplICsgXAorCSAgKG1wKS0+bV9zYi5zYl9pbm9kZXNpemUgKyBcCisJICBYRlNfRElST1BfTE9HX1JFUyhtcCkgKyBcCisJICAoMTI4ICogKDIgKyBYRlNfRElST1BfTE9HX0NPVU5UKG1wKSkpKSwgXAorCSAoKDIgKiAobXApLT5tX3NiLnNiX3NlY3RzaXplKSArIFwKKwkgICgyICogKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSkgKyBcCisJICAobXApLT5tX3NiLnNiX3NlY3RzaXplICsgXAorCSAgWEZTX0FMTE9DRlJFRV9MT0dfUkVTKG1wLCAyKSArIFwKKwkgICgxMjggKiAoNSArIFhGU19BTExPQ0ZSRUVfTE9HX0NPVU5UKG1wLCAyKSkpKSkpCisKKyNkZWZpbmUJWEZTX1JFTU9WRV9MT0dfUkVTKG1wKQkoKG1wKS0+bV9yZXNlcnZhdGlvbnMudHJfcmVtb3ZlKQorCisvKgorICogRm9yIHN5bWxpbmsgd2UgY2FuIG1vZGlmeToKKyAqICAgIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGlub2RlOiBpbm9kZSBzaXplCisgKiAgICB0aGUgbmV3IGlub2RlOiBpbm9kZSBzaXplCisgKiAgICB0aGUgaW5vZGUgYnRyZWUgZW50cnk6IDEgYmxvY2sKKyAqICAgIHRoZSBkaXJlY3RvcnkgYnRyZWU6IChtYXggZGVwdGggKyB2MikgKiBkaXIgYmxvY2sgc2l6ZQorICogICAgdGhlIGRpcmVjdG9yeSBpbm9kZVwncyBibWFwIGJ0cmVlOiAobWF4IGRlcHRoICsgdjIpICogYmxvY2sgc2l6ZQorICogICAgdGhlIGJsb2NrcyBmb3IgdGhlIHN5bWxpbms6IDEgS0IKKyAqIE9yIGluIHRoZSBmaXJzdCB4YWN0IHdlIGFsbG9jYXRlIHNvbWUgaW5vZGVzIGdpdmluZzoKKyAqICAgIHRoZSBhZ2kgYW5kIGFnZiBvZiB0aGUgYWcgZ2V0dGluZyB0aGUgbmV3IGlub2RlczogMiAqIHNlY3RvcnNpemUKKyAqICAgIHRoZSBpbm9kZSBibG9ja3MgYWxsb2NhdGVkOiBYRlNfSUFMTE9DX0JMT0NLUyAqIGJsb2Nrc2l6ZQorICogICAgdGhlIGlub2RlIGJ0cmVlOiBtYXggZGVwdGggKiBibG9ja3NpemUKKyAqICAgIHRoZSBhbGxvY2F0aW9uIGJ0cmVlczogMiB0cmVlcyAqICgyICogbWF4IGRlcHRoIC0gMSkgKiBibG9jayBzaXplCisgKi8KKyNkZWZpbmUJWEZTX0NBTENfU1lNTElOS19MT0dfUkVTKG1wKQkJXAorCShNQVgoIFwKKwkgKChtcCktPm1fc2Iuc2JfaW5vZGVzaXplICsgXAorCSAgKG1wKS0+bV9zYi5zYl9pbm9kZXNpemUgKyBcCisJICBYRlNfRlNCX1RPX0IobXAsIDEpICsgXAorCSAgWEZTX0RJUk9QX0xPR19SRVMobXApICsgXAorCSAgMTAyNCArIFwKKwkgICgxMjggKiAoNCArIFhGU19ESVJPUF9MT0dfQ09VTlQobXApKSkpLCBcCisJICgyICogKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSArIFwKKwkgIFhGU19GU0JfVE9fQigobXApLCBYRlNfSUFMTE9DX0JMT0NLUygobXApKSkgKyBcCisJICBYRlNfRlNCX1RPX0IoKG1wKSwgWEZTX0lOX01BWExFVkVMUyhtcCkpICsgXAorCSAgWEZTX0FMTE9DRlJFRV9MT0dfUkVTKG1wLCAxKSArIFwKKwkgICgxMjggKiAoMiArIFhGU19JQUxMT0NfQkxPQ0tTKG1wKSArIFhGU19JTl9NQVhMRVZFTFMobXApICsgXAorCSAgIFhGU19BTExPQ0ZSRUVfTE9HX0NPVU5UKG1wLCAxKSkpKSkpCisKKyNkZWZpbmUJWEZTX1NZTUxJTktfTE9HX1JFUyhtcCkJKChtcCktPm1fcmVzZXJ2YXRpb25zLnRyX3N5bWxpbmspCisKKy8qCisgKiBGb3IgY3JlYXRlIHdlIGNhbiBtb2RpZnk6CisgKiAgICB0aGUgcGFyZW50IGRpcmVjdG9yeSBpbm9kZTogaW5vZGUgc2l6ZQorICogICAgdGhlIG5ldyBpbm9kZTogaW5vZGUgc2l6ZQorICogICAgdGhlIGlub2RlIGJ0cmVlIGVudHJ5OiBibG9jayBzaXplCisgKiAgICB0aGUgc3VwZXJibG9jayBmb3IgdGhlIG5saW5rIGZsYWc6IHNlY3RvciBzaXplCisgKiAgICB0aGUgZGlyZWN0b3J5IGJ0cmVlOiAobWF4IGRlcHRoICsgdjIpICogZGlyIGJsb2NrIHNpemUKKyAqICAgIHRoZSBkaXJlY3RvcnkgaW5vZGVcJ3MgYm1hcCBidHJlZTogKG1heCBkZXB0aCArIHYyKSAqIGJsb2NrIHNpemUKKyAqIE9yIGluIHRoZSBmaXJzdCB4YWN0IHdlIGFsbG9jYXRlIHNvbWUgaW5vZGVzIGdpdmluZzoKKyAqICAgIHRoZSBhZ2kgYW5kIGFnZiBvZiB0aGUgYWcgZ2V0dGluZyB0aGUgbmV3IGlub2RlczogMiAqIHNlY3RvcnNpemUKKyAqICAgIHRoZSBzdXBlcmJsb2NrIGZvciB0aGUgbmxpbmsgZmxhZzogc2VjdG9yIHNpemUKKyAqICAgIHRoZSBpbm9kZSBibG9ja3MgYWxsb2NhdGVkOiBYRlNfSUFMTE9DX0JMT0NLUyAqIGJsb2Nrc2l6ZQorICogICAgdGhlIGlub2RlIGJ0cmVlOiBtYXggZGVwdGggKiBibG9ja3NpemUKKyAqICAgIHRoZSBhbGxvY2F0aW9uIGJ0cmVlczogMiB0cmVlcyAqIChtYXggZGVwdGggLSAxKSAqIGJsb2NrIHNpemUKKyAqLworI2RlZmluZQlYRlNfQ0FMQ19DUkVBVEVfTE9HX1JFUyhtcCkJCVwKKwkoTUFYKCBcCisJICgobXApLT5tX3NiLnNiX2lub2Rlc2l6ZSArIFwKKwkgIChtcCktPm1fc2Iuc2JfaW5vZGVzaXplICsgXAorCSAgKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSArIFwKKwkgIFhGU19GU0JfVE9fQihtcCwgMSkgKyBcCisJICBYRlNfRElST1BfTE9HX1JFUyhtcCkgKyBcCisJICAoMTI4ICogKDMgKyBYRlNfRElST1BfTE9HX0NPVU5UKG1wKSkpKSwgXAorCSAoMyAqIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUgKyBcCisJICBYRlNfRlNCX1RPX0IoKG1wKSwgWEZTX0lBTExPQ19CTE9DS1MoKG1wKSkpICsgXAorCSAgWEZTX0ZTQl9UT19CKChtcCksIFhGU19JTl9NQVhMRVZFTFMobXApKSArIFwKKwkgIFhGU19BTExPQ0ZSRUVfTE9HX1JFUyhtcCwgMSkgKyBcCisJICAoMTI4ICogKDIgKyBYRlNfSUFMTE9DX0JMT0NLUyhtcCkgKyBYRlNfSU5fTUFYTEVWRUxTKG1wKSArIFwKKwkgICBYRlNfQUxMT0NGUkVFX0xPR19DT1VOVChtcCwgMSkpKSkpKQorCisjZGVmaW5lCVhGU19DUkVBVEVfTE9HX1JFUyhtcCkJKChtcCktPm1fcmVzZXJ2YXRpb25zLnRyX2NyZWF0ZSkKKworLyoKKyAqIE1ha2luZyBhIG5ldyBkaXJlY3RvcnkgaXMgdGhlIHNhbWUgYXMgY3JlYXRpbmcgYSBuZXcgZmlsZS4KKyAqLworI2RlZmluZQlYRlNfQ0FMQ19NS0RJUl9MT0dfUkVTKG1wKQlYRlNfQ0FMQ19DUkVBVEVfTE9HX1JFUyhtcCkKKworI2RlZmluZQlYRlNfTUtESVJfTE9HX1JFUyhtcCkJKChtcCktPm1fcmVzZXJ2YXRpb25zLnRyX21rZGlyKQorCisvKgorICogSW4gZnJlZWluZyBhbiBpbm9kZSB3ZSBjYW4gbW9kaWZ5OgorICogICAgdGhlIGlub2RlIGJlaW5nIGZyZWVkOiBpbm9kZSBzaXplCisgKiAgICB0aGUgc3VwZXIgYmxvY2sgZnJlZSBpbm9kZSBjb3VudGVyOiBzZWN0b3Igc2l6ZQorICogICAgdGhlIGFnaSBoYXNoIGxpc3QgYW5kIGNvdW50ZXJzOiBzZWN0b3Igc2l6ZQorICogICAgdGhlIGlub2RlIGJ0cmVlIGVudHJ5OiBibG9jayBzaXplCisgKiAgICB0aGUgb24gZGlzayBpbm9kZSBiZWZvcmUgb3VycyBpbiB0aGUgYWdpIGhhc2ggbGlzdDogaW5vZGUgY2x1c3RlciBzaXplCisgKiAgICB0aGUgaW5vZGUgYnRyZWU6IG1heCBkZXB0aCAqIGJsb2Nrc2l6ZQorICogICAgdGhlIGFsbG9jYXRpb24gYnRyZWVzOiAyIHRyZWVzICogKG1heCBkZXB0aCAtIDEpICogYmxvY2sgc2l6ZQorICovCisjZGVmaW5lCVhGU19DQUxDX0lGUkVFX0xPR19SRVMobXApIFwKKwkoKG1wKS0+bV9zYi5zYl9pbm9kZXNpemUgKyBcCisJIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUgKyBcCisJIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUgKyBcCisJIFhGU19GU0JfVE9fQigobXApLCAxKSArIFwKKwkgTUFYKChfX3VpbnQxNl90KVhGU19GU0JfVE9fQigobXApLCAxKSwgWEZTX0lOT0RFX0NMVVNURVJfU0laRShtcCkpICsgXAorCSAoMTI4ICogNSkgKyBcCisJICBYRlNfQUxMT0NGUkVFX0xPR19SRVMobXAsIDEpICsgXAorCSAgKDEyOCAqICgyICsgWEZTX0lBTExPQ19CTE9DS1MobXApICsgWEZTX0lOX01BWExFVkVMUyhtcCkgKyBcCisJICAgWEZTX0FMTE9DRlJFRV9MT0dfQ09VTlQobXAsIDEpKSkpCisKKworI2RlZmluZQlYRlNfSUZSRUVfTE9HX1JFUyhtcCkJKChtcCktPm1fcmVzZXJ2YXRpb25zLnRyX2lmcmVlKQorCisvKgorICogV2hlbiBvbmx5IGNoYW5naW5nIHRoZSBpbm9kZSB3ZSBsb2cgdGhlIGlub2RlIGFuZCBwb3NzaWJseSB0aGUgc3VwZXJibG9jaworICogV2UgYWxzbyBhZGQgYSBiaXQgb2Ygc2xvcCBmb3IgdGhlIHRyYW5zYWN0aW9uIHN0dWZmLgorICovCisjZGVmaW5lCVhGU19DQUxDX0lDSEFOR0VfTE9HX1JFUyhtcCkJKChtcCktPm1fc2Iuc2JfaW5vZGVzaXplICsgXAorCQkJCQkgKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSArIDUxMikKKworI2RlZmluZQlYRlNfSUNIQU5HRV9MT0dfUkVTKG1wKQkoKG1wKS0+bV9yZXNlcnZhdGlvbnMudHJfaWNoYW5nZSkKKworLyoKKyAqIEdyb3dpbmcgdGhlIGRhdGEgc2VjdGlvbiBvZiB0aGUgZmlsZXN5c3RlbS4KKyAqCXN1cGVyYmxvY2sKKyAqCWFnaSBhbmQgYWdmCisgKglhbGxvY2F0aW9uIGJ0cmVlcworICovCisjZGVmaW5lCVhGU19DQUxDX0dST1dEQVRBX0xPR19SRVMobXApIFwKKwkoKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSAqIDMgKyBcCisJIFhGU19BTExPQ0ZSRUVfTE9HX1JFUyhtcCwgMSkgKyBcCisJICgxMjggKiAoMyArIFhGU19BTExPQ0ZSRUVfTE9HX0NPVU5UKG1wLCAxKSkpKQorCisjZGVmaW5lCVhGU19HUk9XREFUQV9MT0dfUkVTKG1wKSAgICAoKG1wKS0+bV9yZXNlcnZhdGlvbnMudHJfZ3Jvd2RhdGEpCisKKy8qCisgKiBHcm93aW5nIHRoZSBydCBzZWN0aW9uIG9mIHRoZSBmaWxlc3lzdGVtLgorICogSW4gdGhlIGZpcnN0IHNldCBvZiB0cmFuc2FjdGlvbnMgKEFMTE9DKSB3ZSBhbGxvY2F0ZSBzcGFjZSB0byB0aGUKKyAqIGJpdG1hcCBvciBzdW1tYXJ5IGZpbGVzLgorICoJc3VwZXJibG9jazogc2VjdG9yIHNpemUKKyAqCWFnZiBvZiB0aGUgYWcgZnJvbSB3aGljaCB0aGUgZXh0ZW50IGlzIGFsbG9jYXRlZDogc2VjdG9yIHNpemUKKyAqCWJtYXAgYnRyZWUgZm9yIGJpdG1hcC9zdW1tYXJ5IGlub2RlOiBtYXggZGVwdGggKiBibG9ja3NpemUKKyAqCWJpdG1hcC9zdW1tYXJ5IGlub2RlOiBpbm9kZSBzaXplCisgKglhbGxvY2F0aW9uIGJ0cmVlcyBmb3IgMSBibG9jayBhbGxvYzogMiAqICgyICogbWF4ZGVwdGggLSAxKSAqIGJsb2Nrc2l6ZQorICovCisjZGVmaW5lCVhGU19DQUxDX0dST1dSVEFMTE9DX0xPR19SRVMobXApIFwKKwkoMiAqIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUgKyBcCisJIFhGU19GU0JfVE9fQigobXApLCBYRlNfQk1fTUFYTEVWRUxTKG1wLCBYRlNfREFUQV9GT1JLKSkgKyBcCisJIChtcCktPm1fc2Iuc2JfaW5vZGVzaXplICsgXAorCSBYRlNfQUxMT0NGUkVFX0xPR19SRVMobXAsIDEpICsgXAorCSAoMTI4ICogXAorCSAgKDMgKyBYRlNfQk1fTUFYTEVWRUxTKG1wLCBYRlNfREFUQV9GT1JLKSArIFwKKwkgICBYRlNfQUxMT0NGUkVFX0xPR19DT1VOVChtcCwgMSkpKSkKKworI2RlZmluZQlYRlNfR1JPV1JUQUxMT0NfTE9HX1JFUyhtcCkJKChtcCktPm1fcmVzZXJ2YXRpb25zLnRyX2dyb3dydGFsbG9jKQorCisvKgorICogR3Jvd2luZyB0aGUgcnQgc2VjdGlvbiBvZiB0aGUgZmlsZXN5c3RlbS4KKyAqIEluIHRoZSBzZWNvbmQgc2V0IG9mIHRyYW5zYWN0aW9ucyAoWkVSTykgd2UgemVybyB0aGUgbmV3IG1ldGFkYXRhIGJsb2Nrcy4KKyAqCW9uZSBiaXRtYXAvc3VtbWFyeSBibG9jazogYmxvY2tzaXplCisgKi8KKyNkZWZpbmUJWEZTX0NBTENfR1JPV1JUWkVST19MT0dfUkVTKG1wKSBcCisJKChtcCktPm1fc2Iuc2JfYmxvY2tzaXplICsgMTI4KQorCisjZGVmaW5lCVhGU19HUk9XUlRaRVJPX0xPR19SRVMobXApCSgobXApLT5tX3Jlc2VydmF0aW9ucy50cl9ncm93cnR6ZXJvKQorCisvKgorICogR3Jvd2luZyB0aGUgcnQgc2VjdGlvbiBvZiB0aGUgZmlsZXN5c3RlbS4KKyAqIEluIHRoZSB0aGlyZCBzZXQgb2YgdHJhbnNhY3Rpb25zIChGUkVFKSB3ZSB1cGRhdGUgbWV0YWRhdGEgd2l0aG91dAorICogYWxsb2NhdGluZyBhbnkgbmV3IGJsb2Nrcy4KKyAqCXN1cGVyYmxvY2s6IHNlY3RvciBzaXplCisgKgliaXRtYXAgaW5vZGU6IGlub2RlIHNpemUKKyAqCXN1bW1hcnkgaW5vZGU6IGlub2RlIHNpemUKKyAqCW9uZSBiaXRtYXAgYmxvY2s6IGJsb2Nrc2l6ZQorICoJc3VtbWFyeSBibG9ja3M6IG5ldyBzdW1tYXJ5IHNpemUKKyAqLworI2RlZmluZQlYRlNfQ0FMQ19HUk9XUlRGUkVFX0xPR19SRVMobXApIFwKKwkoKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSArIFwKKwkgMiAqIChtcCktPm1fc2Iuc2JfaW5vZGVzaXplICsgXAorCSAobXApLT5tX3NiLnNiX2Jsb2Nrc2l6ZSArIFwKKwkgKG1wKS0+bV9yc3Vtc2l6ZSArIFwKKwkgKDEyOCAqIDUpKQorCisjZGVmaW5lCVhGU19HUk9XUlRGUkVFX0xPR19SRVMobXApCSgobXApLT5tX3Jlc2VydmF0aW9ucy50cl9ncm93cnRmcmVlKQorCisvKgorICogTG9nZ2luZyB0aGUgaW5vZGUgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCBvbiBhIHN5bmNocm9ub3VzIHdyaXRlLgorICoJaW5vZGUKKyAqLworI2RlZmluZQlYRlNfQ0FMQ19TV1JJVEVfTE9HX1JFUyhtcCkgXAorCSgobXApLT5tX3NiLnNiX2lub2Rlc2l6ZSArIDEyOCkKKworI2RlZmluZQlYRlNfU1dSSVRFX0xPR19SRVMobXApCSgobXApLT5tX3Jlc2VydmF0aW9ucy50cl9zd3JpdGUpCisKKy8qCisgKiBMb2dnaW5nIHRoZSBpbm9kZSB0aW1lc3RhbXBzIG9uIGFuIGZzeW5jIC0tIHNhbWUgYXMgU1dSSVRFCisgKiBhcyBsb25nIGFzIFNXUklURSBsb2dzIHRoZSBlbnRpcmUgaW5vZGUgY29yZQorICovCisjZGVmaW5lIFhGU19GU1lOQ19UU19MT0dfUkVTKG1wKSAgICAgICAgKChtcCktPm1fcmVzZXJ2YXRpb25zLnRyX3N3cml0ZSkKKworLyoKKyAqIExvZ2dpbmcgdGhlIGlub2RlIG1vZGUgYml0cyB3aGVuIHdyaXRpbmcgYSBzZXR1aWQvc2V0Z2lkIGZpbGUKKyAqCWlub2RlCisgKi8KKyNkZWZpbmUJWEZTX0NBTENfV1JJVEVJRF9MT0dfUkVTKG1wKSBcCisJKChtcCktPm1fc2Iuc2JfaW5vZGVzaXplICsgMTI4KQorCisjZGVmaW5lCVhGU19XUklURUlEX0xPR19SRVMobXApCSgobXApLT5tX3Jlc2VydmF0aW9ucy50cl9zd3JpdGUpCisKKy8qCisgKiBDb252ZXJ0aW5nIHRoZSBpbm9kZSBmcm9tIG5vbi1hdHRyaWJ1dGVkIHRvIGF0dHJpYnV0ZWQuCisgKgl0aGUgaW5vZGUgYmVpbmcgY29udmVydGVkOiBpbm9kZSBzaXplCisgKglhZ2YgYmxvY2sgYW5kIHN1cGVyYmxvY2sgKGZvciBibG9jayBhbGxvY2F0aW9uKQorICoJdGhlIG5ldyBibG9jayAoZGlyZWN0b3J5IHNpemVkKQorICoJYm1hcCBibG9ja3MgZm9yIHRoZSBuZXcgZGlyZWN0b3J5IGJsb2NrCisgKglhbGxvY2F0aW9uIGJ0cmVlcworICovCisjZGVmaW5lCVhGU19DQUxDX0FEREFGT1JLX0xPR19SRVMobXApCVwKKwkoKG1wKS0+bV9zYi5zYl9pbm9kZXNpemUgKyBcCisJIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUgKiAyICsgXAorCSAobXApLT5tX2RpcmJsa3NpemUgKyBcCisJIChYRlNfRElSX0lTX1YxKG1wKSA/IDAgOiBcCisJICAgIFhGU19GU0JfVE9fQihtcCwgKFhGU19EQUVOVEVSX0JNQVAxQihtcCwgWEZTX0RBVEFfRk9SSykgKyAxKSkpICsgXAorCSBYRlNfQUxMT0NGUkVFX0xPR19SRVMobXAsIDEpICsgXAorCSAoMTI4ICogKDQgKyBcCisJCSAoWEZTX0RJUl9JU19WMShtcCkgPyAwIDogXAorCQkJIFhGU19EQUVOVEVSX0JNQVAxQihtcCwgWEZTX0RBVEFfRk9SSykgKyAxKSArIFwKKwkJIFhGU19BTExPQ0ZSRUVfTE9HX0NPVU5UKG1wLCAxKSkpKQorCisjZGVmaW5lCVhGU19BRERBRk9SS19MT0dfUkVTKG1wKQkoKG1wKS0+bV9yZXNlcnZhdGlvbnMudHJfYWRkYWZvcmspCisKKy8qCisgKiBSZW1vdmluZyB0aGUgYXR0cmlidXRlIGZvcmsgb2YgYSBmaWxlCisgKiAgICB0aGUgaW5vZGUgYmVpbmcgdHJ1bmNhdGVkOiBpbm9kZSBzaXplCisgKiAgICB0aGUgaW5vZGVcJ3MgYm1hcCBidHJlZTogbWF4IGRlcHRoICogYmxvY2sgc2l6ZQorICogQW5kIHRoZSBibWFwX2ZpbmlzaCB0cmFuc2FjdGlvbiBjYW4gZnJlZSB0aGUgYmxvY2tzIGFuZCBibWFwIGJsb2NrczoKKyAqICAgIHRoZSBhZ2YgZm9yIGVhY2ggb2YgdGhlIGFnczogNCAqIHNlY3RvciBzaXplCisgKiAgICB0aGUgYWdmbCBmb3IgZWFjaCBvZiB0aGUgYWdzOiA0ICogc2VjdG9yIHNpemUKKyAqICAgIHRoZSBzdXBlciBibG9jayB0byByZWZsZWN0IHRoZSBmcmVlZCBibG9ja3M6IHNlY3RvciBzaXplCisgKiAgICB3b3JzdCBjYXNlIHNwbGl0IGluIGFsbG9jYXRpb24gYnRyZWVzIHBlciBleHRlbnQgYXNzdW1pbmcgNCBleHRlbnRzOgorICoJCTQgZXh0cyAqIDIgdHJlZXMgKiAoMiAqIG1heCBkZXB0aCAtIDEpICogYmxvY2sgc2l6ZQorICovCisjZGVmaW5lCVhGU19DQUxDX0FUVFJJTlZBTF9MT0dfUkVTKG1wKQlcCisJKE1BWCggXAorCSAoKG1wKS0+bV9zYi5zYl9pbm9kZXNpemUgKyBcCisJICBYRlNfRlNCX1RPX0IoKG1wKSwgWEZTX0JNX01BWExFVkVMUyhtcCwgWEZTX0FUVFJfRk9SSykpICsgXAorCSAgKDEyOCAqICgxICsgWEZTX0JNX01BWExFVkVMUyhtcCwgWEZTX0FUVFJfRk9SSykpKSksIFwKKwkgKCg0ICogKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSkgKyBcCisJICAoNCAqIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUpICsgXAorCSAgKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSArIFwKKwkgIFhGU19BTExPQ0ZSRUVfTE9HX1JFUyhtcCwgNCkgKyBcCisJICAoMTI4ICogKDkgKyBYRlNfQUxMT0NGUkVFX0xPR19DT1VOVChtcCwgNCkpKSkpKQorCisjZGVmaW5lCVhGU19BVFRSSU5WQUxfTE9HX1JFUyhtcCkJKChtcCktPm1fcmVzZXJ2YXRpb25zLnRyX2F0dHJpbnZhbCkKKworLyoKKyAqIFNldHRpbmcgYW4gYXR0cmlidXRlLgorICoJdGhlIGlub2RlIGdldHRpbmcgdGhlIGF0dHJpYnV0ZQorICoJdGhlIHN1cGVyYmxvY2sgZm9yIGFsbG9jYXRpb25zCisgKgl0aGUgYWdmcyBleHRlbnRzIGFyZSBhbGxvY2F0ZWQgZnJvbQorICoJdGhlIGF0dHJpYnV0ZSBidHJlZSAqIG1heCBkZXB0aAorICoJdGhlIGlub2RlIGFsbG9jYXRpb24gYnRyZWUKKyAqIFNpbmNlIGF0dHJpYnV0ZSB0cmFuc2FjdGlvbiBzcGFjZSBpcyBkZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlIGF0dHJpYnV0ZSwKKyAqIHRoZSBjYWxjdWxhdGlvbiBpcyBkb25lIHBhcnRpYWxseSBhdCBtb3VudCB0aW1lIGFuZCBwYXJ0aWFsbHkgYXQgcnVudGltZS4KKyAqLworI2RlZmluZQlYRlNfQ0FMQ19BVFRSU0VUX0xPR19SRVMobXApCVwKKwkoKG1wKS0+bV9zYi5zYl9pbm9kZXNpemUgKyBcCisJIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUgKyBcCisJICBYRlNfRlNCX1RPX0IoKG1wKSwgWEZTX0RBX05PREVfTUFYREVQVEgpICsgXAorCSAgKDEyOCAqICgyICsgWEZTX0RBX05PREVfTUFYREVQVEgpKSkKKworI2RlZmluZQlYRlNfQVRUUlNFVF9MT0dfUkVTKG1wLCBleHQpCVwKKwkoKG1wKS0+bV9yZXNlcnZhdGlvbnMudHJfYXR0cnNldCArIFwKKwkgKGV4dCAqIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUpICsgXAorCSAoZXh0ICogWEZTX0ZTQl9UT19CKChtcCksIFhGU19CTV9NQVhMRVZFTFMobXAsIFhGU19BVFRSX0ZPUkspKSkgKyBcCisJICgxMjggKiAoZXh0ICsgKGV4dCAqIFhGU19CTV9NQVhMRVZFTFMobXAsIFhGU19BVFRSX0ZPUkspKSkpKQorCisvKgorICogUmVtb3ZpbmcgYW4gYXR0cmlidXRlLgorICogICAgdGhlIGlub2RlOiBpbm9kZSBzaXplCisgKiAgICB0aGUgYXR0cmlidXRlIGJ0cmVlIGNvdWxkIGpvaW46IG1heCBkZXB0aCAqIGJsb2NrIHNpemUKKyAqICAgIHRoZSBpbm9kZSBibWFwIGJ0cmVlIGNvdWxkIGpvaW4gb3Igc3BsaXQ6IG1heCBkZXB0aCAqIGJsb2NrIHNpemUKKyAqIEFuZCB0aGUgYm1hcF9maW5pc2ggdHJhbnNhY3Rpb24gY2FuIGZyZWUgdGhlIGF0dHIgYmxvY2tzIGZyZWVkIGdpdmluZzoKKyAqICAgIHRoZSBhZ2YgZm9yIHRoZSBhZyBpbiB3aGljaCB0aGUgYmxvY2tzIGxpdmU6IDIgKiBzZWN0b3Igc2l6ZQorICogICAgdGhlIGFnZmwgZm9yIHRoZSBhZyBpbiB3aGljaCB0aGUgYmxvY2tzIGxpdmU6IDIgKiBzZWN0b3Igc2l6ZQorICogICAgdGhlIHN1cGVyYmxvY2sgZm9yIHRoZSBmcmVlIGJsb2NrIGNvdW50OiBzZWN0b3Igc2l6ZQorICogICAgdGhlIGFsbG9jYXRpb24gYnRyZWVzOiAyIGV4dHMgKiAyIHRyZWVzICogKDIgKiBtYXggZGVwdGggLSAxKSAqIGJsb2NrIHNpemUKKyAqLworI2RlZmluZQlYRlNfQ0FMQ19BVFRSUk1fTE9HX1JFUyhtcCkJXAorCShNQVgoIFwKKwkgICgobXApLT5tX3NiLnNiX2lub2Rlc2l6ZSArIFwKKwkgIFhGU19GU0JfVE9fQigobXApLCBYRlNfREFfTk9ERV9NQVhERVBUSCkgKyBcCisJICBYRlNfRlNCX1RPX0IoKG1wKSwgWEZTX0JNX01BWExFVkVMUyhtcCwgWEZTX0FUVFJfRk9SSykpICsgXAorCSAgKDEyOCAqICgxICsgWEZTX0RBX05PREVfTUFYREVQVEggKyBYRlNfQk1fTUFYTEVWRUxTKG1wLCBYRlNfREFUQV9GT1JLKSkpKSwgXAorCSAoKDIgKiAobXApLT5tX3NiLnNiX3NlY3RzaXplKSArIFwKKwkgICgyICogKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSkgKyBcCisJICAobXApLT5tX3NiLnNiX3NlY3RzaXplICsgXAorCSAgWEZTX0FMTE9DRlJFRV9MT0dfUkVTKG1wLCAyKSArIFwKKwkgICgxMjggKiAoNSArIFhGU19BTExPQ0ZSRUVfTE9HX0NPVU5UKG1wLCAyKSkpKSkpCisKKyNkZWZpbmUJWEZTX0FUVFJSTV9MT0dfUkVTKG1wKQkoKG1wKS0+bV9yZXNlcnZhdGlvbnMudHJfYXR0cnJtKQorCisvKgorICogQ2xlYXJpbmcgYSBiYWQgYWdpbm8gbnVtYmVyIGluIGFuIGFnaSBoYXNoIGJ1Y2tldC4KKyAqLworI2RlZmluZQlYRlNfQ0FMQ19DTEVBUl9BR0lfQlVDS0VUX0xPR19SRVMobXApIFwKKwkoKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSArIDEyOCkKKworI2RlZmluZQlYRlNfQ0xFQVJfQUdJX0JVQ0tFVF9MT0dfUkVTKG1wKSAgKChtcCktPm1fcmVzZXJ2YXRpb25zLnRyX2NsZWFyYWdpKQorCisKKy8qCisgKiBWYXJpb3VzIGxvZyBjb3VudCB2YWx1ZXMuCisgKi8KKyNkZWZpbmUJWEZTX0RFRkFVTFRfTE9HX0NPVU5UCQkxCisjZGVmaW5lCVhGU19ERUZBVUxUX1BFUk1fTE9HX0NPVU5UCTIKKyNkZWZpbmUJWEZTX0lUUlVOQ0FURV9MT0dfQ09VTlQJCTIKKyNkZWZpbmUgWEZTX0lOQUNUSVZFX0xPR19DT1VOVAkJMgorI2RlZmluZQlYRlNfQ1JFQVRFX0xPR19DT1VOVAkJMgorI2RlZmluZQlYRlNfTUtESVJfTE9HX0NPVU5UCQkzCisjZGVmaW5lCVhGU19TWU1MSU5LX0xPR19DT1VOVAkJMworI2RlZmluZQlYRlNfUkVNT1ZFX0xPR19DT1VOVAkJMgorI2RlZmluZQlYRlNfTElOS19MT0dfQ09VTlQJCTIKKyNkZWZpbmUJWEZTX1JFTkFNRV9MT0dfQ09VTlQJCTIKKyNkZWZpbmUJWEZTX1dSSVRFX0xPR19DT1VOVAkJMgorI2RlZmluZQlYRlNfQUREQUZPUktfTE9HX0NPVU5UCQkyCisjZGVmaW5lCVhGU19BVFRSSU5WQUxfTE9HX0NPVU5UCQkxCisjZGVmaW5lCVhGU19BVFRSU0VUX0xPR19DT1VOVAkJMworI2RlZmluZQlYRlNfQVRUUlJNX0xPR19DT1VOVAkJMworCisvKgorICogSGVyZSB3ZSBjZW50cmFsaXplIHRoZSBzcGVjaWZpY2F0aW9uIG9mIFhGUyBtZXRhLWRhdGEgYnVmZmVyCisgKiByZWZlcmVuY2UgY291bnQgdmFsdWVzLiAgVGhpcyBkZXRlcm1pbmUgaG93IGhhcmQgdGhlIGJ1ZmZlcgorICogY2FjaGUgdHJpZXMgdG8gaG9sZCBvbnRvIHRoZSBidWZmZXIuCisgKi8KKyNkZWZpbmUJWEZTX0FHRl9SRUYJCTQKKyNkZWZpbmUJWEZTX0FHSV9SRUYJCTQKKyNkZWZpbmUJWEZTX0FHRkxfUkVGCQkzCisjZGVmaW5lCVhGU19JTk9fQlRSRUVfUkVGCTMKKyNkZWZpbmUJWEZTX0FMTE9DX0JUUkVFX1JFRgkyCisjZGVmaW5lCVhGU19CTUFQX0JUUkVFX1JFRgkyCisjZGVmaW5lCVhGU19ESVJfQlRSRUVfUkVGCTIKKyNkZWZpbmUJWEZTX0FUVFJfQlRSRUVfUkVGCTEKKyNkZWZpbmUJWEZTX0lOT19SRUYJCTEKKyNkZWZpbmUJWEZTX0RRVU9UX1JFRgkJMQorCisjaWZkZWYgX19LRVJORUxfXworLyoKKyAqIFhGUyB0cmFuc2FjdGlvbiBtZWNoYW5pc20gZXhwb3J0ZWQgaW50ZXJmYWNlcyB0aGF0IGFyZQorICogYWN0dWFsbHkgbWFjcm9zLgorICovCisjZGVmaW5lCXhmc190cmFuc19nZXRfbG9nX3Jlcyh0cCkJKCh0cCktPnRfbG9nX3JlcykKKyNkZWZpbmUJeGZzX3RyYW5zX2dldF9sb2dfY291bnQodHApCSgodHApLT50X2xvZ19jb3VudCkKKyNkZWZpbmUJeGZzX3RyYW5zX2dldF9ibG9ja19yZXModHApCSgodHApLT50X2Jsa19yZXMpCisjZGVmaW5lCXhmc190cmFuc19zZXRfc3luYyh0cCkJCSgodHApLT50X2ZsYWdzIHw9IFhGU19UUkFOU19TWU5DKQorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUJeGZzX3RyYW5zX2FnYmxvY2tzX2RlbHRhKHRwLCBkKQkoKHRwKS0+dF9hZ19mcmVlYmxrc19kZWx0YSArPSAobG9uZylkKQorI2RlZmluZQl4ZnNfdHJhbnNfYWdmbGlzdF9kZWx0YSh0cCwgZCkJKCh0cCktPnRfYWdfZmxpc3RfZGVsdGEgKz0gKGxvbmcpZCkKKyNkZWZpbmUJeGZzX3RyYW5zX2FnYnRyZWVfZGVsdGEodHAsIGQpCSgodHApLT50X2FnX2J0cmVlX2RlbHRhICs9IChsb25nKWQpCisjZWxzZQorI2RlZmluZQl4ZnNfdHJhbnNfYWdibG9ja3NfZGVsdGEodHAsIGQpCisjZGVmaW5lCXhmc190cmFuc19hZ2ZsaXN0X2RlbHRhKHRwLCBkKQorI2RlZmluZQl4ZnNfdHJhbnNfYWdidHJlZV9kZWx0YSh0cCwgZCkKKyNlbmRpZgorCisvKgorICogWEZTIHRyYW5zYWN0aW9uIG1lY2hhbmlzbSBleHBvcnRlZCBpbnRlcmZhY2VzLgorICovCit2b2lkCQl4ZnNfdHJhbnNfaW5pdChzdHJ1Y3QgeGZzX21vdW50ICopOworeGZzX3RyYW5zX3QJKnhmc190cmFuc19hbGxvYyhzdHJ1Y3QgeGZzX21vdW50ICosIHVpbnQpOworeGZzX3RyYW5zX3QJKl94ZnNfdHJhbnNfYWxsb2Moc3RydWN0IHhmc19tb3VudCAqLCB1aW50KTsKK3hmc190cmFuc190CSp4ZnNfdHJhbnNfZHVwKHhmc190cmFuc190ICopOworaW50CQl4ZnNfdHJhbnNfcmVzZXJ2ZSh4ZnNfdHJhbnNfdCAqLCB1aW50LCB1aW50LCB1aW50LAorCQkJCSAgdWludCwgdWludCk7Cit2b2lkCQl4ZnNfdHJhbnNfY2FsbGJhY2soeGZzX3RyYW5zX3QgKiwKKwkJCQkgICB2b2lkICgqKSh4ZnNfdHJhbnNfdCAqLCB2b2lkICopLCB2b2lkICopOwordm9pZAkJeGZzX3RyYW5zX21vZF9zYih4ZnNfdHJhbnNfdCAqLCB1aW50LCBsb25nKTsKK3N0cnVjdCB4ZnNfYnVmCSp4ZnNfdHJhbnNfZ2V0X2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZnRhcmcgKiwgeGZzX2RhZGRyX3QsCisJCQkJICAgaW50LCB1aW50KTsKK2ludAkJeGZzX3RyYW5zX3JlYWRfYnVmKHN0cnVjdCB4ZnNfbW91bnQgKiwgeGZzX3RyYW5zX3QgKiwKKwkJCQkgICBzdHJ1Y3QgeGZzX2J1ZnRhcmcgKiwgeGZzX2RhZGRyX3QsIGludCwgdWludCwKKwkJCQkgICBzdHJ1Y3QgeGZzX2J1ZiAqKik7CitzdHJ1Y3QgeGZzX2J1ZgkqeGZzX3RyYW5zX2dldHNiKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfbW91bnQgKiwgaW50KTsKKwordm9pZAkJeGZzX3RyYW5zX2JyZWxzZSh4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKK3ZvaWQJCXhmc190cmFuc19iam9pbih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKK3ZvaWQJCXhmc190cmFuc19iaG9sZCh4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKK3ZvaWQJCXhmc190cmFuc19iaW52YWwoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7Cit2b2lkCQl4ZnNfdHJhbnNfaW5vZGVfYnVmKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfYnVmICopOwordm9pZAkJeGZzX3RyYW5zX2lub2RlX2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKK3ZvaWQJCXhmc190cmFuc19zdGFsZV9pbm9kZV9idWYoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7Cit2b2lkCQl4ZnNfdHJhbnNfZHF1b3RfYnVmKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfYnVmICosIHVpbnQpOwordm9pZAkJeGZzX3RyYW5zX2lub2RlX2FsbG9jX2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKK2ludAkJeGZzX3RyYW5zX2lnZXQoc3RydWN0IHhmc19tb3VudCAqLCB4ZnNfdHJhbnNfdCAqLAorCQkJICAgICAgIHhmc19pbm9fdCAsIHVpbnQsIHVpbnQsIHN0cnVjdCB4ZnNfaW5vZGUgKiopOwordm9pZAkJeGZzX3RyYW5zX2lqb2luKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfaW5vZGUgKiwgdWludCk7Cit2b2lkCQl4ZnNfdHJhbnNfaWhvbGQoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19pbm9kZSAqKTsKK3ZvaWQJCXhmc190cmFuc19paG9sZF9yZWxlYXNlKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfaW5vZGUgKik7Cit2b2lkCQl4ZnNfdHJhbnNfbG9nX2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqLCB1aW50LCB1aW50KTsKK3ZvaWQJCXhmc190cmFuc19sb2dfaW5vZGUoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19pbm9kZSAqLCB1aW50KTsKK3N0cnVjdCB4ZnNfZWZpX2xvZ19pdGVtCSp4ZnNfdHJhbnNfZ2V0X2VmaSh4ZnNfdHJhbnNfdCAqLCB1aW50KTsKK3ZvaWQJCXhmc19lZmlfcmVsZWFzZShzdHJ1Y3QgeGZzX2VmaV9sb2dfaXRlbSAqLCB1aW50KTsKK3ZvaWQJCXhmc190cmFuc19sb2dfZWZpX2V4dGVudCh4ZnNfdHJhbnNfdCAqLAorCQkJCQkgc3RydWN0IHhmc19lZmlfbG9nX2l0ZW0gKiwKKwkJCQkJIHhmc19mc2Jsb2NrX3QsCisJCQkJCSB4ZnNfZXh0bGVuX3QpOworc3RydWN0IHhmc19lZmRfbG9nX2l0ZW0JKnhmc190cmFuc19nZXRfZWZkKHhmc190cmFuc190ICosCisJCQkJICBzdHJ1Y3QgeGZzX2VmaV9sb2dfaXRlbSAqLAorCQkJCSAgdWludCk7Cit2b2lkCQl4ZnNfdHJhbnNfbG9nX2VmZF9leHRlbnQoeGZzX3RyYW5zX3QgKiwKKwkJCQkJIHN0cnVjdCB4ZnNfZWZkX2xvZ19pdGVtICosCisJCQkJCSB4ZnNfZnNibG9ja190LAorCQkJCQkgeGZzX2V4dGxlbl90KTsKK2ludAkJeGZzX3RyYW5zX2NvbW1pdCh4ZnNfdHJhbnNfdCAqLCB1aW50IGZsYWdzLCB4ZnNfbHNuX3QgKik7Cit2b2lkCQl4ZnNfdHJhbnNfY2FuY2VsKHhmc190cmFuc190ICosIGludCk7Cit2b2lkCQl4ZnNfdHJhbnNfYWlsX2luaXQoc3RydWN0IHhmc19tb3VudCAqKTsKK3hmc19sc25fdAl4ZnNfdHJhbnNfcHVzaF9haWwoc3RydWN0IHhmc19tb3VudCAqLCB4ZnNfbHNuX3QpOworeGZzX2xzbl90CXhmc190cmFuc190YWlsX2FpbChzdHJ1Y3QgeGZzX21vdW50ICopOwordm9pZAkJeGZzX3RyYW5zX3VubG9ja2VkX2l0ZW0oc3RydWN0IHhmc19tb3VudCAqLAorCQkJCQl4ZnNfbG9nX2l0ZW1fdCAqKTsKK3hmc19sb2dfYnVzeV9zbG90X3QgKnhmc190cmFuc19hZGRfYnVzeSh4ZnNfdHJhbnNfdCAqdHAsCisJCQkJCXhmc19hZ251bWJlcl90IGFnLAorCQkJCQl4ZnNfZXh0bGVuX3QgaWR4KTsKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCS8qIF9fWEZTX1RSQU5TX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19haWwuYyBiL2ZzL3hmcy94ZnNfdHJhbnNfYWlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JjNWVhYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnNfYWlsLmMKQEAgLTAsMCArMSw1OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisKK1NUQVRJQyB2b2lkIHhmc19haWxfaW5zZXJ0KHhmc19haWxfZW50cnlfdCAqLCB4ZnNfbG9nX2l0ZW1fdCAqKTsKK1NUQVRJQyB4ZnNfbG9nX2l0ZW1fdCAqIHhmc19haWxfZGVsZXRlKHhmc19haWxfZW50cnlfdCAqLCB4ZnNfbG9nX2l0ZW1fdCAqKTsKK1NUQVRJQyB4ZnNfbG9nX2l0ZW1fdCAqIHhmc19haWxfbWluKHhmc19haWxfZW50cnlfdCAqKTsKK1NUQVRJQyB4ZnNfbG9nX2l0ZW1fdCAqIHhmc19haWxfbmV4dCh4ZnNfYWlsX2VudHJ5X3QgKiwgeGZzX2xvZ19pdGVtX3QgKik7CisKKyNpZmRlZiBERUJVRworU1RBVElDIHZvaWQgeGZzX2FpbF9jaGVjayh4ZnNfYWlsX2VudHJ5X3QgKik7CisjZWxzZQorI2RlZmluZQl4ZnNfYWlsX2NoZWNrKGEpCisjZW5kaWYgLyogREVCVUcgKi8KKworCisvKgorICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGxvZyBtYW5hZ2VyIGNvZGUgdG8gZGV0ZXJtaW5lIHRoZSBMU04KKyAqIG9mIHRoZSB0YWlsIG9mIHRoZSBsb2cuICBUaGlzIGlzIGV4YWN0bHkgdGhlIExTTiBvZiB0aGUgZmlyc3QKKyAqIGl0ZW0gaW4gdGhlIEFJTC4gIElmIHRoZSBBSUwgaXMgZW1wdHksIHRoZW4gdGhpcyBmdW5jdGlvbgorICogcmV0dXJucyAwLgorICoKKyAqIFdlIG5lZWQgdGhlIEFJTCBsb2NrIGluIG9yZGVyIHRvIGdldCBhIGNvaGVyZW50IHJlYWQgb2YgdGhlCisgKiBsc24gb2YgdGhlIGxhc3QgaXRlbSBpbiB0aGUgQUlMLgorICovCit4ZnNfbHNuX3QKK3hmc190cmFuc190YWlsX2FpbCgKKwl4ZnNfbW91bnRfdAkqbXApCit7CisJeGZzX2xzbl90CWxzbjsKKwl4ZnNfbG9nX2l0ZW1fdAkqbGlwOworCVNQTERFQ0wocyk7CisKKwlBSUxfTE9DSyhtcCxzKTsKKwlsaXAgPSB4ZnNfYWlsX21pbigmKG1wLT5tX2FpbCkpOworCWlmIChsaXAgPT0gTlVMTCkgeworCQlsc24gPSAoeGZzX2xzbl90KTA7CisJfSBlbHNlIHsKKwkJbHNuID0gbGlwLT5saV9sc247CisJfQorCUFJTF9VTkxPQ0sobXAsIHMpOworCisJcmV0dXJuIGxzbjsKK30KKworLyoKKyAqIHhmc190cmFuc19wdXNoX2FpbAorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gbW92ZSB0aGUgdGFpbCBvZiB0aGUgQUlMCisgKiBmb3J3YXJkLiAgSXQgZG9lcyB0aGlzIGJ5IHRyeWluZyB0byBmbHVzaCBpdGVtcyBpbiB0aGUgQUlMCisgKiB3aG9zZSBsc25zIGFyZSBiZWxvdyB0aGUgZ2l2ZW4gdGhyZXNob2xkX2xzbi4KKyAqCisgKiBUaGUgcm91dGluZSByZXR1cm5zIHRoZSBsc24gb2YgdGhlIHRhaWwgb2YgdGhlIGxvZy4KKyAqLworeGZzX2xzbl90Cit4ZnNfdHJhbnNfcHVzaF9haWwoCisJeGZzX21vdW50X3QJCSptcCwKKwl4ZnNfbHNuX3QJCXRocmVzaG9sZF9sc24pCit7CisJeGZzX2xzbl90CQlsc247CisJeGZzX2xvZ19pdGVtX3QJCSpsaXA7CisJaW50CQkJZ2VuOworCWludAkJCXJlc3RhcnRzOworCWludAkJCWxvY2tfcmVzdWx0OworCWludAkJCWZsdXNoX2xvZzsKKwlTUExERUNMKHMpOworCisjZGVmaW5lCVhGU19UUkFOU19QVVNIX0FJTF9SRVNUQVJUUwkxMAorCisJQUlMX0xPQ0sobXAscyk7CisJbGlwID0geGZzX3RyYW5zX2ZpcnN0X2FpbChtcCwgJmdlbik7CisJaWYgKGxpcCA9PSBOVUxMIHx8IFhGU19GT1JDRURfU0hVVERPV04obXApKSB7CisJCS8qCisJCSAqIEp1c3QgcmV0dXJuIGlmIHRoZSBBSUwgaXMgZW1wdHkuCisJCSAqLworCQlBSUxfVU5MT0NLKG1wLCBzKTsKKwkJcmV0dXJuICh4ZnNfbHNuX3QpMDsKKwl9CisKKwlYRlNfU1RBVFNfSU5DKHhzX3B1c2hfYWlsKTsKKworCS8qCisJICogV2hpbGUgdGhlIGl0ZW0gd2UgYXJlIGxvb2tpbmcgYXQgaXMgYmVsb3cgdGhlIGdpdmVuIHRocmVzaG9sZAorCSAqIHRyeSB0byBmbHVzaCBpdCBvdXQuICBNYWtlIHN1cmUgdG8gbGltaXQgdGhlIG51bWJlciBvZiB0aW1lcworCSAqIHdlIGFsbG93IHhmc190cmFuc19uZXh0X2FpbCgpIHRvIHJlc3RhcnQgc2Nhbm5pbmcgZnJvbSB0aGUKKwkgKiBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuICBXZSdkIGxpa2Ugbm90IHRvIHN0b3AgdW50aWwgd2UndmUgYXQgbGVhc3QKKwkgKiB0cmllZCB0byBwdXNoIG9uIGV2ZXJ5dGhpbmcgaW4gdGhlIEFJTCB3aXRoIGFuIExTTiBsZXNzIHRoYW4KKwkgKiB0aGUgZ2l2ZW4gdGhyZXNob2xkLiBIb3dldmVyLCB3ZSBtYXkgZ2l2ZSB1cCBiZWZvcmUgdGhhdCBpZgorCSAqIHdlIHJlYWxpemUgdGhhdCB3ZSd2ZSBiZWVuIGhvbGRpbmcgdGhlIEFJTF9MT0NLIGZvciAndG9vIGxvbmcnLAorCSAqIGJsb2NraW5nIGludGVycnVwdHMuIEN1cnJlbnRseSwgdG9vIGxvbmcgaXMgPCA1MDB1cyByb3VnaGx5LgorCSAqLworCWZsdXNoX2xvZyA9IDA7CisJcmVzdGFydHMgPSAwOworCXdoaWxlICgoKHJlc3RhcnRzIDwgWEZTX1RSQU5TX1BVU0hfQUlMX1JFU1RBUlRTKSAmJgorCQkoWEZTX0xTTl9DTVAobGlwLT5saV9sc24sIHRocmVzaG9sZF9sc24pIDwgMCkpKSB7CisJCS8qCisJCSAqIElmIHdlIGNhbiBsb2NrIHRoZSBpdGVtIHdpdGhvdXQgc2xlZXBpbmcsIHVubG9jaworCQkgKiB0aGUgQUlMIGxvY2sgYW5kIGZsdXNoIHRoZSBpdGVtLiAgVGhlbiByZS1ncmFiIHRoZQorCQkgKiBBSUwgbG9jayBzbyB3ZSBjYW4gbG9vayBmb3IgdGhlIG5leHQgaXRlbSBvbiB0aGUKKwkJICogQUlMLiAgU2luY2Ugd2UgdW5sb2NrIHRoZSBBSUwgd2hpbGUgd2UgZmx1c2ggdGhlCisJCSAqIGl0ZW0sIHRoZSBuZXh0IHJvdXRpbmUgbWF5IHN0YXJ0IG92ZXIgYWdhaW4gYXQgdGhlCisJCSAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QgaWYgYW55dGhpbmcgaGFzIGNoYW5nZWQuCisJCSAqIFRoYXQgaXMgd2hhdCB0aGUgZ2VuZXJhdGlvbiBjb3VudCBpcyBmb3IuCisJCSAqCisJCSAqIElmIHdlIGNhbid0IGxvY2sgdGhlIGl0ZW0sIGVpdGhlciBpdHMgaG9sZGVyIHdpbGwgZmx1c2gKKwkJICogaXQgb3IgaXQgaXMgYWxyZWFkeSBiZWluZyBmbHVzaGVkIG9yIGl0IGlzIGJlaW5nIHJlbG9nZ2VkLgorCQkgKiBJbiBhbnkgb2YgdGhlc2UgY2FzZSBpdCBpcyBiZWluZyB0YWtlbiBjYXJlIG9mIGFuZCB3ZQorCQkgKiBjYW4ganVzdCBza2lwIHRvIHRoZSBuZXh0IGl0ZW0gaW4gdGhlIGxpc3QuCisJCSAqLworCQlsb2NrX3Jlc3VsdCA9IElPUF9UUllMT0NLKGxpcCk7CisJCXN3aXRjaCAobG9ja19yZXN1bHQpIHsKKwkJICAgICAgY2FzZSBYRlNfSVRFTV9TVUNDRVNTOgorCQkJQUlMX1VOTE9DSyhtcCwgcyk7CisJCQlYRlNfU1RBVFNfSU5DKHhzX3B1c2hfYWlsX3N1Y2Nlc3MpOworCQkJSU9QX1BVU0gobGlwKTsKKwkJCUFJTF9MT0NLKG1wLHMpOworCQkJYnJlYWs7CisKKwkJICAgICAgY2FzZSBYRlNfSVRFTV9QVVNIQlVGOgorCQkJQUlMX1VOTE9DSyhtcCwgcyk7CisJCQlYRlNfU1RBVFNfSU5DKHhzX3B1c2hfYWlsX3B1c2hidWYpOworI2lmZGVmIFhGU1JBQ0VERUJVRworCQkJZGVsYXlfZm9yX2ludHIoKTsKKwkJCWRlbGF5KDMwMCk7CisjZW5kaWYKKwkJCUFTU0VSVChsaXAtPmxpX29wcy0+aW9wX3B1c2hidWYpOworCQkJQVNTRVJUKGxpcCk7CisJCQlJT1BfUFVTSEJVRihsaXApOworCQkJQUlMX0xPQ0sobXAscyk7CisJCQlicmVhazsKKworCQkgICAgICBjYXNlIFhGU19JVEVNX1BJTk5FRDoKKwkJCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfcGlubmVkKTsKKwkJCWZsdXNoX2xvZyA9IDE7CisJCQlicmVhazsKKworCQkgICAgICBjYXNlIFhGU19JVEVNX0xPQ0tFRDoKKwkJCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfbG9ja2VkKTsKKwkJCWJyZWFrOworCisJCSAgICAgIGNhc2UgWEZTX0lURU1fRkxVU0hJTkc6CisJCQlYRlNfU1RBVFNfSU5DKHhzX3B1c2hfYWlsX2ZsdXNoaW5nKTsKKwkJCWJyZWFrOworCisJCSAgICAgIGRlZmF1bHQ6CisJCQlBU1NFUlQoMCk7CisJCQlicmVhazsKKwkJfQorCisJCWxpcCA9IHhmc190cmFuc19uZXh0X2FpbChtcCwgbGlwLCAmZ2VuLCAmcmVzdGFydHMpOworCQlpZiAobGlwID09IE5VTEwpIHsKKwkJCWJyZWFrOworCQl9CisJCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgeworCQkJLyoKKwkJCSAqIEp1c3QgcmV0dXJuIGlmIHdlIHNodXQgZG93biBkdXJpbmcgdGhlIGxhc3QgdHJ5LgorCQkJICovCisJCQlBSUxfVU5MT0NLKG1wLCBzKTsKKwkJCXJldHVybiAoeGZzX2xzbl90KTA7CisJCX0KKworCX0KKworCWlmIChmbHVzaF9sb2cpIHsKKwkJLyoKKwkJICogSWYgc29tZXRoaW5nIHdlIG5lZWQgdG8gcHVzaCBvdXQgd2FzIHBpbm5lZCwgdGhlbgorCQkgKiBwdXNoIG91dCB0aGUgbG9nIHNvIGl0IHdpbGwgYmVjb21lIHVucGlubmVkIGFuZAorCQkgKiBtb3ZlIGZvcndhcmQgaW4gdGhlIEFJTC4KKwkJICovCisJCUFJTF9VTkxPQ0sobXAsIHMpOworCQlYRlNfU1RBVFNfSU5DKHhzX3B1c2hfYWlsX2ZsdXNoKTsKKwkJeGZzX2xvZ19mb3JjZShtcCwgKHhmc19sc25fdCkwLCBYRlNfTE9HX0ZPUkNFKTsKKwkJQUlMX0xPQ0sobXAsIHMpOworCX0KKworCWxpcCA9IHhmc19haWxfbWluKCYobXAtPm1fYWlsKSk7CisJaWYgKGxpcCA9PSBOVUxMKSB7CisJCWxzbiA9ICh4ZnNfbHNuX3QpMDsKKwl9IGVsc2UgeworCQlsc24gPSBsaXAtPmxpX2xzbjsKKwl9CisKKwlBSUxfVU5MT0NLKG1wLCBzKTsKKwlyZXR1cm4gbHNuOworfQkvKiB4ZnNfdHJhbnNfcHVzaF9haWwgKi8KKworCisvKgorICogVGhpcyBpcyB0byBiZSBjYWxsZWQgd2hlbiBhbiBpdGVtIGlzIHVubG9ja2VkIHRoYXQgbWF5IGhhdmUKKyAqIGJlZW4gaW4gdGhlIEFJTC4gIEl0IHdpbGwgd2FrZSB1cCB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBBSUwKKyAqIHdhaXQgbGlzdCBpZiB0aGlzIGl0ZW0ncyB1bmxvY2tpbmcgbWlnaHQgYWxsb3cgaXQgdG8gcHJvZ3Jlc3MuCisgKiBJZiB0aGUgaXRlbSBpcyBpbiB0aGUgQUlMLCB0aGVuIHdlIG5lZWQgdG8gZ2V0IHRoZSBBSUwgbG9jaworICogd2hpbGUgZG9pbmcgb3VyIGNoZWNraW5nIHNvIHdlIGRvbid0IHJhY2Ugd2l0aCBzb21lb25lIGdvaW5nCisgKiB0byBzbGVlcCB3YWl0aW5nIGZvciB0aGlzIGV2ZW50IGluIHhmc190cmFuc19wdXNoX2FpbCgpLgorICovCit2b2lkCit4ZnNfdHJhbnNfdW5sb2NrZWRfaXRlbSgKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2xvZ19pdGVtX3QJKmxpcCkKK3sKKwl4ZnNfbG9nX2l0ZW1fdAkqbWluX2xpcDsKKworCS8qCisJICogSWYgd2UncmUgZm9yY2libHkgc2h1dHRpbmcgZG93biwgd2UgbWF5IGhhdmUKKwkgKiB1bmxvY2tlZCBsb2cgaXRlbXMgYXJiaXRyYXJpbHkuIFRoZSBsYXN0IHRoaW5nCisJICogd2Ugd2FudCB0byBkbyBpcyB0byBtb3ZlIHRoZSB0YWlsIG9mIHRoZSBsb2cKKwkgKiBvdmVyIHNvbWUgcG90ZW50aWFsbHkgdmFsaWQgZGF0YS4KKwkgKi8KKwlpZiAoIShsaXAtPmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkgfHwKKwkgICAgWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogVGhpcyBpcyB0aGUgb25lIGNhc2Ugd2hlcmUgd2UgY2FuIGNhbGwgaW50byB4ZnNfYWlsX21pbigpCisJICogd2l0aG91dCBob2xkaW5nIHRoZSBBSUwgbG9jayBiZWNhdXNlIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUKKwkgKiBjYXNlIHdoZXJlIHdlIGFyZSBhdCB0aGUgdGFpbCBvZiB0aGUgQUlMLiAgSWYgdGhlIG9iamVjdCBpc24ndAorCSAqIGF0IHRoZSB0YWlsLCBpdCBkb2Vzbid0IG1hdHRlciB3aGF0IHJlc3VsdCB3ZSBnZXQgYmFjay4gIFRoaXMKKwkgKiBpcyBzbGlnaHRseSByYWN5IGJlY2F1c2Ugc2luY2Ugd2Ugd2VyZSBqdXN0IHVubG9ja2VkLCB3ZSBjb3VsZAorCSAqIGdvIHRvIHNsZWVwIGJldHdlZW4gdGhlIGNhbGwgdG8geGZzX2FpbF9taW4gYW5kIHRoZSBjYWxsIHRvCisJICogeGZzX2xvZ19tb3ZlX3RhaWwsIGhhdmUgc29tZW9uZSBlbHNlIGxvY2sgdXMsIGNvbW1pdCB0byB1cyBkaXNrLAorCSAqIG1vdmUgdXMgb3V0IG9mIHRoZSB0YWlsIG9mIHRoZSBBSUwsIGFuZCB0aGVuIHdlIHdha2UgdXAuICBIb3dldmVyLAorCSAqIHRoZSBjYWxsIHRvIHhmc19sb2dfbW92ZV90YWlsKCkgZG9lc24ndCBkbyBhbnl0aGluZyBpZiB0aGVyZSdzCisJICogbm90IGVub3VnaCBmcmVlIHNwYWNlIHRvIHdha2UgcGVvcGxlIHVwIHNvIHdlJ3JlIHNhZmUgY2FsbGluZyBpdC4KKwkgKi8KKwltaW5fbGlwID0geGZzX2FpbF9taW4oJm1wLT5tX2FpbCk7CisKKwlpZiAobWluX2xpcCA9PSBsaXApCisJCXhmc19sb2dfbW92ZV90YWlsKG1wLCAxKTsKK30JLyogeGZzX3RyYW5zX3VubG9ja2VkX2l0ZW0gKi8KKworCisvKgorICogVXBkYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbSBpbiB0aGUgQUlMIHdpdGggdGhlIG5ldworICogbHNuLiAgSWYgaXQgaXMgbm90IHlldCBpbiB0aGUgQUlMLCBhZGQgaXQuICBPdGhlcndpc2UsIG1vdmUKKyAqIGl0IHRvIGl0cyBuZXcgcG9zaXRpb24gYnkgcmVtb3ZpbmcgaXQgYW5kIHJlLWFkZGluZyBpdC4KKyAqCisgKiBXYWtldXAgYW55b25lIHdpdGggYW4gbHNuIGxlc3MgdGhhbiB0aGUgaXRlbSdzIGxzbi4gIElmIHRoZSBpdGVtCisgKiB3ZSBtb3ZlIGluIHRoZSBBSUwgaXMgdGhlIG1pbmltdW0gb25lLCB1cGRhdGUgdGhlIHRhaWwgbHNuIGluIHRoZQorICogbG9nIG1hbmFnZXIuCisgKgorICogSW5jcmVtZW50IHRoZSBBSUwncyBnZW5lcmF0aW9uIGNvdW50IHRvIGluZGljYXRlIHRoYXQgdGhlIHRyZWUKKyAqIGhhcyBjaGFuZ2VkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgQUlMIGxvY2sgaGVsZC4gIFRoZSBsb2NrCisgKiBpcyBkcm9wcGVkIGJlZm9yZSByZXR1cm5pbmcsIHNvIHRoZSBjYWxsZXIgbXVzdCBwYXNzIGluIHRoZQorICogY29va2llIHJldHVybmVkIGJ5IEFJTF9MT0NLLgorICovCit2b2lkCit4ZnNfdHJhbnNfdXBkYXRlX2FpbCgKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2xvZ19pdGVtX3QJKmxpcCwKKwl4ZnNfbHNuX3QJbHNuLAorCXVuc2lnbmVkIGxvbmcJcykKK3sKKwl4ZnNfYWlsX2VudHJ5X3QJCSphaWxwOworCXhmc19sb2dfaXRlbV90CQkqZGxpcD1OVUxMOworCXhmc19sb2dfaXRlbV90CQkqbWxpcDsJLyogcHRyIHRvIG1pbmltdW0gbGlwICovCisKKwlhaWxwID0gJihtcC0+bV9haWwpOworCW1saXAgPSB4ZnNfYWlsX21pbihhaWxwKTsKKworCWlmIChsaXAtPmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkgeworCQlkbGlwID0geGZzX2FpbF9kZWxldGUoYWlscCwgbGlwKTsKKwkJQVNTRVJUKGRsaXAgPT0gbGlwKTsKKwl9IGVsc2UgeworCQlsaXAtPmxpX2ZsYWdzIHw9IFhGU19MSV9JTl9BSUw7CisJfQorCisJbGlwLT5saV9sc24gPSBsc247CisKKwl4ZnNfYWlsX2luc2VydChhaWxwLCBsaXApOworCW1wLT5tX2FpbF9nZW4rKzsKKworCWlmIChtbGlwID09IGRsaXApIHsKKwkJbWxpcCA9IHhmc19haWxfbWluKCYobXAtPm1fYWlsKSk7CisJCUFJTF9VTkxPQ0sobXAsIHMpOworCQl4ZnNfbG9nX21vdmVfdGFpbChtcCwgbWxpcC0+bGlfbHNuKTsKKwl9IGVsc2UgeworCQlBSUxfVU5MT0NLKG1wLCBzKTsKKwl9CisKKworfQkvKiB4ZnNfdHJhbnNfdXBkYXRlX2FpbCAqLworCisvKgorICogRGVsZXRlIHRoZSBnaXZlbiBpdGVtIGZyb20gdGhlIEFJTC4gIEl0IG11c3QgYWxyZWFkeSBiZSBpbgorICogdGhlIEFJTC4KKyAqCisgKiBXYWtldXAgYW55b25lIHdpdGggYW4gbHNuIGxlc3MgdGhhbiBpdGVtJ3MgbHNuLiAgICBJZiB0aGUgaXRlbQorICogd2UgZGVsZXRlIGluIHRoZSBBSUwgaXMgdGhlIG1pbmltdW0gb25lLCB1cGRhdGUgdGhlIHRhaWwgbHNuIGluIHRoZQorICogbG9nIG1hbmFnZXIuCisgKgorICogQ2xlYXIgdGhlIElOX0FJTCBmbGFnIGZyb20gdGhlIGl0ZW0sIHJlc2V0IGl0cyBsc24gdG8gMCwgYW5kCisgKiBidW1wIHRoZSBBSUwncyBnZW5lcmF0aW9uIGNvdW50IHRvIGluZGljYXRlIHRoYXQgdGhlIHRyZWUKKyAqIGhhcyBjaGFuZ2VkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgQUlMIGxvY2sgaGVsZC4gIFRoZSBsb2NrCisgKiBpcyBkcm9wcGVkIGJlZm9yZSByZXR1cm5pbmcsIHNvIHRoZSBjYWxsZXIgbXVzdCBwYXNzIGluIHRoZQorICogY29va2llIHJldHVybmVkIGJ5IEFJTF9MT0NLLgorICovCit2b2lkCit4ZnNfdHJhbnNfZGVsZXRlX2FpbCgKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2xvZ19pdGVtX3QJKmxpcCwKKwl1bnNpZ25lZCBsb25nCXMpCit7CisJeGZzX2FpbF9lbnRyeV90CQkqYWlscDsKKwl4ZnNfbG9nX2l0ZW1fdAkJKmRsaXA7CisJeGZzX2xvZ19pdGVtX3QJCSptbGlwOworCisJaWYgKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSB7CisJCWFpbHAgPSAmKG1wLT5tX2FpbCk7CisJCW1saXAgPSB4ZnNfYWlsX21pbihhaWxwKTsKKwkJZGxpcCA9IHhmc19haWxfZGVsZXRlKGFpbHAsIGxpcCk7CisJCUFTU0VSVChkbGlwID09IGxpcCk7CisKKworCQlsaXAtPmxpX2ZsYWdzICY9IH5YRlNfTElfSU5fQUlMOworCQlsaXAtPmxpX2xzbiA9IDA7CisJCW1wLT5tX2FpbF9nZW4rKzsKKworCQlpZiAobWxpcCA9PSBkbGlwKSB7CisJCQltbGlwID0geGZzX2FpbF9taW4oJihtcC0+bV9haWwpKTsKKwkJCUFJTF9VTkxPQ0sobXAsIHMpOworCQkJeGZzX2xvZ19tb3ZlX3RhaWwobXAsIChtbGlwID8gbWxpcC0+bGlfbHNuIDogMCkpOworCQl9IGVsc2UgeworCQkJQUlMX1VOTE9DSyhtcCwgcyk7CisJCX0KKwl9CisJZWxzZSB7CisJCS8qCisJCSAqIElmIHRoZSBmaWxlIHN5c3RlbSBpcyBub3QgYmVpbmcgc2h1dGRvd24sIHdlIGFyZSBpbgorCQkgKiBzZXJpb3VzIHRyb3VibGUgaWYgd2UgZ2V0IHRvIHRoaXMgc3RhZ2UuCisJCSAqLworCQlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCQlBSUxfVU5MT0NLKG1wLCBzKTsKKwkJZWxzZSB7CisJCQl4ZnNfY21uX2VycihYRlNfUFRBR19BSUxERUxFVEUsIENFX0FMRVJULCBtcCwKKwkJCQkieGZzX3RyYW5zX2RlbGV0ZV9haWw6IGF0dGVtcHRpbmcgdG8gZGVsZXRlIGEgbG9nIGl0ZW0gdGhhdCBpcyBub3QgaW4gdGhlIEFJTCIpOworCQkJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBYRlNfQ09SUlVQVF9JTkNPUkUpOworCQkJQUlMX1VOTE9DSyhtcCwgcyk7CisJCX0KKwl9Cit9CisKKworCisvKgorICogUmV0dXJuIHRoZSBpdGVtIGluIHRoZSBBSUwgd2l0aCB0aGUgc21hbGxlc3QgbHNuLgorICogUmV0dXJuIHRoZSBjdXJyZW50IHRyZWUgZ2VuZXJhdGlvbiBudW1iZXIgZm9yIHVzZQorICogaW4gY2FsbHMgdG8geGZzX3RyYW5zX25leHRfYWlsKCkuCisgKi8KK3hmc19sb2dfaXRlbV90ICoKK3hmc190cmFuc19maXJzdF9haWwoCisJeGZzX21vdW50X3QJKm1wLAorCWludAkJKmdlbikKK3sKKwl4ZnNfbG9nX2l0ZW1fdAkqbGlwOworCisJbGlwID0geGZzX2FpbF9taW4oJihtcC0+bV9haWwpKTsKKwkqZ2VuID0gKGludCltcC0+bV9haWxfZ2VuOworCisJcmV0dXJuIChsaXApOworfQorCisvKgorICogSWYgdGhlIGdlbmVyYXRpb24gY291bnQgb2YgdGhlIHRyZWUgaGFzIG5vdCBjaGFuZ2VkIHNpbmNlIHRoZQorICogY2FsbGVyIGxhc3QgdG9vayBzb21ldGhpbmcgZnJvbSB0aGUgQUlMLCB0aGVuIHJldHVybiB0aGUgZWxtdAorICogaW4gdGhlIHRyZWUgd2hpY2ggZm9sbG93cyB0aGUgb25lIGdpdmVuLiAgSWYgdGhlIGNvdW50IGhhcyBjaGFuZ2VkLAorICogdGhlbiByZXR1cm4gdGhlIG1pbmltdW0gZWxtdCBvZiB0aGUgQUlMIGFuZCBidW1wIHRoZSByZXN0YXJ0cyBjb3VudGVyCisgKiBpZiBvbmUgaXMgZ2l2ZW4uCisgKi8KK3hmc19sb2dfaXRlbV90ICoKK3hmc190cmFuc19uZXh0X2FpbCgKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2xvZ19pdGVtX3QJKmxpcCwKKwlpbnQJCSpnZW4sCisJaW50CQkqcmVzdGFydHMpCit7CisJeGZzX2xvZ19pdGVtX3QJKm5saXA7CisKKwlBU1NFUlQobXAgJiYgbGlwICYmIGdlbik7CisJaWYgKG1wLT5tX2FpbF9nZW4gPT0gKmdlbikgeworCQlubGlwID0geGZzX2FpbF9uZXh0KCYobXAtPm1fYWlsKSwgbGlwKTsKKwl9IGVsc2UgeworCQlubGlwID0geGZzX2FpbF9taW4oJihtcC0+bV9haWwpKTsKKwkJKmdlbiA9IChpbnQpbXAtPm1fYWlsX2dlbjsKKwkJaWYgKHJlc3RhcnRzICE9IE5VTEwpIHsKKwkJCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfcmVzdGFydHMpOworCQkJKCpyZXN0YXJ0cykrKzsKKwkJfQorCX0KKworCXJldHVybiAobmxpcCk7Cit9CisKKworLyoKKyAqIFRoZSBhY3RpdmUgaXRlbSBsaXN0IChBSUwpIGlzIGEgZG91Ymx5IGxpbmtlZCBsaXN0IG9mIGxvZworICogaXRlbXMgc29ydGVkIGJ5IGFzY2VuZGluZyBsc24uICBUaGUgYmFzZSBvZiB0aGUgbGlzdCBpcworICogYSBmb3J3L2JhY2sgcG9pbnRlciBwYWlyIGVtYmVkZGVkIGluIHRoZSB4ZnMgbW91bnQgc3RydWN0dXJlLgorICogVGhlIGJhc2UgaXMgaW5pdGlhbGl6ZWQgd2l0aCBib3RoIHBvaW50ZXJzIHBvaW50aW5nIHRvIHRoZQorICogYmFzZS4gIFRoaXMgY2FzZSBhbHdheXMgbmVlZHMgdG8gYmUgZGlzdGluZ3Vpc2hlZCwgYmVjYXVzZQorICogdGhlIGJhc2UgaGFzIG5vIGxzbiB0byBsb29rIGF0LiAgV2UgYWxtb3N0IGFsd2F5cyBpbnNlcnQKKyAqIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QsIHNvIG9uIGluc2VydHMgd2Ugc2VhcmNoIGZyb20gdGhlCisgKiBlbmQgb2YgdGhlIGxpc3QgdG8gZmluZCB3aGVyZSB0aGUgbmV3IGl0ZW0gYmVsb25ncy4KKyAqLworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgZG91Ymx5IGxpbmtlZCBsaXN0IHRvIHBvaW50IG9ubHkgdG8gaXRzZWxmLgorICovCit2b2lkCit4ZnNfdHJhbnNfYWlsX2luaXQoCisJeGZzX21vdW50X3QJKm1wKQoreworCW1wLT5tX2FpbC5haWxfZm9ydyA9ICh4ZnNfbG9nX2l0ZW1fdCopJihtcC0+bV9haWwpOworCW1wLT5tX2FpbC5haWxfYmFjayA9ICh4ZnNfbG9nX2l0ZW1fdCopJihtcC0+bV9haWwpOworfQorCisvKgorICogSW5zZXJ0IHRoZSBnaXZlbiBsb2cgaXRlbSBpbnRvIHRoZSBBSUwuCisgKiBXZSBhbG1vc3QgYWx3YXlzIGluc2VydCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LCBzbyBvbiBpbnNlcnRzCisgKiB3ZSBzZWFyY2ggZnJvbSB0aGUgZW5kIG9mIHRoZSBsaXN0IHRvIGZpbmQgd2hlcmUgdGhlCisgKiBuZXcgaXRlbSBiZWxvbmdzLgorICovCitTVEFUSUMgdm9pZAoreGZzX2FpbF9pbnNlcnQoCisJeGZzX2FpbF9lbnRyeV90CSpiYXNlLAorCXhmc19sb2dfaXRlbV90CSpsaXApCisvKiBBUkdTVVNFRCAqLworeworCXhmc19sb2dfaXRlbV90CSpuZXh0X2xpcDsKKworCS8qCisJICogSWYgdGhlIGxpc3QgaXMgZW1wdHksIGp1c3QgaW5zZXJ0IHRoZSBpdGVtLgorCSAqLworCWlmIChiYXNlLT5haWxfYmFjayA9PSAoeGZzX2xvZ19pdGVtX3QqKWJhc2UpIHsKKwkJYmFzZS0+YWlsX2ZvcncgPSBsaXA7CisJCWJhc2UtPmFpbF9iYWNrID0gbGlwOworCQlsaXAtPmxpX2FpbC5haWxfZm9ydyA9ICh4ZnNfbG9nX2l0ZW1fdCopYmFzZTsKKwkJbGlwLT5saV9haWwuYWlsX2JhY2sgPSAoeGZzX2xvZ19pdGVtX3QqKWJhc2U7CisJCXJldHVybjsKKwl9CisKKwluZXh0X2xpcCA9IGJhc2UtPmFpbF9iYWNrOworCXdoaWxlICgobmV4dF9saXAgIT0gKHhmc19sb2dfaXRlbV90KiliYXNlKSAmJgorCSAgICAgICAoWEZTX0xTTl9DTVAobmV4dF9saXAtPmxpX2xzbiwgbGlwLT5saV9sc24pID4gMCkpIHsKKwkJbmV4dF9saXAgPSBuZXh0X2xpcC0+bGlfYWlsLmFpbF9iYWNrOworCX0KKwlBU1NFUlQoKG5leHRfbGlwID09ICh4ZnNfbG9nX2l0ZW1fdCopYmFzZSkgfHwKKwkgICAgICAgKFhGU19MU05fQ01QKG5leHRfbGlwLT5saV9sc24sIGxpcC0+bGlfbHNuKSA8PSAwKSk7CisJbGlwLT5saV9haWwuYWlsX2ZvcncgPSBuZXh0X2xpcC0+bGlfYWlsLmFpbF9mb3J3OworCWxpcC0+bGlfYWlsLmFpbF9iYWNrID0gbmV4dF9saXA7CisJbmV4dF9saXAtPmxpX2FpbC5haWxfZm9ydyA9IGxpcDsKKwlsaXAtPmxpX2FpbC5haWxfZm9ydy0+bGlfYWlsLmFpbF9iYWNrID0gbGlwOworCisJeGZzX2FpbF9jaGVjayhiYXNlKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBEZWxldGUgdGhlIGdpdmVuIGl0ZW0gZnJvbSB0aGUgQUlMLiAgUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgaXRlbS4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgeGZzX2xvZ19pdGVtX3QgKgoreGZzX2FpbF9kZWxldGUoCisJeGZzX2FpbF9lbnRyeV90CSpiYXNlLAorCXhmc19sb2dfaXRlbV90CSpsaXApCisvKiBBUkdTVVNFRCAqLworeworCWxpcC0+bGlfYWlsLmFpbF9mb3J3LT5saV9haWwuYWlsX2JhY2sgPSBsaXAtPmxpX2FpbC5haWxfYmFjazsKKwlsaXAtPmxpX2FpbC5haWxfYmFjay0+bGlfYWlsLmFpbF9mb3J3ID0gbGlwLT5saV9haWwuYWlsX2Zvcnc7CisJbGlwLT5saV9haWwuYWlsX2ZvcncgPSBOVUxMOworCWxpcC0+bGlfYWlsLmFpbF9iYWNrID0gTlVMTDsKKworCXhmc19haWxfY2hlY2soYmFzZSk7CisJcmV0dXJuIGxpcDsKK30KKworLyoKKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIEFJTC4KKyAqIElmIHRoZSBBSUwgaXMgZW1wdHksIHRoZW4gcmV0dXJuIE5VTEwuCisgKi8KK1NUQVRJQyB4ZnNfbG9nX2l0ZW1fdCAqCit4ZnNfYWlsX21pbigKKwl4ZnNfYWlsX2VudHJ5X3QJKmJhc2UpCisvKiBBUkdTVVNFRCAqLworeworCXJlZ2lzdGVyIHhmc19sb2dfaXRlbV90ICpmb3J3ID0gYmFzZS0+YWlsX2Zvcnc7CisJaWYgKGZvcncgPT0gKHhmc19sb2dfaXRlbV90KiliYXNlKSB7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gZm9ydzsKK30KKworLyoKKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGl0ZW0gd2hpY2ggZm9sbG93cworICogdGhlIGdpdmVuIGl0ZW0gaW4gdGhlIEFJTC4gIElmIHRoZSBnaXZlbiBpdGVtCisgKiBpcyB0aGUgbGFzdCBpdGVtIGluIHRoZSBsaXN0LCB0aGVuIHJldHVybiBOVUxMLgorICovCitTVEFUSUMgeGZzX2xvZ19pdGVtX3QgKgoreGZzX2FpbF9uZXh0KAorCXhmc19haWxfZW50cnlfdAkqYmFzZSwKKwl4ZnNfbG9nX2l0ZW1fdAkqbGlwKQorLyogQVJHU1VTRUQgKi8KK3sKKwlpZiAobGlwLT5saV9haWwuYWlsX2ZvcncgPT0gKHhmc19sb2dfaXRlbV90KiliYXNlKSB7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gbGlwLT5saV9haWwuYWlsX2Zvcnc7CisKK30KKworI2lmZGVmIERFQlVHCisvKgorICogQ2hlY2sgdGhhdCB0aGUgbGlzdCBpcyBzb3J0ZWQgYXMgaXQgc2hvdWxkIGJlLgorICovCitTVEFUSUMgdm9pZAoreGZzX2FpbF9jaGVjaygKKwl4ZnNfYWlsX2VudHJ5X3QgKmJhc2UpCit7CisJeGZzX2xvZ19pdGVtX3QJKmxpcDsKKwl4ZnNfbG9nX2l0ZW1fdAkqcHJldl9saXA7CisKKwlsaXAgPSBiYXNlLT5haWxfZm9ydzsKKwlpZiAobGlwID09ICh4ZnNfbG9nX2l0ZW1fdCopYmFzZSkgeworCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhlIHBvaW50ZXJzIGFyZSBjb3JyZWN0IHdoZW4gdGhlIGxpc3QKKwkJICogaXMgZW1wdHkuCisJCSAqLworCQlBU1NFUlQoYmFzZS0+YWlsX2JhY2sgPT0gKHhmc19sb2dfaXRlbV90KiliYXNlKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogV2FsayB0aGUgbGlzdCBjaGVja2luZyBmb3J3YXJkIGFuZCBiYWNrd2FyZCBwb2ludGVycywKKwkgKiBsc24gb3JkZXJpbmcsIGFuZCB0aGF0IGV2ZXJ5IGVudHJ5IGhhcyB0aGUgWEZTX0xJX0lOX0FJTAorCSAqIGZsYWcgc2V0LgorCSAqLworCXByZXZfbGlwID0gKHhmc19sb2dfaXRlbV90KiliYXNlOworCXdoaWxlIChsaXAgIT0gKHhmc19sb2dfaXRlbV90KiliYXNlKSB7CisJCWlmIChwcmV2X2xpcCAhPSAoeGZzX2xvZ19pdGVtX3QqKWJhc2UpIHsKKwkJCUFTU0VSVChwcmV2X2xpcC0+bGlfYWlsLmFpbF9mb3J3ID09IGxpcCk7CisJCQlBU1NFUlQoWEZTX0xTTl9DTVAocHJldl9saXAtPmxpX2xzbiwgbGlwLT5saV9sc24pIDw9IDApOworCQl9CisJCUFTU0VSVChsaXAtPmxpX2FpbC5haWxfYmFjayA9PSBwcmV2X2xpcCk7CisJCUFTU0VSVCgobGlwLT5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpICE9IDApOworCQlwcmV2X2xpcCA9IGxpcDsKKwkJbGlwID0gbGlwLT5saV9haWwuYWlsX2Zvcnc7CisJfQorCUFTU0VSVChsaXAgPT0gKHhmc19sb2dfaXRlbV90KiliYXNlKTsKKwlBU1NFUlQoYmFzZS0+YWlsX2JhY2sgPT0gcHJldl9saXApOworfQorI2VuZGlmIC8qIERFQlVHICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2J1Zi5jIGIvZnMveGZzL3hmc190cmFuc19idWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTY4MmI5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc190cmFuc19idWYuYwpAQCAtMCwwICsxLDEwOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisKKworU1RBVElDIHhmc19idWZfdCAqeGZzX3RyYW5zX2J1Zl9pdGVtX21hdGNoKHhmc190cmFuc190ICosIHhmc19idWZ0YXJnX3QgKiwKKwkJeGZzX2RhZGRyX3QsIGludCk7CitTVEFUSUMgeGZzX2J1Zl90ICp4ZnNfdHJhbnNfYnVmX2l0ZW1fbWF0Y2hfYWxsKHhmc190cmFuc190ICosIHhmc19idWZ0YXJnX3QgKiwKKwkJeGZzX2RhZGRyX3QsIGludCk7CisKKworLyoKKyAqIEdldCBhbmQgbG9jayB0aGUgYnVmZmVyIGZvciB0aGUgY2FsbGVyIGlmIGl0IGlzIG5vdCBhbHJlYWR5CisgKiBsb2NrZWQgd2l0aGluIHRoZSBnaXZlbiB0cmFuc2FjdGlvbi4gIElmIGl0IGlzIGFscmVhZHkgbG9ja2VkCisgKiB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uLCBqdXN0IGluY3JlbWVudCBpdHMgbG9jayByZWN1cnNpb24gY291bnQKKyAqIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LgorICoKKyAqIFVzZSB0aGUgZmFzdCBwYXRoIGZ1bmN0aW9uIHhmc190cmFuc19idWZfaXRlbV9tYXRjaCgpIG9yIHRoZSBidWZmZXIKKyAqIGNhY2hlIHJvdXRpbmUgaW5jb3JlX21hdGNoKCkgdG8gZmluZCB0aGUgYnVmZmVyCisgKiBpZiBpdCBpcyBhbHJlYWR5IG93bmVkIGJ5IHRoaXMgdHJhbnNhY3Rpb24uCisgKgorICogSWYgd2UgZG9uJ3QgYWxyZWFkeSBvd24gdGhlIGJ1ZmZlciwgdXNlIGdldF9idWYoKSB0byBnZXQgaXQuCisgKiBJZiBpdCBkb2Vzbid0IHlldCBoYXZlIGFuIGFzc29jaWF0ZWQgeGZzX2J1Zl9sb2dfaXRlbSBzdHJ1Y3R1cmUsCisgKiB0aGVuIGFsbG9jYXRlIG9uZSBhbmQgYWRkIHRoZSBpdGVtIHRvIHRoaXMgdHJhbnNhY3Rpb24uCisgKgorICogSWYgdGhlIHRyYW5zYWN0aW9uIHBvaW50ZXIgaXMgTlVMTCwgbWFrZSB0aGlzIGp1c3QgYSBub3JtYWwKKyAqIGdldF9idWYoKSBjYWxsLgorICovCit4ZnNfYnVmX3QgKgoreGZzX3RyYW5zX2dldF9idWYoeGZzX3RyYW5zX3QJKnRwLAorCQkgIHhmc19idWZ0YXJnX3QJKnRhcmdldF9kZXYsCisJCSAgeGZzX2RhZGRyX3QJYmxrbm8sCisJCSAgaW50CQlsZW4sCisJCSAgdWludAkJZmxhZ3MpCit7CisJeGZzX2J1Zl90CQkqYnA7CisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7CisKKwlpZiAoZmxhZ3MgPT0gMCkKKwkJZmxhZ3MgPSBYRlNfQlVGX0xPQ0sgfCBYRlNfQlVGX01BUFBFRDsKKworCS8qCisJICogRGVmYXVsdCB0byBhIG5vcm1hbCBnZXRfYnVmKCkgY2FsbCBpZiB0aGUgdHAgaXMgTlVMTC4KKwkgKi8KKwlpZiAodHAgPT0gTlVMTCkgeworCQlicCA9IHhmc19idWZfZ2V0X2ZsYWdzKHRhcmdldF9kZXYsIGJsa25vLCBsZW4sCisJCQkJCQkJZmxhZ3MgfCBCVUZfQlVTWSk7CisJCXJldHVybihicCk7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBmaW5kIHRoZSBidWZmZXIgaW4gdGhlIGNhY2hlIHdpdGggdGhpcyB0cmFuc2FjdGlvbgorCSAqIHBvaW50ZXIgaW4gaXRzIGJfZnNwcml2YXRlMiBmaWVsZCwgdGhlbiB3ZSBrbm93IHdlIGFscmVhZHkKKwkgKiBoYXZlIGl0IGxvY2tlZC4gIEluIHRoaXMgY2FzZSB3ZSBqdXN0IGluY3JlbWVudCB0aGUgbG9jaworCSAqIHJlY3Vyc2lvbiBjb3VudCBhbmQgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlIGNhbGxlci4KKwkgKi8KKwlpZiAodHAtPnRfaXRlbXMubGljX25leHQgPT0gTlVMTCkgeworCQlicCA9IHhmc190cmFuc19idWZfaXRlbV9tYXRjaCh0cCwgdGFyZ2V0X2RldiwgYmxrbm8sIGxlbik7CisJfSBlbHNlIHsKKwkJYnAgID0geGZzX3RyYW5zX2J1Zl9pdGVtX21hdGNoX2FsbCh0cCwgdGFyZ2V0X2RldiwgYmxrbm8sIGxlbik7CisJfQorCWlmIChicCAhPSBOVUxMKSB7CisJCUFTU0VSVChYRlNfQlVGX1ZBTFVTRU1BKGJwKSA8PSAwKTsKKwkJaWYgKFhGU19GT1JDRURfU0hVVERPV04odHAtPnRfbW91bnRwKSkgeworCQkJeGZzX2J1ZnRyYWNlKCJUUkFOUyBHRVQgUkVDVVIgU0hVVCIsIGJwKTsKKwkJCVhGU19CVUZfU1VQRVJfU1RBTEUoYnApOworCQl9CisJCS8qCisJCSAqIElmIHRoZSBidWZmZXIgaXMgc3RhbGUgdGhlbiBpdCB3YXMgYmludmFsJ2VkCisJCSAqIHNpbmNlIGxhc3QgcmVhZC4gIFRoaXMgZG9lc24ndCBtYXR0ZXIgc2luY2UgdGhlCisJCSAqIGNhbGxlciBpc24ndCBhbGxvd2VkIHRvIHVzZSB0aGUgZGF0YSBhbnl3YXkuCisJCSAqLworCQllbHNlIGlmIChYRlNfQlVGX0lTU1RBTEUoYnApKSB7CisJCQl4ZnNfYnVmdHJhY2UoIlRSQU5TIEdFVCBSRUNVUiBTVEFMRSIsIGJwKTsKKwkJCUFTU0VSVCghWEZTX0JVRl9JU0RFTEFZV1JJVEUoYnApKTsKKwkJfQorCQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB4ZnNfdHJhbnNfdCAqKSA9PSB0cCk7CisJCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QgKik7CisJCUFTU0VSVChiaXAgIT0gTlVMTCk7CisJCUFTU0VSVChhdG9taWNfcmVhZCgmYmlwLT5ibGlfcmVmY291bnQpID4gMCk7CisJCWJpcC0+YmxpX3JlY3VyKys7CisJCXhmc19idWZ0cmFjZSgiVFJBTlMgR0VUIFJFQ1VSIiwgYnApOworCQl4ZnNfYnVmX2l0ZW1fdHJhY2UoIkdFVCBSRUNVUiIsIGJpcCk7CisJCXJldHVybiAoYnApOworCX0KKworCS8qCisJICogV2UgYWx3YXlzIHNwZWNpZnkgdGhlIEJVRl9CVVNZIGZsYWcgd2l0aGluIGEgdHJhbnNhY3Rpb24gc28KKwkgKiB0aGF0IGdldF9idWYgZG9lcyBub3QgdHJ5IHRvIHB1c2ggb3V0IGEgZGVsYXllZCB3cml0ZSBidWZmZXIKKwkgKiB3aGljaCBtaWdodCBjYXVzZSBhbm90aGVyIHRyYW5zYWN0aW9uIHRvIHRha2UgcGxhY2UgKGlmIHRoZQorCSAqIGJ1ZmZlciB3YXMgZGVsYXllZCBhbGxvYykuICBTdWNoIHJlY3Vyc2l2ZSB0cmFuc2FjdGlvbnMgY2FuCisJICogZWFzaWx5IGRlYWRsb2NrIHdpdGggb3VyIGN1cnJlbnQgdHJhbnNhY3Rpb24gYXMgd2VsbCBhcyBjYXVzZQorCSAqIHVzIHRvIHJ1biBvdXQgb2Ygc3RhY2sgc3BhY2UuCisJICovCisJYnAgPSB4ZnNfYnVmX2dldF9mbGFncyh0YXJnZXRfZGV2LCBibGtubywgbGVuLCBmbGFncyB8IEJVRl9CVVNZKTsKKwlpZiAoYnAgPT0gTlVMTCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlBU1NFUlQoIVhGU19CVUZfR0VURVJST1IoYnApKTsKKworCS8qCisJICogVGhlIHhmc19idWZfbG9nX2l0ZW0gcG9pbnRlciBpcyBzdG9yZWQgaW4gYl9mc3ByaXZhdGUuICBJZgorCSAqIGl0IGRvZXNuJ3QgaGF2ZSBvbmUgeWV0LCB0aGVuIGFsbG9jYXRlIG9uZSBhbmQgaW5pdGlhbGl6ZSBpdC4KKwkgKiBUaGUgY2hlY2tzIHRvIHNlZSBpZiBvbmUgaXMgdGhlcmUgYXJlIGluIHhmc19idWZfaXRlbV9pbml0KCkuCisJICovCisJeGZzX2J1Zl9pdGVtX2luaXQoYnAsIHRwLT50X21vdW50cCk7CisKKwkvKgorCSAqIFNldCB0aGUgcmVjdXJzaW9uIGNvdW50IGZvciB0aGUgYnVmZmVyIHdpdGhpbiB0aGlzIHRyYW5zYWN0aW9uCisJICogdG8gMC4KKwkgKi8KKwliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2J1Zl9sb2dfaXRlbV90Kik7CisJQVNTRVJUKCEoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSk7CisJQVNTRVJUKCEoYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyAmIFhGU19CTElfQ0FOQ0VMKSk7CisJQVNTRVJUKCEoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX0xPR0dFRCkpOworCWJpcC0+YmxpX3JlY3VyID0gMDsKKworCS8qCisJICogVGFrZSBhIHJlZmVyZW5jZSBmb3IgdGhpcyB0cmFuc2FjdGlvbiBvbiB0aGUgYnVmIGl0ZW0uCisJICovCisJYXRvbWljX2luYygmYmlwLT5ibGlfcmVmY291bnQpOworCisJLyoKKwkgKiBHZXQgYSBsb2dfaXRlbV9kZXNjIHRvIHBvaW50IGF0IHRoZSBuZXcgaXRlbS4KKwkgKi8KKwkodm9pZCkgeGZzX3RyYW5zX2FkZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QqKWJpcCk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgYl9mc3ByaXZhdGUyIHNvIHdlIGNhbiBmaW5kIGl0IHdpdGggaW5jb3JlX21hdGNoKCkKKwkgKiBhYm92ZS4KKwkgKi8KKwlYRlNfQlVGX1NFVF9GU1BSSVZBVEUyKGJwLCB0cCk7CisKKwl4ZnNfYnVmdHJhY2UoIlRSQU5TIEdFVCIsIGJwKTsKKwl4ZnNfYnVmX2l0ZW1fdHJhY2UoIkdFVCIsIGJpcCk7CisJcmV0dXJuIChicCk7Cit9CisKKy8qCisgKiBHZXQgYW5kIGxvY2sgdGhlIHN1cGVyYmxvY2sgYnVmZmVyIG9mIHRoaXMgZmlsZSBzeXN0ZW0gZm9yIHRoZQorICogZ2l2ZW4gdHJhbnNhY3Rpb24uCisgKgorICogV2UgZG9uJ3QgbmVlZCB0byB1c2UgaW5jb3JlX21hdGNoKCkgaGVyZSwgYmVjYXVzZSB0aGUgc3VwZXJibG9jaworICogYnVmZmVyIGlzIGEgcHJpdmF0ZSBidWZmZXIgd2hpY2ggd2Uga2VlcCBhIHBvaW50ZXIgdG8gaW4gdGhlCisgKiBtb3VudCBzdHJ1Y3R1cmUuCisgKi8KK3hmc19idWZfdCAqCit4ZnNfdHJhbnNfZ2V0c2IoeGZzX3RyYW5zX3QJKnRwLAorCQlzdHJ1Y3QgeGZzX21vdW50ICptcCwKKwkJaW50CQlmbGFncykKK3sKKwl4ZnNfYnVmX3QJCSpicDsKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKKworCS8qCisJICogRGVmYXVsdCB0byBqdXN0IHRyeWluZyB0byBsb2NrIHRoZSBzdXBlcmJsb2NrIGJ1ZmZlcgorCSAqIGlmIHRwIGlzIE5VTEwuCisJICovCisJaWYgKHRwID09IE5VTEwpIHsKKwkJcmV0dXJuICh4ZnNfZ2V0c2IobXAsIGZsYWdzKSk7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgc3VwZXJibG9jayBidWZmZXIgYWxyZWFkeSBoYXMgdGhpcyB0cmFuc2FjdGlvbgorCSAqIHBvaW50ZXIgaW4gaXRzIGJfZnNwcml2YXRlMiBmaWVsZCwgdGhlbiB3ZSBrbm93IHdlIGFscmVhZHkKKwkgKiBoYXZlIGl0IGxvY2tlZC4gIEluIHRoaXMgY2FzZSB3ZSBqdXN0IGluY3JlbWVudCB0aGUgbG9jaworCSAqIHJlY3Vyc2lvbiBjb3VudCBhbmQgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlIGNhbGxlci4KKwkgKi8KKwlicCA9IG1wLT5tX3NiX2JwOworCWlmIChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHhmc190cmFuc190ICopID09IHRwKSB7CisJCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QqKTsKKwkJQVNTRVJUKGJpcCAhPSBOVUxMKTsKKwkJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKKwkJYmlwLT5ibGlfcmVjdXIrKzsKKwkJeGZzX2J1Zl9pdGVtX3RyYWNlKCJHRVRTQiBSRUNVUiIsIGJpcCk7CisJCXJldHVybiAoYnApOworCX0KKworCWJwID0geGZzX2dldHNiKG1wLCBmbGFncyk7CisJaWYgKGJwID09IE5VTEwpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyoKKwkgKiBUaGUgeGZzX2J1Zl9sb2dfaXRlbSBwb2ludGVyIGlzIHN0b3JlZCBpbiBiX2ZzcHJpdmF0ZS4gIElmCisJICogaXQgZG9lc24ndCBoYXZlIG9uZSB5ZXQsIHRoZW4gYWxsb2NhdGUgb25lIGFuZCBpbml0aWFsaXplIGl0LgorCSAqIFRoZSBjaGVja3MgdG8gc2VlIGlmIG9uZSBpcyB0aGVyZSBhcmUgaW4geGZzX2J1Zl9pdGVtX2luaXQoKS4KKwkgKi8KKwl4ZnNfYnVmX2l0ZW1faW5pdChicCwgbXApOworCisJLyoKKwkgKiBTZXQgdGhlIHJlY3Vyc2lvbiBjb3VudCBmb3IgdGhlIGJ1ZmZlciB3aXRoaW4gdGhpcyB0cmFuc2FjdGlvbgorCSAqIHRvIDAuCisJICovCisJYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19idWZfbG9nX2l0ZW1fdCopOworCUFTU0VSVCghKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9TVEFMRSkpOworCUFTU0VSVCghKGJpcC0+YmxpX2Zvcm1hdC5ibGZfZmxhZ3MgJiBYRlNfQkxJX0NBTkNFTCkpOworCUFTU0VSVCghKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9MT0dHRUQpKTsKKwliaXAtPmJsaV9yZWN1ciA9IDA7CisKKwkvKgorCSAqIFRha2UgYSByZWZlcmVuY2UgZm9yIHRoaXMgdHJhbnNhY3Rpb24gb24gdGhlIGJ1ZiBpdGVtLgorCSAqLworCWF0b21pY19pbmMoJmJpcC0+YmxpX3JlZmNvdW50KTsKKworCS8qCisJICogR2V0IGEgbG9nX2l0ZW1fZGVzYyB0byBwb2ludCBhdCB0aGUgbmV3IGl0ZW0uCisJICovCisJKHZvaWQpIHhmc190cmFuc19hZGRfaXRlbSh0cCwgKHhmc19sb2dfaXRlbV90KiliaXApOworCisJLyoKKwkgKiBJbml0aWFsaXplIGJfZnNwcml2YXRlMiBzbyB3ZSBjYW4gZmluZCBpdCB3aXRoIGluY29yZV9tYXRjaCgpCisJICogYWJvdmUuCisJICovCisJWEZTX0JVRl9TRVRfRlNQUklWQVRFMihicCwgdHApOworCisJeGZzX2J1Zl9pdGVtX3RyYWNlKCJHRVRTQiIsIGJpcCk7CisJcmV0dXJuIChicCk7Cit9CisKKyNpZmRlZiBERUJVRworeGZzX2J1ZnRhcmdfdCAqeGZzX2Vycm9yX3RhcmdldDsKK2ludAl4ZnNfZG9fZXJyb3I7CitpbnQJeGZzX3JlcV9udW07CitpbnQJeGZzX2Vycm9yX21vZCA9IDMzOworI2VuZGlmCisKKy8qCisgKiBHZXQgYW5kIGxvY2sgdGhlIGJ1ZmZlciBmb3IgdGhlIGNhbGxlciBpZiBpdCBpcyBub3QgYWxyZWFkeQorICogbG9ja2VkIHdpdGhpbiB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24uICBJZiBpdCBoYXMgbm90IHlldCBiZWVuCisgKiByZWFkIGluLCByZWFkIGl0IGZyb20gZGlzay4gSWYgaXQgaXMgYWxyZWFkeSBsb2NrZWQKKyAqIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb24gYW5kIGFscmVhZHkgcmVhZCBpbiwganVzdCBpbmNyZW1lbnQgaXRzCisgKiBsb2NrIHJlY3Vyc2lvbiBjb3VudCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4KKyAqCisgKiBVc2UgdGhlIGZhc3QgcGF0aCBmdW5jdGlvbiB4ZnNfdHJhbnNfYnVmX2l0ZW1fbWF0Y2goKSBvciB0aGUgYnVmZmVyCisgKiBjYWNoZSByb3V0aW5lIGluY29yZV9tYXRjaCgpIHRvIGZpbmQgdGhlIGJ1ZmZlcgorICogaWYgaXQgaXMgYWxyZWFkeSBvd25lZCBieSB0aGlzIHRyYW5zYWN0aW9uLgorICoKKyAqIElmIHdlIGRvbid0IGFscmVhZHkgb3duIHRoZSBidWZmZXIsIHVzZSByZWFkX2J1ZigpIHRvIGdldCBpdC4KKyAqIElmIGl0IGRvZXNuJ3QgeWV0IGhhdmUgYW4gYXNzb2NpYXRlZCB4ZnNfYnVmX2xvZ19pdGVtIHN0cnVjdHVyZSwKKyAqIHRoZW4gYWxsb2NhdGUgb25lIGFuZCBhZGQgdGhlIGl0ZW0gdG8gdGhpcyB0cmFuc2FjdGlvbi4KKyAqCisgKiBJZiB0aGUgdHJhbnNhY3Rpb24gcG9pbnRlciBpcyBOVUxMLCBtYWtlIHRoaXMganVzdCBhIG5vcm1hbAorICogcmVhZF9idWYoKSBjYWxsLgorICovCitpbnQKK3hmc190cmFuc19yZWFkX2J1ZigKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19idWZ0YXJnX3QJKnRhcmdldCwKKwl4ZnNfZGFkZHJfdAlibGtubywKKwlpbnQJCWxlbiwKKwl1aW50CQlmbGFncywKKwl4ZnNfYnVmX3QJKipicHApCit7CisJeGZzX2J1Zl90CQkqYnA7CisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7CisJaW50CQkJZXJyb3I7CisKKwlpZiAoZmxhZ3MgPT0gMCkKKwkJZmxhZ3MgPSBYRlNfQlVGX0xPQ0sgfCBYRlNfQlVGX01BUFBFRDsKKworCS8qCisJICogRGVmYXVsdCB0byBhIG5vcm1hbCBnZXRfYnVmKCkgY2FsbCBpZiB0aGUgdHAgaXMgTlVMTC4KKwkgKi8KKwlpZiAodHAgPT0gTlVMTCkgeworCQlicCA9IHhmc19idWZfcmVhZF9mbGFncyh0YXJnZXQsIGJsa25vLCBsZW4sIGZsYWdzIHwgQlVGX0JVU1kpOworCQlpZiAoIWJwKQorCQkJcmV0dXJuIFhGU19FUlJPUihFTk9NRU0pOworCisJCWlmICgoYnAgIT0gTlVMTCkgJiYgKFhGU19CVUZfR0VURVJST1IoYnApICE9IDApKSB7CisJCQl4ZnNfaW9lcnJvcl9hbGVydCgieGZzX3RyYW5zX3JlYWRfYnVmIiwgbXAsCisJCQkJCSAgYnAsIGJsa25vKTsKKwkJCWVycm9yID0gWEZTX0JVRl9HRVRFUlJPUihicCk7CisJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorI2lmZGVmIERFQlVHCisJCWlmICh4ZnNfZG9fZXJyb3IgJiYgKGJwICE9IE5VTEwpKSB7CisJCQlpZiAoeGZzX2Vycm9yX3RhcmdldCA9PSB0YXJnZXQpIHsKKwkJCQlpZiAoKCh4ZnNfcmVxX251bSsrKSAlIHhmc19lcnJvcl9tb2QpID09IDApIHsKKwkJCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCQkJCXByaW50aygiUmV0dXJuaW5nIGVycm9yIVxuIik7CisJCQkJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZgorCQlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCQlnb3RvIHNodXRkb3duX2Fib3J0OworCQkqYnBwID0gYnA7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogSWYgd2UgZmluZCB0aGUgYnVmZmVyIGluIHRoZSBjYWNoZSB3aXRoIHRoaXMgdHJhbnNhY3Rpb24KKwkgKiBwb2ludGVyIGluIGl0cyBiX2ZzcHJpdmF0ZTIgZmllbGQsIHRoZW4gd2Uga25vdyB3ZSBhbHJlYWR5CisJICogaGF2ZSBpdCBsb2NrZWQuICBJZiBpdCBpcyBhbHJlYWR5IHJlYWQgaW4gd2UganVzdCBpbmNyZW1lbnQKKwkgKiB0aGUgbG9jayByZWN1cnNpb24gY291bnQgYW5kIHJldHVybiB0aGUgYnVmZmVyIHRvIHRoZSBjYWxsZXIuCisJICogSWYgdGhlIGJ1ZmZlciBpcyBub3QgeWV0IHJlYWQgaW4sIHRoZW4gd2UgcmVhZCBpdCBpbiwgaW5jcmVtZW50CisJICogdGhlIGxvY2sgcmVjdXJzaW9uIGNvdW50LCBhbmQgcmV0dXJuIGl0IHRvIHRoZSBjYWxsZXIuCisJICovCisJaWYgKHRwLT50X2l0ZW1zLmxpY19uZXh0ID09IE5VTEwpIHsKKwkJYnAgPSB4ZnNfdHJhbnNfYnVmX2l0ZW1fbWF0Y2godHAsIHRhcmdldCwgYmxrbm8sIGxlbik7CisJfSBlbHNlIHsKKwkJYnAgPSB4ZnNfdHJhbnNfYnVmX2l0ZW1fbWF0Y2hfYWxsKHRwLCB0YXJnZXQsIGJsa25vLCBsZW4pOworCX0KKwlpZiAoYnAgIT0gTlVMTCkgeworCQlBU1NFUlQoWEZTX0JVRl9WQUxVU0VNQShicCkgPD0gMCk7CisJCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHhmc190cmFuc190ICopID09IHRwKTsKKwkJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopICE9IE5VTEwpOworCQlBU1NFUlQoKFhGU19CVUZfSVNFUlJPUihicCkpID09IDApOworCQlpZiAoIShYRlNfQlVGX0lTRE9ORShicCkpKSB7CisJCQl4ZnNfYnVmdHJhY2UoIlJFQURfQlVGX0lOQ09SRSAhRE9ORSIsIGJwKTsKKwkJCUFTU0VSVCghWEZTX0JVRl9JU0FTWU5DKGJwKSk7CisJCQlYRlNfQlVGX1JFQUQoYnApOworCQkJeGZzYmRzdHJhdCh0cC0+dF9tb3VudHAsIGJwKTsKKwkJCXhmc19pb3dhaXQoYnApOworCQkJaWYgKFhGU19CVUZfR0VURVJST1IoYnApICE9IDApIHsKKwkJCQl4ZnNfaW9lcnJvcl9hbGVydCgieGZzX3RyYW5zX3JlYWRfYnVmIiwgbXAsCisJCQkJCQkgIGJwLCBibGtubyk7CisJCQkJZXJyb3IgPSBYRlNfQlVGX0dFVEVSUk9SKGJwKTsKKwkJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJCQkvKgorCQkJCSAqIFdlIGNhbiBncmFjZWZ1bGx5IHJlY292ZXIgZnJvbSBtb3N0CisJCQkJICogcmVhZCBlcnJvcnMuIE9uZXMgd2UgY2FuJ3QgYXJlIHRob3NlCisJCQkJICogdGhhdCBoYXBwZW4gYWZ0ZXIgdGhlIHRyYW5zYWN0aW9uJ3MKKwkJCQkgKiBhbHJlYWR5IGRpcnR5LgorCQkJCSAqLworCQkJCWlmICh0cC0+dF9mbGFncyAmIFhGU19UUkFOU19ESVJUWSkKKwkJCQkJeGZzX2ZvcmNlX3NodXRkb3duKHRwLT50X21vdW50cCwKKwkJCQkJCQkgICBYRlNfTUVUQURBVEFfSU9fRVJST1IpOworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiBXZSBuZXZlciBsb2NrZWQgdGhpcyBidWYgb3Vyc2VsdmVzLCBzbyB3ZSBzaG91bGRuJ3QKKwkJICogYnJlbHNlIGl0IGVpdGhlci4gSnVzdCBnZXQgb3V0LgorCQkgKi8KKwkJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKSB7CisJCQl4ZnNfYnVmdHJhY2UoIlJFQURfQlVGX0lOQ09SRSBYRlNTSFVURE4iLCBicCk7CisJCQkqYnBwID0gTlVMTDsKKwkJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwkJfQorCisKKwkJYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19idWZfbG9nX2l0ZW1fdCopOworCQliaXAtPmJsaV9yZWN1cisrOworCisJCUFTU0VSVChhdG9taWNfcmVhZCgmYmlwLT5ibGlfcmVmY291bnQpID4gMCk7CisJCXhmc19idWZfaXRlbV90cmFjZSgiUkVBRCBSRUNVUiIsIGJpcCk7CisJCSpicHAgPSBicDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBXZSBhbHdheXMgc3BlY2lmeSB0aGUgQlVGX0JVU1kgZmxhZyB3aXRoaW4gYSB0cmFuc2FjdGlvbiBzbworCSAqIHRoYXQgZ2V0X2J1ZiBkb2VzIG5vdCB0cnkgdG8gcHVzaCBvdXQgYSBkZWxheWVkIHdyaXRlIGJ1ZmZlcgorCSAqIHdoaWNoIG1pZ2h0IGNhdXNlIGFub3RoZXIgdHJhbnNhY3Rpb24gdG8gdGFrZSBwbGFjZSAoaWYgdGhlCisJICogYnVmZmVyIHdhcyBkZWxheWVkIGFsbG9jKS4gIFN1Y2ggcmVjdXJzaXZlIHRyYW5zYWN0aW9ucyBjYW4KKwkgKiBlYXNpbHkgZGVhZGxvY2sgd2l0aCBvdXIgY3VycmVudCB0cmFuc2FjdGlvbiBhcyB3ZWxsIGFzIGNhdXNlCisJICogdXMgdG8gcnVuIG91dCBvZiBzdGFjayBzcGFjZS4KKwkgKi8KKwlicCA9IHhmc19idWZfcmVhZF9mbGFncyh0YXJnZXQsIGJsa25vLCBsZW4sIGZsYWdzIHwgQlVGX0JVU1kpOworCWlmIChicCA9PSBOVUxMKSB7CisJCSpicHAgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKFhGU19CVUZfR0VURVJST1IoYnApICE9IDApIHsKKwkgICAgWEZTX0JVRl9TVVBFUl9TVEFMRShicCk7CisJCXhmc19idWZ0cmFjZSgiUkVBRCBFUlJPUiIsIGJwKTsKKwkJZXJyb3IgPSBYRlNfQlVGX0dFVEVSUk9SKGJwKTsKKworCQl4ZnNfaW9lcnJvcl9hbGVydCgieGZzX3RyYW5zX3JlYWRfYnVmIiwgbXAsCisJCQkJICBicCwgYmxrbm8pOworCQlpZiAodHAtPnRfZmxhZ3MgJiBYRlNfVFJBTlNfRElSVFkpCisJCQl4ZnNfZm9yY2Vfc2h1dGRvd24odHAtPnRfbW91bnRwLCBYRlNfTUVUQURBVEFfSU9fRVJST1IpOworCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKyNpZmRlZiBERUJVRworCWlmICh4ZnNfZG9fZXJyb3IgJiYgISh0cC0+dF9mbGFncyAmIFhGU19UUkFOU19ESVJUWSkpIHsKKwkJaWYgKHhmc19lcnJvcl90YXJnZXQgPT0gdGFyZ2V0KSB7CisJCQlpZiAoKCh4ZnNfcmVxX251bSsrKSAlIHhmc19lcnJvcl9tb2QpID09IDApIHsKKwkJCQl4ZnNfZm9yY2Vfc2h1dGRvd24odHAtPnRfbW91bnRwLAorCQkJCQkJICAgWEZTX01FVEFEQVRBX0lPX0VSUk9SKTsKKwkJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJCQlwcmludGsoIlJldHVybmluZyBlcnJvciBpbiB0cmFucyFcbiIpOworCQkJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJZ290byBzaHV0ZG93bl9hYm9ydDsKKworCS8qCisJICogVGhlIHhmc19idWZfbG9nX2l0ZW0gcG9pbnRlciBpcyBzdG9yZWQgaW4gYl9mc3ByaXZhdGUuICBJZgorCSAqIGl0IGRvZXNuJ3QgaGF2ZSBvbmUgeWV0LCB0aGVuIGFsbG9jYXRlIG9uZSBhbmQgaW5pdGlhbGl6ZSBpdC4KKwkgKiBUaGUgY2hlY2tzIHRvIHNlZSBpZiBvbmUgaXMgdGhlcmUgYXJlIGluIHhmc19idWZfaXRlbV9pbml0KCkuCisJICovCisJeGZzX2J1Zl9pdGVtX2luaXQoYnAsIHRwLT50X21vdW50cCk7CisKKwkvKgorCSAqIFNldCB0aGUgcmVjdXJzaW9uIGNvdW50IGZvciB0aGUgYnVmZmVyIHdpdGhpbiB0aGlzIHRyYW5zYWN0aW9uCisJICogdG8gMC4KKwkgKi8KKwliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2J1Zl9sb2dfaXRlbV90Kik7CisJQVNTRVJUKCEoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSk7CisJQVNTRVJUKCEoYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyAmIFhGU19CTElfQ0FOQ0VMKSk7CisJQVNTRVJUKCEoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX0xPR0dFRCkpOworCWJpcC0+YmxpX3JlY3VyID0gMDsKKworCS8qCisJICogVGFrZSBhIHJlZmVyZW5jZSBmb3IgdGhpcyB0cmFuc2FjdGlvbiBvbiB0aGUgYnVmIGl0ZW0uCisJICovCisJYXRvbWljX2luYygmYmlwLT5ibGlfcmVmY291bnQpOworCisJLyoKKwkgKiBHZXQgYSBsb2dfaXRlbV9kZXNjIHRvIHBvaW50IGF0IHRoZSBuZXcgaXRlbS4KKwkgKi8KKwkodm9pZCkgeGZzX3RyYW5zX2FkZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QqKWJpcCk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgYl9mc3ByaXZhdGUyIHNvIHdlIGNhbiBmaW5kIGl0IHdpdGggaW5jb3JlX21hdGNoKCkKKwkgKiBhYm92ZS4KKwkgKi8KKwlYRlNfQlVGX1NFVF9GU1BSSVZBVEUyKGJwLCB0cCk7CisKKwl4ZnNfYnVmdHJhY2UoIlRSQU5TIFJFQUQiLCBicCk7CisJeGZzX2J1Zl9pdGVtX3RyYWNlKCJSRUFEIiwgYmlwKTsKKwkqYnBwID0gYnA7CisJcmV0dXJuIDA7CisKK3NodXRkb3duX2Fib3J0OgorCS8qCisJICogdGhlIHRoZW9yeSBoZXJlIGlzIHRoYXQgYnVmZmVyIGlzIGdvb2QgYnV0IHdlJ3JlCisJICogYmFpbGluZyBvdXQgYmVjYXVzZSB0aGUgZmlsZXN5c3RlbSBpcyBiZWluZyBmb3JjaWJseQorCSAqIHNodXQgZG93bi4gIFNvIHdlIHNob3VsZCBsZWF2ZSB0aGUgYl9mbGFncyBhbG9uZSBzaW5jZQorCSAqIHRoZSBidWZmZXIncyBub3Qgc3RhbGVkIGFuZCBqdXN0IGdldCBvdXQuCisJICovCisjaWYgZGVmaW5lZChERUJVRykKKwlpZiAoWEZTX0JVRl9JU1NUQUxFKGJwKSAmJiBYRlNfQlVGX0lTREVMQVlXUklURShicCkpCisJCWNtbl9lcnIoQ0VfTk9URSwgImFib3V0IHRvIHBvcCBhc3NlcnQsIGJwID09IDB4JXAiLCBicCk7CisjZW5kaWYKKwlBU1NFUlQoKFhGU19CVUZfQkZMQUdTKGJwKSAmIChYRlNfQl9TVEFMRXxYRlNfQl9ERUxXUkkpKSAhPQorCQkJCQkJKFhGU19CX1NUQUxFfFhGU19CX0RFTFdSSSkpOworCisJeGZzX2J1ZnRyYWNlKCJSRUFEX0JVRiBYRlNTSFVURE4iLCBicCk7CisJeGZzX2J1Zl9yZWxzZShicCk7CisJKmJwcCA9IE5VTEw7CisJcmV0dXJuIFhGU19FUlJPUihFSU8pOworfQorCisKKy8qCisgKiBSZWxlYXNlIHRoZSBidWZmZXIgYnAgd2hpY2ggd2FzIHByZXZpb3VzbHkgYWNxdWlyZWQgd2l0aCBvbmUgb2YgdGhlCisgKiB4ZnNfdHJhbnNfLi4uIGJ1ZmZlciBhbGxvY2F0aW9uIHJvdXRpbmVzIGlmIHRoZSBidWZmZXIgaGFzIG5vdAorICogYmVlbiBtb2RpZmllZCB3aXRoaW4gdGhpcyB0cmFuc2FjdGlvbi4gIElmIHRoZSBidWZmZXIgaXMgbW9kaWZpZWQKKyAqIHdpdGhpbiB0aGlzIHRyYW5zYWN0aW9uLCBkbyBkZWNyZW1lbnQgdGhlIHJlY3Vyc2lvbiBjb3VudCBidXQgZG8KKyAqIG5vdCByZWxlYXNlIHRoZSBidWZmZXIgZXZlbiBpZiB0aGUgY291bnQgZ29lcyB0byAwLiAgSWYgdGhlIGJ1ZmZlciBpcyBub3QKKyAqIG1vZGlmaWVkIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb24sIGRlY3JlbWVudCB0aGUgcmVjdXJzaW9uIGNvdW50IGFuZAorICogcmVsZWFzZSB0aGUgYnVmZmVyIGlmIHRoZSByZWN1cnNpb24gY291bnQgZ29lcyB0byAwLgorICoKKyAqIElmIHRoZSBidWZmZXIgaXMgdG8gYmUgcmVsZWFzZWQgYW5kIGl0IHdhcyBub3QgbW9kaWZpZWQgYmVmb3JlCisgKiB0aGlzIHRyYW5zYWN0aW9uIGJlZ2FuLCB0aGVuIGZyZWUgdGhlIGJ1Zl9sb2dfaXRlbSBhc3NvY2lhdGVkIHdpdGggaXQuCisgKgorICogSWYgdGhlIHRyYW5zYWN0aW9uIHBvaW50ZXIgaXMgTlVMTCwgbWFrZSB0aGlzIGp1c3QgYSBub3JtYWwKKyAqIGJyZWxzZSgpIGNhbGwuCisgKi8KK3ZvaWQKK3hmc190cmFuc19icmVsc2UoeGZzX3RyYW5zX3QJKnRwLAorCQkgeGZzX2J1Zl90CSpicCkKK3sKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKKwl4ZnNfbG9nX2l0ZW1fdAkJKmxpcDsKKwl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOworCisJLyoKKwkgKiBEZWZhdWx0IHRvIGEgbm9ybWFsIGJyZWxzZSgpIGNhbGwgaWYgdGhlIHRwIGlzIE5VTEwuCisJICovCisJaWYgKHRwID09IE5VTEwpIHsKKwkJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFMihicCwgdm9pZCAqKSA9PSBOVUxMKTsKKwkJLyoKKwkJICogSWYgdGhlcmUncyBhIGJ1ZiBsb2cgaXRlbSBhdHRhY2hlZCB0byB0aGUgYnVmZmVyLAorCQkgKiB0aGVuIGxldCB0aGUgQUlMIGtub3cgdGhhdCB0aGUgYnVmZmVyIGlzIGJlaW5nCisJCSAqIHVubG9ja2VkLgorCQkgKi8KKwkJaWYgKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopICE9IE5VTEwpIHsKKwkJCWxpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfbG9nX2l0ZW1fdCAqKTsKKwkJCWlmIChsaXAtPmxpX3R5cGUgPT0gWEZTX0xJX0JVRikgeworCQkJCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLHhmc19idWZfbG9nX2l0ZW1fdCopOworCQkJCXhmc190cmFuc191bmxvY2tlZF9pdGVtKAorCQkJCQkJYmlwLT5ibGlfaXRlbS5saV9tb3VudHAsCisJCQkJCQlsaXApOworCQkJfQorCQl9CisJCXhmc19idWZfcmVsc2UoYnApOworCQlyZXR1cm47CisJfQorCisJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFMihicCwgeGZzX3RyYW5zX3QgKikgPT0gdHApOworCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QgKik7CisJQVNTRVJUKGJpcC0+YmxpX2l0ZW0ubGlfdHlwZSA9PSBYRlNfTElfQlVGKTsKKwlBU1NFUlQoIShiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfU1RBTEUpKTsKKwlBU1NFUlQoIShiaXAtPmJsaV9mb3JtYXQuYmxmX2ZsYWdzICYgWEZTX0JMSV9DQU5DRUwpKTsKKwlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOworCisJLyoKKwkgKiBGaW5kIHRoZSBpdGVtIGRlc2NyaXB0b3IgcG9pbnRpbmcgdG8gdGhpcyBidWZmZXIncworCSAqIGxvZyBpdGVtLiAgSXQgbXVzdCBiZSB0aGVyZS4KKwkgKi8KKwlsaWRwID0geGZzX3RyYW5zX2ZpbmRfaXRlbSh0cCwgKHhmc19sb2dfaXRlbV90KiliaXApOworCUFTU0VSVChsaWRwICE9IE5VTEwpOworCisJLyoKKwkgKiBJZiB0aGUgcmVsZWFzZSBpcyBqdXN0IGZvciBhIHJlY3Vyc2l2ZSBsb2NrLAorCSAqIHRoZW4gZGVjcmVtZW50IHRoZSBjb3VudCBhbmQgcmV0dXJuLgorCSAqLworCWlmIChiaXAtPmJsaV9yZWN1ciA+IDApIHsKKwkJYmlwLT5ibGlfcmVjdXItLTsKKwkJeGZzX2J1Zl9pdGVtX3RyYWNlKCJSRUxTRSBSRUNVUiIsIGJpcCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBidWZmZXIgaXMgZGlydHkgd2l0aGluIHRoaXMgdHJhbnNhY3Rpb24sIHdlIGNhbid0CisJICogcmVsZWFzZSBpdCB1bnRpbCB3ZSBjb21taXQuCisJICovCisJaWYgKGxpZHAtPmxpZF9mbGFncyAmIFhGU19MSURfRElSVFkpIHsKKwkJeGZzX2J1Zl9pdGVtX3RyYWNlKCJSRUxTRSBESVJUWSIsIGJpcCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBidWZmZXIgaGFzIGJlZW4gaW52YWxpZGF0ZWQsIHRoZW4gd2UgY2FuJ3QgcmVsZWFzZQorCSAqIGl0IHVudGlsIHRoZSB0cmFuc2FjdGlvbiBjb21taXRzIHRvIGRpc2sgdW5sZXNzIGl0IGlzIHJlLWRpcnRpZWQKKwkgKiBhcyBwYXJ0IG9mIHRoaXMgdHJhbnNhY3Rpb24uICBUaGlzIHByZXZlbnRzIHVzIGZyb20gcHVsbGluZworCSAqIHRoZSBpdGVtIGZyb20gdGhlIEFJTCBiZWZvcmUgd2Ugc2hvdWxkLgorCSAqLworCWlmIChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfU1RBTEUpIHsKKwkJeGZzX2J1Zl9pdGVtX3RyYWNlKCJSRUxTRSBTVEFMRSIsIGJpcCk7CisJCXJldHVybjsKKwl9CisKKwlBU1NFUlQoIShiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfTE9HR0VEKSk7CisJeGZzX2J1Zl9pdGVtX3RyYWNlKCJSRUxTRSIsIGJpcCk7CisKKwkvKgorCSAqIEZyZWUgdXAgdGhlIGxvZyBpdGVtIGRlc2NyaXB0b3IgdHJhY2tpbmcgdGhlIHJlbGVhc2VkIGl0ZW0uCisJICovCisJeGZzX3RyYW5zX2ZyZWVfaXRlbSh0cCwgbGlkcCk7CisKKwkvKgorCSAqIENsZWFyIHRoZSBob2xkIGZsYWcgaW4gdGhlIGJ1ZiBsb2cgaXRlbSBpZiBpdCBpcyBzZXQuCisJICogV2Ugd291bGRuJ3Qgd2FudCB0aGUgbmV4dCB1c2VyIG9mIHRoZSBidWZmZXIgdG8KKwkgKiBnZXQgY29uZnVzZWQuCisJICovCisJaWYgKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9IT0xEKSB7CisJCWJpcC0+YmxpX2ZsYWdzICY9IH5YRlNfQkxJX0hPTEQ7CisJfQorCisJLyoKKwkgKiBEcm9wIG91ciByZWZlcmVuY2UgdG8gdGhlIGJ1ZiBsb2cgaXRlbS4KKwkgKi8KKwlhdG9taWNfZGVjKCZiaXAtPmJsaV9yZWZjb3VudCk7CisKKwkvKgorCSAqIElmIHRoZSBidWYgaXRlbSBpcyBub3QgdHJhY2tpbmcgZGF0YSBpbiB0aGUgbG9nLCB0aGVuCisJICogd2UgbXVzdCBmcmVlIGl0IGJlZm9yZSByZWxlYXNpbmcgdGhlIGJ1ZmZlciBiYWNrIHRvIHRoZQorCSAqIGZyZWUgcG9vbC4gIEJlZm9yZSByZWxlYXNpbmcgdGhlIGJ1ZmZlciB0byB0aGUgZnJlZSBwb29sLAorCSAqIGNsZWFyIHRoZSB0cmFuc2FjdGlvbiBwb2ludGVyIGluIGJfZnNwcml2YXRlMiB0byBkaXNzb2x2ZQorCSAqIGl0cyByZWxhdGlvbiB0byB0aGlzIHRyYW5zYWN0aW9uLgorCSAqLworCWlmICgheGZzX2J1Zl9pdGVtX2RpcnR5KGJpcCkpIHsKKy8qKioKKwkJQVNTRVJUKGJwLT5iX3BpbmNvdW50ID09IDApOworKioqLworCQlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA9PSAwKTsKKwkJQVNTRVJUKCEoYmlwLT5ibGlfaXRlbS5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpKTsKKwkJQVNTRVJUKCEoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX0lOT0RFX0FMTE9DX0JVRikpOworCQl4ZnNfYnVmX2l0ZW1fcmVsc2UoYnApOworCQliaXAgPSBOVUxMOworCX0KKwlYRlNfQlVGX1NFVF9GU1BSSVZBVEUyKGJwLCBOVUxMKTsKKworCS8qCisJICogSWYgd2UndmUgc3RpbGwgZ290IGEgYnVmIGxvZyBpdGVtIG9uIHRoZSBidWZmZXIsIHRoZW4KKwkgKiB0ZWxsIHRoZSBBSUwgdGhhdCB0aGUgYnVmZmVyIGlzIGJlaW5nIHVubG9ja2VkLgorCSAqLworCWlmIChiaXAgIT0gTlVMTCkgeworCQl4ZnNfdHJhbnNfdW5sb2NrZWRfaXRlbShiaXAtPmJsaV9pdGVtLmxpX21vdW50cCwKKwkJCQkJKHhmc19sb2dfaXRlbV90KiliaXApOworCX0KKworCXhmc19idWZfcmVsc2UoYnApOworCXJldHVybjsKK30KKworLyoKKyAqIEFkZCB0aGUgbG9ja2VkIGJ1ZmZlciB0byB0aGUgdHJhbnNhY3Rpb24uCisgKiBUaGUgYnVmZmVyIG11c3QgYmUgbG9ja2VkLCBhbmQgaXQgY2Fubm90IGJlIGFzc29jaWF0ZWQgd2l0aCBhbnkKKyAqIHRyYW5zYWN0aW9uLgorICoKKyAqIElmIHRoZSBidWZmZXIgZG9lcyBub3QgeWV0IGhhdmUgYSBidWYgbG9nIGl0ZW0gYXNzb2NpYXRlZCB3aXRoIGl0LAorICogdGhlbiBhbGxvY2F0ZSBvbmUgZm9yIGl0LiAgVGhlbiBhZGQgdGhlIGJ1ZiBpdGVtIHRvIHRoZSB0cmFuc2FjdGlvbi4KKyAqLwordm9pZAoreGZzX3RyYW5zX2Jqb2luKHhmc190cmFuc190CSp0cCwKKwkJeGZzX2J1Zl90CSpicCkKK3sKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKKworCUFTU0VSVChYRlNfQlVGX0lTQlVTWShicCkpOworCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHZvaWQgKikgPT0gTlVMTCk7CisKKwkvKgorCSAqIFRoZSB4ZnNfYnVmX2xvZ19pdGVtIHBvaW50ZXIgaXMgc3RvcmVkIGluIGJfZnNwcml2YXRlLiAgSWYKKwkgKiBpdCBkb2Vzbid0IGhhdmUgb25lIHlldCwgdGhlbiBhbGxvY2F0ZSBvbmUgYW5kIGluaXRpYWxpemUgaXQuCisJICogVGhlIGNoZWNrcyB0byBzZWUgaWYgb25lIGlzIHRoZXJlIGFyZSBpbiB4ZnNfYnVmX2l0ZW1faW5pdCgpLgorCSAqLworCXhmc19idWZfaXRlbV9pbml0KGJwLCB0cC0+dF9tb3VudHApOworCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QgKik7CisJQVNTRVJUKCEoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSk7CisJQVNTRVJUKCEoYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyAmIFhGU19CTElfQ0FOQ0VMKSk7CisJQVNTRVJUKCEoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX0xPR0dFRCkpOworCisJLyoKKwkgKiBUYWtlIGEgcmVmZXJlbmNlIGZvciB0aGlzIHRyYW5zYWN0aW9uIG9uIHRoZSBidWYgaXRlbS4KKwkgKi8KKwlhdG9taWNfaW5jKCZiaXAtPmJsaV9yZWZjb3VudCk7CisKKwkvKgorCSAqIEdldCBhIGxvZ19pdGVtX2Rlc2MgdG8gcG9pbnQgYXQgdGhlIG5ldyBpdGVtLgorCSAqLworCSh2b2lkKSB4ZnNfdHJhbnNfYWRkX2l0ZW0odHAsICh4ZnNfbG9nX2l0ZW1fdCAqKWJpcCk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgYl9mc3ByaXZhdGUyIHNvIHdlIGNhbiBmaW5kIGl0IHdpdGggaW5jb3JlX21hdGNoKCkKKwkgKiBpbiB4ZnNfdHJhbnNfZ2V0X2J1ZigpIGFuZCBmcmllbmRzIGFib3ZlLgorCSAqLworCVhGU19CVUZfU0VUX0ZTUFJJVkFURTIoYnAsIHRwKTsKKworCXhmc19idWZfaXRlbV90cmFjZSgiQkpPSU4iLCBiaXApOworfQorCisvKgorICogTWFyayB0aGUgYnVmZmVyIGFzIG5vdCBuZWVkaW5nIHRvIGJlIHVubG9ja2VkIHdoZW4gdGhlIGJ1ZiBpdGVtJ3MKKyAqIElPUF9VTkxPQ0soKSByb3V0aW5lIGlzIGNhbGxlZC4gIFRoZSBidWZmZXIgbXVzdCBhbHJlYWR5IGJlIGxvY2tlZAorICogYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24uCisgKi8KKy8qIEFSR1NVU0VEICovCit2b2lkCit4ZnNfdHJhbnNfYmhvbGQoeGZzX3RyYW5zX3QJKnRwLAorCQl4ZnNfYnVmX3QJKmJwKQoreworCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwOworCisJQVNTRVJUKFhGU19CVUZfSVNCVVNZKGJwKSk7CisJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFMihicCwgeGZzX3RyYW5zX3QgKikgPT0gdHApOworCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSAhPSBOVUxMKTsKKworCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QgKik7CisJQVNTRVJUKCEoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSk7CisJQVNTRVJUKCEoYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyAmIFhGU19CTElfQ0FOQ0VMKSk7CisJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKKwliaXAtPmJsaV9mbGFncyB8PSBYRlNfQkxJX0hPTEQ7CisJeGZzX2J1Zl9pdGVtX3RyYWNlKCJCSE9MRCIsIGJpcCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byBtYXJrIGJ5dGVzIGZpcnN0IHRocm91Z2ggbGFzdCBpbmNsdXNpdmUgb2YgdGhlIGdpdmVuCisgKiBidWZmZXIgYXMgbmVlZGluZyB0byBiZSBsb2dnZWQgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkLgorICogVGhlIGJ1ZmZlciBtdXN0IGFscmVhZHkgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB0cmFuc2FjdGlvbi4KKyAqCisgKiBGaXJzdCBhbmQgbGFzdCBhcmUgbnVtYmVycyByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgYnVmZmVyLAorICogc28gdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ1ZmZlciBpcyBudW1iZXJlZCAwIHJlZ2FyZGxlc3Mgb2YgdGhlCisgKiB2YWx1ZSBvZiBiX2Jsa25vLgorICovCit2b2lkCit4ZnNfdHJhbnNfbG9nX2J1Zih4ZnNfdHJhbnNfdAkqdHAsCisJCSAgeGZzX2J1Zl90CSpicCwKKwkJICB1aW50CQlmaXJzdCwKKwkJICB1aW50CQlsYXN0KQoreworCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwOworCXhmc19sb2dfaXRlbV9kZXNjX3QJKmxpZHA7CisKKwlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKKwlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB4ZnNfdHJhbnNfdCAqKSA9PSB0cCk7CisJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopICE9IE5VTEwpOworCUFTU0VSVCgoZmlyc3QgPD0gbGFzdCkgJiYgKGxhc3QgPCBYRlNfQlVGX0NPVU5UKGJwKSkpOworCUFTU0VSVCgoWEZTX0JVRl9JT0RPTkVfRlVOQyhicCkgPT0gTlVMTCkgfHwKKwkgICAgICAgKFhGU19CVUZfSU9ET05FX0ZVTkMoYnApID09IHhmc19idWZfaW9kb25lX2NhbGxiYWNrcykpOworCisJLyoKKwkgKiBNYXJrIHRoZSBidWZmZXIgYXMgbmVlZGluZyB0byBiZSB3cml0dGVuIG91dCBldmVudHVhbGx5LAorCSAqIGFuZCBzZXQgaXRzIGlvZG9uZSBmdW5jdGlvbiB0byByZW1vdmUgdGhlIGJ1ZmZlcidzIGJ1ZiBsb2cKKwkgKiBpdGVtIGZyb20gdGhlIEFJTCBhbmQgZnJlZSBpdCB3aGVuIHRoZSBidWZmZXIgaXMgZmx1c2hlZAorCSAqIHRvIGRpc2suICBTZWUgeGZzX2J1Zl9hdHRhY2hfaW9kb25lKCkgZm9yIG1vcmUgZGV0YWlscworCSAqIG9uIGxpX2NiIGFuZCB4ZnNfYnVmX2lvZG9uZV9jYWxsYmFja3MoKS4KKwkgKiBJZiB3ZSBlbmQgdXAgYWJvcnRpbmcgdGhpcyB0cmFuc2FjdGlvbiwgd2UgdHJhcCB0aGlzIGJ1ZmZlcgorCSAqIGluc2lkZSB0aGUgYl9iZHN0cmF0IGNhbGxiYWNrIHNvIHRoYXQgdGhpcyB3b24ndCBnZXQgd3JpdHRlbiB0bworCSAqIGRpc2suCisJICovCisJWEZTX0JVRl9ERUxBWVdSSVRFKGJwKTsKKwlYRlNfQlVGX0RPTkUoYnApOworCisJYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19idWZfbG9nX2l0ZW1fdCAqKTsKKwlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOworCVhGU19CVUZfU0VUX0lPRE9ORV9GVU5DKGJwLCB4ZnNfYnVmX2lvZG9uZV9jYWxsYmFja3MpOworCWJpcC0+YmxpX2l0ZW0ubGlfY2IgPSAodm9pZCgqKSh4ZnNfYnVmX3QqLHhmc19sb2dfaXRlbV90KikpeGZzX2J1Zl9pb2RvbmU7CisKKwkvKgorCSAqIElmIHdlIGludmFsaWRhdGVkIHRoZSBidWZmZXIgd2l0aGluIHRoaXMgdHJhbnNhY3Rpb24sIHRoZW4KKwkgKiBjYW5jZWwgdGhlIGludmFsaWRhdGlvbiBub3cgdGhhdCB3ZSdyZSBkaXJ0eWluZyB0aGUgYnVmZmVyCisJICogYWdhaW4uICBUaGVyZSBhcmUgbm8gcmFjZXMgd2l0aCB0aGUgY29kZSBpbiB4ZnNfYnVmX2l0ZW1fdW5waW4oKSwKKwkgKiBiZWNhdXNlIHdlIGhhdmUgYSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciB0aGlzIGVudGlyZSB0aW1lLgorCSAqLworCWlmIChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfU1RBTEUpIHsKKwkJeGZzX2J1Zl9pdGVtX3RyYWNlKCJCTE9HIFVOU1RBTEUiLCBiaXApOworCQliaXAtPmJsaV9mbGFncyAmPSB+WEZTX0JMSV9TVEFMRTsKKwkJQVNTRVJUKFhGU19CVUZfSVNTVEFMRShicCkpOworCQlYRlNfQlVGX1VOU1RBTEUoYnApOworCQliaXAtPmJsaV9mb3JtYXQuYmxmX2ZsYWdzICY9IH5YRlNfQkxJX0NBTkNFTDsKKwl9CisKKwlsaWRwID0geGZzX3RyYW5zX2ZpbmRfaXRlbSh0cCwgKHhmc19sb2dfaXRlbV90KiliaXApOworCUFTU0VSVChsaWRwICE9IE5VTEwpOworCisJdHAtPnRfZmxhZ3MgfD0gWEZTX1RSQU5TX0RJUlRZOworCWxpZHAtPmxpZF9mbGFncyB8PSBYRlNfTElEX0RJUlRZOworCWxpZHAtPmxpZF9mbGFncyAmPSB+WEZTX0xJRF9CVUZfU1RBTEU7CisJYmlwLT5ibGlfZmxhZ3MgfD0gWEZTX0JMSV9MT0dHRUQ7CisJeGZzX2J1Zl9pdGVtX2xvZyhiaXAsIGZpcnN0LCBsYXN0KTsKKwl4ZnNfYnVmX2l0ZW1fdHJhY2UoIkJMT0ciLCBiaXApOworfQorCisKKy8qCisgKiBUaGlzIGNhbGxlZCB0byBpbnZhbGlkYXRlIGEgYnVmZmVyIHRoYXQgaXMgYmVpbmcgdXNlZCB3aXRoaW4KKyAqIGEgdHJhbnNhY3Rpb24uICBUeXBpY2FsbHkgdGhpcyBpcyBiZWNhdXNlIHRoZSBibG9ja3MgaW4gdGhlCisgKiBidWZmZXIgYXJlIGJlaW5nIGZyZWVkLCBzbyB3ZSBuZWVkIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZworICogd3JpdHRlbiBvdXQgd2hlbiB3ZSdyZSBkb25lLiAgQWxsb3dpbmcgaXQgdG8gYmUgd3JpdHRlbiBhZ2FpbgorICogbWlnaHQgb3ZlcndyaXRlIGRhdGEgaW4gdGhlIGZyZWUgYmxvY2tzIGlmIHRoZXkgYXJlIHJlYWxsb2NhdGVkCisgKiB0byBhIGZpbGUuCisgKgorICogV2UgcHJldmVudCB0aGUgYnVmZmVyIGZyb20gYmVpbmcgd3JpdHRlbiBvdXQgYnkgY2xlYXJpbmcgdGhlCisgKiBCX0RFTFdSSSBmbGFnLiAgV2UgY2FuJ3QgYWx3YXlzCisgKiBnZXQgcmlkIG9mIHRoZSBidWYgbG9nIGl0ZW0gYXQgdGhpcyBwb2ludCwgdGhvdWdoLCBiZWNhdXNlCisgKiB0aGUgYnVmZmVyIG1heSBzdGlsbCBiZSBwaW5uZWQgYnkgYW5vdGhlciB0cmFuc2FjdGlvbi4gIElmIHRoYXQKKyAqIGlzIHRoZSBjYXNlLCB0aGVuIHdlJ2xsIHdhaXQgdW50aWwgdGhlIGJ1ZmZlciBpcyBjb21taXR0ZWQgdG8KKyAqIGRpc2sgZm9yIHRoZSBsYXN0IHRpbWUgKHdlIGNhbiB0ZWxsIGJ5IHRoZSByZWYgY291bnQpIGFuZAorICogZnJlZSBpdCBpbiB4ZnNfYnVmX2l0ZW1fdW5waW4oKS4gIFVudGlsIGl0IGlzIGNsZWFuZWQgdXAgd2UKKyAqIHdpbGwga2VlcCB0aGUgYnVmZmVyIGxvY2tlZCBzbyB0aGF0IHRoZSBidWZmZXIgYW5kIGJ1ZiBsb2cgaXRlbQorICogYXJlIG5vdCByZXVzZWQuCisgKi8KK3ZvaWQKK3hmc190cmFuc19iaW52YWwoCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19idWZfdAkqYnApCit7CisJeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKKworCUFTU0VSVChYRlNfQlVGX0lTQlVTWShicCkpOworCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHhmc190cmFuc190ICopID09IHRwKTsKKwlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgIT0gTlVMTCk7CisKKwliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2J1Zl9sb2dfaXRlbV90ICopOworCWxpZHAgPSB4ZnNfdHJhbnNfZmluZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QqKWJpcCk7CisJQVNTRVJUKGxpZHAgIT0gTlVMTCk7CisJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKKworCWlmIChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfU1RBTEUpIHsKKwkJLyoKKwkJICogSWYgdGhlIGJ1ZmZlciBpcyBhbHJlYWR5IGludmFsaWRhdGVkLCB0aGVuCisJCSAqIGp1c3QgcmV0dXJuLgorCQkgKi8KKwkJQVNTRVJUKCEoWEZTX0JVRl9JU0RFTEFZV1JJVEUoYnApKSk7CisJCUFTU0VSVChYRlNfQlVGX0lTU1RBTEUoYnApKTsKKwkJQVNTRVJUKCEoYmlwLT5ibGlfZmxhZ3MgJiAoWEZTX0JMSV9MT0dHRUQgfCBYRlNfQkxJX0RJUlRZKSkpOworCQlBU1NFUlQoIShiaXAtPmJsaV9mb3JtYXQuYmxmX2ZsYWdzICYgWEZTX0JMSV9JTk9ERV9CVUYpKTsKKwkJQVNTRVJUKGJpcC0+YmxpX2Zvcm1hdC5ibGZfZmxhZ3MgJiBYRlNfQkxJX0NBTkNFTCk7CisJCUFTU0VSVChsaWRwLT5saWRfZmxhZ3MgJiBYRlNfTElEX0RJUlRZKTsKKwkJQVNTRVJUKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX0RJUlRZKTsKKwkJeGZzX2J1ZnRyYWNlKCJYRlNfQklOVkFMIFJFQ1VSIiwgYnApOworCQl4ZnNfYnVmX2l0ZW1fdHJhY2UoIkJJTlZBTCBSRUNVUiIsIGJpcCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIENsZWFyIHRoZSBkaXJ0eSBiaXQgaW4gdGhlIGJ1ZmZlciBhbmQgc2V0IHRoZSBTVEFMRSBmbGFnCisJICogaW4gdGhlIGJ1ZiBsb2cgaXRlbS4gIFRoZSBTVEFMRSBmbGFnIHdpbGwgYmUgdXNlZCBpbgorCSAqIHhmc19idWZfaXRlbV91bnBpbigpIHRvIGRldGVybWluZSBpZiBpdCBzaG91bGQgY2xlYW4gdXAKKwkgKiB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGUgYnVmIGl0ZW0gaXMgZ2l2ZW4gdXAuCisJICogV2Ugc2V0IHRoZSBYRlNfQkxJX0NBTkNFTCBmbGFnIGluIHRoZSBidWYgbG9nIGZvcm1hdCBzdHJ1Y3R1cmUKKwkgKiBhbmQgbG9nIHRoZSBidWYgaXRlbS4gIFRoaXMgd2lsbCBiZSB1c2VkIGF0IHJlY292ZXJ5IHRpbWUKKwkgKiB0byBkZXRlcm1pbmUgdGhhdCBjb3BpZXMgb2YgdGhlIGJ1ZmZlciBpbiB0aGUgbG9nIGJlZm9yZQorCSAqIHRoaXMgc2hvdWxkIG5vdCBiZSByZXBsYXllZC4KKwkgKiBXZSBtYXJrIHRoZSBpdGVtIGRlc2NyaXB0b3IgYW5kIHRoZSB0cmFuc2FjdGlvbiBkaXJ0eSBzbworCSAqIHRoYXQgd2UnbGwgaG9sZCB0aGUgYnVmZmVyIHVudGlsIGFmdGVyIHRoZSBjb21taXQuCisJICoKKwkgKiBTaW5jZSB3ZSdyZSBpbnZhbGlkYXRpbmcgdGhlIGJ1ZmZlciwgd2UgYWxzbyBjbGVhciB0aGUgc3RhdGUKKwkgKiBhYm91dCB3aGljaCBwYXJ0cyBvZiB0aGUgYnVmZmVyIGhhdmUgYmVlbiBsb2dnZWQuICBXZSBhbHNvCisJICogY2xlYXIgdGhlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoaXMgaXMgYW4gaW5vZGUgYnVmZmVyIHNpbmNlCisJICogdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlciB3aWxsIG5vIGxvbmdlciBiZSB2YWxpZC4KKwkgKgorCSAqIFdlIHNldCB0aGUgc3RhbGUgYml0IGluIHRoZSBidWZmZXIgYXMgd2VsbCBzaW5jZSB3ZSdyZSBnZXR0aW5nCisJICogcmlkIG9mIGl0LgorCSAqLworCVhGU19CVUZfVU5ERUxBWVdSSVRFKGJwKTsKKwlYRlNfQlVGX1NUQUxFKGJwKTsKKwliaXAtPmJsaV9mbGFncyB8PSBYRlNfQkxJX1NUQUxFOworCWJpcC0+YmxpX2ZsYWdzICY9IH4oWEZTX0JMSV9MT0dHRUQgfCBYRlNfQkxJX0RJUlRZKTsKKwliaXAtPmJsaV9mb3JtYXQuYmxmX2ZsYWdzICY9IH5YRlNfQkxJX0lOT0RFX0JVRjsKKwliaXAtPmJsaV9mb3JtYXQuYmxmX2ZsYWdzIHw9IFhGU19CTElfQ0FOQ0VMOworCW1lbXNldCgoY2hhciAqKShiaXAtPmJsaV9mb3JtYXQuYmxmX2RhdGFfbWFwKSwgMCwKKwkgICAgICAoYmlwLT5ibGlfZm9ybWF0LmJsZl9tYXBfc2l6ZSAqIHNpemVvZih1aW50KSkpOworCWxpZHAtPmxpZF9mbGFncyB8PSBYRlNfTElEX0RJUlRZfFhGU19MSURfQlVGX1NUQUxFOworCXRwLT50X2ZsYWdzIHw9IFhGU19UUkFOU19ESVJUWTsKKwl4ZnNfYnVmdHJhY2UoIlhGU19CSU5WQUwiLCBicCk7CisJeGZzX2J1Zl9pdGVtX3RyYWNlKCJCSU5WQUwiLCBiaXApOworfQorCisvKgorICogVGhpcyBjYWxsIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgYnVmZmVyIGNvbnRhaW5zIG9uLWRpc2sKKyAqIGlub2RlcyB3aGljaCBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5IGR1cmluZyByZWNvdmVyeS4gIFRoZXkKKyAqIHJlcXVpcmUgc3BlY2lhbCBoYW5kbGluZyBiZWNhdXNlIG9ubHkgdGhlIGRpX25leHRfdW5saW5rZWQgZnJvbQorICogdGhlIGlub2RlcyBpbiB0aGUgYnVmZmVyIHNob3VsZCBiZSByZWNvdmVyZWQuICBUaGUgcmVzdCBvZiB0aGUKKyAqIGRhdGEgaW4gdGhlIGJ1ZmZlciBpcyBsb2dnZWQgdmlhIHRoZSBpbm9kZXMgdGhlbXNlbHZlcy4KKyAqCisgKiBBbGwgd2UgZG8gaXMgc2V0IHRoZSBYRlNfQkxJX0lOT0RFX0JVRiBmbGFnIGluIHRoZSBidWZmZXIncyBsb2cKKyAqIGZvcm1hdCBzdHJ1Y3R1cmUgc28gdGhhdCB3ZSdsbCBrbm93IHdoYXQgdG8gZG8gYXQgcmVjb3ZlcnkgdGltZS4KKyAqLworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK3hmc190cmFuc19pbm9kZV9idWYoCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19idWZfdAkqYnApCit7CisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7CisKKwlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKKwlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB4ZnNfdHJhbnNfdCAqKSA9PSB0cCk7CisJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopICE9IE5VTEwpOworCisJYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19idWZfbG9nX2l0ZW1fdCAqKTsKKwlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOworCisJYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyB8PSBYRlNfQkxJX0lOT0RFX0JVRjsKK30KKworLyoKKyAqIFRoaXMgY2FsbCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIGJ1ZmZlciBpcyBnb2luZyB0bworICogYmUgc3RhbGVkIGFuZCB3YXMgYW4gaW5vZGUgYnVmZmVyLiBUaGlzIG1lYW5zIGl0IGdldHMKKyAqIHNwZWNpYWwgcHJvY2Vzc2luZyBkdXJpbmcgdW5waW4gLSB3aGVyZSBhbnkgaW5vZGVzIAorICogYXNzb2NpYXRlZCB3aXRoIHRoZSBidWZmZXIgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBhaWwuCisgKiBUaGVyZSBpcyBhbHNvIHNwZWNpYWwgcHJvY2Vzc2luZyBkdXJpbmcgcmVjb3ZlcnksCisgKiBhbnkgcmVwbGF5IG9mIHRoZSBpbm9kZXMgaW4gdGhlIGJ1ZmZlciBuZWVkcyB0byBiZQorICogcHJldmVudGVkIGFzIHRoZSBidWZmZXIgbWF5IGhhdmUgYmVlbiByZXVzZWQuCisgKi8KK3ZvaWQKK3hmc190cmFuc19zdGFsZV9pbm9kZV9idWYoCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19idWZfdAkqYnApCit7CisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7CisKKwlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKKwlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB4ZnNfdHJhbnNfdCAqKSA9PSB0cCk7CisJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopICE9IE5VTEwpOworCisJYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19idWZfbG9nX2l0ZW1fdCAqKTsKKwlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOworCisJYmlwLT5ibGlfZmxhZ3MgfD0gWEZTX0JMSV9TVEFMRV9JTk9ERTsKKwliaXAtPmJsaV9pdGVtLmxpX2NiID0gKHZvaWQoKikoeGZzX2J1Zl90Kix4ZnNfbG9nX2l0ZW1fdCopKQorCQl4ZnNfYnVmX2lvZG9uZTsKK30KKworCisKKy8qCisgKiBNYXJrIHRoZSBidWZmZXIgYXMgYmVpbmcgb25lIHdoaWNoIGNvbnRhaW5zIG5ld2x5IGFsbG9jYXRlZAorICogaW5vZGVzLiAgV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBldmVuIGlmIHRoaXMgYnVmZmVyIGlzCisgKiByZWxvZ2dlZCBhcyBhbiAnaW5vZGUgYnVmJyB3ZSBzdGlsbCByZWNvdmVyIGFsbCBvZiB0aGUgaW5vZGUKKyAqIGltYWdlcyBpbiB0aGUgZmFjZSBvZiBhIGNyYXNoLiAgVGhpcyB3b3JrcyBpbiBjb29yZGluYXRpb24gd2l0aAorICogeGZzX2J1Zl9pdGVtX2NvbW1pdHRlZCgpIHRvIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgcmVtYWlucyBpbiB0aGUKKyAqIEFJTCBhdCBpdHMgb3JpZ2luYWwgbG9jYXRpb24gZXZlbiBhZnRlciBpdCBoYXMgYmVlbiByZWxvZ2dlZC4KKyAqLworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK3hmc190cmFuc19pbm9kZV9hbGxvY19idWYoCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19idWZfdAkqYnApCit7CisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7CisKKwlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKKwlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB4ZnNfdHJhbnNfdCAqKSA9PSB0cCk7CisJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopICE9IE5VTEwpOworCisJYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19idWZfbG9nX2l0ZW1fdCAqKTsKKwlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOworCisJYmlwLT5ibGlfZmxhZ3MgfD0gWEZTX0JMSV9JTk9ERV9BTExPQ19CVUY7Cit9CisKKworLyoKKyAqIFNpbWlsYXIgdG8geGZzX3RyYW5zX2lub2RlX2J1ZigpLCB0aGlzIG1hcmtzIHRoZSBidWZmZXIgYXMgYSBjbHVzdGVyIG9mCisgKiBkcXVvdHMuIEhvd2V2ZXIsIHVubGlrZSBpbiBpbm9kZSBidWZmZXIgcmVjb3ZlcnksIGRxdW90IGJ1ZmZlcnMgZ2V0CisgKiByZWNvdmVyZWQgaW4gdGhlaXIgZW50aXJldHkuIChIZW5jZSwgbm8gWEZTX0JMSV9EUVVPVF9BTExPQ19CVUYgZmxhZykuCisgKiBUaGUgb25seSB0aGluZyB0aGF0IG1ha2VzIGRxdW90IGJ1ZmZlcnMgZGlmZmVyZW50IGZyb20gcmVndWxhcgorICogYnVmZmVycyBpcyB0aGF0IHdlIG11c3Qgbm90IHJlcGxheSBkcXVvdCBidWZzIHdoZW4gcmVjb3ZlcmluZworICogaWYgYSBfY29ycmVzcG9uZGluZ18gcXVvdGFvZmYgaGFzIGhhcHBlbmVkLiBXZSBhbHNvIGhhdmUgdG8gZGlzdGluZ3Vpc2gKKyAqIGJldHdlZW4gdXNyIGRxdW90IGJ1ZnMgYW5kIGdycCBkcXVvdCBidWZzLCBiZWNhdXNlIHVzciBhbmQgZ3JwIHF1b3RhcworICogY2FuIGJlIHR1cm5lZCBvZmYgaW5kZXBlbmRlbnRseS4KKyAqLworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK3hmc190cmFuc19kcXVvdF9idWYoCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19idWZfdAkqYnAsCisJdWludAkJdHlwZSkKK3sKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKKworCUFTU0VSVChYRlNfQlVGX0lTQlVTWShicCkpOworCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHhmc190cmFuc190ICopID09IHRwKTsKKwlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgIT0gTlVMTCk7CisJQVNTRVJUKHR5cGUgPT0gWEZTX0JMSV9VRFFVT1RfQlVGIHx8CisJICAgICAgIHR5cGUgPT0gWEZTX0JMSV9HRFFVT1RfQlVGKTsKKworCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QgKik7CisJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKKworCWJpcC0+YmxpX2Zvcm1hdC5ibGZfZmxhZ3MgfD0gdHlwZTsKK30KKworLyoKKyAqIENoZWNrIHRvIHNlZSBpZiBhIGJ1ZmZlciBtYXRjaGluZyB0aGUgZ2l2ZW4gcGFyYW1ldGVycyBpcyBhbHJlYWR5CisgKiBhIHBhcnQgb2YgdGhlIGdpdmVuIHRyYW5zYWN0aW9uLiAgT25seSBjaGVjayB0aGUgZmlyc3QsIGVtYmVkZGVkCisgKiBjaHVuaywgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBzcGVuZCBhbGwgZGF5IHNjYW5uaW5nIGxhcmdlIHRyYW5zYWN0aW9ucy4KKyAqLworU1RBVElDIHhmc19idWZfdCAqCit4ZnNfdHJhbnNfYnVmX2l0ZW1fbWF0Y2goCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19idWZ0YXJnX3QJKnRhcmdldCwKKwl4ZnNfZGFkZHJfdAlibGtubywKKwlpbnQJCWxlbikKK3sKKwl4ZnNfbG9nX2l0ZW1fY2h1bmtfdAkqbGljcDsKKwl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOworCXhmc19idWZfbG9nX2l0ZW1fdAkqYmxpcDsKKwl4ZnNfYnVmX3QJCSpicDsKKwlpbnQJCQlpOworCisJYnAgPSBOVUxMOworCWxlbiA9IEJCVE9CKGxlbik7CisJbGljcCA9ICZ0cC0+dF9pdGVtczsKKwlpZiAoIVhGU19MSUNfQVJFX0FMTF9GUkVFKGxpY3ApKSB7CisJCWZvciAoaSA9IDA7IGkgPCBsaWNwLT5saWNfdW51c2VkOyBpKyspIHsKKwkJCS8qCisJCQkgKiBTa2lwIHVub2NjdXBpZWQgc2xvdHMuCisJCQkgKi8KKwkJCWlmIChYRlNfTElDX0lTRlJFRShsaWNwLCBpKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlsaWRwID0gWEZTX0xJQ19TTE9UKGxpY3AsIGkpOworCQkJYmxpcCA9ICh4ZnNfYnVmX2xvZ19pdGVtX3QgKilsaWRwLT5saWRfaXRlbTsKKwkJCWlmIChibGlwLT5ibGlfaXRlbS5saV90eXBlICE9IFhGU19MSV9CVUYpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJYnAgPSBibGlwLT5ibGlfYnVmOworCQkJaWYgKChYRlNfQlVGX1RBUkdFVChicCkgPT0gdGFyZ2V0KSAmJgorCQkJICAgIChYRlNfQlVGX0FERFIoYnApID09IGJsa25vKSAmJgorCQkJICAgIChYRlNfQlVGX0NPVU5UKGJwKSA9PSBsZW4pKSB7CisJCQkJLyoKKwkJCQkgKiBXZSBmb3VuZCBpdC4gIEJyZWFrIG91dCBhbmQKKwkJCQkgKiByZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlci4KKwkJCQkgKi8KKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJYnAgPSBOVUxMOworCQkJfQorCQl9CisJfQorCXJldHVybiBicDsKK30KKworLyoKKyAqIENoZWNrIHRvIHNlZSBpZiBhIGJ1ZmZlciBtYXRjaGluZyB0aGUgZ2l2ZW4gcGFyYW1ldGVycyBpcyBhbHJlYWR5CisgKiBhIHBhcnQgb2YgdGhlIGdpdmVuIHRyYW5zYWN0aW9uLiAgQ2hlY2sgYWxsIHRoZSBjaHVua3MsIHdlCisgKiB3YW50IHRvIGJlIHRob3JvdWdoLgorICovCitTVEFUSUMgeGZzX2J1Zl90ICoKK3hmc190cmFuc19idWZfaXRlbV9tYXRjaF9hbGwoCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19idWZ0YXJnX3QJKnRhcmdldCwKKwl4ZnNfZGFkZHJfdAlibGtubywKKwlpbnQJCWxlbikKK3sKKwl4ZnNfbG9nX2l0ZW1fY2h1bmtfdAkqbGljcDsKKwl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOworCXhmc19idWZfbG9nX2l0ZW1fdAkqYmxpcDsKKwl4ZnNfYnVmX3QJCSpicDsKKwlpbnQJCQlpOworCisJYnAgPSBOVUxMOworCWxlbiA9IEJCVE9CKGxlbik7CisJZm9yIChsaWNwID0gJnRwLT50X2l0ZW1zOyBsaWNwICE9IE5VTEw7IGxpY3AgPSBsaWNwLT5saWNfbmV4dCkgeworCQlpZiAoWEZTX0xJQ19BUkVfQUxMX0ZSRUUobGljcCkpIHsKKwkJCUFTU0VSVChsaWNwID09ICZ0cC0+dF9pdGVtcyk7CisJCQlBU1NFUlQobGljcC0+bGljX25leHQgPT0gTlVMTCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgbGljcC0+bGljX3VudXNlZDsgaSsrKSB7CisJCQkvKgorCQkJICogU2tpcCB1bm9jY3VwaWVkIHNsb3RzLgorCQkJICovCisJCQlpZiAoWEZTX0xJQ19JU0ZSRUUobGljcCwgaSkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJbGlkcCA9IFhGU19MSUNfU0xPVChsaWNwLCBpKTsKKwkJCWJsaXAgPSAoeGZzX2J1Zl9sb2dfaXRlbV90ICopbGlkcC0+bGlkX2l0ZW07CisJCQlpZiAoYmxpcC0+YmxpX2l0ZW0ubGlfdHlwZSAhPSBYRlNfTElfQlVGKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWJwID0gYmxpcC0+YmxpX2J1ZjsKKwkJCWlmICgoWEZTX0JVRl9UQVJHRVQoYnApID09IHRhcmdldCkgJiYKKwkJCSAgICAoWEZTX0JVRl9BRERSKGJwKSA9PSBibGtubykgJiYKKwkJCSAgICAoWEZTX0JVRl9DT1VOVChicCkgPT0gbGVuKSkgeworCQkJCS8qCisJCQkJICogV2UgZm91bmQgaXQuICBCcmVhayBvdXQgYW5kCisJCQkJICogcmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSBidWZmZXIuCisJCQkJICovCisJCQkJcmV0dXJuIGJwOworCQkJfQorCQl9CisJfQorCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19leHRmcmVlLmMgYi9mcy94ZnMveGZzX3RyYW5zX2V4dGZyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzI1OWExCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc190cmFuc19leHRmcmVlLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnNfcHJpdi5oIgorI2luY2x1ZGUgInhmc19leHRmcmVlX2l0ZW0uaCIKKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gYWxsb2NhdGUgYW4gImV4dGVudCBmcmVlIGludGVudGlvbiIKKyAqIGxvZyBpdGVtIHRoYXQgd2lsbCBob2xkIG5leHRlbnRzIHdvcnRoIG9mIGV4dGVudHMuICBUaGUKKyAqIGNhbGxlciBtdXN0IHVzZSBhbGwgbmV4dGVudHMgZXh0ZW50cywgYmVjYXVzZSB3ZSBhcmUgbm90CisgKiBmbGV4aWJsZSBhYm91dCB0aGlzIGF0IGFsbC4KKyAqLworeGZzX2VmaV9sb2dfaXRlbV90ICoKK3hmc190cmFuc19nZXRfZWZpKHhmc190cmFuc190CSp0cCwKKwkJICB1aW50CQluZXh0ZW50cykKK3sKKwl4ZnNfZWZpX2xvZ19pdGVtX3QJKmVmaXA7CisKKwlBU1NFUlQodHAgIT0gTlVMTCk7CisJQVNTRVJUKG5leHRlbnRzID4gMCk7CisKKwllZmlwID0geGZzX2VmaV9pbml0KHRwLT50X21vdW50cCwgbmV4dGVudHMpOworCUFTU0VSVChlZmlwICE9IE5VTEwpOworCisJLyoKKwkgKiBHZXQgYSBsb2dfaXRlbV9kZXNjIHRvIHBvaW50IGF0IHRoZSBuZXcgaXRlbS4KKwkgKi8KKwkodm9pZCkgeGZzX3RyYW5zX2FkZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QqKWVmaXApOworCisJcmV0dXJuIChlZmlwKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZGVzY3JpYmVkCisgKiBleHRlbnQgaXMgdG8gYmUgbG9nZ2VkIGFzIG5lZWRpbmcgdG8gYmUgZnJlZWQuICBJdCBzaG91bGQKKyAqIGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIGV4dGVudCB0byBiZSBmcmVlZC4KKyAqLwordm9pZAoreGZzX3RyYW5zX2xvZ19lZmlfZXh0ZW50KHhmc190cmFuc190CQkqdHAsCisJCQkgeGZzX2VmaV9sb2dfaXRlbV90CSplZmlwLAorCQkJIHhmc19mc2Jsb2NrX3QJCXN0YXJ0X2Jsb2NrLAorCQkJIHhmc19leHRsZW5fdAkJZXh0X2xlbikKK3sKKwl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOworCXVpbnQJCQluZXh0X2V4dGVudDsKKwl4ZnNfZXh0ZW50X3QJCSpleHRwOworCisJbGlkcCA9IHhmc190cmFuc19maW5kX2l0ZW0odHAsICh4ZnNfbG9nX2l0ZW1fdCopZWZpcCk7CisJQVNTRVJUKGxpZHAgIT0gTlVMTCk7CisKKwl0cC0+dF9mbGFncyB8PSBYRlNfVFJBTlNfRElSVFk7CisJbGlkcC0+bGlkX2ZsYWdzIHw9IFhGU19MSURfRElSVFk7CisKKwluZXh0X2V4dGVudCA9IGVmaXAtPmVmaV9uZXh0X2V4dGVudDsKKwlBU1NFUlQobmV4dF9leHRlbnQgPCBlZmlwLT5lZmlfZm9ybWF0LmVmaV9uZXh0ZW50cyk7CisJZXh0cCA9ICYoZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfZXh0ZW50c1tuZXh0X2V4dGVudF0pOworCWV4dHAtPmV4dF9zdGFydCA9IHN0YXJ0X2Jsb2NrOworCWV4dHAtPmV4dF9sZW4gPSBleHRfbGVuOworCWVmaXAtPmVmaV9uZXh0X2V4dGVudCsrOworfQorCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGFsbG9jYXRlIGFuICJleHRlbnQgZnJlZSBkb25lIgorICogbG9nIGl0ZW0gdGhhdCB3aWxsIGhvbGQgbmV4dGVudHMgd29ydGggb2YgZXh0ZW50cy4gIFRoZQorICogY2FsbGVyIG11c3QgdXNlIGFsbCBuZXh0ZW50cyBleHRlbnRzLCBiZWNhdXNlIHdlIGFyZSBub3QKKyAqIGZsZXhpYmxlIGFib3V0IHRoaXMgYXQgYWxsLgorICovCit4ZnNfZWZkX2xvZ19pdGVtX3QgKgoreGZzX3RyYW5zX2dldF9lZmQoeGZzX3RyYW5zX3QJCSp0cCwKKwkJICB4ZnNfZWZpX2xvZ19pdGVtX3QJKmVmaXAsCisJCSAgdWludAkJCW5leHRlbnRzKQoreworCXhmc19lZmRfbG9nX2l0ZW1fdAkqZWZkcDsKKworCUFTU0VSVCh0cCAhPSBOVUxMKTsKKwlBU1NFUlQobmV4dGVudHMgPiAwKTsKKworCWVmZHAgPSB4ZnNfZWZkX2luaXQodHAtPnRfbW91bnRwLCBlZmlwLCBuZXh0ZW50cyk7CisJQVNTRVJUKGVmZHAgIT0gTlVMTCk7CisKKwkvKgorCSAqIEdldCBhIGxvZ19pdGVtX2Rlc2MgdG8gcG9pbnQgYXQgdGhlIG5ldyBpdGVtLgorCSAqLworCSh2b2lkKSB4ZnNfdHJhbnNfYWRkX2l0ZW0odHAsICh4ZnNfbG9nX2l0ZW1fdCopZWZkcCk7CisKKwlyZXR1cm4gKGVmZHApOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBkZXNjcmliZWQKKyAqIGV4dGVudCBpcyB0byBiZSBsb2dnZWQgYXMgaGF2aW5nIGJlZW4gZnJlZWQuICBJdCBzaG91bGQKKyAqIGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIGV4dGVudCBmcmVlZC4KKyAqLwordm9pZAoreGZzX3RyYW5zX2xvZ19lZmRfZXh0ZW50KHhmc190cmFuc190CQkqdHAsCisJCQkgeGZzX2VmZF9sb2dfaXRlbV90CSplZmRwLAorCQkJIHhmc19mc2Jsb2NrX3QJCXN0YXJ0X2Jsb2NrLAorCQkJIHhmc19leHRsZW5fdAkJZXh0X2xlbikKK3sKKwl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOworCXVpbnQJCQluZXh0X2V4dGVudDsKKwl4ZnNfZXh0ZW50X3QJCSpleHRwOworCisJbGlkcCA9IHhmc190cmFuc19maW5kX2l0ZW0odHAsICh4ZnNfbG9nX2l0ZW1fdCopZWZkcCk7CisJQVNTRVJUKGxpZHAgIT0gTlVMTCk7CisKKwl0cC0+dF9mbGFncyB8PSBYRlNfVFJBTlNfRElSVFk7CisJbGlkcC0+bGlkX2ZsYWdzIHw9IFhGU19MSURfRElSVFk7CisKKwluZXh0X2V4dGVudCA9IGVmZHAtPmVmZF9uZXh0X2V4dGVudDsKKwlBU1NFUlQobmV4dF9leHRlbnQgPCBlZmRwLT5lZmRfZm9ybWF0LmVmZF9uZXh0ZW50cyk7CisJZXh0cCA9ICYoZWZkcC0+ZWZkX2Zvcm1hdC5lZmRfZXh0ZW50c1tuZXh0X2V4dGVudF0pOworCWV4dHAtPmV4dF9zdGFydCA9IHN0YXJ0X2Jsb2NrOworCWV4dHAtPmV4dF9sZW4gPSBleHRfbGVuOworCWVmZHAtPmVmZF9uZXh0X2V4dGVudCsrOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19pbm9kZS5jIGIvZnMveGZzL3hmc190cmFuc19pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYzM3MDYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX3RyYW5zX2lub2RlLmMKQEAgLTAsMCArMSwzNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisKKyNpZmRlZiBYRlNfVFJBTlNfREVCVUcKK1NUQVRJQyB2b2lkCit4ZnNfdHJhbnNfaW5vZGVfYnJvb3RfZGVidWcoCisJeGZzX2lub2RlX3QJKmlwKTsKKyNlbHNlCisjZGVmaW5lCXhmc190cmFuc19pbm9kZV9icm9vdF9kZWJ1ZyhpcCkKKyNlbmRpZgorCisKKy8qCisgKiBHZXQgYW5kIGxvY2sgdGhlIGlub2RlIGZvciB0aGUgY2FsbGVyIGlmIGl0IGlzIG5vdCBhbHJlYWR5CisgKiBsb2NrZWQgd2l0aGluIHRoZSBnaXZlbiB0cmFuc2FjdGlvbi4gIElmIGl0IGlzIGFscmVhZHkgbG9ja2VkCisgKiB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uLCBqdXN0IGluY3JlbWVudCBpdHMgbG9jayByZWN1cnNpb24gY291bnQKKyAqIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LgorICoKKyAqIEZvciBhbiBpbm9kZSB0byBiZSBsb2NrZWQgaW4gYSB0cmFuc2FjdGlvbiwgdGhlIGlub2RlIGxvY2ssIGFzCisgKiBvcHBvc2VkIHRvIHRoZSBpbyBsb2NrLCBtdXN0IGJlIHRha2VuIGV4Y2x1c2l2ZWx5LiAgVGhpcyBlbnN1cmVzCisgKiB0aGF0IHRoZSBpbm9kZSBjYW4gYmUgaW52b2x2ZWQgaW4gb25seSAxIHRyYW5zYWN0aW9uIGF0IGEgdGltZS4KKyAqIExvY2sgcmVjdXJzaW9uIGlzIGhhbmRsZWQgb24gdGhlIGlvIGxvY2ssIGJ1dCBvbmx5IGZvciBsb2NrIG1vZGVzCisgKiBvZiBlcXVhbCBvciBsZXNzZXIgc3RyZW5ndGguICBUaGF0IGlzLCB5b3UgY2FuIHJlY3VyIG9uIHRoZSBpbyBsb2NrCisgKiBoZWxkIEVYQ0wgd2l0aCBhIFNIQVJFRCByZXF1ZXN0IGJ1dCBub3QgdmljZSB2ZXJzYS4gIEFsc28sIGlmCisgKiB0aGUgaW5vZGUgaXMgYWxyZWFkeSBhIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uIHRoZW4geW91IGNhbm5vdAorICogZ28gZnJvbSBub3QgaG9sZGluZyB0aGUgaW8gbG9jayB0byBoYXZpbmcgaXQgRVhDTCBvciBTSEFSRUQuCisgKgorICogVXNlIHRoZSBpbm9kZSBjYWNoZSByb3V0aW5lIHhmc19pbm9kZV9pbmNvcmUoKSB0byBmaW5kIHRoZSBpbm9kZQorICogaWYgaXQgaXMgYWxyZWFkeSBvd25lZCBieSB0aGlzIHRyYW5zYWN0aW9uLgorICoKKyAqIElmIHdlIGRvbid0IGFscmVhZHkgb3duIHRoZSBpbm9kZSwgdXNlIHhmc19pZ2V0KCkgdG8gZ2V0IGl0LgorICogU2luY2UgdGhlIGlub2RlIGxvZyBpdGVtIHN0cnVjdHVyZSBpcyBlbWJlZGRlZCBpbiB0aGUgaW5jb3JlCisgKiBpbm9kZSBzdHJ1Y3R1cmUgYW5kIGlzIGluaXRpYWxpemVkIHdoZW4gdGhlIGlub2RlIGlzIGJyb3VnaHQKKyAqIGludG8gbWVtb3J5LCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIHdpdGggaXQgaGVyZS4KKyAqCisgKiBJZiB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24gcG9pbnRlciBpcyBOVUxMLCBqdXN0IGNhbGwgeGZzX2lnZXQoKS4KKyAqIFRoaXMgc2ltcGxpZmllcyBjb2RlIHdoaWNoIG11c3QgaGFuZGxlIGJvdGggY2FzZXMuCisgKi8KK2ludAoreGZzX3RyYW5zX2lnZXQoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfaW5vX3QJaW5vLAorCXVpbnQJCWZsYWdzLAorCXVpbnQJCWxvY2tfZmxhZ3MsCisJeGZzX2lub2RlX3QJKippcHApCit7CisJaW50CQkJZXJyb3I7CisJeGZzX2lub2RlX3QJCSppcDsKKwl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwOworCisJLyoKKwkgKiBJZiB0aGUgdHJhbnNhY3Rpb24gcG9pbnRlciBpcyBOVUxMLCBqdXN0IGNhbGwgdGhlIG5vcm1hbAorCSAqIHhmc19pZ2V0KCkuCisJICovCisJaWYgKHRwID09IE5VTEwpCisJCXJldHVybiB4ZnNfaWdldChtcCwgTlVMTCwgaW5vLCBmbGFncywgbG9ja19mbGFncywgaXBwLCAwKTsKKworCS8qCisJICogSWYgd2UgZmluZCB0aGUgaW5vZGUgaW4gY29yZSB3aXRoIHRoaXMgdHJhbnNhY3Rpb24KKwkgKiBwb2ludGVyIGluIGl0cyBpX3RyYW5zcCBmaWVsZCwgdGhlbiB3ZSBrbm93IHdlIGFscmVhZHkKKwkgKiBoYXZlIGl0IGxvY2tlZC4gIEluIHRoaXMgY2FzZSB3ZSBqdXN0IGluY3JlbWVudCB0aGUgbG9jaworCSAqIHJlY3Vyc2lvbiBjb3VudCBhbmQgcmV0dXJuIHRoZSBpbm9kZSB0byB0aGUgY2FsbGVyLgorCSAqIEFzc2VydCB0aGF0IHRoZSBpbm9kZSBpcyBhbHJlYWR5IGxvY2tlZCBpbiB0aGUgbW9kZSByZXF1ZXN0ZWQKKwkgKiBieSB0aGUgY2FsbGVyLiAgV2UgY2Fubm90IGRvIGxvY2sgcHJvbW90aW9ucyB5ZXQsIHNvCisJICogZGllIGlmIHNvbWVvbmUgZ2V0cyB0aGlzIHdyb25nLgorCSAqLworCWlmICgoaXAgPSB4ZnNfaW5vZGVfaW5jb3JlKHRwLT50X21vdW50cCwgaW5vLCB0cCkpICE9IE5VTEwpIHsKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoYXQgdGhlIGlub2RlIGxvY2sgaXMgaGVsZCBFWENMIGFuZAorCQkgKiB0aGF0IHRoZSBpbyBsb2NrIGlzIG5ldmVyIHVwZ3JhZGVkIHdoZW4gdGhlIGlub2RlCisJCSAqIGlzIGFscmVhZHkgYSBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbi4KKwkJICovCisJCUFTU0VSVChpcC0+aV9pdGVtcCAhPSBOVUxMKTsKKwkJQVNTRVJUKGxvY2tfZmxhZ3MgJiBYRlNfSUxPQ0tfRVhDTCk7CisJCUFTU0VSVChpc21ybG9ja2VkKCZpcC0+aV9sb2NrLCBNUl9VUERBVEUpKTsKKwkJQVNTRVJUKCghKGxvY2tfZmxhZ3MgJiBYRlNfSU9MT0NLX0VYQ0wpKSB8fAorCQkgICAgICAgaXNtcmxvY2tlZCgmaXAtPmlfaW9sb2NrLCBNUl9VUERBVEUpKTsKKwkJQVNTRVJUKCghKGxvY2tfZmxhZ3MgJiBYRlNfSU9MT0NLX0VYQ0wpKSB8fAorCQkgICAgICAgKGlwLT5pX2l0ZW1wLT5pbGlfZmxhZ3MgJiBYRlNfSUxJX0lPTE9DS0VEX0VYQ0wpKTsKKwkJQVNTRVJUKCghKGxvY2tfZmxhZ3MgJiBYRlNfSU9MT0NLX1NIQVJFRCkpIHx8CisJCSAgICAgICBpc21ybG9ja2VkKCZpcC0+aV9pb2xvY2ssIChNUl9VUERBVEUgfCBNUl9BQ0NFU1MpKSk7CisJCUFTU0VSVCgoIShsb2NrX2ZsYWdzICYgWEZTX0lPTE9DS19TSEFSRUQpKSB8fAorCQkgICAgICAgKGlwLT5pX2l0ZW1wLT5pbGlfZmxhZ3MgJiBYRlNfSUxJX0lPTE9DS0VEX0FOWSkpOworCisJCWlmIChsb2NrX2ZsYWdzICYgKFhGU19JT0xPQ0tfU0hBUkVEIHwgWEZTX0lPTE9DS19FWENMKSkgeworCQkJaXAtPmlfaXRlbXAtPmlsaV9pb2xvY2tfcmVjdXIrKzsKKwkJfQorCQlpZiAobG9ja19mbGFncyAmIFhGU19JTE9DS19FWENMKSB7CisJCQlpcC0+aV9pdGVtcC0+aWxpX2lsb2NrX3JlY3VyKys7CisJCX0KKwkJKmlwcCA9IGlwOworCQlyZXR1cm4gMDsKKwl9CisKKwlBU1NFUlQobG9ja19mbGFncyAmIFhGU19JTE9DS19FWENMKTsKKwllcnJvciA9IHhmc19pZ2V0KHRwLT50X21vdW50cCwgdHAsIGlubywgZmxhZ3MsIGxvY2tfZmxhZ3MsICZpcCwgMCk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJQVNTRVJUKGlwICE9IE5VTEwpOworCisJLyoKKwkgKiBHZXQgYSBsb2dfaXRlbV9kZXNjIHRvIHBvaW50IGF0IHRoZSBuZXcgaXRlbS4KKwkgKi8KKwlpZiAoaXAtPmlfaXRlbXAgPT0gTlVMTCkKKwkJeGZzX2lub2RlX2l0ZW1faW5pdChpcCwgbXApOworCWlpcCA9IGlwLT5pX2l0ZW1wOworCSh2b2lkKSB4ZnNfdHJhbnNfYWRkX2l0ZW0odHAsICh4ZnNfbG9nX2l0ZW1fdCAqKShpaXApKTsKKworCXhmc190cmFuc19pbm9kZV9icm9vdF9kZWJ1ZyhpcCk7CisKKwkvKgorCSAqIElmIHRoZSBJTyBsb2NrIGhhcyBiZWVuIGFjcXVpcmVkLCBtYXJrIHRoYXQgaW4KKwkgKiB0aGUgaW5vZGUgbG9nIGl0ZW0gc28gd2UnbGwga25vdyB0byB1bmxvY2sgaXQKKwkgKiB3aGVuIHRoZSB0cmFuc2FjdGlvbiBjb21taXRzLgorCSAqLworCUFTU0VSVChpaXAtPmlsaV9mbGFncyA9PSAwKTsKKwlpZiAobG9ja19mbGFncyAmIFhGU19JT0xPQ0tfRVhDTCkgeworCQlpaXAtPmlsaV9mbGFncyB8PSBYRlNfSUxJX0lPTE9DS0VEX0VYQ0w7CisJfSBlbHNlIGlmIChsb2NrX2ZsYWdzICYgWEZTX0lPTE9DS19TSEFSRUQpIHsKKwkJaWlwLT5pbGlfZmxhZ3MgfD0gWEZTX0lMSV9JT0xPQ0tFRF9TSEFSRUQ7CisJfQorCisJLyoKKwkgKiBJbml0aWFsaXplIGlfdHJhbnNwIHNvIHdlIGNhbiBmaW5kIGl0IHdpdGggeGZzX2lub2RlX2luY29yZSgpCisJICogYWJvdmUuCisJICovCisJaXAtPmlfdHJhbnNwID0gdHA7CisKKwkqaXBwID0gaXA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBZGQgdGhlIGxvY2tlZCBpbm9kZSB0byB0aGUgdHJhbnNhY3Rpb24uCisgKiBUaGUgaW5vZGUgbXVzdCBiZSBsb2NrZWQsIGFuZCBpdCBjYW5ub3QgYmUgYXNzb2NpYXRlZCB3aXRoIGFueQorICogdHJhbnNhY3Rpb24uICBUaGUgY2FsbGVyIG11c3Qgc3BlY2lmeSB0aGUgbG9ja3MgYWxyZWFkeSBoZWxkCisgKiBvbiB0aGUgaW5vZGUuCisgKi8KK3ZvaWQKK3hmc190cmFuc19pam9pbigKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX2lub2RlX3QJKmlwLAorCXVpbnQJCWxvY2tfZmxhZ3MpCit7CisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcDsKKworCUFTU0VSVChpcC0+aV90cmFuc3AgPT0gTlVMTCk7CisJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2xvY2ssIE1SX1VQREFURSkpOworCUFTU0VSVChsb2NrX2ZsYWdzICYgWEZTX0lMT0NLX0VYQ0wpOworCWlmIChpcC0+aV9pdGVtcCA9PSBOVUxMKQorCQl4ZnNfaW5vZGVfaXRlbV9pbml0KGlwLCBpcC0+aV9tb3VudCk7CisJaWlwID0gaXAtPmlfaXRlbXA7CisJQVNTRVJUKGlpcC0+aWxpX2ZsYWdzID09IDApOworCUFTU0VSVChpaXAtPmlsaV9pbG9ja19yZWN1ciA9PSAwKTsKKwlBU1NFUlQoaWlwLT5pbGlfaW9sb2NrX3JlY3VyID09IDApOworCisJLyoKKwkgKiBHZXQgYSBsb2dfaXRlbV9kZXNjIHRvIHBvaW50IGF0IHRoZSBuZXcgaXRlbS4KKwkgKi8KKwkodm9pZCkgeGZzX3RyYW5zX2FkZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QqKShpaXApKTsKKworCXhmc190cmFuc19pbm9kZV9icm9vdF9kZWJ1ZyhpcCk7CisKKwkvKgorCSAqIElmIHRoZSBJTyBsb2NrIGlzIGFscmVhZHkgaGVsZCwgbWFyayB0aGF0IGluIHRoZSBpbm9kZSBsb2cgaXRlbS4KKwkgKi8KKwlpZiAobG9ja19mbGFncyAmIFhGU19JT0xPQ0tfRVhDTCkgeworCQlpaXAtPmlsaV9mbGFncyB8PSBYRlNfSUxJX0lPTE9DS0VEX0VYQ0w7CisJfSBlbHNlIGlmIChsb2NrX2ZsYWdzICYgWEZTX0lPTE9DS19TSEFSRUQpIHsKKwkJaWlwLT5pbGlfZmxhZ3MgfD0gWEZTX0lMSV9JT0xPQ0tFRF9TSEFSRUQ7CisJfQorCisJLyoKKwkgKiBJbml0aWFsaXplIGlfdHJhbnNwIHNvIHdlIGNhbiBmaW5kIGl0IHdpdGggeGZzX2lub2RlX2luY29yZSgpCisJICogaW4geGZzX3RyYW5zX2lnZXQoKSBhYm92ZS4KKwkgKi8KKwlpcC0+aV90cmFuc3AgPSB0cDsKK30KKworCisKKy8qCisgKiBNYXJrIHRoZSBpbm9kZSBhcyBub3QgbmVlZGluZyB0byBiZSB1bmxvY2tlZCB3aGVuIHRoZSBpbm9kZSBpdGVtJ3MKKyAqIElPUF9VTkxPQ0soKSByb3V0aW5lIGlzIGNhbGxlZC4gIFRoZSBpbm9kZSBtdXN0IGFscmVhZHkgYmUgbG9ja2VkCisgKiBhbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB0cmFuc2FjdGlvbi4KKyAqLworLypBUkdTVVNFRCovCit2b2lkCit4ZnNfdHJhbnNfaWhvbGQoCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19pbm9kZV90CSppcCkKK3sKKwlBU1NFUlQoaXAtPmlfdHJhbnNwID09IHRwKTsKKwlBU1NFUlQoaXAtPmlfaXRlbXAgIT0gTlVMTCk7CisJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2xvY2ssIE1SX1VQREFURSkpOworCisJaXAtPmlfaXRlbXAtPmlsaV9mbGFncyB8PSBYRlNfSUxJX0hPTEQ7Cit9CisKKy8qCisgKiBDYW5jZWwgdGhlIHByZXZpb3VzIGlub2RlIGhvbGQgcmVxdWVzdCBtYWRlIG9uIHRoaXMgaW5vZGUKKyAqIGZvciB0aGlzIHRyYW5zYWN0aW9uLgorICovCisvKkFSR1NVU0VEKi8KK3ZvaWQKK3hmc190cmFuc19paG9sZF9yZWxlYXNlKAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfaW5vZGVfdAkqaXApCit7CisJQVNTRVJUKGlwLT5pX3RyYW5zcCA9PSB0cCk7CisJQVNTRVJUKGlwLT5pX2l0ZW1wICE9IE5VTEwpOworCUFTU0VSVChpc21ybG9ja2VkKCZpcC0+aV9sb2NrLCBNUl9VUERBVEUpKTsKKwlBU1NFUlQoaXAtPmlfaXRlbXAtPmlsaV9mbGFncyAmIFhGU19JTElfSE9MRCk7CisKKwlpcC0+aV9pdGVtcC0+aWxpX2ZsYWdzICY9IH5YRlNfSUxJX0hPTEQ7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIG1hcmsgdGhlIGZpZWxkcyBpbmRpY2F0ZWQgaW4gZmllbGRtYXNrIGFzIG5lZWRpbmcKKyAqIHRvIGJlIGxvZ2dlZCB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQuICBUaGUgaW5vZGUgbXVzdAorICogYWxyZWFkeSBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHRyYW5zYWN0aW9uLgorICoKKyAqIFRoZSB2YWx1ZXMgZm9yIGZpZWxkbWFzayBhcmUgZGVmaW5lZCBpbiB4ZnNfaW5vZGVfaXRlbS5oLiAgV2UgYWx3YXlzCisgKiBsb2cgYWxsIG9mIHRoZSBjb3JlIGlub2RlIGlmIGFueSBvZiBpdCBoYXMgY2hhbmdlZCwgYW5kIHdlIGFsd2F5cyBsb2cKKyAqIGFsbCBvZiB0aGUgaW5saW5lIGRhdGEvZXh0ZW50cy9iLXRyZWUgcm9vdCBpZiBhbnkgb2YgdGhlbSBoYXMgY2hhbmdlZC4KKyAqLwordm9pZAoreGZzX3RyYW5zX2xvZ19pbm9kZSgKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX2lub2RlX3QJKmlwLAorCXVpbnQJCWZsYWdzKQoreworCXhmc19sb2dfaXRlbV9kZXNjX3QJKmxpZHA7CisKKwlBU1NFUlQoaXAtPmlfdHJhbnNwID09IHRwKTsKKwlBU1NFUlQoaXAtPmlfaXRlbXAgIT0gTlVMTCk7CisJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2xvY2ssIE1SX1VQREFURSkpOworCisJbGlkcCA9IHhmc190cmFuc19maW5kX2l0ZW0odHAsICh4ZnNfbG9nX2l0ZW1fdCopKGlwLT5pX2l0ZW1wKSk7CisJQVNTRVJUKGxpZHAgIT0gTlVMTCk7CisKKwl0cC0+dF9mbGFncyB8PSBYRlNfVFJBTlNfRElSVFk7CisJbGlkcC0+bGlkX2ZsYWdzIHw9IFhGU19MSURfRElSVFk7CisKKwkvKgorCSAqIEFsd2F5cyBPUiBpbiB0aGUgYml0cyBmcm9tIHRoZSBpbGlfbGFzdF9maWVsZHMgZmllbGQuCisJICogVGhpcyBpcyB0byBjb29yZGluYXRlIHdpdGggdGhlIHhmc19pZmx1c2goKSBhbmQgeGZzX2lmbHVzaF9kb25lKCkKKwkgKiByb3V0aW5lcyBpbiB0aGUgZXZlbnR1YWwgY2xlYXJpbmcgb2YgdGhlIGlsZl9maWVsZHMgYml0cy4KKwkgKiBTZWUgdGhlIGJpZyBjb21tZW50IGluIHhmc19pZmx1c2goKSBmb3IgYW4gZXhwbGFuYXRpb24gb2YKKwkgKiB0aGlzIGNvb3JpbmF0aW9uIG1lY2hhbmlzbS4KKwkgKi8KKwlmbGFncyB8PSBpcC0+aV9pdGVtcC0+aWxpX2xhc3RfZmllbGRzOworCWlwLT5pX2l0ZW1wLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgfD0gZmxhZ3M7Cit9CisKKyNpZmRlZiBYRlNfVFJBTlNfREVCVUcKKy8qCisgKiBLZWVwIHRyYWNrIG9mIHRoZSBzdGF0ZSBvZiB0aGUgaW5vZGUgYnRyZWUgcm9vdCB0byBtYWtlIHN1cmUgd2UKKyAqIGxvZyBpdCBwcm9wZXJseS4KKyAqLworU1RBVElDIHZvaWQKK3hmc190cmFuc19pbm9kZV9icm9vdF9kZWJ1ZygKKwl4ZnNfaW5vZGVfdAkqaXApCit7CisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcDsKKworCUFTU0VSVChpcC0+aV9pdGVtcCAhPSBOVUxMKTsKKwlpaXAgPSBpcC0+aV9pdGVtcDsKKwlpZiAoaWlwLT5pbGlfcm9vdF9zaXplICE9IDApIHsKKwkJQVNTRVJUKGlpcC0+aWxpX29yaWdfcm9vdCAhPSBOVUxMKTsKKwkJa21lbV9mcmVlKGlpcC0+aWxpX29yaWdfcm9vdCwgaWlwLT5pbGlfcm9vdF9zaXplKTsKKwkJaWlwLT5pbGlfcm9vdF9zaXplID0gMDsKKwkJaWlwLT5pbGlfb3JpZ19yb290ID0gTlVMTDsKKwl9CisJaWYgKGlwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0JUUkVFKSB7CisJCUFTU0VSVCgoaXAtPmlfZGYuaWZfYnJvb3QgIT0gTlVMTCkgJiYKKwkJICAgICAgIChpcC0+aV9kZi5pZl9icm9vdF9ieXRlcyA+IDApKTsKKwkJaWlwLT5pbGlfcm9vdF9zaXplID0gaXAtPmlfZGYuaWZfYnJvb3RfYnl0ZXM7CisJCWlpcC0+aWxpX29yaWdfcm9vdCA9CisJCQkoY2hhciopa21lbV9hbGxvYyhpaXAtPmlsaV9yb290X3NpemUsIEtNX1NMRUVQKTsKKwkJbWVtY3B5KGlpcC0+aWxpX29yaWdfcm9vdCwgKGNoYXIqKShpcC0+aV9kZi5pZl9icm9vdCksCisJCSAgICAgIGlpcC0+aWxpX3Jvb3Rfc2l6ZSk7CisJfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfdHJhbnNfaXRlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOGE3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX3RyYW5zX2l0ZW0uYwpAQCAtMCwwICsxLDU1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKworU1RBVElDIGludAl4ZnNfdHJhbnNfdW5sb2NrX2NodW5rKHhmc19sb2dfaXRlbV9jaHVua190ICosCisJCQkJCWludCwgaW50LCB4ZnNfbHNuX3QpOworCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gYWRkIHRoZSBnaXZlbiBsb2cgaXRlbSB0byB0aGUgdHJhbnNhY3Rpb24ncworICogbGlzdCBvZiBsb2cgaXRlbXMuICBJdCBtdXN0IGZpbmQgYSBmcmVlIGxvZyBpdGVtIGRlc2NyaXB0b3IKKyAqIG9yIGFsbG9jYXRlIGEgbmV3IG9uZSBhbmQgYWRkIHRoZSBpdGVtIHRvIHRoYXQgZGVzY3JpcHRvci4KKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBpdGVtIGRlc2NyaXB0b3IgdXNlZCB0byBwb2ludAorICogdG8gdGhlIG5ldyBpdGVtLiAgVGhlIGxvZyBpdGVtIHdpbGwgbm93IHBvaW50IHRvIGl0cyBuZXcgZGVzY3JpcHRvcgorICogd2l0aCBpdHMgbGlfZGVzYyBmaWVsZC4KKyAqLworeGZzX2xvZ19pdGVtX2Rlc2NfdCAqCit4ZnNfdHJhbnNfYWRkX2l0ZW0oeGZzX3RyYW5zX3QgKnRwLCB4ZnNfbG9nX2l0ZW1fdCAqbGlwKQoreworCXhmc19sb2dfaXRlbV9kZXNjX3QJKmxpZHA7CisJeGZzX2xvZ19pdGVtX2NodW5rX3QJKmxpY3A7CisJaW50CQkJaT0wOworCisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgbm8gZnJlZSBkZXNjcmlwdG9ycywgYWxsb2NhdGUgYSBuZXcgY2h1bmsKKwkgKiBvZiB0aGVtIGFuZCBwdXQgaXQgYXQgdGhlIGZyb250IG9mIHRoZSBjaHVuayBsaXN0LgorCSAqLworCWlmICh0cC0+dF9pdGVtc19mcmVlID09IDApIHsKKwkJbGljcCA9ICh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCopCisJCSAgICAgICBrbWVtX2FsbG9jKHNpemVvZih4ZnNfbG9nX2l0ZW1fY2h1bmtfdCksIEtNX1NMRUVQKTsKKwkJQVNTRVJUKGxpY3AgIT0gTlVMTCk7CisJCS8qCisJCSAqIEluaXRpYWxpemUgdGhlIGNodW5rLCBhbmQgdGhlbgorCQkgKiBjbGFpbSB0aGUgZmlyc3Qgc2xvdCBpbiB0aGUgbmV3bHkgYWxsb2NhdGVkIGNodW5rLgorCQkgKi8KKwkJWEZTX0xJQ19JTklUKGxpY3ApOworCQlYRlNfTElDX0NMQUlNKGxpY3AsIDApOworCQlsaWNwLT5saWNfdW51c2VkID0gMTsKKwkJWEZTX0xJQ19JTklUX1NMT1QobGljcCwgMCk7CisJCWxpZHAgPSBYRlNfTElDX1NMT1QobGljcCwgMCk7CisKKwkJLyoKKwkJICogTGluayBpbiB0aGUgbmV3IGNodW5rIGFuZCB1cGRhdGUgdGhlIGZyZWUgY291bnQuCisJCSAqLworCQlsaWNwLT5saWNfbmV4dCA9IHRwLT50X2l0ZW1zLmxpY19uZXh0OworCQl0cC0+dF9pdGVtcy5saWNfbmV4dCA9IGxpY3A7CisJCXRwLT50X2l0ZW1zX2ZyZWUgPSBYRlNfTElDX05VTV9TTE9UUyAtIDE7CisKKwkJLyoKKwkJICogSW5pdGlhbGl6ZSB0aGUgZGVzY3JpcHRvciBhbmQgdGhlIGdlbmVyaWMgcG9ydGlvbgorCQkgKiBvZiB0aGUgbG9nIGl0ZW0uCisJCSAqCisJCSAqIFBvaW50IHRoZSBuZXcgc2xvdCBhdCB0aGlzIGl0ZW0gYW5kIHJldHVybiBpdC4KKwkJICogQWxzbyBwb2ludCB0aGUgbG9nIGl0ZW0gYXQgaXRzIGN1cnJlbnRseSBhY3RpdmUKKwkJICogZGVzY3JpcHRvciBhbmQgc2V0IHRoZSBpdGVtJ3MgbW91bnQgcG9pbnRlci4KKwkJICovCisJCWxpZHAtPmxpZF9pdGVtID0gbGlwOworCQlsaWRwLT5saWRfZmxhZ3MgPSAwOworCQlsaWRwLT5saWRfc2l6ZSA9IDA7CisJCWxpcC0+bGlfZGVzYyA9IGxpZHA7CisJCWxpcC0+bGlfbW91bnRwID0gdHAtPnRfbW91bnRwOworCQlyZXR1cm4gKGxpZHApOworCX0KKworCS8qCisJICogRmluZCB0aGUgZnJlZSBkZXNjcmlwdG9yLiBJdCBpcyBzb21ld2hlcmUgaW4gdGhlIGNodW5rbGlzdAorCSAqIG9mIGRlc2NyaXB0b3JzLgorCSAqLworCWxpY3AgPSAmdHAtPnRfaXRlbXM7CisJd2hpbGUgKGxpY3AgIT0gTlVMTCkgeworCQlpZiAoWEZTX0xJQ19WQUNBTkNZKGxpY3ApKSB7CisJCQlpZiAobGljcC0+bGljX3VudXNlZCA8PSBYRlNfTElDX01BWF9TTE9UKSB7CisJCQkJaSA9IGxpY3AtPmxpY191bnVzZWQ7CisJCQkJQVNTRVJUKFhGU19MSUNfSVNGUkVFKGxpY3AsIGkpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPD0gWEZTX0xJQ19NQVhfU0xPVDsgaSsrKSB7CisJCQkJaWYgKFhGU19MSUNfSVNGUkVFKGxpY3AsIGkpKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCUFTU0VSVChpIDw9IFhGU19MSUNfTUFYX1NMT1QpOworCQkJYnJlYWs7CisJCX0KKwkJbGljcCA9IGxpY3AtPmxpY19uZXh0OworCX0KKwlBU1NFUlQobGljcCAhPSBOVUxMKTsKKwkvKgorCSAqIElmIHdlIGZpbmQgYSBmcmVlIGRlc2NyaXB0b3IsIGNsYWltIGl0LAorCSAqIGluaXRpYWxpemUgaXQsIGFuZCByZXR1cm4gaXQuCisJICovCisJWEZTX0xJQ19DTEFJTShsaWNwLCBpKTsKKwlpZiAobGljcC0+bGljX3VudXNlZCA8PSBpKSB7CisJCWxpY3AtPmxpY191bnVzZWQgPSBpICsgMTsKKwkJWEZTX0xJQ19JTklUX1NMT1QobGljcCwgaSk7CisJfQorCWxpZHAgPSBYRlNfTElDX1NMT1QobGljcCwgaSk7CisJdHAtPnRfaXRlbXNfZnJlZS0tOworCWxpZHAtPmxpZF9pdGVtID0gbGlwOworCWxpZHAtPmxpZF9mbGFncyA9IDA7CisJbGlkcC0+bGlkX3NpemUgPSAwOworCWxpcC0+bGlfZGVzYyA9IGxpZHA7CisJbGlwLT5saV9tb3VudHAgPSB0cC0+dF9tb3VudHA7CisJcmV0dXJuIChsaWRwKTsKK30KKworLyoKKyAqIEZyZWUgdGhlIGdpdmVuIGRlc2NyaXB0b3IuCisgKgorICogVGhpcyByZXF1aXJlcyBzZXR0aW5nIHRoZSBiaXQgaW4gdGhlIGNodW5rJ3MgZnJlZSBtYXNrIGNvcnJlc3BvbmRpbmcKKyAqIHRvIHRoZSBnaXZlbiBzbG90LgorICovCit2b2lkCit4ZnNfdHJhbnNfZnJlZV9pdGVtKHhmc190cmFuc190CSp0cCwgeGZzX2xvZ19pdGVtX2Rlc2NfdCAqbGlkcCkKK3sKKwl1aW50CQkJc2xvdDsKKwl4ZnNfbG9nX2l0ZW1fY2h1bmtfdAkqbGljcDsKKwl4ZnNfbG9nX2l0ZW1fY2h1bmtfdAkqKmxpY3BwOworCisJc2xvdCA9IFhGU19MSUNfREVTQ19UT19TTE9UKGxpZHApOworCWxpY3AgPSBYRlNfTElDX0RFU0NfVE9fQ0hVTksobGlkcCk7CisJWEZTX0xJQ19SRUxTRShsaWNwLCBzbG90KTsKKwlsaWRwLT5saWRfaXRlbS0+bGlfZGVzYyA9IE5VTEw7CisJdHAtPnRfaXRlbXNfZnJlZSsrOworCisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgbm8gbW9yZSB1c2VkIGl0ZW1zIGluIHRoZSBjaHVuayBhbmQgdGhpcyBpcyBub3QKKwkgKiB0aGUgY2h1bmsgZW1iZWRkZWQgaW4gdGhlIHRyYW5zYWN0aW9uIHN0cnVjdHVyZSwgdGhlbiBmcmVlCisJICogdGhlIGNodW5rLiBGaXJzdCBwdWxsIGl0IGZyb20gdGhlIGNodW5rIGxpc3QgYW5kIHRoZW4KKwkgKiBmcmVlIGl0IGJhY2sgdG8gdGhlIGhlYXAuICBXZSBkaWRuJ3QgYm90aGVyIHdpdGggYSBkb3VibHkKKwkgKiBsaW5rZWQgbGlzdCBoZXJlIGJlY2F1c2UgdGhlIGxpc3RzIHNob3VsZCBiZSB2ZXJ5IHNob3J0CisJICogYW5kIHRoaXMgaXMgbm90IGEgcGVyZm9ybWFuY2UgcGF0aC4gIEl0J3MgYmV0dGVyIHRvIHNhdmUKKwkgKiB0aGUgbWVtb3J5IG9mIHRoZSBleHRyYSBwb2ludGVyLgorCSAqCisJICogQWxzbyBkZWNyZW1lbnQgdGhlIHRyYW5zYWN0aW9uIHN0cnVjdHVyZSdzIGNvdW50IG9mIGZyZWUgaXRlbXMKKwkgKiBieSB0aGUgbnVtYmVyIGluIGEgY2h1bmsgc2luY2Ugd2UgYXJlIGZyZWVpbmcgYW4gZW1wdHkgY2h1bmsuCisJICovCisJaWYgKFhGU19MSUNfQVJFX0FMTF9GUkVFKGxpY3ApICYmIChsaWNwICE9ICYodHAtPnRfaXRlbXMpKSkgeworCQlsaWNwcCA9ICYodHAtPnRfaXRlbXMubGljX25leHQpOworCQl3aGlsZSAoKmxpY3BwICE9IGxpY3ApIHsKKwkJCUFTU0VSVCgqbGljcHAgIT0gTlVMTCk7CisJCQlsaWNwcCA9ICYoKCpsaWNwcCktPmxpY19uZXh0KTsKKwkJfQorCQkqbGljcHAgPSBsaWNwLT5saWNfbmV4dDsKKwkJa21lbV9mcmVlKGxpY3AsIHNpemVvZih4ZnNfbG9nX2l0ZW1fY2h1bmtfdCkpOworCQl0cC0+dF9pdGVtc19mcmVlIC09IFhGU19MSUNfTlVNX1NMT1RTOworCX0KK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIGZpbmQgdGhlIGRlc2NyaXB0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KKyAqIGxvZyBpdGVtLiAgSXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGRlc2NyaXB0b3IuCisgKiBUaGUgbG9nIGl0ZW0gTVVTVCBoYXZlIGEgY29ycmVzcG9uZGluZyBkZXNjcmlwdG9yIGluIHRoZSBnaXZlbgorICogdHJhbnNhY3Rpb24uICBUaGlzIHJvdXRpbmUgZG9lcyBub3QgcmV0dXJuIE5VTEwsIGl0IHBhbmljcy4KKyAqCisgKiBUaGUgZGVzY3JpcHRvciBwb2ludGVyIGlzIGtlcHQgaW4gdGhlIGxvZyBpdGVtJ3MgbGlfZGVzYyBmaWVsZC4KKyAqIEp1c3QgcmV0dXJuIGl0LgorICovCisvKkFSR1NVU0VEKi8KK3hmc19sb2dfaXRlbV9kZXNjX3QgKgoreGZzX3RyYW5zX2ZpbmRfaXRlbSh4ZnNfdHJhbnNfdAkqdHAsIHhmc19sb2dfaXRlbV90ICpsaXApCit7CisJQVNTRVJUKGxpcC0+bGlfZGVzYyAhPSBOVUxMKTsKKworCXJldHVybiAobGlwLT5saV9kZXNjKTsKK30KKworCisvKgorICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgZGVzY3JpcHRvciBpbiB0aGUgY2h1bmsgbGlzdC4KKyAqIFRoaXMgZG9lcyBub3QgcmV0dXJuIE5VTEwgaWYgdGhlcmUgYXJlIG5vbmUsIGl0IHBhbmljcy4KKyAqCisgKiBUaGUgZmlyc3QgZGVzY3JpcHRvciBtdXN0IGJlIGluIGVpdGhlciB0aGUgZmlyc3Qgb3Igc2Vjb25kIGNodW5rLgorICogVGhpcyBpcyBiZWNhdXNlIHRoZSBvbmx5IGNodW5rIGFsbG93ZWQgdG8gYmUgZW1wdHkgaXMgdGhlIGZpcnN0LgorICogQWxsIG90aGVycyBhcmUgZnJlZWQgd2hlbiB0aGV5IGJlY29tZSBlbXB0eS4KKyAqCisgKiBBdCBzb21lIHBvaW50IHRoaXMgYW5kIHhmc190cmFuc19uZXh0X2l0ZW0oKSBzaG91bGQgYmUgb3B0aW1pemVkCisgKiB0byBxdWlja2x5IGxvb2sgYXQgdGhlIG1hc2sgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRvCisgKiBsb29rIGF0LgorICovCit4ZnNfbG9nX2l0ZW1fZGVzY190ICoKK3hmc190cmFuc19maXJzdF9pdGVtKHhmc190cmFuc190ICp0cCkKK3sKKwl4ZnNfbG9nX2l0ZW1fY2h1bmtfdAkqbGljcDsKKwlpbnQJCQlpOworCisJbGljcCA9ICZ0cC0+dF9pdGVtczsKKwkvKgorCSAqIElmIGl0J3Mgbm90IGluIHRoZSBmaXJzdCBjaHVuaywgc2tpcCB0byB0aGUgc2Vjb25kLgorCSAqLworCWlmIChYRlNfTElDX0FSRV9BTExfRlJFRShsaWNwKSkgeworCQlsaWNwID0gbGljcC0+bGljX25leHQ7CisJfQorCisJLyoKKwkgKiBSZXR1cm4gdGhlIGZpcnN0IG5vbi1mcmVlIGRlc2NyaXB0b3IgaW4gdGhlIGNodW5rLgorCSAqLworCUFTU0VSVCghWEZTX0xJQ19BUkVfQUxMX0ZSRUUobGljcCkpOworCWZvciAoaSA9IDA7IGkgPCBsaWNwLT5saWNfdW51c2VkOyBpKyspIHsKKwkJaWYgKFhGU19MSUNfSVNGUkVFKGxpY3AsIGkpKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJldHVybiAoWEZTX0xJQ19TTE9UKGxpY3AsIGkpKTsKKwl9CisJY21uX2VycihDRV9XQVJOLCAieGZzX3RyYW5zX2ZpcnN0X2l0ZW0oKSAtLSBubyBmaXJzdCBpdGVtIik7CisJcmV0dXJuKE5VTEwpOworfQorCisKKy8qCisgKiBHaXZlbiBhIGRlc2NyaXB0b3IsIHJldHVybiB0aGUgbmV4dCBkZXNjcmlwdG9yIGluIHRoZSBjaHVuayBsaXN0LgorICogVGhpcyByZXR1cm5zIE5VTEwgaWYgdGhlcmUgYXJlIG5vIG1vcmUgdXNlZCBkZXNjcmlwdG9ycyBpbiB0aGUgbGlzdC4KKyAqCisgKiBXZSBkbyB0aGlzIGJ5IGZpcnN0IGxvY2F0aW5nIHRoZSBjaHVuayBpbiB3aGljaCB0aGUgZGVzY3JpcHRvciByZXNpZGVzLAorICogYW5kIHRoZW4gc2Nhbm5pbmcgZm9yd2FyZCBpbiB0aGUgY2h1bmsgYW5kIHRoZSBsaXN0IGZvciB0aGUgbmV4dAorICogdXNlZCBkZXNjcmlwdG9yLgorICovCisvKkFSR1NVU0VEKi8KK3hmc19sb2dfaXRlbV9kZXNjX3QgKgoreGZzX3RyYW5zX25leHRfaXRlbSh4ZnNfdHJhbnNfdCAqdHAsIHhmc19sb2dfaXRlbV9kZXNjX3QgKmxpZHApCit7CisJeGZzX2xvZ19pdGVtX2NodW5rX3QJKmxpY3A7CisJaW50CQkJaTsKKworCWxpY3AgPSBYRlNfTElDX0RFU0NfVE9fQ0hVTksobGlkcCk7CisKKwkvKgorCSAqIEZpcnN0IHNlYXJjaCB0aGUgcmVzdCBvZiB0aGUgY2h1bmsuIFRoZSBmb3IgbG9vcCBrZWVwcyB1cworCSAqIGZyb20gcmVmZXJlbmNpbmcgdGhpbmdzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBjaHVuay4KKwkgKi8KKwlmb3IgKGkgPSAoaW50KVhGU19MSUNfREVTQ19UT19TTE9UKGxpZHApICsgMTsgaSA8IGxpY3AtPmxpY191bnVzZWQ7IGkrKykgeworCQlpZiAoWEZTX0xJQ19JU0ZSRUUobGljcCwgaSkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmV0dXJuIChYRlNfTElDX1NMT1QobGljcCwgaSkpOworCX0KKworCS8qCisJICogTm93IHNlYXJjaCB0aGUgbmV4dCBjaHVuay4gIEl0IG11c3QgYmUgdGhlcmUsIGJlY2F1c2UgdGhlCisJICogbmV4dCBjaHVuayB3b3VsZCBoYXZlIGJlZW4gZnJlZWQgaWYgaXQgd2VyZSBlbXB0eS4KKwkgKiBJZiB0aGVyZSBpcyBubyBuZXh0IGNodW5rLCByZXR1cm4gTlVMTC4KKwkgKi8KKwlpZiAobGljcC0+bGljX25leHQgPT0gTlVMTCkgeworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCWxpY3AgPSBsaWNwLT5saWNfbmV4dDsKKwlBU1NFUlQoIVhGU19MSUNfQVJFX0FMTF9GUkVFKGxpY3ApKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGljcC0+bGljX3VudXNlZDsgaSsrKSB7CisJCWlmIChYRlNfTElDX0lTRlJFRShsaWNwLCBpKSkgeworCQkJY29udGludWU7CisJCX0KKworCQlyZXR1cm4gKFhGU19MSUNfU0xPVChsaWNwLCBpKSk7CisJfQorCUFTU0VSVCgwKTsKKwkvKiBOT1RSRUFDSEVEICovCisJcmV0dXJuIE5VTEw7IC8qIGtlZXAgZ2NjIHF1aXRlICovCit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byB1bmxvY2sgYWxsIG9mIHRoZSBpdGVtcyBvZiBhIHRyYW5zYWN0aW9uIGFuZCB0byBmcmVlCisgKiBhbGwgdGhlIGRlc2NyaXB0b3JzIG9mIHRoYXQgdHJhbnNhY3Rpb24uCisgKgorICogSXQgd2Fsa3MgdGhlIGxpc3Qgb2YgZGVzY3JpcHRvcnMgYW5kIHVubG9ja3MgZWFjaCBpdGVtLiAgSXQgZnJlZXMKKyAqIGVhY2ggY2h1bmsgZXhjZXB0IHRoYXQgZW1iZWRkZWQgaW4gdGhlIHRyYW5zYWN0aW9uIGFzIGl0IGdvZXMgYWxvbmcuCisgKi8KK3ZvaWQKK3hmc190cmFuc19mcmVlX2l0ZW1zKAorCXhmc190cmFuc190CSp0cCwKKwlpbnQJCWZsYWdzKQoreworCXhmc19sb2dfaXRlbV9jaHVua190CSpsaWNwOworCXhmc19sb2dfaXRlbV9jaHVua190CSpuZXh0X2xpY3A7CisJaW50CQkJYWJvcnQ7CisKKwlhYm9ydCA9IGZsYWdzICYgWEZTX1RSQU5TX0FCT1JUOworCWxpY3AgPSAmdHAtPnRfaXRlbXM7CisJLyoKKwkgKiBTcGVjaWFsIGNhc2UgdGhlIGVtYmVkZGVkIGNodW5rIHNvIHdlIGRvbid0IGZyZWUgaXQgYmVsb3cuCisJICovCisJaWYgKCFYRlNfTElDX0FSRV9BTExfRlJFRShsaWNwKSkgeworCQkodm9pZCkgeGZzX3RyYW5zX3VubG9ja19jaHVuayhsaWNwLCAxLCBhYm9ydCwgTlVMTENPTU1JVExTTik7CisJCVhGU19MSUNfQUxMX0ZSRUUobGljcCk7CisJCWxpY3AtPmxpY191bnVzZWQgPSAwOworCX0KKwlsaWNwID0gbGljcC0+bGljX25leHQ7CisKKwkvKgorCSAqIFVubG9jayBlYWNoIGl0ZW0gaW4gZWFjaCBjaHVuayBhbmQgZnJlZSB0aGUgY2h1bmtzLgorCSAqLworCXdoaWxlIChsaWNwICE9IE5VTEwpIHsKKwkJQVNTRVJUKCFYRlNfTElDX0FSRV9BTExfRlJFRShsaWNwKSk7CisJCSh2b2lkKSB4ZnNfdHJhbnNfdW5sb2NrX2NodW5rKGxpY3AsIDEsIGFib3J0LCBOVUxMQ09NTUlUTFNOKTsKKwkJbmV4dF9saWNwID0gbGljcC0+bGljX25leHQ7CisJCWttZW1fZnJlZShsaWNwLCBzaXplb2YoeGZzX2xvZ19pdGVtX2NodW5rX3QpKTsKKwkJbGljcCA9IG5leHRfbGljcDsKKwl9CisKKwkvKgorCSAqIFJlc2V0IHRoZSB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUncyBmcmVlIGl0ZW0gY291bnQuCisJICovCisJdHAtPnRfaXRlbXNfZnJlZSA9IFhGU19MSUNfTlVNX1NMT1RTOworCXRwLT50X2l0ZW1zLmxpY19uZXh0ID0gTlVMTDsKK30KKworCisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byB1bmxvY2sgdGhlIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBhIHRyYW5zYWN0aW9uLgorICogSXRlbXMgd2hpY2ggd2VyZSBub3QgbG9nZ2VkIHNob3VsZCBiZSBmcmVlZC4KKyAqIFRob3NlIHdoaWNoIHdlcmUgbG9nZ2VkIG11c3Qgc3RpbGwgYmUgdHJhY2tlZCBzbyB0aGV5IGNhbiBiZSB1bnBpbm5lZAorICogd2hlbiB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cy4KKyAqLwordm9pZAoreGZzX3RyYW5zX3VubG9ja19pdGVtcyh4ZnNfdHJhbnNfdCAqdHAsIHhmc19sc25fdCBjb21taXRfbHNuKQoreworCXhmc19sb2dfaXRlbV9jaHVua190CSpsaWNwOworCXhmc19sb2dfaXRlbV9jaHVua190CSpuZXh0X2xpY3A7CisJeGZzX2xvZ19pdGVtX2NodW5rX3QJKipsaWNwcDsKKwlpbnQJCQlmcmVlZDsKKworCWZyZWVkID0gMDsKKwlsaWNwID0gJnRwLT50X2l0ZW1zOworCisJLyoKKwkgKiBTcGVjaWFsIGNhc2UgdGhlIGVtYmVkZGVkIGNodW5rIHNvIHdlIGRvbid0IGZyZWUuCisJICovCisJaWYgKCFYRlNfTElDX0FSRV9BTExfRlJFRShsaWNwKSkgeworCQlmcmVlZCA9IHhmc190cmFuc191bmxvY2tfY2h1bmsobGljcCwgMCwgMCwgY29tbWl0X2xzbik7CisJfQorCWxpY3BwID0gJih0cC0+dF9pdGVtcy5saWNfbmV4dCk7CisJbGljcCA9IGxpY3AtPmxpY19uZXh0OworCisJLyoKKwkgKiBVbmxvY2sgZWFjaCBpdGVtIGluIGVhY2ggY2h1bmssIGZyZWUgbm9uLWRpcnR5IGRlc2NyaXB0b3JzLAorCSAqIGFuZCBmcmVlIGVtcHR5IGNodW5rcy4KKwkgKi8KKwl3aGlsZSAobGljcCAhPSBOVUxMKSB7CisJCUFTU0VSVCghWEZTX0xJQ19BUkVfQUxMX0ZSRUUobGljcCkpOworCQlmcmVlZCArPSB4ZnNfdHJhbnNfdW5sb2NrX2NodW5rKGxpY3AsIDAsIDAsIGNvbW1pdF9sc24pOworCQluZXh0X2xpY3AgPSBsaWNwLT5saWNfbmV4dDsKKwkJaWYgKFhGU19MSUNfQVJFX0FMTF9GUkVFKGxpY3ApKSB7CisJCQkqbGljcHAgPSBuZXh0X2xpY3A7CisJCQlrbWVtX2ZyZWUobGljcCwgc2l6ZW9mKHhmc19sb2dfaXRlbV9jaHVua190KSk7CisJCQlmcmVlZCAtPSBYRlNfTElDX05VTV9TTE9UUzsKKwkJfSBlbHNlIHsKKwkJCWxpY3BwID0gJihsaWNwLT5saWNfbmV4dCk7CisJCX0KKwkJQVNTRVJUKCpsaWNwcCA9PSBuZXh0X2xpY3ApOworCQlsaWNwID0gbmV4dF9saWNwOworCX0KKworCS8qCisJICogRml4IHRoZSBmcmVlIGRlc2NyaXB0b3IgY291bnQgaW4gdGhlIHRyYW5zYWN0aW9uLgorCSAqLworCXRwLT50X2l0ZW1zX2ZyZWUgKz0gZnJlZWQ7Cit9CisKKy8qCisgKiBVbmxvY2sgZWFjaCBpdGVtIHBvaW50ZWQgdG8gYnkgYSBkZXNjcmlwdG9yIGluIHRoZSBnaXZlbiBjaHVuay4KKyAqIFN0YW1wIHRoZSBjb21taXQgbHNuIGludG8gZWFjaCBpdGVtIGlmIG5lY2Vzc2FyeS4KKyAqIEZyZWUgZGVzY3JpcHRvcnMgcG9pbnRpbmcgdG8gaXRlbXMgd2hpY2ggYXJlIG5vdCBkaXJ0eSBpZiBmcmVlaW5nX2NodW5rCisgKiBpcyB6ZXJvLiBJZiBmcmVlaW5nX2NodW5rIGlzIG5vbi16ZXJvLCB0aGVuIHdlIG5lZWQgdG8gdW5sb2NrIGFsbAorICogaXRlbXMgaW4gdGhlIGNodW5rLgorICogCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycyBmcmVlZC4KKyAqLworU1RBVElDIGludAoreGZzX3RyYW5zX3VubG9ja19jaHVuaygKKwl4ZnNfbG9nX2l0ZW1fY2h1bmtfdAkqbGljcCwKKwlpbnQJCQlmcmVlaW5nX2NodW5rLAorCWludAkJCWFib3J0LAorCXhmc19sc25fdAkJY29tbWl0X2xzbikKK3sKKwl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOworCXhmc19sb2dfaXRlbV90CQkqbGlwOworCWludAkJCWk7CisJaW50CQkJZnJlZWQ7CisKKwlmcmVlZCA9IDA7CisJbGlkcCA9IGxpY3AtPmxpY19kZXNjczsKKwlmb3IgKGkgPSAwOyBpIDwgbGljcC0+bGljX3VudXNlZDsgaSsrLCBsaWRwKyspIHsKKwkJaWYgKFhGU19MSUNfSVNGUkVFKGxpY3AsIGkpKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlsaXAgPSBsaWRwLT5saWRfaXRlbTsKKwkJbGlwLT5saV9kZXNjID0gTlVMTDsKKworCQlpZiAoY29tbWl0X2xzbiAhPSBOVUxMQ09NTUlUTFNOKQorCQkJSU9QX0NPTU1JVFRJTkcobGlwLCBjb21taXRfbHNuKTsKKwkJaWYgKGFib3J0KQorCQkJbGlwLT5saV9mbGFncyB8PSBYRlNfTElfQUJPUlRFRDsKKwkJSU9QX1VOTE9DSyhsaXApOworCisJCS8qCisJCSAqIEZyZWUgdGhlIGRlc2NyaXB0b3IgaWYgdGhlIGl0ZW0gaXMgbm90IGRpcnR5CisJCSAqIHdpdGhpbiB0aGlzIHRyYW5zYWN0aW9uIGFuZCB0aGUgY2FsbGVyIGlzIG5vdAorCQkgKiBnb2luZyB0byBqdXN0IGZyZWUgdGhlIGVudGlyZSB0aGluZyByZWdhcmRsZXNzLgorCQkgKi8KKwkJaWYgKCEoZnJlZWluZ19jaHVuaykgJiYKKwkJICAgICghKGxpZHAtPmxpZF9mbGFncyAmIFhGU19MSURfRElSVFkpIHx8IGFib3J0KSkgeworCQkJWEZTX0xJQ19SRUxTRShsaWNwLCBpKTsKKwkJCWZyZWVkKys7CisJCX0KKwl9CisKKwlyZXR1cm4gKGZyZWVkKTsKK30KKworCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gYWRkIHRoZSBnaXZlbiBidXN5IGl0ZW0gdG8gdGhlIHRyYW5zYWN0aW9uJ3MKKyAqIGxpc3Qgb2YgYnVzeSBpdGVtcy4gIEl0IG11c3QgZmluZCBhIGZyZWUgYnVzeSBpdGVtIGRlc2NyaXB0b3IKKyAqIG9yIGFsbG9jYXRlIGEgbmV3IG9uZSBhbmQgYWRkIHRoZSBpdGVtIHRvIHRoYXQgZGVzY3JpcHRvci4KKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBidXN5IGRlc2NyaXB0b3IgdXNlZCB0byBwb2ludAorICogdG8gdGhlIG5ldyBidXN5IGVudHJ5LiAgVGhlIGxvZyBidXN5IGVudHJ5IHdpbGwgbm93IHBvaW50IHRvIGl0cyBuZXcKKyAqIGRlc2NyaXB0b3Igd2l0aCBpdHMgPz8/PyBmaWVsZC4KKyAqLworeGZzX2xvZ19idXN5X3Nsb3RfdCAqCit4ZnNfdHJhbnNfYWRkX2J1c3koeGZzX3RyYW5zX3QgKnRwLCB4ZnNfYWdudW1iZXJfdCBhZywgeGZzX2V4dGxlbl90IGlkeCkKK3sKKwl4ZnNfbG9nX2J1c3lfY2h1bmtfdAkqbGJjcDsKKwl4ZnNfbG9nX2J1c3lfc2xvdF90CSpsYnNwOworCWludAkJCWk9MDsKKworCS8qCisJICogSWYgdGhlcmUgYXJlIG5vIGZyZWUgZGVzY3JpcHRvcnMsIGFsbG9jYXRlIGEgbmV3IGNodW5rCisJICogb2YgdGhlbSBhbmQgcHV0IGl0IGF0IHRoZSBmcm9udCBvZiB0aGUgY2h1bmsgbGlzdC4KKwkgKi8KKwlpZiAodHAtPnRfYnVzeV9mcmVlID09IDApIHsKKwkJbGJjcCA9ICh4ZnNfbG9nX2J1c3lfY2h1bmtfdCopCisJCSAgICAgICBrbWVtX2FsbG9jKHNpemVvZih4ZnNfbG9nX2J1c3lfY2h1bmtfdCksIEtNX1NMRUVQKTsKKwkJQVNTRVJUKGxiY3AgIT0gTlVMTCk7CisJCS8qCisJCSAqIEluaXRpYWxpemUgdGhlIGNodW5rLCBhbmQgdGhlbgorCQkgKiBjbGFpbSB0aGUgZmlyc3Qgc2xvdCBpbiB0aGUgbmV3bHkgYWxsb2NhdGVkIGNodW5rLgorCQkgKi8KKwkJWEZTX0xCQ19JTklUKGxiY3ApOworCQlYRlNfTEJDX0NMQUlNKGxiY3AsIDApOworCQlsYmNwLT5sYmNfdW51c2VkID0gMTsKKwkJbGJzcCA9IFhGU19MQkNfU0xPVChsYmNwLCAwKTsKKworCQkvKgorCQkgKiBMaW5rIGluIHRoZSBuZXcgY2h1bmsgYW5kIHVwZGF0ZSB0aGUgZnJlZSBjb3VudC4KKwkJICovCisJCWxiY3AtPmxiY19uZXh0ID0gdHAtPnRfYnVzeS5sYmNfbmV4dDsKKwkJdHAtPnRfYnVzeS5sYmNfbmV4dCA9IGxiY3A7CisJCXRwLT50X2J1c3lfZnJlZSA9IFhGU19MSUNfTlVNX1NMT1RTIC0gMTsKKworCQkvKgorCQkgKiBJbml0aWFsaXplIHRoZSBkZXNjcmlwdG9yIGFuZCB0aGUgZ2VuZXJpYyBwb3J0aW9uCisJCSAqIG9mIHRoZSBsb2cgaXRlbS4KKwkJICoKKwkJICogUG9pbnQgdGhlIG5ldyBzbG90IGF0IHRoaXMgaXRlbSBhbmQgcmV0dXJuIGl0LgorCQkgKiBBbHNvIHBvaW50IHRoZSBsb2cgaXRlbSBhdCBpdHMgY3VycmVudGx5IGFjdGl2ZQorCQkgKiBkZXNjcmlwdG9yIGFuZCBzZXQgdGhlIGl0ZW0ncyBtb3VudCBwb2ludGVyLgorCQkgKi8KKwkJbGJzcC0+bGJjX2FnID0gYWc7CisJCWxic3AtPmxiY19pZHggPSBpZHg7CisJCXJldHVybiAobGJzcCk7CisJfQorCisJLyoKKwkgKiBGaW5kIHRoZSBmcmVlIGRlc2NyaXB0b3IuIEl0IGlzIHNvbWV3aGVyZSBpbiB0aGUgY2h1bmtsaXN0CisJICogb2YgZGVzY3JpcHRvcnMuCisJICovCisJbGJjcCA9ICZ0cC0+dF9idXN5OworCXdoaWxlIChsYmNwICE9IE5VTEwpIHsKKwkJaWYgKFhGU19MQkNfVkFDQU5DWShsYmNwKSkgeworCQkJaWYgKGxiY3AtPmxiY191bnVzZWQgPD0gWEZTX0xCQ19NQVhfU0xPVCkgeworCQkJCWkgPSBsYmNwLT5sYmNfdW51c2VkOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQkvKiBvdXQtb2Ytb3JkZXIgdmFjYW5jeSAqLworCQkJCXByaW50aygiT09PIHZhY2FuY3kgbGJjcCAweCVwXG4iLCBsYmNwKTsKKwkJCQlBU1NFUlQoMCk7CisJCQl9CisJCX0KKwkJbGJjcCA9IGxiY3AtPmxiY19uZXh0OworCX0KKwlBU1NFUlQobGJjcCAhPSBOVUxMKTsKKwkvKgorCSAqIElmIHdlIGZpbmQgYSBmcmVlIGRlc2NyaXB0b3IsIGNsYWltIGl0LAorCSAqIGluaXRpYWxpemUgaXQsIGFuZCByZXR1cm4gaXQuCisJICovCisJWEZTX0xCQ19DTEFJTShsYmNwLCBpKTsKKwlpZiAobGJjcC0+bGJjX3VudXNlZCA8PSBpKSB7CisJCWxiY3AtPmxiY191bnVzZWQgPSBpICsgMTsKKwl9CisJbGJzcCA9IFhGU19MQkNfU0xPVChsYmNwLCBpKTsKKwl0cC0+dF9idXN5X2ZyZWUtLTsKKwlsYnNwLT5sYmNfYWcgPSBhZzsKKwlsYnNwLT5sYmNfaWR4ID0gaWR4OworCXJldHVybiAobGJzcCk7Cit9CisKKworLyoKKyAqIHhmc190cmFuc19mcmVlX2J1c3kKKyAqIEZyZWUgYWxsIG9mIHRoZSBidXN5IGxpc3RzIGZyb20gYSB0cmFuc2FjdGlvbgorICovCit2b2lkCit4ZnNfdHJhbnNfZnJlZV9idXN5KHhmc190cmFuc190ICp0cCkKK3sKKwl4ZnNfbG9nX2J1c3lfY2h1bmtfdAkqbGJjcDsKKwl4ZnNfbG9nX2J1c3lfY2h1bmtfdAkqbGJjcTsKKworCWxiY3AgPSB0cC0+dF9idXN5LmxiY19uZXh0OworCXdoaWxlIChsYmNwICE9IE5VTEwpIHsKKwkJbGJjcSA9IGxiY3AtPmxiY19uZXh0OworCQlrbWVtX2ZyZWUobGJjcCwgc2l6ZW9mKHhmc19sb2dfYnVzeV9jaHVua190KSk7CisJCWxiY3AgPSBsYmNxOworCX0KKworCVhGU19MQkNfSU5JVCgmdHAtPnRfYnVzeSk7CisJdHAtPnRfYnVzeS5sYmNfdW51c2VkID0gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfcHJpdi5oIGIvZnMveGZzL3hmc190cmFuc19wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRkYWU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnNfcHJpdi5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19UUkFOU19QUklWX0hfXworI2RlZmluZQlfX1hGU19UUkFOU19QUklWX0hfXworCitzdHJ1Y3QgeGZzX2xvZ19pdGVtOworc3RydWN0IHhmc19sb2dfaXRlbV9kZXNjOworc3RydWN0IHhmc19tb3VudDsKK3N0cnVjdCB4ZnNfdHJhbnM7CisKKy8qCisgKiBGcm9tIHhmc190cmFuc19pdGVtLmMKKyAqLworc3RydWN0IHhmc19sb2dfaXRlbV9kZXNjCSp4ZnNfdHJhbnNfYWRkX2l0ZW0oc3RydWN0IHhmc190cmFucyAqLAorCQkJCQkgICAgc3RydWN0IHhmc19sb2dfaXRlbSAqKTsKK3ZvaWQJCQkJeGZzX3RyYW5zX2ZyZWVfaXRlbShzdHJ1Y3QgeGZzX3RyYW5zICosCisJCQkJCSAgICBzdHJ1Y3QgeGZzX2xvZ19pdGVtX2Rlc2MgKik7CitzdHJ1Y3QgeGZzX2xvZ19pdGVtX2Rlc2MJKnhmc190cmFuc19maW5kX2l0ZW0oc3RydWN0IHhmc190cmFucyAqLAorCQkJCQkgICAgIHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKik7CitzdHJ1Y3QgeGZzX2xvZ19pdGVtX2Rlc2MJKnhmc190cmFuc19maXJzdF9pdGVtKHN0cnVjdCB4ZnNfdHJhbnMgKik7CitzdHJ1Y3QgeGZzX2xvZ19pdGVtX2Rlc2MJKnhmc190cmFuc19uZXh0X2l0ZW0oc3RydWN0IHhmc190cmFucyAqLAorCQkJCQkgICAgIHN0cnVjdCB4ZnNfbG9nX2l0ZW1fZGVzYyAqKTsKK3ZvaWQJCQkJeGZzX3RyYW5zX2ZyZWVfaXRlbXMoc3RydWN0IHhmc190cmFucyAqLCBpbnQpOwordm9pZAkJCQl4ZnNfdHJhbnNfdW5sb2NrX2l0ZW1zKHN0cnVjdCB4ZnNfdHJhbnMgKiwKKwkJCQkJCQl4ZnNfbHNuX3QpOwordm9pZAkJCQl4ZnNfdHJhbnNfZnJlZV9idXN5KHhmc190cmFuc190ICp0cCk7Cit4ZnNfbG9nX2J1c3lfc2xvdF90CQkqeGZzX3RyYW5zX2FkZF9idXN5KHhmc190cmFuc190ICp0cCwKKwkJCQkJCSAgICB4ZnNfYWdudW1iZXJfdCBhZywKKwkJCQkJCSAgICB4ZnNfZXh0bGVuX3QgaWR4KTsKKworLyoKKyAqIEZyb20geGZzX3RyYW5zX2FpbC5jCisgKi8KK3ZvaWQJCQl4ZnNfdHJhbnNfdXBkYXRlX2FpbChzdHJ1Y3QgeGZzX21vdW50ICosCisJCQkJICAgICBzdHJ1Y3QgeGZzX2xvZ19pdGVtICosIHhmc19sc25fdCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcpOwordm9pZAkJCXhmc190cmFuc19kZWxldGVfYWlsKHN0cnVjdCB4ZnNfbW91bnQgKiwKKwkJCQkgICAgIHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKiwgdW5zaWduZWQgbG9uZyk7CitzdHJ1Y3QgeGZzX2xvZ19pdGVtCSp4ZnNfdHJhbnNfZmlyc3RfYWlsKHN0cnVjdCB4ZnNfbW91bnQgKiwgaW50ICopOworc3RydWN0IHhmc19sb2dfaXRlbQkqeGZzX3RyYW5zX25leHRfYWlsKHN0cnVjdCB4ZnNfbW91bnQgKiwKKwkJCQkgICAgIHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKiwgaW50ICosIGludCAqKTsKKworCisjZW5kaWYJLyogX19YRlNfVFJBTlNfUFJJVl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfc3BhY2UuaCBiL2ZzL3hmcy94ZnNfdHJhbnNfc3BhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTFkMTczCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc190cmFuc19zcGFjZS5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfVFJBTlNfU1BBQ0VfSF9fCisjZGVmaW5lIF9fWEZTX1RSQU5TX1NQQUNFX0hfXworCisvKgorICogQ29tcG9uZW50cyBvZiBzcGFjZSByZXNlcnZhdGlvbnMuCisgKi8KKyNkZWZpbmUgWEZTX01BWF9DT05USUdfRVhURU5UU19QRVJfQkxPQ0sobXApICAgIFwKKwkJKCgobXApLT5tX2FsbG9jX214clswXSkgLSAoKG1wKS0+bV9hbGxvY19tbnJbMF0pKQorI2RlZmluZQlYRlNfRVhURU5UQUREX1NQQUNFX1JFUyhtcCx3KQkoWEZTX0JNX01BWExFVkVMUyhtcCx3KSAtIDEpCisjZGVmaW5lIFhGU19ORVhURU5UQUREX1NQQUNFX1JFUyhtcCxiLHcpXAorCSgoKGIgKyBYRlNfTUFYX0NPTlRJR19FWFRFTlRTX1BFUl9CTE9DSyhtcCkgLSAxKSAvIFwKKwkgIFhGU19NQVhfQ09OVElHX0VYVEVOVFNfUEVSX0JMT0NLKG1wKSkgKiBcCisJICBYRlNfRVhURU5UQUREX1NQQUNFX1JFUyhtcCx3KSkKKyNkZWZpbmUJWEZTX0RBRU5URVJfMUIobXAsdykJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gKG1wKS0+bV9kaXJibGtmc2JzIDogMSkKKyNkZWZpbmUJWEZTX0RBRU5URVJfREJTKG1wLHcpCVwKKwkoWEZTX0RBX05PREVfTUFYREVQVEggKyBcCisJICgoWEZTX0RJUl9JU19WMihtcCkgJiYgKHcpID09IFhGU19EQVRBX0ZPUkspID8gMiA6IDApKQorI2RlZmluZQlYRlNfREFFTlRFUl9CTE9DS1MobXAsdykJXAorCShYRlNfREFFTlRFUl8xQihtcCx3KSAqIFhGU19EQUVOVEVSX0RCUyhtcCx3KSkKKyNkZWZpbmUJWEZTX0RBRU5URVJfQk1BUDFCKG1wLHcpCVwKKwlYRlNfTkVYVEVOVEFERF9TUEFDRV9SRVMobXAsIFhGU19EQUVOVEVSXzFCKG1wLCB3KSwgdykKKyNkZWZpbmUJWEZTX0RBRU5URVJfQk1BUFMobXAsdykJCVwKKwkoWEZTX0RBRU5URVJfREJTKG1wLHcpICogWEZTX0RBRU5URVJfQk1BUDFCKG1wLHcpKQorI2RlZmluZQlYRlNfREFFTlRFUl9TUEFDRV9SRVMobXAsdykJXAorCShYRlNfREFFTlRFUl9CTE9DS1MobXAsdykgKyBYRlNfREFFTlRFUl9CTUFQUyhtcCx3KSkKKyNkZWZpbmUJWEZTX0RBUkVNT1ZFX1NQQUNFX1JFUyhtcCx3KQlYRlNfREFFTlRFUl9CTUFQUyhtcCx3KQorI2RlZmluZQlYRlNfRElSRU5URVJfTUFYX1NQTElUKG1wLG5sKQlcCisJKCgobXApLT5tX3NiLnNiX2Jsb2Nrc2l6ZSA9PSA1MTIgJiYgXAorCSAgWEZTX0RJUl9JU19WMShtcCkgJiYgXAorCSAgKG5sKSA+PSBYRlNfRElSX0xFQUZfQ0FOX0RPVUJMRV9TUExJVF9MRU4pID8gMiA6IDEpCisjZGVmaW5lCVhGU19ESVJFTlRFUl9TUEFDRV9SRVMobXAsbmwpCVwKKwkoWEZTX0RBRU5URVJfU1BBQ0VfUkVTKG1wLCBYRlNfREFUQV9GT1JLKSAqIFwKKwkgWEZTX0RJUkVOVEVSX01BWF9TUExJVChtcCxubCkpCisjZGVmaW5lCVhGU19ESVJSRU1PVkVfU1BBQ0VfUkVTKG1wKQlcCisJWEZTX0RBUkVNT1ZFX1NQQUNFX1JFUyhtcCwgWEZTX0RBVEFfRk9SSykKKyNkZWZpbmUJWEZTX0lBTExPQ19TUEFDRV9SRVMobXApCVwKKwkoWEZTX0lBTExPQ19CTE9DS1MobXApICsgWEZTX0lOX01BWExFVkVMUyhtcCktMSkKKworLyoKKyAqIFNwYWNlIHJlc2VydmF0aW9uIHZhbHVlcyBmb3IgdmFyaW91cyB0cmFuc2FjdGlvbnMuCisgKi8KKyNkZWZpbmUJWEZTX0FEREFGT1JLX1NQQUNFX1JFUyhtcCkJXAorCSgobXApLT5tX2RpcmJsa2ZzYnMgKyBcCisJIChYRlNfRElSX0lTX1YxKG1wKSA/IDAgOiBYRlNfREFFTlRFUl9CTUFQMUIobXAsIFhGU19EQVRBX0ZPUkspKSkKKyNkZWZpbmUJWEZTX0FUVFJSTV9TUEFDRV9SRVMobXApCVwKKwlYRlNfREFSRU1PVkVfU1BBQ0VfUkVTKG1wLCBYRlNfQVRUUl9GT1JLKQorLyogVGhpcyBtYWNybyBpcyBub3QgdXNlZCAtIHNlZSBpbmxpbmUgY29kZSBpbiB4ZnNfYXR0cl9zZXQgKi8KKyNkZWZpbmUJWEZTX0FUVFJTRVRfU1BBQ0VfUkVTKG1wLCB2KQlcCisJKFhGU19EQUVOVEVSX1NQQUNFX1JFUyhtcCwgWEZTX0FUVFJfRk9SSykgKyBYRlNfQl9UT19GU0IobXAsIHYpKQorI2RlZmluZQlYRlNfQ1JFQVRFX1NQQUNFX1JFUyhtcCxubCkJXAorCShYRlNfSUFMTE9DX1NQQUNFX1JFUyhtcCkgKyBYRlNfRElSRU5URVJfU1BBQ0VfUkVTKG1wLG5sKSkKKyNkZWZpbmUJWEZTX0RJT1NUUkFUX1NQQUNFX1JFUyhtcCwgdikJXAorCShYRlNfRVhURU5UQUREX1NQQUNFX1JFUyhtcCwgWEZTX0RBVEFfRk9SSykgKyAodikpCisjZGVmaW5lCVhGU19HUk9XRlNfU1BBQ0VfUkVTKG1wKQlcCisJKDIgKiBYRlNfQUdfTUFYTEVWRUxTKG1wKSkKKyNkZWZpbmUJWEZTX0dST1dGU1JUX1NQQUNFX1JFUyhtcCxiKQlcCisJKChiKSArIFhGU19FWFRFTlRBRERfU1BBQ0VfUkVTKG1wLCBYRlNfREFUQV9GT1JLKSkKKyNkZWZpbmUJWEZTX0xJTktfU1BBQ0VfUkVTKG1wLG5sKQlcCisJWEZTX0RJUkVOVEVSX1NQQUNFX1JFUyhtcCxubCkKKyNkZWZpbmUJWEZTX01LRElSX1NQQUNFX1JFUyhtcCxubCkJXAorCShYRlNfSUFMTE9DX1NQQUNFX1JFUyhtcCkgKyBYRlNfRElSRU5URVJfU1BBQ0VfUkVTKG1wLG5sKSkKKyNkZWZpbmUJWEZTX1FNX0RRQUxMT0NfU1BBQ0VfUkVTKG1wKQlcCisJKFhGU19FWFRFTlRBRERfU1BBQ0VfUkVTKG1wLCBYRlNfREFUQV9GT1JLKSArIFwKKwkgWEZTX0RRVU9UX0NMVVNURVJfU0laRV9GU0IpCisjZGVmaW5lCVhGU19RTV9RSU5PQ1JFQVRFX1NQQUNFX1JFUyhtcCkJXAorCVhGU19JQUxMT0NfU1BBQ0VfUkVTKG1wKQorI2RlZmluZQlYRlNfUkVNT1ZFX1NQQUNFX1JFUyhtcCkJXAorCVhGU19ESVJSRU1PVkVfU1BBQ0VfUkVTKG1wKQorI2RlZmluZQlYRlNfUkVOQU1FX1NQQUNFX1JFUyhtcCxubCkJXAorCShYRlNfRElSUkVNT1ZFX1NQQUNFX1JFUyhtcCkgKyBYRlNfRElSRU5URVJfU1BBQ0VfUkVTKG1wLG5sKSkKKyNkZWZpbmUJWEZTX1NZTUxJTktfU1BBQ0VfUkVTKG1wLG5sLGIpCVwKKwkoWEZTX0lBTExPQ19TUEFDRV9SRVMobXApICsgWEZTX0RJUkVOVEVSX1NQQUNFX1JFUyhtcCxubCkgKyAoYikpCisKKyNlbmRpZgkvKiBfX1hGU19UUkFOU19TUEFDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHlwZXMuaCBiL2ZzL3hmcy94ZnNfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDYwOWQyCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc190eXBlcy5oCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19UWVBFU19IX18KKyNkZWZpbmUJX19YRlNfVFlQRVNfSF9fCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qCisgKiBQT1NJWCBFeHRlbnNpb25zCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJdWNoYXJfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCXVzaG9ydF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCXVpbnRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwkJdWxvbmdfdDsKKworLyoKKyAqIEFkZGl0aW9uYWwgdHlwZSBkZWNsYXJhdGlvbnMgZm9yIFhGUworICovCit0eXBlZGVmIHNpZ25lZCBjaGFyCQlfX2ludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJX191aW50OF90OwordHlwZWRlZiBzaWduZWQgc2hvcnQgaW50CV9faW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50CV9fdWludDE2X3Q7Cit0eXBlZGVmIHNpZ25lZCBpbnQJCV9faW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CQlfX3VpbnQzMl90OwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIGludAlfX2ludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQJX191aW50NjRfdDsKKwordHlwZWRlZiBlbnVtIHsgQl9GQUxTRSxCX1RSVUUgfQlib29sZWFuX3Q7Cit0eXBlZGVmIF9faW50NjRfdAkJcHJpZF90OwkJLyogcHJvamVjdCBJRCAqLwordHlwZWRlZiBfX3VpbnQzMl90CQlpbnN0X3Q7CQkvKiBhbiBpbnN0cnVjdGlvbiAqLworCit0eXBlZGVmIF9fczY0CQkJeGZzX29mZl90OwkvKiA8ZmlsZSBvZmZzZXQ+IHR5cGUgKi8KK3R5cGVkZWYgX191NjQJCQl4ZnNfaW5vX3Q7CS8qIDxpbm9kZT4gdHlwZSAqLwordHlwZWRlZiBfX3M2NAkJCXhmc19kYWRkcl90OwkvKiA8ZGlzayBhZGRyZXNzPiB0eXBlICovCit0eXBlZGVmIGNoYXIgKgkJCXhmc19jYWRkcl90OwkvKiA8Y29yZSBhZGRyZXNzPiB0eXBlICovCit0eXBlZGVmIF9fdTMyCQkJeGZzX2Rldl90OworCisvKiBfX3BzaW50X3QgaXMgdGhlIHNhbWUgc2l6ZSBhcyBhIHBvaW50ZXIgKi8KKyNpZiAoQklUU19QRVJfTE9ORyA9PSAzMikKK3R5cGVkZWYgX19pbnQzMl90IF9fcHNpbnRfdDsKK3R5cGVkZWYgX191aW50MzJfdCBfX3BzdW5zaWduZWRfdDsKKyNlbGlmIChCSVRTX1BFUl9MT05HID09IDY0KQordHlwZWRlZiBfX2ludDY0X3QgX19wc2ludF90OwordHlwZWRlZiBfX3VpbnQ2NF90IF9fcHN1bnNpZ25lZF90OworI2Vsc2UKKyNlcnJvciBCSVRTX1BFUl9MT05HIG11c3QgYmUgMzIgb3IgNjQKKyNlbmRpZgorCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCit0eXBlZGVmIF9fdWludDMyX3QJeGZzX2FnYmxvY2tfdDsJLyogYmxvY2tubyBpbiBhbGxvYy4gZ3JvdXAgKi8KK3R5cGVkZWYJX191aW50MzJfdAl4ZnNfZXh0bGVuX3Q7CS8qIGV4dGVudCBsZW5ndGggaW4gYmxvY2tzICovCit0eXBlZGVmCV9fdWludDMyX3QJeGZzX2FnbnVtYmVyX3Q7CS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCit0eXBlZGVmIF9faW50MzJfdAl4ZnNfZXh0bnVtX3Q7CS8qICMgb2YgZXh0ZW50cyBpbiBhIGZpbGUgKi8KK3R5cGVkZWYgX19pbnQxNl90CXhmc19hZXh0bnVtX3Q7CS8qICMgZXh0ZW50cyBpbiBhbiBhdHRyaWJ1dGUgZm9yayAqLwordHlwZWRlZglfX2ludDY0X3QJeGZzX2ZzaXplX3Q7CS8qIGJ5dGVzIGluIGEgZmlsZSAqLwordHlwZWRlZiBfX3VpbnQ2NF90CXhmc191ZnNpemVfdDsJLyogdW5zaWduZWQgYnl0ZXMgaW4gYSBmaWxlICovCisKK3R5cGVkZWYJX19pbnQzMl90CXhmc19zdW1pbmZvX3Q7CS8qIHR5cGUgb2YgYml0bWFwIHN1bW1hcnkgaW5mbyAqLwordHlwZWRlZglfX2ludDMyX3QJeGZzX3J0d29yZF90OwkvKiB3b3JkIHR5cGUgZm9yIGJpdG1hcCBtYW5pcHVsYXRpb25zICovCisKK3R5cGVkZWYJX19pbnQ2NF90CXhmc19sc25fdDsJLyogbG9nIHNlcXVlbmNlIG51bWJlciAqLwordHlwZWRlZglfX2ludDMyX3QJeGZzX3RpZF90OwkvKiB0cmFuc2FjdGlvbiBpZGVudGlmaWVyICovCisKK3R5cGVkZWYJX191aW50MzJfdAl4ZnNfZGFibGtfdDsJLyogZGlyL2F0dHIgYmxvY2sgbnVtYmVyIChpbiBmaWxlKSAqLwordHlwZWRlZglfX3VpbnQzMl90CXhmc19kYWhhc2hfdDsJLyogZGlyL2F0dHIgaGFzaCB2YWx1ZSAqLworCit0eXBlZGVmIF9fdWludDE2X3QJeGZzX3ByaWRfdDsJLyogcHJpZF90IHRydW5jYXRlZCB0byAxNmJpdHMgaW4gWEZTICovCisKKy8qCisgKiBUaGVzZSB0eXBlcyBhcmUgNjQgYml0cyBvbiBkaXNrIGJ1dCBhcmUgZWl0aGVyIDMyIG9yIDY0IGJpdHMgaW4gbWVtb3J5LgorICogRGlzayBiYXNlZCB0eXBlczoKKyAqLwordHlwZWRlZiBfX3VpbnQ2NF90CXhmc19kZnNibm9fdDsJLyogYmxvY2tubyBpbiBmaWxlc3lzdGVtIChhZ25vfGFnYm5vKSAqLwordHlwZWRlZiBfX3VpbnQ2NF90CXhmc19kcmZzYm5vX3Q7CS8qIGJsb2Nrbm8gaW4gZmlsZXN5c3RlbSAocmF3KSAqLwordHlwZWRlZglfX3VpbnQ2NF90CXhmc19kcnRibm9fdDsJLyogZXh0ZW50IChibG9jaykgaW4gcmVhbHRpbWUgYXJlYSAqLwordHlwZWRlZglfX3VpbnQ2NF90CXhmc19kZmlsb2ZmX3Q7CS8qIGJsb2NrIG51bWJlciBpbiBhIGZpbGUgKi8KK3R5cGVkZWYJX191aW50NjRfdAl4ZnNfZGZpbGJsa3NfdDsJLyogbnVtYmVyIG9mIGJsb2NrcyBpbiBhIGZpbGUgKi8KKworLyoKKyAqIE1lbW9yeSBiYXNlZCB0eXBlcyBhcmUgY29uZGl0aW9uYWwuCisgKi8KKyNpZiBYRlNfQklHX0JMS05PUwordHlwZWRlZglfX3VpbnQ2NF90CXhmc19mc2Jsb2NrX3Q7CS8qIGJsb2Nrbm8gaW4gZmlsZXN5c3RlbSAoYWdub3xhZ2JubykgKi8KK3R5cGVkZWYgX191aW50NjRfdAl4ZnNfcmZzYmxvY2tfdDsJLyogYmxvY2tubyBpbiBmaWxlc3lzdGVtIChyYXcpICovCit0eXBlZGVmIF9fdWludDY0X3QJeGZzX3J0YmxvY2tfdDsJLyogZXh0ZW50IChibG9jaykgaW4gcmVhbHRpbWUgYXJlYSAqLwordHlwZWRlZglfX2ludDY0X3QJeGZzX3NydGJsb2NrX3Q7CS8qIHNpZ25lZCB2ZXJzaW9uIG9mIHhmc19ydGJsb2NrX3QgKi8KKyNlbHNlCit0eXBlZGVmCV9fdWludDMyX3QJeGZzX2ZzYmxvY2tfdDsJLyogYmxvY2tubyBpbiBmaWxlc3lzdGVtIChhZ25vfGFnYm5vKSAqLwordHlwZWRlZiBfX3VpbnQzMl90CXhmc19yZnNibG9ja190OwkvKiBibG9ja25vIGluIGZpbGVzeXN0ZW0gKHJhdykgKi8KK3R5cGVkZWYgX191aW50MzJfdAl4ZnNfcnRibG9ja190OwkvKiBleHRlbnQgKGJsb2NrKSBpbiByZWFsdGltZSBhcmVhICovCit0eXBlZGVmCV9faW50MzJfdAl4ZnNfc3J0YmxvY2tfdDsJLyogc2lnbmVkIHZlcnNpb24gb2YgeGZzX3J0YmxvY2tfdCAqLworI2VuZGlmCit0eXBlZGVmIF9fdWludDY0X3QJeGZzX2ZpbGVvZmZfdDsJLyogYmxvY2sgbnVtYmVyIGluIGEgZmlsZSAqLwordHlwZWRlZiBfX2ludDY0X3QJeGZzX3NmaWxvZmZfdDsJLyogc2lnbmVkIGJsb2NrIG51bWJlciBpbiBhIGZpbGUgKi8KK3R5cGVkZWYgX191aW50NjRfdAl4ZnNfZmlsYmxrc190OwkvKiBudW1iZXIgb2YgYmxvY2tzIGluIGEgZmlsZSAqLworCit0eXBlZGVmIF9fdWludDhfdAl4ZnNfYXJjaF90OwkvKiBhcmNoaXRlY3R1cmUgb2YgYW4geGZzIGZzICovCisKKy8qCisgKiBOdWxsIHZhbHVlcyBmb3IgdGhlIHR5cGVzLgorICovCisjZGVmaW5lCU5VTExERlNCTk8JKCh4ZnNfZGZzYm5vX3QpLTEpCisjZGVmaW5lCU5VTExEUkZTQk5PCSgoeGZzX2RyZnNibm9fdCktMSkKKyNkZWZpbmUJTlVMTERSVEJOTwkoKHhmc19kcnRibm9fdCktMSkKKyNkZWZpbmUJTlVMTERGSUxPRkYJKCh4ZnNfZGZpbG9mZl90KS0xKQorCisjZGVmaW5lCU5VTExGU0JMT0NLCSgoeGZzX2ZzYmxvY2tfdCktMSkKKyNkZWZpbmUJTlVMTFJGU0JMT0NLCSgoeGZzX3Jmc2Jsb2NrX3QpLTEpCisjZGVmaW5lCU5VTExSVEJMT0NLCSgoeGZzX3J0YmxvY2tfdCktMSkKKyNkZWZpbmUJTlVMTEZJTEVPRkYJKCh4ZnNfZmlsZW9mZl90KS0xKQorCisjZGVmaW5lCU5VTExBR0JMT0NLCSgoeGZzX2FnYmxvY2tfdCktMSkKKyNkZWZpbmUJTlVMTEFHTlVNQkVSCSgoeGZzX2FnbnVtYmVyX3QpLTEpCisjZGVmaW5lCU5VTExFWFROVU0JKCh4ZnNfZXh0bnVtX3QpLTEpCisKKyNkZWZpbmUgTlVMTENPTU1JVExTTgkoKHhmc19sc25fdCktMSkKKworLyoKKyAqIE1heCB2YWx1ZXMgZm9yIGV4dGxlbiwgZXh0bnVtLCBhZXh0bnVtLgorICovCisjZGVmaW5lCU1BWEVYVExFTgkoKHhmc19leHRsZW5fdCkweDAwMWZmZmZmKQkvKiAyMSBiaXRzICovCisjZGVmaW5lCU1BWEVYVE5VTQkoKHhmc19leHRudW1fdCkweDdmZmZmZmZmKQkvKiBzaWduZWQgaW50ICovCisjZGVmaW5lCU1BWEFFWFROVU0JKCh4ZnNfYWV4dG51bV90KTB4N2ZmZikJCS8qIHNpZ25lZCBzaG9ydCAqLworCisvKgorICogTUFYTkFNRUxFTiBpcyB0aGUgbGVuZ3RoIChpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIG51bGwpIG9mCisgKiB0aGUgbG9uZ2VzdCBwZXJtaXNzaWJsZSBmaWxlIChjb21wb25lbnQpIG5hbWUuCisgKi8KKyNkZWZpbmUgTUFYTkFNRUxFTgkyNTYKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcmVudCB7CQkvKiBkYXRhIGZyb20gcmVhZGRpcigpICovCisJeGZzX2lub190CWRfaW5vOwkJLyogaW5vZGUgbnVtYmVyIG9mIGVudHJ5ICovCisJeGZzX29mZl90CWRfb2ZmOwkJLyogb2Zmc2V0IG9mIGRpc2sgZGlyZWN0b3J5IGVudHJ5ICovCisJdW5zaWduZWQgc2hvcnQJZF9yZWNsZW47CS8qIGxlbmd0aCBvZiB0aGlzIHJlY29yZCAqLworCWNoYXIJCWRfbmFtZVsxXTsJLyogbmFtZSBvZiBmaWxlICovCit9IHhmc19kaXJlbnRfdDsKKworI2RlZmluZSBESVJFTlRCQVNFU0laRQkJKCgoeGZzX2RpcmVudF90ICopMCktPmRfbmFtZSAtIChjaGFyICopMCkKKyNkZWZpbmUgRElSRU5UU0laRShuYW1lbGVuKQlcCisJKChESVJFTlRCQVNFU0laRSArIChuYW1lbGVuKSArIFwKKwkJc2l6ZW9mKHhmc19vZmZfdCkpICYgfihzaXplb2YoeGZzX29mZl90KSAtIDEpKQorCit0eXBlZGVmIGVudW0geworCVhGU19MT09LVVBfRVFpLCBYRlNfTE9PS1VQX0xFaSwgWEZTX0xPT0tVUF9HRWkKK30geGZzX2xvb2t1cF90OworCit0eXBlZGVmIGVudW0geworCVhGU19CVE5VTV9CTk9pLCBYRlNfQlROVU1fQ05UaSwgWEZTX0JUTlVNX0JNQVBpLCBYRlNfQlROVU1fSU5PaSwKKwlYRlNfQlROVU1fTUFYCit9IHhmc19idG51bV90OworCisjZW5kaWYJLyogX19YRlNfVFlQRVNfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3V0aWxzLmMgYi9mcy94ZnMveGZzX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE2Yjk0NQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfdXRpbHMuYwpAQCAtMCwwICsxLDQ4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKyNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCisjaW5jbHVkZSAieGZzX3V0aWxzLmgiCisKKy8qCisgKiB4ZnNfZ2V0X2Rpcl9lbnRyeSBpcyB1c2VkIHRvIGdldCBhIHJlZmVyZW5jZSB0byBhbiBpbm9kZSBnaXZlbgorICogaXRzIHBhcmVudCBkaXJlY3RvcnkgaW5vZGUgYW5kIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgkgSXQgZG9lcworICogbm90IGxvY2sgdGhlIGNoaWxkIGlub2RlLCBhbmQgaXQgdW5sb2NrcyB0aGUgZGlyZWN0b3J5IGJlZm9yZQorICogcmV0dXJuaW5nLiAgVGhlIGRpcmVjdG9yeSdzIGdlbmVyYXRpb24gbnVtYmVyIGlzIHJldHVybmVkIGZvcgorICogdXNlIGJ5IGEgbGF0ZXIgY2FsbCB0byB4ZnNfbG9ja19kaXJfYW5kX2VudHJ5LgorICovCitpbnQKK3hmc19nZXRfZGlyX2VudHJ5KAorCXZuYW1lX3QJCSpkZW50cnksCisJeGZzX2lub2RlX3QJKippcHApCit7CisJdm5vZGVfdAkJKnZwOworCWJodl9kZXNjX3QJKmJkcDsKKworCXZwID0gVk5BTUVfVE9fVk5PREUoZGVudHJ5KTsKKwliZHAgPSB2bl9iaHZfbG9va3VwX3VubG9ja2VkKFZOX0JIVl9IRUFEKHZwKSwgJnhmc192bm9kZW9wcyk7CisJaWYgKCFiZHApIHsKKwkJKmlwcCA9IE5VTEw7CisJCXJldHVybiBYRlNfRVJST1IoRU5PRU5UKTsKKwl9CisJVk5fSE9MRCh2cCk7CisJKmlwcCA9IFhGU19CSFZUT0koYmRwKTsKKwlyZXR1cm4gMDsKK30KKworaW50Cit4ZnNfZGlyX2xvb2t1cF9pbnQoCisJYmh2X2Rlc2NfdAkqZGlyX2JkcCwKKwl1aW50CQlsb2NrX21vZGUsCisJdm5hbWVfdAkJKmRlbnRyeSwKKwl4ZnNfaW5vX3QJKmludW0sCisJeGZzX2lub2RlX3QJKippcHApCit7CisJdm5vZGVfdAkJKmRpcl92cDsKKwl4ZnNfaW5vZGVfdAkqZHA7CisJaW50CQllcnJvcjsKKworCWRpcl92cCA9IEJIVl9UT19WTk9ERShkaXJfYmRwKTsKKwl2bl90cmFjZV9lbnRyeShkaXJfdnAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCisJZHAgPSBYRlNfQkhWVE9JKGRpcl9iZHApOworCisJZXJyb3IgPSBYRlNfRElSX0xPT0tVUChkcC0+aV9tb3VudCwgTlVMTCwgZHAsCisJCQkJVk5BTUUoZGVudHJ5KSwgVk5BTUVMRU4oZGVudHJ5KSwgaW51bSk7CisJaWYgKCFlcnJvcikgeworCQkvKgorCQkgKiBVbmxvY2sgdGhlIGRpcmVjdG9yeS4gV2UgZG8gdGhpcyBiZWNhdXNlIHdlIGNhbid0CisJCSAqIGhvbGQgdGhlIGRpcmVjdG9yeSBsb2NrIHdoaWxlIGRvaW5nIHRoZSB2bl9nZXQoKQorCQkgKiBpbiB4ZnNfaWdldCgpLiAgRG9pbmcgc28gY291bGQgY2F1c2UgdXMgdG8gaG9sZAorCQkgKiBhIGxvY2sgd2hpbGUgd2FpdGluZyBmb3IgdGhlIGlub2RlIHRvIGZpbmlzaAorCQkgKiBiZWluZyBpbmFjdGl2ZSB3aGlsZSBpdCdzIHdhaXRpbmcgZm9yIGEgbG9nCisJCSAqIHJlc2VydmF0aW9uIGluIHRoZSBpbmFjdGl2ZSByb3V0aW5lLgorCQkgKi8KKwkJeGZzX2l1bmxvY2soZHAsIGxvY2tfbW9kZSk7CisJCWVycm9yID0geGZzX2lnZXQoZHAtPmlfbW91bnQsIE5VTEwsICppbnVtLCAwLCAwLCBpcHAsIDApOworCQl4ZnNfaWxvY2soZHAsIGxvY2tfbW9kZSk7CisKKwkJaWYgKGVycm9yKSB7CisJCQkqaXBwID0gTlVMTDsKKwkJfSBlbHNlIGlmICgoKmlwcCktPmlfZC5kaV9tb2RlID09IDApIHsKKwkJCS8qCisJCQkgKiBUaGUgaW5vZGUgaGFzIGJlZW4gZnJlZWQuICBTb21ldGhpbmcgaXMKKwkJCSAqIHdyb25nIHNvIGp1c3QgZ2V0IG91dCBvZiBoZXJlLgorCQkJICovCisJCQl4ZnNfaXVubG9jayhkcCwgbG9ja19tb2RlKTsKKwkJCXhmc19pcHV0X25ldygqaXBwLCAwKTsKKwkJCSppcHAgPSBOVUxMOworCQkJeGZzX2lsb2NrKGRwLCBsb2NrX21vZGUpOworCQkJZXJyb3IgPSBYRlNfRVJST1IoRU5PRU5UKTsKKwkJfQorCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBBbGxvY2F0ZXMgYSBuZXcgaW5vZGUgZnJvbSBkaXNrIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZQorICogaW5jb3JlIGNvcHkuIFRoaXMgcm91dGluZSB3aWxsIGludGVybmFsbHkgY29tbWl0IHRoZSBjdXJyZW50CisgKiB0cmFuc2FjdGlvbiBhbmQgYWxsb2NhdGUgYSBuZXcgb25lIGlmIHRoZSBTcGFjZSBNYW5hZ2VyIG5lZWRlZAorICogdG8gZG8gYW4gYWxsb2NhdGlvbiB0byByZXBsZW5pc2ggdGhlIGlub2RlIGZyZWUtbGlzdC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgZGVzaWduZWQgdG8gYmUgY2FsbGVkIGZyb20geGZzX2NyZWF0ZSBhbmQKKyAqIHhmc19jcmVhdGVfZGlyLgorICoKKyAqLworaW50Cit4ZnNfZGlyX2lhbGxvYygKKwl4ZnNfdHJhbnNfdAkqKnRwcCwJCS8qIGlucHV0OiBjdXJyZW50IHRyYW5zYWN0aW9uOworCQkJCQkgICBvdXRwdXQ6IG1heSBiZSBhIG5ldyB0cmFuc2FjdGlvbi4gKi8KKwl4ZnNfaW5vZGVfdAkqZHAsCQkvKiBkaXJlY3Rvcnkgd2l0aGluIHdob3NlIGFsbG9jYXRlCisJCQkJCSAgIHRoZSBpbm9kZS4gKi8KKwltb2RlX3QJCW1vZGUsCisJbmxpbmtfdAkJbmxpbmssCisJeGZzX2Rldl90CXJkZXYsCisJY3JlZF90CQkqY3JlZHAsCisJcHJpZF90CQlwcmlkLAkJLyogcHJvamVjdCBpZCAqLworCWludAkJb2thbGxvYywJLyogb2sgdG8gYWxsb2NhdGUgbmV3IHNwYWNlICovCisJeGZzX2lub2RlX3QJKippcHAsCQkvKiBwb2ludGVyIHRvIGlub2RlOyBpdCB3aWxsIGJlCisJCQkJCSAgIGxvY2tlZC4gKi8KKwlpbnQJCSpjb21taXR0ZWQpCisKK3sKKwl4ZnNfdHJhbnNfdAkqdHA7CisJeGZzX3RyYW5zX3QJKm50cDsKKwl4ZnNfaW5vZGVfdAkqaXA7CisJeGZzX2J1Zl90CSppYWxsb2NfY29udGV4dCA9IE5VTEw7CisJYm9vbGVhbl90CWNhbGxfYWdhaW4gPSBCX0ZBTFNFOworCWludAkJY29kZTsKKwl1aW50CQlsb2dfcmVzOworCXVpbnQJCWxvZ19jb3VudDsKKwl2b2lkCQkqZHFpbmZvOworCXVpbnQJCXRmbGFnczsKKworCXRwID0gKnRwcDsKKwlBU1NFUlQodHAtPnRfZmxhZ3MgJiBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTKTsKKworCS8qCisJICogeGZzX2lhbGxvYyB3aWxsIHJldHVybiBhIHBvaW50ZXIgdG8gYW4gaW5jb3JlIGlub2RlIGlmCisJICogdGhlIFNwYWNlIE1hbmFnZXIgaGFzIGFuIGF2YWlsYWJsZSBpbm9kZSBvbiB0aGUgZnJlZQorCSAqIGxpc3QuIE90aGVyd2lzZSwgaXQgd2lsbCBkbyBhbiBhbGxvY2F0aW9uIGFuZCByZXBsZW5pc2gKKwkgKiB0aGUgZnJlZWxpc3QuICBTaW5jZSB3ZSBjYW4gb25seSBkbyBvbmUgYWxsb2NhdGlvbiBwZXIKKwkgKiB0cmFuc2FjdGlvbiB3aXRob3V0IGRlYWRsb2Nrcywgd2Ugd2lsbCBuZWVkIHRvIGNvbW1pdCB0aGUKKwkgKiBjdXJyZW50IHRyYW5zYWN0aW9uIGFuZCBzdGFydCBhIG5ldyBvbmUuICBXZSB3aWxsIHRoZW4KKwkgKiBuZWVkIHRvIGNhbGwgeGZzX2lhbGxvYyBhZ2FpbiB0byBnZXQgdGhlIGlub2RlLgorCSAqCisJICogSWYgeGZzX2lhbGxvYyBkaWQgYW4gYWxsb2NhdGlvbiB0byByZXBsZW5pc2ggdGhlIGZyZWVsaXN0LAorCSAqIGl0IHJldHVybnMgdGhlIGJwIGNvbnRhaW5pbmcgdGhlIGhlYWQgb2YgdGhlIGZyZWVsaXN0IGFzCisJICogaWFsbG9jX2NvbnRleHQuIFdlIHdpbGwgaG9sZCBhIGxvY2sgb24gaXQgYWNyb3NzIHRoZQorCSAqIHRyYW5zYWN0aW9uIGNvbW1pdCBzbyB0aGF0IG5vIG90aGVyIHByb2Nlc3MgY2FuIHN0ZWFsCisJICogdGhlIGlub2RlKHMpIHRoYXQgd2UndmUganVzdCBhbGxvY2F0ZWQuCisJICovCisJY29kZSA9IHhmc19pYWxsb2ModHAsIGRwLCBtb2RlLCBubGluaywgcmRldiwgY3JlZHAsIHByaWQsIG9rYWxsb2MsCisJCQkgICZpYWxsb2NfY29udGV4dCwgJmNhbGxfYWdhaW4sICZpcCk7CisKKwkvKgorCSAqIFJldHVybiBhbiBlcnJvciBpZiB3ZSB3ZXJlIHVuYWJsZSB0byBhbGxvY2F0ZSBhIG5ldyBpbm9kZS4KKwkgKiBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB3ZSBydW4gb3V0IG9mIHNwYWNlIG9uIGRpc2sgb3IKKwkgKiBlbmNvdW50ZXIgYSBkaXNrIGVycm9yLgorCSAqLworCWlmIChjb2RlKSB7CisJCSppcHAgPSBOVUxMOworCQlyZXR1cm4gY29kZTsKKwl9CisJaWYgKCFjYWxsX2FnYWluICYmIChpcCA9PSBOVUxMKSkgeworCQkqaXBwID0gTlVMTDsKKwkJcmV0dXJuIFhGU19FUlJPUihFTk9TUEMpOworCX0KKworCS8qCisJICogSWYgY2FsbF9hZ2FpbiBpcyBzZXQsIHRoZW4gd2Ugd2VyZSB1bmFibGUgdG8gZ2V0IGFuCisJICogaW5vZGUgaW4gb25lIG9wZXJhdGlvbi4gIFdlIG5lZWQgdG8gY29tbWl0IHRoZSBjdXJyZW50CisJICogdHJhbnNhY3Rpb24gYW5kIGNhbGwgeGZzX2lhbGxvYygpIGFnYWluLiAgSXQgaXMgZ3VhcmFudGVlZAorCSAqIHRvIHN1Y2NlZWQgdGhlIHNlY29uZCB0aW1lLgorCSAqLworCWlmIChjYWxsX2FnYWluKSB7CisKKwkJLyoKKwkJICogTm9ybWFsbHksIHhmc190cmFuc19jb21taXQgcmVsZWFzZXMgYWxsIHRoZSBsb2Nrcy4KKwkJICogV2UgY2FsbCBiaG9sZCB0byBoYW5nIG9uIHRvIHRoZSBpYWxsb2NfY29udGV4dCBhY3Jvc3MKKwkJICogdGhlIGNvbW1pdC4gIEhvbGRpbmcgdGhpcyBidWZmZXIgcHJldmVudHMgYW55IG90aGVyCisJCSAqIHByb2Nlc3NlcyBmcm9tIGRvaW5nIGFueSBhbGxvY2F0aW9ucyBpbiB0aGlzCisJCSAqIGFsbG9jYXRpb24gZ3JvdXAuCisJCSAqLworCQl4ZnNfdHJhbnNfYmhvbGQodHAsIGlhbGxvY19jb250ZXh0KTsKKwkJLyoKKwkJICogU2F2ZSB0aGUgbG9nIHJlc2VydmF0aW9uIHNvIHdlIGNhbiB1c2UKKwkJICogdGhlbSBpbiB0aGUgbmV4dCB0cmFuc2FjdGlvbi4KKwkJICovCisJCWxvZ19yZXMgPSB4ZnNfdHJhbnNfZ2V0X2xvZ19yZXModHApOworCQlsb2dfY291bnQgPSB4ZnNfdHJhbnNfZ2V0X2xvZ19jb3VudCh0cCk7CisKKwkJLyoKKwkJICogV2Ugd2FudCB0aGUgcXVvdGEgY2hhbmdlcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5leHQKKwkJICogdHJhbnNhY3Rpb24sIE5PVCB0aGlzIG9uZS4gU28sIGRldGFjaCB0aGUgZHFpbmZvIGZyb20gdGhpcworCQkgKiBhbmQgYXR0YWNoIGl0IHRvIHRoZSBuZXh0IHRyYW5zYWN0aW9uLgorCQkgKi8KKwkJZHFpbmZvID0gTlVMTDsKKwkJdGZsYWdzID0gMDsKKwkJaWYgKHRwLT50X2RxaW5mbykgeworCQkJZHFpbmZvID0gKHZvaWQgKil0cC0+dF9kcWluZm87CisJCQl0cC0+dF9kcWluZm8gPSBOVUxMOworCQkJdGZsYWdzID0gdHAtPnRfZmxhZ3MgJiBYRlNfVFJBTlNfRFFfRElSVFk7CisJCQl0cC0+dF9mbGFncyAmPSB+KFhGU19UUkFOU19EUV9ESVJUWSk7CisJCX0KKworCQludHAgPSB4ZnNfdHJhbnNfZHVwKHRwKTsKKwkJY29kZSA9IHhmc190cmFuc19jb21taXQodHAsIDAsIE5VTEwpOworCQl0cCA9IG50cDsKKwkJaWYgKGNvbW1pdHRlZCAhPSBOVUxMKSB7CisJCQkqY29tbWl0dGVkID0gMTsKKwkJfQorCQkvKgorCQkgKiBJZiB3ZSBnZXQgYW4gZXJyb3IgZHVyaW5nIHRoZSBjb21taXQgcHJvY2Vzc2luZywKKwkJICogcmVsZWFzZSB0aGUgYnVmZmVyIHRoYXQgaXMgc3RpbGwgaGVsZCBhbmQgcmV0dXJuCisJCSAqIHRvIHRoZSBjYWxsZXIuCisJCSAqLworCQlpZiAoY29kZSkgeworCQkJeGZzX2J1Zl9yZWxzZShpYWxsb2NfY29udGV4dCk7CisJCQlpZiAoZHFpbmZvKSB7CisJCQkJdHAtPnRfZHFpbmZvID0gZHFpbmZvOworCQkJCVhGU19UUkFOU19GUkVFX0RRSU5GTyh0cC0+dF9tb3VudHAsIHRwKTsKKwkJCX0KKwkJCSp0cHAgPSBudHA7CisJCQkqaXBwID0gTlVMTDsKKwkJCXJldHVybiBjb2RlOworCQl9CisJCWNvZGUgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgbG9nX3JlcywgMCwKKwkJCQkJIFhGU19UUkFOU19QRVJNX0xPR19SRVMsIGxvZ19jb3VudCk7CisJCS8qCisJCSAqIFJlLWF0dGFjaCB0aGUgcXVvdGEgaW5mbyB0aGF0IHdlIGRldGFjaGVkIGZyb20gcHJldiB0cnguCisJCSAqLworCQlpZiAoZHFpbmZvKSB7CisJCQl0cC0+dF9kcWluZm8gPSBkcWluZm87CisJCQl0cC0+dF9mbGFncyB8PSB0ZmxhZ3M7CisJCX0KKworCQlpZiAoY29kZSkgeworCQkJeGZzX2J1Zl9yZWxzZShpYWxsb2NfY29udGV4dCk7CisJCQkqdHBwID0gbnRwOworCQkJKmlwcCA9IE5VTEw7CisJCQlyZXR1cm4gY29kZTsKKwkJfQorCQl4ZnNfdHJhbnNfYmpvaW4odHAsIGlhbGxvY19jb250ZXh0KTsKKworCQkvKgorCQkgKiBDYWxsIGlhbGxvYyBhZ2Fpbi4gU2luY2Ugd2UndmUgbG9ja2VkIG91dCBhbGwKKwkJICogb3RoZXIgYWxsb2NhdGlvbnMgaW4gdGhpcyBhbGxvY2F0aW9uIGdyb3VwLAorCQkgKiB0aGlzIGNhbGwgc2hvdWxkIGFsd2F5cyBzdWNjZWVkLgorCQkgKi8KKwkJY29kZSA9IHhmc19pYWxsb2ModHAsIGRwLCBtb2RlLCBubGluaywgcmRldiwgY3JlZHAsIHByaWQsCisJCQkJICBva2FsbG9jLCAmaWFsbG9jX2NvbnRleHQsICZjYWxsX2FnYWluLCAmaXApOworCisJCS8qCisJCSAqIElmIHdlIGdldCBhbiBlcnJvciBhdCB0aGlzIHBvaW50LCByZXR1cm4gdG8gdGhlIGNhbGxlcgorCQkgKiBzbyB0aGF0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGNhbiBiZSBhYm9ydGVkLgorCQkgKi8KKwkJaWYgKGNvZGUpIHsKKwkJCSp0cHAgPSB0cDsKKwkJCSppcHAgPSBOVUxMOworCQkJcmV0dXJuIGNvZGU7CisJCX0KKwkJQVNTRVJUICgoIWNhbGxfYWdhaW4pICYmIChpcCAhPSBOVUxMKSk7CisKKwl9IGVsc2UgeworCQlpZiAoY29tbWl0dGVkICE9IE5VTEwpIHsKKwkJCSpjb21taXR0ZWQgPSAwOworCQl9CisJfQorCisJKmlwcCA9IGlwOworCSp0cHAgPSB0cDsKKworCXJldHVybiAwOworfQorCisvKgorICogRGVjcmVtZW50IHRoZSBsaW5rIGNvdW50IG9uIGFuIGlub2RlICYgbG9nIHRoZSBjaGFuZ2UuCisgKiBJZiB0aGlzIGNhdXNlcyB0aGUgbGluayBjb3VudCB0byBnbyB0byB6ZXJvLCBpbml0aWF0ZSB0aGUKKyAqIGxvZ2dpbmcgYWN0aXZpdHkgcmVxdWlyZWQgdG8gdHJ1bmNhdGUgYSBmaWxlLgorICovCitpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19kcm9wbGluaygKKwl4ZnNfdHJhbnNfdCAqdHAsCisJeGZzX2lub2RlX3QgKmlwKQoreworCWludAllcnJvcjsKKworCXhmc19pY2hndGltZShpcCwgWEZTX0lDSEdUSU1FX0NIRyk7CisKKwlBU1NFUlQgKGlwLT5pX2QuZGlfbmxpbmsgPiAwKTsKKwlpcC0+aV9kLmRpX25saW5rLS07CisJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOworCisJZXJyb3IgPSAwOworCWlmIChpcC0+aV9kLmRpX25saW5rID09IDApIHsKKwkJLyoKKwkJICogV2UncmUgZHJvcHBpbmcgdGhlIGxhc3QgbGluayB0byB0aGlzIGZpbGUuCisJCSAqIE1vdmUgdGhlIG9uLWRpc2sgaW5vZGUgdG8gdGhlIEFHSSB1bmxpbmtlZCBsaXN0LgorCQkgKiBGcm9tIHhmc19pbmFjdGl2ZSgpIHdlIHdpbGwgcHVsbCB0aGUgaW5vZGUgZnJvbQorCQkgKiB0aGUgbGlzdCBhbmQgZnJlZSBpdC4KKwkJICovCisJCWVycm9yID0geGZzX2l1bmxpbmsodHAsIGlwKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogVGhpcyBnZXRzIGNhbGxlZCB3aGVuIHRoZSBpbm9kZSdzIHZlcnNpb24gbmVlZHMgdG8gYmUgY2hhbmdlZCBmcm9tIDEgdG8gMi4KKyAqIEN1cnJlbnRseSB0aGlzIGhhcHBlbnMgd2hlbiB0aGUgbmxpbmsgZmllbGQgb3ZlcmZsb3dzIHRoZSBvbGQgMTYtYml0IHZhbHVlCisgKiBvciB3aGVuIGNocHJvaiBpcyBjYWxsZWQgdG8gY2hhbmdlIHRoZSBwcm9qZWN0IGZvciB0aGUgZmlyc3QgdGltZS4KKyAqIEFzIGEgc2lkZSBlZmZlY3QgdGhlIHN1cGVyYmxvY2sgdmVyc2lvbiB3aWxsIGFsc28gZ2V0IHJldidkCisgKiB0byBjb250YWluIHRoZSBOTElOSyBiaXQuCisgKi8KK3ZvaWQKK3hmc19idW1wX2lub192ZXJzMigKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX2lub2RlX3QJKmlwKQoreworCXhmc19tb3VudF90CSptcDsKKwl1bnNpZ25lZCBsb25nCQlzOworCisJQVNTRVJUKGlzbXJsb2NrZWQgKCZpcC0+aV9sb2NrLCBNUl9VUERBVEUpKTsKKwlBU1NFUlQoaXAtPmlfZC5kaV92ZXJzaW9uID09IFhGU19ESU5PREVfVkVSU0lPTl8xKTsKKworCWlwLT5pX2QuZGlfdmVyc2lvbiA9IFhGU19ESU5PREVfVkVSU0lPTl8yOworCWlwLT5pX2QuZGlfb25saW5rID0gMDsKKwltZW1zZXQoJihpcC0+aV9kLmRpX3BhZFswXSksIDAsIHNpemVvZihpcC0+aV9kLmRpX3BhZCkpOworCW1wID0gdHAtPnRfbW91bnRwOworCWlmICghWEZTX1NCX1ZFUlNJT05fSEFTTkxJTksoJm1wLT5tX3NiKSkgeworCQlzID0gWEZTX1NCX0xPQ0sobXApOworCQlpZiAoIVhGU19TQl9WRVJTSU9OX0hBU05MSU5LKCZtcC0+bV9zYikpIHsKKwkJCVhGU19TQl9WRVJTSU9OX0FERE5MSU5LKCZtcC0+bV9zYik7CisJCQlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKwkJCXhmc19tb2Rfc2IodHAsIFhGU19TQl9WRVJTSU9OTlVNKTsKKwkJfSBlbHNlIHsKKwkJCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCQl9CisJfQorCS8qIENhbGxlciBtdXN0IGxvZyB0aGUgaW5vZGUgKi8KK30KKworLyoKKyAqIEluY3JlbWVudCB0aGUgbGluayBjb3VudCBvbiBhbiBpbm9kZSAmIGxvZyB0aGUgY2hhbmdlLgorICovCitpbnQKK3hmc19idW1wbGluaygKKwl4ZnNfdHJhbnNfdCAqdHAsCisJeGZzX2lub2RlX3QgKmlwKQoreworCWlmIChpcC0+aV9kLmRpX25saW5rID49IFhGU19NQVhMSU5LKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVNTElOSyk7CisJeGZzX2ljaGd0aW1lKGlwLCBYRlNfSUNIR1RJTUVfQ0hHKTsKKworCUFTU0VSVChpcC0+aV9kLmRpX25saW5rID4gMCk7CisJaXAtPmlfZC5kaV9ubGluaysrOworCWlmICgoaXAtPmlfZC5kaV92ZXJzaW9uID09IFhGU19ESU5PREVfVkVSU0lPTl8xKSAmJgorCSAgICAoaXAtPmlfZC5kaV9ubGluayA+IFhGU19NQVhMSU5LXzEpKSB7CisJCS8qCisJCSAqIFRoZSBpbm9kZSBoYXMgaW5jcmVhc2VkIGl0cyBudW1iZXIgb2YgbGlua3MgYmV5b25kCisJCSAqIHdoYXQgY2FuIGZpdCBpbiBhbiBvbGQgZm9ybWF0IGlub2RlLiAgSXQgbm93IG5lZWRzCisJCSAqIHRvIGJlIGNvbnZlcnRlZCB0byBhIHZlcnNpb24gMiBpbm9kZSB3aXRoIGEgMzIgYml0CisJCSAqIGxpbmsgY291bnQuICBJZiB0aGlzIGlzIHRoZSBmaXJzdCBpbm9kZSBpbiB0aGUgZmlsZQorCQkgKiBzeXN0ZW0gdG8gZG8gdGhpcywgdGhlbiB3ZSBuZWVkIHRvIGJ1bXAgdGhlIHN1cGVyYmxvY2sKKwkJICogdmVyc2lvbiBudW1iZXIgYXMgd2VsbC4KKwkJICovCisJCXhmc19idW1wX2lub192ZXJzMih0cCwgaXApOworCX0KKworCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRyeSB0byB0cnVuY2F0ZSB0aGUgZ2l2ZW4gZmlsZSB0byAwIGxlbmd0aC4gIEN1cnJlbnRseSBjYWxsZWQKKyAqIG9ubHkgb3V0IG9mIHhmc19yZW1vdmUgd2hlbiBpdCBoYXMgdG8gdHJ1bmNhdGUgYSBmaWxlIHRvIGZyZWUKKyAqIHVwIHNwYWNlIGZvciB0aGUgcmVtb3ZlIHRvIHByb2NlZWQuCisgKi8KK2ludAoreGZzX3RydW5jYXRlX2ZpbGUoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19pbm9kZV90CSppcCkKK3sKKwl4ZnNfdHJhbnNfdAkqdHA7CisJaW50CQllcnJvcjsKKworI2lmZGVmIFFVT1RBREVCVUcKKwkvKgorCSAqIFRoaXMgaXMgY2FsbGVkIHRvIHRydW5jYXRlIHRoZSBxdW90YWlub2RlcyB0b28uCisJICovCisJaWYgKFhGU19JU19VUVVPVEFfT04obXApKSB7CisJCWlmIChpcC0+aV9pbm8gIT0gbXAtPm1fc2Iuc2JfdXF1b3Rpbm8pCisJCQlBU1NFUlQoaXAtPmlfdWRxdW90KTsKKwl9CisJaWYgKFhGU19JU19HUVVPVEFfT04obXApKSB7CisJCWlmIChpcC0+aV9pbm8gIT0gbXAtPm1fc2Iuc2JfZ3F1b3Rpbm8pCisJCQlBU1NFUlQoaXAtPmlfZ2RxdW90KTsKKwl9CisjZW5kaWYKKwkvKgorCSAqIE1ha2UgdGhlIGNhbGwgdG8geGZzX2l0cnVuY2F0ZV9zdGFydCBiZWZvcmUgc3RhcnRpbmcgdGhlCisJICogdHJhbnNhY3Rpb24sIGJlY2F1c2Ugd2UgY2Fubm90IG1ha2UgdGhlIGNhbGwgd2hpbGUgd2UncmUKKwkgKiBpbiBhIHRyYW5zYWN0aW9uLgorCSAqLworCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKKwl4ZnNfaXRydW5jYXRlX3N0YXJ0KGlwLCBYRlNfSVRSVU5DX0RFRklOSVRFLCAoeGZzX2ZzaXplX3QpMCk7CisKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1RSVU5DQVRFX0ZJTEUpOworCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgWEZTX0lUUlVOQ0FURV9MT0dfUkVTKG1wKSwgMCwKKwkJCQkgICAgICBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAorCQkJCSAgICAgIFhGU19JVFJVTkNBVEVfTE9HX0NPVU5UKSkpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyoKKwkgKiBGb2xsb3cgdGhlIG5vcm1hbCB0cnVuY2F0ZSBsb2NraW5nIHByb3RvY29sLiAgU2luY2Ugd2UKKwkgKiBob2xkIHRoZSBpbm9kZSBpbiB0aGUgdHJhbnNhY3Rpb24sIHdlIGtub3cgdGhhdCBpdCdzIG51bWJlcgorCSAqIG9mIHJlZmVyZW5jZXMgd2lsbCBzdGF5IGNvbnN0YW50LgorCSAqLworCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKwkvKgorCSAqIFNpZ25hbCBhIHN5bmMgeGFjdGlvbi4gIFRoZSBvbmx5IGNhc2Ugd2hlcmUgdGhhdCBpc24ndAorCSAqIHRoZSBjYXNlIGlzIGlmIHdlJ3JlIHRydW5jYXRpbmcgYW4gYWxyZWFkeSB1bmxpbmtlZCBmaWxlCisJICogb24gYSB3c3luYyBmcy4gIEluIHRoYXQgY2FzZSwgd2Uga25vdyB0aGUgYmxvY2tzIGNhbid0CisJICogcmVhcHBlYXIgaW4gdGhlIGZpbGUgYmVjYXVzZSB0aGUgbGlua3MgdG8gZmlsZSBhcmUKKwkgKiBwZXJtYW5lbnRseSB0b2FzdC4gIEN1cnJlbnRseSwgd2UncmUgYWx3YXlzIGdvaW5nIHRvCisJICogd2FudCBhIHN5bmMgdHJhbnNhY3Rpb24gYmVjYXVzZSB0aGlzIGNvZGUgaXMgYmVpbmcKKwkgKiBjYWxsZWQgZnJvbSBwbGFjZXMgd2hlcmUgbmxpbmsgaXMgZ3VhcmFudGVlZCB0byBiZSAxCisJICogYnV0IEknbSBsZWF2aW5nIHRoZSB0ZXN0cyBpbiB0byBwcm90ZWN0IGFnYWluc3QgZnV0dXJlCisJICogY2hhbmdlcyAtLSByY2MuCisJICovCisJZXJyb3IgPSB4ZnNfaXRydW5jYXRlX2ZpbmlzaCgmdHAsIGlwLCAoeGZzX2ZzaXplX3QpMCwKKwkJCQkgICAgIFhGU19EQVRBX0ZPUkssCisJCQkJICAgICAoKGlwLT5pX2QuZGlfbmxpbmsgIT0gMCB8fAorCQkJCSAgICAgICAhKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1dTWU5DKSkKKwkJCQkgICAgICA/IDEgOiAwKSk7CisJaWYgKGVycm9yKSB7CisJCXhmc190cmFuc19jYW5jZWwodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMgfAorCQkJCSBYRlNfVFJBTlNfQUJPUlQpOworCX0gZWxzZSB7CisJCXhmc19pY2hndGltZShpcCwgWEZTX0lDSEdUSU1FX01PRCB8IFhGU19JQ0hHVElNRV9DSEcpOworCQllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsCisJCQkJCSBOVUxMKTsKKwl9CisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKTsKKworCXJldHVybiBlcnJvcjsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdXRpbHMuaCBiL2ZzL3hmcy94ZnNfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWVkNmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc191dGlscy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX1VUSUxTX0hfXworI2RlZmluZSBfX1hGU19VVElMU19IX18KKworI2RlZmluZSBJUkVMRShpcCkJVk5fUkVMRShYRlNfSVRPVihpcCkpCisjZGVmaW5lIElIT0xEKGlwKQlWTl9IT0xEKFhGU19JVE9WKGlwKSkKKyNkZWZpbmUJSVRSQUNFKGlwKQl2bl90cmFjZV9yZWYoWEZTX0lUT1YoaXApLCBfX0ZJTEVfXywgX19MSU5FX18sIFwKKwkJCQkoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcykKKworZXh0ZXJuIGludCB4ZnNfcmVuYW1lIChiaHZfZGVzY190ICosIHZuYW1lX3QgKiwgdm5vZGVfdCAqLCB2bmFtZV90ICosIGNyZWRfdCAqKTsKK2V4dGVybiBpbnQgeGZzX2dldF9kaXJfZW50cnkgKHZuYW1lX3QgKiwgeGZzX2lub2RlX3QgKiopOworZXh0ZXJuIGludCB4ZnNfZGlyX2xvb2t1cF9pbnQgKGJodl9kZXNjX3QgKiwgdWludCwgdm5hbWVfdCAqLCB4ZnNfaW5vX3QgKiwKKwkJCQl4ZnNfaW5vZGVfdCAqKik7CitleHRlcm4gaW50IHhmc190cnVuY2F0ZV9maWxlICh4ZnNfbW91bnRfdCAqLCB4ZnNfaW5vZGVfdCAqKTsKK2V4dGVybiBpbnQgeGZzX2Rpcl9pYWxsb2MgKHhmc190cmFuc190ICoqLCB4ZnNfaW5vZGVfdCAqLCBtb2RlX3QsIG5saW5rX3QsCisJCQkJeGZzX2Rldl90LCBjcmVkX3QgKiwgcHJpZF90LCBpbnQsCisJCQkJeGZzX2lub2RlX3QgKiosIGludCAqKTsKK2V4dGVybiBpbnQgeGZzX2Ryb3BsaW5rICh4ZnNfdHJhbnNfdCAqLCB4ZnNfaW5vZGVfdCAqKTsKK2V4dGVybiBpbnQgeGZzX2J1bXBsaW5rICh4ZnNfdHJhbnNfdCAqLCB4ZnNfaW5vZGVfdCAqKTsKK2V4dGVybiB2b2lkIHhmc19idW1wX2lub192ZXJzMiAoeGZzX3RyYW5zX3QgKiwgeGZzX2lub2RlX3QgKik7CisKKyNlbmRpZgkvKiBfX1hGU19VVElMU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdmZzb3BzLmMgYi9mcy94ZnMveGZzX3Zmc29wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYWFlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX3Zmc29wcy5jCkBAIC0wLDAgKzEsMTk0MSBAQAorLyoKKyAqIFhGUyBmaWxlc3lzdGVtIG9wZXJhdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisjaW5jbHVkZSAieGZzX3JlZmNhY2hlLmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2V4dGZyZWVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19xdW90YS5oIgorI2luY2x1ZGUgInhmc19kaXIyX3RyYWNlLmgiCisjaW5jbHVkZSAieGZzX2FjbC5oIgorI2luY2x1ZGUgInhmc19hdHRyLmgiCisjaW5jbHVkZSAieGZzX2NsbnQuaCIKKyNpbmNsdWRlICJ4ZnNfbG9nX3ByaXYuaCIKKworU1RBVElDIGludCB4ZnNfc3luYyhiaHZfZGVzY190ICosIGludCwgY3JlZF90ICopOworCitpbnQKK3hmc19pbml0KHZvaWQpCit7CisJZXh0ZXJuIGttZW1fem9uZV90CSp4ZnNfYm1hcF9mcmVlX2l0ZW1fem9uZTsKKwlleHRlcm4ga21lbV96b25lX3QJKnhmc19idHJlZV9jdXJfem9uZTsKKwlleHRlcm4ga21lbV96b25lX3QJKnhmc190cmFuc196b25lOworCWV4dGVybiBrbWVtX3pvbmVfdAkqeGZzX2J1Zl9pdGVtX3pvbmU7CisJZXh0ZXJuIGttZW1fem9uZV90CSp4ZnNfZGFidWZfem9uZTsKKyNpZmRlZiBYRlNfREFCVUZfREVCVUcKKwlleHRlcm4gbG9ja190CSAgICAgICAgeGZzX2RhYnVmX2dsb2JhbF9sb2NrOworCXNwaW5sb2NrX2luaXQoJnhmc19kYWJ1Zl9nbG9iYWxfbG9jaywgInhmc2RhIik7CisjZW5kaWYKKworCS8qCisJICogSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIHpvbmUgYWxsb2NhdG9ycyB3ZSB1c2UuCisJICovCisJeGZzX2JtYXBfZnJlZV9pdGVtX3pvbmUgPSBrbWVtX3pvbmVfaW5pdChzaXplb2YoeGZzX2JtYXBfZnJlZV9pdGVtX3QpLAorCQkJCQkJICJ4ZnNfYm1hcF9mcmVlX2l0ZW0iKTsKKwl4ZnNfYnRyZWVfY3VyX3pvbmUgPSBrbWVtX3pvbmVfaW5pdChzaXplb2YoeGZzX2J0cmVlX2N1cl90KSwKKwkJCQkJICAgICJ4ZnNfYnRyZWVfY3VyIik7CisJeGZzX2lub2RlX3pvbmUgPSBrbWVtX3pvbmVfaW5pdChzaXplb2YoeGZzX2lub2RlX3QpLCAieGZzX2lub2RlIik7CisJeGZzX3RyYW5zX3pvbmUgPSBrbWVtX3pvbmVfaW5pdChzaXplb2YoeGZzX3RyYW5zX3QpLCAieGZzX3RyYW5zIik7CisJeGZzX2RhX3N0YXRlX3pvbmUgPQorCQlrbWVtX3pvbmVfaW5pdChzaXplb2YoeGZzX2RhX3N0YXRlX3QpLCAieGZzX2RhX3N0YXRlIik7CisJeGZzX2RhYnVmX3pvbmUgPSBrbWVtX3pvbmVfaW5pdChzaXplb2YoeGZzX2RhYnVmX3QpLCAieGZzX2RhYnVmIik7CisKKwkvKgorCSAqIFRoZSBzaXplIG9mIHRoZSB6b25lIGFsbG9jYXRlZCBidWYgbG9nIGl0ZW0gaXMgdGhlIG1heGltdW0KKwkgKiBzaXplIHBvc3NpYmxlIHVuZGVyIFhGUy4gIFRoaXMgd2FzdGVzIGEgbGl0dGxlIGJpdCBvZiBtZW1vcnksCisJICogYnV0IGl0IGlzIG11Y2ggZmFzdGVyLgorCSAqLworCXhmc19idWZfaXRlbV96b25lID0KKwkJa21lbV96b25lX2luaXQoKHNpemVvZih4ZnNfYnVmX2xvZ19pdGVtX3QpICsKKwkJCQkoKChYRlNfTUFYX0JMT0NLU0laRSAvIFhGU19CTElfQ0hVTkspIC8KKwkJCQkgIE5CV09SRCkgKiBzaXplb2YoaW50KSkpLAorCQkJICAgICAgICJ4ZnNfYnVmX2l0ZW0iKTsKKwl4ZnNfZWZkX3pvbmUgPSBrbWVtX3pvbmVfaW5pdCgoc2l6ZW9mKHhmc19lZmRfbG9nX2l0ZW1fdCkgKworCQkJCSAgICAgICAoKFhGU19FRkRfTUFYX0ZBU1RfRVhURU5UUyAtIDEpICogc2l6ZW9mKHhmc19leHRlbnRfdCkpKSwKKwkJCQkgICAgICAieGZzX2VmZF9pdGVtIik7CisJeGZzX2VmaV96b25lID0ga21lbV96b25lX2luaXQoKHNpemVvZih4ZnNfZWZpX2xvZ19pdGVtX3QpICsKKwkJCQkgICAgICAgKChYRlNfRUZJX01BWF9GQVNUX0VYVEVOVFMgLSAxKSAqIHNpemVvZih4ZnNfZXh0ZW50X3QpKSksCisJCQkJICAgICAgInhmc19lZmlfaXRlbSIpOworCXhmc19pZm9ya196b25lID0ga21lbV96b25lX2luaXQoc2l6ZW9mKHhmc19pZm9ya190KSwgInhmc19pZm9yayIpOworCXhmc19pbGlfem9uZSA9IGttZW1fem9uZV9pbml0KHNpemVvZih4ZnNfaW5vZGVfbG9nX2l0ZW1fdCksICJ4ZnNfaWxpIik7CisJeGZzX2NoYXNobGlzdF96b25lID0ga21lbV96b25lX2luaXQoc2l6ZW9mKHhmc19jaGFzaGxpc3RfdCksCisJCQkJCSAgICAieGZzX2NoYXNobGlzdCIpOworCXhmc19hY2xfem9uZV9pbml0KHhmc19hY2xfem9uZSwgInhmc19hY2wiKTsKKworCS8qCisJICogQWxsb2NhdGUgZ2xvYmFsIHRyYWNlIGJ1ZmZlcnMuCisJICovCisjaWZkZWYgWEZTX0FMTE9DX1RSQUNFCisJeGZzX2FsbG9jX3RyYWNlX2J1ZiA9IGt0cmFjZV9hbGxvYyhYRlNfQUxMT0NfVFJBQ0VfU0laRSwgS01fU0xFRVApOworI2VuZGlmCisjaWZkZWYgWEZTX0JNQVBfVFJBQ0UKKwl4ZnNfYm1hcF90cmFjZV9idWYgPSBrdHJhY2VfYWxsb2MoWEZTX0JNQVBfVFJBQ0VfU0laRSwgS01fU0xFRVApOworI2VuZGlmCisjaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKwl4ZnNfYm1idF90cmFjZV9idWYgPSBrdHJhY2VfYWxsb2MoWEZTX0JNQlRfVFJBQ0VfU0laRSwgS01fU0xFRVApOworI2VuZGlmCisjaWZkZWYgWEZTX0RJUl9UUkFDRQorCXhmc19kaXJfdHJhY2VfYnVmID0ga3RyYWNlX2FsbG9jKFhGU19ESVJfVFJBQ0VfU0laRSwgS01fU0xFRVApOworI2VuZGlmCisjaWZkZWYgWEZTX0FUVFJfVFJBQ0UKKwl4ZnNfYXR0cl90cmFjZV9idWYgPSBrdHJhY2VfYWxsb2MoWEZTX0FUVFJfVFJBQ0VfU0laRSwgS01fU0xFRVApOworI2VuZGlmCisjaWZkZWYgWEZTX0RJUjJfVFJBQ0UKKwl4ZnNfZGlyMl90cmFjZV9idWYgPSBrdHJhY2VfYWxsb2MoWEZTX0RJUjJfR1RSQUNFX1NJWkUsIEtNX1NMRUVQKTsKKyNlbmRpZgorCisJeGZzX2Rpcl9zdGFydHVwKCk7CisKKyNpZiAoZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChJTkRVQ0VfSU9fRVJST1IpKQorCXhmc19lcnJvcl90ZXN0X2luaXQoKTsKKyNlbmRpZiAvKiBERUJVRyB8fCBJTkRVQ0VfSU9fRVJST1IgKi8KKworCXhmc19pbml0X3Byb2NmcygpOworCXhmc19zeXNjdGxfcmVnaXN0ZXIoKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZAoreGZzX2NsZWFudXAodm9pZCkKK3sKKwlleHRlcm4ga21lbV96b25lX3QJKnhmc19ibWFwX2ZyZWVfaXRlbV96b25lOworCWV4dGVybiBrbWVtX3pvbmVfdAkqeGZzX2J0cmVlX2N1cl96b25lOworCWV4dGVybiBrbWVtX3pvbmVfdAkqeGZzX2lub2RlX3pvbmU7CisJZXh0ZXJuIGttZW1fem9uZV90CSp4ZnNfdHJhbnNfem9uZTsKKwlleHRlcm4ga21lbV96b25lX3QJKnhmc19kYV9zdGF0ZV96b25lOworCWV4dGVybiBrbWVtX3pvbmVfdAkqeGZzX2RhYnVmX3pvbmU7CisJZXh0ZXJuIGttZW1fem9uZV90CSp4ZnNfZWZkX3pvbmU7CisJZXh0ZXJuIGttZW1fem9uZV90CSp4ZnNfZWZpX3pvbmU7CisJZXh0ZXJuIGttZW1fem9uZV90CSp4ZnNfYnVmX2l0ZW1fem9uZTsKKwlleHRlcm4ga21lbV96b25lX3QJKnhmc19jaGFzaGxpc3Rfem9uZTsKKworCXhmc19jbGVhbnVwX3Byb2NmcygpOworCXhmc19zeXNjdGxfdW5yZWdpc3RlcigpOworCXhmc19yZWZjYWNoZV9kZXN0cm95KCk7CisJeGZzX2FjbF96b25lX2Rlc3Ryb3koeGZzX2FjbF96b25lKTsKKworI2lmZGVmIFhGU19ESVIyX1RSQUNFCisJa3RyYWNlX2ZyZWUoeGZzX2RpcjJfdHJhY2VfYnVmKTsKKyNlbmRpZgorI2lmZGVmIFhGU19BVFRSX1RSQUNFCisJa3RyYWNlX2ZyZWUoeGZzX2F0dHJfdHJhY2VfYnVmKTsKKyNlbmRpZgorI2lmZGVmIFhGU19ESVJfVFJBQ0UKKwlrdHJhY2VfZnJlZSh4ZnNfZGlyX3RyYWNlX2J1Zik7CisjZW5kaWYKKyNpZmRlZiBYRlNfQk1CVF9UUkFDRQorCWt0cmFjZV9mcmVlKHhmc19ibWJ0X3RyYWNlX2J1Zik7CisjZW5kaWYKKyNpZmRlZiBYRlNfQk1BUF9UUkFDRQorCWt0cmFjZV9mcmVlKHhmc19ibWFwX3RyYWNlX2J1Zik7CisjZW5kaWYKKyNpZmRlZiBYRlNfQUxMT0NfVFJBQ0UKKwlrdHJhY2VfZnJlZSh4ZnNfYWxsb2NfdHJhY2VfYnVmKTsKKyNlbmRpZgorCisJa21lbV9jYWNoZV9kZXN0cm95KHhmc19ibWFwX2ZyZWVfaXRlbV96b25lKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koeGZzX2J0cmVlX2N1cl96b25lKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koeGZzX2lub2RlX3pvbmUpOworCWttZW1fY2FjaGVfZGVzdHJveSh4ZnNfdHJhbnNfem9uZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KHhmc19kYV9zdGF0ZV96b25lKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koeGZzX2RhYnVmX3pvbmUpOworCWttZW1fY2FjaGVfZGVzdHJveSh4ZnNfYnVmX2l0ZW1fem9uZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KHhmc19lZmRfem9uZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KHhmc19lZmlfem9uZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KHhmc19pZm9ya196b25lKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koeGZzX2lsaV96b25lKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koeGZzX2NoYXNobGlzdF96b25lKTsKK30KKworLyoKKyAqIHhmc19zdGFydF9mbGFncworICoKKyAqIFRoaXMgZnVuY3Rpb24gZmlsbHMgaW4geGZzX21vdW50X3QgZmllbGRzIGJhc2VkIG9uIG1vdW50IGFyZ3MuCisgKiBOb3RlOiB0aGUgc3VwZXJibG9jayBoYXMgX25vdF8geWV0IGJlZW4gcmVhZCBpbi4KKyAqLworU1RBVElDIGludAoreGZzX3N0YXJ0X2ZsYWdzKAorCXN0cnVjdCB2ZnMJCSp2ZnMsCisJc3RydWN0IHhmc19tb3VudF9hcmdzCSphcCwKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCkKK3sKKwkvKiBWYWx1ZXMgYXJlIGluIEJCcyAqLworCWlmICgoYXAtPmZsYWdzICYgWEZTTU5UX05PQUxJR04pICE9IFhGU01OVF9OT0FMSUdOKSB7CisJCS8qCisJCSAqIEF0IHRoaXMgcG9pbnQgdGhlIHN1cGVyYmxvY2sgaGFzIG5vdCBiZWVuIHJlYWQKKwkJICogaW4sIHRoZXJlZm9yZSB3ZSBkbyBub3Qga25vdyB0aGUgYmxvY2sgc2l6ZS4KKwkJICogQmVmb3JlIHRoZSBtb3VudCBjYWxsIGVuZHMgd2Ugd2lsbCBjb252ZXJ0CisJCSAqIHRoZXNlIHRvIEZTQnMuCisJCSAqLworCQltcC0+bV9kYWxpZ24gPSBhcC0+c3VuaXQ7CisJCW1wLT5tX3N3aWR0aCA9IGFwLT5zd2lkdGg7CisJfQorCisJaWYgKGFwLT5sb2didWZzICE9IC0xICYmCisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChYTE9HX05PTE9HKQorCSAgICBhcC0+bG9nYnVmcyAhPSAwICYmCisjZW5kaWYKKwkgICAgKGFwLT5sb2didWZzIDwgWExPR19NSU5fSUNMT0dTIHx8CisJICAgICBhcC0+bG9nYnVmcyA+IFhMT0dfTUFYX0lDTE9HUykpIHsKKwkJY21uX2VycihDRV9XQVJOLAorCQkJIlhGUzogaW52YWxpZCBsb2didWZzIHZhbHVlOiAlZCBbbm90ICVkLSVkXSIsCisJCQlhcC0+bG9nYnVmcywgWExPR19NSU5fSUNMT0dTLCBYTE9HX01BWF9JQ0xPR1MpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJfQorCW1wLT5tX2xvZ2J1ZnMgPSBhcC0+bG9nYnVmczsKKwlpZiAoYXAtPmxvZ2J1ZnNpemUgIT0gLTEgJiYKKwkgICAgYXAtPmxvZ2J1ZnNpemUgIT0gMTYgKiAxMDI0ICYmCisJICAgIGFwLT5sb2didWZzaXplICE9IDMyICogMTAyNCAmJgorCSAgICBhcC0+bG9nYnVmc2l6ZSAhPSA2NCAqIDEwMjQgJiYKKwkgICAgYXAtPmxvZ2J1ZnNpemUgIT0gMTI4ICogMTAyNCAmJgorCSAgICBhcC0+bG9nYnVmc2l6ZSAhPSAyNTYgKiAxMDI0KSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkiWEZTOiBpbnZhbGlkIGxvZ2J1ZnNpemU6ICVkIFtub3QgMTZrLDMyayw2NGssMTI4ayBvciAyNTZrXSIsCisJCQlhcC0+bG9nYnVmc2l6ZSk7CisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwl9CisJbXAtPm1faWhzaXplID0gYXAtPmloYXNoc2l6ZTsKKwltcC0+bV9sb2dic2l6ZSA9IGFwLT5sb2didWZzaXplOworCW1wLT5tX2ZzbmFtZV9sZW4gPSBzdHJsZW4oYXAtPmZzbmFtZSkgKyAxOworCW1wLT5tX2ZzbmFtZSA9IGttZW1fYWxsb2MobXAtPm1fZnNuYW1lX2xlbiwgS01fU0xFRVApOworCXN0cmNweShtcC0+bV9mc25hbWUsIGFwLT5mc25hbWUpOworCisJaWYgKGFwLT5mbGFncyAmIFhGU01OVF9XU1lOQykKKwkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX1dTWU5DOworI2lmIFhGU19CSUdfSU5VTVMKKwlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX0lOTzY0KSB7CisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9JTk82NDsKKwkJbXAtPm1faW5vYWRkID0gWEZTX0lOTzY0X09GRlNFVDsKKwl9CisjZW5kaWYKKwlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX05PQVRJTUUpCisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9OT0FUSU1FOworCisJaWYgKGFwLT5mbGFncyAmIFhGU01OVF9SRVRFUlIpCisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9SRVRFUlI7CisKKwlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX05PQUxJR04pCisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9OT0FMSUdOOworCisJaWYgKGFwLT5mbGFncyAmIFhGU01OVF9TV0FMTE9DKQorCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfU1dBTExPQzsKKworCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfT1NZTkNJU09TWU5DKQorCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfT1NZTkNJU09TWU5DOworCisJaWYgKGFwLT5mbGFncyAmIFhGU01OVF8zMkJJVElOT0RFUykKKwkJbXAtPm1fZmxhZ3MgfD0gKFhGU19NT1VOVF8zMkJJVElOT0RFUyB8IFhGU19NT1VOVF8zMkJJVElOT09QVCk7CisKKwlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX0lPU0laRSkgeworCQlpZiAoYXAtPmlvc2l6ZWxvZyA+IFhGU19NQVhfSU9fTE9HIHx8CisJCSAgICBhcC0+aW9zaXplbG9nIDwgWEZTX01JTl9JT19MT0cpIHsKKwkJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJIlhGUzogaW52YWxpZCBsb2cgaW9zaXplOiAlZCBbbm90ICVkLSVkXSIsCisJCQkJYXAtPmlvc2l6ZWxvZywgWEZTX01JTl9JT19MT0csCisJCQkJWEZTX01BWF9JT19MT0cpOworCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCQl9CisKKwkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0RGTFRfSU9TSVpFOworCQltcC0+bV9yZWFkaW9fbG9nID0gbXAtPm1fd3JpdGVpb19sb2cgPSBhcC0+aW9zaXplbG9nOworCX0KKworCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfSUhBU0hTSVpFKQorCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfSUhBU0hTSVpFOworCisJaWYgKGFwLT5mbGFncyAmIFhGU01OVF9JREVMRVRFKQorCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfSURFTEVURTsKKworCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfRElSU1lOQykKKwkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0RJUlNZTkM7CisKKwkvKgorCSAqIG5vIHJlY292ZXJ5IGZsYWcgcmVxdWlyZXMgYSByZWFkLW9ubHkgbW91bnQKKwkgKi8KKwlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX05PUkVDT1ZFUlkpIHsKKwkJaWYgKCEodmZzLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpKSB7CisJCQljbW5fZXJyKENFX1dBUk4sCisJIlhGUzogdHJpZWQgdG8gbW91bnQgYSBGUyByZWFkLXdyaXRlIHdpdGhvdXQgcmVjb3ZlcnkhIik7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJCX0KKwkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX05PUkVDT1ZFUlk7CisJfQorCisJaWYgKGFwLT5mbGFncyAmIFhGU01OVF9OT1VVSUQpCisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9OT1VVSUQ7CisJaWYgKGFwLT5mbGFncyAmIFhGU01OVF9OT0xPR0ZMVVNIKQorCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfTk9MT0dGTFVTSDsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBmaWxscyBpbiB4ZnNfbW91bnRfdCBmaWVsZHMgYmFzZWQgb24gbW91bnQgYXJncy4KKyAqIE5vdGU6IHRoZSBzdXBlcmJsb2NrIF9oYXNfIG5vdyBiZWVuIHJlYWQgaW4uCisgKi8KK1NUQVRJQyBpbnQKK3hmc19maW5pc2hfZmxhZ3MoCisJc3RydWN0IHZmcwkJKnZmcywKKwlzdHJ1Y3QgeGZzX21vdW50X2FyZ3MJKmFwLAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wKQoreworCWludAkJCXJvbmx5ID0gKHZmcy0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKTsKKworCS8qIEZhaWwgYSBtb3VudCB3aGVyZSB0aGUgbG9nYnVmIGlzIHNtYWxsZXIgdGhlbiB0aGUgbG9nIHN0cmlwZSAqLworCWlmIChYRlNfU0JfVkVSU0lPTl9IQVNMT0dWMigmbXAtPm1fc2IpKSB7CisJCWlmICgoYXAtPmxvZ2J1ZnNpemUgPT0gLTEpICYmCisJCSAgICAobXAtPm1fc2Iuc2JfbG9nc3VuaXQgPiBYTE9HX0JJR19SRUNPUkRfQlNJWkUpKSB7CisJCQltcC0+bV9sb2dic2l6ZSA9IG1wLT5tX3NiLnNiX2xvZ3N1bml0OworCQl9IGVsc2UgaWYgKGFwLT5sb2didWZzaXplIDwgbXAtPm1fc2Iuc2JfbG9nc3VuaXQpIHsKKwkJCWNtbl9lcnIoQ0VfV0FSTiwKKwkiWEZTOiBsb2didWYgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBsb2cgc3RyaXBlIHNpemUiKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEZhaWwgYSBtb3VudCBpZiB0aGUgbG9nYnVmIGlzIGxhcmdlciB0aGFuIDMySyAqLworCQlpZiAoYXAtPmxvZ2J1ZnNpemUgPiBYTE9HX0JJR19SRUNPUkRfQlNJWkUpIHsKKwkJCWNtbl9lcnIoQ0VfV0FSTiwKKwkiWEZTOiBsb2didWYgc2l6ZSBmb3IgdmVyc2lvbiAxIGxvZ3MgbXVzdCBiZSAxNksgb3IgMzJLIik7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJCX0KKwl9CisKKwkvKgorCSAqIHByb2hpYml0IHIvdyBtb3VudHMgb2YgcmVhZC1vbmx5IGZpbGVzeXN0ZW1zCisJICovCisJaWYgKChtcC0+bV9zYi5zYl9mbGFncyAmIFhGU19TQkZfUkVBRE9OTFkpICYmICFyb25seSkgeworCQljbW5fZXJyKENFX1dBUk4sCisJIlhGUzogY2Fubm90IG1vdW50IGEgcmVhZC1vbmx5IGZpbGVzeXN0ZW0gYXMgcmVhZC13cml0ZSIpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVST0ZTKTsKKwl9CisKKwkvKgorCSAqIGRpc2FsbG93IG1vdW50IGF0dGVtcHRzIHdpdGggKElSSVgpIHByb2plY3QgcXVvdGEgZW5hYmxlZAorCSAqLworCWlmIChYRlNfU0JfVkVSU0lPTl9IQVNRVU9UQSgmbXAtPm1fc2IpICYmCisJICAgIChtcC0+bV9zYi5zYl9xZmxhZ3MgJiBYRlNfUFFVT1RBX0FDQ1QpKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkiWEZTOiBjYW5ub3QgbW91bnQgYSBmaWxlc3lzdGVtIHdpdGggSVJJWCBwcm9qZWN0IHF1b3RhIGVuYWJsZWQiKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFTk9TWVMpOworCX0KKworCS8qCisJICogY2hlY2sgZm9yIHNoYXJlZCBtb3VudC4KKwkgKi8KKwlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX1NIQVJFRCkgeworCQlpZiAoIVhGU19TQl9WRVJTSU9OX0hBU1NIQVJFRCgmbXAtPm1fc2IpKQorCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCisJCS8qCisJCSAqIEZvciBJUklYIDYuNSwgc2hhcmVkIG1vdW50cyBtdXN0IGhhdmUgdGhlIHNoYXJlZAorCQkgKiB2ZXJzaW9uIGJpdCBzZXQsIGhhdmUgdGhlIHBlcnNpc3RlbnQgcmVhZG9ubHkKKwkJICogZmllbGQgc2V0LCBtdXN0IGJlIHZlcnNpb24gMCBhbmQgY2FuIG9ubHkgYmUgbW91bnRlZAorCQkgKiByZWFkLW9ubHkuCisJCSAqLworCQlpZiAoIXJvbmx5IHx8ICEobXAtPm1fc2Iuc2JfZmxhZ3MgJiBYRlNfU0JGX1JFQURPTkxZKSB8fAorCQkgICAgIChtcC0+bV9zYi5zYl9zaGFyZWRfdm4gIT0gMCkpCisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisKKwkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX1NIQVJFRDsKKworCQkvKgorCQkgKiBTaGFyZWQgWEZTIFYwIGNhbid0IGRlYWwgd2l0aCBETUkuICBSZXR1cm4gRUlOVkFMLgorCQkgKi8KKwkJaWYgKG1wLT5tX3NiLnNiX3NoYXJlZF92biA9PSAwICYmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfRE1BUEkpKQorCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogeGZzX21vdW50CisgKgorICogVGhlIGZpbGUgc3lzdGVtIGNvbmZpZ3VyYXRpb25zIGFyZToKKyAqCSgxKSBkZXZpY2UgKHBhcnRpdGlvbikgd2l0aCBkYXRhIGFuZCBpbnRlcm5hbCBsb2cKKyAqCSgyKSBsb2dpY2FsIHZvbHVtZSB3aXRoIGRhdGEgYW5kIGxvZyBzdWJ2b2x1bWVzLgorICoJKDMpIGxvZ2ljYWwgdm9sdW1lIHdpdGggZGF0YSwgbG9nLCBhbmQgcmVhbHRpbWUgc3Vidm9sdW1lcy4KKyAqCisgKiBXZSBvbmx5IGhhdmUgdG8gaGFuZGxlIG9wZW5pbmcgdGhlIGxvZyBhbmQgcmVhbHRpbWUgdm9sdW1lcyBoZXJlIGlmCisgKiB0aGV5IGFyZSBwcmVzZW50LiAgVGhlIGRhdGEgc3Vidm9sdW1lIGhhcyBhbHJlYWR5IGJlZW4gb3BlbmVkIGJ5CisgKiBnZXRfc2JfYmRldigpIGFuZCBpcyBzdG9yZWQgaW4gdmZzcC0+dmZzX3N1cGVyLT5zX2JkZXYuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19tb3VudCgKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpiaHZwLAorCXN0cnVjdCB4ZnNfbW91bnRfYXJncwkqYXJncywKKwljcmVkX3QJCQkqY3JlZHApCit7CisJc3RydWN0IHZmcwkJKnZmc3AgPSBiaHZ0b3ZmcyhiaHZwKTsKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpwOworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gWEZTX0JIVlRPTShiaHZwKTsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlCSpkZGV2LCAqbG9nZGV2LCAqcnRkZXY7CisJaW50CQkJZmxhZ3MgPSAwLCBlcnJvcjsKKworCWRkZXYgPSB2ZnNwLT52ZnNfc3VwZXItPnNfYmRldjsKKwlsb2dkZXYgPSBydGRldiA9IE5VTEw7CisKKwkvKgorCSAqIFNldHVwIHhmc19tb3VudCBmdW5jdGlvbiB2ZWN0b3JzIGZyb20gYXZhaWxhYmxlIGJlaGF2aW9ycworCSAqLworCXAgPSB2ZnNfYmh2X2xvb2t1cCh2ZnNwLCBWRlNfUE9TSVRJT05fRE0pOworCW1wLT5tX2RtX29wcyA9IHAgPyAqKHhmc19kbW9wc190ICopIHZmc19iaHZfY3VzdG9tKHApIDogeGZzX2RtY29yZV9zdHViOworCXAgPSB2ZnNfYmh2X2xvb2t1cCh2ZnNwLCBWRlNfUE9TSVRJT05fUU0pOworCW1wLT5tX3FtX29wcyA9IHAgPyAqKHhmc19xbW9wc190ICopIHZmc19iaHZfY3VzdG9tKHApIDogeGZzX3FtY29yZV9zdHViOworCXAgPSB2ZnNfYmh2X2xvb2t1cCh2ZnNwLCBWRlNfUE9TSVRJT05fSU8pOworCW1wLT5tX2lvX29wcyA9IHAgPyAqKHhmc19pb29wc190ICopIHZmc19iaHZfY3VzdG9tKHApIDogeGZzX2lvY29yZV94ZnM7CisKKwkvKgorCSAqIE9wZW4gcmVhbCB0aW1lIGFuZCBsb2cgZGV2aWNlcyAtIG9yZGVyIGlzIGltcG9ydGFudC4KKwkgKi8KKwlpZiAoYXJncy0+bG9nbmFtZVswXSkgeworCQllcnJvciA9IHhmc19ibGtkZXZfZ2V0KG1wLCBhcmdzLT5sb2duYW1lLCAmbG9nZGV2KTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCX0KKwlpZiAoYXJncy0+cnRuYW1lWzBdKSB7CisJCWVycm9yID0geGZzX2Jsa2Rldl9nZXQobXAsIGFyZ3MtPnJ0bmFtZSwgJnJ0ZGV2KTsKKwkJaWYgKGVycm9yKSB7CisJCQl4ZnNfYmxrZGV2X3B1dChsb2dkZXYpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisKKwkJaWYgKHJ0ZGV2ID09IGRkZXYgfHwgcnRkZXYgPT0gbG9nZGV2KSB7CisJCQljbW5fZXJyKENFX1dBUk4sCisJIlhGUzogQ2Fubm90IG1vdW50IGZpbGVzeXN0ZW0gd2l0aCBpZGVudGljYWwgcnRkZXYgYW5kIGRkZXYvbG9nZGV2LiIpOworCQkJeGZzX2Jsa2Rldl9wdXQobG9nZGV2KTsKKwkJCXhmc19ibGtkZXZfcHV0KHJ0ZGV2KTsKKwkJCXJldHVybiBFSU5WQUw7CisJCX0KKwl9CisKKwkvKgorCSAqIFNldHVwIHhmc19tb3VudCBidWZmZXIgdGFyZ2V0IHBvaW50ZXJzCisJICovCisJZXJyb3IgPSBFTk9NRU07CisJbXAtPm1fZGRldl90YXJncCA9IHhmc19hbGxvY19idWZ0YXJnKGRkZXYsIDApOworCWlmICghbXAtPm1fZGRldl90YXJncCkgeworCQl4ZnNfYmxrZGV2X3B1dChsb2dkZXYpOworCQl4ZnNfYmxrZGV2X3B1dChydGRldik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJaWYgKHJ0ZGV2KSB7CisJCW1wLT5tX3J0ZGV2X3RhcmdwID0geGZzX2FsbG9jX2J1ZnRhcmcocnRkZXYsIDEpOworCQlpZiAoIW1wLT5tX3J0ZGV2X3RhcmdwKQorCQkJZ290byBlcnJvcjA7CisJfQorCW1wLT5tX2xvZ2Rldl90YXJncCA9IChsb2dkZXYgJiYgbG9nZGV2ICE9IGRkZXYpID8KKwkJCQl4ZnNfYWxsb2NfYnVmdGFyZyhsb2dkZXYsIDEpIDogbXAtPm1fZGRldl90YXJncDsKKwlpZiAoIW1wLT5tX2xvZ2Rldl90YXJncCkKKwkJZ290byBlcnJvcjA7CisKKwkvKgorCSAqIFNldHVwIGZsYWdzIGJhc2VkIG9uIG1vdW50KDIpIG9wdGlvbnMgYW5kIHRoZW4gdGhlIHN1cGVyYmxvY2sKKwkgKi8KKwllcnJvciA9IHhmc19zdGFydF9mbGFncyh2ZnNwLCBhcmdzLCBtcCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yMTsKKwllcnJvciA9IHhmc19yZWFkc2IobXApOworCWlmIChlcnJvcikKKwkJZ290byBlcnJvcjE7CisJZXJyb3IgPSB4ZnNfZmluaXNoX2ZsYWdzKHZmc3AsIGFyZ3MsIG1wKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3IyOworCisJLyoKKwkgKiBTZXR1cCB4ZnNfbW91bnQgYnVmZmVyIHRhcmdldCBwb2ludGVycyBiYXNlZCBvbiBzdXBlcmJsb2NrCisJICovCisJZXJyb3IgPSB4ZnNfc2V0c2l6ZV9idWZ0YXJnKG1wLT5tX2RkZXZfdGFyZ3AsIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwKKwkJCQkgICAgbXAtPm1fc2Iuc2Jfc2VjdHNpemUpOworCWlmICghZXJyb3IgJiYgbG9nZGV2ICYmIGxvZ2RldiAhPSBkZGV2KSB7CisJCXVuc2lnbmVkIGludAlsb2dfc2VjdG9yX3NpemUgPSBCQlNJWkU7CisKKwkJaWYgKFhGU19TQl9WRVJTSU9OX0hBU1NFQ1RPUigmbXAtPm1fc2IpKQorCQkJbG9nX3NlY3Rvcl9zaXplID0gbXAtPm1fc2Iuc2JfbG9nc2VjdHNpemU7CisJCWVycm9yID0geGZzX3NldHNpemVfYnVmdGFyZyhtcC0+bV9sb2dkZXZfdGFyZ3AsCisJCQkJCSAgICBtcC0+bV9zYi5zYl9ibG9ja3NpemUsCisJCQkJCSAgICBsb2dfc2VjdG9yX3NpemUpOworCX0KKwlpZiAoIWVycm9yICYmIHJ0ZGV2KQorCQllcnJvciA9IHhmc19zZXRzaXplX2J1ZnRhcmcobXAtPm1fcnRkZXZfdGFyZ3AsCisJCQkJCSAgICBtcC0+bV9zYi5zYl9ibG9ja3NpemUsCisJCQkJCSAgICBtcC0+bV9zYi5zYl9zZWN0c2l6ZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yMjsKKworCWVycm9yID0gWEZTX0lPSU5JVCh2ZnNwLCBhcmdzLCBmbGFncyk7CisJaWYgKCFlcnJvcikKKwkJcmV0dXJuIDA7CitlcnJvcjI6CisJaWYgKG1wLT5tX3NiX2JwKQorCQl4ZnNfZnJlZXNiKG1wKTsKK2Vycm9yMToKKwl4ZnNfYmludmFsKG1wLT5tX2RkZXZfdGFyZ3ApOworCWlmIChsb2dkZXYgJiYgbG9nZGV2ICE9IGRkZXYpCisJCXhmc19iaW52YWwobXAtPm1fbG9nZGV2X3RhcmdwKTsKKwlpZiAocnRkZXYpCisJCXhmc19iaW52YWwobXAtPm1fcnRkZXZfdGFyZ3ApOworZXJyb3IwOgorCXhmc191bm1vdW50ZnNfY2xvc2UobXAsIGNyZWRwKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK1NUQVRJQyBpbnQKK3hmc191bm1vdW50KAorCWJodl9kZXNjX3QJKmJkcCwKKwlpbnQJCWZsYWdzLAorCWNyZWRfdAkJKmNyZWRwKQoreworCXN0cnVjdCB2ZnMJKnZmc3AgPSBiaHZ0b3ZmcyhiZHApOworCXhmc19tb3VudF90CSptcCA9IFhGU19CSFZUT00oYmRwKTsKKwl4ZnNfaW5vZGVfdAkqcmlwOworCXZub2RlX3QJCSpydnA7CisJaW50CQl1bm1vdW50X2V2ZW50X3dhbnRlZCA9IDA7CisJaW50CQl1bm1vdW50X2V2ZW50X2ZsYWdzID0gMDsKKwlpbnQJCXhmc191bm1vdW50ZnNfbmVlZGVkID0gMDsKKwlpbnQJCWVycm9yOworCisJcmlwID0gbXAtPm1fcm9vdGlwOworCXJ2cCA9IFhGU19JVE9WKHJpcCk7CisKKwlpZiAodmZzcC0+dmZzX2ZsYWcgJiBWRlNfRE1JKSB7CisJCWVycm9yID0gWEZTX1NFTkRfUFJFVU5NT1VOVChtcCwgdmZzcCwKKwkJCQlydnAsIERNX1JJR0hUX05VTEwsIHJ2cCwgRE1fUklHSFRfTlVMTCwKKwkJCQlOVUxMLCBOVUxMLCAwLCAwLAorCQkJCShtcC0+bV9kbWV2bWFzayAmICgxPDxETV9FVkVOVF9QUkVVTk1PVU5UKSk/CisJCQkJCTA6RE1fRkxBR1NfVU5XQU5URUQpOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworCQl1bm1vdW50X2V2ZW50X3dhbnRlZCA9IDE7CisJCXVubW91bnRfZXZlbnRfZmxhZ3MgPSAobXAtPm1fZG1ldm1hc2sgJiAoMTw8RE1fRVZFTlRfVU5NT1VOVCkpPworCQkJCQkwIDogRE1fRkxBR1NfVU5XQU5URUQ7CisJfQorCisJLyoKKwkgKiBGaXJzdCBibG93IGFueSByZWZlcmVuY2VkIGlub2RlIGZyb20gdGhpcyBmaWxlIHN5c3RlbQorCSAqIG91dCBvZiB0aGUgcmVmZXJlbmNlIGNhY2hlLCBhbmQgZGVsZXRlIHRoZSB0aW1lci4KKwkgKi8KKwl4ZnNfcmVmY2FjaGVfcHVyZ2VfbXAobXApOworCisJWEZTX2JmbHVzaChtcC0+bV9kZGV2X3RhcmdwKTsKKwllcnJvciA9IHhmc191bm1vdW50X2ZsdXNoKG1wLCAwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJQVNTRVJUKHZuX2NvdW50KHJ2cCkgPT0gMSk7CisKKwkvKgorCSAqIERyb3AgdGhlIHJlZmVyZW5jZSBjb3VudAorCSAqLworCVZOX1JFTEUocnZwKTsKKworCS8qCisJICogSWYgd2UncmUgZm9yY2luZyBhIHNodXRkb3duLCB0eXBpY2FsbHkgYmVjYXVzZSBvZiBhIG1lZGlhIGVycm9yLAorCSAqIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGludmFsaWRhdGUgZGlydHkgcGFnZXMgdGhhdCBiZWxvbmcgdG8KKwkgKiByZWZlcmVuY2VkIHZub2RlcyBhcyB3ZWxsLgorCSAqLworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgeworCQllcnJvciA9IHhmc19zeW5jKCZtcC0+bV9iaHYsCisJCQkgKFNZTkNfV0FJVCB8IFNZTkNfQ0xPU0UpLCBjcmVkcCk7CisJCUFTU0VSVChlcnJvciAhPSBFRlNDT1JSVVBURUQpOworCX0KKwl4ZnNfdW5tb3VudGZzX25lZWRlZCA9IDE7CisKK291dDoKKwkvKglTZW5kIERNQVBJIGV2ZW50LCBpZiByZXF1aXJlZC4KKwkgKglUaGVuIGRvIHhmc191bm1vdW50ZnMoKSBpZiBuZWVkZWQuCisJICoJVGhlbiByZXR1cm4gZXJyb3IgKG9yIHplcm8pLgorCSAqLworCWlmICh1bm1vdW50X2V2ZW50X3dhbnRlZCkgeworCQkvKiBOb3RlOiBtcCBzdHJ1Y3R1cmUgbXVzdCBzdGlsbCBleGlzdCBmb3IKKwkJICogWEZTX1NFTkRfVU5NT1VOVCgpIGNhbGwuCisJCSAqLworCQlYRlNfU0VORF9VTk1PVU5UKG1wLCB2ZnNwLCBlcnJvciA9PSAwID8gcnZwIDogTlVMTCwKKwkJCURNX1JJR0hUX05VTEwsIDAsIGVycm9yLCB1bm1vdW50X2V2ZW50X2ZsYWdzKTsKKwl9CisJaWYgKHhmc191bm1vdW50ZnNfbmVlZGVkKSB7CisJCS8qCisJCSAqIENhbGwgY29tbW9uIHVubW91bnQgZnVuY3Rpb24gdG8gZmx1c2ggdG8gZGlzaworCQkgKiBhbmQgZnJlZSB0aGUgc3VwZXIgYmxvY2sgYnVmZmVyICYgbW91bnQgc3RydWN0dXJlcy4KKwkJICovCisJCXhmc191bm1vdW50ZnMobXAsIGNyZWRwKTsKKwl9CisKKwlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKK30KKworI2RlZmluZSBSRU1PVU5UX1JFQURPTkxZX0ZMQUdTCShTWU5DX1JFTU9VTlR8U1lOQ19BVFRSfFNZTkNfV0FJVCkKKworU1RBVElDIGludAoreGZzX21udHVwZGF0ZSgKKwliaHZfZGVzY190CQkJKmJkcCwKKwlpbnQJCQkJKmZsYWdzLAorCXN0cnVjdCB4ZnNfbW91bnRfYXJncwkJKmFyZ3MpCit7CisJc3RydWN0IHZmcwkqdmZzcCA9IGJodnRvdmZzKGJkcCk7CisJeGZzX21vdW50X3QJKm1wID0gWEZTX0JIVlRPTShiZHApOworCWludAkJcGluY291bnQsIGVycm9yOworCWludAkJY291bnQgPSAwOworCisJaWYgKGFyZ3MtPmZsYWdzICYgWEZTTU5UX05PQVRJTUUpCisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9OT0FUSU1FOworCWVsc2UKKwkJbXAtPm1fZmxhZ3MgJj0gflhGU19NT1VOVF9OT0FUSU1FOworCisJaWYgKCEodmZzcC0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKSkgeworCQlWRlNfU1lOQyh2ZnNwLCBTWU5DX0ZTREFUQXxTWU5DX0JERkxVU0h8U1lOQ19BVFRSLCBOVUxMLCBlcnJvcik7CisJfQorCisJaWYgKCpmbGFncyAmIE1TX1JET05MWSkgeworCQl4ZnNfcmVmY2FjaGVfcHVyZ2VfbXAobXApOworCQl4ZnNfZmx1c2hfYnVmdGFyZyhtcC0+bV9kZGV2X3RhcmdwLCAwKTsKKwkJeGZzX2ZpbmlzaF9yZWNsYWltX2FsbChtcCwgMCk7CisKKwkJLyogVGhpcyBsb29wIG11c3QgcnVuIGF0IGxlYXN0IHR3aWNlLgorCQkgKiBUaGUgZmlyc3QgaW5zdGFuY2Ugb2YgdGhlIGxvb3Agd2lsbCBmbHVzaAorCQkgKiBtb3N0IG1ldGEgZGF0YSBidXQgdGhhdCB3aWxsIGdlbmVyYXRlIG1vcmUKKwkJICogbWV0YSBkYXRhICh0eXBpY2FsbHkgZGlyZWN0b3J5IHVwZGF0ZXMpLgorCQkgKiBXaGljaCB0aGVuIG11c3QgYmUgZmx1c2hlZCBhbmQgbG9nZ2VkIGJlZm9yZQorCQkgKiB3ZSBjYW4gd3JpdGUgdGhlIHVubW91bnQgcmVjb3JkLgorCQkgKi8gCisJCWRvIHsKKwkJCVZGU19TWU5DKHZmc3AsIFJFTU9VTlRfUkVBRE9OTFlfRkxBR1MsIE5VTEwsIGVycm9yKTsKKwkJCXBpbmNvdW50ID0geGZzX2ZsdXNoX2J1ZnRhcmcobXAtPm1fZGRldl90YXJncCwgMSk7CisJCQlpZiAoIXBpbmNvdW50KSB7CisJCQkJZGVsYXkoNTApOworCQkJCWNvdW50Kys7CisJCQl9CisJCX0gd2hpbGUgKGNvdW50IDwgMik7CisKKwkJLyogT2sgbm93IHdyaXRlIG91dCBhbiB1bm1vdW50IHJlY29yZCAqLworCQl4ZnNfbG9nX3VubW91bnRfd3JpdGUobXApOworCQl4ZnNfdW5tb3VudGZzX3dyaXRlc2IobXApOworCQl2ZnNwLT52ZnNfZmxhZyB8PSBWRlNfUkRPTkxZOworCX0gZWxzZSB7CisJCXZmc3AtPnZmc19mbGFnICY9IH5WRlNfUkRPTkxZOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogeGZzX3VubW91bnRfZmx1c2ggaW1wbGVtZW50cyBhIHNldCBvZiBmbHVzaCBvcGVyYXRpb24gb24gc3BlY2lhbAorICogaW5vZGVzLCB3aGljaCBhcmUgbmVlZGVkIGFzIGEgc2VwYXJhdGUgc2V0IG9mIG9wZXJhdGlvbnMgc28gdGhhdAorICogdGhleSBjYW4gYmUgY2FsbGVkIGFzIHBhcnQgb2YgcmVsb2NhdGlvbiBwcm9jZXNzLgorICovCitpbnQKK3hmc191bm1vdW50X2ZsdXNoKAorCXhmc19tb3VudF90CSptcCwJCS8qIE1vdW50IHN0cnVjdHVyZSB3ZSBhcmUgZ2V0dGluZworCQkJCQkgICByaWQgb2YuICovCisJaW50ICAgICAgICAgICAgIHJlbG9jYXRpb24pCS8qIENhbGxlZCBmcm9tIHZmcyByZWxvY2F0aW9uLiAqLworeworCXhmc19pbm9kZV90CSpyaXAgPSBtcC0+bV9yb290aXA7CisJeGZzX2lub2RlX3QJKnJibWlwOworCXhmc19pbm9kZV90CSpyc3VtaXAgPSBOVUxMOworCXZub2RlX3QJCSpydnAgPSBYRlNfSVRPVihyaXApOworCWludAkJZXJyb3I7CisKKwl4ZnNfaWxvY2socmlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX2lmbG9jayhyaXApOworCisJLyoKKwkgKiBGbHVzaCBvdXQgdGhlIHJlYWwgdGltZSBpbm9kZXMuCisJICovCisJaWYgKChyYm1pcCA9IG1wLT5tX3JibWlwKSAhPSBOVUxMKSB7CisJCXhmc19pbG9jayhyYm1pcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl4ZnNfaWZsb2NrKHJibWlwKTsKKwkJZXJyb3IgPSB4ZnNfaWZsdXNoKHJibWlwLCBYRlNfSUZMVVNIX1NZTkMpOworCQl4ZnNfaXVubG9jayhyYm1pcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJCWlmIChlcnJvciA9PSBFRlNDT1JSVVBURUQpCisJCQlnb3RvIGZzY29ycnVwdF9vdXQ7CisKKwkJQVNTRVJUKHZuX2NvdW50KFhGU19JVE9WKHJibWlwKSkgPT0gMSk7CisKKwkJcnN1bWlwID0gbXAtPm1fcnN1bWlwOworCQl4ZnNfaWxvY2socnN1bWlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCXhmc19pZmxvY2socnN1bWlwKTsKKwkJZXJyb3IgPSB4ZnNfaWZsdXNoKHJzdW1pcCwgWEZTX0lGTFVTSF9TWU5DKTsKKwkJeGZzX2l1bmxvY2socnN1bWlwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwkJaWYgKGVycm9yID09IEVGU0NPUlJVUFRFRCkKKwkJCWdvdG8gZnNjb3JydXB0X291dDsKKworCQlBU1NFUlQodm5fY291bnQoWEZTX0lUT1YocnN1bWlwKSkgPT0gMSk7CisJfQorCisJLyoKKwkgKiBTeW5jaHJvbm91c2x5IGZsdXNoIHJvb3QgaW5vZGUgdG8gZGlzaworCSAqLworCWVycm9yID0geGZzX2lmbHVzaChyaXAsIFhGU19JRkxVU0hfU1lOQyk7CisJaWYgKGVycm9yID09IEVGU0NPUlJVUFRFRCkKKwkJZ290byBmc2NvcnJ1cHRfb3V0MjsKKworCWlmICh2bl9jb3VudChydnApICE9IDEgJiYgIXJlbG9jYXRpb24pIHsKKwkJeGZzX2l1bmxvY2socmlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCXJldHVybiBYRlNfRVJST1IoRUJVU1kpOworCX0KKworCS8qCisJICogUmVsZWFzZSBkcXVvdCB0aGF0IHJvb3Rpbm9kZSwgcmJtaW5vIGFuZCByc3VtaW5vIG1pZ2h0IGJlIGhvbGRpbmcsCisJICogZmx1c2ggYW5kIHB1cmdlIHRoZSBxdW90YSBpbm9kZXMuCisJICovCisJZXJyb3IgPSBYRlNfUU1fVU5NT1VOVChtcCk7CisJaWYgKGVycm9yID09IEVGU0NPUlJVUFRFRCkKKwkJZ290byBmc2NvcnJ1cHRfb3V0MjsKKworCWlmIChyYm1pcCkgeworCQlWTl9SRUxFKFhGU19JVE9WKHJibWlwKSk7CisJCVZOX1JFTEUoWEZTX0lUT1YocnN1bWlwKSk7CisJfQorCisJeGZzX2l1bmxvY2socmlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJcmV0dXJuIDA7CisKK2ZzY29ycnVwdF9vdXQ6CisJeGZzX2lmdW5sb2NrKHJpcCk7CisKK2ZzY29ycnVwdF9vdXQyOgorCXhmc19pdW5sb2NrKHJpcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworfQorCisvKgorICogeGZzX3Jvb3QgZXh0cmFjdHMgdGhlIHJvb3Qgdm5vZGUgZnJvbSBhIHZmcy4KKyAqCisgKiB2ZnNwIC0tIHRoZSB2ZnMgc3RydWN0IGZvciB0aGUgZGVzaXJlZCBmaWxlIHN5c3RlbQorICogdnBwICAtLSBhZGRyZXNzIG9mIHRoZSBjYWxsZXIncyB2bm9kZSBwb2ludGVyIHdoaWNoIHNob3VsZCBiZQorICogICAgICAgICBzZXQgdG8gdGhlIGRlc2lyZWQgZnMgcm9vdCB2bm9kZQorICovCitTVEFUSUMgaW50Cit4ZnNfcm9vdCgKKwliaHZfZGVzY190CSpiZHAsCisJdm5vZGVfdAkJKip2cHApCit7CisJdm5vZGVfdAkJKnZwOworCisJdnAgPSBYRlNfSVRPVigoWEZTX0JIVlRPTShiZHApKS0+bV9yb290aXApOworCVZOX0hPTEQodnApOworCSp2cHAgPSB2cDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHhmc19zdGF0dmZzCisgKgorICogRmlsbCBpbiB0aGUgc3RhdHZmcyBzdHJ1Y3R1cmUgZm9yIHRoZSBnaXZlbiBmaWxlIHN5c3RlbS4gIFdlIHVzZQorICogdGhlIHN1cGVyYmxvY2sgbG9jayBpbiB0aGUgbW91bnQgc3RydWN0dXJlIHRvIGVuc3VyZSBhIGNvbnNpc3RlbnQKKyAqIHNuYXBzaG90IG9mIHRoZSBjb3VudGVycyByZXR1cm5lZC4KKyAqLworU1RBVElDIGludAoreGZzX3N0YXR2ZnMoCisJYmh2X2Rlc2NfdAkqYmRwLAorCXhmc19zdGF0ZnNfdAkqc3RhdHAsCisJdm5vZGVfdAkJKnZwKQoreworCV9fdWludDY0X3QJZmFrZWlub3M7CisJeGZzX2V4dGxlbl90CWxzaXplOworCXhmc19tb3VudF90CSptcDsKKwl4ZnNfc2JfdAkqc2JwOworCXVuc2lnbmVkIGxvbmcJczsKKwl1NjQgaWQ7CisKKwltcCA9IFhGU19CSFZUT00oYmRwKTsKKwlzYnAgPSAmKG1wLT5tX3NiKTsKKworCXN0YXRwLT5mX3R5cGUgPSBYRlNfU0JfTUFHSUM7CisKKwlzID0gWEZTX1NCX0xPQ0sobXApOworCXN0YXRwLT5mX2JzaXplID0gc2JwLT5zYl9ibG9ja3NpemU7CisJbHNpemUgPSBzYnAtPnNiX2xvZ3N0YXJ0ID8gc2JwLT5zYl9sb2dibG9ja3MgOiAwOworCXN0YXRwLT5mX2Jsb2NrcyA9IHNicC0+c2JfZGJsb2NrcyAtIGxzaXplOworCXN0YXRwLT5mX2JmcmVlID0gc3RhdHAtPmZfYmF2YWlsID0gc2JwLT5zYl9mZGJsb2NrczsKKwlmYWtlaW5vcyA9IHN0YXRwLT5mX2JmcmVlIDw8IHNicC0+c2JfaW5vcGJsb2c7CisjaWYgWEZTX0JJR19JTlVNUworCWZha2Vpbm9zICs9IG1wLT5tX2lub2FkZDsKKyNlbmRpZgorCXN0YXRwLT5mX2ZpbGVzID0KKwkgICAgTUlOKHNicC0+c2JfaWNvdW50ICsgZmFrZWlub3MsIChfX3VpbnQ2NF90KVhGU19NQVhJTlVNQkVSKTsKKwlpZiAobXAtPm1fbWF4aWNvdW50KQorI2lmIFhGU19CSUdfSU5VTVMKKwkJaWYgKCFtcC0+bV9pbm9hZGQpCisjZW5kaWYKKwkJCXN0YXRwLT5mX2ZpbGVzID0gbWluX3QodHlwZW9mKHN0YXRwLT5mX2ZpbGVzKSwKKwkJCQkJCXN0YXRwLT5mX2ZpbGVzLAorCQkJCQkJbXAtPm1fbWF4aWNvdW50KTsKKwlzdGF0cC0+Zl9mZnJlZSA9IHN0YXRwLT5mX2ZpbGVzIC0gKHNicC0+c2JfaWNvdW50IC0gc2JwLT5zYl9pZnJlZSk7CisJWEZTX1NCX1VOTE9DSyhtcCwgcyk7CisKKwlpZCA9IGh1Z2VfZW5jb2RlX2RldihtcC0+bV9kZXYpOworCXN0YXRwLT5mX2ZzaWQudmFsWzBdID0gKHUzMilpZDsKKwlzdGF0cC0+Zl9mc2lkLnZhbFsxXSA9ICh1MzIpKGlkID4+IDMyKTsKKwlzdGF0cC0+Zl9uYW1lbGVuID0gTUFYTkFNRUxFTiAtIDE7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogeGZzX3N5bmMgZmx1c2hlcyBhbnkgcGVuZGluZyBJL08gdG8gZmlsZSBzeXN0ZW0gdmZzcC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHZmc19zeW5jKCkgdG8gbWFrZSBzdXJlIHRoYXQgdGhpbmdzIG1ha2UgaXQKKyAqIG91dCB0byBkaXNrIGV2ZW50dWFsbHksIG9uIHN5bmMoKSBzeXN0ZW0gY2FsbHMgdG8gZmx1c2ggb3V0IGV2ZXJ5dGhpbmcsCisgKiBhbmQgd2hlbiB0aGUgZmlsZSBzeXN0ZW0gaXMgdW5tb3VudGVkLiAgRm9yIHRoZSB2ZnNfc3luYygpIGNhc2UsIGFsbAorICogd2UgcmVhbGx5IG5lZWQgdG8gZG8gaXMgc3luYyBvdXQgdGhlIGxvZyB0byBtYWtlIGFsbCBvZiBvdXIgbWV0YS1kYXRhCisgKiB1cGRhdGVzIHBlcm1hbmVudCAoZXhjZXB0IGZvciB0aW1lc3RhbXBzKS4gIEZvciBjYWxscyBmcm9tIHBmbHVzaGQoKSwKKyAqIGRpcnR5IHBhZ2VzIGFyZSBrZXB0IG1vdmluZyBieSBjYWxsaW5nIHBkZmx1c2goKSBvbiB0aGUgaW5vZGVzCisgKiBjb250YWluaW5nIHRoZW0uICBXZSBhbHNvIGZsdXNoIHRoZSBpbm9kZXMgdGhhdCB3ZSBjYW4gbG9jayB3aXRob3V0CisgKiBzbGVlcGluZyBhbmQgdGhlIHN1cGVyYmxvY2sgaWYgd2UgY2FuIGxvY2sgaXQgd2l0aG91dCBzbGVlcGluZyBmcm9tCisgKiB2ZnNfc3luYygpIHNvIHRoYXQgaXRlbXMgYXQgdGhlIHRhaWwgb2YgdGhlIGxvZyBhcmUgYWx3YXlzIG1vdmluZyBvdXQuCisgKgorICogRmxhZ3M6CisgKiAgICAgIFNZTkNfQkRGTFVTSCAtIFdlJ3JlIGJlaW5nIGNhbGxlZCBmcm9tIHZmc19zeW5jKCkgc28gd2UgZG9uJ3Qgd2FudAorICoJCSAgICAgICB0byBzbGVlcCBpZiB3ZSBjYW4gaGVscCBpdC4gIEFsbCB3ZSByZWFsbHkgbmVlZAorICoJCSAgICAgICB0byBkbyBpcyBlbnN1cmUgdGhhdCB0aGUgbG9nIGlzIHN5bmNlZCBhdCBsZWFzdAorICoJCSAgICAgICBwZXJpb2RpY2FsbHkuICBXZSBhbHNvIHB1c2ggdGhlIGlub2RlcyBhbmQKKyAqCQkgICAgICAgc3VwZXJibG9jayBpZiB3ZSBjYW4gbG9jayB0aGVtIHdpdGhvdXQgc2xlZXBpbmcKKyAqCQkJYW5kIHRoZXkgYXJlIG5vdCBwaW5uZWQuCisgKiAgICAgIFNZTkNfQVRUUiAgICAtIFdlIG5lZWQgdG8gZmx1c2ggdGhlIGlub2Rlcy4gIElmIFNZTkNfQkRGTFVTSCBpcyBub3QKKyAqCQkgICAgICAgc2V0LCB0aGVuIHdlIHJlYWxseSB3YW50IHRvIGxvY2sgZWFjaCBpbm9kZSBhbmQgZmx1c2gKKyAqCQkgICAgICAgaXQuCisgKiAgICAgIFNZTkNfV0FJVCAgICAtIEFsbCB0aGUgZmx1c2hlcyB0aGF0IHRha2UgcGxhY2UgaW4gdGhpcyBjYWxsIHNob3VsZAorICoJCSAgICAgICBiZSBzeW5jaHJvbm91cy4KKyAqICAgICAgU1lOQ19ERUxXUkkgIC0gVGhpcyB0ZWxscyB1cyB0byBwdXNoIGRpcnR5IHBhZ2VzIGFzc29jaWF0ZWQgd2l0aAorICoJCSAgICAgICBpbm9kZXMuICBTWU5DX1dBSVQgYW5kIFNZTkNfQkRGTFVTSCBhcmUgdXNlZCB0bworICoJCSAgICAgICBkZXRlcm1pbmUgaWYgdGhleSBzaG91bGQgYmUgZmx1c2hlZCBzeW5jLCBhc3luYywgb3IKKyAqCQkgICAgICAgZGVsd3JpLgorICogICAgICBTWU5DX0NMT1NFICAgLSBUaGlzIGZsYWcgaXMgcGFzc2VkIHdoZW4gdGhlIHN5c3RlbSBpcyBiZWluZworICoJCSAgICAgICB1bm1vdW50ZWQuICBXZSBzaG91bGQgc3luYyBhbmQgaW52YWxpZGF0ZSBldmVydGhpbmcuCisgKiAgICAgIFNZTkNfRlNEQVRBICAtIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGNhbGxlciB3b3VsZCBsaWtlIHRvIG1ha2UKKyAqCQkgICAgICAgc3VyZSB0aGUgc3VwZXJibG9jayBpcyBzYWZlIG9uIGRpc2suICBXZSBjYW4gZW5zdXJlCisgKgkJICAgICAgIHRoaXMgYnkgc2ltcGx5IG1ha2Vpbmcgc3VyZSB0aGUgbG9nIGdldHMgZmx1c2hlZAorICoJCSAgICAgICBpZiBTWU5DX0JERkxVU0ggaXMgc2V0LCBhbmQgYnkgYWN0dWFsbHkgd3JpdGluZyBpdAorICoJCSAgICAgICBvdXQgb3RoZXJ3aXNlLgorICoKKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgaW50Cit4ZnNfc3luYygKKwliaHZfZGVzY190CSpiZHAsCisJaW50CQlmbGFncywKKwljcmVkX3QJCSpjcmVkcCkKK3sKKwl4ZnNfbW91bnRfdAkqbXA7CisKKwltcCA9IFhGU19CSFZUT00oYmRwKTsKKwlyZXR1cm4gKHhmc19zeW5jc3ViKG1wLCBmbGFncywgMCwgTlVMTCkpOworfQorCisvKgorICogeGZzIHN5bmMgcm91dGluZSBmb3IgaW50ZXJuYWwgdXNlCisgKgorICogVGhpcyByb3V0aW5lIHN1cHBvcnRzIGFsbCBvZiB0aGUgZmxhZ3MgZGVmaW5lZCBmb3IgdGhlIGdlbmVyaWMgVkZTX1NZTkMKKyAqIGludGVyZmFjZSBhcyBleHBsYWluZWQgYWJvdmUgdW5kZXIgeGZzX3N5bmMuICBJbiB0aGUgaW50ZXJlc3RzIG9mIG5vdAorICogY2hhbmdpbmcgaW50ZXJmYWNlcyB3aXRoaW4gdGhlIDYuNSBmYW1pbHksIGFkZGl0aW9uYWwgaW50ZXJuYWxsbHktCisgKiByZXF1aXJlZCBmdW5jdGlvbnMgYXJlIHNwZWNpZmllZCB3aXRoaW4gYSBzZXBhcmF0ZSB4ZmxhZ3MgcGFyYW1ldGVyLAorICogb25seSBhdmFpbGFibGUgYnkgY2FsbGluZyB0aGlzIHJvdXRpbmUuCisgKgorICovCitTVEFUSUMgaW50Cit4ZnNfc3luY19pbm9kZXMoCisJeGZzX21vdW50X3QJKm1wLAorCWludAkJZmxhZ3MsCisJaW50ICAgICAgICAgICAgIHhmbGFncywKKwlpbnQgICAgICAgICAgICAgKmJ5cGFzc2VkKQoreworCXhmc19pbm9kZV90CSppcCA9IE5VTEw7CisJeGZzX2lub2RlX3QJKmlwX25leHQ7CisJeGZzX2J1Zl90CSpicDsKKwl2bm9kZV90CQkqdnAgPSBOVUxMOworCXZtYXBfdAkJdm1hcDsKKwlpbnQJCWVycm9yOworCWludAkJbGFzdF9lcnJvcjsKKwl1aW50NjRfdAlmZmxhZzsKKwl1aW50CQlsb2NrX2ZsYWdzOworCXVpbnQJCWJhc2VfbG9ja19mbGFnczsKKwlib29sZWFuX3QJbW91bnRfbG9ja2VkOworCWJvb2xlYW5fdAl2bm9kZV9yZWZlZDsKKwlpbnQJCXByZWVtcHQ7CisJeGZzX2Rpbm9kZV90CSpkaXA7CisJeGZzX2lwdHJfdAkqaXBvaW50ZXI7CisjaWZkZWYgREVCVUcKKwlib29sZWFuX3QJaXBvaW50ZXJfaW4gPSBCX0ZBTFNFOworCisjZGVmaW5lIElQT0lOVEVSX1NFVAlpcG9pbnRlcl9pbiA9IEJfVFJVRQorI2RlZmluZSBJUE9JTlRFUl9DTFIJaXBvaW50ZXJfaW4gPSBCX0ZBTFNFCisjZWxzZQorI2RlZmluZSBJUE9JTlRFUl9TRVQKKyNkZWZpbmUgSVBPSU5URVJfQ0xSCisjZW5kaWYKKworCisvKiBJbnNlcnQgYSBtYXJrZXIgcmVjb3JkIGludG8gdGhlIGlub2RlIGxpc3QgYWZ0ZXIgaW5vZGUgaXAuIFRoZSBsaXN0CisgKiBtdXN0IGJlIGxvY2tlZCB3aGVuIHRoaXMgaXMgY2FsbGVkLiBBZnRlciB0aGUgY2FsbCB0aGUgbGlzdCB3aWxsIG5vCisgKiBsb25nZXIgYmUgbG9ja2VkLgorICovCisjZGVmaW5lIElQT0lOVEVSX0lOU0VSVChpcCwgbXApCXsgXAorCQlBU1NFUlQoaXBvaW50ZXJfaW4gPT0gQl9GQUxTRSk7IFwKKwkJaXBvaW50ZXItPmlwX21uZXh0ID0gaXAtPmlfbW5leHQ7IFwKKwkJaXBvaW50ZXItPmlwX21wcmV2ID0gaXA7IFwKKwkJaXAtPmlfbW5leHQgPSAoeGZzX2lub2RlX3QgKilpcG9pbnRlcjsgXAorCQlpcG9pbnRlci0+aXBfbW5leHQtPmlfbXByZXYgPSAoeGZzX2lub2RlX3QgKilpcG9pbnRlcjsgXAorCQlwcmVlbXB0ID0gMDsgXAorCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7IFwKKwkJbW91bnRfbG9ja2VkID0gQl9GQUxTRTsgXAorCQlJUE9JTlRFUl9TRVQ7IFwKKwl9CisKKy8qIFJlbW92ZSB0aGUgbWFya2VyIGZyb20gdGhlIGlub2RlIGxpc3QuIElmIHRoZSBtYXJrZXIgd2FzIHRoZSBvbmx5IGl0ZW0KKyAqIGluIHRoZSBsaXN0IHRoZW4gdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBpbm9kZXMgYW5kIHdlIHNob3VsZCB6ZXJvIG91dAorICogdGhlIHdob2xlIGxpc3QuIElmIHdlIGFyZSB0aGUgY3VycmVudCBoZWFkIG9mIHRoZSBsaXN0IHRoZW4gbW92ZSB0aGUgaGVhZAorICogcGFzdCB1cy4KKyAqLworI2RlZmluZSBJUE9JTlRFUl9SRU1PVkUoaXAsIG1wKQl7IFwKKwkJQVNTRVJUKGlwb2ludGVyX2luID09IEJfVFJVRSk7IFwKKwkJaWYgKGlwb2ludGVyLT5pcF9tbmV4dCAhPSAoeGZzX2lub2RlX3QgKilpcG9pbnRlcikgeyBcCisJCQlpcCA9IGlwb2ludGVyLT5pcF9tbmV4dDsgXAorCQkJaXAtPmlfbXByZXYgPSBpcG9pbnRlci0+aXBfbXByZXY7IFwKKwkJCWlwb2ludGVyLT5pcF9tcHJldi0+aV9tbmV4dCA9IGlwOyBcCisJCQlpZiAobXAtPm1faW5vZGVzID09ICh4ZnNfaW5vZGVfdCAqKWlwb2ludGVyKSB7IFwKKwkJCQltcC0+bV9pbm9kZXMgPSBpcDsgXAorCQkJfSBcCisJCX0gZWxzZSB7IFwKKwkJCUFTU0VSVChtcC0+bV9pbm9kZXMgPT0gKHhmc19pbm9kZV90ICopaXBvaW50ZXIpOyBcCisJCQltcC0+bV9pbm9kZXMgPSBOVUxMOyBcCisJCQlpcCA9IE5VTEw7IFwKKwkJfSBcCisJCUlQT0lOVEVSX0NMUjsgXAorCX0KKworI2RlZmluZSBYRlNfUFJFRU1QVF9NQVNLCTB4N2YKKworCWlmIChieXBhc3NlZCkKKwkJKmJ5cGFzc2VkID0gMDsKKwlpZiAoWEZTX01UT1ZGUyhtcCktPnZmc19mbGFnICYgVkZTX1JET05MWSkKKwkJcmV0dXJuIDA7CisJZXJyb3IgPSAwOworCWxhc3RfZXJyb3IgPSAwOworCXByZWVtcHQgPSAwOworCisJLyogQWxsb2NhdGUgYSByZWZlcmVuY2UgbWFya2VyICovCisJaXBvaW50ZXIgPSAoeGZzX2lwdHJfdCAqKWttZW1femFsbG9jKHNpemVvZih4ZnNfaXB0cl90KSwgS01fU0xFRVApOworCisJZmZsYWcgPSBYRlNfQl9BU1lOQzsJCS8qIGRlZmF1bHQgaXMgZG9uJ3Qgd2FpdCAqLworCWlmIChmbGFncyAmIFNZTkNfQkRGTFVTSCkKKwkJZmZsYWcgPSBYRlNfQl9ERUxXUkk7CisJaWYgKGZsYWdzICYgU1lOQ19XQUlUKQorCQlmZmxhZyA9IDA7CQkvKiBzeW5jaHJvbm91cyBvdmVycmlkZXMgYWxsICovCisKKwliYXNlX2xvY2tfZmxhZ3MgPSBYRlNfSUxPQ0tfU0hBUkVEOworCWlmIChmbGFncyAmIChTWU5DX0RFTFdSSSB8IFNZTkNfQ0xPU0UpKSB7CisJCS8qCisJCSAqIFdlIG5lZWQgdGhlIEkvTyBsb2NrIGlmIHdlJ3JlIGdvaW5nIHRvIGNhbGwgYW55IG9mCisJCSAqIHRoZSBmbHVzaC9pbnZhbCByb3V0aW5lcy4KKwkJICovCisJCWJhc2VfbG9ja19mbGFncyB8PSBYRlNfSU9MT0NLX1NIQVJFRDsKKwl9CisKKwlYRlNfTU9VTlRfSUxPQ0sobXApOworCisJaXAgPSBtcC0+bV9pbm9kZXM7CisKKwltb3VudF9sb2NrZWQgPSBCX1RSVUU7CisJdm5vZGVfcmVmZWQgID0gQl9GQUxTRTsKKworCUlQT0lOVEVSX0NMUjsKKworCWRvIHsKKwkJQVNTRVJUKGlwb2ludGVyX2luID09IEJfRkFMU0UpOworCQlBU1NFUlQodm5vZGVfcmVmZWQgPT0gQl9GQUxTRSk7CisKKwkJbG9ja19mbGFncyA9IGJhc2VfbG9ja19mbGFnczsKKworCQkvKgorCQkgKiBUaGVyZSB3ZXJlIG5vIGlub2RlcyBpbiB0aGUgbGlzdCwganVzdCBicmVhayBvdXQKKwkJICogb2YgdGhlIGxvb3AuCisJCSAqLworCQlpZiAoaXAgPT0gTlVMTCkgeworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBXZSBmb3VuZCBhbm90aGVyIHN5bmMgdGhyZWFkIG1hcmtlciAtIHNraXAgaXQKKwkJICovCisJCWlmIChpcC0+aV9tb3VudCA9PSBOVUxMKSB7CisJCQlpcCA9IGlwLT5pX21uZXh0OworCQkJY29udGludWU7CisJCX0KKworCQl2cCA9IFhGU19JVE9WX05VTEwoaXApOworCisJCS8qCisJCSAqIElmIHRoZSB2bm9kZSBpcyBnb25lIHRoZW4gdGhpcyBpcyBiZWluZyB0b3JuIGRvd24sCisJCSAqIGNhbGwgcmVjbGFpbSBpZiBpdCBpcyBmbHVzaGVkLCBlbHNlIGxldCByZWd1bGFyIGZsdXNoCisJCSAqIGNvZGUgZGVhbCB3aXRoIGl0IGxhdGVyIGluIHRoZSBsb29wLgorCQkgKi8KKworCQlpZiAodnAgPT0gTlVMTCkgeworCQkJLyogU2tpcCBvbmVzIGFscmVhZHkgaW4gcmVjbGFpbSAqLworCQkJaWYgKGlwLT5pX2ZsYWdzICYgWEZTX0lSRUNMQUlNKSB7CisJCQkJaXAgPSBpcC0+aV9tbmV4dDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICh4ZnNfaWxvY2tfbm93YWl0KGlwLCBYRlNfSUxPQ0tfRVhDTCkgPT0gMCkgeworCQkJCWlwID0gaXAtPmlfbW5leHQ7CisJCQl9IGVsc2UgaWYgKCh4ZnNfaXBpbmNvdW50KGlwKSA9PSAwKSAmJgorCQkJCSAgICB4ZnNfaWZsb2NrX25vd2FpdChpcCkpIHsKKwkJCQlJUE9JTlRFUl9JTlNFUlQoaXAsIG1wKTsKKworCQkJCXhmc19maW5pc2hfcmVjbGFpbShpcCwgMSwKKwkJCQkJCVhGU19JRkxVU0hfREVMV1JJX0VMU0VfQVNZTkMpOworCisJCQkJWEZTX01PVU5UX0lMT0NLKG1wKTsKKwkJCQltb3VudF9sb2NrZWQgPSBCX1RSVUU7CisJCQkJSVBPSU5URVJfUkVNT1ZFKGlwLCBtcCk7CisJCQl9IGVsc2UgeworCQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCQkJaXAgPSBpcC0+aV9tbmV4dDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKFZOX0JBRCh2cCkpIHsKKwkJCWlwID0gaXAtPmlfbW5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSAmJiAhKGZsYWdzICYgU1lOQ19DTE9TRSkpIHsKKwkJCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKKwkJCWttZW1fZnJlZShpcG9pbnRlciwgc2l6ZW9mKHhmc19pcHRyX3QpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyoKKwkJICogSWYgdGhpcyBpcyBqdXN0IHZmc19zeW5jKCkgb3IgcGZsdXNoZCgpIGNhbGxpbmcKKwkJICogdGhlbiB3ZSBjYW4gc2tpcCBpbm9kZXMgZm9yIHdoaWNoIGl0IGxvb2tzIGxpa2UKKwkJICogdGhlcmUgaXMgbm90aGluZyB0byBkby4gIFNpbmNlIHdlIGRvbid0IGhhdmUgdGhlCisJCSAqIGlub2RlIGxvY2tlZCB0aGlzIGlzIHJhY2V5LCBidXQgdGhlc2UgYXJlIHBlcmlvZGljCisJCSAqIGNhbGxzIHNvIGl0IGRvZXNuJ3QgbWF0dGVyLiAgRm9yIHRoZSBvdGhlcnMgd2Ugd2FudAorCQkgKiB0byBrbm93IGZvciBzdXJlLCBzbyB3ZSBhdCBsZWFzdCB0cnkgdG8gbG9jayB0aGVtLgorCQkgKi8KKwkJaWYgKGZsYWdzICYgU1lOQ19CREZMVVNIKSB7CisJCQlpZiAoKChpcC0+aV9pdGVtcCA9PSBOVUxMKSB8fAorCQkJICAgICAhKGlwLT5pX2l0ZW1wLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJgorCQkJICAgICAgIFhGU19JTE9HX0FMTCkpICYmCisJCQkgICAgKGlwLT5pX3VwZGF0ZV9jb3JlID09IDApKSB7CisJCQkJaXAgPSBpcC0+aV9tbmV4dDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFRyeSB0byBsb2NrIHdpdGhvdXQgc2xlZXBpbmcuICBXZSdyZSBvdXQgb2Ygb3JkZXIgd2l0aAorCQkgKiB0aGUgaW5vZGUgbGlzdCBsb2NrIGhlcmUsIHNvIGlmIHdlIGZhaWwgd2UgbmVlZCB0byBkcm9wCisJCSAqIHRoZSBtb3VudCBsb2NrIGFuZCB0cnkgYWdhaW4uICBJZiB3ZSdyZSBjYWxsZWQgZnJvbQorCQkgKiBiZGZsdXNoKCkgaGVyZSwgdGhlbiBkb24ndCBib3RoZXIuCisJCSAqCisJCSAqIFRoZSBpbm9kZSBsb2NrIGhlcmUgYWN0dWFsbHkgY29vcmRpbmF0ZXMgd2l0aCB0aGUKKwkJICogYWxtb3N0IHNwdXJpb3VzIGlub2RlIGxvY2sgaW4geGZzX2lyZWNsYWltKCkgdG8gcHJldmVudAorCQkgKiB0aGUgdm5vZGUgd2UgaGFuZGxlIGhlcmUgd2l0aG91dCBhIHJlZmVyZW5jZSBmcm9tCisJCSAqIGJlaW5nIGZyZWVkIHdoaWxlIHdlIHJlZmVyZW5jZSBpdC4gIElmIHdlIGxvY2sgdGhlIGlub2RlCisJCSAqIHdoaWxlIGl0J3Mgb24gdGhlIG1vdW50IGxpc3QgaGVyZSwgdGhlbiB0aGUgc3B1cmlvdXMgaW5vZGUKKwkJICogbG9jayBpbiB4ZnNfaXJlY2xhaW0oKSBhZnRlciB0aGUgaW5vZGUgaXMgcHVsbGVkIGZyb20KKwkJICogdGhlIG1vdW50IGxpc3Qgd2lsbCBzbGVlcCB1bnRpbCB3ZSByZWxlYXNlIGl0IGhlcmUuCisJCSAqIFRoaXMga2VlcHMgdGhlIHZub2RlIGZyb20gYmVpbmcgZnJlZWQgd2hpbGUgd2UgcmVmZXJlbmNlCisJCSAqIGl0LiAgSXQgaXMgYWxzbyBjaGVhcGVyIGFuZCBzaW1wbGVyIHRoYW4gYWN0dWFsbHkgZG9pbmcKKwkJICogYSB2bl9nZXQoKSBmb3IgZXZlcnkgaW5vZGUgd2UgdG91Y2ggaGVyZS4KKwkJICovCisJCWlmICh4ZnNfaWxvY2tfbm93YWl0KGlwLCBsb2NrX2ZsYWdzKSA9PSAwKSB7CisKKwkJCWlmICgoZmxhZ3MgJiBTWU5DX0JERkxVU0gpIHx8ICh2cCA9PSBOVUxMKSkgeworCQkJCWlwID0gaXAtPmlfbW5leHQ7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBXZSBuZWVkIHRvIHVubG9jayB0aGUgaW5vZGUgbGlzdCBsb2NrIGluIG9yZGVyCisJCQkgKiB0byBsb2NrIHRoZSBpbm9kZS4gSW5zZXJ0IGEgbWFya2VyIHJlY29yZCBpbnRvCisJCQkgKiB0aGUgaW5vZGUgbGlzdCB0byByZW1lbWJlciBvdXIgcG9zaXRpb24sIGRyb3BwaW5nCisJCQkgKiB0aGUgbG9jayBpcyBub3cgZG9uZSBpbnNpZGUgdGhlIElQT0lOVEVSX0lOU0VSVAorCQkJICogbWFjcm8uCisJCQkgKgorCQkJICogV2UgYWxzbyB1c2UgdGhlIGlub2RlIGxpc3QgbG9jayB0byBwcm90ZWN0IHVzCisJCQkgKiBpbiB0YWtpbmcgYSBzbmFwc2hvdCBvZiB0aGUgdm5vZGUgdmVyc2lvbiBudW1iZXIKKwkJCSAqIGZvciB1c2UgaW4gY2FsbGluZyB2bl9nZXQoKS4KKwkJCSAqLworCQkJVk1BUCh2cCwgdm1hcCk7CisJCQlJUE9JTlRFUl9JTlNFUlQoaXAsIG1wKTsKKworCQkJdnAgPSB2bl9nZXQodnAsICZ2bWFwKTsKKwkJCWlmICh2cCA9PSBOVUxMKSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgdm5vZGUgd2FzIHJlY2xhaW1lZCBvbmNlIHdlIGxldCBnbworCQkJCSAqIG9mIHRoZSBpbm9kZSBsaXN0IGxvY2suICBTa2lwIHRvIHRoZQorCQkJCSAqIG5leHQgbGlzdCBlbnRyeS4gUmVtb3ZlIHRoZSBtYXJrZXIuCisJCQkJICovCisKKwkJCQlYRlNfTU9VTlRfSUxPQ0sobXApOworCisJCQkJbW91bnRfbG9ja2VkID0gQl9UUlVFOworCQkJCXZub2RlX3JlZmVkICA9IEJfRkFMU0U7CisKKwkJCQlJUE9JTlRFUl9SRU1PVkUoaXAsIG1wKTsKKworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQl4ZnNfaWxvY2soaXAsIGxvY2tfZmxhZ3MpOworCisJCQlBU1NFUlQodnAgPT0gWEZTX0lUT1YoaXApKTsKKwkJCUFTU0VSVChpcC0+aV9tb3VudCA9PSBtcCk7CisKKwkJCXZub2RlX3JlZmVkID0gQl9UUlVFOworCQl9CisKKwkJLyogRnJvbSBoZXJlIG9uIGluIHRoZSBsb29wIHdlIG1heSBoYXZlIGEgbWFya2VyIHJlY29yZAorCQkgKiBpbiB0aGUgaW5vZGUgbGlzdC4KKwkJICovCisKKwkJaWYgKChmbGFncyAmIFNZTkNfQ0xPU0UpICAmJiAodnAgIT0gTlVMTCkpIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIHRoZSBzaHV0ZG93biBjYXNlLiAgV2UganVzdCBuZWVkIHRvCisJCQkgKiBmbHVzaCBhbmQgaW52YWxpZGF0ZSBhbGwgdGhlIHBhZ2VzIGFzc29jaWF0ZWQKKwkJCSAqIHdpdGggdGhlIGlub2RlLiAgRHJvcCB0aGUgaW5vZGUgbG9jayBzaW5jZQorCQkJICogd2UgY2FuJ3QgaG9sZCBpdCBhY3Jvc3MgY2FsbHMgdG8gdGhlIGJ1ZmZlcgorCQkJICogY2FjaGUuCisJCQkgKgorCQkJICogV2UgZG9uJ3Qgc2V0IHRoZSBWUkVNQVBQSU5HIGJpdCBpbiB0aGUgdm5vZGUKKwkJCSAqIGhlcmUsIGJlY2F1c2Ugd2UgZG9uJ3QgaG9sZCB0aGUgdm5vZGUgbG9jaworCQkJICogZXhjbHVzaXZlbHkuICBJdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIsIHRob3VnaCwKKwkJCSAqIGJlY2F1c2Ugd2Ugb25seSBjb21lIGhlcmUgd2hlbiB3ZSdyZSBzaHV0dGluZworCQkJICogZG93biBhbnl3YXkuCisJCQkgKi8KKwkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKworCQkJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKSB7CisJCQkJVk9QX1RPU1NfUEFHRVModnAsIDAsIC0xLCBGSV9SRU1BUEYpOworCQkJfSBlbHNlIHsKKwkJCQlWT1BfRkxVU0hJTlZBTF9QQUdFUyh2cCwgMCwgLTEsIEZJX1JFTUFQRik7CisJCQl9CisKKwkJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisKKwkJfSBlbHNlIGlmICgoZmxhZ3MgJiBTWU5DX0RFTFdSSSkgJiYgKHZwICE9IE5VTEwpKSB7CisJCQlpZiAoVk5fRElSVFkodnApKSB7CisJCQkJLyogV2UgbmVlZCB0byBoYXZlIGRyb3BwZWQgdGhlIGxvY2sgaGVyZSwKKwkJCQkgKiBzbyBpbnNlcnQgYSBtYXJrZXIgaWYgd2UgaGF2ZSBub3QgYWxyZWFkeQorCQkJCSAqIGRvbmUgc28uCisJCQkJICovCisJCQkJaWYgKG1vdW50X2xvY2tlZCkgeworCQkJCQlJUE9JTlRFUl9JTlNFUlQoaXAsIG1wKTsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIERyb3AgdGhlIGlub2RlIGxvY2sgc2luY2Ugd2UgY2FuJ3QgaG9sZCBpdAorCQkJCSAqIGFjcm9zcyBjYWxscyB0byB0aGUgYnVmZmVyIGNhY2hlLgorCQkJCSAqLworCQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwkJCQlWT1BfRkxVU0hfUEFHRVModnAsICh4ZnNfb2ZmX3QpMCwgLTEsCisJCQkJCQkJZmZsYWcsIEZJX05PTkUsIGVycm9yKTsKKwkJCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCQkJfQorCisJCX0KKworCQlpZiAoZmxhZ3MgJiBTWU5DX0JERkxVU0gpIHsKKwkJCWlmICgoZmxhZ3MgJiBTWU5DX0FUVFIpICYmCisJCQkgICAgKChpcC0+aV91cGRhdGVfY29yZSkgfHwKKwkJCSAgICAgKChpcC0+aV9pdGVtcCAhPSBOVUxMKSAmJgorCQkJICAgICAgKGlwLT5pX2l0ZW1wLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgIT0gMCkpKSkgeworCisJCQkJLyogSW5zZXJ0IG1hcmtlciBhbmQgZHJvcCBsb2NrIGlmIG5vdCBhbHJlYWR5CisJCQkJICogZG9uZS4KKwkJCQkgKi8KKwkJCQlpZiAobW91bnRfbG9ja2VkKSB7CisJCQkJCUlQT0lOVEVSX0lOU0VSVChpcCwgbXApOworCQkJCX0KKworCQkJCS8qCisJCQkJICogV2UgZG9uJ3Qgd2FudCB0aGUgcGVyaW9kaWMgZmx1c2hpbmcgb2YgdGhlCisJCQkJICogaW5vZGVzIGJ5IHZmc19zeW5jKCkgdG8gaW50ZXJmZXJlIHdpdGgKKwkJCQkgKiBJL08gdG8gdGhlIGZpbGUsIGVzcGVjaWFsbHkgcmVhZCBJL08KKwkJCQkgKiB3aGVyZSBpdCBpcyBvbmx5IHRoZSBhY2Nlc3MgdGltZSBzdGFtcAorCQkJCSAqIHRoYXQgaXMgYmVpbmcgZmx1c2hlZCBvdXQuICBUbyBwcmV2ZW50CisJCQkJICogbG9uZyBwZXJpb2RzIHdoZXJlIHdlIGhhdmUgYm90aCBpbm9kZQorCQkJCSAqIGxvY2tzIGhlbGQgc2hhcmVkIGhlcmUgd2hpbGUgcmVhZGluZyB0aGUKKwkJCQkgKiBpbm9kZSdzIGJ1ZmZlciBpbiBmcm9tIGRpc2ssIHdlIGRyb3AgdGhlCisJCQkJICogaW5vZGUgbG9jayB3aGlsZSByZWFkaW5nIGluIHRoZSBpbm9kZQorCQkJCSAqIGJ1ZmZlci4gIFdlIGhhdmUgdG8gcmVsZWFzZSB0aGUgYnVmZmVyCisJCQkJICogYW5kIHJlYWNxdWlyZSB0aGUgaW5vZGUgbG9jayBzbyB0aGF0IHRoZXkKKwkJCQkgKiBhcmUgYWNxdWlyZWQgaW4gdGhlIHByb3BlciBvcmRlciAoaW5vZGUKKwkJCQkgKiBsb2NrcyBmaXJzdCkuICBUaGUgYnVmZmVyIHdpbGwgZ28gYXQgdGhlCisJCQkJICogZW5kIG9mIHRoZSBscnUgY2hhaW4sIHRob3VnaCwgc28gd2UgY2FuCisJCQkJICogZXhwZWN0IGl0IHRvIHN0aWxsIGJlIHRoZXJlIHdoZW4gd2UgZ28KKwkJCQkgKiBmb3IgaXQgYWdhaW4gaW4geGZzX2lmbHVzaCgpLgorCQkJCSAqLworCQkJCWlmICgoeGZzX2lwaW5jb3VudChpcCkgPT0gMCkgJiYKKwkJCQkgICAgeGZzX2lmbG9ja19ub3dhaXQoaXApKSB7CisKKwkJCQkJeGZzX2lmdW5sb2NrKGlwKTsKKwkJCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCisJCQkJCWVycm9yID0geGZzX2l0b2JwKG1wLCBOVUxMLCBpcCwKKwkJCQkJCQkgICZkaXAsICZicCwgMCk7CisJCQkJCWlmICghZXJyb3IpIHsKKwkJCQkJCXhmc19idWZfcmVsc2UoYnApOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyogQmFpbGluZyBvdXQsIHJlbW92ZSB0aGUKKwkJCQkJCSAqIG1hcmtlciBhbmQgZnJlZSBpdC4KKwkJCQkJCSAqLworCQkJCQkJWEZTX01PVU5UX0lMT0NLKG1wKTsKKworCQkJCQkJSVBPSU5URVJfUkVNT1ZFKGlwLCBtcCk7CisKKwkJCQkJCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKKworCQkJCQkJQVNTRVJUKCEobG9ja19mbGFncyAmCisJCQkJCQkJWEZTX0lPTE9DS19TSEFSRUQpKTsKKworCQkJCQkJa21lbV9mcmVlKGlwb2ludGVyLAorCQkJCQkJCXNpemVvZih4ZnNfaXB0cl90KSk7CisJCQkJCQlyZXR1cm4gKDApOworCQkJCQl9CisKKwkJCQkJLyoKKwkJCQkJICogU2luY2Ugd2UgZHJvcHBlZCB0aGUgaW5vZGUgbG9jaywKKwkJCQkJICogdGhlIGlub2RlIG1heSBoYXZlIGJlZW4gcmVjbGFpbWVkLgorCQkJCQkgKiBUaGVyZWZvcmUsIHdlIHJlYWNxdWlyZSB0aGUgbW91bnQKKwkJCQkJICogbG9jayBhbmQgY2hlY2sgdG8gc2VlIGlmIHdlIHdlcmUgdGhlCisJCQkJCSAqIGlub2RlIHJlY2xhaW1lZC4gSWYgdGhpcyBoYXBwZW5lZAorCQkJCQkgKiB0aGVuIHRoZSBpcG9pbnRlciBtYXJrZXIgd2lsbCBubworCQkJCQkgKiBsb25nZXIgcG9pbnQgYmFjayBhdCB1cy4gSW4gdGhpcworCQkJCQkgKiBjYXNlLCBtb3ZlIGlwIGFsb25nIHRvIHRoZSBpbm9kZQorCQkJCQkgKiBhZnRlciB0aGUgbWFya2VyLCByZW1vdmUgdGhlIG1hcmtlcgorCQkJCQkgKiBhbmQgY29udGludWUuCisJCQkJCSAqLworCQkJCQlYRlNfTU9VTlRfSUxPQ0sobXApOworCQkJCQltb3VudF9sb2NrZWQgPSBCX1RSVUU7CisKKwkJCQkJaWYgKGlwICE9IGlwb2ludGVyLT5pcF9tcHJldikgeworCQkJCQkJSVBPSU5URVJfUkVNT1ZFKGlwLCBtcCk7CisKKwkJCQkJCUFTU0VSVCghdm5vZGVfcmVmZWQpOworCQkJCQkJQVNTRVJUKCEobG9ja19mbGFncyAmCisJCQkJCQkJWEZTX0lPTE9DS19TSEFSRUQpKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQkJQVNTRVJUKGlwLT5pX21vdW50ID09IG1wKTsKKworCQkJCQlpZiAoeGZzX2lsb2NrX25vd2FpdChpcCwKKwkJCQkJCSAgICBYRlNfSUxPQ0tfU0hBUkVEKSA9PSAwKSB7CisJCQkJCQlBU1NFUlQoaXAtPmlfbW91bnQgPT0gbXApOworCQkJCQkJLyoKKwkJCQkJCSAqIFdlIGZhaWxlZCB0byByZWFjcXVpcmUKKwkJCQkJCSAqIHRoZSBpbm9kZSBsb2NrIHdpdGhvdXQKKwkJCQkJCSAqIHNsZWVwaW5nLCBzbyBqdXN0IHNraXAKKwkJCQkJCSAqIHRoZSBpbm9kZSBmb3Igbm93LiAgV2UKKwkJCQkJCSAqIGNsZWFyIHRoZSBJTE9DSyBiaXQgZnJvbQorCQkJCQkJICogdGhlIGxvY2tfZmxhZ3Mgc28gdGhhdCB3ZQorCQkJCQkJICogd29uJ3QgdHJ5IHRvIGRyb3AgYSBsb2NrCisJCQkJCQkgKiB3ZSBkb24ndCBob2xkIGJlbG93LgorCQkJCQkJICovCisJCQkJCQlsb2NrX2ZsYWdzICY9IH5YRlNfSUxPQ0tfU0hBUkVEOworCQkJCQkJSVBPSU5URVJfUkVNT1ZFKGlwX25leHQsIG1wKTsKKwkJCQkJfSBlbHNlIGlmICgoeGZzX2lwaW5jb3VudChpcCkgPT0gMCkgJiYKKwkJCQkJCSAgIHhmc19pZmxvY2tfbm93YWl0KGlwKSkgeworCQkJCQkJQVNTRVJUKGlwLT5pX21vdW50ID09IG1wKTsKKwkJCQkJCS8qCisJCQkJCQkgKiBTaW5jZSB0aGlzIGlzIHZmc19zeW5jKCkKKwkJCQkJCSAqIGNhbGxpbmcgd2Ugb25seSBmbHVzaCB0aGUKKwkJCQkJCSAqIGlub2RlIG91dCBpZiB3ZSBjYW4gbG9jaworCQkJCQkJICogaXQgd2l0aG91dCBzbGVlcGluZyBhbmQKKwkJCQkJCSAqIGl0IGlzIG5vdCBwaW5uZWQuICBEcm9wCisJCQkJCQkgKiB0aGUgbW91bnQgbG9jayBoZXJlIHNvCisJCQkJCQkgKiB0aGF0IHdlIGRvbid0IGhvbGQgaXQgZm9yCisJCQkJCQkgKiB0b28gbG9uZy4gV2UgYWxyZWFkeSBoYXZlCisJCQkJCQkgKiBhIG1hcmtlciBpbiB0aGUgbGlzdCBoZXJlLgorCQkJCQkJICovCisJCQkJCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7CisJCQkJCQltb3VudF9sb2NrZWQgPSBCX0ZBTFNFOworCQkJCQkJZXJyb3IgPSB4ZnNfaWZsdXNoKGlwLAorCQkJCQkJCSAgIFhGU19JRkxVU0hfREVMV1JJKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCUFTU0VSVChpcC0+aV9tb3VudCA9PSBtcCk7CisJCQkJCQlJUE9JTlRFUl9SRU1PVkUoaXBfbmV4dCwgbXApOworCQkJCQl9CisJCQkJfQorCisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCWlmICgoZmxhZ3MgJiBTWU5DX0FUVFIpICYmCisJCQkgICAgKChpcC0+aV91cGRhdGVfY29yZSkgfHwKKwkJCSAgICAgKChpcC0+aV9pdGVtcCAhPSBOVUxMKSAmJgorCQkJICAgICAgKGlwLT5pX2l0ZW1wLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgIT0gMCkpKSkgeworCQkJCWlmIChtb3VudF9sb2NrZWQpIHsKKwkJCQkJSVBPSU5URVJfSU5TRVJUKGlwLCBtcCk7CisJCQkJfQorCisJCQkJaWYgKGZsYWdzICYgU1lOQ19XQUlUKSB7CisJCQkJCXhmc19pZmxvY2soaXApOworCQkJCQllcnJvciA9IHhmc19pZmx1c2goaXAsCisJCQkJCQkJICAgWEZTX0lGTFVTSF9TWU5DKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBJZiB3ZSBjYW4ndCBhY3F1aXJlIHRoZSBmbHVzaAorCQkJCQkgKiBsb2NrLCB0aGVuIHRoZSBpbm9kZSBpcyBhbHJlYWR5CisJCQkJCSAqIGJlaW5nIGZsdXNoZWQgc28gZG9uJ3QgYm90aGVyCisJCQkJCSAqIHdhaXRpbmcuICBJZiB3ZSBjYW4gbG9jayBpdCB0aGVuCisJCQkJCSAqIGRvIGEgZGVsd3JpIGZsdXNoIHNvIHdlIGNhbgorCQkJCQkgKiBjb21iaW5lIG11bHRpcGxlIGlub2RlIGZsdXNoZXMKKwkJCQkJICogaW4gZWFjaCBkaXNrIHdyaXRlLgorCQkJCQkgKi8KKwkJCQkJaWYgKHhmc19pZmxvY2tfbm93YWl0KGlwKSkgeworCQkJCQkJZXJyb3IgPSB4ZnNfaWZsdXNoKGlwLAorCQkJCQkJCSAgIFhGU19JRkxVU0hfREVMV1JJKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChieXBhc3NlZCkKKwkJCQkJCSgqYnlwYXNzZWQpKys7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGxvY2tfZmxhZ3MgIT0gMCkgeworCQkJeGZzX2l1bmxvY2soaXAsIGxvY2tfZmxhZ3MpOworCQl9CisKKwkJaWYgKHZub2RlX3JlZmVkKSB7CisJCQkvKgorCQkJICogSWYgd2UgaGFkIHRvIHRha2UgYSByZWZlcmVuY2Ugb24gdGhlIHZub2RlCisJCQkgKiBhYm92ZSwgdGhlbiB3YWl0IHVudGlsIGFmdGVyIHdlJ3ZlIHVubG9ja2VkCisJCQkgKiB0aGUgaW5vZGUgdG8gcmVsZWFzZSB0aGUgcmVmZXJlbmNlLiAgVGhpcyBpcworCQkJICogYmVjYXVzZSB3ZSBjYW4gYmUgYWxyZWFkeSBob2xkaW5nIHRoZSBpbm9kZQorCQkJICogbG9jayB3aGVuIFZOX1JFTEUoKSBjYWxscyB4ZnNfaW5hY3RpdmUoKS4KKwkJCSAqCisJCQkgKiBNYWtlIHN1cmUgdG8gZHJvcCB0aGUgbW91bnQgbG9jayBiZWZvcmUgY2FsbGluZworCQkJICogVk5fUkVMRSgpIHNvIHRoYXQgd2UgZG9uJ3QgdHJpcCBvdmVyIG91cnNlbHZlcyBpZgorCQkJICogd2UgaGF2ZSB0byBnbyBmb3IgdGhlIG1vdW50IGxvY2sgYWdhaW4gaW4gdGhlCisJCQkgKiBpbmFjdGl2ZSBjb2RlLgorCQkJICovCisJCQlpZiAobW91bnRfbG9ja2VkKSB7CisJCQkJSVBPSU5URVJfSU5TRVJUKGlwLCBtcCk7CisJCQl9CisKKwkJCVZOX1JFTEUodnApOworCisJCQl2bm9kZV9yZWZlZCA9IEJfRkFMU0U7CisJCX0KKworCQlpZiAoZXJyb3IpIHsKKwkJCWxhc3RfZXJyb3IgPSBlcnJvcjsKKwkJfQorCisJCS8qCisJCSAqIGJhaWwgb3V0IGlmIHRoZSBmaWxlc3lzdGVtIGlzIGNvcnJ1cHRlZC4KKwkJICovCisJCWlmIChlcnJvciA9PSBFRlNDT1JSVVBURUQpICB7CisJCQlpZiAoIW1vdW50X2xvY2tlZCkgeworCQkJCVhGU19NT1VOVF9JTE9DSyhtcCk7CisJCQkJSVBPSU5URVJfUkVNT1ZFKGlwLCBtcCk7CisJCQl9CisJCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7CisJCQlBU1NFUlQoaXBvaW50ZXJfaW4gPT0gQl9GQUxTRSk7CisJCQlrbWVtX2ZyZWUoaXBvaW50ZXIsIHNpemVvZih4ZnNfaXB0cl90KSk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKKwkJfQorCisJCS8qIExldCBvdGhlciB0aHJlYWRzIGhhdmUgYSBjaGFuY2UgYXQgdGhlIG1vdW50IGxvY2sKKwkJICogaWYgd2UgaGF2ZSBsb29wZWQgbWFueSB0aW1lcyB3aXRob3V0IGRyb3BwaW5nIHRoZQorCQkgKiBsb2NrLgorCQkgKi8KKwkJaWYgKCgrK3ByZWVtcHQgJiBYRlNfUFJFRU1QVF9NQVNLKSA9PSAwKSB7CisJCQlpZiAobW91bnRfbG9ja2VkKSB7CisJCQkJSVBPSU5URVJfSU5TRVJUKGlwLCBtcCk7CisJCQl9CisJCX0KKworCQlpZiAobW91bnRfbG9ja2VkID09IEJfRkFMU0UpIHsKKwkJCVhGU19NT1VOVF9JTE9DSyhtcCk7CisJCQltb3VudF9sb2NrZWQgPSBCX1RSVUU7CisJCQlJUE9JTlRFUl9SRU1PVkUoaXAsIG1wKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJQVNTRVJUKGlwb2ludGVyX2luID09IEJfRkFMU0UpOworCQlpcCA9IGlwLT5pX21uZXh0OworCisJfSB3aGlsZSAoaXAgIT0gbXAtPm1faW5vZGVzKTsKKworCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKKworCUFTU0VSVChpcG9pbnRlcl9pbiA9PSBCX0ZBTFNFKTsKKworCWttZW1fZnJlZShpcG9pbnRlciwgc2l6ZW9mKHhmc19pcHRyX3QpKTsKKwlyZXR1cm4gWEZTX0VSUk9SKGxhc3RfZXJyb3IpOworfQorCisvKgorICogeGZzIHN5bmMgcm91dGluZSBmb3IgaW50ZXJuYWwgdXNlCisgKgorICogVGhpcyByb3V0aW5lIHN1cHBvcnRzIGFsbCBvZiB0aGUgZmxhZ3MgZGVmaW5lZCBmb3IgdGhlIGdlbmVyaWMgVkZTX1NZTkMKKyAqIGludGVyZmFjZSBhcyBleHBsYWluZWQgYWJvdmUgdW5kZXIgeGZzX3N5bmMuICBJbiB0aGUgaW50ZXJlc3RzIG9mIG5vdAorICogY2hhbmdpbmcgaW50ZXJmYWNlcyB3aXRoaW4gdGhlIDYuNSBmYW1pbHksIGFkZGl0aW9uYWwgaW50ZXJuYWxsbHktCisgKiByZXF1aXJlZCBmdW5jdGlvbnMgYXJlIHNwZWNpZmllZCB3aXRoaW4gYSBzZXBhcmF0ZSB4ZmxhZ3MgcGFyYW1ldGVyLAorICogb25seSBhdmFpbGFibGUgYnkgY2FsbGluZyB0aGlzIHJvdXRpbmUuCisgKgorICovCitpbnQKK3hmc19zeW5jc3ViKAorCXhmc19tb3VudF90CSptcCwKKwlpbnQJCWZsYWdzLAorCWludCAgICAgICAgICAgICB4ZmxhZ3MsCisJaW50ICAgICAgICAgICAgICpieXBhc3NlZCkKK3sKKwlpbnQJCWVycm9yID0gMDsKKwlpbnQJCWxhc3RfZXJyb3IgPSAwOworCXVpbnQJCWxvZ19mbGFncyA9IFhGU19MT0dfRk9SQ0U7CisJeGZzX2J1Zl90CSpicDsKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKKworCS8qCisJICogU3luYyBvdXQgdGhlIGxvZy4gIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBsb2cgaXMgcGVyaW9kaWNhbGx5CisJICogZmx1c2hlZCBldmVuIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggYWN0aXZpdHkgdG8gZmlsbCBpdCB1cC4KKwkgKi8KKwlpZiAoZmxhZ3MgJiBTWU5DX1dBSVQpCisJCWxvZ19mbGFncyB8PSBYRlNfTE9HX1NZTkM7CisKKwl4ZnNfbG9nX2ZvcmNlKG1wLCAoeGZzX2xzbl90KTAsIGxvZ19mbGFncyk7CisKKwlpZiAoZmxhZ3MgJiAoU1lOQ19BVFRSfFNZTkNfREVMV1JJKSkgeworCQlpZiAoZmxhZ3MgJiBTWU5DX0JERkxVU0gpCisJCQl4ZnNfZmluaXNoX3JlY2xhaW1fYWxsKG1wLCAxKTsKKwkJZWxzZQorCQkJZXJyb3IgPSB4ZnNfc3luY19pbm9kZXMobXAsIGZsYWdzLCB4ZmxhZ3MsIGJ5cGFzc2VkKTsKKwl9CisKKwkvKgorCSAqIEZsdXNoaW5nIG91dCBkaXJ0eSBkYXRhIGFib3ZlIHByb2JhYmx5IGdlbmVyYXRlZCBtb3JlCisJICogbG9nIGFjdGl2aXR5LCBzbyBpZiB0aGlzIGlzbid0IHZmc19zeW5jKCkgdGhlbiBmbHVzaAorCSAqIHRoZSBsb2cgYWdhaW4uCisJICovCisJaWYgKGZsYWdzICYgU1lOQ19ERUxXUkkpIHsKKwkJeGZzX2xvZ19mb3JjZShtcCwgKHhmc19sc25fdCkwLCBsb2dfZmxhZ3MpOworCX0KKworCWlmIChmbGFncyAmIFNZTkNfRlNEQVRBKSB7CisJCS8qCisJCSAqIElmIHRoaXMgaXMgdmZzX3N5bmMoKSB0aGVuIG9ubHkgc3luYyB0aGUgc3VwZXJibG9jaworCQkgKiBpZiB3ZSBjYW4gbG9jayBpdCB3aXRob3V0IHNsZWVwaW5nIGFuZCBpdCBpcyBub3QgcGlubmVkLgorCQkgKi8KKwkJaWYgKGZsYWdzICYgU1lOQ19CREZMVVNIKSB7CisJCQlicCA9IHhmc19nZXRzYihtcCwgWEZTX0JVRl9UUllMT0NLKTsKKwkJCWlmIChicCAhPSBOVUxMKSB7CisJCQkJYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAseGZzX2J1Zl9sb2dfaXRlbV90Kik7CisJCQkJaWYgKChiaXAgIT0gTlVMTCkgJiYKKwkJCQkgICAgeGZzX2J1Zl9pdGVtX2RpcnR5KGJpcCkpIHsKKwkJCQkJaWYgKCEoWEZTX0JVRl9JU1BJTk5FRChicCkpKSB7CisJCQkJCQlYRlNfQlVGX0FTWU5DKGJwKTsKKwkJCQkJCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOworCQkJCQl9IGVsc2UgeworCQkJCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlicCA9IHhmc19nZXRzYihtcCwgMCk7CisJCQkvKgorCQkJICogSWYgdGhlIGJ1ZmZlciBpcyBwaW5uZWQgdGhlbiBwdXNoIG9uIHRoZSBsb2cgc28KKwkJCSAqIHdlIHdvbid0IGdldCBzdHVjayB3YWl0aW5nIGluIHRoZSB3cml0ZSBmb3IKKwkJCSAqIHNvbWVvbmUsIG1heWJlIG91cnNlbHZlcywgdG8gZmx1c2ggdGhlIGxvZy4KKwkJCSAqIEV2ZW4gdGhvdWdoIHdlIGp1c3QgcHVzaGVkIHRoZSBsb2cgYWJvdmUsIHdlCisJCQkgKiBkaWQgbm90IGhhdmUgdGhlIHN1cGVyYmxvY2sgYnVmZmVyIGxvY2tlZCBhdAorCQkJICogdGhhdCBwb2ludCBzbyBpdCBjYW4gYmVjb21lIHBpbm5lZCBpbiBiZXR3ZWVuCisJCQkgKiB0aGVyZSBhbmQgaGVyZS4KKwkJCSAqLworCQkJaWYgKFhGU19CVUZfSVNQSU5ORUQoYnApKQorCQkJCXhmc19sb2dfZm9yY2UobXAsICh4ZnNfbHNuX3QpMCwgWEZTX0xPR19GT1JDRSk7CisJCQlpZiAoZmxhZ3MgJiBTWU5DX1dBSVQpCisJCQkJWEZTX0JVRl9VTkFTWU5DKGJwKTsKKwkJCWVsc2UKKwkJCQlYRlNfQlVGX0FTWU5DKGJwKTsKKwkJCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOworCQl9CisJCWlmIChlcnJvcikgeworCQkJbGFzdF9lcnJvciA9IGVycm9yOworCQl9CisJfQorCisJLyoKKwkgKiBJZiB0aGlzIGlzIHRoZSBwZXJpb2RpYyBzeW5jLCB0aGVuIGtpY2sgc29tZSBlbnRyaWVzIG91dCBvZgorCSAqIHRoZSByZWZlcmVuY2UgY2FjaGUuICBUaGlzIGVuc3VyZXMgdGhhdCBpZGxlIGVudHJpZXMgYXJlCisJICogZXZlbnR1YWxseSBraWNrZWQgb3V0IG9mIHRoZSBjYWNoZS4KKwkgKi8KKwlpZiAoZmxhZ3MgJiBTWU5DX1JFRkNBQ0hFKSB7CisJCXhmc19yZWZjYWNoZV9wdXJnZV9zb21lKG1wKTsKKwl9CisKKwkvKgorCSAqIE5vdyBjaGVjayB0byBzZWUgaWYgdGhlIGxvZyBuZWVkcyBhICJkdW1teSIgdHJhbnNhY3Rpb24uCisJICovCisKKwlpZiAoIShmbGFncyAmIFNZTkNfUkVNT1VOVCkgJiYgeGZzX2xvZ19uZWVkX2NvdmVyZWQobXApKSB7CisJCXhmc190cmFuc190ICp0cDsKKwkJeGZzX2lub2RlX3QgKmlwOworCisJCS8qCisJCSAqIFB1dCBhIGR1bW15IHRyYW5zYWN0aW9uIGluIHRoZSBsb2cgdG8gdGVsbAorCQkgKiByZWNvdmVyeSB0aGF0IGFsbCBvdGhlcnMgYXJlIE9LLgorCQkgKi8KKwkJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19EVU1NWTEpOworCQlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsCisJCQkJWEZTX0lDSEFOR0VfTE9HX1JFUyhtcCksCisJCQkJMCwgMCwgMCkpKSAgeworCQkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKworCQlpcCA9IG1wLT5tX3Jvb3RpcDsKKwkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKwkJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOworCQllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIDAsIE5VTEwpOworCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl4ZnNfbG9nX2ZvcmNlKG1wLCAoeGZzX2xzbl90KTAsIGxvZ19mbGFncyk7CisJfQorCisJLyoKKwkgKiBXaGVuIHNodXR0aW5nIGRvd24sIHdlIG5lZWQgdG8gaW5zdXJlIHRoYXQgdGhlIEFJTCBpcyBwdXNoZWQKKwkgKiB0byBkaXNrIG9yIHRoZSBmaWxlc3lzdGVtIGNhbiBhcHBlYXIgY29ycnVwdCBmcm9tIHRoZSBQUk9NLgorCSAqLworCWlmICgoZmxhZ3MgJiAoU1lOQ19DTE9TRXxTWU5DX1dBSVQpKSA9PSAoU1lOQ19DTE9TRXxTWU5DX1dBSVQpKSB7CisJCVhGU19iZmx1c2gobXAtPm1fZGRldl90YXJncCk7CisJCWlmIChtcC0+bV9ydGRldl90YXJncCkgeworCQkJWEZTX2JmbHVzaChtcC0+bV9ydGRldl90YXJncCk7CisJCX0KKwl9CisKKwlyZXR1cm4gWEZTX0VSUk9SKGxhc3RfZXJyb3IpOworfQorCisvKgorICogeGZzX3ZnZXQgLSBjYWxsZWQgYnkgRE1BUEkgYW5kIE5GU0QgdG8gZ2V0IHZub2RlIGZyb20gZmlsZSBoYW5kbGUKKyAqLworU1RBVElDIGludAoreGZzX3ZnZXQoCisJYmh2X2Rlc2NfdAkqYmRwLAorCXZub2RlX3QJCSoqdnBwLAorCWZpZF90CQkqZmlkcCkKK3sKKwl4ZnNfbW91bnRfdAkqbXAgPSBYRlNfQkhWVE9NKGJkcCk7CisJeGZzX2ZpZF90CSp4ZmlkID0gKHN0cnVjdCB4ZnNfZmlkICopZmlkcDsKKwl4ZnNfaW5vZGVfdAkqaXA7CisJaW50CQllcnJvcjsKKwl4ZnNfaW5vX3QJaW5vOworCXVuc2lnbmVkIGludAlpZ2VuOworCisJLyoKKwkgKiBJbnZhbGlkLiAgU2luY2UgaGFuZGxlcyBjYW4gYmUgY3JlYXRlZCBpbiB1c2VyIHNwYWNlIGFuZCBwYXNzZWQgaW4KKwkgKiB2aWEgZ2V0aGFuZGxlKCksIHRoaXMgaXMgbm90IGNhdXNlIGZvciBhIHBhbmljLgorCSAqLworCWlmICh4ZmlkLT54ZnNfZmlkX2xlbiAhPSBzaXplb2YoKnhmaWQpIC0gc2l6ZW9mKHhmaWQtPnhmc19maWRfbGVuKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCisJaW5vICA9IHhmaWQtPnhmc19maWRfaW5vOworCWlnZW4gPSB4ZmlkLT54ZnNfZmlkX2dlbjsKKworCS8qCisJICogTkZTIGNhbiBzb21ldGltZXMgc2VuZCByZXF1ZXN0cyBmb3IgaW5vIDAuICBGYWlsIHRoZW0gZ3JhY2VmdWxseS4KKwkgKi8KKwlpZiAoaW5vID09IDApCisJCXJldHVybiBYRlNfRVJST1IoRVNUQUxFKTsKKworCWVycm9yID0geGZzX2lnZXQobXAsIE5VTEwsIGlubywgMCwgWEZTX0lMT0NLX1NIQVJFRCwgJmlwLCAwKTsKKwlpZiAoZXJyb3IpIHsKKwkJKnZwcCA9IE5VTEw7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlpZiAoaXAgPT0gTlVMTCkgeworCQkqdnBwID0gTlVMTDsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCX0KKworCWlmIChpcC0+aV9kLmRpX21vZGUgPT0gMCB8fCBpcC0+aV9kLmRpX2dlbiAhPSBpZ2VuKSB7CisJCXhmc19pcHV0X25ldyhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJCSp2cHAgPSBOVUxMOworCQlyZXR1cm4gWEZTX0VSUk9SKEVOT0VOVCk7CisJfQorCisJKnZwcCA9IFhGU19JVE9WKGlwKTsKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJcmV0dXJuIDA7Cit9CisKKworI2RlZmluZSBNTlRPUFRfTE9HQlVGUwkibG9nYnVmcyIJLyogbnVtYmVyIG9mIFhGUyBsb2cgYnVmZmVycyAqLworI2RlZmluZSBNTlRPUFRfTE9HQlNJWkUJImxvZ2JzaXplIgkvKiBzaXplIG9mIFhGUyBsb2cgYnVmZmVycyAqLworI2RlZmluZSBNTlRPUFRfTE9HREVWCSJsb2dkZXYiCS8qIGxvZyBkZXZpY2UgKi8KKyNkZWZpbmUgTU5UT1BUX1JUREVWCSJydGRldiIJCS8qIHJlYWx0aW1lIEkvTyBkZXZpY2UgKi8KKyNkZWZpbmUgTU5UT1BUX0JJT1NJWkUJImJpb3NpemUiCS8qIGxvZzIgb2YgcHJlZmVycmVkIGJ1ZmZlcmVkIGlvIHNpemUgKi8KKyNkZWZpbmUgTU5UT1BUX1dTWU5DCSJ3c3luYyIJCS8qIHNhZmUtbW9kZSBuZnMgY29tcGF0aWJsZSBtb3VudCAqLworI2RlZmluZSBNTlRPUFRfSU5PNjQJImlubzY0IgkJLyogZm9yY2UgaW5vZGVzIGludG8gNjQtYml0IHJhbmdlICovCisjZGVmaW5lIE1OVE9QVF9OT0FMSUdOCSJub2FsaWduIgkvKiB0dXJuIG9mZiBzdHJpcGUgYWxpZ25tZW50ICovCisjZGVmaW5lIE1OVE9QVF9TV0FMTE9DCSJzd2FsbG9jIgkvKiB0dXJuIG9uIHN0cmlwZSB3aWR0aCBhbGxvY2F0aW9uICovCisjZGVmaW5lIE1OVE9QVF9TVU5JVAkic3VuaXQiCQkvKiBkYXRhIHZvbHVtZSBzdHJpcGUgdW5pdCAqLworI2RlZmluZSBNTlRPUFRfU1dJRFRICSJzd2lkdGgiCS8qIGRhdGEgdm9sdW1lIHN0cmlwZSB3aWR0aCAqLworI2RlZmluZSBNTlRPUFRfTk9VVUlECSJub3V1aWQiCS8qIGlnbm9yZSBmaWxlc3lzdGVtIFVVSUQgKi8KKyNkZWZpbmUgTU5UT1BUX01UUFQJIm10cHQiCQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisjZGVmaW5lIE1OVE9QVF9JSEFTSFNJWkUgICAgImloYXNoc2l6ZSIgICAgLyogc2l6ZSBvZiBpbm9kZSBoYXNoIHRhYmxlICovCisjZGVmaW5lIE1OVE9QVF9OT1JFQ09WRVJZICAgIm5vcmVjb3ZlcnkiICAgLyogZG9uJ3QgcnVuIFhGUyByZWNvdmVyeSAqLworI2RlZmluZSBNTlRPUFRfTk9MT0dGTFVTSCAgICJub2xvZ2ZsdXNoIiAgIC8qIGRvbid0IGhhcmQgZmx1c2ggb24gbG9nIHdyaXRlcyAqLworI2RlZmluZSBNTlRPUFRfT1NZTkNJU09TWU5DICJvc3luY2lzb3N5bmMiIC8qIG9fc3luYyBpcyBSRUFMTFkgb19zeW5jICovCisjZGVmaW5lIE1OVE9QVF82NEJJVElOT0RFICAgImlub2RlNjQiCS8qIGlub2RlcyBjYW4gYmUgYWxsb2NhdGVkIGFueXdoZXJlICovCisjZGVmaW5lIE1OVE9QVF9JS0VFUAkiaWtlZXAiCQkvKiBkbyBub3QgZnJlZSBlbXB0eSBpbm9kZSBjbHVzdGVycyAqLworI2RlZmluZSBNTlRPUFRfTk9JS0VFUAkibm9pa2VlcCIJLyogZnJlZSBlbXB0eSBpbm9kZSBjbHVzdGVycyAqLworCisKK2ludAoreGZzX3BhcnNlYXJncygKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpiaHYsCisJY2hhcgkJCSpvcHRpb25zLAorCXN0cnVjdCB4ZnNfbW91bnRfYXJncwkqYXJncywKKwlpbnQJCQl1cGRhdGUpCit7CisJc3RydWN0IHZmcwkJKnZmc3AgPSBiaHZ0b3ZmcyhiaHYpOworCWNoYXIJCQkqdGhpc19jaGFyLCAqdmFsdWUsICplb3Y7CisJaW50CQkJZHN1bml0LCBkc3dpZHRoLCB2b2xfZHN1bml0LCB2b2xfZHN3aWR0aDsKKwlpbnQJCQlpb3NpemU7CisKKyNpZiAwCS8qIFhYWDogb2ZmIGJ5IGRlZmF1bHQsIHVudGlsIHNvbWUgcmVtYWluaW5nIGlzc3VlcyBpcm9uZWQgb3V0ICovCisJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0lERUxFVEU7IC8qIGRlZmF1bHQgdG8gb24gKi8KKyNlbmRpZgorCisJaWYgKCFvcHRpb25zKQorCQlyZXR1cm4gMDsKKworCWlvc2l6ZSA9IGRzdW5pdCA9IGRzd2lkdGggPSB2b2xfZHN1bml0ID0gdm9sX2Rzd2lkdGggPSAwOworCisJd2hpbGUgKCh0aGlzX2NoYXIgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJaWYgKCEqdGhpc19jaGFyKQorCQkJY29udGludWU7CisJCWlmICgodmFsdWUgPSBzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCQkJKnZhbHVlKysgPSAwOworCisJCWlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0xPR0JVRlMpKSB7CisJCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKKwkJCQlwcmludGsoIlhGUzogJXMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iLAorCQkJCQlNTlRPUFRfTE9HQlVGUyk7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKwkJCWFyZ3MtPmxvZ2J1ZnMgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgJmVvdiwgMTApOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTE9HQlNJWkUpKSB7CisJCQlpbnQJbGFzdCwgaW5fa2lsb2J5dGVzID0gMDsKKworCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7CisJCQkJcHJpbnRrKCJYRlM6ICVzIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudFxuIiwKKwkJCQkJTU5UT1BUX0xPR0JTSVpFKTsKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJfQorCQkJbGFzdCA9IHN0cmxlbih2YWx1ZSkgLSAxOworCQkJaWYgKHZhbHVlW2xhc3RdID09ICdLJyB8fCB2YWx1ZVtsYXN0XSA9PSAnaycpIHsKKwkJCQlpbl9raWxvYnl0ZXMgPSAxOworCQkJCXZhbHVlW2xhc3RdID0gJ1wwJzsKKwkJCX0KKwkJCWFyZ3MtPmxvZ2J1ZnNpemUgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgJmVvdiwgMTApOworCQkJaWYgKGluX2tpbG9ieXRlcykKKwkJCQlhcmdzLT5sb2didWZzaXplIDw8PSAxMDsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0xPR0RFVikpIHsKKwkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkgeworCQkJCXByaW50aygiWEZTOiAlcyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIsCisJCQkJCU1OVE9QVF9MT0dERVYpOworCQkJCXJldHVybiBFSU5WQUw7CisJCQl9CisJCQlzdHJuY3B5KGFyZ3MtPmxvZ25hbWUsIHZhbHVlLCBNQVhOQU1FTEVOKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX01UUFQpKSB7CisJCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKKwkJCQlwcmludGsoIlhGUzogJXMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iLAorCQkJCQlNTlRPUFRfTVRQVCk7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKwkJCXN0cm5jcHkoYXJncy0+bXRwdCwgdmFsdWUsIE1BWE5BTUVMRU4pOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfUlRERVYpKSB7CisJCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKKwkJCQlwcmludGsoIlhGUzogJXMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iLAorCQkJCQlNTlRPUFRfUlRERVYpOworCQkJCXJldHVybiBFSU5WQUw7CisJCQl9CisJCQlzdHJuY3B5KGFyZ3MtPnJ0bmFtZSwgdmFsdWUsIE1BWE5BTUVMRU4pOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfQklPU0laRSkpIHsKKwkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkgeworCQkJCXByaW50aygiWEZTOiAlcyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIsCisJCQkJCU1OVE9QVF9CSU9TSVpFKTsgCisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKwkJCWlvc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmZW92LCAxMCk7CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfSU9TSVpFOworCQkJYXJncy0+aW9zaXplbG9nID0gKHVpbnQ4X3QpIGlvc2l6ZTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0lIQVNIU0laRSkpIHsKKwkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkgeworCQkJCXByaW50aygiWEZTOiAlcyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIsCisJCQkJCXRoaXNfY2hhcik7IAorCQkJCXJldHVybiBFSU5WQUw7CisJCQl9CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfSUhBU0hTSVpFOworCQkJYXJncy0+aWhhc2hzaXplID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZlb3YsIDEwKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1dTWU5DKSkgeworCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX1dTWU5DOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfT1NZTkNJU09TWU5DKSkgeworCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX09TWU5DSVNPU1lOQzsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX05PUkVDT1ZFUlkpKSB7CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfTk9SRUNPVkVSWTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0lOTzY0KSkgeworCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0lOTzY0OworI2lmICFYRlNfQklHX0lOVU1TCisJCQlwcmludGsoIlhGUzogJXMgb3B0aW9uIG5vdCBhbGxvd2VkIG9uIHRoaXMgc3lzdGVtXG4iLAorCQkJCU1OVE9QVF9JTk82NCk7CisJCQlyZXR1cm4gRUlOVkFMOworI2VuZGlmCisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9OT0FMSUdOKSkgeworCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX05PQUxJR047CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9TV0FMTE9DKSkgeworCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX1NXQUxMT0M7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9TVU5JVCkpIHsKKwkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkgeworCQkJCXByaW50aygiWEZTOiAlcyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIsCisJCQkJCU1OVE9QVF9TVU5JVCk7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKwkJCWRzdW5pdCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmZW92LCAxMCk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9TV0lEVEgpKSB7CisJCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKKwkJCQlwcmludGsoIlhGUzogJXMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iLAorCQkJCQlNTlRPUFRfU1dJRFRIKTsKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJfQorCQkJZHN3aWR0aCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmZW92LCAxMCk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF82NEJJVElOT0RFKSkgeworCQkJYXJncy0+ZmxhZ3MgJj0gflhGU01OVF8zMkJJVElOT0RFUzsKKyNpZiAhWEZTX0JJR19JTlVNUworCQkJcHJpbnRrKCJYRlM6ICVzIG9wdGlvbiBub3QgYWxsb3dlZCBvbiB0aGlzIHN5c3RlbVxuIiwKKwkJCQlNTlRPUFRfNjRCSVRJTk9ERSk7CisJCQlyZXR1cm4gRUlOVkFMOworI2VuZGlmCisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9OT1VVSUQpKSB7CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfTk9VVUlEOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9MT0dGTFVTSCkpIHsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9OT0xPR0ZMVVNIOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfSUtFRVApKSB7CisJCQlhcmdzLT5mbGFncyAmPSB+WEZTTU5UX0lERUxFVEU7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9OT0lLRUVQKSkgeworCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0lERUxFVEU7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJvc3luY2lzZHN5bmMiKSkgeworCQkJLyogbm8tb3AsIHRoaXMgaXMgbm93IHRoZSBkZWZhdWx0ICovCitwcmludGsoIlhGUzogb3N5bmNpc2RzeW5jIGlzIG5vdyB0aGUgZGVmYXVsdCwgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuXG4iKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgImlyaXhzZ2lkIikpIHsKK3ByaW50aygiWEZTOiBpcml4c2dpZCBpcyBub3cgYSBzeXNjdGwoMikgdmFyaWFibGUsIG9wdGlvbiBpcyBkZXByZWNhdGVkLlxuIik7CisJCX0gZWxzZSB7CisJCQlwcmludGsoIlhGUzogdW5rbm93biBtb3VudCBvcHRpb24gWyVzXS5cbiIsIHRoaXNfY2hhcik7CisJCQlyZXR1cm4gRUlOVkFMOworCQl9CisJfQorCisJaWYgKGFyZ3MtPmZsYWdzICYgWEZTTU5UX05PUkVDT1ZFUlkpIHsKKwkJaWYgKCh2ZnNwLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpID09IDApIHsKKwkJCXByaW50aygiWEZTOiBuby1yZWNvdmVyeSBtb3VudHMgbXVzdCBiZSByZWFkLW9ubHkuXG4iKTsKKwkJCXJldHVybiBFSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoKGFyZ3MtPmZsYWdzICYgWEZTTU5UX05PQUxJR04pICYmIChkc3VuaXQgfHwgZHN3aWR0aCkpIHsKKwkJcHJpbnRrKAorCSJYRlM6IHN1bml0IGFuZCBzd2lkdGggb3B0aW9ucyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgbm9hbGlnbiBvcHRpb25cbiIpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKworCWlmICgoZHN1bml0ICYmICFkc3dpZHRoKSB8fCAoIWRzdW5pdCAmJiBkc3dpZHRoKSkgeworCQlwcmludGsoIlhGUzogc3VuaXQgYW5kIHN3aWR0aCBtdXN0IGJlIHNwZWNpZmllZCB0b2dldGhlclxuIik7CisJCXJldHVybiBFSU5WQUw7CisJfQorCisJaWYgKGRzdW5pdCAmJiAoZHN3aWR0aCAlIGRzdW5pdCAhPSAwKSkgeworCQlwcmludGsoCisJIlhGUzogc3RyaXBlIHdpZHRoICglZCkgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBzdHJpcGUgdW5pdCAoJWQpXG4iLAorCQkJZHN3aWR0aCwgZHN1bml0KTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisKKwlpZiAoKGFyZ3MtPmZsYWdzICYgWEZTTU5UX05PQUxJR04pICE9IFhGU01OVF9OT0FMSUdOKSB7CisJCWlmIChkc3VuaXQpIHsKKwkJCWFyZ3MtPnN1bml0ID0gZHN1bml0OworCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX1JFVEVSUjsKKwkJfSBlbHNlIHsKKwkJCWFyZ3MtPnN1bml0ID0gdm9sX2RzdW5pdDsKKwkJfQorCQlkc3dpZHRoID8gKGFyZ3MtPnN3aWR0aCA9IGRzd2lkdGgpIDoKKwkJCSAgKGFyZ3MtPnN3aWR0aCA9IHZvbF9kc3dpZHRoKTsKKwl9IGVsc2UgeworCQlhcmdzLT5zdW5pdCA9IGFyZ3MtPnN3aWR0aCA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludAoreGZzX3Nob3dhcmdzKAorCXN0cnVjdCBiaHZfZGVzYwkJKmJodiwKKwlzdHJ1Y3Qgc2VxX2ZpbGUJCSptKQoreworCXN0YXRpYyBzdHJ1Y3QgcHJvY194ZnNfaW5mbyB7CisJCWludAlmbGFnOworCQljaGFyCSpzdHI7CisJfSB4ZnNfaW5mb1tdID0geworCQkvKiB0aGUgZmV3IHNpbXBsZSBvbmVzIHdlIGNhbiBnZXQgZnJvbSB0aGUgbW91bnQgc3RydWN0ICovCisJCXsgWEZTX01PVU5UX1dTWU5DLAkJIiwiIE1OVE9QVF9XU1lOQyB9LAorCQl7IFhGU19NT1VOVF9JTk82NCwJCSIsIiBNTlRPUFRfSU5PNjQgfSwKKwkJeyBYRlNfTU9VTlRfTk9BTElHTiwJCSIsIiBNTlRPUFRfTk9BTElHTiB9LAorCQl7IFhGU19NT1VOVF9TV0FMTE9DLAkJIiwiIE1OVE9QVF9TV0FMTE9DIH0sCisJCXsgWEZTX01PVU5UX05PVVVJRCwJCSIsIiBNTlRPUFRfTk9VVUlEIH0sCisJCXsgWEZTX01PVU5UX05PUkVDT1ZFUlksCQkiLCIgTU5UT1BUX05PUkVDT1ZFUlkgfSwKKwkJeyBYRlNfTU9VTlRfT1NZTkNJU09TWU5DLAkiLCIgTU5UT1BUX09TWU5DSVNPU1lOQyB9LAorCQl7IFhGU19NT1VOVF9OT0xPR0ZMVVNILAkJIiwiIE1OVE9QVF9OT0xPR0ZMVVNIIH0sCisJCXsgWEZTX01PVU5UX0lERUxFVEUsCQkiLCIgTU5UT1BUX05PSUtFRVAgfSwKKwkJeyAwLCBOVUxMIH0KKwl9OworCXN0cnVjdCBwcm9jX3hmc19pbmZvCSp4ZnNfaW5mb3A7CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBYRlNfQkhWVE9NKGJodik7CisKKwlmb3IgKHhmc19pbmZvcCA9IHhmc19pbmZvOyB4ZnNfaW5mb3AtPmZsYWc7IHhmc19pbmZvcCsrKSB7CisJCWlmIChtcC0+bV9mbGFncyAmIHhmc19pbmZvcC0+ZmxhZykKKwkJCXNlcV9wdXRzKG0sIHhmc19pbmZvcC0+c3RyKTsKKwl9CisKKwlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfSUhBU0hTSVpFKQorCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfSUhBU0hTSVpFICI9JWQiLCBtcC0+bV9paHNpemUpOworCisJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0RGTFRfSU9TSVpFKQorCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfQklPU0laRSAiPSVkIiwgbXAtPm1fd3JpdGVpb19sb2cpOworCisJaWYgKG1wLT5tX2xvZ2J1ZnMgPiAwKQorCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfTE9HQlVGUyAiPSVkIiwgbXAtPm1fbG9nYnVmcyk7CisKKwlpZiAobXAtPm1fbG9nYnNpemUgPiAwKQorCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfTE9HQlNJWkUgIj0lZCIsIG1wLT5tX2xvZ2JzaXplKTsKKworCWlmIChtcC0+bV9kZGV2X3RhcmdwICE9IG1wLT5tX2xvZ2Rldl90YXJncCkKKwkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX0xPR0RFViAiPSVzIiwKKwkJCQlYRlNfQlVGVEFSR19OQU1FKG1wLT5tX2xvZ2Rldl90YXJncCkpOworCisJaWYgKG1wLT5tX3J0ZGV2X3RhcmdwICYmIG1wLT5tX2RkZXZfdGFyZ3AgIT0gbXAtPm1fcnRkZXZfdGFyZ3ApCisJCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9SVERFViAiPSVzIiwKKwkJCQlYRlNfQlVGVEFSR19OQU1FKG1wLT5tX3J0ZGV2X3RhcmdwKSk7CisKKwlpZiAobXAtPm1fZGFsaWduID4gMCkKKwkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX1NVTklUICI9JWQiLAorCQkJCShpbnQpWEZTX0ZTQl9UT19CQihtcCwgbXAtPm1fZGFsaWduKSk7CisKKwlpZiAobXAtPm1fc3dpZHRoID4gMCkKKwkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX1NXSURUSCAiPSVkIiwKKwkJCQkoaW50KVhGU19GU0JfVE9fQkIobXAsIG1wLT5tX3N3aWR0aCkpOworCisJaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfMzJCSVRJTk9PUFQpKQorCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfNjRCSVRJTk9ERSk7CisJCisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfZnJlZXplKAorCWJodl9kZXNjX3QJKmJkcCkKK3sKKwl4ZnNfbW91bnRfdAkqbXAgPSBYRlNfQkhWVE9NKGJkcCk7CisKKwl3aGlsZSAoYXRvbWljX3JlYWQoJm1wLT5tX2FjdGl2ZV90cmFucykgPiAwKQorCQlkZWxheSgxMDApOworCisJLyogUHVzaCB0aGUgc3VwZXJibG9jayBhbmQgd3JpdGUgYW4gdW5tb3VudCByZWNvcmQgKi8KKwl4ZnNfbG9nX3VubW91bnRfd3JpdGUobXApOworCXhmc191bm1vdW50ZnNfd3JpdGVzYihtcCk7Cit9CisKKwordmZzb3BzX3QgeGZzX3Zmc29wcyA9IHsKKwlCSFZfSURFTlRJVFlfSU5JVChWRlNfQkhWX1hGUyxWRlNfUE9TSVRJT05fWEZTKSwKKwkudmZzX3BhcnNlYXJncwkJPSB4ZnNfcGFyc2VhcmdzLAorCS52ZnNfc2hvd2FyZ3MJCT0geGZzX3Nob3dhcmdzLAorCS52ZnNfbW91bnQJCT0geGZzX21vdW50LAorCS52ZnNfdW5tb3VudAkJPSB4ZnNfdW5tb3VudCwKKwkudmZzX21udHVwZGF0ZQkJPSB4ZnNfbW50dXBkYXRlLAorCS52ZnNfcm9vdAkJPSB4ZnNfcm9vdCwKKwkudmZzX3N0YXR2ZnMJCT0geGZzX3N0YXR2ZnMsCisJLnZmc19zeW5jCQk9IHhmc19zeW5jLAorCS52ZnNfdmdldAkJPSB4ZnNfdmdldCwKKwkudmZzX2RtYXBpb3BzCQk9ICh2ZnNfZG1hcGlvcHNfdClmc19ub3N5cywKKwkudmZzX3F1b3RhY3RsCQk9ICh2ZnNfcXVvdGFjdGxfdClmc19ub3N5cywKKwkudmZzX2luaXRfdm5vZGUJCT0geGZzX2luaXRpYWxpemVfdm5vZGUsCisJLnZmc19mb3JjZV9zaHV0ZG93bgk9IHhmc19kb19mb3JjZV9zaHV0ZG93biwKKwkudmZzX2ZyZWV6ZQkJPSB4ZnNfZnJlZXplLAorfTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYyBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDA5Mjk2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc192bm9kZW9wcy5jCkBAIC0wLDAgKzEsNDcxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0ci5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgInhmc19yZWZjYWNoZS5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgorI2luY2x1ZGUgInhmc19xdW90YS5oIgorI2luY2x1ZGUgInhmc191dGlscy5oIgorI2luY2x1ZGUgInhmc190cmFuc19zcGFjZS5oIgorI2luY2x1ZGUgInhmc19kaXJfbGVhZi5oIgorI2luY2x1ZGUgInhmc19tYWMuaCIKKyNpbmNsdWRlICJ4ZnNfbG9nX3ByaXYuaCIKKworCisvKgorICogVGhlIG1heGltdW0gcGF0aGxlbiBpcyAxMDI0IGJ5dGVzLiBTaW5jZSB0aGUgbWluaW11bSBmaWxlIHN5c3RlbQorICogYmxvY2tzaXplIGlzIDUxMiBieXRlcywgd2UgY2FuIGdldCBhIG1heCBvZiAyIGV4dGVudHMgYmFjayBmcm9tCisgKiBibWFwaS4KKyAqLworI2RlZmluZSBTWU1MSU5LX01BUFMgMgorCisvKgorICogRm9yIHhmcywgd2UgY2hlY2sgdGhhdCB0aGUgZmlsZSBpc24ndCB0b28gYmlnIHRvIGJlIG9wZW5lZCBieSB0aGlzIGtlcm5lbC4KKyAqIE5vIG90aGVyIG9wZW4gYWN0aW9uIGlzIHJlcXVpcmVkIGZvciByZWd1bGFyIGZpbGVzLiAgRGV2aWNlcyBhcmUgaGFuZGxlZAorICogdGhyb3VnaCB0aGUgc3BlY2ZzIGZpbGUgc3lzdGVtLCBwaXBlcyB0aHJvdWdoIGZpZm9mcy4gIERldmljZSBhbmQKKyAqIGZpZm8gdm5vZGVzIGFyZSAid3JhcHBlZCIgYnkgc3BlY2ZzIGFuZCBmaWZvZnMgdm5vZGVzLCByZXNwZWN0aXZlbHksCisgKiB3aGVuIGEgbmV3IHZub2RlIGlzIGZpcnN0IGxvb2tlZCB1cCBvciBjcmVhdGVkLgorICovCitTVEFUSUMgaW50Cit4ZnNfb3BlbigKKwliaHZfZGVzY190CSpiZHAsCisJY3JlZF90CQkqY3JlZHApCit7CisJaW50CQltb2RlOworCXZub2RlX3QJCSp2cDsKKwl4ZnNfaW5vZGVfdAkqaXA7CisKKwl2cCA9IEJIVl9UT19WTk9ERShiZHApOworCWlwID0gWEZTX0JIVlRPSShiZHApOworCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisKKwkvKgorCSAqIElmIGl0J3MgYSBkaXJlY3Rvcnkgd2l0aCBhbnkgYmxvY2tzLCByZWFkLWFoZWFkIGJsb2NrIDAKKwkgKiBhcyB3ZSdyZSBhbG1vc3QgY2VydGFpbiB0byBoYXZlIHRoZSBuZXh0IG9wZXJhdGlvbiBiZSBhIHJlYWQgdGhlcmUuCisJICovCisJaWYgKHZwLT52X3R5cGUgPT0gVkRJUiAmJiBpcC0+aV9kLmRpX25leHRlbnRzID4gMCkgeworCQltb2RlID0geGZzX2lsb2NrX21hcF9zaGFyZWQoaXApOworCQlpZiAoaXAtPmlfZC5kaV9uZXh0ZW50cyA+IDApCisJCQkodm9pZCl4ZnNfZGFfcmVhZGFfYnVmKE5VTEwsIGlwLCAwLCBYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2l1bmxvY2soaXAsIG1vZGUpOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICogeGZzX2dldGF0dHIKKyAqLworU1RBVElDIGludAoreGZzX2dldGF0dHIoCisJYmh2X2Rlc2NfdAkqYmRwLAorCXZhdHRyX3QJCSp2YXAsCisJaW50CQlmbGFncywKKwljcmVkX3QJCSpjcmVkcCkKK3sKKwl4ZnNfaW5vZGVfdAkqaXA7CisJeGZzX21vdW50X3QJKm1wOworCXZub2RlX3QJCSp2cDsKKworCXZwICA9IEJIVl9UT19WTk9ERShiZHApOworCXZuX3RyYWNlX2VudHJ5KHZwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKworCWlwID0gWEZTX0JIVlRPSShiZHApOworCW1wID0gaXAtPmlfbW91bnQ7CisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKworCWlmICghKGZsYWdzICYgQVRUUl9MQVpZKSkKKwkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKworCXZhcC0+dmFfc2l6ZSA9IGlwLT5pX2QuZGlfc2l6ZTsKKwlpZiAodmFwLT52YV9tYXNrID09IFhGU19BVF9TSVpFKQorCQlnb3RvIGFsbF9kb25lOworCisJdmFwLT52YV9uYmxvY2tzID0KKwkJWEZTX0ZTQl9UT19CQihtcCwgaXAtPmlfZC5kaV9uYmxvY2tzICsgaXAtPmlfZGVsYXllZF9ibGtzKTsKKwl2YXAtPnZhX25vZGVpZCA9IGlwLT5pX2lubzsKKyNpZiBYRlNfQklHX0lOVU1TCisJdmFwLT52YV9ub2RlaWQgKz0gbXAtPm1faW5vYWRkOworI2VuZGlmCisJdmFwLT52YV9ubGluayA9IGlwLT5pX2QuZGlfbmxpbms7CisKKwkvKgorCSAqIFF1aWNrIGV4aXQgZm9yIG5vbi1zdGF0IGNhbGxlcnMKKwkgKi8KKwlpZiAoKHZhcC0+dmFfbWFzayAmCisJICAgIH4oWEZTX0FUX1NJWkV8WEZTX0FUX0ZTSUR8WEZTX0FUX05PREVJRHwKKwkgICAgICBYRlNfQVRfTkxJTkt8WEZTX0FUX0JMS1NJWkUpKSA9PSAwKQorCQlnb3RvIGFsbF9kb25lOworCisJLyoKKwkgKiBDb3B5IGZyb20gaW4tY29yZSBpbm9kZS4KKwkgKi8KKwl2YXAtPnZhX3R5cGUgPSB2cC0+dl90eXBlOworCXZhcC0+dmFfbW9kZSA9IGlwLT5pX2QuZGlfbW9kZSAmIE1PREVNQVNLOworCXZhcC0+dmFfdWlkID0gaXAtPmlfZC5kaV91aWQ7CisJdmFwLT52YV9naWQgPSBpcC0+aV9kLmRpX2dpZDsKKwl2YXAtPnZhX3Byb2ppZCA9IGlwLT5pX2QuZGlfcHJvamlkOworCisJLyoKKwkgKiBDaGVjayB2bm9kZSB0eXBlIGJsb2NrL2NoYXIgdnMuIGV2ZXJ5dGhpbmcgZWxzZS4KKwkgKiBEbyBpdCB3aXRoIGJpdG1hc2sgYmVjYXVzZSB0aGF0J3MgZmFzdGVyIHRoYW4gbG9va2luZworCSAqIGZvciBtdWx0aXBsZSB2YWx1ZXMgaW5kaXZpZHVhbGx5LgorCSAqLworCWlmICgoKDEgPDwgdnAtPnZfdHlwZSkgJiAoKDE8PFZCTEspIHwgKDE8PFZDSFIpKSkgPT0gMCkgeworCQl2YXAtPnZhX3JkZXYgPSAwOworCisJCWlmICghKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSkgeworCisjaWYgMAorCQkJLyogTGFyZ2UgYmxvY2sgc2l6ZXMgY29uZnVzZSB2YXJpb3VzCisJCQkgKiB1c2VyIHNwYWNlIHByb2dyYW1zLCBzbyBsZXR0aW5nIHRoZQorCQkJICogc3RyaXBlIHNpemUgdGhyb3VnaCBpcyBub3QgYSBnb29kCisJCQkgKiBpZGVhIGZvciBub3cuCisJCQkgKi8KKwkJCXZhcC0+dmFfYmxvY2tzaXplID0gbXAtPm1fc3dpZHRoID8KKwkJCQkvKgorCQkJCSAqIElmIHRoZSB1bmRlcmx5aW5nIHZvbHVtZSBpcyBhIHN0cmlwZSwgdGhlbgorCQkJCSAqIHJldHVybiB0aGUgc3RyaXBlIHdpZHRoIGluIGJ5dGVzIGFzIHRoZQorCQkJCSAqIHJlY29tbWVuZGVkIEkvTyBzaXplLgorCQkJCSAqLworCQkJCShtcC0+bV9zd2lkdGggPDwgbXAtPm1fc2Iuc2JfYmxvY2tsb2cpIDoKKwkJCQkvKgorCQkJCSAqIFJldHVybiB0aGUgbGFyZ2VzdCBvZiB0aGUgcHJlZmVycmVkIGJ1ZmZlcgorCQkJCSAqIHNpemVzIHNpbmNlIGRvaW5nIHNtYWxsIEkvT3MgaW50byBsYXJnZXIKKwkJCQkgKiBidWZmZXJzIGNhdXNlcyBidWZmZXJzIHRvIGJlIGRlY29tbWlzc2lvbmVkLgorCQkJCSAqIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyBpbiBieXRlcy4KKwkJCQkgKi8KKwkJCQkoMSA8PCAoaW50KU1BWChtcC0+bV9yZWFkaW9fbG9nLAorCQkJCQkgICAgICAgbXAtPm1fd3JpdGVpb19sb2cpKTsKKworI2Vsc2UKKwkJCXZhcC0+dmFfYmxvY2tzaXplID0KKwkJCQkvKgorCQkJCSAqIFJldHVybiB0aGUgbGFyZ2VzdCBvZiB0aGUgcHJlZmVycmVkIGJ1ZmZlcgorCQkJCSAqIHNpemVzIHNpbmNlIGRvaW5nIHNtYWxsIEkvT3MgaW50byBsYXJnZXIKKwkJCQkgKiBidWZmZXJzIGNhdXNlcyBidWZmZXJzIHRvIGJlIGRlY29tbWlzc2lvbmVkLgorCQkJCSAqIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyBpbiBieXRlcy4KKwkJCQkgKi8KKwkJCQkxIDw8IChpbnQpTUFYKG1wLT5tX3JlYWRpb19sb2csCisJCQkJCSAgICAgICBtcC0+bV93cml0ZWlvX2xvZyk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKworCQkJLyoKKwkJCSAqIElmIHRoZSBmaWxlIGJsb2NrcyBhcmUgYmVpbmcgYWxsb2NhdGVkIGZyb20gYQorCQkJICogcmVhbHRpbWUgcGFydGl0aW9uLCB0aGVuIHJldHVybiB0aGUgaW5vZGUncworCQkJICogcmVhbHRpbWUgZXh0ZW50IHNpemUgb3IgdGhlIHJlYWx0aW1lIHZvbHVtZSdzCisJCQkgKiBleHRlbnQgc2l6ZS4KKwkJCSAqLworCQkJdmFwLT52YV9ibG9ja3NpemUgPSBpcC0+aV9kLmRpX2V4dHNpemUgPworCQkJCShpcC0+aV9kLmRpX2V4dHNpemUgPDwgbXAtPm1fc2Iuc2JfYmxvY2tsb2cpIDoKKwkJCQkobXAtPm1fc2Iuc2JfcmV4dHNpemUgPDwgbXAtPm1fc2Iuc2JfYmxvY2tsb2cpOworCQl9CisJfSBlbHNlIHsKKwkJdmFwLT52YV9yZGV2ID0gaXAtPmlfZGYuaWZfdTIuaWZfcmRldjsKKwkJdmFwLT52YV9ibG9ja3NpemUgPSBCTEtERVZfSU9TSVpFOworCX0KKworCXZhcC0+dmFfYXRpbWUudHZfc2VjID0gaXAtPmlfZC5kaV9hdGltZS50X3NlYzsKKwl2YXAtPnZhX2F0aW1lLnR2X25zZWMgPSBpcC0+aV9kLmRpX2F0aW1lLnRfbnNlYzsKKwl2YXAtPnZhX210aW1lLnR2X3NlYyA9IGlwLT5pX2QuZGlfbXRpbWUudF9zZWM7CisJdmFwLT52YV9tdGltZS50dl9uc2VjID0gaXAtPmlfZC5kaV9tdGltZS50X25zZWM7CisJdmFwLT52YV9jdGltZS50dl9zZWMgPSBpcC0+aV9kLmRpX2N0aW1lLnRfc2VjOworCXZhcC0+dmFfY3RpbWUudHZfbnNlYyA9IGlwLT5pX2QuZGlfY3RpbWUudF9uc2VjOworCisJLyoKKwkgKiBFeGl0IGZvciBzdGF0IGNhbGxlcnMuICBTZWUgaWYgYW55IG9mIHRoZSByZXN0IG9mIHRoZSBmaWVsZHMKKwkgKiB0byBiZSBmaWxsZWQgaW4gYXJlIG5lZWRlZC4KKwkgKi8KKwlpZiAoKHZhcC0+dmFfbWFzayAmCisJICAgICAoWEZTX0FUX1hGTEFHU3xYRlNfQVRfRVhUU0laRXxYRlNfQVRfTkVYVEVOVFN8WEZTX0FUX0FORVhURU5UU3wKKwkgICAgICBYRlNfQVRfR0VOQ09VTlR8WEZTX0FUX1ZDT0RFKSkgPT0gMCkKKwkJZ290byBhbGxfZG9uZTsKKworCS8qCisJICogQ29udmVydCBkaV9mbGFncyB0byB4ZmxhZ3MuCisJICovCisJdmFwLT52YV94ZmxhZ3MgPSB4ZnNfaXAyeGZsYWdzKGlwKTsKKworCS8qCisJICogRXhpdCBmb3IgaW5vZGUgcmV2YWxpZGF0ZS4gIFNlZSBpZiBhbnkgb2YgdGhlIHJlc3Qgb2YKKwkgKiB0aGUgZmllbGRzIHRvIGJlIGZpbGxlZCBpbiBhcmUgbmVlZGVkLgorCSAqLworCWlmICgodmFwLT52YV9tYXNrICYKKwkgICAgIChYRlNfQVRfRVhUU0laRXxYRlNfQVRfTkVYVEVOVFN8WEZTX0FUX0FORVhURU5UU3wKKwkgICAgICBYRlNfQVRfR0VOQ09VTlR8WEZTX0FUX1ZDT0RFKSkgPT0gMCkKKwkJZ290byBhbGxfZG9uZTsKKworCXZhcC0+dmFfZXh0c2l6ZSA9IGlwLT5pX2QuZGlfZXh0c2l6ZSA8PCBtcC0+bV9zYi5zYl9ibG9ja2xvZzsKKwl2YXAtPnZhX25leHRlbnRzID0KKwkJKGlwLT5pX2RmLmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykgPworCQkJaXAtPmlfZGYuaWZfYnl0ZXMgLyBzaXplb2YoeGZzX2JtYnRfcmVjX3QpIDoKKwkJCWlwLT5pX2QuZGlfbmV4dGVudHM7CisJaWYgKGlwLT5pX2FmcCkKKwkJdmFwLT52YV9hbmV4dGVudHMgPQorCQkJKGlwLT5pX2FmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSA/CisJCQkJaXAtPmlfYWZwLT5pZl9ieXRlcyAvIHNpemVvZih4ZnNfYm1idF9yZWNfdCkgOgorCQkJCSBpcC0+aV9kLmRpX2FuZXh0ZW50czsKKwllbHNlCisJCXZhcC0+dmFfYW5leHRlbnRzID0gMDsKKwl2YXAtPnZhX2dlbiA9IGlwLT5pX2QuZGlfZ2VuOworCisgYWxsX2RvbmU6CisJaWYgKCEoZmxhZ3MgJiBBVFRSX0xBWlkpKQorCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIHhmc19zZXRhdHRyCisgKi8KK2ludAoreGZzX3NldGF0dHIoCisJYmh2X2Rlc2NfdAkJKmJkcCwKKwl2YXR0cl90CQkJKnZhcCwKKwlpbnQJCQlmbGFncywKKwljcmVkX3QJCQkqY3JlZHApCit7CisJeGZzX2lub2RlX3QJCSppcDsKKwl4ZnNfdHJhbnNfdAkJKnRwOworCXhmc19tb3VudF90CQkqbXA7CisJaW50CQkJbWFzazsKKwlpbnQJCQljb2RlOworCXVpbnQJCQlsb2NrX2ZsYWdzOworCXVpbnQJCQljb21taXRfZmxhZ3M9MDsKKwl1aWRfdAkJCXVpZD0wLCBpdWlkPTA7CisJZ2lkX3QJCQlnaWQ9MCwgaWdpZD0wOworCWludAkJCXRpbWVmbGFncyA9IDA7CisJdm5vZGVfdAkJCSp2cDsKKwl4ZnNfcHJpZF90CQlwcm9qaWQ9MCwgaXByb2ppZD0wOworCWludAkJCW1hbmRsb2NrX2JlZm9yZSwgbWFuZGxvY2tfYWZ0ZXI7CisJc3RydWN0IHhmc19kcXVvdAkqdWRxcCwgKmdkcXAsICpvbGRkcXVvdDEsICpvbGRkcXVvdDI7CisJaW50CQkJZmlsZV9vd25lcjsKKwlpbnQJCQluZWVkX2lvbG9jayA9IChmbGFncyAmIEFUVFJfRE1JKSA9PSAwOworCisJdnAgPSBCSFZfVE9fVk5PREUoYmRwKTsKKwl2bl90cmFjZV9lbnRyeSh2cCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwlpZiAodnAtPnZfdmZzcC0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVST0ZTKTsKKworCS8qCisJICogQ2Fubm90IHNldCBjZXJ0YWluIGF0dHJpYnV0ZXMuCisJICovCisJbWFzayA9IHZhcC0+dmFfbWFzazsKKwlpZiAobWFzayAmIFhGU19BVF9OT1NFVCkgeworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJfQorCisJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CisJbXAgPSBpcC0+aV9tb3VudDsKKworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCisJLyoKKwkgKiBUaW1lc3RhbXBzIGRvIG5vdCBuZWVkIHRvIGJlIGxvZ2dlZCBhbmQgaGVuY2UgZG8gbm90CisJICogbmVlZCB0byBiZSBkb25lIHdpdGhpbiBhIHRyYW5zYWN0aW9uLgorCSAqLworCWlmIChtYXNrICYgWEZTX0FUX1VQRFRJTUVTKSB7CisJCUFTU0VSVCgobWFzayAmIH5YRlNfQVRfVVBEVElNRVMpID09IDApOworCQl0aW1lZmxhZ3MgPSAoKG1hc2sgJiBYRlNfQVRfVVBEQVRJTUUpID8gWEZTX0lDSEdUSU1FX0FDQyA6IDApIHwKKwkJCSAgICAoKG1hc2sgJiBYRlNfQVRfVVBEQ1RJTUUpID8gWEZTX0lDSEdUSU1FX0NIRyA6IDApIHwKKwkJCSAgICAoKG1hc2sgJiBYRlNfQVRfVVBETVRJTUUpID8gWEZTX0lDSEdUSU1FX01PRCA6IDApOworCQl4ZnNfaWNoZ3RpbWUoaXAsIHRpbWVmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCW9sZGRxdW90MSA9IG9sZGRxdW90MiA9IE5VTEw7CisJdWRxcCA9IGdkcXAgPSBOVUxMOworCisJLyoKKwkgKiBJZiBkaXNrIHF1b3RhcyBpcyBvbiwgd2UgbWFrZSBzdXJlIHRoYXQgdGhlIGRxdW90cyBkbyBleGlzdCBvbiBkaXNrLAorCSAqIGJlZm9yZSB3ZSBzdGFydCBhbnkgb3RoZXIgdHJhbnNhY3Rpb25zLiBUcnlpbmcgdG8gZG8gdGhpcyBsYXRlcgorCSAqIGlzIG1lc3N5LiBXZSBkb24ndCBjYXJlIHRvIHRha2UgYSByZWFkbG9jayB0byBsb29rIGF0IHRoZSBpZHMKKwkgKiBpbiBpbm9kZSBoZXJlLCBiZWNhdXNlIHdlIGNhbid0IGhvbGQgaXQgYWNyb3NzIHRoZSB0cmFuc19yZXNlcnZlLgorCSAqIElmIHRoZSBJRHMgZG8gY2hhbmdlIGJlZm9yZSB3ZSB0YWtlIHRoZSBpbG9jaywgd2UncmUgY292ZXJlZAorCSAqIGJlY2F1c2UgdGhlIGlfKmRxdW90IGZpZWxkcyB3aWxsIGdldCB1cGRhdGVkIGFueXdheS4KKwkgKi8KKwlpZiAoWEZTX0lTX1FVT1RBX09OKG1wKSAmJiAobWFzayAmIChYRlNfQVRfVUlEfFhGU19BVF9HSUQpKSkgeworCQl1aW50CXFmbGFncyA9IDA7CisKKwkJaWYgKG1hc2sgJiBYRlNfQVRfVUlEKSB7CisJCQl1aWQgPSB2YXAtPnZhX3VpZDsKKwkJCXFmbGFncyB8PSBYRlNfUU1PUFRfVVFVT1RBOworCQl9IGVsc2UgeworCQkJdWlkID0gaXAtPmlfZC5kaV91aWQ7CisJCX0KKwkJaWYgKG1hc2sgJiBYRlNfQVRfR0lEKSB7CisJCQlnaWQgPSB2YXAtPnZhX2dpZDsKKwkJCXFmbGFncyB8PSBYRlNfUU1PUFRfR1FVT1RBOworCQl9ICBlbHNlIHsKKwkJCWdpZCA9IGlwLT5pX2QuZGlfZ2lkOworCQl9CisJCS8qCisJCSAqIFdlIHRha2UgYSByZWZlcmVuY2Ugd2hlbiB3ZSBpbml0aWFsaXplIHVkcXAgYW5kIGdkcXAsCisJCSAqIHNvIGl0IGlzIGltcG9ydGFudCB0aGF0IHdlIG5ldmVyIGJsaW5kbHkgZG91YmxlIHRyaXAgb24KKwkJICogdGhlIHNhbWUgdmFyaWFibGUuIFNlZSB4ZnNfY3JlYXRlKCkgZm9yIGFuIGV4YW1wbGUuCisJCSAqLworCQlBU1NFUlQodWRxcCA9PSBOVUxMKTsKKwkJQVNTRVJUKGdkcXAgPT0gTlVMTCk7CisJCWNvZGUgPSBYRlNfUU1fRFFWT1BBTExPQyhtcCwgaXAsIHVpZCxnaWQsIHFmbGFncywgJnVkcXAsICZnZHFwKTsKKwkJaWYgKGNvZGUpCisJCQlyZXR1cm4gKGNvZGUpOworCX0KKworCS8qCisJICogRm9yIHRoZSBvdGhlciBhdHRyaWJ1dGVzLCB3ZSBhY3F1aXJlIHRoZSBpbm9kZSBsb2NrIGFuZAorCSAqIGZpcnN0IGRvIGFuIGVycm9yIGNoZWNraW5nIHBhc3MuCisJICovCisJdHAgPSBOVUxMOworCWxvY2tfZmxhZ3MgPSBYRlNfSUxPQ0tfRVhDTDsKKwlpZiAoIShtYXNrICYgWEZTX0FUX1NJWkUpKSB7CisJCWlmICgobWFzayAhPSAoWEZTX0FUX0NUSU1FfFhGU19BVF9BVElNRXxYRlNfQVRfTVRJTUUpKSB8fAorCQkgICAgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1dTWU5DKSkgeworCQkJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19TRVRBVFRSX05PVF9TSVpFKTsKKwkJCWNvbW1pdF9mbGFncyA9IDA7CisJCQlpZiAoKGNvZGUgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwKKwkJCQkJCSAgICAgWEZTX0lDSEFOR0VfTE9HX1JFUyhtcCksIDAsCisJCQkJCQkgICAgIDAsIDApKSkgeworCQkJCWxvY2tfZmxhZ3MgPSAwOworCQkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKERNX0VWRU5UX0VOQUJMRUQgKHZwLT52X3Zmc3AsIGlwLCBETV9FVkVOVF9UUlVOQ0FURSkgJiYKKwkJICAgICEoZmxhZ3MgJiBBVFRSX0RNSSkpIHsKKwkJCWludCBkbWZsYWdzID0gQVRfREVMQVlfRkxBRyhmbGFncykgfCBETV9TRU1fRkxBR19XUjsKKwkJCWNvZGUgPSBYRlNfU0VORF9EQVRBKG1wLCBETV9FVkVOVF9UUlVOQ0FURSwgdnAsCisJCQkJdmFwLT52YV9zaXplLCAwLCBkbWZsYWdzLCBOVUxMKTsKKwkJCWlmIChjb2RlKSB7CisJCQkJbG9ja19mbGFncyA9IDA7CisJCQkJZ290byBlcnJvcl9yZXR1cm47CisJCQl9CisJCX0KKwkJaWYgKG5lZWRfaW9sb2NrKQorCQkJbG9ja19mbGFncyB8PSBYRlNfSU9MT0NLX0VYQ0w7CisJfQorCisJeGZzX2lsb2NrKGlwLCBsb2NrX2ZsYWdzKTsKKworCS8qIGJvb2xlYW46IGFyZSB3ZSB0aGUgZmlsZSBvd25lcj8gKi8KKwlmaWxlX293bmVyID0gKGN1cnJlbnRfZnN1aWQoY3JlZHApID09IGlwLT5pX2QuZGlfdWlkKTsKKworCS8qCisJICogQ2hhbmdlIHZhcmlvdXMgcHJvcGVydGllcyBvZiBhIGZpbGUuCisJICogT25seSB0aGUgb3duZXIgb3IgdXNlcnMgd2l0aCBDQVBfRk9XTkVSCisJICogY2FwYWJpbGl0eSBtYXkgZG8gdGhlc2UgdGhpbmdzLgorCSAqLworCWlmIChtYXNrICYKKwkgICAgKFhGU19BVF9NT0RFfFhGU19BVF9YRkxBR1N8WEZTX0FUX0VYVFNJWkV8WEZTX0FUX1VJRHwKKwkgICAgIFhGU19BVF9HSUR8WEZTX0FUX1BST0pJRCkpIHsKKwkJLyoKKwkJICogQ0FQX0ZPV05FUiBvdmVycmlkZXMgdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisJCSAqCisJCSAqIFRoZSB1c2VyIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MgbXVzdCBiZSBlcXVhbAorCQkgKiB0byB0aGUgZmlsZSBvd25lciBJRCwgZXhjZXB0IGluIGNhc2VzIHdoZXJlIHRoZQorCQkgKiBDQVBfRlNFVElEIGNhcGFiaWxpdHkgaXMgYXBwbGljYWJsZS4KKwkJICovCisJCWlmICghZmlsZV9vd25lciAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkgeworCQkJY29kZSA9IFhGU19FUlJPUihFUEVSTSk7CisJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCisJCS8qCisJCSAqIENBUF9GU0VUSUQgb3ZlcnJpZGVzIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCQkgKgorCQkgKiBUaGUgZWZmZWN0aXZlIHVzZXIgSUQgb2YgdGhlIGNhbGxpbmcgcHJvY2VzcyBzaGFsbCBtYXRjaAorCQkgKiB0aGUgZmlsZSBvd25lciB3aGVuIHNldHRpbmcgdGhlIHNldC11c2VyLUlEIGFuZAorCQkgKiBzZXQtZ3JvdXAtSUQgYml0cyBvbiB0aGF0IGZpbGUuCisJCSAqCisJCSAqIFRoZSBlZmZlY3RpdmUgZ3JvdXAgSUQgb3Igb25lIG9mIHRoZSBzdXBwbGVtZW50YXJ5IGdyb3VwCisJCSAqIElEcyBvZiB0aGUgY2FsbGluZyBwcm9jZXNzIHNoYWxsIG1hdGNoIHRoZSBncm91cCBvd25lciBvZgorCQkgKiB0aGUgZmlsZSB3aGVuIHNldHRpbmcgdGhlIHNldC1ncm91cC1JRCBiaXQgb24gdGhhdCBmaWxlCisJCSAqLworCQlpZiAobWFzayAmIFhGU19BVF9NT0RFKSB7CisJCQltb2RlX3QgbSA9IDA7CisKKwkJCWlmICgodmFwLT52YV9tb2RlICYgU19JU1VJRCkgJiYgIWZpbGVfb3duZXIpCisJCQkJbSB8PSBTX0lTVUlEOworCQkJaWYgKCh2YXAtPnZhX21vZGUgJiBTX0lTR0lEKSAmJgorCQkJICAgICFpbl9ncm91cF9wKChnaWRfdClpcC0+aV9kLmRpX2dpZCkpCisJCQkJbSB8PSBTX0lTR0lEOworI2lmIDAKKwkJCS8qIExpbnV4IGFsbG93cyB0aGlzLCBJcml4IGRvZXNuJ3QuICovCisJCQlpZiAoKHZhcC0+dmFfbW9kZSAmIFNfSVNWVFgpICYmIHZwLT52X3R5cGUgIT0gVkRJUikKKwkJCQltIHw9IFNfSVNWVFg7CisjZW5kaWYKKwkJCWlmIChtICYmICFjYXBhYmxlKENBUF9GU0VUSUQpKQorCQkJCXZhcC0+dmFfbW9kZSAmPSB+bTsKKwkJfQorCX0KKworCS8qCisJICogQ2hhbmdlIGZpbGUgb3duZXJzaGlwLiAgTXVzdCBiZSB0aGUgb3duZXIgb3IgcHJpdmlsZWdlZC4KKwkgKiBJZiB0aGUgc3lzdGVtIHdhcyBjb25maWd1cmVkIHdpdGggdGhlICJyZXN0cmljdGVkX2Nob3duIgorCSAqIG9wdGlvbiwgdGhlIG93bmVyIGlzIG5vdCBwZXJtaXR0ZWQgdG8gZ2l2ZSBhd2F5IHRoZSBmaWxlLAorCSAqIGFuZCBjYW4gY2hhbmdlIHRoZSBncm91cCBpZCBvbmx5IHRvIGEgZ3JvdXAgb2Ygd2hpY2ggaGUKKwkgKiBvciBzaGUgaXMgYSBtZW1iZXIuCisJICovCisJaWYgKG1hc2sgJiAoWEZTX0FUX1VJRHxYRlNfQVRfR0lEfFhGU19BVF9QUk9KSUQpKSB7CisJCS8qCisJCSAqIFRoZXNlIElEcyBjb3VsZCBoYXZlIGNoYW5nZWQgc2luY2Ugd2UgbGFzdCBsb29rZWQgYXQgdGhlbS4KKwkJICogQnV0LCB3ZSdyZSBhc3N1cmVkIHRoYXQgaWYgdGhlIG93bmVyc2hpcCBkaWQgY2hhbmdlCisJCSAqIHdoaWxlIHdlIGRpZG4ndCBoYXZlIHRoZSBpbm9kZSBsb2NrZWQsIGlub2RlJ3MgZHF1b3QocykKKwkJICogd291bGQgaGF2ZSBjaGFuZ2VkIGFsc28uCisJCSAqLworCQlpdWlkID0gaXAtPmlfZC5kaV91aWQ7CisJCWlwcm9qaWQgPSBpcC0+aV9kLmRpX3Byb2ppZDsKKwkJaWdpZCA9IGlwLT5pX2QuZGlfZ2lkOworCQlnaWQgPSAobWFzayAmIFhGU19BVF9HSUQpID8gdmFwLT52YV9naWQgOiBpZ2lkOworCQl1aWQgPSAobWFzayAmIFhGU19BVF9VSUQpID8gdmFwLT52YV91aWQgOiBpdWlkOworCQlwcm9qaWQgPSAobWFzayAmIFhGU19BVF9QUk9KSUQpID8gKHhmc19wcmlkX3QpdmFwLT52YV9wcm9qaWQgOgorCQkJIGlwcm9qaWQ7CisKKwkJLyoKKwkJICogQ0FQX0NIT1dOIG92ZXJyaWRlcyB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKwkJICoKKwkJICogSWYgX1BPU0lYX0NIT1dOX1JFU1RSSUNURUQgaXMgZGVmaW5lZCwgdGhpcyBjYXBhYmlsaXR5CisJCSAqIHNoYWxsIG92ZXJyaWRlIHRoZSByZXN0cmljdGlvbiB0aGF0IGEgcHJvY2VzcyBjYW5ub3QKKwkJICogY2hhbmdlIHRoZSB1c2VyIElEIG9mIGEgZmlsZSBpdCBvd25zIGFuZCB0aGUgcmVzdHJpY3Rpb24KKwkJICogdGhhdCB0aGUgZ3JvdXAgSUQgc3VwcGxpZWQgdG8gdGhlIGNob3duKCkgZnVuY3Rpb24KKwkJICogc2hhbGwgYmUgZXF1YWwgdG8gZWl0aGVyIHRoZSBncm91cCBJRCBvciBvbmUgb2YgdGhlCisJCSAqIHN1cHBsZW1lbnRhcnkgZ3JvdXAgSURzIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuCisJCSAqCisJCSAqIFhYWDogSG93IGRvZXMgcmVzdHJpY3RlZF9jaG93biBhZmZlY3QgcHJvamlkPworCQkgKi8KKwkJaWYgKHJlc3RyaWN0ZWRfY2hvd24gJiYKKwkJICAgIChpdWlkICE9IHVpZCB8fCAoaWdpZCAhPSBnaWQgJiYKKwkJCQkgICAgICFpbl9ncm91cF9wKChnaWRfdClnaWQpKSkgJiYKKwkJICAgICFjYXBhYmxlKENBUF9DSE9XTikpIHsKKwkJCWNvZGUgPSBYRlNfRVJST1IoRVBFUk0pOworCQkJZ290byBlcnJvcl9yZXR1cm47CisJCX0KKwkJLyoKKwkJICogRG8gYSBxdW90YSByZXNlcnZhdGlvbiBvbmx5IGlmIHVpZCBvciBnaWQgaXMgYWN0dWFsbHkKKwkJICogZ29pbmcgdG8gY2hhbmdlLgorCQkgKi8KKwkJaWYgKChYRlNfSVNfVVFVT1RBX09OKG1wKSAmJiBpdWlkICE9IHVpZCkgfHwKKwkJICAgIChYRlNfSVNfR1FVT1RBX09OKG1wKSAmJiBpZ2lkICE9IGdpZCkpIHsKKwkJCUFTU0VSVCh0cCk7CisJCQljb2RlID0gWEZTX1FNX0RRVk9QQ0hPV05SRVNWKG1wLCB0cCwgaXAsIHVkcXAsIGdkcXAsCisJCQkJCQljYXBhYmxlKENBUF9GT1dORVIpID8KKwkJCQkJCVhGU19RTU9QVF9GT1JDRV9SRVMgOiAwKTsKKwkJCWlmIChjb2RlKQkvKiBvdXQgb2YgcXVvdGEgKi8KKwkJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCX0KKworCS8qCisJICogVHJ1bmNhdGUgZmlsZS4gIE11c3QgaGF2ZSB3cml0ZSBwZXJtaXNzaW9uIGFuZCBub3QgYmUgYSBkaXJlY3RvcnkuCisJICovCisJaWYgKG1hc2sgJiBYRlNfQVRfU0laRSkgeworCQkvKiBTaG9ydCBjaXJjdWl0IHRoZSB0cnVuY2F0ZSBjYXNlIGZvciB6ZXJvIGxlbmd0aCBmaWxlcyAqLworCQlpZiAoKHZhcC0+dmFfc2l6ZSA9PSAwKSAmJgorCQkgICAoaXAtPmlfZC5kaV9zaXplID09IDApICYmIChpcC0+aV9kLmRpX25leHRlbnRzID09IDApKSB7CisJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJbG9ja19mbGFncyAmPSB+WEZTX0lMT0NLX0VYQ0w7CisJCQlpZiAobWFzayAmIFhGU19BVF9DVElNRSkKKwkJCQl4ZnNfaWNoZ3RpbWUoaXAsIFhGU19JQ0hHVElNRV9NT0QgfCBYRlNfSUNIR1RJTUVfQ0hHKTsKKwkJCWNvZGUgPSAwOworCQkJZ290byBlcnJvcl9yZXR1cm47CisJCX0KKworCQlpZiAodnAtPnZfdHlwZSA9PSBWRElSKSB7CisJCQljb2RlID0gWEZTX0VSUk9SKEVJU0RJUik7CisJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJfSBlbHNlIGlmICh2cC0+dl90eXBlICE9IFZSRUcpIHsKKwkJCWNvZGUgPSBYRlNfRVJST1IoRUlOVkFMKTsKKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQl9CisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBkcXVvdHMgYXJlIGF0dGFjaGVkIHRvIHRoZSBpbm9kZS4KKwkJICovCisJCWlmICgoY29kZSA9IFhGU19RTV9EUUFUVEFDSChtcCwgaXAsIFhGU19RTU9QVF9JTE9DS0VEKSkpCisJCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisKKwkvKgorCSAqIENoYW5nZSBmaWxlIGFjY2VzcyBvciBtb2RpZmllZCB0aW1lcy4KKwkgKi8KKwlpZiAobWFzayAmIChYRlNfQVRfQVRJTUV8WEZTX0FUX01USU1FKSkgeworCQlpZiAoIWZpbGVfb3duZXIpIHsKKwkJCWlmICgoZmxhZ3MgJiBBVFRSX1VUSU1FKSAmJgorCQkJICAgICFjYXBhYmxlKENBUF9GT1dORVIpKSB7CisJCQkJY29kZSA9IFhGU19FUlJPUihFUEVSTSk7CisJCQkJZ290byBlcnJvcl9yZXR1cm47CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIENoYW5nZSBleHRlbnQgc2l6ZSBvciByZWFsdGltZSBmbGFnLgorCSAqLworCWlmIChtYXNrICYgKFhGU19BVF9FWFRTSVpFfFhGU19BVF9YRkxBR1MpKSB7CisJCS8qCisJCSAqIENhbid0IGNoYW5nZSBleHRlbnQgc2l6ZSBpZiBhbnkgZXh0ZW50cyBhcmUgYWxsb2NhdGVkLgorCQkgKi8KKwkJaWYgKChpcC0+aV9kLmRpX25leHRlbnRzIHx8IGlwLT5pX2RlbGF5ZWRfYmxrcykgJiYKKwkJICAgIChtYXNrICYgWEZTX0FUX0VYVFNJWkUpICYmCisJCSAgICAoKGlwLT5pX2QuZGlfZXh0c2l6ZSA8PCBtcC0+bV9zYi5zYl9ibG9ja2xvZykgIT0KKwkJICAgICB2YXAtPnZhX2V4dHNpemUpICkgeworCQkJY29kZSA9IFhGU19FUlJPUihFSU5WQUwpOwkvKiBFRkJJRz8gKi8KKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQl9CisKKwkJLyoKKwkJICogQ2FuJ3Qgc2V0IGV4dGVudCBzaXplIHVubGVzcyB0aGUgZmlsZSBpcyBtYXJrZWQsIG9yCisJCSAqIGFib3V0IHRvIGJlIG1hcmtlZCBhcyBhIHJlYWx0aW1lIGZpbGUuCisJCSAqCisJCSAqIFRoaXMgY2hlY2sgd2lsbCBiZSByZW1vdmVkIHdoZW4gZml4ZWQgc2l6ZSBleHRlbnRzCisJCSAqIHdpdGggYnVmZmVyZWQgZGF0YSB3cml0ZXMgaXMgaW1wbGVtZW50ZWQuCisJCSAqCisJCSAqLworCQlpZiAoKG1hc2sgJiBYRlNfQVRfRVhUU0laRSkJCQkmJgorCQkgICAgKChpcC0+aV9kLmRpX2V4dHNpemUgPDwgbXAtPm1fc2Iuc2JfYmxvY2tsb2cpICE9CisJCSAgICAgdmFwLT52YV9leHRzaXplKSAmJgorCQkgICAgKCEoKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSB8fAorCQkgICAgICAgKChtYXNrICYgWEZTX0FUX1hGTEFHUykgJiYKKwkJCSh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19SRUFMVElNRSkpKSkpIHsKKwkJCWNvZGUgPSBYRlNfRVJST1IoRUlOVkFMKTsKKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQl9CisKKwkJLyoKKwkJICogQ2FuJ3QgY2hhbmdlIHJlYWx0aW1lIGZsYWcgaWYgYW55IGV4dGVudHMgYXJlIGFsbG9jYXRlZC4KKwkJICovCisJCWlmIChpcC0+aV9kLmRpX25leHRlbnRzICYmIChtYXNrICYgWEZTX0FUX1hGTEFHUykgJiYKKwkJICAgIChpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkgIT0KKwkJICAgICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19SRUFMVElNRSkpIHsKKwkJCWNvZGUgPSBYRlNfRVJST1IoRUlOVkFMKTsJLyogRUZCSUc/ICovCisJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCQkvKgorCQkgKiBFeHRlbnQgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGFwcHJvcHJpYXRlIGJsb2NrCisJCSAqIHNpemUsIGlmIHNldCBhdCBhbGwuCisJCSAqLworCQlpZiAoKG1hc2sgJiBYRlNfQVRfRVhUU0laRSkgJiYgdmFwLT52YV9leHRzaXplICE9IDApIHsKKwkJCXhmc19leHRsZW5fdAlzaXplOworCisJCQlpZiAoKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSB8fAorCQkJICAgICgobWFzayAmIFhGU19BVF9YRkxBR1MpICYmCisJCQkgICAgKHZhcC0+dmFfeGZsYWdzICYgWEZTX1hGTEFHX1JFQUxUSU1FKSkpIHsKKwkJCQlzaXplID0gbXAtPm1fc2Iuc2JfcmV4dHNpemUgPDwKKwkJCQkgICAgICAgbXAtPm1fc2Iuc2JfYmxvY2tsb2c7CisJCQl9IGVsc2UgeworCQkJCXNpemUgPSBtcC0+bV9zYi5zYl9ibG9ja3NpemU7CisJCQl9CisJCQlpZiAodmFwLT52YV9leHRzaXplICUgc2l6ZSkgeworCQkJCWNvZGUgPSBYRlNfRVJST1IoRUlOVkFMKTsKKwkJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiBJZiByZWFsdGltZSBmbGFnIGlzIHNldCB0aGVuIG11c3QgaGF2ZSByZWFsdGltZSBkYXRhLgorCQkgKi8KKwkJaWYgKChtYXNrICYgWEZTX0FUX1hGTEFHUykgJiYKKwkJICAgICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19SRUFMVElNRSkpIHsKKwkJCWlmICgobXAtPm1fc2Iuc2JfcmJsb2NrcyA9PSAwKSB8fAorCQkJICAgIChtcC0+bV9zYi5zYl9yZXh0c2l6ZSA9PSAwKSB8fAorCQkJICAgIChpcC0+aV9kLmRpX2V4dHNpemUgJSBtcC0+bV9zYi5zYl9yZXh0c2l6ZSkpIHsKKwkJCQljb2RlID0gWEZTX0VSUk9SKEVJTlZBTCk7CisJCQkJZ290byBlcnJvcl9yZXR1cm47CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBDYW4ndCBtb2RpZnkgYW4gaW1tdXRhYmxlL2FwcGVuZC1vbmx5IGZpbGUgdW5sZXNzCisJCSAqIHdlIGhhdmUgYXBwcm9wcmlhdGUgcGVybWlzc2lvbi4KKwkJICovCisJCWlmICgobWFzayAmIFhGU19BVF9YRkxBR1MpICYmCisJCSAgICAoaXAtPmlfZC5kaV9mbGFncyAmCisJCQkJKFhGU19ESUZMQUdfSU1NVVRBQkxFfFhGU19ESUZMQUdfQVBQRU5EKSB8fAorCQkgICAgICh2YXAtPnZhX3hmbGFncyAmCisJCQkJKFhGU19YRkxBR19JTU1VVEFCTEUgfCBYRlNfWEZMQUdfQVBQRU5EKSkpICYmCisJCSAgICAhY2FwYWJsZShDQVBfTElOVVhfSU1NVVRBQkxFKSkgeworCQkJY29kZSA9IFhGU19FUlJPUihFUEVSTSk7CisJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCX0KKworCS8qCisJICogTm93IHdlIGNhbiBtYWtlIHRoZSBjaGFuZ2VzLiAgQmVmb3JlIHdlIGpvaW4gdGhlIGlub2RlCisJICogdG8gdGhlIHRyYW5zYWN0aW9uLCBpZiBYRlNfQVRfU0laRSBpcyBzZXQgdGhlbiB0YWtlIGNhcmUgb2YKKwkgKiB0aGUgcGFydCBvZiB0aGUgdHJ1bmNhdGlvbiB0aGF0IG11c3QgYmUgZG9uZSB3aXRob3V0IHRoZQorCSAqIGlub2RlIGxvY2suICBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIGpvaW5pbmcgdGhlIGlub2RlCisJICogdG8gdGhlIHRyYW5zYWN0aW9uLCBiZWNhdXNlIHRoZSBpbm9kZSBjYW5ub3QgYmUgdW5sb2NrZWQKKwkgKiBvbmNlIGl0IGlzIGEgcGFydCBvZiB0aGUgdHJhbnNhY3Rpb24uCisJICovCisJaWYgKG1hc2sgJiBYRlNfQVRfU0laRSkgeworCQljb2RlID0gMDsKKwkJaWYgKHZhcC0+dmFfc2l6ZSA+IGlwLT5pX2QuZGlfc2l6ZSkKKwkJCWNvZGUgPSB4ZnNfaWdyb3dfc3RhcnQoaXAsIHZhcC0+dmFfc2l6ZSwgY3JlZHApOworCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQlpZiAoIWNvZGUpCisJCQljb2RlID0geGZzX2l0cnVuY2F0ZV9kYXRhKGlwLCB2YXAtPnZhX3NpemUpOworCQlpZiAoY29kZSkgeworCQkJQVNTRVJUKHRwID09IE5VTEwpOworCQkJbG9ja19mbGFncyAmPSB+WEZTX0lMT0NLX0VYQ0w7CisJCQlBU1NFUlQobG9ja19mbGFncyA9PSBYRlNfSU9MT0NLX0VYQ0wpOworCQkJZ290byBlcnJvcl9yZXR1cm47CisJCX0KKwkJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19TRVRBVFRSX1NJWkUpOworCQlpZiAoKGNvZGUgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwKKwkJCQkJICAgICBYRlNfSVRSVU5DQVRFX0xPR19SRVMobXApLCAwLAorCQkJCQkgICAgIFhGU19UUkFOU19QRVJNX0xPR19SRVMsCisJCQkJCSAgICAgWEZTX0lUUlVOQ0FURV9MT0dfQ09VTlQpKSkgeworCQkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCQlpZiAobmVlZF9pb2xvY2spCisJCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CisJCQlyZXR1cm4gY29kZTsKKwkJfQorCQljb21taXRfZmxhZ3MgPSBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTOworCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwl9CisKKwlpZiAodHApIHsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgbG9ja19mbGFncyk7CisJCXhmc190cmFuc19paG9sZCh0cCwgaXApOworCX0KKworCS8qIGRldGVybWluZSB3aGV0aGVyIG1hbmRhdG9yeSBsb2NraW5nIG1vZGUgY2hhbmdlcyAqLworCW1hbmRsb2NrX2JlZm9yZSA9IE1BTkRMT0NLKHZwLCBpcC0+aV9kLmRpX21vZGUpOworCisJLyoKKwkgKiBUcnVuY2F0ZSBmaWxlLiAgTXVzdCBoYXZlIHdyaXRlIHBlcm1pc3Npb24gYW5kIG5vdCBiZSBhIGRpcmVjdG9yeS4KKwkgKi8KKwlpZiAobWFzayAmIFhGU19BVF9TSVpFKSB7CisJCWlmICh2YXAtPnZhX3NpemUgPiBpcC0+aV9kLmRpX3NpemUpIHsKKwkJCXhmc19pZ3Jvd19maW5pc2godHAsIGlwLCB2YXAtPnZhX3NpemUsCisJCQkgICAgIShmbGFncyAmIEFUVFJfRE1JKSk7CisJCX0gZWxzZSBpZiAoKHZhcC0+dmFfc2l6ZSA8PSBpcC0+aV9kLmRpX3NpemUpIHx8CisJCQkgICAoKHZhcC0+dmFfc2l6ZSA9PSAwKSAmJiBpcC0+aV9kLmRpX25leHRlbnRzKSkgeworCQkJLyoKKwkJCSAqIHNpZ25hbCBhIHN5bmMgdHJhbnNhY3Rpb24gdW5sZXNzCisJCQkgKiB3ZSdyZSB0cnVuY2F0aW5nIGFuIGFscmVhZHkgdW5saW5rZWQKKwkJCSAqIGZpbGUgb24gYSB3c3luYyBmaWxlc3lzdGVtCisJCQkgKi8KKwkJCWNvZGUgPSB4ZnNfaXRydW5jYXRlX2ZpbmlzaCgmdHAsIGlwLAorCQkJCQkgICAgKHhmc19mc2l6ZV90KXZhcC0+dmFfc2l6ZSwKKwkJCQkJICAgIFhGU19EQVRBX0ZPUkssCisJCQkJCSAgICAoKGlwLT5pX2QuZGlfbmxpbmsgIT0gMCB8fAorCQkJCQkgICAgICAhKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1dTWU5DKSkKKwkJCQkJICAgICA/IDEgOiAwKSk7CisJCQlpZiAoY29kZSkgeworCQkJCWdvdG8gYWJvcnRfcmV0dXJuOworCQkJfQorCQl9CisJCS8qCisJCSAqIEhhdmUgdG8gZG8gdGhpcyBldmVuIGlmIHRoZSBmaWxlJ3Mgc2l6ZSBkb2Vzbid0IGNoYW5nZS4KKwkJICovCisJCXRpbWVmbGFncyB8PSBYRlNfSUNIR1RJTUVfTU9EIHwgWEZTX0lDSEdUSU1FX0NIRzsKKwl9CisKKwkvKgorCSAqIENoYW5nZSBmaWxlIGFjY2VzcyBtb2Rlcy4KKwkgKi8KKwlpZiAobWFzayAmIFhGU19BVF9NT0RFKSB7CisJCWlwLT5pX2QuZGlfbW9kZSAmPSBTX0lGTVQ7CisJCWlwLT5pX2QuZGlfbW9kZSB8PSB2YXAtPnZhX21vZGUgJiB+U19JRk1UOworCisJCXhmc190cmFuc19sb2dfaW5vZGUgKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisJCXRpbWVmbGFncyB8PSBYRlNfSUNIR1RJTUVfQ0hHOworCX0KKworCS8qCisJICogQ2hhbmdlIGZpbGUgb3duZXJzaGlwLiAgTXVzdCBiZSB0aGUgb3duZXIgb3IgcHJpdmlsZWdlZC4KKwkgKiBJZiB0aGUgc3lzdGVtIHdhcyBjb25maWd1cmVkIHdpdGggdGhlICJyZXN0cmljdGVkX2Nob3duIgorCSAqIG9wdGlvbiwgdGhlIG93bmVyIGlzIG5vdCBwZXJtaXR0ZWQgdG8gZ2l2ZSBhd2F5IHRoZSBmaWxlLAorCSAqIGFuZCBjYW4gY2hhbmdlIHRoZSBncm91cCBpZCBvbmx5IHRvIGEgZ3JvdXAgb2Ygd2hpY2ggaGUKKwkgKiBvciBzaGUgaXMgYSBtZW1iZXIuCisJICovCisJaWYgKG1hc2sgJiAoWEZTX0FUX1VJRHxYRlNfQVRfR0lEfFhGU19BVF9QUk9KSUQpKSB7CisJCS8qCisJCSAqIENBUF9GU0VUSUQgb3ZlcnJpZGVzIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCQkgKgorCQkgKiBUaGUgc2V0LXVzZXItSUQgYW5kIHNldC1ncm91cC1JRCBiaXRzIG9mIGEgZmlsZSB3aWxsIGJlCisJCSAqIGNsZWFyZWQgdXBvbiBzdWNjZXNzZnVsIHJldHVybiBmcm9tIGNob3duKCkKKwkJICovCisJCWlmICgoaXAtPmlfZC5kaV9tb2RlICYgKFNfSVNVSUR8U19JU0dJRCkpICYmCisJCSAgICAhY2FwYWJsZShDQVBfRlNFVElEKSkgeworCQkJaXAtPmlfZC5kaV9tb2RlICY9IH4oU19JU1VJRHxTX0lTR0lEKTsKKwkJfQorCisJCS8qCisJCSAqIENoYW5nZSB0aGUgb3duZXJzaGlwcyBhbmQgcmVnaXN0ZXIgcXVvdGEgbW9kaWZpY2F0aW9ucworCQkgKiBpbiB0aGUgdHJhbnNhY3Rpb24uCisJCSAqLworCQlpZiAoaXVpZCAhPSB1aWQpIHsKKwkJCWlmIChYRlNfSVNfVVFVT1RBX09OKG1wKSkgeworCQkJCUFTU0VSVChtYXNrICYgWEZTX0FUX1VJRCk7CisJCQkJQVNTRVJUKHVkcXApOworCQkJCW9sZGRxdW90MSA9IFhGU19RTV9EUVZPUENIT1dOKG1wLCB0cCwgaXAsCisJCQkJCQkJJmlwLT5pX3VkcXVvdCwgdWRxcCk7CisJCQl9CisJCQlpcC0+aV9kLmRpX3VpZCA9IHVpZDsKKwkJfQorCQlpZiAoaWdpZCAhPSBnaWQpIHsKKwkJCWlmIChYRlNfSVNfR1FVT1RBX09OKG1wKSkgeworCQkJCUFTU0VSVChtYXNrICYgWEZTX0FUX0dJRCk7CisJCQkJQVNTRVJUKGdkcXApOworCQkJCW9sZGRxdW90MiA9IFhGU19RTV9EUVZPUENIT1dOKG1wLCB0cCwgaXAsCisJCQkJCQkJJmlwLT5pX2dkcXVvdCwgZ2RxcCk7CisJCQl9CisJCQlpcC0+aV9kLmRpX2dpZCA9IGdpZDsKKwkJfQorCQlpZiAoaXByb2ppZCAhPSBwcm9qaWQpIHsKKwkJCWlwLT5pX2QuZGlfcHJvamlkID0gcHJvamlkOworCQkJLyoKKwkJCSAqIFdlIG1heSBoYXZlIHRvIHJldiB0aGUgaW5vZGUgYXMgd2VsbCBhcworCQkJICogdGhlIHN1cGVyYmxvY2sgdmVyc2lvbiBudW1iZXIgc2luY2UgcHJvamlkcyBkaWRuJ3QKKwkJCSAqIGV4aXN0IGJlZm9yZSBESU5PREVfVkVSU0lPTl8yIGFuZCBTQl9WRVJTSU9OX05MSU5LLgorCQkJICovCisJCQlpZiAoaXAtPmlfZC5kaV92ZXJzaW9uID09IFhGU19ESU5PREVfVkVSU0lPTl8xKQorCQkJCXhmc19idW1wX2lub192ZXJzMih0cCwgaXApOworCQl9CisKKwkJeGZzX3RyYW5zX2xvZ19pbm9kZSAodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKwkJdGltZWZsYWdzIHw9IFhGU19JQ0hHVElNRV9DSEc7CisJfQorCisKKwkvKgorCSAqIENoYW5nZSBmaWxlIGFjY2VzcyBvciBtb2RpZmllZCB0aW1lcy4KKwkgKi8KKwlpZiAobWFzayAmIChYRlNfQVRfQVRJTUV8WEZTX0FUX01USU1FKSkgeworCQlpZiAobWFzayAmIFhGU19BVF9BVElNRSkgeworCQkJaXAtPmlfZC5kaV9hdGltZS50X3NlYyA9IHZhcC0+dmFfYXRpbWUudHZfc2VjOworCQkJaXAtPmlfZC5kaV9hdGltZS50X25zZWMgPSB2YXAtPnZhX2F0aW1lLnR2X25zZWM7CisJCQlpcC0+aV91cGRhdGVfY29yZSA9IDE7CisJCQl0aW1lZmxhZ3MgJj0gflhGU19JQ0hHVElNRV9BQ0M7CisJCX0KKwkJaWYgKG1hc2sgJiBYRlNfQVRfTVRJTUUpIHsKKwkJCWlwLT5pX2QuZGlfbXRpbWUudF9zZWMgPSB2YXAtPnZhX210aW1lLnR2X3NlYzsKKwkJCWlwLT5pX2QuZGlfbXRpbWUudF9uc2VjID0gdmFwLT52YV9tdGltZS50dl9uc2VjOworCQkJdGltZWZsYWdzICY9IH5YRlNfSUNIR1RJTUVfTU9EOworCQkJdGltZWZsYWdzIHw9IFhGU19JQ0hHVElNRV9DSEc7CisJCX0KKwkJaWYgKHRwICYmIChmbGFncyAmIEFUVFJfVVRJTUUpKQorCQkJeGZzX3RyYW5zX2xvZ19pbm9kZSAodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKwl9CisKKwkvKgorCSAqIENoYW5nZSBYRlMtYWRkZWQgYXR0cmlidXRlcy4KKwkgKi8KKwlpZiAobWFzayAmIChYRlNfQVRfRVhUU0laRXxYRlNfQVRfWEZMQUdTKSkgeworCQlpZiAobWFzayAmIFhGU19BVF9FWFRTSVpFKSB7CisJCQkvKgorCQkJICogQ29udmVydGluZyBieXRlcyB0byBmcyBibG9ja3MuCisJCQkgKi8KKwkJCWlwLT5pX2QuZGlfZXh0c2l6ZSA9IHZhcC0+dmFfZXh0c2l6ZSA+PgorCQkJCW1wLT5tX3NiLnNiX2Jsb2NrbG9nOworCQl9CisJCWlmIChtYXNrICYgWEZTX0FUX1hGTEFHUykgeworCQkJdWludAlkaV9mbGFnczsKKworCQkJLyogY2FuJ3Qgc2V0IFBSRUFMTE9DIHRoaXMgd2F5LCBqdXN0IHByZXNlcnZlIGl0ICovCisJCQlkaV9mbGFncyA9IChpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19QUkVBTExPQyk7CisJCQlpZiAodmFwLT52YV94ZmxhZ3MgJiBYRlNfWEZMQUdfSU1NVVRBQkxFKQorCQkJCWRpX2ZsYWdzIHw9IFhGU19ESUZMQUdfSU1NVVRBQkxFOworCQkJaWYgKHZhcC0+dmFfeGZsYWdzICYgWEZTX1hGTEFHX0FQUEVORCkKKwkJCQlkaV9mbGFncyB8PSBYRlNfRElGTEFHX0FQUEVORDsKKwkJCWlmICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19TWU5DKQorCQkJCWRpX2ZsYWdzIHw9IFhGU19ESUZMQUdfU1lOQzsKKwkJCWlmICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19OT0FUSU1FKQorCQkJCWRpX2ZsYWdzIHw9IFhGU19ESUZMQUdfTk9BVElNRTsKKwkJCWlmICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19OT0RVTVApCisJCQkJZGlfZmxhZ3MgfD0gWEZTX0RJRkxBR19OT0RVTVA7CisJCQlpZiAoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUikgeworCQkJCWlmICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19SVElOSEVSSVQpCisJCQkJCWRpX2ZsYWdzIHw9IFhGU19ESUZMQUdfUlRJTkhFUklUOworCQkJCWlmICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19OT1NZTUxJTktTKQorCQkJCQlkaV9mbGFncyB8PSBYRlNfRElGTEFHX05PU1lNTElOS1M7CisJCQl9IGVsc2UgeworCQkJCWlmICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19SRUFMVElNRSkgeworCQkJCQlkaV9mbGFncyB8PSBYRlNfRElGTEFHX1JFQUxUSU1FOworCQkJCQlpcC0+aV9pb2NvcmUuaW9fZmxhZ3MgfD0gWEZTX0lPQ09SRV9SVDsKKwkJCQl9IGVsc2UgeworCQkJCQlpcC0+aV9pb2NvcmUuaW9fZmxhZ3MgJj0gflhGU19JT0NPUkVfUlQ7CisJCQkJfQorCQkJfQorCQkJaXAtPmlfZC5kaV9mbGFncyA9IGRpX2ZsYWdzOworCQl9CisJCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKwkJdGltZWZsYWdzIHw9IFhGU19JQ0hHVElNRV9DSEc7CisJfQorCisJLyoKKwkgKiBDaGFuZ2UgZmlsZSBpbm9kZSBjaGFuZ2UgdGltZSBvbmx5IGlmIFhGU19BVF9DVElNRSBzZXQKKwkgKiBBTkQgd2UgaGF2ZSBiZWVuIGNhbGxlZCBieSBhIERNSSBmdW5jdGlvbi4KKwkgKi8KKworCWlmICggKGZsYWdzICYgQVRUUl9ETUkpICYmIChtYXNrICYgWEZTX0FUX0NUSU1FKSApIHsKKwkJaXAtPmlfZC5kaV9jdGltZS50X3NlYyA9IHZhcC0+dmFfY3RpbWUudHZfc2VjOworCQlpcC0+aV9kLmRpX2N0aW1lLnRfbnNlYyA9IHZhcC0+dmFfY3RpbWUudHZfbnNlYzsKKwkJaXAtPmlfdXBkYXRlX2NvcmUgPSAxOworCQl0aW1lZmxhZ3MgJj0gflhGU19JQ0hHVElNRV9DSEc7CisJfQorCisJLyoKKwkgKiBTZW5kIG91dCB0aW1lc3RhbXAgY2hhbmdlcyB0aGF0IG5lZWQgdG8gYmUgc2V0IHRvIHRoZQorCSAqIGN1cnJlbnQgdGltZS4gIE5vdCBkb25lIHdoZW4gY2FsbGVkIGJ5IGEgRE1JIGZ1bmN0aW9uLgorCSAqLworCWlmICh0aW1lZmxhZ3MgJiYgIShmbGFncyAmIEFUVFJfRE1JKSkKKwkJeGZzX2ljaGd0aW1lKGlwLCB0aW1lZmxhZ3MpOworCisJWEZTX1NUQVRTX0lOQyh4c19pZ19hdHRyY2hnKTsKKworCS8qCisJICogSWYgdGhpcyBpcyBhIHN5bmNocm9ub3VzIG1vdW50LCBtYWtlIHN1cmUgdGhhdCB0aGUKKwkgKiB0cmFuc2FjdGlvbiBnb2VzIHRvIGRpc2sgYmVmb3JlIHJldHVybmluZyB0byB0aGUgdXNlci4KKwkgKiBUaGlzIGlzIHNsaWdodGx5IHN1Yi1vcHRpbWFsIGluIHRoYXQgdHJ1bmNhdGVzIHJlcXVpcmUKKwkgKiB0d28gc3luYyB0cmFuc2FjdGlvbnMgaW5zdGVhZCBvZiBvbmUgZm9yIHdzeW5jIGZpbGVzeXRlbXMuCisJICogT25lIGZvciB0aGUgdHJ1bmNhdGUgYW5kIG9uZSBmb3IgdGhlIHRpbWVzdGFtcHMgc2luY2Ugd2UKKwkgKiBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUgdGltZXN0YW1wcyB1bmxlc3Mgd2UncmUgc3VyZSB0aGUKKwkgKiB0cnVuY2F0ZSB3b3JrZWQuICBUcnVuY2F0ZXMgYXJlIGxlc3MgdGhhbiAxJSBvZiB0aGUgbGFkZGlzCisJICogbWl4IHNvIHRoaXMgcHJvYmFibHkgaXNuJ3Qgd29ydGggdGhlIHRyb3VibGUgdG8gb3B0aW1pemUuCisJICovCisJY29kZSA9IDA7CisJaWYgKHRwKSB7CisJCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9XU1lOQykKKwkJCXhmc190cmFuc19zZXRfc3luYyh0cCk7CisKKwkJY29kZSA9IHhmc190cmFuc19jb21taXQodHAsIGNvbW1pdF9mbGFncywgTlVMTCk7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgKHJlZ3VsYXIpIGZpbGUncyBtYW5kYXRvcnkgbG9ja2luZyBtb2RlIGNoYW5nZWQsIHRoZW4KKwkgKiBub3RpZnkgdGhlIHZub2RlLiAgV2UgZG8gdGhpcyB1bmRlciB0aGUgaW5vZGUgbG9jayB0byBwcmV2ZW50CisJICogcmFjaW5nIGNhbGxzIHRvIHZvcF92bm9kZV9jaGFuZ2UuCisJICovCisJbWFuZGxvY2tfYWZ0ZXIgPSBNQU5ETE9DSyh2cCwgaXAtPmlfZC5kaV9tb2RlKTsKKwlpZiAobWFuZGxvY2tfYmVmb3JlICE9IG1hbmRsb2NrX2FmdGVyKSB7CisJCVZPUF9WTk9ERV9DSEFOR0UodnAsIFZDSEFOR0VfRkxBR1NfRU5GX0xPQ0tJTkcsCisJCQkJIG1hbmRsb2NrX2FmdGVyKTsKKwl9CisKKwl4ZnNfaXVubG9jayhpcCwgbG9ja19mbGFncyk7CisKKwkvKgorCSAqIFJlbGVhc2UgYW55IGRxdW90KHMpIHRoZSBpbm9kZSBoYWQga2VwdCBiZWZvcmUgY2hvd24uCisJICovCisJWEZTX1FNX0RRUkVMRShtcCwgb2xkZHF1b3QxKTsKKwlYRlNfUU1fRFFSRUxFKG1wLCBvbGRkcXVvdDIpOworCVhGU19RTV9EUVJFTEUobXAsIHVkcXApOworCVhGU19RTV9EUVJFTEUobXAsIGdkcXApOworCisJaWYgKGNvZGUpIHsKKwkJcmV0dXJuIGNvZGU7CisJfQorCisJaWYgKERNX0VWRU5UX0VOQUJMRUQodnAtPnZfdmZzcCwgaXAsIERNX0VWRU5UX0FUVFJJQlVURSkgJiYKKwkgICAgIShmbGFncyAmIEFUVFJfRE1JKSkgeworCQkodm9pZCkgWEZTX1NFTkRfTkFNRVNQKG1wLCBETV9FVkVOVF9BVFRSSUJVVEUsIHZwLCBETV9SSUdIVF9OVUxMLAorCQkJCQlOVUxMLCBETV9SSUdIVF9OVUxMLCBOVUxMLCBOVUxMLAorCQkJCQkwLCAwLCBBVF9ERUxBWV9GTEFHKGZsYWdzKSk7CisJfQorCXJldHVybiAwOworCisgYWJvcnRfcmV0dXJuOgorCWNvbW1pdF9mbGFncyB8PSBYRlNfVFJBTlNfQUJPUlQ7CisJLyogRkFMTFRIUk9VR0ggKi8KKyBlcnJvcl9yZXR1cm46CisJWEZTX1FNX0RRUkVMRShtcCwgdWRxcCk7CisJWEZTX1FNX0RRUkVMRShtcCwgZ2RxcCk7CisJaWYgKHRwKSB7CisJCXhmc190cmFuc19jYW5jZWwodHAsIGNvbW1pdF9mbGFncyk7CisJfQorCWlmIChsb2NrX2ZsYWdzICE9IDApIHsKKwkJeGZzX2l1bmxvY2soaXAsIGxvY2tfZmxhZ3MpOworCX0KKwlyZXR1cm4gY29kZTsKK30KKworCisvKgorICogeGZzX2FjY2VzcworICogTnVsbCBjb252ZXJzaW9uIGZyb20gdm5vZGUgbW9kZSBiaXRzIHRvIGlub2RlIG1vZGUgYml0cywgYXMgaW4gZWZzLgorICovCitTVEFUSUMgaW50Cit4ZnNfYWNjZXNzKAorCWJodl9kZXNjX3QJKmJkcCwKKwlpbnQJCW1vZGUsCisJY3JlZF90CQkqY3JlZHApCit7CisJeGZzX2lub2RlX3QJKmlwOworCWludAkJZXJyb3I7CisKKwl2bl90cmFjZV9lbnRyeShCSFZfVE9fVk5PREUoYmRwKSwgX19GVU5DVElPTl9fLAorCQkJCQkgICAgICAgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCisJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CisJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwllcnJvciA9IHhmc19pYWNjZXNzKGlwLCBtb2RlLCBjcmVkcCk7CisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCXJldHVybiBlcnJvcjsKK30KKworCisvKgorICogeGZzX3JlYWRsaW5rCisgKgorICovCitTVEFUSUMgaW50Cit4ZnNfcmVhZGxpbmsoCisJYmh2X2Rlc2NfdAkqYmRwLAorCXVpb190CQkqdWlvcCwKKwlpbnQJCWlvZmxhZ3MsCisJY3JlZF90CQkqY3JlZHApCit7CisJeGZzX2lub2RlX3QgICAgICppcDsKKwlpbnQJCWNvdW50OworCXhmc19vZmZfdAlvZmZzZXQ7CisJaW50CQlwYXRobGVuOworCXZub2RlX3QJCSp2cDsKKwlpbnQJCWVycm9yID0gMDsKKwl4ZnNfbW91bnRfdAkqbXA7CisJaW50ICAgICAgICAgICAgIG5tYXBzOworCXhmc19ibWJ0X2lyZWNfdCBtdmFsW1NZTUxJTktfTUFQU107CisJeGZzX2RhZGRyX3QJZDsKKwlpbnQJCWJ5dGVfY250OworCWludAkJbjsKKwl4ZnNfYnVmX3QJKmJwOworCisJdnAgPSBCSFZfVE9fVk5PREUoYmRwKTsKKwl2bl90cmFjZV9lbnRyeSh2cCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwlpcCA9IFhGU19CSFZUT0koYmRwKTsKKwltcCA9IGlwLT5pX21vdW50OworCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisKKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCisJQVNTRVJUKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZMTkspOworCisJb2Zmc2V0ID0gdWlvcC0+dWlvX29mZnNldDsKKwljb3VudCA9IHVpb3AtPnVpb19yZXNpZDsKKworCWlmIChvZmZzZXQgPCAwKSB7CisJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKwlpZiAoY291bnQgPD0gMCkgeworCQllcnJvciA9IDA7CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworCWlmICghKGlvZmxhZ3MgJiBJT19JTlZJUykpIHsKKwkJeGZzX2ljaGd0aW1lKGlwLCBYRlNfSUNIR1RJTUVfQUNDKTsKKwl9CisKKwkvKgorCSAqIFNlZSBpZiB0aGUgc3ltbGluayBpcyBzdG9yZWQgaW5saW5lLgorCSAqLworCXBhdGhsZW4gPSAoaW50KWlwLT5pX2QuZGlfc2l6ZTsKKworCWlmIChpcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRklOTElORSkgeworCQllcnJvciA9IHVpb19yZWFkKGlwLT5pX2RmLmlmX3UxLmlmX2RhdGEsIHBhdGhsZW4sIHVpb3ApOworCX0KKwllbHNlIHsKKwkJLyoKKwkJICogU3ltbGluayBub3QgaW5saW5lLiAgQ2FsbCBibWFwIHRvIGdldCBpdCBpbi4KKwkJICovCisJCW5tYXBzID0gU1lNTElOS19NQVBTOworCisJCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIGlwLCAwLCBYRlNfQl9UT19GU0IobXAsIHBhdGhsZW4pLAorCQkJCSAgMCwgTlVMTCwgMCwgbXZhbCwgJm5tYXBzLCBOVUxMKTsKKworCQlpZiAoZXJyb3IpIHsKKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQl9CisKKwkJZm9yIChuID0gMDsgbiA8IG5tYXBzOyBuKyspIHsKKwkJCWQgPSBYRlNfRlNCX1RPX0RBRERSKG1wLCBtdmFsW25dLmJyX3N0YXJ0YmxvY2spOworCQkJYnl0ZV9jbnQgPSBYRlNfRlNCX1RPX0IobXAsIG12YWxbbl0uYnJfYmxvY2tjb3VudCk7CisJCQlicCA9IHhmc19idWZfcmVhZChtcC0+bV9kZGV2X3RhcmdwLCBkLAorCQkJCSAgICAgIEJUT0JCKGJ5dGVfY250KSwgMCk7CisJCQllcnJvciA9IFhGU19CVUZfR0VURVJST1IoYnApOworCQkJaWYgKGVycm9yKSB7CisJCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhmc19yZWFkbGluayIsCisJCQkJCSAgaXAtPmlfbW91bnQsIGJwLCBYRlNfQlVGX0FERFIoYnApKTsKKwkJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJCX0KKwkJCWlmIChwYXRobGVuIDwgYnl0ZV9jbnQpCisJCQkJYnl0ZV9jbnQgPSBwYXRobGVuOworCQkJcGF0aGxlbiAtPSBieXRlX2NudDsKKworCQkJZXJyb3IgPSB1aW9fcmVhZChYRlNfQlVGX1BUUihicCksIGJ5dGVfY250LCB1aW9wKTsKKwkJCXhmc19idWZfcmVsc2UgKGJwKTsKKwkJfQorCisJfQorCisKK2Vycm9yX3JldHVybjoKKworCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKworCXJldHVybiBlcnJvcjsKK30KKworCisvKgorICogeGZzX2ZzeW5jCisgKgorICogVGhpcyBpcyBjYWxsZWQgdG8gc3luYyB0aGUgaW5vZGUgYW5kIGl0cyBkYXRhIG91dCB0byBkaXNrLgorICogV2UgbmVlZCB0byBob2xkIHRoZSBJL08gbG9jayB3aGlsZSBmbHVzaGluZyB0aGUgZGF0YSwgYW5kCisgKiB0aGUgaW5vZGUgbG9jayB3aGlsZSBmbHVzaGluZyB0aGUgaW5vZGUuICBUaGUgaW5vZGUgbG9jayBDQU5OT1QKKyAqIGJlIGhlbGQgd2hpbGUgZmx1c2hpbmcgdGhlIGRhdGEsIHNvIGFjcXVpcmUgYWZ0ZXIgd2UncmUgZG9uZQorICogd2l0aCB0aGF0LgorICovCitTVEFUSUMgaW50Cit4ZnNfZnN5bmMoCisJYmh2X2Rlc2NfdAkqYmRwLAorCWludAkJZmxhZywKKwljcmVkX3QJCSpjcmVkcCwKKwl4ZnNfb2ZmX3QJc3RhcnQsCisJeGZzX29mZl90CXN0b3ApCit7CisJeGZzX2lub2RlX3QJKmlwOworCXhmc190cmFuc190CSp0cDsKKwlpbnQJCWVycm9yOworCisJdm5fdHJhY2VfZW50cnkoQkhWX1RPX1ZOT0RFKGJkcCksCisJCQlfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKworCWlwID0gWEZTX0JIVlRPSShiZHApOworCisJQVNTRVJUKHN0YXJ0ID49IDAgJiYgc3RvcCA+PSAtMSk7CisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkpCisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKworCS8qCisJICogV2UgYWx3YXlzIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHJlcXVpcmVkIGlub2RlIHN0YXRlCisJICogaXMgc2FmZSBvbiBkaXNrLiAgVGhlIHZub2RlIG1pZ2h0IGJlIGNsZWFuIGJ1dCBiZWNhdXNlCisJICogb2YgY29tbWl0dGVkIHRyYW5zYWN0aW9ucyB0aGF0IGhhdmVuJ3QgaGl0IHRoZSBkaXNrIHlldC4KKwkgKiBMaWtld2lzZSwgdGhlcmUgY291bGQgYmUgdW5mbHVzaGVkIG5vbi10cmFuc2FjdGlvbmFsCisJICogY2hhbmdlcyB0byB0aGUgaW5vZGUgY29yZSB0aGF0IGhhdmUgdG8gZ28gdG8gZGlzay4KKwkgKgorCSAqIFRoZSBmb2xsb3dpbmcgY29kZSBkZXBlbmRzIG9uIG9uZSBhc3N1bXB0aW9uOiAgdGhhdAorCSAqIGFueSB0cmFuc2FjdGlvbiB0aGF0IGNoYW5nZXMgYW4gaW5vZGUgbG9ncyB0aGUgY29yZQorCSAqIGJlY2F1c2UgaXQgaGFzIHRvIGNoYW5nZSBzb21lIGZpZWxkIGluIHRoZSBpbm9kZSBjb3JlCisJICogKHR5cGljYWxseSBuZXh0ZW50cyBvciBuYmxvY2tzKS4gIFRoYXQgYXNzdW1wdGlvbgorCSAqIGltcGxpZXMgdGhhdCBhbnkgdHJhbnNhY3Rpb25zIGFnYWluc3QgYW4gaW5vZGUgd2lsbAorCSAqIGNhdGNoIGFueSBub24tdHJhbnNhY3Rpb25hbCB1cGRhdGVzLiAgSWYgaW5vZGUtYWx0ZXJpbmcKKwkgKiB0cmFuc2FjdGlvbnMgZXhpc3QgdGhhdCB2aW9sYXRlIHRoaXMgYXNzdW1wdGlvbiwgdGhlCisJICogY29kZSBicmVha3MuICBSaWdodCBub3csIGl0IGZpZ3VyZXMgdGhhdCBpZiB0aGUgaW52b2x2ZWQKKwkgKiB1cGRhdGVfKiBmaWVsZCBpcyBjbGVhciBhbmQgdGhlIGlub2RlIGlzIHVucGlubmVkLCB0aGUKKwkgKiBpbm9kZSBpcyBjbGVhbi4gIEVpdGhlciBpdCdzIGJlZW4gZmx1c2hlZCBvciBpdCdzIGJlZW4KKwkgKiBjb21taXR0ZWQgYW5kIHRoZSBjb21taXQgaGFzIGhpdCB0aGUgZGlzayB1bnBpbm5pbmcgdGhlIGlub2RlLgorCSAqIChOb3RlIHRoYXQgeGZzX2lub2RlX2l0ZW1fZm9ybWF0KCkgY2FsbGVkIGF0IGNvbW1pdCBjbGVhcnMKKwkgKiB0aGUgdXBkYXRlXyogZmllbGRzLikKKwkgKi8KKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCisJLyogSWYgd2UgYXJlIGZsdXNoaW5nIGRhdGEgdGhlbiB3ZSBjYXJlIGFib3V0IHVwZGF0ZV9zaXplCisJICogYmVpbmcgc2V0LCBvdGhlcndpc2Ugd2UgY2FyZSBhYm91dCB1cGRhdGVfY29yZQorCSAqLworCWlmICgoZmxhZyAmIEZTWU5DX0RBVEEpID8KKwkJCShpcC0+aV91cGRhdGVfc2l6ZSA9PSAwKSA6CisJCQkoaXAtPmlfdXBkYXRlX2NvcmUgPT0gMCkpIHsKKwkJLyoKKwkJICogVGltZXN0YW1wcy9zaXplIGhhdmVuJ3QgY2hhbmdlZCBzaW5jZSBsYXN0IGlub2RlCisJCSAqIGZsdXNoIG9yIGlub2RlIHRyYW5zYWN0aW9uIGNvbW1pdC4gIFRoYXQgbWVhbnMKKwkJICogZWl0aGVyIG5vdGhpbmcgZ290IHdyaXR0ZW4gb3IgYSB0cmFuc2FjdGlvbgorCQkgKiBjb21taXR0ZWQgd2hpY2ggY2F1Z2h0IHRoZSB1cGRhdGVzLglJZiB0aGUKKwkJICogbGF0dGVyIGhhcHBlbmVkIGFuZCB0aGUgdHJhbnNhY3Rpb24gaGFzbid0CisJCSAqIGhpdCB0aGUgZGlzayB5ZXQsIHRoZSBpbm9kZSB3aWxsIGJlIHN0aWxsCisJCSAqIGJlIHBpbm5lZC4gIElmIGl0IGlzLCBmb3JjZSB0aGUgbG9nLgorCQkgKi8KKworCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisKKwkJaWYgKHhmc19pcGluY291bnQoaXApKSB7CisJCQl4ZnNfbG9nX2ZvcmNlKGlwLT5pX21vdW50LCAoeGZzX2xzbl90KTAsCisJCQkJICAgICAgWEZTX0xPR19GT1JDRSB8CisJCQkJICAgICAgKChmbGFnICYgRlNZTkNfV0FJVCkKKwkJCQkgICAgICAgPyBYRlNfTE9HX1NZTkMgOiAwKSk7CisJCX0KKwkJZXJyb3IgPSAwOworCX0gZWxzZQl7CisJCS8qCisJCSAqIEtpY2sgb2ZmIGEgdHJhbnNhY3Rpb24gdG8gbG9nIHRoZSBpbm9kZQorCQkgKiBjb3JlIHRvIGdldCB0aGUgdXBkYXRlcy4gIE1ha2UgaXQKKwkJICogc3luYyBpZiBGU1lOQ19XQUlUIGlzIHBhc3NlZCBpbiAod2hpY2gKKwkJICogaXMgZG9uZSBieSBldmVyeWJvZHkgYnV0IHNwZWNmcykuICBUaGUKKwkJICogc3luYyB0cmFuc2FjdGlvbiB3aWxsIGFsc28gZm9yY2UgdGhlIGxvZy4KKwkJICovCisJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwkJdHAgPSB4ZnNfdHJhbnNfYWxsb2MoaXAtPmlfbW91bnQsIFhGU19UUkFOU19GU1lOQ19UUyk7CisJCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwKKwkJCQlYRlNfRlNZTkNfVFNfTE9HX1JFUyhpcC0+aV9tb3VudCksCisJCQkJMCwgMCwgMCkpKSAgeworCQkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwkJLyoKKwkJICogTm90ZSAtIGl0J3MgcG9zc2libGUgdGhhdCB3ZSBtaWdodCBoYXZlIHB1c2hlZAorCQkgKiBvdXJzZWx2ZXMgb3V0IG9mIHRoZSB3YXkgZHVyaW5nIHRyYW5zX3Jlc2VydmUKKwkJICogd2hpY2ggd291bGQgZmx1c2ggdGhlIGlub2RlLgkgQnV0IHRoZXJlJ3Mgbm8KKwkJICogZ3VhcmFudGVlIHRoYXQgdGhlIGlub2RlIGJ1ZmZlciBoYXMgYWN0dWFsbHkKKwkJICogZ29uZSBvdXQgeWV0IChpdCdzIGRlbHdyaSkuCVBsdXMgdGhlIGJ1ZmZlcgorCQkgKiBjb3VsZCBiZSBwaW5uZWQgYW55d2F5IGlmIGl0J3MgcGFydCBvZiBhbgorCQkgKiBpbm9kZSBpbiBhbm90aGVyIHJlY2VudCB0cmFuc2FjdGlvbi4JIFNvIHdlCisJCSAqIHBsYXkgaXQgc2FmZSBhbmQgZmlyZSBvZmYgdGhlIHRyYW5zYWN0aW9uIGFueXdheS4KKwkJICovCisJCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwkJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CisJCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKwkJaWYgKGZsYWcgJiBGU1lOQ19XQUlUKQorCQkJeGZzX3RyYW5zX3NldF9zeW5jKHRwKTsKKwkJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwLCBOVUxMKTsKKworCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBieSB4ZnNfaW5hY3RpdmUgdG8gZnJlZSBhbnkgYmxvY2tzIGJleW9uZCBlb2YsCisgKiB3aGVuIHRoZSBsaW5rIGNvdW50IGlzbid0IHplcm8uCisgKi8KK1NUQVRJQyBpbnQKK3hmc19pbmFjdGl2ZV9mcmVlX2VvZmJsb2NrcygKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2lub2RlX3QJKmlwKQoreworCXhmc190cmFuc190CSp0cDsKKwlpbnQJCWVycm9yOworCXhmc19maWxlb2ZmX3QJZW5kX2ZzYjsKKwl4ZnNfZmlsZW9mZl90CWxhc3RfZnNiOworCXhmc19maWxibGtzX3QJbWFwX2xlbjsKKwlpbnQJCW5pbWFwczsKKwl4ZnNfYm1idF9pcmVjX3QJaW1hcDsKKworCS8qCisJICogRmlndXJlIG91dCBpZiB0aGVyZSBhcmUgYW55IGJsb2NrcyBiZXlvbmQgdGhlIGVuZAorCSAqIG9mIHRoZSBmaWxlLiAgSWYgbm90LCB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uCisJICovCisJZW5kX2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKCh4ZnNfdWZzaXplX3QpaXAtPmlfZC5kaV9zaXplKSk7CisJbGFzdF9mc2IgPSBYRlNfQl9UT19GU0IobXAsICh4ZnNfdWZzaXplX3QpWEZTX01BWElPRkZTRVQobXApKTsKKwltYXBfbGVuID0gbGFzdF9mc2IgLSBlbmRfZnNiOworCWlmIChtYXBfbGVuIDw9IDApCisJCXJldHVybiAoMCk7CisKKwluaW1hcHMgPSAxOworCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIGVuZF9mc2IsIG1hcF9sZW4sIDAsCisJCQkgIE5VTEwsIDAsICZpbWFwLCAmbmltYXBzLCBOVUxMKTsKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisKKwlpZiAoIWVycm9yICYmIChuaW1hcHMgIT0gMCkgJiYKKwkgICAgKGltYXAuYnJfc3RhcnRibG9jayAhPSBIT0xFU1RBUlRCTE9DSykpIHsKKwkJLyoKKwkJICogQXR0YWNoIHRoZSBkcXVvdHMgdG8gdGhlIGlub2RlIHVwIGZyb250LgorCQkgKi8KKwkJaWYgKChlcnJvciA9IFhGU19RTV9EUUFUVEFDSChtcCwgaXAsIDApKSkKKwkJCXJldHVybiAoZXJyb3IpOworCisJCS8qCisJCSAqIFRoZXJlIGFyZSBibG9ja3MgYWZ0ZXIgdGhlIGVuZCBvZiBmaWxlLgorCQkgKiBGcmVlIHRoZW0gdXAgbm93IGJ5IHRydW5jYXRpbmcgdGhlIGZpbGUgdG8KKwkJICogaXRzIGN1cnJlbnQgc2l6ZS4KKwkJICovCisJCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfSU5BQ1RJVkUpOworCisJCS8qCisJCSAqIERvIHRoZSB4ZnNfaXRydW5jYXRlX3N0YXJ0KCkgY2FsbCBiZWZvcmUKKwkJICogcmVzZXJ2aW5nIGFueSBsb2cgc3BhY2UgYmVjYXVzZQorCQkgKiBpdHJ1bmNhdGVfc3RhcnQgd2lsbCBjYWxsIGludG8gdGhlIGJ1ZmZlcgorCQkgKiBjYWNoZSBhbmQgd2UgY2FuJ3QKKwkJICogZG8gdGhhdCB3aXRoaW4gYSB0cmFuc2FjdGlvbi4KKwkJICovCisJCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKKwkJeGZzX2l0cnVuY2F0ZV9zdGFydChpcCwgWEZTX0lUUlVOQ19ERUZJTklURSwKKwkJCQkgICAgaXAtPmlfZC5kaV9zaXplKTsKKworCQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLAorCQkJCQkgIFhGU19JVFJVTkNBVEVfTE9HX1JFUyhtcCksCisJCQkJCSAgMCwgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKKwkJCQkJICBYRlNfSVRSVU5DQVRFX0xPR19DT1VOVCk7CisJCWlmIChlcnJvcikgeworCQkJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04obXApKTsKKwkJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CisJCQlyZXR1cm4gKGVycm9yKTsKKwkJfQorCisJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLAorCQkJCVhGU19JT0xPQ0tfRVhDTCB8CisJCQkJWEZTX0lMT0NLX0VYQ0wpOworCQl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKworCQllcnJvciA9IHhmc19pdHJ1bmNhdGVfZmluaXNoKCZ0cCwgaXAsCisJCQkJCSAgICAgaXAtPmlfZC5kaV9zaXplLAorCQkJCQkgICAgIFhGU19EQVRBX0ZPUkssCisJCQkJCSAgICAgMCk7CisJCS8qCisJCSAqIElmIHdlIGdldCBhbiBlcnJvciBhdCB0aGlzIHBvaW50IHdlCisJCSAqIHNpbXBseSBkb24ndCBib3RoZXIgdHJ1bmNhdGluZyB0aGUgZmlsZS4KKwkJICovCisJCWlmIChlcnJvcikgeworCQkJeGZzX3RyYW5zX2NhbmNlbCh0cCwKKwkJCQkJIChYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTIHwKKwkJCQkJICBYRlNfVFJBTlNfQUJPUlQpKTsKKwkJfSBlbHNlIHsKKwkJCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwKKwkJCQkJCVhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsCisJCQkJCQlOVUxMKTsKKwkJfQorCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19FWENMIHwgWEZTX0lMT0NLX0VYQ0wpOworCX0KKwlyZXR1cm4gKGVycm9yKTsKK30KKworLyoKKyAqIEZyZWUgYSBzeW1saW5rIHRoYXQgaGFzIGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggaXQuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19pbmFjdGl2ZV9zeW1saW5rX3JtdCgKKwl4ZnNfaW5vZGVfdAkqaXAsCisJeGZzX3RyYW5zX3QJKip0cHApCit7CisJeGZzX2J1Zl90CSpicDsKKwlpbnQJCWNvbW1pdHRlZDsKKwlpbnQJCWRvbmU7CisJaW50CQllcnJvcjsKKwl4ZnNfZnNibG9ja190CWZpcnN0X2Jsb2NrOworCXhmc19ibWFwX2ZyZWVfdAlmcmVlX2xpc3Q7CisJaW50CQlpOworCXhmc19tb3VudF90CSptcDsKKwl4ZnNfYm1idF9pcmVjX3QJbXZhbFtTWU1MSU5LX01BUFNdOworCWludAkJbm1hcHM7CisJeGZzX3RyYW5zX3QJKm50cDsKKwlpbnQJCXNpemU7CisJeGZzX3RyYW5zX3QJKnRwOworCisJdHAgPSAqdHBwOworCW1wID0gaXAtPmlfbW91bnQ7CisJQVNTRVJUKGlwLT5pX2QuZGlfc2l6ZSA+IFhGU19JRk9SS19EU0laRShpcCkpOworCS8qCisJICogV2UncmUgZnJlZWluZyBhIHN5bWxpbmsgdGhhdCBoYXMgc29tZQorCSAqIGJsb2NrcyBhbGxvY2F0ZWQgdG8gaXQuICBGcmVlIHRoZQorCSAqIGJsb2NrcyBoZXJlLiAgV2Uga25vdyB0aGF0IHdlJ3ZlIGdvdAorCSAqIGVpdGhlciAxIG9yIDIgZXh0ZW50cyBhbmQgdGhhdCB3ZSBjYW4KKwkgKiBmcmVlIHRoZW0gYWxsIGluIG9uZSBidW5tYXBpIGNhbGwuCisJICovCisJQVNTRVJUKGlwLT5pX2QuZGlfbmV4dGVudHMgPiAwICYmIGlwLT5pX2QuZGlfbmV4dGVudHMgPD0gMik7CisJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLCBYRlNfSVRSVU5DQVRFX0xPR19SRVMobXApLCAwLAorCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywgWEZTX0lUUlVOQ0FURV9MT0dfQ09VTlQpKSkgeworCQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpOworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKKwkJKnRwcCA9IE5VTEw7CisJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBMb2NrIHRoZSBpbm9kZSwgZml4IHRoZSBzaXplLCBhbmQgam9pbiBpdCB0byB0aGUgdHJhbnNhY3Rpb24uCisJICogSG9sZCBpdCBzbyBpbiB0aGUgbm9ybWFsIHBhdGgsIHdlIHN0aWxsIGhhdmUgaXQgbG9ja2VkIGZvcgorCSAqIHRoZSBzZWNvbmQgdHJhbnNhY3Rpb24uICBJbiB0aGUgZXJyb3IgcGF0aHMgd2UgbmVlZCBpdAorCSAqIGhlbGQgc28gdGhlIGNhbmNlbCB3b24ndCByZWxlIGl0LCBzZWUgYmVsb3cuCisJICovCisJeGZzX2lsb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wgfCBYRlNfSUxPQ0tfRVhDTCk7CisJc2l6ZSA9IChpbnQpaXAtPmlfZC5kaV9zaXplOworCWlwLT5pX2QuZGlfc2l6ZSA9IDA7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOworCXhmc190cmFuc19paG9sZCh0cCwgaXApOworCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKwkvKgorCSAqIEZpbmQgdGhlIGJsb2NrKHMpIHNvIHdlIGNhbiBpbnZhbCBhbmQgdW5tYXAgdGhlbS4KKwkgKi8KKwlkb25lID0gMDsKKwlYRlNfQk1BUF9JTklUKCZmcmVlX2xpc3QsICZmaXJzdF9ibG9jayk7CisJbm1hcHMgPSBzaXplb2YobXZhbCkgLyBzaXplb2YobXZhbFswXSk7CisJaWYgKChlcnJvciA9IHhmc19ibWFwaSh0cCwgaXAsIDAsIFhGU19CX1RPX0ZTQihtcCwgc2l6ZSksCisJCQlYRlNfQk1BUElfTUVUQURBVEEsICZmaXJzdF9ibG9jaywgMCwgbXZhbCwgJm5tYXBzLAorCQkJJmZyZWVfbGlzdCkpKQorCQlnb3RvIGVycm9yMDsKKwkvKgorCSAqIEludmFsaWRhdGUgdGhlIGJsb2NrKHMpLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBubWFwczsgaSsrKSB7CisJCWJwID0geGZzX3RyYW5zX2dldF9idWYodHAsIG1wLT5tX2RkZXZfdGFyZ3AsCisJCQlYRlNfRlNCX1RPX0RBRERSKG1wLCBtdmFsW2ldLmJyX3N0YXJ0YmxvY2spLAorCQkJWEZTX0ZTQl9UT19CQihtcCwgbXZhbFtpXS5icl9ibG9ja2NvdW50KSwgMCk7CisJCXhmc190cmFuc19iaW52YWwodHAsIGJwKTsKKwl9CisJLyoKKwkgKiBVbm1hcCB0aGUgZGVhZCBibG9jayhzKSB0byB0aGUgZnJlZV9saXN0LgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfYnVubWFwaSh0cCwgaXAsIDAsIHNpemUsIFhGU19CTUFQSV9NRVRBREFUQSwgbm1hcHMsCisJCQkmZmlyc3RfYmxvY2ssICZmcmVlX2xpc3QsICZkb25lKSkpCisJCWdvdG8gZXJyb3IxOworCUFTU0VSVChkb25lKTsKKwkvKgorCSAqIENvbW1pdCB0aGUgZmlyc3QgdHJhbnNhY3Rpb24uICBUaGlzIGxvZ3MgdGhlIEVGSSBhbmQgdGhlIGlub2RlLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJnRwLCAmZnJlZV9saXN0LCBmaXJzdF9ibG9jaywgJmNvbW1pdHRlZCkpKQorCQlnb3RvIGVycm9yMTsKKwkvKgorCSAqIFRoZSB0cmFuc2FjdGlvbiBtdXN0IGhhdmUgYmVlbiBjb21taXR0ZWQsIHNpbmNlIHRoZXJlIHdlcmUKKwkgKiBhY3R1YWxseSBleHRlbnRzIGZyZWVkIGJ5IHhmc19idW5tYXBpLiAgU2VlIHhmc19ibWFwX2ZpbmlzaC4KKwkgKiBUaGUgbmV3IHRwIGhhcyB0aGUgZXh0ZW50IGZyZWVpbmcgYW5kIEVGRHMuCisJICovCisJQVNTRVJUKGNvbW1pdHRlZCk7CisJLyoKKwkgKiBUaGUgZmlyc3QgeGFjdCB3YXMgY29tbWl0dGVkLCBzbyBhZGQgdGhlIGlub2RlIHRvIHRoZSBuZXcgb25lLgorCSAqIE1hcmsgaXQgZGlydHkgc28gaXQgd2lsbCBiZSBsb2dnZWQgYW5kIG1vdmVkIGZvcndhcmQgaW4gdGhlIGxvZyBhcworCSAqIHBhcnQgb2YgZXZlcnkgY29tbWl0LgorCSAqLworCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisJLyoKKwkgKiBHZXQgYSBuZXcsIGVtcHR5IHRyYW5zYWN0aW9uIHRvIHJldHVybiB0byBvdXIgY2FsbGVyLgorCSAqLworCW50cCA9IHhmc190cmFuc19kdXAodHApOworCS8qCisJICogQ29tbWl0IHRoZSB0cmFuc2FjdGlvbiBjb250YWluaW5nIGV4dGVudCBmcmVlaW5nIGFuZCBFRkQncy4KKwkgKiBJZiB3ZSBnZXQgYW4gZXJyb3Igb24gdGhlIGNvbW1pdCBoZXJlIG9yIG9uIHRoZSByZXNlcnZlIGJlbG93LAorCSAqIHdlIG5lZWQgdG8gdW5sb2NrIHRoZSBpbm9kZSBzaW5jZSB0aGUgbmV3IHRyYW5zYWN0aW9uIGRvZXNuJ3QKKwkgKiBoYXZlIHRoZSBpbm9kZSBhdHRhY2hlZC4KKwkgKi8KKwllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIDAsIE5VTEwpOworCXRwID0gbnRwOworCWlmIChlcnJvcikgeworCQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpOworCQlnb3RvIGVycm9yMDsKKwl9CisJLyoKKwkgKiBSZW1vdmUgdGhlIG1lbW9yeSBmb3IgZXh0ZW50IGRlc2NyaXB0aW9ucyAoanVzdCBib29ra2VlcGluZykuCisJICovCisJaWYgKGlwLT5pX2RmLmlmX2J5dGVzKQorCQl4ZnNfaWRhdGFfcmVhbGxvYyhpcCwgLWlwLT5pX2RmLmlmX2J5dGVzLCBYRlNfREFUQV9GT1JLKTsKKwlBU1NFUlQoaXAtPmlfZGYuaWZfYnl0ZXMgPT0gMCk7CisJLyoKKwkgKiBQdXQgYW4gaXRydW5jYXRlIGxvZyByZXNlcnZhdGlvbiBpbiB0aGUgbmV3IHRyYW5zYWN0aW9uCisJICogZm9yIG91ciBjYWxsZXIuCisJICovCisJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLCBYRlNfSVRSVU5DQVRFX0xPR19SRVMobXApLCAwLAorCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywgWEZTX0lUUlVOQ0FURV9MT0dfQ09VTlQpKSkgeworCQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpOworCQlnb3RvIGVycm9yMDsKKwl9CisJLyoKKwkgKiBSZXR1cm4gd2l0aCB0aGUgaW5vZGUgbG9ja2VkIGJ1dCBub3Qgam9pbmVkIHRvIHRoZSB0cmFuc2FjdGlvbi4KKwkgKi8KKwkqdHBwID0gdHA7CisJcmV0dXJuIDA7CisKKyBlcnJvcjE6CisJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOworIGVycm9yMDoKKwkvKgorCSAqIEhhdmUgdG8gY29tZSBoZXJlIHdpdGggdGhlIGlub2RlIGxvY2tlZCBhbmQgZWl0aGVyCisJICogKGhlbGQgYW5kIGluIHRoZSB0cmFuc2FjdGlvbikgb3IgKG5vdCBpbiB0aGUgdHJhbnNhY3Rpb24pLgorCSAqIElmIHRoZSBpbm9kZSBpc24ndCBoZWxkIHRoZW4gY2FuY2VsIHdvdWxkIGlwdXQgaXQsIGJ1dAorCSAqIHRoYXQncyB3cm9uZyBzaW5jZSB0aGlzIGlzIGluYWN0aXZlIGFuZCB0aGUgdm5vZGUgcmVmCisJICogY291bnQgaXMgMCBhbHJlYWR5LgorCSAqIENhbmNlbCB3b24ndCBkbyBhbnl0aGluZyB0byB0aGUgaW5vZGUgaWYgaGVsZCwgYnV0IGl0IHN0aWxsCisJICogbmVlZHMgdG8gYmUgbG9ja2VkIHVudGlsIHRoZSBjYW5jZWwgaXMgZG9uZSwgaWYgaXQgd2FzCisJICogam9pbmVkIHRvIHRoZSB0cmFuc2FjdGlvbi4KKwkgKi8KKwl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTIHwgWEZTX1RSQU5TX0FCT1JUKTsKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19FWENMIHwgWEZTX0lMT0NLX0VYQ0wpOworCSp0cHAgPSBOVUxMOworCXJldHVybiBlcnJvcjsKKworfQorCitTVEFUSUMgaW50Cit4ZnNfaW5hY3RpdmVfc3ltbGlua19sb2NhbCgKKwl4ZnNfaW5vZGVfdAkqaXAsCisJeGZzX3RyYW5zX3QJKip0cHApCit7CisJaW50CQllcnJvcjsKKworCUFTU0VSVChpcC0+aV9kLmRpX3NpemUgPD0gWEZTX0lGT1JLX0RTSVpFKGlwKSk7CisJLyoKKwkgKiBXZSdyZSBmcmVlaW5nIGEgc3ltbGluayB3aGljaCBmaXQgaW50bworCSAqIHRoZSBpbm9kZS4gIEp1c3QgZnJlZSB0aGUgbWVtb3J5IHVzZWQKKwkgKiB0byBob2xkIHRoZSBvbGQgc3ltbGluay4KKwkgKi8KKwllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKCp0cHAsIDAsCisJCQkJICBYRlNfSVRSVU5DQVRFX0xPR19SRVMoaXAtPmlfbW91bnQpLAorCQkJCSAgMCwgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKKwkJCQkgIFhGU19JVFJVTkNBVEVfTE9HX0NPVU5UKTsKKworCWlmIChlcnJvcikgeworCQl4ZnNfdHJhbnNfY2FuY2VsKCp0cHAsIDApOworCQkqdHBwID0gTlVMTDsKKwkJcmV0dXJuIChlcnJvcik7CisJfQorCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOworCisJLyoKKwkgKiBaZXJvIGxlbmd0aCBzeW1saW5rcyBfY2FuXyBleGlzdC4KKwkgKi8KKwlpZiAoaXAtPmlfZGYuaWZfYnl0ZXMgPiAwKSB7CisJCXhmc19pZGF0YV9yZWFsbG9jKGlwLAorCQkJCSAgLShpcC0+aV9kZi5pZl9ieXRlcyksCisJCQkJICBYRlNfREFUQV9GT1JLKTsKKwkJQVNTRVJUKGlwLT5pX2RmLmlmX2J5dGVzID09IDApOworCX0KKwlyZXR1cm4gKDApOworfQorCisvKgorICoKKyAqLworU1RBVElDIGludAoreGZzX2luYWN0aXZlX2F0dHJzKAorCXhmc19pbm9kZV90CSppcCwKKwl4ZnNfdHJhbnNfdAkqKnRwcCkKK3sKKwl4ZnNfdHJhbnNfdAkqdHA7CisJaW50CQllcnJvcjsKKwl4ZnNfbW91bnRfdAkqbXA7CisKKwlBU1NFUlQoaXNtcmxvY2tlZCgmaXAtPmlfaW9sb2NrLCBNUl9VUERBVEUpKTsKKwl0cCA9ICp0cHA7CisJbXAgPSBpcC0+aV9tb3VudDsKKwlBU1NFUlQoaXAtPmlfZC5kaV9mb3Jrb2ZmICE9IDApOworCXhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsIE5VTEwpOworCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwllcnJvciA9IHhmc19hdHRyX2luYWN0aXZlKGlwKTsKKwlpZiAoZXJyb3IpIHsKKwkJKnRwcCA9IE5VTEw7CisJCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOworCQlyZXR1cm4gKGVycm9yKTsgLyogZ290byBvdXQqLworCX0KKworCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfSU5BQ1RJVkUpOworCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsCisJCQkJICBYRlNfSUZSRUVfTE9HX1JFUyhtcCksCisJCQkJICAwLCBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAorCQkJCSAgWEZTX0lOQUNUSVZFX0xPR19DT1VOVCk7CisJaWYgKGVycm9yKSB7CisJCUFTU0VSVChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSk7CisJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQkqdHBwID0gTlVMTDsKKwkJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CisJCXJldHVybiAoZXJyb3IpOworCX0KKworCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JT0xPQ0tfRVhDTCB8IFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKwl4ZnNfaWRlc3Ryb3lfZm9yayhpcCwgWEZTX0FUVFJfRk9SSyk7CisKKwlBU1NFUlQoaXAtPmlfZC5kaV9hbmV4dGVudHMgPT0gMCk7CisKKwkqdHBwID0gdHA7CisJcmV0dXJuICgwKTsKK30KKworU1RBVElDIGludAoreGZzX3JlbGVhc2UoCisJYmh2X2Rlc2NfdAkqYmRwKQoreworCXhmc19pbm9kZV90CSppcDsKKwl2bm9kZV90CQkqdnA7CisJeGZzX21vdW50X3QJKm1wOworCWludAkJZXJyb3I7CisKKwl2cCA9IEJIVl9UT19WTk9ERShiZHApOworCWlwID0gWEZTX0JIVlRPSShiZHApOworCisJaWYgKCh2cC0+dl90eXBlICE9IFZSRUcpIHx8IChpcC0+aV9kLmRpX21vZGUgPT0gMCkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSWYgdGhpcyBpcyBhIHJlYWQtb25seSBtb3VudCwgZG9uJ3QgZG8gdGhpcyAod291bGQgZ2VuZXJhdGUgSS9PKSAqLworCWlmICh2cC0+dl92ZnNwLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpCisJCXJldHVybiAwOworCisjaWZkZWYgSEFWRV9SRUZDQUNIRQorCS8qIElmIHdlIGFyZSBpbiB0aGUgTkZTIHJlZmVyZW5jZSBjYWNoZSB0aGVuIGRvbid0IGRvIHRoaXMgbm93ICovCisJaWYgKGlwLT5pX3JlZmNhY2hlKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCisJbXAgPSBpcC0+aV9tb3VudDsKKworCWlmIChpcC0+aV9kLmRpX25saW5rICE9IDApIHsKKwkJaWYgKCgoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRlJFRykgJiYKKwkJICAgICAoKGlwLT5pX2QuZGlfc2l6ZSA+IDApIHx8IChWTl9DQUNIRUQodnApID4gMCkpICYmCisJCSAgICAgKGlwLT5pX2RmLmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykpICAmJgorCQkgICAgKCEoaXAtPmlfZC5kaV9mbGFncyAmIChYRlNfRElGTEFHX1BSRUFMTE9DfFhGU19ESUZMQUdfQVBQRU5EKSkpKSB7CisJCQlpZiAoKGVycm9yID0geGZzX2luYWN0aXZlX2ZyZWVfZW9mYmxvY2tzKG1wLCBpcCkpKQorCQkJCXJldHVybiAoZXJyb3IpOworCQkJLyogVXBkYXRlIGxpbnV4IGlub2RlIGJsb2NrIGNvdW50IGFmdGVyIGZyZWUgYWJvdmUgKi8KKwkJCUxJTlZGU19HRVRfSVAodnApLT5pX2Jsb2NrcyA9IFhGU19GU0JfVE9fQkIobXAsCisJCQkJaXAtPmlfZC5kaV9uYmxvY2tzICsgaXAtPmlfZGVsYXllZF9ibGtzKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKgorICogeGZzX2luYWN0aXZlCisgKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgdm5vZGUgcmVmZXJlbmNlIGNvdW50IGZvciB0aGUgdm5vZGUKKyAqIGdvZXMgdG8gemVyby4gIElmIHRoZSBmaWxlIGhhcyBiZWVuIHVubGlua2VkLCB0aGVuIGl0IG11c3QKKyAqIG5vdyBiZSB0cnVuY2F0ZWQuICBBbHNvLCB3ZSBjbGVhciBhbGwgb2YgdGhlIHJlYWQtYWhlYWQgc3RhdGUKKyAqIGtlcHQgZm9yIHRoZSBpbm9kZSBoZXJlIHNpbmNlIHRoZSBmaWxlIGlzIG5vdyBjbG9zZWQuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19pbmFjdGl2ZSgKKwliaHZfZGVzY190CSpiZHAsCisJY3JlZF90CQkqY3JlZHApCit7CisJeGZzX2lub2RlX3QJKmlwOworCXZub2RlX3QJCSp2cDsKKwl4ZnNfYm1hcF9mcmVlX3QJZnJlZV9saXN0OyAKKwl4ZnNfZnNibG9ja190CWZpcnN0X2Jsb2NrOworCWludAkJY29tbWl0dGVkOworCXhmc190cmFuc190CSp0cDsKKwl4ZnNfbW91bnRfdAkqbXA7CisJaW50CQllcnJvcjsKKwlpbnQJCXRydW5jYXRlOworCisJdnAgPSBCSFZfVE9fVk5PREUoYmRwKTsKKwl2bl90cmFjZV9lbnRyeSh2cCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwlpcCA9IFhGU19CSFZUT0koYmRwKTsKKworCS8qCisJICogSWYgdGhlIGlub2RlIGlzIGFscmVhZHkgZnJlZSwgdGhlbiB0aGVyZSBjYW4gYmUgbm90aGluZworCSAqIHRvIGNsZWFuIHVwIGhlcmUuCisJICovCisJaWYgKGlwLT5pX2QuZGlfbW9kZSA9PSAwIHx8IFZOX0JBRCh2cCkpIHsKKwkJQVNTRVJUKGlwLT5pX2RmLmlmX3JlYWxfYnl0ZXMgPT0gMCk7CisJCUFTU0VSVChpcC0+aV9kZi5pZl9icm9vdF9ieXRlcyA9PSAwKTsKKwkJcmV0dXJuIFZOX0lOQUNUSVZFX0NBQ0hFOworCX0KKworCS8qCisJICogT25seSBkbyBhIHRydW5jYXRlIGlmIGl0J3MgYSByZWd1bGFyIGZpbGUgd2l0aAorCSAqIHNvbWUgYWN0dWFsIHNwYWNlIGluIGl0LiAgSXQncyBPSyB0byBsb29rIGF0IHRoZQorCSAqIGlub2RlJ3MgZmllbGRzIHdpdGhvdXQgdGhlIGxvY2sgYmVjYXVzZSB3ZSdyZSB0aGUKKwkgKiBvbmx5IG9uZSB3aXRoIGEgcmVmZXJlbmNlIHRvIHRoZSBpbm9kZS4KKwkgKi8KKwl0cnVuY2F0ZSA9ICgoaXAtPmlfZC5kaV9ubGluayA9PSAwKSAmJgorCSAgICAoKGlwLT5pX2QuZGlfc2l6ZSAhPSAwKSB8fCAoaXAtPmlfZC5kaV9uZXh0ZW50cyA+IDApKSAmJgorCSAgICAoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRlJFRykpOworCisJbXAgPSBpcC0+aV9tb3VudDsKKworCWlmIChpcC0+aV9kLmRpX25saW5rID09IDAgJiYKKwkgICAgRE1fRVZFTlRfRU5BQkxFRCh2cC0+dl92ZnNwLCBpcCwgRE1fRVZFTlRfREVTVFJPWSkpIHsKKwkJKHZvaWQpIFhGU19TRU5EX0RFU1RST1kobXAsIHZwLCBETV9SSUdIVF9OVUxMKTsKKwl9CisKKwllcnJvciA9IDA7CisKKwkvKiBJZiB0aGlzIGlzIGEgcmVhZC1vbmx5IG1vdW50LCBkb24ndCBkbyB0aGlzICh3b3VsZCBnZW5lcmF0ZSBJL08pICovCisJaWYgKHZwLT52X3Zmc3AtPnZmc19mbGFnICYgVkZTX1JET05MWSkKKwkJZ290byBvdXQ7CisKKwlpZiAoaXAtPmlfZC5kaV9ubGluayAhPSAwKSB7CisJCWlmICgoKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpICYmCisJCSAgICAgKChpcC0+aV9kLmRpX3NpemUgPiAwKSB8fCAoVk5fQ0FDSEVEKHZwKSA+IDApKSAmJgorCQkgICAgIChpcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpKSAgJiYKKwkJICAgICghKGlwLT5pX2QuZGlfZmxhZ3MgJiAoWEZTX0RJRkxBR19QUkVBTExPQ3xYRlNfRElGTEFHX0FQUEVORCkpIHx8CisJCSAgICAgKGlwLT5pX2RlbGF5ZWRfYmxrcyAhPSAwKSkpIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfaW5hY3RpdmVfZnJlZV9lb2ZibG9ja3MobXAsIGlwKSkpCisJCQkJcmV0dXJuIChWTl9JTkFDVElWRV9DQUNIRSk7CisJCQkvKiBVcGRhdGUgbGludXggaW5vZGUgYmxvY2sgY291bnQgYWZ0ZXIgZnJlZSBhYm92ZSAqLworCQkJTElOVkZTX0dFVF9JUCh2cCktPmlfYmxvY2tzID0gWEZTX0ZTQl9UT19CQihtcCwKKwkJCQlpcC0+aV9kLmRpX25ibG9ja3MgKyBpcC0+aV9kZWxheWVkX2Jsa3MpOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCUFTU0VSVChpcC0+aV9kLmRpX25saW5rID09IDApOworCisJaWYgKChlcnJvciA9IFhGU19RTV9EUUFUVEFDSChtcCwgaXAsIDApKSkKKwkJcmV0dXJuIChWTl9JTkFDVElWRV9DQUNIRSk7CisKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX0lOQUNUSVZFKTsKKwlpZiAodHJ1bmNhdGUpIHsKKwkJLyoKKwkJICogRG8gdGhlIHhmc19pdHJ1bmNhdGVfc3RhcnQoKSBjYWxsIGJlZm9yZQorCQkgKiByZXNlcnZpbmcgYW55IGxvZyBzcGFjZSBiZWNhdXNlIGl0cnVuY2F0ZV9zdGFydAorCQkgKiB3aWxsIGNhbGwgaW50byB0aGUgYnVmZmVyIGNhY2hlIGFuZCB3ZSBjYW4ndAorCQkgKiBkbyB0aGF0IHdpdGhpbiBhIHRyYW5zYWN0aW9uLgorCQkgKi8KKwkJeGZzX2lsb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOworCisJCXhmc19pdHJ1bmNhdGVfc3RhcnQoaXAsIFhGU19JVFJVTkNfREVGSU5JVEUsIDApOworCisJCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsCisJCQkJCSAgWEZTX0lUUlVOQ0FURV9MT0dfUkVTKG1wKSwKKwkJCQkJICAwLCBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAorCQkJCQkgIFhGU19JVFJVTkNBVEVfTE9HX0NPVU5UKTsKKwkJaWYgKGVycm9yKSB7CisJCQkvKiBEb24ndCBjYWxsIGl0cnVuY2F0ZV9jbGVhbnVwICovCisJCQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpOworCQkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKKwkJCXJldHVybiAoVk5fSU5BQ1RJVkVfQ0FDSEUpOworCQl9CisKKwkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JT0xPQ0tfRVhDTCB8IFhGU19JTE9DS19FWENMKTsKKwkJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CisKKwkJLyoKKwkJICogbm9ybWFsbHksIHdlIGhhdmUgdG8gcnVuIHhmc19pdHJ1bmNhdGVfZmluaXNoIHN5bmMuCisJCSAqIEJ1dCBpZiBmaWxlc3lzdGVtIGlzIHdzeW5jIGFuZCB3ZSdyZSBpbiB0aGUgaW5hY3RpdmUKKwkJICogcGF0aCwgdGhlbiB3ZSBrbm93IHRoYXQgbmxpbmsgPT0gMCwgYW5kIHRoYXQgdGhlCisJCSAqIHhhY3Rpb24gdGhhdCBtYWRlIG5saW5rID09IDAgaXMgcGVybWFuZW50bHkgY29tbWl0dGVkCisJCSAqIHNpbmNlIHhmc19yZW1vdmUgcnVucyBhcyBhIHN5bmNocm9ub3VzIHRyYW5zYWN0aW9uLgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfaXRydW5jYXRlX2ZpbmlzaCgmdHAsIGlwLCAwLCBYRlNfREFUQV9GT1JLLAorCQkJCSghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1dTWU5DKSA/IDEgOiAwKSk7CisKKwkJaWYgKGVycm9yKSB7CisJCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLAorCQkJCVhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMgfCBYRlNfVFJBTlNfQUJPUlQpOworCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCB8IFhGU19JTE9DS19FWENMKTsKKwkJCXJldHVybiAoVk5fSU5BQ1RJVkVfQ0FDSEUpOworCQl9CisJfSBlbHNlIGlmICgoaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGTE5LKSB7CisKKwkJLyoKKwkJICogSWYgd2UgZ2V0IGFuIGVycm9yIHdoaWxlIGNsZWFuaW5nIHVwIGEKKwkJICogc3ltbGluayB3ZSBiYWlsIG91dC4KKwkJICovCisJCWVycm9yID0gKGlwLT5pX2QuZGlfc2l6ZSA+IFhGU19JRk9SS19EU0laRShpcCkpID8KKwkJCXhmc19pbmFjdGl2ZV9zeW1saW5rX3JtdChpcCwgJnRwKSA6CisJCQl4ZnNfaW5hY3RpdmVfc3ltbGlua19sb2NhbChpcCwgJnRwKTsKKworCQlpZiAoZXJyb3IpIHsKKwkJCUFTU0VSVCh0cCA9PSBOVUxMKTsKKwkJCXJldHVybiAoVk5fSU5BQ1RJVkVfQ0FDSEUpOworCQl9CisKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lPTE9DS19FWENMIHwgWEZTX0lMT0NLX0VYQ0wpOworCQl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKwl9IGVsc2UgeworCQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLAorCQkJCQkgIFhGU19JRlJFRV9MT0dfUkVTKG1wKSwKKwkJCQkJICAwLCBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAorCQkJCQkgIFhGU19JTkFDVElWRV9MT0dfQ09VTlQpOworCQlpZiAoZXJyb3IpIHsKKwkJCUFTU0VSVChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSk7CisJCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKKwkJCXJldHVybiAoVk5fSU5BQ1RJVkVfQ0FDSEUpOworCQl9CisKKwkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCB8IFhGU19JT0xPQ0tfRVhDTCk7CisJCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JT0xPQ0tfRVhDTCB8IFhGU19JTE9DS19FWENMKTsKKwkJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CisJfQorCisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUKKwkgKiB0aGVuIGJsb3cgdGhlbSBhd2F5IG5vdy4gIFRoZSBjb2RlIGNhbGxzIGEgcm91dGluZQorCSAqIHRoYXQgcmVjdXJzaXZlbHkgZGVjb25zdHJ1Y3RzIHRoZSBhdHRyaWJ1dGUgZm9yay4KKwkgKiBXZSBuZWVkIHRvIGp1c3QgY29tbWl0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uCisJICogYmVjYXVzZSB3ZSBjYW4ndCB1c2UgaXQgZm9yIHhmc19hdHRyX2luYWN0aXZlKCkuCisJICovCisJaWYgKGlwLT5pX2QuZGlfYW5leHRlbnRzID4gMCkgeworCQllcnJvciA9IHhmc19pbmFjdGl2ZV9hdHRycyhpcCwgJnRwKTsKKwkJLyoKKwkJICogSWYgd2UgZ290IGFuIGVycm9yLCB0aGUgdHJhbnNhY3Rpb24gaXMgYWxyZWFkeQorCQkgKiBjYW5jZWxsZWQsIGFuZCB0aGUgaW5vZGUgaXMgdW5sb2NrZWQuIEp1c3QgZ2V0IG91dC4KKwkJICovCisJCSBpZiAoZXJyb3IpCisJCQkgcmV0dXJuIChWTl9JTkFDVElWRV9DQUNIRSk7CisJfSBlbHNlIGlmIChpcC0+aV9hZnApIHsKKwkJeGZzX2lkZXN0cm95X2ZvcmsoaXAsIFhGU19BVFRSX0ZPUkspOworCX0KKworCS8qCisJICogRnJlZSB0aGUgaW5vZGUuCisJICovCisJWEZTX0JNQVBfSU5JVCgmZnJlZV9saXN0LCAmZmlyc3RfYmxvY2spOworCWVycm9yID0geGZzX2lmcmVlKHRwLCBpcCwgJmZyZWVfbGlzdCk7CisJaWYgKGVycm9yKSB7CisJCS8qCisJCSAqIElmIHdlIGZhaWwgdG8gZnJlZSB0aGUgaW5vZGUsIHNodXQgZG93bi4gIFRoZSBjYW5jZWwKKwkJICogbWlnaHQgZG8gdGhhdCwgd2UgbmVlZCB0byBtYWtlIHN1cmUuICBPdGhlcndpc2UgdGhlCisJCSAqIGlub2RlIG1pZ2h0IGJlIGxvc3QgZm9yIGEgbG9uZyB0aW1lIG9yIGZvcmV2ZXIuCisJCSAqLworCQlpZiAoIVhGU19GT1JDRURfU0hVVERPV04obXApKSB7CisJCQljbW5fZXJyKENFX05PVEUsCisJCSJ4ZnNfaW5hY3RpdmU6CXhmc19pZnJlZSgpIHJldHVybmVkIGFuIGVycm9yID0gJWQgb24gJXMiLAorCQkJCWVycm9yLCBtcC0+bV9mc25hbWUpOworCQkJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBYRlNfTUVUQURBVEFfSU9fRVJST1IpOworCQl9CisJCXhmc190cmFuc19jYW5jZWwodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVN8WEZTX1RSQU5TX0FCT1JUKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBDcmVkaXQgdGhlIHF1b3RhIGFjY291bnQocykuIFRoZSBpbm9kZSBpcyBnb25lLgorCQkgKi8KKwkJWEZTX1RSQU5TX01PRF9EUVVPVF9CWUlOTyhtcCwgdHAsIGlwLCBYRlNfVFJBTlNfRFFfSUNPVU5ULCAtMSk7CisKKwkJLyoKKwkJICogSnVzdCBpZ25vcmUgZXJyb3JzIGF0IHRoaXMgcG9pbnQuICBUaGVyZSBpcworCQkgKiBub3RoaW5nIHdlIGNhbiBkbyBleGNlcHQgdG8gdHJ5IHRvIGtlZXAgZ29pbmcuCisJCSAqLworCQkodm9pZCkgeGZzX2JtYXBfZmluaXNoKCZ0cCwgICZmcmVlX2xpc3QsIGZpcnN0X2Jsb2NrLAorCQkJCSAgICAgICAmY29tbWl0dGVkKTsKKwkJKHZvaWQpIHhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsIE5VTEwpOworCX0KKwkvKgorCSAqIFJlbGVhc2UgdGhlIGRxdW90cyBoZWxkIGJ5IGlub2RlLCBpZiBhbnkuCisJICovCisJWEZTX1FNX0RRREVUQUNIKG1wLCBpcCk7CisKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19FWENMIHwgWEZTX0lMT0NLX0VYQ0wpOworCisgb3V0OgorCXJldHVybiBWTl9JTkFDVElWRV9DQUNIRTsKK30KKworCisvKgorICogeGZzX2xvb2t1cAorICovCitTVEFUSUMgaW50Cit4ZnNfbG9va3VwKAorCWJodl9kZXNjX3QJCSpkaXJfYmRwLAorCXZuYW1lX3QJCQkqZGVudHJ5LAorCXZub2RlX3QJCQkqKnZwcCwKKwlpbnQJCQlmbGFncywKKwl2bm9kZV90CQkJKnJkaXIsCisJY3JlZF90CQkJKmNyZWRwKQoreworCXhmc19pbm9kZV90CQkqZHAsICppcDsKKwl4ZnNfaW5vX3QJCWVfaW51bTsKKwlpbnQJCQllcnJvcjsKKwl1aW50CQkJbG9ja19tb2RlOworCXZub2RlX3QJCQkqZGlyX3ZwOworCisJZGlyX3ZwID0gQkhWX1RPX1ZOT0RFKGRpcl9iZHApOworCXZuX3RyYWNlX2VudHJ5KGRpcl92cCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwlkcCA9IFhGU19CSFZUT0koZGlyX2JkcCk7CisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihkcC0+aV9tb3VudCkpCisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKworCWxvY2tfbW9kZSA9IHhmc19pbG9ja19tYXBfc2hhcmVkKGRwKTsKKwllcnJvciA9IHhmc19kaXJfbG9va3VwX2ludChkaXJfYmRwLCBsb2NrX21vZGUsIGRlbnRyeSwgJmVfaW51bSwgJmlwKTsKKwlpZiAoIWVycm9yKSB7CisJCSp2cHAgPSBYRlNfSVRPVihpcCk7CisJCUlUUkFDRShpcCk7CisJfQorCXhmc19pdW5sb2NrX21hcF9zaGFyZWQoZHAsIGxvY2tfbW9kZSk7CisJcmV0dXJuIGVycm9yOworfQorCisKKy8qCisgKiB4ZnNfY3JlYXRlIChjcmVhdGUgYSBuZXcgZmlsZSkuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19jcmVhdGUoCisJYmh2X2Rlc2NfdAkJKmRpcl9iZHAsCisJdm5hbWVfdAkJCSpkZW50cnksCisJdmF0dHJfdAkJCSp2YXAsCisJdm5vZGVfdAkJCSoqdnBwLAorCWNyZWRfdAkJCSpjcmVkcCkKK3sKKwljaGFyCQkJKm5hbWUgPSBWTkFNRShkZW50cnkpOworCXZub2RlX3QJCQkqZGlyX3ZwOworCXhmc19pbm9kZV90CQkqZHAsICppcDsKKwl2bm9kZV90CQkgICAgICAgICp2cD1OVUxMOworCXhmc190cmFuc190CQkqdHA7CisJeGZzX21vdW50X3QJICAgICAgICAqbXA7CisJeGZzX2Rldl90CQlyZGV2OworCWludCAgICAgICAgICAgICAgICAgICAgIGVycm9yOworCXhmc19ibWFwX2ZyZWVfdAkJZnJlZV9saXN0OworCXhmc19mc2Jsb2NrX3QJCWZpcnN0X2Jsb2NrOworCWJvb2xlYW5fdAkJZHBfam9pbmVkX3RvX3RyYW5zOworCWludAkJCWRtX2V2ZW50X3NlbnQgPSAwOworCXVpbnQJCQljYW5jZWxfZmxhZ3M7CisJaW50CQkJY29tbWl0dGVkOworCXhmc19wcmlkX3QJCXByaWQ7CisJc3RydWN0IHhmc19kcXVvdAkqdWRxcCwgKmdkcXA7CisJdWludAkJCXJlc2Jsa3M7CisJaW50CQkJZG1fZGlfbW9kZTsKKwlpbnQJCQluYW1lbGVuOworCisJQVNTRVJUKCEqdnBwKTsKKwlkaXJfdnAgPSBCSFZfVE9fVk5PREUoZGlyX2JkcCk7CisJdm5fdHJhY2VfZW50cnkoZGlyX3ZwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKworCWRwID0gWEZTX0JIVlRPSShkaXJfYmRwKTsKKwltcCA9IGRwLT5pX21vdW50OworCisJZG1fZGlfbW9kZSA9IHZhcC0+dmFfbW9kZXxWVFRPSUYodmFwLT52YV90eXBlKTsKKwluYW1lbGVuID0gVk5BTUVMRU4oZGVudHJ5KTsKKworCWlmIChETV9FVkVOVF9FTkFCTEVEKGRpcl92cC0+dl92ZnNwLCBkcCwgRE1fRVZFTlRfQ1JFQVRFKSkgeworCQllcnJvciA9IFhGU19TRU5EX05BTUVTUChtcCwgRE1fRVZFTlRfQ1JFQVRFLAorCQkJCWRpcl92cCwgRE1fUklHSFRfTlVMTCwgTlVMTCwKKwkJCQlETV9SSUdIVF9OVUxMLCBuYW1lLCBOVUxMLAorCQkJCWRtX2RpX21vZGUsIDAsIDApOworCisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwkJZG1fZXZlbnRfc2VudCA9IDE7CisJfQorCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisKKwkvKiBSZXR1cm4gdGhyb3VnaCBzdGRfcmV0dXJuIGFmdGVyIHRoaXMgcG9pbnQuICovCisKKwl1ZHFwID0gZ2RxcCA9IE5VTEw7CisJaWYgKHZhcC0+dmFfbWFzayAmIFhGU19BVF9QUk9KSUQpCisJCXByaWQgPSAoeGZzX3ByaWRfdCl2YXAtPnZhX3Byb2ppZDsKKwllbHNlCisJCXByaWQgPSAoeGZzX3ByaWRfdClkZmx0cHJpZDsKKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhbGxvY2F0ZWQgZHF1b3Qocykgb24gZGlzay4KKwkgKi8KKwllcnJvciA9IFhGU19RTV9EUVZPUEFMTE9DKG1wLCBkcCwKKwkJCWN1cnJlbnRfZnN1aWQoY3JlZHApLCBjdXJyZW50X2ZzZ2lkKGNyZWRwKSwKKwkJCVhGU19RTU9QVF9RVU9UQUxMfFhGU19RTU9QVF9JTkhFUklULCAmdWRxcCwgJmdkcXApOworCWlmIChlcnJvcikKKwkJZ290byBzdGRfcmV0dXJuOworCisJaXAgPSBOVUxMOworCWRwX2pvaW5lZF90b190cmFucyA9IEJfRkFMU0U7CisKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX0NSRUFURSk7CisJY2FuY2VsX2ZsYWdzID0gWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUzsKKwlyZXNibGtzID0gWEZTX0NSRUFURV9TUEFDRV9SRVMobXAsIG5hbWVsZW4pOworCS8qCisJICogSW5pdGlhbGx5IGFzc3VtZSB0aGF0IHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IGFuZAorCSAqIHJlc2VydmUgdGhlIHJlc291cmNlcyBmb3IgdGhhdCBjYXNlLiAgSWYgdGhhdCBpcyBub3QKKwkgKiB0aGUgY2FzZSB3ZSdsbCBkcm9wIHRoZSBvbmUgd2UgaGF2ZSBhbmQgZ2V0IGEgbW9yZQorCSAqIGFwcHJvcHJpYXRlIHRyYW5zYWN0aW9uIGxhdGVyLgorCSAqLworCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIHJlc2Jsa3MsIFhGU19DUkVBVEVfTE9HX1JFUyhtcCksIDAsCisJCQlYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLCBYRlNfQ1JFQVRFX0xPR19DT1VOVCk7CisJaWYgKGVycm9yID09IEVOT1NQQykgeworCQlyZXNibGtzID0gMDsKKwkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgWEZTX0NSRUFURV9MT0dfUkVTKG1wKSwgMCwKKwkJCQlYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLCBYRlNfQ1JFQVRFX0xPR19DT1VOVCk7CisJfQorCWlmIChlcnJvcikgeworCQljYW5jZWxfZmxhZ3MgPSAwOworCQlkcCA9IE5VTEw7CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworCXhmc19pbG9jayhkcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJWEZTX0JNQVBfSU5JVCgmZnJlZV9saXN0LCAmZmlyc3RfYmxvY2spOworCisJQVNTRVJUKGlwID09IE5VTEwpOworCisJLyoKKwkgKiBSZXNlcnZlIGRpc2sgcXVvdGEgYW5kIHRoZSBpbm9kZS4KKwkgKi8KKwllcnJvciA9IFhGU19UUkFOU19SRVNFUlZFX1FVT1RBKG1wLCB0cCwgdWRxcCwgZ2RxcCwgcmVzYmxrcywgMSwgMCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yX3JldHVybjsKKworCWlmIChyZXNibGtzID09IDAgJiYKKwkgICAgKGVycm9yID0gWEZTX0RJUl9DQU5FTlRFUihtcCwgdHAsIGRwLCBuYW1lLCBuYW1lbGVuKSkpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCXJkZXYgPSAodmFwLT52YV9tYXNrICYgWEZTX0FUX1JERVYpID8gdmFwLT52YV9yZGV2IDogMDsKKwllcnJvciA9IHhmc19kaXJfaWFsbG9jKCZ0cCwgZHAsCisJCQlNQUtFSU1PREUodmFwLT52YV90eXBlLHZhcC0+dmFfbW9kZSksIDEsCisJCQlyZGV2LCBjcmVkcCwgcHJpZCwgcmVzYmxrcyA+IDAsCisJCQkmaXAsICZjb21taXR0ZWQpOworCWlmIChlcnJvcikgeworCQlpZiAoZXJyb3IgPT0gRU5PU1BDKQorCQkJZ290byBlcnJvcl9yZXR1cm47CisJCWdvdG8gYWJvcnRfcmV0dXJuOworCX0KKwlJVFJBQ0UoaXApOworCisJLyoKKwkgKiBBdCB0aGlzIHBvaW50LCB3ZSd2ZSBnb3R0ZW4gYSBuZXdseSBhbGxvY2F0ZWQgaW5vZGUuCisJICogSXQgaXMgbG9ja2VkIChhbmQgam9pbmVkIHRvIHRoZSB0cmFuc2FjdGlvbikuCisJICovCisKKwlBU1NFUlQoaXNtcmxvY2tlZCAoJmlwLT5pX2xvY2ssIE1SX1VQREFURSkpOworCisJLyoKKwkgKiBOb3cgd2Ugam9pbiB0aGUgZGlyZWN0b3J5IGlub2RlIHRvIHRoZSB0cmFuc2FjdGlvbi4KKwkgKiBXZSBkbyBub3QgZG8gaXQgZWFybGllciBiZWNhdXNlIHhmc19kaXJfaWFsbG9jCisJICogbWlnaHQgY29tbWl0IHRoZSBwcmV2aW91cyB0cmFuc2FjdGlvbiAoYW5kIHJlbGVhc2UKKwkgKiBhbGwgdGhlIGxvY2tzKS4KKwkgKi8KKworCVZOX0hPTEQoZGlyX3ZwKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJZHBfam9pbmVkX3RvX3RyYW5zID0gQl9UUlVFOworCisJZXJyb3IgPSBYRlNfRElSX0NSRUFURU5BTUUobXAsIHRwLCBkcCwgbmFtZSwgbmFtZWxlbiwgaXAtPmlfaW5vLAorCQkmZmlyc3RfYmxvY2ssICZmcmVlX2xpc3QsCisJCXJlc2Jsa3MgPyByZXNibGtzIC0gWEZTX0lBTExPQ19TUEFDRV9SRVMobXApIDogMCk7CisJaWYgKGVycm9yKSB7CisJCUFTU0VSVChlcnJvciAhPSBFTk9TUEMpOworCQlnb3RvIGFib3J0X3JldHVybjsKKwl9CisJeGZzX2ljaGd0aW1lKGRwLCBYRlNfSUNIR1RJTUVfTU9EIHwgWEZTX0lDSEdUSU1FX0NIRyk7CisJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgZHAsIFhGU19JTE9HX0NPUkUpOworCisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgc3luY2hyb25vdXMgbW91bnQsIG1ha2Ugc3VyZSB0aGF0IHRoZQorCSAqIGNyZWF0ZSB0cmFuc2FjdGlvbiBnb2VzIHRvIGRpc2sgYmVmb3JlIHJldHVybmluZyB0bworCSAqIHRoZSB1c2VyLgorCSAqLworCWlmIChtcC0+bV9mbGFncyAmIChYRlNfTU9VTlRfV1NZTkN8WEZTX01PVU5UX0RJUlNZTkMpKSB7CisJCXhmc190cmFuc19zZXRfc3luYyh0cCk7CisJfQorCisJZHAtPmlfZ2VuKys7CisKKwkvKgorCSAqIEF0dGFjaCB0aGUgZHF1b3QocykgdG8gdGhlIGlub2RlcyBhbmQgbW9kaWZ5IHRoZW0gaW5jb3JlLgorCSAqIFRoZXNlIGlkcyBvZiB0aGUgaW5vZGUgY291bGRuJ3QgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBuZXcKKwkgKiBpbm9kZSBoYXMgYmVlbiBsb2NrZWQgZXZlciBzaW5jZSBpdCB3YXMgY3JlYXRlZC4KKwkgKi8KKwlYRlNfUU1fRFFWT1BDUkVBVEUobXAsIHRwLCBpcCwgdWRxcCwgZ2RxcCk7CisKKwkvKgorCSAqIHhmc190cmFuc19jb21taXQgbm9ybWFsbHkgZGVjcmVtZW50cyB0aGUgdm5vZGUgcmVmIGNvdW50CisJICogd2hlbiBpdCB1bmxvY2tzIHRoZSBpbm9kZS4gU2luY2Ugd2Ugd2FudCB0byByZXR1cm4gdGhlCisJICogdm5vZGUgdG8gdGhlIGNhbGxlciwgd2UgYnVtcCB0aGUgdm5vZGUgcmVmIGNvdW50IG5vdy4KKwkgKi8KKwlJSE9MRChpcCk7CisJdnAgPSBYRlNfSVRPVihpcCk7CisKKwllcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmdHAsICZmcmVlX2xpc3QsIGZpcnN0X2Jsb2NrLCAmY29tbWl0dGVkKTsKKwlpZiAoZXJyb3IpIHsKKwkJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOworCQlnb3RvIGFib3J0X3JlbGU7CisJfQorCisJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTLCBOVUxMKTsKKwlpZiAoZXJyb3IpIHsKKwkJSVJFTEUoaXApOworCQl0cCA9IE5VTEw7CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworCVhGU19RTV9EUVJFTEUobXAsIHVkcXApOworCVhGU19RTV9EUVJFTEUobXAsIGdkcXApOworCisJLyoKKwkgKiBQcm9wb2dhdGUgdGhlIGZhY3QgdGhhdCB0aGUgdm5vZGUgY2hhbmdlZCBhZnRlciB0aGUKKwkgKiB4ZnNfaW5vZGUgbG9ja3MgaGF2ZSBiZWVuIHJlbGVhc2VkLgorCSAqLworCVZPUF9WTk9ERV9DSEFOR0UodnAsIFZDSEFOR0VfRkxBR1NfVFJVTkNBVEVELCAzKTsKKworCSp2cHAgPSB2cDsKKworCS8qIEZhbGx0aHJvdWdoIHRvIHN0ZF9yZXR1cm4gd2l0aCBlcnJvciA9IDAgICovCisKK3N0ZF9yZXR1cm46CisJaWYgKCAoKnZwcCB8fCAoZXJyb3IgIT0gMCAmJiBkbV9ldmVudF9zZW50ICE9IDApKSAmJgorCQkJRE1fRVZFTlRfRU5BQkxFRChkaXJfdnAtPnZfdmZzcCwgWEZTX0JIVlRPSShkaXJfYmRwKSwKKwkJCQkJCQlETV9FVkVOVF9QT1NUQ1JFQVRFKSkgeworCQkodm9pZCkgWEZTX1NFTkRfTkFNRVNQKG1wLCBETV9FVkVOVF9QT1NUQ1JFQVRFLAorCQkJZGlyX3ZwLCBETV9SSUdIVF9OVUxMLAorCQkJKnZwcCA/IHZwOk5VTEwsCisJCQlETV9SSUdIVF9OVUxMLCBuYW1lLCBOVUxMLAorCQkJZG1fZGlfbW9kZSwgZXJyb3IsIDApOworCX0KKwlyZXR1cm4gZXJyb3I7CisKKyBhYm9ydF9yZXR1cm46CisJY2FuY2VsX2ZsYWdzIHw9IFhGU19UUkFOU19BQk9SVDsKKwkvKiBGQUxMVEhST1VHSCAqLworIGVycm9yX3JldHVybjoKKworCWlmICh0cCAhPSBOVUxMKQorCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBjYW5jZWxfZmxhZ3MpOworCisJaWYgKCFkcF9qb2luZWRfdG9fdHJhbnMgJiYgKGRwICE9IE5VTEwpKQorCQl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX0VYQ0wpOworCVhGU19RTV9EUVJFTEUobXAsIHVkcXApOworCVhGU19RTV9EUVJFTEUobXAsIGdkcXApOworCisJZ290byBzdGRfcmV0dXJuOworCisgYWJvcnRfcmVsZToKKwkvKgorCSAqIFdhaXQgdW50aWwgYWZ0ZXIgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaXMgYWJvcnRlZCB0bworCSAqIHJlbGVhc2UgdGhlIGlub2RlLiAgVGhpcyBwcmV2ZW50cyByZWN1cnNpdmUgdHJhbnNhY3Rpb25zCisJICogYW5kIGRlYWRsb2NrcyBmcm9tIHhmc19pbmFjdGl2ZS4KKwkgKi8KKwljYW5jZWxfZmxhZ3MgfD0gWEZTX1RSQU5TX0FCT1JUOworCXhmc190cmFuc19jYW5jZWwodHAsIGNhbmNlbF9mbGFncyk7CisJSVJFTEUoaXApOworCisJWEZTX1FNX0RRUkVMRShtcCwgdWRxcCk7CisJWEZTX1FNX0RRUkVMRShtcCwgZ2RxcCk7CisKKwlnb3RvIHN0ZF9yZXR1cm47Cit9CisKKyNpZmRlZiBERUJVRworLyoKKyAqIFNvbWUgY291bnRlcnMgdG8gc2VlIGlmIChhbmQgaG93IG9mdGVuKSB3ZSBhcmUgaGl0dGluZyBzb21lIGRlYWRsb2NrCisgKiBwcmV2ZW50aW9uIGNvZGUgcGF0aHMuCisgKi8KKworaW50IHhmc19ybV9sb2NrczsKK2ludCB4ZnNfcm1fbG9ja19kZWxheXM7CitpbnQgeGZzX3JtX2F0dGVtcHRzOworI2VuZGlmCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHJvdXRpbmUgd2lsbCBsb2NrIHRoZSBpbm9kZXMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogZGlyZWN0b3J5IGFuZCB0aGUgbmFtZWQgZW50cnkgaW4gdGhlIGRpcmVjdG9yeS4gVGhlIGxvY2tzIGFyZQorICogYWNxdWlyZWQgaW4gaW5jcmVhc2luZyBpbm9kZSBudW1iZXIuCisgKgorICogSWYgdGhlIGVudHJ5IGlzICIuLiIsIHRoZW4gb25seSB0aGUgZGlyZWN0b3J5IGlzIGxvY2tlZC4gVGhlCisgKiB2bm9kZSByZWYgY291bnQgd2lsbCBzdGlsbCBpbmNsdWRlIHRoYXQgZnJvbSB0aGUgLi4gZW50cnkgaW4KKyAqIHRoaXMgY2FzZS4KKyAqCisgKiBUaGVyZSBpcyBhIGRlYWRsb2NrIHdlIG5lZWQgdG8gd29ycnkgYWJvdXQuIElmIHRoZSBsb2NrZWQgZGlyZWN0b3J5IGlzCisgKiBpbiB0aGUgQUlMLCBpdCBtaWdodCBiZSBibG9ja2luZyB1cCB0aGUgbG9nLiBUaGUgbmV4dCBpbm9kZSB3ZSBsb2NrCisgKiBjb3VsZCBiZSBhbHJlYWR5IGxvY2tlZCBieSBhbm90aGVyIHRocmVhZCB3YWl0aW5nIGZvciBsb2cgc3BhY2UgKGUuZworICogYSBwZXJtYW5lbnQgbG9nIHJlc2VydmF0aW9uIHdpdGggYSBsb25nIHJ1bm5pbmcgdHJhbnNhY3Rpb24gKHNlZQorICogeGZzX2l0cnVuY2F0ZV9maW5pc2gpKS4gVG8gc29sdmUgdGhpcywgd2UgbXVzdCBjaGVjayBpZiB0aGUgZGlyZWN0b3J5CisgKiBpcyBpbiB0aGUgYWlsIGFuZCB1c2UgbG9ja19ub3dhaXQuIElmIHdlIGNhbid0IGxvY2ssIHdlIG5lZWQgdG8KKyAqIGRyb3AgdGhlIGlub2RlIGxvY2sgb24gdGhlIGRpcmVjdG9yeSBhbmQgdHJ5IGFnYWluLiB4ZnNfaXVubG9jayB3aWxsCisgKiBwb3RlbnRpYWxseSBwdXNoIHRoZSB0YWlsIGlmIHdlIHdlcmUgaG9sZGluZyB1cCB0aGUgbG9nLgorICovCitTVEFUSUMgaW50Cit4ZnNfbG9ja19kaXJfYW5kX2VudHJ5KAorCXhmc19pbm9kZV90CSpkcCwKKwl2bmFtZV90CQkqZGVudHJ5LAorCXhmc19pbm9kZV90CSppcCkJLyogaW5vZGUgb2YgZW50cnkgJ25hbWUnICovCit7CisJaW50CQlhdHRlbXB0czsKKwl4ZnNfaW5vX3QJZV9pbnVtOworCXhmc19pbm9kZV90CSppcHNbMl07CisJeGZzX2xvZ19pdGVtX3QJKmxwOworCisjaWZkZWYgREVCVUcKKwl4ZnNfcm1fbG9ja3MrKzsKKyNlbmRpZgorCWF0dGVtcHRzID0gMDsKKworYWdhaW46CisJeGZzX2lsb2NrKGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwllX2ludW0gPSBpcC0+aV9pbm87CisKKwlJVFJBQ0UoaXApOworCisJLyoKKwkgKiBXZSB3YW50IHRvIGxvY2sgaW4gaW5jcmVhc2luZyBpbnVtLiBTaW5jZSB3ZSd2ZSBhbHJlYWR5CisJICogYWNxdWlyZWQgdGhlIGxvY2sgb24gdGhlIGRpcmVjdG9yeSwgd2UgbWF5IG5lZWQgdG8gcmVsZWFzZQorCSAqIGlmIGlmIHRoZSBpbnVtIG9mIHRoZSBlbnRyeSB0dXJucyBvdXQgdG8gYmUgbGVzcy4KKwkgKi8KKwlpZiAoZV9pbnVtID4gZHAtPmlfaW5vKSB7CisJCS8qCisJCSAqIFdlIGFyZSBhbHJlYWR5IGluIHRoZSByaWdodCBvcmRlciwgc28ganVzdAorCQkgKiBsb2NrIG9uIHRoZSBpbm9kZSBvZiB0aGUgZW50cnkuCisJCSAqIFdlIG5lZWQgdG8gdXNlIG5vd2FpdCBpZiBkcCBpcyBpbiB0aGUgQUlMLgorCQkgKi8KKworCQlscCA9ICh4ZnNfbG9nX2l0ZW1fdCAqKWRwLT5pX2l0ZW1wOworCQlpZiAobHAgJiYgKGxwLT5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpKSB7CisJCQlpZiAoIXhmc19pbG9ja19ub3dhaXQoaXAsIFhGU19JTE9DS19FWENMKSkgeworCQkJCWF0dGVtcHRzKys7CisjaWZkZWYgREVCVUcKKwkJCQl4ZnNfcm1fYXR0ZW1wdHMrKzsKKyNlbmRpZgorCisJCQkJLyoKKwkJCQkgKiBVbmxvY2sgZHAgYW5kIHRyeSBhZ2Fpbi4KKwkJCQkgKiB4ZnNfaXVubG9jayB3aWxsIHRyeSB0byBwdXNoIHRoZSB0YWlsCisJCQkJICogaWYgdGhlIGlub2RlIGlzIGluIHRoZSBBSUwuCisJCQkJICovCisKKwkJCQl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJCQkJaWYgKChhdHRlbXB0cyAlIDUpID09IDApIHsKKwkJCQkJZGVsYXkoMSk7IC8qIERvbid0IGp1c3Qgc3BpbiB0aGUgQ1BVICovCisjaWZkZWYgREVCVUcKKwkJCQkJeGZzX3JtX2xvY2tfZGVsYXlzKys7CisjZW5kaWYKKwkJCQl9CisJCQkJZ290byBhZ2FpbjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl9CisJfSBlbHNlIGlmIChlX2ludW0gPCBkcC0+aV9pbm8pIHsKKwkJeGZzX2l1bmxvY2soZHAsIFhGU19JTE9DS19FWENMKTsKKworCQlpcHNbMF0gPSBpcDsKKwkJaXBzWzFdID0gZHA7CisJCXhmc19sb2NrX2lub2RlcyhpcHMsIDIsIDAsIFhGU19JTE9DS19FWENMKTsKKwl9CisJLyogZWxzZQkgZV9pbnVtID09IGRwLT5pX2lubyAqLworCS8qICAgICBUaGlzIGNhbiBoYXBwZW4gaWYgd2UncmUgYXNrZWQgdG8gbG9jayAveC8uLgorCSAqICAgICB0aGUgZW50cnkgaXMgIi4uIiwgd2hpY2ggaXMgYWxzbyB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKwkgKi8KKworCXJldHVybiAwOworfQorCisjaWZkZWYgREVCVUcKK2ludCB4ZnNfbG9ja2VkX247CitpbnQgeGZzX3NtYWxsX3JldHJpZXM7CitpbnQgeGZzX21pZGRsZV9yZXRyaWVzOworaW50IHhmc19sb3RzX3JldHJpZXM7CitpbnQgeGZzX2xvY2tfZGVsYXlzOworI2VuZGlmCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHJvdXRpbmUgd2lsbCBsb2NrIG4gaW5vZGVzIGluIGV4Y2x1c2l2ZSBtb2RlLgorICogV2UgYXNzdW1lIHRoZSBjYWxsZXIgY2FsbHMgdXMgd2l0aCB0aGUgaW5vZGVzIGluIGlfaW5vIG9yZGVyLgorICoKKyAqIFdlIG5lZWQgdG8gZGV0ZWN0IGRlYWRsb2NrIHdoZXJlIGFuIGlub2RlIHRoYXQgd2UgbG9jaworICogaXMgaW4gdGhlIEFJTCBhbmQgd2Ugc3RhcnQgd2FpdGluZyBmb3IgYW5vdGhlciBpbm9kZSB0aGF0IGlzIGxvY2tlZAorICogYnkgYSB0aHJlYWQgaW4gYSBsb25nIHJ1bm5pbmcgdHJhbnNhY3Rpb24gKHN1Y2ggYXMgdHJ1bmNhdGUpLiBUaGlzIGNhbgorICogcmVzdWx0IGluIGRlYWRsb2NrIHNpbmNlIHRoZSBsb25nIHJ1bm5pbmcgdHJhbnMgbWlnaHQgbmVlZCB0byB3YWl0CisgKiBmb3IgdGhlIGlub2RlIHdlIGp1c3QgbG9ja2VkIGluIG9yZGVyIHRvIHB1c2ggdGhlIHRhaWwgYW5kIGZyZWUgc3BhY2UKKyAqIGluIHRoZSBsb2cuCisgKi8KK3ZvaWQKK3hmc19sb2NrX2lub2RlcygKKwl4ZnNfaW5vZGVfdAkqKmlwcywKKwlpbnQJCWlub2RlcywKKwlpbnQJCWZpcnN0X2xvY2tlZCwKKwl1aW50CQlsb2NrX21vZGUpCit7CisJaW50CQlhdHRlbXB0cyA9IDAsIGksIGosIHRyeV9sb2NrOworCXhmc19sb2dfaXRlbV90CSpscDsKKworCUFTU0VSVChpcHMgJiYgKGlub2RlcyA+PSAyKSk7IC8qIHdlIG5lZWQgYXQgbGVhc3QgdHdvICovCisKKwlpZiAoZmlyc3RfbG9ja2VkKSB7CisJCXRyeV9sb2NrID0gMTsKKwkJaSA9IDE7CisJfSBlbHNlIHsKKwkJdHJ5X2xvY2sgPSAwOworCQlpID0gMDsKKwl9CisKK2FnYWluOgorCWZvciAoOyBpIDwgaW5vZGVzOyBpKyspIHsKKwkJQVNTRVJUKGlwc1tpXSk7CisKKwkJaWYgKGkgJiYgKGlwc1tpXSA9PSBpcHNbaS0xXSkpCS8qIEFscmVhZHkgbG9ja2VkICovCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBJZiB0cnlfbG9jayBpcyBub3Qgc2V0IHlldCwgbWFrZSBzdXJlIGFsbCBsb2NrZWQgaW5vZGVzCisJCSAqIGFyZSBub3QgaW4gdGhlIEFJTC4KKwkJICogSWYgYW55IGFyZSwgc2V0IHRyeV9sb2NrIHRvIGJlIHVzZWQgbGF0ZXIuCisJCSAqLworCisJCWlmICghdHJ5X2xvY2spIHsKKwkJCWZvciAoaiA9IChpIC0gMSk7IGogPj0gMCAmJiAhdHJ5X2xvY2s7IGotLSkgeworCQkJCWxwID0gKHhmc19sb2dfaXRlbV90ICopaXBzW2pdLT5pX2l0ZW1wOworCQkJCWlmIChscCAmJiAobHAtPmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkpIHsKKwkJCQkJdHJ5X2xvY2srKzsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBJZiBhbnkgb2YgdGhlIHByZXZpb3VzIGxvY2tzIHdlIGhhdmUgbG9ja2VkIGlzIGluIHRoZSBBSUwsCisJCSAqIHdlIG11c3QgVFJZIHRvIGdldCB0aGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IGxvY2tzLiBJZgorCQkgKiB3ZSBjYW4ndCBnZXQgYW55LCB3ZSBtdXN0IHJlbGVhc2UgYWxsIHdlIGhhdmUKKwkJICogYW5kIHRyeSBhZ2Fpbi4KKwkJICovCisKKwkJaWYgKHRyeV9sb2NrKSB7CisJCQkvKiB0cnlfbG9jayBtdXN0IGJlIDAgaWYgaSBpcyAwLiAqLworCQkJLyoKKwkJCSAqIHRyeV9sb2NrIG1lYW5zIHdlIGhhdmUgYW4gaW5vZGUgbG9ja2VkCisJCQkgKiB0aGF0IGlzIGluIHRoZSBBSUwuCisJCQkgKi8KKwkJCUFTU0VSVChpICE9IDApOworCQkJaWYgKCF4ZnNfaWxvY2tfbm93YWl0KGlwc1tpXSwgbG9ja19tb2RlKSkgeworCQkJCWF0dGVtcHRzKys7CisKKwkJCQkvKgorCQkJCSAqIFVubG9jayBhbGwgcHJldmlvdXMgZ3V5cyBhbmQgdHJ5IGFnYWluLgorCQkJCSAqIHhmc19pdW5sb2NrIHdpbGwgdHJ5IHRvIHB1c2ggdGhlIHRhaWwKKwkJCQkgKiBpZiB0aGUgaW5vZGUgaXMgaW4gdGhlIEFJTC4KKwkJCQkgKi8KKworCQkJCWZvcihqID0gaSAtIDE7IGogPj0gMDsgai0tKSB7CisKKwkJCQkJLyoKKwkJCQkJICogQ2hlY2sgdG8gc2VlIGlmIHdlJ3ZlIGFscmVhZHkKKwkJCQkJICogdW5sb2NrZWQgdGhpcyBvbmUuCisJCQkJCSAqIE5vdCB0aGUgZmlyc3Qgb25lIGdvaW5nIGJhY2ssCisJCQkJCSAqIGFuZCB0aGUgaW5vZGUgcHRyIGlzIHRoZSBzYW1lLgorCQkJCQkgKi8KKwkJCQkJaWYgKChqICE9IChpIC0gMSkpICYmIGlwc1tqXSA9PQorCQkJCQkJCQlpcHNbaisxXSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCXhmc19pdW5sb2NrKGlwc1tqXSwgbG9ja19tb2RlKTsKKwkJCQl9CisKKwkJCQlpZiAoKGF0dGVtcHRzICUgNSkgPT0gMCkgeworCQkJCQlkZWxheSgxKTsgLyogRG9uJ3QganVzdCBzcGluIHRoZSBDUFUgKi8KKyNpZmRlZiBERUJVRworCQkJCQl4ZnNfbG9ja19kZWxheXMrKzsKKyNlbmRpZgorCQkJCX0KKwkJCQlpID0gMDsKKwkJCQl0cnlfbG9jayA9IDA7CisJCQkJZ290byBhZ2FpbjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXhmc19pbG9jayhpcHNbaV0sIGxvY2tfbW9kZSk7CisJCX0KKwl9CisKKyNpZmRlZiBERUJVRworCWlmIChhdHRlbXB0cykgeworCQlpZiAoYXR0ZW1wdHMgPCA1KSB4ZnNfc21hbGxfcmV0cmllcysrOworCQllbHNlIGlmIChhdHRlbXB0cyA8IDEwMCkgeGZzX21pZGRsZV9yZXRyaWVzKys7CisJCWVsc2UgeGZzX2xvdHNfcmV0cmllcysrOworCX0gZWxzZSB7CisJCXhmc19sb2NrZWRfbisrOworCX0KKyNlbmRpZgorfQorCisjaWZkZWYJREVCVUcKKyNkZWZpbmUJUkVNT1ZFX0RFQlVHX1RSQUNFKHgpCXtyZW1vdmVfd2hpY2hfZXJyb3JfcmV0dXJuID0gKHgpO30KK2ludCByZW1vdmVfd2hpY2hfZXJyb3JfcmV0dXJuID0gMDsKKyNlbHNlIC8qICEgREVCVUcgKi8KKyNkZWZpbmUJUkVNT1ZFX0RFQlVHX1RSQUNFKHgpCisjZW5kaWYJLyogISBERUJVRyAqLworCisKKy8qCisgKiB4ZnNfcmVtb3ZlCisgKgorICovCitTVEFUSUMgaW50Cit4ZnNfcmVtb3ZlKAorCWJodl9kZXNjX3QJCSpkaXJfYmRwLAorCXZuYW1lX3QJCQkqZGVudHJ5LAorCWNyZWRfdAkJCSpjcmVkcCkKK3sKKwl2bm9kZV90CQkJKmRpcl92cDsKKwljaGFyCQkJKm5hbWUgPSBWTkFNRShkZW50cnkpOworCXhmc19pbm9kZV90ICAgICAgICAgICAgICpkcCwgKmlwOworCXhmc190cmFuc190ICAgICAgICAgICAgICp0cCA9IE5VTEw7CisJeGZzX21vdW50X3QJCSptcDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IDA7CisJeGZzX2JtYXBfZnJlZV90ICAgICAgICAgZnJlZV9saXN0OworCXhmc19mc2Jsb2NrX3QgICAgICAgICAgIGZpcnN0X2Jsb2NrOworCWludAkJCWNhbmNlbF9mbGFnczsKKwlpbnQJCQljb21taXR0ZWQ7CisJaW50CQkJZG1fZGlfbW9kZSA9IDA7CisJaW50CQkJbGlua196ZXJvOworCXVpbnQJCQlyZXNibGtzOworCWludAkJCW5hbWVsZW47CisKKwlkaXJfdnAgPSBCSFZfVE9fVk5PREUoZGlyX2JkcCk7CisJdm5fdHJhY2VfZW50cnkoZGlyX3ZwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKworCWRwID0gWEZTX0JIVlRPSShkaXJfYmRwKTsKKwltcCA9IGRwLT5pX21vdW50OworCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisKKwluYW1lbGVuID0gVk5BTUVMRU4oZGVudHJ5KTsKKworCWlmIChETV9FVkVOVF9FTkFCTEVEKGRpcl92cC0+dl92ZnNwLCBkcCwgRE1fRVZFTlRfUkVNT1ZFKSkgeworCQllcnJvciA9IFhGU19TRU5EX05BTUVTUChtcCwgRE1fRVZFTlRfUkVNT1ZFLCBkaXJfdnAsCisJCQkJCURNX1JJR0hUX05VTEwsIE5VTEwsIERNX1JJR0hUX05VTEwsCisJCQkJCW5hbWUsIE5VTEwsIDAsIDAsIDApOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyogRnJvbSB0aGlzIHBvaW50IG9uLCByZXR1cm4gdGhyb3VnaCBzdGRfcmV0dXJuICovCisJaXAgPSBOVUxMOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGdldCBhIHJlZmVyZW5jZSB0byBpcCBiZWZvcmUgd2UgZ2V0IG91ciBsb2cKKwkgKiByZXNlcnZhdGlvbi4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHdlIGNhbm5vdCBjYWxsCisJICogeGZzX2lnZXQgZm9yIGFuIGlub2RlIGZvciB3aGljaCB3ZSBkbyBub3QgaGF2ZSBhIHJlZmVyZW5jZQorCSAqIG9uY2Ugd2UndmUgYWNxdWlyZWQgYSBsb2cgcmVzZXJ2YXRpb24uIFRoaXMgaXMgYmVjYXVzZSB0aGUKKwkgKiBpbm9kZSB3ZSBhcmUgdHJ5aW5nIHRvIGdldCBtaWdodCBiZSBpbiB4ZnNfaW5hY3RpdmUgZ29pbmcKKwkgKiBmb3IgYSBsb2cgcmVzZXJ2YXRpb24uIFNpbmNlIHdlJ2xsIGhhdmUgdG8gd2FpdCBmb3IgdGhlCisJICogaW5hY3RpdmUgY29kZSB0byBjb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nIGZyb20geGZzX2lnZXQsCisJICogd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBoYXZlIGxvZyBzcGFjZSByZXNlcnZlZAorCSAqIHdoZW4gd2UgY2FsbCB4ZnNfaWdldC4gIEluc3RlYWQgd2UgZ2V0IGFuIHVubG9ja2VkIHJlZmVyZWNlCisJICogdG8gdGhlIGlub2RlIGJlZm9yZSBnZXR0aW5nIG91ciBsb2cgcmVzZXJ2YXRpb24uCisJICovCisJZXJyb3IgPSB4ZnNfZ2V0X2Rpcl9lbnRyeShkZW50cnksICZpcCk7CisJaWYgKGVycm9yKSB7CisJCVJFTU9WRV9ERUJVR19UUkFDRShfX0xJTkVfXyk7CisJCWdvdG8gc3RkX3JldHVybjsKKwl9CisKKwlkbV9kaV9tb2RlID0gaXAtPmlfZC5kaV9tb2RlOworCisJdm5fdHJhY2VfZW50cnkoWEZTX0lUT1YoaXApLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKworCUlUUkFDRShpcCk7CisKKwllcnJvciA9IFhGU19RTV9EUUFUVEFDSChtcCwgZHAsIDApOworCWlmICghZXJyb3IgJiYgZHAgIT0gaXApCisJCWVycm9yID0gWEZTX1FNX0RRQVRUQUNIKG1wLCBpcCwgMCk7CisJaWYgKGVycm9yKSB7CisJCVJFTU9WRV9ERUJVR19UUkFDRShfX0xJTkVfXyk7CisJCUlSRUxFKGlwKTsKKwkJZ290byBzdGRfcmV0dXJuOworCX0KKworCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfUkVNT1ZFKTsKKwljYW5jZWxfZmxhZ3MgPSBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTOworCS8qCisJICogV2UgdHJ5IHRvIGdldCB0aGUgcmVhbCBzcGFjZSByZXNlcnZhdGlvbiBmaXJzdCwKKwkgKiBhbGxvd2luZyBmb3IgZGlyZWN0b3J5IGJ0cmVlIGRlbGV0aW9uKHMpIGltcGx5aW5nCisJICogcG9zc2libGUgYm1hcCBpbnNlcnQocykuICBJZiB3ZSBjYW4ndCBnZXQgdGhlIHNwYWNlCisJICogcmVzZXJ2YXRpb24gdGhlbiB3ZSB1c2UgMCBpbnN0ZWFkLCBhbmQgYXZvaWQgdGhlIGJtYXAKKwkgKiBidHJlZSBpbnNlcnQocykgaW4gdGhlIGRpcmVjdG9yeSBjb2RlIGJ5LCBpZiB0aGUgYm1hcAorCSAqIGluc2VydCB0cmllcyB0byBoYXBwZW4sIGluc3RlYWQgdHJpbW1pbmcgdGhlIExBU1QKKwkgKiBibG9jayBmcm9tIHRoZSBkaXJlY3RvcnkuCisJICovCisJcmVzYmxrcyA9IFhGU19SRU1PVkVfU1BBQ0VfUkVTKG1wKTsKKwllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCByZXNibGtzLCBYRlNfUkVNT1ZFX0xPR19SRVMobXApLCAwLAorCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywgWEZTX1JFTU9WRV9MT0dfQ09VTlQpOworCWlmIChlcnJvciA9PSBFTk9TUEMpIHsKKwkJcmVzYmxrcyA9IDA7CisJCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIFhGU19SRU1PVkVfTE9HX1JFUyhtcCksIDAsCisJCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywgWEZTX1JFTU9WRV9MT0dfQ09VTlQpOworCX0KKwlpZiAoZXJyb3IpIHsKKwkJQVNTRVJUKGVycm9yICE9IEVOT1NQQyk7CisJCVJFTU9WRV9ERUJVR19UUkFDRShfX0xJTkVfXyk7CisJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQlJUkVMRShpcCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwllcnJvciA9IHhmc19sb2NrX2Rpcl9hbmRfZW50cnkoZHAsIGRlbnRyeSwgaXApOworCWlmIChlcnJvcikgeworCQlSRU1PVkVfREVCVUdfVFJBQ0UoX19MSU5FX18pOworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBjYW5jZWxfZmxhZ3MpOworCQlJUkVMRShpcCk7CisJCWdvdG8gc3RkX3JldHVybjsKKwl9CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQsIHdlJ3ZlIGdvdHRlbiBib3RoIHRoZSBkaXJlY3RvcnkgYW5kIHRoZSBlbnRyeQorCSAqIGlub2RlcyBsb2NrZWQuCisJICovCisJeGZzX3RyYW5zX2lqb2luKHRwLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOworCWlmIChkcCAhPSBpcCkgeworCQkvKgorCQkgKiBJbmNyZW1lbnQgdm5vZGUgcmVmIGNvdW50IG9ubHkgaW4gdGhpcyBjYXNlIHNpbmNlCisJCSAqIHRoZXJlJ3MgYW4gZXh0cmEgdm5vZGUgcmVmZXJlbmNlIGluIHRoZSBjYXNlIHdoZXJlCisJCSAqIGRwID09IGlwLgorCQkgKi8KKwkJSUhPTEQoZHApOworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJfQorCisJLyoKKwkgKiBFbnRyeSBtdXN0IGV4aXN0IHNpbmNlIHdlIGRpZCBhIGxvb2t1cCBpbiB4ZnNfbG9ja19kaXJfYW5kX2VudHJ5LgorCSAqLworCVhGU19CTUFQX0lOSVQoJmZyZWVfbGlzdCwgJmZpcnN0X2Jsb2NrKTsKKwllcnJvciA9IFhGU19ESVJfUkVNT1ZFTkFNRShtcCwgdHAsIGRwLCBuYW1lLCBuYW1lbGVuLCBpcC0+aV9pbm8sCisJCSZmaXJzdF9ibG9jaywgJmZyZWVfbGlzdCwgMCk7CisJaWYgKGVycm9yKSB7CisJCUFTU0VSVChlcnJvciAhPSBFTk9FTlQpOworCQlSRU1PVkVfREVCVUdfVFJBQ0UoX19MSU5FX18pOworCQlnb3RvIGVycm9yMTsKKwl9CisJeGZzX2ljaGd0aW1lKGRwLCBYRlNfSUNIR1RJTUVfTU9EIHwgWEZTX0lDSEdUSU1FX0NIRyk7CisKKwlkcC0+aV9nZW4rKzsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBkcCwgWEZTX0lMT0dfQ09SRSk7CisKKwllcnJvciA9IHhmc19kcm9wbGluayh0cCwgaXApOworCWlmIChlcnJvcikgeworCQlSRU1PVkVfREVCVUdfVFJBQ0UoX19MSU5FX18pOworCQlnb3RvIGVycm9yMTsKKwl9CisKKwkvKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBsaW5rIHdoaWxlCisJICogd2UgYXJlIGluIHRoZSB0cmFuc2FjdGlvbi4KKwkgKi8KKwlsaW5rX3plcm8gPSAoaXApLT5pX2QuZGlfbmxpbms9PTA7CisKKwkvKgorCSAqIFRha2UgYW4gZXh0cmEgcmVmIG9uIHRoZSBpbm9kZSBzbyB0aGF0IGl0IGRvZXNuJ3QKKwkgKiBnbyB0byB4ZnNfaW5hY3RpdmUoKSBmcm9tIHdpdGhpbiB0aGUgY29tbWl0LgorCSAqLworCUlIT0xEKGlwKTsKKworCS8qCisJICogSWYgdGhpcyBpcyBhIHN5bmNocm9ub3VzIG1vdW50LCBtYWtlIHN1cmUgdGhhdCB0aGUKKwkgKiByZW1vdmUgdHJhbnNhY3Rpb24gZ29lcyB0byBkaXNrIGJlZm9yZSByZXR1cm5pbmcgdG8KKwkgKiB0aGUgdXNlci4KKwkgKi8KKwlpZiAobXAtPm1fZmxhZ3MgJiAoWEZTX01PVU5UX1dTWU5DfFhGU19NT1VOVF9ESVJTWU5DKSkgeworCQl4ZnNfdHJhbnNfc2V0X3N5bmModHApOworCX0KKworCWVycm9yID0geGZzX2JtYXBfZmluaXNoKCZ0cCwgJmZyZWVfbGlzdCwgZmlyc3RfYmxvY2ssICZjb21taXR0ZWQpOworCWlmIChlcnJvcikgeworCQlSRU1PVkVfREVCVUdfVFJBQ0UoX19MSU5FX18pOworCQlnb3RvIGVycm9yX3JlbGU7CisJfQorCisJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTLCBOVUxMKTsKKwlpZiAoZXJyb3IpIHsKKwkJSVJFTEUoaXApOworCQlnb3RvIHN0ZF9yZXR1cm47CisJfQorCisJLyoKKwkgKiBCZWZvcmUgd2UgZHJvcCBvdXIgZXh0cmEgcmVmZXJlbmNlIHRvIHRoZSBpbm9kZSwgcHVyZ2UgaXQKKwkgKiBmcm9tIHRoZSByZWZjYWNoZSBpZiBpdCBpcyB0aGVyZS4gIEJ5IHdhaXRpbmcgdW50aWwgYWZ0ZXJ3YXJkcworCSAqIHRvIGRvIHRoZSBJUkVMRSwgd2UgZW5zdXJlIHRoYXQgd2Ugd29uJ3QgZ28gaW5hY3RpdmUgaW4gdGhlCisJICogeGZzX3JlZmNhY2hlX3B1cmdlX2lwIHJvdXRpbmUgKGFsdGhvdWdoIHRoYXQgd291bGQgYmUgT0spLgorCSAqLworCXhmc19yZWZjYWNoZV9wdXJnZV9pcChpcCk7CisKKwl2bl90cmFjZV9leGl0KFhGU19JVE9WKGlwKSwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwkvKgorCSAqIExldCBpbnRlcnBvc2VkIGZpbGUgc3lzdGVtcyBrbm93IGFib3V0IHJlbW92ZWQgbGlua3MuCisJICovCisJVk9QX0xJTktfUkVNT1ZFRChYRlNfSVRPVihpcCksIGRpcl92cCwgbGlua196ZXJvKTsKKworCUlSRUxFKGlwKTsKKworLyoJRmFsbCB0aHJvdWdoIHRvIHN0ZF9yZXR1cm4gd2l0aCBlcnJvciA9IDAgKi8KKyBzdGRfcmV0dXJuOgorCWlmIChETV9FVkVOVF9FTkFCTEVEKGRpcl92cC0+dl92ZnNwLCBkcCwKKwkJCQkJCURNX0VWRU5UX1BPU1RSRU1PVkUpKSB7CisJCSh2b2lkKSBYRlNfU0VORF9OQU1FU1AobXAsIERNX0VWRU5UX1BPU1RSRU1PVkUsCisJCQkJZGlyX3ZwLCBETV9SSUdIVF9OVUxMLAorCQkJCU5VTEwsIERNX1JJR0hUX05VTEwsCisJCQkJbmFtZSwgTlVMTCwgZG1fZGlfbW9kZSwgZXJyb3IsIDApOworCX0KKwlyZXR1cm4gZXJyb3I7CisKKyBlcnJvcjE6CisJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOworCWNhbmNlbF9mbGFncyB8PSBYRlNfVFJBTlNfQUJPUlQ7CisJeGZzX3RyYW5zX2NhbmNlbCh0cCwgY2FuY2VsX2ZsYWdzKTsKKwlnb3RvIHN0ZF9yZXR1cm47CisKKyBlcnJvcl9yZWxlOgorCS8qCisJICogSW4gdGhpcyBjYXNlIG1ha2Ugc3VyZSB0byBub3QgcmVsZWFzZSB0aGUgaW5vZGUgdW50aWwgYWZ0ZXIKKwkgKiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyBhYm9ydGVkLiAgUmVsZWFzaW5nIGl0IGJlZm9yZWhhbmQKKwkgKiBjYW4gY2F1c2UgdXMgdG8gZ28gdG8geGZzX2luYWN0aXZlIGFuZCBzdGFydCBhIHJlY3Vyc2l2ZQorCSAqIHRyYW5zYWN0aW9uIHdoaWNoIGNhbiBlYXNpbHkgZGVhZGxvY2sgd2l0aCB0aGUgY3VycmVudCBvbmUuCisJICovCisJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOworCWNhbmNlbF9mbGFncyB8PSBYRlNfVFJBTlNfQUJPUlQ7CisJeGZzX3RyYW5zX2NhbmNlbCh0cCwgY2FuY2VsX2ZsYWdzKTsKKworCS8qCisJICogQmVmb3JlIHdlIGRyb3Agb3VyIGV4dHJhIHJlZmVyZW5jZSB0byB0aGUgaW5vZGUsIHB1cmdlIGl0CisJICogZnJvbSB0aGUgcmVmY2FjaGUgaWYgaXQgaXMgdGhlcmUuICBCeSB3YWl0aW5nIHVudGlsIGFmdGVyd2FyZHMKKwkgKiB0byBkbyB0aGUgSVJFTEUsIHdlIGVuc3VyZSB0aGF0IHdlIHdvbid0IGdvIGluYWN0aXZlIGluIHRoZQorCSAqIHhmc19yZWZjYWNoZV9wdXJnZV9pcCByb3V0aW5lIChhbHRob3VnaCB0aGF0IHdvdWxkIGJlIE9LKS4KKwkgKi8KKwl4ZnNfcmVmY2FjaGVfcHVyZ2VfaXAoaXApOworCisJSVJFTEUoaXApOworCisJZ290byBzdGRfcmV0dXJuOworfQorCisKKy8qCisgKiB4ZnNfbGluaworICoKKyAqLworU1RBVElDIGludAoreGZzX2xpbmsoCisJYmh2X2Rlc2NfdAkJKnRhcmdldF9kaXJfYmRwLAorCXZub2RlX3QJCQkqc3JjX3ZwLAorCXZuYW1lX3QJCQkqZGVudHJ5LAorCWNyZWRfdAkJCSpjcmVkcCkKK3sKKwl4ZnNfaW5vZGVfdAkJKnRkcCwgKnNpcDsKKwl4ZnNfdHJhbnNfdAkJKnRwOworCXhmc19tb3VudF90CQkqbXA7CisJeGZzX2lub2RlX3QJCSppcHNbMl07CisJaW50CQkJZXJyb3I7CisJeGZzX2JtYXBfZnJlZV90ICAgICAgICAgZnJlZV9saXN0OworCXhmc19mc2Jsb2NrX3QgICAgICAgICAgIGZpcnN0X2Jsb2NrOworCWludAkJCWNhbmNlbF9mbGFnczsKKwlpbnQJCQljb21taXR0ZWQ7CisJdm5vZGVfdAkJCSp0YXJnZXRfZGlyX3ZwOworCWJodl9kZXNjX3QJCSpzcmNfYmRwOworCWludAkJCXJlc2Jsa3M7CisJY2hhcgkJCSp0YXJnZXRfbmFtZSA9IFZOQU1FKGRlbnRyeSk7CisJaW50CQkJdGFyZ2V0X25hbWVsZW47CisKKwl0YXJnZXRfZGlyX3ZwID0gQkhWX1RPX1ZOT0RFKHRhcmdldF9kaXJfYmRwKTsKKwl2bl90cmFjZV9lbnRyeSh0YXJnZXRfZGlyX3ZwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwl2bl90cmFjZV9lbnRyeShzcmNfdnAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCisJdGFyZ2V0X25hbWVsZW4gPSBWTkFNRUxFTihkZW50cnkpOworCWlmIChzcmNfdnAtPnZfdHlwZSA9PSBWRElSKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVQRVJNKTsKKworCS8qCisJICogRm9yIG5vdywgbWFudWFsbHkgZmluZCB0aGUgWEZTIGJlaGF2aW9yIGRlc2NyaXB0b3IgZm9yCisJICogdGhlIHNvdXJjZSB2bm9kZS4gIElmIGl0IGRvZXNuJ3QgZXhpc3QgdGhlbiBzb21ldGhpbmcKKwkgKiBpcyB3cm9uZyBhbmQgd2Ugc2hvdWxkIGp1c3QgcmV0dXJuIGFuIGVycm9yLgorCSAqIEV2ZW50dWFsbHkgd2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyBsaW5rIGlzIGdvaW5nIHRvCisJICogd29yayBpbiB0aGUgZmFjZSBvZiBzdGFja2VkIHZub2Rlcy4KKwkgKi8KKwlzcmNfYmRwID0gdm5fYmh2X2xvb2t1cF91bmxvY2tlZChWTl9CSFZfSEVBRChzcmNfdnApLCAmeGZzX3Zub2Rlb3BzKTsKKwlpZiAoc3JjX2JkcCA9PSBOVUxMKSB7CisJCXJldHVybiBYRlNfRVJST1IoRVhERVYpOworCX0KKwlzaXAgPSBYRlNfQkhWVE9JKHNyY19iZHApOworCXRkcCA9IFhGU19CSFZUT0kodGFyZ2V0X2Rpcl9iZHApOworCW1wID0gdGRwLT5pX21vdW50OworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCisJaWYgKERNX0VWRU5UX0VOQUJMRUQoc3JjX3ZwLT52X3Zmc3AsIHRkcCwgRE1fRVZFTlRfTElOSykpIHsKKwkJZXJyb3IgPSBYRlNfU0VORF9OQU1FU1AobXAsIERNX0VWRU5UX0xJTkssCisJCQkJCXRhcmdldF9kaXJfdnAsIERNX1JJR0hUX05VTEwsCisJCQkJCXNyY192cCwgRE1fUklHSFRfTlVMTCwKKwkJCQkJdGFyZ2V0X25hbWUsIE5VTEwsIDAsIDAsIDApOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyogUmV0dXJuIHRocm91Z2ggc3RkX3JldHVybiBhZnRlciB0aGlzIHBvaW50LiAqLworCisJZXJyb3IgPSBYRlNfUU1fRFFBVFRBQ0gobXAsIHNpcCwgMCk7CisJaWYgKCFlcnJvciAmJiBzaXAgIT0gdGRwKQorCQllcnJvciA9IFhGU19RTV9EUUFUVEFDSChtcCwgdGRwLCAwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gc3RkX3JldHVybjsKKworCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfTElOSyk7CisJY2FuY2VsX2ZsYWdzID0gWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUzsKKwlyZXNibGtzID0gWEZTX0xJTktfU1BBQ0VfUkVTKG1wLCB0YXJnZXRfbmFtZWxlbik7CisJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgcmVzYmxrcywgWEZTX0xJTktfTE9HX1JFUyhtcCksIDAsCisJCQlYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLCBYRlNfTElOS19MT0dfQ09VTlQpOworCWlmIChlcnJvciA9PSBFTk9TUEMpIHsKKwkJcmVzYmxrcyA9IDA7CisJCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIFhGU19MSU5LX0xPR19SRVMobXApLCAwLAorCQkJCVhGU19UUkFOU19QRVJNX0xPR19SRVMsIFhGU19MSU5LX0xPR19DT1VOVCk7CisJfQorCWlmIChlcnJvcikgeworCQljYW5jZWxfZmxhZ3MgPSAwOworCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisKKwlpZiAoc2lwLT5pX2lubyA8IHRkcC0+aV9pbm8pIHsKKwkJaXBzWzBdID0gc2lwOworCQlpcHNbMV0gPSB0ZHA7CisJfSBlbHNlIHsKKwkJaXBzWzBdID0gdGRwOworCQlpcHNbMV0gPSBzaXA7CisJfQorCisJeGZzX2xvY2tfaW5vZGVzKGlwcywgMiwgMCwgWEZTX0lMT0NLX0VYQ0wpOworCisJLyoKKwkgKiBJbmNyZW1lbnQgdm5vZGUgcmVmIGNvdW50cyBzaW5jZSB4ZnNfdHJhbnNfY29tbWl0ICYKKwkgKiB4ZnNfdHJhbnNfY2FuY2VsIHdpbGwgYm90aCB1bmxvY2sgdGhlIGlub2RlcyBhbmQKKwkgKiBkZWNyZW1lbnQgdGhlIGFzc29jaWF0ZWQgcmVmIGNvdW50cy4KKwkgKi8KKwlWTl9IT0xEKHNyY192cCk7CisJVk5fSE9MRCh0YXJnZXRfZGlyX3ZwKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIHNpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19pam9pbih0cCwgdGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwkvKgorCSAqIElmIHRoZSBzb3VyY2UgaGFzIHRvbyBtYW55IGxpbmtzLCB3ZSBjYW4ndCBtYWtlIGFueSBtb3JlIHRvIGl0LgorCSAqLworCWlmIChzaXAtPmlfZC5kaV9ubGluayA+PSBYRlNfTUFYTElOSykgeworCQllcnJvciA9IFhGU19FUlJPUihFTUxJTkspOworCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisKKwlpZiAocmVzYmxrcyA9PSAwICYmCisJICAgIChlcnJvciA9IFhGU19ESVJfQ0FORU5URVIobXAsIHRwLCB0ZHAsIHRhcmdldF9uYW1lLAorCQkJdGFyZ2V0X25hbWVsZW4pKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwlYRlNfQk1BUF9JTklUKCZmcmVlX2xpc3QsICZmaXJzdF9ibG9jayk7CisKKwllcnJvciA9IFhGU19ESVJfQ1JFQVRFTkFNRShtcCwgdHAsIHRkcCwgdGFyZ2V0X25hbWUsIHRhcmdldF9uYW1lbGVuLAorCQkJCSAgIHNpcC0+aV9pbm8sICZmaXJzdF9ibG9jaywgJmZyZWVfbGlzdCwKKwkJCQkgICByZXNibGtzKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gYWJvcnRfcmV0dXJuOworCXhmc19pY2hndGltZSh0ZHAsIFhGU19JQ0hHVElNRV9NT0QgfCBYRlNfSUNIR1RJTUVfQ0hHKTsKKwl0ZHAtPmlfZ2VuKys7CisJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgdGRwLCBYRlNfSUxPR19DT1JFKTsKKworCWVycm9yID0geGZzX2J1bXBsaW5rKHRwLCBzaXApOworCWlmIChlcnJvcikgeworCQlnb3RvIGFib3J0X3JldHVybjsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBzeW5jaHJvbm91cyBtb3VudCwgbWFrZSBzdXJlIHRoYXQgdGhlCisJICogbGluayB0cmFuc2FjdGlvbiBnb2VzIHRvIGRpc2sgYmVmb3JlIHJldHVybmluZyB0bworCSAqIHRoZSB1c2VyLgorCSAqLworCWlmIChtcC0+bV9mbGFncyAmIChYRlNfTU9VTlRfV1NZTkN8WEZTX01PVU5UX0RJUlNZTkMpKSB7CisJCXhmc190cmFuc19zZXRfc3luYyh0cCk7CisJfQorCisJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2ggKCZ0cCwgJmZyZWVfbGlzdCwgZmlyc3RfYmxvY2ssICZjb21taXR0ZWQpOworCWlmIChlcnJvcikgeworCQl4ZnNfYm1hcF9jYW5jZWwoJmZyZWVfbGlzdCk7CisJCWdvdG8gYWJvcnRfcmV0dXJuOworCX0KKworCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUywgTlVMTCk7CisJaWYgKGVycm9yKSB7CisJCWdvdG8gc3RkX3JldHVybjsKKwl9CisKKwkvKiBGYWxsIHRocm91Z2ggdG8gc3RkX3JldHVybiB3aXRoIGVycm9yID0gMC4gKi8KK3N0ZF9yZXR1cm46CisJaWYgKERNX0VWRU5UX0VOQUJMRUQoc3JjX3ZwLT52X3Zmc3AsIHNpcCwKKwkJCQkJCURNX0VWRU5UX1BPU1RMSU5LKSkgeworCQkodm9pZCkgWEZTX1NFTkRfTkFNRVNQKG1wLCBETV9FVkVOVF9QT1NUTElOSywKKwkJCQl0YXJnZXRfZGlyX3ZwLCBETV9SSUdIVF9OVUxMLAorCQkJCXNyY192cCwgRE1fUklHSFRfTlVMTCwKKwkJCQl0YXJnZXRfbmFtZSwgTlVMTCwgMCwgZXJyb3IsIDApOworCX0KKwlyZXR1cm4gZXJyb3I7CisKKyBhYm9ydF9yZXR1cm46CisJY2FuY2VsX2ZsYWdzIHw9IFhGU19UUkFOU19BQk9SVDsKKwkvKiBGQUxMVEhST1VHSCAqLworIGVycm9yX3JldHVybjoKKwl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBjYW5jZWxfZmxhZ3MpOworCisJZ290byBzdGRfcmV0dXJuOworfQorLyoKKyAqIHhmc19ta2RpcgorICoKKyAqLworU1RBVElDIGludAoreGZzX21rZGlyKAorCWJodl9kZXNjX3QJCSpkaXJfYmRwLAorCXZuYW1lX3QJCQkqZGVudHJ5LAorCXZhdHRyX3QJCQkqdmFwLAorCXZub2RlX3QJCQkqKnZwcCwKKwljcmVkX3QJCQkqY3JlZHApCit7CisJY2hhcgkJCSpkaXJfbmFtZSA9IFZOQU1FKGRlbnRyeSk7CisJeGZzX2lub2RlX3QgICAgICAgICAgICAgKmRwOworCXhmc19pbm9kZV90CQkqY2RwOwkvKiBpbm9kZSBvZiBjcmVhdGVkIGRpciAqLworCXZub2RlX3QJCQkqY3ZwOwkvKiB2bm9kZSBvZiBjcmVhdGVkIGRpciAqLworCXhmc190cmFuc190CQkqdHA7CisJeGZzX21vdW50X3QJCSptcDsKKwlpbnQJCQljYW5jZWxfZmxhZ3M7CisJaW50CQkJZXJyb3I7CisJaW50CQkJY29tbWl0dGVkOworCXhmc19ibWFwX2ZyZWVfdCAgICAgICAgIGZyZWVfbGlzdDsKKwl4ZnNfZnNibG9ja190ICAgICAgICAgICBmaXJzdF9ibG9jazsKKwl2bm9kZV90CQkJKmRpcl92cDsKKwlib29sZWFuX3QJCWRwX2pvaW5lZF90b190cmFuczsKKwlib29sZWFuX3QJCWNyZWF0ZWQgPSBCX0ZBTFNFOworCWludAkJCWRtX2V2ZW50X3NlbnQgPSAwOworCXhmc19wcmlkX3QJCXByaWQ7CisJc3RydWN0IHhmc19kcXVvdAkqdWRxcCwgKmdkcXA7CisJdWludAkJCXJlc2Jsa3M7CisJaW50CQkJZG1fZGlfbW9kZTsKKwlpbnQJCQlkaXJfbmFtZWxlbjsKKworCWRpcl92cCA9IEJIVl9UT19WTk9ERShkaXJfYmRwKTsKKwlkcCA9IFhGU19CSFZUT0koZGlyX2JkcCk7CisJbXAgPSBkcC0+aV9tb3VudDsKKworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCisJZGlyX25hbWVsZW4gPSBWTkFNRUxFTihkZW50cnkpOworCisJdHAgPSBOVUxMOworCWRwX2pvaW5lZF90b190cmFucyA9IEJfRkFMU0U7CisJZG1fZGlfbW9kZSA9IHZhcC0+dmFfbW9kZXxWVFRPSUYodmFwLT52YV90eXBlKTsKKworCWlmIChETV9FVkVOVF9FTkFCTEVEKGRpcl92cC0+dl92ZnNwLCBkcCwgRE1fRVZFTlRfQ1JFQVRFKSkgeworCQllcnJvciA9IFhGU19TRU5EX05BTUVTUChtcCwgRE1fRVZFTlRfQ1JFQVRFLAorCQkJCQlkaXJfdnAsIERNX1JJR0hUX05VTEwsIE5VTEwsCisJCQkJCURNX1JJR0hUX05VTEwsIGRpcl9uYW1lLCBOVUxMLAorCQkJCQlkbV9kaV9tb2RlLCAwLCAwKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCQlkbV9ldmVudF9zZW50ID0gMTsKKwl9CisKKwkvKiBSZXR1cm4gdGhyb3VnaCBzdGRfcmV0dXJuIGFmdGVyIHRoaXMgcG9pbnQuICovCisKKwl2bl90cmFjZV9lbnRyeShkaXJfdnAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCisJbXAgPSBkcC0+aV9tb3VudDsKKwl1ZHFwID0gZ2RxcCA9IE5VTEw7CisJaWYgKHZhcC0+dmFfbWFzayAmIFhGU19BVF9QUk9KSUQpCisJCXByaWQgPSAoeGZzX3ByaWRfdCl2YXAtPnZhX3Byb2ppZDsKKwllbHNlCisJCXByaWQgPSAoeGZzX3ByaWRfdClkZmx0cHJpZDsKKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhbGxvY2F0ZWQgZHF1b3Qocykgb24gZGlzay4KKwkgKi8KKwllcnJvciA9IFhGU19RTV9EUVZPUEFMTE9DKG1wLCBkcCwKKwkJCWN1cnJlbnRfZnN1aWQoY3JlZHApLCBjdXJyZW50X2ZzZ2lkKGNyZWRwKSwKKwkJCVhGU19RTU9QVF9RVU9UQUxMIHwgWEZTX1FNT1BUX0lOSEVSSVQsICZ1ZHFwLCAmZ2RxcCk7CisJaWYgKGVycm9yKQorCQlnb3RvIHN0ZF9yZXR1cm47CisKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX01LRElSKTsKKwljYW5jZWxfZmxhZ3MgPSBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTOworCXJlc2Jsa3MgPSBYRlNfTUtESVJfU1BBQ0VfUkVTKG1wLCBkaXJfbmFtZWxlbik7CisJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgcmVzYmxrcywgWEZTX01LRElSX0xPR19SRVMobXApLCAwLAorCQkJCSAgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywgWEZTX01LRElSX0xPR19DT1VOVCk7CisJaWYgKGVycm9yID09IEVOT1NQQykgeworCQlyZXNibGtzID0gMDsKKwkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgWEZTX01LRElSX0xPR19SRVMobXApLCAwLAorCQkJCQkgIFhGU19UUkFOU19QRVJNX0xPR19SRVMsCisJCQkJCSAgWEZTX01LRElSX0xPR19DT1VOVCk7CisJfQorCWlmIChlcnJvcikgeworCQljYW5jZWxfZmxhZ3MgPSAwOworCQlkcCA9IE5VTEw7CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworCXhmc19pbG9jayhkcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJLyoKKwkgKiBDaGVjayBmb3IgZGlyZWN0b3J5IGxpbmsgY291bnQgb3ZlcmZsb3cuCisJICovCisJaWYgKGRwLT5pX2QuZGlfbmxpbmsgPj0gWEZTX01BWExJTkspIHsKKwkJZXJyb3IgPSBYRlNfRVJST1IoRU1MSU5LKTsKKwkJZ290byBlcnJvcl9yZXR1cm47CisJfQorCisJLyoKKwkgKiBSZXNlcnZlIGRpc2sgcXVvdGEgYW5kIHRoZSBpbm9kZS4KKwkgKi8KKwllcnJvciA9IFhGU19UUkFOU19SRVNFUlZFX1FVT1RBKG1wLCB0cCwgdWRxcCwgZ2RxcCwgcmVzYmxrcywgMSwgMCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yX3JldHVybjsKKworCWlmIChyZXNibGtzID09IDAgJiYKKwkgICAgKGVycm9yID0gWEZTX0RJUl9DQU5FTlRFUihtcCwgdHAsIGRwLCBkaXJfbmFtZSwgZGlyX25hbWVsZW4pKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJLyoKKwkgKiBjcmVhdGUgdGhlIGRpcmVjdG9yeSBpbm9kZS4KKwkgKi8KKwllcnJvciA9IHhmc19kaXJfaWFsbG9jKCZ0cCwgZHAsCisJCQlNQUtFSU1PREUodmFwLT52YV90eXBlLHZhcC0+dmFfbW9kZSksIDIsCisJCQkwLCBjcmVkcCwgcHJpZCwgcmVzYmxrcyA+IDAsCisJCSZjZHAsIE5VTEwpOworCWlmIChlcnJvcikgeworCQlpZiAoZXJyb3IgPT0gRU5PU1BDKQorCQkJZ290byBlcnJvcl9yZXR1cm47CisJCWdvdG8gYWJvcnRfcmV0dXJuOworCX0KKwlJVFJBQ0UoY2RwKTsKKworCS8qCisJICogTm93IHdlIGFkZCB0aGUgZGlyZWN0b3J5IGlub2RlIHRvIHRoZSB0cmFuc2FjdGlvbi4KKwkgKiBXZSB3YWl0ZWQgdW50aWwgbm93IHNpbmNlIHhmc19kaXJfaWFsbG9jIG1pZ2h0IHN0YXJ0CisJICogYSBuZXcgdHJhbnNhY3Rpb24uICBIYWQgd2Ugam9pbmVkIHRoZSB0cmFuc2FjdGlvbgorCSAqIGVhcmxpZXIsIHRoZSBsb2NrcyBtaWdodCBoYXZlIGdvdHRlbiByZWxlYXNlZC4KKwkgKi8KKwlWTl9IT0xEKGRpcl92cCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOworCWRwX2pvaW5lZF90b190cmFucyA9IEJfVFJVRTsKKworCVhGU19CTUFQX0lOSVQoJmZyZWVfbGlzdCwgJmZpcnN0X2Jsb2NrKTsKKworCWVycm9yID0gWEZTX0RJUl9DUkVBVEVOQU1FKG1wLCB0cCwgZHAsIGRpcl9uYW1lLCBkaXJfbmFtZWxlbiwKKwkJCWNkcC0+aV9pbm8sICZmaXJzdF9ibG9jaywgJmZyZWVfbGlzdCwKKwkJCXJlc2Jsa3MgPyByZXNibGtzIC0gWEZTX0lBTExPQ19TUEFDRV9SRVMobXApIDogMCk7CisJaWYgKGVycm9yKSB7CisJCUFTU0VSVChlcnJvciAhPSBFTk9TUEMpOworCQlnb3RvIGVycm9yMTsKKwl9CisJeGZzX2ljaGd0aW1lKGRwLCBYRlNfSUNIR1RJTUVfTU9EIHwgWEZTX0lDSEdUSU1FX0NIRyk7CisKKwkvKgorCSAqIEJ1bXAgdGhlIGluIG1lbW9yeSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeQorCSAqIHNvIHRoYXQgb3RoZXIgcHJvY2Vzc2VzIGFjY2Vzc2luZyBpdCB3aWxsIHJlY29nbml6ZSB0aGF0CisJICogdGhlIGRpcmVjdG9yeSBoYXMgY2hhbmdlZC4KKwkgKi8KKwlkcC0+aV9nZW4rKzsKKworCWVycm9yID0gWEZTX0RJUl9JTklUKG1wLCB0cCwgY2RwLCBkcCk7CisJaWYgKGVycm9yKSB7CisJCWdvdG8gZXJyb3IyOworCX0KKworCWNkcC0+aV9nZW4gPSAxOworCWVycm9yID0geGZzX2J1bXBsaW5rKHRwLCBkcCk7CisJaWYgKGVycm9yKSB7CisJCWdvdG8gZXJyb3IyOworCX0KKworCWN2cCA9IFhGU19JVE9WKGNkcCk7CisKKwljcmVhdGVkID0gQl9UUlVFOworCisJKnZwcCA9IGN2cDsKKwlJSE9MRChjZHApOworCisJLyoKKwkgKiBBdHRhY2ggdGhlIGRxdW90cyB0byB0aGUgbmV3IGlub2RlIGFuZCBtb2RpZnkgdGhlIGljb3VudCBpbmNvcmUuCisJICovCisJWEZTX1FNX0RRVk9QQ1JFQVRFKG1wLCB0cCwgY2RwLCB1ZHFwLCBnZHFwKTsKKworCS8qCisJICogSWYgdGhpcyBpcyBhIHN5bmNocm9ub3VzIG1vdW50LCBtYWtlIHN1cmUgdGhhdCB0aGUKKwkgKiBta2RpciB0cmFuc2FjdGlvbiBnb2VzIHRvIGRpc2sgYmVmb3JlIHJldHVybmluZyB0bworCSAqIHRoZSB1c2VyLgorCSAqLworCWlmIChtcC0+bV9mbGFncyAmIChYRlNfTU9VTlRfV1NZTkN8WEZTX01PVU5UX0RJUlNZTkMpKSB7CisJCXhmc190cmFuc19zZXRfc3luYyh0cCk7CisJfQorCisJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJnRwLCAmZnJlZV9saXN0LCBmaXJzdF9ibG9jaywgJmNvbW1pdHRlZCk7CisJaWYgKGVycm9yKSB7CisJCUlSRUxFKGNkcCk7CisJCWdvdG8gZXJyb3IyOworCX0KKworCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUywgTlVMTCk7CisJWEZTX1FNX0RRUkVMRShtcCwgdWRxcCk7CisJWEZTX1FNX0RRUkVMRShtcCwgZ2RxcCk7CisJaWYgKGVycm9yKSB7CisJCUlSRUxFKGNkcCk7CisJfQorCisJLyogRmFsbCB0aHJvdWdoIHRvIHN0ZF9yZXR1cm4gd2l0aCBlcnJvciA9IDAgb3IgZXJybm8gZnJvbQorCSAqIHhmc190cmFuc19jb21taXQuICovCisKK3N0ZF9yZXR1cm46CisJaWYgKCAoY3JlYXRlZCB8fCAoZXJyb3IgIT0gMCAmJiBkbV9ldmVudF9zZW50ICE9IDApKSAmJgorCQkJRE1fRVZFTlRfRU5BQkxFRChkaXJfdnAtPnZfdmZzcCwgWEZTX0JIVlRPSShkaXJfYmRwKSwKKwkJCQkJCURNX0VWRU5UX1BPU1RDUkVBVEUpKSB7CisJCSh2b2lkKSBYRlNfU0VORF9OQU1FU1AobXAsIERNX0VWRU5UX1BPU1RDUkVBVEUsCisJCQkJCWRpcl92cCwgRE1fUklHSFRfTlVMTCwKKwkJCQkJY3JlYXRlZCA/IFhGU19JVE9WKGNkcCk6TlVMTCwKKwkJCQkJRE1fUklHSFRfTlVMTCwKKwkJCQkJZGlyX25hbWUsIE5VTEwsCisJCQkJCWRtX2RpX21vZGUsIGVycm9yLCAwKTsKKwl9CisJcmV0dXJuIGVycm9yOworCisgZXJyb3IyOgorIGVycm9yMToKKwl4ZnNfYm1hcF9jYW5jZWwoJmZyZWVfbGlzdCk7CisgYWJvcnRfcmV0dXJuOgorCWNhbmNlbF9mbGFncyB8PSBYRlNfVFJBTlNfQUJPUlQ7CisgZXJyb3JfcmV0dXJuOgorCXhmc190cmFuc19jYW5jZWwodHAsIGNhbmNlbF9mbGFncyk7CisJWEZTX1FNX0RRUkVMRShtcCwgdWRxcCk7CisJWEZTX1FNX0RRUkVMRShtcCwgZ2RxcCk7CisKKwlpZiAoIWRwX2pvaW5lZF90b190cmFucyAmJiAoZHAgIT0gTlVMTCkpIHsKKwkJeGZzX2l1bmxvY2soZHAsIFhGU19JTE9DS19FWENMKTsKKwl9CisKKwlnb3RvIHN0ZF9yZXR1cm47Cit9CisKKworLyoKKyAqIHhmc19ybWRpcgorICoKKyAqLworU1RBVElDIGludAoreGZzX3JtZGlyKAorCWJodl9kZXNjX3QJCSpkaXJfYmRwLAorCXZuYW1lX3QJCQkqZGVudHJ5LAorCWNyZWRfdAkJCSpjcmVkcCkKK3sKKwljaGFyCQkJKm5hbWUgPSBWTkFNRShkZW50cnkpOworCXhmc19pbm9kZV90ICAgICAgICAgICAgICpkcDsKKwl4ZnNfaW5vZGVfdCAgICAgICAgICAgICAqY2RwOyAgIC8qIGNoaWxkIGRpcmVjdG9yeSAqLworCXhmc190cmFuc190ICAgICAgICAgICAgICp0cDsKKwl4ZnNfbW91bnRfdAkJKm1wOworCWludCAgICAgICAgICAgICAgICAgICAgIGVycm9yOworCXhmc19ibWFwX2ZyZWVfdCAgICAgICAgIGZyZWVfbGlzdDsKKwl4ZnNfZnNibG9ja190ICAgICAgICAgICBmaXJzdF9ibG9jazsKKwlpbnQJCQljYW5jZWxfZmxhZ3M7CisJaW50CQkJY29tbWl0dGVkOworCXZub2RlX3QJCQkqZGlyX3ZwOworCWludAkJCWRtX2RpX21vZGUgPSAwOworCWludAkJCWxhc3RfY2RwX2xpbms7CisJaW50CQkJbmFtZWxlbjsKKwl1aW50CQkJcmVzYmxrczsKKworCWRpcl92cCA9IEJIVl9UT19WTk9ERShkaXJfYmRwKTsKKwlkcCA9IFhGU19CSFZUT0koZGlyX2JkcCk7CisJbXAgPSBkcC0+aV9tb3VudDsKKworCXZuX3RyYWNlX2VudHJ5KGRpcl92cCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihYRlNfQkhWVE9JKGRpcl9iZHApLT5pX21vdW50KSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCW5hbWVsZW4gPSBWTkFNRUxFTihkZW50cnkpOworCisJaWYgKERNX0VWRU5UX0VOQUJMRUQoZGlyX3ZwLT52X3Zmc3AsIGRwLCBETV9FVkVOVF9SRU1PVkUpKSB7CisJCWVycm9yID0gWEZTX1NFTkRfTkFNRVNQKG1wLCBETV9FVkVOVF9SRU1PVkUsCisJCQkJCWRpcl92cCwgRE1fUklHSFRfTlVMTCwKKwkJCQkJTlVMTCwgRE1fUklHSFRfTlVMTCwKKwkJCQkJbmFtZSwgTlVMTCwgMCwgMCwgMCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworCX0KKworCS8qIFJldHVybiB0aHJvdWdoIHN0ZF9yZXR1cm4gYWZ0ZXIgdGhpcyBwb2ludC4gKi8KKworCWNkcCA9IE5VTEw7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIGNkcCBiZWZvcmUgd2UgZ2V0IG91ciBsb2cKKwkgKiByZXNlcnZhdGlvbi4gIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB3ZSBjYW5ub3QgY2FsbAorCSAqIHhmc19pZ2V0IGZvciBhbiBpbm9kZSBmb3Igd2hpY2ggd2UgZG8gbm90IGhhdmUgYSByZWZlcmVuY2UKKwkgKiBvbmNlIHdlJ3ZlIGFjcXVpcmVkIGEgbG9nIHJlc2VydmF0aW9uLiAgVGhpcyBpcyBiZWNhdXNlIHRoZQorCSAqIGlub2RlIHdlIGFyZSB0cnlpbmcgdG8gZ2V0IG1pZ2h0IGJlIGluIHhmc19pbmFjdGl2ZSBnb2luZworCSAqIGZvciBhIGxvZyByZXNlcnZhdGlvbi4gIFNpbmNlIHdlJ2xsIGhhdmUgdG8gd2FpdCBmb3IgdGhlCisJICogaW5hY3RpdmUgY29kZSB0byBjb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nIGZyb20geGZzX2lnZXQsCisJICogd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBoYXZlIGxvZyBzcGFjZSByZXNlcnZlZAorCSAqIHdoZW4gd2UgY2FsbCB4ZnNfaWdldC4gIEluc3RlYWQgd2UgZ2V0IGFuIHVubG9ja2VkIHJlZmVyZWNlCisJICogdG8gdGhlIGlub2RlIGJlZm9yZSBnZXR0aW5nIG91ciBsb2cgcmVzZXJ2YXRpb24uCisJICovCisJZXJyb3IgPSB4ZnNfZ2V0X2Rpcl9lbnRyeShkZW50cnksICZjZHApOworCWlmIChlcnJvcikgeworCQlSRU1PVkVfREVCVUdfVFJBQ0UoX19MSU5FX18pOworCQlnb3RvIHN0ZF9yZXR1cm47CisJfQorCW1wID0gZHAtPmlfbW91bnQ7CisJZG1fZGlfbW9kZSA9IGNkcC0+aV9kLmRpX21vZGU7CisKKwkvKgorCSAqIEdldCB0aGUgZHF1b3RzIGZvciB0aGUgaW5vZGVzLgorCSAqLworCWVycm9yID0gWEZTX1FNX0RRQVRUQUNIKG1wLCBkcCwgMCk7CisJaWYgKCFlcnJvciAmJiBkcCAhPSBjZHApCisJCWVycm9yID0gWEZTX1FNX0RRQVRUQUNIKG1wLCBjZHAsIDApOworCWlmIChlcnJvcikgeworCQlJUkVMRShjZHApOworCQlSRU1PVkVfREVCVUdfVFJBQ0UoX19MSU5FX18pOworCQlnb3RvIHN0ZF9yZXR1cm47CisJfQorCisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19STURJUik7CisJY2FuY2VsX2ZsYWdzID0gWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUzsKKwkvKgorCSAqIFdlIHRyeSB0byBnZXQgdGhlIHJlYWwgc3BhY2UgcmVzZXJ2YXRpb24gZmlyc3QsCisJICogYWxsb3dpbmcgZm9yIGRpcmVjdG9yeSBidHJlZSBkZWxldGlvbihzKSBpbXBseWluZworCSAqIHBvc3NpYmxlIGJtYXAgaW5zZXJ0KHMpLiAgSWYgd2UgY2FuJ3QgZ2V0IHRoZSBzcGFjZQorCSAqIHJlc2VydmF0aW9uIHRoZW4gd2UgdXNlIDAgaW5zdGVhZCwgYW5kIGF2b2lkIHRoZSBibWFwCisJICogYnRyZWUgaW5zZXJ0KHMpIGluIHRoZSBkaXJlY3RvcnkgY29kZSBieSwgaWYgdGhlIGJtYXAKKwkgKiBpbnNlcnQgdHJpZXMgdG8gaGFwcGVuLCBpbnN0ZWFkIHRyaW1taW5nIHRoZSBMQVNUCisJICogYmxvY2sgZnJvbSB0aGUgZGlyZWN0b3J5LgorCSAqLworCXJlc2Jsa3MgPSBYRlNfUkVNT1ZFX1NQQUNFX1JFUyhtcCk7CisJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgcmVzYmxrcywgWEZTX1JFTU9WRV9MT0dfUkVTKG1wKSwgMCwKKwkJCVhGU19UUkFOU19QRVJNX0xPR19SRVMsIFhGU19ERUZBVUxUX0xPR19DT1VOVCk7CisJaWYgKGVycm9yID09IEVOT1NQQykgeworCQlyZXNibGtzID0gMDsKKwkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgWEZTX1JFTU9WRV9MT0dfUkVTKG1wKSwgMCwKKwkJCQlYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLCBYRlNfREVGQVVMVF9MT0dfQ09VTlQpOworCX0KKwlpZiAoZXJyb3IpIHsKKwkJQVNTRVJUKGVycm9yICE9IEVOT1NQQyk7CisJCWNhbmNlbF9mbGFncyA9IDA7CisJCUlSRUxFKGNkcCk7CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKwlYRlNfQk1BUF9JTklUKCZmcmVlX2xpc3QsICZmaXJzdF9ibG9jayk7CisKKwkvKgorCSAqIE5vdyBsb2NrIHRoZSBjaGlsZCBkaXJlY3RvcnkgaW5vZGUgYW5kIHRoZSBwYXJlbnQgZGlyZWN0b3J5CisJICogaW5vZGUgaW4gdGhlIHByb3BlciBvcmRlci4gIFRoaXMgd2lsbCB0YWtlIGNhcmUgb2YgdmFsaWRhdGluZworCSAqIHRoYXQgdGhlIGRpcmVjdG9yeSBlbnRyeSBmb3IgdGhlIGNoaWxkIGRpcmVjdG9yeSBpbm9kZSBoYXMKKwkgKiBub3QgY2hhbmdlZCB3aGlsZSB3ZSB3ZXJlIG9idGFpbmluZyBhIGxvZyByZXNlcnZhdGlvbi4KKwkgKi8KKwllcnJvciA9IHhmc19sb2NrX2Rpcl9hbmRfZW50cnkoZHAsIGRlbnRyeSwgY2RwKTsKKwlpZiAoZXJyb3IpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgY2FuY2VsX2ZsYWdzKTsKKwkJSVJFTEUoY2RwKTsKKwkJZ290byBzdGRfcmV0dXJuOworCX0KKworCXhmc190cmFuc19pam9pbih0cCwgZHAsIFhGU19JTE9DS19FWENMKTsKKwlpZiAoZHAgIT0gY2RwKSB7CisJCS8qCisJCSAqIE9ubHkgaW5jcmVtZW50IHRoZSBwYXJlbnQgZGlyZWN0b3J5IHZub2RlIGNvdW50IGlmCisJCSAqIHdlIGRpZG4ndCBidW1wIGl0IGluIGxvb2tpbmcgdXAgY2RwLiAgVGhlIG9ubHkgdGltZQorCQkgKiB3ZSBkb24ndCBidW1wIGl0IGlzIHdoZW4gd2UncmUgbG9va2luZyB1cCAiLiIuCisJCSAqLworCQlWTl9IT0xEKGRpcl92cCk7CisJfQorCisJSVRSQUNFKGNkcCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBjZHAsIFhGU19JTE9DS19FWENMKTsKKworCUFTU0VSVChjZHAtPmlfZC5kaV9ubGluayA+PSAyKTsKKwlpZiAoY2RwLT5pX2QuZGlfbmxpbmsgIT0gMikgeworCQllcnJvciA9IFhGU19FUlJPUihFTk9URU1QVFkpOworCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisJaWYgKCFYRlNfRElSX0lTRU1QVFkobXAsIGNkcCkpIHsKKwkJZXJyb3IgPSBYRlNfRVJST1IoRU5PVEVNUFRZKTsKKwkJZ290byBlcnJvcl9yZXR1cm47CisJfQorCisJZXJyb3IgPSBYRlNfRElSX1JFTU9WRU5BTUUobXAsIHRwLCBkcCwgbmFtZSwgbmFtZWxlbiwgY2RwLT5pX2lubywKKwkJJmZpcnN0X2Jsb2NrLCAmZnJlZV9saXN0LCByZXNibGtzKTsKKwlpZiAoZXJyb3IpIHsKKwkJZ290byBlcnJvcjE7CisJfQorCisJeGZzX2ljaGd0aW1lKGRwLCBYRlNfSUNIR1RJTUVfTU9EIHwgWEZTX0lDSEdUSU1FX0NIRyk7CisKKwkvKgorCSAqIEJ1bXAgdGhlIGluIG1lbW9yeSBnZW5lcmF0aW9uIGNvdW50IG9uIHRoZSBwYXJlbnQKKwkgKiBkaXJlY3Rvcnkgc28gdGhhdCBvdGhlciBjYW4ga25vdyB0aGF0IGl0IGhhcyBjaGFuZ2VkLgorCSAqLworCWRwLT5pX2dlbisrOworCisJLyoKKwkgKiBEcm9wIHRoZSBsaW5rIGZyb20gY2RwJ3MgIi4uIi4KKwkgKi8KKwllcnJvciA9IHhmc19kcm9wbGluayh0cCwgZHApOworCWlmIChlcnJvcikgeworCQlnb3RvIGVycm9yMTsKKwl9CisKKwkvKgorCSAqIERyb3AgdGhlIGxpbmsgZnJvbSBkcCB0byBjZHAuCisJICovCisJZXJyb3IgPSB4ZnNfZHJvcGxpbmsodHAsIGNkcCk7CisJaWYgKGVycm9yKSB7CisJCWdvdG8gZXJyb3IxOworCX0KKworCS8qCisJICogRHJvcCB0aGUgIi4iIGxpbmsgZnJvbSBjZHAgdG8gc2VsZi4KKwkgKi8KKwllcnJvciA9IHhmc19kcm9wbGluayh0cCwgY2RwKTsKKwlpZiAoZXJyb3IpIHsKKwkJZ290byBlcnJvcjE7CisJfQorCisJLyogRGV0ZXJtaW5lIHRoZXNlIGJlZm9yZSBjb21taXR0aW5nIHRyYW5zYWN0aW9uICovCisJbGFzdF9jZHBfbGluayA9IChjZHApLT5pX2QuZGlfbmxpbms9PTA7CisKKwkvKgorCSAqIFRha2UgYW4gZXh0cmEgcmVmIG9uIHRoZSBjaGlsZCB2bm9kZSBzbyB0aGF0IGl0CisJICogZG9lcyBub3QgZ28gdG8geGZzX2luYWN0aXZlKCkgZnJvbSB3aXRoaW4gdGhlIGNvbW1pdC4KKwkgKi8KKwlJSE9MRChjZHApOworCisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgc3luY2hyb25vdXMgbW91bnQsIG1ha2Ugc3VyZSB0aGF0IHRoZQorCSAqIHJtZGlyIHRyYW5zYWN0aW9uIGdvZXMgdG8gZGlzayBiZWZvcmUgcmV0dXJuaW5nIHRvCisJICogdGhlIHVzZXIuCisJICovCisJaWYgKG1wLT5tX2ZsYWdzICYgKFhGU19NT1VOVF9XU1lOQ3xYRlNfTU9VTlRfRElSU1lOQykpIHsKKwkJeGZzX3RyYW5zX3NldF9zeW5jKHRwKTsKKwl9CisKKwllcnJvciA9IHhmc19ibWFwX2ZpbmlzaCAoJnRwLCAmZnJlZV9saXN0LCBmaXJzdF9ibG9jaywgJmNvbW1pdHRlZCk7CisJaWYgKGVycm9yKSB7CisJCXhmc19ibWFwX2NhbmNlbCgmZnJlZV9saXN0KTsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgKFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMgfAorCQkJCSBYRlNfVFJBTlNfQUJPUlQpKTsKKwkJSVJFTEUoY2RwKTsKKwkJZ290byBzdGRfcmV0dXJuOworCX0KKworCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUywgTlVMTCk7CisJaWYgKGVycm9yKSB7CisJCUlSRUxFKGNkcCk7CisJCWdvdG8gc3RkX3JldHVybjsKKwl9CisKKworCS8qCisJICogTGV0IGludGVycG9zZWQgZmlsZSBzeXN0ZW1zIGtub3cgYWJvdXQgcmVtb3ZlZCBsaW5rcy4KKwkgKi8KKwlWT1BfTElOS19SRU1PVkVEKFhGU19JVE9WKGNkcCksIGRpcl92cCwgbGFzdF9jZHBfbGluayk7CisKKwlJUkVMRShjZHApOworCisJLyogRmFsbCB0aHJvdWdoIHRvIHN0ZF9yZXR1cm4gd2l0aCBlcnJvciA9IDAgb3IgdGhlIGVycm5vCisJICogZnJvbSB4ZnNfdHJhbnNfY29tbWl0LiAqLworc3RkX3JldHVybjoKKwlpZiAoRE1fRVZFTlRfRU5BQkxFRChkaXJfdnAtPnZfdmZzcCwgZHAsIERNX0VWRU5UX1BPU1RSRU1PVkUpKSB7CisJCSh2b2lkKSBYRlNfU0VORF9OQU1FU1AobXAsIERNX0VWRU5UX1BPU1RSRU1PVkUsCisJCQkJCWRpcl92cCwgRE1fUklHSFRfTlVMTCwKKwkJCQkJTlVMTCwgRE1fUklHSFRfTlVMTCwKKwkJCQkJbmFtZSwgTlVMTCwgZG1fZGlfbW9kZSwKKwkJCQkJZXJyb3IsIDApOworCX0KKwlyZXR1cm4gZXJyb3I7CisKKyBlcnJvcjE6CisJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOworCWNhbmNlbF9mbGFncyB8PSBYRlNfVFJBTlNfQUJPUlQ7CisgZXJyb3JfcmV0dXJuOgorCXhmc190cmFuc19jYW5jZWwodHAsIGNhbmNlbF9mbGFncyk7CisJZ290byBzdGRfcmV0dXJuOworfQorCisKKy8qCisgKiB4ZnNfcmVhZGRpcgorICoKKyAqIFJlYWQgZHAncyBlbnRyaWVzIHN0YXJ0aW5nIGF0IHVpb3AtPnVpb19vZmZzZXQgYW5kIHRyYW5zbGF0ZSB0aGVtIGludG8KKyAqIGJ1ZnNpemUgYnl0ZXMgd29ydGggb2Ygc3RydWN0IGRpcmVudHMgc3RhcnRpbmcgYXQgYnVmYmFzZS4KKyAqLworU1RBVElDIGludAoreGZzX3JlYWRkaXIoCisJYmh2X2Rlc2NfdAkqZGlyX2JkcCwKKwl1aW9fdAkJKnVpb3AsCisJY3JlZF90CQkqY3JlZHAsCisJaW50CQkqZW9mcCkKK3sKKwl4ZnNfaW5vZGVfdAkqZHA7CisJeGZzX3RyYW5zX3QJKnRwID0gTlVMTDsKKwlpbnQJCWVycm9yID0gMDsKKwl1aW50CQlsb2NrX21vZGU7CisJeGZzX29mZl90CXN0YXJ0X29mZnNldDsKKworCXZuX3RyYWNlX2VudHJ5KEJIVl9UT19WTk9ERShkaXJfYmRwKSwgX19GVU5DVElPTl9fLAorCQkJCQkgICAgICAgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCWRwID0gWEZTX0JIVlRPSShkaXJfYmRwKTsKKworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGRwLT5pX21vdW50KSkgeworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCisJbG9ja19tb2RlID0geGZzX2lsb2NrX21hcF9zaGFyZWQoZHApOworCXN0YXJ0X29mZnNldCA9IHVpb3AtPnVpb19vZmZzZXQ7CisJZXJyb3IgPSBYRlNfRElSX0dFVERFTlRTKGRwLT5pX21vdW50LCB0cCwgZHAsIHVpb3AsIGVvZnApOworCWlmIChzdGFydF9vZmZzZXQgIT0gdWlvcC0+dWlvX29mZnNldCkgeworCQl4ZnNfaWNoZ3RpbWUoZHAsIFhGU19JQ0hHVElNRV9BQ0MpOworCX0KKwl4ZnNfaXVubG9ja19tYXBfc2hhcmVkKGRwLCBsb2NrX21vZGUpOworCXJldHVybiBlcnJvcjsKK30KKworCisvKgorICogeGZzX3N5bWxpbmsKKyAqCisgKi8KK1NUQVRJQyBpbnQKK3hmc19zeW1saW5rKAorCWJodl9kZXNjX3QJCSpkaXJfYmRwLAorCXZuYW1lX3QJCQkqZGVudHJ5LAorCXZhdHRyX3QJCQkqdmFwLAorCWNoYXIJCQkqdGFyZ2V0X3BhdGgsCisJdm5vZGVfdAkJCSoqdnBwLAorCWNyZWRfdAkJCSpjcmVkcCkKK3sKKwl4ZnNfdHJhbnNfdAkJKnRwOworCXhmc19tb3VudF90CQkqbXA7CisJeGZzX2lub2RlX3QJCSpkcDsKKwl4ZnNfaW5vZGVfdAkJKmlwOworCWludAkJCWVycm9yOworCWludAkJCXBhdGhsZW47CisJeGZzX2JtYXBfZnJlZV90CQlmcmVlX2xpc3Q7CisJeGZzX2ZzYmxvY2tfdAkJZmlyc3RfYmxvY2s7CisJYm9vbGVhbl90CQlkcF9qb2luZWRfdG9fdHJhbnM7CisJdm5vZGVfdAkJCSpkaXJfdnA7CisJdWludAkJCWNhbmNlbF9mbGFnczsKKwlpbnQJCQljb21taXR0ZWQ7CisJeGZzX2ZpbGVvZmZfdAkJZmlyc3RfZnNiOworCXhmc19maWxibGtzX3QJCWZzX2Jsb2NrczsKKwlpbnQJCQlubWFwczsKKwl4ZnNfYm1idF9pcmVjX3QJCW12YWxbU1lNTElOS19NQVBTXTsKKwl4ZnNfZGFkZHJfdAkJZDsKKwljaGFyCQkJKmN1cl9jaHVuazsKKwlpbnQJCQlieXRlX2NudDsKKwlpbnQJCQluOworCXhmc19idWZfdAkJKmJwOworCXhmc19wcmlkX3QJCXByaWQ7CisJc3RydWN0IHhmc19kcXVvdAkqdWRxcCwgKmdkcXA7CisJdWludAkJCXJlc2Jsa3M7CisJY2hhcgkJCSpsaW5rX25hbWUgPSBWTkFNRShkZW50cnkpOworCWludAkJCWxpbmtfbmFtZWxlbjsKKworCSp2cHAgPSBOVUxMOworCWRpcl92cCA9IEJIVl9UT19WTk9ERShkaXJfYmRwKTsKKwlkcCA9IFhGU19CSFZUT0koZGlyX2JkcCk7CisJZHBfam9pbmVkX3RvX3RyYW5zID0gQl9GQUxTRTsKKwllcnJvciA9IDA7CisJaXAgPSBOVUxMOworCXRwID0gTlVMTDsKKworCXZuX3RyYWNlX2VudHJ5KGRpcl92cCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwltcCA9IGRwLT5pX21vdW50OworCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisKKwlsaW5rX25hbWVsZW4gPSBWTkFNRUxFTihkZW50cnkpOworCisJLyoKKwkgKiBDaGVjayBjb21wb25lbnQgbGVuZ3RocyBvZiB0aGUgdGFyZ2V0IHBhdGggbmFtZS4KKwkgKi8KKwlwYXRobGVuID0gc3RybGVuKHRhcmdldF9wYXRoKTsKKwlpZiAocGF0aGxlbiA+PSBNQVhQQVRITEVOKSAgICAgIC8qIHRvdGFsIHN0cmluZyB0b28gbG9uZyAqLworCQlyZXR1cm4gWEZTX0VSUk9SKEVOQU1FVE9PTE9ORyk7CisJaWYgKHBhdGhsZW4gPj0gTUFYTkFNRUxFTikgeyAgICAvKiBpcyBhbnkgY29tcG9uZW50IHRvbyBsb25nPyAqLworCQlpbnQgbGVuLCB0b3RhbDsKKwkJY2hhciAqcGF0aDsKKworCQlmb3IodG90YWwgPSAwLCBwYXRoID0gdGFyZ2V0X3BhdGg7IHRvdGFsIDwgcGF0aGxlbjspIHsKKwkJCS8qCisJCQkgKiBTa2lwIGFueSBzbGFzaGVzLgorCQkJICovCisJCQl3aGlsZSgqcGF0aCA9PSAnLycpIHsKKwkJCQl0b3RhbCsrOworCQkJCXBhdGgrKzsKKwkJCX0KKworCQkJLyoKKwkJCSAqIENvdW50IHVwIHRvIHRoZSBuZXh0IHNsYXNoIG9yIGVuZCBvZiBwYXRoLgorCQkJICogRXJyb3Igb3V0IGlmIHRoZSBjb21wb25lbnQgaXMgYmlnZ2VyIHRoYW4gTUFYTkFNRUxFTi4KKwkJCSAqLworCQkJZm9yKGxlbiA9IDA7ICpwYXRoICE9ICcvJyAmJiB0b3RhbCA8IHBhdGhsZW47dG90YWwrKywgcGF0aCsrKSB7CisJCQkJaWYgKCsrbGVuID49IE1BWE5BTUVMRU4pIHsKKwkJCQkJZXJyb3IgPSBFTkFNRVRPT0xPTkc7CisJCQkJCXJldHVybiBlcnJvcjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiAoRE1fRVZFTlRfRU5BQkxFRChkaXJfdnAtPnZfdmZzcCwgZHAsIERNX0VWRU5UX1NZTUxJTkspKSB7CisJCWVycm9yID0gWEZTX1NFTkRfTkFNRVNQKG1wLCBETV9FVkVOVF9TWU1MSU5LLCBkaXJfdnAsCisJCQkJCURNX1JJR0hUX05VTEwsIE5VTEwsIERNX1JJR0hUX05VTEwsCisJCQkJCWxpbmtfbmFtZSwgdGFyZ2V0X3BhdGgsIDAsIDAsIDApOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyogUmV0dXJuIHRocm91Z2ggc3RkX3JldHVybiBhZnRlciB0aGlzIHBvaW50LiAqLworCisJdWRxcCA9IGdkcXAgPSBOVUxMOworCWlmICh2YXAtPnZhX21hc2sgJiBYRlNfQVRfUFJPSklEKQorCQlwcmlkID0gKHhmc19wcmlkX3QpdmFwLT52YV9wcm9qaWQ7CisJZWxzZQorCQlwcmlkID0gKHhmc19wcmlkX3QpZGZsdHByaWQ7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYWxsb2NhdGVkIGRxdW90KHMpIG9uIGRpc2suCisJICovCisJZXJyb3IgPSBYRlNfUU1fRFFWT1BBTExPQyhtcCwgZHAsCisJCQljdXJyZW50X2ZzdWlkKGNyZWRwKSwgY3VycmVudF9mc2dpZChjcmVkcCksCisJCQlYRlNfUU1PUFRfUVVPVEFMTCB8IFhGU19RTU9QVF9JTkhFUklULCAmdWRxcCwgJmdkcXApOworCWlmIChlcnJvcikKKwkJZ290byBzdGRfcmV0dXJuOworCisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19TWU1MSU5LKTsKKwljYW5jZWxfZmxhZ3MgPSBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTOworCS8qCisJICogVGhlIHN5bWxpbmsgd2lsbCBmaXQgaW50byB0aGUgaW5vZGUgZGF0YSBmb3JrPworCSAqIFRoZXJlIGNhbid0IGJlIGFueSBhdHRyaWJ1dGVzIHNvIHdlIGdldCB0aGUgd2hvbGUgdmFyaWFibGUgcGFydC4KKwkgKi8KKwlpZiAocGF0aGxlbiA8PSBYRlNfTElUSU5PKG1wKSkKKwkJZnNfYmxvY2tzID0gMDsKKwllbHNlCisJCWZzX2Jsb2NrcyA9IFhGU19CX1RPX0ZTQihtcCwgcGF0aGxlbik7CisJcmVzYmxrcyA9IFhGU19TWU1MSU5LX1NQQUNFX1JFUyhtcCwgbGlua19uYW1lbGVuLCBmc19ibG9ja3MpOworCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIHJlc2Jsa3MsIFhGU19TWU1MSU5LX0xPR19SRVMobXApLCAwLAorCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywgWEZTX1NZTUxJTktfTE9HX0NPVU5UKTsKKwlpZiAoZXJyb3IgPT0gRU5PU1BDICYmIGZzX2Jsb2NrcyA9PSAwKSB7CisJCXJlc2Jsa3MgPSAwOworCQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLCBYRlNfU1lNTElOS19MT0dfUkVTKG1wKSwgMCwKKwkJCQlYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLCBYRlNfU1lNTElOS19MT0dfQ09VTlQpOworCX0KKwlpZiAoZXJyb3IpIHsKKwkJY2FuY2VsX2ZsYWdzID0gMDsKKwkJZHAgPSBOVUxMOworCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisKKwl4ZnNfaWxvY2soZHAsIFhGU19JTE9DS19FWENMKTsKKworCS8qCisJICogQ2hlY2sgd2hldGhlciB0aGUgZGlyZWN0b3J5IGFsbG93cyBuZXcgc3ltbGlua3Mgb3Igbm90LgorCSAqLworCWlmIChkcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19OT1NZTUxJTktTKSB7CisJCWVycm9yID0gWEZTX0VSUk9SKEVQRVJNKTsKKwkJZ290byBlcnJvcl9yZXR1cm47CisJfQorCisJLyoKKwkgKiBSZXNlcnZlIGRpc2sgcXVvdGEgOiBibG9ja3MgYW5kIGlub2RlLgorCSAqLworCWVycm9yID0gWEZTX1RSQU5TX1JFU0VSVkVfUVVPVEEobXAsIHRwLCB1ZHFwLCBnZHFwLCByZXNibGtzLCAxLCAwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJLyoKKwkgKiBDaGVjayBmb3IgYWJpbGl0eSB0byBlbnRlciBkaXJlY3RvcnkgZW50cnksIGlmIG5vIHNwYWNlIHJlc2VydmVkLgorCSAqLworCWlmIChyZXNibGtzID09IDAgJiYKKwkgICAgKGVycm9yID0gWEZTX0RJUl9DQU5FTlRFUihtcCwgdHAsIGRwLCBsaW5rX25hbWUsIGxpbmtfbmFtZWxlbikpKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGJtYXAgZnJlZWxpc3QgcHJpb3IgdG8gY2FsbGluZyBlaXRoZXIKKwkgKiBibWFwaSBvciB0aGUgZGlyZWN0b3J5IGNyZWF0ZSBjb2RlLgorCSAqLworCVhGU19CTUFQX0lOSVQoJmZyZWVfbGlzdCwgJmZpcnN0X2Jsb2NrKTsKKworCS8qCisJICogQWxsb2NhdGUgYW4gaW5vZGUgZm9yIHRoZSBzeW1saW5rLgorCSAqLworCWVycm9yID0geGZzX2Rpcl9pYWxsb2MoJnRwLCBkcCwgU19JRkxOSyB8ICh2YXAtPnZhX21vZGUmflNfSUZNVCksCisJCQkgICAgICAgMSwgMCwgY3JlZHAsIHByaWQsIHJlc2Jsa3MgPiAwLCAmaXAsIE5VTEwpOworCWlmIChlcnJvcikgeworCQlpZiAoZXJyb3IgPT0gRU5PU1BDKQorCQkJZ290byBlcnJvcl9yZXR1cm47CisJCWdvdG8gZXJyb3IxOworCX0KKwlJVFJBQ0UoaXApOworCisJVk5fSE9MRChkaXJfdnApOworCXhmc190cmFuc19pam9pbih0cCwgZHAsIFhGU19JTE9DS19FWENMKTsKKwlkcF9qb2luZWRfdG9fdHJhbnMgPSBCX1RSVUU7CisKKwkvKgorCSAqIEFsc28gYXR0YWNoIHRoZSBkcXVvdChzKSB0byBpdCwgaWYgYXBwbGljYWJsZS4KKwkgKi8KKwlYRlNfUU1fRFFWT1BDUkVBVEUobXAsIHRwLCBpcCwgdWRxcCwgZ2RxcCk7CisKKwlpZiAocmVzYmxrcykKKwkJcmVzYmxrcyAtPSBYRlNfSUFMTE9DX1NQQUNFX1JFUyhtcCk7CisJLyoKKwkgKiBJZiB0aGUgc3ltbGluayB3aWxsIGZpdCBpbnRvIHRoZSBpbm9kZSwgd3JpdGUgaXQgaW5saW5lLgorCSAqLworCWlmIChwYXRobGVuIDw9IFhGU19JRk9SS19EU0laRShpcCkpIHsKKwkJeGZzX2lkYXRhX3JlYWxsb2MoaXAsIHBhdGhsZW4sIFhGU19EQVRBX0ZPUkspOworCQltZW1jcHkoaXAtPmlfZGYuaWZfdTEuaWZfZGF0YSwgdGFyZ2V0X3BhdGgsIHBhdGhsZW4pOworCQlpcC0+aV9kLmRpX3NpemUgPSBwYXRobGVuOworCisJCS8qCisJCSAqIFRoZSBpbm9kZSB3YXMgaW5pdGlhbGx5IGNyZWF0ZWQgaW4gZXh0ZW50IGZvcm1hdC4KKwkJICovCisJCWlwLT5pX2RmLmlmX2ZsYWdzICY9IH4oWEZTX0lGRVhURU5UUyB8IFhGU19JRkJST09UKTsKKwkJaXAtPmlfZGYuaWZfZmxhZ3MgfD0gWEZTX0lGSU5MSU5FOworCisJCWlwLT5pX2QuZGlfZm9ybWF0ID0gWEZTX0RJTk9ERV9GTVRfTE9DQUw7CisJCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19EREFUQSB8IFhGU19JTE9HX0NPUkUpOworCisJfSBlbHNlIHsKKwkJZmlyc3RfZnNiID0gMDsKKwkJbm1hcHMgPSBTWU1MSU5LX01BUFM7CisKKwkJZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGlwLCBmaXJzdF9mc2IsIGZzX2Jsb2NrcywKKwkJCQkgIFhGU19CTUFQSV9XUklURSB8IFhGU19CTUFQSV9NRVRBREFUQSwKKwkJCQkgICZmaXJzdF9ibG9jaywgcmVzYmxrcywgbXZhbCwgJm5tYXBzLAorCQkJCSAgJmZyZWVfbGlzdCk7CisJCWlmIChlcnJvcikgeworCQkJZ290byBlcnJvcjE7CisJCX0KKworCQlpZiAocmVzYmxrcykKKwkJCXJlc2Jsa3MgLT0gZnNfYmxvY2tzOworCQlpcC0+aV9kLmRpX3NpemUgPSBwYXRobGVuOworCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisKKwkJY3VyX2NodW5rID0gdGFyZ2V0X3BhdGg7CisJCWZvciAobiA9IDA7IG4gPCBubWFwczsgbisrKSB7CisJCQlkID0gWEZTX0ZTQl9UT19EQUREUihtcCwgbXZhbFtuXS5icl9zdGFydGJsb2NrKTsKKwkJCWJ5dGVfY250ID0gWEZTX0ZTQl9UT19CKG1wLCBtdmFsW25dLmJyX2Jsb2NrY291bnQpOworCQkJYnAgPSB4ZnNfdHJhbnNfZ2V0X2J1Zih0cCwgbXAtPm1fZGRldl90YXJncCwgZCwKKwkJCQkJICAgICAgIEJUT0JCKGJ5dGVfY250KSwgMCk7CisJCQlBU1NFUlQoYnAgJiYgIVhGU19CVUZfR0VURVJST1IoYnApKTsKKwkJCWlmIChwYXRobGVuIDwgYnl0ZV9jbnQpIHsKKwkJCQlieXRlX2NudCA9IHBhdGhsZW47CisJCQl9CisJCQlwYXRobGVuIC09IGJ5dGVfY250OworCisJCQltZW1jcHkoWEZTX0JVRl9QVFIoYnApLCBjdXJfY2h1bmssIGJ5dGVfY250KTsKKwkJCWN1cl9jaHVuayArPSBieXRlX2NudDsKKworCQkJeGZzX3RyYW5zX2xvZ19idWYodHAsIGJwLCAwLCBieXRlX2NudCAtIDEpOworCQl9CisJfQorCisJLyoKKwkgKiBDcmVhdGUgdGhlIGRpcmVjdG9yeSBlbnRyeSBmb3IgdGhlIHN5bWxpbmsuCisJICovCisJZXJyb3IgPSBYRlNfRElSX0NSRUFURU5BTUUobXAsIHRwLCBkcCwgbGlua19uYW1lLCBsaW5rX25hbWVsZW4sCisJCQlpcC0+aV9pbm8sICZmaXJzdF9ibG9jaywgJmZyZWVfbGlzdCwgcmVzYmxrcyk7CisJaWYgKGVycm9yKSB7CisJCWdvdG8gZXJyb3IxOworCX0KKwl4ZnNfaWNoZ3RpbWUoZHAsIFhGU19JQ0hHVElNRV9NT0QgfCBYRlNfSUNIR1RJTUVfQ0hHKTsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBkcCwgWEZTX0lMT0dfQ09SRSk7CisKKwkvKgorCSAqIEJ1bXAgdGhlIGluIG1lbW9yeSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeQorCSAqIHNvIHRoYXQgb3RoZXIgcHJvY2Vzc2VzIGFjY2Vzc2luZyBpdCB3aWxsIHJlY29nbml6ZSB0aGF0CisJICogdGhlIGRpcmVjdG9yeSBoYXMgY2hhbmdlZC4KKwkgKi8KKwlkcC0+aV9nZW4rKzsKKworCS8qCisJICogSWYgdGhpcyBpcyBhIHN5bmNocm9ub3VzIG1vdW50LCBtYWtlIHN1cmUgdGhhdCB0aGUKKwkgKiBzeW1saW5rIHRyYW5zYWN0aW9uIGdvZXMgdG8gZGlzayBiZWZvcmUgcmV0dXJuaW5nIHRvCisJICogdGhlIHVzZXIuCisJICovCisJaWYgKG1wLT5tX2ZsYWdzICYgKFhGU19NT1VOVF9XU1lOQ3xYRlNfTU9VTlRfRElSU1lOQykpIHsKKwkJeGZzX3RyYW5zX3NldF9zeW5jKHRwKTsKKwl9CisKKwkvKgorCSAqIHhmc190cmFuc19jb21taXQgbm9ybWFsbHkgZGVjcmVtZW50cyB0aGUgdm5vZGUgcmVmIGNvdW50CisJICogd2hlbiBpdCB1bmxvY2tzIHRoZSBpbm9kZS4gU2luY2Ugd2Ugd2FudCB0byByZXR1cm4gdGhlCisJICogdm5vZGUgdG8gdGhlIGNhbGxlciwgd2UgYnVtcCB0aGUgdm5vZGUgcmVmIGNvdW50IG5vdy4KKwkgKi8KKwlJSE9MRChpcCk7CisKKwllcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmdHAsICZmcmVlX2xpc3QsIGZpcnN0X2Jsb2NrLCAmY29tbWl0dGVkKTsKKwlpZiAoZXJyb3IpIHsKKwkJZ290byBlcnJvcjI7CisJfQorCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUywgTlVMTCk7CisJWEZTX1FNX0RRUkVMRShtcCwgdWRxcCk7CisJWEZTX1FNX0RRUkVMRShtcCwgZ2RxcCk7CisKKwkvKiBGYWxsIHRocm91Z2ggdG8gc3RkX3JldHVybiB3aXRoIGVycm9yID0gMCBvciBlcnJubyBmcm9tCisJICogeGZzX3RyYW5zX2NvbW1pdAkqLworc3RkX3JldHVybjoKKwlpZiAoRE1fRVZFTlRfRU5BQkxFRChkaXJfdnAtPnZfdmZzcCwgWEZTX0JIVlRPSShkaXJfYmRwKSwKKwkJCSAgICAgRE1fRVZFTlRfUE9TVFNZTUxJTkspKSB7CisJCSh2b2lkKSBYRlNfU0VORF9OQU1FU1AobXAsIERNX0VWRU5UX1BPU1RTWU1MSU5LLAorCQkJCQlkaXJfdnAsIERNX1JJR0hUX05VTEwsCisJCQkJCWVycm9yID8gTlVMTCA6IFhGU19JVE9WKGlwKSwKKwkJCQkJRE1fUklHSFRfTlVMTCwgbGlua19uYW1lLCB0YXJnZXRfcGF0aCwKKwkJCQkJMCwgZXJyb3IsIDApOworCX0KKworCWlmICghZXJyb3IpIHsKKwkJdm5vZGVfdCAqdnA7CisKKwkJQVNTRVJUKGlwKTsKKwkJdnAgPSBYRlNfSVRPVihpcCk7CisJCSp2cHAgPSB2cDsKKwl9CisJcmV0dXJuIGVycm9yOworCisgZXJyb3IyOgorCUlSRUxFKGlwKTsKKyBlcnJvcjE6CisJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOworCWNhbmNlbF9mbGFncyB8PSBYRlNfVFJBTlNfQUJPUlQ7CisgZXJyb3JfcmV0dXJuOgorCXhmc190cmFuc19jYW5jZWwodHAsIGNhbmNlbF9mbGFncyk7CisJWEZTX1FNX0RRUkVMRShtcCwgdWRxcCk7CisJWEZTX1FNX0RRUkVMRShtcCwgZ2RxcCk7CisKKwlpZiAoIWRwX2pvaW5lZF90b190cmFucyAmJiAoZHAgIT0gTlVMTCkpIHsKKwkJeGZzX2l1bmxvY2soZHAsIFhGU19JTE9DS19FWENMKTsKKwl9CisKKwlnb3RvIHN0ZF9yZXR1cm47Cit9CisKKworLyoKKyAqIHhmc19maWQyCisgKgorICogQSBmaWQgcm91dGluZSB0aGF0IHRha2VzIGEgcG9pbnRlciB0byBhIHByZXZpb3VzbHkgYWxsb2NhdGVkCisgKiBmaWQgc3RydWN0dXJlIChsaWtlIHhmc19mYXN0X2ZpZCkgYnV0IHVzZXMgYSA2NCBiaXQgaW5vZGUgbnVtYmVyLgorICovCitTVEFUSUMgaW50Cit4ZnNfZmlkMigKKwliaHZfZGVzY190CSpiZHAsCisJZmlkX3QJCSpmaWRwKQoreworCXhmc19pbm9kZV90CSppcDsKKwl4ZnNfZmlkMl90CSp4ZmlkOworCisJdm5fdHJhY2VfZW50cnkoQkhWX1RPX1ZOT0RFKGJkcCksIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgICAgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCUFTU0VSVChzaXplb2YoZmlkX3QpID49IHNpemVvZih4ZnNfZmlkMl90KSk7CisKKwl4ZmlkID0gKHhmc19maWQyX3QgKilmaWRwOworCWlwID0gWEZTX0JIVlRPSShiZHApOworCXhmaWQtPmZpZF9sZW4gPSBzaXplb2YoeGZzX2ZpZDJfdCkgLSBzaXplb2YoeGZpZC0+ZmlkX2xlbik7CisJeGZpZC0+ZmlkX3BhZCA9IDA7CisJLyoKKwkgKiB1c2UgbWVtY3B5IGJlY2F1c2UgdGhlIGlub2RlIGlzIGEgbG9uZyBsb25nIGFuZCB0aGVyZSdzIG5vCisJICogYXNzdXJhbmNlIHRoYXQgeGZpZC0+ZmlkX2lubyBpcyBwcm9wZXJseSBhbGlnbmVkLgorCSAqLworCW1lbWNweSgmeGZpZC0+ZmlkX2lubywgJmlwLT5pX2lubywgc2l6ZW9mKHhmaWQtPmZpZF9pbm8pKTsKKwl4ZmlkLT5maWRfZ2VuID0gaXAtPmlfZC5kaV9nZW47CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogeGZzX3J3bG9jaworICovCitpbnQKK3hmc19yd2xvY2soCisJYmh2X2Rlc2NfdAkqYmRwLAorCXZyd2xvY2tfdAlsb2NrdHlwZSkKK3sKKwl4ZnNfaW5vZGVfdAkqaXA7CisJdm5vZGVfdAkJKnZwOworCisJdnAgPSBCSFZfVE9fVk5PREUoYmRwKTsKKwlpZiAodnAtPnZfdHlwZSA9PSBWRElSKQorCQlyZXR1cm4gMTsKKwlpcCA9IFhGU19CSFZUT0koYmRwKTsKKwlpZiAobG9ja3R5cGUgPT0gVlJXTE9DS19XUklURSkgeworCQl4ZnNfaWxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CisJfSBlbHNlIGlmIChsb2NrdHlwZSA9PSBWUldMT0NLX1RSWV9SRUFEKSB7CisJCXJldHVybiAoeGZzX2lsb2NrX25vd2FpdChpcCwgWEZTX0lPTE9DS19TSEFSRUQpKTsKKwl9IGVsc2UgaWYgKGxvY2t0eXBlID09IFZSV0xPQ0tfVFJZX1dSSVRFKSB7CisJCXJldHVybiAoeGZzX2lsb2NrX25vd2FpdChpcCwgWEZTX0lPTE9DS19FWENMKSk7CisJfSBlbHNlIHsKKwkJQVNTRVJUKChsb2NrdHlwZSA9PSBWUldMT0NLX1JFQUQpIHx8CisJCSAgICAgICAobG9ja3R5cGUgPT0gVlJXTE9DS19XUklURV9ESVJFQ1QpKTsKKwkJeGZzX2lsb2NrKGlwLCBYRlNfSU9MT0NLX1NIQVJFRCk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIHhmc19yd3VubG9jaworICovCit2b2lkCit4ZnNfcnd1bmxvY2soCisJYmh2X2Rlc2NfdAkqYmRwLAorCXZyd2xvY2tfdAlsb2NrdHlwZSkKK3sKKwl4ZnNfaW5vZGVfdCAgICAgKmlwOworCXZub2RlX3QJCSp2cDsKKworCXZwID0gQkhWX1RPX1ZOT0RFKGJkcCk7CisJaWYgKHZwLT52X3R5cGUgPT0gVkRJUikKKwkJcmV0dXJuOworCWlwID0gWEZTX0JIVlRPSShiZHApOworCWlmIChsb2NrdHlwZSA9PSBWUldMT0NLX1dSSVRFKSB7CisJCS8qCisJCSAqIEluIHRoZSB3cml0ZSBjYXNlLCB3ZSBtYXkgaGF2ZSBhZGRlZCBhIG5ldyBlbnRyeSB0bworCQkgKiB0aGUgcmVmZXJlbmNlIGNhY2hlLiAgVGhpcyBtaWdodCBzdG9yZSBhIHBvaW50ZXIgdG8KKwkJICogYW4gaW5vZGUgdG8gYmUgcmVsZWFzZWQgaW4gdGhpcyBpbm9kZS4gIElmIGl0IGlzIHRoZXJlLAorCQkgKiBjbGVhciB0aGUgcG9pbnRlciBhbmQgcmVsZWFzZSB0aGUgaW5vZGUgYWZ0ZXIgdW5sb2NraW5nCisJCSAqIHRoaXMgb25lLgorCQkgKi8KKwkJeGZzX3JlZmNhY2hlX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CisJfSBlbHNlIHsKKwkJQVNTRVJUKChsb2NrdHlwZSA9PSBWUldMT0NLX1JFQUQpIHx8CisJCSAgICAgICAobG9ja3R5cGUgPT0gVlJXTE9DS19XUklURV9ESVJFQ1QpKTsKKwkJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKKwl9CisJcmV0dXJuOworfQorCitTVEFUSUMgaW50Cit4ZnNfaW5vZGVfZmx1c2goCisJYmh2X2Rlc2NfdAkqYmRwLAorCWludAkJZmxhZ3MpCit7CisJeGZzX2lub2RlX3QJKmlwOworCXhmc19tb3VudF90CSptcDsKKwl4ZnNfaW5vZGVfbG9nX2l0ZW1fdCAqaWlwOworCWludAkJZXJyb3IgPSAwOworCisJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CisJbXAgPSBpcC0+aV9tb3VudDsKKwlpaXAgPSBpcC0+aV9pdGVtcDsKKworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCisJLyoKKwkgKiBCeXBhc3MgaW5vZGVzIHdoaWNoIGhhdmUgYWxyZWFkeSBiZWVuIGNsZWFuZWQgYnkKKwkgKiB0aGUgaW5vZGUgZmx1c2ggY2x1c3RlcmluZyBjb2RlIGluc2lkZSB4ZnNfaWZsdXNoCisJICovCisJaWYgKChpcC0+aV91cGRhdGVfY29yZSA9PSAwKSAmJgorCSAgICAoKGlpcCA9PSBOVUxMKSB8fCAhKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgWEZTX0lMT0dfQUxMKSkpCisJCXJldHVybiAwOworCisJaWYgKGZsYWdzICYgRkxVU0hfTE9HKSB7CisJCWlmIChpaXAgJiYgaWlwLT5pbGlfbGFzdF9sc24pIHsKKwkJCXhsb2dfdAkJKmxvZyA9IG1wLT5tX2xvZzsKKwkJCXhmc19sc25fdAlzeW5jX2xzbjsKKwkJCWludAkJcywgbG9nX2ZsYWdzID0gWEZTX0xPR19GT1JDRTsKKworCQkJcyA9IEdSQU5UX0xPQ0sobG9nKTsKKwkJCXN5bmNfbHNuID0gbG9nLT5sX2xhc3Rfc3luY19sc247CisJCQlHUkFOVF9VTkxPQ0sobG9nLCBzKTsKKworCQkJaWYgKChYRlNfTFNOX0NNUChpaXAtPmlsaV9sYXN0X2xzbiwgc3luY19sc24pIDw9IDApKQorCQkJCXJldHVybiAwOworCisJCQlpZiAoZmxhZ3MgJiBGTFVTSF9TWU5DKQorCQkJCWxvZ19mbGFncyB8PSBYRlNfTE9HX1NZTkM7CisJCQlyZXR1cm4geGZzX2xvZ19mb3JjZShtcCwgaWlwLT5pbGlfbGFzdF9sc24sIGxvZ19mbGFncyk7CisJCX0KKwl9CisKKwkvKgorCSAqIFdlIG1ha2UgdGhpcyBub24tYmxvY2tpbmcgaWYgdGhlIGlub2RlIGlzIGNvbnRlbmRlZCwKKwkgKiByZXR1cm4gRUFHQUlOIHRvIGluZGljYXRlIHRvIHRoZSBjYWxsZXIgdGhhdCB0aGV5CisJICogZGlkIG5vdCBzdWNjZWVkLiBUaGlzIHByZXZlbnRzIHRoZSBmbHVzaCBwYXRoIGZyb20KKwkgKiBibG9ja2luZyBvbiBpbm9kZXMgaW5zaWRlIGFub3RoZXIgb3BlcmF0aW9uIHJpZ2h0CisJICogbm93LCB0aGV5IGdldCBjYXVnaHQgbGF0ZXIgYnkgeGZzX3N5bmMuCisJICovCisJaWYgKGZsYWdzICYgRkxVU0hfSU5PREUpIHsKKwkJaW50CWZsdXNoX2ZsYWdzOworCisJCWlmICh4ZnNfaXBpbmNvdW50KGlwKSkKKwkJCXJldHVybiBFQUdBSU47CisKKwkJaWYgKGZsYWdzICYgRkxVU0hfU1lOQykgeworCQkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwkJCXhmc19pZmxvY2soaXApOworCQl9IGVsc2UgaWYgKHhmc19pbG9ja19ub3dhaXQoaXAsIFhGU19JTE9DS19TSEFSRUQpKSB7CisJCQlpZiAoeGZzX2lwaW5jb3VudChpcCkgfHwgIXhmc19pZmxvY2tfbm93YWl0KGlwKSkgeworCQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwkJCQlyZXR1cm4gRUFHQUlOOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIEVBR0FJTjsKKwkJfQorCisJCWlmIChmbGFncyAmIEZMVVNIX1NZTkMpCisJCQlmbHVzaF9mbGFncyA9IFhGU19JRkxVU0hfU1lOQzsKKwkJZWxzZQorCQkJZmx1c2hfZmxhZ3MgPSBYRlNfSUZMVVNIX0FTWU5DOworCisJCWVycm9yID0geGZzX2lmbHVzaChpcCwgZmx1c2hfZmxhZ3MpOworCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCisKK2ludAoreGZzX3NldF9kbWF0dHJzICgKKwliaHZfZGVzY190CSpiZHAsCisJdV9pbnQJCWV2bWFzaywKKwl1X2ludDE2X3QJc3RhdGUsCisJY3JlZF90CQkqY3JlZHApCit7CisJeGZzX2lub2RlX3QgICAgICppcDsKKwl4ZnNfdHJhbnNfdAkqdHA7CisJeGZzX21vdW50X3QJKm1wOworCWludAkJZXJyb3I7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiBYRlNfRVJST1IoRVBFUk0pOworCisJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CisJbXAgPSBpcC0+aV9tb3VudDsKKworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19TRVRfRE1BVFRSUyk7CisJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgWEZTX0lDSEFOR0VfTE9HX1JFUyAobXApLCAwLCAwLCAwKTsKKwlpZiAoZXJyb3IpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJaXAtPmlfaW9jb3JlLmlvX2RtZXZtYXNrID0gaXAtPmlfZC5kaV9kbWV2bWFzayA9IGV2bWFzazsKKwlpcC0+aV9pb2NvcmUuaW9fZG1zdGF0ZSAgPSBpcC0+aV9kLmRpX2Rtc3RhdGUgID0gc3RhdGU7CisKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisJSUhPTEQoaXApOworCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgMCwgTlVMTCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoKKyAqIHhmc19yZWNsYWltCisgKi8KK1NUQVRJQyBpbnQKK3hmc19yZWNsYWltKAorCWJodl9kZXNjX3QJKmJkcCkKK3sKKwl4ZnNfaW5vZGVfdAkqaXA7CisJdm5vZGVfdAkJKnZwOworCisJdnAgPSBCSFZfVE9fVk5PREUoYmRwKTsKKwlpcCA9IFhGU19CSFZUT0koYmRwKTsKKworCXZuX3RyYWNlX2VudHJ5KHZwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKworCUFTU0VSVCghVk5fTUFQUEVEKHZwKSk7CisKKwkvKiBiYWQgaW5vZGUsIGdldCBvdXQgaGVyZSBBU0FQICovCisJaWYgKFZOX0JBRCh2cCkpIHsKKwkJeGZzX2lyZWNsYWltKGlwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpIHsKKwkJaWYgKGlwLT5pX2QuZGlfc2l6ZSA+IDApIHsKKwkJCS8qCisJCQkgKiBGbHVzaCBhbmQgaW52YWxpZGF0ZSBhbnkgZGF0YSBsZWZ0IGFyb3VuZCB0aGF0IGlzCisJCQkgKiBhIHBhcnQgb2YgdGhpcyBmaWxlLgorCQkJICoKKwkJCSAqIEdldCB0aGUgaW5vZGUncyBpL28gbG9jayBzbyB0aGF0IGJ1ZmZlcnMgYXJlIHB1c2hlZAorCQkJICogb3V0IHdoaWxlIGhvbGRpbmcgdGhlIHByb3BlciBsb2NrLiAgV2UgY2FuJ3QgaG9sZAorCQkJICogdGhlIGlub2RlIGxvY2sgaGVyZSBzaW5jZSBmbHVzaGluZyBvdXQgYnVmZmVycyBtYXkKKwkJCSAqIGNhdXNlIHVzIHRvIHRyeSB0byBnZXQgdGhlIGxvY2sgaW4geGZzX3N0cmF0ZWd5KCkuCisJCQkgKgorCQkJICogV2UgZG9uJ3QgaGF2ZSB0byBjYWxsIHJlbWFwZigpIGhlcmUsIGJlY2F1c2UgdGhlcmUKKwkJCSAqIGNhbm5vdCBiZSBhbnkgbWFwcGVkIGZpbGUgcmVmZXJlbmNlcyB0byB0aGlzIHZub2RlCisJCQkgKiBzaW5jZSBpdCBpcyBiZWluZyByZWNsYWltZWQuCisJCQkgKi8KKwkJCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKKworCQkJLyoKKwkJCSAqIElmIHdlIGhpdCBhbiBJTyBlcnJvciwgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUKKwkJCSAqIGJ1ZmZlciBhbmQgcGFnZSBjYWNoZXMgb2YgZmlsZSBkYXRhIGZvcgorCQkJICogdGhlIGZpbGUgYXJlIHRvc3NlZCBhd2F5LiBXZSBkb24ndCB3YW50IHRvIHVzZQorCQkJICogVk9QX0ZMVVNISU5WQUxfUEFHRVMgaGVyZSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgZGlydHkKKwkJCSAqIHBhZ2VzIHRvIHN0YXkgYXR0YWNoZWQgdG8gdGhlIHZub2RlLCBidXQgYmUKKwkJCSAqIG1hcmtlZCBQX0JBRC4gcGRmbHVzaC92bm9kZV9wYWdlYmFkCisJCQkgKiBoYXRlcyB0aGF0LgorCQkJICovCisJCQlpZiAoIVhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpKSB7CisJCQkJVk9QX0ZMVVNISU5WQUxfUEFHRVModnAsIDAsIC0xLCBGSV9OT05FKTsKKwkJCX0gZWxzZSB7CisJCQkJVk9QX1RPU1NfUEFHRVModnAsIDAsIC0xLCBGSV9OT05FKTsKKwkJCX0KKworCQkJQVNTRVJUKFZOX0NBQ0hFRCh2cCkgPT0gMCk7CisJCQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkgfHwKKwkJCSAgICAgICBpcC0+aV9kZWxheWVkX2Jsa3MgPT0gMCk7CisJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKKwkJfSBlbHNlIGlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSkgeworCQkJLyoKKwkJCSAqIGRpX3NpemUgZmllbGQgbWF5IG5vdCBiZSBxdWl0ZSBhY2N1cmF0ZSBpZiB3ZSdyZQorCQkJICogc2h1dHRpbmcgZG93bi4KKwkJCSAqLworCQkJVk9QX1RPU1NfUEFHRVModnAsIDAsIC0xLCBGSV9OT05FKTsKKwkJCUFTU0VSVChWTl9DQUNIRUQodnApID09IDApOworCQl9CisJfQorCisJLyogSWYgd2UgaGF2ZSBub3RoaW5nIHRvIGZsdXNoIHdpdGggdGhpcyBpbm9kZSB0aGVuIGNvbXBsZXRlIHRoZQorCSAqIHRlYXJkb3duIG5vdywgb3RoZXJ3aXNlIGJyZWFrIHRoZSBsaW5rIGJldHdlZW4gdGhlIHhmcyBpbm9kZQorCSAqIGFuZCB0aGUgbGludXggaW5vZGUgYW5kIGNsZWFuIHVwIHRoZSB4ZnMgaW5vZGUgbGF0ZXIuIFRoaXMKKwkgKiBhdm9pZHMgZmx1c2hpbmcgdGhlIGlub2RlIHRvIGRpc2sgZHVyaW5nIHRoZSBkZWxldGUgb3BlcmF0aW9uCisJICogaXRzZWxmLgorCSAqLworCWlmICghaXAtPmlfdXBkYXRlX2NvcmUgJiYgKGlwLT5pX2l0ZW1wID09IE5VTEwpKSB7CisJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl4ZnNfaWZsb2NrKGlwKTsKKwkJcmV0dXJuIHhmc19maW5pc2hfcmVjbGFpbShpcCwgMSwgWEZTX0lGTFVTSF9ERUxXUklfRUxTRV9TWU5DKTsKKwl9IGVsc2UgeworCQl4ZnNfbW91bnRfdAkqbXAgPSBpcC0+aV9tb3VudDsKKworCQkvKiBQcm90ZWN0IHN5bmMgZnJvbSB1cyAqLworCQlYRlNfTU9VTlRfSUxPQ0sobXApOworCQl2bl9iaHZfcmVtb3ZlKFZOX0JIVl9IRUFEKHZwKSwgWEZTX0lUT0JIVihpcCkpOworCQlsaXN0X2FkZF90YWlsKCZpcC0+aV9yZWNsYWltLCAmbXAtPm1fZGVsX2lub2Rlcyk7CisJCWlwLT5pX2ZsYWdzIHw9IFhGU19JUkVDTEFJTUFCTEU7CisJCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludAoreGZzX2ZpbmlzaF9yZWNsYWltKAorCXhmc19pbm9kZV90CSppcCwKKwlpbnQJCWxvY2tlZCwKKwlpbnQJCXN5bmNfbW9kZSkKK3sKKwl4ZnNfaWhhc2hfdAkqaWggPSBpcC0+aV9oYXNoOworCXZub2RlX3QJCSp2cCA9IFhGU19JVE9WX05VTEwoaXApOworCWludAkJZXJyb3I7CisKKwlpZiAodnAgJiYgVk5fQkFEKHZwKSkKKwkJZ290byByZWNsYWltOworCisJLyogVGhlIGhhc2ggbG9jayBoZXJlIHByb3RlY3RzIGEgdGhyZWFkIGluIHhmc19pZ2V0X2NvcmUgZnJvbQorCSAqIHJhY2luZyB3aXRoIHVzIG9uIGxpbmtpbmcgdGhlIGlub2RlIGJhY2sgd2l0aCBhIHZub2RlLgorCSAqIE9uY2Ugd2UgaGF2ZSB0aGUgWEZTX0lSRUNMQUlNIGZsYWcgc2V0IGl0IHdpbGwgbm90IHRvdWNoCisJICogdXMuCisJICovCisJd3JpdGVfbG9jaygmaWgtPmloX2xvY2spOworCWlmICgoaXAtPmlfZmxhZ3MgJiBYRlNfSVJFQ0xBSU0pIHx8CisJICAgICghKGlwLT5pX2ZsYWdzICYgWEZTX0lSRUNMQUlNQUJMRSkgJiYgdnAgPT0gTlVMTCkpIHsKKwkJd3JpdGVfdW5sb2NrKCZpaC0+aWhfbG9jayk7CisJCWlmIChsb2NrZWQpIHsKKwkJCXhmc19pZnVubG9jayhpcCk7CisJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl9CisJCXJldHVybigxKTsKKwl9CisJaXAtPmlfZmxhZ3MgfD0gWEZTX0lSRUNMQUlNOworCXdyaXRlX3VubG9jaygmaWgtPmloX2xvY2spOworCisJLyoKKwkgKiBJZiB0aGUgaW5vZGUgaXMgc3RpbGwgZGlydHksIHRoZW4gZmx1c2ggaXQgb3V0LiAgSWYgdGhlIGlub2RlCisJICogaXMgbm90IGluIHRoZSBBSUwsIHRoZW4gaXQgd2lsbCBiZSBPSyB0byBmbHVzaCBpdCBkZWx3cmkgYXMKKwkgKiBsb25nIGFzIHhmc19pZmx1c2goKSBkb2VzIG5vdCBrZWVwIGFueSByZWZlcmVuY2VzIHRvIHRoZSBpbm9kZS4KKwkgKiBXZSBsZWF2ZSB0aGF0IGRlY2lzaW9uIHVwIHRvIHhmc19pZmx1c2goKSBzaW5jZSBpdCBoYXMgdGhlCisJICoga25vd2xlZGdlIG9mIHdoZXRoZXIgaXQncyBPSyB0byBzaW1wbHkgZG8gYSBkZWx3cmkgZmx1c2ggb2YKKwkgKiB0aGUgaW5vZGUgb3Igd2hldGhlciB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgdGhlIGlub2RlIGlzCisJICogcHVsbGVkIGZyb20gdGhlIEFJTC4KKwkgKiBXZSBnZXQgdGhlIGZsdXNoIGxvY2sgcmVnYXJkbGVzcywgdGhvdWdoLCBqdXN0IHRvIG1ha2Ugc3VyZQorCSAqIHdlIGRvbid0IGZyZWUgaXQgd2hpbGUgaXQgaXMgYmVpbmcgZmx1c2hlZC4KKwkgKi8KKwlpZiAoIVhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpKSB7CisJCWlmICghbG9ja2VkKSB7CisJCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJCXhmc19pZmxvY2soaXApOworCQl9CisKKwkJaWYgKGlwLT5pX3VwZGF0ZV9jb3JlIHx8CisJCSAgICAoKGlwLT5pX2l0ZW1wICE9IE5VTEwpICYmCisJCSAgICAgKGlwLT5pX2l0ZW1wLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgIT0gMCkpKSB7CisJCQllcnJvciA9IHhmc19pZmx1c2goaXAsIHN5bmNfbW9kZSk7CisJCQkvKgorCQkJICogSWYgd2UgaGl0IGFuIGVycm9yLCB0eXBpY2FsbHkgYmVjYXVzZSBvZiBmaWxlc3lzdGVtCisJCQkgKiBzaHV0ZG93biwgd2UgZG9uJ3QgbmVlZCB0byBsZXQgdm5fcmVjbGFpbSB0byBrbm93CisJCQkgKiBiZWNhdXNlIHdlJ3JlIGdvbm5hIHJlY2xhaW0gdGhlIGlub2RlIGFueXdheS4KKwkJCSAqLworCQkJaWYgKGVycm9yKSB7CisJCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJCQlnb3RvIHJlY2xhaW07CisJCQl9CisJCQl4ZnNfaWZsb2NrKGlwKTsgLyogc3luY2hyb25pemUgd2l0aCB4ZnNfaWZsdXNoX2RvbmUgKi8KKwkJfQorCisJCUFTU0VSVChpcC0+aV91cGRhdGVfY29yZSA9PSAwKTsKKwkJQVNTRVJUKGlwLT5pX2l0ZW1wID09IE5VTEwgfHwKKwkJICAgICAgIGlwLT5pX2l0ZW1wLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgPT0gMCk7CisJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJfSBlbHNlIGlmIChsb2NrZWQpIHsKKwkJLyoKKwkJICogV2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIGRvaW5nIGFuIGlmbHVzaCBpZiB3ZSdyZQorCQkgKiBpbiB0aGUgcHJvY2VzcyBvZiBzaHV0dGluZyBkb3duIHRoZSBmaWxlc3lzdGVtIGZvcmNpYmx5LgorCQkgKiBTbywganVzdCByZWNsYWltIHRoZSBpbm9kZS4KKwkJICovCisJCXhmc19pZnVubG9jayhpcCk7CisJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJfQorCisgcmVjbGFpbToKKwl4ZnNfaXJlY2xhaW0oaXApOworCXJldHVybiAwOworfQorCitpbnQKK3hmc19maW5pc2hfcmVjbGFpbV9hbGwoeGZzX21vdW50X3QgKm1wLCBpbnQgbm9ibG9jaykKK3sKKwlpbnQJCXB1cmdlZDsKKwl4ZnNfaW5vZGVfdAkqaXAsICpuOworCWludAkJZG9uZSA9IDA7CisKKwl3aGlsZSAoIWRvbmUpIHsKKwkJcHVyZ2VkID0gMDsKKwkJWEZTX01PVU5UX0lMT0NLKG1wKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlwLCBuLCAmbXAtPm1fZGVsX2lub2RlcywgaV9yZWNsYWltKSB7CisJCQlpZiAobm9ibG9jaykgeworCQkJCWlmICh4ZnNfaWxvY2tfbm93YWl0KGlwLCBYRlNfSUxPQ0tfRVhDTCkgPT0gMCkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKHhmc19pcGluY291bnQoaXApIHx8CisJCQkJICAgICF4ZnNfaWZsb2NrX25vd2FpdChpcCkpIHsKKwkJCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJWEZTX01PVU5UX0lVTkxPQ0sobXApOworCQkJeGZzX2ZpbmlzaF9yZWNsYWltKGlwLCBub2Jsb2NrLAorCQkJCVhGU19JRkxVU0hfREVMV1JJX0VMU0VfQVNZTkMpOworCQkJcHVyZ2VkID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJZG9uZSA9ICFwdXJnZWQ7CisJfQorCisJWEZTX01PVU5UX0lVTkxPQ0sobXApOworCXJldHVybiAwOworfQorCisvKgorICogeGZzX2FsbG9jX2ZpbGVfc3BhY2UoKQorICogICAgICBUaGlzIHJvdXRpbmUgYWxsb2NhdGVzIGRpc2sgc3BhY2UgZm9yIHRoZSBnaXZlbiBmaWxlLgorICoKKyAqCUlmIGFsbG9jX3R5cGUgPT0gMCwgdGhpcyByZXF1ZXN0IGlzIGZvciBhbiBBTExPQ1NQIHR5cGUKKyAqCXJlcXVlc3Qgd2hpY2ggd2lsbCBjaGFuZ2UgdGhlIGZpbGUgc2l6ZS4gIEluIHRoaXMgY2FzZSwgbm8KKyAqCURNQVBJIGV2ZW50IHdpbGwgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsLiAgQSBUUlVOQ0FURSBldmVudAorICoJd2lsbCBiZSBnZW5lcmF0ZWQgbGF0ZXIgYnkgeGZzX3NldGF0dHIuCisgKgorICoJSWYgYWxsb2NfdHlwZSAhPSAwLCB0aGlzIHJlcXVlc3QgaXMgZm9yIGEgUkVTVlNQIHR5cGUKKyAqCXJlcXVlc3QsIGFuZCBhIERNQVBJIERNX0VWRU5UX1dSSVRFIHdpbGwgYmUgZ2VuZXJhdGVkIGlmIHRoZQorICoJbG93ZXIgYmxvY2sgYm91bmRhcnkgYnl0ZSBhZGRyZXNzIGlzIGxlc3MgdGhhbiB0aGUgZmlsZSdzCisgKglsZW5ndGguCisgKgorICogUkVUVVJOUzoKKyAqICAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyBvbiBlcnJvcgorICoKKyAqLworaW50Cit4ZnNfYWxsb2NfZmlsZV9zcGFjZSgKKwl4ZnNfaW5vZGVfdAkJKmlwLAorCXhmc19vZmZfdAkJb2Zmc2V0LAorCXhmc19vZmZfdAkJbGVuLAorCWludAkJCWFsbG9jX3R5cGUsCisJaW50CQkJYXR0cl9mbGFncykKK3sKKwl4ZnNfZmlsYmxrc190CQlhbGxvY2F0ZWRfZnNiOworCXhmc19maWxibGtzX3QJCWFsbG9jYXRlc2l6ZV9mc2I7CisJaW50CQkJY29tbWl0dGVkOworCXhmc19vZmZfdAkJY291bnQ7CisJeGZzX2ZpbGJsa3NfdAkJZGF0YWJsb2NrczsKKwlpbnQJCQllcnJvcjsKKwl4ZnNfZnNibG9ja190CQlmaXJzdGZzYjsKKwl4ZnNfYm1hcF9mcmVlX3QJCWZyZWVfbGlzdDsKKwl4ZnNfYm1idF9pcmVjX3QJCSppbWFwcDsKKwl4ZnNfYm1idF9pcmVjX3QJCWltYXBzWzFdOworCXhmc19tb3VudF90CQkqbXA7CisJaW50CQkJbnVtcnRleHRlbnRzOworCWludAkJCXJlY2NvdW50OworCXVpbnQJCQlyZXNibGtzOworCWludAkJCXJ0OworCWludAkJCXJ0ZXh0c2l6ZTsKKwl4ZnNfZmlsZW9mZl90CQlzdGFydG9mZnNldF9mc2I7CisJeGZzX3RyYW5zX3QJCSp0cDsKKwlpbnQJCQl4ZnNfYm1hcGlfZmxhZ3M7CisKKwl2bl90cmFjZV9lbnRyeShYRlNfSVRPVihpcCksIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCW1wID0gaXAtPmlfbW91bnQ7CisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKworCS8qCisJICogZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSByZWFsdGltZSBmaWxlCisJICovCisJaWYgKChydCA9IFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkpICE9IDApIHsKKwkJaWYgKGlwLT5pX2QuZGlfZXh0c2l6ZSkKKwkJCXJ0ZXh0c2l6ZSA9IGlwLT5pX2QuZGlfZXh0c2l6ZTsKKwkJZWxzZQorCQkJcnRleHRzaXplID0gbXAtPm1fc2Iuc2JfcmV4dHNpemU7CisJfSBlbHNlCisJCXJ0ZXh0c2l6ZSA9IDA7CisKKwlpZiAoKGVycm9yID0gWEZTX1FNX0RRQVRUQUNIKG1wLCBpcCwgMCkpKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAobGVuIDw9IDApCisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKworCWNvdW50ID0gbGVuOworCWVycm9yID0gMDsKKwlpbWFwcCA9ICZpbWFwc1swXTsKKwlyZWNjb3VudCA9IDE7CisJeGZzX2JtYXBpX2ZsYWdzID0gWEZTX0JNQVBJX1dSSVRFIHwgKGFsbG9jX3R5cGUgPyBYRlNfQk1BUElfUFJFQUxMT0MgOiAwKTsKKwlzdGFydG9mZnNldF9mc2IJPSBYRlNfQl9UT19GU0JUKG1wLCBvZmZzZXQpOworCWFsbG9jYXRlc2l6ZV9mc2IgPSBYRlNfQl9UT19GU0IobXAsIGNvdW50KTsKKworCS8qCUdlbmVyYXRlIGEgRE1BUEkgZXZlbnQgaWYgbmVlZGVkLgkqLworCWlmIChhbGxvY190eXBlICE9IDAgJiYgb2Zmc2V0IDwgaXAtPmlfZC5kaV9zaXplICYmCisJCQkoYXR0cl9mbGFncyZBVFRSX0RNSSkgPT0gMCAgJiYKKwkJCURNX0VWRU5UX0VOQUJMRUQoWEZTX01UT1ZGUyhtcCksIGlwLCBETV9FVkVOVF9XUklURSkpIHsKKwkJeGZzX29mZl90ICAgICAgICAgICBlbmRfZG1pX29mZnNldDsKKworCQllbmRfZG1pX29mZnNldCA9IG9mZnNldCtsZW47CisJCWlmIChlbmRfZG1pX29mZnNldCA+IGlwLT5pX2QuZGlfc2l6ZSkKKwkJCWVuZF9kbWlfb2Zmc2V0ID0gaXAtPmlfZC5kaV9zaXplOworCQllcnJvciA9IFhGU19TRU5EX0RBVEEobXAsIERNX0VWRU5UX1dSSVRFLCBYRlNfSVRPVihpcCksCisJCQlvZmZzZXQsIGVuZF9kbWlfb2Zmc2V0IC0gb2Zmc2V0LAorCQkJMCwgTlVMTCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybihlcnJvcik7CisJfQorCisJLyoKKwkgKiBhbGxvY2F0ZSBmaWxlIHNwYWNlIHVudGlsIGRvbmUgb3IgdW50aWwgdGhlcmUgaXMgYW4gZXJyb3IKKwkgKi8KK3JldHJ5OgorCXdoaWxlIChhbGxvY2F0ZXNpemVfZnNiICYmICFlcnJvcikgeworCQkvKgorCQkgKiBkZXRlcm1pbmUgaWYgcmVzZXJ2aW5nIHNwYWNlIG9uCisJCSAqIHRoZSBkYXRhIG9yIHJlYWx0aW1lIHBhcnRpdGlvbi4KKwkJICovCisJCWlmIChydCkgeworCQkJeGZzX2ZpbGVvZmZfdCBzLCBlOworCisJCQlzID0gc3RhcnRvZmZzZXRfZnNiOworCQkJZG9fZGl2KHMsIHJ0ZXh0c2l6ZSk7CisJCQlzICo9IHJ0ZXh0c2l6ZTsKKwkJCWUgPSByb3VuZHVwXzY0KHN0YXJ0b2Zmc2V0X2ZzYiArIGFsbG9jYXRlc2l6ZV9mc2IsCisJCQkJcnRleHRzaXplKTsKKwkJCW51bXJ0ZXh0ZW50cyA9IChpbnQpKGUgLSBzKSAvIG1wLT5tX3NiLnNiX3JleHRzaXplOworCQkJZGF0YWJsb2NrcyA9IDA7CisJCX0gZWxzZSB7CisJCQlkYXRhYmxvY2tzID0gYWxsb2NhdGVzaXplX2ZzYjsKKwkJCW51bXJ0ZXh0ZW50cyA9IDA7CisJCX0KKworCQkvKgorCQkgKiBhbGxvY2F0ZSBhbmQgc2V0dXAgdGhlIHRyYW5zYWN0aW9uCisJCSAqLworCQl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX0RJT1NUUkFUKTsKKwkJcmVzYmxrcyA9IFhGU19ESU9TVFJBVF9TUEFDRV9SRVMobXAsIGRhdGFibG9ja3MpOworCQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLAorCQkJCQkgIHJlc2Jsa3MsCisJCQkJCSAgWEZTX1dSSVRFX0xPR19SRVMobXApLAorCQkJCQkgIG51bXJ0ZXh0ZW50cywKKwkJCQkJICBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAorCQkJCQkgIFhGU19XUklURV9MT0dfQ09VTlQpOworCisJCS8qCisJCSAqIGNoZWNrIGZvciBydW5uaW5nIG91dCBvZiBzcGFjZQorCQkgKi8KKwkJaWYgKGVycm9yKSB7CisJCQkvKgorCQkJICogRnJlZSB0aGUgdHJhbnNhY3Rpb24gc3RydWN0dXJlLgorCQkJICovCisJCQlBU1NFUlQoZXJyb3IgPT0gRU5PU1BDIHx8IFhGU19GT1JDRURfU0hVVERPV04obXApKTsKKwkJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQkJYnJlYWs7CisJCX0KKwkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCWVycm9yID0gWEZTX1RSQU5TX1JFU0VSVkVfUVVPVEFfQllEUVVPVFMobXAsIHRwLAorCQkJCWlwLT5pX3VkcXVvdCwgaXAtPmlfZ2RxdW90LCByZXNibGtzLCAwLCBydCA/CisJCQkJWEZTX1FNT1BUX1JFU19SVEJMS1MgOiBYRlNfUU1PUFRfUkVTX1JFR0JMS1MpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMTsKKworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCXhmc190cmFuc19paG9sZCh0cCwgaXApOworCisJCS8qCisJCSAqIGlzc3VlIHRoZSBibWFwaSgpIGNhbGwgdG8gYWxsb2NhdGUgdGhlIGJsb2NrcworCQkgKi8KKwkJWEZTX0JNQVBfSU5JVCgmZnJlZV9saXN0LCAmZmlyc3Rmc2IpOworCQllcnJvciA9IHhmc19ibWFwaSh0cCwgaXAsIHN0YXJ0b2Zmc2V0X2ZzYiwKKwkJCQkgIGFsbG9jYXRlc2l6ZV9mc2IsIHhmc19ibWFwaV9mbGFncywKKwkJCQkgICZmaXJzdGZzYiwgMCwgaW1hcHAsICZyZWNjb3VudCwKKwkJCQkgICZmcmVlX2xpc3QpOworCQlpZiAoZXJyb3IpIHsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisKKwkJLyoKKwkJICogY29tcGxldGUgdGhlIHRyYW5zYWN0aW9uCisJCSAqLworCQllcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmdHAsICZmcmVlX2xpc3QsIGZpcnN0ZnNiLCAmY29tbWl0dGVkKTsKKwkJaWYgKGVycm9yKSB7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCisJCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUywgTlVMTCk7CisJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCWlmIChlcnJvcikgeworCQkJYnJlYWs7CisJCX0KKworCQlhbGxvY2F0ZWRfZnNiID0gaW1hcHAtPmJyX2Jsb2NrY291bnQ7CisKKwkJaWYgKHJlY2NvdW50ID09IDApIHsKKwkJCWVycm9yID0gWEZTX0VSUk9SKEVOT1NQQyk7CisJCQlicmVhazsKKwkJfQorCisJCXN0YXJ0b2Zmc2V0X2ZzYiArPSBhbGxvY2F0ZWRfZnNiOworCQlhbGxvY2F0ZXNpemVfZnNiIC09IGFsbG9jYXRlZF9mc2I7CisJfQorZG1hcGlfZW5vc3BjX2NoZWNrOgorCWlmIChlcnJvciA9PSBFTk9TUEMgJiYgKGF0dHJfZmxhZ3MmQVRUUl9ETUkpID09IDAgJiYKKwkgICAgRE1fRVZFTlRfRU5BQkxFRChYRlNfTVRPVkZTKG1wKSwgaXAsIERNX0VWRU5UX05PU1BBQ0UpKSB7CisKKwkJZXJyb3IgPSBYRlNfU0VORF9OQU1FU1AobXAsIERNX0VWRU5UX05PU1BBQ0UsCisJCQkJWEZTX0lUT1YoaXApLCBETV9SSUdIVF9OVUxMLAorCQkJCVhGU19JVE9WKGlwKSwgRE1fUklHSFRfTlVMTCwKKwkJCQlOVUxMLCBOVUxMLCAwLCAwLCAwKTsgLyogRGVsYXkgZmxhZyBpbnRlbnRpb25hbGx5IHVudXNlZCAqLworCQlpZiAoZXJyb3IgPT0gMCkKKwkJCWdvdG8gcmV0cnk7CS8qIE1heWJlIERNQVBJIGFwcC4gaGFzIG1hZGUgc3BhY2UgKi8KKwkJLyogZWxzZSBmYWxsIHRocm91Z2ggd2l0aCBlcnJvciBmcm9tIFhGU19TRU5EX0RBVEEgKi8KKwl9CisKKwlyZXR1cm4gZXJyb3I7CisKKyBlcnJvcjA6CisJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOworIGVycm9yMToKKwl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTIHwgWEZTX1RSQU5TX0FCT1JUKTsKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCWdvdG8gZG1hcGlfZW5vc3BjX2NoZWNrOworfQorCisvKgorICogWmVybyBmaWxlIGJ5dGVzIGJldHdlZW4gc3RhcnRvZmYgYW5kIGVuZG9mZiBpbmNsdXNpdmUuCisgKiBUaGUgaW9sb2NrIGlzIGhlbGQgZXhjbHVzaXZlIGFuZCBubyBibG9ja3MgYXJlIGJ1ZmZlcmVkLgorICovCitTVEFUSUMgaW50Cit4ZnNfemVyb19yZW1haW5pbmdfYnl0ZXMoCisJeGZzX2lub2RlX3QJCSppcCwKKwl4ZnNfb2ZmX3QJCXN0YXJ0b2ZmLAorCXhmc19vZmZfdAkJZW5kb2ZmKQoreworCXhmc19ibWJ0X2lyZWNfdAkJaW1hcDsKKwl4ZnNfZmlsZW9mZl90CQlvZmZzZXRfZnNiOworCXhmc19vZmZfdAkJbGFzdG9mZnNldDsKKwl4ZnNfb2ZmX3QJCW9mZnNldDsKKwl4ZnNfYnVmX3QJCSpicDsKKwl4ZnNfbW91bnRfdAkJKm1wID0gaXAtPmlfbW91bnQ7CisJaW50CQkJbmltYXA7CisJaW50CQkJZXJyb3IgPSAwOworCisJYnAgPSB4ZnNfYnVmX2dldF9ub2FkZHIobXAtPm1fc2Iuc2JfYmxvY2tzaXplLAorCQkJCWlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FID8KKwkJCQltcC0+bV9ydGRldl90YXJncCA6IG1wLT5tX2RkZXZfdGFyZ3ApOworCisJZm9yIChvZmZzZXQgPSBzdGFydG9mZjsgb2Zmc2V0IDw9IGVuZG9mZjsgb2Zmc2V0ID0gbGFzdG9mZnNldCArIDEpIHsKKwkJb2Zmc2V0X2ZzYiA9IFhGU19CX1RPX0ZTQlQobXAsIG9mZnNldCk7CisJCW5pbWFwID0gMTsKKwkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIG9mZnNldF9mc2IsIDEsIDAsIE5VTEwsIDAsICZpbWFwLAorCQkJJm5pbWFwLCBOVUxMKTsKKwkJaWYgKGVycm9yIHx8IG5pbWFwIDwgMSkKKwkJCWJyZWFrOworCQlBU1NFUlQoaW1hcC5icl9ibG9ja2NvdW50ID49IDEpOworCQlBU1NFUlQoaW1hcC5icl9zdGFydG9mZiA9PSBvZmZzZXRfZnNiKTsKKwkJbGFzdG9mZnNldCA9IFhGU19GU0JfVE9fQihtcCwgaW1hcC5icl9zdGFydG9mZiArIDEpIC0gMTsKKwkJaWYgKGxhc3RvZmZzZXQgPiBlbmRvZmYpCisJCQlsYXN0b2Zmc2V0ID0gZW5kb2ZmOworCQlpZiAoaW1hcC5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLKQorCQkJY29udGludWU7CisJCUFTU0VSVChpbWFwLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKTsKKwkJaWYgKGltYXAuYnJfc3RhdGUgPT0gWEZTX0VYVF9VTldSSVRURU4pCisJCQljb250aW51ZTsKKwkJWEZTX0JVRl9VTkRPTkUoYnApOworCQlYRlNfQlVGX1VOV1JJVEUoYnApOworCQlYRlNfQlVGX1JFQUQoYnApOworCQlYRlNfQlVGX1NFVF9BRERSKGJwLCBYRlNfRlNCX1RPX0RCKGlwLCBpbWFwLmJyX3N0YXJ0YmxvY2spKTsKKwkJeGZzYmRzdHJhdChtcCwgYnApOworCQlpZiAoKGVycm9yID0geGZzX2lvd2FpdChicCkpKSB7CisJCQl4ZnNfaW9lcnJvcl9hbGVydCgieGZzX3plcm9fcmVtYWluaW5nX2J5dGVzKHJlYWQpIiwKKwkJCQkJICBtcCwgYnAsIFhGU19CVUZfQUREUihicCkpOworCQkJYnJlYWs7CisJCX0KKwkJbWVtc2V0KFhGU19CVUZfUFRSKGJwKSArCisJCQkob2Zmc2V0IC0gWEZTX0ZTQl9UT19CKG1wLCBpbWFwLmJyX3N0YXJ0b2ZmKSksCisJCSAgICAgIDAsIGxhc3RvZmZzZXQgLSBvZmZzZXQgKyAxKTsKKwkJWEZTX0JVRl9VTkRPTkUoYnApOworCQlYRlNfQlVGX1VOUkVBRChicCk7CisJCVhGU19CVUZfV1JJVEUoYnApOworCQl4ZnNiZHN0cmF0KG1wLCBicCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfaW93YWl0KGJwKSkpIHsKKwkJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4ZnNfemVyb19yZW1haW5pbmdfYnl0ZXMod3JpdGUpIiwKKwkJCQkJICBtcCwgYnAsIFhGU19CVUZfQUREUihicCkpOworCQkJYnJlYWs7CisJCX0KKwl9CisJeGZzX2J1Zl9mcmVlKGJwKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiB4ZnNfZnJlZV9maWxlX3NwYWNlKCkKKyAqICAgICAgVGhpcyByb3V0aW5lIGZyZWVzIGRpc2sgc3BhY2UgZm9yIHRoZSBnaXZlbiBmaWxlLgorICoKKyAqCVRoaXMgcm91dGluZSBpcyBvbmx5IGNhbGxlZCBieSB4ZnNfY2hhbmdlX2ZpbGVfc3BhY2UKKyAqCWZvciBhbiBVTlJFU1ZTUCB0eXBlIGNhbGwuCisgKgorICogUkVUVVJOUzoKKyAqICAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyBvbiBlcnJvcgorICoKKyAqLworU1RBVElDIGludAoreGZzX2ZyZWVfZmlsZV9zcGFjZSgKKwl4ZnNfaW5vZGVfdAkJKmlwLAorCXhmc19vZmZfdAkJb2Zmc2V0LAorCXhmc19vZmZfdAkJbGVuLAorCWludAkJCWF0dHJfZmxhZ3MpCit7CisJaW50CQkJY29tbWl0dGVkOworCWludAkJCWRvbmU7CisJeGZzX29mZl90CQllbmRfZG1pX29mZnNldDsKKwl4ZnNfZmlsZW9mZl90CQllbmRvZmZzZXRfZnNiOworCWludAkJCWVycm9yOworCXhmc19mc2Jsb2NrX3QJCWZpcnN0ZnNiOworCXhmc19ibWFwX2ZyZWVfdAkJZnJlZV9saXN0OworCXhmc19vZmZfdAkJaWxlbjsKKwl4ZnNfYm1idF9pcmVjX3QJCWltYXA7CisJeGZzX29mZl90CQlpb2Zmc2V0OworCXhmc19leHRsZW5fdAkJbW9kPTA7CisJeGZzX21vdW50X3QJCSptcDsKKwlpbnQJCQluaW1hcDsKKwl1aW50CQkJcmVzYmxrczsKKwlpbnQJCQlyb3VuZGluZzsKKwlpbnQJCQlydDsKKwl4ZnNfZmlsZW9mZl90CQlzdGFydG9mZnNldF9mc2I7CisJeGZzX3RyYW5zX3QJCSp0cDsKKwlpbnQJCQluZWVkX2lvbG9jayA9IChhdHRyX2ZsYWdzICYgQVRUUl9ETUkpID09IDA7CisKKwl2bl90cmFjZV9lbnRyeShYRlNfSVRPVihpcCksIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCW1wID0gaXAtPmlfbW91bnQ7CisKKwlpZiAoKGVycm9yID0gWEZTX1FNX0RRQVRUQUNIKG1wLCBpcCwgMCkpKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IDA7CisJaWYgKGxlbiA8PSAwKQkvKiBpZiBub3RoaW5nIGJlaW5nIGZyZWVkICovCisJCXJldHVybiBlcnJvcjsKKwlydCA9IChpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSk7CisJc3RhcnRvZmZzZXRfZnNiCT0gWEZTX0JfVE9fRlNCKG1wLCBvZmZzZXQpOworCWVuZF9kbWlfb2Zmc2V0ID0gb2Zmc2V0ICsgbGVuOworCWVuZG9mZnNldF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBlbmRfZG1pX29mZnNldCk7CisKKwlpZiAob2Zmc2V0IDwgaXAtPmlfZC5kaV9zaXplICYmCisJICAgIChhdHRyX2ZsYWdzICYgQVRUUl9ETUkpID09IDAgJiYKKwkgICAgRE1fRVZFTlRfRU5BQkxFRChYRlNfTVRPVkZTKG1wKSwgaXAsIERNX0VWRU5UX1dSSVRFKSkgeworCQlpZiAoZW5kX2RtaV9vZmZzZXQgPiBpcC0+aV9kLmRpX3NpemUpCisJCQllbmRfZG1pX29mZnNldCA9IGlwLT5pX2QuZGlfc2l6ZTsKKwkJZXJyb3IgPSBYRlNfU0VORF9EQVRBKG1wLCBETV9FVkVOVF9XUklURSwgWEZTX0lUT1YoaXApLAorCQkJCW9mZnNldCwgZW5kX2RtaV9vZmZzZXQgLSBvZmZzZXQsCisJCQkJQVRfREVMQVlfRkxBRyhhdHRyX2ZsYWdzKSwgTlVMTCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybihlcnJvcik7CisJfQorCisJaWYgKG5lZWRfaW9sb2NrKQorCQl4ZnNfaWxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CisJcm91bmRpbmcgPSBNQVgoKF9fdWludDhfdCkoMSA8PCBtcC0+bV9zYi5zYl9ibG9ja2xvZyksCisJCQkoX191aW50OF90KU5CUFApOworCWlsZW4gPSBsZW4gKyAob2Zmc2V0ICYgKHJvdW5kaW5nIC0gMSkpOworCWlvZmZzZXQgPSBvZmZzZXQgJiB+KHJvdW5kaW5nIC0gMSk7CisJaWYgKGlsZW4gJiAocm91bmRpbmcgLSAxKSkKKwkJaWxlbiA9IChpbGVuICsgcm91bmRpbmcpICYgfihyb3VuZGluZyAtIDEpOworCXhmc19pbnZhbF9jYWNoZWRfcGFnZXMoWEZTX0lUT1YoaXApLCAmKGlwLT5pX2lvY29yZSksIGlvZmZzZXQsIDAsIDApOworCS8qCisJICogTmVlZCB0byB6ZXJvIHRoZSBzdHVmZiB3ZSdyZSBub3QgZnJlZWluZywgb24gZGlzay4KKwkgKiBJZiBpdHMgYSByZWFsdGltZSBmaWxlICYgY2FuJ3QgdXNlIHVud3JpdHRlbiBleHRlbnRzIHRoZW4gd2UKKwkgKiBhY3R1YWxseSBuZWVkIHRvIHplcm8gdGhlIGV4dGVudCBlZGdlcy4gIE90aGVyd2lzZSB4ZnNfYnVubWFwaQorCSAqIHdpbGwgdGFrZSBjYXJlIG9mIGl0IGZvciB1cy4KKwkgKi8KKwlpZiAocnQgJiYgIVhGU19TQl9WRVJTSU9OX0hBU0VYVEZMR0JJVCgmbXAtPm1fc2IpKSB7CisJCW5pbWFwID0gMTsKKwkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIHN0YXJ0b2Zmc2V0X2ZzYiwgMSwgMCwgTlVMTCwgMCwKKwkJCSZpbWFwLCAmbmltYXAsIE5VTEwpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dF91bmxvY2tfaW9sb2NrOworCQlBU1NFUlQobmltYXAgPT0gMCB8fCBuaW1hcCA9PSAxKTsKKwkJaWYgKG5pbWFwICYmIGltYXAuYnJfc3RhcnRibG9jayAhPSBIT0xFU1RBUlRCTE9DSykgeworCQkJeGZzX2RhZGRyX3QJYmxvY2s7CisKKwkJCUFTU0VSVChpbWFwLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKTsKKwkJCWJsb2NrID0gaW1hcC5icl9zdGFydGJsb2NrOworCQkJbW9kID0gZG9fZGl2KGJsb2NrLCBtcC0+bV9zYi5zYl9yZXh0c2l6ZSk7CisJCQlpZiAobW9kKQorCQkJCXN0YXJ0b2Zmc2V0X2ZzYiArPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZSAtIG1vZDsKKwkJfQorCQluaW1hcCA9IDE7CisJCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIGlwLCBlbmRvZmZzZXRfZnNiIC0gMSwgMSwgMCwgTlVMTCwgMCwKKwkJCSZpbWFwLCAmbmltYXAsIE5VTEwpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dF91bmxvY2tfaW9sb2NrOworCQlBU1NFUlQobmltYXAgPT0gMCB8fCBuaW1hcCA9PSAxKTsKKwkJaWYgKG5pbWFwICYmIGltYXAuYnJfc3RhcnRibG9jayAhPSBIT0xFU1RBUlRCTE9DSykgeworCQkJQVNTRVJUKGltYXAuYnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0spOworCQkJbW9kKys7CisJCQlpZiAobW9kICYmIChtb2QgIT0gbXAtPm1fc2Iuc2JfcmV4dHNpemUpKQorCQkJCWVuZG9mZnNldF9mc2IgLT0gbW9kOworCQl9CisJfQorCWlmICgoZG9uZSA9IChlbmRvZmZzZXRfZnNiIDw9IHN0YXJ0b2Zmc2V0X2ZzYikpKQorCQkvKgorCQkgKiBPbmUgY29udGlndW91cyBwaWVjZSB0byBjbGVhcgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfemVyb19yZW1haW5pbmdfYnl0ZXMoaXAsIG9mZnNldCwgb2Zmc2V0ICsgbGVuIC0gMSk7CisJZWxzZSB7CisJCS8qCisJCSAqIFNvbWUgZnVsbCBibG9ja3MsIHBvc3NpYmx5IHR3byBwaWVjZXMgdG8gY2xlYXIKKwkJICovCisJCWlmIChvZmZzZXQgPCBYRlNfRlNCX1RPX0IobXAsIHN0YXJ0b2Zmc2V0X2ZzYikpCisJCQllcnJvciA9IHhmc196ZXJvX3JlbWFpbmluZ19ieXRlcyhpcCwgb2Zmc2V0LAorCQkJCVhGU19GU0JfVE9fQihtcCwgc3RhcnRvZmZzZXRfZnNiKSAtIDEpOworCQlpZiAoIWVycm9yICYmCisJCSAgICBYRlNfRlNCX1RPX0IobXAsIGVuZG9mZnNldF9mc2IpIDwgb2Zmc2V0ICsgbGVuKQorCQkJZXJyb3IgPSB4ZnNfemVyb19yZW1haW5pbmdfYnl0ZXMoaXAsCisJCQkJWEZTX0ZTQl9UT19CKG1wLCBlbmRvZmZzZXRfZnNiKSwKKwkJCQlvZmZzZXQgKyBsZW4gLSAxKTsKKwl9CisKKwkvKgorCSAqIGZyZWUgZmlsZSBzcGFjZSB1bnRpbCBkb25lIG9yIHVudGlsIHRoZXJlIGlzIGFuIGVycm9yCisJICovCisJcmVzYmxrcyA9IFhGU19ESU9TVFJBVF9TUEFDRV9SRVMobXAsIDApOworCXdoaWxlICghZXJyb3IgJiYgIWRvbmUpIHsKKworCQkvKgorCQkgKiBhbGxvY2F0ZSBhbmQgc2V0dXAgdGhlIHRyYW5zYWN0aW9uCisJCSAqLworCQl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX0RJT1NUUkFUKTsKKwkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwKKwkJCQkJICByZXNibGtzLAorCQkJCQkgIFhGU19XUklURV9MT0dfUkVTKG1wKSwKKwkJCQkJICAwLAorCQkJCQkgIFhGU19UUkFOU19QRVJNX0xPR19SRVMsCisJCQkJCSAgWEZTX1dSSVRFX0xPR19DT1VOVCk7CisKKwkJLyoKKwkJICogY2hlY2sgZm9yIHJ1bm5pbmcgb3V0IG9mIHNwYWNlCisJCSAqLworCQlpZiAoZXJyb3IpIHsKKwkJCS8qCisJCQkgKiBGcmVlIHRoZSB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUuCisJCQkgKi8KKwkJCUFTU0VSVChlcnJvciA9PSBFTk9TUEMgfHwgWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpOworCQkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCQlicmVhazsKKwkJfQorCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJZXJyb3IgPSBYRlNfVFJBTlNfUkVTRVJWRV9RVU9UQShtcCwgdHAsCisJCQkJaXAtPmlfdWRxdW90LCBpcC0+aV9nZHF1b3QsIHJlc2Jsa3MsIDAsIHJ0ID8KKwkJCQlYRlNfUU1PUFRfUkVTX1JUQkxLUyA6IFhGU19RTU9QVF9SRVNfUkVHQkxLUyk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3IxOworCisJCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwkJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CisKKwkJLyoKKwkJICogaXNzdWUgdGhlIGJ1bm1hcGkoKSBjYWxsIHRvIGZyZWUgdGhlIGJsb2NrcworCQkgKi8KKwkJWEZTX0JNQVBfSU5JVCgmZnJlZV9saXN0LCAmZmlyc3Rmc2IpOworCQllcnJvciA9IHhmc19idW5tYXBpKHRwLCBpcCwgc3RhcnRvZmZzZXRfZnNiLAorCQkJCSAgZW5kb2Zmc2V0X2ZzYiAtIHN0YXJ0b2Zmc2V0X2ZzYiwKKwkJCQkgIDAsIDIsICZmaXJzdGZzYiwgJmZyZWVfbGlzdCwgJmRvbmUpOworCQlpZiAoZXJyb3IpIHsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisKKwkJLyoKKwkJICogY29tcGxldGUgdGhlIHRyYW5zYWN0aW9uCisJCSAqLworCQllcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmdHAsICZmcmVlX2xpc3QsIGZpcnN0ZnNiLCAmY29tbWl0dGVkKTsKKwkJaWYgKGVycm9yKSB7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCisJCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUywgTlVMTCk7CisJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJfQorCisgb3V0X3VubG9ja19pb2xvY2s6CisJaWYgKG5lZWRfaW9sb2NrKQorCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKKwlyZXR1cm4gZXJyb3I7CisKKyBlcnJvcjA6CisJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOworIGVycm9yMToKKwl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTIHwgWEZTX1RSQU5TX0FCT1JUKTsKKwl4ZnNfaXVubG9jayhpcCwgbmVlZF9pb2xvY2sgPyAoWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpIDoKKwkJICAgIFhGU19JTE9DS19FWENMKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiB4ZnNfY2hhbmdlX2ZpbGVfc3BhY2UoKQorICogICAgICBUaGlzIHJvdXRpbmUgYWxsb2NhdGVzIG9yIGZyZWVzIGRpc2sgc3BhY2UgZm9yIHRoZSBnaXZlbiBmaWxlLgorICogICAgICBUaGUgdXNlciBzcGVjaWZpZWQgcGFyYW1ldGVycyBhcmUgY2hlY2tlZCBmb3IgYWxpZ25tZW50IGFuZCBzaXplCisgKiAgICAgIGxpbWl0YXRpb25zLgorICoKKyAqIFJFVFVSTlM6CisgKiAgICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gb24gZXJyb3IKKyAqCisgKi8KK2ludAoreGZzX2NoYW5nZV9maWxlX3NwYWNlKAorCWJodl9kZXNjX3QJKmJkcCwKKwlpbnQJCWNtZCwKKwl4ZnNfZmxvY2s2NF90CSpiZiwKKwl4ZnNfb2ZmX3QJb2Zmc2V0LAorCWNyZWRfdAkJKmNyZWRwLAorCWludAkJYXR0cl9mbGFncykKK3sKKwlpbnQJCWNscnByZWFsbG9jOworCWludAkJZXJyb3I7CisJeGZzX2ZzaXplX3QJZnNpemU7CisJeGZzX2lub2RlX3QJKmlwOworCXhmc19tb3VudF90CSptcDsKKwlpbnQJCXNldHByZWFsbG9jOworCXhmc19vZmZfdAlzdGFydG9mZnNldDsKKwl4ZnNfb2ZmX3QJbGxlbjsKKwl4ZnNfdHJhbnNfdAkqdHA7CisJdmF0dHJfdAkJdmE7CisJdm5vZGVfdAkJKnZwOworCisJdnAgPSBCSFZfVE9fVk5PREUoYmRwKTsKKwl2bl90cmFjZV9lbnRyeSh2cCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwlpcCA9IFhGU19CSFZUT0koYmRwKTsKKwltcCA9IGlwLT5pX21vdW50OworCisJLyoKKwkgKiBtdXN0IGJlIGEgcmVndWxhciBmaWxlIGFuZCBoYXZlIHdyaXRlIHBlcm1pc3Npb24KKwkgKi8KKwlpZiAodnAtPnZfdHlwZSAhPSBWUkVHKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisKKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCisJaWYgKChlcnJvciA9IHhmc19pYWNjZXNzKGlwLCBTX0lXVVNSLCBjcmVkcCkpKSB7CisJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKworCXN3aXRjaCAoYmYtPmxfd2hlbmNlKSB7CisJY2FzZSAwOiAvKlNFRUtfU0VUKi8KKwkJYnJlYWs7CisJY2FzZSAxOiAvKlNFRUtfQ1VSKi8KKwkJYmYtPmxfc3RhcnQgKz0gb2Zmc2V0OworCQlicmVhazsKKwljYXNlIDI6IC8qU0VFS19FTkQqLworCQliZi0+bF9zdGFydCArPSBpcC0+aV9kLmRpX3NpemU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwl9CisKKwlsbGVuID0gYmYtPmxfbGVuID4gMCA/IGJmLT5sX2xlbiAtIDEgOiBiZi0+bF9sZW47CisKKwlpZiAoICAgKGJmLT5sX3N0YXJ0IDwgMCkKKwkgICAgfHwgKGJmLT5sX3N0YXJ0ID4gWEZTX01BWElPRkZTRVQobXApKQorCSAgICB8fCAoYmYtPmxfc3RhcnQgKyBsbGVuIDwgMCkKKwkgICAgfHwgKGJmLT5sX3N0YXJ0ICsgbGxlbiA+IFhGU19NQVhJT0ZGU0VUKG1wKSkpCisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKworCWJmLT5sX3doZW5jZSA9IDA7CisKKwlzdGFydG9mZnNldCA9IGJmLT5sX3N0YXJ0OworCWZzaXplID0gaXAtPmlfZC5kaV9zaXplOworCisJLyoKKwkgKiBYRlNfSU9DX1JFU1ZTUCBhbmQgWEZTX0lPQ19VTlJFU1ZTUCB3aWxsIHJlc2VydmUgb3IgdW5yZXNlcnZlCisJICogZmlsZSBzcGFjZS4KKwkgKiBUaGVzZSBjYWxscyBkbyBOT1QgemVybyB0aGUgZGF0YSBzcGFjZSBhbGxvY2F0ZWQgdG8gdGhlIGZpbGUsCisJICogbm9yIGRvIHRoZXkgY2hhbmdlIHRoZSBmaWxlIHNpemUuCisJICoKKwkgKiBYRlNfSU9DX0FMTE9DU1AgYW5kIFhGU19JT0NfRlJFRVNQIHdpbGwgYWxsb2NhdGUgYW5kIGZyZWUgZmlsZQorCSAqIHNwYWNlLgorCSAqIFRoZXNlIGNhbGxzIGNhdXNlIHRoZSBuZXcgZmlsZSBkYXRhIHRvIGJlIHplcm9lZCBhbmQgdGhlIGZpbGUKKwkgKiBzaXplIHRvIGJlIGNoYW5nZWQuCisJICovCisJc2V0cHJlYWxsb2MgPSBjbHJwcmVhbGxvYyA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgWEZTX0lPQ19SRVNWU1A6CisJY2FzZSBYRlNfSU9DX1JFU1ZTUDY0OgorCQllcnJvciA9IHhmc19hbGxvY19maWxlX3NwYWNlKGlwLCBzdGFydG9mZnNldCwgYmYtPmxfbGVuLAorCQkJCQkJCQkxLCBhdHRyX2ZsYWdzKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCQlzZXRwcmVhbGxvYyA9IDE7CisJCWJyZWFrOworCisJY2FzZSBYRlNfSU9DX1VOUkVTVlNQOgorCWNhc2UgWEZTX0lPQ19VTlJFU1ZTUDY0OgorCQlpZiAoKGVycm9yID0geGZzX2ZyZWVfZmlsZV9zcGFjZShpcCwgc3RhcnRvZmZzZXQsIGJmLT5sX2xlbiwKKwkJCQkJCQkJYXR0cl9mbGFncykpKQorCQkJcmV0dXJuIGVycm9yOworCQlicmVhazsKKworCWNhc2UgWEZTX0lPQ19BTExPQ1NQOgorCWNhc2UgWEZTX0lPQ19BTExPQ1NQNjQ6CisJY2FzZSBYRlNfSU9DX0ZSRUVTUDoKKwljYXNlIFhGU19JT0NfRlJFRVNQNjQ6CisJCWlmIChzdGFydG9mZnNldCA+IGZzaXplKSB7CisJCQllcnJvciA9IHhmc19hbGxvY19maWxlX3NwYWNlKGlwLCBmc2l6ZSwKKwkJCQkJc3RhcnRvZmZzZXQgLSBmc2l6ZSwgMCwgYXR0cl9mbGFncyk7CisJCQlpZiAoZXJyb3IpCisJCQkJYnJlYWs7CisJCX0KKworCQl2YS52YV9tYXNrID0gWEZTX0FUX1NJWkU7CisJCXZhLnZhX3NpemUgPSBzdGFydG9mZnNldDsKKworCQllcnJvciA9IHhmc19zZXRhdHRyKGJkcCwgJnZhLCBhdHRyX2ZsYWdzLCBjcmVkcCk7CisKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCisJCWNscnByZWFsbG9jID0gMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwl9CisKKwkvKgorCSAqIHVwZGF0ZSB0aGUgaW5vZGUgdGltZXN0YW1wLCBtb2RlLCBhbmQgcHJlYWxsb2MgZmxhZyBiaXRzCisJICovCisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19XUklURUlEKTsKKworCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgWEZTX1dSSVRFSURfTE9HX1JFUyhtcCksCisJCQkJICAgICAgMCwgMCwgMCkpKSB7CisJCS8qIEFTU0VSVCgwKTsgKi8KKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKworCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKworCWlmICgoYXR0cl9mbGFncyAmIEFUVFJfRE1JKSA9PSAwKSB7CisJCWlwLT5pX2QuZGlfbW9kZSAmPSB+U19JU1VJRDsKKworCQkvKgorCQkgKiBOb3RlIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBtYW5kYXRvcnkKKwkJICogZmlsZSBsb2NraW5nIGJlaW5nIGRpc2FibGVkIGhlcmUgYmVjYXVzZSB3ZSBvbmx5CisJCSAqIGNsZWFyIHRoZSBTX0lTR0lEIGJpdCBpZiB0aGUgR3JvdXAgZXhlY3V0ZSBiaXQgaXMKKwkJICogb24sIGJ1dCBpZiBpdCB3YXMgb24gdGhlbiBtYW5kYXRvcnkgbG9ja2luZyB3b3VsZG4ndAorCQkgKiBoYXZlIGJlZW4gZW5hYmxlZC4KKwkJICovCisJCWlmIChpcC0+aV9kLmRpX21vZGUgJiBTX0lYR1JQKQorCQkJaXAtPmlfZC5kaV9tb2RlICY9IH5TX0lTR0lEOworCisJCXhmc19pY2hndGltZShpcCwgWEZTX0lDSEdUSU1FX01PRCB8IFhGU19JQ0hHVElNRV9DSEcpOworCX0KKwlpZiAoc2V0cHJlYWxsb2MpCisJCWlwLT5pX2QuZGlfZmxhZ3MgfD0gWEZTX0RJRkxBR19QUkVBTExPQzsKKwllbHNlIGlmIChjbHJwcmVhbGxvYykKKwkJaXAtPmlfZC5kaV9mbGFncyAmPSB+WEZTX0RJRkxBR19QUkVBTExPQzsKKworCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKwl4ZnNfdHJhbnNfc2V0X3N5bmModHApOworCisJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwLCBOVUxMKTsKKworCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3Zub2Rlb3BzX3QgeGZzX3Zub2Rlb3BzID0geworCUJIVl9JREVOVElUWV9JTklUKFZOX0JIVl9YRlMsVk5PREVfUE9TSVRJT05fWEZTKSwKKwkudm9wX29wZW4JCT0geGZzX29wZW4sCisJLnZvcF9yZWFkCQk9IHhmc19yZWFkLAorI2lmZGVmIEhBVkVfU0VOREZJTEUKKwkudm9wX3NlbmRmaWxlCQk9IHhmc19zZW5kZmlsZSwKKyNlbmRpZgorCS52b3Bfd3JpdGUJCT0geGZzX3dyaXRlLAorCS52b3BfaW9jdGwJCT0geGZzX2lvY3RsLAorCS52b3BfZ2V0YXR0cgkJPSB4ZnNfZ2V0YXR0ciwKKwkudm9wX3NldGF0dHIJCT0geGZzX3NldGF0dHIsCisJLnZvcF9hY2Nlc3MJCT0geGZzX2FjY2VzcywKKwkudm9wX2xvb2t1cAkJPSB4ZnNfbG9va3VwLAorCS52b3BfY3JlYXRlCQk9IHhmc19jcmVhdGUsCisJLnZvcF9yZW1vdmUJCT0geGZzX3JlbW92ZSwKKwkudm9wX2xpbmsJCT0geGZzX2xpbmssCisJLnZvcF9yZW5hbWUJCT0geGZzX3JlbmFtZSwKKwkudm9wX21rZGlyCQk9IHhmc19ta2RpciwKKwkudm9wX3JtZGlyCQk9IHhmc19ybWRpciwKKwkudm9wX3JlYWRkaXIJCT0geGZzX3JlYWRkaXIsCisJLnZvcF9zeW1saW5rCQk9IHhmc19zeW1saW5rLAorCS52b3BfcmVhZGxpbmsJCT0geGZzX3JlYWRsaW5rLAorCS52b3BfZnN5bmMJCT0geGZzX2ZzeW5jLAorCS52b3BfaW5hY3RpdmUJCT0geGZzX2luYWN0aXZlLAorCS52b3BfZmlkMgkJPSB4ZnNfZmlkMiwKKwkudm9wX3J3bG9jawkJPSB4ZnNfcndsb2NrLAorCS52b3Bfcnd1bmxvY2sJCT0geGZzX3J3dW5sb2NrLAorCS52b3BfYm1hcAkJPSB4ZnNfYm1hcCwKKwkudm9wX3JlY2xhaW0JCT0geGZzX3JlY2xhaW0sCisJLnZvcF9hdHRyX2dldAkJPSB4ZnNfYXR0cl9nZXQsCisJLnZvcF9hdHRyX3NldAkJPSB4ZnNfYXR0cl9zZXQsCisJLnZvcF9hdHRyX3JlbW92ZQk9IHhmc19hdHRyX3JlbW92ZSwKKwkudm9wX2F0dHJfbGlzdAkJPSB4ZnNfYXR0cl9saXN0LAorCS52b3BfbGlua19yZW1vdmVkCT0gKHZvcF9saW5rX3JlbW92ZWRfdClmc19ub3ZhbCwKKwkudm9wX3Zub2RlX2NoYW5nZQk9ICh2b3Bfdm5vZGVfY2hhbmdlX3QpZnNfbm92YWwsCisJLnZvcF90b3NzcGFnZXMJCT0gZnNfdG9zc3BhZ2VzLAorCS52b3BfZmx1c2hpbnZhbF9wYWdlcwk9IGZzX2ZsdXNoaW52YWxfcGFnZXMsCisJLnZvcF9mbHVzaF9wYWdlcwk9IGZzX2ZsdXNoX3BhZ2VzLAorCS52b3BfcmVsZWFzZQkJPSB4ZnNfcmVsZWFzZSwKKwkudm9wX2lmbHVzaAkJPSB4ZnNfaW5vZGVfZmx1c2gsCit9Owo=